ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50Ly5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxYTQzMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8Y2xhc3NwYXRoPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQorPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50Ly5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50Ly5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYTIxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8cHJvamVjdERlc2NyaXB0aW9uPg0KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQ8L25hbWU+DQorCTxjb21tZW50PjwvY29tbWVudD4NCisJPHByb2plY3RzPg0KKwk8L3Byb2plY3RzPg0KKwk8YnVpbGRTcGVjPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCTwvYnVpbGRTcGVjPg0KKwk8bmF0dXJlcz4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQorCTwvbmF0dXJlcz4NCis8L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxYmYxZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDI0IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50O3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50LkFjdGl2YXRvcgorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCisgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUsCisgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcywKKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMsCisgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMsCisgb3JnLmVjbGlwc2Uuc3RlbS51aSwKKyBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CitCdW5kbGUtQ2xhc3NQYXRoOiAuCitJbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyCitFeHBvcnQtUGFja2FnZTogYXV0b21hdGljZXhwZXJpbWVudCwKKyBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQsCisgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50LnZpZXdzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNWZlOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDkgQEAKK3NvdXJjZS4uID0gc3JjLw0KK291dHB1dC4uID0gYmluLw0KK2Jpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQorICAgICAgICAgICAgICAgLixcDQorICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcDQorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXA0KKyAgICAgICAgICAgICAgIGljb25zLyxcDQorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwNCisgICAgICAgICAgICAgICBub3RpY2UuaHRtbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNGIxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvZXBsLXYxMC5odG1sCkBAIC0wLDAgKzEsMzI4IEBACis8aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCit4bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoreG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgorPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgorPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Cis8bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Cis8bGluayByZWw9RmlsZS1MaXN0CitocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KKzx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgorPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+CisgPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgorICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgorICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+CisgIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KKyAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KKyAgPG86UGFnZXM+NDwvbzpQYWdlcz4KKyAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KKyAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+CisgICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KKyAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgorICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KKyAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KKyA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgorPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+CisgPHc6V29yZERvY3VtZW50PgorICA8dzpUcmFja1JldmlzaW9ucy8+CisgPC93OldvcmREb2N1bWVudD4KKzwveG1sPjwhW2VuZGlmXS0tPgorPHN0eWxlPgorPCEtLQorIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KK0Bmb250LWZhY2UKKwl7Zm9udC1mYW1pbHk6VGFob21hOworCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OworCW1zby1mb250LWNoYXJzZXQ6MDsKKwltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKKwltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKKwltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KKyAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLworcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAorCXttc28tc3R5bGUtcGFyZW50OiIiOworCW1hcmdpbjowaW47CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AKKwl7bWFyZ2luLXJpZ2h0OjBpbjsKKwltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKKwltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKKwltYXJnaW4tbGVmdDowaW47CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAorCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjguMHB0OworCWZvbnQtZmFtaWx5OlRhaG9tYTsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitAcGFnZSBTZWN0aW9uMQorCXtzaXplOjguNWluIDExLjBpbjsKKwltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKKwltc28taGVhZGVyLW1hcmdpbjouNWluOworCW1zby1mb290ZXItbWFyZ2luOi41aW47CisJbXNvLXBhcGVyLXNvdXJjZTowO30KK2Rpdi5TZWN0aW9uMQorCXtwYWdlOlNlY3Rpb24xO30KKy0tPgorPC9zdHlsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgorCis8ZGl2IGNsYXNzPVNlY3Rpb24xPgorCis8cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Cis8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKK1RIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCitSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKK09GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgorZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgorYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCitjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKK2FkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQorc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAorYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCitpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgorc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCitQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KK3dpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKK3dvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgorZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAorY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKK29yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCitkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobworcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQorU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKK2Egbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgorc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKK2Rpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCitDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKK2Zvcm0uPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKK1JlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCitwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0CithbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKK2NvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCitvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAorYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KK3RvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KK2FueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKK2xpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKK1JlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKK0NvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCit0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5CityaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKK2ZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKK2xpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Cit0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAoraWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQordGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQorZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCitFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAorcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgordGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KKzwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2l0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQoraXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCitlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCitjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCithbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQorYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKK2VmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCitpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCithcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKK3N0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKK0NvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKK3N0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKK2luZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKK2NvZGUgZm9ybTo8L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2l0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCitjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Citjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKK29yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCitzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5CithY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCithbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQorb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCitsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQorUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAorQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKK0NvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAorY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgorbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KK3RoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KK2Nvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0CitvZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKK3JlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgordG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgordG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKK2FueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCitpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQorUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQorQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKK2NsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKK3dhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCitzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKK290aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKK2NvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAorV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKK3Jlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCitQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCitBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCitjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgorZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKK0FHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKK05FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCitUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCitUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAorb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKK2VuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAorZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKK21pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCithZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCithbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCitvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKK1JlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKK3N1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKK3NoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCitjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKK3BlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCityaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCitSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKK1JlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCitjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKK2NvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAorU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCit0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwordGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAorQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KK3NlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgorb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KKyhpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKK2luIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KK3RoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCitleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90CitleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKK1N0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKK0FtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcworQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcworaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+CisKKzwvZGl2PgorCis8L2JvZHk+CisKKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9BdXRvbWF0aWNFeHBlcmltZW50LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0F1dG9tYXRpY0V4cGVyaW1lbnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZmM2NzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9BdXRvbWF0aWNFeHBlcmltZW50LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9BdXRvbWF0aWNleHBlcmltZW50TW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0F1dG9tYXRpY2V4cGVyaW1lbnRNb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ3MjFlZjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9BdXRvbWF0aWNleHBlcmltZW50TW9kZWxGaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvaWNvbnMvZnVsbC9vYmoxNi9BdXRvbWF0aWNFeHBlcmltZW50LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9pY29ucy9mdWxsL29iajE2L0F1dG9tYXRpY0V4cGVyaW1lbnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZmM2NzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvaWNvbnMvZnVsbC9vYmoxNi9BdXRvbWF0aWNFeHBlcmltZW50LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvaWNvbnMvZnVsbC9vYmoxNi9BdXRvbWF0aWNleHBlcmltZW50TW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9pY29ucy9mdWxsL29iajE2L0F1dG9tYXRpY2V4cGVyaW1lbnRNb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MjFlZjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvaWNvbnMvZnVsbC9vYmoxNi9BdXRvbWF0aWNleHBlcmltZW50TW9kZWxGaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvaWNvbnMvZnVsbC9vYmoxNi9Nb2RpZmlhYmxlUGFyYW1ldGVyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9pY29ucy9mdWxsL29iajE2L01vZGlmaWFibGVQYXJhbWV0ZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NzMxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvaWNvbnMvZnVsbC9vYmoxNi9Nb2RpZmlhYmxlUGFyYW1ldGVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvaWNvbnMvZnVsbC93aXpiYW4vTmV3QXV0b21hdGljZXhwZXJpbWVudC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvaWNvbnMvZnVsbC93aXpiYW4vTmV3QXV0b21hdGljZXhwZXJpbWVudC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmYzY3OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9pY29ucy9mdWxsL3dpemJhbi9OZXdBdXRvbWF0aWNleHBlcmltZW50LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvaWNvbnMvc2FtcGxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9pY29ucy9zYW1wbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZmIzYzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvaWNvbnMvc2FtcGxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvbW9kZWwvYXV0b21hdGljZXhwZXJpZW5jZS5nZW5tb2RlbCBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9tb2RlbC9hdXRvbWF0aWNleHBlcmllbmNlLmdlbm1vZGVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MDZkODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvbW9kZWwvYXV0b21hdGljZXhwZXJpZW5jZS5nZW5tb2RlbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKKyAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjIgorICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjIgorICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudCIgbW9kZWxOYW1lPSJBdXRvbWF0aWNleHBlcmllbmNlIgorICAgIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5lY29yZSIgY29tcGxpYW5jZUxldmVsPSI2LjAiIGNvcHlyaWdodEZpZWxkcz0iZmFsc2UiCisgICAgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL2NvbW1vbiAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL2dyYXBoIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vbW9kZWwgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9tb2RpZmllciAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL3NjZW5hcmlvIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vc2VxdWVuY2VyIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9zb2x2ZXIiPgorICA8Zm9yZWlnbk1vZGVsPmF1dG9tYXRpY2V4cGVyaW1lbnQuZWNvcmU8L2ZvcmVpZ25Nb2RlbD4KKyAgPGdlblBhY2thZ2VzIHByZWZpeD0iQXV0b21hdGljZXhwZXJpbWVudCIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIgZ2VuZXJhdGVFeGFtcGxlQ2xhc3M9ImZhbHNlIgorICAgICAgbXVsdGlwbGVFZGl0b3JQYWdlcz0iZmFsc2UiIGdlbmVyYXRlTW9kZWxXaXphcmQ9ImZhbHNlIiBlY29yZVBhY2thZ2U9ImF1dG9tYXRpY2V4cGVyaW1lbnQuZWNvcmUjLyI+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYXV0b21hdGljZXhwZXJpbWVudC5lY29yZSMvL0F1dG9tYXRpY0V4cGVyaW1lbnQiPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiCisgICAgICAgICAgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGF1dG9tYXRpY2V4cGVyaW1lbnQuZWNvcmUjLy9BdXRvbWF0aWNFeHBlcmltZW50L2Jhc2VTY2VuYXJpbyIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5Q2F0ZWdvcnk9IiIKKyAgICAgICAgICBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYXV0b21hdGljZXhwZXJpbWVudC5lY29yZSMvL0F1dG9tYXRpY0V4cGVyaW1lbnQvcGFyYW1ldGVycyIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGF1dG9tYXRpY2V4cGVyaW1lbnQuZWNvcmUjLy9BdXRvbWF0aWNFeHBlcmltZW50L2Vycm9yQW5hbHlzaXNBbGdvcml0aG0iLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBhdXRvbWF0aWNleHBlcmltZW50LmVjb3JlIy8vQXV0b21hdGljRXhwZXJpbWVudC9lcnJvckZ1bmN0aW9uIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYXV0b21hdGljZXhwZXJpbWVudC5lY29yZSMvL0F1dG9tYXRpY0V4cGVyaW1lbnQvdG9sZXJhbmNlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYXV0b21hdGljZXhwZXJpbWVudC5lY29yZSMvL0F1dG9tYXRpY0V4cGVyaW1lbnQvcmVmZXJhbmNlRGF0YURpciIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGF1dG9tYXRpY2V4cGVyaW1lbnQuZWNvcmUjLy9BdXRvbWF0aWNFeHBlcmltZW50L21heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBhdXRvbWF0aWNleHBlcmltZW50LmVjb3JlIy8vQXV0b21hdGljRXhwZXJpbWVudC9yZUluaXQiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYXV0b21hdGljZXhwZXJpbWVudC5lY29yZSMvL01vZGlmaWFibGVQYXJhbWV0ZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGF1dG9tYXRpY2V4cGVyaW1lbnQuZWNvcmUjLy9Nb2RpZmlhYmxlUGFyYW1ldGVyL2luaXRpYWxWYWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGF1dG9tYXRpY2V4cGVyaW1lbnQuZWNvcmUjLy9Nb2RpZmlhYmxlUGFyYW1ldGVyL2ZlYXR1cmUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBhdXRvbWF0aWNleHBlcmltZW50LmVjb3JlIy8vTW9kaWZpYWJsZVBhcmFtZXRlci9zdGVwIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYXV0b21hdGljZXhwZXJpbWVudC5lY29yZSMvL01vZGlmaWFibGVQYXJhbWV0ZXIvZmVhdHVyZU5hbWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBhdXRvbWF0aWNleHBlcmltZW50LmVjb3JlIy8vTW9kaWZpYWJsZVBhcmFtZXRlci9sb3dlckJvdW5kIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYXV0b21hdGljZXhwZXJpbWVudC5lY29yZSMvL01vZGlmaWFibGVQYXJhbWV0ZXIvdXBwZXJCb3VuZCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGF1dG9tYXRpY2V4cGVyaW1lbnQuZWNvcmUjLy9Nb2RpZmlhYmxlUGFyYW1ldGVyL3RhcmdldFVSSSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgPC9nZW5QYWNrYWdlcz4KKzwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvbW9kZWwvYXV0b21hdGljZXhwZXJpbWVudC5lY29yZSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9tb2RlbC9hdXRvbWF0aWNleHBlcmltZW50LmVjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMTc4MGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvbW9kZWwvYXV0b21hdGljZXhwZXJpbWVudC5lY29yZQpAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJhdXRvbWF0aWNleHBlcmltZW50IgorICAgIG5zVVJJPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9hdXRvbWF0aWNleHBlcmltZW50LmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50Ij4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBdXRvbWF0aWNFeHBlcmltZW50IiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvbW1vbi5lY29yZSMvL0lkZW50aWZpYWJsZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VTY2VuYXJpbyIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvc2NlbmFyaW8uZWNvcmUjLy9TY2VuYXJpbyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwYXJhbWV0ZXJzIiBsb3dlckJvdW5kPSIxIgorICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01vZGlmaWFibGVQYXJhbWV0ZXIiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXJyb3JBbmFseXNpc0FsZ29yaXRobSIKKyAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXJyb3JGdW5jdGlvbiIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG9sZXJhbmNlIiBsb3dlckJvdW5kPSIxIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWZlcmFuY2VEYXRhRGlyIiBsb3dlckJvdW5kPSIxIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYXhpbXVtTnVtYmVyT2ZJdGVyYXRpb25zIgorICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUxvbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVJbml0IiBsb3dlckJvdW5kPSIxIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUJvb2xlYW4iLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTW9kaWZpYWJsZVBhcmFtZXRlciI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluaXRpYWxWYWx1ZSIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VEb3VibGUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmVhdHVyZSIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJ1Y3R1cmFsRmVhdHVyZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGVwIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmZWF0dXJlTmFtZSIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG93ZXJCb3VuZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VEb3VibGUiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ii0xIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVwcGVyQm91bmQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSItMSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXJnZXRVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvbW1vbi5lY29yZSMvL1VSSSIvPgorICA8L2VDbGFzc2lmaWVycz4KKzwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvbm90aWNlLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvbm90aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhZjk2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9ub3RpY2UuaHRtbApAQCAtMCwwICsxLDc5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Cis8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPk1hcmNoIDE3LCAyMDA1PC9wPgorCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisKKzxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKyAgIAorPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAorICAgCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKKyAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorICAgCis8dWw+CisJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKzwvdWw+ICAgCisgCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKworPHVsPgorCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKwkJCis8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCitpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KK3RoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KKwk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCisJPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKwk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCis8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKworPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKyAgIAorPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVhNTI4NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9wbHVnaW4ucHJvcGVydGllcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOWE2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvcGx1Z2luLnhtbApAQCAtMCwwICsxLDExMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+DQorPHBsdWdpbj4NCisJPCEtLQ0KKyAgIDxleHRlbnNpb24NCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+DQorICAgICAgICAgPHdpemFyZA0KKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuc3RlbWNhdGVnb3J5Ig0KKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQudWkuTmV3QXV0b21hdGljRXhwZXJpbWVudFdpemFyZCINCisgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbW9iajE2L0F1dG9tYXRpY0V4cGVyaW1lbnQuZ2lmIg0KKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMubmV3YXV0b2V4cGVyaW1lbnQiDQorICAgICAgICAgICAgbmFtZT0iQXV0b21hdGljIEV4cGVyaW1lbnQiPg0KKyAgICAgIDwvd2l6YXJkPg0KKyAgIDwvZXh0ZW5zaW9uPg0KKyAgIA0KKwk8ZXh0ZW5zaW9uDQorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPiAgICAgIA0KKyAgICAgIDxtZW51Q29udHJpYnV0aW9uDQorICAgICAgICAgICAgbG9jYXRpb25VUkk9InRvb2xiYXI6b3JnLmVjbGlwc2UudWkubWFpbi50b29sYmFyP2FmdGVyPWFkZGl0aW9ucyI+DQorICAgICAgICAgPHRvb2xiYXINCisgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS50b29sYmFyLm5ld3dpemFyZHMiPg0KKyAgICAgICAgICAgIDxjb21tYW5kDQorICAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQud2l6LmF1dG9leHBlcmltZW50Ig0KKyAgICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvQXV0b21hdGljRXhwZXJpbWVudC5naWYiDQorICAgICAgICAgICAgICAgICAgbGFiZWw9IkF1dG9tYXRpYyBFeHBlcmltZW50Ig0KKyAgICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIg0KKyAgICAgICAgICAgICAgICAgIHRvb2x0aXA9IkF1dG9tYXRpYyBFeHBlcmltZW50Ij4NCisgICAgICAgICAgICA8L2NvbW1hbmQ+DQorICAgICAgICAgICAgPHNlcGFyYXRvcg0KKyAgICAgICAgICAgICAgICAgIG5hbWU9ImFkZGl0aW9ucyI+DQorICAgICAgICAgICAgPC9zZXBhcmF0b3I+DQorICAgICAgICAgPC90b29sYmFyPg0KKyAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4NCisgICAgIA0KKyAgPC9leHRlbnNpb24+DQorICAtLT4NCisgIDxleHRlbnNpb24NCisgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLlNURU1QZXJzcGVjdGl2ZSINCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMiPg0KKyAgICAgPHBlcnNwZWN0aXZlDQorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50LnBlcnNwZWN0aXZlcy5BdXRvbWF0aWNFeHBlcmltZW50Ig0KKyAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9BdXRvbWF0aWNFeHBlcmltZW50LmdpZiINCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQucGVyc3BlY3RpdmUiDQorICAgICAgICAgICBuYW1lPSIlX1VJX0F1dG9tYXRpY0V4cGVyaW1lbnRfUGVyc3BlY3RpdmUiPg0KKyAgICAgPC9wZXJzcGVjdGl2ZT4NCisgIDwvZXh0ZW5zaW9uPg0KKyAgPGV4dGVuc2lvbg0KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+DQorICAgICAgPHZpZXcNCisgICAgICAgICAgICBhbGxvd011bHRpcGxlPSJ0cnVlIg0KKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzIg0KKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQudmlld3MuQXV0b0V4cFZpZXciDQorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9BdXRvbWF0aWNFeHBlcmltZW50LmdpZiINCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50Ig0KKyAgICAgICAgICAgIG5hbWU9IiVBRV9WaWV3Ij4NCisgICAgICA8L3ZpZXc+DQorICAgPC9leHRlbnNpb24+DQorICA8ZXh0ZW5zaW9uDQorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPg0KKyAgICAgPGNhdGVnb3J5DQorICAgICAgICAgICBkZXNjcmlwdGlvbj0iJV9VSV9TVEVNX1dpekNtZF9DYXRfRGVzYyINCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMiDQorICAgICAgICAgICBuYW1lPSIlX1VJX1NURU1fV2l6Q21kX0NhdF9OYW1lIj4NCisgICAgIDwvY2F0ZWdvcnk+ICAgICANCisgICAgIDxjb21tYW5kDQorICAgICAgICAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50LnVpLk5ld0F1dG9tYXRpY0V4cGVyaW1lbnRXaXphcmQkTmV3QXV0b21hdGljRXhwZXJpbWVudFdpemFyZENvbW1hbmRIYW5kbGVyIg0KKyAgICAgICAgICAgZGVzY3JpcHRpb249Ik5ldyBBdXRvbWF0aWMgRXhwZXJpbWVudCINCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQud2l6LmF1dG9leHBlcmltZW50Ig0KKyAgICAgICAgICAgbmFtZT0iTmV3IEF1dG9tYXRpYyBFeHBlcmltZW50Ij4NCisgICAgIDwvY29tbWFuZD4NCisgIDwvZXh0ZW5zaW9uPg0KKyAgPGV4dGVuc2lvbg0KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPg0KKyAgICAgPGVkaXRvcg0KKyAgICAgICAgICBjbGFzcz0iYXV0b21hdGljZXhwZXJpbWVudC5wcmVzZW50YXRpb24uQXV0b21hdGljZXhwZXJpbWVudEVkaXRvciINCisgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0iYXV0b21hdGljZXhwZXJpbWVudC5wcmVzZW50YXRpb24uQXV0b21hdGljZXhwZXJpbWVudEFjdGlvbkJhckNvbnRyaWJ1dG9yIg0KKyAgICAgICAgICBkZWZhdWx0PSJmYWxzZSINCisgICAgICAgICAgZXh0ZW5zaW9ucz0iYXV0b21hdGljZXhwZXJpbWVudCINCisgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9BdXRvbWF0aWNFeHBlcmltZW50LmdpZiINCisgICAgICAgICAgaWQ9ImF1dG9tYXRpY2V4cGVyaW1lbnQucHJlc2VudGF0aW9uLkF1dG9tYXRpY0V4cGVyaW1lbnRFZGl0b3JJRCINCisgICAgICAgICAgbmFtZT0iQXV0b21hdGljIEV4cGVyaW1lbnQgRWRpdG9yIj4NCisgICAgPC9lZGl0b3I+DQorICA8L2V4dGVuc2lvbj4NCisgIA0KKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQuaXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcmllcyI+DQorICAgICAgPGZhY3RvcnkNCisgICAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2F1dG9tYXRpY2V4cGVyaW1lbnQuZWNvcmUiDQorICAgICAgICAgICAgY2xhc3M9ImF1dG9tYXRpY2V4cGVyaW1lbnQucHJvdmlkZXIuQXV0b21hdGljZXhwZXJpbWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ig0KKyAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzPQ0KKyAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyDQorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyDQorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyDQorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyDQorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSIvPg0KKyAgIDwvZXh0ZW5zaW9uPg0KKyAgIA0KKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+DQorICAgICAgPHBhY2thZ2UNCisgICAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2F1dG9tYXRpY2V4cGVyaW1lbnQuZWNvcmUiDQorICAgICAgICAgICAgY2xhc3M9ImF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UiDQorICAgICAgICAgICAgZ2VuTW9kZWw9Im1vZGVsL2F1dG9tYXRpY2V4cGVyaW1lbnQuZ2VubW9kZWwiLz4NCisgICA8L2V4dGVuc2lvbj4NCisgIA0KKyAgPGV4dGVuc2lvbg0KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+DQorICAgICAgICAgIDxmYWN0b3J5IA0KKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuZXhlY3V0YWJsZS5JZGVudGlmaWFibGVFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkiIA0KKyAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9ImF1dG9tYXRpY2V4cGVyaW1lbnQuaW1wbC5BdXRvbWF0aWNFeHBlcmltZW50SW1wbCI+DQorICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZSIvPg0KKyAgICAgICAgIDwvZmFjdG9yeT4NCisJPC9leHRlbnNpb24+DQorPC9wbHVnaW4+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9hdXRvbWF0aWNleHBlcmltZW50L0F1dG9tYXRpY0V4cGVyaW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9BdXRvbWF0aWNFeHBlcmltZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiNmRiMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9BdXRvbWF0aWNFeHBlcmltZW50LmphdmEKQEAgLTAsMCArMSwyNDAgQEAKK3BhY2thZ2UgYXV0b21hdGljZXhwZXJpbWVudDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXV0b21hdGljIEV4cGVyaW1lbnQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNFeHBlcmltZW50I2dldEJhc2VTY2VuYXJpbyA8ZW0+QmFzZSBTY2VuYXJpbzwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudCNnZXRQYXJhbWV0ZXJzIDxlbT5QYXJhbWV0ZXJzPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNFeHBlcmltZW50I2dldEVycm9yQW5hbHlzaXNBbGdvcml0aG0gPGVtPkVycm9yIEFuYWx5c2lzIEFsZ29yaXRobTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudCNnZXRFcnJvckZ1bmN0aW9uIDxlbT5FcnJvciBGdW5jdGlvbjwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudCNnZXRUb2xlcmFuY2UgPGVtPlRvbGVyYW5jZTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudCNnZXRSZWZlcmFuY2VEYXRhRGlyIDxlbT5SZWZlcmFuY2UgRGF0YSBEaXI8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY0V4cGVyaW1lbnQjZ2V0TWF4aW11bU51bWJlck9mSXRlcmF0aW9ucyA8ZW0+TWF4aW11bSBOdW1iZXIgT2YgSXRlcmF0aW9uczwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudCNpc1JlSW5pdCA8ZW0+UmUgSW5pdDwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAc2VlIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UjZ2V0QXV0b21hdGljRXhwZXJpbWVudCgpDQorICogQG1vZGVsDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgQXV0b21hdGljRXhwZXJpbWVudCBleHRlbmRzIElkZW50aWZpYWJsZSB7DQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIFNjZW5hcmlvPC9iPjwvZW0+JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNlIFNjZW5hcmlvPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIFNjZW5hcmlvPC9lbT4nIHJlZmVyZW5jZS4NCisJICogQHNlZSAjc2V0QmFzZVNjZW5hcmlvKFNjZW5hcmlvKQ0KKwkgKiBAc2VlIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UjZ2V0QXV0b21hdGljRXhwZXJpbWVudF9CYXNlU2NlbmFyaW8oKQ0KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVNjZW5hcmlvIGdldEJhc2VTY2VuYXJpbygpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNFeHBlcmltZW50I2dldEJhc2VTY2VuYXJpbyA8ZW0+QmFzZSBTY2VuYXJpbzwvZW0+fScgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBTY2VuYXJpbzwvZW0+JyByZWZlcmVuY2UuDQorCSAqIEBzZWUgI2dldEJhc2VTY2VuYXJpbygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0QmFzZVNjZW5hcmlvKFNjZW5hcmlvIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmFtZXRlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5Nb2RpZmlhYmxlUGFyYW1ldGVyfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcmFtZXRlcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW1ldGVyczwvZW0+JyByZWZlcmVuY2UgbGlzdC4NCisJICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlI2dldEF1dG9tYXRpY0V4cGVyaW1lbnRfUGFyYW1ldGVycygpDQorCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUxpc3Q8TW9kaWZpYWJsZVBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXJyb3IgQW5hbHlzaXMgQWxnb3JpdGhtPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FcnJvciBBbmFseXNpcyBBbGdvcml0aG08L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVycm9yIEFuYWx5c2lzIEFsZ29yaXRobTwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldEVycm9yQW5hbHlzaXNBbGdvcml0aG0oU3RyaW5nKQ0KKwkgKiBAc2VlIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UjZ2V0QXV0b21hdGljRXhwZXJpbWVudF9FcnJvckFuYWx5c2lzQWxnb3JpdGhtKCkNCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZ2V0RXJyb3JBbmFseXNpc0FsZ29yaXRobSgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNFeHBlcmltZW50I2dldEVycm9yQW5hbHlzaXNBbGdvcml0aG0gPGVtPkVycm9yIEFuYWx5c2lzIEFsZ29yaXRobTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXJyb3IgQW5hbHlzaXMgQWxnb3JpdGhtPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0RXJyb3JBbmFseXNpc0FsZ29yaXRobSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0RXJyb3JBbmFseXNpc0FsZ29yaXRobShTdHJpbmcgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXJyb3IgRnVuY3Rpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVycm9yIEZ1bmN0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FcnJvciBGdW5jdGlvbjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldEVycm9yRnVuY3Rpb24oU3RyaW5nKQ0KKwkgKiBAc2VlIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UjZ2V0QXV0b21hdGljRXhwZXJpbWVudF9FcnJvckZ1bmN0aW9uKCkNCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZ2V0RXJyb3JGdW5jdGlvbigpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNFeHBlcmltZW50I2dldEVycm9yRnVuY3Rpb24gPGVtPkVycm9yIEZ1bmN0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FcnJvciBGdW5jdGlvbjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2dldEVycm9yRnVuY3Rpb24oKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldEVycm9yRnVuY3Rpb24oU3RyaW5nIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvbGVyYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9sZXJhbmNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub2xlcmFuY2U8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXRUb2xlcmFuY2UoZG91YmxlKQ0KKwkgKiBAc2VlIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UjZ2V0QXV0b21hdGljRXhwZXJpbWVudF9Ub2xlcmFuY2UoKQ0KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWRvdWJsZSBnZXRUb2xlcmFuY2UoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudCNnZXRUb2xlcmFuY2UgPGVtPlRvbGVyYW5jZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VG9sZXJhbmNlPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0VG9sZXJhbmNlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRUb2xlcmFuY2UoZG91YmxlIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyYW5jZSBEYXRhIERpcjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJhbmNlIERhdGEgRGlyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmFuY2UgRGF0YSBEaXI8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXRSZWZlcmFuY2VEYXRhRGlyKFN0cmluZykNCisJICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlI2dldEF1dG9tYXRpY0V4cGVyaW1lbnRfUmVmZXJhbmNlRGF0YURpcigpDQorCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGdldFJlZmVyYW5jZURhdGFEaXIoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudCNnZXRSZWZlcmFuY2VEYXRhRGlyIDxlbT5SZWZlcmFuY2UgRGF0YSBEaXI8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyYW5jZSBEYXRhIERpcjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2dldFJlZmVyYW5jZURhdGFEaXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldFJlZmVyYW5jZURhdGFEaXIoU3RyaW5nIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1heGltdW0gTnVtYmVyIE9mIEl0ZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1heGltdW0gTnVtYmVyIE9mIEl0ZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1heGltdW0gTnVtYmVyIE9mIEl0ZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXRNYXhpbXVtTnVtYmVyT2ZJdGVyYXRpb25zKGxvbmcpDQorCSAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNleHBlcmltZW50UGFja2FnZSNnZXRBdXRvbWF0aWNFeHBlcmltZW50X01heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMoKQ0KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWxvbmcgZ2V0TWF4aW11bU51bWJlck9mSXRlcmF0aW9ucygpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNFeHBlcmltZW50I2dldE1heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMgPGVtPk1heGltdW0gTnVtYmVyIE9mIEl0ZXJhdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1heGltdW0gTnVtYmVyIE9mIEl0ZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXRNYXhpbXVtTnVtYmVyT2ZJdGVyYXRpb25zKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRNYXhpbXVtTnVtYmVyT2ZJdGVyYXRpb25zKGxvbmcgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmUgSW5pdDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmUgSW5pdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmUgSW5pdDwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldFJlSW5pdChib29sZWFuKQ0KKwkgKiBAc2VlIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UjZ2V0QXV0b21hdGljRXhwZXJpbWVudF9SZUluaXQoKQ0KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWJvb2xlYW4gaXNSZUluaXQoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudCNpc1JlSW5pdCA8ZW0+UmUgSW5pdDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmUgSW5pdDwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2lzUmVJbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRSZUluaXQoYm9vbGVhbiB2YWx1ZSk7DQorDQorfSAvLyBBdXRvbWF0aWNFeHBlcmltZW50DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9hdXRvbWF0aWNleHBlcmltZW50L0F1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL2F1dG9tYXRpY2V4cGVyaW1lbnQvQXV0b21hdGljZXhwZXJpbWVudEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGQyMDdhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9hdXRvbWF0aWNleHBlcmltZW50L0F1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2MCBAQAorcGFja2FnZSBhdXRvbWF0aWNleHBlcmltZW50Ow0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4NCisgKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAc2VlIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBBdXRvbWF0aWNleHBlcmltZW50RmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsNCisJLyoqDQorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlBdXRvbWF0aWNleHBlcmltZW50RmFjdG9yeSBlSU5TVEFOQ0UgPSBhdXRvbWF0aWNleHBlcmltZW50LmltcGwuQXV0b21hdGljZXhwZXJpbWVudEZhY3RvcnlJbXBsLmluaXQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXV0b21hdGljIEV4cGVyaW1lbnQ8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF1dG9tYXRpYyBFeHBlcmltZW50PC9lbT4nLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlBdXRvbWF0aWNFeHBlcmltZW50IGNyZWF0ZUF1dG9tYXRpY0V4cGVyaW1lbnQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TW9kaWZpYWJsZSBQYXJhbWV0ZXI8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1vZGlmaWFibGUgUGFyYW1ldGVyPC9lbT4nLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlNb2RpZmlhYmxlUGFyYW1ldGVyIGNyZWF0ZU1vZGlmaWFibGVQYXJhbWV0ZXIoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UgZ2V0QXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UoKTsNCisNCit9IC8vQXV0b21hdGljZXhwZXJpbWVudEZhY3RvcnkNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL2F1dG9tYXRpY2V4cGVyaW1lbnQvQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9BdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZjA0N2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL2F1dG9tYXRpY2V4cGVyaW1lbnQvQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuamF2YQpAQCAtMCwwICsxLDYxOCBAQAorcGFja2FnZSBhdXRvbWF0aWNleHBlcmltZW50Ow0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuDQorICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudA0KKyAqIDx1bD4NCisgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+DQorICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4NCisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4NCisgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPg0KKyAqIDwvdWw+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5DQorICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7DQorCS8qKg0KKwkgKiBUaGUgcGFja2FnZSBuYW1lLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGVOQU1FID0gImF1dG9tYXRpY2V4cGVyaW1lbnQiOw0KKw0KKwkvKioNCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2F1dG9tYXRpY2V4cGVyaW1lbnQuZWNvcmUiOw0KKw0KKwkvKioNCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQiOw0KKw0KKwkvKioNCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlIGVJTlNUQU5DRSA9IGF1dG9tYXRpY2V4cGVyaW1lbnQuaW1wbC5BdXRvbWF0aWNleHBlcmltZW50UGFja2FnZUltcGwuaW5pdCgpOw0KKw0KKwkvKioNCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBhdXRvbWF0aWNleHBlcmltZW50LmltcGwuQXV0b21hdGljRXhwZXJpbWVudEltcGwgPGVtPkF1dG9tYXRpYyBFeHBlcmltZW50PC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5pbXBsLkF1dG9tYXRpY0V4cGVyaW1lbnRJbXBsDQorCSAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5pbXBsLkF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlSW1wbCNnZXRBdXRvbWF0aWNFeHBlcmltZW50KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IEFVVE9NQVRJQ19FWFBFUklNRU5UID0gMDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBBVVRPTUFUSUNfRVhQRVJJTUVOVF9fVVJJID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX1VSSTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEFVVE9NQVRJQ19FWFBFUklNRU5UX19UWVBFX1VSSSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19UWVBFX1VSSTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEFVVE9NQVRJQ19FWFBFUklNRU5UX19EVUJMSU5fQ09SRSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19EVUJMSU5fQ09SRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIFNjZW5hcmlvPC9iPjwvZW0+JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQVVUT01BVElDX0VYUEVSSU1FTlRfX0JBU0VfU0NFTkFSSU8gPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBBVVRPTUFUSUNfRVhQRVJJTUVOVF9fUEFSQU1FVEVSUyA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVycm9yIEFuYWx5c2lzIEFsZ29yaXRobTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEFVVE9NQVRJQ19FWFBFUklNRU5UX19FUlJPUl9BTkFMWVNJU19BTEdPUklUSE0gPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgMjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FcnJvciBGdW5jdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEFVVE9NQVRJQ19FWFBFUklNRU5UX19FUlJPUl9GVU5DVElPTiA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAzOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvbGVyYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEFVVE9NQVRJQ19FWFBFUklNRU5UX19UT0xFUkFOQ0UgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgNDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmFuY2UgRGF0YSBEaXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBBVVRPTUFUSUNfRVhQRVJJTUVOVF9fUkVGRVJBTkNFX0RBVEFfRElSID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWF4aW11bSBOdW1iZXIgT2YgSXRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEFVVE9NQVRJQ19FWFBFUklNRU5UX19NQVhJTVVNX05VTUJFUl9PRl9JVEVSQVRJT05TID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDY7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmUgSW5pdDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEFVVE9NQVRJQ19FWFBFUklNRU5UX19SRV9JTklUID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDc7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXV0b21hdGljIEV4cGVyaW1lbnQ8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQVVUT01BVElDX0VYUEVSSU1FTlRfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyA4Ow0KKw0KKwkvKioNCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBhdXRvbWF0aWNleHBlcmltZW50LmltcGwuTW9kaWZpYWJsZVBhcmFtZXRlckltcGwgPGVtPk1vZGlmaWFibGUgUGFyYW1ldGVyPC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5pbXBsLk1vZGlmaWFibGVQYXJhbWV0ZXJJbXBsDQorCSAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5pbXBsLkF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlSW1wbCNnZXRNb2RpZmlhYmxlUGFyYW1ldGVyKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IE1PRElGSUFCTEVfUEFSQU1FVEVSID0gMTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTU9ESUZJQUJMRV9QQVJBTUVURVJfX0lOSVRJQUxfVkFMVUUgPSAwOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZlYXR1cmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNT0RJRklBQkxFX1BBUkFNRVRFUl9fRkVBVFVSRSA9IDE7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RlcDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1PRElGSUFCTEVfUEFSQU1FVEVSX19TVEVQID0gMjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNT0RJRklBQkxFX1BBUkFNRVRFUl9fRkVBVFVSRV9OQU1FID0gMzsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb3dlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1PRElGSUFCTEVfUEFSQU1FVEVSX19MT1dFUl9CT1VORCA9IDQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBwZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNT0RJRklBQkxFX1BBUkFNRVRFUl9fVVBQRVJfQk9VTkQgPSA1Ow0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNT0RJRklBQkxFX1BBUkFNRVRFUl9fVEFSR0VUX1VSSSA9IDY7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TW9kaWZpYWJsZSBQYXJhbWV0ZXI8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTU9ESUZJQUJMRV9QQVJBTUVURVJfRkVBVFVSRV9DT1VOVCA9IDc7DQorDQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY0V4cGVyaW1lbnQgPGVtPkF1dG9tYXRpYyBFeHBlcmltZW50PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkF1dG9tYXRpYyBFeHBlcmltZW50PC9lbT4nLg0KKwkgKiBAc2VlIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0QXV0b21hdGljRXhwZXJpbWVudCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY0V4cGVyaW1lbnQjZ2V0QmFzZVNjZW5hcmlvIDxlbT5CYXNlIFNjZW5hcmlvPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QmFzZSBTY2VuYXJpbzwvZW0+Jy4NCisJICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY0V4cGVyaW1lbnQjZ2V0QmFzZVNjZW5hcmlvKCkNCisJICogQHNlZSAjZ2V0QXV0b21hdGljRXhwZXJpbWVudCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVSZWZlcmVuY2UgZ2V0QXV0b21hdGljRXhwZXJpbWVudF9CYXNlU2NlbmFyaW8oKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY0V4cGVyaW1lbnQjZ2V0UGFyYW1ldGVycyA8ZW0+UGFyYW1ldGVyczwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGFyYW1ldGVyczwvZW0+Jy4NCisJICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY0V4cGVyaW1lbnQjZ2V0UGFyYW1ldGVycygpDQorCSAqIEBzZWUgI2dldEF1dG9tYXRpY0V4cGVyaW1lbnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldEF1dG9tYXRpY0V4cGVyaW1lbnRfUGFyYW1ldGVycygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY0V4cGVyaW1lbnQjZ2V0RXJyb3JBbmFseXNpc0FsZ29yaXRobSA8ZW0+RXJyb3IgQW5hbHlzaXMgQWxnb3JpdGhtPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXJyb3IgQW5hbHlzaXMgQWxnb3JpdGhtPC9lbT4nLg0KKwkgKiBAc2VlIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudCNnZXRFcnJvckFuYWx5c2lzQWxnb3JpdGhtKCkNCisJICogQHNlZSAjZ2V0QXV0b21hdGljRXhwZXJpbWVudCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0QXV0b21hdGljRXhwZXJpbWVudF9FcnJvckFuYWx5c2lzQWxnb3JpdGhtKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudCNnZXRFcnJvckZ1bmN0aW9uIDxlbT5FcnJvciBGdW5jdGlvbjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVycm9yIEZ1bmN0aW9uPC9lbT4nLg0KKwkgKiBAc2VlIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudCNnZXRFcnJvckZ1bmN0aW9uKCkNCisJICogQHNlZSAjZ2V0QXV0b21hdGljRXhwZXJpbWVudCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0QXV0b21hdGljRXhwZXJpbWVudF9FcnJvckZ1bmN0aW9uKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudCNnZXRUb2xlcmFuY2UgPGVtPlRvbGVyYW5jZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvbGVyYW5jZTwvZW0+Jy4NCisJICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY0V4cGVyaW1lbnQjZ2V0VG9sZXJhbmNlKCkNCisJICogQHNlZSAjZ2V0QXV0b21hdGljRXhwZXJpbWVudCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0QXV0b21hdGljRXhwZXJpbWVudF9Ub2xlcmFuY2UoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNFeHBlcmltZW50I2dldFJlZmVyYW5jZURhdGFEaXIgPGVtPlJlZmVyYW5jZSBEYXRhIERpcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZmVyYW5jZSBEYXRhIERpcjwvZW0+Jy4NCisJICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY0V4cGVyaW1lbnQjZ2V0UmVmZXJhbmNlRGF0YURpcigpDQorCSAqIEBzZWUgI2dldEF1dG9tYXRpY0V4cGVyaW1lbnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldEF1dG9tYXRpY0V4cGVyaW1lbnRfUmVmZXJhbmNlRGF0YURpcigpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY0V4cGVyaW1lbnQjZ2V0TWF4aW11bU51bWJlck9mSXRlcmF0aW9ucyA8ZW0+TWF4aW11bSBOdW1iZXIgT2YgSXRlcmF0aW9uczwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1heGltdW0gTnVtYmVyIE9mIEl0ZXJhdGlvbnM8L2VtPicuDQorCSAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNFeHBlcmltZW50I2dldE1heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMoKQ0KKwkgKiBAc2VlICNnZXRBdXRvbWF0aWNFeHBlcmltZW50KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRBdXRvbWF0aWNFeHBlcmltZW50X01heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNFeHBlcmltZW50I2lzUmVJbml0IDxlbT5SZSBJbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmUgSW5pdDwvZW0+Jy4NCisJICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY0V4cGVyaW1lbnQjaXNSZUluaXQoKQ0KKwkgKiBAc2VlICNnZXRBdXRvbWF0aWNFeHBlcmltZW50KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRBdXRvbWF0aWNFeHBlcmltZW50X1JlSW5pdCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5Nb2RpZmlhYmxlUGFyYW1ldGVyIDxlbT5Nb2RpZmlhYmxlIFBhcmFtZXRlcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Nb2RpZmlhYmxlIFBhcmFtZXRlcjwvZW0+Jy4NCisJICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldE1vZGlmaWFibGVQYXJhbWV0ZXIoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5Nb2RpZmlhYmxlUGFyYW1ldGVyI2dldEluaXRpYWxWYWx1ZSA8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluaXRpYWwgVmFsdWU8L2VtPicuDQorCSAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5Nb2RpZmlhYmxlUGFyYW1ldGVyI2dldEluaXRpYWxWYWx1ZSgpDQorCSAqIEBzZWUgI2dldE1vZGlmaWFibGVQYXJhbWV0ZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldE1vZGlmaWFibGVQYXJhbWV0ZXJfSW5pdGlhbFZhbHVlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuTW9kaWZpYWJsZVBhcmFtZXRlciNnZXRGZWF0dXJlIDxlbT5GZWF0dXJlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RmVhdHVyZTwvZW0+Jy4NCisJICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXIjZ2V0RmVhdHVyZSgpDQorCSAqIEBzZWUgI2dldE1vZGlmaWFibGVQYXJhbWV0ZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldE1vZGlmaWFibGVQYXJhbWV0ZXJfRmVhdHVyZSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXIjZ2V0U3RlcCA8ZW0+U3RlcDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0ZXA8L2VtPicuDQorCSAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5Nb2RpZmlhYmxlUGFyYW1ldGVyI2dldFN0ZXAoKQ0KKwkgKiBAc2VlICNnZXRNb2RpZmlhYmxlUGFyYW1ldGVyKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRNb2RpZmlhYmxlUGFyYW1ldGVyX1N0ZXAoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5Nb2RpZmlhYmxlUGFyYW1ldGVyI2dldEZlYXR1cmVOYW1lIDxlbT5GZWF0dXJlIE5hbWU8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GZWF0dXJlIE5hbWU8L2VtPicuDQorCSAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5Nb2RpZmlhYmxlUGFyYW1ldGVyI2dldEZlYXR1cmVOYW1lKCkNCisJICogQHNlZSAjZ2V0TW9kaWZpYWJsZVBhcmFtZXRlcigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0TW9kaWZpYWJsZVBhcmFtZXRlcl9GZWF0dXJlTmFtZSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXIjZ2V0TG93ZXJCb3VuZCA8ZW0+TG93ZXIgQm91bmQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb3dlciBCb3VuZDwvZW0+Jy4NCisJICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXIjZ2V0TG93ZXJCb3VuZCgpDQorCSAqIEBzZWUgI2dldE1vZGlmaWFibGVQYXJhbWV0ZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldE1vZGlmaWFibGVQYXJhbWV0ZXJfTG93ZXJCb3VuZCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXIjZ2V0VXBwZXJCb3VuZCA8ZW0+VXBwZXIgQm91bmQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VcHBlciBCb3VuZDwvZW0+Jy4NCisJICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXIjZ2V0VXBwZXJCb3VuZCgpDQorCSAqIEBzZWUgI2dldE1vZGlmaWFibGVQYXJhbWV0ZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldE1vZGlmaWFibGVQYXJhbWV0ZXJfVXBwZXJCb3VuZCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXIjZ2V0VGFyZ2V0VVJJIDxlbT5UYXJnZXQgVVJJPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IFVSSTwvZW0+Jy4NCisJICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXIjZ2V0VGFyZ2V0VVJJKCkNCisJICogQHNlZSAjZ2V0TW9kaWZpYWJsZVBhcmFtZXRlcigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0TW9kaWZpYWJsZVBhcmFtZXRlcl9UYXJnZXRVUkkoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUF1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5IGdldEF1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5KCk7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50DQorCSAqIDx1bD4NCisJICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPg0KKwkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPg0KKwkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4NCisJICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4NCisJICogPC91bD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludGVyZmFjZSBMaXRlcmFscyB7DQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBhdXRvbWF0aWNleHBlcmltZW50LmltcGwuQXV0b21hdGljRXhwZXJpbWVudEltcGwgPGVtPkF1dG9tYXRpYyBFeHBlcmltZW50PC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5pbXBsLkF1dG9tYXRpY0V4cGVyaW1lbnRJbXBsDQorCQkgKiBAc2VlIGF1dG9tYXRpY2V4cGVyaW1lbnQuaW1wbC5BdXRvbWF0aWNleHBlcmltZW50UGFja2FnZUltcGwjZ2V0QXV0b21hdGljRXhwZXJpbWVudCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBBVVRPTUFUSUNfRVhQRVJJTUVOVCA9IGVJTlNUQU5DRS5nZXRBdXRvbWF0aWNFeHBlcmltZW50KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlIFNjZW5hcmlvPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBBVVRPTUFUSUNfRVhQRVJJTUVOVF9fQkFTRV9TQ0VOQVJJTyA9IGVJTlNUQU5DRS5nZXRBdXRvbWF0aWNFeHBlcmltZW50X0Jhc2VTY2VuYXJpbygpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW1ldGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBBVVRPTUFUSUNfRVhQRVJJTUVOVF9fUEFSQU1FVEVSUyA9IGVJTlNUQU5DRS5nZXRBdXRvbWF0aWNFeHBlcmltZW50X1BhcmFtZXRlcnMoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVycm9yIEFuYWx5c2lzIEFsZ29yaXRobTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgQVVUT01BVElDX0VYUEVSSU1FTlRfX0VSUk9SX0FOQUxZU0lTX0FMR09SSVRITSA9IGVJTlNUQU5DRS5nZXRBdXRvbWF0aWNFeHBlcmltZW50X0Vycm9yQW5hbHlzaXNBbGdvcml0aG0oKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVycm9yIEZ1bmN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBBVVRPTUFUSUNfRVhQRVJJTUVOVF9fRVJST1JfRlVOQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0QXV0b21hdGljRXhwZXJpbWVudF9FcnJvckZ1bmN0aW9uKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub2xlcmFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIEFVVE9NQVRJQ19FWFBFUklNRU5UX19UT0xFUkFOQ0UgPSBlSU5TVEFOQ0UuZ2V0QXV0b21hdGljRXhwZXJpbWVudF9Ub2xlcmFuY2UoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyYW5jZSBEYXRhIERpcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgQVVUT01BVElDX0VYUEVSSU1FTlRfX1JFRkVSQU5DRV9EQVRBX0RJUiA9IGVJTlNUQU5DRS5nZXRBdXRvbWF0aWNFeHBlcmltZW50X1JlZmVyYW5jZURhdGFEaXIoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1heGltdW0gTnVtYmVyIE9mIEl0ZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIEFVVE9NQVRJQ19FWFBFUklNRU5UX19NQVhJTVVNX05VTUJFUl9PRl9JVEVSQVRJT05TID0gZUlOU1RBTkNFLmdldEF1dG9tYXRpY0V4cGVyaW1lbnRfTWF4aW11bU51bWJlck9mSXRlcmF0aW9ucygpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmUgSW5pdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgQVVUT01BVElDX0VYUEVSSU1FTlRfX1JFX0lOSVQgPSBlSU5TVEFOQ0UuZ2V0QXV0b21hdGljRXhwZXJpbWVudF9SZUluaXQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuaW1wbC5Nb2RpZmlhYmxlUGFyYW1ldGVySW1wbCA8ZW0+TW9kaWZpYWJsZSBQYXJhbWV0ZXI8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50LmltcGwuTW9kaWZpYWJsZVBhcmFtZXRlckltcGwNCisJCSAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5pbXBsLkF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlSW1wbCNnZXRNb2RpZmlhYmxlUGFyYW1ldGVyKCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIE1PRElGSUFCTEVfUEFSQU1FVEVSID0gZUlOU1RBTkNFLmdldE1vZGlmaWFibGVQYXJhbWV0ZXIoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIE1PRElGSUFCTEVfUEFSQU1FVEVSX19JTklUSUFMX1ZBTFVFID0gZUlOU1RBTkNFLmdldE1vZGlmaWFibGVQYXJhbWV0ZXJfSW5pdGlhbFZhbHVlKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBNT0RJRklBQkxFX1BBUkFNRVRFUl9fRkVBVFVSRSA9IGVJTlNUQU5DRS5nZXRNb2RpZmlhYmxlUGFyYW1ldGVyX0ZlYXR1cmUoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0ZXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIE1PRElGSUFCTEVfUEFSQU1FVEVSX19TVEVQID0gZUlOU1RBTkNFLmdldE1vZGlmaWFibGVQYXJhbWV0ZXJfU3RlcCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmVhdHVyZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBNT0RJRklBQkxFX1BBUkFNRVRFUl9fRkVBVFVSRV9OQU1FID0gZUlOU1RBTkNFLmdldE1vZGlmaWFibGVQYXJhbWV0ZXJfRmVhdHVyZU5hbWUoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvd2VyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBNT0RJRklBQkxFX1BBUkFNRVRFUl9fTE9XRVJfQk9VTkQgPSBlSU5TVEFOQ0UuZ2V0TW9kaWZpYWJsZVBhcmFtZXRlcl9Mb3dlckJvdW5kKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VcHBlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgTU9ESUZJQUJMRV9QQVJBTUVURVJfX1VQUEVSX0JPVU5EID0gZUlOU1RBTkNFLmdldE1vZGlmaWFibGVQYXJhbWV0ZXJfVXBwZXJCb3VuZCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IFVSSTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgTU9ESUZJQUJMRV9QQVJBTUVURVJfX1RBUkdFVF9VUkkgPSBlSU5TVEFOQ0UuZ2V0TW9kaWZpYWJsZVBhcmFtZXRlcl9UYXJnZXRVUkkoKTsNCisNCisJfQ0KKw0KK30gLy9BdXRvbWF0aWNleHBlcmltZW50UGFja2FnZQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9Nb2RpZmlhYmxlUGFyYW1ldGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL2F1dG9tYXRpY2V4cGVyaW1lbnQvTW9kaWZpYWJsZVBhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZGNmZmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL2F1dG9tYXRpY2V4cGVyaW1lbnQvTW9kaWZpYWJsZVBhcmFtZXRlci5qYXZhCkBAIC0wLDAgKzEsMjI1IEBACitwYWNrYWdlIGF1dG9tYXRpY2V4cGVyaW1lbnQ7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TW9kaWZpYWJsZSBQYXJhbWV0ZXI8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5Nb2RpZmlhYmxlUGFyYW1ldGVyI2dldEluaXRpYWxWYWx1ZSA8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuTW9kaWZpYWJsZVBhcmFtZXRlciNnZXRGZWF0dXJlIDxlbT5GZWF0dXJlPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5Nb2RpZmlhYmxlUGFyYW1ldGVyI2dldFN0ZXAgPGVtPlN0ZXA8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXIjZ2V0RmVhdHVyZU5hbWUgPGVtPkZlYXR1cmUgTmFtZTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuTW9kaWZpYWJsZVBhcmFtZXRlciNnZXRMb3dlckJvdW5kIDxlbT5Mb3dlciBCb3VuZDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuTW9kaWZpYWJsZVBhcmFtZXRlciNnZXRVcHBlckJvdW5kIDxlbT5VcHBlciBCb3VuZDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuTW9kaWZpYWJsZVBhcmFtZXRlciNnZXRUYXJnZXRVUkkgPGVtPlRhcmdldCBVUkk8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlI2dldE1vZGlmaWFibGVQYXJhbWV0ZXIoKQ0KKyAqIEBtb2RlbA0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIE1vZGlmaWFibGVQYXJhbWV0ZXIgZXh0ZW5kcyBFT2JqZWN0IHsNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXRpYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluaXRpYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXRJbml0aWFsVmFsdWUoZG91YmxlKQ0KKwkgKiBAc2VlIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UjZ2V0TW9kaWZpYWJsZVBhcmFtZXRlcl9Jbml0aWFsVmFsdWUoKQ0KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWRvdWJsZSBnZXRJbml0aWFsVmFsdWUoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuTW9kaWZpYWJsZVBhcmFtZXRlciNnZXRJbml0aWFsVmFsdWUgPGVtPkluaXRpYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXRJbml0aWFsVmFsdWUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldEluaXRpYWxWYWx1ZShkb3VibGUgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmVhdHVyZTwvYj48L2VtPicgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmVhdHVyZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmVhdHVyZTwvZW0+JyByZWZlcmVuY2UuDQorCSAqIEBzZWUgI3NldEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlKQ0KKwkgKiBAc2VlIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UjZ2V0TW9kaWZpYWJsZVBhcmFtZXRlcl9GZWF0dXJlKCkNCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZSgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5Nb2RpZmlhYmxlUGFyYW1ldGVyI2dldEZlYXR1cmUgPGVtPkZlYXR1cmU8L2VtPn0nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZlYXR1cmU8L2VtPicgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNnZXRGZWF0dXJlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSB2YWx1ZSk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGVwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdGVwPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGVwPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjc2V0U3RlcChkb3VibGUpDQorCSAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNleHBlcmltZW50UGFja2FnZSNnZXRNb2RpZmlhYmxlUGFyYW1ldGVyX1N0ZXAoKQ0KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWRvdWJsZSBnZXRTdGVwKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXIjZ2V0U3RlcCA8ZW0+U3RlcDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RlcDwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2dldFN0ZXAoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldFN0ZXAoZG91YmxlIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZlYXR1cmUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmVhdHVyZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GZWF0dXJlIE5hbWU8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXRGZWF0dXJlTmFtZShTdHJpbmcpDQorCSAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNleHBlcmltZW50UGFja2FnZSNnZXRNb2RpZmlhYmxlUGFyYW1ldGVyX0ZlYXR1cmVOYW1lKCkNCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZ2V0RmVhdHVyZU5hbWUoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuTW9kaWZpYWJsZVBhcmFtZXRlciNnZXRGZWF0dXJlTmFtZSA8ZW0+RmVhdHVyZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GZWF0dXJlIE5hbWU8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXRGZWF0dXJlTmFtZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0RmVhdHVyZU5hbWUoU3RyaW5nIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvd2VyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiItMSI8L2NvZGU+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG93ZXIgQm91bmQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvd2VyIEJvdW5kPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjc2V0TG93ZXJCb3VuZChkb3VibGUpDQorCSAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNleHBlcmltZW50UGFja2FnZSNnZXRNb2RpZmlhYmxlUGFyYW1ldGVyX0xvd2VyQm91bmQoKQ0KKwkgKiBAbW9kZWwgZGVmYXVsdD0iLTEiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWRvdWJsZSBnZXRMb3dlckJvdW5kKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXIjZ2V0TG93ZXJCb3VuZCA8ZW0+TG93ZXIgQm91bmQ8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvd2VyIEJvdW5kPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0TG93ZXJCb3VuZCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0TG93ZXJCb3VuZChkb3VibGUgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXBwZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Ii0xIjwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VcHBlciBCb3VuZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXBwZXIgQm91bmQ8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXRVcHBlckJvdW5kKGRvdWJsZSkNCisJICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlI2dldE1vZGlmaWFibGVQYXJhbWV0ZXJfVXBwZXJCb3VuZCgpDQorCSAqIEBtb2RlbCBkZWZhdWx0PSItMSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJZG91YmxlIGdldFVwcGVyQm91bmQoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuTW9kaWZpYWJsZVBhcmFtZXRlciNnZXRVcHBlckJvdW5kIDxlbT5VcHBlciBCb3VuZDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXBwZXIgQm91bmQ8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXRVcHBlckJvdW5kKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRVcHBlckJvdW5kKGRvdWJsZSB2YWx1ZSk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXJnZXQgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYXJnZXQgVVJJPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgVVJJPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjc2V0VGFyZ2V0VVJJKFVSSSkNCisJICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlI2dldE1vZGlmaWFibGVQYXJhbWV0ZXJfVGFyZ2V0VVJJKCkNCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlVSSSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJVVJJIGdldFRhcmdldFVSSSgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5Nb2RpZmlhYmxlUGFyYW1ldGVyI2dldFRhcmdldFVSSSA8ZW0+VGFyZ2V0IFVSSTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IFVSSTwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2dldFRhcmdldFVSSSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0VGFyZ2V0VVJJKFVSSSB2YWx1ZSk7DQorDQorfSAvLyBNb2RpZmlhYmxlUGFyYW1ldGVyDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9hdXRvbWF0aWNleHBlcmltZW50L2ltcGwvQXV0b21hdGljRXhwZXJpbWVudEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9pbXBsL0F1dG9tYXRpY0V4cGVyaW1lbnRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0MTJjYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9pbXBsL0F1dG9tYXRpY0V4cGVyaW1lbnRJbXBsLmphdmEKQEAgLTAsMCArMSw1NDIgQEAKK3BhY2thZ2UgYXV0b21hdGljZXhwZXJpbWVudC5pbXBsOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5JZGVudGlmaWFibGVJbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW87DQorDQoraW1wb3J0IGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudDsNCitpbXBvcnQgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNleHBlcmltZW50UGFja2FnZTsNCitpbXBvcnQgYXV0b21hdGljZXhwZXJpbWVudC5Nb2RpZmlhYmxlUGFyYW1ldGVyOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkF1dG9tYXRpYyBFeHBlcmltZW50PC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuaW1wbC5BdXRvbWF0aWNFeHBlcmltZW50SW1wbCNnZXRCYXNlU2NlbmFyaW8gPGVtPkJhc2UgU2NlbmFyaW88L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBhdXRvbWF0aWNleHBlcmltZW50LmltcGwuQXV0b21hdGljRXhwZXJpbWVudEltcGwjZ2V0UGFyYW1ldGVycyA8ZW0+UGFyYW1ldGVyczwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuaW1wbC5BdXRvbWF0aWNFeHBlcmltZW50SW1wbCNnZXRFcnJvckFuYWx5c2lzQWxnb3JpdGhtIDxlbT5FcnJvciBBbmFseXNpcyBBbGdvcml0aG08L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBhdXRvbWF0aWNleHBlcmltZW50LmltcGwuQXV0b21hdGljRXhwZXJpbWVudEltcGwjZ2V0RXJyb3JGdW5jdGlvbiA8ZW0+RXJyb3IgRnVuY3Rpb248L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBhdXRvbWF0aWNleHBlcmltZW50LmltcGwuQXV0b21hdGljRXhwZXJpbWVudEltcGwjZ2V0VG9sZXJhbmNlIDxlbT5Ub2xlcmFuY2U8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBhdXRvbWF0aWNleHBlcmltZW50LmltcGwuQXV0b21hdGljRXhwZXJpbWVudEltcGwjZ2V0UmVmZXJhbmNlRGF0YURpciA8ZW0+UmVmZXJhbmNlIERhdGEgRGlyPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5pbXBsLkF1dG9tYXRpY0V4cGVyaW1lbnRJbXBsI2dldE1heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMgPGVtPk1heGltdW0gTnVtYmVyIE9mIEl0ZXJhdGlvbnM8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBhdXRvbWF0aWNleHBlcmltZW50LmltcGwuQXV0b21hdGljRXhwZXJpbWVudEltcGwjaXNSZUluaXQgPGVtPlJlIEluaXQ8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBdXRvbWF0aWNFeHBlcmltZW50SW1wbCBleHRlbmRzIElkZW50aWZpYWJsZUltcGwgaW1wbGVtZW50cyBBdXRvbWF0aWNFeHBlcmltZW50IHsNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VTY2VuYXJpbygpIDxlbT5CYXNlIFNjZW5hcmlvPC9lbT59JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRCYXNlU2NlbmFyaW8oKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2NlbmFyaW8gYmFzZVNjZW5hcmlvOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1ldGVycygpIDxlbT5QYXJhbWV0ZXJzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFBhcmFtZXRlcnMoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRUxpc3Q8TW9kaWZpYWJsZVBhcmFtZXRlcj4gcGFyYW1ldGVyczsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFcnJvckFuYWx5c2lzQWxnb3JpdGhtKCkgPGVtPkVycm9yIEFuYWx5c2lzIEFsZ29yaXRobTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0RXJyb3JBbmFseXNpc0FsZ29yaXRobSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0FOQUxZU0lTX0FMR09SSVRITV9FREVGQVVMVCA9IG51bGw7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFcnJvckFuYWx5c2lzQWxnb3JpdGhtKCkgPGVtPkVycm9yIEFuYWx5c2lzIEFsZ29yaXRobTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0RXJyb3JBbmFseXNpc0FsZ29yaXRobSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZXJyb3JBbmFseXNpc0FsZ29yaXRobSA9IEVSUk9SX0FOQUxZU0lTX0FMR09SSVRITV9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFcnJvckZ1bmN0aW9uKCkgPGVtPkVycm9yIEZ1bmN0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRFcnJvckZ1bmN0aW9uKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRlVOQ1RJT05fRURFRkFVTFQgPSBudWxsOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXJyb3JGdW5jdGlvbigpIDxlbT5FcnJvciBGdW5jdGlvbjwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0RXJyb3JGdW5jdGlvbigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZXJyb3JGdW5jdGlvbiA9IEVSUk9SX0ZVTkNUSU9OX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvbGVyYW5jZSgpIDxlbT5Ub2xlcmFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFRvbGVyYW5jZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFRPTEVSQU5DRV9FREVGQVVMVCA9IDAuMDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvbGVyYW5jZSgpIDxlbT5Ub2xlcmFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFRvbGVyYW5jZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBkb3VibGUgdG9sZXJhbmNlID0gVE9MRVJBTkNFX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyYW5jZURhdGFEaXIoKSA8ZW0+UmVmZXJhbmNlIERhdGEgRGlyPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRSZWZlcmFuY2VEYXRhRGlyKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJBTkNFX0RBVEFfRElSX0VERUZBVUxUID0gbnVsbDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyYW5jZURhdGFEaXIoKSA8ZW0+UmVmZXJhbmNlIERhdGEgRGlyPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRSZWZlcmFuY2VEYXRhRGlyKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyByZWZlcmFuY2VEYXRhRGlyID0gUkVGRVJBTkNFX0RBVEFfRElSX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMoKSA8ZW0+TWF4aW11bSBOdW1iZXIgT2YgSXRlcmF0aW9uczwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0TWF4aW11bU51bWJlck9mSXRlcmF0aW9ucygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBNQVhJTVVNX05VTUJFUl9PRl9JVEVSQVRJT05TX0VERUZBVUxUID0gMEw7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXhpbXVtTnVtYmVyT2ZJdGVyYXRpb25zKCkgPGVtPk1heGltdW0gTnVtYmVyIE9mIEl0ZXJhdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldE1heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgbG9uZyBtYXhpbXVtTnVtYmVyT2ZJdGVyYXRpb25zID0gTUFYSU1VTV9OVU1CRVJfT0ZfSVRFUkFUSU9OU19FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlSW5pdCgpIDxlbT5SZSBJbml0PC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNpc1JlSW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRV9JTklUX0VERUZBVUxUID0gZmFsc2U7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlSW5pdCgpIDxlbT5SZSBJbml0PC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNpc1JlSW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlSW5pdCA9IFJFX0lOSVRfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEF1dG9tYXRpY0V4cGVyaW1lbnRJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5MaXRlcmFscy5BVVRPTUFUSUNfRVhQRVJJTUVOVDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTY2VuYXJpbyBnZXRCYXNlU2NlbmFyaW8oKSB7DQorCQlpZiAoYmFzZVNjZW5hcmlvICE9IG51bGwgJiYgYmFzZVNjZW5hcmlvLmVJc1Byb3h5KCkpIHsNCisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkQmFzZVNjZW5hcmlvID0gKEludGVybmFsRU9iamVjdCliYXNlU2NlbmFyaW87DQorCQkJYmFzZVNjZW5hcmlvID0gKFNjZW5hcmlvKWVSZXNvbHZlUHJveHkob2xkQmFzZVNjZW5hcmlvKTsNCisJCQlpZiAoYmFzZVNjZW5hcmlvICE9IG9sZEJhc2VTY2VuYXJpbykgew0KKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuQVVUT01BVElDX0VYUEVSSU1FTlRfX0JBU0VfU0NFTkFSSU8sIG9sZEJhc2VTY2VuYXJpbywgYmFzZVNjZW5hcmlvKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIGJhc2VTY2VuYXJpbzsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTY2VuYXJpbyBiYXNpY0dldEJhc2VTY2VuYXJpbygpIHsNCisJCXJldHVybiBiYXNlU2NlbmFyaW87DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRCYXNlU2NlbmFyaW8oU2NlbmFyaW8gbmV3QmFzZVNjZW5hcmlvKSB7DQorCQlTY2VuYXJpbyBvbGRCYXNlU2NlbmFyaW8gPSBiYXNlU2NlbmFyaW87DQorCQliYXNlU2NlbmFyaW8gPSBuZXdCYXNlU2NlbmFyaW87DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuQVVUT01BVElDX0VYUEVSSU1FTlRfX0JBU0VfU0NFTkFSSU8sIG9sZEJhc2VTY2VuYXJpbywgYmFzZVNjZW5hcmlvKSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUxpc3Q8TW9kaWZpYWJsZVBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpIHsNCisJCWlmIChwYXJhbWV0ZXJzID09IG51bGwpIHsNCisJCQlwYXJhbWV0ZXJzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxNb2RpZmlhYmxlUGFyYW1ldGVyPihNb2RpZmlhYmxlUGFyYW1ldGVyLmNsYXNzLCB0aGlzLCBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5BVVRPTUFUSUNfRVhQRVJJTUVOVF9fUEFSQU1FVEVSUyk7DQorCQl9DQorCQlyZXR1cm4gcGFyYW1ldGVyczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JBbmFseXNpc0FsZ29yaXRobSgpIHsNCisJCXJldHVybiBlcnJvckFuYWx5c2lzQWxnb3JpdGhtOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0RXJyb3JBbmFseXNpc0FsZ29yaXRobShTdHJpbmcgbmV3RXJyb3JBbmFseXNpc0FsZ29yaXRobSkgew0KKwkJU3RyaW5nIG9sZEVycm9yQW5hbHlzaXNBbGdvcml0aG0gPSBlcnJvckFuYWx5c2lzQWxnb3JpdGhtOw0KKwkJZXJyb3JBbmFseXNpc0FsZ29yaXRobSA9IG5ld0Vycm9yQW5hbHlzaXNBbGdvcml0aG07DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuQVVUT01BVElDX0VYUEVSSU1FTlRfX0VSUk9SX0FOQUxZU0lTX0FMR09SSVRITSwgb2xkRXJyb3JBbmFseXNpc0FsZ29yaXRobSwgZXJyb3JBbmFseXNpc0FsZ29yaXRobSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFcnJvckZ1bmN0aW9uKCkgew0KKwkJcmV0dXJuIGVycm9yRnVuY3Rpb247DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRFcnJvckZ1bmN0aW9uKFN0cmluZyBuZXdFcnJvckZ1bmN0aW9uKSB7DQorCQlTdHJpbmcgb2xkRXJyb3JGdW5jdGlvbiA9IGVycm9yRnVuY3Rpb247DQorCQllcnJvckZ1bmN0aW9uID0gbmV3RXJyb3JGdW5jdGlvbjsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5BVVRPTUFUSUNfRVhQRVJJTUVOVF9fRVJST1JfRlVOQ1RJT04sIG9sZEVycm9yRnVuY3Rpb24sIGVycm9yRnVuY3Rpb24pKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBkb3VibGUgZ2V0VG9sZXJhbmNlKCkgew0KKwkJcmV0dXJuIHRvbGVyYW5jZTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFRvbGVyYW5jZShkb3VibGUgbmV3VG9sZXJhbmNlKSB7DQorCQlkb3VibGUgb2xkVG9sZXJhbmNlID0gdG9sZXJhbmNlOw0KKwkJdG9sZXJhbmNlID0gbmV3VG9sZXJhbmNlOw0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19UT0xFUkFOQ0UsIG9sZFRvbGVyYW5jZSwgdG9sZXJhbmNlKSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldFJlZmVyYW5jZURhdGFEaXIoKSB7DQorCQlyZXR1cm4gcmVmZXJhbmNlRGF0YURpcjsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFJlZmVyYW5jZURhdGFEaXIoU3RyaW5nIG5ld1JlZmVyYW5jZURhdGFEaXIpIHsNCisJCVN0cmluZyBvbGRSZWZlcmFuY2VEYXRhRGlyID0gcmVmZXJhbmNlRGF0YURpcjsNCisJCXJlZmVyYW5jZURhdGFEaXIgPSBuZXdSZWZlcmFuY2VEYXRhRGlyOw0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19SRUZFUkFOQ0VfREFUQV9ESVIsIG9sZFJlZmVyYW5jZURhdGFEaXIsIHJlZmVyYW5jZURhdGFEaXIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBsb25nIGdldE1heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMoKSB7DQorCQlyZXR1cm4gbWF4aW11bU51bWJlck9mSXRlcmF0aW9uczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldE1heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMobG9uZyBuZXdNYXhpbXVtTnVtYmVyT2ZJdGVyYXRpb25zKSB7DQorCQlsb25nIG9sZE1heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMgPSBtYXhpbXVtTnVtYmVyT2ZJdGVyYXRpb25zOw0KKwkJbWF4aW11bU51bWJlck9mSXRlcmF0aW9ucyA9IG5ld01heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnM7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuQVVUT01BVElDX0VYUEVSSU1FTlRfX01BWElNVU1fTlVNQkVSX09GX0lURVJBVElPTlMsIG9sZE1heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMsIG1heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGlzUmVJbml0KCkgew0KKwkJcmV0dXJuIHJlSW5pdDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFJlSW5pdChib29sZWFuIG5ld1JlSW5pdCkgew0KKwkJYm9vbGVhbiBvbGRSZUluaXQgPSByZUluaXQ7DQorCQlyZUluaXQgPSBuZXdSZUluaXQ7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuQVVUT01BVElDX0VYUEVSSU1FTlRfX1JFX0lOSVQsIG9sZFJlSW5pdCwgcmVJbml0KSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19CQVNFX1NDRU5BUklPOg0KKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEJhc2VTY2VuYXJpbygpOw0KKwkJCQlyZXR1cm4gYmFzaWNHZXRCYXNlU2NlbmFyaW8oKTsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19QQVJBTUVURVJTOg0KKwkJCQlyZXR1cm4gZ2V0UGFyYW1ldGVycygpOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuQVVUT01BVElDX0VYUEVSSU1FTlRfX0VSUk9SX0FOQUxZU0lTX0FMR09SSVRITToNCisJCQkJcmV0dXJuIGdldEVycm9yQW5hbHlzaXNBbGdvcml0aG0oKTsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19FUlJPUl9GVU5DVElPTjoNCisJCQkJcmV0dXJuIGdldEVycm9yRnVuY3Rpb24oKTsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19UT0xFUkFOQ0U6DQorCQkJCXJldHVybiBnZXRUb2xlcmFuY2UoKTsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19SRUZFUkFOQ0VfREFUQV9ESVI6DQorCQkJCXJldHVybiBnZXRSZWZlcmFuY2VEYXRhRGlyKCk7DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5BVVRPTUFUSUNfRVhQRVJJTUVOVF9fTUFYSU1VTV9OVU1CRVJfT0ZfSVRFUkFUSU9OUzoNCisJCQkJcmV0dXJuIGdldE1heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMoKTsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19SRV9JTklUOg0KKwkJCQlyZXR1cm4gaXNSZUluaXQoKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19CQVNFX1NDRU5BUklPOg0KKwkJCQlzZXRCYXNlU2NlbmFyaW8oKFNjZW5hcmlvKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuQVVUT01BVElDX0VYUEVSSU1FTlRfX1BBUkFNRVRFUlM6DQorCQkJCWdldFBhcmFtZXRlcnMoKS5jbGVhcigpOw0KKwkJCQlnZXRQYXJhbWV0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNb2RpZmlhYmxlUGFyYW1ldGVyPiluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19FUlJPUl9BTkFMWVNJU19BTEdPUklUSE06DQorCQkJCXNldEVycm9yQW5hbHlzaXNBbGdvcml0aG0oKFN0cmluZyluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19FUlJPUl9GVU5DVElPTjoNCisJCQkJc2V0RXJyb3JGdW5jdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuQVVUT01BVElDX0VYUEVSSU1FTlRfX1RPTEVSQU5DRToNCisJCQkJc2V0VG9sZXJhbmNlKChEb3VibGUpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5BVVRPTUFUSUNfRVhQRVJJTUVOVF9fUkVGRVJBTkNFX0RBVEFfRElSOg0KKwkJCQlzZXRSZWZlcmFuY2VEYXRhRGlyKChTdHJpbmcpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5BVVRPTUFUSUNfRVhQRVJJTUVOVF9fTUFYSU1VTV9OVU1CRVJfT0ZfSVRFUkFUSU9OUzoNCisJCQkJc2V0TWF4aW11bU51bWJlck9mSXRlcmF0aW9ucygoTG9uZyluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19SRV9JTklUOg0KKwkJCQlzZXRSZUluaXQoKEJvb2xlYW4pbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuQVVUT01BVElDX0VYUEVSSU1FTlRfX0JBU0VfU0NFTkFSSU86DQorCQkJCXNldEJhc2VTY2VuYXJpbygoU2NlbmFyaW8pbnVsbCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19QQVJBTUVURVJTOg0KKwkJCQlnZXRQYXJhbWV0ZXJzKCkuY2xlYXIoKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuQVVUT01BVElDX0VYUEVSSU1FTlRfX0VSUk9SX0FOQUxZU0lTX0FMR09SSVRITToNCisJCQkJc2V0RXJyb3JBbmFseXNpc0FsZ29yaXRobShFUlJPUl9BTkFMWVNJU19BTEdPUklUSE1fRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5BVVRPTUFUSUNfRVhQRVJJTUVOVF9fRVJST1JfRlVOQ1RJT046DQorCQkJCXNldEVycm9yRnVuY3Rpb24oRVJST1JfRlVOQ1RJT05fRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5BVVRPTUFUSUNfRVhQRVJJTUVOVF9fVE9MRVJBTkNFOg0KKwkJCQlzZXRUb2xlcmFuY2UoVE9MRVJBTkNFX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuQVVUT01BVElDX0VYUEVSSU1FTlRfX1JFRkVSQU5DRV9EQVRBX0RJUjoNCisJCQkJc2V0UmVmZXJhbmNlRGF0YURpcihSRUZFUkFOQ0VfREFUQV9ESVJfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5BVVRPTUFUSUNfRVhQRVJJTUVOVF9fTUFYSU1VTV9OVU1CRVJfT0ZfSVRFUkFUSU9OUzoNCisJCQkJc2V0TWF4aW11bU51bWJlck9mSXRlcmF0aW9ucyhNQVhJTVVNX05VTUJFUl9PRl9JVEVSQVRJT05TX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuQVVUT01BVElDX0VYUEVSSU1FTlRfX1JFX0lOSVQ6DQorCQkJCXNldFJlSW5pdChSRV9JTklUX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5BVVRPTUFUSUNfRVhQRVJJTUVOVF9fQkFTRV9TQ0VOQVJJTzoNCisJCQkJcmV0dXJuIGJhc2VTY2VuYXJpbyAhPSBudWxsOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuQVVUT01BVElDX0VYUEVSSU1FTlRfX1BBUkFNRVRFUlM6DQorCQkJCXJldHVybiBwYXJhbWV0ZXJzICE9IG51bGwgJiYgIXBhcmFtZXRlcnMuaXNFbXB0eSgpOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuQVVUT01BVElDX0VYUEVSSU1FTlRfX0VSUk9SX0FOQUxZU0lTX0FMR09SSVRITToNCisJCQkJcmV0dXJuIEVSUk9SX0FOQUxZU0lTX0FMR09SSVRITV9FREVGQVVMVCA9PSBudWxsID8gZXJyb3JBbmFseXNpc0FsZ29yaXRobSAhPSBudWxsIDogIUVSUk9SX0FOQUxZU0lTX0FMR09SSVRITV9FREVGQVVMVC5lcXVhbHMoZXJyb3JBbmFseXNpc0FsZ29yaXRobSk7DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5BVVRPTUFUSUNfRVhQRVJJTUVOVF9fRVJST1JfRlVOQ1RJT046DQorCQkJCXJldHVybiBFUlJPUl9GVU5DVElPTl9FREVGQVVMVCA9PSBudWxsID8gZXJyb3JGdW5jdGlvbiAhPSBudWxsIDogIUVSUk9SX0ZVTkNUSU9OX0VERUZBVUxULmVxdWFscyhlcnJvckZ1bmN0aW9uKTsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19UT0xFUkFOQ0U6DQorCQkJCXJldHVybiB0b2xlcmFuY2UgIT0gVE9MRVJBTkNFX0VERUZBVUxUOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuQVVUT01BVElDX0VYUEVSSU1FTlRfX1JFRkVSQU5DRV9EQVRBX0RJUjoNCisJCQkJcmV0dXJuIFJFRkVSQU5DRV9EQVRBX0RJUl9FREVGQVVMVCA9PSBudWxsID8gcmVmZXJhbmNlRGF0YURpciAhPSBudWxsIDogIVJFRkVSQU5DRV9EQVRBX0RJUl9FREVGQVVMVC5lcXVhbHMocmVmZXJhbmNlRGF0YURpcik7DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5BVVRPTUFUSUNfRVhQRVJJTUVOVF9fTUFYSU1VTV9OVU1CRVJfT0ZfSVRFUkFUSU9OUzoNCisJCQkJcmV0dXJuIG1heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMgIT0gTUFYSU1VTV9OVU1CRVJfT0ZfSVRFUkFUSU9OU19FREVGQVVMVDsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19SRV9JTklUOg0KKwkJCQlyZXR1cm4gcmVJbml0ICE9IFJFX0lOSVRfRURFRkFVTFQ7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCisNCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KKwkJcmVzdWx0LmFwcGVuZCgiIChlcnJvckFuYWx5c2lzQWxnb3JpdGhtOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQoZXJyb3JBbmFseXNpc0FsZ29yaXRobSk7DQorCQlyZXN1bHQuYXBwZW5kKCIsIGVycm9yRnVuY3Rpb246ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChlcnJvckZ1bmN0aW9uKTsNCisJCXJlc3VsdC5hcHBlbmQoIiwgdG9sZXJhbmNlOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQodG9sZXJhbmNlKTsNCisJCXJlc3VsdC5hcHBlbmQoIiwgcmVmZXJhbmNlRGF0YURpcjogIik7DQorCQlyZXN1bHQuYXBwZW5kKHJlZmVyYW5jZURhdGFEaXIpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCBtYXhpbXVtTnVtYmVyT2ZJdGVyYXRpb25zOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQobWF4aW11bU51bWJlck9mSXRlcmF0aW9ucyk7DQorCQlyZXN1bHQuYXBwZW5kKCIsIHJlSW5pdDogIik7DQorCQlyZXN1bHQuYXBwZW5kKHJlSW5pdCk7DQorCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQorCX0NCisNCit9IC8vQXV0b21hdGljRXhwZXJpbWVudEltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL2F1dG9tYXRpY2V4cGVyaW1lbnQvaW1wbC9BdXRvbWF0aWNleHBlcmltZW50RmFjdG9yeUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9pbXBsL0F1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YzQxMmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL2F1dG9tYXRpY2V4cGVyaW1lbnQvaW1wbC9BdXRvbWF0aWNleHBlcmltZW50RmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDExNyBAQAorcGFja2FnZSBhdXRvbWF0aWNleHBlcmltZW50LmltcGw7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGF1dG9tYXRpY2V4cGVyaW1lbnQuKjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOw0KKw0KK2ltcG9ydCBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY0V4cGVyaW1lbnQ7DQoraW1wb3J0IGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljZXhwZXJpbWVudEZhY3Rvcnk7DQoraW1wb3J0IGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2U7DQoraW1wb3J0IGF1dG9tYXRpY2V4cGVyaW1lbnQuTW9kaWZpYWJsZVBhcmFtZXRlcjsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEF1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5IHsNCisJLyoqDQorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgQXV0b21hdGljZXhwZXJpbWVudEZhY3RvcnkgaW5pdCgpIHsNCisJCXRyeSB7DQorCQkJQXV0b21hdGljZXhwZXJpbWVudEZhY3RvcnkgdGhlQXV0b21hdGljZXhwZXJpbWVudEZhY3RvcnkgPSAoQXV0b21hdGljZXhwZXJpbWVudEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2F1dG9tYXRpY2V4cGVyaW1lbnQuZWNvcmUiKTsgDQorCQkJaWYgKHRoZUF1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5ICE9IG51bGwpIHsNCisJCQkJcmV0dXJuIHRoZUF1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5Ow0KKwkJCX0NCisJCX0NCisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQl9DQorCQlyZXR1cm4gbmV3IEF1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5SW1wbCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5SW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsNCisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5BVVRPTUFUSUNfRVhQRVJJTUVOVDogcmV0dXJuIGNyZWF0ZUF1dG9tYXRpY0V4cGVyaW1lbnQoKTsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLk1PRElGSUFCTEVfUEFSQU1FVEVSOiByZXR1cm4gY3JlYXRlTW9kaWZpYWJsZVBhcmFtZXRlcigpOw0KKwkJCWRlZmF1bHQ6DQorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQXV0b21hdGljRXhwZXJpbWVudCBjcmVhdGVBdXRvbWF0aWNFeHBlcmltZW50KCkgew0KKwkJQXV0b21hdGljRXhwZXJpbWVudEltcGwgYXV0b21hdGljRXhwZXJpbWVudCA9IG5ldyBBdXRvbWF0aWNFeHBlcmltZW50SW1wbCgpOw0KKwkJcmV0dXJuIGF1dG9tYXRpY0V4cGVyaW1lbnQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTW9kaWZpYWJsZVBhcmFtZXRlciBjcmVhdGVNb2RpZmlhYmxlUGFyYW1ldGVyKCkgew0KKwkJTW9kaWZpYWJsZVBhcmFtZXRlckltcGwgbW9kaWZpYWJsZVBhcmFtZXRlciA9IG5ldyBNb2RpZmlhYmxlUGFyYW1ldGVySW1wbCgpOw0KKwkJcmV0dXJuIG1vZGlmaWFibGVQYXJhbWV0ZXI7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UgZ2V0QXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UoKSB7DQorCQlyZXR1cm4gKEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlKWdldEVQYWNrYWdlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZGVwcmVjYXRlZA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlARGVwcmVjYXRlZA0KKwlwdWJsaWMgc3RhdGljIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlIGdldFBhY2thZ2UoKSB7DQorCQlyZXR1cm4gQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuZUlOU1RBTkNFOw0KKwl9DQorDQorfSAvL0F1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5SW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9pbXBsL0F1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9hdXRvbWF0aWNleHBlcmltZW50L2ltcGwvQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhNGE1MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9pbXBsL0F1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzg0IEBACitwYWNrYWdlIGF1dG9tYXRpY2V4cGVyaW1lbnQuaW1wbDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW9QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlclBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUGFja2FnZTsNCisNCitpbXBvcnQgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNFeHBlcmltZW50Ow0KK2ltcG9ydCBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5Ow0KK2ltcG9ydCBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlOw0KK2ltcG9ydCBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXI7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZSB7DQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3MgYXV0b21hdGljRXhwZXJpbWVudEVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3MgbW9kaWZpYWJsZVBhcmFtZXRlckVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoDQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlDQorCSAqIHBhY2thZ2UgVVJJIHZhbHVlLg0KKwkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljDQorCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zDQorCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsDQorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5DQorCSAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNleHBlcmltZW50UGFja2FnZSNlTlNfVVJJDQorCSAqIEBzZWUgI2luaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlSW1wbCgpIHsNCisJCXN1cGVyKGVOU19VUkksIEF1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5LmVJTlNUQU5DRSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuDQorCSAqIA0KKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLg0KKwkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZU5TX1VSSQ0KKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQ0KKwkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZSBpbml0KCkgew0KKwkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLmVOU19VUkkpOw0KKw0KKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQ0KKwkJQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2VJbXBsIHRoZUF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlID0gKEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlSW1wbCgpKTsNCisNCisJCWlzSW5pdGVkID0gdHJ1ZTsNCisNCisJCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcw0KKwkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7DQorCQlHcmFwaFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOw0KKwkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsNCisJCU1vZGlmaWVyUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7DQorCQlTY2VuYXJpb1BhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOw0KKwkJU2VxdWVuY2VyUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7DQorCQlTb2x2ZXJQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsNCisNCisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzDQorCQl0aGVBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsNCisNCisJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGENCisJCXRoZUF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsNCisNCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQNCisJCXRoZUF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLmZyZWV6ZSgpOw0KKw0KKyAgDQorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UNCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5lTlNfVVJJLCB0aGVBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZSk7DQorCQlyZXR1cm4gdGhlQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2U7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldEF1dG9tYXRpY0V4cGVyaW1lbnQoKSB7DQorCQlyZXR1cm4gYXV0b21hdGljRXhwZXJpbWVudEVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF1dG9tYXRpY0V4cGVyaW1lbnRfQmFzZVNjZW5hcmlvKCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKWF1dG9tYXRpY0V4cGVyaW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF1dG9tYXRpY0V4cGVyaW1lbnRfUGFyYW1ldGVycygpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSlhdXRvbWF0aWNFeHBlcmltZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdXRvbWF0aWNFeHBlcmltZW50X0Vycm9yQW5hbHlzaXNBbGdvcml0aG0oKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXV0b21hdGljRXhwZXJpbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXV0b21hdGljRXhwZXJpbWVudF9FcnJvckZ1bmN0aW9uKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKWF1dG9tYXRpY0V4cGVyaW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldEF1dG9tYXRpY0V4cGVyaW1lbnRfVG9sZXJhbmNlKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKWF1dG9tYXRpY0V4cGVyaW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldEF1dG9tYXRpY0V4cGVyaW1lbnRfUmVmZXJhbmNlRGF0YURpcigpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSlhdXRvbWF0aWNFeHBlcmltZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdXRvbWF0aWNFeHBlcmltZW50X01heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXV0b21hdGljRXhwZXJpbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXV0b21hdGljRXhwZXJpbWVudF9SZUluaXQoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXV0b21hdGljRXhwZXJpbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRNb2RpZmlhYmxlUGFyYW1ldGVyKCkgew0KKwkJcmV0dXJuIG1vZGlmaWFibGVQYXJhbWV0ZXJFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNb2RpZmlhYmxlUGFyYW1ldGVyX0luaXRpYWxWYWx1ZSgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSltb2RpZmlhYmxlUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNb2RpZmlhYmxlUGFyYW1ldGVyX0ZlYXR1cmUoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2UpbW9kaWZpYWJsZVBhcmFtZXRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0TW9kaWZpYWJsZVBhcmFtZXRlcl9TdGVwKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKW1vZGlmaWFibGVQYXJhbWV0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldE1vZGlmaWFibGVQYXJhbWV0ZXJfRmVhdHVyZU5hbWUoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbW9kaWZpYWJsZVBhcmFtZXRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0TW9kaWZpYWJsZVBhcmFtZXRlcl9Mb3dlckJvdW5kKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKW1vZGlmaWFibGVQYXJhbWV0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldE1vZGlmaWFibGVQYXJhbWV0ZXJfVXBwZXJCb3VuZCgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSltb2RpZmlhYmxlUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNb2RpZmlhYmxlUGFyYW1ldGVyX1RhcmdldFVSSSgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSltb2RpZmlhYmxlUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQXV0b21hdGljZXhwZXJpbWVudEZhY3RvcnkgZ2V0QXV0b21hdGljZXhwZXJpbWVudEZhY3RvcnkoKSB7DQorCQlyZXR1cm4gKEF1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsNCisNCisJLyoqDQorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcw0KKwkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7DQorCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47DQorCQlpc0NyZWF0ZWQgPSB0cnVlOw0KKw0KKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzDQorCQlhdXRvbWF0aWNFeHBlcmltZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEFVVE9NQVRJQ19FWFBFUklNRU5UKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UoYXV0b21hdGljRXhwZXJpbWVudEVDbGFzcywgQVVUT01BVElDX0VYUEVSSU1FTlRfX0JBU0VfU0NFTkFSSU8pOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShhdXRvbWF0aWNFeHBlcmltZW50RUNsYXNzLCBBVVRPTUFUSUNfRVhQRVJJTUVOVF9fUEFSQU1FVEVSUyk7DQorCQljcmVhdGVFQXR0cmlidXRlKGF1dG9tYXRpY0V4cGVyaW1lbnRFQ2xhc3MsIEFVVE9NQVRJQ19FWFBFUklNRU5UX19FUlJPUl9BTkFMWVNJU19BTEdPUklUSE0pOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShhdXRvbWF0aWNFeHBlcmltZW50RUNsYXNzLCBBVVRPTUFUSUNfRVhQRVJJTUVOVF9fRVJST1JfRlVOQ1RJT04pOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShhdXRvbWF0aWNFeHBlcmltZW50RUNsYXNzLCBBVVRPTUFUSUNfRVhQRVJJTUVOVF9fVE9MRVJBTkNFKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoYXV0b21hdGljRXhwZXJpbWVudEVDbGFzcywgQVVUT01BVElDX0VYUEVSSU1FTlRfX1JFRkVSQU5DRV9EQVRBX0RJUik7DQorCQljcmVhdGVFQXR0cmlidXRlKGF1dG9tYXRpY0V4cGVyaW1lbnRFQ2xhc3MsIEFVVE9NQVRJQ19FWFBFUklNRU5UX19NQVhJTVVNX05VTUJFUl9PRl9JVEVSQVRJT05TKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoYXV0b21hdGljRXhwZXJpbWVudEVDbGFzcywgQVVUT01BVElDX0VYUEVSSU1FTlRfX1JFX0lOSVQpOw0KKw0KKwkJbW9kaWZpYWJsZVBhcmFtZXRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNT0RJRklBQkxFX1BBUkFNRVRFUik7DQorCQljcmVhdGVFQXR0cmlidXRlKG1vZGlmaWFibGVQYXJhbWV0ZXJFQ2xhc3MsIE1PRElGSUFCTEVfUEFSQU1FVEVSX19JTklUSUFMX1ZBTFVFKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UobW9kaWZpYWJsZVBhcmFtZXRlckVDbGFzcywgTU9ESUZJQUJMRV9QQVJBTUVURVJfX0ZFQVRVUkUpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShtb2RpZmlhYmxlUGFyYW1ldGVyRUNsYXNzLCBNT0RJRklBQkxFX1BBUkFNRVRFUl9fU1RFUCk7DQorCQljcmVhdGVFQXR0cmlidXRlKG1vZGlmaWFibGVQYXJhbWV0ZXJFQ2xhc3MsIE1PRElGSUFCTEVfUEFSQU1FVEVSX19GRUFUVVJFX05BTUUpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShtb2RpZmlhYmxlUGFyYW1ldGVyRUNsYXNzLCBNT0RJRklBQkxFX1BBUkFNRVRFUl9fTE9XRVJfQk9VTkQpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShtb2RpZmlhYmxlUGFyYW1ldGVyRUNsYXNzLCBNT0RJRklBQkxFX1BBUkFNRVRFUl9fVVBQRVJfQk9VTkQpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShtb2RpZmlhYmxlUGFyYW1ldGVyRUNsYXNzLCBNT0RJRklBQkxFX1BBUkFNRVRFUl9fVEFSR0VUX1VSSSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOw0KKw0KKwkvKioNCisJICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMNCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7DQorCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOw0KKwkJaXNJbml0aWFsaXplZCA9IHRydWU7DQorDQorCQkvLyBJbml0aWFsaXplIHBhY2thZ2UNCisJCXNldE5hbWUoZU5BTUUpOw0KKwkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7DQorCQlzZXROc1VSSShlTlNfVVJJKTsNCisNCisJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMNCisJCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7DQorCQlTY2VuYXJpb1BhY2thZ2UgdGhlU2NlbmFyaW9QYWNrYWdlID0gKFNjZW5hcmlvUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTY2VuYXJpb1BhY2thZ2UuZU5TX1VSSSk7DQorCQlFY29yZVBhY2thZ2UgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7DQorDQorCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzDQorDQorCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMNCisNCisJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMNCisJCWF1dG9tYXRpY0V4cGVyaW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRJZGVudGlmaWFibGUoKSk7DQorDQorCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycw0KKwkJaW5pdEVDbGFzcyhhdXRvbWF0aWNFeHBlcmltZW50RUNsYXNzLCBBdXRvbWF0aWNFeHBlcmltZW50LmNsYXNzLCAiQXV0b21hdGljRXhwZXJpbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldEF1dG9tYXRpY0V4cGVyaW1lbnRfQmFzZVNjZW5hcmlvKCksIHRoZVNjZW5hcmlvUGFja2FnZS5nZXRTY2VuYXJpbygpLCBudWxsLCAiYmFzZVNjZW5hcmlvIiwgbnVsbCwgMSwgMSwgQXV0b21hdGljRXhwZXJpbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldEF1dG9tYXRpY0V4cGVyaW1lbnRfUGFyYW1ldGVycygpLCB0aGlzLmdldE1vZGlmaWFibGVQYXJhbWV0ZXIoKSwgbnVsbCwgInBhcmFtZXRlcnMiLCBudWxsLCAxLCAtMSwgQXV0b21hdGljRXhwZXJpbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFQXR0cmlidXRlKGdldEF1dG9tYXRpY0V4cGVyaW1lbnRfRXJyb3JBbmFseXNpc0FsZ29yaXRobSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXJyb3JBbmFseXNpc0FsZ29yaXRobSIsIG51bGwsIDEsIDEsIEF1dG9tYXRpY0V4cGVyaW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRvbWF0aWNFeHBlcmltZW50X0Vycm9yRnVuY3Rpb24oKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVycm9yRnVuY3Rpb24iLCBudWxsLCAxLCAxLCBBdXRvbWF0aWNFeHBlcmltZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXV0b21hdGljRXhwZXJpbWVudF9Ub2xlcmFuY2UoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInRvbGVyYW5jZSIsIG51bGwsIDEsIDEsIEF1dG9tYXRpY0V4cGVyaW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRvbWF0aWNFeHBlcmltZW50X1JlZmVyYW5jZURhdGFEaXIoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlZmVyYW5jZURhdGFEaXIiLCBudWxsLCAxLCAxLCBBdXRvbWF0aWNFeHBlcmltZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXV0b21hdGljRXhwZXJpbWVudF9NYXhpbXVtTnVtYmVyT2ZJdGVyYXRpb25zKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAibWF4aW11bU51bWJlck9mSXRlcmF0aW9ucyIsIG51bGwsIDEsIDEsIEF1dG9tYXRpY0V4cGVyaW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRvbWF0aWNFeHBlcmltZW50X1JlSW5pdCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInJlSW5pdCIsIG51bGwsIDEsIDEsIEF1dG9tYXRpY0V4cGVyaW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorDQorCQlpbml0RUNsYXNzKG1vZGlmaWFibGVQYXJhbWV0ZXJFQ2xhc3MsIE1vZGlmaWFibGVQYXJhbWV0ZXIuY2xhc3MsICJNb2RpZmlhYmxlUGFyYW1ldGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kaWZpYWJsZVBhcmFtZXRlcl9Jbml0aWFsVmFsdWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImluaXRpYWxWYWx1ZSIsIG51bGwsIDEsIDEsIE1vZGlmaWFibGVQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRNb2RpZmlhYmxlUGFyYW1ldGVyX0ZlYXR1cmUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLCBudWxsLCAiZmVhdHVyZSIsIG51bGwsIDEsIDEsIE1vZGlmaWFibGVQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRNb2RpZmlhYmxlUGFyYW1ldGVyX1N0ZXAoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInN0ZXAiLCBudWxsLCAxLCAxLCBNb2RpZmlhYmxlUGFyYW1ldGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kaWZpYWJsZVBhcmFtZXRlcl9GZWF0dXJlTmFtZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmVhdHVyZU5hbWUiLCBudWxsLCAxLCAxLCBNb2RpZmlhYmxlUGFyYW1ldGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kaWZpYWJsZVBhcmFtZXRlcl9Mb3dlckJvdW5kKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJsb3dlckJvdW5kIiwgIi0xIiwgMCwgMSwgTW9kaWZpYWJsZVBhcmFtZXRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFQXR0cmlidXRlKGdldE1vZGlmaWFibGVQYXJhbWV0ZXJfVXBwZXJCb3VuZCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAidXBwZXJCb3VuZCIsICItMSIsIDAsIDEsIE1vZGlmaWFibGVQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRNb2RpZmlhYmxlUGFyYW1ldGVyX1RhcmdldFVSSSgpLCB0aGVDb21tb25QYWNrYWdlLmdldFVSSSgpLCAidGFyZ2V0VVJJIiwgbnVsbCwgMCwgMSwgTW9kaWZpYWJsZVBhcmFtZXRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisNCisJCS8vIENyZWF0ZSByZXNvdXJjZQ0KKwkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7DQorCX0NCisNCit9IC8vQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2VJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9hdXRvbWF0aWNleHBlcmltZW50L2ltcGwvTW9kaWZpYWJsZVBhcmFtZXRlckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9pbXBsL01vZGlmaWFibGVQYXJhbWV0ZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2MGQ4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9pbXBsL01vZGlmaWFibGVQYXJhbWV0ZXJJbXBsLmphdmEKQEAgLTAsMCArMSw1MDMgQEAKK3BhY2thZ2UgYXV0b21hdGljZXhwZXJpbWVudC5pbXBsOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsNCisNCitpbXBvcnQgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNleHBlcmltZW50UGFja2FnZTsNCitpbXBvcnQgYXV0b21hdGljZXhwZXJpbWVudC5Nb2RpZmlhYmxlUGFyYW1ldGVyOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1vZGlmaWFibGUgUGFyYW1ldGVyPC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuaW1wbC5Nb2RpZmlhYmxlUGFyYW1ldGVySW1wbCNnZXRJbml0aWFsVmFsdWUgPGVtPkluaXRpYWwgVmFsdWU8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBhdXRvbWF0aWNleHBlcmltZW50LmltcGwuTW9kaWZpYWJsZVBhcmFtZXRlckltcGwjZ2V0RmVhdHVyZSA8ZW0+RmVhdHVyZTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuaW1wbC5Nb2RpZmlhYmxlUGFyYW1ldGVySW1wbCNnZXRTdGVwIDxlbT5TdGVwPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5pbXBsLk1vZGlmaWFibGVQYXJhbWV0ZXJJbXBsI2dldEZlYXR1cmVOYW1lIDxlbT5GZWF0dXJlIE5hbWU8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBhdXRvbWF0aWNleHBlcmltZW50LmltcGwuTW9kaWZpYWJsZVBhcmFtZXRlckltcGwjZ2V0TG93ZXJCb3VuZCA8ZW0+TG93ZXIgQm91bmQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBhdXRvbWF0aWNleHBlcmltZW50LmltcGwuTW9kaWZpYWJsZVBhcmFtZXRlckltcGwjZ2V0VXBwZXJCb3VuZCA8ZW0+VXBwZXIgQm91bmQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBhdXRvbWF0aWNleHBlcmltZW50LmltcGwuTW9kaWZpYWJsZVBhcmFtZXRlckltcGwjZ2V0VGFyZ2V0VVJJIDxlbT5UYXJnZXQgVVJJPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTW9kaWZpYWJsZVBhcmFtZXRlckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1vZGlmaWFibGVQYXJhbWV0ZXIgew0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxWYWx1ZSgpIDxlbT5Jbml0aWFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRJbml0aWFsVmFsdWUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBJTklUSUFMX1ZBTFVFX0VERUZBVUxUID0gMC4wOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbFZhbHVlKCkgPGVtPkluaXRpYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldEluaXRpYWxWYWx1ZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBkb3VibGUgaW5pdGlhbFZhbHVlID0gSU5JVElBTF9WQUxVRV9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZlYXR1cmUoKSA8ZW0+RmVhdHVyZTwvZW0+fScgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0RmVhdHVyZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGVwKCkgPGVtPlN0ZXA8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFN0ZXAoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBTVEVQX0VERUZBVUxUID0gMC4wOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RlcCgpIDxlbT5TdGVwPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRTdGVwKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGRvdWJsZSBzdGVwID0gU1RFUF9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGZWF0dXJlTmFtZSgpIDxlbT5GZWF0dXJlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldEZlYXR1cmVOYW1lKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9OQU1FX0VERUZBVUxUID0gbnVsbDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZlYXR1cmVOYW1lKCkgPGVtPkZlYXR1cmUgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0RmVhdHVyZU5hbWUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGZlYXR1cmVOYW1lID0gRkVBVFVSRV9OQU1FX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvd2VyQm91bmQoKSA8ZW0+TG93ZXIgQm91bmQ8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldExvd2VyQm91bmQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBMT1dFUl9CT1VORF9FREVGQVVMVCA9IC0xLjA7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb3dlckJvdW5kKCkgPGVtPkxvd2VyIEJvdW5kPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRMb3dlckJvdW5kKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGRvdWJsZSBsb3dlckJvdW5kID0gTE9XRVJfQk9VTkRfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXBwZXJCb3VuZCgpIDxlbT5VcHBlciBCb3VuZDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VXBwZXJCb3VuZCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFVQUEVSX0JPVU5EX0VERUZBVUxUID0gLTEuMDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVwcGVyQm91bmQoKSA8ZW0+VXBwZXIgQm91bmQ8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFVwcGVyQm91bmQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgZG91YmxlIHVwcGVyQm91bmQgPSBVUFBFUl9CT1VORF9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRVUkkoKSA8ZW0+VGFyZ2V0IFVSSTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VGFyZ2V0VVJJKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgVEFSR0VUX1VSSV9FREVGQVVMVCA9IG51bGw7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRVUkkoKSA8ZW0+VGFyZ2V0IFVSSTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VGFyZ2V0VVJJKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFVSSSB0YXJnZXRVUkkgPSBUQVJHRVRfVVJJX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNb2RpZmlhYmxlUGFyYW1ldGVySW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQorCQlyZXR1cm4gQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTGl0ZXJhbHMuTU9ESUZJQUJMRV9QQVJBTUVURVI7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgZG91YmxlIGdldEluaXRpYWxWYWx1ZSgpIHsNCisJCXJldHVybiBpbml0aWFsVmFsdWU7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRJbml0aWFsVmFsdWUoZG91YmxlIG5ld0luaXRpYWxWYWx1ZSkgew0KKwkJZG91YmxlIG9sZEluaXRpYWxWYWx1ZSA9IGluaXRpYWxWYWx1ZTsNCisJCWluaXRpYWxWYWx1ZSA9IG5ld0luaXRpYWxWYWx1ZTsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5NT0RJRklBQkxFX1BBUkFNRVRFUl9fSU5JVElBTF9WQUxVRSwgb2xkSW5pdGlhbFZhbHVlLCBpbml0aWFsVmFsdWUpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsNCisJCWlmIChmZWF0dXJlICE9IG51bGwgJiYgZmVhdHVyZS5lSXNQcm94eSgpKSB7DQorCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEZlYXR1cmUgPSAoSW50ZXJuYWxFT2JqZWN0KWZlYXR1cmU7DQorCQkJZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpZVJlc29sdmVQcm94eShvbGRGZWF0dXJlKTsNCisJCQlpZiAoZmVhdHVyZSAhPSBvbGRGZWF0dXJlKSB7DQorCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5NT0RJRklBQkxFX1BBUkFNRVRFUl9fRkVBVFVSRSwgb2xkRmVhdHVyZSwgZmVhdHVyZSkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBmZWF0dXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBiYXNpY0dldEZlYXR1cmUoKSB7DQorCQlyZXR1cm4gZmVhdHVyZTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG5ld0ZlYXR1cmUpIHsNCisJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBvbGRGZWF0dXJlID0gZmVhdHVyZTsNCisJCWZlYXR1cmUgPSBuZXdGZWF0dXJlOw0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLk1PRElGSUFCTEVfUEFSQU1FVEVSX19GRUFUVVJFLCBvbGRGZWF0dXJlLCBmZWF0dXJlKSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgZG91YmxlIGdldFN0ZXAoKSB7DQorCQlyZXR1cm4gc3RlcDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFN0ZXAoZG91YmxlIG5ld1N0ZXApIHsNCisJCWRvdWJsZSBvbGRTdGVwID0gc3RlcDsNCisJCXN0ZXAgPSBuZXdTdGVwOw0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLk1PRElGSUFCTEVfUEFSQU1FVEVSX19TVEVQLCBvbGRTdGVwLCBzdGVwKSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVOYW1lKCkgew0KKwkJcmV0dXJuIGZlYXR1cmVOYW1lOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0RmVhdHVyZU5hbWUoU3RyaW5nIG5ld0ZlYXR1cmVOYW1lKSB7DQorCQlTdHJpbmcgb2xkRmVhdHVyZU5hbWUgPSBmZWF0dXJlTmFtZTsNCisJCWZlYXR1cmVOYW1lID0gbmV3RmVhdHVyZU5hbWU7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX0ZFQVRVUkVfTkFNRSwgb2xkRmVhdHVyZU5hbWUsIGZlYXR1cmVOYW1lKSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgZG91YmxlIGdldExvd2VyQm91bmQoKSB7DQorCQlyZXR1cm4gbG93ZXJCb3VuZDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExvd2VyQm91bmQoZG91YmxlIG5ld0xvd2VyQm91bmQpIHsNCisJCWRvdWJsZSBvbGRMb3dlckJvdW5kID0gbG93ZXJCb3VuZDsNCisJCWxvd2VyQm91bmQgPSBuZXdMb3dlckJvdW5kOw0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLk1PRElGSUFCTEVfUEFSQU1FVEVSX19MT1dFUl9CT1VORCwgb2xkTG93ZXJCb3VuZCwgbG93ZXJCb3VuZCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGRvdWJsZSBnZXRVcHBlckJvdW5kKCkgew0KKwkJcmV0dXJuIHVwcGVyQm91bmQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRVcHBlckJvdW5kKGRvdWJsZSBuZXdVcHBlckJvdW5kKSB7DQorCQlkb3VibGUgb2xkVXBwZXJCb3VuZCA9IHVwcGVyQm91bmQ7DQorCQl1cHBlckJvdW5kID0gbmV3VXBwZXJCb3VuZDsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5NT0RJRklBQkxFX1BBUkFNRVRFUl9fVVBQRVJfQk9VTkQsIG9sZFVwcGVyQm91bmQsIHVwcGVyQm91bmQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBVUkkgZ2V0VGFyZ2V0VVJJKCkgew0KKwkJcmV0dXJuIHRhcmdldFVSSTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFRhcmdldFVSSShVUkkgbmV3VGFyZ2V0VVJJKSB7DQorCQlVUkkgb2xkVGFyZ2V0VVJJID0gdGFyZ2V0VVJJOw0KKwkJdGFyZ2V0VVJJID0gbmV3VGFyZ2V0VVJJOw0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLk1PRElGSUFCTEVfUEFSQU1FVEVSX19UQVJHRVRfVVJJLCBvbGRUYXJnZXRVUkksIHRhcmdldFVSSSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5NT0RJRklBQkxFX1BBUkFNRVRFUl9fSU5JVElBTF9WQUxVRToNCisJCQkJcmV0dXJuIGdldEluaXRpYWxWYWx1ZSgpOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX0ZFQVRVUkU6DQorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RmVhdHVyZSgpOw0KKwkJCQlyZXR1cm4gYmFzaWNHZXRGZWF0dXJlKCk7DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5NT0RJRklBQkxFX1BBUkFNRVRFUl9fU1RFUDoNCisJCQkJcmV0dXJuIGdldFN0ZXAoKTsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLk1PRElGSUFCTEVfUEFSQU1FVEVSX19GRUFUVVJFX05BTUU6DQorCQkJCXJldHVybiBnZXRGZWF0dXJlTmFtZSgpOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX0xPV0VSX0JPVU5EOg0KKwkJCQlyZXR1cm4gZ2V0TG93ZXJCb3VuZCgpOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX1VQUEVSX0JPVU5EOg0KKwkJCQlyZXR1cm4gZ2V0VXBwZXJCb3VuZCgpOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX1RBUkdFVF9VUkk6DQorCQkJCXJldHVybiBnZXRUYXJnZXRVUkkoKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX0lOSVRJQUxfVkFMVUU6DQorCQkJCXNldEluaXRpYWxWYWx1ZSgoRG91YmxlKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX0ZFQVRVUkU6DQorCQkJCXNldEZlYXR1cmUoKEVTdHJ1Y3R1cmFsRmVhdHVyZSluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLk1PRElGSUFCTEVfUEFSQU1FVEVSX19TVEVQOg0KKwkJCQlzZXRTdGVwKChEb3VibGUpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5NT0RJRklBQkxFX1BBUkFNRVRFUl9fRkVBVFVSRV9OQU1FOg0KKwkJCQlzZXRGZWF0dXJlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX0xPV0VSX0JPVU5EOg0KKwkJCQlzZXRMb3dlckJvdW5kKChEb3VibGUpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5NT0RJRklBQkxFX1BBUkFNRVRFUl9fVVBQRVJfQk9VTkQ6DQorCQkJCXNldFVwcGVyQm91bmQoKERvdWJsZSluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLk1PRElGSUFCTEVfUEFSQU1FVEVSX19UQVJHRVRfVVJJOg0KKwkJCQlzZXRUYXJnZXRVUkkoKFVSSSluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5NT0RJRklBQkxFX1BBUkFNRVRFUl9fSU5JVElBTF9WQUxVRToNCisJCQkJc2V0SW5pdGlhbFZhbHVlKElOSVRJQUxfVkFMVUVfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5NT0RJRklBQkxFX1BBUkFNRVRFUl9fRkVBVFVSRToNCisJCQkJc2V0RmVhdHVyZSgoRVN0cnVjdHVyYWxGZWF0dXJlKW51bGwpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5NT0RJRklBQkxFX1BBUkFNRVRFUl9fU1RFUDoNCisJCQkJc2V0U3RlcChTVEVQX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX0ZFQVRVUkVfTkFNRToNCisJCQkJc2V0RmVhdHVyZU5hbWUoRkVBVFVSRV9OQU1FX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX0xPV0VSX0JPVU5EOg0KKwkJCQlzZXRMb3dlckJvdW5kKExPV0VSX0JPVU5EX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX1VQUEVSX0JPVU5EOg0KKwkJCQlzZXRVcHBlckJvdW5kKFVQUEVSX0JPVU5EX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX1RBUkdFVF9VUkk6DQorCQkJCXNldFRhcmdldFVSSShUQVJHRVRfVVJJX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5NT0RJRklBQkxFX1BBUkFNRVRFUl9fSU5JVElBTF9WQUxVRToNCisJCQkJcmV0dXJuIGluaXRpYWxWYWx1ZSAhPSBJTklUSUFMX1ZBTFVFX0VERUZBVUxUOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX0ZFQVRVUkU6DQorCQkJCXJldHVybiBmZWF0dXJlICE9IG51bGw7DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5NT0RJRklBQkxFX1BBUkFNRVRFUl9fU1RFUDoNCisJCQkJcmV0dXJuIHN0ZXAgIT0gU1RFUF9FREVGQVVMVDsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLk1PRElGSUFCTEVfUEFSQU1FVEVSX19GRUFUVVJFX05BTUU6DQorCQkJCXJldHVybiBGRUFUVVJFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGZlYXR1cmVOYW1lICE9IG51bGwgOiAhRkVBVFVSRV9OQU1FX0VERUZBVUxULmVxdWFscyhmZWF0dXJlTmFtZSk7DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5NT0RJRklBQkxFX1BBUkFNRVRFUl9fTE9XRVJfQk9VTkQ6DQorCQkJCXJldHVybiBsb3dlckJvdW5kICE9IExPV0VSX0JPVU5EX0VERUZBVUxUOw0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX1VQUEVSX0JPVU5EOg0KKwkJCQlyZXR1cm4gdXBwZXJCb3VuZCAhPSBVUFBFUl9CT1VORF9FREVGQVVMVDsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLk1PRElGSUFCTEVfUEFSQU1FVEVSX19UQVJHRVRfVVJJOg0KKwkJCQlyZXR1cm4gVEFSR0VUX1VSSV9FREVGQVVMVCA9PSBudWxsID8gdGFyZ2V0VVJJICE9IG51bGwgOiAhVEFSR0VUX1VSSV9FREVGQVVMVC5lcXVhbHModGFyZ2V0VVJJKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOw0KKw0KKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7DQorCQlyZXN1bHQuYXBwZW5kKCIgKGluaXRpYWxWYWx1ZTogIik7DQorCQlyZXN1bHQuYXBwZW5kKGluaXRpYWxWYWx1ZSk7DQorCQlyZXN1bHQuYXBwZW5kKCIsIHN0ZXA6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChzdGVwKTsNCisJCXJlc3VsdC5hcHBlbmQoIiwgZmVhdHVyZU5hbWU6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChmZWF0dXJlTmFtZSk7DQorCQlyZXN1bHQuYXBwZW5kKCIsIGxvd2VyQm91bmQ6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChsb3dlckJvdW5kKTsNCisJCXJlc3VsdC5hcHBlbmQoIiwgdXBwZXJCb3VuZDogIik7DQorCQlyZXN1bHQuYXBwZW5kKHVwcGVyQm91bmQpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCB0YXJnZXRVUkk6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZCh0YXJnZXRVUkkpOw0KKwkJcmVzdWx0LmFwcGVuZCgnKScpOw0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKwl9DQorDQorfSAvL01vZGlmaWFibGVQYXJhbWV0ZXJJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9hdXRvbWF0aWNleHBlcmltZW50L3ByZXNlbnRhdGlvbi9BdXRvbWF0aWNleHBlcmltZW50QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9wcmVzZW50YXRpb24vQXV0b21hdGljZXhwZXJpbWVudEFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzYjkxNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9wcmVzZW50YXRpb24vQXV0b21hdGljZXhwZXJpbWVudEFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKQEAgLTAsMCArMSw0MjkgQEAKK3BhY2thZ2UgYXV0b21hdGljZXhwZXJpbWVudC5wcmVzZW50YXRpb247DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbnRyb2xBY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Mb2FkUmVzb3VyY2VBY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YkNvbnRyaWJ1dGlvbkl0ZW07DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247DQorDQoraW1wb3J0IGF1dG9tYXRpY2V4cGVyaW1lbnQucHJvdmlkZXIuQXV0b21hdGljZXhwZXJpZW5jZUVkaXRQbHVnaW47DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgYWN0aW9uIGJhciBjb250cmlidXRvciBmb3IgdGhlIEF1dG9tYXRpY2V4cGVyaW1lbnQgbW9kZWwgZWRpdG9yLg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBdXRvbWF0aWNleHBlcmltZW50QWN0aW9uQmFyQ29udHJpYnV0b3INCisJZXh0ZW5kcyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3INCisJaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBlZGl0b3IuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yUGFydDsNCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHByb3ZpZGVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgYWN0aW9uIG9wZW5zIHRoZSBQcm9wZXJ0aWVzIHZpZXcuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUFjdGlvbiBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24gPQ0KKwkJbmV3IEFjdGlvbihBdXRvbWF0aWNleHBlcmllbmNlRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtIikpIHsNCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCXRyeSB7DQorCQkJCQlnZXRQYWdlKCkuc2hvd1ZpZXcoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiKTsNCisJCQkJfQ0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJCQlBdXRvbWF0aWNleHBlcmllbmNlRWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCQkJfQ0KKwkJCX0NCisJCX07DQorDQorCS8qKg0KKwkgKiBUaGlzIGFjdGlvbiByZWZyZXNoZXMgdGhlIHZpZXdlciBvZiB0aGUgY3VycmVudCBlZGl0b3IgaWYgdGhlIGVkaXRvcg0KKwkgKiBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXJ9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElBY3Rpb24gcmVmcmVzaFZpZXdlckFjdGlvbiA9DQorCQluZXcgQWN0aW9uKEF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtIikpIHsNCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7DQorCQkJCXJldHVybiBhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyOw0KKwkJCX0NCisNCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCWlmIChhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7DQorCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpYWN0aXZlRWRpdG9yUGFydCkuZ2V0Vmlld2VyKCk7DQorCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsNCisJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfTsNCisNCisJLyoqDQorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcg0KKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZUNoaWxkQWN0aW9uczsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCBmb3IgQ3JlYXRlQ2hpbGQgYWN0aW9ucy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yDQorCSAqIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlU2libGluZ0FjdGlvbnM7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZVNpYmxpbmcgYWN0aW9ucy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBjb250cmlidXRvci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBdXRvbWF0aWNleHBlcmltZW50QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7DQorCQlzdXBlcihBRERJVElPTlNfTEFTVF9TVFlMRSk7DQorCQlsb2FkUmVzb3VyY2VBY3Rpb24gPSBuZXcgTG9hZFJlc291cmNlQWN0aW9uKCk7DQorCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBWYWxpZGF0ZUFjdGlvbigpOw0KKwkJY29udHJvbEFjdGlvbiA9IG5ldyBDb250cm9sQWN0aW9uKCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBTZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zIHRvIHRoZSB0b29sIGJhci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgew0KKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImF1dG9tYXRpY2V4cGVyaW1lbnQtc2V0dGluZ3MiKSk7DQorCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYXV0b21hdGljZXhwZXJpbWVudC1hZGRpdGlvbnMiKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB0byB0aGUgbWVudSBiYXIgYSBtZW51IGFuZCBzb21lIHNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMsDQorCSAqIGFzIHdlbGwgYXMgdGhlIHN1Yi1tZW51cyBmb3Igb2JqZWN0IGNyZWF0aW9uIGl0ZW1zLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7DQorCQlzdXBlci5jb250cmlidXRlVG9NZW51KG1lbnVNYW5hZ2VyKTsNCisNCisJCUlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihBdXRvbWF0aWNleHBlcmllbmNlRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9BdXRvbWF0aWNleHBlcmltZW50RWRpdG9yX21lbnUiKSwgImF1dG9tYXRpY2V4cGVyaW1lbnRNZW51SUQiKTsNCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7DQorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigic2V0dGluZ3MiKSk7DQorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWN0aW9ucyIpKTsNCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7DQorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsNCisNCisJCS8vIFByZXBhcmUgZm9yIENyZWF0ZUNoaWxkIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4NCisJCS8vDQorCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKEF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsNCisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcik7DQorDQorCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVTaWJsaW5nIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4NCisJCS8vDQorCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQXV0b21hdGljZXhwZXJpZW5jZUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7DQorCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcik7DQorDQorCQkvLyBGb3JjZSBhbiB1cGRhdGUgYmVjYXVzZSBFY2xpcHNlIGhpZGVzIGVtcHR5IG1lbnVzIG5vdy4NCisJCS8vDQorCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXINCisJCQkobmV3IElNZW51TGlzdGVuZXIoKSB7DQorCQkJCSBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7DQorCQkJCQkgbWVudU1hbmFnZXIudXBkYXRlQWxsKHRydWUpOw0KKwkJCQkgfQ0KKwkJCSB9KTsNCisNCisJCWFkZEdsb2JhbEFjdGlvbnMoc3VibWVudU1hbmFnZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBXaGVuIHRoZSBhY3RpdmUgZWRpdG9yIGNoYW5nZXMsIHRoaXMgcmVtZW1iZXJzIHRoZSBjaGFuZ2UgYW5kIHJlZ2lzdGVycyB3aXRoIGl0IGFzIGEgc2VsZWN0aW9uIHByb3ZpZGVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBwYXJ0KSB7DQorCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IocGFydCk7DQorCQlhY3RpdmVFZGl0b3JQYXJ0ID0gcGFydDsNCisNCisJCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4NCisJCS8vDQorCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgew0KKwkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsNCisJCX0NCisJCWlmIChwYXJ0ID09IG51bGwpIHsNCisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7DQorCQl9DQorCQllbHNlIHsNCisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7DQorCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOw0KKw0KKwkJCS8vIEZha2UgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCB0byB1cGRhdGUgdGhlIG1lbnVzLg0KKwkJCS8vDQorCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpICE9IG51bGwpIHsNCisJCQkJc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNlbGVjdGlvblByb3ZpZGVyLCBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LA0KKwkgKiBoYW5kbGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnR9cyBieSBxdWVyeWluZyBmb3IgdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncw0KKwkgKiB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZCB1cGRhdGluZyB0aGUgbWVudXMgYWNjb3JkaW5nbHkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgew0KKwkJLy8gUmVtb3ZlIGFueSBtZW51IGl0ZW1zIGZvciBvbGQgc2VsZWN0aW9uLg0KKwkJLy8NCisJCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsNCisJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7DQorCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucyk7DQorCQl9DQorDQorCQkvLyBRdWVyeSB0aGUgbmV3IHNlbGVjdGlvbiBmb3IgYXBwcm9wcmlhdGUgbmV3IGNoaWxkL3NpYmxpbmcgZGVzY3JpcHRvcnMNCisJCS8vDQorCQlDb2xsZWN0aW9uPD8+IG5ld0NoaWxkRGVzY3JpcHRvcnMgPSBudWxsOw0KKwkJQ29sbGVjdGlvbjw/PiBuZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBudWxsOw0KKw0KKwkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsNCisJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsNCisJCQlPYmplY3Qgb2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOw0KKw0KKwkJCUVkaXRpbmdEb21haW4gZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsNCisNCisJCQluZXdDaGlsZERlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMob2JqZWN0LCBudWxsKTsNCisJCQluZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhudWxsLCBvYmplY3QpOw0KKwkJfQ0KKw0KKwkJLy8gR2VuZXJhdGUgYWN0aW9ucyBmb3Igc2VsZWN0aW9uOyBwb3B1bGF0ZSBhbmQgcmVkcmF3IHRoZSBtZW51cy4NCisJCS8vDQorCQljcmVhdGVDaGlsZEFjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhuZXdDaGlsZERlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOw0KKwkJY3JlYXRlU2libGluZ0FjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKG5ld1NpYmxpbmdEZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsNCisNCisJCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsNCisJCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsNCisJCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsNCisJCX0NCisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgew0KKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsNCisJCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sDQorCSAqIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJQ29sbGVjdGlvbjxJQWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOw0KKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsNCisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsNCisJCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZUNoaWxkQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwgZGVzY3JpcHRvcikpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBhY3Rpb25zOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwNCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoQ29sbGVjdGlvbjw/PiBkZXNjcmlwdG9ycywgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsNCisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7DQorCQkJZm9yIChPYmplY3QgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7DQorCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVTaWJsaW5nQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwgZGVzY3JpcHRvcikpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBhY3Rpb25zOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IHdpdGgge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMNCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbiwNCisJICogYnkgaW5zZXJ0aW5nIHRoZW0gYmVmb3JlIHRoZSBzcGVjaWZpZWQgY29udHJpYnV0aW9uIGl0ZW0gPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+Lg0KKwkgKiBJZiA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZXkgYXJlIHNpbXBseSBhZGRlZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zLCBTdHJpbmcgY29udHJpYnV0aW9uSUQpIHsNCisJCWlmIChhY3Rpb25zICE9IG51bGwpIHsNCisJCQlmb3IgKElBY3Rpb24gYWN0aW9uIDogYWN0aW9ucykgew0KKwkJCQlpZiAoY29udHJpYnV0aW9uSUQgIT0gbnVsbCkgew0KKwkJCQkJbWFuYWdlci5pbnNlcnRCZWZvcmUoY29udHJpYnV0aW9uSUQsIGFjdGlvbik7DQorCQkJCX0NCisJCQkJZWxzZSB7DQorCQkJCQltYW5hZ2VyLmFkZChhY3Rpb24pOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9DQorCQkNCisJLyoqDQorCSAqIFRoaXMgcmVtb3ZlcyBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gYWxsIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zDQorCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkZXBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zKSB7DQorCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7DQorCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0SXRlbXMoKTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7DQorCQkJCS8vIExvb2sgaW50byBTdWJDb250cmlidXRpb25JdGVtcw0KKwkJCQkvLw0KKwkJCQlJQ29udHJpYnV0aW9uSXRlbSBjb250cmlidXRpb25JdGVtID0gaXRlbXNbaV07DQorCQkJCXdoaWxlIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uSXRlbSkgew0KKwkJCQkJY29udHJpYnV0aW9uSXRlbSA9ICgoU3ViQ29udHJpYnV0aW9uSXRlbSljb250cmlidXRpb25JdGVtKS5nZXRJbm5lckl0ZW0oKTsNCisJCQkJfQ0KKw0KKwkJCQkvLyBEZWxldGUgdGhlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1zIHdpdGggbWF0Y2hpbmcgYWN0aW9uLg0KKwkJCQkvLw0KKwkJCQlpZiAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsNCisJCQkJCUlBY3Rpb24gYWN0aW9uID0gKChBY3Rpb25Db250cmlidXRpb25JdGVtKWNvbnRyaWJ1dGlvbkl0ZW0pLmdldEFjdGlvbigpOw0KKwkJCQkJaWYgKGFjdGlvbnMuY29udGFpbnMoYWN0aW9uKSkgew0KKwkJCQkJCW1hbmFnZXIucmVtb3ZlKGNvbnRyaWJ1dGlvbkl0ZW0pOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgcG9wLXVwIG1lbnUgYmVmb3JlIGl0IGFwcGVhcnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgew0KKwkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsNCisJCU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbnVsbDsNCisNCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKEF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsNCisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsNCisJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZWRpdCIsIHN1Ym1lbnVNYW5hZ2VyKTsNCisNCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKEF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOw0KKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7DQorCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW5zZXJ0cyBnbG9iYWwgYWN0aW9ucyBiZWZvcmUgdGhlICJhZGRpdGlvbnMtZW5kIiBzZXBhcmF0b3IuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsNCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMtZW5kIiwgbmV3IFNlcGFyYXRvcigidWktYWN0aW9ucyIpKTsNCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uKTsNCisNCisJCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsJCQ0KKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCByZWZyZXNoVmlld2VyQWN0aW9uKTsNCisNCisJCXN1cGVyLmFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGVuc3VyZXMgdGhhdCBhIGRlbGV0ZSBhY3Rpb24gd2lsbCBjbGVhbiB1cCBhbGwgcmVmZXJlbmNlcyB0byBkZWxldGVkIG9iamVjdHMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlQWxsUmVmZXJlbmNlc09uRGVsZXRlKCkgew0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9hdXRvbWF0aWNleHBlcmltZW50L3ByZXNlbnRhdGlvbi9BdXRvbWF0aWNleHBlcmltZW50RWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL2F1dG9tYXRpY2V4cGVyaW1lbnQvcHJlc2VudGF0aW9uL0F1dG9tYXRpY2V4cGVyaW1lbnRFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmVlYTlhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9hdXRvbWF0aWNleHBlcmltZW50L3ByZXNlbnRhdGlvbi9BdXRvbWF0aWNleHBlcmltZW50RWRpdG9yLmphdmEKQEAgLTAsMCArMSwxNTI3IEBACitwYWNrYWdlIGF1dG9tYXRpY2V4cGVyaW1lbnQucHJlc2VudGF0aW9uOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5lZGl0b3IuUHJvYmxlbUVkaXRvclBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuY2VsbGVkaXRvci5BZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5Mb2NhbFRyYW5zZmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuVmlld2VyRHJhZ0FkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLlVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlNYXJrZXJIZWxwZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJVXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudmlldy5FeHRlbmRlZFByb3BlcnR5U2hlZXRQYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLkdyYXBoSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcm92aWRlci5Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXIuTW9kaWZpZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLnByb3ZpZGVyLlNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIucHJvdmlkZXIuU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIucHJvdmlkZXIuU29sdmVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNhdmVBc0RpYWxvZzsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVQYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOw0KKw0KK2ltcG9ydCBhdXRvbWF0aWNleHBlcmltZW50LnByb3ZpZGVyLkF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luOw0KK2ltcG9ydCBhdXRvbWF0aWNleHBlcmltZW50LnByb3ZpZGVyLkF1dG9tYXRpY2V4cGVyaW1lbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCisNCisNCisvKioNCisgKiBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBBdXRvbWF0aWNleHBlcmltZW50IG1vZGVsIGVkaXRvci4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQXV0b21hdGljZXhwZXJpbWVudEVkaXRvcg0KKwlleHRlbmRzIE11bHRpUGFnZUVkaXRvclBhcnQNCisJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpblByb3ZpZGVyLCBJU2VsZWN0aW9uUHJvdmlkZXIsIElNZW51TGlzdGVuZXIsIElWaWV3ZXJQcm92aWRlciwgSUdvdG9NYXJrZXIgew0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgZWRpdGluZyBkb21haW4gdGhhdCBpcyB1c2VkIHRvIHRyYWNrIGFsbCBjaGFuZ2VzIHRvIHRoZSBtb2RlbC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIG9uZSBhZGFwdGVyIGZhY3RvcnkgdXNlZCBmb3IgcHJvdmlkaW5nIHZpZXdzIG9mIHRoZSBtb2RlbC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5Ow0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUNvbnRlbnRPdXRsaW5lUGFnZSBjb250ZW50T3V0bGluZVBhZ2U7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIGEga2x1ZGdlLi4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVN0YXR1c0xpbmVNYW5hZ2VyIGNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZSdzIHZpZXdlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBUcmVlVmlld2VyIGNvbnRlbnRPdXRsaW5lVmlld2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgcHJvcGVydHkgc2hlZXQgcGFnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBQcm9wZXJ0eVNoZWV0UGFnZSBwcm9wZXJ0eVNoZWV0UGFnZTsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIHZpZXdlciB0aGF0IHNoYWRvd3MgdGhlIHNlbGVjdGlvbiBpbiB0aGUgY29udGVudCBvdXRsaW5lLg0KKwkgKiBUaGUgcGFyZW50IHJlbGF0aW9uIG11c3QgYmUgY29ycmVjdGx5IGRlZmluZWQgZm9yIHRoaXMgdG8gd29yay4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBUcmVlVmlld2VyIHNlbGVjdGlvblZpZXdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBjb250ZW50IHZpZXdlciwgd2hpY2ggbWF5IGJlIGVpdGhlciBvbmUgb2YgdGhlIHZpZXdlcnMgaW4gdGhlIHBhZ2VzIG9yIHRoZSBjb250ZW50IG91dGxpbmUgdmlld2VyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFZpZXdlciBjdXJyZW50Vmlld2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBsaXN0ZW5zIHRvIHdoaWNoIGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsNCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfXMgdGhhdCBhcmUgbGlzdGVuaW5nIHRvIHRoaXMgZWRpdG9yLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsNCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZWRpdG9yIGFzIGEgd2hvbGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBlZGl0b3JTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOw0KKw0KKwkvKioNCisJICogVGhlIE1hcmtlckhlbHBlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgd29ya3NwYWNlIHJlc291cmNlIG1hcmtlcnMgcHJlc2VudGVkDQorCSAqIGluIEVjbGlwc2UncyBQcm9ibGVtcyBWaWV3Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE1hcmtlckhlbHBlciBtYXJrZXJIZWxwZXIgPSBuZXcgRWRpdFVJTWFya2VySGVscGVyKCk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdoZW4gdGhlIG91dGxpbmUgYmVjb21lcyBhY3RpdmUNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9DQorCQluZXcgSVBhcnRMaXN0ZW5lcigpIHsNCisJCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsNCisJCQkJaWYgKHAgaW5zdGFuY2VvZiBDb250ZW50T3V0bGluZSkgew0KKwkJCQkJaWYgKCgoQ29udGVudE91dGxpbmUpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBjb250ZW50T3V0bGluZVBhZ2UpIHsNCisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihBdXRvbWF0aWNleHBlcmltZW50RWRpdG9yLnRoaXMpOw0KKw0KKwkJCQkJCXNldEN1cnJlbnRWaWV3ZXIoY29udGVudE91dGxpbmVWaWV3ZXIpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWVsc2UgaWYgKHAgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSB7DQorCQkJCQlpZiAoKChQcm9wZXJ0eVNoZWV0KXApLmdldEN1cnJlbnRQYWdlKCkgPT0gcHJvcGVydHlTaGVldFBhZ2UpIHsNCisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihBdXRvbWF0aWNleHBlcmltZW50RWRpdG9yLnRoaXMpOw0KKwkJCQkJCWhhbmRsZUFjdGl2YXRlKCk7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZWxzZSBpZiAocCA9PSBBdXRvbWF0aWNleHBlcmltZW50RWRpdG9yLnRoaXMpIHsNCisJCQkJCWhhbmRsZUFjdGl2YXRlKCk7DQorCQkJCX0NCisJCQl9DQorCQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwKSB7DQorCQkJCS8vIElnbm9yZS4NCisJCQl9DQorCQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwKSB7DQorCQkJCS8vIElnbm9yZS4NCisJCQl9DQorCQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsNCisJCQkJLy8gSWdub3JlLg0KKwkJCX0NCisJCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHApIHsNCisJCQkJLy8gSWdub3JlLg0KKwkJCX0NCisJCX07DQorDQorCS8qKg0KKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7DQorDQorCS8qKg0KKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7DQorDQorCS8qKg0KKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gc2F2ZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gc2F2ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOw0KKw0KKwkvKioNCisJICogTWFwIHRvIHN0b3JlIHRoZSBkaWFnbm9zdGljIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4gcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4oKTsNCisNCisJLyoqDQorCSAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiBzaG91bGQgYmUgdXBkYXRlZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsNCisNCisJLyoqDQorCSAqIEFkYXB0ZXIgdXNlZCB0byB1cGRhdGUgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiB3aGVuIHJlc291cmNlcyBhcmUgZGVtYW5kZWQgbG9hZGVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVDb250ZW50QWRhcHRlciBwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIgPSANCisJCW5ldyBFQ29udGVudEFkYXB0ZXIoKSB7DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7DQorCQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVzb3VyY2UuY2xhc3MpKSB7DQorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEOg0KKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0VSUk9SUzoNCisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19XQVJOSU5HUzogew0KKwkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsNCisJCQkJCQkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIG51bGwpOw0KKwkJCQkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsNCisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgZGlhZ25vc3RpYyk7DQorCQkJCQkJCX0NCisJCQkJCQkJZWxzZSB7DQorCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5yZW1vdmUocmVzb3VyY2UpOw0KKwkJCQkJCQl9DQorDQorCQkJCQkJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgew0KKwkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYw0KKwkJCQkJCQkJCShuZXcgUnVubmFibGUoKSB7DQorCQkJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsNCisJCQkJCQkJCQkJIH0NCisJCQkJCQkJCQkgfSk7DQorCQkJCQkJCX0NCisJCQkJCQkJYnJlYWs7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWVsc2Ugew0KKwkJCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJCUBPdmVycmlkZQ0KKwkJCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsNCisJCQkJYmFzaWNTZXRUYXJnZXQodGFyZ2V0KTsNCisJCQl9DQorDQorCQkJQE92ZXJyaWRlDQorCQkJcHJvdGVjdGVkIHZvaWQgdW5zZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7DQorCQkJCWJhc2ljVW5zZXRUYXJnZXQodGFyZ2V0KTsNCisJCQl9DQorCQl9Ow0KKw0KKwkvKioNCisJICogVGhpcyBsaXN0ZW5zIGZvciB3b3Jrc3BhY2UgY2hhbmdlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0NCisJCW5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsNCisJCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsNCisJCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOw0KKwkJCQl0cnkgew0KKwkJCQkJY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3Igew0KKwkJCQkJCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsNCisJCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7DQorCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOw0KKw0KKwkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7DQorCQkJCQkJCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgew0KKwkJCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIHx8DQorCQkJCQkJCQkgICAgZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgZGVsdGEuZ2V0RmxhZ3MoKSAhPSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSB7DQorCQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShkZWx0YS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpLCBmYWxzZSk7DQorCQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsNCisJCQkJCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7DQorCQkJCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7DQorCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJZWxzZSBpZiAoIXNhdmVkUmVzb3VyY2VzLnJlbW92ZShyZXNvdXJjZSkpIHsNCisJCQkJCQkJCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsNCisJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCX0NCisJCQkJCQkJCX0NCisJCQkJCQkJfQ0KKw0KKwkJCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJCQl9DQorDQorCQkJCQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldENoYW5nZWRSZXNvdXJjZXMoKSB7DQorCQkJCQkJCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOw0KKwkJCQkJCX0NCisNCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsNCisJCQkJCQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKw0KKwkJCQkJZmluYWwgUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOw0KKwkJCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOw0KKw0KKwkJCQkJaWYgKCF2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsNCisJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjDQorCQkJCQkJCShuZXcgUnVubmFibGUoKSB7DQorCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCSByZW1vdmVkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKSk7DQorCQkJCQkJCQkJIGlmICghaXNEaXJ0eSgpKSB7DQorCQkJCQkJCQkJCSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKEF1dG9tYXRpY2V4cGVyaW1lbnRFZGl0b3IudGhpcywgZmFsc2UpOw0KKwkJCQkJCQkJCSB9DQorCQkJCQkJCQkgfQ0KKwkJCQkJCQkgfSk7DQorCQkJCQl9DQorDQorCQkJCQlpZiAoIXZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgew0KKwkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMNCisJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsNCisJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJIGNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsNCisJCQkJCQkJCQkgaWYgKGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gQXV0b21hdGljZXhwZXJpbWVudEVkaXRvci50aGlzKSB7DQorCQkJCQkJCQkJCSBoYW5kbGVBY3RpdmF0ZSgpOw0KKwkJCQkJCQkJCSB9DQorCQkJCQkJCQkgfQ0KKwkJCQkJCQkgfSk7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJCQlBdXRvbWF0aWNleHBlcmllbmNlRWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCQkJfQ0KKwkJCX0NCisJCX07DQorDQorCS8qKg0KKwkgKiBIYW5kbGVzIGFjdGl2YXRpb24gb2YgdGhlIGVkaXRvciBvciBpdCdzIGFzc29jaWF0ZWQgdmlld3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0ZSgpIHsNCisJCS8vIFJlY29tcHV0ZSB0aGUgcmVhZCBvbmx5IHN0YXRlLg0KKwkJLy8NCisJCWlmIChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpICE9IG51bGwpIHsNCisJCSAgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKS5jbGVhcigpOw0KKw0KKwkJICAvLyBSZWZyZXNoIGFueSBhY3Rpb25zIHRoYXQgbWF5IGJlY29tZSBlbmFibGVkIG9yIGRpc2FibGVkLg0KKwkJICAvLw0KKwkJICBzZXRTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpOw0KKwkJfQ0KKw0KKwkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgew0KKwkJCWlmIChoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpIHsNCisJCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihBdXRvbWF0aWNleHBlcmltZW50RWRpdG9yLnRoaXMsIGZhbHNlKTsNCisJCQl9DQorCQkJZWxzZSB7DQorCQkJCXJlbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsNCisJCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOw0KKwkJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOw0KKwkJCX0NCisJCX0NCisJCWVsc2UgaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgew0KKwkJCWNoYW5nZWRSZXNvdXJjZXMucmVtb3ZlQWxsKHNhdmVkUmVzb3VyY2VzKTsNCisJCQloYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCk7DQorCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOw0KKwkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEhhbmRsZXMgd2hhdCB0byBkbyB3aXRoIGNoYW5nZWQgcmVzb3VyY2VzIG9uIGFjdGl2YXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCkgew0KKwkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSAmJiAoIWlzRGlydHkoKSB8fCBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpKSB7DQorCQkJaWYgKGlzRGlydHkoKSkgew0KKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpOw0KKwkJCX0NCisJCQllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7DQorDQorCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsNCisJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgew0KKwkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgew0KKwkJCQkJcmVzb3VyY2UudW5sb2FkKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsNCisJCQkJCX0NCisJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCQlpZiAoIXJlc291cmNlVG9EaWFnbm9zdGljTWFwLmNvbnRhaW5zS2V5KHJlc291cmNlKSkgew0KKwkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorDQorCQkJaWYgKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbi5pc1N0YWxlKGVkaXRvclNlbGVjdGlvbikpIHsNCisJCQkJc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOw0KKwkJCX0NCisNCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7DQorCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsNCisJCX0NCisJfQ0KKyAgDQorCS8qKg0KKwkgKiBVcGRhdGVzIHRoZSBwcm9ibGVtcyBpbmRpY2F0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWVkIGRpYWdub3N0aWMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpIHsNCisJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgew0KKwkJCUJhc2ljRGlhZ25vc3RpYyBkaWFnbm9zdGljID0NCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYw0KKwkJCQkJKERpYWdub3N0aWMuT0ssDQorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudCIsDQorCQkJCQkgMCwNCisJCQkJCSBudWxsLA0KKwkJCQkJIG5ldyBPYmplY3QgW10geyBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkgfSk7DQorCQkJZm9yIChEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA6IHJlc291cmNlVG9EaWFnbm9zdGljTWFwLnZhbHVlcygpKSB7DQorCQkJCWlmIChjaGlsZERpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7DQorCQkJCQlkaWFnbm9zdGljLmFkZChjaGlsZERpYWdub3N0aWMpOw0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJCWludCBsYXN0RWRpdG9yUGFnZSA9IGdldFBhZ2VDb3VudCgpIC0gMTsNCisJCQlpZiAobGFzdEVkaXRvclBhZ2UgPj0gMCAmJiBnZXRFZGl0b3IobGFzdEVkaXRvclBhZ2UpIGluc3RhbmNlb2YgUHJvYmxlbUVkaXRvclBhcnQpIHsNCisJCQkJKChQcm9ibGVtRWRpdG9yUGFydClnZXRFZGl0b3IobGFzdEVkaXRvclBhZ2UpKS5zZXREaWFnbm9zdGljKGRpYWdub3N0aWMpOw0KKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsNCisJCQkJCXNldEFjdGl2ZVBhZ2UobGFzdEVkaXRvclBhZ2UpOw0KKwkJCQl9DQorCQkJfQ0KKwkJCWVsc2UgaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7DQorCQkJCVByb2JsZW1FZGl0b3JQYXJ0IHByb2JsZW1FZGl0b3JQYXJ0ID0gbmV3IFByb2JsZW1FZGl0b3JQYXJ0KCk7DQorCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7DQorCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldE1hcmtlckhlbHBlcihtYXJrZXJIZWxwZXIpOw0KKwkJCQl0cnkgew0KKwkJCQkJYWRkUGFnZSgrK2xhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydCwgZ2V0RWRpdG9ySW5wdXQoKSk7DQorCQkJCQlzZXRQYWdlVGV4dChsYXN0RWRpdG9yUGFnZSwgcHJvYmxlbUVkaXRvclBhcnQuZ2V0UGFydE5hbWUoKSk7DQorCQkJCQlzZXRBY3RpdmVQYWdlKGxhc3RFZGl0b3JQYWdlKTsNCisJCQkJCXNob3dUYWJzKCk7DQorCQkJCX0NCisJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQkJQXV0b21hdGljZXhwZXJpZW5jZUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQkJCX0NCisJCQl9DQorDQorCQkJaWYgKG1hcmtlckhlbHBlci5oYXNNYXJrZXJzKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSkpIHsNCisJCQkJbWFya2VySGVscGVyLmRlbGV0ZU1hcmtlcnMoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsNCisJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7DQorCQkJCQl0cnkgew0KKwkJCQkJCW1hcmtlckhlbHBlci5jcmVhdGVNYXJrZXJzKGRpYWdub3N0aWMpOw0KKwkJCQkJfQ0KKwkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJCQkJQXV0b21hdGljZXhwZXJpZW5jZUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFNob3dzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkgew0KKwkJcmV0dXJuDQorCQkJTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24NCisJCQkJKGdldFNpdGUoKS5nZXRTaGVsbCgpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRmlsZUNvbmZsaWN0X2xhYmVsIiksDQorCQkJCSBnZXRTdHJpbmcoIl9XQVJOX0ZpbGVDb25mbGljdCIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGEgbW9kZWwgZWRpdG9yLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF1dG9tYXRpY2V4cGVyaW1lbnRFZGl0b3IoKSB7DQorCQlzdXBlcigpOw0KKwkJaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBzZXRzIHVwIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1vZGVsIGVkaXRvci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFZGl0aW5nRG9tYWluKCkgew0KKwkJLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlpZWxkcyBpdGVtIHByb3ZpZGVycy4NCisJCS8vDQorCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkuRGVzY3JpcHRvci5SZWdpc3RyeS5JTlNUQU5DRSk7DQorDQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBBdXRvbWF0aWNleHBlcmltZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBFY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisNCisJCS8vIENyZWF0ZSB0aGUgY29tbWFuZCBzdGFjayB0aGF0IHdpbGwgbm90aWZ5IHRoaXMgZWRpdG9yIGFzIGNvbW1hbmRzIGFyZSBleGVjdXRlZC4NCisJCS8vDQorCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsNCisNCisJCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuDQorCQkvLw0KKwkJY29tbWFuZFN0YWNrLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyDQorCQkJKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsNCisJCQkJIHB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsNCisJCQkJCSBnZXRDb250YWluZXIoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjDQorCQkJCQkJIChuZXcgUnVubmFibGUoKSB7DQorCQkJCQkJCSAgcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJICBmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7DQorDQorCQkJCQkJCQkgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuDQorCQkJCQkJCQkgIC8vDQorCQkJCQkJCQkgIENvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaylldmVudC5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsNCisJCQkJCQkJCSAgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsNCisJCQkJCQkJCQkgIHNldFNlbGVjdGlvblRvVmlld2VyKG1vc3RSZWNlbnRDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpKTsNCisJCQkJCQkJCSAgfQ0KKwkJCQkJCQkJICBpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCAmJiAhcHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgew0KKwkJCQkJCQkJCSAgcHJvcGVydHlTaGVldFBhZ2UucmVmcmVzaCgpOw0KKwkJCQkJCQkJICB9DQorCQkJCQkJCSAgfQ0KKwkJCQkJCSAgfSk7DQorCQkJCSB9DQorCQkJIH0pOw0KKw0KKwkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLg0KKwkJLy8NCisJCWVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKGFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2ssIG5ldyBIYXNoTWFwPFJlc291cmNlLCBCb29sZWFuPigpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyBoZXJlIGZvciB0aGUgbGlzdGVuZXIgdG8gYmUgYWJsZSB0byBjYWxsIGl0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJCQlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGludCBhY3Rpb24pIHsNCisJCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShhY3Rpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHNldHMgdGhlIHNlbGVjdGlvbiBpbnRvIHdoaWNoZXZlciB2aWV3ZXIgaXMgYWN0aXZlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7DQorCQlmaW5hbCBDb2xsZWN0aW9uPD8+IHRoZVNlbGVjdGlvbiA9IGNvbGxlY3Rpb247DQorCQkvLyBNYWtlIHN1cmUgaXQncyBva2F5Lg0KKwkJLy8NCisJCWlmICh0aGVTZWxlY3Rpb24gIT0gbnVsbCAmJiAhdGhlU2VsZWN0aW9uLmlzRW1wdHkoKSkgew0KKwkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0NCisJCQkJbmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGl0ZW1zIGluIHRoZSBjdXJyZW50IGNvbnRlbnQgdmlld2VyIG9mIHRoZSBlZGl0b3IuDQorCQkJCQkJLy8NCisJCQkJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7DQorCQkJCQkJCWN1cnJlbnRWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoZVNlbGVjdGlvbi50b0FycmF5KCkpLCB0cnVlKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX07DQorCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgZWRpdGluZyBkb21haW4gYXMgcmVxdWlyZWQgYnkgdGhlIHtAbGluayBJRWRpdGluZ0RvbWFpblByb3ZpZGVyfSBpbnRlcmZhY2UuDQorCSAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBpbXBsZW1lbnRpbmcgdGhlIHN0YXRpYyBtZXRob2RzIG9mIHtAbGluayBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW59DQorCSAqIGFuZCBmb3Igc3VwcG9ydGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb259Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsNCisJCXJldHVybiBlZGl0aW5nRG9tYWluOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHVibGljIE9iamVjdCBbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7DQorCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOw0KKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHVibGljIE9iamVjdCBbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7DQorCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOw0KKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgew0KKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsNCisJCQlyZXR1cm4gcGFyZW50ICE9IG51bGw7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJQE92ZXJyaWRlDQorCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG9uZSBjb250ZW50IHZpZXdlciwgZWl0aGVyIGZvciB0aGUgY3VycmVudCBwYWdlIG9yIHRoZSBvdXRsaW5lIHZpZXcsIGlmIGl0IGhhcyBmb2N1cywNCisJICogaXMgdGhlIGN1cnJlbnQgb25lLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0Q3VycmVudFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7DQorCQkvLyBJZiBpdCBpcyBjaGFuZ2luZy4uLg0KKwkJLy8NCisJCWlmIChjdXJyZW50Vmlld2VyICE9IHZpZXdlcikgew0KKwkJCWlmIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgew0KKwkJCQkvLyBDcmVhdGUgdGhlIGxpc3RlbmVyIG9uIGRlbWFuZC4NCisJCQkJLy8NCisJCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0NCisJCQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgew0KKwkJCQkJCS8vIFRoaXMganVzdCBub3RpZmllcyB0aG9zZSB0aGluZ3MgdGhhdCBhcmUgYWZmZWN0ZWQgYnkgdGhlIHNlY3Rpb24uDQorCQkJCQkJLy8NCisJCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBzZWxlY3Rpb25DaGFuZ2VkRXZlbnQpIHsNCisJCQkJCQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkNoYW5nZWRFdmVudC5nZXRTZWxlY3Rpb24oKSk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQl9DQorDQorCQkJLy8gU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG9sZCBvbmUuDQorCQkJLy8NCisJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7DQorCQkJCWN1cnJlbnRWaWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7DQorCQkJfQ0KKw0KKwkJCS8vIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmV3IG9uZS4NCisJCQkvLw0KKwkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgew0KKwkJCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7DQorCQkJfQ0KKw0KKwkJCS8vIFJlbWVtYmVyIGl0Lg0KKwkJCS8vDQorCQkJY3VycmVudFZpZXdlciA9IHZpZXdlcjsNCisNCisJCQkvLyBTZXQgdGhlIGVkaXRvcnMgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdlcidzIHNlbGVjdGlvbi4NCisJCQkvLw0KKwkJCXNldFNlbGVjdGlvbihjdXJyZW50Vmlld2VyID09IG51bGwgPyBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZIDogY3VycmVudFZpZXdlci5nZXRTZWxlY3Rpb24oKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgdmlld2VyIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSVZpZXdlclByb3ZpZGVyfSBpbnRlcmZhY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsNCisJCXJldHVybiBjdXJyZW50Vmlld2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIgYW5kIGFkZHMgYSBsaXN0ZW5lciBhcyB3ZWxsIHJlZ2lzdGVyaW5nIHRoZSBtZW51IGZvciBleHRlbnNpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgew0KKwkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOw0KKwkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsNCisJCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsNCisJCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsNCisJCU1lbnUgbWVudT0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7DQorCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7DQorCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgbmV3IFVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcih2aWV3ZXIpKTsNCisNCisJCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LOw0KKwkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9Ow0KKwkJdmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyYWdBZGFwdGVyKHZpZXdlcikpOw0KKwkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIGNhbGxlZCB0byBsb2FkIGEgcmVzb3VyY2UgaW50byB0aGUgZWRpdGluZyBkb21haW4ncyByZXNvdXJjZSBzZXQgYmFzZWQgb24gdGhlIGVkaXRvcidzIGlucHV0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgY3JlYXRlTW9kZWwoKSB7DQorCQlVUkkgcmVzb3VyY2VVUkkgPSBFZGl0VUlVdGlsLmdldFVSSShnZXRFZGl0b3JJbnB1dCgpKTsNCisJCUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOw0KKwkJdHJ5IHsNCisJCQkvLyBMb2FkIHRoZSByZXNvdXJjZSB0aHJvdWdoIHRoZSBlZGl0aW5nIGRvbWFpbi4NCisJCQkvLw0KKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCB0cnVlKTsNCisJCX0NCisJCWNhdGNoIChFeGNlcHRpb24gZSkgew0KKwkJCWV4Y2VwdGlvbiA9IGU7DQorCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIGZhbHNlKTsNCisJCX0NCisNCisJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pOw0KKwkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7DQorCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCAgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOw0KKwkJfQ0KKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgZGlhZ25vc3RpYyBkZXNjcmliaW5nIHRoZSBlcnJvcnMgYW5kIHdhcm5pbmdzIGxpc3RlZCBpbiB0aGUgcmVzb3VyY2UNCisJICogYW5kIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIChpZiBhbnkpLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIERpYWdub3N0aWMgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMoUmVzb3VyY2UgcmVzb3VyY2UsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCWlmICghcmVzb3VyY2UuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpIHx8ICFyZXNvdXJjZS5nZXRXYXJuaW5ncygpLmlzRW1wdHkoKSkgew0KKwkJCUJhc2ljRGlhZ25vc3RpYyBiYXNpY0RpYWdub3N0aWMgPQ0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljDQorCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwNCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50IiwNCisJCQkJCSAwLA0KKwkJCQkJIGdldFN0cmluZygiX1VJX0NyZWF0ZU1vZGVsRXJyb3JfbWVzc2FnZSIsIHJlc291cmNlLmdldFVSSSgpKSwNCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZXhjZXB0aW9uID09IG51bGwgPyAoT2JqZWN0KXJlc291cmNlIDogZXhjZXB0aW9uIH0pOw0KKwkJCWJhc2ljRGlhZ25vc3RpYy5tZXJnZShFY29yZVV0aWwuY29tcHV0ZURpYWdub3N0aWMocmVzb3VyY2UsIHRydWUpKTsNCisJCQlyZXR1cm4gYmFzaWNEaWFnbm9zdGljOw0KKwkJfQ0KKwkJZWxzZSBpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsNCisJCQlyZXR1cm4NCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYw0KKwkJCQkJKERpYWdub3N0aWMuRVJST1IsDQorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudCIsDQorCQkJCQkgMCwNCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksDQorCQkJCQkgbmV3IE9iamVjdFtdIHsgZXhjZXB0aW9uIH0pOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJcmV0dXJuIERpYWdub3N0aWMuT0tfSU5TVEFOQ0U7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gaW5zdGFsbCB5b3VyIG93biBjb250cm9scy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgY3JlYXRlUGFnZXMoKSB7DQorCQkvLyBDcmVhdGVzIHRoZSBtb2RlbCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQNCisJCS8vDQorCQljcmVhdGVNb2RlbCgpOw0KKw0KKwkJLy8gT25seSBjcmVhdGVzIHRoZSBvdGhlciBwYWdlcyBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhhdCBjYW4gYmUgZWRpdGVkDQorCQkvLw0KKwkJaWYgKCFnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsNCisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgc2VsZWN0aW9uIHRyZWUgdmlldy4NCisJCQkvLw0KKwkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGdldENvbnRhaW5lcigpLCBTV1QuTVVMVEkpOw0KKwkJCXNlbGVjdGlvblZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOw0KKwkJCXNldEN1cnJlbnRWaWV3ZXIoc2VsZWN0aW9uVmlld2VyKTsNCisNCisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCXNlbGVjdGlvblZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisvLwkJCXNlbGVjdGlvblZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOw0KKwkJCXNlbGVjdGlvblZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKTsNCisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsNCisNCisJCQluZXcgQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yKHNlbGVjdGlvblZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsNCisNCisJCQljcmVhdGVDb250ZXh0TWVudUZvcihzZWxlY3Rpb25WaWV3ZXIpOw0KKwkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHRyZWUpOw0KKwkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsNCisNCisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjDQorCQkJCShuZXcgUnVubmFibGUoKSB7DQorCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCSBzZXRBY3RpdmVQYWdlKDApOw0KKwkJCQkJIH0NCisJCQkJIH0pOw0KKwkJfQ0KKw0KKwkJLy8gRW5zdXJlcyB0aGF0IHRoaXMgZWRpdG9yIHdpbGwgb25seSBkaXNwbGF5IHRoZSBwYWdlJ3MgdGFiDQorCQkvLyBhcmVhIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHBhZ2UNCisJCS8vDQorCQlnZXRDb250YWluZXIoKS5hZGRDb250cm9sTGlzdGVuZXINCisJCQkobmV3IENvbnRyb2xBZGFwdGVyKCkgew0KKwkJCQlib29sZWFuIGd1YXJkID0gZmFsc2U7DQorCQkJCUBPdmVycmlkZQ0KKwkJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsNCisJCQkJCWlmICghZ3VhcmQpIHsNCisJCQkJCQlndWFyZCA9IHRydWU7DQorCQkJCQkJaGlkZVRhYnMoKTsNCisJCQkJCQlndWFyZCA9IGZhbHNlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJIH0pOw0KKw0KKwkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYw0KKwkJCShuZXcgUnVubmFibGUoKSB7DQorCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsNCisJCQkJIH0NCisJCQkgfSk7DQorCX0NCisNCisJLyoqDQorCSAqIElmIHRoZXJlIGlzIGp1c3Qgb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsDQorCSAqIHRoaXMgaGlkZXMgdGhlIHNpbmdsZSB0YWIgYXQgdGhlIGJvdHRvbS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhpZGVUYWJzKCkgew0KKwkJaWYgKGdldFBhZ2VDb3VudCgpIDw9IDEpIHsNCisJCQlzZXRQYWdlVGV4dCgwLCAiIik7DQorCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgew0KKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodCgxKTsNCisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7DQorCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSArIDYpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LA0KKwkgKiB0aGlzIHNob3dzIHRoZSB0YWJzIGF0IHRoZSBib3R0b20uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzaG93VGFicygpIHsNCisJCWlmIChnZXRQYWdlQ291bnQoKSA+IDEpIHsNCisJCQlzZXRQYWdlVGV4dCgwLCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOw0KKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsNCisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoU1dULkRFRkFVTFQpOw0KKwkJCQlQb2ludCBwb2ludCA9IGdldENvbnRhaW5lcigpLmdldFNpemUoKTsNCisJCQkJZ2V0Q29udGFpbmVyKCkuc2V0U2l6ZShwb2ludC54LCBwb2ludC55IC0gNik7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHVzZWQgdG8gdHJhY2sgdGhlIGFjdGl2ZSB2aWV3ZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgcGFnZUluZGV4KSB7DQorCQlzdXBlci5wYWdlQ2hhbmdlKHBhZ2VJbmRleCk7DQorDQorCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsNCisJCQloYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihjb250ZW50T3V0bGluZVBhZ2UuZ2V0U2VsZWN0aW9uKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIGhvdyB0aGUgZnJhbWV3b3JrIGRldGVybWluZXMgd2hpY2ggaW50ZXJmYWNlcyB3ZSBpbXBsZW1lbnQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsNCisJCWlmIChrZXkuZXF1YWxzKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpKSB7DQorCQkJcmV0dXJuIHNob3dPdXRsaW5lVmlldygpID8gZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgOiBudWxsOw0KKwkJfQ0KKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7DQorCQkJcmV0dXJuIGdldFByb3BlcnR5U2hlZXRQYWdlKCk7DQorCQl9DQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgew0KKwkJCXJldHVybiB0aGlzOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoa2V5KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IG91dGxpbmVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50T3V0bGluZVBhZ2UgZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgew0KKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSA9PSBudWxsKSB7DQorCQkJLy8gVGhlIGNvbnRlbnQgb3V0bGluZSBpcyBqdXN0IGEgdHJlZS4NCisJCQkvLw0KKwkJCWNsYXNzIE15Q29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgQ29udGVudE91dGxpbmVQYWdlIHsNCisJCQkJQE92ZXJyaWRlDQorCQkJCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KKwkJCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOw0KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7DQorCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7DQorDQorCQkJCQkvLyBTZXQgdXAgdGhlIHRyZWUgdmlld2VyLg0KKwkJCQkJLy8NCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsNCisNCisJCQkJCS8vIE1ha2Ugc3VyZSBvdXIgcG9wdXBzIHdvcmsuDQorCQkJCQkvLw0KKwkJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IoY29udGVudE91dGxpbmVWaWV3ZXIpOw0KKw0KKwkJCQkJaWYgKCFlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7DQorCQkJCQkgIC8vIFNlbGVjdCB0aGUgcm9vdCBvYmplY3QgaW4gdGhlIHZpZXcuDQorCQkJCQkgIC8vDQorCQkJCQkgIGNvbnRlbnRPdXRsaW5lVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJQE92ZXJyaWRlDQorCQkJCXB1YmxpYyB2b2lkIG1ha2VDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwgSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLCBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsNCisJCQkJCXN1cGVyLm1ha2VDb250cmlidXRpb25zKG1lbnVNYW5hZ2VyLCB0b29sQmFyTWFuYWdlciwgc3RhdHVzTGluZU1hbmFnZXIpOw0KKwkJCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOw0KKwkJCQl9DQorDQorCQkJCUBPdmVycmlkZQ0KKwkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsNCisJCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7DQorCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQljb250ZW50T3V0bGluZVBhZ2UgPSBuZXcgTXlDb250ZW50T3V0bGluZVBhZ2UoKTsNCisNCisJCQkvLyBMaXN0ZW4gdG8gc2VsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBpdCBpcyBhIHNwZWNpYWwgd2F5Lg0KKwkJCS8vDQorCQkJY29udGVudE91dGxpbmVQYWdlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcg0KKwkJCQkobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7DQorCQkJCQkgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2UgaGFuZGxlIHNlbGVjdGlvbnMgY29ycmVjdGx5Lg0KKwkJCQkJIC8vDQorCQkJCQkgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsNCisJCQkJCQkgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOw0KKwkJCQkJIH0NCisJCQkJIH0pOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIGNvbnRlbnRPdXRsaW5lUGFnZTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBwcm9wZXJ0eSBzaGVldC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7DQorCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgPT0gbnVsbCkgew0KKwkJCXByb3BlcnR5U2hlZXRQYWdlID0NCisJCQkJbmV3IEV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2UoZWRpdGluZ0RvbWFpbikgew0KKwkJCQkJQE92ZXJyaWRlDQorCQkJCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihMaXN0PD8+IHNlbGVjdGlvbikgew0KKwkJCQkJCUF1dG9tYXRpY2V4cGVyaW1lbnRFZGl0b3IudGhpcy5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihzZWxlY3Rpb24pOw0KKwkJCQkJCUF1dG9tYXRpY2V4cGVyaW1lbnRFZGl0b3IudGhpcy5zZXRGb2N1cygpOw0KKwkJCQkJfQ0KKw0KKwkJCQkJQE92ZXJyaWRlDQorCQkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsNCisJCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOw0KKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOw0KKwkJCQkJfQ0KKwkJCQl9Ow0KKwkJCXByb3BlcnR5U2hlZXRQYWdlLnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorCQl9DQorDQorCQlyZXR1cm4gcHJvcGVydHlTaGVldFBhZ2U7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgZGVhbHMgd2l0aCBob3cgd2Ugd2FudCBzZWxlY3Rpb24gaW4gdGhlIG91dGxpbmVyIHRvIGFmZmVjdCB0aGUgb3RoZXIgdmlld3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJaWYgKHNlbGVjdGlvblZpZXdlciAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7DQorCQkJSXRlcmF0b3I8Pz4gc2VsZWN0ZWRFbGVtZW50cyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5pdGVyYXRvcigpOw0KKwkJCWlmIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgew0KKwkJCQkvLyBHZXQgdGhlIGZpcnN0IHNlbGVjdGVkIGVsZW1lbnQuDQorCQkJCS8vDQorCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzLm5leHQoKTsNCisNCisJCQkJQXJyYXlMaXN0PE9iamVjdD4gc2VsZWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KKwkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnQpOw0KKwkJCQl3aGlsZSAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsNCisJCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudHMubmV4dCgpKTsNCisJCQkJfQ0KKw0KKwkJCQkvLyBTZXQgdGhlIHNlbGVjdGlvbiB0byB0aGUgd2lkZ2V0Lg0KKwkJCQkvLw0KKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbkxpc3QpKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSUVkaXRvclBhcnR9IGFuZCBzaW1wbHkgdGVzdHMgdGhlIGNvbW1hbmQgc3RhY2suDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsNCisJCXJldHVybiAoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLmlzU2F2ZU5lZWRlZCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHNhdmVzIHRoZSBtb2RlbCBmaWxlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KKwkJLy8gU2F2ZSBvbmx5IHJlc291cmNlcyB0aGF0IGhhdmUgYWN0dWFsbHkgY2hhbmdlZC4NCisJCS8vDQorCQlmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQorCQlzYXZlT3B0aW9ucy5wdXQoUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VELCBSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRURfTUVNT1JZX0JVRkZFUik7DQorDQorCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guDQorCQkvLw0KKwkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9DQorCQkJbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsNCisJCQkJLy8gVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBydW5zLg0KKwkJCQkvLw0KKwkJCQlAT3ZlcnJpZGUNCisJCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCisJCQkJCS8vIFNhdmUgdGhlIHJlc291cmNlcyB0byB0aGUgZmlsZSBzeXN0ZW0uDQorCQkJCQkvLw0KKwkJCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7DQorCQkJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKSB7DQorCQkJCQkJaWYgKChmaXJzdCB8fCAhcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkgfHwgaXNQZXJzaXN0ZWQocmVzb3VyY2UpKSAmJiAhZWRpdGluZ0RvbWFpbi5pc1JlYWRPbmx5KHJlc291cmNlKSkgew0KKwkJCQkJCQl0cnkgew0KKwkJCQkJCQkJbG9uZyB0aW1lU3RhbXAgPSByZXNvdXJjZS5nZXRUaW1lU3RhbXAoKTsNCisJCQkJCQkJCXJlc291cmNlLnNhdmUoc2F2ZU9wdGlvbnMpOw0KKwkJCQkJCQkJaWYgKHJlc291cmNlLmdldFRpbWVTdGFtcCgpICE9IHRpbWVTdGFtcCkgew0KKwkJCQkJCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7DQorCQkJCQkJCQl9DQorCQkJCQkJCX0NCisJCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOw0KKwkJCQkJCQl9DQorCQkJCQkJCWZpcnN0ID0gZmFsc2U7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfTsNCisNCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7DQorCQl0cnkgew0KKwkJCS8vIFRoaXMgcnVucyB0aGUgb3B0aW9ucywgYW5kIHNob3dzIHByb2dyZXNzLg0KKwkJCS8vDQorCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSkucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOw0KKw0KKwkJCS8vIFJlZnJlc2ggdGhlIG5lY2Vzc2FyeSBzdGF0ZS4NCisJCQkvLw0KKwkJCSgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuc2F2ZUlzRG9uZSgpOw0KKwkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsNCisJCX0NCisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgdGhhdCBzaG91bGRuJ3QuDQorCQkJLy8NCisJCQlBdXRvbWF0aWNleHBlcmllbmNlRWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCX0NCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsNCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB3aGV0aGVyIHNvbWV0aGluZyBoYXMgYmVlbiBwZXJzaXN0ZWQgdG8gdGhlIFVSSSBvZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlLg0KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgVVJJIGNvbnZlcnRlciBmcm9tIHRoZSBlZGl0b3IncyByZXNvdXJjZSBzZXQgdG8gdHJ5IHRvIG9wZW4gYW4gaW5wdXQgc3RyZWFtLiANCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzUGVyc2lzdGVkKFJlc291cmNlIHJlc291cmNlKSB7DQorCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOw0KKwkJdHJ5IHsNCisJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0ocmVzb3VyY2UuZ2V0VVJJKCkpOw0KKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgew0KKwkJCQlyZXN1bHQgPSB0cnVlOw0KKwkJCQlzdHJlYW0uY2xvc2UoKTsNCisJCQl9DQorCQl9DQorCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KKwkJCS8vIElnbm9yZQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhbHdheXMgcmV0dXJucyB0cnVlIGJlY2F1c2UgaXQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgew0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWxzbyBjaGFuZ2VzIHRoZSBlZGl0b3IncyBpbnB1dC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsNCisJCVNhdmVBc0RpYWxvZyBzYXZlQXNEaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsNCisJCXNhdmVBc0RpYWxvZy5vcGVuKCk7DQorCQlJUGF0aCBwYXRoID0gc2F2ZUFzRGlhbG9nLmdldFJlc3VsdCgpOw0KKwkJaWYgKHBhdGggIT0gbnVsbCkgew0KKwkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7DQorCQkJaWYgKGZpbGUgIT0gbnVsbCkgew0KKwkJCQlkb1NhdmVBcyhVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSkpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvU2F2ZUFzKFVSSSB1cmksIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgew0KKwkJKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLnNldFVSSSh1cmkpOw0KKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsNCisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7DQorCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9DQorCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgIT0gbnVsbCA/DQorCQkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpIDoNCisJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsNCisJCWRvU2F2ZShwcm9ncmVzc01vbml0b3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgew0KKwkJdHJ5IHsNCisJCQlpZiAobWFya2VyLmdldFR5cGUoKS5lcXVhbHMoRVZhbGlkYXRvci5NQVJLRVIpKSB7DQorCQkJCVN0cmluZyB1cmlBdHRyaWJ1dGUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKEVWYWxpZGF0b3IuVVJJX0FUVFJJQlVURSwgbnVsbCk7DQorCQkJCWlmICh1cmlBdHRyaWJ1dGUgIT0gbnVsbCkgew0KKwkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpQXR0cmlidXRlKTsNCisJCQkJCUVPYmplY3QgZU9iamVjdCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7DQorCQkJCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7DQorCQkJCQkgIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zLnNpbmdsZXRvbihlZGl0aW5nRG9tYWluLmdldFdyYXBwZXIoZU9iamVjdCkpKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCUF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgc3RhcnR1cC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgew0KKwkJc2V0U2l0ZShzaXRlKTsNCisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7DQorCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOw0KKwkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsNCisJCXNpdGUuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOw0KKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgew0KKwkJZ2V0Q29udHJvbChnZXRBY3RpdmVQYWdlKCkpLnNldEZvY3VzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsNCisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgew0KKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byByZXR1cm4gdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsNCisJCXJldHVybiBlZGl0b3JTZWxlY3Rpb247DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHNldCB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLg0KKwkgKiBDYWxsaW5nIHRoaXMgcmVzdWx0IHdpbGwgbm90aWZ5IHRoZSBsaXN0ZW5lcnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCWVkaXRvclNlbGVjdGlvbiA9IHNlbGVjdGlvbjsNCisNCisJCWZvciAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA6IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMpIHsNCisJCQlsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7DQorCQl9DQorCQlzZXRTdGF0dXNMaW5lTWFuYWdlcihzZWxlY3Rpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZU1hbmFnZXIoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciA9IGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCAmJiBjdXJyZW50Vmlld2VyID09IGNvbnRlbnRPdXRsaW5lVmlld2VyID8NCisJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyIDogZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7DQorDQorCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgew0KKwkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgew0KKwkJCQlDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikudG9MaXN0KCk7DQorCQkJCXN3aXRjaCAoY29sbGVjdGlvbi5zaXplKCkpIHsNCisJCQkJCWNhc2UgMDogew0KKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTm9PYmplY3RTZWxlY3RlZCIpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJCWNhc2UgMTogew0KKwkJCQkJCVN0cmluZyB0ZXh0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcihhZGFwdGVyRmFjdG9yeSkuZ2V0VGV4dChjb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsNCisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkIiwgdGV4dCkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQkJZGVmYXVsdDogew0KKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTXVsdGlPYmplY3RTZWxlY3RlZCIsIEludGVnZXIudG9TdHJpbmcoY29sbGVjdGlvbi5zaXplKCkpKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJZWxzZSB7DQorCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoIiIpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBsb29rcyB1cCBhIHN0cmluZyBpbiB0aGUgcGx1Z2luJ3MgcGx1Z2luLnByb3BlcnRpZXMgZmlsZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgew0KKwkJcmV0dXJuIEF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHBsdWdpbi5wcm9wZXJ0aWVzLCBtYWtpbmcgYSBzdWJzdGl0dXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgew0KKwkJcmV0dXJuIEF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXksIG5ldyBPYmplY3QgW10geyBzMSB9KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcn0gdG8gaGVscCBmaWxsIHRoZSBjb250ZXh0IG1lbnVzIHdpdGggY29udHJpYnV0aW9ucyBmcm9tIHRoZSBFZGl0IG1lbnUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7DQorCQkoKElNZW51TGlzdGVuZXIpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkpLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgew0KKwkJcmV0dXJuIChFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsNCisJCXJldHVybiBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGlvbkJhcnMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsNCisJCXJldHVybiBhZGFwdGVyRmFjdG9yeTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsNCisNCisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOw0KKw0KKwkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsNCisNCisJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsNCisNCisJCWlmIChnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGl2ZUVkaXRvcigpID09IHRoaXMpIHsNCisJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihudWxsKTsNCisJCX0NCisNCisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7DQorCQkJcHJvcGVydHlTaGVldFBhZ2UuZGlzcG9zZSgpOw0KKwkJfQ0KKw0KKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7DQorCQkJY29udGVudE91dGxpbmVQYWdlLmRpc3Bvc2UoKTsNCisJCX0NCisNCisJCXN1cGVyLmRpc3Bvc2UoKTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBvdXRsaW5lIHZpZXcgc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHNob3dPdXRsaW5lVmlldygpIHsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL2F1dG9tYXRpY2V4cGVyaW1lbnQvcHJlc2VudGF0aW9uL0F1dG9tYXRpY2V4cGVyaW1lbnRNb2RlbFdpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9hdXRvbWF0aWNleHBlcmltZW50L3ByZXNlbnRhdGlvbi9BdXRvbWF0aWNleHBlcmltZW50TW9kZWxXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzI2ZDg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9hdXRvbWF0aWNleHBlcmltZW50L3ByZXNlbnRhdGlvbi9BdXRvbWF0aWNleHBlcmltZW50TW9kZWxXaXphcmQuamF2YQpAQCAtMCwwICsxLDYxMiBAQAorcGFja2FnZSBhdXRvbWF0aWNleHBlcmltZW50LnByZXNlbnRhdGlvbjsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0Ow0KKw0KK2ltcG9ydCBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5Ow0KK2ltcG9ydCBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlOw0KK2ltcG9ydCBhdXRvbWF0aWNleHBlcmltZW50LnByb3ZpZGVyLkF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luOw0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgYSBzaW1wbGUgd2l6YXJkIGZvciBjcmVhdGluZyBhIG5ldyBtb2RlbCBmaWxlLg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBdXRvbWF0aWNleHBlcmltZW50TW9kZWxXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsNCisJLyoqDQorCSAqIFRoZSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyBmb3IgY3JlYXRlZCBmaWxlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IEZJTEVfRVhURU5TSU9OUyA9DQorCQlDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoQXV0b21hdGljZXhwZXJpZW5jZUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQXV0b21hdGljZXhwZXJpbWVudEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9ucyIpLnNwbGl0KCJcXHMqLFxccyoiKSkpOw0KKw0KKwkvKioNCisJICogQSBmb3JtYXR0ZWQgbGlzdCBvZiBzdXBwb3J0ZWQgZmlsZSBleHRlbnNpb25zLCBzdWl0YWJsZSBmb3IgZGlzcGxheS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFRF9GSUxFX0VYVEVOU0lPTlMgPQ0KKwkJQXV0b21hdGljZXhwZXJpZW5jZUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQXV0b21hdGljZXhwZXJpbWVudEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9ucyIpLnJlcGxhY2VBbGwoIlxccyosXFxzKiIsICIsICIpOw0KKw0KKwkvKioNCisJICogVGhpcyBjYWNoZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIHBhY2thZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UgYXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UgPSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5lSU5TVEFOQ0U7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNhY2hlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBdXRvbWF0aWNleHBlcmltZW50RmFjdG9yeSBhdXRvbWF0aWNleHBlcmltZW50RmFjdG9yeSA9IGF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLmdldEF1dG9tYXRpY2V4cGVyaW1lbnRGYWN0b3J5KCk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBmaWxlIGNyZWF0aW9uIHBhZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQXV0b21hdGljZXhwZXJpbWVudE1vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSBuZXdGaWxlQ3JlYXRpb25QYWdlOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgaW5pdGlhbCBvYmplY3QgY3JlYXRpb24gcGFnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBdXRvbWF0aWNleHBlcmltZW50TW9kZWxXaXphcmRJbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlIGluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2U7DQorDQorCS8qKg0KKwkgKiBSZW1lbWJlciB0aGUgc2VsZWN0aW9uIGR1cmluZyBpbml0aWFsaXphdGlvbiBmb3IgcG9wdWxhdGluZyB0aGUgZGVmYXVsdCBjb250YWluZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOw0KKw0KKwkvKioNCisJICogUmVtZW1iZXIgdGhlIHdvcmtiZW5jaCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVdvcmtiZW5jaCB3b3JrYmVuY2g7DQorDQorCS8qKg0KKwkgKiBDYWNoZXMgdGhlIG5hbWVzIG9mIHRoZSB0eXBlcyB0aGF0IGNhbiBiZSBjcmVhdGVkIGFzIHRoZSByb290IG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gaW5pdGlhbE9iamVjdE5hbWVzOw0KKw0KKwkvKioNCisJICogVGhpcyBqdXN0IHJlY29yZHMgdGhlIGluZm9ybWF0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQl0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsNCisJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOw0KKwkJc2V0V2luZG93VGl0bGUoQXV0b21hdGljZXhwZXJpZW5jZUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV2l6YXJkX2xhYmVsIikpOw0KKwkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LklOU1RBTkNFLmdldEltYWdlRGVzY3JpcHRvcihBdXRvbWF0aWNleHBlcmllbmNlRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC93aXpiYW4vTmV3QXV0b21hdGljZXhwZXJpbWVudCIpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSB0eXBlcyB0aGF0IGNhbiBiZSBjcmVhdGVkIGFzIHRoZSByb290IG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0SW5pdGlhbE9iamVjdE5hbWVzKCkgew0KKwkJaWYgKGluaXRpYWxPYmplY3ROYW1lcyA9PSBudWxsKSB7DQorCQkJaW5pdGlhbE9iamVjdE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQorCQkJZm9yIChFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA6IGF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLmdldEVDbGFzc2lmaWVycygpKSB7DQorCQkJCWlmIChlQ2xhc3NpZmllciBpbnN0YW5jZW9mIEVDbGFzcykgew0KKwkJCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpZUNsYXNzaWZpZXI7DQorCQkJCQlpZiAoIWVDbGFzcy5pc0Fic3RyYWN0KCkpIHsNCisJCQkJCQlpbml0aWFsT2JqZWN0TmFtZXMuYWRkKGVDbGFzcy5nZXROYW1lKCkpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCUNvbGxlY3Rpb25zLnNvcnQoaW5pdGlhbE9iamVjdE5hbWVzLCBDb21tb25QbHVnaW4uSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpKTsNCisJCX0NCisJCXJldHVybiBpbml0aWFsT2JqZWN0TmFtZXM7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZSBhIG5ldyBtb2RlbC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGNyZWF0ZUluaXRpYWxNb2RlbCgpIHsNCisJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKWF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLmdldEVDbGFzc2lmaWVyKGluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UuZ2V0SW5pdGlhbE9iamVjdE5hbWUoKSk7DQorCQlFT2JqZWN0IHJvb3RPYmplY3QgPSBhdXRvbWF0aWNleHBlcmltZW50RmFjdG9yeS5jcmVhdGUoZUNsYXNzKTsNCisJCXJldHVybiByb290T2JqZWN0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBEbyB0aGUgd29yayBhZnRlciBldmVyeXRoaW5nIGlzIHNwZWNpZmllZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgew0KKwkJdHJ5IHsNCisJCQkvLyBSZW1lbWJlciB0aGUgZmlsZS4NCisJCQkvLw0KKwkJCWZpbmFsIElGaWxlIG1vZGVsRmlsZSA9IGdldE1vZGVsRmlsZSgpOw0KKw0KKwkJCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24uDQorCQkJLy8NCisJCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0NCisJCQkJbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsNCisJCQkJCUBPdmVycmlkZQ0KKwkJCQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KKwkJCQkJCXRyeSB7DQorCQkJCQkJCS8vIENyZWF0ZSBhIHJlc291cmNlIHNldA0KKwkJCQkJCQkvLw0KKwkJCQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsNCisNCisJCQkJCQkJLy8gR2V0IHRoZSBVUkkgb2YgdGhlIG1vZGVsIGZpbGUuDQorCQkJCQkJCS8vDQorCQkJCQkJCVVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkobW9kZWxGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSk7DQorDQorCQkJCQkJCS8vIENyZWF0ZSBhIHJlc291cmNlIGZvciB0aGlzIGZpbGUuDQorCQkJCQkJCS8vDQorCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoZmlsZVVSSSk7DQorDQorCQkJCQkJCS8vIEFkZCB0aGUgaW5pdGlhbCBtb2RlbCBvYmplY3QgdG8gdGhlIGNvbnRlbnRzLg0KKwkJCQkJCQkvLw0KKwkJCQkJCQlFT2JqZWN0IHJvb3RPYmplY3QgPSBjcmVhdGVJbml0aWFsTW9kZWwoKTsNCisJCQkJCQkJaWYgKHJvb3RPYmplY3QgIT0gbnVsbCkgew0KKwkJCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQocm9vdE9iamVjdCk7DQorCQkJCQkJCX0NCisNCisJCQkJCQkJLy8gU2F2ZSB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlIHRvIHRoZSBmaWxlIHN5c3RlbS4NCisJCQkJCQkJLy8NCisJCQkJCQkJTWFwPE9iamVjdCwgT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQorCQkJCQkJCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5nZXRFbmNvZGluZygpKTsNCisJCQkJCQkJcmVzb3VyY2Uuc2F2ZShvcHRpb25zKTsNCisJCQkJCQl9DQorCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCQkJQXV0b21hdGljZXhwZXJpZW5jZUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQkJCQkJfQ0KKwkJCQkJCWZpbmFsbHkgew0KKwkJCQkJCQlwcm9ncmVzc01vbml0b3IuZG9uZSgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfTsNCisNCisJCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIGZhbHNlLCBvcGVyYXRpb24pOw0KKw0KKwkJCS8vIFNlbGVjdCB0aGUgbmV3IGZpbGUgcmVzb3VyY2UgaW4gdGhlIGN1cnJlbnQgdmlldy4NCisJCQkvLw0KKwkJCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOw0KKwkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOw0KKwkJCWZpbmFsIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBwYWdlLmdldEFjdGl2ZVBhcnQoKTsNCisJCQlpZiAoYWN0aXZlUGFydCBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpIHsNCisJCQkJZmluYWwgSVNlbGVjdGlvbiB0YXJnZXRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb2RlbEZpbGUpOw0KKwkJCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMNCisJCQkJCShuZXcgUnVubmFibGUoKSB7DQorCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJICgoSVNldFNlbGVjdGlvblRhcmdldClhY3RpdmVQYXJ0KS5zZWxlY3RSZXZlYWwodGFyZ2V0U2VsZWN0aW9uKTsNCisJCQkJCQkgfQ0KKwkJCQkJIH0pOw0KKwkJCX0NCisNCisJCQkvLyBPcGVuIGFuIGVkaXRvciBvbiB0aGUgbmV3IGZpbGUuDQorCQkJLy8NCisJCQl0cnkgew0KKwkJCQlwYWdlLm9wZW5FZGl0b3INCisJCQkJCShuZXcgRmlsZUVkaXRvcklucHV0KG1vZGVsRmlsZSksDQorCQkJCQkgd29ya2JlbmNoLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdEVkaXRvcihtb2RlbEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS5nZXRJZCgpKTsNCisJCQl9DQorCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcih3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKSwgQXV0b21hdGljZXhwZXJpZW5jZUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsIiksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOw0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQlBdXRvbWF0aWNleHBlcmllbmNlRWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIG9uZSBwYWdlIG9mIHRoZSB3aXphcmQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgQXV0b21hdGljZXhwZXJpbWVudE1vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2Ugew0KKwkJLyoqDQorCQkgKiBQYXNzIGluIHRoZSBzZWxlY3Rpb24uDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBBdXRvbWF0aWNleHBlcmltZW50TW9kZWxXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlKFN0cmluZyBwYWdlSWQsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJCXN1cGVyKHBhZ2VJZCwgc2VsZWN0aW9uKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogVGhlIGZyYW1ld29yayBjYWxscyB0aGlzIHRvIHNlZSBpZiB0aGUgZmlsZSBpcyBjb3JyZWN0Lg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlAT3ZlcnJpZGUNCisJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsNCisJCQlpZiAoc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsNCisJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IG5ldyBQYXRoKGdldEZpbGVOYW1lKCkpLmdldEZpbGVFeHRlbnNpb24oKTsNCisJCQkJaWYgKGV4dGVuc2lvbiA9PSBudWxsIHx8ICFGSUxFX0VYVEVOU0lPTlMuY29udGFpbnMoZXh0ZW5zaW9uKSkgew0KKwkJCQkJU3RyaW5nIGtleSA9IEZJTEVfRVhURU5TSU9OUy5zaXplKCkgPiAxID8gIl9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9ucyIgOiAiX1dBUk5fRmlsZW5hbWVFeHRlbnNpb24iOw0KKwkJCQkJc2V0RXJyb3JNZXNzYWdlKEF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXksIG5ldyBPYmplY3QgW10geyBGT1JNQVRURURfRklMRV9FWFRFTlNJT05TIH0pKTsNCisJCQkJCXJldHVybiBmYWxzZTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBJRmlsZSBnZXRNb2RlbEZpbGUoKSB7DQorCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShnZXRDb250YWluZXJGdWxsUGF0aCgpLmFwcGVuZChnZXRGaWxlTmFtZSgpKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIHBhZ2Ugd2hlcmUgdGhlIHR5cGUgb2Ygb2JqZWN0IHRvIGNyZWF0ZSBpcyBzZWxlY3RlZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBBdXRvbWF0aWNleHBlcmltZW50TW9kZWxXaXphcmRJbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7DQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJvdGVjdGVkIENvbWJvIGluaXRpYWxPYmplY3RGaWVsZDsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICovDQorCQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGVuY29kaW5nczsNCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgQ29tYm8gZW5jb2RpbmdGaWVsZDsNCisNCisJCS8qKg0KKwkJICogUGFzcyBpbiB0aGUgc2VsZWN0aW9uLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgQXV0b21hdGljZXhwZXJpbWVudE1vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZShTdHJpbmcgcGFnZUlkKSB7DQorCQkJc3VwZXIocGFnZUlkKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCisJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsgew0KKwkJCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7DQorCQkJCWxheW91dC5udW1Db2x1bW5zID0gMTsNCisJCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEyOw0KKwkJCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7DQorDQorCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsNCisJCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQorCQkJCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOw0KKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsNCisJCQl9DQorDQorCQkJTGFiZWwgY29udGFpbmVyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7DQorCQkJew0KKwkJCQljb250YWluZXJMYWJlbC5zZXRUZXh0KEF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX01vZGVsT2JqZWN0IikpOw0KKw0KKwkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7DQorCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQorCQkJCWNvbnRhaW5lckxhYmVsLnNldExheW91dERhdGEoZGF0YSk7DQorCQkJfQ0KKw0KKwkJCWluaXRpYWxPYmplY3RGaWVsZCA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5CT1JERVIpOw0KKwkJCXsNCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOw0KKwkJCQlpbml0aWFsT2JqZWN0RmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsNCisJCQl9DQorDQorCQkJZm9yIChTdHJpbmcgb2JqZWN0TmFtZSA6IGdldEluaXRpYWxPYmplY3ROYW1lcygpKSB7DQorCQkJCWluaXRpYWxPYmplY3RGaWVsZC5hZGQoZ2V0TGFiZWwob2JqZWN0TmFtZSkpOw0KKwkJCX0NCisNCisJCQlpZiAoaW5pdGlhbE9iamVjdEZpZWxkLmdldEl0ZW1Db3VudCgpID09IDEpIHsNCisJCQkJaW5pdGlhbE9iamVjdEZpZWxkLnNlbGVjdCgwKTsNCisJCQl9DQorCQkJaW5pdGlhbE9iamVjdEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHZhbGlkYXRvcik7DQorDQorCQkJTGFiZWwgZW5jb2RpbmdMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsNCisJCQl7DQorCQkJCWVuY29kaW5nTGFiZWwuc2V0VGV4dChBdXRvbWF0aWNleHBlcmllbmNlRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9YTUxFbmNvZGluZyIpKTsNCisNCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJCQllbmNvZGluZ0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7DQorCQkJfQ0KKwkJCWVuY29kaW5nRmllbGQgPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSKTsNCisJCQl7DQorCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsNCisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCisJCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsNCisJCQkJZW5jb2RpbmdGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOw0KKwkJCX0NCisNCisJCQlmb3IgKFN0cmluZyBlbmNvZGluZyA6IGdldEVuY29kaW5ncygpKSB7DQorCQkJCWVuY29kaW5nRmllbGQuYWRkKGVuY29kaW5nKTsNCisJCQl9DQorDQorCQkJZW5jb2RpbmdGaWVsZC5zZWxlY3QoMCk7DQorCQkJZW5jb2RpbmdGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih2YWxpZGF0b3IpOw0KKw0KKwkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7DQorCQkJc2V0Q29udHJvbChjb21wb3NpdGUpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciB2YWxpZGF0b3IgPQ0KKwkJCW5ldyBNb2RpZnlMaXN0ZW5lcigpIHsNCisJCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7DQorCQkJCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7DQorCQkJcmV0dXJuIGdldEluaXRpYWxPYmplY3ROYW1lKCkgIT0gbnVsbCAmJiBnZXRFbmNvZGluZ3MoKS5jb250YWlucyhlbmNvZGluZ0ZpZWxkLmdldFRleHQoKSk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJQE92ZXJyaWRlDQorCQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgew0KKwkJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7DQorCQkJaWYgKHZpc2libGUpIHsNCisJCQkJaWYgKGluaXRpYWxPYmplY3RGaWVsZC5nZXRJdGVtQ291bnQoKSA9PSAxKSB7DQorCQkJCQlpbml0aWFsT2JqZWN0RmllbGQuY2xlYXJTZWxlY3Rpb24oKTsNCisJCQkJCWVuY29kaW5nRmllbGQuc2V0Rm9jdXMoKTsNCisJCQkJfQ0KKwkJCQllbHNlIHsNCisJCQkJCWVuY29kaW5nRmllbGQuY2xlYXJTZWxlY3Rpb24oKTsNCisJCQkJCWluaXRpYWxPYmplY3RGaWVsZC5zZXRGb2N1cygpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbE9iamVjdE5hbWUoKSB7DQorCQkJU3RyaW5nIGxhYmVsID0gaW5pdGlhbE9iamVjdEZpZWxkLmdldFRleHQoKTsNCisNCisJCQlmb3IgKFN0cmluZyBuYW1lIDogZ2V0SW5pdGlhbE9iamVjdE5hbWVzKCkpIHsNCisJCQkJaWYgKGdldExhYmVsKG5hbWUpLmVxdWFscyhsYWJlbCkpIHsNCisJCQkJCXJldHVybiBuYW1lOw0KKwkJCQl9DQorCQkJfQ0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7DQorCQkJcmV0dXJuIGVuY29kaW5nRmllbGQuZ2V0VGV4dCgpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIG5hbWUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoU3RyaW5nIHR5cGVOYW1lKSB7DQorCQkJdHJ5IHsNCisJCQkJcmV0dXJuIEF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJXyIgKyB0eXBlTmFtZSArICJfdHlwZSIpOw0KKwkJCX0NCisJCQljYXRjaChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7DQorCQkJCUF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhtcmUpOw0KKwkJCX0NCisJCQlyZXR1cm4gdHlwZU5hbWU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBnZXRFbmNvZGluZ3MoKSB7DQorCQkJaWYgKGVuY29kaW5ncyA9PSBudWxsKSB7DQorCQkJCWVuY29kaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KKwkJCQlmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKEF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1hNTEVuY29kaW5nQ2hvaWNlcyIpKTsgc3RyaW5nVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgKSB7DQorCQkJCQllbmNvZGluZ3MuYWRkKHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKSk7DQorCQkJCX0NCisJCQl9DQorCQkJcmV0dXJuIGVuY29kaW5nczsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhlIGZyYW1ld29yayBjYWxscyB0aGlzIHRvIGNyZWF0ZSB0aGUgY29udGVudHMgb2YgdGhlIHdpemFyZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCQlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7DQorCQkvLyBDcmVhdGUgYSBwYWdlLCBzZXQgdGhlIHRpdGxlLCBhbmQgdGhlIGluaXRpYWwgbW9kZWwgZmlsZSBuYW1lLg0KKwkJLy8NCisJCW5ld0ZpbGVDcmVhdGlvblBhZ2UgPSBuZXcgQXV0b21hdGljZXhwZXJpbWVudE1vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSgiV2hhdGV2ZXIiLCBzZWxlY3Rpb24pOw0KKwkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXRUaXRsZShBdXRvbWF0aWNleHBlcmllbmNlRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9BdXRvbWF0aWNleHBlcmltZW50TW9kZWxXaXphcmRfbGFiZWwiKSk7DQorCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldERlc2NyaXB0aW9uKEF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0F1dG9tYXRpY2V4cGVyaW1lbnRNb2RlbFdpemFyZF9kZXNjcmlwdGlvbiIpKTsNCisJCW5ld0ZpbGVDcmVhdGlvblBhZ2Uuc2V0RmlsZU5hbWUoQXV0b21hdGljZXhwZXJpZW5jZUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQXV0b21hdGljZXhwZXJpbWVudEVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2UiKSArICIuIiArIEZJTEVfRVhURU5TSU9OUy5nZXQoMCkpOw0KKwkJYWRkUGFnZShuZXdGaWxlQ3JlYXRpb25QYWdlKTsNCisNCisJCS8vIFRyeSBhbmQgZ2V0IHRoZSByZXNvdXJjZSBzZWxlY3Rpb24gdG8gZGV0ZXJtaW5lIGEgY3VycmVudCBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlIGRpYWxvZy4NCisJCS8vDQorCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCisJCQkvLyBHZXQgdGhlIHJlc291cmNlLi4uDQorCQkJLy8NCisJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpOw0KKwkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsNCisJCQkJLy8gR2V0IHRoZSByZXNvdXJjZSBwYXJlbnQsIGlmIGl0cyBhIGZpbGUuDQorCQkJCS8vDQorCQkJCUlSZXNvdXJjZSBzZWxlY3RlZFJlc291cmNlID0gKElSZXNvdXJjZSlzZWxlY3RlZEVsZW1lbnQ7DQorCQkJCWlmIChzZWxlY3RlZFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgew0KKwkJCQkJc2VsZWN0ZWRSZXNvdXJjZSA9IHNlbGVjdGVkUmVzb3VyY2UuZ2V0UGFyZW50KCk7DQorCQkJCX0NCisNCisJCQkJLy8gVGhpcyBnaXZlcyB1cyBhIGRpcmVjdG9yeS4uLg0KKwkJCQkvLw0KKwkJCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIgfHwgc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7DQorCQkJCQkvLyBTZXQgdGhpcyBmb3IgdGhlIGNvbnRhaW5lci4NCisJCQkJCS8vDQorCQkJCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldENvbnRhaW5lckZ1bGxQYXRoKHNlbGVjdGVkUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7DQorDQorCQkJCQkvLyBNYWtlIHVwIGEgdW5pcXVlIG5ldyBuYW1lIGhlcmUuDQorCQkJCQkvLw0KKwkJCQkJU3RyaW5nIGRlZmF1bHRNb2RlbEJhc2VGaWxlbmFtZSA9IEF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0F1dG9tYXRpY2V4cGVyaW1lbnRFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlIik7DQorCQkJCQlTdHJpbmcgZGVmYXVsdE1vZGVsRmlsZW5hbWVFeHRlbnNpb24gPSBGSUxFX0VYVEVOU0lPTlMuZ2V0KDApOw0KKwkJCQkJU3RyaW5nIG1vZGVsRmlsZW5hbWUgPSBkZWZhdWx0TW9kZWxCYXNlRmlsZW5hbWUgKyAiLiIgKyBkZWZhdWx0TW9kZWxGaWxlbmFtZUV4dGVuc2lvbjsNCisJCQkJCWZvciAoaW50IGkgPSAxOyAoKElDb250YWluZXIpc2VsZWN0ZWRSZXNvdXJjZSkuZmluZE1lbWJlcihtb2RlbEZpbGVuYW1lKSAhPSBudWxsOyArK2kpIHsNCisJCQkJCQltb2RlbEZpbGVuYW1lID0gZGVmYXVsdE1vZGVsQmFzZUZpbGVuYW1lICsgaSArICIuIiArIGRlZmF1bHRNb2RlbEZpbGVuYW1lRXh0ZW5zaW9uOw0KKwkJCQkJfQ0KKwkJCQkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXRGaWxlTmFtZShtb2RlbEZpbGVuYW1lKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCWluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UgPSBuZXcgQXV0b21hdGljZXhwZXJpbWVudE1vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSgiV2hhdGV2ZXIyIik7DQorCQlpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlLnNldFRpdGxlKEF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0F1dG9tYXRpY2V4cGVyaW1lbnRNb2RlbFdpemFyZF9sYWJlbCIpKTsNCisJCWluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2Uuc2V0RGVzY3JpcHRpb24oQXV0b21hdGljZXhwZXJpZW5jZUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV2l6YXJkX2luaXRpYWxfb2JqZWN0X2Rlc2NyaXB0aW9uIikpOw0KKwkJYWRkUGFnZShpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlKTsNCisJfQ0KKw0KKwkvKioNCisJICogR2V0IHRoZSBmaWxlIGZyb20gdGhlIHBhZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpbGUgZ2V0TW9kZWxGaWxlKCkgew0KKwkJcmV0dXJuIG5ld0ZpbGVDcmVhdGlvblBhZ2UuZ2V0TW9kZWxGaWxlKCk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9hdXRvbWF0aWNleHBlcmltZW50L3Byb3ZpZGVyL0F1dG9tYXRpY0V4cGVyaW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9wcm92aWRlci9BdXRvbWF0aWNFeHBlcmltZW50SXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyOGM3NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9wcm92aWRlci9BdXRvbWF0aWNFeHBlcmltZW50SXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzODIgQEAKK3BhY2thZ2UgYXV0b21hdGljZXhwZXJpbWVudC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudDsKK2ltcG9ydCBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5JZGVudGlmaWFibGVJdGVtUHJvdmlkZXI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY0V4cGVyaW1lbnR9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEF1dG9tYXRpY0V4cGVyaW1lbnRJdGVtUHJvdmlkZXIKKwlleHRlbmRzIElkZW50aWZpYWJsZUl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQXV0b21hdGljRXhwZXJpbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRCYXNlU2NlbmFyaW9Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFBhcmFtZXRlcnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZEVycm9yQW5hbHlzaXNBbGdvcml0aG1Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZEVycm9yRnVuY3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFRvbGVyYW5jZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkUmVmZXJhbmNlRGF0YURpclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkTWF4aW11bU51bWJlck9mSXRlcmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkUmVJbml0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCYXNlIFNjZW5hcmlvIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQmFzZVNjZW5hcmlvUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfQXV0b21hdGljRXhwZXJpbWVudF9iYXNlU2NlbmFyaW9fZmVhdHVyZSIpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0F1dG9tYXRpY0V4cGVyaW1lbnRfYmFzZVNjZW5hcmlvX2ZlYXR1cmUiLCAiX1VJX0F1dG9tYXRpY0V4cGVyaW1lbnRfdHlwZSIpLAorCQkJCSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5MaXRlcmFscy5BVVRPTUFUSUNfRVhQRVJJTUVOVF9fQkFTRV9TQ0VOQVJJTywKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIHRydWUsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFyYW1ldGVycyBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFBhcmFtZXRlcnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9BdXRvbWF0aWNFeHBlcmltZW50X3BhcmFtZXRlcnNfZmVhdHVyZSIpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0F1dG9tYXRpY0V4cGVyaW1lbnRfcGFyYW1ldGVyc19mZWF0dXJlIiwgIl9VSV9BdXRvbWF0aWNFeHBlcmltZW50X3R5cGUiKSwKKwkJCQkgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTGl0ZXJhbHMuQVVUT01BVElDX0VYUEVSSU1FTlRfX1BBUkFNRVRFUlMsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSB0cnVlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVycm9yIEFuYWx5c2lzIEFsZ29yaXRobSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEVycm9yQW5hbHlzaXNBbGdvcml0aG1Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9BdXRvbWF0aWNFeHBlcmltZW50X2Vycm9yQW5hbHlzaXNBbGdvcml0aG1fZmVhdHVyZSIpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0F1dG9tYXRpY0V4cGVyaW1lbnRfZXJyb3JBbmFseXNpc0FsZ29yaXRobV9mZWF0dXJlIiwgIl9VSV9BdXRvbWF0aWNFeHBlcmltZW50X3R5cGUiKSwKKwkJCQkgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTGl0ZXJhbHMuQVVUT01BVElDX0VYUEVSSU1FTlRfX0VSUk9SX0FOQUxZU0lTX0FMR09SSVRITSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXJyb3IgRnVuY3Rpb24gZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRFcnJvckZ1bmN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfQXV0b21hdGljRXhwZXJpbWVudF9lcnJvckZ1bmN0aW9uX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdXRvbWF0aWNFeHBlcmltZW50X2Vycm9yRnVuY3Rpb25fZmVhdHVyZSIsICJfVUlfQXV0b21hdGljRXhwZXJpbWVudF90eXBlIiksCisJCQkJIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkxpdGVyYWxzLkFVVE9NQVRJQ19FWFBFUklNRU5UX19FUlJPUl9GVU5DVElPTiwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVG9sZXJhbmNlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkVG9sZXJhbmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfQXV0b21hdGljRXhwZXJpbWVudF90b2xlcmFuY2VfZmVhdHVyZSIpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0F1dG9tYXRpY0V4cGVyaW1lbnRfdG9sZXJhbmNlX2ZlYXR1cmUiLCAiX1VJX0F1dG9tYXRpY0V4cGVyaW1lbnRfdHlwZSIpLAorCQkJCSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5MaXRlcmFscy5BVVRPTUFUSUNfRVhQRVJJTUVOVF9fVE9MRVJBTkNFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWZlcmFuY2UgRGF0YSBEaXIgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZlcmFuY2VEYXRhRGlyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfQXV0b21hdGljRXhwZXJpbWVudF9yZWZlcmFuY2VEYXRhRGlyX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdXRvbWF0aWNFeHBlcmltZW50X3JlZmVyYW5jZURhdGFEaXJfZmVhdHVyZSIsICJfVUlfQXV0b21hdGljRXhwZXJpbWVudF90eXBlIiksCisJCQkJIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkxpdGVyYWxzLkFVVE9NQVRJQ19FWFBFUklNRU5UX19SRUZFUkFOQ0VfREFUQV9ESVIsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1heGltdW0gTnVtYmVyIE9mIEl0ZXJhdGlvbnMgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRNYXhpbXVtTnVtYmVyT2ZJdGVyYXRpb25zUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfQXV0b21hdGljRXhwZXJpbWVudF9tYXhpbXVtTnVtYmVyT2ZJdGVyYXRpb25zX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdXRvbWF0aWNFeHBlcmltZW50X21heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnNfZmVhdHVyZSIsICJfVUlfQXV0b21hdGljRXhwZXJpbWVudF90eXBlIiksCisJCQkJIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkxpdGVyYWxzLkFVVE9NQVRJQ19FWFBFUklNRU5UX19NQVhJTVVNX05VTUJFUl9PRl9JVEVSQVRJT05TLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuSU5URUdSQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmUgSW5pdCBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFJlSW5pdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0F1dG9tYXRpY0V4cGVyaW1lbnRfcmVJbml0X2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdXRvbWF0aWNFeHBlcmltZW50X3JlSW5pdF9mZWF0dXJlIiwgIl9VSV9BdXRvbWF0aWNFeHBlcmltZW50X3R5cGUiKSwKKwkJCQkgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTGl0ZXJhbHMuQVVUT01BVElDX0VYUEVSSU1FTlRfX1JFX0lOSVQsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOworCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTGl0ZXJhbHMuQVVUT01BVElDX0VYUEVSSU1FTlRfX0JBU0VfU0NFTkFSSU8pOworCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTGl0ZXJhbHMuQVVUT01BVElDX0VYUEVSSU1FTlRfX1BBUkFNRVRFUlMpOworCQl9CisJCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgeworCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCisJCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KKworCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBBdXRvbWF0aWNFeHBlcmltZW50LmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9jdXN0b21vYmoxNi9BdXRvbWF0aWNFeHBlcmltZW50IikpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoQXV0b21hdGljRXhwZXJpbWVudClvYmplY3QpLmdldFVSSSgpLmxhc3RTZWdtZW50KCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfQXV0b21hdGljRXhwZXJpbWVudF90eXBlIikgOgorCQkJIGxhYmVsOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKEF1dG9tYXRpY0V4cGVyaW1lbnQpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9BdXRvbWF0aWNFeHBlcmltZW50X3R5cGUiKSA6CisJCQlnZXRTdHJpbmcoIl9VSV9BdXRvbWF0aWNFeHBlcmltZW50X3R5cGUiKSArICIgIiArIGxhYmVsOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBdXRvbWF0aWNFeHBlcmltZW50LmNsYXNzKSkgeworCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5BVVRPTUFUSUNfRVhQRVJJTUVOVF9fRVJST1JfQU5BTFlTSVNfQUxHT1JJVEhNOgorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5BVVRPTUFUSUNfRVhQRVJJTUVOVF9fRVJST1JfRlVOQ1RJT046CisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19UT0xFUkFOQ0U6CisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19SRUZFUkFOQ0VfREFUQV9ESVI6CisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkFVVE9NQVRJQ19FWFBFUklNRU5UX19NQVhJTVVNX05VTUJFUl9PRl9JVEVSQVRJT05TOgorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5BVVRPTUFUSUNfRVhQRVJJTUVOVF9fUkVfSU5JVDoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gQXV0b21hdGljZXhwZXJpZW5jZUVkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL2F1dG9tYXRpY2V4cGVyaW1lbnQvcHJvdmlkZXIvQXV0b21hdGljZXhwZXJpZW5jZUVkaXRQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9wcm92aWRlci9BdXRvbWF0aWNleHBlcmllbmNlRWRpdFBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZmI1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL2F1dG9tYXRpY2V4cGVyaW1lbnQvcHJvdmlkZXIvQXV0b21hdGljZXhwZXJpZW5jZUVkaXRQbHVnaW4uamF2YQpAQCAtMCwwICsxLDEwMiBAQAorcGFja2FnZSBhdXRvbWF0aWNleHBlcmltZW50LnByb3ZpZGVyOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5FY2xpcHNlVUlQbHVnaW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUVkaXRQbHVnaW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBBdXRvbWF0aWNleHBlcmllbmNlIGVkaXRvciBwbHVnaW4uDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGZpbmFsIGNsYXNzIEF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIHsNCisJLyoqDQorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQXV0b21hdGljZXhwZXJpZW5jZUVkaXRQbHVnaW4gSU5TVEFOQ0UgPSBuZXcgQXV0b21hdGljZXhwZXJpZW5jZUVkaXRQbHVnaW4oKTsNCisNCisJLyoqDQorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsNCisNCisJLyoqDQorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQXV0b21hdGljZXhwZXJpZW5jZUVkaXRQbHVnaW4oKSB7DQorCQlzdXBlcg0KKwkJCShuZXcgUmVzb3VyY2VMb2NhdG9yIFtdIHsNCisJCQkJQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0UsDQorCQkJCUVjb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwNCisJCQl9KTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgew0KKwkJcmV0dXJuIHBsdWdpbjsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7DQorCQlyZXR1cm4gcGx1Z2luOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlBsdWdpbjwvYj4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVVJUGx1Z2luIHsNCisJCS8qKg0KKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgew0KKwkJCXN1cGVyKCk7DQorCQ0KKwkJCS8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuDQorCQkJLy8NCisJCQlwbHVnaW4gPSB0aGlzOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9wcm92aWRlci9BdXRvbWF0aWNleHBlcmltZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9wcm92aWRlci9BdXRvbWF0aWNleHBlcmltZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzAxMjFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9hdXRvbWF0aWNleHBlcmltZW50L3Byb3ZpZGVyL0F1dG9tYXRpY2V4cGVyaW1lbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjMxIEBACitwYWNrYWdlIGF1dG9tYXRpY2V4cGVyaW1lbnQucHJvdmlkZXI7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQorDQoraW1wb3J0IGF1dG9tYXRpY2V4cGVyaW1lbnQudXRpbC5BdXRvbWF0aWNleHBlcmltZW50QWRhcHRlckZhY3Rvcnk7DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLg0KKyAqIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKyAqIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuDQorICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBdXRvbWF0aWNleHBlcmltZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBdXRvbWF0aWNleHBlcmltZW50QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOw0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5IHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCisNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBdXRvbWF0aWNleHBlcmltZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7DQorCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOw0KKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQorCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOw0KKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudH0gaW5zdGFuY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEF1dG9tYXRpY0V4cGVyaW1lbnRJdGVtUHJvdmlkZXIgYXV0b21hdGljRXhwZXJpbWVudEl0ZW1Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY0V4cGVyaW1lbnR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUF1dG9tYXRpY0V4cGVyaW1lbnRBZGFwdGVyKCkgew0KKwkJaWYgKGF1dG9tYXRpY0V4cGVyaW1lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KKwkJCWF1dG9tYXRpY0V4cGVyaW1lbnRJdGVtUHJvdmlkZXIgPSBuZXcgQXV0b21hdGljRXhwZXJpbWVudEl0ZW1Qcm92aWRlcih0aGlzKTsNCisJCX0NCisNCisJCXJldHVybiBhdXRvbWF0aWNFeHBlcmltZW50SXRlbVByb3ZpZGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuTW9kaWZpYWJsZVBhcmFtZXRlcn0gaW5zdGFuY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE1vZGlmaWFibGVQYXJhbWV0ZXJJdGVtUHJvdmlkZXIgbW9kaWZpYWJsZVBhcmFtZXRlckl0ZW1Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXJ9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZGlmaWFibGVQYXJhbWV0ZXJBZGFwdGVyKCkgew0KKwkJaWYgKG1vZGlmaWFibGVQYXJhbWV0ZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KKwkJCW1vZGlmaWFibGVQYXJhbWV0ZXJJdGVtUHJvdmlkZXIgPSBuZXcgTW9kaWZpYWJsZVBhcmFtZXRlckl0ZW1Qcm92aWRlcih0aGlzKTsNCisJCX0NCisNCisJCXJldHVybiBtb2RpZmlhYmxlUGFyYW1ldGVySXRlbVByb3ZpZGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgew0KKwkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgew0KKwkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5Ow0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCisJCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsNCisJCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgew0KKwkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsNCisJCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7DQorCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzPD8+KSB8fCAoKChDbGFzczw/Pil0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgew0KKwkJCQlyZXR1cm4gYWRhcHRlcjsNCisJCQl9DQorCQl9DQorDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgew0KKwkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgew0KKwkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn0gYW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisNCisJCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7DQorCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LiANCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQorCQlpZiAoYXV0b21hdGljRXhwZXJpbWVudEl0ZW1Qcm92aWRlciAhPSBudWxsKSBhdXRvbWF0aWNFeHBlcmltZW50SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCisJCWlmIChtb2RpZmlhYmxlUGFyYW1ldGVySXRlbVByb3ZpZGVyICE9IG51bGwpIG1vZGlmaWFibGVQYXJhbWV0ZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC9wcm92aWRlci9Nb2RpZmlhYmxlUGFyYW1ldGVySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL2F1dG9tYXRpY2V4cGVyaW1lbnQvcHJvdmlkZXIvTW9kaWZpYWJsZVBhcmFtZXRlckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYjZmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL2F1dG9tYXRpY2V4cGVyaW1lbnQvcHJvdmlkZXIvTW9kaWZpYWJsZVBhcmFtZXRlckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzA3IEBACitwYWNrYWdlIGF1dG9tYXRpY2V4cGVyaW1lbnQucHJvdmlkZXI7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247DQorDQoraW1wb3J0IGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2U7DQoraW1wb3J0IGF1dG9tYXRpY2V4cGVyaW1lbnQuTW9kaWZpYWJsZVBhcmFtZXRlcjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuTW9kaWZpYWJsZVBhcmFtZXRlcn0gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNb2RpZmlhYmxlUGFyYW1ldGVySXRlbVByb3ZpZGVyDQorCWV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcg0KKwlpbXBsZW1lbnRzDQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwNCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlJdGVtTGFiZWxQcm92aWRlciwNCisJCUlJdGVtUHJvcGVydHlTb3VyY2Ugew0KKwkvKioNCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE1vZGlmaWFibGVQYXJhbWV0ZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQorDQorCQkJYWRkSW5pdGlhbFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkRmVhdHVyZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJCWFkZFN0ZXBQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGRGZWF0dXJlTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJCWFkZExvd2VyQm91bmRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGRVcHBlckJvdW5kUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkVGFyZ2V0VVJJUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbml0aWFsIFZhbHVlIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRJbml0aWFsVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX01vZGlmaWFibGVQYXJhbWV0ZXJfaW5pdGlhbFZhbHVlX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTW9kaWZpYWJsZVBhcmFtZXRlcl9pbml0aWFsVmFsdWVfZmVhdHVyZSIsICJfVUlfTW9kaWZpYWJsZVBhcmFtZXRlcl90eXBlIiksDQorCQkJCSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5MaXRlcmFscy5NT0RJRklBQkxFX1BBUkFNRVRFUl9fSU5JVElBTF9WQUxVRSwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEZlYXR1cmUgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZEZlYXR1cmVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX01vZGlmaWFibGVQYXJhbWV0ZXJfZmVhdHVyZV9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01vZGlmaWFibGVQYXJhbWV0ZXJfZmVhdHVyZV9mZWF0dXJlIiwgIl9VSV9Nb2RpZmlhYmxlUGFyYW1ldGVyX3R5cGUiKSwNCisJCQkJIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkxpdGVyYWxzLk1PRElGSUFCTEVfUEFSQU1FVEVSX19GRUFUVVJFLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3RlcCBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU3RlcFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTW9kaWZpYWJsZVBhcmFtZXRlcl9zdGVwX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTW9kaWZpYWJsZVBhcmFtZXRlcl9zdGVwX2ZlYXR1cmUiLCAiX1VJX01vZGlmaWFibGVQYXJhbWV0ZXJfdHlwZSIpLA0KKwkJCQkgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTGl0ZXJhbHMuTU9ESUZJQUJMRV9QQVJBTUVURVJfX1NURVAsDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBGZWF0dXJlIE5hbWUgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZEZlYXR1cmVOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Nb2RpZmlhYmxlUGFyYW1ldGVyX2ZlYXR1cmVOYW1lX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTW9kaWZpYWJsZVBhcmFtZXRlcl9mZWF0dXJlTmFtZV9mZWF0dXJlIiwgIl9VSV9Nb2RpZmlhYmxlUGFyYW1ldGVyX3R5cGUiKSwNCisJCQkJIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkxpdGVyYWxzLk1PRElGSUFCTEVfUEFSQU1FVEVSX19GRUFUVVJFX05BTUUsDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMb3dlciBCb3VuZCBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTG93ZXJCb3VuZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTW9kaWZpYWJsZVBhcmFtZXRlcl9sb3dlckJvdW5kX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTW9kaWZpYWJsZVBhcmFtZXRlcl9sb3dlckJvdW5kX2ZlYXR1cmUiLCAiX1VJX01vZGlmaWFibGVQYXJhbWV0ZXJfdHlwZSIpLA0KKwkJCQkgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTGl0ZXJhbHMuTU9ESUZJQUJMRV9QQVJBTUVURVJfX0xPV0VSX0JPVU5ELA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVXBwZXIgQm91bmQgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFVwcGVyQm91bmRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX01vZGlmaWFibGVQYXJhbWV0ZXJfdXBwZXJCb3VuZF9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01vZGlmaWFibGVQYXJhbWV0ZXJfdXBwZXJCb3VuZF9mZWF0dXJlIiwgIl9VSV9Nb2RpZmlhYmxlUGFyYW1ldGVyX3R5cGUiKSwNCisJCQkJIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkxpdGVyYWxzLk1PRElGSUFCTEVfUEFSQU1FVEVSX19VUFBFUl9CT1VORCwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRhcmdldCBVUkkgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFRhcmdldFVSSVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTW9kaWZpYWJsZVBhcmFtZXRlcl90YXJnZXRVUklfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Nb2RpZmlhYmxlUGFyYW1ldGVyX3RhcmdldFVSSV9mZWF0dXJlIiwgIl9VSV9Nb2RpZmlhYmxlUGFyYW1ldGVyX3R5cGUiKSwNCisJCQkJIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLkxpdGVyYWxzLk1PRElGSUFCTEVfUEFSQU1FVEVSX19UQVJHRVRfVVJJLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgTW9kaWZpYWJsZVBhcmFtZXRlci5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTW9kaWZpYWJsZVBhcmFtZXRlciIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChNb2RpZmlhYmxlUGFyYW1ldGVyKW9iamVjdCkuZ2V0RmVhdHVyZU5hbWUoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX01vZGlmaWFibGVQYXJhbWV0ZXJfdHlwZSIpIDoNCisJCQlnZXRTdHJpbmcoIl9VSV9Nb2RpZmlhYmxlUGFyYW1ldGVyX3R5cGUiKSArICIgIiArIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQorDQorCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTW9kaWZpYWJsZVBhcmFtZXRlci5jbGFzcykpIHsNCisJCQljYXNlIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLk1PRElGSUFCTEVfUEFSQU1FVEVSX19JTklUSUFMX1ZBTFVFOg0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX1NURVA6DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5NT0RJRklBQkxFX1BBUkFNRVRFUl9fRkVBVFVSRV9OQU1FOg0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX0xPV0VSX0JPVU5EOg0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX1VQUEVSX0JPVU5EOg0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuTU9ESUZJQUJMRV9QQVJBTUVURVJfX1RBUkdFVF9VUkk6DQorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KKwkJcmV0dXJuIEF1dG9tYXRpY2V4cGVyaWVuY2VFZGl0UGx1Z2luLklOU1RBTkNFOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC91dGlsL0F1dG9tYXRpY2V4cGVyaW1lbnRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9hdXRvbWF0aWNleHBlcmltZW50L3V0aWwvQXV0b21hdGljZXhwZXJpbWVudEFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmNTI4YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC91dGlsL0F1dG9tYXRpY2V4cGVyaW1lbnRBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTg1IEBACitwYWNrYWdlIGF1dG9tYXRpY2V4cGVyaW1lbnQudXRpbDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgYXV0b21hdGljZXhwZXJpbWVudC4qOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsNCisNCitpbXBvcnQgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNFeHBlcmltZW50Ow0KK2ltcG9ydCBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlOw0KK2ltcG9ydCBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXI7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLg0KKyAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNleHBlcmltZW50UGFja2FnZQ0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQXV0b21hdGljZXhwZXJpbWVudEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UgbW9kZWxQYWNrYWdlOw0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF1dG9tYXRpY2V4cGVyaW1lbnRBZGFwdGVyRmFjdG9yeSgpIHsNCisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgew0KKwkJCW1vZGVsUGFja2FnZSA9IEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlLmVJTlNUQU5DRTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Lg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsNCisJCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBdXRvbWF0aWNleHBlcmltZW50U3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0NCisJCW5ldyBBdXRvbWF0aWNleHBlcmltZW50U3dpdGNoPEFkYXB0ZXI+KCkgew0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBdXRvbWF0aWNFeHBlcmltZW50KEF1dG9tYXRpY0V4cGVyaW1lbnQgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVBdXRvbWF0aWNFeHBlcmltZW50QWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTW9kaWZpYWJsZVBhcmFtZXRlcihNb2RpZmlhYmxlUGFyYW1ldGVyIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlTW9kaWZpYWJsZVBhcmFtZXRlckFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIDxUPiBBZGFwdGVyIGNhc2VDb21wYXJhYmxlKENvbXBhcmFibGU8VD4gb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7DQorCQkJfQ0KKwkJfTsNCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuDQorCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+Lg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsNCisJCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOw0KKwl9DQorDQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudCA8ZW0+QXV0b21hdGljIEV4cGVyaW1lbnQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNFeHBlcmltZW50DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUF1dG9tYXRpY0V4cGVyaW1lbnRBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgYXV0b21hdGljZXhwZXJpbWVudC5Nb2RpZmlhYmxlUGFyYW1ldGVyIDxlbT5Nb2RpZmlhYmxlIFBhcmFtZXRlcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kaWZpYWJsZVBhcmFtZXRlckFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLmxhbmcuQ29tcGFyYWJsZSA8ZW0+Q29tcGFyYWJsZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlIDxlbT5JZGVudGlmaWFibGU8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30gLy9BdXRvbWF0aWNleHBlcmltZW50QWRhcHRlckZhY3RvcnkNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL2F1dG9tYXRpY2V4cGVyaW1lbnQvdXRpbC9BdXRvbWF0aWNleHBlcmltZW50U3dpdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL2F1dG9tYXRpY2V4cGVyaW1lbnQvdXRpbC9BdXRvbWF0aWNleHBlcmltZW50U3dpdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxNmI1ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvYXV0b21hdGljZXhwZXJpbWVudC91dGlsL0F1dG9tYXRpY2V4cGVyaW1lbnRTd2l0Y2guamF2YQpAQCAtMCwwICsxLDE5MiBAQAorcGFja2FnZSBhdXRvbWF0aWNleHBlcmltZW50LnV0aWw7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGF1dG9tYXRpY2V4cGVyaW1lbnQuKjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsNCisNCitpbXBvcnQgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNFeHBlcmltZW50Ow0KK2ltcG9ydCBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlOw0KK2ltcG9ydCBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXI7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5Lg0KKyAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0NCisgKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsDQorICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QNCisgKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5DQorICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsDQorICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNleHBlcmltZW50UGFja2FnZQ0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQXV0b21hdGljZXhwZXJpbWVudFN3aXRjaDxUMT4gew0KKwkvKioNCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIEF1dG9tYXRpY2V4cGVyaW1lbnRQYWNrYWdlIG1vZGVsUGFja2FnZTsNCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBdXRvbWF0aWNleHBlcmltZW50U3dpdGNoKCkgew0KKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7DQorCQkJbW9kZWxQYWNrYWdlID0gQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuZUlOU1RBTkNFOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsNCisJCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7DQorCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsNCisJCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsNCisJCX0NCisJCWVsc2Ugew0KKwkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOw0KKwkJCXJldHVybg0KKwkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPw0KKwkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOg0KKwkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7DQorCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgew0KKwkJCWNhc2UgQXV0b21hdGljZXhwZXJpbWVudFBhY2thZ2UuQVVUT01BVElDX0VYUEVSSU1FTlQ6IHsNCisJCQkJQXV0b21hdGljRXhwZXJpbWVudCBhdXRvbWF0aWNFeHBlcmltZW50ID0gKEF1dG9tYXRpY0V4cGVyaW1lbnQpdGhlRU9iamVjdDsNCisJCQkJVDEgcmVzdWx0ID0gY2FzZUF1dG9tYXRpY0V4cGVyaW1lbnQoYXV0b21hdGljRXhwZXJpbWVudCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShhdXRvbWF0aWNFeHBlcmltZW50KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShhdXRvbWF0aWNFeHBlcmltZW50KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorCQkJY2FzZSBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5NT0RJRklBQkxFX1BBUkFNRVRFUjogew0KKwkJCQlNb2RpZmlhYmxlUGFyYW1ldGVyIG1vZGlmaWFibGVQYXJhbWV0ZXIgPSAoTW9kaWZpYWJsZVBhcmFtZXRlcil0aGVFT2JqZWN0Ow0KKwkJCQlUMSByZXN1bHQgPSBjYXNlTW9kaWZpYWJsZVBhcmFtZXRlcihtb2RpZmlhYmxlUGFyYW1ldGVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdXRvbWF0aWMgRXhwZXJpbWVudDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF1dG9tYXRpYyBFeHBlcmltZW50PC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VBdXRvbWF0aWNFeHBlcmltZW50KEF1dG9tYXRpY0V4cGVyaW1lbnQgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kaWZpYWJsZSBQYXJhbWV0ZXI8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2RpZmlhYmxlIFBhcmFtZXRlcjwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlTW9kaWZpYWJsZVBhcmFtZXRlcihNb2RpZmlhYmxlUGFyYW1ldGVyIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIDxUPiBUMSBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVDEgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfSAvL0F1dG9tYXRpY2V4cGVyaW1lbnRTd2l0Y2gNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC9BTEdPUklUSE1fU1RBVFVTLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC9BTEdPUklUSE1fU1RBVFVTLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjNTgwMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L0FMR09SSVRITV9TVEFUVVMuamF2YQpAQCAtMCwwICsxLDggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50OworCitwdWJsaWMgZW51bSBBTEdPUklUSE1fU1RBVFVTIHsKKwlTVEFSVElOR19TSU1VTEFUSU9OLAorCUZJTklTSEVEX1NJTVVMQVRJT04sCisJRklOSVNIRURfQUxHT1JJVEhNLAorCVJFU1RBUlRFRF9BTEdPUklUSE07Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC9BYnN0cmFjdEVycm9yQW5hbHlzaXNBbGdvcml0aG0uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L0Fic3RyYWN0RXJyb3JBbmFseXNpc0FsZ29yaXRobS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyODYzMDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC9BYnN0cmFjdEVycm9yQW5hbHlzaXNBbGdvcml0aG0uamF2YQpAQCAtMCwwICsxLDEyNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQ7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkFuYWx5c2lzRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5FcnJvckZ1bmN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW87DQorDQoraW1wb3J0IGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudDsNCitpbXBvcnQgYXV0b21hdGljZXhwZXJpbWVudC5Nb2RpZmlhYmxlUGFyYW1ldGVyOw0KKw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVycm9yQW5hbHlzaXNBbGdvcml0aG0gaW1wbGVtZW50cw0KKwkJRXJyb3JBbmFseXNpc0FsZ29yaXRobSB7DQorCQ0KKwlwcm90ZWN0ZWQgU2NlbmFyaW8gYmFzZVNjZW5hcmlvID0gbnVsbDsNCisJcHJvdGVjdGVkIFNpbXBsZXhBbGdvcml0aG0gc2ltcGxleEFsZ29yaXRobSA9IG5ldyBOZWxkZXJNZWFkQWxnb3JpdGhtKCk7DQorCXByb3RlY3RlZCBTaW1wbGV4RnVuY3Rpb24gc2ltcGxleEZuVG9NaW5pbWl6ZSA9IG51bGw7DQorCXByb3RlY3RlZCBFcnJvckZ1bmN0aW9uIGVycm9yRnVuY3Rpb24gPSBudWxsOw0KKwlwcm90ZWN0ZWQgZG91YmxlW10gaW5pdGlhbFBhcmFtc1ZhbHVlcyA9IG51bGw7DQorCXByb3RlY3RlZCBkb3VibGVbXSBwYXJhbXNJbml0aWFsU3RlcHMgPSBudWxsOw0KKwlwcm90ZWN0ZWQgZG91YmxlIHRvbGVyYW5jZSA9IC0xOw0KKwlwcm90ZWN0ZWQgU3RyaW5nIHJlZmVyZW5jZURhdGFEaXJlY3RvcnkgPSBudWxsOw0KKwlwcm90ZWN0ZWQgbG9uZyBtYXhOdW1PZkl0ZXJhdGlvbnMgPSAtMTsNCisJcHJvdGVjdGVkIExpc3Q8TW9kaWZpYWJsZVBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IG51bGw7DQorCWJvb2xlYW4gcmVwZWF0ID0gZmFsc2U7DQorCXByaXZhdGUgQXJyYXlMaXN0PEVycm9yQW5hbHlzaXNBbGdvcml0aG1MaXN0ZW5lcj4gbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxFcnJvckFuYWx5c2lzQWxnb3JpdGhtTGlzdGVuZXI+KCk7DQorCQ0KKwlhYnN0cmFjdCBwdWJsaWMgdm9pZCBleGVjdXRlKCk7DQorDQorCXB1YmxpYyB2b2lkIHNldEJhc2VTY2VuYXJpbyhTY2VuYXJpbyBiYXNlU2NlbmFyaW8pIHsNCisJCXRoaXMuYmFzZVNjZW5hcmlvID0gYmFzZVNjZW5hcmlvOw0KKwl9DQorDQorCXB1YmxpYyB2b2lkIHNldFRvbGVyYW5jZShkb3VibGUgdG9sZXJhbmNlKSB7DQorCQl0aGlzLnRvbGVyYW5jZSA9IHRvbGVyYW5jZTsNCisJfQ0KKw0KKwlwdWJsaWMgdm9pZCBzZXRFcnJvckZ1bmN0aW9uKEVycm9yRnVuY3Rpb24gZXJyb3JGdW5jdGlvbikgew0KKwkJdGhpcy5lcnJvckZ1bmN0aW9uID0gZXJyb3JGdW5jdGlvbjsNCisJfQ0KKw0KKwlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VEYXRhRGlyZWN0b3J5KFN0cmluZyByZWZlcmVuY2VEYXRhRGlyKSB7DQorCQl0aGlzLnJlZmVyZW5jZURhdGFEaXJlY3RvcnkgPSByZWZlcmVuY2VEYXRhRGlyOw0KKwl9DQorDQorCXB1YmxpYyB2b2lkIGluaXQoQXV0b21hdGljRXhwZXJpbWVudCBhdXRvbWF0aWNFeHBlcmltZW50KSB7DQorCQlzZXRCYXNlU2NlbmFyaW8oYXV0b21hdGljRXhwZXJpbWVudC5nZXRCYXNlU2NlbmFyaW8oKSk7DQorCQlzZXRQYXJhbWV0ZXJzKGF1dG9tYXRpY0V4cGVyaW1lbnQuZ2V0UGFyYW1ldGVycygpKTsNCisJCQ0KKwkJZG91YmxlIHRvbGVyYW5jZSA9IGF1dG9tYXRpY0V4cGVyaW1lbnQuZ2V0VG9sZXJhbmNlKCk7DQorCQlzZXRUb2xlcmFuY2UodG9sZXJhbmNlKTsJCQ0KKwkJbG9uZyBtYXhJdGVyYXRpb25zID0gYXV0b21hdGljRXhwZXJpbWVudC5nZXRNYXhpbXVtTnVtYmVyT2ZJdGVyYXRpb25zKCk7DQorCQlzZXRNYXhpbXVtTnVtYmVyT2ZJdGVyYXRpb25zKG1heEl0ZXJhdGlvbnMpOw0KKwkJDQorCQlib29sZWFuIHJlcGVhdFVudGlsTm9JbXByb3ZlbWVudCA9IGF1dG9tYXRpY0V4cGVyaW1lbnQuaXNSZUluaXQoKTsNCisJCXNldFJlSW5pdChyZXBlYXRVbnRpbE5vSW1wcm92ZW1lbnQpOw0KKwkJDQorCQlFcnJvckZ1bmN0aW9uIGVycm9yRnVuY3Rpb24gPSBudWxsOw0KKwkJU3RyaW5nIGVycm9yRnVuY3Rpb25OYW1lID0gYXV0b21hdGljRXhwZXJpbWVudC5nZXRFcnJvckZ1bmN0aW9uKCk7DQorCQlpZiAoZXJyb3JGdW5jdGlvbk5hbWUuZXF1YWxzKCJUaHJlc2hvbGQgZXJyb3IgZnVuY3Rpb24iKSkgeyAvLyROT04tTkxTLTEkDQorCQkJZXJyb3JGdW5jdGlvbiA9IEFuYWx5c2lzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGhyZXNob2xkRXJyb3JGdW5jdGlvbigpOw0KKwkJfQ0KKwkJaWYgKGVycm9yRnVuY3Rpb25OYW1lLmVxdWFscygiU2ltcGxlIGVycm9yIGZ1bmN0aW9uIikpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCWVycm9yRnVuY3Rpb24gPSBBbmFseXNpc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbXBsZUVycm9yRnVuY3Rpb24oKTsNCisJCX0JCQ0KKwkJc2V0RXJyb3JGdW5jdGlvbihlcnJvckZ1bmN0aW9uKTsNCisJCQ0KKwkJU3RyaW5nIHJlZkRpciA9IGF1dG9tYXRpY0V4cGVyaW1lbnQuZ2V0UmVmZXJhbmNlRGF0YURpcigpOw0KKwkJc2V0UmVmZXJlbmNlRGF0YURpcmVjdG9yeShyZWZEaXIpOw0KKwl9DQorDQorCXB1YmxpYyB2b2lkIHJlaW5pdFN0YXJ0UGFyYW1zKEF1dG9tYXRpY0V4cGVyaW1lbnQgZXhwZXJpbWVudCwgZG91YmxlIFtdIHZhbHMpIHsNCisJCWludCBpPTA7DQorCQlmb3IoTW9kaWZpYWJsZVBhcmFtZXRlciBwOmV4cGVyaW1lbnQuZ2V0UGFyYW1ldGVycygpKSB7DQorCQkJcC5zZXRJbml0aWFsVmFsdWUodmFsc1tpKytdKTsNCisJCX0NCisJCWluaXQoZXhwZXJpbWVudCk7DQorCX0NCisJcHVibGljIGRvdWJsZVtdIGdldFJlc3VsdFBhcmFtZXRlcnMoKSB7DQorCQlyZXR1cm4gc2ltcGxleEFsZ29yaXRobS5nZXRNaW5pbXVtUGFyYW1ldGVyc1ZhbHVlcygpOw0KKwl9DQorDQorCXB1YmxpYyBkb3VibGUgZ2V0UmVzdWx0VmFsdWUoKSB7DQorCQlyZXR1cm4gc2ltcGxleEFsZ29yaXRobS5nZXRNaW5pbXVtRnVuY3Rpb25WYWx1ZSgpOw0KKwl9DQorDQorCXB1YmxpYyB2b2lkIHNldE1heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMobG9uZyBtYXhOdW1PZkl0ZXJhdGlvbnMpIHsNCisJCXRoaXMubWF4TnVtT2ZJdGVyYXRpb25zID0gbWF4TnVtT2ZJdGVyYXRpb25zOw0KKwl9DQorDQorCXB1YmxpYyB2b2lkIHNldFJlSW5pdChib29sZWFuIHJlcGVhdCkgew0KKwkJdGhpcy5yZXBlYXQgPSByZXBlYXQ7DQorCX0NCisJcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhMaXN0PE1vZGlmaWFibGVQYXJhbWV0ZXI+IHBhcmFtZXRlcnMpIHsNCisJCXRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7DQorCQlwYXJhbXNJbml0aWFsU3RlcHMgPSBuZXcgZG91YmxlW3BhcmFtZXRlcnMuc2l6ZSgpXTsNCisJCWluaXRpYWxQYXJhbXNWYWx1ZXMgPSBuZXcgZG91YmxlW3BhcmFtZXRlcnMuc2l6ZSgpXTsNCisJCWludCBpPTA7DQorCQlmb3IgKGZpbmFsIE1vZGlmaWFibGVQYXJhbWV0ZXIgcGFyYW06cGFyYW1ldGVycykgew0KKwkJCXBhcmFtc0luaXRpYWxTdGVwc1tpXSA9IHBhcmFtLmdldFN0ZXAoKTsNCisJCQlpbml0aWFsUGFyYW1zVmFsdWVzW2ldID0gcGFyYW0uZ2V0SW5pdGlhbFZhbHVlKCk7DQorCQkJaSsrOw0KKwkJfQ0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihFcnJvckFuYWx5c2lzQWxnb3JpdGhtTGlzdGVuZXIgbCkge3RoaXMubGlzdGVuZXJzLmFkZChsKTt9DQorCXB1YmxpYyB2b2lkIGNsZWFyTGlzdGVuZXJzKCkge3RoaXMubGlzdGVuZXJzLmNsZWFyKCk7fQ0KKwkNCisJcHJvdGVjdGVkIHZvaWQgZmlyZUV2ZW50KEVycm9yQW5hbHlzaXNBbGdvcml0aG1FdmVudCBldnQpIHsNCisJCWZvcihFcnJvckFuYWx5c2lzQWxnb3JpdGhtTGlzdGVuZXIgbDpsaXN0ZW5lcnMpIGwuZXZlbnRSZWNlaXZlZChldnQpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L0FjdGl2YXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvQWN0aXZhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEzMjFlYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L0FjdGl2YXRvci5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50LmV4ZWN1dGFibGUuQXV0b21hdGljRXhwZXJpbWVudEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47DQoraW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0Ow0KKw0KKy8qKg0KKyAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsNCisNCisJLy8gVGhlIHBsdWctaW4gSUQNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudCI7IC8vJE5PTi1OTFMtMSQNCisNCisJLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQ0KKwlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOw0KKwkNCisJLyoqDQorCSAqIFRoZSBjb25zdHJ1Y3Rvcg0KKwkgKi8NCisJcHVibGljIEFjdGl2YXRvcigpIHsNCisJfQ0KKw0KKwkvKg0KKwkgKiAobm9uLUphdmFkb2MpDQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOw0KKwkJcGx1Z2luID0gdGhpczsNCisJCW5ldyBBdXRvbWF0aWNFeHBlcmltZW50RXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5KCk7DQorCX0NCisNCisJLyoNCisJICogKG5vbi1KYXZhZG9jKQ0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KKwkJcGx1Z2luID0gbnVsbDsNCisJCXN1cGVyLnN0b3AoY29udGV4dCk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQ0KKwkgKg0KKwkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UNCisJICovDQorCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7DQorCQlyZXR1cm4gcGx1Z2luOw0KKwl9DQorCQ0KKwkvKioNCisJICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4gcGx1Zy1pbg0KKwkgKiByZWxhdGl2ZSBwYXRoDQorCSAqIA0KKwkgKiBAcGFyYW0gcGF0aA0KKwkgKiAgICAgICAgICAgIHRoZSBwYXRoDQorCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3INCisJICovDQorCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgew0KKwkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBwYXRoKTsNCisJfQ0KKw0KKwkvKioNCisJICogTG9nIGFuIGVycm9yIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbg0KKwkgKiANCisJICogQHBhcmFtIG1lc3NhZ2UNCisJICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgdGV4dA0KKwkgKiBAcGFyYW0gZXhjZXB0aW9uDQorCSAqICAgICAgICAgICAgdGhlIGFzc29jaWF0ZWQgZXhjZXB0aW9uLCBvciBudWxsDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsNCisJCS8vIERvIHdlIGhhdmUgYSBwbHVnaW4/DQorCQlpZiAocGx1Z2luICE9IG51bGwpIHsNCisJCQkvLyBZZXMNCisJCQlwbHVnaW4uZ2V0TG9nKCkubG9nKA0KKwkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBwbHVnaW4uZ2V0QnVuZGxlKCkNCisJCQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLCAwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsNCisJCX0gZWxzZSB7DQorCQkJLy8gTm8NCisJCQlTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7DQorCQkJLy8gRXhjZXB0aW9uPw0KKwkJCWlmIChleGNlcHRpb24gIT0gbnVsbCkgew0KKwkJCQkvLyBZZXMNCisJCQkJU3lzdGVtLm91dC5wcmludGxuKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOw0KKwkJCX0gLy8gaWYNCisJCX0NCisJfSAvLyBsb2dFcnJvcg0KKwkNCisJDQorDQorCS8qKg0KKwkgKiBMb2cgaW5mb3JtYXRpb24gdG8gdGhlIElMb2cgZm9yIHRoaXMgcGx1Z2luDQorCSAqIA0KKwkgKiBAcGFyYW0gbWVzc2FnZQ0KKwkgKiAgICAgICAgICAgIHRoZSBsb2NhbGl6ZWQgaW5mb3JtYXRpb24gbWVzc2FnZSB0ZXh0DQorCSAqIEBwYXJhbSBleGNlcHRpb24NCisJICogICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwNCisJICovDQorCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dJbmZvcm1hdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgew0KKwkJLy8gRG8gd2UgaGF2ZSBhIHBsdWdpbj8NCisJCWlmIChwbHVnaW4gIT0gbnVsbCkgew0KKwkJCS8vIFllcw0KKwkJCXBsdWdpbi5nZXRMb2coKS5sb2coDQorCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLA0KKwkJCQkJCQkwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsNCisJCX0NCisJCWVsc2Ugew0KKwkJCS8vIE5vDQorCQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOw0KKwkJCS8vIEV4Y2VwdGlvbj8NCisJCQlpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsNCisJCQkJLy8gWWVzDQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbihleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsNCisJCQl9IC8vIGlmIA0KKwkJfQ0KKwl9IC8vIGxvZ0luZm9ybWF0aW9uDQorCQ0KKwkNCisJLyoqDQorCSAqIExvZyBpbmZvcm1hdGlvbiB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4NCisJICogVGhlIG1ldGhvZCBpcyBvdmVybG9hZGVkIHRvIGFsbG93IGZvciBsb2dJbmZvcm1hdGlvbiB3aXRob3V0IGFuIGVycm9yIA0KKwkgKiBtZXRob2Qgc2V0cyB0aGUgZXJyb3IgdG8gbnVsbC4gVGhpcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIFN5c3RlbS5vdXQucHJpbnRsbg0KKwkgKiB0aHJvdWdob3V0IHRoZSBjb2RlLg0KKwkgKiBAcGFyYW0gbWVzc2FnZQ0KKwkgKiAgICAgICAgICAgIHRoZSBsb2NhbGl6ZWQgaW5mb3JtYXRpb24gbWVzc2FnZSB0ZXh0DQorCSAqDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW5mb3JtYXRpb24oU3RyaW5nIG1lc3NhZ2UpIHsNCisJCS8vIERvIHdlIGhhdmUgYSBwbHVnaW4/DQorCQlpZiAocGx1Z2luICE9IG51bGwpIHsNCisJCQkvLyBZZXMNCisJCQlwbHVnaW4uZ2V0TG9nKCkubG9nKA0KKwkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwNCisJCQkJCQkJMCwgbWVzc2FnZSwgbnVsbCkpOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJLy8gTm8NCisJCQlTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7DQorCQl9DQorCX0gLy8gbG9nSW5mb3JtYXRpb24NCisNCisJDQorCQ0KKw0KKw0KKwkNCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvQXV0b21hdGljRXhwZXJpbWVudEpvYi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvQXV0b21hdGljRXhwZXJpbWVudEpvYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOGE3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC9BdXRvbWF0aWNFeHBlcmltZW50Sm9iLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50Ow0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uRXhlY3V0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQorDQoraW1wb3J0IGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudDsNCisNCisNCitwdWJsaWMgY2xhc3MgQXV0b21hdGljRXhwZXJpbWVudEpvYiBleHRlbmRzIEV4ZWN1dGFibGUgew0KKwkNCisJcHJvdGVjdGVkIEF1dG9tYXRpY0V4cGVyaW1lbnQgYXV0b21hdGljRXhwZXJpbWVudCA9IG51bGw7DQorCXByb3RlY3RlZCBTaGVsbCBzaGVsbCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCk7DQorCXByb3RlY3RlZCBib29sZWFuIGlzUnVubmluZyA9IGZhbHNlOw0KKw0KKwlwdWJsaWMgQXV0b21hdGljRXhwZXJpbWVudEpvYihTdHJpbmcgdGl0bGUsIGludCBzZXF1ZW5jZU51bWJlcikgew0KKwkJc3VwZXIodGl0bGUgPT0gbnVsbCA/ICIiIDogdGl0bGUsIHNlcXVlbmNlTnVtYmVyKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorCQ0KKwlwdWJsaWMgQXV0b21hdGljRXhwZXJpbWVudEpvYihBdXRvbWF0aWNFeHBlcmltZW50IHRvUnVuKSB7DQorCQl0aGlzKHRvUnVuLmdldER1YmxpbkNvcmUoKS5nZXRUaXRsZSgpLCAxKTsNCisJCXRoaXMuYXV0b21hdGljRXhwZXJpbWVudCA9IHRvUnVuOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KKwkJSVN0YXR1cyByZXRWYWx1ZSA9IFN0YXR1cy5PS19TVEFUVVM7DQorLy8JCWlzUnVubmluZyA9IHRydWU7DQorLy8JCQ0KKy8vCQkvL1J1bg0KKy8vCQlFcnJvckFuYWx5c2lzQWxnb3JpdGhtIGFsZ29yaXRobSA9IG51bGw7DQorLy8JCVN0cmluZyBhbGdvcml0aG1OYW1lID0gYXV0b21hdGljRXhwZXJpbWVudC5nZXRFcnJvckFuYWx5c2lzQWxnb3JpdGhtKCk7DQorLy8JCWlmIChhbGdvcml0aG1OYW1lLmVxdWFscygiTmVkbGVyLU1lYWQgQWxnb3JpdGhtIikpIHsNCisvLwkJCWFsZ29yaXRobSA9IG5ldyBTaW1wbGV4QWxnb3JpdGhtRXhlY3V0ZXIoc2hlbGwpOw0KKy8vCQl9DQorLy8JCWFsZ29yaXRobS5zZXRCYXNlU2NlbmFyaW8oYXV0b21hdGljRXhwZXJpbWVudC5nZXRCYXNlU2NlbmFyaW8oKSk7DQorLy8JCQ0KKy8vCQlpbnQgbnVtT2ZQYXJhbXMgPSBhdXRvbWF0aWNFeHBlcmltZW50LmdldFBhcmFtZXRlcnMoKS5zaXplKCk7DQorLy8JCWRvdWJsZVtdIGluaXRpYWxQYXJhbXNWYWx1ZXMgPSBuZXcgZG91YmxlW251bU9mUGFyYW1zXTsgDQorLy8JCWRvdWJsZVtdIHBhcmFtc1N0ZXBzID0gbmV3IGRvdWJsZVtudW1PZlBhcmFtc107DQorLy8JCVN0cmluZ1tdIHBhcmFtc05hbWVzID0gbmV3IFN0cmluZ1tudW1PZlBhcmFtc107DQorLy8JCQ0KKy8vCQlpbnQgaW5kZXggPSAwOw0KKy8vCQlmb3IgKE1vZGlmaWFibGVQYXJhbWV0ZXIgcGFyYW1ldGVyOmF1dG9tYXRpY0V4cGVyaW1lbnQuZ2V0UGFyYW1ldGVycygpKSB7DQorLy8JCQlpbml0aWFsUGFyYW1zVmFsdWVzW2luZGV4XSA9IHBhcmFtZXRlci5nZXRJbml0aWFsVmFsdWUoKTsNCisvLwkJCXBhcmFtc1N0ZXBzW2luZGV4XSA9IHBhcmFtZXRlci5nZXRTdGVwKCk7DQorLy8JCQlwYXJhbXNOYW1lc1tpbmRleF0gPSBwYXJhbWV0ZXIuZ2V0RmVhdHVyZU5hbWUoKTsNCisvLwkJCWluZGV4Kys7DQorLy8JCX0NCisvLwkJYWxnb3JpdGhtLnNldEluaXRpYWxQYXJhbWV0ZXJzVmFsdWVzKGluaXRpYWxQYXJhbXNWYWx1ZXMpOw0KKy8vCQlhbGdvcml0aG0uc2V0UGFyYW1ldGVyc1N0ZXBzKHBhcmFtc1N0ZXBzKTsNCisvLwkJYWxnb3JpdGhtLnNldFBhcmFtZXRlcnMoYXV0b21hdGljRXhwZXJpbWVudC5nZXRQYXJhbWV0ZXJzKCkpOw0KKy8vCQkNCisvLwkJZG91YmxlIHRvbGVyYW5jZSA9IGF1dG9tYXRpY0V4cGVyaW1lbnQuZ2V0VG9sZXJhbmNlKCk7DQorLy8JCWFsZ29yaXRobS5zZXRUb2xlcmFuY2UodG9sZXJhbmNlKTsJCQ0KKy8vCQkNCisvLwkJRXJyb3JGdW5jdGlvbiBlcnJvckZ1bmN0aW9uID0gbnVsbDsNCisvLwkJU3RyaW5nIGVycm9yRnVuY3Rpb25OYW1lID0gYXV0b21hdGljRXhwZXJpbWVudC5nZXRFcnJvckZ1bmN0aW9uKCk7DQorLy8JCWlmIChlcnJvckZ1bmN0aW9uTmFtZS5lcXVhbHMoIlRocmVzaG9sZCBlcnJvciBmdW5jdGlvbiIpKSB7DQorLy8JCQllcnJvckZ1bmN0aW9uID0gQW5hbHlzaXNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUaHJlc2hvbGRFcnJvckZ1bmN0aW9uKCk7DQorLy8JCX0NCisvLwkJaWYgKGVycm9yRnVuY3Rpb25OYW1lLmVxdWFscygiU2ltcGxlIGVycm9yIGZ1bmN0aW9uIikpIHsNCisvLwkJCWVycm9yRnVuY3Rpb24gPSBBbmFseXNpc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbXBsZUVycm9yRnVuY3Rpb24oKTsNCisvLwkJfQkJDQorLy8JCWFsZ29yaXRobS5zZXRFcnJvckZ1bmN0aW9uKGVycm9yRnVuY3Rpb24pOw0KKy8vCQkNCisvLwkJU3RyaW5nIHJlZkRpciA9IGF1dG9tYXRpY0V4cGVyaW1lbnQuZ2V0UmVmZXJhbmNlRGF0YURpcigpOw0KKy8vCQlhbGdvcml0aG0uc2V0UmVmZXJlbmNlRGF0YURpcmVjdG9yeShyZWZEaXIpOw0KKy8vCQkNCisvLwkJYWxnb3JpdGhtLmluaXQoKTsNCisvLwkJDQorLy8JCWxvbmcgYmVmb3JlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7DQorLy8JCWFsZ29yaXRobS5leGVjdXRlKCk7DQorLy8JCWxvbmcgYWZ0ZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsNCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCJUaW1lIHRvIGV4ZWN1dGUgdGhlIE5lZGxlci1NZWFkIEFsZ29yaXRobTogIiArIChhZnRlci1iZWZvcmUpLzEwMDAgKyAiIHNlY29uZHMiKTsNCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCJNaW5pbXVtIHZhbHVlOiAiICsgYWxnb3JpdGhtLmdldFJlc3VsdFZhbHVlKCkpOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50KCJQYXJhbWV0ZXJzIHZhbHVlczogIik7DQorLy8JCWZvciAoZG91YmxlIHBhcmFtOmFsZ29yaXRobS5nZXRSZXN1bHRQYXJhbWV0ZXJzKCkpIHsNCisvLwkJCVN5c3RlbS5vdXQucHJpbnQocGFyYW0gKyAiLCAiKTsNCisvLwkJfQ0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsNCisvLwkJDQorLy8JCWlzUnVubmluZyA9IGZhbHNlOw0KKwkJcmV0dXJuIHJldFZhbHVlOw0KKwl9DQorDQorCXB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsNCisJCXJldHVybiBpc1J1bm5pbmc7DQorCX0NCisNCisJcHVibGljIHZvaWQgcGF1c2UoKSB7DQorCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQorCQkNCisJfQ0KKw0KKwlwdWJsaWMgdm9pZCByZXNldCgpIHsNCisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCisJCQ0KKwl9DQorDQorCXB1YmxpYyB2b2lkIHJ1bigpIHsJCQ0KKwkJc2NoZWR1bGUoKTsJCQkJDQorCX0NCisNCisJcHVibGljIHZvaWQgc3RlcCgpIHsNCisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCisJCQ0KKwl9DQorDQorCXB1YmxpYyB2b2lkIHN0b3AoKSB7DQorCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCQkNCisJfQ0KKwkNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L0F1dG9tYXRpY0V4cGVyaW1lbnRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ3ZWNhYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L0F1dG9tYXRpY0V4cGVyaW1lbnRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOworCitpbXBvcnQgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNFeHBlcmltZW50OworCitwdWJsaWMgY2xhc3MgQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXIgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIEF1dG9tYXRpY0V4cGVyaW1lbnRNYW5hZ2VyIGluc3RhbmNlID0gbmV3IEF1dG9tYXRpY0V4cGVyaW1lbnRNYW5hZ2VyKCk7CisJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIFFVSVRfTk9XID0gZmFsc2U7CisJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIFBBVVNFX05PVyA9IGZhbHNlOworCXByb3RlY3RlZCBzdGF0aWMgQ291bnREb3duTGF0Y2ggc3RvcExhdGNoID0gbnVsbDsKKwlwcm90ZWN0ZWQgc3RhdGljIEVycm9yQW5hbHlzaXNBbGdvcml0aG0gY3VycmVudFJ1bm5pbmdBbGdvcml0aG0gPSBudWxsOworCXByb3RlY3RlZCBzdGF0aWMgQXV0b21hdGljRXhwZXJpbWVudCBjdXJyZW50UnVubmluZ0V4cGVyaWVudDsKKwkKKwlwdWJsaWMgdm9pZCBxdWl0Tm93KCkgeworCQlzdG9wTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisJCVFVSVRfTk9XID0gdHJ1ZTsKKwkJdHJ5IHsKKwkJCXN0b3BMYXRjaC5hd2FpdCgpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCQorCXB1YmxpYyBzdGF0aWMgdm9pZCBwYXVzZSgpIHsKKwkJUEFVU0VfTk9XID0gdHJ1ZTsKKwkJLy8gVE9ETyAgUGxlYXNlIHBhdXNlIG5vdyBpZiB3ZSB3YW50IHBhdXNlCisJfQorCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250aW51ZVJ1bigpIHsKKwkJUEFVU0VfTk9XID0gZmFsc2U7CisJCS8vIFRPRE8gIFBsZWFzZSBjb250aW51ZSBub3cgaWYgd2Ugd2FudCBDb250aW51ZQorCX0KKwkKKwlwdWJsaWMgdm9pZCByZXN0YXJ0Tm93KGRvdWJsZVtdIHJlc3RhcnRQYXJhbVZhbHVlcykgeworCQkvLyBUT0RPICAgUmVzdGFydCB3aXRoIHRoZSB2YWx1ZWQgcHJvdmlkZWQKKwkJUVVJVF9OT1cgPSBmYWxzZTsKKwkJY3VycmVudFJ1bm5pbmdBbGdvcml0aG0ucmVpbml0U3RhcnRQYXJhbXMoY3VycmVudFJ1bm5pbmdFeHBlcmllbnQsIHJlc3RhcnRQYXJhbVZhbHVlcyk7CisJCWN1cnJlbnRSdW5uaW5nQWxnb3JpdGhtLmNsZWFyTGlzdGVuZXJzKCk7CisJCS8vIFN0ZWZhbiBmaXgsIHdlIGNhbid0IGhvbGQgdXAgdGhlIFVJIHRocmVhZCwgaXQgY2F1c2VzIG1lbW9yeSBsZWFrcworCQlKb2IgaiA9IG5ldyBKb2IoIk1pbmltaXplciBhbGdvcml0aCIpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJCWN1cnJlbnRSdW5uaW5nQWxnb3JpdGhtLmV4ZWN1dGUoKTsKKwkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCX0KKwkJfTsKKwkJCisJCUF1dG9tYXRpY0V4cGVyaW1lbnRNYW5hZ2VyRXZlbnQgbmV3RXZlbnQgPSBuZXcgQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXJFdmVudChjdXJyZW50UnVubmluZ0V4cGVyaWVudCwgY3VycmVudFJ1bm5pbmdBbGdvcml0aG0sIE1BTkFHRVJfU1RBVFVTLlNDSEVEVUxFRCk7CisJCWZpcmVFdmVudChuZXdFdmVudCk7CisJCWouc2NoZWR1bGUoKTsKKwl9CisKKwlwcml2YXRlIEFycmF5TGlzdDxBdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlckxpc3RlbmVyPiBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PEF1dG9tYXRpY0V4cGVyaW1lbnRNYW5hZ2VyTGlzdGVuZXI+KCk7CisJCisJcHJpdmF0ZSBBdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlcigpIHsKKwl9CisJcHVibGljIHN0YXRpYyBBdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlciBnZXRJbnN0YW5jZSgpIAorCXsKKwkJcmV0dXJuIGluc3RhbmNlOworCX0KKwkKKwlwdWJsaWMgRXJyb3JBbmFseXNpc0FsZ29yaXRobSBjcmVhdGVBbGdvcml0aG0oU3RyaW5nIG5hbWUpIHsKKwkJUVVJVF9OT1cgPSBmYWxzZTsgLy8gaW4gY2FzZSBSRVNUQVJUSU5HCisJCVBBVVNFX05PVyA9IGZhbHNlOworCQlFcnJvckFuYWx5c2lzQWxnb3JpdGhtIHJlc3VsdCA9IEVycm9yQW5hbHlzaXNBbGdvcml0aG1GYWN0b3J5LklOU1RBTkNFLmNyZWF0ZUVycm9yQW5hbHlzaXNBbGdvcml0aG0obmFtZSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCXB1YmxpYyB2b2lkIGV4ZWN1dGVBbGdvcml0aG0oZmluYWwgRXJyb3JBbmFseXNpc0FsZ29yaXRobSBhbGdvcml0aG0sIGZpbmFsIEF1dG9tYXRpY0V4cGVyaW1lbnQgYXV0b21hdGljRXhwZXJpbWVudCkgeworCQlRVUlUX05PVyA9IGZhbHNlOyAvLyBpbiBjYXNlIFJFU1RBUlRJTkcKKwkJUEFVU0VfTk9XID0gZmFsc2U7CisJCWN1cnJlbnRSdW5uaW5nQWxnb3JpdGhtID0gYWxnb3JpdGhtOworCQljdXJyZW50UnVubmluZ0V4cGVyaWVudCA9IGF1dG9tYXRpY0V4cGVyaW1lbnQ7CisJCQorCQlhbGdvcml0aG0uaW5pdChhdXRvbWF0aWNFeHBlcmltZW50LCBhbGdvcml0aG0pOworCQkvLyBTdGVmYW4gZml4LCB3ZSBjYW4ndCBob2xkIHVwIHRoZSBVSSB0aHJlYWQsIGl0IGNhdXNlcyBtZW1vcnkgbGVha3MKKwkJSm9iIGogPSBuZXcgSm9iKCJNaW5pbWl6ZXIgYWxnb3JpdGgiKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQlhbGdvcml0aG0uZXhlY3V0ZSgpOworCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQkJfQorCQl9OworCQkKKwkJQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXJFdmVudCBuZXdFdmVudCA9IG5ldyBBdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlckV2ZW50KGF1dG9tYXRpY0V4cGVyaW1lbnQsIGFsZ29yaXRobSwgTUFOQUdFUl9TVEFUVVMuU0NIRURVTEVEKTsKKwkJZmlyZUV2ZW50KG5ld0V2ZW50KTsKKwkJai5zY2hlZHVsZSgpOworCX0KKwkKKwlwcml2YXRlICB2b2lkIGZpcmVFdmVudChBdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlckV2ZW50IGV2dCkgeworCQlmb3IoQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXJMaXN0ZW5lciBsOmxpc3RlbmVycykgbC5ldmVudFJlY2VpdmVkKGV2dCk7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKEF1dG9tYXRpY0V4cGVyaW1lbnRNYW5hZ2VyTGlzdGVuZXIgbCkgeworCQl0aGlzLmxpc3RlbmVycy5hZGQobCk7CisJfQorCQorCXB1YmxpYyB2b2lkIGNsZWFyTGlzdGVuZXJzKCkgeworCQl0aGlzLmxpc3RlbmVycy5jbGVhcigpOworCX0KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbigpIHsKKwkJUVVJVF9OT1cgPSBmYWxzZTsgLy8gaW4gY2FzZSBSRVNUQVJUSU5HCisJCVBBVVNFX05PVyA9IGZhbHNlOworCQlBdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlciBtYW5hZ2VyID0gQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKKwkJbWFuYWdlci5hZGRMaXN0ZW5lcihuZXcgQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXJMaXN0ZW5lcigpIHsKKwkJCQorCQkJcHVibGljIHZvaWQgZXZlbnRSZWNlaXZlZChBdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlckV2ZW50IGV2dCkgeworCQkJCWlmKGV2dC5zdGF0dXMgPT0gTUFOQUdFUl9TVEFUVVMuU0NIRURVTEVEKSB7CisJCQkJCUVycm9yQW5hbHlzaXNBbGdvcml0aG0gYWxnID0gZXZ0LmFsZ29yaXRobTsKKwkJCQkJCisJCQkJCWFsZy5hZGRMaXN0ZW5lcihuZXcgRXJyb3JBbmFseXNpc0FsZ29yaXRobUxpc3RlbmVyKCkgeworCQkJCQkJCisJCQkJCQlwdWJsaWMgdm9pZCBldmVudFJlY2VpdmVkKEVycm9yQW5hbHlzaXNBbGdvcml0aG1FdmVudCBldnQpIHsKKwkJCQkJCQlpZihldnQuc3RhdHVzID09IEFMR09SSVRITV9TVEFUVVMuRklOSVNIRURfQUxHT1JJVEhNKSB7CisJCQkJCQkJCS8vIFRoZSBhbGdvcml0aG0gaGFzIGZpbmlzaGVkLiBTbWFsbGVzdCB2YWx1ZSBpbiAKKwkJCQkJCQkJLy9ldnQucmVzdWx0CisJCQkJCQkJfSBlbHNlIGlmKGV2dC5zdGF0dXMgPT0gQUxHT1JJVEhNX1NUQVRVUy5GSU5JU0hFRF9TSU1VTEFUSU9OKSB7CisJCQkJCQkJCS8vIE9uZSBzaW11bGF0aW9uIGlzIGRvbmUuIFRoZSByZXN1bHQgaXMgaW4gZXZ0LnJlc3VsdAorCQkJCQkJCX0gZWxzZSBpZihldnQuc3RhdHVzID09IEFMR09SSVRITV9TVEFUVVMuUkVTVEFSVEVEX0FMR09SSVRITSkgeworCQkJCQkJCQkvLyBUaGUgYWxnb3JpdGhtIGhhcyByZXN0YXJ0ZWQuIFNtYWxsZXN0IHZhbHVlIGluIAorCQkJCQkJCQkvLyBldnQucmVzdWx0CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9CisJCQl9CisJCX0pOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L0F1dG9tYXRpY0V4cGVyaW1lbnRNYW5hZ2VyRXZlbnQuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L0F1dG9tYXRpY0V4cGVyaW1lbnRNYW5hZ2VyRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmI2MDgyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXJFdmVudC5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50OworCitpbXBvcnQgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNFeHBlcmltZW50OworCitwdWJsaWMgY2xhc3MgQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXJFdmVudCB7CisKKwlwdWJsaWMgQXV0b21hdGljRXhwZXJpbWVudCBleHBlcmltZW50OworCXB1YmxpYyBFcnJvckFuYWx5c2lzQWxnb3JpdGhtIGFsZ29yaXRobTsKKwlwdWJsaWMgTUFOQUdFUl9TVEFUVVMgc3RhdHVzOworCQorCXB1YmxpYyBBdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlckV2ZW50KEF1dG9tYXRpY0V4cGVyaW1lbnQgYXV0b21hdGljRXhwZXJpbWVudCwgRXJyb3JBbmFseXNpc0FsZ29yaXRobSBhbGdvcml0aG0sIE1BTkFHRVJfU1RBVFVTIHN0YXQpIHsKKwkJdGhpcy5leHBlcmltZW50ID0gYXV0b21hdGljRXhwZXJpbWVudDsKKwkJdGhpcy5hbGdvcml0aG0gPSBhbGdvcml0aG07CisJCXRoaXMuc3RhdHVzID0gc3RhdDsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC9BdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlckxpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC9BdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlckxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyNWYyMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L0F1dG9tYXRpY0V4cGVyaW1lbnRNYW5hZ2VyTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50OworCitwdWJsaWMgaW50ZXJmYWNlIEF1dG9tYXRpY0V4cGVyaW1lbnRNYW5hZ2VyTGlzdGVuZXIgeworCisJcHVibGljIHZvaWQgZXZlbnRSZWNlaXZlZChBdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlckV2ZW50IGV2dCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC9DdXN0b21TaW11bGF0aW9uTWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvQ3VzdG9tU2ltdWxhdGlvbk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGUxNjMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvQ3VzdG9tU2ltdWxhdGlvbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDI1MSBAQAorLy8gU2ltdWxhdGlvbk1hbmFnZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW9QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uRXhlY3V0YWJsZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uRXZlbnQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSBsaWZlLWN5Y2xlIG9mIGFjdGl2ZSB7QGxpbmsgU2ltdWxhdGlvbn1zLiBUaGVyZSBpcyBhCisgKiBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIG1hbmFnZXIgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIHBhcnRzIG9mIHRoZQorICogc3lzdGVtIHRvIG1hbmFnZSB7QGxpbmsgU2ltdWxhdGlvbn0uIEl0IGNyZWF0ZXMge0BsaW5rIFNpbXVsYXRpb259IGluc3RhbmNlcworICogZnJvbSB7QGxpbmsgU2NlbmFyaW99IGluc3RhbmNlcyBhbmQgY2FuIG9idGFpbiB7QGxpbmsgU2NlbmFyaW99IGluc3RhbmNlcworICogZnJvbSBmaWxlIFVSSSdzIG9yIGZyb20ge0BsaW5rIElDb25maWd1cmF0aW9uRWxlbWVudH0ncy4gSXQgbWFpbnRhaW5zIGEKKyAqIGNvbGxlY3Rpb24gb2YgYWxsIG9mIHRoZSBhY3RpdmUge0BsaW5rIFNpbXVsYXRpb259cyBpbiB0aGUgc3lzdGVtIGFuZAorICogZ2VuZXJhdGVzIHtAbGluayBTaW11bGF0aW9uRXZlbnR9J3Mgd2hlbmV2ZXIgYSB7QGxpbmsgU2ltdWxhdGlvbn0gaXMgYWRkZWQgdG8KKyAqIHRoYXQgY29sbGVjdGlvbiBvciByZW1vdmVkLgorICogPHA+CisgKiBUaGUge0BsaW5rIEN1c3RvbVNpbXVsYXRpb25NYW5hZ2VyfSBtYWludGFpbnMgYSBzZXF1ZW5jZSBudW1iZXIgYW5kIGFzc2lnbnMKKyAqIHN1Y2Nlc3NpdmUgdmFsdWVzIG9mIHRoYXQgbnVtYmVyIHRvIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0gaW5zdGFuY2VzIGl0CisgKiBjcmVhdGVzLgorICovCitwdWJsaWMgY2xhc3MgQ3VzdG9tU2ltdWxhdGlvbk1hbmFnZXIgZXh0ZW5kcyBFeGVjdXRhYmxlTWFuYWdlciB7CisKKwkvKioKKwkgKiBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIG1hbmFnZXIKKwkgKi8KKwlwcml2YXRlIHZvbGF0aWxlIHN0YXRpYyBDdXN0b21TaW11bGF0aW9uTWFuYWdlciBJTlNUQU5DRSA9IG51bGw7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzZXF1ZW5jZSBudW1iZXIgYXNzaWduZWQgdG8gZWFjaCBzdWNjZXNzaXZlCisJICoge0BsaW5rIFNpbXVsYXRpb259IGluc3RhbmNlIHRoZSBtYW5hZ2VyIGNyZWF0ZXMuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgaW50IHNlcXVlbmNlTnVtYmVyID0gMDsKKworCS8qKgorCSAqIENvbnN0YW50IGVtcHR5IGFycmF5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSVNpbXVsYXRpb25bXSBOT05FID0gbmV3IFNpbXVsYXRpb25bXSB7fTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gb2YgYWN0aXZlIHtAbGluayBTaW11bGF0aW9ufSBqb2JzCisJICovCisJcHJpdmF0ZSBMaXN0PElTaW11bGF0aW9uPiBhY3RpdmVTaW11bGF0aW9ucyA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqLworCXByaXZhdGUgQ3VzdG9tU2ltdWxhdGlvbk1hbmFnZXIoKSB7CisJCWFjdGl2ZVNpbXVsYXRpb25zID0gbmV3IEFycmF5TGlzdDxJU2ltdWxhdGlvbj4oKTsKKworCQlSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgKKwkJCQlTY2VuYXJpb1BhY2thZ2UuZU5BTUUsIG5ldyBYTUlSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOworCX0gLy8gU2ltdWxhdGlvbk1hbmFnZXIKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEN1c3RvbVNpbXVsYXRpb25NYW5hZ2VyIGdldE1hbmFnZXIoKSB7CisJCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7CisJCQlzeW5jaHJvbml6ZWQgKEN1c3RvbVNpbXVsYXRpb25NYW5hZ2VyLmNsYXNzKSB7CisJCQkJaWYgKElOU1RBTkNFID09IG51bGwpIHsKKwkJCQkJSU5TVEFOQ0UgPSBuZXcgQ3VzdG9tU2ltdWxhdGlvbk1hbmFnZXIoKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIElOU1RBTkNFOworCX0gLy8gZ2V0TW9kZWwKKworCS8qKgorCSAqIFJldHVybiB0aGUgbmV4dCBzaW11bGF0aW9uIHNlcXVlbmNlIG51bWJlciBhbmQgaW5jcmVtZW50IHRoZSB2YWx1ZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuZXh0IHNpbXVsYXRpb24gc2VxdWVuY2UgbnVtYmVyCisJICovCisJc3luY2hyb25pemVkIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBnZXRBbmRJbmNyZW1lbnRTaW11bGF0aW9uU2VxdWVuY2VOdW1iZXIoKSB7CisJCXJldHVybiBzZXF1ZW5jZU51bWJlcisrOworCX0gLy8gZ2V0QW5kSW5jcmVtZW50U2ltdWxhdGlvblNlcXVlbmNlTnVtYmVyCisKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgdG8gcmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBtb2RlbC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVzZXRTaW11bGF0aW9uTWFuYWdlcigpIHsKKwkJSU5TVEFOQ0UgPSBudWxsOworCQlzZXF1ZW5jZU51bWJlciA9IDA7CisJfSAvLyByZXNldFNpbXVsYXRpb25NYW5hZ2VyCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBhY3RpdmUge0BsaW5rIFNpbXVsYXRpb259cworCSAqLworCXB1YmxpYyBmaW5hbCBMaXN0PElTaW11bGF0aW9uPiBnZXRBY3RpdmVTaW11bGF0aW9ucygpIHsKKwkJcmV0dXJuIGFjdGl2ZVNpbXVsYXRpb25zOworCX0gLy8gZ2V0QWN0aXZlU2ltdWxhdGlvbnMKKworCS8qKgorCSAqIEFkZCBhIHtAbGluayBTaW11bGF0aW9ufSB0byB0aGUgY29sbGVjdGlvbiBvZiBhY3RpdmUge0BsaW5rIFNpbXVsYXRpb259cy4KKwkgKiAKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbgorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBJU2ltdWxhdGlvbn0gdG8gYWRkCisJICovCisJcHJpdmF0ZSBmaW5hbCB2b2lkIGFkZEFjdGl2ZVNpbXVsYXRpb24oZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbikgeworCQlhY3RpdmVTaW11bGF0aW9ucy5hZGQoc2ltdWxhdGlvbik7CisJfSAvLyBhZGRBY3RpdmVTaW11bGF0aW9uCisKKwkvKioKKwkgKiBSZW1vdmUgYW4ge0BsaW5rIElTaW11bGF0aW9ufSBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGFjdGl2ZQorCSAqIHtAbGluayBJU2ltdWxhdGlvbn1zLgorCSAqIAorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogICAgICAgICAgICB0aGUge0BsaW5rIElTaW11bGF0aW9ufSB0byByZW1vdmUKKwkgKi8KKwlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVBY3RpdmVTaW11bGF0aW9uKGZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb24pIHsKKwkJYWN0aXZlU2ltdWxhdGlvbnMucmVtb3ZlKHNpbXVsYXRpb24pOworCX0gLy8gcmVtb3ZlQWN0aXZlU2ltdWxhdGlvbgorCisJLyoqCisJICogQ3JlYXRlIGEge0BsaW5rIElTaW11bGF0aW9ufSBmcm9tIGEge0BsaW5rIFNjZW5hcmlvfSBpbnN0YW5jZS4KKwkgKiAKKwkgKiBAcGFyYW0gc2NlbmFyaW8KKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgU2NlbmFyaW99IHRvIHNpbXVsYXRlCisJICogQHBhcmFtIG1vbml0b3IgCisJICogCQkJICBQcm9ncmVzcyBtb25pdG9yCisJICogQHJldHVybiBhIHtAbGluayBJU2ltdWxhdGlvbn0gdGhhdCdzIHJlYWR5IHRvIHJ1bi4KKwkgKi8KKwlwdWJsaWMgSVNpbXVsYXRpb24gY3JlYXRlU2ltdWxhdGlvbihmaW5hbCBTY2VuYXJpbyBzY2VuYXJpbywgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCUlTaW11bGF0aW9uIHJldFZhbHVlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWJvb2xlYW4gdXNlQ2FjaGUgPSBmYWxzZTsKKworCQkJU2NlbmFyaW8gc2ltdWxhdGlvblNjZW5hcmlvID0gbnVsbDsKKwkJCQorCQkJaWYgKHVzZUNhY2hlKSB7CisJCQkJaWYgKFNpbXVsYXRpb25DYWNoaW5nLklOU1RBTkNFLmlzU2NlbmFyaW9JbkNhY2hlKHNjZW5hcmlvLmdldFVSSSgpKSkgeworCQkJCQlzaW11bGF0aW9uU2NlbmFyaW8gPSBTaW11bGF0aW9uQ2FjaGluZy5JTlNUQU5DRS5nZXRDYWNoZWRTY2VuYXJpbyhzY2VuYXJpby5nZXRVUkkoKSk7CisJCQkJCWJvb2xlYW4gcnVubmluZyA9IGZhbHNlOworCQkJCQlmb3IoSVNpbXVsYXRpb24gc2ltIDogZ2V0QWN0aXZlU2ltdWxhdGlvbnMoKSkgeworCQkJCQkJaWYoc2ltLmdldFNjZW5hcmlvKCkuZXF1YWxzKHNpbXVsYXRpb25TY2VuYXJpbykpIHsKKwkJCQkJCQkvLyBUaGUgc2NlbmFyaW8gaXMgYWxyZWFkeSBydW5uaW5nLiBDb3B5IHRoZSB3aG9sZSBzY2VuYXJpbyBiZWZvcmUgcmVzZXR0aW5nCisJCQkJCQkJU2NlbmFyaW8gbmV3U2ltdWxhdGlvbiA9IG51bGw7CisJCQkJCQkJbmV3U2ltdWxhdGlvbiA9IChTY2VuYXJpbylFY29yZVV0aWwuY29weShzaW11bGF0aW9uU2NlbmFyaW8pOworCQkJCQkJCWlmKHNpbXVsYXRpb25TY2VuYXJpby5nZXRNb2RlbCgpICE9IG51bGwpIG5ld1NpbXVsYXRpb24uc2V0TW9kZWwoKE1vZGVsKUVjb3JlVXRpbC5jb3B5KHNpbXVsYXRpb25TY2VuYXJpby5nZXRNb2RlbCgpKSk7CisJCQkJCQkJaWYoc2ltdWxhdGlvblNjZW5hcmlvLmdldFNlcXVlbmNlcigpICE9IG51bGwpIG5ld1NpbXVsYXRpb24uc2V0U2VxdWVuY2VyKChTZXF1ZW5jZXIpRWNvcmVVdGlsLmNvcHkoc2ltdWxhdGlvblNjZW5hcmlvLmdldFNlcXVlbmNlcigpKSk7CisJCQkJCQkJcnVubmluZyA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYoIXJ1bm5pbmcpc2ltdWxhdGlvblNjZW5hcmlvLnJlc2V0KCk7IC8vIHNhZmUgc2luY2UgY2Fub25pY2FsIGdyYXBoIGlzIHNldCAKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCS8vIFJlYWQgc2NlbmFyaW8KKwkJCQkJLy8gQWRkIHRvIGNhY2hlCisJCQkJCVNpbXVsYXRpb25DYWNoaW5nLklOU1RBTkNFLmFkZFNjZW5hcmlvVG9DYWNoZShzY2VuYXJpbyk7CisJCQkJfQorCQkJCQorCQkJfQorCQkJCisJCQlpZihzY2VuYXJpby5nZXRDYW5vbmljYWxHcmFwaCgpID09IG51bGwpIAorCQkJCXNjZW5hcmlvLmluaXRpYWxpemUoKTsgLy8gbmVlZGVkIGZvciBwcmVmZXJlbmNlcyAuLi4KKwkJCWVsc2Ugc2NlbmFyaW8ucmVzZXQoKTsKKwkJCWZpbmFsIFNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IG5ldyBTaW11bGF0aW9uKHNjZW5hcmlvLAorCQkJCQlnZXRBbmRJbmNyZW1lbnRTaW11bGF0aW9uU2VxdWVuY2VOdW1iZXIoKSk7CisJCQlzaW11bGF0aW9uLnNldFByaW9yaXR5KEpvYi5MT05HKTsKKwkJCXJldFZhbHVlID0gc2ltdWxhdGlvbjsKKworCQkJYWRkQWN0aXZlU2ltdWxhdGlvbihyZXRWYWx1ZSk7CisJCX0gY2F0Y2ggKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gZSkgeworCQkJLy8gV2UgY291bGQgZ2V0IGFuIGV4Y2VwdGlvbiBoZXJlIGlmIHRoZSBTY2VuYXJpbyBkb2Vzbid0IGhhdmUKKwkJCS8vIGEgU2VxdWVuY2VyIG9yIE1vZGVsIHdoaWNoIHdvdWxkIGNhdXNlIHByb2JsZW1zIHdoZW4gdHJ5aW5nIHRvCisJCQkvLyBpbml0aWFsaXplCisJCQlTaW11bGF0aW9uLmhhbmRsZUV4Y2VwdGlvbihzY2VuYXJpbywgc2NlbmFyaW8uZ2V0RHVibGluQ29yZSgpCisJCQkJCS5nZXRUaXRsZSgpLCB0cnVlLCBlKTsKKwkJCXJldFZhbHVlID0gbnVsbDsKKwkJfQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVTaW11bGF0aW9uCisKKwkvKioKKwkgKiBDcmVhdGUgYSB7QGxpbmsgSVNpbXVsYXRpb259IGZyb20gYSB7QGxpbmsgU2NlbmFyaW99IGluc3RhbmNlIGFuZCB0aGVuCisJICogc3RhcnQgaXQgcnVubmluZy4KKwkgKiAKKwkgKiBAcGFyYW0gc2NlbmFyaW8KKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgU2NlbmFyaW99IHRvIGJlIHNpbXVsYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUFuZFJ1blNpbXVsYXRpb24oZmluYWwgU2NlbmFyaW8gc2NlbmFyaW8pIHsKKwkJbmV3IEpvYihNZXNzYWdlcy5nZXRTdHJpbmcoIlNpbU1nci5TdGFydF9TaW0iKSkgeyAvLyROT04tTkxTLTEkIAorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJdHJ5IHsKKwkJCQkJZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IGNyZWF0ZVNpbXVsYXRpb24oc2NlbmFyaW8sIG1vbml0b3IpOworCQkJCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuZ2V0U3RyaW5nKCJTaW1NZ3IuUnVuIikpOyAvLyROT04tTkxTLTEkIAorCQkJCQlzaW11bGF0aW9uLnJ1bigpOworCQkJCX0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIFRoZSBlcnJvciB3YXMgbG9nZ2VkIGluIGNyZWF0ZVNpbXVsYXRpb24KKwkJCQkJbW9uaXRvci5kb25lKCk7CisJCQkJfSAvLyBjYXRjaCBFeGNlcHRpb24KKwkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCX0gLy8gcnVuCisJCX0uc2NoZWR1bGUoKTsKKwl9IC8vIGNyZWF0ZUFuZFJ1blNpbXVsYXRpb24KKwkKKwkvKioKKwkgKiBHaXZlbiBhIHtAbGluayBHcmFwaH0gZmluZCB0aGUge0BsaW5rIElTaW11bGF0aW9ufSB0aGF0IGNyZWF0ZWQgaXQuCisJICogCisJICogQHBhcmFtIGdyYXBoCisJICogICAgICAgICAgICBhbiBpbnN0YW5jZSBvZiBhIHtAbGluayBHcmFwaH0KKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSVNpbXVsYXRpb259IGluc3RhbmNlIHRoYXQgY3JlYXRlZCB0aGUge0BsaW5rIEdyYXBofSwKKwkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpZiBubyBtYXRjaCBjb3VsZCBiZSBmb3VuZC4KKwkgKi8KKwlwdWJsaWMgSVNpbXVsYXRpb24gbWFwR3JhcGhUb1NpbXVsYXRpb24oZmluYWwgR3JhcGggZ3JhcGgpIHsKKwkJSVNpbXVsYXRpb24gcmV0VmFsdWUgPSBudWxsOworCQlmb3IgKGZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb24gOiBhY3RpdmVTaW11bGF0aW9ucykgeworCQkJZmluYWwgR3JhcGggc2ltdWxhdGlvbkdyYXBoID0gc2ltdWxhdGlvbi5nZXRTY2VuYXJpbygpCisJCQkJCS5nZXRDYW5vbmljYWxHcmFwaCgpOworCQkJLy8gSXMgdGhpcyB0aGUgb25lIHdlJ3JlIGxvb2tpbmcgZm9yPworCQkJaWYgKGdyYXBoID09IHNpbXVsYXRpb25HcmFwaCkgeworCQkJCS8vIFllcworCQkJCXJldFZhbHVlID0gc2ltdWxhdGlvbjsKKwkJCQlicmVhazsKKwkJCX0gLy8gaWYKKwkJfSAvLyBmb3IgZWFjaCBJU2ltdWxhdGlvbgorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBtYXBHcmFwaFRvU2ltdWxhdGlvbgorfSAvLyBTaW11bGF0aW9uTWFuYWdlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvRXJyb3JBbmFseXNpc0FsZ29yaXRobS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvRXJyb3JBbmFseXNpc0FsZ29yaXRobS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTVlODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC9FcnJvckFuYWx5c2lzQWxnb3JpdGhtLmphdmEKQEAgLTAsMCArMSwzOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQ7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorDQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yRnVuY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbzsNCisNCitpbXBvcnQgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNFeHBlcmltZW50Ow0KK2ltcG9ydCBhdXRvbWF0aWNleHBlcmltZW50Lk1vZGlmaWFibGVQYXJhbWV0ZXI7DQorDQorcHVibGljIGludGVyZmFjZSBFcnJvckFuYWx5c2lzQWxnb3JpdGhtIHsNCisJcHVibGljIHZvaWQgc2V0RXJyb3JGdW5jdGlvbihmaW5hbCBFcnJvckZ1bmN0aW9uIGVycm9yRnVuY3Rpb24pOw0KKwlwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKGZpbmFsIExpc3Q8TW9kaWZpYWJsZVBhcmFtZXRlcj4gcGFyYW1ldGVycyk7DQorCXB1YmxpYyB2b2lkIHNldFRvbGVyYW5jZShmaW5hbCBkb3VibGUgdG9sZXJhbmNlKTsNCisJcHVibGljIHZvaWQgc2V0QmFzZVNjZW5hcmlvKGZpbmFsIFNjZW5hcmlvIGJhc2VTY2VuYXJpbyk7DQorCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZURhdGFEaXJlY3RvcnkoZmluYWwgU3RyaW5nIHJlZmVyZW5jZURhdGFEaXIpOw0KKwlwdWJsaWMgdm9pZCBzZXRNYXhpbXVtTnVtYmVyT2ZJdGVyYXRpb25zKGZpbmFsIGxvbmcgbWF4TnVtT2ZJdGVyYXRpb25zKTsNCisJcHVibGljIGRvdWJsZVtdIGdldFJlc3VsdFBhcmFtZXRlcnMoKTsNCisJcHVibGljIGRvdWJsZSBnZXRSZXN1bHRWYWx1ZSgpOw0KKwlwdWJsaWMgdm9pZCBleGVjdXRlKCk7DQorCXB1YmxpYyB2b2lkIGluaXQoQXV0b21hdGljRXhwZXJpbWVudCBhdXRvbWF0aWNFeHBlcmltZW50LCBFcnJvckFuYWx5c2lzQWxnb3JpdGhtIGFsZyk7DQorCXB1YmxpYyB2b2lkIHJlaW5pdFN0YXJ0UGFyYW1zKEF1dG9tYXRpY0V4cGVyaW1lbnQgZXhwLCBkb3VibGUgW10gdmFscyk7DQorCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKEVycm9yQW5hbHlzaXNBbGdvcml0aG1MaXN0ZW5lciBsaXN0ZW5lcik7DQorCXB1YmxpYyB2b2lkIGNsZWFyTGlzdGVuZXJzKCk7DQorCQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC9FcnJvckFuYWx5c2lzQWxnb3JpdGhtRXZlbnQuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L0Vycm9yQW5hbHlzaXNBbGdvcml0aG1FdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNjFkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC9FcnJvckFuYWx5c2lzQWxnb3JpdGhtRXZlbnQuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRXJyb3JSZXN1bHQ7CisKK3B1YmxpYyBjbGFzcyBFcnJvckFuYWx5c2lzQWxnb3JpdGhtRXZlbnQgeworCXB1YmxpYyBFcnJvclJlc3VsdCByZXN1bHQ7CisJcHVibGljIEFMR09SSVRITV9TVEFUVVMgc3RhdHVzOworCXB1YmxpYyBTdHJpbmcgW10gcGFyYW1ldGVyTmFtZXM7CisJcHVibGljIGRvdWJsZSBbXSBwYXJhbWV0ZXJWYWx1ZXM7CisJCisJcHVibGljIEVycm9yQW5hbHlzaXNBbGdvcml0aG1FdmVudChFcnJvclJlc3VsdCByZXMsIEFMR09SSVRITV9TVEFUVVMgc3RhdHVzKSB7CisJCXRoaXMucmVzdWx0ID0gcmVzOworCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC9FcnJvckFuYWx5c2lzQWxnb3JpdGhtRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvRXJyb3JBbmFseXNpc0FsZ29yaXRobUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjI2MmM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvRXJyb3JBbmFseXNpc0FsZ29yaXRobUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwdWJsaWMgY2xhc3MgRXJyb3JBbmFseXNpc0FsZ29yaXRobUZhY3Rvcnkgew0KKwlwdWJsaWMgZmluYWwgc3RhdGljIEVycm9yQW5hbHlzaXNBbGdvcml0aG1GYWN0b3J5IElOU1RBTkNFID0gbmV3IEVycm9yQW5hbHlzaXNBbGdvcml0aG1GYWN0b3J5KCk7DQorCQ0KKwlwdWJsaWMgRXJyb3JBbmFseXNpc0FsZ29yaXRobSBjcmVhdGVFcnJvckFuYWx5c2lzQWxnb3JpdGhtKGZpbmFsIFN0cmluZyBhbGdvcml0aG1OYW1lKQ0KKwl7DQorCQlFcnJvckFuYWx5c2lzQWxnb3JpdGhtIGFsZ29yaXRobSA9IG51bGw7DQorCQlpZiAoYWxnb3JpdGhtTmFtZS5lcXVhbHMoIk5lZGxlci1NZWFkIEFsZ29yaXRobSIpKSB7IC8vJE5PTi1OTFMtMSQgDQorCQkJYWxnb3JpdGhtID0gbmV3IFNpbXBsZXhBbGdvcml0aG1FeGVjdXRlcigpOw0KKwkJfQ0KKwkJcmV0dXJuIGFsZ29yaXRobTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC9FcnJvckFuYWx5c2lzQWxnb3JpdGhtTGlzdGVuZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L0Vycm9yQW5hbHlzaXNBbGdvcml0aG1MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhY2FkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC9FcnJvckFuYWx5c2lzQWxnb3JpdGhtTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50OworCitwdWJsaWMgaW50ZXJmYWNlIEVycm9yQW5hbHlzaXNBbGdvcml0aG1MaXN0ZW5lciB7CisKKwlwdWJsaWMgdm9pZCBldmVudFJlY2VpdmVkKEVycm9yQW5hbHlzaXNBbGdvcml0aG1FdmVudCBldnQpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvTUFOQUdFUl9TVEFUVVMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L01BTkFHRVJfU1RBVFVTLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxYjhjZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L01BTkFHRVJfU1RBVFVTLmphdmEKQEAgLTAsMCArMSw1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudDsKKworcHVibGljIGVudW0gTUFOQUdFUl9TVEFUVVMgeworCVNDSEVEVUxFRDsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L05lbGRlck1lYWRBbGdvcml0aG0uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L05lbGRlck1lYWRBbGdvcml0aG0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTY1Y2RmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvTmVsZGVyTWVhZEFsZ29yaXRobS5qYXZhCkBAIC0wLDAgKzEsNDQwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudDsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5FcnJvclJlc3VsdDsNCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisvKioNCisgKiBNaW5pbWl6ZXMgYSBmdW5jdGlvbiB1c2luZyB0aGUgTmVsZGVyLU1lYWQgYWxnb3JpdGhtLg0KKyAqIA0KKyAqIFNpbXBsZXggZnVuY3Rpb24gbWluaW1pc2F0aW9uIHByb2NlZHVyZSBkdWUgdG8gTmVsZGVyK01lYWQoMTk2NSksIGFzDQorICogaW1wbGVtZW50ZWQgYnkgTydOZWlsbCgxOTcxLCBBcHBsLlN0YXRpc3QuIDIwLCAzMzgtNDUpLCB3aXRoIHN1YnNlcXVlbnQNCisgKiBjb21tZW50cyBieSBDaGFtYmVycytFcnRlbCgxOTc0LCAyMywgMjUwLTEpLCBCZW55b24oMTk3NiwgMjUsIDk3KSBhbmQNCisgKiBIaWxsKDE5NzgsIDI3LCAzODAtMikNCisgKiANCisgKiBBdXRob3JzOg0KKyAqIA0KKyAqIEJhc2VkIG9uIEZPUlRSQU43NyB2ZXJzaW9uIGJ5IFIgT05laWxsIA0KKyAqIFRoaXMgSmF2YSB2ZXJzaW9uIGJ5IFlvc3NpIE1lc2lrYQ0KKyAqIA0KKyAqIFJlZmVyZW5jZToNCisgKiANCisgKiBKb2huIE5lbGRlciwgUm9nZXIgTWVhZCwgQSBzaW1wbGV4IG1ldGhvZCBmb3IgZnVuY3Rpb24gbWluaW1pemF0aW9uLCBDb21wdXRlcg0KKyAqIEpvdXJuYWwsIFZvbHVtZSA3LCAxOTY1LCBwYWdlcyAzMDgtMzEzLg0KKyAqIA0KKyAqIFIgT05laWxsLCBBbGdvcml0aG0gQVMgNDc6IEZ1bmN0aW9uIE1pbmltaXphdGlvbiBVc2luZyBhIFNpbXBsZXggUHJvY2VkdXJlLA0KKyAqIEFwcGxpZWQgU3RhdGlzdGljcywgVm9sdW1lIDIwLCBOdW1iZXIgMywgMTk3MSwgcGFnZXMgMzM4LTM0NS4NCisgKi8NCitwdWJsaWMgY2xhc3MgTmVsZGVyTWVhZEFsZ29yaXRobSBpbXBsZW1lbnRzIFNpbXBsZXhBbGdvcml0aG0gew0KKw0KKwlkb3VibGUgY2NvZWZmID0gMC41Ow0KKwlkb3VibGUgZGVsOw0KKwlkb3VibGUgZG47DQorCWRvdWJsZSBkbm47DQorCWRvdWJsZSBlY29lZmYgPSAyLjA7DQorCWRvdWJsZSBlcHMgPSAwLjAwMTsNCisJaW50IGk7DQorCWludCBpaGk7DQorCWludCBpbG87DQorCWludCBqOw0KKwlpbnQgamNvdW50Ow0KKwlpbnQgbDsNCisJaW50IG5uOw0KKwlkb3VibGVbXSBwOw0KKwlkb3VibGVbXSBwMnN0YXI7DQorCWRvdWJsZVtdIHBiYXI7DQorCWRvdWJsZVtdIHBzdGFyOw0KKwlkb3VibGUgcmNvZWZmID0gMS4wOw0KKwlkb3VibGUgcnE7DQorCWRvdWJsZSB4Ow0KKwlFcnJvclJlc3VsdFtdIHk7DQorCUVycm9yUmVzdWx0IHkyc3RhcjsNCisJRXJyb3JSZXN1bHQgeWxvOw0KKwlFcnJvclJlc3VsdCB5c3RhcjsNCisJZG91YmxlIHo7DQorDQorCWludCBpZmF1bHQgPSAtMTsNCisJaW50IG51bXJlcyA9IC0xOw0KKwlpbnQgaWNvdW50ID0gLTE7DQorCUVycm9yUmVzdWx0IHluZXdsbzsNCisJZG91YmxlW10geG1pbjsNCisJDQorCUFycmF5TGlzdDxEb3VibGU+IG1pblBhcmFtVmFsdWVzID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7DQorCUFycmF5TGlzdDxEb3VibGU+IG1heFBhcmFtVmFsdWVzID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7DQorCQ0KKwlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIFNpbXBsZXhGdW5jdGlvbiBmbiwgIGZpbmFsIGRvdWJsZVtdIHN0YXJ0UG9pbnQsDQorCQkJZmluYWwgZG91YmxlW10gc3RlcCwgZmluYWwgZG91YmxlIHRlcm1pbmF0aW5nVmFyaWFuY2UsIGxvbmcgbWF4SXRlcikgew0KKwkJZXhlY3V0ZShmbiwgc3RhcnRQb2ludCwgdGVybWluYXRpbmdWYXJpYW5jZSwgc3RlcCwNCisJCQkJMSwgKGludCltYXhJdGVyKTsNCisJfQ0KKwkNCisJLyoqDQorCSAqIEBwYXJhbSBmbiB0aGUge0BsaW5rIFNpbXBsZXhGdW5jdGlvbn0gdG8gYmUgbWluaW1pemVkDQorCSAqIEBwYXJhbSBzdGFydCBhIHN0YXJ0aW5nIHBvaW50IGZvciB0aGUgZmlyc3QgaXRlcmF0aW9uDQorCSAqIEBwYXJhbSByZXFtaW4gdGhlIHRlcm1pbmF0aW5nIGxpbWl0IGZvciB0aGUgdmFyaWFuY2Ugb2YgZnVuY3Rpb24gdmFsdWVzDQorCSAqIEBwYXJhbSBzdGVwIGRldGVybWluZXMgdGhlIHNpemUgYW5kIHNoYXBlIG9mIHRoZSBpbml0aWFsIHNpbXBsZXguIFRoZSByZWxhdGl2ZSBtYWduaXR1ZGVzIG9mIA0KKwkgKiBpdHMgZWxlbWVudHMgc2hvdWxkIHJlZmxlY3QgdGhlIHVuaXRzIG9mIHRoZSB2YXJpYWJsZXMuDQorCSAqIEBwYXJhbSBrb252Z2UgdGhlIGNvbnZlcmdlbmNlIGNoZWNrIGlzIGNhcnJpZWQgb3V0IGV2ZXJ5IEtPTlZHRSBpdGVyYXRpb25zDQorCSAqIEBwYXJhbSBrY291biB0aGUgbWF4aW11bSBudW1iZXIgb2YgZnVuY3Rpb24gZXZhbHVhdGlvbnMNCisJICovDQorCXByaXZhdGUgdm9pZCBleGVjdXRlKFNpbXBsZXhGdW5jdGlvbiBmbiwgZG91YmxlIHN0YXJ0W10sIGRvdWJsZSByZXFtaW4sIGRvdWJsZSBzdGVwW10sIGludCBrb252Z2UsIGludCBrY291bnQpIHsNCisJCWludCBuID0gc3RhcnQubGVuZ3RoOw0KKwkJLy8NCisJCS8vIENoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLg0KKwkJLy8NCisJCWlmIChyZXFtaW4gPD0gMC4wKSB7DQorCQkJaWZhdWx0ID0gMTsNCisJCQlyZXR1cm47DQorCQl9DQorDQorCQlpZiAobiA8IDEpIHsNCisJCQlpZmF1bHQgPSAxOw0KKwkJCXJldHVybjsNCisJCX0NCisNCisJCWlmIChrb252Z2UgPCAxKSB7DQorCQkJaWZhdWx0ID0gMTsNCisJCQlyZXR1cm47DQorCQl9DQorDQorCQlwID0gbmV3IGRvdWJsZVtuICogKG4gKyAxKV07DQorCQlwc3RhciA9IG5ldyBkb3VibGVbbl07DQorCQlwMnN0YXIgPSBuZXcgZG91YmxlW25dOw0KKwkJcGJhciA9IG5ldyBkb3VibGVbbl07DQorCQl5ID0gbmV3IEVycm9yUmVzdWx0W24gKyAxXTsNCisJCXhtaW4gPSBuZXcgZG91YmxlW25dOw0KKw0KKwkJaWNvdW50ID0gMDsNCisJCW51bXJlcyA9IDA7DQorDQorCQlqY291bnQgPSBrb252Z2U7DQorCQlkbiA9IChuKTsNCisJCW5uID0gbiArIDE7DQorCQlkbm4gPSAobm4pOw0KKwkJZGVsID0gMS4wOw0KKwkJcnEgPSByZXFtaW4gKiBkbjsNCisJCS8vDQorCQkvLyBJbml0aWFsIG9yIHJlc3RhcnRlZCBsb29wLg0KKwkJLy8NCisJCWZvciAoOzspIHsNCisJCQlpZihBdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlci5RVUlUX05PVykgYnJlYWs7DQorCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgew0KKwkJCQlwW2kgKyBuICogbl0gPSBzdGFydFtpXTsNCisJCQl9DQorCQkJbGltaXQoc3RhcnQpOw0KKwkJCXlbbl0gPSBmbi5nZXRWYWx1ZShzdGFydCkuY29weSgpOw0KKwkJCWljb3VudCA9IGljb3VudCArIDE7DQorDQorCQkJZm9yIChqID0gMDsgaiA8IG47IGorKykgew0KKwkJCQl4ID0gc3RhcnRbal07DQorCQkJCXN0YXJ0W2pdID0gc3RhcnRbal0gKyBzdGVwW2pdICogZGVsOw0KKwkJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7DQorCQkJCQlwW2kgKyBqICogbl0gPSBzdGFydFtpXTsNCisJCQkJfQ0KKwkJCQlsaW1pdChzdGFydCk7DQorCQkJCXlbal0gPSBmbi5nZXRWYWx1ZShzdGFydCkuY29weSgpOw0KKwkJCQlpY291bnQgPSBpY291bnQgKyAxOw0KKwkJCQlzdGFydFtqXSA9IHg7DQorCQkJCWlmKEF1dG9tYXRpY0V4cGVyaW1lbnRNYW5hZ2VyLlFVSVRfTk9XKSBicmVhazsNCisJCQl9DQorCQkJaWYoQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXIuUVVJVF9OT1cpIGJyZWFrOw0KKw0KKwkJCS8vCSAgICAgICAgICAgICAgICAgICAgDQorCQkJLy8gVGhlIHNpbXBsZXggY29uc3RydWN0aW9uIGlzIGNvbXBsZXRlLg0KKwkJCS8vCSAgICAgICAgICAgICAgICAgICAgDQorCQkJLy8gRmluZCBoaWdoZXN0IGFuZCBsb3dlc3QgWSB2YWx1ZXMuIFlORVdMTyA9IFkoSUhJKSBpbmRpY2F0ZXMNCisJCQkvLyB0aGUgdmVydGV4IG9mIHRoZSBzaW1wbGV4IHRvIGJlIHJlcGxhY2VkLg0KKwkJCS8vCSAgICAgICAgICAgICAgICANCisJCQl5bG8gPSB5WzBdLmNvcHkoKTsNCisJCQlpbG8gPSAwOw0KKw0KKwkJCWZvciAoaSA9IDE7IGkgPCBubjsgaSsrKSB7DQorCQkJCWlmICh5W2ldLmdldEVycm9yKCkgPCB5bG8uZ2V0RXJyb3IoKSkgew0KKwkJCQkJeWxvID0geVtpXS5jb3B5KCk7DQorCQkJCQlpbG8gPSBpOw0KKwkJCQl9DQorCQkJfQ0KKwkJCS8vDQorCQkJLy8gSW5uZXIgbG9vcC4NCisJCQkvLw0KKwkJCWZvciAoOzspIHsNCisJCQkJaWYoQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXIuUVVJVF9OT1cpIGJyZWFrOw0KKwkJCQlpZiAoa2NvdW50ICE9IC0xICYmIGtjb3VudCA8PSBpY291bnQpIHsNCisJCQkJCWJyZWFrOw0KKwkJCQl9DQorCQkJCXluZXdsbyA9IHlbMF0uY29weSgpOw0KKwkJCQlpaGkgPSAwOw0KKw0KKwkJCQlmb3IgKGkgPSAxOyBpIDwgbm47IGkrKykgew0KKwkJCQkJaWYgKHluZXdsby5nZXRFcnJvcigpIDwgeVtpXS5nZXRFcnJvcigpKSB7DQorCQkJCQkJeW5ld2xvID0geVtpXS5jb3B5KCk7DQorCQkJCQkJaWhpID0gaTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQkvLw0KKwkJCQkvLyBDYWxjdWxhdGUgUEJBUiwgdGhlIGNlbnRyb2lkIG9mIHRoZSBzaW1wbGV4IHZlcnRpY2VzDQorCQkJCS8vIGV4Y2VwdGluZyB0aGUgdmVydGV4IHdpdGggWSB2YWx1ZSBZTkVXTE8uDQorCQkJCS8vDQorCQkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsNCisJCQkJCXogPSAwLjA7DQorCQkJCQlmb3IgKGogPSAwOyBqIDwgbm47IGorKykgew0KKwkJCQkJCXogPSB6ICsgcFtpICsgaiAqIG5dOw0KKwkJCQkJfQ0KKwkJCQkJeiA9IHogLSBwW2kgKyBpaGkgKiBuXTsNCisJCQkJCXBiYXJbaV0gPSB6IC8gZG47DQorCQkJCX0NCisJCQkJLy8NCisJCQkJLy8gUmVmbGVjdGlvbiB0aHJvdWdoIHRoZSBjZW50cm9pZC4NCisJCQkJLy8NCisJCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgew0KKwkJCQkJcHN0YXJbaV0gPSBwYmFyW2ldICsgcmNvZWZmICogKHBiYXJbaV0gLSBwW2kgKyBpaGkgKiBuXSk7DQorCQkJCX0NCisJCQkJbGltaXQocHN0YXIpOw0KKwkJCQl5c3RhciA9IGZuLmdldFZhbHVlKHBzdGFyKS5jb3B5KCk7DQorCQkJCWljb3VudCA9IGljb3VudCArIDE7DQorCQkJCS8vDQorCQkJCS8vIFN1Y2Nlc3NmdWwgcmVmbGVjdGlvbiwgc28gZXh0ZW5zaW9uLg0KKwkJCQkvLw0KKwkJCQlpZiAoeXN0YXIuZ2V0RXJyb3IoKSA8IHlsby5nZXRFcnJvcigpKSB7DQorCQkJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7DQorCQkJCQkJcDJzdGFyW2ldID0gcGJhcltpXSArIGVjb2VmZiAqIChwc3RhcltpXSAtIHBiYXJbaV0pOw0KKwkJCQkJfQ0KKwkJCQkJbGltaXQocDJzdGFyKTsNCisJCQkJCXkyc3RhciA9IGZuLmdldFZhbHVlKHAyc3RhcikuY29weSgpOw0KKwkJCQkJaWNvdW50ID0gaWNvdW50ICsgMTsNCisJCQkJCS8vDQorCQkJCQkvLyBDaGVjayBleHRlbnNpb24uDQorCQkJCQkvLw0KKwkJCQkJaWYgKHlzdGFyLmdldEVycm9yKCkgPCB5MnN0YXIuZ2V0RXJyb3IoKSkgew0KKwkJCQkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsNCisJCQkJCQkJcFtpICsgaWhpICogbl0gPSBwc3RhcltpXTsNCisJCQkJCQl9DQorCQkJCQkJeVtpaGldID0geXN0YXIuY29weSgpOw0KKwkJCQkJfQ0KKwkJCQkJLy8NCisJCQkJCS8vIFJldGFpbiBleHRlbnNpb24gb3IgY29udHJhY3Rpb24uDQorCQkJCQkvLw0KKwkJCQkJZWxzZSB7DQorCQkJCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgew0KKwkJCQkJCQlwW2kgKyBpaGkgKiBuXSA9IHAyc3RhcltpXTsNCisJCQkJCQl9DQorCQkJCQkJeVtpaGldID0geTJzdGFyLmNvcHkoKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQkvLw0KKwkJCQkvLyBObyBleHRlbnNpb24uDQorCQkJCS8vDQorCQkJCWVsc2Ugew0KKwkJCQkJbCA9IDA7DQorCQkJCQlmb3IgKGkgPSAwOyBpIDwgbm47IGkrKykgew0KKwkJCQkJCWlmICh5c3Rhci5nZXRFcnJvcigpIDwgeVtpXS5nZXRFcnJvcigpKSB7DQorCQkJCQkJCWwgPSBsICsgMTsNCisJCQkJCQl9DQorCQkJCQl9DQorDQorCQkJCQlpZiAoMSA8IGwpIHsNCisJCQkJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7DQorCQkJCQkJCXBbaSArIGloaSAqIG5dID0gcHN0YXJbaV07DQorCQkJCQkJfQ0KKwkJCQkJCXlbaWhpXSA9IHlzdGFyLmNvcHkoKTsNCisJCQkJCX0NCisJCQkJCS8vDQorCQkJCQkvLyBDb250cmFjdGlvbiBvbiB0aGUgWShJSEkpIHNpZGUgb2YgdGhlIGNlbnRyb2lkLg0KKwkJCQkJLy8NCisJCQkJCWVsc2UgaWYgKGwgPT0gMCkgew0KKwkJCQkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsNCisJCQkJCQkJcDJzdGFyW2ldID0gcGJhcltpXSArIGNjb2VmZg0KKwkJCQkJCQkJCSogKHBbaSArIGloaSAqIG5dIC0gcGJhcltpXSk7DQorCQkJCQkJfQ0KKwkJCQkJCWxpbWl0KHAyc3Rhcik7DQorCQkJCQkJeTJzdGFyID0gZm4uZ2V0VmFsdWUocDJzdGFyKS5jb3B5KCk7DQorCQkJCQkJaWNvdW50ID0gaWNvdW50ICsgMTsNCisJCQkJCQkvLw0KKwkJCQkJCS8vIENvbnRyYWN0IHRoZSB3aG9sZSBzaW1wbGV4Lg0KKwkJCQkJCS8vDQorCQkJCQkJaWYgKHlbaWhpXS5nZXRFcnJvcigpIDwgeTJzdGFyLmdldEVycm9yKCkpIHsNCisJCQkJCQkJZm9yIChqID0gMDsgaiA8IG5uOyBqKyspIHsNCisJCQkJCQkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsNCisJCQkJCQkJCQlwW2kgKyBqICogbl0gPSAocFtpICsgaiAqIG5dICsgcFtpICsgaWxvDQorCQkJCQkJCQkJCQkqIG5dKSAqIDAuNTsNCisJCQkJCQkJCQl4bWluW2ldID0gcFtpICsgaiAqIG5dOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQkJbGltaXQoeG1pbik7DQorCQkJCQkJCQl5W2pdID0gZm4uZ2V0VmFsdWUoeG1pbikuY29weSgpOw0KKwkJCQkJCQkJaWNvdW50ID0gaWNvdW50ICsgMTsNCisJCQkJCQkJfQ0KKwkJCQkJCQl5bG8gPSB5WzBdOw0KKwkJCQkJCQlpbG8gPSAwOw0KKw0KKwkJCQkJCQlmb3IgKGkgPSAxOyBpIDwgbm47IGkrKykgew0KKwkJCQkJCQkJaWYgKHlbaV0uZ2V0RXJyb3IoKSA8IHlsby5nZXRFcnJvcigpKSB7DQorCQkJCQkJCQkJeWxvID0geVtpXS5jb3B5KCk7DQorCQkJCQkJCQkJaWxvID0gaTsNCisJCQkJCQkJCX0NCisJCQkJCQkJfQ0KKwkJCQkJCQljb250aW51ZTsNCisJCQkJCQl9DQorCQkJCQkJLy8NCisJCQkJCQkvLyBSZXRhaW4gY29udHJhY3Rpb24uDQorCQkJCQkJLy8NCisJCQkJCQllbHNlIHsNCisJCQkJCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgew0KKwkJCQkJCQkJcFtpICsgaWhpICogbl0gPSBwMnN0YXJbaV07DQorCQkJCQkJCX0NCisJCQkJCQkJeVtpaGldID0geTJzdGFyLmNvcHkoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCQkvLw0KKwkJCQkJLy8gQ29udHJhY3Rpb24gb24gdGhlIHJlZmxlY3Rpb24gc2lkZSBvZiB0aGUgY2VudHJvaWQuDQorCQkJCQkvLw0KKwkJCQkJZWxzZSBpZiAobCA9PSAxKSB7DQorCQkJCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgew0KKwkJCQkJCQlwMnN0YXJbaV0gPSBwYmFyW2ldICsgY2NvZWZmICogKHBzdGFyW2ldIC0gcGJhcltpXSk7DQorCQkJCQkJfQ0KKwkJCQkJCWxpbWl0KHAyc3Rhcik7DQorCQkJCQkJeTJzdGFyID0gZm4uZ2V0VmFsdWUocDJzdGFyKS5jb3B5KCk7DQorCQkJCQkJaWNvdW50ID0gaWNvdW50ICsgMTsNCisJCQkJCQkvLw0KKwkJCQkJCS8vIFJldGFpbiByZWZsZWN0aW9uPw0KKwkJCQkJCS8vDQorCQkJCQkJaWYgKHkyc3Rhci5nZXRFcnJvcigpIDw9IHlzdGFyLmdldEVycm9yKCkpIHsNCisJCQkJCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgew0KKwkJCQkJCQkJcFtpICsgaWhpICogbl0gPSBwMnN0YXJbaV07DQorCQkJCQkJCX0NCisJCQkJCQkJeVtpaGldID0geTJzdGFyLmNvcHkoKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7DQorCQkJCQkJCQlwW2kgKyBpaGkgKiBuXSA9IHBzdGFyW2ldOw0KKwkJCQkJCQl9DQorCQkJCQkJCXlbaWhpXSA9IHlzdGFyLmNvcHkoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQkJLy8NCisJCQkJLy8gQ2hlY2sgaWYgWUxPIGltcHJvdmVkLg0KKwkJCQkvLw0KKwkJCQlpZiAoeVtpaGldLmdldEVycm9yKCkgPCB5bG8uZ2V0RXJyb3IoKSkgew0KKwkJCQkJeWxvID0geVtpaGldLmNvcHkoKTsNCisJCQkJCWlsbyA9IGloaTsNCisJCQkJfQ0KKwkJCQlqY291bnQgPSBqY291bnQgLSAxOw0KKw0KKwkJCQlpZiAoMCA8IGpjb3VudCkgew0KKwkJCQkJY29udGludWU7DQorCQkJCX0NCisJCQkJLy8NCisJCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIG1pbmltdW0gcmVhY2hlZC4NCisJCQkJLy8NCisJCQkJaWYgKGtjb3VudCA9PSAtMSB8fCBpY291bnQgPD0ga2NvdW50KSB7DQorCQkJCQlqY291bnQgPSBrb252Z2U7DQorDQorCQkJCQl6ID0gMC4wOw0KKwkJCQkJZm9yIChpID0gMDsgaSA8IG5uOyBpKyspIHsNCisJCQkJCQl6ID0geiArIHlbaV0uZ2V0RXJyb3IoKTsNCisJCQkJCX0NCisJCQkJCXggPSB6IC8gZG5uOw0KKw0KKwkJCQkJeiA9IDAuMDsNCisJCQkJCWZvciAoaSA9IDA7IGkgPCBubjsgaSsrKSB7DQorCQkJCQkJeiA9IHogKyBNYXRoLnBvdyh5W2ldLmdldEVycm9yKCkgLSB4LCAyKTsNCisJCQkJCX0NCisNCisJCQkJCWlmICh6IDw9IHJxKSB7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJLy8NCisJCQkvLyBGYWN0b3JpYWwgdGVzdHMgdG8gY2hlY2sgdGhhdCBZTkVXTE8gaXMgYSBsb2NhbCBtaW5pbXVtLg0KKwkJCS8vDQorCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgew0KKwkJCQl4bWluW2ldID0gcFtpICsgaWxvICogbl07DQorCQkJfQ0KKwkJCXluZXdsbyA9IHlbaWxvXS5jb3B5KCk7DQorDQorCQkJaWYgKGtjb3VudCAhPSAtMSAmJiBrY291bnQgPCBpY291bnQpIHsNCisJCQkJaWZhdWx0ID0gMjsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKw0KKwkJCWlmYXVsdCA9IDA7DQorDQorCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgew0KKwkJCQlkZWwgPSBzdGVwW2ldICogZXBzOw0KKwkJCQl4bWluW2ldID0geG1pbltpXSArIGRlbDsNCisJCQkJbGltaXQoeG1pbik7DQorCQkJCXogPSBmbi5nZXRWYWx1ZSh4bWluKS5nZXRFcnJvcigpOw0KKwkJCQlpY291bnQgPSBpY291bnQgKyAxOw0KKwkJCQlpZiAoeiA8IHluZXdsby5nZXRFcnJvcigpKSB7DQorCQkJCQlpZmF1bHQgPSAyOw0KKwkJCQkJYnJlYWs7DQorCQkJCX0NCisJCQkJeG1pbltpXSA9IHhtaW5baV0gLSBkZWwgLSBkZWw7DQorCQkJCWxpbWl0KHhtaW4pOw0KKwkJCQl6ID0gZm4uZ2V0VmFsdWUoeG1pbikuZ2V0RXJyb3IoKTsNCisJCQkJaWNvdW50ID0gaWNvdW50ICsgMTsNCisJCQkJaWYgKHogPCB5bmV3bG8uZ2V0RXJyb3IoKSkgew0KKwkJCQkJaWZhdWx0ID0gMjsNCisJCQkJCWJyZWFrOw0KKwkJCQl9DQorCQkJCXhtaW5baV0gPSB4bWluW2ldICsgZGVsOw0KKwkJCQlpZihBdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlci5RVUlUX05PVykgYnJlYWs7DQorCQkJfQ0KKw0KKwkJCWlmIChpZmF1bHQgPT0gMCB8fCBBdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlci5RVUlUX05PVykgew0KKwkJCQlicmVhazsNCisJCQl9DQorCQkJLy8NCisJCQkvLyBSZXN0YXJ0IHRoZSBwcm9jZWR1cmUuDQorCQkJLy8NCisJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7DQorCQkJCXN0YXJ0W2ldID0geG1pbltpXTsNCisJCQl9DQorCQkJZGVsID0gZXBzOw0KKwkJCW51bXJlcyA9IG51bXJlcyArIDE7DQorCQkJaWYoQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXIuUVVJVF9OT1cpIGJyZWFrOw0KKwkJfQ0KKwl9DQorDQorCXByaXZhdGUgdm9pZCBsaW1pdChkb3VibGUgW112YWxzKSB7DQorCQlmb3IoaW50IGk9MDtpPHZhbHMubGVuZ3RoOysraSkgew0KKwkJCWlmKHZhbHNbaV08bWluUGFyYW1WYWx1ZXMuZ2V0KGkpKSB2YWxzW2ldID0gbWluUGFyYW1WYWx1ZXMuZ2V0KGkpOyANCisJCQllbHNlIGlmKHZhbHNbaV0+bWF4UGFyYW1WYWx1ZXMuZ2V0KGkpKSB2YWxzW2ldID0gbWF4UGFyYW1WYWx1ZXMuZ2V0KGkpOyANCisJCX0NCisJfQ0KKwlwdWJsaWMgZG91YmxlIGdldE1pbmltdW1GdW5jdGlvblZhbHVlKCkgew0KKwkJaWYodGhpcy55bmV3bG8gIT0gbnVsbCkNCisJCQlyZXR1cm4gdGhpcy55bmV3bG8uZ2V0RXJyb3IoKTsNCisJCXJldHVybiAtMTsgLy8gdGhlIGFsZ29yaXRobSB3YXMgcHJvYmFibHkgaW50ZXJydXB0ZWQuDQorCX0NCisJcHVibGljIEVycm9yUmVzdWx0IGdldE1pbmltdW1FcnJvclJlc3VsdCgpIHsNCisJCXJldHVybiB0aGlzLnluZXdsbzsNCisJfQ0KKwlwdWJsaWMgZG91YmxlW10gZ2V0TWluaW11bVBhcmFtZXRlcnNWYWx1ZXMoKSB7DQorCQlyZXR1cm4gdGhpcy54bWluOw0KKwl9DQorDQorCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlckxpbWl0cyhmaW5hbCBpbnQgcGFyYW1ldGVySW5kZXgsDQorCQkJZmluYWwgZG91YmxlIGxvd2VyQm91bmQsIGZpbmFsIGRvdWJsZSB1cHBlckJvdW5kKSB7DQorCQlmb3IoaW50IGk9MDtpPHBhcmFtZXRlckluZGV4KzEtbWluUGFyYW1WYWx1ZXMuc2l6ZSgpOysraSkgbWluUGFyYW1WYWx1ZXMuYWRkKDAuMCk7DQorCQlmb3IoaW50IGk9MDtpPHBhcmFtZXRlckluZGV4KzEtbWF4UGFyYW1WYWx1ZXMuc2l6ZSgpOysraSkgbWF4UGFyYW1WYWx1ZXMuYWRkKDAuMCk7DQorCQltaW5QYXJhbVZhbHVlcy5lbnN1cmVDYXBhY2l0eShwYXJhbWV0ZXJJbmRleCsxKTsNCisJCW1heFBhcmFtVmFsdWVzLmVuc3VyZUNhcGFjaXR5KHBhcmFtZXRlckluZGV4KzEpOw0KKwkJbWluUGFyYW1WYWx1ZXMuc2V0KHBhcmFtZXRlckluZGV4LCBsb3dlckJvdW5kKTsNCisJCW1heFBhcmFtVmFsdWVzLnNldChwYXJhbWV0ZXJJbmRleCx1cHBlckJvdW5kKTsNCisJCQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L1NpbXBsZXhBbGdvcml0aG0uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L1NpbXBsZXhBbGdvcml0aG0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjBhNzRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvU2ltcGxleEFsZ29yaXRobS5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yUmVzdWx0Ow0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3B1YmxpYyBpbnRlcmZhY2UgU2ltcGxleEFsZ29yaXRobSB7DQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgZG91YmxlIE5PX0xJTUlUID0gLTE7DQorCQ0KKwlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIFNpbXBsZXhGdW5jdGlvbiBmbiwgIGZpbmFsIGRvdWJsZVtdIHN0YXJ0UG9pbnRzLCBmaW5hbCBkb3VibGVbXSBzdGVwLCBmaW5hbCBkb3VibGUgdGVybWluYXRpbmdWYXJpYW5jZSwgbG9uZyBtYXhJdGVyKTsNCisJcHVibGljIGRvdWJsZSBnZXRNaW5pbXVtRnVuY3Rpb25WYWx1ZSgpOw0KKwlwdWJsaWMgRXJyb3JSZXN1bHQgZ2V0TWluaW11bUVycm9yUmVzdWx0KCk7DQorCXB1YmxpYyBkb3VibGVbXSBnZXRNaW5pbXVtUGFyYW1ldGVyc1ZhbHVlcygpOw0KKwlwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJMaW1pdHMoZmluYWwgaW50IHBhcmFtZXRlckluZGV4LCBmaW5hbCBkb3VibGUgbG93ZXJCb3VuZCwgZmluYWwgZG91YmxlIHVwcGVyQm91bmQpOw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC9TaW1wbGV4QWxnb3JpdGhtRXhlY3V0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L1NpbXBsZXhBbGdvcml0aG1FeGVjdXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1Njk2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC9TaW1wbGV4QWxnb3JpdGhtRXhlY3V0ZXIuamF2YQpAQCAtMCwwICsxLDMyNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQ7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorLyoqDQorICogSW1wbGVtZW50YXRpb24gd2FzIHRha2VuIGZyb206IGh0dHA6Ly93d3cuZWUudWNsLmFjLnVrL35tZmxhbmFnYS9qYXZhL01pbmltaXNhdGlvbi5odG1sI3NpbXBsZXgNCisgKi8NCisNCitpbXBvcnQgamF2YS5pby5GaWxlOw0KK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRXJyb3JGdW5jdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5FcnJvclJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5TY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQudmlld3MuQXV0b0V4cENvbnRyb2w7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLnV0aWwuQ1NWc2NlbmFyaW9Mb2FkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMudmlld3MuQ3VzdG9tQ1NWTG9nZ2VyOw0KKw0KK2ltcG9ydCBhdXRvbWF0aWNleHBlcmltZW50LkF1dG9tYXRpY0V4cGVyaW1lbnQ7DQoraW1wb3J0IGF1dG9tYXRpY2V4cGVyaW1lbnQuTW9kaWZpYWJsZVBhcmFtZXRlcjsNCisNCitwdWJsaWMgY2xhc3MgU2ltcGxleEFsZ29yaXRobUV4ZWN1dGVyIA0KKwlleHRlbmRzIEFic3RyYWN0RXJyb3JBbmFseXNpc0FsZ29yaXRobSB7DQorCQ0KKwlwcml2YXRlIElTaW11bGF0aW9uIHNpbXVsYXRpb24gPSBudWxsOw0KKwlwcml2YXRlIEN1c3RvbUNTVkxvZ2dlciBjc3ZMb2dnZXIgPSBudWxsOw0KKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0lNVUxBVElPTl9PVVRQVVRfRElSID0gUGxhdGZvcm0uZ2V0TG9jYXRpb24oKSArIEZpbGUuc2VwYXJhdG9yICsgIkF1dG9FeHBUZW1wRGlyIjsNCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPR19GSUxFX05BTUUgPSBTSU1VTEFUSU9OX09VVFBVVF9ESVIrRmlsZS5zZXBhcmF0b3IrInJlc3VsdExvZy5jc3YiOw0KKwlzdGF0aWMgU3RyaW5nIExTID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyANCisJcHJpdmF0ZSBmaW5hbCBDdXN0b21TaW11bGF0aW9uTWFuYWdlciBzaW1NZ3IgPSBDdXN0b21TaW11bGF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCk7DQorCXByaXZhdGUgUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCByZWY7DQorCXByaXZhdGUgc3RhdGljIEF1dG9FeHBDb250cm9sIGFlQ29udHJvbCA9IG51bGw7DQorCQ0KKwkNCisJLyoqDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50LkFic3RyYWN0RXJyb3JBbmFseXNpc0FsZ29yaXRobSNleGVjdXRlKCkNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBleGVjdXRlKCkgew0KKwkJZG91YmxlIHByZXZtaW4gPSBEb3VibGUuTUFYX1ZBTFVFOw0KKwkJZG91YmxlIFtdIHByZXZ2YWxzID0gbmV3IGRvdWJsZVtpbml0aWFsUGFyYW1zVmFsdWVzLmxlbmd0aF07DQorCQlkb3VibGUgW10gbWludmFsczsNCisJCVN0cmluZyBbXSBwYXJhbWV0ZXJOYW1lcz1udWxsOw0KKwkJaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgew0KKwkJCXBhcmFtZXRlck5hbWVzID0gbmV3IFN0cmluZ1twYXJhbWV0ZXJzLnNpemUoKV07DQorCQkJaW50IGk9MDsNCisJCQlmb3IgKGZpbmFsIE1vZGlmaWFibGVQYXJhbWV0ZXIgcGFyYW06cGFyYW1ldGVycykgew0KKwkJCQlwYXJhbWV0ZXJOYW1lc1tpKytdID0gcGFyYW0uZ2V0RmVhdHVyZU5hbWUoKTsNCisJCQl9DQorCQl9DQorCQkNCisJCWZvcig7Oykgew0KKwkJCWZvcihpbnQgaT0wO2k8aW5pdGlhbFBhcmFtc1ZhbHVlcy5sZW5ndGg7KytpKSBwcmV2dmFsc1tpXSA9IGluaXRpYWxQYXJhbXNWYWx1ZXNbaV07DQorCQkJbG9uZyBiZWZvcmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsNCisJCQlzaW1wbGV4QWxnb3JpdGhtLmV4ZWN1dGUoc2ltcGxleEZuVG9NaW5pbWl6ZSwgIGluaXRpYWxQYXJhbXNWYWx1ZXMsIHBhcmFtc0luaXRpYWxTdGVwcywgdG9sZXJhbmNlLCB0aGlzLm1heE51bU9mSXRlcmF0aW9ucyk7DQorCQkJbG9uZyBhZnRlciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOw0KKwkJCWlmKEF1dG9tYXRpY0V4cGVyaW1lbnRNYW5hZ2VyLlFVSVRfTk9XKQ0KKwkJCQlBdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlci5zdG9wTGF0Y2guY291bnREb3duKCk7DQorCQkJaWYoIXRoaXMucmVwZWF0IHx8IEF1dG9tYXRpY0V4cGVyaW1lbnRNYW5hZ2VyLlFVSVRfTk9XKSB7DQorCQkJCUFjdGl2YXRvci5sb2dJbmZvcm1hdGlvbigic3BsdW5nZSIpOw0KKwkJCQlBY3RpdmF0b3IubG9nSW5mb3JtYXRpb24oIlxuXG5UaW1lIHRvIGV4ZWN1dGUgdGhlIE5lZGxlci1NZWFkIEFsZ29yaXRobTogIiArIChhZnRlci1iZWZvcmUpLzEwMDAgKyAiIHNlY29uZHMiKTsNCisJCQkJQWN0aXZhdG9yLmxvZ0luZm9ybWF0aW9uKCJNaW5pbXVtIHZhbHVlOiAiICsgc2ltcGxleEFsZ29yaXRobS5nZXRNaW5pbXVtRnVuY3Rpb25WYWx1ZSgpKTsNCisJCQkJQWN0aXZhdG9yLmxvZ0luZm9ybWF0aW9uKCJWYWxpZGF0aW9uIGVycm9yOiAiICsgc2ltcGxleEFsZ29yaXRobS5nZXRNaW5pbXVtRXJyb3JSZXN1bHQoKS5nZXRWYWxpZGF0aW9uRXJyb3IoKSk7DQorCQkJCUFjdGl2YXRvci5sb2dJbmZvcm1hdGlvbigiUGFyYW1ldGVycyB2YWx1ZXM6ICIgKyBBcnJheXMudG9TdHJpbmcoc2ltcGxleEFsZ29yaXRobS5nZXRNaW5pbXVtUGFyYW1ldGVyc1ZhbHVlcygpKSk7DQorCQkJCW1pbnZhbHMgPSBzaW1wbGV4QWxnb3JpdGhtLmdldE1pbmltdW1QYXJhbWV0ZXJzVmFsdWVzKCk7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCQlkb3VibGUgbmV3bWluID0gc2ltcGxleEFsZ29yaXRobS5nZXRNaW5pbXVtRnVuY3Rpb25WYWx1ZSgpOw0KKwkJCWlmKG5ld21pbiA+PSBwcmV2bWluKSB7DQorCQkJCUFjdGl2YXRvci5sb2dJbmZvcm1hdGlvbigiXG5cblRpbWUgdG8gZXhlY3V0ZSB0aGUgTmVkbGVyLU1lYWQgQWxnb3JpdGhtOiAiICsgKGFmdGVyLWJlZm9yZSkvMTAwMCArICIgc2Vjb25kcyIpOw0KKwkJCQlBY3RpdmF0b3IubG9nSW5mb3JtYXRpb24oIk1pbmltdW0gdmFsdWU6ICIgKyBwcmV2bWluKTsNCisJCQkJQWN0aXZhdG9yLmxvZ0luZm9ybWF0aW9uKCJWYWxpZGF0aW9uIGVycm9yOiAiICsgc2ltcGxleEFsZ29yaXRobS5nZXRNaW5pbXVtRXJyb3JSZXN1bHQoKS5nZXRWYWxpZGF0aW9uRXJyb3IoKSk7DQorCQkJCUFjdGl2YXRvci5sb2dJbmZvcm1hdGlvbigiUGFyYW1ldGVycyB2YWx1ZXM6ICIgKyBBcnJheXMudG9TdHJpbmcocHJldnZhbHMpKTsNCisJCQkJbWludmFscyA9IHByZXZ2YWxzOw0KKwkJCQlicmVhazsgLy8gd2UgY291bGRuJ3QgaW1wcm92ZQ0KKwkJCX0NCisJCQkvLyBOb3Qgc2FtZSwgcmVpbml0IHdpdGggbmV3IG1pbmltdW0NCisJCQlwcmV2bWluID0gc2ltcGxleEFsZ29yaXRobS5nZXRNaW5pbXVtRnVuY3Rpb25WYWx1ZSgpOw0KKwkJCQ0KKwkJCWZvcihpbnQgaT0wO2k8aW5pdGlhbFBhcmFtc1ZhbHVlcy5sZW5ndGg7KytpKXsNCisJCQkJaW5pdGlhbFBhcmFtc1ZhbHVlc1tpXSA9IHNpbXBsZXhBbGdvcml0aG0uZ2V0TWluaW11bVBhcmFtZXRlcnNWYWx1ZXMoKVtpXTsNCisJCQkJcHJldnZhbHNbaV0gPSAgc2ltcGxleEFsZ29yaXRobS5nZXRNaW5pbXVtUGFyYW1ldGVyc1ZhbHVlcygpW2ldOw0KKwkJCX0NCisJCQlFcnJvckFuYWx5c2lzQWxnb3JpdGhtRXZlbnQgbmV3RXZlbnQgPSBuZXcgRXJyb3JBbmFseXNpc0FsZ29yaXRobUV2ZW50KHNpbXBsZXhBbGdvcml0aG0uZ2V0TWluaW11bUVycm9yUmVzdWx0KCksIEFMR09SSVRITV9TVEFUVVMuUkVTVEFSVEVEX0FMR09SSVRITSk7DQorCQkJbmV3RXZlbnQucGFyYW1ldGVyTmFtZXMgPSBwYXJhbWV0ZXJOYW1lczsNCisJCQluZXdFdmVudC5wYXJhbWV0ZXJWYWx1ZXMgPSBzaW1wbGV4QWxnb3JpdGhtLmdldE1pbmltdW1QYXJhbWV0ZXJzVmFsdWVzKCk7DQorCQkJdGhpcy5maXJlRXZlbnQobmV3RXZlbnQpOw0KKw0KKwkJfQ0KKwkJRXJyb3JBbmFseXNpc0FsZ29yaXRobUV2ZW50IG5ld0V2ZW50ID0gbmV3IEVycm9yQW5hbHlzaXNBbGdvcml0aG1FdmVudChzaW1wbGV4QWxnb3JpdGhtLmdldE1pbmltdW1FcnJvclJlc3VsdCgpLCBBTEdPUklUSE1fU1RBVFVTLkZJTklTSEVEX0FMR09SSVRITSk7DQorCQluZXdFdmVudC5wYXJhbWV0ZXJOYW1lcyA9IHBhcmFtZXRlck5hbWVzOw0KKwkJbmV3RXZlbnQucGFyYW1ldGVyVmFsdWVzID0gbWludmFsczsNCisJCXRoaXMuZmlyZUV2ZW50KG5ld0V2ZW50KTsNCisJfQ0KKwkNCisJcHVibGljIHZvaWQgaW5pdChBdXRvbWF0aWNFeHBlcmltZW50IGF1dG9tYXRpY0V4cGVyaW1lbnQsIEVycm9yQW5hbHlzaXNBbGdvcml0aG0gYWxnKSB7DQorCQlzdXBlci5pbml0KGF1dG9tYXRpY0V4cGVyaW1lbnQpOw0KKwkJc2ltcGxleEZuVG9NaW5pbWl6ZSA9IG5ldyBOZWRsZWFyTWVhZFNpbXBsZXhGdW5jdGlvbihwYXJhbWV0ZXJzLCBiYXNlU2NlbmFyaW8sIGVycm9yRnVuY3Rpb24sIGFsZyk7DQorCQl0cnkgew0KKwkJCUNTVnNjZW5hcmlvTG9hZGVyIGxvYWRlcjEgPSBuZXcgQ1NWc2NlbmFyaW9Mb2FkZXIocmVmZXJlbmNlRGF0YURpcmVjdG9yeSk7DQorCQkJaW50IHJlcyA9IGxvYWRlcjEuZ2V0TWF4UmVzb2x1dGlvbigpOw0KKwkJCXJlZiA9IGxvYWRlcjEucGFyc2VBbGxGaWxlcyhyZXMpOw0KKwkJfSBjYXRjaCAoU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKwkNCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoTGlzdDxNb2RpZmlhYmxlUGFyYW1ldGVyPiBwYXJhbWV0ZXJzKSB7DQorCQlzdXBlci5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOw0KKwkJDQorCQkvL1NldCBsb3dlciBhbmQgdXBwZXIgYm91bmRzIGNvbnN0cmFpbnRzIGZvciB0aGUgcGFyYW1ldGVycw0KKwkJaW50IHBhcmFtSW5kZXg9MDsNCisJCWZvciAoZmluYWwgTW9kaWZpYWJsZVBhcmFtZXRlciBwYXJhbTpwYXJhbWV0ZXJzKSB7DQorCQkJc2ltcGxleEFsZ29yaXRobS5zZXRQYXJhbWV0ZXJMaW1pdHMocGFyYW1JbmRleCwgcGFyYW0uZ2V0TG93ZXJCb3VuZCgpLCBwYXJhbS5nZXRVcHBlckJvdW5kKCkpOw0KKwkJCXBhcmFtSW5kZXgrKzsNCisJCX0NCisJfQ0KKwkNCisJLyoqDQorCSAqDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgTmVkbGVhck1lYWRTaW1wbGV4RnVuY3Rpb24NCisJCWltcGxlbWVudHMgU2ltcGxleEZ1bmN0aW9uIA0KKwl7CQ0KKwkgICAgcHJpdmF0ZSBFcnJvckZ1bmN0aW9uIGVycm9yRnVuY3Rpb24gPSBudWxsOw0KKwkgICAgcHJpdmF0ZSBTdHJpbmdbXSBwYXJhbWV0ZXJOYW1lcyA9IG51bGw7DQorCSAgICBwcml2YXRlIEZpbGVXcml0ZXIgcmVzdWx0V3JpdGVyOw0KKwkgICAgcHJpdmF0ZSBVUklbXSBkZWNvcmF0b3JVUklzID0gbnVsbDsNCisJICAgIHByaXZhdGUgRXJyb3JBbmFseXNpc0FsZ29yaXRobSBhbGdvcml0aG0gPSBudWxsOw0KKwkgICAgDQorCQlwdWJsaWMgTmVkbGVhck1lYWRTaW1wbGV4RnVuY3Rpb24oDQorCQkJCWZpbmFsIExpc3Q8TW9kaWZpYWJsZVBhcmFtZXRlcj4gcGFyYW1ldGVycywNCisJCQkJZmluYWwgU2NlbmFyaW8gcEJhc2VTY2VuYXJpbywgDQorCQkJCWZpbmFsIEVycm9yRnVuY3Rpb24gZXJyb3JGdW5jdGlvbiwgDQorCQkJCWZpbmFsIEVycm9yQW5hbHlzaXNBbGdvcml0aG0gYWxnb3JpdGhtKSB7DQorCQkJDQorCQkJdHJ5IHsNCisJCQkJcmVzdWx0V3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoTE9HX0ZJTEVfTkFNRSk7DQorCQkJCWJhc2VTY2VuYXJpbyA9IHBCYXNlU2NlbmFyaW87DQorCQkJCXRoaXMuZXJyb3JGdW5jdGlvbiA9IGVycm9yRnVuY3Rpb247DQorCQkJCXRoaXMuYWxnb3JpdGhtID0gYWxnb3JpdGhtOw0KKwkJCQkNCisJCQkJaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgew0KKwkJCQkJcGFyYW1ldGVyTmFtZXMgPSBuZXcgU3RyaW5nW3BhcmFtZXRlcnMuc2l6ZSgpXTsNCisJCQkJCWRlY29yYXRvclVSSXMgPSBuZXcgVVJJW3BhcmFtZXRlcnMuc2l6ZSgpXTsNCisJCQkJCWludCBpPTA7DQorCQkJCQlmb3IgKGZpbmFsIE1vZGlmaWFibGVQYXJhbWV0ZXIgcGFyYW06cGFyYW1ldGVycykgew0KKwkJCQkJCWRlY29yYXRvclVSSXNbaV09cGFyYW0uZ2V0VGFyZ2V0VVJJKCk7DQorCQkJCQkJcGFyYW1ldGVyTmFtZXNbaSsrXSA9IHBhcmFtLmdldEZlYXR1cmVOYW1lKCk7DQorCQkJCQkJcmVzdWx0V3JpdGVyLndyaXRlKHBhcmFtZXRlck5hbWVzW2ktMV0pOw0KKwkJCQkJCXJlc3VsdFdyaXRlci53cml0ZSgiLCIpOw0KKwkJCQkJfQ0KKwkJCQkJcmVzdWx0V3JpdGVyLndyaXRlKCJlcnJvciIpOw0KKwkJCQkJcmVzdWx0V3JpdGVyLndyaXRlKExTKTsNCisJCQkJfQ0KKwkJCX0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7DQorCQkJCWlvZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQl9DQorCQl9DQorCQkNCisJCXB1YmxpYyBFcnJvclJlc3VsdCBnZXRWYWx1ZShkb3VibGVbXSBwYXJhbWV0ZXJzKSB7DQorCQkJDQorCQkJDQorCQkJc2ltdWxhdGlvbiA9IGNyZWF0ZVNpbXVsYXRpb24oYmFzZVNjZW5hcmlvKTsNCisJCQlzaW11bGF0aW9uLnNldFNlcXVlbmNlTnVtYmVyKHNpbXVsYXRpb24uZ2V0U2VxdWVuY2VOdW1iZXIoKSsxKTsNCisJCQkNCisJCQkvLyBEZXNjZW5kIGludG8gdGhlIFNjZW5hcmlvIGxvb2tpbmcgZm9yIHNvbWV0aGluZyB3aXRoIGEgZG91YmxlIGZpZWxkDQorCQkJZmluYWwgRUxpc3Q8RGVjb3JhdG9yPiBkZWNzID0gYmFzZVNjZW5hcmlvLmdldENhbm9uaWNhbEdyYXBoKCkuZ2V0RGVjb3JhdG9ycygpOw0KKwkNCisJCQlEZWNvcmF0b3IgZGVmYXVsdERlY29yYXRvciA9IG51bGw7DQorCQkJZm9yIChEZWNvcmF0b3IgZGVjb3JhdG9yIDogZGVjcykgew0KKwkJCQlpZiAoZGVjb3JhdG9yIGluc3RhbmNlb2YgRGlzZWFzZU1vZGVsKSB7DQorCQkJCQlkZWZhdWx0RGVjb3JhdG9yID0gZGVjb3JhdG9yOyANCisJCQkJCWJyZWFrOw0KKwkJCQl9DQorCQkJfQ0KKwkJCQ0KKwkJCWZvcihpbnQgaT0wO2k8cGFyYW1ldGVyTmFtZXMubGVuZ3RoOysraSkgew0KKwkJCQlEZWNvcmF0b3IgZGVjb3JhdG9yID0gZGVmYXVsdERlY29yYXRvcjsNCisJCQkJaWYoZGVjb3JhdG9yVVJJc1tpXSAhPSBudWxsKSANCisJCQkJCWZvcihEZWNvcmF0b3Igc2NlbmFyaW9EZWM6ZGVjcykgDQorCQkJCQkJaWYoZGVjb3JhdG9yVVJJc1tpXS50b1N0cmluZygpLmVxdWFscyhzY2VuYXJpb0RlYy5nZXRVUkkoKS50b1N0cmluZygpKSkgew0KKwkJCQkJCQlkZWNvcmF0b3IgPSBzY2VuYXJpb0RlYzsNCisJCQkJCQkJYnJlYWs7DQorCQkJCQkJfQ0KKwkJCQlmb3IgKEVBdHRyaWJ1dGUgYXR0cmlidXRlIDogZGVjb3JhdG9yLmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCkpIA0KKwkJCQkJaWYoYXR0cmlidXRlLmdldE5hbWUoKS5lcXVhbHMocGFyYW1ldGVyTmFtZXNbaV0pKSANCisJCQkJCQlkZWNvcmF0b3IuZVNldChhdHRyaWJ1dGUsIG5ldyBEb3VibGUocGFyYW1ldGVyc1tpXSkpOw0KKwkJCX0NCisJCQkNCisJCQljc3ZMb2dnZXIgPSBuZXcgQ3VzdG9tQ1NWTG9nZ2VyKFNJTVVMQVRJT05fT1VUUFVUX0RJUiwgc2ltdWxhdGlvbiwgKEludGVncmF0aW9uRGVjb3JhdG9yKSBkZWZhdWx0RGVjb3JhdG9yKTsNCisNCisJCQkvLyBUaGlzIHdpbGwgcmVpbml0IHRoZSBpbmZlY3RvcnMvaW5vYyBldGMgdG8gdGhlIG5ldyB2YWx1ZXMgDQorCQkJYmFzZVNjZW5hcmlvLnJlc2V0KCk7DQorDQorDQorCQkJLy9SdW4gdGhlIHNpbXVsYXRpb24gd2l0aCB0aGUgbmV3IHBhcmFtZXRlcnMgYW5kIHJldHVybiB0aGUgZXJyb3IgdmFsdWUNCisJCQlBY3RpdmF0b3IubG9nSW5mb3JtYXRpb24oIlJ1bm5pbmcgdGhlIHNpbXVsYXRpb24gd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6ICIpOw0KKwkJCUFjdGl2YXRvci5sb2dJbmZvcm1hdGlvbigiXHRQYXJhbWV0ZXJzIE5hbWVzOiAiICsgQXJyYXlzLnRvU3RyaW5nKHBhcmFtZXRlck5hbWVzKSk7DQorCQkJQWN0aXZhdG9yLmxvZ0luZm9ybWF0aW9uKCJcdFBhcmFtZXRlcnMgVmFsdWVzOiAiICsgQXJyYXlzLnRvU3RyaW5nKHBhcmFtZXRlcnMpKTsNCisJCQlkb3VibGUgZXJyb3IgPSAwLjA7DQorCQkJRXJyb3JSZXN1bHQgcmVzdWx0ID0gbnVsbDsNCisJCQl0cnkgew0KKwkJCQlmb3IoZG91YmxlIHZhbDpwYXJhbWV0ZXJzKSByZXN1bHRXcml0ZXIud3JpdGUodmFsKyIsIik7DQorCQkJCUVycm9yQW5hbHlzaXNBbGdvcml0aG1FdmVudCBuZXdFdmVudCA9IG5ldyBFcnJvckFuYWx5c2lzQWxnb3JpdGhtRXZlbnQobnVsbCwgQUxHT1JJVEhNX1NUQVRVUy5TVEFSVElOR19TSU1VTEFUSU9OKTsNCisJCQkJbmV3RXZlbnQucGFyYW1ldGVyTmFtZXMgPSBwYXJhbWV0ZXJOYW1lczsNCisJCQkJbmV3RXZlbnQucGFyYW1ldGVyVmFsdWVzID0gcGFyYW1ldGVyczsNCisJCQkJKChBYnN0cmFjdEVycm9yQW5hbHlzaXNBbGdvcml0aG0pYWxnb3JpdGhtKS5maXJlRXZlbnQoDQorCQkJCQkJbmV3RXZlbnQpOw0KKwkJCQlydW5TaW11bGF0aW9uKHNpbXVsYXRpb24pOw0KKwkJCQ0KKwkJCQlyZXN1bHQgPSAgZ2V0RXJyb3JWYWx1ZShzaW11bGF0aW9uLmdldFVuaXF1ZUlEU3RyaW5nKCkpOw0KKwkJCQ0KKwkJCQluZXdFdmVudCA9IG5ldyBFcnJvckFuYWx5c2lzQWxnb3JpdGhtRXZlbnQocmVzdWx0LCBBTEdPUklUSE1fU1RBVFVTLkZJTklTSEVEX1NJTVVMQVRJT04pOw0KKwkJCQluZXdFdmVudC5wYXJhbWV0ZXJOYW1lcyA9IHBhcmFtZXRlck5hbWVzOw0KKwkJCQluZXdFdmVudC5wYXJhbWV0ZXJWYWx1ZXMgPSBwYXJhbWV0ZXJzOw0KKwkJCQkNCisJCQkJKChBYnN0cmFjdEVycm9yQW5hbHlzaXNBbGdvcml0aG0pYWxnb3JpdGhtKS5maXJlRXZlbnQoDQorCQkJCQkJbmV3RXZlbnQpOw0KKwkJCQkNCisJCQkJZXJyb3IgPSByZXN1bHQuZ2V0RXJyb3IoKTsNCisJCQkJDQorCQkJCUFjdGl2YXRvci5sb2dJbmZvcm1hdGlvbigiIEVycm9yIGlzOiAiICsgZXJyb3IpOw0KKwkJCQlBY3RpdmF0b3IubG9nSW5mb3JtYXRpb24oIiBFcnJvciBpbiB2YWxpZGF0aW9uIGRhdGEgc2V0IGlzOiAiICsgcmVzdWx0LmdldFZhbGlkYXRpb25FcnJvcigpKTsNCisJCQkJcmVzdWx0V3JpdGVyLndyaXRlKGVycm9yKyIiKTsNCisJCQkJcmVzdWx0V3JpdGVyLndyaXRlKExTKTsNCisJCQkJcmVzdWx0V3JpdGVyLmZsdXNoKCk7DQorCQkJCQ0KKwkJCQkvLyBUT0RPOiBHVUkgb3V0cHV0IGhlcmUNCisJCQkJDQorCQkJCQ0KKwkJIAkJDQorCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpIHsNCisJCQkJaW9lLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCX0NCisJCQljbGVhbnVwKCk7DQorCQkJDQorCQkJcmV0dXJuIHJlc3VsdDsNCisJCX0NCisJCQ0KKwkJcHJpdmF0ZSBFcnJvclJlc3VsdCBnZXRFcnJvclZhbHVlKFN0cmluZyBzaW11bGF0aW9uVW5pcXVlSWQpIHsNCisJCQlFcnJvclJlc3VsdCByZXN1bHQgPSBudWxsOw0KKwkJCXRyeSB7DQorCQkJCWZpbmFsIEVMaXN0PERlY29yYXRvcj4gZGVjcyA9IGJhc2VTY2VuYXJpby5nZXRDYW5vbmljYWxHcmFwaCgpLmdldERlY29yYXRvcnMoKTsNCisJCQkJDQorCQkJCURpc2Vhc2VNb2RlbCBkZWZhdWx0RGVjb3JhdG9yID0gbnVsbDsNCisJCQkJZm9yIChEZWNvcmF0b3IgZGVjb3JhdG9yIDogZGVjcykgew0KKwkJCQkJaWYgKGRlY29yYXRvciBpbnN0YW5jZW9mIERpc2Vhc2VNb2RlbCkgew0KKwkJCQkJCWRlZmF1bHREZWNvcmF0b3IgPSAoRGlzZWFzZU1vZGVsKWRlY29yYXRvcjsgDQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJDQorCQkJCWlmIChkZWZhdWx0RGVjb3JhdG9yICE9IG51bGwpIHsNCisJCQkJCUNTVnNjZW5hcmlvTG9hZGVyIGxvYWRlcjIgPSBuZXcgQ1NWc2NlbmFyaW9Mb2FkZXIoU0lNVUxBVElPTl9PVVRQVVRfRElSICsgRmlsZS5zZXBhcmF0b3IgKyBzaW11bGF0aW9uVW5pcXVlSWQgKyIvIitkZWZhdWx0RGVjb3JhdG9yLmdldERpc2Vhc2VOYW1lKCkrIi8iK2RlZmF1bHREZWNvcmF0b3IuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSk7DQorCQkJCQlpbnQgbWF4cmVzID0gbG9hZGVyMi5nZXRNYXhSZXNvbHV0aW9uKCk7DQorCQkJCQlSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIGRhdGEgPSBsb2FkZXIyLnBhcnNlQWxsRmlsZXMobWF4cmVzKTsNCisJCQ0KKwkJCQkJcmVzdWx0ID0gZXJyb3JGdW5jdGlvbi5jYWxjdWxhdGVFcnJvcihyZWYsIGRhdGEpOw0KKwkJCQl9DQorCQkJfSBjYXRjaCAoU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiBlKSB7DQorCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJfQ0KKwkJCXJldHVybiByZXN1bHQ7DQorCQl9DQorCQkNCisJCXByaXZhdGUgdm9pZCBydW5TaW11bGF0aW9uKGZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb25Ub1J1bikgew0KKwkJCWxvbmcgYmVmb3JlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7DQorCQkJc2ltdWxhdGlvblRvUnVuLnJ1bigpOw0KKwkJCXRyeSB7DQorCQkJCXNpbXVsYXRpb25Ub1J1bi5qb2luKCk7DQorCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCX0NCisJCQlzaW11bGF0aW9uVG9SdW4uc3RvcCgpOwkJCQ0KKwkJCQ0KKwkJCWxvbmcgYWZ0ZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsNCisJCQlBY3RpdmF0b3IubG9nSW5mb3JtYXRpb24oIkl0IHRvb2sgIiArIChhZnRlci1iZWZvcmUpLzEwMDAgKyAiIHNlY29uZHMgdG8gcnVuIHRoZSBzaW11bGF0aW9uIik7DQorCQl9DQorCQkNCisJCXByaXZhdGUgdm9pZCBjbGVhbnVwKCkgew0KKwkJCWlmIChjc3ZMb2dnZXIgIT0gbnVsbCkgew0KKwkJCQljc3ZMb2dnZXIuY2xvc2UoKTsNCisJCQkJY3N2TG9nZ2VyID0gbnVsbDsNCisJCQl9DQorCQkJc2ltTWdyLnJlbW92ZUFjdGl2ZVNpbXVsYXRpb24oc2ltdWxhdGlvbik7DQorCQkJKChTaW11bGF0aW9uKXNpbXVsYXRpb24pLmRlc3Ryb3koKTsNCisJCQlzaW11bGF0aW9uID0gbnVsbDsNCisJCQlDdXN0b21TaW11bGF0aW9uTWFuYWdlci5yZXNldFNpbXVsYXRpb25NYW5hZ2VyKCk7DQorCQl9DQorCQkNCisJCXByaXZhdGUgSVNpbXVsYXRpb24gY3JlYXRlU2ltdWxhdGlvbihTY2VuYXJpbyBzY2VuYXJpbykgew0KKwkJCVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IChTaW11bGF0aW9uKXNpbU1nci5jcmVhdGVTaW11bGF0aW9uKHNjZW5hcmlvLCBudWxsKTsNCisJCQlzaW11bGF0aW9uLnNpbXVsYXRpb25TbGVlcCA9IGZhbHNlOw0KKwkJCXJldHVybiBzaW11bGF0aW9uOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L1NpbXBsZXhGdW5jdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvU2ltcGxleEZ1bmN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2NDZmYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L1NpbXBsZXhGdW5jdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yUmVzdWx0Ow0KKzsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwdWJsaWMgaW50ZXJmYWNlIFNpbXBsZXhGdW5jdGlvbiB7DQorCXB1YmxpYyBFcnJvclJlc3VsdCBnZXRWYWx1ZShkb3VibGVbXSBwYXJhbWV0ZXJzKTsgDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L2V4ZWN1dGFibGUvQXV0b21hdGljRXhwZXJpbWVudEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvZXhlY3V0YWJsZS9BdXRvbWF0aWNFeHBlcmltZW50RXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyM2RiOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L2V4ZWN1dGFibGUvQXV0b21hdGljRXhwZXJpbWVudEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50LmV4ZWN1dGFibGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50LkVycm9yQW5hbHlzaXNBbGdvcml0aG07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmFkYXB0ZXJzLmV4ZWN1dGFibGUuZW1mLkV4ZWN1dGFibGVBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5hZGFwdGVycy5leGVjdXRhYmxlLmVtZi5FeGVjdXRhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZTsKKworaW1wb3J0IGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudDsKK2ltcG9ydCBhdXRvbWF0aWNleHBlcmltZW50LnV0aWwuQXV0b21hdGljZXhwZXJpbWVudEFkYXB0ZXJGYWN0b3J5OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4ge0BsaW5rIEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeX0gdGhhdCBjcmVhdGVzIGFkYXB0ZXJzIHRoYXQKKyAqIGFkYXB0IHtAbGluayBBdXRvbWF0aWNFeHBlcmltZW50fXMgdG8ge0BsaW5rIElFeGVjdXRhYmxlfXMuCisgKi8KK3B1YmxpYyBjbGFzcyBBdXRvbWF0aWNFeHBlcmltZW50RXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5IAorCWV4dGVuZHMJQXV0b21hdGljZXhwZXJpbWVudEFkYXB0ZXJGYWN0b3J5IAorCWltcGxlbWVudHMgRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5IAoreworCisJLyoqCisJICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBBdXRvbWF0aWNFeHBlcmltZW50RXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5KCkgeworCQlzdXBlcigpOworCQlFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRkQWRhcHRlckZhY3RvcnkodGhpcyk7CisJfQorCQorCS8qKgorCSAqIEBzZWUgYXV0b21hdGljZXhwZXJpbWVudC51dGlsLkF1dG9tYXRpY2V4cGVyaW1lbnRBZGFwdGVyRmFjdG9yeSNjcmVhdGVBdXRvbWF0aWNFeHBlcmltZW50QWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQXV0b21hdGljRXhwZXJpbWVudEFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgQXV0b21hdGljRXhwZXJpbWVudEV4ZWN1dGFibGVBZGFwdGVyKCk7CisJfQorCisJLyoqCisJICogQHNlZSBhdXRvbWF0aWNleHBlcmltZW50LnV0aWwuQXV0b21hdGljZXhwZXJpbWVudEFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKGZpbmFsIE9iamVjdCB0eXBlKSB7CisJCXJldHVybiB0eXBlID09IElFeGVjdXRhYmxlLmNsYXNzIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CisJfQorCQorCS8qKgorCSAqIFRoaXMgY2xhc3MgYWRhcHRzIGFuIHtAbGluayBBdXRvbWF0aWNFeHBlcmltZW50fSB0byBhbiB7QGxpbmsgSUV4ZWN1dGFibGV9LgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQXV0b21hdGljRXhwZXJpbWVudEV4ZWN1dGFibGVBZGFwdGVyIGV4dGVuZHMKKwkJCUV4ZWN1dGFibGVBZGFwdGVyIGltcGxlbWVudHMgQWRhcHRlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmFkYXB0ZXJzLmV4ZWN1dGFibGUuZW1mLkV4ZWN1dGFibGVBZGFwdGVyI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXIgbWFuYWdlciA9IEF1dG9tYXRpY0V4cGVyaW1lbnRNYW5hZ2VyLmdldEluc3RhbmNlKCk7CisJCQlBdXRvbWF0aWNFeHBlcmltZW50IGV4cCA9IChBdXRvbWF0aWNFeHBlcmltZW50KWdldFRhcmdldCgpOworCQkJRXJyb3JBbmFseXNpc0FsZ29yaXRobSBhbGdvcml0aG0gPSBtYW5hZ2VyLmNyZWF0ZUFsZ29yaXRobShleHAuZ2V0RXJyb3JBbmFseXNpc0FsZ29yaXRobSgpKTsKKwkJCW1hbmFnZXIuZXhlY3V0ZUFsZ29yaXRobShhbGdvcml0aG0sIGV4cCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC9wZXJzcGVjdGl2ZXMvQXV0b21hdGljRXhwZXJpbWVudC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvcGVyc3BlY3RpdmVzL0F1dG9tYXRpY0V4cGVyaW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzA0ZTEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvcGVyc3BlY3RpdmVzL0F1dG9tYXRpY0V4cGVyaW1lbnQuamF2YQpAQCAtMCwwICsxLDcwIEBACisvLyBBbmFseXNpcy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC5wZXJzcGVjdGl2ZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50LnZpZXdzLkF1dG9FeHBWaWV3OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZvbGRlckxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuUHJvamVjdEV4cGxvcmVyOworCisKKy8qKgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSAiQW5hbHlzaXMiIHBlcnNwZWN0aXZlIG9mIFNURU0uIFRoaXMgcGVyc3BlY3RpdmUgaXMKKyAqIHVzZWQgdG8gcmV2aWV3IGFuZCBjb21wYXJlIHRoZSByZXN1bHRzIG9mIGRpZmZlcmVudCBydW5zLgorICovCitwdWJsaWMgY2xhc3MgQXV0b21hdGljRXhwZXJpbWVudCBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgeworCisJLyoqCisJICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIERlc2lnbmVyIFBlcnNwZWN0aXZlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfU1RFTV9BVVRPTUFUSUNfRVhQRVJJTUVOVF9QRVJTUEVDVElWRSA9IENvbnN0YW50cy5JRF9ST09UCisJCQkrICIuYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC5wZXJzcGVjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeSNjcmVhdGVJbml0aWFsTGF5b3V0KG9yZy5lY2xpcHNlLnVpCisJICogICAgICAuSVBhZ2VMYXlvdXQpCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChmaW5hbCBJUGFnZUxheW91dCBsYXlvdXQpIHsKKwkJZmluYWwgU3RyaW5nIGVkaXRvckFyZWEgPSBsYXlvdXQuZ2V0RWRpdG9yQXJlYSgpOworCisJCS8vIFdlIGRvbid0IHdhbnQgdG8gc2VlIHRoZSBlZGl0b3IKKwkJbGF5b3V0LnNldEVkaXRvckFyZWFWaXNpYmxlKGZhbHNlKTsKKwkJLy8gUHV0IHRoZSBTVEVNIEFuYWx5c2lzIFZpZXcgYnkgaXRzZWxmIG9uIHRoZSB0b3AKKwkJbGF5b3V0LmFkZFN0YW5kYWxvbmVWaWV3KEF1dG9FeHBWaWV3LklEX0F1dG9FeHBfVklFVywgdHJ1ZSwgSVBhZ2VMYXlvdXQuUklHSFQsCisJCQkJMC4wZiwgZWRpdG9yQXJlYSk7CisJCQorCQkvLyBQdXQgdGhlIFByb2plY3RFeHBsb3JlciB2aWV3IG9uIHRoZSBsZWZ0CisJCWZpbmFsIElGb2xkZXJMYXlvdXQgbGVmdCA9IGxheW91dC5jcmVhdGVGb2xkZXIoImxlZnQiLCBJUGFnZUxheW91dC5MRUZULCAwLjIwZiwgQXV0b0V4cFZpZXcuSURfQXV0b0V4cF9WSUVXKTsKKwkJbGVmdC5hZGRWaWV3KFByb2plY3RFeHBsb3Jlci5WSUVXX0lEKTsKKwkJCisJCS8vIFB1dCB0aGUgRXJyb3IgTG9nCisJCWZpbmFsIElGb2xkZXJMYXlvdXQgYm90dG9tID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigicmlnaHQiLCBJUGFnZUxheW91dC5CT1RUT00sIC8vJE5PTi1OTFMtMSQKKwkJCQkwLjYwZiwgQXV0b0V4cFZpZXcuSURfQXV0b0V4cF9WSUVXKTsKKwkJLy8gYWRkIEVycm9yIExvZyB2aWV3CisJCWJvdHRvbS5hZGRWaWV3KCJvcmcuZWNsaXBzZS5wZGUucnVudGltZS5Mb2dWaWV3Iik7IC8vJE5PTi1OTFMtMSQKKwkJCisJCS8vIGFkZCB0aGUgdmlldyB0byB0aGUgIlNob3cgVmlld3MiIG1lbnUKKwkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoQXV0b0V4cFZpZXcuSURfQXV0b0V4cF9WSUVXKTsKKwkJCisJCS8vIFdlIGRvbid0IHdhbnQgdG8gc2VlIHRoZSBlZGl0b3IKKwkJbGF5b3V0LnNldEVkaXRvckFyZWFWaXNpYmxlKGZhbHNlKTsKKworCQkvLyBBZGQgdGhlIEFuYWx5c2lzIHBlcnNwZWN0aXZlIHRvIHRoZSAiT3BlbiBQZXJzcGVjdGl2ZSIgbWVudQorCQlsYXlvdXQuYWRkUGVyc3BlY3RpdmVTaG9ydGN1dChJRF9TVEVNX0FVVE9NQVRJQ19FWFBFUklNRU5UX1BFUlNQRUNUSVZFKTsKKworCQkKKwl9IC8vIGNyZWF0ZUluaXRpYWxMYXlvdXQKKworfSAvLyBBbmFseXNpcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L3VpL05ld0F1dG9tYXRpY0V4cGVyaW1lbnRXaXphcmQuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L3VpL05ld0F1dG9tYXRpY0V4cGVyaW1lbnRXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTE5OGY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvdWkvTmV3QXV0b21hdGljRXhwZXJpbWVudFdpemFyZC5qYXZhCkBAIC0wLDAgKzEsNTA4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC51aTsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQudWkuTmV3QXV0b21hdGljRXhwZXJpbWVudFdpemFyZC5OZXdBdXRvbWF0aWNFeHBlcmltZW50UGFnZTIuUGFyYW1ldGVyRGV0YWlsczsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnRQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW87DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb1BhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5EdWJsaW5Db3JlUGFnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVBhZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdTVEVNUHJvamVjdFdpemFyZDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7DQorDQoraW1wb3J0IGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudDsNCitpbXBvcnQgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNleHBlcmltZW50RmFjdG9yeTsNCitpbXBvcnQgYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNleHBlcmltZW50UGFja2FnZTsNCitpbXBvcnQgYXV0b21hdGljZXhwZXJpbWVudC5Nb2RpZmlhYmxlUGFyYW1ldGVyOw0KKw0KK3B1YmxpYyBjbGFzcyBOZXdBdXRvbWF0aWNFeHBlcmltZW50V2l6YXJkIA0KKwlleHRlbmRzIE5ld0lkZW50aWZpYWJsZVdpemFyZCB7DQorCQ0KKwlwcm90ZWN0ZWQgTmV3QXV0b21hdGljRXhwZXJpbWVudFBhZ2UyIHBhZ2UyID0gbnVsbDsNCisJDQorCXB1YmxpYyBOZXdBdXRvbWF0aWNFeHBlcmltZW50V2l6YXJkKCkgew0KKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViDQorCX0NCisNCisJLyoqDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNhZGRQYWdlcygpDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7DQorCQlzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoZmFsc2UpOw0KKwkJbmV3SWRlbnRpZmlhYmxlUGFnZSA9IGNyZWF0ZU5ld0lkZW50aWZpYWJsZVBhZ2UoKTsNCisJCS8vIFdlcmUgd2Ugc3VjY2Vzc2Z1bCBpbiBjcmVhdGluZyB0aGUgcGFnZT8NCisJCWlmIChuZXdJZGVudGlmaWFibGVQYWdlID09IG51bGwpIHsNCisJCQkvLyBObw0KKwkJCXJldHVybjsNCisJCX0NCisJCXBhZ2UyID0gY3JlYXRlV2l6YXJkUGFnZTIoKTsNCisJCS8vIFdlcmUgd2Ugc3VjY2Vzc2Z1bCBpbiBjcmVhdGluZyB0aGUgcGFnZT8NCisJCWlmIChwYWdlMiA9PSBudWxsKSB7DQorCQkJLy8gTm8NCisJCQlyZXR1cm47DQorCQl9DQorCQluZXdEdWJsaW5Db3JlUGFnZSA9IGNyZWF0ZUR1YmxpbkNvcmVQYWdlKCk7DQorCQkvLyBXZXJlIHdlIHN1Y2Nlc3NmdWwgaW4gY3JlYXRpbmcgdGhlIHBhZ2U/DQorCQlpZiAobmV3RHVibGluQ29yZVBhZ2UgPT0gbnVsbCkgew0KKwkJCS8vIE5vDQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJYWRkUGFnZShuZXdJZGVudGlmaWFibGVQYWdlKTsNCisJCWFkZFBhZ2UocGFnZTIpOw0KKwkJYWRkUGFnZShuZXdEdWJsaW5Db3JlUGFnZSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNnZXROZXh0UGFnZShvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UpDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsNCisJCWZpbmFsIElXaXphcmRQYWdlIG5leHRQYWdlID0gc3VwZXIuZ2V0TmV4dFBhZ2UocGFnZSk7DQorCQlpZiAobmV4dFBhZ2UgaW5zdGFuY2VvZiBOZXdBdXRvbWF0aWNFeHBlcmltZW50UGFnZTIpIHsNCisJCQlOZXdBdXRvbWF0aWNFeHBlcmltZW50UGFnZTEgcGFnZTEgPSAoTmV3QXV0b21hdGljRXhwZXJpbWVudFBhZ2UxKW5ld0lkZW50aWZpYWJsZVBhZ2U7DQorCQkJcGFnZTIuc2V0U2VsZWN0ZWRQYXJhbWV0ZXJzKHBhZ2UxLnBhcmFtZXRlcnNMaXN0LmdldFNlbGVjdGlvbigpKTsNCisJCX0NCisJCXJldHVybiBuZXh0UGFnZTsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIER1YmxpbkNvcmVQYWdlIGNyZWF0ZUR1YmxpbkNvcmVQYWdlKCkgew0KKwkJcmV0dXJuIG5ldyBEdWJsaW5Db3JlUGFnZSgpIHsNCisJCQkvKioNCisJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQuRHVibGluQ29yZVBhZ2UjaW5pdGlhbGl6ZURDRmllbGRzKCkNCisJCQkgKi8NCisJCQlAT3ZlcnJpZGUNCisJCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRENBdHRyaWJ1dGVzKCkgew0KKwkJCQlzdXBlci5pbml0aWFsaXplRENBdHRyaWJ1dGVzKCk7DQorCQkJCWZvcm1hdC5zZXRUZXh0KEV4cGVyaW1lbnRQYWNrYWdlLmVOU19VUkkpOw0KKwkJCQlmb3JtYXQuc2V0RW5hYmxlZChmYWxzZSk7DQorCQkJCXR5cGUuc2V0VGV4dChTVEVNVVJJLkVYUEVSSU1FTlRfVFlQRV9VUkkudG9TdHJpbmcoKSk7DQorCQkJCXR5cGUuc2V0RW5hYmxlZChmYWxzZSk7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIElkZW50aWZpYWJsZSBjcmVhdGVJZGVudGlmaWFibGUoKSB7DQorCQlyZXR1cm4gY3JlYXRlQXV0b21hdGljRXhwZXJpbWVudCgpOw0KKwl9DQorDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgTmV3SWRlbnRpZmlhYmxlUGFnZSBjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlKCkgew0KKwkJTmV3QXV0b21hdGljRXhwZXJpbWVudFBhZ2UxIHBhZ2UxID0gbmV3IE5ld0F1dG9tYXRpY0V4cGVyaW1lbnRQYWdlMShnZXRTaGVsbCgpLCAiTmV3IEF1dG9tYXRpYyBFeHBlcmltZW50IFdpemFyZCIpOyAvLyROT04tTkxTLTEkDQorCQlwYWdlMS5zZXRUaXRsZSgiVGl0bGUgdG8gZXh0ZXJuYWxpemUiKTsgLy8kTk9OLU5MUy0xJA0KKwkJcGFnZTEuc2V0RGVzY3JpcHRpb24oIkRlc2NyaXB0aW9uIHRvIGV4dGVybmFsaXplIik7IC8vJE5PTi1OTFMtMSQJCQ0KKwkJcmV0dXJuIHBhZ2UxOw0KKwl9DQorCQ0KKwlwcm90ZWN0ZWQgTmV3QXV0b21hdGljRXhwZXJpbWVudFBhZ2UyIGNyZWF0ZVdpemFyZFBhZ2UyKCkgew0KKwkJTmV3QXV0b21hdGljRXhwZXJpbWVudFBhZ2UyIHBhZ2UyID0gbmV3IE5ld0F1dG9tYXRpY0V4cGVyaW1lbnRQYWdlMigiTmV3IEF1dG9tYXRpYyBFeHBlcmltZW50IFdpemFyZCIpOyAvLyROT04tTkxTLTEkDQorCQlwYWdlMi5zZXRUaXRsZSgiVGl0bGUgdG8gZXh0ZXJuYWxpemUiKTsgLy8kTk9OLU5MUy0xJA0KKwkJcGFnZTIuc2V0RGVzY3JpcHRpb24oIkRlc2NyaXB0aW9uIHRvIGV4dGVybmFsaXplIik7IC8vJE5PTi1OTFMtMSQJCQ0KKwkJcmV0dXJuIHBhZ2UyOw0KKwl9DQorDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25GaWxlTmFtZUV4dGVuc2lvbigpIHsNCisJCXJldHVybiBBdXRvbWF0aWNleHBlcmltZW50UGFja2FnZS5lTkFNRTsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJpYWxpemF0aW9uRm9sZGVyTmFtZSgpIHsNCisJCXJldHVybiBOZXdTVEVNUHJvamVjdFdpemFyZC5FWFBFUklNRU5UU19GT0xERVJfTkFNRTsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIFN0cmluZyBnZXRXaXphcmRUaXRsZSgpIHsNCisJCS8vIFRPRE8gRXh0ZXJuYWxpc2UgdGhpcyBzdHJpbmcNCisJCXJldHVybiAiQXV0b21hdGljIEV4cGVyaW1lbnQgV2l6YXJkIjsNCisJfQ0KKwkNCisJcHJvdGVjdGVkIEF1dG9tYXRpY0V4cGVyaW1lbnQgY3JlYXRlQXV0b21hdGljRXhwZXJpbWVudCgpIHsNCisJCUF1dG9tYXRpY0V4cGVyaW1lbnQgYXV0b0V4cGVyaW1lbnQgPSBBdXRvbWF0aWNleHBlcmltZW50RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXV0b21hdGljRXhwZXJpbWVudCgpOw0KKwkJYXV0b0V4cGVyaW1lbnQuc2V0RHVibGluQ29yZShuZXdEdWJsaW5Db3JlUGFnZS5jcmVhdGVEdWJsaW5Db3JlKCkpOw0KKwkJZmluYWwgTmV3QXV0b21hdGljRXhwZXJpbWVudFBhZ2UxIHBhZ2UxID0gKE5ld0F1dG9tYXRpY0V4cGVyaW1lbnRQYWdlMSluZXdJZGVudGlmaWFibGVQYWdlOw0KKwkJU3RyaW5nIGFsZ29yaXRobU5hbWUgPSBwYWdlMS5hbGdvcml0aG1Db21iby5nZXRUZXh0KCk7DQorCQlhdXRvRXhwZXJpbWVudC5zZXRFcnJvckFuYWx5c2lzQWxnb3JpdGhtKGFsZ29yaXRobU5hbWUpOw0KKwkJU3RyaW5nIGVycm9yRnVuY3Rpb24gPSBwYWdlMS5lcnJvckZ1bmN0aW9uQ29tYm8uZ2V0VGV4dCgpOw0KKwkJYXV0b0V4cGVyaW1lbnQuc2V0RXJyb3JGdW5jdGlvbihlcnJvckZ1bmN0aW9uKTsNCisJCWlmICghcGFnZTEubnVtT2ZJdGVyYXRpb25zU3Bpbm5lci5nZXRUZXh0KCkuZXF1YWxzKCIiKSkgew0KKwkJCUxvbmcgbnVtT2ZJdGVyYXRpb25zID0gbmV3IExvbmcocGFnZTEubnVtT2ZJdGVyYXRpb25zU3Bpbm5lci5nZXRUZXh0KCkpOw0KKwkJCWF1dG9FeHBlcmltZW50LnNldE1heGltdW1OdW1iZXJPZkl0ZXJhdGlvbnMobnVtT2ZJdGVyYXRpb25zKTsNCisJCX0NCisJCWlmICghcGFnZTEucmVmRGlyVGV4dC5nZXRUZXh0KCkudHJpbSgpLmVxdWFscygiIikpIHsNCisJCQlhdXRvRXhwZXJpbWVudC5zZXRSZWZlcmFuY2VEYXRhRGlyKHBhZ2UxLnJlZkRpclRleHQuZ2V0VGV4dCgpKTsNCisJCX0NCisJCWlmICghcGFnZTEucmVmRGlyVGV4dC5nZXRUZXh0KCkudHJpbSgpLmVxdWFscygiIikpIHsNCisJCQlTY2VuYXJpbyBzY2VuYXJpbyA9IGNyZWF0ZVNjZW5hcmlvKHBhZ2UxLnNjZW5hcmlvVGV4dC5nZXRUZXh0KCkpOw0KKwkJCWF1dG9FeHBlcmltZW50LnNldEJhc2VTY2VuYXJpbyhzY2VuYXJpbyk7DQorCQl9DQorCQlmb3IgKFN0cmluZyBwYXJhbTpwYWdlMi5wYXJhbVRvRGV0YWlsc09iai5rZXlTZXQoKSkgew0KKwkJCVBhcmFtZXRlckRldGFpbHMgZGV0YWlscyA9IHBhZ2UyLnBhcmFtVG9EZXRhaWxzT2JqLmdldChwYXJhbSk7DQorCQkJTW9kaWZpYWJsZVBhcmFtZXRlciBwYXJhbWV0ZXIgPSBBdXRvbWF0aWNleHBlcmltZW50RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTW9kaWZpYWJsZVBhcmFtZXRlcigpOw0KKwkJCXBhcmFtZXRlci5zZXRGZWF0dXJlTmFtZShwYXJhbSk7DQorCQkJcGFyYW1ldGVyLnNldEluaXRpYWxWYWx1ZShuZXcgRG91YmxlKGRldGFpbHMuaW5pdGlhbFZhbHVlVGV4dC5nZXRUZXh0KCkpKTsNCisJCQlwYXJhbWV0ZXIuc2V0U3RlcChuZXcgRG91YmxlKGRldGFpbHMuc3RlcFZhbHVlVGV4dC5nZXRUZXh0KCkpKTsNCisJCQlhdXRvRXhwZXJpbWVudC5nZXRQYXJhbWV0ZXJzKCkuYWRkKHBhcmFtZXRlcik7DQorCQl9DQorCQlyZXR1cm4gYXV0b0V4cGVyaW1lbnQ7DQorCX0NCisJDQorCXByb3RlY3RlZCBTY2VuYXJpbyBjcmVhdGVTY2VuYXJpbyhmaW5hbCBTdHJpbmcgc2NlbmFyaW9GaWxlKSB7DQorCQlmaW5hbCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsNCisJCXJlc291cmNlU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCIqIiwNCisJCQkJU1RFTVhNSVJlc291cmNlRmFjdG9yeUltcGwuSU5TVEFOQ0UpOw0KKw0KKwkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRQcm90b2NvbFRvRmFjdG9yeU1hcCgpLnB1dCgicGxhdGZvcm0iLA0KKwkJCQlTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbC5JTlNUQU5DRSk7DQorCQlmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKFVSSS5jcmVhdGVGaWxlVVJJKHNjZW5hcmlvRmlsZSksDQorCQkJCXRydWUpOw0KKwkJdHJ5IHsJCQkNCisJCQlyZXNvdXJjZS5sb2FkKG51bGwpOw0KKwkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsNCisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrDQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrDQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJCVNjZW5hcmlvIGxvYWRlZFNjZW5hcmlvID0gKFNjZW5hcmlvKXJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOw0KKwkJbG9hZGVkU2NlbmFyaW8uaW5pdGlhbGl6ZSgpOw0KKwkJcmV0dXJuIGxvYWRlZFNjZW5hcmlvOw0KKwkJLy9yZXR1cm4gU2NlbmFyaW9UZXN0LmNyZWF0ZUZpeHR1cmUoKTsNCisJfQ0KKwkNCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBOZXdBdXRvbWF0aWNFeHBlcmltZW50UGFnZTEgZXh0ZW5kcyBOZXdJZGVudGlmaWFibGVQYWdlIHsNCisJCQ0KKwkJcHVibGljIExpc3QgcGFyYW1ldGVyc0xpc3QgPSBudWxsOw0KKwkJcHVibGljIENvbWJvIGFsZ29yaXRobUNvbWJvID0gbnVsbDsJCQ0KKwkJcHVibGljIENvbWJvIGVycm9yRnVuY3Rpb25Db21ibyA9IG51bGw7DQorCQlwdWJsaWMgU3Bpbm5lciBudW1PZkl0ZXJhdGlvbnNTcGlubmVyID0gbnVsbDsNCisJCXB1YmxpYyBUZXh0IHJlZkRpclRleHQgPSBudWxsOw0KKwkJcHVibGljIFRleHQgc2NlbmFyaW9UZXh0ID0gbnVsbDsNCisJCXByb3RlY3RlZCBTaGVsbCBzaGVsbCA9IG51bGw7DQorLy8JCXB1YmxpYyBOZXdBdXRvbWF0aWNFeHBlcmltZW50UGFnZTIgcGFnZTIgPSBudWxsOw0KKwkJDQorCQkvKioNCisJCSAqIEBwYXJhbSBwYWdlTmFtZQ0KKwkJICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcGFnZQ0KKwkJICovDQorCQlwcm90ZWN0ZWQgTmV3QXV0b21hdGljRXhwZXJpbWVudFBhZ2UxKGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBTdHJpbmcgcGFnZU5hbWUpIHsNCisJCQlzdXBlcihwYWdlTmFtZSk7DQorCQkJdGhpcy5zaGVsbCA9IHNoZWxsOw0KKy8vCQkJcGFnZTIgPSBuZXcgTmV3QXV0b21hdGljRXhwZXJpbWVudFBhZ2UyKCJQYWdlIDIiKTsNCisvLwkJCXBhZ2UyLnNldFByZXZpb3VzUGFnZSh0aGlzKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlUGFnZSNjcmVhdGVTcGVjaWZpY0NvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVTcGVjaWZpY0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7DQorCQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7DQorCQkJZmluYWwgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsNCisJCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOw0KKwkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7DQorCQkJDQorCQkJZmluYWwgTGFiZWwgbGFiZWwwMSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsNCisJCQlsYWJlbDAxLnNldFRleHQoIkJhc2Ugc2NlbmFyaW86ICIpOw0KKwkJCXNjZW5hcmlvVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7DQorCQkJc2NlbmFyaW9UZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsNCisJCQlmaW5hbCBCdXR0b24gYnV0dG9uMDEgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOw0KKwkJCWJ1dHRvbjAxLnNldFRleHQoIlNlbGVjdCBTY2VuYXJpby4uLiIpOw0KKwkJCWJ1dHRvbjAxLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KKwkJCQkvKioNCisJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkNCisJCQkJICovDQorCQkJCUBPdmVycmlkZQ0KKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2VsZWN0aW9uRXZlbnQgZSkgew0KKwkJCQkJRmlsZURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwpOw0KKwkJCQkJZmlsZURpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLiIgKyBTY2VuYXJpb1BhY2thZ2UuZU5BTUUgfSApOw0KKwkJCQkJU3RyaW5nIHdvcmtzcGFjZURpciA9IFBsYXRmb3JtLmdldEluc3RhbmNlTG9jYXRpb24oKS5nZXRVUkwoKS5nZXRQYXRoKCk7DQorCQkJCQlpZiAod29ya3NwYWNlRGlyLnN0YXJ0c1dpdGgoIi8iKSB8fCB3b3Jrc3BhY2VEaXIuc3RhcnRzV2l0aCgiXFwiKSkgew0KKwkJCQkJCXdvcmtzcGFjZURpciA9IHdvcmtzcGFjZURpci5zdWJzdHJpbmcoMSk7DQorCQkJCQl9DQorCQkJCQlmaWxlRGlhbG9nLnNldEZpbHRlclBhdGgod29ya3NwYWNlRGlyKTsNCisJCQkJCVN0cmluZyBzY2VuYXJpb0ZpbGUgPSBmaWxlRGlhbG9nLm9wZW4oKTsNCisJCQkJCXNjZW5hcmlvVGV4dC5zZXRUZXh0KHNjZW5hcmlvRmlsZSk7DQorCQkJCX0NCisJCQkJDQorCQkJfSk7DQorCQkJDQorCQkJZmluYWwgTGFiZWwgbGFiZWwxMSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsNCisJCQlsYWJlbDExLnNldFRleHQoIkRpc2Vhc2UgTW9kZWwgUGFyYW1ldGVyczogIik7DQorCQkJcGFyYW1ldGVyc0xpc3QgPSBuZXcgTGlzdChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOw0KKwkJCWZvciAoU3RyaW5nIG5hbWU6Z2V0UGFyYW1ldGVyc05hbWVzKCkpIHsNCisJCQkJcGFyYW1ldGVyc0xpc3QuYWRkKG5hbWUpOw0KKwkJCX0NCisJCQlwYXJhbWV0ZXJzTGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsNCisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFNlbGVjdGlvbkV2ZW50IGUpIHsNCisJCQkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7DQorCQkJCX0JCQkJDQorCQkJfQ0KKwkJCSk7CQ0KKwkJCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUxMSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7DQorCQkJY29tcG9zaXRlMTEuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoU1dULlZFUlRJQ0FMKSk7CQkJDQorCQkJZmluYWwgQnV0dG9uIGJ1dHRvbjExID0gbmV3IEJ1dHRvbihjb21wb3NpdGUxMSwgU1dULk5PTkUpOw0KKwkJCWJ1dHRvbjExLnNldFRleHQoIlNlbGVjdCBBbGwiKTsNCisJCQlidXR0b24xMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsNCisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFNlbGVjdGlvbkV2ZW50IGUpIHsNCisJCQkJCXBhcmFtZXRlcnNMaXN0LnNlbGVjdEFsbCgpOw0KKwkJCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsNCisJCQkJfQkJCQkNCisJCQl9DQorCQkJKTsJCQkNCisJCQlmaW5hbCBCdXR0b24gYnV0dG9uMTIgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZTExLCBTV1QuTk9ORSk7DQorCQkJYnV0dG9uMTIuc2V0VGV4dCgiU2VsZWN0IE5vbmUiKTsNCisJCQlidXR0b24xMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsNCisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFNlbGVjdGlvbkV2ZW50IGUpIHsNCisJCQkJCXBhcmFtZXRlcnNMaXN0LmRlc2VsZWN0QWxsKCk7DQorCQkJCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOw0KKwkJCQl9CQkJCQ0KKwkJCX0NCisJCQkpOw0KKwkJCQ0KKwkJCWZpbmFsIExhYmVsIGxhYmVsMjEgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7DQorCQkJbGFiZWwyMS5zZXRUZXh0KCJFcnJvciBhbmFseXNpcyBhbGdvcml0aG06ICIpOwkJCQ0KKwkJCWFsZ29yaXRobUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7DQorCQkJYWxnb3JpdGhtQ29tYm8uYWRkKCJOZWRsZXItTWVhZCBBbGdvcml0aG0iKTsNCisJCQlhbGdvcml0aG1Db21iby5zZWxlY3QoMCk7DQorCQkJR3JpZERhdGEgZ3JpZERhdGEyMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7DQorCQkJZ3JpZERhdGEyMS5ob3Jpem9udGFsU3BhbiA9IDI7DQorCQkJYWxnb3JpdGhtQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YTIxKTsNCisJCQkNCisJCQlmaW5hbCBMYWJlbCBsYWJlbDMxID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOw0KKwkJCWxhYmVsMzEuc2V0VGV4dCgiRXJyb3IgZnVuY3Rpb246ICIpOwkJCQ0KKwkJCWVycm9yRnVuY3Rpb25Db21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOw0KKwkJCWVycm9yRnVuY3Rpb25Db21iby5hZGQoIlRocmVzaG9sZCBlcnJvciBmdW5jdGlvbiIpOw0KKwkJCWVycm9yRnVuY3Rpb25Db21iby5hZGQoIlNpbXBsZSBlcnJvciBmdW5jdGlvbiIpOw0KKwkJCWVycm9yRnVuY3Rpb25Db21iby5zZWxlY3QoMCk7DQorCQkJR3JpZERhdGEgZ3JpZERhdGEzMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7DQorCQkJZ3JpZERhdGEzMS5ob3Jpem9udGFsU3BhbiA9IDI7DQorCQkJZXJyb3JGdW5jdGlvbkNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEzMSk7DQorCQkJDQorCQkJZmluYWwgTGFiZWwgbGFiZWw0MSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsNCisJCQlsYWJlbDQxLnNldFRleHQoIk1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnM6ICIpOwkJCQ0KKwkJCW51bU9mSXRlcmF0aW9uc1NwaW5uZXIgPSBuZXcgU3Bpbm5lcihjb21wb3NpdGUsIFNXVC5CT1JERVIpOw0KKwkJCUdyaWREYXRhIGdyaWREYXRhNDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOw0KKwkJCWdyaWREYXRhNDEuaG9yaXpvbnRhbFNwYW4gPSAyOw0KKwkJCW51bU9mSXRlcmF0aW9uc1NwaW5uZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YTQxKTsNCisJCQkNCisJCQlmaW5hbCBMYWJlbCBsYWJlbDUxID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOw0KKwkJCWxhYmVsNTEuc2V0VGV4dCgiUmVmZXJlbmNlIGRhdGEgZGlyZWN0b3J5OiAiKTsNCisJCQlyZWZEaXJUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsNCisJCQlyZWZEaXJUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsNCisJCQlmaW5hbCBCdXR0b24gYnV0dG9uNTEgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOw0KKwkJCWJ1dHRvbjUxLnNldFRleHQoIkJyb3dzZS4uLiIpOw0KKwkJCWJ1dHRvbjUxLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KKwkJCQkvKioNCisJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkNCisJCQkJICovDQorCQkJCUBPdmVycmlkZQ0KKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2VsZWN0aW9uRXZlbnQgZSkgew0KKwkJCQkJRGlyZWN0b3J5RGlhbG9nIGRpckRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwpOw0KKwkJCQkJU3RyaW5nIGRpcmVjdG9yeSA9IGRpckRpYWxvZy5vcGVuKCk7DQorCQkJCQlyZWZEaXJUZXh0LnNldFRleHQoZGlyZWN0b3J5KTsNCisJCQkJfQ0KKwkJCQkNCisJCQl9KTsNCisJCQkNCisJCQlyZXR1cm4gY29tcG9zaXRlOw0KKwkJfQ0KKwkJDQorCQlwcml2YXRlIGphdmEudXRpbC5MaXN0PFN0cmluZz4gZ2V0UGFyYW1ldGVyc05hbWVzKCkgew0KKwkJCWphdmEudXRpbC5MaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCisJCQluYW1lcy5hZGQoInRyYW5zbWlzc2lvblJhdGUiKTsNCisJCQluYW1lcy5hZGQoIm1vZHVsYXRpb25QaGFzZVNoaWZ0Iik7DQorCQkJbmFtZXMuYWRkKCJzZWFzb25hbE1vZHVsYXRpb25GbG9vciIpOw0KKwkJCXJldHVybiBuYW1lczsNCisJCX0NCisJCQ0KKwkJcHJpdmF0ZSBDb21wb3NpdGUgcGFyYW1ldGVyVmFsdWVzKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7DQorCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7DQorCQkJY29tcG9zaXRlLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOw0KKwkJCWZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOw0KKwkJCWxhYmVsLnNldFRleHQoIkluaXRpYWwgdmFsdWU6ICIpOw0KKwkJCSANCisJCQlyZXR1cm4gY29tcG9zaXRlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVQYWdlI3ZhbGlkYXRlUGFnZSgpDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgew0KKwkJCXNldEVycm9yTWVzc2FnZShudWxsKTsNCisJCQlpZiAocGFyYW1ldGVyc0xpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSA9PSAwKSB7DQorCQkJCXNldEVycm9yTWVzc2FnZSgiQ2hvb3NlIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgZnJvbSB0aGUgbGlzdCIpOw0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwkJCXJldHVybiBzdXBlci52YWxpZGF0ZVBhZ2UoKTsNCisJCX0NCisNCisJCUBPdmVycmlkZQ0KKwkJcHJvdGVjdGVkIFN0cmluZyBnZXREQ0Rlc2NyaXB0aW9uKCkgew0KKwkJCXJldHVybiAiU29tZSBkZXNjcmlwdGlvbiBnb2VzIGhlcmUiOw0KKwkJfQ0KKwkJDQorCX0NCisJDQorCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTmV3QXV0b21hdGljRXhwZXJpbWVudFBhZ2UyIA0KKwkJZXh0ZW5kcyBXaXphcmRQYWdlIHsNCisJCQ0KKwkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBQYXJhbWV0ZXJEZXRhaWxzPiBwYXJhbVRvRGV0YWlsc09iaiA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGFyYW1ldGVyRGV0YWlscz4oKTsNCisJCXByaXZhdGUgQ29tcG9zaXRlIHBhZ2VDb21wb3NpdGUgPSBudWxsOyANCisJCQ0KKwkJLyoqDQorCQkgKiBAcGFyYW0gcGFnZU5hbWUNCisJCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBhZ2UNCisJCSAqLw0KKwkJcHJvdGVjdGVkIE5ld0F1dG9tYXRpY0V4cGVyaW1lbnRQYWdlMihmaW5hbCBTdHJpbmcgcGFnZU5hbWUpIHsNCisJCQlzdXBlcihwYWdlTmFtZSk7DQorCQl9DQorDQorCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCisJCQlwYWdlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsNCisJCQlwYWdlQ29tcG9zaXRlLnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5WRVJUSUNBTCkpOw0KKwkJCQ0KKwkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7DQorCQkJcGFyZW50LnBhY2soKTsNCisJCQlzZXRDb250cm9sKHBhZ2VDb21wb3NpdGUpOw0KKwkJfQ0KKwkJDQorCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFBhcmFtZXRlcnMoZmluYWwgU3RyaW5nW10gc2VsZWN0ZWQpIHsNCisJCQlqYXZhLnV0aWwuTGlzdDxTdHJpbmc+IHBhcmFtc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQorCQkJZm9yIChmaW5hbCBTdHJpbmcgZXhpc3RpbmdQYXJhbTpwYXJhbVRvRGV0YWlsc09iai5rZXlTZXQoKSkgew0KKwkJCQlwYXJhbXNUb1JlbW92ZS5hZGQoZXhpc3RpbmdQYXJhbSk7DQorCQkJfQ0KKwkJCWZvciAoZmluYWwgU3RyaW5nIHBhcmFtOnNlbGVjdGVkKSB7CQkJCQ0KKwkJCQlpZiAoIXBhcmFtVG9EZXRhaWxzT2JqLmNvbnRhaW5zS2V5KHBhcmFtKSkgew0KKwkJCQkJYWRkUGFyYW1Hcm91cChwYXJhbSk7CQkJCQkNCisJCQkJfQ0KKwkJCQllbHNlIHsNCisJCQkJCXBhcmFtc1RvUmVtb3ZlLnJlbW92ZShwYXJhbSk7DQorCQkJCX0NCisJCQl9DQorCQkJZm9yIChmaW5hbCBTdHJpbmcgdG9SZW1vdmU6cGFyYW1zVG9SZW1vdmUpIHsNCisJCQkJcmVtb3ZlUGFyYW1Hcm91cCh0b1JlbW92ZSk7DQorCQkJfQ0KKwkJCXBhZ2VDb21wb3NpdGUucGFjayh0cnVlKTsNCisJCX0NCisJCQ0KKwkJcHJpdmF0ZSB2b2lkIGFkZFBhcmFtR3JvdXAoZmluYWwgU3RyaW5nIHBhcmFtKSB7DQorCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFnZUNvbXBvc2l0ZSwgU1dULk5PTkUpOw0KKwkJCWZpbmFsIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsNCisJCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7DQorCQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7DQorCQkJZmluYWwgTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7DQorCQkJbGFiZWwxLnNldFRleHQoIkluaXRpYWwgdmFsdWU6ICIpOw0KKwkJCWZpbmFsIFRleHQgaW5pdGlhbFRleHQgPSBuZXcgVGV4dChncm91cCwgU1dULkJPUkRFUik7DQorCQkJZmluYWwgTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7DQorCQkJbGFiZWwyLnNldFRleHQoIlN0ZXAgdmFsdWU6ICIpOw0KKwkJCWZpbmFsIFRleHQgc3RlcFRleHQgPSBuZXcgVGV4dChncm91cCwgU1dULkJPUkRFUik7DQorCQkJZmluYWwgTGFiZWwgbGFiZWwzID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7DQorCQkJbGFiZWwzLnNldFRleHQoIlVwcGVyYm91bmQgdmFsdWU6ICIpOw0KKwkJCWZpbmFsIFRleHQgdXBwZXJib3VuZFRleHQgPSBuZXcgVGV4dChncm91cCwgU1dULkJPUkRFUik7DQorCQkJZ3JvdXAuc2V0VGV4dChwYXJhbSk7DQorCQkJDQorCQkJUGFyYW1ldGVyRGV0YWlscyBwYXJhbURldGFpbHMgPSBuZXcgUGFyYW1ldGVyRGV0YWlscygpOw0KKwkJCXBhcmFtRGV0YWlscy5ncm91cCA9IGdyb3VwOw0KKwkJCXBhcmFtRGV0YWlscy5pbml0aWFsVmFsdWVUZXh0ID0gaW5pdGlhbFRleHQ7DQorCQkJcGFyYW1EZXRhaWxzLnN0ZXBWYWx1ZVRleHQgPSBzdGVwVGV4dDsNCisJCQlwYXJhbURldGFpbHMudXBwZXJib3VuZFZhbHVlVGV4dCA9IHVwcGVyYm91bmRUZXh0OwkJCQ0KKwkJCXBhcmFtVG9EZXRhaWxzT2JqLnB1dChwYXJhbSwgcGFyYW1EZXRhaWxzKTsJCQkNCisJCX0NCisJCQ0KKwkJcHJpdmF0ZSB2b2lkIHJlbW92ZVBhcmFtR3JvdXAoZmluYWwgU3RyaW5nIHBhcmFtKSB7DQorCQkJUGFyYW1ldGVyRGV0YWlscyBwYXJhbURldGFpbHMgPSBwYXJhbVRvRGV0YWlsc09iai5yZW1vdmUocGFyYW0pOw0KKwkJCUdyb3VwIGdyb3VwID0gcGFyYW1EZXRhaWxzLmdyb3VwOw0KKwkJCWdyb3VwLmRpc3Bvc2UoKTsNCisJCX0JCQ0KKwkJDQorCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQkNCisJCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgUGFyYW1ldGVyRGV0YWlscyB7DQorCQkJcHVibGljIEdyb3VwIGdyb3VwID0gbnVsbDsNCisJCQlwdWJsaWMgVGV4dCBpbml0aWFsVmFsdWVUZXh0ID0gbnVsbDsNCisJCQlwdWJsaWMgVGV4dCBzdGVwVmFsdWVUZXh0ID0gbnVsbDsNCisJCQlwdWJsaWMgVGV4dCB1cHBlcmJvdW5kVmFsdWVUZXh0ID0gbnVsbDsNCisJCX0NCisJfQ0KKwkNCisJLyoqDQorCSAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgSUhhbmRsZXJ9IGZvciB0aGUgY29tbWFuZCB0aGF0IGNyZWF0ZXMgYQ0KKwkgKiB7QGxpbmsgTmV3QXV0b21hdGljRXhwZXJpbWVudFdpemFyZH0NCisJICovDQorCXB1YmxpYyBzdGF0aWMgY2xhc3MgTmV3QXV0b21hdGljRXhwZXJpbWVudFdpemFyZENvbW1hbmRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyDQorCQkJaW1wbGVtZW50cyBJSGFuZGxlciB7DQorDQorCQkvKioNCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXIjZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50KQ0KKwkJICovDQorCQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgZXhlY3V0aW9uRXZlbnQpDQorCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gSGFuZGxlclV0aWwNCisJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3dDaGVja2VkKGV4ZWN1dGlvbkV2ZW50KTsNCisJCQlmaW5hbCBOZXdBdXRvbWF0aWNFeHBlcmltZW50V2l6YXJkIHdpemFyZCA9IG5ldyBOZXdBdXRvbWF0aWNFeHBlcmltZW50V2l6YXJkKCk7DQorCQkJd2l6YXJkLmluaXQod2luZG93LmdldFdvcmtiZW5jaCgpLCBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsNCisJCQlmaW5hbCBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyh3aW5kb3cNCisJCQkJCS5nZXRTaGVsbCgpLCB3aXphcmQpOw0KKwkJCXdpemFyZERpYWxvZy5vcGVuKCk7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9IC8vIGV4ZWN1dGUNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC92aWV3cy9BZ2dyZWdhdGVUaW1lU2VyaWVzQ2FudmFzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC92aWV3cy9BZ2dyZWdhdGVUaW1lU2VyaWVzQ2FudmFzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1ZjVjZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L3ZpZXdzL0FnZ3JlZ2F0ZVRpbWVTZXJpZXNDYW52YXMuamF2YQpAQCAtMCwwICsxLDEyNDYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50LnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQuZGV2aWNlLklEZXZpY2VSZW5kZXJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmV4Y2VwdGlvbi5DaGFydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmZhY3RvcnkuR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuQ2hhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5DaGFydFdpdGhBeGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkFuY2hvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5BeGlzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5Cb3VuZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuQ29sb3JEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkludGVyc2VjdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuTGluZUF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuTGluZVN0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLlBvc2l0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLlRpY2tTdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5pbXBsLkJvdW5kc0ltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuaW1wbC5Db2xvckRlZmluaXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuY29tcG9uZW50LkF4aXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5jb21wb25lbnQuU2VyaWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuY29tcG9uZW50LmltcGwuU2VyaWVzSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuTnVtYmVyRGF0YVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuU2VyaWVzRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuaW1wbC5OdW1iZXJEYXRhRWxlbWVudEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5kYXRhLmltcGwuTnVtYmVyRGF0YVNldEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5kYXRhLmltcGwuU2VyaWVzRGVmaW5pdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5pbXBsLkNoYXJ0V2l0aEF4ZXNJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwubGF5b3V0LkxlZ2VuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmxheW91dC5QbG90OworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwudHlwZS5MaW5lU2VyaWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwudHlwZS5pbXBsLlNjYXR0ZXJTZXJpZXNJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQudXRpbC5QbHVnaW5TZXR0aW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5WaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKKworLyoqCisgKiBBZ2dyZWdhdGVUaW1lU2VyaWVzQ2FudmFzIGlzIGEgc3ViY2xhc3Mgb2Yge0BsaW5rIENhbnZhc30gc3VpdGFibGUgZm9yIGNoYXJ0IGRyYXdpbmdzLgorICovCitwdWJsaWMgY2xhc3MgQWdncmVnYXRlVGltZVNlcmllc0NhbnZhcyBleHRlbmRzIENhbnZhcyB7CisKKwlwcm90ZWN0ZWQgSURldmljZVJlbmRlcmVyIGlkciA9IG51bGw7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB7QGxpbmsgQ2hhcnR9IHRoYXQgcGxvdHMgdGhlIHJlbGF0aXZlIHZhbHVlcy4KKwkgKi8KKwlwcm90ZWN0ZWQgQ2hhcnQgY20gPSBudWxsOworCisJLyoqCisJICogVGhlIHByb3ZpZGVyIG9mIHJlbGF0aXZlIHZhbHVlcy4KKwkgKi8KKwkvL3ByaXZhdGUgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlciBydmhwOworCisJcHJpdmF0ZSBBbmFseXNpc0NvbnRyb2wgY29udHJvbCA9IG51bGw7CisJCisJLyoqCisJICogdGhlIGluZGV4IG9mIHRoaXMgQ2hhcnQKKwkgKi8KKwlwcml2YXRlIGludCBjaGFydEluZGV4ID0gMDsKKwkKKworCS8qKgorCSAqIHNvbWUgZXh0cmEgY29sb3JzCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb2xvckRlZmluaXRpb25bXSBjb2xvckRlZmF1bHQgPSB7CisJCQkJCQkJCQkJCQkJCQlDb2xvckRlZmluaXRpb25JbXBsLlJFRCgpLCAKKwkJCQkJCQkJCQkJCQkJCUNvbG9yRGVmaW5pdGlvbkltcGwuR1JFRU4oKSwgCisJCQkJCQkJCQkJCQkJCQlDb2xvckRlZmluaXRpb25JbXBsLkJMVUUoKSwgCisJCQkJCQkJCQkJCQkJCQlDb2xvckRlZmluaXRpb25JbXBsLkJMQUNLKCksIAorCQkJCQkJCQkJCQkJCQkJQ29sb3JEZWZpbml0aW9uSW1wbC5HUkVZKCksCisJCQkJCQkJCQkJCQkJCQlDb2xvckRlZmluaXRpb25JbXBsLkNZQU4oKSwKKwkJCQkJCQkJCQkJCQkJCUNvbG9yRGVmaW5pdGlvbkltcGwuT1JBTkdFKCkgCisJCQkJCQkJCQkJCQkJCQl9OworCS8qKgorCSAqIHVzZWQgaWYgd2UgbmVlZCB0byBvdmVybGF5IHRyYWNlcyBpbiBkaWZmZXJlbnQgY29sb3JzCisJICovCisJcHJpdmF0ZSBib29sZWFuIG92ZXJsYXlNb2RlID0gZmFsc2U7CisJCisJCisKKwkvKioKKwkgKiBBIGNvbnRleHQgbWVudSBmb3IgdGhpcyB2aWV3CisJICovCisJTWVudSBwb3BVcE1lbnUgPSBudWxsOworCQorCS8qKgorCSAqIHNldCB5IGF4aXMgdG8gYSBsaW5lYXIgc2NhbGUKKwkgKi8KKwlwcml2YXRlIExpbmVhclNjYWxlQWN0aW9uIGxpbmVhclRpbWVBY3Rpb247CisJLyoqCisJICogc2V0IHkgYXhpcyB0byBhIGxvZyBzY2FsZQorCSAqLworCXByaXZhdGUgTG9nU2NhbGVBY3Rpb24gbG9nVGltZUFjdGlvbjsKKwlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMaW5lYXJUaW1lU2NhbGUgPSB0cnVlOworCQorCisJLyoqCisJICogc2hvdyB0aGUgbGVnZW5kICh0cnVlIGJ5IGRlZmF1bHQpCisJICovCisJcHJpdmF0ZSBMZWdlbmRWaWV3QWN0aW9uIHZpZXdMZWdlbmQ7CisKKwkvKioKKwkgKiBoaWRlIHRoZSBsZWdlbmQgCisJICovCisJcHJpdmF0ZSBMZWdlbmRIaWRlQWN0aW9uIGhpZGVMZWdlbmQ7CisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0xlZ2VuZCA9IHRydWU7CisKKwlwcm90ZWN0ZWQgTGVnZW5kIGxlZ2VuZCA9IG51bGw7CisJCisKKwkvKioKKwkgKiB0aGlzIGlzIGEgbWFwIG9mIHRoZSBEYXRhU2VyaWVzIG9iamVjdCAoa2V5ZWQgYnkgcHJvcGVydHkgbmFtZSkKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgTWFwPFN0cmluZyxEYXRhU2VyaWVzPiBkYXRhU2VyaWVzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLERhdGFTZXJpZXM+KCk7CisJCisJLyoqCisJICogS2VlcCB0cmFjayBvZiB3aGljaCB0aW1lc2VyaWVzIGFyZSB2aXNpYmxlCisJICovCisJCisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIEJvb2xlYW4+dmlzaWJsZU1hcCA9ICBuZXcgSGFzaE1hcDxTdHJpbmcsQm9vbGVhbj4oKTsKKworCisJLyoqCisJICogVGhlc2UgYXJlIHRoZSBjeWNsZSBudW1iZXJzIHRoYXQgbWF0Y2ggdGhlIHJlbGF0aXZlIHZhbHVlcyB0aGF0IHdpbGwgYmUKKwkgKiBwbG90dGVkCisJICogCisJICogQHNlZSAjcmVsYXRpdmVWYWx1ZXMKKwkgKi8KKwlwcml2YXRlIGZpbmFsIExpc3Q8SW50ZWdlcj4gY3ljbGVOdW1iZXJzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCisJLyoqCisJICogQ2hhcnQgZ2VuZXJhdG9yIGluc3RhbmNlIChyZWZlcmVuY2UgdG8gYSBzaW5nbGV0b24pCisJICovCisJR2VuZXJhdG9yIGdyOworCisJQXhpcyB5QXhpc1ByaW1hcnk7CisJQXhpcyB4QXhpc1ByaW1hcnk7CisJLyoqCisJICogdGhlIG1heFkgdmFsdWUgZm9yIHNjYWxpbmcKKwkgKi8KKwlkb3VibGUgbWF4WSA9IC0xLjA7CisKKwkvKioKKwkgKiBMb2cgb2YgemVybyBpcyBuZWdhdGl2ZSBpbmZpbml0eSBzbyBmb3IgZWFjaCBsb2NhdGlvbiB3ZSB3aWxsIGN1dCBvZmYgdGhlIG1pbmltdW0gCisJICogYXQgdGhlIG1pbiBOT05aRVJPIFkgdmFsdWUKKwkgKi8KKwlwcml2YXRlIGRvdWJsZSBtaW5Zc2NhbGUgPSAxLjA7CisJCisJCisJLyoqCisJICogTGFiZWwgZm9yIGxpbmUgc2VyaWVzIExFR0VORAorCSAqLworCXB1YmxpYyBTdHJpbmcgT3JkaW5hdGVfTEVHRU5EID0gIlkiOworCQorCS8qKgorCSAqIExhYmVsIGZvciBsaW5lIHNlcmllcyBZIGF4aXMgbGFiZWwKKwkgKiovCisJcHVibGljIFN0cmluZyBPcmRpbmF0ZV9BWElTID0gIlkiOworCQorCisJLyoqCisJICogTGFiZWwgZm9yIGxpbmUgc2VyaWVzIFggYXhpcyBsYWJlbAorCSAqKi8KKwlwdWJsaWMgU3RyaW5nIFhfQVhJUyA9ICJYIjsKKwkKKwkvKiogCisJICogY3VzdG9taXphYmxlIGNvbG9yIGRlZmluaXRpb25zCisJICovCisJcHJpdmF0ZSBDb2xvckRlZmluaXRpb24gZm9yZUdyb3VuZCA9IENvbG9yRGVmaW5pdGlvbkltcGwuV0hJVEUoKTsKKwlwcml2YXRlIENvbG9yRGVmaW5pdGlvbiBiYWNrZ3JvdW5kR3JvdW5kID0gQ29sb3JEZWZpbml0aW9uSW1wbC5CTEFDSygpOworCXByaXZhdGUgQ29sb3JEZWZpbml0aW9uIGZyYW1lQ29sb3IgPSBDb2xvckRlZmluaXRpb25JbXBsLmNyZWF0ZSgxODAsIDE4MCwgMjAwKTsKKworCUltYWdlIGltZ0NoYXJ0ID0gbnVsbDsKKwkKKwkvKioKKwkgKiBUaGlzIENvbnN0cnVjdG9yIGlzIHVzZWQgd2hlbiB3ZSB3YW50IHRvIHBsYWNlIHRoZSB0aW1lIHNlcmllcyBpbiBhIGNvbnRhaW5lcgorCSAqIHdoaWNoIGlzIGEgc3ViIGNvbXBvbmVudCBvZiB0aGUgYWN0dWFsIEFuYWx5c2lzQ29udHJvbAorCSAqIEBwYXJhbSBhbmFseXNpc0NvbnRyb2wgCisJICogCisJICogQHBhcmFtIHBhcmVudCAgdGhlIFNXVCBwYXJlbnQgb2YgdGhlIHtAbGluayBXaWRnZXR9CisJICogQHBhcmFtIG9yZGluYXRlU3RyaW5nIAorCSAqIEBwYXJhbSB5QXhpc0xhYmVsIAorCSAqIEBwYXJhbSB4QXhpc0xhYmVsCisJICogQHBhcmFtIGZvcmVncm91bmQgCisJICogQHBhcmFtIGJhY2tncm91bmQgCisJICogQHBhcmFtIGZyYW1lY29sb3IgCisJICogQHBhcmFtIGNoYXJ0SW5kZXggdGhlIGluZGV4IG9mIHRoaXMgY2hhcnQgKDAgaWYgb25seSBvbmUpCisJICogQHBhcmFtIG92ZXJsYXlNb2RlIHVzZWQgaWYgd2UgbmVlZCB0byBvdmVybGF5IHRyYWNlcyBpbiBkaWZmZXJlbnQgY29sb3JzCisJICovCisJcHVibGljIEFnZ3JlZ2F0ZVRpbWVTZXJpZXNDYW52YXMoZmluYWwgQW5hbHlzaXNDb250cm9sIGFuYWx5c2lzQ29udHJvbCwgZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgCisJCQlmaW5hbCBTdHJpbmcgb3JkaW5hdGVTdHJpbmcsIAorCQkJZmluYWwgU3RyaW5nIHlBeGlzTGFiZWwsIAorCQkJZmluYWwgU3RyaW5nIHhBeGlzTGFiZWwsCisJCQlmaW5hbCBTdHJpbmcgZmlyc3RQcm9wZXJ0eSwKKwkJCUNvbG9yRGVmaW5pdGlvbiBmb3JlZ3JvdW5kLAorCQkJQ29sb3JEZWZpbml0aW9uIGJhY2tncm91bmQsCisJCQlDb2xvckRlZmluaXRpb24gZnJhbWVjb2xvciwKKwkJCWludCBjaGFydEluZGV4LAorCQkJYm9vbGVhbiBvdmVybGF5TW9kZQkpIHsKKwkJc3VwZXIocGFyZW50LCBTV1QuRE9VQkxFX0JVRkZFUkVEIHwgU1dULkJPUkRFUik7CisJCU9yZGluYXRlX0xFR0VORCA9IG9yZGluYXRlU3RyaW5nOworCQlPcmRpbmF0ZV9BWElTID0geUF4aXNMYWJlbDsKKwkJWF9BWElTID0geEF4aXNMYWJlbDsKKwkJZm9yZUdyb3VuZCAJCQk9IGZvcmVncm91bmQ7CisJCWJhY2tncm91bmRHcm91bmQgCT0gYmFja2dyb3VuZDsKKwkJZnJhbWVDb2xvciAJCQk9IGZyYW1lY29sb3I7CisJCXRoaXMuY2hhcnRJbmRleCA9IGNoYXJ0SW5kZXg7CisJCXRoaXMub3ZlcmxheU1vZGUgPSBvdmVybGF5TW9kZTsKKwkJCisJCWdyID0gR2VuZXJhdG9yLmluc3RhbmNlKCk7CisKKwkJdHJ5IHsKKwkJCWlkciA9IFBsdWdpblNldHRpbmdzLmluc3RhbmNlKCkuZ2V0RGV2aWNlKCJkdi5TV1QiKTsgLy8kTk9OLU5MUy0xJAkJCQorCQl9IGNhdGNoIChmaW5hbCBDaGFydEV4Y2VwdGlvbiBwZXgpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiUHJvYmxlbSBpbml0aWFsaXppbmcgY2hhcnQiLCBwZXgpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCX0KKworCQljb250cm9sID0gYW5hbHlzaXNDb250cm9sOworCisJCQorCQljbSA9IGNyZWF0ZVNpbXBsZUxpbmVDaGFydChmaXJzdFByb3BlcnR5LCBkYXRhU2VyaWVzTWFwLCBjeWNsZU51bWJlcnMsIE1lc3NhZ2VzCisJCQkJLmdldFN0cmluZygiQ0MudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCisJCXJlc2V0RGF0YSgpOworCQlhZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKGZpbmFsIFBhaW50RXZlbnQgcGUpIHsKKworCQkJCWZpbmFsIENvbXBvc2l0ZSBzb3VyY2UgPSAoQ29tcG9zaXRlKSBwZS5nZXRTb3VyY2UoKTsKKwkJCQlmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlIGQgPSBzb3VyY2UKKwkJCQkJCS5nZXRDbGllbnRBcmVhKCk7CisKKwkJCQlpZihpbWdDaGFydCAhPSBudWxsKSBpbWdDaGFydC5kaXNwb3NlKCk7CisJCQkJaW1nQ2hhcnQgPSBuZXcgSW1hZ2Uoc291cmNlLmdldERpc3BsYXkoKSwgZCk7CisJCQkJCisJCQkJaWRyLnNldFByb3BlcnR5KElEZXZpY2VSZW5kZXJlci5HUkFQSElDU19DT05URVhULCBuZXcgR0MoCisJCQkJCQlpbWdDaGFydCkpOworCQkJCWZpbmFsIEJvdW5kcyBib3VuZHMgPSBCb3VuZHNJbXBsLmNyZWF0ZShkLngsIGQueSwgZC53aWR0aCwKKwkJCQkJCWQuaGVpZ2h0KTsKKwkJCQlib3VuZHMuc2NhbGUoNzJkIC8gaWRyLmdldERpc3BsYXlTZXJ2ZXIoKS5nZXREcGlSZXNvbHV0aW9uKCkpOworCQkJCS8vIEJPVU5EUyBNVVNUIEJFIFNQRUNJRklFRCBJTiBQT0lOVFMKKworCQkJCXRyeSB7CisJCQkJCWdyLnJlbmRlcihpZHIsIGdyLmJ1aWxkKGlkci5nZXREaXNwbGF5U2VydmVyKCksIGNtLCBib3VuZHMsCisJCQkJCQkJbnVsbCwgbnVsbCwgbnVsbCkpOworCQkJCQlwZS5nYy5kcmF3SW1hZ2UoaW1nQ2hhcnQsIGQueCwgZC55KTsKKwkJCQl9IGNhdGNoIChmaW5hbCBDaGFydEV4Y2VwdGlvbiBjZSkgeworCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlByb2JsZW0gcmVuZGVyaW5nIGNoYXJ0IiwgY2UpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfSAvLyBwYWludENvbnRyb2wKKwkJfSAvLyBQYWludExpc3RlbmVyCisJCSk7CisJCQorCQkvL0NyZWF0ZSBhIGNvbnRleHQgbWVudSBmb3IgdGhlIGNhbnZhcworCQljcmVhdGVDb250ZXh0TWVudSh0aGlzKTsKKwkJCisKKwl9IC8vIEFnZ3JlZ2F0ZVRpbWVTZXJpZXNDYW52YXMKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50ICB0aGUgU1dUIHBhcmVudCBvZiB0aGUge0BsaW5rIFdpZGdldH0KKwkgKiBAcGFyYW0gb3JkaW5hdGVTdHJpbmcgCisJICogQHBhcmFtIHlBeGlzTGFiZWwgCisJICogQHBhcmFtIHhBeGlzTGFiZWwKKwkgKiBAcGFyYW0gZm9yZWdyb3VuZCAKKwkgKiBAcGFyYW0gYmFja2dyb3VuZCAKKwkgKiBAcGFyYW0gZnJhbWVjb2xvciAKKwkgKiBAcGFyYW0gY2hhcnRJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBjaGFydCAoMCBpZiBvbmx5IG9uZSkKKwkgKiAgCisJICovCisJcHVibGljIEFnZ3JlZ2F0ZVRpbWVTZXJpZXNDYW52YXMoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgCisJCQlmaW5hbCBTdHJpbmcgb3JkaW5hdGVTdHJpbmcsIAorCQkJZmluYWwgU3RyaW5nIHlBeGlzTGFiZWwsIAorCQkJZmluYWwgU3RyaW5nIHhBeGlzTGFiZWwsCisJCQlmaW5hbCBTdHJpbmcgZmlyc3RQcm9wZXJ0eSwKKwkJCUNvbG9yRGVmaW5pdGlvbiBmb3JlZ3JvdW5kLAorCQkJQ29sb3JEZWZpbml0aW9uIGJhY2tncm91bmQsCisJCQlDb2xvckRlZmluaXRpb24gZnJhbWVjb2xvciwKKwkJCWludCBjaGFydEluZGV4KSB7CisJCXN1cGVyKHBhcmVudCwgU1dULkRPVUJMRV9CVUZGRVJFRCB8IFNXVC5CT1JERVIpOworCQlPcmRpbmF0ZV9MRUdFTkQgPSBvcmRpbmF0ZVN0cmluZzsKKwkJT3JkaW5hdGVfQVhJUyA9IHlBeGlzTGFiZWw7CisJCVhfQVhJUyA9IHhBeGlzTGFiZWw7CisJCWZvcmVHcm91bmQgCQkJPSBmb3JlZ3JvdW5kOworCQliYWNrZ3JvdW5kR3JvdW5kIAk9IGJhY2tncm91bmQ7CisJCWZyYW1lQ29sb3IgCQkJPSBmcmFtZWNvbG9yOworCQl0aGlzLmNoYXJ0SW5kZXggPSBjaGFydEluZGV4OworCQkKKwkJZ3IgPSBHZW5lcmF0b3IuaW5zdGFuY2UoKTsKKworCQl0cnkgeworCQkJaWRyID0gUGx1Z2luU2V0dGluZ3MuaW5zdGFuY2UoKS5nZXREZXZpY2UoImR2LlNXVCIpOyAvLyROT04tTkxTLTEkCQkJCisJCX0gY2F0Y2ggKGZpbmFsIENoYXJ0RXhjZXB0aW9uIHBleCkgeworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJQcm9ibGVtIGluaXRpYWxpemluZyBjaGFydCIsIHBleCk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybjsKKwkJfQorCisJCWNvbnRyb2wgPSAoQW5hbHlzaXNDb250cm9sKSBwYXJlbnQ7CisKKwkJCisJCWNtID0gY3JlYXRlU2ltcGxlTGluZUNoYXJ0KGZpcnN0UHJvcGVydHksIGRhdGFTZXJpZXNNYXAsIGN5Y2xlTnVtYmVycywgTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJDQy50aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJcmVzZXREYXRhKCk7CisJCQorCQlhZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKGZpbmFsIFBhaW50RXZlbnQgcGUpIHsKKwkJCQkKKwkJCQlmaW5hbCBDb21wb3NpdGUgc291cmNlID0gKENvbXBvc2l0ZSkgcGUuZ2V0U291cmNlKCk7CisJCQkJZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSBkID0gc291cmNlCisJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpOworCisJCQkJaWYoaW1nQ2hhcnQgIT0gbnVsbCkgaW1nQ2hhcnQuZGlzcG9zZSgpOworCQkJCWltZ0NoYXJ0ID0gbmV3IEltYWdlKHNvdXJjZS5nZXREaXNwbGF5KCksIGQpOworCQkJCWlkci5zZXRQcm9wZXJ0eShJRGV2aWNlUmVuZGVyZXIuR1JBUEhJQ1NfQ09OVEVYVCwgbmV3IEdDKAorCQkJCQkJaW1nQ2hhcnQpKTsKKwkJCQlmaW5hbCBCb3VuZHMgYm91bmRzID0gQm91bmRzSW1wbC5jcmVhdGUoZC54LCBkLnksIGQud2lkdGgsCisJCQkJCQlkLmhlaWdodCk7CisJCQkJYm91bmRzLnNjYWxlKDcyZCAvIGlkci5nZXREaXNwbGF5U2VydmVyKCkuZ2V0RHBpUmVzb2x1dGlvbigpKTsKKwkJCQkvLyBCT1VORFMgTVVTVCBCRSBTUEVDSUZJRUQgSU4gUE9JTlRTCisKKwkJCQl0cnkgeworCQkJCQlnci5yZW5kZXIoaWRyLCBnci5idWlsZChpZHIuZ2V0RGlzcGxheVNlcnZlcigpLCBjbSwgYm91bmRzLAorCQkJCQkJCW51bGwsIG51bGwsIG51bGwpKTsKKwkJCQkJcGUuZ2MuZHJhd0ltYWdlKGltZ0NoYXJ0LCBkLngsIGQueSk7CisJCQkJfSBjYXRjaCAoZmluYWwgQ2hhcnRFeGNlcHRpb24gY2UpIHsKKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJQcm9ibGVtIHJlbmRlcmluZyBjaGFydCIsIGNlKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX0gLy8gcGFpbnRDb250cm9sCisJCX0gLy8gUGFpbnRMaXN0ZW5lcgorCQkpOworCQkKKwkJLy9DcmVhdGUgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSBjYW52YXMKKwkJY3JlYXRlQ29udGV4dE1lbnUodGhpcyk7CisJCQorCisJfSAvLyBBZ2dyZWdhdGVUaW1lU2VyaWVzQ2FudmFzCisKKwkKKwkKKwkvKioKKwkgKiBUaGUgbWV0aG9kIHdoaWNoIGdldHMgdGhlIHtAbGluayBBZ2dyZWdhdGVUaW1lU2VyaWVzQ2FudmFzfScgcmVwb3J0cyBsaXN0LCBhbmQKKwkgKiBkcmF3cyBpdCBvbiB0aGUge0BsaW5rIEFnZ3JlZ2F0ZVRpbWVTZXJpZXNDYW52YXN9LgorCSAqIEByZXR1cm4gaW50ZWdyYXRlZERpZmZlcmVuY2UgZm9yIGVhY2ggbGluZSBzZXJpZXMKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBkcmF3KCkgeworCQkKKwkJLy9jbGVhckRhdGEoKTsKKwkJcmVzZXREYXRhKCk7CisJCXlBeGlzUHJpbWFyeS5nZXRTZXJpZXNEZWZpbml0aW9ucygpLmNsZWFyKCk7CisJCQorCQkvLyBnZXQgdGhlIG51bWJlciBvZiBsaW5lcyB0byBwbG90IGZvciB0aGlzIHR5cGUgb2YgY2hhcnQKKwkJaW50IG1heExpbmVzID0gY29udHJvbC5nZXROdW1Qcm9wZXJ0aWVzKGNoYXJ0SW5kZXgpOworCQorCQkvLyBhZGQgYWxsIHRoZSByZXN0IG9mIHRoZSBsaW5lIHNlcmllcyBub3cKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhMaW5lczsgaSArKykgeworCQkJU3RyaW5nIHByb3BlcnR5ID0gY29udHJvbC5nZXRQcm9wZXJ0eShjaGFydEluZGV4LGkpOworCQkJCisJCQlpZighZGF0YVNlcmllc01hcC5jb250YWluc0tleShwcm9wZXJ0eSkpIHsKKwkJCQkvLyBuZXcgcHJvcGVydHkKKwkJCQlEYXRhU2VyaWVzIHNlcmllcyA9IG5ldyBEYXRhU2VyaWVzKHByb3BlcnR5LCBpLCBvdmVybGF5TW9kZSk7CisJCQkJaWYodmlzaWJsZU1hcC5jb250YWluc0tleShwcm9wZXJ0eSkpCisJCQkJCQlzZXJpZXMuc2V0VmlzaWJsZSh2aXNpYmxlTWFwLmdldChwcm9wZXJ0eSkpOworCQkJCWVsc2UgeworCQkJCQlzZXJpZXMuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCQkJdmlzaWJsZU1hcC5wdXQocHJvcGVydHksIHRydWUpOworCQkJCX0KKwkJCQkKKwkJCQlkYXRhU2VyaWVzTWFwLnB1dChwcm9wZXJ0eSwgc2VyaWVzKTsKKwkJCX0KKwkJCURhdGFTZXJpZXMgc2VyaWVzID0gZGF0YVNlcmllc01hcC5nZXQocHJvcGVydHkpOworCQkJc2VyaWVzLnNob3coKTsKKwkJCQorCQl9CisJCQorCQkvLyB1cGRhdGUgdGhlIGNvbnRleHQgbWVudSB3aXRoIHRoZSBuZXcgcHJvcGVydGllcyB0byBwbG90CisJCS8vdXBkYXRlQ29udGV4dE1lbnUodGhpcyk7CisJCQorCQltYXhZID0gLTEuMDsKKwkJCisJCQlib29sZWFuIHNldEN5Y2xlcyA9IGZhbHNlOworCQkJLy8gR2V0IHRoZSB2YWx1ZXMgZm9yIHRoZSBwcm9wZXJ0eSB0byBiZSBwbG90dGVkCisJCQlpbnQgbWF4UG9pbnRzID0gMDsKKwkJCQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhMaW5lczsgaSsrKSB7CisJCQkJU3RyaW5nIHByb3BlcnR5ID0gY29udHJvbC5nZXRQcm9wZXJ0eShjaGFydEluZGV4LGkpOworCQkJCWRvdWJsZVtdIGRvdWJsZVZhbHVlcyA9IGNvbnRyb2wuZ2V0VmFsdWVzKGNoYXJ0SW5kZXgsaSk7CisJCQkJaWYoZG91YmxlVmFsdWVzPT1udWxsKSB7CisJCQkJCWRvdWJsZVZhbHVlcyA9IG5ldyBkb3VibGVbMF07CisJCQkJCS8vZG91YmxlVmFsdWVzWzBdID0gMDsKKwkJCQl9CisJCQkJRGF0YVNlcmllcyBzZXJpZXMgPSBkYXRhU2VyaWVzTWFwLmdldChwcm9wZXJ0eSk7CisJCQkJCisJCQkJaWYoZGF0YVNlcmllc01hcC5nZXQocHJvcGVydHkpLmlzVmlzaWJsZSgpID09IHRydWUpIHsgCisJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZG91YmxlVmFsdWVzLmxlbmd0aDsgaisrKSB7CisJCQkJCQkKKwkJCQkJCQorCQkJCQkJaWYoZG91YmxlVmFsdWVzW2pdIDw9IG1pbllzY2FsZSkgeworCQkJCQkJCWlmKGRvdWJsZVZhbHVlc1tqXSA+IDAuMCkgbWluWXNjYWxlID0gZG91YmxlVmFsdWVzW2pdOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlpZihkb3VibGVWYWx1ZXNbal0gPj0gbWF4WSkgeworCQkJCQkJCW1heFkgPSBkb3VibGVWYWx1ZXNbal07CisJCQkJCQkJZG91YmxlIGxvZyA9IE1hdGguZmxvb3IoTWF0aC5sb2cxMChtYXhZKSk7CisJCQkJCQkJZG91YmxlIGFkanVzdGVkTWF4ID0gKE1hdGguY2VpbChtYXhZL01hdGgucG93KDEwLCBsb2cpKSkqTWF0aC5wb3coMTAsIGxvZyk7CisJCQkJCQkgICAgaWYoYWRqdXN0ZWRNYXggPD0gMS4wKSBhZGp1c3RlZE1heCA9IDEuMDsKKwkJCQkJCSAgICAvL2FkanVzdGVkTWF4ID0gbWF4WSoxMDAuMDsKKwkJCQkJCSAgICAvL2FkanVzdGVkTWF4ICs9IDEuMDsKKwkJCQkJCSAgICAvL2ludCBteCA9IChpbnQpYWRqdXN0ZWRNYXg7CisJCQkJCQkgICAgLy9hZGp1c3RlZE1heCA9ICgoZG91YmxlKW14KS8xMDAuMDsKKwkJCQkJCQlpZiAodXNlTGluZWFyVGltZVNjYWxlKSB7CisJCQkJCQkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKGFkanVzdGVkTWF4KSk7CisJCQkJCQkJCWRvdWJsZSBzdGVwID0gYWRqdXN0ZWRNYXggLyAxMC4wOworCQkJCQkJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRTdGVwKHN0ZXApOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8vIGtlZXAgMiBzaWduaWZpY2FudCBmaWd1cmVzIG9uIHNjYWxlIGF4aXMKKwkJCQkJCQkJZG91YmxlIHltYXggPSBNYXRoLmxvZyhhZGp1c3RlZE1heCk7CisJCQkJCQkJCWlmKGFkanVzdGVkTWF4ID4gMS4wKSB7CisJCQkJCQkJCQl5bWF4ICs9IDAuNDk5OworCQkJCQkJCQkJbG9uZyBpbWF4ID0gTWF0aC5yb3VuZCh5bWF4KTsKKwkJCQkJCQkJCXltYXggPSBpbWF4OworCQkJCQkJCQl9CisJCQkJCQkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKHltYXgpKTsKKwkJCQkJCQkJZG91YmxlIHN0ZXAgPSB5bWF4LzEwLjA7CisJCQkJCQkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldFN0ZXAoc3RlcCk7CisJCQkJCQkJfQorCQkJCQkJCQorCQkJCQkJCQorCQkJCQkJfQorCQkJCQl9CisJCQkJfSAvLyBpcyB2aXNpYmxlCisJCQkJCisJCQkJCS8vIEFueSB2YWx1ZXM/CisJCQkJCWlmIChkb3VibGVWYWx1ZXMubGVuZ3RoID4gMCkgeworCQkJCQkJaWYgKG1heFBvaW50cyA8IGRvdWJsZVZhbHVlcy5sZW5ndGgpIHsKKwkJCQkJCQltYXhQb2ludHMgPSBkb3VibGVWYWx1ZXMubGVuZ3RoOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlmb3IgKGludCBjeWNsZU51bWJlciA9IDA7IGN5Y2xlTnVtYmVyIDwgZG91YmxlVmFsdWVzLmxlbmd0aDsgY3ljbGVOdW1iZXIrKykgeworCQkJCQkJCQorCQkJCQkJCURvdWJsZSB2YWx1ZTsKKwkJCQkJCQlkb3VibGUgZGlzcGxheVZhbHVlID0gZG91YmxlVmFsdWVzW2N5Y2xlTnVtYmVyXTsKKwkJCQkJCQlpZiAoZGlzcGxheVZhbHVlIDw9IG1pbllzY2FsZSkgeworCQkJCQkJCQkvLyBMb2coMC4wKSBpcyBuZWdhdGl2ZSBpbmZpbml0eSBzbyBmb3IgZGlzcGxheSBwdXJwb3NlcyBvbmx5CisJCQkJCQkJCS8vIHdlIHNldCB0aGUgbWluaW11bSBheGlzIHZhbHVlIGF0IDAuMS9QT1BVTEFUSU9OCisJCQkJCQkJCWRpc3BsYXlWYWx1ZSA9IG1pbllzY2FsZTsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKHVzZUxpbmVhclRpbWVTY2FsZSkgeworCQkJCQkJCQl2YWx1ZSA9IG5ldyBEb3VibGUoZGlzcGxheVZhbHVlKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQl2YWx1ZSA9IG5ldyBEb3VibGUoTWF0aC5sb2coZGlzcGxheVZhbHVlKSk7CisJCQkJCQkJfQorCQkJCQkJCQorCisJCQkJCQkJc2VyaWVzLmFkZFZhbHVlKHZhbHVlKTsKKwkJCQkJCQkKKwkJCQkJCQkvLyBvbmx5IGRvIG9uY2UgZm9yIGZpcnN0IGxpbmUgc2VyaWVzCisJCQkJCQkJaWYgKCFzZXRDeWNsZXMpIHsKKwkJCQkJCQkJY3ljbGVOdW1iZXJzLmFkZChJbnRlZ2VyLnZhbHVlT2YoY3ljbGVOdW1iZXIpKTsJCisJCQkJCQkJCX0KKwkJCQkJCX0gLy8gZm9yIGN5Y2xlTnVtYmVyCisJCQkJCQkKKwkJCQkJCWlmKHhBeGlzUHJpbWFyeS5nZXRTZXJpZXNEZWZpbml0aW9ucygpLmdldCgwKS5nZXRTZXJpZXMoKS5zaXplKCkgIT0gY3ljbGVOdW1iZXJzLnNpemUoKSkgeworCQkJCQkJCS8vIFRoZSBudW1iZXIgb2YgZGF0YSBwb2ludHMgaGF2ZSBjaGFuZ2VkLCBjcmVhdGUgYSBuZXcgc2VyaWVzIGZvciB0aGUgeCBheGlzCisJCQkJCQkJeEF4aXNQcmltYXJ5LmdldFNlcmllc0RlZmluaXRpb25zKCkuY2xlYXIoKTsKKwkJCQkJCQlmaW5hbCBTZXJpZXMgeEF4aXNTZXJpZXMgPSBTZXJpZXNJbXBsLmNyZWF0ZSgpOworCisJCQkJCQkJZmluYWwgTnVtYmVyRGF0YVNldCB4VmFsdWVzID0gTnVtYmVyRGF0YVNldEltcGwuY3JlYXRlKGN5Y2xlTnVtYmVycyk7CisJCQkJCQkJeEF4aXNTZXJpZXMuc2V0RGF0YVNldCh4VmFsdWVzKTsKKwkJCQkJCQlmaW5hbCBTZXJpZXNEZWZpbml0aW9uIHNkWCA9IFNlcmllc0RlZmluaXRpb25JbXBsLmNyZWF0ZSgpOworCisJCQkJCQkJeEF4aXNQcmltYXJ5LmdldFNlcmllc0RlZmluaXRpb25zKCkuYWRkKHNkWCk7CisJCQkJCQkJc2RYLmdldFNlcmllcygpLmFkZCh4QXhpc1Nlcmllcyk7CisJCQkJCQl9CisJCQkJCQkJCisJCQkJCQkKKwkJCQkJCXNldEN5Y2xlcyA9IHRydWU7IC8vIHdlIHNldCB0aGVtIG9ubHkgb25jZQorCQkJCQkJCisJCQkJCX0gZWxzZSB7CisJCQkJCQkvL3Jlc2V0RGF0YSgpOworCQkJCQl9CisJCQl9IC8vIGZvciBpIHByb3BlcnRpZXMKKworCisJCWlmICghdGhpcy5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXJlZHJhdygpOworCQl9CisJCQorCQkKKwkJLy8JY29udHJvbC51cGRhdGVNZXNzYWdlKFNjZW5hcmlvQW5hbHlzaXNTdWl0ZS5XT1JLSU5HX01TRyk7CisJCQorCX0gLy8gcGFpbnRDb250cm9sCisKKwkvKioKKwkgKiBAcGFyYW0gZGF0YVNlcmllc01hcAorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBMaXN0fSB0aGF0IHdpbGwgY29udGFpbiB0aGUgcmVsYXRpdmUgdmFsdWVzCisJICogICAgICAgICAgICAoMC4wLTEuMCkgdG8gcGxvdAorCSAqIEBwYXJhbSBjeWNsZU51bWJlcnMKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgTGlzdH0gb2Ygc2ltdWxhdGlvbiBjeWNsZSBudW1iZXJzIHRoYXQgbWF0Y2ggdGhlCisJICogICAgICAgICAgICByZWxhdGl2ZSB2YWx1ZXMKKwkgKiBAcGFyYW0gc2VyaWVzSWRlbnRpZmllcgorCSAqICAgICAgICAgICAgdGhlIHRpdGxlIG9mIHRoZSBjaGFydAorCSAqIEByZXR1cm4gYSA8Y29kZT5DaGFydDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgZmluYWwgQ2hhcnQgY3JlYXRlU2ltcGxlTGluZUNoYXJ0KAorCQkJZmluYWwgU3RyaW5nIGZpcnN0UHJvcGVydHksCisJCQlmaW5hbCBNYXA8U3RyaW5nLCBEYXRhU2VyaWVzPiBkYXRhU2VyaWVzTWFwLAorCQkJZmluYWwgTGlzdDxJbnRlZ2VyPiBjeWNsZU51bWJlcnMsIGZpbmFsIFN0cmluZyBzZXJpZXNJZGVudGlmaWVyKSB7CisJCQorCQlmaW5hbCBDaGFydFdpdGhBeGVzIHJldFZhbHVlID0gQ2hhcnRXaXRoQXhlc0ltcGwuY3JlYXRlKCk7CisKKwkJCisJCS8vIFBsb3QKKwkJcmV0VmFsdWUuZ2V0QmxvY2soKS5zZXRCYWNrZ3JvdW5kKGZyYW1lQ29sb3IpOworCQlmaW5hbCBQbG90IHAgPSByZXRWYWx1ZS5nZXRQbG90KCk7CisJCXAuZ2V0Q2xpZW50QXJlYSgpLnNldEJhY2tncm91bmQoYmFja2dyb3VuZEdyb3VuZCk7CisKKwkJLy8gVGl0bGUKKwkJLy8gY3dhTGluZS5nZXRUaXRsZSggKS5nZXRMYWJlbCggKS5nZXRDYXB0aW9uKCApLnNldFZhbHVlKCAiTGluZSBDaGFydCIKKwkJLy8gKTsvLyROT04tTkxTLTEkCisJCXJldFZhbHVlLmdldFRpdGxlKCkuc2V0VmlzaWJsZShmYWxzZSk7CisKKwkJLy8gTGVnZW5kCisJCWxlZ2VuZCA9IHJldFZhbHVlLmdldExlZ2VuZCgpOworCQlmaW5hbCBMaW5lQXR0cmlidXRlcyBsaWEgPSBsZWdlbmQuZ2V0T3V0bGluZSgpOworCQlsZWdlbmQuZ2V0VGV4dCgpLmdldEZvbnQoKS5zZXRTaXplKDgpOworCQlsaWEuc2V0U3R5bGUoTGluZVN0eWxlLlNPTElEX0xJVEVSQUwpOworCQlsZWdlbmQuZ2V0SW5zZXRzKCkuc2V0KDEwLCA1LCAwLCAwKTsKKwkJbGVnZW5kLmdldE91dGxpbmUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJbGVnZW5kLnNldEFuY2hvcihBbmNob3IuTk9SVEhfTElURVJBTCk7CisJCWxlZ2VuZC5zZXRQb3NpdGlvbihQb3NpdGlvbi5CRUxPV19MSVRFUkFMKTsKKwkJbGVnZW5kLmdldFRleHQoKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJbGVnZW5kLmdldE91dGxpbmUoKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJCisJCS8vIGN3YUxpbmUuZ2V0TGVnZW5kKCApLmdldFRleHQoKS5nZXRGb250KCkuc2V0U2l6ZSgxNik7OworCQkvLyBjd2FMaW5lLmdldExlZ2VuZCggKS5zZXRWaXNpYmxlKCB0cnVlICk7CisKKwkJLy8gLy8vLy8vLy8vCisJCS8vIFgtQXhpcworCQl4QXhpc1ByaW1hcnkgPSByZXRWYWx1ZS5nZXRQcmltYXJ5QmFzZUF4ZXMoKVswXTsKKwkJeEF4aXNQcmltYXJ5LnNldFR5cGUoQXhpc1R5cGUuVEVYVF9MSVRFUkFMKTsKKwkJeEF4aXNQcmltYXJ5LmdldE1ham9yR3JpZCgpLnNldFRpY2tTdHlsZShUaWNrU3R5bGUuQkVMT1dfTElURVJBTCk7CisJCXhBeGlzUHJpbWFyeS5nZXRPcmlnaW4oKS5zZXRUeXBlKEludGVyc2VjdGlvblR5cGUuVkFMVUVfTElURVJBTCk7CisJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLnNldFZpc2libGUoZmFsc2UpOworCQl4QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5nZXRDYXB0aW9uKCkuZ2V0Rm9udCgpLnNldFNpemUoOSk7CisJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLmdldENhcHRpb24oKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJeEF4aXNQcmltYXJ5LmdldExhYmVsKCkuZ2V0Q2FwdGlvbigpLnNldENvbG9yKGZvcmVHcm91bmQpOworCisJCWZpbmFsIFNlcmllcyB4QXhpc1NlcmllcyA9IFNlcmllc0ltcGwuY3JlYXRlKCk7CisKKwkJLy8gbmV3IGNvbG9ycworCQl4QXhpc1Nlcmllcy5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJeEF4aXNTZXJpZXMuZ2V0TGFiZWwoKS5nZXRPdXRsaW5lKCkuc2V0Q29sb3IoZm9yZUdyb3VuZCk7CisJCS8vCQorCisJCWZpbmFsIE51bWJlckRhdGFTZXQgeFZhbHVlcyA9IE51bWJlckRhdGFTZXRJbXBsLmNyZWF0ZShjeWNsZU51bWJlcnMpOworCQl4QXhpc1Nlcmllcy5zZXREYXRhU2V0KHhWYWx1ZXMpOworCQlmaW5hbCBTZXJpZXNEZWZpbml0aW9uIHNkWCA9IFNlcmllc0RlZmluaXRpb25JbXBsLmNyZWF0ZSgpOworCisJCXhBeGlzUHJpbWFyeS5nZXRTZXJpZXNEZWZpbml0aW9ucygpLmFkZChzZFgpOworCQlzZFguZ2V0U2VyaWVzKCkuYWRkKHhBeGlzU2VyaWVzKTsKKworCQkvLyAvLy8vLy8vLworCQkvLyBZLUF4aXMKKwkJeUF4aXNQcmltYXJ5ID0gcmV0VmFsdWUuZ2V0UHJpbWFyeU9ydGhvZ29uYWxBeGlzKHhBeGlzUHJpbWFyeSk7CisJCXlBeGlzUHJpbWFyeS5nZXRNYWpvckdyaWQoKS5zZXRUaWNrU3R5bGUoVGlja1N0eWxlLkxFRlRfTElURVJBTCk7CisKKwkJLy8gTnVtYmVyRGF0YVNldFtdIG9ydGhvVmFsdWVzID0gbmV3IE51bWJlckRhdGFTZXRbTUFYX0xJTkVTXTsKKwkJLy8gU2VyaWVzRGVmaW5pdGlvbltdIHNkWSA9IG5ldyBTZXJpZXNEZWZpbml0aW9uW01BWF9MSU5FU107CisKKwkJLy8gZW5kIFktU2VyaWVzCisKKwkJeEF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWluKE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoMC4wKSk7CisJCS8vIHhBeGlzUHJpbWFyeS5nZXRTY2FsZSggKS5zZXRNYXgoIE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoIDEwLjAgKQorCQkvLyApOworCQkvLyB4QXhpc1ByaW1hcnkuZ2V0U2NhbGUoICkuc2V0U3RlcCggMSApOworCQl4QXhpc1ByaW1hcnkuZ2V0TGFiZWwoKS5nZXRDYXB0aW9uKCkuZ2V0Rm9udCgpLnNldFNpemUoOSk7CisJCXhBeGlzUHJpbWFyeS5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuc2V0VmlzaWJsZSh0cnVlKTsKKwkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuZ2V0Q2FwdGlvbigpLnNldFZhbHVlKFhfQVhJUyk7CisKKwkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWluKE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoMC4wKSk7CisJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDEuMCkpOworCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRTdGVwKDAuMjUpOworCQl5QXhpc1ByaW1hcnkuZ2V0TGFiZWwoKS5nZXRDYXB0aW9uKCkuZ2V0Rm9udCgpLnNldFNpemUoOSk7CisJCXlBeGlzUHJpbWFyeS5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJeUF4aXNQcmltYXJ5LmdldFRpdGxlKCApLmdldENhcHRpb24oICkuc2V0VmFsdWUoIE9yZGluYXRlX0FYSVMgKTsKKwkJeUF4aXNQcmltYXJ5LmdldFRpdGxlKCApLnNldFZpc2libGUodHJ1ZSk7CisJCS8vIHlBeGlzUHJpbWFyeS5nZXRNYWpvckdyaWQoKS5nZXRMaW5lQXR0cmlidXRlcygpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQkKKwkJLy8gZm9yIG5vdyBnZXQgcmVhZHkgdG8gY3JlYXRlIG9ubHkgb25lIGxpbmUgLSB3ZSBoYXZlIG5vIGRhdGEgeWV0LgorCQkvLyB3ZSB3aWxsIGFkZCBtb3JlIGxpbmVzIGFzIHdlIG5lZWQgdGhlbQorCQkvLyBoYW5kbGUgbnVsbAorCQlpZighZGF0YVNlcmllc01hcC5jb250YWluc0tleShmaXJzdFByb3BlcnR5KSkgeworCQkJRGF0YVNlcmllcyBzZXJpZXMgPSBuZXcgRGF0YVNlcmllcyhNZXNzYWdlcy5nZXRTdHJpbmcoIkFVVE8uVElUTEU0IiksIDAsIG92ZXJsYXlNb2RlKTsKKwkJCWRhdGFTZXJpZXNNYXAucHV0KGZpcnN0UHJvcGVydHksIHNlcmllcyk7CisJCX0KKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVTaW1wbGVMaW5lQ2hhcnQKKworCQorCS8qKgorCSAqIENyZWF0ZSB0aGUgdmlldydzIGNvbnRleHQgbWVudSBhbmQgYWRkIHRoZSBhY3Rpb24gaGFuZGxlcnMgdG8gaXQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCS8vIEluaXQgYSBDb250ZXh0IE1lbnUgTWFuYWdlcgorCQlmaW5hbCBNZW51TWFuYWdlciBjb250ZXh0TWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlsaW5lYXJUaW1lQWN0aW9uID0gbmV3IExpbmVhclNjYWxlQWN0aW9uKCk7CisJCWxvZ1RpbWVBY3Rpb24gPSBuZXcgTG9nU2NhbGVBY3Rpb24oKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChsaW5lYXJUaW1lQWN0aW9uKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChsb2dUaW1lQWN0aW9uKTsKKworCisJCQorCQkvLyBQbGFjZSBIb2xkZXIgZm9yIE1lbnUgQWRkaXRpb25zCisJCWNvbnRleHRNZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigKKwkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkKKwkJdmlld0xlZ2VuZCA9IG5ldyBMZWdlbmRWaWV3QWN0aW9uKCk7CisJCWhpZGVMZWdlbmQgPSBuZXcgTGVnZW5kSGlkZUFjdGlvbigpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKHZpZXdMZWdlbmQpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGhpZGVMZWdlbmQpOworCQkKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQorCQkKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQlwb3BVcE1lbnUgPSBjb250ZXh0TWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUocGFyZW50KTsKKworCQkvLyBTZXQgdGhlIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlcgorCQlwYXJlbnQuc2V0TWVudShwb3BVcE1lbnUpOworCisJfSAvLyBjcmVhdGVDb250ZXh0TWVudQorCQorCS8qKgorCSAqIFVwZGF0ZSB0aGUgdmlldydzIGNvbnRleHQgbWVudSBhbmQgYWRkIHRoZSBhY3Rpb24gaGFuZGxlcnMgdG8gaXQuCisJICovCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbnRleHRNZW51KGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlwb3BVcE1lbnUuZGlzcG9zZSgpOworCisJCS8vIEluaXQgYSBDb250ZXh0IE1lbnUgTWFuYWdlcgorCQlmaW5hbCBNZW51TWFuYWdlciBjb250ZXh0TWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlsaW5lYXJUaW1lQWN0aW9uID0gbmV3IExpbmVhclNjYWxlQWN0aW9uKCk7CisJCWxvZ1RpbWVBY3Rpb24gPSBuZXcgTG9nU2NhbGVBY3Rpb24oKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChsaW5lYXJUaW1lQWN0aW9uKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChsb2dUaW1lQWN0aW9uKTsKKwkJCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCisJCXZpZXdMZWdlbmQgPSBuZXcgTGVnZW5kVmlld0FjdGlvbigpOworCQloaWRlTGVnZW5kID0gbmV3IExlZ2VuZEhpZGVBY3Rpb24oKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZCh2aWV3TGVnZW5kKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChoaWRlTGVnZW5kKTsKKwkJCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkKKwkJCisJCS8vIFBsYWNlIEhvbGRlciBmb3IgTWVudSBBZGRpdGlvbnMKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKAorCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CisKKwkJCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBhZGQgdGhlIGRpc3BsYXlhYmxlIHByb3BlcnRpZXMKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9sLmdldE51bVByb3BlcnRpZXMoY2hhcnRJbmRleCk7IGkgKyspIHsKKwkJCQorCQkJU3RyaW5nIG5leHRQcm9wID0gY29udHJvbC5nZXRQcm9wZXJ0eShjaGFydEluZGV4LGkpOworCQkJRGF0YVNlcmllcyBzZXJpZXMgPSBkYXRhU2VyaWVzTWFwLmdldChuZXh0UHJvcCk7CisJCQlEaXNwbGF5YWJsZVByb3BlcnR5IHByb3BlcnR5ID0gbmV3IERpc3BsYXlhYmxlUHJvcGVydHkobmV4dFByb3AsIHNlcmllcy5pc1Zpc2libGUoKSk7CisJCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKHByb3BlcnR5KTsKKwkJfQorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCS8vIFBsYWNlIEhvbGRlciBmb3IgTWVudSBBZGRpdGlvbnMKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKAorCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJZmluYWwgTWVudSBwb3BVcE1lbnUgPSBjb250ZXh0TWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUocGFyZW50KTsKKworCQkvLyBTZXQgdGhlIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlcgorCQlwYXJlbnQuc2V0TWVudShwb3BVcE1lbnUpOworCisKKwl9IC8vIHVwZGF0ZUNvbnRleHRNZW51CisKKworCQorCS8qKgorCSAqIFNldHMgdGhlIGNvbG9ycyBmb3IgYSBuIGFycmF5IG9mIExpbmVTZXJpZXMgZ2l2ZW4gdGhlIHByb3BlcnR5IHRvIFBsb3QKKwkgKiBmb3IgZWFjaC4gVHJ5IHRvIHNldCBjb2xvciBmcm9tIHRoZSBwcmVmZXJlbmNlcyAoaWYgc3BlY2lmaWVkIGZvciB0aGF0CisJICogcHJvcGVydHkpIG90aGVyd2lzZSBzZXRzIGxpbmUgY29sb3IgdG8gYmx1ZS4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvcGVydGllc1RvUGxvdAorCSAqIEBwYXJhbSBsc0xpc3QKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29sb3JEZWZzKAorCQkJZmluYWwgTGlzdDxTdHJpbmc+IHByb3BlcnRpZXNUb1Bsb3QsCisJCQlmaW5hbCBMaXN0PExpbmVTZXJpZXM+IGxzTGlzdCkgeworCQkvLyB0aGUgZGVmYXVsdCBsaW5lIGNvbG9yCisKKwkJLy8gaWYgcG9zc2libGUgZ2V0IGNvbG9yIGZyb20gcHJlZmVyZW5jZXMKKwkJZmluYWwgTWFwPFN0cmluZywgQ29sb3I+IGNvbG9yTWFwID0gVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlCisJCQkJLmdldENvbG9yTWFwcGluZygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxzTGlzdC5zaXplKCk7IGkrKykgeworCQkJQ29sb3JEZWZpbml0aW9uIGNvbG9yID0gQ29sb3JEZWZpbml0aW9uSW1wbC5CTFVFKCk7CisKKwkJCWlmICgocHJvcGVydGllc1RvUGxvdCAhPSBudWxsKSAmJiAocHJvcGVydGllc1RvUGxvdC5zaXplKCkgPiBpKSkgeworCQkJCWZpbmFsIFN0cmluZyBrZXkgPSBwcm9wZXJ0aWVzVG9QbG90LmdldChpKTsKKwkJCQkvLyBsb29rIG9yIHRoZSBwcmVmZXJlbmNlIGNvbG9yIGJ5IG5hbWUKKwkJCQlpZiAoY29sb3JNYXAuY29udGFpbnNLZXkoa2V5KSkgeworCQkJCQlmaW5hbCBDb2xvciBjID0gY29sb3JNYXAuZ2V0KGtleSk7CisJCQkJCWNvbG9yID0gQ29sb3JEZWZpbml0aW9uSW1wbC5jcmVhdGUoYy5nZXRSZWQoKSwKKwkJCQkJCQljLmdldEdyZWVuKCksIGMuZ2V0Qmx1ZSgpKTsKKwkJCQl9CisJCQkJbHNMaXN0LmdldChpKS5zZXRTZXJpZXNJZGVudGlmaWVyKGtleSk7CisJCQkJbHNMaXN0LmdldChpKS5nZXRMaW5lQXR0cmlidXRlcygpLnNldENvbG9yKGNvbG9yKTsKKwkJCX0gZWxzZSB7CisKKwkJCQlpZiAobHNMaXN0LmdldChpKSAhPSBudWxsKSB7CisJCQkJCWxzTGlzdC5nZXQoaSkuc2V0U2VyaWVzSWRlbnRpZmllcigiICIpOworCQkJCQlsc0xpc3QuZ2V0KGkpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoY29sb3IpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm47CisJfS8vIGdldENvbG9yRGVmCisKKworCQorCisJLyoqCisJICogRGlzcG9zZXMgdGhlIENvbG9yIG9iamVjdHMKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJLyoqCisJICogcmVzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJcmVzZXREYXRhKCk7CisJCXJlZHJhdygpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHJlc2V0RGF0YSgpIHsKKwkJY2xlYXJEYXRhKCk7CisJCisJCWN5Y2xlTnVtYmVycy5hZGQoSW50ZWdlci52YWx1ZU9mKDApKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjbGVhckRhdGEoKSB7CisJCQorCQlkYXRhU2VyaWVzTWFwLmNsZWFyKCk7CisJCWN5Y2xlTnVtYmVycy5jbGVhcigpOworCX0KKworCQorCS8qKgorCSAqIHRvZ2dsZSB0aGUgc2NhbGUgZnJvbSBsb2dhcml0aG1pYyB0byBsaW5lYXIKKwkgKi8KKwl2b2lkIHRvZ2dsZUF4aXNTY2FsZSgpIHsKKwkJaWYgKHVzZUxpbmVhclRpbWVTY2FsZSkgeyAvL1N3aXRjaCB0byBsb2dhcml0aG1pYyBzY2FsZQorCQkJbG9nVGltZUFjdGlvbi5zZXRDaGVja2VkKHRydWUpOworCQkJbGluZWFyVGltZUFjdGlvbi5zZXRDaGVja2VkKGZhbHNlKTsKKwkJCS8vSnVzdCB1c2luZyB0aGUgZm9sbG93aW5nIGF4aXMgdHlwZSwgdG8gbW92ZSB0byBsb2cgc2NhbGUsIGRpZG4ndCB3b3JrCisJCQkvL3lBeGlzUHJpbWFyeS5zZXRUeXBlKEF4aXNUeXBlLkxPR0FSSVRITUlDX0xJVEVSQUwpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWluKG51bGwpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWF4KG51bGwpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkudW5zZXRTdGVwKCk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS51bnNldFN0ZXBOdW1iZXIoKTsKKwkJfQorCQllbHNlIHsgLy9Td2l0Y2ggdG8gbGluZWFyIHNjYWxlCisJCQlsb2dUaW1lQWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOworCQkJbGluZWFyVGltZUFjdGlvbi5zZXRDaGVja2VkKHRydWUpOworCQkJLy95QXhpc1ByaW1hcnkuc2V0VHlwZShBeGlzVHlwZS5MSU5FQVJfTElURVJBTCk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNaW4oTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZSgwLjApKTsKKwkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDEuMCkpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0U3RlcCgwLjI1KTsKKwkJfQorCQl1c2VMaW5lYXJUaW1lU2NhbGUgPSAhdXNlTGluZWFyVGltZVNjYWxlOworCQlkcmF3KCk7CisJfQorCQorCisJLyoqCisJICogdG9nZ2xlIHRoZSBzY2FsZSBmcm9tIGxvZ2FyaXRobWljIHRvIGxpbmVhcgorCSAqLworCXZvaWQgdG9nZ2xlTGVnZW5kKCkgeworCQlpZiAoc2hvd0xlZ2VuZCkgeyAvL1N3aXRjaCB0byBoaWRlCisJCQl2aWV3TGVnZW5kLnNldENoZWNrZWQoZmFsc2UpOworCQkJaGlkZUxlZ2VuZC5zZXRDaGVja2VkKHRydWUpOworCQkJbGVnZW5kLnNldFZpc2libGUoZmFsc2UpOworCQl9CisJCWVsc2UgeyAvL1N3aXRjaCB0byB2aWV3CisJCQl2aWV3TGVnZW5kLnNldENoZWNrZWQodHJ1ZSk7CisJCQloaWRlTGVnZW5kLnNldENoZWNrZWQoZmFsc2UpOworCQkJbGVnZW5kLnNldFZpc2libGUodHJ1ZSk7CisJCX0KKwkJc2hvd0xlZ2VuZCA9ICFzaG93TGVnZW5kOworCQlkcmF3KCk7CisJfQorCisKKwkvKioKKwkgKiBBY3Rpb24gdG8gc2hvdyB0aGUgbGVnZW5kCisJICovCisJcHJvdGVjdGVkIGNsYXNzIExlZ2VuZFZpZXdBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCQlwdWJsaWMgTGVnZW5kVmlld0FjdGlvbigpCisJCXsKKwkJCXN1cGVyKE1lc3NhZ2VzLmdldFN0cmluZygiQ29udGV4dE1lbnUuU2hvd0xlZ2VuZCIpLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7CisJCQlzZXRDaGVja2VkKHNob3dMZWdlbmQpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5TaG93TGVnZW5kIik7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJaWYgKHNob3dMZWdlbmQpIHsKKwkJCQlzZXRDaGVja2VkKHRydWUpOworCQkJCS8vTm90aGluZyB0byBkby4gSXQncyBhbHJlYWR5IGxpbmVhci10aW1lLgorCQkJfQorCQkJZWxzZSB7CisJCQkJdG9nZ2xlTGVnZW5kKCk7CisJCQl9CisJCQlkcmF3KCk7CisJCX0KKwl9IC8vTGVnZW5kVmlld0FjdGlvbgorCQorCS8qKgorCSAqIEFjdGlvbiB0byBoaWRlIHRoZSBsZWdlbmQKKwkgKi8KKwljbGFzcyBMZWdlbmRIaWRlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIAl7CisJCXB1YmxpYyBMZWdlbmRIaWRlQWN0aW9uKCkKKwkJeworCQkJc3VwZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5IaWRlTGVnZW5kIiksIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKKwkJCXNldENoZWNrZWQoIXNob3dMZWdlbmQpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5IaWRlTGVnZW5kIik7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJaWYgKCFzaG93TGVnZW5kKSB7CisJCQkJc2V0Q2hlY2tlZCh0cnVlKTsKKwkJCQkvL05vdGhpbmcgdG8gZG8uIEl0J3MgYWxyZWFkeSBsb2ctdGltZS4KKwkJCX0KKwkJCWVsc2UgeworCQkJCXRvZ2dsZUxlZ2VuZCgpOworCQkJfQorCQkJZHJhdygpOworCQl9CisJfS8vTGVnZW5kSGlkZUFjdGlvbgorCisJCisJLyoqCisJICogc3dpdGNoIHRvIGxpbmVhciBwbG90IAorCSAqIAorCSAqLworCXByb3RlY3RlZCBjbGFzcyBMaW5lYXJTY2FsZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJCXB1YmxpYyBMaW5lYXJTY2FsZUFjdGlvbigpCisJCXsKKwkJCXN1cGVyKE1lc3NhZ2VzLmdldFN0cmluZygiQ29udGV4dE1lbnUuTGluZWFyVGltZVNjYWxlIiksIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKKwkJCXNldENoZWNrZWQodXNlTGluZWFyVGltZVNjYWxlKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZ2V0VGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCQkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiQ29udGV4dE1lbnUuTGluZWFyVGltZVNjYWxlIik7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJaWYgKHVzZUxpbmVhclRpbWVTY2FsZSkgeworCQkJCXNldENoZWNrZWQodHJ1ZSk7CisJCQkJLy9Ob3RoaW5nIHRvIGRvLiBJdCdzIGFscmVhZHkgbGluZWFyLXRpbWUuCisJCQl9CisJCQllbHNlIHsKKwkJCQl0b2dnbGVBeGlzU2NhbGUoKTsKKwkJCX0KKwkJCWRyYXcoKTsKKwkJfQorCX0gLy9MaW5lYXJTY2FsZUFjdGlvbgorCisJLyoqCisJICogc3dpdGNoIHRvIHNlbWktbG9nIHBsb3QgKGxvZyBzY2FsZSBvbiB5IGF4aXMpCisJICogCisJICovCisJY2xhc3MgTG9nU2NhbGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gCXsKKwkJcHVibGljIExvZ1NjYWxlQWN0aW9uKCkKKwkJeworCQkJc3VwZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5Mb2dUaW1lU2NhbGUiKSwgSUFjdGlvbi5BU19DSEVDS19CT1gpOworCQkJc2V0Q2hlY2tlZCghdXNlTGluZWFyVGltZVNjYWxlKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZ2V0VGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCQkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiQ29udGV4dE1lbnUuTG9nVGltZVNjYWxlIik7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJaWYgKCF1c2VMaW5lYXJUaW1lU2NhbGUpIHsKKwkJCQlzZXRDaGVja2VkKHRydWUpOworCQkJCS8vTm90aGluZyB0byBkby4gSXQncyBhbHJlYWR5IGxvZy10aW1lLgorCQkJfQorCQkJZWxzZSB7CisJCQkJdG9nZ2xlQXhpc1NjYWxlKCk7CisJCQl9CisJCQlkcmF3KCk7CisJCX0KKwl9Ly9Mb2dTY2FsZUFjdGlvbgorCQorCS8qKgorCSAqIERpc3BsYXlhYmxlUHJvcGVydHkKKwkgKgorCSAqLworCXByb3RlY3RlZCBjbGFzcyBEaXNwbGF5YWJsZVByb3BlcnR5IGV4dGVuZHMgQWN0aW9uCisJeworCQlTdHJpbmcgcHJvcGVydHkgPSBudWxsOworCQlwdWJsaWMgRGlzcGxheWFibGVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIGJvb2xlYW4gdmlzaWJpbGl0eSkKKwkJeworCQkJCQlzdXBlcihwcm9wZXJ0eSwgSUFjdGlvbi5BU19DSEVDS19CT1gpOworCQkJCQl0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisJCQkJCXNldENoZWNrZWQodmlzaWJpbGl0eSk7CisJCX0KKwkJCisJCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gcHJvcGVydHk7CisJCX0KKworCQkvKioKKwkJICogVG9nZ2xlIHRoZSBzdGF0ZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJRGF0YVNlcmllcyBzZXJpZXMgPSBkYXRhU2VyaWVzTWFwLmdldChwcm9wZXJ0eSk7CisJCQkJc2VyaWVzLnRvZ2dsZVZpc2libGUoKTsKKwkJCQlkYXRhU2VyaWVzTWFwLnB1dChwcm9wZXJ0eSxzZXJpZXMpOworCQkJCXNldENoZWNrZWQoc2VyaWVzLmlzVmlzaWJsZSgpKTsKKwkJCQl2aXNpYmxlTWFwLnB1dChwcm9wZXJ0eSwgc2VyaWVzLmlzVmlzaWJsZSgpKTsKKwkJCQlkcmF3KCk7CisJCX0KKwl9Ly8gRGlzcGxheWFibGVQcm9wZXJ0eQorCQorCQorCS8qKgorCSAqIElubmVyIGNsYXNzIERhdGFTZXJpZXMKKwkgKiBhbGwgdGhlIGRhdGEgb2JqZWN0cyBmb3IgYSBwbG90CisJICoKKwkgKi8KKwlwcm90ZWN0ZWQgY2xhc3MgRGF0YVNlcmllcyAKKwl7CisJCXB1YmxpYyBTdHJpbmcgcHJvcGVydHlOYW1lID0gIiI7CisJCQorCQlwdWJsaWMgTGlzdDxEb3VibGU+IHJlbGF0aXZlVmFsdWVzID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCXB1YmxpYyBTZXJpZXMgbGluZVNlcmllcyA9IG51bGw7CisJCXByaXZhdGUgYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsKKwkJcHJpdmF0ZSBTZXJpZXNEZWZpbml0aW9uIHNkWSA9IG51bGw7CisJCXByaXZhdGUgaW50IHNlcmllc0luZGV4ID0gMDsKKwkJcHJpdmF0ZSBib29sZWFuIG92ZXJsYXlNb2RlID0gZmFsc2U7CisJCQorCQkKKwkJcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworCQkJcmV0dXJuIHZpc2libGU7CisJCX0KKwkJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHN0YXRlKSB7CisJCQl2aXNpYmxlID0gc3RhdGU7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIHRvZ2dsZVZpc2libGUoKSB7CisJCQl2aXNpYmxlID0gIXZpc2libGU7CisJCX0KKworCQkvKioKKwkJICogCisJCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKwkJICogQHBhcmFtIGluZGV4CisJCSAqIEBwYXJhbSBvdmVybGF5IAorCQkgKi8KKwkJcHVibGljIERhdGFTZXJpZXMoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGluZGV4LCBib29sZWFuIG92ZXJsYXkpIHsKKwkJCXRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworCQkJdGhpcy5zZXJpZXNJbmRleCA9IGluZGV4OworCQkJdGhpcy5vdmVybGF5TW9kZSA9IG92ZXJsYXk7CisJCQlyZWxhdGl2ZVZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJcmVsYXRpdmVWYWx1ZXMuYWRkKG5ldyBEb3VibGUoMC4wKSk7CisJCQlhZGRMaW5lU2VyaWVzKHByb3BlcnR5TmFtZSk7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIGFkZFZhbHVlKERvdWJsZSB2YWwpIHsKKwkJCWlmKHJlbGF0aXZlVmFsdWVzPT1udWxsKSByZWxhdGl2ZVZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJcmVsYXRpdmVWYWx1ZXMuYWRkKHZhbCk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCisJCSAqIAorCQkgKi8KKwkJQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKwkJcHVibGljIHZvaWQgYWRkTGluZVNlcmllcyhmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCQkKKwkJCWZpbmFsIE51bWJlckRhdGFTZXQgb3J0aG9WYWx1ZXMgPSBOdW1iZXJEYXRhU2V0SW1wbAorCQkJCQkuY3JlYXRlKHJlbGF0aXZlVmFsdWVzKTsKKwkJCWlmKGxpbmVTZXJpZXMgPT0gbnVsbCkgeworCQkJCWxpbmVTZXJpZXMgPSBTY2F0dGVyU2VyaWVzSW1wbC5jcmVhdGUoKTsKKwkJCQkvKgorCQkJCSAqIAorCQkJCSAqIEJhciBjaGFydCBzdHlsZSBpcyB0b28gc2xvdyBmb3IgZ2VuZXJhdGlvbiBvZiBhIGZpbGwKKwkJCQkgKiBpZiB3ZSB3YW50IGEgZmlsbCB3ZSBjYW4gdHJ5IHVzaW5nIHRoZSBkaWZmZXJlbmNlIHBsb3QKKwkJCQkgKiB0byBhIHN0cmFpZ2h0IGxpbmUgYXQgeT0wCisJCQkJICogCisJCQkJCisJCQkJaWYocHJvcGVydHlOYW1lLmluZGV4T2YoIioiKT49MSkgeworCQkJCQkvLyBiYXJzZXJpZXMgbWV0aG9kcworCQkJCQlsaW5lU2VyaWVzID0gKEJhclNlcmllcykgQmFyU2VyaWVzSW1wbC5jcmVhdGUoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsaW5lU2VyaWVzID0gKFNjYXR0ZXJTZXJpZXMpIFNjYXR0ZXJTZXJpZXNJbXBsLmNyZWF0ZSgpOworCQkJCX0KKwkJCQkKKwkJCQkqCisJCQkJKi8KKwkJCX0gLy8gaWYgbGluZVNlcmllcz09bnVsbAorCQkJbGluZVNlcmllcy5zZXREYXRhU2V0KG9ydGhvVmFsdWVzKTsKKwkJCSgoTGluZVNlcmllcykgbGluZVNlcmllcykuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRWaXNpYmxlKHRydWUpOworCQkJKChMaW5lU2VyaWVzKSBsaW5lU2VyaWVzKS5nZXRNYXJrZXJzKCkuY2xlYXIoKTsKKwkJCQorCQkJLy8gQXNzaWduIHRoZSBsaW5lIGNvbG9yCisJCQkvLyBiYXNlZCBvbiBzZWxlY3RlZCBwcm9wZXJ0eS4gRGVmYXVsdCBpcyBCbHVlCisJCQlzZXRDb2xvckRlZnMoc2VyaWVzSW5kZXgpOworCQkJLy8gSWYgdGhpcyBpcyB0aGUgInNlbGVjdGVkIiByZWdpb24gb2YgYSBncmFwaCBzZXQgdGhlIG1hcmtlciB0eXBlCisJCQorCQkJLy8gdGhlIHNlcmllcyBkZWYKKwkJCXNkWSA9IFNlcmllc0RlZmluaXRpb25JbXBsLmNyZWF0ZSgpOworCQkJc2RZLmdldFNlcmllc1BhbGV0dGUoKS51cGRhdGUoLTIpOworCQkJc2RZLmdldFNlcmllcygpLmFkZChsaW5lU2VyaWVzKTsKKwkJCXlBeGlzUHJpbWFyeS5nZXRTZXJpZXNEZWZpbml0aW9ucygpLmFkZChzZFkpOworCQkJCisJCQlyZXR1cm47CisJCX0vLyBhZGRMaW5lU2VyaWVzCisJCQorCQkvKiogCisJCSAqIGluIHJlc3BvbnNlIHRvIHVzZXIgYWN0aW9uIHRlbXBvcmFyaWx5IHJlbW92ZSB0aGUgbGluZSBzZXJpZXMgZnJvbSB0aGUgZ3JhcGgKKwkJICovCisJCXB1YmxpYyB2b2lkIGhpZGUoKSB7CisJCQlsaW5lU2VyaWVzLnNldFZpc2libGUoZmFsc2UpOworCQkJdmlzaWJsZSA9IGZhbHNlOworCQl9Ly8gaGlkZQorCQkKKwkJLyoqIAorCQkgKiBpbiByZXNwb25zZSB0byB1c2VyIGFjdGlvbiBhZGQgYmFjayB0aGUgbGluZSBzZXJpZXMgdG8gdGhlIGdyYXBoCisJCSAqLworCQlwdWJsaWMgdm9pZCBzaG93KCkgeworCQkJbGluZVNlcmllcy5zZXRWaXNpYmxlKHRydWUpOworCQkJdmlzaWJsZSA9IHRydWU7CisJCX0vLyBzaG93CisJCQorCisJCS8qKgorCQkgKiBPdmVybG9hZGVkIGFuZCBzaW1wbGUgbWV0aG9kIHRvIHNldCB0aGUgY29sb3JzCisJCSAqIGRvZXMgbm90IHVzZSB0aGUgcHJlZmVyZW5jZXMKKwkJICogCisJCSAqIFNldHMgdGhlIGNvbG9ycyBmb3IgYSBuIGFycmF5IG9mIExpbmVTZXJpZXMgZ2l2ZW4gdGhlIHByb3BlcnR5IHRvIFBsb3QKKwkJICogZm9yIGVhY2guIFRyeSB0byBzZXQgY29sb3IgZnJvbSB0aGUgcHJlZmVyZW5jZXMgKGlmIHNwZWNpZmllZCBmb3IgdGhhdAorCQkgKiBwcm9wZXJ0eSkgb3RoZXJ3aXNlIHNldHMgbGluZSBjb2xvciB0byBibHVlLgorCQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIAorCQkgKgorCQkgKi8KKwkJcHVibGljIHZvaWQgc2V0Q29sb3JEZWZzKGludCBpbmRleCkgeworCQkJLy8gdGhlIGRlZmF1bHQgbGluZSBjb2xvcgorCQkJaWYoaW5kZXggPj0gY29sb3JEZWZhdWx0Lmxlbmd0aCkgaW5kZXggPSAwOyAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCisJCQlDb2xvckRlZmluaXRpb24gY29sb3IgPSBjb2xvckRlZmF1bHRbaW5kZXhdOworCisJCQl0aGlzLmxpbmVTZXJpZXMuc2V0U2VyaWVzSWRlbnRpZmllcihwcm9wZXJ0eU5hbWUpOworCQkJaWYgKG92ZXJsYXlNb2RlKSB7CisJCQkJCSgoTGluZVNlcmllcyl0aGlzLmxpbmVTZXJpZXMpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoY29sb3IpOworCQkJCQkoKExpbmVTZXJpZXMpdGhpcy5saW5lU2VyaWVzKS5nZXRMaW5lQXR0cmlidXRlcygpLnNldFN0eWxlKExpbmVTdHlsZS5ET1RURURfTElURVJBTCk7CisJCQl9IGVsc2UgeworCQkJCSgoTGluZVNlcmllcyl0aGlzLmxpbmVTZXJpZXMpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoY29sb3IpOworCQkJfQorCQkJCisJCQkKKwkJfS8vIGdldENvbG9yRGVmcworCQkKKwkJLyoqCisJCSAqIFNldHMgdGhlIGNvbG9ycyBmb3IgYSBuIGFycmF5IG9mIExpbmVTZXJpZXMgZ2l2ZW4gdGhlIHByb3BlcnR5IHRvIFBsb3QKKwkJICogZm9yIGVhY2guIFRyeSB0byBzZXQgY29sb3IgZnJvbSB0aGUgcHJlZmVyZW5jZXMgKGlmIHNwZWNpZmllZCBmb3IgdGhhdAorCQkgKiBwcm9wZXJ0eSkgb3RoZXJ3aXNlIHNldHMgbGluZSBjb2xvciB0byBibHVlLgorCQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIAorCQkgKgorCQkgKi8KKwkJcHVibGljIHZvaWQgc2V0Q29sb3JEZWZzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJCS8vIHRoZSBkZWZhdWx0IGxpbmUgY29sb3IKKworCQkJLy8gaWYgcG9zc2libGUgZ2V0IGNvbG9yIGZyb20gcHJlZmVyZW5jZXMKKwkJCWZpbmFsIE1hcDxTdHJpbmcsIENvbG9yPiBjb2xvck1hcCA9IFZpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZS5nZXRDb2xvck1hcHBpbmcoKTsKKworCQkJLy8gZGVmYXVsdCBjb2xvcgorCQkJaW50IGNvbG9ySW5kZXggPSBzZXJpZXNJbmRleCAlIGNvbG9yRGVmYXVsdC5sZW5ndGg7CisJCQlDb2xvckRlZmluaXRpb24gY29sb3IgPSBjb2xvckRlZmF1bHRbY29sb3JJbmRleF07CisKKwkJCS8vIHByZWZlcnJlZCBjb2xvciBieSBuYW1lCisJCQlTdHJpbmcga2V5ID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZygwLDEpOworCQkJCisJCQlpZiAoY29sb3JNYXAuY29udGFpbnNLZXkoa2V5KSkgeworCQkJCWZpbmFsIENvbG9yIGMgPSBjb2xvck1hcC5nZXQoa2V5KTsKKwkJCQljb2xvciA9IENvbG9yRGVmaW5pdGlvbkltcGwuY3JlYXRlKGMuZ2V0UmVkKCksIGMuZ2V0R3JlZW4oKSwgYy5nZXRCbHVlKCkpOworCQkJfQorCQkJCisJCQl0aGlzLmxpbmVTZXJpZXMuc2V0U2VyaWVzSWRlbnRpZmllcihwcm9wZXJ0eU5hbWUpOworCQkJaWYgKG92ZXJsYXlNb2RlKSB7CisJCQkJCSgoTGluZVNlcmllcyl0aGlzLmxpbmVTZXJpZXMpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoQ29sb3JEZWZpbml0aW9uSW1wbC5HUkVZKCkpOworCQkJCQkoKExpbmVTZXJpZXMpdGhpcy5saW5lU2VyaWVzKS5nZXRMaW5lQXR0cmlidXRlcygpLnNldFN0eWxlKExpbmVTdHlsZS5ET1RURURfTElURVJBTCk7CisJCQl9IGVsc2UgeworCQkJCSgoTGluZVNlcmllcyl0aGlzLmxpbmVTZXJpZXMpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoY29sb3IpOworCQkJfQorCQkJCisJCQkKKwkJfS8vIGdldENvbG9yRGVmcworCisJCS8qKgorCQkgKiBsZW5ndGggb2YgdGhlIHNlcmllcworCQkgKiBAcmV0dXJuIG51bWJlciBvZiBkYXRhIHBvaW50cworCQkgKi8KKwkJcHVibGljIGludCBnZXREYXRhU2l6ZSgpIHsKKwkJCXJldHVybiByZWxhdGl2ZVZhbHVlcy5zaXplKCk7CisJCX0KKwkJLy8gQWNjZXNzb3JzCisJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgeworCQkJcmV0dXJuIHByb3BlcnR5TmFtZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKwkJfQorCisJCXB1YmxpYyBMaXN0PERvdWJsZT4gZ2V0UmVsYXRpdmVWYWx1ZXMoKSB7CisJCQlyZXR1cm4gcmVsYXRpdmVWYWx1ZXM7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRSZWxhdGl2ZVZhbHVlcyhMaXN0PERvdWJsZT4gcmVsYXRpdmVWYWx1ZXMpIHsKKwkJCXRoaXMucmVsYXRpdmVWYWx1ZXMgPSByZWxhdGl2ZVZhbHVlczsKKwkJfQorCisJCQorCisJCXB1YmxpYyB2b2lkIHNldExpbmVTZXJpZXMoTGluZVNlcmllcyBsaW5lU2VyaWVzKSB7CisJCQl0aGlzLmxpbmVTZXJpZXMgPSBsaW5lU2VyaWVzOworCQl9CisJfS8vIERhdGFTZXJpZXMKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorfSAvLyBBZ2dyZWdhdGVUaW1lU2VyaWVzQ2FudmFzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC92aWV3cy9BbmFseXNpc0NvbnRyb2wuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L3ZpZXdzL0FuYWx5c2lzQ29udHJvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyODliMGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC92aWV3cy9BbmFseXNpc0NvbnRyb2wuamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLy8gQW5hbHlzaXNDb250cm9sCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CisKKy8qKgorICogQW5hbHlzaXNDb250cm9sIGlzIGEgc3ViY2xhc3Mgb2YgQ2FudmFzIHN1aXRhYmxlIGZvciBjaGFydCBkcmF3aW5ncy4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIEFuYWx5c2lzQ29udHJvbCBleHRlbmRzIENvbXBvc2l0ZSAgeworCisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUl9URVhUID0gImNsZWFyIG1vbml0b3JzIjsKKworCXByb3RlY3RlZCBMYWJlbCBzaW11bGF0aW9uTmFtZUxhYmVsOworCQorCS8qKgorCSAqIFN0YXR1cyB0ZXh0CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVFVTX1RFWFQgPSAic3RhdHVzIjsKKwkKKwlwcm90ZWN0ZWQgc3RhdGljIE1hcDxTdHJpbmcsT2JqZWN0PiBjb250cm9sUGFyYW1ldGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxPYmplY3Q+KCk7CisJCisJLyoqIAorCSAqIGEgc3RyaW5nIGZvciBzZXR0aW5nIHVzZXIgZmVlZGJhY2sgbWVzc2FnZXMKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHVzZXJNZXNzYWdlID0gIiI7CisJCisJLyoqCisJICogYSBsYWJlbCB0byBkaXNwbGF5IG1lc3NhZ2VzCisJICovCisJcHJvdGVjdGVkIExhYmVsIHVzZXJNZXNzYWdlTGFiZWwgPSBudWxsOworCQorCisJCisJLyoqCisJICogVGhlIGNvbGxlY3Rpb24gb2YgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB3YWl0aW5nIHRvIGJlIHRvbGQgYWJvdXQKKwkgKiBzZWxlY3Rpb25zLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+IGxpc3RlbmVycyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPigpOworCisJcHJvdGVjdGVkIExhYmVsIGlkZW50aWZpYWJsZVRpdGxlOworCisJLyoqCisJICogVGhlIHdpZHRoIG9mIHRoZSBsYXlvdXQgbWFyZ2luLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BUkdJTl9XSURUSCA9IDU7CisKKwkvKioKKwkgKiBUaGUgaGVpZ2h0IG9mIHRoZSBsYXlvdXQgbWFyZ2luLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BUkdJTl9IRUlHSFQgPSA1OworCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqLworCXB1YmxpYyBBbmFseXNpc0NvbnRyb2woZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgaW50IHN0eWxlKSB7CisJCXN1cGVyKHBhcmVudCwgc3R5bGUpOworCisJCXRoaXMuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisJCQkvKioKKwkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIjd2lkZ2V0RGlzcG9zZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQpCisJCQkgKi8KKwkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQkJZmluYWwgRGlzcG9zZUV2ZW50IGUpIHsKKwkJCQlkaXNwb3NlKCk7CisJCQl9CisJCX0pOworCisJCWZpbmFsIEZvcm1MYXlvdXQgbGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IE1BUkdJTl9IRUlHSFQ7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IE1BUkdJTl9XSURUSDsKKwkJc2V0TGF5b3V0KGxheW91dCk7CisKKwl9IC8vIEFuYWx5c2lzQ29udHJvbAorCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBTV1QgY29udHJvbCB0aGF0IHRoaXMgY29tcG9zaXRlIHdpbGwgYmUgYSBjaGlsZCBvZgorCSAqIEByZXR1cm4gdGhlIFNXVCBDb21wb3NpdGUgdG8gYmUgZGlzcGxheWVkIGFib3ZlIHRoZSBNYXBDYW52YXMgaW4gdGhlCisJICogICAgICAgICBjb250cm9sCisJICovCisJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQlmaW5hbCBDb21wb3NpdGUgdG9wQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKworCQlmaW5hbCBGaWxsTGF5b3V0IHRvcENvbXBvc2l0ZUxheW91dCA9IG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCk7CisJCXRvcENvbXBvc2l0ZS5zZXRMYXlvdXQodG9wQ29tcG9zaXRlTGF5b3V0KTsKKworCQlzaW11bGF0aW9uTmFtZUxhYmVsID0gbmV3IExhYmVsKHRvcENvbXBvc2l0ZSwgU1dULkNFTlRFUik7CisJCXNpbXVsYXRpb25OYW1lTGFiZWwuc2V0VGV4dCgiIik7CisKKwkJcmV0dXJuIHRvcENvbXBvc2l0ZTsKKwl9IC8vIGNyZWF0ZVRvcENvbXBvc2l0ZQorCQorCQorCisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gZm9sZGVyTmFtZQorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVIZWFkZXIoU3RyaW5nIGZvbGRlck5hbWUpOworCisJCisJLyoqCisJICogQWxsIGNvbnRyb2xsZXJzIG11c3QgaW1wbGVtZW50IHRoaXMgCisJICogdG8gcmVtb3ZlIHRoZSBjb250cm9sIGUuZy4gYnkgYSByZW1vdmUgYnV0dG9uIGV2ZW50CisJICovCisJcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlKCkgOworCQorCQorCQorCQorCQorCQorCS8qKgorCSAqIGdldCB2YWx1ZXMgZm9yIGdyYXBocyBhcyBkb3VibGUgYXJyYXkKKwkgKiBAcGFyYW0gY2hhcnRJbmRleCBhbGxvd3MgbXVsdGlwbGUgY2hhcnRzIGluIGEgdmlldy4gRGVmYXVsdCBpcyBpbmRleD0wIChvbmUgY2hhcnQpCisJICogQHBhcmFtIHN0YXRlCisJICogQHJldHVybiB2YWx1ZSBhcnJheQorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBkb3VibGVbXSBnZXRWYWx1ZXMoaW50IGNoYXJ0SW5kZXgsIGludCBzdGF0ZSk7CisJCisJLyoqCisJICogdXBkYXRlIHRoZSBtZXNzYWdlIHRleHQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGVNZXNzYWdlKCkgeworCQlpZih1c2VyTWVzc2FnZUxhYmVsIT1udWxsKQl1c2VyTWVzc2FnZUxhYmVsLnNldFRleHQodXNlck1lc3NhZ2UpOworCX0KKwkKKwkvKioKKwkgKiB1cGRhdGUgdGhlIG1lc3NhZ2UgdGV4dAorCSAqIEBwYXJhbSBtZXNzYWdlIAorCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0ZU1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKwkJdXNlck1lc3NhZ2UgPSBtZXNzYWdlOworCQlpZih1c2VyTWVzc2FnZUxhYmVsIT1udWxsKQl1c2VyTWVzc2FnZUxhYmVsLnNldFRleHQodXNlck1lc3NhZ2UpOworCX0KKwkKKwkvKioKKwkgKiBnZXQgdGhlIG5hbWUgb2YgdGhlIHRpbWUgc2VyaWVzIGZvciBhIGdpdmVuIHN0YXRlCisJICogQHBhcmFtIGNoYXJ0SW5kZXggIGFsbG93cyBtdWx0aXBsZSBjaGFydHMgaW4gYSB2aWV3LiBEZWZhdWx0IGlzIGluZGV4PTAgKG9uZSBjaGFydCkKKwkgKiBAcGFyYW0gc3RhdGUKKwkgKiBAcmV0dXJuIHByb3BlcnR5IG5hbWUKKwkgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3BlcnR5KGludCBjaGFydEluZGV4LCBpbnQgc3RhdGUpOworICAgIAorCisgICAgLyoqCisgICAgICogCisgICAgICogQHBhcmFtIGNoYXJ0SW5kZXggIGFsbG93cyBtdWx0aXBsZSBjaGFydHMgaW4gYSB2aWV3LiBEZWZhdWx0IGlzIGluZGV4PTAgKG9uZSBjaGFydCkKKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBwcm9wZXJ0aWVzIHRvIHBsb3QKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldE51bVByb3BlcnRpZXMoaW50IGNoYXJ0SW5kZXgpOworICAgIAorICAgIAorCQorCisKK30gLy8gQW5hbHlzaXNDb250cm9sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC92aWV3cy9BbmFseXNpc0NvbnRyb2xGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC92aWV3cy9BbmFseXNpc0NvbnRyb2xGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI5ODdjOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L3ZpZXdzL0FuYWx5c2lzQ29udHJvbEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM1IEBACisvLyBBbmFseXNpc0NvbnRyb2xGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50LnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBmYWN0b3JpZXMgdGhhdCBjcmVhdGUgaW5zdGFuY2VzIG9mCisgKiB7QGxpbmsgQW5hbHlzaXNDb250cm9sfS4KKyAqLworcHVibGljIGludGVyZmFjZSBBbmFseXNpc0NvbnRyb2xGYWN0b3J5IHsKKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQgCisJICogQHJldHVybiB0aGUgQW5hbHlzaXNDb250cm9sCisJICovCisJQW5hbHlzaXNDb250cm9sIGNyZWF0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50KTsKKworCS8qKgorCSAqIEByZXR1cm4gVE9ETyBKRksKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENvbnRyb2xUeXBlKCk7CisKK30gLy8gQW5hbHlzaXNDb250cm9sRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvdmlld3MvQW5hbHlzaXNWaWV3ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L3ZpZXdzL0FuYWx5c2lzVmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1ZGMxZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L3ZpZXdzL0FuYWx5c2lzVmlld2VyLmphdmEKQEAgLTAsMCArMSwyMTkgQEAKKy8vIEFuYWx5c2lzVmlld2VyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50LnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuTWFwQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHByZXNlbnRzICJ2aWV3cyIgb2YgdGhlIHJ1bm5pbmcgc2ltdWxhdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBBbmFseXNpc1ZpZXdlciBleHRlbmRzIFZpZXdlciAgeworCisJCisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9QUkVGSVggPSAiL3Jlc291cmNlcy9kYXRhL3NjZW5hcmlvL2Rpc2Vhc2UvIjsKKwkKKwkKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHRvcC1sZXZlbCBjb250cm9sIG9mIHRoZSB2aWV3ZXIuIEl0IGNvbnRhaW5zIHRoZQorCSAqIHtAbGluayBNYXBDb250cm9sfXMgdGhhdCBkaXNwbGF5IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9ufXMuCisJICovCisJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKKworCQorCisKKwkKKworCQorCisJLy8gZ2V0IHRoZSBwYXRoCisJLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBJUGF0aCBQQVRIID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCk7CisKKwkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzZXAgPSBGaWxlLnNlcGFyYXRvcjsKKwkKKwkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwYXRoU3VmZml4ID0gImFuYWx5c2lzIitzZXA7CisJCisJCisKKwkvKioKKwkgKiBUaGlzIGZhY3RvcnkgaXMgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHtAbGluayBBbmFseXNpc0NvbnRyb2x9IGluIHRoZQorCSAqIG1ldGhvZCB7QGxpbmsgI3BvcHVsYXRlVmlldygpfQorCSAqLworCXByaXZhdGUgZmluYWwgQW5hbHlzaXNDb250cm9sRmFjdG9yeSBhY2Y7CisKKwkvKioKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICB0aGUgU1dUIHBhcmVudCBvZiB0aGUgY29udHJvbCB0aGF0IG1ha2VzIHVwIHRoZSB2aWV3ZXIKKwkgKiBAcGFyYW0gYWNmCisJICogICAgICAgICAgICB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgaW5zdGFuY2Ugb2Yge0BsaW5rIEFuYWx5c2lzQ29udHJvbH0KKwkgKi8KKwlwdWJsaWMgQW5hbHlzaXNWaWV3ZXIoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgQW5hbHlzaXNDb250cm9sRmFjdG9yeSBhY2YpIHsKKworCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQlmaW5hbCBGaWxsTGF5b3V0IGNvbXBvc2l0ZUxheW91dCA9IG5ldyBGaWxsTGF5b3V0KFNXVC5IT1JJWk9OVEFMKTsKKwkJY29tcG9zaXRlLnNldExheW91dChjb21wb3NpdGVMYXlvdXQpOworCisJCS8vIFJlbWVtYmVyIHRoZSBmYWN0b3J5IHRoYXQgd2UnbGwgdXNlIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2YKKwkJLy8gQW5hbHlzaXNDb250cm9sCisJCXRoaXMuYWNmID0gYWNmOworCQlyZWZyZXNoKCk7CisJCWNvbXBvc2l0ZS5wYWNrKCk7CisJCQorCX0gLy8gQW5hbHlzaXNWaWV3ZXIKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIjZ2V0Q29udHJvbCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKKwkJcmV0dXJuIGNvbXBvc2l0ZTsKKwl9IC8vIGdldENvbnRyb2wKKworCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyI3JlZnJlc2goKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7CisJCXBvcHVsYXRlVmlldygpOworCX0gLy8gcmVmcmVzaAorCisJCisJCisJCisJLyoqCisJICogQ3JlYXRlIGFuZCBkaXNwb3NlIG9mIE1hcENvbnRyb2xzIGFzIG5lY2Vzc2FyeSB0byBkaXNwbGF5IHRoZSBzZWxlY3RlZAorCSAqIFNpbXVsYXRpb25zLgorCSAqLworCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVZpZXcoKSB7CisJCQorCQkKKwkJLy8gcHJvYmxlbSBoZXJlIHdoZW4gd2Ugc3RhcnQgdXAKKwkJLy8gQXJlIHdlIGRvbmU/CisJCWlmIChjb21wb3NpdGUuaXNEaXNwb3NlZCgpKSB7CisJCQkvLyBZZXMKKwkJCXJldHVybjsKKwkJfSAvLyBpZgorCisJICAgCisJCWZpbmFsIEFuYWx5c2lzQ29udHJvbCBhbmFseXNpc0NvbnRyb2wgPSBhY2YuY3JlYXRlKGNvbXBvc2l0ZSk7CisJCisJCWFuYWx5c2lzQ29udHJvbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJCS8qKgorCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lciN3aWRnZXREaXNwb3NlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudCkKKwkJCSAqLworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQlmaW5hbCBEaXNwb3NlRXZlbnQgZSkgeworCQkJCWNvbXBvc2l0ZS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7CisJCQkJY29tcG9zaXRlLnJlZHJhdygpOworCQkJfQorCQl9KTsKKworCQljb21wb3NpdGUubGF5b3V0KHRydWUsIHRydWUpOworCQljb21wb3NpdGUucmVkcmF3KCk7CisJfSAvLyBwb3B1bGF0ZVZpZXcKKwkKKwkKKwkKKworCQorCisJCisKKwkKKwkvKioKKwkgKiBSZW1vdmVzIHdoaXRlc3BhY2UsICcsJywgJy4nLCBldGMuCisJICogQHBhcmFtIHMKKwkgKiBAcmV0dXJuIGEgZmlsdGVyZWQgc3RyaW5nCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUZpbHRlciAoU3RyaW5nIHMpIHsKKwkJU3RyaW5nIHMxID0gcy50cmltKCk7CisJCXMxID0gczEucmVwbGFjZSgnIicsJyAnKTsKKwkJczEgPSBzMS5yZXBsYWNlQWxsKCIgIiwiIik7CisJCXMxID0gczEucmVwbGFjZSgnLCcsJ18nKTsKKwkJczEgPSBzMS5yZXBsYWNlKCcuJywnXycpOworCQlzMSA9IHMxLnJlcGxhY2VBbGwoIl8iLCIiKTsKKwkJcyA9IHMxOworCQkKKwkJcmV0dXJuIHM7CisJfQorCisJCisJCisJCisKKwkvKioKKwkgKiBmaWx0ZXJzIHRoZSBsb2NhdGlvbiBpZCBwcmVmaXggZnJvbSB0aGUgYmVnaW5uaW5nIG9mCisJICogIGEgbm9kZXMgSUQgZm9yIGdlbmVyYXRpb24gb2YgYSBmaWxlIG5hbWUKKwkgKiBAcGFyYW0gdW5maWx0ZXJlZAorCSAqIEByZXR1cm4gdGhlIGZpbHRlcmVkIGZpbGUgbmFtZSB1c2luZyBsb2NhdGlvbiBpZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWx0ZXJGaWxlbmFtZShTdHJpbmcgdW5maWx0ZXJlZCkgeworCQlpbnQgbGFzdCA9IHVuZmlsdGVyZWQuaW5kZXhPZihVUklfUFJFRklYKTsKKwkJaWYgKGxhc3QgPj0wKSB7CisJCQlsYXN0ICs9IFVSSV9QUkVGSVgubGVuZ3RoKCk7CisJCQlyZXR1cm4gdW5maWx0ZXJlZC5zdWJzdHJpbmcobGFzdCwgdW5maWx0ZXJlZC5sZW5ndGgoKSk7CisJCX0gCisJCXJldHVybiB1bmZpbHRlcmVkOworCisJCisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciNnZXRJbnB1dCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbnB1dCgpIHsKKwkJLy8gbm90IHVzZWQKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciNzZXRJbnB1dChqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldElucHV0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgaW5wdXQpIHsKKwkJLy8gbm90IHVzZWQKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyI3NldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24sIGJvb2xlYW4pCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBJU2VsZWN0aW9uIHNlbGVjdGlvbiwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGJvb2xlYW4gcmV2ZWFsKSB7CisJCS8vIG5vdCB1c2VkCisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciNnZXRTZWxlY3Rpb24oKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKKwkJLy8gbm90IHVzZWQKKwkJcmV0dXJuIG51bGw7CisJfQorCisJCit9IC8vIEFuYWx5c2lzVmlld2VyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC92aWV3cy9BdXRvRXhwQ29udHJvbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvdmlld3MvQXV0b0V4cENvbnRyb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODI3NGFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvdmlld3MvQXV0b0V4cENvbnRyb2wuamF2YQpAQCAtMCwwICsxLDExNDggQEAKKy8vIEF1dG9FeHBDb250cm9sLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50LnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5Db2xvckRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuaW1wbC5Db2xvckRlZmluaXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC5BTEdPUklUSE1fU1RBVFVTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC5BdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXJFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQuRXJyb3JBbmFseXNpc0FsZ29yaXRobTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQuRXJyb3JBbmFseXNpc0FsZ29yaXRobUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC5FcnJvckFuYWx5c2lzQWxnb3JpdGhtTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50Lk1BTkFHRVJfU1RBVFVTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuSVNoYXJlZEltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBTV1QgR1VJIGNvbXBvbmVudCB0aGF0IHVzZXMgQklSVCB0byBwbG90CisgKi8KK3B1YmxpYyBjbGFzcyBBdXRvRXhwQ29udHJvbCBleHRlbmRzIEFuYWx5c2lzQ29udHJvbCB7CisJCisJCisJcHJpdmF0ZSBzdGF0aWMgRGlzcGxheSBkaXNwbGF5ID0gbnVsbDsKKwkKKwlwcml2YXRlIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IG51bGw7CisJCisJcHJpdmF0ZSBzdGF0aWMgQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXIgbWFuYWdlciA9IG51bGw7CisJCisJLyoqCisJICogRm9sZGVyIHRvIGNvbnRhaW4gdGhlIGRhdGEKKwkgKiAKKwkgKi8KKwlzdGF0aWMgQ1RhYkZvbGRlciB0YWJGb2xkZXI7CisJCisJc3RhdGljIGJvb2xlYW4gcGF1c2VUcmlnZ2VyID0gZmFsc2U7CisJCisJc3RhdGljIGRvdWJsZVtdIHJlZmVyZW5jZUluY2lkZW5jZTsKKwlzdGF0aWMgZG91YmxlW10gbW9kZWxJbmNpZGVuY2U7CisJCisJCisJLyoqCisJICogQSBsYWJlbCB0byByZXBvcnQgc3RhdHVzIChub3QgeWV0IHVzZWQpCisJICovCisJLy9zdGF0aWMgTGFiZWwgc3RhdHVzTGFiZWw7CisJCisJLyoqCisJICogc3RvcCBidXR0b24KKwkgKi8KKwkgQnV0dG9uIHN0b3BCdXR0b24gPSBudWxsOworCQorCSAvKioKKwkgICogcmVzdGFydCBidXR0b24KKwkgICovCisJIEJ1dHRvbiByZXN0YXJ0QnV0dG9uID0gbnVsbDsgCisJLyoqCisJICogQ29sb3JzIGZvciB0aGUgdGltZSBzZXJpZXMgY2hhcnQKKwkgKi8KKwlzdGF0aWMgZmluYWwgQ29sb3JEZWZpbml0aW9uIGZvcmVHcm91bmQgPSBDb2xvckRlZmluaXRpb25JbXBsLmNyZWF0ZSgxODAsIDAsIDApOworCXN0YXRpYyBmaW5hbCBDb2xvckRlZmluaXRpb24gYmFja2dyb3VuZEdyb3VuZCA9IENvbG9yRGVmaW5pdGlvbkltcGwuY3JlYXRlKDI1NSwgMjU1LCAyMjUpOworCXN0YXRpYyBmaW5hbCBDb2xvckRlZmluaXRpb24gZnJhbWVDb2xvciA9IENvbG9yRGVmaW5pdGlvbkltcGwuV0hJVEUoKTsKKwkKKwkvLyBzb21lIGNvbG9ycworCXByaXZhdGUgc3RhdGljIENvbG9yIGN5YW47CisJcHJpdmF0ZSBzdGF0aWMgQ29sb3IgY3lhbkRhcms7CisJcHJpdmF0ZSBzdGF0aWMgQ29sb3IgZGFya1JlZDsKKwlwcml2YXRlIHN0YXRpYyBDb2xvciB3aGl0ZTsKKwlwcml2YXRlIHN0YXRpYyBDb2xvciBsaWdodEdyZWVuOworCXByaXZhdGUgc3RhdGljIENvbG9yIGxpZ2h0Qmx1ZTsKKwkKKwkKKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFJ1bkhpc3RvcnlDYW52YXMgZXJyb3JDb252ZXJnZW5jZUJ5UnVuID0gbnVsbDsKKwlzdGF0aWMgZmluYWwgaW50IEVSUk9SX0NPTlZFUkdFTkNFX0JZX1JVTl9JRCA9IDA7CisJCisJcHJvdGVjdGVkIHN0YXRpYyBFcnJvclRpbWVTZXJpZXNDYW52YXMgY3VycmVudEVycm9yQnlUaW1lID0gbnVsbDsKKwlzdGF0aWMgZmluYWwgaW50IENVUlJFTlRfRVJST1JfQllfVElNRV9JRCA9IDE7CisJCisJcHJvdGVjdGVkIHN0YXRpYyBBZ2dyZWdhdGVUaW1lU2VyaWVzQ2FudmFzIGFnZ3JlZ2F0ZUVycm9yQnlUaW1lID0gbnVsbDsKKwlzdGF0aWMgZmluYWwgaW50IEFHR1JFR0FURV9CWV9USU1FX0lEID0gMjsKKworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTVJPV1MgPSAxMDsKKwkKKwkvL3Byb3RlY3RlZCBzdGF0aWMgQ29tcG9zaXRlIGNoYXJ0Q29tcG9zaXRlOworCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9zaXRlIGVycm9yVGltZVNlcmllc0NvbXBvc2l0ZTsKKwlwcm90ZWN0ZWQgc3RhdGljIENvbXBvc2l0ZSBhZ2dyZWdhdGVUaW1lU2VyaWVzQ29tcG9zaXRlOworCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9zaXRlIHJ1bkhpc3RvcnlDb21wb3NpdGU7CisJcHJvdGVjdGVkIHN0YXRpYyBDb21wb3NpdGUgdmFsdWVzQ29tcG9zaXRlOworCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9zaXRlIGNvbnRyb2xzQ29tcG9zaXRlOworCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9zaXRlIGNvbnRyb2xzQWN0aW9uQ29tcG9zaXRlOworCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9zaXRlIGNvbnRyb2xzVmFsdWVzQ29tcG9zaXRlOworCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9zaXRlIHNldHRpbmdzQ29tcG9zaXRlOworCQorCXByaXZhdGUgc3RhdGljIExpc3Q8RG91YmxlPiBlcnJvckhpc3RvcnlMaXN0ID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJcHJpdmF0ZSBzdGF0aWMgZG91YmxlW10gZXJyb3JIaXN0b3J5OworCXByaXZhdGUgc3RhdGljIGRvdWJsZVtdIGJlc3RTZXJpZXM7CisJcHJpdmF0ZSBzdGF0aWMgZG91YmxlIGJlc3RFcnJvciA9IERvdWJsZS5NQVhfVkFMVUU7CisJcHJpdmF0ZSBzdGF0aWMgZG91YmxlW10gbmV3RXJyb3JUaW1lU2VyaWVzOworCQorCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gcnVuUGFyYW1OYW1lczsKKwlwcm90ZWN0ZWQgc3RhdGljIGRvdWJsZVtdIGJlc3RQYXJhbVZhbHVlczsKKwkKKwlwcm90ZWN0ZWQgc3RhdGljIGRvdWJsZVtdW10gcmVjZW50UGFyYW1WYWx1ZXM7CisJcHJvdGVjdGVkIHN0YXRpYyBkb3VibGVbXSByZXN0YXJ0UGFyYW1WYWx1ZXM7CisJcHJvdGVjdGVkIHN0YXRpYyBkb3VibGVbXSByZWNlbnRFcnJvcnM7CisJCisJcHJvdGVjdGVkIHN0YXRpYyBDTGFiZWxbXSBhdHRyaWJ1dGVMYWJlbHM7CisJcHJvdGVjdGVkIHN0YXRpYyBDTGFiZWxbXSBjb250cm9sTGFiZWxzOworCXByb3RlY3RlZCBzdGF0aWMgVGV4dFtdIGJlc3RWYWx1ZUxhYmVsczsKKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRleHRbXVtdIHJlY2VudFZhbHVlTGFiZWxzOworCXByb3RlY3RlZCBzdGF0aWMgVGV4dFtdICAgcmVzdGFydFZhbHVlczsKKwkKKwlwcm90ZWN0ZWQgc3RhdGljIHNob3J0IHJvdyA9IDA7IC8vIHdoaWNoIHJvdyBhcmUgd2UgdXBkYXRpbmcKKwkKKwlwcm90ZWN0ZWQgc3RhdGljIHNob3J0IG51bUNvbHVtbnMgPSAwOworCQorCS8qKgorCSAqIHJlc3RhcnQgc2ltIHVzZXMgbGF0ZXN0IHZhbHMgb3IgYmVzdAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiByZXN0YXJ0V2l0aExhdGVzdD0gdHJ1ZTsKKwkKKwkvKioKKwkgKiBUaGUgZGlhbG9nIGZvciB0aGUgd2l6YXJkCisJICovCisJLy9zdGF0aWMgV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZzsJCisJCisJLy9Qcm9wZXJ0eVNlbGVjdG9yIHByb3BlcnR5U2VsZWN0b3I7CisJLy9MaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHNlbGVjdGVkUHJvcGVydGllczsKKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKi8KKwlwdWJsaWMgQXV0b0V4cENvbnRyb2woZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQsIFNXVC5Ob25lKTsKKwkJY3JlYXRlQ29udGVudHMoKTsKKwl9IC8vIEF1dG9FeHBDb250cm9sCisJCisJCisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBwbG90dGVyCisJICovCisJdm9pZCBjcmVhdGVDb250ZW50cygpIHsKKwkJCQkKKwkJLy8gU2V0IHRoZSBpbWFnZSByZWdpc3RyeQorCQlpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKSB7CisJCQlvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvciBhY3RpdmF0b3IgPSBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvci5nZXREZWZhdWx0KCk7CisJCQlpbWFnZVJlZ2lzdHJ5ID0gYWN0aXZhdG9yLmdldEltYWdlUmVnaXN0cnkoKTsKKwkJfQorCQkvLyBVc2UgZm9ybSBsYXlvdXQKKwkJc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOworCQlpZihkaXNwbGF5PT1udWxsKSBkaXNwbGF5ID0gdGhpcy5nZXREaXNwbGF5KCk7CisJCWN5YW4gPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9DWUFOKTsKKwkJY3lhbkRhcmsgPSBuZXcgQ29sb3IoZGlzcGxheSwgNjAsIDIyMCwgMjIwKTsKKwkJZGFya1JlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfUkVEKTsKKwkJd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSk7CisJCWxpZ2h0R3JlZW4gPSBuZXcgQ29sb3IoZGlzcGxheSwgMTI4LCAyNTUsIDEyOCk7CisJCWxpZ2h0Qmx1ZSA9IG5ldyBDb2xvcihkaXNwbGF5LCAxMjgsIDEyOCwgMjU1KTsKKwkJCisJCQorCQlpZGVudGlmaWFibGVUaXRsZSA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7CisJCWlkZW50aWZpYWJsZVRpdGxlLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJBVVRPLlRJVExFTEFCRUwiKSk7CisJCQorCQkKKwkJaW50IGJvdHRvbSA9IDU7CisJCWZpbmFsIEZvcm1EYXRhIHRpdGxlRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJaWRlbnRpZmlhYmxlVGl0bGUuc2V0TGF5b3V0RGF0YSh0aXRsZUZvcm1EYXRhKTsKKwkJdGl0bGVGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXRpdGxlRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGJvdHRvbSwgMCk7CisJCXRpdGxlRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJdGl0bGVGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQkKKwkJYm90dG9tICs9IDE7CisJCQorCQl0YWJGb2xkZXIgPSBuZXcgQ1RhYkZvbGRlcih0aGlzLCBTV1QuQk9SREVSKTsKKwkJLy8gc2V0IHVwIHRoZSB2YWx1ZXMgY29tcG9zaXRlCisJCXZhbHVlc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyLCBTV1QuQk9SREVSKTsKKwkJCisJCWZpbmFsIEZvcm1EYXRhIHRhYkZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCXRhYkZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQl0YWJGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJdGFiRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJdGFiRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJdGFiRm9sZGVyLnNldExheW91dERhdGEodGFiRm9ybURhdGEpOworCQl0YWJGb2xkZXIuc2V0U2ltcGxlKGZhbHNlKTsKKwkJCisJCQorCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uQmFja2dyb3VuZChuZXcgQ29sb3JbXXsKKwkJCQljeWFuLAorCQkJCXdoaXRlLAorCQkJCWxpZ2h0Qmx1ZSwKKwkJCQlsaWdodEJsdWV9LAorCQkJCW5ldyBpbnRbXSB7MjUsIDUwLCAxMDB9KTsgCisJCQorCisJCXRhYkZvbGRlci5zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7IAorCQkKKwkJdGFiRm9sZGVyLnNldEJhY2tncm91bmQoY3lhbkRhcmspOworCQl0YWJGb2xkZXIuc2V0Rm9yZWdyb3VuZChkYXJrUmVkKTsKKwkJdGFiRm9sZGVyLnNldEJvcmRlclZpc2libGUodHJ1ZSk7CisJCQorICAgICAgICAvLy8vLy8vLy8vLy8vCisJCS8vIFJVTiBISVNUT1JZCisJCUNUYWJJdGVtIGl0ZW0wID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULkJPUkRFUik7CisJCWl0ZW0wLnNldFRleHQgKCIgICIrTWVzc2FnZXMuZ2V0U3RyaW5nKCJBVVRPLkhJU1RPUlkiKSsiICIpOworCQlydW5IaXN0b3J5Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0YWJGb2xkZXIsIFNXVC5CT1JERVIpOworCQlydW5IaXN0b3J5Q29tcG9zaXRlLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKKyAJCWl0ZW0wLnNldENvbnRyb2wocnVuSGlzdG9yeUNvbXBvc2l0ZSk7CisgCQkvLyBzZXQgdXAgdGhlIGZvdXIgZGF0YSB0aW1lIHNlcmllcyBpbnNpZGUgdGhlIGNoYXJ0Q29tcG9zaXRlCisgCQlnZXRSdW5IaXN0b3J5Q2hhcnQocnVuSGlzdG9yeUNvbXBvc2l0ZSk7IAorIAkJCisgCQkvLy8vLy8vLy8vLy8vCisJCS8vIEFHR1JFR0FURSBUSU1FIFNFUklFUworIAkJQ1RhYkl0ZW0gaXRlbTEgPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuQk9SREVSKTsKKwkJaXRlbTEuc2V0VGV4dCAoIiAgIitNZXNzYWdlcy5nZXRTdHJpbmcoIkFVVE8uQUdHUkVHQVRFU0VSSUVTIikrIiAiKTsKKwkJYWdncmVnYXRlVGltZVNlcmllc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyLCBTV1QuQk9SREVSKTsKKwkJYWdncmVnYXRlVGltZVNlcmllc0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7CisgCQlpdGVtMS5zZXRDb250cm9sKGFnZ3JlZ2F0ZVRpbWVTZXJpZXNDb21wb3NpdGUpOworIAkJLy8gc2V0IHVwIHRoZSBmb3VyIGRhdGEgdGltZSBzZXJpZXMgaW5zaWRlIHRoZSBjaGFydENvbXBvc2l0ZQorIAkJZ2V0QWdncmVnYXRlVGltZVNlcmllc0NoYXJ0KGFnZ3JlZ2F0ZVRpbWVTZXJpZXNDb21wb3NpdGUpOyAKKyAJCQorIAkJLy8vLy8vLy8vLy8vLworCQkvLyBFUlJPUiBUSU1FIFNFUklFUworIAkJQ1RhYkl0ZW0gaXRlbTIgPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuQk9SREVSKTsKKwkJaXRlbTIuc2V0VGV4dCAoIiAgIitNZXNzYWdlcy5nZXRTdHJpbmcoIkFVVE8uRVJST1JTRVJJRVMiKSsiICIpOworCQllcnJvclRpbWVTZXJpZXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRhYkZvbGRlciwgU1dULkJPUkRFUik7CisJCWVycm9yVGltZVNlcmllc0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7CisgCQlpdGVtMi5zZXRDb250cm9sKGVycm9yVGltZVNlcmllc0NvbXBvc2l0ZSk7CisgCQkvLyBzZXQgdXAgdGhlIGZvdXIgZGF0YSB0aW1lIHNlcmllcyBpbnNpZGUgdGhlIGNoYXJ0Q29tcG9zaXRlCisgCQlnZXRFcnJvclRpbWVTZXJpZXNDaGFydChlcnJvclRpbWVTZXJpZXNDb21wb3NpdGUpOyAKKyAJCQorIAkJLy8vLy8vLy8vLy8vLy8KKyAJCS8vIFZBTFVFUworCQlDVGFiSXRlbSBpdGVtMyA9IG5ldyBDVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5CT1JERVIpOworCQlpdGVtMy5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiQVVUTy5WQUxVRVMiKSk7CisJCWl0ZW0zLnNldENvbnRyb2wodmFsdWVzQ29tcG9zaXRlKTsKKwkJCisJCS8vLy8vLy8vLy8vLy8vCisgCQkvLyBDb250cm9scworCQljb250cm9sc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyLCBTV1QuQk9SREVSKTsKKwkJZ2V0Q29udHJvbHMoKTsKKwkJQ1RhYkl0ZW0gaXRlbTQgPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuQk9SREVSKTsKKwkJaXRlbTQuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkFVVE8uQ09OVFJPTFMiKSk7CisJCWl0ZW00LnNldENvbnRyb2woY29udHJvbHNDb21wb3NpdGUpOworCQkKKwkJLy8vLy8vLy8vLy8vLy8KKyAJCS8vIFNldHRpbmdzCisvLwkJc2V0dGluZ3NDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRhYkZvbGRlciwgU1dULkJPUkRFUik7CisvLwkJZ2V0U2V0dGluZ3MoKTsKKy8vCQlDVGFiSXRlbSBpdGVtNCA9IG5ldyBDVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5CT1JERVIpOworLy8JCWl0ZW00LnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJBVVRPLlNFVFRJTkdTIikpOworLy8JCWl0ZW00LnNldENvbnRyb2woc2V0dGluZ3NDb21wb3NpdGUpOworCQkKKwkJCisJCQorCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKGl0ZW0wKTsKKwkJaWYobWFuYWdlcj09bnVsbCkgeworCQkJbWFuYWdlciA9IEF1dG9tYXRpY0V4cGVyaW1lbnRNYW5hZ2VyLmdldEluc3RhbmNlKCk7CisJCQltYW5hZ2VyLmFkZExpc3RlbmVyKG5ldyBBdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlckxpc3RlbmVyKCkgeworCQkJCQorCQkJCXB1YmxpYyB2b2lkIGV2ZW50UmVjZWl2ZWQoQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXJFdmVudCBldnQpIHsKKwkJCQkJaWYoZXZ0LnN0YXR1cyA9PSBNQU5BR0VSX1NUQVRVUy5TQ0hFRFVMRUQpIHsKKwkJCQkJCUVycm9yQW5hbHlzaXNBbGdvcml0aG0gYWxnID0gZXZ0LmFsZ29yaXRobTsKKwkJCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJQXV0b0V4cENvbnRyb2wudGhpcy5yZXNldCgpOworCQkJCQkJCQlBdXRvRXhwQ29udHJvbC50aGlzLnN0b3BCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKwkJCQkJCQkJcmVzdGFydEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQkJCQl9CisJCQkJCQl9KTsKKwkJCQkJCWFsZy5hZGRMaXN0ZW5lcihuZXcgRXJyb3JBbmFseXNpc0FsZ29yaXRobUxpc3RlbmVyKCkgeworCQkJCQkJCXB1YmxpYyB2b2lkIGV2ZW50UmVjZWl2ZWQoRXJyb3JBbmFseXNpc0FsZ29yaXRobUV2ZW50IGV2dCkgeworCQkJCQkJCQkJCQkJCQkJCQorCQkJCQkJCQlpZihldnQuc3RhdHVzID09IEFMR09SSVRITV9TVEFUVVMuU1RBUlRJTkdfU0lNVUxBVElPTikgeworCQkJCQkJCQkJLy8gc2V0IHRoZSBsYWJlbCBpbmZvCisJCQkJCQkJCQlydW5QYXJhbU5hbWVzID0gZXZ0LnBhcmFtZXRlck5hbWVzOworCQkJCQkJCQkJaWYocmVjZW50UGFyYW1WYWx1ZXMgPT0gbnVsbCkgeworCQkJCQkJCQkJCW51bUNvbHVtbnMgPSAoc2hvcnQpcnVuUGFyYW1OYW1lcy5sZW5ndGg7CisJCQkJCQkJCQkJcmVjZW50UGFyYW1WYWx1ZXMgPSBuZXcgZG91YmxlW05VTVJPV1NdW3J1blBhcmFtTmFtZXMubGVuZ3RoKzFdOworCQkJCQkJCQkJCXJlc3RhcnRQYXJhbVZhbHVlcyA9IG5ldyBkb3VibGVbcnVuUGFyYW1OYW1lcy5sZW5ndGhdOworCQkJCQkJCQkJCQorCQkJCQkJCQkJCXJlY2VudEVycm9ycyA9IG5ldyBkb3VibGVbTlVNUk9XU107CisJCQkJCQkJCQl9IAorCQkJCQkJCQkJCisJCQkJCQkJCQlpZihyb3cgPCBOVU1ST1dTKSB7CisJCQkJCQkJCQkJcmVjZW50UGFyYW1WYWx1ZXNbcm93XSA9IGNvcHlEb3VibGVBcnJheShldnQucGFyYW1ldGVyVmFsdWVzKTsKKwkJCQkJCQkJCQlyZWNlbnRFcnJvcnNbcm93KytdID0gLTE7IC8vIG5vdCBrbm93biB5ZXQKKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJLy8gV2UgbmVlZCB0byBzaGlmdCB1cAorCQkJCQkJCQkJCWZvcihpbnQgaT0wO2k8TlVNUk9XUy0xOysraSkgeworCQkJCQkJCQkJCQlmb3IoaW50IGo9MDtqPHJ1blBhcmFtTmFtZXMubGVuZ3RoOysraikgcmVjZW50UGFyYW1WYWx1ZXNbaV1bal0gPSByZWNlbnRQYXJhbVZhbHVlc1tpKzFdW2pdOworCQkJCQkJCQkJCQlyZWNlbnRFcnJvcnNbaV09cmVjZW50RXJyb3JzW2krMV07CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCXJlY2VudFBhcmFtVmFsdWVzW3Jvdy0xXSA9IGNvcHlEb3VibGVBcnJheShldnQucGFyYW1ldGVyVmFsdWVzKTsKKwkJCQkJCQkJCQlyZWNlbnRFcnJvcnNbcm93LTFdID0gLTE7IC8vIG5vdCBrbm93biB5ZXQKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCQorCQkJCQkJCQkJLy8gY29weSBhbGwgYnV0IHRoZSBlcnJvciAtIGl0IGlzIG5vdCBhIHBhcmFtZXRlcgorCQkJCQkJCQkJZm9yKGludCBpID0gMDsgaSA8IChyZXN0YXJ0UGFyYW1WYWx1ZXMubGVuZ3RoKTsgaSArKykgeworCQkJCQkJCQkJCWlmKHJlc3RhcnRXaXRoTGF0ZXN0KSB7CisJCQkJCQkJCQkJCWlmKHJlY2VudFBhcmFtVmFsdWVzIT1udWxsKSByZXN0YXJ0UGFyYW1WYWx1ZXNbaV0gPSByZWNlbnRQYXJhbVZhbHVlc1tyb3ctMV1baV07CisJCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQkJaWYoYmVzdFBhcmFtVmFsdWVzIT1udWxsKSByZXN0YXJ0UGFyYW1WYWx1ZXNbaV0gPSBiZXN0UGFyYW1WYWx1ZXNbaV07CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQorCQkJCQkJCQkJfQorCQkJCQkJCQkJCisJCQkJCQkJCQkvLyBBZGQgYSBSdW5uYWJsZSB0byB0aGUgVUkgdGhyZWFkJ3MgZXhlY3V0aW9uIHF1ZXVlIAorCQkJCQkJCQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7CisJCQkJCQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQkJCQkJLy8gWWVzCisJCQkJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJCQkJCWlmKCF2YWx1ZXNJbml0aWFsaXplZCkgeworCQkJCQkJCQkJCQkJCQlpbml0aWFsaXplVmFsdWVMYWJlbHMocnVuUGFyYW1OYW1lcyk7CisJCQkJCQkJCQkJCQkJCWluaXRpYWxpemVDb250cm9sTGFiZWxzKHJ1blBhcmFtTmFtZXMpOworCQkJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJCQl1cGRhdGVWYWx1ZUxhYmVscygpOworCQkJCQkJCQkJCQkJfSAvLyBydW4KKwkJCQkJCQkJCQkJfSk7IC8vIGRpc3BsYXkuYXN5bmNFeGVjCisJCQkJCQkJCQkJfSAvLyB0cnkKKwkJCQkJCQkJCQljYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJCQkJLy8gSWdub3JlIHRoZXJlIGNvdWxkIGJlIGEgcmFjZSBjb25kaXRpb24gd2l0aCB0aGUgZGlzcGxheSBiZWluZyBkaXNwb3NlZAorCQkJCQkJCQkJCX0gLy8gY2F0Y2ggRXhjZXB0aW9uCisJCQkJCQkJCQl9IC8vIGlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIAorCQkJCQkJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkJCQkJCQl9IGVsc2UgaWYoZXZ0LnN0YXR1cyA9PSBBTEdPUklUSE1fU1RBVFVTLkZJTklTSEVEX0FMR09SSVRITSkgeworCQkJCQkJCQkJLy8gVGhlIGFsZ29yaXRobSBoYXMgZmluaXNoZWQuIFNtYWxsZXN0IHZhbHVlIGluIAorCQkJCQkJCQkJLy9ldnQucmVzdWx0CisJCQkJCQkJCQkvLy8vLy8vLy8vLy8vLy8vLworCQkJCQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCQkJcmVzdGFydEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCQkJCQkJCQkJCQlzdG9wQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0pOworCQkJCQkJCQl9IGVsc2UgaWYoZXZ0LnN0YXR1cyA9PSBBTEdPUklUSE1fU1RBVFVTLkZJTklTSEVEX1NJTVVMQVRJT04pIHsKKwkJCQkJCQkJCS8vIE9uZSBzaW11bGF0aW9uIGlzIGRvbmUuIFRoZSByZXN1bHQgaXMgUkVBRFkgYW5kIHN0b3JlZCBpbiBldnQucmVzdWx0CisJCQkJCQkJCQlFcnJvclJlc3VsdCByZXN1bHQgPSBldnQucmVzdWx0OworCQkJCQkJCQkJZmluYWwgZG91YmxlIHBsb3R0YWJsZUVycm9yID0gcGxvdHRhYmxlRXJyb3IocmVzdWx0LmdldEVycm9yKCkpOworCQkJCQkJCQkJcmVjZW50RXJyb3JzW3Jvdy0xXSA9IGV2dC5yZXN1bHQuZ2V0RXJyb3IoKTsKKwkJCQkJCQkJCWlmKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQkJCQkJLy8gUGxvdCAxIGZyb20gcmVzdWx0LmdldEVycm9yKCkgKGtlZXAgYXBwZW5kaW5nKQorCQkJCQkJCQkJCWFwcGVuZExhdGVzdEVycm9yRGF0YShwbG90dGFibGVFcnJvcik7CisJCQkJCQkJCQkJLy8gUGxvdCAyIGZyb20gcmVzdWx0LmdldEVycm9yQnlUaW1lc3RlcCgpIChzYW1lIGFzIHdlIHNob3cgaW4gc2NlbmFyaW8gY29tcGFyaXNvbiB2aWV3KQorCQkJCQkJCQkJCXNldFJlY2VudFRpbWVTZXJpZXMocmVzdWx0LmdldEVycm9yKCksIHJlc3VsdC5nZXRFcnJvckJ5VGltZVN0ZXAoKSwgcmVzdWx0LmdldFJlZmVyZW5jZUJ5VGltZSgpLCByZXN1bHQuZ2V0TW9kZWxCeVRpbWUoKSApOworCQkJCQkJCQkJCQorCQkJCQkJCQkJCWlmKGJlc3RQYXJhbVZhbHVlcyA9PSBudWxsKSB7CisJCQkJCQkJCQkJCWJlc3RQYXJhbVZhbHVlcyA9IGNvcHlEb3VibGVBcnJheShyZWNlbnRQYXJhbVZhbHVlc1tyb3ctMV0pOworCQkJCQkJCQkJCQliZXN0RXJyb3IgPSByZXN1bHQuZ2V0RXJyb3IoKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCisJCQkJCQkJCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCQkJCQkJCQkJLy8gQWRkIGEgUnVubmFibGUgdG8gdGhlIFVJIHRocmVhZCdzIGV4ZWN1dGlvbiBxdWV1ZSAKKwkJCQkJCQkJCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKKwkJCQkJCQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQkJCQkJCS8vIFllcworCQkJCQkJCQkJCQl0cnkgeworCQkJCQkJCQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCQkJCQkJdXBkYXRlQ2hhcnRzKCk7CisJCQkJCQkJCQkJCQkJCXVwZGF0ZVZhbHVlTGFiZWxzKCk7CisJCQkJCQkJCQkJCQkJfSAvLyBydW4KKwkJCQkJCQkJCQkJCX0pOyAvLyBkaXNwbGF5LmFzeW5jRXhlYworCQkJCQkJCQkJCQl9IC8vIHRyeQorCQkJCQkJCQkJCQljYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJCQkJCS8vIElnbm9yZSB0aGVyZSBjb3VsZCBiZSBhIHJhY2UgY29uZGl0aW9uIHdpdGggdGhlIGRpc3BsYXkgYmVpbmcgZGlzcG9zZWQKKwkJCQkJCQkJCQkJfSAvLyBjYXRjaCBFeGNlcHRpb24KKwkJCQkJCQkJCQl9IC8vIGlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIAorCQkJCQkJCQkJfS8vIGlmKHJlc3VsdCAhPSBudWxsKQorCQkJCQkJCQl9IGVsc2UgaWYoZXZ0LnN0YXR1cyA9PSBBTEdPUklUSE1fU1RBVFVTLlJFU1RBUlRFRF9BTEdPUklUSE0pIHsKKwkJCQkJCQkJCS8vIFRoZSBhbGdvcml0aG0gaGFzIHJlc3RhcnRlZC4gU21hbGxlc3QgdmFsdWUgaW4gCisJCQkJCQkJCQkvLyBldnQucmVzdWx0CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCQkJCisJCX0vLyBpZihtYW5hZ2VyIG51bGwpCisJCQorCQkKKwkJdXBkYXRlQ2hhcnRzKCk7CisJCQorCX0gLy8gY3JlYXRlQ29udGVudHMKKwkKKwkvKioKKwkgKiBmaWx0ZXIgK3ZlLCAtdmUgaW5maW5pdHksIGV0YworCSAqIEBwYXJhbSBlcnJvcgorCSAqIEByZXR1cm4KKwkgKi8KKwlzdGF0aWMgZG91YmxlIHBsb3R0YWJsZUVycm9yKGRvdWJsZSBlcnJvcikgeworCQlpZigoZXJyb3I9PURvdWJsZS5QT1NJVElWRV9JTkZJTklUWSkKKwkJCQkJCQkJCQkJfHwoZXJyb3I9PURvdWJsZS5ORUdBVElWRV9JTkZJTklUWSkKKwkJCQkJCQkJCQkJfHxEb3VibGUuaXNOYU4oZXJyb3IpCisJCQkJCQkJCQkJCXx8KGVycm9yPT1Eb3VibGUuTUFYX1ZBTFVFKSkgeworCQkJcmV0dXJuIDEwMC4wOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCQkJCisJCQkJCisJfQorCQorCXByaXZhdGUgdm9pZCByZXNldCgpIHsKKwkJLy8gUmVzZXQgZXZlcnl0aGluZyBhdCB0aGUgYmVnaW5uaW5nIG9mIGFuIGF1dG9tYXRlZCBleHBlcmltZW50CisJCWVycm9ySGlzdG9yeSA9IG5ldyBkb3VibGVbMV07CisJCWVycm9ySGlzdG9yeVswXSA9IDA7CisJCQorCQluZXdFcnJvclRpbWVTZXJpZXMgPSBuZXcgZG91YmxlWzFdOworCQluZXdFcnJvclRpbWVTZXJpZXNbMF0gPSAwOworCQkKKwkJcmVmZXJlbmNlSW5jaWRlbmNlID0gbmV3IGRvdWJsZVsxXTsKKwkJcmVmZXJlbmNlSW5jaWRlbmNlWzBdID0gMDsKKwkJCisJCW1vZGVsSW5jaWRlbmNlID0gbmV3IGRvdWJsZVsxXTsKKwkJbW9kZWxJbmNpZGVuY2VbMF0gPSAwOworCQkKKwkJZXJyb3JDb252ZXJnZW5jZUJ5UnVuLnJlc2V0RGF0YSgpOworCQljdXJyZW50RXJyb3JCeVRpbWUucmVzZXREYXRhKCk7CisJCWFnZ3JlZ2F0ZUVycm9yQnlUaW1lLnJlc2V0RGF0YSgpOworCQkvL2Vycm9yQ29udmVyZ2VuY2VCeVJ1bi5jbGVhckRhdGEoKTsKKwkJLy9jdXJyZW50RXJyb3JCeVRpbWUuY2xlYXJEYXRhKCk7CisJCWVycm9ySGlzdG9yeUxpc3QgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCisJCWJlc3RTZXJpZXMgPSBudWxsOworCQliZXN0RXJyb3IgPSBEb3VibGUuTUFYX1ZBTFVFOworCQkKKwkJcnVuUGFyYW1OYW1lcyA9IG51bGw7CisJCWJlc3RQYXJhbVZhbHVlcyA9IG51bGw7CisJCXJlc3RhcnRQYXJhbVZhbHVlcyA9IG51bGw7CisJCXJlY2VudFBhcmFtVmFsdWVzID0gbnVsbDsKKwkJcmVjZW50RXJyb3JzID0gbnVsbDsKKwkJCisJCWlmKGF0dHJpYnV0ZUxhYmVscyAhPSBudWxsKQorCQkJZm9yKGludCBpPTA7aTxhdHRyaWJ1dGVMYWJlbHMubGVuZ3RoOysraSkgeworCQkJYXR0cmlidXRlTGFiZWxzW2ldLmRpc3Bvc2UoKTsKKwkJCWF0dHJpYnV0ZUxhYmVsc1tpXSA9IG51bGw7CisJCX0KKwkJYXR0cmlidXRlTGFiZWxzID0gbnVsbDsKKwkJaWYoYmVzdFZhbHVlTGFiZWxzICE9IG51bGwpIAorCQkJZm9yKGludCBpPTA7aTxiZXN0VmFsdWVMYWJlbHMubGVuZ3RoOysraSkgeworCQkJCWJlc3RWYWx1ZUxhYmVsc1tpXS5kaXNwb3NlKCk7CisJCQkJYmVzdFZhbHVlTGFiZWxzW2ldID0gbnVsbDsKKwkJCX0KKwkJYmVzdFZhbHVlTGFiZWxzID0gbnVsbDsKKwkJCisJCWlmKHJlY2VudFZhbHVlTGFiZWxzICE9IG51bGwpCisJCQlmb3IoaW50IGk9MDtpPHJlY2VudFZhbHVlTGFiZWxzLmxlbmd0aDsrK2kpCisJCQkJZm9yKGludCBqPTA7ajxyZWNlbnRWYWx1ZUxhYmVsc1tpXS5sZW5ndGg7KytqKSB7CisJCQkJCXJlY2VudFZhbHVlTGFiZWxzW2ldW2pdLmRpc3Bvc2UoKTsKKwkJCQkJcmVjZW50VmFsdWVMYWJlbHNbaV1bal0gPSBudWxsOworCQkJCX0KKwkJcmVjZW50VmFsdWVMYWJlbHMgPSBudWxsOworCQkKKwkJaWYoY29udHJvbExhYmVscyAhPSBudWxsKQorCQkJZm9yKENMYWJlbCBsYWI6Y29udHJvbExhYmVscykgbGFiLmRpc3Bvc2UoKTsgCisJCQorCQljb250cm9sTGFiZWxzID0gbnVsbDsKKwkJCisJCQorCQlpZihyZXN0YXJ0VmFsdWVzIT1udWxsKQorCQkJZm9yKFRleHQgdDpyZXN0YXJ0VmFsdWVzKSB0LmRpc3Bvc2UoKTsKKwkJCisJCXJvdyA9IDA7IAorCQludW1Db2x1bW5zID0gMDsKKwkJdmFsdWVzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKwl9CisJCisJLyoqCisJICogdXBkYXRlIHRoZSBncmFwaHMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlQ2hhcnRzKCkgeworCQllcnJvckNvbnZlcmdlbmNlQnlSdW4uZHJhdygpOworCQljdXJyZW50RXJyb3JCeVRpbWUuZHJhdygpOworCQlhZ2dyZWdhdGVFcnJvckJ5VGltZS5kcmF3KCk7CisJfQorCQorCS8qKgorCSAqIHJlZHJhdyB0aGUgZ3JhcGhzCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHJlZHJhd0NoYXJ0cygpIHsKKwkJZXJyb3JDb252ZXJnZW5jZUJ5UnVuLnJlZHJhdygpOworCQljdXJyZW50RXJyb3JCeVRpbWUucmVkcmF3KCk7CisJCWFnZ3JlZ2F0ZUVycm9yQnlUaW1lLnJlZHJhdygpOworCX0KKwkKKwkKKwkKKwkvKioKKwkgKiBzZXQgdXAgdGhlIHRpbWUgc2VyaWVzIGNoYXJ0CisJICogQHBhcmFtIGRhdGFDb21wb3NpdGUKKwkgKi8KKwlwcml2YXRlIHZvaWQgZ2V0RXJyb3JUaW1lU2VyaWVzQ2hhcnQoQ29tcG9zaXRlIGRhdGFDb21wb3NpdGUpIHsKKwkJCQkKKwkJLy8gY3VycmVudEVycm9yQnlUaW1lCisJCWN1cnJlbnRFcnJvckJ5VGltZSA9IG5ldyBFcnJvclRpbWVTZXJpZXNDYW52YXModGhpcyxkYXRhQ29tcG9zaXRlLAorCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiQVVUTy5USVRMRTIiKSwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkFVVE8uRVJST1IiKSwvLyB5IGF4aXMKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkFVVE8uVElNRSIpLC8vIHggYXhpcworCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiQVVUTy5USVRMRTIiKSwgLy9maXJzdCBwcm9wZXJ0eSAobGluZSBzZXJpZXMgbmFtZSkKKwkJCQlmb3JlR3JvdW5kLAorCQkJCWJhY2tncm91bmRHcm91bmQsCisJCQkJZnJhbWVDb2xvciwgQ1VSUkVOVF9FUlJPUl9CWV9USU1FX0lELCB0cnVlKTsKKwkJZmluYWwgRm9ybURhdGEgdGltZVNlcmllc0Zvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCWN1cnJlbnRFcnJvckJ5VGltZS5zZXRMYXlvdXREYXRhKHRpbWVTZXJpZXNGb3JtRGF0YSk7CisJCXRpbWVTZXJpZXNGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZGF0YUNvbXBvc2l0ZSwgMCk7CisJCXRpbWVTZXJpZXNGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJdGltZVNlcmllc0Zvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXRpbWVTZXJpZXNGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQkKKwkJY3VycmVudEVycm9yQnlUaW1lLnJlZHJhdygpOworCQkKKwl9Ly8gZ2V0RXJyb3JUaW1lU2VyaWVzCisJCisJLyoqCisJICogc2V0IHVwIHRoZSB0aW1lIHNlcmllcyBjaGFydAorCSAqIEBwYXJhbSBkYXRhQ29tcG9zaXRlCisJICovCisJcHJpdmF0ZSB2b2lkIGdldEFnZ3JlZ2F0ZVRpbWVTZXJpZXNDaGFydChDb21wb3NpdGUgZGF0YUNvbXBvc2l0ZSkgeworCQkJCQorCQkvLyBjdXJyZW50RXJyb3JCeVRpbWUKKwkJYWdncmVnYXRlRXJyb3JCeVRpbWUgPSBuZXcgQWdncmVnYXRlVGltZVNlcmllc0NhbnZhcyh0aGlzLGRhdGFDb21wb3NpdGUsCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJBVVRPLlRJVExFNCIpLAorCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiQVVUTy5JTkNJREVOQ0UiKSwvLyB5IGF4aXMKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkFVVE8uVElNRSIpLC8vIHggYXhpcworCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiQVVUTy5USVRMRTQiKSwgLy9maXJzdCBwcm9wZXJ0eSAobGluZSBzZXJpZXMgbmFtZSkKKwkJCQlmb3JlR3JvdW5kLAorCQkJCWJhY2tncm91bmRHcm91bmQsCisJCQkJZnJhbWVDb2xvciwgQUdHUkVHQVRFX0JZX1RJTUVfSUQsIHRydWUpOworCQlmaW5hbCBGb3JtRGF0YSB0aW1lU2VyaWVzRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJYWdncmVnYXRlRXJyb3JCeVRpbWUuc2V0TGF5b3V0RGF0YSh0aW1lU2VyaWVzRm9ybURhdGEpOworCQl0aW1lU2VyaWVzRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGRhdGFDb21wb3NpdGUsIDApOworCQl0aW1lU2VyaWVzRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCXRpbWVTZXJpZXNGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQl0aW1lU2VyaWVzRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJCisJCWFnZ3JlZ2F0ZUVycm9yQnlUaW1lLnJlZHJhdygpOworCQkKKwl9Ly8gZ2V0QWdncmVnYXRlVGltZVNlcmllcworCQorCQorCS8qKgorCSAqIHNldCB1cCB0aGUgcnVuIGhpc3RvcnkgY2hhcnRzCisJICogQHBhcmFtIGRhdGFDb21wb3NpdGUKKwkgKi8KKwlwcml2YXRlIHZvaWQgZ2V0UnVuSGlzdG9yeUNoYXJ0KENvbXBvc2l0ZSBkYXRhQ29tcG9zaXRlKSB7CisJCS8vIGVycm9yQ29udmVyZ2VuY2VCeVJ1bgorCQllcnJvckNvbnZlcmdlbmNlQnlSdW4gPSBuZXcgUnVuSGlzdG9yeUNhbnZhcyh0aGlzLGRhdGFDb21wb3NpdGUsCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJBVVRPLlRJVExFMSIpLAorCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiQVVUTy5FUlJPUiIpLCAvLyB5YXhpcworCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiQVVUTy5SVU4iKSwvLyB4IGF4aXMKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkFVVE8uVElUTEUxIiksIC8vIGZpcnN0IHByb3BlcnkgKGxpbmUgc2VyaWVzIG5hbWUpCisJCQkJZm9yZUdyb3VuZCwKKwkJCQliYWNrZ3JvdW5kR3JvdW5kLAorCQkJCWZyYW1lQ29sb3IsIEVSUk9SX0NPTlZFUkdFTkNFX0JZX1JVTl9JRCwgdHJ1ZSk7CisJCWZpbmFsIEZvcm1EYXRhIFRpbWVTZXJpZXMxRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJZXJyb3JDb252ZXJnZW5jZUJ5UnVuLnNldExheW91dERhdGEoVGltZVNlcmllczFGb3JtRGF0YSk7CisJCVRpbWVTZXJpZXMxRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGRhdGFDb21wb3NpdGUsIDApOworCQlUaW1lU2VyaWVzMUZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQlUaW1lU2VyaWVzMUZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCVRpbWVTZXJpZXMxRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJCisJCWVycm9yQ29udmVyZ2VuY2VCeVJ1bi5yZWRyYXcoKTsKKwkKKwl9Ly8gZ2V0RXF1YXRpb25TZXJpZXMKKwkKKwkKKwkvKioKKwkgKiBzZXQgdXAgdGhlIGNvbnRyb2xzCisJICogQHBhcmFtIGRhdGFDb21wb3NpdGUKKwkgKi8KKwlwcml2YXRlIHZvaWQgZ2V0Q29udHJvbHMoKSB7CisJCQorCQljb250cm9sc0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7CisJCQorCQlmaW5hbCBGb3JtRGF0YSBjb250cm9sVG9wRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJY29udHJvbHNBY3Rpb25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbnRyb2xzQ29tcG9zaXRlLFNXVC5CT1JERVIpOworCQljb250cm9sc0FjdGlvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGNvbnRyb2xUb3BGb3JtRGF0YSk7CisJCWNvbnRyb2xUb3BGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWNvbnRyb2xUb3BGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMjAsIDApOworCQljb250cm9sVG9wRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJY29udHJvbFRvcEZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCQorCQkKKwkJZmluYWwgRm9ybURhdGEgY29udHJvbEJvdHRvbUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCWNvbnRyb2xzVmFsdWVzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb250cm9sc0NvbXBvc2l0ZSxTV1QuQk9SREVSKTsKKwkJY29udHJvbHNWYWx1ZXNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShjb250cm9sQm90dG9tRm9ybURhdGEpOworCQljb250cm9sQm90dG9tRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbnRyb2xzQWN0aW9uQ29tcG9zaXRlLCAwKTsKKwkJY29udHJvbEJvdHRvbUZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQljb250cm9sQm90dG9tRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJY29udHJvbEJvdHRvbUZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCQorCQkKKwkJLy8gVXNlIGZvcm0gbGF5b3V0CisJCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDU7CisJCWdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKKwkJY29udHJvbHNBY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOworCQkKKy8vCQkvLyByb3cgMCBQQVVTRQorLy8JCS8vIGMxCisvLwkJQ0xhYmVsIHBhdXNlTGFiZWwgPSBuZXcgQ0xhYmVsKGNvbnRyb2xzQWN0aW9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisvLwkJcGF1c2VMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiQVVUTy5QQVVTRSIpKTsKKy8vCQkvLyBjMgorLy8JCUJ1dHRvbiBwYXVzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udHJvbHNBY3Rpb25Db21wb3NpdGUsIFNXVC5UT0dHTEUpOworLy8JCXBhdXNlQnV0dG9uLnNldEltYWdlKGltYWdlUmVnaXN0cnkuZ2V0KElTaGFyZWRJbWFnZXMuUEFVU0VfSUNPTikpOworLy8JCS8vIGMzCisvLwkJQ0xhYmVsIG5vTGFiZWxhID0gbmV3IENMYWJlbChjb250cm9sc0FjdGlvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOworLy8JCW5vTGFiZWxhLnNldFRleHQoIiIpOworLy8JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLwkJLy8gYzQKKy8vCQlDTGFiZWwgbm9MYWJlbGIgPSBuZXcgQ0xhYmVsKGNvbnRyb2xzQWN0aW9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisvLwkJbm9MYWJlbGIuc2V0VGV4dCgiIik7CisvLwkJLy8gYzUKKy8vCQlDTGFiZWwgbm9MYWJlbGMgPSBuZXcgQ0xhYmVsKGNvbnRyb2xzQWN0aW9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisvLwkJbm9MYWJlbGMuc2V0VGV4dCgiIik7CisJCQorCQkvLyByb3cgMQorCQkvLyBjMS4KKwkJQ0xhYmVsIHN0b3BMYWJlbCA9IG5ldyBDTGFiZWwoY29udHJvbHNBY3Rpb25Db21wb3NpdGUsIFNXVC5OT05FKTsKKwkJc3RvcExhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJBVVRPLlNUT1AiKSk7CisJCS8vIGMyCisJCXN0b3BCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRyb2xzQWN0aW9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7CisJCXN0b3BCdXR0b24uc2V0SW1hZ2UoaW1hZ2VSZWdpc3RyeS5nZXQoSVNoYXJlZEltYWdlcy5TVE9QX0lDT04pKTsKKwkJc3RvcEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsgLy8gd2UnbGwgZW5hYmxlIHdoZW4gYW4gZXhwZXJpbWVudCBpcyBzdGFydGVkCisJCS8vIGMzCisJCUNMYWJlbCBub0xhYmVsMSA9IG5ldyBDTGFiZWwoY29udHJvbHNBY3Rpb25Db21wb3NpdGUsIFNXVC5OT05FKTsKKwkJbm9MYWJlbDEuc2V0VGV4dCgiIik7CisJCQorCQlCdXR0b25bXSByYWRpb3MgPSBuZXcgQnV0dG9uWzJdOworCisJCXJhZGlvc1swXSA9IG5ldyBCdXR0b24oY29udHJvbHNBY3Rpb25Db21wb3NpdGUsIFNXVC5SQURJTyk7CisJICAgIHJhZGlvc1swXS5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJICAgIHJhZGlvc1swXS5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiQVVUTy5MQVRFU1QiKSk7CisJICAgIHJhZGlvc1swXS5zZXRCb3VuZHMoMTAsIDUsIDc1LCAzMCk7CisKKwkgICAgcmFkaW9zWzFdID0gbmV3IEJ1dHRvbihjb250cm9sc0FjdGlvbkNvbXBvc2l0ZSwgU1dULlJBRElPKTsKKwkgICAgcmFkaW9zWzFdLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJBVVRPLkJFU1QiKSk7CisJICAgIHJhZGlvc1sxXS5zZXRCb3VuZHMoMTAsIDMwLCA3NSwgMzApOworCSAgICByYWRpb3NbMF0uc2V0U2VsZWN0aW9uKHRydWUpOworCQkKKwkJCisJCQorCQkvLyByb3cgMgorCQkvLyBjMQorCQlDTGFiZWwgcmVzdGFydExhYmVsID0gbmV3IENMYWJlbChjb250cm9sc0FjdGlvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlyZXN0YXJ0TGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkFVVE8uUkVTVEFSVCIpKTsKKwkJLy8gYzIKKwkJcmVzdGFydEJ1dHRvbiA9IG5ldyBCdXR0b24oY29udHJvbHNBY3Rpb25Db21wb3NpdGUsIFNXVC5QVVNIKTsKKwkJcmVzdGFydEJ1dHRvbi5zZXRJbWFnZShpbWFnZVJlZ2lzdHJ5LmdldChJU2hhcmVkSW1hZ2VzLlJFU1RBUlRfSUNPTikpOworCQlyZXN0YXJ0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCQkvLyBjMworCQlDTGFiZWwgcGFyYW1zTGFiZWwgPSBuZXcgQ0xhYmVsKGNvbnRyb2xzQWN0aW9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCXBhcmFtc0xhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJBVVRPLlJFU1RBUlRfSEVBREVSIikpOworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLyBjNAorCQlDTGFiZWwgbm9MYWJlbDIgPSBuZXcgQ0xhYmVsKGNvbnRyb2xzQWN0aW9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCW5vTGFiZWwyLnNldFRleHQoIiIpOworCQkvLyBjNQorCQlDTGFiZWwgbm9MYWJlbDMgPSBuZXcgQ0xhYmVsKGNvbnRyb2xzQWN0aW9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCW5vTGFiZWwzLnNldFRleHQoIiIpOworCQkKKwkJCisJCQorCQkKKwkJLy8gQUNUSU9OUworLy8JCXBhdXNlQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKKy8vCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgeworLy8JCQkJc3dpdGNoIChlLnR5cGUpIHsKKy8vCQkJCWNhc2UgU1dULlNlbGVjdGlvbjoKKy8vCQkJCQkvLyB0b2dnbGUKKy8vCQkJCQlwYXVzZVRyaWdnZXIgPSAhcGF1c2VUcmlnZ2VyOworLy8JCQkJCWlmKHBhdXNlVHJpZ2dlcikgeworLy8JCQkJCQlBdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlci5wYXVzZSgpOworLy8JCQkJCX0gZWxzZSB7CisvLwkJCQkJCUF1dG9tYXRpY0V4cGVyaW1lbnRNYW5hZ2VyLmNvbnRpbnVlUnVuKCk7CisvLwkJCQkJfQorLy8JCQkJCQorLy8JCQkJCWJyZWFrOworLy8JCQkJfQorLy8JCQl9CisvLwkJfSk7CisJCQorCQlzdG9wQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKKwkJCQlzd2l0Y2ggKGUudHlwZSkgeworCQkJCWNhc2UgU1dULlNlbGVjdGlvbjoKKwkJCQkJc3RvcEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQkJQXV0b21hdGljRXhwZXJpbWVudE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5xdWl0Tm93KCk7CisJCQkJCXJlc3RhcnRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJCisJCXJlc3RhcnRCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgeworCQkJCXN3aXRjaCAoZS50eXBlKSB7CisJCQkJY2FzZSBTV1QuU2VsZWN0aW9uOgorCQkJCQlBdXRvbWF0aWNFeHBlcmltZW50TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlc3RhcnROb3cocmVzdGFydFBhcmFtVmFsdWVzKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJCisJCXJhZGlvc1swXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7CisJCQkJc3dpdGNoIChlLnR5cGUpIHsKKwkJCQljYXNlIFNXVC5TZWxlY3Rpb246CisJCQkJCXNlbGVjdExhdGVzdEFjdGlvbigpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0pOworCQlyYWRpb3NbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgeworCQkJCXN3aXRjaCAoZS50eXBlKSB7CisJCQkJY2FzZSBTV1QuU2VsZWN0aW9uOgorCQkJCQlzZWxlY3RCZXN0QWN0aW9uKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSk7CisKKwkJY29udHJvbHNDb21wb3NpdGUucGFjaygpOworCQljb250cm9sc0NvbXBvc2l0ZS5sYXlvdXQoKTsKKwkJY29udHJvbHNDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCisJfS8vIGdldENvbnRyb2xzCisJCisJCisJLyoqCisJICogc2V0IHVwIHRoZSBjb250cm9scworCSAqIEBwYXJhbSBkYXRhQ29tcG9zaXRlCisJICovCisJcHJpdmF0ZSB2b2lkIGdldFNldHRpbmdzKCkgeworCQkKKwkJc2V0dGluZ3NDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOworCQkKKwkJCisJCXNldHRpbmdzQ29tcG9zaXRlLnBhY2soKTsKKwkJc2V0dGluZ3NDb21wb3NpdGUubGF5b3V0KCk7CisJCXNldHRpbmdzQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7CisJCQorCX0vLyBnZXRTRVRUSU5HUworCQorCQorCQorCQorCQorCQorCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgc2VsZWN0TGF0ZXN0QWN0aW9uKCkgeworCQlyZXN0YXJ0V2l0aExhdGVzdCA9IHRydWU7CisJCWlmKGJlc3RQYXJhbVZhbHVlcyE9bnVsbCkgeworCQkJZm9yKGludCBpID0gMDsgaSA8IChiZXN0UGFyYW1WYWx1ZXMubGVuZ3RoKSAtMTsgaSArKykgeworCQkJCWlmKHJlY2VudFBhcmFtVmFsdWVzIT1udWxsKSByZXN0YXJ0UGFyYW1WYWx1ZXNbaV0gPSByZWNlbnRQYXJhbVZhbHVlc1tyb3ctMV1baV07CisJCQl9CisJCX0KKwkJdXBkYXRlUmVzdGFydExhYmVscyh3aGl0ZSk7CisJfSAvLyBzZWxlY3QgbGF0ZXN0CisJCisJCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZWxlY3RCZXN0QWN0aW9uKCkgeworCQlyZXN0YXJ0V2l0aExhdGVzdCA9IGZhbHNlOworCQlpZihiZXN0UGFyYW1WYWx1ZXMgIT0gbnVsbCkgeworCQkJZm9yKGludCBpID0gMDsgaSA8IChiZXN0UGFyYW1WYWx1ZXMubGVuZ3RoKSAtMTsgaSArKykgeworCQkJCXJlc3RhcnRQYXJhbVZhbHVlc1tpXSA9IGJlc3RQYXJhbVZhbHVlc1tpXTsKKwkJCX0KKwkJfQorCQl1cGRhdGVSZXN0YXJ0TGFiZWxzKGxpZ2h0R3JlZW4pOworCX0vLyBzZWxlY3QgYmVzdAorCQorCQorCS8qKgorCSAqIHNldCB1cCB0aGUgZm91ciBkYXRhIHRpbWUgc2VyaWVzIGNoYXJ0cworCSAqIEBwYXJhbSBkYXRhQ29tcG9zaXRlCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHVwZGF0ZVZhbHVlTGFiZWxzKCkgeworCQlpZihiZXN0UGFyYW1WYWx1ZXMgIT0gbnVsbCkgeworCQkJZm9yKGludCBpPTA7aTxudW1Db2x1bW5zOysraSkKKwkJCQliZXN0VmFsdWVMYWJlbHNbaV0uc2V0VGV4dChiZXN0UGFyYW1WYWx1ZXNbaV0rIiIpOworCQkJCisJCQliZXN0VmFsdWVMYWJlbHNbbnVtQ29sdW1uc10uc2V0VGV4dChiZXN0RXJyb3IrIiIpOworCQl9CisJCWZvcihpbnQgaSA9IDA7IGkgPCBOVU1ST1dTOyArK2kpIAorCQkJZm9yKGludCBqPTA7ajxudW1Db2x1bW5zKzE7KytqKSB7CisJCQkJaWYoajwgbnVtQ29sdW1ucykKKwkJCQkJcmVjZW50VmFsdWVMYWJlbHNbaV1bal0uc2V0VGV4dChyZWNlbnRQYXJhbVZhbHVlc1tpXVtqXSsiIik7CisJCQkJZWxzZSBpZihyZWNlbnRFcnJvcnNbaV0hPS0xKQorCQkJCQlyZWNlbnRWYWx1ZUxhYmVsc1tpXVtqXS5zZXRUZXh0KHJlY2VudEVycm9yc1tpXSsiIik7CQkJCisJCQkJZWxzZSByZWNlbnRWYWx1ZUxhYmVsc1tpXVtqXS5zZXRUZXh0KCIuLi4iKTsKKwkJfQorCQkKKwkJdmFsdWVzQ29tcG9zaXRlLnJlZHJhdygpOworCQl2YWx1ZXNDb21wb3NpdGUudXBkYXRlKCk7CisJCQorCQlpZihyZXN0YXJ0UGFyYW1WYWx1ZXMhPW51bGwpIHsKKwkJCWZvcihpbnQgaj0wO2o8bnVtQ29sdW1uczsrK2opIHsKKwkJCQlyZXN0YXJ0VmFsdWVzW2pdLnNldFRleHQocmVzdGFydFBhcmFtVmFsdWVzW2pdKyIiKTsKKwkJCQl9CisJCQljb250cm9sc1ZhbHVlc0NvbXBvc2l0ZS5yZWRyYXcoKTsKKwkJCWNvbnRyb2xzVmFsdWVzQ29tcG9zaXRlLnVwZGF0ZSgpOworCQl9CisJCisJfS8vIHVwZGF0ZVZhbHVlTGFiZWxzCisJCisJLyoqCisJICogY2FsbGVkIGJ5IHJhZGlvIGJ1dHRvbiBhY3Rpb24KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgdXBkYXRlUmVzdGFydExhYmVscyhmaW5hbCBDb2xvciBiZykgeworCQl0cnkgeworCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJaWYocmVzdGFydFBhcmFtVmFsdWVzIT1udWxsKSB7CisJCQkJCQlmb3IoaW50IGo9MDtqPG51bUNvbHVtbnM7KytqKSB7CisJCQkJCQkJcmVzdGFydFZhbHVlc1tqXS5zZXRUZXh0KHJlc3RhcnRQYXJhbVZhbHVlc1tqXSsiIik7CisJCQkJCQkJcmVzdGFydFZhbHVlc1tqXS5zZXRCYWNrZ3JvdW5kKGJnKTsKKwkJCQkJCQl9CisJCQkJCQljb250cm9sc1ZhbHVlc0NvbXBvc2l0ZS5yZWRyYXcoKTsKKwkJCQkJCWNvbnRyb2xzVmFsdWVzQ29tcG9zaXRlLnVwZGF0ZSgpOworCQkJCQl9CisJCQkJfSAvLyBydW4KKwkJCX0pOyAvLyBkaXNwbGF5LmFzeW5jRXhlYworCQl9IC8vIHRyeQorCQljYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElnbm9yZSB0aGVyZSBjb3VsZCBiZSBhIHJhY2UgY29uZGl0aW9uIHdpdGggdGhlIGRpc3BsYXkgYmVpbmcgZGlzcG9zZWQKKwkJfSAvLyBjYXRjaCBFeGNlcHRpb24KKwl9CisJCisJc3RhdGljIGJvb2xlYW4gdmFsdWVzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gYXR0cmlidXRlcworCSAqIEBwYXJhbSBpbml0aWFsVmFsdWVzCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGluaXRpYWxpemVWYWx1ZUxhYmVscyhTdHJpbmdbXSBhdHRyaWJ1dGVzKSB7CisJCQorCQlpbnQgbnVtQXR0ckVudHJpZXMgPSBhdHRyaWJ1dGVzLmxlbmd0aDsKKwkJaW50IG51bUNvbHVtbnMgPSBudW1BdHRyRW50cmllczsKKworCQkvLyBVc2UgZm9ybSBsYXlvdXQKKwkJR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWdsLm51bUNvbHVtbnMgPSBudW1Db2x1bW5zKzE7CisJCXZhbHVlc0NvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOworCQljb250cm9sc1ZhbHVlc0NvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOworCQlpbnQgd2lkdGggPSA4MDAvbnVtQ29sdW1uczsKKwkJCisJCWF0dHJpYnV0ZUxhYmVscyA9IG5ldyBDTGFiZWxbbnVtQ29sdW1ucysxXTsKKwkJYmVzdFZhbHVlTGFiZWxzID0gbmV3IFRleHRbbnVtQ29sdW1ucysxXTsKKwkJcmVjZW50VmFsdWVMYWJlbHMgPSBuZXcgVGV4dFtOVU1ST1dTXVtudW1Db2x1bW5zKzFdOworCQkKKwkJCWZvcihpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpICsrKSB7CisJCQkJYXR0cmlidXRlTGFiZWxzW2ldID0gbmV3IENMYWJlbCh2YWx1ZXNDb21wb3NpdGUsIFNXVC5CT1JERVIpOworCQkJCWF0dHJpYnV0ZUxhYmVsc1tpXS5zZXRUZXh0KGF0dHJpYnV0ZXNbaV0pOworCQkJCWF0dHJpYnV0ZUxhYmVsc1tpXS5zZXRCYWNrZ3JvdW5kKGN5YW4pOworCQkJCWZpbmFsIEdyaWREYXRhIHRpdGxlR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJCQlhdHRyaWJ1dGVMYWJlbHNbaV0uc2V0TGF5b3V0RGF0YSh0aXRsZUdyaWREYXRhKTsKKwkJCSAgICB0aXRsZUdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9dHJ1ZTsKKwkJCSAgICB0aXRsZUdyaWREYXRhLm1pbmltdW1XaWR0aD13aWR0aDsKKwkJCSAgICB0aXRsZUdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJfQorCQkJYXR0cmlidXRlTGFiZWxzW251bUNvbHVtbnNdID0gbmV3IENMYWJlbCh2YWx1ZXNDb21wb3NpdGUsIFNXVC5CT1JERVIpOworCQkJYXR0cmlidXRlTGFiZWxzW251bUNvbHVtbnNdLnNldFRleHQoIkVycm9yIik7CisJCQlhdHRyaWJ1dGVMYWJlbHNbbnVtQ29sdW1uc10uc2V0QmFja2dyb3VuZChjeWFuKTsKKwkJCWZpbmFsIEdyaWREYXRhIHRpdGxlR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJCWF0dHJpYnV0ZUxhYmVsc1tudW1Db2x1bW5zXS5zZXRMYXlvdXREYXRhKHRpdGxlR3JpZERhdGEpOworCQkgICAgdGl0bGVHcmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPXRydWU7CisJCSAgICB0aXRsZUdyaWREYXRhLm1pbmltdW1XaWR0aD13aWR0aDsKKwkJICAgIHRpdGxlR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkKKwkJCWZvcihpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zKzE7IGkgKyspIHsKKwkJCQliZXN0VmFsdWVMYWJlbHNbaV0gPSBuZXcgVGV4dCh2YWx1ZXNDb21wb3NpdGUsIFNXVC5CT1JERVIpOworCQkJCWJlc3RWYWx1ZUxhYmVsc1tpXS5zZXRUZXh0KCIiKTsgLy8gbm90aGluZyB5ZXQKKwkJCQliZXN0VmFsdWVMYWJlbHNbaV0uc2V0QmFja2dyb3VuZChsaWdodEdyZWVuKTsgCisJCQkJZmluYWwgR3JpZERhdGEgdGV4dEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCQkJYmVzdFZhbHVlTGFiZWxzW2ldLnNldExheW91dERhdGEodGV4dEdyaWREYXRhKTsKKwkJCSAgICB0ZXh0R3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT10cnVlOworCQkJICAgIHRleHRHcmlkRGF0YS5taW5pbXVtV2lkdGg9d2lkdGg7CisJCQkgICAgdGV4dEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJfQorCQkJCisJCQlmb3IoaW50IGk9MDtpPE5VTVJPV1M7KytpKQorCQkJCWZvcihpbnQgaj0wO2o8bnVtQ29sdW1ucysxOysraikgeworCQkJCQlyZWNlbnRWYWx1ZUxhYmVsc1tpXVtqXSA9IG5ldyBUZXh0KHZhbHVlc0NvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJCQkJCXJlY2VudFZhbHVlTGFiZWxzW2ldW2pdLnNldFRleHQoIiIpOyAvLyBub3RoaW5nIHlldAorCQkJCQlyZWNlbnRWYWx1ZUxhYmVsc1tpXVtqXS5zZXRCYWNrZ3JvdW5kKHdoaXRlKTsKKwkJCQkJZmluYWwgR3JpZERhdGEgdGV4dEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCQkJCXJlY2VudFZhbHVlTGFiZWxzW2ldW2pdLnNldExheW91dERhdGEodGV4dEdyaWREYXRhKTsKKwkJCQkgICAgdGV4dEdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9dHJ1ZTsKKwkJCQkgICAgdGV4dEdyaWREYXRhLm1pbmltdW1XaWR0aD13aWR0aDsKKwkJCQkgICAgdGV4dEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJCX0JCisJCSAKKwkJdmFsdWVzQ29tcG9zaXRlLmxheW91dCgpOworCQkvL3ZhbHVlc0NvbXBvc2l0ZS5wYWNrKCk7CisJCS8vdmFsdWVzQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7CisJCXZhbHVlc0NvbXBvc2l0ZS5yZWRyYXcoKTsKKwkJdmFsdWVzSW5pdGlhbGl6ZWQgPSB0cnVlOworCQorCX0vLyBpbml0aWFsaXplVmFsdWVMYWJlbHMKKwkKKwkKKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCisJICogQHBhcmFtIGluaXRpYWxWYWx1ZXMKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZUNvbnRyb2xMYWJlbHMoU3RyaW5nW10gYXR0cmlidXRlcykgeworCQkKKwkJaW50IG51bUF0dHJFbnRyaWVzID0gYXR0cmlidXRlcy5sZW5ndGg7CisJCWludCBudW1Db2x1bW5zID0gbnVtQXR0ckVudHJpZXM7CisKKwkJLy8gVXNlIGZvcm0gbGF5b3V0CisJCUdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOworCQlnbC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKKwkJCisJCWNvbnRyb2xzVmFsdWVzQ29tcG9zaXRlLnNldExheW91dChnbCk7CisJCWludCB3aWR0aCA9IDgwMC9udW1Db2x1bW5zOworCQkKKwkJY29udHJvbExhYmVscyA9IG5ldyBDTGFiZWxbbnVtQ29sdW1uc107CisJCXJlc3RhcnRWYWx1ZXMgPSBuZXcgVGV4dFtudW1Db2x1bW5zXTsKKwkJCisJCQlmb3IoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSArKykgeworCQkJCWNvbnRyb2xMYWJlbHNbaV0gPSBuZXcgQ0xhYmVsKGNvbnRyb2xzVmFsdWVzQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKKwkJCQljb250cm9sTGFiZWxzW2ldLnNldFRleHQoYXR0cmlidXRlc1tpXSk7CisJCQkJY29udHJvbExhYmVsc1tpXS5zZXRCYWNrZ3JvdW5kKGN5YW4pOworCQkJCWZpbmFsIEdyaWREYXRhIHRpdGxlR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJCQljb250cm9sTGFiZWxzW2ldLnNldExheW91dERhdGEodGl0bGVHcmlkRGF0YSk7CisJCQkgICAgdGl0bGVHcmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPXRydWU7CisJCQkgICAgdGl0bGVHcmlkRGF0YS5taW5pbXVtV2lkdGg9d2lkdGg7CisJCQkgICAgdGl0bGVHcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJCX0KKwkJCisJCQlmaW5hbCBHcmlkRGF0YSB0aXRsZUdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCQkKKwkJICAgIHRpdGxlR3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT10cnVlOworCQkgICAgdGl0bGVHcmlkRGF0YS5taW5pbXVtV2lkdGg9d2lkdGg7CisJCSAgICB0aXRsZUdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJCisJCQlmb3IoaW50IGo9MDtqPG51bUNvbHVtbnM7KytqKSB7CisJCQkJcmVzdGFydFZhbHVlc1tqXSA9IG5ldyBUZXh0KGNvbnRyb2xzVmFsdWVzQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKKwkJCQlyZXN0YXJ0VmFsdWVzW2pdLnNldFRleHQoIiIpOyAvLyBub3RoaW5nIHlldAorCQkJCXJlc3RhcnRWYWx1ZXNbal0uc2V0QmFja2dyb3VuZCh3aGl0ZSk7CisJCQkJZmluYWwgR3JpZERhdGEgdGV4dEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCQkJcmVzdGFydFZhbHVlc1tqXS5zZXRMYXlvdXREYXRhKHRleHRHcmlkRGF0YSk7CisJCQkgICAgdGV4dEdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9dHJ1ZTsKKwkJCSAgICB0ZXh0R3JpZERhdGEubWluaW11bVdpZHRoPXdpZHRoOworCQkJICAgIHRleHRHcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJCX0JCisJCSAKKwkJY29udHJvbHNWYWx1ZXNDb21wb3NpdGUubGF5b3V0KCk7CisJCWNvbnRyb2xzVmFsdWVzQ29tcG9zaXRlLnJlZHJhdygpOworCQl2YWx1ZXNJbml0aWFsaXplZCA9IHRydWU7CisJCisJfS8vIGluaXRpYWxpemVDb250cm9sTGFiZWxzCisJCisJCisJCisJCisJCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkJCQkJCisJCXN1cGVyLmRpc3Bvc2UoKTsKKwkJCisJfSAvLyBkaXNwb3NlCisKKwkKKwkvKioKKwkgKiBub3QgdXNlZAorCSAqIEByZXR1cm4gbnVsbAorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGUgZ2V0SWRlbnRpZmlhYmxlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkKKworCS8qKgorCSAqIGdldCB0aGUgdmFsdWUgZm9yIHBsb3R0aW5nCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuQW5hbHlzaXNDb250cm9sI2dldFZhbHVlcyhpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgZG91YmxlW10gZ2V0VmFsdWVzKGludCBjaGFydEluZGV4LCBpbnQgc3RhdGUpIHsKKwkJCisJCWlmKGNoYXJ0SW5kZXggPT0gMCkgcmV0dXJuIGVycm9ySGlzdG9yeTsKKwkJaWYoY2hhcnRJbmRleCA9PSAxKSB7CisJCQlpZihzdGF0ZT09MCkgcmV0dXJuIG5ld0Vycm9yVGltZVNlcmllczsKKwkJCWlmKHN0YXRlPT0xKSByZXR1cm4gYmVzdFNlcmllczsKKwkJfQorCQlpZihjaGFydEluZGV4ID09IDIpIHsKKwkJCWlmKHN0YXRlPT0wKSByZXR1cm4gcmVmZXJlbmNlSW5jaWRlbmNlOworCQkJaWYoc3RhdGU9PTEpIHJldHVybiBtb2RlbEluY2lkZW5jZTsKKwkJfQorCQkvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBOb3QgdXNlZAorCSAqIEBwYXJhbSBjaGFydEluZGV4IG5vdCB1c2VkIChvbmx5IG9uZSBjaGFydCkKKwkgKiBAcGFyYW0gc3RhdGUKKwkgKiBAcmV0dXJuIHByb3BlcnR5IG5hbWUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KGludCBjaGFydEluZGV4LCBpbnQgc3RhdGUpIHsKKwkJaWYoY2hhcnRJbmRleD09MCkgcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiQVVUTy5USVRMRTEiKTsKKwkJaWYoY2hhcnRJbmRleD09MSkgeworCQkJaWYoc3RhdGU9PTApIHJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIkFVVE8uVElUTEUyIik7CisJCQlpZihzdGF0ZT09MSkgcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiQVVUTy5USVRMRTMiKTsKKwkJfQorCQlpZihjaGFydEluZGV4PT0yKSB7CisJCQlpZihzdGF0ZT09MCkgcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiQVVUTy5USVRMRTQiKTsKKwkJCWlmKHN0YXRlPT0xKSByZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJBVVRPLlRJVExFNSIpOworCQl9CisJCXJldHVybiAgTWVzc2FnZXMuZ2V0U3RyaW5nKCJBVVRPLk5PVEZPVU5ERVJST1IiKTsKKwl9CisJCisJCisJCisJCisJCisJLyoqCisJICogTm90IHVzZWQKKwkgKiBAcGFyYW0gY2hhcnRJbmRleCBub3QgdXNlZCAob25seSBvbmUgY2hhcnQpCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHByb3BlcnRpZXMsIG9ubHkgb25lCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuQW5hbHlzaXNDb250cm9sI2dldE51bVByb3BlcnRpZXMoaW50IGNoYXJ0SW5kZXgpCisJICovCisJcHVibGljIGludCBnZXROdW1Qcm9wZXJ0aWVzKGludCBjaGFydEluZGV4KSB7CisJCWlmKGNoYXJ0SW5kZXg9PUVSUk9SX0NPTlZFUkdFTkNFX0JZX1JVTl9JRCkgcmV0dXJuIDE7IC8vIG9uZSB0aGluZyB0byBjaGFydAorCQlpZihjaGFydEluZGV4PT1DVVJSRU5UX0VSUk9SX0JZX1RJTUVfSUQpIHJldHVybiAyOyAvLyB0d28gdGhpbmdzIHRvIGNoYXJ0CisJCWlmKGNoYXJ0SW5kZXg9PUFHR1JFR0FURV9CWV9USU1FX0lEKSByZXR1cm4gMjsgLy8gdHdvIHRoaW5ncyB0byBjaGFydAorCQlyZXR1cm4gMDsgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgorCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBlcnJvcgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBlbmRMYXRlc3RFcnJvckRhdGEoZG91YmxlIGVycm9yKSB7CisJCWVycm9ySGlzdG9yeUxpc3QuYWRkKG5ldyBEb3VibGUoZXJyb3IpKTsKKwkJZXJyb3JIaXN0b3J5ID0gbmV3IGRvdWJsZVtlcnJvckhpc3RvcnlMaXN0LnNpemUoKV07CisJCWZvcihpbnQgaSA9IDA7IGkgPCBlcnJvckhpc3RvcnlMaXN0LnNpemUoKTsgaSArKykgeworCQkJZXJyb3JIaXN0b3J5W2ldID0gZXJyb3JIaXN0b3J5TGlzdC5nZXQoaSkuZG91YmxlVmFsdWUoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBlcnJvcgorCSAqIEBwYXJhbSBlcnJvckJ5VGltZVN0ZXAKKwkgKiBAcGFyYW0gcmVmSW5jaWRlbmNlCisJICogQHBhcmFtIGJlc3RJbmNpZGVuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVjZW50VGltZVNlcmllcyhkb3VibGUgZXJyb3IsIEVMaXN0PERvdWJsZT4gZXJyb3JCeVRpbWVTdGVwLCBFTGlzdDxEb3VibGU+IHJlZkluY2lkZW5jZSwgRUxpc3Q8RG91YmxlPiBpbmNpZGVuY2UpIHsKKwkJbmV3RXJyb3JUaW1lU2VyaWVzID0gbmV3IGRvdWJsZVtlcnJvckJ5VGltZVN0ZXAuc2l6ZSgpXTsKKwkJcmVmZXJlbmNlSW5jaWRlbmNlID0gbmV3IGRvdWJsZVtyZWZJbmNpZGVuY2Uuc2l6ZSgpXTsKKwkJbW9kZWxJbmNpZGVuY2UgPSBuZXcgZG91YmxlW2luY2lkZW5jZS5zaXplKCldOworCQlmb3IoaW50IGkgPSAwOyBpIDwgZXJyb3JCeVRpbWVTdGVwLnNpemUoKTsgaSArKykgeyAKKwkJCW5ld0Vycm9yVGltZVNlcmllc1tpXSA9IGVycm9yQnlUaW1lU3RlcC5nZXQoaSkuZG91YmxlVmFsdWUoKTsKKwkJCXJlZmVyZW5jZUluY2lkZW5jZVtpXSA9IHJlZkluY2lkZW5jZS5nZXQoaSkuZG91YmxlVmFsdWUoKTsKKwkJCW1vZGVsSW5jaWRlbmNlW2ldID0gaW5jaWRlbmNlLmdldChpKS5kb3VibGVWYWx1ZSgpOworCQl9CisJCWlmKGJlc3RTZXJpZXM9PW51bGwpIGJlc3RTZXJpZXMgPSBuZXdFcnJvclRpbWVTZXJpZXM7CisJCWlmKGVycm9yIDw9IGJlc3RFcnJvcikgeworCQkJYmVzdEVycm9yID0gZXJyb3I7CisJCQliZXN0U2VyaWVzID0gbmV3RXJyb3JUaW1lU2VyaWVzOworCQkJYmVzdFBhcmFtVmFsdWVzID0gY29weURvdWJsZUFycmF5KHJlY2VudFBhcmFtVmFsdWVzW3Jvdy0xXSk7CisJCX0KKwkJCisJCQorCX0KKworCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSGVhZGVyKFN0cmluZyBmb2xkZXJOYW1lKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCisJfQorCisKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCX0KKwkJCisJcHJvdGVjdGVkIHN0YXRpYyBkb3VibGUgW10gY29weURvdWJsZUFycmF5KGRvdWJsZSBbXXMpIHsKKwkJZG91YmxlIFtddCA9IG5ldyBkb3VibGVbcy5sZW5ndGhdOworCQlpbnQgaT0wOworCQlmb3IoZG91YmxlIGQ6cyl0W2krK109ZDsKKwkJcmV0dXJuIHQ7CisJfQorCQorCQorCit9IC8vIEF1dG9FeHBDb250cm9sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC92aWV3cy9BdXRvRXhwRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvdmlld3MvQXV0b0V4cEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWIzMTk5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvdmlld3MvQXV0b0V4cEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUxIEBACisvLyBhdXRvZXhwRmFjdG9yeS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIGZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBBbmFseXNpc0NvbnRyb2x9IGluc3RhbmNlcy4KKyAqLworcHVibGljIGNsYXNzIEF1dG9FeHBGYWN0b3J5IGltcGxlbWVudHMgQW5hbHlzaXNDb250cm9sRmFjdG9yeSB7CisKKwkvKioKKwkgKiBwdWJsaWMgSU5TVEFOQ0UgZm9yIHRoaXMgRmFjdG9yeQorCSAqLworCXB1YmxpYyBzdGF0aWMgQXV0b0V4cEZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgQXV0b0V4cEZhY3RvcnkoKTsKKworCS8qKgorCSAqIENvbnN0YW50cyAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTkFMWVNJU19UWVBFID0gIkF1dG9tYXRpYyBFeHBlcmltZW50IjsKKwkKKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcmV0dXJuIG5ldyBBdXRvRXhwQ29udHJvbCgpCisJICovCisJcHVibGljIEFuYWx5c2lzQ29udHJvbCBjcmVhdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQkJCQorCQlyZXR1cm4gbmV3IEF1dG9FeHBDb250cm9sKHBhcmVudCk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0eXBlIG9mIGFuYWx5c2lzCisJICogCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb250cm9sVHlwZSgpIHsKKwkJcmV0dXJuIEFOQUxZU0lTX1RZUEU7CisJfQorCit9IC8vIGF1dG9leHBGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC92aWV3cy9BdXRvRXhwVmlldy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvdmlld3MvQXV0b0V4cFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTRiZjEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvdmlld3MvQXV0b0V4cFZpZXcuamF2YQpAQCAtMCwwICsxLDY3IEBACisvLyBBdXRvRXhwVmlldyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50LnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7CisKKy8qKgorICogVGhpcyB2aWV3IHByb3ZpZGVzIGEgdG9vbCB0byBlc3RpbWF0ZSBtb2RlbCBwYXJhbWV0ZXJzIGZvciBhIG1vZGVsIHRoYXQgbWlnaHQgZml0IGEgc2V0IG9mIHJlZmVyZW5jZSBkYXRhLgorICovCisKK3B1YmxpYyBjbGFzcyBBdXRvRXhwVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKKworCS8qKgorCSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBBdXRvRXhwIFZpZXcge0B2YWx1ZX0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BdXRvRXhwX1ZJRVcgPSAib3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50IjsgLy8kTk9OLU5MUy0xJAorCisKKwlwcml2YXRlIEFuYWx5c2lzVmlld2VyIGFuYWx5c2lzVmlld2VyOworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlhbmFseXNpc1ZpZXdlciA9IG5ldyBBbmFseXNpc1ZpZXdlcihwYXJlbnQsIEF1dG9FeHBGYWN0b3J5LklOU1RBTkNFKTsKKwkJLy9hbmFseXNpc1ZpZXdlci5zZXRJbnB1dChTaW11bGF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkpOworCisJCWdldFNpdGUoKS5zZXRTZWxlY3Rpb25Qcm92aWRlcihhbmFseXNpc1ZpZXdlcik7CisKKworCX0gLy8gY3JlYXRlUGFydENvbnRyb2wKKworCQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjZGlzcG9zZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0gLy8gZGlzcG9zZQorCisJLyoqCisJICogVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgaW50ZXJmYWNlLCBidXQgd2UncmUgbm90IHVzaW5nIGl0LgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJLy8gTm90aGluZworCX0gLy8gc2V0Rm9jdXMKKworfSAvLyBBdXRvRXhwVmlldwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvdmlld3MvRXJyb3JUaW1lU2VyaWVzQ2FudmFzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC92aWV3cy9FcnJvclRpbWVTZXJpZXNDYW52YXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWYyY2FjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvdmlld3MvRXJyb3JUaW1lU2VyaWVzQ2FudmFzLmphdmEKQEAgLTAsMCArMSwxMjQ2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmRldmljZS5JRGV2aWNlUmVuZGVyZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5leGNlcHRpb24uQ2hhcnRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5mYWN0b3J5LkdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLkNoYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuQ2hhcnRXaXRoQXhlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5BbmNob3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuQXhpc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuQm91bmRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkNvbG9yRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5JbnRlcnNlY3Rpb25UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkxpbmVBdHRyaWJ1dGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkxpbmVTdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5Qb3NpdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5UaWNrU3R5bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuaW1wbC5Cb3VuZHNJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLmltcGwuQ29sb3JEZWZpbml0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmNvbXBvbmVudC5BeGlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuY29tcG9uZW50LlNlcmllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmNvbXBvbmVudC5pbXBsLlNlcmllc0ltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5kYXRhLk51bWJlckRhdGFTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5kYXRhLlNlcmllc0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5kYXRhLmltcGwuTnVtYmVyRGF0YUVsZW1lbnRJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuZGF0YS5pbXBsLk51bWJlckRhdGFTZXRJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuZGF0YS5pbXBsLlNlcmllc0RlZmluaXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuaW1wbC5DaGFydFdpdGhBeGVzSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmxheW91dC5MZWdlbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5sYXlvdXQuUGxvdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLnR5cGUuTGluZVNlcmllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLnR5cGUuaW1wbC5TY2F0dGVyU2VyaWVzSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LnV0aWwuUGx1Z2luU2V0dGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7CisKKy8qKgorICogRXJyb3JUaW1lU2VyaWVzQ2FudmFzIGlzIGEgc3ViY2xhc3Mgb2Yge0BsaW5rIENhbnZhc30gc3VpdGFibGUgZm9yIGNoYXJ0IGRyYXdpbmdzLgorICovCitwdWJsaWMgY2xhc3MgRXJyb3JUaW1lU2VyaWVzQ2FudmFzIGV4dGVuZHMgQ2FudmFzIHsKKworCXByb3RlY3RlZCBJRGV2aWNlUmVuZGVyZXIgaWRyID0gbnVsbDsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHtAbGluayBDaGFydH0gdGhhdCBwbG90cyB0aGUgcmVsYXRpdmUgdmFsdWVzLgorCSAqLworCXByb3RlY3RlZCBDaGFydCBjbSA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgcHJvdmlkZXIgb2YgcmVsYXRpdmUgdmFsdWVzLgorCSAqLworCS8vcHJpdmF0ZSBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyIHJ2aHA7CisKKwlwcml2YXRlIEFuYWx5c2lzQ29udHJvbCBjb250cm9sID0gbnVsbDsKKwkKKwkvKioKKwkgKiB0aGUgaW5kZXggb2YgdGhpcyBDaGFydAorCSAqLworCXByaXZhdGUgaW50IGNoYXJ0SW5kZXggPSAwOworCQorCisJLyoqCisJICogc29tZSBleHRyYSBjb2xvcnMKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbG9yRGVmaW5pdGlvbltdIGNvbG9yRGVmYXVsdCA9IHsKKwkJCQkJCQkJCQkJCQkJCUNvbG9yRGVmaW5pdGlvbkltcGwuUkVEKCksIAorCQkJCQkJCQkJCQkJCQkJQ29sb3JEZWZpbml0aW9uSW1wbC5HUkVFTigpLCAKKwkJCQkJCQkJCQkJCQkJCUNvbG9yRGVmaW5pdGlvbkltcGwuQkxVRSgpLCAKKwkJCQkJCQkJCQkJCQkJCUNvbG9yRGVmaW5pdGlvbkltcGwuQkxBQ0soKSwgCisJCQkJCQkJCQkJCQkJCQlDb2xvckRlZmluaXRpb25JbXBsLkdSRVkoKSwKKwkJCQkJCQkJCQkJCQkJCUNvbG9yRGVmaW5pdGlvbkltcGwuQ1lBTigpLAorCQkJCQkJCQkJCQkJCQkJQ29sb3JEZWZpbml0aW9uSW1wbC5PUkFOR0UoKSAKKwkJCQkJCQkJCQkJCQkJCX07CisJLyoqCisJICogdXNlZCBpZiB3ZSBuZWVkIHRvIG92ZXJsYXkgdHJhY2VzIGluIGRpZmZlcmVudCBjb2xvcnMKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gb3ZlcmxheU1vZGUgPSBmYWxzZTsKKwkKKwkKKworCS8qKgorCSAqIEEgY29udGV4dCBtZW51IGZvciB0aGlzIHZpZXcKKwkgKi8KKwlNZW51IHBvcFVwTWVudSA9IG51bGw7CisJCisJLyoqCisJICogc2V0IHkgYXhpcyB0byBhIGxpbmVhciBzY2FsZQorCSAqLworCXByaXZhdGUgTGluZWFyU2NhbGVBY3Rpb24gbGluZWFyVGltZUFjdGlvbjsKKwkvKioKKwkgKiBzZXQgeSBheGlzIHRvIGEgbG9nIHNjYWxlCisJICovCisJcHJpdmF0ZSBMb2dTY2FsZUFjdGlvbiBsb2dUaW1lQWN0aW9uOworCXByb3RlY3RlZCBib29sZWFuIHVzZUxpbmVhclRpbWVTY2FsZSA9IHRydWU7CisJCisKKwkvKioKKwkgKiBzaG93IHRoZSBsZWdlbmQgKHRydWUgYnkgZGVmYXVsdCkKKwkgKi8KKwlwcml2YXRlIExlZ2VuZFZpZXdBY3Rpb24gdmlld0xlZ2VuZDsKKworCS8qKgorCSAqIGhpZGUgdGhlIGxlZ2VuZCAKKwkgKi8KKwlwcml2YXRlIExlZ2VuZEhpZGVBY3Rpb24gaGlkZUxlZ2VuZDsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93TGVnZW5kID0gdHJ1ZTsKKworCXByb3RlY3RlZCBMZWdlbmQgbGVnZW5kID0gbnVsbDsKKwkKKworCS8qKgorCSAqIHRoaXMgaXMgYSBtYXAgb2YgdGhlIERhdGFTZXJpZXMgb2JqZWN0IChrZXllZCBieSBwcm9wZXJ0eSBuYW1lKQorCSAqLworCXByb3RlY3RlZCBmaW5hbCBNYXA8U3RyaW5nLERhdGFTZXJpZXM+IGRhdGFTZXJpZXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRGF0YVNlcmllcz4oKTsKKwkKKwkvKioKKwkgKiBLZWVwIHRyYWNrIG9mIHdoaWNoIHRpbWVzZXJpZXMgYXJlIHZpc2libGUKKwkgKi8KKwkKKwlwcm90ZWN0ZWQgTWFwPFN0cmluZywgQm9vbGVhbj52aXNpYmxlTWFwID0gIG5ldyBIYXNoTWFwPFN0cmluZyxCb29sZWFuPigpOworCisKKwkvKioKKwkgKiBUaGVzZSBhcmUgdGhlIGN5Y2xlIG51bWJlcnMgdGhhdCBtYXRjaCB0aGUgcmVsYXRpdmUgdmFsdWVzIHRoYXQgd2lsbCBiZQorCSAqIHBsb3R0ZWQKKwkgKiAKKwkgKiBAc2VlICNyZWxhdGl2ZVZhbHVlcworCSAqLworCXByaXZhdGUgZmluYWwgTGlzdDxJbnRlZ2VyPiBjeWNsZU51bWJlcnMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisKKwkvKioKKwkgKiBDaGFydCBnZW5lcmF0b3IgaW5zdGFuY2UgKHJlZmVyZW5jZSB0byBhIHNpbmdsZXRvbikKKwkgKi8KKwlHZW5lcmF0b3IgZ3I7CisKKwlBeGlzIHlBeGlzUHJpbWFyeTsKKwlBeGlzIHhBeGlzUHJpbWFyeTsKKwkvKioKKwkgKiB0aGUgbWF4WSB2YWx1ZSBmb3Igc2NhbGluZworCSAqLworCWRvdWJsZSBtYXhZID0gLTEuMDsKKworCS8qKgorCSAqIExvZyBvZiB6ZXJvIGlzIG5lZ2F0aXZlIGluZmluaXR5IHNvIGZvciBlYWNoIGxvY2F0aW9uIHdlIHdpbGwgY3V0IG9mZiB0aGUgbWluaW11bSAKKwkgKiBhdCB0aGUgbWluIE5PTlpFUk8gWSB2YWx1ZQorCSAqLworCXByaXZhdGUgZG91YmxlIG1pbllzY2FsZSA9IDEuMDsKKwkKKwkKKwkvKioKKwkgKiBMYWJlbCBmb3IgbGluZSBzZXJpZXMgTEVHRU5ECisJICovCisJcHVibGljIFN0cmluZyBPcmRpbmF0ZV9MRUdFTkQgPSAiWSI7CisJCisJLyoqCisJICogTGFiZWwgZm9yIGxpbmUgc2VyaWVzIFkgYXhpcyBsYWJlbAorCSAqKi8KKwlwdWJsaWMgU3RyaW5nIE9yZGluYXRlX0FYSVMgPSAiWSI7CisJCisKKwkvKioKKwkgKiBMYWJlbCBmb3IgbGluZSBzZXJpZXMgWCBheGlzIGxhYmVsCisJICoqLworCXB1YmxpYyBTdHJpbmcgWF9BWElTID0gIlgiOworCQorCS8qKiAKKwkgKiBjdXN0b21pemFibGUgY29sb3IgZGVmaW5pdGlvbnMKKwkgKi8KKwlwcml2YXRlIENvbG9yRGVmaW5pdGlvbiBmb3JlR3JvdW5kID0gQ29sb3JEZWZpbml0aW9uSW1wbC5XSElURSgpOworCXByaXZhdGUgQ29sb3JEZWZpbml0aW9uIGJhY2tncm91bmRHcm91bmQgPSBDb2xvckRlZmluaXRpb25JbXBsLkJMQUNLKCk7CisJcHJpdmF0ZSBDb2xvckRlZmluaXRpb24gZnJhbWVDb2xvciA9IENvbG9yRGVmaW5pdGlvbkltcGwuY3JlYXRlKDE4MCwgMTgwLCAyMDApOworCisJSW1hZ2UgaW1nQ2hhcnQgPSBudWxsOworCQorCS8qKgorCSAqIFRoaXMgQ29uc3RydWN0b3IgaXMgdXNlZCB3aGVuIHdlIHdhbnQgdG8gcGxhY2UgdGhlIHRpbWUgc2VyaWVzIGluIGEgY29udGFpbmVyCisJICogd2hpY2ggaXMgYSBzdWIgY29tcG9uZW50IG9mIHRoZSBhY3R1YWwgQW5hbHlzaXNDb250cm9sCisJICogQHBhcmFtIGFuYWx5c2lzQ29udHJvbCAKKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50ICB0aGUgU1dUIHBhcmVudCBvZiB0aGUge0BsaW5rIFdpZGdldH0KKwkgKiBAcGFyYW0gb3JkaW5hdGVTdHJpbmcgCisJICogQHBhcmFtIHlBeGlzTGFiZWwgCisJICogQHBhcmFtIHhBeGlzTGFiZWwKKwkgKiBAcGFyYW0gZm9yZWdyb3VuZCAKKwkgKiBAcGFyYW0gYmFja2dyb3VuZCAKKwkgKiBAcGFyYW0gZnJhbWVjb2xvciAKKwkgKiBAcGFyYW0gY2hhcnRJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBjaGFydCAoMCBpZiBvbmx5IG9uZSkKKwkgKiBAcGFyYW0gb3ZlcmxheU1vZGUgdXNlZCBpZiB3ZSBuZWVkIHRvIG92ZXJsYXkgdHJhY2VzIGluIGRpZmZlcmVudCBjb2xvcnMKKwkgKi8KKwlwdWJsaWMgRXJyb3JUaW1lU2VyaWVzQ2FudmFzKGZpbmFsIEFuYWx5c2lzQ29udHJvbCBhbmFseXNpc0NvbnRyb2wsIGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIAorCQkJZmluYWwgU3RyaW5nIG9yZGluYXRlU3RyaW5nLCAKKwkJCWZpbmFsIFN0cmluZyB5QXhpc0xhYmVsLCAKKwkJCWZpbmFsIFN0cmluZyB4QXhpc0xhYmVsLAorCQkJZmluYWwgU3RyaW5nIGZpcnN0UHJvcGVydHksCisJCQlDb2xvckRlZmluaXRpb24gZm9yZWdyb3VuZCwKKwkJCUNvbG9yRGVmaW5pdGlvbiBiYWNrZ3JvdW5kLAorCQkJQ29sb3JEZWZpbml0aW9uIGZyYW1lY29sb3IsCisJCQlpbnQgY2hhcnRJbmRleCwKKwkJCWJvb2xlYW4gb3ZlcmxheU1vZGUJKSB7CisJCXN1cGVyKHBhcmVudCwgU1dULkRPVUJMRV9CVUZGRVJFRCB8IFNXVC5CT1JERVIpOworCQlPcmRpbmF0ZV9MRUdFTkQgPSBvcmRpbmF0ZVN0cmluZzsKKwkJT3JkaW5hdGVfQVhJUyA9IHlBeGlzTGFiZWw7CisJCVhfQVhJUyA9IHhBeGlzTGFiZWw7CisJCWZvcmVHcm91bmQgCQkJPSBmb3JlZ3JvdW5kOworCQliYWNrZ3JvdW5kR3JvdW5kIAk9IGJhY2tncm91bmQ7CisJCWZyYW1lQ29sb3IgCQkJPSBmcmFtZWNvbG9yOworCQl0aGlzLmNoYXJ0SW5kZXggPSBjaGFydEluZGV4OworCQl0aGlzLm92ZXJsYXlNb2RlID0gb3ZlcmxheU1vZGU7CisJCQorCQlnciA9IEdlbmVyYXRvci5pbnN0YW5jZSgpOworCisJCXRyeSB7CisJCQlpZHIgPSBQbHVnaW5TZXR0aW5ncy5pbnN0YW5jZSgpLmdldERldmljZSgiZHYuU1dUIik7IC8vJE5PTi1OTFMtMSQJCQkKKwkJfSBjYXRjaCAoZmluYWwgQ2hhcnRFeGNlcHRpb24gcGV4KSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlByb2JsZW0gaW5pdGlhbGl6aW5nIGNoYXJ0IiwgcGV4KTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CisKKwkJY29udHJvbCA9IGFuYWx5c2lzQ29udHJvbDsKKworCQkKKwkJY20gPSBjcmVhdGVTaW1wbGVMaW5lQ2hhcnQoZmlyc3RQcm9wZXJ0eSwgZGF0YVNlcmllc01hcCwgY3ljbGVOdW1iZXJzLCBNZXNzYWdlcworCQkJCS5nZXRTdHJpbmcoIkNDLnRpdGxlIikpOyAvLyROT04tTkxTLTEkCisJCQorCQlyZXNldERhdGEoKTsKKwkJYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChmaW5hbCBQYWludEV2ZW50IHBlKSB7CisKKwkJCQlmaW5hbCBDb21wb3NpdGUgc291cmNlID0gKENvbXBvc2l0ZSkgcGUuZ2V0U291cmNlKCk7CisJCQkJZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSBkID0gc291cmNlCisJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpOworCisJCQkJaWYoaW1nQ2hhcnQgIT0gbnVsbCkgaW1nQ2hhcnQuZGlzcG9zZSgpOworCQkJCWltZ0NoYXJ0ID0gbmV3IEltYWdlKHNvdXJjZS5nZXREaXNwbGF5KCksIGQpOworCQkJCQorCQkJCWlkci5zZXRQcm9wZXJ0eShJRGV2aWNlUmVuZGVyZXIuR1JBUEhJQ1NfQ09OVEVYVCwgbmV3IEdDKAorCQkJCQkJaW1nQ2hhcnQpKTsKKwkJCQlmaW5hbCBCb3VuZHMgYm91bmRzID0gQm91bmRzSW1wbC5jcmVhdGUoZC54LCBkLnksIGQud2lkdGgsCisJCQkJCQlkLmhlaWdodCk7CisJCQkJYm91bmRzLnNjYWxlKDcyZCAvIGlkci5nZXREaXNwbGF5U2VydmVyKCkuZ2V0RHBpUmVzb2x1dGlvbigpKTsKKwkJCQkvLyBCT1VORFMgTVVTVCBCRSBTUEVDSUZJRUQgSU4gUE9JTlRTCisKKwkJCQl0cnkgeworCQkJCQlnci5yZW5kZXIoaWRyLCBnci5idWlsZChpZHIuZ2V0RGlzcGxheVNlcnZlcigpLCBjbSwgYm91bmRzLAorCQkJCQkJCW51bGwsIG51bGwsIG51bGwpKTsKKwkJCQkJcGUuZ2MuZHJhd0ltYWdlKGltZ0NoYXJ0LCBkLngsIGQueSk7CisJCQkJfSBjYXRjaCAoZmluYWwgQ2hhcnRFeGNlcHRpb24gY2UpIHsKKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJQcm9ibGVtIHJlbmRlcmluZyBjaGFydCIsIGNlKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX0gLy8gcGFpbnRDb250cm9sCisJCX0gLy8gUGFpbnRMaXN0ZW5lcgorCQkpOworCQkKKwkJLy9DcmVhdGUgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSBjYW52YXMKKwkJY3JlYXRlQ29udGV4dE1lbnUodGhpcyk7CisJCQorCisJfSAvLyBFcnJvclRpbWVTZXJpZXNDYW52YXMKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50ICB0aGUgU1dUIHBhcmVudCBvZiB0aGUge0BsaW5rIFdpZGdldH0KKwkgKiBAcGFyYW0gb3JkaW5hdGVTdHJpbmcgCisJICogQHBhcmFtIHlBeGlzTGFiZWwgCisJICogQHBhcmFtIHhBeGlzTGFiZWwKKwkgKiBAcGFyYW0gZm9yZWdyb3VuZCAKKwkgKiBAcGFyYW0gYmFja2dyb3VuZCAKKwkgKiBAcGFyYW0gZnJhbWVjb2xvciAKKwkgKiBAcGFyYW0gY2hhcnRJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBjaGFydCAoMCBpZiBvbmx5IG9uZSkKKwkgKiAgCisJICovCisJcHVibGljIEVycm9yVGltZVNlcmllc0NhbnZhcyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCAKKwkJCWZpbmFsIFN0cmluZyBvcmRpbmF0ZVN0cmluZywgCisJCQlmaW5hbCBTdHJpbmcgeUF4aXNMYWJlbCwgCisJCQlmaW5hbCBTdHJpbmcgeEF4aXNMYWJlbCwKKwkJCWZpbmFsIFN0cmluZyBmaXJzdFByb3BlcnR5LAorCQkJQ29sb3JEZWZpbml0aW9uIGZvcmVncm91bmQsCisJCQlDb2xvckRlZmluaXRpb24gYmFja2dyb3VuZCwKKwkJCUNvbG9yRGVmaW5pdGlvbiBmcmFtZWNvbG9yLAorCQkJaW50IGNoYXJ0SW5kZXgpIHsKKwkJc3VwZXIocGFyZW50LCBTV1QuRE9VQkxFX0JVRkZFUkVEIHwgU1dULkJPUkRFUik7CisJCU9yZGluYXRlX0xFR0VORCA9IG9yZGluYXRlU3RyaW5nOworCQlPcmRpbmF0ZV9BWElTID0geUF4aXNMYWJlbDsKKwkJWF9BWElTID0geEF4aXNMYWJlbDsKKwkJZm9yZUdyb3VuZCAJCQk9IGZvcmVncm91bmQ7CisJCWJhY2tncm91bmRHcm91bmQgCT0gYmFja2dyb3VuZDsKKwkJZnJhbWVDb2xvciAJCQk9IGZyYW1lY29sb3I7CisJCXRoaXMuY2hhcnRJbmRleCA9IGNoYXJ0SW5kZXg7CisJCQorCQlnciA9IEdlbmVyYXRvci5pbnN0YW5jZSgpOworCisJCXRyeSB7CisJCQlpZHIgPSBQbHVnaW5TZXR0aW5ncy5pbnN0YW5jZSgpLmdldERldmljZSgiZHYuU1dUIik7IC8vJE5PTi1OTFMtMSQJCQkKKwkJfSBjYXRjaCAoZmluYWwgQ2hhcnRFeGNlcHRpb24gcGV4KSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlByb2JsZW0gaW5pdGlhbGl6aW5nIGNoYXJ0IiwgcGV4KTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CisKKwkJY29udHJvbCA9IChBbmFseXNpc0NvbnRyb2wpIHBhcmVudDsKKworCQkKKwkJY20gPSBjcmVhdGVTaW1wbGVMaW5lQ2hhcnQoZmlyc3RQcm9wZXJ0eSwgZGF0YVNlcmllc01hcCwgY3ljbGVOdW1iZXJzLCBNZXNzYWdlcworCQkJCS5nZXRTdHJpbmcoIkNDLnRpdGxlIikpOyAvLyROT04tTkxTLTEkCisJCQorCQlyZXNldERhdGEoKTsKKwkJCisJCWFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woZmluYWwgUGFpbnRFdmVudCBwZSkgeworCQkJCQorCQkJCWZpbmFsIENvbXBvc2l0ZSBzb3VyY2UgPSAoQ29tcG9zaXRlKSBwZS5nZXRTb3VyY2UoKTsKKwkJCQlmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlIGQgPSBzb3VyY2UKKwkJCQkJCS5nZXRDbGllbnRBcmVhKCk7CisKKwkJCQlpZihpbWdDaGFydCAhPSBudWxsKSBpbWdDaGFydC5kaXNwb3NlKCk7CisJCQkJaW1nQ2hhcnQgPSBuZXcgSW1hZ2Uoc291cmNlLmdldERpc3BsYXkoKSwgZCk7CisJCQkJaWRyLnNldFByb3BlcnR5KElEZXZpY2VSZW5kZXJlci5HUkFQSElDU19DT05URVhULCBuZXcgR0MoCisJCQkJCQlpbWdDaGFydCkpOworCQkJCWZpbmFsIEJvdW5kcyBib3VuZHMgPSBCb3VuZHNJbXBsLmNyZWF0ZShkLngsIGQueSwgZC53aWR0aCwKKwkJCQkJCWQuaGVpZ2h0KTsKKwkJCQlib3VuZHMuc2NhbGUoNzJkIC8gaWRyLmdldERpc3BsYXlTZXJ2ZXIoKS5nZXREcGlSZXNvbHV0aW9uKCkpOworCQkJCS8vIEJPVU5EUyBNVVNUIEJFIFNQRUNJRklFRCBJTiBQT0lOVFMKKworCQkJCXRyeSB7CisJCQkJCWdyLnJlbmRlcihpZHIsIGdyLmJ1aWxkKGlkci5nZXREaXNwbGF5U2VydmVyKCksIGNtLCBib3VuZHMsCisJCQkJCQkJbnVsbCwgbnVsbCwgbnVsbCkpOworCQkJCQlwZS5nYy5kcmF3SW1hZ2UoaW1nQ2hhcnQsIGQueCwgZC55KTsKKwkJCQl9IGNhdGNoIChmaW5hbCBDaGFydEV4Y2VwdGlvbiBjZSkgeworCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlByb2JsZW0gcmVuZGVyaW5nIGNoYXJ0IiwgY2UpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfSAvLyBwYWludENvbnRyb2wKKwkJfSAvLyBQYWludExpc3RlbmVyCisJCSk7CisJCQorCQkvL0NyZWF0ZSBhIGNvbnRleHQgbWVudSBmb3IgdGhlIGNhbnZhcworCQljcmVhdGVDb250ZXh0TWVudSh0aGlzKTsKKwkJCisKKwl9IC8vIEVycm9yVGltZVNlcmllc0NhbnZhcworCisJCisJCisJLyoqCisJICogVGhlIG1ldGhvZCB3aGljaCBnZXRzIHRoZSB7QGxpbmsgRXJyb3JUaW1lU2VyaWVzQ2FudmFzfScgcmVwb3J0cyBsaXN0LCBhbmQKKwkgKiBkcmF3cyBpdCBvbiB0aGUge0BsaW5rIEVycm9yVGltZVNlcmllc0NhbnZhc30uCisJICogQHJldHVybiBpbnRlZ3JhdGVkRGlmZmVyZW5jZSBmb3IgZWFjaCBsaW5lIHNlcmllcworCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIGRyYXcoKSB7CisJCQorCQkvL2NsZWFyRGF0YSgpOworCQlyZXNldERhdGEoKTsKKwkJeUF4aXNQcmltYXJ5LmdldFNlcmllc0RlZmluaXRpb25zKCkuY2xlYXIoKTsKKwkJCisJCS8vIGdldCB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIHBsb3QgZm9yIHRoaXMgdHlwZSBvZiBjaGFydAorCQlpbnQgbWF4TGluZXMgPSBjb250cm9sLmdldE51bVByb3BlcnRpZXMoY2hhcnRJbmRleCk7CisJCisJCS8vIGFkZCBhbGwgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgc2VyaWVzIG5vdworCQlmb3IgKGludCBpID0gMDsgaSA8IG1heExpbmVzOyBpICsrKSB7CisJCQlTdHJpbmcgcHJvcGVydHkgPSBjb250cm9sLmdldFByb3BlcnR5KGNoYXJ0SW5kZXgsaSk7CisJCQkKKwkJCWlmKCFkYXRhU2VyaWVzTWFwLmNvbnRhaW5zS2V5KHByb3BlcnR5KSkgeworCQkJCS8vIG5ldyBwcm9wZXJ0eQorCQkJCURhdGFTZXJpZXMgc2VyaWVzID0gbmV3IERhdGFTZXJpZXMocHJvcGVydHksIGksIG92ZXJsYXlNb2RlKTsKKwkJCQlpZih2aXNpYmxlTWFwLmNvbnRhaW5zS2V5KHByb3BlcnR5KSkKKwkJCQkJCXNlcmllcy5zZXRWaXNpYmxlKHZpc2libGVNYXAuZ2V0KHByb3BlcnR5KSk7CisJCQkJZWxzZSB7CisJCQkJCXNlcmllcy5zZXRWaXNpYmxlKHRydWUpOworCQkJCQl2aXNpYmxlTWFwLnB1dChwcm9wZXJ0eSwgdHJ1ZSk7CisJCQkJfQorCQkJCQorCQkJCWRhdGFTZXJpZXNNYXAucHV0KHByb3BlcnR5LCBzZXJpZXMpOworCQkJfQorCQkJRGF0YVNlcmllcyBzZXJpZXMgPSBkYXRhU2VyaWVzTWFwLmdldChwcm9wZXJ0eSk7CisJCQlzZXJpZXMuc2hvdygpOworCQkJCisJCX0KKwkJCisJCS8vIHVwZGF0ZSB0aGUgY29udGV4dCBtZW51IHdpdGggdGhlIG5ldyBwcm9wZXJ0aWVzIHRvIHBsb3QKKwkJLy91cGRhdGVDb250ZXh0TWVudSh0aGlzKTsKKwkJCisJCW1heFkgPSAtMS4wOworCQkKKwkJCWJvb2xlYW4gc2V0Q3ljbGVzID0gZmFsc2U7CisJCQkvLyBHZXQgdGhlIHZhbHVlcyBmb3IgdGhlIHByb3BlcnR5IHRvIGJlIHBsb3R0ZWQKKwkJCWludCBtYXhQb2ludHMgPSAwOworCQkJCisJCQlmb3IgKGludCBpID0gMDsgaSA8IG1heExpbmVzOyBpKyspIHsKKwkJCQlTdHJpbmcgcHJvcGVydHkgPSBjb250cm9sLmdldFByb3BlcnR5KGNoYXJ0SW5kZXgsaSk7CisJCQkJZG91YmxlW10gZG91YmxlVmFsdWVzID0gY29udHJvbC5nZXRWYWx1ZXMoY2hhcnRJbmRleCxpKTsKKwkJCQlpZihkb3VibGVWYWx1ZXM9PW51bGwpIHsKKwkJCQkJZG91YmxlVmFsdWVzID0gbmV3IGRvdWJsZVswXTsKKwkJCQkJLy9kb3VibGVWYWx1ZXNbMF0gPSAwOworCQkJCX0KKwkJCQlEYXRhU2VyaWVzIHNlcmllcyA9IGRhdGFTZXJpZXNNYXAuZ2V0KHByb3BlcnR5KTsKKwkJCQkKKwkJCQlpZihkYXRhU2VyaWVzTWFwLmdldChwcm9wZXJ0eSkuaXNWaXNpYmxlKCkgPT0gdHJ1ZSkgeyAKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkb3VibGVWYWx1ZXMubGVuZ3RoOyBqKyspIHsKKwkJCQkJCQorCQkJCQkJCisJCQkJCQlpZihkb3VibGVWYWx1ZXNbal0gPD0gbWluWXNjYWxlKSB7CisJCQkJCQkJaWYoZG91YmxlVmFsdWVzW2pdID4gMC4wKSBtaW5Zc2NhbGUgPSBkb3VibGVWYWx1ZXNbal07CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWlmKGRvdWJsZVZhbHVlc1tqXSA+PSBtYXhZKSB7CisJCQkJCQkJbWF4WSA9IGRvdWJsZVZhbHVlc1tqXTsKKwkJCQkJCQlkb3VibGUgbG9nID0gTWF0aC5mbG9vcihNYXRoLmxvZzEwKG1heFkpKTsKKwkJCQkJCQlkb3VibGUgYWRqdXN0ZWRNYXggPSAoTWF0aC5jZWlsKG1heFkvTWF0aC5wb3coMTAsIGxvZykpKSpNYXRoLnBvdygxMCwgbG9nKTsKKwkJCQkJCSAgICBpZihhZGp1c3RlZE1heCA8PSAxLjApIGFkanVzdGVkTWF4ID0gMS4wOworCQkJCQkJICAgIC8vYWRqdXN0ZWRNYXggPSBtYXhZKjEwMC4wOworCQkJCQkJICAgIC8vYWRqdXN0ZWRNYXggKz0gMS4wOworCQkJCQkJICAgIC8vaW50IG14ID0gKGludClhZGp1c3RlZE1heDsKKwkJCQkJCSAgICAvL2FkanVzdGVkTWF4ID0gKChkb3VibGUpbXgpLzEwMC4wOworCQkJCQkJCWlmICh1c2VMaW5lYXJUaW1lU2NhbGUpIHsKKwkJCQkJCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWF4KE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoYWRqdXN0ZWRNYXgpKTsKKwkJCQkJCQkJZG91YmxlIHN0ZXAgPSBhZGp1c3RlZE1heCAvIDEwLjA7CisJCQkJCQkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldFN0ZXAoc3RlcCk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLy8ga2VlcCAyIHNpZ25pZmljYW50IGZpZ3VyZXMgb24gc2NhbGUgYXhpcworCQkJCQkJCQlkb3VibGUgeW1heCA9IE1hdGgubG9nKGFkanVzdGVkTWF4KTsKKwkJCQkJCQkJaWYoYWRqdXN0ZWRNYXggPiAxLjApIHsKKwkJCQkJCQkJCXltYXggKz0gMC40OTk7CisJCQkJCQkJCQlsb25nIGltYXggPSBNYXRoLnJvdW5kKHltYXgpOworCQkJCQkJCQkJeW1heCA9IGltYXg7CisJCQkJCQkJCX0KKwkJCQkJCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWF4KE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoeW1heCkpOworCQkJCQkJCQlkb3VibGUgc3RlcCA9IHltYXgvMTAuMDsKKwkJCQkJCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0U3RlcChzdGVwKTsKKwkJCQkJCQl9CisJCQkJCQkJCisJCQkJCQkJCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IC8vIGlzIHZpc2libGUKKwkJCQkKKwkJCQkJLy8gQW55IHZhbHVlcz8KKwkJCQkJaWYgKGRvdWJsZVZhbHVlcy5sZW5ndGggPiAwKSB7CisJCQkJCQlpZiAobWF4UG9pbnRzIDwgZG91YmxlVmFsdWVzLmxlbmd0aCkgeworCQkJCQkJCW1heFBvaW50cyA9IGRvdWJsZVZhbHVlcy5sZW5ndGg7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWZvciAoaW50IGN5Y2xlTnVtYmVyID0gMDsgY3ljbGVOdW1iZXIgPCBkb3VibGVWYWx1ZXMubGVuZ3RoOyBjeWNsZU51bWJlcisrKSB7CisJCQkJCQkJCisJCQkJCQkJRG91YmxlIHZhbHVlOworCQkJCQkJCWRvdWJsZSBkaXNwbGF5VmFsdWUgPSBkb3VibGVWYWx1ZXNbY3ljbGVOdW1iZXJdOworCQkJCQkJCWlmIChkaXNwbGF5VmFsdWUgPD0gbWluWXNjYWxlKSB7CisJCQkJCQkJCS8vIExvZygwLjApIGlzIG5lZ2F0aXZlIGluZmluaXR5IHNvIGZvciBkaXNwbGF5IHB1cnBvc2VzIG9ubHkKKwkJCQkJCQkJLy8gd2Ugc2V0IHRoZSBtaW5pbXVtIGF4aXMgdmFsdWUgYXQgMC4xL1BPUFVMQVRJT04KKwkJCQkJCQkJZGlzcGxheVZhbHVlID0gbWluWXNjYWxlOworCQkJCQkJCX0KKwkJCQkJCQlpZiAodXNlTGluZWFyVGltZVNjYWxlKSB7CisJCQkJCQkJCXZhbHVlID0gbmV3IERvdWJsZShkaXNwbGF5VmFsdWUpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXZhbHVlID0gbmV3IERvdWJsZShNYXRoLmxvZyhkaXNwbGF5VmFsdWUpKTsKKwkJCQkJCQl9CisJCQkJCQkJCisKKwkJCQkJCQlzZXJpZXMuYWRkVmFsdWUodmFsdWUpOworCQkJCQkJCQorCQkJCQkJCS8vIG9ubHkgZG8gb25jZSBmb3IgZmlyc3QgbGluZSBzZXJpZXMKKwkJCQkJCQlpZiAoIXNldEN5Y2xlcykgeworCQkJCQkJCQljeWNsZU51bWJlcnMuYWRkKEludGVnZXIudmFsdWVPZihjeWNsZU51bWJlcikpOwkKKwkJCQkJCQkJfQorCQkJCQkJfSAvLyBmb3IgY3ljbGVOdW1iZXIKKwkJCQkJCQorCQkJCQkJaWYoeEF4aXNQcmltYXJ5LmdldFNlcmllc0RlZmluaXRpb25zKCkuZ2V0KDApLmdldFNlcmllcygpLnNpemUoKSAhPSBjeWNsZU51bWJlcnMuc2l6ZSgpKSB7CisJCQkJCQkJLy8gVGhlIG51bWJlciBvZiBkYXRhIHBvaW50cyBoYXZlIGNoYW5nZWQsIGNyZWF0ZSBhIG5ldyBzZXJpZXMgZm9yIHRoZSB4IGF4aXMKKwkJCQkJCQl4QXhpc1ByaW1hcnkuZ2V0U2VyaWVzRGVmaW5pdGlvbnMoKS5jbGVhcigpOworCQkJCQkJCWZpbmFsIFNlcmllcyB4QXhpc1NlcmllcyA9IFNlcmllc0ltcGwuY3JlYXRlKCk7CisKKwkJCQkJCQlmaW5hbCBOdW1iZXJEYXRhU2V0IHhWYWx1ZXMgPSBOdW1iZXJEYXRhU2V0SW1wbC5jcmVhdGUoY3ljbGVOdW1iZXJzKTsKKwkJCQkJCQl4QXhpc1Nlcmllcy5zZXREYXRhU2V0KHhWYWx1ZXMpOworCQkJCQkJCWZpbmFsIFNlcmllc0RlZmluaXRpb24gc2RYID0gU2VyaWVzRGVmaW5pdGlvbkltcGwuY3JlYXRlKCk7CisKKwkJCQkJCQl4QXhpc1ByaW1hcnkuZ2V0U2VyaWVzRGVmaW5pdGlvbnMoKS5hZGQoc2RYKTsKKwkJCQkJCQlzZFguZ2V0U2VyaWVzKCkuYWRkKHhBeGlzU2VyaWVzKTsKKwkJCQkJCX0KKwkJCQkJCQkKKwkJCQkJCQorCQkJCQkJc2V0Q3ljbGVzID0gdHJ1ZTsgLy8gd2Ugc2V0IHRoZW0gb25seSBvbmNlCisJCQkJCQkKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vcmVzZXREYXRhKCk7CisJCQkJCX0KKwkJCX0gLy8gZm9yIGkgcHJvcGVydGllcworCisKKwkJaWYgKCF0aGlzLmlzRGlzcG9zZWQoKSkgeworCQkJcmVkcmF3KCk7CisJCX0KKwkJCisJCQorCQkvLwljb250cm9sLnVwZGF0ZU1lc3NhZ2UoU2NlbmFyaW9BbmFseXNpc1N1aXRlLldPUktJTkdfTVNHKTsKKwkJCisJfSAvLyBwYWludENvbnRyb2wKKworCS8qKgorCSAqIEBwYXJhbSBkYXRhU2VyaWVzTWFwCisJICogICAgICAgICAgICB0aGUge0BsaW5rIExpc3R9IHRoYXQgd2lsbCBjb250YWluIHRoZSByZWxhdGl2ZSB2YWx1ZXMKKwkgKiAgICAgICAgICAgICgwLjAtMS4wKSB0byBwbG90CisJICogQHBhcmFtIGN5Y2xlTnVtYmVycworCSAqICAgICAgICAgICAgdGhlIHtAbGluayBMaXN0fSBvZiBzaW11bGF0aW9uIGN5Y2xlIG51bWJlcnMgdGhhdCBtYXRjaCB0aGUKKwkgKiAgICAgICAgICAgIHJlbGF0aXZlIHZhbHVlcworCSAqIEBwYXJhbSBzZXJpZXNJZGVudGlmaWVyCisJICogICAgICAgICAgICB0aGUgdGl0bGUgb2YgdGhlIGNoYXJ0CisJICogQHJldHVybiBhIDxjb2RlPkNoYXJ0PC9jb2RlPgorCSAqLworCXB1YmxpYyBmaW5hbCBDaGFydCBjcmVhdGVTaW1wbGVMaW5lQ2hhcnQoCisJCQlmaW5hbCBTdHJpbmcgZmlyc3RQcm9wZXJ0eSwKKwkJCWZpbmFsIE1hcDxTdHJpbmcsIERhdGFTZXJpZXM+IGRhdGFTZXJpZXNNYXAsCisJCQlmaW5hbCBMaXN0PEludGVnZXI+IGN5Y2xlTnVtYmVycywgZmluYWwgU3RyaW5nIHNlcmllc0lkZW50aWZpZXIpIHsKKwkJCisJCWZpbmFsIENoYXJ0V2l0aEF4ZXMgcmV0VmFsdWUgPSBDaGFydFdpdGhBeGVzSW1wbC5jcmVhdGUoKTsKKworCQkKKwkJLy8gUGxvdAorCQlyZXRWYWx1ZS5nZXRCbG9jaygpLnNldEJhY2tncm91bmQoZnJhbWVDb2xvcik7CisJCWZpbmFsIFBsb3QgcCA9IHJldFZhbHVlLmdldFBsb3QoKTsKKwkJcC5nZXRDbGllbnRBcmVhKCkuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kR3JvdW5kKTsKKworCQkvLyBUaXRsZQorCQkvLyBjd2FMaW5lLmdldFRpdGxlKCApLmdldExhYmVsKCApLmdldENhcHRpb24oICkuc2V0VmFsdWUoICJMaW5lIENoYXJ0IgorCQkvLyApOy8vJE5PTi1OTFMtMSQKKwkJcmV0VmFsdWUuZ2V0VGl0bGUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKKworCQkvLyBMZWdlbmQKKwkJbGVnZW5kID0gcmV0VmFsdWUuZ2V0TGVnZW5kKCk7CisJCWZpbmFsIExpbmVBdHRyaWJ1dGVzIGxpYSA9IGxlZ2VuZC5nZXRPdXRsaW5lKCk7CisJCWxlZ2VuZC5nZXRUZXh0KCkuZ2V0Rm9udCgpLnNldFNpemUoOCk7CisJCWxpYS5zZXRTdHlsZShMaW5lU3R5bGUuU09MSURfTElURVJBTCk7CisJCWxlZ2VuZC5nZXRJbnNldHMoKS5zZXQoMTAsIDUsIDAsIDApOworCQlsZWdlbmQuZ2V0T3V0bGluZSgpLnNldFZpc2libGUoZmFsc2UpOworCQlsZWdlbmQuc2V0QW5jaG9yKEFuY2hvci5OT1JUSF9MSVRFUkFMKTsKKwkJbGVnZW5kLnNldFBvc2l0aW9uKFBvc2l0aW9uLkJFTE9XX0xJVEVSQUwpOworCQlsZWdlbmQuZ2V0VGV4dCgpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQlsZWdlbmQuZ2V0T3V0bGluZSgpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQkKKwkJLy8gY3dhTGluZS5nZXRMZWdlbmQoICkuZ2V0VGV4dCgpLmdldEZvbnQoKS5zZXRTaXplKDE2KTs7CisJCS8vIGN3YUxpbmUuZ2V0TGVnZW5kKCApLnNldFZpc2libGUoIHRydWUgKTsKKworCQkvLyAvLy8vLy8vLy8KKwkJLy8gWC1BeGlzCisJCXhBeGlzUHJpbWFyeSA9IHJldFZhbHVlLmdldFByaW1hcnlCYXNlQXhlcygpWzBdOworCQl4QXhpc1ByaW1hcnkuc2V0VHlwZShBeGlzVHlwZS5URVhUX0xJVEVSQUwpOworCQl4QXhpc1ByaW1hcnkuZ2V0TWFqb3JHcmlkKCkuc2V0VGlja1N0eWxlKFRpY2tTdHlsZS5CRUxPV19MSVRFUkFMKTsKKwkJeEF4aXNQcmltYXJ5LmdldE9yaWdpbigpLnNldFR5cGUoSW50ZXJzZWN0aW9uVHlwZS5WQUxVRV9MSVRFUkFMKTsKKwkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuc2V0VmlzaWJsZShmYWxzZSk7CisJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLmdldENhcHRpb24oKS5nZXRGb250KCkuc2V0U2l6ZSg5KTsKKwkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuZ2V0Q2FwdGlvbigpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQl4QXhpc1ByaW1hcnkuZ2V0TGFiZWwoKS5nZXRDYXB0aW9uKCkuc2V0Q29sb3IoZm9yZUdyb3VuZCk7CisKKwkJZmluYWwgU2VyaWVzIHhBeGlzU2VyaWVzID0gU2VyaWVzSW1wbC5jcmVhdGUoKTsKKworCQkvLyBuZXcgY29sb3JzCisJCXhBeGlzU2VyaWVzLmdldExhYmVsKCkuZ2V0Q2FwdGlvbigpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQl4QXhpc1Nlcmllcy5nZXRMYWJlbCgpLmdldE91dGxpbmUoKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJLy8JCisKKwkJZmluYWwgTnVtYmVyRGF0YVNldCB4VmFsdWVzID0gTnVtYmVyRGF0YVNldEltcGwuY3JlYXRlKGN5Y2xlTnVtYmVycyk7CisJCXhBeGlzU2VyaWVzLnNldERhdGFTZXQoeFZhbHVlcyk7CisJCWZpbmFsIFNlcmllc0RlZmluaXRpb24gc2RYID0gU2VyaWVzRGVmaW5pdGlvbkltcGwuY3JlYXRlKCk7CisKKwkJeEF4aXNQcmltYXJ5LmdldFNlcmllc0RlZmluaXRpb25zKCkuYWRkKHNkWCk7CisJCXNkWC5nZXRTZXJpZXMoKS5hZGQoeEF4aXNTZXJpZXMpOworCisJCS8vIC8vLy8vLy8vCisJCS8vIFktQXhpcworCQl5QXhpc1ByaW1hcnkgPSByZXRWYWx1ZS5nZXRQcmltYXJ5T3J0aG9nb25hbEF4aXMoeEF4aXNQcmltYXJ5KTsKKwkJeUF4aXNQcmltYXJ5LmdldE1ham9yR3JpZCgpLnNldFRpY2tTdHlsZShUaWNrU3R5bGUuTEVGVF9MSVRFUkFMKTsKKworCQkvLyBOdW1iZXJEYXRhU2V0W10gb3J0aG9WYWx1ZXMgPSBuZXcgTnVtYmVyRGF0YVNldFtNQVhfTElORVNdOworCQkvLyBTZXJpZXNEZWZpbml0aW9uW10gc2RZID0gbmV3IFNlcmllc0RlZmluaXRpb25bTUFYX0xJTkVTXTsKKworCQkvLyBlbmQgWS1TZXJpZXMKKworCQl4QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNaW4oTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZSgwLjApKTsKKwkJLy8geEF4aXNQcmltYXJ5LmdldFNjYWxlKCApLnNldE1heCggTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZSggMTAuMCApCisJCS8vICk7CisJCS8vIHhBeGlzUHJpbWFyeS5nZXRTY2FsZSggKS5zZXRTdGVwKCAxICk7CisJCXhBeGlzUHJpbWFyeS5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5nZXRGb250KCkuc2V0U2l6ZSg5KTsKKwkJeEF4aXNQcmltYXJ5LmdldExhYmVsKCkuZ2V0Q2FwdGlvbigpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQl4QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5zZXRWaXNpYmxlKHRydWUpOworCQl4QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5nZXRDYXB0aW9uKCkuc2V0VmFsdWUoWF9BWElTKTsKKworCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNaW4oTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZSgwLjApKTsKKwkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWF4KE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoMS4wKSk7CisJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldFN0ZXAoMC4yNSk7CisJCXlBeGlzUHJpbWFyeS5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5nZXRGb250KCkuc2V0U2l6ZSg5KTsKKwkJeUF4aXNQcmltYXJ5LmdldExhYmVsKCkuZ2V0Q2FwdGlvbigpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQl5QXhpc1ByaW1hcnkuZ2V0VGl0bGUoICkuZ2V0Q2FwdGlvbiggKS5zZXRWYWx1ZSggT3JkaW5hdGVfQVhJUyApOworCQl5QXhpc1ByaW1hcnkuZ2V0VGl0bGUoICkuc2V0VmlzaWJsZSh0cnVlKTsKKwkJLy8geUF4aXNQcmltYXJ5LmdldE1ham9yR3JpZCgpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoZm9yZUdyb3VuZCk7CisJCQorCQkvLyBmb3Igbm93IGdldCByZWFkeSB0byBjcmVhdGUgb25seSBvbmUgbGluZSAtIHdlIGhhdmUgbm8gZGF0YSB5ZXQuCisJCS8vIHdlIHdpbGwgYWRkIG1vcmUgbGluZXMgYXMgd2UgbmVlZCB0aGVtCisJCS8vIGhhbmRsZSBudWxsCisJCWlmKCFkYXRhU2VyaWVzTWFwLmNvbnRhaW5zS2V5KGZpcnN0UHJvcGVydHkpKSB7CisJCQlEYXRhU2VyaWVzIHNlcmllcyA9IG5ldyBEYXRhU2VyaWVzKE1lc3NhZ2VzLmdldFN0cmluZygiQVVUTy5USVRMRTIiKSwgMCwgb3ZlcmxheU1vZGUpOworCQkJZGF0YVNlcmllc01hcC5wdXQoZmlyc3RQcm9wZXJ0eSwgc2VyaWVzKTsKKwkJfQorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZVNpbXBsZUxpbmVDaGFydAorCisJCisJLyoqCisJICogQ3JlYXRlIHRoZSB2aWV3J3MgY29udGV4dCBtZW51IGFuZCBhZGQgdGhlIGFjdGlvbiBoYW5kbGVycyB0byBpdC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudShmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJLy8gSW5pdCBhIENvbnRleHQgTWVudSBNYW5hZ2VyCisJCWZpbmFsIE1lbnVNYW5hZ2VyIGNvbnRleHRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCWxpbmVhclRpbWVBY3Rpb24gPSBuZXcgTGluZWFyU2NhbGVBY3Rpb24oKTsKKwkJbG9nVGltZUFjdGlvbiA9IG5ldyBMb2dTY2FsZUFjdGlvbigpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGxpbmVhclRpbWVBY3Rpb24pOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGxvZ1RpbWVBY3Rpb24pOworCisKKwkJCisJCS8vIFBsYWNlIEhvbGRlciBmb3IgTWVudSBBZGRpdGlvbnMKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKAorCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQorCQl2aWV3TGVnZW5kID0gbmV3IExlZ2VuZFZpZXdBY3Rpb24oKTsKKwkJaGlkZUxlZ2VuZCA9IG5ldyBMZWdlbmRIaWRlQWN0aW9uKCk7CisJCWNvbnRleHRNZW51TWFuYWdlci5hZGQodmlld0xlZ2VuZCk7CisJCWNvbnRleHRNZW51TWFuYWdlci5hZGQoaGlkZUxlZ2VuZCk7CisJCQorCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCisJCQorCQkvLyBQbGFjZSBIb2xkZXIgZm9yIE1lbnUgQWRkaXRpb25zCisJCWNvbnRleHRNZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigKKwkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOworCisJCXBvcFVwTWVudSA9IGNvbnRleHRNZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShwYXJlbnQpOworCisJCS8vIFNldCB0aGUgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyCisJCXBhcmVudC5zZXRNZW51KHBvcFVwTWVudSk7CisKKwl9IC8vIGNyZWF0ZUNvbnRleHRNZW51CisJCisJLyoqCisJICogVXBkYXRlIHRoZSB2aWV3J3MgY29udGV4dCBtZW51IGFuZCBhZGQgdGhlIGFjdGlvbiBoYW5kbGVycyB0byBpdC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlQ29udGV4dE1lbnUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXBvcFVwTWVudS5kaXNwb3NlKCk7CisKKwkJLy8gSW5pdCBhIENvbnRleHQgTWVudSBNYW5hZ2VyCisJCWZpbmFsIE1lbnVNYW5hZ2VyIGNvbnRleHRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCWxpbmVhclRpbWVBY3Rpb24gPSBuZXcgTGluZWFyU2NhbGVBY3Rpb24oKTsKKwkJbG9nVGltZUFjdGlvbiA9IG5ldyBMb2dTY2FsZUFjdGlvbigpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGxpbmVhclRpbWVBY3Rpb24pOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGxvZ1RpbWVBY3Rpb24pOworCQkKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCQkvLyBQbGFjZSBIb2xkZXIgZm9yIE1lbnUgQWRkaXRpb25zCisJCWNvbnRleHRNZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigKKwkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkKKwkJdmlld0xlZ2VuZCA9IG5ldyBMZWdlbmRWaWV3QWN0aW9uKCk7CisJCWhpZGVMZWdlbmQgPSBuZXcgTGVnZW5kSGlkZUFjdGlvbigpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKHZpZXdMZWdlbmQpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGhpZGVMZWdlbmQpOworCQkKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQorCQkKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQkKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIGFkZCB0aGUgZGlzcGxheWFibGUgcHJvcGVydGllcworCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2wuZ2V0TnVtUHJvcGVydGllcyhjaGFydEluZGV4KTsgaSArKykgeworCQkJCisJCQlTdHJpbmcgbmV4dFByb3AgPSBjb250cm9sLmdldFByb3BlcnR5KGNoYXJ0SW5kZXgsaSk7CisJCQlEYXRhU2VyaWVzIHNlcmllcyA9IGRhdGFTZXJpZXNNYXAuZ2V0KG5leHRQcm9wKTsKKwkJCURpc3BsYXlhYmxlUHJvcGVydHkgcHJvcGVydHkgPSBuZXcgRGlzcGxheWFibGVQcm9wZXJ0eShuZXh0UHJvcCwgc2VyaWVzLmlzVmlzaWJsZSgpKTsKKwkJCWNvbnRleHRNZW51TWFuYWdlci5hZGQocHJvcGVydHkpOworCQl9CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlmaW5hbCBNZW51IHBvcFVwTWVudSA9IGNvbnRleHRNZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShwYXJlbnQpOworCisJCS8vIFNldCB0aGUgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyCisJCXBhcmVudC5zZXRNZW51KHBvcFVwTWVudSk7CisKKworCX0gLy8gdXBkYXRlQ29udGV4dE1lbnUKKworCisJCisJLyoqCisJICogU2V0cyB0aGUgY29sb3JzIGZvciBhIG4gYXJyYXkgb2YgTGluZVNlcmllcyBnaXZlbiB0aGUgcHJvcGVydHkgdG8gUGxvdAorCSAqIGZvciBlYWNoLiBUcnkgdG8gc2V0IGNvbG9yIGZyb20gdGhlIHByZWZlcmVuY2VzIChpZiBzcGVjaWZpZWQgZm9yIHRoYXQKKwkgKiBwcm9wZXJ0eSkgb3RoZXJ3aXNlIHNldHMgbGluZSBjb2xvciB0byBibHVlLgorCSAqIAorCSAqIEBwYXJhbSBwcm9wZXJ0aWVzVG9QbG90CisJICogQHBhcmFtIGxzTGlzdAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb2xvckRlZnMoCisJCQlmaW5hbCBMaXN0PFN0cmluZz4gcHJvcGVydGllc1RvUGxvdCwKKwkJCWZpbmFsIExpc3Q8TGluZVNlcmllcz4gbHNMaXN0KSB7CisJCS8vIHRoZSBkZWZhdWx0IGxpbmUgY29sb3IKKworCQkvLyBpZiBwb3NzaWJsZSBnZXQgY29sb3IgZnJvbSBwcmVmZXJlbmNlcworCQlmaW5hbCBNYXA8U3RyaW5nLCBDb2xvcj4gY29sb3JNYXAgPSBWaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UKKwkJCQkuZ2V0Q29sb3JNYXBwaW5nKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbHNMaXN0LnNpemUoKTsgaSsrKSB7CisJCQlDb2xvckRlZmluaXRpb24gY29sb3IgPSBDb2xvckRlZmluaXRpb25JbXBsLkJMVUUoKTsKKworCQkJaWYgKChwcm9wZXJ0aWVzVG9QbG90ICE9IG51bGwpICYmIChwcm9wZXJ0aWVzVG9QbG90LnNpemUoKSA+IGkpKSB7CisJCQkJZmluYWwgU3RyaW5nIGtleSA9IHByb3BlcnRpZXNUb1Bsb3QuZ2V0KGkpOworCQkJCS8vIGxvb2sgb3IgdGhlIHByZWZlcmVuY2UgY29sb3IgYnkgbmFtZQorCQkJCWlmIChjb2xvck1hcC5jb250YWluc0tleShrZXkpKSB7CisJCQkJCWZpbmFsIENvbG9yIGMgPSBjb2xvck1hcC5nZXQoa2V5KTsKKwkJCQkJY29sb3IgPSBDb2xvckRlZmluaXRpb25JbXBsLmNyZWF0ZShjLmdldFJlZCgpLAorCQkJCQkJCWMuZ2V0R3JlZW4oKSwgYy5nZXRCbHVlKCkpOworCQkJCX0KKwkJCQlsc0xpc3QuZ2V0KGkpLnNldFNlcmllc0lkZW50aWZpZXIoa2V5KTsKKwkJCQlsc0xpc3QuZ2V0KGkpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoY29sb3IpOworCQkJfSBlbHNlIHsKKworCQkJCWlmIChsc0xpc3QuZ2V0KGkpICE9IG51bGwpIHsKKwkJCQkJbHNMaXN0LmdldChpKS5zZXRTZXJpZXNJZGVudGlmaWVyKCIgIik7CisJCQkJCWxzTGlzdC5nZXQoaSkuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRDb2xvcihjb2xvcik7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybjsKKwl9Ly8gZ2V0Q29sb3JEZWYKKworCisJCisKKwkvKioKKwkgKiBEaXNwb3NlcyB0aGUgQ29sb3Igb2JqZWN0cworCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9CisKKwkvKioKKwkgKiByZXNldAorCSAqLworCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlyZXNldERhdGEoKTsKKwkJcmVkcmF3KCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVzZXREYXRhKCkgeworCQljbGVhckRhdGEoKTsKKwkKKwkJY3ljbGVOdW1iZXJzLmFkZChJbnRlZ2VyLnZhbHVlT2YoMCkpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNsZWFyRGF0YSgpIHsKKwkJCisJCWRhdGFTZXJpZXNNYXAuY2xlYXIoKTsKKwkJY3ljbGVOdW1iZXJzLmNsZWFyKCk7CisJfQorCisJCisJLyoqCisJICogdG9nZ2xlIHRoZSBzY2FsZSBmcm9tIGxvZ2FyaXRobWljIHRvIGxpbmVhcgorCSAqLworCXZvaWQgdG9nZ2xlQXhpc1NjYWxlKCkgeworCQlpZiAodXNlTGluZWFyVGltZVNjYWxlKSB7IC8vU3dpdGNoIHRvIGxvZ2FyaXRobWljIHNjYWxlCisJCQlsb2dUaW1lQWN0aW9uLnNldENoZWNrZWQodHJ1ZSk7CisJCQlsaW5lYXJUaW1lQWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOworCQkJLy9KdXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgYXhpcyB0eXBlLCB0byBtb3ZlIHRvIGxvZyBzY2FsZSwgZGlkbid0IHdvcmsKKwkJCS8veUF4aXNQcmltYXJ5LnNldFR5cGUoQXhpc1R5cGUuTE9HQVJJVEhNSUNfTElURVJBTCk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNaW4obnVsbCk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNYXgobnVsbCk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS51bnNldFN0ZXAoKTsKKwkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnVuc2V0U3RlcE51bWJlcigpOworCQl9CisJCWVsc2UgeyAvL1N3aXRjaCB0byBsaW5lYXIgc2NhbGUKKwkJCWxvZ1RpbWVBY3Rpb24uc2V0Q2hlY2tlZChmYWxzZSk7CisJCQlsaW5lYXJUaW1lQWN0aW9uLnNldENoZWNrZWQodHJ1ZSk7CisJCQkvL3lBeGlzUHJpbWFyeS5zZXRUeXBlKEF4aXNUeXBlLkxJTkVBUl9MSVRFUkFMKTsKKwkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1pbihOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDAuMCkpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWF4KE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoMS4wKSk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRTdGVwKDAuMjUpOworCQl9CisJCXVzZUxpbmVhclRpbWVTY2FsZSA9ICF1c2VMaW5lYXJUaW1lU2NhbGU7CisJCWRyYXcoKTsKKwl9CisJCisKKwkvKioKKwkgKiB0b2dnbGUgdGhlIHNjYWxlIGZyb20gbG9nYXJpdGhtaWMgdG8gbGluZWFyCisJICovCisJdm9pZCB0b2dnbGVMZWdlbmQoKSB7CisJCWlmIChzaG93TGVnZW5kKSB7IC8vU3dpdGNoIHRvIGhpZGUKKwkJCXZpZXdMZWdlbmQuc2V0Q2hlY2tlZChmYWxzZSk7CisJCQloaWRlTGVnZW5kLnNldENoZWNrZWQodHJ1ZSk7CisJCQlsZWdlbmQuc2V0VmlzaWJsZShmYWxzZSk7CisJCX0KKwkJZWxzZSB7IC8vU3dpdGNoIHRvIHZpZXcKKwkJCXZpZXdMZWdlbmQuc2V0Q2hlY2tlZCh0cnVlKTsKKwkJCWhpZGVMZWdlbmQuc2V0Q2hlY2tlZChmYWxzZSk7CisJCQlsZWdlbmQuc2V0VmlzaWJsZSh0cnVlKTsKKwkJfQorCQlzaG93TGVnZW5kID0gIXNob3dMZWdlbmQ7CisJCWRyYXcoKTsKKwl9CisKKworCS8qKgorCSAqIEFjdGlvbiB0byBzaG93IHRoZSBsZWdlbmQKKwkgKi8KKwlwcm90ZWN0ZWQgY2xhc3MgTGVnZW5kVmlld0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJCXB1YmxpYyBMZWdlbmRWaWV3QWN0aW9uKCkKKwkJeworCQkJc3VwZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5TaG93TGVnZW5kIiksIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKKwkJCXNldENoZWNrZWQoc2hvd0xlZ2VuZCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI2dldFRleHQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbnRleHRNZW51LlNob3dMZWdlbmQiKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQlpZiAoc2hvd0xlZ2VuZCkgeworCQkJCXNldENoZWNrZWQodHJ1ZSk7CisJCQkJLy9Ob3RoaW5nIHRvIGRvLiBJdCdzIGFscmVhZHkgbGluZWFyLXRpbWUuCisJCQl9CisJCQllbHNlIHsKKwkJCQl0b2dnbGVMZWdlbmQoKTsKKwkJCX0KKwkJCWRyYXcoKTsKKwkJfQorCX0gLy9MZWdlbmRWaWV3QWN0aW9uCisJCisJLyoqCisJICogQWN0aW9uIHRvIGhpZGUgdGhlIGxlZ2VuZAorCSAqLworCWNsYXNzIExlZ2VuZEhpZGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gCXsKKwkJcHVibGljIExlZ2VuZEhpZGVBY3Rpb24oKQorCQl7CisJCQlzdXBlcihNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbnRleHRNZW51LkhpZGVMZWdlbmQiKSwgSUFjdGlvbi5BU19DSEVDS19CT1gpOworCQkJc2V0Q2hlY2tlZCghc2hvd0xlZ2VuZCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI2dldFRleHQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbnRleHRNZW51LkhpZGVMZWdlbmQiKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQlpZiAoIXNob3dMZWdlbmQpIHsKKwkJCQlzZXRDaGVja2VkKHRydWUpOworCQkJCS8vTm90aGluZyB0byBkby4gSXQncyBhbHJlYWR5IGxvZy10aW1lLgorCQkJfQorCQkJZWxzZSB7CisJCQkJdG9nZ2xlTGVnZW5kKCk7CisJCQl9CisJCQlkcmF3KCk7CisJCX0KKwl9Ly9MZWdlbmRIaWRlQWN0aW9uCisKKwkKKwkvKioKKwkgKiBzd2l0Y2ggdG8gbGluZWFyIHBsb3QgCisJICogCisJICovCisJcHJvdGVjdGVkIGNsYXNzIExpbmVhclNjYWxlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKwkJcHVibGljIExpbmVhclNjYWxlQWN0aW9uKCkKKwkJeworCQkJc3VwZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5MaW5lYXJUaW1lU2NhbGUiKSwgSUFjdGlvbi5BU19DSEVDS19CT1gpOworCQkJc2V0Q2hlY2tlZCh1c2VMaW5lYXJUaW1lU2NhbGUpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5MaW5lYXJUaW1lU2NhbGUiKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQlpZiAodXNlTGluZWFyVGltZVNjYWxlKSB7CisJCQkJc2V0Q2hlY2tlZCh0cnVlKTsKKwkJCQkvL05vdGhpbmcgdG8gZG8uIEl0J3MgYWxyZWFkeSBsaW5lYXItdGltZS4KKwkJCX0KKwkJCWVsc2UgeworCQkJCXRvZ2dsZUF4aXNTY2FsZSgpOworCQkJfQorCQkJZHJhdygpOworCQl9CisJfSAvL0xpbmVhclNjYWxlQWN0aW9uCisKKwkvKioKKwkgKiBzd2l0Y2ggdG8gc2VtaS1sb2cgcGxvdCAobG9nIHNjYWxlIG9uIHkgYXhpcykKKwkgKiAKKwkgKi8KKwljbGFzcyBMb2dTY2FsZUFjdGlvbiBleHRlbmRzIEFjdGlvbiAJeworCQlwdWJsaWMgTG9nU2NhbGVBY3Rpb24oKQorCQl7CisJCQlzdXBlcihNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbnRleHRNZW51LkxvZ1RpbWVTY2FsZSIpLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7CisJCQlzZXRDaGVja2VkKCF1c2VMaW5lYXJUaW1lU2NhbGUpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5Mb2dUaW1lU2NhbGUiKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQlpZiAoIXVzZUxpbmVhclRpbWVTY2FsZSkgeworCQkJCXNldENoZWNrZWQodHJ1ZSk7CisJCQkJLy9Ob3RoaW5nIHRvIGRvLiBJdCdzIGFscmVhZHkgbG9nLXRpbWUuCisJCQl9CisJCQllbHNlIHsKKwkJCQl0b2dnbGVBeGlzU2NhbGUoKTsKKwkJCX0KKwkJCWRyYXcoKTsKKwkJfQorCX0vL0xvZ1NjYWxlQWN0aW9uCisJCisJLyoqCisJICogRGlzcGxheWFibGVQcm9wZXJ0eQorCSAqCisJICovCisJcHJvdGVjdGVkIGNsYXNzIERpc3BsYXlhYmxlUHJvcGVydHkgZXh0ZW5kcyBBY3Rpb24KKwl7CisJCVN0cmluZyBwcm9wZXJ0eSA9IG51bGw7CisJCXB1YmxpYyBEaXNwbGF5YWJsZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSwgYm9vbGVhbiB2aXNpYmlsaXR5KQorCQl7CisJCQkJCXN1cGVyKHByb3BlcnR5LCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7CisJCQkJCXRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKwkJCQkJc2V0Q2hlY2tlZCh2aXNpYmlsaXR5KTsKKwkJfQorCQkKKwkKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI2dldFRleHQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJCXJldHVybiBwcm9wZXJ0eTsKKwkJfQorCisJCS8qKgorCQkgKiBUb2dnbGUgdGhlIHN0YXRlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlEYXRhU2VyaWVzIHNlcmllcyA9IGRhdGFTZXJpZXNNYXAuZ2V0KHByb3BlcnR5KTsKKwkJCQlzZXJpZXMudG9nZ2xlVmlzaWJsZSgpOworCQkJCWRhdGFTZXJpZXNNYXAucHV0KHByb3BlcnR5LHNlcmllcyk7CisJCQkJc2V0Q2hlY2tlZChzZXJpZXMuaXNWaXNpYmxlKCkpOworCQkJCXZpc2libGVNYXAucHV0KHByb3BlcnR5LCBzZXJpZXMuaXNWaXNpYmxlKCkpOworCQkJCWRyYXcoKTsKKwkJfQorCX0vLyBEaXNwbGF5YWJsZVByb3BlcnR5CisJCisJCisJLyoqCisJICogSW5uZXIgY2xhc3MgRGF0YVNlcmllcworCSAqIGFsbCB0aGUgZGF0YSBvYmplY3RzIGZvciBhIHBsb3QKKwkgKgorCSAqLworCXByb3RlY3RlZCBjbGFzcyBEYXRhU2VyaWVzIAorCXsKKwkJcHVibGljIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSAiIjsKKwkJCisJCXB1YmxpYyBMaXN0PERvdWJsZT4gcmVsYXRpdmVWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJcHVibGljIFNlcmllcyBsaW5lU2VyaWVzID0gbnVsbDsKKwkJcHJpdmF0ZSBib29sZWFuIHZpc2libGUgPSB0cnVlOworCQlwcml2YXRlIFNlcmllc0RlZmluaXRpb24gc2RZID0gbnVsbDsKKwkJcHJpdmF0ZSBpbnQgc2VyaWVzSW5kZXggPSAwOworCQlwcml2YXRlIGJvb2xlYW4gb3ZlcmxheU1vZGUgPSBmYWxzZTsKKwkJCisJCQorCQlwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisJCQlyZXR1cm4gdmlzaWJsZTsKKwkJfQorCQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gc3RhdGUpIHsKKwkJCXZpc2libGUgPSBzdGF0ZTsKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgdG9nZ2xlVmlzaWJsZSgpIHsKKwkJCXZpc2libGUgPSAhdmlzaWJsZTsKKwkJfQorCisJCS8qKgorCQkgKiAKKwkJICogQHBhcmFtIHByb3BlcnR5TmFtZQorCQkgKiBAcGFyYW0gaW5kZXgKKwkJICogQHBhcmFtIG92ZXJsYXkgCisJCSAqLworCQlwdWJsaWMgRGF0YVNlcmllcyhTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgaW5kZXgsIGJvb2xlYW4gb3ZlcmxheSkgeworCQkJdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7CisJCQl0aGlzLnNlcmllc0luZGV4ID0gaW5kZXg7CisJCQl0aGlzLm92ZXJsYXlNb2RlID0gb3ZlcmxheTsKKwkJCXJlbGF0aXZlVmFsdWVzID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQlyZWxhdGl2ZVZhbHVlcy5hZGQobmV3IERvdWJsZSgwLjApKTsKKwkJCWFkZExpbmVTZXJpZXMocHJvcGVydHlOYW1lKTsKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgYWRkVmFsdWUoRG91YmxlIHZhbCkgeworCQkJaWYocmVsYXRpdmVWYWx1ZXM9PW51bGwpIHJlbGF0aXZlVmFsdWVzID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQlyZWxhdGl2ZVZhbHVlcy5hZGQodmFsKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKwkJICogCisJCSAqLworCQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorCQlwdWJsaWMgdm9pZCBhZGRMaW5lU2VyaWVzKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJCQorCQkJZmluYWwgTnVtYmVyRGF0YVNldCBvcnRob1ZhbHVlcyA9IE51bWJlckRhdGFTZXRJbXBsCisJCQkJCS5jcmVhdGUocmVsYXRpdmVWYWx1ZXMpOworCQkJaWYobGluZVNlcmllcyA9PSBudWxsKSB7CisJCQkJbGluZVNlcmllcyA9IFNjYXR0ZXJTZXJpZXNJbXBsLmNyZWF0ZSgpOworCQkJCS8qCisJCQkJICogCisJCQkJICogQmFyIGNoYXJ0IHN0eWxlIGlzIHRvbyBzbG93IGZvciBnZW5lcmF0aW9uIG9mIGEgZmlsbAorCQkJCSAqIGlmIHdlIHdhbnQgYSBmaWxsIHdlIGNhbiB0cnkgdXNpbmcgdGhlIGRpZmZlcmVuY2UgcGxvdAorCQkJCSAqIHRvIGEgc3RyYWlnaHQgbGluZSBhdCB5PTAKKwkJCQkgKiAKKwkJCQkKKwkJCQlpZihwcm9wZXJ0eU5hbWUuaW5kZXhPZigiKiIpPj0xKSB7CisJCQkJCS8vIGJhcnNlcmllcyBtZXRob2RzCisJCQkJCWxpbmVTZXJpZXMgPSAoQmFyU2VyaWVzKSBCYXJTZXJpZXNJbXBsLmNyZWF0ZSgpOworCQkJCX0gZWxzZSB7CisJCQkJCWxpbmVTZXJpZXMgPSAoU2NhdHRlclNlcmllcykgU2NhdHRlclNlcmllc0ltcGwuY3JlYXRlKCk7CisJCQkJfQorCQkJCQorCQkJCSoKKwkJCQkqLworCQkJfSAvLyBpZiBsaW5lU2VyaWVzPT1udWxsCisJCQlsaW5lU2VyaWVzLnNldERhdGFTZXQob3J0aG9WYWx1ZXMpOworCQkJKChMaW5lU2VyaWVzKSBsaW5lU2VyaWVzKS5nZXRMaW5lQXR0cmlidXRlcygpLnNldFZpc2libGUodHJ1ZSk7CisJCQkoKExpbmVTZXJpZXMpIGxpbmVTZXJpZXMpLmdldE1hcmtlcnMoKS5jbGVhcigpOworCQkJCisJCQkvLyBBc3NpZ24gdGhlIGxpbmUgY29sb3IKKwkJCS8vIGJhc2VkIG9uIHNlbGVjdGVkIHByb3BlcnR5LiBEZWZhdWx0IGlzIEJsdWUKKwkJCXNldENvbG9yRGVmcyhzZXJpZXNJbmRleCk7CisJCQkvLyBJZiB0aGlzIGlzIHRoZSAic2VsZWN0ZWQiIHJlZ2lvbiBvZiBhIGdyYXBoIHNldCB0aGUgbWFya2VyIHR5cGUKKwkJCisJCQkvLyB0aGUgc2VyaWVzIGRlZgorCQkJc2RZID0gU2VyaWVzRGVmaW5pdGlvbkltcGwuY3JlYXRlKCk7CisJCQlzZFkuZ2V0U2VyaWVzUGFsZXR0ZSgpLnVwZGF0ZSgtMik7CisJCQlzZFkuZ2V0U2VyaWVzKCkuYWRkKGxpbmVTZXJpZXMpOworCQkJeUF4aXNQcmltYXJ5LmdldFNlcmllc0RlZmluaXRpb25zKCkuYWRkKHNkWSk7CisJCQkKKwkJCXJldHVybjsKKwkJfS8vIGFkZExpbmVTZXJpZXMKKwkJCisJCS8qKiAKKwkJICogaW4gcmVzcG9uc2UgdG8gdXNlciBhY3Rpb24gdGVtcG9yYXJpbHkgcmVtb3ZlIHRoZSBsaW5lIHNlcmllcyBmcm9tIHRoZSBncmFwaAorCQkgKi8KKwkJcHVibGljIHZvaWQgaGlkZSgpIHsKKwkJCWxpbmVTZXJpZXMuc2V0VmlzaWJsZShmYWxzZSk7CisJCQl2aXNpYmxlID0gZmFsc2U7CisJCX0vLyBoaWRlCisJCQorCQkvKiogCisJCSAqIGluIHJlc3BvbnNlIHRvIHVzZXIgYWN0aW9uIGFkZCBiYWNrIHRoZSBsaW5lIHNlcmllcyB0byB0aGUgZ3JhcGgKKwkJICovCisJCXB1YmxpYyB2b2lkIHNob3coKSB7CisJCQlsaW5lU2VyaWVzLnNldFZpc2libGUodHJ1ZSk7CisJCQl2aXNpYmxlID0gdHJ1ZTsKKwkJfS8vIHNob3cKKwkJCisKKwkJLyoqCisJCSAqIE92ZXJsb2FkZWQgYW5kIHNpbXBsZSBtZXRob2QgdG8gc2V0IHRoZSBjb2xvcnMKKwkJICogZG9lcyBub3QgdXNlIHRoZSBwcmVmZXJlbmNlcworCQkgKiAKKwkJICogU2V0cyB0aGUgY29sb3JzIGZvciBhIG4gYXJyYXkgb2YgTGluZVNlcmllcyBnaXZlbiB0aGUgcHJvcGVydHkgdG8gUGxvdAorCQkgKiBmb3IgZWFjaC4gVHJ5IHRvIHNldCBjb2xvciBmcm9tIHRoZSBwcmVmZXJlbmNlcyAoaWYgc3BlY2lmaWVkIGZvciB0aGF0CisJCSAqIHByb3BlcnR5KSBvdGhlcndpc2Ugc2V0cyBsaW5lIGNvbG9yIHRvIGJsdWUuCisJCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgCisJCSAqCisJCSAqLworCQlwdWJsaWMgdm9pZCBzZXRDb2xvckRlZnMoaW50IGluZGV4KSB7CisJCQkvLyB0aGUgZGVmYXVsdCBsaW5lIGNvbG9yCisJCQlpZihpbmRleCA+PSBjb2xvckRlZmF1bHQubGVuZ3RoKSBpbmRleCA9IDA7IC8vIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJCUNvbG9yRGVmaW5pdGlvbiBjb2xvciA9IGNvbG9yRGVmYXVsdFtpbmRleF07CisKKwkJCXRoaXMubGluZVNlcmllcy5zZXRTZXJpZXNJZGVudGlmaWVyKHByb3BlcnR5TmFtZSk7CisJCQlpZiAob3ZlcmxheU1vZGUpIHsKKwkJCQkJKChMaW5lU2VyaWVzKXRoaXMubGluZVNlcmllcykuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRDb2xvcihjb2xvcik7CisJCQkJCSgoTGluZVNlcmllcyl0aGlzLmxpbmVTZXJpZXMpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0U3R5bGUoTGluZVN0eWxlLkRPVFRFRF9MSVRFUkFMKTsKKwkJCX0gZWxzZSB7CisJCQkJKChMaW5lU2VyaWVzKXRoaXMubGluZVNlcmllcykuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRDb2xvcihjb2xvcik7CisJCQl9CisJCQkKKwkJCQorCQl9Ly8gZ2V0Q29sb3JEZWZzCisJCQorCQkvKioKKwkJICogU2V0cyB0aGUgY29sb3JzIGZvciBhIG4gYXJyYXkgb2YgTGluZVNlcmllcyBnaXZlbiB0aGUgcHJvcGVydHkgdG8gUGxvdAorCQkgKiBmb3IgZWFjaC4gVHJ5IHRvIHNldCBjb2xvciBmcm9tIHRoZSBwcmVmZXJlbmNlcyAoaWYgc3BlY2lmaWVkIGZvciB0aGF0CisJCSAqIHByb3BlcnR5KSBvdGhlcndpc2Ugc2V0cyBsaW5lIGNvbG9yIHRvIGJsdWUuCisJCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgCisJCSAqCisJCSAqLworCQlwdWJsaWMgdm9pZCBzZXRDb2xvckRlZnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQkJLy8gdGhlIGRlZmF1bHQgbGluZSBjb2xvcgorCisJCQkvLyBpZiBwb3NzaWJsZSBnZXQgY29sb3IgZnJvbSBwcmVmZXJlbmNlcworCQkJZmluYWwgTWFwPFN0cmluZywgQ29sb3I+IGNvbG9yTWFwID0gVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlLmdldENvbG9yTWFwcGluZygpOworCisJCQkvLyBkZWZhdWx0IGNvbG9yCisJCQlpbnQgY29sb3JJbmRleCA9IHNlcmllc0luZGV4ICUgY29sb3JEZWZhdWx0Lmxlbmd0aDsKKwkJCUNvbG9yRGVmaW5pdGlvbiBjb2xvciA9IGNvbG9yRGVmYXVsdFtjb2xvckluZGV4XTsKKworCQkJLy8gcHJlZmVycmVkIGNvbG9yIGJ5IG5hbWUKKwkJCVN0cmluZyBrZXkgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsMSk7CisJCQkKKwkJCWlmIChjb2xvck1hcC5jb250YWluc0tleShrZXkpKSB7CisJCQkJZmluYWwgQ29sb3IgYyA9IGNvbG9yTWFwLmdldChrZXkpOworCQkJCWNvbG9yID0gQ29sb3JEZWZpbml0aW9uSW1wbC5jcmVhdGUoYy5nZXRSZWQoKSwgYy5nZXRHcmVlbigpLCBjLmdldEJsdWUoKSk7CisJCQl9CisJCQkKKwkJCXRoaXMubGluZVNlcmllcy5zZXRTZXJpZXNJZGVudGlmaWVyKHByb3BlcnR5TmFtZSk7CisJCQlpZiAob3ZlcmxheU1vZGUpIHsKKwkJCQkJKChMaW5lU2VyaWVzKXRoaXMubGluZVNlcmllcykuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRDb2xvcihDb2xvckRlZmluaXRpb25JbXBsLkdSRVkoKSk7CisJCQkJCSgoTGluZVNlcmllcyl0aGlzLmxpbmVTZXJpZXMpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0U3R5bGUoTGluZVN0eWxlLkRPVFRFRF9MSVRFUkFMKTsKKwkJCX0gZWxzZSB7CisJCQkJKChMaW5lU2VyaWVzKXRoaXMubGluZVNlcmllcykuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRDb2xvcihjb2xvcik7CisJCQl9CisJCQkKKwkJCQorCQl9Ly8gZ2V0Q29sb3JEZWZzCisKKwkJLyoqCisJCSAqIGxlbmd0aCBvZiB0aGUgc2VyaWVzCisJCSAqIEByZXR1cm4gbnVtYmVyIG9mIGRhdGEgcG9pbnRzCisJCSAqLworCQlwdWJsaWMgaW50IGdldERhdGFTaXplKCkgeworCQkJcmV0dXJuIHJlbGF0aXZlVmFsdWVzLnNpemUoKTsKKwkJfQorCQkvLyBBY2Nlc3NvcnMKKwkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7CisJCQlyZXR1cm4gcHJvcGVydHlOYW1lOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJCXRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworCQl9CisKKwkJcHVibGljIExpc3Q8RG91YmxlPiBnZXRSZWxhdGl2ZVZhbHVlcygpIHsKKwkJCXJldHVybiByZWxhdGl2ZVZhbHVlczsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFJlbGF0aXZlVmFsdWVzKExpc3Q8RG91YmxlPiByZWxhdGl2ZVZhbHVlcykgeworCQkJdGhpcy5yZWxhdGl2ZVZhbHVlcyA9IHJlbGF0aXZlVmFsdWVzOworCQl9CisKKwkJCisKKwkJcHVibGljIHZvaWQgc2V0TGluZVNlcmllcyhMaW5lU2VyaWVzIGxpbmVTZXJpZXMpIHsKKwkJCXRoaXMubGluZVNlcmllcyA9IGxpbmVTZXJpZXM7CisJCX0KKwl9Ly8gRGF0YVNlcmllcworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCit9IC8vIEVycm9yVGltZVNlcmllc0NhbnZhcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvdmlld3MvTWVzc2FnZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L3ZpZXdzL01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUwZDVlMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L3ZpZXdzL01lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLy8gTWVzc2FnZXMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlcyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC52aWV3cy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCisJCQkuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKKworCXByaXZhdGUgTWVzc2FnZXMoKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0ga2V5CisJICogQHJldHVybiB0aGUgc3RyaW5nIG1hdGNoaW5nIHRoZSBrZXkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoZmluYWwgU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoZmluYWwgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9Cit9IC8vIE1lc3NhZ2VzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC92aWV3cy9SdW5IaXN0b3J5Q2FudmFzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC92aWV3cy9SdW5IaXN0b3J5Q2FudmFzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiNGMxZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9hdXRvbWF0aWNleHBlcmltZW50L3ZpZXdzL1J1bkhpc3RvcnlDYW52YXMuamF2YQpAQCAtMCwwICsxLDEyNDYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50LnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQuZGV2aWNlLklEZXZpY2VSZW5kZXJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmV4Y2VwdGlvbi5DaGFydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmZhY3RvcnkuR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuQ2hhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5DaGFydFdpdGhBeGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkFuY2hvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5BeGlzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5Cb3VuZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuQ29sb3JEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkludGVyc2VjdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuTGluZUF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuTGluZVN0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLlBvc2l0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLlRpY2tTdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5pbXBsLkJvdW5kc0ltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuaW1wbC5Db2xvckRlZmluaXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuY29tcG9uZW50LkF4aXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5jb21wb25lbnQuU2VyaWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuY29tcG9uZW50LmltcGwuU2VyaWVzSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuTnVtYmVyRGF0YVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuU2VyaWVzRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuaW1wbC5OdW1iZXJEYXRhRWxlbWVudEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5kYXRhLmltcGwuTnVtYmVyRGF0YVNldEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5kYXRhLmltcGwuU2VyaWVzRGVmaW5pdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5pbXBsLkNoYXJ0V2l0aEF4ZXNJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwubGF5b3V0LkxlZ2VuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmxheW91dC5QbG90OworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwudHlwZS5MaW5lU2VyaWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwudHlwZS5pbXBsLlNjYXR0ZXJTZXJpZXNJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQudXRpbC5QbHVnaW5TZXR0aW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5WaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKKworLyoqCisgKiBSdW5IaXN0b3J5Q2FudmFzIGlzIGEgc3ViY2xhc3Mgb2Yge0BsaW5rIENhbnZhc30gc3VpdGFibGUgZm9yIGNoYXJ0IGRyYXdpbmdzLgorICovCitwdWJsaWMgY2xhc3MgUnVuSGlzdG9yeUNhbnZhcyBleHRlbmRzIENhbnZhcyB7CisKKwlwcm90ZWN0ZWQgSURldmljZVJlbmRlcmVyIGlkciA9IG51bGw7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB7QGxpbmsgQ2hhcnR9IHRoYXQgcGxvdHMgdGhlIHJlbGF0aXZlIHZhbHVlcy4KKwkgKi8KKwlwcm90ZWN0ZWQgQ2hhcnQgY20gPSBudWxsOworCisJLyoqCisJICogVGhlIHByb3ZpZGVyIG9mIHJlbGF0aXZlIHZhbHVlcy4KKwkgKi8KKwkvL3ByaXZhdGUgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlciBydmhwOworCisJcHJpdmF0ZSBBbmFseXNpc0NvbnRyb2wgY29udHJvbCA9IG51bGw7CisJCisJLyoqCisJICogdGhlIGluZGV4IG9mIHRoaXMgQ2hhcnQKKwkgKi8KKwlwcml2YXRlIGludCBjaGFydEluZGV4ID0gMDsKKwkKKworCS8qKgorCSAqIHNvbWUgZXh0cmEgY29sb3JzCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb2xvckRlZmluaXRpb25bXSBjb2xvckRlZmF1bHQgPSB7CisJCQkJCQkJCQkJCQkJCQlDb2xvckRlZmluaXRpb25JbXBsLlJFRCgpLCAKKwkJCQkJCQkJCQkJCQkJCUNvbG9yRGVmaW5pdGlvbkltcGwuR1JFRU4oKSwgCisJCQkJCQkJCQkJCQkJCQlDb2xvckRlZmluaXRpb25JbXBsLkJMVUUoKSwgCisJCQkJCQkJCQkJCQkJCQlDb2xvckRlZmluaXRpb25JbXBsLkJMQUNLKCksIAorCQkJCQkJCQkJCQkJCQkJQ29sb3JEZWZpbml0aW9uSW1wbC5HUkVZKCksCisJCQkJCQkJCQkJCQkJCQlDb2xvckRlZmluaXRpb25JbXBsLkNZQU4oKSwKKwkJCQkJCQkJCQkJCQkJCUNvbG9yRGVmaW5pdGlvbkltcGwuT1JBTkdFKCkgCisJCQkJCQkJCQkJCQkJCQl9OworCS8qKgorCSAqIHVzZWQgaWYgd2UgbmVlZCB0byBvdmVybGF5IHRyYWNlcyBpbiBkaWZmZXJlbnQgY29sb3JzCisJICovCisJcHJpdmF0ZSBib29sZWFuIG92ZXJsYXlNb2RlID0gZmFsc2U7CisJCisJCisKKwkvKioKKwkgKiBBIGNvbnRleHQgbWVudSBmb3IgdGhpcyB2aWV3CisJICovCisJTWVudSBwb3BVcE1lbnUgPSBudWxsOworCQorCS8qKgorCSAqIHNldCB5IGF4aXMgdG8gYSBsaW5lYXIgc2NhbGUKKwkgKi8KKwlwcml2YXRlIExpbmVhclNjYWxlQWN0aW9uIGxpbmVhclRpbWVBY3Rpb247CisJLyoqCisJICogc2V0IHkgYXhpcyB0byBhIGxvZyBzY2FsZQorCSAqLworCXByaXZhdGUgTG9nU2NhbGVBY3Rpb24gbG9nVGltZUFjdGlvbjsKKwlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMaW5lYXJUaW1lU2NhbGUgPSB0cnVlOworCQorCisJLyoqCisJICogc2hvdyB0aGUgbGVnZW5kICh0cnVlIGJ5IGRlZmF1bHQpCisJICovCisJcHJpdmF0ZSBMZWdlbmRWaWV3QWN0aW9uIHZpZXdMZWdlbmQ7CisKKwkvKioKKwkgKiBoaWRlIHRoZSBsZWdlbmQgCisJICovCisJcHJpdmF0ZSBMZWdlbmRIaWRlQWN0aW9uIGhpZGVMZWdlbmQ7CisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0xlZ2VuZCA9IHRydWU7CisKKwlwcm90ZWN0ZWQgTGVnZW5kIGxlZ2VuZCA9IG51bGw7CisJCisKKwkvKioKKwkgKiB0aGlzIGlzIGEgbWFwIG9mIHRoZSBEYXRhU2VyaWVzIG9iamVjdCAoa2V5ZWQgYnkgcHJvcGVydHkgbmFtZSkKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgTWFwPFN0cmluZyxEYXRhU2VyaWVzPiBkYXRhU2VyaWVzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLERhdGFTZXJpZXM+KCk7CisJCisJLyoqCisJICogS2VlcCB0cmFjayBvZiB3aGljaCBSdW5IaXN0b3J5IGFyZSB2aXNpYmxlCisJICovCisJCisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIEJvb2xlYW4+dmlzaWJsZU1hcCA9ICBuZXcgSGFzaE1hcDxTdHJpbmcsQm9vbGVhbj4oKTsKKworCisJLyoqCisJICogVGhlc2UgYXJlIHRoZSBjeWNsZSBudW1iZXJzIHRoYXQgbWF0Y2ggdGhlIHJlbGF0aXZlIHZhbHVlcyB0aGF0IHdpbGwgYmUKKwkgKiBwbG90dGVkCisJICogCisJICogQHNlZSAjcmVsYXRpdmVWYWx1ZXMKKwkgKi8KKwlwcml2YXRlIGZpbmFsIExpc3Q8SW50ZWdlcj4gY3ljbGVOdW1iZXJzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCisJLyoqCisJICogQ2hhcnQgZ2VuZXJhdG9yIGluc3RhbmNlIChyZWZlcmVuY2UgdG8gYSBzaW5nbGV0b24pCisJICovCisJR2VuZXJhdG9yIGdyOworCisJQXhpcyB5QXhpc1ByaW1hcnk7CisJQXhpcyB4QXhpc1ByaW1hcnk7CisJLyoqCisJICogdGhlIG1heFkgdmFsdWUgZm9yIHNjYWxpbmcKKwkgKi8KKwlkb3VibGUgbWF4WSA9IC0xLjA7CisKKwkvKioKKwkgKiBMb2cgb2YgemVybyBpcyBuZWdhdGl2ZSBpbmZpbml0eSBzbyBmb3IgZWFjaCBsb2NhdGlvbiB3ZSB3aWxsIGN1dCBvZmYgdGhlIG1pbmltdW0gCisJICogYXQgdGhlIG1pbiBOT05aRVJPIFkgdmFsdWUKKwkgKi8KKwlwcml2YXRlIGRvdWJsZSBtaW5Zc2NhbGUgPSAxLjA7CisJCisJCisJLyoqCisJICogTGFiZWwgZm9yIGxpbmUgc2VyaWVzIExFR0VORAorCSAqLworCXB1YmxpYyBTdHJpbmcgT3JkaW5hdGVfTEVHRU5EID0gIlkiOworCQorCS8qKgorCSAqIExhYmVsIGZvciBsaW5lIHNlcmllcyBZIGF4aXMgbGFiZWwKKwkgKiovCisJcHVibGljIFN0cmluZyBPcmRpbmF0ZV9BWElTID0gIlkiOworCQorCisJLyoqCisJICogTGFiZWwgZm9yIGxpbmUgc2VyaWVzIFggYXhpcyBsYWJlbAorCSAqKi8KKwlwdWJsaWMgU3RyaW5nIFhfQVhJUyA9ICJYIjsKKwkKKwkvKiogCisJICogY3VzdG9taXphYmxlIGNvbG9yIGRlZmluaXRpb25zCisJICovCisJcHJpdmF0ZSBDb2xvckRlZmluaXRpb24gZm9yZUdyb3VuZCA9IENvbG9yRGVmaW5pdGlvbkltcGwuV0hJVEUoKTsKKwlwcml2YXRlIENvbG9yRGVmaW5pdGlvbiBiYWNrZ3JvdW5kR3JvdW5kID0gQ29sb3JEZWZpbml0aW9uSW1wbC5CTEFDSygpOworCXByaXZhdGUgQ29sb3JEZWZpbml0aW9uIGZyYW1lQ29sb3IgPSBDb2xvckRlZmluaXRpb25JbXBsLmNyZWF0ZSgxODAsIDE4MCwgMjAwKTsKKworCUltYWdlIGltZ0NoYXJ0ID0gbnVsbDsKKwkKKwkvKioKKwkgKiBUaGlzIENvbnN0cnVjdG9yIGlzIHVzZWQgd2hlbiB3ZSB3YW50IHRvIHBsYWNlIHRoZSB0aW1lIHNlcmllcyBpbiBhIGNvbnRhaW5lcgorCSAqIHdoaWNoIGlzIGEgc3ViIGNvbXBvbmVudCBvZiB0aGUgYWN0dWFsIEFuYWx5c2lzQ29udHJvbAorCSAqIEBwYXJhbSBhbmFseXNpc0NvbnRyb2wgCisJICogCisJICogQHBhcmFtIHBhcmVudCAgdGhlIFNXVCBwYXJlbnQgb2YgdGhlIHtAbGluayBXaWRnZXR9CisJICogQHBhcmFtIG9yZGluYXRlU3RyaW5nIAorCSAqIEBwYXJhbSB5QXhpc0xhYmVsIAorCSAqIEBwYXJhbSB4QXhpc0xhYmVsCisJICogQHBhcmFtIGZvcmVncm91bmQgCisJICogQHBhcmFtIGJhY2tncm91bmQgCisJICogQHBhcmFtIGZyYW1lY29sb3IgCisJICogQHBhcmFtIGNoYXJ0SW5kZXggdGhlIGluZGV4IG9mIHRoaXMgY2hhcnQgKDAgaWYgb25seSBvbmUpCisJICogQHBhcmFtIG92ZXJsYXlNb2RlIHVzZWQgaWYgd2UgbmVlZCB0byBvdmVybGF5IHRyYWNlcyBpbiBkaWZmZXJlbnQgY29sb3JzCisJICovCisJcHVibGljIFJ1bkhpc3RvcnlDYW52YXMoZmluYWwgQW5hbHlzaXNDb250cm9sIGFuYWx5c2lzQ29udHJvbCwgZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgCisJCQlmaW5hbCBTdHJpbmcgb3JkaW5hdGVTdHJpbmcsIAorCQkJZmluYWwgU3RyaW5nIHlBeGlzTGFiZWwsIAorCQkJZmluYWwgU3RyaW5nIHhBeGlzTGFiZWwsCisJCQlmaW5hbCBTdHJpbmcgZmlyc3RQcm9wZXJ0eSwKKwkJCUNvbG9yRGVmaW5pdGlvbiBmb3JlZ3JvdW5kLAorCQkJQ29sb3JEZWZpbml0aW9uIGJhY2tncm91bmQsCisJCQlDb2xvckRlZmluaXRpb24gZnJhbWVjb2xvciwKKwkJCWludCBjaGFydEluZGV4LAorCQkJYm9vbGVhbiBvdmVybGF5TW9kZQkpIHsKKwkJc3VwZXIocGFyZW50LCBTV1QuRE9VQkxFX0JVRkZFUkVEIHwgU1dULkJPUkRFUik7CisJCU9yZGluYXRlX0xFR0VORCA9IG9yZGluYXRlU3RyaW5nOworCQlPcmRpbmF0ZV9BWElTID0geUF4aXNMYWJlbDsKKwkJWF9BWElTID0geEF4aXNMYWJlbDsKKwkJZm9yZUdyb3VuZCAJCQk9IGZvcmVncm91bmQ7CisJCWJhY2tncm91bmRHcm91bmQgCT0gYmFja2dyb3VuZDsKKwkJZnJhbWVDb2xvciAJCQk9IGZyYW1lY29sb3I7CisJCXRoaXMuY2hhcnRJbmRleCA9IGNoYXJ0SW5kZXg7CisJCXRoaXMub3ZlcmxheU1vZGUgPSBvdmVybGF5TW9kZTsKKwkJCisJCWdyID0gR2VuZXJhdG9yLmluc3RhbmNlKCk7CisKKwkJdHJ5IHsKKwkJCWlkciA9IFBsdWdpblNldHRpbmdzLmluc3RhbmNlKCkuZ2V0RGV2aWNlKCJkdi5TV1QiKTsgLy8kTk9OLU5MUy0xJAkJCQorCQl9IGNhdGNoIChmaW5hbCBDaGFydEV4Y2VwdGlvbiBwZXgpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiUHJvYmxlbSBpbml0aWFsaXppbmcgY2hhcnQiLCBwZXgpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCX0KKworCQljb250cm9sID0gYW5hbHlzaXNDb250cm9sOworCisJCQorCQljbSA9IGNyZWF0ZVNpbXBsZUxpbmVDaGFydChmaXJzdFByb3BlcnR5LCBkYXRhU2VyaWVzTWFwLCBjeWNsZU51bWJlcnMsIE1lc3NhZ2VzCisJCQkJLmdldFN0cmluZygiQ0MudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCisJCXJlc2V0RGF0YSgpOworCQlhZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKGZpbmFsIFBhaW50RXZlbnQgcGUpIHsKKworCQkJCWZpbmFsIENvbXBvc2l0ZSBzb3VyY2UgPSAoQ29tcG9zaXRlKSBwZS5nZXRTb3VyY2UoKTsKKwkJCQlmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlIGQgPSBzb3VyY2UKKwkJCQkJCS5nZXRDbGllbnRBcmVhKCk7CisKKwkJCQlpZihpbWdDaGFydCAhPSBudWxsKSBpbWdDaGFydC5kaXNwb3NlKCk7CisJCQkJaW1nQ2hhcnQgPSBuZXcgSW1hZ2Uoc291cmNlLmdldERpc3BsYXkoKSwgZCk7CisJCQkJCisJCQkJaWRyLnNldFByb3BlcnR5KElEZXZpY2VSZW5kZXJlci5HUkFQSElDU19DT05URVhULCBuZXcgR0MoCisJCQkJCQlpbWdDaGFydCkpOworCQkJCWZpbmFsIEJvdW5kcyBib3VuZHMgPSBCb3VuZHNJbXBsLmNyZWF0ZShkLngsIGQueSwgZC53aWR0aCwKKwkJCQkJCWQuaGVpZ2h0KTsKKwkJCQlib3VuZHMuc2NhbGUoNzJkIC8gaWRyLmdldERpc3BsYXlTZXJ2ZXIoKS5nZXREcGlSZXNvbHV0aW9uKCkpOworCQkJCS8vIEJPVU5EUyBNVVNUIEJFIFNQRUNJRklFRCBJTiBQT0lOVFMKKworCQkJCXRyeSB7CisJCQkJCWdyLnJlbmRlcihpZHIsIGdyLmJ1aWxkKGlkci5nZXREaXNwbGF5U2VydmVyKCksIGNtLCBib3VuZHMsCisJCQkJCQkJbnVsbCwgbnVsbCwgbnVsbCkpOworCQkJCQlwZS5nYy5kcmF3SW1hZ2UoaW1nQ2hhcnQsIGQueCwgZC55KTsKKwkJCQl9IGNhdGNoIChmaW5hbCBDaGFydEV4Y2VwdGlvbiBjZSkgeworCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlByb2JsZW0gcmVuZGVyaW5nIGNoYXJ0IiwgY2UpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfSAvLyBwYWludENvbnRyb2wKKwkJfSAvLyBQYWludExpc3RlbmVyCisJCSk7CisJCQorCQkvL0NyZWF0ZSBhIGNvbnRleHQgbWVudSBmb3IgdGhlIGNhbnZhcworCQljcmVhdGVDb250ZXh0TWVudSh0aGlzKTsKKwkJCisKKwl9IC8vIFJ1bkhpc3RvcnlDYW52YXMKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50ICB0aGUgU1dUIHBhcmVudCBvZiB0aGUge0BsaW5rIFdpZGdldH0KKwkgKiBAcGFyYW0gb3JkaW5hdGVTdHJpbmcgCisJICogQHBhcmFtIHlBeGlzTGFiZWwgCisJICogQHBhcmFtIHhBeGlzTGFiZWwKKwkgKiBAcGFyYW0gZm9yZWdyb3VuZCAKKwkgKiBAcGFyYW0gYmFja2dyb3VuZCAKKwkgKiBAcGFyYW0gZnJhbWVjb2xvciAKKwkgKiBAcGFyYW0gY2hhcnRJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBjaGFydCAoMCBpZiBvbmx5IG9uZSkKKwkgKiAgCisJICovCisJcHVibGljIFJ1bkhpc3RvcnlDYW52YXMoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgCisJCQlmaW5hbCBTdHJpbmcgb3JkaW5hdGVTdHJpbmcsIAorCQkJZmluYWwgU3RyaW5nIHlBeGlzTGFiZWwsIAorCQkJZmluYWwgU3RyaW5nIHhBeGlzTGFiZWwsCisJCQlmaW5hbCBTdHJpbmcgZmlyc3RQcm9wZXJ0eSwKKwkJCUNvbG9yRGVmaW5pdGlvbiBmb3JlZ3JvdW5kLAorCQkJQ29sb3JEZWZpbml0aW9uIGJhY2tncm91bmQsCisJCQlDb2xvckRlZmluaXRpb24gZnJhbWVjb2xvciwKKwkJCWludCBjaGFydEluZGV4KSB7CisJCXN1cGVyKHBhcmVudCwgU1dULkRPVUJMRV9CVUZGRVJFRCB8IFNXVC5CT1JERVIpOworCQlPcmRpbmF0ZV9MRUdFTkQgPSBvcmRpbmF0ZVN0cmluZzsKKwkJT3JkaW5hdGVfQVhJUyA9IHlBeGlzTGFiZWw7CisJCVhfQVhJUyA9IHhBeGlzTGFiZWw7CisJCWZvcmVHcm91bmQgCQkJPSBmb3JlZ3JvdW5kOworCQliYWNrZ3JvdW5kR3JvdW5kIAk9IGJhY2tncm91bmQ7CisJCWZyYW1lQ29sb3IgCQkJPSBmcmFtZWNvbG9yOworCQl0aGlzLmNoYXJ0SW5kZXggPSBjaGFydEluZGV4OworCQkKKwkJZ3IgPSBHZW5lcmF0b3IuaW5zdGFuY2UoKTsKKworCQl0cnkgeworCQkJaWRyID0gUGx1Z2luU2V0dGluZ3MuaW5zdGFuY2UoKS5nZXREZXZpY2UoImR2LlNXVCIpOyAvLyROT04tTkxTLTEkCQkJCisJCX0gY2F0Y2ggKGZpbmFsIENoYXJ0RXhjZXB0aW9uIHBleCkgeworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJQcm9ibGVtIGluaXRpYWxpemluZyBjaGFydCIsIHBleCk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybjsKKwkJfQorCisJCWNvbnRyb2wgPSAoQW5hbHlzaXNDb250cm9sKSBwYXJlbnQ7CisKKwkJCisJCWNtID0gY3JlYXRlU2ltcGxlTGluZUNoYXJ0KGZpcnN0UHJvcGVydHksIGRhdGFTZXJpZXNNYXAsIGN5Y2xlTnVtYmVycywgTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJDQy50aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJcmVzZXREYXRhKCk7CisJCQorCQlhZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKGZpbmFsIFBhaW50RXZlbnQgcGUpIHsKKwkJCQkKKwkJCQlmaW5hbCBDb21wb3NpdGUgc291cmNlID0gKENvbXBvc2l0ZSkgcGUuZ2V0U291cmNlKCk7CisJCQkJZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSBkID0gc291cmNlCisJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpOworCisJCQkJaWYoaW1nQ2hhcnQgIT0gbnVsbCkgaW1nQ2hhcnQuZGlzcG9zZSgpOworCQkJCWltZ0NoYXJ0ID0gbmV3IEltYWdlKHNvdXJjZS5nZXREaXNwbGF5KCksIGQpOworCQkJCWlkci5zZXRQcm9wZXJ0eShJRGV2aWNlUmVuZGVyZXIuR1JBUEhJQ1NfQ09OVEVYVCwgbmV3IEdDKAorCQkJCQkJaW1nQ2hhcnQpKTsKKwkJCQlmaW5hbCBCb3VuZHMgYm91bmRzID0gQm91bmRzSW1wbC5jcmVhdGUoZC54LCBkLnksIGQud2lkdGgsCisJCQkJCQlkLmhlaWdodCk7CisJCQkJYm91bmRzLnNjYWxlKDcyZCAvIGlkci5nZXREaXNwbGF5U2VydmVyKCkuZ2V0RHBpUmVzb2x1dGlvbigpKTsKKwkJCQkvLyBCT1VORFMgTVVTVCBCRSBTUEVDSUZJRUQgSU4gUE9JTlRTCisKKwkJCQl0cnkgeworCQkJCQlnci5yZW5kZXIoaWRyLCBnci5idWlsZChpZHIuZ2V0RGlzcGxheVNlcnZlcigpLCBjbSwgYm91bmRzLAorCQkJCQkJCW51bGwsIG51bGwsIG51bGwpKTsKKwkJCQkJcGUuZ2MuZHJhd0ltYWdlKGltZ0NoYXJ0LCBkLngsIGQueSk7CisJCQkJfSBjYXRjaCAoZmluYWwgQ2hhcnRFeGNlcHRpb24gY2UpIHsKKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJQcm9ibGVtIHJlbmRlcmluZyBjaGFydCIsIGNlKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX0gLy8gcGFpbnRDb250cm9sCisJCX0gLy8gUGFpbnRMaXN0ZW5lcgorCQkpOworCQkKKwkJLy9DcmVhdGUgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSBjYW52YXMKKwkJY3JlYXRlQ29udGV4dE1lbnUodGhpcyk7CisJCQorCisJfSAvLyBSdW5IaXN0b3J5Q2FudmFzCisKKwkKKwkKKwkvKioKKwkgKiBUaGUgbWV0aG9kIHdoaWNoIGdldHMgdGhlIHtAbGluayBSdW5IaXN0b3J5Q2FudmFzfScgcmVwb3J0cyBsaXN0LCBhbmQKKwkgKiBkcmF3cyBpdCBvbiB0aGUge0BsaW5rIFJ1bkhpc3RvcnlDYW52YXN9LgorCSAqIEByZXR1cm4gaW50ZWdyYXRlZERpZmZlcmVuY2UgZm9yIGVhY2ggbGluZSBzZXJpZXMKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBkcmF3KCkgeworCQkKKwkJLy9jbGVhckRhdGEoKTsKKwkJcmVzZXREYXRhKCk7CisJCXlBeGlzUHJpbWFyeS5nZXRTZXJpZXNEZWZpbml0aW9ucygpLmNsZWFyKCk7CisJCQorCQkvLyBnZXQgdGhlIG51bWJlciBvZiBsaW5lcyB0byBwbG90IGZvciB0aGlzIHR5cGUgb2YgY2hhcnQKKwkJaW50IG1heExpbmVzID0gY29udHJvbC5nZXROdW1Qcm9wZXJ0aWVzKGNoYXJ0SW5kZXgpOworCQorCQkvLyBhZGQgYWxsIHRoZSByZXN0IG9mIHRoZSBsaW5lIHNlcmllcyBub3cKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhMaW5lczsgaSArKykgeworCQkJU3RyaW5nIHByb3BlcnR5ID0gY29udHJvbC5nZXRQcm9wZXJ0eShjaGFydEluZGV4LGkpOworCQkJCisJCQlpZighZGF0YVNlcmllc01hcC5jb250YWluc0tleShwcm9wZXJ0eSkpIHsKKwkJCQkvLyBuZXcgcHJvcGVydHkKKwkJCQlEYXRhU2VyaWVzIHNlcmllcyA9IG5ldyBEYXRhU2VyaWVzKHByb3BlcnR5LCBpLCBvdmVybGF5TW9kZSk7CisJCQkJaWYodmlzaWJsZU1hcC5jb250YWluc0tleShwcm9wZXJ0eSkpCisJCQkJCQlzZXJpZXMuc2V0VmlzaWJsZSh2aXNpYmxlTWFwLmdldChwcm9wZXJ0eSkpOworCQkJCWVsc2UgeworCQkJCQlzZXJpZXMuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCQkJdmlzaWJsZU1hcC5wdXQocHJvcGVydHksIHRydWUpOworCQkJCX0KKwkJCQkKKwkJCQlkYXRhU2VyaWVzTWFwLnB1dChwcm9wZXJ0eSwgc2VyaWVzKTsKKwkJCX0KKwkJCURhdGFTZXJpZXMgc2VyaWVzID0gZGF0YVNlcmllc01hcC5nZXQocHJvcGVydHkpOworCQkJc2VyaWVzLnNob3coKTsKKwkJCQorCQl9CisJCQorCQkvLyB1cGRhdGUgdGhlIGNvbnRleHQgbWVudSB3aXRoIHRoZSBuZXcgcHJvcGVydGllcyB0byBwbG90CisJCS8vdXBkYXRlQ29udGV4dE1lbnUodGhpcyk7CisJCQorCQltYXhZID0gLTEuMDsKKwkJCisJCQlib29sZWFuIHNldEN5Y2xlcyA9IGZhbHNlOworCQkJLy8gR2V0IHRoZSB2YWx1ZXMgZm9yIHRoZSBwcm9wZXJ0eSB0byBiZSBwbG90dGVkCisJCQlpbnQgbWF4UG9pbnRzID0gMDsKKwkJCQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhMaW5lczsgaSsrKSB7CisJCQkJU3RyaW5nIHByb3BlcnR5ID0gY29udHJvbC5nZXRQcm9wZXJ0eShjaGFydEluZGV4LGkpOworCQkJCWRvdWJsZVtdIGRvdWJsZVZhbHVlcyA9IGNvbnRyb2wuZ2V0VmFsdWVzKGNoYXJ0SW5kZXgsaSk7CisJCQkJaWYoZG91YmxlVmFsdWVzPT1udWxsKSB7CisJCQkJCWRvdWJsZVZhbHVlcyA9IG5ldyBkb3VibGVbMF07CisJCQkJCS8vZG91YmxlVmFsdWVzWzBdID0gMDsKKwkJCQl9CisJCQkJRGF0YVNlcmllcyBzZXJpZXMgPSBkYXRhU2VyaWVzTWFwLmdldChwcm9wZXJ0eSk7CisJCQkJCisJCQkJaWYoZGF0YVNlcmllc01hcC5nZXQocHJvcGVydHkpLmlzVmlzaWJsZSgpID09IHRydWUpIHsgCisJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZG91YmxlVmFsdWVzLmxlbmd0aDsgaisrKSB7CisJCQkJCQkKKwkJCQkJCQorCQkJCQkJaWYoZG91YmxlVmFsdWVzW2pdIDw9IG1pbllzY2FsZSkgeworCQkJCQkJCWlmKGRvdWJsZVZhbHVlc1tqXSA+IDAuMCkgbWluWXNjYWxlID0gZG91YmxlVmFsdWVzW2pdOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlpZihkb3VibGVWYWx1ZXNbal0gPj0gbWF4WSkgeworCQkJCQkJCW1heFkgPSBkb3VibGVWYWx1ZXNbal07CisJCQkJCQkJZG91YmxlIGxvZyA9IE1hdGguZmxvb3IoTWF0aC5sb2cxMChtYXhZKSk7CisJCQkJCQkJZG91YmxlIGFkanVzdGVkTWF4ID0gKE1hdGguY2VpbChtYXhZL01hdGgucG93KDEwLCBsb2cpKSkqTWF0aC5wb3coMTAsIGxvZyk7CisJCQkJCQkgICAgaWYoYWRqdXN0ZWRNYXggPD0gMS4wKSBhZGp1c3RlZE1heCA9IDEuMDsKKwkJCQkJCSAgICAvL2FkanVzdGVkTWF4ID0gbWF4WSoxMDAuMDsKKwkJCQkJCSAgICAvL2FkanVzdGVkTWF4ICs9IDEuMDsKKwkJCQkJCSAgICAvL2ludCBteCA9IChpbnQpYWRqdXN0ZWRNYXg7CisJCQkJCQkgICAgLy9hZGp1c3RlZE1heCA9ICgoZG91YmxlKW14KS8xMDAuMDsKKwkJCQkJCQlpZiAodXNlTGluZWFyVGltZVNjYWxlKSB7CisJCQkJCQkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKGFkanVzdGVkTWF4KSk7CisJCQkJCQkJCWRvdWJsZSBzdGVwID0gYWRqdXN0ZWRNYXggLyAxMC4wOworCQkJCQkJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRTdGVwKHN0ZXApOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8vIGtlZXAgMiBzaWduaWZpY2FudCBmaWd1cmVzIG9uIHNjYWxlIGF4aXMKKwkJCQkJCQkJZG91YmxlIHltYXggPSBNYXRoLmxvZyhhZGp1c3RlZE1heCk7CisJCQkJCQkJCWlmKGFkanVzdGVkTWF4ID4gMS4wKSB7CisJCQkJCQkJCQl5bWF4ICs9IDAuNDk5OworCQkJCQkJCQkJbG9uZyBpbWF4ID0gTWF0aC5yb3VuZCh5bWF4KTsKKwkJCQkJCQkJCXltYXggPSBpbWF4OworCQkJCQkJCQl9CisJCQkJCQkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKHltYXgpKTsKKwkJCQkJCQkJZG91YmxlIHN0ZXAgPSB5bWF4LzEwLjA7CisJCQkJCQkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldFN0ZXAoc3RlcCk7CisJCQkJCQkJfQorCQkJCQkJCQorCQkJCQkJCQorCQkJCQkJfQorCQkJCQl9CisJCQkJfSAvLyBpcyB2aXNpYmxlCisJCQkJCisJCQkJCS8vIEFueSB2YWx1ZXM/CisJCQkJCWlmIChkb3VibGVWYWx1ZXMubGVuZ3RoID4gMCkgeworCQkJCQkJaWYgKG1heFBvaW50cyA8IGRvdWJsZVZhbHVlcy5sZW5ndGgpIHsKKwkJCQkJCQltYXhQb2ludHMgPSBkb3VibGVWYWx1ZXMubGVuZ3RoOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlmb3IgKGludCBjeWNsZU51bWJlciA9IDA7IGN5Y2xlTnVtYmVyIDwgZG91YmxlVmFsdWVzLmxlbmd0aDsgY3ljbGVOdW1iZXIrKykgeworCQkJCQkJCQorCQkJCQkJCURvdWJsZSB2YWx1ZTsKKwkJCQkJCQlkb3VibGUgZGlzcGxheVZhbHVlID0gZG91YmxlVmFsdWVzW2N5Y2xlTnVtYmVyXTsKKwkJCQkJCQlpZiAoZGlzcGxheVZhbHVlIDw9IG1pbllzY2FsZSkgeworCQkJCQkJCQkvLyBMb2coMC4wKSBpcyBuZWdhdGl2ZSBpbmZpbml0eSBzbyBmb3IgZGlzcGxheSBwdXJwb3NlcyBvbmx5CisJCQkJCQkJCS8vIHdlIHNldCB0aGUgbWluaW11bSBheGlzIHZhbHVlIGF0IDAuMS9QT1BVTEFUSU9OCisJCQkJCQkJCWRpc3BsYXlWYWx1ZSA9IG1pbllzY2FsZTsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKHVzZUxpbmVhclRpbWVTY2FsZSkgeworCQkJCQkJCQl2YWx1ZSA9IG5ldyBEb3VibGUoZGlzcGxheVZhbHVlKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQl2YWx1ZSA9IG5ldyBEb3VibGUoTWF0aC5sb2coZGlzcGxheVZhbHVlKSk7CisJCQkJCQkJfQorCQkJCQkJCQorCisJCQkJCQkJc2VyaWVzLmFkZFZhbHVlKHZhbHVlKTsKKwkJCQkJCQkKKwkJCQkJCQkvLyBvbmx5IGRvIG9uY2UgZm9yIGZpcnN0IGxpbmUgc2VyaWVzCisJCQkJCQkJaWYgKCFzZXRDeWNsZXMpIHsKKwkJCQkJCQkJY3ljbGVOdW1iZXJzLmFkZChJbnRlZ2VyLnZhbHVlT2YoY3ljbGVOdW1iZXIpKTsJCisJCQkJCQkJCX0KKwkJCQkJCX0gLy8gZm9yIGN5Y2xlTnVtYmVyCisJCQkJCQkKKwkJCQkJCWlmKHhBeGlzUHJpbWFyeS5nZXRTZXJpZXNEZWZpbml0aW9ucygpLmdldCgwKS5nZXRTZXJpZXMoKS5zaXplKCkgIT0gY3ljbGVOdW1iZXJzLnNpemUoKSkgeworCQkJCQkJCS8vIFRoZSBudW1iZXIgb2YgZGF0YSBwb2ludHMgaGF2ZSBjaGFuZ2VkLCBjcmVhdGUgYSBuZXcgc2VyaWVzIGZvciB0aGUgeCBheGlzCisJCQkJCQkJeEF4aXNQcmltYXJ5LmdldFNlcmllc0RlZmluaXRpb25zKCkuY2xlYXIoKTsKKwkJCQkJCQlmaW5hbCBTZXJpZXMgeEF4aXNTZXJpZXMgPSBTZXJpZXNJbXBsLmNyZWF0ZSgpOworCisJCQkJCQkJZmluYWwgTnVtYmVyRGF0YVNldCB4VmFsdWVzID0gTnVtYmVyRGF0YVNldEltcGwuY3JlYXRlKGN5Y2xlTnVtYmVycyk7CisJCQkJCQkJeEF4aXNTZXJpZXMuc2V0RGF0YVNldCh4VmFsdWVzKTsKKwkJCQkJCQlmaW5hbCBTZXJpZXNEZWZpbml0aW9uIHNkWCA9IFNlcmllc0RlZmluaXRpb25JbXBsLmNyZWF0ZSgpOworCisJCQkJCQkJeEF4aXNQcmltYXJ5LmdldFNlcmllc0RlZmluaXRpb25zKCkuYWRkKHNkWCk7CisJCQkJCQkJc2RYLmdldFNlcmllcygpLmFkZCh4QXhpc1Nlcmllcyk7CisJCQkJCQl9CisJCQkJCQkJCisJCQkJCQkKKwkJCQkJCXNldEN5Y2xlcyA9IHRydWU7IC8vIHdlIHNldCB0aGVtIG9ubHkgb25jZQorCQkJCQkJCisJCQkJCX0gZWxzZSB7CisJCQkJCQkvL3Jlc2V0RGF0YSgpOworCQkJCQl9CisJCQl9IC8vIGZvciBpIHByb3BlcnRpZXMKKworCisJCWlmICghdGhpcy5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXJlZHJhdygpOworCQl9CisJCQorCQkKKwkJLy8JY29udHJvbC51cGRhdGVNZXNzYWdlKFNjZW5hcmlvQW5hbHlzaXNTdWl0ZS5XT1JLSU5HX01TRyk7CisJCQorCX0gLy8gcGFpbnRDb250cm9sCisKKwkvKioKKwkgKiBAcGFyYW0gZGF0YVNlcmllc01hcAorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBMaXN0fSB0aGF0IHdpbGwgY29udGFpbiB0aGUgcmVsYXRpdmUgdmFsdWVzCisJICogICAgICAgICAgICAoMC4wLTEuMCkgdG8gcGxvdAorCSAqIEBwYXJhbSBjeWNsZU51bWJlcnMKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgTGlzdH0gb2Ygc2ltdWxhdGlvbiBjeWNsZSBudW1iZXJzIHRoYXQgbWF0Y2ggdGhlCisJICogICAgICAgICAgICByZWxhdGl2ZSB2YWx1ZXMKKwkgKiBAcGFyYW0gc2VyaWVzSWRlbnRpZmllcgorCSAqICAgICAgICAgICAgdGhlIHRpdGxlIG9mIHRoZSBjaGFydAorCSAqIEByZXR1cm4gYSA8Y29kZT5DaGFydDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgZmluYWwgQ2hhcnQgY3JlYXRlU2ltcGxlTGluZUNoYXJ0KAorCQkJZmluYWwgU3RyaW5nIGZpcnN0UHJvcGVydHksCisJCQlmaW5hbCBNYXA8U3RyaW5nLCBEYXRhU2VyaWVzPiBkYXRhU2VyaWVzTWFwLAorCQkJZmluYWwgTGlzdDxJbnRlZ2VyPiBjeWNsZU51bWJlcnMsIGZpbmFsIFN0cmluZyBzZXJpZXNJZGVudGlmaWVyKSB7CisJCQorCQlmaW5hbCBDaGFydFdpdGhBeGVzIHJldFZhbHVlID0gQ2hhcnRXaXRoQXhlc0ltcGwuY3JlYXRlKCk7CisKKwkJCisJCS8vIFBsb3QKKwkJcmV0VmFsdWUuZ2V0QmxvY2soKS5zZXRCYWNrZ3JvdW5kKGZyYW1lQ29sb3IpOworCQlmaW5hbCBQbG90IHAgPSByZXRWYWx1ZS5nZXRQbG90KCk7CisJCXAuZ2V0Q2xpZW50QXJlYSgpLnNldEJhY2tncm91bmQoYmFja2dyb3VuZEdyb3VuZCk7CisKKwkJLy8gVGl0bGUKKwkJLy8gY3dhTGluZS5nZXRUaXRsZSggKS5nZXRMYWJlbCggKS5nZXRDYXB0aW9uKCApLnNldFZhbHVlKCAiTGluZSBDaGFydCIKKwkJLy8gKTsvLyROT04tTkxTLTEkCisJCXJldFZhbHVlLmdldFRpdGxlKCkuc2V0VmlzaWJsZShmYWxzZSk7CisKKwkJLy8gTGVnZW5kCisJCWxlZ2VuZCA9IHJldFZhbHVlLmdldExlZ2VuZCgpOworCQlmaW5hbCBMaW5lQXR0cmlidXRlcyBsaWEgPSBsZWdlbmQuZ2V0T3V0bGluZSgpOworCQlsZWdlbmQuZ2V0VGV4dCgpLmdldEZvbnQoKS5zZXRTaXplKDgpOworCQlsaWEuc2V0U3R5bGUoTGluZVN0eWxlLlNPTElEX0xJVEVSQUwpOworCQlsZWdlbmQuZ2V0SW5zZXRzKCkuc2V0KDEwLCA1LCAwLCAwKTsKKwkJbGVnZW5kLmdldE91dGxpbmUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJbGVnZW5kLnNldEFuY2hvcihBbmNob3IuTk9SVEhfTElURVJBTCk7CisJCWxlZ2VuZC5zZXRQb3NpdGlvbihQb3NpdGlvbi5CRUxPV19MSVRFUkFMKTsKKwkJbGVnZW5kLmdldFRleHQoKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJbGVnZW5kLmdldE91dGxpbmUoKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJCisJCS8vIGN3YUxpbmUuZ2V0TGVnZW5kKCApLmdldFRleHQoKS5nZXRGb250KCkuc2V0U2l6ZSgxNik7OworCQkvLyBjd2FMaW5lLmdldExlZ2VuZCggKS5zZXRWaXNpYmxlKCB0cnVlICk7CisKKwkJLy8gLy8vLy8vLy8vCisJCS8vIFgtQXhpcworCQl4QXhpc1ByaW1hcnkgPSByZXRWYWx1ZS5nZXRQcmltYXJ5QmFzZUF4ZXMoKVswXTsKKwkJeEF4aXNQcmltYXJ5LnNldFR5cGUoQXhpc1R5cGUuVEVYVF9MSVRFUkFMKTsKKwkJeEF4aXNQcmltYXJ5LmdldE1ham9yR3JpZCgpLnNldFRpY2tTdHlsZShUaWNrU3R5bGUuQkVMT1dfTElURVJBTCk7CisJCXhBeGlzUHJpbWFyeS5nZXRPcmlnaW4oKS5zZXRUeXBlKEludGVyc2VjdGlvblR5cGUuVkFMVUVfTElURVJBTCk7CisJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLnNldFZpc2libGUoZmFsc2UpOworCQl4QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5nZXRDYXB0aW9uKCkuZ2V0Rm9udCgpLnNldFNpemUoOSk7CisJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLmdldENhcHRpb24oKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJeEF4aXNQcmltYXJ5LmdldExhYmVsKCkuZ2V0Q2FwdGlvbigpLnNldENvbG9yKGZvcmVHcm91bmQpOworCisJCWZpbmFsIFNlcmllcyB4QXhpc1NlcmllcyA9IFNlcmllc0ltcGwuY3JlYXRlKCk7CisKKwkJLy8gbmV3IGNvbG9ycworCQl4QXhpc1Nlcmllcy5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJeEF4aXNTZXJpZXMuZ2V0TGFiZWwoKS5nZXRPdXRsaW5lKCkuc2V0Q29sb3IoZm9yZUdyb3VuZCk7CisJCS8vCQorCisJCWZpbmFsIE51bWJlckRhdGFTZXQgeFZhbHVlcyA9IE51bWJlckRhdGFTZXRJbXBsLmNyZWF0ZShjeWNsZU51bWJlcnMpOworCQl4QXhpc1Nlcmllcy5zZXREYXRhU2V0KHhWYWx1ZXMpOworCQlmaW5hbCBTZXJpZXNEZWZpbml0aW9uIHNkWCA9IFNlcmllc0RlZmluaXRpb25JbXBsLmNyZWF0ZSgpOworCisJCXhBeGlzUHJpbWFyeS5nZXRTZXJpZXNEZWZpbml0aW9ucygpLmFkZChzZFgpOworCQlzZFguZ2V0U2VyaWVzKCkuYWRkKHhBeGlzU2VyaWVzKTsKKworCQkvLyAvLy8vLy8vLworCQkvLyBZLUF4aXMKKwkJeUF4aXNQcmltYXJ5ID0gcmV0VmFsdWUuZ2V0UHJpbWFyeU9ydGhvZ29uYWxBeGlzKHhBeGlzUHJpbWFyeSk7CisJCXlBeGlzUHJpbWFyeS5nZXRNYWpvckdyaWQoKS5zZXRUaWNrU3R5bGUoVGlja1N0eWxlLkxFRlRfTElURVJBTCk7CisKKwkJLy8gTnVtYmVyRGF0YVNldFtdIG9ydGhvVmFsdWVzID0gbmV3IE51bWJlckRhdGFTZXRbTUFYX0xJTkVTXTsKKwkJLy8gU2VyaWVzRGVmaW5pdGlvbltdIHNkWSA9IG5ldyBTZXJpZXNEZWZpbml0aW9uW01BWF9MSU5FU107CisKKwkJLy8gZW5kIFktU2VyaWVzCisKKwkJeEF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWluKE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoMC4wKSk7CisJCS8vIHhBeGlzUHJpbWFyeS5nZXRTY2FsZSggKS5zZXRNYXgoIE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoIDEwLjAgKQorCQkvLyApOworCQkvLyB4QXhpc1ByaW1hcnkuZ2V0U2NhbGUoICkuc2V0U3RlcCggMSApOworCQl4QXhpc1ByaW1hcnkuZ2V0TGFiZWwoKS5nZXRDYXB0aW9uKCkuZ2V0Rm9udCgpLnNldFNpemUoOSk7CisJCXhBeGlzUHJpbWFyeS5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuc2V0VmlzaWJsZSh0cnVlKTsKKwkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuZ2V0Q2FwdGlvbigpLnNldFZhbHVlKFhfQVhJUyk7CisKKwkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWluKE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoMC4wKSk7CisJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDEuMCkpOworCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRTdGVwKDAuMjUpOworCQl5QXhpc1ByaW1hcnkuZ2V0TGFiZWwoKS5nZXRDYXB0aW9uKCkuZ2V0Rm9udCgpLnNldFNpemUoOSk7CisJCXlBeGlzUHJpbWFyeS5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJeUF4aXNQcmltYXJ5LmdldFRpdGxlKCApLmdldENhcHRpb24oICkuc2V0VmFsdWUoIE9yZGluYXRlX0FYSVMgKTsKKwkJeUF4aXNQcmltYXJ5LmdldFRpdGxlKCApLnNldFZpc2libGUodHJ1ZSk7CisJCS8vIHlBeGlzUHJpbWFyeS5nZXRNYWpvckdyaWQoKS5nZXRMaW5lQXR0cmlidXRlcygpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQkKKwkJLy8gZm9yIG5vdyBnZXQgcmVhZHkgdG8gY3JlYXRlIG9ubHkgb25lIGxpbmUgLSB3ZSBoYXZlIG5vIGRhdGEgeWV0LgorCQkvLyB3ZSB3aWxsIGFkZCBtb3JlIGxpbmVzIGFzIHdlIG5lZWQgdGhlbQorCQkvLyBoYW5kbGUgbnVsbAorCQlpZighZGF0YVNlcmllc01hcC5jb250YWluc0tleShmaXJzdFByb3BlcnR5KSkgeworCQkJRGF0YVNlcmllcyBzZXJpZXMgPSBuZXcgRGF0YVNlcmllcyhNZXNzYWdlcy5nZXRTdHJpbmcoIkFVVE8uVElUTEUxIiksIDAsIG92ZXJsYXlNb2RlKTsKKwkJCWRhdGFTZXJpZXNNYXAucHV0KGZpcnN0UHJvcGVydHksIHNlcmllcyk7CisJCX0KKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVTaW1wbGVMaW5lQ2hhcnQKKworCQorCS8qKgorCSAqIENyZWF0ZSB0aGUgdmlldydzIGNvbnRleHQgbWVudSBhbmQgYWRkIHRoZSBhY3Rpb24gaGFuZGxlcnMgdG8gaXQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCS8vIEluaXQgYSBDb250ZXh0IE1lbnUgTWFuYWdlcgorCQlmaW5hbCBNZW51TWFuYWdlciBjb250ZXh0TWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlsaW5lYXJUaW1lQWN0aW9uID0gbmV3IExpbmVhclNjYWxlQWN0aW9uKCk7CisJCWxvZ1RpbWVBY3Rpb24gPSBuZXcgTG9nU2NhbGVBY3Rpb24oKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChsaW5lYXJUaW1lQWN0aW9uKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChsb2dUaW1lQWN0aW9uKTsKKworCisJCQorCQkvLyBQbGFjZSBIb2xkZXIgZm9yIE1lbnUgQWRkaXRpb25zCisJCWNvbnRleHRNZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigKKwkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkKKwkJdmlld0xlZ2VuZCA9IG5ldyBMZWdlbmRWaWV3QWN0aW9uKCk7CisJCWhpZGVMZWdlbmQgPSBuZXcgTGVnZW5kSGlkZUFjdGlvbigpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKHZpZXdMZWdlbmQpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGhpZGVMZWdlbmQpOworCQkKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQorCQkKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQlwb3BVcE1lbnUgPSBjb250ZXh0TWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUocGFyZW50KTsKKworCQkvLyBTZXQgdGhlIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlcgorCQlwYXJlbnQuc2V0TWVudShwb3BVcE1lbnUpOworCisJfSAvLyBjcmVhdGVDb250ZXh0TWVudQorCQorCS8qKgorCSAqIFVwZGF0ZSB0aGUgdmlldydzIGNvbnRleHQgbWVudSBhbmQgYWRkIHRoZSBhY3Rpb24gaGFuZGxlcnMgdG8gaXQuCisJICovCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbnRleHRNZW51KGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlwb3BVcE1lbnUuZGlzcG9zZSgpOworCisJCS8vIEluaXQgYSBDb250ZXh0IE1lbnUgTWFuYWdlcgorCQlmaW5hbCBNZW51TWFuYWdlciBjb250ZXh0TWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlsaW5lYXJUaW1lQWN0aW9uID0gbmV3IExpbmVhclNjYWxlQWN0aW9uKCk7CisJCWxvZ1RpbWVBY3Rpb24gPSBuZXcgTG9nU2NhbGVBY3Rpb24oKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChsaW5lYXJUaW1lQWN0aW9uKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChsb2dUaW1lQWN0aW9uKTsKKwkJCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCisJCXZpZXdMZWdlbmQgPSBuZXcgTGVnZW5kVmlld0FjdGlvbigpOworCQloaWRlTGVnZW5kID0gbmV3IExlZ2VuZEhpZGVBY3Rpb24oKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZCh2aWV3TGVnZW5kKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChoaWRlTGVnZW5kKTsKKwkJCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkKKwkJCisJCS8vIFBsYWNlIEhvbGRlciBmb3IgTWVudSBBZGRpdGlvbnMKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKAorCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CisKKwkJCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBhZGQgdGhlIGRpc3BsYXlhYmxlIHByb3BlcnRpZXMKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9sLmdldE51bVByb3BlcnRpZXMoY2hhcnRJbmRleCk7IGkgKyspIHsKKwkJCQorCQkJU3RyaW5nIG5leHRQcm9wID0gY29udHJvbC5nZXRQcm9wZXJ0eShjaGFydEluZGV4LGkpOworCQkJRGF0YVNlcmllcyBzZXJpZXMgPSBkYXRhU2VyaWVzTWFwLmdldChuZXh0UHJvcCk7CisJCQlEaXNwbGF5YWJsZVByb3BlcnR5IHByb3BlcnR5ID0gbmV3IERpc3BsYXlhYmxlUHJvcGVydHkobmV4dFByb3AsIHNlcmllcy5pc1Zpc2libGUoKSk7CisJCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKHByb3BlcnR5KTsKKwkJfQorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCS8vIFBsYWNlIEhvbGRlciBmb3IgTWVudSBBZGRpdGlvbnMKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKAorCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJZmluYWwgTWVudSBwb3BVcE1lbnUgPSBjb250ZXh0TWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUocGFyZW50KTsKKworCQkvLyBTZXQgdGhlIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlcgorCQlwYXJlbnQuc2V0TWVudShwb3BVcE1lbnUpOworCisKKwl9IC8vIHVwZGF0ZUNvbnRleHRNZW51CisKKworCQorCS8qKgorCSAqIFNldHMgdGhlIGNvbG9ycyBmb3IgYSBuIGFycmF5IG9mIExpbmVTZXJpZXMgZ2l2ZW4gdGhlIHByb3BlcnR5IHRvIFBsb3QKKwkgKiBmb3IgZWFjaC4gVHJ5IHRvIHNldCBjb2xvciBmcm9tIHRoZSBwcmVmZXJlbmNlcyAoaWYgc3BlY2lmaWVkIGZvciB0aGF0CisJICogcHJvcGVydHkpIG90aGVyd2lzZSBzZXRzIGxpbmUgY29sb3IgdG8gYmx1ZS4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvcGVydGllc1RvUGxvdAorCSAqIEBwYXJhbSBsc0xpc3QKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29sb3JEZWZzKAorCQkJZmluYWwgTGlzdDxTdHJpbmc+IHByb3BlcnRpZXNUb1Bsb3QsCisJCQlmaW5hbCBMaXN0PExpbmVTZXJpZXM+IGxzTGlzdCkgeworCQkvLyB0aGUgZGVmYXVsdCBsaW5lIGNvbG9yCisKKwkJLy8gaWYgcG9zc2libGUgZ2V0IGNvbG9yIGZyb20gcHJlZmVyZW5jZXMKKwkJZmluYWwgTWFwPFN0cmluZywgQ29sb3I+IGNvbG9yTWFwID0gVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlCisJCQkJLmdldENvbG9yTWFwcGluZygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxzTGlzdC5zaXplKCk7IGkrKykgeworCQkJQ29sb3JEZWZpbml0aW9uIGNvbG9yID0gQ29sb3JEZWZpbml0aW9uSW1wbC5CTFVFKCk7CisKKwkJCWlmICgocHJvcGVydGllc1RvUGxvdCAhPSBudWxsKSAmJiAocHJvcGVydGllc1RvUGxvdC5zaXplKCkgPiBpKSkgeworCQkJCWZpbmFsIFN0cmluZyBrZXkgPSBwcm9wZXJ0aWVzVG9QbG90LmdldChpKTsKKwkJCQkvLyBsb29rIG9yIHRoZSBwcmVmZXJlbmNlIGNvbG9yIGJ5IG5hbWUKKwkJCQlpZiAoY29sb3JNYXAuY29udGFpbnNLZXkoa2V5KSkgeworCQkJCQlmaW5hbCBDb2xvciBjID0gY29sb3JNYXAuZ2V0KGtleSk7CisJCQkJCWNvbG9yID0gQ29sb3JEZWZpbml0aW9uSW1wbC5jcmVhdGUoYy5nZXRSZWQoKSwKKwkJCQkJCQljLmdldEdyZWVuKCksIGMuZ2V0Qmx1ZSgpKTsKKwkJCQl9CisJCQkJbHNMaXN0LmdldChpKS5zZXRTZXJpZXNJZGVudGlmaWVyKGtleSk7CisJCQkJbHNMaXN0LmdldChpKS5nZXRMaW5lQXR0cmlidXRlcygpLnNldENvbG9yKGNvbG9yKTsKKwkJCX0gZWxzZSB7CisKKwkJCQlpZiAobHNMaXN0LmdldChpKSAhPSBudWxsKSB7CisJCQkJCWxzTGlzdC5nZXQoaSkuc2V0U2VyaWVzSWRlbnRpZmllcigiICIpOworCQkJCQlsc0xpc3QuZ2V0KGkpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoY29sb3IpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm47CisJfS8vIGdldENvbG9yRGVmCisKKworCQorCisJLyoqCisJICogRGlzcG9zZXMgdGhlIENvbG9yIG9iamVjdHMKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJLyoqCisJICogcmVzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJcmVzZXREYXRhKCk7CisJCXJlZHJhdygpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHJlc2V0RGF0YSgpIHsKKwkJY2xlYXJEYXRhKCk7CisJCisJCWN5Y2xlTnVtYmVycy5hZGQoSW50ZWdlci52YWx1ZU9mKDApKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjbGVhckRhdGEoKSB7CisJCQorCQlkYXRhU2VyaWVzTWFwLmNsZWFyKCk7CisJCWN5Y2xlTnVtYmVycy5jbGVhcigpOworCX0KKworCQorCS8qKgorCSAqIHRvZ2dsZSB0aGUgc2NhbGUgZnJvbSBsb2dhcml0aG1pYyB0byBsaW5lYXIKKwkgKi8KKwl2b2lkIHRvZ2dsZUF4aXNTY2FsZSgpIHsKKwkJaWYgKHVzZUxpbmVhclRpbWVTY2FsZSkgeyAvL1N3aXRjaCB0byBsb2dhcml0aG1pYyBzY2FsZQorCQkJbG9nVGltZUFjdGlvbi5zZXRDaGVja2VkKHRydWUpOworCQkJbGluZWFyVGltZUFjdGlvbi5zZXRDaGVja2VkKGZhbHNlKTsKKwkJCS8vSnVzdCB1c2luZyB0aGUgZm9sbG93aW5nIGF4aXMgdHlwZSwgdG8gbW92ZSB0byBsb2cgc2NhbGUsIGRpZG4ndCB3b3JrCisJCQkvL3lBeGlzUHJpbWFyeS5zZXRUeXBlKEF4aXNUeXBlLkxPR0FSSVRITUlDX0xJVEVSQUwpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWluKG51bGwpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWF4KG51bGwpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkudW5zZXRTdGVwKCk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS51bnNldFN0ZXBOdW1iZXIoKTsKKwkJfQorCQllbHNlIHsgLy9Td2l0Y2ggdG8gbGluZWFyIHNjYWxlCisJCQlsb2dUaW1lQWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOworCQkJbGluZWFyVGltZUFjdGlvbi5zZXRDaGVja2VkKHRydWUpOworCQkJLy95QXhpc1ByaW1hcnkuc2V0VHlwZShBeGlzVHlwZS5MSU5FQVJfTElURVJBTCk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNaW4oTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZSgwLjApKTsKKwkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDEuMCkpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0U3RlcCgwLjI1KTsKKwkJfQorCQl1c2VMaW5lYXJUaW1lU2NhbGUgPSAhdXNlTGluZWFyVGltZVNjYWxlOworCQlkcmF3KCk7CisJfQorCQorCisJLyoqCisJICogdG9nZ2xlIHRoZSBzY2FsZSBmcm9tIGxvZ2FyaXRobWljIHRvIGxpbmVhcgorCSAqLworCXZvaWQgdG9nZ2xlTGVnZW5kKCkgeworCQlpZiAoc2hvd0xlZ2VuZCkgeyAvL1N3aXRjaCB0byBoaWRlCisJCQl2aWV3TGVnZW5kLnNldENoZWNrZWQoZmFsc2UpOworCQkJaGlkZUxlZ2VuZC5zZXRDaGVja2VkKHRydWUpOworCQkJbGVnZW5kLnNldFZpc2libGUoZmFsc2UpOworCQl9CisJCWVsc2UgeyAvL1N3aXRjaCB0byB2aWV3CisJCQl2aWV3TGVnZW5kLnNldENoZWNrZWQodHJ1ZSk7CisJCQloaWRlTGVnZW5kLnNldENoZWNrZWQoZmFsc2UpOworCQkJbGVnZW5kLnNldFZpc2libGUodHJ1ZSk7CisJCX0KKwkJc2hvd0xlZ2VuZCA9ICFzaG93TGVnZW5kOworCQlkcmF3KCk7CisJfQorCisKKwkvKioKKwkgKiBBY3Rpb24gdG8gc2hvdyB0aGUgbGVnZW5kCisJICovCisJcHJvdGVjdGVkIGNsYXNzIExlZ2VuZFZpZXdBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCQlwdWJsaWMgTGVnZW5kVmlld0FjdGlvbigpCisJCXsKKwkJCXN1cGVyKE1lc3NhZ2VzLmdldFN0cmluZygiQ29udGV4dE1lbnUuU2hvd0xlZ2VuZCIpLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7CisJCQlzZXRDaGVja2VkKHNob3dMZWdlbmQpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5TaG93TGVnZW5kIik7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJaWYgKHNob3dMZWdlbmQpIHsKKwkJCQlzZXRDaGVja2VkKHRydWUpOworCQkJCS8vTm90aGluZyB0byBkby4gSXQncyBhbHJlYWR5IGxpbmVhci10aW1lLgorCQkJfQorCQkJZWxzZSB7CisJCQkJdG9nZ2xlTGVnZW5kKCk7CisJCQl9CisJCQlkcmF3KCk7CisJCX0KKwl9IC8vTGVnZW5kVmlld0FjdGlvbgorCQorCS8qKgorCSAqIEFjdGlvbiB0byBoaWRlIHRoZSBsZWdlbmQKKwkgKi8KKwljbGFzcyBMZWdlbmRIaWRlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIAl7CisJCXB1YmxpYyBMZWdlbmRIaWRlQWN0aW9uKCkKKwkJeworCQkJc3VwZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5IaWRlTGVnZW5kIiksIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKKwkJCXNldENoZWNrZWQoIXNob3dMZWdlbmQpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5IaWRlTGVnZW5kIik7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJaWYgKCFzaG93TGVnZW5kKSB7CisJCQkJc2V0Q2hlY2tlZCh0cnVlKTsKKwkJCQkvL05vdGhpbmcgdG8gZG8uIEl0J3MgYWxyZWFkeSBsb2ctdGltZS4KKwkJCX0KKwkJCWVsc2UgeworCQkJCXRvZ2dsZUxlZ2VuZCgpOworCQkJfQorCQkJZHJhdygpOworCQl9CisJfS8vTGVnZW5kSGlkZUFjdGlvbgorCisJCisJLyoqCisJICogc3dpdGNoIHRvIGxpbmVhciBwbG90IAorCSAqIAorCSAqLworCXByb3RlY3RlZCBjbGFzcyBMaW5lYXJTY2FsZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJCXB1YmxpYyBMaW5lYXJTY2FsZUFjdGlvbigpCisJCXsKKwkJCXN1cGVyKE1lc3NhZ2VzLmdldFN0cmluZygiQ29udGV4dE1lbnUuTGluZWFyVGltZVNjYWxlIiksIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKKwkJCXNldENoZWNrZWQodXNlTGluZWFyVGltZVNjYWxlKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZ2V0VGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCQkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiQ29udGV4dE1lbnUuTGluZWFyVGltZVNjYWxlIik7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJaWYgKHVzZUxpbmVhclRpbWVTY2FsZSkgeworCQkJCXNldENoZWNrZWQodHJ1ZSk7CisJCQkJLy9Ob3RoaW5nIHRvIGRvLiBJdCdzIGFscmVhZHkgbGluZWFyLXRpbWUuCisJCQl9CisJCQllbHNlIHsKKwkJCQl0b2dnbGVBeGlzU2NhbGUoKTsKKwkJCX0KKwkJCWRyYXcoKTsKKwkJfQorCX0gLy9MaW5lYXJTY2FsZUFjdGlvbgorCisJLyoqCisJICogc3dpdGNoIHRvIHNlbWktbG9nIHBsb3QgKGxvZyBzY2FsZSBvbiB5IGF4aXMpCisJICogCisJICovCisJY2xhc3MgTG9nU2NhbGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gCXsKKwkJcHVibGljIExvZ1NjYWxlQWN0aW9uKCkKKwkJeworCQkJc3VwZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5Mb2dUaW1lU2NhbGUiKSwgSUFjdGlvbi5BU19DSEVDS19CT1gpOworCQkJc2V0Q2hlY2tlZCghdXNlTGluZWFyVGltZVNjYWxlKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZ2V0VGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCQkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiQ29udGV4dE1lbnUuTG9nVGltZVNjYWxlIik7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJaWYgKCF1c2VMaW5lYXJUaW1lU2NhbGUpIHsKKwkJCQlzZXRDaGVja2VkKHRydWUpOworCQkJCS8vTm90aGluZyB0byBkby4gSXQncyBhbHJlYWR5IGxvZy10aW1lLgorCQkJfQorCQkJZWxzZSB7CisJCQkJdG9nZ2xlQXhpc1NjYWxlKCk7CisJCQl9CisJCQlkcmF3KCk7CisJCX0KKwl9Ly9Mb2dTY2FsZUFjdGlvbgorCQorCS8qKgorCSAqIERpc3BsYXlhYmxlUHJvcGVydHkKKwkgKgorCSAqLworCXByb3RlY3RlZCBjbGFzcyBEaXNwbGF5YWJsZVByb3BlcnR5IGV4dGVuZHMgQWN0aW9uCisJeworCQlTdHJpbmcgcHJvcGVydHkgPSBudWxsOworCQlwdWJsaWMgRGlzcGxheWFibGVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIGJvb2xlYW4gdmlzaWJpbGl0eSkKKwkJeworCQkJCQlzdXBlcihwcm9wZXJ0eSwgSUFjdGlvbi5BU19DSEVDS19CT1gpOworCQkJCQl0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisJCQkJCXNldENoZWNrZWQodmlzaWJpbGl0eSk7CisJCX0KKwkJCisJCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gcHJvcGVydHk7CisJCX0KKworCQkvKioKKwkJICogVG9nZ2xlIHRoZSBzdGF0ZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJRGF0YVNlcmllcyBzZXJpZXMgPSBkYXRhU2VyaWVzTWFwLmdldChwcm9wZXJ0eSk7CisJCQkJc2VyaWVzLnRvZ2dsZVZpc2libGUoKTsKKwkJCQlkYXRhU2VyaWVzTWFwLnB1dChwcm9wZXJ0eSxzZXJpZXMpOworCQkJCXNldENoZWNrZWQoc2VyaWVzLmlzVmlzaWJsZSgpKTsKKwkJCQl2aXNpYmxlTWFwLnB1dChwcm9wZXJ0eSwgc2VyaWVzLmlzVmlzaWJsZSgpKTsKKwkJCQlkcmF3KCk7CisJCX0KKwl9Ly8gRGlzcGxheWFibGVQcm9wZXJ0eQorCQorCQorCS8qKgorCSAqIElubmVyIGNsYXNzIERhdGFTZXJpZXMKKwkgKiBhbGwgdGhlIGRhdGEgb2JqZWN0cyBmb3IgYSBwbG90CisJICoKKwkgKi8KKwlwcm90ZWN0ZWQgY2xhc3MgRGF0YVNlcmllcyAKKwl7CisJCXB1YmxpYyBTdHJpbmcgcHJvcGVydHlOYW1lID0gIiI7CisJCQorCQlwdWJsaWMgTGlzdDxEb3VibGU+IHJlbGF0aXZlVmFsdWVzID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCXB1YmxpYyBTZXJpZXMgbGluZVNlcmllcyA9IG51bGw7CisJCXByaXZhdGUgYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsKKwkJcHJpdmF0ZSBTZXJpZXNEZWZpbml0aW9uIHNkWSA9IG51bGw7CisJCXByaXZhdGUgaW50IHNlcmllc0luZGV4ID0gMDsKKwkJcHJpdmF0ZSBib29sZWFuIG92ZXJsYXlNb2RlID0gZmFsc2U7CisJCQorCQkKKwkJcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworCQkJcmV0dXJuIHZpc2libGU7CisJCX0KKwkJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHN0YXRlKSB7CisJCQl2aXNpYmxlID0gc3RhdGU7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIHRvZ2dsZVZpc2libGUoKSB7CisJCQl2aXNpYmxlID0gIXZpc2libGU7CisJCX0KKworCQkvKioKKwkJICogCisJCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKwkJICogQHBhcmFtIGluZGV4CisJCSAqIEBwYXJhbSBvdmVybGF5IAorCQkgKi8KKwkJcHVibGljIERhdGFTZXJpZXMoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGluZGV4LCBib29sZWFuIG92ZXJsYXkpIHsKKwkJCXRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworCQkJdGhpcy5zZXJpZXNJbmRleCA9IGluZGV4OworCQkJdGhpcy5vdmVybGF5TW9kZSA9IG92ZXJsYXk7CisJCQlyZWxhdGl2ZVZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJcmVsYXRpdmVWYWx1ZXMuYWRkKG5ldyBEb3VibGUoMC4wKSk7CisJCQlhZGRMaW5lU2VyaWVzKHByb3BlcnR5TmFtZSk7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIGFkZFZhbHVlKERvdWJsZSB2YWwpIHsKKwkJCWlmKHJlbGF0aXZlVmFsdWVzPT1udWxsKSByZWxhdGl2ZVZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJcmVsYXRpdmVWYWx1ZXMuYWRkKHZhbCk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCisJCSAqIAorCQkgKi8KKwkJQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKwkJcHVibGljIHZvaWQgYWRkTGluZVNlcmllcyhmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCQkKKwkJCWZpbmFsIE51bWJlckRhdGFTZXQgb3J0aG9WYWx1ZXMgPSBOdW1iZXJEYXRhU2V0SW1wbAorCQkJCQkuY3JlYXRlKHJlbGF0aXZlVmFsdWVzKTsKKwkJCWlmKGxpbmVTZXJpZXMgPT0gbnVsbCkgeworCQkJCWxpbmVTZXJpZXMgPSBTY2F0dGVyU2VyaWVzSW1wbC5jcmVhdGUoKTsKKwkJCQkvKgorCQkJCSAqIAorCQkJCSAqIEJhciBjaGFydCBzdHlsZSBpcyB0b28gc2xvdyBmb3IgZ2VuZXJhdGlvbiBvZiBhIGZpbGwKKwkJCQkgKiBpZiB3ZSB3YW50IGEgZmlsbCB3ZSBjYW4gdHJ5IHVzaW5nIHRoZSBkaWZmZXJlbmNlIHBsb3QKKwkJCQkgKiB0byBhIHN0cmFpZ2h0IGxpbmUgYXQgeT0wCisJCQkJICogCisJCQkJCisJCQkJaWYocHJvcGVydHlOYW1lLmluZGV4T2YoIioiKT49MSkgeworCQkJCQkvLyBiYXJzZXJpZXMgbWV0aG9kcworCQkJCQlsaW5lU2VyaWVzID0gKEJhclNlcmllcykgQmFyU2VyaWVzSW1wbC5jcmVhdGUoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsaW5lU2VyaWVzID0gKFNjYXR0ZXJTZXJpZXMpIFNjYXR0ZXJTZXJpZXNJbXBsLmNyZWF0ZSgpOworCQkJCX0KKwkJCQkKKwkJCQkqCisJCQkJKi8KKwkJCX0gLy8gaWYgbGluZVNlcmllcz09bnVsbAorCQkJbGluZVNlcmllcy5zZXREYXRhU2V0KG9ydGhvVmFsdWVzKTsKKwkJCSgoTGluZVNlcmllcykgbGluZVNlcmllcykuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRWaXNpYmxlKHRydWUpOworCQkJKChMaW5lU2VyaWVzKSBsaW5lU2VyaWVzKS5nZXRNYXJrZXJzKCkuY2xlYXIoKTsKKwkJCQorCQkJLy8gQXNzaWduIHRoZSBsaW5lIGNvbG9yCisJCQkvLyBiYXNlZCBvbiBzZWxlY3RlZCBwcm9wZXJ0eS4gRGVmYXVsdCBpcyBCbHVlCisJCQlzZXRDb2xvckRlZnMoc2VyaWVzSW5kZXgpOworCQkJLy8gSWYgdGhpcyBpcyB0aGUgInNlbGVjdGVkIiByZWdpb24gb2YgYSBncmFwaCBzZXQgdGhlIG1hcmtlciB0eXBlCisJCQorCQkJLy8gdGhlIHNlcmllcyBkZWYKKwkJCXNkWSA9IFNlcmllc0RlZmluaXRpb25JbXBsLmNyZWF0ZSgpOworCQkJc2RZLmdldFNlcmllc1BhbGV0dGUoKS51cGRhdGUoLTIpOworCQkJc2RZLmdldFNlcmllcygpLmFkZChsaW5lU2VyaWVzKTsKKwkJCXlBeGlzUHJpbWFyeS5nZXRTZXJpZXNEZWZpbml0aW9ucygpLmFkZChzZFkpOworCQkJCisJCQlyZXR1cm47CisJCX0vLyBhZGRMaW5lU2VyaWVzCisJCQorCQkvKiogCisJCSAqIGluIHJlc3BvbnNlIHRvIHVzZXIgYWN0aW9uIHRlbXBvcmFyaWx5IHJlbW92ZSB0aGUgbGluZSBzZXJpZXMgZnJvbSB0aGUgZ3JhcGgKKwkJICovCisJCXB1YmxpYyB2b2lkIGhpZGUoKSB7CisJCQlsaW5lU2VyaWVzLnNldFZpc2libGUoZmFsc2UpOworCQkJdmlzaWJsZSA9IGZhbHNlOworCQl9Ly8gaGlkZQorCQkKKwkJLyoqIAorCQkgKiBpbiByZXNwb25zZSB0byB1c2VyIGFjdGlvbiBhZGQgYmFjayB0aGUgbGluZSBzZXJpZXMgdG8gdGhlIGdyYXBoCisJCSAqLworCQlwdWJsaWMgdm9pZCBzaG93KCkgeworCQkJbGluZVNlcmllcy5zZXRWaXNpYmxlKHRydWUpOworCQkJdmlzaWJsZSA9IHRydWU7CisJCX0vLyBzaG93CisJCQorCisJCS8qKgorCQkgKiBPdmVybG9hZGVkIGFuZCBzaW1wbGUgbWV0aG9kIHRvIHNldCB0aGUgY29sb3JzCisJCSAqIGRvZXMgbm90IHVzZSB0aGUgcHJlZmVyZW5jZXMKKwkJICogCisJCSAqIFNldHMgdGhlIGNvbG9ycyBmb3IgYSBuIGFycmF5IG9mIExpbmVTZXJpZXMgZ2l2ZW4gdGhlIHByb3BlcnR5IHRvIFBsb3QKKwkJICogZm9yIGVhY2guIFRyeSB0byBzZXQgY29sb3IgZnJvbSB0aGUgcHJlZmVyZW5jZXMgKGlmIHNwZWNpZmllZCBmb3IgdGhhdAorCQkgKiBwcm9wZXJ0eSkgb3RoZXJ3aXNlIHNldHMgbGluZSBjb2xvciB0byBibHVlLgorCQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIAorCQkgKgorCQkgKi8KKwkJcHVibGljIHZvaWQgc2V0Q29sb3JEZWZzKGludCBpbmRleCkgeworCQkJLy8gdGhlIGRlZmF1bHQgbGluZSBjb2xvcgorCQkJaWYoaW5kZXggPj0gY29sb3JEZWZhdWx0Lmxlbmd0aCkgaW5kZXggPSAwOyAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCisJCQlDb2xvckRlZmluaXRpb24gY29sb3IgPSBjb2xvckRlZmF1bHRbaW5kZXhdOworCisJCQl0aGlzLmxpbmVTZXJpZXMuc2V0U2VyaWVzSWRlbnRpZmllcihwcm9wZXJ0eU5hbWUpOworCQkJaWYgKG92ZXJsYXlNb2RlKSB7CisJCQkJCSgoTGluZVNlcmllcyl0aGlzLmxpbmVTZXJpZXMpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoY29sb3IpOworCQkJCQkoKExpbmVTZXJpZXMpdGhpcy5saW5lU2VyaWVzKS5nZXRMaW5lQXR0cmlidXRlcygpLnNldFN0eWxlKExpbmVTdHlsZS5ET1RURURfTElURVJBTCk7CisJCQl9IGVsc2UgeworCQkJCSgoTGluZVNlcmllcyl0aGlzLmxpbmVTZXJpZXMpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoY29sb3IpOworCQkJfQorCQkJCisJCQkKKwkJfS8vIGdldENvbG9yRGVmcworCQkKKwkJLyoqCisJCSAqIFNldHMgdGhlIGNvbG9ycyBmb3IgYSBuIGFycmF5IG9mIExpbmVTZXJpZXMgZ2l2ZW4gdGhlIHByb3BlcnR5IHRvIFBsb3QKKwkJICogZm9yIGVhY2guIFRyeSB0byBzZXQgY29sb3IgZnJvbSB0aGUgcHJlZmVyZW5jZXMgKGlmIHNwZWNpZmllZCBmb3IgdGhhdAorCQkgKiBwcm9wZXJ0eSkgb3RoZXJ3aXNlIHNldHMgbGluZSBjb2xvciB0byBibHVlLgorCQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIAorCQkgKgorCQkgKi8KKwkJcHVibGljIHZvaWQgc2V0Q29sb3JEZWZzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJCS8vIHRoZSBkZWZhdWx0IGxpbmUgY29sb3IKKworCQkJLy8gaWYgcG9zc2libGUgZ2V0IGNvbG9yIGZyb20gcHJlZmVyZW5jZXMKKwkJCWZpbmFsIE1hcDxTdHJpbmcsIENvbG9yPiBjb2xvck1hcCA9IFZpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZS5nZXRDb2xvck1hcHBpbmcoKTsKKworCQkJLy8gZGVmYXVsdCBjb2xvcgorCQkJaW50IGNvbG9ySW5kZXggPSBzZXJpZXNJbmRleCAlIGNvbG9yRGVmYXVsdC5sZW5ndGg7CisJCQlDb2xvckRlZmluaXRpb24gY29sb3IgPSBjb2xvckRlZmF1bHRbY29sb3JJbmRleF07CisKKwkJCS8vIHByZWZlcnJlZCBjb2xvciBieSBuYW1lCisJCQlTdHJpbmcga2V5ID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZygwLDEpOworCQkJCisJCQlpZiAoY29sb3JNYXAuY29udGFpbnNLZXkoa2V5KSkgeworCQkJCWZpbmFsIENvbG9yIGMgPSBjb2xvck1hcC5nZXQoa2V5KTsKKwkJCQljb2xvciA9IENvbG9yRGVmaW5pdGlvbkltcGwuY3JlYXRlKGMuZ2V0UmVkKCksIGMuZ2V0R3JlZW4oKSwgYy5nZXRCbHVlKCkpOworCQkJfQorCQkJCisJCQl0aGlzLmxpbmVTZXJpZXMuc2V0U2VyaWVzSWRlbnRpZmllcihwcm9wZXJ0eU5hbWUpOworCQkJaWYgKG92ZXJsYXlNb2RlKSB7CisJCQkJCSgoTGluZVNlcmllcyl0aGlzLmxpbmVTZXJpZXMpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoQ29sb3JEZWZpbml0aW9uSW1wbC5HUkVZKCkpOworCQkJCQkoKExpbmVTZXJpZXMpdGhpcy5saW5lU2VyaWVzKS5nZXRMaW5lQXR0cmlidXRlcygpLnNldFN0eWxlKExpbmVTdHlsZS5ET1RURURfTElURVJBTCk7CisJCQl9IGVsc2UgeworCQkJCSgoTGluZVNlcmllcyl0aGlzLmxpbmVTZXJpZXMpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoY29sb3IpOworCQkJfQorCQkJCisJCQkKKwkJfS8vIGdldENvbG9yRGVmcworCisJCS8qKgorCQkgKiBsZW5ndGggb2YgdGhlIHNlcmllcworCQkgKiBAcmV0dXJuIG51bWJlciBvZiBkYXRhIHBvaW50cworCQkgKi8KKwkJcHVibGljIGludCBnZXREYXRhU2l6ZSgpIHsKKwkJCXJldHVybiByZWxhdGl2ZVZhbHVlcy5zaXplKCk7CisJCX0KKwkJLy8gQWNjZXNzb3JzCisJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgeworCQkJcmV0dXJuIHByb3BlcnR5TmFtZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKwkJfQorCisJCXB1YmxpYyBMaXN0PERvdWJsZT4gZ2V0UmVsYXRpdmVWYWx1ZXMoKSB7CisJCQlyZXR1cm4gcmVsYXRpdmVWYWx1ZXM7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRSZWxhdGl2ZVZhbHVlcyhMaXN0PERvdWJsZT4gcmVsYXRpdmVWYWx1ZXMpIHsKKwkJCXRoaXMucmVsYXRpdmVWYWx1ZXMgPSByZWxhdGl2ZVZhbHVlczsKKwkJfQorCisJCQorCisJCXB1YmxpYyB2b2lkIHNldExpbmVTZXJpZXMoTGluZVNlcmllcyBsaW5lU2VyaWVzKSB7CisJCQl0aGlzLmxpbmVTZXJpZXMgPSBsaW5lU2VyaWVzOworCQl9CisJfS8vIERhdGFTZXJpZXMKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorfSAvLyBSdW5IaXN0b3J5Q2FudmFzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvYXV0b21hdGljZXhwZXJpbWVudC92aWV3cy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvdmlld3MvbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzJlM2ZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2F1dG9tYXRpY2V4cGVyaW1lbnQvdmlld3MvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDUzIEBACisjIG1lc3NhZ2VzLnByb3BlcnRpZXMKKyMKKyMgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyMgQ29tbWEgc2VwYXJhdGVkIHZhcmlhYmxlCitDU0MudGl0bGU9Q1NWCisKKworCisKKyMgQXV0b21hdGljIEV4cGVyaW1lbnQgdmlldworQVVUTy5USVRMRT1BdXRvbWF0aWMgRXhwZXJpbWVudAorQVVUTy5USVRMRUxBQkVMPUF1dG9tYXRlZCBFeHBlcmltZW50CitBVVRPLkVSUk9SPUVycm9yCitBVVRPLlRJVExFMT1Db252ZXJnZW5jZQorQVVUTy5USVRMRTI9RXJyb3IgdnMgVGltZSAoTGF0ZXN0KQorQVVUTy5USVRMRTM9RXJyb3IgdnMgVGltZSAoQmVzdCkKK0FVVE8uVElUTEU0PVJlZiB2cyBUaW1lCitBVVRPLlRJVExFNT1JbmNkIHZzIFRpbWUgKEJlc3QpCitBVVRPLlJVTj1SdW4gTnVtYmVyCitBVVRPLlRJTUU9VGltZQorQVVUTy5WQUxVRVM9Q3VycmVudCBWYWx1ZXMKK0FVVE8uQ0hBUlRTPUNoYXJ0cworQVVUTy5ISVNUT1JZPUVycm9yIENvbnZlcmdlbmNlCitBVVRPLkVSUk9SU0VSSUVTPUVycm9yIHZzIFRpbWUKK0FVVE8uSU5DSURFTkNFPUluY2lkZW5jZQorQVVUTy5BR0dSRUdBVEVTRVJJRVM9SW5jaWRlbmNlIHZzIFRpbWUKK0FVVE8uQ09OVFJPTFM9Q29udHJvbHMKK0FVVE8uU0VUVElOR1M9U2V0dGluZ3MKK0FVVE8uUEFVU0U9UGF1c2UKK0FVVE8uUkVTVEFSVD1SZXN0YXJ0CitBVVRPLlJFU1RBUlRfSEVBREVSPVdpdGggUGFyYW1ldGVycworQVVUTy5TVE9QPVN0b3AKK0FVVE8uTEFURVNUPVVzZSBMYXRlc3QKK0FVVE8uQkVTVD1Vc2UgQmVzdAorQVVUTy5OT1RGT1VOREVSUk9SPUVSUk9SX0NIQVJUX05PVF9GT1VORAorCisjIENvbnRleHQgbWVudSBlbnRyaWVzCitDb250ZXh0TWVudS5MaW5lYXJUaW1lU2NhbGU9TGluZWFyIFNjYWxlCitDb250ZXh0TWVudS5Mb2dUaW1lU2NhbGU9TG9nIFNjYWxlCitDb250ZXh0TWVudS5MaW5lYXJTY2FsaW5nPUxpbmVhciBTY2FsZQorQ29udGV4dE1lbnUuTG9nU2NhbGluZz1Mb2cgU2NhbGUKK0NvbnRleHRNZW51LlNob3dMZWdlbmQ9U2hvdyBMZWdlbmQKK0NvbnRleHRNZW51LkhpZGVMZWdlbmQ9SGlkZSBMZWdlbmQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRlODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmVkY2YwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkxMGI2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsMTUgQEAKKyNUdWUgU2VwIDAxIDE2OjU0OjM3IEVEVCAyMDA5CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb249cmV0dXJuX3RhZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYTBjMjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMTYgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcgorQnVuZGxlLUNsYXNzUGF0aDogLgorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLAorIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbCwKKyBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLnV0aWwKK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLmpmYWNlO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmNmE4NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE0IEBACisKKyMgPGNvcHlyaWdodD4KKyMgPC9jb3B5cmlnaHQ+CisjCisjICRJZDogYnVpbGQucHJvcGVydGllcyx2IDEuMSAyMDA5LzAzLzI1IDAwOjUwOjI5IHNlZGx1bmQgRXhwICQKKworYmluLmluY2x1ZGVzID0gLixcCisgICAgICAgICAgICAgICBtb2RlbC8sXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKK2phcnMuY29tcGlsZS5vcmRlciA9IC4KK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL21vZGVsL2FuYWx5c2lzLmVjb3JlIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9tb2RlbC9hbmFseXNpcy5lY29yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzlhMDdmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9tb2RlbC9hbmFseXNpcy5lY29yZQpAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJhbmFseXNpcyIKKyAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcyI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXJyb3JGdW5jdGlvbiI+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImNhbGN1bGF0ZUVycm9yIiBlVHlwZT0iIy8vRXJyb3JSZXN1bHQiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InJlZmVyZW5jZSIgZVR5cGU9IiMvL1JlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCIvPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImRhdGEiIGVUeXBlPSIjLy9SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAiLz4KKyAgICA8L2VPcGVyYXRpb25zPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUaHJlc2hvbGRFcnJvckZ1bmN0aW9uIiBlU3VwZXJUeXBlcz0iIy8vRXJyb3JGdW5jdGlvbiIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNpbXBsZUVycm9yRnVuY3Rpb24iIGVTdXBlclR5cGVzPSIjLy9FcnJvckZ1bmN0aW9uIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXJyb3JSZXN1bHQiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlcnJvckJ5VGltZVN0ZXAiIHRyYW5zaWVudD0idHJ1ZSI+CisgICAgICA8ZUdlbmVyaWNUeXBlIGVDbGFzc2lmaWVyPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VFTGlzdCI+CisgICAgICAgIDxlVHlwZUFyZ3VtZW50cyBlQ2xhc3NpZmllcj0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+CisgICAgICA8L2VHZW5lcmljVHlwZT4KKyAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVycm9yIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIgorICAgICAgICB0cmFuc2llbnQ9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVmZXJlbmNlQnlUaW1lIiB0cmFuc2llbnQ9InRydWUiPgorICAgICAgPGVHZW5lcmljVHlwZSBlQ2xhc3NpZmllcj0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRUxpc3QiPgorICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgorICAgICAgPC9lR2VuZXJpY1R5cGU+CisgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb2RlbEJ5VGltZSIgdHJhbnNpZW50PSJ0cnVlIj4KKyAgICAgIDxlR2VuZXJpY1R5cGUgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUVMaXN0Ij4KKyAgICAgICAgPGVUeXBlQXJndW1lbnRzIGVDbGFzc2lmaWVyPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KKyAgICAgIDwvZUdlbmVyaWNUeXBlPgorICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsaWRhdGlvbkVycm9yIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvbW9kZWwvYW5hbHlzaXMuZ2VubW9kZWwgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL21vZGVsL2FuYWx5c2lzLmdlbm1vZGVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODQyM2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL21vZGVsL2FuYWx5c2lzLmdlbm1vZGVsCkBAIC0wLDAgKzEsMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjIgorICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMiIG1vZGVsTmFtZT0iQW5hbHlzaXMiIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5qYXZhIgorICAgIGNvbXBsaWFuY2VMZXZlbD0iNS4wIiBjb3B5cmlnaHRGaWVsZHM9ImZhbHNlIj4KKyAgPGZvcmVpZ25Nb2RlbD5AbW9kZWw8L2ZvcmVpZ25Nb2RlbD4KKyAgPGdlblBhY2thZ2VzIHByZWZpeD0iQW5hbHlzaXMiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5zdGVtIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgorICAgICAgZWNvcmVQYWNrYWdlPSJhbmFseXNpcy5lY29yZSMvIj4KKyAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iYW5hbHlzaXMuZWNvcmUjLy9SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJhbmFseXNpcy5lY29yZSMvL0Vycm9yRnVuY3Rpb24iLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJhbmFseXNpcy5lY29yZSMvL1RocmVzaG9sZEVycm9yRnVuY3Rpb24iLz4KKyAgPC9nZW5QYWNrYWdlcz4KKzwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmRlNmMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDggQEAKKworIyA8Y29weXJpZ2h0PgorIyA8L2NvcHlyaWdodD4KKyMKKyMgJElkOiBwbHVnaW4ucHJvcGVydGllcyx2IDEuMSAyMDA5LzAzLzI1IDAwOjUwOjI5IHNlZGx1bmQgRXhwICQKKworcGx1Z2luTmFtZSA9IFNURU0gQW5hbHlzaXMKK3Byb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3OWE2NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvcGx1Z2luLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgorCis8IS0tCisgPGNvcHlyaWdodD4KKyA8L2NvcHlyaWdodD4KKworICRJZDogcGx1Z2luLnhtbCx2IDEuMSAyMDA5LzAzLzI1IDAwOjUwOjI5IHNlZGx1bmQgRXhwICQKKy0tPgorCis8cGx1Z2luPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgorICAgICAgPHBhY2thZ2UKKyAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzLmVjb3JlIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuQW5hbHlzaXNQYWNrYWdlIgorICAgICAgICAgICAgZ2VuTW9kZWw9Im1vZGVsL2FuYWx5c2lzLmdlbm1vZGVsIi8+CisgICA8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL0FjdGl2YXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjA1ZDkzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9BY3RpdmF0b3IuamF2YQpAQCAtMCwwICsxLDkzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCisvKioKKyAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBQbHVnaW4geworCisJLyoqCisJICogVGhlIHBsdWctaW4gSUQKKwkgKi8gCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMiOyAvLyROT04tTkxTLTEkCisKKwkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCisJcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsKKwkKKwkvKioKKwkgKiBUaGUgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgQWN0aXZhdG9yKCkgeworCX0KKworCS8qKgorCSAqIExvZyBhbiBlcnJvciB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4KKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqICAgICAgICAgICAgdGhlIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIHRleHQKKwkgKiBAcGFyYW0gZXhjZXB0aW9uCisJICogICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJLy8gRG8gd2UgaGF2ZSBhIHBsdWdpbj8KKwkJaWYgKHBsdWdpbiAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXBsdWdpbi5nZXRMb2coKS5sb2coCisJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luLmdldEJ1bmRsZSgpCisJCQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLCAwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKKwkJfSBlbHNlIHsKKwkJCS8vIE5vCisJCQlTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7CisJCQkvLyBFeGNlcHRpb24/CisJCQlpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7CisJCQl9IC8vIGlmCisJCX0KKwl9IC8vIGxvZ0Vycm9yCisJCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5zI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCQlwbHVnaW4gPSB0aGlzOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcGx1Z2luID0gbnVsbDsKKwkJc3VwZXIuc3RvcChjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKKwkgKgorCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCit9IC8vIEFjdGl2YXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9BbmFseXNpc0ZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvQW5hbHlzaXNGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA3YzhjZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvQW5hbHlzaXNGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw4NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkFuYWx5c2lzUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEFuYWx5c2lzRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUFuYWx5c2lzRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuQW5hbHlzaXNGYWN0b3J5SW1wbC5pbml0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVycm9yIEZ1bmN0aW9uPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FcnJvciBGdW5jdGlvbjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRXJyb3JGdW5jdGlvbiBjcmVhdGVFcnJvckZ1bmN0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRocmVzaG9sZCBFcnJvciBGdW5jdGlvbjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGhyZXNob2xkIEVycm9yIEZ1bmN0aW9uPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUaHJlc2hvbGRFcnJvckZ1bmN0aW9uIGNyZWF0ZVRocmVzaG9sZEVycm9yRnVuY3Rpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVmZXJlbmNlIFNjZW5hcmlvIERhdGEgTWFwPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZWZlcmVuY2UgU2NlbmFyaW8gRGF0YSBNYXA8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCBjcmVhdGVSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2ltcGxlIEVycm9yIEZ1bmN0aW9uPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TaW1wbGUgRXJyb3IgRnVuY3Rpb248L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVNpbXBsZUVycm9yRnVuY3Rpb24gY3JlYXRlU2ltcGxlRXJyb3JGdW5jdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FcnJvciBSZXN1bHQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVycm9yIFJlc3VsdDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRXJyb3JSZXN1bHQgY3JlYXRlRXJyb3JSZXN1bHQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQW5hbHlzaXNQYWNrYWdlIGdldEFuYWx5c2lzUGFja2FnZSgpOworCit9IC8vQW5hbHlzaXNGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL0FuYWx5c2lzUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9BbmFseXNpc1BhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzRhZjgzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9BbmFseXNpc1BhY2thZ2UuamF2YQpAQCAtMCwwICsxLDQxNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuQW5hbHlzaXNGYWN0b3J5CisgKiBAbW9kZWwga2luZD0icGFja2FnZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBBbmFseXNpc1BhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7CisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5BTUUgPSAiYW5hbHlzaXMiOworCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMuZWNvcmUiOworCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcyI7CisKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUFuYWx5c2lzUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuQW5hbHlzaXNQYWNrYWdlSW1wbC5pbml0KCk7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5FcnJvckZ1bmN0aW9uSW1wbCA8ZW0+RXJyb3IgRnVuY3Rpb248L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuRXJyb3JGdW5jdGlvbkltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5BbmFseXNpc1BhY2thZ2VJbXBsI2dldEVycm9yRnVuY3Rpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgRVJST1JfRlVOQ1RJT04gPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVycm9yIEZ1bmN0aW9uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVSUk9SX0ZVTkNUSU9OX0ZFQVRVUkVfQ09VTlQgPSAwOworCisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5UaHJlc2hvbGRFcnJvckZ1bmN0aW9uSW1wbCA8ZW0+VGhyZXNob2xkIEVycm9yIEZ1bmN0aW9uPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLlRocmVzaG9sZEVycm9yRnVuY3Rpb25JbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuQW5hbHlzaXNQYWNrYWdlSW1wbCNnZXRUaHJlc2hvbGRFcnJvckZ1bmN0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRIUkVTSE9MRF9FUlJPUl9GVU5DVElPTiA9IDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGhyZXNob2xkIEVycm9yIEZ1bmN0aW9uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRIUkVTSE9MRF9FUlJPUl9GVU5DVElPTl9GRUFUVVJFX0NPVU5UID0gRVJST1JfRlVOQ1RJT05fRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIDxlbT5SZWZlcmVuY2UgU2NlbmFyaW8gRGF0YSBNYXA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLkFuYWx5c2lzUGFja2FnZUltcGwjZ2V0UmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFJFRkVSRU5DRV9TQ0VOQVJJT19EQVRBX01BUCA9IDI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVmZXJlbmNlIFNjZW5hcmlvIERhdGEgTWFwPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFRkVSRU5DRV9TQ0VOQVJJT19EQVRBX01BUF9GRUFUVVJFX0NPVU5UID0gMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLlNpbXBsZUVycm9yRnVuY3Rpb25JbXBsIDxlbT5TaW1wbGUgRXJyb3IgRnVuY3Rpb248L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuU2ltcGxlRXJyb3JGdW5jdGlvbkltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5BbmFseXNpc1BhY2thZ2VJbXBsI2dldFNpbXBsZUVycm9yRnVuY3Rpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU0lNUExFX0VSUk9SX0ZVTkNUSU9OID0gMzsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TaW1wbGUgRXJyb3IgRnVuY3Rpb248L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lNUExFX0VSUk9SX0ZVTkNUSU9OX0ZFQVRVUkVfQ09VTlQgPSBFUlJPUl9GVU5DVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLkVycm9yUmVzdWx0SW1wbCA8ZW0+RXJyb3IgUmVzdWx0PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLkVycm9yUmVzdWx0SW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLkFuYWx5c2lzUGFja2FnZUltcGwjZ2V0RXJyb3JSZXN1bHQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgRVJST1JfUkVTVUxUID0gNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FcnJvciBCeSBUaW1lIFN0ZXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFUlJPUl9SRVNVTFRfX0VSUk9SX0JZX1RJTUVfU1RFUCA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXJyb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFUlJPUl9SRVNVTFRfX0VSUk9SID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgQnkgVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVSUk9SX1JFU1VMVF9fUkVGRVJFTkNFX0JZX1RJTUUgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZGVsIEJ5IFRpbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFUlJPUl9SRVNVTFRfX01PREVMX0JZX1RJTUUgPSAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkYXRpb24gRXJyb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFUlJPUl9SRVNVTFRfX1ZBTElEQVRJT05fRVJST1IgPSA0OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVycm9yIFJlc3VsdDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFUlJPUl9SRVNVTFRfRkVBVFVSRV9DT1VOVCA9IDU7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yRnVuY3Rpb24gPGVtPkVycm9yIEZ1bmN0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVycm9yIEZ1bmN0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5FcnJvckZ1bmN0aW9uCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRFcnJvckZ1bmN0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLlRocmVzaG9sZEVycm9yRnVuY3Rpb24gPGVtPlRocmVzaG9sZCBFcnJvciBGdW5jdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UaHJlc2hvbGQgRXJyb3IgRnVuY3Rpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLlRocmVzaG9sZEVycm9yRnVuY3Rpb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFRocmVzaG9sZEVycm9yRnVuY3Rpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwIDxlbT5SZWZlcmVuY2UgU2NlbmFyaW8gRGF0YSBNYXA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVmZXJlbmNlIFNjZW5hcmlvIERhdGEgTWFwPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5TaW1wbGVFcnJvckZ1bmN0aW9uIDxlbT5TaW1wbGUgRXJyb3IgRnVuY3Rpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2ltcGxlIEVycm9yIEZ1bmN0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5TaW1wbGVFcnJvckZ1bmN0aW9uCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTaW1wbGVFcnJvckZ1bmN0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yUmVzdWx0IDxlbT5FcnJvciBSZXN1bHQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXJyb3IgUmVzdWx0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5FcnJvclJlc3VsdAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RXJyb3JSZXN1bHQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5FcnJvclJlc3VsdCNnZXRFcnJvckJ5VGltZVN0ZXAgPGVtPkVycm9yIEJ5IFRpbWUgU3RlcDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVycm9yIEJ5IFRpbWUgU3RlcDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRXJyb3JSZXN1bHQjZ2V0RXJyb3JCeVRpbWVTdGVwKCkKKwkgKiBAc2VlICNnZXRFcnJvclJlc3VsdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RXJyb3JSZXN1bHRfRXJyb3JCeVRpbWVTdGVwKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRXJyb3JSZXN1bHQjZ2V0RXJyb3IgPGVtPkVycm9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXJyb3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yUmVzdWx0I2dldEVycm9yKCkKKwkgKiBAc2VlICNnZXRFcnJvclJlc3VsdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RXJyb3JSZXN1bHRfRXJyb3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5FcnJvclJlc3VsdCNnZXRSZWZlcmVuY2VCeVRpbWUgPGVtPlJlZmVyZW5jZSBCeSBUaW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVmZXJlbmNlIEJ5IFRpbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yUmVzdWx0I2dldFJlZmVyZW5jZUJ5VGltZSgpCisJICogQHNlZSAjZ2V0RXJyb3JSZXN1bHQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEVycm9yUmVzdWx0X1JlZmVyZW5jZUJ5VGltZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yUmVzdWx0I2dldE1vZGVsQnlUaW1lIDxlbT5Nb2RlbCBCeSBUaW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW9kZWwgQnkgVGltZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRXJyb3JSZXN1bHQjZ2V0TW9kZWxCeVRpbWUoKQorCSAqIEBzZWUgI2dldEVycm9yUmVzdWx0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRFcnJvclJlc3VsdF9Nb2RlbEJ5VGltZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yUmVzdWx0I2dldFZhbGlkYXRpb25FcnJvciA8ZW0+VmFsaWRhdGlvbiBFcnJvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbGlkYXRpb24gRXJyb3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yUmVzdWx0I2dldFZhbGlkYXRpb25FcnJvcigpCisJICogQHNlZSAjZ2V0RXJyb3JSZXN1bHQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEVycm9yUmVzdWx0X1ZhbGlkYXRpb25FcnJvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQW5hbHlzaXNGYWN0b3J5IGdldEFuYWx5c2lzRmFjdG9yeSgpOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50CisJICogPHVsPgorCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisJICogPC91bD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50ZXJmYWNlIExpdGVyYWxzIHsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuRXJyb3JGdW5jdGlvbkltcGwgPGVtPkVycm9yIEZ1bmN0aW9uPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLkVycm9yRnVuY3Rpb25JbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLkFuYWx5c2lzUGFja2FnZUltcGwjZ2V0RXJyb3JGdW5jdGlvbigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBFUlJPUl9GVU5DVElPTiA9IGVJTlNUQU5DRS5nZXRFcnJvckZ1bmN0aW9uKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLlRocmVzaG9sZEVycm9yRnVuY3Rpb25JbXBsIDxlbT5UaHJlc2hvbGQgRXJyb3IgRnVuY3Rpb248L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuVGhyZXNob2xkRXJyb3JGdW5jdGlvbkltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuQW5hbHlzaXNQYWNrYWdlSW1wbCNnZXRUaHJlc2hvbGRFcnJvckZ1bmN0aW9uKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRIUkVTSE9MRF9FUlJPUl9GVU5DVElPTiA9IGVJTlNUQU5DRS5nZXRUaHJlc2hvbGRFcnJvckZ1bmN0aW9uKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwgPGVtPlJlZmVyZW5jZSBTY2VuYXJpbyBEYXRhIE1hcDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLkFuYWx5c2lzUGFja2FnZUltcGwjZ2V0UmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFJFRkVSRU5DRV9TQ0VOQVJJT19EQVRBX01BUCA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuU2ltcGxlRXJyb3JGdW5jdGlvbkltcGwgPGVtPlNpbXBsZSBFcnJvciBGdW5jdGlvbjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5TaW1wbGVFcnJvckZ1bmN0aW9uSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5BbmFseXNpc1BhY2thZ2VJbXBsI2dldFNpbXBsZUVycm9yRnVuY3Rpb24oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU0lNUExFX0VSUk9SX0ZVTkNUSU9OID0gZUlOU1RBTkNFLmdldFNpbXBsZUVycm9yRnVuY3Rpb24oKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuRXJyb3JSZXN1bHRJbXBsIDxlbT5FcnJvciBSZXN1bHQ8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuRXJyb3JSZXN1bHRJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLkFuYWx5c2lzUGFja2FnZUltcGwjZ2V0RXJyb3JSZXN1bHQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgRVJST1JfUkVTVUxUID0gZUlOU1RBTkNFLmdldEVycm9yUmVzdWx0KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXJyb3IgQnkgVGltZSBTdGVwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRVJST1JfUkVTVUxUX19FUlJPUl9CWV9USU1FX1NURVAgPSBlSU5TVEFOQ0UuZ2V0RXJyb3JSZXN1bHRfRXJyb3JCeVRpbWVTdGVwKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXJyb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBFUlJPUl9SRVNVTFRfX0VSUk9SID0gZUlOU1RBTkNFLmdldEVycm9yUmVzdWx0X0Vycm9yKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIEJ5IFRpbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBFUlJPUl9SRVNVTFRfX1JFRkVSRU5DRV9CWV9USU1FID0gZUlOU1RBTkNFLmdldEVycm9yUmVzdWx0X1JlZmVyZW5jZUJ5VGltZSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZGVsIEJ5IFRpbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBFUlJPUl9SRVNVTFRfX01PREVMX0JZX1RJTUUgPSBlSU5TVEFOQ0UuZ2V0RXJyb3JSZXN1bHRfTW9kZWxCeVRpbWUoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWxpZGF0aW9uIEVycm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRVJST1JfUkVTVUxUX19WQUxJREFUSU9OX0VSUk9SID0gZUlOU1RBTkNFLmdldEVycm9yUmVzdWx0X1ZhbGlkYXRpb25FcnJvcigpOworCisJfQorCit9IC8vQW5hbHlzaXNQYWNrYWdlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL0Rpc2Vhc2VUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL0Rpc2Vhc2VUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4MzkzMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvRGlzZWFzZVR5cGUuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXM7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitwdWJsaWMgZW51bSBEaXNlYXNlVHlwZSB7CisJU0VJUiwgCisJU0lSLAorCVNJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL0Vycm9yRnVuY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvRXJyb3JGdW5jdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNzQyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL0Vycm9yRnVuY3Rpb24uamF2YQpAQCAtMCwwICsxLDMxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXM7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCisKKy8qKgorICogCisgKiBAYXV0aG9yIGVkbHVuZAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXJyb3JGdW5jdGlvbiBleHRlbmRzIEVPYmplY3QgeworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRXJyb3JSZXN1bHQgY2FsY3VsYXRlRXJyb3IoUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwIHJlZmVyZW5jZSwgUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwIGRhdGEpOworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL0Vycm9yUmVzdWx0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL0Vycm9yUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1ZGJhNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvRXJyb3JSZXN1bHQuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXJyb3IgUmVzdWx0PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRXJyb3JSZXN1bHQjZ2V0RXJyb3JCeVRpbWVTdGVwIDxlbT5FcnJvciBCeSBUaW1lIFN0ZXA8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRXJyb3JSZXN1bHQjZ2V0RXJyb3IgPGVtPkVycm9yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yUmVzdWx0I2dldFJlZmVyZW5jZUJ5VGltZSA8ZW0+UmVmZXJlbmNlIEJ5IFRpbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRXJyb3JSZXN1bHQjZ2V0TW9kZWxCeVRpbWUgPGVtPk1vZGVsIEJ5IFRpbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRXJyb3JSZXN1bHQjZ2V0VmFsaWRhdGlvbkVycm9yIDxlbT5WYWxpZGF0aW9uIEVycm9yPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkFuYWx5c2lzUGFja2FnZSNnZXRFcnJvclJlc3VsdCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBFcnJvclJlc3VsdCBleHRlbmRzIEVPYmplY3QgeworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXJyb3IgQnkgVGltZSBTdGVwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FcnJvciBCeSBUaW1lIFN0ZXA8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXJyb3IgQnkgVGltZSBTdGVwPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRFcnJvckJ5VGltZVN0ZXAoRUxpc3QpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkFuYWx5c2lzUGFja2FnZSNnZXRFcnJvclJlc3VsdF9FcnJvckJ5VGltZVN0ZXAoKQorCSAqIEBtb2RlbCBtYW55PSJmYWxzZSIgdHJhbnNpZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxEb3VibGU+IGdldEVycm9yQnlUaW1lU3RlcCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5FcnJvclJlc3VsdCNnZXRFcnJvckJ5VGltZVN0ZXAgPGVtPkVycm9yIEJ5IFRpbWUgU3RlcDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXJyb3IgQnkgVGltZSBTdGVwPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRFcnJvckJ5VGltZVN0ZXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEVycm9yQnlUaW1lU3RlcChFTGlzdDxEb3VibGU+IHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVycm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FcnJvcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FcnJvcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RXJyb3IoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5BbmFseXNpc1BhY2thZ2UjZ2V0RXJyb3JSZXN1bHRfRXJyb3IoKQorCSAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRFcnJvcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5FcnJvclJlc3VsdCNnZXRFcnJvciA8ZW0+RXJyb3I8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVycm9yPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRFcnJvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RXJyb3IoZG91YmxlIHZhbHVlKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgQnkgVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlIEJ5IFRpbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlIEJ5IFRpbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFJlZmVyZW5jZUJ5VGltZShFTGlzdCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuQW5hbHlzaXNQYWNrYWdlI2dldEVycm9yUmVzdWx0X1JlZmVyZW5jZUJ5VGltZSgpCisJICogQG1vZGVsIG1hbnk9ImZhbHNlIiB0cmFuc2llbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PERvdWJsZT4gZ2V0UmVmZXJlbmNlQnlUaW1lKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yUmVzdWx0I2dldFJlZmVyZW5jZUJ5VGltZSA8ZW0+UmVmZXJlbmNlIEJ5IFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZSBCeSBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRSZWZlcmVuY2VCeVRpbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFJlZmVyZW5jZUJ5VGltZShFTGlzdDxEb3VibGU+IHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vZGVsIEJ5IFRpbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1vZGVsIEJ5IFRpbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW9kZWwgQnkgVGltZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TW9kZWxCeVRpbWUoRUxpc3QpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkFuYWx5c2lzUGFja2FnZSNnZXRFcnJvclJlc3VsdF9Nb2RlbEJ5VGltZSgpCisJICogQG1vZGVsIG1hbnk9ImZhbHNlIiB0cmFuc2llbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PERvdWJsZT4gZ2V0TW9kZWxCeVRpbWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRXJyb3JSZXN1bHQjZ2V0TW9kZWxCeVRpbWUgPGVtPk1vZGVsIEJ5IFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vZGVsIEJ5IFRpbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1vZGVsQnlUaW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNb2RlbEJ5VGltZShFTGlzdDxEb3VibGU+IHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbGlkYXRpb24gRXJyb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbGlkYXRpb24gRXJyb3I8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWRhdGlvbiBFcnJvcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VmFsaWRhdGlvbkVycm9yKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuQW5hbHlzaXNQYWNrYWdlI2dldEVycm9yUmVzdWx0X1ZhbGlkYXRpb25FcnJvcigpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRWYWxpZGF0aW9uRXJyb3IoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRXJyb3JSZXN1bHQjZ2V0VmFsaWRhdGlvbkVycm9yIDxlbT5WYWxpZGF0aW9uIEVycm9yPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWxpZGF0aW9uIEVycm9yPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRWYWxpZGF0aW9uRXJyb3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFZhbGlkYXRpb25FcnJvcihkb3VibGUgdmFsdWUpOworCisJcHVibGljIEVycm9yUmVzdWx0IGNvcHkoKTsKK30gLy8gRXJyb3JSZXN1bHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL1JlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMTZkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL1JlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcC5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworCisvKioKKyogVGhlIGNsYXNzIHN0b3JlcyBzY2VuYXJpbyByZWZlcmVuY2UgZGF0YSBmb3IgYSBzY2VuYXJpbyBkaXNlYXNlIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBtZXRhLWRhdGEuIAorKiAKKyogQG1vZGVsCisqIEBnZW5lcmF0ZWQgTk9UCisqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgaW50ZXJmYWNlIFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCBleHRlbmRzIEVPYmplY3QgewkJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL1NjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOGVmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL1NjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXM7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBUaHJvd24gd2hlbiB3ZSBmYWlsIHRvIGxvYWQgYSBzY2VuYXJpbyBmb3IgYW55IHJlYXNvbgorICovCisKK3B1YmxpYyBjbGFzcyBTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICogCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKi8KKwlwdWJsaWMgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkge3N1cGVyKG1lc3NhZ2UpO30KKwkKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICogCisJICogQHBhcmFtIHQKKwkgKi8KKwlwdWJsaWMgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgdCkge3N1cGVyKHQpO30KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9TaW1wbGVFcnJvckZ1bmN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL1NpbXBsZUVycm9yRnVuY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmQ3MTRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9TaW1wbGVFcnJvckZ1bmN0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TaW1wbGUgRXJyb3IgRnVuY3Rpb248L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5BbmFseXNpc1BhY2thZ2UjZ2V0U2ltcGxlRXJyb3JGdW5jdGlvbigpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgaW50ZXJmYWNlIFNpbXBsZUVycm9yRnVuY3Rpb24gZXh0ZW5kcyBFcnJvckZ1bmN0aW9uIHsKK30gLy8gU2ltcGxlRXJyb3JGdW5jdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9TdGF0ZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvU3RhdGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2MDA5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvU3RhdGVzLmphdmEKQEAgLTAsMCArMSw0MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3B1YmxpYyBjbGFzcyBTdGF0ZXMgeworCS8qKgorICAgICAqIHBvc3NpYmxlIHN0YXRlcyB3aXRoIHBhcmFtZXRlcnMgdG8gZml0CisgICAgICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzdGF0ZXNUb0ZpdD0geyJTIiwiRSIsIkkiLCJSIiwiUCIsICJJbmNpZGVuY2UifTsKKwkvKioKKwkgKiAgU3VzY2VwdGlibGUgaW5kZXggKGZvciBzdGF0ZXNUb0ZpdCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVVNDRVBUSUJMRSA9IDA7CisJLyoqCisJICogRXhwb3NlZCBpbmRleCAoZm9yIHN0YXRlc1RvRml0KQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUE9TRUQgICAgID0gMTsKKwkvKioKKwkgKiBJbmZlY3Rpb3VzIGluZGV4IChmb3Igc3RhdGVzVG9GaXQpCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GRUNUSU9VUyAgPSAyOworCS8qKgorCSAqICBSZWNvdmVyZWQgaW5kZXggKGZvciBzdGF0ZXNUb0ZpdCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUNPVkVSRUQgICA9IDM7CisJLyoqCisJICogIEluZmVjdGlvdXMgcmVjb3ZlciBpbmRleCAoZm9yIHN0YXRlc1RvRml0KQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUFVMQVRJT04gPSA0OworCS8qKgorCSAqICBJbmNpZGVuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNJREVOQ0UgPSA1OworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9UaHJlc2hvbGRFcnJvckZ1bmN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL1RocmVzaG9sZEVycm9yRnVuY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmVkNGM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9UaHJlc2hvbGRFcnJvckZ1bmN0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpczsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UaHJlc2hvbGQgRXJyb3IgRnVuY3Rpb248L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5BbmFseXNpc1BhY2thZ2UjZ2V0VGhyZXNob2xkRXJyb3JGdW5jdGlvbigpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgaW50ZXJmYWNlIFRocmVzaG9sZEVycm9yRnVuY3Rpb24gZXh0ZW5kcyBFcnJvckZ1bmN0aW9uIHsKK30gLy8gVGhyZXNob2xkRXJyb3JGdW5jdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9pbXBsL0FuYWx5c2lzRmFjdG9yeUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvaW1wbC9BbmFseXNpc0ZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwOTdhMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvaW1wbC9BbmFseXNpc0ZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuKjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBBbmFseXNpc0ZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgQW5hbHlzaXNGYWN0b3J5IHsKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBBbmFseXNpc0ZhY3RvcnkgaW5pdCgpIHsKKwkJdHJ5IHsKKwkJCUFuYWx5c2lzRmFjdG9yeSB0aGVBbmFseXNpc0ZhY3RvcnkgPSAoQW5hbHlzaXNGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMuZWNvcmUiKTsgCisJCQlpZiAodGhlQW5hbHlzaXNGYWN0b3J5ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdGhlQW5hbHlzaXNGYWN0b3J5OworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IEFuYWx5c2lzRmFjdG9yeUltcGwoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBbmFseXNpc0ZhY3RvcnlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7CisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIEFuYWx5c2lzUGFja2FnZS5FUlJPUl9GVU5DVElPTjogcmV0dXJuIGNyZWF0ZUVycm9yRnVuY3Rpb24oKTsKKwkJCWNhc2UgQW5hbHlzaXNQYWNrYWdlLlRIUkVTSE9MRF9FUlJPUl9GVU5DVElPTjogcmV0dXJuIGNyZWF0ZVRocmVzaG9sZEVycm9yRnVuY3Rpb24oKTsKKwkJCWNhc2UgQW5hbHlzaXNQYWNrYWdlLlJFRkVSRU5DRV9TQ0VOQVJJT19EQVRBX01BUDogcmV0dXJuIGNyZWF0ZVJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCgpOworCQkJY2FzZSBBbmFseXNpc1BhY2thZ2UuU0lNUExFX0VSUk9SX0ZVTkNUSU9OOiByZXR1cm4gY3JlYXRlU2ltcGxlRXJyb3JGdW5jdGlvbigpOworCQkJY2FzZSBBbmFseXNpc1BhY2thZ2UuRVJST1JfUkVTVUxUOiByZXR1cm4gY3JlYXRlRXJyb3JSZXN1bHQoKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFcnJvckZ1bmN0aW9uIGNyZWF0ZUVycm9yRnVuY3Rpb24oKSB7CisJCUVycm9yRnVuY3Rpb25JbXBsIGVycm9yRnVuY3Rpb24gPSBuZXcgRXJyb3JGdW5jdGlvbkltcGwoKTsKKwkJcmV0dXJuIGVycm9yRnVuY3Rpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRocmVzaG9sZEVycm9yRnVuY3Rpb24gY3JlYXRlVGhyZXNob2xkRXJyb3JGdW5jdGlvbigpIHsKKwkJVGhyZXNob2xkRXJyb3JGdW5jdGlvbkltcGwgdGhyZXNob2xkRXJyb3JGdW5jdGlvbiA9IG5ldyBUaHJlc2hvbGRFcnJvckZ1bmN0aW9uSW1wbCgpOworCQlyZXR1cm4gdGhyZXNob2xkRXJyb3JGdW5jdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwIGNyZWF0ZVJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCgpIHsKKwkJUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCByZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAgPSBuZXcgUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCgpOworCQlyZXR1cm4gcmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTaW1wbGVFcnJvckZ1bmN0aW9uIGNyZWF0ZVNpbXBsZUVycm9yRnVuY3Rpb24oKSB7CisJCVNpbXBsZUVycm9yRnVuY3Rpb25JbXBsIHNpbXBsZUVycm9yRnVuY3Rpb24gPSBuZXcgU2ltcGxlRXJyb3JGdW5jdGlvbkltcGwoKTsKKwkJcmV0dXJuIHNpbXBsZUVycm9yRnVuY3Rpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVycm9yUmVzdWx0IGNyZWF0ZUVycm9yUmVzdWx0KCkgeworCQlFcnJvclJlc3VsdEltcGwgZXJyb3JSZXN1bHQgPSBuZXcgRXJyb3JSZXN1bHRJbXBsKCk7CisJCXJldHVybiBlcnJvclJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQW5hbHlzaXNQYWNrYWdlIGdldEFuYWx5c2lzUGFja2FnZSgpIHsKKwkJcmV0dXJuIChBbmFseXNpc1BhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBkZXByZWNhdGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBBbmFseXNpc1BhY2thZ2UgZ2V0UGFja2FnZSgpIHsKKwkJcmV0dXJuIEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0U7CisJfQorCit9IC8vQW5hbHlzaXNGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9pbXBsL0FuYWx5c2lzUGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvaW1wbC9BbmFseXNpc1BhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1YWQ5NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvaW1wbC9BbmFseXNpc1BhY2thZ2VJbXBsLmphdmEKQEAgLTAsMCArMSwzMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVHZW5lcmljVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkFuYWx5c2lzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkFuYWx5c2lzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yRnVuY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5FcnJvclJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLlJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLlNpbXBsZUVycm9yRnVuY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5UaHJlc2hvbGRFcnJvckZ1bmN0aW9uOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEFuYWx5c2lzUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBBbmFseXNpc1BhY2thZ2UgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGVycm9yRnVuY3Rpb25FQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGhyZXNob2xkRXJyb3JGdW5jdGlvbkVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzaW1wbGVFcnJvckZ1bmN0aW9uRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBlcnJvclJlc3VsdEVDbGFzcyA9IG51bGw7CisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCisJICogcGFja2FnZSBVUkkgdmFsdWUuCisJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYworCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCisJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKKwkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5BbmFseXNpc1BhY2thZ2UjZU5TX1VSSQorCSAqIEBzZWUgI2luaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEFuYWx5c2lzUGFja2FnZUltcGwoKSB7CisJCXN1cGVyKGVOU19VUkksIEFuYWx5c2lzRmFjdG9yeS5lSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIEFuYWx5c2lzUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KKwkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZU5TX1VSSQorCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCisJICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5hbHlzaXNQYWNrYWdlIGluaXQoKSB7CisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChBbmFseXNpc1BhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQW5hbHlzaXNQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKwkJQW5hbHlzaXNQYWNrYWdlSW1wbCB0aGVBbmFseXNpc1BhY2thZ2UgPSAoQW5hbHlzaXNQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgQW5hbHlzaXNQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBBbmFseXNpc1BhY2thZ2VJbXBsKCkpOworCisJCWlzSW5pdGVkID0gdHJ1ZTsKKworCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cworCQl0aGVBbmFseXNpc1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQorCQl0aGVBbmFseXNpc1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKwkJdGhlQW5hbHlzaXNQYWNrYWdlLmZyZWV6ZSgpOworCisgIAorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KEFuYWx5c2lzUGFja2FnZS5lTlNfVVJJLCB0aGVBbmFseXNpc1BhY2thZ2UpOworCQlyZXR1cm4gdGhlQW5hbHlzaXNQYWNrYWdlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0RXJyb3JGdW5jdGlvbigpIHsKKwkJcmV0dXJuIGVycm9yRnVuY3Rpb25FQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRUaHJlc2hvbGRFcnJvckZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhyZXNob2xkRXJyb3JGdW5jdGlvbkVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCgpIHsKKwkJcmV0dXJuIHJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNpbXBsZUVycm9yRnVuY3Rpb24oKSB7CisJCXJldHVybiBzaW1wbGVFcnJvckZ1bmN0aW9uRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0RXJyb3JSZXN1bHQoKSB7CisJCXJldHVybiBlcnJvclJlc3VsdEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFcnJvclJlc3VsdF9FcnJvckJ5VGltZVN0ZXAoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSllcnJvclJlc3VsdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEVycm9yUmVzdWx0X0Vycm9yKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXJyb3JSZXN1bHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFcnJvclJlc3VsdF9SZWZlcmVuY2VCeVRpbWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSllcnJvclJlc3VsdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEVycm9yUmVzdWx0X01vZGVsQnlUaW1lKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXJyb3JSZXN1bHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFcnJvclJlc3VsdF9WYWxpZGF0aW9uRXJyb3IoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSllcnJvclJlc3VsdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBbmFseXNpc0ZhY3RvcnkgZ2V0QW5hbHlzaXNGYWN0b3J5KCkgeworCQlyZXR1cm4gKEFuYWx5c2lzRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCisJICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOworCQlpc0NyZWF0ZWQgPSB0cnVlOworCisJCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcworCQllcnJvckZ1bmN0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVSUk9SX0ZVTkNUSU9OKTsKKworCQl0aHJlc2hvbGRFcnJvckZ1bmN0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRIUkVTSE9MRF9FUlJPUl9GVU5DVElPTik7CisKKwkJcmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFRkVSRU5DRV9TQ0VOQVJJT19EQVRBX01BUCk7CisKKwkJc2ltcGxlRXJyb3JGdW5jdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTSU1QTEVfRVJST1JfRlVOQ1RJT04pOworCisJCWVycm9yUmVzdWx0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVSUk9SX1JFU1VMVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZXJyb3JSZXN1bHRFQ2xhc3MsIEVSUk9SX1JFU1VMVF9fRVJST1JfQllfVElNRV9TVEVQKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShlcnJvclJlc3VsdEVDbGFzcywgRVJST1JfUkVTVUxUX19FUlJPUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZXJyb3JSZXN1bHRFQ2xhc3MsIEVSUk9SX1JFU1VMVF9fUkVGRVJFTkNFX0JZX1RJTUUpOworCQljcmVhdGVFQXR0cmlidXRlKGVycm9yUmVzdWx0RUNsYXNzLCBFUlJPUl9SRVNVTFRfX01PREVMX0JZX1RJTUUpOworCQljcmVhdGVFQXR0cmlidXRlKGVycm9yUmVzdWx0RUNsYXNzLCBFUlJPUl9SRVNVTFRfX1ZBTElEQVRJT05fRVJST1IpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcworCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKKwkJaXNJbml0aWFsaXplZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCisJCXNldE5hbWUoZU5BTUUpOworCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKKwkJc2V0TnNVUkkoZU5TX1VSSSk7CisKKwkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycworCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycworCisJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJdGhyZXNob2xkRXJyb3JGdW5jdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEVycm9yRnVuY3Rpb24oKSk7CisJCXNpbXBsZUVycm9yRnVuY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFcnJvckZ1bmN0aW9uKCkpOworCisJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCWluaXRFQ2xhc3MoZXJyb3JGdW5jdGlvbkVDbGFzcywgRXJyb3JGdW5jdGlvbi5jbGFzcywgIkVycm9yRnVuY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJRU9wZXJhdGlvbiBvcCA9IGFkZEVPcGVyYXRpb24oZXJyb3JGdW5jdGlvbkVDbGFzcywgdGhpcy5nZXRFcnJvclJlc3VsdCgpLCAiY2FsY3VsYXRlRXJyb3IiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOworCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCgpLCAicmVmZXJlbmNlIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsKKwkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAoKSwgImRhdGEiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3ModGhyZXNob2xkRXJyb3JGdW5jdGlvbkVDbGFzcywgVGhyZXNob2xkRXJyb3JGdW5jdGlvbi5jbGFzcywgIlRocmVzaG9sZEVycm9yRnVuY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyhyZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBFQ2xhc3MsIFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcC5jbGFzcywgIlJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKHNpbXBsZUVycm9yRnVuY3Rpb25FQ2xhc3MsIFNpbXBsZUVycm9yRnVuY3Rpb24uY2xhc3MsICJTaW1wbGVFcnJvckZ1bmN0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoZXJyb3JSZXN1bHRFQ2xhc3MsIEVycm9yUmVzdWx0LmNsYXNzLCAiRXJyb3JSZXN1bHQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCUVHZW5lcmljVHlwZSBnMSA9IGNyZWF0ZUVHZW5lcmljVHlwZShlY29yZVBhY2thZ2UuZ2V0RUVMaXN0KCkpOworCQlFR2VuZXJpY1R5cGUgZzIgPSBjcmVhdGVFR2VuZXJpY1R5cGUoZWNvcmVQYWNrYWdlLmdldEVEb3VibGVPYmplY3QoKSk7CisJCWcxLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGcyKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXJyb3JSZXN1bHRfRXJyb3JCeVRpbWVTdGVwKCksIGcxLCAiZXJyb3JCeVRpbWVTdGVwIiwgbnVsbCwgMCwgMSwgRXJyb3JSZXN1bHQuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXJyb3JSZXN1bHRfRXJyb3IoKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImVycm9yIiwgbnVsbCwgMCwgMSwgRXJyb3JSZXN1bHQuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJZzEgPSBjcmVhdGVFR2VuZXJpY1R5cGUoZWNvcmVQYWNrYWdlLmdldEVFTGlzdCgpKTsKKwkJZzIgPSBjcmVhdGVFR2VuZXJpY1R5cGUoZWNvcmVQYWNrYWdlLmdldEVEb3VibGVPYmplY3QoKSk7CisJCWcxLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGcyKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXJyb3JSZXN1bHRfUmVmZXJlbmNlQnlUaW1lKCksIGcxLCAicmVmZXJlbmNlQnlUaW1lIiwgbnVsbCwgMCwgMSwgRXJyb3JSZXN1bHQuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJZzEgPSBjcmVhdGVFR2VuZXJpY1R5cGUoZWNvcmVQYWNrYWdlLmdldEVFTGlzdCgpKTsKKwkJZzIgPSBjcmVhdGVFR2VuZXJpY1R5cGUoZWNvcmVQYWNrYWdlLmdldEVEb3VibGVPYmplY3QoKSk7CisJCWcxLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGcyKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXJyb3JSZXN1bHRfTW9kZWxCeVRpbWUoKSwgZzEsICJtb2RlbEJ5VGltZSIsIG51bGwsIDAsIDEsIEVycm9yUmVzdWx0LmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldEVycm9yUmVzdWx0X1ZhbGlkYXRpb25FcnJvcigpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAidmFsaWRhdGlvbkVycm9yIiwgbnVsbCwgMCwgMSwgRXJyb3JSZXN1bHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJLy8gQ3JlYXRlIHJlc291cmNlCisJCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCX0KKworfSAvL0FuYWx5c2lzUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvaW1wbC9FcnJvckZ1bmN0aW9uSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9pbXBsL0Vycm9yRnVuY3Rpb25JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjNDE4ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvaW1wbC9FcnJvckZ1bmN0aW9uSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5BbmFseXNpc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5FcnJvckZ1bmN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRXJyb3JSZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5TdGF0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwuUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FcnJvciBGdW5jdGlvbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEVycm9yRnVuY3Rpb25JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFcnJvckZ1bmN0aW9uIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRXJyb3JGdW5jdGlvbkltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuRVJST1JfRlVOQ1RJT047CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVycm9yUmVzdWx0IGNhbGN1bGF0ZUVycm9yKFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCByZWZlcmVuY2UsIFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCBkYXRhKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvKioKKwkgKiBGcm9tIHRoZSBkYXRhTWFwIGV4dHJhY3QgYSBsaXN0IG9mIGluZmVjdGlvdXMKKwkgKiBAcGFyYW0gZGF0YU1hcAorCSAqIEByZXR1cm4gbGlzdCBvZiBpbmZlY3Rpb3VzIHBlb3BsZQorCSAqLworCXB1YmxpYyBMaXN0PERvdWJsZT4gZ2V0SW5mZWN0aW91cyhSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBkYXRhTWFwKSB7CisJCWZpbmFsIFN0cmluZyBJTkZFQ1RJT1VTID0gU3RhdGVzLnN0YXRlc1RvRml0W1N0YXRlcy5JTkZFQ1RJT1VTXTsKKwkJCisJCSAKKwkJLy8gTVVTVCBleGlzdAorCQlMaXN0PFN0cmluZz4gaW5mZWN0aW91c0xpc3QgPSBkYXRhTWFwLmdldERhdGEoSU5GRUNUSU9VUyk7CisJCWFzc2VydChpbmZlY3Rpb3VzTGlzdCE9bnVsbCk7CisJCQorCQlMaXN0PERvdWJsZT4gaW5mZWN0aW91cyA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGluZmVjdGlvdXNMaXN0LnNpemUoKTsgaSArKykgeworCQkJCisJCQlkb3VibGUgaW5mID0gKG5ldyBEb3VibGUoaW5mZWN0aW91c0xpc3QuZ2V0KGkpKSkuZG91YmxlVmFsdWUoKTsKKwkJCWluZmVjdGlvdXMuYWRkKG5ldyBEb3VibGUoaW5mKSk7CisJCX0KKwkJcmV0dXJuIGluZmVjdGlvdXM7CisJfQorCQorCisJLyoqCisJICogRnJvbSB0aGUgZGF0YU1hcCBleHRyYWN0IGEgbGlzdCBvZiBpbmZlY3Rpb3VzCisJICogQHBhcmFtIGRhdGFNYXAKKwkgKiBAcmV0dXJuIGxpc3Qgb2YgaW5mZWN0aW91cyBwZW9wbGUKKwkgKi8KKwlwdWJsaWMgTGlzdDxEb3VibGU+IGdldEluY2lkZW5jZShSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBkYXRhTWFwKSB7CisJCWZpbmFsIFN0cmluZyBJTkNJREVOQ0UgPSBTdGF0ZXMuc3RhdGVzVG9GaXRbU3RhdGVzLklOQ0lERU5DRV07CisJCQorCQkgCisJCS8vIE1VU1QgZXhpc3QKKwkJTGlzdDxTdHJpbmc+IGluY2lkZW5jZUxpc3QgPSBkYXRhTWFwLmdldERhdGEoSU5DSURFTkNFKTsKKwkJYXNzZXJ0KGluY2lkZW5jZUxpc3QhPW51bGwpOworCQkKKwkJTGlzdDxEb3VibGU+IGluZmVjdGlvdXMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNpZGVuY2VMaXN0LnNpemUoKTsgaSArKykgeworCQkJCisJCQlkb3VibGUgaW5mID0gKG5ldyBEb3VibGUoaW5jaWRlbmNlTGlzdC5nZXQoaSkpKS5kb3VibGVWYWx1ZSgpOworCQkJaW5mZWN0aW91cy5hZGQobmV3IERvdWJsZShpbmYpKTsKKwkJfQorCQlyZXR1cm4gaW5mZWN0aW91czsKKwl9CisJCisJLyoqCisJICogRnJvbSB0aGUgZGF0YU1hcCBleHRyYWN0IGEgbGlzdCBvZiBwb3B1bGF0aW9uIHZhbHVlcworCSAqIEBwYXJhbSBkYXRhTWFwCisJICogQHJldHVybiBsaXN0IG9mIGluZmVjdGlvdXMgcGVvcGxlCisJICovCisJcHVibGljIExpc3Q8RG91YmxlPiBnZXRQb3B1bGF0aW9uKFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGRhdGFNYXApIHsKKwkJZmluYWwgU3RyaW5nIFBPUFVMQVRJT04gPSBTdGF0ZXMuc3RhdGVzVG9GaXRbU3RhdGVzLlBPUFVMQVRJT05dOworCQkKKwkJIAorCQkvLyBNVVNUIGV4aXN0CisJCUxpc3Q8U3RyaW5nPiBwb3BMaXN0ID0gZGF0YU1hcC5nZXREYXRhKFBPUFVMQVRJT04pOworCQkvLyBXZSBzaG91bGQgc3RhbmRhcmRpemUgb24gUCBmb3IgcG9wdWxhdGlvbiBjb3VudAorCQlpZihwb3BMaXN0ID09IG51bGwpIHBvcExpc3QgPSAgZGF0YU1hcC5nZXREYXRhKCJQb3B1bGF0aW9uIENvdW50Iik7CisJCWFzc2VydChwb3BMaXN0IT1udWxsKTsKKwkJCisJCUxpc3Q8RG91YmxlPiBwb3B1bGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHBvcExpc3Quc2l6ZSgpOyBpICsrKSB7CisJCQkKKwkJCWRvdWJsZSBpbmYgPSAobmV3IERvdWJsZShwb3BMaXN0LmdldChpKSkpLmRvdWJsZVZhbHVlKCk7CisJCQlwb3B1bGF0aW9ucy5hZGQobmV3IERvdWJsZShpbmYpKTsKKwkJfQorCQlyZXR1cm4gcG9wdWxhdGlvbnM7CisJfQorCQorfSAvL0Vycm9yRnVuY3Rpb25JbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2ltcGwvRXJyb3JSZXN1bHRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2ltcGwvRXJyb3JSZXN1bHRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzZDdkNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvaW1wbC9FcnJvclJlc3VsdEltcGwuamF2YQpAQCAtMCwwICsxLDM2NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5BbmFseXNpc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5FcnJvclJlc3VsdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVycm9yIFJlc3VsdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLkVycm9yUmVzdWx0SW1wbCNnZXRFcnJvckJ5VGltZVN0ZXAgPGVtPkVycm9yIEJ5IFRpbWUgU3RlcDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLkVycm9yUmVzdWx0SW1wbCNnZXRFcnJvciA8ZW0+RXJyb3I8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5FcnJvclJlc3VsdEltcGwjZ2V0UmVmZXJlbmNlQnlUaW1lIDxlbT5SZWZlcmVuY2UgQnkgVGltZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLkVycm9yUmVzdWx0SW1wbCNnZXRNb2RlbEJ5VGltZSA8ZW0+TW9kZWwgQnkgVGltZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLkVycm9yUmVzdWx0SW1wbCNnZXRWYWxpZGF0aW9uRXJyb3IgPGVtPlZhbGlkYXRpb24gRXJyb3I8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFcnJvclJlc3VsdEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVycm9yUmVzdWx0IHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFcnJvckJ5VGltZVN0ZXAoKSA8ZW0+RXJyb3IgQnkgVGltZSBTdGVwPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFcnJvckJ5VGltZVN0ZXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxEb3VibGU+IGVycm9yQnlUaW1lU3RlcDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXJyb3IoKSA8ZW0+RXJyb3I8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEVycm9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBFUlJPUl9FREVGQVVMVCA9IDAuMDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFcnJvcigpIDxlbT5FcnJvcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RXJyb3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgZXJyb3IgPSBFUlJPUl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyZW5jZUJ5VGltZSgpIDxlbT5SZWZlcmVuY2UgQnkgVGltZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVmZXJlbmNlQnlUaW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8RG91YmxlPiByZWZlcmVuY2VCeVRpbWU7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TW9kZWxCeVRpbWUoKSA8ZW0+TW9kZWwgQnkgVGltZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TW9kZWxCeVRpbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxEb3VibGU+IG1vZGVsQnlUaW1lOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbGlkYXRpb25FcnJvcigpIDxlbT5WYWxpZGF0aW9uIEVycm9yPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRWYWxpZGF0aW9uRXJyb3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFZBTElEQVRJT05fRVJST1JfRURFRkFVTFQgPSAwLjA7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsaWRhdGlvbkVycm9yKCkgPGVtPlZhbGlkYXRpb24gRXJyb3I8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbGlkYXRpb25FcnJvcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSB2YWxpZGF0aW9uRXJyb3IgPSBWQUxJREFUSU9OX0VSUk9SX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEVycm9yUmVzdWx0SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEFuYWx5c2lzUGFja2FnZS5MaXRlcmFscy5FUlJPUl9SRVNVTFQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PERvdWJsZT4gZ2V0RXJyb3JCeVRpbWVTdGVwKCkgeworCQlyZXR1cm4gZXJyb3JCeVRpbWVTdGVwOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVycm9yQnlUaW1lU3RlcChFTGlzdDxEb3VibGU+IG5ld0Vycm9yQnlUaW1lU3RlcCkgeworCQlFTGlzdDxEb3VibGU+IG9sZEVycm9yQnlUaW1lU3RlcCA9IGVycm9yQnlUaW1lU3RlcDsKKwkJZXJyb3JCeVRpbWVTdGVwID0gbmV3RXJyb3JCeVRpbWVTdGVwOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBbmFseXNpc1BhY2thZ2UuRVJST1JfUkVTVUxUX19FUlJPUl9CWV9USU1FX1NURVAsIG9sZEVycm9yQnlUaW1lU3RlcCwgZXJyb3JCeVRpbWVTdGVwKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRFcnJvcigpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVycm9yKGRvdWJsZSBuZXdFcnJvcikgeworCQlkb3VibGUgb2xkRXJyb3IgPSBlcnJvcjsKKwkJZXJyb3IgPSBuZXdFcnJvcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQW5hbHlzaXNQYWNrYWdlLkVSUk9SX1JFU1VMVF9fRVJST1IsIG9sZEVycm9yLCBlcnJvcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxEb3VibGU+IGdldFJlZmVyZW5jZUJ5VGltZSgpIHsKKwkJcmV0dXJuIHJlZmVyZW5jZUJ5VGltZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VCeVRpbWUoRUxpc3Q8RG91YmxlPiBuZXdSZWZlcmVuY2VCeVRpbWUpIHsKKwkJRUxpc3Q8RG91YmxlPiBvbGRSZWZlcmVuY2VCeVRpbWUgPSByZWZlcmVuY2VCeVRpbWU7CisJCXJlZmVyZW5jZUJ5VGltZSA9IG5ld1JlZmVyZW5jZUJ5VGltZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQW5hbHlzaXNQYWNrYWdlLkVSUk9SX1JFU1VMVF9fUkVGRVJFTkNFX0JZX1RJTUUsIG9sZFJlZmVyZW5jZUJ5VGltZSwgcmVmZXJlbmNlQnlUaW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PERvdWJsZT4gZ2V0TW9kZWxCeVRpbWUoKSB7CisJCXJldHVybiBtb2RlbEJ5VGltZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNb2RlbEJ5VGltZShFTGlzdDxEb3VibGU+IG5ld01vZGVsQnlUaW1lKSB7CisJCUVMaXN0PERvdWJsZT4gb2xkTW9kZWxCeVRpbWUgPSBtb2RlbEJ5VGltZTsKKwkJbW9kZWxCeVRpbWUgPSBuZXdNb2RlbEJ5VGltZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQW5hbHlzaXNQYWNrYWdlLkVSUk9SX1JFU1VMVF9fTU9ERUxfQllfVElNRSwgb2xkTW9kZWxCeVRpbWUsIG1vZGVsQnlUaW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRWYWxpZGF0aW9uRXJyb3IoKSB7CisJCXJldHVybiB2YWxpZGF0aW9uRXJyb3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbkVycm9yKGRvdWJsZSBuZXdWYWxpZGF0aW9uRXJyb3IpIHsKKwkJZG91YmxlIG9sZFZhbGlkYXRpb25FcnJvciA9IHZhbGlkYXRpb25FcnJvcjsKKwkJdmFsaWRhdGlvbkVycm9yID0gbmV3VmFsaWRhdGlvbkVycm9yOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBbmFseXNpc1BhY2thZ2UuRVJST1JfUkVTVUxUX19WQUxJREFUSU9OX0VSUk9SLCBvbGRWYWxpZGF0aW9uRXJyb3IsIHZhbGlkYXRpb25FcnJvcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQW5hbHlzaXNQYWNrYWdlLkVSUk9SX1JFU1VMVF9fRVJST1JfQllfVElNRV9TVEVQOgorCQkJCXJldHVybiBnZXRFcnJvckJ5VGltZVN0ZXAoKTsKKwkJCWNhc2UgQW5hbHlzaXNQYWNrYWdlLkVSUk9SX1JFU1VMVF9fRVJST1I6CisJCQkJcmV0dXJuIGdldEVycm9yKCk7CisJCQljYXNlIEFuYWx5c2lzUGFja2FnZS5FUlJPUl9SRVNVTFRfX1JFRkVSRU5DRV9CWV9USU1FOgorCQkJCXJldHVybiBnZXRSZWZlcmVuY2VCeVRpbWUoKTsKKwkJCWNhc2UgQW5hbHlzaXNQYWNrYWdlLkVSUk9SX1JFU1VMVF9fTU9ERUxfQllfVElNRToKKwkJCQlyZXR1cm4gZ2V0TW9kZWxCeVRpbWUoKTsKKwkJCWNhc2UgQW5hbHlzaXNQYWNrYWdlLkVSUk9SX1JFU1VMVF9fVkFMSURBVElPTl9FUlJPUjoKKwkJCQlyZXR1cm4gZ2V0VmFsaWRhdGlvbkVycm9yKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQW5hbHlzaXNQYWNrYWdlLkVSUk9SX1JFU1VMVF9fRVJST1JfQllfVElNRV9TVEVQOgorCQkJCXNldEVycm9yQnlUaW1lU3RlcCgoRUxpc3Q8RG91YmxlPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBBbmFseXNpc1BhY2thZ2UuRVJST1JfUkVTVUxUX19FUlJPUjoKKwkJCQlzZXRFcnJvcigoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEFuYWx5c2lzUGFja2FnZS5FUlJPUl9SRVNVTFRfX1JFRkVSRU5DRV9CWV9USU1FOgorCQkJCXNldFJlZmVyZW5jZUJ5VGltZSgoRUxpc3Q8RG91YmxlPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBBbmFseXNpc1BhY2thZ2UuRVJST1JfUkVTVUxUX19NT0RFTF9CWV9USU1FOgorCQkJCXNldE1vZGVsQnlUaW1lKChFTGlzdDxEb3VibGU+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEFuYWx5c2lzUGFja2FnZS5FUlJPUl9SRVNVTFRfX1ZBTElEQVRJT05fRVJST1I6CisJCQkJc2V0VmFsaWRhdGlvbkVycm9yKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEFuYWx5c2lzUGFja2FnZS5FUlJPUl9SRVNVTFRfX0VSUk9SX0JZX1RJTUVfU1RFUDoKKwkJCQlzZXRFcnJvckJ5VGltZVN0ZXAoKEVMaXN0PERvdWJsZT4pbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBBbmFseXNpc1BhY2thZ2UuRVJST1JfUkVTVUxUX19FUlJPUjoKKwkJCQlzZXRFcnJvcihFUlJPUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBBbmFseXNpc1BhY2thZ2UuRVJST1JfUkVTVUxUX19SRUZFUkVOQ0VfQllfVElNRToKKwkJCQlzZXRSZWZlcmVuY2VCeVRpbWUoKEVMaXN0PERvdWJsZT4pbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBBbmFseXNpc1BhY2thZ2UuRVJST1JfUkVTVUxUX19NT0RFTF9CWV9USU1FOgorCQkJCXNldE1vZGVsQnlUaW1lKChFTGlzdDxEb3VibGU+KW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQW5hbHlzaXNQYWNrYWdlLkVSUk9SX1JFU1VMVF9fVkFMSURBVElPTl9FUlJPUjoKKwkJCQlzZXRWYWxpZGF0aW9uRXJyb3IoVkFMSURBVElPTl9FUlJPUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEFuYWx5c2lzUGFja2FnZS5FUlJPUl9SRVNVTFRfX0VSUk9SX0JZX1RJTUVfU1RFUDoKKwkJCQlyZXR1cm4gZXJyb3JCeVRpbWVTdGVwICE9IG51bGw7CisJCQljYXNlIEFuYWx5c2lzUGFja2FnZS5FUlJPUl9SRVNVTFRfX0VSUk9SOgorCQkJCXJldHVybiBlcnJvciAhPSBFUlJPUl9FREVGQVVMVDsKKwkJCWNhc2UgQW5hbHlzaXNQYWNrYWdlLkVSUk9SX1JFU1VMVF9fUkVGRVJFTkNFX0JZX1RJTUU6CisJCQkJcmV0dXJuIHJlZmVyZW5jZUJ5VGltZSAhPSBudWxsOworCQkJY2FzZSBBbmFseXNpc1BhY2thZ2UuRVJST1JfUkVTVUxUX19NT0RFTF9CWV9USU1FOgorCQkJCXJldHVybiBtb2RlbEJ5VGltZSAhPSBudWxsOworCQkJY2FzZSBBbmFseXNpc1BhY2thZ2UuRVJST1JfUkVTVUxUX19WQUxJREFUSU9OX0VSUk9SOgorCQkJCXJldHVybiB2YWxpZGF0aW9uRXJyb3IgIT0gVkFMSURBVElPTl9FUlJPUl9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGVycm9yQnlUaW1lU3RlcDogIik7CisJCXJlc3VsdC5hcHBlbmQoZXJyb3JCeVRpbWVTdGVwKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBlcnJvcjogIik7CisJCXJlc3VsdC5hcHBlbmQoZXJyb3IpOworCQlyZXN1bHQuYXBwZW5kKCIsIHJlZmVyZW5jZUJ5VGltZTogIik7CisJCXJlc3VsdC5hcHBlbmQocmVmZXJlbmNlQnlUaW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtb2RlbEJ5VGltZTogIik7CisJCXJlc3VsdC5hcHBlbmQobW9kZWxCeVRpbWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIHZhbGlkYXRpb25FcnJvcjogIik7CisJCXJlc3VsdC5hcHBlbmQodmFsaWRhdGlvbkVycm9yKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIEVycm9yUmVzdWx0IGNvcHkoKSB7CisJCUVycm9yUmVzdWx0SW1wbCByZXMgPSBuZXcgRXJyb3JSZXN1bHRJbXBsKCk7CisJCXJlcy5zZXRFcnJvcih0aGlzLmdldEVycm9yKCkpOworCQlyZXMuc2V0VmFsaWRhdGlvbkVycm9yKHRoaXMuZ2V0VmFsaWRhdGlvbkVycm9yKCkpOworCQlFTGlzdDxEb3VibGU+bmV3bGlzdCA9IG5ldyBCYXNpY0VMaXN0PERvdWJsZT4oKTsKKwkJZm9yKGRvdWJsZSBkOnRoaXMuZ2V0RXJyb3JCeVRpbWVTdGVwKCkpbmV3bGlzdC5hZGQoZCk7CisJCXJlcy5zZXRFcnJvckJ5VGltZVN0ZXAobmV3bGlzdCk7CisJCXJldHVybiByZXM7CisJfQorCit9IC8vRXJyb3JSZXN1bHRJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL2ltcGwvUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9pbXBsL1JlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWI0Njk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9pbXBsL1JlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwuamF2YQpAQCAtMCwwICsxLDU2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5BbmFseXNpc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5EaXNlYXNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLlJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLlN0YXRlczsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlZmVyZW5jZSBTY2VuYXJpbyBEYXRhIE1hcDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsKCkgeworCQlzdXBlcigpOworCQlyZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlPigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQW5hbHlzaXNQYWNrYWdlLkxpdGVyYWxzLlJFRkVSRU5DRV9TQ0VOQVJJT19EQVRBX01BUDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVEVSQVRJT05fS0VZID0gIml0ZXJhdGlvbiI7CisJLyoqCisJICoga2V5IGZvciBpbmNpZGVuY2UgZGF0YQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0lERU5DRV9LRVkgPSAiSW5jaWRlbmNlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FX0tFWSA9ICJ0aW1lIjsKKwlwcml2YXRlIGRvdWJsZSBtYXhJbmNpZGVuY2UgPSAwLjA7CisJcHJpdmF0ZSBTdHJpbmcgbWF4SW5jaWRlbmNlTG9jYXRpb247CisJCisJCisJLyoqCisJICogQSBzaW5nbGUgUmVmZXJlbmNlIFNjZW5hcmlvIGlzIHN0b3JlZCBpbiBhIG1hcAorCSAqIGZvciBlYWNoICBrZXk8U3RyaW5nPiA9IFJlZ2lvbiBpZAorCSAqLworCU1hcDxTdHJpbmcsIFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlPiByZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAgPSBudWxsOworCQorCS8qKgorCSAqIERpcmVjdG9yeSB1c2VkCisJICovCisJCisJcHJpdmF0ZSBTdHJpbmcgcmVmRGlyOworCQorCS8qKgorCSAqIFR5cGUgb2YgZGF0YSAoZS5nLiBTSVIpCisJICovCisJCisJRGlzZWFzZVR5cGUgdHlwZTsKKwkKKwkvKioKKwkgKiBhZGRJbnN0YW5jZSBBZGQgYSBuZXcgZGF0YSBpbnN0YW5jZSAoZS5nLiBkYXRhIGZyb20gLmNzdiBmaWxlKSB0byB0aGUgbWFwCisJICogCisJICogQHBhcmFtIGtleSBUaGUga2V5LCBlLmcuIGNpdHkgaWQKKwkgKiBAcGFyYW0gZGF0YSBSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSAKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRJbnN0YW5jZShTdHJpbmcga2V5LCBSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBkYXRhKSB7CisJCXJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcC5wdXQoa2V5LCBkYXRhKTsKKwl9CisJCisJLyoqCisJICogCisJICovCisJcHVibGljIHZvaWQgZmluZE1heEluY2lkZW5jZSgpIHsKKwkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gcmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCXdoaWxlKChpdGVyIT1udWxsKSYmKGl0ZXIuaGFzTmV4dCgpKSApIHsKKwkJCVN0cmluZyBrZXkgPSBpdGVyLm5leHQoKTsKKwkJCVJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGRhdGEgPSByZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAuZ2V0KGtleSk7CisJCQlkb3VibGUgY291bnQgPSBnZXRUb3RhbEluY2lkZW5jZShkYXRhKTsKKwkJCWlmKGNvdW50ID49IG1heEluY2lkZW5jZSkgeworCQkJCW1heEluY2lkZW5jZSA9IGNvdW50OworCQkJCW1heEluY2lkZW5jZUxvY2F0aW9uID0ga2V5OworCQkJfQorCQl9CisJfQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgZGF0YS4gVXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggcGFyYW1ldGVyIGVzdGltYXRvcihzKQorCSAqIGNhbiBiZSB1c2VkLgorCSAqIAorCSAqIEByZXR1cm4gUGFyYW1ldGVyRXN0aW1hdG9yLlR5cGUgVGhlIHR5cGUsIGUuZy4gU0VJUiAKKwkgKi8KKwkKKwlwdWJsaWMgRGlzZWFzZVR5cGUgZ2V0VHlwZSgpIHsKKwkJaWYocmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwID09IG51bGwgfHwgcmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwLnNpemUoKSA9PSAwKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gdGhpcy50eXBlOworCX0KKwkKKwkvKioKKwkgKiBTZXQgdGhlIHR5cGUgb2YgdGhlIGRhdGEKKwkgKiAKKwkgKiBAcGFyYW0gdCBOZXcgdHlwZSAKKwkgKi8KKwkKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKERpc2Vhc2VUeXBlIHQpIHsKKwkJdGhpcy50eXBlID0gdDsKKwl9CisJCisJLyoqCisJICogZ2V0TnVtTG9jYXRpb25zLiBSZXR1cm4gdGhlIG51bWJlciBvZiBsb2NhdGlvbnMgYW5hbHl6ZWQKKwkgKiAKKwkgKiBAcmV0dXJuIGludCBOdW1iZXIgb2YgbG9jYXRpb25zCisJICovCisJCisJcHVibGljIGludCBnZXROdW1Mb2NhdGlvbnMoKSB7CisJCXJldHVybiByZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAuc2l6ZSgpOworCX0KKwkKKwkvKioKKwkgKiBnZXRMb2NhdGlvbnMuIFJldHVybiB0aGUgbG9jYXRpb25zCisJICogCisJICogQHJldHVybiBTZXQ8U3RyaW5nPiBTZXQgb2YgYWxsIGxvY2F0aW9ucworCSAqLworCQorCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRMb2NhdGlvbnMoKSB7CisJCXJldHVybiByZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAua2V5U2V0KCk7CisJfQorCQorCQorCS8qKgorCSAqIFRoZSB0aGUgdG90YWwgaW5jaWRlbmNlIChzdW1taW5nIG92ZXIgYWxsIHRpbWUgZm9yIHNvbWUgbG9jYXRpb24gaW5zdGFuY2UgCisJICogQHBhcmFtIGluc3RhbmNlCisJICogQHJldHVybiB0aGUgdG90YWwgSW5jaWRlbmNlIGNvdW50CisJICovCisJcHVibGljIGRvdWJsZSBnZXRUb3RhbEluY2lkZW5jZShSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBpbnN0YW5jZSkgeworCQlkb3VibGUgcmV0VmFsdWUgPSAwLjA7CisJCWlmKGluc3RhbmNlLmdldERhdGEoKS5jb250YWluc0tleShJTkNJREVOQ0VfS0VZKSkgeworCQkJTGlzdDxEb3VibGU+IGluY2lkZW5jZSA9IGluc3RhbmNlLmdldERhdGEoKS5nZXQoSU5DSURFTkNFX0tFWSk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGluY2lkZW5jZS5zaXplKCk7IGkgKyspIHsKKwkJCQlyZXRWYWx1ZSArPSBpbmNpZGVuY2UuZ2V0KGkpLmRvdWJsZVZhbHVlKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJldFZhbHVlOworCX0KKwkKKwkvKioKKwkgKiBjb250YWluc0xvY2F0aW9uIFJldHVybiB0cnVlIGlmIHRoZSBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCBsb2NhdGlvbgorCSAqIAorCSAqIEBwYXJhbSBsb2MKKwkgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiB0aGUgbG9jYXRpb24gaXMgZm91bmQgaW4gdGhlIG1hcAorCSAqLworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zTG9jYXRpb24oU3RyaW5nIGxvYykgeworCQlyZXR1cm4gcmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwLmNvbnRhaW5zS2V5KGxvYyk7CisJfQorCQorCS8qKgorCSAqIGdldExvY2F0aW9uLiBSZXR1cm4gdGhlIGRhdGEgZm9yIHRoZSBnaXZlbiBsb2NhdGlvbgorCSAqIEBwYXJhbSBsb2MgCisJICogQHJldHVybiBSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBMb2NhdGlvbiBpbnN0YW5jZSwgb3IgbnVsbCBpZiBub3QgZm91bmQKKwkgKi8KKwkKKwlwdWJsaWMgUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UgZ2V0TG9jYXRpb24oU3RyaW5nIGxvYykgeworCQlyZXR1cm4gcmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwLmdldChsb2MpOworCX0KKwkKKwkvKioKKwkgKiBBZ2dyZWdhdGUgb3IgaW50ZWdyYXRlIGFsbCBkYXRhIGZvciBhbGwgbG9jYXRpb25zIGluIGEgc2NlbmFyaW8uCisJICogCisJICogQHBhcmFtIHJ1bm5hYmxlQ29udGV4dCBSdW5uYWJsZSBjb250ZXh0IGZvciBwcm9ncmVzcyBpbmRpY2F0b3IKKwkgKiBAcmV0dXJuIFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGFnZ3JlZ2F0ZWQgZGF0YSBpbnN0YW5jZSwgb3IgbnVsbCBpZiBub3QgZm91bmQKKwkgKi8KKwkKKwlwdWJsaWMgUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UgYWdncmVnYXRlU2NlbmFyaW9EYXRhKElSdW5uYWJsZUNvbnRleHQgcnVubmFibGVDb250ZXh0KSB7CisJCWZpbmFsIFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGFnZ3JlZ2F0ZWREYXRhID0gbmV3IFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlKHRoaXMpOworCQkKKwkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGFnZ3JlZ2F0ZVRhc2sgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgIAlwcm9ncmVzcy5iZWdpblRhc2soIkFnZ3JlZ2F0aW5nIGRhdGEuLi4iLCByZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAuc2l6ZSgpKTsgICAJCisgICAgICAgICAgICAJSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gcmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAJd2hpbGUoKGl0ZXIhPW51bGwpJiYoaXRlci5oYXNOZXh0KCkpKSB7CisgICAgICAgICAgICAJCXByb2dyZXNzLndvcmtlZCgxKTsKKyAgICAgICAgICAgIAkJaWYocHJvZ3Jlc3MuaXNDYW5jZWxlZCgpKSB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIAkJU3RyaW5nIGxvYyA9IGl0ZXIubmV4dCgpOworCQkJCisgICAgICAgICAgICAJCVJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGxvY2F0aW9uRGF0YSA9IHJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcC5nZXQobG9jKTsKKyAgICAgICAgICAgIAkJYWdncmVnYXRlZERhdGEuaW50ZWdyYXRlRGF0YShsb2NhdGlvbkRhdGEuaW5zdGFuY2UpOworICAgICAgICAgICAgCX0vLyBhbGwgbG9jYXRpb25zCisgICAgICAgICAgICAJcHJvZ3Jlc3MuZG9uZSgpOworICAgICAgICAgICAgfQorCQl9OworCQkKKwkJdHJ5IHsKKwkJCXJ1bm5hYmxlQ29udGV4dC5ydW4odHJ1ZSwgdHJ1ZSwgYWdncmVnYXRlVGFzayk7CisJCX0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKwkJCS8vIFRvRG8KKwkJCXJldHVybiBudWxsOworCQl9IGNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7CisJCQkvLyBUb0RvCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gYWdncmVnYXRlZERhdGE7CisJfQorCQorCS8qKgorCSAqIGdldFJlZmVyZW5jZURpcmVjdG9yeS4gUmV0dXJuIHRoZSByZWZlcmVuY2UgZGlyZWN0b3J5IHVzZWQKKwkgKiAKKwkgKiBAcmV0dXJuIFN0cmluZyBSZWZlcmVuY2UgZGlyZWN0b3J5CisJICovCisJCisJcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VEaXJlY3RvcnkoKSB7CisJCXJldHVybiB0aGlzLnJlZkRpcjsKKwl9CisJCisJLyoqCisJICogc2V0UmVmZXJlbmNlRGlyZWN0b3kuIFNldCB0aGUgcmVmZXJlbmNlIGRpcmVjdG9yeQorCSAqIAorCSAqIEBwYXJhbSBkaXIgVGhlIGRpcmVjdG9yeQorCSAqLworCQorCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZURpcmVjdG9yeShTdHJpbmcgZCkgeworCQl0aGlzLnJlZkRpciA9IGQ7CisJfQorCQorCS8qKgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1heCBpbmNpZGVuY2UgYXQgdGhlIG1vc3QgZWZmZWN0ZWQgbG9jYXRpb24gCisJICovCisJcHVibGljIGRvdWJsZSBnZXRNYXhJbmNpZGVuY2UoKSB7CisJCXJldHVybiBtYXhJbmNpZGVuY2U7CisJfQorCisJLyoqCisJICogCisJICogQHJldHVybiB0aGUgbG9jYXRpb24gd2l0aCB0aGUgbWF4IGluY2lkZW5jZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TWF4SW5jaWRlbmNlTG9jYXRpb24oKSB7CisJCXJldHVybiBtYXhJbmNpZGVuY2VMb2NhdGlvbjsKKwl9CisJCisJCisJLyoqCisJICogUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UuIENvbnRhaW5zIGRhdGEgZm9yIG9uZSBsb2NhdGlvbiAgCisJCisJICovCisJcHVibGljIGNsYXNzIFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKwkJCisJCXByaXZhdGUgZG91YmxlIG1heFMgPSAwLjA7CisJCXByaXZhdGUgZG91YmxlIG1heEUgPSAwLjA7CisJCXByaXZhdGUgZG91YmxlIG1heEkgPSAwLjA7CisJCXByaXZhdGUgZG91YmxlIG1heFIgPSAwLjA7CisJCQkKKwkJCisKKwkJLyoqCisJCSAqIFRoZSByZWdpb24gZGF0YSBtYXAgaXMga2V5ZWQgYnkgcHJvcGVydHkgKFMsRSwgSSwgUiwgaW5jaWRlbmNlLCBldGMpIGFuZCBjb250YWlucyBEYXRhIChtb3N0bHkgRG91YmxlcyBidXQKKwkJICogU1RFTVRpbWUgaXMgc3RvcmVkIGFzIGEgU3RyaW5nKSBzbyBhbGwgZGF0YSBpcyBzdG9yZWQgYXMgU3RyaW5nLgorCQkgKi8KKwkJCisJCXB1YmxpYyBNYXA8U3RyaW5nLExpc3Q8U3RyaW5nPj4gaW5zdGFuY2U7CisJCQorCQkKKworCQlwcm90ZWN0ZWQgUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCBkYXRhTWFwOworCQkKKwkJLyoqCisJCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZQorCQkgKiAgCisJCSAqIEBwYXJhbSBkYXRhIE1hcCBvZiBwYXJhbWV0ZXIgKGUuZy4gYSBzdGF0ZSkgYW5kIGl0cyB2YWx1ZXMKKwkJICogQHBhcmFtIG1hcCBEYXRhTWFwIHRoZSBpbnN0YW5jZSBiZWxvbmdzIHRvCisJCSAqLworCQlwdWJsaWMgUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBkYXRhLCBSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIG1hcCkgeworCQkJdGhpcy5pbnN0YW5jZSA9IGRhdGE7CisJCQl0aGlzLmRhdGFNYXAgPSBtYXA7CisJCX0KKwkJCisJCS8qKgorCQkgKiBDcmVhdGUgYW4gZW1wdHkgaW5zdGFuY2Ugb2Ygc29tZSB0eXBlCisJCSAqICAKKwkJICogQHBhcmFtIGRhdGFNYXAgbWFwCisJCSAqLworCQlwdWJsaWMgUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UoUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCBkYXRhTWFwKSB7CisJCQl0aGlzLmluc3RhbmNlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7CisJCQl0aGlzLmRhdGFNYXAgPSBkYXRhTWFwOworCQl9CisJCQorCQkvKioKKwkJICogZGVlcCBjbG9uZQorCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjY2xvbmUoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyAgUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UgY2xvbmUoKSB7CisJCQl0aGlzLmdldERhdGEoKTsKKwkJCVJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIG5ld0luc3RhbmNlID0gbmV3IFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlKHRoaXMuZGF0YU1hcCk7CisJCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSB0aGlzLmluc3RhbmNlLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCQl3aGlsZShpdGVyLmhhc05leHQoKSkgeworCQkJCVN0cmluZyBrZXkgPSBpdGVyLm5leHQoKTsKKwkJCQlMaXN0PFN0cmluZz4gZGF0YUxpc3QgPSBpbnN0YW5jZS5nZXQoa2V5KTsKKwkJCQlMaXN0PFN0cmluZz4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhTGlzdC5zaXplKCk7IGkgKyspIHsKKwkJCQkJU3RyaW5nIHZhbCA9IGRhdGFMaXN0LmdldChpKTsKKwkJCQkJbmV3TGlzdC5hZGQodmFsKTsKKwkJCQl9CisJCQkJbmV3SW5zdGFuY2UuaW5zdGFuY2UucHV0KGtleSxuZXdMaXN0KTsKKwkJCX0KKwkJCW5ld0luc3RhbmNlLmdldERhdGEoKTsKKwkJCXJldHVybiBuZXdJbnN0YW5jZTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIGludGVncmF0ZXMgZGF0YSBmcm9tIGFub3RoZXIgaW5zdGFuY2UKKwkJICogQHBhcmFtIGRhdGEKKwkJICovCisJCXB1YmxpYyB2b2lkIGludGVncmF0ZURhdGEoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBkYXRhKSB7CisJCQkvLyBnZXQgdGhlIHN0YXRlIHZhcmlhYmxlcyBTRUlSLi4uIGFzIGtleXMKKwkJCWZvciAoRW50cnk8U3RyaW5nLExpc3Q8U3RyaW5nPj4gZW50cnkgOiBkYXRhLmVudHJ5U2V0KCkpIHsKKwkJCQkvLyBnZXQgdGhlIGtleQorCQkJCVN0cmluZyBzdGF0ZSA9IGVudHJ5LmdldEtleSgpOworCQkJCUxpc3Q8U3RyaW5nPiB2YWx1ZUxpc3QgPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJCWlmKHZhbHVlTGlzdC5zaXplKCk+PTEpIHsKKwkJCQkJLy8gZ2V0IHRoZSBjdXJyZW50IGxpc3QKKwkJCQkJTGlzdDxTdHJpbmc+IGFnZ3JlZ2F0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQkJCWlmKHRoaXMuaW5zdGFuY2UuY29udGFpbnNLZXkoc3RhdGUpKSB7CisJCQkJCQlhZ2dyZWdhdGVkTGlzdCA9IHRoaXMuaW5zdGFuY2UuZ2V0KHN0YXRlKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIGNyZWF0ZSBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0CisJCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdmFsdWVMaXN0LnNpemUoKTsgaSArKykgeworCQkJCQkJCWFnZ3JlZ2F0ZWRMaXN0LmFkZCgiMC4wIik7CisJCQkJCQl9CisJCQkJCQl0aGlzLmluc3RhbmNlLnB1dChzdGF0ZSxhZ2dyZWdhdGVkTGlzdCk7CisJCQkJCX0KKwkJCQkJCisJCQkJCQorCQkJCQkKKwkJCQkJU3RyaW5nIGZpcnN0ID0gdmFsdWVMaXN0LmdldCgwKTsKKwkJCQkJLy8gY2hlY2sgaWYgdGhpcyBpcyBudW1lcmljIGRhdGEgLSBpdCBtaWdodCBqdXN0IGJlIGEgZGF0ZQorCQkJCQlib29sZWFuIGlzRGF0YSA9IHRydWU7CisJCQkJCXRyeSB7CisJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJCQkJCWRvdWJsZSB2YWwgPSAobmV3IERvdWJsZShmaXJzdCkpLmRvdWJsZVZhbHVlKCk7CisJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKwkJCQkJCWlzRGF0YSA9IGZhbHNlOworCQkJCQl9CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVMaXN0LnNpemUoKTsgaSArKykgeworCQkJCQkJU3RyaW5nIHZhbHVlID0gdmFsdWVMaXN0LmdldChpKTsKKwkJCQkJCWlmKGlzRGF0YSkgeworCQkJCQkJCWRvdWJsZSB2YWwgPSAobmV3IERvdWJsZSh2YWx1ZSkpLmRvdWJsZVZhbHVlKCk7CisJCQkJCQkJZG91YmxlIG9sZFZhbCA9IChuZXcgRG91YmxlKGFnZ3JlZ2F0ZWRMaXN0LmdldChpKSkpLmRvdWJsZVZhbHVlKCk7CisJCQkJCQkJaWYoc3RhdGUuaW5kZXhPZihJVEVSQVRJT05fS0VZKT09LTEpIHsKKwkJCQkJCQkJLy8gYWRkIHRoZW0gdXAgZXhjZXB0IGZvciB0aGUgaXRlcmF0aW9uIGNvdW50ZXIgY29sdW1uCisJCQkJCQkJCW9sZFZhbCArPSB2YWw7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJb2xkVmFsID0gdmFsOworCQkJCQkJCX0KKwkJCQkJCQlhZ2dyZWdhdGVkTGlzdC5zZXQoaSwiIitvbGRWYWwpOworCQkJCQkJCXRoaXMuaW5zdGFuY2UucHV0KHN0YXRlLGFnZ3JlZ2F0ZWRMaXN0KTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8ganVzdCBjb3B5IHRoZSBzdHJpbmdzCisJCQkJCQkJYWdncmVnYXRlZExpc3Quc2V0KGksdmFsdWUpOworCQkJCQkJCXRoaXMuaW5zdGFuY2UucHV0KHN0YXRlLGFnZ3JlZ2F0ZWRMaXN0KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkKKwkJCQkJCisJCQkJfQorCQkJCQorCQkJCQorCQkJfQorCQkJCisJCQkKKwkJfQorCQkKKwkJCisJCS8qKgorCQkgKiBnZXREYXRhLiBSZXR1cm4gZGF0YSBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlciAoZS5nLiBzdGF0ZSkKKwkJICogCisJCSAqIEBwYXJhbSBwYXJtIFBhcmFtZXRlcgorCQkgKiBAcmV0dXJuIExpc3Q8U3RyaW5nPiBkYXRhCisJCSAqLworCQkKKwkJcHVibGljIExpc3Q8U3RyaW5nPiBnZXREYXRhKFN0cmluZyBwYXJtKSB7CisJCQlyZXR1cm4gaW5zdGFuY2UuZ2V0KHBhcm0pOworCQl9CisJCQorCQkvKioKKwkJICogY29udGFpbnNQYXJhbWV0ZXIuIFJldHVybiB0cnVlIGlmIHRoZSBkYXRhIGNvbnRhaW5zIHRoZSBnaXZlbiBwYXJhbWV0ZXIgKGUuZy4gYSBzdGF0ZSkKKwkJICogCisJCSAqIEBwYXJhbSBwIFBhcmFtZXRlciB0byBjaGVjaworCQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlCisJCSAqLworCQkKKwkJcHVibGljIGJvb2xlYW4gY29udGFpbnNQYXJhbWV0ZXIoU3RyaW5nIHApIHsKKwkJCXJldHVybiB0aGlzLmluc3RhbmNlLmNvbnRhaW5zS2V5KHApOworCQl9CisJCQorCQkvKioKKwkJICogZ2V0IHRoZSBhbGwgdGhlIGRhdGEKKwkJICogQHJldHVybiB0aGlzIGluc3RhbmNlIG1hcAorCQkgKi8KKwkJcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0SW5zdGFuY2UoKSB7CisJCQlyZXR1cm4gaW5zdGFuY2U7CisJCX0KKwkJCisJCS8qKgorCQkgKiBmaW5kIHRoZSBtYXhpbXVtIHZhbHVlcyBmb3IgZXZlcnkgc3RhdGUKKwkJICovCisJCXB1YmxpYyB2b2lkIGZpbmRNYXhWYWx1ZXMoKSB7CisJCQkKKwkJCQkJLy8gR2V0IHRoZSBkYXRhLiBBbHdheXMgaGF2ZSBhdCBsZWFzdCBTIGFuZCBJCisJCQkJCUxpc3Q8U3RyaW5nPnNEYXRhID0gdGhpcy5nZXREYXRhKFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuU1VTQ0VQVElCTEVdKTsKKwkJCQkJTGlzdDxTdHJpbmc+ZURhdGEgPSBudWxsOworCQkJCQlMaXN0PFN0cmluZz5pRGF0YSA9IHRoaXMuZ2V0RGF0YShTdGF0ZXMuc3RhdGVzVG9GaXRbU3RhdGVzLklORkVDVElPVVNdKTsKKwkJCQkJTGlzdDxTdHJpbmc+ckRhdGEgPSBudWxsOworCQkJCQkKKwkJCQkJLy8gSWYgRSBzdGF0ZQorICAgICAgICAJCQlpZih0aGlzLmRhdGFNYXAuZ2V0VHlwZSgpPT0gRGlzZWFzZVR5cGUuU0VJUikgIHsKKyAgICAgICAgCQkJCWVEYXRhID0gdGhpcy5nZXREYXRhKFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuRVhQT1NFRF0pOworICAgICAgICAJCQl9CisgICAgICAgIAkJCS8vIElmIGhhdmUgUiBzdGF0ZSAoaS5lLiwgbm90IGFuIFNJIG1vZGVsCisgICAgICAgIAkJCWlmKHRoaXMuZGF0YU1hcC5nZXRUeXBlKCkhPSBEaXNlYXNlVHlwZS5TSSkgIHsKKyAgICAgICAgCQkJCXJEYXRhID0gdGhpcy5nZXREYXRhKFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuUkVDT1ZFUkVEXSk7CisgICAgICAgIAkJCX0KKwkJCQkJCisJCQkJCSAgIAorICAgICAgICAJCQkKKyAgICAgICAgCQkJLy8gaWYgd2UgaGF2ZSBhbiBTIHN0YXRlCisgICAgICAgIAkJCWlmKHNEYXRhICE9IG51bGwpIHsKKyAgICAgICAgCQkJCW1heFMgPSBuZXcgRG91YmxlKHNEYXRhLmdldCgwKSkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIAkJCWZvcihpbnQgaSA9IDA7IGkgPCBzRGF0YS5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgICAgIAkJCQlkb3VibGUgdmFsID0gbmV3IERvdWJsZShzRGF0YS5nZXQoaSkpLmRvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAJCQkJaWYgKHZhbCA+IG1heFMpIHsKKyAgICAgICAgICAgIAkJCQkJbWF4UyA9IHZhbDsKKyAgICAgICAgICAgIAkJCQl9CisgICAgICAgICAgICAJCQl9CisgICAgICAgIAkJCX0vLyBpZiBoYXZlIFMgc3RhdGUKKyAgICAgICAgCQkJCisgICAgICAgIAkJCS8vIGlmIHdlIGhhdmUgYW4gRSBzdGF0ZQorICAgICAgICAJCQlpZihlRGF0YSAhPSBudWxsKSB7CisgICAgICAgIAkJCQltYXhFID0gbmV3IERvdWJsZShlRGF0YS5nZXQoMCkpLmRvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAJCQlmb3IoaW50IGkgPSAwOyBpIDwgZURhdGEuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICAgICAJCQkJZG91YmxlIHZhbCA9IG5ldyBEb3VibGUoZURhdGEuZ2V0KGkpKS5kb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgCQkJCWlmICh2YWwgPiBtYXhFKSB7CisgICAgICAgICAgICAJCQkJCW1heEUgPSB2YWw7CisgICAgICAgICAgICAJCQkJfQorICAgICAgICAgICAgCQkJfQorICAgICAgICAJCQl9Ly8gaWYgaGF2ZSBFIHN0YXRlCisgICAgICAgIAkJCQorICAgICAgICAJCQkvLyBpZiB3ZSBoYXZlIGFuIEkgc3RhdGUKKyAgICAgICAgCQkJaWYoaURhdGEgIT0gbnVsbCkgeworICAgICAgICAJCQkJbWF4SSA9IG5ldyBEb3VibGUoaURhdGEuZ2V0KDApKS5kb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgCQkJZm9yKGludCBpID0gMDsgaSA8IGlEYXRhLnNpemUoKTsgaSArKykgeworICAgICAgICAgICAgCQkJCWRvdWJsZSB2YWwgPSBuZXcgRG91YmxlKGlEYXRhLmdldChpKSkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIAkJCQlpZiAodmFsID4gbWF4SSkgeworICAgICAgICAgICAgCQkJCQltYXhJID0gdmFsOworICAgICAgICAgICAgCQkJCX0KKyAgICAgICAgICAgIAkJCX0KKyAgICAgICAgCQkJfS8vIGlmIGhhdmUgSSBzdGF0ZQorICAgICAgICAJCQkKKyAgICAgICAgCQkJLy8gaWYgd2UgaGF2ZSBhbiBSIHN0YXRlCisgICAgICAgIAkJCWlmKHJEYXRhICE9IG51bGwpIHsKKyAgICAgICAgCQkJCW1heFIgPSBuZXcgRG91YmxlKHJEYXRhLmdldCgwKSkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIAkJCWZvcihpbnQgaSA9IDA7IGkgPCByRGF0YS5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgICAgIAkJCQlkb3VibGUgdmFsID0gbmV3IERvdWJsZShyRGF0YS5nZXQoaSkpLmRvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAJCQkJaWYgKHZhbCA+IG1heFIpIHsKKyAgICAgICAgICAgIAkJCQkJbWF4UiA9IHZhbDsKKyAgICAgICAgICAgIAkJCQl9CisgICAgICAgICAgICAJCQl9CisgICAgICAgIAkJCX0vLyBpZiBoYXZlIFIgc3RhdGUKKyAgICAgICAgCQkJCisJCX0gLy8gZmluZE1heFZhbHVlcworCQkKKwkJCisJCQorCQkvKioKKwkJICogZ2V0RGF0YS4gUmV0dXJuIHRoZSBtYXAgdGhhdCBvZiByYXcgZGF0YSAobm90IGZpbHRlcmVkKQorCQkgKiBAcmV0dXJuICBNYXA8U3RyaW5nLCBMaXN0PERvdWJsZT4+IE1hcCB3aXRoIHN0YXRlLCB2YWx1ZSBsaXN0CisJCSAqLworCQlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKKwkJcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8RG91YmxlPj4gZ2V0RGF0YSgpIHsKKwkJCQorCQkJSGFzaE1hcDxTdHJpbmcsIExpc3Q8RG91YmxlPj4gZGF0YSA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxEb3VibGU+PigpOworCQkJCisJCQlmb3IoU3RyaW5nIHN0YXRlIDogaW5zdGFuY2Uua2V5U2V0KCkpIHsKKwkJCQlBcnJheUxpc3Q8RG91YmxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQkJaWYoc3RhdGUuZXF1YWxzSWdub3JlQ2FzZSgidGltZSIpKWNvbnRpbnVlOworCQkJCWZvcihTdHJpbmcgc2QgOiBpbnN0YW5jZS5nZXQoc3RhdGUpKSAKKwkJCQkJbGlzdC5hZGQoRG91YmxlLnBhcnNlRG91YmxlKHNkKSk7CisJCQkJZGF0YS5wdXQoc3RhdGUsIGxpc3QpOworCQkJfQorCQkJcmV0dXJuIGRhdGE7CisJCX0KKwkJCisJCS8qKgorCQkgKiAKKwkJICogQHJldHVybiBtYXhTCisJCSAqLworCQlwdWJsaWMgZG91YmxlIGdldE1heFMoKSB7CisJCQlyZXR1cm4gbWF4UzsKKwkJfQorCisJCS8qKgorCQkgKiAKKwkJICogQHJldHVybiBtYXhFCisJCSAqLworCQlwdWJsaWMgZG91YmxlIGdldE1heEUoKSB7CisJCQlyZXR1cm4gbWF4RTsKKwkJfQorCisJCS8qKgorCQkgKiAKKwkJICogQHJldHVybiBtYXhJCisJCSAqLworCQlwdWJsaWMgZG91YmxlIGdldE1heEkoKSB7CisJCQlyZXR1cm4gbWF4STsKKwkJfQorCisJCS8qKgorCQkgKiAKKwkJICogQHJldHVybiBtYXhSCisJCSAqLworCQlwdWJsaWMgZG91YmxlIGdldE1heFIoKSB7CisJCQlyZXR1cm4gbWF4UjsKKwkJfQorCQkKKwkJLyoqCisJCSAqIGdldFNpemUuIFJldHVybiB0aGUgbnVtYmVyIG9mIGRhdGEgcm93cyBpbiB0aGUgaW5zdGFuY2UuIEVhY2ggYXJyYXkgKHZhbHVlKSBpcyBhc3N1bWVkIHNhbWUgc2l6ZQorCQkgKiAKKwkJICogQHJldHVybiBpbnQgVGhlIHNpemUgb2YgdGhlIAorCQkgKi8KKwkJCisJCXB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKKwkJCWlmKHRoaXMuaW5zdGFuY2Uuc2l6ZSgpID09IDApIHJldHVybiAwOworCQkJcmV0dXJuIHRoaXMuaW5zdGFuY2UudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuc2l6ZSgpOworCQl9CisJfQorfSAvL1JlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvaW1wbC9TaW1wbGVFcnJvckZ1bmN0aW9uSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9pbXBsL1NpbXBsZUVycm9yRnVuY3Rpb25JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVkYzlhYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvaW1wbC9TaW1wbGVFcnJvckZ1bmN0aW9uSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzM2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5BbmFseXNpc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5BbmFseXNpc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5FcnJvclJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLlJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLlNpbXBsZUVycm9yRnVuY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwuUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TaW1wbGUgRXJyb3IgRnVuY3Rpb248L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTaW1wbGVFcnJvckZ1bmN0aW9uSW1wbCBleHRlbmRzIEVycm9yRnVuY3Rpb25JbXBsIGltcGxlbWVudHMgU2ltcGxlRXJyb3JGdW5jdGlvbiB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNpbXBsZUVycm9yRnVuY3Rpb25JbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQW5hbHlzaXNQYWNrYWdlLkxpdGVyYWxzLlNJTVBMRV9FUlJPUl9GVU5DVElPTjsKKwl9CisKKwkvKioKKwkgKiBpbnB1dAorCSAqLworCU1hcDxTdHJpbmcsTGlzdDxEb3VibGU+PiBjb21tb25JbmZlY3Rpb3VzTG9jYXRpb25zQSA9IG5ldyBIYXNoTWFwPFN0cmluZyxMaXN0PERvdWJsZT4+KCk7CisJTWFwPFN0cmluZyxMaXN0PERvdWJsZT4+IGNvbW1vbkluZmVjdGlvdXNMb2NhdGlvbnNCID0gbmV3IEhhc2hNYXA8U3RyaW5nLExpc3Q8RG91YmxlPj4oKTsKKwlNYXA8U3RyaW5nLExpc3Q8RG91YmxlPj4gY29tbW9uUG9wdWxhdGlvbkxvY2F0aW9uc0EgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTGlzdDxEb3VibGU+PigpOworCU1hcDxTdHJpbmcsTGlzdDxEb3VibGU+PiBjb21tb25Qb3B1bGF0aW9uTG9jYXRpb25zQiA9IG5ldyBIYXNoTWFwPFN0cmluZyxMaXN0PERvdWJsZT4+KCk7CisKKwlNYXA8U3RyaW5nLERvdWJsZT4gY29tbW9uQXZnUG9wdWxhdGlvbkxvY2F0aW9uc0EgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRG91YmxlPigpOworCU1hcDxTdHJpbmcsRG91YmxlPiBjb21tb25BdmdQb3B1bGF0aW9uTG9jYXRpb25zQiA9IG5ldyBIYXNoTWFwPFN0cmluZyxEb3VibGU+KCk7CisJTWFwPFN0cmluZywgRG91YmxlPiBjb21tb25NYXhMb2NhdGlvbnNBID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEb3VibGU+KCk7CisJCisJLyoqCisJICogbnVtYmVyIGNvbW1vbiBsb2NhdGlvbnMgd2l0aCBub256ZXJvIEluZiBjb3VudCBhdCB0aW1lIHQKKwkgKi8KKwlwdWJsaWMgZG91YmxlW10gbG9jYXRpb25Db3VudDsKKwkvKioKKwkgKiBUaGUgUmVzdWx0CisJICovCisJcHVibGljIGRvdWJsZVtdIG1lYW5TcURpZmY7CisJLyoKKwkgKiB0aW1lCisJICovCisJcHVibGljIGRvdWJsZVtdIHRpbWU7CisJCisJcHJvdGVjdGVkIEFuYWx5c2lzRmFjdG9yeSBhRmFjdG9yeSA9IG5ldyBBbmFseXNpc0ZhY3RvcnlJbXBsKCk7CisKKwkvLyBTZXQgdG8gdHJ1ZSB0byB3ZWlnaHQgdGhlIGF2ZXJhZ2UgYnkgcG9wdWxhdGlvbiBzaXplCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBBR0dSRUdBVEVfTlJNU0UgPSB0cnVlOyAvLyBUcnVlIGlmIGFnZ3JlZ2F0ZSBzaWduYWwgZm9yIGxvY2F0aW9ucyBmaXJzdCwgdGhlbiBjYWxjdWxhdGUgTlJNU0UuIEZhbHNlIGlmIHVzZSBOUk1TRSBwZXIgbG9jYXRpb24gdGhlbiBhdmVyYWdlLgorCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gV0VJR0hURURfQVZFUkFHRSA9IHRydWU7IC8vIE9ubHkgdXNlZCBpZiBBR0dSRUdBVEVfTlJNU0UgPSBmYWxzZTsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIEZJVF9JTkNJREVOQ0UgPSB0cnVlOworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gVVNFX1RIUkVTSE9MRCA9IGZhbHNlOworCXByaXZhdGUgc3RhdGljIGRvdWJsZSBUSFJFU0hPTEQgPSAwLjA1OworCQorCS8vIFRoZSB5ZWFyIHRvIHVzZSB0byB2YWxpZGF0ZSBhbmQgaGVuY2UgZXhjbHVkZSBmcm9tIHRoZSBlcnJvciBjYWxjdWxhdGlvbihmb3IgY3Jvc3MtdmFsaWRhdGlvbiBtZXRob2RzKQorCS8vIFRoZSBmaXJzdCB5ZWFyIGlzIHllYXIgMC4gSWYgbm8geWVhciBzaG91bGQgYmUgZXhjbHVkZWQsIHNldCB0byAtMQorCQorCWludCB2YWxpZGF0aW9uWWVhciA9IC0xOworCQorCQorCS8qKgorCSAqIGNhbGN1bGF0ZSBkZWx0YSBmb3IgYSBzaW1wbGUgZXJyb3IgZnVuY3Rpb24KKwkgKiAKKwkgKiAKKwkgKiBAb3ZlcnJpZGUKKwkgKi8KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRXJyb3JSZXN1bHQgY2FsY3VsYXRlRXJyb3IoUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwIHJlZmVyZW5jZSwgUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwIGRhdGEpIHsKKwkJZmluYWwgUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCBfcmVmID0gKFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwpcmVmZXJlbmNlOworCQlmaW5hbCBSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIF9kYXRhID0gKFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwpZGF0YTsKKworCQkvLyBjbGVhcgorCQl0aW1lID0gbnVsbDsKKwkJCisJCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3JBID0gX3JlZi5nZXRMb2NhdGlvbnMoKS5pdGVyYXRvcigpOworCQlpbnQgbWF4VGltZSA9IC0xOworCQl3aGlsZShpdGVyYXRvckEuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgaWQgPSBpdGVyYXRvckEubmV4dCgpOworCQkJCQkKKwkJCWlmKF9kYXRhLmNvbnRhaW5zTG9jYXRpb24oaWQpKSB7CisJCQkJLy8gZ2V0IHRoZSBsaXN0cyBvZiBkYXRhIG9ubHkgZm9yIHRob3NlIGxvY2F0aW9ucyB0aGF0IGFyZSBjb21tb24gdG8gYm90aCBtYXBzCQkJCQkJUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UgZGF0YU1hcEEgPSBtYXBBLmdldExvY2F0aW9uKGlkKTsKKwkJCQlSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBkYXRhTWFwQSA9IF9yZWYuZ2V0TG9jYXRpb24oaWQpOworCQkJCUxpc3Q8RG91YmxlPiBkYXRhQUkgPSBudWxsOworCQkJCWlmKEZJVF9JTkNJREVOQ0UpIGRhdGFBSSA9IGdldEluY2lkZW5jZShkYXRhTWFwQSk7IAorCQkJCWVsc2UgZGF0YUFJID0gZ2V0SW5mZWN0aW91cyhkYXRhTWFwQSk7CisJCQkJTGlzdDxEb3VibGU+IGRhdGFBUCA9IGdldFBvcHVsYXRpb24oZGF0YU1hcEEpOworCQkJCWNvbW1vbkluZmVjdGlvdXNMb2NhdGlvbnNBLnB1dChpZCxkYXRhQUkpOworCQkJCWNvbW1vblBvcHVsYXRpb25Mb2NhdGlvbnNBLnB1dChpZCwgZGF0YUFQKTsJCQkJCQkJCisJCQkJCQkJCisJCQkJLy8gTWFwIEIKKwkJCQlSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBkYXRhTWFwQiA9IF9kYXRhLmdldExvY2F0aW9uKGlkKTsKKwkJCQlMaXN0PERvdWJsZT4gZGF0YUJJID0gbnVsbDsKKwkJCQlpZihGSVRfSU5DSURFTkNFKSBkYXRhQkkgPSBnZXRJbmNpZGVuY2UoZGF0YU1hcEIpOyAKKwkJCQllbHNlIGRhdGFCSSA9IGdldEluZmVjdGlvdXMoZGF0YU1hcEIpOworCQkJCUxpc3Q8RG91YmxlPiBkYXRhQlAgPSBnZXRQb3B1bGF0aW9uKGRhdGFNYXBCKTsKKwkJCQljb21tb25JbmZlY3Rpb3VzTG9jYXRpb25zQi5wdXQoaWQsZGF0YUJJKTsKKwkJCQljb21tb25Qb3B1bGF0aW9uTG9jYXRpb25zQi5wdXQoaWQsIGRhdGFCUCk7CisJCQkJCisJCQkJLy8gaW5pdCB0aGUgYXJyYXkgc2l6ZQorCQkJCWlmIChtYXhUaW1lID09IC0xKSBtYXhUaW1lID0gZGF0YUFJLnNpemUoKTsKKwkJCQkJCQorCQkJCS8vIGRpbWVuc2lvbiB0aGUgYXJyYXlzIHRvIHRoZSBsZW5ndGggb2YgdGhlIFNNQUxMRVNUIGFycmF5IGZvciB3aGljaCB3ZSBoYXZlIGRhdGEKKwkJCQlpZihtYXhUaW1lID49IGRhdGFCSS5zaXplKCkgKSBtYXhUaW1lID0gZGF0YUJJLnNpemUoKTsKKwkJCQlpZihtYXhUaW1lID49IGRhdGFBSS5zaXplKCkgKSBtYXhUaW1lID0gZGF0YUFJLnNpemUoKTsKKwkJCX0vLyBpZgorCQl9Ly8gd2hpbGUKKwkJaWYobWF4VGltZTw9MCkgbWF4VGltZSA9IDA7CisJCWlmKHRpbWU9PW51bGwpIHsKKwkJCXRpbWUgPSBuZXcgZG91YmxlW21heFRpbWVdOworCQkJbWVhblNxRGlmZiA9IG5ldyBkb3VibGVbbWF4VGltZV07CisJCQlsb2NhdGlvbkNvdW50ID0gbmV3IGRvdWJsZVttYXhUaW1lXTsKKwkJCWZvcihpbnQgaSA9IDA7IGkgPCBtYXhUaW1lOyBpICsrKSB7CisJCQkJdGltZVtpXSA9IGk7CisJCQkJbWVhblNxRGlmZltpXSA9IDAuMDsKKwkJCQlsb2NhdGlvbkNvdW50W2ldID0gMC4wOworCQkJfQorCQl9CisJCQorCQkvLyBOb3cgZmlndXJlIG91dCB0aGUgYWN0dWFsIGVycm9yCisJCQorCQlkb3VibGUgW10gWHJlZiA9IG5ldyBkb3VibGVbdGltZS5sZW5ndGhdOworCQlkb3VibGUgW10gWGRhdGEgPSBuZXcgZG91YmxlW3RpbWUubGVuZ3RoXTsKKwkJCisJCWRvdWJsZSBmaW5hbGVycm9yID0gMC4wOworCSAgICBkb3VibGUgdmVycm9yID0gMC4wOworCQkKKwkJQmFzaWNFTGlzdDxEb3VibGU+IGxpc3QgPSBuZXcgQmFzaWNFTGlzdDxEb3VibGU+KCk7CisJCWZvcihpbnQgaT0wO2k8dGltZS5sZW5ndGg7KytpKWxpc3QuYWRkKDAuMCk7CisJCQorCQkvLyBHZXQgdGhlIGF2ZXJhZ2UgcG9wdWxhdGlvbiBmb3IgZWFjaCBsb2NhdGlvbgorCQlmb3IoU3RyaW5nIGxvYzpjb21tb25Qb3B1bGF0aW9uTG9jYXRpb25zQS5rZXlTZXQoKSkgeworCQkJTGlzdDxEb3VibGU+bGQgPSBjb21tb25Qb3B1bGF0aW9uTG9jYXRpb25zQS5nZXQobG9jKTsKKwkJCWRvdWJsZSBzdW0gPSAwO2Zvcihkb3VibGUgZDpsZClzdW0rPWQ7CisJCQlzdW0gLz0gKGRvdWJsZSlsZC5zaXplKCk7CisJCQljb21tb25BdmdQb3B1bGF0aW9uTG9jYXRpb25zQS5wdXQobG9jLCBzdW0pOworCQl9CQkKKworCQkvLyBHZXQgdGhlIGF2ZXJhZ2UgcG9wdWxhdGlvbiBmb3IgZWFjaCBsb2NhdGlvbgorCQlmb3IoU3RyaW5nIGxvYzpjb21tb25Qb3B1bGF0aW9uTG9jYXRpb25zQi5rZXlTZXQoKSkgeworCQkJTGlzdDxEb3VibGU+bGQgPSBjb21tb25Qb3B1bGF0aW9uTG9jYXRpb25zQi5nZXQobG9jKTsKKwkJCWRvdWJsZSBzdW0gPSAwO2Zvcihkb3VibGUgZDpsZClzdW0rPWQ7CisJCQlzdW0gLz0gKGRvdWJsZSlsZC5zaXplKCk7CisJCQljb21tb25BdmdQb3B1bGF0aW9uTG9jYXRpb25zQi5wdXQobG9jLCBzdW0pOworCQl9CQkKKworCQkvLyBHZXQgdGhlIG1heGltdW0gdmFsdWUgZm9yIHRoZSBBIHNlcmllcyAocmVmZXJlbmNlKQorCQlmb3IoU3RyaW5nIGxvYzpjb21tb25Qb3B1bGF0aW9uTG9jYXRpb25zQS5rZXlTZXQoKSkgeworCQkJTGlzdDxEb3VibGU+bGQgPSBjb21tb25JbmZlY3Rpb3VzTG9jYXRpb25zQS5nZXQobG9jKTsKKwkJCWRvdWJsZSBtYXggPSBEb3VibGUuTUlOX1ZBTFVFOworCQkJZm9yKGRvdWJsZSBkOmxkKWlmKGQgPm1heCltYXg9ZDsKKwkJCWNvbW1vbk1heExvY2F0aW9uc0EucHV0KGxvYywgbWF4KTsKKwkJfQorCQkKKwkJLy8gQ2FsY3VsYXRlIHRoZSBub3JtYWxpemVkIHJvb3QgbWVhbiBzcXVhcmUgZXJyb3IgZm9yIGVhY2ggbG9jYXRpb24sIHRoZW4KKwkJLy8gZGl2aWRlIGJ5IHRoZSBudW1iZXIgb2YgbG9jYXRpbnMKKwkJCisJCWRvdWJsZSB3ZWlnaHRlZF9kZW5vbSA9IDAuMDsKKwkJCisJCWlmKCFBR0dSRUdBVEVfTlJNU0UpIHsgLy8gVXNlIE5STVNFIHBlciBsb2NhdGlvbiBmaXJzdAorCQkJZm9yKFN0cmluZyBsb2M6Y29tbW9uSW5mZWN0aW91c0xvY2F0aW9uc0Eua2V5U2V0KCkpIHsKKwkJCQlkb3VibGUgbWF4UmVmID0gMC4wOworCQkJCWRvdWJsZSBtaW5SZWYgPSBEb3VibGUuTUFYX1ZBTFVFOworCQkJCS8vIEdldCB0aGUgbnVtYmVycyBhdCBlYWNoIHRpbWUgc3RlcCBmb3IgdGhlIGxvY2F0aW9uCisJCQkJZm9yKGludCBpY291bnQgPTA7IGljb3VudCA8IHRpbWUubGVuZ3RoOyBpY291bnQgKyspIHsKKwkJCQkJTGlzdDxEb3VibGU+IGRhdGFBSSA9IGNvbW1vbkluZmVjdGlvdXNMb2NhdGlvbnNBLmdldChsb2MpOworCQkJCQlMaXN0PERvdWJsZT4gZGF0YUJJID0gY29tbW9uSW5mZWN0aW91c0xvY2F0aW9uc0IuZ2V0KGxvYyk7CisJCQkJCQkJCQkJCQkJCisJCQkJCWRvdWJsZSBpQSA9IGRhdGFBSS5nZXQoaWNvdW50KS5kb3VibGVWYWx1ZSgpOworCQkJCQlkb3VibGUgaUIgPSBkYXRhQkkuZ2V0KGljb3VudCkuZG91YmxlVmFsdWUoKTsKKwkJCQkKKwkJCQkJWHJlZltpY291bnRdPWlBOworCQkJCQlYZGF0YVtpY291bnRdPWlCOworCQkJCX0KKwkJCQorCQkJCWRvdWJsZSBub21pbmF0b3IgPSAwLjA7IAorCQkJCWRvdWJsZSB0aW1lc3RlcHMgPSAwOworCQkJCWZvcihpbnQgaWNvdW50ID0wOyBpY291bnQgPCB0aW1lLmxlbmd0aDsgaWNvdW50ICsrKSB7CisJCQkJCWlmKFhyZWZbaWNvdW50XT5tYXhSZWYpbWF4UmVmID0gWHJlZltpY291bnRdOworCQkJCQlpZihYcmVmW2ljb3VudF08bWluUmVmKW1pblJlZiA9IFhyZWZbaWNvdW50XTsKKwkJCQkJCisJCQkJCS8vIElmIHdlIHVzZSB0aGUgdGhyZXNob2xkIGFuZCBib3RoIHRoZSByZWZlcmVuY2UgYW5kIHRoZSBtb2RlbCBpcyBsZXNzIHRoYW4KKwkJCQkJLy8gdGhlIFRIUkVTSE9MRCpNQVhyZWYobG9jKSB3ZSBkb24ndCBtZWFzdXJlIHRoZSBkYXRhIHBvaW50CisJCQkJCQorCQkJCQlpZihVU0VfVEhSRVNIT0xEICYmIChYcmVmW2ljb3VudF08PVRIUkVTSE9MRCpjb21tb25NYXhMb2NhdGlvbnNBLmdldChsb2MpICYmCisJCQkJCQkJWGRhdGFbaWNvdW50XTw9VEhSRVNIT0xEKmNvbW1vbk1heExvY2F0aW9uc0EuZ2V0KGxvYykpKSBjb250aW51ZTsKKwkJCQkJCisJCQkJCW5vbWluYXRvciA9IG5vbWluYXRvciArIE1hdGgucG93KFhyZWZbaWNvdW50XS1YZGF0YVtpY291bnRdLCAyKTsKKwkJCQkJbGlzdC5zZXQoaWNvdW50LCBsaXN0LmdldChpY291bnQpK01hdGguYWJzKFhyZWZbaWNvdW50XS1YZGF0YVtpY291bnRdKSk7CisJCQkJCSsrdGltZXN0ZXBzOworCQkJCX0KKwkJCQlkb3VibGUgZXJyb3IgPSBEb3VibGUuTUFYX1ZBTFVFOworCQkJICAgIGlmKHRpbWVzdGVwcyA+IDAgJiYgbWF4UmVmLW1pblJlZiA+IDAuMCkgeworCQkJICAgIAllcnJvciA9IE1hdGguc3FydChub21pbmF0b3IvdGltZXN0ZXBzKTsKKwkJCSAgICAJZXJyb3IgPSBlcnJvciAvIChtYXhSZWYtbWluUmVmKTsKKwkJCSAgICAJaWYoV0VJR0hURURfQVZFUkFHRSkgZmluYWxlcnJvciArPSBjb21tb25BdmdQb3B1bGF0aW9uTG9jYXRpb25zQS5nZXQobG9jKSAqIGVycm9yOworCQkJICAgIAllbHNlIGZpbmFsZXJyb3IgKz0gZXJyb3I7CisJCQkgICAgCWlmKFdFSUdIVEVEX0FWRVJBR0UpIHdlaWdodGVkX2Rlbm9tICs9IGNvbW1vbkF2Z1BvcHVsYXRpb25Mb2NhdGlvbnNBLmdldChsb2MpOworCQkJICAgIAllbHNlIHdlaWdodGVkX2Rlbm9tICs9IDEuMDsKKwkJCSAgICB9CisJCQkKKwkJCX0KKwkJCisJCQkvLyBEaXZpZGUgdGhlIGVycm9yIGJ5IHRoZSBudW1iZXIgb2YgbG9jYXRpb25zCisJCQlmaW5hbGVycm9yIC89IHdlaWdodGVkX2Rlbm9tOyAKKwkJfSBlbHNlIHsgLy8gQWdncmVnYXRlIHNpZ25hbCwgdGhlbiBjYWxjdWxhdGUgTlJNU0UgCisJCQlmb3IoaW50IGljb3VudCA9MDsgaWNvdW50IDwgdGltZS5sZW5ndGg7IGljb3VudCArKykgeworCQkJCWZvcihTdHJpbmcgbG9jOmNvbW1vbkluZmVjdGlvdXNMb2NhdGlvbnNBLmtleVNldCgpKSB7CisJCQkJCUxpc3Q8RG91YmxlPiBkYXRhQUkgPSBjb21tb25JbmZlY3Rpb3VzTG9jYXRpb25zQS5nZXQobG9jKTsKKwkJCQkJTGlzdDxEb3VibGU+IGRhdGFCSSA9IGNvbW1vbkluZmVjdGlvdXNMb2NhdGlvbnNCLmdldChsb2MpOworCQkJCQkJCQkJCQkJCQorCQkJCQlkb3VibGUgaUEgPSBkYXRhQUkuZ2V0KGljb3VudCkuZG91YmxlVmFsdWUoKTsKKwkJCQkJZG91YmxlIGlCID0gZGF0YUJJLmdldChpY291bnQpLmRvdWJsZVZhbHVlKCk7CisJCQkJCisJCQkJCVhyZWZbaWNvdW50XSs9aUE7CisJCQkJCVhkYXRhW2ljb3VudF0rPWlCOworCQkJCX0KKwkJCX0KKwkJCQorCQkJZG91YmxlIG1heFJlZiA9IERvdWJsZS5NSU5fVkFMVUU7CisJCQlkb3VibGUgbWluUmVmID0gRG91YmxlLk1BWF9WQUxVRTsKKwkJCWRvdWJsZSBtYXhWYWxpZGF0aW9uUmVmID0gRG91YmxlLk1JTl9WQUxVRTsKKwkJCWRvdWJsZSBtaW5WYWxpZGF0aW9uUmVmID0gRG91YmxlLk1BWF9WQUxVRTsKKwkJCQorCQkJZm9yKGludCBpY291bnQgPTA7IGljb3VudCA8IHRpbWUubGVuZ3RoOyBpY291bnQgKyspIHsKKwkJCQlpZihpY291bnQgPj0gdmFsaWRhdGlvblllYXIqMzY1LjI1ICYmIGljb3VudCA8PSAodmFsaWRhdGlvblllYXIrMSkqMzY1LjI1KSB7CisJCQkJCWlmKFhyZWZbaWNvdW50XT5tYXhWYWxpZGF0aW9uUmVmKW1heFZhbGlkYXRpb25SZWYgPSBYcmVmW2ljb3VudF07CisJCQkJCWlmKFhyZWZbaWNvdW50XTxtaW5WYWxpZGF0aW9uUmVmKW1pblZhbGlkYXRpb25SZWYgPSBYcmVmW2ljb3VudF07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZihYcmVmW2ljb3VudF0+bWF4UmVmKW1heFJlZiA9IFhyZWZbaWNvdW50XTsKKwkJCQlpZihYcmVmW2ljb3VudF08bWluUmVmKW1pblJlZiA9IFhyZWZbaWNvdW50XTsKKwkJCX0KKwkJCWRvdWJsZSBub21pbmF0b3IgPSAwLjAsIHZub21pbmF0b3IgPSAwLjA7CisJCQlkb3VibGUgdGltZXN0ZXBzID0gMC4wLCB2dGltZXN0ZXBzID0gMC4wOworCQkJZm9yKGludCBpY291bnQgPTA7IGljb3VudCA8IHRpbWUubGVuZ3RoOyBpY291bnQgKyspIHsKKwkJCQkKKwkJCQkvLyBDYWxjdWxhdGUgdmFsaWRhdGlvbiBlcnJvciB0aGVuIHNraXAKKwkJCQlpZihpY291bnQgPj0gdmFsaWRhdGlvblllYXIqMzY1LjI1ICYmIGljb3VudCA8PSAodmFsaWRhdGlvblllYXIrMSkqMzY1LjI1KSB7CisJCQkJCWlmKFVTRV9USFJFU0hPTEQgJiYgKFhyZWZbaWNvdW50XTw9VEhSRVNIT0xEKm1heFZhbGlkYXRpb25SZWYgJiYKKwkJCQkJCQlYZGF0YVtpY291bnRdPD1USFJFU0hPTEQqbWF4VmFsaWRhdGlvblJlZikpIGNvbnRpbnVlOworCQkJCQkKKwkJCQkJdm5vbWluYXRvciA9IHZub21pbmF0b3IgKyBNYXRoLnBvdyhYcmVmW2ljb3VudF0tWGRhdGFbaWNvdW50XSwgMik7CisJCQkJCWxpc3Quc2V0KGljb3VudCwgbmV3IERvdWJsZSgwKSk7IC8vIFNldCB0byAwIGZvciB2YWxpZGF0aW9uIGRhdGEgcG9pbnRzCisJCQkJCSsrdnRpbWVzdGVwczsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8vIElmIHdlIHVzZSB0aGUgdGhyZXNob2xkIGFuZCBib3RoIHRoZSByZWZlcmVuY2UgYW5kIHRoZSBtb2RlbCBpcyBsZXNzIHRoYW4KKwkJCQkvLyB0aGUgVEhSRVNIT0xEKk1BWHJlZihsb2MpIHdlIGRvbid0IG1lYXN1cmUgdGhlIGRhdGEgcG9pbnQKKwkJCQkKKwkJCQlpZihVU0VfVEhSRVNIT0xEICYmIChYcmVmW2ljb3VudF08PVRIUkVTSE9MRCptYXhSZWYgJiYKKwkJCQkJCVhkYXRhW2ljb3VudF08PVRIUkVTSE9MRCptYXhSZWYpKSBjb250aW51ZTsKKwkJCQkKKwkJCQlub21pbmF0b3IgPSBub21pbmF0b3IgKyBNYXRoLnBvdyhYcmVmW2ljb3VudF0tWGRhdGFbaWNvdW50XSwgMik7CisJCQkJbGlzdC5zZXQoaWNvdW50LCBNYXRoLmFicyhYcmVmW2ljb3VudF0tWGRhdGFbaWNvdW50XSkpOworCQkJCSsrdGltZXN0ZXBzOworCQkJfQorCQkJCisJCQlkb3VibGUgZXJyb3IgPSBEb3VibGUuTUFYX1ZBTFVFOworCQkgICAgaWYodGltZXN0ZXBzID4gMCAmJiBtYXhSZWYtbWluUmVmID4gMC4wKSB7CisJCSAgICAJZXJyb3IgPSBNYXRoLnNxcnQobm9taW5hdG9yL3RpbWVzdGVwcyk7CisJCSAgICAJZmluYWxlcnJvciA9IGVycm9yIC8gKG1heFJlZi1taW5SZWYpOworCQkgICAgfQorCQkgICAgLy8gVmFsaWRhdGlvbgorCQkgICAgZXJyb3IgPSBEb3VibGUuTUFYX1ZBTFVFOworCQkgICAgaWYodnRpbWVzdGVwcyA+IDAgJiYgbWF4VmFsaWRhdGlvblJlZi1taW5WYWxpZGF0aW9uUmVmID4gMC4wKSB7CisJCSAgICAJZXJyb3IgPSBNYXRoLnNxcnQodm5vbWluYXRvci92dGltZXN0ZXBzKTsKKwkJICAgIAl2ZXJyb3IgPSBlcnJvciAvIChtYXhWYWxpZGF0aW9uUmVmLW1pblZhbGlkYXRpb25SZWYpOworCQkgICAgfQorCQl9IC8vIGVsc2UKKwkJRXJyb3JSZXN1bHQgcmVzdWx0b2JqID0gYUZhY3RvcnkuY3JlYXRlRXJyb3JSZXN1bHQoKTsKKwkJcmVzdWx0b2JqLnNldEVycm9yQnlUaW1lU3RlcChsaXN0KTsKKwkJcmVzdWx0b2JqLnNldEVycm9yKGZpbmFsZXJyb3IpOworCQlyZXN1bHRvYmouc2V0VmFsaWRhdGlvbkVycm9yKHZlcnJvcik7CisJCQorCQlFTGlzdDxEb3VibGU+cmVmQnlUaW1lID0gbmV3IEJhc2ljRUxpc3Q8RG91YmxlPigpOworCQlFTGlzdDxEb3VibGU+ZGF0YUJ5VGltZSA9IG5ldyBCYXNpY0VMaXN0PERvdWJsZT4oKTsKKwkJCisJCS8vIFNldCB0aGUgcmVmZXJlbmNlIGFuZCBtb2RlbCBieSB0aW1lCisJCWZvcihpbnQgaWNvdW50PTA7aWNvdW50PHRpbWUubGVuZ3RoOysraWNvdW50KSB7CisJCQlyZWZCeVRpbWUuYWRkKDAuMCk7ZGF0YUJ5VGltZS5hZGQoMC4wKTt9CisJCWZvcihTdHJpbmcgbG9jOmNvbW1vbkluZmVjdGlvdXNMb2NhdGlvbnNBLmtleVNldCgpKSB7CisJCSAJZm9yKGludCBpY291bnQgPTA7IGljb3VudCA8IHRpbWUubGVuZ3RoOyBpY291bnQgKyspIHsKKwkJCQlMaXN0PERvdWJsZT4gZGF0YUFJID0gY29tbW9uSW5mZWN0aW91c0xvY2F0aW9uc0EuZ2V0KGxvYyk7CisJCQkJTGlzdDxEb3VibGU+IGRhdGFCSSA9IGNvbW1vbkluZmVjdGlvdXNMb2NhdGlvbnNCLmdldChsb2MpOworCQkJCQkJCQkJCQkJCisJCQkJZG91YmxlIGlBID0gZGF0YUFJLmdldChpY291bnQpLmRvdWJsZVZhbHVlKCk7CisJCQkJZG91YmxlIGlCID0gZGF0YUJJLmdldChpY291bnQpLmRvdWJsZVZhbHVlKCk7CisJCQkKKwkJCQlyZWZCeVRpbWUuc2V0KGljb3VudCwgcmVmQnlUaW1lLmdldChpY291bnQpK2lBKTsKKwkJCQlkYXRhQnlUaW1lLnNldChpY291bnQsIGRhdGFCeVRpbWUuZ2V0KGljb3VudCkraUIpOworCQkJfQorCQl9CisJCXJlc3VsdG9iai5zZXRSZWZlcmVuY2VCeVRpbWUocmVmQnlUaW1lKTsKKwkJcmVzdWx0b2JqLnNldE1vZGVsQnlUaW1lKGRhdGFCeVRpbWUpOworCQlyZXR1cm4gcmVzdWx0b2JqOwkKKwl9Cit9IC8vU2ltcGxlRXJyb3JGdW5jdGlvbkltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvaW1wbC9UaHJlc2hvbGRFcnJvckZ1bmN0aW9uSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy9pbXBsL1RocmVzaG9sZEVycm9yRnVuY3Rpb25JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0YTFhOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvaW1wbC9UaHJlc2hvbGRFcnJvckZ1bmN0aW9uSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkFuYWx5c2lzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkFuYWx5c2lzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuVGhyZXNob2xkRXJyb3JGdW5jdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRocmVzaG9sZCBFcnJvciBGdW5jdGlvbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRocmVzaG9sZEVycm9yRnVuY3Rpb25JbXBsIGV4dGVuZHMgRXJyb3JGdW5jdGlvbkltcGwgaW1wbGVtZW50cyBUaHJlc2hvbGRFcnJvckZ1bmN0aW9uIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGhyZXNob2xkRXJyb3JGdW5jdGlvbkltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBBbmFseXNpc1BhY2thZ2UuTGl0ZXJhbHMuVEhSRVNIT0xEX0VSUk9SX0ZVTkNUSU9OOworCX0KKworCS8qKgorCSAqIFRpbWVzZXJpZXMgZGF0YSBmb3IgYm90aCBkYXRhIHNldHMgd2l0aCBjb21tb24gbG9jYXRpb25zCisJICovCisJTWFwPFN0cmluZyxMaXN0PERvdWJsZT4+IGNvbW1vbkluZmVjdGlvdXNMb2NhdGlvbnNBID0gbmV3IEhhc2hNYXA8U3RyaW5nLExpc3Q8RG91YmxlPj4oKTsKKwlNYXA8U3RyaW5nLExpc3Q8RG91YmxlPj4gY29tbW9uSW5mZWN0aW91c0xvY2F0aW9uc0IgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTGlzdDxEb3VibGU+PigpOworCisJLyoqCisJICogTWF4IGluZmVjdGlvdXMgcGVyIGxvY2F0aW9uCisJICovCisJTWFwPFN0cmluZyxEb3VibGU+IG1heEluZkEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRG91YmxlPigpOworCU1hcDxTdHJpbmcsRG91YmxlPiBtYXhJbmZCID0gbmV3IEhhc2hNYXA8U3RyaW5nLERvdWJsZT4oKTsKKwkKKwkvKioKKwkgKiBUaGUgUmVzdWx0CisJICovCisJcHVibGljIGRvdWJsZVtdIG1lYW5TcURpZmY7CisJCisJLyoKKwkgKiB0aW1lCisJICovCisJcHVibGljIGRvdWJsZVtdIHRpbWU7CisJCisJcHJvdGVjdGVkIEFuYWx5c2lzRmFjdG9yeSBhRmFjdG9yeSA9IG5ldyBBbmFseXNpc0ZhY3RvcnlJbXBsKCk7CisKKwkvLyBUaGlzIGlzIHRoZSB0aHJlc2hvbGQgb2YgdGhlIG1heGltdW0gcGVhayBmb3IgYm90aCBkYXRhIHNldHMKKwkvLyB3aGVyZSB3ZSBjb25zaWRlciB0aGUgZXJyb3IKKwkKKwlwcm90ZWN0ZWQgc3RhdGljIGRvdWJsZSBUSFJFU0hPTEQgPSAwLjE7CisJCisJLyoqCisJICogY2FsY3VsYXRlIGRlbHRhIGZvciBhIHRocmVzaG9sZCBlcnJvciBmdW5jdGlvbgorCSAqIAorCSAqIAorCSAqIEBvdmVycmlkZQorCSAqLworCQorCXB1YmxpYyBFcnJvclJlc3VsdCBjYWxjdWxhdGVFcnJvcihSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAgcmVmZXJlbmNlLCBSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAgZGF0YSkgeworCQlmaW5hbCBSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIF9yZWYgPSAoUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbClyZWZlcmVuY2U7CisJCWZpbmFsIFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwgX2RhdGEgPSAoUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbClkYXRhOworCisJCWRvdWJsZSBkZW5vbWluYXRvciA9IDAuMDsKKwkJLy8gQ2xlYXIKKwkJdGltZSA9IG51bGw7CisJCQorCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yQSA9IF9yZWYuZ2V0TG9jYXRpb25zKCkuaXRlcmF0b3IoKTsKKwkJaW50IG1heFRpbWUgPSAtMTsKKwkJd2hpbGUoaXRlcmF0b3JBLmhhc05leHQoKSkgeworCQkJU3RyaW5nIGlkID0gaXRlcmF0b3JBLm5leHQoKTsKKwkJCQkJCisJCQlpZihfZGF0YS5jb250YWluc0xvY2F0aW9uKGlkKSkgeworCQkJCS8vIGdldCB0aGUgbGlzdHMgb2YgZGF0YSBvbmx5IGZvciB0aG9zZSBsb2NhdGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvIGJvdGggbWFwcwkJCQkJCVJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGRhdGFNYXBBID0gbWFwQS5nZXRMb2NhdGlvbihpZCk7CisJCQkJUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UgZGF0YU1hcEEgPSBfcmVmLmdldExvY2F0aW9uKGlkKTsKKwkJCQlMaXN0PERvdWJsZT4gZGF0YUFJID0gZ2V0SW5mZWN0aW91cyhkYXRhTWFwQSk7CisJCQkKKwkJCQljb21tb25JbmZlY3Rpb3VzTG9jYXRpb25zQS5wdXQoaWQsZGF0YUFJKTsKKwkJCQkJCQkJCQkJCQorCQkJCS8vIE1hcCBCCisJCQkJUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UgZGF0YU1hcEIgPSBfZGF0YS5nZXRMb2NhdGlvbihpZCk7CisJCQkJTGlzdDxEb3VibGU+IGRhdGFCSSA9IGdldEluZmVjdGlvdXMoZGF0YU1hcEIpOworCQkJCWNvbW1vbkluZmVjdGlvdXNMb2NhdGlvbnNCLnB1dChpZCxkYXRhQkkpOworCQkJCQkJCQkJCQkJCisJCQkJLy8gRmluZCB0aGUgcGVhayBpbiBib3RoIGRhdGEgc2V0cyBhbmQgcmVtZW1iZXIuIEl0IHdpbGwgYmUgdXNlZAorCQkJCS8vIHRvIGRldGVybWluZSB0aGUgdGhyZXNob2xkCisJCQkJCisJCQkJZG91YmxlIG1heEEgPSAtMTsKKwkJCQlmb3IoZG91YmxlIGQgOiBkYXRhQUkpIGlmKGQgPiBtYXhBKSBtYXhBID0gZDsKKwkJCQkKKwkJCQlkb3VibGUgbWF4QiA9IC0xOworCQkJCWZvcihkb3VibGUgZCA6IGRhdGFCSSkgaWYoZCA+IG1heEIpIG1heEIgPSBkOworCQorCQkJCW1heEluZkEucHV0KGlkLCBtYXhBKTsKKwkJCQltYXhJbmZCLnB1dChpZCwgbWF4Qik7CisJCQkJCisJCQkJLy8gaW5pdCB0aGUgYXJyYXkgc2l6ZQorCQkJCWlmIChtYXhUaW1lID09IC0xKSBtYXhUaW1lID0gZGF0YUFJLnNpemUoKTsKKwkJCQkJCQorCQkJCS8vIGRpbWVuc2lvbiB0aGUgYXJyYXlzIHRvIHRoZSBsZW5ndGggb2YgdGhlIFNNQUxMRVNUIGFycmF5IGZvciB3aGljaCB3ZSBoYXZlIGRhdGEKKwkJCQlpZihtYXhUaW1lID49IGRhdGFCSS5zaXplKCkgKSBtYXhUaW1lID0gZGF0YUJJLnNpemUoKTsKKwkJCQlpZihtYXhUaW1lID49IGRhdGFBSS5zaXplKCkgKSBtYXhUaW1lID0gZGF0YUFJLnNpemUoKTsKKwkJCX0vLyBpZgorCQl9Ly8gd2hpbGUKKwkJaWYobWF4VGltZTw9MCkgbWF4VGltZSA9IDA7CisJCWlmKHRpbWU9PW51bGwpIHsKKwkJCXRpbWUgPSBuZXcgZG91YmxlW21heFRpbWVdOworCQkJbWVhblNxRGlmZiA9IG5ldyBkb3VibGVbbWF4VGltZV07CisJCQlmb3IoaW50IGkgPSAwOyBpIDwgbWF4VGltZTsgaSArKykgeworCQkJCXRpbWVbaV0gPSBpOworCQkJCW1lYW5TcURpZmZbaV0gPSAwLjA7CisJCQl9CisJCX0KKwkJCisJCS8vIE5vdyBmaWd1cmUgb3V0IHRoZSBhY3R1YWwgZXJyb3IKKwkJCisJCWRvdWJsZVtdIG1heFBvcHVsYXRpb24gPSBuZXcgZG91YmxlW3RpbWUubGVuZ3RoXTsKKworCQlmb3IoaW50IGljb3VudCA9MDsgaWNvdW50IDwgdGltZS5sZW5ndGg7IGljb3VudCArKykgeworCQkJbWF4UG9wdWxhdGlvbltpY291bnRdID0gMC4wOworCQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gY29tbW9uSW5mZWN0aW91c0xvY2F0aW9uc0Eua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkJLy8gYWxsIGxvY2F0aW9ucworCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKKwkJCQlTdHJpbmcgaWQgPSBpdGVyLm5leHQoKTsKKwkJCQlMaXN0PERvdWJsZT4gZGF0YUFJID0gY29tbW9uSW5mZWN0aW91c0xvY2F0aW9uc0EuZ2V0KGlkKTsKKwkJCQlMaXN0PERvdWJsZT4gZGF0YUJJID0gY29tbW9uSW5mZWN0aW91c0xvY2F0aW9uc0IuZ2V0KGlkKTsKKwkJCQkJCQkJCQkJCQorCQkJCWRvdWJsZSBpQSA9IGRhdGFBSS5nZXQoaWNvdW50KS5kb3VibGVWYWx1ZSgpOworCQkJCWRvdWJsZSBpQiA9IGRhdGFCSS5nZXQoaWNvdW50KS5kb3VibGVWYWx1ZSgpOworCQkKKwkJCQkvLyBkb3VibGUgZGVub20gPSAoaUEraUIpLzIuMDsKKwkJCQkvLyBzcXVhcmUgb2YgdGhlIGF2ZXJhZ2UgZnJhY3Rpb24gb2YgaW5mZWN0aW91cyBwZW9wbGUKKwkJCQkvLyBkZW5vbSAqPSBkZW5vbTsKKwkJCQlkb3VibGUgbWF4QSA9IG1heEluZkEuZ2V0KGlkKTsKKwkJCQlkb3VibGUgbWF4QiA9IG1heEluZkIuZ2V0KGlkKTsKKworCQkJCWlmICgoaUEgPiBtYXhBKlRIUkVTSE9MRCkgfHwgKGlCID4gbWF4QipUSFJFU0hPTEQpKSB7CisJCQkJCS8vIHdlIGhhdmUgYSBsb2NhdGlvbiB3aXRoIG5vbnplcm8gZGF0YQorCQkJCQkvLyBzcXVhcmUgb2YgdGhlIERJRkZFUkVOQ0UKKwkJCQkJCQkKKwkJCQkJLy8gQ2hhbmdlZCAyLzQvMDkuIERyb3AgdGhlIFMgZGF0YSBjb21wYXJpc29uCisJCQkJCS8vZG91YmxlIHRlcm0gPSAoKGlBIC0gaUIpICogKGlBIC0gaUIpKQorCQkJCQkvLwkJKyAoKHNBIC0gc0IpICogKHNBIC0gc0IpKTsKKwkJCQkJCQkKKwkJCQkJZG91YmxlIHRlcm0gPSBNYXRoLmFicyhpQSAtIGlCKTsKKwkJCQkJbWVhblNxRGlmZltpY291bnRdICs9IHRlcm07CisJCQkJCWlmKGlBID4gaUIpIGRlbm9taW5hdG9yKz0gaUE7IGVsc2UgZGVub21pbmF0b3IrPSBpQjsgCisJCQkJfQkJCQkJCisJCQl9Ly8gYWxsIGxvY2F0aW9ucworCQkJCQorICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCisJCX0vLyBmb3IgYWxsIHRpbWUKKwkJCisJCQorCQkvLyBTdW0gYWxsIGVycm9ycyBhbmQgZGl2aWRlIGJ5IHRpbWUKKwkJCisJCWRvdWJsZSByZXN1bHQgPSAwLjA7CisJCUJhc2ljRUxpc3Q8RG91YmxlPiBsaXN0ID0gbmV3IEJhc2ljRUxpc3Q8RG91YmxlPigpOworCQlmb3IoaW50IGk9MDtpPHRpbWUubGVuZ3RoOysraSkgeworCQkJbWVhblNxRGlmZltpXSA9IG1lYW5TcURpZmZbaV0gLyBkZW5vbWluYXRvcjsKKwkJCXJlc3VsdCArPSBtZWFuU3FEaWZmW2ldOworCQkJbGlzdC5hZGQobWVhblNxRGlmZltpXSk7CisJCX0KKwkJCisJCUVycm9yUmVzdWx0IHJlc3VsdG9iaiA9IGFGYWN0b3J5LmNyZWF0ZUVycm9yUmVzdWx0KCk7CisJCXJlc3VsdG9iai5zZXRFcnJvckJ5VGltZVN0ZXAobGlzdCk7CisJCXJlc3VsdG9iai5zZXRFcnJvcihyZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0b2JqOwkKKwl9CisJCit9IC8vVGhyZXNob2xkRXJyb3JGdW5jdGlvbkltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvdXRpbC9BbmFseXNpc0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL3V0aWwvQW5hbHlzaXNBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MDIzNzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FuYWx5c2lzL3V0aWwvQW5hbHlzaXNBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLnV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuKjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuQW5hbHlzaXNQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBBbmFseXNpc0FkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBBbmFseXNpc1BhY2thZ2UgbW9kZWxQYWNrYWdlOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBbmFseXNpc0FkYXB0ZXJGYWN0b3J5KCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgeworCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBUaGUgc3dpdGNoIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFuYWx5c2lzU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0KKwkJbmV3IEFuYWx5c2lzU3dpdGNoPEFkYXB0ZXI+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRXJyb3JGdW5jdGlvbihFcnJvckZ1bmN0aW9uIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFcnJvckZ1bmN0aW9uQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGhyZXNob2xkRXJyb3JGdW5jdGlvbihUaHJlc2hvbGRFcnJvckZ1bmN0aW9uIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVUaHJlc2hvbGRFcnJvckZ1bmN0aW9uQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwKFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU2ltcGxlRXJyb3JGdW5jdGlvbihTaW1wbGVFcnJvckZ1bmN0aW9uIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTaW1wbGVFcnJvckZ1bmN0aW9uQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRXJyb3JSZXN1bHQoRXJyb3JSZXN1bHQgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUVycm9yUmVzdWx0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworCQkJfQorCQl9OworCisJLyoqCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRXJyb3JGdW5jdGlvbiA8ZW0+RXJyb3IgRnVuY3Rpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5FcnJvckZ1bmN0aW9uCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVycm9yRnVuY3Rpb25BZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuVGhyZXNob2xkRXJyb3JGdW5jdGlvbiA8ZW0+VGhyZXNob2xkIEVycm9yIEZ1bmN0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuVGhyZXNob2xkRXJyb3JGdW5jdGlvbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUaHJlc2hvbGRFcnJvckZ1bmN0aW9uQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLlJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCA8ZW0+UmVmZXJlbmNlIFNjZW5hcmlvIERhdGEgTWFwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5TaW1wbGVFcnJvckZ1bmN0aW9uIDxlbT5TaW1wbGUgRXJyb3IgRnVuY3Rpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5TaW1wbGVFcnJvckZ1bmN0aW9uCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNpbXBsZUVycm9yRnVuY3Rpb25BZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRXJyb3JSZXN1bHQgPGVtPkVycm9yIFJlc3VsdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yUmVzdWx0CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVycm9yUmVzdWx0QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL0FuYWx5c2lzQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvdXRpbC9BbmFseXNpc1N3aXRjaC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy91dGlsL0FuYWx5c2lzU3dpdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkNzk1ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvdXRpbC9BbmFseXNpc1N3aXRjaC5qYXZhCkBAIC0wLDAgKzEsMjIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLio7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCisgKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9CisgKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCisgKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAorICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQorICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCisgKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5BbmFseXNpc1BhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQW5hbHlzaXNTd2l0Y2g8VD4geworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgQW5hbHlzaXNQYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQW5hbHlzaXNTd2l0Y2goKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gQW5hbHlzaXNQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOworCQl9CisJCWVsc2UgeworCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7CisJCQlyZXR1cm4KKwkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPworCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6CisJCQkJCWRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgeworCQkJY2FzZSBBbmFseXNpc1BhY2thZ2UuRVJST1JfRlVOQ1RJT046IHsKKwkJCQlFcnJvckZ1bmN0aW9uIGVycm9yRnVuY3Rpb24gPSAoRXJyb3JGdW5jdGlvbil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUVycm9yRnVuY3Rpb24oZXJyb3JGdW5jdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBBbmFseXNpc1BhY2thZ2UuVEhSRVNIT0xEX0VSUk9SX0ZVTkNUSU9OOiB7CisJCQkJVGhyZXNob2xkRXJyb3JGdW5jdGlvbiB0aHJlc2hvbGRFcnJvckZ1bmN0aW9uID0gKFRocmVzaG9sZEVycm9yRnVuY3Rpb24pdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VUaHJlc2hvbGRFcnJvckZ1bmN0aW9uKHRocmVzaG9sZEVycm9yRnVuY3Rpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVycm9yRnVuY3Rpb24odGhyZXNob2xkRXJyb3JGdW5jdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBBbmFseXNpc1BhY2thZ2UuUkVGRVJFTkNFX1NDRU5BUklPX0RBVEFfTUFQOiB7CisJCQkJUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwIHJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCA9IChSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXApdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAocmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEFuYWx5c2lzUGFja2FnZS5TSU1QTEVfRVJST1JfRlVOQ1RJT046IHsKKwkJCQlTaW1wbGVFcnJvckZ1bmN0aW9uIHNpbXBsZUVycm9yRnVuY3Rpb24gPSAoU2ltcGxlRXJyb3JGdW5jdGlvbil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVNpbXBsZUVycm9yRnVuY3Rpb24oc2ltcGxlRXJyb3JGdW5jdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXJyb3JGdW5jdGlvbihzaW1wbGVFcnJvckZ1bmN0aW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEFuYWx5c2lzUGFja2FnZS5FUlJPUl9SRVNVTFQ6IHsKKwkJCQlFcnJvclJlc3VsdCBlcnJvclJlc3VsdCA9IChFcnJvclJlc3VsdCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUVycm9yUmVzdWx0KGVycm9yUmVzdWx0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FcnJvciBGdW5jdGlvbjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVycm9yIEZ1bmN0aW9uPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlRXJyb3JGdW5jdGlvbihFcnJvckZ1bmN0aW9uIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UaHJlc2hvbGQgRXJyb3IgRnVuY3Rpb248L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UaHJlc2hvbGQgRXJyb3IgRnVuY3Rpb248L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VUaHJlc2hvbGRFcnJvckZ1bmN0aW9uKFRocmVzaG9sZEVycm9yRnVuY3Rpb24gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlZmVyZW5jZSBTY2VuYXJpbyBEYXRhIE1hcDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlZmVyZW5jZSBTY2VuYXJpbyBEYXRhIE1hcDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcChSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNpbXBsZSBFcnJvciBGdW5jdGlvbjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNpbXBsZSBFcnJvciBGdW5jdGlvbjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVNpbXBsZUVycm9yRnVuY3Rpb24oU2ltcGxlRXJyb3JGdW5jdGlvbiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXJyb3IgUmVzdWx0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXJyb3IgUmVzdWx0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlRXJyb3JSZXN1bHQoRXJyb3JSZXN1bHQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9IC8vQW5hbHlzaXNTd2l0Y2gKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvdXRpbC9DU1ZzY2VuYXJpb0xvYWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hbmFseXNpcy91dGlsL0NTVnNjZW5hcmlvTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgxNDM3ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYW5hbHlzaXMvdXRpbC9DU1ZzY2VuYXJpb0xvYWRlci5qYXZhCkBAIC0wLDAgKzEsODE1IEBACisvKioKKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkFuYWx5c2lzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkRpc2Vhc2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuQW5hbHlzaXNGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZTsKKworCisvKioKKyAqIExvYWQgYSBkaXNlYXNlIHNjZW5hcmlvIAorICoKKyAqLworCitwdWJsaWMgY2xhc3MgQ1NWc2NlbmFyaW9Mb2FkZXIgeworCisJcHJpdmF0ZSBTdHJpbmcgZGlyZWN0b3J5PSIiOworCisJLy8gVGhlc2UgYXJlIHRoZSBrZXlzIGluIHRoZSBtYXAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTX0tFWSA9ICJTIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFX0tFWSA9ICJFIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJX0tFWSA9ICJJIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSX0tFWSA9ICJSIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1BfQ09VTlRfS0VZID0gIlBvcHVsYXRpb24gQ291bnQiOworCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NWX0VYVEVOU0lPTiA9ICIuY3N2IjsKKworCXByaXZhdGUgTGlzdDxGaWxlPiBkaXNlYXNlRGF0YSA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcnVuUGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisJLyoqCisJICogTmFtZSBvZiBhbGwgcnVuIHBhcmFtZXRlciBmaWxlcyAob25lIHBlciBkaXNlYXNlIGZvbGRlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTl9QQVJBTUVURVJfRklMRV9OQU1FID0gInJ1bnBhcmFtZXRlcnMuY3N2IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5fUEFSQU1FVEVSX0ZJTEVfTkFNRV9PTEQgPSAicnVucGFyYW10ZXJzLmNzdiI7CisKKwlwcml2YXRlIEFuYWx5c2lzRmFjdG9yeSBhRmFjdG9yeSA9IG5ldyBBbmFseXNpc0ZhY3RvcnlJbXBsKCk7CisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGxvYWRzIGRhdGEgZnJvbSBhIGZvbGRlciBjb250YWluaW5nIGEgc2F2ZWQgc2NlbmFyaW8gcnVuIGRhdGEgZm9yCisJICogYSBwYXJ0aWN1bGFyIGRpc2Vhc2UgaW5zdGFuY2UKKwkgKiBUaGUgZGF0YSBpbiB0aGUgZm9sZGVyIGlzIGEgc2V0IG9mIGNzdiBmaWxlcywgb25lIHBlciBkaXNlYXNlIHN0YXRlCisJICogCisJICogQHBhcmFtIGRpc2Vhc2VEaXJlY3RvcnkgRGlyZWN0b3J5IGNvbnRhaW5pbmcgZGlzZWFzZSBkYXRhIAorCSAqIEB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBDU1ZzY2VuYXJpb0xvYWRlcihTdHJpbmcgZGlzZWFzZURpcmVjdG9yeSkgdGhyb3dzIFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24geworCQlkaXJlY3RvcnkgPSBkaXNlYXNlRGlyZWN0b3J5OworCQlkaXNlYXNlRGF0YSA9IHRoaXMuZ2V0RGF0YUZpbGVzKCk7CisJfQorCisJLyoqCisJICogRW1wdHkgY29uc3RydWN0b3IgdXNlZCB3aGVuIHBhcnNpbmcgYSBzaW5nbGUgZmlsZSwgZS5nLiBhbiBhZ2dyZWdhdGUgZmlsZQorCSAqLworCXB1YmxpYyBDU1ZzY2VuYXJpb0xvYWRlcigpIHsKKwkJLy8gRW1wdHkKKwl9CisKKworCS8qKgorCSAqIHJlYWQgYWxsIHRoZSBkYXRhIGZpbGVzIGluIGEgc2NlbmFyaW8gZm9sZGVyCisJICogZmlsdGVyIHRvIHJldHVybiBqdXN0IHRoZSBjc3YgZmlsZXMgd2l0aCBkYXRhCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgTGlzdDxGaWxlPiBnZXREYXRhRmlsZXMoKSB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiB7CisJCUxpc3Q8RmlsZT4gZGF0YUZpbGVzID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOworCQlGaWxlW10gZmlsZXM7CisJCUZpbGUgZGlyID0gbmV3IEZpbGUoZGlyZWN0b3J5KTsKKwkJaWYoZGlyLmV4aXN0cygpJiZkaXIuaXNEaXJlY3RvcnkoKSkgeworCQkJZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7CisJCX0gZWxzZSB0aHJvdyBuZXcgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgZmlsZTogIitkaXIpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpICsrKSAgeworCQkJRmlsZSBmID0gZmlsZXNbaV07CisJCQlpZiAodGhpcy5pc0RhdGFGaWxlKGYpKSBkYXRhRmlsZXMuYWRkKGYpOworCQkJaWYgKHRoaXMuaXNSdW5QYXJhbWV0ZXJGaWxlKGYpKSByZWFkUnVuUGFyYW1ldGVycyhmKTsKKwkJfQorCQlpZihkYXRhRmlsZXMuc2l6ZSgpID09IDApIHRocm93IG5ldyBTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uKCJObyBkYXRhIGZpbGVzIGZvdW5kISIpOworCisJCXJldHVybiBkYXRhRmlsZXM7CisJfS8vIGdldERhdGFGaWxlcworCisJLyoqCisJICogCisJICogQHBhcmFtIGRpcmVjdG9yeQorCSAqIEByZXR1cm4gdHJ1ZSBpcyBhIGRhdGEgZGlyZWN0b3J5IGV4aXN0cworCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZShTdHJpbmcgZGlyZWN0b3J5KSB7CisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpcmVjdG9yeSk7CisJCXJldHVybiBmaWxlLmV4aXN0cygpOworCX0KKworCS8qKgorCSAqIHRlc3QgZmlsZSBuYW1lIHRvIHNlZSBpZiBpdCBpcyBhIGRhdGEgZmlsZS4gTXVzdCBoYXZlIGV4dGVuc2lvbiAudHh0IG9yIC5jc3YKKwkgKiBtdXN0IG5vdCBiZSB0aGUgcnVucGFyYW1ldGVycyBzdW1tYXJ5IGZpbGUuCisJICogQHBhcmFtIGZpbGUKKwkgKiBAcmV0dXJuIHRydWUgaWYgZGF0YSBmaWxlCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzRGF0YUZpbGUoRmlsZSBmaWxlKSB7CisJCWJvb2xlYW4gcmV0VmFsID0gdHJ1ZTsKKwkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKKwkJaWYobmFtZS5pbmRleE9mKFJVTl9QQVJBTUVURVJfRklMRV9OQU1FKT49IDAgfHwgbmFtZS5pbmRleE9mKFJVTl9QQVJBTUVURVJfRklMRV9OQU1FX09MRCkgPj0gMCkgcmV0VmFsID0gZmFsc2U7CisJCWlmKG5hbWUuaW5kZXhPZihDU1ZfRVhURU5TSU9OKSA8IDApIHJldFZhbCA9IGZhbHNlOworCQlyZXR1cm4gcmV0VmFsOworCX0KKwkvKioKKwkgKiB0ZXN0IGZpbGUgbmFtZSB0byBzZWUgaWYgaXQgaXMgdGhlIFJ1blBhcmFtdGVyc0ZpbGUKKwkgKiBAcGFyYW0gZmlsZQorCSAqIEByZXR1cm4gdHJ1ZSBpZiBkYXRhIGZpbGUKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNSdW5QYXJhbWV0ZXJGaWxlKEZpbGUgZmlsZSkgeworCQlib29sZWFuIHJldFZhbCA9IGZhbHNlOworCQlTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOworCQlpZihuYW1lLmluZGV4T2YoUlVOX1BBUkFNRVRFUl9GSUxFX05BTUUpPj0gMCB8fCBuYW1lLmluZGV4T2YoUlVOX1BBUkFNRVRFUl9GSUxFX05BTUVfT0xEKT49IDApIHJldFZhbCA9IHRydWU7CisJCXJldHVybiByZXRWYWw7CisJfQorCisJLyoqCisJICogcmVhZCB0aGUgcnVuIHBhcmFtZXRlcnMgZmlsZSBjcmVhdGVkIHdoZW4gcnVubmluZyBhbiBFeHBlcmltZW50CisJICogQHBhcmFtIGZpbGUKKwkgKi8KKwlwcml2YXRlIHZvaWQgcmVhZFJ1blBhcmFtZXRlcnMoRmlsZSBmaWxlKSB7CisJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG51bGw7CisJCXRyeSB7CisJCQlyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZSkpOworCisJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKKwkJCQlTdHJpbmcgYnVmZmVyID0gbnVsbDsKKwkJCQlTdHJpbmdUb2tlbml6ZXIgaGVhZGVycyA9IG51bGw7CisJCQkJU3RyaW5nVG9rZW5pemVyIHZhbHMgPSBudWxsOworCQkJCWludCBsaW5lID0gMDsKKwkJCQl3aGlsZSAoRU9GKGJ1ZmZlciA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSB0cnVlKSB7CisJCQkJCWlmKGxpbmUgPT0gMCkgaGVhZGVycyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYnVmZmVyLCAiLCIpOworCQkJCQllbHNlIHZhbHMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJ1ZmZlciwgIiwiKTsKKwkJCQkJKytsaW5lOworCQkJCX0KKwkJCQl3aGlsZShoZWFkZXJzLmhhc01vcmVUb2tlbnMoKSkgeworCQkJCQlTdHJpbmcgdmFsID0gbnVsbDsKKwkJCQkJdHJ5IHsKKwkJCQkJCXZhbCA9IHZhbHMubmV4dFRva2VuKCk7CisJCQkJCX0gY2F0Y2goTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7CisJCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIk1pc21hdGNoIGJldHdlZW4gY29sdW1ucyBhbmQgdmFsdWVzIGluIHJ1biBwYXJhbWV0ZXIgZmlsZSIsIGUpOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisKKwkJCQkJcnVuUGFyYW1ldGVycy5wdXQoaGVhZGVycy5uZXh0VG9rZW4oKSwgdmFsKTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7CisJCQlBY3RpdmF0b3IKKwkJCS5sb2dFcnJvcigKKwkJCQkJIkNWU3NjZW5hcmlvTG9hZGVyLnJlYWRSdW5QYXJhbWV0ZXJzRmlsZSgpIHJ1biBwYXJhbWV0ZXJzIGZpbGUgbm90IGZvdW5kOiAiLAorCQkJCQlmbmZlKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoCisJCQkJCSJDVlNzY2VuYXJpb0xvYWRlci5yZWFkUnVuUGFyYW1ldGVyc0ZpbGUoKSBpbyBleGNlcHRpb246ICIsCisJCQkJCWlvZSk7CisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCXJlYWRlci5jbG9zZSgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJfQorCX0vLyByZWFkUnVuUGFyYW1ldGVycworCisJLyoqCisJICogQSBzaW5nbGUgUmVmZXJlbmNlIFNjZW5hcmlvIGlzIHN0b3JlZCBpbiBhIG1hcAorCSAqIGZvciBlYWNoICBrZXk8U3RyaW5nPiA9IFJlZ2lvbiBpZAorCSAqIHRoZSBNYXAgY29udGFpbnMgYSBNYXAgb2YgZGF0YSBwZXIgcmVnaW9uLgorCSAqIFRoZSByZWdpb24gZGF0YSBtYXAgaXMga2V5ZWQgYnkgcHJvcGVydHkgKFMsRSwgSSwgUiwgZXRjKSBhbmQgY29udGFpbnMgRGF0YSAobW9zdGx5IERvdWJsZXMgYnV0CisJICogU1RFTVRpbWUgaXMgc3RvcmVkIGFzIGEgU3RyaW5nKSBzbyBhbGwgZGF0YSBpcyBzdG9yZWQgYXMgU3RyaW5nLgorCSAqIEBwYXJhbSBmaWx0ZXJTZXQgCisJICogQHBhcmFtIHJlc29sdXRpb24gV2hpY2ggbWFwIHJlc29sdXRpb24gdG8gbG9hZCwgLTEgaWYgYWxsCisJICogQHJldHVybiB0aGUgUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwIG9iamVjdAorCSAqIEB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiAKKwkgKi8KKworCXB1YmxpYyBSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIHBhcnNlQWxsRmlsZXMoU2V0PFN0cmluZz4gZmlsdGVyU2V0LCBpbnQgcmVzb2x1dGlvbikgdGhyb3dzIFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24geworCQlSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIHNjZW5hcmlvRGF0YU1hcCA9IChSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsKWFGYWN0b3J5LmNyZWF0ZVJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCgpOworCQlBcnJheUxpc3Q8U3RyaW5nPnN0YXRlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOyAvLyBrZWVwcyB0cmFjayBvZiB0aGUgc3RhdGVzIHNlZW4gCisJCWZvcihpbnQgaSA9IDA7IGkgPCBkaXNlYXNlRGF0YS5zaXplKCk7IGkgKyspIHsKKwkJCUZpbGUgZiA9IGRpc2Vhc2VEYXRhLmdldChpKTsKKwkJCVN0cmluZyBuYW1lID0gZi5nZXROYW1lKCk7CisJCQlpZihmLmdldE5hbWUoKS5zdGFydHNXaXRoKCIuIikpIGNvbnRpbnVlOworCQkJaW50IF9pZHggPSBuYW1lLmxhc3RJbmRleE9mKCdfJyk7CisJCQlpbnQgZG90aWR4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOworCQkJaWYoX2lkeCA8MCB8fCBkb3RpZHggPCAwIHx8IGRvdGlkeCA8IF9pZHgpIGNvbnRpbnVlOyAvLyBub3QgYSBkYXRhIGZpbGUKKwkJCVN0cmluZyBzdGF0ZSA9IG5hbWUuc3Vic3RyaW5nKDAsIF9pZHgpOworCQkJaWYoIXN0YXRlcy5jb250YWlucyhzdGF0ZSkpIHN0YXRlcy5hZGQoc3RhdGUpOworCQkJaW50IHJlcyA9IEludGVnZXIucGFyc2VJbnQobmFtZS5zdWJzdHJpbmcoX2lkeCsxLCBkb3RpZHgpKTsKKwkJCWlmKHJlc29sdXRpb24gIT0gLTEgJiYgcmVzICE9IHJlc29sdXRpb24pIGNvbnRpbnVlOyAvLyB3cm9uZyByZXNvbHV0aW9uCisJCQlwcm9jZXNzQW5kRmlsdGVyRmlsZXMoZmlsdGVyU2V0LCBzY2VuYXJpb0RhdGFNYXAsIHN0YXRlLCBmKTsKKwkJfQorCQlzY2VuYXJpb0RhdGFNYXAuc2V0UmVmZXJlbmNlRGlyZWN0b3J5KGRpcmVjdG9yeSk7CisKKwkJRGlzZWFzZVR5cGUgdHlwZTsKKworCQlpZihzdGF0ZXMuY29udGFpbnMoIlMiKSAmJgorCQkJCXN0YXRlcy5jb250YWlucygiRSIpICYmCisJCQkJc3RhdGVzLmNvbnRhaW5zKCJJIikgJiYKKwkJCQlzdGF0ZXMuY29udGFpbnMoIlIiKSkgCisJCQl0eXBlID0gRGlzZWFzZVR5cGUuU0VJUjsKKwkJZWxzZSAgaWYoc3RhdGVzLmNvbnRhaW5zKCJTIikgJiYKKwkJCQlzdGF0ZXMuY29udGFpbnMoIkkiKSAmJgorCQkJCXN0YXRlcy5jb250YWlucygiUiIpKQorCQkJdHlwZSA9IERpc2Vhc2VUeXBlLlNJUjsKKwkJZWxzZSBpZihzdGF0ZXMuY29udGFpbnMoIlMiKSAmJgorCQkJCXN0YXRlcy5jb250YWlucygiSSIpKQorCQkJdHlwZSA9IERpc2Vhc2VUeXBlLlNJOworCQllbHNlIHsKKwkJCXRocm93IG5ldyBTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uKCJEaXNlYXNlIHR5cGUgbm90IHJlY29nbml6ZWQgaW4gZGlyZWN0b3J5OiAiK3RoaXMuZGlyZWN0b3J5KTsKKwkJfQorCQlzY2VuYXJpb0RhdGFNYXAuc2V0VHlwZSh0eXBlKTsKKwkJcmV0dXJuIHNjZW5hcmlvRGF0YU1hcDsKKwl9CisKKwkvKioKKwkgKiBBIHNpbmdsZSBSZWZlcmVuY2UgU2NlbmFyaW8gaXMgc3RvcmVkIGluIGEgbWFwCisJICogZm9yIGVhY2ggIGtleTxTdHJpbmc+ID0gUmVnaW9uIGlkCisJICogdGhlIE1hcCBjb250YWlucyBhIE1hcCBvZiBkYXRhIHBlciByZWdpb24uCisJICogVGhlIHJlZ2lvbiBkYXRhIG1hcCBpcyBrZXllZCBieSBwcm9wZXJ0eSAoUyxFLCBJLCBSLCBldGMpIGFuZCBjb250YWlucyBEYXRhIChtb3N0bHkgRG91YmxlcyBidXQKKwkgKiBTVEVNVGltZSBpcyBzdG9yZWQgYXMgYSBTdHJpbmcpIHNvIGFsbCBkYXRhIGlzIHN0b3JlZCBhcyBTdHJpbmcuCisJICogCisJICogQHBhcmFtIHJlc29sdXRpb24gV2hpY2ggbWFwIHJlc29sdXRpb24gdG8gbG9hZCwgLTEgaWYgYWxsCisJICogQHJldHVybiB0aGUgUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwIG9iamVjdAorCSAqIEB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiAKKwkgKi8KKworCXB1YmxpYyBSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIHBhcnNlQWxsRmlsZXMoaW50IHJlc29sdXRpb24pIHRocm93cyBTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uIHsKKwkJUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCBzY2VuYXJpb0RhdGFNYXAgPSAoUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbClhRmFjdG9yeS5jcmVhdGVSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAoKTsKKwkJQXJyYXlMaXN0PFN0cmluZz5zdGF0ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsgLy8ga2VlcHMgdHJhY2sgb2YgdGhlIHN0YXRlcyBzZWVuIAorCQlmb3IoaW50IGkgPSAwOyBpIDwgZGlzZWFzZURhdGEuc2l6ZSgpOyBpICsrKSB7CisJCQlGaWxlIGYgPSBkaXNlYXNlRGF0YS5nZXQoaSk7CisJCQlTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpOworCisJCQlpZihuYW1lLnN0YXJ0c1dpdGgoIi4iKSkgY29udGludWU7IC8vc2tpcCBzeXN0ZW0gZmlsZXMKKwkJCWludCBfaWR4ID0gbmFtZS5sYXN0SW5kZXhPZignXycpOworCQkJaW50IGRvdGlkeCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKwkJCWlmKF9pZHggPDAgfHwgZG90aWR4IDwgMCB8fCBkb3RpZHggPCBfaWR4KSBjb250aW51ZTsgLy8gbm90IGEgZGF0YSBmaWxlCisJCQlTdHJpbmcgc3RhdGUgPSBuYW1lLnN1YnN0cmluZygwLCBfaWR4KTsKKwkJCWlmKCFzdGF0ZXMuY29udGFpbnMoc3RhdGUpKSBzdGF0ZXMuYWRkKHN0YXRlKTsKKwkJCWludCByZXMgPSBJbnRlZ2VyLnBhcnNlSW50KG5hbWUuc3Vic3RyaW5nKF9pZHgrMSwgZG90aWR4KSk7CisJCQlpZihyZXNvbHV0aW9uICE9IC0xICYmIHJlcyAhPSByZXNvbHV0aW9uKSBjb250aW51ZTsgLy8gd3JvbmcgcmVzb2x1dGlvbgorCQkJcHJvY2Vzc0ZpbGUoc2NlbmFyaW9EYXRhTWFwLCBzdGF0ZSwgZik7CisJCX0KKwkJc2NlbmFyaW9EYXRhTWFwLnNldFJlZmVyZW5jZURpcmVjdG9yeShkaXJlY3RvcnkpOworCisJCURpc2Vhc2VUeXBlIHR5cGU7CisKKwkJaWYoc3RhdGVzLmNvbnRhaW5zKCJTIikgJiYKKwkJCQlzdGF0ZXMuY29udGFpbnMoIkUiKSAmJgorCQkJCXN0YXRlcy5jb250YWlucygiSSIpICYmCisJCQkJc3RhdGVzLmNvbnRhaW5zKCJSIikpIAorCQkJdHlwZSA9IERpc2Vhc2VUeXBlLlNFSVI7CisJCWVsc2UgIGlmKHN0YXRlcy5jb250YWlucygiUyIpICYmCisJCQkJc3RhdGVzLmNvbnRhaW5zKCJJIikgJiYKKwkJCQlzdGF0ZXMuY29udGFpbnMoIlIiKSkKKwkJCXR5cGUgPSBEaXNlYXNlVHlwZS5TSVI7CisJCWVsc2UgaWYoc3RhdGVzLmNvbnRhaW5zKCJTIikgJiYKKwkJCQlzdGF0ZXMuY29udGFpbnMoIkkiKSkKKwkJCXR5cGUgPSBEaXNlYXNlVHlwZS5TSTsKKwkJZWxzZSB7CisJCQl0aHJvdyBuZXcgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbigiRGlzZWFzZSB0eXBlIG5vdCByZWNvZ25pemVkIGluIGRpcmVjdG9yeTogIit0aGlzLmRpcmVjdG9yeSk7CisJCX0KKwkJc2NlbmFyaW9EYXRhTWFwLnNldFR5cGUodHlwZSk7CisJCXJldHVybiBzY2VuYXJpb0RhdGFNYXA7CisJfQorCisJLyoqCisJICogUmVhZCBzY2VuYXJpbyBmb3IgYWxsIHJlc29sdXRpb25zIGF2YWlsYWJsZQorCSAqIAorCSAqIEByZXR1cm4gUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwIE1hcCB3aXRoIGFsbCBub2RlcyBsb2FkZWQKKwkgKiBAdGhyb3dzIFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24KKwkgKi8KKworCXB1YmxpYyBSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIHBhcnNlQWxsRmlsZXMoKSB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLnBhcnNlQWxsRmlsZXMobnVsbCwgLTEpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgbG9nZ2VkIGRhdGEuCisJICogCisJICogQHJldHVybiBQYXJhbWV0ZXJFc3RpbWF0b3IuVHlwZSBUaGUgdHlwZSBvZiB0aGUgZGF0YQorCSAqIEB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiBJZiB0aGUgdHlwZSBpcyBub3QgcmVjb2duaXplZAorCSAqLworCisJcHVibGljIERpc2Vhc2VUeXBlIGdldFR5cGUoKSB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiB7CisJCUFycmF5TGlzdDxTdHJpbmc+c3RhdGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7IC8vIGtlZXBzIHRyYWNrIG9mIHRoZSBzdGF0ZXMgc2VlbiAKKwkJZm9yKGludCBpID0gMDsgaSA8IGRpc2Vhc2VEYXRhLnNpemUoKTsgaSArKykgeworCQkJRmlsZSBmID0gZGlzZWFzZURhdGEuZ2V0KGkpOworCQkJU3RyaW5nIG5hbWUgPSBmLmdldE5hbWUoKTsKKwkJCWludCBfaWR4ID0gbmFtZS5sYXN0SW5kZXhPZignXycpOworCQkJaW50IGRvdGlkeCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKwkJCWlmKF9pZHggPDAgfHwgZG90aWR4IDwgMCB8fCBkb3RpZHggPCBfaWR4KSBjb250aW51ZTsgLy8gbm90IGEgZGF0YSBmaWxlCisJCQlTdHJpbmcgc3RhdGUgPSBuYW1lLnN1YnN0cmluZygwLCBfaWR4KTsKKwkJCWlmKCFzdGF0ZXMuY29udGFpbnMoc3RhdGUpKSBzdGF0ZXMuYWRkKHN0YXRlKTsKKwkJfQorCisJCURpc2Vhc2VUeXBlIHR5cGU7CisKKwkJaWYoc3RhdGVzLmNvbnRhaW5zKCJTIikgJiYKKwkJCQlzdGF0ZXMuY29udGFpbnMoIkUiKSAmJgorCQkJCXN0YXRlcy5jb250YWlucygiSSIpICYmCisJCQkJc3RhdGVzLmNvbnRhaW5zKCJSIikpIAorCQkJdHlwZSA9IERpc2Vhc2VUeXBlLlNFSVI7CisJCWVsc2UgIGlmKHN0YXRlcy5jb250YWlucygiUyIpICYmCisJCQkJc3RhdGVzLmNvbnRhaW5zKCJJIikgJiYKKwkJCQlzdGF0ZXMuY29udGFpbnMoIlIiKSkKKwkJCXR5cGUgPSBEaXNlYXNlVHlwZS5TSVI7CisJCWVsc2UgaWYoc3RhdGVzLmNvbnRhaW5zKCJTIikgJiYKKwkJCQlzdGF0ZXMuY29udGFpbnMoIkkiKSkKKwkJCXR5cGUgPSBEaXNlYXNlVHlwZS5TSTsKKwkJZWxzZSB7CisJCQl0aHJvdyBuZXcgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbigiRGlzZWFzZSB0eXBlIG5vdCByZWNvZ25pemVkIGluIGRpcmVjdG9yeTogIit0aGlzLmRpcmVjdG9yeSk7CisJCX0KKwkJcmV0dXJuIHR5cGU7CisJfQorCisJLyoqCisJICogUmV0cmlldmUgcmVzb2x1dGlvbnMgYXZhaWxhYmxlIGluIHRoZSBkaXNlYXNlIGZvbGRlcgorCSAqIAorCSAqIEByZXR1cm4gQXJyYXlMaXN0PEludGVnZXI+IEF2YWlsYWJsZSByZXNvbHV0aW9ucworCSAqLworCisJQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCisJcHVibGljIEFycmF5TGlzdDxJbnRlZ2VyPiBnZXRSZXNvbHV0aW9ucygpIHsKKwkJQXJyYXlMaXN0PEludGVnZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKworCQlmb3IoaW50IGkgPSAwOyBpIDwgZGlzZWFzZURhdGEuc2l6ZSgpOyBpICsrKSB7CisJCQlGaWxlIGYgPSBkaXNlYXNlRGF0YS5nZXQoaSk7CisJCQlTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpOworCQkJaW50IF9pZHggPSBuYW1lLmxhc3RJbmRleE9mKCdfJyk7CisJCQlpbnQgZG90aWR4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOworCQkJaWYoX2lkeCA8MCB8fCBkb3RpZHggPCAwIHx8IGRvdGlkeCA8IF9pZHgpIGNvbnRpbnVlOyAvLyBub3QgYSBkYXRhIGZpbGUKKwkJCWludCByZXMgPSBJbnRlZ2VyLnBhcnNlSW50KG5hbWUuc3Vic3RyaW5nKF9pZHgrMSwgZG90aWR4KSk7CisJCQlpZighcmVzdWx0LmNvbnRhaW5zKHJlcykpIHJlc3VsdC5hZGQocmVzKTsKKworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogUmV0cmlldmUgcmVzb2x1dGlvbnMgYXZhaWxhYmxlIGluIHRoZSBkaXNlYXNlIGZvbGRlcgorCSAqIAorCSAqIEByZXR1cm4gQXJyYXlMaXN0PEludGVnZXI+IEF2YWlsYWJsZSByZXNvbHV0aW9ucworCSAqLworCisJcHVibGljIGludCBnZXRNYXhSZXNvbHV0aW9uKCkgeworCQlpbnQgcmVzdWx0ID0gLTE7CisKKwkJZm9yKGludCBpID0gMDsgaSA8IGRpc2Vhc2VEYXRhLnNpemUoKTsgaSArKykgeworCQkJRmlsZSBmID0gZGlzZWFzZURhdGEuZ2V0KGkpOworCQkJU3RyaW5nIG5hbWUgPSBmLmdldE5hbWUoKTsKKwkJCWludCBfaWR4ID0gbmFtZS5sYXN0SW5kZXhPZignXycpOworCQkJaW50IGRvdGlkeCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKwkJCWlmKF9pZHggPDAgfHwgZG90aWR4IDwgMCB8fCBkb3RpZHggPCBfaWR4KSBjb250aW51ZTsgLy8gbm90IGEgZGF0YSBmaWxlCisJCQlpbnQgcmVzID0gSW50ZWdlci5wYXJzZUludChuYW1lLnN1YnN0cmluZyhfaWR4KzEsIGRvdGlkeCkpOworCQkJaWYocmVzdWx0IDwgcmVzKSByZXN1bHQgPSByZXM7CisKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIHByb2Nlc3MgdGhlIGlucHV0IGZpbGUKKwkgKiAKKwkgKiBAcGFyYW0gZGF0YU1hcCBNYXAgdG8gc3RvcmUgZmlsZSBpbnNpZGUKKwkgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlCisJICogQHBhcmFtIGZpbGUKKwkgKiAKKwkgKiBAdGhyb3dzIFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24gCisJICovCisKKwlwdWJsaWMgdm9pZCBwcm9jZXNzRmlsZShSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIGRhdGFNYXAsIFN0cmluZyBzdGF0ZSwgRmlsZSBmaWxlKSB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiB7CisJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG51bGw7CisJCXRyeSB7CisJCQlTdHJpbmcgcmVjb3JkOyAgCisJCQlTdHJpbmcgaGVhZGVyOworCQkJaW50IHJlY0NvdW50ID0gMDsKKwkJCUxpc3Q8U3RyaW5nPiBoZWFkZXJFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKKworCQkJLy8KKwkJCS8vIFJlYWQgdGhlIGZpbGUgaGVhZGVyIChpdGVyLCB0aW1lLCBsb2NhdGlvbnMuLi4pCisJCQkvLworCQkJaWYgKCAoaGVhZGVyPXJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsICkgeyAKKworCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaGVhZGVyLCAiLCIpOworCisJCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworCQkJCQlTdHJpbmcgdmFsID0gc3QubmV4dFRva2VuKCkudHJpbSgpOworCQkJCQloZWFkZXJFbGVtZW50cy5hZGQodmFsKTsKKwkJCQl9CisJCQl9IC8vIHJlYWQgdGhlIGhlYWRlcgorCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkJCS8vIHNldCB1cCB0aGUgZW1wdHkgbGlzdHMKKwkJCWludCBudW1Db2x1bW5zID0gaGVhZGVyRWxlbWVudHMuc2l6ZSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpICsrKSB7CisJCQkJU3RyaW5nIGtleSA9IGhlYWRlckVsZW1lbnRzLmdldChpKTsKKwkJCQlpZihrZXkuZXF1YWxzKFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwuSVRFUkFUSU9OX0tFWSkgfHwKKwkJCQkJCWtleS5lcXVhbHMoUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbC5USU1FX0tFWSkpCisJCQkJCWNvbnRpbnVlOworCQkJCU1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZGF0YTsKKwkJCQlSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSByZXN1bHQgPSBudWxsOworCQkJCWlmKCFkYXRhTWFwLmNvbnRhaW5zTG9jYXRpb24oa2V5KSkgeworCQkJCQlkYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7CisJCQkJCXJlc3VsdCA9IGRhdGFNYXAubmV3IFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlKGRhdGEsIGRhdGFNYXApOworCQkJCQlkYXRhTWFwLmFkZEluc3RhbmNlKGtleSwgcmVzdWx0KTsgLy8gQWRkIG5ldyBsb2NhdGlvbiB0byAKKwkJCQl9IGVsc2UgeworCQkJCQlyZXN1bHQgPSBkYXRhTWFwLmdldExvY2F0aW9uKGtleSk7CisJCQkJCWRhdGEgPSByZXN1bHQuZ2V0SW5zdGFuY2UoKTsKKwkJCQl9CisJCQkJZGF0YS5wdXQoc3RhdGUsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsgLy8gQWRkIHRoZSBuZXcgc3RhdGUKKwkJCX0KKworCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkJLy8gUmVhZCB0aGUgZGF0YQorCQkJLy8KKwkJCXdoaWxlICggKHJlY29yZD1yZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCApIHsgCisJCQkJcmVjQ291bnQrKzsgCisKKwkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJlY29yZCwiLCIpOworCQkJCWludCB0Y291bnQgPSAwOworCQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkgJiYgdGNvdW50IDwgaGVhZGVyRWxlbWVudHMuc2l6ZSgpICkgey8vIGp1c3QgdG8gbWFrZSBzdXJlCisJCQkJCVN0cmluZyB2YWwgPSBzdC5uZXh0VG9rZW4oKTsKKwkJCQkJU3RyaW5nIGtleSA9IGhlYWRlckVsZW1lbnRzLmdldCh0Y291bnQpOworCQkJCQlpZihrZXkuZXF1YWxzKFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwuSVRFUkFUSU9OX0tFWSkgfHwKKwkJCQkJCQlrZXkuZXF1YWxzKFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwuVElNRV9LRVkpKQorCQkJCQl7Kyt0Y291bnQ7Y29udGludWU7fQorCQkJCQlSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSByZXN1bHQgPSBkYXRhTWFwLmdldExvY2F0aW9uKGtleSk7CisJCQkJCU1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj5kYXRhID0gcmVzdWx0LmdldEluc3RhbmNlKCk7CisJCQkJCWRhdGEuZ2V0KHN0YXRlKS5hZGQodmFsLnRyaW0oKSk7CisJCQkJCXRjb3VudCArKzsKKwkJCQl9CisJCQl9IC8vIHdoaWxlIGZpbGUgaGFzIGRhdGEKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyAKKwkJCS8vIGNhdGNoIGlvIGVycm9ycyBmcm9tIEZpbGVJbnB1dFN0cmVhbSBvciByZWFkTGluZSgpCisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIiBJT0V4Y2VwdGlvbiBlcnJvciEiLCBlKTsKKwkJCXRocm93IG5ldyBTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uKGUpOworCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlyZWFkZXIuY2xvc2UoKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBwcm9jZXNzIHRoZSBpbnB1dCBmaWxlCisJICogQHBhcmFtIHJlc29sdXRpb24gCisJICogCisJICogQHJldHVybiBzZXQgb2YgbG9jYXRpb25zIGluIGEgZmlsZQorCSAqIAorCSAqIEB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiAKKwkgKi8KKwlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0TG9jYXRpb25zKGludCByZXNvbHV0aW9uKSB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiB7CisJCVNldDxTdHJpbmc+IGxvY2F0aW9ucyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwkJQXJyYXlMaXN0PFN0cmluZz5zdGF0ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsgLy8ga2VlcHMgdHJhY2sgb2YgdGhlIHN0YXRlcyBzZWVuIAorCisJCWZvcihpbnQgaSA9IDA7IGkgPCBkaXNlYXNlRGF0YS5zaXplKCk7IGkgKyspIHsKKwkJCUZpbGUgZmlsZSA9IGRpc2Vhc2VEYXRhLmdldChpKTsKKwkJCVN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7CisJCQlpbnQgX2lkeCA9IG5hbWUubGFzdEluZGV4T2YoJ18nKTsKKwkJCWludCBkb3RpZHggPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7CisJCQlpZihfaWR4IDwwIHx8IGRvdGlkeCA8IDAgfHwgZG90aWR4IDwgX2lkeCkgY29udGludWU7IC8vIG5vdCBhIGRhdGEgZmlsZQorCQkJU3RyaW5nIHN0YXRlID0gbmFtZS5zdWJzdHJpbmcoMCwgX2lkeCk7CisJCQlpZighc3RhdGVzLmNvbnRhaW5zKHN0YXRlKSkgc3RhdGVzLmFkZChzdGF0ZSk7CisJCQlpbnQgcmVzID0gSW50ZWdlci5wYXJzZUludChuYW1lLnN1YnN0cmluZyhfaWR4KzEsIGRvdGlkeCkpOworCQkJaWYocmVzb2x1dGlvbiAhPSAtMSAmJiByZXMgIT0gcmVzb2x1dGlvbikgY29udGludWU7IC8vIHdyb25nIHJlc29sdXRpb24KKwkJCQorCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKKwkJCXRyeSB7ICAKKwkJCQlTdHJpbmcgaGVhZGVyOworCQkJCUxpc3Q8U3RyaW5nPiBoZWFkZXJFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJCXJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlKSk7CisJCQkJLy8gUmVhZCB0aGUgZmlsZSBoZWFkZXIgKGl0ZXIsIHRpbWUsIGxvY2F0aW9ucy4uLikKKwkJCQkvLworCQkJCWlmICggKGhlYWRlcj0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwgKSB7IAorCQkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGhlYWRlciwgIiwiKTsKKwkJCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworCQkJCQkJU3RyaW5nIHZhbCA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKKwkJCQkJCWhlYWRlckVsZW1lbnRzLmFkZCh2YWwpOworCQkJCQl9CisJCQkJfSAvLyByZWFkIHRoZSBoZWFkZXIKKwkJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8gCisJCQkJLy8gc2V0IHVwIHRoZSBlbXB0eSBsaXN0cworCQkJCWludCBudW1Db2x1bW5zID0gaGVhZGVyRWxlbWVudHMuc2l6ZSgpOworCQkJCWZvciAoaW50IGlpID0gMDsgaWkgPCBudW1Db2x1bW5zOyBpaSArKykgeworCQkJCQlTdHJpbmcga2V5ID0gaGVhZGVyRWxlbWVudHMuZ2V0KGlpKTsKKwkJCQkJaWYoISgoa2V5LmVxdWFscyhSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsLklURVJBVElPTl9LRVkpIHx8CWtleS5lcXVhbHMoUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbC5USU1FX0tFWSkpKSkgeworCQkJCQkJbG9jYXRpb25zLmFkZChrZXkpOworCQkJCQl9CisJCQkJfSAvLyB3aGlsZSBmaWxlIGhhcyBkYXRhCisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IAorCQkJCS8vIGNhdGNoIGlvIGVycm9ycyBmcm9tIEZpbGVJbnB1dFN0cmVhbSBvciByZWFkTGluZSgpCisJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCIgSU9FeGNlcHRpb24gZXJyb3IhIiwgZSk7CisJCQkJdGhyb3cgbmV3IFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oZSk7CisJCQl9IGZpbmFsbHkgeworCQkJCXRyeSB7CisJCQkJCXJlYWRlci5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBsb2NhdGlvbnM7CisJfQorCisKKwkvKioKKwkgKiBwcm9jZXNzIHRoZSBpbnB1dCBmaWxlCisJICogQHBhcmFtIGxvY2F0aW9uRmlsdGVyIAorCSAqIAorCSAqIEBwYXJhbSBkYXRhTWFwIE1hcCB0byBzdG9yZSBmaWxlIGluc2lkZQorCSAqIEBwYXJhbSBzdGF0ZSBUaGUgc3RhdGUKKwkgKiBAcGFyYW0gZmlsZQorCSAqIAorCSAqIEB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcm9jZXNzQW5kRmlsdGVyRmlsZXMoU2V0PFN0cmluZz5sb2NhdGlvbkZpbHRlciwgUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCBkYXRhTWFwLCBTdHJpbmcgc3RhdGUsIEZpbGUgZmlsZSkgdGhyb3dzIFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24geworCQkKKwkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVN0cmluZyByZWNvcmQ7ICAKKwkJCVN0cmluZyBoZWFkZXI7CisJCQlpbnQgcmVjQ291bnQgPSAwOworCQkJTGlzdDxTdHJpbmc+IGhlYWRlckVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKwkJCXJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlKSk7CisKKwkJCS8vCisJCQkvLyBSZWFkIHRoZSBmaWxlIGhlYWRlciAoaXRlciwgdGltZSwgbG9jYXRpb25zLi4uKQorCQkJLy8KKwkJCWlmICggKGhlYWRlcj1yZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCApIHsgCisKKwkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGhlYWRlciwgIiwiKTsKKworCQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQkJU3RyaW5nIHZhbCA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKKwkJCQkJaGVhZGVyRWxlbWVudHMuYWRkKHZhbCk7CisJCQkJfQorCQkJfSAvLyByZWFkIHRoZSBoZWFkZXIKKwkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJCQkvLyBzZXQgdXAgdGhlIGVtcHR5IGxpc3RzCisJCQlpbnQgbnVtQ29sdW1ucyA9IGhlYWRlckVsZW1lbnRzLnNpemUoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSArKykgeworCQkJCVN0cmluZyBrZXkgPSBoZWFkZXJFbGVtZW50cy5nZXQoaSk7CisJCQkJLy8gaWYgZmlsdGVyIGlzIG51bGwganVzdCBkb24ndCBmaWx0ZXIKKwkJCQlpZihsb2NhdGlvbkZpbHRlcj09bnVsbCB8fCBsb2NhdGlvbkZpbHRlci5jb250YWlucyhrZXkpKSB7CisJCQkJCWlmKGtleS5lcXVhbHMoUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbC5JVEVSQVRJT05fS0VZKSB8fAorCQkJCQkJCWtleS5lcXVhbHMoUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbC5USU1FX0tFWSkpCisJCQkJCQljb250aW51ZTsKKwkJCQkJTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBkYXRhOworCQkJCQlSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSByZXN1bHQgPSBudWxsOworCQkJCQlpZighZGF0YU1hcC5jb250YWluc0xvY2F0aW9uKGtleSkpIHsKKwkJCQkJCWRhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKKwkJCQkJCXJlc3VsdCA9IGRhdGFNYXAubmV3IFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlKGRhdGEsIGRhdGFNYXApOworCQkJCQkJZGF0YU1hcC5hZGRJbnN0YW5jZShrZXksIHJlc3VsdCk7IC8vIEFkZCBuZXcgbG9jYXRpb24gdG8gCisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXN1bHQgPSBkYXRhTWFwLmdldExvY2F0aW9uKGtleSk7CisJCQkJCQlkYXRhID0gcmVzdWx0LmdldEluc3RhbmNlKCk7CisJCQkJCX0KKwkJCQkJZGF0YS5wdXQoc3RhdGUsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsgLy8gQWRkIHRoZSBuZXcgc3RhdGUKKwkJCQl9CisJCQl9CisKKwkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCS8vIFJlYWQgdGhlIGRhdGEKKwkJCS8vCisJCQl3aGlsZSAoIChyZWNvcmQ9cmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwgKSB7IAorCQkJCXJlY0NvdW50Kys7IAorCisJCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihyZWNvcmQsIiwiKTsKKwkJCQlpbnQgdGNvdW50ID0gMDsKKwkJCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpICYmIHRjb3VudCA8IGhlYWRlckVsZW1lbnRzLnNpemUoKSApIHsvLyBqdXN0IHRvIG1ha2Ugc3VyZQorCQkJCQlTdHJpbmcgdmFsID0gc3QubmV4dFRva2VuKCk7CisJCQkJCVN0cmluZyBrZXkgPSBoZWFkZXJFbGVtZW50cy5nZXQodGNvdW50KTsKKwkJCQkJLy8gaWYgZmlsdGVyIGlzIG51bGwganVzdCBkb24ndCBmaWx0ZXIKKwkJCQkJaWYobG9jYXRpb25GaWx0ZXI9PW51bGwgfHwgbG9jYXRpb25GaWx0ZXIuY29udGFpbnMoa2V5KSkgeworCQkJCQkJaWYoa2V5LmVxdWFscyhSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsLklURVJBVElPTl9LRVkpIHx8CisJCQkJCQkJCWtleS5lcXVhbHMoUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbC5USU1FX0tFWSkpCisJCQkJCQl7Kyt0Y291bnQ7Y29udGludWU7fQorCQkJCQkJUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UgcmVzdWx0ID0gZGF0YU1hcC5nZXRMb2NhdGlvbihrZXkpOworCQkJCQkJTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PmRhdGEgPSByZXN1bHQuZ2V0SW5zdGFuY2UoKTsKKwkJCQkJCWRhdGEuZ2V0KHN0YXRlKS5hZGQodmFsLnRyaW0oKSk7CisJCQkJCX0KKwkJCQkJdGNvdW50ICsrOworCQkJCX0KKwkJCX0gLy8gd2hpbGUgZmlsZSBoYXMgZGF0YQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IAorCQkJLy8gY2F0Y2ggaW8gZXJyb3JzIGZyb20gRmlsZUlucHV0U3RyZWFtIG9yIHJlYWRMaW5lKCkKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiIElPRXhjZXB0aW9uIGVycm9yISIsIGUpOworCQkJdGhyb3cgbmV3IFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oZSk7CisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCXJlYWRlci5jbG9zZSgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJfQorCX0vLyBwcm9jZXNzQW5kRmlsdGVyRmlsZXMKKworCS8qKgorCSAqIFBhcnNlIGEgc2luZ2xlIGFnZ3JlZ2F0ZSBkYXRhIGZpbGUKKwkgKiAKKwkgKiBAcGFyYW0gZmlsZSBGaWxlIHRvIHBhcnNlCisJICogQHJldHVybiB0aGUgUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwIG9iamVjdAorCSAqIEB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiAKKwkgKi8KKwlwdWJsaWMgUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCBwYXJzZUFnZ3JlZ2F0ZUZpbGUoU3RyaW5nIGZpbGUpIHRocm93cyBTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uIHsKKwkJUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCBzY2VuYXJpb0RhdGFNYXAgPSAoUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbClhRmFjdG9yeS5jcmVhdGVSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAoKTsKKwkJRmlsZSBmID0gbmV3IEZpbGUoZmlsZSk7CisJCVN0cmluZyBuYW1lID0gZi5nZXROYW1lKCk7ICAvLyBEaXNlYXNlIG5hbWUKKwkJaW50IGlkeCA9IG5hbWUuaW5kZXhPZigiLiIpOworCQlTdHJpbmcgaWQgPSBuYW1lLnN1YnN0cmluZygwLGlkeCk7CisKKwkJSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZGF0YSA9IG5ldyBIYXNoTWFwPFN0cmluZyxMaXN0PFN0cmluZz4+KCk7CisJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG51bGw7CisJCXRyeSB7CisJCQlTdHJpbmcgcmVjb3JkOyAgCisJCQlTdHJpbmcgaGVhZGVyOworCQkJaW50IHJlY0NvdW50ID0gMDsKKwkJCUxpc3Q8U3RyaW5nPiBoZWFkZXJFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKKworCQkJLy8KKwkJCS8vIFJlYWQgdGhlIGZpbGUgaGVhZGVyCisJCQkvLworCQkJaWYgKCAoaGVhZGVyPXJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsICkgeyAKKworCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaGVhZGVyICk7CisKKwkJCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisJCQkJCVN0cmluZyB2YWwgPSBzdC5uZXh0VG9rZW4oIiwiKTsKKwkJCQkJaGVhZGVyRWxlbWVudHMuYWRkKHZhbC50cmltKCkpOworCQkJCX0KKwkJCX0gLy8gcmVhZCB0aGUgaGVhZGVyCisJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCQkJLy8gc2V0IHVwIHRoZSBlbXB0eSBsaXN0cworCQkJaW50IG51bUNvbHVtbnMgPSBoZWFkZXJFbGVtZW50cy5zaXplKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkgKyspIHsKKwkJCQlTdHJpbmcga2V5ID0gaGVhZGVyRWxlbWVudHMuZ2V0KGkpOworCQkJCWRhdGEucHV0KGtleSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOworCQkJfQorCisJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCQkvLyBSZWFkIHRoZSBkYXRhCisJCQkvLworCQkJd2hpbGUgKCAocmVjb3JkPXJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsICkgeyAKKwkJCQlyZWNDb3VudCsrOyAKKworCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocmVjb3JkICk7CisJCQkJaW50IHRjb3VudCA9IDA7CisJCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworCQkJCQlTdHJpbmcgdmFsID0gc3QubmV4dFRva2VuKCIsIik7CisJCQkJCVN0cmluZyBrZXkgPSBoZWFkZXJFbGVtZW50cy5nZXQodGNvdW50KTsKKwkJCQkJKGRhdGEuZ2V0KGtleSkpLmFkZCh2YWwudHJpbSgpKTsKKwkJCQkJdGNvdW50ICsrOworCQkJCX0KKwkJCX0gLy8gd2hpbGUgZmlsZSBoYXMgZGF0YQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IAorCQkJLy8gY2F0Y2ggaW8gZXJyb3JzIGZyb20gRmlsZUlucHV0U3RyZWFtIG9yIHJlYWRMaW5lKCkKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiIElPRXhjZXB0aW9uIGVycm9yISIsIGUpOworCQkJdGhyb3cgbmV3IFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oZSk7CisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCXJlYWRlci5jbG9zZSgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkKKwkJCX0KKwkJfQorCisJCXNjZW5hcmlvRGF0YU1hcC5hZGRJbnN0YW5jZSgKKwkJCQlpZCwgICAKKwkJCQlzY2VuYXJpb0RhdGFNYXAubmV3IFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlKGRhdGEsIHNjZW5hcmlvRGF0YU1hcCkpOworCQlyZXR1cm4gc2NlbmFyaW9EYXRhTWFwOworCX0KKwkvKioKKwkgKiBwcm9jZXNzIGFuIGluY2lkZW5jZSBmaWxlCisJICogQW4gaW5jaWRlbmNlIGZpbGUgZG9lcyBub3QgY29udGFpbiBTSSBkYXRhIHNvIGl0IGNhbiBub3QgcmV0dXJuIAorCSAqIGEgUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UgKGl0IGlzIG5vdCB1c2VkIHRvIGVzdGltYXRlIHBhcmFtZXRlcnMpLgorCSAqIEluc3RlYWQgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgcmF3IGRhdGEgaW4gYSBtYXAKKwkgKiAKKwkgKiBAcGFyYW0gZmlsZU5hbWUKKwkgKiBAcmV0dXJuIGEgbWFwIG9mIHNjZW5hcmlvIGRhdGEga2V5ZWQgYnkgbG9jYXRpb24gSUQKKwkgKiBAdGhyb3dzIFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24gCisJICovCisJcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gcHJvY2Vzc0luY2lkZW5jZUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiB7CisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKKwkJSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZGF0YSA9IG5ldyBIYXNoTWFwPFN0cmluZyxMaXN0PFN0cmluZz4+KCk7CisKKwkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVN0cmluZyByZWNvcmQ7ICAKKwkJCVN0cmluZyBoZWFkZXI7CisJCQlpbnQgcmVjQ291bnQgPSAwOworCQkJTGlzdDxTdHJpbmc+IGhlYWRlckVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQlyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZSkpOworCisJCQkvLworCQkJLy8gUmVhZCB0aGUgZmlsZSBoZWFkZXIKKwkJCS8vCisJCQlpZiAoIChoZWFkZXI9cmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwgKSB7IAorCisJCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihoZWFkZXIgKTsKKworCQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQkJU3RyaW5nIHZhbCA9IHN0Lm5leHRUb2tlbigiLCIpOworCQkJCQloZWFkZXJFbGVtZW50cy5hZGQodmFsLnRyaW0oKSk7CisJCQkJfQorCQkJfSAvLyByZWFkIHRoZSBoZWFkZXIKKwkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJCQkvLyBzZXQgdXAgdGhlIGVtcHR5IGxpc3RzCisJCQlpbnQgbnVtQ29sdW1ucyA9IGhlYWRlckVsZW1lbnRzLnNpemUoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSArKykgeworCQkJCVN0cmluZyBrZXkgPSBoZWFkZXJFbGVtZW50cy5nZXQoaSk7CisJCQkJZGF0YS5wdXQoa2V5LCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7CisJCQl9CisKKwkJCS8vIEhlcmUgd2UgY2hlY2sgdGhlIHR5cGUgb2YgdGhlIGRhdGEgZmlsZQorCQkJLy8gYnkgY2hlY2tpbmcgdGhlIGhlYWRlciBlbGVtZW50cworCisKKworCisJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCQkvLyBSZWFkIHRoZSBkYXRhCisJCQkvLworCQkJd2hpbGUgKCAocmVjb3JkPXJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsICkgeyAKKwkJCQlyZWNDb3VudCsrOyAKKworCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocmVjb3JkICk7CisJCQkJaW50IHRjb3VudCA9IDA7CisJCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworCQkJCQlTdHJpbmcgdmFsID0gc3QubmV4dFRva2VuKCIsIik7CisJCQkJCVN0cmluZyBrZXkgPSBoZWFkZXJFbGVtZW50cy5nZXQodGNvdW50KTsKKwkJCQkJKGRhdGEuZ2V0KGtleSkpLmFkZCh2YWwudHJpbSgpKTsKKwkJCQkJdGNvdW50ICsrOworCQkJCX0KKwkJCX0gLy8gd2hpbGUgZmlsZSBoYXMgZGF0YQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IAorCQkJLy8gY2F0Y2ggaW8gZXJyb3JzIGZyb20gRmlsZUlucHV0U3RyZWFtIG9yIHJlYWRMaW5lKCkKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiIElPRXhjZXB0aW9uIGVycm9yISIsIGUpOworCQkJdGhyb3cgbmV3IFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oZSk7CisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCXJlYWRlci5jbG9zZSgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZGF0YTsKKwl9CisKKworCS8qKgorCSAqIEluZGljYXRlIEVuZC1PZi1GaWxlCisJICogCisJICogQHBhcmFtIGJ1ZmZlcgorCSAqICAgICAgICAgICAgQSBidWZmZXIgb2YgZGl2YSBkYXRhCisJICogCisJICogQHJldHVybiBUcnVlIGlmIHdlIGhhdmUgcmVhY2hlZCBFbmQtT2YtRmlsZQorCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgYm9vbGVhbiBFT0YoU3RyaW5nIGJ1ZmZlcikgeworCQlpZiAoYnVmZmVyID09IG51bGwgfHwgYnVmZmVyLmxlbmd0aCgpID09IDApCisJCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcnVuIHBhcmFtZXRlcnMKKwkgKiAKKwkgKiBAcmV0dXJuIE1hcDxTdHJpbmcsIFN0cmluZz4gVGhlIHJ1biBwYXJhbWV0ZXJzCisJICovCisKKwlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRSdW5QYXJhbWV0ZXJzKCkgeworCQlyZXR1cm4gcnVuUGFyYW1ldGVyczsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGU4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLy5jdnNpZ25vcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTI3YmU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLy5jdnNpZ25vcmUKQEAgLTAsMCArMSBAQAordGV4dApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLy5mYnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLy5mYnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Nzk0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvLmZicHJlZnMKQEAgLTAsMCArMSwxNDcgQEAKKyNGaW5kQnVncyBVc2VyIFByZWZlcmVuY2VzCisjVHVlIE1heSAyNyAxNTozODo1NCBFRFQgMjAwOAorZGV0ZWN0b3JBcHBlbmRpbmdUb0FuT2JqZWN0T3V0cHV0U3RyZWFtPUFwcGVuZGluZ1RvQW5PYmplY3RPdXRwdXRTdHJlYW18dHJ1ZQorZGV0ZWN0b3JCQ1BNZXRob2RSZXR1cm5DaGVjaz1CQ1BNZXRob2RSZXR1cm5DaGVja3xmYWxzZQorZGV0ZWN0b3JCYWRBcHBsZXRDb25zdHJ1Y3Rvcj1CYWRBcHBsZXRDb25zdHJ1Y3RvcnxmYWxzZQorZGV0ZWN0b3JCYWRSZXN1bHRTZXRBY2Nlc3M9QmFkUmVzdWx0U2V0QWNjZXNzfHRydWUKK2RldGVjdG9yQmFkU3ludGF4Rm9yUmVndWxhckV4cHJlc3Npb249QmFkU3ludGF4Rm9yUmVndWxhckV4cHJlc3Npb258dHJ1ZQorZGV0ZWN0b3JCYWRVc2VPZlJldHVyblZhbHVlPUJhZFVzZU9mUmV0dXJuVmFsdWV8dHJ1ZQorZGV0ZWN0b3JCYWRseU92ZXJyaWRkZW5BZGFwdGVyPUJhZGx5T3ZlcnJpZGRlbkFkYXB0ZXJ8dHJ1ZQorZGV0ZWN0b3JCb29sZWFuUmV0dXJuTnVsbD1Cb29sZWFuUmV0dXJuTnVsbHx0cnVlCitkZXRlY3RvckNhbGxlZE1ldGhvZHM9Q2FsbGVkTWV0aG9kc3x0cnVlCitkZXRlY3RvckNoZWNrQ2FsbHM9Q2hlY2tDYWxsc3xmYWxzZQorZGV0ZWN0b3JDaGVja0ltbXV0YWJsZUFubm90YXRpb249Q2hlY2tJbW11dGFibGVBbm5vdGF0aW9ufHRydWUKK2RldGVjdG9yQ2hlY2tUeXBlUXVhbGlmaWVycz1DaGVja1R5cGVRdWFsaWZpZXJzfHRydWUKK2RldGVjdG9yQ2xvbmVJZGlvbT1DbG9uZUlkaW9tfHRydWUKK2RldGVjdG9yQ29tcGFyYXRvcklkaW9tPUNvbXBhcmF0b3JJZGlvbXx0cnVlCitkZXRlY3RvckNvbmZ1c2VkSW5oZXJpdGFuY2U9Q29uZnVzZWRJbmhlcml0YW5jZXx0cnVlCitkZXRlY3RvckNvbmZ1c2lvbkJldHdlZW5Jbmhlcml0ZWRBbmRPdXRlck1ldGhvZD1Db25mdXNpb25CZXR3ZWVuSW5oZXJpdGVkQW5kT3V0ZXJNZXRob2R8dHJ1ZQorZGV0ZWN0b3JDcm9zc1NpdGVTY3JpcHRpbmc9Q3Jvc3NTaXRlU2NyaXB0aW5nfHRydWUKK2RldGVjdG9yRG9JbnNpZGVEb1ByaXZpbGVnZWQ9RG9JbnNpZGVEb1ByaXZpbGVnZWR8dHJ1ZQorZGV0ZWN0b3JEb250Q2F0Y2hJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uPURvbnRDYXRjaElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb258dHJ1ZQorZGV0ZWN0b3JEb250VXNlRW51bT1Eb250VXNlRW51bXx0cnVlCitkZXRlY3RvckRyb3BwZWRFeGNlcHRpb249RHJvcHBlZEV4Y2VwdGlvbnx0cnVlCitkZXRlY3RvckR1bWJNZXRob2RJbnZvY2F0aW9ucz1EdW1iTWV0aG9kSW52b2NhdGlvbnN8dHJ1ZQorZGV0ZWN0b3JEdW1iTWV0aG9kcz1EdW1iTWV0aG9kc3x0cnVlCitkZXRlY3RvckR1cGxpY2F0ZUJyYW5jaGVzPUR1cGxpY2F0ZUJyYW5jaGVzfHRydWUKK2RldGVjdG9yRW1wdHlaaXBGaWxlRW50cnk9RW1wdHlaaXBGaWxlRW50cnl8dHJ1ZQorZGV0ZWN0b3JFcVN0cmluZ1Rlc3Q9RXFTdHJpbmdUZXN0fGZhbHNlCitkZXRlY3RvckZpZWxkSXRlbVN1bW1hcnk9RmllbGRJdGVtU3VtbWFyeXx0cnVlCitkZXRlY3RvckZpbmFsaXplck51bGxzRmllbGRzPUZpbmFsaXplck51bGxzRmllbGRzfHRydWUKK2RldGVjdG9yRmluZEJhZENhc3Q9RmluZEJhZENhc3R8ZmFsc2UKK2RldGVjdG9yRmluZEJhZENhc3QyPUZpbmRCYWRDYXN0Mnx0cnVlCitkZXRlY3RvckZpbmRCYWRFcXVhbHNJbXBsZW1lbnRhdGlvbj1GaW5kQmFkRXF1YWxzSW1wbGVtZW50YXRpb258ZmFsc2UKK2RldGVjdG9yRmluZEJhZEZvckxvb3A9RmluZEJhZEZvckxvb3B8dHJ1ZQorZGV0ZWN0b3JGaW5kQnVnc1N1bW1hcnlTdGF0cz1GaW5kQnVnc1N1bW1hcnlTdGF0c3x0cnVlCitkZXRlY3RvckZpbmRDaXJjdWxhckRlcGVuZGVuY2llcz1GaW5kQ2lyY3VsYXJEZXBlbmRlbmNpZXN8ZmFsc2UKK2RldGVjdG9yRmluZERlYWRMb2NhbFN0b3Jlcz1GaW5kRGVhZExvY2FsU3RvcmVzfHRydWUKK2RldGVjdG9yRmluZERvdWJsZUNoZWNrPUZpbmREb3VibGVDaGVja3x0cnVlCitkZXRlY3RvckZpbmRFbXB0eVN5bmNocm9uaXplZEJsb2NrPUZpbmRFbXB0eVN5bmNocm9uaXplZEJsb2NrfHRydWUKK2RldGVjdG9yRmluZEZpZWxkU2VsZkFzc2lnbm1lbnQ9RmluZEZpZWxkU2VsZkFzc2lnbm1lbnR8dHJ1ZQorZGV0ZWN0b3JGaW5kRmluYWxpemVJbnZvY2F0aW9ucz1GaW5kRmluYWxpemVJbnZvY2F0aW9uc3x0cnVlCitkZXRlY3RvckZpbmRGbG9hdEVxdWFsaXR5PUZpbmRGbG9hdEVxdWFsaXR5fHRydWUKK2RldGVjdG9yRmluZEZsb2F0TWF0aD1GaW5kRmxvYXRNYXRofGZhbHNlCitkZXRlY3RvckZpbmRIRW1pc21hdGNoPUZpbmRIRW1pc21hdGNofHRydWUKK2RldGVjdG9yRmluZEluY29uc2lzdGVudFN5bmMyPUZpbmRJbmNvbnNpc3RlbnRTeW5jMnx0cnVlCitkZXRlY3RvckZpbmRKU1IxNjZMb2NrTW9uaXRvcmVudGVyPUZpbmRKU1IxNjZMb2NrTW9uaXRvcmVudGVyfHRydWUKK2RldGVjdG9yRmluZExvY2FsU2VsZkFzc2lnbm1lbnQyPUZpbmRMb2NhbFNlbGZBc3NpZ25tZW50Mnx0cnVlCitkZXRlY3RvckZpbmRNYXNrZWRGaWVsZHM9RmluZE1hc2tlZEZpZWxkc3x0cnVlCitkZXRlY3RvckZpbmRNaXNtYXRjaGVkV2FpdE9yTm90aWZ5PUZpbmRNaXNtYXRjaGVkV2FpdE9yTm90aWZ5fHRydWUKK2RldGVjdG9yRmluZE5ha2VkTm90aWZ5PUZpbmROYWtlZE5vdGlmeXx0cnVlCitkZXRlY3RvckZpbmROb25TZXJpYWxpemFibGVTdG9yZUludG9TZXNzaW9uPUZpbmROb25TZXJpYWxpemFibGVTdG9yZUludG9TZXNzaW9ufHRydWUKK2RldGVjdG9yRmluZE5vblNlcmlhbGl6YWJsZVZhbHVlUGFzc2VkVG9Xcml0ZU9iamVjdD1GaW5kTm9uU2VyaWFsaXphYmxlVmFsdWVQYXNzZWRUb1dyaXRlT2JqZWN0fHRydWUKK2RldGVjdG9yRmluZE5vblNob3J0Q2lyY3VpdD1GaW5kTm9uU2hvcnRDaXJjdWl0fHRydWUKK2RldGVjdG9yRmluZE51bGxEZXJlZj1GaW5kTnVsbERlcmVmfHRydWUKK2RldGVjdG9yRmluZE9wZW5TdHJlYW09RmluZE9wZW5TdHJlYW18dHJ1ZQorZGV0ZWN0b3JGaW5kUHV6emxlcnM9RmluZFB1enpsZXJzfHRydWUKK2RldGVjdG9yRmluZFJlZkNvbXBhcmlzb249RmluZFJlZkNvbXBhcmlzb258dHJ1ZQorZGV0ZWN0b3JGaW5kUmV0dXJuUmVmPUZpbmRSZXR1cm5SZWZ8dHJ1ZQorZGV0ZWN0b3JGaW5kUnVuSW52b2NhdGlvbnM9RmluZFJ1bkludm9jYXRpb25zfHRydWUKK2RldGVjdG9yRmluZFNlbGZDb21wYXJpc29uPUZpbmRTZWxmQ29tcGFyaXNvbnx0cnVlCitkZXRlY3RvckZpbmRTZWxmQ29tcGFyaXNvbjI9RmluZFNlbGZDb21wYXJpc29uMnx0cnVlCitkZXRlY3RvckZpbmRTbGVlcFdpdGhMb2NrSGVsZD1GaW5kU2xlZXBXaXRoTG9ja0hlbGR8dHJ1ZQorZGV0ZWN0b3JGaW5kU3Bpbkxvb3A9RmluZFNwaW5Mb29wfHRydWUKK2RldGVjdG9yRmluZFNxbEluamVjdGlvbj1GaW5kU3FsSW5qZWN0aW9ufHRydWUKK2RldGVjdG9yRmluZFR3b0xvY2tXYWl0PUZpbmRUd29Mb2NrV2FpdHx0cnVlCitkZXRlY3RvckZpbmRVbmNhbGxlZFByaXZhdGVNZXRob2RzPUZpbmRVbmNhbGxlZFByaXZhdGVNZXRob2RzfHRydWUKK2RldGVjdG9yRmluZFVuY29uZGl0aW9uYWxXYWl0PUZpbmRVbmNvbmRpdGlvbmFsV2FpdHx0cnVlCitkZXRlY3RvckZpbmRVbmluaXRpYWxpemVkR2V0PUZpbmRVbmluaXRpYWxpemVkR2V0fHRydWUKK2RldGVjdG9yRmluZFVucmVsYXRlZFR5cGVzSW5HZW5lcmljQ29udGFpbmVyPUZpbmRVbnJlbGF0ZWRUeXBlc0luR2VuZXJpY0NvbnRhaW5lcnx0cnVlCitkZXRlY3RvckZpbmRVbnJlbGVhc2VkTG9jaz1GaW5kVW5yZWxlYXNlZExvY2t8dHJ1ZQorZGV0ZWN0b3JGaW5kVW5zYXRpc2ZpZWRPYmxpZ2F0aW9uPUZpbmRVbnNhdGlzZmllZE9ibGlnYXRpb258ZmFsc2UKK2RldGVjdG9yRmluZFVuc3luY0dldD1GaW5kVW5zeW5jR2V0fHRydWUKK2RldGVjdG9yRmluZFVzZWxlc3NDb250cm9sRmxvdz1GaW5kVXNlbGVzc0NvbnRyb2xGbG93fHRydWUKK2RldGVjdG9ySHVnZVNoYXJlZFN0cmluZ0NvbnN0YW50cz1IdWdlU2hhcmVkU3RyaW5nQ29uc3RhbnRzfHRydWUKK2RldGVjdG9ySURpdlJlc3VsdENhc3RUb0RvdWJsZT1JRGl2UmVzdWx0Q2FzdFRvRG91YmxlfHRydWUKK2RldGVjdG9ySW5jb21wYXRNYXNrPUluY29tcGF0TWFza3x0cnVlCitkZXRlY3RvckluZWZmaWNpZW50TWVtYmVyQWNjZXNzPUluZWZmaWNpZW50TWVtYmVyQWNjZXNzfGZhbHNlCitkZXRlY3RvckluZWZmaWNpZW50VG9BcnJheT1JbmVmZmljaWVudFRvQXJyYXl8dHJ1ZQorZGV0ZWN0b3JJbmZpbml0ZUxvb3A9SW5maW5pdGVMb29wfHRydWUKK2RldGVjdG9ySW5maW5pdGVSZWN1cnNpdmVMb29wPUluZmluaXRlUmVjdXJzaXZlTG9vcHx0cnVlCitkZXRlY3RvckluZmluaXRlUmVjdXJzaXZlTG9vcDI9SW5maW5pdGVSZWN1cnNpdmVMb29wMnxmYWxzZQorZGV0ZWN0b3JJbmhlcml0YW5jZVVuc2FmZUdldFJlc291cmNlPUluaGVyaXRhbmNlVW5zYWZlR2V0UmVzb3VyY2V8dHJ1ZQorZGV0ZWN0b3JJbml0aWFsaXphdGlvbkNoYWluPUluaXRpYWxpemF0aW9uQ2hhaW58ZmFsc2UKK2RldGVjdG9ySW5zdGFudGlhdGVTdGF0aWNDbGFzcz1JbnN0YW50aWF0ZVN0YXRpY0NsYXNzfHRydWUKK2RldGVjdG9ySW52YWxpZEpVbml0VGVzdD1JbnZhbGlkSlVuaXRUZXN0fHRydWUKK2RldGVjdG9ySXRlcmF0b3JJZGlvbXM9SXRlcmF0b3JJZGlvbXN8dHJ1ZQorZGV0ZWN0b3JMYXp5SW5pdD1MYXp5SW5pdHx0cnVlCitkZXRlY3RvckxvYWRPZktub3duTnVsbFZhbHVlPUxvYWRPZktub3duTnVsbFZhbHVlfHRydWUKK2RldGVjdG9yTG9ja2VkRmllbGRzPUxvY2tlZEZpZWxkc3xmYWxzZQorZGV0ZWN0b3JNZXRob2RSZXR1cm5DaGVjaz1NZXRob2RSZXR1cm5DaGVja3x0cnVlCitkZXRlY3Rvck1ldGhvZHM9TWV0aG9kc3x0cnVlCitkZXRlY3Rvck11bHRpdGhyZWFkZWRJbnN0YW5jZUFjY2Vzcz1NdWx0aXRocmVhZGVkSW5zdGFuY2VBY2Nlc3N8dHJ1ZQorZGV0ZWN0b3JNdXRhYmxlTG9jaz1NdXRhYmxlTG9ja3x0cnVlCitkZXRlY3Rvck11dGFibGVTdGF0aWNGaWVsZHM9TXV0YWJsZVN0YXRpY0ZpZWxkc3x0cnVlCitkZXRlY3Rvck5hbWluZz1OYW1pbmd8dHJ1ZQorZGV0ZWN0b3JOb3RlQW5ub3RhdGlvblJldGVudGlvbj1Ob3RlQW5ub3RhdGlvblJldGVudGlvbnx0cnVlCitkZXRlY3Rvck5vdGVDaGVja1JldHVyblZhbHVlPU5vdGVDaGVja1JldHVyblZhbHVlfHRydWUKK2RldGVjdG9yTm90ZUNoZWNrUmV0dXJuVmFsdWVBbm5vdGF0aW9ucz1Ob3RlQ2hlY2tSZXR1cm5WYWx1ZUFubm90YXRpb25zfHRydWUKK2RldGVjdG9yTm90ZURpcmVjdGx5UmVsZXZhbnRUeXBlUXVhbGlmaWVycz1Ob3RlRGlyZWN0bHlSZWxldmFudFR5cGVRdWFsaWZpZXJzfHRydWUKK2RldGVjdG9yTm90ZUpDSVBBbm5vdGF0aW9uPU5vdGVKQ0lQQW5ub3RhdGlvbnx0cnVlCitkZXRlY3Rvck5vdGVOb25OdWxsQW5ub3RhdGlvbnM9Tm90ZU5vbk51bGxBbm5vdGF0aW9uc3x0cnVlCitkZXRlY3Rvck5vdGVOb25udWxsUmV0dXJuVmFsdWVzPU5vdGVOb25udWxsUmV0dXJuVmFsdWVzfHRydWUKK2RldGVjdG9yTm90ZVN1cHByZXNzZWRXYXJuaW5ncz1Ob3RlU3VwcHJlc3NlZFdhcm5pbmdzfHRydWUKK2RldGVjdG9yTm90ZVVuY29uZGl0aW9uYWxQYXJhbURlcmVmcz1Ob3RlVW5jb25kaXRpb25hbFBhcmFtRGVyZWZzfHRydWUKK2RldGVjdG9yTnVtYmVyQ29uc3RydWN0b3I9TnVtYmVyQ29uc3RydWN0b3J8ZmFsc2UKK2RldGVjdG9yT3ZlcnJpZGluZ0VxdWFsc05vdFN5bW1ldHJpY2FsPU92ZXJyaWRpbmdFcXVhbHNOb3RTeW1tZXRyaWNhbHx0cnVlCitkZXRlY3RvclByZWZlclplcm9MZW5ndGhBcnJheXM9UHJlZmVyWmVyb0xlbmd0aEFycmF5c3x0cnVlCitkZXRlY3RvclB1YmxpY1NlbWFwaG9yZXM9UHVibGljU2VtYXBob3Jlc3xmYWxzZQorZGV0ZWN0b3JRdWVzdGlvbmFibGVCb29sZWFuQXNzaWdubWVudD1RdWVzdGlvbmFibGVCb29sZWFuQXNzaWdubWVudHx0cnVlCitkZXRlY3RvclJlYWRSZXR1cm5TaG91bGRCZUNoZWNrZWQ9UmVhZFJldHVyblNob3VsZEJlQ2hlY2tlZHx0cnVlCitkZXRlY3RvclJlZHVuZGFudEludGVyZmFjZXM9UmVkdW5kYW50SW50ZXJmYWNlc3x0cnVlCitkZXRlY3RvclJlZmxlY3RpdmVDbGFzc2VzPVJlZmxlY3RpdmVDbGFzc2VzfHRydWUKK2RldGVjdG9yUmVzb2x2ZUFsbFJlZmVyZW5jZXM9UmVzb2x2ZUFsbFJlZmVyZW5jZXN8ZmFsc2UKK2RldGVjdG9yUnVudGltZUV4Y2VwdGlvbkNhcHR1cmU9UnVudGltZUV4Y2VwdGlvbkNhcHR1cmV8dHJ1ZQorZGV0ZWN0b3JTZXJpYWxpemFibGVJZGlvbT1TZXJpYWxpemFibGVJZGlvbXx0cnVlCitkZXRlY3RvclN0YXJ0SW5Db25zdHJ1Y3Rvcj1TdGFydEluQ29uc3RydWN0b3J8dHJ1ZQorZGV0ZWN0b3JTdGF0aWNDYWxlbmRhckRldGVjdG9yPVN0YXRpY0NhbGVuZGFyRGV0ZWN0b3J8dHJ1ZQorZGV0ZWN0b3JTdHJpbmdDb25jYXRlbmF0aW9uPVN0cmluZ0NvbmNhdGVuYXRpb258dHJ1ZQorZGV0ZWN0b3JTdXBlcmZsdW91c0luc3RhbmNlT2Y9U3VwZXJmbHVvdXNJbnN0YW5jZU9mfHRydWUKK2RldGVjdG9yU3VzcGljaW91c1RocmVhZEludGVycnVwdGVkPVN1c3BpY2lvdXNUaHJlYWRJbnRlcnJ1cHRlZHx0cnVlCitkZXRlY3RvclN3aXRjaEZhbGx0aHJvdWdoPVN3aXRjaEZhbGx0aHJvdWdofHRydWUKK2RldGVjdG9yU3luY2hyb25pemF0aW9uT25TaGFyZWRCdWlsdGluQ29uc3RhbnQ9U3luY2hyb25pemF0aW9uT25TaGFyZWRCdWlsdGluQ29uc3RhbnR8dHJ1ZQorZGV0ZWN0b3JTeW5jaHJvbml6ZUFuZE51bGxDaGVja0ZpZWxkPVN5bmNocm9uaXplQW5kTnVsbENoZWNrRmllbGR8dHJ1ZQorZGV0ZWN0b3JTeW5jaHJvbml6ZU9uQ2xhc3NMaXRlcmFsTm90R2V0Q2xhc3M9U3luY2hyb25pemVPbkNsYXNzTGl0ZXJhbE5vdEdldENsYXNzfHRydWUKK2RldGVjdG9yU3luY2hyb25pemluZ09uQ29udGVudHNPZkZpZWxkVG9Qcm90ZWN0RmllbGQ9U3luY2hyb25pemluZ09uQ29udGVudHNPZkZpZWxkVG9Qcm90ZWN0RmllbGR8dHJ1ZQorZGV0ZWN0b3JUZXN0QVNNPVRlc3RBU018ZmFsc2UKK2RldGVjdG9yVGVzdERhdGFmbG93QW5hbHlzaXM9VGVzdERhdGFmbG93QW5hbHlzaXN8ZmFsc2UKK2RldGVjdG9yVGVzdGluZ0dyb3VuZD1UZXN0aW5nR3JvdW5kfGZhbHNlCitkZXRlY3RvclRyYWluRmllbGRTdG9yZVR5cGVzPVRyYWluRmllbGRTdG9yZVR5cGVzfHRydWUKK2RldGVjdG9yVHJhaW5Ob25OdWxsQW5ub3RhdGlvbnM9VHJhaW5Ob25OdWxsQW5ub3RhdGlvbnN8dHJ1ZQorZGV0ZWN0b3JUcmFpblVuY29uZGl0aW9uYWxEZXJlZlBhcmFtcz1UcmFpblVuY29uZGl0aW9uYWxEZXJlZlBhcmFtc3x0cnVlCitkZXRlY3RvclVSTFByb2JsZW1zPVVSTFByb2JsZW1zfHRydWUKK2RldGVjdG9yVW5jYWxsYWJsZU1ldGhvZE9mQW5vbnltb3VzQ2xhc3M9VW5jYWxsYWJsZU1ldGhvZE9mQW5vbnltb3VzQ2xhc3N8dHJ1ZQorZGV0ZWN0b3JVbm5lY2Vzc2FyeU1hdGg9VW5uZWNlc3NhcnlNYXRofHRydWUKK2RldGVjdG9yVW5yZWFkRmllbGRzPVVucmVhZEZpZWxkc3x0cnVlCitkZXRlY3RvclVzZU9iamVjdEVxdWFscz1Vc2VPYmplY3RFcXVhbHN8ZmFsc2UKK2RldGVjdG9yVXNlbGVzc1N1YmNsYXNzTWV0aG9kPVVzZWxlc3NTdWJjbGFzc01ldGhvZHxmYWxzZQorZGV0ZWN0b3JWYXJBcmdzUHJvYmxlbXM9VmFyQXJnc1Byb2JsZW1zfHRydWUKK2RldGVjdG9yVm9sYXRpbGVVc2FnZT1Wb2xhdGlsZVVzYWdlfHRydWUKK2RldGVjdG9yV2FpdEluTG9vcD1XYWl0SW5Mb29wfHRydWUKK2RldGVjdG9yV3JvbmdNYXBJdGVyYXRvcj1Xcm9uZ01hcEl0ZXJhdG9yfHRydWUKK2RldGVjdG9yWE1MRmFjdG9yeUJ5cGFzcz1YTUxGYWN0b3J5QnlwYXNzfHRydWUKK2RldGVjdG9yX3RocmVzaG9sZD0yCitlZmZvcnQ9ZGVmYXVsdAorZXhjbHVkZWZpbHRlcjA9LnNldHRpbmdzL2ZpbmRidWdzLmV4Y2x1ZGUueG1sCitmaWx0ZXJfc2V0dGluZ3M9TWVkaXVtfEJBRF9QUkFDVElDRSxDT1JSRUNUTkVTUyxJMThOLE1BTElDSU9VU19DT0RFLE1UX0NPUlJFQ1RORVNTLFBFUkZPUk1BTkNFLFNFQ1VSSVRZLFNUWUxFfGZhbHNlCitmaWx0ZXJfc2V0dGluZ3NfbmVnPXwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmJiMzIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0uY29yZTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+ZWR1LnVtZC5jcy5maW5kYnVncy5wbHVnaW4uZWNsaXBzZS5maW5kYnVnc0J1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+ZWR1LnVtZC5jcy5maW5kYnVncy5wbHVnaW4uZWNsaXBzZS5maW5kYnVnc05hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLy5zZXR0aW5ncy9maW5kYnVncy5leGNsdWRlLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS8uc2V0dGluZ3MvZmluZGJ1Z3MuZXhjbHVkZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3ZmZmOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS8uc2V0dGluZ3MvZmluZGJ1Z3MuZXhjbHVkZS54bWwKQEAgLTAsMCArMSw2IEBACis8RmluZEJ1Z3NGaWx0ZXI+CisgICAgPE1hdGNoPgorICAgICAgICA8UGFja2FnZSBuYW1lPSJ+b3JnXC5lY2xpcHNlXC5zdGVtXC5jb3JlLioiIC8+CisgICAgICAgIDxCdWcgY29kZT0iSUMsVXJGLFNJQyxTVCxNUyxFQyxFcSxCQyxETFMiIC8+CisgICAgPC9NYXRjaD4KKzwvRmluZEJ1Z3NGaWx0ZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1YjllMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw2OSBAQAorI01vbiBKYW4gMjEgMTI6Mzc6MDggRVNUIDIwMDgKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhjYmI0NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0wLDAgKzEsNTEgQEAKKyNNb24gRmViIDI1IDEyOjI5OjIzIFBTVCAyMDA4CitjbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9dHJ1ZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQorY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKK2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQorY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQorY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKK2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQorY2xlYW51cC51c2VfYmxvY2tzPXRydWUKK2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitjbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXBfcHJvZmlsZT1fcmVsZW5nIGNvZGUgY2xlYW51cAorY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLy50ZW1wbGF0ZSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS8udGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQxZjJiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS8udGVtcGxhdGUKQEAgLTAsMCArMSwzIEBACis8aHRtbD4KK1RoaXMgaXMgdGhlIHdlbGNvbWUgcGFnZSBmb3IgdGhlICJjb3JlIiBwbHVnLWluIG9mIHRoZSBTVEVNIHN5c3RlbS4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1YWJjMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDYwIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvcmVQbHVnaW4KK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAorIG9yZy5lY2xpcHNlLmhlbHAKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5maWxlLAorIG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMuaGlzdG9yeSwKKyBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLnRpbWUsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24sCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi51dGlsLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LmltcGwsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQucHJvdmlkZXIsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQudXRpbCwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC51dGlsLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tYXRoLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbCwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbCwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnV0aWwsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5wcm92aWRlciwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudXRpbCwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbCwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByb3ZpZGVyLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUudXRpbCwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8sCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLmltcGwsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLnByb3ZpZGVyLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby51dGlsLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5pbXBsLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIucHJvdmlkZXIsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci51dGlsLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5pbXBsLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIucHJvdmlkZXIsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci51dGlsLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLmltcGwsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIucHJvdmlkZXIsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIudXRpbAorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YjA4NTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDExIEBACitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLworYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIC4sXAorICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICBiaW4vLFwKKyAgICAgICAgICAgICAgIHJlc291cmNlcy8sXAorICAgICAgICAgICAgICAgaWNvbnMvLFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCisgICAgICAgICAgICAgICBub3RpY2UuaHRtbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vY29tbW9uLnBkZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9kb2N1bWVudGF0aW9uL2NvbW1vbi5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiZDlhYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9kb2N1bWVudGF0aW9uL2NvbW1vbi5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vY29tbW9uLnV4ZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9kb2N1bWVudGF0aW9uL2NvbW1vbi51eGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyOTdjMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9kb2N1bWVudGF0aW9uL2NvbW1vbi51eGYKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48dW1sZXRfZGlhZ3JhbT48aGVscF90ZXh0Pi8vVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byBjaGFuZ2UgdGhlIGZvbnRzaXplOgorLy9mb250c2l6ZT0xNAorCisvL1dlbGNvbWUgdG8gVU1MZXQhCisKKy8vICpEb3VibGUtY2xpY2sgb24gVU1MIGVsZW1lbnRzIHRvIGFkZCB0aGVtIHRvIHRoZSBkaWFncmFtLgorLy8gKkVkaXQgZWxlbWVudCBwcm9wZXJ0aWVzIGJ5IG1vZGlmeWluZyB0aGUgdGV4dCBpbiB0aGlzIHBhbmVsLgorLy8gKkVkaXQgdGhlIGZpbGVzIGluIHRoZSAncGFsZXR0ZXMnIGRpcmVjdG9yeSB0byBzdG9yZSB5b3VyIG93biBlbGVtZW50IHBhbGV0dGVzLgorLy8gKlByZXNzIERlbCBvciBCYWNrc3BhY2UgdG8gcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGRpYWdyYW0uCisvLyAqSG9sZCBkb3duIEN0cmwga2V5IHRvIHNlbGVjdCBtdWx0aXBsZSBlbGVtZW50cy4KKy8vICpQcmVzcyBjIHRvIGNvcHkgdGhlIFVNTCBkaWFncmFtIHRvIHRoZSBzeXN0ZW0gY2xpcGJvYXJkLgorLy8gKiBUaGlzIHRleHQgd2lsbCBiZSBzdG9yZWQgd2l0aCBlYWNoIGRpYWdyYW0uIEZlZWwgZnJlZSB0byB1c2UgdGhlIGFyZWEgZm9yIG5vdGVzLgorPC9oZWxwX3RleHQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NDkwPC94Pjx5PjMxMDwveT48dz4yMDA8L3c+PGg+NDEwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+RHVibGluQ29yZQorLS0KKy0gYmlibGlvZ3JhcGhpY0NpdGF0aW9uOiBTdHJpbmcKKy0gY29udHJpYnV0b3I6IFN0cmluZworLSBjb3ZlcmFnZTogU3RyaW5nCistIGNyZWF0ZWQ6IFN0cmluZworLSBjcmVhdG9yOiBTdHJpbmcKKy0gZGF0ZTogU3RyaW5nCistIGRlc2NyaXB0aW9uOiBTdHJpbmcKKy0gZm9ybWF0OiBTdHJpbmcKKy0gaWRlbnRpZmllcjogU3RyaW5nCistIGxhbmd1YWdlOiBTdHJpbmcKKy0gbGljZW5zZTogU3RyaW5nCistIHB1Ymxpc2hlcjogU3RyaW5nCistIHJlbGF0aW9uOiBTdHJpbmcKKy0gcmVxdWlyZWQ6IFN0cmluZworLSByaWdodHM6IFN0cmluZworLSBzb3VyY2U6IFN0cmluZworLSBzcGF0aWFsOiBTdHJpbmcKKy0gc3ViamVjdDogU3RyaW5nCistIHRpdGxlOiBTdHJpbmcKKy0gdHlwZTogU3RyaW5nCistIHZhbGlkOiBTdHJpbmcKKy0tCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjMzMDwveD48eT4zMzA8L3k+PHc+MTgwPC93PjxoPjQwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDsmbHQ7Jmx0Oy0KK3IyPWR1YmxpbkNvcmUKK20yPTAuLjEKKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzIwOzE2MDsyMDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLk5vdGU8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjM4MDwveD48eT41MDwveT48dz4yNDA8L3c+PGg+MzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5jb20uaWJtLmFsbWFkZW4uc3RlbS5jb21tb248L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjExMDwveD48eT4zMjA8L3k+PHc+MjQwPC93PjxoPjcwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+L0lkZW50aWZpYWJsZS8KKy0tCistdXJpOiBVUkkKKy11cmk6IHR5cGVVUkkKKy0tCisKKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MTYxPC94Pjx5PjIxMDwveT48dz4xMzg8L3c+PGg+MTMwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0Oy4KKyZsdDsmbHQ7aW5zdGFuY2VPZiZndDsmZ3Q7PC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+Njk7MjA7Njk7MTEwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjExMDwveD48eT4xMzA8L3k+PHc+MjQwPC93PjxoPjEwMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPiZsdDsmbHQ7SW50ZXJmYWNlJmd0OyZndDsKK1Nhbml0eUNoZWNrZXIKKy0tCisgCistLQorK2Jvb2xlYW46IHNhbmUoKQorIDwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PC91bWxldF9kaWFncmFtPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9kb2N1bWVudGF0aW9uL2V4cGVyaW1lbnQucGRmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vZXhwZXJpbWVudC5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdlNmMzNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9kb2N1bWVudGF0aW9uL2V4cGVyaW1lbnQucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9kb2N1bWVudGF0aW9uL2V4cGVyaW1lbnQudXhmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vZXhwZXJpbWVudC51eGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU4OTQzOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9kb2N1bWVudGF0aW9uL2V4cGVyaW1lbnQudXhmCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PHVtbGV0X2RpYWdyYW0+PGhlbHBfdGV4dD4vL1VuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gY2hhbmdlIHRoZSBmb250c2l6ZToKKy8vZm9udHNpemU9MTQKKworLy9XZWxjb21lIHRvIFVNTGV0IQorCisvLyAqRG91YmxlLWNsaWNrIG9uIFVNTCBlbGVtZW50cyB0byBhZGQgdGhlbSB0byB0aGUgZGlhZ3JhbS4KKy8vICpFZGl0IGVsZW1lbnQgcHJvcGVydGllcyBieSBtb2RpZnlpbmcgdGhlIHRleHQgaW4gdGhpcyBwYW5lbC4KKy8vICpFZGl0IHRoZSBmaWxlcyBpbiB0aGUgJ3BhbGV0dGVzJyBkaXJlY3RvcnkgdG8gc3RvcmUgeW91ciBvd24gZWxlbWVudCBwYWxldHRlcy4KKy8vICpQcmVzcyBEZWwgb3IgQmFja3NwYWNlIHRvIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBkaWFncmFtLgorLy8gKkhvbGQgZG93biBDdHJsIGtleSB0byBzZWxlY3QgbXVsdGlwbGUgZWxlbWVudHMuCisvLyAqUHJlc3MgYyB0byBjb3B5IHRoZSBVTUwgZGlhZ3JhbSB0byB0aGUgc3lzdGVtIGNsaXBib2FyZC4KKy8vICogVGhpcyB0ZXh0IHdpbGwgYmUgc3RvcmVkIHdpdGggZWFjaCBkaWFncmFtLiBGZWVsIGZyZWUgdG8gdXNlIHRoZSBhcmVhIGZvciBub3Rlcy4KKzwvaGVscF90ZXh0PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjQ1MTwveD48eT4zNDA8L3k+PHc+NTk8L3c+PGg+MTMwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0Oy0KK20xPTAuLm4KK3IxPW1vZGlmaWVycworPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+Mjk7MTEwOzI5OzIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjQzMDwveD48eT40NTA8L3k+PHc+MjYwPC93PjxoPjMwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+b3JnLmVjbGlwc2Uuc3RlbS5tb2RpZmllcjo6TW9kaWZpZXI8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjI3MzwveD48eT4zNDA8L3k+PHc+NTU8L3c+PGg+MTMwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0Oy0KK20xPTEKK3IxPXNjZW5hcmlvPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+Mjc7MTEwOzI3OzIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjgwPC94Pjx5PjQ1MDwveT48dz4zMTA8L3c+PGg+MzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5vcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW86OlNjZW5hcmlvCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuTm90ZTwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MjgwPC94Pjx5PjQwPC95Pjx3PjI2MDwvdz48aD4zMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50PC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD4zNjA8L3g+PHk+MTYwPC95Pjx3PjQwPC93PjxoPjEyMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7LTwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzIwOzIwOzEwMDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD4yMzA8L3g+PHk+MTIwPC95Pjx3PjMyMDwvdz48aD42MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlCistLQorIAorLS0KKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MjUwPC94Pjx5PjI2MDwveT48dz4yNjA8L3c+PGg+MTAwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+RXhwZXJpbWVudAorLS0KKyAKKy0tCitnZXROZXh0U2NlbmFyaW8oU2NlbmFyaW8pOiBTY2VuYXJpbworZ2V0TW9kaWZpY2F0aW9uU3VtbWFyeSgpIDogTGlzdCZsdDtTdHJpbmcmZ3Q7Citpc0NvbXBsZXRlKCk6IGJvb2xlYW48L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjwvdW1sZXRfZGlhZ3JhbT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvZG9jdW1lbnRhdGlvbi9ncmFwaC5wZGYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvZG9jdW1lbnRhdGlvbi9ncmFwaC5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4NDEwNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9kb2N1bWVudGF0aW9uL2dyYXBoLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvZG9jdW1lbnRhdGlvbi9ncmFwaC51eGYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvZG9jdW1lbnRhdGlvbi9ncmFwaC51eGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDljYjhkYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9kb2N1bWVudGF0aW9uL2dyYXBoLnV4ZgpAQCAtMCwwICsxLDkzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjx1bWxldF9kaWFncmFtPjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjczMDwveD48eT4yNDA8L3k+PHc+MjYwPC93PjxoPjQ0MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7Jmx0OyZsdDstCityMj1ncmFwaExhYmVscworbTI9MC4uKjwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjI0MDs0MjA7MjQwOzIwOzIwOzIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjExMDA8L3g+PHk+NTAwPC95Pjx3PjE4Njwvdz48aD4xODA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mbHQ7Jmx0OyZsdDsmbHQ7LQorcjI9dW5yZXNvbHZlZElkZW50aWZpYWJsZXMKK20yPTAuLjEKKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzE2MDsxNTA7MjA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MTE0MDwveD48eT4zNzA8L3k+PHc+MjMwPC93PjxoPjE1MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPlVucmVzb2x2ZWRJZGVudGlmaWFibGUKKy0tCistIGlkZW50aWZpYWJsZTogSWRlbnRpZmlhYmxlCistIHVucmVzb2x2ZWRVUkk6IFVSSQorLSBmaWVsZE5hbWU6IFN0cmluZworLSBzY2VuYXJpbzogSWRlbnRpZmlhYmxlCistIG1vZGVsOiBJZGVudGlmaWFibGUKKy0gZ3JhcGg6IElkZW50aWZpYWJsZQorLS0KKworIDwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NTYwPC94Pjx5PjU1MDwveT48dz4yNTA8L3c+PGg+ODA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz4mbHQ7Jmx0O0Fic3RyYWN0Jmd0OyZndDsKKy9MYWJlbFZhbHVlLworLS0KKyAgCistLQorKyByZXNldCgpOiB2b2lkPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD4zNTA8L3g+PHk+NDkwPC95Pjx3PjQwPC93PjxoPjEzMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7LTwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzIwOzIwOzExMDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD4yNjA8L3g+PHk+NjAwPC95Pjx3PjEzMDwvdz48aD42MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPlN0YXRpY05vZGVMYWJlbAorLS0KKyAKKy0tCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjQyMDwveD48eT40OTA8L3k+PHc+NDA8L3c+PGg+MTMwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDstPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7MjA7MjA7MTEwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjQwMDwveD48eT42MDA8L3k+PHc+MTMwPC93PjxoPjYwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+RHluYW1pY05vZGVMYWJlbAorLS0KKyAKKy0tCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjUzOTwveD48eT4zMDA8L3k+PHc+ODI8L3c+PGg+MjcwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDsmbHQ7Jmx0Oy0KK3IyPWN1cnJlbnRWYWx1ZQorbTI9IDE8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz40MTsyMDs0MTsyNTA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NjgwPC94Pjx5PjMwMDwveT48dz40MDwvdz48aD4xMDA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mbHQ7Jmx0Oy08L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4yMDsyMDsyMDs4MDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD40MjA8L3g+PHk+MzAwPC95Pjx3PjQwPC93PjxoPjE3MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7LTwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzIwOzIwOzE1MDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD4xMzA8L3g+PHk+NTIwPC95Pjx3PjgyMDwvdz48aD4yMjA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mbHQ7Jmx0OyZsdDsmbHQ7LQorcjI9bm9kZXMKK20yPTEKKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjgwMDsyMDA7MjA7MjAwOzIwOzIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjQ3OTwveD48eT40OTA8L3k+PHc+NDcxPC93PjxoPjIxMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7Jmx0OyZsdDstCityMj1ub2RlTGFiZWxzCittMj0xCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz40NTE7MTkwOzkxOzE5MDsyMTsyMDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD45MzA8L3g+PHk+NjYwPC95Pjx3PjIxMDwvdz48aD4xMDA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5HcmFwaAorLS0KKyAKKy0tCisrYWRkR3JhcGgoR3JhcGgpCisrc3dpdGNoVG9OZXh0VmFsdWUoKTogdm9pZAorLS0KKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MzUwPC94Pjx5PjQ1MDwveT48dz4xOTA8L3c+PGg+NjA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5Ob2RlTGFiZWwKKy0tCisgCistLQorPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD4yNDA8L3g+PHk+NDYwPC95Pjx3PjEzMDwvdz48aD40MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDstCittMT0wLi5uCityMT1sYWJlbHM8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4xMTA7MjA7MjA7MjA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NTYwPC94Pjx5PjUwPC95Pjx3PjU0MDwvdz48aD42MzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mbHQ7Jmx0Oy08L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4yMDsyMDs1MjA7MTIwOzUyMDs2MTA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NzA8L3g+PHk+NDUwPC95Pjx3PjE5MDwvdz48aD45MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPk5vZGUKKy0tCisgCistLQorK2dldEVkZ2UoVVJJKSA6IEVkZ2UKKytnZXRMYWJlbChVUkkpIDogTGFiZWwKKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NjAwPC94Pjx5PjM4MDwveT48dz4xOTA8L3c+PGg+OTA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz4mbHQ7Jmx0O0ludGVyZmFjZSZndDsmZ3Q7CitEeW5hbWljTGFiZWwKKy0tCisgCistLQorK3N3aXRjaFRvTmV4dFZhbHVlKCkgOiB2b2lkPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD4zMDA8L3g+PHk+MTcwPC95Pjx3Pjc0MDwvdz48aD41MTA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mbHQ7Jmx0OyZsdDsmbHQ7LQorcjI9ZWRnZXMKK20yPTEKKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjcyMDs0OTA7NzIwOzIwOzIwOzIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4Pjc3MDwveD48eT40NTA8L3k+PHc+MTkwPC93PjxoPjIzMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDstCittMT0wLi4qCityMT1keW5hbWljTGFiZWxzPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7MjA7MTcwOzIxMDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD42NTg8L3g+PHk+NDUwPC95Pjx3PjY0PC93PjxoPjEyMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7Jmx0OyZsdDstCityMj1uZXh0VmFsdWUKK20yPTEKKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjMyOzIwOzMyOzEwMDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD4zMDA8L3g+PHk+MjMwPC95Pjx3PjE0MDwvdz48aD40MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7Jmx0OyZsdDstCityMj1sYWJlbAorbTI9MC4uMQorPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7MjA7MTIwOzIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjQyMDwveD48eT4yMzA8L3k+PHc+MzMwPC93PjxoPjkwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+Jmx0OyZsdDtBYnN0cmFjdCZndDsmZ3Q7CitMYWJlbAorLS0KKy1VUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkOiBVUkkKKy0tPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD40NjA8L3g+PHk+NTA8L3k+PHc+NDA8L3c+PGg+MjAwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDstPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7MjA7MjA7MTgwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjEyMDwveD48eT4xODA8L3k+PHc+MjAwPC93PjxoPjEyMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPkVkZ2UKKy0tCistIGRpcmVjdGVkIDogQm9vbGVhbgorLSBhVVJMOiBVUkwKKy0gYlVSTDogVVJMCistLQorK2dldE90aGVyTm9kZShOb2RlKSA6IE5vZGUKKytpc0RpcmVjdGVkQXQoTm9kZSkgOiBCb29sZWFuCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjE4MDwveD48eT4yODA8L3k+PHc+NDE8L3c+PGg+MTkwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0Oy0KK20xPTAuLm4KK3IxPWVkZ2VzCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4yMDsyMDsyMDsxNzA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MTEwPC94Pjx5PjI4MDwveT48dz40MDwvdz48aD4xOTA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mbHQ7LQorbTE9MC4uMQorcjE9ICBiPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7MTcwOzIwOzIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjE0MDwveD48eT4yODA8L3k+PHc+NDA8L3c+PGg+MTkwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0Oy0KK20xPSAwLi4xCityMT0gIGE8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4yMDsxNzA7MjA7MjA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NzA8L3g+PHk+NTA8L3k+PHc+MjgwPC93PjxoPjQyMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7LTwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjI2MDsyMDsyMDsxMDA7MjA7NDAwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuTm90ZTwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NjgwPC94Pjx5PjMwPC95Pjx3PjIyMDwvdz48aD4zMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPm9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGg8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjMwMDwveD48eT40MDwveT48dz4zMTA8L3c+PGg+MzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz4vb3JnLmVjbGlwc2Uuc3RlbS5jb21tb24uSWRlbnRpZmlhYmxlLworCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjIwMDwveD48eT41MDwveT48dz4xNzA8L3c+PGg+MTUwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDstPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MTUwOzIwOzIwOzEzMDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48L3VtbGV0X2RpYWdyYW0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vbW9kZWwucGRmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vbW9kZWwucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZDAyMzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvZG9jdW1lbnRhdGlvbi9tb2RlbC5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vbW9kZWwudXhmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vbW9kZWwudXhmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZmMzODAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvZG9jdW1lbnRhdGlvbi9tb2RlbC51eGYKQEAgLTAsMCArMSw1OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48dW1sZXRfZGlhZ3JhbT48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD45NjA8L3g+PHk+MzcwPC95Pjx3PjMwMDwvdz48aD4zMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPm9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGguRHluYW1pY0xhYmVsPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLk5vdGU8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjU5MDwveD48eT4xMDwveT48dz4yMjA8L3c+PGg+MzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5vcmcuZWNsaXBzZS5zdGVtLm1vZGVsPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD41MDwveD48eT41NDA8L3k+PHc+MjUwPC93PjxoPjMwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+b3JnLmVjbGlwc2Uuc3RlbS5ncmFwaC5HcmFwaAorCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjIxMDwveD48eT43MDwveT48dz4zMTA8L3c+PGg+MzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz4vb3JnLmVjbGlwc2Uuc3RlbS5jb21tb24uSWRlbnRpZmlhYmxlLzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NDIwPC94Pjx5PjQyMDwveT48dz4zODA8L3c+PGg+MTEwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDsmbHQ7Jmx0Oy0KK20yPTAuLioKK3IyPWVkZ2VEZWNvcmF0b3JzCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4yMDsyMDszNjA7OTA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NDIwPC94Pjx5PjQwMDwveT48dz4yNzA8L3c+PGg+NDA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mbHQ7Jmx0OyZsdDsmbHQ7LQorcjI9Z3JhcGhEZWNvcmF0b3JzCittMj0wLi4qCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4yMDsyMDsyNTA7MjA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NzkwPC94Pjx5PjI3MDwveT48dz40MDwvdz48aD43MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7LTwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzIwOzIwOzUwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjYwMDwveD48eT4zMjA8L3k+PHc+MjcwPC93PjxoPjcwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+Tm9kZURlY29yYXRvcgorLS0KKyAKKy0tCisgCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4Pjc4MDwveD48eT40ODA8L3k+PHc+MjcwPC93PjxoPjcwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+RWRnZURlY29yYXRvcgorLS0KKyAKKy0tCisKKworPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD42NzA8L3g+PHk+NDAwPC95Pjx3PjI3MDwvdz48aD43MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPkdyYXBoRGVjb3JhdG9yCistLQorIAorLS0KKworPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD40MjA8L3g+PHk+MzMwPC95Pjx3PjIwMDwvdz48aD40MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7Jmx0OyZsdDstCittMj0wLi4qCityMj1ub2RlRGVjb3JhdG9ycworPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7MjA7MTgwOzIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4Pjc4MDwveD48eT4xNjA8L3k+PHc+MjkwPC93PjxoPjEzMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPiZsdDsmbHQ7YWJzdHJhY3QmZ3Q7Jmd0OyAKKy9EZWNvcmF0b3IvCistLQorLWluZGV4OiBpbnQKKy0tCisgKyBkZWNvcmF0ZUdyYXBoKEdyYXBoKSA6IHZvaWQKKysgdXBkYXRlTGFiZWxzKEdyYXBoLCBTVEVNVGltZSkgOiB2b2lkCisKKy0tCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjkzMDwveD48eT4yNzA8L3k+PHc+NDA8L3c+PGg+MjMwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDstPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7MjA7MjA7MjEwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjYwPC94Pjx5PjMyMDwveT48dz4zODA8L3c+PGg+MTQwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+TW9kZWwKKy0tCisgCistLQorKyBnZXRDYW5vbmljYWxHcmFwaCgpIDogR3JhcGgKKysgZ2V0Q2Fub25pY2FsTm9kZURlY29yYXRvcnMoKSA6IE5vZGVEZWNvcmF0b3IKKysgZ2V0Q2Fub25pY2FsRWRnZURlY29yYXRvcnMoKTogRWRnZURlY29yYXRvcgorKyBnZXRDYW5vbmljYWxHcmFwaERlY29yYXRvcnMoKTogR3JhcGhEZWNvcmF0b3IKKy0tCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4Pjk5MDwveD48eT4yNzA8L3k+PHc+MTAwPC93PjxoPjEyMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDstCittMT0wLi4xCityMT1sYWJlbHNUb1VwZGF0ZTwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjUwOzEwMDs1MDsyMDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD4wPC94Pjx5PjM2MDwveT48dz4xMjA8L3c+PGg+MTUwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDsmbHQ7Jmx0Oy0KK20yPSAgIDAuLioKK3IyPW1vZGVscworPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+NjA7MjA7MjA7MjA7MjA7MTMwOzEwMDsxMzA7MTAwOzEwMDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD44NzA8L3g+PHk+MjcwPC95Pjx3PjQwPC93PjxoPjE1MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7LTwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzIwOzIwOzEzMDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD4yMzA8L3g+PHk+ODA8L3k+PHc+NDA8L3c+PGg+MjYwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDstPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7MjA7MjA7MjQwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjUwPC94Pjx5PjU5MDwveT48dz4yNDA8L3c+PGg+OTA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5TVEVNVGltZQorLS0KKy0gY3VycmVudFRpbWU6IGphdmEudXRpbC5EYXRlCistIHN0YXJ0VGltZTogamF2YS51dGlsLkRhdGUKKy0tCisrIGdldEVsYXBzZWRUaW1lKCk6IGphdmEudXRpbC5EYXRlPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD4xNTA8L3g+PHk+NDQwPC95Pjx3PjQ1PC93PjxoPjEyMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7Jmx0OyZsdDstCittMj0wLi4qCityMj1ncmFwaHMKKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIyOzIwOzIyOzEwMDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD40MzA8L3g+PHk+ODA8L3k+PHc+NDUwPC93PjxoPjEwMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7LTwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzIwOzQzMDs4MDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48L3VtbGV0X2RpYWdyYW0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vbW9kaWZpZXIucGRmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vbW9kaWZpZXIucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMGNiN2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvZG9jdW1lbnRhdGlvbi9tb2RpZmllci5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vbW9kaWZpZXIudXhmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vbW9kaWZpZXIudXhmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MzhmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvZG9jdW1lbnRhdGlvbi9tb2RpZmllci51eGYKQEAgLTAsMCArMSw1NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48dW1sZXRfZGlhZ3JhbT48aGVscF90ZXh0Pi8vVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byBjaGFuZ2UgdGhlIGZvbnRzaXplOgorLy9mb250c2l6ZT0xNAorCisvL1dlbGNvbWUgdG8gVU1MZXQhCisKKy8vICpEb3VibGUtY2xpY2sgb24gVU1MIGVsZW1lbnRzIHRvIGFkZCB0aGVtIHRvIHRoZSBkaWFncmFtLgorLy8gKkVkaXQgZWxlbWVudCBwcm9wZXJ0aWVzIGJ5IG1vZGlmeWluZyB0aGUgdGV4dCBpbiB0aGlzIHBhbmVsLgorLy8gKkVkaXQgdGhlIGZpbGVzIGluIHRoZSAncGFsZXR0ZXMnIGRpcmVjdG9yeSB0byBzdG9yZSB5b3VyIG93biBlbGVtZW50IHBhbGV0dGVzLgorLy8gKlByZXNzIERlbCBvciBCYWNrc3BhY2UgdG8gcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGRpYWdyYW0uCisvLyAqSG9sZCBkb3duIEN0cmwga2V5IHRvIHNlbGVjdCBtdWx0aXBsZSBlbGVtZW50cy4KKy8vICpQcmVzcyBjIHRvIGNvcHkgdGhlIFVNTCBkaWFncmFtIHRvIHRoZSBzeXN0ZW0gY2xpcGJvYXJkLgorLy8gKiBUaGlzIHRleHQgd2lsbCBiZSBzdG9yZWQgd2l0aCBlYWNoIGRpYWdyYW0uIEZlZWwgZnJlZSB0byB1c2UgdGhlIGFyZWEgZm9yIG5vdGVzLgorPC9oZWxwX3RleHQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5Ob3RlPC90eXBlPjxjb29yZGluYXRlcz48eD43MDA8L3g+PHk+MTMwPC95Pjx3PjI0MDwvdz48aD4zMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllcjwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NzUwPC94Pjx5PjIyMDwveT48dz40MDwvdz48aD4xMzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mbHQ7Jmx0Oy08L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4yMDsyMDsyMDsxMTA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NjIwPC94Pjx5PjIwMDwveT48dz4zMjA8L3c+PGg+NDA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5vcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZQorPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD43ODA8L3g+PHk+NzcwPC95Pjx3PjE3MDwvdz48aD4xMDA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5TVEVNVGltZVJhbmdlTW9kaWZpZXIKKy0tCitzdGFydFZhbHVlOiBTVEVNVGltZQorZW5kVmFsdWU6IFNURU1UaW1lCitpbmNyZW1lbnQ6IGxvbmcKKy0tPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD41OTA8L3g+PHk+NzcwPC95Pjx3PjE4MDwvdz48aD4xMDA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5JbnRlZ2VyUmFuZ2VNb2RpZmllcgorLS0KK3N0YXJ0VmFsdWU6IEludGVnZXIKK2VuZFZhbHVlOiBJbnRlZ2VyCitpbmNyZW1lbnQ6IGludAorLS08L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjQzMDwveD48eT43NzA8L3k+PHc+MTUwPC93PjxoPjEwMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPkRvdWJsZVJhbmdlTW9kaWZpZXIKKy0tCitzdGFydFZhbHVlOiBEb3VibGUKK2VuZFZhbHVlOiBEb3VibGUKK2luY3JlbWVudDogZG91YmxlCistLTwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NjYwPC94Pjx5PjQ4MDwveT48dz4yNDA8L3c+PGg+MTAwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+L0ZlYXR1cmVNb2RpZmllci8KKy0tCitlU3RydWN0dXJhbEZlYXR1cmUgOiBFU3RydWN0dXJhbEZlYXR1cmUKKy0tCit1cGRhdGVGZWF0dXJlKEVPYmplY3QpOiB2b2lkCitnZXRNb2RpZmljYXRpb25TdW1tYXJ5KCk6IFN0cmluZworaXNDb21wbGV0ZSgpIDogYm9vbGVhbjwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NjYwPC94Pjx5PjU4MDwveT48dz4yNTA8L3c+PGg+NzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0tCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4yMDs1MDsyMDsyMDsyMzA7MjA7MjMwOzUwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjY0MDwveD48eT4zMzA8L3k+PHc+MjYwPC93PjxoPjEwMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPk1vZGlmaWVyCistLQorIHRhcmdldDogVVJJCistLQordXBkYXRlU2NlbmFyaW8oU2NlbmFyaW8pOiB2b2lkCitnZXRNb2RpZmljYXRpb25TdW1tYXJ5KCk6IExpc3QmbHQ7U3RyaW5nJmd0OworaXNDb21wbGV0ZSgpOiBib29sZWFuPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD43NTA8L3g+PHk+NTYwPC95Pjx3PjQwPC93PjxoPjYwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDstPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7MjA7MjA7NDA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NzE5PC94Pjx5PjQxMDwveT48dz4xMDM8L3c+PGg+OTA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mbHQ7Jmx0OyZsdDsmbHQ7LQorbTI9MC4ubgorcjI9ZmVhdHVyZU1vZGlmaWVyczwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjUxOzIwOzUxOzcwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjQ4MDwveD48eT43MjA8L3k+PHc+MzkwPC93PjxoPjcwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9LTwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzUwOzIwOzIwOzM3MDsyMDszNzA7NTA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NjYwPC94Pjx5PjcyMDwveT48dz40MDwvdz48aD43MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PS08L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4yMDsyMDsyMDs1MDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD42NjA8L3g+PHk+NjgwPC95Pjx3PjQwPC93PjxoPjgwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDstPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7MjA7MjA7NjA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NzkwPC94Pjx5PjYzMDwveT48dz4yMTA8L3c+PGg+ODA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz4vU2VxdWVuY2VNb2RpZmllci8KKy0tCisgCistLQorZ2V0U2VxdWVuY2VTaXplKCk6IGludAorCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50Pjxncm91cD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD42MjA8L3g+PHk+NjMwPC95Pjx3PjEyMDwvdz48aD43MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPi9SYW5nZU1vZGlmaWVyLworLS0KKyAKKy0tCisKKworPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48L2dyb3VwPjwvdW1sZXRfZGlhZ3JhbT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvZG9jdW1lbnRhdGlvbi9wcmVkaWNhdGUucGRmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vcHJlZGljYXRlLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzhiMTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vcHJlZGljYXRlLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvZG9jdW1lbnRhdGlvbi9wcmVkaWNhdGUudXhmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vcHJlZGljYXRlLnV4ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjM5NDNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vcHJlZGljYXRlLnV4ZgpAQCAtMCwwICsxLDEzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48dW1sZXRfZGlhZ3JhbT48aGVscF90ZXh0Pi8vVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byBjaGFuZ2UgdGhlIGZvbnRzaXplOgorLy9mb250c2l6ZT0xNAorCisvL1dlbGNvbWUgdG8gVU1MZXQhCisKKy8vICpEb3VibGUtY2xpY2sgb24gVU1MIGVsZW1lbnRzIHRvIGFkZCB0aGVtIHRvIHRoZSBkaWFncmFtLgorLy8gKkVkaXQgZWxlbWVudCBwcm9wZXJ0aWVzIGJ5IG1vZGlmeWluZyB0aGUgdGV4dCBpbiB0aGlzIHBhbmVsLgorLy8gKkVkaXQgdGhlIGZpbGVzIGluIHRoZSAncGFsZXR0ZXMnIGRpcmVjdG9yeSB0byBzdG9yZSB5b3VyIG93biBlbGVtZW50IHBhbGV0dGVzLgorLy8gKlByZXNzIERlbCBvciBCYWNrc3BhY2UgdG8gcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGRpYWdyYW0uCisvLyAqSG9sZCBkb3duIEN0cmwga2V5IHRvIHNlbGVjdCBtdWx0aXBsZSBlbGVtZW50cy4KKy8vICpQcmVzcyBjIHRvIGNvcHkgdGhlIFVNTCBkaWFncmFtIHRvIHRoZSBzeXN0ZW0gY2xpcGJvYXJkLgorLy8gKiBUaGlzIHRleHQgd2lsbCBiZSBzdG9yZWQgd2l0aCBlYWNoIGRpYWdyYW0uIEZlZWwgZnJlZSB0byB1c2UgdGhlIGFyZWEgZm9yIG5vdGVzLgorPC9oZWxwX3RleHQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MTcwPC94Pjx5PjIzMDwveT48dz4yNDA8L3c+PGg+NDQwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDsmbHQ7Jmx0Oy0KK20yPTIuLioKK3IyPW9wZXJhbmRzPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MTcwOzQyMDsxNzA7MzkwOzIwOzM5MDsyMDsyMDsyMjA7MjA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MzMwPC94Pjx5PjU3MDwveT48dz40MDwvdz48aD4xMDA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mZ3Q7Jmd0OworPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7ODA7MjA7MjA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MjEwPC94Pjx5PjU3MDwveT48dz40MDwvdz48aD4xMDA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mZ3Q7Jmd0OworPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7ODA7MjA7MjA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+ODYwPC94Pjx5PjE1MDwveT48dz40MDwvdz48aD4yODA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mZ3Q7Jmd0OworPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7MjYwOzIwOzIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjY1MDwveD48eT4xNDA8L3k+PHc+MzIwPC93PjxoPjMwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+b3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbjo6SWRlbnRpZmlhYmxlPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLk5vdGU8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjUyMDwveD48eT44MDwveT48dz4yNjA8L3c+PGg+MzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5vcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD43MDA8L3g+PHk+MjYwPC95Pjx3PjEwMDwvdz48aD4xNzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mZ3Q7Jmd0OworPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+ODA7MTUwOzgwOzEwMDsyMDsxMDA7MjA7MjA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NzUwPC94Pjx5PjQxMDwveT48dz4yMTA8L3c+PGg+NjA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz4vSWRlbnRpZmFibGVQcmVkaWNhdGUvCistLQorIAorLS0KKyA8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjkyMDwveD48eT40NTA8L3k+PHc+NDA8L3c+PGg+MjQwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmd0OyZndDsKKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzIyMDsyMDsyMDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD40MTA8L3g+PHk+NzcwPC95Pjx3PjcwPC93PjxoPjcwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+T3IKKy0tCisgCistLQorIAorIAorIDwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MzMwPC94Pjx5Pjc3MDwveT48dz43MDwvdz48aD43MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPkFuZAorLS0KKyAKKy0tCisgCisgCisgPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD41NDA8L3g+PHk+ODMwPC95Pjx3PjQwPC93PjxoPjE0MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7Jmx0OyZsdDstCittMj0xCityMj10aW1lPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7MjA7MjA7MTIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjQ3MDwveD48eT45NTA8L3k+PHc+MzEwPC93PjxoPjMwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+b3JnLmVjbGlwc2Uuc3RlbS5tb2RlbDo6U1RFTVRpbWU8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjY4MDwveD48eT43MjA8L3k+PHc+NDA8L3c+PGg+ODA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mZ3Q7Jmd0OworPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7NjA7MjA7MjA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NjkwPC94Pjx5Pjc4MDwveT48dz4yNDA8L3c+PGg+MTEwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+RWxhcHNlZFRpbWVUZXN0CistLQorIC1udW1iZXJvZkRheXM6IGludAorLXJlZmVyZW5jZVRpbWVWYWxpZDogYm9vbGVhbgorLS0KKytnZXRFbGFwc2VkTWlsbGlzZWNvbmRzKCk6IGxvbmcKKytpc1JlZmVyZW5jZVRpbWVWYWxpZCgpOiBib29sZWFuCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjYyMDwveD48eT43MjA8L3k+PHc+NDA8L3c+PGg+ODA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mZ3Q7Jmd0OworPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7NjA7MjA7MjA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+ODgwPC94Pjx5PjY3MDwveT48dz4xMTA8L3c+PGg+NzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5JZGVudGlmYWJsZVRlc3QKKy0tCisgCistLQorCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjYyMDwveD48eT42NzA8L3k+PHc+OTA8L3c+PGg+NzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz4vVGltZVRlc3QvCistLQorIAorLS0KKyA8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjY4MDwveD48eT41NzA8L3k+PHc+NDA8L3c+PGg+MTIwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmd0OyZndDsKKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzEwMDsyMDsyMDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD4zMDA8L3g+PHk+NDAwPC95Pjx3PjQwPC93PjxoPjE0MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZndDsmZ3Q7Cis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4yMDsxMjA7MjA7MjA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NDIwPC94Pjx5PjQwMDwveT48dz40MDwvdz48aD4xNDA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mZ3Q7Jmd0OworPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7MTIwOzIwOzIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjU1MDwveD48eT4yNjA8L3k+PHc+NjA8L3c+PGg+MjgwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDsmbHQ7LQorbTI9MQorcjI9cHJlZGljYXRlPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MzA7MjYwOzMwOzIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjY4MDwveD48eT4yNjA8L3k+PHc+NDA8L3c+PGg+MjgwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmd0OyZndDsKKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzI2MDsyMDsyMDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD42OTA8L3g+PHk+NTIwPC95Pjx3PjIxMDwvdz48aD43MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPi9UZXN0LworLS0KKyAKKy0tCisgPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD41MzA8L3g+PHk+NTIwPC95Pjx3PjE1MDwvdz48aD43MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPlByZWRpY2F0ZVJlZmVyZW5jZQorLS0KKy1wcmVkaWNhdGU6IFByZWRpY2F0ZQorLS0KKyA8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjM3MDwveD48eT41MjA8L3k+PHc+MTUwPC93PjxoPjcwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+UHJlZGljYXRlRXhwcmVzc2lvbgorLS0KKy1wcmVkaWNhdGU6IFByZWRpY2F0ZQorLS0KKyA8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjIwMDwveD48eT41MjA8L3k+PHc+MTYwPC93PjxoPjcwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+L0Jvb2xlYW5PcGVyYXRvci8KKy0tCisgCistLQorIAorIDwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MzIwPC94Pjx5PjY1MDwveT48dz4xNjA8L3c+PGg+NzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz4vTmFyeUJvb2xlYW5PcGVyYXRvci8KKy0tCisgCistLQorIAorIAorIDwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NzIwPC94Pjx5PjY3MDwveT48dz43MDwvdz48aD43MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPlRydWUKKy0tCisgCistLQorIDwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MjgwPC94Pjx5PjM1MDwveT48dz4yMTA8L3c+PGg+NzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz4vQm9vbGVhbkV4cHJlc3Npb24vCistLQorIAorLS0KKyA8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjQxMDwveD48eT4yNjA8L3k+PHc+NDA8L3c+PGg+MTEwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmd0OyZndDsKKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzkwOzIwOzIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjY4NDwveD48eT44NzA8L3k+PHc+OTI8L3c+PGg+MTAwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDsmbHQ7Jmx0Oy0KK20yPTEKK3IyPXJlZmVyZW5jZVRpbWU8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz40NjsyMDs0Njs4MDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD41MTA8L3g+PHk+NzgwPC95Pjx3PjE2MDwvdz48aD43MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPkFic29sdXRlVGltZVRlc3QKKy0tCisgCistLQorICtzZXRUaW1lKFNURU1UaW1lKTwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+ODcwPC94Pjx5PjU3MDwveT48dz40MDwvdz48aD4xMjA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mZ3Q7Jmd0OworPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7MTAwOzIwOzIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjgxMDwveD48eT41NzA8L3k+PHc+NDA8L3c+PGg+MTIwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmd0OyZndDsKKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzEwMDsyMDsyMDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD43NDA8L3g+PHk+NTcwPC95Pjx3PjQwPC93PjxoPjEyMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZndDsmZ3Q7Cis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4yMDsxMDA7MjA7MjA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+ODAwPC94Pjx5PjY3MDwveT48dz43MDwvdz48aD43MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPkZhbHNlCistLQorIAorLS0KKyA8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjQyMDwveD48eT43MDA8L3k+PHc+NDA8L3c+PGg+OTA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mZ3Q7Jmd0OworPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7NzA7MjA7MjA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MzQwPC94Pjx5PjcwMDwveT48dz40MDwvdz48aD45MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZndDsmZ3Q7Cis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4yMDs3MDsyMDsyMDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD4yMDA8L3g+PHk+NzAwPC95Pjx3PjQwPC93PjxoPjkwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmd0OyZndDsKKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzcwOzIwOzIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjE5MDwveD48eT43NzA8L3k+PHc+NzA8L3c+PGg+NzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5Ob3QKKy0tCisgCistLQorIAorIAorIDwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MTQwPC94Pjx5PjE5MDwveT48dz4yNzA8L3c+PGg+NDgwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDsmbHQ7Jmx0Oy0KK20yPTEKK3IyPW9wZXJhbmQ8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4yMDs0NjA7MjA7MjA7MjUwOzIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjE1MDwveD48eT42NTA8L3k+PHc+MTYwPC93PjxoPjcwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+L1VuYXJ5Qm9vbGVhbk9wZXJhdG9yLworLS0KKyAKKy0tCisgCisgCisgPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD4zOTA8L3g+PHk+MTkwPC95Pjx3PjM0MDwvdz48aD45MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPi9QcmVkaWNhdGUvCistLQorIAorLS0KKyNldmFsdXRlKFNURU1UaW1lLCBsb25nLCBEZWNvcmF0b3IpOiBib29sZWFuCisKKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PC91bWxldF9kaWFncmFtPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9kb2N1bWVudGF0aW9uL3NjZW5hcmlvLnBkZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9kb2N1bWVudGF0aW9uL3NjZW5hcmlvLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWNjNGNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vc2NlbmFyaW8ucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9kb2N1bWVudGF0aW9uL3NjZW5hcmlvLnV4ZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9kb2N1bWVudGF0aW9uL3NjZW5hcmlvLnV4ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MThmOTI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vc2NlbmFyaW8udXhmCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PHVtbGV0X2RpYWdyYW0+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5Ob3RlPC90eXBlPjxjb29yZGluYXRlcz48eD40NzA8L3g+PHk+MTA8L3k+PHc+MjMwPC93PjxoPjMwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+b3JnLmVjbGlwc2Uuc3RlbS5zY2VuYXJpbzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MjgwPC94Pjx5PjYwPC95Pjx3PjMxMDwvdz48aD4zMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPm9yZy5lY2xpcHNlLnN0ZW0uY29tbW9uLklkZW50aWZpYWJsZTwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NTIwPC94Pjx5PjcwPC95Pjx3PjQwPC93PjxoPjE5MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7LTwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzIwOzIwOzE3MDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD4yNTA8L3g+PHk+NjYwPC95Pjx3PjI1MDwvdz48aD4zMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmNvbS5pYm0uYWxtYWRlbi5zdGVtLm1vZGVsLk1vZGVsCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjkwPC94Pjx5PjYwMDwveT48dz4yNTA8L3c+PGg+MzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5vcmcuZWNsaXBzZS5zdGVtLmdyYXBoLkdyYXBoCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjI1MDwveD48eT4zNDA8L3k+PHc+MTAwPC93PjxoPjI4MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7Jmx0OyZsdDstCittMj0xCityMj1jYW5vbmljYWxHcmFwaDwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjUwOzIwOzUwOzI2MDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD4zNTA8L3g+PHk+MzQwPC95Pjx3PjQwPC93PjxoPjM0MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7Jmx0OyZsdDstCittMj0xCityMj1tb2RlbDwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzIwOzIwOzMyMDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD4xNjwveD48eT4zNDA8L3k+PHc+MTA5PC93PjxoPjE5MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7Jmx0OyZsdDstCittMj0wLi4qCityMj1tb2RlbERlY29yYXRvcnM8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz41NDsyMDs1NDsxNzA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MTM4PC94Pjx5PjM0MDwveT48dz4xMjQ8L3c+PGg+MTkwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDsmbHQ7Jmx0Oy0KK20yPTAuLioKK3IyPXNjZW5hcmlvRGVjb3JhdG9yczwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjYyOzIwOzYyOzE3MDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD40MDwveD48eT41MTA8L3k+PHc+MjUwPC93PjxoPjMwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+b3JnLmVjbGlwc2Uuc3RlbS5tb2RlbC5EZWNvcmF0b3IKKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NTA8L3g+PHk+MTgwPC95Pjx3PjMzMDwvdz48aD4xODA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5TY2VuYXJpbworLS0KKyAtIHRpdGxlOiBTdHJpbmcKKy0tCisrIGluaXRpYWxpemUoKTogdm9pZAorKyBzdGVwKCk6IHZvaWQKKysgcmVzZXQoKTogdm9pZAorPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD40ODA8L3g+PHk+NDAwPC95Pjx3PjI0MDwvdz48aD4xMjA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz4vU2VxdWVudGlhbFNlcXVlbmNlci8KKy0tCisgCistLQorK2dldEN1cnJlbnRUaW1lKCk6IFNURU1UaW1lCisrZ2V0TmV4dFRpbWUoKTogU1RFTVRpbWU8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjI4MDwveD48eT43MDwveT48dz40MDwvdz48aD4xMzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mbHQ7Jmx0Oy08L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4yMDsyMDsyMDsxMTA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NTgwPC94Pjx5PjM0MDwveT48dz40MDwvdz48aD44MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPmx0PSZsdDsmbHQ7LTwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjIwOzIwOzIwOzYwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjQ4MDwveD48eT4yNDA8L3k+PHc+MjQwPC93PjxoPjEyMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPiZsdDsmbHQ7QWJzdHJhY3QmZ3Q7Jmd0OworL1NlcXVlbmNlci8KKy0tCisgCistLQorK2dldEN1cnJlbnRUaW1lKCk6IFNURU1UaW1lCisrZ2V0TmV4dFRpbWUoKTogU1RFTVRpbWU8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjM2MDwveD48eT4yNTA8L3k+PHc+MTQwPC93PjxoPjQwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDsmbHQ7Jmx0Oy0KK20yPTEKK3IyPXNlcXVlbmNlcgorPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7MjA7MTIwOzIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjwvdW1sZXRfZGlhZ3JhbT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvZG9jdW1lbnRhdGlvbi9zZXF1ZW5jZXIucGRmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vc2VxdWVuY2VyLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDRkMjg4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vc2VxdWVuY2VyLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvZG9jdW1lbnRhdGlvbi9zZXF1ZW5jZXIudXhmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vc2VxdWVuY2VyLnV4ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODZhMGZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vc2VxdWVuY2VyLnV4ZgpAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjx1bWxldF9kaWFncmFtPjxoZWxwX3RleHQ+Ly9VbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIGNoYW5nZSB0aGUgZm9udHNpemU6CisvL2ZvbnRzaXplPTE0CisKKy8vV2VsY29tZSB0byBVTUxldCEKKworLy8gKkRvdWJsZS1jbGljayBvbiBVTUwgZWxlbWVudHMgdG8gYWRkIHRoZW0gdG8gdGhlIGRpYWdyYW0uCisvLyAqRWRpdCBlbGVtZW50IHByb3BlcnRpZXMgYnkgbW9kaWZ5aW5nIHRoZSB0ZXh0IGluIHRoaXMgcGFuZWwuCisvLyAqRWRpdCB0aGUgZmlsZXMgaW4gdGhlICdwYWxldHRlcycgZGlyZWN0b3J5IHRvIHN0b3JlIHlvdXIgb3duIGVsZW1lbnQgcGFsZXR0ZXMuCisvLyAqUHJlc3MgRGVsIG9yIEJhY2tzcGFjZSB0byByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgZGlhZ3JhbS4KKy8vICpIb2xkIGRvd24gQ3RybCBrZXkgdG8gc2VsZWN0IG11bHRpcGxlIGVsZW1lbnRzLgorLy8gKlByZXNzIGMgdG8gY29weSB0aGUgVU1MIGRpYWdyYW0gdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQuCisvLyAqIFRoaXMgdGV4dCB3aWxsIGJlIHN0b3JlZCB3aXRoIGVhY2ggZGlhZ3JhbS4gRmVlbCBmcmVlIHRvIHVzZSB0aGUgYXJlYSBmb3Igbm90ZXMuCis8L2hlbHBfdGV4dD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD40MDA8L3g+PHk+MTgwPC95Pjx3PjIxMDwvdz48aD4yNDA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz4vU2VxdWVuY2VyLworLS0KKy0gdGltZURlbHRhOiBsb25nCistIHdvcmtDb21wbGV0ZTogZG91YmxlCistIGR1cmF0aW9uOiBpbnQKKy0gY3ljbGU6IGludAorLS0KKytnZXROZXh0VGltZSgpOiBTVEVNVGltZQorK2dldFRpbWVEZWx0YSgpOiBsb25nCisrZ2V0RHVyYXRpb24oKTogbG9uZworK2lzVGltZVRvU3RvcCgpOiBib29sZWFuCisrcmVzZXQoKTogdm9pZAorK2dldFdvcmtDb21wbGV0ZSgpOiBkb3VibGUKKytnZXRXb3JrSW5jcmVtZW50KCk6IGludAorK2dldEN5Y2xlKCk6IGludAorIAorIDwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NDgwPC94Pjx5PjU0MDwveT48dz40MDwvdz48aD4xMDA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mbHQ7Jmx0Oy08L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4yMDsyMDsyMDs4MDwvYWRkaXRpb25hbF9hdHRyaWJ1dGVzPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLlJlbGF0aW9uPC90eXBlPjxjb29yZGluYXRlcz48eD40ODA8L3g+PHk+NDAwPC95Pjx3PjQwPC93PjxoPjkwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDstPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7MjA7MjA7NzA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NDAwPC94Pjx5PjYyMDwveT48dz4yMTA8L3c+PGg+NzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5SZWFsVGltZVNlcXVlbmNlcgorLS0KKyAKKy0tCisgCisgPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD40MDA8L3g+PHk+NDcwPC95Pjx3PjIxMDwvdz48aD45MDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPlNlcXVudGlhbFNlcXVlbmNlcgorLS0KKy10aW1lSW5jcmVtZW50OiBsb25nCistLQorK2dldFRpbWVJbmNyZW1lbnQoKTogbG9uZworK3NldFRpbWVJbmNyZW1lbnQobG9uZykKKzwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzLz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MjYyPC94Pjx5PjMwMDwveT48dz4xNTg8L3c+PGg+OTA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5sdD0mbHQ7Jmx0OyZsdDsmbHQ7LQorbTI9MQorcjI9Y3VycmVudFRpbWU8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4xMzg7MjA7Mzg7MjA7Mzg7NzA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5SZWxhdGlvbjwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MTgyPC94Pjx5PjI1MDwveT48dz4yMzg8L3c+PGg+MTQwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDsmbHQ7Jmx0Oy0KK20yPTAuLjEKK3IyPWVuZFRpbWU8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcz4yMTg7MjA7Mjg7MjA7Mjg7MTIwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjcwPC94Pjx5PjIwMDwveT48dz4zNTA8L3c+PGg+MTkwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDsmbHQ7Jmx0Oy0KK20yPTEKK3IyPXN0YXJ0VGltZTwvcGFuZWxfYXR0cmlidXRlcz48YWRkaXRpb25hbF9hdHRyaWJ1dGVzPjMzMDsyMDszMDsyMDszMDsxNzA8L2FkZGl0aW9uYWxfYXR0cmlidXRlcz48L2VsZW1lbnQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5DbGFzczwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+NzA8L3g+PHk+MzcwPC95Pjx3PjI5MDwvdz48aD4zMDwvaD48L2Nvb3JkaW5hdGVzPjxwYW5lbF9hdHRyaWJ1dGVzPm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbDo6U1RFTVRpbWU8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuTm90ZTwvdHlwZT48Y29vcmRpbmF0ZXM+PHg+MzgwPC94Pjx5PjEzMDwveT48dz4yNTA8L3c+PGg+MzA8L2g+PC9jb29yZGluYXRlcz48cGFuZWxfYXR0cmlidXRlcz5vcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48L3VtbGV0X2RpYWdyYW0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vdHJpZ2dlci5wZGYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvZG9jdW1lbnRhdGlvbi90cmlnZ2VyLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQwMzhlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vdHJpZ2dlci5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vdHJpZ2dlci51eGYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvZG9jdW1lbnRhdGlvbi90cmlnZ2VyLnV4ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmJkNDllCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2RvY3VtZW50YXRpb24vdHJpZ2dlci51eGYKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48dW1sZXRfZGlhZ3JhbT48aGVscF90ZXh0Pi8vVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byBjaGFuZ2UgdGhlIGZvbnRzaXplOgorLy9mb250c2l6ZT0xNAorCisvL1dlbGNvbWUgdG8gVU1MZXQhCisKKy8vICpEb3VibGUtY2xpY2sgb24gVU1MIGVsZW1lbnRzIHRvIGFkZCB0aGVtIHRvIHRoZSBkaWFncmFtLgorLy8gKkVkaXQgZWxlbWVudCBwcm9wZXJ0aWVzIGJ5IG1vZGlmeWluZyB0aGUgdGV4dCBpbiB0aGlzIHBhbmVsLgorLy8gKkVkaXQgdGhlIGZpbGVzIGluIHRoZSAncGFsZXR0ZXMnIGRpcmVjdG9yeSB0byBzdG9yZSB5b3VyIG93biBlbGVtZW50IHBhbGV0dGVzLgorLy8gKlByZXNzIERlbCBvciBCYWNrc3BhY2UgdG8gcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGRpYWdyYW0uCisvLyAqSG9sZCBkb3duIEN0cmwga2V5IHRvIHNlbGVjdCBtdWx0aXBsZSBlbGVtZW50cy4KKy8vICpQcmVzcyBjIHRvIGNvcHkgdGhlIFVNTCBkaWFncmFtIHRvIHRoZSBzeXN0ZW0gY2xpcGJvYXJkLgorLy8gKiBUaGlzIHRleHQgd2lsbCBiZSBzdG9yZWQgd2l0aCBlYWNoIGRpYWdyYW0uIEZlZWwgZnJlZSB0byB1c2UgdGhlIGFyZWEgZm9yIG5vdGVzLgorPC9oZWxwX3RleHQ+PGVsZW1lbnQ+PHR5cGU+Y29tLnVtbGV0LmVsZW1lbnQuYmFzZS5Ob3RlPC90eXBlPjxjb29yZGluYXRlcz48eD42ODA8L3g+PHk+MzA8L3k+PHc+MjMwPC93PjxoPjMwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+b3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXI8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjU5MDwveD48eT4xNDA8L3k+PHc+NjA8L3c+PGg+MTcwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDsmbHQ7LQorbTI9MQorcjI9cHJlZGljYXRlPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MzA7MjA7MzA7MTUwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuUmVsYXRpb248L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjQ2MDwveD48eT4xNDA8L3k+PHc+NDA8L3c+PGg+MTcwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+bHQ9Jmx0OyZsdDsmbHQ7LQorbTI9MQorcjI9YWN0aW9uPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXM+MjA7MjA7MjA7MTUwPC9hZGRpdGlvbmFsX2F0dHJpYnV0ZXM+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjIzMDwveD48eT4yOTA8L3k+PHc+MjkwPC93PjxoPjMwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+b3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsOjpEZWNvcmF0b3I8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjxlbGVtZW50Pjx0eXBlPmNvbS51bWxldC5lbGVtZW50LmJhc2UuQ2xhc3M8L3R5cGU+PGNvb3JkaW5hdGVzPjx4PjU1MDwveD48eT4yOTA8L3k+PHc+MjkwPC93PjxoPjMwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+b3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZTo6UHJlZGljYXRlPC9wYW5lbF9hdHRyaWJ1dGVzPjxhZGRpdGlvbmFsX2F0dHJpYnV0ZXMvPjwvZWxlbWVudD48ZWxlbWVudD48dHlwZT5jb20udW1sZXQuZWxlbWVudC5iYXNlLkNsYXNzPC90eXBlPjxjb29yZGluYXRlcz48eD40NDA8L3g+PHk+OTA8L3k+PHc+MjEwPC93PjxoPjcwPC9oPjwvY29vcmRpbmF0ZXM+PHBhbmVsX2F0dHJpYnV0ZXM+VHJpZ2dlcgorLS0KKyAKKy0tCisgCis8L3BhbmVsX2F0dHJpYnV0ZXM+PGFkZGl0aW9uYWxfYXR0cmlidXRlcy8+PC9lbGVtZW50PjwvdW1sZXRfZGlhZ3JhbT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2VwbC12MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDRiMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoreG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKK3htbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPGxpbmsgcmVsPUZpbGUtTGlzdAoraHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOkRvY3VtZW50UHJvcGVydGllcz4KKyAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KKyAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgorICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+CisgIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+CisgIDxvOlBhZ2VzPjQ8L286UGFnZXM+CisgIDxvOldvcmRzPjE2MjY8L286V29yZHM+CisgIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgorICAgPG86TGluZXM+Nzc8L286TGluZXM+CisgIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KKyAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+CisgIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+CisgPC9vOkRvY3VtZW50UHJvcGVydGllcz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OldvcmREb2N1bWVudD4KKyAgPHc6VHJhY2tSZXZpc2lvbnMvPgorIDwvdzpXb3JkRG9jdW1lbnQ+Cis8L3htbD48IVtlbmRpZl0tLT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlRhaG9tYTsKKwlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKKwltc28tZm9udC1jaGFyc2V0OjA7CisJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7CisJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7CisJbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KK3AuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bXNvLXN0eWxlLXBhcmVudDoiIjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwCisJe21hcmdpbi1yaWdodDowaW47CisJbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CisJbWFyZ2luLWxlZnQ6MGluOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKKwl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZTo4LjBwdDsKKwlmb250LWZhbWlseTpUYWhvbWE7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorQHBhZ2UgU2VjdGlvbjEKKwl7c2l6ZTo4LjVpbiAxMS4waW47CisJbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47CisJbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKKwltc28tZm9vdGVyLW1hcmdpbjouNWluOworCW1zby1wYXBlci1zb3VyY2U6MDt9CitkaXYuU2VjdGlvbjEKKwl7cGFnZTpTZWN0aW9uMTt9CistLT4KKzwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgorPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCitUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAorUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCitPRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCithZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKK3N1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKK2J5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgoraWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KK3N1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCit3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKK2VudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKK2NsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCitvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucworZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KK3JlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50CithIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KK3N0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5CitkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCitSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAorYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCitjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgorb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKK2J5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCit0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCithbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCitSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCitDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgordGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Citmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQordG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKK2lmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKK3RoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQorRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKK3JpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KK3RoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Cis8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK2l0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAorY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQorYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKK2FuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCitlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAoraW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAorYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCitzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0CitDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCitzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCitpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCitjb2RlIGZvcm06PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQorY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQorY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCitvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQorYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycworYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKK29mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAorbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCitDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKK2Nvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCit0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCitjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKK3RvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK3RvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCithbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQoraW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCit3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcworc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCitvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCitjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKK1dJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKK01FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQorUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcworQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKK2VxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgorVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgorVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKK29yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKK2Z1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgorYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAorb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCitzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCitwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQorY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKK3RoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKK0FncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCitzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAorZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCitTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCitBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKK0FncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKK2l0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEb3VibGVWYWx1ZUxpc3RfdmFsdWVzX0RvdWJsZVZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRG91YmxlVmFsdWVMaXN0X3ZhbHVlc19Eb3VibGVWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5YWJiNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRG91YmxlVmFsdWVMaXN0X3ZhbHVlc19Eb3VibGVWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEb3VibGVWYWx1ZU1hdHJpeF92YWx1ZUxpc3RzX0RvdWJsZVZhbHVlTGlzdC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURvdWJsZVZhbHVlTWF0cml4X3ZhbHVlTGlzdHNfRG91YmxlVmFsdWVMaXN0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzQ0MGJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEb3VibGVWYWx1ZU1hdHJpeF92YWx1ZUxpc3RzX0RvdWJsZVZhbHVlTGlzdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFZGdlX2xhYmVsX0R5bmFtaWNMYWJlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVkZ2VfbGFiZWxfRHluYW1pY0xhYmVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjM2YjM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFZGdlX2xhYmVsX0R5bmFtaWNMYWJlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFZGdlX2xhYmVsX0xhYmVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWRnZV9sYWJlbF9MYWJlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NjMThmMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWRnZV9sYWJlbF9MYWJlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFeHBlcmltZW50X21vZGlmaWVyc19Nb2RpZmllci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUV4cGVyaW1lbnRfbW9kaWZpZXJzX01vZGlmaWVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWFlMTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFeHBlcmltZW50X21vZGlmaWVyc19Nb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFeHBlcmltZW50X3NjZW5hcmlvX1NjZW5hcmlvLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXhwZXJpbWVudF9zY2VuYXJpb19TY2VuYXJpby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJiZTFhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXhwZXJpbWVudF9zY2VuYXJpb19TY2VuYXJpby5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaF9kZWNvcmF0b3JzX0RlY29yYXRvci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoX2RlY29yYXRvcnNfRGVjb3JhdG9yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTY2ZDExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaF9kZWNvcmF0b3JzX0RlY29yYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaF9kZWNvcmF0b3JzX0VkZ2VEZWNvcmF0b3IuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaF9kZWNvcmF0b3JzX0VkZ2VEZWNvcmF0b3IuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NzY3MTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoX2RlY29yYXRvcnNfRWRnZURlY29yYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaF9kZWNvcmF0b3JzX0dyYXBoRGVjb3JhdG9yLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhfZGVjb3JhdG9yc19HcmFwaERlY29yYXRvci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyNWE2NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhfZGVjb3JhdG9yc19HcmFwaERlY29yYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaF9kZWNvcmF0b3JzX05vZGVEZWNvcmF0b3IuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaF9kZWNvcmF0b3JzX05vZGVEZWNvcmF0b3IuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YWVhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoX2RlY29yYXRvcnNfTm9kZURlY29yYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaF9lZGdlc01hcF9VUklUb0VkZ2VNYXBFbnRyeS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoX2VkZ2VzTWFwX1VSSVRvRWRnZU1hcEVudHJ5LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGM3MTExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaF9lZGdlc01hcF9VUklUb0VkZ2VNYXBFbnRyeS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaF9lZGdlc19VUklUb0lkZW50aWZpYWJsZU1hcEVudHJ5LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhfZWRnZXNfVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0Nzc4ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhfZWRnZXNfVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaF9ncmFwaExhYmVsc19VUklUb0lkZW50aWZpYWJsZU1hcEVudHJ5LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhfZ3JhcGhMYWJlbHNfVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0Nzc4ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhfZ3JhcGhMYWJlbHNfVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaF9ub2RlTGFiZWxzX1VSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnkuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaF9ub2RlTGFiZWxzX1VSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnkuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNDc3OGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoX25vZGVMYWJlbHNfVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaF9ub2Rlc01hcF9VUklUb05vZGVNYXBFbnRyeS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoX25vZGVzTWFwX1VSSVRvTm9kZU1hcEVudHJ5LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjQwMjM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaF9ub2Rlc01hcF9VUklUb05vZGVNYXBFbnRyeS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaF9ub2Rlc19VUklUb0lkZW50aWZpYWJsZU1hcEVudHJ5LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhfbm9kZXNfVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0Nzc4ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhfbm9kZXNfVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaF91bnJlc29sdmVkSWRlbnRpZmlhYmxlc19VbnJlc29sdmVkSWRlbnRpZmlhYmxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhfdW5yZXNvbHZlZElkZW50aWZpYWJsZXNfVW5yZXNvbHZlZElkZW50aWZpYWJsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzNjE4NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhfdW5yZXNvbHZlZElkZW50aWZpYWJsZXNfVW5yZXNvbHZlZElkZW50aWZpYWJsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJZGVudGlmaWFibGVfZHVibGluQ29yZV9EdWJsaW5Db3JlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSWRlbnRpZmlhYmxlX2R1YmxpbkNvcmVfRHVibGluQ29yZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhNDYzZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSWRlbnRpZmlhYmxlX2R1YmxpbkNvcmVfRHVibGluQ29yZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RlbF9lZGdlRGVjb3JhdG9yc19FZGdlRGVjb3JhdG9yLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kZWxfZWRnZURlY29yYXRvcnNfRWRnZURlY29yYXRvci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3OGI3ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kZWxfZWRnZURlY29yYXRvcnNfRWRnZURlY29yYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RlbF9ncmFwaERlY29yYXRvcnNfR3JhcGhEZWNvcmF0b3IuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RlbF9ncmFwaERlY29yYXRvcnNfR3JhcGhEZWNvcmF0b3IuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkN2I5OTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1vZGVsX2dyYXBoRGVjb3JhdG9yc19HcmFwaERlY29yYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RlbF9ncmFwaHNfR3JhcGguZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RlbF9ncmFwaHNfR3JhcGguZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YzE4OTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1vZGVsX2dyYXBoc19HcmFwaC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RlbF9tb2RlbHNfTW9kZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RlbF9tb2RlbHNfTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMzM5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1vZGVsX21vZGVsc19Nb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RlbF9ub2RlRGVjb3JhdG9yc19Ob2RlRGVjb3JhdG9yLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kZWxfbm9kZURlY29yYXRvcnNfTm9kZURlY29yYXRvci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdjNzM4ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kZWxfbm9kZURlY29yYXRvcnNfTm9kZURlY29yYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX0Jvb2xlYW5TZXF1ZW5jZU1vZGlmaWVyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kaWZpZXJfZmVhdHVyZU1vZGlmaWVyc19Cb29sZWFuU2VxdWVuY2VNb2RpZmllci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1ZTc0OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kaWZpZXJfZmVhdHVyZU1vZGlmaWVyc19Cb29sZWFuU2VxdWVuY2VNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX0RvdWJsZU5PUE1vZGlmaWVyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kaWZpZXJfZmVhdHVyZU1vZGlmaWVyc19Eb3VibGVOT1BNb2RpZmllci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5OWU5NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kaWZpZXJfZmVhdHVyZU1vZGlmaWVyc19Eb3VibGVOT1BNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX0RvdWJsZVJhbmdlTW9kaWZpZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX0RvdWJsZVJhbmdlTW9kaWZpZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNWU3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1vZGlmaWVyX2ZlYXR1cmVNb2RpZmllcnNfRG91YmxlUmFuZ2VNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX0RvdWJsZVNlcXVlbmNlTW9kaWZpZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX0RvdWJsZVNlcXVlbmNlTW9kaWZpZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNjE5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1vZGlmaWVyX2ZlYXR1cmVNb2RpZmllcnNfRG91YmxlU2VxdWVuY2VNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX0ludGVnZXJOT1BNb2RpZmllci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1vZGlmaWVyX2ZlYXR1cmVNb2RpZmllcnNfSW50ZWdlck5PUE1vZGlmaWVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzFhMmU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX0ludGVnZXJOT1BNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX0ludGVnZXJSYW5nZU1vZGlmaWVyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kaWZpZXJfZmVhdHVyZU1vZGlmaWVyc19JbnRlZ2VyUmFuZ2VNb2RpZmllci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkYWI1OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kaWZpZXJfZmVhdHVyZU1vZGlmaWVyc19JbnRlZ2VyUmFuZ2VNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX0ludGVnZXJTZXF1ZW5jZU1vZGlmaWVyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kaWZpZXJfZmVhdHVyZU1vZGlmaWVyc19JbnRlZ2VyU2VxdWVuY2VNb2RpZmllci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyZDBkMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kaWZpZXJfZmVhdHVyZU1vZGlmaWVyc19JbnRlZ2VyU2VxdWVuY2VNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX0xvbmdOT1BNb2RpZmllci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1vZGlmaWVyX2ZlYXR1cmVNb2RpZmllcnNfTG9uZ05PUE1vZGlmaWVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTNiY2IzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX0xvbmdOT1BNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX0xvbmdSYW5nZU1vZGlmaWVyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kaWZpZXJfZmVhdHVyZU1vZGlmaWVyc19Mb25nUmFuZ2VNb2RpZmllci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ1ZGUwZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kaWZpZXJfZmVhdHVyZU1vZGlmaWVyc19Mb25nUmFuZ2VNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX0xvbmdTZXF1ZW5jZU1vZGlmaWVyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kaWZpZXJfZmVhdHVyZU1vZGlmaWVyc19Mb25nU2VxdWVuY2VNb2RpZmllci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiM2EyNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kaWZpZXJfZmVhdHVyZU1vZGlmaWVyc19Mb25nU2VxdWVuY2VNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX05PUE1vZGlmaWVyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kaWZpZXJfZmVhdHVyZU1vZGlmaWVyc19OT1BNb2RpZmllci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxYmY2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kaWZpZXJfZmVhdHVyZU1vZGlmaWVyc19OT1BNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX1NURU1UaW1lTk9QTW9kaWZpZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX1NURU1UaW1lTk9QTW9kaWZpZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYjNhMjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1vZGlmaWVyX2ZlYXR1cmVNb2RpZmllcnNfU1RFTVRpbWVOT1BNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX1NURU1UaW1lUmFuZ2VNb2RpZmllci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1vZGlmaWVyX2ZlYXR1cmVNb2RpZmllcnNfU1RFTVRpbWVSYW5nZU1vZGlmaWVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjFlMDVjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX1NURU1UaW1lUmFuZ2VNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX1NURU1UaW1lU2VxdWVuY2VNb2RpZmllci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1vZGlmaWVyX2ZlYXR1cmVNb2RpZmllcnNfU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjc1NDA3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX1NURU1UaW1lU2VxdWVuY2VNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX1NlcXVlbmNlTW9kaWZpZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX1NlcXVlbmNlTW9kaWZpZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZWU2MGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1vZGlmaWVyX2ZlYXR1cmVNb2RpZmllcnNfU2VxdWVuY2VNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX1N0cmluZ05PUE1vZGlmaWVyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kaWZpZXJfZmVhdHVyZU1vZGlmaWVyc19TdHJpbmdOT1BNb2RpZmllci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTViZjJlZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kaWZpZXJfZmVhdHVyZU1vZGlmaWVyc19TdHJpbmdOT1BNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX1N0cmluZ1NlcXVlbmNlTW9kaWZpZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNb2RpZmllcl9mZWF0dXJlTW9kaWZpZXJzX1N0cmluZ1NlcXVlbmNlTW9kaWZpZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZTc5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1vZGlmaWVyX2ZlYXR1cmVNb2RpZmllcnNfU3RyaW5nU2VxdWVuY2VNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX0Fic29sdXRlVGltZVRlc3QuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX0Fic29sdXRlVGltZVRlc3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOWNiZTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5hcnlCb29sZWFuT3BlcmF0b3Jfb3BlcmFuZHNfQWJzb2x1dGVUaW1lVGVzdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX0FuZC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5hcnlCb29sZWFuT3BlcmF0b3Jfb3BlcmFuZHNfQW5kLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2ZkYmVhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX0FuZC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX0VsYXBzZWRUaW1lVGVzdC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5hcnlCb29sZWFuT3BlcmF0b3Jfb3BlcmFuZHNfRWxhcHNlZFRpbWVUZXN0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTZjMjdmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX0VsYXBzZWRUaW1lVGVzdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX0ZhbHNlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kc19GYWxzZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE1ZGZkNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kc19GYWxzZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX0lkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24uZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX0lkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YTE0NzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5hcnlCb29sZWFuT3BlcmF0b3Jfb3BlcmFuZHNfSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX05vdC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5hcnlCb29sZWFuT3BlcmF0b3Jfb3BlcmFuZHNfTm90LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTVkZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX05vdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX09yLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kc19Pci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRlMjI0NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kc19Pci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX1ByZWRpY2F0ZUV4cHJlc3Npb24uZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX1ByZWRpY2F0ZUV4cHJlc3Npb24uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDIxMWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5hcnlCb29sZWFuT3BlcmF0b3Jfb3BlcmFuZHNfUHJlZGljYXRlRXhwcmVzc2lvbi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX1ByZWRpY2F0ZVJlZmVyZW5jZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5hcnlCb29sZWFuT3BlcmF0b3Jfb3BlcmFuZHNfUHJlZGljYXRlUmVmZXJlbmNlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGI0MDc4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX1ByZWRpY2F0ZVJlZmVyZW5jZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX1RpbWVUZXN0LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kc19UaW1lVGVzdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmZGIxNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kc19UaW1lVGVzdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX1RydWUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRzX1RydWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZTI4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5hcnlCb29sZWFuT3BlcmF0b3Jfb3BlcmFuZHNfVHJ1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9BYnNvbHV0ZVRpbWVUZXN0LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJlZGljYXRlRXhwcmVzc2lvbl9wcmVkaWNhdGVfQWJzb2x1dGVUaW1lVGVzdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwMDVhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJlZGljYXRlRXhwcmVzc2lvbl9wcmVkaWNhdGVfQWJzb2x1dGVUaW1lVGVzdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9BbmQuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9BbmQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZDQwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByZWRpY2F0ZUV4cHJlc3Npb25fcHJlZGljYXRlX0FuZC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9FbGFwc2VkVGltZVRlc3QuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9FbGFwc2VkVGltZVRlc3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTNjZjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByZWRpY2F0ZUV4cHJlc3Npb25fcHJlZGljYXRlX0VsYXBzZWRUaW1lVGVzdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9GYWxzZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByZWRpY2F0ZUV4cHJlc3Npb25fcHJlZGljYXRlX0ZhbHNlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2YyN2IyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9GYWxzZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9JZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJlZGljYXRlRXhwcmVzc2lvbl9wcmVkaWNhdGVfSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMwMzc2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJlZGljYXRlRXhwcmVzc2lvbl9wcmVkaWNhdGVfSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9Ob3QuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9Ob3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZjI3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByZWRpY2F0ZUV4cHJlc3Npb25fcHJlZGljYXRlX05vdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9Pci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByZWRpY2F0ZUV4cHJlc3Npb25fcHJlZGljYXRlX09yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjdlZTUyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9Pci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9QcmVkaWNhdGVFeHByZXNzaW9uLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJlZGljYXRlRXhwcmVzc2lvbl9wcmVkaWNhdGVfUHJlZGljYXRlRXhwcmVzc2lvbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5YWQxYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJlZGljYXRlRXhwcmVzc2lvbl9wcmVkaWNhdGVfUHJlZGljYXRlRXhwcmVzc2lvbi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9QcmVkaWNhdGVSZWZlcmVuY2UuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9QcmVkaWNhdGVSZWZlcmVuY2UuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNWY5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByZWRpY2F0ZUV4cHJlc3Npb25fcHJlZGljYXRlX1ByZWRpY2F0ZVJlZmVyZW5jZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9UaW1lVGVzdC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByZWRpY2F0ZUV4cHJlc3Npb25fcHJlZGljYXRlX1RpbWVUZXN0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTgxNGRjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9UaW1lVGVzdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uX3ByZWRpY2F0ZV9UcnVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJlZGljYXRlRXhwcmVzc2lvbl9wcmVkaWNhdGVfVHJ1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjZjJjNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJlZGljYXRlRXhwcmVzc2lvbl9wcmVkaWNhdGVfVHJ1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTY2VuYXJpb19tb2RlbF9Nb2RlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNjZW5hcmlvX21vZGVsX01vZGVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGY0ODI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTY2VuYXJpb19tb2RlbF9Nb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTY2VuYXJpb19zY2VuYXJpb0RlY29yYXRvcnNfRGVjb3JhdG9yLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2NlbmFyaW9fc2NlbmFyaW9EZWNvcmF0b3JzX0RlY29yYXRvci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyMjM3NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2NlbmFyaW9fc2NlbmFyaW9EZWNvcmF0b3JzX0RlY29yYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTY2VuYXJpb19zY2VuYXJpb0RlY29yYXRvcnNfRWRnZURlY29yYXRvci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNjZW5hcmlvX3NjZW5hcmlvRGVjb3JhdG9yc19FZGdlRGVjb3JhdG9yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjQ1MGE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTY2VuYXJpb19zY2VuYXJpb0RlY29yYXRvcnNfRWRnZURlY29yYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTY2VuYXJpb19zY2VuYXJpb0RlY29yYXRvcnNfR3JhcGhEZWNvcmF0b3IuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTY2VuYXJpb19zY2VuYXJpb0RlY29yYXRvcnNfR3JhcGhEZWNvcmF0b3IuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNmE1ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNjZW5hcmlvX3NjZW5hcmlvRGVjb3JhdG9yc19HcmFwaERlY29yYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTY2VuYXJpb19zY2VuYXJpb0RlY29yYXRvcnNfTm9kZURlY29yYXRvci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNjZW5hcmlvX3NjZW5hcmlvRGVjb3JhdG9yc19Ob2RlRGVjb3JhdG9yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmU0MGVhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTY2VuYXJpb19zY2VuYXJpb0RlY29yYXRvcnNfTm9kZURlY29yYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTY2VuYXJpb19zZXF1ZW5jZXJfUmVhbFRpbWVTZXF1ZW5jZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTY2VuYXJpb19zZXF1ZW5jZXJfUmVhbFRpbWVTZXF1ZW5jZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDQ5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNjZW5hcmlvX3NlcXVlbmNlcl9SZWFsVGltZVNlcXVlbmNlci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTY2VuYXJpb19zZXF1ZW5jZXJfU2VxdWVudGlhbFNlcXVlbmNlci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNjZW5hcmlvX3NlcXVlbmNlcl9TZXF1ZW50aWFsU2VxdWVuY2VyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmNhZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTY2VuYXJpb19zZXF1ZW5jZXJfU2VxdWVudGlhbFNlcXVlbmNlci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTY2VuYXJpb19zb2x2ZXJfU29sdmVyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2NlbmFyaW9fc29sdmVyX1NvbHZlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkOTliYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2NlbmFyaW9fc29sdmVyX1NvbHZlci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXF1ZW5jZXJfY3VycmVudFRpbWVfU1RFTVRpbWUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXF1ZW5jZXJfY3VycmVudFRpbWVfU1RFTVRpbWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNDUzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcXVlbmNlcl9jdXJyZW50VGltZV9TVEVNVGltZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXF1ZW5jZXJfZW5kVGltZV9TVEVNVGltZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcXVlbmNlcl9lbmRUaW1lX1NURU1UaW1lLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjQ1M2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXF1ZW5jZXJfZW5kVGltZV9TVEVNVGltZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXF1ZW5jZXJfc3RhcnRUaW1lX1NURU1UaW1lLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVuY2VyX3N0YXJ0VGltZV9TVEVNVGltZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI0NTNmNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVuY2VyX3N0YXJ0VGltZV9TVEVNVGltZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTdHJpbmdWYWx1ZUxpc3RfdmFsdWVzX1N0cmluZ1ZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU3RyaW5nVmFsdWVMaXN0X3ZhbHVlc19TdHJpbmdWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJkZDY4ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU3RyaW5nVmFsdWVMaXN0X3ZhbHVlc19TdHJpbmdWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUaW1lVGVzdF90aW1lX1NURU1UaW1lLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGltZVRlc3RfdGltZV9TVEVNVGltZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxYmY2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGltZVRlc3RfdGltZV9TVEVNVGltZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX0Fic29sdXRlVGltZVRlc3QuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX0Fic29sdXRlVGltZVRlc3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NmZiOWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVVuYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRfQWJzb2x1dGVUaW1lVGVzdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX0FuZC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVVuYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRfQW5kLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmIzNDdlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX0FuZC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX0VsYXBzZWRUaW1lVGVzdC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVVuYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRfRWxhcHNlZFRpbWVUZXN0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjNhMjk1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX0VsYXBzZWRUaW1lVGVzdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX0ZhbHNlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVW5hcnlCb29sZWFuT3BlcmF0b3Jfb3BlcmFuZF9GYWxzZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkZWE0MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVW5hcnlCb29sZWFuT3BlcmF0b3Jfb3BlcmFuZF9GYWxzZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX0lkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24uZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX0lkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjAyNTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVVuYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRfSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX05vdC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVVuYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRfTm90LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2RlYTQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX05vdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX09yLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVW5hcnlCb29sZWFuT3BlcmF0b3Jfb3BlcmFuZF9Pci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2OTg0ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVW5hcnlCb29sZWFuT3BlcmF0b3Jfb3BlcmFuZF9Pci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX1ByZWRpY2F0ZUV4cHJlc3Npb24uZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX1ByZWRpY2F0ZUV4cHJlc3Npb24uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MDA5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVVuYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRfUHJlZGljYXRlRXhwcmVzc2lvbi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX1ByZWRpY2F0ZVJlZmVyZW5jZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVVuYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRfUHJlZGljYXRlUmVmZXJlbmNlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmU2ZjNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX1ByZWRpY2F0ZVJlZmVyZW5jZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX1RpbWVUZXN0LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVW5hcnlCb29sZWFuT3BlcmF0b3Jfb3BlcmFuZF9UaW1lVGVzdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5YWJiMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVW5hcnlCb29sZWFuT3BlcmF0b3Jfb3BlcmFuZF9UaW1lVGVzdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX1RydWUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVVbmFyeUJvb2xlYW5PcGVyYXRvcl9vcGVyYW5kX1RydWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZTk2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVVuYXJ5Qm9vbGVhbk9wZXJhdG9yX29wZXJhbmRfVHJ1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvLmN2c2lnbm9yZSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2Ly5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg1ZThiYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2Ly5jdnNpZ25vcmUKQEAgLTAsMCArMSBAQAorVGh1bWJzLmRiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9EZWNvcmF0b3IuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvRGVjb3JhdG9yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzM3NmFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvRGVjb3JhdG9yLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Eb3VibGVWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Eb3VibGVWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2MDY4NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0RvdWJsZVZhbHVlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9EdWJsaW5Db3JlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0R1YmxpbkNvcmUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYzUyNzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9EdWJsaW5Db3JlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9EeW5hbWljTGFiZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvRHluYW1pY0xhYmVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjllMzUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvRHluYW1pY0xhYmVsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9FZGdlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0VkZ2UuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZGRiOWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9FZGdlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9FeHBlcmltZW50LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0V4cGVyaW1lbnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZGUzYjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9FeHBlcmltZW50LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9HcmFwaC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9HcmFwaC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwYjM1NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0dyYXBoLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9HcmFwaE1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9HcmFwaE1vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwYjA2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0dyYXBoTW9kZWxGaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9MYWJlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9MYWJlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmZjNkOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0xhYmVsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9MaXN0LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0xpc3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYTExMGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9MaXN0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9NYXRyaXguZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTWF0cml4LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2NiZWIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTWF0cml4LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Nb2RlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Nb2RlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEwMTMzYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L01vZGVsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Nb2RlbE1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Nb2RlbE1vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2MTdlMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L01vZGVsTW9kZWxGaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Nb2RpZmllci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Nb2RpZmllci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzOGNkOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L01vZGlmaWVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Ob2RlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L05vZGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MTQ4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Ob2RlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9QcmVkaWNhdGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvUHJlZGljYXRlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmI3NThkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvUHJlZGljYXRlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9SZWFsVGltZVNlcXVlbmNlci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9SZWFsVGltZVNlcXVlbmNlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjNGZjYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1JlYWxUaW1lU2VxdWVuY2VyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TY2VuYXJpby5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TY2VuYXJpby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmZjY0MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1NjZW5hcmlvLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TY2VuYXJpb01vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TY2VuYXJpb01vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxOGVhYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1NjZW5hcmlvTW9kZWxGaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TZXF1ZW5jZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU2VxdWVuY2VyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTdlZDliCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU2VxdWVuY2VyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TdGF0aWNMYWJlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TdGF0aWNMYWJlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxNDJiNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1N0YXRpY0xhYmVsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TdHJpbmdWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TdHJpbmdWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwN2Y5ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1N0cmluZ1ZhbHVlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9UcmlnZ2VyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1RyaWdnZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMTYwMzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9UcmlnZ2VyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi8uY3ZzaWdub3JlIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODVlOGJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvLmN2c2lnbm9yZQpAQCAtMCwwICsxIEBACitUaHVtYnMuZGIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0Fic29sdXRlVGltZVRlc3QuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvQWJzb2x1dGVUaW1lVGVzdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkM2I3NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0Fic29sdXRlVGltZVRlc3QuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0FuZC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9BbmQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNTAwZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9BbmQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0NvbW1vbk1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9Db21tb25Nb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZWM3NWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9Db21tb25Nb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0RvdWJsZU1vZGlmaWVyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0RvdWJsZU1vZGlmaWVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGQzODFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvRG91YmxlTW9kaWZpZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0RvdWJsZVZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0RvdWJsZVZhbHVlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTI0ZjNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvRG91YmxlVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0RvdWJsZVZhbHVlTGlzdC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9Eb3VibGVWYWx1ZUxpc3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NzNhNTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9Eb3VibGVWYWx1ZUxpc3QuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0RvdWJsZVZhbHVlTWF0cml4LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0RvdWJsZVZhbHVlTWF0cml4LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTdkYzdkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvRG91YmxlVmFsdWVNYXRyaXguZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0VsYXBzZWRUaW1lVGVzdC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9FbGFwc2VkVGltZVRlc3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNTBmZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9FbGFwc2VkVGltZVRlc3QuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0ZhbHNlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0ZhbHNlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWFkNWRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvRmFsc2UuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0dyYXBoTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0dyYXBoTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDBiMDY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0lkZW50aWZpYWJsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9JZGVudGlmaWFibGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMmFhYWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9JZGVudGlmaWFibGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0lkZW50aWZpYWJsZUZpbHRlci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9JZGVudGlmaWFibGVGaWx0ZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOWJjNzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9JZGVudGlmaWFibGVGaWx0ZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0lkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24uZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM5ZWJiZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0lkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0ludGVnZXJNb2RpZmllci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9JbnRlZ2VyTW9kaWZpZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YjM1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9JbnRlZ2VyTW9kaWZpZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L0xvbmdNb2RpZmllci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9Mb25nTW9kaWZpZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExN2RjN2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9Mb25nTW9kaWZpZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L01vZGVsTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L01vZGVsTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDYxN2UyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvTW9kZWxNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L05PUE1vZGlmaWVyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L05PUE1vZGlmaWVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWRhYWIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvTk9QTW9kaWZpZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L05vZGVMYWJlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9Ob2RlTGFiZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMGFlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9Ob2RlTGFiZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L05vdC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9Ob3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YWQ1ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9Ob3QuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L09yLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L09yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjczYTUyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvT3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1ByZWRpY2F0ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9QcmVkaWNhdGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYWM0ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9QcmVkaWNhdGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1ByZWRpY2F0ZUV4cHJlc3Npb24uZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvUHJlZGljYXRlRXhwcmVzc2lvbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM4ZmI4ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1ByZWRpY2F0ZUV4cHJlc3Npb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1ByZWRpY2F0ZVJlZmVyZW5jZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9QcmVkaWNhdGVSZWZlcmVuY2UuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjRmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9QcmVkaWNhdGVSZWZlcmVuY2UuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1JhbmdlTW9kaWZpZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvUmFuZ2VNb2RpZmllci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3ZGM3ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1JhbmdlTW9kaWZpZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1NURU1UaW1lLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1NURU1UaW1lLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWRhYWIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvU1RFTVRpbWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1NURU1UaW1lTW9kaWZpZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvU1RFTVRpbWVNb2RpZmllci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyYWFhYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1NURU1UaW1lTW9kaWZpZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1NjZW5hcmlvTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1NjZW5hcmlvTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTE4ZWFhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvU2NlbmFyaW9Nb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1NlcXVlbmNlTW9kaWZpZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvU2VxdWVuY2VNb2RpZmllci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyMjQ2MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1NlcXVlbmNlTW9kaWZpZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1NvbHZlci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9Tb2x2ZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YjM1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9Tb2x2ZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1NxdWFyZUdyYXBoTGF0dGljZUdlbmVyYXRvci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9TcXVhcmVHcmFwaExhdHRpY2VHZW5lcmF0b3IuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOWViYmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9TcXVhcmVHcmFwaExhdHRpY2VHZW5lcmF0b3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1N0cmluZ1ZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1N0cmluZ1ZhbHVlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDE0ZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvU3RyaW5nVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1N0cmluZ1ZhbHVlTGlzdC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9TdHJpbmdWYWx1ZUxpc3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOGZiOGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9TdHJpbmdWYWx1ZUxpc3QuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1Rlc3QuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvVGVzdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3MzFmZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1Rlc3QuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1RyaWdnZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvVHJpZ2dlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1OGE2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1RyaWdnZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1RydWUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvVHJ1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3MzFmZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL29iajE2L1RydWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL3dpemJhbi9OZXdDb21tb24uZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL2ljb25zL2Z1bGwvd2l6YmFuL05ld0NvbW1vbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5NzA0YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL3dpemJhbi9OZXdDb21tb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL3dpemJhbi9OZXdHcmFwaC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC93aXpiYW4vTmV3R3JhcGguZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzODI5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC93aXpiYW4vTmV3R3JhcGguZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL3dpemJhbi9OZXdNb2RlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC93aXpiYW4vTmV3TW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZjdmODkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC93aXpiYW4vTmV3TW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9pY29ucy9mdWxsL3dpemJhbi9OZXdTY2VuYXJpby5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC93aXpiYW4vTmV3U2NlbmFyaW8uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NWYxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvaWNvbnMvZnVsbC93aXpiYW4vTmV3U2NlbmFyaW8uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb21tb24uZWNvcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29tbW9uLmVjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMzgyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29tbW9uLmVjb3JlCkBAIC0wLDAgKzEsNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImNvbW1vbiIKKyAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbiI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRHVibGluQ29yZSI+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9InBvcHVsYXRlIiBlVHlwZT0iIy8vRHVibGluQ29yZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0aXRsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZGVudGlmaWVyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0b3IiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmb3JtYXQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVibGlzaGVyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvdmVyYWdlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnRyaWJ1dG9yIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbGF0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJpZ2h0cyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb3VyY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3ViamVjdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imxhbmd1YWdlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJpYmxpb2dyYXBoaWNDaXRhdGlvbiIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpY2Vuc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVxdWlyZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BhdGlhbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWxpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJZGVudGlmaWFibGUiIGFic3RyYWN0PSJ0cnVlIj4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2FuZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idVJJIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vVVJJIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVVUkkiIGxvd2VyQm91bmQ9IjEiCisgICAgICAgIGVUeXBlPSIjLy9VUkkiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZHVibGluQ29yZSIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgZVR5cGU9IiMvL0R1YmxpbkNvcmUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZUdlbmVyaWNTdXBlclR5cGVzIGVDbGFzc2lmaWVyPSIjLy9Db21wYXJhYmxlIj4KKyAgICAgIDxlVHlwZUFyZ3VtZW50cyBlQ2xhc3NpZmllcj0iIy8vSWRlbnRpZmlhYmxlIi8+CisgICAgPC9lR2VuZXJpY1N1cGVyVHlwZXM+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbXBhcmFibGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuQ29tcGFyYWJsZSIKKyAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgorICAgIDxlVHlwZVBhcmFtZXRlcnMgbmFtZT0iVCIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVUkkiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSWRlbnRpZmlhYmxlRmlsdGVyIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG91YmxlVmFsdWVMaXN0Ij4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsdWVzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL0RvdWJsZVZhbHVlIiBjb250YWlubWVudD0idHJ1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZGVudGlmaWVyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb3VibGVWYWx1ZU1hdHJpeCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlTGlzdHMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vRG91YmxlVmFsdWVMaXN0IiBjb250YWlubWVudD0idHJ1ZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb3VibGVWYWx1ZSIgZVN1cGVyVHlwZXM9Im1vZGlmaWVyLmVjb3JlIy8vTW9kaWZpYWJsZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkZW50aWZpZXIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMC4wIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0cmluZ1ZhbHVlTGlzdCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlcyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9TdHJpbmdWYWx1ZSIgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RyaW5nVmFsdWUiIGVTdXBlclR5cGVzPSJtb2RpZmllci5lY29yZSMvL01vZGlmaWFibGUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciLz4KKyAgPC9lQ2xhc3NpZmllcnM+Cis8L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzdmMTg4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwKQEAgLTAsMCArMSw0OTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgorICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMiCisgICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjIgorICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZSIgbW9kZWxOYW1lPSJDb3JlIiBtb2RlbFBsdWdpbkNsYXNzPSIiIGVkaXRvclBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByZXNlbnRhdGlvbi5Db3JlRWRpdG9yUGx1Z2luIgorICAgIG5vbk5MU01hcmtlcnM9InRydWUiIHRlc3RzRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYyIgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLmVjb3JlIgorICAgIGNvbXBsaWFuY2VMZXZlbD0iNS4wIiBjb3B5cmlnaHRGaWVsZHM9ImZhbHNlIiB1c2VkR2VuUGFja2FnZXM9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUiPgorICA8Zm9yZWlnbk1vZGVsPmNvbW1vbi5lY29yZTwvZm9yZWlnbk1vZGVsPgorICA8Zm9yZWlnbk1vZGVsPmV4cGVyaW1lbnQuZWNvcmU8L2ZvcmVpZ25Nb2RlbD4KKyAgPGZvcmVpZ25Nb2RlbD5ncmFwaC5lY29yZTwvZm9yZWlnbk1vZGVsPgorICA8Zm9yZWlnbk1vZGVsPm1vZGVsLmVjb3JlPC9mb3JlaWduTW9kZWw+CisgIDxmb3JlaWduTW9kZWw+bW9kaWZpZXIuZWNvcmU8L2ZvcmVpZ25Nb2RlbD4KKyAgPGZvcmVpZ25Nb2RlbD5wcmVkaWNhdGUuZWNvcmU8L2ZvcmVpZ25Nb2RlbD4KKyAgPGZvcmVpZ25Nb2RlbD5zY2VuYXJpby5lY29yZTwvZm9yZWlnbk1vZGVsPgorICA8Zm9yZWlnbk1vZGVsPnNlcXVlbmNlci5lY29yZTwvZm9yZWlnbk1vZGVsPgorICA8Zm9yZWlnbk1vZGVsPnRyaWdnZXIuZWNvcmU8L2ZvcmVpZ25Nb2RlbD4KKyAgPGZvcmVpZ25Nb2RlbD5zb2x2ZXIuZWNvcmU8L2ZvcmVpZ25Nb2RlbD4KKyAgPGZvcmVpZ25Nb2RlbD5ncmFwaGdlbmVyYXRvci5lY29yZTwvZm9yZWlnbk1vZGVsPgorICA8Z2VuUGFja2FnZXMgcHJlZml4PSJDb21tb24iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCisgICAgICBnZW5lcmF0ZUV4YW1wbGVDbGFzcz0iZmFsc2UiIG11bHRpcGxlRWRpdG9yUGFnZXM9ImZhbHNlIiBnZW5lcmF0ZU1vZGVsV2l6YXJkPSJmYWxzZSIKKyAgICAgIGNvbnRlbnRUeXBlSWRlbnRpZmllcj0iIiBlY29yZVBhY2thZ2U9ImNvbW1vbi5lY29yZSMvIj4KKyAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9ImNvbW1vbi5lY29yZSMvL1VSSSIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vRHVibGluQ29yZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRHVibGluQ29yZS90aXRsZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRHVibGluQ29yZS9pZGVudGlmaWVyIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRHVibGluQ29yZS9kZXNjcmlwdGlvbiIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0R1YmxpbkNvcmUvY3JlYXRvciIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0R1YmxpbkNvcmUvZGF0ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRHVibGluQ29yZS9mb3JtYXQiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9EdWJsaW5Db3JlL3B1Ymxpc2hlciIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0R1YmxpbkNvcmUvY292ZXJhZ2UiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9EdWJsaW5Db3JlL2NvbnRyaWJ1dG9yIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRHVibGluQ29yZS9yZWxhdGlvbiIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0R1YmxpbkNvcmUvcmlnaHRzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRHVibGluQ29yZS9zb3VyY2UiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9EdWJsaW5Db3JlL3N1YmplY3QiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0R1YmxpbkNvcmUvdHlwZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0R1YmxpbkNvcmUvbGFuZ3VhZ2UiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9EdWJsaW5Db3JlL2JpYmxpb2dyYXBoaWNDaXRhdGlvbiIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0R1YmxpbkNvcmUvY3JlYXRlZCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0R1YmxpbkNvcmUvbGljZW5zZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0R1YmxpbkNvcmUvcmVxdWlyZWQiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9EdWJsaW5Db3JlL3NwYXRpYWwiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9EdWJsaW5Db3JlL3ZhbGlkIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iY29tbW9uLmVjb3JlIy8vRHVibGluQ29yZS9wb3B1bGF0ZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9JZGVudGlmaWFibGUiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0lkZW50aWZpYWJsZS91UkkiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0lkZW50aWZpYWJsZS90eXBlVVJJIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlDYXRlZ29yeT0iIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vSWRlbnRpZmlhYmxlL2R1YmxpbkNvcmUiLz4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJjb21tb24uZWNvcmUjLy9JZGVudGlmaWFibGUvc2FuZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL0NvbXBhcmFibGUiPgorICAgICAgPGdlblR5cGVQYXJhbWV0ZXJzIGVjb3JlVHlwZVBhcmFtZXRlcj0iY29tbW9uLmVjb3JlIy8vQ29tcGFyYWJsZS9UIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL0lkZW50aWZpYWJsZUZpbHRlciIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL0RvdWJsZVZhbHVlTGlzdCI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL0RvdWJsZVZhbHVlTGlzdC92YWx1ZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9Eb3VibGVWYWx1ZUxpc3QvaWRlbnRpZmllciIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9Eb3VibGVWYWx1ZU1hdHJpeCI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL0RvdWJsZVZhbHVlTWF0cml4L3ZhbHVlTGlzdHMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vRG91YmxlVmFsdWUiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0RvdWJsZVZhbHVlL2lkZW50aWZpZXIiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9Eb3VibGVWYWx1ZS92YWx1ZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9TdHJpbmdWYWx1ZUxpc3QiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9TdHJpbmdWYWx1ZUxpc3QvdmFsdWVzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL1N0cmluZ1ZhbHVlIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9TdHJpbmdWYWx1ZS92YWx1ZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgPC9nZW5QYWNrYWdlcz4KKyAgPGdlblBhY2thZ2VzIHByZWZpeD0iRXhwZXJpbWVudCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKKyAgICAgIGdlbmVyYXRlRXhhbXBsZUNsYXNzPSJmYWxzZSIgbXVsdGlwbGVFZGl0b3JQYWdlcz0iZmFsc2UiIGdlbmVyYXRlTW9kZWxXaXphcmQ9ImZhbHNlIgorICAgICAgZWNvcmVQYWNrYWdlPSJleHBlcmltZW50LmVjb3JlIy8iPgorICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iZXhwZXJpbWVudC5lY29yZSMvL1VSSSIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZXhwZXJpbWVudC5lY29yZSMvL0V4cGVyaW1lbnQiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIgorICAgICAgICAgIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBleHBlcmltZW50LmVjb3JlIy8vRXhwZXJpbWVudC9tb2RpZmllcnMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGV4cGVyaW1lbnQuZWNvcmUjLy9FeHBlcmltZW50L2NvbXBsZXRlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5Q2F0ZWdvcnk9IiIKKyAgICAgICAgICBwcm9wZXJ0eURlc2NyaXB0aW9uPSIiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBleHBlcmltZW50LmVjb3JlIy8vRXhwZXJpbWVudC9zY2VuYXJpbyIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImV4cGVyaW1lbnQuZWNvcmUjLy9FeHBlcmltZW50L3VwZGF0ZVNjZW5hcmlvIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iZXhwZXJpbWVudC5lY29yZSMvL0V4cGVyaW1lbnQvaW5pdFNjZW5hcmlvIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICA8L2dlblBhY2thZ2VzPgorICA8Z2VuUGFja2FnZXMgcHJlZml4PSJHcmFwaCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKKyAgICAgIGdlbmVyYXRlRXhhbXBsZUNsYXNzPSJmYWxzZSIgbXVsdGlwbGVFZGl0b3JQYWdlcz0iZmFsc2UiIGdlbmVyYXRlTW9kZWxXaXphcmQ9ImZhbHNlIgorICAgICAgZWNvcmVQYWNrYWdlPSJncmFwaC5lY29yZSMvIj4KKyAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9ImdyYXBoLmVjb3JlIy8vVVJJIi8+CisgICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJncmFwaC5lY29yZSMvL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZ3JhcGguZWNvcmUjLy9EeW5hbWljTGFiZWwiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGdyYXBoLmVjb3JlIy8vRHluYW1pY0xhYmVsL25leHRWYWx1ZVZhbGlkIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlEZXNjcmlwdGlvbj0iIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZ3JhcGguZWNvcmUjLy9EeW5hbWljTGFiZWwvbmV4dFZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlDYXRlZ29yeT0iIgorICAgICAgICAgIHByb3BlcnR5RGVzY3JpcHRpb249IiIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGdyYXBoLmVjb3JlIy8vRHluYW1pY0xhYmVsL2RlY29yYXRvciIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImdyYXBoLmVjb3JlIy8vRHluYW1pY0xhYmVsL3Jlc2V0Ii8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iZ3JhcGguZWNvcmUjLy9EeW5hbWljTGFiZWwvc3dpdGNoVG9OZXh0VmFsdWUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJncmFwaC5lY29yZSMvL0R5bmFtaWNOb2RlTGFiZWwiLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImdyYXBoLmVjb3JlIy8vRWRnZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZ3JhcGguZWNvcmUjLy9FZGdlL2EiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGdyYXBoLmVjb3JlIy8vRWRnZS9ub2RlQVVSSSIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGdyYXBoLmVjb3JlIy8vRWRnZS9iIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBncmFwaC5lY29yZSMvL0VkZ2Uvbm9kZUJVUkkiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZ3JhcGguZWNvcmUjLy9FZGdlL2xhYmVsIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZ3JhcGguZWNvcmUjLy9FZGdlL2RpcmVjdGVkIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iZ3JhcGguZWNvcmUjLy9FZGdlL2dldE90aGVyTm9kZSI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJncmFwaC5lY29yZSMvL0VkZ2UvZ2V0T3RoZXJOb2RlL25vZGUiLz4KKyAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJncmFwaC5lY29yZSMvL0VkZ2UvaXNEaXJlY3RlZEF0Ij4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImdyYXBoLmVjb3JlIy8vRWRnZS9pc0RpcmVjdGVkQXQvbm9kZSIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBwcm92aWRlcj0iU3RhdGVmdWwiIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZ3JhcGguZWNvcmUjLy9HcmFwaCI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGdyYXBoLmVjb3JlIy8vR3JhcGgvZWRnZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZ3JhcGguZWNvcmUjLy9HcmFwaC9ub2RlcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBncmFwaC5lY29yZSMvL0dyYXBoL2dyYXBoTGFiZWxzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGdyYXBoLmVjb3JlIy8vR3JhcGgvbm9kZUxhYmVscyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiCisgICAgICAgICAgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGdyYXBoLmVjb3JlIy8vR3JhcGgvZHluYW1pY0xhYmVscyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBncmFwaC5lY29yZSMvL0dyYXBoL251bUVkZ2VzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGdyYXBoLmVjb3JlIy8vR3JhcGgvbnVtTm9kZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZ3JhcGguZWNvcmUjLy9HcmFwaC9udW1HcmFwaExhYmVscyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBncmFwaC5lY29yZSMvL0dyYXBoL251bU5vZGVMYWJlbHMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZ3JhcGguZWNvcmUjLy9HcmFwaC9udW1EeW5hbWljTGFiZWxzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBncmFwaC5lY29yZSMvL0dyYXBoL3VucmVzb2x2ZWRJZGVudGlmaWFibGVzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBncmFwaC5lY29yZSMvL0dyYXBoL2RlY29yYXRvcnMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIKKyAgICAgICAgICBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZ3JhcGguZWNvcmUjLy9HcmFwaC90aW1lIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iZ3JhcGguZWNvcmUjLy9HcmFwaC9nZXROb2RlTGFiZWxzQnlUeXBlVVJJIj4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImdyYXBoLmVjb3JlIy8vR3JhcGgvZ2V0Tm9kZUxhYmVsc0J5VHlwZVVSSS90eXBlVVJJIi8+CisgICAgICA8L2dlbk9wZXJhdGlvbnM+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iZ3JhcGguZWNvcmUjLy9HcmFwaC9hZGRHcmFwaCI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJncmFwaC5lY29yZSMvL0dyYXBoL2FkZEdyYXBoL2dyYXBoIi8+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJncmFwaC5lY29yZSMvL0dyYXBoL2FkZEdyYXBoL2ZpbHRlciIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImdyYXBoLmVjb3JlIy8vR3JhcGgvcHV0RWRnZSI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJncmFwaC5lY29yZSMvL0dyYXBoL3B1dEVkZ2UvZWRnZSIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImdyYXBoLmVjb3JlIy8vR3JhcGgvZ2V0RWRnZSI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJncmFwaC5lY29yZSMvL0dyYXBoL2dldEVkZ2UvdXJpIi8+CisgICAgICA8L2dlbk9wZXJhdGlvbnM+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iZ3JhcGguZWNvcmUjLy9HcmFwaC9wdXROb2RlIj4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImdyYXBoLmVjb3JlIy8vR3JhcGgvcHV0Tm9kZS9ub2RlIi8+CisgICAgICA8L2dlbk9wZXJhdGlvbnM+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iZ3JhcGguZWNvcmUjLy9HcmFwaC9nZXROb2RlIj4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImdyYXBoLmVjb3JlIy8vR3JhcGgvZ2V0Tm9kZS91cmkiLz4KKyAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJncmFwaC5lY29yZSMvL0dyYXBoL3B1dE5vZGVMYWJlbCI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJncmFwaC5lY29yZSMvL0dyYXBoL3B1dE5vZGVMYWJlbC9sYWJlbCIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImdyYXBoLmVjb3JlIy8vR3JhcGgvZ2V0Tm9kZUxhYmVsIj4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImdyYXBoLmVjb3JlIy8vR3JhcGgvZ2V0Tm9kZUxhYmVsL3VyaSIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImdyYXBoLmVjb3JlIy8vR3JhcGgvcHV0R3JhcGhMYWJlbCI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJncmFwaC5lY29yZSMvL0dyYXBoL3B1dEdyYXBoTGFiZWwvbGFiZWwiLz4KKyAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJncmFwaC5lY29yZSMvL0dyYXBoL2dldEdyYXBoTGFiZWwiPgorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iZ3JhcGguZWNvcmUjLy9HcmFwaC9nZXRHcmFwaExhYmVsL3VyaSIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImdyYXBoLmVjb3JlIy8vR3JhcGgvYWRkRHluYW1pY0xhYmVsIj4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImdyYXBoLmVjb3JlIy8vR3JhcGgvYWRkRHluYW1pY0xhYmVsL2R5bmFtaWNsYWJlbCIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImdyYXBoLmVjb3JlIy8vR3JhcGgvc3dpdGNoVG9OZXh0VmFsdWUiPgorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iZ3JhcGguZWNvcmUjLy9HcmFwaC9zd2l0Y2hUb05leHRWYWx1ZS9jdXJyZW50VGltZSIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImdyYXBoLmVjb3JlIy8vTGFiZWwiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZ3JhcGguZWNvcmUjLy9MYWJlbC91UklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBncmFwaC5lY29yZSMvL0xhYmVsL2N1cnJlbnRWYWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBncmFwaC5lY29yZSMvL0xhYmVsL2lkZW50aWZpYWJsZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImdyYXBoLmVjb3JlIy8vTGFiZWxWYWx1ZSI+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iZ3JhcGguZWNvcmUjLy9MYWJlbFZhbHVlL3Jlc2V0Ii8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZ3JhcGguZWNvcmUjLy9Ob2RlIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBncmFwaC5lY29yZSMvL05vZGUvZWRnZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBncmFwaC5lY29yZSMvL05vZGUvbGFiZWxzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImdyYXBoLmVjb3JlIy8vTm9kZUxhYmVsIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBncmFwaC5lY29yZSMvL05vZGVMYWJlbC9ub2RlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZ3JhcGguZWNvcmUjLy9TdGF0aWNOb2RlTGFiZWwiLz4KKyAgICA8Z2VuQ2xhc3NlcyBwcm92aWRlcj0iTm9uZSIgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJncmFwaC5lY29yZSMvL1VucmVzb2x2ZWRJZGVudGlmaWFibGUiPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGdyYXBoLmVjb3JlIy8vVW5yZXNvbHZlZElkZW50aWZpYWJsZS9zY2VuYXJpbyIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGdyYXBoLmVjb3JlIy8vVW5yZXNvbHZlZElkZW50aWZpYWJsZS9tb2RlbCIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGdyYXBoLmVjb3JlIy8vVW5yZXNvbHZlZElkZW50aWZpYWJsZS9ncmFwaCIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGdyYXBoLmVjb3JlIy8vVW5yZXNvbHZlZElkZW50aWZpYWJsZS9pZGVudGlmaWFibGUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBncmFwaC5lY29yZSMvL1VucmVzb2x2ZWRJZGVudGlmaWFibGUvdW5yZXNvbHZlZFVSSSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGdyYXBoLmVjb3JlIy8vVW5yZXNvbHZlZElkZW50aWZpYWJsZS9maWVsZE5hbWUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgcHJvdmlkZXI9Ik5vbmUiIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZ3JhcGguZWNvcmUjLy9VUklUb0lkZW50aWZpYWJsZU1hcEVudHJ5Ij4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBncmFwaC5lY29yZSMvL1VSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnkva2V5Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZ3JhcGguZWNvcmUjLy9VUklUb0lkZW50aWZpYWJsZU1hcEVudHJ5L3ZhbHVlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIHByb3ZpZGVyPSJOb25lIiBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImdyYXBoLmVjb3JlIy8vU2FuaXR5Q2hlY2tlciIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZ3JhcGguZWNvcmUjLy9EeW5hbWljRWRnZUxhYmVsIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJncmFwaC5lY29yZSMvL0VkZ2VMYWJlbCI+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZ3JhcGguZWNvcmUjLy9FZGdlTGFiZWwvZWRnZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImdyYXBoLmVjb3JlIy8vU3RhdGljRWRnZUxhYmVsIi8+CisgICAgPGdlbkNsYXNzZXMgcHJvdmlkZXI9Ik5vbmUiIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZ3JhcGguZWNvcmUjLy9VUklUb0VkZ2VNYXBFbnRyeSI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGdyYXBoLmVjb3JlIy8vVVJJVG9FZGdlTWFwRW50cnkva2V5Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIKKyAgICAgICAgICBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZ3JhcGguZWNvcmUjLy9VUklUb0VkZ2VNYXBFbnRyeS92YWx1ZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBwcm92aWRlcj0iTm9uZSIgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJncmFwaC5lY29yZSMvL1VSSVRvTm9kZU1hcEVudHJ5Ij4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZ3JhcGguZWNvcmUjLy9VUklUb05vZGVNYXBFbnRyeS9rZXkiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBncmFwaC5lY29yZSMvL1VSSVRvTm9kZU1hcEVudHJ5L3ZhbHVlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIHByb3ZpZGVyPSJOb25lIiBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImdyYXBoLmVjb3JlIy8vVVJJVG9MYWJlbE1hcEVudHJ5Ij4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZ3JhcGguZWNvcmUjLy9VUklUb0xhYmVsTWFwRW50cnkva2V5Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIKKyAgICAgICAgICBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZ3JhcGguZWNvcmUjLy9VUklUb0xhYmVsTWFwRW50cnkvdmFsdWUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgcHJvdmlkZXI9Ik5vbmUiIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZ3JhcGguZWNvcmUjLy9VUklUb05vZGVMYWJlbE1hcEVudHJ5Ij4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZ3JhcGguZWNvcmUjLy9VUklUb05vZGVMYWJlbE1hcEVudHJ5L2tleSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiCisgICAgICAgICAgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGdyYXBoLmVjb3JlIy8vVVJJVG9Ob2RlTGFiZWxNYXBFbnRyeS92YWx1ZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImdyYXBoLmVjb3JlIy8vU3RhdGljTGFiZWwiLz4KKyAgPC9nZW5QYWNrYWdlcz4KKyAgPGdlblBhY2thZ2VzIHByZWZpeD0iTW9kZWwiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCisgICAgICBnZW5lcmF0ZUV4YW1wbGVDbGFzcz0iZmFsc2UiIG11bHRpcGxlRWRpdG9yUGFnZXM9ImZhbHNlIiBnZW5lcmF0ZU1vZGVsV2l6YXJkPSJmYWxzZSIKKyAgICAgIGVjb3JlUGFja2FnZT0ibW9kZWwuZWNvcmUjLyI+CisgICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtb2RlbC5lY29yZSMvL1VSSSIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ibW9kZWwuZWNvcmUjLy9EZWNvcmF0b3IiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIgorICAgICAgICAgIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtb2RlbC5lY29yZSMvL0RlY29yYXRvci9sYWJlbHNUb1VwZGF0ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtb2RlbC5lY29yZSMvL0RlY29yYXRvci9ncmFwaCIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2RlbC5lY29yZSMvL0RlY29yYXRvci9lbmFibGVkIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZGVsLmVjb3JlIy8vRGVjb3JhdG9yL2dyYXBoRGVjb3JhdGVkIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZGVsLmVjb3JlIy8vRGVjb3JhdG9yL3Byb2dyZXNzIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibW9kZWwuZWNvcmUjLy9EZWNvcmF0b3IvZGVjb3JhdGVHcmFwaCI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJtb2RlbC5lY29yZSMvL0RlY29yYXRvci9kZWNvcmF0ZUdyYXBoL3RpbWUiLz4KKyAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJtb2RlbC5lY29yZSMvL0RlY29yYXRvci91cGRhdGVMYWJlbHMiPgorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ibW9kZWwuZWNvcmUjLy9EZWNvcmF0b3IvdXBkYXRlTGFiZWxzL3RpbWUiLz4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9Im1vZGVsLmVjb3JlIy8vRGVjb3JhdG9yL3VwZGF0ZUxhYmVscy90aW1lclBlcmlvZCIvPgorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ibW9kZWwuZWNvcmUjLy9EZWNvcmF0b3IvdXBkYXRlTGFiZWxzL2N5Y2xlIi8+CisgICAgICA8L2dlbk9wZXJhdGlvbnM+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibW9kZWwuZWNvcmUjLy9EZWNvcmF0b3IvcmVzZXRMYWJlbHMiLz4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJtb2RlbC5lY29yZSMvL0RlY29yYXRvci9nZXRMYWJlbHNUb1VwZGF0ZSI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJtb2RlbC5lY29yZSMvL0RlY29yYXRvci9nZXRMYWJlbHNUb1VwZGF0ZS9wYXJ0aXRpb24iLz4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9Im1vZGVsLmVjb3JlIy8vRGVjb3JhdG9yL2dldExhYmVsc1RvVXBkYXRlL21heCIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im1vZGVsLmVjb3JlIy8vRGVjb3JhdG9yL3ByZXBhcmUiPgorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ibW9kZWwuZWNvcmUjLy9EZWNvcmF0b3IvcHJlcGFyZS9tb2RlbCIvPgorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ibW9kZWwuZWNvcmUjLy9EZWNvcmF0b3IvcHJlcGFyZS90aW1lIi8+CisgICAgICA8L2dlbk9wZXJhdGlvbnM+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ibW9kZWwuZWNvcmUjLy9FZGdlRGVjb3JhdG9yIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJtb2RlbC5lY29yZSMvL0dyYXBoRGVjb3JhdG9yIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJtb2RlbC5lY29yZSMvL01vZGVsIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kZWwuZWNvcmUjLy9Nb2RlbC9tb2RlbHMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kZWwuZWNvcmUjLy9Nb2RlbC9ncmFwaHMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1vZGVsLmVjb3JlIy8vTW9kZWwvZ3JhcGhEZWNvcmF0b3JzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtb2RlbC5lY29yZSMvL01vZGVsL25vZGVEZWNvcmF0b3JzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtb2RlbC5lY29yZSMvL01vZGVsL2VkZ2VEZWNvcmF0b3JzIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibW9kZWwuZWNvcmUjLy9Nb2RlbC9nZXRDYW5vbmljYWxHcmFwaCI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJtb2RlbC5lY29yZSMvL01vZGVsL2dldENhbm9uaWNhbEdyYXBoL3VyaSIvPgorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ibW9kZWwuZWNvcmUjLy9Nb2RlbC9nZXRDYW5vbmljYWxHcmFwaC9maWx0ZXIiLz4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9Im1vZGVsLmVjb3JlIy8vTW9kZWwvZ2V0Q2Fub25pY2FsR3JhcGgvdGltZSIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im1vZGVsLmVjb3JlIy8vTW9kZWwvcHJlcGFyZSI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJtb2RlbC5lY29yZSMvL01vZGVsL3ByZXBhcmUvdGltZSIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im1vZGVsLmVjb3JlIy8vTm9kZURlY29yYXRvciIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1vZGVsLmVjb3JlIy8vU1RFTVRpbWUiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZGVsLmVjb3JlIy8vU1RFTVRpbWUvdGltZSIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im1vZGVsLmVjb3JlIy8vU1RFTVRpbWUvYWRkSW5jcmVtZW50Ij4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9Im1vZGVsLmVjb3JlIy8vU1RFTVRpbWUvYWRkSW5jcmVtZW50L3RpbWVJbmNyZW1lbnQiLz4KKyAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJtb2RlbC5lY29yZSMvL1NURU1UaW1lL2hhc2hDb2RlIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibW9kZWwuZWNvcmUjLy9TVEVNVGltZS9lcXVhbHMiPgorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ibW9kZWwuZWNvcmUjLy9TVEVNVGltZS9lcXVhbHMvb2JqIi8+CisgICAgICA8L2dlbk9wZXJhdGlvbnM+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ibW9kZWwuZWNvcmUjLy9Db21wYXJhYmxlIj4KKyAgICAgIDxnZW5UeXBlUGFyYW1ldGVycyBlY29yZVR5cGVQYXJhbWV0ZXI9Im1vZGVsLmVjb3JlIy8vQ29tcGFyYWJsZS9UIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICA8L2dlblBhY2thZ2VzPgorICA8Z2VuUGFja2FnZXMgcHJlZml4PSJNb2RpZmllciIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKKyAgICAgIGdlbmVyYXRlRXhhbXBsZUNsYXNzPSJmYWxzZSIgbXVsdGlwbGVFZGl0b3JQYWdlcz0iZmFsc2UiIGdlbmVyYXRlTW9kZWxXaXphcmQ9ImZhbHNlIgorICAgICAgZWNvcmVQYWNrYWdlPSJtb2RpZmllci5lY29yZSMvIj4KKyAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1vZGlmaWVyLmVjb3JlIy8vVVJJIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJtb2RpZmllci5lY29yZSMvL0RvdWJsZU5PUE1vZGlmaWVyIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJtb2RpZmllci5lY29yZSMvL0RvdWJsZVJhbmdlTW9kaWZpZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZGlmaWVyLmVjb3JlIy8vRG91YmxlUmFuZ2VNb2RpZmllci9zdGFydFZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kaWZpZXIuZWNvcmUjLy9Eb3VibGVSYW5nZU1vZGlmaWVyL2VuZFZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kaWZpZXIuZWNvcmUjLy9Eb3VibGVSYW5nZU1vZGlmaWVyL2luY3JlbWVudCIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2RpZmllci5lY29yZSMvL0RvdWJsZVJhbmdlTW9kaWZpZXIvbmV4dFZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZGlmaWVyLmVjb3JlIy8vRG91YmxlUmFuZ2VNb2RpZmllci9vcmlnaW5hbFZhbHVlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ibW9kaWZpZXIuZWNvcmUjLy9Eb3VibGVTZXF1ZW5jZU1vZGlmaWVyIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2RpZmllci5lY29yZSMvL0RvdWJsZVNlcXVlbmNlTW9kaWZpZXIvc2VxdWVuY2UiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJtb2RpZmllci5lY29yZSMvL0ZlYXR1cmVNb2RpZmllciI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIKKyAgICAgICAgICBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kaWZpZXIuZWNvcmUjLy9GZWF0dXJlTW9kaWZpZXIvdGFyZ2V0Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIKKyAgICAgICAgICBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kaWZpZXIuZWNvcmUjLy9GZWF0dXJlTW9kaWZpZXIvZVN0cnVjdHVyYWxGZWF0dXJlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2RpZmllci5lY29yZSMvL0ZlYXR1cmVNb2RpZmllci9mZWF0dXJlTmFtZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2RpZmllci5lY29yZSMvL0ZlYXR1cmVNb2RpZmllci9mZWF0dXJlSWQiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kaWZpZXIuZWNvcmUjLy9GZWF0dXJlTW9kaWZpZXIvY3VycmVudFZhbHVlVGV4dCIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kaWZpZXIuZWNvcmUjLy9GZWF0dXJlTW9kaWZpZXIvY29tcGxldGUiLz4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJtb2RpZmllci5lY29yZSMvL0ZlYXR1cmVNb2RpZmllci91cGRhdGVGZWF0dXJlIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibW9kaWZpZXIuZWNvcmUjLy9GZWF0dXJlTW9kaWZpZXIvcmVzZXQiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJtb2RpZmllci5lY29yZSMvL0ludGVnZXJOT1BNb2RpZmllciIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ibW9kaWZpZXIuZWNvcmUjLy9JbnRlZ2VyUmFuZ2VNb2RpZmllciI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kaWZpZXIuZWNvcmUjLy9JbnRlZ2VyUmFuZ2VNb2RpZmllci9zdGFydFZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kaWZpZXIuZWNvcmUjLy9JbnRlZ2VyUmFuZ2VNb2RpZmllci9lbmRWYWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZGlmaWVyLmVjb3JlIy8vSW50ZWdlclJhbmdlTW9kaWZpZXIvaW5jcmVtZW50Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZGlmaWVyLmVjb3JlIy8vSW50ZWdlclJhbmdlTW9kaWZpZXIvbmV4dFZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZGlmaWVyLmVjb3JlIy8vSW50ZWdlclJhbmdlTW9kaWZpZXIvb3JpZ2luYWxWYWx1ZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im1vZGlmaWVyLmVjb3JlIy8vSW50ZWdlclNlcXVlbmNlTW9kaWZpZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZGlmaWVyLmVjb3JlIy8vSW50ZWdlclNlcXVlbmNlTW9kaWZpZXIvc2VxdWVuY2UiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJtb2RpZmllci5lY29yZSMvL0xvbmdOT1BNb2RpZmllciIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ibW9kaWZpZXIuZWNvcmUjLy9Mb25nUmFuZ2VNb2RpZmllciI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kaWZpZXIuZWNvcmUjLy9Mb25nUmFuZ2VNb2RpZmllci9zdGFydFZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kaWZpZXIuZWNvcmUjLy9Mb25nUmFuZ2VNb2RpZmllci9lbmRWYWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZGlmaWVyLmVjb3JlIy8vTG9uZ1JhbmdlTW9kaWZpZXIvaW5jcmVtZW50Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZGlmaWVyLmVjb3JlIy8vTG9uZ1JhbmdlTW9kaWZpZXIvbmV4dFZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZGlmaWVyLmVjb3JlIy8vTG9uZ1JhbmdlTW9kaWZpZXIvb3JpZ2luYWxWYWx1ZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im1vZGlmaWVyLmVjb3JlIy8vTG9uZ1NlcXVlbmNlTW9kaWZpZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZGlmaWVyLmVjb3JlIy8vTG9uZ1NlcXVlbmNlTW9kaWZpZXIvc2VxdWVuY2UiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJtb2RpZmllci5lY29yZSMvL01vZGlmaWVyIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlEZXNjcmlwdGlvbj0iIgorICAgICAgICAgIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2RpZmllci5lY29yZSMvL01vZGlmaWVyL3RhcmdldFVSSSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kaWZpZXIuZWNvcmUjLy9Nb2RpZmllci9mZWF0dXJlTW9kaWZpZXJzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2RpZmllci5lY29yZSMvL01vZGlmaWVyL2NvbXBsZXRlIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibW9kaWZpZXIuZWNvcmUjLy9Nb2RpZmllci91cGRhdGVTY2VuYXJpbyI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJtb2RpZmllci5lY29yZSMvL01vZGlmaWVyL3VwZGF0ZVNjZW5hcmlvL2Jhc2VTY2VuYXJpbyIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im1vZGlmaWVyLmVjb3JlIy8vTW9kaWZpZXIvcmVzZXQiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibW9kaWZpZXIuZWNvcmUjLy9OT1BNb2RpZmllciIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1vZGlmaWVyLmVjb3JlIy8vUmFuZ2VNb2RpZmllciIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ibW9kaWZpZXIuZWNvcmUjLy9TVEVNVGltZU5PUE1vZGlmaWVyIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJtb2RpZmllci5lY29yZSMvL1NURU1UaW1lUmFuZ2VNb2RpZmllciI+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kaWZpZXIuZWNvcmUjLy9TVEVNVGltZVJhbmdlTW9kaWZpZXIvc3RhcnRWYWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1vZGlmaWVyLmVjb3JlIy8vU1RFTVRpbWVSYW5nZU1vZGlmaWVyL2VuZFZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kaWZpZXIuZWNvcmUjLy9TVEVNVGltZVJhbmdlTW9kaWZpZXIvaW5jcmVtZW50Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kaWZpZXIuZWNvcmUjLy9TVEVNVGltZVJhbmdlTW9kaWZpZXIvbmV4dFZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIKKyAgICAgICAgICBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kaWZpZXIuZWNvcmUjLy9TVEVNVGltZVJhbmdlTW9kaWZpZXIvb3JpZ2luYWxWYWx1ZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im1vZGlmaWVyLmVjb3JlIy8vU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtb2RpZmllci5lY29yZSMvL1NURU1UaW1lU2VxdWVuY2VNb2RpZmllci9zZXF1ZW5jZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtb2RpZmllci5lY29yZSMvL1NlcXVlbmNlTW9kaWZpZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kaWZpZXIuZWNvcmUjLy9TZXF1ZW5jZU1vZGlmaWVyL3NlcXVlbmNlU2l6ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kaWZpZXIuZWNvcmUjLy9TZXF1ZW5jZU1vZGlmaWVyL2N1cnJlbnRTZXF1ZW5jZUluZGV4Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2RpZmllci5lY29yZSMvL1NlcXVlbmNlTW9kaWZpZXIvbmV4dFZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kaWZpZXIuZWNvcmUjLy9TZXF1ZW5jZU1vZGlmaWVyL29yaWdpbmFsVmFsdWUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJtb2RpZmllci5lY29yZSMvL1N0cmluZ05PUE1vZGlmaWVyIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJtb2RpZmllci5lY29yZSMvL1N0cmluZ1NlcXVlbmNlTW9kaWZpZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZGlmaWVyLmVjb3JlIy8vU3RyaW5nU2VxdWVuY2VNb2RpZmllci9zZXF1ZW5jZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBwcm92aWRlcj0iTm9uZSIgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJtb2RpZmllci5lY29yZSMvL01vZGlmaWFibGUiLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im1vZGlmaWVyLmVjb3JlIy8vU2luZ2xlVmFsdWVNb2RpZmllciIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1vZGlmaWVyLmVjb3JlIy8vRG91YmxlTW9kaWZpZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZGlmaWVyLmVjb3JlIy8vRG91YmxlTW9kaWZpZXIvdmFsdWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2RpZmllci5lY29yZSMvL0RvdWJsZU1vZGlmaWVyL29yaWdpbmFsVmFsdWUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibW9kaWZpZXIuZWNvcmUjLy9JbnRlZ2VyTW9kaWZpZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZGlmaWVyLmVjb3JlIy8vSW50ZWdlck1vZGlmaWVyL3ZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kaWZpZXIuZWNvcmUjLy9JbnRlZ2VyTW9kaWZpZXIvb3JpZ2luYWxWYWx1ZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtb2RpZmllci5lY29yZSMvL0xvbmdNb2RpZmllciI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kaWZpZXIuZWNvcmUjLy9Mb25nTW9kaWZpZXIvdmFsdWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2RpZmllci5lY29yZSMvL0xvbmdNb2RpZmllci9vcmlnaW5hbFZhbHVlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1vZGlmaWVyLmVjb3JlIy8vU1RFTVRpbWVNb2RpZmllciI+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kaWZpZXIuZWNvcmUjLy9TVEVNVGltZU1vZGlmaWVyL3ZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kaWZpZXIuZWNvcmUjLy9TVEVNVGltZU1vZGlmaWVyL29yaWdpbmFsVmFsdWUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgIDwvZ2VuUGFja2FnZXM+CisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlByZWRpY2F0ZSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKKyAgICAgIGdlbmVyYXRlRXhhbXBsZUNsYXNzPSJmYWxzZSIgbXVsdGlwbGVFZGl0b3JQYWdlcz0iZmFsc2UiIGdlbmVyYXRlTW9kZWxXaXphcmQ9ImZhbHNlIgorICAgICAgZWNvcmVQYWNrYWdlPSJwcmVkaWNhdGUuZWNvcmUjLyI+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icHJlZGljYXRlLmVjb3JlIy8vQW5kIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJwcmVkaWNhdGUuZWNvcmUjLy9Cb29sZWFuRXhwcmVzc2lvbiIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0icHJlZGljYXRlLmVjb3JlIy8vQm9vbGVhbk9wZXJhdG9yIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icHJlZGljYXRlLmVjb3JlIy8vRmFsc2UiLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InByZWRpY2F0ZS5lY29yZSMvL05hcnlCb29sZWFuT3BlcmF0b3IiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiCisgICAgICAgICAgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHByZWRpY2F0ZS5lY29yZSMvL05hcnlCb29sZWFuT3BlcmF0b3Ivb3BlcmFuZHMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icHJlZGljYXRlLmVjb3JlIy8vTm90Ii8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icHJlZGljYXRlLmVjb3JlIy8vT3IiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJwcmVkaWNhdGUuZWNvcmUjLy9QcmVkaWNhdGUiPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249InByZWRpY2F0ZS5lY29yZSMvL1ByZWRpY2F0ZS9ldmFsdWF0ZSI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJwcmVkaWNhdGUuZWNvcmUjLy9QcmVkaWNhdGUvZXZhbHVhdGUvdGltZSIvPgorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0icHJlZGljYXRlLmVjb3JlIy8vUHJlZGljYXRlL2V2YWx1YXRlL3RpbWVyUGVyaW9kIi8+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJwcmVkaWNhdGUuZWNvcmUjLy9QcmVkaWNhdGUvZXZhbHVhdGUvYWN0aW9uIi8+CisgICAgICA8L2dlbk9wZXJhdGlvbnM+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InByZWRpY2F0ZS5lY29yZSMvL1ByZWRpY2F0ZVJlZmVyZW5jZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiCisgICAgICAgICAgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHByZWRpY2F0ZS5lY29yZSMvL1ByZWRpY2F0ZVJlZmVyZW5jZS9wcmVkaWNhdGUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icHJlZGljYXRlLmVjb3JlIy8vVGVzdCIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InByZWRpY2F0ZS5lY29yZSMvL1RydWUiLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InByZWRpY2F0ZS5lY29yZSMvL1VuYXJ5Qm9vbGVhbk9wZXJhdG9yIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIgorICAgICAgICAgIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBwcmVkaWNhdGUuZWNvcmUjLy9VbmFyeUJvb2xlYW5PcGVyYXRvci9vcGVyYW5kIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InByZWRpY2F0ZS5lY29yZSMvL1ByZWRpY2F0ZUV4cHJlc3Npb24iPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiCisgICAgICAgICAgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHByZWRpY2F0ZS5lY29yZSMvL1ByZWRpY2F0ZUV4cHJlc3Npb24vcHJlZGljYXRlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0icHJlZGljYXRlLmVjb3JlIy8vSWRlbnRpZmlhYmxlUHJlZGljYXRlIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icHJlZGljYXRlLmVjb3JlIy8vSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbiIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0icHJlZGljYXRlLmVjb3JlIy8vSWRlbnRpZmlhYmxlVGVzdCIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0icHJlZGljYXRlLmVjb3JlIy8vVGltZVRlc3QiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJwcmVkaWNhdGUuZWNvcmUjLy9BYnNvbHV0ZVRpbWVUZXN0Ij4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBwcmVkaWNhdGUuZWNvcmUjLy9BYnNvbHV0ZVRpbWVUZXN0L3RpbWUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icHJlZGljYXRlLmVjb3JlIy8vRWxhcHNlZFRpbWVUZXN0Ij4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcHJlZGljYXRlLmVjb3JlIy8vRWxhcHNlZFRpbWVUZXN0L3JlZmVyZW5jZVRpbWVWYWxpZCIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwcmVkaWNhdGUuZWNvcmUjLy9FbGFwc2VkVGltZVRlc3QvZWxhcHNlZE1pbGxpc2Vjb25kcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHByZWRpY2F0ZS5lY29yZSMvL0VsYXBzZWRUaW1lVGVzdC9udW1iZXJvZkRheXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgcHJlZGljYXRlLmVjb3JlIy8vRWxhcHNlZFRpbWVUZXN0L3JlZmVyZW5jZVRpbWUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgIDwvZ2VuUGFja2FnZXM+CisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlNjZW5hcmlvIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgorICAgICAgZ2VuZXJhdGVFeGFtcGxlQ2xhc3M9ImZhbHNlIiBtdWx0aXBsZUVkaXRvclBhZ2VzPSJmYWxzZSIgZ2VuZXJhdGVNb2RlbFdpemFyZD0iZmFsc2UiCisgICAgICBlY29yZVBhY2thZ2U9InNjZW5hcmlvLmVjb3JlIy8iPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ic2NlbmFyaW8uZWNvcmUjLy9TY2VuYXJpbyI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHNjZW5hcmlvLmVjb3JlIy8vU2NlbmFyaW8vbW9kZWwiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc2NlbmFyaW8uZWNvcmUjLy9TY2VuYXJpby9zZXF1ZW5jZXIiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHNjZW5hcmlvLmVjb3JlIy8vU2NlbmFyaW8vc2NlbmFyaW9EZWNvcmF0b3JzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHNjZW5hcmlvLmVjb3JlIy8vU2NlbmFyaW8vY2Fub25pY2FsR3JhcGgiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2NlbmFyaW8uZWNvcmUjLy9TY2VuYXJpby9wcm9ncmVzcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzY2VuYXJpby5lY29yZSMvL1NjZW5hcmlvL3NvbHZlciIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249InNjZW5hcmlvLmVjb3JlIy8vU2NlbmFyaW8vc3RlcCIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249InNjZW5hcmlvLmVjb3JlIy8vU2NlbmFyaW8vcmVzZXQiLz4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJzY2VuYXJpby5lY29yZSMvL1NjZW5hcmlvL2luaXRpYWxpemUiLz4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJzY2VuYXJpby5lY29yZSMvL1NjZW5hcmlvL3Byb2R1Y2VUaXRsZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgPC9nZW5QYWNrYWdlcz4KKyAgPGdlblBhY2thZ2VzIHByZWZpeD0iU2VxdWVuY2VyIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgorICAgICAgZ2VuZXJhdGVFeGFtcGxlQ2xhc3M9ImZhbHNlIiBtdWx0aXBsZUVkaXRvclBhZ2VzPSJmYWxzZSIgZ2VuZXJhdGVNb2RlbFdpemFyZD0iZmFsc2UiCisgICAgICBlY29yZVBhY2thZ2U9InNlcXVlbmNlci5lY29yZSMvIj4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InNlcXVlbmNlci5lY29yZSMvL1JlYWxUaW1lU2VxdWVuY2VyIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJzZXF1ZW5jZXIuZWNvcmUjLy9TZXF1ZW5jZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHNlcXVlbmNlci5lY29yZSMvL1NlcXVlbmNlci9zdGFydFRpbWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXF1ZW5jZXIuZWNvcmUjLy9TZXF1ZW5jZXIvZW5kVGltZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eURlc2NyaXB0aW9uPSIiCisgICAgICAgICAgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHNlcXVlbmNlci5lY29yZSMvL1NlcXVlbmNlci9jdXJyZW50VGltZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc2VxdWVuY2VyLmVjb3JlIy8vU2VxdWVuY2VyL25leHRUaW1lIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXF1ZW5jZXIuZWNvcmUjLy9TZXF1ZW5jZXIvdGltZURlbHRhIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXF1ZW5jZXIuZWNvcmUjLy9TZXF1ZW5jZXIvZHVyYXRpb24iLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcXVlbmNlci5lY29yZSMvL1NlcXVlbmNlci90aW1lVG9TdG9wIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXF1ZW5jZXIuZWNvcmUjLy9TZXF1ZW5jZXIvd29ya0NvbXBsZXRlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXF1ZW5jZXIuZWNvcmUjLy9TZXF1ZW5jZXIvd29ya0luY3JlbWVudCIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VxdWVuY2VyLmVjb3JlIy8vU2VxdWVuY2VyL2N5Y2xlIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic2VxdWVuY2VyLmVjb3JlIy8vU2VxdWVuY2VyL3Jlc2V0Ii8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ic2VxdWVuY2VyLmVjb3JlIy8vU2VxdWVudGlhbFNlcXVlbmNlciI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VxdWVuY2VyLmVjb3JlIy8vU2VxdWVudGlhbFNlcXVlbmNlci90aW1lSW5jcmVtZW50Ii8+CisgICAgPC9nZW5DbGFzc2VzPgorICA8L2dlblBhY2thZ2VzPgorICA8Z2VuUGFja2FnZXMgcHJlZml4PSJUcmlnZ2VyIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgorICAgICAgZ2VuZXJhdGVFeGFtcGxlQ2xhc3M9ImZhbHNlIiBtdWx0aXBsZUVkaXRvclBhZ2VzPSJmYWxzZSIgZ2VuZXJhdGVNb2RlbFdpemFyZD0iZmFsc2UiCisgICAgICBlY29yZVBhY2thZ2U9InRyaWdnZXIuZWNvcmUjLyI+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idHJpZ2dlci5lY29yZSMvL1RyaWdnZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIgorICAgICAgICAgIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0cmlnZ2VyLmVjb3JlIy8vVHJpZ2dlci9wcmVkaWNhdGUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIKKyAgICAgICAgICBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdHJpZ2dlci5lY29yZSMvL1RyaWdnZXIvYWN0aW9uIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICA8L2dlblBhY2thZ2VzPgorICA8Z2VuUGFja2FnZXMgcHJlZml4PSJTb2x2ZXIiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCisgICAgICBlY29yZVBhY2thZ2U9InNvbHZlci5lY29yZSMvIj4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzb2x2ZXIuZWNvcmUjLy9Tb2x2ZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvbHZlci5lY29yZSMvL1NvbHZlci9kZWNvcmF0b3JzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvbHZlci5lY29yZSMvL1NvbHZlci9pbml0aWFsaXplZCIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249InNvbHZlci5lY29yZSMvL1NvbHZlci9zdGVwIj4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9InNvbHZlci5lY29yZSMvL1NvbHZlci9zdGVwL3RpbWUiLz4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9InNvbHZlci5lY29yZSMvL1NvbHZlci9zdGVwL3RpbWVEZWx0YSIvPgorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ic29sdmVyLmVjb3JlIy8vU29sdmVyL3N0ZXAvY3ljbGUiLz4KKyAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJzb2x2ZXIuZWNvcmUjLy9Tb2x2ZXIvcmVzZXQiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgIDwvZ2VuUGFja2FnZXM+Cis8L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2V4cGVyaW1lbnQuZWNvcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZXhwZXJpbWVudC5lY29yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmU5M2E3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2V4cGVyaW1lbnQuZWNvcmUKQEAgLTAsMCArMSwxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iZXhwZXJpbWVudCIKKyAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZXhwZXJpbWVudC5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50Ij4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHBlcmltZW50IiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSWRlbnRpZmlhYmxlIj4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0idXBkYXRlU2NlbmFyaW8iIGVUeXBlPSJlY29yZTpFQ2xhc3Mgc2NlbmFyaW8uZWNvcmUjLy9TY2VuYXJpbyIvPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpbml0U2NlbmFyaW8iIGVUeXBlPSJlY29yZTpFQ2xhc3Mgc2NlbmFyaW8uZWNvcmUjLy9TY2VuYXJpbyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcnMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIG1vZGlmaWVyLmVjb3JlIy8vTW9kaWZpZXIiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29tcGxldGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgorICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzY2VuYXJpbyIgZVR5cGU9ImVjb3JlOkVDbGFzcyBzY2VuYXJpby5lY29yZSMvL1NjZW5hcmlvIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVSSSIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkiLz4KKzwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UxMjFjMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9ncmFwaC5lY29yZQpAQCAtMCwwICsxLDE2MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iZ3JhcGgiCisgICAgbnNVUkk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoIj4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEeW5hbWljTGFiZWwiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTGFiZWwiPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJyZXNldCIvPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzd2l0Y2hUb05leHRWYWx1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuZXh0VmFsdWVWYWxpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5leHRWYWx1ZSIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgZVR5cGU9IiMvL0xhYmVsVmFsdWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVjb3JhdG9yIiBlVHlwZT0iZWNvcmU6RUNsYXNzIG1vZGVsLmVjb3JlIy8vRGVjb3JhdG9yIgorICAgICAgICBlT3Bwb3NpdGU9Im1vZGVsLmVjb3JlIy8vRGVjb3JhdG9yL2xhYmVsc1RvVXBkYXRlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkR5bmFtaWNOb2RlTGFiZWwiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRHluYW1pY0xhYmVsICMvL05vZGVMYWJlbCIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVkZ2UiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9JZGVudGlmaWFibGUgbW9kaWZpZXIuZWNvcmUjLy9Nb2RpZmlhYmxlIj4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0T3RoZXJOb2RlIiBlVHlwZT0iIy8vTm9kZSIgZUV4Y2VwdGlvbnM9IiMvL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiI+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibm9kZSIgZVR5cGU9IiMvL05vZGUiLz4KKyAgICA8L2VPcGVyYXRpb25zPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc0RpcmVjdGVkQXQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJub2RlIiBlVHlwZT0iIy8vTm9kZSIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImEiIGVUeXBlPSIjLy9Ob2RlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vZGVBVVJJIiBlVHlwZT0iIy8vVVJJIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImIiIGVUeXBlPSIjLy9Ob2RlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vZGVCVVJJIiBlVHlwZT0iIy8vVVJJIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxhYmVsIiBlVHlwZT0iIy8vRWRnZUxhYmVsIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBlT3Bwb3NpdGU9IiMvL0VkZ2VMYWJlbC9lZGdlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpcmVjdGVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGgiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9JZGVudGlmaWFibGUiPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXROb2RlTGFiZWxzQnlUeXBlVVJJIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL05vZGVMYWJlbCI+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0idHlwZVVSSSIgZVR5cGU9IiMvL1VSSSIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZEdyYXBoIj4KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJncmFwaCIgZVR5cGU9IiMvL0dyYXBoIi8+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZmlsdGVyIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0lkZW50aWZpYWJsZUZpbHRlciIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9InB1dEVkZ2UiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImVkZ2UiIGVUeXBlPSIjLy9FZGdlIi8+CisgICAgPC9lT3BlcmF0aW9ucz4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RWRnZSIgZVR5cGU9IiMvL0VkZ2UiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InVyaSIgZVR5cGU9IiMvL1VSSSIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9InB1dE5vZGUiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5vZGUiIGVUeXBlPSIjLy9Ob2RlIi8+CisgICAgPC9lT3BlcmF0aW9ucz4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0Tm9kZSIgZVR5cGU9IiMvL05vZGUiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InVyaSIgZVR5cGU9IiMvL1VSSSIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9InB1dE5vZGVMYWJlbCI+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibGFiZWwiIGVUeXBlPSIjLy9Ob2RlTGFiZWwiLz4KKyAgICA8L2VPcGVyYXRpb25zPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXROb2RlTGFiZWwiIGVUeXBlPSIjLy9Ob2RlTGFiZWwiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InVyaSIgZVR5cGU9IiMvL1VSSSIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9InB1dEdyYXBoTGFiZWwiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImxhYmVsIiBlVHlwZT0iIy8vTGFiZWwiLz4KKyAgICA8L2VPcGVyYXRpb25zPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRHcmFwaExhYmVsIiBlVHlwZT0iIy8vTGFiZWwiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InVyaSIgZVR5cGU9IiMvL1VSSSIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZER5bmFtaWNMYWJlbCI+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZHluYW1pY2xhYmVsIiBlVHlwZT0iIy8vRHluYW1pY0xhYmVsIi8+CisgICAgPC9lT3BlcmF0aW9ucz4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic3dpdGNoVG9OZXh0VmFsdWUiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImN1cnJlbnRUaW1lIiBlVHlwZT0iZWNvcmU6RUNsYXNzIG1vZGVsLmVjb3JlIy8vU1RFTVRpbWUiLz4KKyAgICA8L2VPcGVyYXRpb25zPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlZGdlcyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9VUklUb0VkZ2VNYXBFbnRyeSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJub2RlcyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9VUklUb05vZGVNYXBFbnRyeSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaExhYmVscyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9VUklUb0xhYmVsTWFwRW50cnkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibm9kZUxhYmVscyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9VUklUb05vZGVMYWJlbE1hcEVudHJ5IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImR5bmFtaWNMYWJlbHMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vRHluYW1pY0xhYmVsIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im51bUVkZ2VzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgorICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJudW1Ob2RlcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIKKyAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibnVtR3JhcGhMYWJlbHMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im51bU5vZGVMYWJlbHMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im51bUR5bmFtaWNMYWJlbHMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InVucmVzb2x2ZWRJZGVudGlmaWFibGVzIgorICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1VucmVzb2x2ZWRJZGVudGlmaWFibGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVjb3JhdG9ycyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgbW9kZWwuZWNvcmUjLy9EZWNvcmF0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCisgICAgICAgIGVPcHBvc2l0ZT0ibW9kZWwuZWNvcmUjLy9EZWNvcmF0b3IvZ3JhcGgiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBtb2RlbC5lY29yZSMvL1NURU1UaW1lIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxhYmVsIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0lkZW50aWZpYWJsZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQiCisgICAgICAgIGVUeXBlPSIjLy9VUkkiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY3VycmVudFZhbHVlIiBsb3dlckJvdW5kPSIxIgorICAgICAgICBlVHlwZT0iIy8vTGFiZWxWYWx1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpZGVudGlmaWFibGUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vSWRlbnRpZmlhYmxlIgorICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxhYmVsVmFsdWUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vU2FuaXR5Q2hlY2tlciI+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9InJlc2V0Ii8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5vZGUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9JZGVudGlmaWFibGUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlZGdlcyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9FZGdlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxhYmVscyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9Ob2RlTGFiZWwiIGVPcHBvc2l0ZT0iIy8vTm9kZUxhYmVsL25vZGUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTm9kZUxhYmVsIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0xhYmVsIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibm9kZSIgZVR5cGU9IiMvL05vZGUiIGVPcHBvc2l0ZT0iIy8vTm9kZS9sYWJlbHMiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RhdGljTm9kZUxhYmVsIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL05vZGVMYWJlbCAjLy9TdGF0aWNMYWJlbCIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlVucmVzb2x2ZWRJZGVudGlmaWFibGUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzY2VuYXJpbyIgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9JZGVudGlmaWFibGUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kZWwiIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vSWRlbnRpZmlhYmxlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0lkZW50aWZpYWJsZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpZGVudGlmaWFibGUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vSWRlbnRpZmlhYmxlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVucmVzb2x2ZWRVUkkiIGVUeXBlPSIjLy9VUkkiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnkiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTWFwJEVudHJ5Ij4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5IiBlVHlwZT0iIy8vVVJJIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0lkZW50aWZpYWJsZSIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTYW5pdHlDaGVja2VyIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyIgorICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkR5bmFtaWNFZGdlTGFiZWwiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRHluYW1pY0xhYmVsICMvL0VkZ2VMYWJlbCIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVkZ2VMYWJlbCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9MYWJlbCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVkZ2UiIGVUeXBlPSIjLy9FZGdlIiBlT3Bwb3NpdGU9IiMvL0VkZ2UvbGFiZWwiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RhdGljRWRnZUxhYmVsIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0VkZ2VMYWJlbCAjLy9TdGF0aWNMYWJlbCIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlVSSVRvRWRnZU1hcEVudHJ5IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLk1hcCRFbnRyeSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleSIgZVR5cGU9IiMvL1VSSSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9IiMvL0VkZ2UiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVVJJVG9Ob2RlTWFwRW50cnkiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTWFwJEVudHJ5Ij4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5IiBlVHlwZT0iIy8vVVJJIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlIiBlVHlwZT0iIy8vTm9kZSIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVUklUb0xhYmVsTWFwRW50cnkiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTWFwJEVudHJ5Ij4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5IiBlVHlwZT0iIy8vVVJJIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlIiBlVHlwZT0iIy8vTGFiZWwiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVVJJVG9Ob2RlTGFiZWxNYXBFbnRyeSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5NYXAkRW50cnkiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXkiIGVUeXBlPSIjLy9VUkkiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsdWUiIGVUeXBlPSIjLy9Ob2RlTGFiZWwiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RhdGljTGFiZWwiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTGFiZWwgbW9kaWZpZXIuZWNvcmUjLy9Nb2RpZmlhYmxlIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVVJJIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLz4KKzwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvbW9kZWwuZWNvcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvbW9kZWwuZWNvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZiMDNjOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9tb2RlbC5lY29yZQpAQCAtMCwwICsxLDc5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJtb2RlbCIKKyAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwuZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwiPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlY29yYXRvciIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0lkZW50aWZpYWJsZSI+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImRlY29yYXRlR3JhcGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQm9vbGVhbiI+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0idGltZSIgZVR5cGU9IiMvL1NURU1UaW1lIi8+CisgICAgPC9lT3BlcmF0aW9ucz4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0idXBkYXRlTGFiZWxzIj4KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJ0aW1lIiBlVHlwZT0iIy8vU1RFTVRpbWUiLz4KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJ0aW1lclBlcmlvZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUxvbmciLz4KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJjeWNsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9InJlc2V0TGFiZWxzIi8+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldExhYmVsc1RvVXBkYXRlIj4KKyAgICAgIDxlR2VuZXJpY1R5cGUgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VFTGlzdCI+CisgICAgICAgIDxlVHlwZUFyZ3VtZW50cyBlQ2xhc3NpZmllcj0iZWNvcmU6RUNsYXNzIGdyYXBoLmVjb3JlIy8vRHluYW1pY0xhYmVsIi8+CisgICAgICA8L2VHZW5lcmljVHlwZT4KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwYXJ0aXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FSW50Ii8+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibWF4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUludCIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9InByZXBhcmUiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im1vZGVsIiBlVHlwZT0iIy8vTW9kZWwiLz4KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJ0aW1lIiBlVHlwZT0iIy8vU1RFTVRpbWUiLz4KKyAgICA8L2VPcGVyYXRpb25zPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsYWJlbHNUb1VwZGF0ZSIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgZ3JhcGguZWNvcmUjLy9EeW5hbWljTGFiZWwiIGVPcHBvc2l0ZT0iZ3JhcGguZWNvcmUjLy9EeW5hbWljTGFiZWwvZGVjb3JhdG9yIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGdyYXBoLmVjb3JlIy8vR3JhcGgiCisgICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSJncmFwaC5lY29yZSMvL0dyYXBoL2RlY29yYXRvcnMiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5hYmxlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JhcGhEZWNvcmF0ZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9ncmVzcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMC4wIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVkZ2VEZWNvcmF0b3IiIGVTdXBlclR5cGVzPSIjLy9EZWNvcmF0b3IiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaERlY29yYXRvciIgZVN1cGVyVHlwZXM9IiMvL0RlY29yYXRvciIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1vZGVsIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSWRlbnRpZmlhYmxlIj4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0Q2Fub25pY2FsR3JhcGgiIGVUeXBlPSJlY29yZTpFQ2xhc3MgZ3JhcGguZWNvcmUjLy9HcmFwaCI+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0idXJpIiBlVHlwZT0iIy8vVVJJIi8+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZmlsdGVyIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0lkZW50aWZpYWJsZUZpbHRlciIvPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InRpbWUiIGVUeXBlPSIjLy9TVEVNVGltZSIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9InByZXBhcmUiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InRpbWUiIGVUeXBlPSIjLy9TVEVNVGltZSIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZGVscyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9Nb2RlbCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaHMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGdyYXBoLmVjb3JlIy8vR3JhcGgiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhEZWNvcmF0b3JzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL0dyYXBoRGVjb3JhdG9yIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5vZGVEZWNvcmF0b3JzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL05vZGVEZWNvcmF0b3IiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWRnZURlY29yYXRvcnMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vRWRnZURlY29yYXRvciIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOb2RlRGVjb3JhdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVjb3JhdG9yIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU1RFTVRpbWUiPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRJbmNyZW1lbnQiIGVUeXBlPSIjLy9TVEVNVGltZSI+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0idGltZUluY3JlbWVudCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUxvbmciLz4KKyAgICA8L2VPcGVyYXRpb25zPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJoYXNoQ29kZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJlcXVhbHMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJvYmoiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VKYXZhT2JqZWN0Ii8+CisgICAgPC9lT3BlcmF0aW9ucz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGltZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURhdGUiLz4KKyAgICA8ZUdlbmVyaWNTdXBlclR5cGVzIGVDbGFzc2lmaWVyPSIjLy9Db21wYXJhYmxlIj4KKyAgICAgIDxlVHlwZUFyZ3VtZW50cyBlQ2xhc3NpZmllcj0iIy8vU1RFTVRpbWUiLz4KKyAgICA8L2VHZW5lcmljU3VwZXJUeXBlcz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcGFyYWJsZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5Db21wYXJhYmxlIgorICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+CisgICAgPGVUeXBlUGFyYW1ldGVycyBuYW1lPSJUIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVSSSIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkiLz4KKzwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvbW9kaWZpZXIuZWNvcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvbW9kaWZpZXIuZWNvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllM2FiMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9tb2RpZmllci5lY29yZQpAQCAtMCwwICsxLDEyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ibW9kaWZpZXIiCisgICAgbnNVUkk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyIj4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb3VibGVOT1BNb2RpZmllciIgZVN1cGVyVHlwZXM9IiMvL05PUE1vZGlmaWVyIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG91YmxlUmFuZ2VNb2RpZmllciIgZVN1cGVyVHlwZXM9IiMvL1JhbmdlTW9kaWZpZXIiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydFZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSItOTk5OTk5OTkuMCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmRWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iLTk5OTk5OTk5LjAiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5jcmVtZW50IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSItOTk5OTk5OTkuMCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuZXh0VmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjAuMCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmlnaW5hbFZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRvdWJsZVNlcXVlbmNlTW9kaWZpZXIiIGVTdXBlclR5cGVzPSIjLy9TZXF1ZW5jZU1vZGlmaWVyIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VxdWVuY2UiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkZlYXR1cmVNb2RpZmllciIgYWJzdHJhY3Q9InRydWUiPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJ1cGRhdGVGZWF0dXJlIi8+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9InJlc2V0Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhcmdldCIgZVR5cGU9ImVjb3JlOkVDbGFzcyBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VPYmplY3QiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cnVjdHVyYWxGZWF0dXJlIgorICAgICAgICB0cmFuc2llbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmZWF0dXJlTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmZWF0dXJlSWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VycmVudFZhbHVlVGV4dCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHRyYW5zaWVudD0idHJ1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb21wbGV0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkludGVnZXJOT1BNb2RpZmllciIgZVN1cGVyVHlwZXM9IiMvL05PUE1vZGlmaWVyIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW50ZWdlclJhbmdlTW9kaWZpZXIiIGVTdXBlclR5cGVzPSIjLy9SYW5nZU1vZGlmaWVyIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iLTk5OTk5OTk5Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVuZFZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSItOTk5OTk5OTkiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5jcmVtZW50IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSItOTk5OTk5OTkiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmV4dFZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSItOTk5OTk5OTkiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3JpZ2luYWxWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbnRlZ2VyU2VxdWVuY2VNb2RpZmllciIgZVN1cGVyVHlwZXM9IiMvL1NlcXVlbmNlTW9kaWZpZXIiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXF1ZW5jZSIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnRlZ2VyT2JqZWN0Ii8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxvbmdOT1BNb2RpZmllciIgZVN1cGVyVHlwZXM9IiMvL05PUE1vZGlmaWVyIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTG9uZ1JhbmdlTW9kaWZpZXIiIGVTdXBlclR5cGVzPSIjLy9SYW5nZU1vZGlmaWVyIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUxvbmciCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ii05OTk5OTk5OSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmRWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUxvbmciCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ii05OTk5OTk5OSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbmNyZW1lbnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VMb25nIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSItOTk5OTk5OTkiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmV4dFZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTG9uZyIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iLTk5OTk5OTk5Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9yaWdpbmFsVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VMb25nIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSItOTk5OTk5OTkiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTG9uZ1NlcXVlbmNlTW9kaWZpZXIiIGVTdXBlclR5cGVzPSIjLy9TZXF1ZW5jZU1vZGlmaWVyIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VxdWVuY2UiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTG9uZ09iamVjdCIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNb2RpZmllciIgZVN1cGVyVHlwZXM9Im1vZGVsLmVjb3JlIy8vRGVjb3JhdG9yIj4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0idXBkYXRlU2NlbmFyaW8iPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImJhc2VTY2VuYXJpbyIgZVR5cGU9ImVjb3JlOkVDbGFzcyBzY2VuYXJpby5lY29yZSMvL1NjZW5hcmlvIi8+CisgICAgPC9lT3BlcmF0aW9ucz4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0icmVzZXQiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFyZ2V0VVJJIiBlVHlwZT0iIy8vVVJJIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZlYXR1cmVNb2RpZmllcnMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vRmVhdHVyZU1vZGlmaWVyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbXBsZXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKKyAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTk9QTW9kaWZpZXIiIGVTdXBlclR5cGVzPSIjLy9GZWF0dXJlTW9kaWZpZXIiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSYW5nZU1vZGlmaWVyIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0ZlYXR1cmVNb2RpZmllciIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNURU1UaW1lTk9QTW9kaWZpZXIiIGVTdXBlclR5cGVzPSIjLy9OT1BNb2RpZmllciIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNURU1UaW1lUmFuZ2VNb2RpZmllciIgZVN1cGVyVHlwZXM9IiMvL1JhbmdlTW9kaWZpZXIiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdGFydFZhbHVlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIG1vZGVsLmVjb3JlIy8vU1RFTVRpbWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZW5kVmFsdWUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgbW9kZWwuZWNvcmUjLy9TVEVNVGltZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbmNyZW1lbnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VMb25nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5leHRWYWx1ZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBtb2RlbC5lY29yZSMvL1NURU1UaW1lIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9yaWdpbmFsVmFsdWUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgbW9kZWwuZWNvcmUjLy9TVEVNVGltZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXIiIGVTdXBlclR5cGVzPSIjLy9TZXF1ZW5jZU1vZGlmaWVyIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VxdWVuY2UiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIG1vZGVsLmVjb3JlIy8vU1RFTVRpbWUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VxdWVuY2VNb2RpZmllciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9GZWF0dXJlTW9kaWZpZXIiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXF1ZW5jZVNpemUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1cnJlbnRTZXF1ZW5jZUluZGV4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIwIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5leHRWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUphdmFPYmplY3QiCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9yaWdpbmFsVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VKYXZhT2JqZWN0Ii8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0cmluZ05PUE1vZGlmaWVyIiBlU3VwZXJUeXBlcz0iIy8vTk9QTW9kaWZpZXIiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyIiBlU3VwZXJUeXBlcz0iIy8vU2VxdWVuY2VNb2RpZmllciI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcXVlbmNlIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNb2RpZmlhYmxlIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVVJJIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNpbmdsZVZhbHVlTW9kaWZpZXIiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgZVN1cGVyVHlwZXM9IiMvL0ZlYXR1cmVNb2RpZmllciIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRvdWJsZU1vZGlmaWVyIiBlU3VwZXJUeXBlcz0iIy8vU2luZ2xlVmFsdWVNb2RpZmllciI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmlnaW5hbFZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbnRlZ2VyTW9kaWZpZXIiIGVTdXBlclR5cGVzPSIjLy9TaW5nbGVWYWx1ZU1vZGlmaWVyIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FSW50Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9yaWdpbmFsVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FSW50Ii8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxvbmdNb2RpZmllciIgZVN1cGVyVHlwZXM9IiMvL1NpbmdsZVZhbHVlTW9kaWZpZXIiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VMb25nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9yaWdpbmFsVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FTG9uZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTVEVNVGltZU1vZGlmaWVyIiBlU3VwZXJUeXBlcz0iIy8vU2luZ2xlVmFsdWVNb2RpZmllciI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIG1vZGVsLmVjb3JlIy8vU1RFTVRpbWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3JpZ2luYWxWYWx1ZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBtb2RlbC5lY29yZSMvL1NURU1UaW1lIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9wcmVkaWNhdGUuZWNvcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvcHJlZGljYXRlLmVjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNDYwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvcHJlZGljYXRlLmVjb3JlCkBAIC0wLDAgKzEsNTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InByZWRpY2F0ZSIKKyAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZSI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQW5kIiBlU3VwZXJUeXBlcz0iIy8vTmFyeUJvb2xlYW5PcGVyYXRvciIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJvb2xlYW5FeHByZXNzaW9uIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1ByZWRpY2F0ZSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJvb2xlYW5PcGVyYXRvciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Cb29sZWFuRXhwcmVzc2lvbiIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkZhbHNlIiBlU3VwZXJUeXBlcz0iIy8vVGVzdCIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hcnlCb29sZWFuT3BlcmF0b3IiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgZVN1cGVyVHlwZXM9IiMvL0Jvb2xlYW5PcGVyYXRvciI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wZXJhbmRzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL1ByZWRpY2F0ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOb3QiIGVTdXBlclR5cGVzPSIjLy9VbmFyeUJvb2xlYW5PcGVyYXRvciIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik9yIiBlU3VwZXJUeXBlcz0iIy8vTmFyeUJvb2xlYW5PcGVyYXRvciIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByZWRpY2F0ZSIgYWJzdHJhY3Q9InRydWUiPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJldmFsdWF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InRpbWUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgbW9kZWwuZWNvcmUjLy9TVEVNVGltZSIvPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InRpbWVyUGVyaW9kIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTG9uZyIvPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImFjdGlvbiIgZVR5cGU9ImVjb3JlOkVDbGFzcyBtb2RlbC5lY29yZSMvL0RlY29yYXRvciIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByZWRpY2F0ZVJlZmVyZW5jZSIgZVN1cGVyVHlwZXM9IiMvL1ByZWRpY2F0ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRpY2F0ZSIgZVR5cGU9IiMvL1ByZWRpY2F0ZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZXN0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1ByZWRpY2F0ZSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRydWUiIGVTdXBlclR5cGVzPSIjLy9UZXN0Ii8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVW5hcnlCb29sZWFuT3BlcmF0b3IiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgZVN1cGVyVHlwZXM9IiMvL0Jvb2xlYW5PcGVyYXRvciI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wZXJhbmQiIGVUeXBlPSIjLy9QcmVkaWNhdGUiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJlZGljYXRlRXhwcmVzc2lvbiIgZVN1cGVyVHlwZXM9IiMvL0Jvb2xlYW5FeHByZXNzaW9uIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZGljYXRlIiBlVHlwZT0iIy8vUHJlZGljYXRlIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklkZW50aWZpYWJsZVByZWRpY2F0ZSIgYWJzdHJhY3Q9InRydWUiCisgICAgICBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSWRlbnRpZmlhYmxlICMvL1ByZWRpY2F0ZSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24iIGVTdXBlclR5cGVzPSIjLy9JZGVudGlmaWFibGVQcmVkaWNhdGUgIy8vUHJlZGljYXRlRXhwcmVzc2lvbiIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklkZW50aWZpYWJsZVRlc3QiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vSWRlbnRpZmlhYmxlUHJlZGljYXRlICMvL1Rlc3QiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUaW1lVGVzdCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9UZXN0Ii8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWJzb2x1dGVUaW1lVGVzdCIgZVN1cGVyVHlwZXM9IiMvL1RpbWVUZXN0Ij4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBtb2RlbC5lY29yZSMvL1NURU1UaW1lIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVsYXBzZWRUaW1lVGVzdCIgZVN1cGVyVHlwZXM9IiMvL1RpbWVUZXN0Ij4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVmZXJlbmNlVGltZVZhbGlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWxhcHNlZE1pbGxpc2Vjb25kcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUxvbmciCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiB0cmFuc2llbnQ9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibnVtYmVyb2ZEYXlzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIwIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZVRpbWUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgbW9kZWwuZWNvcmUjLy9TVEVNVGltZSIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKzwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvc2NlbmFyaW8uZWNvcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvc2NlbmFyaW8uZWNvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyYWFhMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9zY2VuYXJpby5lY29yZQpAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJzY2VuYXJpbyIKKyAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2NlbmFyaW8uZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8iPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNjZW5hcmlvIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vSWRlbnRpZmlhYmxlIj4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic3RlcCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0icmVzZXQiLz4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaW5pdGlhbGl6ZSIvPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJwcm9kdWNlVGl0bGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kZWwiIGVUeXBlPSJlY29yZTpFQ2xhc3MgbW9kZWwuZWNvcmUjLy9Nb2RlbCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXF1ZW5jZXIiIGVUeXBlPSJlY29yZTpFQ2xhc3Mgc2VxdWVuY2VyLmVjb3JlIy8vU2VxdWVuY2VyIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNjZW5hcmlvRGVjb3JhdG9ycyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgbW9kZWwuZWNvcmUjLy9EZWNvcmF0b3IiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2Fub25pY2FsR3JhcGgiIGVUeXBlPSJlY29yZTpFQ2xhc3MgZ3JhcGguZWNvcmUjLy9HcmFwaCIKKyAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9ncmVzcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMC4wIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNvbHZlciIgZVR5cGU9ImVjb3JlOkVDbGFzcyBzb2x2ZXIuZWNvcmUjLy9Tb2x2ZXIiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9zZXF1ZW5jZXIuZWNvcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvc2VxdWVuY2VyLmVjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZmRiYmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvc2VxdWVuY2VyLmVjb3JlCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InNlcXVlbmNlciIKKyAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlciI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVhbFRpbWVTZXF1ZW5jZXIiIGVTdXBlclR5cGVzPSIjLy9TZXF1ZW50aWFsU2VxdWVuY2VyIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VxdWVuY2VyIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0lkZW50aWZpYWJsZSI+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9InJlc2V0Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0YXJ0VGltZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBtb2RlbC5lY29yZSMvL1NURU1UaW1lIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVuZFRpbWUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgbW9kZWwuZWNvcmUjLy9TVEVNVGltZSIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjdXJyZW50VGltZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBtb2RlbC5lY29yZSMvL1NURU1UaW1lIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5leHRUaW1lIiBlVHlwZT0iZWNvcmU6RUNsYXNzIG1vZGVsLmVjb3JlIy8vU1RFTVRpbWUiCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGltZURlbHRhIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTG9uZyIKKyAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHRyYW5zaWVudD0idHJ1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUxvbmciCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ii0xIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRpbWVUb1N0b3AiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgorICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrQ29tcGxldGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya0luY3JlbWVudCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIKKyAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3ljbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjAiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VxdWVudGlhbFNlcXVlbmNlciIgZVN1cGVyVHlwZXM9IiMvL1NlcXVlbmNlciI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRpbWVJbmNyZW1lbnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VMb25nIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9zb2x2ZXIuZWNvcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvc29sdmVyLmVjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZjZjMjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvc29sdmVyLmVjb3JlCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InNvbHZlciIKKyAgICBuc1VSST0iaHR0cDovL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyIj4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTb2x2ZXIiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9JZGVudGlmaWFibGUiPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzdGVwIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUJvb2xlYW4iPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InRpbWUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgbW9kZWwuZWNvcmUjLy9TVEVNVGltZSIvPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InRpbWVEZWx0YSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VMb25nIi8+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iY3ljbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FSW50Ii8+CisgICAgPC9lT3BlcmF0aW9ucz4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0icmVzZXQiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVjb3JhdG9ycyIgdHJhbnNpZW50PSJ0cnVlIj4KKyAgICAgIDxlR2VuZXJpY1R5cGUgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VFTGlzdCI+CisgICAgICAgIDxlVHlwZUFyZ3VtZW50cyBlQ2xhc3NpZmllcj0iZWNvcmU6RUNsYXNzIG1vZGVsLmVjb3JlIy8vRGVjb3JhdG9yIi8+CisgICAgICA8L2VHZW5lcmljVHlwZT4KKyAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluaXRpYWxpemVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUJvb2xlYW4iLz4KKyAgPC9lQ2xhc3NpZmllcnM+Cis8L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL3RyaWdnZXIuZWNvcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvdHJpZ2dlci5lY29yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDdjNzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL3RyaWdnZXIuZWNvcmUKQEAgLTAsMCArMSwxMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0idHJpZ2dlciIKKyAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdHJpZ2dlci5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyIj4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUcmlnZ2VyIiBlU3VwZXJUeXBlcz0ibW9kZWwuZWNvcmUjLy9EZWNvcmF0b3IiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkaWNhdGUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgcHJlZGljYXRlLmVjb3JlIy8vUHJlZGljYXRlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFjdGlvbiIgZVR5cGU9ImVjb3JlOkVDbGFzcyBtb2RlbC5lY29yZSMvL0RlY29yYXRvciIvPgorICA8L2VDbGFzc2lmaWVycz4KKzwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbm90aWNlLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbm90aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhZjk2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9ub3RpY2UuaHRtbApAQCAtMCwwICsxLDc5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Cis8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPk1hcmNoIDE3LCAyMDA1PC9wPgorCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisKKzxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKyAgIAorPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAorICAgCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKKyAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorICAgCis8dWw+CisJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKzwvdWw+ICAgCisgCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKworPHVsPgorCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKwkJCis8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCitpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KK3RoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KKwk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCisJPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKwk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCis8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKworPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKyAgIAorPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJjNjMyYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9wbHVnaW4ucHJvcGVydGllcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YTM3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcGx1Z2luLnhtbApAQCAtMCwwICsxLDIxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KKzxwbHVnaW4+CisgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJncmFwaCIgbmFtZT0iJUVQX0dyYXBoIiBzY2hlbWE9InNjaGVtYS9ncmFwaC5leHNkIi8+CisgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtb2RlbCIgbmFtZT0iJUVQX01vZGVsIiBzY2hlbWE9InNjaGVtYS9tb2RlbC5leHNkIi8+CisgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzY2VuYXJpbyIgbmFtZT0iJUVQX1NjZW5hcmlvIiBzY2hlbWE9InNjaGVtYS9zY2VuYXJpby5leHNkIi8+CisgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZXF1ZW5jZXIiIG5hbWU9IiVFUF9TZXF1ZW5jZXIiIHNjaGVtYT0ic2NoZW1hL3NlcXVlbmNlci5leHNkIi8+CisgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkZWNvcmF0b3IiIG5hbWU9IiVFUF9EZWNvcmF0b3IiIHNjaGVtYT0ic2NoZW1hL2RlY29yYXRvci5leHNkIi8+CisgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ0cmlnZ2VyIiBuYW1lPSIlRVBfVHJpZ2dlciIgc2NoZW1hPSJzY2hlbWEvdHJpZ2dlci5leHNkIi8+CisgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJwcmVkaWNhdGUiIG5hbWU9IiVFUF9QcmVkaWNhdGUiIHNjaGVtYT0ic2NoZW1hL3ByZWRpY2F0ZS5leHNkIi8+CisgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJleHBlcmltZW50IiBuYW1lPSIlRVBfRXhwZXJpbWVudCIgc2NoZW1hPSJzY2hlbWEvZXhwZXJpbWVudC5leHNkIi8+CisgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzb2x2ZXIiIG5hbWU9IiVFUF9Tb2x2ZXIiIHNjaGVtYT0ic2NoZW1hL3NvbHZlci5leHNkIi8+CisgCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5pdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yaWVzIj4KKyAgICAgIDxmYWN0b3J5CisgICAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi5lY29yZSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgorICAgICAgICAgICAgc3VwcG9ydGVkVHlwZXM9CisgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcgorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIKKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcgorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSIvPgorICAgPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Lml0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3JpZXMiPgorICAgICAgPGZhY3RvcnkKKyAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZXhwZXJpbWVudC5lY29yZSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5wcm92aWRlci5FeHBlcmltZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCisgICAgICAgICAgICBzdXBwb3J0ZWRUeXBlcz0KKyAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIKKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcgorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlIi8+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQuaXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcmllcyI+CisgICAgICA8ZmFjdG9yeQorICAgICAgICAgICAgdXJpPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKKyAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzPQorICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIKKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcgorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIKKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UiLz4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5pdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yaWVzIj4KKyAgICAgIDxmYWN0b3J5CisgICAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsLmVjb3JlIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcm92aWRlci5Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgorICAgICAgICAgICAgc3VwcG9ydGVkVHlwZXM9CisgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcgorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIKKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcgorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSIvPgorICAgPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Lml0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3JpZXMiPgorICAgICAgPGZhY3RvcnkKKyAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIuZWNvcmUiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByb3ZpZGVyLk1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCisgICAgICAgICAgICBzdXBwb3J0ZWRUeXBlcz0KKyAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIKKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcgorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlIi8+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQuaXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcmllcyI+CisgICAgICA8ZmFjdG9yeQorICAgICAgICAgICAgdXJpPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUuZWNvcmUiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5wcm92aWRlci5QcmVkaWNhdGVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKKyAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzPQorICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIKKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcgorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIKKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UiLz4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5pdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yaWVzIj4KKyAgICAgIDxmYWN0b3J5CisgICAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvLmVjb3JlIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5wcm92aWRlci5TY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgorICAgICAgICAgICAgc3VwcG9ydGVkVHlwZXM9CisgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcgorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIKKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcgorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSIvPgorICAgPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Lml0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3JpZXMiPgorICAgICAgPGZhY3RvcnkKKyAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyLmVjb3JlIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIucHJvdmlkZXIuU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCisgICAgICAgICAgICBzdXBwb3J0ZWRUeXBlcz0KKyAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIKKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcgorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlIi8+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQuaXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcmllcyI+CisgICAgICA8ZmFjdG9yeQorICAgICAgICAgICAgdXJpPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90cmlnZ2VyLmVjb3JlIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLnByb3ZpZGVyLlRyaWdnZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKKyAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzPQorICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIKKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcgorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIKKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UiLz4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Lml0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3JpZXMiPgorICAgICAgPGZhY3RvcnkKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLnByb3ZpZGVyLlNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgorICAgICAgICAgICAgdXJpPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIuZWNvcmUiCisgICAgICAgICAgICBzdXBwb3J0ZWRUeXBlcz0KKyAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIKKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcgorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlIj4KKyAgICAgIDwvZmFjdG9yeT4KKyAgIDwvZXh0ZW5zaW9uPgorCisgCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgorICAgICAgPHBhY2thZ2UKKyAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uLmVjb3JlIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZSIKKyAgICAgICAgICAgIGdlbk1vZGVsPSJtb2RlbC9jb3JlLmdlbm1vZGVsIi8+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KKyAgICAgIDxwYWNrYWdlCisgICAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQuZWNvcmUiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudFBhY2thZ2UiCisgICAgICAgICAgICBnZW5Nb2RlbD0ibW9kZWwvY29yZS5nZW5tb2RlbCIvPgorICAgPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+CisgICAgICA8cGFja2FnZQorICAgICAgICAgICAgdXJpPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlIgorICAgICAgICAgICAgZ2VuTW9kZWw9Im1vZGVsL2NvcmUuZ2VubW9kZWwiLz4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgorICAgICAgPHBhY2thZ2UKKyAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwuZWNvcmUiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZSIKKyAgICAgICAgICAgIGdlbk1vZGVsPSJtb2RlbC9jb3JlLmdlbm1vZGVsIi8+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KKyAgICAgIDxwYWNrYWdlCisgICAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyLmVjb3JlIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2UiCisgICAgICAgICAgICBnZW5Nb2RlbD0ibW9kZWwvY29yZS5nZW5tb2RlbCIvPgorICAgPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+CisgICAgICA8cGFja2FnZQorICAgICAgICAgICAgdXJpPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUuZWNvcmUiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlIgorICAgICAgICAgICAgZ2VuTW9kZWw9Im1vZGVsL2NvcmUuZ2VubW9kZWwiLz4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgorICAgICAgPHBhY2thZ2UKKyAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2NlbmFyaW8uZWNvcmUiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvUGFja2FnZSIKKyAgICAgICAgICAgIGdlbk1vZGVsPSJtb2RlbC9jb3JlLmdlbm1vZGVsIi8+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KKyAgICAgIDxwYWNrYWdlCisgICAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci5lY29yZSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlclBhY2thZ2UiCisgICAgICAgICAgICBnZW5Nb2RlbD0ibW9kZWwvY29yZS5nZW5tb2RlbCIvPgorICAgPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+CisgICAgICA8cGFja2FnZQorICAgICAgICAgICAgdXJpPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90cmlnZ2VyLmVjb3JlIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJQYWNrYWdlIgorICAgICAgICAgICAgZ2VuTW9kZWw9Im1vZGVsL2NvcmUuZ2VubW9kZWwiLz4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+CisgICAgICA8cGFja2FnZQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUGFja2FnZSIKKyAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyLmVjb3JlIgorICAgICAgICAgICAgZ2VuTW9kZWw9Im1vZGVsL3NvbHZlci5nZW5tb2RlbCI+CisgICAgICA8L3BhY2thZ2U+CisgICA8L2V4dGVuc2lvbj4KKworIAk8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgorICAgICAgICAgIDxmYWN0b3J5IAorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMuZmlsZS5JZGVudGlmaWFibGVGaWxlQWRhcHRlckZhY3RvcnkiIAorICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUiPgorICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5maWxlLkZpbGUiLz4KKyAgICAgICAgIDwvZmFjdG9yeT4KKyAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgCisgICAgICAKKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2Ly5jdnNpZ25vcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcmVzb3VyY2VzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODVlOGJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2Ly5jdnNpZ25vcmUKQEAgLTAsMCArMSBAQAorVGh1bWJzLmRiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcmVzb3VyY2VzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvRHluYW1pY0xhYmVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9yZXNvdXJjZXMvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9EeW5hbWljTGFiZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOWUzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcmVzb3VyY2VzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvRHluYW1pY0xhYmVsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcmVzb3VyY2VzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvRWRnZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcmVzb3VyY2VzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvRWRnZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkZGI5ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9yZXNvdXJjZXMvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9FZGdlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcmVzb3VyY2VzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvR3JhcGguZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0dyYXBoLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzBiMzU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0dyYXBoLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcmVzb3VyY2VzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvR3JhcGhNb2RlbEZpbGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0dyYXBoTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTIxNmJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0dyYXBoTW9kZWxGaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcmVzb3VyY2VzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTGFiZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0xhYmVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzE0MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0xhYmVsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcmVzb3VyY2VzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTW9kZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L01vZGVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTAxMzNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L01vZGVsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcmVzb3VyY2VzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTW9kZWxNb2RlbEZpbGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L01vZGVsTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTAxMzNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L01vZGVsTW9kZWxGaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcmVzb3VyY2VzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTm9kZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcmVzb3VyY2VzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTm9kZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxNDhmOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9yZXNvdXJjZXMvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Ob2RlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcmVzb3VyY2VzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU2NlbmFyaW8uZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1NjZW5hcmlvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGZmNjQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1NjZW5hcmlvLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcmVzb3VyY2VzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU2NlbmFyaW9Nb2RlbEZpbGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1NjZW5hcmlvTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzJkYWZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1NjZW5hcmlvTW9kZWxGaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcmVzb3VyY2VzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU3RhdGljTGFiZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1N0YXRpY0xhYmVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzE0MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3Jlc291cmNlcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1N0YXRpY0xhYmVsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcmVzb3VyY2VzL2ljb25zL2Z1bGwvb2JqMTYvU1RFTS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvcmVzb3VyY2VzL2ljb25zL2Z1bGwvb2JqMTYvU1RFTS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkMTY3ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9yZXNvdXJjZXMvaWNvbnMvZnVsbC9vYmoxNi9TVEVNLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc2NoZW1hL2RlY29yYXRvci5leHNkIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NjaGVtYS9kZWNvcmF0b3IuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWM3M2YzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NjaGVtYS9kZWNvcmF0b3IuZXhzZApAQCAtMCwwICsxLDk1IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJjb20uaWJtLmFsbWFkZW4uc3RlbS5jb3JlIj4KKzxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJjb20uaWJtLmFsbWFkZW4uc3RlbS5jb3JlIiBpZD0iZGVjb3JhdG9yIiBuYW1lPSJTVEVNIGRlY29yYXRvciBleHRlbnNpb24gcG9pbnQiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhlIFNURU0gc3lzdGVtIGFsbG93cyAmcXVvdDtkZWNvcmF0b3JzJnF1b3Q7IHRvIGNoYW5nZSB0aGUgdW5kZXJseWluZyBncmFwaC4gQSBwbHVnLWluIHRoYXQgZXh0ZW5kcyB0aGUgJnF1b3Q7ZGVjb3JhdG9yJnF1b3Q7IGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGRlY29yYXRvcgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iZHVibGluX2NvcmUuZXhzZCIvPgorCisgICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ic3RlbV9jYXRlZ29yeS5leHNkIi8+CisKKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9InN0ZW1fY2F0ZWdvcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZHVibGluX2NvcmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgMC4wLjAKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc2NoZW1hL2R1Ymxpbl9jb3JlLmV4c2QgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc2NoZW1hL2R1Ymxpbl9jb3JlLmV4c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcxYWUyMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zY2hlbWEvZHVibGluX2NvcmUuZXhzZApAQCAtMCwwICsxLDIxNiBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Cis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iY29tLmlibS5hbG1hZGVuLnN0ZW0uY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KKzxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJjb20uaWJtLmFsbWFkZW4uc3RlbS5jb3JlIiBpZD0iZHVibGluX2NvcmUiIG5hbWU9IkR1YmxpbiBDb3JlIERlZmluaXRpb24iLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhpcyBpcyBhIHNwZWNpZmljYXRpb24gb2YgdGhlIER1YmxpbiBDb3JlIG1ldGFkYXRhIGVsZW1lbnRzLgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8ZWxlbWVudCBuYW1lPSJkdWJsaW5fY29yZSI+CisgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgRHVibGluIENvcmUgTWV0YWRhdGEgaXMgYSBzZXQgb2YgJnF1b3Q7dGVybXMmcXVvdDsgdGhhdCBkZXNjcmliZSB0aGUgY29udGVudCBhbmQgb3JnaW4gb2YgYSByZXNvdXJjZS4gIFNlZSAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZHVibGluY29yZS5vcmcvZG9jdW1lbnRzL2RjbWktdGVybXMvJnF1b3Q7Jmd0OyBodHRwOi8vd3d3LmR1YmxpbmNvcmUub3JnL2RvY3VtZW50cy9kY21pLXRlcm1zLyZsdDsvYSZndDsgZm9yIHRoZSBvZmZpY2FsIGRlZmluaXRpb25zIG9mIHRoZSB0ZXJtcyBhbmQgdGhlaXIgcmVmaW5lbWVudHMuCisgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRpdGxlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIEEgbmFtZSBnaXZlbiB0byB0aGUgcmVzb3VyY2UuIGUuZy4sICZxdW90O0Jhc2UgVW5pdGVkIHN0YXRlcyBBZG1pbmlzdHJhdGlvbiBMZXZlbCAyJnF1b3Q7CisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWRlbnRpZmllciIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBBbiB1bmFtYmlndW91cyByZWZlcmVuY2UgdG8gdGhlIHJlc291cmNlIHdpdGhpbiBhIGdpdmVuIGNvbnRleHQuICBJbiBvdXIgY2FzZSB0aGlzIGlzIGFsd2F5cyBhIFVSSS4gIGUuZy4gJnF1b3Q7c3RlbTovZ3JhcGhzL3NhbXBsZS9zYW1wbGUxLmdyYXBoJnF1b3Q7CisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgQW4gYWNjb3VudCBvZiB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuICBCYXNpY2FsbHksIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbnRlbnQgb2YgdGhlIHJlc291cmNlLiBlLmcuLCAmcXVvdDtPbmx5IHRoZSBjb3VudGllcyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBhcyBub2RlcyB3aXRoIG5vIGVkZ2VzIG9yIGxhYmVscyBvZiBhbnkga2luZC4mcXVvdDsKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjcmVhdG9yIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIEFuIGVudGl0eSBwcmltYXJpbHkgcmVzcG9uc2libGUgZm9yIG1ha2luZyB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuICBlLmcuLCBEYW5pZWwgRm9yZCwgSUJNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGF0ZSIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBBIGRhdGUgYXNzb2NpYXRlZCB3aXRoIGFuIGV2ZW50IGluIHRoZSBsaWZlIGN5Y2xlIG9mIHRoZSByZXNvdXJjZS4gIEVuY29kZWQgaW4gSVNPIDg2MDEgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LnczLm9yZy9UUi9OT1RFLWRhdGV0aW1lJnF1b3Q7Jmd0O2h0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWUmbHQ7L2EmZ3Q7LiAgQmFzaWNhbGx5LCB0aGUgZm9ybWF0IGlzOiBZWVlZLU1NLUREIGUuZy4sICAyMDA2LTAzLTI5CisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9ybWF0IiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIFRoZSBwaHlzaWNhbCBvciBkaWdpdGFsIG1hbmlmZXN0YXRpb24gb2YgdGhlIHJlc291cmNlLiAgRm9yIFNURU0gdGhpcyBpcyB0aGUgbmFtZSBzcGFjZSBVUkkgb2YgdGhlIGNvcmVzcG9uZGluZyBlY29yZSBtb2RlbC4gZS5nLiwgaHR0cDovLy9jb20vaWJtL2FsbWFkZW4vc3RlbS9ncmFwaC5lY29yZQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InB1Ymxpc2hlciIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBBbiBlbnRpdHkgcmVzcG9uc2libGUgZm9yIG1ha2luZyB0aGUgcmVzb3VyY2UgYXZhaWxhYmxlLiBlLmcuLCBJQk0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb3ZlcmFnZSIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBUaGUgZXh0ZW50IG9yIHNjb3BlIG9mIHRoZSBjb250ZW50IG9mIHRoZSByZXNvdXJjZS4gIEZvciBzcGF0aWFsIHJlc291cmNlcyB0aGlzIHdvdWxkIHR5cGljYWxseSBpbmNsdWRlIHRoZSBuYW1lIHNlbGVjdGVkIGZyb20gdGhlICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5nZXR0eS5lZHUvcmVzZWFyY2gvdG9vbHMvdm9jYWJ1bGFyeS90Z24vaW5kZXguaHRtbCZxdW90OyZndDtUaGVzYXVydXMgb2YgR2VvZ3JhcGhpYyBOYW1lcyAmbHQ7L2EmZ3Q7LiBlLmcuLCBTYW50YSBDbGFyYSBDb3VudHkKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250cmlidXRvciIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBBbiBlbnRpdHkgcmVzcG9uc2libGUgZm9yIG1ha2luZyBjb250cmlidXRpb25zIHRvIHRoZSBjb250ZW50IG9mIHRoZSByZXNvdXJjZS4gIGUuZy4sIElCTQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJlbGF0aW9uIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIEEgcmVmZXJlbmNlIHRvIGEgcmVsYXRlZCByZXNvdXJjZS4gSW4gdGhlIGNhc2Ugb2YgU1RFTSB0aGF0IHdpbGwgYmUgdGhlIFVSSSBzcGVjaWZpZWQgYXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHJlbGF0ZWQgcmVzb3VyY2UuIGUuZy4gJnF1b3Q7c3RlbTovZ3JhcGhzL3NhbXBsZS9zYW1wbGUxLmdyYXBoJnF1b3Q7CisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmlnaHRzIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uIGFib3V0IHJpZ2h0cyBoZWxkIGluIGFuZCBvdmVyIHRoZSByZXNvdXJjZS4gZS5nLiwgICZhbXA7Y29weTtDb3B5cmlnaHQgU1RFTSBjb3Jwb3JhdGlvbiAyMDA2CisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic291cmNlIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIEEgcmVmZXJlbmNlIHRvIGEgcmVzb3VyY2UgZnJvbSB3aGljaCB0aGUgcHJlc2VudCByZXNvdXJjZSBpcyBkZXJpdmVkLiAgZS5nLiwgVVMgQ2Vuc3VzIFRpZ2VyIGZpbGVzCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3ViamVjdCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBUaGUgdG9waWMgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIHJlc291cmNlLiAgS2V5d29yZHMgb3Iga2V5IHBocmFzZXMgdGhlIGRlc2NyaWJlIHRoZSB0b3BpYyBvZiB0aGUgcmVzb3VyY2UuIGUuZy4sIFVuaXRlZCBTdGF0ZXMKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIFRoZSBuYXR1cmUgb3IgZ2VucmUgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIHJlc291cmNlLiAgU2VlICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL2R1YmxpbmNvcmUub3JnL2RvY3VtZW50cy9kY21pLXR5cGUtdm9jYWJ1bGFyeS8mcXVvdDsmZ3Q7aHR0cDovL2R1YmxpbmNvcmUub3JnL2RvY3VtZW50cy9kY21pLXR5cGUtdm9jYWJ1bGFyeS8mbHQ7L2EmZ3Q7IGUuZywgIGh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9EYXRhc2V0IGZvciBhIHNldCBvZiBkYXRhIG9yCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFuZ3VhZ2UiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgQSBsYW5ndWFnZSBvZiB0aGUgaW50ZWxsZWN0dWFsIGNvbnRlbnQgb2YgdGhlIHJlc291cmNlLiBVc2UgCismbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMwNjYudHh0JnF1b3Q7Jmd0OworUkZDJmFtcDtuYnNwOzMwNjYgJmx0Oy9hJmd0OyBhbmQgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmxvYy5nb3Yvc3RhbmRhcmRzL2lzbzYzOS0yLyZxdW90OyZndDtJU08mYW1wO25ic3A7NjM5Jmx0Oy9hJmd0OyBlLmcuLCBlbi1HQiBmb3IgRW5nbGlzaCB1c2VkIGluIHRoZSBVbml0ZWQgS2luZ2RvbS4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiaWJsaW9ncmFwaGljQ2l0YXRpb24iIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgQSBiaWJsaW9ncmFwaGljIHJlZmVyZW5jZSBmb3IgdGhlIHJlc291cmNlLiBlLmcuLCBGb3JkLCBELkEuLCAmcXVvdDtTVEVNIGFuZCB0aGUgYXJ0IG9mIGNvbXB1dGVyIG1haW50ZW5hbmNlJnF1b3Q7LCBKb3VybmFsIG9mIEZvb2JhciwgMjAwNi4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjcmVhdGVkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIERhdGUgb2YgY3JlYXRpb24gb2YgdGhlIHJlc291cmNlLiBFbmNvZGVkIGluIElTTyZhbXA7bmJzcDs4NjAxICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy53My5vcmcvVFIvTk9URS1kYXRldGltZSZxdW90OyZndDtodHRwOi8vd3d3LnczLm9yZy9UUi9OT1RFLWRhdGV0aW1lJmx0Oy9hJmd0Oy4gIEJhc2ljYWxseSwgdGhlIGZvcm1hdCBpczogWVlZWS1NTS1ERCBlLmcuLCAgMjAwNi0wMy0yOQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxpY2Vuc2UiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgQSBsZWdhbCBkb2N1bWVudCBnaXZpbmcgb2ZmaWNpYWwgcGVybWlzc2lvbiB0byBkbyBzb21ldGhpbmcgd2l0aCB0aGUgcmVzb3VyY2UuICBCZXN0IHByYWN0aWNlIGlzIHRvIHVzZSBhIFVSSSB0byB0aGUgc3BlY2lmaWMgbGljZW5zZS4gIGUuZy4sIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2UvCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVxdWlyZXMiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgVGhlIGRlc2NyaWJlZCByZXNvdXJjZSByZXF1aXJlcyB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZSB0byBzdXBwb3J0IGl0cyBmdW5jdGlvbiwgZGVsaXZlcnksIG9yIGNvaGVyZW5jZSBvZiBjb250ZW50LiAgSW4gU1RFTSB0aGlzIGlzIHRoZSBVUkkgdGhhdCBpcyB0aGUgaWRlbnRpZmllciBvZiB0aGUgcmVxdWlyZWQgcmVzb3VyY2UuICBlLmcuLCBzdGVtOi9ncmFwaHMvc2FtcGxlL3NhbXBsZTEuZ3JhcGgKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcGF0aWFsIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIFNwYXRpYWwgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBpbnRlbGxlY3R1YWwgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuICBTZWUgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmR1YmxpbmNvcmUub3JnL2RvY3VtZW50cy9kY21pLXBvaW50LyZxdW90OyZndDtodHRwOi8vd3d3LmR1YmxpbmNvcmUub3JnL2RvY3VtZW50cy9kY21pLXBvaW50LyZsdDsvYSZndDsgIEhvd2V2ZXIsIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGEgVVJJIHRvIGEgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhY3R1YWwgbGF0L2xvbmcgZGF0YSB0aGF0IGRlc2NyaWJlcyBhIHBvbHlnb24gdGhhdCBkZWZpbmVzIHRoZSBzcGF0aWFsIG91dGxpbmUgb2YgYSBwbGFjZS4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWxpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBEYXRlIChvZnRlbiBhIHJhbmdlKSBvZiB2YWxpZHR5IG9mIGEgcmVzb3VyY2UgZW5jb2RlZCBpbiBJU08mYW1wO25ic3A7ODYwMSAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWUmcXVvdDsmZ3Q7aHR0cDovL3d3dy53My5vcmcvVFIvTk9URS1kYXRldGltZSZsdDsvYSZndDsuIGUuZy4gc3RhcnQ9MjAwNi0wMy0yOTsgZW5kPTIwMDYtMDMtMjk7IG9yIHNpbXBseSBzdGFydD0yMDA2LTAzLTI5OyBpZiB0aGVyZSBpcyBubyBlbmQgdG8gdGhlIHZhbGlkaXR5CisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2F0ZWdvcnlfaWQiIHR5cGU9InN0cmluZyIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0iLyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgSWYgdGhlIHJlc291cmNlIHRoYXQgdGhpcyBEdWJsaW4gQ29yZSBpbnN0YW5jZSBkZXNjcmliZXMgaXMgaW4gYSBjYXRlZ29yeSB0aGVuIHRoaXMgaXMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjYXRlZ29yeS4gJmx0O3NhbXAmZ3Q7Y29tLmlibS5hbG1hZGVuLnN0ZW0udGVzdC5jYXRlZ29yeS5ncmFwaC50ZXN0Jmx0Oy9zYW1wJmd0OworICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NjaGVtYS9leHBlcmltZW50LmV4c2QgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc2NoZW1hL2V4cGVyaW1lbnQuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjA3OTAzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NjaGVtYS9leHBlcmltZW50LmV4c2QKQEAgLTAsMCArMSw4OCBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Cis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnN0ZW0uY29yZSIgaWQ9ImV4cGVyaW1lbnQiIG5hbWU9IiVFUF9FeHBlcmltZW50Ii8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFRoZSBTVEVNIHN5c3RlbSBjYW4gaW5jb3Jwb3JhdGUgRXhwZXJpbWVudCBkZWZpbml0aW9ucyBwcm92aWRlZCBieSBwbHVnLWlucy4gIEEgcGx1Zy1pbiB0aGF0IGV4dGVuZHMgdGhlICZxdW90O2V4cGVyaW1lbnQmcXVvdDsgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIHRoZSBkZWZpbml0aW9uIG9mIGEgRXhwZXJpbWVudCAgSXQgY2FuIGFsc28gZGVmaW5lICZxdW90O2NhdGFnb3JpZXMmcXVvdDsgaW50byB3aGljaCBFeHBlcmltZW50cyBjYW4gYmUgZ3JvdXBlZC4KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImR1Ymxpbl9jb3JlLmV4c2QiLz4KKworICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249InN0ZW1fY2F0ZWdvcnkuZXhzZCIvPgorCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KKyAgICAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgIDxhcHBpbmZvPgorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgorICAgICAgICAgICAgICAgPC9hcHBpbmZvPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpaW5mbyIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NjaGVtYS9ncmFwaC5leHNkIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NjaGVtYS9ncmFwaC5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNzM4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc2NoZW1hL2dyYXBoLmV4c2QKQEAgLTAsMCArMSwxMjggQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9ImNvbS5pYm0uYWxtYWRlbi5zdGVtLmNvcmUiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49ImNvbS5pYm0uYWxtYWRlbi5zdGVtLmNvcmUiIGlkPSJncmFwaCIgbmFtZT0iU1RFTSBncmFwaCBleHRlbnNpb24gcG9pbnQiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhlIFNURU0gc3lzdGVtIGNhbiBpbmNvcnBvcmF0ZSBHcmFwaCBkZWZpbml0aW9ucyBhbmQgZnJhZ21lbnRzIG9mIEdyYXBoIGRlZmluaXRpb25zIHByb3ZpZGVkIGJ5IHBsdWctaW5zLiAgQSBwbHVnLWluIHRoYXQgZXh0ZW5kcyB0aGUgJnF1b3Q7Z3JhcGgmcXVvdDsgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIHRoZSBkZWZpbml0aW9uIG9mIGEgR3JhcGggb3IgR3JhcGggZnJhZ21lbnQuICBJdCBjYW4gYWxzbyBkZWZpbmUgJnF1b3Q7Y2F0YWdvcmllcyZxdW90OyBpbnRvIHdoaWNoIEdyYXBocyBjYW4gYmUgZ3JvdXBlZC4KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImR1Ymxpbl9jb3JlLmV4c2QiLz4KKworICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249InN0ZW1fY2F0ZWdvcnkuZXhzZCIvPgorCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPGNob2ljZT4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3RlbV9jYXRlZ29yeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkdWJsaW5fY29yZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgPC9jaG9pY2U+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgMC4wLjAKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIHRoZSBncmFwaCBleHRlbnNpb24gcG9pbnQgdXNhZ2UuCismbHQ7cCZndDsKKyZsdDtwcmUmZ3Q7CisgJmx0O2V4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9JnF1b3Q7Y29tLmlibS5hbG1hZGVuLnN0ZW0uY29yZS5ncmFwaCZxdW90OyZndDsKKyAgICAgICZsdDtjYXRlZ29yeQorICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmlibS5hbG1hZGVuLnN0ZW0udGVzdC5jYXRlZ29yeS5ncmFwaC5iYXNpYyZxdW90OworICAgICAgICAgICAgbmFtZT0mcXVvdDtCYXNpYyZxdW90OworICAgICAgICAgICAgcGFyZW50X2lkPSZxdW90O2NvbS5pYm0uYWxtYWRlbi5zdGVtLnRlc3QuY2F0ZWdvcnkuZ3JhcGgudGVzdCZxdW90Oy8mZ3Q7CisgICAgICAmbHQ7ZHVibGluX2NvcmUKKyAgICAgICAgICAgIGNhdGVnb3J5X2lkPSZxdW90O2NvbS5pYm0uYWxtYWRlbi5zdGVtLnRlc3QuY2F0ZWdvcnkuZ3JhcGguYmFzaWMmcXVvdDsKKyAgICAgICAgICAgIGNyZWF0ZWQ9JnF1b3Q7MjAwNi0wNC0yNCZxdW90OworICAgICAgICAgICAgY3JlYXRvcj0mcXVvdDtEYW5pZWwgRm9yZCZxdW90OworICAgICAgICAgICAgZGF0ZT0mcXVvdDsyMDA2LTA0LTI0JnF1b3Q7CisgICAgICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDtBIGdyYXBoIHdpdGggYSBzaW5nbGUgbm9kZSwgbm90aGluZyBlbHNlLCBmb3IgdGVzdGluZyZxdW90OworICAgICAgICAgICAgZm9ybWF0PSZxdW90O2h0dHA6Ly8vY29tL2libS9hbG1hZGVuL3N0ZW0vZ3JhcGguZWNvcmUmcXVvdDsKKyAgICAgICAgICAgIGlkZW50aWZpZXI9JnF1b3Q7c3RlbTpjb20uaWJtLmFsbWFkZW4uc3RlbS50ZXN0LmdyYXBoLm9uZW5vZGUxJnF1b3Q7CisgICAgICAgICAgICBzdWJqZWN0PSZxdW90O1Rlc3RpbmcmcXVvdDsKKyAgICAgICAgICAgIHRpdGxlPSZxdW90O09uZSBOb2RlICMxJnF1b3Q7CisgICAgICAgICAgICB2YWxpZD0mcXVvdDtzdGFydD0yMDA2LTAzLTI5OyZxdW90Oy8mZ3Q7CisgICAgICAmbHQ7ZHVibGluX2NvcmUKKyAgICAgICAgICAgIGNhdGVnb3J5X2lkPSZxdW90O2NvbS5pYm0uYWxtYWRlbi5zdGVtLnRlc3QuY2F0ZWdvcnkuZ3JhcGguYmFzaWMmcXVvdDsKKyAgICAgICAgICAgIGNyZWF0ZWQ9JnF1b3Q7MjAwNi0wNC0yNCZxdW90OworICAgICAgICAgICAgY3JlYXRvcj0mcXVvdDtEYW5pZWwgRm9yZCZxdW90OworICAgICAgICAgICAgZGF0ZT0mcXVvdDsyMDA2LTA0LTI0JnF1b3Q7CisgICAgICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDtBIGdyYXBoIHdpdGggYSBzaW5nbGUgbm9kZSwgbm90aGluZyBlbHNlLCBmb3IgdGVzdGluZyZxdW90OworICAgICAgICAgICAgZm9ybWF0PSZxdW90O2h0dHA6Ly8vY29tL2libS9hbG1hZGVuL3N0ZW0vZ3JhcGguZWNvcmUmcXVvdDsKKyAgICAgICAgICAgIGlkZW50aWZpZXI9JnF1b3Q7c3RlbTpjb20uaWJtLmFsbWFkZW4uc3RlbS50ZXN0LmdyYXBoLm9uZW5vZGUyJnF1b3Q7CisgICAgICAgICAgICBzdWJqZWN0PSZxdW90O1Rlc3RpbmcmcXVvdDsKKyAgICAgICAgICAgIHRpdGxlPSZxdW90O09uZSBOb2RlICMyJnF1b3Q7CisgICAgICAgICAgICB2YWxpZD0mcXVvdDtzdGFydD0yMDA2LTAzLTI5OyZxdW90Oy8mZ3Q7CisgICAmbHQ7L2V4dGVuc2lvbiZndDsKKyZsdDsvcHJlJmd0OworJmx0Oy9wJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIE5vbmUKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgTm9uZS4KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIAorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zY2hlbWEvZ3JhcGhnZW5lcmF0b3IuZXhzZCBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zY2hlbWEvZ3JhcGhnZW5lcmF0b3IuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWFhOGRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NjaGVtYS9ncmFwaGdlbmVyYXRvci5leHNkCkBAIC0wLDAgKzEsMTA1IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Cis8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlIiBpZD0iZ3JhcGhnZW5lcmF0b3IiIG5hbWU9IlNURU0gR3JhcGggR2VuZXJhdG9yIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIG5ldyB3YXlzIG9mIGltcG9ydGluZyBncmFwaHMgaW50byBTVEVNCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc2NoZW1hL2R1Ymxpbl9jb3JlLmV4c2QiLz4KKworICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KKyAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+CisgICAgICAgICA8L2FwcGluZm8+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNsYXNzZGVmIi8+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImR1Ymxpbl9jb3JlIi8+CisgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcGluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9ImNsYXNzZGVmIj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGhnZW5lcmF0b3IuaW1wbC5HcmFwaEdlbmVyYXRvckltcGw6b3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoZ2VuZXJhdG9yLkdyYXBoR2VuZXJhdG9yIi8+CisgICAgICAgICAgICAgICA8L2FwcGluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIDEuMDEKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgbmV3IHdheXMgb2YgaW1wb3J0aW5nIGdyYXBocyBpbnRvIFNURU0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NjaGVtYS9tb2RlbC5leHNkIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NjaGVtYS9tb2RlbC5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MzRkNGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc2NoZW1hL21vZGVsLmV4c2QKQEAgLTAsMCArMSwyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIvPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zY2hlbWEvcHJlZGljYXRlLmV4c2QgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc2NoZW1hL3ByZWRpY2F0ZS5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5M2ViM2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc2NoZW1hL3ByZWRpY2F0ZS5leHNkCkBAIC0wLDAgKzEsODggQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KKzxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUiIGlkPSJwcmVkaWNhdGUiIG5hbWU9IiVFUF9QcmVkaWNhdGUiLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhlIFNURU0gc3lzdGVtIGNhbiBpbmNvcnBvcmF0ZSBQcmVkaWNhdGUgZGVmaW5pdGlvbnMgcHJvdmlkZWQgYnkgcGx1Zy1pbnMuICBBIHBsdWctaW4gdGhhdCBleHRlbmRzIHRoZSAmcXVvdDtwcmVkaWNhdGUmcXVvdDsgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIHRoZSBkZWZpbml0aW9uIG9mIGEgUHJlZGljYXRlICBJdCBjYW4gYWxzbyBkZWZpbmUgJnF1b3Q7Y2F0YWdvcmllcyZxdW90OyBpbnRvIHdoaWNoIFByZWRpY2F0ZXMgY2FuIGJlIGdyb3VwZWQuCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzdGVtX2NhdGVnb3J5LmV4c2QiLz4KKworICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImR1Ymxpbl9jb3JlLmV4c2QiLz4KKworICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KKyAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+CisgICAgICAgICA8L2FwcGluZm8+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zY2hlbWEvc2NlbmFyaW8uZXhzZCBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zY2hlbWEvc2NlbmFyaW8uZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWU4Y2I5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NjaGVtYS9zY2VuYXJpby5leHNkCkBAIC0wLDAgKzEsOTUgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9ImNvbS5pYm0uYWxtYWRlbi5zdGVtLmNvcmUiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49ImNvbS5pYm0uYWxtYWRlbi5zdGVtLmNvcmUiIGlkPSJzY2VuYXJpbyIgbmFtZT0iU1RFTSBzY2VuYXJpbyBleHRlbnNpb24gcG9pbnQiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhlIFNURU0gc3lzdGVtIGNhbiBpbmNvcnBvcmF0ZSBtb2RlbGluZyBTY2VuYXJpbyBkZWZpbml0aW9ucyBwcm92aWRlZCBieSBwbHVnLWlucy4gIEEgcGx1Zy1pbiB0aGF0IGV4dGVuZHMgdGhlICZxdW90O3NjZW5hcmlvJnF1b3Q7IGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyB0aGUgZGVmaW5pdGlvbiBvZiBhIG1vZGVsaW5nIFNjZW5hcmlvLiAgSXQgY2FuIGFsc28gZGVmaW5lICZxdW90O2NhdGFnb3JpZXMmcXVvdDsgaW50byB3aGljaCBTY2VuYXJpb3MgY2FuIGJlIGdyb3VwZWQuCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJkdWJsaW5fY29yZS5leHNkIi8+CisKKyAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzdGVtX2NhdGVnb3J5LmV4c2QiLz4KKworICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxjaG9pY2U+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9InN0ZW1fY2F0ZWdvcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZHVibGluX2NvcmUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgIDwvY2hvaWNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcEluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcEluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIDAuMC4wCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBOb25lLgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBOb25lLgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NjaGVtYS9zZXF1ZW5jZXIuZXhzZCBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zY2hlbWEvc2VxdWVuY2VyLmV4c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU4YThjMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zY2hlbWEvc2VxdWVuY2VyLmV4c2QKQEAgLTAsMCArMSwxMDQgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9ImNvbS5pYm0uYWxtYWRlbi5zdGVtLmNvcmUiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49ImNvbS5pYm0uYWxtYWRlbi5zdGVtLmNvcmUiIGlkPSJzZXF1ZW5jZXIiIG5hbWU9IlNURU0gc2VxdWVuY2VyIGV4dGVuc2lvbiBwb2ludCIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBUaGUgU1RFTSBzeXN0ZW0gYWxsb3dzICZxdW90O3NlcXVlbmNlcnMmcXVvdDsgdG8gY29udHJvbCBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIGdyYXBoLiBBIHBsdWctaW4gdGhhdCBleHRlbmRzIHRoZSAmcXVvdDtzZXF1ZW5jZXImcXVvdDsgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgc2VxdWVuY2VyLgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ic3RlbV9jYXRlZ29yeS5leHNkIi8+CisKKyAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJkdWJsaW5fY29yZS5leHNkIi8+CisKKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9InN0ZW1fY2F0ZWdvcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZHVibGluX2NvcmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgMC4wLjAKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIHRoZSBzZXF1ZW5jZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlLgorJmx0O3AmZ3Q7CismbHQ7cHJlJmd0OworICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7Y29tLmlibS5hbG1hZGVuLnN0ZW0uY29yZS5vYnNlcnZlciZxdW90OyZndDsKKyAgJmx0O3NlcXVlbmNlcgorICAgbmFtZT0mcXVvdDtTZXF1ZW50aWFsIFNlcXVlbmNlciZxdW90OworICAgY2xhc3M9JnF1b3Q7Y29tLmlibS5hbG1hZGVuLnN0ZW0uc2VxdWVuY2VyLlNlcXVlbnRpYWxTZXF1ZW5jZXImcXVvdDsgLyZndDsKKyAmbHQ7L2V4dGVuc2lvbiZndDsKKyZsdDsvcHJlJmd0OworJmx0Oy9wJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc2NoZW1hL3NvbHZlci5leHNkIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NjaGVtYS9zb2x2ZXIuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmJmZjJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NjaGVtYS9zb2x2ZXIuZXhzZApAQCAtMCwwICsxLDEwNSBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJjb20uaWJtLmFsbWFkZW4uc3RlbS5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KKzxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBpbmZvPg0KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49ImNvbS5pYm0uYWxtYWRlbi5zdGVtLmNvcmUiIGlkPSJzb2x2ZXIiIG5hbWU9IiVFUF9Tb2x2ZXIiLz4NCisgICAgICA8L2FwcGluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc2NoZW1hL2R1Ymxpbl9jb3JlLmV4c2QiLz4NCisNCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KKyAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgIDxhcHBpbmZvPg0KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4NCisgICAgICAgICA8L2FwcGluZm8+DQorICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgIDxjb21wbGV4VHlwZT4NCisgICAgICAgICA8c2VxdWVuY2U+DQorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjbGFzc2RlZiIvPg0KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZHVibGluX2NvcmUiLz4NCisgICAgICAgICA8L3NlcXVlbmNlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICA8YXBwaW5mbz4NCisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQorICAgICAgICAgICAgICAgPC9hcHBpbmZvPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICA8L2NvbXBsZXhUeXBlPg0KKyAgIDwvZWxlbWVudD4NCisNCisgICA8ZWxlbWVudCBuYW1lPSJjbGFzc2RlZiI+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxhcHBpbmZvPg0KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuaW1wbC5Tb2x2ZXJJbXBsOm9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5Tb2x2ZXIiLz4NCisgICAgICAgICAgICAgICA8L2FwcGluZm8+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgIDwvY29tcGxleFR5cGU+DQorICAgPC9lbGVtZW50Pg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBpbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCisgICAgICA8L2FwcGluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQ0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcGluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KKyAgICAgIDwvYXBwaW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwaW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4NCisgICAgICA8L2FwcGluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBpbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCisgICAgICA8L2FwcGluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKw0KKzwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zY2hlbWEvc3RlbV9jYXRlZ29yeS5leHNkIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NjaGVtYS9zdGVtX2NhdGVnb3J5LmV4c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzYzA1YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zY2hlbWEvc3RlbV9jYXRlZ29yeS5leHNkCkBAIC0wLDAgKzEsODQgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9ImNvbS5pYm0uYWxtYWRlbi5zdGVtLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Cis8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0iY29tLmlibS5hbG1hZGVuLnN0ZW0uY29yZSIgaWQ9InN0ZW1fY2F0ZWdvcnkiIG5hbWU9IlNURU0gQ2F0ZWdvcnkiLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGVsZW1lbnQgbmFtZT0ic3RlbV9jYXRlZ29yeSI+CisgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgQSBjYXRlZ29yeSBpcyBhIGhpZXJhcmNoaWNhbCBncm91cCB3aXRoIGEgcGFyZW50IGFuZCBjaGlsZGVybi4gIEl0IGlzIG1lYW50IHRvIG9yZ2FuaXplIElkZW50aWZpYWJsZSByZXNvdXJjZXMgYW5kIG90aGVyIGNvbXBvbmVudHMuCisgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWRlbnRpZmllciB0aGUgZGVmaW5lcyBhIFNURU0gY2F0ZWdvcnkgaW50byB3aGljaCBhbiBJZGVudGlmaWFibGUgY2FuIGJlIGdyb3VwZWQuCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBUaGUgdHJhbnNsYXRhYmxlIG5hbWUgb2YgdGhlIGNhdGVnb3J5LgorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcGluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyZW50X2lkIiB0eXBlPSJzdHJpbmciIHVzZT0iZGVmYXVsdCIgdmFsdWU9Ii8iPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NjaGVtYS90cmlnZ2VyLmV4c2QgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc2NoZW1hL3RyaWdnZXIuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWViODUyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NjaGVtYS90cmlnZ2VyLmV4c2QKQEAgLTAsMCArMSw4OCBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Cis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnN0ZW0uY29yZSIgaWQ9InRyaWdnZXIiIG5hbWU9IiVFUF9UcmlnZ2VyIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFRoZSBTVEVNIHN5c3RlbSBjYW4gaW5jb3Jwb3JhdGUgVHJpZ2dlciBkZWZpbml0aW9ucyBwcm92aWRlZCBieSBwbHVnLWlucy4gIEEgcGx1Zy1pbiB0aGF0IGV4dGVuZHMgdGhlICZxdW90O3RyaWdnZXImcXVvdDsgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIHRoZSBkZWZpbml0aW9uIG9mIGEgVHJpZ2dlci4gIEl0IGNhbiBhbHNvIGRlZmluZSAmcXVvdDtjYXRhZ29yaWVzJnF1b3Q7IGludG8gd2hpY2ggVHJpZ2dlcnMgY2FuIGJlIGdyb3VwZWQuCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJkdWJsaW5fY29yZS5leHNkIi8+CisKKyAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzdGVtX2NhdGVnb3J5LmV4c2QiLz4KKworICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KKyAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+CisgICAgICAgICA8L2FwcGluZm8+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy9maWxlL0ZpbGUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy9maWxlL0ZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTlkZjZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FkYXB0ZXJzL2ZpbGUvRmlsZS5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5maWxlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CisKKworcHVibGljIGludGVyZmFjZSBGaWxlICB7CisKKwlwdWJsaWMgWE1JUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKTsKKwkKKwlwdWJsaWMgSWRlbnRpZmlhYmxlIGdldElkZW50aWZpYWJsZSgpOworCQorCXB1YmxpYyB2b2lkIGRlbGV0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgdm9pZCByZW5hbWUoU3RyaW5nIG5ld25hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy9maWxlL0ZpbGVBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYWRhcHRlcnMvZmlsZS9GaWxlQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OWE0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYWRhcHRlcnMvZmlsZS9GaWxlQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5maWxlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKKworCisKK3B1YmxpYyBjbGFzcyBGaWxlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgRmlsZSB7CisKKwlwdWJsaWMgWE1JUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7CisJCS8vIE92ZXJyaWRlCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIGRlbGV0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCS8vIG92ZXJyaWRlCisJfQorCisJcHVibGljIHZvaWQgcmVuYW1lKFN0cmluZyBuZXduYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkvLyBvdmVycmlkZQorCX0KKworCXB1YmxpYyBJZGVudGlmaWFibGUgZ2V0SWRlbnRpZmlhYmxlKCkgeworCQkvLyBvdmVycmlkZQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYWRhcHRlcnMvZmlsZS9GaWxlQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy9maWxlL0ZpbGVBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNGExMDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYWRhcHRlcnMvZmlsZS9GaWxlQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMuZmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7CisKKworYWJzdHJhY3QgcHVibGljIGNsYXNzIEZpbGVBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7CisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKKwkJcmV0dXJuIG5ldyBDbGFzc1tdIHsgRmlsZS5jbGFzcyB9OworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy9maWxlL0lkZW50aWZpYWJsZUZpbGVBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYWRhcHRlcnMvZmlsZS9JZGVudGlmaWFibGVGaWxlQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExODBjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYWRhcHRlcnMvZmlsZS9JZGVudGlmaWFibGVGaWxlQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5maWxlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKKworcHVibGljIGNsYXNzIElkZW50aWZpYWJsZUZpbGVBZGFwdGVyIGV4dGVuZHMgRmlsZUFkYXB0ZXIgeworCisJQE92ZXJyaWRlCisJcHVibGljIFhNSVJlc291cmNlIGdldFJlc291cmNlKCkgeworCQlJZGVudGlmaWFibGUgdGFyZ2V0ID0gKElkZW50aWZpYWJsZSl0aGlzLmdldFRhcmdldCgpOworCQkKKwkJWE1JUmVzb3VyY2VJbXBsIHhtaSA9IChYTUlSZXNvdXJjZUltcGwpdGFyZ2V0LmVSZXNvdXJjZSgpOworCQkKKwkJcmV0dXJuIHhtaTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGVsZXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJWE1JUmVzb3VyY2UgciA9IHRoaXMuZ2V0UmVzb3VyY2UoKTsKKwkJci5kZWxldGUobnVsbCk7CisJCQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlbmFtZShTdHJpbmcgbmV3bmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLy8gb3ZlcnJpZGUKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIElkZW50aWZpYWJsZSBnZXRJZGVudGlmaWFibGUoKSB7CisJCXJldHVybiAoSWRlbnRpZmlhYmxlKWdldFRhcmdldCgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy9maWxlL0lkZW50aWZpYWJsZUZpbGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FkYXB0ZXJzL2ZpbGUvSWRlbnRpZmlhYmxlRmlsZUFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I3NzlmNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy9maWxlL0lkZW50aWZpYWJsZUZpbGVBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5maWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CisKK3B1YmxpYyBjbGFzcyBJZGVudGlmaWFibGVGaWxlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBGaWxlQWRhcHRlckZhY3RvcnkgIHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsCisJICogICAgICBqYXZhLmxhbmcuQ2xhc3MpCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKGZpbmFsIE9iamVjdCBhZGFwdGFibGVPYmplY3QsCisJCQlmaW5hbCBDbGFzcyBhZGFwdGVyVHlwZSkgeworCQlGaWxlIHJldFZhbHVlID0gbnVsbDsKKwkJLy8gQW4gaWRlbnRpZmlhYmxlCisJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJZGVudGlmaWFibGUKKwkJCQkmJiBhZGFwdGVyVHlwZS5lcXVhbHMoRmlsZS5jbGFzcykpIHsKKwkJCS8vIFllcworCQkJCisJCQlJZGVudGlmaWFibGVGaWxlQWRhcHRlciBpZmEgPSBuZXcgSWRlbnRpZmlhYmxlRmlsZUFkYXB0ZXIoKTsKKwkJCWlmYS5zZXRUYXJnZXQoKE5vdGlmaWVyKWFkYXB0YWJsZU9iamVjdCk7CisJCQlyZXRWYWx1ZSA9IGlmYTsKKwkJfSAvLyBpZgorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRBZGFwdGVyCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYWRhcHRlcnMvaGlzdG9yeS9IaXN0b3J5RXh0ZW5kZWRMaXN0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FkYXB0ZXJzL2hpc3RvcnkvSGlzdG9yeUV4dGVuZGVkTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmVlMThjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FkYXB0ZXJzL2hpc3RvcnkvSGlzdG9yeUV4dGVuZGVkTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDIxIEBACisvLyBIaXN0b3J5RXh0ZW5kZWRMaXN0ZW5lci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMuaGlzdG9yeTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHdhbnQgdG8gYmUgbm90aWZpZWQgd2hlbiBhCisgKiB7QGxpbmsgSGlzdG9yeVByb3ZpZGVyfSBjYW4gcHJvdmlkZSBhZGRpdGlvbmFsIGhpc3RvcnkgdmFsdWVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEhpc3RvcnlFeHRlbmRlZExpc3RlbmVyIHsKKwl2b2lkIGhpc3RvcnlFeHRlbmRlZChmaW5hbCBIaXN0b3J5UHJvdmlkZXJBZGFwdGVyIGhpc3RvcnlQcm92aWRlckFkYXB0ZXIpOworfSAvLyBIaXN0b3J5RXh0ZW5kZWRMaXN0ZW5lcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FkYXB0ZXJzL2hpc3RvcnkvSGlzdG9yeVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYWRhcHRlcnMvaGlzdG9yeS9IaXN0b3J5UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTVmZGExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FkYXB0ZXJzL2hpc3RvcnkvSGlzdG9yeVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLy8gSGlzdG9yeVByb3ZpZGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5oaXN0b3J5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgcHJvdmlkZSBpbnN0YW5jZXMgb2YKKyAqIHtAbGluayBJZGVudGlmaWFibGVzfSBhcyB0aGV5IGV4aXN0ZWQgaW4gcHJldmlvdXMgKGhpc3RvcmljKSBjeWNsZXMgb2YgYQorICoge0BsaW5rIFNpbXVsYXRpb259LgorICovCitwdWJsaWMgaW50ZXJmYWNlIEhpc3RvcnlQcm92aWRlciB7CisKKwkvKioKKwkgKiBAcGFyYW0gdGltZQorCSAqICAgICAgICAgICAgdGhlIHRpbWUgaW4gYSB7QGxpbmsgU2ltdWxhdGlvbn0gdGhhdCBzcGVjaWZpZXMgdGhlIGluc3RhbmNlCisJICogICAgICAgICAgICBvZiB0aGUge0AgSWRlbnRpZmlhYmxlfSB0byByZXR1cm4KKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfSBpbnN0YW5jZSB0aGF0IHdhcyBjdXJyZW50IGluIHRoZSBzdGF0ZQorCSAqICAgICAgICAgb2YgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGh9IGF0IHRoZSA8Y29kZT50aW1lPC9jb2RlPi4KKwkgKi8KKwlJZGVudGlmaWFibGUgZ2V0SW5zdGFuY2UoU1RFTVRpbWUgdGltZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIGFsbCBvZiB0aGUgaGlzdG9yaWMgaW5zdGFuY2VzIG9mIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfS4gVGhlCisJICogICAgICAgICB2YWx1ZSBhdCBpbmRleCAwIGlzIHRoZSBlYXJsaWVzdC4KKwkgKi8KKwlJZGVudGlmaWFibGVbXSBnZXRBbGxIaXN0b3JpY0luc3RhbmNlcygpOworCisJCisJLyoqCisJICogQHJldHVybiBUaGUgaGlzdG9yaWMgaW5zdGFuY2VzIHRoYXQgbWF0Y2ggdGhlIHRpbWUgdmFsdWVzIGluCisJICogdGhlIGFycmF5IHRpbWVSYW5nZSB7QGxpbmsgSWRlbnRpZmlhYmxlfS4gCisJICovCisJSWRlbnRpZmlhYmxlW10gZ2V0SGlzdG9yaWNJbnN0YW5jZXMoU1RFTVRpbWVbXSB0aW1lUmFuZ2UpOworCisJCisJLyoqCisJICogQHJldHVybiBhbGwgb2YgdGhlIHRpbWUgdmFsdWVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgaGlzdG9yaWMgdmFsdWVzLgorCSAqICAgICAgICAgVGhlIGZpcnN0IHZhbHVlIG9mIHRoZSBjb2xsZWN0aW9uIGlzIHRoZSB0aW1lIHZhbHVlIGZvciB0aGUgZmlyc3QKKwkgKiAgICAgICAgIHZhbHVlIG9mIHRoZSBjb2xsZWN0aW9uIHJldHVybmVkIGJ5CisJICovCisJU1RFTVRpbWVbXSBnZXRBbGxIaXN0b3JpY1RpbWVWYWx1ZXMoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGVhcmxpZXN0IHRpbWUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXRpdmUgdmFsdWUuCisJICovCisJU1RFTVRpbWUgZ2V0RWFybGllc3RUaW1lVmFsdWUoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGVhcmxpZXN0IChsb3dlc3QpIGN5Y2xlIG51bWJlcgorCSAqLworCWludCBnZXRFYXJsaWVzdEN5Y2xlTnVtYmVyKCk7CisKK30gLy8gSGlzdG9yeVByb3ZpZGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYWRhcHRlcnMvaGlzdG9yeS9IaXN0b3J5UHJvdmlkZXJBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYWRhcHRlcnMvaGlzdG9yeS9IaXN0b3J5UHJvdmlkZXJBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljZmMxMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy9oaXN0b3J5L0hpc3RvcnlQcm92aWRlckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLy8gSGlzdG9yeVByb3ZpZGVyQWRhcHRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMuaGlzdG9yeTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlJlc2V0dGFibGVBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuU1RFTVRpbWVJbXBsOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgSGlzdG9yeVByb3ZpZGVyfS4KKyAqLworcHVibGljIGNsYXNzIEhpc3RvcnlQcm92aWRlckFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzCisJCUhpc3RvcnlQcm92aWRlciwgUmVzZXR0YWJsZUFkYXB0ZXIgeworCisJcHJpdmF0ZSBMaXN0PEhpc3RvcnlFeHRlbmRlZExpc3RlbmVyPiBleHRlbnNpb25MaXN0ZW5lcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8SGlzdG9yeUV4dGVuZGVkTGlzdGVuZXI+KCk7CisKKwlwcml2YXRlIGludCBlYXJsaWVzdEN5Y2xlTnVtYmVyID0gMDsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5oaXN0b3J5Lkhpc3RvcnlQcm92aWRlciNnZXRJbnN0YW5jZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUpCisJICovCisJcHVibGljIElkZW50aWZpYWJsZSBnZXRJbnN0YW5jZShTVEVNVGltZSB0aW1lKSB7CisJCXJldHVybiAoSWRlbnRpZmlhYmxlKSBnZXRUYXJnZXQoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuaGlzdG9yeS5IaXN0b3J5UHJvdmlkZXIjZ2V0QWxsSGlzdG9yaWNJbnN0YW5jZXMoKQorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGVbXSBnZXRBbGxIaXN0b3JpY0luc3RhbmNlcygpIHsKKwkJcmV0dXJuIG5ldyBJZGVudGlmaWFibGVbXSB7fTsKKwl9CisKKwkKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuaGlzdG9yeS5IaXN0b3J5UHJvdmlkZXIjZ2V0SGlzdG9yaWNJbnN0YW5jZXMoKQorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGVbXSBnZXRIaXN0b3JpY0luc3RhbmNlcyhTVEVNVGltZVtdIHRpbWVSYW5nZSkgeworCQlyZXR1cm4gIG5ldyBJZGVudGlmaWFibGVbdGltZVJhbmdlLmxlbmd0aF07CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLmhpc3RvcnkuSGlzdG9yeVByb3ZpZGVyI2dldEFsbEhpc3RvcmljVGltZVZhbHVlcygpCisJICovCisJcHVibGljIFNURU1UaW1lW10gZ2V0QWxsSGlzdG9yaWNUaW1lVmFsdWVzKCkgeworCQlyZXR1cm4gbmV3IFNURU1UaW1lW10ge307CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLmhpc3RvcnkuSGlzdG9yeVByb3ZpZGVyI2dldEVhcmxpZXN0Q3ljbGVOdW1iZXIoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0RWFybGllc3RDeWNsZU51bWJlcigpIHsKKwkJcmV0dXJuIGVhcmxpZXN0Q3ljbGVOdW1iZXI7CisJfQorCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguUmVzZXR0YWJsZUFkYXB0ZXIjcmVzZXQoKQorCSAqLworCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlmaXJlSGlzdG9yeUV4dGVuZGVkKCk7CisJfSAvLyByZXNldAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLmhpc3RvcnkuSGlzdG9yeVByb3ZpZGVyI2dldEVhcmxpZXN0VGltZVZhbHVlKCkKKwkgKi8KKwlwdWJsaWMgU1RFTVRpbWUgZ2V0RWFybGllc3RUaW1lVmFsdWUoKSB7CisJCWZpbmFsIFNURU1UaW1lIHJldFZhbHVlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTVEVNVGltZSgpOworCQlyZXRWYWx1ZS5zZXRUaW1lKG5ldyBEYXRlKCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCXJldHVybiB0eXBlID09IEhpc3RvcnlQcm92aWRlci5jbGFzczsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRFeHRlbnNpb25MaXN0ZW5lcihIaXN0b3J5RXh0ZW5kZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlleHRlbnNpb25MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVFeHRlbnNpb25MaXN0ZW5lcihIaXN0b3J5RXh0ZW5kZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlleHRlbnNpb25MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBmaXJlSGlzdG9yeUV4dGVuZGVkKCkgeworCQlmb3IgKEhpc3RvcnlFeHRlbmRlZExpc3RlbmVyIGxpc3RlbmVyIDogZXh0ZW5zaW9uTGlzdGVuZXJzKSB7CisJCQlsaXN0ZW5lci5oaXN0b3J5RXh0ZW5kZWQodGhpcyk7CisJCX0gLy8gZm9yIGVhY2ggSGlzdG9yeUV4dGVuZGVkTGlzdGVuZXIKKwl9CisKK30gLy8gSGlzdG9yeVByb3ZpZGVyQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FkYXB0ZXJzL2hpc3RvcnkvSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy9oaXN0b3J5L0hpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE5OTIyNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy9oaXN0b3J5L0hpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLy8gSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLmhpc3Rvcnk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgY3JlYXRlIGFkYXB0ZXJzIHRoYXQgYWRhcHQKKyAqIHtAbGluayAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3R9cyB0byB7QGxpbmsgSGlzdG9yeVByb3ZpZGVyfXMuCisgKi8KKworcHVibGljIGludGVyZmFjZSBIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCUNvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcworCSAqIHtAbGluayBIaXN0b3J5UHJvdmlkZXJ9IGluc3RhbmNlcy4KKwkgKiA8cD4KKwkgKiBUaGlzIGluc3RhbmNlIGlzIGEge0BsaW5rIENvbXBvc2VkQWRhcHRlckZhY3Rvcnl9IHdoaWNoIG1lYW5zIHRoYXQgaXQKKwkgKiBjb2xsZWN0cyB0b2dldGhlciBvdGhlciB7QGxpbmsgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeX0gYWRhcHRlcgorCSAqIGZhY3Rvcmllcy4gRWFjaCBjbGFzcyB0aGF0IGltcGxlbWVudHMKKwkgKiB7QGxpbmsgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnl9IG5lZWRzIHRvIGFkZCBpdHNlbGYgdG8gdGhpcworCSAqIGluc3RhbmNlIHdpdGggYSBjYWxsIHRvCisJICoge0BsaW5rIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjYWRkQWRhcHRlckZhY3Rvcnkob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpfS4KKwkgKiBUaGlzIHdpbGwgdGhlbiBhbGxvdyBhZGFwdGVycyBjcmVhdGVkIGJ5IHRoYXQgZmFjdG9yeSB0byBiZSBmb3VuZCB3aGVuCisJICogYWRhcHRpbmcgY2xhc3MgaW5zdGFuY2VzIGhhbmRsZWQgYnkgdGhlIG5ldyBmYWN0b3J5LgorCSAqIDxwPgorCSAqIEJhc2ljYWxseSwgaWYgeW91IGNyZWF0ZSBhbiBFTUYgbW9kZWwgYW5kIGRlZmluZSBhCisJICoge0BsaW5rIEhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5fSBmb3IgaXQgc28gdGhhdCB0aGUgY2xhc3NlcyBpbiB0aGF0CisJICogbW9kZWwgY2FuIGJlIGFkYXB0ZWQsIHlvdSBuZWVkIHRvIGhvb2sgdGhhdCBmYWN0b3J5IGludG8gdGhpcyBvbmUgc28gdGhhdAorCSAqIGxhdGVyIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFkYXB0IGEgY2xhc3MgZnJvbSB0aGF0IG1vZGVsIGlzIG1hZGUKKwkgKiB0aGUgYXNzb2NpYXRlZCBmYWN0b3J5IHdpbGwgYmUgZm91bmQuIFlvdSBjYW4gZG8gdGhhdCBieSBhZGRpbmcgdGhlIGxpbmU6CisJICogPGNvZGU+CisJICogSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRkQWRhcHRlckZhY3RvcnkodGhpcyk7CisJICogPC9jb2RlPgorCSAqIHRvIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIG9mIHRoZSBuZXcgZmFjdG9yeSBhZnRlciB0aGUgc3VwZXIgY2FsbC4KKwkgKiBZb3UncmUgbm90IGRvbmUgaG93ZXZlciwgeW91IGFsc28gaGF2ZSB0byAiZm9yY2UiIGFuIGluc3RhbmNlIG9mIHRoZQorCSAqIGNsYXNzIHRvIGJlIGNyZWF0ZWQgc28gdGhhdCB0aGUgY29uc3RydWN0b3IgaXMgcnVuLiBUaGlzIGlzIHR5cGljYWxseQorCSAqIGFjaGlldmVkIGJ5IGFsbG9jYXRpbmcgYW4gaW5zdGFuY2UgaW4gdGhlIDxjb2RlPnN0YXJ0PC9jb2RlPiBtZXRob2Qgb2YKKwkgKiB0aGUgPGNvZGU+QWN0aXZhdG9yPC9jb2RlPiBvZiB0aGUgcGx1Zy1pbiB0aGF0IGRlZmluZXMgdGhlIGZhY3RvcnkuCisJICovCisJSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsIElOU1RBTkNFID0gbmV3IEhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbCgpOworCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBleHRlbmRlZCBieSBjbGFzc2VzIHRoYXQgcHJvdmlkZSBoaXN0b3JpYyB2YWx1ZXMgb2YKKwkgKiB7QGxpbmsgSWRlbnRpZmlhYmxlc30uCisJICovCisJcHVibGljIGNsYXNzIEhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzCisJCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgeworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCQlyZXR1cm4gdHlwZSA9PSBIaXN0b3J5UHJvdmlkZXIuY2xhc3M7CisJCX0gLy8gaXNGYWN0b3J5Rm9yVHlwZQorCX0gLy8gUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbAorCit9IC8vIEhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYWRhcHRlcnMvdGltZS9UaW1lUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy90aW1lL1RpbWVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzY3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYWRhcHRlcnMvdGltZS9UaW1lUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI2IEBACisvLyBUaW1lUHJvdmlkZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLnRpbWU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCBwcm92aWRlIGluc3RhbmNlcyBvZiB7QGxpbmsKKyAqIFNURU1UaW1lfS4KKyAqLworcHVibGljIGludGVyZmFjZSBUaW1lUHJvdmlkZXIgeworCS8qKgorCSAqIEByZXR1cm4gdGhlIHRpbWUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0YW5jZS4KKwkgKi8KKwlTVEVNVGltZSBnZXRUaW1lKCk7Cit9IC8vIFRpbWVQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy90aW1lL1RpbWVQcm92aWRlckFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy90aW1lL1RpbWVQcm92aWRlckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzBlZDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FkYXB0ZXJzL3RpbWUvVGltZVByb3ZpZGVyQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8vIFRpbWVQcm92aWRlckFkYXB0ZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLnRpbWU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIFRpbWVQcm92aWRlcn0uCisgKi8KK3B1YmxpYyBjbGFzcyBUaW1lUHJvdmlkZXJBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBUaW1lUHJvdmlkZXIgeworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLnRpbWUuVGltZVByb3ZpZGVyI2dldFRpbWUoKQorCSAqLworCXB1YmxpYyBTVEVNVGltZSBnZXRUaW1lKCkgeworCQlyZXR1cm4gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTVEVNVGltZSgpOworCX0KKworfSAvLyBUaW1lUHJvdmlkZXJBZGFwdGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FkYXB0ZXJzL3RpbWUvVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy90aW1lL1RpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmOGYxYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy90aW1lL1RpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLy8gVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLnRpbWU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgY3JlYXRlIGFkYXB0ZXJzIHRoYXQgYWRhcHQKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdH1zIHRvIHtAbGluayBUaW1lUHJvdmlkZXJ9cy4KKyAqLworcHVibGljIGludGVyZmFjZSBUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksCisJCUlDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB7QGxpbmsKKwkgKiBUaW1lUHJvdmlkZXJ9IGluc3RhbmNlcy4KKwkgKiA8cD4KKwkgKiBUaGlzIGluc3RhbmNlIGlzIGEge0BsaW5rIENvbXBvc2VkQWRhcHRlckZhY3Rvcnl9IHdoaWNoIG1lYW5zIHRoYXQgaXQKKwkgKiBjb2xsZWN0cyB0b2dldGhlciBvdGhlciB7QGxpbmsgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeX0gYWRhcHRlcgorCSAqIGZhY3Rvcmllcy4gRWFjaCBjbGFzcyB0aGF0IGltcGxlbWVudHMge0BsaW5rCisJICogUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnl9IG5lZWRzIHRvIGFkZCBpdHNlbGYgdG8gdGhpcyBpbnN0YW5jZQorCSAqIHdpdGggYSBjYWxsIHRvIHtAbGluaworCSAqIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjYWRkQWRhcHRlckZhY3Rvcnkob3JnLmVjbGlwc2UKKwkgKiAuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpfS4gVGhpcyB3aWxsIHRoZW4gYWxsb3cgYWRhcHRlcnMKKwkgKiBjcmVhdGVkIGJ5IHRoYXQgZmFjdG9yeSB0byBiZSBmb3VuZCB3aGVuIGFkYXB0aW5nIGNsYXNzIGluc3RhbmNlcyBoYW5kbGVkCisJICogYnkgdGhlIG5ldyBmYWN0b3J5LgorCSAqIDxwPgorCSAqIEJhc2ljYWxseSwgaWYgeW91IGNyZWF0ZSBhbiBFTUYgbW9kZWwgYW5kIGRlZmluZSBhIHtAbGluaworCSAqIFRpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5fSBmb3IgaXQgc28gdGhhdCB0aGUgY2xhc3NlcyBpbiB0aGF0IG1vZGVsIGNhbgorCSAqIGJlIGFkYXB0ZWQsIHlvdSBuZWVkIHRvIGhvb2sgdGhhdCBmYWN0b3J5IGludG8gdGhpcyBvbmUgc28gdGhhdCBsYXRlcgorCSAqIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFkYXB0IGEgY2xhc3MgZnJvbSB0aGF0IG1vZGVsIGlzIG1hZGUgdGhlCisJICogYXNzb2NpYXRlZCBmYWN0b3J5IHdpbGwgYmUgZm91bmQuIFlvdSBjYW4gZG8gdGhhdCBieSBhZGRpbmcgdGhlIGxpbmU6CisJICogPGNvZGU+CisJICogVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRkQWRhcHRlckZhY3RvcnkodGhpcyk7CisJICogPC9jb2RlPiB0byB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBvZiB0aGUgbmV3IGZhY3RvcnkgYWZ0ZXIgdGhlCisJICogc3VwZXIgY2FsbC4gWW91J3JlIG5vdCBkb25lIGhvd2V2ZXIsIHlvdSBhbHNvIGhhdmUgdG8gImZvcmNlIiBhbiBpbnN0YW5jZQorCSAqIG9mIHRoZSBjbGFzcyB0byBiZSBjcmVhdGVkIHNvIHRoYXQgdGhlIGNvbnN0cnVjdG9yIGlzIHJ1bi4gVGhpcyBpcworCSAqIHR5cGljYWxseSBhY2hpZXZlZCBieSBhbGxvY2F0aW5nIGFuIGluc3RhbmNlIGluIHRoZSA8Y29kZT5zdGFydDwvY29kZT4KKwkgKiBtZXRob2Qgb2YgdGhlIDxjb2RlPkFjdGl2YXRvcjwvY29kZT4gb2YgdGhlIHBsdWctaW4gdGhhdCBkZWZpbmVzIHRoZQorCSAqIGZhY3RvcnkuCisJICovCisJVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsIElOU1RBTkNFID0gbmV3IFRpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbCgpOworCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBleHRlbmRlZCBieSBjbGFzc2VzIHRoYXQgcHJvdmlkZSB0aW1lIHZhbHVlcyBvZiB7QGxpbmsKKwkgKiBJZGVudGlmaWFibGVzfS4KKwkgKi8KKwlwdWJsaWMgY2xhc3MgVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsIGV4dGVuZHMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeQorCQkJaW1wbGVtZW50cyBUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7CisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3RvcnkjCisJCSAqIAlpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQkJcmV0dXJuIHR5cGUgPT0gVGltZVByb3ZpZGVyLmNsYXNzOworCQl9IC8vIGlzRmFjdG9yeUZvclR5cGUKKwl9IC8vIFRpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbAorfSAvLyBUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL0NvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhNjA2OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACisvLyBDb25zdGFudHMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5UcmlnZ2VyOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIHNpZ25pZmljYW50IGNvbnN0YW50cyB1c2VkIGJ5IHRoZSBTVEVNCisgKiBpbXBsZW1lbnRhdGlvbi4KKyAqLworcHVibGljIGludGVyZmFjZSBDb25zdGFudHMgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc3RyaW5nIHRoYXQgaXMgdGhlIHJvb3Qgb2YgYWxsIHBhY2thZ2VzIGFuZCBwbHVnaW4gaWQncworCSAqLworCVN0cmluZyBJRF9ST09UID0gIm9yZy5lY2xpcHNlLnN0ZW0iOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgaWQgZm9yIHRoZSBTVEVNIHByb2plY3QgbmF0dXJlLgorCSAqLworCVN0cmluZyBJRF9TVEVNX1BST0pFQ1RfTkFUVVJFID0gSURfUk9PVCArICIuc3RlbW5hdHVyZSI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzY2hlbWUgdXNlZCBmb3IgU1RFTSBVUkkncyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZ5IGEKKwkgKiBjb21wb25lbnQuCisJICovCisJU3RyaW5nIFNURU1fU0NIRU1FID0gInN0ZW0iOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2NoZW1lIHVzZWQgZm9yIFNURU0gVVJJJ3MgdGhhdCB1bmlxdWVseSBpZGVudGlmeSBhIFNURU0KKwkgKiAidHlwZSIuCisJICovCisJU3RyaW5nIFNURU1fVFlQRV9TQ0hFTUUgPSAic3RlbXR5cGUiOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgImF1dGhvcml0eSIgb2YgYSBVUkkgdGhhdCByZWZlcnMgdG8gU1RFTSByZXNvdXJjZXMuCisJICovCisJU3RyaW5nIFNURU1fVVJJX0FVVEhPUklUWSA9IElEX1JPT1Q7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBleHRlbnNpb24gcG9pbnQgaWQgZm9yIHRoZSAiZ3JhcGgiIGV4dGVuc2lvbiBwb2ludC4ge0B2YWx1ZX0KKwkgKiAKKwkgKiBAc2VlIEdyYXBoCisJICovCisJU3RyaW5nIElEX0dSQVBIX0VYVEVOU0lPTl9QT0lOVCA9IElEX1JPT1QgKyAiLmNvcmUuZ3JhcGgiOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgZXh0ZW5zaW9uIHBvaW50IGlkIGZvciB0aGUgIm1vZGVsIiBleHRlbnNpb24gcG9pbnQuIHtAdmFsdWV9CisJICogCisJICogQHNlZSBNb2RlbAorCSAqLworCVN0cmluZyBJRF9NT0RFTF9FWFRFTlNJT05fUE9JTlQgPSBJRF9ST09UICsgIi5jb3JlLm1vZGVsIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGV4dGVuc2lvbiBwb2ludCBpZCBmb3IgdGhlICJzY2VuYXJpbyIgZXh0ZW5zaW9uIHBvaW50LiAqICoKKwkgKiB7QHZhbHVlfQorCSAqIAorCSAqIEBzZWUgU2NlbmFyaW8KKwkgKi8KKwlTdHJpbmcgSURfU0NFTkFSSU9fRVhURU5TSU9OX1BPSU5UID0gSURfUk9PVCArICIuY29yZS5zY2VuYXJpbyI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBleHRlbnNpb24gcG9pbnQgaWQgZm9yIHRoZSAiZXhwZXJpbWVudCIgZXh0ZW5zaW9uIHBvaW50LiAqICoKKwkgKiB7QHZhbHVlfQorCSAqIAorCSAqIEBzZWUgRXhwZXJpbWVudAorCSAqLworCVN0cmluZyBJRF9FWFBFUklNRU5UX0VYVEVOU0lPTl9QT0lOVCA9IElEX1JPT1QgKyAiLmNvcmUuZXhwZXJpbWVudCI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBleHRlbnNpb24gcG9pbnQgaWQgb2YgdGhlICJTZXF1ZW5jZXJzIiBleHRlbnNpb24gcG9pbnQuICogKgorCSAqIHtAdmFsdWV9CisJICogCisJICogQHNlZSBTZXF1ZW5jZXIKKwkgKi8KKwlTdHJpbmcgSURfU0VRVUVOQ0VSX0VYVEVOU0lPTl9QT0lOVCA9IElEX1JPT1QgKyAiLmNvcmUuc2VxdWVuY2VyIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGV4dGVuc2lvbiBwb2ludCBpZCBvZiB0aGUgIkRlY29yYXRvcnMiIGV4dGVuc2lvbiBwb2ludCAqICoKKwkgKiB7QHZhbHVlfQorCSAqIAorCSAqIEBzZWUgRGVjb3JhdG9yCisJICovCisJU3RyaW5nIElEX0RFQ09SQVRPUl9FWFRFTlNJT05fUE9JTlQgPSBJRF9ST09UICsgIi5jb3JlLmRlY29yYXRvciI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBleHRlbnNpb24gcG9pbnQgaWQgb2YgdGhlICJUcmlnZ2VycyIgZXh0ZW5zaW9uIHBvaW50ICogKgorCSAqIHtAdmFsdWV9CisJICogCisJICogQHNlZSBUcmlnZ2VyCisJICovCisJU3RyaW5nIElEX1RSSUdHRVJfRVhURU5TSU9OX1BPSU5UID0gSURfUk9PVCArICIuY29yZS50cmlnZ2VyIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGV4dGVuc2lvbiBwb2ludCBpZCBvZiB0aGUgIlByZWRpY2F0ZSIgZXh0ZW5zaW9uIHBvaW50ICogKgorCSAqIHtAdmFsdWV9CisJICogCisJICogQHNlZSBQcmVkaWNhdGUKKwkgKi8KKwlTdHJpbmcgSURfUFJFRElDQVRFX0VYVEVOU0lPTl9QT0lOVCA9IElEX1JPT1QgKyAiLmNvcmUucHJlZGljYXRlIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGV4dGVuc2lvbiBwb2ludCBpZCBmb3IgdGhlICJzb2x2ZXIiIGV4dGVuc2lvbiBwb2ludC4gQQorCSAqIHtAbGluayBTb2x2ZXJ9IGRlZmluZXMgdGhlIHVuZGVybHlpbmcgY29tcHV0YXRpb25hbCBtb2RlbC4KKwkgKiB7QHZhbHVlfQorCSAqLworCVN0cmluZyBJRF9TT0xWRVJfRVhURU5TSU9OX1BPSU5UID0gb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50cy5JRF9ST09UCisJKyAiLmNvcmUuc29sdmVyIjsKKworCQorCS8qKgorCSAqIFRoaXMgaXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGVsZW1lbnQgaW4gYQorCSAqIDxjb2RlPkNvbmZpZ3VyYXRpb25FbGVtZW50PC9jb2RlPiB0aGF0IHNwZWNpZmllcyB0aGUgbmFtZSBhbmQKKwkgKiBpbXBsZW1lbnRpbmcgY2xhc3MgZm9yIFNURU0gInNvbHZlciIuCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29uc3RhbnRzI0VYRUNVVEFCTEVfTkFNRV9BVFRSSUJVVEUKKwkgKi8KKwlTdHJpbmcgU09MVkVSX0VMRU1FTlQgPSAiY2xhc3NkZWYiOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgaWRlbnRpZmllciBvZiB0aGUgWE1MIGVsZW1lbnQgdGhhdCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQorCSAqICJjYXRlZ29yeSIgZm9yIGV4dGVuc2lvbiBwb2ludHMgdGhhdCBhcmUgZXh0ZW5kZWQgYnkgZXh0ZW5zaW9ucyB0aGF0IHBsdWcKKwkgKiBpbiB7QGxpbmsgSWRlbnRpZmlhYmxlfXMuIHtAdmFsdWV9CisJICogCisJICogQHNlZSAjQ0FURUdPUllfTkFNRV9BVFRSSUJVVEUKKwkgKiBAc2VlICNQQVJFTlRfSURfQVRUUklCVVRFCisJICovCisJU3RyaW5nIENBVEVHT1JZX0VMRU1FTlQgPSAic3RlbV9jYXRlZ29yeSI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBYTUwgYXR0cmlidXRlIGluIGEgQ0FURUdPUlkgZWxlbWVudCB0aGF0CisJICogc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBjYXRlZ29yeS4ge0B2YWx1ZX0KKwkgKiAKKwkgKiBAc2VlICNDQVRFR09SWV9FTEVNRU5UCisJICogQHNlZSAjUEFSRU5UX0lEX0FUVFJJQlVURQorCSAqLworCVN0cmluZyBDQVRFR09SWV9OQU1FX0FUVFJJQlVURSA9ICJuYW1lIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIFhNTCBhdHRyaWJ1dGUgaW4gYSBDYXRlZ29yeSBlbGVtZW50IHRoYXQKKwkgKiBzcGVjaWZpZXMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjYXRlZ29yeS4ge0B2YWx1ZX0KKwkgKiAKKwkgKiBAc2VlICNDQVRFR09SWV9OQU1FX0FUVFJJQlVURQorCSAqIEBzZWUgI1BBUkVOVF9JRF9BVFRSSUJVVEUKKwkgKi8KKwlTdHJpbmcgQ0FURUdPUllfSURfQVRUUklCVVRFID0gImlkIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIFhNTCBhdHRyaWJ1dGUgaW4gYSBDQVRFR09SWSBlbGVtZW50IHRoYXQKKwkgKiBzcGVjaWZpZXMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgY2F0ZWdvcnkgb2YgYSBjaGlsZAorCSAqIGNhdGVnb3J5LiB7QHZhbHVlfQorCSAqIAorCSAqIEBzZWUgI0NBVEVHT1JZX0VMRU1FTlQKKwkgKiBAc2VlICNDQVRFR09SWV9OQU1FX0FUVFJJQlVURQorCSAqLworCVN0cmluZyBQQVJFTlRfSURfQVRUUklCVVRFID0gInBhcmVudF9pZCI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBYTUwgZWxlbWVudCB0aGF0IHNwZWNpZmllcyB0aGUgRHVibGluIENvcmUKKwkgKiB2YWx1ZXMgZm9yIGV4dGVuc2lvbiBwb2ludHMgdGhhdCBhcmUgZXh0ZW5kZWQgYnkgZXh0ZW5zaW9ucyB0aGF0IHBsdWcgaW4KKwkgKiB7QGxpbmsgSWRlbnRpZmlhYmxlfXMuIHtAdmFsdWV9CisJICogCisJICogQHNlZSAjQ0FURUdPUllfRUxFTUVOVAorCSAqIEBzZWUgRHVibGluQ29yZQorCSAqLworCVN0cmluZyBEVUJMSU5fQ09SRV9FTEVNRU5UID0gImR1Ymxpbl9jb3JlIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIFhNTCBlbGVtZW50IHRoYXQgc3BlY2lmaWVzIHRoZSBuYW1lIGFuZAorCSAqIGltcGxlbWVudGluZyBjbGFzcyBmb3IgU1RFTSAic2VxdWVuY2VycyIuCisJICogCisJICogQHNlZSAjRVhFQ1VUQUJMRV9OQU1FX0FUVFJJQlVURQorCSAqLworCVN0cmluZyBTRVFVRU5DRVJfRUxFTUVOVCA9ICJzZXF1ZW5jZXIiOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgaWRlbnRpZmllciBvZiB0aGUgWE1MIGVsZW1lbnQgdGhhdCBzcGVjaWZpZXMgdGhlIG5hbWUgYW5kCisJICogaW1wbGVtZW50aW5nIGNsYXNzIGZvciBTVEVNICJkZWNvcmF0b3JzIgorCSAqIAorCSAqIEBzZWUgI0VYRUNVVEFCTEVfTkFNRV9BVFRSSUJVVEUKKwkgKi8KKwlTdHJpbmcgREVDT1JBVE9SX0VMRU1FTlQgPSAiZGVjb3JhdG9yIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIFhNTCBhdHRyaWJ1dGUgaW4gYW4gT2JzZXJ2ZXIgZWxlbWVudCB0aGF0CisJICogc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgU1RFTSAiZXhlY3V0YWJsZSIuCisJICogCisJICogQHNlZSAjU0VRVUVOQ0VSX0VMRU1FTlQKKwkgKiBAc2VlICNERUNPUkFUT1JfRUxFTUVOVAorCSAqLworCVN0cmluZyBFWEVDVVRBQkxFX05BTUVfQVRUUklCVVRFID0gIm5hbWUiOworCisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIHJvb3QgY2F0ZWdvcnkgZm9yIGFsbCBJZGVudGlmaWFibGVQbHVnaW5WaWV3cy4KKwkgKiAKKwkgKiBAc2VlICNJREVOVElGSUFCTEVfUk9PVF9DQVRFR09SWV9JRAorCSAqLworCVN0cmluZyBJREVOVElGSUFCTEVfUk9PVF9DQVRFR09SWV9OQU1FID0gIi8iOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJvb3QgY2F0ZWdvcnkuIHtAdmFsdWV9CisJICogCisJICogQHNlZSAjSURFTlRJRklBQkxFX1JPT1RfQ0FURUdPUllfTkFNRQorCSAqLworCVN0cmluZyBJREVOVElGSUFCTEVfUk9PVF9DQVRFR09SWV9JRCA9IElERU5USUZJQUJMRV9ST09UX0NBVEVHT1JZX05BTUU7CisKKworCit9IC8vIENvbnN0YW50cwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvQ29yZVBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvQ29yZVBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYjUxYzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9Db3JlUGx1Z2luLmphdmEKQEAgLTAsMCArMSwxNTcgQEAKKy8vIENvcmVQbHVnaW4uamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMuZmlsZS5JZGVudGlmaWFibGVGaWxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLkdyYXBoVGltZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CisKKy8qKgorICogVGhlIGNvcmUgU1RFTSBwbHVnaW4uCisgKi8KK3B1YmxpYyBjbGFzcyBDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKKworCS8qKgorCSAqIFRoZSBwbHVnLWluIElECisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnN0ZW0uY1NvcmUiOworCisJLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KKwlwcml2YXRlIHN0YXRpYyBDb3JlUGx1Z2luIHBsdWdpbjsKKworCS8qKgorCSAqIFRoZSBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgQ29yZVBsdWdpbigpIHsKKwkJcGx1Z2luID0gdGhpczsKKwl9IC8vIENvcmVQbHVnaW4KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgorCSAqIAorCSAqIEBwYXJhbSBjb250ZXh0CisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdGFydChjb250ZXh0KTsKKwkJbmV3IEdyYXBoVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKKwkJbmV3IElkZW50aWZpYWJsZUZpbGVBZGFwdGVyRmFjdG9yeSgpOworCQkvLyBUaGUgY29uc3RydWN0b3Igd2lsbCBwb3B1bGF0ZSB0aGUgcGx1Zy1pbiBzcGVjaWZpZWQgcmVzb3VyY2VzCisJCS8vIHN0ZW0gPSBuZXcgU1RFTSgpOworCX0gLy8gc3RhcnQKKworCQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKKwkgKiAKKwkgKiBAcGFyYW0gY29udGV4dAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdG9wKGNvbnRleHQpOworCQlwbHVnaW4gPSBudWxsOworCX0gLy8gc3RvcAorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGx1Zy1pbiBjbGFzcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIENvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9IC8vIENvcmVQbHVnaW4KKworCS8qKgorCSAqIExvZyBhbiBlcnJvciB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4KKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqICAgICAgICAgICAgdGhlIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIHRleHQKKwkgKiBAcGFyYW0gZXhjZXB0aW9uCisJICogICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJLy8gRG8gd2UgaGF2ZSBhIHBsdWdpbj8KKwkJaWYgKHBsdWdpbiAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXBsdWdpbi5nZXRMb2coKS5sb2coCisJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAorCQkJCQkJCTAsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOworCQl9CisJCWVsc2UgeworCQkJLy8gTm8KKwkJCVN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKKwkJCS8vIEV4Y2VwdGlvbj8KKwkJCWlmIChleGNlcHRpb24gIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCVN5c3RlbS5vdXQucHJpbnRsbihleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKKwkJCX0gLy8gaWYgCisJCX0KKwl9IC8vIGxvZ0Vycm9yCisKKwkvKioKKwkgKiBMb2cgaW5mb3JtYXRpb24gdG8gdGhlIElMb2cgZm9yIHRoaXMgcGx1Z2luCisJICogCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiAgICAgICAgICAgIHRoZSBsb2NhbGl6ZWQgaW5mb3JtYXRpb24gbWVzc2FnZSB0ZXh0CisJICogQHBhcmFtIGV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgdGhlIGFzc29jaWF0ZWQgZXhjZXB0aW9uLCBvciBudWxsCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0luZm9ybWF0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisJCS8vIERvIHdlIGhhdmUgYSBwbHVnaW4/CisJCWlmIChwbHVnaW4gIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlwbHVnaW4uZ2V0TG9nKCkubG9nKAorCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAorCQkJCQkJCTAsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOworCQl9CisJCWVsc2UgeworCQkJLy8gTm8KKwkJCVN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKKwkJCS8vIEV4Y2VwdGlvbj8KKwkJCWlmIChleGNlcHRpb24gIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCVN5c3RlbS5vdXQucHJpbnRsbihleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKKwkJCX0gLy8gaWYgCisJCX0KKwl9IC8vIGxvZ0luZm9ybWF0aW9uCisJCisJCisJLyoqCisJICogTG9nIGluZm9ybWF0aW9uIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgorCSAqIFRoZSBtZXRob2QgaXMgb3ZlcmxvYWRlZCB0byBhbGxvdyBmb3IgbG9nSW5mb3JtYXRpb24gd2l0aG91dCBhbiBlcnJvciAKKwkgKiBtZXRob2Qgc2V0cyB0aGUgZXJyb3IgdG8gbnVsbC4gVGhpcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIFN5c3RlbS5vdXQucHJpbnRsbgorCSAqIHRocm91Z2hvdXQgdGhlIGNvZGUuCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiAgICAgICAgICAgIHRoZSBsb2NhbGl6ZWQgaW5mb3JtYXRpb24gbWVzc2FnZSB0ZXh0CisJICoKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW5mb3JtYXRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKwkJLy8gRG8gd2UgaGF2ZSBhIHBsdWdpbj8KKwkJaWYgKHBsdWdpbiAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXBsdWdpbi5nZXRMb2coKS5sb2coCisJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCisJCQkJCQkJMCwgbWVzc2FnZSwgbnVsbCkpOworCQl9CisJCWVsc2UgeworCQkJLy8gTm8KKwkJCVN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKKwkJfQorCX0gLy8gbG9nSW5mb3JtYXRpb24KKworCQorCQorfSAvLyBDb3JlUGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9TVEVNVVJJLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9TVEVNVVJJLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0MTM1OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL1NURU1VUkkuamF2YQpAQCAtMCwwICsxLDE5MSBAQAorLy8gU1RFTVVSSS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHN0YW5kYXJkIHtAbGluayBVUkl9IGNvbnN0YW50cyBmb3IgU1RFTS4KKyAqLworcHVibGljIGNsYXNzIFNURU1VUkkgeworCisJcHJpdmF0ZSBzdGF0aWMgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKwkKKwkvKioKKwkgKiBUaGUgdHlwZSB7QGxpbmsgVVJJfSBvZiBhIFNURU0ge0BsaW5rIFNjZW5hcmlvfS4ge0B2YWx1ZX0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFVSSSBTQ0VOQVJJT19UWVBFX1VSSSA9IGNyZWF0ZVR5cGVVUkkoIlNjZW5hcmlvIik7CisKKwkvKioKKwkgKiBUaGUgdHlwZSB7QGxpbmsgVVJJfSBvZiBhIFNURU0ge0BsaW5rIE1vZGVsfS4ge0B2YWx1ZX0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFVSSSBNT0RFTF9UWVBFX1VSSSA9IGNyZWF0ZVR5cGVVUkkoIk1vZGVsIik7CisKKwkvKioKKwkgKiBUaGUgdHlwZSB7QGxpbmsgVVJJfSBvZiBhIFNURU0ge0BsaW5rIEdyYXBofS4ge0B2YWx1ZX0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFVSSSBHUkFQSF9UWVBFX1VSSSA9IGNyZWF0ZVR5cGVVUkkoIkdyYXBoIik7CisKKwkvKioKKwkgKiBUaGUgdHlwZSB7QGxpbmsgVVJJfSBvZiBhIFNURU0ge0BsaW5rIE5vZGV9LiB7QHZhbHVlfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIE5PREVfVFlQRV9VUkkgPSBjcmVhdGVUeXBlVVJJKCJOb2RlIik7CisKKwkvKioKKwkgKiBUaGUgdHlwZSB7QGxpbmsgVVJJfSBvZiBhIFNURU0ge0BsaW5rIEVkZ2V9LiB7QHZhbHVlfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIEVER0VfVFlQRV9VUkkgPSBjcmVhdGVUeXBlVVJJKCJFZGdlIik7CisKKwkvKioKKwkgKiBUaGUgdHlwZSB7QGxpbmsgVVJJfSBvZiBhIFNURU0ge0BsaW5rIFNlcXVlbmNlcn0uIHtAdmFsdWV9CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBVUkkgU0VRVUVOQ0VSX1RZUEVfVVJJID0gY3JlYXRlVHlwZVVSSSgiU2VxdWVuY2VyIik7CisKKwkvKioKKwkgKiBUaGUgdHlwZSB7QGxpbmsgVVJJfSBvZiBhIFNURU0ge0BsaW5rIEV4cGVyaW1lbnR9LiB7QHZhbHVlfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIEVYUEVSSU1FTlRfVFlQRV9VUkkgPSBjcmVhdGVUeXBlVVJJKCJFeHBlcmltZW50Iik7CisKKwkvKioKKwkgKiBUaGUgdHlwZSB7QGxpbmsgVVJJfSBvZiBhIFNURU0KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyfS4ge0B2YWx1ZX0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFVSSSBNT0RJRklFUl9UWVBFX1VSSSA9IGNyZWF0ZVR5cGVVUkkoIk1vZGlmaWVyIik7CisKKwkvKioKKwkgKiBUaGUgdHlwZSB7QGxpbmsgVVJJfSBvZiBhIFNURU0KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuVHJpZ2dlcn0uIHtAdmFsdWV9CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBVUkkgVFJJR0dFUl9UWVBFX1VSSSA9IGNyZWF0ZVR5cGVVUkkoIlRyaWdnZXIiKTsKKworCS8qKgorCSAqIFRoZSB0eXBlIHtAbGluayBVUkl9IG9mIGEgU1RFTQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5QcmVkaWNhdGV9LiB7QHZhbHVlfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIFBSRURJQ0FURV9UWVBFX1VSSSA9IGNyZWF0ZVR5cGVVUkkoIlByZWRpY2F0ZSIpOworCisJLyoqCisJICogVGhlIHR5cGUge0BsaW5rIFVSSX0gb2YgYSBTVEVNCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyfS4ge0B2YWx1ZX0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFVSSSBTT0xWRVJfVFlQRV9VUkkgPSBjcmVhdGVUeXBlVVJJKCJTb2x2ZXIiKTsKKworCS8qKgorCSAqIFRoZSB0eXBlIHtAbGluayBVUkl9IG9mIGEgU1RFTQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZX0uIHtAdmFsdWV9CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBVUkkgSURFTlRJRklBQkxFX1RZUEVfVVJJID0gY3JlYXRlVHlwZVVSSSgiSWRlbnRpZmlhYmxlIik7CisJCisJLyoqCisJICogQ3JlYXRlIGEgIlN0ZW0gdHlwZSIge0BsaW5rIFVSSX0KKwkgKiAKKwkgKiBAcGFyYW0gc2VnbWVudHMKKwkgKiAgICAgICAgICAgIHRoZSBzZWdtZW50cyBvZiB0aGUge0BsaW5rIFVSSX0KKwkgKiBAcmV0dXJuIGEgU1RFTSAidHlwZSIge0BsaW5rIFVSSX0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVUeXBlVVJJKGZpbmFsIFN0cmluZyBzZWdtZW50cykgeworCQlyZXR1cm4gY3JlYXRlKENvbnN0YW50cy5TVEVNX1RZUEVfU0NIRU1FLCBzZWdtZW50cyk7CisJfSAvLyBjcmVhdGVUeXBlVVJJCisKKwkvKioKKwkgKiBAcGFyYW0gc2VnbWVudHMKKwkgKiAgICAgICAgICAgIHRoZSBzZWdtZW50cyBvZiB0aGUge0BsaW5rIFVSSX0KKwkgKiBAcmV0dXJuIGEgU1RFTSB7QGxpbmsgVVJJfQorCSAqLworCXB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVVSSShmaW5hbCBTdHJpbmcgc2VnbWVudHMpIHsKKwkJcmV0dXJuIGNyZWF0ZShDb25zdGFudHMuU1RFTV9TQ0hFTUUsIHNlZ21lbnRzKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2NoZW1lCisJICogICAgICAgICAgICB0aGUgc2NoZW1lIG9mIHRoZSB7QGxpbmsgVVJJfQorCSAqIEBwYXJhbSBzZWdtZW50cworCSAqICAgICAgICAgICAgdGhlIHNlZ21lbnRzIG9mIHRoZSBVUkkKKwkgKiBAc2VlIENvbnN0YW50cyNTVEVNX1VSSV9BVVRIT1JJVFkKKwkgKiBAcmV0dXJuIGEgU1RFTSB7QGxpbmsgVVJJfSB3aXRoIHRoZSBidWlsdC1pbiAiU1RFTSIgQXV0aG9yaXR5CisJICovCisJcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlKGZpbmFsIFN0cmluZyBzY2hlbWUsIGZpbmFsIFN0cmluZyBzZWdtZW50cykgeworCQlyZXR1cm4gY3JlYXRlKHNjaGVtZSwgQ29uc3RhbnRzLlNURU1fVVJJX0FVVEhPUklUWSwgc2VnbWVudHMpOworCX0gLy8gY3JlYXRlCisKKwkvKioKKwkgKiBDcmVhdGUgYSBTVEVNIHtAbGluayBVUkl9CisJICogCisJICogQHBhcmFtIHNjaGVtZQorCSAqICAgICAgICAgICAgdGhlIHNjaGVtZSBvZiB0aGUge0BsaW5rIFVSSX0KKwkgKiBAcGFyYW0gYXV0aG9yaXR5CisJICogICAgICAgICAgICB0aGUgImF1dGhvcml0eSIgb2YgdGhlIHtAbGluayBVUkl9CisJICogQHBhcmFtIHNlZ21lbnRzCisJICogICAgICAgICAgICB0aGUgc2VnbWVudHMgb2YgdGhlIHtAbGluayBVUkl9CisJICogQHNlZSBDb25zdGFudHMjU1RFTV9VUklfQVVUSE9SSVRZCisJICogQHJldHVybiBhIFNURU0ge0BsaW5rIFVSSX0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGUoZmluYWwgU3RyaW5nIHNjaGVtZSwgZmluYWwgU3RyaW5nIGF1dGhvcml0eSwKKwkJCWZpbmFsIFN0cmluZyBzZWdtZW50cykgeworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoc2NoZW1lKTsKKwkJc2IuYXBwZW5kKCI6Ly8iKTsKKwkJc2IuYXBwZW5kKGF1dGhvcml0eSk7CisJCXNiLmFwcGVuZCgiLyIpOworCQlzYi5hcHBlbmQoc2VnbWVudHMpOworCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShzYi50b1N0cmluZygpKTsKKwl9IC8vIGNyZWF0ZQorCQorCS8qKgorCSAqIGdlbmVyYXRlVW5pcXVlUGFydC4gVXNlZCB0byBhZGQgYSB1bmlxdWUgc2VnbWVudCB0byBhbnkgVVJJCisJICogQHJldHVybiBTdHJpbmcgUmFuZG9tIDY0IGJpdCB1cHBlciBjYXNlIEhFWAorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlVW5pcXVlUGFydCgpIHsKKwkJbG9uZyBsID0gcmFuZC5uZXh0TG9uZygpOworCQlsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlsb25nIHI9IGwrbm93OworCQlyZXR1cm4gTG9uZy50b0hleFN0cmluZyhyKS50b1VwcGVyQ2FzZSgpOworCX0KKwkKKwkvKioKKwkgKiBDb252ZXJ0cyBVUkkncyBvZiB0aGUgZm9ybSAiZmlsZTovLy4uLiIgdG8gInBsYXRmb3JtOi8vLi4uIgorCSAqIEBwYXJhbSBpbiBVUkkgdG8gY29udmVydAorCSAqIEByZXR1cm4gQ29udmVydGVkIFVSSSwgb3IgdGhlIHNhbWUgYXMgaW5wdXQgaWYgdGhlIFVSSSBpcyBhbHJlYWR5IG5vcm1hbGl6ZWQKKwkgKi8KKwkKKwlwdWJsaWMgc3RhdGljIFVSSSBub3JtYWxpemUoVVJJIGluKSB7CisJCWlmKGluLnNjaGVtZSgpLmVxdWFscygicGxhdGZvcm0iKSkgcmV0dXJuIGluOworCQlpZihpbi5zY2hlbWUoKS5lcXVhbHMoImZpbGUiKSkgeworCQkJLy8gQ2hlY2sgaWYgd2UgY2FuIGZpbmQgdGhlIHdvcmtzcGFjZSBwYXRoIGluIHRoZSBmaWxlIFVSSS4KKwkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOworCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IHdvcmtzcGFjZS5nZXRSb290KCk7CisJCQlJUGF0aCBsb2NhdGlvbiA9IHJvb3QuZ2V0TG9jYXRpb24oKTsKKwkJCQorCQkJaW50IGluZCA9IGluLnRvU3RyaW5nKCkuaW5kZXhPZihsb2NhdGlvbi50b1N0cmluZygpKTsKKwkJCWlmKGluZCA+LTEpIHsKKwkJCQlTdHJpbmcgcmVzdCA9IGluLnRvU3RyaW5nKCkuc3Vic3RyaW5nKGluZCtsb2NhdGlvbi50b09TU3RyaW5nKCkubGVuZ3RoKCkpOworCQkJCVVSSSByZXN1bHQgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShyZXN0LCBmYWxzZSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQkvLyBVbmFibGUgdG8gY29udmVydCBmaWxlIFVSSSwgdGhpcyBjb3VsZCBiZSBhIFVSSSB0byBhIFNURU0gbGlicmFyeSBvYmplY3QuIFdlIGRvbid0IGNvbnZlcnQgdGhvc2UKKwkJcmV0dXJuIGluOworCX0KK30gLy8gU1RFTVVSSQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvU1RFTVhNSVJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL1NURU1YTUlSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU1OTMyYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL1NURU1YTUlSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkJhc2ljRU9iamVjdEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlIZWxwZXJJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0aGUge0BsaW5rIFhNSVJlc291cmNlRmFjdG9yeUltcGx9IGZvciB0aGUgU1RFTSBwcm9qZWN0LiBJdCdzCisgKiBwdXJwb3NlIGlzIHRvIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFhNSVJlc291cmNlSW1wbH0gd2hvc2UKKyAqIHtAbGluayBYTUxIZWxwZXJ9IGhhcyBhIGN1c3RvbWl6ZWQgaW1wbGVtZW50YXRpb24gb2YKKyAqIHtAbGluayBYTUxIZWxwZXIjZ2V0SFJFRihFT2JqZWN0KX0gdGhhdCBmaWx0ZXJzIHNlcmlhbGl6ZWQge0BsaW5rIFVSSX0ncyBzdWNoCisgKiB0aGF0IHRoZXkgcmVtYWluIHBsYXRmb3JtIHJlbGF0aXZlIChpLmUuLAorICogInBsYXRmb3JtOi9wcm9qZWN0bmFtZS9mb28vYmFyLi4uIiksIG9yIGlmIGFic29sdXRlLCBhcmUgZGVyZXNvbHZlZCBhZ2FpbnN0CisgKiB0aGUge0BsaW5rIFJlc291cmNlfSdzIHtAbGluayBVUkl9IHNvIHRoZXkgcmVtYWluIGludGVybmFsbHkgcmVsYXRpdmUgdG8gdGhlCisgKiBjb250YWluaW5nIGZpbGUuCisgKiA8cD4KKyAqIFRoaXMgaXMgaW1wb3J0YW50IGFzIHRoZSBzZXJpYWxpemVkIHtAbGluayBJZGVudGlmaWFibGV9cyBuZWVkIHRvIGJlIGFibGUgdG8KKyAqIGJlIGNvcGllZCwgbW92ZWQgYW5kIGV4cG9ydGVkLiBJZiB0aGVpciByZWZlcmVuY2VzIHRvIG90aGVyIHNlcmlhbGl6ZWQKKyAqIHtAbGluayBJZGVudGlmaWFibGV9cyB3ZXJlIHJlbGF0aXZlIHRvIGZpbGUgbG9jYXRpb24gcmF0aGVyIHRoYW4gdG8gdGhlCisgKiBwbGF0Zm9ybSwgc3VjaCBvcGVyYXRpb25zIHdvdWxkIGJyZWFrIHRoZSBsaW5rcy4gVGh1cywgYWxsIHNlcmlhbGl6YXRpb24KKyAqIG9wZXJhdGlvbnMgdGhlIGludm9sdmUge0BsaW5rIElkZW50aWZpYWJsZX1zIG11c3QgZW1wbG95IHRoaXMgY2xhc3MuIExvb2sgZm9yCisgKiByZWZlcmVuY2VzIHRvIHtAbGluayAjSU5TVEFOQ0V9IHNvIHNlZSBob3cgdGhpcyBpcyBhY2NvbXBsaXNoZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFhNSVJlc291cmNlRmFjdG9yeUltcGwgeworCisJcHVibGljIHN0YXRpYyBTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCBJTlNUQU5DRSA9IG5ldyBTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCgpOworCisKKwlwcml2YXRlIEFycmF5TGlzdDxBZGFwdGVyPiBtb2RpZmljYXRpb25BZGFwdGVycyA9IG5ldyBBcnJheUxpc3Q8QWRhcHRlcj4oKTsKKwkKKwkvKioKKwkgKiBwcml2YXRlIHNvIG9ubHkgYSBzaW5nbGV0b24gaW5zdGFuY2UgaXMgY3JlYXRlZAorCSAqIAorCSAqIEBzZWUgI0lOU1RBTkNFCisJICovCisJcHJpdmF0ZSBTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgeworCQkJCisJCVJlc291cmNlIG5ld1JlcyA9IG5ldyBYTUlSZXNvdXJjZUltcGwodXJpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBYTUxIZWxwZXIgY3JlYXRlWE1MSGVscGVyKCkgeworCQkJCXJldHVybiBuZXcgWE1JSGVscGVySW1wbCgpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBTdHJpbmcgZ2V0SFJFRihFT2JqZWN0IG9iaikgeworCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElkZW50aWZpYWJsZSkgeworCQkJCQkJCS8vIFllcworCQkJCQkJCWZpbmFsIElkZW50aWZpYWJsZSBpZGVudGlmaWFibGUgPSAoSWRlbnRpZmlhYmxlKSBvYmo7CisJCQkJCQkJZmluYWwgVVJJIHVyaSA9IGlkZW50aWZpYWJsZS5nZXRVUkkoKTsKKwkJCQkJCQlpZih1cmkgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQkJCQkJCQorCQkJCQkJCS8vIElzIGl0IGEgcGxhdGZvcm0gVVJJPworCQkJCQkJCWlmICh1cmkuaXNQbGF0Zm9ybSgpKSB7CisJCQkJCQkJCS8vIFllcworCQkJCQkJCQlyZXR1cm4gdXJpLnRvU3RyaW5nKCkgKyAiIy8iOworCQkJCQkJCX0gLy8gaWYgcGxhdGZvcm0gVVJJPworCisJCQkJCQkJLy8gSXMgaXQgYW4gdW5yZXNvbHZlZCBwcm94eT8KKwkJCQkJCQllbHNlIGlmIChpZGVudGlmaWFibGUuZUlzUHJveHkoKSkgeworCQkJCQkJCQkvLyBZZXMKKwkJCQkJCQkJcmV0dXJuICgoQmFzaWNFT2JqZWN0SW1wbCkgaWRlbnRpZmlhYmxlKQorCQkJCQkJCQkJCS5lUHJveHlVUkkoKS50b1N0cmluZygpOworCQkJCQkJCX0gLy8gaWYgdW5yZXNvbHZlZCBwcm94eQorCisJCQkJCQkJZWxzZSB7CisJCQkJCQkJCS8vIE5vCisJCQkJCQkJCS8vIFJlc29sdmUgaXQgYWdhaW5zdCB0aGUgVVJJIG9mIHRoZQorCQkJCQkJCQkvLyBpZGVudGlmaWFibGUncyByZXNvdXJjZQorCQkJCQkJCQlkZXJlc29sdmUgPSB0cnVlOworCQkJCQkJCQlyZXNvdXJjZVVSSSA9IGlkZW50aWZpYWJsZS5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKKwkJCQkJCQkJcmV0dXJuIHN1cGVyLmdldEhSRUYob2JqKTsKKwkJCQkJCQl9IC8vIGVsc2UKKworCQkJCQkJfSAvLyBpZiBJZGVudGlmaWFibGUKKwkJCQkJCWVsc2UKKwkJCQkJCQlyZXR1cm4gc3VwZXIuZ2V0SFJFRihvYmopOworCQkJCQl9IC8vIGdldEhSRUYKKwkJCQkJCisJCQkJfTsKKwkJCX0gLy8gY3JlYXRlWE1MSGVscGVyCisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgbG9hZChNYXA8PywgPz4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCQlzdXBlci5sb2FkKG9wdGlvbnMpOworCQkJfQorCQl9OworCQlyZXR1cm4gbmV3UmVzOworCX0gLy8gY3JlYXRlUmVzb3VyY2UKKwkKKwkKKwlwdWJsaWMgdm9pZCBhZGRNb2RpZmljYXRpb25DaGFuZ2VBZGFwdGVyKEFkYXB0ZXIgbW9kaWZpY2F0aW9uQWRhcHRlcikgeworCQltb2RpZmljYXRpb25BZGFwdGVycy5hZGQobW9kaWZpY2F0aW9uQWRhcHRlcik7CisJfQorfSAvLyBTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvVXRpbGl0eS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvVXRpbGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NzIxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9VdGlsaXR5LmphdmEKQEAgLTAsMCArMSwyMzUgQEAKKy8vIFV0aWxpdHkuamF2YQ0KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQorDQorLyoqDQorICogVGhpcyBjbGFzcyBjb250YWlucyBjb21tb24gdXRpbGl0eSBtZXRob2RzIHVzZWQgaW4gU1RFTS4NCisgKi8NCitwdWJsaWMgY2xhc3MgVXRpbGl0eSB7DQorDQorCS8qKg0KKwkgKiBFTUYgU2F2ZSBPcHRpb25zLCBmb3IgcHJvcGVybHkgc2VyaWFsaXppbmcgdG8gVVRGLTgNCisJICovDQorCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsU3RyaW5nPiBFTUZfU0FWRV9PUFRJT05TIA0KKwkJPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOw0KKwlzdGF0aWMgew0KKwkJRU1GX1NBVkVfT1BUSU9OUy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiVVRGLTgiKTsNCisJfQ0KKwkNCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkVTVElOR19XQVJOSU5HID0gIldhcm5pbmcsIHBvc3NpYmxlIHNjZW5hcmlvIGluaXRpYWxpemF0aW9uIHByb2JsZW0gZGV0ZWN0ZWQuIENoZWNrIHRoZSBuZXN0aW5nIG9mIHlvdXIgbW9kZWxzIjsNCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVJJX1dBUk5JTkcgPSAiV2FybmluZywgVVJJIGRvZXMgbm90IGV4aXN0IGluIEdyYXBoLiBDaGVjayB0aGUgaW5mZWN0b3IvaW5ub2N1bGF0b3IgVVJJcyB5b3VyIG1vZGVscy4gIjsNCisJDQorCQ0KKwkvKioNCisJICogQ2FjaGVkIHJlc291cmNlIHNldA0KKwkgKi8NCisNCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsNCisJDQorCXN0YXRpYyB7DQorCQlyZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsNCisJCXJlc291cmNlU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCIqIiwgU1RFTVhNSVJlc291cmNlRmFjdG9yeUltcGwuSU5TVEFOQ0UpOw0KKwkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRQcm90b2NvbFRvRmFjdG9yeU1hcCgpLnB1dCgicGxhdGZvcm0iLCBTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbC5JTlNUQU5DRSk7DQorCX0NCisJDQorCS8qKg0KKwkgKiBAcGFyYW0gaWRlbnRpZmFibGVVUkkNCisJICogICAgICAgICAgICB0aGUge0BsaW5rIFVSSX0gb2YgZmlsZSB3aXRoIGEgc2VyaWFsaXplZCB7QGxpbmsgSWRlbnRpZmlhYmxlfQ0KKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfSBkZS1zZXJpYWxpemVkIGZyb20gdGhlIGZpbGUsIG9yDQorCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJyZWQuDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIElkZW50aWZpYWJsZSBnZXRJZGVudGlmaWFibGUoZmluYWwgVVJJIGlkZW50aWZhYmxlVVJJKSB7DQorCQlJZGVudGlmaWFibGUgcmV0VmFsdWUgPSBudWxsOw0KKw0KKwkJdHJ5IHsNCisJCQlVUkkgbm9ybWFsaXplZCA9IFNURU1VUkkubm9ybWFsaXplKGlkZW50aWZhYmxlVVJJKTsNCisJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKG5vcm1hbGl6ZWQsDQorCQkJCQl0cnVlKTsNCisJCQlpZihyZXNvdXJjZS5pc01vZGlmaWVkKCkpIHsJCQkJDQorCQkJCXJlc291cmNlLnVubG9hZCgpOw0KKwkJCQlyZXNvdXJjZS5sb2FkKG51bGwpOw0KKwkJCQlpZihyZXNvdXJjZS5nZXRFcnJvcnMoKS5zaXplKCkgPiAwKSB7DQorCQkJCQlmb3IoUmVzb3VyY2UuRGlhZ25vc3RpYyBkOiByZXNvdXJjZS5nZXRFcnJvcnMoKSkgDQorCQkJCQkJQ29yZVBsdWdpbi5sb2dFcnJvcihkLmdldE1lc3NhZ2UoKSwgbmV3IEV4Y2VwdGlvbigpKTsNCisJCQkJfQ0KKwkJCX0NCisJCQlFTGlzdDxFT2JqZWN0PmNvbnQgPSByZXNvdXJjZS5nZXRDb250ZW50cygpOw0KKwkJCWlmKGNvbnQuc2l6ZSgpID09IDApIHsNCisJCQkJaW50IG1heHJldHJ5ID0gMTA7DQorCQkJCXdoaWxlKGNvbnQuc2l6ZSgpID09IDApDQorCQkJCQlUaHJlYWQueWllbGQoKTsgLy8gYWxsb3cgb3RoZXIgdGhyZWFkIHRvIGxvYWQgcmVzb3VyY2UNCisJCQkJaWYoY29udC5zaXplKCkgPT0gMCkNCisJCQkJCUNvcmVQbHVnaW4ubG9nRXJyb3IoIlVuYWJsZSB0byBsb2FkIGNvbnRlbnQgZm9yIHJlc291cmNlICIrbm9ybWFsaXplZCwgbmV3IEV4Y2VwdGlvbigpKTsNCisJCQl9DQorCQkJcmV0VmFsdWUgPSAoSWRlbnRpZmlhYmxlKSBjb250LmdldCgwKTsNCisJCX0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7DQorCQkJQ29yZVBsdWdpbi5sb2dFcnJvcigNCisJCQkJCSJUaGUgc2VyaWFsaXplZCBpbnN0YW5jZSBvZiBhbiBJZGVudGlmaWFibGUgYXQgXCIiDQorCQkJCQkJCSsgaWRlbnRpZmFibGVVUkkudG9TdHJpbmcoKQ0KKwkJCQkJCQkrICJcIiB3YXMgbm90IGZvdW5kIG9yIHdhcyBvZiB0aGUgd3JvbmcgZm9ybWF0IiwgZSk7DQorCQkJcmV0VmFsdWUgPSBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIHJldFZhbHVlOw0KKwl9IC8vIGdldElkZW50aWZpYWJsZQ0KKw0KKwkvKioNCisJICogU2VyaWFsaXplIGFuIHtAbGluayBJZGVudGlmaWFibGV9DQorCSAqIDxwPg0KKwkgKiBOb3RlIHRoaXMgY29kZSBpcyBjb3BpZWQgZnJvbQ0KKwkgKiBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEucmVjb3Jkcy5SZWNvcmQuIFRoYXQgbWV0aG9kIHNob3VsZCBiZQ0KKwkgKiByZW1vdmVkIGFuZCB0aGlzIG9uZSB1c2VkIGluc3RlYWQuDQorCSAqIA0KKwkgKiBAcGFyYW0gaWRlbnRpZmlhYmxlDQorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBJZGVudGlmaWFibGV9IHRvIGJlIHNlcmlhbGl6ZWQuDQorCSAqIEBwYXJhbSBzZXJpYWxpemF0aW9uVVJJDQorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBVUkl9IHRoYXQgc3BlY2lmaWVzIHdoZXJlIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfQ0KKwkgKiAgICAgICAgICAgIGlzIHRvIGJlIHNlcmlhbGl6ZWQuDQorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCisJICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHNlcmlhbGl6aW5nIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfQ0KKwkgKi8NCisJcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZUlkZW50aWZpYWJsZShmaW5hbCBJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlLA0KKwkJCWZpbmFsIFVSSSBzZXJpYWxpemF0aW9uVVJJKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKwkJZmluYWwgTGlzdDxJZGVudGlmaWFibGU+IHNldCA9IG5ldyBBcnJheUxpc3Q8SWRlbnRpZmlhYmxlPigpOw0KKwkJc2V0LmFkZChpZGVudGlmaWFibGUpOw0KKwkJc2VyaWFsaXplSWRlbnRpZmlhYmxlcyhzZXQsIHNlcmlhbGl6YXRpb25VUkkpOw0KKwl9IC8vIHNlcmlhbGl6ZUlkZW50aWZpYWJsZQ0KKw0KKwkvKioNCisJICogU2VyaWFsaXplIGFuIHtAbGluayBJZGVudGlmaWFibGV9DQorCSAqIA0KKwkgKiBAcGFyYW0gaWRlbnRpZmlhYmxlDQorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBJZGVudGlmaWFibGV9IHRvIGJlIHNlcmlhbGl6ZWQuDQorCSAqIEBwYXJhbSBzZXJpYWxpemF0aW9uVVJJDQorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBVUkl9IHRoYXQgc3BlY2lmaWVzIHdoZXJlIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfQ0KKwkgKiAgICAgICAgICAgIGlzIHRvIGJlIHNlcmlhbGl6ZWQuDQorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCisJICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHNlcmlhbGl6aW5nIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfQ0KKwkgKi8NCisJcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZUlkZW50aWZpYWJsZXMoZmluYWwgTGlzdDxJZGVudGlmaWFibGU+IGlkZW50aWZpYWJsZXMsDQorCQkJZmluYWwgVVJJIHNlcmlhbGl6YXRpb25VUkkpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorDQorCQkvLyBUaGlzIGNvZGUgY291bGQgYmUgcnVubmluZyAic3RhbmQgYWxvbmUiIChpLmUuLCBub3Qgd2l0aGluIGVjbGlwc2UpLA0KKwkJLy8gdGh1cyB0aGUgZGVmYXVsdCBmYWN0b3JpZXMgZm9yIHRoZSBleHRlbnNpb25zIGFyZSBub3QgcmVnaXN0ZXJlZCBhcw0KKwkJLy8gdGhleSB3b3VsZCBmcm9tIHRoZWlyIGV4dGVuc2lvbiBvZg0KKwkJLy8gIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIi4gU28gd2UgbmVlZCB0byByZWdpc3RlciB0aGVtDQorCQkvLyBoZXJlLg0KKw0KKwkJUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIioiLA0KKwkJCQlTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbC5JTlNUQU5DRSk7DQorCQlSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldFByb3RvY29sVG9GYWN0b3J5TWFwKCkucHV0KA0KKwkJCQkicGxhdGZvcm0iLCBTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbC5JTlNUQU5DRSk7DQorDQorCQlmaW5hbCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsNCisNCisJCXJlc291cmNlU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkNCisJCQkJLnB1dCgiKiIsIFNURU1YTUlSZXNvdXJjZUZhY3RvcnlJbXBsLklOU1RBTkNFKTsNCisNCisJCXJlc291cmNlU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKS5wdXQoDQorCQkJCSJwbGF0Zm9ybSIsIFNURU1YTUlSZXNvdXJjZUZhY3RvcnlJbXBsLklOU1RBTkNFKTsNCisNCisJCWZpbmFsIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2Uoc2VyaWFsaXphdGlvblVSSSk7DQorCQkNCisJCWZvciAoSWRlbnRpZmlhYmxlIGlkIDogaWRlbnRpZmlhYmxlcykgew0KKwkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGlkKTsNCisJCX0NCisNCisJCXJlc291cmNlLnNhdmUoRU1GX1NBVkVfT1BUSU9OUyk7DQorCX0gLy8gc2VyaWFsaXplSWRlbnRpZmlhYmxlDQorCQ0KKwkvKioNCisJICogQ29tbW9uIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgdGhlIGdlb2dyYXBoaWMgbGV2ZWwgb2YgYSBnZW9ncmFwaGljIGtleSAobGFzdCBzZWdtZW50IG9mIGEgVVJJKQ0KKwkgKiBAcGFyYW0ga2V5DQorCSAqIEByZXR1cm4gdGhlIGxldmVsIG9mIHRoZSBrZXkNCisJICovDQorCXB1YmxpYyAgc3RhdGljIGludCBrZXlMZXZlbChmaW5hbCBTdHJpbmcga2V5KSB7DQorCQkvLyBudWxsIG1lYW5zIHVuc3BlY2lmaWVkIGFuZCB0cnVseSBnbG9iYWwgZm9yIHBvcHVsYXRpb24gbW9kZWxzLg0KKwkJaWYoa2V5ID09IG51bGwgfHwga2V5LnRyaW0oKS5lcXVhbHMoIiIpKSByZXR1cm4gLTI7DQorCQkvLyBaWlogaXMgc3BlY2lhbCwgaXQgbWVhbnMgdGhlIHdvcmxkDQorCQlpZihrZXkuZXF1YWxzSWdub3JlQ2FzZSgiWlpaIikpIHJldHVybiAtMTsNCisJCQ0KKwkJaW50IGxldmVsID0gMDsNCisJCWludCBzdGFydCA9IDA7DQorCQlmb3IgKGludCB0ZW1wID0ga2V5LmluZGV4T2YoIi0iKTsgdGVtcCA+IDA7KSB7IC8vJE5PTi1OTFMtMSQNCisJCQlsZXZlbCsrOw0KKwkJCXN0YXJ0ICs9IHRlbXAgKyAxOw0KKwkJCXRlbXAgPSBrZXkuc3Vic3RyaW5nKHN0YXJ0KS5pbmRleE9mKCItIik7IC8vJE5PTi1OTFMtMSQNCisJCX0gLy8gZm9yDQorCQlyZXR1cm4gbGV2ZWw7DQorCX0gLy8ga2V5TGV2ZWwNCisJDQorCS8qKg0KKwkgKiBEaXNwbGF5cyBhIHdhcm5pbmcgdGhhdCB0aGUgc2NlbmFyaW8gY29tcG9zaXRpb24gbWF5IGJlIGludmFsaWQuDQorCSAqIEZvciBleGFtcGxlIHRoZSBncmFwaCBuZXN0aW5nIHdpdGhpbiBhIHNpbXVsYXRpb24gbWF5IGJlIGludmFsaWQNCisJICogQW4gaW5mZWN0b3Igb3IgaW5vY3VsYXRvciBtYXkgcG9pbnQgdG8gYSBub2RlIHRoYXQgZG9lcyBub3QgZXhpc3QuDQorCSAqIEBwYXJhbSBtZXNzYWdlDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcGxheVNjZW5hcmlvQ29tcG9zaXRpb25XYXJuaW5nKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7DQorCQl0cnkgew0KKwkJCWlmKERpc3BsYXkuZ2V0RGVmYXVsdCgpICE9IG51bGwpDQorCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsNCisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQl0cnkgew0KKwkJCQkJCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkNCisJCQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7DQorLy8JCQkJCQkJZmluYWwgSVN0YXR1cyB3YXJuaW5nID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsDQorLy8JCQkJCQkJCQlDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMSwgbWVzc2FnZSwgbnVsbCk7DQorLy8JCQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHdpbmRvdy5nZXRTaGVsbCgpLCBudWxsLCBudWxsLA0KKy8vCQkJCQkJCQkJd2FybmluZyk7DQorCQkJCQkJCVN0cmluZyBbXSBsYWJlbHMgPSBuZXcgU3RyaW5nWzJdOw0KKwkJCQkJCQlsYWJlbHNbMV0gID0gIkhlbHAiOw0KKwkJCQkJCQlsYWJlbHNbMF0gPSAiT2theSI7DQorCQkJCQkJCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2cod2luZG93LmdldFNoZWxsKCksICJXYXJuaW5nIiwgbnVsbCwgbWVzc2FnZSwNCisJCQkJCQkJCQlNZXNzYWdlRGlhbG9nLldBUk5JTkcsIGxhYmVscywgMCkgew0KKwkJCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJCQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgew0KKwkJCQkJCQkJCWlmKGJ1dHRvbklkID09IDEpDQorCQkJCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLmRpc3BsYXlIZWxwKCJvcmcuZWNsaXBzZS5zdGVtLmRvYy5pbnZhbGlkbmVzdGluZ19jb250ZXh0aWQiKTsNCisJCQkJCQkJCQllbHNlDQorCQkJCQkJCQkJCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQl9Ow0KKwkJCQkJCQlkaWFsb2cub3BlbigpOw0KKwkJCQkJCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsNCisJCQkJCQkJLy8gSWYgd2UgZ2V0IHRoaXMgZXhjZXB0aW9uLCBpdCBpcyBiZWNhdXNlIHdlJ3JlIG5vdCBydW5uaW5nIGluDQorCQkJCQkJCS8vIGVjbGlwc2UuDQorCQkJCQkJfQ0KKwkJCQkJfSAvLyBydW4NCisJCQkJfSk7DQorCQkJDQorCQkJZWxzZSBDb3JlUGx1Z2luLmxvZ0Vycm9yKG1lc3NhZ2UsIG51bGwpOw0KKwkJCQ0KKwkJfSBjYXRjaCAoZmluYWwgRXJyb3IgbmNkZmUpIHsNCisJCQkvLyBFbXB0eQ0KKwkJfSAvLyBjYXRjaA0KKwl9DQorCQ0KK30gLy8gVXRpbGl0eQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9Db21tb25GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vQ29tbW9uRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOThkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vQ29tbW9uRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbW1vbkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7CisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDb21tb25GYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Db21tb25GYWN0b3J5SW1wbC5pbml0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkR1YmxpbiBDb3JlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EdWJsaW4gQ29yZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRHVibGluQ29yZSBjcmVhdGVEdWJsaW5Db3JlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklkZW50aWZpYWJsZSBGaWx0ZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklkZW50aWZpYWJsZSBGaWx0ZXI8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUlkZW50aWZpYWJsZUZpbHRlciBjcmVhdGVJZGVudGlmaWFibGVGaWx0ZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG91YmxlIFZhbHVlIExpc3Q8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvdWJsZSBWYWx1ZSBMaXN0PC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEb3VibGVWYWx1ZUxpc3QgY3JlYXRlRG91YmxlVmFsdWVMaXN0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvdWJsZSBWYWx1ZSBNYXRyaXg8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvdWJsZSBWYWx1ZSBNYXRyaXg8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCURvdWJsZVZhbHVlTWF0cml4IGNyZWF0ZURvdWJsZVZhbHVlTWF0cml4KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvdWJsZSBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG91YmxlIFZhbHVlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEb3VibGVWYWx1ZSBjcmVhdGVEb3VibGVWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdHJpbmcgVmFsdWUgTGlzdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3RyaW5nIFZhbHVlIExpc3Q8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZ1ZhbHVlTGlzdCBjcmVhdGVTdHJpbmdWYWx1ZUxpc3QoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3RyaW5nIFZhbHVlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdHJpbmcgVmFsdWU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZ1ZhbHVlIGNyZWF0ZVN0cmluZ1ZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogQGdlbmVyYXRlZAorCSAqLworCUNvbW1vblBhY2thZ2UgZ2V0Q29tbW9uUGFja2FnZSgpOworCit9IC8vQ29tbW9uRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL0NvbW1vblBhY2thZ2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9Db21tb25QYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUxYmYzYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9Db21tb25QYWNrYWdlLmphdmEKQEAgLTAsMCArMSwxMzQ1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uRmFjdG9yeQorICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29tbW9uUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTkFNRSA9ICJjb21tb24iOworCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24uZWNvcmUiOworCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbiI7CisKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUNvbW1vblBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkNvbW1vblBhY2thZ2VJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkR1YmxpbkNvcmVJbXBsIDxlbT5EdWJsaW4gQ29yZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5EdWJsaW5Db3JlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldER1YmxpbkNvcmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgRFVCTElOX0NPUkUgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpdGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFVCTElOX0NPUkVfX1RJVExFID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFVCTElOX0NPUkVfX0lERU5USUZJRVIgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFVCTElOX0NPUkVfX0RFU0NSSVBUSU9OID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFVCTElOX0NPUkVfX0NSRUFUT1IgPSAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEVUJMSU5fQ09SRV9fREFURSA9IDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFVCTElOX0NPUkVfX0ZPUk1BVCA9IDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVibGlzaGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFVCTElOX0NPUkVfX1BVQkxJU0hFUiA9IDY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q292ZXJhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEVUJMSU5fQ09SRV9fQ09WRVJBR0UgPSA3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRyaWJ1dG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFVCTElOX0NPUkVfX0NPTlRSSUJVVE9SID0gODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWxhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERVQkxJTl9DT1JFX19SRUxBVElPTiA9IDk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmlnaHRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFVCTElOX0NPUkVfX1JJR0hUUyA9IDEwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERVQkxJTl9DT1JFX19TT1VSQ0UgPSAxMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWJqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFVCTElOX0NPUkVfX1NVQkpFQ1QgPSAxMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFVCTElOX0NPUkVfX1RZUEUgPSAxMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYW5ndWFnZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERVQkxJTl9DT1JFX19MQU5HVUFHRSA9IDE0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJpYmxpb2dyYXBoaWMgQ2l0YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEVUJMSU5fQ09SRV9fQklCTElPR1JBUEhJQ19DSVRBVElPTiA9IDE1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEVUJMSU5fQ09SRV9fQ1JFQVRFRCA9IDE2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpY2Vuc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEVUJMSU5fQ09SRV9fTElDRU5TRSA9IDE3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFVCTElOX0NPUkVfX1JFUVVJUkVEID0gMTg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3BhdGlhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERVQkxJTl9DT1JFX19TUEFUSUFMID0gMTk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEVUJMSU5fQ09SRV9fVkFMSUQgPSAyMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EdWJsaW4gQ29yZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEVUJMSU5fQ09SRV9GRUFUVVJFX0NPVU5UID0gMjE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmEubGFuZy5Db21wYXJhYmxlIDxlbT5Db21wYXJhYmxlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRDb21wYXJhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENPTVBBUkFCTEUgPSAyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbXBhcmFibGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09NUEFSQUJMRV9GRUFUVVJFX0NPVU5UID0gMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLklkZW50aWZpYWJsZUltcGwgPGVtPklkZW50aWZpYWJsZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5JZGVudGlmaWFibGVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0SWRlbnRpZmlhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IElERU5USUZJQUJMRSA9IDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSURFTlRJRklBQkxFX19VUkkgPSBDT01QQVJBQkxFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSURFTlRJRklBQkxFX19UWVBFX1VSSSA9IENPTVBBUkFCTEVfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJREVOVElGSUFCTEVfX0RVQkxJTl9DT1JFID0gQ09NUEFSQUJMRV9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JZGVudGlmaWFibGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgPSBDT01QQVJBQkxFX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuSWRlbnRpZmlhYmxlRmlsdGVySW1wbCA8ZW0+SWRlbnRpZmlhYmxlIEZpbHRlcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5JZGVudGlmaWFibGVGaWx0ZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0SWRlbnRpZmlhYmxlRmlsdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IElERU5USUZJQUJMRV9GSUxURVIgPSAzOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklkZW50aWZpYWJsZSBGaWx0ZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSURFTlRJRklBQkxFX0ZJTFRFUl9GRUFUVVJFX0NPVU5UID0gMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkRvdWJsZVZhbHVlTGlzdEltcGwgPGVtPkRvdWJsZSBWYWx1ZSBMaXN0PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkRvdWJsZVZhbHVlTGlzdEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXREb3VibGVWYWx1ZUxpc3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgRE9VQkxFX1ZBTFVFX0xJU1QgPSA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRE9VQkxFX1ZBTFVFX0xJU1RfX1ZBTFVFUyA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERPVUJMRV9WQUxVRV9MSVNUX19JREVOVElGSUVSID0gMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Eb3VibGUgVmFsdWUgTGlzdDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfVkFMVUVfTElTVF9GRUFUVVJFX0NPVU5UID0gMjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkRvdWJsZVZhbHVlTWF0cml4SW1wbCA8ZW0+RG91YmxlIFZhbHVlIE1hdHJpeDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Eb3VibGVWYWx1ZU1hdHJpeEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXREb3VibGVWYWx1ZU1hdHJpeCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBET1VCTEVfVkFMVUVfTUFUUklYID0gNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBMaXN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRE9VQkxFX1ZBTFVFX01BVFJJWF9fVkFMVUVfTElTVFMgPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRvdWJsZSBWYWx1ZSBNYXRyaXg8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRE9VQkxFX1ZBTFVFX01BVFJJWF9GRUFUVVJFX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkRvdWJsZVZhbHVlSW1wbCA8ZW0+RG91YmxlIFZhbHVlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkRvdWJsZVZhbHVlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldERvdWJsZVZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IERPVUJMRV9WQUxVRSA9IDY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERPVUJMRV9WQUxVRV9fSURFTlRJRklFUiA9IE1vZGlmaWVyUGFja2FnZS5NT0RJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRE9VQkxFX1ZBTFVFX19WQUxVRSA9IE1vZGlmaWVyUGFja2FnZS5NT0RJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRvdWJsZSBWYWx1ZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfVkFMVUVfRkVBVFVSRV9DT1VOVCA9IE1vZGlmaWVyUGFja2FnZS5NT0RJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuU3RyaW5nVmFsdWVMaXN0SW1wbCA8ZW0+U3RyaW5nIFZhbHVlIExpc3Q8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuU3RyaW5nVmFsdWVMaXN0SW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldFN0cmluZ1ZhbHVlTGlzdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTVFJJTkdfVkFMVUVfTElTVCA9IDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFJJTkdfVkFMVUVfTElTVF9fVkFMVUVTID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TdHJpbmcgVmFsdWUgTGlzdDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFJJTkdfVkFMVUVfTElTVF9GRUFUVVJFX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLlN0cmluZ1ZhbHVlSW1wbCA8ZW0+U3RyaW5nIFZhbHVlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLlN0cmluZ1ZhbHVlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldFN0cmluZ1ZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNUUklOR19WQUxVRSA9IDg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFJJTkdfVkFMVUVfX1ZBTFVFID0gTW9kaWZpZXJQYWNrYWdlLk1PRElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U3RyaW5nIFZhbHVlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUUklOR19WQUxVRV9GRUFUVVJFX0NPVU5UID0gTW9kaWZpZXJQYWNrYWdlLk1PRElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlVSSTwvZW0+JyBkYXRhIHR5cGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRVUkkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVVJJID0gOTsKKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlIDxlbT5EdWJsaW4gQ29yZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EdWJsaW4gQ29yZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RHVibGluQ29yZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0VGl0bGUgPGVtPlRpdGxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGl0bGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0VGl0bGUoKQorCSAqIEBzZWUgI2dldER1YmxpbkNvcmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfVGl0bGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldElkZW50aWZpZXIgPGVtPklkZW50aWZpZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZGVudGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldElkZW50aWZpZXIoKQorCSAqIEBzZWUgI2dldER1YmxpbkNvcmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfSWRlbnRpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBzZWUgI2dldER1YmxpbkNvcmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfRGVzY3JpcHRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldENyZWF0b3IgPGVtPkNyZWF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DcmVhdG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldENyZWF0b3IoKQorCSAqIEBzZWUgI2dldER1YmxpbkNvcmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfQ3JlYXRvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0RGF0ZSA8ZW0+RGF0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRhdGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0RGF0ZSgpCisJICogQHNlZSAjZ2V0RHVibGluQ29yZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RHVibGluQ29yZV9EYXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRGb3JtYXQgPGVtPkZvcm1hdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZvcm1hdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRGb3JtYXQoKQorCSAqIEBzZWUgI2dldER1YmxpbkNvcmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfRm9ybWF0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRQdWJsaXNoZXIgPGVtPlB1Ymxpc2hlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlB1Ymxpc2hlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRQdWJsaXNoZXIoKQorCSAqIEBzZWUgI2dldER1YmxpbkNvcmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfUHVibGlzaGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRDb3ZlcmFnZSA8ZW0+Q292ZXJhZ2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3ZlcmFnZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRDb3ZlcmFnZSgpCisJICogQHNlZSAjZ2V0RHVibGluQ29yZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RHVibGluQ29yZV9Db3ZlcmFnZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0Q29udHJpYnV0b3IgPGVtPkNvbnRyaWJ1dG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29udHJpYnV0b3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0Q29udHJpYnV0b3IoKQorCSAqIEBzZWUgI2dldER1YmxpbkNvcmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfQ29udHJpYnV0b3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldFJlbGF0aW9uIDxlbT5SZWxhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbGF0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldFJlbGF0aW9uKCkKKwkgKiBAc2VlICNnZXREdWJsaW5Db3JlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREdWJsaW5Db3JlX1JlbGF0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRSaWdodHMgPGVtPlJpZ2h0czwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJpZ2h0czwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRSaWdodHMoKQorCSAqIEBzZWUgI2dldER1YmxpbkNvcmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfUmlnaHRzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvdXJjZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRTb3VyY2UoKQorCSAqIEBzZWUgI2dldER1YmxpbkNvcmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfU291cmNlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRTdWJqZWN0IDxlbT5TdWJqZWN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3ViamVjdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRTdWJqZWN0KCkKKwkgKiBAc2VlICNnZXREdWJsaW5Db3JlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREdWJsaW5Db3JlX1N1YmplY3QoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldFR5cGUoKQorCSAqIEBzZWUgI2dldER1YmxpbkNvcmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0TGFuZ3VhZ2UgPGVtPkxhbmd1YWdlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFuZ3VhZ2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0TGFuZ3VhZ2UoKQorCSAqIEBzZWUgI2dldER1YmxpbkNvcmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfTGFuZ3VhZ2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldEJpYmxpb2dyYXBoaWNDaXRhdGlvbiA8ZW0+QmlibGlvZ3JhcGhpYyBDaXRhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJpYmxpb2dyYXBoaWMgQ2l0YXRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0QmlibGlvZ3JhcGhpY0NpdGF0aW9uKCkKKwkgKiBAc2VlICNnZXREdWJsaW5Db3JlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREdWJsaW5Db3JlX0JpYmxpb2dyYXBoaWNDaXRhdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0Q3JlYXRlZCA8ZW0+Q3JlYXRlZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNyZWF0ZWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0Q3JlYXRlZCgpCisJICogQHNlZSAjZ2V0RHVibGluQ29yZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RHVibGluQ29yZV9DcmVhdGVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRMaWNlbnNlIDxlbT5MaWNlbnNlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGljZW5zZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRMaWNlbnNlKCkKKwkgKiBAc2VlICNnZXREdWJsaW5Db3JlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREdWJsaW5Db3JlX0xpY2Vuc2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldFJlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlcXVpcmVkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldFJlcXVpcmVkKCkKKwkgKiBAc2VlICNnZXREdWJsaW5Db3JlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREdWJsaW5Db3JlX1JlcXVpcmVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRTcGF0aWFsIDxlbT5TcGF0aWFsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3BhdGlhbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRTcGF0aWFsKCkKKwkgKiBAc2VlICNnZXREdWJsaW5Db3JlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREdWJsaW5Db3JlX1NwYXRpYWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldFZhbGlkIDxlbT5WYWxpZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbGlkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldFZhbGlkKCkKKwkgKiBAc2VlICNnZXREdWJsaW5Db3JlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREdWJsaW5Db3JlX1ZhbGlkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRJZGVudGlmaWFibGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUjZ2V0VVJJIDxlbT5VUkk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VUkk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSNnZXRVUkkoKQorCSAqIEBzZWUgI2dldElkZW50aWZpYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0SWRlbnRpZmlhYmxlX1VSSSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSNnZXRUeXBlVVJJIDxlbT5UeXBlIFVSSTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGUgVVJJPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUjZ2V0VHlwZVVSSSgpCisJICogQHNlZSAjZ2V0SWRlbnRpZmlhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRJZGVudGlmaWFibGVfVHlwZVVSSSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSNnZXREdWJsaW5Db3JlIDxlbT5EdWJsaW4gQ29yZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkR1YmxpbiBDb3JlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUjZ2V0RHVibGluQ29yZSgpCisJICogQHNlZSAjZ2V0SWRlbnRpZmlhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRJZGVudGlmaWFibGVfRHVibGluQ29yZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YS5sYW5nLkNvbXBhcmFibGUgPGVtPkNvbXBhcmFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4KKwkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlCisJICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5Db21wYXJhYmxlIiB0eXBlUGFyYW1ldGVycz0iVCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldENvbXBhcmFibGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlRmlsdGVyIDxlbT5JZGVudGlmaWFibGUgRmlsdGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklkZW50aWZpYWJsZSBGaWx0ZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZUZpbHRlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0SWRlbnRpZmlhYmxlRmlsdGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlTGlzdCA8ZW0+RG91YmxlIFZhbHVlIExpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RG91YmxlIFZhbHVlIExpc3Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlTGlzdAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RG91YmxlVmFsdWVMaXN0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZUxpc3QjZ2V0VmFsdWVzIDxlbT5WYWx1ZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlZhbHVlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWVMaXN0I2dldFZhbHVlcygpCisJICogQHNlZSAjZ2V0RG91YmxlVmFsdWVMaXN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXREb3VibGVWYWx1ZUxpc3RfVmFsdWVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWVMaXN0I2dldElkZW50aWZpZXIgPGVtPklkZW50aWZpZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZGVudGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZUxpc3QjZ2V0SWRlbnRpZmllcigpCisJICogQHNlZSAjZ2V0RG91YmxlVmFsdWVMaXN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREb3VibGVWYWx1ZUxpc3RfSWRlbnRpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZU1hdHJpeCA8ZW0+RG91YmxlIFZhbHVlIE1hdHJpeDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Eb3VibGUgVmFsdWUgTWF0cml4PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZU1hdHJpeAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RG91YmxlVmFsdWVNYXRyaXgoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlTWF0cml4I2dldFZhbHVlTGlzdHMgPGVtPlZhbHVlIExpc3RzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5WYWx1ZSBMaXN0czwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWVNYXRyaXgjZ2V0VmFsdWVMaXN0cygpCisJICogQHNlZSAjZ2V0RG91YmxlVmFsdWVNYXRyaXgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldERvdWJsZVZhbHVlTWF0cml4X1ZhbHVlTGlzdHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWUgPGVtPkRvdWJsZSBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Eb3VibGUgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXREb3VibGVWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlI2dldElkZW50aWZpZXIgPGVtPklkZW50aWZpZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZGVudGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZSNnZXRJZGVudGlmaWVyKCkKKwkgKiBAc2VlICNnZXREb3VibGVWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RG91YmxlVmFsdWVfSWRlbnRpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZSNnZXRWYWx1ZSgpCisJICogQHNlZSAjZ2V0RG91YmxlVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERvdWJsZVZhbHVlX1ZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlN0cmluZ1ZhbHVlTGlzdCA8ZW0+U3RyaW5nIFZhbHVlIExpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U3RyaW5nIFZhbHVlIExpc3Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlN0cmluZ1ZhbHVlTGlzdAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U3RyaW5nVmFsdWVMaXN0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZUxpc3QjZ2V0VmFsdWVzIDxlbT5WYWx1ZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlZhbHVlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU3RyaW5nVmFsdWVMaXN0I2dldFZhbHVlcygpCisJICogQHNlZSAjZ2V0U3RyaW5nVmFsdWVMaXN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTdHJpbmdWYWx1ZUxpc3RfVmFsdWVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlN0cmluZ1ZhbHVlIDxlbT5TdHJpbmcgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U3RyaW5nIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U3RyaW5nVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU3RyaW5nVmFsdWUjZ2V0VmFsdWUoKQorCSAqIEBzZWUgI2dldFN0cmluZ1ZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTdHJpbmdWYWx1ZV9WYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkgPGVtPlVSSTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VVJJPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSQorCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRGF0YVR5cGUgZ2V0VVJJKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDb21tb25GYWN0b3J5IGdldENvbW1vbkZhY3RvcnkoKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKwkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorCSAqIDwvdWw+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCWludGVyZmFjZSBMaXRlcmFscyB7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkR1YmxpbkNvcmVJbXBsIDxlbT5EdWJsaW4gQ29yZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5EdWJsaW5Db3JlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXREdWJsaW5Db3JlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIERVQkxJTl9DT1JFID0gZUlOU1RBTkNFLmdldER1YmxpbkNvcmUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRpdGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRFVCTElOX0NPUkVfX1RJVExFID0gZUlOU1RBTkNFLmdldER1YmxpbkNvcmVfVGl0bGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBEVUJMSU5fQ09SRV9fSURFTlRJRklFUiA9IGVJTlNUQU5DRS5nZXREdWJsaW5Db3JlX0lkZW50aWZpZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRFVCTElOX0NPUkVfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldER1YmxpbkNvcmVfRGVzY3JpcHRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNyZWF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBEVUJMSU5fQ09SRV9fQ1JFQVRPUiA9IGVJTlNUQU5DRS5nZXREdWJsaW5Db3JlX0NyZWF0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBEVUJMSU5fQ09SRV9fREFURSA9IGVJTlNUQU5DRS5nZXREdWJsaW5Db3JlX0RhdGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERVQkxJTl9DT1JFX19GT1JNQVQgPSBlSU5TVEFOQ0UuZ2V0RHVibGluQ29yZV9Gb3JtYXQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1Ymxpc2hlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERVQkxJTl9DT1JFX19QVUJMSVNIRVIgPSBlSU5TVEFOQ0UuZ2V0RHVibGluQ29yZV9QdWJsaXNoZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvdmVyYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRFVCTElOX0NPUkVfX0NPVkVSQUdFID0gZUlOU1RBTkNFLmdldER1YmxpbkNvcmVfQ292ZXJhZ2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRyaWJ1dG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRFVCTElOX0NPUkVfX0NPTlRSSUJVVE9SID0gZUlOU1RBTkNFLmdldER1YmxpbkNvcmVfQ29udHJpYnV0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRFVCTElOX0NPUkVfX1JFTEFUSU9OID0gZUlOU1RBTkNFLmdldER1YmxpbkNvcmVfUmVsYXRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJpZ2h0czwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERVQkxJTl9DT1JFX19SSUdIVFMgPSBlSU5TVEFOQ0UuZ2V0RHVibGluQ29yZV9SaWdodHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERVQkxJTl9DT1JFX19TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0RHVibGluQ29yZV9Tb3VyY2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YmplY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBEVUJMSU5fQ09SRV9fU1VCSkVDVCA9IGVJTlNUQU5DRS5nZXREdWJsaW5Db3JlX1N1YmplY3QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBEVUJMSU5fQ09SRV9fVFlQRSA9IGVJTlNUQU5DRS5nZXREdWJsaW5Db3JlX1R5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxhbmd1YWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRFVCTElOX0NPUkVfX0xBTkdVQUdFID0gZUlOU1RBTkNFLmdldER1YmxpbkNvcmVfTGFuZ3VhZ2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJpYmxpb2dyYXBoaWMgQ2l0YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBEVUJMSU5fQ09SRV9fQklCTElPR1JBUEhJQ19DSVRBVElPTiA9IGVJTlNUQU5DRS5nZXREdWJsaW5Db3JlX0JpYmxpb2dyYXBoaWNDaXRhdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q3JlYXRlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERVQkxJTl9DT1JFX19DUkVBVEVEID0gZUlOU1RBTkNFLmdldER1YmxpbkNvcmVfQ3JlYXRlZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGljZW5zZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERVQkxJTl9DT1JFX19MSUNFTlNFID0gZUlOU1RBTkNFLmdldER1YmxpbkNvcmVfTGljZW5zZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBEVUJMSU5fQ09SRV9fUkVRVUlSRUQgPSBlSU5TVEFOQ0UuZ2V0RHVibGluQ29yZV9SZXF1aXJlZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3BhdGlhbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERVQkxJTl9DT1JFX19TUEFUSUFMID0gZUlOU1RBTkNFLmdldER1YmxpbkNvcmVfU3BhdGlhbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBEVUJMSU5fQ09SRV9fVkFMSUQgPSBlSU5TVEFOQ0UuZ2V0RHVibGluQ29yZV9WYWxpZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLklkZW50aWZpYWJsZUltcGwgPGVtPklkZW50aWZpYWJsZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5JZGVudGlmaWFibGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldElkZW50aWZpYWJsZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBJREVOVElGSUFCTEUgPSBlSU5TVEFOQ0UuZ2V0SWRlbnRpZmlhYmxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBJREVOVElGSUFCTEVfX1VSSSA9IGVJTlNUQU5DRS5nZXRJZGVudGlmaWFibGVfVVJJKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIElERU5USUZJQUJMRV9fVFlQRV9VUkkgPSBlSU5TVEFOQ0UuZ2V0SWRlbnRpZmlhYmxlX1R5cGVVUkkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgSURFTlRJRklBQkxFX19EVUJMSU5fQ09SRSA9IGVJTlNUQU5DRS5nZXRJZGVudGlmaWFibGVfRHVibGluQ29yZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgamF2YS5sYW5nLkNvbXBhcmFibGUgPGVtPkNvbXBhcmFibGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRDb21wYXJhYmxlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENPTVBBUkFCTEUgPSBlSU5TVEFOQ0UuZ2V0Q29tcGFyYWJsZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLklkZW50aWZpYWJsZUZpbHRlckltcGwgPGVtPklkZW50aWZpYWJsZSBGaWx0ZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuSWRlbnRpZmlhYmxlRmlsdGVySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRJZGVudGlmaWFibGVGaWx0ZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgSURFTlRJRklBQkxFX0ZJTFRFUiA9IGVJTlNUQU5DRS5nZXRJZGVudGlmaWFibGVGaWx0ZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Eb3VibGVWYWx1ZUxpc3RJbXBsIDxlbT5Eb3VibGUgVmFsdWUgTGlzdDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Eb3VibGVWYWx1ZUxpc3RJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldERvdWJsZVZhbHVlTGlzdCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBET1VCTEVfVkFMVUVfTElTVCA9IGVJTlNUQU5DRS5nZXREb3VibGVWYWx1ZUxpc3QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgRE9VQkxFX1ZBTFVFX0xJU1RfX1ZBTFVFUyA9IGVJTlNUQU5DRS5nZXREb3VibGVWYWx1ZUxpc3RfVmFsdWVzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRE9VQkxFX1ZBTFVFX0xJU1RfX0lERU5USUZJRVIgPSBlSU5TVEFOQ0UuZ2V0RG91YmxlVmFsdWVMaXN0X0lkZW50aWZpZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Eb3VibGVWYWx1ZU1hdHJpeEltcGwgPGVtPkRvdWJsZSBWYWx1ZSBNYXRyaXg8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuRG91YmxlVmFsdWVNYXRyaXhJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldERvdWJsZVZhbHVlTWF0cml4KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIERPVUJMRV9WQUxVRV9NQVRSSVggPSBlSU5TVEFOQ0UuZ2V0RG91YmxlVmFsdWVNYXRyaXgoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIExpc3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBET1VCTEVfVkFMVUVfTUFUUklYX19WQUxVRV9MSVNUUyA9IGVJTlNUQU5DRS5nZXREb3VibGVWYWx1ZU1hdHJpeF9WYWx1ZUxpc3RzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuRG91YmxlVmFsdWVJbXBsIDxlbT5Eb3VibGUgVmFsdWU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuRG91YmxlVmFsdWVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldERvdWJsZVZhbHVlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIERPVUJMRV9WQUxVRSA9IGVJTlNUQU5DRS5nZXREb3VibGVWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERPVUJMRV9WQUxVRV9fSURFTlRJRklFUiA9IGVJTlNUQU5DRS5nZXREb3VibGVWYWx1ZV9JZGVudGlmaWVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERPVUJMRV9WQUxVRV9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0RG91YmxlVmFsdWVfVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5TdHJpbmdWYWx1ZUxpc3RJbXBsIDxlbT5TdHJpbmcgVmFsdWUgTGlzdDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5TdHJpbmdWYWx1ZUxpc3RJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldFN0cmluZ1ZhbHVlTGlzdCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTVFJJTkdfVkFMVUVfTElTVCA9IGVJTlNUQU5DRS5nZXRTdHJpbmdWYWx1ZUxpc3QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU1RSSU5HX1ZBTFVFX0xJU1RfX1ZBTFVFUyA9IGVJTlNUQU5DRS5nZXRTdHJpbmdWYWx1ZUxpc3RfVmFsdWVzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuU3RyaW5nVmFsdWVJbXBsIDxlbT5TdHJpbmcgVmFsdWU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuU3RyaW5nVmFsdWVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldFN0cmluZ1ZhbHVlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNUUklOR19WQUxVRSA9IGVJTlNUQU5DRS5nZXRTdHJpbmdWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTVFJJTkdfVkFMVUVfX1ZBTFVFID0gZUlOU1RBTkNFLmdldFN0cmluZ1ZhbHVlX1ZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5VUkk8L2VtPicgZGF0YSB0eXBlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldFVSSSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVEYXRhVHlwZSBVUkkgPSBlSU5TVEFOQ0UuZ2V0VVJJKCk7CisKKwl9CisKK30gLy9Db21tb25QYWNrYWdlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vRG91YmxlVmFsdWUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9Eb3VibGVWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NTM1N2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vRG91YmxlVmFsdWUuamF2YQpAQCAtMCwwICsxLDg2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb3VibGUgVmFsdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZSNnZXRJZGVudGlmaWVyIDxlbT5JZGVudGlmaWVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldERvdWJsZVZhbHVlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIERvdWJsZVZhbHVlIGV4dGVuZHMgTW9kaWZpYWJsZSB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWRlbnRpZmllcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZGVudGlmaWVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJZGVudGlmaWVyKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXREb3VibGVWYWx1ZV9JZGVudGlmaWVyKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldElkZW50aWZpZXIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWUjZ2V0SWRlbnRpZmllciA8ZW0+SWRlbnRpZmllcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWRlbnRpZmllcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SWRlbnRpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SWRlbnRpZmllcihTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMC4wIjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VmFsdWUoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldERvdWJsZVZhbHVlX1ZhbHVlKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMC4wIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0VmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFZhbHVlKGRvdWJsZSB2YWx1ZSk7CisKK30gLy8gRG91YmxlVmFsdWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9Eb3VibGVWYWx1ZUxpc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9Eb3VibGVWYWx1ZUxpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjZiZjg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL0RvdWJsZVZhbHVlTGlzdC5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvdWJsZSBWYWx1ZSBMaXN0PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWVMaXN0I2dldFZhbHVlcyA8ZW0+VmFsdWVzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlTGlzdCNnZXRJZGVudGlmaWVyIDxlbT5JZGVudGlmaWVyPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RG91YmxlVmFsdWVMaXN0KCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIERvdWJsZVZhbHVlTGlzdCBleHRlbmRzIEVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldERvdWJsZVZhbHVlTGlzdF9WYWx1ZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8RG91YmxlVmFsdWU+IGdldFZhbHVlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWRlbnRpZmllcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZGVudGlmaWVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJZGVudGlmaWVyKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXREb3VibGVWYWx1ZUxpc3RfSWRlbnRpZmllcigpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRJZGVudGlmaWVyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlTGlzdCNnZXRJZGVudGlmaWVyIDxlbT5JZGVudGlmaWVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZGVudGlmaWVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJZGVudGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJZGVudGlmaWVyKFN0cmluZyB2YWx1ZSk7CisKK30gLy8gRG91YmxlVmFsdWVMaXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vRG91YmxlVmFsdWVNYXRyaXguamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9Eb3VibGVWYWx1ZU1hdHJpeC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOTMzNzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vRG91YmxlVmFsdWVNYXRyaXguamF2YQpAQCAtMCwwICsxLDUwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb3VibGUgVmFsdWUgTWF0cml4PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWVNYXRyaXgjZ2V0VmFsdWVMaXN0cyA8ZW0+VmFsdWUgTGlzdHM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXREb3VibGVWYWx1ZU1hdHJpeCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBEb3VibGVWYWx1ZU1hdHJpeCBleHRlbmRzIEVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIExpc3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZUxpc3R9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWUgTGlzdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBMaXN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXREb3VibGVWYWx1ZU1hdHJpeF9WYWx1ZUxpc3RzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PERvdWJsZVZhbHVlTGlzdD4gZ2V0VmFsdWVMaXN0cygpOworCit9IC8vIERvdWJsZVZhbHVlTWF0cml4CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vRHVibGluQ29yZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL0R1YmxpbkNvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTc1ZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL0R1YmxpbkNvcmUuamF2YQpAQCAtMCwwICsxLDgzMSBAQAorLy8gRHVibGluQ29yZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworLyoqCisgKiBBIDxjb2RlPkR1YmxpbkNvcmU8L2NvZGU+IGluc3RhbmNlIHJlY29yZHMgYSBzZXQgb2YgYXR0cmlidXRlcyB0aGF0IGRlc2NyaWJlCisgKiBhICJyZXNvdXJjZSIgYXMgZGVmaW5lZCBpbiB0aGUgIkR1YmxpbiBDb3JlIiBtZXRhZGF0YSBzdGFuZGFyZCA8YQorICogaHJlZj0iaHR0cDovL3d3dy5kdWJsaW5jb3JlLm9yZy8iID5odHRwOi8vd3d3LmR1YmxpbmNvcmUub3JnLzwvYT4uIFRoZXNlCisgKiBhdHRyaWJ1dGVzIGFyZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHNvdXJjZSBhbmQgZGV0YWlscyBvZiB0aGUgdmFyaW91cworICogY29tcG9uZW50cyB0aGF0IGFyZSBjb21iaW5lZCB0byBjcmVhdGUgdGhlIGNhbm9uaWNhbCB7QGxpbmsgR3JhcGh9IHRoYXQgaXMKKyAqIHVzZWQgaW4gU1RFTSBhcyB0aGUgcmVwcmVzZW50YXRpb25hbCBmcmFtZXdvcmsgZm9yIHNpbXVsYXRpb24gc3RhdGUuCisgKiA8cD4KKyAqIE5vdGUgdGhhdCBub3QgYWxsIG9mIHRoZSBkdWJsaW4gY29yZSBhdHRyaWJ1dGVzIGFyZSByZXF1aXJlZC4KKyAqIDwvcD4KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRHVibGluQ29yZSBleHRlbmRzIEVPYmplY3QgeworCisJLyoqCisJICogVGhlIFhNTCBhdHRyaWJ1dGUgbmFtZSBmb3IgdGhlICJGb3JtYXQiIG9mIHRoZSByZXNvdXJjZS4KKwkgKiAKKwkgKiBAc2VlICNnZXRGb3JtYXQoKQorCSAqIEBzZWUgI3NldEZvcm1hdChTdHJpbmcpCisJICovCisJU3RyaW5nIEZPUk1BVCA9ICJmb3JtYXQiOworCisJLyoqCisJICogVGhlIFhNTCBhdHRyaWJ1dGUgbmFtZSBmb3IgdGhlICJJZGVudGlmaWVyIiBvZiB0aGUgcmVzb3VyY2UuIEluIFNURU0gdGhpcworCSAqIGlzIHRoZSBVUkkgb2YgdGhlIHJlc291cmNlLgorCSAqIAorCSAqIEBzZWUgI2dldElkZW50aWZpZXIoKQorCSAqIEBzZWUgI3NldElkZW50aWZpZXIoU3RyaW5nKQorCSAqLworCVN0cmluZyBJREVOVElGSUVSID0gImlkZW50aWZpZXIiOworCisJLyoqCisJICogVGhlIFhNTCBhdHRyaWJ1dGUgbmFtZSBmb3IgdGhlICJUaXRsZSIgb2YgdGhlIHJlc291cmNlLgorCSAqIAorCSAqIEBzZWUgI2dldFRpdGxlKCkKKwkgKiBAc2VlICNzZXRUaXRsZShTdHJpbmcpCisJICovCisJU3RyaW5nIFRJVExFID0gInRpdGxlIjsKKworCS8qKgorCSAqIDxoMT5UaXRsZTwvaDE+CisJICogPHVsPgorCSAqIDxsaT5EZWZpbml0aW9uOjwvbGk+CisJICogIkEgbmFtZSBnaXZlbiB0byB0aGUgcmVzb3VyY2UiCisJICogPGxpPkNvbW1lbnQ6PC9saT4KKwkgKiBVc3VhbGx5IHRoZSBmb3JtYWwgbmFtZSBvZiB0aGUgcmVzb3VyY2UuCisJICogPGxpPkV4YW1wbGU6PC9saT4KKwkgKiAiVW5pdGVkIFN0YXRlcyBBZG1pbmlzdHJhdGlvbiBMZXZlbCAwIgorCSAqIDxsaT5VUkk6PC9saT4KKwkgKiA8YSBocmVmPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xL3RpdGxlIj4KKwkgKiBodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xL3RpdGxlPC9hPgorCSAqIDwvdWw+CisJICogCisJICogQHJldHVybiB0aGUgdGl0bGUgb2YgdGhlIHJlc291cmNlLgorCSAqIEBtb2RlbCByZXF1aXJlZD0iZmFsc2UiCisJICovCisJU3RyaW5nIGdldFRpdGxlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0VGl0bGUgPGVtPlRpdGxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGl0bGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFRpdGxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUaXRsZShTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogPGgxPklkZW50aWZpZXI8L2gxPgorCSAqIDx1bD4KKwkgKiA8bGk+RGVmaW5pdGlvbjo8L2xpPgorCSAqICJBbiB1bmFtYmlndW91cyByZWZlcmVuY2UgdG8gdGhlIHJlc291cmNlIHdpdGhpbiBhIGdpdmVuIGNvbnRleHQuIgorCSAqIDxsaT5Db21tZW50OjwvbGk+CisJICogVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UuCisJICogPGxpPkV4YW1wbGU6PC9saT4KKwkgKiAic3RlbTovL29yZy5lY2xpcHNlLnN0ZW0vc3RlbS9mb28iCisJICogPGxpPlVSSTo8L2xpPgorCSAqIDxhIGhyZWY9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvaWRlbnRpZmllciI+CisJICogaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS9pZGVudGlmaWVyPC9hPgorCSAqIDwvdWw+CisJICogCisJICogQHJldHVybiB0aGUgaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2UuCisJICogQG1vZGVsIHJlcXVpcmVkPSJmYWxzZSIKKwkgKi8KKwlTdHJpbmcgZ2V0SWRlbnRpZmllcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldElkZW50aWZpZXIgPGVtPklkZW50aWZpZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkZW50aWZpZXI8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldElkZW50aWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldElkZW50aWZpZXIoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIDxoMT5EZXNjcmlwdGlvbjwvaDE+CisJICogPHVsPgorCSAqIDxsaT5EZWZpbml0aW9uOjwvbGk+CisJICogIkFuIGFjY291bnQgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIHJlc291cmNlLiIKKwkgKiA8bGk+Q29tbWVudDo8L2xpPgorCSAqIFR5cGljYWxseSBhIHNob3J0IGFic3RyYWN0LgorCSAqIDxsaT5FeGFtcGxlOjwvbGk+CisJICogIkFsbCBvZiB0aGUgY2F0dGxlIGZhcm1zIGluIHRoZSBVLksuIGFzIG9mIDIwMDYuIgorCSAqIDxsaT5VUkk6PC9saT4KKwkgKiA8YSBocmVmPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xL2Rlc2NyaXB0aW9uIj4KKwkgKiBodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xL2Rlc2NyaXB0aW9uPC9hPgorCSAqIDwvdWw+CisJICogCisJICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlc291cmNlLgorCSAqIEBtb2RlbCByZXF1aXJlZD0iZmFsc2UiCisJICovCisJU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiA8aDE+Q3JlYXRvcjwvaDE+CisJICogPHVsPgorCSAqIDxsaT5EZWZpbml0aW9uOjwvbGk+CisJICogIkFuIGVudGl0eSBwcmltYXJpbHkgcmVzcG9uc2libGUgZm9yIG1ha2luZyB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuIgorCSAqIDxsaT5Db21tZW50OjwvbGk+CisJICogVHlwaWNhbGx5IHRoZSBuYW1lIG9mIGEgcGVyc29uIG9yIG9yZ2FuaXphdGlvbi4KKwkgKiA8bGk+RXhhbXBsZTo8L2xpPgorCSAqICJJQk0iCisJICogPGxpPlVSSTo8L2xpPgorCSAqIDxhIGhyZWY9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvY3JlYXRvciI+CisJICogaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS9jcmVhdG9yPC9hPgorCSAqIDwvdWw+CisJICogCisJICogQHJldHVybiB0aGUgY3JlYXRvciBvZiB0aGUgcmVzb3VyY2UuCisJICogQG1vZGVsIHJlcXVpcmVkPSJmYWxzZSIKKwkgKi8KKwlTdHJpbmcgZ2V0Q3JlYXRvcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldENyZWF0b3IKKwkgKiA8ZW0+Q3JlYXRvcjwvZW0+fScgYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZQorCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDcmVhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDcmVhdG9yKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiA8aDE+RGF0ZTwvaDE+CisJICogPHVsPgorCSAqIDxsaT5EZWZpbml0aW9uOjwvbGk+CisJICogIkEgZGF0ZSBhc3NvY2lhdGVkIHdpdGggYW4gZXZlbnQgaW4gdGhlIGxpZmUgY3ljbGUgb2YgdGhlIHJlc291cmNlLiIKKwkgKiA8bGk+Q29tbWVudDo8L2xpPgorCSAqIFR5cGljYWxseSBZWVlZLU1NLURELiBTZWU6IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWUiPgorCSAqIGh0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWU8L2E+LCBhbHNvIElTTyZuYnNwOzg2MDEuCisJICogPGxpPkV4YW1wbGU6PC9saT4KKwkgKiAiMjAwNi0wMy0xNCIKKwkgKiA8bGk+VVJJOjwvbGk+CisJICogPGEgaHJlZj0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS9kYXRlIj4KKwkgKiBodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xL2RhdGU8L2E+CisJICogPC91bD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBkYXRlIG9mIHRoZSByZXNvdXJjZS4KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9ImZhbHNlIgorCSAqLworCVN0cmluZyBnZXREYXRlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0RGF0ZSA8ZW0+RGF0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRhdGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERhdGUoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFNldCB0aGUgZGF0ZS4KKwkgKiAKKwkgKiBAcGFyYW0gZGF0ZQorCSAqIAorCSAqIEBzZWUgI3NldERhdGUoU3RyaW5nKQorCSAqIEBzZWUgI2dldERhdGUoKQorCSAqIEBzZWUgI3NldENyZWF0ZWQoRGF0ZSkKKwkgKi8KKwl2b2lkIHNldERhdGUoZmluYWwgRGF0ZSBkYXRlKTsKKworCS8qKgorCSAqIDxoMT5Gb3JtYXQ8L2gxPgorCSAqIDx1bD4KKwkgKiA8bGk+RGVmaW5pdGlvbjo8L2xpPgorCSAqICJUaGUgcGh5c2ljYWwgb3IgZGlnaXRhbCBtYW5pZmVzdGF0aW9uIG9mIHRoZSByZXNvdXJjZS4iCisJICogPGxpPkNvbW1lbnQ6PC9saT4KKwkgKiBBIE1JTUUgdHlwZSBwZXJoYXBzLgorCSAqIDxsaT5FeGFtcGxlOjwvbGk+ID8KKwkgKiA8bGk+VVJJOjwvbGk+CisJICogPGEgaHJlZj0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS9mb3JtYXQiPgorCSAqIGh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvZm9ybWF0PC9hPgorCSAqIDwvdWw+CisJICogCisJICogQHJldHVybiB0aGUgZm9ybWF0IG9mIHRoZSByZXNvdXJjZS4KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9ImZhbHNlIgorCSAqLworCVN0cmluZyBnZXRGb3JtYXQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAnCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRGb3JtYXQKKwkgKiA8ZW0+Rm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0Rm9ybWF0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRGb3JtYXQoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIDxoMT5QdWJsaXNoZXI8L2gxPgorCSAqIDx1bD4KKwkgKiA8bGk+RGVmaW5pdGlvbjo8L2xpPgorCSAqICJBbiBlbnRpdHkgcmVzcG9uc2libGUgZm9yIG1ha2luZyB0aGUgcmVzb3VyY2UgYXZhaWxhYmxlLiIKKwkgKiA8bGk+Q29tbWVudDo8L2xpPgorCSAqIFR5cGljYWxseSB0aGUgbmFtZSBvZiBhIHBlcnNvbiwgb3JnYW5pemF0aW9uIG9yIHNlcnZpY2UuCisJICogPGxpPkV4YW1wbGU6PC9saT4KKwkgKiAiSUJNIgorCSAqIDxsaT5VUkk6PC9saT4KKwkgKiA8YSBocmVmPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xL3B1Ymxpc2hlciI+CisJICogaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS9wdWJsaXNoZXI8L2E+CisJICogPC91bD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBwdWJsaXNoZXIgb2YgdGhlIHJlc291cmNlLgorCSAqIEBtb2RlbCByZXF1aXJlZD0iZmFsc2UiCisJICovCisJU3RyaW5nIGdldFB1Ymxpc2hlcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldFB1Ymxpc2hlcgorCSAqIDxlbT5QdWJsaXNoZXI8L2VtPn0nIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGlzaGVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRQdWJsaXNoZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFB1Ymxpc2hlcihTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogPGgxPkNvdmVyYWdlPC9oMT4KKwkgKiA8dWw+CisJICogPGxpPkRlZmluaXRpb246PC9saT4KKwkgKiAiVGhlIGV4dGVudCBvciBzY29wZSBvZiB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuIgorCSAqIDxsaT5Db21tZW50OjwvbGk+CisJICogQ291bGQgaW5jbHVkZSBzcGF0aWFsIGxvY2F0aW9uLCB0ZW1wb3JhbCBwZXJpb2QgKGRhdGUgb3IgZGF0ZSByYW5nZSksCisJICoganVyaXNkaWN0aW9uLiBTZWUsIHRoZSA8YQorCSAqIGhyZWY9Imh0dHA6Ly93d3cuZHVibGluY29yZS5vcmcvZG9jdW1lbnRzL2RjbWktcG9pbnQvIj4gRENNSSBQb2ludCA8L2E+LAorCSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ2V0dHkuZWR1L3Jlc2VhcmNoL3Rvb2xzL3ZvY2FidWxhcnkvdGduL2luZGV4Lmh0bWwiPgorCSAqIFRoZXNhdXJ1cyBvZiBHZW9ncmFwaGljIE5hbWVzPC9hPiwgPGEKKwkgKiBocmVmPSJodHRwOi8vd3d3LmR1YmxpbmNvcmUub3JnL2RvY3VtZW50cy9kY21pLXBlcmlvZC8iPkRDTUkgUGVyaW9kPC9hPgorCSAqIDxsaT5FeGFtcGxlOjwvbGk+CisJICogIlVuaXRlZCBTdGF0ZXMgVU4gQWRtaW5pc3RyYXRpb24gbGV2ZWwgMiwgMTkwMCIKKwkgKiA8bGk+VVJJOjwvbGk+CisJICogPGEgaHJlZj0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS9jb3ZlcmFnZSI+CisJICogaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS9jb3ZlcmFnZTwvYT4KKwkgKiA8L3VsPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGNvdmVyYWdlIG9mIHRoZSByZXNvdXJjZS4KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9ImZhbHNlIgorCSAqLworCVN0cmluZyBnZXRDb3ZlcmFnZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldENvdmVyYWdlCisJICogPGVtPkNvdmVyYWdlPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvdmVyYWdlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDb3ZlcmFnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Q292ZXJhZ2UoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIDxoMT5Db250cmlidXRvcjwvaDE+CisJICogPHVsPgorCSAqIDxsaT5EZWZpbml0aW9uOjwvbGk+CisJICogIkFuIGVudGl0eSByZXNwb25zaWJsZSBmb3IgbWFraW5nIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHJlc291cmNlIgorCSAqIDxsaT5Db21tZW50OjwvbGk+CisJICogVHlwaWNhbGx5IHRoZSBuYW1lIG9mIGEgcGVyc29uLCBvcmdhbml6YXRpb24gb3Igc2VydmljZS4KKwkgKiA8bGk+RXhhbXBsZTo8L2xpPgorCSAqICJJQk0iCisJICogPGxpPlVSSTo8L2xpPgorCSAqIDxhIGhyZWY9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvY29udHJpYnV0b3IiPgorCSAqIGh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvY29udHJpYnV0b3I8L2E+CisJICogPC91bD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjb250cmlidXRvciBvZiB0aGUgcmVzb3VyY2UuCisJICogQG1vZGVsIHJlcXVpcmVkPSJmYWxzZSIKKwkgKi8KKwlTdHJpbmcgZ2V0Q29udHJpYnV0b3IoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRDb250cmlidXRvciA8ZW0+Q29udHJpYnV0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRyaWJ1dG9yPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDb250cmlidXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Q29udHJpYnV0b3IoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIDxoMT5SZWxhdGlvbjwvaDE+CisJICogPHVsPgorCSAqIDxsaT5EZWZpbml0aW9uOjwvbGk+CisJICogIkEgcmVmZXJlbmNlIHRvIGEgcmVsYXRlZCByZXNvdXJjZS4iCisJICogPGxpPkNvbW1lbnQ6PC9saT4KKwkgKiBQZXJoYXBzIGEgVVJMPworCSAqIDxsaT5FeGFtcGxlOjwvbGk+ID8KKwkgKiA8bGk+VVJJOjwvbGk+CisJICogPGEgaHJlZj0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS9yZWxhdGlvbiI+CisJICogaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS9yZWxhdGlvbjwvYT4KKwkgKiA8L3VsPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHJlbGF0aW9uIG9mIHRoZSByZXNvdXJjZS4KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9ImZhbHNlIgorCSAqLworCVN0cmluZyBnZXRSZWxhdGlvbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldFJlbGF0aW9uCisJICogPGVtPlJlbGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRSZWxhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVsYXRpb24oU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIDxoMT5SaWdodHM8L2gxPgorCSAqIDx1bD4KKwkgKiA8bGk+RGVmaW5pdGlvbjo8L2xpPgorCSAqICJJbmZvcm1hdGlvbiBhYm91dCByaWdodHMgaGVsZCBpbiBhbmQgb3ZlciB0aGUgcmVzb3VyY2UuIgorCSAqIDxsaT5Db21tZW50OjwvbGk+CisJICogVHlwaWNhbGx5LCBhIHJpZ2h0cyBtYW5hZ2VtZW50IHN0YXRlbWVudC4KKwkgKiA8bGk+RXhhbXBsZTo8L2xpPgorCSAqICYjMTY5O0lCTSAyMDA2CisJICogPGxpPlVSSTo8L2xpPgorCSAqIDxhIGhyZWY9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvcmlnaHRzIj4KKwkgKiBodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xL3JpZ2h0czwvYT4KKwkgKiA8L3VsPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHJpZ2h0cyBvZiB0aGUgcmVzb3VyY2UuCisJICogQG1vZGVsIHJlcXVpcmVkPSJmYWxzZSIKKwkgKi8KKwlTdHJpbmcgZ2V0UmlnaHRzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJworCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0UmlnaHRzCisJICogPGVtPlJpZ2h0czwvZW0+fScgYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZQorCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SaWdodHM8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFJpZ2h0cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmlnaHRzKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiA8aDE+U291cmNlPC9oMT4KKwkgKiA8dWw+CisJICogPGxpPkRlZmluaXRpb246PC9saT4KKwkgKiAiQSByZWZlcmVuY2UgdG8gYSByZXNvdXJjZSBmcm9tIHdoaWNoIHRoZSBwcmVzZW50IHJlc291cmNlIGlzIGRlcml2ZWQuIgorCSAqIDxsaT5Db21tZW50OjwvbGk+CisJICogVGhlIG9yaWdpbmFsIHNvdXJjZSBvZiB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlLgorCSAqIDxsaT5FeGFtcGxlOjwvbGk+CisJICogIlVTIFRpZ2VyIGZpbGVzIgorCSAqIDxsaT5VUkk6PC9saT4KKwkgKiA8YSBocmVmPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xL3NvdXJjZSI+CisJICogaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS9zb3VyY2U8L2E+CisJICogPC91bD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzb3VyY2Ugb2YgdGhlIHJlc291cmNlLgorCSAqIEBtb2RlbCByZXF1aXJlZD0iZmFsc2UiCisJICovCisJU3RyaW5nIGdldFNvdXJjZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldFNvdXJjZQorCSAqIDxlbT5Tb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRTb3VyY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNvdXJjZShTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogPGgxPlN1YmplY3Q8L2gxPgorCSAqIDx1bD4KKwkgKiA8bGk+RGVmaW5pdGlvbjo8L2xpPgorCSAqICJUaGUgdG9waWMgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIHJlc291cmNlIgorCSAqIDxsaT5Db21tZW50OjwvbGk+CisJICogVHlwaWNhbGx5IGtleXdvcmRzIG9yIGNsYXNzaWZpY2F0aW9uIGNvZGVzLgorCSAqIDxsaT5FeGFtcGxlOjwvbGk+ID8KKwkgKiA8bGk+VVJJOjwvbGk+CisJICogPGEgaHJlZj0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS9zdWJqZWN0Ij4KKwkgKiBodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xL3N1YmplY3Q8L2E+CisJICogPC91bD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzdWJqZWN0IG9mIHRoZSByZXNvdXJjZS4KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9ImZhbHNlIgorCSAqLworCVN0cmluZyBnZXRTdWJqZWN0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJworCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0U3ViamVjdAorCSAqIDxlbT5TdWJqZWN0PC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1YmplY3Q8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFN1YmplY3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFN1YmplY3QoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIDxoMT5UeXBlPC9oMT4KKwkgKiA8dWw+CisJICogPGxpPkRlZmluaXRpb246PC9saT4KKwkgKiAiVGhlIG5hdHVyZSBvciBnZW5yZSBvZiB0aGUgcmVzb3VyY2UuIgorCSAqIDxsaT5Db21tZW50OjwvbGk+CisJICogU2VlOiA8YQorCSAqIGhyZWY9Imh0dHA6Ly9kdWJsaW5jb3JlLm9yZy9kb2N1bWVudHMvZGNtaS10eXBlLXZvY2FidWxhcnkvIj5odHRwOgorCSAqIC8vZHVibGluY29yZS5vcmcvZG9jdW1lbnRzL2RjbWktdHlwZS12b2NhYnVsYXJ5LzwvYT4KKwkgKiA8bGk+RXhhbXBsZTo8L2xpPiA/CisJICogPGxpPlVSSTo8L2xpPgorCSAqIDxhIGhyZWY9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvdHlwZSI+CisJICogaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS90eXBlPC9hPgorCSAqIDwvdWw+CisJICogCisJICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UuCisJICogQG1vZGVsIHJlcXVpcmVkPSJmYWxzZSIKKwkgKi8KKwlTdHJpbmcgZ2V0VHlwZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiA8aDE+TGFuZ3VhZ2U8L2gxPgorCSAqIDx1bD4KKwkgKiA8bGk+RGVmaW5pdGlvbjo8L2xpPgorCSAqICJBIGxhbmd1YWdlIG9mIHRoZSBpbnRlbGxlY3R1YWwgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuIgorCSAqIDxsaT5Db21tZW50OjwvbGk+CisJICogQmVzdCBwcmFjdGljZSA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzMDY2LnR4dCI+IFJGQyAzMDY2PC9hPgorCSAqIGFuZCA8YSBocmVmPSJodHRwOi8vd3d3LmxvYy5nb3Yvc3RhbmRhcmRzL2lzbzYzOS0yLyI+SVNPIDYzOTwvYT4KKwkgKiA8bGk+RXhhbXBsZTo8L2xpPgorCSAqICJlbi1HQiIKKwkgKiA8bGk+VVJJOjwvbGk+CisJICogPGEgaHJlZj0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS9sYW5ndWFnZSI+CisJICogaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS9sYW5ndWFnZTwvYT4KKwkgKiA8L3VsPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGxhbmd1YWdlIG9mIHRoZSByZXNvdXJjZS4KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9ImZhbHNlIgorCSAqLworCVN0cmluZyBnZXRMYW5ndWFnZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldExhbmd1YWdlCisJICogPGVtPkxhbmd1YWdlPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhbmd1YWdlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRMYW5ndWFnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIGgxPkJpYmxpb2dyYXBoaWMgQ2l0YXRpb248L2gxPgorCSAqIDx1bD4KKwkgKiA8bGk+RGVmaW5pdGlvbjo8L2xpPgorCSAqICJBIGJpYmxpb2dyYXBoaWMgcmVmZXJlbmNlIGZvciB0aGUgcmVzb3VyY2UuIgorCSAqIDxsaT5Db21tZW50OjwvbGk+CisJICogCisJICogPGxpPkV4YW1wbGU6PC9saT4KKwkgKiBGb3JkLCBELkEuLCAiU1RFTSBhbmQgdGhlIGFydCBvZiBjb21wdXRlciBtYWludGVuYW5jZSIsIEpvdXJuYWwgb2YKKwkgKiBGb29iYXIsIDIwMDYuCisJICogPGxpPlVSSTo8L2xpPgorCSAqIDxhIGhyZWY9Imh0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy8xLjEvYmlibGlvZ3JhcGhpY0NpdGF0aW9uIj4KKwkgKiBodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvMS4xL2JpYmxpb2dyYXBoaWNDaXRhdGlvbjwvYT4KKwkgKiA8L3VsPgorCSAqIAorCSAqIEByZXR1cm4gYSBiaWJsaW9ncmFwaGljIGNpdGF0aW9uCisJICogQG1vZGVsIHJlcXVpcmVkPSJmYWxzZSIKKwkgKi8KKwlTdHJpbmcgZ2V0QmlibGlvZ3JhcGhpY0NpdGF0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0QmlibGlvZ3JhcGhpY0NpdGF0aW9uIDxlbT5CaWJsaW9ncmFwaGljIENpdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CaWJsaW9ncmFwaGljIENpdGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRCaWJsaW9ncmFwaGljQ2l0YXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEJpYmxpb2dyYXBoaWNDaXRhdGlvbihTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogaDE+Q3JlYXRlZDwvaDE+CisJICogPHVsPgorCSAqIDxsaT5EZWZpbml0aW9uOjwvbGk+CisJICogIlRoZSBjcmVhdGlvbiBkYXRlIG9mIHRoZSByZXNvdXJjZS4iCisJICogPGxpPkNvbW1lbnQ6PC9saT4KKwkgKiBCYXNpY2FsbHksIHRoZSBmb3JtYXQgaXM6IFlZWVktTU0tREQKKwkgKiA8bGk+RXhhbXBsZTo8L2xpPgorCSAqIDIwMDYtMDMtMjkKKwkgKiA8bGk+VVJJOjwvbGk+CisJICogPGEgaHJlZj0iaHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zLzEuMS9jcmVhdGVkIj4KKwkgKiBodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvMS4xL2NyZWF0ZWQ8L2E+CisJICogPC91bD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBkYXRlIHRoZSByZXNvdXJjZSB3YXMgY3JlYXRlZC4KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9ImZhbHNlIgorCSAqLworCVN0cmluZyBnZXRDcmVhdGVkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJworCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0Q3JlYXRlZAorCSAqIDxlbT5DcmVhdGVkPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldENyZWF0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldENyZWF0ZWQoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFNldCB0aGUgZGF0ZSB0aGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQuCisJICogCisJICogQHBhcmFtIGRhdGUKKwkgKiAgICAgICAgICAgIHRoZSBjcmVhdGlvbiBkYXRlIG9mIHRoZSByZXNvdXJjZQorCSAqIAorCSAqIEBzZWUgI3NldENyZWF0ZWQoU3RyaW5nKQorCSAqIEBzZWUgI2dldENyZWF0ZWQoKQorCSAqIEBzZWUgI3NldERhdGUoRGF0ZSkKKwkgKiBAc2VlCisJICovCisJdm9pZCBzZXRDcmVhdGVkKGZpbmFsIERhdGUgZGF0ZSk7CisKKwkvKioKKwkgKiBoMT5MaWNlbnNlPC9oMT4KKwkgKiA8dWw+CisJICogPGxpPkRlZmluaXRpb246PC9saT4KKwkgKiJBIGxlZ2FsIGRvY3VtZW50IGdpdmluZyBvZmZpY2lhbCBwZXJtaXNzaW9uIHRvIGRvIHNvbWV0aGluZyB3aXRoIHRoZQorCSAqIHJlc291cmNlLiIKKwkgKiA8bGk+Q29tbWVudDo8L2xpPgorCSAqIEJlc3QgcHJhY3RpY2UgaXMgdG8gdXNlIGEgVVJJIHRvIHRoZSBzcGVjaWZpYyBsaWNlbnNlLgorCSAqIDxsaT5FeGFtcGxlOjwvbGk+CisJICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZS8KKwkgKiA8bGk+VVJJOjwvbGk+CisJICogPGEgaHJlZj0iaHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zLzEuMS9saWNlbnNlIj4KKwkgKiBodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvMS4xL2xpY2Vuc2U8L2E+CisJICogPC91bD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsaWNlbnNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UKKwkgKiBAbW9kZWwgcmVxdWlyZWQ9ImZhbHNlIgorCSAqLworCVN0cmluZyBnZXRMaWNlbnNlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJworCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0TGljZW5zZQorCSAqIDxlbT5MaWNlbnNlPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpY2Vuc2U8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldExpY2Vuc2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldExpY2Vuc2UoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIGgxPlJlcXVpcmVzPC9oMT4KKwkgKiA8dWw+CisJICogPGxpPkRlZmluaXRpb246PC9saT4KKwkgKiJUaGUgZGVzY3JpYmVkIHJlc291cmNlIHJlcXVpcmVzIHRoZSByZWZlcmVuY2VkIHJlc291cmNlIHRvIHN1cHBvcnQgaXRzCisJICogZnVuY3Rpb24sIGRlbGl2ZXJ5LCBvciBjb2hlcmVuY2Ugb2YgY29udGVudC4iCisJICogPGxpPkNvbW1lbnQ6PC9saT4KKwkgKiBJbiBTVEVNIHRoaXMgaXMgdGhlIFVSSSB0aGF0IGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSByZXF1aXJlZCByZXNvdXJjZS4KKwkgKiA8bGk+RXhhbXBsZTo8L2xpPgorCSAqIHN0ZW06L2dyYXBocy9zYW1wbGUvc2FtcGxlMS5ncmFwaAorCSAqIDxsaT5VUkk6PC9saT4KKwkgKiA8YSBocmVmPSJodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvMS4xL3JlcXVpcmVzIj4KKwkgKiBodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvMS4xL3JlcXVpcmVzPC9hPgorCSAqIDwvdWw+CisJICogCisJICogQHJldHVybiB0aGUgaWRlbnRpZmllciBvZiBhIHJlc291cmNlIHJlcXVpcmVkIGJ5IHRoaXMgcmVzb3VyY2UKKwkgKiBAbW9kZWwgcmVxdWlyZWQ9ImZhbHNlIgorCSAqLworCVN0cmluZyBnZXRSZXF1aXJlZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldFJlcXVpcmVkCisJICogPGVtPlJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcXVpcmVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRSZXF1aXJlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVxdWlyZWQoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIGgxPlNwYXRpYWw8L2gxPgorCSAqIDx1bD4KKwkgKiA8bGk+RGVmaW5pdGlvbjo8L2xpPgorCSAqICJTcGF0aWFsIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgaW50ZWxsZWN0dWFsIGNvbnRlbnQgb2YgdGhlIHJlc291cmNlLiIKKwkgKiA8bGk+Q29tbWVudDo8L2xpPgorCSAqIFNlZSA8YSBocmVmPSJodHRwOi8vd3d3LmR1YmxpbmNvcmUub3JnL2RvY3VtZW50cy9kY21pLXBvaW50LyI+CisJICogaHR0cDovL3d3dy5kdWJsaW5jb3JlLm9yZy9kb2N1bWVudHMvZGNtaS1wb2ludC88L2E+IEhvd2V2ZXIsIHRoaXMgc2hvdWxkCisJICogcHJvYmFibHkgYmUgYSBVUkkgdG8gYSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGFjdHVhbCBsYXQvbG9uZyBkYXRhIHRoYXQKKwkgKiBkZXNjcmliZXMgYSBwb2x5Z29uIHRoYXQgZGVmaW5lcyB0aGUgc3BhdGlhbCBvdXRsaW5lIG9mIGEgcGxhY2UuCisJICogPGxpPkV4YW1wbGU6PC9saT4gPworCSAqIDxsaT5VUkk6PC9saT4KKwkgKiA8YSBocmVmPSJodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvMS4xL3NwYXRpYWwiPgorCSAqIGh0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy8xLjEvc3BhdGlhbDwvYT4KKwkgKiA8L3VsPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGlkZW50aWZpZXIgb2YgYSByZXNvdXJjZSBwcm92aWRpbmcgc3BhdGlhbCBkYXRhCisJICogQG1vZGVsIHJlcXVpcmVkPSJmYWxzZSIKKwkgKi8KKwlTdHJpbmcgZ2V0U3BhdGlhbCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldFNwYXRpYWwKKwkgKiA8ZW0+U3BhdGlhbDwvZW0+fScgYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZQorCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TcGF0aWFsPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRTcGF0aWFsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTcGF0aWFsKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiA8aDE+VmFsaWQ8L2gxPgorCSAqIDx1bD4KKwkgKiA8bGk+RGVmaW5pdGlvbjo8L2xpPgorCSAqICJEYXRlIChvZnRlbiBhIHJhbmdlKSBvZiB2YWxpZGl0eSBvZiBhIHJlc291cmNlLiIKKwkgKiA8bGk+Q29tbWVudDo8L2xpPgorCSAqIFNlZSBlbmNvZGVkIGluIElTTyZuYnNwOzg2MDEgPGEKKwkgKiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9OT1RFLWRhdGV0aW1lIj4KKwkgKiBodHRwOi8vd3d3LnczLm9yZy9UUi9OT1RFLWRhdGV0aW1lPC9hPi4KKwkgKiA8bGk+RXhhbXBsZTo8L2xpPgorCSAqIHN0YXJ0PTIwMDYtMDMtMjk7IGVuZD0yMDA2LTAzLTMwOyBvciBzaW1wbHkgc3RhcnQ9MjAwNi0wMy0yOTsgaWYgdGhlcmUgaXMKKwkgKiBubyBlbmQgdG8gdGhlIHZhbGlkaXR5CisJICogPGxpPlVSSTo8L2xpPgorCSAqIDxhIGhyZWY9Imh0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy8xLjEvdmFsaWQiPgorCSAqIGh0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy8xLjEvdmFsaWQ8L2E+CisJICogPC91bD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBkYXRlLCBvciByYW5nZSB0aGF0IHRoZSByZXNvdXJjZSBpcyB2YWxpZC4KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9ImZhbHNlIgorCSAqLworCVN0cmluZyBnZXRWYWxpZCgpOworCisJLyoqCisJICogQHJldHVybiB0aGUgc3RhcnRpbmcge0BsaW5rIERhdGV9IG9mIHRoZSB2YWxpZCBkYXRlIHJhbmdlLCBvcgorCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZhbGlkIHZhbHVlIGlzIG5vdCBzZXQgb3IgaXMgbm90CisJICogICAgICAgICBjb3JyZWN0bHkgZm9ybWF0dGVkIGFzIGFuIElTTyZuYnNwOzg2MDEgZGF0ZSBzdHJpbmcgPGEKKwkgKiAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWUiPgorCSAqICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvTk9URS1kYXRldGltZTwvYT4uCisJICovCisJRGF0ZSBnZXRWYWxpZFN0YXJ0RGF0ZSgpOworCisJLyoqCisJICogQHJldHVybiB0aGUgZW5kaW5nIHtAbGluayBEYXRlfSBvZiB0aGUgdmFsaWQgZGF0ZSByYW5nZSwgb3IKKwkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2YWxpZCB2YWx1ZSBpcyBub3Qgc2V0IG9yIHRoZSBlbmQgZGF0ZQorCSAqICAgICAgICAgaXMgbm90IHNwZWNpZmllZCwgb3IgdGhlIHZhbHVlIGlzIG5vdCBjb3JyZWN0bHkgZm9ybWF0dGVkIGFzIGFuCisJICogICAgICAgICBJU08mbmJzcDs4NjAxIGRhdGUgc3RyaW5nIDxhCisJICogICAgICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9OT1RFLWRhdGV0aW1lIj4KKwkgKiAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWU8L2E+LgorCSAqLworCURhdGUgZ2V0VmFsaWRFbmREYXRlKCk7CisKKwkvKioKKwkgKiBAcGFyYW0gZHVibGluQ29yZQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHZhbGlkIGRhdGUgcmFuZ2UKKwkgKiAgICAgICAgIGF0dHJpYnV0ZSBpcyBiZWZvcmUgdGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHBhc3NlZAorCSAqICAgICAgICAge0BsaW5rIER1YmxpbkNvcmV9IGluc3RhbmNlJ3MgdmFsaWQgZGF0ZSByYW5nZSwgb3IsIGlmIHRoZSBwYXNzZWQKKwkgKiAgICAgICAgIGluc3RhbmNlIGlzIDxjb2RlPm51bGw8L2NvZGU+LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorCSAqICAgICAgICAgQWxzbywgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHJldHVybmVkIGlmIGVpdGhlciBpbnN0YW5jZSBkb2VzIG5vdAorCSAqICAgICAgICAgc3BlY2lmeSBhIHZhbGlkIGRhdGUgcmFuZ2UuCisJICogCisJICogQHNlZSBEdWJsaW5Db3JlI2dldFZhbGlkKCkKKwkgKi8KKwlib29sZWFuIGlzVmFsaWRCZWZvcmUoRHVibGluQ29yZSBkdWJsaW5Db3JlKTsKKworCS8qKgorCSAqIENvbXB1dGUgdGhlIGV4dGVudCBvZiB0aGUgb3ZlcmxhcCBvZiB0aGUgdmFsaWQgZGF0ZSByYW5nZSBvZiB0aGlzCisJICogaW5zdGFuY2Ugd2l0aCB0aGF0IG9mIHRoZSBwYXNzZWQgaW5zdGFuY2UuIElmIG9ubHkgb25lIGluc3RhbmNlIGhhcyBhCisJICogdmFsaWQgZGF0YSByYW5nZSBzcGVjaWZpZWQgdGhhdCB3aWxsIGJlIHJldHVybmVkLgorCSAqIAorCSAqIEBwYXJhbSBkdWJsaW5Db3JlCisJICogQHJldHVybiAwLXN0YXJ0IGRhdGUgb2YgbmV3IHJhbmdlLCAxLWVuZCBkYXRlIG9mIG5ldyByYW5nZSwgb3IKKwkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIG92ZXJsYXAuCisJICovCisJRGF0ZVtdIGNvbXB1dGVWYWxpZERhdGVSYW5nZU92ZXJsYXAoRHVibGluQ29yZSBkdWJsaW5Db3JlKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0VmFsaWQgPGVtPlZhbGlkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFZhbGlkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRWYWxpZChTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogU2V0IHRoZSBzdGFydGluZyBkYXRlIHRoYXQgdGhlIHJlc291cmNlIGlzIHZhbHVlLiBObyBlbmQgZGF0ZSB3aWxsIGJlCisJICogc2V0LgorCSAqIAorCSAqIEBwYXJhbSBzdGFydERhdGUKKwkgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBkYXRlCisJICogCisJICogQHNlZSAjc2V0VmFsaWQoU3RyaW5nKQorCSAqIEBzZWUgI3NldFZhbGlkKERhdGUsIERhdGUpCisJICogQHNlZSAjc2V0RGF0ZShEYXRlKQorCSAqIEBzZWUgI3NldENyZWF0ZWQoRGF0ZSkKKwkgKi8KKwl2b2lkIHNldFZhbGlkKGZpbmFsIERhdGUgc3RhcnREYXRlKTsKKworCS8qKgorCSAqIFNldCB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZyBkYXRlcyB0aGF0IHRoZSByZXNvdXJjZSBpcyB2YWxpZC4KKwkgKiAKKwkgKiBAcGFyYW0gc3RhcnREYXRlCisJICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgZGF0ZQorCSAqIEBwYXJhbSBlbmREYXRlCisJICogICAgICAgICAgICB0aGUgZW5kaW5nIGRhdGUKKwkgKiAKKwkgKiBAc2VlICNzZXRWYWxpZChTdHJpbmcpCisJICogQHNlZSAjc2V0VmFsaWQoRGF0ZSkKKwkgKiBAc2VlICNzZXREYXRlKERhdGUpCisJICogQHNlZSAjc2V0Q3JlYXRlZChEYXRlKQorCSAqLworCXZvaWQgc2V0VmFsaWQoZmluYWwgRGF0ZSBzdGFydERhdGUsIGZpbmFsIERhdGUgZW5kRGF0ZSk7CisKKwkvKioKKwkgKiBJbml0aWFsaXplIHNvbWUgb2YgdGhlIER1YmxpbiBDb3JlIHRlcm1zIGZyb20gaW5mb3JtYXRpb24gYXZhaWxhYmxlIGZyb20KKwkgKiB0aGUgcnVuLXRpbWUgZW52aXJvbm1lbnQuCisJICogPHVsPgorCSAqIDxsaT48Y29kZT5DcmVhdGVkPC9jb2RlPiBpcyBzZXQgdG8gdGhlIGN1cnJlbnQgZGF0ZSAoZS5nLiwgMjAwNi0wNi0wMik8L2xpPgorCSAqIDxsaT48Y29kZT5DcmVhdG9yPC9jb2RlPiBpcyBzZXQgdG8gdGhlIHZhbHVlIHJldHVybmVkIGJ5CisJICogPGNvZGU+U3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLm5hbWUiKTwvY29kZT4gKGUuZy4sIDxjb2RlPmRhZm9yZDwvY29kZT4pCisJICogPC91bD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZQorCSAqIAorCSAqIEBzZWUgI3NldENyZWF0ZWQoU3RyaW5nKQorCSAqIEBzZWUgI3NldERhdGUoU3RyaW5nKQorCSAqIEBzZWUgI3NldFZhbGlkKFN0cmluZykKKwkgKiBAc2VlICNzZXRDcmVhdG9yKFN0cmluZykKKwkgKiAKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJRHVibGluQ29yZSBwb3B1bGF0ZSgpOworfSAvLyBEdWJsaW5Db3JlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vSWRlbnRpZmlhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vSWRlbnRpZmlhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFlN2I2YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9JZGVudGlmaWFibGUuamF2YQpAQCAtMCwwICsxLDkzIEBACisvLyBJZGVudGlmaWFibGUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEubGFuZy5Db21wYXJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKKy8qKgorICogQW4gPGNvZGU+SWRlbnRpZmlhYmxlPC9jb2RlPiBpbnN0YW5jZSByZXByZXNlbnRzIGFuICJpZGVudGlmaWFibGUiCisgKiBjb21wb25lbnQgaW4gU1RFTS4gU3VjaCBhIGNvbXBvbmVudCBpcyBvbmUgdGhhdCBpcyB1bmlxdWVseSBpZGVudGlmaWVkIGJ5IGEKKyAqIHtAbGluayBVUkl9LiBBbiA8Y29kZT5JZGVudGlmaWFibGU8L2NvZGU+IGFsc28gaGFzIHtAbGluayBEdWJsaW5Db3JlfQorICogbWV0YWRhdGEgKDxhIGhyZWY9Imh0dHA6Ly93d3cuZHVibGluY29yZS5vcmcvIiA+aHR0cDovL3d3dy5kdWJsaW5jb3JlLm9yZy88L2E+KQorICogYXNzb2NpYXRlZCB3aXRoIGl0IHRoYXQgZGVmaW5lcyBpdHMgb3JpZ2luIGFuZCBjb250ZW50cy4KKyAqIDxwPgorICogVmlydHVhbGx5IGFsbCBjb21wb25lbnRzIGluIGEgU1RFTSBzaW11bGF0aW9uIGFyZSA8Y29kZT5JZGVudGlmaWFibGU8L2NvZGU+LgorICogPC9wPgorICogCisgKiBAc2VlIEdyYXBoCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbAorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8KKyAqIAorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICogQGltcGxlbWVudHMgU2FuaXR5Q2hlY2tlcgorICovCitwdWJsaWMgaW50ZXJmYWNlIElkZW50aWZpYWJsZSBleHRlbmRzIEVPYmplY3QsIENvbXBhcmFibGU8SWRlbnRpZmlhYmxlPiwgU2FuaXR5Q2hlY2tlciB7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBVUkwgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgSWRlbnRpZmlhYmxlIGNvbXBvbmVudC4KKwkgKiAKKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCisJICovCisJVVJJIGdldFVSSSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUjZ2V0VVJJIDxlbT5VUkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VUkk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFVSSSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VVJJKFVSSSB2YWx1ZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBVUkwgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIHRoaXMgSWRlbnRpZmlhYmxlCisJICogICAgICAgICBjb21wb25lbnQuCisJICogCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgorCSAqLworCVVSSSBnZXRUeXBlVVJJKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSNnZXRUeXBlVVJJIDxlbT5UeXBlIFVSSTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRUeXBlVVJJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUeXBlVVJJKFVSSSB2YWx1ZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSAiRHVibGluIENvcmUiIG1ldGFkYXRhIDxhCisJICogICAgICAgICBocmVmPSJodHRwOi8vd3d3LmR1YmxpbmNvcmUub3JnLyI+aHR0cDovL3d3dy5kdWJsaW5jb3JlLm9yZy88L2E+CisJICogICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyBJZGVudGlmaWFibGUgY29tcG9uZW50LgorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCisJICovCisJRHVibGluQ29yZSBnZXREdWJsaW5Db3JlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSNnZXREdWJsaW5Db3JlIDxlbT5EdWJsaW4gQ29yZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1YmxpbiBDb3JlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXREdWJsaW5Db3JlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREdWJsaW5Db3JlKER1YmxpbkNvcmUgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBpbnN0YW5jZSBpcyAic2FuZSIsIGZhbHNlIG90aGVyd2lzZS4KKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJYm9vbGVhbiBzYW5lKCk7Cit9IC8vIElkZW50aWZpYWJsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL0lkZW50aWZpYWJsZUZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL0lkZW50aWZpYWJsZUZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYWQwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vSWRlbnRpZmlhYmxlRmlsdGVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SWRlbnRpZmlhYmxlIEZpbHRlcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0SWRlbnRpZmlhYmxlRmlsdGVyKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIElkZW50aWZpYWJsZUZpbHRlciBleHRlbmRzIEVPYmplY3QgeworfSAvLyBJZGVudGlmaWFibGVGaWx0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9TYW5pdHlDaGVja2VyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vU2FuaXR5Q2hlY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZWI4MGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vU2FuaXR5Q2hlY2tlci5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8vIFNhbml0eUNoZWNrZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBUaGUgPGNvZGU+U2FuaXR5Q2hlY2tlcjwvY29kZT4gaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCBjYW4KKyAqIHBlcmZvcm0gYSBzZWxmLWNoZWNrIHRvIGRldGVybWluZSB0aGVpciAic2FuaXR5IiBhdCBydW4tdGltZS4gSWYgYXNzZXJ0aW9ucworICogYXJlIGVuYWJsZWQgKCItZWEiIEpWTSBmbGFnKSBhbmQgYW4gaW5zdGFuY2UgZmluZHMgYSBwcm9ibGVtIGFuIGFzc2VydGlvbgorICogd2lsbCB0eXBpY2FsbHkgZmFpbCBhbmQgdGhlIGV4ZWN1dGlvbiB3aWxsIGhhbHQuIElmIGFzc2VydGlvbnMgYXJlIG5vdAorICogZW5hYmxlZCB0aGVuIDxjb2RlPmZhbHNlPC9jb2RlPiB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSB7QGxpbmsgI3NhbmUoKX0KKyAqIG1ldGhvZCBhbmQgZXhlY3V0aW9uIHdpbGwgY29udGludWUuCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGVuYWJsZXMgdGhlIGFiaWxpdHkgdG8gY2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBlbnRpcmUKKyAqIHN5c3RlbSBhdCBydW4tdGltZS4gVHlwaWNhbGx5LCB0aGF0IGlzIGRvbmUgYXQgc3RyYXRlZ2ljIHBvaW50cyBpbiB0aGUKKyAqIGV4ZWN1dGlvbiwgZm9yIGluc3RhbmNlLCBhdCB0aGUgc3RhcnQgb2YgdGhlIG1haW4gc2ltdWxhdGlvbiBjeWNsZS4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBTYW5pdHlDaGVja2VyIHsKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBvbmdvaW5nIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nIHB1cnBvc2VzLiBJdCBwZXJmb3JtcworCSAqIGEgInNlbGYtY2hlY2siIG9uIHRoZSBpbnN0YW5jZSBvZiB0aGUgY2xhc3MuIFRoZSBjaGVja2luZyBjb25zaXN0cyBvZgorCSAqIGNvbWJpbmF0aW9uIG9mIGJvb2xlYW4gdGVzdHMgYW5kIGFzc2VydGlvbnMgdXNpbmcgdGhlIEphdmEgImFzc2VydCIKKwkgKiBmYWNpbGl0eS4gQXNzZXJ0aW9ucyBtdXN0IGJlIGVuYWJsZWQgdXNpbmcgdGhlICItZWEiIEpWTSBmbGFnIGZvciB0aGUKKwkgKiBhc3NlcnRpb25zIHRvIGJlIGVuYWJsZWQuCisJICogPHA+CisJICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBleHRlbmRpbmcgc3ViLWNsYXNzZXMuIFRoZXNlCisJICogY2xhc3NlcyBzaG91bGQgZmlyc3QgY2FsbCB0aGUgbWV0aG9kIGluIHRoZSBzdXBlciBjbGFzcyAoaS5lLiwKKwkgKiA8Y29kZT5zdXBlci5zYW5lKCk8L2NvZGU+KSB0byBlbnN1cmUgdGhhdCB0aGUgc3VwZXIgY2xhc3MgaXMgIm9rIiBhbmQKKwkgKiB0aGVuIGl0IGNhbiBpc3N1ZSBpdHMgb3duIGFzc2VydGlvbnMuIDxjb2RlPgorCSAqIDxwcmU+CisJICogdm9pZCBzYW5lKCkgeworCSAqIAlib29sZWFuIHJldFZhbHVlID0gc3VwZXIuc2FuZSgpOworCSAqIAorCSAqIAkvLyBJZiBmb28gcmVmZXJlbmNlcyBiYXIsIHRoZW4gYmFyIHNob3VsZCByZWZlcmVuY2UgZm9vIQorCSAqIAlyZXRWYWx1ZSA9IHJldFZhbHVlICZhbXA7JmFtcDsgKGZvby5hID09IGJhciAmYW1wOyZhbXA7IGJhci5hID09IGZvbyk7CisJICogCWFzc2VydChyZXRWYWx1ZSk7CisJICogCisJICogCXJldHVybiByZXRWYWx1ZTsKKwkgKiB9IC8vIHNhbmUKKwkgKiA8L3ByZT4KKwkgKiA8L2NvZGU+CisJICogPHA+CisJICogVGhlIGlkaW9tIDxjb2RlPnJldFZhbHVlID0gcmV0VmFsdWUgJiYgJmx0O2Jvb2xlYW4gdGVzdCZndDs8L2NvZGU+CisJICogZm9sbG93ZWQgYnkgYW4gYXNzZXJ0aW9uIG9mIHRoZSB2YWx1ZSBvZiA8Y29kZT5yZXRWYWx1ZTwvY29kZT4gaXMgYQorCSAqIHR5cGljYWwgcGF0dGVybi4gSWYgZm9sbG93ZWQsIHRoZW4gb25jZSBhIHByb2JsZW0gaXMgZGV0ZWN0ZWQsIGFuCisJICogYXNzZXJ0aW9uIHdpbGwgYmUgdGhyb3duLCBvciB0aGUgcmVzdCBvZiB0aGUgdGVzdHMgd2lsbCBiZSBza2lwcGVkIGFuZAorCSAqIHRoZSB2YWx1ZSBvZiA8Y29kZT5mYWxzZTwvY29kZT4gcmV0dXJuZWQuIEJ5IGhhdmluZyA8Y29kZT5zYW5lPC9jb2RlPgorCSAqIHJldHVybiBhIHZhbHVlIHJhdGhlciB0aGFuIHNpbXBseSByZWx5aW5nIHVwb24gdGhlIDxjb2RlPmFzc2VydDwvY29kZT4KKwkgKiBrZXl3b3JkIHNhbml0eSB0ZXN0aW5nIGNhbiBvY2N1ciBldmVuIGlmIGFzc2VydGlvbnMgYXJlIG5vdCBlbmFibGVkLgorCSAqIDxwPgorCSAqIFRoZSA8Y29kZT5zYW5lPC9jb2RlPiBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcworCSAqIGtub3duIHRvIGJlICJzdGFibGUiIHNvIHRoZSBjb25zaXN0ZW5jeSBjaGVja3Mgc2hvdWxkIGNvbXBsZXRlIHdpdGggbm8KKwkgKiBwcm9ibGVtcyAoaWYgYWxsIGlzIHdlbGwpLgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNsYXNzIHBhc3NlcyBpdHMgc2VsZi10ZXN0LAorCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqIEB0aHJvd3MgQXNzZXJ0aW9uRXJyb3IKKwkgKiAgICAgICAgICAgICBpZiBhc3NlcnRpb25zIGFyZSBlbmFibGVkIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gd291bGQgYmUKKwkgKiAgICAgICAgICAgICByZXR1cm5lZAorCSAqLworCWJvb2xlYW4gc2FuZSgpOworCit9IC8vIFNhbml0eUNoZWNrZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9TdHJpbmdWYWx1ZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL1N0cmluZ1ZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3NGVkNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9TdHJpbmdWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RyaW5nIFZhbHVlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU3RyaW5nVmFsdWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0U3RyaW5nVmFsdWUoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3RyaW5nVmFsdWUgZXh0ZW5kcyBNb2RpZmlhYmxlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRTdHJpbmdWYWx1ZV9WYWx1ZSgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBTdHJpbmdWYWx1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL1N0cmluZ1ZhbHVlTGlzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL1N0cmluZ1ZhbHVlTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MjY1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vU3RyaW5nVmFsdWVMaXN0LmphdmEKQEAgLTAsMCArMSw1MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RyaW5nIFZhbHVlIExpc3Q8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZUxpc3QjZ2V0VmFsdWVzIDxlbT5WYWx1ZXM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRTdHJpbmdWYWx1ZUxpc3QoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3RyaW5nVmFsdWVMaXN0IGV4dGVuZHMgRU9iamVjdCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0U3RyaW5nVmFsdWVMaXN0X1ZhbHVlcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxTdHJpbmdWYWx1ZT4gZ2V0VmFsdWVzKCk7CisKK30gLy8gU3RyaW5nVmFsdWVMaXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vaW1wbC9Db21tb25GYWN0b3J5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL2ltcGwvQ29tbW9uRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTkxM2UzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL2ltcGwvQ29tbW9uRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDIzMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWVNYXRyaXg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU3RyaW5nVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZUxpc3Q7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLio7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQ29tbW9uRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBDb21tb25GYWN0b3J5IHsKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBDb21tb25GYWN0b3J5IGluaXQoKSB7CisJCXRyeSB7CisJCQlDb21tb25GYWN0b3J5IHRoZUNvbW1vbkZhY3RvcnkgPSAoQ29tbW9uRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uLmVjb3JlIik7IC8vJE5PTi1OTFMtMSQgCisJCQlpZiAodGhlQ29tbW9uRmFjdG9yeSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoZUNvbW1vbkZhY3Rvcnk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXJldHVybiBuZXcgQ29tbW9uRmFjdG9yeUltcGwoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb21tb25GYWN0b3J5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgeworCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFOiByZXR1cm4gY3JlYXRlRHVibGluQ29yZSgpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GSUxURVI6IHJldHVybiBjcmVhdGVJZGVudGlmaWFibGVGaWx0ZXIoKTsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfTElTVDogcmV0dXJuIGNyZWF0ZURvdWJsZVZhbHVlTGlzdCgpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRPVUJMRV9WQUxVRV9NQVRSSVg6IHJldHVybiBjcmVhdGVEb3VibGVWYWx1ZU1hdHJpeCgpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRPVUJMRV9WQUxVRTogcmV0dXJuIGNyZWF0ZURvdWJsZVZhbHVlKCk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuU1RSSU5HX1ZBTFVFX0xJU1Q6IHJldHVybiBjcmVhdGVTdHJpbmdWYWx1ZUxpc3QoKTsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5TVFJJTkdfVkFMVUU6IHJldHVybiBjcmVhdGVTdHJpbmdWYWx1ZSgpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIENvbW1vblBhY2thZ2UuVVJJOgorCQkJCXJldHVybiBjcmVhdGVVUklGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBDb21tb25QYWNrYWdlLlVSSToKKwkJCQlyZXR1cm4gY29udmVydFVSSVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIER1YmxpbkNvcmUgY3JlYXRlRHVibGluQ29yZSgpIHsKKwkJRHVibGluQ29yZUltcGwgZHVibGluQ29yZSA9IG5ldyBEdWJsaW5Db3JlSW1wbCgpOworCQlyZXR1cm4gZHVibGluQ29yZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSWRlbnRpZmlhYmxlRmlsdGVyIGNyZWF0ZUlkZW50aWZpYWJsZUZpbHRlcigpIHsKKwkJSWRlbnRpZmlhYmxlRmlsdGVySW1wbCBpZGVudGlmaWFibGVGaWx0ZXIgPSBuZXcgSWRlbnRpZmlhYmxlRmlsdGVySW1wbCgpOworCQlyZXR1cm4gaWRlbnRpZmlhYmxlRmlsdGVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEb3VibGVWYWx1ZUxpc3QgY3JlYXRlRG91YmxlVmFsdWVMaXN0KCkgeworCQlEb3VibGVWYWx1ZUxpc3RJbXBsIGRvdWJsZVZhbHVlTGlzdCA9IG5ldyBEb3VibGVWYWx1ZUxpc3RJbXBsKCk7CisJCXJldHVybiBkb3VibGVWYWx1ZUxpc3Q7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERvdWJsZVZhbHVlTWF0cml4IGNyZWF0ZURvdWJsZVZhbHVlTWF0cml4KCkgeworCQlEb3VibGVWYWx1ZU1hdHJpeEltcGwgZG91YmxlVmFsdWVNYXRyaXggPSBuZXcgRG91YmxlVmFsdWVNYXRyaXhJbXBsKCk7CisJCXJldHVybiBkb3VibGVWYWx1ZU1hdHJpeDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRG91YmxlVmFsdWUgY3JlYXRlRG91YmxlVmFsdWUoKSB7CisJCURvdWJsZVZhbHVlSW1wbCBkb3VibGVWYWx1ZSA9IG5ldyBEb3VibGVWYWx1ZUltcGwoKTsKKwkJcmV0dXJuIGRvdWJsZVZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmdWYWx1ZUxpc3QgY3JlYXRlU3RyaW5nVmFsdWVMaXN0KCkgeworCQlTdHJpbmdWYWx1ZUxpc3RJbXBsIHN0cmluZ1ZhbHVlTGlzdCA9IG5ldyBTdHJpbmdWYWx1ZUxpc3RJbXBsKCk7CisJCXJldHVybiBzdHJpbmdWYWx1ZUxpc3Q7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZ1ZhbHVlIGNyZWF0ZVN0cmluZ1ZhbHVlKCkgeworCQlTdHJpbmdWYWx1ZUltcGwgc3RyaW5nVmFsdWUgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCk7CisJCXJldHVybiBzdHJpbmdWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBlRGF0YVR5cGUgCisJICogQHBhcmFtIGluaXRpYWxWYWx1ZSAKKwkgKiBAcmV0dXJuIHRoZSBVUkkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBVUkkgY3JlYXRlVVJJRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCXJldHVybiBVUkkuY3JlYXRlVVJJKGluaXRpYWxWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFVSSVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbW1vblBhY2thZ2UgZ2V0Q29tbW9uUGFja2FnZSgpIHsKKwkJcmV0dXJuIChDb21tb25QYWNrYWdlKWdldEVQYWNrYWdlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZGVwcmVjYXRlZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlARGVwcmVjYXRlZAorCXB1YmxpYyBzdGF0aWMgQ29tbW9uUGFja2FnZSBnZXRQYWNrYWdlKCkgeworCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7CisJfQorCit9IC8vQ29tbW9uRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9pbXBsL0NvbW1vblBhY2thZ2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vaW1wbC9Db21tb25QYWNrYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODc4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vaW1wbC9Db21tb25QYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNzgyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbDsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5sYW5nLkNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FR2VuZXJpY1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZU1hdHJpeDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZUZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlN0cmluZ1ZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU3RyaW5nVmFsdWVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LmltcGwuRXhwZXJpbWVudFBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW9QYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLmltcGwuU2NlbmFyaW9QYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5TZXF1ZW5jZXJQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5pbXBsLlNvbHZlclBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLmltcGwuVHJpZ2dlclBhY2thZ2VJbXBsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENvbW1vblBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgQ29tbW9uUGFja2FnZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZHVibGluQ29yZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBpZGVudGlmaWFibGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgY29tcGFyYWJsZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBpZGVudGlmaWFibGVGaWx0ZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZG91YmxlVmFsdWVMaXN0RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGRvdWJsZVZhbHVlTWF0cml4RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGRvdWJsZVZhbHVlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHN0cmluZ1ZhbHVlTGlzdEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzdHJpbmdWYWx1ZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVEYXRhVHlwZSB1cmlFRGF0YVR5cGUgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCisJICogcGFja2FnZSBVUkkgdmFsdWUuCisJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYworCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCisJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKKwkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBDb21tb25QYWNrYWdlSW1wbCgpIHsKKwkJc3VwZXIoZU5TX1VSSSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIENvbW1vblBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIENvbW1vblBhY2thZ2UgaW5pdCgpIHsKKwkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCisJCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IENvbW1vblBhY2thZ2VJbXBsKCkpOworCisJCWlzSW5pdGVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKKwkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcworCQlFeHBlcmltZW50UGFja2FnZUltcGwgdGhlRXhwZXJpbWVudFBhY2thZ2UgPSAoRXhwZXJpbWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFeHBlcmltZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEV4cGVyaW1lbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEV4cGVyaW1lbnRQYWNrYWdlLmVOU19VUkkpIDogRXhwZXJpbWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJR3JhcGhQYWNrYWdlSW1wbCB0aGVHcmFwaFBhY2thZ2UgPSAoR3JhcGhQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoR3JhcGhQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgR3JhcGhQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEdyYXBoUGFja2FnZS5lTlNfVVJJKSA6IEdyYXBoUGFja2FnZS5lSU5TVEFOQ0UpOworCQlNb2RlbFBhY2thZ2VJbXBsIHRoZU1vZGVsUGFja2FnZSA9IChNb2RlbFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RlbFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBNb2RlbFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kZWxQYWNrYWdlLmVOU19VUkkpIDogTW9kZWxQYWNrYWdlLmVJTlNUQU5DRSk7CisJCU1vZGlmaWVyUGFja2FnZUltcGwgdGhlTW9kaWZpZXJQYWNrYWdlID0gKE1vZGlmaWVyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGlmaWVyUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIE1vZGlmaWVyUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RpZmllclBhY2thZ2UuZU5TX1VSSSkgOiBNb2RpZmllclBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJUHJlZGljYXRlUGFja2FnZUltcGwgdGhlUHJlZGljYXRlUGFja2FnZSA9IChQcmVkaWNhdGVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUHJlZGljYXRlUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFByZWRpY2F0ZVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUHJlZGljYXRlUGFja2FnZS5lTlNfVVJJKSA6IFByZWRpY2F0ZVBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJU2NlbmFyaW9QYWNrYWdlSW1wbCB0aGVTY2VuYXJpb1BhY2thZ2UgPSAoU2NlbmFyaW9QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU2NlbmFyaW9QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgU2NlbmFyaW9QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNjZW5hcmlvUGFja2FnZS5lTlNfVVJJKSA6IFNjZW5hcmlvUGFja2FnZS5lSU5TVEFOQ0UpOworCQlTZXF1ZW5jZXJQYWNrYWdlSW1wbCB0aGVTZXF1ZW5jZXJQYWNrYWdlID0gKFNlcXVlbmNlclBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTZXF1ZW5jZXJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgU2VxdWVuY2VyUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTZXF1ZW5jZXJQYWNrYWdlLmVOU19VUkkpIDogU2VxdWVuY2VyUGFja2FnZS5lSU5TVEFOQ0UpOworCQlUcmlnZ2VyUGFja2FnZUltcGwgdGhlVHJpZ2dlclBhY2thZ2UgPSAoVHJpZ2dlclBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUcmlnZ2VyUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFRyaWdnZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRyaWdnZXJQYWNrYWdlLmVOU19VUkkpIDogVHJpZ2dlclBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJU29sdmVyUGFja2FnZUltcGwgdGhlU29sdmVyUGFja2FnZSA9IChTb2x2ZXJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU29sdmVyUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFNvbHZlclBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU29sdmVyUGFja2FnZS5lTlNfVVJJKSA6IFNvbHZlclBhY2thZ2UuZUlOU1RBTkNFKTsKKworCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cworCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVFeHBlcmltZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlR3JhcGhQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVNb2RlbFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU1vZGlmaWVyUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlUHJlZGljYXRlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlU2NlbmFyaW9QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVTZXF1ZW5jZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVUcmlnZ2VyUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlU29sdmVyUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCisJCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVFeHBlcmltZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUdyYXBoUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU1vZGVsUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU1vZGlmaWVyUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVByZWRpY2F0ZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVTY2VuYXJpb1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVTZXF1ZW5jZXJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlVHJpZ2dlclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVTb2x2ZXJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCisJCXRoZUNvbW1vblBhY2thZ2UuZnJlZXplKCk7CisKKyAgCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoQ29tbW9uUGFja2FnZS5lTlNfVVJJLCB0aGVDb21tb25QYWNrYWdlKTsKKwkJcmV0dXJuIHRoZUNvbW1vblBhY2thZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXREdWJsaW5Db3JlKCkgeworCQlyZXR1cm4gZHVibGluQ29yZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREdWJsaW5Db3JlX1RpdGxlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZHVibGluQ29yZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfSWRlbnRpZmllcigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWR1YmxpbkNvcmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREdWJsaW5Db3JlX0Rlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZHVibGluQ29yZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfQ3JlYXRvcigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWR1YmxpbkNvcmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREdWJsaW5Db3JlX0RhdGUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkdWJsaW5Db3JlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RHVibGluQ29yZV9Gb3JtYXQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkdWJsaW5Db3JlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RHVibGluQ29yZV9QdWJsaXNoZXIoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkdWJsaW5Db3JlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RHVibGluQ29yZV9Db3ZlcmFnZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWR1YmxpbkNvcmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREdWJsaW5Db3JlX0NvbnRyaWJ1dG9yKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZHVibGluQ29yZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfUmVsYXRpb24oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkdWJsaW5Db3JlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RHVibGluQ29yZV9SaWdodHMoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkdWJsaW5Db3JlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfU291cmNlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZHVibGluQ29yZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREdWJsaW5Db3JlX1N1YmplY3QoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkdWJsaW5Db3JlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfVHlwZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWR1YmxpbkNvcmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RHVibGluQ29yZV9MYW5ndWFnZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWR1YmxpbkNvcmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RHVibGluQ29yZV9CaWJsaW9ncmFwaGljQ2l0YXRpb24oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkdWJsaW5Db3JlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfQ3JlYXRlZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWR1YmxpbkNvcmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RHVibGluQ29yZV9MaWNlbnNlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZHVibGluQ29yZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE3KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREdWJsaW5Db3JlX1JlcXVpcmVkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZHVibGluQ29yZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREdWJsaW5Db3JlX1NwYXRpYWwoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkdWJsaW5Db3JlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldER1YmxpbkNvcmVfVmFsaWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkdWJsaW5Db3JlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SWRlbnRpZmlhYmxlKCkgeworCQlyZXR1cm4gaWRlbnRpZmlhYmxlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldElkZW50aWZpYWJsZV9VUkkoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlpZGVudGlmaWFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJZGVudGlmaWFibGVfVHlwZVVSSSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWlkZW50aWZpYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldElkZW50aWZpYWJsZV9EdWJsaW5Db3JlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpaWRlbnRpZmlhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRDb21wYXJhYmxlKCkgeworCQlyZXR1cm4gY29tcGFyYWJsZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldElkZW50aWZpYWJsZUZpbHRlcigpIHsKKwkJcmV0dXJuIGlkZW50aWZpYWJsZUZpbHRlckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldERvdWJsZVZhbHVlTGlzdCgpIHsKKwkJcmV0dXJuIGRvdWJsZVZhbHVlTGlzdEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb3VibGVWYWx1ZUxpc3RfVmFsdWVzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpZG91YmxlVmFsdWVMaXN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG91YmxlVmFsdWVMaXN0X0lkZW50aWZpZXIoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkb3VibGVWYWx1ZUxpc3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldERvdWJsZVZhbHVlTWF0cml4KCkgeworCQlyZXR1cm4gZG91YmxlVmFsdWVNYXRyaXhFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RG91YmxlVmFsdWVNYXRyaXhfVmFsdWVMaXN0cygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWRvdWJsZVZhbHVlTWF0cml4RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXREb3VibGVWYWx1ZSgpIHsKKwkJcmV0dXJuIGRvdWJsZVZhbHVlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERvdWJsZVZhbHVlX0lkZW50aWZpZXIoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkb3VibGVWYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERvdWJsZVZhbHVlX1ZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZG91YmxlVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFN0cmluZ1ZhbHVlTGlzdCgpIHsKKwkJcmV0dXJuIHN0cmluZ1ZhbHVlTGlzdEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTdHJpbmdWYWx1ZUxpc3RfVmFsdWVzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upc3RyaW5nVmFsdWVMaXN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTdHJpbmdWYWx1ZSgpIHsKKwkJcmV0dXJuIHN0cmluZ1ZhbHVlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFN0cmluZ1ZhbHVlX1ZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc3RyaW5nVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRURhdGFUeXBlIGdldFVSSSgpIHsKKwkJcmV0dXJuIHVyaUVEYXRhVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29tbW9uRmFjdG9yeSBnZXRDb21tb25GYWN0b3J5KCkgeworCQlyZXR1cm4gKENvbW1vbkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcworCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKKwkJaXNDcmVhdGVkID0gdHJ1ZTsKKworCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJZHVibGluQ29yZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVUJMSU5fQ09SRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZHVibGluQ29yZUVDbGFzcywgRFVCTElOX0NPUkVfX1RJVExFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkdWJsaW5Db3JlRUNsYXNzLCBEVUJMSU5fQ09SRV9fSURFTlRJRklFUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZHVibGluQ29yZUVDbGFzcywgRFVCTElOX0NPUkVfX0RFU0NSSVBUSU9OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkdWJsaW5Db3JlRUNsYXNzLCBEVUJMSU5fQ09SRV9fQ1JFQVRPUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZHVibGluQ29yZUVDbGFzcywgRFVCTElOX0NPUkVfX0RBVEUpOworCQljcmVhdGVFQXR0cmlidXRlKGR1YmxpbkNvcmVFQ2xhc3MsIERVQkxJTl9DT1JFX19GT1JNQVQpOworCQljcmVhdGVFQXR0cmlidXRlKGR1YmxpbkNvcmVFQ2xhc3MsIERVQkxJTl9DT1JFX19QVUJMSVNIRVIpOworCQljcmVhdGVFQXR0cmlidXRlKGR1YmxpbkNvcmVFQ2xhc3MsIERVQkxJTl9DT1JFX19DT1ZFUkFHRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZHVibGluQ29yZUVDbGFzcywgRFVCTElOX0NPUkVfX0NPTlRSSUJVVE9SKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkdWJsaW5Db3JlRUNsYXNzLCBEVUJMSU5fQ09SRV9fUkVMQVRJT04pOworCQljcmVhdGVFQXR0cmlidXRlKGR1YmxpbkNvcmVFQ2xhc3MsIERVQkxJTl9DT1JFX19SSUdIVFMpOworCQljcmVhdGVFQXR0cmlidXRlKGR1YmxpbkNvcmVFQ2xhc3MsIERVQkxJTl9DT1JFX19TT1VSQ0UpOworCQljcmVhdGVFQXR0cmlidXRlKGR1YmxpbkNvcmVFQ2xhc3MsIERVQkxJTl9DT1JFX19TVUJKRUNUKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkdWJsaW5Db3JlRUNsYXNzLCBEVUJMSU5fQ09SRV9fVFlQRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZHVibGluQ29yZUVDbGFzcywgRFVCTElOX0NPUkVfX0xBTkdVQUdFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkdWJsaW5Db3JlRUNsYXNzLCBEVUJMSU5fQ09SRV9fQklCTElPR1JBUEhJQ19DSVRBVElPTik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZHVibGluQ29yZUVDbGFzcywgRFVCTElOX0NPUkVfX0NSRUFURUQpOworCQljcmVhdGVFQXR0cmlidXRlKGR1YmxpbkNvcmVFQ2xhc3MsIERVQkxJTl9DT1JFX19MSUNFTlNFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkdWJsaW5Db3JlRUNsYXNzLCBEVUJMSU5fQ09SRV9fUkVRVUlSRUQpOworCQljcmVhdGVFQXR0cmlidXRlKGR1YmxpbkNvcmVFQ2xhc3MsIERVQkxJTl9DT1JFX19TUEFUSUFMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkdWJsaW5Db3JlRUNsYXNzLCBEVUJMSU5fQ09SRV9fVkFMSUQpOworCisJCWlkZW50aWZpYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJREVOVElGSUFCTEUpOworCQljcmVhdGVFQXR0cmlidXRlKGlkZW50aWZpYWJsZUVDbGFzcywgSURFTlRJRklBQkxFX19VUkkpOworCQljcmVhdGVFQXR0cmlidXRlKGlkZW50aWZpYWJsZUVDbGFzcywgSURFTlRJRklBQkxFX19UWVBFX1VSSSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoaWRlbnRpZmlhYmxlRUNsYXNzLCBJREVOVElGSUFCTEVfX0RVQkxJTl9DT1JFKTsKKworCQljb21wYXJhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTVBBUkFCTEUpOworCisJCWlkZW50aWZpYWJsZUZpbHRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJREVOVElGSUFCTEVfRklMVEVSKTsKKworCQlkb3VibGVWYWx1ZUxpc3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRE9VQkxFX1ZBTFVFX0xJU1QpOworCQljcmVhdGVFUmVmZXJlbmNlKGRvdWJsZVZhbHVlTGlzdEVDbGFzcywgRE9VQkxFX1ZBTFVFX0xJU1RfX1ZBTFVFUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZG91YmxlVmFsdWVMaXN0RUNsYXNzLCBET1VCTEVfVkFMVUVfTElTVF9fSURFTlRJRklFUik7CisKKwkJZG91YmxlVmFsdWVNYXRyaXhFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRE9VQkxFX1ZBTFVFX01BVFJJWCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZG91YmxlVmFsdWVNYXRyaXhFQ2xhc3MsIERPVUJMRV9WQUxVRV9NQVRSSVhfX1ZBTFVFX0xJU1RTKTsKKworCQlkb3VibGVWYWx1ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhET1VCTEVfVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKGRvdWJsZVZhbHVlRUNsYXNzLCBET1VCTEVfVkFMVUVfX0lERU5USUZJRVIpOworCQljcmVhdGVFQXR0cmlidXRlKGRvdWJsZVZhbHVlRUNsYXNzLCBET1VCTEVfVkFMVUVfX1ZBTFVFKTsKKworCQlzdHJpbmdWYWx1ZUxpc3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1RSSU5HX1ZBTFVFX0xJU1QpOworCQljcmVhdGVFUmVmZXJlbmNlKHN0cmluZ1ZhbHVlTGlzdEVDbGFzcywgU1RSSU5HX1ZBTFVFX0xJU1RfX1ZBTFVFUyk7CisKKwkJc3RyaW5nVmFsdWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1RSSU5HX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzdHJpbmdWYWx1ZUVDbGFzcywgU1RSSU5HX1ZBTFVFX19WQUxVRSk7CisKKwkJLy8gQ3JlYXRlIGRhdGEgdHlwZXMKKwkJdXJpRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFVSSSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOworCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKKwkJc2V0TmFtZShlTkFNRSk7CisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOworCQlzZXROc1VSSShlTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCisJCUVjb3JlUGFja2FnZSB0aGVFY29yZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKKwkJTW9kaWZpZXJQYWNrYWdlIHRoZU1vZGlmaWVyUGFja2FnZSA9IChNb2RpZmllclBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kaWZpZXJQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKKwkJYWRkRVR5cGVQYXJhbWV0ZXIoY29tcGFyYWJsZUVDbGFzcywgIlQiKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycworCisJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJRUdlbmVyaWNUeXBlIGcxID0gY3JlYXRlRUdlbmVyaWNUeXBlKHRoaXMuZ2V0Q29tcGFyYWJsZSgpKTsKKwkJRUdlbmVyaWNUeXBlIGcyID0gY3JlYXRlRUdlbmVyaWNUeXBlKHRoaXMuZ2V0SWRlbnRpZmlhYmxlKCkpOworCQlnMS5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZChnMik7CisJCWlkZW50aWZpYWJsZUVDbGFzcy5nZXRFR2VuZXJpY1N1cGVyVHlwZXMoKS5hZGQoZzEpOworCQlkb3VibGVWYWx1ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RpZmllclBhY2thZ2UuZ2V0TW9kaWZpYWJsZSgpKTsKKwkJc3RyaW5nVmFsdWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlTW9kaWZpZXJQYWNrYWdlLmdldE1vZGlmaWFibGUoKSk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKwkJaW5pdEVDbGFzcyhkdWJsaW5Db3JlRUNsYXNzLCBEdWJsaW5Db3JlLmNsYXNzLCAiRHVibGluQ29yZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXREdWJsaW5Db3JlX1RpdGxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0aXRsZSIsIG51bGwsIDAsIDEsIER1YmxpbkNvcmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RHVibGluQ29yZV9JZGVudGlmaWVyKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZGVudGlmaWVyIiwgbnVsbCwgMCwgMSwgRHVibGluQ29yZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXREdWJsaW5Db3JlX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIER1YmxpbkNvcmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RHVibGluQ29yZV9DcmVhdG9yKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjcmVhdG9yIiwgbnVsbCwgMCwgMSwgRHVibGluQ29yZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXREdWJsaW5Db3JlX0RhdGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRhdGUiLCBudWxsLCAwLCAxLCBEdWJsaW5Db3JlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldER1YmxpbkNvcmVfRm9ybWF0KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJmb3JtYXQiLCBudWxsLCAwLCAxLCBEdWJsaW5Db3JlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldER1YmxpbkNvcmVfUHVibGlzaGVyKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwdWJsaXNoZXIiLCBudWxsLCAwLCAxLCBEdWJsaW5Db3JlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldER1YmxpbkNvcmVfQ292ZXJhZ2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvdmVyYWdlIiwgbnVsbCwgMCwgMSwgRHVibGluQ29yZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXREdWJsaW5Db3JlX0NvbnRyaWJ1dG9yKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb250cmlidXRvciIsIG51bGwsIDAsIDEsIER1YmxpbkNvcmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RHVibGluQ29yZV9SZWxhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVsYXRpb24iLCBudWxsLCAwLCAxLCBEdWJsaW5Db3JlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldER1YmxpbkNvcmVfUmlnaHRzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyaWdodHMiLCBudWxsLCAwLCAxLCBEdWJsaW5Db3JlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldER1YmxpbkNvcmVfU291cmNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzb3VyY2UiLCBudWxsLCAwLCAxLCBEdWJsaW5Db3JlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldER1YmxpbkNvcmVfU3ViamVjdCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic3ViamVjdCIsIG51bGwsIDAsIDEsIER1YmxpbkNvcmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RHVibGluQ29yZV9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgRHVibGluQ29yZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXREdWJsaW5Db3JlX0xhbmd1YWdlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsYW5ndWFnZSIsIG51bGwsIDAsIDEsIER1YmxpbkNvcmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RHVibGluQ29yZV9CaWJsaW9ncmFwaGljQ2l0YXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImJpYmxpb2dyYXBoaWNDaXRhdGlvbiIsIG51bGwsIDAsIDEsIER1YmxpbkNvcmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RHVibGluQ29yZV9DcmVhdGVkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjcmVhdGVkIiwgbnVsbCwgMCwgMSwgRHVibGluQ29yZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXREdWJsaW5Db3JlX0xpY2Vuc2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxpY2Vuc2UiLCBudWxsLCAwLCAxLCBEdWJsaW5Db3JlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldER1YmxpbkNvcmVfUmVxdWlyZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlcXVpcmVkIiwgbnVsbCwgMCwgMSwgRHVibGluQ29yZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXREdWJsaW5Db3JlX1NwYXRpYWwoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNwYXRpYWwiLCBudWxsLCAwLCAxLCBEdWJsaW5Db3JlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldER1YmxpbkNvcmVfVmFsaWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZhbGlkIiwgbnVsbCwgMCwgMSwgRHVibGluQ29yZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWFkZEVPcGVyYXRpb24oZHVibGluQ29yZUVDbGFzcywgdGhpcy5nZXREdWJsaW5Db3JlKCksICJwb3B1bGF0ZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGlkZW50aWZpYWJsZUVDbGFzcywgSWRlbnRpZmlhYmxlLmNsYXNzLCAiSWRlbnRpZmlhYmxlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWRlbnRpZmlhYmxlX1VSSSgpLCB0aGlzLmdldFVSSSgpLCAidVJJIiwgbnVsbCwgMSwgMSwgSWRlbnRpZmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldElkZW50aWZpYWJsZV9UeXBlVVJJKCksIHRoaXMuZ2V0VVJJKCksICJ0eXBlVVJJIiwgbnVsbCwgMSwgMSwgSWRlbnRpZmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldElkZW50aWZpYWJsZV9EdWJsaW5Db3JlKCksIHRoaXMuZ2V0RHVibGluQ29yZSgpLCBudWxsLCAiZHVibGluQ29yZSIsIG51bGwsIDEsIDEsIElkZW50aWZpYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWFkZEVPcGVyYXRpb24oaWRlbnRpZmlhYmxlRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInNhbmUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhjb21wYXJhYmxlRUNsYXNzLCBDb21wYXJhYmxlLmNsYXNzLCAiQ29tcGFyYWJsZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhpZGVudGlmaWFibGVGaWx0ZXJFQ2xhc3MsIElkZW50aWZpYWJsZUZpbHRlci5jbGFzcywgIklkZW50aWZpYWJsZUZpbHRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MoZG91YmxlVmFsdWVMaXN0RUNsYXNzLCBEb3VibGVWYWx1ZUxpc3QuY2xhc3MsICJEb3VibGVWYWx1ZUxpc3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RG91YmxlVmFsdWVMaXN0X1ZhbHVlcygpLCB0aGlzLmdldERvdWJsZVZhbHVlKCksIG51bGwsICJ2YWx1ZXMiLCBudWxsLCAwLCAtMSwgRG91YmxlVmFsdWVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldERvdWJsZVZhbHVlTGlzdF9JZGVudGlmaWVyKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZGVudGlmaWVyIiwgbnVsbCwgMCwgMSwgRG91YmxlVmFsdWVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhkb3VibGVWYWx1ZU1hdHJpeEVDbGFzcywgRG91YmxlVmFsdWVNYXRyaXguY2xhc3MsICJEb3VibGVWYWx1ZU1hdHJpeCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXREb3VibGVWYWx1ZU1hdHJpeF9WYWx1ZUxpc3RzKCksIHRoaXMuZ2V0RG91YmxlVmFsdWVMaXN0KCksIG51bGwsICJ2YWx1ZUxpc3RzIiwgbnVsbCwgMCwgLTEsIERvdWJsZVZhbHVlTWF0cml4LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhkb3VibGVWYWx1ZUVDbGFzcywgRG91YmxlVmFsdWUuY2xhc3MsICJEb3VibGVWYWx1ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXREb3VibGVWYWx1ZV9JZGVudGlmaWVyKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZGVudGlmaWVyIiwgbnVsbCwgMCwgMSwgRG91YmxlVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RG91YmxlVmFsdWVfVmFsdWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInZhbHVlIiwgIjAuMCIsIDAsIDEsIERvdWJsZVZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQlpbml0RUNsYXNzKHN0cmluZ1ZhbHVlTGlzdEVDbGFzcywgU3RyaW5nVmFsdWVMaXN0LmNsYXNzLCAiU3RyaW5nVmFsdWVMaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFN0cmluZ1ZhbHVlTGlzdF9WYWx1ZXMoKSwgdGhpcy5nZXRTdHJpbmdWYWx1ZSgpLCBudWxsLCAidmFsdWVzIiwgbnVsbCwgMCwgLTEsIFN0cmluZ1ZhbHVlTGlzdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3Moc3RyaW5nVmFsdWVFQ2xhc3MsIFN0cmluZ1ZhbHVlLmNsYXNzLCAiU3RyaW5nVmFsdWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U3RyaW5nVmFsdWVfVmFsdWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgU3RyaW5nVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKKwkJaW5pdEVEYXRhVHlwZSh1cmlFRGF0YVR5cGUsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkuY2xhc3MsICJVUkkiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQ3JlYXRlIHJlc291cmNlCisJCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCX0KKworfSAvL0NvbW1vblBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vaW1wbC9Eb3VibGVWYWx1ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9pbXBsL0RvdWJsZVZhbHVlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNGMzOGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vaW1wbC9Eb3VibGVWYWx1ZUltcGwuamF2YQpAQCAtMCwwICsxLDI2MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb3VibGUgVmFsdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Eb3VibGVWYWx1ZUltcGwjZ2V0SWRlbnRpZmllciA8ZW0+SWRlbnRpZmllcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkRvdWJsZVZhbHVlSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEb3VibGVWYWx1ZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIERvdWJsZVZhbHVlIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWRlbnRpZmllcigpIDxlbT5JZGVudGlmaWVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZGVudGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElGSUVSX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkZW50aWZpZXIoKSA8ZW0+SWRlbnRpZmllcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWRlbnRpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBpZGVudGlmaWVyID0gSURFTlRJRklFUl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFZBTFVFX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRG91YmxlVmFsdWVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5ET1VCTEVfVkFMVUU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgeworCQlyZXR1cm4gaWRlbnRpZmllcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJZGVudGlmaWVyKFN0cmluZyBuZXdJZGVudGlmaWVyKSB7CisJCVN0cmluZyBvbGRJZGVudGlmaWVyID0gaWRlbnRpZmllcjsKKwkJaWRlbnRpZmllciA9IG5ld0lkZW50aWZpZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuRE9VQkxFX1ZBTFVFX19JREVOVElGSUVSLCBvbGRJZGVudGlmaWVyLCBpZGVudGlmaWVyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbHVlKGRvdWJsZSBuZXdWYWx1ZSkgeworCQlkb3VibGUgb2xkVmFsdWUgPSB2YWx1ZTsKKwkJdmFsdWUgPSBuZXdWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRE9VQkxFX1ZBTFVFX19JREVOVElGSUVSOgorCQkJCXJldHVybiBnZXRJZGVudGlmaWVyKCk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRE9VQkxFX1ZBTFVFX19WQUxVRToKKwkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRPVUJMRV9WQUxVRV9fSURFTlRJRklFUjoKKwkJCQlzZXRJZGVudGlmaWVyKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfX1ZBTFVFOgorCQkJCXNldFZhbHVlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRE9VQkxFX1ZBTFVFX19JREVOVElGSUVSOgorCQkJCXNldElkZW50aWZpZXIoSURFTlRJRklFUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRPVUJMRV9WQUxVRV9fVkFMVUU6CisJCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRPVUJMRV9WQUxVRV9fSURFTlRJRklFUjoKKwkJCQlyZXR1cm4gSURFTlRJRklFUl9FREVGQVVMVCA9PSBudWxsID8gaWRlbnRpZmllciAhPSBudWxsIDogIUlERU5USUZJRVJfRURFRkFVTFQuZXF1YWxzKGlkZW50aWZpZXIpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRPVUJMRV9WQUxVRV9fVkFMVUU6CisJCQkJcmV0dXJuIHZhbHVlICE9IFZBTFVFX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoaWRlbnRpZmllcjogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpZGVudGlmaWVyKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCXByaXZhdGUgSWRlbnRpZmlhYmxlIGZpbmRJZGVudGlmaWFibGUoRU9iamVjdCBvKSB7CisJCWlmKG8gaW5zdGFuY2VvZiBJZGVudGlmaWFibGUpIHJldHVybiAoSWRlbnRpZmlhYmxlKW87CisJCWlmKG8uZUNvbnRhaW5lcigpICE9IG51bGwpIHJldHVybiBmaW5kSWRlbnRpZmlhYmxlKG8uZUNvbnRhaW5lcigpKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCS8qKgorCSAqIE5lZWQgdG8gb3ZlcnJpZGUgdG8gbWFrZSBzdXJlIG1vZGlmaWVycyBjYW4gZmluZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCUlkZW50aWZpYWJsZSBpZCA9IGZpbmRJZGVudGlmaWFibGUodGhpcyk7CisJCQorCQkKKwkJaWYoaWQhPW51bGwpIAorCQkJcmV0dXJuIGlkLmdldFVSSSgpLmhhc2hDb2RlKCkgXgorCQkJdGhpcy5lQ29udGFpbmluZ0ZlYXR1cmUoKS5nZXROYW1lKCkuaGFzaENvZGUoKTsKKwkJCQorCQlyZXR1cm4gdGhpcy5oYXNoQ29kZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwkJaWYoIShvIGluc3RhbmNlb2YgRG91YmxlVmFsdWVJbXBsKSkgcmV0dXJuIGZhbHNlOworCQlEb3VibGVWYWx1ZUltcGwgZHZpID0gKERvdWJsZVZhbHVlSW1wbClvOworCQlJZGVudGlmaWFibGUgaWQgPSBmaW5kSWRlbnRpZmlhYmxlKGR2aSk7CisJCUlkZW50aWZpYWJsZSBpZDIgPSBmaW5kSWRlbnRpZmlhYmxlKHRoaXMpOworCQlpZighaWQuZ2V0VVJJKCkuZXF1YWxzKGlkMi5nZXRVUkkoKSkpIHJldHVybiBmYWxzZTsKKwkJCisJCS8vIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHBhdGggZnJvbSB0aGUgaWRlbnRpZmlhYmxlCisJCS8vIHRvIGhlcmUgaXMgdGhlIHNhbWUKKwkJLy8uLi4gdG9kbworCQlyZXR1cm4gKHN1cGVyLmVxdWFscyhvKSk7CisJfQorfSAvL0RvdWJsZVZhbHVlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL2ltcGwvRG91YmxlVmFsdWVMaXN0SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL2ltcGwvRG91YmxlVmFsdWVMaXN0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NGFmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vaW1wbC9Eb3VibGVWYWx1ZUxpc3RJbXBsLmphdmEKQEAgLTAsMCArMSwyMzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZUxpc3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb3VibGUgVmFsdWUgTGlzdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkRvdWJsZVZhbHVlTGlzdEltcGwjZ2V0VmFsdWVzIDxlbT5WYWx1ZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Eb3VibGVWYWx1ZUxpc3RJbXBsI2dldElkZW50aWZpZXIgPGVtPklkZW50aWZpZXI8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEb3VibGVWYWx1ZUxpc3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBEb3VibGVWYWx1ZUxpc3QgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlcygpIDxlbT5WYWx1ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmFsdWVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8RG91YmxlVmFsdWU+IHZhbHVlczsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZGVudGlmaWVyKCkgPGVtPklkZW50aWZpZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkZW50aWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJRVJfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWRlbnRpZmllcigpIDxlbT5JZGVudGlmaWVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZGVudGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGlkZW50aWZpZXIgPSBJREVOVElGSUVSX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIERvdWJsZVZhbHVlTGlzdEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkRPVUJMRV9WQUxVRV9MSVNUOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxEb3VibGVWYWx1ZT4gZ2V0VmFsdWVzKCkgeworCQlpZiAodmFsdWVzID09IG51bGwpIHsKKwkJCXZhbHVlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEb3VibGVWYWx1ZT4oRG91YmxlVmFsdWUuY2xhc3MsIHRoaXMsIENvbW1vblBhY2thZ2UuRE9VQkxFX1ZBTFVFX0xJU1RfX1ZBTFVFUyk7CisJCX0KKwkJcmV0dXJuIHZhbHVlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7CisJCXJldHVybiBpZGVudGlmaWVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldElkZW50aWZpZXIoU3RyaW5nIG5ld0lkZW50aWZpZXIpIHsKKwkJU3RyaW5nIG9sZElkZW50aWZpZXIgPSBpZGVudGlmaWVyOworCQlpZGVudGlmaWVyID0gbmV3SWRlbnRpZmllcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfTElTVF9fSURFTlRJRklFUiwgb2xkSWRlbnRpZmllciwgaWRlbnRpZmllcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfTElTVF9fVkFMVUVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VmFsdWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRPVUJMRV9WQUxVRV9MSVNUX19WQUxVRVM6CisJCQkJcmV0dXJuIGdldFZhbHVlcygpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRPVUJMRV9WQUxVRV9MSVNUX19JREVOVElGSUVSOgorCQkJCXJldHVybiBnZXRJZGVudGlmaWVyKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfTElTVF9fVkFMVUVTOgorCQkJCWdldFZhbHVlcygpLmNsZWFyKCk7CisJCQkJZ2V0VmFsdWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEb3VibGVWYWx1ZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfTElTVF9fSURFTlRJRklFUjoKKwkJCQlzZXRJZGVudGlmaWVyKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRE9VQkxFX1ZBTFVFX0xJU1RfX1ZBTFVFUzoKKwkJCQlnZXRWYWx1ZXMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfTElTVF9fSURFTlRJRklFUjoKKwkJCQlzZXRJZGVudGlmaWVyKElERU5USUZJRVJfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRPVUJMRV9WQUxVRV9MSVNUX19WQUxVRVM6CisJCQkJcmV0dXJuIHZhbHVlcyAhPSBudWxsICYmICF2YWx1ZXMuaXNFbXB0eSgpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRPVUJMRV9WQUxVRV9MSVNUX19JREVOVElGSUVSOgorCQkJCXJldHVybiBJREVOVElGSUVSX0VERUZBVUxUID09IG51bGwgPyBpZGVudGlmaWVyICE9IG51bGwgOiAhSURFTlRJRklFUl9FREVGQVVMVC5lcXVhbHMoaWRlbnRpZmllcik7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChpZGVudGlmaWVyOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGlkZW50aWZpZXIpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Eb3VibGVWYWx1ZUxpc3RJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vaW1wbC9Eb3VibGVWYWx1ZU1hdHJpeEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9pbXBsL0RvdWJsZVZhbHVlTWF0cml4SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDgzMDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vaW1wbC9Eb3VibGVWYWx1ZU1hdHJpeEltcGwuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZU1hdHJpeDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvdWJsZSBWYWx1ZSBNYXRyaXg8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Eb3VibGVWYWx1ZU1hdHJpeEltcGwjZ2V0VmFsdWVMaXN0cyA8ZW0+VmFsdWUgTGlzdHM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEb3VibGVWYWx1ZU1hdHJpeEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIERvdWJsZVZhbHVlTWF0cml4IHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUxpc3RzKCkgPGVtPlZhbHVlIExpc3RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbHVlTGlzdHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxEb3VibGVWYWx1ZUxpc3Q+IHZhbHVlTGlzdHM7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRG91YmxlVmFsdWVNYXRyaXhJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5ET1VCTEVfVkFMVUVfTUFUUklYOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxEb3VibGVWYWx1ZUxpc3Q+IGdldFZhbHVlTGlzdHMoKSB7CisJCWlmICh2YWx1ZUxpc3RzID09IG51bGwpIHsKKwkJCXZhbHVlTGlzdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RG91YmxlVmFsdWVMaXN0PihEb3VibGVWYWx1ZUxpc3QuY2xhc3MsIHRoaXMsIENvbW1vblBhY2thZ2UuRE9VQkxFX1ZBTFVFX01BVFJJWF9fVkFMVUVfTElTVFMpOworCQl9CisJCXJldHVybiB2YWx1ZUxpc3RzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfTUFUUklYX19WQUxVRV9MSVNUUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFZhbHVlTGlzdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRE9VQkxFX1ZBTFVFX01BVFJJWF9fVkFMVUVfTElTVFM6CisJCQkJcmV0dXJuIGdldFZhbHVlTGlzdHMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRPVUJMRV9WQUxVRV9NQVRSSVhfX1ZBTFVFX0xJU1RTOgorCQkJCWdldFZhbHVlTGlzdHMoKS5jbGVhcigpOworCQkJCWdldFZhbHVlTGlzdHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERvdWJsZVZhbHVlTGlzdD4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRE9VQkxFX1ZBTFVFX01BVFJJWF9fVkFMVUVfTElTVFM6CisJCQkJZ2V0VmFsdWVMaXN0cygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRE9VQkxFX1ZBTFVFX01BVFJJWF9fVkFMVUVfTElTVFM6CisJCQkJcmV0dXJuIHZhbHVlTGlzdHMgIT0gbnVsbCAmJiAhdmFsdWVMaXN0cy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL0RvdWJsZVZhbHVlTWF0cml4SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL2ltcGwvRHVibGluQ29yZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9pbXBsL0R1YmxpbkNvcmVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiNWQxOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9pbXBsL0R1YmxpbkNvcmVJbXBsLmphdmEKQEAgLTAsMCArMSwxNjAyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkR1YmxpbkNvcmVJbXBsI2dldFRpdGxlIDxlbT5UaXRsZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkR1YmxpbkNvcmVJbXBsI2dldElkZW50aWZpZXIgPGVtPklkZW50aWZpZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5EdWJsaW5Db3JlSW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5EdWJsaW5Db3JlSW1wbCNnZXRDcmVhdG9yIDxlbT5DcmVhdG9yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuRHVibGluQ29yZUltcGwjZ2V0RGF0ZSA8ZW0+RGF0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkR1YmxpbkNvcmVJbXBsI2dldEZvcm1hdCA8ZW0+Rm9ybWF0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuRHVibGluQ29yZUltcGwjZ2V0UHVibGlzaGVyIDxlbT5QdWJsaXNoZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5EdWJsaW5Db3JlSW1wbCNnZXRDb3ZlcmFnZSA8ZW0+Q292ZXJhZ2U8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5EdWJsaW5Db3JlSW1wbCNnZXRDb250cmlidXRvciA8ZW0+Q29udHJpYnV0b3I8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5EdWJsaW5Db3JlSW1wbCNnZXRSZWxhdGlvbiA8ZW0+UmVsYXRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5EdWJsaW5Db3JlSW1wbCNnZXRSaWdodHMgPGVtPlJpZ2h0czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkR1YmxpbkNvcmVJbXBsI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuRHVibGluQ29yZUltcGwjZ2V0U3ViamVjdCA8ZW0+U3ViamVjdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkR1YmxpbkNvcmVJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5EdWJsaW5Db3JlSW1wbCNnZXRMYW5ndWFnZSA8ZW0+TGFuZ3VhZ2U8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5EdWJsaW5Db3JlSW1wbCNnZXRCaWJsaW9ncmFwaGljQ2l0YXRpb24gPGVtPkJpYmxpb2dyYXBoaWMgQ2l0YXRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5EdWJsaW5Db3JlSW1wbCNnZXRDcmVhdGVkIDxlbT5DcmVhdGVkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuRHVibGluQ29yZUltcGwjZ2V0TGljZW5zZSA8ZW0+TGljZW5zZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkR1YmxpbkNvcmVJbXBsI2dldFJlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkR1YmxpbkNvcmVJbXBsI2dldFNwYXRpYWwgPGVtPlNwYXRpYWw8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5EdWJsaW5Db3JlSW1wbCNnZXRWYWxpZCA8ZW0+VmFsaWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEdWJsaW5Db3JlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRHVibGluQ29yZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpdGxlKCkgPGVtPlRpdGxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGl0bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpdGxlKCkgPGVtPlRpdGxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGl0bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgdGl0bGUgPSBUSVRMRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZGVudGlmaWVyKCkgPGVtPklkZW50aWZpZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZGVudGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElGSUVSX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkZW50aWZpZXIoKSA8ZW0+SWRlbnRpZmllcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkZW50aWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgaWRlbnRpZmllciA9IElERU5USUZJRVJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0b3IoKSA8ZW0+Q3JlYXRvcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENyZWF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFUT1JfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRvcigpIDxlbT5DcmVhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q3JlYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBjcmVhdG9yID0gQ1JFQVRPUl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRlKCkgPGVtPkRhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGUoKSA8ZW0+RGF0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZGF0ZSA9IERBVEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rm9ybWF0KCkgPGVtPkZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZvcm1hdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZvcm1hdCgpIDxlbT5Gb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRGb3JtYXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZm9ybWF0ID0gRk9STUFUX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1Ymxpc2hlcigpIDxlbT5QdWJsaXNoZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQdWJsaXNoZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hFUl9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdWJsaXNoZXIoKSA8ZW0+UHVibGlzaGVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHVibGlzaGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHB1Ymxpc2hlciA9IFBVQkxJU0hFUl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3ZlcmFnZSgpIDxlbT5Db3ZlcmFnZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvdmVyYWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT1ZFUkFHRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3ZlcmFnZSgpIDxlbT5Db3ZlcmFnZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvdmVyYWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGNvdmVyYWdlID0gQ09WRVJBR0VfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udHJpYnV0b3IoKSA8ZW0+Q29udHJpYnV0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb250cmlidXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJJQlVUT1JfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udHJpYnV0b3IoKSA8ZW0+Q29udHJpYnV0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb250cmlidXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBjb250cmlidXRvciA9IENPTlRSSUJVVE9SX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbGF0aW9uKCkgPGVtPlJlbGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVsYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTEFUSU9OX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbGF0aW9uKCkgPGVtPlJlbGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVsYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgcmVsYXRpb24gPSBSRUxBVElPTl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSaWdodHMoKSA8ZW0+UmlnaHRzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmlnaHRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSSUdIVFNfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmlnaHRzKCkgPGVtPlJpZ2h0czwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJpZ2h0cygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyByaWdodHMgPSBSSUdIVFNfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlKCkgPGVtPlNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNvdXJjZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvdXJjZSgpIDxlbT5Tb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTb3VyY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgc291cmNlID0gU09VUkNFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YmplY3QoKSA8ZW0+U3ViamVjdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFN1YmplY3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQkpFQ1RfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViamVjdCgpIDxlbT5TdWJqZWN0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U3ViamVjdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBzdWJqZWN0ID0gU1VCSkVDVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFuZ3VhZ2UoKSA8ZW0+TGFuZ3VhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMYW5ndWFnZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFOR1VBR0VfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFuZ3VhZ2UoKSA8ZW0+TGFuZ3VhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMYW5ndWFnZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBsYW5ndWFnZSA9IExBTkdVQUdFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJpYmxpb2dyYXBoaWNDaXRhdGlvbigpIDxlbT5CaWJsaW9ncmFwaGljIENpdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QmlibGlvZ3JhcGhpY0NpdGF0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCSUJMSU9HUkFQSElDX0NJVEFUSU9OX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJpYmxpb2dyYXBoaWNDaXRhdGlvbigpIDxlbT5CaWJsaW9ncmFwaGljIENpdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QmlibGlvZ3JhcGhpY0NpdGF0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGJpYmxpb2dyYXBoaWNDaXRhdGlvbiA9IEJJQkxJT0dSQVBISUNfQ0lUQVRJT05fRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRlZCgpIDxlbT5DcmVhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q3JlYXRlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFRF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGVkKCkgPGVtPkNyZWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDcmVhdGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZWQgPSBDUkVBVEVEX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpY2Vuc2UoKSA8ZW0+TGljZW5zZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExpY2Vuc2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0VfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGljZW5zZSgpIDxlbT5MaWNlbnNlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TGljZW5zZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBsaWNlbnNlID0gTElDRU5TRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXF1aXJlZCgpIDxlbT5SZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlcXVpcmVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXF1aXJlZCgpIDxlbT5SZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlcXVpcmVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHJlcXVpcmVkID0gUkVRVUlSRURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3BhdGlhbCgpIDxlbT5TcGF0aWFsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U3BhdGlhbCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBVElBTF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTcGF0aWFsKCkgPGVtPlNwYXRpYWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTcGF0aWFsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHNwYXRpYWwgPSBTUEFUSUFMX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbGlkKCkgPGVtPlZhbGlkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmFsaWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHN0cmluZyB1c2VkIGluIHRoZSB7QGxpbmsgI3ZhbGlkfSBhdHRyaWJ1dGUgdG8gc3BlY2lmeSB0aGUKKwkgKiBzdGFydGluZyBkYXRlIG9mIHRoZSB2YWxpZCBkYXRlIHJhbmdlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUID0gInN0YXJ0PSI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzdHJpbmcgdXNlZCBpbiB0aGUge0BsaW5rICN2YWxpZH0gYXR0cmlidXRlIHRvIHNwZWNpZnkgdGhlCisJICogZW5kaW5nIGRhdGUgb2YgdGhlIHZhbGlkIGRhdGUgcmFuZ2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EID0gImVuZD0iOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsaWQoKSA8ZW0+VmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRWYWxpZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyB2YWxpZCA9IFZBTElEX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEdWJsaW5Db3JlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gY3JlYXRlIGFuZCBpbml0aWFsaXplIGEgRHVibGluIENvcmUgaW5zdGFuY2UKKwkgKiBmcm9tIGFuIElDb25maWd1cmF0aW9uRWxlbWVudCBpbnN0YW5jZS4gVGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBpcworCSAqIGV4dHJhY3RlZCBmcm9tIHRoZSBleHRlbnNpb24gZGVmaW5pdGlvbiBpbiB0aGUgcGx1Z2luLnhtbCBmaWxlIG9mIGEKKwkgKiBwbHVnLWluIHRoYXQgaXMgcHJvdmlkaW5nIGFuIElkZW50aWZpYWJsZS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBjbGFzcworCSAqIElkZW50aWZpYWJsZURlbGVnYXRlIGluIHRoZSBjbGFzcworCSAqIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSWRlbnRpZmlhYmxlUGx1Z2luVmlldyB0byBjcmVhdGUgYSAicHJveHkiCisJICogcmVwcmVzZW50YXRpb24gb2YgdGhlIER1YmxpbiBDb3JlIG9mIHRoZSBJZGVudGlmaWFibGUgZnJvbSB0aGUKKwkgKiBjb25maWd1cmF0aW9uIGVsZW1lbnQgc28gdGhhdCB0aGUgSWRlbnRpZmlhYmxlIGl0c2VsZiBkb2VzIG5vdCBoYXZlIHRvIGJlCisJICogbG9hZGVkLgorCSAqIAorCSAqIEBwYXJhbSBjb25maWdFbGVtZW50CisJICogICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGZyb20gdGhlIHBsdWdpbi54bWwgZmlsZQorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIER1YmxpbkNvcmVJbXBsKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7CisJCXRpdGxlID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInRpdGxlIik7CisJCWNyZWF0b3IgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY3JlYXRvciIpOworCQlzdWJqZWN0ID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInN1YmplY3QiKTsKKwkJZGVzY3JpcHRpb24gPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKTsKKwkJcHVibGlzaGVyID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInB1Ymxpc2hlciIpOworCQljb250cmlidXRvciA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJjb250cmlidXRvciIpOworCQlkYXRlID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImRhdGUiKTsKKwkJdHlwZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIik7CisJCWZvcm1hdCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJmb3JtYXQiKTsKKwkJaWRlbnRpZmllciA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZGVudGlmaWVyIik7CisJCXNvdXJjZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJzb3VyY2UiKTsKKwkJbGFuZ3VhZ2UgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgibGFuZ3VhZ2UiKTsKKwkJcmVsYXRpb24gPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgicmVsYXRpb24iKTsKKwkJY292ZXJhZ2UgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY292ZXJhZ2UiKTsKKwkJYmlibGlvZ3JhcGhpY0NpdGF0aW9uID0gY29uZmlnRWxlbWVudAorCQkJCS5nZXRBdHRyaWJ1dGUoImJpYmxpb2dyYXBoaWNDaXRhdGlvbiIpOworCQljcmVhdGVkID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNyZWF0ZWQiKTsKKwkJbGljZW5zZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJsaWNlbnNlIik7CisJCXJlcXVpcmVkID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInJlcXVpcmVkIik7CisJCXNwYXRpYWwgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgic3BhdGlhbCIpOworCQl2YWxpZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ2YWxpZCIpOworCX0gLy8gRHVibGluQ29yZUltcGwKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRFVCTElOX0NPUkU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7CisJCXJldHVybiB0aXRsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIG5ld1RpdGxlKSB7CisJCVN0cmluZyBvbGRUaXRsZSA9IHRpdGxlOworCQl0aXRsZSA9IG5ld1RpdGxlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19USVRMRSwgb2xkVGl0bGUsIHRpdGxlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRvcigpIHsKKwkJcmV0dXJuIGNyZWF0b3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENyZWF0b3IoU3RyaW5nIG5ld0NyZWF0b3IpIHsKKwkJU3RyaW5nIG9sZENyZWF0b3IgPSBjcmVhdG9yOworCQljcmVhdG9yID0gbmV3Q3JlYXRvcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQ1JFQVRPUiwgb2xkQ3JlYXRvciwgY3JlYXRvcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFN1YmplY3QoKSB7CisJCXJldHVybiBzdWJqZWN0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdWJqZWN0KFN0cmluZyBuZXdTdWJqZWN0KSB7CisJCVN0cmluZyBvbGRTdWJqZWN0ID0gc3ViamVjdDsKKwkJc3ViamVjdCA9IG5ld1N1YmplY3Q7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1NVQkpFQ1QsIG9sZFN1YmplY3QsIHN1YmplY3QpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKKwkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRQdWJsaXNoZXIoKSB7CisJCXJldHVybiBwdWJsaXNoZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hlcihTdHJpbmcgbmV3UHVibGlzaGVyKSB7CisJCVN0cmluZyBvbGRQdWJsaXNoZXIgPSBwdWJsaXNoZXI7CisJCXB1Ymxpc2hlciA9IG5ld1B1Ymxpc2hlcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fUFVCTElTSEVSLCBvbGRQdWJsaXNoZXIsIHB1Ymxpc2hlcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENvbnRyaWJ1dG9yKCkgeworCQlyZXR1cm4gY29udHJpYnV0b3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbnRyaWJ1dG9yKFN0cmluZyBuZXdDb250cmlidXRvcikgeworCQlTdHJpbmcgb2xkQ29udHJpYnV0b3IgPSBjb250cmlidXRvcjsKKwkJY29udHJpYnV0b3IgPSBuZXdDb250cmlidXRvcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQ09OVFJJQlVUT1IsIG9sZENvbnRyaWJ1dG9yLCBjb250cmlidXRvcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERhdGUoKSB7CisJCXJldHVybiBkYXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREYXRlKFN0cmluZyBuZXdEYXRlKSB7CisJCVN0cmluZyBvbGREYXRlID0gZGF0ZTsKKwkJZGF0ZSA9IG5ld0RhdGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX0RBVEUsIG9sZERhdGUsIGRhdGUpKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29tbW9uLkR1YmxpbkNvcmUjc2V0RGF0ZShqYXZhLnV0aWwuRGF0ZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREYXRlKERhdGUgZGF0ZSkgeworCQlzZXREYXRlKGNyZWF0ZUlTTzg2MDFEYXRlU3RyaW5nKGRhdGUpKTsKKwl9IC8vIHNldERhdGUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7CisJCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKKwkJdHlwZSA9IG5ld1R5cGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRGb3JtYXQoKSB7CisJCXJldHVybiBmb3JtYXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZvcm1hdChTdHJpbmcgbmV3Rm9ybWF0KSB7CisJCVN0cmluZyBvbGRGb3JtYXQgPSBmb3JtYXQ7CisJCWZvcm1hdCA9IG5ld0Zvcm1hdDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fRk9STUFULCBvbGRGb3JtYXQsIGZvcm1hdCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7CisJCXJldHVybiBpZGVudGlmaWVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJZGVudGlmaWVyKFN0cmluZyBuZXdJZGVudGlmaWVyKSB7CisJCVN0cmluZyBvbGRJZGVudGlmaWVyID0gaWRlbnRpZmllcjsKKwkJaWRlbnRpZmllciA9IG5ld0lkZW50aWZpZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX0lERU5USUZJRVIsIG9sZElkZW50aWZpZXIsIGlkZW50aWZpZXIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7CisJCXJldHVybiBzb3VyY2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNvdXJjZShTdHJpbmcgbmV3U291cmNlKSB7CisJCVN0cmluZyBvbGRTb3VyY2UgPSBzb3VyY2U7CisJCXNvdXJjZSA9IG5ld1NvdXJjZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fU09VUkNFLCBvbGRTb3VyY2UsIHNvdXJjZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgeworCQlyZXR1cm4gbGFuZ3VhZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldExhbmd1YWdlKFN0cmluZyBuZXdMYW5ndWFnZSkgeworCQlTdHJpbmcgb2xkTGFuZ3VhZ2UgPSBsYW5ndWFnZTsKKwkJbGFuZ3VhZ2UgPSBuZXdMYW5ndWFnZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fTEFOR1VBR0UsIG9sZExhbmd1YWdlLCBsYW5ndWFnZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJlbGF0aW9uKCkgeworCQlyZXR1cm4gcmVsYXRpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlbGF0aW9uKFN0cmluZyBuZXdSZWxhdGlvbikgeworCQlTdHJpbmcgb2xkUmVsYXRpb24gPSByZWxhdGlvbjsKKwkJcmVsYXRpb24gPSBuZXdSZWxhdGlvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fUkVMQVRJT04sIG9sZFJlbGF0aW9uLCByZWxhdGlvbikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENvdmVyYWdlKCkgeworCQlyZXR1cm4gY292ZXJhZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvdmVyYWdlKFN0cmluZyBuZXdDb3ZlcmFnZSkgeworCQlTdHJpbmcgb2xkQ292ZXJhZ2UgPSBjb3ZlcmFnZTsKKwkJY292ZXJhZ2UgPSBuZXdDb3ZlcmFnZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQ09WRVJBR0UsIG9sZENvdmVyYWdlLCBjb3ZlcmFnZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJpZ2h0cygpIHsKKwkJcmV0dXJuIHJpZ2h0czsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UmlnaHRzKFN0cmluZyBuZXdSaWdodHMpIHsKKwkJU3RyaW5nIG9sZFJpZ2h0cyA9IHJpZ2h0czsKKwkJcmlnaHRzID0gbmV3UmlnaHRzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19SSUdIVFMsIG9sZFJpZ2h0cywgcmlnaHRzKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0QmlibGlvZ3JhcGhpY0NpdGF0aW9uKCkgeworCQlyZXR1cm4gYmlibGlvZ3JhcGhpY0NpdGF0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCaWJsaW9ncmFwaGljQ2l0YXRpb24oU3RyaW5nIG5ld0JpYmxpb2dyYXBoaWNDaXRhdGlvbikgeworCQlTdHJpbmcgb2xkQmlibGlvZ3JhcGhpY0NpdGF0aW9uID0gYmlibGlvZ3JhcGhpY0NpdGF0aW9uOworCQliaWJsaW9ncmFwaGljQ2l0YXRpb24gPSBuZXdCaWJsaW9ncmFwaGljQ2l0YXRpb247CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX0JJQkxJT0dSQVBISUNfQ0lUQVRJT04sIG9sZEJpYmxpb2dyYXBoaWNDaXRhdGlvbiwgYmlibGlvZ3JhcGhpY0NpdGF0aW9uKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlZCgpIHsKKwkJcmV0dXJuIGNyZWF0ZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENyZWF0ZWQoU3RyaW5nIG5ld0NyZWF0ZWQpIHsKKwkJU3RyaW5nIG9sZENyZWF0ZWQgPSBjcmVhdGVkOworCQljcmVhdGVkID0gbmV3Q3JlYXRlZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQ1JFQVRFRCwgb2xkQ3JlYXRlZCwgY3JlYXRlZCkpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb21tb24uRHVibGluQ29yZSNzZXRDcmVhdGVkKGphdmEudXRpbC5EYXRlKQorCSAqLworCXB1YmxpYyB2b2lkIHNldENyZWF0ZWQoRGF0ZSBkYXRlKSB7CisJCXNldENyZWF0ZWQoY3JlYXRlSVNPODYwMURhdGVTdHJpbmcoZGF0ZSkpOworCX0gLy8gc2V0Q3JlYXRlZAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGljZW5zZSgpIHsKKwkJcmV0dXJuIGxpY2Vuc2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldExpY2Vuc2UoU3RyaW5nIG5ld0xpY2Vuc2UpIHsKKwkJU3RyaW5nIG9sZExpY2Vuc2UgPSBsaWNlbnNlOworCQlsaWNlbnNlID0gbmV3TGljZW5zZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fTElDRU5TRSwgb2xkTGljZW5zZSwgbGljZW5zZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVkKCkgeworCQlyZXR1cm4gcmVxdWlyZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKFN0cmluZyBuZXdSZXF1aXJlZCkgeworCQlTdHJpbmcgb2xkUmVxdWlyZWQgPSByZXF1aXJlZDsKKwkJcmVxdWlyZWQgPSBuZXdSZXF1aXJlZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fUkVRVUlSRUQsIG9sZFJlcXVpcmVkLCByZXF1aXJlZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFNwYXRpYWwoKSB7CisJCXJldHVybiBzcGF0aWFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTcGF0aWFsKFN0cmluZyBuZXdTcGF0aWFsKSB7CisJCVN0cmluZyBvbGRTcGF0aWFsID0gc3BhdGlhbDsKKwkJc3BhdGlhbCA9IG5ld1NwYXRpYWw7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1NQQVRJQUwsIG9sZFNwYXRpYWwsIHNwYXRpYWwpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRWYWxpZCgpIHsKKwkJcmV0dXJuIHZhbGlkOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldFZhbGlkRW5kRGF0ZSgpCisJICovCisJcHVibGljIERhdGUgZ2V0VmFsaWRFbmREYXRlKCkgeworCQlyZXR1cm4gZ2V0VmFsaWRFbmREYXRlKGdldFZhbGlkKCkpOworCX0gLy8gZ2V0VmFsaWRFbmREYXRlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRWYWxpZEVuZERhdGUoKQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJudWxsIikKKwlwdWJsaWMgc3RhdGljIERhdGUgZ2V0VmFsaWRFbmREYXRlKGZpbmFsIFN0cmluZyB2YWxpZFZhbHVlKSB7CisJCURhdGUgcmV0VmFsdWUgPSBudWxsOworCQkvLyBJcyB0aGUgdmFsaWQgdmFsdWUgc2V0PworCQlpZiAodmFsaWRWYWx1ZSAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIGludCBkYXRlSW5kZXggPSB2YWxpZFZhbHVlLmluZGV4T2YoRU5EKTsKKwkJCS8vIElzIHRoZSBlbmQgZGF0ZSBzcGVjaWZpZWQ/CisJCQlpZiAoZGF0ZUluZGV4ID49IDApIHsKKwkJCQkvLyBZZXMKKwkJCQl0cnkgeworCQkJCQlyZXRWYWx1ZSA9IGNyZWF0ZURhdGVGcm9tSVNPODYwMURhdGVTdHJpbmcodmFsaWRWYWx1ZQorCQkJCQkJCS5zdWJzdHJpbmcoZGF0ZUluZGV4ICsgRU5ELmxlbmd0aCgpKSk7CisJCQkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworCQkJCQlyZXRWYWx1ZSA9IG51bGw7CisJCQkJfQorCQkJfSAvLyBpZgorCQl9IC8vIGlmCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldFZhbGlkRW5kRGF0ZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjaXNWYWxpZEJlZm9yZShEdWJsaW5Db3JlKQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJudWxsIikKKwlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkQmVmb3JlKER1YmxpbkNvcmUgZHVibGluQ29yZSkgeworCQlmaW5hbCBEYXRlIG91clN0YXJ0RGF0ZSA9IGdldFZhbGlkU3RhcnREYXRlKCk7CisJCWZpbmFsIERhdGUgb3RoZXJTdGFydERhdGUgPSBkdWJsaW5Db3JlICE9IG51bGwgPyBkdWJsaW5Db3JlCisJCQkJLmdldFZhbGlkU3RhcnREYXRlKCkgOiBudWxsOworCisJCWJvb2xlYW4gcmV0VmFsdWUgPSAoZHVibGluQ29yZSA9PSBudWxsKSB8fCAob3RoZXJTdGFydERhdGUgPT0gbnVsbCk7CisKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZQorCQkJCXx8IChvdXJTdGFydERhdGUgIT0gbnVsbCAmJiBvdGhlclN0YXJ0RGF0ZS5hZnRlcihvdXJTdGFydERhdGUpKTsKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBpc1ZhbGlkQmVmb3JlCisKKwlwdWJsaWMgRGF0ZVtdIGNvbXB1dGVWYWxpZERhdGVSYW5nZU92ZXJsYXAoRHVibGluQ29yZSBkdWJsaW5Db3JlKSB7CisJCURhdGVbXSByZXRWYWx1ZSA9IG51bGw7CisJCQorCQlmaW5hbCBEYXRlIG91clN0YXJ0RGF0ZSA9IGdldFZhbGlkU3RhcnREYXRlKCk7CisJCWZpbmFsIERhdGUgb3VyRW5kRGF0ZSA9IGdldFZhbGlkRW5kRGF0ZSgpOworCQlmaW5hbCBEYXRlIG90aGVyU3RhcnREYXRlID0gZHVibGluQ29yZS5nZXRWYWxpZFN0YXJ0RGF0ZSgpOworCQlmaW5hbCBEYXRlIG90aGVyRW5kRGF0ZSA9IGR1YmxpbkNvcmUuZ2V0VmFsaWRFbmREYXRlKCk7CisKKwkJRGF0ZSBuZXdTdGFydERhdGUgPSBvdXJTdGFydERhdGU7CisJCURhdGUgbmV3RW5kRGF0ZSA9IG91ckVuZERhdGU7CisKKwkJLy8gRmlndXJlIG91dCB3aGljaCBzdGFydCBkYXRlIGlzIG9sZGVzdAorCQkvLyBEbyB3ZSBoYXZlIGEgc3RhcnQgZGF0ZT8KKwkJaWYgKG91clN0YXJ0RGF0ZSAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCS8vIEhvdyBhYm91dCB0aGUgb3RoZXIgc3RhcnQgZGF0ZT8KKwkJCWlmIChvdGhlclN0YXJ0RGF0ZSAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJLy8gSXMgdGhlIG90aGVyIHN0YXJ0IGRhdGUgYWZ0ZXIgb3Vycz8KKwkJCQlpZiAob3RoZXJTdGFydERhdGUuYWZ0ZXIob3VyU3RhcnREYXRlKSkgeworCQkJCQkvLyBZZXMKKwkJCQkJbmV3U3RhcnREYXRlID0gb3RoZXJTdGFydERhdGU7CisJCQkJfQorCQkJfSAvLyBpZiBvdGhlciBzdGFydCBkYXRlPworCQl9IC8vIGlmIHN0YXJ0IGRhdGU/CisJCWVsc2UgeworCQkJLy8gTm8KKwkJCW5ld1N0YXJ0RGF0ZSA9IG90aGVyU3RhcnREYXRlOworCQl9CisKKwkJLy8gRmlndXJlIG91dCB3aGljaCBlbmQgZGF0YSBpcyB5b3VuZ2VzdAorCQkvLyBEbyB3ZSBoYXZlIGFuIGVuZCBkYXRlPworCQlpZiAob3VyRW5kRGF0ZSAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCS8vIEhvdyBhYm91dCB0aGUgb3RoZXIgZW5kIGRhdGU/CisJCQlpZiAob3RoZXJFbmREYXRlICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQkvLyBJcyB0aGUgb3RoZXIgZW5kIGRhdGUgYmVmb3JlIG91cnM/CisJCQkJaWYgKG90aGVyRW5kRGF0ZS5iZWZvcmUob3VyRW5kRGF0ZSkpIHsKKwkJCQkJLy8gWWVzCisJCQkJCW5ld0VuZERhdGUgPSBvdGhlckVuZERhdGU7CisJCQkJfQorCQkJfSAvLyBpZiB0aGUgb3RoZXIgZW5kIGRhdGU/CisJCX0gLy8gaWYgd2UgaGF2ZSBhbiBlbmQgZGF0ZQorCQllbHNlIHsKKwkJCS8vIE5vCisJCQluZXdFbmREYXRlID0gb3RoZXJFbmREYXRlOworCQl9CisKKwkJLy8gQXQgdGhpcyBwb2ludCB0aGUgbmV3U3RhcnREYXRlIGFuZCBuZXdFbmREYXRlIGNvdWxkIGJlIG51bGwuIEhvd2V2ZXIsCisJCS8vIGlmIHRoZXkgYXJlIG5vdCBudWxsLCB3ZSBuZWVkIHRvIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzdGFydAorCQkvLyBjb21lcyBiZWZvcmUgdGhlIGVuZC4KKworCQkvLyBEbyB3ZSBoYXZlIGEgbmV3IHN0YXJ0IGRhdGU/CisJCWlmIChuZXdTdGFydERhdGUgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQkvLyBIb3cgYWJvdXQgdGhlIG5ldyBlbmQgZGF0ZT8KKwkJCWlmIChuZXdFbmREYXRlICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQkvLyBEb2VzIHRoZSBuZXcgc3RhcnQgZGF0ZSBjb21lIGJlZm9yZSB0aGUgbmV3IGVuZCBkYXRlPworCQkJCWlmIChuZXdTdGFydERhdGUuYmVmb3JlKG5ld0VuZERhdGUpKSB7CisJCQkJCS8vIFllcworCQkJCQlyZXRWYWx1ZSA9IG5ldyBEYXRlW10ge25ld1N0YXJ0RGF0ZSxuZXdFbmREYXRlfTsKKwkJCQl9IAorCQkJfQorCQl9IC8vIGlmIG5ldyBzdGFydCBkYXRlCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY29tcHV0ZVZhbGlkRGF0ZVJhbmdlT3ZlcmxhcAorCQorCS8qKgorCSAqIEBwYXJhbSB2YWxpZFZhbHVlCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZW5kIGRhdGUgaW4gdGhlIHZhbGlkIHN0cmluZyBkb2VzIG5vdAorCSAqICAgICAgICAgZXhpc3QsIG9yIGlmIGl0IGRvZXMsIGlmIGl0IGlzIHByb3Blcmx5IGZvcm1hdHRlZCwKKwkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRFbmREYXRlVmFsaWQoZmluYWwgU3RyaW5nIHZhbGlkVmFsdWUpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CisJCS8vIElzIHRoZSB2YWxpZCB2YWx1ZSBzZXQ/CisJCWlmICh2YWxpZFZhbHVlICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJdHJ5IHsKKwkJCQlmaW5hbCBTdHJpbmcgZW5kUGFydCA9IHZhbGlkVmFsdWUuc3Vic3RyaW5nKAorCQkJCQkJInN0YXJ0PXl5eXktREQtbW07Ii5sZW5ndGgoKSkudHJpbSgpOworCQkJCWZpbmFsIGludCBkYXRlSW5kZXggPSBlbmRQYXJ0LmluZGV4T2YoRU5EKTsKKworCQkJCS8vIFdhcyB0aGVyZSBqdXN0IHdoaXRlIHNwYWNlPworCQkJCWlmIChlbmRQYXJ0LmVxdWFscygiIikpIHsKKwkJCQkJLy8gWWVzCisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKworCQkJCS8vIERvZXMgaXQgZW5kIHdpdGggYSAiOyI/CisJCQkJaWYgKCFlbmRQYXJ0LmVuZHNXaXRoKCI7IikpIHsKKwkJCQkJLy8gTm8KKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQkKKwkJCQkvLyBJcyBpdCB0aGUgcmlnaHQgbGVuZ3RoPworCQkJCWlmIChlbmRQYXJ0Lmxlbmd0aCgpICE9IEVORC5sZW5ndGgoKSArICJ5eXl5LWRkLW1tOyIubGVuZ3RoKCkpIHsKKwkJCQkJLy8gTm8KKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQkKKwkJCQkvLyBJcyB0aGUgZW5kIGRhdGUgc3BlY2lmaWVkPworCQkJCWlmIChkYXRlSW5kZXggPT0gMCkgeworCQkJCQkvLyBZZXMKKwkJCQkJLy8gSWYgd2UgdGhyb3cgYSBwYXJzZSBleGNlcHRpb24gd2UnbGwgY2F0Y2ggaXQgYmVsb3cgYW5kIHJldHVybiBmYWxzZSAKKwkJCQkJY3JlYXRlRGF0ZUZyb21JU084NjAxRGF0ZVN0cmluZyhlbmRQYXJ0LnN1YnN0cmluZyggRU5ELmxlbmd0aCgpKSk7CisJCQkJCXJldFZhbHVlID0gdHJ1ZTsKKworCQkJCX0gLy8gaWYKKwkJCQllbHNlIHsKKwkJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQl9CisJCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCX0gY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCXJldFZhbHVlID0gZmFsc2U7CisJCQl9CisJCX0gLy8gaWYKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gaXNWYWxpZEVuZERhdGVWYWxpZAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmUjZ2V0VmFsaWRFbmREYXRlKCkKKwkgKi8KKwlwdWJsaWMgRGF0ZSBnZXRWYWxpZFN0YXJ0RGF0ZSgpIHsKKwkJcmV0dXJuIGdldFZhbGlkU3RhcnREYXRlKGdldFZhbGlkKCkpOworCX0gLy8gZ2V0VmFsaWRTdGFydERhdGUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI2dldFZhbGlkU3RhcnREYXRlKCkKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygibnVsbCIpCisJcHVibGljIHN0YXRpYyBEYXRlIGdldFZhbGlkU3RhcnREYXRlKGZpbmFsIFN0cmluZyB2YWxpZFZhbHVlKSB7CisJCURhdGUgcmV0VmFsdWUgPSBudWxsOworCQkvLyBJcyB0aGUgdmFsaWQgdmFsdWUgc2V0PworCQlpZiAodmFsaWRWYWx1ZSAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIGludCBkYXRlSW5kZXggPSB2YWxpZFZhbHVlLmluZGV4T2YoU1RBUlQpICsgU1RBUlQubGVuZ3RoKCk7CisJCQl0cnkgeworCQkJCXJldFZhbHVlID0gY3JlYXRlRGF0ZUZyb21JU084NjAxRGF0ZVN0cmluZyh2YWxpZFZhbHVlCisJCQkJCQkuc3Vic3RyaW5nKGRhdGVJbmRleCkpOworCQkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworCQkJCXJldFZhbHVlID0gbnVsbDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRWYWxpZFN0YXJ0RGF0ZQorCisJLyoqCisJICogQHBhcmFtIHZhbGlkVmFsdWUKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdGFydCBkYXRlIGluIHRoZSB2YWxpZCBzdHJpbmcgZXhpc3RzCisJICogICAgICAgICBhbmQgaXMgcHJvcGVybHkgZm9ybWF0dGVkCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRTdGFydERhdGVWYWxpZChmaW5hbCBTdHJpbmcgdmFsaWRWYWx1ZSkgeworCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisJCS8vIElzIHRoZSB2YWxpZCB2YWx1ZSBzZXQ/CisJCWlmICh2YWxpZFZhbHVlICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJdHJ5IHsKKwkJCQlmaW5hbCBTdHJpbmcgdHJpbWVkVmFsaWRWYWx1ZSA9IHZhbGlkVmFsdWUudHJpbSgpOworCQkJCWZpbmFsIGludCBkYXRlSW5kZXggPSB2YWxpZFZhbHVlLmluZGV4T2YoU1RBUlQpCisJCQkJCQkrIFNUQVJULmxlbmd0aCgpOworCQkJCWZpbmFsIFN0cmluZyBleHRyYWN0ZWREYXRlID0gdHJpbWVkVmFsaWRWYWx1ZS5zdWJzdHJpbmcoCisJCQkJCQlkYXRlSW5kZXgsICJzdGFydD1ZWVlZLURELU1NOyIubGVuZ3RoKCkpOworCQkJCS8vIElzIHRoZXJlIGEgIjsiIG9uIHRoZSBlbmQgb2YgdGhlIGRhdGU/CisJCQkJaWYgKCFleHRyYWN0ZWREYXRlLmVuZHNXaXRoKCI7IikpIHsKKwkJCQkJLy8gTm8KKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQkvLyBJZiB3ZSB0aHJvdyBhIHBhcnNlIGV4Y2VwdGlvbiwgd2UnbGwgY2F0Y2ggaXQgYmVsb3cgYW5kIHJldHVybiBmYWxzZQorCQkJCWNyZWF0ZURhdGVGcm9tSVNPODYwMURhdGVTdHJpbmcoZXh0cmFjdGVkRGF0ZSk7CisJCQkJcmV0VmFsdWUgPSB0cnVlOworCQkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworCQkJCXJldFZhbHVlID0gZmFsc2U7CisJCQl9IGNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJfQorCQl9CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGlzVmFsaWRTdGFydERhdGVWYWxpZAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbGlkKFN0cmluZyBuZXdWYWxpZCkgeworCQlTdHJpbmcgb2xkVmFsaWQgPSB2YWxpZDsKKwkJdmFsaWQgPSBuZXdWYWxpZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fVkFMSUQsIG9sZFZhbGlkLCB2YWxpZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIER1YmxpbkNvcmUgcG9wdWxhdGUoKSB7CisJCXNldENyZWF0ZWQoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkpOworCQlzZXRDcmVhdG9yKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5uYW1lIikpOworCQlyZXR1cm4gdGhpczsKKwl9IC8vIHBvcHVsYXRlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29tbW9uLkR1YmxpbkNvcmUjc2V0VmFsaWQoamF2YS51dGlsLkRhdGUsCisJICogICAgICBqYXZhLnV0aWwuRGF0ZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWxpZChmaW5hbCBEYXRlIHN0YXJ0RGF0ZSwgZmluYWwgRGF0ZSBlbmREYXRlKSB7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihTVEFSVCk7CisJCXNiLmFwcGVuZChjcmVhdGVJU084NjAxRGF0ZVN0cmluZyhzdGFydERhdGUpKTsKKwkJc2IuYXBwZW5kKCI7ICIpOworCQlzYi5hcHBlbmQoRU5EKTsKKwkJc2IuYXBwZW5kKGNyZWF0ZUlTTzg2MDFEYXRlU3RyaW5nKGVuZERhdGUpKTsKKwkJc2IuYXBwZW5kKCI7Iik7CisJCXNldFZhbGlkKHNiLnRvU3RyaW5nKCkpOworCX0gLy8gc2V0VmFsaWQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb21tb24uRHVibGluQ29yZSNzZXRWYWxpZChqYXZhLnV0aWwuRGF0ZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWxpZChmaW5hbCBEYXRlIHN0YXJ0RGF0ZSkgeworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoU1RBUlQpOworCQlzYi5hcHBlbmQoY3JlYXRlSVNPODYwMURhdGVTdHJpbmcoc3RhcnREYXRlKSk7CisJCXNiLmFwcGVuZCgiOyIpOworCQlzZXRWYWxpZChzYi50b1N0cmluZygpKTsKKwl9IC8vIHNldFZhbGlkCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19USVRMRToKKwkJCQlyZXR1cm4gZ2V0VGl0bGUoKTsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fSURFTlRJRklFUjoKKwkJCQlyZXR1cm4gZ2V0SWRlbnRpZmllcigpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQ1JFQVRPUjoKKwkJCQlyZXR1cm4gZ2V0Q3JlYXRvcigpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19EQVRFOgorCQkJCXJldHVybiBnZXREYXRlKCk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX0ZPUk1BVDoKKwkJCQlyZXR1cm4gZ2V0Rm9ybWF0KCk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1BVQkxJU0hFUjoKKwkJCQlyZXR1cm4gZ2V0UHVibGlzaGVyKCk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX0NPVkVSQUdFOgorCQkJCXJldHVybiBnZXRDb3ZlcmFnZSgpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19DT05UUklCVVRPUjoKKwkJCQlyZXR1cm4gZ2V0Q29udHJpYnV0b3IoKTsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fUkVMQVRJT046CisJCQkJcmV0dXJuIGdldFJlbGF0aW9uKCk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1JJR0hUUzoKKwkJCQlyZXR1cm4gZ2V0UmlnaHRzKCk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1NPVVJDRToKKwkJCQlyZXR1cm4gZ2V0U291cmNlKCk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1NVQkpFQ1Q6CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKTsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fVFlQRToKKwkJCQlyZXR1cm4gZ2V0VHlwZSgpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19MQU5HVUFHRToKKwkJCQlyZXR1cm4gZ2V0TGFuZ3VhZ2UoKTsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQklCTElPR1JBUEhJQ19DSVRBVElPTjoKKwkJCQlyZXR1cm4gZ2V0QmlibGlvZ3JhcGhpY0NpdGF0aW9uKCk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX0NSRUFURUQ6CisJCQkJcmV0dXJuIGdldENyZWF0ZWQoKTsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fTElDRU5TRToKKwkJCQlyZXR1cm4gZ2V0TGljZW5zZSgpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19SRVFVSVJFRDoKKwkJCQlyZXR1cm4gZ2V0UmVxdWlyZWQoKTsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fU1BBVElBTDoKKwkJCQlyZXR1cm4gZ2V0U3BhdGlhbCgpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19WQUxJRDoKKwkJCQlyZXR1cm4gZ2V0VmFsaWQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fVElUTEU6CisJCQkJc2V0VGl0bGUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19JREVOVElGSUVSOgorCQkJCXNldElkZW50aWZpZXIoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19ERVNDUklQVElPTjoKKwkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX0NSRUFUT1I6CisJCQkJc2V0Q3JlYXRvcigoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX0RBVEU6CisJCQkJc2V0RGF0ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX0ZPUk1BVDoKKwkJCQlzZXRGb3JtYXQoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19QVUJMSVNIRVI6CisJCQkJc2V0UHVibGlzaGVyKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQ09WRVJBR0U6CisJCQkJc2V0Q292ZXJhZ2UoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19DT05UUklCVVRPUjoKKwkJCQlzZXRDb250cmlidXRvcigoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1JFTEFUSU9OOgorCQkJCXNldFJlbGF0aW9uKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fUklHSFRTOgorCQkJCXNldFJpZ2h0cygoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1NPVVJDRToKKwkJCQlzZXRTb3VyY2UoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19TVUJKRUNUOgorCQkJCXNldFN1YmplY3QoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19UWVBFOgorCQkJCXNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19MQU5HVUFHRToKKwkJCQlzZXRMYW5ndWFnZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX0JJQkxJT0dSQVBISUNfQ0lUQVRJT046CisJCQkJc2V0QmlibGlvZ3JhcGhpY0NpdGF0aW9uKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQ1JFQVRFRDoKKwkJCQlzZXRDcmVhdGVkKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fTElDRU5TRToKKwkJCQlzZXRMaWNlbnNlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fUkVRVUlSRUQ6CisJCQkJc2V0UmVxdWlyZWQoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19TUEFUSUFMOgorCQkJCXNldFNwYXRpYWwoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19WQUxJRDoKKwkJCQlzZXRWYWxpZCgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fVElUTEU6CisJCQkJc2V0VGl0bGUoVElUTEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fSURFTlRJRklFUjoKKwkJCQlzZXRJZGVudGlmaWVyKElERU5USUZJRVJfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fREVTQ1JJUFRJT046CisJCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQ1JFQVRPUjoKKwkJCQlzZXRDcmVhdG9yKENSRUFUT1JfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fREFURToKKwkJCQlzZXREYXRlKERBVEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fRk9STUFUOgorCQkJCXNldEZvcm1hdChGT1JNQVRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fUFVCTElTSEVSOgorCQkJCXNldFB1Ymxpc2hlcihQVUJMSVNIRVJfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQ09WRVJBR0U6CisJCQkJc2V0Q292ZXJhZ2UoQ09WRVJBR0VfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQ09OVFJJQlVUT1I6CisJCQkJc2V0Q29udHJpYnV0b3IoQ09OVFJJQlVUT1JfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fUkVMQVRJT046CisJCQkJc2V0UmVsYXRpb24oUkVMQVRJT05fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fUklHSFRTOgorCQkJCXNldFJpZ2h0cyhSSUdIVFNfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fU09VUkNFOgorCQkJCXNldFNvdXJjZShTT1VSQ0VfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fU1VCSkVDVDoKKwkJCQlzZXRTdWJqZWN0KFNVQkpFQ1RfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fVFlQRToKKwkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fTEFOR1VBR0U6CisJCQkJc2V0TGFuZ3VhZ2UoTEFOR1VBR0VfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQklCTElPR1JBUEhJQ19DSVRBVElPTjoKKwkJCQlzZXRCaWJsaW9ncmFwaGljQ2l0YXRpb24oQklCTElPR1JBUEhJQ19DSVRBVElPTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19DUkVBVEVEOgorCQkJCXNldENyZWF0ZWQoQ1JFQVRFRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19MSUNFTlNFOgorCQkJCXNldExpY2Vuc2UoTElDRU5TRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19SRVFVSVJFRDoKKwkJCQlzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19TUEFUSUFMOgorCQkJCXNldFNwYXRpYWwoU1BBVElBTF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19WQUxJRDoKKwkJCQlzZXRWYWxpZChWQUxJRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19USVRMRToKKwkJCQlyZXR1cm4gVElUTEVfRURFRkFVTFQgPT0gbnVsbCA/IHRpdGxlICE9IG51bGwgOiAhVElUTEVfRURFRkFVTFQuZXF1YWxzKHRpdGxlKTsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fSURFTlRJRklFUjoKKwkJCQlyZXR1cm4gSURFTlRJRklFUl9FREVGQVVMVCA9PSBudWxsID8gaWRlbnRpZmllciAhPSBudWxsIDogIUlERU5USUZJRVJfRURFRkFVTFQuZXF1YWxzKGlkZW50aWZpZXIpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQ1JFQVRPUjoKKwkJCQlyZXR1cm4gQ1JFQVRPUl9FREVGQVVMVCA9PSBudWxsID8gY3JlYXRvciAhPSBudWxsIDogIUNSRUFUT1JfRURFRkFVTFQuZXF1YWxzKGNyZWF0b3IpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19EQVRFOgorCQkJCXJldHVybiBEQVRFX0VERUZBVUxUID09IG51bGwgPyBkYXRlICE9IG51bGwgOiAhREFURV9FREVGQVVMVC5lcXVhbHMoZGF0ZSk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX0ZPUk1BVDoKKwkJCQlyZXR1cm4gRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBmb3JtYXQgIT0gbnVsbCA6ICFGT1JNQVRfRURFRkFVTFQuZXF1YWxzKGZvcm1hdCk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1BVQkxJU0hFUjoKKwkJCQlyZXR1cm4gUFVCTElTSEVSX0VERUZBVUxUID09IG51bGwgPyBwdWJsaXNoZXIgIT0gbnVsbCA6ICFQVUJMSVNIRVJfRURFRkFVTFQuZXF1YWxzKHB1Ymxpc2hlcik7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX0NPVkVSQUdFOgorCQkJCXJldHVybiBDT1ZFUkFHRV9FREVGQVVMVCA9PSBudWxsID8gY292ZXJhZ2UgIT0gbnVsbCA6ICFDT1ZFUkFHRV9FREVGQVVMVC5lcXVhbHMoY292ZXJhZ2UpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19DT05UUklCVVRPUjoKKwkJCQlyZXR1cm4gQ09OVFJJQlVUT1JfRURFRkFVTFQgPT0gbnVsbCA/IGNvbnRyaWJ1dG9yICE9IG51bGwgOiAhQ09OVFJJQlVUT1JfRURFRkFVTFQuZXF1YWxzKGNvbnRyaWJ1dG9yKTsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fUkVMQVRJT046CisJCQkJcmV0dXJuIFJFTEFUSU9OX0VERUZBVUxUID09IG51bGwgPyByZWxhdGlvbiAhPSBudWxsIDogIVJFTEFUSU9OX0VERUZBVUxULmVxdWFscyhyZWxhdGlvbik7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1JJR0hUUzoKKwkJCQlyZXR1cm4gUklHSFRTX0VERUZBVUxUID09IG51bGwgPyByaWdodHMgIT0gbnVsbCA6ICFSSUdIVFNfRURFRkFVTFQuZXF1YWxzKHJpZ2h0cyk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1NPVVJDRToKKwkJCQlyZXR1cm4gU09VUkNFX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2UgIT0gbnVsbCA6ICFTT1VSQ0VfRURFRkFVTFQuZXF1YWxzKHNvdXJjZSk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1NVQkpFQ1Q6CisJCQkJcmV0dXJuIFNVQkpFQ1RfRURFRkFVTFQgPT0gbnVsbCA/IHN1YmplY3QgIT0gbnVsbCA6ICFTVUJKRUNUX0VERUZBVUxULmVxdWFscyhzdWJqZWN0KTsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fVFlQRToKKwkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19MQU5HVUFHRToKKwkJCQlyZXR1cm4gTEFOR1VBR0VfRURFRkFVTFQgPT0gbnVsbCA/IGxhbmd1YWdlICE9IG51bGwgOiAhTEFOR1VBR0VfRURFRkFVTFQuZXF1YWxzKGxhbmd1YWdlKTsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQklCTElPR1JBUEhJQ19DSVRBVElPTjoKKwkJCQlyZXR1cm4gQklCTElPR1JBUEhJQ19DSVRBVElPTl9FREVGQVVMVCA9PSBudWxsID8gYmlibGlvZ3JhcGhpY0NpdGF0aW9uICE9IG51bGwgOiAhQklCTElPR1JBUEhJQ19DSVRBVElPTl9FREVGQVVMVC5lcXVhbHMoYmlibGlvZ3JhcGhpY0NpdGF0aW9uKTsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQ1JFQVRFRDoKKwkJCQlyZXR1cm4gQ1JFQVRFRF9FREVGQVVMVCA9PSBudWxsID8gY3JlYXRlZCAhPSBudWxsIDogIUNSRUFURURfRURFRkFVTFQuZXF1YWxzKGNyZWF0ZWQpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19MSUNFTlNFOgorCQkJCXJldHVybiBMSUNFTlNFX0VERUZBVUxUID09IG51bGwgPyBsaWNlbnNlICE9IG51bGwgOiAhTElDRU5TRV9FREVGQVVMVC5lcXVhbHMobGljZW5zZSk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1JFUVVJUkVEOgorCQkJCXJldHVybiBSRVFVSVJFRF9FREVGQVVMVCA9PSBudWxsID8gcmVxdWlyZWQgIT0gbnVsbCA6ICFSRVFVSVJFRF9FREVGQVVMVC5lcXVhbHMocmVxdWlyZWQpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19TUEFUSUFMOgorCQkJCXJldHVybiBTUEFUSUFMX0VERUZBVUxUID09IG51bGwgPyBzcGF0aWFsICE9IG51bGwgOiAhU1BBVElBTF9FREVGQVVMVC5lcXVhbHMoc3BhdGlhbCk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1ZBTElEOgorCQkJCXJldHVybiBWQUxJRF9FREVGQVVMVCA9PSBudWxsID8gdmFsaWQgIT0gbnVsbCA6ICFWQUxJRF9FREVGQVVMVC5lcXVhbHModmFsaWQpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKQorCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJZmluYWwgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlpZiAoaWRlbnRpZmllciAhPSBudWxsICYmICFpZGVudGlmaWVyLmVxdWFscygiIikpIHsKKwkJCXJlc3VsdC5hcHBlbmQoImlkZW50aWZpZXI9XCIiKTsKKwkJCXJlc3VsdC5hcHBlbmQoaWRlbnRpZmllci50cmltKCkpOworCQkJcmVzdWx0LmFwcGVuZCgiXCIgIik7CisJCX0KKwkJaWYgKHR5cGUgIT0gbnVsbCAmJiAhdHlwZS5lcXVhbHMoIiIpKSB7CisJCQlyZXN1bHQuYXBwZW5kKCJ0eXBlPVwiIik7CisJCQlyZXN1bHQuYXBwZW5kKHR5cGUudHJpbSgpKTsKKwkJCXJlc3VsdC5hcHBlbmQoIlwiICIpOworCQl9CisJCWlmICh0aXRsZSAhPSBudWxsICYmICF0aXRsZS5lcXVhbHMoIiIpKSB7CisJCQlyZXN1bHQuYXBwZW5kKCJ0aXRsZT1cIiIpOworCQkJcmVzdWx0LmFwcGVuZCh0aXRsZS50cmltKCkpOworCQkJcmVzdWx0LmFwcGVuZCgiXCIgIik7CisJCX0KKworCQlpZiAoY3JlYXRvciAhPSBudWxsICYmICFjcmVhdG9yLmVxdWFscygiIikpIHsKKwkJCXJlc3VsdC5hcHBlbmQoImNyZWF0b3I9XCIiKTsKKwkJCXJlc3VsdC5hcHBlbmQoY3JlYXRvci50cmltKCkpOworCQkJcmVzdWx0LmFwcGVuZCgiXCIgIik7CisJCX0KKwkJaWYgKHN1YmplY3QgIT0gbnVsbCAmJiAhc3ViamVjdC5lcXVhbHMoIiIpKSB7CisJCQlyZXN1bHQuYXBwZW5kKCJzdWJqZWN0PVwiIik7CisJCQlyZXN1bHQuYXBwZW5kKHN1YmplY3QudHJpbSgpKTsKKwkJCXJlc3VsdC5hcHBlbmQoIlwiICIpOworCQl9CisJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmICFkZXNjcmlwdGlvbi5lcXVhbHMoIiIpKSB7CisJCQlyZXN1bHQuYXBwZW5kKCJkZXNjcmlwdGlvbj1cIiIpOworCQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbi50cmltKCkpOworCQkJcmVzdWx0LmFwcGVuZCgiXCIgIik7CisJCX0KKworCQlpZiAocHVibGlzaGVyICE9IG51bGwgJiYgIXB1Ymxpc2hlci5lcXVhbHMoIiIpKSB7CisJCQlyZXN1bHQuYXBwZW5kKCJwdWJsaXNoZXI9XCIiKTsKKwkJCXJlc3VsdC5hcHBlbmQocHVibGlzaGVyLnRyaW0oKSk7CisJCQlyZXN1bHQuYXBwZW5kKCJcIiAiKTsKKwkJfQorCQlpZiAoY29udHJpYnV0b3IgIT0gbnVsbCAmJiAhY29udHJpYnV0b3IuZXF1YWxzKCIiKSkgeworCQkJcmVzdWx0LmFwcGVuZCgiY29udHJpYnV0b3I9XCIiKTsKKwkJCXJlc3VsdC5hcHBlbmQoY29udHJpYnV0b3IudHJpbSgpKTsKKwkJCXJlc3VsdC5hcHBlbmQoIlwiICIpOworCQl9CisJCWlmIChkYXRlICE9IG51bGwgJiYgIWRhdGUuZXF1YWxzKCIiKSkgeworCQkJcmVzdWx0LmFwcGVuZCgiZGF0ZT1cIiIpOworCQkJcmVzdWx0LmFwcGVuZChkYXRlLnRyaW0oKSk7CisJCQlyZXN1bHQuYXBwZW5kKCJcIiAiKTsKKwkJfQorCisJCWlmIChmb3JtYXQgIT0gbnVsbCAmJiAhZm9ybWF0LmVxdWFscygiIikpIHsKKwkJCXJlc3VsdC5hcHBlbmQoImZvcm1hdD1cIiIpOworCQkJcmVzdWx0LmFwcGVuZChmb3JtYXQudHJpbSgpKTsKKwkJCXJlc3VsdC5hcHBlbmQoIlwiICIpOworCQl9CisKKwkJaWYgKHNvdXJjZSAhPSBudWxsICYmICFzb3VyY2UuZXF1YWxzKCIiKSkgeworCQkJcmVzdWx0LmFwcGVuZCgic291cmNlPVwiIik7CisJCQlyZXN1bHQuYXBwZW5kKHNvdXJjZS50cmltKCkpOworCQkJcmVzdWx0LmFwcGVuZCgiXCIgIik7CisJCX0KKwkJaWYgKGxhbmd1YWdlICE9IG51bGwgJiYgIWxhbmd1YWdlLmVxdWFscygiIikpIHsKKwkJCXJlc3VsdC5hcHBlbmQoImxhbmd1YWdlPVwiIik7CisJCQlyZXN1bHQuYXBwZW5kKGxhbmd1YWdlLnRyaW0oKSk7CisJCQlyZXN1bHQuYXBwZW5kKCJcIiAiKTsKKwkJfQorCQlpZiAocmVsYXRpb24gIT0gbnVsbCAmJiAhcmVsYXRpb24uZXF1YWxzKCIiKSkgeworCQkJcmVzdWx0LmFwcGVuZCgicmVsYXRpb249XCIiKTsKKwkJCXJlc3VsdC5hcHBlbmQocmVsYXRpb24udHJpbSgpKTsKKwkJCXJlc3VsdC5hcHBlbmQoIlwiICIpOworCQl9CisJCWlmIChjb3ZlcmFnZSAhPSBudWxsICYmICFjb3ZlcmFnZS5lcXVhbHMoIiIpKSB7CisJCQlyZXN1bHQuYXBwZW5kKCJjb3ZlcmFnZT1cIiIpOworCQkJcmVzdWx0LmFwcGVuZChjb3ZlcmFnZS50cmltKCkpOworCQkJcmVzdWx0LmFwcGVuZCgiXCIgIik7CisJCX0KKwkJaWYgKHJpZ2h0cyAhPSBudWxsICYmICFyaWdodHMuZXF1YWxzKCIiKSkgeworCQkJcmVzdWx0LmFwcGVuZCgicmlnaHRzPVwiIik7CisJCQlyZXN1bHQuYXBwZW5kKHJpZ2h0cy50cmltKCkpOworCQkJcmVzdWx0LmFwcGVuZCgiXCIgIik7CisJCX0KKwkJaWYgKGJpYmxpb2dyYXBoaWNDaXRhdGlvbiAhPSBudWxsICYmICFiaWJsaW9ncmFwaGljQ2l0YXRpb24uZXF1YWxzKCIiKSkgeworCQkJcmVzdWx0LmFwcGVuZCgiYmlibGlvZ3JhcGhpY0NpdGF0aW9uPVwiIik7CisJCQlyZXN1bHQuYXBwZW5kKGJpYmxpb2dyYXBoaWNDaXRhdGlvbi50cmltKCkpOworCQkJcmVzdWx0LmFwcGVuZCgiXCIgIik7CisJCX0KKwkJaWYgKGNyZWF0ZWQgIT0gbnVsbCAmJiAhY3JlYXRlZC5lcXVhbHMoIiIpKSB7CisJCQlyZXN1bHQuYXBwZW5kKCJjcmVhdGVkPVwiIik7CisJCQlyZXN1bHQuYXBwZW5kKGNyZWF0ZWQudHJpbSgpKTsKKwkJCXJlc3VsdC5hcHBlbmQoIlwiICIpOworCQl9CisJCWlmIChsaWNlbnNlICE9IG51bGwgJiYgIWxpY2Vuc2UuZXF1YWxzKCIiKSkgeworCQkJcmVzdWx0LmFwcGVuZCgibGljZW5zZT1cIiIpOworCQkJcmVzdWx0LmFwcGVuZChsaWNlbnNlLnRyaW0oKSk7CisJCQlyZXN1bHQuYXBwZW5kKCJcIiAiKTsKKwkJfQorCQlpZiAocmVxdWlyZWQgIT0gbnVsbCAmJiAhcmVxdWlyZWQuZXF1YWxzKCIiKSkgeworCQkJcmVzdWx0LmFwcGVuZCgicmVxdWlyZWQ9XCIiKTsKKwkJCXJlc3VsdC5hcHBlbmQocmVxdWlyZWQudHJpbSgpKTsKKwkJCXJlc3VsdC5hcHBlbmQoIlwiICIpOworCQl9CisJCWlmIChzcGF0aWFsICE9IG51bGwgJiYgIXNwYXRpYWwuZXF1YWxzKCIiKSkgeworCQkJcmVzdWx0LmFwcGVuZCgic3BhdGlhbD1cIiIpOworCQkJcmVzdWx0LmFwcGVuZChzcGF0aWFsLnRyaW0oKSk7CisJCQlyZXN1bHQuYXBwZW5kKCJcIiAiKTsKKwkJfQorCQlpZiAodmFsaWQgIT0gbnVsbCAmJiAhdmFsaWQuZXF1YWxzKCIiKSkgeworCQkJcmVzdWx0LmFwcGVuZCgidmFsaWQ9XCIiKTsKKwkJCXJlc3VsdC5hcHBlbmQodmFsaWQudHJpbSgpKTsKKwkJCXJlc3VsdC5hcHBlbmQoIlwiICIpOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0gLy8gdG9TdHJpbmcKKworCS8qKgorCSAqIENyZWF0ZSBhIGRhdGUgc3RyaW5nIHRoYXQgY29uZm9ybXMgdG8gSVNPJm5ic3A7ODYwMSA8YQorCSAqIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWUiPgorCSAqIGh0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWU8L2E+LgorCSAqIDx1bD4KKwkgKiA8bGk+RXhhbXBsZTo8L2xpPgorCSAqIDIwMDYtMDMtMjkKKwkgKiA8L3VsPgorCSAqIAorCSAqIEBzZWUgI2dldERhdGUoKQorCSAqIEBzZWUgI2dldENyZWF0ZWQoKQorCSAqIEBzZWUgI2dldFZhbGlkKCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVJU084NjAxRGF0ZVN0cmluZyhmaW5hbCBEYXRlIGRhdGUpIHsKKwkJcmV0dXJuIChuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCIpKS5mb3JtYXQoZGF0ZSk7CisJfSAvLyBjcmVhdGVJU084NjAxRGF0ZVN0cmluZworCisJLyoqCisJICogQ3JlYXRlIGEgRGF0ZSBmcm9tIGEgc3RyaW5nIHRoYXQgY29uZm9ybXMgdG8gSVNPJm5ic3A7ODYwMSA8YQorCSAqIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWUiPgorCSAqIGh0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWU8L2E+LgorCSAqIDx1bD4KKwkgKiA8bGk+RXhhbXBsZTo8L2xpPgorCSAqIDIwMDYtMDMtMjkKKwkgKiA8L3VsPgorCSAqIAorCSAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgZGF0ZSBzdHJpbmcgaXMgbm90IG9mIHRoZSBmb3JtYXQgInl5eXktTU0tZGQiCisJICogQHNlZSAjZ2V0RGF0ZSgpCisJICogQHNlZSAjZ2V0Q3JlYXRlZCgpCisJICogQHNlZSAjZ2V0VmFsaWQoKQorCSAqLworCXB1YmxpYyBzdGF0aWMgRGF0ZSBjcmVhdGVEYXRlRnJvbUlTTzg2MDFEYXRlU3RyaW5nKAorCQkJZmluYWwgU3RyaW5nIGlzbzg2MDFEYXRlU3RyaW5nKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworCQlyZXR1cm4gKG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIikpLnBhcnNlKGlzbzg2MDFEYXRlU3RyaW5nKTsKKwl9IC8vIGNyZWF0ZURhdGVGcm9tSVNPODYwMURhdGVTdHJpbmcKKworfSAvLyBEdWJsaW5Db3JlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL2ltcGwvSWRlbnRpZmlhYmxlRmlsdGVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL2ltcGwvSWRlbnRpZmlhYmxlRmlsdGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMDYxY2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vaW1wbC9JZGVudGlmaWFibGVGaWx0ZXJJbXBsLmphdmEKQEAgLTAsMCArMSwxNzAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZUZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklkZW50aWZpYWJsZSBGaWx0ZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBJZGVudGlmaWFibGVGaWx0ZXJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJZGVudGlmaWFibGVGaWx0ZXIgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJZGVudGlmaWFibGVGaWx0ZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5JREVOVElGSUFCTEVfRklMVEVSOworCX0KKworCXByaXZhdGUgU3RyaW5nIFtdcGF0dGVybnM7CisJcHVibGljIElkZW50aWZpYWJsZUZpbHRlckltcGwoU3RyaW5nIGZpbHRlcikgeworCQlpZihmaWx0ZXIgPT0gbnVsbClyZXR1cm47CisJCWlmKGZpbHRlci5jb250YWlucygiOiIpKXJldHVybjsgLy8gSW50ZXJuYWwgdXNlIGJ5IFNURU0sIG5vdCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKKwkJaWYoZmlsdGVyLnRyaW0oKS5lcXVhbHMoIiIpKXJldHVybjsKKwkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihmaWx0ZXIudG9TdHJpbmcoKSwgIjsiKTsKKwkJcGF0dGVybnMgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOworCQlmb3IoaW50IGk9MDtpPHBhdHRlcm5zLmxlbmd0aDsrK2kpIHsKKwkJCVN0cmluZyBwYXQgPSBzdC5uZXh0VG9rZW4oKTsKKwkJCXBhdHRlcm5zW2ldPXBhdDsKKwkJfQorCX0KKwkKKwlwdWJsaWMgRU1hcDxVUkksIE5vZGU+IGZpbHRlck5vZGVzKEVNYXA8VVJJLCBOb2RlPm1hcCkgeworCQlpZihwYXR0ZXJucyA9PSBudWxsKXJldHVybiBtYXA7CisJCUFycmF5TGlzdDxVUkk+cmVtb3ZlID0gbmV3IEFycmF5TGlzdDxVUkk+KCk7CisJCWZvcihVUkkgdXJpOm1hcC5rZXlTZXQoKSkgeworCQkJU3RyaW5nIGxhc3RTZWdtZW50ID0gdXJpLmxhc3RTZWdtZW50KCk7CisJCQlib29sZWFuIGtlZXAgPSBmYWxzZTsKKwkJCisJCQlmb3IoaW50IGk9MDtpPHBhdHRlcm5zLmxlbmd0aDsrK2kpIHsKKwkJCQlTdHJpbmcgcGF0ID0gcGF0dGVybnNbaV07CisJCQkJYm9vbGVhbiB3aWxkY2FyZCA9IGZhbHNlOworCQkJCWlmKHBhdC5lbmRzV2l0aCgiKiIpKSB7cGF0ID0gcGF0LnN1YnN0cmluZygwLCBwYXQubGVuZ3RoKCktMSk7d2lsZGNhcmQgPSB0cnVlO30KKwkJCQlpZih3aWxkY2FyZCAmJiBsYXN0U2VnbWVudC5jb250YWlucyhwYXQpCisJCQkJCQl8fCAhd2lsZGNhcmQgJiYgbGFzdFNlZ21lbnQuZXF1YWxzKHBhdCkpIHtrZWVwID0gdHJ1ZTticmVhazt9CisJCQl9CisJCQlpZigha2VlcClyZW1vdmUuYWRkKHVyaSk7CisJCX0KKwkJZm9yKFVSSSB1OnJlbW92ZSltYXAucmVtb3ZlKHUpOworCQlyZXR1cm4gbWFwOworCX0KKwlwdWJsaWMgRU1hcDxVUkksIEVkZ2U+IGZpbHRlckVkZ2VzKEVNYXA8VVJJLCBFZGdlPm1hcCkgeworCQlpZihwYXR0ZXJucyA9PSBudWxsKXJldHVybiBtYXA7CisJCUFycmF5TGlzdDxVUkk+cmVtb3ZlID0gbmV3IEFycmF5TGlzdDxVUkk+KCk7CisJCWZvcihVUkkgdXJpOm1hcC5rZXlTZXQoKSkgeworCQkJRWRnZSBlZGdlID0gbWFwLmdldCh1cmkpOworCQkJYm9vbGVhbiBmb3VuZFNvdXJjZT1mYWxzZSwgZm91bmREZXN0ID0gZmFsc2U7CisJCQlmb3IoaW50IGk9MDtpPHBhdHRlcm5zLmxlbmd0aDsrK2kpIHsKKwkJCQlTdHJpbmcgcGF0ID0gcGF0dGVybnNbaV07CisJCQkJYm9vbGVhbiB3aWxkY2FyZCA9IGZhbHNlOworCQkJCWlmKHBhdC5lbmRzV2l0aCgiKiIpKSB7cGF0ID0gcGF0LnN1YnN0cmluZygwLCBwYXQubGVuZ3RoKCktMSk7d2lsZGNhcmQgPSB0cnVlO30KKwkJCQkKKwkJCQlpZih3aWxkY2FyZCAmJiBlZGdlLmdldE5vZGVBVVJJKCkubGFzdFNlZ21lbnQoKS5jb250YWlucyhwYXQpCisJCQkJCQl8fCAhd2lsZGNhcmQgJiYgZWRnZS5nZXROb2RlQVVSSSgpLmxhc3RTZWdtZW50KCkuZXF1YWxzKHBhdCkpIGZvdW5kU291cmNlID0gdHJ1ZTsKKwkJCQlpZih3aWxkY2FyZCAmJiBlZGdlLmdldE5vZGVCVVJJKCkubGFzdFNlZ21lbnQoKS5jb250YWlucyhwYXQpCisJCQkJCQl8fCAhd2lsZGNhcmQgJiYgZWRnZS5nZXROb2RlQlVSSSgpLmxhc3RTZWdtZW50KCkuZXF1YWxzKHBhdCkpIGZvdW5kRGVzdCA9IHRydWU7CQkJCisJCQl9CisJCQlpZighKGZvdW5kU291cmNlICYmIGZvdW5kRGVzdCkpcmVtb3ZlLmFkZCh1cmkpOworCQl9CisJCWZvcihVUkkgdTpyZW1vdmUpbWFwLnJlbW92ZSh1KTsKKwkJcmV0dXJuIG1hcDsKKwl9CisJcHVibGljIEVNYXA8VVJJLCBOb2RlTGFiZWw+IGZpbHRlck5vZGVMYWJlbHMoRU1hcDxVUkksIE5vZGVMYWJlbD5tYXApIHsKKwkJaWYocGF0dGVybnMgPT0gbnVsbClyZXR1cm4gbWFwOworCQlBcnJheUxpc3Q8VVJJPnJlbW92ZSA9IG5ldyBBcnJheUxpc3Q8VVJJPigpOworCQlmb3IoVVJJIHVyaTptYXAua2V5U2V0KCkpIHsKKwkJCVN0cmluZyBsYXN0U2VnbWVudCA9IHVyaS5sYXN0U2VnbWVudCgpOworCQkJYm9vbGVhbiBrZWVwID0gZmFsc2U7CisJCQlmb3IoaW50IGk9MDtpPHBhdHRlcm5zLmxlbmd0aDsrK2kpIHsKKwkJCQlTdHJpbmcgcGF0ID0gcGF0dGVybnNbaV07CisJCQkJYm9vbGVhbiB3aWxkY2FyZCA9IGZhbHNlOworCQkJCWlmKHBhdC5lbmRzV2l0aCgiKiIpKSB7cGF0ID0gcGF0LnN1YnN0cmluZygwLCBwYXQubGVuZ3RoKCktMSk7d2lsZGNhcmQgPSB0cnVlO30KKwkJCQlpZih3aWxkY2FyZCAmJiBsYXN0U2VnbWVudC5jb250YWlucyhwYXQpIAorCQkJCQkJfHwgIXdpbGRjYXJkICYmIGxhc3RTZWdtZW50LmVxdWFscyhwYXQpKSB7a2VlcCA9IHRydWU7YnJlYWs7fQorCQkJfQorCQkJaWYoIWtlZXApcmVtb3ZlLmFkZCh1cmkpOworCQl9CisJCWZvcihVUkkgdTpyZW1vdmUpbWFwLnJlbW92ZSh1KTsKKwkJcmV0dXJuIG1hcDsKKwl9CisJcHVibGljIEVNYXA8VVJJLCBMYWJlbD4gZmlsdGVyTGFiZWxzKEVNYXA8VVJJLCBMYWJlbD5tYXApIHsKKwkJaWYocGF0dGVybnMgPT0gbnVsbClyZXR1cm4gbWFwOworCQlBcnJheUxpc3Q8VVJJPnJlbW92ZSA9IG5ldyBBcnJheUxpc3Q8VVJJPigpOworCQlmb3IoVVJJIHVyaTptYXAua2V5U2V0KCkpIHsKKwkJCVN0cmluZyBsYXN0U2VnbWVudCA9IHVyaS5sYXN0U2VnbWVudCgpOworCQkJYm9vbGVhbiBrZWVwID0gZmFsc2U7CisJCQlmb3IoaW50IGk9MDtpPHBhdHRlcm5zLmxlbmd0aDsrK2kpIHsJCQorCQkJCVN0cmluZyBwYXQgPSBwYXR0ZXJuc1tpXTsKKwkJCQlib29sZWFuIHdpbGRjYXJkID0gZmFsc2U7CisJCQkJaWYocGF0LmVuZHNXaXRoKCIqIikpIHtwYXQgPSBwYXQuc3Vic3RyaW5nKDAsIHBhdC5sZW5ndGgoKS0xKTt3aWxkY2FyZCA9IHRydWU7fQorCQkKKwkJCQlpZih3aWxkY2FyZCAmJiBsYXN0U2VnbWVudC5jb250YWlucyhwYXQpIHx8CisJCQkJCQkhd2lsZGNhcmQgJiYgbGFzdFNlZ21lbnQuZXF1YWxzKHBhdCkpIHtrZWVwID0gdHJ1ZTticmVhazt9CisJCQlpZigha2VlcClyZW1vdmUuYWRkKHVyaSk7CisJCQl9CisJCX0KKwkJZm9yKFVSSSB1OnJlbW92ZSltYXAucmVtb3ZlKHUpOworCQlyZXR1cm4gbWFwOworCX0KKwlwdWJsaWMgdm9pZCByZXN0cmljdChJZGVudGlmaWFibGVGaWx0ZXJJbXBsIG90aGVyKSB7CisJCS8vIFRvRE8uIFRoZSBpZGVhIGlzIHRoYXQgd2UgbmVlZCB0byBjb25zb2xpZGF0ZSBhIGxpc3Qgb2YgcGF0dGVybnMgaW50byBhIHNpbmdsZQorCQkvLyBsaXN0IGlmIHRoZXJlIGFyZSBkdXBsaWNhdGVzIG9yIG1vcmUgZ2VuZXJhbCBwYXR0ZXJucworLyoJCWlmKG90aGVyLnBhdHRlcm5zID09IG51bGwpcmV0dXJuOworCQlBcnJheUxpc3Q8U3RyaW5nPnJlc3RyaWN0ZWRQYXR0ZXJucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlpZih0aGlzLnBhdHRlcm5zICE9IG51bGwpIGZvcihTdHJpbmcgbXlwYXQ6dGhpcy5wYXR0ZXJucylyZXN0cmljdGVkUGF0dGVybnMuYWRkKG15cGF0KTsKKwkJZm9yKFN0cmluZyBvdGhlcnBhdDpvdGhlci5wYXR0ZXJucykgaWYoIXJlc3RyaWN0ZWRQYXR0ZXJucy5jb250YWlucyhvdGhlcnBhdCkpIHJlc3RyaWN0ZWRQYXR0ZXJucy5hZGQob3RoZXJwYXQpOworCQkvLyBOb3cgZ28gdGhyb3VnaCBhbmQgcmVtb3ZlIHBhdHRlcm5zIHRoYXQgYXJlIG1vcmUgZ2VuZXJhbCB0aGFuIG90aGVycy4KKwkJZm9yKFN0cmluZyBwYXQ6b3RoZXIucGF0dGVybnMpIHsKKwkJCWZvcihTdHJpbmcgcDpyZXN0cmljdGVkUGF0dGVybnMpCisJCQkJaWYoIXAuZXF1YWxzKHBhdCkgJiYgcC5jb250YWlucyhwYXQpKSByZXN0cmljdGVkUGF0dGVybnMucmVtb3ZlKHApOworCQl9CisJCWlmKHRoaXMucGF0dGVybnMgIT0gbnVsbCkgCisJCQlmb3IoU3RyaW5nIHBhdDp0aGlzLnBhdHRlcm5zKSB7CisJCQkJZm9yKFN0cmluZyBwOnJlc3RyaWN0ZWRQYXR0ZXJucykKKwkJCQkJaWYoIXAuZXF1YWxzKHBhdCkgJiYgcC5jb250YWlucyhwYXQpKSByZXN0cmljdGVkUGF0dGVybnMucmVtb3ZlKHApOworCQkJfQorCQl0aGlzLnBhdHRlcm5zID0gbmV3IFN0cmluZ1tyZXN0cmljdGVkUGF0dGVybnMuc2l6ZSgpXTsKKwkJZm9yKGludCBpPTA7aTxyZXN0cmljdGVkUGF0dGVybnMuc2l6ZSgpOysraSkgdGhpcy5wYXR0ZXJuc1tpXSA9IHJlc3RyaWN0ZWRQYXR0ZXJucy5nZXQoaSk7CisJKi8KKwl9CisJCit9IC8vSWRlbnRpZmlhYmxlRmlsdGVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL2ltcGwvSWRlbnRpZmlhYmxlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL2ltcGwvSWRlbnRpZmlhYmxlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OWE1MmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vaW1wbC9JZGVudGlmaWFibGVJbXBsLmphdmEKQEAgLTAsMCArMSwzOTAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklkZW50aWZpYWJsZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLklkZW50aWZpYWJsZUltcGwjZ2V0VVJJIDxlbT5VUkk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5JZGVudGlmaWFibGVJbXBsI2dldFR5cGVVUkkgPGVtPlR5cGUgVVJJPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuSWRlbnRpZmlhYmxlSW1wbCNnZXREdWJsaW5Db3JlIDxlbT5EdWJsaW4gQ29yZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIElkZW50aWZpYWJsZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzCisJCUlkZW50aWZpYWJsZSB7CisKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVUkkoKSA8ZW0+VVJJPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VVJJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVSSSBVUklfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VVJJKCkgPGVtPlVSSTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFVSSSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFVSSSB1UkkgPSBVUklfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZVVSSSgpIDxlbT5UeXBlIFVSSTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFR5cGVVUkkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVVJJIFRZUEVfVVJJX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVVUkkoKSA8ZW0+VHlwZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUeXBlVVJJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVVJJIHR5cGVVUkkgPSBUWVBFX1VSSV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1YmxpbkNvcmUoKSA8ZW0+RHVibGluIENvcmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREdWJsaW5Db3JlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRHVibGluQ29yZSBkdWJsaW5Db3JlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgSWRlbnRpZmlhYmxlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwkJc2V0RHVibGluQ29yZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEdWJsaW5Db3JlKCkpOworLy8JCXNldFVSSShTVEVNVVJJLmNyZWF0ZVVSSSgiaWRlbnRpZmlhYmxlIiArIFNURU1VUkkuZ2VuZXJhdGVVbmlxdWVQYXJ0KCkpKTsKKwkJc2V0VHlwZVVSSShTVEVNVVJJLklERU5USUZJQUJMRV9UWVBFX1VSSSk7CisJfSAvLyBJZGVudGlmaWFibGVJbXBsCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLklERU5USUZJQUJMRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIER1YmxpbkNvcmUgZ2V0RHVibGluQ29yZSgpIHsKKwkJcmV0dXJuIGR1YmxpbkNvcmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREdWJsaW5Db3JlKER1YmxpbkNvcmUgbmV3RHVibGluQ29yZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlEdWJsaW5Db3JlIG9sZER1YmxpbkNvcmUgPSBkdWJsaW5Db3JlOworCQlkdWJsaW5Db3JlID0gbmV3RHVibGluQ29yZTsKKwkJCisJCS8vIEEgbmV3IER1YmxpbkNvcmUgaW5zdGFuY2U/CisJCWlmIChkdWJsaW5Db3JlICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJLy8gTWFrZSBzdXJlIHRoZSBpZGVudGlmaWVyIGFuZCBmb3JtYXQgVVJJJ3MgbWF0Y2ggdGhlIElkZW50aWZpYWJsZSdzCisJCQkvLyBBcmUgdGhleSB2YWxpZCB5ZXQ/CisJCQlpZiAoZ2V0VVJJKCkgIT0gbnVsbCAmJiBnZXRUeXBlVVJJKCkgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCWR1YmxpbkNvcmUuc2V0SWRlbnRpZmllcihnZXRVUkkoKS50b1N0cmluZygpKTsKKwkJCQlkdWJsaW5Db3JlLnNldFR5cGUoZ2V0VHlwZVVSSSgpLnRvU3RyaW5nKCkpOworCQkJfSAvLyBpZiAKKwkJCQorCQl9IC8vIGlmIAorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9fRFVCTElOX0NPUkUsIG9sZER1YmxpbkNvcmUsIG5ld0R1YmxpbkNvcmUpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREdWJsaW5Db3JlKER1YmxpbkNvcmUgbmV3RHVibGluQ29yZSkgeworCQlpZiAobmV3RHVibGluQ29yZSAhPSBkdWJsaW5Db3JlKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChkdWJsaW5Db3JlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWR1YmxpbkNvcmUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9fRFVCTElOX0NPUkUsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0R1YmxpbkNvcmUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RHVibGluQ29yZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19EVUJMSU5fQ09SRSwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXREdWJsaW5Db3JlKG5ld0R1YmxpbkNvcmUsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX0RVQkxJTl9DT1JFLCBuZXdEdWJsaW5Db3JlLCBuZXdEdWJsaW5Db3JlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVUkkgZ2V0VHlwZVVSSSgpIHsKKwkJcmV0dXJuIHR5cGVVUkk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBTZXQgdGhlIHR5cGUgVVJJLCBidXQgYWxzbyB1cGRhdGUgdGhlIER1YmxpbkNvcmUgdHlwZS4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHNldFR5cGVVUkkoVVJJIG5ld1R5cGVVUkkpIHsKKwkJVVJJIG9sZFR5cGVVUkkgPSB0eXBlVVJJOworCQl0eXBlVVJJID0gbmV3VHlwZVVSSTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKKwkJCQkJQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX1RZUEVfVVJJLCBvbGRUeXBlVVJJLCB0eXBlVVJJKSk7CisJCS8vIFVwZGF0ZSBEdWJsaW5Db3JlPworCQlpZiAoZHVibGluQ29yZSAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCWR1YmxpbkNvcmUuc2V0VHlwZShuZXdUeXBlVVJJLnRvU3RyaW5nKCkpOworCQl9CisJfSAvLyBzZXRUeXBlVVJJCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOworCisJCS8vcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBnZXRVUkkoKS5zY2hlbWUoKS5lcXVhbHMoQ29uc3RhbnRzLlNURU1fU0NIRU1FKTsKKwkJLy9hc3NlcnQocmV0VmFsdWUpOworCQkKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBnZXRUeXBlVVJJKCkuc2NoZW1lKCkuZXF1YWxzKENvbnN0YW50cy5TVEVNX1RZUEVfU0NIRU1FKTsKKwkJYXNzZXJ0KHJldFZhbHVlKTsKKwkJCisJCS8vIElmIHRoZXJlIGlzIGR1YmxpbiBjb3JlIHRoZW4gdGhlIFVSSSdzIG9mIHRoZSBJZGVudGlmaWFibGUgYW5kIHRoZQorCQkvLyBEdWJsaW4gQ29yZSBpbnN0YW5jZSBzaG91bGQgYWdyZWUuCisJCWlmIChkdWJsaW5Db3JlICE9IG51bGwpIHsKKwkJCWZpbmFsIER1YmxpbkNvcmUgZGMgPSBnZXREdWJsaW5Db3JlKCk7CisJCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIGdldFVSSSgpLnRvU3RyaW5nKCkuZXF1YWxzKGRjLmdldElkZW50aWZpZXIoKSk7CisJCQlhc3NlcnQocmV0VmFsdWUpOworCQl9CisKKwkJLy8gVGhpcyB0ZXN0IGxvb2tzIGZvciBkdXBsaWNhdGUgYWRhcHRlcnMuIFRoaXMgY2FuIG9jY3VyIGlmIHRoZQorCQkvLyBhZGFwdGVycyBhcmUgc3RhdGVmdWwKKwkJLy8gQW55IGFkYXB0ZXJzPworCQkvLyBpZiAocmV0VmFsdWUgJiYgZUFkYXB0ZXJzICE9IG51bGwgJiYgZUFkYXB0ZXJzLnNpemUoKSA+IDAgKSB7CisJCS8vIC8vIFllcworCQkvLyAvLyBUaGUgbGlzdCBvZiBhZGFwdGVycyBzaG91bGRuJ3QgY29udGFpbiBhbnkgZHVwbGljYXRlIGFkYXB0ZXJzIG9mCisJCS8vIC8vIHRoZSBzYW1lIHR5cGUKKwkJLy8gZmluYWwgU2V0PENsYXNzPiB0eXBlcyA9IG5ldyBIYXNoU2V0PENsYXNzPigpOworCQkvLyBmb3IgKEFkYXB0ZXIgYWRhcHRlciA6IGVBZGFwdGVycykgeworCQkvLyB0eXBlcy5hZGQoYWRhcHRlci5nZXRDbGFzcygpKTsKKwkJLy8gfQorCQkvLyByZXRWYWx1ZSA9IHJldFZhbHVlICYmIHR5cGVzLnNpemUoKSA9PSBlQWRhcHRlcnMuc2l6ZSgpOworCQkvLyBhc3NlcnQgcmV0VmFsdWU7CisJCS8vIH0gLy8gaWYgYW55IGFkYXB0ZXJzCisJCQorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHNhbmUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVVJJIGdldFVSSSgpIHsKKwkJcmV0dXJuIHVSSTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIFNldCB0aGUgVVJJIGFuZCBhbHNvIHVwZGF0ZSB0aGUgSWRlbnRpZmllciBpbiB0aGUgZHVibGluIGNvcmUgaW5zdGFuY2UKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHNldFVSSShVUkkgbmV3VVJJKSB7CisJCVVSSSBvbGRVUkkgPSB1Ukk7CisJCXVSSSA9IG5ld1VSSTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKKwkJCQkJQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX1VSSSwgb2xkVVJJLCB1UkkpKTsKKwkJLy8gVXBkYXRlIER1YmxpbkNvcmU/CisJCWlmIChkdWJsaW5Db3JlICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJZHVibGluQ29yZS5zZXRJZGVudGlmaWVyKG5ld1VSSS50b1N0cmluZygpKTsKKwkJfQorCX0gLy8gc2V0VVJJCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9fRFVCTElOX0NPUkU6CisJCQkJcmV0dXJuIGJhc2ljU2V0RHVibGluQ29yZShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX1VSSToKKwkJCQlyZXR1cm4gZ2V0VVJJKCk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19UWVBFX1VSSToKKwkJCQlyZXR1cm4gZ2V0VHlwZVVSSSgpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9fRFVCTElOX0NPUkU6CisJCQkJcmV0dXJuIGdldER1YmxpbkNvcmUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX1VSSToKKwkJCQlzZXRVUkkoKFVSSSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9fVFlQRV9VUkk6CisJCQkJc2V0VHlwZVVSSSgoVVJJKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19EVUJMSU5fQ09SRToKKwkJCQlzZXREdWJsaW5Db3JlKChEdWJsaW5Db3JlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX1VSSToKKwkJCQlzZXRVUkkoVVJJX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19UWVBFX1VSSToKKwkJCQlzZXRUeXBlVVJJKFRZUEVfVVJJX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19EVUJMSU5fQ09SRToKKwkJCQlzZXREdWJsaW5Db3JlKChEdWJsaW5Db3JlKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX1VSSToKKwkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1UkkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVSSSk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19UWVBFX1VSSToKKwkJCQlyZXR1cm4gVFlQRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGVVUkkgIT0gbnVsbCA6ICFUWVBFX1VSSV9FREVGQVVMVC5lcXVhbHModHlwZVVSSSk7CisJCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19EVUJMSU5fQ09SRToKKwkJCQlyZXR1cm4gZHVibGluQ29yZSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKQorCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJcmVzdWx0LmFwcGVuZCgiKHVSSTogIik7CisJCXJlc3VsdC5hcHBlbmQodVJJKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlVVJJOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCh0eXBlVVJJKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZSNjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgaW50IGNvbXBhcmVUbyhJZGVudGlmaWFibGUgbykgeworCQlmaW5hbCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGl0ZW1Qcm92aWRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgKKwkJCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOworCisJCWZpbmFsIElJdGVtTGFiZWxQcm92aWRlciBscDEgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBpdGVtUHJvdmlkZXJGYWN0b3J5LmFkYXB0KAorCQkJCXRoaXMsIElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7CisJCWZpbmFsIElJdGVtTGFiZWxQcm92aWRlciBscDIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBpdGVtUHJvdmlkZXJGYWN0b3J5LmFkYXB0KG8sCisJCQkJSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKKwkJcmV0dXJuIGxwMS5nZXRUZXh0KHRoaXMpLmNvbXBhcmVUbyhscDIuZ2V0VGV4dChvKSk7CisJfSAvLyBjb21wYXJlVG8KKworCQorfSAvLyBJZGVudGlmaWFibGVJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vaW1wbC9TdHJpbmdWYWx1ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9pbXBsL1N0cmluZ1ZhbHVlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMjZlNDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vaW1wbC9TdHJpbmdWYWx1ZUltcGwuamF2YQpAQCAtMCwwICsxLDIwNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU3RyaW5nVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdHJpbmcgVmFsdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5TdHJpbmdWYWx1ZUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RyaW5nVmFsdWVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTdHJpbmdWYWx1ZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nVmFsdWVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5TVFJJTkdfVkFMVUU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgeworCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKKwkJdmFsdWUgPSBuZXdWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5TVFJJTkdfVkFMVUVfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENvbW1vblBhY2thZ2UuU1RSSU5HX1ZBTFVFX19WQUxVRToKKwkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDb21tb25QYWNrYWdlLlNUUklOR19WQUxVRV9fVkFMVUU6CisJCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5TVFJJTkdfVkFMVUVfX1ZBTFVFOgorCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5TVFJJTkdfVkFMVUVfX1ZBTFVFOgorCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQodmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKKwlwcml2YXRlIElkZW50aWZpYWJsZSBmaW5kSWRlbnRpZmlhYmxlKEVPYmplY3QgbykgeworCQlpZihvIGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlKSByZXR1cm4gKElkZW50aWZpYWJsZSlvOworCQlpZihvLmVDb250YWluZXIoKSAhPSBudWxsKSByZXR1cm4gZmluZElkZW50aWZpYWJsZShvLmVDb250YWluZXIoKSk7CisJCXJldHVybiBudWxsOworCX0KKwkvKioKKwkgKiBOZWVkIHRvIG92ZXJyaWRlIHRvIG1ha2Ugc3VyZSBtb2RpZmllcnMgY2FuIGZpbmQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlJZGVudGlmaWFibGUgaWQgPSBmaW5kSWRlbnRpZmlhYmxlKHRoaXMpOworCQkKKwkJCisJCWlmKGlkIT1udWxsKSAKKwkJCXJldHVybiBpZC5nZXRVUkkoKS5oYXNoQ29kZSgpIF4KKwkJCXRoaXMuZUNvbnRhaW5pbmdGZWF0dXJlKCkuZ2V0TmFtZSgpLmhhc2hDb2RlKCk7CisJCQkKKwkJcmV0dXJuIHRoaXMuaGFzaENvZGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisJCWlmKCEobyBpbnN0YW5jZW9mIERvdWJsZVZhbHVlSW1wbCkpIHJldHVybiBmYWxzZTsKKwkJRG91YmxlVmFsdWVJbXBsIGR2aSA9IChEb3VibGVWYWx1ZUltcGwpbzsKKwkJSWRlbnRpZmlhYmxlIGlkID0gZmluZElkZW50aWZpYWJsZShkdmkpOworCQlJZGVudGlmaWFibGUgaWQyID0gZmluZElkZW50aWZpYWJsZSh0aGlzKTsKKwkJaWYoIWlkLmdldFVSSSgpLmVxdWFscyhpZDIuZ2V0VVJJKCkpKSByZXR1cm4gZmFsc2U7CisJCQorCQkvLyBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBwYXRoIGZyb20gdGhlIGlkZW50aWZpYWJsZQorCQkvLyB0byBoZXJlIGlzIHRoZSBzYW1lCisJCS8vLi4uIHRvZG8KKwkJcmV0dXJuIChzdXBlci5lcXVhbHMobykpOworCX0KK30gLy9TdHJpbmdWYWx1ZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9pbXBsL1N0cmluZ1ZhbHVlTGlzdEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9pbXBsL1N0cmluZ1ZhbHVlTGlzdEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTQxNmNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL2ltcGwvU3RyaW5nVmFsdWVMaXN0SW1wbC5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU3RyaW5nVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZUxpc3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdHJpbmcgVmFsdWUgTGlzdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLlN0cmluZ1ZhbHVlTGlzdEltcGwjZ2V0VmFsdWVzIDxlbT5WYWx1ZXM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpbmdWYWx1ZUxpc3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTdHJpbmdWYWx1ZUxpc3QgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlcygpIDxlbT5WYWx1ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmFsdWVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nVmFsdWU+IHZhbHVlczsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmdWYWx1ZUxpc3RJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5TVFJJTkdfVkFMVUVfTElTVDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8U3RyaW5nVmFsdWU+IGdldFZhbHVlcygpIHsKKwkJaWYgKHZhbHVlcyA9PSBudWxsKSB7CisJCQl2YWx1ZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8U3RyaW5nVmFsdWU+KFN0cmluZ1ZhbHVlLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLlNUUklOR19WQUxVRV9MSVNUX19WQUxVRVMpOworCQl9CisJCXJldHVybiB2YWx1ZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDb21tb25QYWNrYWdlLlNUUklOR19WQUxVRV9MSVNUX19WQUxVRVM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRWYWx1ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENvbW1vblBhY2thZ2UuU1RSSU5HX1ZBTFVFX0xJU1RfX1ZBTFVFUzoKKwkJCQlyZXR1cm4gZ2V0VmFsdWVzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5TVFJJTkdfVkFMVUVfTElTVF9fVkFMVUVTOgorCQkJCWdldFZhbHVlcygpLmNsZWFyKCk7CisJCQkJZ2V0VmFsdWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmdWYWx1ZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENvbW1vblBhY2thZ2UuU1RSSU5HX1ZBTFVFX0xJU1RfX1ZBTFVFUzoKKwkJCQlnZXRWYWx1ZXMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDb21tb25QYWNrYWdlLlNUUklOR19WQUxVRV9MSVNUX19WQUxVRVM6CisJCQkJcmV0dXJuIHZhbHVlcyAhPSBudWxsICYmICF2YWx1ZXMuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy9TdHJpbmdWYWx1ZUxpc3RJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJvdmlkZXIvQ29tbW9uRWRpdFBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Byb3ZpZGVyL0NvbW1vbkVkaXRQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzMxNGQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Byb3ZpZGVyL0NvbW1vbkVkaXRQbHVnaW4uamF2YQpAQCAtMCwwICsxLDk5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5FTUZQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLkVjbGlwc2VVSVBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisKKy8qKgorICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBDb21tb24gZWRpdG9yIHBsdWdpbi4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENvbW1vbkVkaXRQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4geworCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1vbkVkaXRQbHVnaW4gSU5TVEFOQ0UgPSBuZXcgQ29tbW9uRWRpdFBsdWdpbigpOworCisJLyoqCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbW1vbkVkaXRQbHVnaW4oKSB7CisJCXN1cGVyCisJCSAgKG5ldyBSZXNvdXJjZUxvY2F0b3IgW10geworCQkgICB9KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKKwkvKioKKwkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlBsdWdpbjwvYj4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbiBleHRlbmRzIEVjbGlwc2VVSVBsdWdpbiB7CisJCS8qKgorCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgeworCQkJc3VwZXIoKTsKKworCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4KKwkJCS8vCisJCQlwbHVnaW4gPSB0aGlzOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJvdmlkZXIvQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9wcm92aWRlci9Db21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjE3MzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJvdmlkZXIvQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM1MyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRpc3Bvc2FibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnV0aWwuQ29tbW9uQWRhcHRlckZhY3Rvcnk7CisKKy8qKgorICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLgorICogVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uCisgKiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgorICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBDb21tb25BZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZX0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEdWJsaW5Db3JlSXRlbVByb3ZpZGVyIGR1YmxpbkNvcmVJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEdWJsaW5Db3JlQWRhcHRlcigpIHsKKwkJaWYgKGR1YmxpbkNvcmVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJZHVibGluQ29yZUl0ZW1Qcm92aWRlciA9IG5ldyBEdWJsaW5Db3JlSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGR1YmxpbkNvcmVJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZUZpbHRlcn0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJZGVudGlmaWFibGVGaWx0ZXJJdGVtUHJvdmlkZXIgaWRlbnRpZmlhYmxlRmlsdGVySXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlRmlsdGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJZGVudGlmaWFibGVGaWx0ZXJBZGFwdGVyKCkgeworCQlpZiAoaWRlbnRpZmlhYmxlRmlsdGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCWlkZW50aWZpYWJsZUZpbHRlckl0ZW1Qcm92aWRlciA9IG5ldyBJZGVudGlmaWFibGVGaWx0ZXJJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gaWRlbnRpZmlhYmxlRmlsdGVySXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZUxpc3R9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRG91YmxlVmFsdWVMaXN0SXRlbVByb3ZpZGVyIGRvdWJsZVZhbHVlTGlzdEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlTGlzdH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRG91YmxlVmFsdWVMaXN0QWRhcHRlcigpIHsKKwkJaWYgKGRvdWJsZVZhbHVlTGlzdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlkb3VibGVWYWx1ZUxpc3RJdGVtUHJvdmlkZXIgPSBuZXcgRG91YmxlVmFsdWVMaXN0SXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGRvdWJsZVZhbHVlTGlzdEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWVNYXRyaXh9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRG91YmxlVmFsdWVNYXRyaXhJdGVtUHJvdmlkZXIgZG91YmxlVmFsdWVNYXRyaXhJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZU1hdHJpeH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRG91YmxlVmFsdWVNYXRyaXhBZGFwdGVyKCkgeworCQlpZiAoZG91YmxlVmFsdWVNYXRyaXhJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJZG91YmxlVmFsdWVNYXRyaXhJdGVtUHJvdmlkZXIgPSBuZXcgRG91YmxlVmFsdWVNYXRyaXhJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gZG91YmxlVmFsdWVNYXRyaXhJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIERvdWJsZVZhbHVlSXRlbVByb3ZpZGVyIGRvdWJsZVZhbHVlSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvdWJsZVZhbHVlQWRhcHRlcigpIHsKKwkJaWYgKGRvdWJsZVZhbHVlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCWRvdWJsZVZhbHVlSXRlbVByb3ZpZGVyID0gbmV3IERvdWJsZVZhbHVlSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGRvdWJsZVZhbHVlSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZUxpc3R9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nVmFsdWVMaXN0SXRlbVByb3ZpZGVyIHN0cmluZ1ZhbHVlTGlzdEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlN0cmluZ1ZhbHVlTGlzdH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RyaW5nVmFsdWVMaXN0QWRhcHRlcigpIHsKKwkJaWYgKHN0cmluZ1ZhbHVlTGlzdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlzdHJpbmdWYWx1ZUxpc3RJdGVtUHJvdmlkZXIgPSBuZXcgU3RyaW5nVmFsdWVMaXN0SXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHN0cmluZ1ZhbHVlTGlzdEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU3RyaW5nVmFsdWV9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nVmFsdWVJdGVtUHJvdmlkZXIgc3RyaW5nVmFsdWVJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RyaW5nVmFsdWVBZGFwdGVyKCkgeworCQlpZiAoc3RyaW5nVmFsdWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJc3RyaW5nVmFsdWVJdGVtUHJvdmlkZXIgPSBuZXcgU3RyaW5nVmFsdWVJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gc3RyaW5nVmFsdWVJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7CisJCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOworCX0KKworCS8qKgorCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKKwkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7CisJCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgeworCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgeworCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOworCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzPD8+KSB8fCAoKChDbGFzczw/Pil0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgeworCQkJCXJldHVybiBhZGFwdGVyOworCQkJfQorCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKKwkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9IGFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisKKwkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKKwkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGRpc3Bvc2VzIGFsbCBvZiB0aGUgaXRlbSBwcm92aWRlcnMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkuIAorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWlmIChkdWJsaW5Db3JlSXRlbVByb3ZpZGVyICE9IG51bGwpIGR1YmxpbkNvcmVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoaWRlbnRpZmlhYmxlRmlsdGVySXRlbVByb3ZpZGVyICE9IG51bGwpIGlkZW50aWZpYWJsZUZpbHRlckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChkb3VibGVWYWx1ZUxpc3RJdGVtUHJvdmlkZXIgIT0gbnVsbCkgZG91YmxlVmFsdWVMaXN0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKGRvdWJsZVZhbHVlTWF0cml4SXRlbVByb3ZpZGVyICE9IG51bGwpIGRvdWJsZVZhbHVlTWF0cml4SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKGRvdWJsZVZhbHVlSXRlbVByb3ZpZGVyICE9IG51bGwpIGRvdWJsZVZhbHVlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKHN0cmluZ1ZhbHVlTGlzdEl0ZW1Qcm92aWRlciAhPSBudWxsKSBzdHJpbmdWYWx1ZUxpc3RJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoc3RyaW5nVmFsdWVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgc3RyaW5nVmFsdWVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Byb3ZpZGVyL0NvcmVFZGl0UGx1Z2luLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJvdmlkZXIvQ29yZUVkaXRQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDIzYWFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Byb3ZpZGVyL0NvcmVFZGl0UGx1Z2luLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlcjsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5FTUZQbHVnaW47CisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuRWNsaXBzZVVJUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUVkaXRQbHVnaW47CisKKy8qKgorICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBDb3JlIGVkaXQgcGx1Z2luLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29yZUVkaXRQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4geworCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvcmVFZGl0UGx1Z2luIElOU1RBTkNFID0gbmV3IENvcmVFZGl0UGx1Z2luKCk7CisKKwkvKioKKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gcGx1Z2luOworCisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIENvcmVFZGl0UGx1Z2luKCkgeworCQlzdXBlcgorCQkgIChuZXcgUmVzb3VyY2VMb2NhdG9yIFtdIHsKKwkJICAgIC8vIEVjb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJICAgfSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOworCisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgorCQkJLy8KKwkJCXBsdWdpbiA9IHRoaXM7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9wcm92aWRlci9Eb3VibGVWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Byb3ZpZGVyL0RvdWJsZVZhbHVlSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxMTYwMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9wcm92aWRlci9Eb3VibGVWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTkwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZX0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRG91YmxlVmFsdWVJdGVtUHJvdmlkZXIKKwlleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERvdWJsZVZhbHVlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZElkZW50aWZpZXJQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZGVudGlmaWVyIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkSWRlbnRpZmllclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0RvdWJsZVZhbHVlX2lkZW50aWZpZXJfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRG91YmxlVmFsdWVfaWRlbnRpZmllcl9mZWF0dXJlIiwgIl9VSV9Eb3VibGVWYWx1ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRE9VQkxFX1ZBTFVFX19JREVOVElGSUVSLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYWx1ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRG91YmxlVmFsdWVfdmFsdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRG91YmxlVmFsdWVfdmFsdWVfZmVhdHVyZSIsICJfVUlfRG91YmxlVmFsdWVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkRPVUJMRV9WQUxVRV9fVkFMVUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIERvdWJsZVZhbHVlLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9jdXN0b21vYmoxNi9Eb3VibGVWYWx1ZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKERvdWJsZVZhbHVlKW9iamVjdCkuZ2V0VmFsdWUoKSsiICgiKygoRG91YmxlVmFsdWUpb2JqZWN0KS5nZXRJZGVudGlmaWVyKCkrIikiOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0RvdWJsZVZhbHVlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEb3VibGVWYWx1ZS5jbGFzcykpIHsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfX0lERU5USUZJRVI6CisJCQljYXNlIENvbW1vblBhY2thZ2UuRE9VQkxFX1ZBTFVFX19WQUxVRToKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJvdmlkZXIvRG91YmxlVmFsdWVMaXN0SXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJvdmlkZXIvRG91YmxlVmFsdWVMaXN0SXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQyNGNiNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9wcm92aWRlci9Eb3VibGVWYWx1ZUxpc3RJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIxMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZUxpc3Q7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlTGlzdH0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRG91YmxlVmFsdWVMaXN0SXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEb3VibGVWYWx1ZUxpc3RJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkSWRlbnRpZmllclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWRlbnRpZmllciBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZElkZW50aWZpZXJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Eb3VibGVWYWx1ZUxpc3RfaWRlbnRpZmllcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Eb3VibGVWYWx1ZUxpc3RfaWRlbnRpZmllcl9mZWF0dXJlIiwgIl9VSV9Eb3VibGVWYWx1ZUxpc3RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkRPVUJMRV9WQUxVRV9MSVNUX19JREVOVElGSUVSLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRE9VQkxFX1ZBTFVFX0xJU1RfX1ZBTFVFUyk7CisJCX0KKwkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7CisJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKKwkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgorCisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIERvdWJsZVZhbHVlTGlzdC5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvY3VzdG9tb2JqMTYvTGlzdC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSBudWxsOworCQlpZigoKERvdWJsZVZhbHVlTGlzdClvYmplY3QpLmVDb250YWluaW5nRmVhdHVyZSgpLmdldEZlYXR1cmVJRCgpID09IAorCQkJQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfTUFUUklYX19WQUxVRV9MSVNUUykgbGFiZWwgPSAoKERvdWJsZVZhbHVlTGlzdClvYmplY3QpLmdldElkZW50aWZpZXIoKTsKKwkJZWxzZQorCQkJbGFiZWwgPSAoKERvdWJsZVZhbHVlTGlzdClvYmplY3QpLmVDb250YWluaW5nRmVhdHVyZSgpLmdldE5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9Eb3VibGVWYWx1ZUxpc3RfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERvdWJsZVZhbHVlTGlzdC5jbGFzcykpIHsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfTElTVF9fSURFTlRJRklFUjoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRPVUJMRV9WQUxVRV9MSVNUX19WQUxVRVM6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRE9VQkxFX1ZBTFVFX0xJU1RfX1ZBTFVFUywKKwkJCQkgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG91YmxlVmFsdWUoKSkpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJvdmlkZXIvRG91YmxlVmFsdWVNYXRyaXhJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9wcm92aWRlci9Eb3VibGVWYWx1ZU1hdHJpeEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZTQxN2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJvdmlkZXIvRG91YmxlVmFsdWVNYXRyaXhJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlTWF0cml4OworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZU1hdHJpeH0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRG91YmxlVmFsdWVNYXRyaXhJdGVtUHJvdmlkZXIKKwlleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERvdWJsZVZhbHVlTWF0cml4SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOworCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoQ29tbW9uUGFja2FnZS5MaXRlcmFscy5ET1VCTEVfVkFMVUVfTUFUUklYX19WQUxVRV9MSVNUUyk7CisJCX0KKwkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7CisJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKKwkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgorCisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIERvdWJsZVZhbHVlTWF0cml4LmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9jdXN0b21vYmoxNi9NYXRyaXguZ2lmIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChEb3VibGVWYWx1ZU1hdHJpeClvYmplY3QpLmVDb250YWluaW5nRmVhdHVyZSgpLmdldE5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9Eb3VibGVWYWx1ZU1hdHJpeF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRG91YmxlVmFsdWVNYXRyaXguY2xhc3MpKSB7CisJCQljYXNlIENvbW1vblBhY2thZ2UuRE9VQkxFX1ZBTFVFX01BVFJJWF9fVkFMVUVfTElTVFM6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRE9VQkxFX1ZBTFVFX01BVFJJWF9fVkFMVUVfTElTVFMsCisJCQkJIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURvdWJsZVZhbHVlTGlzdCgpKSk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBDb3JlRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9wcm92aWRlci9EdWJsaW5Db3JlSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJvdmlkZXIvRHVibGluQ29yZUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MzBkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJvdmlkZXIvRHVibGluQ29yZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNjY2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZX0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRHVibGluQ29yZUl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEdWJsaW5Db3JlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZFRpdGxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRJZGVudGlmaWVyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkQ3JlYXRvclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkRGF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkRm9ybWF0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRQdWJsaXNoZXJQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZENvdmVyYWdlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRDb250cmlidXRvclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkUmVsYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFJpZ2h0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkU291cmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRTdWJqZWN0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRMYW5ndWFnZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkQmlibGlvZ3JhcGhpY0NpdGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRDcmVhdGVkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRMaWNlbnNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRSZXF1aXJlZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkU3BhdGlhbFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkVmFsaWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRpdGxlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkVGl0bGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9EdWJsaW5Db3JlX3RpdGxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0R1YmxpbkNvcmVfdGl0bGVfZmVhdHVyZSIsICJfVUlfRHVibGluQ29yZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRFVCTElOX0NPUkVfX1RJVExFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDcmVhdG9yIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQ3JlYXRvclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0R1YmxpbkNvcmVfY3JlYXRvcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EdWJsaW5Db3JlX2NyZWF0b3JfZmVhdHVyZSIsICJfVUlfRHVibGluQ29yZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRFVCTElOX0NPUkVfX0NSRUFUT1IsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN1YmplY3QgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTdWJqZWN0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRHVibGluQ29yZV9zdWJqZWN0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0R1YmxpbkNvcmVfc3ViamVjdF9mZWF0dXJlIiwgIl9VSV9EdWJsaW5Db3JlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgQ29tbW9uUGFja2FnZS5MaXRlcmFscy5EVUJMSU5fQ09SRV9fU1VCSkVDVCwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0R1YmxpbkNvcmVfZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRHVibGluQ29yZV9kZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9EdWJsaW5Db3JlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgQ29tbW9uUGFja2FnZS5MaXRlcmFscy5EVUJMSU5fQ09SRV9fREVTQ1JJUFRJT04sCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFB1Ymxpc2hlciBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFB1Ymxpc2hlclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0R1YmxpbkNvcmVfcHVibGlzaGVyX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0R1YmxpbkNvcmVfcHVibGlzaGVyX2ZlYXR1cmUiLCAiX1VJX0R1YmxpbkNvcmVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkRVQkxJTl9DT1JFX19QVUJMSVNIRVIsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbnRyaWJ1dG9yIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQ29udHJpYnV0b3JQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9EdWJsaW5Db3JlX2NvbnRyaWJ1dG9yX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0R1YmxpbkNvcmVfY29udHJpYnV0b3JfZmVhdHVyZSIsICJfVUlfRHVibGluQ29yZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRFVCTElOX0NPUkVfX0NPTlRSSUJVVE9SLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEYXRlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkRGF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0R1YmxpbkNvcmVfZGF0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EdWJsaW5Db3JlX2RhdGVfZmVhdHVyZSIsICJfVUlfRHVibGluQ29yZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRFVCTElOX0NPUkVfX0RBVEUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRHVibGluQ29yZV90eXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0R1YmxpbkNvcmVfdHlwZV9mZWF0dXJlIiwgIl9VSV9EdWJsaW5Db3JlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgQ29tbW9uUGFja2FnZS5MaXRlcmFscy5EVUJMSU5fQ09SRV9fVFlQRSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEZvcm1hdCBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEZvcm1hdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0R1YmxpbkNvcmVfZm9ybWF0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0R1YmxpbkNvcmVfZm9ybWF0X2ZlYXR1cmUiLCAiX1VJX0R1YmxpbkNvcmVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkRVQkxJTl9DT1JFX19GT1JNQVQsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZGVudGlmaWVyIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkSWRlbnRpZmllclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0R1YmxpbkNvcmVfaWRlbnRpZmllcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EdWJsaW5Db3JlX2lkZW50aWZpZXJfZmVhdHVyZSIsICJfVUlfRHVibGluQ29yZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRFVCTElOX0NPUkVfX0lERU5USUZJRVIsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTb3VyY2UgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTb3VyY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9EdWJsaW5Db3JlX3NvdXJjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EdWJsaW5Db3JlX3NvdXJjZV9mZWF0dXJlIiwgIl9VSV9EdWJsaW5Db3JlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgQ29tbW9uUGFja2FnZS5MaXRlcmFscy5EVUJMSU5fQ09SRV9fU09VUkNFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMYW5ndWFnZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZExhbmd1YWdlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRHVibGluQ29yZV9sYW5ndWFnZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EdWJsaW5Db3JlX2xhbmd1YWdlX2ZlYXR1cmUiLCAiX1VJX0R1YmxpbkNvcmVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkRVQkxJTl9DT1JFX19MQU5HVUFHRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVsYXRpb24gZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRSZWxhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0R1YmxpbkNvcmVfcmVsYXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRHVibGluQ29yZV9yZWxhdGlvbl9mZWF0dXJlIiwgIl9VSV9EdWJsaW5Db3JlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgQ29tbW9uUGFja2FnZS5MaXRlcmFscy5EVUJMSU5fQ09SRV9fUkVMQVRJT04sCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvdmVyYWdlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQ292ZXJhZ2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9EdWJsaW5Db3JlX2NvdmVyYWdlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0R1YmxpbkNvcmVfY292ZXJhZ2VfZmVhdHVyZSIsICJfVUlfRHVibGluQ29yZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRFVCTElOX0NPUkVfX0NPVkVSQUdFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSaWdodHMgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRSaWdodHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9EdWJsaW5Db3JlX3JpZ2h0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EdWJsaW5Db3JlX3JpZ2h0c19mZWF0dXJlIiwgIl9VSV9EdWJsaW5Db3JlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgQ29tbW9uUGFja2FnZS5MaXRlcmFscy5EVUJMSU5fQ09SRV9fUklHSFRTLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCaWJsaW9ncmFwaGljIENpdGF0aW9uIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQmlibGlvZ3JhcGhpY0NpdGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRHVibGluQ29yZV9iaWJsaW9ncmFwaGljQ2l0YXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRHVibGluQ29yZV9iaWJsaW9ncmFwaGljQ2l0YXRpb25fZmVhdHVyZSIsICJfVUlfRHVibGluQ29yZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRFVCTElOX0NPUkVfX0JJQkxJT0dSQVBISUNfQ0lUQVRJT04sCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENyZWF0ZWQgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDcmVhdGVkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRHVibGluQ29yZV9jcmVhdGVkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0R1YmxpbkNvcmVfY3JlYXRlZF9mZWF0dXJlIiwgIl9VSV9EdWJsaW5Db3JlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgQ29tbW9uUGFja2FnZS5MaXRlcmFscy5EVUJMSU5fQ09SRV9fQ1JFQVRFRCwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTGljZW5zZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZExpY2Vuc2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9EdWJsaW5Db3JlX2xpY2Vuc2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRHVibGluQ29yZV9saWNlbnNlX2ZlYXR1cmUiLCAiX1VJX0R1YmxpbkNvcmVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkRVQkxJTl9DT1JFX19MSUNFTlNFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZXF1aXJlZCBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFJlcXVpcmVkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRHVibGluQ29yZV9yZXF1aXJlZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EdWJsaW5Db3JlX3JlcXVpcmVkX2ZlYXR1cmUiLCAiX1VJX0R1YmxpbkNvcmVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkRVQkxJTl9DT1JFX19SRVFVSVJFRCwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3BhdGlhbCBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFNwYXRpYWxQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9EdWJsaW5Db3JlX3NwYXRpYWxfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRHVibGluQ29yZV9zcGF0aWFsX2ZlYXR1cmUiLCAiX1VJX0R1YmxpbkNvcmVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkRVQkxJTl9DT1JFX19TUEFUSUFMLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYWxpZCBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0R1YmxpbkNvcmVfdmFsaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIC8vZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EdWJsaW5Db3JlX3ZhbGlkX2ZlYXR1cmUiLCAiX1VJX0R1YmxpbkNvcmVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9EQ19WYWxpZF9EZXNjIiksIC8vJE5PTi1OTFMtMSQgCisJCQkJIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRFVCTElOX0NPUkVfX1ZBTElELAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0gLy8gYWRkVmFsaWRQcm9wZXJ0eURlc2NyaXB0b3IKKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYWxpZCBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFZhbGlkUHJvcGVydHlEZXNjcmlwdG9yR2VuKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRHVibGluQ29yZV92YWxpZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EdWJsaW5Db3JlX3ZhbGlkX2ZlYXR1cmUiLCAiX1VJX0R1YmxpbkNvcmVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkRVQkxJTl9DT1JFX19WQUxJRCwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisJCisJLyoqCisJICogVGhpcyByZXR1cm5zIER1YmxpbkNvcmUuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbW9iajE2L0R1YmxpbkNvcmUiKSk7CisJfSAvLyBnZXRJbWFnZQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKER1YmxpbkNvcmUpb2JqZWN0KS5nZXRUaXRsZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0R1YmxpbkNvcmVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfRHVibGluQ29yZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRHVibGluQ29yZS5jbGFzcykpIHsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fVElUTEU6CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX0lERU5USUZJRVI6CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX0RFU0NSSVBUSU9OOgorCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19DUkVBVE9SOgorCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19EQVRFOgorCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19GT1JNQVQ6CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1BVQkxJU0hFUjoKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQ09WRVJBR0U6CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX0NPTlRSSUJVVE9SOgorCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19SRUxBVElPTjoKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fUklHSFRTOgorCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19TT1VSQ0U6CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1NVQkpFQ1Q6CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1RZUEU6CisJCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX0xBTkdVQUdFOgorCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19CSUJMSU9HUkFQSElDX0NJVEFUSU9OOgorCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19DUkVBVEVEOgorCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19MSUNFTlNFOgorCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19SRVFVSVJFRDoKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fU1BBVElBTDoKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fVkFMSUQ6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIENvcmVFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Byb3ZpZGVyL0lkZW50aWZpYWJsZUZpbHRlckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Byb3ZpZGVyL0lkZW50aWZpYWJsZUZpbHRlckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ODY0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJvdmlkZXIvSWRlbnRpZmlhYmxlRmlsdGVySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlcjsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZUZpbHRlcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgSWRlbnRpZmlhYmxlRmlsdGVySXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGVGaWx0ZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgSWRlbnRpZmlhYmxlRmlsdGVyLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0lkZW50aWZpYWJsZUZpbHRlciIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIGdldFN0cmluZygiX1VJX0lkZW50aWZpYWJsZUZpbHRlcl90eXBlIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIENvcmVFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Byb3ZpZGVyL0lkZW50aWZpYWJsZUl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Byb3ZpZGVyL0lkZW50aWZpYWJsZUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MmM0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJvdmlkZXIvSWRlbnRpZmlhYmxlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyNjkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKKworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGV9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIElkZW50aWZpYWJsZUl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisJCQkvL2dldFByb3BlcnR5RGVzY3JpcHRvcnNHZW4ob2JqZWN0KTsKKwkJCWFkZER1YmxpbkNvcmVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfSAvLyBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzCisJCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisvLwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9yc0dlbihPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZFVSSVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkVHlwZVVSSVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKKwkgKiBUaGlzIGFkZHMgdGhlIER1YmxpbiBDb3JlIG9mIHRoZSBJZGVudGlmaWFibGUgYXMgYSBwcm9wZXJ0eQorCSAqIGNhdGVnb3J5IG9mIGFsbCBJZGVudGlmaWFibGVzLiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZER1YmxpbkNvcmVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gKChJZGVudGlmaWFibGUpIG9iamVjdCkuZ2V0RHVibGluQ29yZSgpOworCisJCWZpbmFsIEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQorCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKKworCQlmaW5hbCBEdWJsaW5Db3JlSXRlbVByb3ZpZGVyIGRjSXRlbVByb3ZpZGVyID0gKER1YmxpbkNvcmVJdGVtUHJvdmlkZXIpIChmYWN0b3J5CisJCQkJLmFkYXB0KGRjLCBJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKSk7CisKKwkJZmluYWwgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZGNEZXNjcmlwdG9ycyA9IGRjSXRlbVByb3ZpZGVyCisJCQkJLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoZGMpOworCisJCWZvciAoSXRlcmF0b3I8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGl0ZXIgPSBkY0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworCQkJZmluYWwgSXRlbVByb3BlcnR5RGVzY3JpcHRvciBkY0Rlc2NyaXB0b3IgPSAoSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgaXRlcgorCQkJCQkubmV4dCgpOworCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yRGVjb3JhdG9yKAorCQkJCQlkYywgZGNEZXNjcmlwdG9yKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeShPYmplY3QgdGhpc09iamVjdCkgeworCQkJCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfSWRlbnRpZmlhYmxlX2R1YmxpbkNvcmVfZmVhdHVyZSIpOworCQkJCX0KKwkJCX0pOworCQl9IC8vIGZvciBlYWNoIGlkRGVzY3JpcHRvcgorCX0gLy8gYWRkRHVibGluQ29yZVByb3BlcnR5RGVzY3JpcHRvcmNyaXB0b3IKKwkKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVVJJIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkVVJJUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfSWRlbnRpZmlhYmxlX3VSSV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JZGVudGlmaWFibGVfdVJJX2ZlYXR1cmUiLCAiX1VJX0lkZW50aWZpYWJsZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuSURFTlRJRklBQkxFX19VUkksCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgVVJJIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkVHlwZVVSSVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0lkZW50aWZpYWJsZV90eXBlVVJJX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lkZW50aWZpYWJsZV90eXBlVVJJX2ZlYXR1cmUiLCAiX1VJX0lkZW50aWZpYWJsZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuSURFTlRJRklBQkxFX19UWVBFX1VSSSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIElkZW50aWZpYWJsZS5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9JZGVudGlmaWFibGUiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQkKKwkJcmV0dXJuICgoSWRlbnRpZmlhYmxlKW9iamVjdCkuZ2V0VVJJKCkubGFzdFNlZ21lbnQoKTsKKy8qCQlDb21tZW50ZWQgb3V0IFNFRCA0LzE0LzEwLiBBbHdheXMgdXNlIGxhc3QgcGFydCBvZiBVUkkKKyAqICAgICAgLy8gVXNlIHRoZSBkdWJsaW4gY29yZSB0aXRsZSBpZiBpdCdzIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZQorCQkvLyB0aGUgVVJJCisJCWZpbmFsIElkZW50aWZpYWJsZSBpZGVudGlmaWFibGUgPSAoSWRlbnRpZmlhYmxlKW9iamVjdDsKKwkJCisJCWZpbmFsIFN0cmluZyB0aXRsZSA9IGlkZW50aWZpYWJsZS5nZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKTsKKwkJLy8gV2FzIGEgdGl0bGUgc3BlY2lmaWVkPworCQlpZiAodGl0bGUgIT0gbnVsbCAmJiAhdGl0bGUuZXF1YWxzKCIiKSkgeworCQkJLy8gWWVzCisJCQlyZXR1cm4gdGl0bGU7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gaWRlbnRpZmlhYmxlLmdldFVSSSgpLnRvU3RyaW5nKCk7CisJCX0KKwkJKi8KKwl9IC8vIGdldFRleHQKKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisvLwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlVUkkgbGFiZWxWYWx1ZSA9ICgoSWRlbnRpZmlhYmxlKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfSWRlbnRpZmlhYmxlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX0lkZW50aWZpYWJsZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCQorCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElkZW50aWZpYWJsZS5jbGFzcykpIHsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX1VSSToKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX1RZUEVfVVJJOgorCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9fRFVCTElOX0NPUkU6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIENvcmVFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Byb3ZpZGVyL1N0cmluZ1ZhbHVlSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJvdmlkZXIvU3RyaW5nVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWEwODcxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Byb3ZpZGVyL1N0cmluZ1ZhbHVlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNjUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlN0cmluZ1ZhbHVlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZX0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RyaW5nVmFsdWVJdGVtUHJvdmlkZXIKKwlleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZ1ZhbHVlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYWx1ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU3RyaW5nVmFsdWVfdmFsdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU3RyaW5nVmFsdWVfdmFsdWVfZmVhdHVyZSIsICJfVUlfU3RyaW5nVmFsdWVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBDb21tb25QYWNrYWdlLkxpdGVyYWxzLlNUUklOR19WQUxVRV9fVkFMVUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFN0cmluZ1ZhbHVlLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1N0cmluZ1ZhbHVlIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChTdHJpbmdWYWx1ZSlvYmplY3QpLmdldFZhbHVlKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfU3RyaW5nVmFsdWVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFN0cmluZ1ZhbHVlLmNsYXNzKSkgeworCQkJY2FzZSBDb21tb25QYWNrYWdlLlNUUklOR19WQUxVRV9fVkFMVUU6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIENvcmVFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Byb3ZpZGVyL1N0cmluZ1ZhbHVlTGlzdEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Byb3ZpZGVyL1N0cmluZ1ZhbHVlTGlzdEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNjhjYzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJvdmlkZXIvU3RyaW5nVmFsdWVMaXN0SXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNzggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZUxpc3Q7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlN0cmluZ1ZhbHVlTGlzdH0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RyaW5nVmFsdWVMaXN0SXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmdWYWx1ZUxpc3RJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7CisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21tb25QYWNrYWdlLkxpdGVyYWxzLlNUUklOR19WQUxVRV9MSVNUX19WQUxVRVMpOworCQl9CisJCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgeworCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCisJCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KKworCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBTdHJpbmdWYWx1ZUxpc3QuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbW9iajE2L0xpc3QuZ2lmIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChTdHJpbmdWYWx1ZUxpc3Qpb2JqZWN0KS5lQ29udGFpbmluZ0ZlYXR1cmUoKS5nZXROYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfU3RyaW5nVmFsdWVMaXN0X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTdHJpbmdWYWx1ZUxpc3QuY2xhc3MpKSB7CisJCQljYXNlIENvbW1vblBhY2thZ2UuU1RSSU5HX1ZBTFVFX0xJU1RfX1ZBTFVFUzoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoQ29tbW9uUGFja2FnZS5MaXRlcmFscy5TVFJJTkdfVkFMVUVfTElTVF9fVkFMVUVTLAorCQkJCSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdHJpbmdWYWx1ZSgpKSk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBDb3JlRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi91dGlsL0NvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vdXRpbC9Db21tb25BZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzY2VmZGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vdXRpbC9Db21tb25BZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzAxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24udXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWVNYXRyaXg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU3RyaW5nVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLio7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENvbW1vbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBDb21tb25QYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29tbW9uQWRhcHRlckZhY3RvcnkoKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgeworCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBUaGUgc3dpdGNoIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbW1vblN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9CisJCW5ldyBDb21tb25Td2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEdWJsaW5Db3JlKER1YmxpbkNvcmUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUR1YmxpbkNvcmVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVJZGVudGlmaWFibGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyA8VD4gQWRhcHRlciBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlRmlsdGVyKElkZW50aWZpYWJsZUZpbHRlciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlSWRlbnRpZmlhYmxlRmlsdGVyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRG91YmxlVmFsdWVMaXN0KERvdWJsZVZhbHVlTGlzdCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRG91YmxlVmFsdWVMaXN0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRG91YmxlVmFsdWVNYXRyaXgoRG91YmxlVmFsdWVNYXRyaXggb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZURvdWJsZVZhbHVlTWF0cml4QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRG91YmxlVmFsdWUoRG91YmxlVmFsdWUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZURvdWJsZVZhbHVlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3RyaW5nVmFsdWVMaXN0KFN0cmluZ1ZhbHVlTGlzdCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU3RyaW5nVmFsdWVMaXN0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3RyaW5nVmFsdWUoU3RyaW5nVmFsdWUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0cmluZ1ZhbHVlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTW9kaWZpYWJsZShNb2RpZmlhYmxlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVNb2RpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworCQkJfQorCQl9OworCisJLyoqCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSA8ZW0+RHVibGluIENvcmU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUR1YmxpbkNvcmVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlIDxlbT5JZGVudGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLmxhbmcuQ29tcGFyYWJsZSA8ZW0+Q29tcGFyYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZUZpbHRlciA8ZW0+SWRlbnRpZmlhYmxlIEZpbHRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZUZpbHRlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJZGVudGlmaWFibGVGaWx0ZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWVMaXN0IDxlbT5Eb3VibGUgVmFsdWUgTGlzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlTGlzdAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb3VibGVWYWx1ZUxpc3RBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWVNYXRyaXggPGVtPkRvdWJsZSBWYWx1ZSBNYXRyaXg8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZU1hdHJpeAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb3VibGVWYWx1ZU1hdHJpeEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZSA8ZW0+RG91YmxlIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRG91YmxlVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU3RyaW5nVmFsdWVMaXN0IDxlbT5TdHJpbmcgVmFsdWUgTGlzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlN0cmluZ1ZhbHVlTGlzdAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdHJpbmdWYWx1ZUxpc3RBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU3RyaW5nVmFsdWUgPGVtPlN0cmluZyBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlN0cmluZ1ZhbHVlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0cmluZ1ZhbHVlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZSA8ZW0+TW9kaWZpYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2RpZmlhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL0NvbW1vbkFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vdXRpbC9Db21tb25Td2l0Y2guamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi91dGlsL0NvbW1vblN3aXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NjA4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vdXRpbC9Db21tb25Td2l0Y2guamF2YQpAQCAtMCwwICsxLDMyNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnV0aWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZU1hdHJpeDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGVGaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlN0cmluZ1ZhbHVlTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uKjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KKyAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KKyAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKKyAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0CisgKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5CisgKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKKyAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENvbW1vblN3aXRjaDxUMT4geworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgQ29tbW9uUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbW1vblN3aXRjaCgpIHsKKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7CisJCQltb2RlbFBhY2thZ2UgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7CisJCX0KKwkJZWxzZSB7CisJCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKKwkJCXJldHVybgorCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/CisJCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKKwkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQxIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgeworCQkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFOiB7CisJCQkJRHVibGluQ29yZSBkdWJsaW5Db3JlID0gKER1YmxpbkNvcmUpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlRHVibGluQ29yZShkdWJsaW5Db3JlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFOiB7CisJCQkJSWRlbnRpZmlhYmxlIGlkZW50aWZpYWJsZSA9IChJZGVudGlmaWFibGUpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKGlkZW50aWZpYWJsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShpZGVudGlmaWFibGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRklMVEVSOiB7CisJCQkJSWRlbnRpZmlhYmxlRmlsdGVyIGlkZW50aWZpYWJsZUZpbHRlciA9IChJZGVudGlmaWFibGVGaWx0ZXIpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlRmlsdGVyKGlkZW50aWZpYWJsZUZpbHRlcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBDb21tb25QYWNrYWdlLkRPVUJMRV9WQUxVRV9MSVNUOiB7CisJCQkJRG91YmxlVmFsdWVMaXN0IGRvdWJsZVZhbHVlTGlzdCA9IChEb3VibGVWYWx1ZUxpc3QpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlRG91YmxlVmFsdWVMaXN0KGRvdWJsZVZhbHVlTGlzdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBDb21tb25QYWNrYWdlLkRPVUJMRV9WQUxVRV9NQVRSSVg6IHsKKwkJCQlEb3VibGVWYWx1ZU1hdHJpeCBkb3VibGVWYWx1ZU1hdHJpeCA9IChEb3VibGVWYWx1ZU1hdHJpeCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VEb3VibGVWYWx1ZU1hdHJpeChkb3VibGVWYWx1ZU1hdHJpeCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBDb21tb25QYWNrYWdlLkRPVUJMRV9WQUxVRTogeworCQkJCURvdWJsZVZhbHVlIGRvdWJsZVZhbHVlID0gKERvdWJsZVZhbHVlKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZURvdWJsZVZhbHVlKGRvdWJsZVZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKGRvdWJsZVZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIENvbW1vblBhY2thZ2UuU1RSSU5HX1ZBTFVFX0xJU1Q6IHsKKwkJCQlTdHJpbmdWYWx1ZUxpc3Qgc3RyaW5nVmFsdWVMaXN0ID0gKFN0cmluZ1ZhbHVlTGlzdCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VTdHJpbmdWYWx1ZUxpc3Qoc3RyaW5nVmFsdWVMaXN0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIENvbW1vblBhY2thZ2UuU1RSSU5HX1ZBTFVFOiB7CisJCQkJU3RyaW5nVmFsdWUgc3RyaW5nVmFsdWUgPSAoU3RyaW5nVmFsdWUpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU3RyaW5nVmFsdWUoc3RyaW5nVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUoc3RyaW5nVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkR1YmxpbiBDb3JlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RHVibGluIENvcmU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRHVibGluQ29yZShEdWJsaW5Db3JlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyA8VD4gVDEgY2FzZUNvbXBhcmFibGUoQ29tcGFyYWJsZTxUPiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlIEZpbHRlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZSBGaWx0ZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlSWRlbnRpZmlhYmxlRmlsdGVyKElkZW50aWZpYWJsZUZpbHRlciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG91YmxlIFZhbHVlIExpc3Q8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb3VibGUgVmFsdWUgTGlzdDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VEb3VibGVWYWx1ZUxpc3QoRG91YmxlVmFsdWVMaXN0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb3VibGUgVmFsdWUgTWF0cml4PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG91YmxlIFZhbHVlIE1hdHJpeDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VEb3VibGVWYWx1ZU1hdHJpeChEb3VibGVWYWx1ZU1hdHJpeCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG91YmxlIFZhbHVlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG91YmxlIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZURvdWJsZVZhbHVlKERvdWJsZVZhbHVlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdHJpbmcgVmFsdWUgTGlzdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0cmluZyBWYWx1ZSBMaXN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVN0cmluZ1ZhbHVlTGlzdChTdHJpbmdWYWx1ZUxpc3Qgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0cmluZyBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0cmluZyBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTdHJpbmdWYWx1ZShTdHJpbmdWYWx1ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kaWZpYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZGlmaWFibGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTW9kaWZpYWJsZShNb2RpZmlhYmxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9Db21tb25Td2l0Y2gKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQvRXhwZXJpbWVudC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZXhwZXJpbWVudC9FeHBlcmltZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2YzUwNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQvRXhwZXJpbWVudC5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8vIEV4cGVyaW1lbnQuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvOworCisvKioKKyAqIEFuIHtAbGluayBFeHBlcmltZW50fSBpcyBhIHNwZWNpZmljYXRpb24gb2YgaG93IHRvIG1vZGlmeSBhICJiYXNlIgorICoge0BsaW5rIFNjZW5hcmlvfSB0byBjcmVhdGUgb25lIG9yIG1vcmUgImRlcml2ZWQiIHtAbGluayBTY2VuYXJpb31zLiBUaGUKKyAqIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBhbGxvdyBmb3IgdGhlIGRlZmluaXRpb24gb2YgYSByZWxhdGVkIHNwZWN0cnVtIG9mCisgKiB7QGxpbmsgU2NlbmFyaW99cyB0aGF0IGhhdmUgc2xpZ2h0bHkgKG9yIGRyYW1hdGljYWxseSkgZGlmZmVyZW50CisgKiBjb25maWd1cmF0aW9ucy4gVGhlIGludGVudCBpcyB0byBlbmFibGUgdGhlIGV4cGxvcmF0aW9uIG9mIHRoZSBlZmZlY3QKKyAqIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucyBoYXZlIG9uIHRoZSBvdXRjb21lIG9mIHRoZSB7QGxpbmsgU2NlbmFyaW99LgorICogPHA+CisgKiBBbiB7QGxpbmsgRXhwZXJpbWVudH0gY29uc2lzdHMgb2YgYSBoaWVyYXJjaGljYWwgb3JnYW5pemF0aW9uIG9mCisgKiB7QGxpbmsgTW9kaWZpZXJ9cyBhbmQgb3RoZXIge0BsaW5rIEV4cGVyaW1lbnR9cy4KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXhwZXJpbWVudCBleHRlbmRzIElkZW50aWZpYWJsZSB7CisKKwlTdHJpbmcgVVJJX1RZUEVfRVhQRVJJTUVOVF9TRUdNRU5UID0gImV4cGVyaW1lbnQiOworCisJLyoqCisJICogQHJldHVybiB0aGUge0BsaW5rIFNjZW5hcmlvfSB0aGF0IHdpbGwgYmUgbW9kaWZpZWQgZHVyaW5nIHRoZSBleHBlcmltZW50LgorCSAqIEBtb2RlbCBjb250YWlubWVudD0iZmFsc2UiCisJICovCisJU2NlbmFyaW8gZ2V0U2NlbmFyaW8oKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50I2dldFNjZW5hcmlvIDxlbT5TY2VuYXJpbzwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NlbmFyaW88L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFNjZW5hcmlvKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTY2VuYXJpbyhTY2VuYXJpbyB2YWx1ZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgTW9kaWZpZXJ9cyB0aGF0IHNwZWNpZnkgdGhlIGNoYW5nZXMgdG8gdGhlCisJICogICAgICAgICB7QGxpbmsgU2NlbmFyaW99LgorCSAqIEBtb2RlbCBjb250YWlubWVudD0iZmFsc2UiCisJICovCisJRUxpc3Q8TW9kaWZpZXI+IGdldE1vZGlmaWVycygpOworCisJLyoqCisJICogQHJldHVybiB0aGUge0BsaW5rIEV4cGVyaW1lbnR9J3Mge0BsaW5rIFNjZW5hcmlvfSBtb2RpZmllZCBieSB0aGUKKwkgKiAgICAgICAgIHtAbGluayBFeHBlcmltZW50fSdzIGNvbGxlY3Rpb24gb2Yge0BsaW5rIE1vZGlmaWVyfXMKKwkgKiAgICAgICAgIEBzZWUgI2lzQ29tcGxldGUoKQorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwlTY2VuYXJpbyB1cGRhdGVTY2VuYXJpbygpOworCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCVNjZW5hcmlvIGluaXRTY2VuYXJpbygpOworCisJLyoqCisJICogQHJldHVybiBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgU3RyaW5nfXMgdGhhdCBzdW1tYXJpemUgdGhlCisJICogICAgICAgICBtb2RpZmljYXRpb25zIG1hZGUgZHVyaW5nIHRoZSBsYXN0IGNhbGwgdG8KKwkgKiAgICAgICAgIHtAbGluayAjZ2V0TmV4dFNjZW5hcmlvKCl9LgorCSAqIG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCUxpc3Q8U3RyaW5nPiBnZXRNb2RpZmljYXRpb25TdW1tYXJ5KCk7CisJCisJLyoqCisJICogQHJldHVybiBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgU3RyaW5nfXMgdGhhdCBzdW1tYXJpemUgdGhlIHZhbHVlcyBvZgorCSAqICAgICAgICAgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzLgorCSAqIG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCUxpc3Q8U3RyaW5nPiBnZXRQYXJhbWV0ZXJTdW1tYXJ5KCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB7QGxpbmsgRXhwZXJpbWVudH0gaXMgY29tcGxldGUsCisJICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIG90aGVyd2lzZS4KKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJYm9vbGVhbiBpc0NvbXBsZXRlKCk7Cit9IC8vIEV4cGVyaW1lbnQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQvRXhwZXJpbWVudEZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQvRXhwZXJpbWVudEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzljZjNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZXhwZXJpbWVudC9FeHBlcmltZW50RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnRQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXhwZXJpbWVudEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7CisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFeHBlcmltZW50RmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5pbXBsLkV4cGVyaW1lbnRGYWN0b3J5SW1wbC5pbml0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4cGVyaW1lbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4cGVyaW1lbnQ8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUV4cGVyaW1lbnQgY3JlYXRlRXhwZXJpbWVudCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFeHBlcmltZW50UGFja2FnZSBnZXRFeHBlcmltZW50UGFja2FnZSgpOworCit9IC8vRXhwZXJpbWVudEZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQvRXhwZXJpbWVudFBhY2thZ2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQvRXhwZXJpbWVudFBhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGM4MWNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZXhwZXJpbWVudC9FeHBlcmltZW50UGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsMjc3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEubGFuZy5TdHJpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50CisgKiA8dWw+CisgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorICogPC91bD4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50RmFjdG9yeQorICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXhwZXJpbWVudFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7CisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5BTUUgPSAiZXhwZXJpbWVudCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZXhwZXJpbWVudC5lY29yZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50IjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFeHBlcmltZW50UGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5pbXBsLkV4cGVyaW1lbnRQYWNrYWdlSW1wbC5pbml0KCk7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LmltcGwuRXhwZXJpbWVudEltcGwgPGVtPkV4cGVyaW1lbnQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5pbXBsLkV4cGVyaW1lbnRJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5pbXBsLkV4cGVyaW1lbnRQYWNrYWdlSW1wbCNnZXRFeHBlcmltZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEVYUEVSSU1FTlQgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYUEVSSU1FTlRfX1VSSSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWFBFUklNRU5UX19UWVBFX1VSSSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYUEVSSU1FTlRfX0RVQkxJTl9DT1JFID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZGlmaWVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRVhQRVJJTUVOVF9fTU9ESUZJRVJTID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWFBFUklNRU5UX19DT01QTEVURSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjZW5hcmlvPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRVhQRVJJTUVOVF9fU0NFTkFSSU8gPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FeHBlcmltZW50PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYUEVSSU1FTlRfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5VUkk8L2VtPicgZGF0YSB0eXBlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5pbXBsLkV4cGVyaW1lbnRQYWNrYWdlSW1wbCNnZXRVUkkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVVJJID0gMTsKKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudCA8ZW0+RXhwZXJpbWVudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeHBlcmltZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RXhwZXJpbWVudCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnQjZ2V0TW9kaWZpZXJzIDxlbT5Nb2RpZmllcnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk1vZGlmaWVyczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnQjZ2V0TW9kaWZpZXJzKCkKKwkgKiBAc2VlICNnZXRFeHBlcmltZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRFeHBlcmltZW50X01vZGlmaWVycygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50I2lzQ29tcGxldGUgPGVtPkNvbXBsZXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tcGxldGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50I2lzQ29tcGxldGUoKQorCSAqIEBzZWUgI2dldEV4cGVyaW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEV4cGVyaW1lbnRfQ29tcGxldGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudCNnZXRTY2VuYXJpbyA8ZW0+U2NlbmFyaW88L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TY2VuYXJpbzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnQjZ2V0U2NlbmFyaW8oKQorCSAqIEBzZWUgI2dldEV4cGVyaW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEV4cGVyaW1lbnRfU2NlbmFyaW8oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIDxlbT5VUkk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlVSSTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkKKwkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRURhdGFUeXBlIGdldFVSSSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRXhwZXJpbWVudEZhY3RvcnkgZ2V0RXhwZXJpbWVudEZhY3RvcnkoKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKwkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorCSAqIDwvdWw+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCWludGVyZmFjZSBMaXRlcmFscyB7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuaW1wbC5FeHBlcmltZW50SW1wbCA8ZW0+RXhwZXJpbWVudDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LmltcGwuRXhwZXJpbWVudEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5pbXBsLkV4cGVyaW1lbnRQYWNrYWdlSW1wbCNnZXRFeHBlcmltZW50KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIEVYUEVSSU1FTlQgPSBlSU5TVEFOQ0UuZ2V0RXhwZXJpbWVudCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TW9kaWZpZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBFWFBFUklNRU5UX19NT0RJRklFUlMgPSBlSU5TVEFOQ0UuZ2V0RXhwZXJpbWVudF9Nb2RpZmllcnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRVhQRVJJTUVOVF9fQ09NUExFVEUgPSBlSU5TVEFOQ0UuZ2V0RXhwZXJpbWVudF9Db21wbGV0ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NlbmFyaW88L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBFWFBFUklNRU5UX19TQ0VOQVJJTyA9IGVJTlNUQU5DRS5nZXRFeHBlcmltZW50X1NjZW5hcmlvKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5VUkk8L2VtPicgZGF0YSB0eXBlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuaW1wbC5FeHBlcmltZW50UGFja2FnZUltcGwjZ2V0VVJJKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRURhdGFUeXBlIFVSSSA9IGVJTlNUQU5DRS5nZXRVUkkoKTsKKworCX0KKworfSAvL0V4cGVyaW1lbnRQYWNrYWdlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9leHBlcmltZW50L2ltcGwvRXhwZXJpbWVudEZhY3RvcnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9leHBlcmltZW50L2ltcGwvRXhwZXJpbWVudEZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFhNDA5MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQvaW1wbC9FeHBlcmltZW50RmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50Lio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50UGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uIDwhLS0KKyAqIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEV4cGVyaW1lbnRGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzCisJCUV4cGVyaW1lbnRGYWN0b3J5IHsKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBFeHBlcmltZW50RmFjdG9yeSBpbml0KCkgeworCQl0cnkgeworCQkJRXhwZXJpbWVudEZhY3RvcnkgdGhlRXhwZXJpbWVudEZhY3RvcnkgPSAoRXhwZXJpbWVudEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQuZWNvcmUiKTsgLy8kTk9OLU5MUy0xJCAKKwkJCWlmICh0aGVFeHBlcmltZW50RmFjdG9yeSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoZUV4cGVyaW1lbnRGYWN0b3J5OworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IEV4cGVyaW1lbnRGYWN0b3J5SW1wbCgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4cGVyaW1lbnRGYWN0b3J5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKKwkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgRXhwZXJpbWVudFBhY2thZ2UuRVhQRVJJTUVOVDogcmV0dXJuIGNyZWF0ZUV4cGVyaW1lbnQoKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgRXhwZXJpbWVudFBhY2thZ2UuVVJJOgorCQkJCXJldHVybiBjcmVhdGVVUklGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgRXhwZXJpbWVudFBhY2thZ2UuVVJJOgorCQkJCXJldHVybiBjb252ZXJ0VVJJVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4cGVyaW1lbnQgY3JlYXRlRXhwZXJpbWVudCgpIHsKKwkJRXhwZXJpbWVudEltcGwgZXhwZXJpbWVudCA9IG5ldyBFeHBlcmltZW50SW1wbCgpOworCQlyZXR1cm4gZXhwZXJpbWVudDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBVUkkgY3JlYXRlVVJJRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCXJldHVybiBVUkkuY3JlYXRlVVJJKGluaXRpYWxWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRVUklUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXhwZXJpbWVudFBhY2thZ2UgZ2V0RXhwZXJpbWVudFBhY2thZ2UoKSB7CisJCXJldHVybiAoRXhwZXJpbWVudFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZGVwcmVjYXRlZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlARGVwcmVjYXRlZAorCXB1YmxpYyBzdGF0aWMgRXhwZXJpbWVudFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKKwkJcmV0dXJuIEV4cGVyaW1lbnRQYWNrYWdlLmVJTlNUQU5DRTsKKwl9CisKK30gLy8gRXhwZXJpbWVudEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9leHBlcmltZW50L2ltcGwvRXhwZXJpbWVudEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQvaW1wbC9FeHBlcmltZW50SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZDMwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9leHBlcmltZW50L2ltcGwvRXhwZXJpbWVudEltcGwuamF2YQpAQCAtMCwwICsxLDMzMSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLklkZW50aWZpYWJsZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50UGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhwZXJpbWVudDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuaW1wbC5FeHBlcmltZW50SW1wbCNnZXRNb2RpZmllcnMgPGVtPk1vZGlmaWVyczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuaW1wbC5FeHBlcmltZW50SW1wbCNpc0NvbXBsZXRlIDxlbT5Db21wbGV0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuaW1wbC5FeHBlcmltZW50SW1wbCNnZXRTY2VuYXJpbyA8ZW0+U2NlbmFyaW88L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFeHBlcmltZW50SW1wbCBleHRlbmRzIElkZW50aWZpYWJsZUltcGwgaW1wbGVtZW50cyBFeHBlcmltZW50IHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNb2RpZmllcnMoKSA8ZW0+TW9kaWZpZXJzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vZGlmaWVycygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PE1vZGlmaWVyPiBtb2RpZmllcnM7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDb21wbGV0ZSgpIDxlbT5Db21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNDb21wbGV0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENPTVBMRVRFX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2VuYXJpbygpIDxlbT5TY2VuYXJpbzwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2NlbmFyaW8oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTY2VuYXJpbyBzY2VuYXJpbzsKKworCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgRXhwZXJpbWVudEltcGwoKSB7CisJCXN1cGVyKCk7CisJCXNldFVSSShTVEVNVVJJLmNyZWF0ZVVSSShVUklfVFlQRV9FWFBFUklNRU5UX1NFR01FTlQgKyAiLyIKKwkJCQkrIFNURU1VUkkuZ2VuZXJhdGVVbmlxdWVQYXJ0KCkpKTsKKwkJc2V0VHlwZVVSSShTVEVNVVJJLkVYUEVSSU1FTlRfVFlQRV9VUkkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gRXhwZXJpbWVudFBhY2thZ2UuTGl0ZXJhbHMuRVhQRVJJTUVOVDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8TW9kaWZpZXI+IGdldE1vZGlmaWVycygpIHsKKwkJaWYgKG1vZGlmaWVycyA9PSBudWxsKSB7CisJCQltb2RpZmllcnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PE1vZGlmaWVyPihNb2RpZmllci5jbGFzcywgdGhpcywgRXhwZXJpbWVudFBhY2thZ2UuRVhQRVJJTUVOVF9fTU9ESUZJRVJTKTsKKwkJfQorCQlyZXR1cm4gbW9kaWZpZXJzOworCX0KKworCS8qKgorCSAqIEBzZWUge0BsaW5rIEV4cGVyaW1lbnQjZ2V0TW9kaWZpY2F0aW9uU3VtbWFyeSgpfQorCSAqLworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TW9kaWZpY2F0aW9uU3VtbWFyeSgpIHsKKwkJZmluYWwgTGlzdDxTdHJpbmc+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWZvciAoTW9kaWZpZXIgbW9kaWZpZXIgOiBnZXRNb2RpZmllcnMoKSkgeworCQkJcmV0VmFsdWUuYWRkQWxsKG1vZGlmaWVyLmdldE1vZGlmaWNhdGlvblN1bW1hcnkoKSk7CisJCX0gLy8gZm9yIGVhY2ggTW9kaWZpZXIKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0TW9kaWZpY2F0aW9uU3VtbWFyeQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOworCQlmb3IgKE1vZGlmaWVyIG1vZGlmaWVyIDogZ2V0TW9kaWZpZXJzKCkpIHsKKwkJCS8vIElzIHRoaXMgbW9kaWZpZXIgY29tcGxldGU/CisJCQlpZiAoIW1vZGlmaWVyLmlzQ29tcGxldGUoKSkgeworCQkJCS8vIE5vCisJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCX0gLy8gaWYgCisJCX0gLy8gZm9yIGVhY2ggTW9kaWZpZXIKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gaXNDb21wbGV0ZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNjZW5hcmlvIGdldFNjZW5hcmlvKCkgeworCQlpZiAoc2NlbmFyaW8gIT0gbnVsbCAmJiBzY2VuYXJpby5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkU2NlbmFyaW8gPSAoSW50ZXJuYWxFT2JqZWN0KXNjZW5hcmlvOworCQkJc2NlbmFyaW8gPSAoU2NlbmFyaW8pZVJlc29sdmVQcm94eShvbGRTY2VuYXJpbyk7CisJCQlpZiAoc2NlbmFyaW8gIT0gb2xkU2NlbmFyaW8pIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBFeHBlcmltZW50UGFja2FnZS5FWFBFUklNRU5UX19TQ0VOQVJJTywgb2xkU2NlbmFyaW8sIHNjZW5hcmlvKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHNjZW5hcmlvOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTY2VuYXJpbyBiYXNpY0dldFNjZW5hcmlvKCkgeworCQlyZXR1cm4gc2NlbmFyaW87CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2NlbmFyaW8oU2NlbmFyaW8gbmV3U2NlbmFyaW8pIHsKKwkJU2NlbmFyaW8gb2xkU2NlbmFyaW8gPSBzY2VuYXJpbzsKKwkJc2NlbmFyaW8gPSBuZXdTY2VuYXJpbzsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRXhwZXJpbWVudFBhY2thZ2UuRVhQRVJJTUVOVF9fU0NFTkFSSU8sIG9sZFNjZW5hcmlvLCBzY2VuYXJpbykpOworCX0KKworCS8qKgorCSAqIEBzZWUge0BsaW5rIEV4cGVyaW1lbnQjZ2V0UGFyYW1ldGVyU3VtbWFyeSgpfQorCSAqLworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UGFyYW1ldGVyU3VtbWFyeSgpIHsKKwkJLy8gVE9ETyBpbXBsZW1lbnQgRXhwZXJpbWVudEltcGwuZ2V0UGFyYW1ldGVyU3VtbWFyeQorCQlyZXR1cm4gZ2V0TW9kaWZpY2F0aW9uU3VtbWFyeSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgU2NlbmFyaW8gdXBkYXRlU2NlbmFyaW8oKSB7CisJCS8vIEdldCB0aGUgZmlyc3QgbW9kaWZpZXIKKwkJTW9kaWZpZXIgbW9kaWZpZXIgPSBnZXRNb2RpZmllcnMoKS5nZXQoMCk7CisJCWlmKCFtb2RpZmllci5pc0NvbXBsZXRlKCkpIHsKKwkJCS8vIElmIGl0J3Mgbm90IGNvbXBsZXRlLCBzaW1wbHkgdXBkYXRlIHRoZSBzY2VuYXJpbworCQkJbW9kaWZpZXIudXBkYXRlU2NlbmFyaW8oZ2V0U2NlbmFyaW8oKSk7CisJCX0gZWxzZSB7CisJCQkvLyBUaGUgZmlyc3QgbW9kaWZpZXIgaXMgY29tcGxldGUsIGdldCB0aGUgbmV4dCBpbmNvbXBsZXRlCisJCQkvLyBtb2RpZmllciBvbiB0aGUgbGlzdCBhbmQgcmVzZXQgdGhlICJsZXNzIHNpZ25pZmljYW50IiBtb2RpZmllcnMuCisJCQkvLyBUaGluayBvZiBpdCBhcyBiaW5hcnkgY291bnRpbmcgc3dpdGNoaW5nIGJpdHMgb24gYW5kIG9mZiwgYnV0CisJCQkvLyB0aGUgbnVtYmVyIG9mIHN0YXRlcyBpcyBub3QgMiBidXQgZGVwZW5kcyBvbiBob3cgbWFueSBzdGF0ZXMKKwkJCS8vIHRoZSBtb2RpZmllciBoYXMuIFdlIGFzc3VtZSBhdCBsZWFzdCBvbmUgbW9kaWZpZXIgaXMgbm90IGNvbXBsZXRlCisJCQkvLyBoZXJlLCBvciB0aGlzIG1ldGhvZCB3b3VsZG4ndCBoYXZlIGJlZW4gY2FsbGVkLgorCQkJZm9yKE1vZGlmaWVyIG0gOiBnZXRNb2RpZmllcnMoKSkgeworCQkJCWlmKG0uaXNDb21wbGV0ZSgpKSB7CisJCQkJCW0ucmVzZXQoKTsKKwkJCQkJbS51cGRhdGVTY2VuYXJpbyhnZXRTY2VuYXJpbygpKTsKKwkJCQl9IGVsc2UgeworCQkJCQltLnVwZGF0ZVNjZW5hcmlvKGdldFNjZW5hcmlvKCkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkKKwkJfQorCQlTY2VuYXJpbyBzID0gIGdldFNjZW5hcmlvKCk7CisJCS8vIFdlIG5lZWQgdG8gcmUtaW5pdGlhbGl6ZSBzaW5jZSBkZWNvcmF0b3JzIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkCisJCXMuaW5pdGlhbGl6ZSgpOworCQlzLnNldFByb2dyZXNzKDAuMCk7CisJCXJldHVybiBzOworCX0gLy8gdXBkYXRlU2NlbmFyaW8KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgU2NlbmFyaW8gaW5pdFNjZW5hcmlvKCkgeworCQkvLyBTa2lwIHRoZSBmaXJzdCBtb2RpZmllciBzaW5jZSBpdCB3aWxsIHVwZGF0ZSB0aGUKKwkJLy8gc2NlbmFyaW8gaW4gdGhlIGZpcnN0IGNhbGwgdG8gZ2V0TmV4dFNpbXVsYXRpb24oKQorCQlmb3IoaW50IGk9MTtpPGdldE1vZGlmaWVycygpLnNpemUoKTsrK2kpIAorCQkJZ2V0TW9kaWZpZXJzKCkuZ2V0KGkpLnVwZGF0ZVNjZW5hcmlvKGdldFNjZW5hcmlvKCkpOworCQlyZXR1cm4gZ2V0U2NlbmFyaW8oKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5JZGVudGlmaWFibGVJbXBsI3NhbmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5zYW5lKCk7CisJCWFzc2VydCByZXRWYWx1ZTsKKworCQlyZXRWYWx1ZSA9IGdldFNjZW5hcmlvKCkgPT0gbnVsbCB8fCBnZXRTY2VuYXJpbygpLnNhbmUoKTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJZm9yIChNb2RpZmllciBtb2RpZmllciA6IGdldE1vZGlmaWVycygpKSB7CisJCQlyZXRWYWx1ZSA9IG1vZGlmaWVyLnNhbmUoKTsKKwkJCWFzc2VydCByZXRWYWx1ZTsKKwkJfSAvLyBmb3IgZWFjaCBNb2RpZmllcgorCQkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gc2FuZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFeHBlcmltZW50UGFja2FnZS5FWFBFUklNRU5UX19NT0RJRklFUlM6CisJCQkJcmV0dXJuIGdldE1vZGlmaWVycygpOworCQkJY2FzZSBFeHBlcmltZW50UGFja2FnZS5FWFBFUklNRU5UX19DT01QTEVURToKKwkJCQlyZXR1cm4gaXNDb21wbGV0ZSgpOworCQkJY2FzZSBFeHBlcmltZW50UGFja2FnZS5FWFBFUklNRU5UX19TQ0VOQVJJTzoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFNjZW5hcmlvKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U2NlbmFyaW8oKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFeHBlcmltZW50UGFja2FnZS5FWFBFUklNRU5UX19NT0RJRklFUlM6CisJCQkJZ2V0TW9kaWZpZXJzKCkuY2xlYXIoKTsKKwkJCQlnZXRNb2RpZmllcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1vZGlmaWVyPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFeHBlcmltZW50UGFja2FnZS5FWFBFUklNRU5UX19TQ0VOQVJJTzoKKwkJCQlzZXRTY2VuYXJpbygoU2NlbmFyaW8pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEV4cGVyaW1lbnRQYWNrYWdlLkVYUEVSSU1FTlRfX01PRElGSUVSUzoKKwkJCQlnZXRNb2RpZmllcnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRXhwZXJpbWVudFBhY2thZ2UuRVhQRVJJTUVOVF9fU0NFTkFSSU86CisJCQkJc2V0U2NlbmFyaW8oKFNjZW5hcmlvKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFeHBlcmltZW50UGFja2FnZS5FWFBFUklNRU5UX19NT0RJRklFUlM6CisJCQkJcmV0dXJuIG1vZGlmaWVycyAhPSBudWxsICYmICFtb2RpZmllcnMuaXNFbXB0eSgpOworCQkJY2FzZSBFeHBlcmltZW50UGFja2FnZS5FWFBFUklNRU5UX19DT01QTEVURToKKwkJCQlyZXR1cm4gaXNDb21wbGV0ZSgpICE9IENPTVBMRVRFX0VERUZBVUxUOworCQkJY2FzZSBFeHBlcmltZW50UGFja2FnZS5FWFBFUklNRU5UX19TQ0VOQVJJTzoKKwkJCQlyZXR1cm4gc2NlbmFyaW8gIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJCit9IC8vRXhwZXJpbWVudEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQvaW1wbC9FeHBlcmltZW50UGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQvaW1wbC9FeHBlcmltZW50UGFja2FnZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWJhOTgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZXhwZXJpbWVudC9pbXBsL0V4cGVyaW1lbnRQYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjkxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW9QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5pbXBsLlNjZW5hcmlvUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5TZXF1ZW5jZXJQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5pbXBsLlNvbHZlclBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLmltcGwuVHJpZ2dlclBhY2thZ2VJbXBsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEV4cGVyaW1lbnRQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEV4cGVyaW1lbnRQYWNrYWdlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBleHBlcmltZW50RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRURhdGFUeXBlIHVyaUVEYXRhVHlwZSA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKKwkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KKwkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCisJICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKKwkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50UGFja2FnZSNlTlNfVVJJCisJICogQHNlZSAjaW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRXhwZXJpbWVudFBhY2thZ2VJbXBsKCkgeworCQlzdXBlcihlTlNfVVJJLCBFeHBlcmltZW50RmFjdG9yeS5lSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIEV4cGVyaW1lbnRQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgorCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNlTlNfVVJJCisJICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBFeHBlcmltZW50UGFja2FnZSBpbml0KCkgeworCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoRXhwZXJpbWVudFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRXhwZXJpbWVudFBhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQorCQlFeHBlcmltZW50UGFja2FnZUltcGwgdGhlRXhwZXJpbWVudFBhY2thZ2UgPSAoRXhwZXJpbWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBFeHBlcmltZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgRXhwZXJpbWVudFBhY2thZ2VJbXBsKCkpOworCisJCWlzSW5pdGVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKKwkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcworCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOworCQlHcmFwaFBhY2thZ2VJbXBsIHRoZUdyYXBoUGFja2FnZSA9IChHcmFwaFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShHcmFwaFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBHcmFwaFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoR3JhcGhQYWNrYWdlLmVOU19VUkkpIDogR3JhcGhQYWNrYWdlLmVJTlNUQU5DRSk7CisJCU1vZGVsUGFja2FnZUltcGwgdGhlTW9kZWxQYWNrYWdlID0gKE1vZGVsUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGVsUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIE1vZGVsUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RlbFBhY2thZ2UuZU5TX1VSSSkgOiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJTW9kaWZpZXJQYWNrYWdlSW1wbCB0aGVNb2RpZmllclBhY2thZ2UgPSAoTW9kaWZpZXJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kaWZpZXJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgTW9kaWZpZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGlmaWVyUGFja2FnZS5lTlNfVVJJKSA6IE1vZGlmaWVyUGFja2FnZS5lSU5TVEFOQ0UpOworCQlQcmVkaWNhdGVQYWNrYWdlSW1wbCB0aGVQcmVkaWNhdGVQYWNrYWdlID0gKFByZWRpY2F0ZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQcmVkaWNhdGVQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgUHJlZGljYXRlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQcmVkaWNhdGVQYWNrYWdlLmVOU19VUkkpIDogUHJlZGljYXRlUGFja2FnZS5lSU5TVEFOQ0UpOworCQlTY2VuYXJpb1BhY2thZ2VJbXBsIHRoZVNjZW5hcmlvUGFja2FnZSA9IChTY2VuYXJpb1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTY2VuYXJpb1BhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBTY2VuYXJpb1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU2NlbmFyaW9QYWNrYWdlLmVOU19VUkkpIDogU2NlbmFyaW9QYWNrYWdlLmVJTlNUQU5DRSk7CisJCVNlcXVlbmNlclBhY2thZ2VJbXBsIHRoZVNlcXVlbmNlclBhY2thZ2UgPSAoU2VxdWVuY2VyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNlcXVlbmNlclBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBTZXF1ZW5jZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNlcXVlbmNlclBhY2thZ2UuZU5TX1VSSSkgOiBTZXF1ZW5jZXJQYWNrYWdlLmVJTlNUQU5DRSk7CisJCVRyaWdnZXJQYWNrYWdlSW1wbCB0aGVUcmlnZ2VyUGFja2FnZSA9IChUcmlnZ2VyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRyaWdnZXJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVHJpZ2dlclBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVHJpZ2dlclBhY2thZ2UuZU5TX1VSSSkgOiBUcmlnZ2VyUGFja2FnZS5lSU5TVEFOQ0UpOworCQlTb2x2ZXJQYWNrYWdlSW1wbCB0aGVTb2x2ZXJQYWNrYWdlID0gKFNvbHZlclBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTb2x2ZXJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgU29sdmVyUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTb2x2ZXJQYWNrYWdlLmVOU19VUkkpIDogU29sdmVyUGFja2FnZS5lSU5TVEFOQ0UpOworCisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCisJCXRoZUV4cGVyaW1lbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVHcmFwaFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU1vZGVsUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlTW9kaWZpZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVQcmVkaWNhdGVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVTY2VuYXJpb1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNlcXVlbmNlclBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVRyaWdnZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVTb2x2ZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKwkJdGhlRXhwZXJpbWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlR3JhcGhQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlTW9kZWxQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlTW9kaWZpZXJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlUHJlZGljYXRlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNjZW5hcmlvUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNlcXVlbmNlclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVUcmlnZ2VyUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNvbHZlclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKwkJdGhlRXhwZXJpbWVudFBhY2thZ2UuZnJlZXplKCk7CisKKyAgCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoRXhwZXJpbWVudFBhY2thZ2UuZU5TX1VSSSwgdGhlRXhwZXJpbWVudFBhY2thZ2UpOworCQlyZXR1cm4gdGhlRXhwZXJpbWVudFBhY2thZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRFeHBlcmltZW50KCkgeworCQlyZXR1cm4gZXhwZXJpbWVudEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFeHBlcmltZW50X01vZGlmaWVycygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWV4cGVyaW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHBlcmltZW50X0NvbXBsZXRlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXhwZXJpbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEV4cGVyaW1lbnRfU2NlbmFyaW8oKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlleHBlcmltZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVEYXRhVHlwZSBnZXRVUkkoKSB7CisJCXJldHVybiB1cmlFRGF0YVR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4cGVyaW1lbnRGYWN0b3J5IGdldEV4cGVyaW1lbnRGYWN0b3J5KCkgeworCQlyZXR1cm4gKEV4cGVyaW1lbnRGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKKwkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47CisJCWlzQ3JlYXRlZCA9IHRydWU7CisKKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCisJCWV4cGVyaW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVhQRVJJTUVOVCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZXhwZXJpbWVudEVDbGFzcywgRVhQRVJJTUVOVF9fTU9ESUZJRVJTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShleHBlcmltZW50RUNsYXNzLCBFWFBFUklNRU5UX19DT01QTEVURSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZXhwZXJpbWVudEVDbGFzcywgRVhQRVJJTUVOVF9fU0NFTkFSSU8pOworCisJCS8vIENyZWF0ZSBkYXRhIHR5cGVzCisJCXVyaUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShVUkkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcworCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKKwkJaXNJbml0aWFsaXplZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCisJCXNldE5hbWUoZU5BTUUpOworCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKKwkJc2V0TnNVUkkoZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcworCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOworCQlNb2RpZmllclBhY2thZ2UgdGhlTW9kaWZpZXJQYWNrYWdlID0gKE1vZGlmaWVyUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RpZmllclBhY2thZ2UuZU5TX1VSSSk7CisJCVNjZW5hcmlvUGFja2FnZSB0aGVTY2VuYXJpb1BhY2thZ2UgPSAoU2NlbmFyaW9QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNjZW5hcmlvUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQlleHBlcmltZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SWRlbnRpZmlhYmxlKCkpOworCisJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCWluaXRFQ2xhc3MoZXhwZXJpbWVudEVDbGFzcywgRXhwZXJpbWVudC5jbGFzcywgIkV4cGVyaW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RXhwZXJpbWVudF9Nb2RpZmllcnMoKSwgdGhlTW9kaWZpZXJQYWNrYWdlLmdldE1vZGlmaWVyKCksIG51bGwsICJtb2RpZmllcnMiLCBudWxsLCAwLCAtMSwgRXhwZXJpbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRFeHBlcmltZW50X0NvbXBsZXRlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiY29tcGxldGUiLCBudWxsLCAwLCAxLCBFeHBlcmltZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RXhwZXJpbWVudF9TY2VuYXJpbygpLCB0aGVTY2VuYXJpb1BhY2thZ2UuZ2V0U2NlbmFyaW8oKSwgbnVsbCwgInNjZW5hcmlvIiwgbnVsbCwgMCwgMSwgRXhwZXJpbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWFkZEVPcGVyYXRpb24oZXhwZXJpbWVudEVDbGFzcywgdGhlU2NlbmFyaW9QYWNrYWdlLmdldFNjZW5hcmlvKCksICJ1cGRhdGVTY2VuYXJpbyIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlhZGRFT3BlcmF0aW9uKGV4cGVyaW1lbnRFQ2xhc3MsIHRoZVNjZW5hcmlvUGFja2FnZS5nZXRTY2VuYXJpbygpLCAiaW5pdFNjZW5hcmlvIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcworCQlpbml0RURhdGFUeXBlKHVyaUVEYXRhVHlwZSwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSS5jbGFzcywgIlVSSSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBDcmVhdGUgcmVzb3VyY2UKKwkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJfQorCit9IC8vRXhwZXJpbWVudFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9leHBlcmltZW50L3Byb3ZpZGVyL0V4cGVyaW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQvcHJvdmlkZXIvRXhwZXJpbWVudEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYzA3MmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9leHBlcmltZW50L3Byb3ZpZGVyL0V4cGVyaW1lbnRJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDM1MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5VdGlsaXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5JZGVudGlmaWFibGVJdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50UGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudH0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRXhwZXJpbWVudEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgSWRlbnRpZmlhYmxlSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cwkKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4cGVyaW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkQ29tcGxldGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbXBsZXRlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQ29tcGxldGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9FeHBlcmltZW50X2NvbXBsZXRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0V4cGVyaW1lbnRfY29tcGxldGVfZmVhdHVyZSIsICJfVUlfRXhwZXJpbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIEV4cGVyaW1lbnRQYWNrYWdlLkxpdGVyYWxzLkVYUEVSSU1FTlRfX0NPTVBMRVRFLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7CisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChFeHBlcmltZW50UGFja2FnZS5MaXRlcmFscy5FWFBFUklNRU5UX19NT0RJRklFUlMpOworCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoRXhwZXJpbWVudFBhY2thZ2UuTGl0ZXJhbHMuRVhQRVJJTUVOVF9fU0NFTkFSSU8pOworCQl9CisJCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgeworCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCisJCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KKworCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBFeHBlcmltZW50LmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9jdXN0b21vYmoxNi9FeHBlcmltZW50IikpOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKEV4cGVyaW1lbnQpb2JqZWN0KS5nZXRVUkkoKS5sYXN0U2VnbWVudCgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0V4cGVyaW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChFeHBlcmltZW50KW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfRXhwZXJpbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9FeHBlcmltZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFeHBlcmltZW50LmNsYXNzKSkgeworCQkJY2FzZSBFeHBlcmltZW50UGFja2FnZS5FWFBFUklNRU5UX19DT01QTEVURToKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFeHBlcmltZW50UGFja2FnZS5FWFBFUklNRU5UX19NT0RJRklFUlM6CisJCQljYXNlIEV4cGVyaW1lbnRQYWNrYWdlLkVYUEVSSU1FTlRfX1NDRU5BUklPOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVBZGRDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS51dGlsLkNvbGxlY3Rpb24sIGludCkKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAorCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7CisJCWZpbmFsIENvbGxlY3Rpb24gaWRlbnRpZmlhYmxlQ29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZm9yIChPYmplY3QgdmFsdWUgOiBjb2xsZWN0aW9uKSB7CisKKwkJCU9iamVjdCB0ZW1wID0gdmFsdWU7CisJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJRmlsZSkgeworCQkJCS8vIFllcworCQkJCWZpbmFsIElGaWxlIGlGaWxlID0gKElGaWxlKSB2YWx1ZTsKKwkJCQlmaW5hbCBVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkoaUZpbGUuZ2V0TG9jYXRpb24oKQorCQkJCQkJLnRvU3RyaW5nKCkpOworCQkJCWZpbmFsIElkZW50aWZpYWJsZSBpZGVudGlmYWJsZSA9IFV0aWxpdHkuZ2V0SWRlbnRpZmlhYmxlKHVyaSk7CisJCQkJaWRlbnRpZmlhYmxlQ29sbGVjdGlvbi5hZGQoaWRlbnRpZmFibGUpOworCQkJCXRlbXAgPSBpZGVudGlmYWJsZTsKKwkJCX0gLy8gaWYgSUZpbGUKKworCQkJZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQkvLyBZZXMKKwkJCQlmaW5hbCBTdHJpbmcgdXJpU3RyaW5nID0gKFN0cmluZykgdmFsdWU7CisJCQkJdHJ5IHsKKwkJCQkJZmluYWwgVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpU3RyaW5nKTsKKwkJCQkJZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50aWZhYmxlID0gVXRpbGl0eQorCQkJCQkJCS5nZXRJZGVudGlmaWFibGUodXJpKTsKKwkJCQkJdGVtcCA9IGlkZW50aWZhYmxlOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIElnbm9yZSBpdAorCQkJCX0KKwkJCX0gLy8gaWYgU3RyaW5nCisKKwkJCWlmICh0ZW1wIGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlKSB7CisJCQkJaWRlbnRpZmlhYmxlQ29sbGVjdGlvbi5hZGQodGVtcCk7CisJCQl9CisJCX0gLy8gZm9yIGVhY2ggT2JqZWN0CisKKwkJcmV0dXJuIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwKKwkJCQlpZGVudGlmaWFibGVDb2xsZWN0aW9uLCBpbmRleCk7CisJfSAvLyBjcmVhdGVBZGRDb21tYW5kCisJCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlU2V0Q29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKKwkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAorCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50KQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVNldENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCisJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKKwkJLy8gQXJlIHdlIHNldHRpbmcgdGhlIG1vZGVsIGR1cmluZyBhIGRyYWcgYW5kIGRyb3A/CisJCU9iamVjdCB0ZW1wID0gdmFsdWU7CisKKwkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSUZpbGUpIHsKKwkJCS8vIFllcworCQkJZmluYWwgSUZpbGUgaUZpbGUgPSAoSUZpbGUpIHZhbHVlOworCQkJZmluYWwgVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKGlGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7CisJCQlmaW5hbCBJZGVudGlmaWFibGUgaWRlbnRpZmFibGUgPSBVdGlsaXR5LmdldElkZW50aWZpYWJsZSh1cmkpOworCQkJdGVtcCA9IGlkZW50aWZhYmxlOworCQl9IC8vIGlmIElGaWxlCisKKwkJZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCS8vIFllcworCQkJLy8gVGhlc2UgY29tZSBmcm9tIElkZW50aWZhYmxlUGx1Z2luVmlldworCQkJZmluYWwgU3RyaW5nIHVyaVN0cmluZyA9IChTdHJpbmcpIHZhbHVlOworCQkJdHJ5IHsKKwkJCQlmaW5hbCBVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSSh1cmlTdHJpbmcpOworCQkJCWZpbmFsIElkZW50aWZpYWJsZSBpZGVudGlmYWJsZSA9IFV0aWxpdHkuZ2V0SWRlbnRpZmlhYmxlKHVyaSk7CisJCQkJdGVtcCA9IGlkZW50aWZhYmxlOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBJZ25vcmUgaXQKKwkJCX0KKwkJfSAvLyBpZiBTdHJpbmcKKworCQlpZiAodGVtcCBpbnN0YW5jZW9mIFNjZW5hcmlvKSB7CisJCQlyZXR1cm4gc3VwZXIuY3JlYXRlU2V0Q29tbWFuZChkb21haW4sIG93bmVyLAorCQkJCQlFeHBlcmltZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXhwZXJpbWVudF9TY2VuYXJpbygpLCB0ZW1wLCBpbmRleCk7CisJCX0gLy8gaWYKKwkJZWxzZSBpZiAodGVtcCBpbnN0YW5jZW9mIE1vZGlmaWVyKSB7CisJCQlyZXR1cm4gc3VwZXIKKwkJCQkJLmNyZWF0ZUFkZENvbW1hbmQoCisJCQkJCQkJZG9tYWluLAorCQkJCQkJCW93bmVyLAorCQkJCQkJCUV4cGVyaW1lbnRQYWNrYWdlLmVJTlNUQU5DRQorCQkJCQkJCQkJLmdldEV4cGVyaW1lbnQoKQorCQkJCQkJCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKKwkJCQkJCQkJCQkJRXhwZXJpbWVudFBhY2thZ2UuRVhQRVJJTUVOVF9fTU9ESUZJRVJTKSwKKwkJCQkJCQlBcnJheXMuYXNMaXN0KChuZXcgT2JqZWN0W10geyB0ZW1wIH0pKSwgaW5kZXgpOworCQl9IC8vIGVsc2UgaWYKKwkJZWxzZSB7CisKKwkJCXJldHVybiBzdXBlci5jcmVhdGVTZXRDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIHZhbHVlLCBpbmRleCk7CisJCX0KKwl9IC8vIGNyZWF0ZVNldENvbW1hbmQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCisJICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBmbG9hdCwgaW50LCBpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKKwkJCU9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAorCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisJCS8vIFdlIGFkZCBETkQuRFJPUF9MSU5LIGFzIGFuIGFsbG93ZWQgb3BlcmF0aW9uIGJlY2F1c2UgYWxsIGRyb3BzIHdpbGwKKwkJLy8gYmUgbGlua3MgYW5kIHNvbWUgc291cmNlcyBkb24ndCBhbGxvdyBsaW5rcywgd2UgY29udmVydCB0byBsaW5rcworCQkvLyBhbnl3YXkKKwkJcmV0dXJuIHN1cGVyLmNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIG93bmVyLCBsb2NhdGlvbiwKKwkJCQlvcGVyYXRpb25zIHwgRE5ELkRST1BfTElOSywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKKwl9IC8vIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZAorCQorCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2lzV3JhcHBpbmdOZWVkZWQoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKKwkJLy8gcmV0dXJuIHN1cGVyLmlzV3JhcHBpbmdOZWVkZWQob2JqZWN0KTsKKwkJLy8gV2UgcmV0dXJuIHRydWUgc28gdGhhdCBub24tY29udGFpbm1lbnQgcmVmZXJlbmNlcyBhcmUgd3JhcHBlZC4gVGhpcworCQkvLyBlbmFibGVzIHRoZSBkZWxldGUgY29tbWFuZCBpbiB0aGUgZWRpdG9yJ3MgY29udGV4dCBtZW51LgorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIENvcmVFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZXhwZXJpbWVudC9wcm92aWRlci9FeHBlcmltZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQvcHJvdmlkZXIvRXhwZXJpbWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwN2Q2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQvcHJvdmlkZXIvRXhwZXJpbWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMDcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LnV0aWwuRXhwZXJpbWVudEFkYXB0ZXJGYWN0b3J5OworCisvKioKKyAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4KKyAqIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LgorICogVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4KKyAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEV4cGVyaW1lbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEV4cGVyaW1lbnRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXhwZXJpbWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgeworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50fSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEV4cGVyaW1lbnRJdGVtUHJvdmlkZXIgZXhwZXJpbWVudEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHBlcmltZW50QWRhcHRlcigpIHsKKwkJaWYgKGV4cGVyaW1lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJZXhwZXJpbWVudEl0ZW1Qcm92aWRlciA9IG5ldyBFeHBlcmltZW50SXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGV4cGVyaW1lbnRJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7CisJCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOworCX0KKworCS8qKgorCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKKwkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7CisJCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgeworCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgeworCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOworCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzPD8+KSB8fCAoKChDbGFzczw/Pil0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgeworCQkJCXJldHVybiBhZGFwdGVyOworCQkJfQorCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKKwkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9IGFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisKKwkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKKwkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGRpc3Bvc2VzIGFsbCBvZiB0aGUgaXRlbSBwcm92aWRlcnMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkuIAorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWlmIChleHBlcmltZW50SXRlbVByb3ZpZGVyICE9IG51bGwpIGV4cGVyaW1lbnRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZXhwZXJpbWVudC91dGlsL0V4cGVyaW1lbnRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZXhwZXJpbWVudC91dGlsL0V4cGVyaW1lbnRBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMTkwMmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9leHBlcmltZW50L3V0aWwvRXhwZXJpbWVudEFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNjUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEV4cGVyaW1lbnRBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgRXhwZXJpbWVudFBhY2thZ2UgbW9kZWxQYWNrYWdlOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFeHBlcmltZW50QWRhcHRlckZhY3RvcnkoKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gRXhwZXJpbWVudFBhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgeworCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKKwkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBFeHBlcmltZW50U3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0KKwkJbmV3IEV4cGVyaW1lbnRTd2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFeHBlcmltZW50KEV4cGVyaW1lbnQgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUV4cGVyaW1lbnRBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyA8VD4gQWRhcHRlciBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworCQkJfQorCQl9OworCisJLyoqCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnQgPGVtPkV4cGVyaW1lbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHBlcmltZW50QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLmxhbmcuQ29tcGFyYWJsZSA8ZW0+Q29tcGFyYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9FeHBlcmltZW50QWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQvdXRpbC9FeHBlcmltZW50U3dpdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9leHBlcmltZW50L3V0aWwvRXhwZXJpbWVudFN3aXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOWVhMWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9leHBlcmltZW50L3V0aWwvRXhwZXJpbWVudFN3aXRjaC5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LnV0aWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQorICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAorICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKKyAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKyAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAorICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnRQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFeHBlcmltZW50U3dpdGNoPFQxPiB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBFeHBlcmltZW50UGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4cGVyaW1lbnRTd2l0Y2goKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gRXhwZXJpbWVudFBhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUMSBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKKwkJfQorCQllbHNlIHsKKwkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOworCQkJcmV0dXJuCisJCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KKwkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgorCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7CisJCQljYXNlIEV4cGVyaW1lbnRQYWNrYWdlLkVYUEVSSU1FTlQ6IHsKKwkJCQlFeHBlcmltZW50IGV4cGVyaW1lbnQgPSAoRXhwZXJpbWVudCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VFeHBlcmltZW50KGV4cGVyaW1lbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShleHBlcmltZW50KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKGV4cGVyaW1lbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4cGVyaW1lbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHBlcmltZW50PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUV4cGVyaW1lbnQoRXhwZXJpbWVudCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyA8VD4gVDEgY2FzZUNvbXBhcmFibGUoQ29tcGFyYWJsZTxUPiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL0V4cGVyaW1lbnRTd2l0Y2gKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL0R5bmFtaWNFZGdlTGFiZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL0R5bmFtaWNFZGdlTGFiZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWU5ODc1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvRHluYW1pY0VkZ2VMYWJlbC5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8vIER5bmFtaWNFZGdlTGFiZWwuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGg7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEEgPGNvZGU+RHluYW1pY0VkZ2VMYWJlbDwvY29kZT4gaXMgYSB7QGxpbmsgRHluYW1pY0xhYmVsfSB0aGF0IHNwZWNpZmljYWxseQorICogbGFiZWxzIGFuIHtAbGluayBFZGdlfS4KKyAqIAorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICovCitwdWJsaWMgaW50ZXJmYWNlIER5bmFtaWNFZGdlTGFiZWwgZXh0ZW5kcyBEeW5hbWljTGFiZWwsIEVkZ2VMYWJlbCB7CisJLy8gTm90aGluZworfSAvLyBEeW5hbWljRWRnZUxhYmVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9EeW5hbWljTGFiZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL0R5bmFtaWNMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OWI3YzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9EeW5hbWljTGFiZWwuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLy8gRHluYW1pY0xhYmVsLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKKworLyoqCisgKiBBIDxjb2RlPkR5bmFtaWNMYWJlbDwvY29kZT4gaXMgYSB7QGxpbmsgTGFiZWx9IHRoYXQgaGFzIHR3bworICoge0BsaW5rIExhYmVsVmFsdWV9cyBpbnN0ZWFkIG9mIG9uZS4gVGhlIHNlY29uZCB2YWx1ZSBpcyBjYWxsZWQgdGhlICJuZXh0IgorICogdmFsdWUuIEl0IHJlcHJlc2VudHMgdGhlIHZhbHVlcyBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUge0BsaW5rIExhYmVsfSBpbiB0aGUKKyAqIG5leHQgc3RhdGUgb2YgdGhlIHtAbGluayBHcmFwaH0uIFRoZSBvdGhlciB2YWx1ZSBpcyBjYWxsZWQgdGhlICJjdXJyZW50IgorICogdmFsdWUgYW5kIGl0IHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVzIGluIHRoZSBjdXJyZW50IHN0YXRlIG9mCisgKiB0aGUge0BsaW5rIEdyYXBofS4KKyAqIDxwPgorICogQSA8Y29kZT5EeW5hbWljTGFiZWw8L2NvZGU+IGNhbiBleGNoYW5nZSB0aGUgImN1cnJlbnQiIGFuZCAibmV4dCcgdmFsdWVzCisgKiAoc2VlIHtAbGluayAjc3dpdGNoVG9OZXh0VmFsdWUoKX0uIEFmdGVyIHN1Y2ggYSBzd2l0Y2gsIHRoZSBuZXh0IHZhbHVlIGlzCisgKiBtYXJrZWQgYXMgYmVpbmcgImludmFsaWQiIChzZWUge0BsaW5rICNpc05leHRWYWx1ZVZhbGlkKCl9KS4KKyAqIDwvcD4KKyAqIAorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICovCitwdWJsaWMgaW50ZXJmYWNlIER5bmFtaWNMYWJlbCBleHRlbmRzIExhYmVsIHsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHRvcC1sZXZlbCBzZWdtZW50IGZvciBhbGwgdHlwZSBVUkkncyBmb3IgZHluYW1pYyBsYWJlbHMuCisJICovCisJU3RyaW5nIFVSSV9UWVBFX0RZTkFNSUNfTEFCRUxfU0VHTUVOVCA9IFVSSV9UWVBFX0xBQkVMX1NFR01FTlQgKyAiL2R5bmFtaWMiOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdHlwZSBVUkkgZm9yIGEgRHluYW1pYyBMYWJlbAorCSAqLworCVVSSSBVUklfVFlQRV9EWU5BTUlDX0xBQkVMID0gU1RFTVVSSQorCQkJLmNyZWF0ZVR5cGVVUkkoVVJJX1RZUEVfRFlOQU1JQ19MQUJFTF9TRUdNRU5UKTsKKworCS8qKgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHtAbGluayBEZWNvcmF0b3J9IHRoYXQgdXBkYXRlcyB0aGlzIDxjb2RlPkR5bmFtaWNMYWJlbDwvY29kZT4uCisJICogQG1vZGVsIG9wcG9zaXRlPSJsYWJlbHNUb1VwZGF0ZSIKKwkgKi8KKwlEZWNvcmF0b3IgZ2V0RGVjb3JhdG9yKCk7CisJCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbCNnZXREZWNvcmF0b3IgPGVtPkRlY29yYXRvcjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVjb3JhdG9yPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXREZWNvcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERlY29yYXRvcihEZWNvcmF0b3IgdmFsdWUpOworCisJLyoqCisJICogUmVzZXQgdGhlIGR5bmFtaWMgbGFiZWwuIFRoaXMgc2V0cyB0aGUge0BsaW5rIExhYmVsVmFsdWV9cyBiYWNrIHRvIHRoZWlyCisJICogaW5pdGlhbCBzdGF0ZXMuCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCXZvaWQgcmVzZXQoKTsKKworCS8qKgorCSAqIElmIHRoZSBuZXh0IHZhbHVlIGhhcyBiZWVuIHNldCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvCisJICoge0BsaW5rICNzZXROZXh0VmFsdWUoTGFiZWxWYWx1ZSl9IGFuZCB0aGUgPGNvZGU+RHluYW1pY0xhYmVsPC9jb2RlPiBoYXMKKwkgKiBub3QgYmVlbiAicmVzZXQiIHRoZW4gdGhlIG5leHQgdmFsdWUgaXMgdmFsaWQuCisJICogCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBuZXh0IHZhbHVlIGlzIHZhbGlkCisJICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgorCSAqLworCWJvb2xlYW4gaXNOZXh0VmFsdWVWYWxpZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbCNpc05leHRWYWx1ZVZhbGlkIDxlbT5OZXh0IFZhbHVlIFZhbGlkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmV4dCBWYWx1ZSBWYWxpZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNOZXh0VmFsdWVWYWxpZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TmV4dFZhbHVlVmFsaWQoYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSAibmV4dCIge0BsaW5rIExhYmVsVmFsdWV9LgorCSAqIAorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCisJICovCisJTGFiZWxWYWx1ZSBnZXROZXh0VmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWwjZ2V0TmV4dFZhbHVlIDxlbT5OZXh0IFZhbHVlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmV4dCBWYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0TmV4dFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXROZXh0VmFsdWUoTGFiZWxWYWx1ZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBFeGNoYW5nZSB0aGUgIm5leHQiIGFuZCAiY3VycmVudCIge0BsaW5rIExhYmVsVmFsdWV9cy4gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUKKwkgKiB7QGxpbmsgR3JhcGh9IGlzIHJlYWR5IHRvIG1vdmUgdG8gdGhlIG5leHQgc3RhdGUgKHNlZQorCSAqIHtAbGluayBHcmFwaCNzd2l0Y2hUb05leHRWYWx1ZSgpKS4KKwkgKiAKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJdm9pZCBzd2l0Y2hUb05leHRWYWx1ZSgpOworfSAvLyBEeW5hbWljTGFiZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL0R5bmFtaWNOb2RlTGFiZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL0R5bmFtaWNOb2RlTGFiZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTE5OTA3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvRHluYW1pY05vZGVMYWJlbC5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8vIER5bmFtaWNOb2RlTGFiZWwuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGg7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEEgPGNvZGU+RHluYW1pY05vZGVMYWJlbDwvY29kZT4gaXMgYSB7QGxpbmsgRHluYW1pY0xhYmVsfSB0aGF0IHNwZWNpZmljYWxseQorICogbGFiZWxzIGEge0BsaW5rIE5vZGV9LgorICogCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRHluYW1pY05vZGVMYWJlbCBleHRlbmRzIER5bmFtaWNMYWJlbCwgTm9kZUxhYmVsIHsKKwkvLyBOb3RoaW5nCit9IC8vIER5bmFtaWNOb2RlTGFiZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL0VkZ2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL0VkZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzYwZjZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvRWRnZS5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvLyBFZGdlLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGU7CisKKy8qKgorICogQW4gPGNvZGU+RWRnZTwvY29kZT4gcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byB7QGxpbmsgTm9kZX1zLgorICogVGhlIGF0dHJpYnV0ZXMgb2YgdGhhdCByZWxhdGlvbnNoaXAgYXJlIGRlZmluZWQgYnkgdGhlIDxjb2RlPkVkZ2U8L2NvZGU+J3MKKyAqIHtAbGluayBMYWJlbH0uCisgKiA8cD4KKyAqIEFuIDxjb2RlPkVkZ2U8L2NvZGU+IGNhbiBiZSA8ZW0+ZGlyZWN0ZWQ8L2VtPiBvciA8ZW0+dW5kaXJlY3RlZDwvZW0+LgorICogSWYgdGhlIDxjb2RlPkVkZ2U8L2NvZGU+IGlzIGRpcmVjdGVkIHRoZW4gdGhlIHJlbGF0aW9uc2hpcCBpcyAib25lLXdheSIKKyAqIGZyb20ge0BsaW5rIE5vZGV9ICI8Y29kZT5BPC9jb2RlPiIgdG8ge0BsaW5rIE5vZGV9ICI8Y29kZT5CPC9jb2RlPiIuCisgKiBBbiBleGFtcGxlIG9mIHN1Y2ggYSByZWxhdGlvbnNoaXAgaXMgInBoeXNpY2FsbHkgY29udGFpbnMiLCB3aGVyZSB0aGUgZW50aXR5CisgKiByZXByZXNlbnRlZCBieSB7QGxpbmsgTm9kZX0gIjxjb2RlPkI8L2NvZGU+IiBpcyBwaHlzaWNhbGx5IGNvbnRhaW5lZCBpbgorICogdGhlIGVudGl0eSByZXByZXNlbnRlZCBieSB7QGxpbmsgTm9kZX0gIjxjb2RlPkE8L2NvZGU+IiAoZS5nLiwgU2FudGEKKyAqIENsYXJhIGNvdW50eSBpcyBwaHlzaWNhbGx5IGNvbnRhaW5lZCBpbiB0aGUgc3RhdGUgb2YgQ2FsaWZvcm5pYSkuIElmIHRoZQorICogPGNvZGU+RWRnZTwvY29kZT4gaXMgdW5kaXJlY3RlZCB0aGVuIHRoZSByZWxhdGlvbnNoaXAgaXMgPGVtPnN5bW1ldHJpYzwvZW0+LAorICogbWVhbmluZyB0aGF0IGl0IGhvbGRzIGJvdGggd2F5cy4gQW4gZXhhbXBsZSBvZiBzdWNoIGEgcmVsYXRpb25zaGlwIGlzICJzaGFyZXMKKyAqIGNvbW1vbiBib3JkZXIiLCB3aGVyZSB0aGUgZW50aXR5IHJlcHJlc2VudGVkIGJ5IHtAbGluayBOb2RlfSAiPGNvZGU+QTwvY29kZT4iCisgKiBzaGFyZXMgYSBjb21tb24gYm9yZGVyIHdpdGggdGhlIGVudGl0eSByZXByZXNlbnRlZCBieSB7QGxpbmsgTm9kZX0gIjxjb2RlPkI8L2NvZGU+IgorICogKGUuZy4sIFNhbnRhIENsYXJhIGNvdW50eSBzaGFyZXMgYSBjb21tb24gYm9yZGVyIHdpdGggU2FudGEgQ3J1eiBjb3VudHkpLgorICogCisgKiA8L3A+CisgKiAKKyAqIEBzZWUgR3JhcGgKKyAqIEBzZWUgTm9kZQorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBFZGdlIGV4dGVuZHMgSWRlbnRpZmlhYmxlLCBNb2RpZmlhYmxlIHsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHNlZ21lbnQgb2YgdGhlIHR5cGUgVVJJIHRoYXQgcHJlZml4ZXMgYWxsIG90aGVyIHNlZ21lbnRzIGluIGEKKwkgKiBlZGdlIFVSSS4KKwkgKi8KKwlTdHJpbmcgVVJJX1RZUEVfRURHRV9TRUdNRU5UID0gImVkZ2UiOworCisJLyoqCisJICogQHJldHVybiB0aGUgIkEiIHtAbGluayBOb2RlfSBvZiB0aGUgZWRnZS4gRGlyZWN0ZWQgZWRnZXMgZ28gZnJvbQorCSAqICAgICAgICAge0BsaW5rIE5vZGV9IEEgdG8ge0BsaW5rIE5vZGV9IEIuIEluIGEgZ3JhcGggZnJhZ21lbnQgdGhpcyB2YWx1ZQorCSAqICAgICAgICAgbWF5IG5vdCB5ZXQgYmUgc2V0LgorCSAqIEBtb2RlbCBjb250YWlubWVudD0iZmFsc2UiCisJICovCisJTm9kZSBnZXRBKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZSNnZXRBIDxlbT5BPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QShOb2RlIHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIFVSSSBvZiB7QGxpbmsgTm9kZX0gQS4KKwkgKiBAbW9kZWwKKwkgKi8KKwlVUkkgZ2V0Tm9kZUFVUkkoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlI2dldE5vZGVBVVJJIDxlbT5Ob2RlIEFVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob2RlIEFVUkk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE5vZGVBVVJJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXROb2RlQVVSSShVUkkgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgIkIiIHtAbGluayBOb2RlfSBvZiB0aGUgZWRnZS4gRGlyZWN0ZWQgZWRnZXMgZ28gZnJvbQorCSAqICAgICAgICAge0BsaW5rIE5vZGV9IEEgdG8ge0BsaW5rIE5vZGV9IEIuIEluIGEgZ3JhcGggZnJhZ21lbnQgdGhpcyB2YWx1ZQorCSAqICAgICAgICAgbWF5IG5vdCB5ZXQgYmUgc2V0LgorCSAqIEBtb2RlbCBjb250YWlubWVudD0iZmFsc2UiCisJICovCisJTm9kZSBnZXRCKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZSNnZXRCIDxlbT5CPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QjwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QihOb2RlIHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIFVSSSBvZiB7QGxpbmsgTm9kZX0gQi4KKwkgKiBAbW9kZWwKKwkgKi8KKwlVUkkgZ2V0Tm9kZUJVUkkoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlI2dldE5vZGVCVVJJIDxlbT5Ob2RlIEJVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob2RlIEJVUkk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE5vZGVCVVJJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXROb2RlQlVSSShVUkkgdmFsdWUpOworCisJLyoqCisJICogQHBhcmFtIG5vZGUKKwkgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgdHdvIHtAbGluayBOb2RlfXMgb2YgdGhlIDxjb2RlPkVkZ2U8L2NvZGU+CisJICogQHJldHVybiB7QGxpbmsgTm9kZX0gQSBpZiB7QGxpbmsgTm9kZX0gQiBpcyBwYXNzZWQgaW4sIG90aGVyd2lzZSByZXR1cm4KKwkgKiAgICAgICAgIHtAbGluayBOb2RlfSBCIGlmIHtAbGluayBOb2RlfSBBIGlzIHBhc3NlZCBpbi4KKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgICAgIGlmIHRoZSB7QGxpbmsgTm9kZX0gcGFzc2VkIGluIGlzIG5vdCBlaXRoZXIge0BsaW5rIE5vZGV9IEEKKwkgKiAgICAgICAgICAgICAgICBvciB7QGxpbmsgTm9kZX0gQiBvZiB0aGlzIDxjb2RlPkVkZ2U8L2NvZGU+LgorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwlOb2RlIGdldE90aGVyTm9kZShmaW5hbCBOb2RlIG5vZGUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgRWRnZUxhYmVsfSBvZiB0aGUgPGNvZGU+RWRnZTwvY29kZT4sIGlmIGl0IGV4aXN0cy4KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIG9wcG9zaXRlPSJlZGdlIgorCSAqLworCUVkZ2VMYWJlbCBnZXRMYWJlbCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2UjZ2V0TGFiZWwgPGVtPkxhYmVsPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYWJlbDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0TGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldExhYmVsKEVkZ2VMYWJlbCB2YWx1ZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSA8Y29kZT5FZGdlPC9jb2RlPiBpcyBhIGRpcmVjdGVkCisJICogICAgICAgICA8Y29kZT5FZGdlPC9jb2RlPiAoZGlyZWN0ZWQgPGNvZGU+RWRnZTwvY29kZT5zIGFyZSBhbHdheXMKKwkgKiAgICAgICAgIGZyb20ge0BsaW5rIE5vZGV9IEEgdG8ge0BsaW5rIE5vZGV9IEIpLgorCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIKKwkgKi8KKwlib29sZWFuIGlzRGlyZWN0ZWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlI2lzRGlyZWN0ZWQgPGVtPkRpcmVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlyZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzRGlyZWN0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERpcmVjdGVkKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogQHBhcmFtIG5vZGUKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgTm9kZX0gdW5kZXIgdGVzdAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPkVkZ2U8L2NvZGU+IGlzIGEgZGlyZWN0ZWQKKwkgKiAgICAgICAgIDxjb2RlPkVkZ2U8L2NvZGU+IGFuZCB0aGUge0BsaW5rIE5vZGV9IHVuZGVyIHRlc3QgaXMKKwkgKiAgICAgICAgIHtAbGluayBOb2RlfSBCLgorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwlib29sZWFuIGlzRGlyZWN0ZWRBdChmaW5hbCBOb2RlIG5vZGUpOworCit9IC8vIEVkZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL0VkZ2VMYWJlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvRWRnZUxhYmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiNGI1ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL0VkZ2VMYWJlbC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8vIEVkZ2VMYWJlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQW4gPGNvZGU+RWRnZUxhYmVsPC9jb2RlPiBpcyBhIHtAbGluayBMYWJlbH0gdGhhdCBwcm92aWRlcyBhdHRyaWJ1dGVzIHRvIGFuCisgKiB7QGxpbmsgRWRnZX0uCisgKiAKKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKKyAqLworcHVibGljIGludGVyZmFjZSBFZGdlTGFiZWwgZXh0ZW5kcyBMYWJlbCB7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgRWRnZX0gdGhhdCB0aGlzIDxjb2RlPkVkZ2VMYWJlbDwvY29kZT4gbGFiZWxzLgorCSAqIAorCSAqIEBtb2RlbCBjb250YWlubWVudD0iZmFsc2UiCisJICovCisJRWRnZSBnZXRFZGdlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZUxhYmVsI2dldEVkZ2UgPGVtPkVkZ2U8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FZGdlPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0RWRnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RWRnZShFZGdlIHZhbHVlKTsKKworfSAvLyBFZGdlTGFiZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL0dyYXBoLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9HcmFwaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNTY5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9HcmFwaC5qYXZhCkBAIC0wLDAgKzEsMzE0IEBACisvLyBHcmFwaC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZUZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CisKKy8qKgorICogQSA8Y29kZT5HcmFwaDwvY29kZT4gc2VydmVzIHR3byByb2xlcyBpbiB0aGUgU1RFTSBzeXN0ZW0uIFRoZSBmaXJzdCBpcyBhcworICogdGhlIGNhbm9uaWNhbCBkYXRhIHN0cnVjdHVyZSB0aGF0IGlzIHRoZSByZXByZXNlbnRhdGlvbmFsIGZyYW1ld29yayBmb3IgYWxsCisgKiBTVEVNIHNpbXVsYXRpb25zLiBJbiB0aGlzIGZvcm0sIGEgPGNvZGU+R3JhcGg8L2NvZGU+LCB3aXRoIG9uZSBleGNlcHRpb24sCisgKiBtYXRjaGVzIHRoZSB0aGVvcmV0aWNhbCBkZWZpbml0aW9uIG9mIGEgImdyYXBoIiBpbiB0aGF0IGl0IGhhcyBhIHNldCBvZgorICoge0BsaW5rIE5vZGV9cywgYSBzZXQgb2Yge0BsaW5rIEVkZ2V9cyBiZXR3ZWVuIG1lbWJlcnMgb2YgdGhlIHtAbGluayBOb2RlfQorICogc2V0LCBhbmQgYSBzZXQgb2Yge0BsaW5rIExhYmVsfXMgdGhhdCBsYWJlbCBlaXRoZXIgYSBtZW1iZXIgb2YgdGhlCisgKiB7QGxpbmsgTm9kZX0gc2V0IG9yIGEgbWVtYmVyIG9mIHRoZSB7QGxpbmsgRWRnZX0gc2V0LiBUaGUgb25lIGV4Y2VwdGlvbiBpcworICogdGhhdCBhbiBhZGRpdGlvbmFsIHNldCBvZiB7QGxpbmsgTGFiZWx9cyBkZXNpZ25hdGVkIGFzICJncmFwaCBsYWJlbHMiCisgKiBleGlzdHMuIFRoZXNlIHtAbGluayBMYWJlbH1zIGZ1bmN0aW9uIGFzICJnbG9iYWwgdmFyaWFibGVzIiBhbmQgd291bGQKKyAqIHR5cGljYWxseSBiZSB1c2VkIGR1cmluZyBhIHNpbXVsYXRpb24gdG8gaG9sZCBnbG9iYWwgc3RhdGUgaW5mb3JtYXRpb24gKGZvcgorICogaW5zdGFuY2UsIHBhcmFtZXRlcnMgcmVmZXJlbmNlZCBieSBhCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcn0gdGhhdCBjb250cm9sIGl0J3MKKyAqIGNvbXB1dGF0aW9ucyBvbiBhIGdyYXBoLXdpZGUgYmFzaXMsIGFuIGV4YW1wbGUgbWlnaHQgYmUgYSBkaXNlYXNlIG1vZGVsIHRoYXQKKyAqIGNhbiBjaGFuZ2UgdGhlIGluZmVjdGlvdXMgcmF0ZSBpdCB1c2VzIGJ5IHJlZmVyZW5jaW5nIHN1Y2ggYSBsYWJlbCkuCisgKiA8cD4KKyAqIFRoZSBzZWNvbmQgcm9sZSBwbGF5ZWQgYnkgYSA8Y29kZT5HcmFwaDwvY29kZT4gaXMgYXMgYSB1bml0IG9mIGNvbXBvc2l0aW9uCisgKiBpbiBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWx9LiBBCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsfSBmb3JtcyBhIHRyZWUgb2YKKyAqIDxjb2RlPkdyYXBoPC9jb2RlPnMgYW5kIHtAbGluayBNb2RlbH1zLiBUaGUgPGNvZGU+R3JhcGg8L2NvZGU+CisgKiBpbnN0YW5jZXMgYXJlIHRoZSBsZWF2ZXMgb2YgdGhlIHRyZWUgd2hpbGUgdGhlCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsfSBpbnN0YW5jZXMgYXJlIHRoZSByb290IGFuZAorICogaW5uZXIgbm9kZXMgb2YgdGhlIHRyZWUuIEluIHRoaXMgcm9sZSwgYSA8Y29kZT5HcmFwaDwvY29kZT4gbWF5IG5vdCBtZWV0CisgKiB0aGUgdGhlb3JldGljYWwgZGVmaW5pdGlvbiBvZiBhICJncmFwaCIuIFRoaXMgbWVhbnMgdGhhdCBpdCBtYXkgb25seSBoYXZlIGEKKyAqIHNldCBvZiB7QGxpbmsgTGFiZWx9cyBvciBhIHNldCBvZiB7QGxpbmsgRWRnZX1zLCBhbmQgbm8ge0BsaW5rIE5vZGV9cy4KKyAqIFRoaXMgImdyYXBoIGZyYWdtZW50IiBhbGxvd3Mgc2V0cyBvZiB7QGxpbmsgTGFiZWx9cyBhbmQge0BsaW5rIEVkZ2V9cyB0byBiZQorICogZGVmaW5lZCBhbmQgdGhlbiBsYXRlciBjb21iaW5lZCB3aXRoIGFuIGV4aXN0aW5nIDxjb2RlPkdyYXBoPC9jb2RlPiB0aGF0CisgKiBkb2VzIGhhdmUge0BsaW5rIE5vZGV9cy4gVGhpcyBjb21iaW5hdGlvbiBpcyBzcGVjaWZpZWQgYnkgYWRkaW5nIHRoZSBncmFwaAorICogZnJhZ21lbnQgdG8gYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsfSBpbnN0YW5jZS4gV2hlbgorICogdGhlIGNhbm9uaWNhbCA8Y29kZT5HcmFwaDwvY29kZT4gaXMgY3JlYXRlZCwgdGhlIHtAbGluayBMYWJlbH1zIGFuZAorICoge0BsaW5rIEVkZ2V9cyBhcmUgInJlc29sdmVkIiBieSBtYXRjaGluZyB0aGVpciB0YXJnZXQge0BsaW5rIFVSSX0ocykgd2l0aAorICogdGhvc2Ugb2YgdGhlIHtAbGluayBOb2RlfXMgaW4gdGhlIGNhbm9uaWNhbCA8Y29kZT5HcmFwaDwvY29kZT4gdW5kZXIKKyAqIGNvbnN0cnVjdGlvbi4gQW55IHN1Y2gge0BsaW5rIExhYmVsfXMgb3Ige0BsaW5rIEVkZ2V9cyB0aGF0IGFyZSB1bnJlc29sdmVkCisgKiBhcmUgcmVjb3JkZWQgYXMge0BsaW5rIFVucmVzb2x2ZWRJZGVudGlmaWFibGV9cy4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhlIDxjb2RlPkdyYXBoPC9jb2RlPiBoYXMgPGVtPmNvbnRhaW5tZW50PC9lbT4gcmVsYXRpb25zaGlwcyBmb3IKKyAqIHtAbGluayBOb2RlfXMsIHtAbGluayBFZGdlfXMgYW5kIHRoZSBsYWJlbHMgb24gbm9kZXMgKGkuZS4sCisgKiB7QGxpbmsgTm9kZUxhYmVsfXMpLiBUaGVzZSBzdXBwb3J0IHRoZSBncmFwaCBmcmFnbWVudCByb2xlIGJ5IGFsbG93aW5nIGEKKyAqIDxjb2RlPkdyYXBoPC9jb2RlPiB0byBjb250YWluIGFueSBvZiB0aGUgdGhyZWUgd2l0aG91dCB0aGUgb3RoZXJzLiBUaGUKKyAqIHtAbGluayBMYWJlbH1zIG9uIHtAbGluayBFZGdlfXMgYXJlIGNvbnRhaW5lZCBieSB0aGUge0BsaW5rIEVkZ2V9IGFzIGl0IGlzCisgKiBub3QgcG9zc2libGUgdG8gaGF2ZSBzdWNoIGEge0BsaW5rIExhYmVsfSB3aXRob3V0IHRoZSB7QGxpbmsgRWRnZX0uIE9ubHkgb25lCisgKiBzdWNoIHtAbGluayBMYWJlbH0gaXMgYWxsb3dlZCBwZXIge0BsaW5rIEVkZ2V9LgorICogPC9wPgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBkZWZpbml0aW9uIGlzIGFsc28gYW4gIkFubm90YXRlZCBKYXZhIEludGVyZmFjZSIgdGhhdCBkZWZpbmVzCisgKiBvbmUgY2xhc3MgaW4gYSA8YSBocmVmPSJodHRwOi8vd3d3LnVtbC5vcmcvIj5VTUw8L2E+ICJtb2RlbCIuIFRoZSBVTUwgY2xhc3MKKyAqIGRpYWdyYW0gZm9yIHRoZSBtb2RlbCBpcyBpbiB0aGUgPGNvZGU+ZG9jdW1lbnRhdGlvbjwvY29kZT4gZm9sZGVyIG9mIHRoZQorICogcHJvamVjdC4gVGhpcyBmaWxlIGFuZCB0aGUgb3RoZXIgaW50ZXJmYWNlcyBpbiB0aGlzIEphdmEgcGFja2FnZSBhcmUKKyAqIHByb2Nlc3NlZCBieSB0aGUgRWNsaXBzZSBNb2RlbGluZyBGcmFtZXdvcmsgKGFrYSBFTUYgPGEKKyAqIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS9lbWYiPmh0dHA6Ly9vcmcuZWNsaXBzZS9lbWY8L2E+KS4gdG8gYXV0b21hdGljYWxseQorICogZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsLiBFTUYgaXMgZG9jdW1lbnRlZCBpbiB0aGUgYm9vayA8YQorICogaHJlZj0iaHR0cDovL3d3dy5hd3Byb2Zlc3Npb25hbC5jb20vYm9va3N0b3JlL3Byb2R1Y3QuYXNwP2lzYm49MDEzMTQyNTQyMCZybD0xIj5FY2xpcHNlCisgKiBNb2RlbGluZyBGcmFtZXdvcmsgPC9hPiBieSBCdWRpbnNreSwgZXQgYWwuCisgKiA8L3A+CisgKiAKKyAqIEBzZWUgRWRnZQorICogQHNlZSBOb2RlCisgKiBAc2VlIExhYmVsCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbAorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgR3JhcGggZXh0ZW5kcyBJZGVudGlmaWFibGUgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VnbWVudCBvZiB0aGUgdHlwZSBVUkkgdGhhdCBwcmVmaXhlcyBhbGwgb3RoZXIgc2VnbWVudHMgaW4gYQorCSAqIGdyYXBoIFVSSS4KKwkgKi8KKwlTdHJpbmcgVVJJX1RZUEVfR1JBUEhfU0VHTUVOVCA9ICJncmFwaCI7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0aW1lIHRoYXQgdGhlIGR5bmFtaWMgbGFiZWwgdmFsdWVzIHdlcmUgbGFzdCB1cGRhdGVkLgorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgorCSAqLworCVNURU1UaW1lIGdldFRpbWUoKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0VGltZSA8ZW0+VGltZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGltZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0VGltZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VGltZShTVEVNVGltZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgbWFwLgorCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSX0sCisJICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZX0sCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob2RlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vZGVzPC9lbT4nIG1hcC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2UjZ2V0R3JhcGhfTm9kZXMoKQorCSAqIEBtb2RlbCBtYXBUeXBlPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguVVJJVG9Ob2RlTWFwRW50cnk8b3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlVSSSwgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU+IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTWFwPFVSSSwgTm9kZT4gZ2V0Tm9kZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVkZ2VzPC9iPjwvZW0+JyBtYXAuCisJICogVGhlIGtleSBpcyBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJfSwKKwkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlfSwKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVkZ2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWRnZXM8L2VtPicgbWFwLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZSNnZXRHcmFwaF9FZGdlcygpCisJICogQG1vZGVsIG1hcFR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5VUklUb0VkZ2VNYXBFbnRyeTxvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguVVJJLCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZT4iCisJICogQGdlbmVyYXRlZAorCSAqLworCUVNYXA8VVJJLCBFZGdlPiBnZXRFZGdlcygpOworCisJLyoqCisJICogQHJldHVybiB0aGUgbWFwIGJldHdlZW4ge0BsaW5rIFVSSX0gYW5kIHtAbGluayBMYWJlbH0gbGFiZWxpbmcgdGhlIHtAbGluayBHcmFwaH0KKwkgKiBAbW9kZWwga2V5VHlwZT0iVVJJIiB2YWx1ZVR5cGU9IkxhYmVsIiB2YWx1ZUNvbnRhaW5tZW50PSJ0cnVlIgorCSAqLworCUVNYXA8VVJJLCBMYWJlbD4gZ2V0R3JhcGhMYWJlbHMoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG1hcHBpbmcgYmV0d2VlbiB7QGxpbmsgVVJJfSBhbmQge0BsaW5rIE5vZGVMYWJlbH1zCisJICogQG1vZGVsIGtleVR5cGU9IlVSSSIgdmFsdWVUeXBlPSJOb2RlTGFiZWwiIHZhbHVlQ29udGFpbm1lbnQ9InRydWUiCisJICovCisJRU1hcDxVUkksIE5vZGVMYWJlbD4gZ2V0Tm9kZUxhYmVscygpOworCisJLyoqCisJICogQHBhcmFtIHR5cGVVUkkKKwkgKiAgICAgICAgICAgIHRoZSB0eXBlIHtAbGluayBVUkl9IG9mIHRoZSBkZXNpcmVkIHtAbGluayBOb2RlTGFiZWx9CisJICogQHJldHVybiBhIGxpc3Qgb2YgdGhlIHtAbGluayBOb2RlTGFiZWx9cyB0aGF0IG1hdGNoIGEgc3BlY2lmaWMgdHlwZSB7QGxpbmsgVVJJfQorCSAqIEBtb2RlbCB0eXBlPSJOb2RlTGFiZWwiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiCisJICogICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCUVMaXN0PE5vZGVMYWJlbD4gZ2V0Tm9kZUxhYmVsc0J5VHlwZVVSSShVUkkgdHlwZVVSSSk7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIGFkZEdyYXBoKEdyYXBoIGdyYXBoLCBJZGVudGlmaWFibGVGaWx0ZXIgZmlsdGVyKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogVGhpcyBjb2xsZWN0aW9uIG9mIExhYmVscyBjb250YWlucyByZWZlcmVuY2VzIHRvIEFMTCBvZiB0aGUKKwkgKiB7QGxpbmsgRHluYW1pY0xhYmVsfXMgaW4gdGhlIHtAbGluayBHcmFwaH0uIEl0IGlzIHVzZWQgYnkKKwkgKiB7QGxpbmsgI3N3aXRjaFRvTmV4dFZhbHVlKCl9IHRvIGZpbmQgZWFjaCBvZiB0aGUge0BsaW5rIER5bmFtaWNMYWJlbH1zCisJICogdGhhdCBuZWVkIHRvIHN3aXRjaCB2YWx1ZXMuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQG1vZGVsIHR5cGU9IkR5bmFtaWNMYWJlbCIgY29udGFpbm1lbnQ9ImZhbHNlIgorCSAqLworCUVMaXN0PER5bmFtaWNMYWJlbD4gZ2V0RHluYW1pY0xhYmVscygpOworCisJLyoqCisJICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGVjb3JhdG9yfXMgdGhhdCBkZWNvcmF0ZSB0aGlzIHtAbGluayBHcmFwaH0KKwkgKiBAbW9kZWwgdHlwZT0iRGVjb3JhdG9yIiBjb250YWlubWVudD0idHJ1ZSIgb3Bwb3NpdGU9ImdyYXBoIgorCSAqLworCUVMaXN0PERlY29yYXRvcj4gZ2V0RGVjb3JhdG9ycygpOworCQorCisJLyoqCisJICogUHV0IHRoZSB7QGxpbmsgRWRnZX0gaW50byB0aGUge0BsaW5rIEdyYXBofS4KKwkgKiAKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJdm9pZCBwdXRFZGdlKEVkZ2UgZWRnZSk7CisKKwkvKioKKwkgKiBHZXQgdGhlIHtAbGluayBFZGdlfSBmcm9tIHRoZSB7QGxpbmsgR3JhcGh9LgorCSAqIAorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwlFZGdlIGdldEVkZ2UoVVJJIHVyaSk7CisKKwkvKioKKwkgKiBQdXQgdGhlIHtAbGluayBOb2RlfSBpbnRvIHRoZSB7QGxpbmsgR3JhcGh9LgorCSAqIAorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwl2b2lkIHB1dE5vZGUoTm9kZSBub2RlKTsKKworCS8qKgorCSAqIEdldCB0aGUge0BsaW5rIE5vZGV9IGZyb20gdGhlIHtAbGluayBHcmFwaH0uCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCU5vZGUgZ2V0Tm9kZShVUkkgdXJpKTsKKworCS8qKgorCSAqIFB1dCB0aGUge0BsaW5rIE5vZGVMYWJlbH0gaW50byB0aGUge0BsaW5rIEdyYXBofS4KKwkgKiAKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJdm9pZCBwdXROb2RlTGFiZWwoTm9kZUxhYmVsIGxhYmVsKTsKKworCS8qKgorCSAqIEdldCB0aGUge0BsaW5rIE5vZGVMYWJlbH0gZnJvbSB0aGUge0BsaW5rIEdyYXBofS4KKwkgKiAKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJTm9kZUxhYmVsIGdldE5vZGVMYWJlbChVUkkgdXJpKTsKKworCS8qKgorCSAqIFB1dCB0aGUgR3JhcGgge0BsaW5rIExhYmVsfSBpbnRvIHRoZSB7QGxpbmsgR3JhcGh9LgorCSAqIAorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwl2b2lkIHB1dEdyYXBoTGFiZWwoTGFiZWwgbGFiZWwpOworCisJLyoqCisJICogR2V0IHRoZSBHcmFwaCB7QGxpbmsgTGFiZWx9IGZyb20gdGhlIHtAbGluayBHcmFwaH0uCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCUxhYmVsIGdldEdyYXBoTGFiZWwoVVJJIHVyaSk7CisKKwkvKioKKwkgKiBBZGQgdGhlIHtAbGluayBEeW5hbWljTGFiZWx9IGludG8gdGhlIHtAbGluayBHcmFwaH0uCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCXZvaWQgYWRkRHluYW1pY0xhYmVsKER5bmFtaWNMYWJlbCBkeW5hbWljbGFiZWwpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBudW1iZXIgb2Yge0BsaW5rIEVkZ2V9cyBpbiB0aGlzIHtAbGluayBHcmFwaH0uCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCWludCBnZXROdW1FZGdlcygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBudW1iZXIgb2Yge0BsaW5rIE5vZGV9cyBpbiB0aGlzIHtAbGluayBHcmFwaH0uCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCWludCBnZXROdW1Ob2RlcygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBudW1iZXIgb2YgR3JhcGgge0BsaW5rIExhYmVsfSBpbiB0aGlzIHtAbGluayBHcmFwaH0uCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCWludCBnZXROdW1HcmFwaExhYmVscygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBudW1iZXIgb2Yge0BsaW5rIE5vZGVMYWJlbH1zIGluIHRoaXMge0BsaW5rIEdyYXBofS4KKwkgKiAKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJaW50IGdldE51bU5vZGVMYWJlbHMoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHtAbGluayBEeW5hbWljTGFiZWx9cyBpbiB0aGlzIHtAbGluayBHcmFwaH0uCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCWludCBnZXROdW1EeW5hbWljTGFiZWxzKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiB0aGF0IHtAbGluayBVbnJlc29sdmVkSWRlbnRpZmlhYmxlfSBpbnN0YW5jZXMgdGhhdCBzcGVjaWZ5CisJICogICAgICAgICB0aGUge0BsaW5rIFVSSX0ncyBpbiBhbiB7QGxpbmsgSWRlbnRpZmlhYmxlfSB0aGF0IGNvdWxkIG5vdCBiZSByZXNvbHZlZC4KKwkgKiAKKwkgKiBAbW9kZWwgdHlwZT0iVW5yZXNvbHZlZElkZW50aWZpYWJsZSIgY29udGFpbm1lbnQ9InRydWUiCisJICovCisJRUxpc3Q8VW5yZXNvbHZlZElkZW50aWZpYWJsZT4gZ2V0VW5yZXNvbHZlZElkZW50aWZpYWJsZXMoKTsKKworCS8qKgorCSAqIE1ha2UgYWxsIG9mIHRoZSB7QGxpbmsgRHluYW1pY0xhYmVsfXMgaW4gdGhlIG1vZGVsIHN3aXRjaCB0byB0aGVpciAibmV4dCIgdmFsdWUuCisJICogVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBtb3ZpbmcgdGhlIHN0YXRlIG9mIHRoZSBtb2RlbCB0byBpdHMgYWdncmVnYXRlCisJICogdmFsdWUgYXQgdGhlIG5leHQgdGltZSBwZXJpb2QuCisJICogCisJICogQHBhcmFtIGN1cnJlbnRUaW1lCisJICogCQl0aGUgdGltZSB2YWx1ZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgbmV3IHZhbHVlLiAgCisJICogQHNlZSAjZ2V0VGltZSgpCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCXZvaWQgc3dpdGNoVG9OZXh0VmFsdWUoZmluYWwgU1RFTVRpbWUgY3VycmVudFRpbWUpOworCit9IC8vIEdyYXBoCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9HcmFwaEZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL0dyYXBoRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMzdkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9HcmFwaEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDc4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEdyYXBoRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUdyYXBoRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaEZhY3RvcnlJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWRnZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWRnZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRWRnZSBjcmVhdGVFZGdlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyYXBoPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HcmFwaDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJR3JhcGggY3JlYXRlR3JhcGgoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Tm9kZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Tm9kZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTm9kZSBjcmVhdGVOb2RlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlVucmVzb2x2ZWQgSWRlbnRpZmlhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5VbnJlc29sdmVkIElkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVW5yZXNvbHZlZElkZW50aWZpYWJsZSBjcmVhdGVVbnJlc29sdmVkSWRlbnRpZmlhYmxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogQGdlbmVyYXRlZAorCSAqLworCUdyYXBoUGFja2FnZSBnZXRHcmFwaFBhY2thZ2UoKTsKKworfSAvL0dyYXBoRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvR3JhcGhQYWNrYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9HcmFwaFBhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDJmYjljCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvR3JhcGhQYWNrYWdlLmphdmEKQEAgLTAsMCArMSwyODM4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaEZhY3RvcnkKKyAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEdyYXBoUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTkFNRSA9ICJncmFwaCI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaCI7CisKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUdyYXBoUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxJbXBsIDxlbT5MYWJlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkxhYmVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhQYWNrYWdlSW1wbCNnZXRMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBMQUJFTCA9IDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTEFCRUxfX1VSSSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMQUJFTF9fVFlQRV9VUkkgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMQUJFTF9fRFVCTElOX0NPUkUgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMQUJFTF9fQ1VSUkVOVF9WQUxVRSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkZW50aWZpYWJsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExBQkVMX19JREVOVElGSUFCTEUgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5MYWJlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMQUJFTF9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkR5bmFtaWNMYWJlbEltcGwgPGVtPkR5bmFtaWMgTGFiZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5EeW5hbWljTGFiZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsI2dldER5bmFtaWNMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBEWU5BTUlDX0xBQkVMID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEWU5BTUlDX0xBQkVMX19VUkkgPSBMQUJFTF9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFlOQU1JQ19MQUJFTF9fVFlQRV9VUkkgPSBMQUJFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEWU5BTUlDX0xBQkVMX19EVUJMSU5fQ09SRSA9IExBQkVMX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkkgT2YgSWRlbnRpZmlhYmxlIFRvIEJlIExhYmVsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEWU5BTUlDX0xBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQgPSBMQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEWU5BTUlDX0xBQkVMX19DVVJSRU5UX1ZBTFVFID0gTEFCRUxfX0NVUlJFTlRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRlbnRpZmlhYmxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFlOQU1JQ19MQUJFTF9fSURFTlRJRklBQkxFID0gTEFCRUxfX0lERU5USUZJQUJMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlIFZhbGlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFlOQU1JQ19MQUJFTF9fTkVYVF9WQUxVRV9WQUxJRCA9IExBQkVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5leHQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEWU5BTUlDX0xBQkVMX19ORVhUX1ZBTFVFID0gTEFCRUxfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVjb3JhdG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFlOQU1JQ19MQUJFTF9fREVDT1JBVE9SID0gTEFCRUxfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RHluYW1pYyBMYWJlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEWU5BTUlDX0xBQkVMX0ZFQVRVUkVfQ09VTlQgPSBMQUJFTF9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuRHluYW1pY05vZGVMYWJlbEltcGwgPGVtPkR5bmFtaWMgTm9kZSBMYWJlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkR5bmFtaWNOb2RlTGFiZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsI2dldER5bmFtaWNOb2RlTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgRFlOQU1JQ19OT0RFX0xBQkVMID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEWU5BTUlDX05PREVfTEFCRUxfX1VSSSA9IERZTkFNSUNfTEFCRUxfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERZTkFNSUNfTk9ERV9MQUJFTF9fVFlQRV9VUkkgPSBEWU5BTUlDX0xBQkVMX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERZTkFNSUNfTk9ERV9MQUJFTF9fRFVCTElOX0NPUkUgPSBEWU5BTUlDX0xBQkVMX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkkgT2YgSWRlbnRpZmlhYmxlIFRvIEJlIExhYmVsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEWU5BTUlDX05PREVfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCA9IERZTkFNSUNfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFlOQU1JQ19OT0RFX0xBQkVMX19DVVJSRU5UX1ZBTFVFID0gRFlOQU1JQ19MQUJFTF9fQ1VSUkVOVF9WQUxVRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZGVudGlmaWFibGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEWU5BTUlDX05PREVfTEFCRUxfX0lERU5USUZJQUJMRSA9IERZTkFNSUNfTEFCRUxfX0lERU5USUZJQUJMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlIFZhbGlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFlOQU1JQ19OT0RFX0xBQkVMX19ORVhUX1ZBTFVFX1ZBTElEID0gRFlOQU1JQ19MQUJFTF9fTkVYVF9WQUxVRV9WQUxJRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFlOQU1JQ19OT0RFX0xBQkVMX19ORVhUX1ZBTFVFID0gRFlOQU1JQ19MQUJFTF9fTkVYVF9WQUxVRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWNvcmF0b3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEWU5BTUlDX05PREVfTEFCRUxfX0RFQ09SQVRPUiA9IERZTkFNSUNfTEFCRUxfX0RFQ09SQVRPUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFlOQU1JQ19OT0RFX0xBQkVMX19OT0RFID0gRFlOQU1JQ19MQUJFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EeW5hbWljIE5vZGUgTGFiZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFlOQU1JQ19OT0RFX0xBQkVMX0ZFQVRVUkVfQ09VTlQgPSBEWU5BTUlDX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5FZGdlSW1wbCA8ZW0+RWRnZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkVkZ2VJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsI2dldEVkZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgRURHRSA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRURHRV9fVVJJID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVER0VfX1RZUEVfVVJJID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRURHRV9fRFVCTElOX0NPUkUgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVER0VfX0EgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlIEFVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFREdFX19OT0RFX0FVUkkgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRURHRV9fQiA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGUgQlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVER0VfX05PREVfQlVSSSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRURHRV9fTEFCRUwgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXJlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVER0VfX0RJUkVDVEVEID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RWRnZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFREdFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgNjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhJbXBsIDxlbT5HcmFwaDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhQYWNrYWdlSW1wbCNnZXRHcmFwaCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBHUkFQSCA9IDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR1JBUEhfX1VSSSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUkFQSF9fVFlQRV9VUkkgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUkFQSF9fRFVCTElOX0NPUkUgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWRnZXM8L2I+PC9lbT4nIG1hcC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUkFQSF9fRURHRVMgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgbWFwLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdSQVBIX19OT0RFUyA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIExhYmVsczwvYj48L2VtPicgbWFwLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdSQVBIX19HUkFQSF9MQUJFTFMgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlIExhYmVsczwvYj48L2VtPicgbWFwLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdSQVBIX19OT0RFX0xBQkVMUyA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR5bmFtaWMgTGFiZWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUkFQSF9fRFlOQU1JQ19MQUJFTFMgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdW0gRWRnZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUkFQSF9fTlVNX0VER0VTID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVtIE5vZGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR1JBUEhfX05VTV9OT0RFUyA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk51bSBHcmFwaCBMYWJlbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUkFQSF9fTlVNX0dSQVBIX0xBQkVMUyA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyA3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk51bSBOb2RlIExhYmVsczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdSQVBIX19OVU1fTk9ERV9MQUJFTFMgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdW0gRHluYW1pYyBMYWJlbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUkFQSF9fTlVNX0RZTkFNSUNfTEFCRUxTID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5yZXNvbHZlZCBJZGVudGlmaWFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUkFQSF9fVU5SRVNPTFZFRF9JREVOVElGSUFCTEVTID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDEwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlY29yYXRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdSQVBIX19ERUNPUkFUT1JTID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDExOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUkFQSF9fVElNRSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HcmFwaDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUkFQSF9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDEzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIgPGVtPlNhbml0eSBDaGVja2VyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsI2dldFNhbml0eUNoZWNrZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU0FOSVRZX0NIRUNLRVIgPSAxMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQU5JVFlfQ0hFQ0tFUl9GRUFUVVJFX0NPVU5UID0gMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxWYWx1ZUltcGwgPGVtPkxhYmVsIFZhbHVlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxWYWx1ZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGwjZ2V0TGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBMQUJFTF9WQUxVRSA9IDU7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TGFiZWwgVmFsdWU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCA9IFNBTklUWV9DSEVDS0VSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5Ob2RlSW1wbCA8ZW0+Tm9kZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLk5vZGVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsI2dldE5vZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgTk9ERSA9IDY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTk9ERV9fVVJJID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE5PREVfX1RZUEVfVVJJID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTk9ERV9fRFVCTElOX0NPUkUgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWRnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE5PREVfX0VER0VTID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBOT0RFX19MQUJFTFMgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Ob2RlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE5PREVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5Ob2RlTGFiZWxJbXBsIDxlbT5Ob2RlIExhYmVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTm9kZUxhYmVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhQYWNrYWdlSW1wbCNnZXROb2RlTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgTk9ERV9MQUJFTCA9IDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTk9ERV9MQUJFTF9fVVJJID0gTEFCRUxfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE5PREVfTEFCRUxfX1RZUEVfVVJJID0gTEFCRUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTk9ERV9MQUJFTF9fRFVCTElOX0NPUkUgPSBMQUJFTF9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTk9ERV9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEID0gTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTk9ERV9MQUJFTF9fQ1VSUkVOVF9WQUxVRSA9IExBQkVMX19DVVJSRU5UX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkZW50aWZpYWJsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE5PREVfTEFCRUxfX0lERU5USUZJQUJMRSA9IExBQkVMX19JREVOVElGSUFCTEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE5PREVfTEFCRUxfX05PREUgPSBMQUJFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Ob2RlIExhYmVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE5PREVfTEFCRUxfRkVBVFVSRV9DT1VOVCA9IExBQkVMX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5TdGF0aWNOb2RlTGFiZWxJbXBsIDxlbT5TdGF0aWMgTm9kZSBMYWJlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLlN0YXRpY05vZGVMYWJlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGwjZ2V0U3RhdGljTm9kZUxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNUQVRJQ19OT0RFX0xBQkVMID0gODsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuVW5yZXNvbHZlZElkZW50aWZpYWJsZUltcGwgPGVtPlVucmVzb2x2ZWQgSWRlbnRpZmlhYmxlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuVW5yZXNvbHZlZElkZW50aWZpYWJsZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGwjZ2V0VW5yZXNvbHZlZElkZW50aWZpYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBVTlJFU09MVkVEX0lERU5USUZJQUJMRSA9IDk7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLlVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnlJbXBsIDxlbT5VUkkgVG8gSWRlbnRpZmlhYmxlIE1hcCBFbnRyeTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLlVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnlJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsI2dldFVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVVJJX1RPX0lERU5USUZJQUJMRV9NQVBfRU5UUlkgPSAxMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuRWRnZUxhYmVsSW1wbCA8ZW0+RWRnZSBMYWJlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkVkZ2VMYWJlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGwjZ2V0RWRnZUxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEVER0VfTEFCRUwgPSAxMzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuRHluYW1pY0VkZ2VMYWJlbEltcGwgPGVtPkR5bmFtaWMgRWRnZSBMYWJlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkR5bmFtaWNFZGdlTGFiZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsI2dldER5bmFtaWNFZGdlTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgRFlOQU1JQ19FREdFX0xBQkVMID0gMTI7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLlN0YXRpY0VkZ2VMYWJlbEltcGwgPGVtPlN0YXRpYyBFZGdlIExhYmVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuU3RhdGljRWRnZUxhYmVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhQYWNrYWdlSW1wbCNnZXRTdGF0aWNFZGdlTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU1RBVElDX0VER0VfTEFCRUwgPSAxNDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuVVJJVG9FZGdlTWFwRW50cnlJbXBsIDxlbT5VUkkgVG8gRWRnZSBNYXAgRW50cnk8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5VUklUb0VkZ2VNYXBFbnRyeUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGwjZ2V0VVJJVG9FZGdlTWFwRW50cnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVVJJX1RPX0VER0VfTUFQX0VOVFJZID0gMTU7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLlVSSVRvTm9kZU1hcEVudHJ5SW1wbCA8ZW0+VVJJIFRvIE5vZGUgTWFwIEVudHJ5PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuVVJJVG9Ob2RlTWFwRW50cnlJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsI2dldFVSSVRvTm9kZU1hcEVudHJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFVSSV9UT19OT0RFX01BUF9FTlRSWSA9IDE2OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5VUklUb0xhYmVsTWFwRW50cnlJbXBsIDxlbT5VUkkgVG8gTGFiZWwgTWFwIEVudHJ5PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuVVJJVG9MYWJlbE1hcEVudHJ5SW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhQYWNrYWdlSW1wbCNnZXRVUklUb0xhYmVsTWFwRW50cnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVVJJX1RPX0xBQkVMX01BUF9FTlRSWSA9IDE3OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5VUklUb05vZGVMYWJlbE1hcEVudHJ5SW1wbCA8ZW0+VVJJIFRvIE5vZGUgTGFiZWwgTWFwIEVudHJ5PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuVVJJVG9Ob2RlTGFiZWxNYXBFbnRyeUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGwjZ2V0VVJJVG9Ob2RlTGFiZWxNYXBFbnRyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBVUklfVE9fTk9ERV9MQUJFTF9NQVBfRU5UUlkgPSAxODsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuU3RhdGljTGFiZWxJbXBsIDxlbT5TdGF0aWMgTGFiZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5TdGF0aWNMYWJlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGwjZ2V0U3RhdGljTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU1RBVElDX0xBQkVMID0gMTk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBVElDX05PREVfTEFCRUxfX1VSSSA9IE5PREVfTEFCRUxfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQVRJQ19OT0RFX0xBQkVMX19UWVBFX1VSSSA9IE5PREVfTEFCRUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBVElDX05PREVfTEFCRUxfX0RVQkxJTl9DT1JFID0gTk9ERV9MQUJFTF9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBVElDX05PREVfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCA9IE5PREVfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBVElDX05PREVfTEFCRUxfX0NVUlJFTlRfVkFMVUUgPSBOT0RFX0xBQkVMX19DVVJSRU5UX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkZW50aWZpYWJsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQVRJQ19OT0RFX0xBQkVMX19JREVOVElGSUFCTEUgPSBOT0RFX0xBQkVMX19JREVOVElGSUFCTEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQVRJQ19OT0RFX0xBQkVMX19OT0RFID0gTk9ERV9MQUJFTF9fTk9ERTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TdGF0aWMgTm9kZSBMYWJlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFUSUNfTk9ERV9MQUJFTF9GRUFUVVJFX0NPVU5UID0gTk9ERV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2VuYXJpbzwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFVOUkVTT0xWRURfSURFTlRJRklBQkxFX19TQ0VOQVJJTyA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kZWw8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBVTlJFU09MVkVEX0lERU5USUZJQUJMRV9fTU9ERUwgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfX0dSQVBIID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZGVudGlmaWFibGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBVTlJFU09MVkVEX0lERU5USUZJQUJMRV9fSURFTlRJRklBQkxFID0gMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbnJlc29sdmVkIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFVOUkVTT0xWRURfSURFTlRJRklBQkxFX19VTlJFU09MVkVEX1VSSSA9IDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFVOUkVTT0xWRURfSURFTlRJRklBQkxFX19GSUVMRF9OQU1FID0gNTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5VbnJlc29sdmVkIElkZW50aWZpYWJsZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBVTlJFU09MVkVEX0lERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UID0gNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBVUklfVE9fSURFTlRJRklBQkxFX01BUF9FTlRSWV9fS0VZID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFVSSV9UT19JREVOVElGSUFCTEVfTUFQX0VOVFJZX19WQUxVRSA9IDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VVJJIFRvIElkZW50aWZpYWJsZSBNYXAgRW50cnk8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVVJJX1RPX0lERU5USUZJQUJMRV9NQVBfRU5UUllfRkVBVFVSRV9DT1VOVCA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFlOQU1JQ19FREdFX0xBQkVMX19VUkkgPSBEWU5BTUlDX0xBQkVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEWU5BTUlDX0VER0VfTEFCRUxfX1RZUEVfVVJJID0gRFlOQU1JQ19MQUJFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEWU5BTUlDX0VER0VfTEFCRUxfX0RVQkxJTl9DT1JFID0gRFlOQU1JQ19MQUJFTF9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFlOQU1JQ19FREdFX0xBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQgPSBEWU5BTUlDX0xBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERZTkFNSUNfRURHRV9MQUJFTF9fQ1VSUkVOVF9WQUxVRSA9IERZTkFNSUNfTEFCRUxfX0NVUlJFTlRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRlbnRpZmlhYmxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFlOQU1JQ19FREdFX0xBQkVMX19JREVOVElGSUFCTEUgPSBEWU5BTUlDX0xBQkVMX19JREVOVElGSUFCTEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBWYWx1ZSBWYWxpZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERZTkFNSUNfRURHRV9MQUJFTF9fTkVYVF9WQUxVRV9WQUxJRCA9IERZTkFNSUNfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERZTkFNSUNfRURHRV9MQUJFTF9fTkVYVF9WQUxVRSA9IERZTkFNSUNfTEFCRUxfX05FWFRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVjb3JhdG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRFlOQU1JQ19FREdFX0xBQkVMX19ERUNPUkFUT1IgPSBEWU5BTUlDX0xBQkVMX19ERUNPUkFUT1I7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWRnZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEWU5BTUlDX0VER0VfTEFCRUxfX0VER0UgPSBEWU5BTUlDX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkR5bmFtaWMgRWRnZSBMYWJlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEWU5BTUlDX0VER0VfTEFCRUxfRkVBVFVSRV9DT1VOVCA9IERZTkFNSUNfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRURHRV9MQUJFTF9fVVJJID0gTEFCRUxfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVER0VfTEFCRUxfX1RZUEVfVVJJID0gTEFCRUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRURHRV9MQUJFTF9fRFVCTElOX0NPUkUgPSBMQUJFTF9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRURHRV9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEID0gTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRURHRV9MQUJFTF9fQ1VSUkVOVF9WQUxVRSA9IExBQkVMX19DVVJSRU5UX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkZW50aWZpYWJsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVER0VfTEFCRUxfX0lERU5USUZJQUJMRSA9IExBQkVMX19JREVOVElGSUFCTEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWRnZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFREdFX0xBQkVMX19FREdFID0gTEFCRUxfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RWRnZSBMYWJlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFREdFX0xBQkVMX0ZFQVRVUkVfQ09VTlQgPSBMQUJFTF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFUSUNfRURHRV9MQUJFTF9fVVJJID0gRURHRV9MQUJFTF9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBVElDX0VER0VfTEFCRUxfX1RZUEVfVVJJID0gRURHRV9MQUJFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFUSUNfRURHRV9MQUJFTF9fRFVCTElOX0NPUkUgPSBFREdFX0xBQkVMX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkkgT2YgSWRlbnRpZmlhYmxlIFRvIEJlIExhYmVsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFUSUNfRURHRV9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEID0gRURHRV9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFUSUNfRURHRV9MQUJFTF9fQ1VSUkVOVF9WQUxVRSA9IEVER0VfTEFCRUxfX0NVUlJFTlRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRlbnRpZmlhYmxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBVElDX0VER0VfTEFCRUxfX0lERU5USUZJQUJMRSA9IEVER0VfTEFCRUxfX0lERU5USUZJQUJMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FZGdlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQVRJQ19FREdFX0xBQkVMX19FREdFID0gRURHRV9MQUJFTF9fRURHRTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TdGF0aWMgRWRnZSBMYWJlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFUSUNfRURHRV9MQUJFTF9GRUFUVVJFX0NPVU5UID0gRURHRV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBVUklfVE9fRURHRV9NQVBfRU5UUllfX0tFWSA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBVUklfVE9fRURHRV9NQVBfRU5UUllfX1ZBTFVFID0gMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5VUkkgVG8gRWRnZSBNYXAgRW50cnk8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVVJJX1RPX0VER0VfTUFQX0VOVFJZX0ZFQVRVUkVfQ09VTlQgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFVSSV9UT19OT0RFX01BUF9FTlRSWV9fS0VZID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFVSSV9UT19OT0RFX01BUF9FTlRSWV9fVkFMVUUgPSAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlVSSSBUbyBOb2RlIE1hcCBFbnRyeTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBVUklfVE9fTk9ERV9NQVBfRU5UUllfRkVBVFVSRV9DT1VOVCA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVVJJX1RPX0xBQkVMX01BUF9FTlRSWV9fS0VZID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFVSSV9UT19MQUJFTF9NQVBfRU5UUllfX1ZBTFVFID0gMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5VUkkgVG8gTGFiZWwgTWFwIEVudHJ5PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFVSSV9UT19MQUJFTF9NQVBfRU5UUllfRkVBVFVSRV9DT1VOVCA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVVJJX1RPX05PREVfTEFCRUxfTUFQX0VOVFJZX19LRVkgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVVJJX1RPX05PREVfTEFCRUxfTUFQX0VOVFJZX19WQUxVRSA9IDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VVJJIFRvIE5vZGUgTGFiZWwgTWFwIEVudHJ5PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFVSSV9UT19OT0RFX0xBQkVMX01BUF9FTlRSWV9GRUFUVVJFX0NPVU5UID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFUSUNfTEFCRUxfX1VSSSA9IExBQkVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFUSUNfTEFCRUxfX1RZUEVfVVJJID0gTEFCRUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBVElDX0xBQkVMX19EVUJMSU5fQ09SRSA9IExBQkVMX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkkgT2YgSWRlbnRpZmlhYmxlIFRvIEJlIExhYmVsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFUSUNfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCA9IExBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQVRJQ19MQUJFTF9fQ1VSUkVOVF9WQUxVRSA9IExBQkVMX19DVVJSRU5UX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkZW50aWZpYWJsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQVRJQ19MQUJFTF9fSURFTlRJRklBQkxFID0gTEFCRUxfX0lERU5USUZJQUJMRTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TdGF0aWMgTGFiZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBVElDX0xBQkVMX0ZFQVRVUkVfQ09VTlQgPSBMQUJFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VVJJPC9lbT4nIGRhdGEgdHlwZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhQYWNrYWdlSW1wbCNnZXRVUkkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVVJJID0gMjA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPklsbGVnYWwgQXJndW1lbnQgRXhjZXB0aW9uPC9lbT4nIGRhdGEgdHlwZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhQYWNrYWdlSW1wbCNnZXRJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgSUxMRUdBTF9BUkdVTUVOVF9FWENFUFRJT04gPSAyMTsKKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbCA8ZW0+RHluYW1pYyBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EeW5hbWljIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RHluYW1pY0xhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWwjaXNOZXh0VmFsdWVWYWxpZCA8ZW0+TmV4dCBWYWx1ZSBWYWxpZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5leHQgVmFsdWUgVmFsaWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsI2lzTmV4dFZhbHVlVmFsaWQoKQorCSAqIEBzZWUgI2dldER5bmFtaWNMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RHluYW1pY0xhYmVsX05leHRWYWx1ZVZhbGlkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWwjZ2V0TmV4dFZhbHVlIDxlbT5OZXh0IFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TmV4dCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWwjZ2V0TmV4dFZhbHVlKCkKKwkgKiBAc2VlICNnZXREeW5hbWljTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldER5bmFtaWNMYWJlbF9OZXh0VmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbCNnZXREZWNvcmF0b3IgPGVtPkRlY29yYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkRlY29yYXRvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWwjZ2V0RGVjb3JhdG9yKCkKKwkgKiBAc2VlICNnZXREeW5hbWljTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldER5bmFtaWNMYWJlbF9EZWNvcmF0b3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTm9kZUxhYmVsIDxlbT5EeW5hbWljIE5vZGUgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RHluYW1pYyBOb2RlIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNOb2RlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldER5bmFtaWNOb2RlTGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlIDxlbT5FZGdlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVkZ2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RWRnZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZSNnZXRBIDxlbT5BPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlI2dldEEoKQorCSAqIEBzZWUgI2dldEVkZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEVkZ2VfQSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZSNnZXROb2RlQVVSSSA8ZW0+Tm9kZSBBVVJJPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm9kZSBBVVJJPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2UjZ2V0Tm9kZUFVUkkoKQorCSAqIEBzZWUgI2dldEVkZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEVkZ2VfTm9kZUFVUkkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2UjZ2V0QiA8ZW0+QjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZSNnZXRCKCkKKwkgKiBAc2VlICNnZXRFZGdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRFZGdlX0IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2UjZ2V0Tm9kZUJVUkkgPGVtPk5vZGUgQlVSSTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vZGUgQlVSSTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlI2dldE5vZGVCVVJJKCkKKwkgKiBAc2VlICNnZXRFZGdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRFZGdlX05vZGVCVVJJKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlI2dldExhYmVsIDxlbT5MYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkxhYmVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2UjZ2V0TGFiZWwoKQorCSAqIEBzZWUgI2dldEVkZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEVkZ2VfTGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2UjaXNEaXJlY3RlZCA8ZW0+RGlyZWN0ZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaXJlY3RlZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlI2lzRGlyZWN0ZWQoKQorCSAqIEBzZWUgI2dldEVkZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEVkZ2VfRGlyZWN0ZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCA8ZW0+R3JhcGg8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3JhcGg8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEdyYXBoKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNnZXRHcmFwaExhYmVscyA8ZW0+R3JhcGggTGFiZWxzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+R3JhcGggTGFiZWxzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldEdyYXBoTGFiZWxzKCkKKwkgKiBAc2VlICNnZXRHcmFwaCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0R3JhcGhfR3JhcGhMYWJlbHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldE5vZGVMYWJlbHMgPGVtPk5vZGUgTGFiZWxzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+Tm9kZSBMYWJlbHM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0Tm9kZUxhYmVscygpCisJICogQHNlZSAjZ2V0R3JhcGgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEdyYXBoX05vZGVMYWJlbHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0RHluYW1pY0xhYmVscyA8ZW0+RHluYW1pYyBMYWJlbHM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkR5bmFtaWMgTGFiZWxzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldER5bmFtaWNMYWJlbHMoKQorCSAqIEBzZWUgI2dldEdyYXBoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRHcmFwaF9EeW5hbWljTGFiZWxzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNnZXROdW1FZGdlcyA8ZW0+TnVtIEVkZ2VzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TnVtIEVkZ2VzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldE51bUVkZ2VzKCkKKwkgKiBAc2VlICNnZXRHcmFwaCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0R3JhcGhfTnVtRWRnZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldE51bU5vZGVzIDxlbT5OdW0gTm9kZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OdW0gTm9kZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0TnVtTm9kZXMoKQorCSAqIEBzZWUgI2dldEdyYXBoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRHcmFwaF9OdW1Ob2RlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0TnVtR3JhcGhMYWJlbHMgPGVtPk51bSBHcmFwaCBMYWJlbHM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OdW0gR3JhcGggTGFiZWxzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldE51bUdyYXBoTGFiZWxzKCkKKwkgKiBAc2VlICNnZXRHcmFwaCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0R3JhcGhfTnVtR3JhcGhMYWJlbHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldE51bU5vZGVMYWJlbHMgPGVtPk51bSBOb2RlIExhYmVsczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk51bSBOb2RlIExhYmVsczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNnZXROdW1Ob2RlTGFiZWxzKCkKKwkgKiBAc2VlICNnZXRHcmFwaCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0R3JhcGhfTnVtTm9kZUxhYmVscygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0TnVtRHluYW1pY0xhYmVscyA8ZW0+TnVtIER5bmFtaWMgTGFiZWxzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TnVtIER5bmFtaWMgTGFiZWxzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldE51bUR5bmFtaWNMYWJlbHMoKQorCSAqIEBzZWUgI2dldEdyYXBoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRHcmFwaF9OdW1EeW5hbWljTGFiZWxzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldFVucmVzb2x2ZWRJZGVudGlmaWFibGVzIDxlbT5VbnJlc29sdmVkIElkZW50aWZpYWJsZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlVucmVzb2x2ZWQgSWRlbnRpZmlhYmxlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNnZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlcygpCisJICogQHNlZSAjZ2V0R3JhcGgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEdyYXBoX1VucmVzb2x2ZWRJZGVudGlmaWFibGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldERlY29yYXRvcnMgPGVtPkRlY29yYXRvcnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlY29yYXRvcnM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0RGVjb3JhdG9ycygpCisJICogQHNlZSAjZ2V0R3JhcGgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEdyYXBoX0RlY29yYXRvcnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldFRpbWUgPGVtPlRpbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5UaW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldFRpbWUoKQorCSAqIEBzZWUgI2dldEdyYXBoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRHcmFwaF9UaW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNnZXROb2RlcyA8ZW0+Tm9kZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJzxlbT5Ob2RlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNnZXROb2RlcygpCisJICogQHNlZSAjZ2V0R3JhcGgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEdyYXBoX05vZGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNnZXRFZGdlcyA8ZW0+RWRnZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJzxlbT5FZGdlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNnZXRFZGdlcygpCisJICogQHNlZSAjZ2V0R3JhcGgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEdyYXBoX0VkZ2VzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWwgPGVtPkxhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxhYmVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWwjZ2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCA8ZW0+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsI2dldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQoKQorCSAqIEBzZWUgI2dldExhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRMYWJlbF9VUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbCNnZXRDdXJyZW50VmFsdWUgPGVtPkN1cnJlbnQgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DdXJyZW50IFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsI2dldEN1cnJlbnRWYWx1ZSgpCisJICogQHNlZSAjZ2V0TGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldExhYmVsX0N1cnJlbnRWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWwjZ2V0SWRlbnRpZmlhYmxlIDxlbT5JZGVudGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWwjZ2V0SWRlbnRpZmlhYmxlKCkKKwkgKiBAc2VlICNnZXRMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0TGFiZWxfSWRlbnRpZmlhYmxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZSA8ZW0+TGFiZWwgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0TGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGUgPGVtPk5vZGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Tm9kZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXROb2RlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGUjZ2V0RWRnZXMgPGVtPkVkZ2VzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5FZGdlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlI2dldEVkZ2VzKCkKKwkgKiBAc2VlICNnZXROb2RlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXROb2RlX0VkZ2VzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGUjZ2V0TGFiZWxzIDxlbT5MYWJlbHM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkxhYmVsczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlI2dldExhYmVscygpCisJICogQHNlZSAjZ2V0Tm9kZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0Tm9kZV9MYWJlbHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWwgPGVtPk5vZGUgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Tm9kZSBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldE5vZGVMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsI2dldE5vZGUgPGVtPk5vZGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Ob2RlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbCNnZXROb2RlKCkKKwkgKiBAc2VlICNnZXROb2RlTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldE5vZGVMYWJlbF9Ob2RlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljTm9kZUxhYmVsIDxlbT5TdGF0aWMgTm9kZSBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TdGF0aWMgTm9kZSBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNOb2RlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFN0YXRpY05vZGVMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlVucmVzb2x2ZWRJZGVudGlmaWFibGUgPGVtPlVucmVzb2x2ZWQgSWRlbnRpZmlhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlVucmVzb2x2ZWQgSWRlbnRpZmlhYmxlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlVucmVzb2x2ZWRJZGVudGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFVucmVzb2x2ZWRJZGVudGlmaWFibGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlVucmVzb2x2ZWRJZGVudGlmaWFibGUjZ2V0U2NlbmFyaW8gPGVtPlNjZW5hcmlvPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U2NlbmFyaW88L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguVW5yZXNvbHZlZElkZW50aWZpYWJsZSNnZXRTY2VuYXJpbygpCisJICogQHNlZSAjZ2V0VW5yZXNvbHZlZElkZW50aWZpYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0VW5yZXNvbHZlZElkZW50aWZpYWJsZV9TY2VuYXJpbygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguVW5yZXNvbHZlZElkZW50aWZpYWJsZSNnZXRNb2RlbCA8ZW0+TW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Nb2RlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5VbnJlc29sdmVkSWRlbnRpZmlhYmxlI2dldE1vZGVsKCkKKwkgKiBAc2VlICNnZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlX01vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5VbnJlc29sdmVkSWRlbnRpZmlhYmxlI2dldEdyYXBoIDxlbT5HcmFwaDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkdyYXBoPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlVucmVzb2x2ZWRJZGVudGlmaWFibGUjZ2V0R3JhcGgoKQorCSAqIEBzZWUgI2dldFVucmVzb2x2ZWRJZGVudGlmaWFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFVucmVzb2x2ZWRJZGVudGlmaWFibGVfR3JhcGgoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlVucmVzb2x2ZWRJZGVudGlmaWFibGUjZ2V0SWRlbnRpZmlhYmxlIDxlbT5JZGVudGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguVW5yZXNvbHZlZElkZW50aWZpYWJsZSNnZXRJZGVudGlmaWFibGUoKQorCSAqIEBzZWUgI2dldFVucmVzb2x2ZWRJZGVudGlmaWFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFVucmVzb2x2ZWRJZGVudGlmaWFibGVfSWRlbnRpZmlhYmxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5VbnJlc29sdmVkSWRlbnRpZmlhYmxlI2dldFVucmVzb2x2ZWRVUkkgPGVtPlVucmVzb2x2ZWQgVVJJPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VW5yZXNvbHZlZCBVUkk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguVW5yZXNvbHZlZElkZW50aWZpYWJsZSNnZXRVbnJlc29sdmVkVVJJKCkKKwkgKiBAc2VlICNnZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlX1VucmVzb2x2ZWRVUkkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlVucmVzb2x2ZWRJZGVudGlmaWFibGUjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgTmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5VbnJlc29sdmVkSWRlbnRpZmlhYmxlI2dldEZpZWxkTmFtZSgpCisJICogQHNlZSAjZ2V0VW5yZXNvbHZlZElkZW50aWZpYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VW5yZXNvbHZlZElkZW50aWZpYWJsZV9GaWVsZE5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmEudXRpbC5NYXAuRW50cnkgPGVtPlVSSSBUbyBJZGVudGlmaWFibGUgTWFwIEVudHJ5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlVSSSBUbyBJZGVudGlmaWFibGUgTWFwIEVudHJ5PC9lbT4nLgorCSAqIEBzZWUgamF2YS51dGlsLk1hcC5FbnRyeQorCSAqIEBtb2RlbCBrZXlEYXRhVHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlVSSSIKKwkgKiAgICAgICAgdmFsdWVUeXBlPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSIgdmFsdWVDb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgamF2YS51dGlsLk1hcC5FbnRyeSA8ZW0+S2V5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+S2V5PC9lbT4nLgorCSAqIEBzZWUgamF2YS51dGlsLk1hcC5FbnRyeQorCSAqIEBzZWUgI2dldFVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnlfS2V5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIGphdmEudXRpbC5NYXAuRW50cnkgPGVtPlZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VmFsdWU8L2VtPicuCisJICogQHNlZSBqYXZhLnV0aWwuTWFwLkVudHJ5CisJICogQHNlZSAjZ2V0VVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0VVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeV9WYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyIDxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcgorCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTYW5pdHlDaGVja2VyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0VkZ2VMYWJlbCA8ZW0+RHluYW1pYyBFZGdlIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkR5bmFtaWMgRWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljRWRnZUxhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXREeW5hbWljRWRnZUxhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZUxhYmVsIDxlbT5FZGdlIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVkZ2UgTGFiZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZUxhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRFZGdlTGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlTGFiZWwjZ2V0RWRnZSA8ZW0+RWRnZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5FZGdlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbCNnZXRFZGdlKCkKKwkgKiBAc2VlICNnZXRFZGdlTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEVkZ2VMYWJlbF9FZGdlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljRWRnZUxhYmVsIDxlbT5TdGF0aWMgRWRnZSBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TdGF0aWMgRWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNFZGdlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFN0YXRpY0VkZ2VMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YS51dGlsLk1hcC5FbnRyeSA8ZW0+VVJJIFRvIEVkZ2UgTWFwIEVudHJ5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlVSSSBUbyBFZGdlIE1hcCBFbnRyeTwvZW0+Jy4KKwkgKiBAc2VlIGphdmEudXRpbC5NYXAuRW50cnkKKwkgKiBAbW9kZWwga2V5RGF0YVR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5VUkkiCisJICogICAgICAgIHZhbHVlVHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2UiIHZhbHVlQ29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRVUklUb0VkZ2VNYXBFbnRyeSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBqYXZhLnV0aWwuTWFwLkVudHJ5IDxlbT5LZXk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LZXk8L2VtPicuCisJICogQHNlZSBqYXZhLnV0aWwuTWFwLkVudHJ5CisJICogQHNlZSAjZ2V0VVJJVG9FZGdlTWFwRW50cnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFVSSVRvRWRnZU1hcEVudHJ5X0tleSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBqYXZhLnV0aWwuTWFwLkVudHJ5IDxlbT5WYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlZhbHVlPC9lbT4nLgorCSAqIEBzZWUgamF2YS51dGlsLk1hcC5FbnRyeQorCSAqIEBzZWUgI2dldFVSSVRvRWRnZU1hcEVudHJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRVUklUb0VkZ2VNYXBFbnRyeV9WYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YS51dGlsLk1hcC5FbnRyeSA8ZW0+VVJJIFRvIE5vZGUgTWFwIEVudHJ5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlVSSSBUbyBOb2RlIE1hcCBFbnRyeTwvZW0+Jy4KKwkgKiBAc2VlIGphdmEudXRpbC5NYXAuRW50cnkKKwkgKiBAbW9kZWwga2V5RGF0YVR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5VUkkiCisJICogICAgICAgIHZhbHVlVHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGUiIHZhbHVlQ29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRVUklUb05vZGVNYXBFbnRyeSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBqYXZhLnV0aWwuTWFwLkVudHJ5IDxlbT5LZXk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LZXk8L2VtPicuCisJICogQHNlZSBqYXZhLnV0aWwuTWFwLkVudHJ5CisJICogQHNlZSAjZ2V0VVJJVG9Ob2RlTWFwRW50cnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFVSSVRvTm9kZU1hcEVudHJ5X0tleSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBqYXZhLnV0aWwuTWFwLkVudHJ5IDxlbT5WYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlZhbHVlPC9lbT4nLgorCSAqIEBzZWUgamF2YS51dGlsLk1hcC5FbnRyeQorCSAqIEBzZWUgI2dldFVSSVRvTm9kZU1hcEVudHJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRVUklUb05vZGVNYXBFbnRyeV9WYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YS51dGlsLk1hcC5FbnRyeSA8ZW0+VVJJIFRvIExhYmVsIE1hcCBFbnRyeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5VUkkgVG8gTGFiZWwgTWFwIEVudHJ5PC9lbT4nLgorCSAqIEBzZWUgamF2YS51dGlsLk1hcC5FbnRyeQorCSAqIEBtb2RlbCBrZXlEYXRhVHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlVSSSIKKwkgKiAgICAgICAgdmFsdWVUeXBlPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWwiIHZhbHVlQ29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRVUklUb0xhYmVsTWFwRW50cnkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgamF2YS51dGlsLk1hcC5FbnRyeSA8ZW0+S2V5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+S2V5PC9lbT4nLgorCSAqIEBzZWUgamF2YS51dGlsLk1hcC5FbnRyeQorCSAqIEBzZWUgI2dldFVSSVRvTGFiZWxNYXBFbnRyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VVJJVG9MYWJlbE1hcEVudHJ5X0tleSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBqYXZhLnV0aWwuTWFwLkVudHJ5IDxlbT5WYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlZhbHVlPC9lbT4nLgorCSAqIEBzZWUgamF2YS51dGlsLk1hcC5FbnRyeQorCSAqIEBzZWUgI2dldFVSSVRvTGFiZWxNYXBFbnRyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0VVJJVG9MYWJlbE1hcEVudHJ5X1ZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZhLnV0aWwuTWFwLkVudHJ5IDxlbT5VUkkgVG8gTm9kZSBMYWJlbCBNYXAgRW50cnk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VVJJIFRvIE5vZGUgTGFiZWwgTWFwIEVudHJ5PC9lbT4nLgorCSAqIEBzZWUgamF2YS51dGlsLk1hcC5FbnRyeQorCSAqIEBtb2RlbCBrZXlEYXRhVHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlVSSSIKKwkgKiAgICAgICAgdmFsdWVUeXBlPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsIiB2YWx1ZUNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0VVJJVG9Ob2RlTGFiZWxNYXBFbnRyeSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBqYXZhLnV0aWwuTWFwLkVudHJ5IDxlbT5LZXk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LZXk8L2VtPicuCisJICogQHNlZSBqYXZhLnV0aWwuTWFwLkVudHJ5CisJICogQHNlZSAjZ2V0VVJJVG9Ob2RlTGFiZWxNYXBFbnRyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VVJJVG9Ob2RlTGFiZWxNYXBFbnRyeV9LZXkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgamF2YS51dGlsLk1hcC5FbnRyeSA8ZW0+VmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5WYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIGphdmEudXRpbC5NYXAuRW50cnkKKwkgKiBAc2VlICNnZXRVUklUb05vZGVMYWJlbE1hcEVudHJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRVUklUb05vZGVMYWJlbE1hcEVudHJ5X1ZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljTGFiZWwgPGVtPlN0YXRpYyBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TdGF0aWMgTGFiZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFN0YXRpY0xhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSA8ZW0+VVJJPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5VUkk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJCisJICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVEYXRhVHlwZSBnZXRVUkkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDxlbT5JbGxlZ2FsIEFyZ3VtZW50IEV4Y2VwdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SWxsZWdhbCBBcmd1bWVudCBFeGNlcHRpb248L2VtPicuCisJICogQHNlZSBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iCisJICogQGdlbmVyYXRlZAorCSAqLworCUVEYXRhVHlwZSBnZXRJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogQGdlbmVyYXRlZAorCSAqLworCUdyYXBoRmFjdG9yeSBnZXRHcmFwaEZhY3RvcnkoKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKwkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorCSAqIDwvdWw+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCWludGVyZmFjZSBMaXRlcmFscyAgeworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkR5bmFtaWNMYWJlbEltcGwgPGVtPkR5bmFtaWMgTGFiZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5EeW5hbWljTGFiZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhQYWNrYWdlSW1wbCNnZXREeW5hbWljTGFiZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgRFlOQU1JQ19MQUJFTCA9IGVJTlNUQU5DRS5nZXREeW5hbWljTGFiZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5leHQgVmFsdWUgVmFsaWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBEWU5BTUlDX0xBQkVMX19ORVhUX1ZBTFVFX1ZBTElEID0gZUlOU1RBTkNFLmdldER5bmFtaWNMYWJlbF9OZXh0VmFsdWVWYWxpZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIERZTkFNSUNfTEFCRUxfX05FWFRfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0RHluYW1pY0xhYmVsX05leHRWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVjb3JhdG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgRFlOQU1JQ19MQUJFTF9fREVDT1JBVE9SID0gZUlOU1RBTkNFLmdldER5bmFtaWNMYWJlbF9EZWNvcmF0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkR5bmFtaWNOb2RlTGFiZWxJbXBsIDxlbT5EeW5hbWljIE5vZGUgTGFiZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5EeW5hbWljTm9kZUxhYmVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGwjZ2V0RHluYW1pY05vZGVMYWJlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBEWU5BTUlDX05PREVfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0RHluYW1pY05vZGVMYWJlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuRWRnZUltcGwgPGVtPkVkZ2U8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5FZGdlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGwjZ2V0RWRnZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBFREdFID0gZUlOU1RBTkNFLmdldEVkZ2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkE8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBFREdFX19BID0gZUlOU1RBTkNFLmdldEVkZ2VfQSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Tm9kZSBBVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRURHRV9fTk9ERV9BVVJJID0gZUlOU1RBTkNFLmdldEVkZ2VfTm9kZUFVUkkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkI8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBFREdFX19CID0gZUlOU1RBTkNFLmdldEVkZ2VfQigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Tm9kZSBCVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRURHRV9fTk9ERV9CVVJJID0gZUlOU1RBTkNFLmdldEVkZ2VfTm9kZUJVUkkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxhYmVsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgRURHRV9fTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0RWRnZV9MYWJlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlyZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBFREdFX19ESVJFQ1RFRCA9IGVJTlNUQU5DRS5nZXRFZGdlX0RpcmVjdGVkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaEltcGwgPGVtPkdyYXBoPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhQYWNrYWdlSW1wbCNnZXRHcmFwaCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBHUkFQSCA9IGVJTlNUQU5DRS5nZXRHcmFwaCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggTGFiZWxzPC9iPjwvZW0+JyBtYXAgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgR1JBUEhfX0dSQVBIX0xBQkVMUyA9IGVJTlNUQU5DRS5nZXRHcmFwaF9HcmFwaExhYmVscygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Tm9kZSBMYWJlbHM8L2I+PC9lbT4nIG1hcCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBHUkFQSF9fTk9ERV9MQUJFTFMgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhfTm9kZUxhYmVscygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RHluYW1pYyBMYWJlbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEdSQVBIX19EWU5BTUlDX0xBQkVMUyA9IGVJTlNUQU5DRS5nZXRHcmFwaF9EeW5hbWljTGFiZWxzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OdW0gRWRnZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBHUkFQSF9fTlVNX0VER0VTID0gZUlOU1RBTkNFLmdldEdyYXBoX051bUVkZ2VzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OdW0gTm9kZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBHUkFQSF9fTlVNX05PREVTID0gZUlOU1RBTkNFLmdldEdyYXBoX051bU5vZGVzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OdW0gR3JhcGggTGFiZWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgR1JBUEhfX05VTV9HUkFQSF9MQUJFTFMgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhfTnVtR3JhcGhMYWJlbHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk51bSBOb2RlIExhYmVsczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEdSQVBIX19OVU1fTk9ERV9MQUJFTFMgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhfTnVtTm9kZUxhYmVscygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TnVtIER5bmFtaWMgTGFiZWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgR1JBUEhfX05VTV9EWU5BTUlDX0xBQkVMUyA9IGVJTlNUQU5DRS5nZXRHcmFwaF9OdW1EeW5hbWljTGFiZWxzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VbnJlc29sdmVkIElkZW50aWZpYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEdSQVBIX19VTlJFU09MVkVEX0lERU5USUZJQUJMRVMgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhfVW5yZXNvbHZlZElkZW50aWZpYWJsZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlY29yYXRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEdSQVBIX19ERUNPUkFUT1JTID0gZUlOU1RBTkNFLmdldEdyYXBoX0RlY29yYXRvcnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRpbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBHUkFQSF9fVElNRSA9IGVJTlNUQU5DRS5nZXRHcmFwaF9UaW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgbWFwIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEdSQVBIX19OT0RFUyA9IGVJTlNUQU5DRS5nZXRHcmFwaF9Ob2RlcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWRnZXM8L2I+PC9lbT4nIG1hcCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBHUkFQSF9fRURHRVMgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhfRWRnZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkxhYmVsSW1wbCA8ZW0+TGFiZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsI2dldExhYmVsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIExBQkVMID0gZUlOU1RBTkNFLmdldExhYmVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VUkkgT2YgSWRlbnRpZmlhYmxlIFRvIEJlIExhYmVsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBMQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEID0gZUlOU1RBTkNFLmdldExhYmVsX1VSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBMQUJFTF9fQ1VSUkVOVF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRMYWJlbF9DdXJyZW50VmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkZW50aWZpYWJsZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIExBQkVMX19JREVOVElGSUFCTEUgPSBlSU5TVEFOQ0UuZ2V0TGFiZWxfSWRlbnRpZmlhYmxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbFZhbHVlSW1wbCA8ZW0+TGFiZWwgVmFsdWU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbFZhbHVlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGwjZ2V0TGFiZWxWYWx1ZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBMQUJFTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRMYWJlbFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5Ob2RlSW1wbCA8ZW0+Tm9kZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLk5vZGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhQYWNrYWdlSW1wbCNnZXROb2RlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIE5PREUgPSBlSU5TVEFOQ0UuZ2V0Tm9kZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWRnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIE5PREVfX0VER0VTID0gZUlOU1RBTkNFLmdldE5vZGVfRWRnZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxhYmVsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgTk9ERV9fTEFCRUxTID0gZUlOU1RBTkNFLmdldE5vZGVfTGFiZWxzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5Ob2RlTGFiZWxJbXBsIDxlbT5Ob2RlIExhYmVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTm9kZUxhYmVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGwjZ2V0Tm9kZUxhYmVsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIE5PREVfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0Tm9kZUxhYmVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob2RlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgTk9ERV9MQUJFTF9fTk9ERSA9IGVJTlNUQU5DRS5nZXROb2RlTGFiZWxfTm9kZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuU3RhdGljTm9kZUxhYmVsSW1wbCA8ZW0+U3RhdGljIE5vZGUgTGFiZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5TdGF0aWNOb2RlTGFiZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhQYWNrYWdlSW1wbCNnZXRTdGF0aWNOb2RlTGFiZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU1RBVElDX05PREVfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0U3RhdGljTm9kZUxhYmVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5VbnJlc29sdmVkSWRlbnRpZmlhYmxlSW1wbCA8ZW0+VW5yZXNvbHZlZCBJZGVudGlmaWFibGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5VbnJlc29sdmVkSWRlbnRpZmlhYmxlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGwjZ2V0VW5yZXNvbHZlZElkZW50aWZpYWJsZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBVTlJFU09MVkVEX0lERU5USUZJQUJMRSA9IGVJTlNUQU5DRS5nZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TY2VuYXJpbzwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFVOUkVTT0xWRURfSURFTlRJRklBQkxFX19TQ0VOQVJJTyA9IGVJTlNUQU5DRS5nZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlX1NjZW5hcmlvKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2RlbDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFVOUkVTT0xWRURfSURFTlRJRklBQkxFX19NT0RFTCA9IGVJTlNUQU5DRS5nZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlX01vZGVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFVOUkVTT0xWRURfSURFTlRJRklBQkxFX19HUkFQSCA9IGVJTlNUQU5DRS5nZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlX0dyYXBoKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZGVudGlmaWFibGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBVTlJFU09MVkVEX0lERU5USUZJQUJMRV9fSURFTlRJRklBQkxFID0gZUlOU1RBTkNFLmdldFVucmVzb2x2ZWRJZGVudGlmaWFibGVfSWRlbnRpZmlhYmxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VbnJlc29sdmVkIFVSSTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFVOUkVTT0xWRURfSURFTlRJRklBQkxFX19VTlJFU09MVkVEX1VSSSA9IGVJTlNUQU5DRS5nZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlX1VucmVzb2x2ZWRVUkkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBVTlJFU09MVkVEX0lERU5USUZJQUJMRV9fRklFTERfTkFNRSA9IGVJTlNUQU5DRS5nZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlX0ZpZWxkTmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeUltcGwgPGVtPlVSSSBUbyBJZGVudGlmaWFibGUgTWFwIEVudHJ5PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsI2dldFVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnkoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVVJJX1RPX0lERU5USUZJQUJMRV9NQVBfRU5UUlkgPSBlSU5TVEFOQ0UuZ2V0VVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+S2V5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgVVJJX1RPX0lERU5USUZJQUJMRV9NQVBfRU5UUllfX0tFWSA9IGVJTlNUQU5DRS5nZXRVUklUb0lkZW50aWZpYWJsZU1hcEVudHJ5X0tleSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBVUklfVE9fSURFTlRJRklBQkxFX01BUF9FTlRSWV9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0VVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeV9WYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyIDxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGwjZ2V0U2FuaXR5Q2hlY2tlcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTQU5JVFlfQ0hFQ0tFUiA9IGVJTlNUQU5DRS5nZXRTYW5pdHlDaGVja2VyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5EeW5hbWljRWRnZUxhYmVsSW1wbCA8ZW0+RHluYW1pYyBFZGdlIExhYmVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuRHluYW1pY0VkZ2VMYWJlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsI2dldER5bmFtaWNFZGdlTGFiZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgRFlOQU1JQ19FREdFX0xBQkVMID0gZUlOU1RBTkNFLmdldER5bmFtaWNFZGdlTGFiZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkVkZ2VMYWJlbEltcGwgPGVtPkVkZ2UgTGFiZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5FZGdlTGFiZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhQYWNrYWdlSW1wbCNnZXRFZGdlTGFiZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgRURHRV9MQUJFTCA9IGVJTlNUQU5DRS5nZXRFZGdlTGFiZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVkZ2U8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgRURHRV9MQUJFTF9fRURHRSA9IGVJTlNUQU5DRS5nZXRFZGdlTGFiZWxfRWRnZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuU3RhdGljRWRnZUxhYmVsSW1wbCA8ZW0+U3RhdGljIEVkZ2UgTGFiZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5TdGF0aWNFZGdlTGFiZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhQYWNrYWdlSW1wbCNnZXRTdGF0aWNFZGdlTGFiZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU1RBVElDX0VER0VfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0U3RhdGljRWRnZUxhYmVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5VUklUb0VkZ2VNYXBFbnRyeUltcGwgPGVtPlVSSSBUbyBFZGdlIE1hcCBFbnRyeTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLlVSSVRvRWRnZU1hcEVudHJ5SW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGwjZ2V0VVJJVG9FZGdlTWFwRW50cnkoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVVJJX1RPX0VER0VfTUFQX0VOVFJZID0gZUlOU1RBTkNFLmdldFVSSVRvRWRnZU1hcEVudHJ5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5LZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBVUklfVE9fRURHRV9NQVBfRU5UUllfX0tFWSA9IGVJTlNUQU5DRS5nZXRVUklUb0VkZ2VNYXBFbnRyeV9LZXkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgVVJJX1RPX0VER0VfTUFQX0VOVFJZX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRVUklUb0VkZ2VNYXBFbnRyeV9WYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuVVJJVG9Ob2RlTWFwRW50cnlJbXBsIDxlbT5VUkkgVG8gTm9kZSBNYXAgRW50cnk8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5VUklUb05vZGVNYXBFbnRyeUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsI2dldFVSSVRvTm9kZU1hcEVudHJ5KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFVSSV9UT19OT0RFX01BUF9FTlRSWSA9IGVJTlNUQU5DRS5nZXRVUklUb05vZGVNYXBFbnRyeSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+S2V5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgVVJJX1RPX05PREVfTUFQX0VOVFJZX19LRVkgPSBlSU5TVEFOQ0UuZ2V0VVJJVG9Ob2RlTWFwRW50cnlfS2V5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFVSSV9UT19OT0RFX01BUF9FTlRSWV9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0VVJJVG9Ob2RlTWFwRW50cnlfVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLlVSSVRvTGFiZWxNYXBFbnRyeUltcGwgPGVtPlVSSSBUbyBMYWJlbCBNYXAgRW50cnk8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5VUklUb0xhYmVsTWFwRW50cnlJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhQYWNrYWdlSW1wbCNnZXRVUklUb0xhYmVsTWFwRW50cnkoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVVJJX1RPX0xBQkVMX01BUF9FTlRSWSA9IGVJTlNUQU5DRS5nZXRVUklUb0xhYmVsTWFwRW50cnkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPktleTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFVSSV9UT19MQUJFTF9NQVBfRU5UUllfX0tFWSA9IGVJTlNUQU5DRS5nZXRVUklUb0xhYmVsTWFwRW50cnlfS2V5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFVSSV9UT19MQUJFTF9NQVBfRU5UUllfX1ZBTFVFID0gZUlOU1RBTkNFLmdldFVSSVRvTGFiZWxNYXBFbnRyeV9WYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuVVJJVG9Ob2RlTGFiZWxNYXBFbnRyeUltcGwgPGVtPlVSSSBUbyBOb2RlIExhYmVsIE1hcCBFbnRyeTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLlVSSVRvTm9kZUxhYmVsTWFwRW50cnlJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhQYWNrYWdlSW1wbCNnZXRVUklUb05vZGVMYWJlbE1hcEVudHJ5KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFVSSV9UT19OT0RFX0xBQkVMX01BUF9FTlRSWSA9IGVJTlNUQU5DRS5nZXRVUklUb05vZGVMYWJlbE1hcEVudHJ5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5LZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBVUklfVE9fTk9ERV9MQUJFTF9NQVBfRU5UUllfX0tFWSA9IGVJTlNUQU5DRS5nZXRVUklUb05vZGVMYWJlbE1hcEVudHJ5X0tleSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBVUklfVE9fTk9ERV9MQUJFTF9NQVBfRU5UUllfX1ZBTFVFID0gZUlOU1RBTkNFLmdldFVSSVRvTm9kZUxhYmVsTWFwRW50cnlfVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLlN0YXRpY0xhYmVsSW1wbCA8ZW0+U3RhdGljIExhYmVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuU3RhdGljTGFiZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhQYWNrYWdlSW1wbCNnZXRTdGF0aWNMYWJlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTVEFUSUNfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0U3RhdGljTGFiZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlVSSTwvZW0+JyBkYXRhIHR5cGUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsI2dldFVSSSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVEYXRhVHlwZSBVUkkgPSBlSU5TVEFOQ0UuZ2V0VVJJKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5JbGxlZ2FsIEFyZ3VtZW50IEV4Y2VwdGlvbjwvZW0+JyBkYXRhIHR5cGUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsI2dldElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVEYXRhVHlwZSBJTExFR0FMX0FSR1VNRU5UX0VYQ0VQVElPTiA9IGVJTlNUQU5DRS5nZXRJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKworCX0KKworfSAvL0dyYXBoUGFja2FnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvSW50ZWdyYXRpb25MYWJlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvSW50ZWdyYXRpb25MYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDkxNWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9JbnRlZ3JhdGlvbkxhYmVsLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8vIEludGVncmF0aW9uTGFiZWwNCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsNCisNCisvKioNCisgKiBUaGUgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGFueSBsYWJlbCB0aGF0IGlzIGFibGUgdG8gc3dpdGNoIGJldHdlZW4gDQorICogY3VycmVudCBhbmQgbmV4dCB2YWx1ZSBvcHRpb25hbGx5IHVzaW5nIGFuIGludGVncmF0aW9uIHRlY2huaXF1ZSwgZm9yIGluc3RhbmNlDQorICogdGhlIFJ1bmdlIEt1dHRhIG51bWVyaWNhbCBPREUgc29sdmVyLiAgDQorICovDQorcHVibGljIGludGVyZmFjZSBJbnRlZ3JhdGlvbkxhYmVsICBleHRlbmRzIEVPYmplY3Qgew0KKw0KKwkvKioNCisJICogQHJldHVybiBUaGUgY3VycmVudCB2YWx1ZSBhdCB0aGlzIHNpbXVsYXRpb24gY3ljbGUNCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIg0KKwkgKi8NCisJTGFiZWxWYWx1ZSBnZXRDdXJyZW50VmFsdWUoKTsNCisNCisJLyoqDQorCSAqIEByZXR1cm4gVGhlIG5leHQgdmFsdWUgYXQgbmV4dCBzaW11bGF0aW9uIGN5Y2xlDQorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiIHJlc29sdmVQcm94aWVzPSJmYWxzZSINCisJICovDQorCUxhYmVsVmFsdWUgZ2V0TmV4dFZhbHVlKCk7DQorDQorCQ0KKwkvKioNCisJICogQHJldHVybiBUaGUgZGVsdGEgdmFsdWUgdGhhdCB3aGVuIGFkZGVkIHRvIHRoZSBjdXJyZW50IHZhbHVlIHByb3ZpZGVzIHRoZSBuZXh0IHZhbHVlDQorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiIHJlc29sdmVQcm94aWVzPSJmYWxzZSINCisJICovDQorCUxhYmVsVmFsdWUgZ2V0RGVsdGFWYWx1ZSgpOw0KKw0KKwkvLyBUaGUgcmVzdCBvZiB0aGUgbGFiZWwgdmFsdWVzIGFyZSBmb3IgdGhlIFJ1bmdlIEt1dHRhIHNvbHZlcg0KKwkNCisJLyoqDQorCSAqIEByZXR1cm4gVGhlIHRlbXBvcmFyeSB2YWx1ZSB1c2VkIHdoZW4gdGhlIGludGVncmF0aW5nIHNvbHZlciBhZHZhbmNlcyB0byB0aGUgbmV4dCBzdGVwDQorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiIHJlc29sdmVQcm94aWVzPSJmYWxzZSINCisJICovDQorCUxhYmVsVmFsdWUgZ2V0VGVtcFZhbHVlKCk7DQorDQorCS8qKg0KKwkgKiBAcmV0dXJuIFRoZSB2YWx1ZSB0byBwcm9iZSBhbmQgY2FsY3VsYXRlIGRlbHRhLiBUaGlzIGlzIHRoZSBsYWJlbCB2YWx1ZSBhbnkgZGlzZWFzZSBtb2RlbCBzaG91bGQgdXNlDQorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiIHJlc29sdmVQcm94aWVzPSJmYWxzZSINCisJICovDQorCUxhYmVsVmFsdWUgZ2V0UHJvYmVWYWx1ZSgpOw0KKw0KKwkvKioNCisJICogQHJldHVybiBUaGUgc2NhbGUgdXNlZCB0byBzY2FsZSB0aGUgZXJyb3IgY2FsY3VsYXRlZCBieSB0aGUgaW50ZWdyYXRpbmcgc29sdmVyDQorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiIHJlc29sdmVQcm94aWVzPSJmYWxzZSINCisJICovDQorCUxhYmVsVmFsdWUgZ2V0RXJyb3JTY2FsZSgpOw0KKw0KKwkvLyBUaGlzIGxhYmVsIHZhbHVlIGlzIHVzZWQgZm9yIHBvcHVsYXRpb24gbW9kZWwgZGVjb3JhdG9ycyB0byByZXN0b3JlIHRoZSBvcmlnaW5hbA0KKwkvLyBwb3B1bGF0aW9uIHZhbHVlIHRvIHRoZSBjb3JyZWN0IG51bWJlciBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgc2ltdWxhdGlvbg0KKw0KKwkvKioNCisJICogQHJldHVybiBUaGUgb3JpZ2luYWwgdmFsdWUNCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIg0KKwkgKi8NCisJTGFiZWxWYWx1ZSBnZXRPcmlnaW5hbFZhbHVlKCk7DQorCQ0KKwkvKioNCisJICogUmV0dXJuIHRoZSBkZWNvcmF0b3IgDQorCSAqDQorCSAqQHJldHVybiBEZWNvcmF0b3INCisJICovDQorCQ0KKwlEZWNvcmF0b3IgZ2V0RGVjb3JhdG9yKCk7DQorCQ0KKwkvKioNCisJICogc2V0TmV4dFZhbHVlVmFsdWQNCisJICogDQorCSAqIEBwYXJhbSB2YWx1ZSB0cnVlIGlmIHZhbGlkDQorCSovDQorCXB1YmxpYyB2b2lkIHNldE5leHRWYWx1ZVZhbGlkKGJvb2xlYW4gdmFsdWUpOw0KKwkNCisJLyoqDQorCSAqIEdldCB0aGUgaWRlbnRpZmllciwgZS5nLiBwb3B1bGF0aW9uIGlkZW50aWZpZXINCisJICogDQorCSAqQHJldHVybiBTdHJpbmcgVGhlIGlkZW50aWZpZXIgDQorCSAqLw0KKwkNCisJcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCk7DQorCQ0KKwkvKioNCisJICogcmVzZXQuIFJlc2V0IHRoZSBsYWJlbCB1c2luZyB0aGUgDQorCSAqIHN0ZW0gdGltZSANCisJICogDQorCSAqIEBwYXJhbSB0aW1lIFNURU0gdGltZQ0KKwkgKi8NCisJDQorCXB1YmxpYyB2b2lkIHJlc2V0KFNURU1UaW1lIHRpbWUpOw0KKwkNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvSW50ZWdyYXRpb25MYWJlbFZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9JbnRlZ3JhdGlvbkxhYmVsVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjVhZDA4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvSW50ZWdyYXRpb25MYWJlbFZhbHVlLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLy8gSW50ZWdyYXRpb25MYWJlbA0KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKy8qKg0KKyAqIFRoZSBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgYW55IGxhYmVsIHZhbHVlIHRoYXQgaXMgYWJsZSB0byBzd2l0Y2ggYmV0d2VlbiANCisgKiBjdXJyZW50IGFuZCBuZXh0IHZhbHVlIG9wdGlvbmFsbHkgdXNpbmcgYW4gaW50ZWdyYXRpb24gdGVjaG5pcXVlLCBmb3IgaW5zdGFuY2UNCisgKiB0aGUgUnVuZ2UgS3V0dGEgbnVtZXJpY2FsIE9ERSBzb2x2ZXIuICANCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIEludGVncmF0aW9uTGFiZWxWYWx1ZSBleHRlbmRzIFNpbXBsZURhdGFFeGNoYW5nZUxhYmVsVmFsdWUgew0KKw0KKwkvKioNCisJICogU2V0IHRoZSB2YWx1ZSBmcm9tIGFub3RoZXIgdmFsdWUNCisJICogDQorCSAqIEBwYXJhbSB2IFRoZSB2YWx1ZQ0KKwkgKiBAcmV0dXJuIFRoZSBjaGFuZ2VkIHZhbHVlDQorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiIHJlc29sdmVQcm94aWVzPSJmYWxzZSINCisJICovDQorCUludGVncmF0aW9uTGFiZWxWYWx1ZSBzZXQoSW50ZWdyYXRpb25MYWJlbFZhbHVlIHYpOw0KKw0KKwkNCisJLyoqDQorCSAqIEFkZA0KKwkgKiANCisJICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGFkZA0KKwkgKiBAcmV0dXJuIEludGVncmF0aW9uTGFiZWxWYWx1ZSBDaGFuZ2VkIHZhbHVlDQorCSAqLw0KKw0KKwlwdWJsaWMgSW50ZWdyYXRpb25MYWJlbFZhbHVlIGFkZChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgdmFsdWUpOw0KKw0KKwkvKioNCisJICogU3ViDQorCSAqIA0KKwkgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gc3ViDQorCSAqIEByZXR1cm4gSW50ZWdyYXRpb25MYWJlbFZhbHVlIENoYW5nZWQgdmFsdWUNCisJKi8NCisJcHVibGljIEludGVncmF0aW9uTGFiZWxWYWx1ZSBzdWIoSW50ZWdyYXRpb25MYWJlbFZhbHVlIHZhbHVlKTsNCisNCisJDQorCS8qKg0KKwkgKiBTY2FsZQ0KKwkgKiANCisJICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHNjYWxlDQorCSAqIEByZXR1cm4gSW50ZWdyYXRpb25MYWJlbFZhbHVlIENoYW5nZWQgdmFsdWUNCisJKi8NCisJcHVibGljIEludGVncmF0aW9uTGFiZWxWYWx1ZSBzY2FsZShkb3VibGUgc2NhbGVGYWN0b3IpOw0KKwkNCisJLyoqDQorCSAqIEFkZA0KKwkgKiANCisJICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGFkZA0KKwkgKiBAcmV0dXJuIEludGVncmF0aW9uTGFiZWxWYWx1ZSBDaGFuZ2VkIHZhbHVlDQorCSovDQorCXB1YmxpYyBJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgYWRkKGRvdWJsZSBhZGRpdGlvbik7DQorDQorCS8qKg0KKwkgKiBBYnMNCisJICogDQorCSAqIEByZXR1cm4gSW50ZWdyYXRpb25MYWJlbFZhbHVlIENoYW5nZWQgdmFsdWUNCisJKi8NCisJcHVibGljIEludGVncmF0aW9uTGFiZWxWYWx1ZSBhYnMoKTsNCisJDQorCS8qKg0KKwkgKiBhZGp1c3REZWx0YS4gQWRqdXN0IHRoaXMgZGVsdGEgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dA0KKwkgKiANCisJICogQHBhcmFtIHZhbHVlIHJlZmVyZW5jZSB2YWx1ZQ0KKwkgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiBjaGFuZ2VkDQorCSovDQorCXB1YmxpYyBib29sZWFuIGFkanVzdERlbHRhKEludGVncmF0aW9uTGFiZWxWYWx1ZSB2YWx1ZSk7DQorCQ0KKwkNCisJLyoqDQorCSAqIGRpdmlkZS4gRGl2aWRlIHRoZSBpbnB1dCB3aXRoIHRoaXMgdmFsdWUNCisJICogDQorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgZGVub21pbmF0b3INCisJICogQHJldHVybiBUaGUgY2hhbmdlZCB2YWx1ZQ0KKwkqLw0KKwlwdWJsaWMgSW50ZWdyYXRpb25MYWJlbFZhbHVlIGRpdmlkZShJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgdmFsdWUpOw0KKwkNCisJLyoqDQorCSAqIG1heC4gUmV0dXJuIHRoZSBtYXhpbXVtIGlmIHRoZSBsYWJlbCB2YWx1ZXMNCisJICogDQorCSAqIEByZXR1cm4gZG91YmxlIFRoZSBtYXhpbXVtIHZhbHVlDQorCSovDQorCXB1YmxpYyBkb3VibGUgbWF4KCk7DQorCQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9MYWJlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvTGFiZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzA5YjIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvTGFiZWwuamF2YQpAQCAtMCwwICsxLDk4IEBACisvLyBMYWJlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworCisvKioKKyAqIEEgPGNvZGU+TGFiZWw8L2NvZGU+IHJlcHJlc2VudHMgYXR0cmlidXRlcyBvZiBlaXRoZXIgYSB7QGxpbmsgTm9kZX0sCisgKiB7QGxpbmsgRWRnZX0sIG9yIHtAbGluayBHcmFwaH0uIFRoZSBhdHRyaWJ1dGVzIGFyZSByZXByZXNlbnRlZCBieSBhCisgKiB7QGxpbmsgTGFiZWxWYWx1ZX0uCisgKiAKKyAqIEBzZWUgTm9kZQorICogQHNlZSBFZGdlCisgKiBAc2VlIEdyYXBoCisgKiBAc2VlIE5vZGVMYWJlbAorICogQHNlZSBEeW5hbWljTGFiZWwKKyAqIEBzZWUgU3RhdGljTm9kZUxhYmVsCisgKiBAc2VlIER5bmFtaWNOb2RlTGFiZWwKKyAqIAorICogCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTGFiZWwgZXh0ZW5kcyBJZGVudGlmaWFibGUgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdG9wLWxldmVsIHNlZ21lbnQgZm9yIGFsbCB0eXBlIFVSSSdzIGZvciBsYWJlbHMuCisJICovCisJU3RyaW5nIFVSSV9UWVBFX0xBQkVMX1NFR01FTlQgPSAibGFiZWwiOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdHlwZSBVUkkgZm9yIGEgTGFiZWwKKwkgKi8KKwlVUkkgVVJJX1RZUEVfTEFCRUwgPSBTVEVNVVJJLmNyZWF0ZVR5cGVVUkkoVVJJX1RZUEVfTEFCRUxfU0VHTUVOVCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfSBsYWJlbGVkIGJ5IHRoaXMgPGNvZGU+TGFiZWw8L2NvZGU+CisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiCisJICovCisJSWRlbnRpZmlhYmxlIGdldElkZW50aWZpYWJsZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsI2dldElkZW50aWZpYWJsZSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRJZGVudGlmaWFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldElkZW50aWZpYWJsZShJZGVudGlmaWFibGUgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUge0BsaW5rIFVSSX0gb2YgdGhlIHtAbGluayBJZGVudGlmaWFibGV9IHRoYXQgdGhpcworCSAqICAgICAgICAgPGNvZGU+TGFiZWw8L2NvZGU+IGxhYmVscy4gVGhpcyB2YWx1ZSBpcyB0eXBpY2FsbHkgdXNlZCB3aGVuCisJICogICAgICAgICBjb21iaW5pbmcgImdyYXBoIGZyYWdtZW50cyIgdG8gcmVzb2x2ZSB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZQorCSAqICAgICAgICAgPGNvZGU+TGFiZWw8L2NvZGU+IGFuZCB0aGUge0BsaW5rIElkZW50aWZpYWJsZX0gaXQgbGFiZWxzLgorCSAqIEBzZWUgR3JhcGgjYWRkR3JhcGgoR3JhcGgpCisJICogQHNlZSBVbnJlc29sdmVkSWRlbnRpZmlhYmxlCisJICogQHNlZSAjZ2V0SWRlbnRpZmlhYmxlKCkKKwkgKiAKKwkgKiBAbW9kZWwKKwkgKi8KKwlVUkkgZ2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsI2dldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQgPGVtPlVSSSBPZiBJZGVudGlmaWFibGUgVG8gQmUgTGFiZWxlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVSSSBPZiBJZGVudGlmaWFibGUgVG8gQmUgTGFiZWxlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZChVUkkgdmFsdWUpOworCisJLyoqCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKKwkgKi8KKwlMYWJlbFZhbHVlIGdldEN1cnJlbnRWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsI2dldEN1cnJlbnRWYWx1ZSA8ZW0+Q3VycmVudCBWYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbnQgVmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEN1cnJlbnRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Q3VycmVudFZhbHVlKExhYmVsVmFsdWUgdmFsdWUpOworCit9IC8vIExhYmVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9MYWJlbFZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9MYWJlbFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhMjdiOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL0xhYmVsVmFsdWUuamF2YQpAQCAtMCwwICsxLDM0IEBACisvLyBMYWJlbFZhbHVlLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsKKworLyoqCisgKiBBIDxjb2RlPkxhYmVsVmFsdWU8L2NvZGU+IHN0b3JlcyB0aGUgYXR0cmlidXRlcyBvZiBhIHtAbGluayBMYWJlbH0uCisgKiAKKyAqIEBzZWUgTGFiZWwKKyAqIEBzZWUgRHluYW1pY0xhYmVsCisgKiBAc2VlIER5bmFtaWNOb2RlTGFiZWwKKyAqIAorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICovCitwdWJsaWMgaW50ZXJmYWNlIExhYmVsVmFsdWUgZXh0ZW5kcyBFT2JqZWN0LCBTYW5pdHlDaGVja2VyIHsKKworCS8qKgorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwl2b2lkIHJlc2V0KCk7CisKK30gLy8gTGFiZWxWYWx1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvTm9kZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxY2QzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9Ob2RlLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLy8gTm9kZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CisKKy8qKgorICogQSA8Y29kZT5Ob2RlPC9jb2RlPiByZXByZXNlbnRzIGEgcmVhbCBvciBhYnN0cmFjdCBlbnRpdHkuCisgKiA8cD4KKyAqIEEgPGNvZGU+Tm9kZTwvY29kZT4gY2FuIGhhdmUgImF0dHJpYnV0ZXMiLiBUaGUgYXR0cmlidXRlcyBhcmUgcmVwcmVzZW50ZWQKKyAqIGJ5IHplcm8gb3IgbW9yZSB7QGxpbmsgTm9kZUxhYmVsfXMuCisgKiA8L3A+CisgKiA8cD4KKyAqIEEgPGNvZGU+Tm9kZTwvY29kZT4gY2FuIGhhdmUgemVybyBvciBtb3JlICJyZWxhdGlvbnNoaXBzIiB3aXRoIG9uZSBvciBtb3JlCisgKiBvdGhlciA8Y29kZT5Ob2RlPC9jb2RlPnMuIFRoZXNlIHJlbGF0aW9uc2hpcHMgY2FuIGJlIHdpdGggdGhlIHNhbWUKKyAqIDxjb2RlPk5vZGU8L2NvZGU+IG9yIHdpdGggbXVsdGlwbGUgZGlmZmVyZW50IDxjb2RlPk5vZGU8L2NvZGU+cy4gQQorICogc2luZ2xlIHJlbGF0aW9uc2hpcCBpcyByZXByZXNlbnRlZCBieSBhbiB7QGxpbmsgRWRnZX0uCisgKiA8L3A+CisgKiAKKyAqIEBzZWUgRWRnZQorICogQHNlZSBMYWJlbAorICogQHNlZSBOb2RlTGFiZWwKKyAqIEBzZWUgR3JhcGgKKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZSBleHRlbmRzIElkZW50aWZpYWJsZSB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzZWdtZW50IG9mIHRoZSB0eXBlIFVSSSB0aGF0IHByZWZpeGVzIGFsbCBvdGhlciBzZWdtZW50cyBpbiBhCisJICogbm9kZSB0eXBlIFVSSS4KKwkgKi8KKwlTdHJpbmcgVVJJX1RZUEVfTk9ERV9TRUdNRU5UID0gIm5vZGUiOworCisJLy8gLyoqCisJLy8gKiBUaGlzIGlzIHRoZSB0eXBlIFVSSSBmb3IgYXJlYSBsYWJlbHMKKwkvLyAqLworCS8vIFVSSSBVUklfVFlQRV9HRU9HUkFQSElDX0ZFQVRVUkVfTk9ERSA9IFNURU1VUkkKKwkvLyAuY3JlYXRlVHlwZVVSSShVUklfVFlQRV9OT0RFX1NFR01FTlQpOworCisJLyoqCisJICogQHJldHVybiB0aGUge0BsaW5rIEVkZ2V9cyB0aGF0IHJlcHJlc2VudCB0aGUgcmVsYXRpb25zaGlwcyBvZiB0aGlzCisJICogICAgICAgICA8Y29kZT5Ob2RlPC9jb2RlPi4KKwkgKiBAbW9kZWwgdHlwZT0iRWRnZSIgY29udGFpbm1lbnQ9ImZhbHNlIgorCSAqLworCUVMaXN0PEVkZ2U+IGdldEVkZ2VzKCk7CisKKwkvKioKKwkgKiB0aGUge0BsaW5rIExhYmVsfXMgdGhhdCByZXByZXNlbnQgYXR0cmlidXRlcyBvZiB0aGlzIDxjb2RlPk5vZGU8L2NvZGU+LgorCSAqIAorCSAqIEBtb2RlbCB0eXBlPSJOb2RlTGFiZWwiIGNvbnRhaW5tZW50PSJmYWxzZSIgb3Bwb3NpdGU9Im5vZGUiCisJICovCisJRUxpc3Q8Tm9kZUxhYmVsPiBnZXRMYWJlbHMoKTsKKworfSAvLyBOb2RlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9Ob2RlTGFiZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL05vZGVMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjQ1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9Ob2RlTGFiZWwuamF2YQpAQCAtMCwwICsxLDQwIEBACisvLyBOb2RlTGFiZWwuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGg7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEEgPGNvZGU+Tm9kZUxhYmVsPC9jb2RlPiBpcyBhIHtAbGluayBMYWJlbH0gdGhhdCBwcm92aWRlcyBhdHRyaWJ1dGVzIHRvIGEKKyAqIHtAbGluayBOb2RlfS4KKyAqIAorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVMYWJlbCBleHRlbmRzIExhYmVsIHsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHtAbGluayBOb2RlfSB0aGF0IHRoaXMgPGNvZGU+Tm9kZUxhYmVsPC9jb2RlPiBsYWJlbHMuIFRoaXMKKwkgKiAgICAgICAgIHZhbHVlIGNhbiBiZSBudWxsIGluIGEgZ3JhcGggZnJhZ21lbnQuCisJICogCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJmYWxzZSIKKwkgKi8KKwlOb2RlIGdldE5vZGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWwjZ2V0Tm9kZSA8ZW0+Tm9kZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vZGU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE5vZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE5vZGUoTm9kZSB2YWx1ZSk7CisKK30gLy8gTm9kZUxhYmVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9SZXNldHRhYmxlQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvUmVzZXR0YWJsZUFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2YxNTEwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvUmVzZXR0YWJsZUFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDI1IEBACisvLyBSZXNldHRhYmxlQWRhcHRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IGFyZSA8Y29kZT5BZGFwdGVyPC9jb2RlPnMKKyAqIHRoYXQgY2FuIGJlIHJlc2V0LiBUaGlzIGlzIHR5cGljYWxseSBuZWVkZWQgd2hlbiB0aGUgYWRhcHRlciBtYWludGFpbnMgc29tZQorICoga2luZCBvZiBzdGF0ZSBpbmZvcm1hdGlvbiB0aGF0IG5lZWRzIHRvIGJlIHJlc2V0IHdoZW4gdGhlIHZhbHVlIG9mIHRoZQorICoge0BsaW5rIER5bmFtaWNMYWJlbH0gaXMgcmVzZXQuIFRoZSBtZXRob2Qge0BsaW5rIER5bmFtaWNMYWJlbCNyZXNldCgpfSBzY2FucworICogdGhyb3VnaCBhbGwgb2YgdGhlIGFkYXB0ZXJzIGF0dGFjaGVkIHRvIHtAbGluayBEeW5hbWljTGFiZWx9IGFuZCByZXNldHMgYWxsCisgKiB0aGF0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KKyAqLworcHVibGljIGludGVyZmFjZSBSZXNldHRhYmxlQWRhcHRlciB7CisJdm9pZCByZXNldCgpOworfSAvLyBSZXNldHRhYmxlQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvU2ltcGxlRGF0YUV4Y2hhbmdlTGFiZWxWYWx1ZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvU2ltcGxlRGF0YUV4Y2hhbmdlTGFiZWxWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1M2MwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9TaW1wbGVEYXRhRXhjaGFuZ2VMYWJlbFZhbHVlLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLy8gSW50ZWdyYXRpb25MYWJlbA0KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCisNCisvKioNCisgKiBUaGUgaW50ZXJmYWNlIGlzIHVzZWQgZm9yIHZhcmlvdXMgbW9kZWxzIHRvIGV4Y2hhbmdlIGluZm9ybWF0aW9uIHdpdGggZWFjaCBvdGhlci4gQSBwb3B1bGF0aW9uIG1vZGVsIA0KKyAqIHVzZXMgdGhpcyBpbnRlcmZhY2UgdG8gcmVwb3J0IGJpcnRocy9kZWF0aHMgYW5kIGluZmxvdy9vdXRmbG93IHZpYSBtaWdyYXRpb24uIEEgZGlzZWFzZSBtb2RlbCB1c2VzDQorICogaXQgdG8gcmVwb3J0IGRpc2Vhc2UgZGVhdGhzLg0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgU2ltcGxlRGF0YUV4Y2hhbmdlTGFiZWxWYWx1ZSAgZXh0ZW5kcyBFT2JqZWN0IHsNCisNCisJLyoqDQorCSAqIGdldEFycml2YWxzLiANCisJICogDQorCSAqIEByZXR1cm4gTWFwPE5vZGUsIERvdWJsZT4gQSBtYXAgd2hlcmUgdGhlIGtleSBpcyB0aGUgc291cmNlIG9mIHRoZSBhcnJpdmFsIChjYW4gYmUgbG9jYWwgbm9kZSBmb3IgYmlydGhzKQ0KKwkgKi8NCisJDQorCXB1YmxpYyBNYXA8Tm9kZSwgRG91YmxlPiBnZXRBcnJpdmFscygpOw0KKwkNCisJLyoqDQorCSAqIGdldERlcGFydHVyZXMNCisJICogDQorCSAqIEByZXR1cm4gTWFwPE5vZGUsIERvdWJsZT4gQSBtYXAgd2hlcmUgdGhlIGtleSBpcyB0aGUgc291cmNlIG9mIHRoZSBkZXBhcnR1cmUgKGNhbiBiZSBsb2NhbCBub2RlIGZvciBkZWF0aHMpDQorCSAqLw0KKwkNCisJcHVibGljIE1hcDxOb2RlLCBEb3VibGU+IGdldERlcGFydHVyZXMoKTsNCisJDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL1N0YXRpY0VkZ2VMYWJlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvU3RhdGljRWRnZUxhYmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRjNjNjZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL1N0YXRpY0VkZ2VMYWJlbC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8vIFN0YXRpY0VkZ2VMYWJlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5UcmlnZ2VyOworCisvKioKKyAqIEEgPGNvZGU+U3RhdGljRWRnZUxhYmVsPC9jb2RlPiBpcyBhbiB7QGxpbmsgRWRnZUxhYmVsfSB0aGF0IG9ubHkgaGFzIGEgc2luZ2xlCisgKiAiY3VycmVudCIge0BsaW5rIExhYmVsVmFsdWV9LiBJdCBpcyB0eXBpY2FsbHkgdXNlZCBmb3Ige0BsaW5rIEVkZ2V9CisgKiBhdHRyaWJ1dGVzIHRoYXQgcmFyZWx5IGNoYW5nZSBpbiBhIDxjb2RlPlNpbXVsYXRpb248L2NvZGU+LiBBbiBleGFtcGxlIHdvdWxkCisgKiBiZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIHJlZ2lvbnMgc2hhcmluZyBhIGNvbW1vbiBib3JkZXIuCisgKiA8cD4KKyAqIEJ5IGltcGxlbWVudGluZyB0aGUge0BsaW5rIE1vZGlmaWFibGV9IGludGVyZmFjZSwgYQorICogPGNvZGU+U3RhdGljRWRnZUxhYmVsPC9jb2RlPiBpcyBpZGVudGlmaWVkIGFzIGJlaW5nIHNvbWV0aGluZyB0aGF0IGNhbiBiZQorICogYWx0ZXJlZCBieSBhIHtAbGluayBNb2RpZmllcn0gYWN0aXZhdGVkIGJ5IGEge0BsaW5rIFRyaWdnZXJ9LgorICogCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3RhdGljRWRnZUxhYmVsIGV4dGVuZHMgRWRnZUxhYmVsLCBTdGF0aWNMYWJlbCB7CisJLy8gTm90aGluZworfSAvLyBTdGF0aWNFZGdlTGFiZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL1N0YXRpY0xhYmVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9TdGF0aWNMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZTViYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9TdGF0aWNMYWJlbC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8vIFN0YXRpY0xhYmVsCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKKworLyoqCisgKiBBIDxjb2RlPlN0YXRpY0xhYmVsPC9jb2RlPiBpcyBhIG1hcmtlciBjbGFzcy4KKyAqIAorICogQHNlZSBTdGF0aWNOb2RlTGFiZWwKKyAqIEBzZWUgU3RhdGljRWRnZUxhYmVsCisgKiAKKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKKyAqLworcHVibGljIGludGVyZmFjZSBTdGF0aWNMYWJlbCBleHRlbmRzIExhYmVsLCBNb2RpZmlhYmxlIHsKKwkvLyBOb3RoaW5nCit9IC8vIFN0YXRpY0xhYmVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9TdGF0aWNOb2RlTGFiZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL1N0YXRpY05vZGVMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMDVmOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9TdGF0aWNOb2RlTGFiZWwuamF2YQpAQCAtMCwwICsxLDM0IEBACisvLyBTdGF0aWNOb2RlTGFiZWwuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGg7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5UcmlnZ2VyOworCisvKioKKyAqIEEgPGNvZGU+U3RhdGljTm9kZUxhYmVsPC9jb2RlPiBpcyBhIHtAbGluayBOb2RlTGFiZWx9IHRoYXQgb25seSBoYXMgYSBzaW5nbGUKKyAqICJjdXJyZW50IiB7QGxpbmsgTGFiZWxWYWx1ZX0uIEl0IGlzIHR5cGljYWxseSB1c2VkIGZvciB7QGxpbmsgTm9kZX0KKyAqIGF0dHJpYnV0ZXMgdGhhdCByYXJlbHkgY2hhbmdlIGluIGEgPGNvZGU+U2ltdWxhdGlvbjwvY29kZT4uIEFuIGV4YW1wbGUgd291bGQKKyAqIGJlIHRoZSBhcmVhIG9mIGEgZ2VvZ3JhcGhpYyBsb2NhdGlvbi4KKyAqIDxwPgorICogQnkgaW1wbGVtZW50aW5nIHRoZSB7QGxpbmsgTW9kaWZpYWJsZX0gaW50ZXJmYWNlLCBhCisgKiA8Y29kZT5TdGF0aWNOb2RlTGFiZWw8L2NvZGU+IGlzIGlkZW50aWZpZWQgYXMgYmVpbmcgc29tZXRoaW5nIHRoYXQgY2FuIGJlCisgKiBhbHRlcmVkIGJ5IGEge0BsaW5rIE1vZGlmaWVyfSBhY3RpdmF0ZWQgYnkgYSB7QGxpbmsgVHJpZ2dlcn0uCisgKiAKKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKKyAqLworcHVibGljIGludGVyZmFjZSBTdGF0aWNOb2RlTGFiZWwgZXh0ZW5kcyBOb2RlTGFiZWwsIFN0YXRpY0xhYmVsIHsKKwkvLyBOb3RoaW5nCit9IC8vIFN0YXRpY05vZGVMYWJlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvVW5yZXNvbHZlZElkZW50aWZpYWJsZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvVW5yZXNvbHZlZElkZW50aWZpYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyN2I2YTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9VbnJlc29sdmVkSWRlbnRpZmlhYmxlLmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8vIFVucmVzb2x2ZWRJZGVudGlmaWFibGUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGg7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKKworLyoqCisgKiBBbiA8Y29kZT5VbnJlc29sdmVkSWRlbnRpZmlhYmxlPC9jb2RlPiBpcyBjcmVhdGVkIGR1cmluZyB0aGUgZ2VuZXJhdGlvbiBvZgorICogdGhlIGNhbm9uaWNhbCB7QGxpbmsgR3JhcGh9IChzZWUKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWwjZ2V0Q2Fub25pY2FsR3JhcGgoVVJJKSkgd2hlbiBhbiB7e0BsaW5rIEVkZ2V9CisgKiBvciBhIHtAbGluayBMYWJlbH0gY2Fubm90IGJlIG1hdGNoZWQgd2l0aCB0aGUge0BsaW5rIE5vZGV9IG9yIHtAbGluayBHcmFwaH0KKyAqIHRoYXQgaXRzIHRhcmdldCB7QGxpbmsgVVJJfSBzcGVjaWZpZXMuCisgKiA8cD4KKyAqIEluc3RhbmNlcyBvZiA8Y29kZT5VbnJlc29sdmVkSWRlbnRpZmlhYmxlPC9jb2RlPiBhcmUgdXNlZCB0byByZXBvcnQgdGhlCisgKiBpbmFiaWxpdHkgdG8gcmVzb2x2ZSB0aGUge0BsaW5rIFVSSX0uCisgKiA8L3A+CisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIFVucmVzb2x2ZWRJZGVudGlmaWFibGUgZXh0ZW5kcyBFT2JqZWN0IHsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW99IHRoYXQKKwkgKiBjb250YWlucyB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbH0gdGhhdCBpcworCSAqIGNyZWF0aW5nIHRoZSBjYW5vbmljYWwge0BsaW5rIEdyYXBofS4KKwkgKiAKKwkgKiBUT0RPIHNob3VsZG4ndCB0aGUgcmV0dXJuIHZhbHVlIGJlIFNjZW5hcmlvPworCSAqIAorCSAqIEBtb2RlbCBjb250YWlubWVudD0iZmFsc2UiCisJICovCisJSWRlbnRpZmlhYmxlIGdldFNjZW5hcmlvKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguVW5yZXNvbHZlZElkZW50aWZpYWJsZSNnZXRTY2VuYXJpbyA8ZW0+U2NlbmFyaW88L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2VuYXJpbzwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0U2NlbmFyaW8oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNjZW5hcmlvKElkZW50aWZpYWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB7QGxpbmsgTW9kZWx9IHRoYXQgd2FzIGNyZWF0aW5nIHRoZSBjYW5vbmljYWwge0BsaW5rIEdyYXBofQorCSAqIHdoZW4gdGhlIHVucmVzb2x2ZWQge0BsaW5rIFVSSX0gd2FzIGVuY291bnRlcmVkLgorCSAqIAorCSAqIEBtb2RlbCBjb250YWlubWVudD0iZmFsc2UiCisJICovCisJSWRlbnRpZmlhYmxlIGdldE1vZGVsKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguVW5yZXNvbHZlZElkZW50aWZpYWJsZSNnZXRNb2RlbCA8ZW0+TW9kZWw8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2RlbDwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0TW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1vZGVsKElkZW50aWZpYWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB7QGxpbmsgR3JhcGh9IHRoYXQgY29udGFpbnMgdGhlIHtAbGluayBFZGdlfSBvciB7QGxpbmsgTGFiZWx9CisJICogdGhhdCBoYXMgdGhlIHVucmVzb2x2ZWQge0BsaW5rIFVSSX0uCisJICogCisJICogVE9ETyBCVUcgdGhpcyB2YWx1ZSBpcyBhbHdheXMgbnVsbC4KKwkgKiAKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9ImZhbHNlIgorCSAqLworCUlkZW50aWZpYWJsZSBnZXRHcmFwaCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlVucmVzb2x2ZWRJZGVudGlmaWFibGUjZ2V0R3JhcGggPGVtPkdyYXBoPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R3JhcGg8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEdyYXBoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRHcmFwaChJZGVudGlmaWFibGUgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUge0BsaW5rIEVkZ2V9IG9yIHtAbGluayBMYWJlbH0gdGhhdCBoYXMgdGhlIHVucmVzb2x2ZWQgdGFyZ2V0CisJICogICAgICAgICB7QGxpbmsgVVJJfS4KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9ImZhbHNlIgorCSAqLworCUlkZW50aWZpYWJsZSBnZXRJZGVudGlmaWFibGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5VbnJlc29sdmVkSWRlbnRpZmlhYmxlI2dldElkZW50aWZpYWJsZSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRJZGVudGlmaWFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldElkZW50aWZpYWJsZShJZGVudGlmaWFibGUgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgdW5yZXNvbHZlZCB7QGxpbmsgVVJJfS4KKwkgKiAKKwkgKiBAbW9kZWwKKwkgKi8KKwlVUkkgZ2V0VW5yZXNvbHZlZFVSSSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlVucmVzb2x2ZWRJZGVudGlmaWFibGUjZ2V0VW5yZXNvbHZlZFVSSSA8ZW0+VW5yZXNvbHZlZCBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbnJlc29sdmVkIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VW5yZXNvbHZlZFVSSSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VW5yZXNvbHZlZFVSSShVUkkgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiBlaXRoZXIgIk5PREUgQSIgb3IgIk5PREUgQiIgZm9yIGFuIHtAbGluayBFZGdlfSwgb3IgIk5PREUiIGZvciBhCisJICogICAgICAgICB7QGxpbmsgTGFiZWx9LgorCSAqIEBtb2RlbAorCSAqLworCVN0cmluZyBnZXRGaWVsZE5hbWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5VbnJlc29sdmVkSWRlbnRpZmlhYmxlI2dldEZpZWxkTmFtZSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEZpZWxkTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RmllbGROYW1lKFN0cmluZyB2YWx1ZSk7CisKK30gLy8gVW5yZXNvbHZlZElkZW50aWZpYWJsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9EeW5hbWljRWRnZUxhYmVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9EeW5hbWljRWRnZUxhYmVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmY2NlNGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL0R5bmFtaWNFZGdlTGFiZWxJbXBsLmphdmEKQEAgLTAsMCArMSwyNjEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0VkZ2VMYWJlbDsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EeW5hbWljIEVkZ2UgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkR5bmFtaWNFZGdlTGFiZWxJbXBsI2dldEVkZ2UgPGVtPkVkZ2U8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEeW5hbWljRWRnZUxhYmVsSW1wbCBleHRlbmRzIER5bmFtaWNMYWJlbEltcGwgaW1wbGVtZW50cyBEeW5hbWljRWRnZUxhYmVsIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRHluYW1pY0VkZ2VMYWJlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuRFlOQU1JQ19FREdFX0xBQkVMOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxJbXBsI2dldElkZW50aWZpYWJsZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElkZW50aWZpYWJsZSBnZXRJZGVudGlmaWFibGUoKSB7CisJCXJldHVybiBnZXRFZGdlKCk7CisJfSAvLyBnZXRJZGVudGlmaWFibGUKKworCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxJbXBsI3NldElkZW50aWZpYWJsZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG5ld0lkZW50aWZpYWJsZSkgeworCQlzZXRFZGdlKChFZGdlKW5ld0lkZW50aWZpYWJsZSk7CisJfSAvLyBzZXRJZGVudGlmaWFibGUKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRnZSBnZXRFZGdlKCkgeworCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpICE9IEdyYXBoUGFja2FnZS5EWU5BTUlDX0VER0VfTEFCRUxfX0VER0UpIHJldHVybiBudWxsOworCQlyZXR1cm4gKEVkZ2UpZUNvbnRhaW5lcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVkZ2UoRWRnZSBuZXdFZGdlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdFZGdlLCBHcmFwaFBhY2thZ2UuRFlOQU1JQ19FREdFX0xBQkVMX19FREdFLCBtc2dzKTsKKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RWRnZShFZGdlIG5ld0VkZ2UpIHsKKwkJaWYgKG5ld0VkZ2UgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQoKSAhPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19FREdFX0xBQkVMX19FREdFICYmIG5ld0VkZ2UgIT0gbnVsbCkpIHsKKwkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdFZGdlKSkKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKKwkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKKwkJCWlmIChuZXdFZGdlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0VkZ2UpLmVJbnZlcnNlQWRkKHRoaXMsIEdyYXBoUGFja2FnZS5FREdFX19MQUJFTCwgRWRnZS5jbGFzcywgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRFZGdlKG5ld0VkZ2UsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhQYWNrYWdlLkRZTkFNSUNfRURHRV9MQUJFTF9fRURHRSwgbmV3RWRnZSwgbmV3RWRnZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkRZTkFNSUNfRURHRV9MQUJFTF9fRURHRToKKwkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKKwkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7CisJCQkJcmV0dXJuIGJhc2ljU2V0RWRnZSgoRWRnZSlvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkRZTkFNSUNfRURHRV9MQUJFTF9fRURHRToKKwkJCQlyZXR1cm4gYmFzaWNTZXRFZGdlKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQoKSkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19FREdFX0xBQkVMX19FREdFOgorCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBHcmFwaFBhY2thZ2UuRURHRV9fTEFCRUwsIEVkZ2UuY2xhc3MsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5EWU5BTUlDX0VER0VfTEFCRUxfX0VER0U6CisJCQkJcmV0dXJuIGdldEVkZ2UoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19FREdFX0xBQkVMX19FREdFOgorCQkJCXNldEVkZ2UoKEVkZ2UpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5EWU5BTUlDX0VER0VfTEFCRUxfX0VER0U6CisJCQkJc2V0RWRnZSgoRWRnZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkRZTkFNSUNfRURHRV9MQUJFTF9fRURHRToKKwkJCQlyZXR1cm4gZ2V0RWRnZSgpICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBFZGdlTGFiZWwuY2xhc3MpIHsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgeworCQkJCWNhc2UgR3JhcGhQYWNrYWdlLkRZTkFNSUNfRURHRV9MQUJFTF9fRURHRTogcmV0dXJuIEdyYXBoUGFja2FnZS5FREdFX0xBQkVMX19FREdFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgeworCQlpZiAoYmFzZUNsYXNzID09IEVkZ2VMYWJlbC5jbGFzcykgeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7CisJCQkJY2FzZSBHcmFwaFBhY2thZ2UuRURHRV9MQUJFTF9fRURHRTogcmV0dXJuIEdyYXBoUGFja2FnZS5EWU5BTUlDX0VER0VfTEFCRUxfX0VER0U7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKK30gLy9EeW5hbWljRWRnZUxhYmVsSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvRHluYW1pY0xhYmVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9EeW5hbWljTGFiZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlZGRiOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvRHluYW1pY0xhYmVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsNDA0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlJlc2V0dGFibGVBZGFwdGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EeW5hbWljIExhYmVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5EeW5hbWljTGFiZWxJbXBsI2lzTmV4dFZhbHVlVmFsaWQgPGVtPk5leHQgVmFsdWUgVmFsaWQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkR5bmFtaWNMYWJlbEltcGwjZ2V0TmV4dFZhbHVlIDxlbT5OZXh0IFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5EeW5hbWljTGFiZWxJbXBsI2dldERlY29yYXRvciA8ZW0+RGVjb3JhdG9yPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRHluYW1pY0xhYmVsSW1wbCBleHRlbmRzIExhYmVsSW1wbCBpbXBsZW1lbnRzIER5bmFtaWNMYWJlbCB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTmV4dFZhbHVlVmFsaWQoKSA8ZW0+TmV4dCBWYWx1ZSBWYWxpZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzTmV4dFZhbHVlVmFsaWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBORVhUX1ZBTFVFX1ZBTElEX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05leHRWYWx1ZVZhbGlkKCkgPGVtPk5leHQgVmFsdWUgVmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc05leHRWYWx1ZVZhbGlkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBuZXh0VmFsdWVWYWxpZCA9IE5FWFRfVkFMVUVfVkFMSURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROZXh0VmFsdWUoKSA8ZW0+TmV4dCBWYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5leHRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIExhYmVsVmFsdWUgbmV4dFZhbHVlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVjb3JhdG9yKCkgPGVtPkRlY29yYXRvcjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGVjb3JhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGVjb3JhdG9yIGRlY29yYXRvcjsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIER5bmFtaWNMYWJlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJCXNldFR5cGVVUkkoRHluYW1pY0xhYmVsLlVSSV9UWVBFX0RZTkFNSUNfTEFCRUwpOworCX0gLy8gRHluYW1pY0xhYmVsSW1wbAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gR3JhcGhQYWNrYWdlLkxpdGVyYWxzLkRZTkFNSUNfTEFCRUw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMYWJlbFZhbHVlIGdldE5leHRWYWx1ZSgpIHsKKwkJcmV0dXJuIG5leHRWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TmV4dFZhbHVlKExhYmVsVmFsdWUgbmV3TmV4dFZhbHVlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCUxhYmVsVmFsdWUgb2xkTmV4dFZhbHVlID0gbmV4dFZhbHVlOworCQluZXh0VmFsdWUgPSBuZXdOZXh0VmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEdyYXBoUGFja2FnZS5EWU5BTUlDX0xBQkVMX19ORVhUX1ZBTFVFLCBvbGROZXh0VmFsdWUsIG5ld05leHRWYWx1ZSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE5leHRWYWx1ZShMYWJlbFZhbHVlIG5ld05leHRWYWx1ZSkgeworCQlpZiAobmV3TmV4dFZhbHVlICE9IG5leHRWYWx1ZSkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAobmV4dFZhbHVlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5leHRWYWx1ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEdyYXBoUGFja2FnZS5EWU5BTUlDX0xBQkVMX19ORVhUX1ZBTFVFLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdOZXh0VmFsdWUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TmV4dFZhbHVlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTEFCRUxfX05FWFRfVkFMVUUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0TmV4dFZhbHVlKG5ld05leHRWYWx1ZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuRFlOQU1JQ19MQUJFTF9fTkVYVF9WQUxVRSwgbmV3TmV4dFZhbHVlLCBuZXdOZXh0VmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGVjb3JhdG9yIGdldERlY29yYXRvcigpIHsKKwkJaWYgKGRlY29yYXRvciAhPSBudWxsICYmIGRlY29yYXRvci5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkRGVjb3JhdG9yID0gKEludGVybmFsRU9iamVjdClkZWNvcmF0b3I7CisJCQlkZWNvcmF0b3IgPSAoRGVjb3JhdG9yKWVSZXNvbHZlUHJveHkob2xkRGVjb3JhdG9yKTsKKwkJCWlmIChkZWNvcmF0b3IgIT0gb2xkRGVjb3JhdG9yKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgR3JhcGhQYWNrYWdlLkRZTkFNSUNfTEFCRUxfX0RFQ09SQVRPUiwgb2xkRGVjb3JhdG9yLCBkZWNvcmF0b3IpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZGVjb3JhdG9yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEZWNvcmF0b3IgYmFzaWNHZXREZWNvcmF0b3IoKSB7CisJCXJldHVybiBkZWNvcmF0b3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RGVjb3JhdG9yKERlY29yYXRvciBuZXdEZWNvcmF0b3IsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJRGVjb3JhdG9yIG9sZERlY29yYXRvciA9IGRlY29yYXRvcjsKKwkJZGVjb3JhdG9yID0gbmV3RGVjb3JhdG9yOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuRFlOQU1JQ19MQUJFTF9fREVDT1JBVE9SLCBvbGREZWNvcmF0b3IsIG5ld0RlY29yYXRvcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RGVjb3JhdG9yKERlY29yYXRvciBuZXdEZWNvcmF0b3IpIHsKKwkJaWYgKG5ld0RlY29yYXRvciAhPSBkZWNvcmF0b3IpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGRlY29yYXRvciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClkZWNvcmF0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0xBQkVMU19UT19VUERBVEUsIERlY29yYXRvci5jbGFzcywgbXNncyk7CisJCQlpZiAobmV3RGVjb3JhdG9yICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0RlY29yYXRvcikuZUludmVyc2VBZGQodGhpcywgTW9kZWxQYWNrYWdlLkRFQ09SQVRPUl9fTEFCRUxTX1RPX1VQREFURSwgRGVjb3JhdG9yLmNsYXNzLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldERlY29yYXRvcihuZXdEZWNvcmF0b3IsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhQYWNrYWdlLkRZTkFNSUNfTEFCRUxfX0RFQ09SQVRPUiwgbmV3RGVjb3JhdG9yLCBuZXdEZWNvcmF0b3IpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNOZXh0VmFsdWVWYWxpZCgpIHsKKwkJcmV0dXJuIG5leHRWYWx1ZVZhbGlkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROZXh0VmFsdWVWYWxpZChib29sZWFuIG5ld05leHRWYWx1ZVZhbGlkKSB7CisJCWJvb2xlYW4gb2xkTmV4dFZhbHVlVmFsaWQgPSBuZXh0VmFsdWVWYWxpZDsKKwkJbmV4dFZhbHVlVmFsaWQgPSBuZXdOZXh0VmFsdWVWYWxpZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhQYWNrYWdlLkRZTkFNSUNfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQsIG9sZE5leHRWYWx1ZVZhbGlkLCBuZXh0VmFsdWVWYWxpZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFNldCB0aGUgbmV4dCB2YWx1ZSB2YWxpZCBmbGFnIHRvIGZhbHNlLiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCWdldEN1cnJlbnRWYWx1ZSgpLnJlc2V0KCk7CisJCWdldE5leHRWYWx1ZSgpLnJlc2V0KCk7CisJCXNldE5leHRWYWx1ZVZhbGlkKGZhbHNlKTsKKwkJLy8gUmVzZXQgYW55IGFkYXB0ZXJzIHRoYXQgYXJlIGF0dGFjaGVkIHRvIHRoaXMgaW5zdGFuY2UKKwkJZm9yIChBZGFwdGVyIGFkYXB0ZXIgOiBlQWRhcHRlcnMoKSkgeworCQkJLy8gSXMgaXQgcmVzZXR0YWJsZT8KKwkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgUmVzZXR0YWJsZUFkYXB0ZXIpIHsKKwkJCQkvLyBZZXMKKwkJCQlmaW5hbCBSZXNldHRhYmxlQWRhcHRlciByZXNldHRhYmxlQWRhcHRlciA9IChSZXNldHRhYmxlQWRhcHRlcikgYWRhcHRlcjsKKwkJCQlyZXNldHRhYmxlQWRhcHRlci5yZXNldCgpOworCQkJfSAvLyBpZiBSZXNldHRhYmxlQWRhcHRlcgorCQl9IC8vIGZvciBlYWNoIEFkYXB0ZXIKKwl9IC8vIHJlc2V0CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEV4Y2hhbmdlIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgbmV4dCB2YWx1ZS4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHN3aXRjaFRvTmV4dFZhbHVlKCkgeworCQlhc3NlcnQgaXNOZXh0VmFsdWVWYWxpZCgpOworCisJCWZpbmFsIExhYmVsVmFsdWUgdGVtcCA9IGdldEN1cnJlbnRWYWx1ZSgpOworCQlzZXRDdXJyZW50VmFsdWUoZ2V0TmV4dFZhbHVlKCkpOworCQlzZXROZXh0VmFsdWUodGVtcCk7CisJCXNldE5leHRWYWx1ZVZhbGlkKGZhbHNlKTsKKwl9IC8vIHN3aXRjaFRvTmV4dFZhbHVlCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5EWU5BTUlDX0xBQkVMX19ERUNPUkFUT1I6CisJCQkJaWYgKGRlY29yYXRvciAhPSBudWxsKQorCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZGVjb3JhdG9yKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19MQUJFTFNfVE9fVVBEQVRFLCBEZWNvcmF0b3IuY2xhc3MsIG1zZ3MpOworCQkJCXJldHVybiBiYXNpY1NldERlY29yYXRvcigoRGVjb3JhdG9yKW90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkRZTkFNSUNfTEFCRUxfX05FWFRfVkFMVUU6CisJCQkJcmV0dXJuIGJhc2ljU2V0TmV4dFZhbHVlKG51bGwsIG1zZ3MpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19MQUJFTF9fREVDT1JBVE9SOgorCQkJCXJldHVybiBiYXNpY1NldERlY29yYXRvcihudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkRZTkFNSUNfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQ6CisJCQkJcmV0dXJuIGlzTmV4dFZhbHVlVmFsaWQoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkRZTkFNSUNfTEFCRUxfX05FWFRfVkFMVUU6CisJCQkJcmV0dXJuIGdldE5leHRWYWx1ZSgpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19MQUJFTF9fREVDT1JBVE9SOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RGVjb3JhdG9yKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0RGVjb3JhdG9yKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5EWU5BTUlDX0xBQkVMX19ORVhUX1ZBTFVFX1ZBTElEOgorCQkJCXNldE5leHRWYWx1ZVZhbGlkKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoUGFja2FnZS5EWU5BTUlDX0xBQkVMX19ORVhUX1ZBTFVFOgorCQkJCXNldE5leHRWYWx1ZSgoTGFiZWxWYWx1ZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19MQUJFTF9fREVDT1JBVE9SOgorCQkJCXNldERlY29yYXRvcigoRGVjb3JhdG9yKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkRZTkFNSUNfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQ6CisJCQkJc2V0TmV4dFZhbHVlVmFsaWQoTkVYVF9WQUxVRV9WQUxJRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19MQUJFTF9fTkVYVF9WQUxVRToKKwkJCQlzZXROZXh0VmFsdWUoKExhYmVsVmFsdWUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19MQUJFTF9fREVDT1JBVE9SOgorCQkJCXNldERlY29yYXRvcigoRGVjb3JhdG9yKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkRZTkFNSUNfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQ6CisJCQkJcmV0dXJuIG5leHRWYWx1ZVZhbGlkICE9IE5FWFRfVkFMVUVfVkFMSURfRURFRkFVTFQ7CisJCQljYXNlIEdyYXBoUGFja2FnZS5EWU5BTUlDX0xBQkVMX19ORVhUX1ZBTFVFOgorCQkJCXJldHVybiBuZXh0VmFsdWUgIT0gbnVsbDsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkRZTkFNSUNfTEFCRUxfX0RFQ09SQVRPUjoKKwkJCQlyZXR1cm4gZGVjb3JhdG9yICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpCisJCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKworCQlyZXN1bHQuYXBwZW5kKCIgWyIpOworCQlyZXN1bHQuYXBwZW5kKG5leHRWYWx1ZS50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiICgiKTsKKwkJcmVzdWx0LmFwcGVuZChuZXh0VmFsdWVWYWxpZCA/ICJ2YWxpZCIgOiAiaW52YWxpZCIpOworCQlyZXN1bHQuYXBwZW5kKCIpIik7CisJCXJlc3VsdC5hcHBlbmQoIl0iKTsKKworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfSAvLyB0b1N0cmluZworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoLmltcGwuTGFiZWxJbXBsI3NhbmUoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2FuZSgpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHN1cGVyLnNhbmUoKTsKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBuZXh0VmFsdWUgIT0gbnVsbDsKKwkJYXNzZXJ0IHJldFZhbHVlOworCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgKGlzTmV4dFZhbHVlVmFsaWQoKSA/IG5leHRWYWx1ZS5zYW5lKCkgOiB0cnVlKTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgZ2V0RGVjb3JhdG9yKCkgIT0gbnVsbDsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gc2FuZQorCit9IC8vIER5bmFtaWNMYWJlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvRHluYW1pY05vZGVMYWJlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvRHluYW1pY05vZGVMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjQwMmUwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9EeW5hbWljTm9kZUxhYmVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjg0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsOworIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY05vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkR5bmFtaWMgTm9kZSBMYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuRHluYW1pY05vZGVMYWJlbEltcGwjZ2V0Tm9kZSA8ZW0+Tm9kZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIER5bmFtaWNOb2RlTGFiZWxJbXBsIGV4dGVuZHMgRHluYW1pY0xhYmVsSW1wbCBpbXBsZW1lbnRzCisJCUR5bmFtaWNOb2RlTGFiZWwgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vZGUoKSA8ZW0+Tm9kZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5vZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBOb2RlIG5vZGU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIER5bmFtaWNOb2RlTGFiZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEdyYXBoUGFja2FnZS5MaXRlcmFscy5EWU5BTUlDX05PREVfTEFCRUw7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbEltcGwjZ2V0SWRlbnRpZmlhYmxlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSWRlbnRpZmlhYmxlIGdldElkZW50aWZpYWJsZSgpIHsKKwkJcmV0dXJuIGdldE5vZGUoKTsKKwl9IC8vIGdldElkZW50aWZpYWJsZQorCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbEltcGwjc2V0SWRlbnRpZmlhYmxlKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldElkZW50aWZpYWJsZShJZGVudGlmaWFibGUgbmV3SWRlbnRpZmlhYmxlKSB7CisJCXNldE5vZGUoKE5vZGUpbmV3SWRlbnRpZmlhYmxlKTsKKwl9IC8vIHNldElkZW50aWZpYWJsZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7CisJCWlmIChub2RlICE9IG51bGwgJiYgbm9kZS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkTm9kZSA9IChJbnRlcm5hbEVPYmplY3Qpbm9kZTsKKwkJCW5vZGUgPSAoTm9kZSllUmVzb2x2ZVByb3h5KG9sZE5vZGUpOworCQkJaWYgKG5vZGUgIT0gb2xkTm9kZSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfX05PREUsIG9sZE5vZGUsIG5vZGUpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbm9kZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vZGUgYmFzaWNHZXROb2RlKCkgeworCQlyZXR1cm4gbm9kZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXROb2RlKE5vZGUgbmV3Tm9kZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlOb2RlIG9sZE5vZGUgPSBub2RlOworCQlub2RlID0gbmV3Tm9kZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhQYWNrYWdlLkRZTkFNSUNfTk9ERV9MQUJFTF9fTk9ERSwgb2xkTm9kZSwgbmV3Tm9kZSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE5vZGUoTm9kZSBuZXdOb2RlKSB7CisJCWlmIChuZXdOb2RlICE9IG5vZGUpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKG5vZGUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpbm9kZSkuZUludmVyc2VSZW1vdmUodGhpcywgR3JhcGhQYWNrYWdlLk5PREVfX0xBQkVMUywgTm9kZS5jbGFzcywgbXNncyk7CisJCQlpZiAobmV3Tm9kZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdOb2RlKS5lSW52ZXJzZUFkZCh0aGlzLCBHcmFwaFBhY2thZ2UuTk9ERV9fTEFCRUxTLCBOb2RlLmNsYXNzLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldE5vZGUobmV3Tm9kZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuRFlOQU1JQ19OT0RFX0xBQkVMX19OT0RFLCBuZXdOb2RlLCBuZXdOb2RlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19OT0RFX0xBQkVMX19OT0RFOgorCQkJCWlmIChub2RlICE9IG51bGwpCisJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClub2RlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBHcmFwaFBhY2thZ2UuTk9ERV9fTEFCRUxTLCBOb2RlLmNsYXNzLCBtc2dzKTsKKwkJCQlyZXR1cm4gYmFzaWNTZXROb2RlKChOb2RlKW90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19OT0RFX0xBQkVMX19OT0RFOgorCQkJCXJldHVybiBiYXNpY1NldE5vZGUobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaC5pbXBsLkR5bmFtaWNMYWJlbEltcGwjdG9TdHJpbmcoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzdXBlci50b1N0cmluZygpKTsKKworCQlzYi5hcHBlbmQoIiBOb2RlOiIpOworCQlzYi5hcHBlbmQobm9kZSA9PSBudWxsID8gIm51bGwiIDogbm9kZS50b1N0cmluZygpKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfSAvLyB0b1N0cmluZworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoLmltcGwuRHluYW1pY0xhYmVsSW1wbCNzYW5lKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzYW5lKCkgeworCQlib29sZWFuIHJldFZhbHVlID0gc3VwZXIuc2FuZSgpOworCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgZ2V0Tm9kZSgpICE9IG51bGwgPyBnZXRVUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKCkKKwkJCQkuZXF1YWxzKGdldE5vZGUoKS5nZXRVUkkoKSkKKwkJCQk6IHRydWU7CisJCWFzc2VydCByZXRWYWx1ZTsKKwkJCQorCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIGdldE5vZGUoKSA9PSBnZXRJZGVudGlmaWFibGUoKTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gc2FuZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkRZTkFNSUNfTk9ERV9MQUJFTF9fTk9ERToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE5vZGUoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXROb2RlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfX05PREU6CisJCQkJc2V0Tm9kZSgoTm9kZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfX05PREU6CisJCQkJc2V0Tm9kZSgoTm9kZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfX05PREU6CisJCQkJcmV0dXJuIG5vZGUgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBOb2RlTGFiZWwuY2xhc3MpIHsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgeworCQkJCWNhc2UgR3JhcGhQYWNrYWdlLkRZTkFNSUNfTk9ERV9MQUJFTF9fTk9ERTogcmV0dXJuIEdyYXBoUGFja2FnZS5OT0RFX0xBQkVMX19OT0RFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBOb2RlTGFiZWwuY2xhc3MpIHsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgeworCQkJCWNhc2UgR3JhcGhQYWNrYWdlLk5PREVfTEFCRUxfX05PREU6IHJldHVybiBHcmFwaFBhY2thZ2UuRFlOQU1JQ19OT0RFX0xBQkVMX19OT0RFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCit9IC8vIER5bmFtaWNOb2RlTGFiZWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL0VkZ2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL0VkZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkMGRjZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvRWRnZUltcGwuamF2YQpAQCAtMCwwICsxLDcyOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5JZGVudGlmaWFibGVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FZGdlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5FZGdlSW1wbCNnZXRBIDxlbT5BPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5FZGdlSW1wbCNnZXROb2RlQVVSSSA8ZW0+Tm9kZSBBVVJJPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5FZGdlSW1wbCNnZXRCIDxlbT5CPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5FZGdlSW1wbCNnZXROb2RlQlVSSSA8ZW0+Tm9kZSBCVVJJPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5FZGdlSW1wbCNnZXRMYWJlbCA8ZW0+TGFiZWw8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkVkZ2VJbXBsI2lzRGlyZWN0ZWQgPGVtPkRpcmVjdGVkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRWRnZUltcGwgZXh0ZW5kcyBJZGVudGlmaWFibGVJbXBsIGltcGxlbWVudHMgRWRnZSB7CisJCisJCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QSgpIDxlbT5BPC9lbT59JyByZWZlcmVuY2UuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjZ2V0QSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIE5vZGUgYTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb2RlQVVSSSgpIDxlbT5Ob2RlIEFVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROb2RlQVVSSSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgTk9ERV9BVVJJX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vZGVBVVJJKCkgPGVtPk5vZGUgQVVSSTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5vZGVBVVJJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVVJJIG5vZGVBVVJJID0gTk9ERV9BVVJJX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QigpIDxlbT5CPC9lbT59JyByZWZlcmVuY2UuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjZ2V0QigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIE5vZGUgYjsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb2RlQlVSSSgpIDxlbT5Ob2RlIEJVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROb2RlQlVSSSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgTk9ERV9CVVJJX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vZGVCVVJJKCkgPGVtPk5vZGUgQlVSSTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5vZGVCVVJJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVVJJIG5vZGVCVVJJID0gTk9ERV9CVVJJX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFiZWwoKSA8ZW0+TGFiZWw8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVkZ2VMYWJlbCBsYWJlbDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RpcmVjdGVkKCkgPGVtPkRpcmVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNEaXJlY3RlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERJUkVDVEVEX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RpcmVjdGVkKCkgPGVtPkRpcmVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNEaXJlY3RlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZGlyZWN0ZWQgPSBESVJFQ1RFRF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIEVkZ2VJbXBsKCkgeworCQlzdXBlcigpOworLy8JCXNldFVSSShTVEVNVVJJLmNyZWF0ZVVSSShVUklfVFlQRV9FREdFX1NFR01FTlQgKyAiLyIKKy8vCQkJCSsgU1RFTVVSSS5nZW5lcmF0ZVVuaXF1ZVBhcnQoKSkpOworCQlzZXRUeXBlVVJJKFNURU1VUkkuRURHRV9UWVBFX1VSSSk7CisJfSAvLyBFZGdlSW1wbAorCisJLyoqCisJICogQ3JlYXRlIGFuIHVuZGlyZWN0ZWQgZWRnZSBiZXR3ZWVuIHR3byBub2RlcworCSAqIAorCSAqIEBwYXJhbSBub2RlQQorCSAqICAgICAgICAgICAgdGhlIGZpcnN0IG5vZGUKKwkgKiBAcGFyYW0gbm9kZUIKKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgbm9kZQorCSAqIEByZXR1cm4gYW4gZWRnZSBiZXR3ZWVuIG5vZGVBIGFuZCBub2RlQiwgaWYgZGlyZWN0ZWQgdGhlbiBmcm9tIG5vZGVBIHRvCisJICogICAgICAgICBub2RlQgorCSAqLworCXB1YmxpYyBzdGF0aWMgRWRnZSBjcmVhdGVFZGdlKGZpbmFsIE5vZGUgbm9kZUEsIGZpbmFsIE5vZGUgbm9kZUIpIHsKKwkJcmV0dXJuIGNyZWF0ZUVkZ2Uobm9kZUEsIG5vZGVCLCBmYWxzZSwgbnVsbCk7CisJfSAvLyBjcmVhdGVFZGdlCisKKwkvKioKKwkgKiBDcmVhdGUgYW4gdW5kaXJlY3RlZCBlZGdlIGJldHdlZW4gdHdvIG5vZGVzCisJICogCisJICogQHBhcmFtIG5vZGVBCisJICogICAgICAgICAgICB0aGUgZmlyc3Qgbm9kZQorCSAqIEBwYXJhbSBub2RlQgorCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBub2RlCisJICogQHBhcmFtIGVkZ2VVUkkKKwkgKiAgICAgICAgICAgIGlmIG5vbi1udWxsIHRoZW4gdGhlIFVSSSB0byB1c2UgZm9yIHRoZSBlZGdlLCBpZiBudWxsIHRoZW4gdGhlCisJICogICAgICAgICAgICBkZWZhdWx0IGlzIHVzZWQuCisJICogCisJICogQHJldHVybiBhbiBlZGdlIGJldHdlZW4gbm9kZUEgYW5kIG5vZGVCLCBpZiBkaXJlY3RlZCB0aGVuIGZyb20gbm9kZUEgdG8KKwkgKiAgICAgICAgIG5vZGVCCisJICovCisJcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZUVkZ2UoZmluYWwgTm9kZSBub2RlQSwgZmluYWwgTm9kZSBub2RlQiwKKwkJCWZpbmFsIFVSSSBlZGdlVVJJKSB7CisJCXJldHVybiBjcmVhdGVFZGdlKG5vZGVBLCBub2RlQiwgZmFsc2UsIGVkZ2VVUkkpOworCX0gLy8gY3JlYXRlRWRnZQorCisJLyoqCisJICogQ3JlYXRlIGFuIGVkZ2UgYmV0d2VlbiB0aGUgdHdvIG5vZGVzCisJICogCisJICogQHBhcmFtIG5vZGVBCisJICogICAgICAgICAgICB0aGUgZmlyc3Qgbm9kZQorCSAqIEBwYXJhbSBub2RlQgorCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBub2RlCisJICogQHJldHVybiBhbiBlZGdlIGJldHdlZW4gbm9kZUEgYW5kIG5vZGVCLCBpZiBkaXJlY3RlZCB0aGVuIGZyb20gbm9kZUEgdG8KKwkgKiAgICAgICAgIG5vZGVCCisJICovCisJcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZUVkZ2UoZmluYWwgTm9kZSBub2RlQSwgZmluYWwgTm9kZSBub2RlQiwKKwkJCWZpbmFsIGJvb2xlYW4gZGlyZWN0ZWQpIHsKKwkJcmV0dXJuIGNyZWF0ZUVkZ2Uobm9kZUEsIG5vZGVCLCBkaXJlY3RlZCwgbnVsbCk7CisJfSAvLyBjcmVhdGVFZGdlCisKKwkvKioKKwkgKiBDcmVhdGUgYW4gZWRnZSBiZXR3ZWVuIHRoZSB0d28gbm9kZXMKKwkgKiAKKwkgKiBAcGFyYW0gbm9kZUEKKwkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBub2RlCisJICogQHBhcmFtIG5vZGVCCisJICogICAgICAgICAgICB0aGUgc2Vjb25kIG5vZGUKKwkgKiBAcGFyYW0gZWRnZVVSSQorCSAqICAgICAgICAgICAgaWYgbm9uLW51bGwgdGhlbiB0aGUgVVJJIHRvIHVzZSBmb3IgdGhlIGVkZ2UsIGlmIG51bGwgdGhlbiB0aGUKKwkgKiAgICAgICAgICAgIGRlZmF1bHQgaXMgdXNlZC4KKwkgKiAKKwkgKiBAcmV0dXJuIGFuIGVkZ2UgYmV0d2VlbiBub2RlQSBhbmQgbm9kZUIsIGlmIGRpcmVjdGVkIHRoZW4gZnJvbSBub2RlQSB0bworCSAqICAgICAgICAgbm9kZUIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEVkZ2UgY3JlYXRlRWRnZShmaW5hbCBOb2RlIG5vZGVBLCBmaW5hbCBOb2RlIG5vZGVCLAorCQkJZmluYWwgYm9vbGVhbiBkaXJlY3RlZCwgZmluYWwgVVJJIGVkZ2VVUkkpIHsKKwkJZmluYWwgRWRnZSByZXRWYWx1ZSA9IGNyZWF0ZUVkZ2Uobm9kZUEuZ2V0VVJJKCksIG5vZGVCLmdldFVSSSgpLAorCQkJCWRpcmVjdGVkLCBlZGdlVVJJKTsKKwkJcmV0VmFsdWUuc2V0QShub2RlQSk7CisJCXJldFZhbHVlLnNldEIobm9kZUIpOworCisJCW5vZGVBLmdldEVkZ2VzKCkuYWRkKHJldFZhbHVlKTsKKwkJbm9kZUIuZ2V0RWRnZXMoKS5hZGQocmV0VmFsdWUpOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUVkZ2UKKworCS8qKgorCSAqIENyZWF0ZSBhbiB1bmRpcmVjdGVkIGVkZ2Ugd2l0aCB0d28gbm9kZSBVUkkncworCSAqIAorCSAqIEBwYXJhbSBub2RlQVVSSQorCSAqICAgICAgICAgICAgdGhlIGZpcnN0IG5vZGUncyBVUkkKKwkgKiBAcGFyYW0gbm9kZUJVUkkKKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgbm9kZSdzIFVSSQorCSAqIAorCSAqIEByZXR1cm4gYW4gZWRnZSB3aXRoIHR3byBVUkkncywgaWYgZGlyZWN0ZWQgdGhlbiBmcm9tIG5vZGVBVVJJIHRvCisJICogICAgICAgICBub2RlQlVSSQorCSAqLworCXB1YmxpYyBzdGF0aWMgRWRnZSBjcmVhdGVFZGdlKGZpbmFsIFVSSSBub2RlQVVSSSwgZmluYWwgVVJJIG5vZGVCVVJJKSB7CisJCXJldHVybiBjcmVhdGVFZGdlKG5vZGVBVVJJLCBub2RlQlVSSSwgZmFsc2UsIG51bGwpOworCX0gLy8gY3JlYXRlRWRnZQorCisJLyoqCisJICogQ3JlYXRlIGFuIHVuZGlyZWN0ZWQgZWRnZSB3aXRoIHR3byBub2RlIFVSSSdzCisJICogCisJICogQHBhcmFtIG5vZGVBVVJJCisJICogICAgICAgICAgICB0aGUgZmlyc3Qgbm9kZSdzIFVSSQorCSAqIEBwYXJhbSBub2RlQlVSSQorCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBub2RlJ3MgVVJJCisJICogQHBhcmFtIGVkZ2VVUkkKKwkgKiAgICAgICAgICAgIGlmIG5vbi1udWxsIHRoZW4gdGhlIFVSSSB0byB1c2UgZm9yIHRoZSBlZGdlLCBpZiBudWxsIHRoZW4gdGhlCisJICogICAgICAgICAgICBkZWZhdWx0IGlzIHVzZWQuCisJICogCisJICogQHJldHVybiBhbiBlZGdlIHdpdGggdHdvIFVSSSdzLCBpZiBkaXJlY3RlZCB0aGVuIGZyb20gbm9kZUFVUkkgdG8KKwkgKiAgICAgICAgIG5vZGVCVVJJCisJICovCisJcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZUVkZ2UoZmluYWwgVVJJIG5vZGVBVVJJLCBmaW5hbCBVUkkgbm9kZUJVUkksCisJCQlmaW5hbCBVUkkgZWRnZVVSSSkgeworCQlyZXR1cm4gY3JlYXRlRWRnZShub2RlQVVSSSwgbm9kZUJVUkksIGZhbHNlLCBlZGdlVVJJKTsKKwl9IC8vIGNyZWF0ZUVkZ2UKKworCS8qKgorCSAqIENyZWF0ZSBhbiBlZGdlIHdpdGggdHdvIG5vZGUgVVJJJ3MKKwkgKiAKKwkgKiBAcGFyYW0gbm9kZUFVUkkKKwkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBub2RlJ3MgVVJJCisJICogQHBhcmFtIG5vZGVCVVJJCisJICogICAgICAgICAgICB0aGUgc2Vjb25kIG5vZGUncyBVUkkKKwkgKiBAcGFyYW0gZGlyZWN0ZWQKKwkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIGVkZ2UgaXMgZGlyZWN0ZWQgZnJvbSBub2RlQVVSSSB0byBub2RlQlVSSQorCSAqIAorCSAqIEByZXR1cm4gYW4gZWRnZSB3aXRoIHR3byBVUkkncywgaWYgZGlyZWN0ZWQgdGhlbiBmcm9tIG5vZGVBVVJJIHRvCisJICogICAgICAgICBub2RlQlVSSQorCSAqLworCXB1YmxpYyBzdGF0aWMgRWRnZSBjcmVhdGVFZGdlKGZpbmFsIFVSSSBub2RlQVVSSSwgZmluYWwgVVJJIG5vZGVCVVJJLAorCQkJZmluYWwgYm9vbGVhbiBkaXJlY3RlZCkgeworCQlyZXR1cm4gY3JlYXRlRWRnZShub2RlQVVSSSwgbm9kZUJVUkksIGRpcmVjdGVkLCBudWxsKTsKKwl9IC8vIGNyZWF0ZUVkZ2UKKworCS8qKgorCSAqIENyZWF0ZSBhbiBlZGdlIHdpdGggdHdvIG5vZGUgVVJJJ3MKKwkgKiAKKwkgKiBAcGFyYW0gbm9kZUFVUkkKKwkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBub2RlJ3MgVVJJCisJICogQHBhcmFtIG5vZGVCVVJJCisJICogICAgICAgICAgICB0aGUgc2Vjb25kIG5vZGUncyBVUkkKKwkgKiBAcGFyYW0gZGlyZWN0ZWQKKwkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIGVkZ2UgaXMgZGlyZWN0ZWQgZnJvbSBub2RlQVVSSSB0byBub2RlQlVSSQorCSAqIAorCSAqIEBwYXJhbSBlZGdlVVJJCisJICogICAgICAgICAgICBpZiBub24tbnVsbCB0aGVuIHRoZSBVUkkgdG8gdXNlIGZvciB0aGUgZWRnZSwgaWYgbnVsbCB0aGVuIHRoZQorCSAqICAgICAgICAgICAgZGVmYXVsdCBpcyB1c2VkLgorCSAqIAorCSAqIEByZXR1cm4gYW4gZWRnZSB3aXRoIHR3byBVUkkncywgaWYgZGlyZWN0ZWQgdGhlbiBmcm9tIG5vZGVBVVJJIHRvCisJICogICAgICAgICBub2RlQlVSSQorCSAqLworCXB1YmxpYyBzdGF0aWMgRWRnZSBjcmVhdGVFZGdlKGZpbmFsIFVSSSBub2RlQVVSSSwgZmluYWwgVVJJIG5vZGVCVVJJLAorCQkJZmluYWwgYm9vbGVhbiBkaXJlY3RlZCwgZmluYWwgVVJJIGVkZ2VVUkkpIHsKKwkJZmluYWwgRWRnZSByZXRWYWx1ZSA9IEdyYXBoRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRWRnZSgpOworCQlyZXRWYWx1ZS5zZXROb2RlQVVSSShub2RlQVVSSSk7CisJCXJldFZhbHVlLnNldE5vZGVCVVJJKG5vZGVCVVJJKTsKKwkJcmV0VmFsdWUuc2V0RGlyZWN0ZWQoZGlyZWN0ZWQpOworCQkvLyBFZGdlIFVSSSBzcGVjaWZpZWQ/CisJCWlmIChlZGdlVVJJICE9IG51bGwpIAorCQkJLy8gWWVzCisJCQlyZXRWYWx1ZS5zZXRVUkkoZWRnZVVSSSk7CisJCWVsc2UgCisJCQlyZXRWYWx1ZS5zZXRVUkkoU1RFTVVSSS5jcmVhdGVVUkkoVVJJX1RZUEVfRURHRV9TRUdNRU5UICsgIi8iCisJCQkJCSsgU1RFTVVSSS5nZW5lcmF0ZVVuaXF1ZVBhcnQoKSkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVFZGdlCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuRURHRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vZGUgZ2V0QSgpIHsKKwkJaWYgKGEgIT0gbnVsbCAmJiBhLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRBID0gKEludGVybmFsRU9iamVjdClhOworCQkJYSA9IChOb2RlKWVSZXNvbHZlUHJveHkob2xkQSk7CisJCQlpZiAoYSAhPSBvbGRBKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgR3JhcGhQYWNrYWdlLkVER0VfX0EsIG9sZEEsIGEpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vZGUgYmFzaWNHZXRBKCkgeworCQlyZXR1cm4gYTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QShOb2RlIG5ld0EpIHsKKwkJTm9kZSBvbGRBID0gYTsKKwkJYSA9IG5ld0E7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEdyYXBoUGFja2FnZS5FREdFX19BLCBvbGRBLCBhKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVUkkgZ2V0Tm9kZUFVUkkoKSB7CisJCXJldHVybiBub2RlQVVSSTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Tm9kZUFVUkkoVVJJIG5ld05vZGVBVVJJKSB7CisJCVVSSSBvbGROb2RlQVVSSSA9IG5vZGVBVVJJOworCQlub2RlQVVSSSA9IG5ld05vZGVBVVJJOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuRURHRV9fTk9ERV9BVVJJLCBvbGROb2RlQVVSSSwgbm9kZUFVUkkpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vZGUgZ2V0QigpIHsKKwkJaWYgKGIgIT0gbnVsbCAmJiBiLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRCID0gKEludGVybmFsRU9iamVjdCliOworCQkJYiA9IChOb2RlKWVSZXNvbHZlUHJveHkob2xkQik7CisJCQlpZiAoYiAhPSBvbGRCKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgR3JhcGhQYWNrYWdlLkVER0VfX0IsIG9sZEIsIGIpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vZGUgYmFzaWNHZXRCKCkgeworCQlyZXR1cm4gYjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QihOb2RlIG5ld0IpIHsKKwkJTm9kZSBvbGRCID0gYjsKKwkJYiA9IG5ld0I7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEdyYXBoUGFja2FnZS5FREdFX19CLCBvbGRCLCBiKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVUkkgZ2V0Tm9kZUJVUkkoKSB7CisJCXJldHVybiBub2RlQlVSSTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Tm9kZUJVUkkoVVJJIG5ld05vZGVCVVJJKSB7CisJCVVSSSBvbGROb2RlQlVSSSA9IG5vZGVCVVJJOworCQlub2RlQlVSSSA9IG5ld05vZGVCVVJJOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuRURHRV9fTk9ERV9CVVJJLCBvbGROb2RlQlVSSSwgbm9kZUJVUkkpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkZ2VMYWJlbCBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIGxhYmVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldExhYmVsKEVkZ2VMYWJlbCBuZXdMYWJlbCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlFZGdlTGFiZWwgb2xkTGFiZWwgPSBsYWJlbDsKKwkJbGFiZWwgPSBuZXdMYWJlbDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhQYWNrYWdlLkVER0VfX0xBQkVMLCBvbGRMYWJlbCwgbmV3TGFiZWwpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldExhYmVsKEVkZ2VMYWJlbCBuZXdMYWJlbCkgeworCQlpZiAobmV3TGFiZWwgIT0gbGFiZWwpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGxhYmVsICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWxhYmVsKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBHcmFwaFBhY2thZ2UuRURHRV9MQUJFTF9fRURHRSwgRWRnZUxhYmVsLmNsYXNzLCBtc2dzKTsKKwkJCWlmIChuZXdMYWJlbCAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdMYWJlbCkuZUludmVyc2VBZGQodGhpcywgR3JhcGhQYWNrYWdlLkVER0VfTEFCRUxfX0VER0UsIEVkZ2VMYWJlbC5jbGFzcywgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRMYWJlbChuZXdMYWJlbCwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuRURHRV9fTEFCRUwsIG5ld0xhYmVsLCBuZXdMYWJlbCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdGVkKCkgeworCQlyZXR1cm4gZGlyZWN0ZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERpcmVjdGVkKGJvb2xlYW4gbmV3RGlyZWN0ZWQpIHsKKwkJYm9vbGVhbiBvbGREaXJlY3RlZCA9IGRpcmVjdGVkOworCQlkaXJlY3RlZCA9IG5ld0RpcmVjdGVkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuRURHRV9fRElSRUNURUQsIG9sZERpcmVjdGVkLCBkaXJlY3RlZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogR2l2ZW4gb25lIG5vZGUgb2YgYW4gZWRnZSwgcmV0dXJuIHRoZSBvdGhlci4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBOb2RlIGdldE90aGVyTm9kZShOb2RlIG5vZGUpIHsKKwkJYXNzZXJ0IGdldEEoKS5lcXVhbHMobm9kZSkgfHwgZ2V0QigpLmVxdWFscyhub2RlKTsKKwkJcmV0dXJuIGdldEEoKS5lcXVhbHMobm9kZSkgPyBnZXRCKCkgOiBnZXRBKCk7CisJfSAvLyBnZXRPdGhlck5vZGUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbm9kZSBpcyBCIGFuZCB0aGUgZWRnZSBpcyBkaXJlY3RlZC4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0ZWRBdChOb2RlIG5vZGUpIHsKKwkJcmV0dXJuIGlzRGlyZWN0ZWQoKSAmJiAoIGIgIT0gbnVsbCAmJiBiLmVxdWFscyhub2RlKSAKKwkJCQl8fCBiPT0gbnVsbCAmJiBub2RlQlVSSS5lcXVhbHMobm9kZS5nZXRVUkkoKSkpOworCX0gLy8gaXNEaXJlY3RlZEF0CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5FREdFX19MQUJFTDoKKwkJCQlpZiAobGFiZWwgIT0gbnVsbCkKKwkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWxhYmVsKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gR3JhcGhQYWNrYWdlLkVER0VfX0xBQkVMLCBudWxsLCBtc2dzKTsKKwkJCQlyZXR1cm4gYmFzaWNTZXRMYWJlbCgoRWRnZUxhYmVsKW90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkVER0VfX0xBQkVMOgorCQkJCXJldHVybiBiYXNpY1NldExhYmVsKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRURHRV9fQToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEEoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRBKCk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5FREdFX19OT0RFX0FVUkk6CisJCQkJcmV0dXJuIGdldE5vZGVBVVJJKCk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5FREdFX19COgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0QigpOworCQkJCXJldHVybiBiYXNpY0dldEIoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkVER0VfX05PREVfQlVSSToKKwkJCQlyZXR1cm4gZ2V0Tm9kZUJVUkkoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkVER0VfX0xBQkVMOgorCQkJCXJldHVybiBnZXRMYWJlbCgpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRURHRV9fRElSRUNURUQ6CisJCQkJcmV0dXJuIGlzRGlyZWN0ZWQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkVER0VfX0E6CisJCQkJc2V0QSgoTm9kZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRURHRV9fTk9ERV9BVVJJOgorCQkJCXNldE5vZGVBVVJJKChVUkkpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkVER0VfX0I6CisJCQkJc2V0QigoTm9kZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRURHRV9fTk9ERV9CVVJJOgorCQkJCXNldE5vZGVCVVJJKChVUkkpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkVER0VfX0xBQkVMOgorCQkJCXNldExhYmVsKChFZGdlTGFiZWwpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkVER0VfX0RJUkVDVEVEOgorCQkJCXNldERpcmVjdGVkKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkVER0VfX0E6CisJCQkJc2V0QSgoTm9kZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoUGFja2FnZS5FREdFX19OT0RFX0FVUkk6CisJCQkJc2V0Tm9kZUFVUkkoTk9ERV9BVVJJX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoUGFja2FnZS5FREdFX19COgorCQkJCXNldEIoKE5vZGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRURHRV9fTk9ERV9CVVJJOgorCQkJCXNldE5vZGVCVVJJKE5PREVfQlVSSV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRURHRV9fTEFCRUw6CisJCQkJc2V0TGFiZWwoKEVkZ2VMYWJlbCludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoUGFja2FnZS5FREdFX19ESVJFQ1RFRDoKKwkJCQlzZXREaXJlY3RlZChESVJFQ1RFRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRURHRV9fQToKKwkJCQlyZXR1cm4gYSAhPSBudWxsOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRURHRV9fTk9ERV9BVVJJOgorCQkJCXJldHVybiBOT0RFX0FVUklfRURFRkFVTFQgPT0gbnVsbCA/IG5vZGVBVVJJICE9IG51bGwgOiAhTk9ERV9BVVJJX0VERUZBVUxULmVxdWFscyhub2RlQVVSSSk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5FREdFX19COgorCQkJCXJldHVybiBiICE9IG51bGw7CisJCQljYXNlIEdyYXBoUGFja2FnZS5FREdFX19OT0RFX0JVUkk6CisJCQkJcmV0dXJuIE5PREVfQlVSSV9FREVGQVVMVCA9PSBudWxsID8gbm9kZUJVUkkgIT0gbnVsbCA6ICFOT0RFX0JVUklfRURFRkFVTFQuZXF1YWxzKG5vZGVCVVJJKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkVER0VfX0xBQkVMOgorCQkJCXJldHVybiBsYWJlbCAhPSBudWxsOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRURHRV9fRElSRUNURUQ6CisJCQkJcmV0dXJuIGRpcmVjdGVkICE9IERJUkVDVEVEX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKQorCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworCisJCXJlc3VsdC5hcHBlbmQoYSAhPSBudWxsID8gYSA6ICAoIG5vZGVBVVJJICE9IG51bGwgPyBub2RlQVVSSS50b1N0cmluZygpIDogIm51bGwiKSk7CisKKwkJcmVzdWx0LmFwcGVuZChkaXJlY3RlZCA/ICIgLT4gIiA6ICIgLS0gIik7CisKKwkJcmVzdWx0LmFwcGVuZChiICE9IG51bGwgPyBiIDogKCBub2RlQlVSSSAhPSBudWxsID8gbm9kZUJVUkkudG9TdHJpbmcoKSA6ICJudWxsIikpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfSAvLyB0b1N0cmluZworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvbW1vbi5pbXBsLklkZW50aWZpYWJsZUltcGwjc2FuZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzYW5lKCkgeworCQkKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHN1cGVyLnNhbmUoKTsKKworCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIG5vZGVBVVJJICE9IG51bGw7CisJCWFzc2VydCByZXRWYWx1ZTsKKworCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIG5vZGVCVVJJICE9IG51bGw7CisJCWFzc2VydCByZXRWYWx1ZTsKKworCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIGxhYmVsICE9IG51bGw7CisJCWFzc2VydCByZXRWYWx1ZTsKKworCQkvLyBBIG5vZGU/CisJCWlmIChhICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJLy8gSWYgdGhpcyBlZGdlIGxpbmtzIHRvIGEgbm9kZSwgdGhlbiB0aGUgbm9kZSBzaG91bGQgaGF2ZSB0aGlzIGVkZ2UKKwkJCS8vIGFzIG9uZSBvZiBpdHMgZWRnZXMKKwkJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgYS5nZXRFZGdlcygpLmNvbnRhaW5zKHRoaXMpOworCQkJYXNzZXJ0IHJldFZhbHVlOworCisJCQkvLyBUaGlzIGVkZ2Ugc2hvdWxkIGJlIGhvb2tlZCB1cCB0byB0aGUgY29ycmVjdCBub2RlIHRvby4KKwkJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgbm9kZUFVUkkuZXF1YWxzKGEuZ2V0VVJJKCkpOworCQkJYXNzZXJ0IHJldFZhbHVlOworCQl9IC8vIGlmIEEgTm9kZQorCisJCS8vIEIgbm9kZT8KKwkJaWYgKGIgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQkvLyBJZiB0aGlzIGVkZ2UgbGlua3MgdG8gYSBub2RlLCB0aGVuIHRoZSBub2RlIHNob3VsZCBoYXZlIHRoaXMgZWRnZQorCQkJLy8gYXMgb25lIG9mIGl0cyBlZGdlcworCQkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBiLmdldEVkZ2VzKCkuY29udGFpbnModGhpcyk7CisJCQlhc3NlcnQgcmV0VmFsdWU7CisKKwkJCS8vIFRoaXMgZWRnZSBzaG91bGQgYmUgaG9va2VkIHVwIHRvIHRoZSBjb3JyZWN0IG5vZGUgdG9vLgorCQkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBub2RlQlVSSS5lcXVhbHMoYi5nZXRVUkkoKSk7CisJCQlhc3NlcnQgcmV0VmFsdWU7CisJCX0KKworCQkvLyBPZiBjb3Vyc2UgaWYgb25lIG5vZGUgaXMgc2V0LCBzbyBzaG91bGQgdGhlIG90aGVyCisJCXJldFZhbHVlID0gcmV0VmFsdWUKKwkJCQkmJiAoKGEgPT0gbnVsbCAmJiBiID09IG51bGwpIHx8IChhICE9IG51bGwgJiYgYiAhPSBudWxsKSk7CisJCWFzc2VydCByZXRWYWx1ZTsKKworCQkvLyBUaGUgbGFiZWwgc2hvdWxkIHJlZmVyZW5jZSB0aGlzIGVkZ2Ugd2l0aCBpdHMgVVJJCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgbGFiZWwuZ2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCgpICE9IG51bGw7CisJCWFzc2VydCByZXRWYWx1ZTsKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZQorCQkJCSYmIGxhYmVsLmdldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQoKS5lcXVhbHMoZ2V0VVJJKCkpOworCQlhc3NlcnQgcmV0VmFsdWU7CisKKwkJLy8gQW5kIHRoZSBsYWJlbCBzaG91bGQgYmUgc2FuZQorCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIGxhYmVsLnNhbmUoKTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHNhbmUKKworfSAvLyBFZGdlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9FZGdlTGFiZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL0VkZ2VMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDcxZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9FZGdlTGFiZWxJbXBsLmphdmEKQEAgLTAsMCArMSwyMTYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FZGdlIExhYmVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5FZGdlTGFiZWxJbXBsI2dldEVkZ2UgPGVtPkVkZ2U8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFZGdlTGFiZWxJbXBsIGV4dGVuZHMgTGFiZWxJbXBsIGltcGxlbWVudHMgRWRnZUxhYmVsIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRWRnZUxhYmVsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEdyYXBoUGFja2FnZS5MaXRlcmFscy5FREdFX0xBQkVMOworCX0KKworCQorCUBPdmVycmlkZQorCXB1YmxpYyBJZGVudGlmaWFibGUgZ2V0SWRlbnRpZmlhYmxlKCkgeworCQlyZXR1cm4gZ2V0RWRnZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldElkZW50aWZpYWJsZShJZGVudGlmaWFibGUgbmV3SWRlbnRpZmlhYmxlKSB7CisJCXNldEVkZ2UoKEVkZ2UpbmV3SWRlbnRpZmlhYmxlKTsJCQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGdlIGdldEVkZ2UoKSB7CisJCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgIT0gR3JhcGhQYWNrYWdlLkVER0VfTEFCRUxfX0VER0UpIHJldHVybiBudWxsOworCQlyZXR1cm4gKEVkZ2UpZUNvbnRhaW5lcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVkZ2UoRWRnZSBuZXdFZGdlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdFZGdlLCBHcmFwaFBhY2thZ2UuRURHRV9MQUJFTF9fRURHRSwgbXNncyk7CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVkZ2UoRWRnZSBuZXdFZGdlKSB7CisJCWlmIChuZXdFZGdlICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEKCkgIT0gR3JhcGhQYWNrYWdlLkVER0VfTEFCRUxfX0VER0UgJiYgbmV3RWRnZSAhPSBudWxsKSkgeworCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0VkZ2UpKQorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQorCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOworCQkJaWYgKG5ld0VkZ2UgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RWRnZSkuZUludmVyc2VBZGQodGhpcywgR3JhcGhQYWNrYWdlLkVER0VfX0xBQkVMLCBFZGdlLmNsYXNzLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEVkZ2UobmV3RWRnZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuRURHRV9MQUJFTF9fRURHRSwgbmV3RWRnZSwgbmV3RWRnZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkVER0VfTEFCRUxfX0VER0U6CisJCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCisJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOworCQkJCXJldHVybiBiYXNpY1NldEVkZ2UoKEVkZ2Upb3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5FREdFX0xBQkVMX19FREdFOgorCQkJCXJldHVybiBiYXNpY1NldEVkZ2UobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5FREdFX0xBQkVMX19FREdFOgorCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBHcmFwaFBhY2thZ2UuRURHRV9fTEFCRUwsIEVkZ2UuY2xhc3MsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5FREdFX0xBQkVMX19FREdFOgorCQkJCXJldHVybiBnZXRFZGdlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkVER0VfTEFCRUxfX0VER0U6CisJCQkJc2V0RWRnZSgoRWRnZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkVER0VfTEFCRUxfX0VER0U6CisJCQkJc2V0RWRnZSgoRWRnZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkVER0VfTEFCRUxfX0VER0U6CisJCQkJcmV0dXJuIGdldEVkZ2UoKSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy9FZGdlTGFiZWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL0dyYXBoRmFjdG9yeUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvR3JhcGhGYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MGFhMDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL0dyYXBoRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDI2OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC4qOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEdyYXBoRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBHcmFwaEZhY3RvcnkgeworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEdyYXBoRmFjdG9yeSBpbml0KCkgeworCQl0cnkgeworCQkJR3JhcGhGYWN0b3J5IHRoZUdyYXBoRmFjdG9yeSA9IChHcmFwaEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIik7IC8vJE5PTi1OTFMtMSQgCisJCQlpZiAodGhlR3JhcGhGYWN0b3J5ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdGhlR3JhcGhGYWN0b3J5OworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IEdyYXBoRmFjdG9yeUltcGwoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHcmFwaEZhY3RvcnlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7CisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5FREdFOiByZXR1cm4gY3JlYXRlRWRnZSgpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEg6IHJldHVybiBjcmVhdGVHcmFwaCgpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuTk9ERTogcmV0dXJuIGNyZWF0ZU5vZGUoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVOUkVTT0xWRURfSURFTlRJRklBQkxFOiByZXR1cm4gY3JlYXRlVW5yZXNvbHZlZElkZW50aWZpYWJsZSgpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX0lERU5USUZJQUJMRV9NQVBfRU5UUlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVVUklUb0lkZW50aWZpYWJsZU1hcEVudHJ5KCk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5VUklfVE9fRURHRV9NQVBfRU5UUlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVVUklUb0VkZ2VNYXBFbnRyeSgpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX05PREVfTUFQX0VOVFJZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVVJJVG9Ob2RlTWFwRW50cnkoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19MQUJFTF9NQVBfRU5UUlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVVUklUb0xhYmVsTWFwRW50cnkoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19OT0RFX0xBQkVMX01BUF9FTlRSWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVVSSVRvTm9kZUxhYmVsTWFwRW50cnkoKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJOgorCQkJCXJldHVybiBjcmVhdGVVUklGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLklMTEVHQUxfQVJHVU1FTlRfRVhDRVBUSU9OOgorCQkJCXJldHVybiBjcmVhdGVJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJOgorCQkJCXJldHVybiBjb252ZXJ0VVJJVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLklMTEVHQUxfQVJHVU1FTlRfRVhDRVBUSU9OOgorCQkJCXJldHVybiBjb252ZXJ0SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRnZSBjcmVhdGVFZGdlKCkgeworCQlFZGdlSW1wbCBlZGdlID0gbmV3IEVkZ2VJbXBsKCk7CisJCXJldHVybiBlZGdlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHcmFwaCBjcmVhdGVHcmFwaCgpIHsKKwkJR3JhcGhJbXBsIGdyYXBoID0gbmV3IEdyYXBoSW1wbCgpOworCQlyZXR1cm4gZ3JhcGg7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vZGUgY3JlYXRlTm9kZSgpIHsKKwkJTm9kZUltcGwgbm9kZSA9IG5ldyBOb2RlSW1wbCgpOworCQlyZXR1cm4gbm9kZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVW5yZXNvbHZlZElkZW50aWZpYWJsZSBjcmVhdGVVbnJlc29sdmVkSWRlbnRpZmlhYmxlKCkgeworCQlVbnJlc29sdmVkSWRlbnRpZmlhYmxlSW1wbCB1bnJlc29sdmVkSWRlbnRpZmlhYmxlID0gbmV3IFVucmVzb2x2ZWRJZGVudGlmaWFibGVJbXBsKCk7CisJCXJldHVybiB1bnJlc29sdmVkSWRlbnRpZmlhYmxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNYXAuRW50cnk8VVJJLCBJZGVudGlmaWFibGU+IGNyZWF0ZVVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnkoKSB7CisJCVVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnlJbXBsIHVyaVRvSWRlbnRpZmlhYmxlTWFwRW50cnkgPSBuZXcgVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeUltcGwoKTsKKwkJcmV0dXJuIHVyaVRvSWRlbnRpZmlhYmxlTWFwRW50cnk7CisJfQorCisJCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNYXAuRW50cnk8VVJJLCBFZGdlPiBjcmVhdGVVUklUb0VkZ2VNYXBFbnRyeSgpIHsKKwkJVVJJVG9FZGdlTWFwRW50cnlJbXBsIHVyaVRvRWRnZU1hcEVudHJ5ID0gbmV3IFVSSVRvRWRnZU1hcEVudHJ5SW1wbCgpOworCQlyZXR1cm4gdXJpVG9FZGdlTWFwRW50cnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1hcC5FbnRyeTxVUkksIE5vZGU+IGNyZWF0ZVVSSVRvTm9kZU1hcEVudHJ5KCkgeworCQlVUklUb05vZGVNYXBFbnRyeUltcGwgdXJpVG9Ob2RlTWFwRW50cnkgPSBuZXcgVVJJVG9Ob2RlTWFwRW50cnlJbXBsKCk7CisJCXJldHVybiB1cmlUb05vZGVNYXBFbnRyeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTWFwLkVudHJ5PFVSSSwgTGFiZWw+IGNyZWF0ZVVSSVRvTGFiZWxNYXBFbnRyeSgpIHsKKwkJVVJJVG9MYWJlbE1hcEVudHJ5SW1wbCB1cmlUb0xhYmVsTWFwRW50cnkgPSBuZXcgVVJJVG9MYWJlbE1hcEVudHJ5SW1wbCgpOworCQlyZXR1cm4gdXJpVG9MYWJlbE1hcEVudHJ5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNYXAuRW50cnk8VVJJLCBOb2RlTGFiZWw+IGNyZWF0ZVVSSVRvTm9kZUxhYmVsTWFwRW50cnkoKSB7CisJCVVSSVRvTm9kZUxhYmVsTWFwRW50cnlJbXBsIHVyaVRvTm9kZUxhYmVsTWFwRW50cnkgPSBuZXcgVVJJVG9Ob2RlTGFiZWxNYXBFbnRyeUltcGwoKTsKKwkJcmV0dXJuIHVyaVRvTm9kZUxhYmVsTWFwRW50cnk7CisJfQorCisJCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFVSSSBjcmVhdGVVUklGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoaW5pdGlhbFZhbHVlKTsKKwl9IC8vIGNyZWF0ZVVSSUZyb21TdHJpbmcKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0VVJJVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKwl9IC8vIGNvbnZlcnRVUklUb1N0cmluZworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjcmVhdGVJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJcmV0dXJuIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHcmFwaFBhY2thZ2UgZ2V0R3JhcGhQYWNrYWdlKCkgeworCQlyZXR1cm4gKEdyYXBoUGFja2FnZSlnZXRFUGFja2FnZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGRlcHJlY2F0ZWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQERlcHJlY2F0ZWQKKwlwdWJsaWMgc3RhdGljIEdyYXBoUGFja2FnZSBnZXRQYWNrYWdlKCkgeworCQlyZXR1cm4gR3JhcGhQYWNrYWdlLmVJTlNUQU5DRTsKKwl9CisKK30gLy9HcmFwaEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL0dyYXBoSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9HcmFwaEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWUwZmJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9HcmFwaEltcGwuamF2YQpAQCAtMCwwICsxLDk3MyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVDb2xsZWN0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZUVNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZUZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuSWRlbnRpZmlhYmxlRmlsdGVySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuSWRlbnRpZmlhYmxlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlVucmVzb2x2ZWRJZGVudGlmaWFibGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaEltcGwjZ2V0RWRnZXMgPGVtPkVkZ2VzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaEltcGwjZ2V0Tm9kZXMgPGVtPk5vZGVzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaEltcGwjZ2V0R3JhcGhMYWJlbHMgPGVtPkdyYXBoIExhYmVsczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhJbXBsI2dldE5vZGVMYWJlbHMgPGVtPk5vZGUgTGFiZWxzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaEltcGwjZ2V0RHluYW1pY0xhYmVscyA8ZW0+RHluYW1pYyBMYWJlbHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoSW1wbCNnZXROdW1FZGdlcyA8ZW0+TnVtIEVkZ2VzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaEltcGwjZ2V0TnVtTm9kZXMgPGVtPk51bSBOb2RlczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhJbXBsI2dldE51bUdyYXBoTGFiZWxzIDxlbT5OdW0gR3JhcGggTGFiZWxzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaEltcGwjZ2V0TnVtTm9kZUxhYmVscyA8ZW0+TnVtIE5vZGUgTGFiZWxzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaEltcGwjZ2V0TnVtRHluYW1pY0xhYmVscyA8ZW0+TnVtIER5bmFtaWMgTGFiZWxzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaEltcGwjZ2V0VW5yZXNvbHZlZElkZW50aWZpYWJsZXMgPGVtPlVucmVzb2x2ZWQgSWRlbnRpZmlhYmxlczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhJbXBsI2dldERlY29yYXRvcnMgPGVtPkRlY29yYXRvcnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoSW1wbCNnZXRUaW1lIDxlbT5UaW1lPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR3JhcGhJbXBsIGV4dGVuZHMgSWRlbnRpZmlhYmxlSW1wbCBpbXBsZW1lbnRzIEdyYXBoIHsKKwkKKwkKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFZGdlcygpIDxlbT5FZGdlczwvZW0+fScgbWFwLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI2dldEVkZ2VzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRU1hcDxVUkksIEVkZ2U+IGVkZ2VzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm9kZXMoKSA8ZW0+Tm9kZXM8L2VtPn0nIG1hcC4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNnZXROb2RlcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVNYXA8VVJJLCBOb2RlPiBub2RlczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyYXBoTGFiZWxzKCkgPGVtPkdyYXBoIExhYmVsczwvZW0+fScgbWFwLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEdyYXBoTGFiZWxzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRU1hcDxVUkksIExhYmVsPiBncmFwaExhYmVsczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vZGVMYWJlbHMoKSA8ZW0+Tm9kZSBMYWJlbHM8L2VtPn0nIG1hcC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROb2RlTGFiZWxzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRU1hcDxVUkksIE5vZGVMYWJlbD4gbm9kZUxhYmVsczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER5bmFtaWNMYWJlbHMoKSA8ZW0+RHluYW1pYyBMYWJlbHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldER5bmFtaWNMYWJlbHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxEeW5hbWljTGFiZWw+IGR5bmFtaWNMYWJlbHM7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtRWRnZXMoKSA8ZW0+TnVtIEVkZ2VzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TnVtRWRnZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5VTV9FREdFU19FREVGQVVMVCA9IDA7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtTm9kZXMoKSA8ZW0+TnVtIE5vZGVzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TnVtTm9kZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5VTV9OT0RFU19FREVGQVVMVCA9IDA7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtR3JhcGhMYWJlbHMoKSA8ZW0+TnVtIEdyYXBoIExhYmVsczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE51bUdyYXBoTGFiZWxzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBOVU1fR1JBUEhfTEFCRUxTX0VERUZBVUxUID0gMDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1Ob2RlTGFiZWxzKCkgPGVtPk51bSBOb2RlIExhYmVsczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE51bU5vZGVMYWJlbHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5VTV9OT0RFX0xBQkVMU19FREVGQVVMVCA9IDA7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtRHluYW1pY0xhYmVscygpIDxlbT5OdW0gRHluYW1pYyBMYWJlbHM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROdW1EeW5hbWljTGFiZWxzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBOVU1fRFlOQU1JQ19MQUJFTFNfRURFRkFVTFQgPSAwOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5yZXNvbHZlZElkZW50aWZpYWJsZXMoKSA8ZW0+VW5yZXNvbHZlZCBJZGVudGlmaWFibGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFVucmVzb2x2ZWRJZGVudGlmaWFibGU+IHVucmVzb2x2ZWRJZGVudGlmaWFibGVzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVjb3JhdG9ycygpIDxlbT5EZWNvcmF0b3JzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlY29yYXRvcnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxEZWNvcmF0b3I+IGRlY29yYXRvcnM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaW1lKCkgPGVtPlRpbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRpbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTVEVNVGltZSB0aW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgR3JhcGhJbXBsKCkgeworCQlzdXBlcigpOworCQlzZXRVUkkoU1RFTVVSSS5jcmVhdGVVUkkoVVJJX1RZUEVfR1JBUEhfU0VHTUVOVCArICIvIgorCQkJCSsgU1RFTVVSSS5nZW5lcmF0ZVVuaXF1ZVBhcnQoKSkpOworCQlzZXRUeXBlVVJJKFNURU1VUkkuR1JBUEhfVFlQRV9VUkkpOworCX0gLy8gR3JhcGhJbXBsCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuR1JBUEg7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvbW1vbi5pbXBsLklkZW50aWZpYWJsZUltcGwjc2V0VVJJKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRVUkkoVVJJIG5ld1VSSSkgeworCQlzdXBlci5zZXRVUkkobmV3VVJJKTsKKwkJLy8gTm93IGdvIHRocm91Z2ggYWxsIHRoZSBncmFwaCBsYWJlbHMgYW5kIHVwZGF0ZSB0aGVuIHRvIHJlZmVyZW5jZSB0aGUKKwkJLy8gbmV3IFVSSQorCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPExhYmVsPiBsYWJlbEl0ZXIgPSBnZXRHcmFwaExhYmVscygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGxhYmVsSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBMYWJlbCBsYWJlbCA9IGxhYmVsSXRlci5uZXh0KCk7CisJCQlsYWJlbC5zZXRVUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKG5ld1VSSSk7CisJCX0gLy8gZm9yCisJfSAvLyBzZXRVUkkKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRU1hcDxVUkksIEVkZ2U+IGdldEVkZ2VzKCkgeworCQlpZiAoZWRnZXMgPT0gbnVsbCkgeworCQkJZWRnZXMgPSBuZXcgRWNvcmVFTWFwPFVSSSxFZGdlPihHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuVVJJX1RPX0VER0VfTUFQX0VOVFJZLCBVUklUb0VkZ2VNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIEdyYXBoUGFja2FnZS5HUkFQSF9fRURHRVMpOworCQl9CisJCXJldHVybiBlZGdlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVNYXA8VVJJLCBOb2RlPiBnZXROb2RlcygpIHsKKwkJaWYgKG5vZGVzID09IG51bGwpIHsKKwkJCW5vZGVzID0gbmV3IEVjb3JlRU1hcDxVUkksTm9kZT4oR3JhcGhQYWNrYWdlLkxpdGVyYWxzLlVSSV9UT19OT0RFX01BUF9FTlRSWSwgVVJJVG9Ob2RlTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBHcmFwaFBhY2thZ2UuR1JBUEhfX05PREVTKTsKKwkJfQorCQlyZXR1cm4gbm9kZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxEeW5hbWljTGFiZWw+IGdldER5bmFtaWNMYWJlbHMoKSB7CisJCWlmIChkeW5hbWljTGFiZWxzID09IG51bGwpIHsKKwkJCWR5bmFtaWNMYWJlbHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PER5bmFtaWNMYWJlbD4oRHluYW1pY0xhYmVsLmNsYXNzLCB0aGlzLCBHcmFwaFBhY2thZ2UuR1JBUEhfX0RZTkFNSUNfTEFCRUxTKTsKKwkJfQorCQlyZXR1cm4gZHluYW1pY0xhYmVsczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVNYXA8VVJJLCBMYWJlbD4gZ2V0R3JhcGhMYWJlbHMoKSB7CisJCWlmIChncmFwaExhYmVscyA9PSBudWxsKSB7CisJCQlncmFwaExhYmVscyA9IG5ldyBFY29yZUVNYXA8VVJJLExhYmVsPihHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuVVJJX1RPX0xBQkVMX01BUF9FTlRSWSwgVVJJVG9MYWJlbE1hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgR3JhcGhQYWNrYWdlLkdSQVBIX19HUkFQSF9MQUJFTFMpOworCQl9CisJCXJldHVybiBncmFwaExhYmVsczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFVucmVzb2x2ZWRJZGVudGlmaWFibGU+IGdldFVucmVzb2x2ZWRJZGVudGlmaWFibGVzKCkgeworCQlpZiAodW5yZXNvbHZlZElkZW50aWZpYWJsZXMgPT0gbnVsbCkgeworCQkJdW5yZXNvbHZlZElkZW50aWZpYWJsZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8VW5yZXNvbHZlZElkZW50aWZpYWJsZT4oVW5yZXNvbHZlZElkZW50aWZpYWJsZS5jbGFzcywgdGhpcywgR3JhcGhQYWNrYWdlLkdSQVBIX19VTlJFU09MVkVEX0lERU5USUZJQUJMRVMpOworCQl9CisJCXJldHVybiB1bnJlc29sdmVkSWRlbnRpZmlhYmxlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8RGVjb3JhdG9yPiBnZXREZWNvcmF0b3JzKCkgeworCQlpZiAoZGVjb3JhdG9ycyA9PSBudWxsKSB7CisJCQlkZWNvcmF0b3JzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q8RGVjb3JhdG9yPihEZWNvcmF0b3IuY2xhc3MsIHRoaXMsIEdyYXBoUGFja2FnZS5HUkFQSF9fREVDT1JBVE9SUywgTW9kZWxQYWNrYWdlLkRFQ09SQVRPUl9fR1JBUEgpOworCQl9CisJCXJldHVybiBkZWNvcmF0b3JzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTVEVNVGltZSBnZXRUaW1lKCkgeworCQlyZXR1cm4gdGltZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUaW1lKFNURU1UaW1lIG5ld1RpbWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJU1RFTVRpbWUgb2xkVGltZSA9IHRpbWU7CisJCXRpbWUgPSBuZXdUaW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuR1JBUEhfX1RJTUUsIG9sZFRpbWUsIG5ld1RpbWUpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRpbWUoU1RFTVRpbWUgbmV3VGltZSkgeworCQlpZiAobmV3VGltZSAhPSB0aW1lKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmICh0aW1lICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXRpbWUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBHcmFwaFBhY2thZ2UuR1JBUEhfX1RJTUUsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1RpbWUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VGltZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEdyYXBoUGFja2FnZS5HUkFQSF9fVElNRSwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRUaW1lKG5ld1RpbWUsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhQYWNrYWdlLkdSQVBIX19USU1FLCBuZXdUaW1lLCBuZXdUaW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBSZXR1cm4gYWxsIG9mIHRoZSBOb2RlIExhYmVscyBpbiB0aGUgZ3JhcGggdGhhdCBoYXZlIGEgcGFydGljdWxhciB0eXBlCisJICogVVJJLgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIEVMaXN0PE5vZGVMYWJlbD4gZ2V0Tm9kZUxhYmVsc0J5VHlwZVVSSShVUkkgdHlwZVVSSSkgeworCQkvLyBXZSBjb3VsZCBwZXJmb3JtIHRoaXMgZnVuY3Rpb24gaW4gYSBudW1iZXIgb2Ygd2F5cy4gV2UgY291bGQsIGZvcgorCQkvLyBpbnN0YW5jZSwgY3JlYXRlIGEgTWFwIGJldHdlZW4gdGhlIHR5cGUgVVJJJ3MgYW5kIHRoZSBpbnN0YW5jZXMsCisJCS8vIGhvd2V2ZXIgaWYgd2UgZG8gdGhhdCB0aGVuIHdlIGRvIHR3byB0aGluZ3M6IDEpIG1ha2UgbWFuYWdlbWVudCBvZgorCQkvLyB0aGUgY29sbGVjdGlvbiBvZiBpbnN0YW5jZXMgbW9yZSBjb21wbGljYXRlZCAod2UgaGF2ZSB0byBhZGQgdGhlbSB0bworCQkvLyB0d28gbWFwcyksIGFuZCwgMikgd2UgImJsb2F0IiB0aGUgc2VyaWFsaXphdGlvbiBhcyB3ZSBub3cgYmFzaWNhbGx5CisJCS8vIGRvdWJsZSB0aGUgc2l6ZSBvZiB0aGUgc2VyaWFsaXplZCBjb2xsZWN0aW9uKHMpLgorCQkvLyBHaXZlbiB0aGF0IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbmZyZXF1ZW50bHkgaXQncyBwcm9iYWJseSBiZXR0ZXIgdG8KKwkJLy8ganVzdCBkbyBhICJkdW1iIiBzZXF1ZW50aWFsIHNjYW4gb2YgdGhlIGluc3RhbmNlcyBhbmQgbWF0Y2ggdGhlbS4KKwkJLy8gV2UgY2FuIGFsd2F5cyBjaGFuZ2Ugb3V0IG1pbmRzIGxhdGVyLgorCisJCWZpbmFsIEVMaXN0PE5vZGVMYWJlbD4gcmV0VmFsdWUgPSBuZXcgQmFzaWNFTGlzdDxOb2RlTGFiZWw+KCk7CisKKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxOb2RlTGFiZWw+IG5vZGVMYWJlbEl0ZXIgPSBnZXROb2RlTGFiZWxzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgbm9kZUxhYmVsSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBOb2RlTGFiZWwgbm9kZUxhYmVsID0gbm9kZUxhYmVsSXRlci5uZXh0KCk7CisJCQkvLyBEb2VzIHRoaXMgb25lIHRoZSB0eXBlIHdlJ3JlIGxvb2tpbmcgZm9yPworCQkJaWYgKG5vZGVMYWJlbC5nZXRUeXBlVVJJKCkuZXF1YWxzKHR5cGVVUkkpKSB7CisJCQkJLy8gWWVzCisJCQkJcmV0VmFsdWUuYWRkKG5vZGVMYWJlbCk7CisJCQl9CisJCX0gLy8gZm9yIGVhY2ggbm9kZUxhYmVsCisKKwkJLy8gU3RlZmFuIDcvMjMvMDkuIElmIG5lZWQgdG8gZ3VhcmFudGVlIHRoZSBvcmRlciBvZiBvYmplY3RzIHRoaXMgbGlzdAorCQkvLyBiZWluZyB0aGUgc2FtZSBmb3IgZWFjaCBjYWxsIHNpbmNlIHRoZSBsaXN0IGlzIHVzZWQgdG8gcGFydGl0aW9uCisJCS8vIHRoZSB3b3JrIHVwIGFtb25nIG11bHRpcGxlIHdvcmtlciB0aHJlYWRzLiBMdWNraWx5IHRoaXMgY2FsbAorCQkvLyBpcyBvbmx5IG1hZGUgb25jZSBmb3IgZXZlcnkgZGVjb3JhdG9yIGluIHRoZSBiZWdpbm5pbmcgb2YgYSBzaW11bGF0aW9uCisJCS8vIHNvIHNvcnRpbmcgaXMgbm90IGV4cGVuc2l2ZS4KKwkJCisJCUVDb2xsZWN0aW9ucy5zb3J0KHJldFZhbHVlLCBuZXcgQ29tcGFyYXRvcjxOb2RlTGFiZWw+KCkgeworCisJCQlwdWJsaWMgaW50IGNvbXBhcmUoTm9kZUxhYmVsIGFyZzAsIE5vZGVMYWJlbCBhcmcxKSB7CisJCQkJTm9kZSBuMSA9IGFyZzAuZ2V0Tm9kZSgpOworCQkJCU5vZGUgbjIgPSBhcmcxLmdldE5vZGUoKTsKKwkJCQlpZihuMSA9PSBudWxsKSB7CisJCQkJCUNvcmVQbHVnaW4ubG9nRXJyb3IoIkxhYmVsICIrYXJnMC5nZXRDbGFzcygpKyIgIithcmcwKyIgbm9kZSBpcyBudWxsIiwgbmV3IEV4Y2VwdGlvbigpKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWlmKG4yID09IG51bGwpIHsKKwkJCQkJQ29yZVBsdWdpbi5sb2dFcnJvcigiTGFiZWwgIithcmcxLmdldENsYXNzKCkrIiAiK2FyZzErIiBub2RlIGlzIG51bGwiLCBuZXcgRXhjZXB0aW9uKCkpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJVVJJIHUxID0gbjEuZ2V0VVJJKCk7CisJCQkJVVJJIHUyID0gbjIuZ2V0VVJJKCk7CisJCQkJaWYodTEgPT0gbnVsbCkgeworCQkJCQlDb3JlUGx1Z2luLmxvZ0Vycm9yKCJOb2RlICIrbjErIiBtaXNzaW5nIFVSSSIsIG5ldyBFeGNlcHRpb24oKSk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlpZih1MiA9PSBudWxsKSB7CisJCQkJCUNvcmVQbHVnaW4ubG9nRXJyb3IoIk5vZGUgIituMisiIG1pc3NpbmcgVVJJIiwgbmV3IEV4Y2VwdGlvbigpKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCQorCQkJCXJldHVybiB1MS50b1N0cmluZygpLmNvbXBhcmVUbyh1Mi50b1N0cmluZygpKTsKKwkJCX0KKwkJCQorCQl9KTsKKwkJCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldE5vZGVMYWJlbHNCeVR5cGVVUkkKKworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTWFwPFVSSSwgTm9kZUxhYmVsPiBnZXROb2RlTGFiZWxzKCkgeworCQlpZiAobm9kZUxhYmVscyA9PSBudWxsKSB7CisJCQlub2RlTGFiZWxzID0gbmV3IEVjb3JlRU1hcDxVUkksTm9kZUxhYmVsPihHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuVVJJX1RPX05PREVfTEFCRUxfTUFQX0VOVFJZLCBVUklUb05vZGVMYWJlbE1hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgR3JhcGhQYWNrYWdlLkdSQVBIX19OT0RFX0xBQkVMUyk7CisJCX0KKwkJcmV0dXJuIG5vZGVMYWJlbHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgaW50IGdldE51bUVkZ2VzKCkgeworCQlyZXR1cm4gZWRnZXMgPT0gbnVsbCA/IDAgOiBnZXRFZGdlcygpLnNpemUoKTsKKwl9IC8vIGdldE51bUVkZ2VzCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBpbnQgZ2V0TnVtTm9kZXMoKSB7CisJCXJldHVybiBub2RlcyA9PSBudWxsID8gMCA6IGdldE5vZGVzKCkuc2l6ZSgpOworCX0gLy8gZ2V0TnVtTm9kZXMKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIGludCBnZXROdW1HcmFwaExhYmVscygpIHsKKwkJcmV0dXJuIGdyYXBoTGFiZWxzID09IG51bGwgPyAwIDogZ2V0R3JhcGhMYWJlbHMoKS5zaXplKCk7CisJfSAvLyBnZXROdW1HcmFwaExhYmVscworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgaW50IGdldE51bU5vZGVMYWJlbHMoKSB7CisJCXJldHVybiBub2RlTGFiZWxzID09IG51bGwgPyAwIDogZ2V0Tm9kZUxhYmVscygpLnNpemUoKTsKKwl9IC8vIGdldE51bU5vZGVMYWJlbHMKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIGludCBnZXROdW1EeW5hbWljTGFiZWxzKCkgeworCQlyZXR1cm4gZHluYW1pY0xhYmVscyA9PSBudWxsID8gMCA6IGdldER5bmFtaWNMYWJlbHMoKS5zaXplKCk7CisJfSAvLyBnZXROdW1EeW5hbWljTGFiZWxzCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIFRoaXMgbWV0aG9kIGFkZHMgdGhlIHtAbGluayBFZGdlfXMsIHtAbGluayBOb2RlfXMsIHtAbGluayBMYWJlbH1zIGFuZCB7QGxpbmsgRGVjb3JhdG9yfSAKKwkgKiBmcm9tIGFub3RoZXIgZ3JhcGggdG8gIHRoZSBjb2xsZWN0aW9ucyBtYWludGFpbmVkIGJ5IHRoaXMgZ3JhcGguIAorCSAqIDxwPgorCSAqIEl0IGRvZXMgbm90IGF0dGVtcHQgdG8gcmVzb2x2ZQorCSAqIGNvbm5lY3Rpb25zIGJldHdlZW4gRWRnZXMgYW5kIHRoZSBOb2RlcyB0aGV5IHJlZmVyZW5jZS4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRHcmFwaChmaW5hbCBHcmFwaCBncmFwaCwgSWRlbnRpZmlhYmxlRmlsdGVyIGZpbHRlcikgeworCQlJZGVudGlmaWFibGVGaWx0ZXJJbXBsIF9maWx0ZXIgPSAoSWRlbnRpZmlhYmxlRmlsdGVySW1wbClmaWx0ZXI7CisJCUVNYXA8VVJJLCBFZGdlPmVkZ2VzID0gZ3JhcGguZ2V0RWRnZXMoKTsKKwkJRU1hcDxVUkksIE5vZGU+bm9kZXMgPSBncmFwaC5nZXROb2RlcygpOworCQlFTWFwPFVSSSwgTm9kZUxhYmVsPm5vZGVMYWJlbHMgPSBncmFwaC5nZXROb2RlTGFiZWxzKCk7CisJCUVNYXA8VVJJLCBMYWJlbD5ncmFwaExhYmVscyA9IGdyYXBoLmdldEdyYXBoTGFiZWxzKCk7CisJCQorCQlpZihmaWx0ZXIgIT0gbnVsbCkgeworCQkJX2ZpbHRlci5maWx0ZXJFZGdlcyhlZGdlcyk7CisJCQlfZmlsdGVyLmZpbHRlck5vZGVzKG5vZGVzKTsKKwkJCV9maWx0ZXIuZmlsdGVyTm9kZUxhYmVscyhub2RlTGFiZWxzKTsKKwkJCV9maWx0ZXIuZmlsdGVyTGFiZWxzKGdyYXBoTGFiZWxzKTsKKwkJfQorCQkKKwkJZ2V0RWRnZXMoKS5hZGRBbGwoZWRnZXMpOworCQlnZXROb2RlcygpLmFkZEFsbChub2Rlcyk7CisJCWdldE5vZGVMYWJlbHMoKS5hZGRBbGwobm9kZUxhYmVscyk7CisJCWdldERlY29yYXRvcnMoKS5hZGRBbGwoZ3JhcGguZ2V0RGVjb3JhdG9ycygpKTsKKwkJCisJCS8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBncmFwaCBsYWJlbHMgdG8gdGhlIG5ldyBncmFwaAorCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPExhYmVsPiBncmFwaExhYmVsSXRlciA9IGdyYXBoTGFiZWxzLnZhbHVlcygpCisJCQkJLml0ZXJhdG9yKCk7IGdyYXBoTGFiZWxJdGVyLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIExhYmVsIGdyYXBoTGFiZWwgPSBncmFwaExhYmVsSXRlci5uZXh0KCk7CisJCQlncmFwaExhYmVsLnNldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQoZ2V0VVJJKCkpOworCQkJcHV0R3JhcGhMYWJlbChncmFwaExhYmVsKTsKKwkJfSAvLyBmb3IgZWFjaCBuZXcgZ3JhcGggbGFiZWwKKworCQlnZXREeW5hbWljTGFiZWxzKCkuYWRkQWxsKGdyYXBoLmdldER5bmFtaWNMYWJlbHMoKSk7CisJCWdldFVucmVzb2x2ZWRJZGVudGlmaWFibGVzKCkuYWRkQWxsKGdyYXBoLmdldFVucmVzb2x2ZWRJZGVudGlmaWFibGVzKCkpOworCX0gLy8gYWRkR3JhcGgKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgcHV0RWRnZShFZGdlIGVkZ2UpIHsKKwkJZ2V0RWRnZXMoKS5wdXQoZWRnZS5nZXRVUkkoKSwgZWRnZSk7CisJCWZpbmFsIEVkZ2VMYWJlbCBlZGdlTGFiZWwgPSBlZGdlLmdldExhYmVsKCk7CisJCS8vIER5bmFtaWM/CisJCWlmIChlZGdlTGFiZWwgaW5zdGFuY2VvZiBEeW5hbWljTGFiZWwpIHsKKwkJCS8vIFllcworCQkJYWRkRHluYW1pY0xhYmVsKChEeW5hbWljTGFiZWwpZWRnZUxhYmVsKTsKKwkJfSAvLyBpZiBEeW5hbWljTGFiZWwKKwl9IC8vIHB1dEVkZ2UKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIEVkZ2UgZ2V0RWRnZShVUkkgdXJpKSB7CisJCXJldHVybiBnZXRFZGdlcygpLmdldCh1cmkpOworCX0gLy8gZ2V0RWRnZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCBwdXROb2RlKE5vZGUgbm9kZSkgeworCQlnZXROb2RlcygpLnB1dChub2RlLmdldFVSSSgpLCBub2RlKTsKKwkJZm9yIChOb2RlTGFiZWwgbm9kZUxhYmVsIDogbm9kZS5nZXRMYWJlbHMoKSkgeworCQkJcHV0Tm9kZUxhYmVsKG5vZGVMYWJlbCk7CisJCX0gLy8gZm9yIGVhY2ggTm9kZUxhYmVsCisJfSAvLyBwdXROb2RlCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBOb2RlIGdldE5vZGUoVVJJIHVyaSkgeworCQlyZXR1cm4gZ2V0Tm9kZXMoKS5nZXQodXJpKTsKKwl9IC8vIGdldE5vZGUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgcHV0Tm9kZUxhYmVsKE5vZGVMYWJlbCBsYWJlbCkgeworCQlnZXROb2RlTGFiZWxzKCkucHV0KGxhYmVsLmdldFVSSSgpLCBsYWJlbCk7CisJCS8vIER5bmFtaWM/CisJCWlmIChsYWJlbCBpbnN0YW5jZW9mIER5bmFtaWNMYWJlbCkgeworCQkJLy8gWWVzCisJCQlhZGREeW5hbWljTGFiZWwoKER5bmFtaWNMYWJlbClsYWJlbCk7CisJCX0gLy8gaWYgRHluYW1pY0xhYmVsCisJfSAvLyBwdXROb2RlTGFiZWwKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIE5vZGVMYWJlbCBnZXROb2RlTGFiZWwoVVJJIHVyaSkgeworCQlyZXR1cm4gZ2V0Tm9kZUxhYmVscygpLmdldCh1cmkpOworCX0gLy8gZ2V0Tm9kZUxhYmVsCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHB1dEdyYXBoTGFiZWwoTGFiZWwgbGFiZWwpIHsKKwkJZ2V0R3JhcGhMYWJlbHMoKS5wdXQobGFiZWwuZ2V0VVJJKCksIGxhYmVsKTsKKwkJLy8gRHluYW1pYz8KKwkJaWYgKGxhYmVsIGluc3RhbmNlb2YgRHluYW1pY0xhYmVsKSB7CisJCQkvLyBZZXMKKwkJCWFkZER5bmFtaWNMYWJlbCgoRHluYW1pY0xhYmVsKWxhYmVsKTsKKwkJfSAvLyBpZiBEeW5hbWljTGFiZWwKKwl9IC8vIHB1dEdyYXBoTGFiZWwKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIExhYmVsIGdldEdyYXBoTGFiZWwoVVJJIHVyaSkgeworCQlyZXR1cm4gZ2V0R3JhcGhMYWJlbHMoKS5nZXQodXJpKTsKKwl9IC8vIGdldEdyYXBoTGFiZWwKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgYWRkRHluYW1pY0xhYmVsKER5bmFtaWNMYWJlbCBkeW5hbWljbGFiZWwpIHsKKwkJZ2V0RHluYW1pY0xhYmVscygpLmFkZChkeW5hbWljbGFiZWwpOworCX0gLy8gYWRkRHluYW1pY0xhYmVsCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHN3aXRjaFRvTmV4dFZhbHVlKFNURU1UaW1lIGN1cnJlbnRUaW1lKSB7CisJCWZvciAoZmluYWwgSXRlcmF0b3I8RHluYW1pY0xhYmVsPiBncmFwaExhYmVsSXRlciA9IGdldER5bmFtaWNMYWJlbHMoKQorCQkJCS5pdGVyYXRvcigpOyBncmFwaExhYmVsSXRlci5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBEeW5hbWljTGFiZWwgZHluYW1pY0xhYmVsID0gZ3JhcGhMYWJlbEl0ZXIubmV4dCgpOworCQkJZHluYW1pY0xhYmVsLnN3aXRjaFRvTmV4dFZhbHVlKCk7CisJCX0gLy8gZm9yIGR5bmFtaWMgbGFiZWxzCisJCXNldFRpbWUoKFNURU1UaW1lKUVjb3JlVXRpbC5jb3B5KGN1cnJlbnRUaW1lKSk7CisJfSAvLyBzd2l0Y2hUb05leHRWYWx1ZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19ERUNPUkFUT1JTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikoSW50ZXJuYWxFTGlzdDw/PilnZXREZWNvcmF0b3JzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvbW1vbi5pbXBsLklkZW50aWZpYWJsZUltcGwjdG9TdHJpbmcoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiXCIiICsgZHVibGluQ29yZS5nZXRUaXRsZSgpCisJCQkJKyAiXCIsXG4iKTsKKworCQkvLyBIb3cgbWFueSBub2Rlcz8KKworCQlzYi5hcHBlbmQoZ2V0TnVtTm9kZXMoKSA+IDAgPyBnZXROdW1Ob2RlcygpICsgIiBOb2Rlc1xuIiA6ICIiKTsKKwkJc2IuYXBwZW5kKGdldE51bUVkZ2VzKCkgPiAwID8gZ2V0TnVtRWRnZXMoKSArICIgRWRnZXNcbiIgOiAiIik7CisJCXNiLmFwcGVuZChnZXROdW1Ob2RlTGFiZWxzKCkgPiAwID8gZ2V0TnVtTm9kZUxhYmVscygpICsgIiBOb2RlIExhYmVscyAiCisJCQkJOiAiIik7CisJCXNiLmFwcGVuZChnZXROdW1HcmFwaExhYmVscygpID4gMCA/IGdldE51bUdyYXBoTGFiZWxzKCkKKwkJCQkrICIgR3JhcGggTGFiZWxzXG4iIDogIiIpOworCisJCXNiLmFwcGVuZChnZXROdW1EeW5hbWljTGFiZWxzKCkgPiAwID8gZ2V0TnVtRHluYW1pY0xhYmVscygpCisJCQkJKyAiIER5bmFtaWMgTGFiZWxzXG4iIDogIiIpOworCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0gLy8gdG9TdHJpbmcKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb21tb24uaW1wbC5JZGVudGlmaWFibGVJbXBsI3NhbmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5zYW5lKCk7CisKKwkJLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGxhYmVscyB0aGF0IGVhY2ggbm9kZSByZWZlcmVuY2VzCisJCWludCBub2RlTGFiZWxDb3VudCA9IDA7CisJCWludCBkeW5hbWljTGFiZWxDb3VudCA9IDA7CisKKwkJLy8gTm9kZXMKKwkJaWYgKG5vZGVzICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxOb2RlPiBub2RlSXRlciA9IGdldE5vZGVzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgbm9kZUl0ZXIKKwkJCQkJLmhhc05leHQoKQorCQkJCQkmJiByZXRWYWx1ZTspIHsKKwkJCQlmaW5hbCBOb2RlIG5vZGUgPSBub2RlSXRlci5uZXh0KCk7CisJCQkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBub2RlLnNhbmUoKTsKKwkJCQlhc3NlcnQgcmV0VmFsdWU7CisKKwkJCQlub2RlTGFiZWxDb3VudCArPSBub2RlLmdldExhYmVscygpLnNpemUoKTsKKworCQkJCS8vIEhvdyBtYW55IGR5bmFtaWMgbGFiZWxzPworCQkJCWZvciAoZmluYWwgSXRlcmF0b3I8Tm9kZUxhYmVsPiBsYWJlbEl0ZXIgPSBub2RlLmdldExhYmVscygpCisJCQkJCQkuaXRlcmF0b3IoKTsgbGFiZWxJdGVyLmhhc05leHQoKTspIHsKKwkJCQkJZmluYWwgTGFiZWwgbGFiZWwgPSBsYWJlbEl0ZXIubmV4dCgpOworCQkJCQlpZiAobGFiZWwgaW5zdGFuY2VvZiBEeW5hbWljTGFiZWwpIHsKKwkJCQkJCWR5bmFtaWNMYWJlbENvdW50Kys7CisJCQkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCQkJCisJCQkJCQkvLyBUaGUgZHluYW1pYyBsYWJlbCBzaG91bGQgYmUgaW4gdGhlIGNvbGxlY3Rpb24gb2YKKwkJCQkJCS8vIGR5bmFtaWMgbGFiZWxzIG1haW50YWluZWQgYnkgdGhlIGdyYXBoCisJCQkJCQlmb3IgKER5bmFtaWNMYWJlbCBkbCA6IGdldER5bmFtaWNMYWJlbHMoKSkgeworCQkJCQkJCWlmIChkbCA9PSBsYWJlbCkgeworCQkJCQkJCQlyZXRWYWx1ZSA9IHRydWU7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0gLy8gZm9yIGVhY2ggZHluYW1pYyBsYWJlbAorCQkJCQkJYXNzZXJ0IHJldFZhbHVlOworCQkJCQkJCisJCQkJCX0gLy8gaWYgRHluYW1pY0xhYmVsCisJCQkJCS8vIFRoZSBsYWJlbCBzaG91bGQgYmUgaW4gdGhlIGNvbGxlY3Rpb24gb2Ygbm9kZSBsYWJlbHMKKwkJCQkJcmV0VmFsdWUgPSByZXRWYWx1ZQorCQkJCQkJCSYmIGdldE5vZGVMYWJlbHMoKS5jb250YWluc0tleShsYWJlbC5nZXRVUkkoKSk7CisJCQkJCWFzc2VydCByZXRWYWx1ZTsKKwkJCQkJCisJCQkJCQorCQkJCX0gLy8gZm9yIGVhY2ggbGFiZWwgb2YgdGhlIG5vZGUKKwkJCX0gLy8gZm9yIGVhY2ggbm9kZQorCQl9IC8vIGlmCisKKwkJLy8gRWRnZXM/CisJCWlmIChlZGdlcyAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCWZvciAoZmluYWwgSXRlcmF0b3I8RWRnZT4gZWRnZUl0ZXIgPSBnZXRFZGdlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGVkZ2VJdGVyCisJCQkJCS5oYXNOZXh0KCkKKwkJCQkJJiYgcmV0VmFsdWU7KSB7CisJCQkJZmluYWwgRWRnZSBlZGdlID0gZWRnZUl0ZXIubmV4dCgpOworCQkJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgZWRnZS5zYW5lKCk7CisJCQkJYXNzZXJ0IHJldFZhbHVlOworCisJCQkJLy8gSXMgdGhlIGVkZ2UncyBsYWJlbCBkeW5hbWljPworCQkJCWlmIChlZGdlLmdldExhYmVsKCkgaW5zdGFuY2VvZiBEeW5hbWljTGFiZWwpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWR5bmFtaWNMYWJlbENvdW50Kys7CisJCQkJfQorCQkJfSAvLyBmb3IgZWFjaCBlZGdlCisJCX0gLy8gaWYKKworCQkvLyBOb2RlIExhYmVscz8KKwkJaWYgKG5vZGVMYWJlbHMgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQkvLyBUaGUgbnVtYmVyIG9mIG5vZGUgbGFiZWxzIHNob3VsZCBtYXRjaCB0aGUgbnVtYmVyIHdlIGNvdW50ZWQKKwkJCS8vIGFib3ZlLi4ubm90IHRydWUgZm9yIGdyYXBoIGZyYWdtZW50cyB0aGF0IG1pZ2h0IGhhdmUgbGFiZWxzIGZvcgorCQkJLy8gbm9kZXMgaW4gb3RoZXIgKHN1YikgZ3JhcGggZnJhZ21lbnRzLgorCQkJLy8gcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBub2RlTGFiZWxDb3VudCA9PQorCQkJLy8gZ2V0Tm9kZUxhYmVscygpLmdldFNpemUoKTsKKwkJCS8vIGFzc2VydCByZXRWYWx1ZTsKKworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxOb2RlTGFiZWw+IGxhYmVsSXRlciA9IGdldE5vZGVMYWJlbHMoKS52YWx1ZXMoKQorCQkJCQkuaXRlcmF0b3IoKTsgbGFiZWxJdGVyLmhhc05leHQoKSAmJiByZXRWYWx1ZTspIHsKKwkJCQlmaW5hbCBOb2RlTGFiZWwgbm9kZUxhYmVsID0gbGFiZWxJdGVyLm5leHQoKTsKKwkJCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIG5vZGVMYWJlbC5zYW5lKCk7CisJCQkJYXNzZXJ0IHJldFZhbHVlOworCQkJfSAvLyBmb3IgZWFjaCBub2RlIGxhYmVsCisJCX0gLy8gaWYKKworCQlpZiAoZ3JhcGhMYWJlbHMgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPExhYmVsPiBncmFwaExhYmVsSXRlciA9IGdldEdyYXBoTGFiZWxzKCkudmFsdWVzKCkKKwkJCQkJLml0ZXJhdG9yKCk7IGdyYXBoTGFiZWxJdGVyLmhhc05leHQoKTspIHsKKwkJCQlmaW5hbCBMYWJlbCBncmFwaExhYmVsID0gZ3JhcGhMYWJlbEl0ZXIubmV4dCgpOworCQkJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgZ3JhcGhMYWJlbC5zYW5lKCk7CisJCQkJYXNzZXJ0IHJldFZhbHVlOworCisJCQkJaWYgKGdyYXBoTGFiZWwgaW5zdGFuY2VvZiBEeW5hbWljTGFiZWwpIHsKKwkJCQkJZHluYW1pY0xhYmVsQ291bnQrKzsKKwkJCQl9CisJCQl9CisJCX0gLy8gaWYgZ3JhcGhMYWJlbHMKKworCQkvLyBEeW5hbWljIExhYmVscz8KKwkJaWYgKGR5bmFtaWNMYWJlbHMgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQkvLyBUaGUgbnVtYmVyIG9mIGR5bmFtaWMgbGFiZWxzIHNob3VsZCBlcXVhbCB0aGUgY291bnQKKwkJCXJldFZhbHVlID0gZHluYW1pY0xhYmVsQ291bnQgPT0gZ2V0TnVtRHluYW1pY0xhYmVscygpOworCQkJYXNzZXJ0IHJldFZhbHVlOworCisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPER5bmFtaWNMYWJlbD4gZHluYW1pY2xJdGVyID0gZ2V0RHluYW1pY0xhYmVscygpCisJCQkJCS5pdGVyYXRvcigpOyBkeW5hbWljbEl0ZXIuaGFzTmV4dCgpICYmIHJldFZhbHVlOykgeworCQkJCWZpbmFsIER5bmFtaWNMYWJlbCBkeW5hbWljTGFiZWwgPSBkeW5hbWljbEl0ZXIubmV4dCgpOworCQkJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgZHluYW1pY0xhYmVsLnNhbmUoKTsKKwkJCQlhc3NlcnQgcmV0VmFsdWU7CisJCQl9IC8vIGZvciBlYWNoIGR5bmFtaWMgbGFiZWwKKwkJfSAvLyBpZgorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHNhbmUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fRURHRVM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRFZGdlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fTk9ERVM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXROb2RlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fR1JBUEhfTEFCRUxTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JhcGhMYWJlbHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX05PREVfTEFCRUxTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Tm9kZUxhYmVscygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fVU5SRVNPTFZFRF9JREVOVElGSUFCTEVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VW5yZXNvbHZlZElkZW50aWZpYWJsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX0RFQ09SQVRPUlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZWNvcmF0b3JzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19USU1FOgorCQkJCXJldHVybiBiYXNpY1NldFRpbWUobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fRURHRVM6CisJCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0RWRnZXMoKTsKKwkJCQllbHNlIHJldHVybiBnZXRFZGdlcygpLm1hcCgpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX05PREVTOgorCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldE5vZGVzKCk7CisJCQkJZWxzZSByZXR1cm4gZ2V0Tm9kZXMoKS5tYXAoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19HUkFQSF9MQUJFTFM6CisJCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JhcGhMYWJlbHMoKTsKKwkJCQllbHNlIHJldHVybiBnZXRHcmFwaExhYmVscygpLm1hcCgpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX05PREVfTEFCRUxTOgorCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldE5vZGVMYWJlbHMoKTsKKwkJCQllbHNlIHJldHVybiBnZXROb2RlTGFiZWxzKCkubWFwKCk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fRFlOQU1JQ19MQUJFTFM6CisJCQkJcmV0dXJuIGdldER5bmFtaWNMYWJlbHMoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19OVU1fRURHRVM6CisJCQkJcmV0dXJuIGdldE51bUVkZ2VzKCk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fTlVNX05PREVTOgorCQkJCXJldHVybiBnZXROdW1Ob2RlcygpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX05VTV9HUkFQSF9MQUJFTFM6CisJCQkJcmV0dXJuIGdldE51bUdyYXBoTGFiZWxzKCk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fTlVNX05PREVfTEFCRUxTOgorCQkJCXJldHVybiBnZXROdW1Ob2RlTGFiZWxzKCk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fTlVNX0RZTkFNSUNfTEFCRUxTOgorCQkJCXJldHVybiBnZXROdW1EeW5hbWljTGFiZWxzKCk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fVU5SRVNPTFZFRF9JREVOVElGSUFCTEVTOgorCQkJCXJldHVybiBnZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlcygpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX0RFQ09SQVRPUlM6CisJCQkJcmV0dXJuIGdldERlY29yYXRvcnMoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19USU1FOgorCQkJCXJldHVybiBnZXRUaW1lKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX0VER0VTOgorCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpZ2V0RWRnZXMoKSkuc2V0KG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fTk9ERVM6CisJCQkJKChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZylnZXROb2RlcygpKS5zZXQobmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19HUkFQSF9MQUJFTFM6CisJCQkJKChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZylnZXRHcmFwaExhYmVscygpKS5zZXQobmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19OT0RFX0xBQkVMUzoKKwkJCQkoKEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nKWdldE5vZGVMYWJlbHMoKSkuc2V0KG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fRFlOQU1JQ19MQUJFTFM6CisJCQkJZ2V0RHluYW1pY0xhYmVscygpLmNsZWFyKCk7CisJCQkJZ2V0RHluYW1pY0xhYmVscygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRHluYW1pY0xhYmVsPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX1VOUkVTT0xWRURfSURFTlRJRklBQkxFUzoKKwkJCQlnZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlcygpLmNsZWFyKCk7CisJCQkJZ2V0VW5yZXNvbHZlZElkZW50aWZpYWJsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFVucmVzb2x2ZWRJZGVudGlmaWFibGU+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fREVDT1JBVE9SUzoKKwkJCQlnZXREZWNvcmF0b3JzKCkuY2xlYXIoKTsKKwkJCQlnZXREZWNvcmF0b3JzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZWNvcmF0b3I+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fVElNRToKKwkJCQlzZXRUaW1lKChTVEVNVGltZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fRURHRVM6CisJCQkJZ2V0RWRnZXMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19OT0RFUzoKKwkJCQlnZXROb2RlcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX0dSQVBIX0xBQkVMUzoKKwkJCQlnZXRHcmFwaExhYmVscygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX05PREVfTEFCRUxTOgorCQkJCWdldE5vZGVMYWJlbHMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19EWU5BTUlDX0xBQkVMUzoKKwkJCQlnZXREeW5hbWljTGFiZWxzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fVU5SRVNPTFZFRF9JREVOVElGSUFCTEVTOgorCQkJCWdldFVucmVzb2x2ZWRJZGVudGlmaWFibGVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fREVDT1JBVE9SUzoKKwkJCQlnZXREZWNvcmF0b3JzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fVElNRToKKwkJCQlzZXRUaW1lKChTVEVNVGltZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fRURHRVM6CisJCQkJcmV0dXJuIGVkZ2VzICE9IG51bGwgJiYgIWVkZ2VzLmlzRW1wdHkoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19OT0RFUzoKKwkJCQlyZXR1cm4gbm9kZXMgIT0gbnVsbCAmJiAhbm9kZXMuaXNFbXB0eSgpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX0dSQVBIX0xBQkVMUzoKKwkJCQlyZXR1cm4gZ3JhcGhMYWJlbHMgIT0gbnVsbCAmJiAhZ3JhcGhMYWJlbHMuaXNFbXB0eSgpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX05PREVfTEFCRUxTOgorCQkJCXJldHVybiBub2RlTGFiZWxzICE9IG51bGwgJiYgIW5vZGVMYWJlbHMuaXNFbXB0eSgpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX0RZTkFNSUNfTEFCRUxTOgorCQkJCXJldHVybiBkeW5hbWljTGFiZWxzICE9IG51bGwgJiYgIWR5bmFtaWNMYWJlbHMuaXNFbXB0eSgpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX05VTV9FREdFUzoKKwkJCQlyZXR1cm4gZ2V0TnVtRWRnZXMoKSAhPSBOVU1fRURHRVNfRURFRkFVTFQ7CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fTlVNX05PREVTOgorCQkJCXJldHVybiBnZXROdW1Ob2RlcygpICE9IE5VTV9OT0RFU19FREVGQVVMVDsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19OVU1fR1JBUEhfTEFCRUxTOgorCQkJCXJldHVybiBnZXROdW1HcmFwaExhYmVscygpICE9IE5VTV9HUkFQSF9MQUJFTFNfRURFRkFVTFQ7CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fTlVNX05PREVfTEFCRUxTOgorCQkJCXJldHVybiBnZXROdW1Ob2RlTGFiZWxzKCkgIT0gTlVNX05PREVfTEFCRUxTX0VERUZBVUxUOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX05VTV9EWU5BTUlDX0xBQkVMUzoKKwkJCQlyZXR1cm4gZ2V0TnVtRHluYW1pY0xhYmVscygpICE9IE5VTV9EWU5BTUlDX0xBQkVMU19FREVGQVVMVDsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19VTlJFU09MVkVEX0lERU5USUZJQUJMRVM6CisJCQkJcmV0dXJuIHVucmVzb2x2ZWRJZGVudGlmaWFibGVzICE9IG51bGwgJiYgIXVucmVzb2x2ZWRJZGVudGlmaWFibGVzLmlzRW1wdHkoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19ERUNPUkFUT1JTOgorCQkJCXJldHVybiBkZWNvcmF0b3JzICE9IG51bGwgJiYgIWRlY29yYXRvcnMuaXNFbXB0eSgpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX1RJTUU6CisJCQkJcmV0dXJuIHRpbWUgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vIEdyYXBoSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9HcmFwaFBhY2thZ2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL0dyYXBoUGFja2FnZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjkxMmYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9HcmFwaFBhY2thZ2VJbXBsLmphdmEKQEAgLTAsMCArMSwxMjQyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LmltcGwuRXhwZXJpbWVudFBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNOb2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNFZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNOb2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlVucmVzb2x2ZWRJZGVudGlmaWFibGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZVBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb1BhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uaW1wbC5TY2VuYXJpb1BhY2thZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5pbXBsLlNlcXVlbmNlclBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLmltcGwuU29sdmVyUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuVHJpZ2dlclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuaW1wbC5UcmlnZ2VyUGFja2FnZUltcGw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR3JhcGhQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEdyYXBoUGFja2FnZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZHluYW1pY0xhYmVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGR5bmFtaWNOb2RlTGFiZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZWRnZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBncmFwaEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBsYWJlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBsYWJlbFZhbHVlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIG5vZGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgbm9kZUxhYmVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHN0YXRpY05vZGVMYWJlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB1bnJlc29sdmVkSWRlbnRpZmlhYmxlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHVyaVRvSWRlbnRpZmlhYmxlTWFwRW50cnlFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc2FuaXR5Q2hlY2tlckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBkeW5hbWljRWRnZUxhYmVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGVkZ2VMYWJlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzdGF0aWNFZGdlTGFiZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdXJpVG9FZGdlTWFwRW50cnlFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdXJpVG9Ob2RlTWFwRW50cnlFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdXJpVG9MYWJlbE1hcEVudHJ5RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHVyaVRvTm9kZUxhYmVsTWFwRW50cnlFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc3RhdGljTGFiZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRGF0YVR5cGUgdXJpRURhdGFUeXBlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRURhdGFUeXBlIGlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbkVEYXRhVHlwZSA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKKwkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KKwkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCisJICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKKwkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBHcmFwaFBhY2thZ2VJbXBsKCkgeworCQlzdXBlcihlTlNfVVJJLCBHcmFwaEZhY3RvcnkuZUlOU1RBTkNFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCisJICogCisJICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBHcmFwaFBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEdyYXBoUGFja2FnZSBpbml0KCkgeworCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoR3JhcGhQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEdyYXBoUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCisJCUdyYXBoUGFja2FnZUltcGwgdGhlR3JhcGhQYWNrYWdlID0gKEdyYXBoUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEdyYXBoUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgR3JhcGhQYWNrYWdlSW1wbCgpKTsKKworCQlpc0luaXRlZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCisJCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisKKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKKwkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJRXhwZXJpbWVudFBhY2thZ2VJbXBsIHRoZUV4cGVyaW1lbnRQYWNrYWdlID0gKEV4cGVyaW1lbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRXhwZXJpbWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFeHBlcmltZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFeHBlcmltZW50UGFja2FnZS5lTlNfVVJJKSA6IEV4cGVyaW1lbnRQYWNrYWdlLmVJTlNUQU5DRSk7CisJCU1vZGVsUGFja2FnZUltcGwgdGhlTW9kZWxQYWNrYWdlID0gKE1vZGVsUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGVsUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIE1vZGVsUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RlbFBhY2thZ2UuZU5TX1VSSSkgOiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJTW9kaWZpZXJQYWNrYWdlSW1wbCB0aGVNb2RpZmllclBhY2thZ2UgPSAoTW9kaWZpZXJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kaWZpZXJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgTW9kaWZpZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGlmaWVyUGFja2FnZS5lTlNfVVJJKSA6IE1vZGlmaWVyUGFja2FnZS5lSU5TVEFOQ0UpOworCQlQcmVkaWNhdGVQYWNrYWdlSW1wbCB0aGVQcmVkaWNhdGVQYWNrYWdlID0gKFByZWRpY2F0ZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQcmVkaWNhdGVQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgUHJlZGljYXRlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQcmVkaWNhdGVQYWNrYWdlLmVOU19VUkkpIDogUHJlZGljYXRlUGFja2FnZS5lSU5TVEFOQ0UpOworCQlTY2VuYXJpb1BhY2thZ2VJbXBsIHRoZVNjZW5hcmlvUGFja2FnZSA9IChTY2VuYXJpb1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTY2VuYXJpb1BhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBTY2VuYXJpb1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU2NlbmFyaW9QYWNrYWdlLmVOU19VUkkpIDogU2NlbmFyaW9QYWNrYWdlLmVJTlNUQU5DRSk7CisJCVNlcXVlbmNlclBhY2thZ2VJbXBsIHRoZVNlcXVlbmNlclBhY2thZ2UgPSAoU2VxdWVuY2VyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNlcXVlbmNlclBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBTZXF1ZW5jZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNlcXVlbmNlclBhY2thZ2UuZU5TX1VSSSkgOiBTZXF1ZW5jZXJQYWNrYWdlLmVJTlNUQU5DRSk7CisJCVRyaWdnZXJQYWNrYWdlSW1wbCB0aGVUcmlnZ2VyUGFja2FnZSA9IChUcmlnZ2VyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRyaWdnZXJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVHJpZ2dlclBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVHJpZ2dlclBhY2thZ2UuZU5TX1VSSSkgOiBUcmlnZ2VyUGFja2FnZS5lSU5TVEFOQ0UpOworCQlTb2x2ZXJQYWNrYWdlSW1wbCB0aGVTb2x2ZXJQYWNrYWdlID0gKFNvbHZlclBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTb2x2ZXJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgU29sdmVyUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTb2x2ZXJQYWNrYWdlLmVOU19VUkkpIDogU29sdmVyUGFja2FnZS5lSU5TVEFOQ0UpOworCisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCisJCXRoZUdyYXBoUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlRXhwZXJpbWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU1vZGVsUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlTW9kaWZpZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVQcmVkaWNhdGVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVTY2VuYXJpb1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNlcXVlbmNlclBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVRyaWdnZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVTb2x2ZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKwkJdGhlR3JhcGhQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUV4cGVyaW1lbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlTW9kZWxQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlTW9kaWZpZXJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlUHJlZGljYXRlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNjZW5hcmlvUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNlcXVlbmNlclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVUcmlnZ2VyUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNvbHZlclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKwkJdGhlR3JhcGhQYWNrYWdlLmZyZWV6ZSgpOworCisgIAorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KEdyYXBoUGFja2FnZS5lTlNfVVJJLCB0aGVHcmFwaFBhY2thZ2UpOworCQlyZXR1cm4gdGhlR3JhcGhQYWNrYWdlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0RHluYW1pY0xhYmVsKCkgeworCQlyZXR1cm4gZHluYW1pY0xhYmVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldER5bmFtaWNMYWJlbF9OZXh0VmFsdWVWYWxpZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWR5bmFtaWNMYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldER5bmFtaWNMYWJlbF9OZXh0VmFsdWUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlkeW5hbWljTGFiZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXREeW5hbWljTGFiZWxfRGVjb3JhdG9yKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpZHluYW1pY0xhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXREeW5hbWljTm9kZUxhYmVsKCkgeworCQlyZXR1cm4gZHluYW1pY05vZGVMYWJlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEVkZ2UoKSB7CisJCXJldHVybiBlZGdlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVkZ2VfQSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWVkZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFZGdlX05vZGVBVVJJKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWRnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVkZ2VfQigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWVkZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFZGdlX05vZGVCVVJJKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWRnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVkZ2VfTGFiZWwoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSllZGdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWRnZV9EaXJlY3RlZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWVkZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEdyYXBoKCkgeworCQlyZXR1cm4gZ3JhcGhFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhfR3JhcGhMYWJlbHMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlncmFwaEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoX05vZGVMYWJlbHMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlncmFwaEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoX0R5bmFtaWNMYWJlbHMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlncmFwaEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEdyYXBoX051bUVkZ2VzKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZ3JhcGhFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRHcmFwaF9OdW1Ob2RlcygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWdyYXBoRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0R3JhcGhfTnVtR3JhcGhMYWJlbHMoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlncmFwaEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEdyYXBoX051bU5vZGVMYWJlbHMoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlncmFwaEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEdyYXBoX051bUR5bmFtaWNMYWJlbHMoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlncmFwaEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoX1VucmVzb2x2ZWRJZGVudGlmaWFibGVzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpZ3JhcGhFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhfRGVjb3JhdG9ycygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWdyYXBoRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoX1RpbWUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlncmFwaEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaF9Ob2RlcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWdyYXBoRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhfRWRnZXMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlncmFwaEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0TGFiZWwoKSB7CisJCXJldHVybiBsYWJlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMYWJlbF9VUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGFiZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMYWJlbF9DdXJyZW50VmFsdWUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlsYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldExhYmVsX0lkZW50aWZpYWJsZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWxhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRMYWJlbFZhbHVlKCkgeworCQlyZXR1cm4gbGFiZWxWYWx1ZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldE5vZGUoKSB7CisJCXJldHVybiBub2RlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldE5vZGVfRWRnZXMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlub2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Tm9kZV9MYWJlbHMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlub2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXROb2RlTGFiZWwoKSB7CisJCXJldHVybiBub2RlTGFiZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Tm9kZUxhYmVsX05vZGUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlub2RlTGFiZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFN0YXRpY05vZGVMYWJlbCgpIHsKKwkJcmV0dXJuIHN0YXRpY05vZGVMYWJlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFVucmVzb2x2ZWRJZGVudGlmaWFibGUoKSB7CisJCXJldHVybiB1bnJlc29sdmVkSWRlbnRpZmlhYmxlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFVucmVzb2x2ZWRJZGVudGlmaWFibGVfU2NlbmFyaW8oKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl1bnJlc29sdmVkSWRlbnRpZmlhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0VW5yZXNvbHZlZElkZW50aWZpYWJsZV9Nb2RlbCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXVucmVzb2x2ZWRJZGVudGlmaWFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlX0dyYXBoKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpdW5yZXNvbHZlZElkZW50aWZpYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFVucmVzb2x2ZWRJZGVudGlmaWFibGVfSWRlbnRpZmlhYmxlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpdW5yZXNvbHZlZElkZW50aWZpYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFVucmVzb2x2ZWRJZGVudGlmaWFibGVfVW5yZXNvbHZlZFVSSSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXVucmVzb2x2ZWRJZGVudGlmaWFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlX0ZpZWxkTmFtZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXVucmVzb2x2ZWRJZGVudGlmaWFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnkoKSB7CisJCXJldHVybiB1cmlUb0lkZW50aWZpYWJsZU1hcEVudHJ5RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnlfS2V5KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdXJpVG9JZGVudGlmaWFibGVNYXBFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnlfVmFsdWUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl1cmlUb0lkZW50aWZpYWJsZU1hcEVudHJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTYW5pdHlDaGVja2VyKCkgeworCQlyZXR1cm4gc2FuaXR5Q2hlY2tlckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldER5bmFtaWNFZGdlTGFiZWwoKSB7CisJCXJldHVybiBkeW5hbWljRWRnZUxhYmVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0RWRnZUxhYmVsKCkgeworCQlyZXR1cm4gZWRnZUxhYmVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVkZ2VMYWJlbF9FZGdlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWRnZUxhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTdGF0aWNFZGdlTGFiZWwoKSB7CisJCXJldHVybiBzdGF0aWNFZGdlTGFiZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRVUklUb0VkZ2VNYXBFbnRyeSgpIHsKKwkJcmV0dXJuIHVyaVRvRWRnZU1hcEVudHJ5RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFVSSVRvRWRnZU1hcEVudHJ5X0tleSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXVyaVRvRWRnZU1hcEVudHJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0VVJJVG9FZGdlTWFwRW50cnlfVmFsdWUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl1cmlUb0VkZ2VNYXBFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0VVJJVG9Ob2RlTWFwRW50cnkoKSB7CisJCXJldHVybiB1cmlUb05vZGVNYXBFbnRyeUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRVUklUb05vZGVNYXBFbnRyeV9LZXkoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl1cmlUb05vZGVNYXBFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFVSSVRvTm9kZU1hcEVudHJ5X1ZhbHVlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpdXJpVG9Ob2RlTWFwRW50cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFVSSVRvTGFiZWxNYXBFbnRyeSgpIHsKKwkJcmV0dXJuIHVyaVRvTGFiZWxNYXBFbnRyeUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRVUklUb0xhYmVsTWFwRW50cnlfS2V5KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdXJpVG9MYWJlbE1hcEVudHJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0VVJJVG9MYWJlbE1hcEVudHJ5X1ZhbHVlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpdXJpVG9MYWJlbE1hcEVudHJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRVUklUb05vZGVMYWJlbE1hcEVudHJ5KCkgeworCQlyZXR1cm4gdXJpVG9Ob2RlTGFiZWxNYXBFbnRyeUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRVUklUb05vZGVMYWJlbE1hcEVudHJ5X0tleSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXVyaVRvTm9kZUxhYmVsTWFwRW50cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRVUklUb05vZGVMYWJlbE1hcEVudHJ5X1ZhbHVlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpdXJpVG9Ob2RlTGFiZWxNYXBFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U3RhdGljTGFiZWwoKSB7CisJCXJldHVybiBzdGF0aWNMYWJlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRURhdGFUeXBlIGdldFVSSSgpIHsKKwkJcmV0dXJuIHVyaUVEYXRhVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRURhdGFUeXBlIGdldElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpIHsKKwkJcmV0dXJuIGlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbkVEYXRhVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR3JhcGhGYWN0b3J5IGdldEdyYXBoRmFjdG9yeSgpIHsKKwkJcmV0dXJuIChHcmFwaEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcworCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKKwkJaXNDcmVhdGVkID0gdHJ1ZTsKKworCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJZHluYW1pY0xhYmVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKERZTkFNSUNfTEFCRUwpOworCQljcmVhdGVFQXR0cmlidXRlKGR5bmFtaWNMYWJlbEVDbGFzcywgRFlOQU1JQ19MQUJFTF9fTkVYVF9WQUxVRV9WQUxJRCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZHluYW1pY0xhYmVsRUNsYXNzLCBEWU5BTUlDX0xBQkVMX19ORVhUX1ZBTFVFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShkeW5hbWljTGFiZWxFQ2xhc3MsIERZTkFNSUNfTEFCRUxfX0RFQ09SQVRPUik7CisKKwkJZHluYW1pY05vZGVMYWJlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEWU5BTUlDX05PREVfTEFCRUwpOworCisJCWVkZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRURHRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZWRnZUVDbGFzcywgRURHRV9fQSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZWRnZUVDbGFzcywgRURHRV9fTk9ERV9BVVJJKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShlZGdlRUNsYXNzLCBFREdFX19CKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShlZGdlRUNsYXNzLCBFREdFX19OT0RFX0JVUkkpOworCQljcmVhdGVFUmVmZXJlbmNlKGVkZ2VFQ2xhc3MsIEVER0VfX0xBQkVMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShlZGdlRUNsYXNzLCBFREdFX19ESVJFQ1RFRCk7CisKKwkJZ3JhcGhFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1JBUEgpOworCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRUNsYXNzLCBHUkFQSF9fRURHRVMpOworCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRUNsYXNzLCBHUkFQSF9fTk9ERVMpOworCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRUNsYXNzLCBHUkFQSF9fR1JBUEhfTEFCRUxTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShncmFwaEVDbGFzcywgR1JBUEhfX05PREVfTEFCRUxTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShncmFwaEVDbGFzcywgR1JBUEhfX0RZTkFNSUNfTEFCRUxTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShncmFwaEVDbGFzcywgR1JBUEhfX05VTV9FREdFUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZ3JhcGhFQ2xhc3MsIEdSQVBIX19OVU1fTk9ERVMpOworCQljcmVhdGVFQXR0cmlidXRlKGdyYXBoRUNsYXNzLCBHUkFQSF9fTlVNX0dSQVBIX0xBQkVMUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZ3JhcGhFQ2xhc3MsIEdSQVBIX19OVU1fTk9ERV9MQUJFTFMpOworCQljcmVhdGVFQXR0cmlidXRlKGdyYXBoRUNsYXNzLCBHUkFQSF9fTlVNX0RZTkFNSUNfTEFCRUxTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShncmFwaEVDbGFzcywgR1JBUEhfX1VOUkVTT0xWRURfSURFTlRJRklBQkxFUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhFQ2xhc3MsIEdSQVBIX19ERUNPUkFUT1JTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShncmFwaEVDbGFzcywgR1JBUEhfX1RJTUUpOworCisJCWxhYmVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKExBQkVMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShsYWJlbEVDbGFzcywgTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UobGFiZWxFQ2xhc3MsIExBQkVMX19DVVJSRU5UX1ZBTFVFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShsYWJlbEVDbGFzcywgTEFCRUxfX0lERU5USUZJQUJMRSk7CisKKwkJbGFiZWxWYWx1ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMQUJFTF9WQUxVRSk7CisKKwkJbm9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOT0RFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShub2RlRUNsYXNzLCBOT0RFX19FREdFUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uobm9kZUVDbGFzcywgTk9ERV9fTEFCRUxTKTsKKworCQlub2RlTGFiZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTk9ERV9MQUJFTCk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uobm9kZUxhYmVsRUNsYXNzLCBOT0RFX0xBQkVMX19OT0RFKTsKKworCQlzdGF0aWNOb2RlTGFiZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1RBVElDX05PREVfTEFCRUwpOworCisJCXVucmVzb2x2ZWRJZGVudGlmaWFibGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVU5SRVNPTFZFRF9JREVOVElGSUFCTEUpOworCQljcmVhdGVFUmVmZXJlbmNlKHVucmVzb2x2ZWRJZGVudGlmaWFibGVFQ2xhc3MsIFVOUkVTT0xWRURfSURFTlRJRklBQkxFX19TQ0VOQVJJTyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UodW5yZXNvbHZlZElkZW50aWZpYWJsZUVDbGFzcywgVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfX01PREVMKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh1bnJlc29sdmVkSWRlbnRpZmlhYmxlRUNsYXNzLCBVTlJFU09MVkVEX0lERU5USUZJQUJMRV9fR1JBUEgpOworCQljcmVhdGVFUmVmZXJlbmNlKHVucmVzb2x2ZWRJZGVudGlmaWFibGVFQ2xhc3MsIFVOUkVTT0xWRURfSURFTlRJRklBQkxFX19JREVOVElGSUFCTEUpOworCQljcmVhdGVFQXR0cmlidXRlKHVucmVzb2x2ZWRJZGVudGlmaWFibGVFQ2xhc3MsIFVOUkVTT0xWRURfSURFTlRJRklBQkxFX19VTlJFU09MVkVEX1VSSSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodW5yZXNvbHZlZElkZW50aWZpYWJsZUVDbGFzcywgVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfX0ZJRUxEX05BTUUpOworCisJCXVyaVRvSWRlbnRpZmlhYmxlTWFwRW50cnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVVJJX1RPX0lERU5USUZJQUJMRV9NQVBfRU5UUlkpOworCQljcmVhdGVFQXR0cmlidXRlKHVyaVRvSWRlbnRpZmlhYmxlTWFwRW50cnlFQ2xhc3MsIFVSSV9UT19JREVOVElGSUFCTEVfTUFQX0VOVFJZX19LRVkpOworCQljcmVhdGVFUmVmZXJlbmNlKHVyaVRvSWRlbnRpZmlhYmxlTWFwRW50cnlFQ2xhc3MsIFVSSV9UT19JREVOVElGSUFCTEVfTUFQX0VOVFJZX19WQUxVRSk7CisKKwkJc2FuaXR5Q2hlY2tlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTQU5JVFlfQ0hFQ0tFUik7CisKKwkJZHluYW1pY0VkZ2VMYWJlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEWU5BTUlDX0VER0VfTEFCRUwpOworCisJCWVkZ2VMYWJlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFREdFX0xBQkVMKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShlZGdlTGFiZWxFQ2xhc3MsIEVER0VfTEFCRUxfX0VER0UpOworCisJCXN0YXRpY0VkZ2VMYWJlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVEFUSUNfRURHRV9MQUJFTCk7CisKKwkJdXJpVG9FZGdlTWFwRW50cnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVVJJX1RPX0VER0VfTUFQX0VOVFJZKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh1cmlUb0VkZ2VNYXBFbnRyeUVDbGFzcywgVVJJX1RPX0VER0VfTUFQX0VOVFJZX19LRVkpOworCQljcmVhdGVFUmVmZXJlbmNlKHVyaVRvRWRnZU1hcEVudHJ5RUNsYXNzLCBVUklfVE9fRURHRV9NQVBfRU5UUllfX1ZBTFVFKTsKKworCQl1cmlUb05vZGVNYXBFbnRyeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhVUklfVE9fTk9ERV9NQVBfRU5UUlkpOworCQljcmVhdGVFQXR0cmlidXRlKHVyaVRvTm9kZU1hcEVudHJ5RUNsYXNzLCBVUklfVE9fTk9ERV9NQVBfRU5UUllfX0tFWSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UodXJpVG9Ob2RlTWFwRW50cnlFQ2xhc3MsIFVSSV9UT19OT0RFX01BUF9FTlRSWV9fVkFMVUUpOworCisJCXVyaVRvTGFiZWxNYXBFbnRyeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhVUklfVE9fTEFCRUxfTUFQX0VOVFJZKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh1cmlUb0xhYmVsTWFwRW50cnlFQ2xhc3MsIFVSSV9UT19MQUJFTF9NQVBfRU5UUllfX0tFWSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UodXJpVG9MYWJlbE1hcEVudHJ5RUNsYXNzLCBVUklfVE9fTEFCRUxfTUFQX0VOVFJZX19WQUxVRSk7CisKKwkJdXJpVG9Ob2RlTGFiZWxNYXBFbnRyeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhVUklfVE9fTk9ERV9MQUJFTF9NQVBfRU5UUlkpOworCQljcmVhdGVFQXR0cmlidXRlKHVyaVRvTm9kZUxhYmVsTWFwRW50cnlFQ2xhc3MsIFVSSV9UT19OT0RFX0xBQkVMX01BUF9FTlRSWV9fS0VZKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh1cmlUb05vZGVMYWJlbE1hcEVudHJ5RUNsYXNzLCBVUklfVE9fTk9ERV9MQUJFTF9NQVBfRU5UUllfX1ZBTFVFKTsKKworCQlzdGF0aWNMYWJlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVEFUSUNfTEFCRUwpOworCisJCS8vIENyZWF0ZSBkYXRhIHR5cGVzCisJCXVyaUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShVUkkpOworCQlpbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25FRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoSUxMRUdBTF9BUkdVTUVOVF9FWENFUFRJT04pOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcworCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKKwkJaXNJbml0aWFsaXplZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCisJCXNldE5hbWUoZU5BTUUpOworCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKKwkJc2V0TnNVUkkoZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcworCQlNb2RlbFBhY2thZ2UgdGhlTW9kZWxQYWNrYWdlID0gKE1vZGVsUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RlbFBhY2thZ2UuZU5TX1VSSSk7CisJCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7CisJCU1vZGlmaWVyUGFja2FnZSB0aGVNb2RpZmllclBhY2thZ2UgPSAoTW9kaWZpZXJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGlmaWVyUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQlkeW5hbWljTGFiZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMYWJlbCgpKTsKKwkJZHluYW1pY05vZGVMYWJlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldER5bmFtaWNMYWJlbCgpKTsKKwkJZHluYW1pY05vZGVMYWJlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5vZGVMYWJlbCgpKTsKKwkJZWRnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldElkZW50aWZpYWJsZSgpKTsKKwkJZWRnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RpZmllclBhY2thZ2UuZ2V0TW9kaWZpYWJsZSgpKTsKKwkJZ3JhcGhFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRJZGVudGlmaWFibGUoKSk7CisJCWxhYmVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SWRlbnRpZmlhYmxlKCkpOworCQlsYWJlbFZhbHVlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U2FuaXR5Q2hlY2tlcigpKTsKKwkJbm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldElkZW50aWZpYWJsZSgpKTsKKwkJbm9kZUxhYmVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TGFiZWwoKSk7CisJCXN0YXRpY05vZGVMYWJlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5vZGVMYWJlbCgpKTsKKwkJc3RhdGljTm9kZUxhYmVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U3RhdGljTGFiZWwoKSk7CisJCWR5bmFtaWNFZGdlTGFiZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREeW5hbWljTGFiZWwoKSk7CisJCWR5bmFtaWNFZGdlTGFiZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFZGdlTGFiZWwoKSk7CisJCWVkZ2VMYWJlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExhYmVsKCkpOworCQlzdGF0aWNFZGdlTGFiZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFZGdlTGFiZWwoKSk7CisJCXN0YXRpY0VkZ2VMYWJlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFN0YXRpY0xhYmVsKCkpOworCQlzdGF0aWNMYWJlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExhYmVsKCkpOworCQlzdGF0aWNMYWJlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RpZmllclBhY2thZ2UuZ2V0TW9kaWZpYWJsZSgpKTsKKworCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycworCQlpbml0RUNsYXNzKGR5bmFtaWNMYWJlbEVDbGFzcywgRHluYW1pY0xhYmVsLmNsYXNzLCAiRHluYW1pY0xhYmVsIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RHluYW1pY0xhYmVsX05leHRWYWx1ZVZhbGlkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAibmV4dFZhbHVlVmFsaWQiLCAiZmFsc2UiLCAwLCAxLCBEeW5hbWljTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RVJlZmVyZW5jZShnZXREeW5hbWljTGFiZWxfTmV4dFZhbHVlKCksIHRoaXMuZ2V0TGFiZWxWYWx1ZSgpLCBudWxsLCAibmV4dFZhbHVlIiwgbnVsbCwgMSwgMSwgRHluYW1pY0xhYmVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldER5bmFtaWNMYWJlbF9EZWNvcmF0b3IoKSwgdGhlTW9kZWxQYWNrYWdlLmdldERlY29yYXRvcigpLCB0aGVNb2RlbFBhY2thZ2UuZ2V0RGVjb3JhdG9yX0xhYmVsc1RvVXBkYXRlKCksICJkZWNvcmF0b3IiLCBudWxsLCAwLCAxLCBEeW5hbWljTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlhZGRFT3BlcmF0aW9uKGR5bmFtaWNMYWJlbEVDbGFzcywgbnVsbCwgInJlc2V0IiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWFkZEVPcGVyYXRpb24oZHluYW1pY0xhYmVsRUNsYXNzLCBudWxsLCAic3dpdGNoVG9OZXh0VmFsdWUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhkeW5hbWljTm9kZUxhYmVsRUNsYXNzLCBEeW5hbWljTm9kZUxhYmVsLmNsYXNzLCAiRHluYW1pY05vZGVMYWJlbCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhlZGdlRUNsYXNzLCBFZGdlLmNsYXNzLCAiRWRnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRFZGdlX0EoKSwgdGhpcy5nZXROb2RlKCksIG51bGwsICJhIiwgbnVsbCwgMCwgMSwgRWRnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRFZGdlX05vZGVBVVJJKCksIHRoaXMuZ2V0VVJJKCksICJub2RlQVVSSSIsIG51bGwsIDAsIDEsIEVkZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RWRnZV9CKCksIHRoaXMuZ2V0Tm9kZSgpLCBudWxsLCAiYiIsIG51bGwsIDAsIDEsIEVkZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWRnZV9Ob2RlQlVSSSgpLCB0aGlzLmdldFVSSSgpLCAibm9kZUJVUkkiLCBudWxsLCAwLCAxLCBFZGdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldEVkZ2VfTGFiZWwoKSwgdGhpcy5nZXRFZGdlTGFiZWwoKSwgdGhpcy5nZXRFZGdlTGFiZWxfRWRnZSgpLCAibGFiZWwiLCBudWxsLCAwLCAxLCBFZGdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEVkZ2VfRGlyZWN0ZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJkaXJlY3RlZCIsICJmYWxzZSIsIDAsIDEsIEVkZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCUVPcGVyYXRpb24gb3AgPSBhZGRFT3BlcmF0aW9uKGVkZ2VFQ2xhc3MsIHRoaXMuZ2V0Tm9kZSgpLCAiZ2V0T3RoZXJOb2RlIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldE5vZGUoKSwgIm5vZGUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVFeGNlcHRpb24ob3AsIHRoaXMuZ2V0SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCkpOworCisJCW9wID0gYWRkRU9wZXJhdGlvbihlZGdlRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzRGlyZWN0ZWRBdCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXROb2RlKCksICJub2RlIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MoZ3JhcGhFQ2xhc3MsIEdyYXBoLmNsYXNzLCAiR3JhcGgiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0R3JhcGhfRWRnZXMoKSwgdGhpcy5nZXRVUklUb0VkZ2VNYXBFbnRyeSgpLCBudWxsLCAiZWRnZXMiLCBudWxsLCAwLCAtMSwgR3JhcGguY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0R3JhcGhfTm9kZXMoKSwgdGhpcy5nZXRVUklUb05vZGVNYXBFbnRyeSgpLCBudWxsLCAibm9kZXMiLCBudWxsLCAwLCAtMSwgR3JhcGguY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0R3JhcGhfR3JhcGhMYWJlbHMoKSwgdGhpcy5nZXRVUklUb0xhYmVsTWFwRW50cnkoKSwgbnVsbCwgImdyYXBoTGFiZWxzIiwgbnVsbCwgMCwgLTEsIEdyYXBoLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldEdyYXBoX05vZGVMYWJlbHMoKSwgdGhpcy5nZXRVUklUb05vZGVMYWJlbE1hcEVudHJ5KCksIG51bGwsICJub2RlTGFiZWxzIiwgbnVsbCwgMCwgLTEsIEdyYXBoLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldEdyYXBoX0R5bmFtaWNMYWJlbHMoKSwgdGhpcy5nZXREeW5hbWljTGFiZWwoKSwgbnVsbCwgImR5bmFtaWNMYWJlbHMiLCBudWxsLCAwLCAtMSwgR3JhcGguY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0R3JhcGhfTnVtRWRnZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgIm51bUVkZ2VzIiwgbnVsbCwgMCwgMSwgR3JhcGguY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRHcmFwaF9OdW1Ob2RlcygpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAibnVtTm9kZXMiLCBudWxsLCAwLCAxLCBHcmFwaC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEdyYXBoX051bUdyYXBoTGFiZWxzKCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJudW1HcmFwaExhYmVscyIsIG51bGwsIDAsIDEsIEdyYXBoLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0R3JhcGhfTnVtTm9kZUxhYmVscygpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAibnVtTm9kZUxhYmVscyIsIG51bGwsIDAsIDEsIEdyYXBoLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0R3JhcGhfTnVtRHluYW1pY0xhYmVscygpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAibnVtRHluYW1pY0xhYmVscyIsIG51bGwsIDAsIDEsIEdyYXBoLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0R3JhcGhfVW5yZXNvbHZlZElkZW50aWZpYWJsZXMoKSwgdGhpcy5nZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlKCksIG51bGwsICJ1bnJlc29sdmVkSWRlbnRpZmlhYmxlcyIsIG51bGwsIDAsIC0xLCBHcmFwaC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRHcmFwaF9EZWNvcmF0b3JzKCksIHRoZU1vZGVsUGFja2FnZS5nZXREZWNvcmF0b3IoKSwgdGhlTW9kZWxQYWNrYWdlLmdldERlY29yYXRvcl9HcmFwaCgpLCAiZGVjb3JhdG9ycyIsIG51bGwsIDAsIC0xLCBHcmFwaC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRHcmFwaF9UaW1lKCksIHRoZU1vZGVsUGFja2FnZS5nZXRTVEVNVGltZSgpLCBudWxsLCAidGltZSIsIG51bGwsIDAsIDEsIEdyYXBoLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJb3AgPSBhZGRFT3BlcmF0aW9uKGdyYXBoRUNsYXNzLCB0aGlzLmdldE5vZGVMYWJlbCgpLCAiZ2V0Tm9kZUxhYmVsc0J5VHlwZVVSSSIsIDAsIC0xLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0VVJJKCksICJ0eXBlVVJJIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCW9wID0gYWRkRU9wZXJhdGlvbihncmFwaEVDbGFzcywgbnVsbCwgImFkZEdyYXBoIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEdyYXBoKCksICJncmFwaCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgdGhlQ29tbW9uUGFja2FnZS5nZXRJZGVudGlmaWFibGVGaWx0ZXIoKSwgImZpbHRlciIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlvcCA9IGFkZEVPcGVyYXRpb24oZ3JhcGhFQ2xhc3MsIG51bGwsICJwdXRFZGdlIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEVkZ2UoKSwgImVkZ2UiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJb3AgPSBhZGRFT3BlcmF0aW9uKGdyYXBoRUNsYXNzLCB0aGlzLmdldEVkZ2UoKSwgImdldEVkZ2UiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0VVJJKCksICJ1cmkiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJb3AgPSBhZGRFT3BlcmF0aW9uKGdyYXBoRUNsYXNzLCBudWxsLCAicHV0Tm9kZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXROb2RlKCksICJub2RlIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCW9wID0gYWRkRU9wZXJhdGlvbihncmFwaEVDbGFzcywgdGhpcy5nZXROb2RlKCksICJnZXROb2RlIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFVSSSgpLCAidXJpIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCW9wID0gYWRkRU9wZXJhdGlvbihncmFwaEVDbGFzcywgbnVsbCwgInB1dE5vZGVMYWJlbCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXROb2RlTGFiZWwoKSwgImxhYmVsIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCW9wID0gYWRkRU9wZXJhdGlvbihncmFwaEVDbGFzcywgdGhpcy5nZXROb2RlTGFiZWwoKSwgImdldE5vZGVMYWJlbCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRVUkkoKSwgInVyaSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlvcCA9IGFkZEVPcGVyYXRpb24oZ3JhcGhFQ2xhc3MsIG51bGwsICJwdXRHcmFwaExhYmVsIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldExhYmVsKCksICJsYWJlbCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlvcCA9IGFkZEVPcGVyYXRpb24oZ3JhcGhFQ2xhc3MsIHRoaXMuZ2V0TGFiZWwoKSwgImdldEdyYXBoTGFiZWwiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0VVJJKCksICJ1cmkiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJb3AgPSBhZGRFT3BlcmF0aW9uKGdyYXBoRUNsYXNzLCBudWxsLCAiYWRkRHluYW1pY0xhYmVsIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldER5bmFtaWNMYWJlbCgpLCAiZHluYW1pY2xhYmVsIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCW9wID0gYWRkRU9wZXJhdGlvbihncmFwaEVDbGFzcywgbnVsbCwgInN3aXRjaFRvTmV4dFZhbHVlIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGVNb2RlbFBhY2thZ2UuZ2V0U1RFTVRpbWUoKSwgImN1cnJlbnRUaW1lIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MobGFiZWxFQ2xhc3MsIExhYmVsLmNsYXNzLCAiTGFiZWwiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRMYWJlbF9VUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKCksIHRoaXMuZ2V0VVJJKCksICJ1UklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkIiwgbnVsbCwgMCwgMSwgTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0TGFiZWxfQ3VycmVudFZhbHVlKCksIHRoaXMuZ2V0TGFiZWxWYWx1ZSgpLCBudWxsLCAiY3VycmVudFZhbHVlIiwgbnVsbCwgMSwgMSwgTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0TGFiZWxfSWRlbnRpZmlhYmxlKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0SWRlbnRpZmlhYmxlKCksIG51bGwsICJpZGVudGlmaWFibGUiLCBudWxsLCAwLCAxLCBMYWJlbC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGxhYmVsVmFsdWVFQ2xhc3MsIExhYmVsVmFsdWUuY2xhc3MsICJMYWJlbFZhbHVlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlhZGRFT3BlcmF0aW9uKGxhYmVsVmFsdWVFQ2xhc3MsIG51bGwsICJyZXNldCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKG5vZGVFQ2xhc3MsIE5vZGUuY2xhc3MsICJOb2RlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldE5vZGVfRWRnZXMoKSwgdGhpcy5nZXRFZGdlKCksIG51bGwsICJlZGdlcyIsIG51bGwsIDAsIC0xLCBOb2RlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldE5vZGVfTGFiZWxzKCksIHRoaXMuZ2V0Tm9kZUxhYmVsKCksIHRoaXMuZ2V0Tm9kZUxhYmVsX05vZGUoKSwgImxhYmVscyIsIG51bGwsIDAsIC0xLCBOb2RlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhub2RlTGFiZWxFQ2xhc3MsIE5vZGVMYWJlbC5jbGFzcywgIk5vZGVMYWJlbCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldE5vZGVMYWJlbF9Ob2RlKCksIHRoaXMuZ2V0Tm9kZSgpLCB0aGlzLmdldE5vZGVfTGFiZWxzKCksICJub2RlIiwgbnVsbCwgMCwgMSwgTm9kZUxhYmVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzdGF0aWNOb2RlTGFiZWxFQ2xhc3MsIFN0YXRpY05vZGVMYWJlbC5jbGFzcywgIlN0YXRpY05vZGVMYWJlbCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyh1bnJlc29sdmVkSWRlbnRpZmlhYmxlRUNsYXNzLCBVbnJlc29sdmVkSWRlbnRpZmlhYmxlLmNsYXNzLCAiVW5yZXNvbHZlZElkZW50aWZpYWJsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlX1NjZW5hcmlvKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0SWRlbnRpZmlhYmxlKCksIG51bGwsICJzY2VuYXJpbyIsIG51bGwsIDAsIDEsIFVucmVzb2x2ZWRJZGVudGlmaWFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0VW5yZXNvbHZlZElkZW50aWZpYWJsZV9Nb2RlbCgpLCB0aGVDb21tb25QYWNrYWdlLmdldElkZW50aWZpYWJsZSgpLCBudWxsLCAibW9kZWwiLCBudWxsLCAwLCAxLCBVbnJlc29sdmVkSWRlbnRpZmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFVucmVzb2x2ZWRJZGVudGlmaWFibGVfR3JhcGgoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRJZGVudGlmaWFibGUoKSwgbnVsbCwgImdyYXBoIiwgbnVsbCwgMCwgMSwgVW5yZXNvbHZlZElkZW50aWZpYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlX0lkZW50aWZpYWJsZSgpLCB0aGVDb21tb25QYWNrYWdlLmdldElkZW50aWZpYWJsZSgpLCBudWxsLCAiaWRlbnRpZmlhYmxlIiwgbnVsbCwgMCwgMSwgVW5yZXNvbHZlZElkZW50aWZpYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlX1VucmVzb2x2ZWRVUkkoKSwgdGhpcy5nZXRVUkkoKSwgInVucmVzb2x2ZWRVUkkiLCBudWxsLCAwLCAxLCBVbnJlc29sdmVkSWRlbnRpZmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFVucmVzb2x2ZWRJZGVudGlmaWFibGVfRmllbGROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJmaWVsZE5hbWUiLCBudWxsLCAwLCAxLCBVbnJlc29sdmVkSWRlbnRpZmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyh1cmlUb0lkZW50aWZpYWJsZU1hcEVudHJ5RUNsYXNzLCBNYXAuRW50cnkuY2xhc3MsICJVUklUb0lkZW50aWZpYWJsZU1hcEVudHJ5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRVUklUb0lkZW50aWZpYWJsZU1hcEVudHJ5X0tleSgpLCB0aGlzLmdldFVSSSgpLCAia2V5IiwgbnVsbCwgMCwgMSwgTWFwLkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnlfVmFsdWUoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRJZGVudGlmaWFibGUoKSwgbnVsbCwgInZhbHVlIiwgbnVsbCwgMCwgMSwgTWFwLkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzYW5pdHlDaGVja2VyRUNsYXNzLCBTYW5pdHlDaGVja2VyLmNsYXNzLCAiU2FuaXR5Q2hlY2tlciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhkeW5hbWljRWRnZUxhYmVsRUNsYXNzLCBEeW5hbWljRWRnZUxhYmVsLmNsYXNzLCAiRHluYW1pY0VkZ2VMYWJlbCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhlZGdlTGFiZWxFQ2xhc3MsIEVkZ2VMYWJlbC5jbGFzcywgIkVkZ2VMYWJlbCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldEVkZ2VMYWJlbF9FZGdlKCksIHRoaXMuZ2V0RWRnZSgpLCB0aGlzLmdldEVkZ2VfTGFiZWwoKSwgImVkZ2UiLCBudWxsLCAwLCAxLCBFZGdlTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzdGF0aWNFZGdlTGFiZWxFQ2xhc3MsIFN0YXRpY0VkZ2VMYWJlbC5jbGFzcywgIlN0YXRpY0VkZ2VMYWJlbCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyh1cmlUb0VkZ2VNYXBFbnRyeUVDbGFzcywgTWFwLkVudHJ5LmNsYXNzLCAiVVJJVG9FZGdlTWFwRW50cnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFVSSVRvRWRnZU1hcEVudHJ5X0tleSgpLCB0aGlzLmdldFVSSSgpLCAia2V5IiwgbnVsbCwgMCwgMSwgTWFwLkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFVSSVRvRWRnZU1hcEVudHJ5X1ZhbHVlKCksIHRoaXMuZ2V0RWRnZSgpLCBudWxsLCAidmFsdWUiLCBudWxsLCAwLCAxLCBNYXAuRW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHVyaVRvTm9kZU1hcEVudHJ5RUNsYXNzLCBNYXAuRW50cnkuY2xhc3MsICJVUklUb05vZGVNYXBFbnRyeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VVJJVG9Ob2RlTWFwRW50cnlfS2V5KCksIHRoaXMuZ2V0VVJJKCksICJrZXkiLCBudWxsLCAwLCAxLCBNYXAuRW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0VVJJVG9Ob2RlTWFwRW50cnlfVmFsdWUoKSwgdGhpcy5nZXROb2RlKCksIG51bGwsICJ2YWx1ZSIsIG51bGwsIDAsIDEsIE1hcC5FbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3ModXJpVG9MYWJlbE1hcEVudHJ5RUNsYXNzLCBNYXAuRW50cnkuY2xhc3MsICJVUklUb0xhYmVsTWFwRW50cnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFVSSVRvTGFiZWxNYXBFbnRyeV9LZXkoKSwgdGhpcy5nZXRVUkkoKSwgImtleSIsIG51bGwsIDAsIDEsIE1hcC5FbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRVUklUb0xhYmVsTWFwRW50cnlfVmFsdWUoKSwgdGhpcy5nZXRMYWJlbCgpLCBudWxsLCAidmFsdWUiLCBudWxsLCAwLCAxLCBNYXAuRW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHVyaVRvTm9kZUxhYmVsTWFwRW50cnlFQ2xhc3MsIE1hcC5FbnRyeS5jbGFzcywgIlVSSVRvTm9kZUxhYmVsTWFwRW50cnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFVSSVRvTm9kZUxhYmVsTWFwRW50cnlfS2V5KCksIHRoaXMuZ2V0VVJJKCksICJrZXkiLCBudWxsLCAwLCAxLCBNYXAuRW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0VVJJVG9Ob2RlTGFiZWxNYXBFbnRyeV9WYWx1ZSgpLCB0aGlzLmdldE5vZGVMYWJlbCgpLCBudWxsLCAidmFsdWUiLCBudWxsLCAwLCAxLCBNYXAuRW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHN0YXRpY0xhYmVsRUNsYXNzLCBTdGF0aWNMYWJlbC5jbGFzcywgIlN0YXRpY0xhYmVsIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKKwkJaW5pdEVEYXRhVHlwZSh1cmlFRGF0YVR5cGUsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkuY2xhc3MsICJVUkkiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFRGF0YVR5cGUoaWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uRURhdGFUeXBlLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQ3JlYXRlIHJlc291cmNlCisJCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCX0KKworfSAvL0dyYXBoUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvTGFiZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL0xhYmVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOWI1MDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL0xhYmVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzAzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5JZGVudGlmaWFibGVJbXBsOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxhYmVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbEltcGwjZ2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCA8ZW0+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbEltcGwjZ2V0Q3VycmVudFZhbHVlIDxlbT5DdXJyZW50IFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbEltcGwjZ2V0SWRlbnRpZmlhYmxlIDxlbT5JZGVudGlmaWFibGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMYWJlbEltcGwgZXh0ZW5kcyBJZGVudGlmaWFibGVJbXBsIGltcGxlbWVudHMgTGFiZWwgeworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQoKSA8ZW0+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQoKSA8ZW0+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFVSSSB1UklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkID0gVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVudFZhbHVlKCkgPGVtPkN1cnJlbnQgVmFsdWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDdXJyZW50VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBMYWJlbFZhbHVlIGN1cnJlbnRWYWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIExhYmVsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwkJc2V0VVJJKFNURU1VUkkuY3JlYXRlVVJJKFVSSV9UWVBFX0xBQkVMX1NFR01FTlQgKyAiLyIKKwkJCQkrIFNURU1VUkkuZ2VuZXJhdGVVbmlxdWVQYXJ0KCkpKTsKKwkJc2V0VHlwZVVSSShMYWJlbC5VUklfVFlQRV9MQUJFTCk7CisJfSAvLyBMYWJlbEltcGwKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEdyYXBoUGFja2FnZS5MaXRlcmFscy5MQUJFTDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExhYmVsVmFsdWUgZ2V0Q3VycmVudFZhbHVlKCkgeworCQlyZXR1cm4gY3VycmVudFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDdXJyZW50VmFsdWUoTGFiZWxWYWx1ZSBuZXdDdXJyZW50VmFsdWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJTGFiZWxWYWx1ZSBvbGRDdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWU7CisJCWN1cnJlbnRWYWx1ZSA9IG5ld0N1cnJlbnRWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhQYWNrYWdlLkxBQkVMX19DVVJSRU5UX1ZBTFVFLCBvbGRDdXJyZW50VmFsdWUsIG5ld0N1cnJlbnRWYWx1ZSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRWYWx1ZShMYWJlbFZhbHVlIG5ld0N1cnJlbnRWYWx1ZSkgeworCQlpZiAobmV3Q3VycmVudFZhbHVlICE9IGN1cnJlbnRWYWx1ZSkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoY3VycmVudFZhbHVlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWN1cnJlbnRWYWx1ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEdyYXBoUGFja2FnZS5MQUJFTF9fQ1VSUkVOVF9WQUxVRSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q3VycmVudFZhbHVlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0N1cnJlbnRWYWx1ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEdyYXBoUGFja2FnZS5MQUJFTF9fQ1VSUkVOVF9WQUxVRSwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRDdXJyZW50VmFsdWUobmV3Q3VycmVudFZhbHVlLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEdyYXBoUGFja2FnZS5MQUJFTF9fQ1VSUkVOVF9WQUxVRSwgbmV3Q3VycmVudFZhbHVlLCBuZXdDdXJyZW50VmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJYWJzdHJhY3QgcHVibGljIElkZW50aWZpYWJsZSBnZXRJZGVudGlmaWFibGUoKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgSWRlbnRpZmlhYmxlIGJhc2ljR2V0SWRlbnRpZmlhYmxlKCkgeworCQlyZXR1cm4gZ2V0SWRlbnRpZmlhYmxlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCWFic3RyYWN0IHB1YmxpYyB2b2lkIHNldElkZW50aWZpYWJsZShJZGVudGlmaWFibGUgbmV3SWRlbnRpZmlhYmxlKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFVSSSBnZXRVUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKCkgeworCQkvLyBJcyBpdCBzZXQ/CisJCWlmICh1UklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQlmaW5hbCBJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlID0gZ2V0SWRlbnRpZmlhYmxlKCk7CisJCQkvLyBEbyB3ZSBoYXZlIGFuIElkZW50aWZpYWJsZT8KKwkJCWlmIChpZGVudGlmaWFibGUgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCXJldHVybiBpZGVudGlmaWFibGUuZ2V0VVJJKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQ7CisJfSAvLyBnZXRVUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZChVUkkgbmV3VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCkgeworCQlVUkkgb2xkVVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCA9IHVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQ7CisJCXVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQgPSBuZXdVUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCwgb2xkVVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCwgdVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5MQUJFTF9fQ1VSUkVOVF9WQUxVRToKKwkJCQlyZXR1cm4gYmFzaWNTZXRDdXJyZW50VmFsdWUobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEOgorCQkJCXJldHVybiBnZXRVUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKCk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5MQUJFTF9fQ1VSUkVOVF9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0Q3VycmVudFZhbHVlKCk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5MQUJFTF9fSURFTlRJRklBQkxFOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0SWRlbnRpZmlhYmxlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0SWRlbnRpZmlhYmxlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEOgorCQkJCXNldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQoKFVSSSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuTEFCRUxfX0NVUlJFTlRfVkFMVUU6CisJCQkJc2V0Q3VycmVudFZhbHVlKChMYWJlbFZhbHVlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoUGFja2FnZS5MQUJFTF9fSURFTlRJRklBQkxFOgorCQkJCXNldElkZW50aWZpYWJsZSgoSWRlbnRpZmlhYmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkxBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQ6CisJCQkJc2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZChVUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkxBQkVMX19DVVJSRU5UX1ZBTFVFOgorCQkJCXNldEN1cnJlbnRWYWx1ZSgoTGFiZWxWYWx1ZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoUGFja2FnZS5MQUJFTF9fSURFTlRJRklBQkxFOgorCQkJCXNldElkZW50aWZpYWJsZSgoSWRlbnRpZmlhYmxlKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkxBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQ6CisJCQkJcmV0dXJuIFVSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRF9FREVGQVVMVCA9PSBudWxsID8gdVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCAhPSBudWxsIDogIVVSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRF9FREVGQVVMVC5lcXVhbHModVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5MQUJFTF9fQ1VSUkVOVF9WQUxVRToKKwkJCQlyZXR1cm4gY3VycmVudFZhbHVlICE9IG51bGw7CisJCQljYXNlIEdyYXBoUGFja2FnZS5MQUJFTF9fSURFTlRJRklBQkxFOgorCQkJCXJldHVybiBiYXNpY0dldElkZW50aWZpYWJsZSgpICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpCisJCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGdldEN1cnJlbnRWYWx1ZSgpLnRvU3RyaW5nKCk7CisJfSAvLyB0b1N0cmluZworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvbW1vbi5pbXBsLklkZW50aWZpYWJsZUltcGwjc2FuZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzYW5lKCkgeworCQlib29sZWFuIHJldFZhbHVlID0gc3VwZXIuc2FuZSgpOworCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIGN1cnJlbnRWYWx1ZSAhPSBudWxsOworCQlhc3NlcnQgcmV0VmFsdWU7CisKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuc2FuZSgpOworCQlhc3NlcnQgcmV0VmFsdWUgOiBnZXRVUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKCkudG9TdHJpbmcoKTsKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBzYW5lCisKK30gLy8gTGFiZWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL0xhYmVsVmFsdWVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL0xhYmVsVmFsdWVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmYzQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvTGFiZWxWYWx1ZUltcGwuamF2YQpAQCAtMCwwICsxLDYxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxhYmVsIFZhbHVlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGFiZWxWYWx1ZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIExhYmVsVmFsdWUgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTGFiZWxWYWx1ZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gR3JhcGhQYWNrYWdlLkxpdGVyYWxzLkxBQkVMX1ZBTFVFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCS8vIG5vdGhpbmcgdG8gcmVzZXQKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzYW5lKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9IC8vIHNhbmUKKworfSAvLyBMYWJlbFZhbHVlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9Ob2RlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9Ob2RlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5N2IyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL05vZGVJbXBsLmphdmEKQEAgLTAsMCArMSwyNDEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLklkZW50aWZpYWJsZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ob2RlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5Ob2RlSW1wbCNnZXRFZGdlcyA8ZW0+RWRnZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLk5vZGVJbXBsI2dldExhYmVscyA8ZW0+TGFiZWxzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTm9kZUltcGwgZXh0ZW5kcyBJZGVudGlmaWFibGVJbXBsIGltcGxlbWVudHMgTm9kZSB7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFZGdlcygpIDxlbT5FZGdlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RWRnZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxFZGdlPiBlZGdlczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhYmVscygpIDxlbT5MYWJlbHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExhYmVscygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PE5vZGVMYWJlbD4gbGFiZWxzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgTm9kZUltcGwoKSB7CisJCXN1cGVyKCk7CisvLwkJc2V0VVJJKFNURU1VUkkuY3JlYXRlVVJJKFVSSV9UWVBFX05PREVfU0VHTUVOVCArICIvIgorLy8JCQkJKyBTVEVNVVJJLmdlbmVyYXRlVW5pcXVlUGFydCgpKSk7CisJCXNldFR5cGVVUkkoU1RFTVVSSS5OT0RFX1RZUEVfVVJJKTsKKwl9IC8vIE5vZGVJbXBsCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuTk9ERTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PEVkZ2U+IGdldEVkZ2VzKCkgeworCQlpZiAoZWRnZXMgPT0gbnVsbCkgeworCQkJZWRnZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEVkZ2U+KEVkZ2UuY2xhc3MsIHRoaXMsIEdyYXBoUGFja2FnZS5OT0RFX19FREdFUyk7CisJCX0KKwkJcmV0dXJuIGVkZ2VzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8Tm9kZUxhYmVsPiBnZXRMYWJlbHMoKSB7CisJCWlmIChsYWJlbHMgPT0gbnVsbCkgeworCQkJbGFiZWxzID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0PE5vZGVMYWJlbD4oTm9kZUxhYmVsLmNsYXNzLCB0aGlzLCBHcmFwaFBhY2thZ2UuTk9ERV9fTEFCRUxTLCBHcmFwaFBhY2thZ2UuTk9ERV9MQUJFTF9fTk9ERSk7CisJCX0KKwkJcmV0dXJuIGxhYmVsczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLk5PREVfX0xBQkVMUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pKEludGVybmFsRUxpc3Q8Pz4pZ2V0TGFiZWxzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLk5PREVfX0xBQkVMUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldExhYmVscygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb21tb24uaW1wbC5JZGVudGlmaWFibGVJbXBsI3NhbmUoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2FuZSgpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHN1cGVyLnNhbmUoKTsKKworCQlpZiAobGFiZWxzICE9IG51bGwpIHsKKwkJCS8vIEFsbCB0aGUgbGFiZWxzIHNob3VsZCBiZSBzYW5lCisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPE5vZGVMYWJlbD4gbGFiZWxJdGVyID0gZ2V0TGFiZWxzKCkuaXRlcmF0b3IoKTsgbGFiZWxJdGVyCisJCQkJCS5oYXNOZXh0KCkKKwkJCQkJJiYgcmV0VmFsdWU7KSB7CisJCQkJZmluYWwgTm9kZUxhYmVsIG5vZGVMYWJlbCA9IGxhYmVsSXRlci5uZXh0KCk7CisJCQkJLy8gVGhlIHNhbml0eSBvZiBpbmRpdmlkdWFsIE5vZGVMYWJlbHMgaXMgY2hlY2tlZCBlbHNld2hlcmUKKwkJCQkvLyBUaGUgbm9kZSBsYWJlbCBzaG91bGQgYmUgdGhlIG9uZSB0aGF0IGxhYmVscyB0aGlzIG5vZGUKKwkJCQlyZXRWYWx1ZSA9IHJldFZhbHVlCisJCQkJCQkmJiBub2RlTGFiZWwuZ2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCgpLmVxdWFscygKKwkJCQkJCQkJZ2V0VVJJKCkpOworCQkJCWFzc2VydCByZXRWYWx1ZTsKKwkJCX0gLy8gZm9yIGVhY2ggbGFiZWwKKwkJfQorCQkvLyBBbGwgdGhlIGVkZ2VzIHNob3VsZCBiZSBzYW5lCisJCS8vIFdlIGRvbid0IHRlc3QgdGhhdCBiZWNhdXNlIHRoZWlyIHRlc3QgaXMgdG8gY2hlY2sgdGhlaXIgbm9kZXMKKwkJLy8gd2hpY2ggcmVzdWx0cyBpbiBpbmZpbml0ZSByZWN1cnNpb24KKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBzYW5lCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29tbW9uLmltcGwuSWRlbnRpZmlhYmxlSW1wbCN0b1N0cmluZygpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkvLyBSZXR1cm4gdGhlIHRpdGxlIG9mIHRoZSBub2RlIGZyb20gaXQncyBEdWJsaW5Db3JlIGlmIGl0IGlzIHNldAorCQlmaW5hbCBTdHJpbmcgdGl0bGUgPSBnZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKTsKKwkJcmV0dXJuICh0aXRsZSAhPSBudWxsKSA/IHRpdGxlIDogc3VwZXIudG9TdHJpbmcoKTsKKwl9IC8vIHRvU3RyaW5nCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuTk9ERV9fRURHRVM6CisJCQkJcmV0dXJuIGdldEVkZ2VzKCk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5OT0RFX19MQUJFTFM6CisJCQkJcmV0dXJuIGdldExhYmVscygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLk5PREVfX0VER0VTOgorCQkJCWdldEVkZ2VzKCkuY2xlYXIoKTsKKwkJCQlnZXRFZGdlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRWRnZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLk5PREVfX0xBQkVMUzoKKwkJCQlnZXRMYWJlbHMoKS5jbGVhcigpOworCQkJCWdldExhYmVscygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTm9kZUxhYmVsPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5OT0RFX19FREdFUzoKKwkJCQlnZXRFZGdlcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuTk9ERV9fTEFCRUxTOgorCQkJCWdldExhYmVscygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuTk9ERV9fRURHRVM6CisJCQkJcmV0dXJuIGVkZ2VzICE9IG51bGwgJiYgIWVkZ2VzLmlzRW1wdHkoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLk5PREVfX0xBQkVMUzoKKwkJCQlyZXR1cm4gbGFiZWxzICE9IG51bGwgJiYgIWxhYmVscy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvLyBOb2RlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9Ob2RlTGFiZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL05vZGVMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWY3NDQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9Ob2RlTGFiZWxJbXBsLmphdmEKQEAgLTAsMCArMSwyNDAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ob2RlIExhYmVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5Ob2RlTGFiZWxJbXBsI2dldE5vZGUgPGVtPk5vZGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlTGFiZWxJbXBsIGV4dGVuZHMgTGFiZWxJbXBsIGltcGxlbWVudHMgTm9kZUxhYmVsIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb2RlKCkgPGVtPk5vZGU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5vZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBOb2RlIG5vZGU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTm9kZUxhYmVsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEdyYXBoUGFja2FnZS5MaXRlcmFscy5OT0RFX0xBQkVMOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJZGVudGlmaWFibGUgZ2V0SWRlbnRpZmlhYmxlKCkgeworCQlyZXR1cm4gZ2V0Tm9kZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldElkZW50aWZpYWJsZShJZGVudGlmaWFibGUgbmV3SWRlbnRpZmlhYmxlKSB7CisJCXNldE5vZGUoKE5vZGUpbmV3SWRlbnRpZmlhYmxlKTsJCQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7CisJCWlmIChub2RlICE9IG51bGwgJiYgbm9kZS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkTm9kZSA9IChJbnRlcm5hbEVPYmplY3Qpbm9kZTsKKwkJCW5vZGUgPSAoTm9kZSllUmVzb2x2ZVByb3h5KG9sZE5vZGUpOworCQkJaWYgKG5vZGUgIT0gb2xkTm9kZSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEdyYXBoUGFja2FnZS5OT0RFX0xBQkVMX19OT0RFLCBvbGROb2RlLCBub2RlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG5vZGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vZGUgYmFzaWNHZXROb2RlKCkgeworCQlyZXR1cm4gbm9kZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXROb2RlKE5vZGUgbmV3Tm9kZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlOb2RlIG9sZE5vZGUgPSBub2RlOworCQlub2RlID0gbmV3Tm9kZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhQYWNrYWdlLk5PREVfTEFCRUxfX05PREUsIG9sZE5vZGUsIG5ld05vZGUpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE5vZGUoTm9kZSBuZXdOb2RlKSB7CisJCWlmIChuZXdOb2RlICE9IG5vZGUpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKG5vZGUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpbm9kZSkuZUludmVyc2VSZW1vdmUodGhpcywgR3JhcGhQYWNrYWdlLk5PREVfX0xBQkVMUywgTm9kZS5jbGFzcywgbXNncyk7CisJCQlpZiAobmV3Tm9kZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdOb2RlKS5lSW52ZXJzZUFkZCh0aGlzLCBHcmFwaFBhY2thZ2UuTk9ERV9fTEFCRUxTLCBOb2RlLmNsYXNzLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldE5vZGUobmV3Tm9kZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuTk9ERV9MQUJFTF9fTk9ERSwgbmV3Tm9kZSwgbmV3Tm9kZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLk5PREVfTEFCRUxfX05PREU6CisJCQkJaWYgKG5vZGUgIT0gbnVsbCkKKwkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5vZGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEdyYXBoUGFja2FnZS5OT0RFX19MQUJFTFMsIE5vZGUuY2xhc3MsIG1zZ3MpOworCQkJCXJldHVybiBiYXNpY1NldE5vZGUoKE5vZGUpb3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5OT0RFX0xBQkVMX19OT0RFOgorCQkJCXJldHVybiBiYXNpY1NldE5vZGUobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLk5PREVfTEFCRUxfX05PREU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXROb2RlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0Tm9kZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5OT0RFX0xBQkVMX19OT0RFOgorCQkJCXNldE5vZGUoKE5vZGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5OT0RFX0xBQkVMX19OT0RFOgorCQkJCXNldE5vZGUoKE5vZGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5OT0RFX0xBQkVMX19OT0RFOgorCQkJCXJldHVybiBub2RlICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5zYW5lKCk7CisKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZQorCQkJCSYmIChnZXROb2RlKCkgPT0gbnVsbCB8fCBnZXROb2RlKCkuZXF1YWxzKGdldElkZW50aWZpYWJsZSgpKSk7CisJCWFzc2VydCByZXRWYWx1ZTsKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBzYW5lCisJCit9IC8vTm9kZUxhYmVsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9TdGF0aWNFZGdlTGFiZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL1N0YXRpY0VkZ2VMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWUyOGE2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9TdGF0aWNFZGdlTGFiZWxJbXBsLmphdmEKQEAgLTAsMCArMSw3OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNFZGdlTGFiZWw7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0YXRpYyBFZGdlIExhYmVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhdGljRWRnZUxhYmVsSW1wbCBleHRlbmRzIEVkZ2VMYWJlbEltcGwgaW1wbGVtZW50cyBTdGF0aWNFZGdlTGFiZWwgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTdGF0aWNFZGdlTGFiZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gR3JhcGhQYWNrYWdlLkxpdGVyYWxzLlNUQVRJQ19FREdFX0xBQkVMOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxJbXBsI2dldElkZW50aWZpYWJsZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElkZW50aWZpYWJsZSBnZXRJZGVudGlmaWFibGUoKSB7CisJCXJldHVybiBnZXRFZGdlKCk7CisJfSAvLyBnZXRJZGVudGlmaWFibGUKKworCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxJbXBsI3NldElkZW50aWZpYWJsZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG5ld0lkZW50aWZpYWJsZSkgeworCQlzZXRFZGdlKChFZGdlKW5ld0lkZW50aWZpYWJsZSk7CisJfSAvLyBzZXRJZGVudGlmaWFibGUKKworfSAvL1N0YXRpY0VkZ2VMYWJlbEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL1N0YXRpY0xhYmVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9TdGF0aWNMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjQ5Mzk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9TdGF0aWNMYWJlbEltcGwuamF2YQpAQCAtMCwwICsxLDQ4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljTGFiZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdGF0aWMgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGF0aWNMYWJlbEltcGwgZXh0ZW5kcyBMYWJlbEltcGwgaW1wbGVtZW50cyBTdGF0aWNMYWJlbCB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFN0YXRpY0xhYmVsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEdyYXBoUGFja2FnZS5MaXRlcmFscy5TVEFUSUNfTEFCRUw7CisJfQorCit9IC8vU3RhdGljTGFiZWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL1N0YXRpY05vZGVMYWJlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvU3RhdGljTm9kZUxhYmVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYTEwMjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL1N0YXRpY05vZGVMYWJlbEltcGwuamF2YQpAQCAtMCwwICsxLDkxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY05vZGVMYWJlbDsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RhdGljIE5vZGUgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGF0aWNOb2RlTGFiZWxJbXBsIGV4dGVuZHMgTm9kZUxhYmVsSW1wbCBpbXBsZW1lbnRzIFN0YXRpY05vZGVMYWJlbCB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFN0YXRpY05vZGVMYWJlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuU1RBVElDX05PREVfTEFCRUw7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbEltcGwjZ2V0SWRlbnRpZmlhYmxlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSWRlbnRpZmlhYmxlIGdldElkZW50aWZpYWJsZSgpIHsKKwkJcmV0dXJuIGdldE5vZGUoKTsKKwl9IC8vIGdldElkZW50aWZpYWJsZQorCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbEltcGwjc2V0SWRlbnRpZmlhYmxlKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldElkZW50aWZpYWJsZShJZGVudGlmaWFibGUgbmV3SWRlbnRpZmlhYmxlKSB7CisJCXN1cGVyLnNldElkZW50aWZpYWJsZShuZXdJZGVudGlmaWFibGUpOworCQlzZXROb2RlKChOb2RlKW5ld0lkZW50aWZpYWJsZSk7CisJfSAvLyBzZXRJZGVudGlmaWFibGUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxJbXBsI3NhbmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5zYW5lKCk7CisJCQorCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIGdldE5vZGUoKSAhPSBudWxsID8gZ2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCgpCisJCQkJLmVxdWFscyhnZXROb2RlKCkuZ2V0VVJJKCkpCisJCQkJOiB0cnVlOworCQlhc3NlcnQgcmV0VmFsdWU7CisJCQkKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBnZXROb2RlKCkgPT0gZ2V0SWRlbnRpZmlhYmxlKCk7CisJCWFzc2VydCByZXRWYWx1ZTsKKwkJCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHNhbmUKKwkKK30gLy9TdGF0aWNOb2RlTGFiZWxJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9VUklUb0VkZ2VNYXBFbnRyeUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvVVJJVG9FZGdlTWFwRW50cnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkMTQxYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvVVJJVG9FZGdlTWFwRW50cnlJbXBsLmphdmEKQEAgLTAsMCArMSwzMzUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRU1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VVJJIFRvIEVkZ2UgTWFwIEVudHJ5PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5VUklUb0VkZ2VNYXBFbnRyeUltcGwjZ2V0VHlwZWRLZXkgPGVtPktleTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuVVJJVG9FZGdlTWFwRW50cnlJbXBsI2dldFR5cGVkVmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVVJJVG9FZGdlTWFwRW50cnlJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBCYXNpY0VNYXAuRW50cnk8VVJJLEVkZ2U+IHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZWRLZXkoKSA8ZW0+S2V5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUeXBlZEtleSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgS0VZX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVkS2V5KCkgPGVtPktleTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VHlwZWRLZXkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBVUkkga2V5ID0gS0VZX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZWRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VHlwZWRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVkZ2UgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVVJJVG9FZGdlTWFwRW50cnlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gR3JhcGhQYWNrYWdlLkxpdGVyYWxzLlVSSV9UT19FREdFX01BUF9FTlRSWTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVVJJIGdldFR5cGVkS2V5KCkgeworCQlyZXR1cm4ga2V5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFR5cGVkS2V5KFVSSSBuZXdLZXkpIHsKKwkJVVJJIG9sZEtleSA9IGtleTsKKwkJa2V5ID0gbmV3S2V5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuVVJJX1RPX0VER0VfTUFQX0VOVFJZX19LRVksIG9sZEtleSwga2V5KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkZ2UgZ2V0VHlwZWRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFR5cGVkVmFsdWUoRWRnZSBuZXdWYWx1ZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlFZGdlIG9sZFZhbHVlID0gdmFsdWU7CisJCXZhbHVlID0gbmV3VmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEdyYXBoUGFja2FnZS5VUklfVE9fRURHRV9NQVBfRU5UUllfX1ZBTFVFLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFR5cGVkVmFsdWUoRWRnZSBuZXdWYWx1ZSkgeworCQlpZiAobmV3VmFsdWUgIT0gdmFsdWUpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKHZhbHVlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXZhbHVlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gR3JhcGhQYWNrYWdlLlVSSV9UT19FREdFX01BUF9FTlRSWV9fVkFMVUUsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1ZhbHVlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ZhbHVlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gR3JhcGhQYWNrYWdlLlVSSV9UT19FREdFX01BUF9FTlRSWV9fVkFMVUUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0VHlwZWRWYWx1ZShuZXdWYWx1ZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuVVJJX1RPX0VER0VfTUFQX0VOVFJZX19WQUxVRSwgbmV3VmFsdWUsIG5ld1ZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX0VER0VfTUFQX0VOVFJZX19WQUxVRToKKwkJCQlyZXR1cm4gYmFzaWNTZXRUeXBlZFZhbHVlKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5VUklfVE9fRURHRV9NQVBfRU5UUllfX0tFWToKKwkJCQlyZXR1cm4gZ2V0VHlwZWRLZXkoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19FREdFX01BUF9FTlRSWV9fVkFMVUU6CisJCQkJcmV0dXJuIGdldFR5cGVkVmFsdWUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX0VER0VfTUFQX0VOVFJZX19LRVk6CisJCQkJc2V0VHlwZWRLZXkoKFVSSSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX0VER0VfTUFQX0VOVFJZX19WQUxVRToKKwkJCQlzZXRUeXBlZFZhbHVlKChFZGdlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX0VER0VfTUFQX0VOVFJZX19LRVk6CisJCQkJc2V0VHlwZWRLZXkoS0VZX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoUGFja2FnZS5VUklfVE9fRURHRV9NQVBfRU5UUllfX1ZBTFVFOgorCQkJCXNldFR5cGVkVmFsdWUoKEVkZ2UpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5VUklfVE9fRURHRV9NQVBfRU5UUllfX0tFWToKKwkJCQlyZXR1cm4gS0VZX0VERUZBVUxUID09IG51bGwgPyBrZXkgIT0gbnVsbCA6ICFLRVlfRURFRkFVTFQuZXF1YWxzKGtleSk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5VUklfVE9fRURHRV9NQVBfRU5UUllfX1ZBTFVFOgorCQkJCXJldHVybiB2YWx1ZSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoa2V5OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGtleSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBpbnQgaGFzaCA9IC0xOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRIYXNoKCkgeworCQlpZiAoaGFzaCA9PSAtMSkgeworCQkJT2JqZWN0IHRoZUtleSA9IGdldEtleSgpOworCQkJaGFzaCA9ICh0aGVLZXkgPT0gbnVsbCA/IDAgOiB0aGVLZXkuaGFzaENvZGUoKSk7CisJCX0KKwkJcmV0dXJuIGhhc2g7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SGFzaChpbnQgaGFzaCkgeworCQl0aGlzLmhhc2ggPSBoYXNoOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVUkkgZ2V0S2V5KCkgeworCQlyZXR1cm4gZ2V0VHlwZWRLZXkoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRLZXkoVVJJIGtleSkgeworCQlzZXRUeXBlZEtleShrZXkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGdlIGdldFZhbHVlKCkgeworCQlyZXR1cm4gZ2V0VHlwZWRWYWx1ZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGdlIHNldFZhbHVlKEVkZ2UgdmFsdWUpIHsKKwkJRWRnZSBvbGRWYWx1ZSA9IGdldFZhbHVlKCk7CisJCXNldFR5cGVkVmFsdWUodmFsdWUpOworCQlyZXR1cm4gb2xkVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIEVNYXA8VVJJLCBFZGdlPiBnZXRFTWFwKCkgeworCQlFT2JqZWN0IGNvbnRhaW5lciA9IGVDb250YWluZXIoKTsKKwkJcmV0dXJuIGNvbnRhaW5lciA9PSBudWxsID8gbnVsbCA6IChFTWFwPFVSSSwgRWRnZT4pY29udGFpbmVyLmVHZXQoZUNvbnRhaW5tZW50RmVhdHVyZSgpKTsKKwl9CisKK30gLy9VUklUb0VkZ2VNYXBFbnRyeUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2ExNjllCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9VUklUb0lkZW50aWZpYWJsZU1hcEVudHJ5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMzMzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVSSSBUbyBJZGVudGlmaWFibGUgTWFwIEVudHJ5PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5VUklUb0lkZW50aWZpYWJsZU1hcEVudHJ5SW1wbCNnZXRUeXBlZEtleSA8ZW0+S2V5PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5VUklUb0lkZW50aWZpYWJsZU1hcEVudHJ5SW1wbCNnZXRUeXBlZFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnlJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBCYXNpY0VNYXAuRW50cnk8VVJJLElkZW50aWZpYWJsZT4geworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlZEtleSgpIDxlbT5LZXk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFR5cGVkS2V5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVSSSBLRVlfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZWRLZXkoKSA8ZW0+S2V5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUeXBlZEtleSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFVSSSBrZXkgPSBLRVlfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlZFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUeXBlZFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSWRlbnRpZmlhYmxlIHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gR3JhcGhQYWNrYWdlLkxpdGVyYWxzLlVSSV9UT19JREVOVElGSUFCTEVfTUFQX0VOVFJZOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVUkkgZ2V0VHlwZWRLZXkoKSB7CisJCXJldHVybiBrZXk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VHlwZWRLZXkoVVJJIG5ld0tleSkgeworCQlVUkkgb2xkS2V5ID0ga2V5OworCQlrZXkgPSBuZXdLZXk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEdyYXBoUGFja2FnZS5VUklfVE9fSURFTlRJRklBQkxFX01BUF9FTlRSWV9fS0VZLCBvbGRLZXksIGtleSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGUgZ2V0VHlwZWRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFR5cGVkVmFsdWUoSWRlbnRpZmlhYmxlIG5ld1ZhbHVlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCUlkZW50aWZpYWJsZSBvbGRWYWx1ZSA9IHZhbHVlOworCQl2YWx1ZSA9IG5ld1ZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuVVJJX1RPX0lERU5USUZJQUJMRV9NQVBfRU5UUllfX1ZBTFVFLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFR5cGVkVmFsdWUoSWRlbnRpZmlhYmxlIG5ld1ZhbHVlKSB7CisJCWlmIChuZXdWYWx1ZSAhPSB2YWx1ZSkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAodmFsdWUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdmFsdWUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBHcmFwaFBhY2thZ2UuVVJJX1RPX0lERU5USUZJQUJMRV9NQVBfRU5UUllfX1ZBTFVFLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdWYWx1ZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWYWx1ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEdyYXBoUGFja2FnZS5VUklfVE9fSURFTlRJRklBQkxFX01BUF9FTlRSWV9fVkFMVUUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0VHlwZWRWYWx1ZShuZXdWYWx1ZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuVVJJX1RPX0lERU5USUZJQUJMRV9NQVBfRU5UUllfX1ZBTFVFLCBuZXdWYWx1ZSwgbmV3VmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5VUklfVE9fSURFTlRJRklBQkxFX01BUF9FTlRSWV9fVkFMVUU6CisJCQkJcmV0dXJuIGJhc2ljU2V0VHlwZWRWYWx1ZShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX0lERU5USUZJQUJMRV9NQVBfRU5UUllfX0tFWToKKwkJCQlyZXR1cm4gZ2V0VHlwZWRLZXkoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19JREVOVElGSUFCTEVfTUFQX0VOVFJZX19WQUxVRToKKwkJCQlyZXR1cm4gZ2V0VHlwZWRWYWx1ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5VUklfVE9fSURFTlRJRklBQkxFX01BUF9FTlRSWV9fS0VZOgorCQkJCXNldFR5cGVkS2V5KChVUkkpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19JREVOVElGSUFCTEVfTUFQX0VOVFJZX19WQUxVRToKKwkJCQlzZXRUeXBlZFZhbHVlKChJZGVudGlmaWFibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5VUklfVE9fSURFTlRJRklBQkxFX01BUF9FTlRSWV9fS0VZOgorCQkJCXNldFR5cGVkS2V5KEtFWV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX0lERU5USUZJQUJMRV9NQVBfRU5UUllfX1ZBTFVFOgorCQkJCXNldFR5cGVkVmFsdWUoKElkZW50aWZpYWJsZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19JREVOVElGSUFCTEVfTUFQX0VOVFJZX19LRVk6CisJCQkJcmV0dXJuIEtFWV9FREVGQVVMVCA9PSBudWxsID8ga2V5ICE9IG51bGwgOiAhS0VZX0VERUZBVUxULmVxdWFscyhrZXkpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX0lERU5USUZJQUJMRV9NQVBfRU5UUllfX1ZBTFVFOgorCQkJCXJldHVybiB2YWx1ZSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoa2V5OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGtleSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBpbnQgaGFzaCA9IC0xOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRIYXNoKCkgeworCQlpZiAoaGFzaCA9PSAtMSkgeworCQkJT2JqZWN0IHRoZUtleSA9IGdldEtleSgpOworCQkJaGFzaCA9ICh0aGVLZXkgPT0gbnVsbCA/IDAgOiB0aGVLZXkuaGFzaENvZGUoKSk7CisJCX0KKwkJcmV0dXJuIGhhc2g7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SGFzaChpbnQgaGFzaCkgeworCQl0aGlzLmhhc2ggPSBoYXNoOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVUkkgZ2V0S2V5KCkgeworCQlyZXR1cm4gZ2V0VHlwZWRLZXkoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRLZXkoVVJJIGtleSkgeworCQlzZXRUeXBlZEtleShrZXkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGUgZ2V0VmFsdWUoKSB7CisJCXJldHVybiBnZXRUeXBlZFZhbHVlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElkZW50aWZpYWJsZSBzZXRWYWx1ZShJZGVudGlmaWFibGUgdmFsdWUpIHsKKwkJSWRlbnRpZmlhYmxlIG9sZFZhbHVlID0gZ2V0VmFsdWUoKTsKKwkJc2V0VHlwZWRWYWx1ZSh2YWx1ZSk7CisJCXJldHVybiBvbGRWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgRU1hcDxVUkksIElkZW50aWZpYWJsZT4gZ2V0RU1hcCgpIHsKKwkJRU9iamVjdCBjb250YWluZXIgPSBlQ29udGFpbmVyKCk7CisJCXJldHVybiBjb250YWluZXIgPT0gbnVsbCA/IG51bGwgOiAoRU1hcDxVUkksIElkZW50aWZpYWJsZT4pY29udGFpbmVyLmVHZXQoZUNvbnRhaW5tZW50RmVhdHVyZSgpKTsKKwl9CisKK30gLy9VUklUb0lkZW50aWZpYWJsZU1hcEVudHJ5SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvVVJJVG9MYWJlbE1hcEVudHJ5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvaW1wbC9VUklUb0xhYmVsTWFwRW50cnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyODYzNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvVVJJVG9MYWJlbE1hcEVudHJ5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMzM1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5VUkkgVG8gTGFiZWwgTWFwIEVudHJ5PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5VUklUb0xhYmVsTWFwRW50cnlJbXBsI2dldFR5cGVkS2V5IDxlbT5LZXk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLlVSSVRvTGFiZWxNYXBFbnRyeUltcGwjZ2V0VHlwZWRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBVUklUb0xhYmVsTWFwRW50cnlJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBCYXNpY0VNYXAuRW50cnk8VVJJLExhYmVsPiB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVkS2V5KCkgPGVtPktleTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VHlwZWRLZXkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVVJJIEtFWV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlZEtleSgpIDxlbT5LZXk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFR5cGVkS2V5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVVJJIGtleSA9IEtFWV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVkVmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFR5cGVkVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBMYWJlbCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBVUklUb0xhYmVsTWFwRW50cnlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gR3JhcGhQYWNrYWdlLkxpdGVyYWxzLlVSSV9UT19MQUJFTF9NQVBfRU5UUlk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVSSSBnZXRUeXBlZEtleSgpIHsKKwkJcmV0dXJuIGtleTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUeXBlZEtleShVUkkgbmV3S2V5KSB7CisJCVVSSSBvbGRLZXkgPSBrZXk7CisJCWtleSA9IG5ld0tleTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhQYWNrYWdlLlVSSV9UT19MQUJFTF9NQVBfRU5UUllfX0tFWSwgb2xkS2V5LCBrZXkpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGFiZWwgZ2V0VHlwZWRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFR5cGVkVmFsdWUoTGFiZWwgbmV3VmFsdWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJTGFiZWwgb2xkVmFsdWUgPSB2YWx1ZTsKKwkJdmFsdWUgPSBuZXdWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhQYWNrYWdlLlVSSV9UT19MQUJFTF9NQVBfRU5UUllfX1ZBTFVFLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFR5cGVkVmFsdWUoTGFiZWwgbmV3VmFsdWUpIHsKKwkJaWYgKG5ld1ZhbHVlICE9IHZhbHVlKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmICh2YWx1ZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl2YWx1ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEdyYXBoUGFja2FnZS5VUklfVE9fTEFCRUxfTUFQX0VOVFJZX19WQUxVRSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3VmFsdWUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VmFsdWUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBHcmFwaFBhY2thZ2UuVVJJX1RPX0xBQkVMX01BUF9FTlRSWV9fVkFMVUUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0VHlwZWRWYWx1ZShuZXdWYWx1ZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuVVJJX1RPX0xBQkVMX01BUF9FTlRSWV9fVkFMVUUsIG5ld1ZhbHVlLCBuZXdWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19MQUJFTF9NQVBfRU5UUllfX1ZBTFVFOgorCQkJCXJldHVybiBiYXNpY1NldFR5cGVkVmFsdWUobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19MQUJFTF9NQVBfRU5UUllfX0tFWToKKwkJCQlyZXR1cm4gZ2V0VHlwZWRLZXkoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19MQUJFTF9NQVBfRU5UUllfX1ZBTFVFOgorCQkJCXJldHVybiBnZXRUeXBlZFZhbHVlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19MQUJFTF9NQVBfRU5UUllfX0tFWToKKwkJCQlzZXRUeXBlZEtleSgoVVJJKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoUGFja2FnZS5VUklfVE9fTEFCRUxfTUFQX0VOVFJZX19WQUxVRToKKwkJCQlzZXRUeXBlZFZhbHVlKChMYWJlbCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19MQUJFTF9NQVBfRU5UUllfX0tFWToKKwkJCQlzZXRUeXBlZEtleShLRVlfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19MQUJFTF9NQVBfRU5UUllfX1ZBTFVFOgorCQkJCXNldFR5cGVkVmFsdWUoKExhYmVsKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX0xBQkVMX01BUF9FTlRSWV9fS0VZOgorCQkJCXJldHVybiBLRVlfRURFRkFVTFQgPT0gbnVsbCA/IGtleSAhPSBudWxsIDogIUtFWV9FREVGQVVMVC5lcXVhbHMoa2V5KTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19MQUJFTF9NQVBfRU5UUllfX1ZBTFVFOgorCQkJCXJldHVybiB2YWx1ZSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoa2V5OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGtleSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBpbnQgaGFzaCA9IC0xOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRIYXNoKCkgeworCQlpZiAoaGFzaCA9PSAtMSkgeworCQkJT2JqZWN0IHRoZUtleSA9IGdldEtleSgpOworCQkJaGFzaCA9ICh0aGVLZXkgPT0gbnVsbCA/IDAgOiB0aGVLZXkuaGFzaENvZGUoKSk7CisJCX0KKwkJcmV0dXJuIGhhc2g7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SGFzaChpbnQgaGFzaCkgeworCQl0aGlzLmhhc2ggPSBoYXNoOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVUkkgZ2V0S2V5KCkgeworCQlyZXR1cm4gZ2V0VHlwZWRLZXkoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRLZXkoVVJJIGtleSkgeworCQlzZXRUeXBlZEtleShrZXkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMYWJlbCBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIGdldFR5cGVkVmFsdWUoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGFiZWwgc2V0VmFsdWUoTGFiZWwgdmFsdWUpIHsKKwkJTGFiZWwgb2xkVmFsdWUgPSBnZXRWYWx1ZSgpOworCQlzZXRUeXBlZFZhbHVlKHZhbHVlKTsKKwkJcmV0dXJuIG9sZFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBFTWFwPFVSSSwgTGFiZWw+IGdldEVNYXAoKSB7CisJCUVPYmplY3QgY29udGFpbmVyID0gZUNvbnRhaW5lcigpOworCQlyZXR1cm4gY29udGFpbmVyID09IG51bGwgPyBudWxsIDogKEVNYXA8VVJJLCBMYWJlbD4pY29udGFpbmVyLmVHZXQoZUNvbnRhaW5tZW50RmVhdHVyZSgpKTsKKwl9CisKK30gLy9VUklUb0xhYmVsTWFwRW50cnlJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL1VSSVRvTm9kZUxhYmVsTWFwRW50cnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL1VSSVRvTm9kZUxhYmVsTWFwRW50cnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlZDljZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvVVJJVG9Ob2RlTGFiZWxNYXBFbnRyeUltcGwuamF2YQpAQCAtMCwwICsxLDMzNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVSSSBUbyBOb2RlIExhYmVsIE1hcCBFbnRyeTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuVVJJVG9Ob2RlTGFiZWxNYXBFbnRyeUltcGwjZ2V0VHlwZWRLZXkgPGVtPktleTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuVVJJVG9Ob2RlTGFiZWxNYXBFbnRyeUltcGwjZ2V0VHlwZWRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBVUklUb05vZGVMYWJlbE1hcEVudHJ5SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQmFzaWNFTWFwLkVudHJ5PFVSSSxOb2RlTGFiZWw+IHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZWRLZXkoKSA8ZW0+S2V5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUeXBlZEtleSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgS0VZX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVkS2V5KCkgPGVtPktleTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VHlwZWRLZXkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBVUkkga2V5ID0gS0VZX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZWRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VHlwZWRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIE5vZGVMYWJlbCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBVUklUb05vZGVMYWJlbE1hcEVudHJ5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEdyYXBoUGFja2FnZS5MaXRlcmFscy5VUklfVE9fTk9ERV9MQUJFTF9NQVBfRU5UUlk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVSSSBnZXRUeXBlZEtleSgpIHsKKwkJcmV0dXJuIGtleTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUeXBlZEtleShVUkkgbmV3S2V5KSB7CisJCVVSSSBvbGRLZXkgPSBrZXk7CisJCWtleSA9IG5ld0tleTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhQYWNrYWdlLlVSSV9UT19OT0RFX0xBQkVMX01BUF9FTlRSWV9fS0VZLCBvbGRLZXksIGtleSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb2RlTGFiZWwgZ2V0VHlwZWRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFR5cGVkVmFsdWUoTm9kZUxhYmVsIG5ld1ZhbHVlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCU5vZGVMYWJlbCBvbGRWYWx1ZSA9IHZhbHVlOworCQl2YWx1ZSA9IG5ld1ZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuVVJJX1RPX05PREVfTEFCRUxfTUFQX0VOVFJZX19WQUxVRSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUeXBlZFZhbHVlKE5vZGVMYWJlbCBuZXdWYWx1ZSkgeworCQlpZiAobmV3VmFsdWUgIT0gdmFsdWUpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKHZhbHVlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXZhbHVlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gR3JhcGhQYWNrYWdlLlVSSV9UT19OT0RFX0xBQkVMX01BUF9FTlRSWV9fVkFMVUUsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1ZhbHVlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ZhbHVlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gR3JhcGhQYWNrYWdlLlVSSV9UT19OT0RFX0xBQkVMX01BUF9FTlRSWV9fVkFMVUUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0VHlwZWRWYWx1ZShuZXdWYWx1ZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuVVJJX1RPX05PREVfTEFCRUxfTUFQX0VOVFJZX19WQUxVRSwgbmV3VmFsdWUsIG5ld1ZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX05PREVfTEFCRUxfTUFQX0VOVFJZX19WQUxVRToKKwkJCQlyZXR1cm4gYmFzaWNTZXRUeXBlZFZhbHVlKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5VUklfVE9fTk9ERV9MQUJFTF9NQVBfRU5UUllfX0tFWToKKwkJCQlyZXR1cm4gZ2V0VHlwZWRLZXkoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19OT0RFX0xBQkVMX01BUF9FTlRSWV9fVkFMVUU6CisJCQkJcmV0dXJuIGdldFR5cGVkVmFsdWUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX05PREVfTEFCRUxfTUFQX0VOVFJZX19LRVk6CisJCQkJc2V0VHlwZWRLZXkoKFVSSSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX05PREVfTEFCRUxfTUFQX0VOVFJZX19WQUxVRToKKwkJCQlzZXRUeXBlZFZhbHVlKChOb2RlTGFiZWwpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5VUklfVE9fTk9ERV9MQUJFTF9NQVBfRU5UUllfX0tFWToKKwkJCQlzZXRUeXBlZEtleShLRVlfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19OT0RFX0xBQkVMX01BUF9FTlRSWV9fVkFMVUU6CisJCQkJc2V0VHlwZWRWYWx1ZSgoTm9kZUxhYmVsKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX05PREVfTEFCRUxfTUFQX0VOVFJZX19LRVk6CisJCQkJcmV0dXJuIEtFWV9FREVGQVVMVCA9PSBudWxsID8ga2V5ICE9IG51bGwgOiAhS0VZX0VERUZBVUxULmVxdWFscyhrZXkpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX05PREVfTEFCRUxfTUFQX0VOVFJZX19WQUxVRToKKwkJCQlyZXR1cm4gdmFsdWUgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGtleTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChrZXkpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGhhc2ggPSAtMTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0SGFzaCgpIHsKKwkJaWYgKGhhc2ggPT0gLTEpIHsKKwkJCU9iamVjdCB0aGVLZXkgPSBnZXRLZXkoKTsKKwkJCWhhc2ggPSAodGhlS2V5ID09IG51bGwgPyAwIDogdGhlS2V5Lmhhc2hDb2RlKCkpOworCQl9CisJCXJldHVybiBoYXNoOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEhhc2goaW50IGhhc2gpIHsKKwkJdGhpcy5oYXNoID0gaGFzaDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVVJJIGdldEtleSgpIHsKKwkJcmV0dXJuIGdldFR5cGVkS2V5KCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0S2V5KFVSSSBrZXkpIHsKKwkJc2V0VHlwZWRLZXkoa2V5KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm9kZUxhYmVsIGdldFZhbHVlKCkgeworCQlyZXR1cm4gZ2V0VHlwZWRWYWx1ZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb2RlTGFiZWwgc2V0VmFsdWUoTm9kZUxhYmVsIHZhbHVlKSB7CisJCU5vZGVMYWJlbCBvbGRWYWx1ZSA9IGdldFZhbHVlKCk7CisJCXNldFR5cGVkVmFsdWUodmFsdWUpOworCQlyZXR1cm4gb2xkVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIEVNYXA8VVJJLCBOb2RlTGFiZWw+IGdldEVNYXAoKSB7CisJCUVPYmplY3QgY29udGFpbmVyID0gZUNvbnRhaW5lcigpOworCQlyZXR1cm4gY29udGFpbmVyID09IG51bGwgPyBudWxsIDogKEVNYXA8VVJJLCBOb2RlTGFiZWw+KWNvbnRhaW5lci5lR2V0KGVDb250YWlubWVudEZlYXR1cmUoKSk7CisJfQorCit9IC8vVVJJVG9Ob2RlTGFiZWxNYXBFbnRyeUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvVVJJVG9Ob2RlTWFwRW50cnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL1VSSVRvTm9kZU1hcEVudHJ5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YWQ3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL1VSSVRvTm9kZU1hcEVudHJ5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMzM1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVSSSBUbyBOb2RlIE1hcCBFbnRyeTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuVVJJVG9Ob2RlTWFwRW50cnlJbXBsI2dldFR5cGVkS2V5IDxlbT5LZXk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLlVSSVRvTm9kZU1hcEVudHJ5SW1wbCNnZXRUeXBlZFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFVSSVRvTm9kZU1hcEVudHJ5SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQmFzaWNFTWFwLkVudHJ5PFVSSSxOb2RlPiB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVkS2V5KCkgPGVtPktleTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VHlwZWRLZXkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVVJJIEtFWV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlZEtleSgpIDxlbT5LZXk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFR5cGVkS2V5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVVJJIGtleSA9IEtFWV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVkVmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFR5cGVkVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBOb2RlIHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFVSSVRvTm9kZU1hcEVudHJ5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEdyYXBoUGFja2FnZS5MaXRlcmFscy5VUklfVE9fTk9ERV9NQVBfRU5UUlk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVSSSBnZXRUeXBlZEtleSgpIHsKKwkJcmV0dXJuIGtleTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUeXBlZEtleShVUkkgbmV3S2V5KSB7CisJCVVSSSBvbGRLZXkgPSBrZXk7CisJCWtleSA9IG5ld0tleTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhQYWNrYWdlLlVSSV9UT19OT0RFX01BUF9FTlRSWV9fS0VZLCBvbGRLZXksIGtleSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb2RlIGdldFR5cGVkVmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUeXBlZFZhbHVlKE5vZGUgbmV3VmFsdWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJTm9kZSBvbGRWYWx1ZSA9IHZhbHVlOworCQl2YWx1ZSA9IG5ld1ZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuVVJJX1RPX05PREVfTUFQX0VOVFJZX19WQUxVRSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUeXBlZFZhbHVlKE5vZGUgbmV3VmFsdWUpIHsKKwkJaWYgKG5ld1ZhbHVlICE9IHZhbHVlKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmICh2YWx1ZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl2YWx1ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEdyYXBoUGFja2FnZS5VUklfVE9fTk9ERV9NQVBfRU5UUllfX1ZBTFVFLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdWYWx1ZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWYWx1ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEdyYXBoUGFja2FnZS5VUklfVE9fTk9ERV9NQVBfRU5UUllfX1ZBTFVFLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFR5cGVkVmFsdWUobmV3VmFsdWUsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhQYWNrYWdlLlVSSV9UT19OT0RFX01BUF9FTlRSWV9fVkFMVUUsIG5ld1ZhbHVlLCBuZXdWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19OT0RFX01BUF9FTlRSWV9fVkFMVUU6CisJCQkJcmV0dXJuIGJhc2ljU2V0VHlwZWRWYWx1ZShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX05PREVfTUFQX0VOVFJZX19LRVk6CisJCQkJcmV0dXJuIGdldFR5cGVkS2V5KCk7CisJCQljYXNlIEdyYXBoUGFja2FnZS5VUklfVE9fTk9ERV9NQVBfRU5UUllfX1ZBTFVFOgorCQkJCXJldHVybiBnZXRUeXBlZFZhbHVlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19OT0RFX01BUF9FTlRSWV9fS0VZOgorCQkJCXNldFR5cGVkS2V5KChVUkkpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19OT0RFX01BUF9FTlRSWV9fVkFMVUU6CisJCQkJc2V0VHlwZWRWYWx1ZSgoTm9kZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19OT0RFX01BUF9FTlRSWV9fS0VZOgorCQkJCXNldFR5cGVkS2V5KEtFWV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX05PREVfTUFQX0VOVFJZX19WQUxVRToKKwkJCQlzZXRUeXBlZFZhbHVlKChOb2RlKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX05PREVfTUFQX0VOVFJZX19LRVk6CisJCQkJcmV0dXJuIEtFWV9FREVGQVVMVCA9PSBudWxsID8ga2V5ICE9IG51bGwgOiAhS0VZX0VERUZBVUxULmVxdWFscyhrZXkpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX05PREVfTUFQX0VOVFJZX19WQUxVRToKKwkJCQlyZXR1cm4gdmFsdWUgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGtleTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChrZXkpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGhhc2ggPSAtMTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0SGFzaCgpIHsKKwkJaWYgKGhhc2ggPT0gLTEpIHsKKwkJCU9iamVjdCB0aGVLZXkgPSBnZXRLZXkoKTsKKwkJCWhhc2ggPSAodGhlS2V5ID09IG51bGwgPyAwIDogdGhlS2V5Lmhhc2hDb2RlKCkpOworCQl9CisJCXJldHVybiBoYXNoOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEhhc2goaW50IGhhc2gpIHsKKwkJdGhpcy5oYXNoID0gaGFzaDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVVJJIGdldEtleSgpIHsKKwkJcmV0dXJuIGdldFR5cGVkS2V5KCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0S2V5KFVSSSBrZXkpIHsKKwkJc2V0VHlwZWRLZXkoa2V5KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm9kZSBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIGdldFR5cGVkVmFsdWUoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm9kZSBzZXRWYWx1ZShOb2RlIHZhbHVlKSB7CisJCU5vZGUgb2xkVmFsdWUgPSBnZXRWYWx1ZSgpOworCQlzZXRUeXBlZFZhbHVlKHZhbHVlKTsKKwkJcmV0dXJuIG9sZFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBFTWFwPFVSSSwgTm9kZT4gZ2V0RU1hcCgpIHsKKwkJRU9iamVjdCBjb250YWluZXIgPSBlQ29udGFpbmVyKCk7CisJCXJldHVybiBjb250YWluZXIgPT0gbnVsbCA/IG51bGwgOiAoRU1hcDxVUkksIE5vZGU+KWNvbnRhaW5lci5lR2V0KGVDb250YWlubWVudEZlYXR1cmUoKSk7CisJfQorCit9IC8vVVJJVG9Ob2RlTWFwRW50cnlJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL1VucmVzb2x2ZWRJZGVudGlmaWFibGVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9pbXBsL1VucmVzb2x2ZWRJZGVudGlmaWFibGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2YWRhOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL2ltcGwvVW5yZXNvbHZlZElkZW50aWZpYWJsZUltcGwuamF2YQpAQCAtMCwwICsxLDQzNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlVucmVzb2x2ZWRJZGVudGlmaWFibGU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVucmVzb2x2ZWQgSWRlbnRpZmlhYmxlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5VbnJlc29sdmVkSWRlbnRpZmlhYmxlSW1wbCNnZXRTY2VuYXJpbyA8ZW0+U2NlbmFyaW88L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLlVucmVzb2x2ZWRJZGVudGlmaWFibGVJbXBsI2dldE1vZGVsIDxlbT5Nb2RlbDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuVW5yZXNvbHZlZElkZW50aWZpYWJsZUltcGwjZ2V0R3JhcGggPGVtPkdyYXBoPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5VbnJlc29sdmVkSWRlbnRpZmlhYmxlSW1wbCNnZXRJZGVudGlmaWFibGUgPGVtPklkZW50aWZpYWJsZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuVW5yZXNvbHZlZElkZW50aWZpYWJsZUltcGwjZ2V0VW5yZXNvbHZlZFVSSSA8ZW0+VW5yZXNvbHZlZCBVUkk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLlVucmVzb2x2ZWRJZGVudGlmaWFibGVJbXBsI2dldEZpZWxkTmFtZSA8ZW0+RmllbGQgTmFtZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFVucmVzb2x2ZWRJZGVudGlmaWFibGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cworCQlVbnJlc29sdmVkSWRlbnRpZmlhYmxlIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2VuYXJpbygpIDxlbT5TY2VuYXJpbzwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNjZW5hcmlvKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSWRlbnRpZmlhYmxlIHNjZW5hcmlvOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TW9kZWwoKSA8ZW0+TW9kZWw8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIElkZW50aWZpYWJsZSBtb2RlbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyYXBoKCkgPGVtPkdyYXBoPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0R3JhcGgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBJZGVudGlmaWFibGUgZ3JhcGg7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZGVudGlmaWFibGUoKSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWRlbnRpZmlhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSWRlbnRpZmlhYmxlIGlkZW50aWZpYWJsZTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbnJlc29sdmVkVVJJKCkgPGVtPlVucmVzb2x2ZWQgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VW5yZXNvbHZlZFVSSSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgVU5SRVNPTFZFRF9VUklfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5yZXNvbHZlZFVSSSgpIDxlbT5VbnJlc29sdmVkIFVSSTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFVucmVzb2x2ZWRVUkkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBVUkkgdW5yZXNvbHZlZFVSSSA9IFVOUkVTT0xWRURfVVJJX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkTmFtZSgpIDxlbT5GaWVsZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RmllbGROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkTmFtZSgpIDxlbT5GaWVsZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RmllbGROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkTmFtZSA9IEZJRUxEX05BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFVucmVzb2x2ZWRJZGVudGlmaWFibGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEdyYXBoUGFja2FnZS5MaXRlcmFscy5VTlJFU09MVkVEX0lERU5USUZJQUJMRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElkZW50aWZpYWJsZSBnZXRTY2VuYXJpbygpIHsKKwkJaWYgKHNjZW5hcmlvICE9IG51bGwgJiYgc2NlbmFyaW8uZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNjZW5hcmlvID0gKEludGVybmFsRU9iamVjdClzY2VuYXJpbzsKKwkJCXNjZW5hcmlvID0gKElkZW50aWZpYWJsZSllUmVzb2x2ZVByb3h5KG9sZFNjZW5hcmlvKTsKKwkJCWlmIChzY2VuYXJpbyAhPSBvbGRTY2VuYXJpbykgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEdyYXBoUGFja2FnZS5VTlJFU09MVkVEX0lERU5USUZJQUJMRV9fU0NFTkFSSU8sIG9sZFNjZW5hcmlvLCBzY2VuYXJpbykpOworCQkJfQorCQl9CisJCXJldHVybiBzY2VuYXJpbzsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElkZW50aWZpYWJsZSBiYXNpY0dldFNjZW5hcmlvKCkgeworCQlyZXR1cm4gc2NlbmFyaW87CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNjZW5hcmlvKElkZW50aWZpYWJsZSBuZXdTY2VuYXJpbykgeworCQlJZGVudGlmaWFibGUgb2xkU2NlbmFyaW8gPSBzY2VuYXJpbzsKKwkJc2NlbmFyaW8gPSBuZXdTY2VuYXJpbzsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhQYWNrYWdlLlVOUkVTT0xWRURfSURFTlRJRklBQkxFX19TQ0VOQVJJTywgb2xkU2NlbmFyaW8sIHNjZW5hcmlvKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGUgZ2V0TW9kZWwoKSB7CisJCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRNb2RlbCA9IChJbnRlcm5hbEVPYmplY3QpbW9kZWw7CisJCQltb2RlbCA9IChJZGVudGlmaWFibGUpZVJlc29sdmVQcm94eShvbGRNb2RlbCk7CisJCQlpZiAobW9kZWwgIT0gb2xkTW9kZWwpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBHcmFwaFBhY2thZ2UuVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfX01PREVMLCBvbGRNb2RlbCwgbW9kZWwpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbW9kZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGUgYmFzaWNHZXRNb2RlbCgpIHsKKwkJcmV0dXJuIG1vZGVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNb2RlbChJZGVudGlmaWFibGUgbmV3TW9kZWwpIHsKKwkJSWRlbnRpZmlhYmxlIG9sZE1vZGVsID0gbW9kZWw7CisJCW1vZGVsID0gbmV3TW9kZWw7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEdyYXBoUGFja2FnZS5VTlJFU09MVkVEX0lERU5USUZJQUJMRV9fTU9ERUwsIG9sZE1vZGVsLCBtb2RlbCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSWRlbnRpZmlhYmxlIGdldEdyYXBoKCkgeworCQlpZiAoZ3JhcGggIT0gbnVsbCAmJiBncmFwaC5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkR3JhcGggPSAoSW50ZXJuYWxFT2JqZWN0KWdyYXBoOworCQkJZ3JhcGggPSAoSWRlbnRpZmlhYmxlKWVSZXNvbHZlUHJveHkob2xkR3JhcGgpOworCQkJaWYgKGdyYXBoICE9IG9sZEdyYXBoKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgR3JhcGhQYWNrYWdlLlVOUkVTT0xWRURfSURFTlRJRklBQkxFX19HUkFQSCwgb2xkR3JhcGgsIGdyYXBoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGdyYXBoOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSWRlbnRpZmlhYmxlIGJhc2ljR2V0R3JhcGgoKSB7CisJCXJldHVybiBncmFwaDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0R3JhcGgoSWRlbnRpZmlhYmxlIG5ld0dyYXBoKSB7CisJCUlkZW50aWZpYWJsZSBvbGRHcmFwaCA9IGdyYXBoOworCQlncmFwaCA9IG5ld0dyYXBoOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfX0dSQVBILCBvbGRHcmFwaCwgZ3JhcGgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElkZW50aWZpYWJsZSBnZXRJZGVudGlmaWFibGUoKSB7CisJCWlmIChpZGVudGlmaWFibGUgIT0gbnVsbCAmJiBpZGVudGlmaWFibGUuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZElkZW50aWZpYWJsZSA9IChJbnRlcm5hbEVPYmplY3QpaWRlbnRpZmlhYmxlOworCQkJaWRlbnRpZmlhYmxlID0gKElkZW50aWZpYWJsZSllUmVzb2x2ZVByb3h5KG9sZElkZW50aWZpYWJsZSk7CisJCQlpZiAoaWRlbnRpZmlhYmxlICE9IG9sZElkZW50aWZpYWJsZSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEdyYXBoUGFja2FnZS5VTlJFU09MVkVEX0lERU5USUZJQUJMRV9fSURFTlRJRklBQkxFLCBvbGRJZGVudGlmaWFibGUsIGlkZW50aWZpYWJsZSkpOworCQkJfQorCQl9CisJCXJldHVybiBpZGVudGlmaWFibGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGUgYmFzaWNHZXRJZGVudGlmaWFibGUoKSB7CisJCXJldHVybiBpZGVudGlmaWFibGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldElkZW50aWZpYWJsZShJZGVudGlmaWFibGUgbmV3SWRlbnRpZmlhYmxlKSB7CisJCUlkZW50aWZpYWJsZSBvbGRJZGVudGlmaWFibGUgPSBpZGVudGlmaWFibGU7CisJCWlkZW50aWZpYWJsZSA9IG5ld0lkZW50aWZpYWJsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhQYWNrYWdlLlVOUkVTT0xWRURfSURFTlRJRklBQkxFX19JREVOVElGSUFCTEUsIG9sZElkZW50aWZpYWJsZSwgaWRlbnRpZmlhYmxlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVUkkgZ2V0VW5yZXNvbHZlZFVSSSgpIHsKKwkJcmV0dXJuIHVucmVzb2x2ZWRVUkk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFVucmVzb2x2ZWRVUkkoVVJJIG5ld1VucmVzb2x2ZWRVUkkpIHsKKwkJVVJJIG9sZFVucmVzb2x2ZWRVUkkgPSB1bnJlc29sdmVkVVJJOworCQl1bnJlc29sdmVkVVJJID0gbmV3VW5yZXNvbHZlZFVSSTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhQYWNrYWdlLlVOUkVTT0xWRURfSURFTlRJRklBQkxFX19VTlJFU09MVkVEX1VSSSwgb2xkVW5yZXNvbHZlZFVSSSwgdW5yZXNvbHZlZFVSSSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKwkJcmV0dXJuIGZpZWxkTmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RmllbGROYW1lKFN0cmluZyBuZXdGaWVsZE5hbWUpIHsKKwkJU3RyaW5nIG9sZEZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKKwkJZmllbGROYW1lID0gbmV3RmllbGROYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaFBhY2thZ2UuVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfX0ZJRUxEX05BTUUsIG9sZEZpZWxkTmFtZSwgZmllbGROYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVOUkVTT0xWRURfSURFTlRJRklBQkxFX19TQ0VOQVJJTzoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFNjZW5hcmlvKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U2NlbmFyaW8oKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVOUkVTT0xWRURfSURFTlRJRklBQkxFX19NT0RFTDoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1vZGVsKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0TW9kZWwoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVOUkVTT0xWRURfSURFTlRJRklBQkxFX19HUkFQSDoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEdyYXBoKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0R3JhcGgoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVOUkVTT0xWRURfSURFTlRJRklBQkxFX19JREVOVElGSUFCTEU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRJZGVudGlmaWFibGUoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRJZGVudGlmaWFibGUoKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVOUkVTT0xWRURfSURFTlRJRklBQkxFX19VTlJFU09MVkVEX1VSSToKKwkJCQlyZXR1cm4gZ2V0VW5yZXNvbHZlZFVSSSgpOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfX0ZJRUxEX05BTUU6CisJCQkJcmV0dXJuIGdldEZpZWxkTmFtZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfX1NDRU5BUklPOgorCQkJCXNldFNjZW5hcmlvKChJZGVudGlmaWFibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVOUkVTT0xWRURfSURFTlRJRklBQkxFX19NT0RFTDoKKwkJCQlzZXRNb2RlbCgoSWRlbnRpZmlhYmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoUGFja2FnZS5VTlJFU09MVkVEX0lERU5USUZJQUJMRV9fR1JBUEg6CisJCQkJc2V0R3JhcGgoKElkZW50aWZpYWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfX0lERU5USUZJQUJMRToKKwkJCQlzZXRJZGVudGlmaWFibGUoKElkZW50aWZpYWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfX1VOUkVTT0xWRURfVVJJOgorCQkJCXNldFVucmVzb2x2ZWRVUkkoKFVSSSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfX0ZJRUxEX05BTUU6CisJCQkJc2V0RmllbGROYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfX1NDRU5BUklPOgorCQkJCXNldFNjZW5hcmlvKChJZGVudGlmaWFibGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfX01PREVMOgorCQkJCXNldE1vZGVsKChJZGVudGlmaWFibGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfX0dSQVBIOgorCQkJCXNldEdyYXBoKChJZGVudGlmaWFibGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfX0lERU5USUZJQUJMRToKKwkJCQlzZXRJZGVudGlmaWFibGUoKElkZW50aWZpYWJsZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoUGFja2FnZS5VTlJFU09MVkVEX0lERU5USUZJQUJMRV9fVU5SRVNPTFZFRF9VUkk6CisJCQkJc2V0VW5yZXNvbHZlZFVSSShVTlJFU09MVkVEX1VSSV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfX0ZJRUxEX05BTUU6CisJCQkJc2V0RmllbGROYW1lKEZJRUxEX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVOUkVTT0xWRURfSURFTlRJRklBQkxFX19TQ0VOQVJJTzoKKwkJCQlyZXR1cm4gc2NlbmFyaW8gIT0gbnVsbDsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVOUkVTT0xWRURfSURFTlRJRklBQkxFX19NT0RFTDoKKwkJCQlyZXR1cm4gbW9kZWwgIT0gbnVsbDsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVOUkVTT0xWRURfSURFTlRJRklBQkxFX19HUkFQSDoKKwkJCQlyZXR1cm4gZ3JhcGggIT0gbnVsbDsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVOUkVTT0xWRURfSURFTlRJRklBQkxFX19JREVOVElGSUFCTEU6CisJCQkJcmV0dXJuIGlkZW50aWZpYWJsZSAhPSBudWxsOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfX1VOUkVTT0xWRURfVVJJOgorCQkJCXJldHVybiBVTlJFU09MVkVEX1VSSV9FREVGQVVMVCA9PSBudWxsID8gdW5yZXNvbHZlZFVSSSAhPSBudWxsIDogIVVOUkVTT0xWRURfVVJJX0VERUZBVUxULmVxdWFscyh1bnJlc29sdmVkVVJJKTsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVOUkVTT0xWRURfSURFTlRJRklBQkxFX19GSUVMRF9OQU1FOgorCQkJCXJldHVybiBGSUVMRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBmaWVsZE5hbWUgIT0gbnVsbCA6ICFGSUVMRF9OQU1FX0VERUZBVUxULmVxdWFscyhmaWVsZE5hbWUpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKQorCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJcmVzdWx0LmFwcGVuZChpZGVudGlmaWFibGUudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgdW5yZXNvbHZlZCBVUkk6ICIpOworCQlyZXN1bHQuYXBwZW5kKHVucmVzb2x2ZWRVUkkpOworCQlyZXN1bHQuYXBwZW5kKCIsIGZpZWxkTmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoZmllbGROYW1lKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0gLy8gdG9TdHJpbmcKKworfSAvLyBVbnJlc29sdmVkSWRlbnRpZmlhYmxlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJvdmlkZXIvRHluYW1pY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJvdmlkZXIvRHluYW1pY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NzY2ODgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcm92aWRlci9EeW5hbWljRWRnZUxhYmVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNFZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljRWRnZUxhYmVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEeW5hbWljRWRnZUxhYmVsSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBEeW5hbWljTGFiZWxJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRHluYW1pY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRFZGdlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFZGdlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkRWRnZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0VkZ2VMYWJlbF9lZGdlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VkZ2VMYWJlbF9lZGdlX2ZlYXR1cmUiLCAiX1VJX0VkZ2VMYWJlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIEdyYXBoUGFja2FnZS5MaXRlcmFscy5FREdFX0xBQkVMX19FREdFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgdHJ1ZSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKER5bmFtaWNFZGdlTGFiZWwpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9EeW5hbWljRWRnZUxhYmVsX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX0R5bmFtaWNFZGdlTGFiZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJvdmlkZXIvRHluYW1pY0xhYmVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcm92aWRlci9EeW5hbWljTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTg3ZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJvdmlkZXIvRHluYW1pY0xhYmVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNzQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbH0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRHluYW1pY0xhYmVsSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBMYWJlbEl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEeW5hbWljTGFiZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkTmV4dFZhbHVlVmFsaWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5leHQgVmFsdWUgVmFsaWQgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGROZXh0VmFsdWVWYWxpZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0R5bmFtaWNMYWJlbF9uZXh0VmFsdWVWYWxpZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EeW5hbWljTGFiZWxfbmV4dFZhbHVlVmFsaWRfZmVhdHVyZSIsICJfVUlfRHluYW1pY0xhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgR3JhcGhQYWNrYWdlLkxpdGVyYWxzLkRZTkFNSUNfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIER5bmFtaWNMYWJlbC5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvY3VzdG9tb2JqMTYvRHluYW1pY0xhYmVsIikpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisvLwkJVVJJIGxhYmVsVmFsdWUgPSAoKER5bmFtaWNMYWJlbClvYmplY3QpLmdldFVSSSgpOworLy8JCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisvLwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisvLwkJCWdldFN0cmluZygiX1VJX0R5bmFtaWNMYWJlbF90eXBlIikgOgorLy8JCQlnZXRTdHJpbmcoIl9VSV9EeW5hbWljTGFiZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7CisJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7CisJfSAvLyBnZXRUZXh0CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCS8vQE92ZXJyaWRlCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKER5bmFtaWNMYWJlbClvYmplY3QpLmdldFVSSSgpOworCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0R5bmFtaWNMYWJlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9EeW5hbWljTGFiZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEeW5hbWljTGFiZWwuY2xhc3MpKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5EWU5BTUlDX0xBQkVMX19ORVhUX1ZBTFVFX1ZBTElEOgorCQkJY2FzZSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19MQUJFTF9fTkVYVF9WQUxVRToKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJvdmlkZXIvRHluYW1pY05vZGVMYWJlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJvdmlkZXIvRHluYW1pY05vZGVMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZWM3OTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcm92aWRlci9EeW5hbWljTm9kZUxhYmVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNOb2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTm9kZUxhYmVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEeW5hbWljTm9kZUxhYmVsSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBEeW5hbWljTGFiZWxJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRHluYW1pY05vZGVMYWJlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGROb2RlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOb2RlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkTm9kZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX05vZGVMYWJlbF9ub2RlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX05vZGVMYWJlbF9ub2RlX2ZlYXR1cmUiLCAiX1VJX05vZGVMYWJlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIEdyYXBoUGFja2FnZS5MaXRlcmFscy5OT0RFX0xBQkVMX19OT0RFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgdHJ1ZSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKER5bmFtaWNOb2RlTGFiZWwpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9EeW5hbWljTm9kZUxhYmVsX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX0R5bmFtaWNOb2RlTGFiZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJvdmlkZXIvRWRnZUl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJvdmlkZXIvRWRnZUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3N2M2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcm92aWRlci9FZGdlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzMTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5JZGVudGlmaWFibGVJdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2V9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEVkZ2VJdGVtUHJvdmlkZXIKKwlleHRlbmRzIElkZW50aWZpYWJsZUl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZEFQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZE5vZGVBVVJJUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRCUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGROb2RlQlVSSVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkRGlyZWN0ZWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEEgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRBUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRWRnZV9hX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VkZ2VfYV9mZWF0dXJlIiwgIl9VSV9FZGdlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgR3JhcGhQYWNrYWdlLkxpdGVyYWxzLkVER0VfX0EsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSB0cnVlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5vZGUgQVVSSSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZE5vZGVBVVJJUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRWRnZV9ub2RlQVVSSV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FZGdlX25vZGVBVVJJX2ZlYXR1cmUiLCAiX1VJX0VkZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuRURHRV9fTk9ERV9BVVJJLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQiBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9FZGdlX2JfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWRnZV9iX2ZlYXR1cmUiLCAiX1VJX0VkZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuRURHRV9fQiwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIHRydWUsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTm9kZSBCVVJJIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkTm9kZUJVUklQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9FZGdlX25vZGVCVVJJX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VkZ2Vfbm9kZUJVUklfZmVhdHVyZSIsICJfVUlfRWRnZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIEdyYXBoUGFja2FnZS5MaXRlcmFscy5FREdFX19OT0RFX0JVUkksCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEaXJlY3RlZCBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZERpcmVjdGVkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRWRnZV9kaXJlY3RlZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FZGdlX2RpcmVjdGVkX2ZlYXR1cmUiLCAiX1VJX0VkZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuRURHRV9fRElSRUNURUQsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOworCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoR3JhcGhQYWNrYWdlLkxpdGVyYWxzLkVER0VfX0xBQkVMKTsKKwkJfQorCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKKwkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgorCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCisKKwkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgRWRnZS5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvY3VzdG9tb2JqMTYvRWRnZSIpKTsKKwl9IC8vIGdldEltYWdlCisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlmaW5hbCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGl0ZW1Qcm92aWRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgKKwkJCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOworCisJCWZpbmFsIEVkZ2UgZWRnZSA9IChFZGdlKW9iamVjdDsKKwkJZmluYWwgRWRnZUxhYmVsIGxhYmVsID0gZWRnZS5nZXRMYWJlbCgpOworCQkJCQorCQlpZiAobGFiZWw9PW51bGwpIHJldHVybiBnZXRUZXh0R2VuKG9iamVjdCk7CisJCWZpbmFsIElJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0oSUl0ZW1MYWJlbFByb3ZpZGVyKSBpdGVtUHJvdmlkZXJGYWN0b3J5LmFkYXB0KGxhYmVsLElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7CisJCS8vIERpZCB3ZSBmaW5kIGFuIGFkYXB0ZXI/CisJCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChsYWJlbCk7CisJCX0gLy8gaWYgCisJCXJldHVybiBnZXRUZXh0R2VuKG9iamVjdCk7CisJfSAvLyBnZXRUZXh0CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworLy8JQE92ZXJyaWRlCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKEVkZ2Upb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9FZGdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX0VkZ2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFZGdlLmNsYXNzKSkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRURHRV9fRElSRUNURUQ6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkVER0VfX0xBQkVMOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9IC8vIEVkZ2VJdGVtUHJvdmlkZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Byb3ZpZGVyL0VkZ2VMYWJlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJvdmlkZXIvRWRnZUxhYmVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFjODU4YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Byb3ZpZGVyL0VkZ2VMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbH0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRWRnZUxhYmVsSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBMYWJlbEl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGdlTGFiZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkRWRnZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRWRnZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEVkZ2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9FZGdlTGFiZWxfZWRnZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FZGdlTGFiZWxfZWRnZV9mZWF0dXJlIiwgIl9VSV9FZGdlTGFiZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuRURHRV9MQUJFTF9fRURHRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIHRydWUsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChFZGdlTGFiZWwpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9FZGdlTGFiZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfRWRnZUxhYmVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Byb3ZpZGVyL0dyYXBoRWRpdFBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJvdmlkZXIvR3JhcGhFZGl0UGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyMWVjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Byb3ZpZGVyL0dyYXBoRWRpdFBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5FTUZQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLkVjbGlwc2VVSVBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db21tb25FZGl0UGx1Z2luOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgR3JhcGggZWRpdG9yIHBsdWdpbi4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEdyYXBoRWRpdFBsdWdpbiBleHRlbmRzIEVNRlBsdWdpbiB7CisJLyoqCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgR3JhcGhFZGl0UGx1Z2luIElOU1RBTkNFID0gbmV3IEdyYXBoRWRpdFBsdWdpbigpOworCisJLyoqCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEdyYXBoRWRpdFBsdWdpbigpIHsKKwkJc3VwZXIKKwkJICAobmV3IFJlc291cmNlTG9jYXRvciBbXSB7CisJCSAgICAgQ29tbW9uRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJICAgfSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4geworCQkvKioKKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKKwkJCXN1cGVyKCk7CisKKwkJCS8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuCisJCQkvLworCQkJcGx1Z2luID0gdGhpczsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJvdmlkZXIvR3JhcGhJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Byb3ZpZGVyL0dyYXBoSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViMTBhNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Byb3ZpZGVyL0dyYXBoSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMDQ5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbldyYXBwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuU2V0Q29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db3JlRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLklkZW50aWZpYWJsZUl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWw7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxGYWN0b3J5OworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBofSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisgKiBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBHcmFwaEl0ZW1Qcm92aWRlciBleHRlbmRzIElkZW50aWZpYWJsZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKKworCS8qKgorCSAqIFRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIHRoZSB7QGxpbmsgVHJhbnNpZW50R3JhcGhJdGVtUHJvdmlkZXJ9J3MgdGhhdAorCSAqIGFyZSBwbGF5aW5nIHRoZSByb2xlIG9mIGNoaWxkcmVuIHRvIHRoZSBncmFwaCB3aGlsZSBpbiBmYWN0IHRoZXkgYXJlCisJICogIk5vbi1Nb2RlbGVkIEludGVybWVkaWFyeSBWaWV3IE9iamVjdHMiLiBUaGV5IHByb3ZpZGUgdGhlIGNvcnJlY3QgbWV0aG9kCisJICogaW1wbGVtZW50YXRpb25zIHRvIHBsYXkgdGhlIHJvbGUgb2YgYW4gSXRlbVByb3ZpZGVyLiBTZWUgcGFnZXMgMzY5LTM3OCBvZgorCSAqIHRoZSBFTUYgYm9vayAoMXN0IEVkaXRpb24pLgorCSAqLworCXByaXZhdGUgTGlzdDxHcmFwaEl0ZW1Qcm92aWRlci5UcmFuc2llbnRHcmFwaEl0ZW1Qcm92aWRlcj4gY2hpbGRyZW47CisKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHcmFwaEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCAKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZFRpbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb21tb24ucHJvdmlkZXIuSWRlbnRpZmlhYmxlSXRlbVByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCX0gLy8gZ2V0UGFyZW50CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CisJCWZpbmFsIEdyYXBoIGdyYXBoID0gKEdyYXBoKSBvYmplY3Q7CisJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxUcmFuc2llbnRHcmFwaEl0ZW1Qcm92aWRlcj4oKTsKKwkJLy8gVGhpcyBpcyB3aGVyZSB3ZSBhZGQgdGhlICJmYWtlIiBjaGlsZHJlbiBvZiBhIEdyYXBoLiBJZiB5b3UgaW1wbGVtZW50CisJCS8vIG1vcmUgdGhlbiBhZGQgdGhlbSBoZXJlLgorCisJCS8vIEFueSBFZGdlcyBpbiB0aGUgR3JhcGg/CisJCWlmIChncmFwaC5nZXROdW1FZGdlcygpID4gMCkgeworCQkJLy8gWWVzCisJCQljaGlsZHJlbi5hZGQobmV3IEdyYXBoSXRlbVByb3ZpZGVyLkVkZ2VzSXRlbVByb3ZpZGVyKAorCQkJCQlhZGFwdGVyRmFjdG9yeSwgZ3JhcGgpKTsKKwkJfSAvLyBpZiBFZGdlcworCisJCS8vIEFueSBOb2RlcyBpbiB0aGUgR3JhcGg/CisJCWlmIChncmFwaC5nZXROdW1Ob2RlcygpID4gMCkgeworCQkJLy8gWWVzCisJCQljaGlsZHJlbi5hZGQobmV3IEdyYXBoSXRlbVByb3ZpZGVyLk5vZGVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAorCQkJCQlncmFwaCkpOworCQl9IC8vIGlmIE5vZGVzCisJCQorCQkvLyBBbnkgTm9kZUxhYmVscyBpbiB0aGUgR3JhcGg/CisJCWlmIChncmFwaC5nZXROdW1Ob2RlTGFiZWxzKCkgPiAwKSB7CisJCQkvLyBZZXMKKwkJCWNoaWxkcmVuLmFkZChuZXcgR3JhcGhJdGVtUHJvdmlkZXIuTm9kZUxhYmVsc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKKwkJCQkJZ3JhcGgpKTsKKwkJfSAvLyBpZiBOb2RlTGFiZWxzCisJCQorCQkvLyBBbnkgR3JhcGhMYWJlbHMgaW4gdGhlIEdyYXBoPworCQlpZiAoZ3JhcGguZ2V0TnVtR3JhcGhMYWJlbHMoKSA+IDApIHsKKwkJCS8vIFllcworCQkJY2hpbGRyZW4uYWRkKG5ldyBHcmFwaEl0ZW1Qcm92aWRlci5HcmFwaExhYmVsc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKKwkJCQkJZ3JhcGgpKTsKKwkJfSAvLyBpZiBHcmFwaExhYmVscworCisJCWZpbmFsIENvbGxlY3Rpb24gb3RoZXJDaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7CisJCW90aGVyQ2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuKTsKKwkJcmV0dXJuIG90aGVyQ2hpbGRyZW47CisJfSAvLyBnZXRDaGlsZHJlbgorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRpbWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUaW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfR3JhcGhfdGltZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HcmFwaF90aW1lX2ZlYXR1cmUiLCAiX1VJX0dyYXBoX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgR3JhcGhQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX19USU1FLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIHRydWUsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOworCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoR3JhcGhQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX19VTlJFU09MVkVEX0lERU5USUZJQUJMRVMpOworCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoR3JhcGhQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX19ERUNPUkFUT1JTKTsKKwkJfQorCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7CisJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKKwkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgorCisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIEdyYXBoLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAorCQkJCSJmdWxsL2N1c3RvbW9iajE2L0dyYXBoIikpOworCX0gLy8gZ2V0SW1hZ2UKKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOworCX0gLy8gZ2V0VGV4dAorCQorCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisvLwlAT3ZlcnJpZGUKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlVUkkgbGFiZWxWYWx1ZSA9ICgoR3JhcGgpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0bworCSAqIHVwZGF0ZSBhbnkgY2FjaGVkIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoCisJICogaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEdyYXBoLmNsYXNzKSkgeworCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fTlVNX0VER0VTOgorCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fTlVNX05PREVTOgorCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fTlVNX0dSQVBIX0xBQkVMUzoKKwkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX05VTV9OT0RFX0xBQkVMUzoKKwkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX05VTV9EWU5BTUlDX0xBQkVMUzoKKwkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KKwkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQlyZXR1cm47CisJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19FREdFUzoKKwkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX05PREVTOgorCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fR1JBUEhfTEFCRUxTOgorCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fVU5SRVNPTFZFRF9JREVOVElGSUFCTEVTOgorCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fTk9ERV9MQUJFTFM6CisJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCisJCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCB0cnVlKSk7CisJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZEdlbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEdyYXBoLmNsYXNzKSkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX0VER0VTOgorCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX05PREVTOgorCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX0dSQVBIX0xBQkVMUzoKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19OT0RFX0xBQkVMUzoKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19OVU1fRURHRVM6CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fTlVNX05PREVTOgorCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX05VTV9HUkFQSF9MQUJFTFM6CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fTlVNX05PREVfTEFCRUxTOgorCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX05VTV9EWU5BTUlDX0xBQkVMUzoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX1VOUkVTT0xWRURfSURFTlRJRklBQkxFUzoKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19ERUNPUkFUT1JTOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIENvcmVFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7CisJCQlmb3IgKEl0ZXJhdG9yPFRyYW5zaWVudEdyYXBoSXRlbVByb3ZpZGVyPiBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisJCQkJKChJRGlzcG9zYWJsZSkgaXRlci5uZXh0KCkpLmRpc3Bvc2UoKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgZXh0ZW5kZWQgYnkgY2xhc3NlcyB0aGF0IGFyZSBpdGVtIHByb3ZpZGVycyBmb3IgIk5vbi1Nb2RlbAorCSAqIEludGVybWVkaWFyeSBWaWV3IE9iamVjdHMiLiBJdCBmb2xsb3dzIHRoZSBwYXR0ZXJuIGRlc2NyaWJlZCBpbiB0aGUgYm9vaworCSAqICJFY2xpcHNlIE1vZGVsaW5nIEZyYW1ld29yayIsIHBhZ2VzIDM2OS0zNzguCisJICogCisJICogVGhpcyBpcyBOT1QgYSBnZW5lcmF0ZWQgY2xhc3MuCisJICovCisJcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBUcmFuc2llbnRHcmFwaEl0ZW1Qcm92aWRlciBleHRlbmRzCisJCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQorCQkgKi8KKwkJcHVibGljIFRyYW5zaWVudEdyYXBoSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAorCQkJCWZpbmFsIEdyYXBoIGdyYXBoKSB7CisJCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJCQlncmFwaC5lQWRhcHRlcnMoKS5hZGQodGhpcyk7CisJCX0gLy8gVHJhbnNpZW50R3JhcGhJdGVtUHJvdmlkZXIKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKKwkJCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKKwkJCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7CisJCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoZ2V0TWFwUmVmZXJlbmNlKCkpOworCQkJfQorCQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7CisJCX0gLy8gZ2V0Q2hpbGRyZW5GZWF0dXJlcworCisJCQorCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEZlYXR1cmVWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKKwkJICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBPYmplY3QgZ2V0RmVhdHVyZVZhbHVlKEVPYmplY3Qgb2JqZWN0LAorCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCQlpZiAob2JqZWN0ID09IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQlyZXR1cm4gKChHcmFwaCkgdGFyZ2V0KS5lR2V0KGZlYXR1cmUpOworCQkJfSAvLyBpZgorCQkJZWxzZSB7CisJCQkJcmV0dXJuIHN1cGVyLmdldEZlYXR1cmVWYWx1ZShvYmplY3QsIGZlYXR1cmUpOworCQkJfQorCQl9IC8vIGdldEZlYXR1cmVWYWx1ZQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgeworCQkJcmV0dXJuIHRhcmdldDsKKwkJfSAvLyBnZXRQYXJlbnQKKworCQkvKioKKwkJICogVGhpcyBhc3N1bWVzIHRoYXQgYWxsIGNoaWxkcmVuIGFyZSBtZW1iZXJzIG9mIGEgbWFwIG9mIHtAbGluayBJZGVudGlmaWFibGV9cworCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBDb2xsZWN0aW9uPElkZW50aWZpYWJsZT4gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJZmluYWwgR3JhcGggZ3JhcGggPSAoR3JhcGgpIHRhcmdldDsKKwkJCWZpbmFsIExpc3Q8SWRlbnRpZmlhYmxlPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8SWRlbnRpZmlhYmxlPigpOworCQkJY2hpbGRyZW4uYWRkQWxsKCAgKGdldElkZW50aWZpYWJsZU1hcChncmFwaCkudmFsdWVzKCkpKTsKKy8vIFNFRCBjb21tZW50ZWQgb3V0IDcvMjMvMjAxMC4gSXQgdGFrZXMgYSBsb25nIHRpbWUgdG8gc29ydCB3aGVuIHRoZXJlJ3MgbG90cyBvZiBsYWJlbHMKKy8vCQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbik7CisJCQlyZXR1cm4gY2hpbGRyZW47CisJCX0gLy8gZ2V0Q2hpbGRyZW4KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGdldFRleHQoKSk7CisJCQlzYi5hcHBlbmQoIiAoIik7CisJCQlzYi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhnZXRJZGVudGlmaWFibGVNYXAoKEdyYXBoKSB0YXJnZXQpCisJCQkJCS5zaXplKCkpKTsKKwkJCXNiLmFwcGVuZCgiKSIpOworCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJCX0gLy8gZ2V0VGV4dAorCisJCS8qKgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmVhdHVyZVRleHQoT2JqZWN0IGZlYXR1cmUpIHsKKwkJCXJldHVybiBzdXBlci5nZXRGZWF0dXJlVGV4dCh0YXJnZXQpOworCQl9IC8vIGdldEZlYXR1cmVUZXh0CisKKwkJLyoqCisJCSAqIFRoaXMgcmVkaXJlY3RzIHRoZSBjYWxsIHRvIHRoZSAidGFyZ2V0IiAoaS5lLiwgdGhlIEdyYXBoKSwgaXQgdGhlbgorCQkgKiByZXR1cm5zIHRoZSBjaGlsZCBkZXNjcmlwdG9ycyB3aGljaCB3b3VsZCBpbmNsdWRlIHRoZSBUcmFuc2llbnQgR3JhcGgKKwkJICogSXRlbSBwcm92aWRlcnMgc3VjaCBhcyB0aGlzIG9uZS4KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCisJCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgeworCQkJcmV0dXJuIHN1cGVyLmdldE5ld0NoaWxkRGVzY3JpcHRvcnModGFyZ2V0LCBlZGl0aW5nRG9tYWluLCBzaWJsaW5nKTsKKwkJfSAvLyBnZXROZXdDaGlsZERlc2NyaXB0b3JzCisKKwkJLyoqCisJCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQkJcmV0dXJuIEdyYXBoRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwkJfQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBUcmFuc2llbnQgR3JhcGggSXRlbSBQcm92aWRlci4gKGUuZy4sCisJCSAqICAgICAgICAgIkVkZ2VzIikKKwkJICovCisJCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmcgZ2V0VGV4dCgpOworCisJCS8qKgorCQkgKiBAcGFyYW0gZ3JhcGgKKwkJICogICAgICAgICAgICB0aGUgZ3JhcGggdGhhdCB3aWxsIGhhdmUgYSBjaGlsZCBhZGRlZCB0byBpdC4KKwkJICogQHJldHVybiB0aGUgbWFwIG9mIDxjb2RlPklkZW50aWZpYWJsZTwvY29kZT5zIHRoYXQgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKwkJICogICAgICAgICBpdGVtIHByb3ZpZGVyLgorCQkgKi8KKwkJYWJzdHJhY3QgcHJvdGVjdGVkIEVNYXA8VVJJLD8gZXh0ZW5kcyBJZGVudGlmaWFibGU+IGdldElkZW50aWZpYWJsZU1hcChHcmFwaCBncmFwaCk7CisKKwkJLyoqCisJCSAqIENyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgbWFwIGVudHJ5IHRvIGFkZCB0byB0aGUgbWFwLgorCQkgKiAKKwkJICogQHBhcmFtIGtleQorCQkgKiAgICAgICAgICAgIHRoZSBVUkkgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZQorCQkgKiAgICAgICAgICAgIDxjb2RlPklkZW50aWZpYWJsZTwvY29kZT4KKwkJICogQHBhcmFtIHZhbHVlCisJCSAqICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBtYXAgZW50cnkKKwkJICogQHJldHVybiBhIE1hcEVudHJ5IGluc3RhbmNlCisJCSAqLworCQlhYnN0cmFjdCBwcm90ZWN0ZWQgRU9iamVjdCBnZXRNYXBFbnRyeShmaW5hbCBVUkkga2V5LAorCQkJCWZpbmFsIElkZW50aWZpYWJsZSB2YWx1ZSk7CisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIFN0cnVjdHVyYWxGZWF0dXJlIHRoYXQgcmVwcmVzZW50cyB0aGUgInZhbHVlIiBvZiB0aGUgTWFwRW50cnkKKwkJICovCisJCWFic3RyYWN0ICBwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1hcEVudHJ5VmFsdWVFUmVmZXJlbmNlKCk7CisJCQorCQkvKioKKwkJICogQHJldHVybiB0aGUgbWV0YS1yZWZlcmVuY2UgdG8gdGhlIGZlYXR1cmUgb2YgdGhlIGdyYXBoIHRoYXQgaXMgdGhlCisJCSAqICAgICAgICAgbWFwCisJCSAqLworCQlhYnN0cmFjdCBwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRNYXBSZWZlcmVuY2UoKTsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZVJlbW92ZUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCisJCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCisJCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS51dGlsLkNvbGxlY3Rpb24pCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlUmVtb3ZlQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKKwkJCQlFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisJCQlyZXR1cm4gY3JlYXRlV3JhcHBlZENvbW1hbmQoc3VwZXIuY3JlYXRlUmVtb3ZlQ29tbWFuZChkb21haW4sCisJCQkJCW93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uKSwgb3duZXIpOworCQl9IC8vIGNyZWF0ZVJlbW92ZUNvbW1hbmQKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUFkZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCisJCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCisJCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS51dGlsLkNvbGxlY3Rpb24sCisJCSAqICAgICAgaW50KQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCisJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7CisJCQlyZXR1cm4gY3JlYXRlV3JhcHBlZENvbW1hbmQoc3VwZXIuY3JlYXRlQWRkQ29tbWFuZChkb21haW4sIG93bmVyLAorCQkJCQlmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCksIG93bmVyKTsKKwkJfSAvLyBjcmVhdGVBZGRDb21tYW5kCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCisJCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgZmxvYXQsIGludCwgaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCisJCQkJT2JqZWN0IG93bmVyLCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sCisJCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisJCQlDb21tYW5kIHJldFZhbHVlID0gbnVsbDsKKwkJCWlmIChuZXcgQWRkQ29tbWFuZChkb21haW4sIChFT2JqZWN0KSB0YXJnZXQsIGdldE1hcFJlZmVyZW5jZSgpLAorCQkJCQljb2xsZWN0aW9uKS5jYW5FeGVjdXRlKCkpIHsKKwkJCQlyZXRWYWx1ZSA9IHN1cGVyLmNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIHRhcmdldCwKKwkJCQkJCWxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pOworCQkJfSBlbHNlIHsKKwkJCQlyZXRWYWx1ZSA9IFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7CisJCQl9CisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kCisKKwkJLyoqCisJCSAqIENyZWF0ZSBhIENyZWF0ZUNoaWxkQ29tbWFuZC4gSXQgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSBpZiBhIGNoaWxkCisJCSAqIGNhbiBiZSBhZGRlZC4gSWYgImNhbkV4ZWN1dGUiIGlzIGZhbHNlLCB0aGVuIHRoZSBtZW51IGVudHJ5IHdpbGwgYmUKKwkJICogZ3JheWVkIG91dC4KKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCisJCQkJRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwKKwkJCQlpbnQgaW5kZXgsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgeworCisJCQlDb21tYW5kIHJldFZhbHVlID0gbnVsbDsKKworCQkJLy8gSXMgdGhlIGNoaWxkIGFuIElkZW50aWZpYWJsZT8KKwkJCWlmICghKHZhbHVlIGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlKSkgeworCQkJCS8vIE5vCisJCQkJcmV0VmFsdWUgPSBzdXBlci5jcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQoZG9tYWluLCBvd25lciwKKwkJCQkJCWZlYXR1cmUsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7CisJCQl9IGVsc2UgeworCQkJCS8vIFllcworCQkJCXJldFZhbHVlID0gbmV3IENyZWF0ZUNoaWxkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLAorCQkJCQkJdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uLCB0aGlzKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDb21tYW5kKCkgeworCisJCQkJCQlDb21tYW5kIHJlc3VsdCA9IG51bGw7CisKKwkJCQkJCUdyYXBoIGdyYXBoID0gKEdyYXBoKSB0YXJnZXQ7CisJCQkJCQlJZGVudGlmaWFibGUgbmV3Q2hpbGRJZGVudGlmaWFibGUgPSAoSWRlbnRpZmlhYmxlKSBjaGlsZDsKKwkJCQkJCWZpbmFsIFVSSSB1cmkgPSBuZXdDaGlsZElkZW50aWZpYWJsZS5nZXRVUkkoKTsKKworCQkJCQkJLy8gRG9lcyB0aGUgRWRnZSBNYXAgYWxyZWFkeSBjb250YWluIGFuIGVudHJ5IGZvciB0aGUKKwkJCQkJCS8vIGVkZ2UncyBVUkk/CisJCQkJCQlJZGVudGlmaWFibGUgZXhpc3RpbmdJZGVudGlmaWFibGUgPSBnZXRJZGVudGlmaWFibGVNYXAoCisJCQkJCQkJCWdyYXBoKS5nZXQodXJpKTsKKworCQkJCQkJaWYgKGV4aXN0aW5nSWRlbnRpZmlhYmxlID09IG51bGwpIHsKKwkJCQkJCQkvLyBObworCQkJCQkJCS8vIFRoZXJlIGlzbid0IGFuIGV4aXN0aW5nIGVudHJ5LiBOZWVkIHRvIGNyZWF0ZSBhCisJCQkJCQkJLy8gbWFwIGVudHJ5IGFuZCBpbml0aWFsaXplIGl0LgorCQkJCQkJCWZpbmFsIEVPYmplY3QgbWFwRW50cnkgPSBnZXRNYXBFbnRyeSh1cmksCisJCQkJCQkJCQluZXdDaGlsZElkZW50aWZpYWJsZSk7CisKKwkJCQkJCQkvLyBOb3csIHdlIG5lZWQgdG8gcHV0IHRoZSBlbnRyeSB3ZSBqdXN0IGNyZWF0ZWQKKwkJCQkJCQkvLyBpbnRvIHRoZSBtYXAKKwkJCQkJCQlyZXN1bHQgPSBuZXcgQWRkQ29tbWFuZChkb21haW4sIGdyYXBoLAorCQkJCQkJCQkJZ2V0TWFwUmVmZXJlbmNlKCksIG1hcEVudHJ5KTsKKworCQkJCQkJfSAvLyBpZiBubyBleGlzdGluZyBlbnRyeQorCQkJCQkJZWxzZSB7CisJCQkJCQkJLy8gWWVzCisJCQkJCQkJLy8gRXhpc3RpbmcgbGFiZWwgd2l0aCB0aGUgc2FtZSBVUkkgYXMgdGhlIG9uZSB0byBiZQorCQkJCQkJCS8vIGFkZGVkLiBDcmVhdGUgdGhlIGNvbW1hbmQgdGhhdCB3aWxsIHNldCB0aGUgdmFsdWUKKwkJCQkJCQkvLyB0byB0aGUgbmV3IGxhYmVsCisJCQkJCQkJZmluYWwgRU9iamVjdCBtYXBFbnRyeSA9IGV4aXN0aW5nSWRlbnRpZmlhYmxlCisJCQkJCQkJCQkuZUNvbnRhaW5lcigpOworCQkJCQkJCXJlc3VsdCA9IG5ldyBTZXRDb21tYW5kKAorCQkJCQkJCQkJZG9tYWluLAorCQkJCQkJCQkJbWFwRW50cnksIAorCQkJCQkJCQkJZ2V0TWFwRW50cnlWYWx1ZUVSZWZlcmVuY2UoKSwKKwkJCQkJCQkJCW5ld0NoaWxkSWRlbnRpZmlhYmxlKTsKKwkJCQkJCX0gLy8gZWxzZQorCQkJCQkJCisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9IC8vIGNyZWF0ZUNvbW1hbmQKKworCQkJCQkKKwkJCQl9OyAvLyBDcmVhdGVDaGlsZENvbW1hbmQKKworCQkJfSAvLyBlbHNlCisJCQlyZXR1cm4gcmV0VmFsdWU7CisKKwkJfSAvLyBjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQKKworCQkvKioKKwkJICogCisJCSAqIEBwYXJhbSBjb21tYW5kCisJCSAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgdG8gYmUgd3JhcHBlZAorCQkgKiBAcGFyYW0gb3duZXIKKwkJICogICAgICAgICAgICB0aGUgb3duZXIKKwkJICogQHJldHVybgorCQkgKi8KKwkJcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlV3JhcHBlZENvbW1hbmQoQ29tbWFuZCBjb21tYW5kLAorCQkJCWZpbmFsIEVPYmplY3Qgb3duZXIpIHsKKwkJCXJldHVybiBuZXcgQ29tbWFuZFdyYXBwZXIoY29tbWFuZCkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldEFmZmVjdGVkT2JqZWN0cygpIHsKKwkJCQkJQ29sbGVjdGlvbjw/PiBhZmZlY3RlZCA9IHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOworCQkJCQlpZiAoYWZmZWN0ZWQuY29udGFpbnMob3duZXIpKSB7CisJCQkJCQlhZmZlY3RlZCA9IENvbGxlY3Rpb25zCisJCQkJCQkJCS5zaW5nbGV0b24oVHJhbnNpZW50R3JhcGhJdGVtUHJvdmlkZXIudGhpcyk7CisJCQkJCX0KKwkJCQkJcmV0dXJuIGFmZmVjdGVkOworCQkJCX0gLy8gZ2V0QWZmZWN0ZWRPYmplY3RzCisJCQl9OworCQl9IC8vIGNyZWF0ZVdyYXBwZWRDb21tYW5kCisKKwl9IC8vIFRyYW5zaWVudEdyYXBoSXRlbVByb3ZpZGVyCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSAiTm9uLU1vZGVsIEludGVybWVkaWFyeSBWaWV3IE9iamVjdCIuIEl0CisJICogcmVwcmVzZW50cyB0aGUgIkVkZ2VzIiBvZiB0aGUgZ3JhcGguCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBFZGdlc0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudEdyYXBoSXRlbVByb3ZpZGVyIHsKKworCQkvKioKKwkJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5CisJCSAqIEBwYXJhbSBncmFwaAorCQkgKiAgICAgICAgICAgIHRoZSBncmFwaCB0aGF0IHRoZSBFZGdlcyBiZWxvbmcgdG8KKwkJICovCisJCXB1YmxpYyBFZGdlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgR3JhcGggZ3JhcGgpIHsKKwkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBncmFwaCk7CisJCX0gLy8gRWRnZXNJdGVtUHJvdmlkZXIKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCisJCQkJCSJmdWxsL2N1c3RvbW9iajE2L0VkZ2UiKSk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgeworCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKEdyYXBoLmNsYXNzKSkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX0VER0VTOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBOb3RpZmljYXRpb25XcmFwcGVyKHRoaXMsIG1zZykpOworCQkJCXJldHVybjsKKwkJCX0gLy8gc3dpdGNoCisJCX0gLy8gbm90aWZ5Q2hhbmdlZAorCisJCS8qKgorCQkgKiBUaGlzIGRldGVybWluZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0IG9mICJjaGlsZHJlbiIgdGhhdCBjYW4gYmUKKwkJICogYWRkZWQgdG8gdGhlIEVkZ2VzLiBXZSBtb2RpZnkKKwkJICoge0BsaW5rIEdyYXBoSXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24sIE9iamVjdCl9CisJCSAqIHNvIHRoYXQgaXQgZG9lc24ndCByZXR1cm4gIkVkZ2VzIiBhcyBhbiBvcHRpb24gdG8gYmUgY3JlYXRlZCB1bmRlcgorCQkgKiBHcmFwaC4gT2YgdGhvc2UgY2hpbGRyZW4sIHRoaXMgaXMgd2hlcmUgd2UgY3JlYXRlICJFZGdlcyIuCisJCSAqIAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCisJCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKKwkJCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwkJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEdyYXBoUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJLmdldEdyYXBoX0VkZ2VzKCksIEdyYXBoRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRWRnZSgpKSk7CisJCX0gLy8gY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMKKworCQkvKioKKwkJICogQHNlZSBUcmFuc2llbnRHcmFwaEl0ZW1Qcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIFN0cmluZyBnZXRUZXh0KCkgeworCQkJLy8gVE9ETyBOTFMgIkVkZ2VzIgorCQkJcmV0dXJuICJFZGdlcyI7CisJCX0gLy8gZ2V0VGV4dAorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGgucHJvdmlkZXIuVHJhbnNpZW50R3JhcGhJdGVtUHJvdmlkZXIjZ2V0SWRlbnRpZmlhYmxlTWFwKG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGguR3JhcGgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEVNYXA8VVJJLEVkZ2U+IGdldElkZW50aWZpYWJsZU1hcChHcmFwaCBncmFwaCkgeworCQkJcmV0dXJuIGdyYXBoLmdldEVkZ2VzKCk7CisJCX0gLy8gZ2V0SWRlbnRpZmlhYmxlTWFwCisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBFT2JqZWN0IGdldE1hcEVudHJ5KFVSSSBrZXksIElkZW50aWZpYWJsZSB2YWx1ZSkgeworCisJCQkvLyBVc2UgcmVmbGVjdGlvbiBzaW5jZQorCQkJLy8gdGhlcmUgaXMgbm8gZ2VuZXJhdGVkIEFQSSBmb3IgbWFwIGVudHJpZXMuCisJCQlmaW5hbCBFT2JqZWN0IHJldFZhbHVlID0gR3JhcGhGYWN0b3J5LmVJTlNUQU5DRQorCQkJCQkuY3JlYXRlKEdyYXBoUGFja2FnZS5MaXRlcmFscy5VUklfVE9fRURHRV9NQVBfRU5UUlkpOworCQkJcmV0VmFsdWUKKwkJCQkJLmVTZXQoR3JhcGhQYWNrYWdlLkxpdGVyYWxzLlVSSV9UT19FREdFX01BUF9FTlRSWV9fS0VZLCBrZXkpOworCQkJcmV0VmFsdWUuZVNldChHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuVVJJX1RPX0VER0VfTUFQX0VOVFJZX19WQUxVRSwKKwkJCQkJdmFsdWUpOworCQkJcmV0dXJuIHJldFZhbHVlOworCisJCX0gLy8gZ2V0TWFwRW50cnkKKwkJCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1hcEVudHJ5VmFsdWVFUmVmZXJlbmNlKCkgeworCQkJcmV0dXJuIEdyYXBoUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VVJJVG9FZGdlTWFwRW50cnlfVmFsdWUoKTsKKwkJfSAvLyBnZXRNYXBFbnRyeVZhbHVlRVJlZmVyZW5jZQorCQkKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoLnByb3ZpZGVyLlRyYW5zaWVudEdyYXBoSXRlbVByb3ZpZGVyI2dldE1hcFJlZmVyZW5jZSgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0TWFwUmVmZXJlbmNlKCkgeworCQkJcmV0dXJuIEdyYXBoUGFja2FnZS5MaXRlcmFscy5HUkFQSF9fRURHRVM7CisJCX0gLy8gZ2V0TWFwUmVmZXJlbmNlCisKKwl9IC8vIEVkZ2VzSXRlbVByb3ZpZGVyCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSAiTm9uLU1vZGVsIEludGVybWVkaWFyeSBWaWV3IE9iamVjdCIuIEl0CisJICogcmVwcmVzZW50cyB0aGUgIk5vZGVzIiBvZiB0aGUgZ3JhcGguCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBOb2Rlc0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudEdyYXBoSXRlbVByb3ZpZGVyIHsKKworCQkvKioKKwkJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5CisJCSAqIEBwYXJhbSBncmFwaAorCQkgKi8KKwkJcHVibGljIE5vZGVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBHcmFwaCBncmFwaCkgeworCQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGdyYXBoKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKKwkJCQkJImZ1bGwvY3VzdG9tb2JqMTYvTm9kZSIpKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7CisJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoR3JhcGguY2xhc3MpKSB7CisJCQljYXNlIEdyYXBoUGFja2FnZS5HUkFQSF9fTk9ERVM6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IE5vdGlmaWNhdGlvbldyYXBwZXIodGhpcywgbXNnKSk7CisJCQkJcmV0dXJuOworCQkJfSAvLyBzd2l0Y2gKKwkJfSAvLyBub3RpZnlDaGFuZ2VkCisKKwkJLyoqCisJCSAqIFRoaXMgZGV0ZXJtaW5lcyB0aGUgY29udGVudHMgb2YgdGhlIGxpc3Qgb2YgImNoaWxkcmVuIiB0aGF0IGNhbiBiZQorCQkgKiBhZGRlZCB0byB0aGUgTm9kZXMuIFdlIG1vZGlmeQorCQkgKiB7QGxpbmsgR3JhcGhJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiwgT2JqZWN0KX0KKwkJICogc28gdGhhdCBpdCBkb2Vzbid0IHJldHVybiAiTm9kZXMiIGFzIGFuIG9wdGlvbiB0byBiZSBjcmVhdGVkIHVuZGVyCisJCSAqIEdyYXBoLiBPZiB0aG9zZSBjaGlsZHJlbiwgdGhpcyBpcyB3aGVyZSB3ZSBjcmVhdGUgIk5vZGVzIi4KKwkJICogCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKKwkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAorCQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoR3JhcGhQYWNrYWdlLmVJTlNUQU5DRQorCQkJCQkuZ2V0R3JhcGhfTm9kZXMoKSwgR3JhcGhGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVOb2RlKCkpKTsKKwkJfSAvLyBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycworCisJCS8qKgorCQkgKiBAc2VlIFRyYW5zaWVudEdyYXBoSXRlbVByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRleHQoKSB7CisJCQkvLyBUT0RPIE5MUyAiTm9kZXMiCisJCQlyZXR1cm4gIk5vZGVzIjsKKwkJfSAvLyBnZXRUZXh0CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaC5wcm92aWRlci5HcmFwaEl0ZW1Qcm92aWRlci5UcmFuc2llbnRHcmFwaEl0ZW1Qcm92aWRlciNnZXRJZGVudGlmaWFibGVNYXAob3JnLmVjbGlwc2Uuc3RlbS5ncmFwaC5HcmFwaCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgRU1hcDxVUkksTm9kZT4gZ2V0SWRlbnRpZmlhYmxlTWFwKEdyYXBoIGdyYXBoKSB7CisJCQlyZXR1cm4gZ3JhcGguZ2V0Tm9kZXMoKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRNYXBFbnRyeShVUkkga2V5LCBJZGVudGlmaWFibGUgdmFsdWUpIHsKKworCQkJLy8gVXNlIHJlZmxlY3Rpb24gc2luY2UKKwkJCS8vIHRoZXJlIGlzIG5vIGdlbmVyYXRlZCBBUEkgZm9yIG1hcCBlbnRyaWVzLgorCQkJZmluYWwgRU9iamVjdCByZXRWYWx1ZSA9IEdyYXBoRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJLmNyZWF0ZShHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuVVJJX1RPX05PREVfTUFQX0VOVFJZKTsKKwkJCXJldFZhbHVlCisJCQkJCS5lU2V0KEdyYXBoUGFja2FnZS5MaXRlcmFscy5VUklfVE9fTk9ERV9NQVBfRU5UUllfX0tFWSwga2V5KTsKKwkJCXJldFZhbHVlLmVTZXQoR3JhcGhQYWNrYWdlLkxpdGVyYWxzLlVSSV9UT19OT0RFX01BUF9FTlRSWV9fVkFMVUUsCisJCQkJCXZhbHVlKTsKKwkJCXJldHVybiByZXRWYWx1ZTsKKworCQl9IC8vIGdldE1hcEVudHJ5CisJCQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNYXBFbnRyeVZhbHVlRVJlZmVyZW5jZSgpIHsKKwkJCXJldHVybiBHcmFwaFBhY2thZ2UuZUlOU1RBTkNFLmdldFVSSVRvTm9kZU1hcEVudHJ5X1ZhbHVlKCk7CisJCX0gLy8gZ2V0TWFwRW50cnlWYWx1ZUVSZWZlcmVuY2UKKwkJCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGgucHJvdmlkZXIuR3JhcGhJdGVtUHJvdmlkZXIuVHJhbnNpZW50R3JhcGhJdGVtUHJvdmlkZXIjZ2V0TWFwUmVmZXJlbmNlKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRNYXBSZWZlcmVuY2UoKSB7CisJCQlyZXR1cm4gR3JhcGhQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX19OT0RFUzsKKwkJfQorCisJfSAvLyBOb2Rlc0l0ZW1Qcm92aWRlcgorCisJLyoqCisJICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgIk5vbi1Nb2RlbCBJbnRlcm1lZGlhcnkgVmlldyBPYmplY3QiLiBJdAorCSAqIHJlcHJlc2VudHMgdGhlICJOb2RlIExhYmVscyIgb2YgdGhlIGdyYXBoLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTm9kZUxhYmVsc0l0ZW1Qcm92aWRlciBleHRlbmRzCisJCQlUcmFuc2llbnRHcmFwaEl0ZW1Qcm92aWRlciB7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQorCQkgKiBAcGFyYW0gZ3JhcGgKKwkJICovCisJCXB1YmxpYyBOb2RlTGFiZWxzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBHcmFwaCBncmFwaCkgeworCQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGdyYXBoKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKKwkJCQkJImZ1bGwvY3VzdG9tb2JqMTYvU3RhdGljTGFiZWwiKSk7CisJCX0gLy8gZ2V0SW1hZ2UKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgeworCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKEdyYXBoLmNsYXNzKSkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuR1JBUEhfX05PREVfTEFCRUxTOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBOb3RpZmljYXRpb25XcmFwcGVyKHRoaXMsIG1zZykpOworCQkJCXJldHVybjsKKwkJCX0gLy8gc3dpdGNoCisJCX0gLy8gbm90aWZ5Q2hhbmdlZAorCisJCS8qKgorCQkgKiBUaGlzIGRldGVybWluZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0IG9mICJjaGlsZHJlbiIgdGhhdCBjYW4gYmUKKwkJICogYWRkZWQgdG8gdGhlIE5vZGUgTGFiZWxzLiBXZSBtb2RpZnkKKwkJICoge0BsaW5rIEdyYXBoSXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24sIE9iamVjdCl9CisJCSAqIHNvIHRoYXQgaXQgZG9lc24ndCByZXR1cm4gIk5vZGUgTGFiZWxzIiBhcyBhbiBvcHRpb24gdG8gYmUgY3JlYXRlZAorCQkgKiB1bmRlciBHcmFwaC4gT2YgdGhvc2UgY2hpbGRyZW4sIHRoaXMgaXMgd2hlcmUgd2UgY3JlYXRlICJOb2RlCisJCSAqIExhYmVscyIuCisJCSAqIAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCisJCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKKwkJCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKy8vCQkJIFRPRE8gZml4IEdyYXBoSXRlblByb3ZpZGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzCisvLwkJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEdyYXBoUGFja2FnZS5lSU5TVEFOQ0UKKy8vCQkJCQkuZ2V0R3JhcGhfTm9kZUxhYmVscygpLCBHcmFwaEZhY3RvcnkuZUlOU1RBTkNFCisvLwkJCQkJLmNyZWF0ZUxhYmVsKCkpKTsKKwkJfSAvLyBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycworCisJCS8qKgorCQkgKiBAc2VlIFRyYW5zaWVudEdyYXBoSXRlbVByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRleHQoKSB7CisJCQkvLyBUT0RPIE5MUyAiTm9kZSBMYWJlbHMiCisJCQlyZXR1cm4gIk5vZGUgTGFiZWxzIjsKKwkJfSAvLyBnZXRUZXh0CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaC5wcm92aWRlci5HcmFwaEl0ZW1Qcm92aWRlci5UcmFuc2llbnRHcmFwaEl0ZW1Qcm92aWRlciNnZXRJZGVudGlmaWFibGVNYXAob3JnLmVjbGlwc2Uuc3RlbS5ncmFwaC5HcmFwaCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgRU1hcDxVUkksTm9kZUxhYmVsPiBnZXRJZGVudGlmaWFibGVNYXAoR3JhcGggZ3JhcGgpIHsKKwkJCXJldHVybiBncmFwaC5nZXROb2RlTGFiZWxzKCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0TWFwRW50cnkoVVJJIGtleSwgSWRlbnRpZmlhYmxlIHZhbHVlKSB7CisKKwkJCS8vIFVzZSByZWZsZWN0aW9uIHNpbmNlCisJCQkvLyB0aGVyZSBpcyBubyBnZW5lcmF0ZWQgQVBJIGZvciBtYXAgZW50cmllcy4KKwkJCWZpbmFsIEVPYmplY3QgcmV0VmFsdWUgPSBHcmFwaEZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCS5jcmVhdGUoR3JhcGhQYWNrYWdlLkxpdGVyYWxzLlVSSV9UT19OT0RFX0xBQkVMX01BUF9FTlRSWSk7CisJCQlyZXRWYWx1ZQorCQkJCQkuZVNldChHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuVVJJX1RPX05PREVfTEFCRUxfTUFQX0VOVFJZX19LRVksIGtleSk7CisJCQlyZXRWYWx1ZS5lU2V0KEdyYXBoUGFja2FnZS5MaXRlcmFscy5VUklfVE9fTk9ERV9MQUJFTF9NQVBfRU5UUllfX1ZBTFVFLAorCQkJCQl2YWx1ZSk7CisJCQlyZXR1cm4gcmV0VmFsdWU7CisKKwkJfSAvLyBnZXRNYXBFbnRyeQorCQkKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TWFwRW50cnlWYWx1ZUVSZWZlcmVuY2UoKSB7CisJCQlyZXR1cm4gR3JhcGhQYWNrYWdlLmVJTlNUQU5DRS5nZXRVUklUb05vZGVMYWJlbE1hcEVudHJ5X1ZhbHVlKCk7CisJCX0gLy8gZ2V0TWFwRW50cnlWYWx1ZUVSZWZlcmVuY2UKKwkJCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGgucHJvdmlkZXIuR3JhcGhJdGVtUHJvdmlkZXIuVHJhbnNpZW50R3JhcGhJdGVtUHJvdmlkZXIjZ2V0TWFwUmVmZXJlbmNlKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRNYXBSZWZlcmVuY2UoKSB7CisJCQlyZXR1cm4gR3JhcGhQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX19OT0RFX0xBQkVMUzsKKwkJfQorCisJfSAvLyBOb2RlTGFiZWxzSXRlbVByb3ZpZGVyCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSAiTm9uLU1vZGVsIEludGVybWVkaWFyeSBWaWV3IE9iamVjdCIuIEl0CisJICogcmVwcmVzZW50cyB0aGUgIkdyYXBoIExhYmVscyIgb2YgdGhlIGdyYXBoLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgR3JhcGhMYWJlbHNJdGVtUHJvdmlkZXIgZXh0ZW5kcworCQkJVHJhbnNpZW50R3JhcGhJdGVtUHJvdmlkZXIgeworCisJCS8qKgorCQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKKwkJICogQHBhcmFtIGdyYXBoCisJCSAqLworCQlwdWJsaWMgR3JhcGhMYWJlbHNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCisJCQkJR3JhcGggZ3JhcGgpIHsKKwkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBncmFwaCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCisJCQkJCSJmdWxsL2N1c3RvbW9iajE2L1N0YXRpY0xhYmVsIikpOworCQl9IC8vIGdldEltYWdlCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKKwkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChHcmFwaC5jbGFzcykpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIX19HUkFQSF9MQUJFTFM6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IE5vdGlmaWNhdGlvbldyYXBwZXIodGhpcywgbXNnKSk7CisJCQkJcmV0dXJuOworCQkJfSAvLyBzd2l0Y2gKKwkJfSAvLyBub3RpZnlDaGFuZ2VkCisKKwkJLyoqCisJCSAqIFRoaXMgZGV0ZXJtaW5lcyB0aGUgY29udGVudHMgb2YgdGhlIGxpc3Qgb2YgImNoaWxkcmVuIiB0aGF0IGNhbiBiZQorCQkgKiBhZGRlZCB0byB0aGUgR3JhcGggTGFiZWxzLiBXZSBtb2RpZnkKKwkJICoge0BsaW5rIEdyYXBoSXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24sIE9iamVjdCl9CisJCSAqIHNvIHRoYXQgaXQgZG9lc24ndCByZXR1cm4gIkdyYXBoIExhYmVscyIgYXMgYW4gb3B0aW9uIHRvIGJlIGNyZWF0ZWQKKwkJICogdW5kZXIgR3JhcGguIE9mIHRob3NlIGNoaWxkcmVuLCB0aGlzIGlzIHdoZXJlIHdlIGNyZWF0ZSAiR3JhcGgKKwkJICogTGFiZWxzIi4KKwkJICogCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKKwkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAorCQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCQkJCisvLwkJCSBUT0RPIGZpeCBHcmFwaExhYmVsc0l0ZW1Qcm92aWRlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycworLy8JCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihHcmFwaFBhY2thZ2UuZUlOU1RBTkNFCisvLwkJCQkJLmdldEdyYXBoX0dyYXBoTGFiZWxzKCksIEdyYXBoRmFjdG9yeS5lSU5TVEFOQ0UKKy8vCQkJCQkuY3JlYXRlTGFiZWwoKSkpOworCQl9IC8vIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzCisKKwkJLyoqCisJCSAqIEBzZWUgVHJhbnNpZW50R3JhcGhJdGVtUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJCS8vIFRPRE8gTkxTICJHcmFwaExhYmVscyIKKwkJCXJldHVybiAiR3JhcGggTGFiZWxzIjsKKwkJfSAvLyBnZXRUZXh0CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaC5wcm92aWRlci5HcmFwaEl0ZW1Qcm92aWRlci5UcmFuc2llbnRHcmFwaEl0ZW1Qcm92aWRlciNnZXRJZGVudGlmaWFibGVNYXAob3JnLmVjbGlwc2Uuc3RlbS5ncmFwaC5HcmFwaCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgRU1hcDxVUkksTGFiZWw+IGdldElkZW50aWZpYWJsZU1hcChHcmFwaCBncmFwaCkgeworCQkJcmV0dXJuIGdyYXBoLmdldEdyYXBoTGFiZWxzKCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0TWFwRW50cnkoVVJJIGtleSwgSWRlbnRpZmlhYmxlIHZhbHVlKSB7CisKKwkJCS8vIFVzZSByZWZsZWN0aW9uIHNpbmNlCisJCQkvLyB0aGVyZSBpcyBubyBnZW5lcmF0ZWQgQVBJIGZvciBtYXAgZW50cmllcy4KKwkJCWZpbmFsIEVPYmplY3QgcmV0VmFsdWUgPSBHcmFwaEZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCS5jcmVhdGUoR3JhcGhQYWNrYWdlLkxpdGVyYWxzLlVSSV9UT19MQUJFTF9NQVBfRU5UUlkpOworCQkJcmV0VmFsdWUKKwkJCQkJLmVTZXQoR3JhcGhQYWNrYWdlLkxpdGVyYWxzLlVSSV9UT19MQUJFTF9NQVBfRU5UUllfX0tFWSwga2V5KTsKKwkJCXJldFZhbHVlLmVTZXQoR3JhcGhQYWNrYWdlLkxpdGVyYWxzLlVSSV9UT19MQUJFTF9NQVBfRU5UUllfX1ZBTFVFLAorCQkJCQl2YWx1ZSk7CisJCQlyZXR1cm4gcmV0VmFsdWU7CisKKwkJfSAvLyBnZXRNYXBFbnRyeQorCQkKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TWFwRW50cnlWYWx1ZUVSZWZlcmVuY2UoKSB7CisJCQlyZXR1cm4gR3JhcGhQYWNrYWdlLmVJTlNUQU5DRS5nZXRVUklUb0xhYmVsTWFwRW50cnlfVmFsdWUoKTsKKwkJfSAvLyBnZXRNYXBFbnRyeVZhbHVlRVJlZmVyZW5jZQorCQkKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaC5wcm92aWRlci5HcmFwaEl0ZW1Qcm92aWRlci5UcmFuc2llbnRHcmFwaEl0ZW1Qcm92aWRlciNnZXRNYXBSZWZlcmVuY2UoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldE1hcFJlZmVyZW5jZSgpIHsKKwkJCXJldHVybiBHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfX0dSQVBIX0xBQkVMUzsKKwkJfQorCisJfSAvLyBHcmFwaExhYmVsc0l0ZW1Qcm92aWRlcgorCit9IC8vIEdyYXBoSXRlbVByb3ZpZGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcm92aWRlci9HcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcm92aWRlci9HcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5NmU5MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Byb3ZpZGVyL0dyYXBoSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI2NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGlzcG9zYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC51dGlsLkdyYXBoQWRhcHRlckZhY3Rvcnk7CisKKy8qKgorICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLgorICogVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uCisgKiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgorICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEdyYXBoQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKKworCS8qKgorCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQsIHNvIHRoYXQgdGhleSBjYW4gYmUge0BsaW5rICNkaXNwb3NlIGRpc3Bvc2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGlzcG9zYWJsZSBkaXNwb3NhYmxlID0gbmV3IERpc3Bvc2FibGUoKTsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieSB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248T2JqZWN0PiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgeworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZX0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBFZGdlSXRlbVByb3ZpZGVyIGVkZ2VJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2V9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVkZ2VBZGFwdGVyKCkgeworCQlpZiAoZWRnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQllZGdlSXRlbVByb3ZpZGVyID0gbmV3IEVkZ2VJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gZWRnZUl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBofS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaEFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgR3JhcGhJdGVtUHJvdmlkZXIodGhpcyk7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZX0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBOb2RlSXRlbVByb3ZpZGVyIG5vZGVJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5vZGVBZGFwdGVyKCkgeworCQlpZiAobm9kZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlub2RlSXRlbVByb3ZpZGVyID0gbmV3IE5vZGVJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gbm9kZUl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgeworCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7CisJCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7CisJCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7CisJCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3M8Pz4pIHx8ICgoKENsYXNzPD8+KXR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7CisJCQkJcmV0dXJuIGFkYXB0ZXI7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBBc3NvY2lhdGVzIGFuIGFkYXB0ZXIgd2l0aCBhIG5vdGlmaWVyIHZpYSB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiwgdGhlbiByZWNvcmRzIGl0IHRvIGVuc3VyZSBpdCB3aWxsIGJlIGRpc3Bvc2VkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFzc29jaWF0ZShBZGFwdGVyIGFkYXB0ZXIsIE5vdGlmaWVyIHRhcmdldCkgeworCQlzdXBlci5hc3NvY2lhdGUoYWRhcHRlciwgdGFyZ2V0KTsKKwkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgeworCQkJZGlzcG9zYWJsZS5hZGQoYWRhcHRlcik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn0gYW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKworCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgeworCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJZGlzcG9zYWJsZS5kaXNwb3NlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcm92aWRlci9HcmFwaFRpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcm92aWRlci9HcmFwaFRpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJlN2VlYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Byb3ZpZGVyL0dyYXBoVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE1MCBAQAorLy8gR3JhcGhUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy50aW1lLlRpbWVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLnRpbWUuVGltZVByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLnRpbWUuVGltZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnV0aWwuR3JhcGhBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhbiB7QGxpbmsgVGltZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnl9LgorICovCitwdWJsaWMgY2xhc3MgR3JhcGhUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEdyYXBoQWRhcHRlckZhY3RvcnkKKwkJaW1wbGVtZW50cyBUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzCisJICogYWRhcHRlciBmYWN0b3J5LgorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsKKwkgKiBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LgorCSAqLworCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKKworCS8qKgorCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgR3JhcGhUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRkQWRhcHRlckZhY3RvcnkodGhpcyk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudXRpbC5HcmFwaEFkYXB0ZXJGYWN0b3J5IworCSAqIAljcmVhdGVHcmFwaEFkYXB0ZXIoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBHcmFwaFRpbWVQcm92aWRlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUKKwkgKiAJb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlCisJICogCS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKGZpbmFsIElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogQHNlZQorCSAqIAlvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UKKwkgKiAJLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXIpCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoCisJCQlmaW5hbCBJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyI2ZpcmVOb3RpZnlDaGFuZ2VkKG9yZy4KKwkgKiAJZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCisJICovCisJcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoZmluYWwgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgeworCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSMKKwkgKiAJZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKKwkgKi8KKwlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7CisJCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5CisJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSMKKwkgKiAJc2V0UGFyZW50QWRhcHRlckZhY3RvcnkKKwkgKiAJKG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3RvcnkpCisJICovCisJcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoCisJCQlmaW5hbCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7CisJCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKKwl9CisKKwkvKioKKwkgKiBAc2VlCisJICogCW9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC51dGlsLlN0YW5kYXJkQWRhcHRlckZhY3RvcnkKKwkgKiAJI2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKGZpbmFsIE9iamVjdCB0eXBlKSB7CisJCXJldHVybiB0eXBlID09IFRpbWVQcm92aWRlci5jbGFzcyB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOworCX0gLy8gaXNGYWN0b3J5Rm9yVHlwZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZSNkaXNwb3NlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkvLyBOb3RoaW5nCisJfQorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBUaW1lUHJvdmlkZXJ9IGZvciB7QGxpbmsgR3JhcGh9IGluc3RhbmNlcy4gSXQKKwkgKiBwcm92aWRlcyBhIHRpbWUgdmFsdWUgZm9yIHRoZSBncmFwaC4gVGhlIHZhbHVlIGlzIHRoZSB0aW1lIHRoYXQgdGhlCisJICoge0BsaW5rIExhYmVsVmFsdWV9cyBvZiB7QGxpbmsgRHluYW1pY0xhYmVsfSB3ZXJlIGxhc3QgdXBkYXRlZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBHcmFwaFRpbWVQcm92aWRlciBleHRlbmRzIFRpbWVQcm92aWRlckFkYXB0ZXIKKwkJCWltcGxlbWVudHMgVGltZVByb3ZpZGVyIHsKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy50aW1lLlRpbWVQcm92aWRlckFkYXB0ZXIjZ2V0VGltZSgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFNURU1UaW1lIGdldFRpbWUoKSB7CisJCQlHcmFwaCBncmFwaCA9IChHcmFwaClnZXRUYXJnZXQoKTsKKwkJCXJldHVybiBncmFwaC5nZXRUaW1lKCk7CisJCX0KKworCX0gLy8gR3JhcGhUaW1lUHJvdmlkZXIKKworfSAvLyBHcmFwaFRpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJvdmlkZXIvTGFiZWxJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Byb3ZpZGVyL0xhYmVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MxMTE4NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Byb3ZpZGVyL0xhYmVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMDMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuSWRlbnRpZmlhYmxlSXRlbVByb3ZpZGVyOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisgKiBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBMYWJlbEl0ZW1Qcm92aWRlciBleHRlbmRzIElkZW50aWZpYWJsZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMYWJlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkVVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9MYWJlbF91UklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0xhYmVsX3VSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWRfZmVhdHVyZSIsICJfVUlfTGFiZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKEdyYXBoUGFja2FnZS5MaXRlcmFscy5MQUJFTF9fQ1VSUkVOVF9WQUxVRSk7CisJCX0KKwkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7CisJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKKwkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgorCisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7CisJfQorCisJLyoqCisJICogQHJldHVybnMgTGFiZWwuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCisJCQkJImZ1bGwvY3VzdG9tb2JqMTYvU3RhdGljTGFiZWwiKSk7CisJfSAvLyBnZXRJbWFnZQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7CisJfSAvLyBnZXRUZXh0CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworLy8JQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKExhYmVsKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfTGFiZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfTGFiZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChMYWJlbC5jbGFzcykpIHsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkxBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQ6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkxBQkVMX19DVVJSRU5UX1ZBTFVFOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcm92aWRlci9MYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcm92aWRlci9MYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3YWNjYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Byb3ZpZGVyL0xhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZX0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfTGFiZWxWYWx1ZV90eXBlIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIENvcmVFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJvdmlkZXIvTm9kZUl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJvdmlkZXIvTm9kZUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYTY5NmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcm92aWRlci9Ob2RlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxOTAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db3JlRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLklkZW50aWZpYWJsZUl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGV9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE5vZGVJdGVtUHJvdmlkZXIKKwlleHRlbmRzIElkZW50aWZpYWJsZUl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb2RlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZEVkZ2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRMYWJlbHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVkZ2VzIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkRWRnZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Ob2RlX2VkZ2VzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX05vZGVfZWRnZXNfZmVhdHVyZSIsICJfVUlfTm9kZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIEdyYXBoUGFja2FnZS5MaXRlcmFscy5OT0RFX19FREdFUywKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIHRydWUsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTGFiZWxzIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkTGFiZWxzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTm9kZV9sYWJlbHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTm9kZV9sYWJlbHNfZmVhdHVyZSIsICJfVUlfTm9kZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIEdyYXBoUGFja2FnZS5MaXRlcmFscy5OT0RFX19MQUJFTFMsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSB0cnVlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIE5vZGUuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbW9iajE2L05vZGUiKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKKwl9IC8vIGdldFRleHQKKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworLy8JQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKE5vZGUpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9Ob2RlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX05vZGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcm92aWRlci9Ob2RlTGFiZWxJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Byb3ZpZGVyL05vZGVMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YzU3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcm92aWRlci9Ob2RlTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE0OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db3JlRWRpdFBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWx9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE5vZGVMYWJlbEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgTGFiZWxJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm9kZUxhYmVsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZE5vZGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5vZGUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb2RlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTm9kZUxhYmVsX25vZGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTm9kZUxhYmVsX25vZGVfZmVhdHVyZSIsICJfVUlfTm9kZUxhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgR3JhcGhQYWNrYWdlLkxpdGVyYWxzLk5PREVfTEFCRUxfX05PREUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSB0cnVlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIE5vZGVMYWJlbC5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Ob2RlTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChOb2RlTGFiZWwpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9Ob2RlTGFiZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfTm9kZUxhYmVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Byb3ZpZGVyL1N0YXRpY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJvdmlkZXIvU3RhdGljRWRnZUxhYmVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzOGU2ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Byb3ZpZGVyL1N0YXRpY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY0VkZ2VMYWJlbDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNFZGdlTGFiZWx9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFN0YXRpY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgRWRnZUxhYmVsSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cwkKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0YXRpY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKwkJCVN0YXRpY0xhYmVsSXRlbVByb3ZpZGVyLmFkZEN1cnJlbnRWYWx1ZVByb3BlcnRpZXMob2JqZWN0LGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzKTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnNHZW4oT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChTdGF0aWNFZGdlTGFiZWwpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9TdGF0aWNFZGdlTGFiZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfU3RhdGljRWRnZUxhYmVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Byb3ZpZGVyL1N0YXRpY0xhYmVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcm92aWRlci9TdGF0aWNMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZjBmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcm92aWRlci9TdGF0aWNMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNMYWJlbDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNMYWJlbH0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RhdGljTGFiZWxJdGVtUHJvdmlkZXIKKwlleHRlbmRzIExhYmVsSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdGF0aWNMYWJlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRDdXJyZW50VmFsdWVQcm9wZXJ0aWVzKE9iamVjdCBvYmplY3QsCisJCQlmaW5hbCBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycykgeworCQlmaW5hbCBTdGF0aWNMYWJlbCBzbmwgPSAoU3RhdGljTGFiZWwpIG9iamVjdDsKKwkJZmluYWwgTGFiZWxWYWx1ZSBsdiA9IChMYWJlbFZhbHVlKSBzbmwKKwkJCQkuZUdldChHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuTEFCRUxfX0NVUlJFTlRfVkFMVUUpOworCisJCWZpbmFsIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgaXRlbVByb3ZpZGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KAorCQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkuRGVzY3JpcHRvci5SZWdpc3RyeS5JTlNUQU5DRSk7CisKKwkJZmluYWwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSBwcm9wZXJ0eVNvdXJjZSA9IChJSXRlbVByb3BlcnR5U291cmNlKSBpdGVtUHJvdmlkZXJGYWN0b3J5CisJCQkJLmFkYXB0KGx2LCBJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKKwkJaWYgKHByb3BlcnR5U291cmNlICE9IG51bGwpIHsKKwkJCWZpbmFsIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BlcnRpZXMgPSBwcm9wZXJ0eVNvdXJjZQorCQkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhsdik7CisJCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGRBbGwocHJvcGVydGllcyk7CisJCX0KKwl9IC8vIGFkZEN1cnJlbnRWYWx1ZVByb3BlcnRpZXMKKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKFN0YXRpY0xhYmVsKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfU3RhdGljTGFiZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfU3RhdGljTGFiZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJvdmlkZXIvU3RhdGljTm9kZUxhYmVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcm92aWRlci9TdGF0aWNOb2RlTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzZjNzgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJvdmlkZXIvU3RhdGljTm9kZUxhYmVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljTm9kZUxhYmVsOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY05vZGVMYWJlbH0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RhdGljTm9kZUxhYmVsSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBOb2RlTGFiZWxJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RhdGljTm9kZUxhYmVsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCQkJU3RhdGljTGFiZWxJdGVtUHJvdmlkZXIuYWRkQ3VycmVudFZhbHVlUHJvcGVydGllcyhvYmplY3QsaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9yc0dlbihPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCQorCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKFN0YXRpY05vZGVMYWJlbClvYmplY3QpLmdldFVSSSgpOworCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1N0YXRpY05vZGVMYWJlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9TdGF0aWNOb2RlTGFiZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdXRpbC9HcmFwaEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC91dGlsL0dyYXBoQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWRjMDBmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdXRpbC9HcmFwaEFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1NDAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnV0aWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5VbnJlc29sdmVkSWRlbnRpZmlhYmxlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR3JhcGhBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgR3JhcGhQYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR3JhcGhBZGFwdGVyRmFjdG9yeSgpIHsKKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7CisJCQltb2RlbFBhY2thZ2UgPSBHcmFwaFBhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgeworCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKKwkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBHcmFwaFN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9CisJCW5ldyBHcmFwaFN3aXRjaDxBZGFwdGVyPigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUR5bmFtaWNMYWJlbChEeW5hbWljTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUR5bmFtaWNMYWJlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUR5bmFtaWNOb2RlTGFiZWwoRHluYW1pY05vZGVMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRHluYW1pY05vZGVMYWJlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUVkZ2UoRWRnZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRWRnZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUdyYXBoKEdyYXBoIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVHcmFwaEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUxhYmVsKExhYmVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVMYWJlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUxhYmVsVmFsdWUoTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTGFiZWxWYWx1ZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU5vZGUoTm9kZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTm9kZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU5vZGVMYWJlbChOb2RlTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZU5vZGVMYWJlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVN0YXRpY05vZGVMYWJlbChTdGF0aWNOb2RlTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0YXRpY05vZGVMYWJlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVVucmVzb2x2ZWRJZGVudGlmaWFibGUoVW5yZXNvbHZlZElkZW50aWZpYWJsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlVW5yZXNvbHZlZElkZW50aWZpYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnkoTWFwLkVudHJ5PFVSSSwgSWRlbnRpZmlhYmxlPiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNhbml0eUNoZWNrZXIoU2FuaXR5Q2hlY2tlciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU2FuaXR5Q2hlY2tlckFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUR5bmFtaWNFZGdlTGFiZWwoRHluYW1pY0VkZ2VMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRHluYW1pY0VkZ2VMYWJlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUVkZ2VMYWJlbChFZGdlTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUVkZ2VMYWJlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVN0YXRpY0VkZ2VMYWJlbChTdGF0aWNFZGdlTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0YXRpY0VkZ2VMYWJlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVVSSVRvRWRnZU1hcEVudHJ5KE1hcC5FbnRyeTxVUkksIEVkZ2U+IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVVUklUb0VkZ2VNYXBFbnRyeUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVVSSVRvTm9kZU1hcEVudHJ5KE1hcC5FbnRyeTxVUkksIE5vZGU+IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVVUklUb05vZGVNYXBFbnRyeUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVVSSVRvTGFiZWxNYXBFbnRyeShNYXAuRW50cnk8VVJJLCBMYWJlbD4gb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVVSSVRvTGFiZWxNYXBFbnRyeUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVVSSVRvTm9kZUxhYmVsTWFwRW50cnkoTWFwLkVudHJ5PFVSSSwgTm9kZUxhYmVsPiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlVVJJVG9Ob2RlTGFiZWxNYXBFbnRyeUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVN0YXRpY0xhYmVsKFN0YXRpY0xhYmVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTdGF0aWNMYWJlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIDxUPiBBZGFwdGVyIGNhc2VDb21wYXJhYmxlKENvbXBhcmFibGU8VD4gb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUNvbXBhcmFibGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVJZGVudGlmaWFibGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNb2RpZmlhYmxlKE1vZGlmaWFibGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZU1vZGlmaWFibGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgorCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgeworCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKKwl9CisKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbCA8ZW0+RHluYW1pYyBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUR5bmFtaWNMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2UgPGVtPkVkZ2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2UKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRWRnZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoIDxlbT5HcmFwaDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbCA8ZW0+TGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxhYmVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZSA8ZW0+TGFiZWwgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTGFiZWxWYWx1ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGUgPGVtPk5vZGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTm9kZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlVucmVzb2x2ZWRJZGVudGlmaWFibGUgPGVtPlVucmVzb2x2ZWQgSWRlbnRpZmlhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5VbnJlc29sdmVkSWRlbnRpZmlhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVucmVzb2x2ZWRJZGVudGlmaWFibGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmEudXRpbC5NYXAuRW50cnkgPGVtPlVSSSBUbyBJZGVudGlmaWFibGUgTWFwIEVudHJ5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIGphdmEudXRpbC5NYXAuRW50cnkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyIDxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2FuaXR5Q2hlY2tlckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNFZGdlTGFiZWwgPGVtPkR5bmFtaWMgRWRnZSBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0VkZ2VMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEeW5hbWljRWRnZUxhYmVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZUxhYmVsIDxlbT5FZGdlIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRWRnZUxhYmVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljRWRnZUxhYmVsIDxlbT5TdGF0aWMgRWRnZSBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljRWRnZUxhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0YXRpY0VkZ2VMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YS51dGlsLk1hcC5FbnRyeSA8ZW0+VVJJIFRvIEVkZ2UgTWFwIEVudHJ5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIGphdmEudXRpbC5NYXAuRW50cnkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVVJJVG9FZGdlTWFwRW50cnlBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmEudXRpbC5NYXAuRW50cnkgPGVtPlVSSSBUbyBOb2RlIE1hcCBFbnRyeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBqYXZhLnV0aWwuTWFwLkVudHJ5CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVSSVRvTm9kZU1hcEVudHJ5QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLnV0aWwuTWFwLkVudHJ5IDxlbT5VUkkgVG8gTGFiZWwgTWFwIEVudHJ5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIGphdmEudXRpbC5NYXAuRW50cnkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVVJJVG9MYWJlbE1hcEVudHJ5QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLnV0aWwuTWFwLkVudHJ5IDxlbT5VUkkgVG8gTm9kZSBMYWJlbCBNYXAgRW50cnk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgamF2YS51dGlsLk1hcC5FbnRyeQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVVUklUb05vZGVMYWJlbE1hcEVudHJ5QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljTGFiZWwgPGVtPlN0YXRpYyBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RhdGljTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmEubGFuZy5Db21wYXJhYmxlIDxlbT5Db21wYXJhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhcmFibGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTm9kZUxhYmVsIDxlbT5EeW5hbWljIE5vZGUgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNOb2RlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRHluYW1pY05vZGVMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY05vZGVMYWJlbCA8ZW0+U3RhdGljIE5vZGUgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY05vZGVMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGF0aWNOb2RlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWwgPGVtPk5vZGUgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVOb2RlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlIDxlbT5JZGVudGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZSA8ZW0+TW9kaWZpYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2RpZmlhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL0dyYXBoQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3V0aWwvR3JhcGhTd2l0Y2guamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3V0aWwvR3JhcGhTd2l0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGExY2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdXRpbC9HcmFwaFN3aXRjaC5qYXZhCkBAIC0wLDAgKzEsNjM0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC51dGlsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY05vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY05vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguVW5yZXNvbHZlZElkZW50aWZpYWJsZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KKyAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KKyAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKKyAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0CisgKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5CisgKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKKyAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBHcmFwaFN3aXRjaDxUMT4geworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgR3JhcGhQYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR3JhcGhTd2l0Y2goKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gR3JhcGhQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7CisJCX0KKwkJZWxzZSB7CisJCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKKwkJCXJldHVybgorCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/CisJCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKKwkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQxIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgeworCQkJY2FzZSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19MQUJFTDogeworCQkJCUR5bmFtaWNMYWJlbCBkeW5hbWljTGFiZWwgPSAoRHluYW1pY0xhYmVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUR5bmFtaWNMYWJlbChkeW5hbWljTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsKGR5bmFtaWNMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKGR5bmFtaWNMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShkeW5hbWljTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkRZTkFNSUNfTk9ERV9MQUJFTDogeworCQkJCUR5bmFtaWNOb2RlTGFiZWwgZHluYW1pY05vZGVMYWJlbCA9IChEeW5hbWljTm9kZUxhYmVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUR5bmFtaWNOb2RlTGFiZWwoZHluYW1pY05vZGVMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRHluYW1pY0xhYmVsKGR5bmFtaWNOb2RlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVMYWJlbChkeW5hbWljTm9kZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbChkeW5hbWljTm9kZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoZHluYW1pY05vZGVMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShkeW5hbWljTm9kZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEdyYXBoUGFja2FnZS5FREdFOiB7CisJCQkJRWRnZSBlZGdlID0gKEVkZ2UpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlRWRnZShlZGdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoZWRnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kaWZpYWJsZShlZGdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKGVkZ2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgR3JhcGhQYWNrYWdlLkdSQVBIOiB7CisJCQkJR3JhcGggZ3JhcGggPSAoR3JhcGgpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlR3JhcGgoZ3JhcGgpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShncmFwaCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShncmFwaCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBHcmFwaFBhY2thZ2UuTEFCRUw6IHsKKwkJCQlMYWJlbCBsYWJlbCA9IChMYWJlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VMYWJlbChsYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKGxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKGxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEdyYXBoUGFja2FnZS5MQUJFTF9WQUxVRTogeworCQkJCUxhYmVsVmFsdWUgbGFiZWxWYWx1ZSA9IChMYWJlbFZhbHVlKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUxhYmVsVmFsdWUobGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcihsYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEdyYXBoUGFja2FnZS5OT0RFOiB7CisJCQkJTm9kZSBub2RlID0gKE5vZGUpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlTm9kZShub2RlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUobm9kZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShub2RlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEdyYXBoUGFja2FnZS5OT0RFX0xBQkVMOiB7CisJCQkJTm9kZUxhYmVsIG5vZGVMYWJlbCA9IChOb2RlTGFiZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlTm9kZUxhYmVsKG5vZGVMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGFiZWwobm9kZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUobm9kZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKG5vZGVMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBHcmFwaFBhY2thZ2UuU1RBVElDX05PREVfTEFCRUw6IHsKKwkJCQlTdGF0aWNOb2RlTGFiZWwgc3RhdGljTm9kZUxhYmVsID0gKFN0YXRpY05vZGVMYWJlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VTdGF0aWNOb2RlTGFiZWwoc3RhdGljTm9kZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlTGFiZWwoc3RhdGljTm9kZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGF0aWNMYWJlbChzdGF0aWNOb2RlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsKHN0YXRpY05vZGVMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kaWZpYWJsZShzdGF0aWNOb2RlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShzdGF0aWNOb2RlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUoc3RhdGljTm9kZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEdyYXBoUGFja2FnZS5VTlJFU09MVkVEX0lERU5USUZJQUJMRTogeworCQkJCVVucmVzb2x2ZWRJZGVudGlmaWFibGUgdW5yZXNvbHZlZElkZW50aWZpYWJsZSA9IChVbnJlc29sdmVkSWRlbnRpZmlhYmxlKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVVucmVzb2x2ZWRJZGVudGlmaWFibGUodW5yZXNvbHZlZElkZW50aWZpYWJsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX0lERU5USUZJQUJMRV9NQVBfRU5UUlk6IHsKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgTWFwLkVudHJ5PFVSSSwgSWRlbnRpZmlhYmxlPiB1cmlUb0lkZW50aWZpYWJsZU1hcEVudHJ5ID0gKE1hcC5FbnRyeTxVUkksIElkZW50aWZpYWJsZT4pdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeSh1cmlUb0lkZW50aWZpYWJsZU1hcEVudHJ5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEdyYXBoUGFja2FnZS5EWU5BTUlDX0VER0VfTEFCRUw6IHsKKwkJCQlEeW5hbWljRWRnZUxhYmVsIGR5bmFtaWNFZGdlTGFiZWwgPSAoRHluYW1pY0VkZ2VMYWJlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VEeW5hbWljRWRnZUxhYmVsKGR5bmFtaWNFZGdlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUR5bmFtaWNMYWJlbChkeW5hbWljRWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFZGdlTGFiZWwoZHluYW1pY0VkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGFiZWwoZHluYW1pY0VkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKGR5bmFtaWNFZGdlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUoZHluYW1pY0VkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBHcmFwaFBhY2thZ2UuRURHRV9MQUJFTDogeworCQkJCUVkZ2VMYWJlbCBlZGdlTGFiZWwgPSAoRWRnZUxhYmVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUVkZ2VMYWJlbChlZGdlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsKGVkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKGVkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShlZGdlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlNUQVRJQ19FREdFX0xBQkVMOiB7CisJCQkJU3RhdGljRWRnZUxhYmVsIHN0YXRpY0VkZ2VMYWJlbCA9IChTdGF0aWNFZGdlTGFiZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU3RhdGljRWRnZUxhYmVsKHN0YXRpY0VkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWRnZUxhYmVsKHN0YXRpY0VkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhdGljTGFiZWwoc3RhdGljRWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbChzdGF0aWNFZGdlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUoc3RhdGljRWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoc3RhdGljRWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHN0YXRpY0VkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX0VER0VfTUFQX0VOVFJZOiB7CisJCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIE1hcC5FbnRyeTxVUkksIEVkZ2U+IHVyaVRvRWRnZU1hcEVudHJ5ID0gKE1hcC5FbnRyeTxVUkksIEVkZ2U+KXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVVSSVRvRWRnZU1hcEVudHJ5KHVyaVRvRWRnZU1hcEVudHJ5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEdyYXBoUGFja2FnZS5VUklfVE9fTk9ERV9NQVBfRU5UUlk6IHsKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgTWFwLkVudHJ5PFVSSSwgTm9kZT4gdXJpVG9Ob2RlTWFwRW50cnkgPSAoTWFwLkVudHJ5PFVSSSwgTm9kZT4pdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlVVJJVG9Ob2RlTWFwRW50cnkodXJpVG9Ob2RlTWFwRW50cnkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgR3JhcGhQYWNrYWdlLlVSSV9UT19MQUJFTF9NQVBfRU5UUlk6IHsKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgTWFwLkVudHJ5PFVSSSwgTGFiZWw+IHVyaVRvTGFiZWxNYXBFbnRyeSA9IChNYXAuRW50cnk8VVJJLCBMYWJlbD4pdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlVVJJVG9MYWJlbE1hcEVudHJ5KHVyaVRvTGFiZWxNYXBFbnRyeSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBHcmFwaFBhY2thZ2UuVVJJX1RPX05PREVfTEFCRUxfTUFQX0VOVFJZOiB7CisJCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIE1hcC5FbnRyeTxVUkksIE5vZGVMYWJlbD4gdXJpVG9Ob2RlTGFiZWxNYXBFbnRyeSA9IChNYXAuRW50cnk8VVJJLCBOb2RlTGFiZWw+KXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVVSSVRvTm9kZUxhYmVsTWFwRW50cnkodXJpVG9Ob2RlTGFiZWxNYXBFbnRyeSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBHcmFwaFBhY2thZ2UuU1RBVElDX0xBQkVMOiB7CisJCQkJU3RhdGljTGFiZWwgc3RhdGljTGFiZWwgPSAoU3RhdGljTGFiZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU3RhdGljTGFiZWwoc3RhdGljTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsKHN0YXRpY0xhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKHN0YXRpY0xhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoc3RhdGljTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUoc3RhdGljTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkR5bmFtaWMgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EeW5hbWljIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUR5bmFtaWNMYWJlbChEeW5hbWljTGFiZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVkZ2U8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FZGdlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUVkZ2UoRWRnZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGg8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VHcmFwaChHcmFwaCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MYWJlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VMYWJlbChMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGFiZWwgVmFsdWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VMYWJlbFZhbHVlKExhYmVsVmFsdWUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZU5vZGUoTm9kZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VW5yZXNvbHZlZCBJZGVudGlmaWFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5VbnJlc29sdmVkIElkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VVbnJlc29sdmVkSWRlbnRpZmlhYmxlKFVucmVzb2x2ZWRJZGVudGlmaWFibGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVSSSBUbyBJZGVudGlmaWFibGUgTWFwIEVudHJ5PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VVJJIFRvIElkZW50aWZpYWJsZSBNYXAgRW50cnk8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeShNYXAuRW50cnk8VVJJLCBJZGVudGlmaWFibGU+IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNhbml0eSBDaGVja2VyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVNhbml0eUNoZWNrZXIoU2FuaXR5Q2hlY2tlciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RHluYW1pYyBFZGdlIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RHluYW1pYyBFZGdlIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUR5bmFtaWNFZGdlTGFiZWwoRHluYW1pY0VkZ2VMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVkZ2UgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRWRnZUxhYmVsKEVkZ2VMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RhdGljIEVkZ2UgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGF0aWMgRWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTdGF0aWNFZGdlTGFiZWwoU3RhdGljRWRnZUxhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5VUkkgVG8gRWRnZSBNYXAgRW50cnk8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5VUkkgVG8gRWRnZSBNYXAgRW50cnk8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlVVJJVG9FZGdlTWFwRW50cnkoTWFwLkVudHJ5PFVSSSwgRWRnZT4gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVSSSBUbyBOb2RlIE1hcCBFbnRyeTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVSSSBUbyBOb2RlIE1hcCBFbnRyeTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VVUklUb05vZGVNYXBFbnRyeShNYXAuRW50cnk8VVJJLCBOb2RlPiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VVJJIFRvIExhYmVsIE1hcCBFbnRyeTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVSSSBUbyBMYWJlbCBNYXAgRW50cnk8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlVVJJVG9MYWJlbE1hcEVudHJ5KE1hcC5FbnRyeTxVUkksIExhYmVsPiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VVJJIFRvIE5vZGUgTGFiZWwgTWFwIEVudHJ5PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VVJJIFRvIE5vZGUgTGFiZWwgTWFwIEVudHJ5PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVVSSVRvTm9kZUxhYmVsTWFwRW50cnkoTWFwLkVudHJ5PFVSSSwgTm9kZUxhYmVsPiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RhdGljIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RhdGljIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVN0YXRpY0xhYmVsKFN0YXRpY0xhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIDxUPiBUMSBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EeW5hbWljIE5vZGUgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EeW5hbWljIE5vZGUgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRHluYW1pY05vZGVMYWJlbChEeW5hbWljTm9kZUxhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGF0aWMgTm9kZSBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0YXRpYyBOb2RlIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVN0YXRpY05vZGVMYWJlbChTdGF0aWNOb2RlTGFiZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZU5vZGVMYWJlbChOb2RlTGFiZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2RpZmlhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kaWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VNb2RpZmlhYmxlKE1vZGlmaWFibGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL0dyYXBoU3dpdGNoCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tYXRoL0Jpbm9taWFsRGlzdHJpYnV0aW9uVXRpbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbWF0aC9CaW5vbWlhbERpc3RyaWJ1dGlvblV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTZlYmUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbWF0aC9CaW5vbWlhbERpc3RyaWJ1dGlvblV0aWwuamF2YQpAQCAtMCwwICsxLDgwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tYXRoOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFV0aWxpdHkgcHJpbWFyaWx5IHVzZWQgYnkgc3RvY2hhc3RpYyBtb2RlbHMKKyAqIFRoaXMgdGVjaG5pcXVlIG1ha2VzIGEgcmFuZG9tIHBpY2sgZnJvbSBhIGJpbm9taWFsIGRpc3RyaWJ1dGlvbi4KKyAqIFRoZSBjb21wbGV4IHBhcnQgb2YgdGhpcyBvcGVyYXRpb25uIGlzIHRvIGNvbXB1dGUgdGhlIGJpbm9taWFsIGNvZWZmaWNpZW50CisgKiBlZmZpY2llbnRseSAoc2VlIGZvciBleGFtcGxlOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jpbm9taWFsX2Rpc3RyaWJ1dGlvbikKKyAqIEluIG9yZGVyIHRvIGRvIHRoZSBjb21wdXRhdGlvbiBmb3IgbGFyZ2UgTiAobGFyZ2UgUykgd2UgY29tcHV0ZSB0aGUgbG9nIG9mIHRoZSBiaW5vbWlhbCBjb2VmZmljZW50CisgKiBzbyB3ZSBkbyBhIHN1bSAoaW5zdGVhZCBvZiBhIGZhY3RvcmlhbCBwcm9kdWN0KSBhbmQgdGhlbiBleHBvbmVudGlhdGUgdGhlIHJlc3VsdC4gCisgKi8KK3B1YmxpYyBjbGFzcyBCaW5vbWlhbERpc3RyaWJ1dGlvblV0aWwgeworCisJIC8qKgorCSAgKiBSZXR1cm5zIHRoZSByYW5kb20gcGljayBmcm9tIGEgYmlub21pYWwgZGlzdAorCSAgKiBnaXZlbiAwPD1ybmRWYXI8PTEKKwkgICogVGhpcyBzdW1zIHRoZSBiaW5vbWlhbCBkaXN0IGFuZCByZXRydW5zIHRoZSBrIHZhbHVlIHdpdGggdGhhdCBpbnRlZ3JhdGVkIHByb2JhYmlsaXR5CisJICAqIEBwYXJhbSBwIFRoZSBwcm9iYWJpbGl0eQorCSAgKiBAcGFyYW0gbiBOLCAoZS5nLiBzdXNjZXB0aWJsZSkJICAgCisJICAqIEBwYXJhbSBybmRWQVIgUmFuZG9tIG51bWJlcgorCSAgKiBAcmV0dXJuIEsgUmFuZG9tIHBpY2sKKwkgICoqLyAKKwkgcHVibGljIHN0YXRpYyBpbnQgZmFzdFBpY2tGcm9tQmlub21pYWxEaXN0KGRvdWJsZSBwLCBpbnQgbiwgZG91YmxlIHJuZFZBUil7CisJCSBpZihwID09IDAgfHwgbiA9PSAwKSByZXR1cm4gMDsKKwkJIGRvdWJsZSBCc3VtID0gMC4wOworCQkgLy8gY29tcHV0ZSB0aGlzIG9uY2UKKwkJIGRvdWJsZSBsbkZhY3RvcmlhbE4gPSBsbkZhY3RvcmlhbChuKTsKKwkJIGRvdWJsZSBsbkZhY3RvcmlhbEsgPSAwLjA7CisJCSBkb3VibGUgbG5GYWN0b3JpYWxOX0sgPSBsbkZhY3RvcmlhbE47CisJCSBpbnQgbl9rID0gbjsKKwkJIGZvcihpbnQgayA9IDA7IGsgPD0gbjsgayArKykgeworCQkJIAorCQkJIGlmKGs+PTEpIHsKKwkJCQkgLy8gY291bnQgdXAKKwkJCQkgbG5GYWN0b3JpYWxLICs9IE1hdGgubG9nKChkb3VibGUpayk7CisJCQkgCisJCQkJIC8vIGNvdW50IGRvd24gZm9yIG4taworCQkJCSBsbkZhY3RvcmlhbE5fSyAtPSBNYXRoLmxvZygoZG91YmxlKW5fayk7CisJCQkJIG5fayAtPSAxOworCQkJIH0KKwkJCSAvLyBkbyB0aGUgZW50aXJlIGNvbXB1dGF0aW9uIGluIGxvZyBzcGFjZQorCQkJIGRvdWJsZSBsb2dCID0gbG5GYWN0b3JpYWxOIC0gbG5GYWN0b3JpYWxLIC0gbG5GYWN0b3JpYWxOX0s7CisJCQkgLy8gbm93IGluc3RlYWQgb2YgbXVsdHBseWluZyBieSBwXmsgKiAoMS1wKV5uLWsKKwkJCSAvLyB3ZSBhZGQKKwkJCSAvLyBsb2dCICsgaypsb2cocCkgKyAobi1rKSpsb2coMS1wKTsKKwkJCSBsb2dCICs9IChrKk1hdGgubG9nKHApKSAgKyAoIChuLWspICogTWF0aC5sb2cgKDEtcCkgKTsKKwkJCSAvLyBOT1cgd2UgdGFrZSB0aGUgZXhwb25lbnQKKwkJCSBCc3VtICs9IE1hdGguZXhwKGxvZ0IpOworCQkJIGlmIChCc3VtID49IHJuZFZBUikgcmV0dXJuIGs7CisJCSB9CisJCSByZXR1cm4gbjsKKwkgfQorCSAKKwkgICAKKwkgLyoqCisJICAqIGNvbXB1dGUgdGhlIGxvZyhuISkKKwkgICogQHBhcmFtIG4KKwkgICogQHJldHVybiBsb2cobiEpCisJICAqLworCSAgIHN0YXRpYyBkb3VibGUgbG5GYWN0b3JpYWwoaW50IG4pIHsKKwkgICAgICBkb3VibGUgcmV0VmFsID0gMC4wOworCQorCSAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgeworCSAgICAJICByZXRWYWwgKz0gTWF0aC5sb2coKGRvdWJsZSlpKTsKKwkgICAgICB9CisJICAgICAgIAorCSAgICAgIHJldHVybiByZXRWYWw7CisJICAgfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvRGVjb3JhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9EZWNvcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWQzZThkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvRGVjb3JhdG9yLmphdmEKQEAgLTAsMCArMSwyMjQgQEAKKy8vIERlY29yYXRvci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CisKKy8qKgorICogQSA8Y29kZT5EZWNvcmF0b3I8L2NvZGU+IHJlcHJlc2VudHMgYSBjb21wdXRhdGlvbmFsIGNvbXBvbmVudCB0aGF0IGNhbgorICogbW9kaWZ5IG9yICJkZWNvcmF0ZSIgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBofS4KKyAqIDxwPgorICogVGhlIG1ldGhvZCB7QGxpbmsgI2RlY29yYXRlR3JhcGgob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoKX0gaXMKKyAqIGNhbGxlZCBvbmNlIGZvciBlYWNoIDxjb2RlPkRlY29yYXRvcjwvY29kZT4gaW5zdGFuY2UgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZgorICogdGhlIGNhbm9uaWNhbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBofSAoc2VlCisgKiB7QGxpbmsgTW9kZWwjZ2V0Q2Fub25pY2FsR3JhcGgob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSl9KS4KKyAqIFR5cGljYWxseSwgdGhpcyBtZXRob2Qgd291bGQgYWRkIGFkZGl0aW9uYWwge0BsaW5rIER5bmFtaWNMYWJlbH1zIHRvIHRoZQorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaH0gdW5kZXIgY29uc3RydWN0aW9uLiBGb3IKKyAqIGV4YW1wbGUsIGEgZGlzZWFzZSBtb2RlbCB3b3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBhIDxjb2RlPkRlY29yYXRvcjwvY29kZT4KKyAqIGFuZCBpdCB3b3VsZCBhZGQge0BsaW5rIER5bmFtaWNMYWJlbH1zIHRvIHRoZQorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlfXMgb2YgdGhlCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBofSB0aGF0IHJlcHJlc2VudCB0aGUgc3RhdGUgb2YgdGhlCisgKiBkaXNlYXNlIGF0IGVhY2gge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlfS4KKyAqIDwvcD4KKyAqIDxwPgorICogQWZ0ZXIgdGhlIGNhbm9uaWNhbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBofSBpcyBjcmVhdGVkLAorICogdGhlIG1ldGhvZAorICoge0BsaW5rICN1cGRhdGVMYWJlbHMob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoLCBTVEVNVGltZSwgbG9uZyl9CisgKiB3aWxsIGJlIGNhbGxlZCBvbmNlIGV2ZXJ5IHRpbWUgdGhlCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvfSBpcyAic3RlcHBlZCIgKHNlZQorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbyNzdGVwKCl9KS4gVGhlCisgKiB7QGxpbmsgRHluYW1pY0xhYmVsfXMgdGhhdCBpdCB1cGRhdGVzIGFyZSB0aG9zZSB0aGF0IHdlcmUgYWRkZWQgdG8gdGhlCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBofSBpbiB0aGUKKyAqIHtAbGluayAjZGVjb3JhdGVHcmFwaChvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgpfSBtZXRob2QgY2FsbC4gQQorICogcmVmZXJlbmNlIHRvIGVhY2ggb2YgdGhvc2Uge0BsaW5rIER5bmFtaWNMYWJlbH1zIGlzIGtlcHQgaW4gYSBjb2xsZWN0aW9uCisgKiAoc2VlIHtAbGluayAjZ2V0TGFiZWxzVG9VcGRhdGUoKX0pIG1haW50YWluZWQgYnkgdGhlIDxjb2RlPkRlY29yYXRvcjwvY29kZT4uCisgKiBUaGUge0BsaW5rICN1cGRhdGVMYWJlbHMoR3JhcGgsIFNURU1UaW1lLCBsb25nKX0gbWV0aG9kIGNvbXB1dGVzIHRoZSAibmV4dCIKKyAqIHZhbHVlIG9mIGFsbCBvZiB0aGUge0BsaW5rIER5bmFtaWNMYWJlbH1zIGluIHRoYXQgY29sbGVjdGlvbi4KKyAqIDwvcD4KKyAqIDxwPgorICogRm9yIG1heGltdW0gZmxleGliaWxpdHksIHRoZSBuYXR1cmUgb2YgdGhhdAorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlfSBhbmQgaXRzIGNvbXB1dGF0aW9uIGFyZQorICogbm90IGRlZmluZWQgb3IgcmVzdHJpY3RlZC4gRm9yIGluc3RhbmNlLCB0aGUgPGNvZGU+RGVjb3JhdG9yPC9jb2RlPiBjb3VsZAorICogY29tcHV0ZSB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlfSBmcm9tIHRoZQorICogY29udGVudHMgb2YgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGh9LCByZWFkIHRoZQorICogdmFsdWUgZnJvbSBhIGZpbGUsIG9idGFpbiBpdCBmcm9tIGEgcmVhbC10aW1lIGRhdGEgc291cmNlIHN1Y2ggYXMgYSB3ZWF0aGVyCisgKiBzdGF0aW9uIG9yIHNvbWV0aGluZyBhY2Nlc3NpYmxlIGZyb20gYSB3ZWIgc2l0ZSBvciBhIHdlYiBzZXJ2aWNlLgorICogPC9wPgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBEZWNvcmF0b3IgZXh0ZW5kcyBJZGVudGlmaWFibGUgeworCisJLyoqCisJICogQSB7QGxpbmsgRGVjb3JhdG9yfSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQsIGJ1dCBpZiBpdCBpcyB0aGUgYWN0aW9uIG9mIGEKKwkgKiB7QGxpbmsgVHJpZ2dlcn0gdGhlbiBpdCB3aWxsIGJlIGRpc2FibGVkIGJ5IHRoZSB7QGxpbmsgVHJpZ2dlcn0gdW50aWwgdGhlCisJICoge0BsaW5rIFRyaWdnZXJ9J3Mge0BsaW5rIFByZWRpY2F0ZX0gZXZhbHVhdGVzIHRvIDxjb2RlPnRydWU8L2NvZGU+LgorCSAqIDxwPgorCSAqIElmIHRoZSB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4gdGhlbiBjYWxscyB0byB7QGxpbmsgI2RlY29yYXRlR3JhcGgoKX0KKwkgKiBhbmQge0BsaW5rICN1cGRhdGVMYWJlbHMoU1RFTVRpbWUsIGxvbmcpfSB3aWxsIGJlIGlnbm9yZWQuCisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUge0BsaW5rIERlY29yYXRvcn0gaXMgZW5hYmxlZC4KKwkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKKwkgKi8KKwlib29sZWFuIGlzRW5hYmxlZCgpOworCQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IjaXNFbmFibGVkIDxlbT5FbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbmFibGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc0VuYWJsZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiB2YWx1ZSk7CisKKworCS8qKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYge0BsaW5rICNkZWNvcmF0ZUdyYXBoKCl9IGhhcyBiZWVuIGNhbGxlZCBhbmQKKwkgKiAgICAgICAgIGl0IGhhcyBjb21wbGV0ZWQgZGVjb3JhdGluZyB0aGUge0BsaW5rIEdyYXBofSwgPGNvZGU+ZmFsc2U8L2NvZGU+CisJICogICAgICAgICBvdGhlcndpc2UuCisJICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgorCSAqLworCWJvb2xlYW4gaXNHcmFwaERlY29yYXRlZCgpOworCQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IjaXNHcmFwaERlY29yYXRlZCA8ZW0+R3JhcGggRGVjb3JhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFwaCBEZWNvcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzR3JhcGhEZWNvcmF0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEdyYXBoRGVjb3JhdGVkKGJvb2xlYW4gdmFsdWUpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2dyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjAuMCI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvZ3Jlc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvZ3Jlc3M8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFByb2dyZXNzKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2UjZ2V0RGVjb3JhdG9yX1Byb2dyZXNzKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMC4wIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0UHJvZ3Jlc3MoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IjZ2V0UHJvZ3Jlc3MgPGVtPlByb2dyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9ncmVzczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0UHJvZ3Jlc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFByb2dyZXNzKGRvdWJsZSB2YWx1ZSk7CisKKwkvKipBdWdtZW50IHRoZSBncmFwaCBieSBhZGRpbmcgY29tcG9uZW50cyAoe0BsaW5rIEVkZ2V9cywKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGV9cywKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsfXMpLiBUaGUgYWRkZWQgY29tcG9uZW50cywKKwkgKiBpbiBwYXJ0aWN1bGFyIHtAbGluayBEeW5hbWljTGFiZWx9cywgY2FuIGJlIG1vZGlmaWVkIGxhdGVyIGR1cmluZyBhIGNhbGwKKwkgKiB0byB7QGxpbmsgI3VwZGF0ZUxhYmVscyhHcmFwaCwgU1RFTVRpbWUpfS4gQSBzaWRlIGVmZmVjdCBvZiB0aGlzIGNhbGwgaXMKKwkgKiB0aGF0IGl0IGFkZHMgdGhlIGRlY29yYXRvciB0byB0aGUgY29sbGVjdGlvbiBtYWludGFpbmVkIGJ5IHRoZQorCSAqIHtAbGluayBHcmFwaH0uCisJICogQHBhcmFtIHRpb21lCisJICogQHJldHVybiBib29sZWFuCisJICogQGdlbmVyYXRlZAorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwlib29sZWFuIGRlY29yYXRlR3JhcGgoU1RFTVRpbWUgdGltZSk7CisKKwkvKioKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgR3JhcGh9IHRoYXQgdGhlIDxjb2RlPkRlY29yYXRvcjwvY29kZT4gZGVjb3JhdGVzLgorCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZGVjb3JhdG9ycyIKKwkgKi8KKwlHcmFwaCBnZXRHcmFwaCgpOworCQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IjZ2V0R3JhcGggPGVtPkdyYXBoPC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAorCSAqIAorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IjZ2V0R3JhcGggPGVtPkdyYXBoPC9lbT59JworCSAqIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyYXBoPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0R3JhcGgoKQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyYXBoPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0R3JhcGgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEdyYXBoKEdyYXBoIHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2Yge0BsaW5rIER5bmFtaWNMYWJlbH1zIHRoYXQgdGhpcyA8Y29kZT5EZWNvcmF0b3I8L2NvZGU+CisJICogCSBpcyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcuCisJICogQG1vZGVsIHR5cGU9IkR5bmFtaWNMYWJlbCIgY29udGFpbm1lbnQ9ImZhbHNlIiBvcHBvc2l0ZT0iZGVjb3JhdG9yIgorCSAqLworCUVMaXN0PER5bmFtaWNMYWJlbD4gZ2V0TGFiZWxzVG9VcGRhdGUoKTsKKworCisJLyoqCisJICogUHJvY2VzcyBlYWNoIG9mIHRoZSB7QGxpbmsgRHluYW1pY0xhYmVsfXMgdGhhdCB0aGlzCisJICogPGNvZGU+RGVjb3JhdG9yPC9jb2RlPiBpcyByZXNwb25zaWJsZSBmb3IgYW5kIGRldGVybWluZSB0aGVpciAibmV4dCIKKwkgKiB2YWx1ZS4KKwkgKiAKKwkgKiBAcGFyYW0gdGltZQorCSAqICAgICAgICAgICAgdGhlIHRpbWUgdG8gYmUgdXNlZCB3aGVuIGRldGVybWluaW5nIHRoZSBjaGFuZ2VzIHRvIGJlIG1hZGUgdG8KKwkgKiAgICAgICAgICAgIHRoZSBHcmFwaAorCSAqIEBwYXJhbSB0aW1lUGVyaW9kCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHRpbWUgYW5kIHRoZQorCSAqICAgICAgICAgICAgcHJldmlvdXMgdGltZSB2YWx1ZS4KKwkgKiBAcGFyYW0gY3ljbGUgCisJICogCQkJICBUaGUgbmV4dCBjeWNsZSBudW1iZXIuCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCXZvaWQgdXBkYXRlTGFiZWxzKGZpbmFsIFNURU1UaW1lIHRpbWUsIGZpbmFsIGxvbmcgdGltZXJQZXJpb2QsIGludCBjeWNsZSk7CisKKwkvKioKKwkgKiBQcm9jZXNzIGVhY2ggb2YgdGhlIHtAbGluayBEeW5hbWljTGFiZWxzfSB0aGF0IHRoaXMKKwkgKiA8Y29kZT5kZWNvcmF0b3I8L2NvZGU+IGlzIHJlc3BvbnNpYmxlIGZvciBhbmQgcmVzZXQgdGhlaXIgImN1cnJlbnQiCisJICogdmFsdWUgdG8gYmUgdGhlIGluaXRpYWwgdmFsdWUgYXNzaWduZWQgZHVyaW5nIHRoZSBjYWxsIHRvIHRoZSBtZXRob2QKKwkgKiB7QGxpbmsgI2RlY29yYXRlR3JhcGgoKX0KKwkgKiAKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJdm9pZCByZXNldExhYmVscygpOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAbW9kZWwgbWFueT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PER5bmFtaWNMYWJlbD4gZ2V0TGFiZWxzVG9VcGRhdGUoaW50IHBhcnRpdGlvbiwgaW50IG1heCk7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHByZXBhcmUoTW9kZWwgbW9kZWwsIFNURU1UaW1lIHRpbWUpOworCit9IC8vIERlY29yYXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvRWRnZURlY29yYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvRWRnZURlY29yYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNzAxNDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9FZGdlRGVjb3JhdG9yLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLy8gRWRnZURlY29yYXRvci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQW4gPGNvZGU+RWRnZURlY29yYXRvcjwvY29kZT4gaXMgYSB7QGxpbmsgRGVjb3JhdG9yfSB0aGF0IHNwZWNpZmljYWxseQorICogbW9kaWZpZXMge0BsaW5rIEVkZ2V9cyBhbmQgdGhlaXIge0BsaW5rIExhYmVsfXMuCisgKiAKKyAqIEBzZWUgRWRnZQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsCisgKiBAc2VlIE5vZGVEZWNvcmF0b3IKKyAqIEBzZWUgR3JhcGhEZWNvcmF0b3IKKyAqIEBzZWUgU2VxdWVuY2VyCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIEVkZ2VEZWNvcmF0b3IgZXh0ZW5kcyBEZWNvcmF0b3IgeworCS8vIE5vdGhpbmcgWWV0Cit9IC8vIEVkZ2VEZWNvcmF0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL0dyYXBoRGVjb3JhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9HcmFwaERlY29yYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDIxMGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9HcmFwaERlY29yYXRvci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8vIEdyYXBoRGVjb3JhdG9yLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBBbiA8Y29kZT5HcmFwaERlY29yYXRvcjwvY29kZT4gaXMgYSB7QGxpbmsgRGVjb3JhdG9yfSB0aGF0IHNwZWNpZmljYWxseQorICogbW9kaWZpZXMge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlfXMgYW5kIHRoZWlyCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsfXMuCisgKiAKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWwKKyAqIEBzZWUgTm9kZURlY29yYXRvcgorICogQHNlZSBFZGdlRGVjb3JhdG9yCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIEdyYXBoRGVjb3JhdG9yIGV4dGVuZHMgRGVjb3JhdG9yIHsKKwkvLyBOb3RoaW5nIFlldAorfSAvLyBHcmFwaERlY29yYXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvSW50ZWdyYXRpb25EZWNvcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL0ludGVncmF0aW9uRGVjb3JhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyOWE3NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL0ludGVncmF0aW9uRGVjb3JhdG9yLmphdmEKQEAgLTAsMCArMSw2NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWw7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOw0KKw0KKy8qKg0KKyAqIFRoZSBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgYW55IGRlY29yYXRvciBhYmxlIHRvIGNhbGN1bGF0ZSBhIGRlbHRhIChjaGFuZ2UpDQorICogdmFsdWUgZ2l2ZW4gYSBjdXJyZW50IHZhbHVlIGFuZCBhIHRpbWUgDQorICovDQorcHVibGljIGludGVyZmFjZSBJbnRlZ3JhdGlvbkRlY29yYXRvciBleHRlbmRzIEVPYmplY3Qgew0KKw0KKwkvKioNCisJICogTWV0aG9kIGludm9rZWQgdG8gY2FsY3VsYXRlIGEgZGVsdGEgDQorCSAqIA0KKwkgKiBAcGFyYW0gdGltZSBUaGUgU1RFTSB0aW1lDQorCSAqIEBwYXJhbSB0aW1lRGVsdGEgVGhlIG51bWJlciBvZiBtcyBmb3IgYSBzaW5nbGUgY3ljbGUgb2YgdGhlIHNpbXVsYXRpb24NCisJICogQHBhcmFtIGxhYmVscyBUaGUgbGFiZWxzIHRvIHVwZGF0ZQ0KKwkgKi8NCisJdm9pZCBjYWxjdWxhdGVEZWx0YShTVEVNVGltZSB0aW1lLCBsb25nIHRpbWVEZWx0YSwgRUxpc3Q8RHluYW1pY0xhYmVsPiBsYWJlbHMpOw0KKw0KKwkvKioNCisJICogYXBwbHlFeHRlcm5hbERlbHRhcy4gQWZ0ZXIgY2FsY3VsYXRlRGVsdGEgaGFzIGJlZW4gaW52b2tlZCBmb3IgYWxsDQorCSAqIGludGVncmF0aW9uIGRlY29yYXRvcnMgb24gYSBzaW11bGF0aW9uLCBlYWNoIGRlY29yYXRvciBjYW4gYWRqdXN0DQorCSAqIGl0J3Mgb3duIGRlbHRhIHZhbHVlcyB0YWtpbmcgaW50byBhY2NvdW50IGRlbHRhcyBjYWxjdWxhdGVkIGJ5IA0KKwkgKiBvdGhlciBkZWNvcmF0b3JzIHRoZSB0aGUgc2FtZSBub2RlLiBGb3IgaW5zdGFuY2UsIGluIGFuIFNJUiBtb2RlbA0KKwkgKiBwZW9wbGUgYXJlIHJlbW92ZWQgZnJvbSBlYWNoIGNvbXBhcnRtZW50IHRoYXQgZGVwZW5kcyBvbiBkZWF0aHMNCisJICogY2FsY3VsYXRlZCBieSBnZW5lcmFsIGJhY2tncm91bmQgZGVhdGhzIChmcm9tIFBvcHVsYXRpb24gTW9kZWxzKQ0KKwkgKiBhbmQgZGVhdGhzIGNhdXNlZCBieSBvdGhlciBkaXNlYXNlcyAoZGlzZWFzZSBtb2RlbHMpIA0KKwkgKiANCisJICogQHBhcmFtIHRpbWUgVGhlIFNURU0gdGltZQ0KKwkgKiBAcGFyYW0gdGltZURlbHRhIFRoZSBudW1iZXIgb2YgbXMgZm9yIGEgc2luZ2xlIGN5Y2xlIG9mIHRoZSBzaW11bGF0aW9uDQorCSAqIEBwYXJhbSBsYWJlbHMgVGhlIGxhYmVscyB0byB1cGRhdGUNCisJICovDQorCXZvaWQgYXBwbHlFeHRlcm5hbERlbHRhcyhTVEVNVGltZSB0aW1lLCBsb25nIHRpbWVEZWx0YSwgRUxpc3Q8RHluYW1pY0xhYmVsPiBsYWJlbHMpOw0KKw0KKwkNCisJLyoqDQorCSAqIEludm9rZWQgYXQgdGhlIGVuZCBvZiBhIHNpbXVsYXRpb24gY3ljbGUgdG8gYWRkIGFkZGl0aW9uYWwgcGVydHVyYmF0aW9ucw0KKwkgKiBzdWNoIGFzIG5vaXNlLg0KKwkgKi8NCisJdm9pZCBkb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyhMYWJlbFZhbHVlIGxhYmVsKTsNCisNCisJLyoqDQorCSAqIERldGVybWluZSB3aGV0aGVyIHRoZSBkZWNvcmF0b3IgaXMgZGV0ZXJtaW5pc3RpYy4gVGhlIGRldmVsb3BlciByZXR1cm5zDQorCSAqIHRoZSBwcm9wZXIgdmFsdWUgaGVyZSBkZXBlbmRpbmcgdXBvbiB3aGV0aGVyIGNhbGN1bGF0ZWREZWx0YSBhbHdheXMNCisJICogcmV0dXJucyB0aGUgc2FtZSBkZWx0YSBmb3IgdGhlIHNhbWUgaW5wdXQNCisJICogDQorCSAqIEByZXR1cm4gdHJ1ZSBJZiB0aGUgZGVjb3JhdG9yIGlzIGRldGVybWluaXN0aWMsIGZhbHNlIG90aGVyd2lzZQ0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gaXNEZXRlcm1pbmlzdGljKCk7DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL01vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9Nb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZjAxMGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9Nb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvLyBNb2RlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZUZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CisKKy8qKgorICogQSA8Y29kZT5Nb2RlbDwvY29kZT4gY29udGFpbnMgYWxsIG9mIHRoZSBjb21wb25lbnRzIG5lY2Vzc2FyeSB0byBjcmVhdGUgYQorICogY2Fub25pY2FsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGh9IHN1aXRhYmxlIGZvcgorICogc2ltdWxhdGlvbi4gSW4gcGFydGljdWxhciBpdCBjb250YWlucyBhIGNvbGxlY3Rpb24gb2YKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGh9J3MgYW5kIGEgY29sbGVjdGlvbiBvZiBvdGhlcgorICogKHN1YikgPGNvZGU+TW9kZWw8L2NvZGU+J3MuIFRoaXMgc3RydWN0dXJlIGZvcm1zIGEgInRyZWUiIHdpdGgKKyAqIDxjb2RlPk1vZGVsPC9jb2RlPiBpbnN0YW5jZXMgYXMgdGhlIHRyZWUncyByb290IGFuZCBpbnRlcmlvciBub2RlcywgYW5kCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBofSBpbnN0YW5jZXMgYXMgdGhlIHRyZWUncyBsZWF2ZXMuCisgKiA8cD4KKyAqIEVhY2ggPGNvZGU+TW9kZWw8L2NvZGU+IGNhbiBhbHNvIGNvbnRhaW4gY29sbGVjdGlvbidzIG9mIHtAbGluayBEZWNvcmF0b3J9J3MKKyAqIHdoaWNoIGNhbiBtb2RpZnkgdGhlIGNhbm9uaWNhbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBofQorICogd2hlbiBpdCBpcyBmaXJzdCBjcmVhdGVkIGZyb20gdGhlIG1vZGVsIChzZWUge0BsaW5rICNnZXRDYW5vbmljYWxHcmFwaChVUkkpfS4KKyAqIDwvcD4KKyAqIDxwPgorICogRWFjaCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvfSBjb250YWlucyBhIHNpbmdsZQorICogcmVmZXJlbmNlIHRvIGEgPGNvZGU+TW9kZWw8L2NvZGU+LiBUaGF0IG1vZGVsIGlzIHRoZSByb290IG9mIHRoZSB0cmVlIHRoZQorICogZGVmaW5lcyB0aGUgY2Fub25pY2FsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGh9IHRoYXQgd2lsbAorICogYmUgdXNlZCBmb3Igc2ltdWxhdGlvbi4gQSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvfQorICogb2J0YWlucyB0aGUgY2Fub25pY2FsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGh9IGZyb20gdGhlCisgKiBtb2RlbCBieSBjYWxsaW5nIHRoZSBtZXRob2Qge0BsaW5rICNnZXRDYW5vbmljYWxHcmFwaChVUkkpfS4gVGhpcyBtZXRob2QKKyAqIHJlY3Vyc2l2ZWx5IGNyZWF0ZXMgdGhlIGNhbm9uaWNhbAorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaH0gYnkgaW52b2tpbmcgaXRzZWxmIG9uIHRoZQorICogPGNvZGU+TW9kZWw8L2NvZGU+IGluc3RhbmNlcyBpdCBjb250YWlucy4gQXQgZWFjaCBsZXZlbCBvZiB0aGUgcmVjdXJzaW9uLAorICogaXQgY29tYmluZXMgdGhlIHJlc3VsdHMgb2YgdGhvc2UgY2FsbHMgd2l0aCB0aGUKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGh9J3MgaXQgY29udGFpbnMgKGlmIGFueSkuIFRoZQorICoge0BsaW5rIERlY29yYXRvcn1zIGluIHRoZSBtb2RlbCBhcmUgYWxzbyB0aGVuIGFsbG93ZWQgdG8gbW9kaWZ5IChkZWNvcmF0ZSkKKyAqIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBofS4gVGhlbiwgdGhlIHJlY3Vyc2lvbgorICogYXR0ZW1wdHMgdG8gcmVzb2x2ZSBhbnkgb3V0c3RhbmRpbmcgdW5yZXNvbHZlZCBsaW5rcyBiZXR3ZWVuCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2V9cyBhbmQKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWx9cyBhbmQgdGhlCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGV9cyBpbiB0aGUgY2Fub25pY2FsCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBofSB1bmRlciBjb25zdHJ1Y3Rpb24uIFRoaXMgaXMKKyAqIGFjY29tcGxpc2hlZCBieSBtYXRjaGluZyB1cCB0aGUgInRhcmdldCIge0BsaW5rIFVSSX1zIG9mIHRoZSB1bnJlc29sdmVkCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2V9cyBvciB7QGxpbmsgTGFiZWx9cyB3aXRoIGEKKyAqIHtAbGluayBVUkl9IG9mIGEge0BsaW5rIE5vZGV9LiBBbnkgd2hpY2ggY2Fubm90IGJlIHJlc29sdmVkIGFyZSByZWNvcmRlZAorICogd2l0aCBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguVW5yZXNvbHZlZElkZW50aWZpYWJsZX0KKyAqIGluc3RhbmNlIChzZWUKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0VW5yZXNvbHZlZElkZW50aWZpYWJsZXMoKX0pCisgKiBmb3IgbGF0ZXIgcmVwb3J0aW5nLgorICogPC9wPgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBkZWZpbml0aW9uIGlzIGFsc28gYW4gIkFubm90YXRlZCBKYXZhIEludGVyZmFjZSIgdGhhdCBkZWZpbmVzCisgKiBvbmUgY2xhc3MgaW4gYSA8YSBocmVmPSJodHRwOi8vd3d3LnVtbC5vcmcvIj5VTUw8L2E+ICJtb2RlbCIuIFRoZSBVTUwgY2xhc3MKKyAqIGRpYWdyYW0gZm9yIHRoZSBtb2RlbCBpcyBpbiB0aGUgPGNvZGU+ZG9jdW1lbnRhdGlvbjwvY29kZT4gZm9sZGVyIG9mIHRoZQorICogcHJvamVjdC4gVGhpcyBmaWxlIGFuZCB0aGUgb3RoZXIgaW50ZXJmYWNlcyBpbiB0aGlzIEphdmEgcGFja2FnZSBhcmUKKyAqIHByb2Nlc3NlZCBieSB0aGUgRWNsaXBzZSBNb2RlbGluZyBGcmFtZXdvcmsgKGFrYSBFTUYgPGEKKyAqIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS9lbWYiPmh0dHA6Ly9vcmcuZWNsaXBzZS9lbWY8L2E+KS4gdG8gYXV0b21hdGljYWxseQorICogZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsLiBFTUYgaXMgZG9jdW1lbnRlZCBpbiB0aGUgYm9vayA8YQorICogaHJlZj0iaHR0cDovL3d3dy5hd3Byb2Zlc3Npb25hbC5jb20vYm9va3N0b3JlL3Byb2R1Y3QuYXNwP2lzYm49MDEzMTQyNTQyMCZybD0xIj5FY2xpcHNlCisgKiBNb2RlbGluZyBGcmFtZXdvcmsgPC9hPiBieSBCdWRpbnNreSwgZXQgYWwuCisgKiA8L3A+CisgKiAKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbworICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBNb2RlbCBleHRlbmRzIElkZW50aWZpYWJsZSB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzZWdtZW50IG9mIHRoZSB0eXBlIFVSSSB0aGF0IHByZWZpeGVzIGFsbCBvdGhlciBzZWdtZW50cyBpbiBhCisJICogbW9kZWwgVVJJLgorCSAqLworCVN0cmluZyBVUklfVFlQRV9NT0RFTF9TRUdNRU5UID0gIm1vZGVsIjsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoaXMgPGNvZGU+TW9kZWw8L2NvZGU+J3MgY29sbGVjdGlvbiBvZiAoc3ViKQorCSAqICAgICAgICAgPGNvZGU+TW9kZWw8L2NvZGU+cworCSAqIAorCSAqIEBtb2RlbCB0eXBlPSJNb2RlbCIgY29udGFpbm1lbnQ9ImZhbHNlIgorCSAqLworCUVMaXN0PE1vZGVsPiBnZXRNb2RlbHMoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhpcyA8Y29kZT5Nb2RlbDwvY29kZT4ncyBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGh9fXMKKwkgKiAKKwkgKiBAbW9kZWwgdHlwZT0iR3JhcGgiIGNvbnRhaW5tZW50PSJmYWxzZSIKKwkgKi8KKwlFTGlzdDxHcmFwaD4gZ2V0R3JhcGhzKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBEZWNvcmF0b3J9cyB0aGF0IGRlY29yYXRlIHRoZSBjYW5vbmljYWwKKwkgKiAgICAgICAgIHtAbGluayBHcmFwaH0gaXRzZWxmLiBUaGVzZSBkZWNvcmF0aW9ucyBhcmUge0BsaW5rIExhYmVsfXMgdGhhdAorCSAqICAgICAgICAgYWN0IGxpa2UgImdsb2JhbCB2YXJpYWJsZXMiIGZvciB0aGUgY2Fub25pY2FsIHtAbGluayBHcmFwaH0uCisJICogCisJICogQG1vZGVsIHR5cGU9IkdyYXBoRGVjb3JhdG9yIiBjb250YWlubWVudD0iZmFsc2UiCisJICovCisJRUxpc3Q8R3JhcGhEZWNvcmF0b3I+IGdldEdyYXBoRGVjb3JhdG9ycygpOworCisJLyoqCisJICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGVjb3JhdG9yfXMgdGhhdCBkZWNvcmF0ZSB0aGUKKwkgKiAgICAgICAgIHtAbGluayBOb2RlfXMgaW4gdGhlIGNhbm9uaWNhbCB7QGxpbmsgR3JhcGh9LgorCSAqIAorCSAqIEBtb2RlbCB0eXBlPSJOb2RlRGVjb3JhdG9yIiBjb250YWlubWVudD0iZmFsc2UiCisJICovCisJRUxpc3Q8Tm9kZURlY29yYXRvcj4gZ2V0Tm9kZURlY29yYXRvcnMoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERlY29yYXRvcn1zIHRoYXQgZGVjb3JhdGUgdGhlCisJICogICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2V9cyBpbiB0aGUgY2Fub25pY2FsIHtAbGluayBHcmFwaH0uCisJICogCisJICogQG1vZGVsIHR5cGU9IkVkZ2VEZWNvcmF0b3IiIGNvbnRhaW5tZW50PSJmYWxzZSIKKwkgKi8KKwlFTGlzdDxFZGdlRGVjb3JhdG9yPiBnZXRFZGdlRGVjb3JhdG9ycygpOworCisJLyoqCisJICpSZWN1cnNpdmVseSBwcm9jZXNzIGFueSBtb2RlbHMgdGhpcyBtb2RlbCBjb250YWlucyB0byBvYnRhaW4gdGhlaXIKKwkgKiBjYW5vbmljYWwge0BsaW5rIEdyYXBofXMuIENvbWJpbmUgdGhlc2Ugd2l0aCBhbnkgZ3JhcGhzIHRoaXMgbW9kZWwKKwkgKiBjb250YWlucyB0byBtYWtlIG9uZSBhZ2dyZWdhdGUge0BsaW5rIEdyYXBofS4gVGhlbiB0aGlzCisJICogPGNvZGU+bW9kZWw8L2NvZGU+J3Mge0BsaW5rIERlY29yYXRvcn1zIGRlY29yYXRlIHRoZSBncmFwaC4KKwkgKiAKKwkgKiBAcGFyYW0gdXJpCisJICogICAgICAgICAgICB0aGUge0BsaW5rIFVSSX0gb2YgdGhlIG5ld2x5IGNyZWF0ZWQgY2Fub25pY2FsIGdyYXBoCisJICogQHBhcmFtIHBhcmVudEZpbHRlcgorCSAqIEBwYXJhbSB0aW1lCisJICogQHJldHVybiB0aGUgY2Fub25pY2FsIGdyYXBoIG9mIHRoZSBtb2RlbAorCSAqIAorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKiAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgorCSAqICAgICAgICAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJR3JhcGggZ2V0Q2Fub25pY2FsR3JhcGgoVVJJIHVyaSwgSWRlbnRpZmlhYmxlRmlsdGVyIGZpbHRlciwgU1RFTVRpbWUgdGltZSk7CisKKworCS8qKgorCSAqIFByZXBhcmUgdGhlIG1vZGVsIGlmIG5lZWRlZAorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHByZXBhcmUoU1RFTVRpbWUgdGltZSk7CisKK30gLy8gTW9kZWwKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvTW9kZWxGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9Nb2RlbEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTgwNTViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvTW9kZWxGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw5NiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBNb2RlbEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7CisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlNb2RlbEZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTW9kZWxGYWN0b3J5SW1wbC5pbml0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlY29yYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVjb3JhdG9yPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEZWNvcmF0b3IgY3JlYXRlRGVjb3JhdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVkZ2UgRGVjb3JhdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FZGdlIERlY29yYXRvcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRWRnZURlY29yYXRvciBjcmVhdGVFZGdlRGVjb3JhdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyYXBoIERlY29yYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JhcGggRGVjb3JhdG9yPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlHcmFwaERlY29yYXRvciBjcmVhdGVHcmFwaERlY29yYXRvcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Nb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TW9kZWw8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCU1vZGVsIGNyZWF0ZU1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5vZGUgRGVjb3JhdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Ob2RlIERlY29yYXRvcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTm9kZURlY29yYXRvciBjcmVhdGVOb2RlRGVjb3JhdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNURU0gVGltZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U1RFTSBUaW1lPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTVEVNVGltZSBjcmVhdGVTVEVNVGltZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlNb2RlbFBhY2thZ2UgZ2V0TW9kZWxQYWNrYWdlKCk7CisKK30gLy9Nb2RlbEZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL01vZGVsUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvTW9kZWxQYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4NjY4ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL01vZGVsUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsOTc4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbEZhY3RvcnkKKyAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIE1vZGVsUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTkFNRSA9ICJtb2RlbCI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsLmVjb3JlIjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbCI7CisKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCU1vZGVsUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbCA8ZW0+RGVjb3JhdG9yPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXREZWNvcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgREVDT1JBVE9SID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERUNPUkFUT1JfX1VSSSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERUNPUkFUT1JfX1RZUEVfVVJJID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVDT1JBVE9SX19EVUJMSU5fQ09SRSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERUNPUkFUT1JfX0xBQkVMU19UT19VUERBVEUgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERUNPUkFUT1JfX0dSQVBIID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFQ09SQVRPUl9fRU5BQkxFRCA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFQ09SQVRPUl9fR1JBUEhfREVDT1JBVEVEID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERUNPUkFUT1JfX1BST0dSRVNTID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVjb3JhdG9yPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFQ09SQVRPUl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkVkZ2VEZWNvcmF0b3JJbXBsIDxlbT5FZGdlIERlY29yYXRvcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkVkZ2VEZWNvcmF0b3JJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldEVkZ2VEZWNvcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgRURHRV9ERUNPUkFUT1IgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVER0VfREVDT1JBVE9SX19VUkkgPSBERUNPUkFUT1JfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVER0VfREVDT1JBVE9SX19UWVBFX1VSSSA9IERFQ09SQVRPUl9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFREdFX0RFQ09SQVRPUl9fRFVCTElOX0NPUkUgPSBERUNPUkFUT1JfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVER0VfREVDT1JBVE9SX19MQUJFTFNfVE9fVVBEQVRFID0gREVDT1JBVE9SX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVER0VfREVDT1JBVE9SX19HUkFQSCA9IERFQ09SQVRPUl9fR1JBUEg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVER0VfREVDT1JBVE9SX19FTkFCTEVEID0gREVDT1JBVE9SX19FTkFCTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVER0VfREVDT1JBVE9SX19HUkFQSF9ERUNPUkFURUQgPSBERUNPUkFUT1JfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVER0VfREVDT1JBVE9SX19QUk9HUkVTUyA9IERFQ09SQVRPUl9fUFJPR1JFU1M7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RWRnZSBEZWNvcmF0b3I8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRURHRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCA9IERFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuR3JhcGhEZWNvcmF0b3JJbXBsIDxlbT5HcmFwaCBEZWNvcmF0b3I8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5HcmFwaERlY29yYXRvckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0R3JhcGhEZWNvcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgR1JBUEhfREVDT1JBVE9SID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUkFQSF9ERUNPUkFUT1JfX1VSSSA9IERFQ09SQVRPUl9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR1JBUEhfREVDT1JBVE9SX19UWVBFX1VSSSA9IERFQ09SQVRPUl9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUkFQSF9ERUNPUkFUT1JfX0RVQkxJTl9DT1JFID0gREVDT1JBVE9SX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUkFQSF9ERUNPUkFUT1JfX0xBQkVMU19UT19VUERBVEUgPSBERUNPUkFUT1JfX0xBQkVMU19UT19VUERBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGg8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR1JBUEhfREVDT1JBVE9SX19HUkFQSCA9IERFQ09SQVRPUl9fR1JBUEg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdSQVBIX0RFQ09SQVRPUl9fRU5BQkxFRCA9IERFQ09SQVRPUl9fRU5BQkxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUkFQSF9ERUNPUkFUT1JfX0dSQVBIX0RFQ09SQVRFRCA9IERFQ09SQVRPUl9fR1JBUEhfREVDT1JBVEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2dyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR1JBUEhfREVDT1JBVE9SX19QUk9HUkVTUyA9IERFQ09SQVRPUl9fUFJPR1JFU1M7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3JhcGggRGVjb3JhdG9yPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdSQVBIX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UID0gREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5Nb2RlbEltcGwgPGVtPk1vZGVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTW9kZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldE1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IE1PREVMID0gMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNT0RFTF9fVVJJID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1PREVMX19UWVBFX1VSSSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1PREVMX19EVUJMSU5fQ09SRSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb2RlbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1PREVMX19NT0RFTFMgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1PREVMX19HUkFQSFMgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNT0RFTF9fR1JBUEhfREVDT1JBVE9SUyA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGUgRGVjb3JhdG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTU9ERUxfX05PREVfREVDT1JBVE9SUyA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVkZ2UgRGVjb3JhdG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTU9ERUxfX0VER0VfREVDT1JBVE9SUyA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1vZGVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1PREVMX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTm9kZURlY29yYXRvckltcGwgPGVtPk5vZGUgRGVjb3JhdG9yPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTm9kZURlY29yYXRvckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Tm9kZURlY29yYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBOT0RFX0RFQ09SQVRPUiA9IDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTk9ERV9ERUNPUkFUT1JfX1VSSSA9IERFQ09SQVRPUl9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTk9ERV9ERUNPUkFUT1JfX1RZUEVfVVJJID0gREVDT1JBVE9SX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE5PREVfREVDT1JBVE9SX19EVUJMSU5fQ09SRSA9IERFQ09SQVRPUl9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWxzIFRvIFVwZGF0ZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTk9ERV9ERUNPUkFUT1JfX0xBQkVMU19UT19VUERBVEUgPSBERUNPUkFUT1JfX0xBQkVMU19UT19VUERBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGg8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTk9ERV9ERUNPUkFUT1JfX0dSQVBIID0gREVDT1JBVE9SX19HUkFQSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTk9ERV9ERUNPUkFUT1JfX0VOQUJMRUQgPSBERUNPUkFUT1JfX0VOQUJMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRGVjb3JhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTk9ERV9ERUNPUkFUT1JfX0dSQVBIX0RFQ09SQVRFRCA9IERFQ09SQVRPUl9fR1JBUEhfREVDT1JBVEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2dyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTk9ERV9ERUNPUkFUT1JfX1BST0dSRVNTID0gREVDT1JBVE9SX19QUk9HUkVTUzsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Ob2RlIERlY29yYXRvcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBOT0RFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UID0gREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZhLmxhbmcuQ29tcGFyYWJsZSA8ZW0+Q29tcGFyYWJsZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldENvbXBhcmFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQ09NUEFSQUJMRSA9IDY7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29tcGFyYWJsZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT01QQVJBQkxFX0ZFQVRVUkVfQ09VTlQgPSAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5TVEVNVGltZUltcGwgPGVtPlNURU0gVGltZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLlNURU1UaW1lSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRTVEVNVGltZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTVEVNX1RJTUUgPSA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEVNX1RJTUVfX1RJTUUgPSBDT01QQVJBQkxFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNURU0gVGltZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEVNX1RJTUVfRkVBVFVSRV9DT1VOVCA9IENPTVBBUkFCTEVfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlVSSTwvZW0+JyBkYXRhIHR5cGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0VVJJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFVSSSA9IDc7CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IgPGVtPkRlY29yYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWNvcmF0b3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXREZWNvcmF0b3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yI2dldExhYmVsc1RvVXBkYXRlIDxlbT5MYWJlbHMgVG8gVXBkYXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5MYWJlbHMgVG8gVXBkYXRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvciNnZXRMYWJlbHNUb1VwZGF0ZSgpCisJICogQHNlZSAjZ2V0RGVjb3JhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXREZWNvcmF0b3JfTGFiZWxzVG9VcGRhdGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IjZ2V0R3JhcGggPGVtPkdyYXBoPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkdyYXBoPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvciNnZXRHcmFwaCgpCisJICogQHNlZSAjZ2V0RGVjb3JhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXREZWNvcmF0b3JfR3JhcGgoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvciNpc0VuYWJsZWQgPGVtPkVuYWJsZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbmFibGVkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvciNpc0VuYWJsZWQoKQorCSAqIEBzZWUgI2dldERlY29yYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RGVjb3JhdG9yX0VuYWJsZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvciNpc0dyYXBoRGVjb3JhdGVkIDxlbT5HcmFwaCBEZWNvcmF0ZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HcmFwaCBEZWNvcmF0ZWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yI2lzR3JhcGhEZWNvcmF0ZWQoKQorCSAqIEBzZWUgI2dldERlY29yYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RGVjb3JhdG9yX0dyYXBoRGVjb3JhdGVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IjZ2V0UHJvZ3Jlc3MgPGVtPlByb2dyZXNzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvZ3Jlc3M8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yI2dldFByb2dyZXNzKCkKKwkgKiBAc2VlICNnZXREZWNvcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERlY29yYXRvcl9Qcm9ncmVzcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkVkZ2VEZWNvcmF0b3IgPGVtPkVkZ2UgRGVjb3JhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVkZ2UgRGVjb3JhdG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkVkZ2VEZWNvcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEVkZ2VEZWNvcmF0b3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5HcmFwaERlY29yYXRvciA8ZW0+R3JhcGggRGVjb3JhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkdyYXBoIERlY29yYXRvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5HcmFwaERlY29yYXRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0R3JhcGhEZWNvcmF0b3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbCA8ZW0+TW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TW9kZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldE1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsI2dldE1vZGVscyA8ZW0+TW9kZWxzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Nb2RlbHM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWwjZ2V0TW9kZWxzKCkKKwkgKiBAc2VlICNnZXRNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0TW9kZWxfTW9kZWxzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsI2dldEdyYXBocyA8ZW0+R3JhcGhzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5HcmFwaHM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWwjZ2V0R3JhcGhzKCkKKwkgKiBAc2VlICNnZXRNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0TW9kZWxfR3JhcGhzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsI2dldEdyYXBoRGVjb3JhdG9ycyA8ZW0+R3JhcGggRGVjb3JhdG9yczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+R3JhcGggRGVjb3JhdG9yczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbCNnZXRHcmFwaERlY29yYXRvcnMoKQorCSAqIEBzZWUgI2dldE1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRNb2RlbF9HcmFwaERlY29yYXRvcnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWwjZ2V0Tm9kZURlY29yYXRvcnMgPGVtPk5vZGUgRGVjb3JhdG9yczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Tm9kZSBEZWNvcmF0b3JzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsI2dldE5vZGVEZWNvcmF0b3JzKCkKKwkgKiBAc2VlICNnZXRNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0TW9kZWxfTm9kZURlY29yYXRvcnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWwjZ2V0RWRnZURlY29yYXRvcnMgPGVtPkVkZ2UgRGVjb3JhdG9yczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWRnZSBEZWNvcmF0b3JzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsI2dldEVkZ2VEZWNvcmF0b3JzKCkKKwkgKiBAc2VlICNnZXRNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0TW9kZWxfRWRnZURlY29yYXRvcnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yIDxlbT5Ob2RlIERlY29yYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Ob2RlIERlY29yYXRvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXROb2RlRGVjb3JhdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUgPGVtPlNURU0gVGltZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TVEVNIFRpbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNURU1UaW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSNnZXRUaW1lIDxlbT5UaW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGltZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSNnZXRUaW1lKCkKKwkgKiBAc2VlICNnZXRTVEVNVGltZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U1RFTVRpbWVfVGltZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YS5sYW5nLkNvbXBhcmFibGUgPGVtPkNvbXBhcmFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4KKwkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlCisJICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5Db21wYXJhYmxlIiB0eXBlUGFyYW1ldGVycz0iVCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldENvbXBhcmFibGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIDxlbT5VUkk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlVSSTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkKKwkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRURhdGFUeXBlIGdldFVSSSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTW9kZWxGYWN0b3J5IGdldE1vZGVsRmFjdG9yeSgpOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50CisJICogPHVsPgorCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisJICogPC91bD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50ZXJmYWNlIExpdGVyYWxzICB7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbCA8ZW0+RGVjb3JhdG9yPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0RGVjb3JhdG9yKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIERFQ09SQVRPUiA9IGVJTlNUQU5DRS5nZXREZWNvcmF0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIERFQ09SQVRPUl9fTEFCRUxTX1RPX1VQREFURSA9IGVJTlNUQU5DRS5nZXREZWNvcmF0b3JfTGFiZWxzVG9VcGRhdGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIERFQ09SQVRPUl9fR1JBUEggPSBlSU5TVEFOQ0UuZ2V0RGVjb3JhdG9yX0dyYXBoKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREVDT1JBVE9SX19FTkFCTEVEID0gZUlOU1RBTkNFLmdldERlY29yYXRvcl9FbmFibGVkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBERUNPUkFUT1JfX0dSQVBIX0RFQ09SQVRFRCA9IGVJTlNUQU5DRS5nZXREZWNvcmF0b3JfR3JhcGhEZWNvcmF0ZWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2dyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREVDT1JBVE9SX19QUk9HUkVTUyA9IGVJTlNUQU5DRS5nZXREZWNvcmF0b3JfUHJvZ3Jlc3MoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkVkZ2VEZWNvcmF0b3JJbXBsIDxlbT5FZGdlIERlY29yYXRvcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkVkZ2VEZWNvcmF0b3JJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRFZGdlRGVjb3JhdG9yKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIEVER0VfREVDT1JBVE9SID0gZUlOU1RBTkNFLmdldEVkZ2VEZWNvcmF0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkdyYXBoRGVjb3JhdG9ySW1wbCA8ZW0+R3JhcGggRGVjb3JhdG9yPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuR3JhcGhEZWNvcmF0b3JJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRHcmFwaERlY29yYXRvcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBHUkFQSF9ERUNPUkFUT1IgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhEZWNvcmF0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLk1vZGVsSW1wbCA8ZW0+TW9kZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5Nb2RlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldE1vZGVsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIE1PREVMID0gZUlOU1RBTkNFLmdldE1vZGVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2RlbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIE1PREVMX19NT0RFTFMgPSBlSU5TVEFOQ0UuZ2V0TW9kZWxfTW9kZWxzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HcmFwaHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIE1PREVMX19HUkFQSFMgPSBlSU5TVEFOQ0UuZ2V0TW9kZWxfR3JhcGhzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBNT0RFTF9fR1JBUEhfREVDT1JBVE9SUyA9IGVJTlNUQU5DRS5nZXRNb2RlbF9HcmFwaERlY29yYXRvcnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vZGUgRGVjb3JhdG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgTU9ERUxfX05PREVfREVDT1JBVE9SUyA9IGVJTlNUQU5DRS5nZXRNb2RlbF9Ob2RlRGVjb3JhdG9ycygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWRnZSBEZWNvcmF0b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBNT0RFTF9fRURHRV9ERUNPUkFUT1JTID0gZUlOU1RBTkNFLmdldE1vZGVsX0VkZ2VEZWNvcmF0b3JzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5Ob2RlRGVjb3JhdG9ySW1wbCA8ZW0+Tm9kZSBEZWNvcmF0b3I8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5Ob2RlRGVjb3JhdG9ySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Tm9kZURlY29yYXRvcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBOT0RFX0RFQ09SQVRPUiA9IGVJTlNUQU5DRS5nZXROb2RlRGVjb3JhdG9yKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5TVEVNVGltZUltcGwgPGVtPlNURU0gVGltZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLlNURU1UaW1lSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0U1RFTVRpbWUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU1RFTV9USU1FID0gZUlOU1RBTkNFLmdldFNURU1UaW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU1RFTV9USU1FX19USU1FID0gZUlOU1RBTkNFLmdldFNURU1UaW1lX1RpbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIGphdmEubGFuZy5Db21wYXJhYmxlIDxlbT5Db21wYXJhYmxlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldENvbXBhcmFibGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQ09NUEFSQUJMRSA9IGVJTlNUQU5DRS5nZXRDb21wYXJhYmxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5VUkk8L2VtPicgZGF0YSB0eXBlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRVUkkoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRGF0YVR5cGUgVVJJID0gZUlOU1RBTkNFLmdldFVSSSgpOworCisJfQorCit9IC8vTW9kZWxQYWNrYWdlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9Ob2RlRGVjb3JhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9Ob2RlRGVjb3JhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczYTZhMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL05vZGVEZWNvcmF0b3IuamF2YQpAQCAtMCwwICsxLDMwIEBACisvLyBOb2RlRGVjb3JhdG9yLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBBbiA8Y29kZT5HcmFwaERlY29yYXRvcjwvY29kZT4gaXMgYSB7QGxpbmsgRGVjb3JhdG9yfSB0aGF0IHNwZWNpZmljYWxseQorICogbW9kaWZpZXMge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlfXMgYW5kIHRoZWlyCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsfXMuCisgKiAKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGUKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbAorICogQHNlZSBFZGdlRGVjb3JhdG9yCisgKiBAc2VlIEdyYXBoRGVjb3JhdG9yCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVEZWNvcmF0b3IgZXh0ZW5kcyBEZWNvcmF0b3IgeworCS8vIE5vdGhpbmcgeWV0Cit9IC8vIE5vZGVEZWNvcmF0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL1NURU1UaW1lLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9TVEVNVGltZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZjdiNGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9TVEVNVGltZS5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8vIFNURU1UaW1lLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEubGFuZy5Db21wYXJhYmxlOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKKy8qKgorICogQSA8Y29kZT5TVEVNVGltZTwvY29kZT4gaW5zdGFuY2UgcmVwcmVzZW50cyBhIHBvaW50IGluIHRpbWUgaW4gaW4gdGhlIFNURU0KKyAqIHN5c3RlbS4KKyAqIAorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlcgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBTVEVNVGltZSBleHRlbmRzIEVPYmplY3QsIENvbXBhcmFibGU8U1RFTVRpbWU+IHsKKworCS8qKgorCSAqIFRoaXMgaXMgYW4gZW51bWVyYXRpb24gb2YgZGlmZmVyZW50IGNvbW1vbiB0aW1lIHVuaXRzIHdpdGggdGhlaXIgZHVyYXRpb24KKwkgKiBpbiBtaWxsaXNlY29uZHMuCisJICovCisJZW51bSBVbml0cyB7CisJCU1JTExJU0VDT05EKDEpLAorCQlTRUNPTkQoMTAwMCksCisJCU1JTlVURSg2MCoxMDAwKSwgCisJCUhPVVIoNjAqNjAqMTAwMCksIAorCQlEQVkoMjQqNjAqNjAqMTAwMCksCisJCVdFRUsoNyoyNCo2MCo2MCoxMDAwKSwgCisJCVlFQVIoNTIqNyoyNCo2MCo2MCoxMDAwKTsKKwkJcHJpdmF0ZSBpbnQgZHVyYXRpb247CisKKwkJcHJpdmF0ZSBVbml0cyhpbnQgZHVyYXRpb24pIHsKKwkJCXRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBpcyBlcXVpdmFsZW50IHRvIHRoaXMgdGltZSB1bml0LgorCQkgKi8KKwkJcHVibGljIGxvbmcgZ2V0TWlsbGlzZWNvbmRzKCkgeworCQkJcmV0dXJuIGR1cmF0aW9uOworCQl9CisJfTsgLy8gVW5pdHMKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHRpbWUKKwkgKiBAbW9kZWwKKwkgKi8KKwlEYXRlIGdldFRpbWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSNnZXRUaW1lIDxlbT5UaW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGltZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VGltZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VGltZShEYXRlIHZhbHVlKTsKKworCS8qKgorCSAqIEBwYXJhbSB0aW1lSW5jcmVtZW50CisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGUgbmV3IFNURU1UaW1lIGlzIGluIHRoZSBmdXR1cmUuCisJICogQHJldHVybiBhIG5ldyBTVEVNVGltZSB0aGF0IGlzIGEgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbQorCSAqICAgICAgICAgdGhlIGN1cnJlbnQgdGltZS4KKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJU1RFTVRpbWUgYWRkSW5jcmVtZW50KGxvbmcgdGltZUluY3JlbWVudCk7CisKKwkvKioKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwlpbnQgaGFzaENvZGUoKTsKKworCS8qKgorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaik7Cit9IC8vIFNURU1UaW1lCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9pbXBsL0RlY29yYXRvckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL2ltcGwvRGVjb3JhdG9ySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZGE2ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9pbXBsL0RlY29yYXRvckltcGwuamF2YQpAQCAtMCwwICsxLDUzMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5JZGVudGlmaWFibGVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlY29yYXRvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbCNnZXRMYWJlbHNUb1VwZGF0ZSA8ZW0+TGFiZWxzIFRvIFVwZGF0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbCNnZXRHcmFwaCA8ZW0+R3JhcGg8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkRlY29yYXRvckltcGwjaXNFbmFibGVkIDxlbT5FbmFibGVkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5EZWNvcmF0b3JJbXBsI2lzR3JhcGhEZWNvcmF0ZWQgPGVtPkdyYXBoIERlY29yYXRlZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbCNnZXRQcm9ncmVzcyA8ZW0+UHJvZ3Jlc3M8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEZWNvcmF0b3JJbXBsIGV4dGVuZHMgSWRlbnRpZmlhYmxlSW1wbCBpbXBsZW1lbnRzIERlY29yYXRvciB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFiZWxzVG9VcGRhdGUoKSA8ZW0+TGFiZWxzIFRvIFVwZGF0ZTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TGFiZWxzVG9VcGRhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxEeW5hbWljTGFiZWw+IGxhYmVsc1RvVXBkYXRlOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRW5hYmxlZCgpIDxlbT5FbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0VuYWJsZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTkFCTEVEX0VERUZBVUxUID0gdHJ1ZTsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VuYWJsZWQoKSA8ZW0+RW5hYmxlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNFbmFibGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVkID0gRU5BQkxFRF9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHcmFwaERlY29yYXRlZCgpIDxlbT5HcmFwaCBEZWNvcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzR3JhcGhEZWNvcmF0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHUkFQSF9ERUNPUkFURURfRURFRkFVTFQgPSBmYWxzZTsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dyYXBoRGVjb3JhdGVkKCkgPGVtPkdyYXBoIERlY29yYXRlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNHcmFwaERlY29yYXRlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZ3JhcGhEZWNvcmF0ZWQgPSBHUkFQSF9ERUNPUkFURURfRURFRkFVTFQ7CisKKwkKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvZ3Jlc3MoKSA8ZW0+UHJvZ3Jlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFByb2dyZXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBQUk9HUkVTU19FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2dyZXNzKCkgPGVtPlByb2dyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQcm9ncmVzcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBwcm9ncmVzcyA9IFBST0dSRVNTX0VERUZBVUxUOworCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEZWNvcmF0b3JJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5ERUNPUkFUT1I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxEeW5hbWljTGFiZWw+IGdldExhYmVsc1RvVXBkYXRlKCkgeworCQlpZiAobGFiZWxzVG9VcGRhdGUgPT0gbnVsbCkgeworCQkJbGFiZWxzVG9VcGRhdGUgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q8RHluYW1pY0xhYmVsPihEeW5hbWljTGFiZWwuY2xhc3MsIHRoaXMsIE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0xBQkVMU19UT19VUERBVEUsIEdyYXBoUGFja2FnZS5EWU5BTUlDX0xBQkVMX19ERUNPUkFUT1IpOworCQl9CisJCXJldHVybiBsYWJlbHNUb1VwZGF0ZTsKKwl9CisKKwlwcm90ZWN0ZWQgTWFwPEludGVnZXIsIEVMaXN0PER5bmFtaWNMYWJlbD4+IGxhYmVsUGFydGl0aW9uTWFwOworCXByb3RlY3RlZCBpbnQgbnVtVGhyZWFkcyA9IC0xOworCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBwYXJ0aXRpb24gV2hpY2ggcGFydGl0aW9uCisJICogQHBhcmFtIG1heCBNYXggcGFydGl0aW9uCisJICogQGdlbmVyYXRlZCBub3QKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKKwlwdWJsaWMgc3luY2hyb25pemVkIEVMaXN0PER5bmFtaWNMYWJlbD4gIGdldExhYmVsc1RvVXBkYXRlKGludCBwYXJ0aXRpb24sIGludCBtYXgpIHsKKwkJaWYgKGxhYmVsc1RvVXBkYXRlID09IG51bGwpIHsKKwkJCWxhYmVsc1RvVXBkYXRlID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0PER5bmFtaWNMYWJlbD4oRHluYW1pY0xhYmVsLmNsYXNzLCB0aGlzLCBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19MQUJFTFNfVE9fVVBEQVRFLCBHcmFwaFBhY2thZ2UuRFlOQU1JQ19MQUJFTF9fREVDT1JBVE9SKTsKKwkJfQorCQlpZihtYXggIT0gbnVtVGhyZWFkcykgbGFiZWxQYXJ0aXRpb25NYXAgPSBudWxsOyAvLyBjbGVhciB3aGVuIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBjaGFuZ2VzCisJCW51bVRocmVhZHMgPSBtYXg7CisJCWlmKGxhYmVsUGFydGl0aW9uTWFwICE9IG51bGwgJiYgbGFiZWxQYXJ0aXRpb25NYXAuY29udGFpbnNLZXkocGFydGl0aW9uKSkKKwkJCXJldHVybiBsYWJlbFBhcnRpdGlvbk1hcC5nZXQocGFydGl0aW9uKTsKKwkJCisJCUVMaXN0PER5bmFtaWNMYWJlbD4gdGVtcCA9IG5ldyBCYXNpY0VMaXN0PER5bmFtaWNMYWJlbD4oKTsgCisJCQkKKwkJaW50IHNpemUgPSBsYWJlbHNUb1VwZGF0ZS5zaXplKCk7CisJCWludCBsYWJlbHNQZXJQYXJ0aXRpb24gPSBzaXplIC8gbWF4OworCQlpbnQgc3RhcnQgPSAgcGFydGl0aW9uKmxhYmVsc1BlclBhcnRpdGlvbjsKKwkJaW50IGVuZDsKKwkJaWYocGFydGl0aW9uID09IG1heCAtMSkgZW5kID0gc2l6ZTsgLy8gVGhlIGxhc3QgdGhyZWFkcyBncmFicyBhbGwgbm9kZXMgdW50aWwgdGhlIGxhc3Qgb25lCisJCWVsc2UgZW5kID0gc3RhcnQgKyBsYWJlbHNQZXJQYXJ0aXRpb247CisJCWZvcihpbnQgaT1zdGFydDtpPGVuZDsrK2kpIHRlbXAuYWRkKGxhYmVsc1RvVXBkYXRlLmdldChpKSk7CisJCQorCQlpZihsYWJlbFBhcnRpdGlvbk1hcCA9PSBudWxsKSBsYWJlbFBhcnRpdGlvbk1hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEVMaXN0PER5bmFtaWNMYWJlbD4+KCk7CisJCWxhYmVsUGFydGl0aW9uTWFwLnB1dChwYXJ0aXRpb24sIHRlbXApOworCQlyZXR1cm4gdGVtcDsKKwl9CisJCisJLyoqCisJICogUHJlcGFyZSB0aGUgZGVjb3JhdG9yLiBBIHN1YmNsYXNzIG5lZWRzIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmCisJICogcHJlLXByb2Nlc3Npbmcgc3RlcHMgYXJlIG5lY2Vzc2FyeSBiZWZvcmUgdGhlIGRlY29yYXRvciBpcyBiZWluZyB1c2VkCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmVwYXJlKE1vZGVsIG1vZGVsLCBTVEVNVGltZSB0aW1lKSB7CisJCS8vIE5vdGhpbmcgdG8gZG8KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR3JhcGggZ2V0R3JhcGgoKSB7CisJCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgIT0gTW9kZWxQYWNrYWdlLkRFQ09SQVRPUl9fR1JBUEgpIHJldHVybiBudWxsOworCQlyZXR1cm4gKEdyYXBoKWVDb250YWluZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRHcmFwaChHcmFwaCBuZXdHcmFwaCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3R3JhcGgsIE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0dSQVBILCBtc2dzKTsKKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0R3JhcGgoR3JhcGggbmV3R3JhcGgpIHsKKwkJaWYgKG5ld0dyYXBoICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEKCkgIT0gTW9kZWxQYWNrYWdlLkRFQ09SQVRPUl9fR1JBUEggJiYgbmV3R3JhcGggIT0gbnVsbCkpIHsKKwkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdHcmFwaCkpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCisJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7CisJCQlpZiAobmV3R3JhcGggIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3R3JhcGgpLmVJbnZlcnNlQWRkKHRoaXMsIEdyYXBoUGFja2FnZS5HUkFQSF9fREVDT1JBVE9SUywgR3JhcGguY2xhc3MsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0R3JhcGgobmV3R3JhcGgsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkRFQ09SQVRPUl9fR1JBUEgsIG5ld0dyYXBoLCBuZXdHcmFwaCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKwkJcmV0dXJuIGVuYWJsZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIG5ld0VuYWJsZWQpIHsKKwkJYm9vbGVhbiBvbGRFbmFibGVkID0gZW5hYmxlZDsKKwkJZW5hYmxlZCA9IG5ld0VuYWJsZWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0VOQUJMRUQsIG9sZEVuYWJsZWQsIGVuYWJsZWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0dyYXBoRGVjb3JhdGVkKCkgeworCQlyZXR1cm4gZ3JhcGhEZWNvcmF0ZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0R3JhcGhEZWNvcmF0ZWQoYm9vbGVhbiBuZXdHcmFwaERlY29yYXRlZCkgeworCQlib29sZWFuIG9sZEdyYXBoRGVjb3JhdGVkID0gZ3JhcGhEZWNvcmF0ZWQ7CisJCWdyYXBoRGVjb3JhdGVkID0gbmV3R3JhcGhEZWNvcmF0ZWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0dSQVBIX0RFQ09SQVRFRCwgb2xkR3JhcGhEZWNvcmF0ZWQsIGdyYXBoRGVjb3JhdGVkKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRQcm9ncmVzcygpIHsKKwkJcmV0dXJuIHByb2dyZXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzKGRvdWJsZSBuZXdQcm9ncmVzcykgeworCQlkb3VibGUgb2xkUHJvZ3Jlc3MgPSBwcm9ncmVzczsKKwkJcHJvZ3Jlc3MgPSBuZXdQcm9ncmVzczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkRFQ09SQVRPUl9fUFJPR1JFU1MsIG9sZFByb2dyZXNzLCBwcm9ncmVzcykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBkZWNvcmF0ZUdyYXBoKFNURU1UaW1lIHRpbWUpIHsKKwkJQ29yZVBsdWdpbi5sb2dFcnJvcigiZGVjb3JhdGVHcmFwaCgpIG5vdCBpbXBsZW1lbnRlZCBpbiBcIiIrCisJCQkJZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCkKKwkJCQkrICJcIiBvZiB0eXBlIFwiIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkKKwkJCQkrICJcIiIsIG51bGwpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0ZUxhYmVscyhTVEVNVGltZSB0aW1lLCBsb25nIHRpbWVyUGVyaW9kLCBpbnQgY3ljbGUpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgcmVzZXRMYWJlbHMoKSB7CisJCXNldEVuYWJsZWQoRU5BQkxFRF9FREVGQVVMVCk7CisJCXNldEdyYXBoRGVjb3JhdGVkKEdSQVBIX0RFQ09SQVRFRF9FREVGQVVMVCk7CisJCWZvciAoZmluYWwgSXRlcmF0b3I8RHluYW1pY0xhYmVsPiBsYWJlbEl0ZXIgPSBnZXRMYWJlbHNUb1VwZGF0ZSgpCisJCQkJLml0ZXJhdG9yKCk7IGxhYmVsSXRlci5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBEeW5hbWljTGFiZWwgZHluYW1pY0xhYmVsID0gbGFiZWxJdGVyLm5leHQoKTsKKwkJCWR5bmFtaWNMYWJlbC5yZXNldCgpOworCQl9CisJfSAvLyByZXNldExhYmVscworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLkRFQ09SQVRPUl9fTEFCRUxTX1RPX1VQREFURToKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pKEludGVybmFsRUxpc3Q8Pz4pZ2V0TGFiZWxzVG9VcGRhdGUoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19HUkFQSDoKKwkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKKwkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7CisJCQkJcmV0dXJuIGJhc2ljU2V0R3JhcGgoKEdyYXBoKW90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19MQUJFTFNfVE9fVVBEQVRFOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TGFiZWxzVG9VcGRhdGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19HUkFQSDoKKwkJCQlyZXR1cm4gYmFzaWNTZXRHcmFwaChudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKCkpIHsKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLkRFQ09SQVRPUl9fR1JBUEg6CisJCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEdyYXBoUGFja2FnZS5HUkFQSF9fREVDT1JBVE9SUywgR3JhcGguY2xhc3MsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19MQUJFTFNfVE9fVVBEQVRFOgorCQkJCXJldHVybiBnZXRMYWJlbHNUb1VwZGF0ZSgpOworCQkJY2FzZSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19HUkFQSDoKKwkJCQlyZXR1cm4gZ2V0R3JhcGgoKTsKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLkRFQ09SQVRPUl9fRU5BQkxFRDoKKwkJCQlyZXR1cm4gaXNFbmFibGVkKCk7CisJCQljYXNlIE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0dSQVBIX0RFQ09SQVRFRDoKKwkJCQlyZXR1cm4gaXNHcmFwaERlY29yYXRlZCgpOworCQkJY2FzZSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19QUk9HUkVTUzoKKwkJCQlyZXR1cm4gZ2V0UHJvZ3Jlc3MoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0xBQkVMU19UT19VUERBVEU6CisJCQkJZ2V0TGFiZWxzVG9VcGRhdGUoKS5jbGVhcigpOworCQkJCWdldExhYmVsc1RvVXBkYXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEeW5hbWljTGFiZWw+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0dSQVBIOgorCQkJCXNldEdyYXBoKChHcmFwaCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19FTkFCTEVEOgorCQkJCXNldEVuYWJsZWQoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLkRFQ09SQVRPUl9fR1JBUEhfREVDT1JBVEVEOgorCQkJCXNldEdyYXBoRGVjb3JhdGVkKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX1BST0dSRVNTOgorCQkJCXNldFByb2dyZXNzKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19MQUJFTFNfVE9fVVBEQVRFOgorCQkJCWdldExhYmVsc1RvVXBkYXRlKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0dSQVBIOgorCQkJCXNldEdyYXBoKChHcmFwaCludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0VOQUJMRUQ6CisJCQkJc2V0RW5hYmxlZChFTkFCTEVEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0dSQVBIX0RFQ09SQVRFRDoKKwkJCQlzZXRHcmFwaERlY29yYXRlZChHUkFQSF9ERUNPUkFURURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLkRFQ09SQVRPUl9fUFJPR1JFU1M6CisJCQkJc2V0UHJvZ3Jlc3MoUFJPR1JFU1NfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLkRFQ09SQVRPUl9fTEFCRUxTX1RPX1VQREFURToKKwkJCQlyZXR1cm4gbGFiZWxzVG9VcGRhdGUgIT0gbnVsbCAmJiAhbGFiZWxzVG9VcGRhdGUuaXNFbXB0eSgpOworCQkJY2FzZSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19HUkFQSDoKKwkJCQlyZXR1cm4gZ2V0R3JhcGgoKSAhPSBudWxsOworCQkJY2FzZSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19FTkFCTEVEOgorCQkJCXJldHVybiBlbmFibGVkICE9IEVOQUJMRURfRURFRkFVTFQ7CisJCQljYXNlIE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0dSQVBIX0RFQ09SQVRFRDoKKwkJCQlyZXR1cm4gZ3JhcGhEZWNvcmF0ZWQgIT0gR1JBUEhfREVDT1JBVEVEX0VERUZBVUxUOworCQkJY2FzZSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19QUk9HUkVTUzoKKwkJCQlyZXR1cm4gcHJvZ3Jlc3MgIT0gUFJPR1JFU1NfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChlbmFibGVkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGVuYWJsZWQpOworCQlyZXN1bHQuYXBwZW5kKCIsIGdyYXBoRGVjb3JhdGVkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGdyYXBoRGVjb3JhdGVkKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBwcm9ncmVzczogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChwcm9ncmVzcyk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb21tb24uaW1wbC5JZGVudGlmaWFibGVJbXBsI3NhbmUoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2FuZSgpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHN1cGVyLnNhbmUoKTsKKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxEeW5hbWljTGFiZWw+IGxhYmVsSXRlciA9IGdldExhYmVsc1RvVXBkYXRlKCkuaXRlcmF0b3IoKTsgbGFiZWxJdGVyCisJCQkJLmhhc05leHQoKQorCQkJCSYmIHJldFZhbHVlOykgeworCQkJZmluYWwgTGFiZWwgbGFiZWwgPSBsYWJlbEl0ZXIubmV4dCgpOworCisJCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIGxhYmVsLnNhbmUoKTsKKwkJCWFzc2VydCByZXRWYWx1ZTsKKwkJfQorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHNhbmUKK30gLy8gRGVjb3JhdG9ySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvaW1wbC9FZGdlRGVjb3JhdG9ySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvaW1wbC9FZGdlRGVjb3JhdG9ySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhY2E1OGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9pbXBsL0VkZ2VEZWNvcmF0b3JJbXBsLmphdmEKQEAgLTAsMCArMSw1NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRWRnZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FZGdlIERlY29yYXRvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEVkZ2VEZWNvcmF0b3JJbXBsIGV4dGVuZHMgRGVjb3JhdG9ySW1wbCBpbXBsZW1lbnRzIEVkZ2VEZWNvcmF0b3IgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRWRnZURlY29yYXRvckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkVER0VfREVDT1JBVE9SOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5tb2RlbC5pbXBsLkRlY29yYXRvckltcGwjc2FuZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzYW5lKCkgeworCQlib29sZWFuIHJldFZhbHVlID0gc3VwZXIuc2FuZSgpOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHNhbmUKKworfSAvLyBFZGdlRGVjb3JhdG9ySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvaW1wbC9HcmFwaERlY29yYXRvckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL2ltcGwvR3JhcGhEZWNvcmF0b3JJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiMGZlZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL2ltcGwvR3JhcGhEZWNvcmF0b3JJbXBsLmphdmEKQEAgLTAsMCArMSw1NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuR3JhcGhEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggRGVjb3JhdG9yPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR3JhcGhEZWNvcmF0b3JJbXBsIGV4dGVuZHMgRGVjb3JhdG9ySW1wbCBpbXBsZW1lbnRzIEdyYXBoRGVjb3JhdG9yIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEdyYXBoRGVjb3JhdG9ySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfREVDT1JBVE9SOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5tb2RlbC5pbXBsLkRlY29yYXRvckltcGwjc2FuZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzYW5lKCkgeworCQlib29sZWFuIHJldFZhbHVlID0gc3VwZXIuc2FuZSgpOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHNhbmUKK30gLy8gR3JhcGhEZWNvcmF0b3JJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9pbXBsL01vZGVsRmFjdG9yeUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL2ltcGwvTW9kZWxGYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MTRlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9pbXBsL01vZGVsRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDIxNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5FZGdlRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5HcmFwaERlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNb2RlbEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgTW9kZWxGYWN0b3J5IHsKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBNb2RlbEZhY3RvcnkgaW5pdCgpIHsKKwkJdHJ5IHsKKwkJCU1vZGVsRmFjdG9yeSB0aGVNb2RlbEZhY3RvcnkgPSAoTW9kZWxGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC5lY29yZSIpOyAvLyROT04tTkxTLTEkIAorCQkJaWYgKHRoZU1vZGVsRmFjdG9yeSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoZU1vZGVsRmFjdG9yeTsKKwkJCX0KKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwkJcmV0dXJuIG5ldyBNb2RlbEZhY3RvcnlJbXBsKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTW9kZWxGYWN0b3J5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgeworCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SOiByZXR1cm4gY3JlYXRlRGVjb3JhdG9yKCk7CisJCQljYXNlIE1vZGVsUGFja2FnZS5FREdFX0RFQ09SQVRPUjogcmV0dXJuIGNyZWF0ZUVkZ2VEZWNvcmF0b3IoKTsKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLkdSQVBIX0RFQ09SQVRPUjogcmV0dXJuIGNyZWF0ZUdyYXBoRGVjb3JhdG9yKCk7CisJCQljYXNlIE1vZGVsUGFja2FnZS5NT0RFTDogcmV0dXJuIGNyZWF0ZU1vZGVsKCk7CisJCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUjogcmV0dXJuIGNyZWF0ZU5vZGVEZWNvcmF0b3IoKTsKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLlNURU1fVElNRTogcmV0dXJuIGNyZWF0ZVNURU1UaW1lKCk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLlVSSToKKwkJCQlyZXR1cm4gY3JlYXRlVVJJRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLlVSSToKKwkJCQlyZXR1cm4gY29udmVydFVSSVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERlY29yYXRvciBjcmVhdGVEZWNvcmF0b3IoKSB7CisJCURlY29yYXRvckltcGwgZGVjb3JhdG9yID0gbmV3IERlY29yYXRvckltcGwoKTsKKwkJcmV0dXJuIGRlY29yYXRvcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRnZURlY29yYXRvciBjcmVhdGVFZGdlRGVjb3JhdG9yKCkgeworCQlFZGdlRGVjb3JhdG9ySW1wbCBlZGdlRGVjb3JhdG9yID0gbmV3IEVkZ2VEZWNvcmF0b3JJbXBsKCk7CisJCXJldHVybiBlZGdlRGVjb3JhdG9yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHcmFwaERlY29yYXRvciBjcmVhdGVHcmFwaERlY29yYXRvcigpIHsKKwkJR3JhcGhEZWNvcmF0b3JJbXBsIGdyYXBoRGVjb3JhdG9yID0gbmV3IEdyYXBoRGVjb3JhdG9ySW1wbCgpOworCQlyZXR1cm4gZ3JhcGhEZWNvcmF0b3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1vZGVsIGNyZWF0ZU1vZGVsKCkgeworCQlNb2RlbEltcGwgbW9kZWwgPSBuZXcgTW9kZWxJbXBsKCk7CisJCXJldHVybiBtb2RlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm9kZURlY29yYXRvciBjcmVhdGVOb2RlRGVjb3JhdG9yKCkgeworCQlOb2RlRGVjb3JhdG9ySW1wbCBub2RlRGVjb3JhdG9yID0gbmV3IE5vZGVEZWNvcmF0b3JJbXBsKCk7CisJCXJldHVybiBub2RlRGVjb3JhdG9yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTVEVNVGltZSBjcmVhdGVTVEVNVGltZSgpIHsKKwkJU1RFTVRpbWVJbXBsIHN0ZW1UaW1lID0gbmV3IFNURU1UaW1lSW1wbCgpOworCQlyZXR1cm4gc3RlbVRpbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgVVJJIGNyZWF0ZVVSSUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShpbml0aWFsVmFsdWUpOworCX0gLy8gY3JlYXRlVVJJRnJvbVN0cmluZworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRVUklUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOworCX0gLy8gY29udmVydFVSSVRvU3RyaW5nCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTW9kZWxQYWNrYWdlIGdldE1vZGVsUGFja2FnZSgpIHsKKwkJcmV0dXJuIChNb2RlbFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBkZXByZWNhdGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBNb2RlbFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKKwkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0U7CisJfQorCit9IC8vTW9kZWxGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvaW1wbC9Nb2RlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL2ltcGwvTW9kZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5ZDQwMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL2ltcGwvTW9kZWxJbXBsLmphdmEKQEAgLTAsMCArMSw2NTMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZUZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlV0aWxpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5JZGVudGlmaWFibGVGaWx0ZXJJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5JZGVudGlmaWFibGVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguVW5yZXNvbHZlZElkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5FZGdlRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5HcmFwaERlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLmltcGwuU2NlbmFyaW9JbXBsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Nb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTW9kZWxJbXBsI2dldE1vZGVscyA8ZW0+TW9kZWxzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5Nb2RlbEltcGwjZ2V0R3JhcGhzIDxlbT5HcmFwaHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLk1vZGVsSW1wbCNnZXRHcmFwaERlY29yYXRvcnMgPGVtPkdyYXBoIERlY29yYXRvcnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLk1vZGVsSW1wbCNnZXROb2RlRGVjb3JhdG9ycyA8ZW0+Tm9kZSBEZWNvcmF0b3JzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5Nb2RlbEltcGwjZ2V0RWRnZURlY29yYXRvcnMgPGVtPkVkZ2UgRGVjb3JhdG9yczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE1vZGVsSW1wbCBleHRlbmRzIElkZW50aWZpYWJsZUltcGwgaW1wbGVtZW50cyBNb2RlbCB7CisKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vZGVscygpIDxlbT5Nb2RlbHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vZGVscygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PE1vZGVsPiBtb2RlbHM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcmFwaHMoKSA8ZW0+R3JhcGhzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRHcmFwaHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxHcmFwaD4gZ3JhcGhzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JhcGhEZWNvcmF0b3JzKCkgPGVtPkdyYXBoIERlY29yYXRvcnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEdyYXBoRGVjb3JhdG9ycygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PEdyYXBoRGVjb3JhdG9yPiBncmFwaERlY29yYXRvcnM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb2RlRGVjb3JhdG9ycygpIDxlbT5Ob2RlIERlY29yYXRvcnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5vZGVEZWNvcmF0b3JzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8Tm9kZURlY29yYXRvcj4gbm9kZURlY29yYXRvcnM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFZGdlRGVjb3JhdG9ycygpIDxlbT5FZGdlIERlY29yYXRvcnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEVkZ2VEZWNvcmF0b3JzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8RWRnZURlY29yYXRvcj4gZWRnZURlY29yYXRvcnM7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBNb2RlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJCXNldFVSSShTVEVNVVJJLmNyZWF0ZVVSSShVUklfVFlQRV9NT0RFTF9TRUdNRU5UICsgIi8iCisJCQkJKyBTVEVNVVJJLmdlbmVyYXRlVW5pcXVlUGFydCgpKSk7CisJCXNldFR5cGVVUkkoU1RFTVVSSS5NT0RFTF9UWVBFX1VSSSk7CisJfSAvLyBNb2RlbEltcGwKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5NT0RFTDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PE1vZGVsPiBnZXRNb2RlbHMoKSB7CisJCWlmIChtb2RlbHMgPT0gbnVsbCkgeworCQkJbW9kZWxzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxNb2RlbD4oTW9kZWwuY2xhc3MsIHRoaXMsIE1vZGVsUGFja2FnZS5NT0RFTF9fTU9ERUxTKTsKKwkJfQorCQlyZXR1cm4gbW9kZWxzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8R3JhcGg+IGdldEdyYXBocygpIHsKKwkJaWYgKGdyYXBocyA9PSBudWxsKSB7CisJCQlncmFwaHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEdyYXBoPihHcmFwaC5jbGFzcywgdGhpcywgTW9kZWxQYWNrYWdlLk1PREVMX19HUkFQSFMpOworCQl9CisJCXJldHVybiBncmFwaHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxHcmFwaERlY29yYXRvcj4gZ2V0R3JhcGhEZWNvcmF0b3JzKCkgeworCQlpZiAoZ3JhcGhEZWNvcmF0b3JzID09IG51bGwpIHsKKwkJCWdyYXBoRGVjb3JhdG9ycyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8R3JhcGhEZWNvcmF0b3I+KEdyYXBoRGVjb3JhdG9yLmNsYXNzLCB0aGlzLCBNb2RlbFBhY2thZ2UuTU9ERUxfX0dSQVBIX0RFQ09SQVRPUlMpOworCQl9CisJCXJldHVybiBncmFwaERlY29yYXRvcnM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxOb2RlRGVjb3JhdG9yPiBnZXROb2RlRGVjb3JhdG9ycygpIHsKKwkJaWYgKG5vZGVEZWNvcmF0b3JzID09IG51bGwpIHsKKwkJCW5vZGVEZWNvcmF0b3JzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxOb2RlRGVjb3JhdG9yPihOb2RlRGVjb3JhdG9yLmNsYXNzLCB0aGlzLCBNb2RlbFBhY2thZ2UuTU9ERUxfX05PREVfREVDT1JBVE9SUyk7CisJCX0KKwkJcmV0dXJuIG5vZGVEZWNvcmF0b3JzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8RWRnZURlY29yYXRvcj4gZ2V0RWRnZURlY29yYXRvcnMoKSB7CisJCWlmIChlZGdlRGVjb3JhdG9ycyA9PSBudWxsKSB7CisJCQllZGdlRGVjb3JhdG9ycyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RWRnZURlY29yYXRvcj4oRWRnZURlY29yYXRvci5jbGFzcywgdGhpcywgTW9kZWxQYWNrYWdlLk1PREVMX19FREdFX0RFQ09SQVRPUlMpOworCQl9CisJCXJldHVybiBlZGdlRGVjb3JhdG9yczsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiAKKwkgKiBUaGlzIG1ldGhvZCBjb21iaW5lcyBhbGwgb2YgdGhlIGdyYXBoICJmcmFnbWVudHMiIHRvZ2V0aGVyIHRvIG1ha2UgYQorCSAqIGdyYXBoIHN1aXRhYmxlIGZvciBzaW11bGF0aW9uLgorCSAqIAorCSAqIAorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIEdyYXBoIGdldENhbm9uaWNhbEdyYXBoKGZpbmFsIFVSSSB1cmksIElkZW50aWZpYWJsZUZpbHRlciBwYXJlbnRGaWx0ZXIsIFNURU1UaW1lIHRpbWUpIHsKKwkJSWRlbnRpZmlhYmxlRmlsdGVySW1wbCBfcGFyZW50ZmlsdGVyID0gKElkZW50aWZpYWJsZUZpbHRlckltcGwpcGFyZW50RmlsdGVyOworCQlmaW5hbCBHcmFwaCByZXRWYWx1ZSA9IEdyYXBoRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGgoKTsKKwkJcmV0VmFsdWUuc2V0VVJJKHVyaSk7CisKKwkJSWRlbnRpZmlhYmxlRmlsdGVySW1wbCBteUZpbHRlciA9IG5ldyBJZGVudGlmaWFibGVGaWx0ZXJJbXBsKHRoaXMuZ2V0RHVibGluQ29yZSgpLmdldENvdmVyYWdlKCkpOworCQlpZihwYXJlbnRGaWx0ZXIgIT0gbnVsbClteUZpbHRlci5yZXN0cmljdChfcGFyZW50ZmlsdGVyKTsJCisJCQorCQkvLyBCYXNpY2FsbHksIHdlIGl0ZXJhdGUgdGhyb3VnaCBlYWNoIG9mIHRoZSBtb2RlbHMgZ2V0dGluZyB0aGVpcgorCQkvLyBjYW5vbmljYWwgZ3JhcGhzIGFuZCB0aGVuIG1lcmdlIHRoZW0gdG9nZXRoZXIuIFRoZW4gd2UgYWRkIGluIHRoZQorCQkvLyBncmFwaHMgb2YgdGhpcyBtb2RlbCBhbmQgZmluYWxseSAicmVzb2x2ZSIgYWxsIHRoZSAiZGFuZ2xpbmciIGxpbmtzCisKKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxNb2RlbD4gbW9kZWxJdGVyID0gZ2V0TW9kZWxzKCkuaXRlcmF0b3IoKTsgbW9kZWxJdGVyCisJCQkJLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIE1vZGVsIG1vZGVsID0gKE1vZGVsKSBtb2RlbEl0ZXIubmV4dCgpOworCQkJcmV0VmFsdWUuYWRkR3JhcGgobW9kZWwuZ2V0Q2Fub25pY2FsR3JhcGgodXJpLCBteUZpbHRlciwgdGltZSksIG15RmlsdGVyKTsKKwkJfSAvLyBmb3IgbW9kZWxzCisKKwkJLy8gTm93IGRvIHRoZSBncmFwaHMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIG1vZGVsCisJCWZvciAoZmluYWwgSXRlcmF0b3I8R3JhcGg+IGdyYXBoSXRlciA9IGdldEdyYXBocygpLml0ZXJhdG9yKCk7IGdyYXBoSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBHcmFwaCBncmFwaCA9IChHcmFwaCkgZ3JhcGhJdGVyLm5leHQoKTsKKworCQkJZmluYWwgR3JhcGggY29weUdyYXBoID0gKEdyYXBoKSBFY29yZVV0aWwuY29weShncmFwaCk7CisJCQkvLyBmaW5hbCBHcmFwaCBncmFwaCA9IChHcmFwaCkgZ3JhcGhJdGVyLm5leHQoKTsKKwkJCS8vIGZpbmFsIENvcGllciBjb3BpZXIgPSBuZXcgQ29waWVyKCk7CisJCQkvLyBmaW5hbCBHcmFwaCBjb3B5R3JhcGggPSAoR3JhcGgpIGNvcGllci5jb3B5KGdyYXBoKTsKKwkJCS8vIGNvcGllci5jb3B5UmVmZXJlbmNlcygpOworCQkJcmV0VmFsdWUuYWRkR3JhcGgoY29weUdyYXBoLCBteUZpbHRlcik7CisJCX0gLy8gZm9yIGdyYXBocworCisJCS8vIEhvb2sgdXAgdGhlIElkZW50aWZpYWJsZXMgd2l0aCBvdGhlciBvbmVzIHRoZXkgcmVmZXJlbmNlIHZpYSBVUkkncywKKwkJLy8gaWYgYW55IFVSSSBhcmUgdW5yZXNvbHZlZCwgdGhlbiBpbnN0YW5jZXMgb2YgVW5yZXNvbHZlZElkZW50aWZpYWJsZXMKKwkJLy8gd2lsbCBiZSBhZGRlZCB0byB0aGUgZ3JhcGgncyBjb2xsZWN0aW9uIG9mICJ1bnJlc29sdmVkCisJCS8vIGlkZW50aWZpYWJsZXMiLgorCQlyZXNvbHZlVVJJcyh0aGlzLCByZXRWYWx1ZSk7CisKKwkJaW52b2tlTm9kZURlY29yYXRvcnMocmV0VmFsdWUsIHRpbWUpOworCQlpbnZva2VFZGdlRGVjb3JhdG9ycyhyZXRWYWx1ZSwgdGltZSk7CisJCWludm9rZUdyYXBoRGVjb3JhdG9ycyhyZXRWYWx1ZSwgdGltZSk7CisKKwkJLy8gVXBkYXRlIHRoZSBEdWJsaW4gQ29yZSBmb3IgdGhpcyBncmFwaAorCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gcmV0VmFsdWUuZ2V0RHVibGluQ29yZSgpOworCQlkYy5wb3B1bGF0ZSgpOworCQlkYy5zZXRGb3JtYXQoR3JhcGhQYWNrYWdlLmVOU19VUkkpOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldENhbm9uaWNhbEdyYXBoCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgcHJlcGFyZShTVEVNVGltZSB0aW1lKSB7CisJCS8vIEl0ZXJhdGUgc3VibW9kZWxzIGFuZCBjYWxsIHByZXBhcmUKKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxNb2RlbD4gbW9kZWxJdGVyID0gZ2V0TW9kZWxzKCkuaXRlcmF0b3IoKTsgbW9kZWxJdGVyCisJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBNb2RlbCBtb2RlbCA9IChNb2RlbCkgbW9kZWxJdGVyLm5leHQoKTsKKwkJCW1vZGVsLnByZXBhcmUodGltZSk7CisJCX0gLy8gZm9yIG1vZGVscworCQkKKwkJQXJyYXlMaXN0PE5vZGVEZWNvcmF0b3I+bGlzdCA9IChBcnJheUxpc3Q8Tm9kZURlY29yYXRvcj4pRWNvcmVVdGlsLmNvcHlBbGwoZ2V0Tm9kZURlY29yYXRvcnMoKSk7CisJCWZvciAoZmluYWwgSXRlcmF0b3I8Tm9kZURlY29yYXRvcj4gbm9kZURlY29yYXRvckl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IG5vZGVEZWNvcmF0b3JJdGVyCisJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBOb2RlRGVjb3JhdG9yIG5vZGVEZWNvcmF0b3IgPSAoTm9kZURlY29yYXRvcikgbm9kZURlY29yYXRvckl0ZXIubmV4dCgpOworCQkJbm9kZURlY29yYXRvci5wcmVwYXJlKHRoaXMsIHRpbWUpOworCQl9CisJCQorCQlBcnJheUxpc3Q8RWRnZURlY29yYXRvcj5saXN0MiA9IChBcnJheUxpc3Q8RWRnZURlY29yYXRvcj4pRWNvcmVVdGlsLmNvcHlBbGwoZ2V0RWRnZURlY29yYXRvcnMoKSk7CisJCWZvciAoZmluYWwgSXRlcmF0b3I8RWRnZURlY29yYXRvcj4gZWRnZURlY29yYXRvckl0ZXIgPSBsaXN0Mi5pdGVyYXRvcigpOyBlZGdlRGVjb3JhdG9ySXRlcgorCQkuaGFzTmV4dCgpOykgeworCQkJZmluYWwgRWRnZURlY29yYXRvciBlZGdlRGVjb3JhdG9yID0gKEVkZ2VEZWNvcmF0b3IpIGVkZ2VEZWNvcmF0b3JJdGVyLm5leHQoKTsKKwkJCWVkZ2VEZWNvcmF0b3IucHJlcGFyZSh0aGlzLCB0aW1lKTsKKwkJfQorCQkKKwkJQXJyYXlMaXN0PEdyYXBoRGVjb3JhdG9yPmxpc3QzID0gKEFycmF5TGlzdDxHcmFwaERlY29yYXRvcj4pRWNvcmVVdGlsLmNvcHlBbGwoZ2V0R3JhcGhEZWNvcmF0b3JzKCkpOworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPEdyYXBoRGVjb3JhdG9yPiBncmFwaERlY29yYXRvckl0ZXIgPSBsaXN0My5pdGVyYXRvcigpOyBncmFwaERlY29yYXRvckl0ZXIKKwkJLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIEdyYXBoRGVjb3JhdG9yIGdyYXBoRGVjb3JhdG9yID0gKEdyYXBoRGVjb3JhdG9yKSBncmFwaERlY29yYXRvckl0ZXIubmV4dCgpOworCQkJZ3JhcGhEZWNvcmF0b3IucHJlcGFyZSh0aGlzLCB0aW1lKTsKKwkJfQorCisJfQorCisJLyoqCisJICogUHJvY2VzcyBhbGwgb2YgdGhlIGNvbXBvbmVudHMgb2YgYSBncmFwaCBhbmQgbGluayB1cCBhbGwgdW5yZXNvbHZlZCBVUkkKKwkgKiByZWZlcmVuY2VzIGluIHRoZSBncmFwaC4KKwkgKiAKKwkgKiBAcGFyYW0gbW9kZWwKKwkgKiAgICAgICAgICAgIHRoZSBtb2RlbCB0aGF0IGNvbnRhaW5zIHRoZSBncmFwaAorCSAqIEBwYXJhbSBncmFwaAorCSAqICAgICAgICAgICAgYSBncmFwaAorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJpdmF0ZSB2b2lkIHJlc29sdmVVUklzKGZpbmFsIE1vZGVsIG1vZGVsLCBmaW5hbCBHcmFwaCBncmFwaCkgeworCisJCS8vIFRPRE8gb3B0aW1pemUgYnkga2VlcGluZyBhIGxpc3Qgb2YgdW5yZXNvbHZlZCBlZGdlcworCisJCS8vIEdvIHRocm91Z2ggZWFjaCBlZGdlIGluIHRoZSBncmFwaCBhbmQgdHJ5IHRvIGhvb2sgaXQgdXAgd2l0aCB0aGUKKwkJLy8gbm9kZXMgaXQgcmVmZXJlbmNlcworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPEVkZ2U+IGVkZ2VJdGVyID0gZ3JhcGguZ2V0RWRnZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBlZGdlSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBFZGdlIGVkZ2UgPSAoRWRnZSkgZWRnZUl0ZXIubmV4dCgpOworCisJCQkvLyBEb2VzIE5vZGUgQSBvZiB0aGlzIGVkZ2UgbmVlZCByZXNvbHZpbmc/CisJCQlpZiAoIWVkZ2UuZUlzU2V0KEdyYXBoUGFja2FnZS5MaXRlcmFscy5FREdFX19BKSkgeworCQkJCS8vIFllcworCQkJCWZpbmFsIE5vZGUgbm9kZUEgPSBncmFwaC5nZXROb2RlKGVkZ2UuZ2V0Tm9kZUFVUkkoKSk7CisJCQkJLy8gRGlkIHdlIGZpbmQgaXQ/CisJCQkJaWYgKG5vZGVBICE9IG51bGwpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWVkZ2Uuc2V0QShub2RlQSk7CisJCQkJCW5vZGVBLmdldEVkZ2VzKCkuYWRkKGVkZ2UpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIE5vCisJCQkJCWZpbmFsIFVucmVzb2x2ZWRJZGVudGlmaWFibGUgdWkgPSBHcmFwaEZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCQkJLmNyZWF0ZVVucmVzb2x2ZWRJZGVudGlmaWFibGUoKTsKKwkJCQkJdWkuc2V0TW9kZWwobW9kZWwpOworCQkJCQl1aS5zZXRHcmFwaChncmFwaCk7CisJCQkJCXVpLnNldFVucmVzb2x2ZWRVUkkoZWRnZS5nZXROb2RlQVVSSSgpKTsKKwkJCQkJdWkuc2V0SWRlbnRpZmlhYmxlKGVkZ2UpOworCQkJCQl1aS5zZXRGaWVsZE5hbWUoIk5PREVfQSIpOworCQkJCQlpZihTY2VuYXJpb0ltcGwucmVwb3J0RGFuZ2xpbmdBaXJUcmFuc3BvcnRFZGdlcyB8fAorCQkJCQkJCSFlZGdlLmdldFVSSSgpLnRvU3RyaW5nKCkuY29udGFpbnMoIi9waXBldHJhbnNwb3J0IikpCisJCQkJCQlncmFwaC5nZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlcygpLmFkZCh1aSk7CisJCQkJfSAvLyBlbHNlCisJCQl9IC8vIGlmIG5vZGVBCisKKwkJCS8vIERvZXMgTm9kZSBCIG9mIHRoaXMgZWRnZSBuZWVkIHJlc29sdmluZz8KKwkJCWlmICghZWRnZS5lSXNTZXQoR3JhcGhQYWNrYWdlLkxpdGVyYWxzLkVER0VfX0IpCisJCQkJCSYmIGVkZ2UuZUlzU2V0KEdyYXBoUGFja2FnZS5MaXRlcmFscy5FREdFX19BKSkgeworCQkJCS8vIFllcworCQkJCWZpbmFsIE5vZGUgbm9kZUIgPSBncmFwaC5nZXROb2RlKGVkZ2UuZ2V0Tm9kZUJVUkkoKSk7CisJCQkJLy8gRGlkIHdlIGZpbmQgaXQ/CisJCQkJaWYgKG5vZGVCICE9IG51bGwpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWVkZ2Uuc2V0Qihub2RlQik7CisJCQkJCW5vZGVCLmdldEVkZ2VzKCkuYWRkKGVkZ2UpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIE5vCisJCQkJCS8vIFdhcyBOb2RlIEEgZm91bmQgdGhvdWdoPworCQkJCQlpZiAoZWRnZS5nZXRBKCkgIT0gbnVsbCkgeworCQkJCQkJLy8gWWVzCisJCQkJCQkvLyBXZSByZW1vdmUgb3VyIGxpbmsgd2l0aCBpdCB0aGVuIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZQorCQkJCQkJLy8gYSBkYW5nbGluZyBlZGdlIGluIHRoZSBncmFwaAorCQkJCQkJZmluYWwgTm9kZSBub2RlQSA9IGVkZ2UuZ2V0QSgpOworCQkJCQkJZWRnZS5zZXRBKG51bGwpOworCQkJCQkJbm9kZUEuZ2V0RWRnZXMoKS5yZW1vdmUoZWRnZSk7CisJCQkJCX0gLy8gaWYgTm9kZSBBCisKKwkJCQkJZmluYWwgVW5yZXNvbHZlZElkZW50aWZpYWJsZSB1aSA9IEdyYXBoRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCQkuY3JlYXRlVW5yZXNvbHZlZElkZW50aWZpYWJsZSgpOworCQkJCQl1aS5zZXRNb2RlbChtb2RlbCk7CisJCQkJCXVpLnNldEdyYXBoKGdyYXBoKTsKKwkJCQkJdWkuc2V0VW5yZXNvbHZlZFVSSShlZGdlLmdldE5vZGVCVVJJKCkpOworCQkJCQl1aS5zZXRJZGVudGlmaWFibGUoZWRnZSk7CisJCQkJCXVpLnNldEZpZWxkTmFtZSgiTk9ERV9CIik7CisJCQkJCWlmKFNjZW5hcmlvSW1wbC5yZXBvcnREYW5nbGluZ0FpclRyYW5zcG9ydEVkZ2VzIHx8CisJCQkJCQkJIWVkZ2UuZ2V0VVJJKCkudG9TdHJpbmcoKS5jb250YWlucygiL3BpcGV0cmFuc3BvcnQiKSkKKwkJCQkJCWdyYXBoLmdldFVucmVzb2x2ZWRJZGVudGlmaWFibGVzKCkuYWRkKHVpKTsKKwkJCQl9IC8vIGVsc2UKKwkJCX0gLy8gaWYgbm9kZUIKKwkJfSAvLyBmb3IgZWFjaCBlZGdlCisKKwkJLy8gTm93IGRvIHRoZSBsYWJlbHMKKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxOb2RlTGFiZWw+IGxhYmVsSXRlciA9IGdyYXBoLmdldE5vZGVMYWJlbHMoKS52YWx1ZXMoKQorCQkJCS5pdGVyYXRvcigpOyBsYWJlbEl0ZXIuaGFzTmV4dCgpOykgeworCQkJZmluYWwgTm9kZUxhYmVsIGxhYmVsID0gKE5vZGVMYWJlbCkgbGFiZWxJdGVyLm5leHQoKTsKKwkJCS8vIENhbiB5b3UgZmluZCB0aGUgTm9kZSBmb3IgdGhpcyBsYWJlbD8KKwkJCWZpbmFsIE5vZGUgbm9kZSA9IGdyYXBoLmdldE5vZGUobGFiZWwKKwkJCQkJLmdldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQoKSk7CisJCQlpZiAobm9kZSAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJbm9kZS5nZXRMYWJlbHMoKS5hZGQobGFiZWwpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBObworCQkJCWZpbmFsIFVucmVzb2x2ZWRJZGVudGlmaWFibGUgdWkgPSBHcmFwaEZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCQkuY3JlYXRlVW5yZXNvbHZlZElkZW50aWZpYWJsZSgpOworCQkJCXVpLnNldE1vZGVsKG1vZGVsKTsKKwkJCQl1aS5zZXRHcmFwaChncmFwaCk7CisJCQkJdWkuc2V0VW5yZXNvbHZlZFVSSShsYWJlbC5nZXRVUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKCkpOworCQkJCXVpLnNldElkZW50aWZpYWJsZShsYWJlbCk7CisJCQkJdWkuc2V0RmllbGROYW1lKCJOb2RlIik7CisJCQkJZ3JhcGguZ2V0VW5yZXNvbHZlZElkZW50aWZpYWJsZXMoKS5hZGQodWkpOworCQkJfQorCQl9IC8vIGZvcgorCisJfSAvLyByZXNvbHZlVVJJcworCisJLyoqCisJICogSXRlcmF0ZSB0aHJvdWdoIGVhY2ggbm9kZSBkZWNvcmF0b3IgYW5kIGdpdmUgaXQgYSBjaGFuY2UgdG8gZGVjb3JhdGUgdGhlCisJICogbm9kZXMgb2YgdGhlIGdyYXBoLgorCSAqIAorCSAqIEBwYXJhbSBncmFwaAorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBHcmFwaH0gdG8gZGVjb3JhdGUKKwkgKiBAcGFyYW0gdGltZSBTVEVNIHRpbWUKKwkgKi8KKwlwcml2YXRlIHZvaWQgaW52b2tlTm9kZURlY29yYXRvcnMoR3JhcGggZ3JhcGgsIFNURU1UaW1lIHRpbWUpIHsKKwkJQXJyYXlMaXN0PERlY29yYXRvcj5mYWlsZWQgPSBudWxsOyAKKwkJCisJCS8vIFN0ZWZhbiBmaXguIFdlIGFkZCB0aGUgZGVjb3JhdG9ycyB0byB0aGUgZ3JhcGggZmlyc3Qgc2luY2Ugd2UgbmVlZCB0byBrbm93CisJCS8vIGFib3V0IHdoYXQgZGVjb3JhdG9ycyBhcmUgYXZhaWxhYmxlIHdoZW4gd2UgZGV0ZXJtaW5lIGhvdyB0byBkZWNvcmF0ZSB3aGVuCisJCS8vIHRoZXJlIGFyZSBvdmVybGFwcGluZyBzZXRzIG9mIG5vZGVzIChlLmcuIGZvciBwb3B1bGF0aW9uIG1vZGVscykKKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxOb2RlRGVjb3JhdG9yPiBub2RlRGVjb3JhdG9ySXRlciA9IGdldE5vZGVEZWNvcmF0b3JzKCkuaXRlcmF0b3IoKTsgbm9kZURlY29yYXRvckl0ZXIKKwkJLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIE5vZGVEZWNvcmF0b3Igbm9kZURlY29yYXRvciA9IChOb2RlRGVjb3JhdG9yKSBub2RlRGVjb3JhdG9ySXRlcgorCQkJLm5leHQoKTsKKwkJCWZpbmFsIERlY29yYXRvciBjYW5vbmljYWxEZWNvcmF0b3IgPSAoRGVjb3JhdG9yKSBFY29yZVV0aWwKKwkJCS5jb3B5KG5vZGVEZWNvcmF0b3IpOworCQkJZ3JhcGguZ2V0RGVjb3JhdG9ycygpLmFkZChjYW5vbmljYWxEZWNvcmF0b3IpOworCQl9CisJCWZvciAoRGVjb3JhdG9yIGNhbm9uaWNhbERlY29yYXRvcjpncmFwaC5nZXREZWNvcmF0b3JzKCkpIHsKKwkJCWJvb2xlYW4gc3VjY2VzcyA9IGNhbm9uaWNhbERlY29yYXRvci5kZWNvcmF0ZUdyYXBoKHRpbWUpOworCQkJaWYoIXN1Y2Nlc3MpIHsKKwkJCQlpZihmYWlsZWQgPT0gbnVsbClmYWlsZWQgPSBuZXcgQXJyYXlMaXN0PERlY29yYXRvcj4oKTsKKwkJCQlmYWlsZWQuYWRkKGNhbm9uaWNhbERlY29yYXRvcik7CisJCQl9IGVsc2UgY2Fub25pY2FsRGVjb3JhdG9yLnNldEdyYXBoRGVjb3JhdGVkKHRydWUpOworCQl9IC8vIGZvcgorCQkKKwkJLy8gUmVkbyBmYWlsZWQgZGVjb3JhdG9ycy4gVGhpcyBjYW4gaGFwcGVuIGR1ZSB0byBkZXBlbmRlbmNpZXMsIGZvciBpbnN0YW5jZSBhIHBvcHVsYXRpb24gbW9kZWwgbXVzdCBiZSBhbGxvd2VkIHRvIGRlY29yYXRlCisJCS8vIGJlZm9yZSBhIGRpc2Vhc2UgbW9kZWwuCQorCQkvLyBBU1NVTUlORyBUSEUgVVNFUiBIQVMgQlVJTEQgVEhFIE1PREVMIFdJVEggVEhFIENPUlJFQ1QgSElFUkFSQ0hZLCBUSElTIFdJTEwgTkVWRVIgSEFQUEVOCisJCQorCQlpZihmYWlsZWQhPW51bGwpIHsKKwkJCS8vIFdlIHNob3VsZCBsb2cgYSB3YXJuaW5nIGhlcmUgdGhhdCB3ZSB3ZXJlIGZvcmNlZCB0byByZWluaXQuIFRoZSB1c2VyIHNob3VsZCBjaGVjayB0aGUgbW9kZWwgbmVzdGluZworCQkJVXRpbGl0eS5kaXNwbGF5U2NlbmFyaW9Db21wb3NpdGlvbldhcm5pbmcoVXRpbGl0eS5ORVNUSU5HX1dBUk5JTkcpOworCQkJZm9yKERlY29yYXRvciBkOmZhaWxlZCkgeworCQkJCWQuZGVjb3JhdGVHcmFwaCh0aW1lKTsKKwkJCQlkLnNldEdyYXBoRGVjb3JhdGVkKHRydWUpOworCQkJfQorCQl9CisJfSAvLyBpbnZva2VOb2RlRGVjb3JhdG9ycworCisJLyoqCisJICogSXRlcmF0ZSB0aHJvdWdoIGVhY2ggZWRnZSBkZWNvcmF0b3IgYW5kIGdpdmUgaXQgYSBjaGFuY2UgdG8gZGVjb3JhdGUgdGhlCisJICogZWRnZXMgb2YgdGhlIGdyYXBoLgorCSAqIAorCSAqIEBwYXJhbSBncmFwaAorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBHcmFwaH0gdG8gZGVjb3JhdGUKKwkgKiBAcGFyYW0gdGltZQorCSAqLworCXByaXZhdGUgdm9pZCBpbnZva2VFZGdlRGVjb3JhdG9ycyhmaW5hbCBHcmFwaCBncmFwaCwgU1RFTVRpbWUgdGltZSkgeworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPEVkZ2VEZWNvcmF0b3I+IGVkZ2VEZWNvcmF0b3JJdGVyID0gZ2V0RWRnZURlY29yYXRvcnMoKS5pdGVyYXRvcigpOyBlZGdlRGVjb3JhdG9ySXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBFZGdlRGVjb3JhdG9yIGVkZ2VEZWNvcmF0b3IgPSAoRWRnZURlY29yYXRvcikgZWRnZURlY29yYXRvckl0ZXIKKwkJCQkJLm5leHQoKTsKKwkJCWZpbmFsIERlY29yYXRvciBjYW5vbmljYWxEZWNvcmF0b3IgPSAoRGVjb3JhdG9yKSBFY29yZVV0aWwKKwkJCQkJLmNvcHkoZWRnZURlY29yYXRvcik7CisJCQlncmFwaC5nZXREZWNvcmF0b3JzKCkuYWRkKGNhbm9uaWNhbERlY29yYXRvcik7CisJCQljYW5vbmljYWxEZWNvcmF0b3IuZGVjb3JhdGVHcmFwaCh0aW1lKTsKKwkJfSAvLyBmb3IKKwl9IC8vIGludm9rZUVkZ2VEZWNvcmF0b3JzCisKKwkvKioKKwkgKiBJdGVyYXRlIHRocm91Z2ggZWFjaCBncmFwaCBkZWNvcmF0b3IgYW5kIGdpdmUgaXQgYSBjaGFuY2UgdG8gZGVjb3JhdGUgdGhlCisJICogZ3JhcGggaXRzZWxmLgorCSAqIAorCSAqIEBwYXJhbSBncmFwaAorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBHcmFwaH0gdG8gZGVjb3JhdGUKKwkgKiBAcGFyYW0gdGltZQorCSAqLworCXByaXZhdGUgdm9pZCBpbnZva2VHcmFwaERlY29yYXRvcnMoR3JhcGggZ3JhcGgsIFNURU1UaW1lIHRpbWUpIHsKKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxHcmFwaERlY29yYXRvcj4gZ3JhcGhEZWNvcmF0b3JJdGVyID0gZ2V0R3JhcGhEZWNvcmF0b3JzKCkKKwkJCQkuaXRlcmF0b3IoKTsgZ3JhcGhEZWNvcmF0b3JJdGVyLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIEdyYXBoRGVjb3JhdG9yIGdyYXBoRGVjb3JhdG9yID0gKEdyYXBoRGVjb3JhdG9yKSBncmFwaERlY29yYXRvckl0ZXIKKwkJCQkJLm5leHQoKTsKKwkJCWZpbmFsIERlY29yYXRvciBjYW5vbmljYWxEZWNvcmF0b3IgPSAoRGVjb3JhdG9yKSBFY29yZVV0aWwKKwkJCQkJLmNvcHkoZ3JhcGhEZWNvcmF0b3IpOworCQkJZ3JhcGguZ2V0RGVjb3JhdG9ycygpLmFkZChjYW5vbmljYWxEZWNvcmF0b3IpOworCQkJY2Fub25pY2FsRGVjb3JhdG9yLmRlY29yYXRlR3JhcGgodGltZSk7CisJCX0gLy8gZm9yCisKKwl9IC8vIGludm9rZUdyYXBoRGVjb3JhdG9ycworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLk1PREVMX19NT0RFTFM6CisJCQkJcmV0dXJuIGdldE1vZGVscygpOworCQkJY2FzZSBNb2RlbFBhY2thZ2UuTU9ERUxfX0dSQVBIUzoKKwkJCQlyZXR1cm4gZ2V0R3JhcGhzKCk7CisJCQljYXNlIE1vZGVsUGFja2FnZS5NT0RFTF9fR1JBUEhfREVDT1JBVE9SUzoKKwkJCQlyZXR1cm4gZ2V0R3JhcGhEZWNvcmF0b3JzKCk7CisJCQljYXNlIE1vZGVsUGFja2FnZS5NT0RFTF9fTk9ERV9ERUNPUkFUT1JTOgorCQkJCXJldHVybiBnZXROb2RlRGVjb3JhdG9ycygpOworCQkJY2FzZSBNb2RlbFBhY2thZ2UuTU9ERUxfX0VER0VfREVDT1JBVE9SUzoKKwkJCQlyZXR1cm4gZ2V0RWRnZURlY29yYXRvcnMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLk1PREVMX19NT0RFTFM6CisJCQkJZ2V0TW9kZWxzKCkuY2xlYXIoKTsKKwkJCQlnZXRNb2RlbHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1vZGVsPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RlbFBhY2thZ2UuTU9ERUxfX0dSQVBIUzoKKwkJCQlnZXRHcmFwaHMoKS5jbGVhcigpOworCQkJCWdldEdyYXBocygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgR3JhcGg+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGVsUGFja2FnZS5NT0RFTF9fR1JBUEhfREVDT1JBVE9SUzoKKwkJCQlnZXRHcmFwaERlY29yYXRvcnMoKS5jbGVhcigpOworCQkJCWdldEdyYXBoRGVjb3JhdG9ycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgR3JhcGhEZWNvcmF0b3I+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGVsUGFja2FnZS5NT0RFTF9fTk9ERV9ERUNPUkFUT1JTOgorCQkJCWdldE5vZGVEZWNvcmF0b3JzKCkuY2xlYXIoKTsKKwkJCQlnZXROb2RlRGVjb3JhdG9ycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTm9kZURlY29yYXRvcj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLk1PREVMX19FREdFX0RFQ09SQVRPUlM6CisJCQkJZ2V0RWRnZURlY29yYXRvcnMoKS5jbGVhcigpOworCQkJCWdldEVkZ2VEZWNvcmF0b3JzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFZGdlRGVjb3JhdG9yPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGVsUGFja2FnZS5NT0RFTF9fTU9ERUxTOgorCQkJCWdldE1vZGVscygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RlbFBhY2thZ2UuTU9ERUxfX0dSQVBIUzoKKwkJCQlnZXRHcmFwaHMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLk1PREVMX19HUkFQSF9ERUNPUkFUT1JTOgorCQkJCWdldEdyYXBoRGVjb3JhdG9ycygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RlbFBhY2thZ2UuTU9ERUxfX05PREVfREVDT1JBVE9SUzoKKwkJCQlnZXROb2RlRGVjb3JhdG9ycygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RlbFBhY2thZ2UuTU9ERUxfX0VER0VfREVDT1JBVE9SUzoKKwkJCQlnZXRFZGdlRGVjb3JhdG9ycygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RlbFBhY2thZ2UuTU9ERUxfX01PREVMUzoKKwkJCQlyZXR1cm4gbW9kZWxzICE9IG51bGwgJiYgIW1vZGVscy5pc0VtcHR5KCk7CisJCQljYXNlIE1vZGVsUGFja2FnZS5NT0RFTF9fR1JBUEhTOgorCQkJCXJldHVybiBncmFwaHMgIT0gbnVsbCAmJiAhZ3JhcGhzLmlzRW1wdHkoKTsKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLk1PREVMX19HUkFQSF9ERUNPUkFUT1JTOgorCQkJCXJldHVybiBncmFwaERlY29yYXRvcnMgIT0gbnVsbCAmJiAhZ3JhcGhEZWNvcmF0b3JzLmlzRW1wdHkoKTsKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLk1PREVMX19OT0RFX0RFQ09SQVRPUlM6CisJCQkJcmV0dXJuIG5vZGVEZWNvcmF0b3JzICE9IG51bGwgJiYgIW5vZGVEZWNvcmF0b3JzLmlzRW1wdHkoKTsKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLk1PREVMX19FREdFX0RFQ09SQVRPUlM6CisJCQkJcmV0dXJuIGVkZ2VEZWNvcmF0b3JzICE9IG51bGwgJiYgIWVkZ2VEZWNvcmF0b3JzLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvbW1vbi5pbXBsLklkZW50aWZpYWJsZUltcGwjdG9TdHJpbmcoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiXCIiICsgZHVibGluQ29yZS5nZXRUaXRsZSgpCisJCQkJKyAiXCJcbiIpOworCisJCXNiLmFwcGVuZChtb2RlbHMgIT0gbnVsbCA/IG1vZGVscy5zaXplKCkgKyAiIG1vZGVsc1xuIiA6ICIiKTsKKwkJc2IuYXBwZW5kKGdyYXBocyAhPSBudWxsID8gZ3JhcGhzLnNpemUoKSArICIgZ3JhcGhzXG4iIDogIiIpOworCQlzYi5hcHBlbmQoZ3JhcGhEZWNvcmF0b3JzICE9IG51bGwgPyBncmFwaERlY29yYXRvcnMuc2l6ZSgpCisJCQkJKyAiIGdyYXBoIGRlY29yYXRvcnNcbiIgOiAiIik7CisJCXNiLmFwcGVuZChub2RlRGVjb3JhdG9ycyAhPSBudWxsID8gbm9kZURlY29yYXRvcnMuc2l6ZSgpCisJCQkJKyAiIG5vZGUgZGVjb3JhdG9yc1xuIiA6ICIiKTsKKwkJc2IuYXBwZW5kKGVkZ2VEZWNvcmF0b3JzICE9IG51bGwgPyBlZGdlRGVjb3JhdG9ycy5zaXplKCkKKwkJCQkrICJlZGdlIGRlY29yYXRvcnNcbiIgOiAiIik7CisKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfSAvLyB0b1N0cmluZworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvbW1vbi5pbXBsLklkZW50aWZpYWJsZUltcGwjc2FuZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzYW5lKCkgeworCQlib29sZWFuIHJldFZhbHVlID0gc3VwZXIuc2FuZSgpOworCisJCWlmIChyZXRWYWx1ZSAmJiBtb2RlbHMgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxNb2RlbD4gbW9kZWxJdGVyID0gbW9kZWxzLml0ZXJhdG9yKCk7IG1vZGVsSXRlcgorCQkJCQkuaGFzTmV4dCgpCisJCQkJCSYmIHJldFZhbHVlOykgeworCQkJCWZpbmFsIE1vZGVsIG1vZGVsID0gKE1vZGVsKSBtb2RlbEl0ZXIubmV4dCgpOworCQkJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgbW9kZWwuc2FuZSgpOworCQkJCWFzc2VydCByZXRWYWx1ZTsKKwkJCX0gLy8gZm9yIGVhY2ggbW9kZWwKKwkJfQorCisJCWlmIChyZXRWYWx1ZSAmJiBncmFwaHMgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxHcmFwaD4gZ3JhcGhJdGVyID0gZ3JhcGhzLml0ZXJhdG9yKCk7IGdyYXBoSXRlcgorCQkJCQkuaGFzTmV4dCgpCisJCQkJCSYmIHJldFZhbHVlOykgeworCQkJCWZpbmFsIEdyYXBoIGdyYXBoID0gKEdyYXBoKSBncmFwaEl0ZXIubmV4dCgpOworCQkJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgZ3JhcGguc2FuZSgpOworCQkJCWFzc2VydCByZXRWYWx1ZTsKKwkJCX0gLy8gZm9yIGVhY2ggZ3JhcGgKKwkJfQorCisJCWlmIChyZXRWYWx1ZSAmJiBncmFwaERlY29yYXRvcnMgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxHcmFwaERlY29yYXRvcj4gZ3JhcGhEZWNvcmF0b3JJdGVyID0gZ3JhcGhEZWNvcmF0b3JzLml0ZXJhdG9yKCk7IGdyYXBoRGVjb3JhdG9ySXRlcgorCQkJCQkuaGFzTmV4dCgpCisJCQkJCSYmIHJldFZhbHVlOykgeworCQkJCWZpbmFsIEdyYXBoRGVjb3JhdG9yIGdyYXBoRGVjb3JhdG9yID0gKEdyYXBoRGVjb3JhdG9yKSBncmFwaERlY29yYXRvckl0ZXIKKwkJCQkJCS5uZXh0KCk7CisJCQkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBncmFwaERlY29yYXRvci5zYW5lKCk7CisJCQkJYXNzZXJ0IHJldFZhbHVlOworCQkJfSAvLyBmb3IgZWFjaCBncmFwaERlY29yYXRvcgorCQl9IC8vIGlmCisKKwkJaWYgKHJldFZhbHVlICYmIG5vZGVEZWNvcmF0b3JzICE9IG51bGwpIHsKKwkJCWZvciAoSXRlcmF0b3I8Tm9kZURlY29yYXRvcj4gbm9kZURlY29yYXRvckl0ZXIgPSBub2RlRGVjb3JhdG9ycy5pdGVyYXRvcigpOyBub2RlRGVjb3JhdG9ySXRlcgorCQkJCQkuaGFzTmV4dCgpCisJCQkJCSYmIHJldFZhbHVlOykgeworCQkJCU5vZGVEZWNvcmF0b3Igbm9kZURlY29yYXRvciA9IChOb2RlRGVjb3JhdG9yKSBub2RlRGVjb3JhdG9ySXRlcgorCQkJCQkJLm5leHQoKTsKKwkJCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIG5vZGVEZWNvcmF0b3Iuc2FuZSgpOworCQkJCWFzc2VydCByZXRWYWx1ZTsKKwkJCX0gLy8gZm9yIGVhY2ggbm9lRGVjb3JhdG9yCisJCX0gLy8gaWYKKworCQlpZiAocmV0VmFsdWUgJiYgZWRnZURlY29yYXRvcnMgIT0gbnVsbCkgeworCQkJZm9yIChJdGVyYXRvcjxFZGdlRGVjb3JhdG9yPiBlZGdlRGVjb3JhdG9ySXRlciA9IGVkZ2VEZWNvcmF0b3JzLml0ZXJhdG9yKCk7IGVkZ2VEZWNvcmF0b3JJdGVyCisJCQkJCS5oYXNOZXh0KCkKKwkJCQkJJiYgcmV0VmFsdWU7KSB7CisJCQkJRWRnZURlY29yYXRvciBlZGdlRGVjb3JhdG9yID0gKEVkZ2VEZWNvcmF0b3IpIGVkZ2VEZWNvcmF0b3JJdGVyCisJCQkJCQkubmV4dCgpOworCQkJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgZWRnZURlY29yYXRvci5zYW5lKCk7CisJCQkJYXNzZXJ0IHJldFZhbHVlOworCQkJfSAvLyBmb3IgZWFjaCBlZGdlRGVjb3JhdG9yCisJCX0KKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gc2FuZQorfSAvLyBNb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL2ltcGwvTW9kZWxQYWNrYWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvaW1wbC9Nb2RlbFBhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3NmE5OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL2ltcGwvTW9kZWxQYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNTUyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ltcG9ydCBqYXZhLmxhbmcuQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVHZW5lcmljVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50UGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5pbXBsLkV4cGVyaW1lbnRQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRWRnZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuR3JhcGhEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uaW1wbC5TY2VuYXJpb1BhY2thZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5pbXBsLlNlcXVlbmNlclBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLmltcGwuU29sdmVyUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuVHJpZ2dlclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuaW1wbC5UcmlnZ2VyUGFja2FnZUltcGw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTW9kZWxQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIE1vZGVsUGFja2FnZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZGVjb3JhdG9yRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGVkZ2VEZWNvcmF0b3JFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZ3JhcGhEZWNvcmF0b3JFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgbW9kZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgbm9kZURlY29yYXRvckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzdGVtVGltZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjb21wYXJhYmxlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRURhdGFUeXBlIHVyaUVEYXRhVHlwZSA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKKwkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KKwkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCisJICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKKwkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBNb2RlbFBhY2thZ2VJbXBsKCkgeworCQlzdXBlcihlTlNfVVJJLCBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCisJICogCisJICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBNb2RlbFBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIE1vZGVsUGFja2FnZSBpbml0KCkgeworCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoTW9kZWxQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGVsUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCisJCU1vZGVsUGFja2FnZUltcGwgdGhlTW9kZWxQYWNrYWdlID0gKE1vZGVsUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIE1vZGVsUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgTW9kZWxQYWNrYWdlSW1wbCgpKTsKKworCQlpc0luaXRlZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCisJCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisKKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKKwkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJRXhwZXJpbWVudFBhY2thZ2VJbXBsIHRoZUV4cGVyaW1lbnRQYWNrYWdlID0gKEV4cGVyaW1lbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRXhwZXJpbWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFeHBlcmltZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFeHBlcmltZW50UGFja2FnZS5lTlNfVVJJKSA6IEV4cGVyaW1lbnRQYWNrYWdlLmVJTlNUQU5DRSk7CisJCUdyYXBoUGFja2FnZUltcGwgdGhlR3JhcGhQYWNrYWdlID0gKEdyYXBoUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEdyYXBoUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEdyYXBoUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShHcmFwaFBhY2thZ2UuZU5TX1VSSSkgOiBHcmFwaFBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJTW9kaWZpZXJQYWNrYWdlSW1wbCB0aGVNb2RpZmllclBhY2thZ2UgPSAoTW9kaWZpZXJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kaWZpZXJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgTW9kaWZpZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGlmaWVyUGFja2FnZS5lTlNfVVJJKSA6IE1vZGlmaWVyUGFja2FnZS5lSU5TVEFOQ0UpOworCQlQcmVkaWNhdGVQYWNrYWdlSW1wbCB0aGVQcmVkaWNhdGVQYWNrYWdlID0gKFByZWRpY2F0ZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQcmVkaWNhdGVQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgUHJlZGljYXRlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQcmVkaWNhdGVQYWNrYWdlLmVOU19VUkkpIDogUHJlZGljYXRlUGFja2FnZS5lSU5TVEFOQ0UpOworCQlTY2VuYXJpb1BhY2thZ2VJbXBsIHRoZVNjZW5hcmlvUGFja2FnZSA9IChTY2VuYXJpb1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTY2VuYXJpb1BhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBTY2VuYXJpb1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU2NlbmFyaW9QYWNrYWdlLmVOU19VUkkpIDogU2NlbmFyaW9QYWNrYWdlLmVJTlNUQU5DRSk7CisJCVNlcXVlbmNlclBhY2thZ2VJbXBsIHRoZVNlcXVlbmNlclBhY2thZ2UgPSAoU2VxdWVuY2VyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNlcXVlbmNlclBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBTZXF1ZW5jZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNlcXVlbmNlclBhY2thZ2UuZU5TX1VSSSkgOiBTZXF1ZW5jZXJQYWNrYWdlLmVJTlNUQU5DRSk7CisJCVRyaWdnZXJQYWNrYWdlSW1wbCB0aGVUcmlnZ2VyUGFja2FnZSA9IChUcmlnZ2VyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRyaWdnZXJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVHJpZ2dlclBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVHJpZ2dlclBhY2thZ2UuZU5TX1VSSSkgOiBUcmlnZ2VyUGFja2FnZS5lSU5TVEFOQ0UpOworCQlTb2x2ZXJQYWNrYWdlSW1wbCB0aGVTb2x2ZXJQYWNrYWdlID0gKFNvbHZlclBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTb2x2ZXJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgU29sdmVyUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTb2x2ZXJQYWNrYWdlLmVOU19VUkkpIDogU29sdmVyUGFja2FnZS5lSU5TVEFOQ0UpOworCisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCisJCXRoZU1vZGVsUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlRXhwZXJpbWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUdyYXBoUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlTW9kaWZpZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVQcmVkaWNhdGVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVTY2VuYXJpb1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNlcXVlbmNlclBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVRyaWdnZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVTb2x2ZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKwkJdGhlTW9kZWxQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUV4cGVyaW1lbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlR3JhcGhQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlTW9kaWZpZXJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlUHJlZGljYXRlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNjZW5hcmlvUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNlcXVlbmNlclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVUcmlnZ2VyUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNvbHZlclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKwkJdGhlTW9kZWxQYWNrYWdlLmZyZWV6ZSgpOworCisgIAorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KE1vZGVsUGFja2FnZS5lTlNfVVJJLCB0aGVNb2RlbFBhY2thZ2UpOworCQlyZXR1cm4gdGhlTW9kZWxQYWNrYWdlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0RGVjb3JhdG9yKCkgeworCQlyZXR1cm4gZGVjb3JhdG9yRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldERlY29yYXRvcl9MYWJlbHNUb1VwZGF0ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWRlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldERlY29yYXRvcl9HcmFwaCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWRlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERlY29yYXRvcl9FbmFibGVkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVjb3JhdG9yX0dyYXBoRGVjb3JhdGVkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVjb3JhdG9yX1Byb2dyZXNzKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRFZGdlRGVjb3JhdG9yKCkgeworCQlyZXR1cm4gZWRnZURlY29yYXRvckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEdyYXBoRGVjb3JhdG9yKCkgeworCQlyZXR1cm4gZ3JhcGhEZWNvcmF0b3JFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRNb2RlbCgpIHsKKwkJcmV0dXJuIG1vZGVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1vZGVsX01vZGVscygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKW1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TW9kZWxfR3JhcGhzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpbW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNb2RlbF9HcmFwaERlY29yYXRvcnMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSltb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1vZGVsX05vZGVEZWNvcmF0b3JzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpbW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNb2RlbF9FZGdlRGVjb3JhdG9ycygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKW1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXROb2RlRGVjb3JhdG9yKCkgeworCQlyZXR1cm4gbm9kZURlY29yYXRvckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNURU1UaW1lKCkgeworCQlyZXR1cm4gc3RlbVRpbWVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U1RFTVRpbWVfVGltZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXN0ZW1UaW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRDb21wYXJhYmxlKCkgeworCQlyZXR1cm4gY29tcGFyYWJsZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRURhdGFUeXBlIGdldFVSSSgpIHsKKwkJcmV0dXJuIHVyaUVEYXRhVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTW9kZWxGYWN0b3J5IGdldE1vZGVsRmFjdG9yeSgpIHsKKwkJcmV0dXJuIChNb2RlbEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcworCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKKwkJaXNDcmVhdGVkID0gdHJ1ZTsKKworCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJZGVjb3JhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFQ09SQVRPUik7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZGVjb3JhdG9yRUNsYXNzLCBERUNPUkFUT1JfX0xBQkVMU19UT19VUERBVEUpOworCQljcmVhdGVFUmVmZXJlbmNlKGRlY29yYXRvckVDbGFzcywgREVDT1JBVE9SX19HUkFQSCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGVjb3JhdG9yRUNsYXNzLCBERUNPUkFUT1JfX0VOQUJMRUQpOworCQljcmVhdGVFQXR0cmlidXRlKGRlY29yYXRvckVDbGFzcywgREVDT1JBVE9SX19HUkFQSF9ERUNPUkFURUQpOworCQljcmVhdGVFQXR0cmlidXRlKGRlY29yYXRvckVDbGFzcywgREVDT1JBVE9SX19QUk9HUkVTUyk7CisKKwkJZWRnZURlY29yYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFREdFX0RFQ09SQVRPUik7CisKKwkJZ3JhcGhEZWNvcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1JBUEhfREVDT1JBVE9SKTsKKworCQltb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNT0RFTCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UobW9kZWxFQ2xhc3MsIE1PREVMX19NT0RFTFMpOworCQljcmVhdGVFUmVmZXJlbmNlKG1vZGVsRUNsYXNzLCBNT0RFTF9fR1JBUEhTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShtb2RlbEVDbGFzcywgTU9ERUxfX0dSQVBIX0RFQ09SQVRPUlMpOworCQljcmVhdGVFUmVmZXJlbmNlKG1vZGVsRUNsYXNzLCBNT0RFTF9fTk9ERV9ERUNPUkFUT1JTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShtb2RlbEVDbGFzcywgTU9ERUxfX0VER0VfREVDT1JBVE9SUyk7CisKKwkJbm9kZURlY29yYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOT0RFX0RFQ09SQVRPUik7CisKKwkJc3RlbVRpbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1RFTV9USU1FKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzdGVtVGltZUVDbGFzcywgU1RFTV9USU1FX19USU1FKTsKKworCQljb21wYXJhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTVBBUkFCTEUpOworCisJCS8vIENyZWF0ZSBkYXRhIHR5cGVzCisJCXVyaUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShVUkkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcworCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKKwkJaXNJbml0aWFsaXplZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCisJCXNldE5hbWUoZU5BTUUpOworCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKKwkJc2V0TnNVUkkoZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcworCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOworCQlHcmFwaFBhY2thZ2UgdGhlR3JhcGhQYWNrYWdlID0gKEdyYXBoUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShHcmFwaFBhY2thZ2UuZU5TX1VSSSk7CisJCUVjb3JlUGFja2FnZSB0aGVFY29yZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisJCWFkZEVUeXBlUGFyYW1ldGVyKGNvbXBhcmFibGVFQ2xhc3MsICJUIik7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCWRlY29yYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldElkZW50aWZpYWJsZSgpKTsKKwkJZWRnZURlY29yYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlY29yYXRvcigpKTsKKwkJZ3JhcGhEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZWNvcmF0b3IoKSk7CisJCW1vZGVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SWRlbnRpZmlhYmxlKCkpOworCQlub2RlRGVjb3JhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVjb3JhdG9yKCkpOworCQlFR2VuZXJpY1R5cGUgZzEgPSBjcmVhdGVFR2VuZXJpY1R5cGUodGhpcy5nZXRDb21wYXJhYmxlKCkpOworCQlFR2VuZXJpY1R5cGUgZzIgPSBjcmVhdGVFR2VuZXJpY1R5cGUodGhpcy5nZXRTVEVNVGltZSgpKTsKKwkJZzEuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzIpOworCQlzdGVtVGltZUVDbGFzcy5nZXRFR2VuZXJpY1N1cGVyVHlwZXMoKS5hZGQoZzEpOworCisJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCWluaXRFQ2xhc3MoZGVjb3JhdG9yRUNsYXNzLCBEZWNvcmF0b3IuY2xhc3MsICJEZWNvcmF0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RGVjb3JhdG9yX0xhYmVsc1RvVXBkYXRlKCksIHRoZUdyYXBoUGFja2FnZS5nZXREeW5hbWljTGFiZWwoKSwgdGhlR3JhcGhQYWNrYWdlLmdldER5bmFtaWNMYWJlbF9EZWNvcmF0b3IoKSwgImxhYmVsc1RvVXBkYXRlIiwgbnVsbCwgMCwgLTEsIERlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXREZWNvcmF0b3JfR3JhcGgoKSwgdGhlR3JhcGhQYWNrYWdlLmdldEdyYXBoKCksIHRoZUdyYXBoUGFja2FnZS5nZXRHcmFwaF9EZWNvcmF0b3JzKCksICJncmFwaCIsIG51bGwsIDAsIDEsIERlY29yYXRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXREZWNvcmF0b3JfRW5hYmxlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImVuYWJsZWQiLCAidHJ1ZSIsIDAsIDEsIERlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldERlY29yYXRvcl9HcmFwaERlY29yYXRlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImdyYXBoRGVjb3JhdGVkIiwgImZhbHNlIiwgMCwgMSwgRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVjb3JhdG9yX1Byb2dyZXNzKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJwcm9ncmVzcyIsICIwLjAiLCAwLCAxLCBEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCUVPcGVyYXRpb24gb3AgPSBhZGRFT3BlcmF0aW9uKGRlY29yYXRvckVDbGFzcywgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJkZWNvcmF0ZUdyYXBoIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFNURU1UaW1lKCksICJ0aW1lIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCW9wID0gYWRkRU9wZXJhdGlvbihkZWNvcmF0b3JFQ2xhc3MsIG51bGwsICJ1cGRhdGVMYWJlbHMiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0U1RFTVRpbWUoKSwgInRpbWUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAidGltZXJQZXJpb2QiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJjeWNsZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlhZGRFT3BlcmF0aW9uKGRlY29yYXRvckVDbGFzcywgbnVsbCwgInJlc2V0TGFiZWxzIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCW9wID0gYWRkRU9wZXJhdGlvbihkZWNvcmF0b3JFQ2xhc3MsIG51bGwsICJnZXRMYWJlbHNUb1VwZGF0ZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgdGhlRWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgInBhcnRpdGlvbiIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgdGhlRWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgIm1heCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJZzEgPSBjcmVhdGVFR2VuZXJpY1R5cGUodGhlRWNvcmVQYWNrYWdlLmdldEVFTGlzdCgpKTsKKwkJZzIgPSBjcmVhdGVFR2VuZXJpY1R5cGUodGhlR3JhcGhQYWNrYWdlLmdldER5bmFtaWNMYWJlbCgpKTsKKwkJZzEuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzIpOworCQlpbml0RU9wZXJhdGlvbihvcCwgZzEpOworCisJCW9wID0gYWRkRU9wZXJhdGlvbihkZWNvcmF0b3JFQ2xhc3MsIG51bGwsICJwcmVwYXJlIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldE1vZGVsKCksICJtb2RlbCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRTVEVNVGltZSgpLCAidGltZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGVkZ2VEZWNvcmF0b3JFQ2xhc3MsIEVkZ2VEZWNvcmF0b3IuY2xhc3MsICJFZGdlRGVjb3JhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhncmFwaERlY29yYXRvckVDbGFzcywgR3JhcGhEZWNvcmF0b3IuY2xhc3MsICJHcmFwaERlY29yYXRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MobW9kZWxFQ2xhc3MsIE1vZGVsLmNsYXNzLCAiTW9kZWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0TW9kZWxfTW9kZWxzKCksIHRoaXMuZ2V0TW9kZWwoKSwgbnVsbCwgIm1vZGVscyIsIG51bGwsIDAsIC0xLCBNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRNb2RlbF9HcmFwaHMoKSwgdGhlR3JhcGhQYWNrYWdlLmdldEdyYXBoKCksIG51bGwsICJncmFwaHMiLCBudWxsLCAwLCAtMSwgTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0TW9kZWxfR3JhcGhEZWNvcmF0b3JzKCksIHRoaXMuZ2V0R3JhcGhEZWNvcmF0b3IoKSwgbnVsbCwgImdyYXBoRGVjb3JhdG9ycyIsIG51bGwsIDAsIC0xLCBNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRNb2RlbF9Ob2RlRGVjb3JhdG9ycygpLCB0aGlzLmdldE5vZGVEZWNvcmF0b3IoKSwgbnVsbCwgIm5vZGVEZWNvcmF0b3JzIiwgbnVsbCwgMCwgLTEsIE1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldE1vZGVsX0VkZ2VEZWNvcmF0b3JzKCksIHRoaXMuZ2V0RWRnZURlY29yYXRvcigpLCBudWxsLCAiZWRnZURlY29yYXRvcnMiLCBudWxsLCAwLCAtMSwgTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlvcCA9IGFkZEVPcGVyYXRpb24obW9kZWxFQ2xhc3MsIHRoZUdyYXBoUGFja2FnZS5nZXRHcmFwaCgpLCAiZ2V0Q2Fub25pY2FsR3JhcGgiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0VVJJKCksICJ1cmkiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIHRoZUNvbW1vblBhY2thZ2UuZ2V0SWRlbnRpZmlhYmxlRmlsdGVyKCksICJmaWx0ZXIiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0U1RFTVRpbWUoKSwgInRpbWUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJb3AgPSBhZGRFT3BlcmF0aW9uKG1vZGVsRUNsYXNzLCBudWxsLCAicHJlcGFyZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRTVEVNVGltZSgpLCAidGltZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKG5vZGVEZWNvcmF0b3JFQ2xhc3MsIE5vZGVEZWNvcmF0b3IuY2xhc3MsICJOb2RlRGVjb3JhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzdGVtVGltZUVDbGFzcywgU1RFTVRpbWUuY2xhc3MsICJTVEVNVGltZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTVEVNVGltZV9UaW1lKCksIGVjb3JlUGFja2FnZS5nZXRFRGF0ZSgpLCAidGltZSIsIG51bGwsIDAsIDEsIFNURU1UaW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJb3AgPSBhZGRFT3BlcmF0aW9uKHN0ZW1UaW1lRUNsYXNzLCB0aGlzLmdldFNURU1UaW1lKCksICJhZGRJbmNyZW1lbnQiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAidGltZUluY3JlbWVudCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlhZGRFT3BlcmF0aW9uKHN0ZW1UaW1lRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAiaGFzaENvZGUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJb3AgPSBhZGRFT3BlcmF0aW9uKHN0ZW1UaW1lRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImVxdWFscyIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVKYXZhT2JqZWN0KCksICJvYmoiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhjb21wYXJhYmxlRUNsYXNzLCBDb21wYXJhYmxlLmNsYXNzLCAiQ29tcGFyYWJsZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCisJCWluaXRFRGF0YVR5cGUodXJpRURhdGFUeXBlLCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLmNsYXNzLCAiVVJJIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIENyZWF0ZSByZXNvdXJjZQorCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKwl9CisKK30gLy9Nb2RlbFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9pbXBsL05vZGVEZWNvcmF0b3JJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9pbXBsL05vZGVEZWNvcmF0b3JJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjZTgxYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL2ltcGwvTm9kZURlY29yYXRvckltcGwuamF2YQpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5vZGUgRGVjb3JhdG9yPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTm9kZURlY29yYXRvckltcGwgZXh0ZW5kcyBEZWNvcmF0b3JJbXBsIGltcGxlbWVudHMgTm9kZURlY29yYXRvciB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBOb2RlRGVjb3JhdG9ySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9ERUNPUkFUT1I7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbCNzYW5lKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5zYW5lKCk7CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gc2FuZQorfSAvLyBOb2RlRGVjb3JhdG9ySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvaW1wbC9TVEVNVGltZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL2ltcGwvU1RFTVRpbWVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU3OWE1OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL2ltcGwvU1RFTVRpbWVJbXBsLmphdmEKQEAgLTAsMCArMSwyMjQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNURU0gVGltZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuU1RFTVRpbWVJbXBsI2dldFRpbWUgPGVtPlRpbWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTVEVNVGltZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNURU1UaW1lIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZSgpIDxlbT5UaW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGltZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEYXRlIFRJTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZSgpIDxlbT5UaW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGltZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIERhdGUgdGltZSA9IFRJTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBTVEVNVGltZUltcGwoKSB7CisJCXN1cGVyKCk7CisJCS8vIFNldCB0aGUgZGVmYXVsdCB0aW1lIHRvIHRoZSBjdXJyZW50IHRpbWUuCisJCXNldFRpbWUoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkpOworCX0gLy8gU1RFTVRpbWVJbXBsCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuU1RFTV9USU1FOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIERhdGUgZ2V0VGltZSgpIHsKKwkJcmV0dXJuIChEYXRlKXRpbWUuY2xvbmUoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRpbWUoRGF0ZSBuZXdUaW1lKSB7CisJCURhdGUgb2xkVGltZSA9IHRpbWU7CisJCXRpbWUgPSAoRGF0ZSluZXdUaW1lLmNsb25lKCk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5TVEVNX1RJTUVfX1RJTUUsIG9sZFRpbWUsIHRpbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBTVEVNVGltZSBhZGRJbmNyZW1lbnQobG9uZyB0aW1lSW5jcmVtZW50KSB7CisJCWZpbmFsIFNURU1UaW1lIHJldFZhbHVlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTVEVNVGltZSgpOworCisJCWZpbmFsIGxvbmcgbmV3VGltZSA9IHRpbWUuZ2V0VGltZSgpICsgdGltZUluY3JlbWVudDsKKwkJZmluYWwgRGF0ZSBuZXdEYXRlID0gbmV3IERhdGUobmV3VGltZSk7CisKKwkJcmV0VmFsdWUuc2V0VGltZShuZXdEYXRlKTsKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBhZGRJbmNyZW1lbnQKKwkKKwkKKworCS8qKgorCSAqIGNvbXBhcmVzIFNURU1UaW1lcworCSAqIAorCSAqLworCXB1YmxpYyBpbnQgY29tcGFyZVRvKFNURU1UaW1lIG90aGVyVGltZSkgeworCQlyZXR1cm4gdGltZS5jb21wYXJlVG8ob3RoZXJUaW1lLmdldFRpbWUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWZpbmFsIGludCBQUklNRSA9IDMxOworCQlpbnQgcmVzdWx0ID0gMTsKKwkJcmVzdWx0ID0gUFJJTUUgKiByZXN1bHQgKyAoKHRpbWUgPT0gbnVsbCkgPyAwIDogdGltZS5oYXNoQ29kZSgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKHRoaXMgPT0gb2JqKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChvYmogPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWZpbmFsIFNURU1UaW1lSW1wbCBvdGhlciA9IChTVEVNVGltZUltcGwpIG9iajsKKwkJaWYgKHRpbWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnRpbWUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXRpbWUuZXF1YWxzKG90aGVyLnRpbWUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RlbFBhY2thZ2UuU1RFTV9USU1FX19USU1FOgorCQkJCXJldHVybiBnZXRUaW1lKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGVsUGFja2FnZS5TVEVNX1RJTUVfX1RJTUU6CisJCQkJc2V0VGltZSgoRGF0ZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGVsUGFja2FnZS5TVEVNX1RJTUVfX1RJTUU6CisJCQkJc2V0VGltZShUSU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGVsUGFja2FnZS5TVEVNX1RJTUVfX1RJTUU6CisJCQkJcmV0dXJuIFRJTUVfRURFRkFVTFQgPT0gbnVsbCA/IHRpbWUgIT0gbnVsbCA6ICFUSU1FX0VERUZBVUxULmVxdWFscyh0aW1lKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkKKwkJCXJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCS8vIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQkvLyByZXN1bHQuYXBwZW5kKCIgKHRpbWU6ICIpOworCQkvLyByZXN1bHQuYXBwZW5kKHRpbWUpOworCQkvLyByZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiB0aW1lLnRvU3RyaW5nKCk7CisJfSAvLyB0b1N0cmluZworCit9IC8vIFNURU1UaW1lSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvcHJvdmlkZXIvRGVjb3JhdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9wcm92aWRlci9EZWNvcmF0b3JJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWQxMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvcHJvdmlkZXIvRGVjb3JhdG9ySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxODggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5JZGVudGlmaWFibGVJdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRGVjb3JhdG9ySXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBJZGVudGlmaWFibGVJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGVjb3JhdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQkvL2FkZExhYmVsc1RvVXBkYXRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzR2VuKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkKKwkvKioKKwkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7CisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuREVDT1JBVE9SX19MQUJFTFNfVE9fVVBEQVRFKTsKKwkJfQorCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKKwkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgorCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCisKKwkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgRGVjb3JhdG9yLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9jdXN0b21vYmoxNi9EZWNvcmF0b3IiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChEZWNvcmF0b3Ipb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9EZWNvcmF0b3JfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfRGVjb3JhdG9yX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEZWNvcmF0b3IuY2xhc3MpKSB7CisJCQljYXNlIE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX1BST0dSRVNTOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBDb3JlRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Byb3ZpZGVyL0VkZ2VEZWNvcmF0b3JJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Byb3ZpZGVyL0VkZ2VEZWNvcmF0b3JJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmQ4ZmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvcHJvdmlkZXIvRWRnZURlY29yYXRvckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db3JlRWRpdFBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5FZGdlRGVjb3JhdG9yOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkVkZ2VEZWNvcmF0b3J9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEVkZ2VEZWNvcmF0b3JJdGVtUHJvdmlkZXIKKwlleHRlbmRzIERlY29yYXRvckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGdlRGVjb3JhdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlVUkkgbGFiZWxWYWx1ZSA9ICgoRWRnZURlY29yYXRvcilvYmplY3QpLmdldFVSSSgpOworCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0VkZ2VEZWNvcmF0b3JfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfRWRnZURlY29yYXRvcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9wcm92aWRlci9HcmFwaERlY29yYXRvckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvcHJvdmlkZXIvR3JhcGhEZWNvcmF0b3JJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjJmMDAwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvcHJvdmlkZXIvR3JhcGhEZWNvcmF0b3JJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuR3JhcGhEZWNvcmF0b3I7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuR3JhcGhEZWNvcmF0b3J9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEdyYXBoRGVjb3JhdG9ySXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBEZWNvcmF0b3JJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR3JhcGhEZWNvcmF0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChHcmFwaERlY29yYXRvcilvYmplY3QpLmdldFVSSSgpOworCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0dyYXBoRGVjb3JhdG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX0dyYXBoRGVjb3JhdG9yX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Byb3ZpZGVyL01vZGVsRWRpdFBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvcHJvdmlkZXIvTW9kZWxFZGl0UGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhYmQ1NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Byb3ZpZGVyL01vZGVsRWRpdFBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLkVjbGlwc2VVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29tbW9uRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuR3JhcGhFZGl0UGx1Z2luOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgTW9kZWwgZWRpdG9yIHBsdWdpbi4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1vZGVsRWRpdFBsdWdpbiBleHRlbmRzIEVNRlBsdWdpbiB7CisJLyoqCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTW9kZWxFZGl0UGx1Z2luIElOU1RBTkNFID0gbmV3IE1vZGVsRWRpdFBsdWdpbigpOworCisJLyoqCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1vZGVsRWRpdFBsdWdpbigpIHsKKwkJc3VwZXIKKwkJICAobmV3IFJlc291cmNlTG9jYXRvciBbXSB7CisJCSAgICAgR3JhcGhFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkgICAgIENvbW1vbkVkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCSAgIH0pOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKworCS8qKgorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVVJUGx1Z2luIHsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOworCisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgorCQkJLy8KKwkJCXBsdWdpbiA9IHRoaXM7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Byb3ZpZGVyL01vZGVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9wcm92aWRlci9Nb2RlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYmQ0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9wcm92aWRlci9Nb2RlbEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzY2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuVXRpbGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuSWRlbnRpZmlhYmxlSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWx9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE1vZGVsSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBJZGVudGlmaWFibGVJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTW9kZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7CisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTU9ERUxfX01PREVMUyk7CisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTU9ERUxfX0dSQVBIUyk7CisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTU9ERUxfX0dSQVBIX0RFQ09SQVRPUlMpOworCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk1PREVMX19OT0RFX0RFQ09SQVRPUlMpOworCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk1PREVMX19FREdFX0RFQ09SQVRPUlMpOworCQl9CisJCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKKwkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgorCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCisJCQorCQlPYmplY3QgdGVtcCA9IGNoaWxkOworCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRmlsZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBJRmlsZSBpRmlsZSA9IChJRmlsZSkgY2hpbGQ7CisJCQlmaW5hbCBVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkoaUZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsgCisJCQlmaW5hbCBJZGVudGlmaWFibGUgaWRlbnRpZmFibGUgPSBVdGlsaXR5LmdldElkZW50aWZpYWJsZSh1cmkpOworCQkJdGVtcCA9IGlkZW50aWZhYmxlOworCQl9IC8vIGlmIElGaWxlCisJCQorCQllbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJLy8gWWVzCisJCQkvLyBUaGVzZSBjb21lIGZyb20gSWRlbnRpZmFibGVQbHVnaW5WaWV3CisJCQlmaW5hbCBTdHJpbmcgdXJpU3RyaW5nID0gKFN0cmluZykgY2hpbGQ7CisJCQl0cnkgeworCQkJCWZpbmFsIFVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaVN0cmluZyk7CisJCQkJZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50aWZhYmxlICA9IFV0aWxpdHkuZ2V0SWRlbnRpZmlhYmxlKHVyaSk7CisJCQkJdGVtcCA9IGlkZW50aWZhYmxlOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBJZ25vcmUgaXQKKwkJCX0KKwkJfSAvLyBpZiBTdHJpbmcKKworCQlpZiAodGVtcCBpbnN0YW5jZW9mIElkZW50aWZpYWJsZSkgeworCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIHRlbXApOworCQl9IGVsc2UKKwkJCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7CisJfSAvLyBnZXRDaGlsZEZlYXR1cmUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlR2VuKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgeworCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCisJCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KKworCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgTW9kZWwuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKy8vCQlyZXR1cm4gZ2V0SW1hZ2VHZW4ob2JqZWN0KTsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbW9iajE2L01vZGVsIikpOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOworCX0gLy8gZ2V0VGV4dAorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKy8vCUBPdmVycmlkZQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChNb2RlbClvYmplY3QpLmdldFVSSSgpOworCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX01vZGVsX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX01vZGVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisJCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTW9kZWwuY2xhc3MpKSB7CisJCQljYXNlIE1vZGVsUGFja2FnZS5NT0RFTF9fTU9ERUxTOgorCQkJY2FzZSBNb2RlbFBhY2thZ2UuTU9ERUxfX0dSQVBIUzoKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLk1PREVMX19HUkFQSF9ERUNPUkFUT1JTOgorCQkJY2FzZSBNb2RlbFBhY2thZ2UuTU9ERUxfX05PREVfREVDT1JBVE9SUzoKKwkJCWNhc2UgTW9kZWxQYWNrYWdlLk1PREVMX19FREdFX0RFQ09SQVRPUlM6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKE1vZGVsUGFja2FnZS5MaXRlcmFscy5NT0RFTF9fTU9ERUxTLAorCQkJCSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1vZGVsKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKE1vZGVsUGFja2FnZS5MaXRlcmFscy5NT0RFTF9fR1JBUEhTLAorCQkJCSBHcmFwaEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoKCkpKTsKKwl9CisKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0LCBmbG9hdCwgaW50LCBpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKKwkJCU9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAorCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisJCS8vIFdlIGFkZCBETkQuRFJPUF9MSU5LIGFzIGFuIGFsbG93ZWQgb3BlcmF0aW9uIGJlY2F1c2UgYWxsIGRyb3BzIHdpbGwKKwkJLy8gYmUgbGlua3MgYW5kIHNvbWUgc291cmNlcyBkb24ndCBhbGxvdyBsaW5rcywgd2UgY29udmVydCB0byBsaW5rcyBhbnl3YXkKKwkJcmV0dXJuIHN1cGVyLmNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucyB8IERORC5EUk9QX0xJTkssCisJCQkJb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKKwl9IC8vIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUFkZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgaW50KQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCisJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKKwkJZmluYWwgQ29sbGVjdGlvbiBpZGVudGlmaWFibGVDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOworCQlmb3IgKE9iamVjdCB2YWx1ZSA6IGNvbGxlY3Rpb24pIHsKKworCQkJT2JqZWN0IHRlbXAgPSB2YWx1ZTsKKwkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIElGaWxlKSB7CisJCQkJLy8gWWVzCisJCQkJZmluYWwgSUZpbGUgaUZpbGUgPSAoSUZpbGUpIHZhbHVlOworCQkJCWZpbmFsIFVSSSB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShpRmlsZS5nZXRMb2NhdGlvbigpCisJCQkJCQkudG9TdHJpbmcoKSk7CisJCQkJZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50aWZhYmxlID0gVXRpbGl0eS5nZXRJZGVudGlmaWFibGUodXJpKTsKKwkJCQlpZGVudGlmaWFibGVDb2xsZWN0aW9uLmFkZChpZGVudGlmYWJsZSk7CisJCQkJdGVtcCA9IGlkZW50aWZhYmxlOworCQkJfSAvLyBpZiBJRmlsZQorCisJCQllbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJCS8vIFllcworCQkJCWZpbmFsIFN0cmluZyB1cmlTdHJpbmcgPSAoU3RyaW5nKSB2YWx1ZTsKKwkJCQl0cnkgeworCQkJCQlmaW5hbCBVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSSh1cmlTdHJpbmcpOworCQkJCQlmaW5hbCBJZGVudGlmaWFibGUgaWRlbnRpZmFibGUgPSBVdGlsaXR5CisJCQkJCQkJLmdldElkZW50aWZpYWJsZSh1cmkpOworCQkJCQl0ZW1wID0gaWRlbnRpZmFibGU7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gSWdub3JlIGl0CisJCQkJfQorCQkJfSAvLyBpZiBTdHJpbmcKKworCQkJaWYgKHRlbXAgaW5zdGFuY2VvZiBJZGVudGlmaWFibGUpIHsKKwkJCQlpZGVudGlmaWFibGVDb2xsZWN0aW9uLmFkZCh0ZW1wKTsKKwkJCX0KKwkJfSAvLyBmb3IgZWFjaCBPYmplY3QKKworCQlyZXR1cm4gc3VwZXIuY3JlYXRlQWRkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLAorCQkJCWlkZW50aWZpYWJsZUNvbGxlY3Rpb24sIGluZGV4KTsKKwl9IC8vIGNyZWF0ZUFkZENvbW1hbmQKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKKwkJCUVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCwKKwkJCUNvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgeworCQkKKwkJcmV0dXJuIG5ldyBDcmVhdGVDaGlsZENvbW1hbmQoZG9tYWluLG93bmVyLGZlYXR1cmUsdmFsdWUsaW5kZXgsY29sbGVjdGlvbix0aGlzKSB7CisJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDb21tYW5kKCkgeworCisJCQkJQ29tbWFuZCByZXRWYWx1ZSA9IG51bGw7CisKKwkJCQlmaW5hbCBDb21tYW5kIGNyZWF0ZUNoaWxkQ29tbWFuZCA9IHN1cGVyLmNyZWF0ZUNvbW1hbmQoKTsKKworCQkJCWZpbmFsIFJlc291cmNlIHBhcmVudFJlc291cmNlID0gb3duZXIuZVJlc291cmNlKCk7CisJCQkJLy8gQXJlIHdlIGNyZWF0aW5nIGEgTW9kZWwgb3IgYSBHcmFwaD8KKwkJCQlpZiAocGFyZW50UmVzb3VyY2UgIT0gbnVsbCAmJiAoY2hpbGQgaW5zdGFuY2VvZiBNb2RlbCB8fCBjaGlsZCBpbnN0YW5jZW9mIEdyYXBoKSkgeworCQkJCQkvLyBZZXMKKwkJCQkJZmluYWwgRU9iamVjdCB0ZW1wID0gKEVPYmplY3QpIGNoaWxkOworCQkJCQkvLyBEb2VzIHRoZSBjaGlsZCBoYXZlIGEgcmVzb3VyY2UgYWxyZWFkeT8KKwkJCQkJaWYgKHRlbXAuZVJlc291cmNlKCkgPT0gbnVsbCkgeworCQkJCQkJLy8gTm8KKwkJCQkJCWZpbmFsIENvbW1hbmQgYWRkQ29tbWFuZCA9IG5ldyBBZGRDb21tYW5kKGRvbWFpbiwKKwkJCQkJCQkJcGFyZW50UmVzb3VyY2UuZ2V0Q29udGVudHMoKSwgdGVtcCk7CisKKwkJCQkJCWZpbmFsIENvbXBvdW5kQ29tbWFuZCBjb21wb3VuZENvbW1hbmQgPSBuZXcgQ29tcG91bmRDb21tYW5kKAorCQkJCQkJCQkwLCBjcmVhdGVDaGlsZENvbW1hbmQuZ2V0TGFiZWwoKSwKKwkJCQkJCQkJY3JlYXRlQ2hpbGRDb21tYW5kLmdldERlc2NyaXB0aW9uKCkpOworCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChjcmVhdGVDaGlsZENvbW1hbmQpOworCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChhZGRDb21tYW5kKTsKKwkJCQkJCXJldFZhbHVlID0gY29tcG91bmRDb21tYW5kOworCQkJCQl9IC8vIGlmIE1vZGVsIGRvZXMgbm90IGhhdmUgYSByZXNvdXJjZQorCQkJCX0gLy8gaWYgTW9kZWwKKwkJCQllbHNlIHsKKwkJCQkJcmV0VmFsdWUgPSBjcmVhdGVDaGlsZENvbW1hbmQ7CisJCQkJfQorCisJCQkJcmV0dXJuIHJldFZhbHVlOworCQkJfSAvLyBjcmVhdGVDb21tYW5kCisJCQorCQl9OyAvLyBDcmVhdGVDaGlsZENvbW1hbmQKKwkJCisJfSAvLyBjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNpc1dyYXBwaW5nTmVlZGVkKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7CisJCS8vIHJldHVybiBzdXBlci5pc1dyYXBwaW5nTmVlZGVkKG9iamVjdCk7CisJCS8vIFdlIHJldHVybiB0cnVlIHNvIHRoYXQgbm9uLWNvbnRhaW5tZW50IHJlZmVyZW5jZXMgYXJlIHdyYXBwZWQuIFRoaXMKKwkJLy8gZW5hYmxlcyB0aGUgZGVsZXRlIGNvbW1hbmQgaW4gdGhlIGVkaXRvcidzIGNvbnRleHQgbWVudS4KKwkJcmV0dXJuIHRydWU7CisJfSAvLyBpc1dyYXBwaW5nTmVlZGVkCisJCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBDb3JlRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Byb3ZpZGVyL01vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Byb3ZpZGVyL01vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzIyZGJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvcHJvdmlkZXIvTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzI3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC51dGlsLk1vZGVsQWRhcHRlckZhY3Rvcnk7CisKKy8qKgorICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLgorICogVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uCisgKiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgorICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIE1vZGVsQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKKworCS8qKgorCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5IHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxPYmplY3Q+IHN1cHBvcnRlZFR5cGVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3J9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGVjb3JhdG9ySXRlbVByb3ZpZGVyIGRlY29yYXRvckl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWNvcmF0b3JBZGFwdGVyKCkgeworCQlpZiAoZGVjb3JhdG9ySXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCWRlY29yYXRvckl0ZW1Qcm92aWRlciA9IG5ldyBEZWNvcmF0b3JJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gZGVjb3JhdG9ySXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkVkZ2VEZWNvcmF0b3J9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRWRnZURlY29yYXRvckl0ZW1Qcm92aWRlciBlZGdlRGVjb3JhdG9ySXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5FZGdlRGVjb3JhdG9yfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFZGdlRGVjb3JhdG9yQWRhcHRlcigpIHsKKwkJaWYgKGVkZ2VEZWNvcmF0b3JJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJZWRnZURlY29yYXRvckl0ZW1Qcm92aWRlciA9IG5ldyBFZGdlRGVjb3JhdG9ySXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGVkZ2VEZWNvcmF0b3JJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuR3JhcGhEZWNvcmF0b3J9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgR3JhcGhEZWNvcmF0b3JJdGVtUHJvdmlkZXIgZ3JhcGhEZWNvcmF0b3JJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkdyYXBoRGVjb3JhdG9yfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaERlY29yYXRvckFkYXB0ZXIoKSB7CisJCWlmIChncmFwaERlY29yYXRvckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlncmFwaERlY29yYXRvckl0ZW1Qcm92aWRlciA9IG5ldyBHcmFwaERlY29yYXRvckl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBncmFwaERlY29yYXRvckl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbH0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNb2RlbEl0ZW1Qcm92aWRlciBtb2RlbEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWx9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZGVsQWRhcHRlcigpIHsKKwkJaWYgKG1vZGVsSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCW1vZGVsSXRlbVByb3ZpZGVyID0gbmV3IE1vZGVsSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIG1vZGVsSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3J9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTm9kZURlY29yYXRvckl0ZW1Qcm92aWRlciBub2RlRGVjb3JhdG9ySXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVOb2RlRGVjb3JhdG9yQWRhcHRlcigpIHsKKwkJaWYgKG5vZGVEZWNvcmF0b3JJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJbm9kZURlY29yYXRvckl0ZW1Qcm92aWRlciA9IG5ldyBOb2RlRGVjb3JhdG9ySXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIG5vZGVEZWNvcmF0b3JJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWV9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU1RFTVRpbWVJdGVtUHJvdmlkZXIgc3RlbVRpbWVJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTVEVNVGltZUFkYXB0ZXIoKSB7CisJCWlmIChzdGVtVGltZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlzdGVtVGltZUl0ZW1Qcm92aWRlciA9IG5ldyBTVEVNVGltZUl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBzdGVtVGltZUl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgeworCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7CisJCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7CisJCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7CisJCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3M8Pz4pIHx8ICgoKENsYXNzPD8+KXR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7CisJCQkJcmV0dXJuIGFkYXB0ZXI7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn0gYW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKworCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgeworCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJaWYgKGRlY29yYXRvckl0ZW1Qcm92aWRlciAhPSBudWxsKSBkZWNvcmF0b3JJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoZWRnZURlY29yYXRvckl0ZW1Qcm92aWRlciAhPSBudWxsKSBlZGdlRGVjb3JhdG9ySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKGdyYXBoRGVjb3JhdG9ySXRlbVByb3ZpZGVyICE9IG51bGwpIGdyYXBoRGVjb3JhdG9ySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKG1vZGVsSXRlbVByb3ZpZGVyICE9IG51bGwpIG1vZGVsSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKG5vZGVEZWNvcmF0b3JJdGVtUHJvdmlkZXIgIT0gbnVsbCkgbm9kZURlY29yYXRvckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChzdGVtVGltZUl0ZW1Qcm92aWRlciAhPSBudWxsKSBzdGVtVGltZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9wcm92aWRlci9Ob2RlRGVjb3JhdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9wcm92aWRlci9Ob2RlRGVjb3JhdG9ySXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkMDZjMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Byb3ZpZGVyL05vZGVEZWNvcmF0b3JJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBOb2RlRGVjb3JhdG9ySXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBEZWNvcmF0b3JJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm9kZURlY29yYXRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKE5vZGVEZWNvcmF0b3Ipb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9Ob2RlRGVjb3JhdG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX05vZGVEZWNvcmF0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvcHJvdmlkZXIvU1RFTVRpbWVJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Byb3ZpZGVyL1NURU1UaW1lSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQwZTY1MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Byb3ZpZGVyL1NURU1UaW1lSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNjAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZX0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU1RFTVRpbWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNURU1UaW1lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRUaW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUaW1lIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkVGltZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NURU1UaW1lX3RpbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU1RFTVRpbWVfdGltZV9mZWF0dXJlIiwgIl9VSV9TVEVNVGltZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIE1vZGVsUGFja2FnZS5MaXRlcmFscy5TVEVNX1RJTUVfX1RJTUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFNURU1UaW1lLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9TVEVNVGltZSIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJRGF0ZSBsYWJlbFZhbHVlID0gKChTVEVNVGltZSlvYmplY3QpLmdldFRpbWUoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9TVEVNVGltZV90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9TVEVNVGltZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU1RFTVRpbWUuY2xhc3MpKSB7CisJCQljYXNlIE1vZGVsUGFja2FnZS5TVEVNX1RJTUVfX1RJTUU6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBDb3JlRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3V0aWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvdXRpbC9Nb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhNjkwMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3V0aWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjc5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC51dGlsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkVkZ2VEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkdyYXBoRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE1vZGVsQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIE1vZGVsUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1vZGVsQWRhcHRlckZhY3RvcnkoKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7CisJCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTW9kZWxTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgTW9kZWxTd2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZWNvcmF0b3IoRGVjb3JhdG9yIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVEZWNvcmF0b3JBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFZGdlRGVjb3JhdG9yKEVkZ2VEZWNvcmF0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUVkZ2VEZWNvcmF0b3JBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VHcmFwaERlY29yYXRvcihHcmFwaERlY29yYXRvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlR3JhcGhEZWNvcmF0b3JBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNb2RlbChNb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VOb2RlRGVjb3JhdG9yKE5vZGVEZWNvcmF0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZU5vZGVEZWNvcmF0b3JBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTVEVNVGltZShTVEVNVGltZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU1RFTVRpbWVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyA8VD4gQWRhcHRlciBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgPFQ+IEFkYXB0ZXIgY2FzZUNvbW1vbl9Db21wYXJhYmxlKENvbXBhcmFibGU8VD4gb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUNvbW1vbl9Db21wYXJhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworCQkJfQorCQl9OworCisJLyoqCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IgPGVtPkRlY29yYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlY29yYXRvckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkVkZ2VEZWNvcmF0b3IgPGVtPkVkZ2UgRGVjb3JhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5FZGdlRGVjb3JhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVkZ2VEZWNvcmF0b3JBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5HcmFwaERlY29yYXRvciA8ZW0+R3JhcGggRGVjb3JhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5HcmFwaERlY29yYXRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaERlY29yYXRvckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsIDxlbT5Nb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yIDxlbT5Ob2RlIERlY29yYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVOb2RlRGVjb3JhdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUgPGVtPlNURU0gVGltZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU1RFTVRpbWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmEubGFuZy5Db21wYXJhYmxlIDxlbT5Db21wYXJhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhcmFibGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmEubGFuZy5Db21wYXJhYmxlIDxlbT5Db21wYXJhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbW1vbl9Db21wYXJhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9Nb2RlbEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC91dGlsL01vZGVsU3dpdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC91dGlsL01vZGVsU3dpdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0YTA4NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3V0aWwvTW9kZWxTd2l0Y2guamF2YQpAQCAtMCwwICsxLDMwNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkVkZ2VEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkdyYXBoRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KKyAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KKyAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKKyAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0CisgKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5CisgKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKKyAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNb2RlbFN3aXRjaDxUMT4geworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgTW9kZWxQYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTW9kZWxTd2l0Y2goKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7CisJCX0KKwkJZWxzZSB7CisJCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKKwkJCXJldHVybgorCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/CisJCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKKwkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQxIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgeworCQkJY2FzZSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SOiB7CisJCQkJRGVjb3JhdG9yIGRlY29yYXRvciA9IChEZWNvcmF0b3IpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKGRlY29yYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKGRlY29yYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tbW9uX0NvbXBhcmFibGUoZGVjb3JhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIE1vZGVsUGFja2FnZS5FREdFX0RFQ09SQVRPUjogeworCQkJCUVkZ2VEZWNvcmF0b3IgZWRnZURlY29yYXRvciA9IChFZGdlRGVjb3JhdG9yKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUVkZ2VEZWNvcmF0b3IoZWRnZURlY29yYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKGVkZ2VEZWNvcmF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShlZGdlRGVjb3JhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21tb25fQ29tcGFyYWJsZShlZGdlRGVjb3JhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIE1vZGVsUGFja2FnZS5HUkFQSF9ERUNPUkFUT1I6IHsKKwkJCQlHcmFwaERlY29yYXRvciBncmFwaERlY29yYXRvciA9IChHcmFwaERlY29yYXRvcil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VHcmFwaERlY29yYXRvcihncmFwaERlY29yYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKGdyYXBoRGVjb3JhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoZ3JhcGhEZWNvcmF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbW1vbl9Db21wYXJhYmxlKGdyYXBoRGVjb3JhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIE1vZGVsUGFja2FnZS5NT0RFTDogeworCQkJCU1vZGVsIG1vZGVsID0gKE1vZGVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZU1vZGVsKG1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUobW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbW1vbl9Db21wYXJhYmxlKG1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUjogeworCQkJCU5vZGVEZWNvcmF0b3Igbm9kZURlY29yYXRvciA9IChOb2RlRGVjb3JhdG9yKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3Iobm9kZURlY29yYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKG5vZGVEZWNvcmF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShub2RlRGVjb3JhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21tb25fQ29tcGFyYWJsZShub2RlRGVjb3JhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIE1vZGVsUGFja2FnZS5TVEVNX1RJTUU6IHsKKwkJCQlTVEVNVGltZSBzdGVtVGltZSA9IChTVEVNVGltZSl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VTVEVNVGltZShzdGVtVGltZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShzdGVtVGltZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVjb3JhdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVjb3JhdG9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZURlY29yYXRvcihEZWNvcmF0b3Igb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVkZ2UgRGVjb3JhdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWRnZSBEZWNvcmF0b3I8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRWRnZURlY29yYXRvcihFZGdlRGVjb3JhdG9yIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBEZWNvcmF0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBEZWNvcmF0b3I8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlR3JhcGhEZWNvcmF0b3IoR3JhcGhEZWNvcmF0b3Igb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTW9kZWwoTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgRGVjb3JhdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZSBEZWNvcmF0b3I8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTm9kZURlY29yYXRvcihOb2RlRGVjb3JhdG9yIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TVEVNIFRpbWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TVEVNIFRpbWU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlU1RFTVRpbWUoU1RFTVRpbWUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgPFQ+IFQxIGNhc2VDb21wYXJhYmxlKENvbXBhcmFibGU8VD4gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgPFQ+IFQxIGNhc2VDb21tb25fQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9IC8vTW9kZWxTd2l0Y2gKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL0RvdWJsZU1vZGlmaWVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9Eb3VibGVNb2RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTU2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9Eb3VibGVNb2RpZmllci5qYXZhCkBAIC0wLDAgKzEsODUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb3VibGUgTW9kaWZpZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZU1vZGlmaWVyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZU1vZGlmaWVyI2dldE9yaWdpbmFsVmFsdWUgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlI2dldERvdWJsZU1vZGlmaWVyKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIERvdWJsZU1vZGlmaWVyIGV4dGVuZHMgU2luZ2xlVmFsdWVNb2RpZmllciB7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFZhbHVlKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2UjZ2V0RG91YmxlTW9kaWZpZXJfVmFsdWUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0VmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVNb2RpZmllciNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VmFsdWUoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0T3JpZ2luYWxWYWx1ZShkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlI2dldERvdWJsZU1vZGlmaWVyX09yaWdpbmFsVmFsdWUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0T3JpZ2luYWxWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZU1vZGlmaWVyI2dldE9yaWdpbmFsVmFsdWUgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0T3JpZ2luYWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0T3JpZ2luYWxWYWx1ZShkb3VibGUgdmFsdWUpOworfSAvLyBEb3VibGVNb2RpZmllcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvRG91YmxlTk9QTW9kaWZpZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL0RvdWJsZU5PUE1vZGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMzZWQyMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL0RvdWJsZU5PUE1vZGlmaWVyLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLy8gRG91YmxlTk9QTW9kaWZpZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEEgPGNvZGU+Tk9QTW9kaWZpZXI8L2NvZGU+IGRvZXMgbm90aGluZy4gSXQgaXMgdXNlZnVsIGZvciB0aGUgR1VJCisgKiBjb21wb25lbnRzIHRoYXQgZWRpdCB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyfXMgdG8gaGF2ZSBvbmUgdGhhdCBpcyBhdmFpbGFibGUKKyAqIGZvciB0aGUgY2FzZSB3aGVuIG5vIHtAbGluayBGZWF0dXJlTW9kaWZpZXJ9IGlzIHNwZWNpZmllZCBieSB0aGUgdXNlci4KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRG91YmxlTk9QTW9kaWZpZXIgZXh0ZW5kcyBOT1BNb2RpZmllciB7CisJLy8gTm90aGluZworfSAvLyBEb3VibGVOT1BNb2RpZmllcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvRG91YmxlUmFuZ2VNb2RpZmllci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvRG91YmxlUmFuZ2VNb2RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MTRlNTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9Eb3VibGVSYW5nZU1vZGlmaWVyLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8vIERvdWJsZVJhbmdlTW9kaWZpZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEEgPGNvZGU+RG91YmxlUmFuZ2VNb2RpZmllcjwvY29kZT4gbW9kaWZpZXMgYSBkb3VibGUgdmFsdWVkIGZlYXR1cmUgZnJvbSBhCisgKiBzdGFydGluZyB2YWx1ZSB0byBhbmQgZW5kIHZhbHVlIChpbmNsdXNpdmU+IGJ5IGluY3JlbWVudHMuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIERvdWJsZVJhbmdlTW9kaWZpZXIgZXh0ZW5kcyBSYW5nZU1vZGlmaWVyIHsKKwkKKwkvKioKKwkgKiBAbW9kZWwKKwkgKi8KKwlkb3VibGUgZ2V0T3JpZ2luYWxWYWx1ZSgpOworCQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVSYW5nZU1vZGlmaWVyI2dldE9yaWdpbmFsVmFsdWUgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0T3JpZ2luYWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0T3JpZ2luYWxWYWx1ZShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogQG1vZGVsIGRlZmF1bHQ9Ii05OTk5OTk5OS4wIgorCSAqLworCWRvdWJsZSBnZXRTdGFydFZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlUmFuZ2VNb2RpZmllciNnZXRTdGFydFZhbHVlIDxlbT5TdGFydCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFN0YXJ0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFN0YXJ0VmFsdWUoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIEBtb2RlbCBkZWZhdWx0PSItOTk5OTk5OTkuMCIKKwkgKi8KKwlkb3VibGUgZ2V0RW5kVmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVSYW5nZU1vZGlmaWVyI2dldEVuZFZhbHVlIDxlbT5FbmQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVuZCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RW5kVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEVuZFZhbHVlKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBAbW9kZWwgZGVmYXVsdD0iLTk5OTk5OTk5LjAiCisJICovCisJZG91YmxlIGdldEluY3JlbWVudCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZVJhbmdlTW9kaWZpZXIjZ2V0SW5jcmVtZW50IDxlbT5JbmNyZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluY3JlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SW5jcmVtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJbmNyZW1lbnQoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG5leHQgdmFsdWUgb2YgdGhlIGZlYXR1cmUKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMC4wIiBjaGFuZ2VhYmxlPSJ0cnVlIgorCSAqLworCWRvdWJsZSBnZXROZXh0VmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVSYW5nZU1vZGlmaWVyI2dldE5leHRWYWx1ZSA8ZW0+TmV4dCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmV4dCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TmV4dFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXROZXh0VmFsdWUoZG91YmxlIHZhbHVlKTsKKworCQorfSAvLyBEb3VibGVSYW5nZU1vZGlmaWVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9Eb3VibGVTZXF1ZW5jZU1vZGlmaWVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9Eb3VibGVTZXF1ZW5jZU1vZGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI1MjBhOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL0RvdWJsZVNlcXVlbmNlTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDMwIEBACisvLyBEb3VibGVTZXF1ZW5jZU1vZGlmaWVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworLyoqCisgKiBBIHtAbGluayBEb3VibGVTZXF1ZW5jZU1vZGlmaWVyfSBtb2RpZmllcyBhIGZlYXR1cmUgYnkgc2V0dGluZyBpdCB0byBhCisgKiBzZXF1ZW5jZSBvZiAiZG91YmxlIiB2YWx1ZXMuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIERvdWJsZVNlcXVlbmNlTW9kaWZpZXIgZXh0ZW5kcyBTZXF1ZW5jZU1vZGlmaWVyIHsKKworCS8qKgorCSAqIEBtb2RlbAorCSAqLworCUVMaXN0PERvdWJsZT4gZ2V0U2VxdWVuY2UoKTsKKworfSAvLyBEb3VibGVTZXF1ZW5jZU1vZGlmaWVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9GZWF0dXJlTW9kaWZpZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL0ZlYXR1cmVNb2RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZmE0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9GZWF0dXJlTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLy8gRmVhdHVyZU1vZGlmaWVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEubGFuZy5TdHJpbmc7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsKKworLyoqCisgKiBBIHtAbGluayBGZWF0dXJlTW9kaWZpZXJ9IHNwZWNpZmllcyBob3cgdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZgorICogImZlYXR1cmUiIGluIGFuIHtAbGluayBJZGVudGlmaWFibGV9LgorICogCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKiBAaW1wbGVtZW50cyBTYW5pdHlDaGVja2VyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRmVhdHVyZU1vZGlmaWVyIGV4dGVuZHMgRU9iamVjdCwgU2FuaXR5Q2hlY2tlciB7CisJCisJLyoqCisJICogQHJldHVybiB0aGUge0BsaW5rIElkZW50aWZpYWJsZX0gdGhhdCB3aWxsIGJlIG1vZGlmaWVkLgorCSAqIEBtb2RlbCAKKwkgKi8KKwlFT2JqZWN0IGdldFRhcmdldCgpOworCQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXIjZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldDwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0VGFyZ2V0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUYXJnZXQoRU9iamVjdCB2YWx1ZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBpZCBvZiB0aGUgZmVhdHVyZSBiZWluZyBtb2RpZmllZAorCSAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKKwkgKi8KKwlFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRmVhdHVyZU1vZGlmaWVyI2dldEVTdHJ1Y3R1cmFsRmVhdHVyZSA8ZW0+RVN0cnVjdHVyYWwgRmVhdHVyZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RVN0cnVjdHVyYWwgRmVhdHVyZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRFU3RydWN0dXJhbEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIHZhbHVlKTsKKworCS8qKgorCSAqIEBtb2RlbAorCSAqLworCVN0cmluZyBnZXRGZWF0dXJlTmFtZSgpOworCQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXIjZ2V0RmVhdHVyZU5hbWUgPGVtPkZlYXR1cmUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmVhdHVyZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRGZWF0dXJlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RmVhdHVyZU5hbWUoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGZlYXR1cmVJRCBvZiB0aGUge0BsaW5rIEVTdHJ1Y3R1cmFsRmVhdHVyZX0gdG8gYmUgbW9kaWZpZWQuCisJICogQG1vZGVsCisJICovCisJaW50IGdldEZlYXR1cmVJZCgpOworCQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXIjZ2V0RmVhdHVyZUlkIDxlbT5GZWF0dXJlIElkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GZWF0dXJlIElkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRGZWF0dXJlSWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEZlYXR1cmVJZChpbnQgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgdGhhdCB3YXMgdXNlZCBpbiB0aGUKKwkgKiAgICAgICAgIGxhc3QgY2FsbCB0byB7QGxpbmsgI3VwZGF0ZUZlYXR1cmUoKX0KKwkgKiBAc2VlICNnZXROZXh0VmFsdWUoKQorCSAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCVN0cmluZyBnZXRDdXJyZW50VmFsdWVUZXh0KCk7CisJCisJLyoqCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCXZvaWQgdXBkYXRlRmVhdHVyZSgpOworCisJLyoqCisJICogQHJldHVybiBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgU3RyaW5nfXMgdGhhdCBzdW1tYXJpemUgdGhlCisJICogICAgICAgICBtb2RpZmljYXRpb25zIG1hZGUgdG8gdGhlIGxhc3Qge0BsaW5rIEVPYmplY3R9IGJ5IHRoZSBjYWxsIHRvCisJICogICAgICAgICB7QGxpbmsgI3VwZGF0ZUZlYXR1cmUoKX0uCisJICogbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJU3RyaW5nIGdldE1vZGlmaWNhdGlvblN1bW1hcnkoKTsKKworCS8qKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWxsIG9mIHRoZSBtb2RpZmljYXRpb25zIHRvIHRoZSBmZWF0dXJlCisJICogICAgICAgICBiZWVuIGNvbXBsZXRlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvdGhlcndpc2UuCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCWJvb2xlYW4gaXNDb21wbGV0ZSgpOworCQorCS8qKgorCSAqIFJlc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBmZWF0dXJlIGJlaW5nIG1vZGlmaWVkIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZQorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwl2b2lkIHJlc2V0KCk7CisKK30gLy8gRmVhdHVyZU1vZGlmaWVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9JbnRlZ2VyTW9kaWZpZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL0ludGVnZXJNb2RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0M2U1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9JbnRlZ2VyTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDg1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW50ZWdlciBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlck1vZGlmaWVyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJNb2RpZmllciNnZXRPcmlnaW5hbFZhbHVlIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZSNnZXRJbnRlZ2VyTW9kaWZpZXIoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSW50ZWdlck1vZGlmaWVyIGV4dGVuZHMgU2luZ2xlVmFsdWVNb2RpZmllciB7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFZhbHVlKGludCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2UjZ2V0SW50ZWdlck1vZGlmaWVyX1ZhbHVlKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IGdldFZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlck1vZGlmaWVyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRWYWx1ZShpbnQgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JpZ2luYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRPcmlnaW5hbFZhbHVlKGludCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2UjZ2V0SW50ZWdlck1vZGlmaWVyX09yaWdpbmFsVmFsdWUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgZ2V0T3JpZ2luYWxWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJNb2RpZmllciNnZXRPcmlnaW5hbFZhbHVlIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE9yaWdpbmFsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE9yaWdpbmFsVmFsdWUoaW50IHZhbHVlKTsKK30gLy8gSW50ZWdlck1vZGlmaWVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9JbnRlZ2VyTk9QTW9kaWZpZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL0ludGVnZXJOT1BNb2RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmM2EyOTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9JbnRlZ2VyTk9QTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDI0IEBACisvLyBJbnRlZ2VyTk9QTW9kaWZpZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEEgPGNvZGU+Tk9QTW9kaWZpZXI8L2NvZGU+IGRvZXMgbm90aGluZy4gSXQgaXMgdXNlZnVsIGZvciB0aGUgR1VJCisgKiBjb21wb25lbnRzIHRoYXQgZWRpdCB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyfXMgdG8gaGF2ZSBvbmUgdGhhdCBpcyBhdmFpbGFibGUKKyAqIGZvciB0aGUgY2FzZSB3aGVuIG5vIHtAbGluayBGZWF0dXJlTW9kaWZpZXJ9IGlzIHNwZWNpZmllZCBieSB0aGUgdXNlci4KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSW50ZWdlck5PUE1vZGlmaWVyIGV4dGVuZHMgTk9QTW9kaWZpZXIgeworCS8vIE5vdGhpbmcKK30gLy8gSW50ZWdlck5PUE1vZGlmaWVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvSW50ZWdlclJhbmdlTW9kaWZpZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL0ludGVnZXJSYW5nZU1vZGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlMjZhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL0ludGVnZXJSYW5nZU1vZGlmaWVyLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLy8gSW50ZWdlclJhbmdlTW9kaWZpZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEEgPGNvZGU+SW50ZWdlclJhbmdlTW9kaWZpZXI8L2NvZGU+IG1vZGlmaWVzIGFuIGludGVnZXIgdmFsdWVkIGZlYXR1cmUgZnJvbQorICogYSBzdGFydGluZyB2YWx1ZSB0byBhbmQgZW5kIHZhbHVlIChpbmNsdXNpdmU+IGJ5IGluY3JlbWVudHMuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIEludGVnZXJSYW5nZU1vZGlmaWVyIGV4dGVuZHMgUmFuZ2VNb2RpZmllciB7CisJCisJLyoqCisJICogQG1vZGVsCisJICovCisJaW50IGdldE9yaWdpbmFsVmFsdWUoKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlclJhbmdlTW9kaWZpZXIjZ2V0T3JpZ2luYWxWYWx1ZSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRPcmlnaW5hbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRPcmlnaW5hbFZhbHVlKGludCB2YWx1ZSk7CisKKwkvKioKKwkgKiBAbW9kZWwgZGVmYXVsdD0iLTk5OTk5OTk5IgorCSAqLworCWludCBnZXRTdGFydFZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlclJhbmdlTW9kaWZpZXIjZ2V0U3RhcnRWYWx1ZSA8ZW0+U3RhcnQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRTdGFydFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTdGFydFZhbHVlKGludCB2YWx1ZSk7CisKKwkvKioKKwkgKiBAbW9kZWwgZGVmYXVsdD0iLTk5OTk5OTk5IgorCSAqLworCWludCBnZXRFbmRWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJSYW5nZU1vZGlmaWVyI2dldEVuZFZhbHVlIDxlbT5FbmQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVuZCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RW5kVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEVuZFZhbHVlKGludCB2YWx1ZSk7CisKKwkvKioKKwkgKiBAbW9kZWwgZGVmYXVsdD0iLTk5OTk5OTk5IgorCSAqLworCWludCBnZXRJbmNyZW1lbnQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyUmFuZ2VNb2RpZmllciNnZXRJbmNyZW1lbnQgPGVtPkluY3JlbWVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5jcmVtZW50PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJbmNyZW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEluY3JlbWVudChpbnQgdmFsdWUpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG5leHQgdmFsdWUgb2YgdGhlIGZlYXR1cmUKKwkgKiBAbW9kZWwgZGVmYXVsdD0iLTk5OTk5OTk5IiBjaGFuZ2VhYmxlPSJ0cnVlIgorCSAqLworCWludCBnZXROZXh0VmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyUmFuZ2VNb2RpZmllciNnZXROZXh0VmFsdWUgPGVtPk5leHQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5leHQgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE5leHRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TmV4dFZhbHVlKGludCB2YWx1ZSk7CisJCit9IC8vIEludGVnZXJSYW5nZU1vZGlmaWVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9JbnRlZ2VyU2VxdWVuY2VNb2RpZmllci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvSW50ZWdlclNlcXVlbmNlTW9kaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzA5OGU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvSW50ZWdlclNlcXVlbmNlTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvLyBJbnRlZ2VyU2VxdWVuY2VNb2RpZmllci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKKy8qKgorICogQSB7QGxpbmsgSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJ9IG1vZGlmaWVzIGEgZmVhdHVyZSBieSBzZXR0aW5nIGl0IHRvIGEKKyAqIHNlcXVlbmNlIG9mICJpbnRlZ2VyIiB2YWx1ZXMuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIEludGVnZXJTZXF1ZW5jZU1vZGlmaWVyIGV4dGVuZHMgU2VxdWVuY2VNb2RpZmllciB7CisJLyoqCisJICogQG1vZGVsCisJICovCisJRUxpc3Q8SW50ZWdlcj4gZ2V0U2VxdWVuY2UoKTsKK30gLy8gSW50ZWdlclNlcXVlbmNlTW9kaWZpZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9Mb25nTW9kaWZpZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL0xvbmdNb2RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YjkwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9Mb25nTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDg1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TG9uZyBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ01vZGlmaWVyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdNb2RpZmllciNnZXRPcmlnaW5hbFZhbHVlIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZSNnZXRMb25nTW9kaWZpZXIoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTG9uZ01vZGlmaWVyIGV4dGVuZHMgU2luZ2xlVmFsdWVNb2RpZmllciB7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFZhbHVlKGxvbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlI2dldExvbmdNb2RpZmllcl9WYWx1ZSgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCWxvbmcgZ2V0VmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nTW9kaWZpZXIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFZhbHVlKGxvbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JpZ2luYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRPcmlnaW5hbFZhbHVlKGxvbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlI2dldExvbmdNb2RpZmllcl9PcmlnaW5hbFZhbHVlKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJbG9uZyBnZXRPcmlnaW5hbFZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ01vZGlmaWVyI2dldE9yaWdpbmFsVmFsdWUgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0T3JpZ2luYWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0T3JpZ2luYWxWYWx1ZShsb25nIHZhbHVlKTsKK30gLy8gTG9uZ01vZGlmaWVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9Mb25nTk9QTW9kaWZpZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL0xvbmdOT1BNb2RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNjUyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9Mb25nTk9QTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDI0IEBACisvLyBMb25nTk9QTW9kaWZpZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEEgPGNvZGU+Tk9QTW9kaWZpZXI8L2NvZGU+IGRvZXMgbm90aGluZy4gSXQgaXMgdXNlZnVsIGZvciB0aGUgR1VJCisgKiBjb21wb25lbnRzIHRoYXQgZWRpdCB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyfXMgdG8gaGF2ZSBvbmUgdGhhdCBpcyBhdmFpbGFibGUKKyAqIGZvciB0aGUgY2FzZSB3aGVuIG5vIHtAbGluayBGZWF0dXJlTW9kaWZpZXJ9IGlzIHNwZWNpZmllZCBieSB0aGUgdXNlci4KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTG9uZ05PUE1vZGlmaWVyIGV4dGVuZHMgTk9QTW9kaWZpZXIgeworCS8vIE5vdGhpbmcKK30gLy8gTG9uZ05PUE1vZGlmaWVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9Mb25nUmFuZ2VNb2RpZmllci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvTG9uZ1JhbmdlTW9kaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODYwYTg1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvTG9uZ1JhbmdlTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDk4IEBACisvLyBMb25nUmFuZ2VNb2RpZmllci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQSA8Y29kZT5Mb25nUmFuZ2VNb2RpZmllcjwvY29kZT4gbW9kaWZpZXMgYW4gbG9uZyB2YWx1ZWQgZmVhdHVyZSBmcm9tCisgKiBhIHN0YXJ0aW5nIHZhbHVlIHRvIGFuZCBlbmQgdmFsdWUgKGluY2x1c2l2ZT4gYnkgaW5jcmVtZW50cy4KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTG9uZ1JhbmdlTW9kaWZpZXIgZXh0ZW5kcyBSYW5nZU1vZGlmaWVyIHsKKwkKKwkvKioKKwkgKiBAbW9kZWwgZGVmYXVsdD0iLTk5OTk5OTk5IgorCSAqLworCWxvbmcgZ2V0T3JpZ2luYWxWYWx1ZSgpOworCQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nUmFuZ2VNb2RpZmllciNnZXRPcmlnaW5hbFZhbHVlIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE9yaWdpbmFsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE9yaWdpbmFsVmFsdWUobG9uZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBAbW9kZWwgZGVmYXVsdD0iLTk5OTk5OTk5IgorCSAqLworCWxvbmcgZ2V0U3RhcnRWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdSYW5nZU1vZGlmaWVyI2dldFN0YXJ0VmFsdWUgPGVtPlN0YXJ0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0U3RhcnRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U3RhcnRWYWx1ZShsb25nIHZhbHVlKTsKKworCS8qKgorCSAqIEBtb2RlbCBkZWZhdWx0PSItOTk5OTk5OTkiCisJICovCisJbG9uZyBnZXRFbmRWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdSYW5nZU1vZGlmaWVyI2dldEVuZFZhbHVlIDxlbT5FbmQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVuZCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RW5kVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEVuZFZhbHVlKGxvbmcgdmFsdWUpOworCisJLyoqCisJICogQG1vZGVsIGRlZmF1bHQ9Ii05OTk5OTk5OSIKKwkgKi8KKwlsb25nIGdldEluY3JlbWVudCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdSYW5nZU1vZGlmaWVyI2dldEluY3JlbWVudCA8ZW0+SW5jcmVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmNyZW1lbnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEluY3JlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SW5jcmVtZW50KGxvbmcgdmFsdWUpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG5leHQgdmFsdWUgb2YgdGhlIGZlYXR1cmUKKwkgKiBAbW9kZWwgZGVmYXVsdD0iLTk5OTk5OTk5IiBjaGFuZ2VhYmxlPSJ0cnVlIgorCSAqLworCWxvbmcgZ2V0TmV4dFZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ1JhbmdlTW9kaWZpZXIjZ2V0TmV4dFZhbHVlIDxlbT5OZXh0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OZXh0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXROZXh0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE5leHRWYWx1ZShsb25nIHZhbHVlKTsKK30gLy8gTG9uZ1JhbmdlTW9kaWZpZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9Mb25nU2VxdWVuY2VNb2RpZmllci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvTG9uZ1NlcXVlbmNlTW9kaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODIxOTgzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvTG9uZ1NlcXVlbmNlTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvLyBMb25nU2VxdWVuY2VNb2RpZmllci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKKy8qKgorICogQSB7QGxpbmsgTG9uZ1NlcXVlbmNlTW9kaWZpZXJ9IG1vZGlmaWVzIGEgZmVhdHVyZSBieSBzZXR0aW5nIGl0IHRvIGEKKyAqIHNlcXVlbmNlIG9mICJsb25nIiB2YWx1ZXMuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIExvbmdTZXF1ZW5jZU1vZGlmaWVyIGV4dGVuZHMgU2VxdWVuY2VNb2RpZmllciB7CisJLyoqCisJICogQG1vZGVsCisJICovCisJRUxpc3Q8TG9uZz4gZ2V0U2VxdWVuY2UoKTsKK30gLy8gTG9uZ1NlcXVlbmNlTW9kaWZpZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9Nb2RpZmlhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9Nb2RpZmlhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhOGQ1NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL01vZGlmaWFibGUuamF2YQpAQCAtMCwwICsxLDU0IEBACisvLyBNb2RpZmlhYmxlLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgYSAibWFya2VyIGludGVyZmFjZSIgdXNlZCB0byBpZGVudGlmeSB7QGxpbmsgSWRlbnRpZmlhYmxlfXMKKyAqIHRoYXQgY2FuIGJlIG1vZGlmaWVkIGJ5IGEge0BsaW5rIE1vZGlmaWVyfS4gVGhlIG1haW4gdXNlIG9mIHRoaXMgbWFya2VyIGlzIGluCisgKiA8YSBocmVmPSJodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9Db21tYW5kX0NvcmVfRXhwcmVzc2lvbnMiPkNvbW1hbmQgQ29yZQorICogRXhwcmVzc2lvbnM8L2E+IHdoZXJlIHRoZXkgYXJlIHVzZWQgaW4gPGVtPmFkYXB0PC9lbT4gZWxlbWVudHMgdG8gdGVzdCBpZiB0aGUKKyAqIGN1cnJlbnQgc2VsZWN0aW9uIGNhbiBiZSBhZGFwdGVkIHRvIHRoZSB0eXBlIDxjb2RlPk1vZGlmaWFibGU8L2NvZGU+LiA8L3A+CisgKiA8cD4KKyAqIEFuIGV4YW1wbGUgb2YgaXRzIHVzZSBjYW4gYmUgZm91bmQgaW4KKyAqIDxjb2RlPm9yZy5lY2xpcHNlLnN0ZW0udWkvcGx1Z2luLnhtbDwvY29kZT4uIEluIHRoYXQgZmlsZSB0aGVyZSBhcmUKKyAqIHNldmVyYWwgaW5zdGFuY2VzIG9mIGV4dGVuc2lvbnMgb2YgdGhlIGV4dGVuc2lvbiBwb2ludAorICogPGNvZGU+b3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9uczwvY29kZT47IG9uZSBjb250YWlucyB0aGUKKyAqIGRlZmluaXRpb24gb2YgdGhlIGV4cHJlc3Npb24KKyAqIDxjb2RlPm9yZy5lY2xpcHNlLnN0ZW0udWkuaXNNb2RpZmlhYmxlSWRlbnRpZmlhYmxlPC9jb2RlPiB3aGljaCBpbmNsdWRlcworICogYSB0ZXN0IHRoYXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGNhbiBiZSBhZGFwdGVkIHRvIDxjb2RlPk1vZGlmaWFibGU8L2NvZGU+CisgKiAoYW1vbmcgb3RoZXIgdGhpbmdzKS4gVGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGlzIHVzZWQgdG8gZW5hYmxlIHRoZQorICogY29tbWFuZCA8Y29kZT5vcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQubmV3bW9kaWZpZXJ3aXphcmQ8L2NvZGU+CisgKiBkZWZpbmVkIHZpYSBhIDxjb2RlPm9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQgZWxzZXdoZXJlCisgKiBpbiB0aGUgc2FtZSBmaWxlLiBUaGUgY29tbWFuZCBvcGVucyB0aGUgd2l6YXJkIGZvciBjcmVhdGluZyBhIG5ldworICogPGNvZGU+TW9kaWZpYWJsZTwvY29kZT4gZ2l2ZW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBUaGUgIkNyZWF0ZSBNb2RpZmllciIKKyAqIGVudHJ5IGluIHRoZSBwb3B1cCBjb250ZXh0IG1lbnUgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB3aWxsIGFwcGVhciB3aGVuCisgKiB0aGlzIGNvbW1hbmQgaXMgZW5hYmxlZC4KKyAqIDwvcD4KKyAqIDxwPgorICogSXQgaXMgbm90IHN1ZmZpY2llbnQgdG8gc2ltcGx5IGltcGxlbWVudCB0aGUgPGNvZGU+TW9kaWZpYWJsZTwvY29kZT4KKyAqIGludGVyZmFjZSBmb3IgdGhpcyB0ZXN0IHRvIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbiB0aGUgY29yZSBleHByZXNzaW9uLgorICogQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIElBZGFwdGVyRmFjdG9yeX0gbmVlZHMgdG8gYmUgZGVmaW5lZCBhbmQgdGhlbgorICogcmVnaXN0ZXJlZCBhcyBhICJydW4gdGltZSBhZGFwdGVyIGZhY3RvcnkiIHVzaW5nIHRoZSBleHRlbnNpb24gcG9pbnQKKyAqIDxjb2RlPm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVyczwvY29kZT4uIFRoZSBmaWxlCisgKiA8Y29kZT5vcmcuZWNsaXBzZS5zdGVtLnVpL3BsdWdpbi54bWw8L2NvZGU+IGNvbnRhaW5zIGV4YW1wbGVzLgorICogCisgKiAKKyAqIEBtb2RlbCBpbnRlcmZhY2U9InRydWUiCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTW9kaWZpYWJsZSBleHRlbmRzIEVPYmplY3QgeworCS8vIE5vdGhpbmcKK30gLy8gTW9kaWZpYWJsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL01vZGlmaWVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9Nb2RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OWQ4YTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9Nb2RpZmllci5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvLyBNb2RpZmllci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmxhbmcuU3RyaW5nOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguc3FsLnJvd3NldC5QcmVkaWNhdGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuVHJpZ2dlcjsKKworLyoqCisgKiBBIDxjb2RlPk1vZGlmaWVyPC9jb2RlPiBzcGVjaWZpZXMgdGhlIGNoYW5nZXMgdG8gYmUgbWFkZSB0byB0aGUgZmVhdHVyZXMgb2YKKyAqIGFuIHNwZWNpZmljICJ0YXJnZXQiIHtAbGluayBFT2JqZWN0fS4gSXQgY29udGFpbnMgdGhlIHtAbGluayBVUkl9IG9mIHRoZQorICoge0BsaW5rIElkZW50aWZpYWJsZX0gYW5kIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyfXMgdGhhdAorICogcGVyZm9ybSB0aGUgYWN0dWFsIGZlYXR1cmUgbW9kaWZpY2F0aW9uLiBBIDxjb2RlPk1vZGlmaWVyPC9jb2RlPiBjYW4gY2hhbmdlCisgKiB0aGUgdmFsdWUgb2YgYSBmZWF0dXJlIGluIGEge0BsaW5rIExhYmVsVmFsdWV9LCBpbnN0YW5jZXMgb2Ygd2hpY2ggYXJlIG5vdAorICoge0BsaW5rIElkZW50aWZpYWJsZX1zLiBJbiBzdWNoIGNhc2VzLCB0aGUge0BsaW5rIFVSSX0gc3BlY2lmaWVzIHRoZQorICoge0BsaW5rIExhYmVsfSBpbnN0YW5jZSB3aGljaCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUge0BsaW5rIExhYmVsVmFsdWV9CisgKiBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgbW9kaWZpZWQuCisgKiA8cD4KKyAqIDxjb2RlPk1vZGlmaWVyczwvY29kZT4gYXJlIHVzZWQgYnkgYm90aCB7QGxpbmsgRXhwZXJpbWVudH1zIGFuZAorICoge0BsaW5rIFRyaWdnZXJ9cyB0byBtb2RpZnkgZWxlbWVudHMgb2YgYSBjYW5vbmljYWwge0BsaW5rIEdyYXBofSB0aGF0CisgKiByZXByZXNlbnRzIHNpbXVsYXRpb24gc3RhdGUuIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlIDxjb2RlPk1vZGlmaWVyPC9jb2RlPgorICogbWFrZXMgYWx0ZXJhdGlvbnMgdG8gYSB7QGxpbmsgU2NlbmFyaW99IGluc3RhbmNlIGJlZm9yZSBpdCBpcyB1c2VkIHRvIGxhdW5jaAorICogYSBTaW11bGF0aW9uLiBJbiB0aGUgbGF0ZXIgY2FzZSwgYSA8Y29kZT5Nb2RpZmllcjwvY29kZT4gaXMgdXNlZCBhcyBhCisgKiB7QGxpbmsgRGVjb3JhdG9yfSB0aGF0IGlzIGNvbmRpdGlvbmFsbHkgZW5hYmxlZCBieSB0aGUgdmFsdWUgb2YgdGhlCisgKiB7QGxpbmsgUHJlZGljYXRlfSByZWZlcmVuY2VkIGJ5IGEge0BsaW5rIFRyaWdnZXJ9LgorICogPHA+CisgKiBUaGUge0BsaW5rIEZlYXR1cmVNb2RpZmllcn1zIHBlcmZvcm0gdGhlIGFjdHVhbCBtb2RpZmljYXRpb25zIHRvIHRoZQorICoge0BsaW5rIEVPYmplY3R9cy4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5pdGlvbiBpcyBhbHNvIGFuICJBbm5vdGF0ZWQgSmF2YSBJbnRlcmZhY2UiIHRoYXQgZGVmaW5lcworICogb25lIGNsYXNzIGluIGEgPGEgaHJlZj0iaHR0cDovL3d3dy51bWwub3JnLyI+VU1MPC9hPiAibW9kZWwiLiBUaGUgVU1MIGNsYXNzCisgKiBkaWFncmFtIGZvciB0aGUgbW9kZWwgaXMgaW4gdGhlIDxjb2RlPmRvY3VtZW50YXRpb248L2NvZGU+IGZvbGRlciBvZiB0aGUKKyAqIHByb2plY3QuIFRoaXMgZmlsZSBhbmQgdGhlIG90aGVyIGludGVyZmFjZXMgaW4gdGhpcyBKYXZhIHBhY2thZ2UgYXJlCisgKiBwcm9jZXNzZWQgYnkgdGhlIEVjbGlwc2UgTW9kZWxpbmcgRnJhbWV3b3JrIChha2EgRU1GIDxhCisgKiBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UvZW1mIj5odHRwOi8vb3JnLmVjbGlwc2UvZW1mPC9hPikuIHRvIGF1dG9tYXRpY2FsbHkKKyAqIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbC4gRU1GIGlzIGRvY3VtZW50ZWQgaW4gdGhlIGJvb2sgPGEKKyAqIGhyZWY9Imh0dHA6Ly93d3cuYXdwcm9mZXNzaW9uYWwuY29tL2Jvb2tzdG9yZS9wcm9kdWN0LmFzcD9pc2JuPTAxMzE0MjU0MjAmcmw9MSI+RWNsaXBzZQorICogTW9kZWxpbmcgRnJhbWV3b3JrIDwvYT4gYnkgQnVkaW5za3ksIGV0IGFsLgorICogPC9wPgorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTW9kaWZpZXIgZXh0ZW5kcyBEZWNvcmF0b3IgeworCisJU3RyaW5nIFVSSV9UWVBFX01PRElGSUVSX1NFR01FTlQgPSAibW9kaWZpZXIiOworCQorCS8qKgorCSAqIEBtb2RlbAorCSAqLworCVVSSSBnZXRUYXJnZXRVUkkoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllciNnZXRUYXJnZXRVUkkgPGVtPlRhcmdldCBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBVUkk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFRhcmdldFVSSSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VGFyZ2V0VVJJKFVSSSB2YWx1ZSk7CisKKwkvKioKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICovCisJRUxpc3Q8RmVhdHVyZU1vZGlmaWVyPiBnZXRGZWF0dXJlTW9kaWZpZXJzKCk7CisKKwkvKioKKwkgKiBAcGFyYW0gYmFzZVNjZW5hcmlvCisJICogICAgICAgICAgICB0aGUge0BsaW5rIFNjZW5hcmlvfSB0byBiZSBtb2RpZmllZC4KKwkgKiAKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJdm9pZCB1cGRhdGVTY2VuYXJpbyhmaW5hbCBTY2VuYXJpbyBiYXNlU2NlbmFyaW8pOworCisJLyoqCisJICogQHJldHVybiBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgU3RyaW5nfXMgdGhhdCBzdW1tYXJpemUgdGhlCisJICogICAgICAgICBtb2RpZmljYXRpb25zIG1hZGUgdG8gdGhlIGxhc3Qge0BsaW5rIFNjZW5hcmlvfSBieSB0aGUgY2FsbCB0bworCSAqICAgICAgICAge0BsaW5rICN1cGRhdGVTY2VuYXJpbyhTY2VuYXJpbyl9LgorCSAqIG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCUxpc3Q8U3RyaW5nPiBnZXRNb2RpZmljYXRpb25TdW1tYXJ5KCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCBvZiB0aGUgbW9kaWZpY2F0aW9ucyB0byB0aGUKKwkgKiAgICAgICAgIHtAbGluayBJZGVudGlmaWFibGV9IGhhdmUgYmVlbiBjb21wbGV0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiwKKwkgKiAgICAgICAgIG90aGVyd2lzZS4KKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJYm9vbGVhbiBpc0NvbXBsZXRlKCk7CisKKwkvKioKKwkgKiBSZXN0b3JlIHRoZSB2YWx1ZSBvZiBhbGwgb2YgdGhlIGZlYXR1cmVzIGJlaW5nIG1vZGlmaWVkIHRvIHRoZWlyIG9yaWdpbmFsCisJICogdmFsdWVzLgorCSAqIAorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwl2b2lkIHJlc2V0KCk7Cit9IC8vIE1vZGlmaWVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9Nb2RpZmllckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL01vZGlmaWVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZmEzNzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9Nb2RpZmllckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDIyMiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBNb2RpZmllckZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7CisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlNb2RpZmllckZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJGYWN0b3J5SW1wbC5pbml0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvdWJsZSBOT1AgTW9kaWZpZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvdWJsZSBOT1AgTW9kaWZpZXI8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCURvdWJsZU5PUE1vZGlmaWVyIGNyZWF0ZURvdWJsZU5PUE1vZGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvdWJsZSBSYW5nZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG91YmxlIFJhbmdlIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEb3VibGVSYW5nZU1vZGlmaWVyIGNyZWF0ZURvdWJsZVJhbmdlTW9kaWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG91YmxlIFNlcXVlbmNlIE1vZGlmaWVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Eb3VibGUgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCURvdWJsZVNlcXVlbmNlTW9kaWZpZXIgY3JlYXRlRG91YmxlU2VxdWVuY2VNb2RpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnRlZ2VyIE5PUCBNb2RpZmllcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW50ZWdlciBOT1AgTW9kaWZpZXI8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUludGVnZXJOT1BNb2RpZmllciBjcmVhdGVJbnRlZ2VyTk9QTW9kaWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW50ZWdlciBSYW5nZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW50ZWdlciBSYW5nZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSW50ZWdlclJhbmdlTW9kaWZpZXIgY3JlYXRlSW50ZWdlclJhbmdlTW9kaWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW50ZWdlciBTZXF1ZW5jZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW50ZWdlciBTZXF1ZW5jZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSW50ZWdlclNlcXVlbmNlTW9kaWZpZXIgY3JlYXRlSW50ZWdlclNlcXVlbmNlTW9kaWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TG9uZyBOT1AgTW9kaWZpZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvbmcgTk9QIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMb25nTk9QTW9kaWZpZXIgY3JlYXRlTG9uZ05PUE1vZGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvbmcgUmFuZ2UgTW9kaWZpZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvbmcgUmFuZ2UgTW9kaWZpZXI8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUxvbmdSYW5nZU1vZGlmaWVyIGNyZWF0ZUxvbmdSYW5nZU1vZGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvbmcgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvbmcgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUxvbmdTZXF1ZW5jZU1vZGlmaWVyIGNyZWF0ZUxvbmdTZXF1ZW5jZU1vZGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1vZGlmaWVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Nb2RpZmllcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTW9kaWZpZXIgY3JlYXRlTW9kaWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Tk9QIE1vZGlmaWVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OT1AgTW9kaWZpZXI8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCU5PUE1vZGlmaWVyIGNyZWF0ZU5PUE1vZGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNURU0gVGltZSBOT1AgTW9kaWZpZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNURU0gVGltZSBOT1AgTW9kaWZpZXI8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVNURU1UaW1lTk9QTW9kaWZpZXIgY3JlYXRlU1RFTVRpbWVOT1BNb2RpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TVEVNIFRpbWUgUmFuZ2UgTW9kaWZpZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNURU0gVGltZSBSYW5nZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU1RFTVRpbWVSYW5nZU1vZGlmaWVyIGNyZWF0ZVNURU1UaW1lUmFuZ2VNb2RpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TVEVNIFRpbWUgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNURU0gVGltZSBTZXF1ZW5jZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyIGNyZWF0ZVNURU1UaW1lU2VxdWVuY2VNb2RpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdHJpbmcgTk9QIE1vZGlmaWVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdHJpbmcgTk9QIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmdOT1BNb2RpZmllciBjcmVhdGVTdHJpbmdOT1BNb2RpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdHJpbmcgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN0cmluZyBTZXF1ZW5jZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nU2VxdWVuY2VNb2RpZmllciBjcmVhdGVTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvdWJsZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG91YmxlIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEb3VibGVNb2RpZmllciBjcmVhdGVEb3VibGVNb2RpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnRlZ2VyIE1vZGlmaWVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnRlZ2VyIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJbnRlZ2VyTW9kaWZpZXIgY3JlYXRlSW50ZWdlck1vZGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvbmcgTW9kaWZpZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvbmcgTW9kaWZpZXI8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUxvbmdNb2RpZmllciBjcmVhdGVMb25nTW9kaWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U1RFTSBUaW1lIE1vZGlmaWVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TVEVNIFRpbWUgTW9kaWZpZXI8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVNURU1UaW1lTW9kaWZpZXIgY3JlYXRlU1RFTVRpbWVNb2RpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlNb2RpZmllclBhY2thZ2UgZ2V0TW9kaWZpZXJQYWNrYWdlKCk7CisKK30gLy9Nb2RpZmllckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL01vZGlmaWVyUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvTW9kaWZpZXJQYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDljZWM1MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL01vZGlmaWVyUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsMzgzMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2U7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAorICogPHVsPgorICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKyAqIDwvdWw+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyRmFjdG9yeQorICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTW9kaWZpZXJQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgeworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOQU1FID0gIm1vZGlmaWVyIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci5lY29yZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllciI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTW9kaWZpZXJQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGwuaW5pdCgpOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5GZWF0dXJlTW9kaWZpZXJJbXBsIDxlbT5GZWF0dXJlIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRmVhdHVyZU1vZGlmaWVySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJQYWNrYWdlSW1wbCNnZXRGZWF0dXJlTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgRkVBVFVSRV9NT0RJRklFUiA9IDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRkVBVFVSRV9NT0RJRklFUl9fVEFSR0VUID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3RydWN0dXJhbCBGZWF0dXJlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRkVBVFVSRV9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRSA9IDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmVhdHVyZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRkVBVFVSRV9NT0RJRklFUl9fRkVBVFVSRV9OQU1FID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRkVBVFVSRV9NT0RJRklFUl9fRkVBVFVSRV9JRCA9IDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZSBUZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRkVBVFVSRV9NT0RJRklFUl9fQ1VSUkVOVF9WQUxVRV9URVhUID0gNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZFQVRVUkVfTU9ESUZJRVJfX0NPTVBMRVRFID0gNTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5GZWF0dXJlIE1vZGlmaWVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZFQVRVUkVfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCA9IDY7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk5PUE1vZGlmaWVySW1wbCA8ZW0+Tk9QIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTk9QTW9kaWZpZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldE5PUE1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IE5PUF9NT0RJRklFUiA9IDExOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE5PUF9NT0RJRklFUl9fVEFSR0VUID0gRkVBVFVSRV9NT0RJRklFUl9fVEFSR0VUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBOT1BfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkUgPSBGRUFUVVJFX01PRElGSUVSX19FU1RSVUNUVVJBTF9GRUFUVVJFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZlYXR1cmUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE5PUF9NT0RJRklFUl9fRkVBVFVSRV9OQU1FID0gRkVBVFVSRV9NT0RJRklFUl9fRkVBVFVSRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZlYXR1cmUgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBOT1BfTU9ESUZJRVJfX0ZFQVRVUkVfSUQgPSBGRUFUVVJFX01PRElGSUVSX19GRUFUVVJFX0lEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWUgVGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE5PUF9NT0RJRklFUl9fQ1VSUkVOVF9WQUxVRV9URVhUID0gRkVBVFVSRV9NT0RJRklFUl9fQ1VSUkVOVF9WQUxVRV9URVhUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTk9QX01PRElGSUVSX19DT01QTEVURSA9IEZFQVRVUkVfTU9ESUZJRVJfX0NPTVBMRVRFOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk5PUCBNb2RpZmllcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBOT1BfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCA9IEZFQVRVUkVfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkRvdWJsZU5PUE1vZGlmaWVySW1wbCA8ZW0+RG91YmxlIE5PUCBNb2RpZmllcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkRvdWJsZU5PUE1vZGlmaWVySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJQYWNrYWdlSW1wbCNnZXREb3VibGVOT1BNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBET1VCTEVfTk9QX01PRElGSUVSID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfTk9QX01PRElGSUVSX19UQVJHRVQgPSBOT1BfTU9ESUZJRVJfX1RBUkdFVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3RydWN0dXJhbCBGZWF0dXJlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRE9VQkxFX05PUF9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRSA9IE5PUF9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfTk9QX01PRElGSUVSX19GRUFUVVJFX05BTUUgPSBOT1BfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRE9VQkxFX05PUF9NT0RJRklFUl9fRkVBVFVSRV9JRCA9IE5PUF9NT0RJRklFUl9fRkVBVFVSRV9JRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlIFRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfTk9QX01PRElGSUVSX19DVVJSRU5UX1ZBTFVFX1RFWFQgPSBOT1BfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERPVUJMRV9OT1BfTU9ESUZJRVJfX0NPTVBMRVRFID0gTk9QX01PRElGSUVSX19DT01QTEVURTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Eb3VibGUgTk9QIE1vZGlmaWVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERPVUJMRV9OT1BfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCA9IE5PUF9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuUmFuZ2VNb2RpZmllckltcGwgPGVtPlJhbmdlIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuUmFuZ2VNb2RpZmllckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGwjZ2V0UmFuZ2VNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBSQU5HRV9NT0RJRklFUiA9IDEyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJBTkdFX01PRElGSUVSX19UQVJHRVQgPSBGRUFUVVJFX01PRElGSUVSX19UQVJHRVQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN0cnVjdHVyYWwgRmVhdHVyZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJBTkdFX01PRElGSUVSX19FU1RSVUNUVVJBTF9GRUFUVVJFID0gRkVBVFVSRV9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSQU5HRV9NT0RJRklFUl9fRkVBVFVSRV9OQU1FID0gRkVBVFVSRV9NT0RJRklFUl9fRkVBVFVSRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZlYXR1cmUgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSQU5HRV9NT0RJRklFUl9fRkVBVFVSRV9JRCA9IEZFQVRVUkVfTU9ESUZJRVJfX0ZFQVRVUkVfSUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZSBUZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkFOR0VfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVCA9IEZFQVRVUkVfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJBTkdFX01PRElGSUVSX19DT01QTEVURSA9IEZFQVRVUkVfTU9ESUZJRVJfX0NPTVBMRVRFOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJhbmdlIE1vZGlmaWVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJBTkdFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgPSBGRUFUVVJFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Eb3VibGVSYW5nZU1vZGlmaWVySW1wbCA8ZW0+RG91YmxlIFJhbmdlIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRG91YmxlUmFuZ2VNb2RpZmllckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGwjZ2V0RG91YmxlUmFuZ2VNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBET1VCTEVfUkFOR0VfTU9ESUZJRVIgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERPVUJMRV9SQU5HRV9NT0RJRklFUl9fVEFSR0VUID0gUkFOR0VfTU9ESUZJRVJfX1RBUkdFVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3RydWN0dXJhbCBGZWF0dXJlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRE9VQkxFX1JBTkdFX01PRElGSUVSX19FU1RSVUNUVVJBTF9GRUFUVVJFID0gUkFOR0VfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmVhdHVyZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRE9VQkxFX1JBTkdFX01PRElGSUVSX19GRUFUVVJFX05BTUUgPSBSQU5HRV9NT0RJRklFUl9fRkVBVFVSRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZlYXR1cmUgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfUkFOR0VfTU9ESUZJRVJfX0ZFQVRVUkVfSUQgPSBSQU5HRV9NT0RJRklFUl9fRkVBVFVSRV9JRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlIFRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfUkFOR0VfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVCA9IFJBTkdFX01PRElGSUVSX19DVVJSRU5UX1ZBTFVFX1RFWFQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfUkFOR0VfTU9ESUZJRVJfX0NPTVBMRVRFID0gUkFOR0VfTU9ESUZJRVJfX0NPTVBMRVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRE9VQkxFX1JBTkdFX01PRElGSUVSX19TVEFSVF9WQUxVRSA9IFJBTkdFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuZCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERPVUJMRV9SQU5HRV9NT0RJRklFUl9fRU5EX1ZBTFVFID0gUkFOR0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jcmVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRE9VQkxFX1JBTkdFX01PRElGSUVSX19JTkNSRU1FTlQgPSBSQU5HRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRE9VQkxFX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFID0gUkFOR0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JpZ2luYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfUkFOR0VfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFID0gUkFOR0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RG91YmxlIFJhbmdlIE1vZGlmaWVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERPVUJMRV9SQU5HRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UID0gUkFOR0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLlNlcXVlbmNlTW9kaWZpZXJJbXBsIDxlbT5TZXF1ZW5jZSBNb2RpZmllcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLlNlcXVlbmNlTW9kaWZpZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldFNlcXVlbmNlTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU0VRVUVOQ0VfTU9ESUZJRVIgPSAxNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVFVRU5DRV9NT0RJRklFUl9fVEFSR0VUID0gRkVBVFVSRV9NT0RJRklFUl9fVEFSR0VUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVFVRU5DRV9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRSA9IEZFQVRVUkVfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmVhdHVyZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VRVUVOQ0VfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRSA9IEZFQVRVUkVfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VRVUVOQ0VfTU9ESUZJRVJfX0ZFQVRVUkVfSUQgPSBGRUFUVVJFX01PRElGSUVSX19GRUFUVVJFX0lEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWUgVGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUVVFTkNFX01PRElGSUVSX19DVVJSRU5UX1ZBTFVFX1RFWFQgPSBGRUFUVVJFX01PRElGSUVSX19DVVJSRU5UX1ZBTFVFX1RFWFQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVFVRU5DRV9NT0RJRklFUl9fQ09NUExFVEUgPSBGRUFUVVJFX01PRElGSUVSX19DT01QTEVURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFX1NJWkUgPSBGRUFUVVJFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgU2VxdWVuY2UgSW5kZXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVFVRU5DRV9NT0RJRklFUl9fQ1VSUkVOVF9TRVFVRU5DRV9JTkRFWCA9IEZFQVRVUkVfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUVVFTkNFX01PRElGSUVSX19ORVhUX1ZBTFVFID0gRkVBVFVSRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmlnaW5hbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUVVFTkNFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSA9IEZFQVRVUkVfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VxdWVuY2UgTW9kaWZpZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VRVUVOQ0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCA9IEZFQVRVUkVfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkRvdWJsZVNlcXVlbmNlTW9kaWZpZXJJbXBsIDxlbT5Eb3VibGUgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Eb3VibGVTZXF1ZW5jZU1vZGlmaWVySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJQYWNrYWdlSW1wbCNnZXREb3VibGVTZXF1ZW5jZU1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IERPVUJMRV9TRVFVRU5DRV9NT0RJRklFUiA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRE9VQkxFX1NFUVVFTkNFX01PRElGSUVSX19UQVJHRVQgPSBTRVFVRU5DRV9NT0RJRklFUl9fVEFSR0VUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfU0VRVUVOQ0VfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkUgPSBTRVFVRU5DRV9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfU0VRVUVOQ0VfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRSA9IFNFUVVFTkNFX01PRElGSUVSX19GRUFUVVJFX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmVhdHVyZSBJZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERPVUJMRV9TRVFVRU5DRV9NT0RJRklFUl9fRkVBVFVSRV9JRCA9IFNFUVVFTkNFX01PRElGSUVSX19GRUFUVVJFX0lEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWUgVGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERPVUJMRV9TRVFVRU5DRV9NT0RJRklFUl9fQ1VSUkVOVF9WQUxVRV9URVhUID0gU0VRVUVOQ0VfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERPVUJMRV9TRVFVRU5DRV9NT0RJRklFUl9fQ09NUExFVEUgPSBTRVFVRU5DRV9NT0RJRklFUl9fQ09NUExFVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERPVUJMRV9TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0VfU0laRSA9IFNFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRV9TSVpFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgU2VxdWVuY2UgSW5kZXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfU0VRVUVOQ0VfTU9ESUZJRVJfX0NVUlJFTlRfU0VRVUVOQ0VfSU5ERVggPSBTRVFVRU5DRV9NT0RJRklFUl9fQ1VSUkVOVF9TRVFVRU5DRV9JTkRFWDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRE9VQkxFX1NFUVVFTkNFX01PRElGSUVSX19ORVhUX1ZBTFVFID0gU0VRVUVOQ0VfTU9ESUZJRVJfX05FWFRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JpZ2luYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfU0VRVUVOQ0VfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFID0gU0VRVUVOQ0VfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFID0gU0VRVUVOQ0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RG91YmxlIFNlcXVlbmNlIE1vZGlmaWVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERPVUJMRV9TRVFVRU5DRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UID0gU0VRVUVOQ0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkludGVnZXJOT1BNb2RpZmllckltcGwgPGVtPkludGVnZXIgTk9QIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuSW50ZWdlck5PUE1vZGlmaWVySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJQYWNrYWdlSW1wbCNnZXRJbnRlZ2VyTk9QTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgSU5URUdFUl9OT1BfTU9ESUZJRVIgPSA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElOVEVHRVJfTk9QX01PRElGSUVSX19UQVJHRVQgPSBOT1BfTU9ESUZJRVJfX1RBUkdFVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3RydWN0dXJhbCBGZWF0dXJlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5URUdFUl9OT1BfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkUgPSBOT1BfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmVhdHVyZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5URUdFUl9OT1BfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRSA9IE5PUF9NT0RJRklFUl9fRkVBVFVSRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZlYXR1cmUgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTlRFR0VSX05PUF9NT0RJRklFUl9fRkVBVFVSRV9JRCA9IE5PUF9NT0RJRklFUl9fRkVBVFVSRV9JRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlIFRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTlRFR0VSX05PUF9NT0RJRklFUl9fQ1VSUkVOVF9WQUxVRV9URVhUID0gTk9QX01PRElGSUVSX19DVVJSRU5UX1ZBTFVFX1RFWFQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTlRFR0VSX05PUF9NT0RJRklFUl9fQ09NUExFVEUgPSBOT1BfTU9ESUZJRVJfX0NPTVBMRVRFOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkludGVnZXIgTk9QIE1vZGlmaWVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElOVEVHRVJfTk9QX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgPSBOT1BfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkludGVnZXJSYW5nZU1vZGlmaWVySW1wbCA8ZW0+SW50ZWdlciBSYW5nZSBNb2RpZmllcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkludGVnZXJSYW5nZU1vZGlmaWVySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJQYWNrYWdlSW1wbCNnZXRJbnRlZ2VyUmFuZ2VNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBJTlRFR0VSX1JBTkdFX01PRElGSUVSID0gNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTlRFR0VSX1JBTkdFX01PRElGSUVSX19UQVJHRVQgPSBSQU5HRV9NT0RJRklFUl9fVEFSR0VUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTlRFR0VSX1JBTkdFX01PRElGSUVSX19FU1RSVUNUVVJBTF9GRUFUVVJFID0gUkFOR0VfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmVhdHVyZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fRkVBVFVSRV9OQU1FID0gUkFOR0VfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fRkVBVFVSRV9JRCA9IFJBTkdFX01PRElGSUVSX19GRUFUVVJFX0lEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWUgVGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVCA9IFJBTkdFX01PRElGSUVSX19DVVJSRU5UX1ZBTFVFX1RFWFQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTlRFR0VSX1JBTkdFX01PRElGSUVSX19DT01QTEVURSA9IFJBTkdFX01PRElGSUVSX19DT01QTEVURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX1NUQVJUX1ZBTFVFID0gUkFOR0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5kIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fRU5EX1ZBTFVFID0gUkFOR0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jcmVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fSU5DUkVNRU5UID0gUkFOR0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX05FWFRfVkFMVUUgPSBSQU5HRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmlnaW5hbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFID0gUkFOR0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SW50ZWdlciBSYW5nZSBNb2RpZmllcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTlRFR0VSX1JBTkdFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgPSBSQU5HRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJJbXBsIDxlbT5JbnRlZ2VyIFNlcXVlbmNlIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldEludGVnZXJTZXF1ZW5jZU1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IElOVEVHRVJfU0VRVUVOQ0VfTU9ESUZJRVIgPSA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElOVEVHRVJfU0VRVUVOQ0VfTU9ESUZJRVJfX1RBUkdFVCA9IFNFUVVFTkNFX01PRElGSUVSX19UQVJHRVQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN0cnVjdHVyYWwgRmVhdHVyZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElOVEVHRVJfU0VRVUVOQ0VfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkUgPSBTRVFVRU5DRV9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTlRFR0VSX1NFUVVFTkNFX01PRElGSUVSX19GRUFUVVJFX05BTUUgPSBTRVFVRU5DRV9NT0RJRklFUl9fRkVBVFVSRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZlYXR1cmUgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTlRFR0VSX1NFUVVFTkNFX01PRElGSUVSX19GRUFUVVJFX0lEID0gU0VRVUVOQ0VfTU9ESUZJRVJfX0ZFQVRVUkVfSUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZSBUZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5URUdFUl9TRVFVRU5DRV9NT0RJRklFUl9fQ1VSUkVOVF9WQUxVRV9URVhUID0gU0VRVUVOQ0VfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElOVEVHRVJfU0VRVUVOQ0VfTU9ESUZJRVJfX0NPTVBMRVRFID0gU0VRVUVOQ0VfTU9ESUZJRVJfX0NPTVBMRVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIFNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTlRFR0VSX1NFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRV9TSVpFID0gU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFX1NJWkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBTZXF1ZW5jZSBJbmRleDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElOVEVHRVJfU0VRVUVOQ0VfTU9ESUZJRVJfX0NVUlJFTlRfU0VRVUVOQ0VfSU5ERVggPSBTRVFVRU5DRV9NT0RJRklFUl9fQ1VSUkVOVF9TRVFVRU5DRV9JTkRFWDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5URUdFUl9TRVFVRU5DRV9NT0RJRklFUl9fTkVYVF9WQUxVRSA9IFNFUVVFTkNFX01PRElGSUVSX19ORVhUX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5URUdFUl9TRVFVRU5DRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUgPSBTRVFVRU5DRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElOVEVHRVJfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFID0gU0VRVUVOQ0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SW50ZWdlciBTZXF1ZW5jZSBNb2RpZmllcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTlRFR0VSX1NFUVVFTkNFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgPSBTRVFVRU5DRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTG9uZ05PUE1vZGlmaWVySW1wbCA8ZW0+TG9uZyBOT1AgTW9kaWZpZXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Mb25nTk9QTW9kaWZpZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldExvbmdOT1BNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBMT05HX05PUF9NT0RJRklFUiA9IDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9OR19OT1BfTU9ESUZJRVJfX1RBUkdFVCA9IE5PUF9NT0RJRklFUl9fVEFSR0VUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT05HX05PUF9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRSA9IE5PUF9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT05HX05PUF9NT0RJRklFUl9fRkVBVFVSRV9OQU1FID0gTk9QX01PRElGSUVSX19GRUFUVVJFX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmVhdHVyZSBJZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPTkdfTk9QX01PRElGSUVSX19GRUFUVVJFX0lEID0gTk9QX01PRElGSUVSX19GRUFUVVJFX0lEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWUgVGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPTkdfTk9QX01PRElGSUVSX19DVVJSRU5UX1ZBTFVFX1RFWFQgPSBOT1BfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPTkdfTk9QX01PRElGSUVSX19DT01QTEVURSA9IE5PUF9NT0RJRklFUl9fQ09NUExFVEU7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TG9uZyBOT1AgTW9kaWZpZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9OR19OT1BfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCA9IE5PUF9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTG9uZ1JhbmdlTW9kaWZpZXJJbXBsIDxlbT5Mb25nIFJhbmdlIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTG9uZ1JhbmdlTW9kaWZpZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldExvbmdSYW5nZU1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IExPTkdfUkFOR0VfTU9ESUZJRVIgPSA4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPTkdfUkFOR0VfTU9ESUZJRVJfX1RBUkdFVCA9IFJBTkdFX01PRElGSUVSX19UQVJHRVQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN0cnVjdHVyYWwgRmVhdHVyZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPTkdfUkFOR0VfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkUgPSBSQU5HRV9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT05HX1JBTkdFX01PRElGSUVSX19GRUFUVVJFX05BTUUgPSBSQU5HRV9NT0RJRklFUl9fRkVBVFVSRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZlYXR1cmUgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT05HX1JBTkdFX01PRElGSUVSX19GRUFUVVJFX0lEID0gUkFOR0VfTU9ESUZJRVJfX0ZFQVRVUkVfSUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZSBUZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9OR19SQU5HRV9NT0RJRklFUl9fQ1VSUkVOVF9WQUxVRV9URVhUID0gUkFOR0VfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPTkdfUkFOR0VfTU9ESUZJRVJfX0NPTVBMRVRFID0gUkFOR0VfTU9ESUZJRVJfX0NPTVBMRVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9OR19SQU5HRV9NT0RJRklFUl9fU1RBUlRfVkFMVUUgPSBSQU5HRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT05HX1JBTkdFX01PRElGSUVSX19FTkRfVkFMVUUgPSBSQU5HRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNyZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT05HX1JBTkdFX01PRElGSUVSX19JTkNSRU1FTlQgPSBSQU5HRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9OR19SQU5HRV9NT0RJRklFUl9fTkVYVF9WQUxVRSA9IFJBTkdFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9OR19SQU5HRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUgPSBSQU5HRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Mb25nIFJhbmdlIE1vZGlmaWVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPTkdfUkFOR0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCA9IFJBTkdFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Mb25nU2VxdWVuY2VNb2RpZmllckltcGwgPGVtPkxvbmcgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Mb25nU2VxdWVuY2VNb2RpZmllckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGwjZ2V0TG9uZ1NlcXVlbmNlTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgTE9OR19TRVFVRU5DRV9NT0RJRklFUiA9IDk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9OR19TRVFVRU5DRV9NT0RJRklFUl9fVEFSR0VUID0gU0VRVUVOQ0VfTU9ESUZJRVJfX1RBUkdFVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3RydWN0dXJhbCBGZWF0dXJlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9OR19TRVFVRU5DRV9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRSA9IFNFUVVFTkNFX01PRElGSUVSX19FU1RSVUNUVVJBTF9GRUFUVVJFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZlYXR1cmUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPTkdfU0VRVUVOQ0VfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRSA9IFNFUVVFTkNFX01PRElGSUVSX19GRUFUVVJFX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmVhdHVyZSBJZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPTkdfU0VRVUVOQ0VfTU9ESUZJRVJfX0ZFQVRVUkVfSUQgPSBTRVFVRU5DRV9NT0RJRklFUl9fRkVBVFVSRV9JRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlIFRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT05HX1NFUVVFTkNFX01PRElGSUVSX19DVVJSRU5UX1ZBTFVFX1RFWFQgPSBTRVFVRU5DRV9NT0RJRklFUl9fQ1VSUkVOVF9WQUxVRV9URVhUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9OR19TRVFVRU5DRV9NT0RJRklFUl9fQ09NUExFVEUgPSBTRVFVRU5DRV9NT0RJRklFUl9fQ09NUExFVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPTkdfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFX1NJWkUgPSBTRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0VfU0laRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFNlcXVlbmNlIEluZGV4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9OR19TRVFVRU5DRV9NT0RJRklFUl9fQ1VSUkVOVF9TRVFVRU5DRV9JTkRFWCA9IFNFUVVFTkNFX01PRElGSUVSX19DVVJSRU5UX1NFUVVFTkNFX0lOREVYOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5leHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT05HX1NFUVVFTkNFX01PRElGSUVSX19ORVhUX1ZBTFVFID0gU0VRVUVOQ0VfTU9ESUZJRVJfX05FWFRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JpZ2luYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT05HX1NFUVVFTkNFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSA9IFNFUVVFTkNFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9OR19TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0UgPSBTRVFVRU5DRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Mb25nIFNlcXVlbmNlIE1vZGlmaWVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPTkdfU0VRVUVOQ0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCA9IFNFUVVFTkNFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllckltcGwgPGVtPk1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldE1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IE1PRElGSUVSID0gMTA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTU9ESUZJRVJfX1VSSSA9IE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1PRElGSUVSX19UWVBFX1VSSSA9IE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTU9ESUZJRVJfX0RVQkxJTl9DT1JFID0gTW9kZWxQYWNrYWdlLkRFQ09SQVRPUl9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWxzIFRvIFVwZGF0ZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTU9ESUZJRVJfX0xBQkVMU19UT19VUERBVEUgPSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1PRElGSUVSX19HUkFQSCA9IE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0dSQVBIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNT0RJRklFUl9fRU5BQkxFRCA9IE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0VOQUJMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRGVjb3JhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTU9ESUZJRVJfX0dSQVBIX0RFQ09SQVRFRCA9IE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1PRElGSUVSX19QUk9HUkVTUyA9IE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX1BST0dSRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNT0RJRklFUl9fVEFSR0VUX1VSSSA9IE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmVhdHVyZSBNb2RpZmllcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1PRElGSUVSX19GRUFUVVJFX01PRElGSUVSUyA9IE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNT0RJRklFUl9fQ09NUExFVEUgPSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1vZGlmaWVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1PRElGSUVSX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TVEVNVGltZU5PUE1vZGlmaWVySW1wbCA8ZW0+U1RFTSBUaW1lIE5PUCBNb2RpZmllcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLlNURU1UaW1lTk9QTW9kaWZpZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldFNURU1UaW1lTk9QTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU1RFTV9USU1FX05PUF9NT0RJRklFUiA9IDEzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNURU1fVElNRV9OT1BfTU9ESUZJRVJfX1RBUkdFVCA9IE5PUF9NT0RJRklFUl9fVEFSR0VUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEVNX1RJTUVfTk9QX01PRElGSUVSX19FU1RSVUNUVVJBTF9GRUFUVVJFID0gTk9QX01PRElGSUVSX19FU1RSVUNUVVJBTF9GRUFUVVJFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZlYXR1cmUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNURU1fVElNRV9OT1BfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRSA9IE5PUF9NT0RJRklFUl9fRkVBVFVSRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZlYXR1cmUgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEVNX1RJTUVfTk9QX01PRElGSUVSX19GRUFUVVJFX0lEID0gTk9QX01PRElGSUVSX19GRUFUVVJFX0lEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWUgVGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNURU1fVElNRV9OT1BfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVCA9IE5PUF9NT0RJRklFUl9fQ1VSUkVOVF9WQUxVRV9URVhUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RFTV9USU1FX05PUF9NT0RJRklFUl9fQ09NUExFVEUgPSBOT1BfTU9ESUZJRVJfX0NPTVBMRVRFOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNURU0gVGltZSBOT1AgTW9kaWZpZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RFTV9USU1FX05PUF9NT0RJRklFUl9GRUFUVVJFX0NPVU5UID0gTk9QX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TVEVNVGltZVJhbmdlTW9kaWZpZXJJbXBsIDxlbT5TVEVNIFRpbWUgUmFuZ2UgTW9kaWZpZXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TVEVNVGltZVJhbmdlTW9kaWZpZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldFNURU1UaW1lUmFuZ2VNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVIgPSAxNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfX1RBUkdFVCA9IFJBTkdFX01PRElGSUVSX19UQVJHRVQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN0cnVjdHVyYWwgRmVhdHVyZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNURU1fVElNRV9SQU5HRV9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRSA9IFJBTkdFX01PRElGSUVSX19FU1RSVUNUVVJBTF9GRUFUVVJFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZlYXR1cmUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNURU1fVElNRV9SQU5HRV9NT0RJRklFUl9fRkVBVFVSRV9OQU1FID0gUkFOR0VfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19GRUFUVVJFX0lEID0gUkFOR0VfTU9ESUZJRVJfX0ZFQVRVUkVfSUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZSBUZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19DVVJSRU5UX1ZBTFVFX1RFWFQgPSBSQU5HRV9NT0RJRklFUl9fQ1VSUkVOVF9WQUxVRV9URVhUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19DT01QTEVURSA9IFJBTkdFX01PRElGSUVSX19DT01QTEVURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydCBWYWx1ZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNURU1fVElNRV9SQU5HRV9NT0RJRklFUl9fU1RBUlRfVkFMVUUgPSBSQU5HRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmQgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfX0VORF9WQUxVRSA9IFJBTkdFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY3JlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNURU1fVElNRV9SQU5HRV9NT0RJRklFUl9fSU5DUkVNRU5UID0gUkFOR0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBWYWx1ZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNURU1fVElNRV9SQU5HRV9NT0RJRklFUl9fTkVYVF9WQUxVRSA9IFJBTkdFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSA9IFJBTkdFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNURU0gVGltZSBSYW5nZSBNb2RpZmllcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCA9IFJBTkdFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJJbXBsIDxlbT5TVEVNIFRpbWUgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldFNURU1UaW1lU2VxdWVuY2VNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTVEVNX1RJTUVfU0VRVUVOQ0VfTU9ESUZJRVIgPSAxNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEVNX1RJTUVfU0VRVUVOQ0VfTU9ESUZJRVJfX1RBUkdFVCA9IFNFUVVFTkNFX01PRElGSUVSX19UQVJHRVQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN0cnVjdHVyYWwgRmVhdHVyZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNURU1fVElNRV9TRVFVRU5DRV9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRSA9IFNFUVVFTkNFX01PRElGSUVSX19FU1RSVUNUVVJBTF9GRUFUVVJFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZlYXR1cmUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNURU1fVElNRV9TRVFVRU5DRV9NT0RJRklFUl9fRkVBVFVSRV9OQU1FID0gU0VRVUVOQ0VfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RFTV9USU1FX1NFUVVFTkNFX01PRElGSUVSX19GRUFUVVJFX0lEID0gU0VRVUVOQ0VfTU9ESUZJRVJfX0ZFQVRVUkVfSUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZSBUZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RFTV9USU1FX1NFUVVFTkNFX01PRElGSUVSX19DVVJSRU5UX1ZBTFVFX1RFWFQgPSBTRVFVRU5DRV9NT0RJRklFUl9fQ1VSUkVOVF9WQUxVRV9URVhUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RFTV9USU1FX1NFUVVFTkNFX01PRElGSUVSX19DT01QTEVURSA9IFNFUVVFTkNFX01PRElGSUVSX19DT01QTEVURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RFTV9USU1FX1NFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRV9TSVpFID0gU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFX1NJWkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBTZXF1ZW5jZSBJbmRleDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNURU1fVElNRV9TRVFVRU5DRV9NT0RJRklFUl9fQ1VSUkVOVF9TRVFVRU5DRV9JTkRFWCA9IFNFUVVFTkNFX01PRElGSUVSX19DVVJSRU5UX1NFUVVFTkNFX0lOREVYOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5leHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEVNX1RJTUVfU0VRVUVOQ0VfTU9ESUZJRVJfX05FWFRfVkFMVUUgPSBTRVFVRU5DRV9NT0RJRklFUl9fTkVYVF9WQUxVRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmlnaW5hbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNURU1fVElNRV9TRVFVRU5DRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUgPSBTRVFVRU5DRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNURU1fVElNRV9TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0UgPSBTRVFVRU5DRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TVEVNIFRpbWUgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RFTV9USU1FX1NFUVVFTkNFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgPSBTRVFVRU5DRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU3RyaW5nTk9QTW9kaWZpZXJJbXBsIDxlbT5TdHJpbmcgTk9QIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU3RyaW5nTk9QTW9kaWZpZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldFN0cmluZ05PUE1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNUUklOR19OT1BfTU9ESUZJRVIgPSAxNzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFJJTkdfTk9QX01PRElGSUVSX19UQVJHRVQgPSBOT1BfTU9ESUZJRVJfX1RBUkdFVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3RydWN0dXJhbCBGZWF0dXJlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RSSU5HX05PUF9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRSA9IE5PUF9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFJJTkdfTk9QX01PRElGSUVSX19GRUFUVVJFX05BTUUgPSBOT1BfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RSSU5HX05PUF9NT0RJRklFUl9fRkVBVFVSRV9JRCA9IE5PUF9NT0RJRklFUl9fRkVBVFVSRV9JRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlIFRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFJJTkdfTk9QX01PRElGSUVSX19DVVJSRU5UX1ZBTFVFX1RFWFQgPSBOT1BfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUUklOR19OT1BfTU9ESUZJRVJfX0NPTVBMRVRFID0gTk9QX01PRElGSUVSX19DT01QTEVURTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TdHJpbmcgTk9QIE1vZGlmaWVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUUklOR19OT1BfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCA9IE5PUF9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU3RyaW5nU2VxdWVuY2VNb2RpZmllckltcGwgPGVtPlN0cmluZyBTZXF1ZW5jZSBNb2RpZmllcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLlN0cmluZ1NlcXVlbmNlTW9kaWZpZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldFN0cmluZ1NlcXVlbmNlTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU1RSSU5HX1NFUVVFTkNFX01PRElGSUVSID0gMTg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RSSU5HX1NFUVVFTkNFX01PRElGSUVSX19UQVJHRVQgPSBTRVFVRU5DRV9NT0RJRklFUl9fVEFSR0VUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFJJTkdfU0VRVUVOQ0VfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkUgPSBTRVFVRU5DRV9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFJJTkdfU0VRVUVOQ0VfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRSA9IFNFUVVFTkNFX01PRElGSUVSX19GRUFUVVJFX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmVhdHVyZSBJZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUUklOR19TRVFVRU5DRV9NT0RJRklFUl9fRkVBVFVSRV9JRCA9IFNFUVVFTkNFX01PRElGSUVSX19GRUFUVVJFX0lEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWUgVGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUUklOR19TRVFVRU5DRV9NT0RJRklFUl9fQ1VSUkVOVF9WQUxVRV9URVhUID0gU0VRVUVOQ0VfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUUklOR19TRVFVRU5DRV9NT0RJRklFUl9fQ09NUExFVEUgPSBTRVFVRU5DRV9NT0RJRklFUl9fQ09NUExFVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUUklOR19TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0VfU0laRSA9IFNFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRV9TSVpFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgU2VxdWVuY2UgSW5kZXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFJJTkdfU0VRVUVOQ0VfTU9ESUZJRVJfX0NVUlJFTlRfU0VRVUVOQ0VfSU5ERVggPSBTRVFVRU5DRV9NT0RJRklFUl9fQ1VSUkVOVF9TRVFVRU5DRV9JTkRFWDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RSSU5HX1NFUVVFTkNFX01PRElGSUVSX19ORVhUX1ZBTFVFID0gU0VRVUVOQ0VfTU9ESUZJRVJfX05FWFRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JpZ2luYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFJJTkdfU0VRVUVOQ0VfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFID0gU0VRVUVOQ0VfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFJJTkdfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFID0gU0VRVUVOQ0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U3RyaW5nIFNlcXVlbmNlIE1vZGlmaWVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUUklOR19TRVFVRU5DRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UID0gU0VRVUVOQ0VfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlIDxlbT5Nb2RpZmlhYmxlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGwjZ2V0TW9kaWZpYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBNT0RJRklBQkxFID0gMTk7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TW9kaWZpYWJsZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNT0RJRklBQkxFX0ZFQVRVUkVfQ09VTlQgPSAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TaW5nbGVWYWx1ZU1vZGlmaWVySW1wbCA8ZW0+U2luZ2xlIFZhbHVlIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU2luZ2xlVmFsdWVNb2RpZmllckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGwjZ2V0U2luZ2xlVmFsdWVNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTSU5HTEVfVkFMVUVfTU9ESUZJRVIgPSAyMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSU5HTEVfVkFMVUVfTU9ESUZJRVJfX1RBUkdFVCA9IEZFQVRVUkVfTU9ESUZJRVJfX1RBUkdFVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3RydWN0dXJhbCBGZWF0dXJlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lOR0xFX1ZBTFVFX01PRElGSUVSX19FU1RSVUNUVVJBTF9GRUFUVVJFID0gRkVBVFVSRV9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSU5HTEVfVkFMVUVfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRSA9IEZFQVRVUkVfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lOR0xFX1ZBTFVFX01PRElGSUVSX19GRUFUVVJFX0lEID0gRkVBVFVSRV9NT0RJRklFUl9fRkVBVFVSRV9JRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlIFRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSU5HTEVfVkFMVUVfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVCA9IEZFQVRVUkVfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJTkdMRV9WQUxVRV9NT0RJRklFUl9fQ09NUExFVEUgPSBGRUFUVVJFX01PRElGSUVSX19DT01QTEVURTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TaW5nbGUgVmFsdWUgTW9kaWZpZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lOR0xFX1ZBTFVFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgPSBGRUFUVVJFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Eb3VibGVNb2RpZmllckltcGwgPGVtPkRvdWJsZSBNb2RpZmllcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkRvdWJsZU1vZGlmaWVySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJQYWNrYWdlSW1wbCNnZXREb3VibGVNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBET1VCTEVfTU9ESUZJRVIgPSAyMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfTU9ESUZJRVJfX1RBUkdFVCA9IFNJTkdMRV9WQUxVRV9NT0RJRklFUl9fVEFSR0VUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkUgPSBTSU5HTEVfVkFMVUVfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmVhdHVyZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRE9VQkxFX01PRElGSUVSX19GRUFUVVJFX05BTUUgPSBTSU5HTEVfVkFMVUVfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRE9VQkxFX01PRElGSUVSX19GRUFUVVJFX0lEID0gU0lOR0xFX1ZBTFVFX01PRElGSUVSX19GRUFUVVJFX0lEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWUgVGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERPVUJMRV9NT0RJRklFUl9fQ1VSUkVOVF9WQUxVRV9URVhUID0gU0lOR0xFX1ZBTFVFX01PRElGSUVSX19DVVJSRU5UX1ZBTFVFX1RFWFQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfTU9ESUZJRVJfX0NPTVBMRVRFID0gU0lOR0xFX1ZBTFVFX01PRElGSUVSX19DT01QTEVURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERPVUJMRV9NT0RJRklFUl9fVkFMVUUgPSBTSU5HTEVfVkFMVUVfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JpZ2luYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFID0gU0lOR0xFX1ZBTFVFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRvdWJsZSBNb2RpZmllcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBET1VCTEVfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCA9IFNJTkdMRV9WQUxVRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuSW50ZWdlck1vZGlmaWVySW1wbCA8ZW0+SW50ZWdlciBNb2RpZmllcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkludGVnZXJNb2RpZmllckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGwjZ2V0SW50ZWdlck1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IElOVEVHRVJfTU9ESUZJRVIgPSAyMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTlRFR0VSX01PRElGSUVSX19UQVJHRVQgPSBTSU5HTEVfVkFMVUVfTU9ESUZJRVJfX1RBUkdFVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3RydWN0dXJhbCBGZWF0dXJlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5URUdFUl9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRSA9IFNJTkdMRV9WQUxVRV9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTlRFR0VSX01PRElGSUVSX19GRUFUVVJFX05BTUUgPSBTSU5HTEVfVkFMVUVfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5URUdFUl9NT0RJRklFUl9fRkVBVFVSRV9JRCA9IFNJTkdMRV9WQUxVRV9NT0RJRklFUl9fRkVBVFVSRV9JRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlIFRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTlRFR0VSX01PRElGSUVSX19DVVJSRU5UX1ZBTFVFX1RFWFQgPSBTSU5HTEVfVkFMVUVfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElOVEVHRVJfTU9ESUZJRVJfX0NPTVBMRVRFID0gU0lOR0xFX1ZBTFVFX01PRElGSUVSX19DT01QTEVURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElOVEVHRVJfTU9ESUZJRVJfX1ZBTFVFID0gU0lOR0xFX1ZBTFVFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5URUdFUl9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUgPSBTSU5HTEVfVkFMVUVfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SW50ZWdlciBNb2RpZmllcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTlRFR0VSX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgPSBTSU5HTEVfVkFMVUVfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkxvbmdNb2RpZmllckltcGwgPGVtPkxvbmcgTW9kaWZpZXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Mb25nTW9kaWZpZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldExvbmdNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBMT05HX01PRElGSUVSID0gMjM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9OR19NT0RJRklFUl9fVEFSR0VUID0gU0lOR0xFX1ZBTFVFX01PRElGSUVSX19UQVJHRVQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN0cnVjdHVyYWwgRmVhdHVyZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPTkdfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkUgPSBTSU5HTEVfVkFMVUVfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmVhdHVyZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9OR19NT0RJRklFUl9fRkVBVFVSRV9OQU1FID0gU0lOR0xFX1ZBTFVFX01PRElGSUVSX19GRUFUVVJFX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmVhdHVyZSBJZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPTkdfTU9ESUZJRVJfX0ZFQVRVUkVfSUQgPSBTSU5HTEVfVkFMVUVfTU9ESUZJRVJfX0ZFQVRVUkVfSUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZSBUZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9OR19NT0RJRklFUl9fQ1VSUkVOVF9WQUxVRV9URVhUID0gU0lOR0xFX1ZBTFVFX01PRElGSUVSX19DVVJSRU5UX1ZBTFVFX1RFWFQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT05HX01PRElGSUVSX19DT01QTEVURSA9IFNJTkdMRV9WQUxVRV9NT0RJRklFUl9fQ09NUExFVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT05HX01PRElGSUVSX19WQUxVRSA9IFNJTkdMRV9WQUxVRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmlnaW5hbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPTkdfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFID0gU0lOR0xFX1ZBTFVFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvbmcgTW9kaWZpZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9OR19NT0RJRklFUl9GRUFUVVJFX0NPVU5UID0gU0lOR0xFX1ZBTFVFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TVEVNVGltZU1vZGlmaWVySW1wbCA8ZW0+U1RFTSBUaW1lIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU1RFTVRpbWVNb2RpZmllckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGwjZ2V0U1RFTVRpbWVNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTVEVNX1RJTUVfTU9ESUZJRVIgPSAyNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEVNX1RJTUVfTU9ESUZJRVJfX1RBUkdFVCA9IFNJTkdMRV9WQUxVRV9NT0RJRklFUl9fVEFSR0VUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEVNX1RJTUVfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkUgPSBTSU5HTEVfVkFMVUVfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmVhdHVyZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RFTV9USU1FX01PRElGSUVSX19GRUFUVVJFX05BTUUgPSBTSU5HTEVfVkFMVUVfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RFTV9USU1FX01PRElGSUVSX19GRUFUVVJFX0lEID0gU0lOR0xFX1ZBTFVFX01PRElGSUVSX19GRUFUVVJFX0lEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWUgVGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNURU1fVElNRV9NT0RJRklFUl9fQ1VSUkVOVF9WQUxVRV9URVhUID0gU0lOR0xFX1ZBTFVFX01PRElGSUVSX19DVVJSRU5UX1ZBTFVFX1RFWFQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEVNX1RJTUVfTU9ESUZJRVJfX0NPTVBMRVRFID0gU0lOR0xFX1ZBTFVFX01PRElGSUVSX19DT01QTEVURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNURU1fVElNRV9NT0RJRklFUl9fVkFMVUUgPSBTSU5HTEVfVkFMVUVfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JpZ2luYWwgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEVNX1RJTUVfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFID0gU0lOR0xFX1ZBTFVFX01PRElGSUVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNURU0gVGltZSBNb2RpZmllcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEVNX1RJTUVfTU9ESUZJRVJfRkVBVFVSRV9DT1VOVCA9IFNJTkdMRV9WQUxVRV9NT0RJRklFUl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VVJJPC9lbT4nIGRhdGEgdHlwZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJQYWNrYWdlSW1wbCNnZXRVUkkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVVJJID0gMjU7CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVOT1BNb2RpZmllciA8ZW0+RG91YmxlIE5PUCBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Eb3VibGUgTk9QIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZU5PUE1vZGlmaWVyCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXREb3VibGVOT1BNb2RpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZVJhbmdlTW9kaWZpZXIgPGVtPkRvdWJsZSBSYW5nZSBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Eb3VibGUgUmFuZ2UgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlUmFuZ2VNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RG91YmxlUmFuZ2VNb2RpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlUmFuZ2VNb2RpZmllciNnZXRTdGFydFZhbHVlIDxlbT5TdGFydCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0IFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZVJhbmdlTW9kaWZpZXIjZ2V0U3RhcnRWYWx1ZSgpCisJICogQHNlZSAjZ2V0RG91YmxlUmFuZ2VNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RG91YmxlUmFuZ2VNb2RpZmllcl9TdGFydFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVSYW5nZU1vZGlmaWVyI2dldEVuZFZhbHVlIDxlbT5FbmQgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbmQgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlUmFuZ2VNb2RpZmllciNnZXRFbmRWYWx1ZSgpCisJICogQHNlZSAjZ2V0RG91YmxlUmFuZ2VNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RG91YmxlUmFuZ2VNb2RpZmllcl9FbmRWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlUmFuZ2VNb2RpZmllciNnZXRJbmNyZW1lbnQgPGVtPkluY3JlbWVudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluY3JlbWVudDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVSYW5nZU1vZGlmaWVyI2dldEluY3JlbWVudCgpCisJICogQHNlZSAjZ2V0RG91YmxlUmFuZ2VNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RG91YmxlUmFuZ2VNb2RpZmllcl9JbmNyZW1lbnQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZVJhbmdlTW9kaWZpZXIjZ2V0TmV4dFZhbHVlIDxlbT5OZXh0IFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmV4dCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVSYW5nZU1vZGlmaWVyI2dldE5leHRWYWx1ZSgpCisJICogQHNlZSAjZ2V0RG91YmxlUmFuZ2VNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RG91YmxlUmFuZ2VNb2RpZmllcl9OZXh0VmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZVJhbmdlTW9kaWZpZXIjZ2V0T3JpZ2luYWxWYWx1ZSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVSYW5nZU1vZGlmaWVyI2dldE9yaWdpbmFsVmFsdWUoKQorCSAqIEBzZWUgI2dldERvdWJsZVJhbmdlTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERvdWJsZVJhbmdlTW9kaWZpZXJfT3JpZ2luYWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZVNlcXVlbmNlTW9kaWZpZXIgPGVtPkRvdWJsZSBTZXF1ZW5jZSBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Eb3VibGUgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlU2VxdWVuY2VNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RG91YmxlU2VxdWVuY2VNb2RpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVTZXF1ZW5jZU1vZGlmaWVyI2dldFNlcXVlbmNlIDxlbT5TZXF1ZW5jZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+U2VxdWVuY2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlU2VxdWVuY2VNb2RpZmllciNnZXRTZXF1ZW5jZSgpCisJICogQHNlZSAjZ2V0RG91YmxlU2VxdWVuY2VNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RG91YmxlU2VxdWVuY2VNb2RpZmllcl9TZXF1ZW5jZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkZlYXR1cmVNb2RpZmllciA8ZW0+RmVhdHVyZSBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5GZWF0dXJlIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkZlYXR1cmVNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RmVhdHVyZU1vZGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXIjZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5UYXJnZXQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRmVhdHVyZU1vZGlmaWVyI2dldFRhcmdldCgpCisJICogQHNlZSAjZ2V0RmVhdHVyZU1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRGZWF0dXJlTW9kaWZpZXJfVGFyZ2V0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXIjZ2V0RVN0cnVjdHVyYWxGZWF0dXJlIDxlbT5FU3RydWN0dXJhbCBGZWF0dXJlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RVN0cnVjdHVyYWwgRmVhdHVyZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXIjZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkKKwkgKiBAc2VlICNnZXRGZWF0dXJlTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEZlYXR1cmVNb2RpZmllcl9FU3RydWN0dXJhbEZlYXR1cmUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkZlYXR1cmVNb2RpZmllciNnZXRGZWF0dXJlTmFtZSA8ZW0+RmVhdHVyZSBOYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmVhdHVyZSBOYW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkZlYXR1cmVNb2RpZmllciNnZXRGZWF0dXJlTmFtZSgpCisJICogQHNlZSAjZ2V0RmVhdHVyZU1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRGZWF0dXJlTW9kaWZpZXJfRmVhdHVyZU5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkZlYXR1cmVNb2RpZmllciNnZXRGZWF0dXJlSWQgPGVtPkZlYXR1cmUgSWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GZWF0dXJlIElkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkZlYXR1cmVNb2RpZmllciNnZXRGZWF0dXJlSWQoKQorCSAqIEBzZWUgI2dldEZlYXR1cmVNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RmVhdHVyZU1vZGlmaWVyX0ZlYXR1cmVJZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRmVhdHVyZU1vZGlmaWVyI2dldEN1cnJlbnRWYWx1ZVRleHQgPGVtPkN1cnJlbnQgVmFsdWUgVGV4dDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkN1cnJlbnQgVmFsdWUgVGV4dDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXIjZ2V0Q3VycmVudFZhbHVlVGV4dCgpCisJICogQHNlZSAjZ2V0RmVhdHVyZU1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRGZWF0dXJlTW9kaWZpZXJfQ3VycmVudFZhbHVlVGV4dCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRmVhdHVyZU1vZGlmaWVyI2lzQ29tcGxldGUgPGVtPkNvbXBsZXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tcGxldGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRmVhdHVyZU1vZGlmaWVyI2lzQ29tcGxldGUoKQorCSAqIEBzZWUgI2dldEZlYXR1cmVNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RmVhdHVyZU1vZGlmaWVyX0NvbXBsZXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlck5PUE1vZGlmaWVyIDxlbT5JbnRlZ2VyIE5PUCBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbnRlZ2VyIE5PUCBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyTk9QTW9kaWZpZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEludGVnZXJOT1BNb2RpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJSYW5nZU1vZGlmaWVyIDxlbT5JbnRlZ2VyIFJhbmdlIE1vZGlmaWVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkludGVnZXIgUmFuZ2UgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlclJhbmdlTW9kaWZpZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEludGVnZXJSYW5nZU1vZGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyUmFuZ2VNb2RpZmllciNnZXRTdGFydFZhbHVlIDxlbT5TdGFydCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0IFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJSYW5nZU1vZGlmaWVyI2dldFN0YXJ0VmFsdWUoKQorCSAqIEBzZWUgI2dldEludGVnZXJSYW5nZU1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRJbnRlZ2VyUmFuZ2VNb2RpZmllcl9TdGFydFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyUmFuZ2VNb2RpZmllciNnZXRFbmRWYWx1ZSA8ZW0+RW5kIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW5kIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJSYW5nZU1vZGlmaWVyI2dldEVuZFZhbHVlKCkKKwkgKiBAc2VlICNnZXRJbnRlZ2VyUmFuZ2VNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0SW50ZWdlclJhbmdlTW9kaWZpZXJfRW5kVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJSYW5nZU1vZGlmaWVyI2dldEluY3JlbWVudCA8ZW0+SW5jcmVtZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5jcmVtZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJSYW5nZU1vZGlmaWVyI2dldEluY3JlbWVudCgpCisJICogQHNlZSAjZ2V0SW50ZWdlclJhbmdlTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEludGVnZXJSYW5nZU1vZGlmaWVyX0luY3JlbWVudCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlclJhbmdlTW9kaWZpZXIjZ2V0TmV4dFZhbHVlIDxlbT5OZXh0IFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmV4dCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyUmFuZ2VNb2RpZmllciNnZXROZXh0VmFsdWUoKQorCSAqIEBzZWUgI2dldEludGVnZXJSYW5nZU1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRJbnRlZ2VyUmFuZ2VNb2RpZmllcl9OZXh0VmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJSYW5nZU1vZGlmaWVyI2dldE9yaWdpbmFsVmFsdWUgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlclJhbmdlTW9kaWZpZXIjZ2V0T3JpZ2luYWxWYWx1ZSgpCisJICogQHNlZSAjZ2V0SW50ZWdlclJhbmdlTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEludGVnZXJSYW5nZU1vZGlmaWVyX09yaWdpbmFsVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyU2VxdWVuY2VNb2RpZmllciA8ZW0+SW50ZWdlciBTZXF1ZW5jZSBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbnRlZ2VyIFNlcXVlbmNlIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJTZXF1ZW5jZU1vZGlmaWVyCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRJbnRlZ2VyU2VxdWVuY2VNb2RpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyU2VxdWVuY2VNb2RpZmllciNnZXRTZXF1ZW5jZSA8ZW0+U2VxdWVuY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlNlcXVlbmNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJTZXF1ZW5jZU1vZGlmaWVyI2dldFNlcXVlbmNlKCkKKwkgKiBAc2VlICNnZXRJbnRlZ2VyU2VxdWVuY2VNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0SW50ZWdlclNlcXVlbmNlTW9kaWZpZXJfU2VxdWVuY2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nTk9QTW9kaWZpZXIgPGVtPkxvbmcgTk9QIE1vZGlmaWVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxvbmcgTk9QIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdOT1BNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0TG9uZ05PUE1vZGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ1JhbmdlTW9kaWZpZXIgPGVtPkxvbmcgUmFuZ2UgTW9kaWZpZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TG9uZyBSYW5nZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nUmFuZ2VNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0TG9uZ1JhbmdlTW9kaWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdSYW5nZU1vZGlmaWVyI2dldFN0YXJ0VmFsdWUgPGVtPlN0YXJ0IFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ1JhbmdlTW9kaWZpZXIjZ2V0U3RhcnRWYWx1ZSgpCisJICogQHNlZSAjZ2V0TG9uZ1JhbmdlTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldExvbmdSYW5nZU1vZGlmaWVyX1N0YXJ0VmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdSYW5nZU1vZGlmaWVyI2dldEVuZFZhbHVlIDxlbT5FbmQgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbmQgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ1JhbmdlTW9kaWZpZXIjZ2V0RW5kVmFsdWUoKQorCSAqIEBzZWUgI2dldExvbmdSYW5nZU1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRMb25nUmFuZ2VNb2RpZmllcl9FbmRWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ1JhbmdlTW9kaWZpZXIjZ2V0SW5jcmVtZW50IDxlbT5JbmNyZW1lbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbmNyZW1lbnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ1JhbmdlTW9kaWZpZXIjZ2V0SW5jcmVtZW50KCkKKwkgKiBAc2VlICNnZXRMb25nUmFuZ2VNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0TG9uZ1JhbmdlTW9kaWZpZXJfSW5jcmVtZW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nUmFuZ2VNb2RpZmllciNnZXROZXh0VmFsdWUgPGVtPk5leHQgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OZXh0IFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdSYW5nZU1vZGlmaWVyI2dldE5leHRWYWx1ZSgpCisJICogQHNlZSAjZ2V0TG9uZ1JhbmdlTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldExvbmdSYW5nZU1vZGlmaWVyX05leHRWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ1JhbmdlTW9kaWZpZXIjZ2V0T3JpZ2luYWxWYWx1ZSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nUmFuZ2VNb2RpZmllciNnZXRPcmlnaW5hbFZhbHVlKCkKKwkgKiBAc2VlICNnZXRMb25nUmFuZ2VNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0TG9uZ1JhbmdlTW9kaWZpZXJfT3JpZ2luYWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdTZXF1ZW5jZU1vZGlmaWVyIDxlbT5Mb25nIFNlcXVlbmNlIE1vZGlmaWVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxvbmcgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ1NlcXVlbmNlTW9kaWZpZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldExvbmdTZXF1ZW5jZU1vZGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdTZXF1ZW5jZU1vZGlmaWVyI2dldFNlcXVlbmNlIDxlbT5TZXF1ZW5jZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+U2VxdWVuY2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ1NlcXVlbmNlTW9kaWZpZXIjZ2V0U2VxdWVuY2UoKQorCSAqIEBzZWUgI2dldExvbmdTZXF1ZW5jZU1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRMb25nU2VxdWVuY2VNb2RpZmllcl9TZXF1ZW5jZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyIDxlbT5Nb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Nb2RpZmllcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0TW9kaWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyI2dldFRhcmdldFVSSSA8ZW0+VGFyZ2V0IFVSSTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhcmdldCBVUkk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXIjZ2V0VGFyZ2V0VVJJKCkKKwkgKiBAc2VlICNnZXRNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0TW9kaWZpZXJfVGFyZ2V0VVJJKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyI2dldEZlYXR1cmVNb2RpZmllcnMgPGVtPkZlYXR1cmUgTW9kaWZpZXJzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5GZWF0dXJlIE1vZGlmaWVyczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllciNnZXRGZWF0dXJlTW9kaWZpZXJzKCkKKwkgKiBAc2VlICNnZXRNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0TW9kaWZpZXJfRmVhdHVyZU1vZGlmaWVycygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXIjaXNDb21wbGV0ZSA8ZW0+Q29tcGxldGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db21wbGV0ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllciNpc0NvbXBsZXRlKCkKKwkgKiBAc2VlICNnZXRNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0TW9kaWZpZXJfQ29tcGxldGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5OT1BNb2RpZmllciA8ZW0+Tk9QIE1vZGlmaWVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk5PUCBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5OT1BNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Tk9QTW9kaWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5SYW5nZU1vZGlmaWVyIDxlbT5SYW5nZSBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SYW5nZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5SYW5nZU1vZGlmaWVyCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSYW5nZU1vZGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVOT1BNb2RpZmllciA8ZW0+U1RFTSBUaW1lIE5PUCBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TVEVNIFRpbWUgTk9QIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lTk9QTW9kaWZpZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNURU1UaW1lTk9QTW9kaWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZVJhbmdlTW9kaWZpZXIgPGVtPlNURU0gVGltZSBSYW5nZSBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TVEVNIFRpbWUgUmFuZ2UgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVSYW5nZU1vZGlmaWVyCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTVEVNVGltZVJhbmdlTW9kaWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lUmFuZ2VNb2RpZmllciNnZXRTdGFydFZhbHVlIDxlbT5TdGFydCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlN0YXJ0IFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lUmFuZ2VNb2RpZmllciNnZXRTdGFydFZhbHVlKCkKKwkgKiBAc2VlICNnZXRTVEVNVGltZVJhbmdlTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNURU1UaW1lUmFuZ2VNb2RpZmllcl9TdGFydFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZVJhbmdlTW9kaWZpZXIjZ2V0RW5kVmFsdWUgPGVtPkVuZCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVuZCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZVJhbmdlTW9kaWZpZXIjZ2V0RW5kVmFsdWUoKQorCSAqIEBzZWUgI2dldFNURU1UaW1lUmFuZ2VNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U1RFTVRpbWVSYW5nZU1vZGlmaWVyX0VuZFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZVJhbmdlTW9kaWZpZXIjZ2V0SW5jcmVtZW50IDxlbT5JbmNyZW1lbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbmNyZW1lbnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVSYW5nZU1vZGlmaWVyI2dldEluY3JlbWVudCgpCisJICogQHNlZSAjZ2V0U1RFTVRpbWVSYW5nZU1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTVEVNVGltZVJhbmdlTW9kaWZpZXJfSW5jcmVtZW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZVJhbmdlTW9kaWZpZXIjZ2V0TmV4dFZhbHVlIDxlbT5OZXh0IFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+TmV4dCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZVJhbmdlTW9kaWZpZXIjZ2V0TmV4dFZhbHVlKCkKKwkgKiBAc2VlICNnZXRTVEVNVGltZVJhbmdlTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNURU1UaW1lUmFuZ2VNb2RpZmllcl9OZXh0VmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lUmFuZ2VNb2RpZmllciNnZXRPcmlnaW5hbFZhbHVlIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lUmFuZ2VNb2RpZmllciNnZXRPcmlnaW5hbFZhbHVlKCkKKwkgKiBAc2VlICNnZXRTVEVNVGltZVJhbmdlTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNURU1UaW1lUmFuZ2VNb2RpZmllcl9PcmlnaW5hbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyIDxlbT5TVEVNIFRpbWUgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U1RFTSBUaW1lIFNlcXVlbmNlIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lU2VxdWVuY2VNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lU2VxdWVuY2VNb2RpZmllciNnZXRTZXF1ZW5jZSA8ZW0+U2VxdWVuY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlNlcXVlbmNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lU2VxdWVuY2VNb2RpZmllciNnZXRTZXF1ZW5jZSgpCisJICogQHNlZSAjZ2V0U1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJfU2VxdWVuY2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TZXF1ZW5jZU1vZGlmaWVyIDxlbT5TZXF1ZW5jZSBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZXF1ZW5jZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TZXF1ZW5jZU1vZGlmaWVyCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTZXF1ZW5jZU1vZGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TZXF1ZW5jZU1vZGlmaWVyI2dldFNlcXVlbmNlU2l6ZSA8ZW0+U2VxdWVuY2UgU2l6ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcXVlbmNlIFNpemU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2VxdWVuY2VNb2RpZmllciNnZXRTZXF1ZW5jZVNpemUoKQorCSAqIEBzZWUgI2dldFNlcXVlbmNlTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNlcXVlbmNlTW9kaWZpZXJfU2VxdWVuY2VTaXplKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TZXF1ZW5jZU1vZGlmaWVyI2dldEN1cnJlbnRTZXF1ZW5jZUluZGV4IDxlbT5DdXJyZW50IFNlcXVlbmNlIEluZGV4PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3VycmVudCBTZXF1ZW5jZSBJbmRleDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TZXF1ZW5jZU1vZGlmaWVyI2dldEN1cnJlbnRTZXF1ZW5jZUluZGV4KCkKKwkgKiBAc2VlICNnZXRTZXF1ZW5jZU1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTZXF1ZW5jZU1vZGlmaWVyX0N1cnJlbnRTZXF1ZW5jZUluZGV4KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TZXF1ZW5jZU1vZGlmaWVyI2dldE5leHRWYWx1ZSA8ZW0+TmV4dCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5leHQgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2VxdWVuY2VNb2RpZmllciNnZXROZXh0VmFsdWUoKQorCSAqIEBzZWUgI2dldFNlcXVlbmNlTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNlcXVlbmNlTW9kaWZpZXJfTmV4dFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TZXF1ZW5jZU1vZGlmaWVyI2dldE9yaWdpbmFsVmFsdWUgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2VxdWVuY2VNb2RpZmllciNnZXRPcmlnaW5hbFZhbHVlKCkKKwkgKiBAc2VlICNnZXRTZXF1ZW5jZU1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTZXF1ZW5jZU1vZGlmaWVyX09yaWdpbmFsVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TdHJpbmdOT1BNb2RpZmllciA8ZW0+U3RyaW5nIE5PUCBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TdHJpbmcgTk9QIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlN0cmluZ05PUE1vZGlmaWVyCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTdHJpbmdOT1BNb2RpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlN0cmluZ1NlcXVlbmNlTW9kaWZpZXIgPGVtPlN0cmluZyBTZXF1ZW5jZSBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TdHJpbmcgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU3RyaW5nU2VxdWVuY2VNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U3RyaW5nU2VxdWVuY2VNb2RpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TdHJpbmdTZXF1ZW5jZU1vZGlmaWVyI2dldFNlcXVlbmNlIDxlbT5TZXF1ZW5jZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+U2VxdWVuY2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU3RyaW5nU2VxdWVuY2VNb2RpZmllciNnZXRTZXF1ZW5jZSgpCisJICogQHNlZSAjZ2V0U3RyaW5nU2VxdWVuY2VNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U3RyaW5nU2VxdWVuY2VNb2RpZmllcl9TZXF1ZW5jZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUgPGVtPk1vZGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TW9kaWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRNb2RpZmlhYmxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2luZ2xlVmFsdWVNb2RpZmllciA8ZW0+U2luZ2xlIFZhbHVlIE1vZGlmaWVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNpbmdsZSBWYWx1ZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TaW5nbGVWYWx1ZU1vZGlmaWVyCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTaW5nbGVWYWx1ZU1vZGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlTW9kaWZpZXIgPGVtPkRvdWJsZSBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Eb3VibGUgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlTW9kaWZpZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldERvdWJsZU1vZGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVNb2RpZmllciNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVNb2RpZmllciNnZXRWYWx1ZSgpCisJICogQHNlZSAjZ2V0RG91YmxlTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERvdWJsZU1vZGlmaWVyX1ZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVNb2RpZmllciNnZXRPcmlnaW5hbFZhbHVlIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZU1vZGlmaWVyI2dldE9yaWdpbmFsVmFsdWUoKQorCSAqIEBzZWUgI2dldERvdWJsZU1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREb3VibGVNb2RpZmllcl9PcmlnaW5hbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlck1vZGlmaWVyIDxlbT5JbnRlZ2VyIE1vZGlmaWVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkludGVnZXIgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlck1vZGlmaWVyCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRJbnRlZ2VyTW9kaWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJNb2RpZmllciNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyTW9kaWZpZXIjZ2V0VmFsdWUoKQorCSAqIEBzZWUgI2dldEludGVnZXJNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0SW50ZWdlck1vZGlmaWVyX1ZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyTW9kaWZpZXIjZ2V0T3JpZ2luYWxWYWx1ZSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyTW9kaWZpZXIjZ2V0T3JpZ2luYWxWYWx1ZSgpCisJICogQHNlZSAjZ2V0SW50ZWdlck1vZGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRJbnRlZ2VyTW9kaWZpZXJfT3JpZ2luYWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdNb2RpZmllciA8ZW0+TG9uZyBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Mb25nIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0TG9uZ01vZGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nTW9kaWZpZXIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ01vZGlmaWVyI2dldFZhbHVlKCkKKwkgKiBAc2VlICNnZXRMb25nTW9kaWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldExvbmdNb2RpZmllcl9WYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ01vZGlmaWVyI2dldE9yaWdpbmFsVmFsdWUgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ01vZGlmaWVyI2dldE9yaWdpbmFsVmFsdWUoKQorCSAqIEBzZWUgI2dldExvbmdNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0TG9uZ01vZGlmaWVyX09yaWdpbmFsVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZU1vZGlmaWVyIDxlbT5TVEVNIFRpbWUgTW9kaWZpZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U1RFTSBUaW1lIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lTW9kaWZpZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNURU1UaW1lTW9kaWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lTW9kaWZpZXIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+VmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVNb2RpZmllciNnZXRWYWx1ZSgpCisJICogQHNlZSAjZ2V0U1RFTVRpbWVNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U1RFTVRpbWVNb2RpZmllcl9WYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVNb2RpZmllciNnZXRPcmlnaW5hbFZhbHVlIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lTW9kaWZpZXIjZ2V0T3JpZ2luYWxWYWx1ZSgpCisJICogQHNlZSAjZ2V0U1RFTVRpbWVNb2RpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U1RFTVRpbWVNb2RpZmllcl9PcmlnaW5hbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSA8ZW0+VVJJPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5VUkk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJCisJICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVEYXRhVHlwZSBnZXRVUkkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogQGdlbmVyYXRlZAorCSAqLworCU1vZGlmaWVyRmFjdG9yeSBnZXRNb2RpZmllckZhY3RvcnkoKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKwkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorCSAqIDwvdWw+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCWludGVyZmFjZSBMaXRlcmFscyB7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRG91YmxlTk9QTW9kaWZpZXJJbXBsIDxlbT5Eb3VibGUgTk9QIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRG91YmxlTk9QTW9kaWZpZXJJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJQYWNrYWdlSW1wbCNnZXREb3VibGVOT1BNb2RpZmllcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBET1VCTEVfTk9QX01PRElGSUVSID0gZUlOU1RBTkNFLmdldERvdWJsZU5PUE1vZGlmaWVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Eb3VibGVSYW5nZU1vZGlmaWVySW1wbCA8ZW0+RG91YmxlIFJhbmdlIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRG91YmxlUmFuZ2VNb2RpZmllckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldERvdWJsZVJhbmdlTW9kaWZpZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgRE9VQkxFX1JBTkdFX01PRElGSUVSID0gZUlOU1RBTkNFLmdldERvdWJsZVJhbmdlTW9kaWZpZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRE9VQkxFX1JBTkdFX01PRElGSUVSX19TVEFSVF9WQUxVRSA9IGVJTlNUQU5DRS5nZXREb3VibGVSYW5nZU1vZGlmaWVyX1N0YXJ0VmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVuZCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERPVUJMRV9SQU5HRV9NT0RJRklFUl9fRU5EX1ZBTFVFID0gZUlOU1RBTkNFLmdldERvdWJsZVJhbmdlTW9kaWZpZXJfRW5kVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluY3JlbWVudDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERPVUJMRV9SQU5HRV9NT0RJRklFUl9fSU5DUkVNRU5UID0gZUlOU1RBTkNFLmdldERvdWJsZVJhbmdlTW9kaWZpZXJfSW5jcmVtZW50KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRE9VQkxFX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFID0gZUlOU1RBTkNFLmdldERvdWJsZVJhbmdlTW9kaWZpZXJfTmV4dFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcmlnaW5hbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERPVUJMRV9SQU5HRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0RG91YmxlUmFuZ2VNb2RpZmllcl9PcmlnaW5hbFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Eb3VibGVTZXF1ZW5jZU1vZGlmaWVySW1wbCA8ZW0+RG91YmxlIFNlcXVlbmNlIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRG91YmxlU2VxdWVuY2VNb2RpZmllckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldERvdWJsZVNlcXVlbmNlTW9kaWZpZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgRE9VQkxFX1NFUVVFTkNFX01PRElGSUVSID0gZUlOU1RBTkNFLmdldERvdWJsZVNlcXVlbmNlTW9kaWZpZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBET1VCTEVfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFID0gZUlOU1RBTkNFLmdldERvdWJsZVNlcXVlbmNlTW9kaWZpZXJfU2VxdWVuY2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkZlYXR1cmVNb2RpZmllckltcGwgPGVtPkZlYXR1cmUgTW9kaWZpZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5GZWF0dXJlTW9kaWZpZXJJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJQYWNrYWdlSW1wbCNnZXRGZWF0dXJlTW9kaWZpZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgRkVBVFVSRV9NT0RJRklFUiA9IGVJTlNUQU5DRS5nZXRGZWF0dXJlTW9kaWZpZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhcmdldDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEZFQVRVUkVfTU9ESUZJRVJfX1RBUkdFVCA9IGVJTlNUQU5DRS5nZXRGZWF0dXJlTW9kaWZpZXJfVGFyZ2V0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FU3RydWN0dXJhbCBGZWF0dXJlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgRkVBVFVSRV9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRSA9IGVJTlNUQU5DRS5nZXRGZWF0dXJlTW9kaWZpZXJfRVN0cnVjdHVyYWxGZWF0dXJlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBGRUFUVVJFX01PRElGSUVSX19GRUFUVVJFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RmVhdHVyZU1vZGlmaWVyX0ZlYXR1cmVOYW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRkVBVFVSRV9NT0RJRklFUl9fRkVBVFVSRV9JRCA9IGVJTlNUQU5DRS5nZXRGZWF0dXJlTW9kaWZpZXJfRmVhdHVyZUlkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlIFRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBGRUFUVVJFX01PRElGSUVSX19DVVJSRU5UX1ZBTFVFX1RFWFQgPSBlSU5TVEFOQ0UuZ2V0RmVhdHVyZU1vZGlmaWVyX0N1cnJlbnRWYWx1ZVRleHQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRkVBVFVSRV9NT0RJRklFUl9fQ09NUExFVEUgPSBlSU5TVEFOQ0UuZ2V0RmVhdHVyZU1vZGlmaWVyX0NvbXBsZXRlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5JbnRlZ2VyTk9QTW9kaWZpZXJJbXBsIDxlbT5JbnRlZ2VyIE5PUCBNb2RpZmllcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkludGVnZXJOT1BNb2RpZmllckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldEludGVnZXJOT1BNb2RpZmllcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBJTlRFR0VSX05PUF9NT0RJRklFUiA9IGVJTlNUQU5DRS5nZXRJbnRlZ2VyTk9QTW9kaWZpZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkludGVnZXJSYW5nZU1vZGlmaWVySW1wbCA8ZW0+SW50ZWdlciBSYW5nZSBNb2RpZmllcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkludGVnZXJSYW5nZU1vZGlmaWVySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGwjZ2V0SW50ZWdlclJhbmdlTW9kaWZpZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgSU5URUdFUl9SQU5HRV9NT0RJRklFUiA9IGVJTlNUQU5DRS5nZXRJbnRlZ2VyUmFuZ2VNb2RpZmllcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBJTlRFR0VSX1JBTkdFX01PRElGSUVSX19TVEFSVF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRJbnRlZ2VyUmFuZ2VNb2RpZmllcl9TdGFydFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbmQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBJTlRFR0VSX1JBTkdFX01PRElGSUVSX19FTkRfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0SW50ZWdlclJhbmdlTW9kaWZpZXJfRW5kVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluY3JlbWVudDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIElOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX0lOQ1JFTUVOVCA9IGVJTlNUQU5DRS5nZXRJbnRlZ2VyUmFuZ2VNb2RpZmllcl9JbmNyZW1lbnQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5leHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBJTlRFR0VSX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFID0gZUlOU1RBTkNFLmdldEludGVnZXJSYW5nZU1vZGlmaWVyX05leHRWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3JpZ2luYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBJTlRFR0VSX1JBTkdFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRJbnRlZ2VyUmFuZ2VNb2RpZmllcl9PcmlnaW5hbFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5JbnRlZ2VyU2VxdWVuY2VNb2RpZmllckltcGwgPGVtPkludGVnZXIgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5JbnRlZ2VyU2VxdWVuY2VNb2RpZmllckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldEludGVnZXJTZXF1ZW5jZU1vZGlmaWVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIElOVEVHRVJfU0VRVUVOQ0VfTU9ESUZJRVIgPSBlSU5TVEFOQ0UuZ2V0SW50ZWdlclNlcXVlbmNlTW9kaWZpZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBJTlRFR0VSX1NFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRSA9IGVJTlNUQU5DRS5nZXRJbnRlZ2VyU2VxdWVuY2VNb2RpZmllcl9TZXF1ZW5jZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTG9uZ05PUE1vZGlmaWVySW1wbCA8ZW0+TG9uZyBOT1AgTW9kaWZpZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Mb25nTk9QTW9kaWZpZXJJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJQYWNrYWdlSW1wbCNnZXRMb25nTk9QTW9kaWZpZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgTE9OR19OT1BfTU9ESUZJRVIgPSBlSU5TVEFOQ0UuZ2V0TG9uZ05PUE1vZGlmaWVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Mb25nUmFuZ2VNb2RpZmllckltcGwgPGVtPkxvbmcgUmFuZ2UgTW9kaWZpZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Mb25nUmFuZ2VNb2RpZmllckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldExvbmdSYW5nZU1vZGlmaWVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIExPTkdfUkFOR0VfTU9ESUZJRVIgPSBlSU5TVEFOQ0UuZ2V0TG9uZ1JhbmdlTW9kaWZpZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgTE9OR19SQU5HRV9NT0RJRklFUl9fU1RBUlRfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0TG9uZ1JhbmdlTW9kaWZpZXJfU3RhcnRWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW5kIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgTE9OR19SQU5HRV9NT0RJRklFUl9fRU5EX1ZBTFVFID0gZUlOU1RBTkNFLmdldExvbmdSYW5nZU1vZGlmaWVyX0VuZFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmNyZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBMT05HX1JBTkdFX01PRElGSUVSX19JTkNSRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0TG9uZ1JhbmdlTW9kaWZpZXJfSW5jcmVtZW50KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgTE9OR19SQU5HRV9NT0RJRklFUl9fTkVYVF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRMb25nUmFuZ2VNb2RpZmllcl9OZXh0VmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgTE9OR19SQU5HRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0TG9uZ1JhbmdlTW9kaWZpZXJfT3JpZ2luYWxWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTG9uZ1NlcXVlbmNlTW9kaWZpZXJJbXBsIDxlbT5Mb25nIFNlcXVlbmNlIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTG9uZ1NlcXVlbmNlTW9kaWZpZXJJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJQYWNrYWdlSW1wbCNnZXRMb25nU2VxdWVuY2VNb2RpZmllcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBMT05HX1NFUVVFTkNFX01PRElGSUVSID0gZUlOU1RBTkNFLmdldExvbmdTZXF1ZW5jZU1vZGlmaWVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgTE9OR19TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0UgPSBlSU5TVEFOQ0UuZ2V0TG9uZ1NlcXVlbmNlTW9kaWZpZXJfU2VxdWVuY2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVySW1wbCA8ZW0+TW9kaWZpZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldE1vZGlmaWVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIE1PRElGSUVSID0gZUlOU1RBTkNFLmdldE1vZGlmaWVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgTU9ESUZJRVJfX1RBUkdFVF9VUkkgPSBlSU5TVEFOQ0UuZ2V0TW9kaWZpZXJfVGFyZ2V0VVJJKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlIE1vZGlmaWVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgTU9ESUZJRVJfX0ZFQVRVUkVfTU9ESUZJRVJTID0gZUlOU1RBTkNFLmdldE1vZGlmaWVyX0ZlYXR1cmVNb2RpZmllcnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgTU9ESUZJRVJfX0NPTVBMRVRFID0gZUlOU1RBTkNFLmdldE1vZGlmaWVyX0NvbXBsZXRlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5OT1BNb2RpZmllckltcGwgPGVtPk5PUCBNb2RpZmllcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk5PUE1vZGlmaWVySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGwjZ2V0Tk9QTW9kaWZpZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgTk9QX01PRElGSUVSID0gZUlOU1RBTkNFLmdldE5PUE1vZGlmaWVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5SYW5nZU1vZGlmaWVySW1wbCA8ZW0+UmFuZ2UgTW9kaWZpZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5SYW5nZU1vZGlmaWVySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGwjZ2V0UmFuZ2VNb2RpZmllcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBSQU5HRV9NT0RJRklFUiA9IGVJTlNUQU5DRS5nZXRSYW5nZU1vZGlmaWVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TVEVNVGltZU5PUE1vZGlmaWVySW1wbCA8ZW0+U1RFTSBUaW1lIE5PUCBNb2RpZmllcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLlNURU1UaW1lTk9QTW9kaWZpZXJJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJQYWNrYWdlSW1wbCNnZXRTVEVNVGltZU5PUE1vZGlmaWVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNURU1fVElNRV9OT1BfTU9ESUZJRVIgPSBlSU5TVEFOQ0UuZ2V0U1RFTVRpbWVOT1BNb2RpZmllcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU1RFTVRpbWVSYW5nZU1vZGlmaWVySW1wbCA8ZW0+U1RFTSBUaW1lIFJhbmdlIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU1RFTVRpbWVSYW5nZU1vZGlmaWVySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGwjZ2V0U1RFTVRpbWVSYW5nZU1vZGlmaWVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNURU1fVElNRV9SQU5HRV9NT0RJRklFUiA9IGVJTlNUQU5DRS5nZXRTVEVNVGltZVJhbmdlTW9kaWZpZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19TVEFSVF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRTVEVNVGltZVJhbmdlTW9kaWZpZXJfU3RhcnRWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW5kIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19FTkRfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0U1RFTVRpbWVSYW5nZU1vZGlmaWVyX0VuZFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmNyZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfX0lOQ1JFTUVOVCA9IGVJTlNUQU5DRS5nZXRTVEVNVGltZVJhbmdlTW9kaWZpZXJfSW5jcmVtZW50KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFID0gZUlOU1RBTkNFLmdldFNURU1UaW1lUmFuZ2VNb2RpZmllcl9OZXh0VmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRTVEVNVGltZVJhbmdlTW9kaWZpZXJfT3JpZ2luYWxWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVySW1wbCA8ZW0+U1RFTSBUaW1lIFNlcXVlbmNlIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGwjZ2V0U1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNURU1fVElNRV9TRVFVRU5DRV9NT0RJRklFUiA9IGVJTlNUQU5DRS5nZXRTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTVEVNX1RJTUVfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFID0gZUlOU1RBTkNFLmdldFNURU1UaW1lU2VxdWVuY2VNb2RpZmllcl9TZXF1ZW5jZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU2VxdWVuY2VNb2RpZmllckltcGwgPGVtPlNlcXVlbmNlIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU2VxdWVuY2VNb2RpZmllckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldFNlcXVlbmNlTW9kaWZpZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU0VRVUVOQ0VfTU9ESUZJRVIgPSBlSU5TVEFOQ0UuZ2V0U2VxdWVuY2VNb2RpZmllcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRV9TSVpFID0gZUlOU1RBTkNFLmdldFNlcXVlbmNlTW9kaWZpZXJfU2VxdWVuY2VTaXplKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFNlcXVlbmNlIEluZGV4PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0VRVUVOQ0VfTU9ESUZJRVJfX0NVUlJFTlRfU0VRVUVOQ0VfSU5ERVggPSBlSU5TVEFOQ0UuZ2V0U2VxdWVuY2VNb2RpZmllcl9DdXJyZW50U2VxdWVuY2VJbmRleCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNFUVVFTkNFX01PRElGSUVSX19ORVhUX1ZBTFVFID0gZUlOU1RBTkNFLmdldFNlcXVlbmNlTW9kaWZpZXJfTmV4dFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcmlnaW5hbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNFUVVFTkNFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRTZXF1ZW5jZU1vZGlmaWVyX09yaWdpbmFsVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLlN0cmluZ05PUE1vZGlmaWVySW1wbCA8ZW0+U3RyaW5nIE5PUCBNb2RpZmllcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLlN0cmluZ05PUE1vZGlmaWVySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGwjZ2V0U3RyaW5nTk9QTW9kaWZpZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU1RSSU5HX05PUF9NT0RJRklFUiA9IGVJTlNUQU5DRS5nZXRTdHJpbmdOT1BNb2RpZmllcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU3RyaW5nU2VxdWVuY2VNb2RpZmllckltcGwgPGVtPlN0cmluZyBTZXF1ZW5jZSBNb2RpZmllcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLlN0cmluZ1NlcXVlbmNlTW9kaWZpZXJJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJQYWNrYWdlSW1wbCNnZXRTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNUUklOR19TRVFVRU5DRV9NT0RJRklFUiA9IGVJTlNUQU5DRS5nZXRTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU1RSSU5HX1NFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRSA9IGVJTlNUQU5DRS5nZXRTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyX1NlcXVlbmNlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZSA8ZW0+TW9kaWZpYWJsZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJQYWNrYWdlSW1wbCNnZXRNb2RpZmlhYmxlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIE1PRElGSUFCTEUgPSBlSU5TVEFOQ0UuZ2V0TW9kaWZpYWJsZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU2luZ2xlVmFsdWVNb2RpZmllckltcGwgPGVtPlNpbmdsZSBWYWx1ZSBNb2RpZmllcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLlNpbmdsZVZhbHVlTW9kaWZpZXJJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJQYWNrYWdlSW1wbCNnZXRTaW5nbGVWYWx1ZU1vZGlmaWVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNJTkdMRV9WQUxVRV9NT0RJRklFUiA9IGVJTlNUQU5DRS5nZXRTaW5nbGVWYWx1ZU1vZGlmaWVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Eb3VibGVNb2RpZmllckltcGwgPGVtPkRvdWJsZSBNb2RpZmllcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkRvdWJsZU1vZGlmaWVySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGwjZ2V0RG91YmxlTW9kaWZpZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgRE9VQkxFX01PRElGSUVSID0gZUlOU1RBTkNFLmdldERvdWJsZU1vZGlmaWVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERPVUJMRV9NT0RJRklFUl9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0RG91YmxlTW9kaWZpZXJfVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRE9VQkxFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXREb3VibGVNb2RpZmllcl9PcmlnaW5hbFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5JbnRlZ2VyTW9kaWZpZXJJbXBsIDxlbT5JbnRlZ2VyIE1vZGlmaWVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuSW50ZWdlck1vZGlmaWVySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGwjZ2V0SW50ZWdlck1vZGlmaWVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIElOVEVHRVJfTU9ESUZJRVIgPSBlSU5TVEFOQ0UuZ2V0SW50ZWdlck1vZGlmaWVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIElOVEVHRVJfTU9ESUZJRVJfX1ZBTFVFID0gZUlOU1RBTkNFLmdldEludGVnZXJNb2RpZmllcl9WYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3JpZ2luYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBJTlRFR0VSX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRJbnRlZ2VyTW9kaWZpZXJfT3JpZ2luYWxWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTG9uZ01vZGlmaWVySW1wbCA8ZW0+TG9uZyBNb2RpZmllcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkxvbmdNb2RpZmllckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldExvbmdNb2RpZmllcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBMT05HX01PRElGSUVSID0gZUlOU1RBTkNFLmdldExvbmdNb2RpZmllcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBMT05HX01PRElGSUVSX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRMb25nTW9kaWZpZXJfVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgTE9OR19NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0TG9uZ01vZGlmaWVyX09yaWdpbmFsVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLlNURU1UaW1lTW9kaWZpZXJJbXBsIDxlbT5TVEVNIFRpbWUgTW9kaWZpZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TVEVNVGltZU1vZGlmaWVySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGwjZ2V0U1RFTVRpbWVNb2RpZmllcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTVEVNX1RJTUVfTU9ESUZJRVIgPSBlSU5TVEFOQ0UuZ2V0U1RFTVRpbWVNb2RpZmllcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTVEVNX1RJTUVfTU9ESUZJRVJfX1ZBTFVFID0gZUlOU1RBTkNFLmdldFNURU1UaW1lTW9kaWZpZXJfVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU1RFTV9USU1FX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRTVEVNVGltZU1vZGlmaWVyX09yaWdpbmFsVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlVSSTwvZW0+JyBkYXRhIHR5cGUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsI2dldFVSSSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVEYXRhVHlwZSBVUkkgPSBlSU5TVEFOQ0UuZ2V0VVJJKCk7CisKKwl9CisKK30gLy9Nb2RpZmllclBhY2thZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL05PUE1vZGlmaWVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9OT1BNb2RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTFkZTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9OT1BNb2RpZmllci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8vIE5PUE1vZGlmaWVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBBIDxjb2RlPk5PUE1vZGlmaWVyPC9jb2RlPiBkb2VzIG5vdGhpbmcuIEl0IGlzIHVzZWZ1bCBmb3IgdGhlIEdVSQorICogY29tcG9uZW50cyB0aGF0IGVkaXQge0BsaW5rIEZlYXR1cmVNb2RpZmllcn1zIHRvIGhhdmUgb25lIHRoYXQgaXMgYXZhaWxhYmxlCisgKiBmb3IgdGhlIGNhc2Ugd2hlbiBubyB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyfSBpcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIE5PUE1vZGlmaWVyIGV4dGVuZHMgRmVhdHVyZU1vZGlmaWVyIHsKKwkvLyBOb3RoaW5nCit9IC8vIE5PUE1vZGlmaWVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9SYW5nZU1vZGlmaWVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9SYW5nZU1vZGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJkMzM4YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL1JhbmdlTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDI5IEBACisvLyBSYW5nZU1vZGlmaWVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CisKKy8qKgorICogQSA8Y29kZT5SYW5nZU1vZGlmaWVyPC9jb2RlPiBtb2RpZmllcyB0aGUgdmFsdWUgb2YgYSBudW1lcmljCisgKiB7QGxpbmsgRVN0cnVjdHVyYWxGZWF0dXJlfSBvdmVyIGEgc3BlY2lmaWMgcmFuZ2Ugb2YgdmFsdWVzLiBBCisgKiA8Y29kZT5SYW5nZU1vZGlmaWVyPC9jb2RlPiBzcGVjaWZpZXMgYSBzdGFydGluZyB2YWx1ZSwgYW4gZW5kaW5nIHZhbHVlIGFuZCBhbgorICogaW5jcmVtZW50LiBUaGUgaW5jcmVtZW50IGlzIHN1Y2Nlc3NpdmVseSBhcHBsaWVkIHRvIHRoZSBzdGFydGluZyB2YWx1ZSB1bnRpbAorICogdGhlIHJlc3VsdCBleGNlZWRzIHRoZSBlbmQgdmFsdWUuIElmIHRoZSBpbmNyZW1lbnQgaXMgbmVnYXRpdmUsIHRoZSBlbmQgdmFsdWUKKyAqIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBzdGFydGluZyB2YWx1ZS4KKyAqIAorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICovCitwdWJsaWMgaW50ZXJmYWNlIFJhbmdlTW9kaWZpZXIgZXh0ZW5kcyBGZWF0dXJlTW9kaWZpZXIgeworCS8vIE5vdGhpbmcKK30gLy8gUmFuZ2VNb2RpZmllcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvU1RFTVRpbWVNb2RpZmllci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvU1RFTVRpbWVNb2RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOTE1YzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9TVEVNVGltZU1vZGlmaWVyLmphdmEKQEAgLTAsMCArMSw4NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNURU0gVGltZSBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVNb2RpZmllciNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZU1vZGlmaWVyI2dldE9yaWdpbmFsVmFsdWUgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlI2dldFNURU1UaW1lTW9kaWZpZXIoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU1RFTVRpbWVNb2RpZmllciBleHRlbmRzIFNpbmdsZVZhbHVlTW9kaWZpZXIgeworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRWYWx1ZShTVEVNVGltZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2UjZ2V0U1RFTVRpbWVNb2RpZmllcl9WYWx1ZSgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCVNURU1UaW1lIGdldFZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVNb2RpZmllciNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VmFsdWUoU1RFTVRpbWUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JpZ2luYWwgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRPcmlnaW5hbFZhbHVlKFNURU1UaW1lKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZSNnZXRTVEVNVGltZU1vZGlmaWVyX09yaWdpbmFsVmFsdWUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTVEVNVGltZSBnZXRPcmlnaW5hbFZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVNb2RpZmllciNnZXRPcmlnaW5hbFZhbHVlIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE9yaWdpbmFsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE9yaWdpbmFsVmFsdWUoU1RFTVRpbWUgdmFsdWUpOworfSAvLyBTVEVNVGltZU1vZGlmaWVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9TVEVNVGltZU5PUE1vZGlmaWVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9TVEVNVGltZU5PUE1vZGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE5ZmY1NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL1NURU1UaW1lTk9QTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDI0IEBACisvLyBTVEVNVGltZU5PUE1vZGlmaWVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBBIDxjb2RlPk5PUE1vZGlmaWVyPC9jb2RlPiBkb2VzIG5vdGhpbmcuIEl0IGlzIHVzZWZ1bCBmb3IgdGhlIEdVSQorICogY29tcG9uZW50cyB0aGF0IGVkaXQge0BsaW5rIEZlYXR1cmVNb2RpZmllcn1zIHRvIGhhdmUgb25lIHRoYXQgaXMgYXZhaWxhYmxlCisgKiBmb3IgdGhlIGNhc2Ugd2hlbiBubyB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyfSBpcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNURU1UaW1lTk9QTW9kaWZpZXIgZXh0ZW5kcyBOT1BNb2RpZmllciB7CisJLy8gTm90aGluZworfSAvLyBTVEVNVGltZU5PUE1vZGlmaWVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvU1RFTVRpbWVSYW5nZU1vZGlmaWVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9TVEVNVGltZVJhbmdlTW9kaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzg0MjdmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvU1RFTVRpbWVSYW5nZU1vZGlmaWVyLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLy8gU1RFTVRpbWVSYW5nZU1vZGlmaWVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKKworLyoqCisgKiBBIDxjb2RlPlNURU1UaW1lUmFuZ2VNb2RpZmllcjwvY29kZT4gbW9kaWZpZXMgYW4ge0BsaW5rIFNURU1UaW1lfSB2YWx1ZWQKKyAqIGZlYXR1cmUgZnJvbSBhIHN0YXJ0aW5nIHZhbHVlIHRvIGFuZCBlbmQgdmFsdWUgKGluY2x1c2l2ZT4gYnkgaW5jcmVtZW50cy4KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU1RFTVRpbWVSYW5nZU1vZGlmaWVyIGV4dGVuZHMgUmFuZ2VNb2RpZmllciB7CisJCisJLyoqCisJICogQG1vZGVsCisJICovCisJU1RFTVRpbWUgZ2V0T3JpZ2luYWxWYWx1ZSgpOworCQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZVJhbmdlTW9kaWZpZXIjZ2V0T3JpZ2luYWxWYWx1ZSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRPcmlnaW5hbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRPcmlnaW5hbFZhbHVlKFNURU1UaW1lIHZhbHVlKTsKKworCS8qKgorCSAqIEBtb2RlbAorCSAqLworCVNURU1UaW1lIGdldFN0YXJ0VmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZVJhbmdlTW9kaWZpZXIjZ2V0U3RhcnRWYWx1ZSA8ZW0+U3RhcnQgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBWYWx1ZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0U3RhcnRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U3RhcnRWYWx1ZShTVEVNVGltZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBAbW9kZWwKKwkgKi8KKwlTVEVNVGltZSBnZXRFbmRWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lUmFuZ2VNb2RpZmllciNnZXRFbmRWYWx1ZSA8ZW0+RW5kIFZhbHVlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW5kIFZhbHVlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRFbmRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RW5kVmFsdWUoU1RFTVRpbWUgdmFsdWUpOworCisJLyoqCisJICogQG1vZGVsCisJICovCisJbG9uZyBnZXRJbmNyZW1lbnQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZVJhbmdlTW9kaWZpZXIjZ2V0SW5jcmVtZW50IDxlbT5JbmNyZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmNyZW1lbnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEluY3JlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SW5jcmVtZW50KGxvbmcgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgbmV4dCB2YWx1ZSBvZiB0aGUgZmVhdHVyZQorCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIgorCSAqLworCVNURU1UaW1lIGdldE5leHRWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lUmFuZ2VNb2RpZmllciNnZXROZXh0VmFsdWUgPGVtPk5leHQgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5leHQgVmFsdWU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE5leHRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TmV4dFZhbHVlKFNURU1UaW1lIHZhbHVlKTsKKworfSAvLyBTVEVNVGltZVJhbmdlTW9kaWZpZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL1NURU1UaW1lU2VxdWVuY2VNb2RpZmllci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2NDZhZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL1NURU1UaW1lU2VxdWVuY2VNb2RpZmllci5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8vIFNURU1UaW1lU2VxdWVuY2VNb2RpZmllci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworCisvKioKKyAqIEEge0BsaW5rIFNURU1UaW1lU2VxdWVuY2VNb2RpZmllcn0gbW9kaWZpZXMgYSBmZWF0dXJlIGJ5IHNldHRpbmcgaXQgdG8gYQorICogc2VxdWVuY2Ugb2YgIlNURU1UaW1lIiB2YWx1ZXMuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNURU1UaW1lU2VxdWVuY2VNb2RpZmllciBleHRlbmRzIFNlcXVlbmNlTW9kaWZpZXIgeworCS8qKgorCSAqIEBtb2RlbAorCSAqLworCUVMaXN0PFNURU1UaW1lPiBnZXRTZXF1ZW5jZSgpOworfSAvLyBTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL1NlcXVlbmNlTW9kaWZpZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL1NlcXVlbmNlTW9kaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2YwZjRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvU2VxdWVuY2VNb2RpZmllci5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8vIFNlcXVlbmNlTW9kaWZpZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKgorICogQSB7QGxpbmsgU2VxdWVuY2VNb2RpZmllcn0gbW9kaWZpZXMgYSBmZWF0dXJlIGJ5IHNldHRpbmcgaXQgdG8gYQorICogc2VxdWVuY2Ugb2Ygc3BlY2lmaWMgdmFsdWVzLgorICogCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2VxdWVuY2VNb2RpZmllciBleHRlbmRzIEZlYXR1cmVNb2RpZmllciB7CisJCisJLyoqCisJICogQG1vZGVsCisJICovCisJT2JqZWN0IGdldE9yaWdpbmFsVmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TZXF1ZW5jZU1vZGlmaWVyI2dldE9yaWdpbmFsVmFsdWUgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0T3JpZ2luYWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0T3JpZ2luYWxWYWx1ZShPYmplY3QgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNvbGxlY3Rpb24gb2YgdmFsdWVzLgorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwlpbnQgZ2V0U2VxdWVuY2VTaXplKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2UKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMCIKKwkgKi8KKwlpbnQgZ2V0Q3VycmVudFNlcXVlbmNlSW5kZXgoKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2VxdWVuY2VNb2RpZmllciNnZXRDdXJyZW50U2VxdWVuY2VJbmRleCA8ZW0+Q3VycmVudCBTZXF1ZW5jZSBJbmRleDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VycmVudCBTZXF1ZW5jZSBJbmRleDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0Q3VycmVudFNlcXVlbmNlSW5kZXgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEN1cnJlbnRTZXF1ZW5jZUluZGV4KGludCB2YWx1ZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBzZXF1ZW5jZQorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJ0cnVlIgorCSAqLworCU9iamVjdCBnZXROZXh0VmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNlcXVlbmNlTW9kaWZpZXIjZ2V0TmV4dFZhbHVlIDxlbT5OZXh0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OZXh0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogQHNlZSAjZ2V0TmV4dFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1NldE5leHRWYWx1ZSgpOworfSAvLyBTZXF1ZW5jZU1vZGlmaWVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9TaW5nbGVWYWx1ZU1vZGlmaWVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9TaW5nbGVWYWx1ZU1vZGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyZjI5YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL1NpbmdsZVZhbHVlTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEEgc3BlY2lhbCBjYXNlIG9mIFJhbmdlIE1vZGlmaWVyIHdoZXJlIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlIGFyZSB0aGUgc2FtZQorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZSNnZXRTaW5nbGVWYWx1ZU1vZGlmaWVyKCkKKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBTaW5nbGVWYWx1ZU1vZGlmaWVyIGV4dGVuZHMgRmVhdHVyZU1vZGlmaWVyIHsKK30gLy8gU2luZ2xlVmFsdWVNb2RpZmllcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvU3RyaW5nTk9QTW9kaWZpZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL1N0cmluZ05PUE1vZGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYzMDk3NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL1N0cmluZ05PUE1vZGlmaWVyLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLy8gU3RyaW5nTk9QTW9kaWZpZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEEgPGNvZGU+Tk9QTW9kaWZpZXI8L2NvZGU+IGRvZXMgbm90aGluZy4gSXQgaXMgdXNlZnVsIGZvciB0aGUgR1VJCisgKiBjb21wb25lbnRzIHRoYXQgZWRpdCB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyfXMgdG8gaGF2ZSBvbmUgdGhhdCBpcyBhdmFpbGFibGUKKyAqIGZvciB0aGUgY2FzZSB3aGVuIG5vIHtAbGluayBGZWF0dXJlTW9kaWZpZXJ9IGlzIHNwZWNpZmllZCBieSB0aGUgdXNlci4KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3RyaW5nTk9QTW9kaWZpZXIgZXh0ZW5kcyBOT1BNb2RpZmllciB7CisJLy8gTm90aGluZworfSAvLyBTdHJpbmdOT1BNb2RpZmllcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvU3RyaW5nU2VxdWVuY2VNb2RpZmllci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvU3RyaW5nU2VxdWVuY2VNb2RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NzlkMjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9TdHJpbmdTZXF1ZW5jZU1vZGlmaWVyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLy8gU3RyaW5nU2VxdWVuY2VNb2RpZmllci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKKy8qKgorICogQSB7QGxpbmsgU3RyaW5nU2VxdWVuY2VNb2RpZmllcn0gbW9kaWZpZXMgYSBmZWF0dXJlIGJ5IHNldHRpbmcgaXQgdG8gYQorICogc2VxdWVuY2Ugb2YgIlN0cmluZyIgdmFsdWVzLgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyIGV4dGVuZHMgU2VxdWVuY2VNb2RpZmllciB7CisJLyoqCisJICogQG1vZGVsCisJICovCisJRUxpc3Q8U3RyaW5nPiBnZXRTZXF1ZW5jZSgpOworfSAvLyBTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL0RvdWJsZU1vZGlmaWVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9Eb3VibGVNb2RpZmllckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDEzYWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9Eb3VibGVNb2RpZmllckltcGwuamF2YQpAQCAtMCwwICsxLDI1NiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RG91YmxlIE1vZGlmaWVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Eb3VibGVNb2RpZmllckltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Eb3VibGVNb2RpZmllckltcGwjZ2V0T3JpZ2luYWxWYWx1ZSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEb3VibGVNb2RpZmllckltcGwgZXh0ZW5kcyBTaW5nbGVWYWx1ZU1vZGlmaWVySW1wbCBpbXBsZW1lbnRzIERvdWJsZU1vZGlmaWVyIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBWQUxVRV9FREVGQVVMVCA9IDAuMDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmlnaW5hbFZhbHVlKCkgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPcmlnaW5hbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBPUklHSU5BTF9WQUxVRV9FREVGQVVMVCA9IDAuMDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmlnaW5hbFZhbHVlKCkgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPcmlnaW5hbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIG9yaWdpbmFsVmFsdWUgPSBPUklHSU5BTF9WQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEb3VibGVNb2RpZmllckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuRE9VQkxFX01PRElGSUVSOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShkb3VibGUgbmV3VmFsdWUpIHsKKwkJZG91YmxlIG9sZFZhbHVlID0gdmFsdWU7CisJCXZhbHVlID0gbmV3VmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfTU9ESUZJRVJfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE9yaWdpbmFsVmFsdWUoKSB7CisJCXJldHVybiBvcmlnaW5hbFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE9yaWdpbmFsVmFsdWUoZG91YmxlIG5ld09yaWdpbmFsVmFsdWUpIHsKKwkJZG91YmxlIG9sZE9yaWdpbmFsVmFsdWUgPSBvcmlnaW5hbFZhbHVlOworCQlvcmlnaW5hbFZhbHVlID0gbmV3T3JpZ2luYWxWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUsIG9sZE9yaWdpbmFsVmFsdWUsIG9yaWdpbmFsVmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfTU9ESUZJRVJfX1ZBTFVFOgorCQkJCXJldHVybiBnZXRWYWx1ZSgpOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRE9VQkxFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0T3JpZ2luYWxWYWx1ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfTU9ESUZJRVJfX1ZBTFVFOgorCQkJCXNldFZhbHVlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUU6CisJCQkJc2V0T3JpZ2luYWxWYWx1ZSgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRE9VQkxFX01PRElGSUVSX19WQUxVRToKKwkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRE9VQkxFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRToKKwkJCQlzZXRPcmlnaW5hbFZhbHVlKE9SSUdJTkFMX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9NT0RJRklFUl9fVkFMVUU6CisJCQkJcmV0dXJuIHZhbHVlICE9IFZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRE9VQkxFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRToKKwkJCQlyZXR1cm4gb3JpZ2luYWxWYWx1ZSAhPSBPUklHSU5BTF9WQUxVRV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5GZWF0dXJlTW9kaWZpZXJJbXBsI3VwZGF0ZUZlYXR1cmUoKQorCSAqLworCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZUZlYXR1cmUoKSB7CisJCS8vIE9yaWdpbmFsIHZhbHVlIGNhcHR1cmVkIHlldD8KKwkJaWYgKCFlSXNTZXQoTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUpKSB7CisJCQkvLyBObworCQkJc2V0T3JpZ2luYWxWYWx1ZSgoRG91YmxlKXRhcmdldC5lR2V0KGdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpKSk7CisJCX0gLy8gaWYKKwkJdGFyZ2V0LmVTZXQoZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCksIGdldFZhbHVlKCkpOworCQljb21wbGV0ZSA9IHRydWU7CisJfSAvLyB1cGRhdGVGZWF0dXJlCisKKwkKKwkvKioKKwkgKnJlc2V0CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCWNvbXBsZXRlID0gZmFsc2U7CisJCXRhcmdldC5lU2V0KGdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLCBnZXRPcmlnaW5hbFZhbHVlKCkpOworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gY29tcGxldGUgPSBmYWxzZTsKKwkvKioKKwkgKiBpc0NvbXBsZXRlCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIGNvbXBsZXRlOworCX0KKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQodmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIG9yaWdpbmFsVmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQob3JpZ2luYWxWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0RvdWJsZU1vZGlmaWVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9Eb3VibGVOT1BNb2RpZmllckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvRG91YmxlTk9QTW9kaWZpZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5OGE0MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvRG91YmxlTk9QTW9kaWZpZXJJbXBsLmphdmEKQEAgLTAsMCArMSw0NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVOT1BNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RG91YmxlIE5PUCBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIERvdWJsZU5PUE1vZGlmaWVySW1wbCBleHRlbmRzIE5PUE1vZGlmaWVySW1wbCBpbXBsZW1lbnRzIERvdWJsZU5PUE1vZGlmaWVyIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRG91YmxlTk9QTW9kaWZpZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLkRPVUJMRV9OT1BfTU9ESUZJRVI7CisJfQorCit9IC8vIERvdWJsZU5PUE1vZGlmaWVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9Eb3VibGVSYW5nZU1vZGlmaWVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9Eb3VibGVSYW5nZU1vZGlmaWVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNDE1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL0RvdWJsZVJhbmdlTW9kaWZpZXJJbXBsLmphdmEKQEAgLTAsMCArMSw0MjQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZVJhbmdlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RG91YmxlIFJhbmdlIE1vZGlmaWVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Eb3VibGVSYW5nZU1vZGlmaWVySW1wbCNnZXRTdGFydFZhbHVlIDxlbT5TdGFydCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRG91YmxlUmFuZ2VNb2RpZmllckltcGwjZ2V0RW5kVmFsdWUgPGVtPkVuZCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRG91YmxlUmFuZ2VNb2RpZmllckltcGwjZ2V0SW5jcmVtZW50IDxlbT5JbmNyZW1lbnQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkRvdWJsZVJhbmdlTW9kaWZpZXJJbXBsI2dldE5leHRWYWx1ZSA8ZW0+TmV4dCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRG91YmxlUmFuZ2VNb2RpZmllckltcGwjZ2V0T3JpZ2luYWxWYWx1ZSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQorcHVibGljIGNsYXNzIERvdWJsZVJhbmdlTW9kaWZpZXJJbXBsIGV4dGVuZHMgUmFuZ2VNb2RpZmllckltcGwgaW1wbGVtZW50cworCQlEb3VibGVSYW5nZU1vZGlmaWVyIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnRWYWx1ZSgpIDxlbT5TdGFydCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFN0YXJ0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFNUQVJUX1ZBTFVFX0VERUZBVUxUID0gLTkuOTk5OTk5OUU3OworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0VmFsdWUoKSA8ZW0+U3RhcnQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTdGFydFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIHN0YXJ0VmFsdWUgPSBTVEFSVF9WQUxVRV9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5kVmFsdWUoKSA8ZW0+RW5kIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RW5kVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIEVORF9WQUxVRV9FREVGQVVMVCA9IC05Ljk5OTk5OTlFNzsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmRWYWx1ZSgpIDxlbT5FbmQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFbmRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBlbmRWYWx1ZSA9IEVORF9WQUxVRV9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5jcmVtZW50KCkgPGVtPkluY3JlbWVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEluY3JlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgSU5DUkVNRU5UX0VERUZBVUxUID0gLTkuOTk5OTk5OUU3OworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY3JlbWVudCgpIDxlbT5JbmNyZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbmNyZW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgaW5jcmVtZW50ID0gSU5DUkVNRU5UX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5leHRWYWx1ZSgpIDxlbT5OZXh0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROZXh0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIE5FWFRfVkFMVUVfRURFRkFVTFQgPSAwLjA7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmV4dFZhbHVlKCkgPGVtPk5leHQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5leHRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBuZXh0VmFsdWUgPSBORVhUX1ZBTFVFX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmlnaW5hbFZhbHVlKCkgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPcmlnaW5hbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBPUklHSU5BTF9WQUxVRV9FREVGQVVMVCA9IDAuMDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmlnaW5hbFZhbHVlKCkgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPcmlnaW5hbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIG9yaWdpbmFsVmFsdWUgPSBPUklHSU5BTF9WQUxVRV9FREVGQVVMVDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIERvdWJsZVJhbmdlTW9kaWZpZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIE1vZGlmaWVyUGFja2FnZS5MaXRlcmFscy5ET1VCTEVfUkFOR0VfTU9ESUZJRVI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0U3RhcnRWYWx1ZSgpIHsKKwkJcmV0dXJuIHN0YXJ0VmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0YXJ0VmFsdWUoZG91YmxlIG5ld1N0YXJ0VmFsdWUpIHsKKwkJZG91YmxlIG9sZFN0YXJ0VmFsdWUgPSBzdGFydFZhbHVlOworCQlzdGFydFZhbHVlID0gbmV3U3RhcnRWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9SQU5HRV9NT0RJRklFUl9fU1RBUlRfVkFMVUUsIG9sZFN0YXJ0VmFsdWUsIHN0YXJ0VmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRFbmRWYWx1ZSgpIHsKKwkJcmV0dXJuIGVuZFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFbmRWYWx1ZShkb3VibGUgbmV3RW5kVmFsdWUpIHsKKwkJZG91YmxlIG9sZEVuZFZhbHVlID0gZW5kVmFsdWU7CisJCWVuZFZhbHVlID0gbmV3RW5kVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfUkFOR0VfTU9ESUZJRVJfX0VORF9WQUxVRSwgb2xkRW5kVmFsdWUsIGVuZFZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0SW5jcmVtZW50KCkgeworCQlyZXR1cm4gaW5jcmVtZW50OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbmNyZW1lbnQoZG91YmxlIG5ld0luY3JlbWVudCkgeworCQlkb3VibGUgb2xkSW5jcmVtZW50ID0gaW5jcmVtZW50OworCQlpbmNyZW1lbnQgPSBuZXdJbmNyZW1lbnQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfUkFOR0VfTU9ESUZJRVJfX0lOQ1JFTUVOVCwgb2xkSW5jcmVtZW50LCBpbmNyZW1lbnQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIGRvdWJsZSBnZXROZXh0VmFsdWUoKSB7CisJCS8vIFVuc2V0PworCQlpZiAoIWVJc1NldChNb2RpZmllclBhY2thZ2UuRE9VQkxFX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFKSkgeworCQkJLy8gWWVzCisJCQluZXh0VmFsdWUgPSBzdGFydFZhbHVlOworCQl9IC8vIGlmCisJCQorCQlmaW5hbCBkb3VibGUgcmV0VmFsdWUgPSBuZXh0VmFsdWU7CisJCQorCQljb21wbGV0ZSA9IChpbmNyZW1lbnQgPCAwLjApPyAocmV0VmFsdWUgPD0gZW5kVmFsdWUpOihyZXRWYWx1ZSA+PSBlbmRWYWx1ZSk7IAorCQkKKwkJLy8gU3RpbGwgaW5jcmVtZW50aW5nPworCQlpZiAoIWNvbXBsZXRlKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIGRvdWJsZSB0ZW1wID0gcmV0VmFsdWUgKyBpbmNyZW1lbnQ7CisJCQkvLyBXb3VsZCB0aGUgbmV3IGN1cnJlbnRWYWx1ZSBiZSBlcXVhbCBvciAicGFzdCIgdGhlIGVuZFZhbHVlPworCQkJaWYgKChpbmNyZW1lbnQgPj0gMCAmJiB0ZW1wIDwgZW5kVmFsdWUpIHx8IChpbmNyZW1lbnQgPCAwICYmIHRlbXAgPiBlbmRWYWx1ZSkpIHsKKwkJCQkvLyBObworCQkJCW5leHRWYWx1ZSA9IHRlbXA7CisJCQl9IC8vIGlmCisJCQllbHNlIHsKKwkJCQkvLyBZZXMKKwkJCQluZXh0VmFsdWUgPSBlbmRWYWx1ZTsKKwkJCX0gLy8gZWxzZSAKKwkJfSAvLyBpZiAKKwkJY3VycmVudFZhbHVlVGV4dCA9IERvdWJsZS50b1N0cmluZyhyZXRWYWx1ZSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldE5leHRWYWx1ZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TmV4dFZhbHVlKGRvdWJsZSBuZXdOZXh0VmFsdWUpIHsKKwkJZG91YmxlIG9sZE5leHRWYWx1ZSA9IG5leHRWYWx1ZTsKKwkJbmV4dFZhbHVlID0gbmV3TmV4dFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RpZmllclBhY2thZ2UuRE9VQkxFX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFLCBvbGROZXh0VmFsdWUsIG5leHRWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0T3JpZ2luYWxWYWx1ZSgpIHsKKwkJcmV0dXJuIG9yaWdpbmFsVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0T3JpZ2luYWxWYWx1ZShkb3VibGUgbmV3T3JpZ2luYWxWYWx1ZSkgeworCQlkb3VibGUgb2xkT3JpZ2luYWxWYWx1ZSA9IG9yaWdpbmFsVmFsdWU7CisJCW9yaWdpbmFsVmFsdWUgPSBuZXdPcmlnaW5hbFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RpZmllclBhY2thZ2UuRE9VQkxFX1JBTkdFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSwgb2xkT3JpZ2luYWxWYWx1ZSwgb3JpZ2luYWxWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRmVhdHVyZU1vZGlmaWVySW1wbCN1cGRhdGVGZWF0dXJlKCkKKwkgKi8KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGVGZWF0dXJlKCkgeworCQkvLyBPcmlnaW5hbCB2YWx1ZSBjYXB0dXJlZCB5ZXQ/CisJCWlmICghZUlzU2V0KE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfUkFOR0VfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFKSkgeworCQkJLy8gTm8KKwkJCXNldE9yaWdpbmFsVmFsdWUoKERvdWJsZSl0YXJnZXQuZUdldChnZXRFU3RydWN0dXJhbEZlYXR1cmUoKSkpOworCQl9IC8vIGlmCisJCXRhcmdldC5lU2V0KGdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLCBnZXROZXh0VmFsdWUoKSk7CisJfSAvLyB1cGRhdGVGZWF0dXJlCisKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLlJhbmdlTW9kaWZpZXJJbXBsI3Jlc2V0KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJc3VwZXIucmVzZXQoKTsKKwkJZVVuc2V0KE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfUkFOR0VfTU9ESUZJRVJfX05FWFRfVkFMVUUpOworCQl0YXJnZXQuZVNldChnZXRFU3RydWN0dXJhbEZlYXR1cmUoKSwgZ2V0T3JpZ2luYWxWYWx1ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRE9VQkxFX1JBTkdFX01PRElGSUVSX19TVEFSVF9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0U3RhcnRWYWx1ZSgpOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRE9VQkxFX1JBTkdFX01PRElGSUVSX19FTkRfVkFMVUU6CisJCQkJcmV0dXJuIGdldEVuZFZhbHVlKCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfUkFOR0VfTU9ESUZJRVJfX0lOQ1JFTUVOVDoKKwkJCQlyZXR1cm4gZ2V0SW5jcmVtZW50KCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfUkFOR0VfTU9ESUZJRVJfX05FWFRfVkFMVUU6CisJCQkJcmV0dXJuIGdldE5leHRWYWx1ZSgpOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRE9VQkxFX1JBTkdFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0T3JpZ2luYWxWYWx1ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRE9VQkxFX1JBTkdFX01PRElGSUVSX19TVEFSVF9WQUxVRToKKwkJCQlzZXRTdGFydFZhbHVlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9SQU5HRV9NT0RJRklFUl9fRU5EX1ZBTFVFOgorCQkJCXNldEVuZFZhbHVlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9SQU5HRV9NT0RJRklFUl9fSU5DUkVNRU5UOgorCQkJCXNldEluY3JlbWVudCgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfUkFOR0VfTU9ESUZJRVJfX05FWFRfVkFMVUU6CisJCQkJc2V0TmV4dFZhbHVlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9SQU5HRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUU6CisJCQkJc2V0T3JpZ2luYWxWYWx1ZSgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9SQU5HRV9NT0RJRklFUl9fU1RBUlRfVkFMVUU6CisJCQkJc2V0U3RhcnRWYWx1ZShTVEFSVF9WQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRE9VQkxFX1JBTkdFX01PRElGSUVSX19FTkRfVkFMVUU6CisJCQkJc2V0RW5kVmFsdWUoRU5EX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfUkFOR0VfTU9ESUZJRVJfX0lOQ1JFTUVOVDoKKwkJCQlzZXRJbmNyZW1lbnQoSU5DUkVNRU5UX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfUkFOR0VfTU9ESUZJRVJfX05FWFRfVkFMVUU6CisJCQkJc2V0TmV4dFZhbHVlKE5FWFRfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9SQU5HRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUU6CisJCQkJc2V0T3JpZ2luYWxWYWx1ZShPUklHSU5BTF9WQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRE9VQkxFX1JBTkdFX01PRElGSUVSX19TVEFSVF9WQUxVRToKKwkJCQlyZXR1cm4gc3RhcnRWYWx1ZSAhPSBTVEFSVF9WQUxVRV9FREVGQVVMVDsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9SQU5HRV9NT0RJRklFUl9fRU5EX1ZBTFVFOgorCQkJCXJldHVybiBlbmRWYWx1ZSAhPSBFTkRfVkFMVUVfRURFRkFVTFQ7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfUkFOR0VfTU9ESUZJRVJfX0lOQ1JFTUVOVDoKKwkJCQlyZXR1cm4gaW5jcmVtZW50ICE9IElOQ1JFTUVOVF9FREVGQVVMVDsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9SQU5HRV9NT0RJRklFUl9fTkVYVF9WQUxVRToKKwkJCQlyZXR1cm4gbmV4dFZhbHVlICE9IE5FWFRfVkFMVUVfRURFRkFVTFQ7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfUkFOR0VfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFOgorCQkJCXJldHVybiBvcmlnaW5hbFZhbHVlICE9IE9SSUdJTkFMX1ZBTFVFX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHN0YXJ0VmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoc3RhcnRWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgZW5kVmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZW5kVmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGluY3JlbWVudDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpbmNyZW1lbnQpOworCQlyZXN1bHQuYXBwZW5kKCIsIG5leHRWYWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChuZXh0VmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIG9yaWdpbmFsVmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQob3JpZ2luYWxWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyI3NhbmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5zYW5lKCk7CisJCWFzc2VydCByZXRWYWx1ZTsKKworCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIChlbmRWYWx1ZSA+PSBzdGFydFZhbHVlKTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgKGluY3JlbWVudCA+IDAuMCk7CisJCWFzc2VydCByZXRWYWx1ZTsKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBzYW5lCisKK30gLy8gRG91YmxlUmFuZ2VNb2RpZmllckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvRG91YmxlU2VxdWVuY2VNb2RpZmllckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvRG91YmxlU2VxdWVuY2VNb2RpZmllckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDEwOGM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9Eb3VibGVTZXF1ZW5jZU1vZGlmaWVySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTk0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZVNlcXVlbmNlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvdWJsZSBTZXF1ZW5jZSBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRG91YmxlU2VxdWVuY2VNb2RpZmllckltcGwjZ2V0U2VxdWVuY2UgPGVtPlNlcXVlbmNlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRG91YmxlU2VxdWVuY2VNb2RpZmllckltcGwgZXh0ZW5kcyBTZXF1ZW5jZU1vZGlmaWVySW1wbCBpbXBsZW1lbnRzIERvdWJsZVNlcXVlbmNlTW9kaWZpZXIgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcXVlbmNlKCkgPGVtPlNlcXVlbmNlPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNlcXVlbmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8RG91YmxlPiBzZXF1ZW5jZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEb3VibGVTZXF1ZW5jZU1vZGlmaWVySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIE1vZGlmaWVyUGFja2FnZS5MaXRlcmFscy5ET1VCTEVfU0VRVUVOQ0VfTU9ESUZJRVI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PERvdWJsZT4gZ2V0U2VxdWVuY2UoKSB7CisJCWlmIChzZXF1ZW5jZSA9PSBudWxsKSB7CisJCQlzZXF1ZW5jZSA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdDxEb3VibGU+KERvdWJsZS5jbGFzcywgdGhpcywgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0UpOworCQl9CisJCXJldHVybiBzZXF1ZW5jZTsKKwl9CisKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU2VxdWVuY2VNb2RpZmllckltcGwjZ2V0TmV4dFZhbHVlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldE5leHRWYWx1ZSgpIHsKKwkJaW50IGluZGV4ID0gZ2V0Q3VycmVudFNlcXVlbmNlSW5kZXgoKTsKKwkJZmluYWwgT2JqZWN0IHJldFZhbHVlID0gZ2V0U2VxdWVuY2UoKS5nZXQoaW5kZXgrKyk7CisJCXNldEN1cnJlbnRTZXF1ZW5jZUluZGV4KGluZGV4KTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0TmV4dFZhbHVlCisJCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLlNlcXVlbmNlTW9kaWZpZXJJbXBsI2dldFNlcXVlbmNlU2l6ZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBnZXRTZXF1ZW5jZVNpemUoKSB7CisJCXJldHVybiBnZXRTZXF1ZW5jZSgpLnNpemUoKTsKKwl9IC8vIGdldFNlcXVlbmNlU2l6ZQorCQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5GZWF0dXJlTW9kaWZpZXJJbXBsI3VwZGF0ZUZlYXR1cmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZUZlYXR1cmUoKSB7CisJCXN1cGVyLnVwZGF0ZUZlYXR1cmUoKTsKKwkJdGFyZ2V0LmVTZXQoZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCksIGdldE5leHRWYWx1ZSgpKTsKKwl9CisJCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkZlYXR1cmVNb2RpZmllckltcGwjcmVzZXQoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlzdXBlci5yZXNldCgpOworCQl0YXJnZXQuZVNldChnZXRFU3RydWN0dXJhbEZlYXR1cmUoKSwgZ2V0T3JpZ2luYWxWYWx1ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFOgorCQkJCXJldHVybiBnZXRTZXF1ZW5jZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFOgorCQkJCWdldFNlcXVlbmNlKCkuY2xlYXIoKTsKKwkJCQlnZXRTZXF1ZW5jZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRG91YmxlPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0U6CisJCQkJZ2V0U2VxdWVuY2UoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRE9VQkxFX1NFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRToKKwkJCQlyZXR1cm4gc2VxdWVuY2UgIT0gbnVsbCAmJiAhc2VxdWVuY2UuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoc2VxdWVuY2U6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoc2VxdWVuY2UpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Eb3VibGVTZXF1ZW5jZU1vZGlmaWVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9GZWF0dXJlTW9kaWZpZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL0ZlYXR1cmVNb2RpZmllckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDhkOWNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9GZWF0dXJlTW9kaWZpZXJJbXBsLmphdmEKQEAgLTAsMCArMSw0NDAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZlYXR1cmUgTW9kaWZpZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkZlYXR1cmVNb2RpZmllckltcGwjZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkZlYXR1cmVNb2RpZmllckltcGwjZ2V0RVN0cnVjdHVyYWxGZWF0dXJlIDxlbT5FU3RydWN0dXJhbCBGZWF0dXJlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5GZWF0dXJlTW9kaWZpZXJJbXBsI2dldEZlYXR1cmVOYW1lIDxlbT5GZWF0dXJlIE5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkZlYXR1cmVNb2RpZmllckltcGwjZ2V0RmVhdHVyZUlkIDxlbT5GZWF0dXJlIElkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5GZWF0dXJlTW9kaWZpZXJJbXBsI2dldEN1cnJlbnRWYWx1ZVRleHQgPGVtPkN1cnJlbnQgVmFsdWUgVGV4dDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRmVhdHVyZU1vZGlmaWVySW1wbCNpc0NvbXBsZXRlIDxlbT5Db21wbGV0ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEZlYXR1cmVNb2RpZmllckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEZlYXR1cmVNb2RpZmllciB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0KCkgPGVtPlRhcmdldDwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGFyZ2V0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRU9iamVjdCB0YXJnZXQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFU3RydWN0dXJhbEZlYXR1cmUoKSA8ZW0+RVN0cnVjdHVyYWwgRmVhdHVyZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGVTdHJ1Y3R1cmFsRmVhdHVyZTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGZWF0dXJlTmFtZSgpIDxlbT5GZWF0dXJlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZlYXR1cmVOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX05BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmVhdHVyZU5hbWUoKSA8ZW0+RmVhdHVyZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRGZWF0dXJlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBmZWF0dXJlTmFtZSA9IEZFQVRVUkVfTkFNRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGZWF0dXJlSWQoKSA8ZW0+RmVhdHVyZSBJZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RmVhdHVyZUlkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX0lEX0VERUZBVUxUID0gMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZlYXR1cmVJZCgpIDxlbT5GZWF0dXJlIElkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRGZWF0dXJlSWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBpbnQgZmVhdHVyZUlkID0gRkVBVFVSRV9JRF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXJyZW50VmFsdWVUZXh0KCkgPGVtPkN1cnJlbnQgVmFsdWUgVGV4dDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q3VycmVudFZhbHVlVGV4dCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSUkVOVF9WQUxVRV9URVhUX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1cnJlbnRWYWx1ZVRleHQoKSA8ZW0+Q3VycmVudCBWYWx1ZSBUZXh0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDdXJyZW50VmFsdWVUZXh0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGN1cnJlbnRWYWx1ZVRleHQgPSBDVVJSRU5UX1ZBTFVFX1RFWFRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDb21wbGV0ZSgpIDxlbT5Db21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNDb21wbGV0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENPTVBMRVRFX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRmVhdHVyZU1vZGlmaWVySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIE1vZGlmaWVyUGFja2FnZS5MaXRlcmFscy5GRUFUVVJFX01PRElGSUVSOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE1vZGlmaWNhdGlvblN1bW1hcnkoKSB7CisJCXRyeSB7CisJCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZVN0cnVjdHVyYWxGZWF0dXJlLmdldE5hbWUoKSk7CisJCQlzYi5hcHBlbmQoIiA9ICIpOworCQkJc2IuYXBwZW5kKGdldEN1cnJlbnRWYWx1ZVRleHQoKSk7CisJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gImZvbyI7CisJCX0KKwl9IC8vIGdldE1vZGlmaWNhdGlvblN1bW1hcnkKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCk7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRFU3RydWN0dXJhbEZlYXR1cmUoKSB7CisJCS8vIElzIGl0IHNldCB5ZXQ/CisJCWlmICghZUlzU2V0KE1vZGlmaWVyUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmVhdHVyZU1vZGlmaWVyX0VTdHJ1Y3R1cmFsRmVhdHVyZSgpKSkgeworCQkJLy8gTm8KKwkJCWVTdHJ1Y3R1cmFsRmVhdHVyZSA9IHRhcmdldC5lQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoZ2V0RmVhdHVyZUlkKCkpOworCQl9IC8vIGlmIAorCQkKKwkJcmV0dXJuIGVTdHJ1Y3R1cmFsRmVhdHVyZTsKKwl9IC8vIGdldEVTdHJ1Y3R1cmFsRmVhdHVyZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVTdHJ1Y3R1cmFsRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgbmV3RVN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBvbGRFU3RydWN0dXJhbEZlYXR1cmUgPSBlU3RydWN0dXJhbEZlYXR1cmU7CisJCWVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG5ld0VTdHJ1Y3R1cmFsRmVhdHVyZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kaWZpZXJQYWNrYWdlLkZFQVRVUkVfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkUsIG9sZEVTdHJ1Y3R1cmFsRmVhdHVyZSwgZVN0cnVjdHVyYWxGZWF0dXJlKSk7CisJCS8vIElzIGl0IG51bGw/CisJCWlmIChuZXdFU3RydWN0dXJhbEZlYXR1cmUgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlzZXRGZWF0dXJlSWQobmV3RVN0cnVjdHVyYWxGZWF0dXJlLmdldEZlYXR1cmVJRCgpKTsKKwkJCXNldEZlYXR1cmVOYW1lKG5ld0VTdHJ1Y3R1cmFsRmVhdHVyZS5nZXROYW1lKCkpOworCQl9IC8vIGlmIAorCQllbHNlIHsKKwkJCS8vIE5vCisJCQlzZXRGZWF0dXJlSWQoRkVBVFVSRV9JRF9FREVGQVVMVCk7CisJCX0gLy8gZWxzZSAKKwl9IC8vIHNldEVTdHJ1Y3R1cmFsRmVhdHVyZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRGZWF0dXJlSWQoKSB7CisJCXJldHVybiBmZWF0dXJlSWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RmVhdHVyZUlkKGludCBuZXdGZWF0dXJlSWQpIHsKKwkJaW50IG9sZEZlYXR1cmVJZCA9IGZlYXR1cmVJZDsKKwkJZmVhdHVyZUlkID0gbmV3RmVhdHVyZUlkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RpZmllclBhY2thZ2UuRkVBVFVSRV9NT0RJRklFUl9fRkVBVFVSRV9JRCwgb2xkRmVhdHVyZUlkLCBmZWF0dXJlSWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRU9iamVjdCBnZXRUYXJnZXQoKSB7CisJCWlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFRhcmdldCA9IChJbnRlcm5hbEVPYmplY3QpdGFyZ2V0OworCQkJdGFyZ2V0ID0gZVJlc29sdmVQcm94eShvbGRUYXJnZXQpOworCQkJaWYgKHRhcmdldCAhPSBvbGRUYXJnZXQpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBNb2RpZmllclBhY2thZ2UuRkVBVFVSRV9NT0RJRklFUl9fVEFSR0VULCBvbGRUYXJnZXQsIHRhcmdldCkpOworCQkJfQorCQl9CisJCXJldHVybiB0YXJnZXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVPYmplY3QgYmFzaWNHZXRUYXJnZXQoKSB7CisJCXJldHVybiB0YXJnZXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VGFyZ2V0KEVPYmplY3QgbmV3VGFyZ2V0KSB7CisJCUVPYmplY3Qgb2xkVGFyZ2V0ID0gdGFyZ2V0OworCQl0YXJnZXQgPSBuZXdUYXJnZXQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGlmaWVyUGFja2FnZS5GRUFUVVJFX01PRElGSUVSX19UQVJHRVQsIG9sZFRhcmdldCwgdGFyZ2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRGZWF0dXJlTmFtZSgpIHsKKwkJcmV0dXJuIGZlYXR1cmVOYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVOYW1lKFN0cmluZyBuZXdGZWF0dXJlTmFtZSkgeworCQlTdHJpbmcgb2xkRmVhdHVyZU5hbWUgPSBmZWF0dXJlTmFtZTsKKwkJZmVhdHVyZU5hbWUgPSBuZXdGZWF0dXJlTmFtZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kaWZpZXJQYWNrYWdlLkZFQVRVUkVfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRSwgb2xkRmVhdHVyZU5hbWUsIGZlYXR1cmVOYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRDdXJyZW50VmFsdWVUZXh0KCkgeworCQlyZXR1cm4gY3VycmVudFZhbHVlVGV4dDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJYWJzdHJhY3QgcHVibGljIHZvaWQgdXBkYXRlRmVhdHVyZSgpOworCQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCWFic3RyYWN0IHB1YmxpYyB2b2lkIHJlc2V0KCk7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlciNzYW5lKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzYW5lKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9IC8vIHNhbmUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkZFQVRVUkVfTU9ESUZJRVJfX1RBUkdFVDoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFRhcmdldCgpOworCQkJCXJldHVybiBiYXNpY0dldFRhcmdldCgpOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRkVBVFVSRV9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRToKKwkJCQlyZXR1cm4gZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5GRUFUVVJFX01PRElGSUVSX19GRUFUVVJFX05BTUU6CisJCQkJcmV0dXJuIGdldEZlYXR1cmVOYW1lKCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5GRUFUVVJFX01PRElGSUVSX19GRUFUVVJFX0lEOgorCQkJCXJldHVybiBnZXRGZWF0dXJlSWQoKTsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkZFQVRVUkVfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVDoKKwkJCQlyZXR1cm4gZ2V0Q3VycmVudFZhbHVlVGV4dCgpOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRkVBVFVSRV9NT0RJRklFUl9fQ09NUExFVEU6CisJCQkJcmV0dXJuIGlzQ29tcGxldGUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRkVBVFVSRV9NT0RJRklFUl9fVEFSR0VUOgorCQkJCXNldFRhcmdldCgoRU9iamVjdCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRkVBVFVSRV9NT0RJRklFUl9fRVNUUlVDVFVSQUxfRkVBVFVSRToKKwkJCQlzZXRFU3RydWN0dXJhbEZlYXR1cmUoKEVTdHJ1Y3R1cmFsRmVhdHVyZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRkVBVFVSRV9NT0RJRklFUl9fRkVBVFVSRV9OQU1FOgorCQkJCXNldEZlYXR1cmVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkZFQVRVUkVfTU9ESUZJRVJfX0ZFQVRVUkVfSUQ6CisJCQkJc2V0RmVhdHVyZUlkKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRkVBVFVSRV9NT0RJRklFUl9fVEFSR0VUOgorCQkJCXNldFRhcmdldCgoRU9iamVjdCludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5GRUFUVVJFX01PRElGSUVSX19FU1RSVUNUVVJBTF9GRUFUVVJFOgorCQkJCXNldEVTdHJ1Y3R1cmFsRmVhdHVyZSgoRVN0cnVjdHVyYWxGZWF0dXJlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkZFQVRVUkVfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRToKKwkJCQlzZXRGZWF0dXJlTmFtZShGRUFUVVJFX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkZFQVRVUkVfTU9ESUZJRVJfX0ZFQVRVUkVfSUQ6CisJCQkJc2V0RmVhdHVyZUlkKEZFQVRVUkVfSURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRkVBVFVSRV9NT0RJRklFUl9fVEFSR0VUOgorCQkJCXJldHVybiB0YXJnZXQgIT0gbnVsbDsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkZFQVRVUkVfTU9ESUZJRVJfX0VTVFJVQ1RVUkFMX0ZFQVRVUkU6CisJCQkJcmV0dXJuIGVTdHJ1Y3R1cmFsRmVhdHVyZSAhPSBudWxsOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRkVBVFVSRV9NT0RJRklFUl9fRkVBVFVSRV9OQU1FOgorCQkJCXJldHVybiBGRUFUVVJFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGZlYXR1cmVOYW1lICE9IG51bGwgOiAhRkVBVFVSRV9OQU1FX0VERUZBVUxULmVxdWFscyhmZWF0dXJlTmFtZSk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5GRUFUVVJFX01PRElGSUVSX19GRUFUVVJFX0lEOgorCQkJCXJldHVybiBmZWF0dXJlSWQgIT0gRkVBVFVSRV9JRF9FREVGQVVMVDsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkZFQVRVUkVfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVDoKKwkJCQlyZXR1cm4gQ1VSUkVOVF9WQUxVRV9URVhUX0VERUZBVUxUID09IG51bGwgPyBjdXJyZW50VmFsdWVUZXh0ICE9IG51bGwgOiAhQ1VSUkVOVF9WQUxVRV9URVhUX0VERUZBVUxULmVxdWFscyhjdXJyZW50VmFsdWVUZXh0KTsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkZFQVRVUkVfTU9ESUZJRVJfX0NPTVBMRVRFOgorCQkJCXJldHVybiBpc0NvbXBsZXRlKCkgIT0gQ09NUExFVEVfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChmZWF0dXJlTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChmZWF0dXJlTmFtZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgZmVhdHVyZUlkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGZlYXR1cmVJZCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgY3VycmVudFZhbHVlVGV4dDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChjdXJyZW50VmFsdWVUZXh0KTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vRmVhdHVyZU1vZGlmaWVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9JbnRlZ2VyTW9kaWZpZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL0ludGVnZXJNb2RpZmllckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2I2NjhkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9JbnRlZ2VyTW9kaWZpZXJJbXBsLmphdmEKQEAgLTAsMCArMSwyNTQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlck1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlZ2VyIE1vZGlmaWVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5JbnRlZ2VyTW9kaWZpZXJJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuSW50ZWdlck1vZGlmaWVySW1wbCNnZXRPcmlnaW5hbFZhbHVlIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEludGVnZXJNb2RpZmllckltcGwgZXh0ZW5kcyBTaW5nbGVWYWx1ZU1vZGlmaWVySW1wbCBpbXBsZW1lbnRzIEludGVnZXJNb2RpZmllciB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfRURFRkFVTFQgPSAwOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGludCB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmlnaW5hbFZhbHVlKCkgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPcmlnaW5hbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBPUklHSU5BTF9WQUxVRV9FREVGQVVMVCA9IDA7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JpZ2luYWxWYWx1ZSgpIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3JpZ2luYWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGludCBvcmlnaW5hbFZhbHVlID0gT1JJR0lOQUxfVkFMVUVfRURFRkFVTFQ7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEludGVnZXJNb2RpZmllckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuSU5URUdFUl9NT0RJRklFUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IG5ld1ZhbHVlKSB7CisJCWludCBvbGRWYWx1ZSA9IHZhbHVlOworCQl2YWx1ZSA9IG5ld1ZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9NT0RJRklFUl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0T3JpZ2luYWxWYWx1ZSgpIHsKKwkJcmV0dXJuIG9yaWdpbmFsVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0T3JpZ2luYWxWYWx1ZShpbnQgbmV3T3JpZ2luYWxWYWx1ZSkgeworCQlpbnQgb2xkT3JpZ2luYWxWYWx1ZSA9IG9yaWdpbmFsVmFsdWU7CisJCW9yaWdpbmFsVmFsdWUgPSBuZXdPcmlnaW5hbFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUsIG9sZE9yaWdpbmFsVmFsdWUsIG9yaWdpbmFsVmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX01PRElGSUVSX19WQUxVRToKKwkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLklOVEVHRVJfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFOgorCQkJCXJldHVybiBnZXRPcmlnaW5hbFZhbHVlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLklOVEVHRVJfTU9ESUZJRVJfX1ZBTFVFOgorCQkJCXNldFZhbHVlKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX01PRElGSUVSX19PUklHSU5BTF9WQUxVRToKKwkJCQlzZXRPcmlnaW5hbFZhbHVlKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9NT0RJRklFUl9fVkFMVUU6CisJCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLklOVEVHRVJfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFOgorCQkJCXNldE9yaWdpbmFsVmFsdWUoT1JJR0lOQUxfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9NT0RJRklFUl9fVkFMVUU6CisJCQkJcmV0dXJuIHZhbHVlICE9IFZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUU6CisJCQkJcmV0dXJuIG9yaWdpbmFsVmFsdWUgIT0gT1JJR0lOQUxfVkFMVUVfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRmVhdHVyZU1vZGlmaWVySW1wbCN1cGRhdGVGZWF0dXJlKCkKKwkgKi8KKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGVGZWF0dXJlKCkgeworCQkvLyBPcmlnaW5hbCB2YWx1ZSBjYXB0dXJlZCB5ZXQ/CisJCWlmICghZUlzU2V0KE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFKSkgeworCQkJLy8gTm8KKwkJCXNldE9yaWdpbmFsVmFsdWUoKEludGVnZXIpdGFyZ2V0LmVHZXQoZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkpKTsKKwkJfSAvLyBpZgorCQl0YXJnZXQuZVNldChnZXRFU3RydWN0dXJhbEZlYXR1cmUoKSwgZ2V0VmFsdWUoKSk7CisJCWNvbXBsZXRlID0gdHJ1ZTsKKwl9IC8vIHVwZGF0ZUZlYXR1cmUKKworCQorCS8qKgorCSAqcmVzZXQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJY29tcGxldGUgPSBmYWxzZTsKKwkJdGFyZ2V0LmVTZXQoZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCksIGdldE9yaWdpbmFsVmFsdWUoKSk7CisJfQorCQorCQorCXByaXZhdGUgYm9vbGVhbiBjb21wbGV0ZSA9IGZhbHNlOworCS8qKgorCSAqIGlzQ29tcGxldGUKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeworCQlyZXR1cm4gY29tcGxldGU7CisJfQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgb3JpZ2luYWxWYWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChvcmlnaW5hbFZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vSW50ZWdlck1vZGlmaWVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9JbnRlZ2VyTk9QTW9kaWZpZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL0ludGVnZXJOT1BNb2RpZmllckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjNiZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9JbnRlZ2VyTk9QTW9kaWZpZXJJbXBsLmphdmEKQEAgLTAsMCArMSw0NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyTk9QTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkludGVnZXIgTk9QIE1vZGlmaWVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgSW50ZWdlck5PUE1vZGlmaWVySW1wbCBleHRlbmRzIE5PUE1vZGlmaWVySW1wbCBpbXBsZW1lbnRzIEludGVnZXJOT1BNb2RpZmllciB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEludGVnZXJOT1BNb2RpZmllckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuSU5URUdFUl9OT1BfTU9ESUZJRVI7CisJfQorCit9IC8vSW50ZWdlck5PUE1vZGlmaWVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9JbnRlZ2VyUmFuZ2VNb2RpZmllckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvSW50ZWdlclJhbmdlTW9kaWZpZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlNTE0YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvSW50ZWdlclJhbmdlTW9kaWZpZXJJbXBsLmphdmEKQEAgLTAsMCArMSw0NDEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJSYW5nZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlZ2VyIFJhbmdlIE1vZGlmaWVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5JbnRlZ2VyUmFuZ2VNb2RpZmllckltcGwjZ2V0U3RhcnRWYWx1ZSA8ZW0+U3RhcnQgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkludGVnZXJSYW5nZU1vZGlmaWVySW1wbCNnZXRFbmRWYWx1ZSA8ZW0+RW5kIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5JbnRlZ2VyUmFuZ2VNb2RpZmllckltcGwjZ2V0SW5jcmVtZW50IDxlbT5JbmNyZW1lbnQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkludGVnZXJSYW5nZU1vZGlmaWVySW1wbCNnZXROZXh0VmFsdWUgPGVtPk5leHQgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkludGVnZXJSYW5nZU1vZGlmaWVySW1wbCNnZXRPcmlnaW5hbFZhbHVlIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCitwdWJsaWMgY2xhc3MgSW50ZWdlclJhbmdlTW9kaWZpZXJJbXBsIGV4dGVuZHMgUmFuZ2VNb2RpZmllckltcGwgaW1wbGVtZW50cyBJbnRlZ2VyUmFuZ2VNb2RpZmllciB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0VmFsdWUoKSA8ZW0+U3RhcnQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFN0YXJ0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1ZBTFVFX0VERUZBVUxUID0gLTk5OTk5OTk5OworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0VmFsdWUoKSA8ZW0+U3RhcnQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFN0YXJ0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBpbnQgc3RhcnRWYWx1ZSA9IFNUQVJUX1ZBTFVFX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmRWYWx1ZSgpIDxlbT5FbmQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEVuZFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFTkRfVkFMVUVfRURFRkFVTFQgPSAtOTk5OTk5OTk7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5kVmFsdWUoKSA8ZW0+RW5kIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFbmRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGludCBlbmRWYWx1ZSA9IEVORF9WQUxVRV9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5jcmVtZW50KCkgPGVtPkluY3JlbWVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW5jcmVtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJTkNSRU1FTlRfRURFRkFVTFQgPSAtOTk5OTk5OTk7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5jcmVtZW50KCkgPGVtPkluY3JlbWVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW5jcmVtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGluY3JlbWVudCA9IElOQ1JFTUVOVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROZXh0VmFsdWUoKSA8ZW0+TmV4dCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TmV4dFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBORVhUX1ZBTFVFX0VERUZBVUxUID0gLTk5OTk5OTk5OworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5leHRWYWx1ZSgpIDxlbT5OZXh0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROZXh0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBpbnQgbmV4dFZhbHVlID0gTkVYVF9WQUxVRV9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JpZ2luYWxWYWx1ZSgpIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3JpZ2luYWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgT1JJR0lOQUxfVkFMVUVfRURFRkFVTFQgPSAwOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yaWdpbmFsVmFsdWUoKSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9yaWdpbmFsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBpbnQgb3JpZ2luYWxWYWx1ZSA9IE9SSUdJTkFMX1ZBTFVFX0VERUZBVUxUOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJbnRlZ2VyUmFuZ2VNb2RpZmllckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuSU5URUdFUl9SQU5HRV9NT0RJRklFUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFN0YXJ0VmFsdWUoKSB7CisJCXJldHVybiBzdGFydFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0YXJ0VmFsdWUoaW50IG5ld1N0YXJ0VmFsdWUpIHsKKwkJaW50IG9sZFN0YXJ0VmFsdWUgPSBzdGFydFZhbHVlOworCQlzdGFydFZhbHVlID0gbmV3U3RhcnRWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kaWZpZXJQYWNrYWdlLklOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX1NUQVJUX1ZBTFVFLCBvbGRTdGFydFZhbHVlLCBzdGFydFZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRFbmRWYWx1ZSgpIHsKKwkJcmV0dXJuIGVuZFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVuZFZhbHVlKGludCBuZXdFbmRWYWx1ZSkgeworCQlpbnQgb2xkRW5kVmFsdWUgPSBlbmRWYWx1ZTsKKwkJZW5kVmFsdWUgPSBuZXdFbmRWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kaWZpZXJQYWNrYWdlLklOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX0VORF9WQUxVRSwgb2xkRW5kVmFsdWUsIGVuZFZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRJbmNyZW1lbnQoKSB7CisJCXJldHVybiBpbmNyZW1lbnQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SW5jcmVtZW50KGludCBuZXdJbmNyZW1lbnQpIHsKKwkJaW50IG9sZEluY3JlbWVudCA9IGluY3JlbWVudDsKKwkJaW5jcmVtZW50ID0gbmV3SW5jcmVtZW50OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fSU5DUkVNRU5ULCBvbGRJbmNyZW1lbnQsIGluY3JlbWVudCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgaW50IGdldE5leHRWYWx1ZSgpIHsKKwkJLy8gVW5zZXQ/CisJCWlmICghZUlzU2V0KE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFKSkgeworCQkJLy8gWWVzCisJCQluZXh0VmFsdWUgPSBzdGFydFZhbHVlOworCQl9IC8vIGlmCisJCQorCQlmaW5hbCBpbnQgcmV0VmFsdWUgPSBuZXh0VmFsdWU7CisJCWNvbXBsZXRlID0gcmV0VmFsdWUgPT0gZW5kVmFsdWU7CisJCQorCQkvLyBTdGlsbCBpbmNyZW1lbnRpbmc/CisJCWlmICghY29tcGxldGUpIHsKKwkJCS8vIFllcworCQkJZmluYWwgaW50IHRlbXAgPSByZXRWYWx1ZSArIGluY3JlbWVudDsKKwkJCS8vIFdvdWxkIHRoZSBuZXcgY3VycmVudFZhbHVlIGJlIGVxdWFsIG9yICJwYXN0IiB0aGUgZW5kVmFsdWU/CisJCQlpZiAoTWF0aC5hYnModGVtcCkgPCBNYXRoLmFicyhlbmRWYWx1ZSkpIHsKKwkJCQkvLyBObworCQkJCW5leHRWYWx1ZSA9IHRlbXA7CisJCQl9IC8vIGlmCisJCQllbHNlIHsKKwkJCQkvLyBZZXMKKwkJCQluZXh0VmFsdWUgPSBlbmRWYWx1ZTsKKwkJCX0gLy8gZWxzZSAKKwkJfSAvLyBpZiAKKwkJY3VycmVudFZhbHVlVGV4dCA9IEludGVnZXIudG9TdHJpbmcocmV0VmFsdWUpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXROZXh0VmFsdWUKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROZXh0VmFsdWUoaW50IG5ld05leHRWYWx1ZSkgeworCQlpbnQgb2xkTmV4dFZhbHVlID0gbmV4dFZhbHVlOworCQluZXh0VmFsdWUgPSBuZXdOZXh0VmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFLCBvbGROZXh0VmFsdWUsIG5leHRWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0T3JpZ2luYWxWYWx1ZSgpIHsKKwkJcmV0dXJuIG9yaWdpbmFsVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0T3JpZ2luYWxWYWx1ZShpbnQgbmV3T3JpZ2luYWxWYWx1ZSkgeworCQlpbnQgb2xkT3JpZ2luYWxWYWx1ZSA9IG9yaWdpbmFsVmFsdWU7CisJCW9yaWdpbmFsVmFsdWUgPSBuZXdPcmlnaW5hbFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUsIG9sZE9yaWdpbmFsVmFsdWUsIG9yaWdpbmFsVmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkZlYXR1cmVNb2RpZmllckltcGwjdXBkYXRlRmVhdHVyZSgpCisJICovCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlRmVhdHVyZSgpIHsKKwkJLy8gT3JpZ2luYWwgdmFsdWUgY2FwdHVyZWQgeWV0PworCQlpZiAoIWVJc1NldChNb2RpZmllclBhY2thZ2UuSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUpKSB7CisJCQkvLyBObworCQkJc2V0T3JpZ2luYWxWYWx1ZSgoSW50ZWdlcil0YXJnZXQuZUdldChnZXRFU3RydWN0dXJhbEZlYXR1cmUoKSkpOworCQl9IC8vIGlmCisJCXRhcmdldC5lU2V0KGdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLGdldE5leHRWYWx1ZSgpKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLlJhbmdlTW9kaWZpZXJJbXBsI3Jlc2V0KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJc3VwZXIucmVzZXQoKTsKKwkJZVVuc2V0KE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFKTsKKwkJdGFyZ2V0LmVTZXQoZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCksIGdldE9yaWdpbmFsVmFsdWUoKSk7CisJfQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLklOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX1NUQVJUX1ZBTFVFOgorCQkJCXJldHVybiBnZXRTdGFydFZhbHVlKCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX1JBTkdFX01PRElGSUVSX19FTkRfVkFMVUU6CisJCQkJcmV0dXJuIGdldEVuZFZhbHVlKCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX1JBTkdFX01PRElGSUVSX19JTkNSRU1FTlQ6CisJCQkJcmV0dXJuIGdldEluY3JlbWVudCgpOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fTkVYVF9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0TmV4dFZhbHVlKCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX1JBTkdFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0T3JpZ2luYWxWYWx1ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX1JBTkdFX01PRElGSUVSX19TVEFSVF9WQUxVRToKKwkJCQlzZXRTdGFydFZhbHVlKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX1JBTkdFX01PRElGSUVSX19FTkRfVkFMVUU6CisJCQkJc2V0RW5kVmFsdWUoKEludGVnZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLklOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX0lOQ1JFTUVOVDoKKwkJCQlzZXRJbmNyZW1lbnQoKEludGVnZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLklOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX05FWFRfVkFMVUU6CisJCQkJc2V0TmV4dFZhbHVlKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX1JBTkdFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRToKKwkJCQlzZXRPcmlnaW5hbFZhbHVlKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fU1RBUlRfVkFMVUU6CisJCQkJc2V0U3RhcnRWYWx1ZShTVEFSVF9WQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fRU5EX1ZBTFVFOgorCQkJCXNldEVuZFZhbHVlKEVORF9WQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fSU5DUkVNRU5UOgorCQkJCXNldEluY3JlbWVudChJTkNSRU1FTlRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLklOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX05FWFRfVkFMVUU6CisJCQkJc2V0TmV4dFZhbHVlKE5FWFRfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLklOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFOgorCQkJCXNldE9yaWdpbmFsVmFsdWUoT1JJR0lOQUxfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fU1RBUlRfVkFMVUU6CisJCQkJcmV0dXJuIHN0YXJ0VmFsdWUgIT0gU1RBUlRfVkFMVUVfRURFRkFVTFQ7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX1JBTkdFX01PRElGSUVSX19FTkRfVkFMVUU6CisJCQkJcmV0dXJuIGVuZFZhbHVlICE9IEVORF9WQUxVRV9FREVGQVVMVDsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLklOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX0lOQ1JFTUVOVDoKKwkJCQlyZXR1cm4gaW5jcmVtZW50ICE9IElOQ1JFTUVOVF9FREVGQVVMVDsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLklOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX05FWFRfVkFMVUU6CisJCQkJcmV0dXJuIG5leHRWYWx1ZSAhPSBORVhUX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUU6CisJCQkJcmV0dXJuIG9yaWdpbmFsVmFsdWUgIT0gT1JJR0lOQUxfVkFMVUVfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChzdGFydFZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHN0YXJ0VmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGVuZFZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGVuZFZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBpbmNyZW1lbnQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaW5jcmVtZW50KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBuZXh0VmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobmV4dFZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBvcmlnaW5hbFZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKG9yaWdpbmFsVmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIjc2FuZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2FuZSgpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHN1cGVyLnNhbmUoKTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiAoZW5kVmFsdWUgPj0gc3RhcnRWYWx1ZSk7CisJCWFzc2VydCByZXRWYWx1ZTsKKwkJCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgKGluY3JlbWVudCA+IDApOworCQlhc3NlcnQgcmV0VmFsdWU7CisJCQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBzYW5lCisKK30gLy9JbnRlZ2VyUmFuZ2VNb2RpZmllckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL0ludGVnZXJTZXF1ZW5jZU1vZGlmaWVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMzQwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL0ludGVnZXJTZXF1ZW5jZU1vZGlmaWVySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTkzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJTZXF1ZW5jZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlZ2VyIFNlcXVlbmNlIE1vZGlmaWVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5JbnRlZ2VyU2VxdWVuY2VNb2RpZmllckltcGwjZ2V0U2VxdWVuY2UgPGVtPlNlcXVlbmNlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJJbXBsIGV4dGVuZHMgU2VxdWVuY2VNb2RpZmllckltcGwgaW1wbGVtZW50cyBJbnRlZ2VyU2VxdWVuY2VNb2RpZmllciB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VxdWVuY2UoKSA8ZW0+U2VxdWVuY2U8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2VxdWVuY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxJbnRlZ2VyPiBzZXF1ZW5jZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJbnRlZ2VyU2VxdWVuY2VNb2RpZmllckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuSU5URUdFUl9TRVFVRU5DRV9NT0RJRklFUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8SW50ZWdlcj4gZ2V0U2VxdWVuY2UoKSB7CisJCWlmIChzZXF1ZW5jZSA9PSBudWxsKSB7CisJCQlzZXF1ZW5jZSA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdDxJbnRlZ2VyPihJbnRlZ2VyLmNsYXNzLCB0aGlzLCBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0UpOworCQl9CisJCXJldHVybiBzZXF1ZW5jZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLlNlcXVlbmNlTW9kaWZpZXJJbXBsI2dldE5leHRWYWx1ZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXROZXh0VmFsdWUoKSB7CisJCWludCBpbmRleCA9IGdldEN1cnJlbnRTZXF1ZW5jZUluZGV4KCk7CisJCWZpbmFsIE9iamVjdCByZXRWYWx1ZSA9IGdldFNlcXVlbmNlKCkuZ2V0KGluZGV4KyspOworCQlzZXRDdXJyZW50U2VxdWVuY2VJbmRleChpbmRleCk7CQorCQljdXJyZW50VmFsdWVUZXh0ID0gcmV0VmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0TmV4dFZhbHVlCisJCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLlNlcXVlbmNlTW9kaWZpZXJJbXBsI2dldFNlcXVlbmNlU2l6ZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBnZXRTZXF1ZW5jZVNpemUoKSB7CisJCXJldHVybiBnZXRTZXF1ZW5jZSgpLnNpemUoKTsKKwl9IC8vIGdldFNlcXVlbmNlU2l6ZQorCQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5GZWF0dXJlTW9kaWZpZXJJbXBsI3VwZGF0ZUZlYXR1cmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZUZlYXR1cmUoKSB7CisJCXN1cGVyLnVwZGF0ZUZlYXR1cmUoKTsKKwkJdGFyZ2V0LmVTZXQoZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCksIGdldE5leHRWYWx1ZSgpKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5GZWF0dXJlTW9kaWZpZXJJbXBsI3Jlc2V0KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJc3VwZXIucmVzZXQoKTsKKwkJdGFyZ2V0LmVTZXQoZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCksIGdldE9yaWdpbmFsVmFsdWUoKSk7CisJfQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLklOVEVHRVJfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFOgorCQkJCXJldHVybiBnZXRTZXF1ZW5jZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX1NFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRToKKwkJCQlnZXRTZXF1ZW5jZSgpLmNsZWFyKCk7CisJCQkJZ2V0U2VxdWVuY2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEludGVnZXI+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0U6CisJCQkJZ2V0U2VxdWVuY2UoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0U6CisJCQkJcmV0dXJuIHNlcXVlbmNlICE9IG51bGwgJiYgIXNlcXVlbmNlLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHNlcXVlbmNlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHNlcXVlbmNlKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL0xvbmdNb2RpZmllckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvTG9uZ01vZGlmaWVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhY2VkMmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL0xvbmdNb2RpZmllckltcGwuamF2YQpAQCAtMCwwICsxLDI1NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxvbmcgTW9kaWZpZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkxvbmdNb2RpZmllckltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Mb25nTW9kaWZpZXJJbXBsI2dldE9yaWdpbmFsVmFsdWUgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTG9uZ01vZGlmaWVySW1wbCBleHRlbmRzIFNpbmdsZVZhbHVlTW9kaWZpZXJJbXBsIGltcGxlbWVudHMgTG9uZ01vZGlmaWVyIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgVkFMVUVfRURFRkFVTFQgPSAwTDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBsb25nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JpZ2luYWxWYWx1ZSgpIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3JpZ2luYWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIE9SSUdJTkFMX1ZBTFVFX0VERUZBVUxUID0gMEw7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JpZ2luYWxWYWx1ZSgpIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3JpZ2luYWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGxvbmcgb3JpZ2luYWxWYWx1ZSA9IE9SSUdJTkFMX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIExvbmdNb2RpZmllckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuTE9OR19NT0RJRklFUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbHVlKGxvbmcgbmV3VmFsdWUpIHsKKwkJbG9uZyBvbGRWYWx1ZSA9IHZhbHVlOworCQl2YWx1ZSA9IG5ld1ZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RpZmllclBhY2thZ2UuTE9OR19NT0RJRklFUl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBsb25nIGdldE9yaWdpbmFsVmFsdWUoKSB7CisJCXJldHVybiBvcmlnaW5hbFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE9yaWdpbmFsVmFsdWUobG9uZyBuZXdPcmlnaW5hbFZhbHVlKSB7CisJCWxvbmcgb2xkT3JpZ2luYWxWYWx1ZSA9IG9yaWdpbmFsVmFsdWU7CisJCW9yaWdpbmFsVmFsdWUgPSBuZXdPcmlnaW5hbFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RpZmllclBhY2thZ2UuTE9OR19NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUsIG9sZE9yaWdpbmFsVmFsdWUsIG9yaWdpbmFsVmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5MT05HX01PRElGSUVSX19WQUxVRToKKwkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkxPTkdfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFOgorCQkJCXJldHVybiBnZXRPcmlnaW5hbFZhbHVlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkxPTkdfTU9ESUZJRVJfX1ZBTFVFOgorCQkJCXNldFZhbHVlKChMb25nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5MT05HX01PRElGSUVSX19PUklHSU5BTF9WQUxVRToKKwkJCQlzZXRPcmlnaW5hbFZhbHVlKChMb25nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTE9OR19NT0RJRklFUl9fVkFMVUU6CisJCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkxPTkdfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFOgorCQkJCXNldE9yaWdpbmFsVmFsdWUoT1JJR0lOQUxfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTE9OR19NT0RJRklFUl9fVkFMVUU6CisJCQkJcmV0dXJuIHZhbHVlICE9IFZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTE9OR19NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUU6CisJCQkJcmV0dXJuIG9yaWdpbmFsVmFsdWUgIT0gT1JJR0lOQUxfVkFMVUVfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRmVhdHVyZU1vZGlmaWVySW1wbCN1cGRhdGVGZWF0dXJlKCkKKwkgKi8KKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGVGZWF0dXJlKCkgeworCQkvLyBPcmlnaW5hbCB2YWx1ZSBjYXB0dXJlZCB5ZXQ/CisJCWlmICghZUlzU2V0KE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFKSkgeworCQkJLy8gTm8KKwkJCXNldE9yaWdpbmFsVmFsdWUoKExvbmcpdGFyZ2V0LmVHZXQoZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkpKTsKKwkJfSAvLyBpZgorCQl0YXJnZXQuZVNldChnZXRFU3RydWN0dXJhbEZlYXR1cmUoKSwgZ2V0VmFsdWUoKSk7CisJCWNvbXBsZXRlID0gdHJ1ZTsKKwl9IC8vIHVwZGF0ZUZlYXR1cmUKKworCQorCS8qKgorCSAqcmVzZXQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJY29tcGxldGUgPSBmYWxzZTsKKwkJdGFyZ2V0LmVTZXQoZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCksIGdldE9yaWdpbmFsVmFsdWUoKSk7CisJfQorCQorCQorCXByaXZhdGUgYm9vbGVhbiBjb21wbGV0ZSA9IGZhbHNlOworCS8qKgorCSAqIGlzQ29tcGxldGUKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeworCQlyZXR1cm4gY29tcGxldGU7CisJfQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgb3JpZ2luYWxWYWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChvcmlnaW5hbFZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vTG9uZ01vZGlmaWVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9Mb25nTk9QTW9kaWZpZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL0xvbmdOT1BNb2RpZmllckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzAxODk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9Mb25nTk9QTW9kaWZpZXJJbXBsLmphdmEKQEAgLTAsMCArMSw0NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nTk9QTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxvbmcgTk9QIE1vZGlmaWVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTG9uZ05PUE1vZGlmaWVySW1wbCBleHRlbmRzIE5PUE1vZGlmaWVySW1wbCBpbXBsZW1lbnRzIExvbmdOT1BNb2RpZmllciB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIExvbmdOT1BNb2RpZmllckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuTE9OR19OT1BfTU9ESUZJRVI7CisJfQorCit9IC8vIExvbmdOT1BNb2RpZmllckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvTG9uZ1JhbmdlTW9kaWZpZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL0xvbmdSYW5nZU1vZGlmaWVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNWJkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL0xvbmdSYW5nZU1vZGlmaWVySW1wbC5qYXZhCkBAIC0wLDAgKzEsNDQzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nUmFuZ2VNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TG9uZyBSYW5nZSBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTG9uZ1JhbmdlTW9kaWZpZXJJbXBsI2dldFN0YXJ0VmFsdWUgPGVtPlN0YXJ0IFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Mb25nUmFuZ2VNb2RpZmllckltcGwjZ2V0RW5kVmFsdWUgPGVtPkVuZCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTG9uZ1JhbmdlTW9kaWZpZXJJbXBsI2dldEluY3JlbWVudCA8ZW0+SW5jcmVtZW50PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Mb25nUmFuZ2VNb2RpZmllckltcGwjZ2V0TmV4dFZhbHVlIDxlbT5OZXh0IFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Mb25nUmFuZ2VNb2RpZmllckltcGwjZ2V0T3JpZ2luYWxWYWx1ZSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQorcHVibGljIGNsYXNzIExvbmdSYW5nZU1vZGlmaWVySW1wbCBleHRlbmRzIFJhbmdlTW9kaWZpZXJJbXBsIGltcGxlbWVudHMgTG9uZ1JhbmdlTW9kaWZpZXIgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydFZhbHVlKCkgPGVtPlN0YXJ0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTdGFydFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgU1RBUlRfVkFMVUVfRURFRkFVTFQgPSAtOTk5OTk5OTlMOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0VmFsdWUoKSA8ZW0+U3RhcnQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFN0YXJ0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBsb25nIHN0YXJ0VmFsdWUgPSBTVEFSVF9WQUxVRV9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5kVmFsdWUoKSA8ZW0+RW5kIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFbmRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIEVORF9WQUxVRV9FREVGQVVMVCA9IC05OTk5OTk5OUw7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5kVmFsdWUoKSA8ZW0+RW5kIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFbmRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGxvbmcgZW5kVmFsdWUgPSBFTkRfVkFMVUVfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY3JlbWVudCgpIDxlbT5JbmNyZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEluY3JlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIElOQ1JFTUVOVF9FREVGQVVMVCA9IC05OTk5OTk5OUw7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5jcmVtZW50KCkgPGVtPkluY3JlbWVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW5jcmVtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgbG9uZyBpbmNyZW1lbnQgPSBJTkNSRU1FTlRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmV4dFZhbHVlKCkgPGVtPk5leHQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5leHRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIE5FWFRfVkFMVUVfRURFRkFVTFQgPSAtOTk5OTk5OTlMOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5leHRWYWx1ZSgpIDxlbT5OZXh0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROZXh0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBsb25nIG5leHRWYWx1ZSA9IE5FWFRfVkFMVUVfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yaWdpbmFsVmFsdWUoKSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9yaWdpbmFsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBPUklHSU5BTF9WQUxVRV9FREVGQVVMVCA9IC05OTk5OTk5OUw7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JpZ2luYWxWYWx1ZSgpIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3JpZ2luYWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGxvbmcgb3JpZ2luYWxWYWx1ZSA9IE9SSUdJTkFMX1ZBTFVFX0VERUZBVUxUOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBMb25nUmFuZ2VNb2RpZmllckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuTE9OR19SQU5HRV9NT0RJRklFUjsKKwl9CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGxvbmcgZ2V0U3RhcnRWYWx1ZSgpIHsKKwkJcmV0dXJuIHN0YXJ0VmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3RhcnRWYWx1ZShsb25nIG5ld1N0YXJ0VmFsdWUpIHsKKwkJbG9uZyBvbGRTdGFydFZhbHVlID0gc3RhcnRWYWx1ZTsKKwkJc3RhcnRWYWx1ZSA9IG5ld1N0YXJ0VmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGlmaWVyUGFja2FnZS5MT05HX1JBTkdFX01PRElGSUVSX19TVEFSVF9WQUxVRSwgb2xkU3RhcnRWYWx1ZSwgc3RhcnRWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBsb25nIGdldEVuZFZhbHVlKCkgeworCQlyZXR1cm4gZW5kVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RW5kVmFsdWUobG9uZyBuZXdFbmRWYWx1ZSkgeworCQlsb25nIG9sZEVuZFZhbHVlID0gZW5kVmFsdWU7CisJCWVuZFZhbHVlID0gbmV3RW5kVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGlmaWVyUGFja2FnZS5MT05HX1JBTkdFX01PRElGSUVSX19FTkRfVkFMVUUsIG9sZEVuZFZhbHVlLCBlbmRWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBsb25nIGdldEluY3JlbWVudCgpIHsKKwkJcmV0dXJuIGluY3JlbWVudDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbmNyZW1lbnQobG9uZyBuZXdJbmNyZW1lbnQpIHsKKwkJbG9uZyBvbGRJbmNyZW1lbnQgPSBpbmNyZW1lbnQ7CisJCWluY3JlbWVudCA9IG5ld0luY3JlbWVudDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kaWZpZXJQYWNrYWdlLkxPTkdfUkFOR0VfTU9ESUZJRVJfX0lOQ1JFTUVOVCwgb2xkSW5jcmVtZW50LCBpbmNyZW1lbnQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIGxvbmcgZ2V0TmV4dFZhbHVlKCkgeworCQkvLyBVbnNldD8KKwkJaWYgKCFlSXNTZXQoTW9kaWZpZXJQYWNrYWdlLkxPTkdfUkFOR0VfTU9ESUZJRVJfX05FWFRfVkFMVUUpKSB7CisJCQkvLyBZZXMKKwkJCW5leHRWYWx1ZSA9IHN0YXJ0VmFsdWU7CisJCX0gLy8gaWYKKwkJCisJCWZpbmFsIGxvbmcgcmV0VmFsdWUgPSBuZXh0VmFsdWU7CisJCWNvbXBsZXRlID0gcmV0VmFsdWUgPT0gZW5kVmFsdWU7CisJCQorCQkvLyBTdGlsbCBpbmNyZW1lbnRpbmc/CisJCWlmICghY29tcGxldGUpIHsKKwkJCS8vIFllcworCQkJZmluYWwgbG9uZyB0ZW1wID0gcmV0VmFsdWUgKyBpbmNyZW1lbnQ7CisJCQkvLyBXb3VsZCB0aGUgbmV3IGN1cnJlbnRWYWx1ZSBiZSBlcXVhbCBvciAicGFzdCIgdGhlIGVuZFZhbHVlPworCQkJaWYgKE1hdGguYWJzKHRlbXApIDwgTWF0aC5hYnMoZW5kVmFsdWUpKSB7CisJCQkJLy8gTm8KKwkJCQluZXh0VmFsdWUgPSB0ZW1wOworCQkJfSAvLyBpZgorCQkJZWxzZSB7CisJCQkJLy8gWWVzCisJCQkJbmV4dFZhbHVlID0gZW5kVmFsdWU7CisJCQl9IC8vIGVsc2UgCisJCX0gLy8gaWYgCisJCWN1cnJlbnRWYWx1ZVRleHQgPSBMb25nLnRvU3RyaW5nKHJldFZhbHVlKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0TmV4dFZhbHVlCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TmV4dFZhbHVlKGxvbmcgbmV3TmV4dFZhbHVlKSB7CisJCWxvbmcgb2xkTmV4dFZhbHVlID0gbmV4dFZhbHVlOworCQluZXh0VmFsdWUgPSBuZXdOZXh0VmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGlmaWVyUGFja2FnZS5MT05HX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFLCBvbGROZXh0VmFsdWUsIG5leHRWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBsb25nIGdldE9yaWdpbmFsVmFsdWUoKSB7CisJCXJldHVybiBvcmlnaW5hbFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE9yaWdpbmFsVmFsdWUobG9uZyBuZXdPcmlnaW5hbFZhbHVlKSB7CisJCWxvbmcgb2xkT3JpZ2luYWxWYWx1ZSA9IG9yaWdpbmFsVmFsdWU7CisJCW9yaWdpbmFsVmFsdWUgPSBuZXdPcmlnaW5hbFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RpZmllclBhY2thZ2UuTE9OR19SQU5HRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUsIG9sZE9yaWdpbmFsVmFsdWUsIG9yaWdpbmFsVmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkZlYXR1cmVNb2RpZmllckltcGwjdXBkYXRlRmVhdHVyZSgpCisJICovCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGVGZWF0dXJlKCkgeworCQkvLyBPcmlnaW5hbCB2YWx1ZSBjYXB0dXJlZCB5ZXQ/CisJCWlmICghZUlzU2V0KE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX1JBTkdFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSkpIHsKKwkJCS8vIE5vCisJCQlzZXRPcmlnaW5hbFZhbHVlKChMb25nKXRhcmdldC5lR2V0KGdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpKSk7CisJCX0gLy8gaWYKKwkJdGFyZ2V0LmVTZXQoZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCksZ2V0TmV4dFZhbHVlKCkpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuUmFuZ2VNb2RpZmllckltcGwjcmVzZXQoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlzdXBlci5yZXNldCgpOworCQllVW5zZXQoTW9kaWZpZXJQYWNrYWdlLkxPTkdfUkFOR0VfTU9ESUZJRVJfX05FWFRfVkFMVUUpOworCQl0YXJnZXQuZVNldChnZXRFU3RydWN0dXJhbEZlYXR1cmUoKSwgZ2V0T3JpZ2luYWxWYWx1ZSgpKTsKKwl9CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTE9OR19SQU5HRV9NT0RJRklFUl9fU1RBUlRfVkFMVUU6CisJCQkJcmV0dXJuIGdldFN0YXJ0VmFsdWUoKTsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkxPTkdfUkFOR0VfTU9ESUZJRVJfX0VORF9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0RW5kVmFsdWUoKTsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkxPTkdfUkFOR0VfTU9ESUZJRVJfX0lOQ1JFTUVOVDoKKwkJCQlyZXR1cm4gZ2V0SW5jcmVtZW50KCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5MT05HX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFOgorCQkJCXJldHVybiBnZXROZXh0VmFsdWUoKTsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkxPTkdfUkFOR0VfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFOgorCQkJCXJldHVybiBnZXRPcmlnaW5hbFZhbHVlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkxPTkdfUkFOR0VfTU9ESUZJRVJfX1NUQVJUX1ZBTFVFOgorCQkJCXNldFN0YXJ0VmFsdWUoKExvbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkxPTkdfUkFOR0VfTU9ESUZJRVJfX0VORF9WQUxVRToKKwkJCQlzZXRFbmRWYWx1ZSgoTG9uZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTE9OR19SQU5HRV9NT0RJRklFUl9fSU5DUkVNRU5UOgorCQkJCXNldEluY3JlbWVudCgoTG9uZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTE9OR19SQU5HRV9NT0RJRklFUl9fTkVYVF9WQUxVRToKKwkJCQlzZXROZXh0VmFsdWUoKExvbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkxPTkdfUkFOR0VfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFOgorCQkJCXNldE9yaWdpbmFsVmFsdWUoKExvbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5MT05HX1JBTkdFX01PRElGSUVSX19TVEFSVF9WQUxVRToKKwkJCQlzZXRTdGFydFZhbHVlKFNUQVJUX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5MT05HX1JBTkdFX01PRElGSUVSX19FTkRfVkFMVUU6CisJCQkJc2V0RW5kVmFsdWUoRU5EX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5MT05HX1JBTkdFX01PRElGSUVSX19JTkNSRU1FTlQ6CisJCQkJc2V0SW5jcmVtZW50KElOQ1JFTUVOVF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTE9OR19SQU5HRV9NT0RJRklFUl9fTkVYVF9WQUxVRToKKwkJCQlzZXROZXh0VmFsdWUoTkVYVF9WQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTE9OR19SQU5HRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUU6CisJCQkJc2V0T3JpZ2luYWxWYWx1ZShPUklHSU5BTF9WQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5MT05HX1JBTkdFX01PRElGSUVSX19TVEFSVF9WQUxVRToKKwkJCQlyZXR1cm4gc3RhcnRWYWx1ZSAhPSBTVEFSVF9WQUxVRV9FREVGQVVMVDsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkxPTkdfUkFOR0VfTU9ESUZJRVJfX0VORF9WQUxVRToKKwkJCQlyZXR1cm4gZW5kVmFsdWUgIT0gRU5EX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTE9OR19SQU5HRV9NT0RJRklFUl9fSU5DUkVNRU5UOgorCQkJCXJldHVybiBpbmNyZW1lbnQgIT0gSU5DUkVNRU5UX0VERUZBVUxUOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTE9OR19SQU5HRV9NT0RJRklFUl9fTkVYVF9WQUxVRToKKwkJCQlyZXR1cm4gbmV4dFZhbHVlICE9IE5FWFRfVkFMVUVfRURFRkFVTFQ7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5MT05HX1JBTkdFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRToKKwkJCQlyZXR1cm4gb3JpZ2luYWxWYWx1ZSAhPSBPUklHSU5BTF9WQUxVRV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHN0YXJ0VmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoc3RhcnRWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgZW5kVmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZW5kVmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGluY3JlbWVudDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpbmNyZW1lbnQpOworCQlyZXN1bHQuYXBwZW5kKCIsIG5leHRWYWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChuZXh0VmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIG9yaWdpbmFsVmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQob3JpZ2luYWxWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIjc2FuZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2FuZSgpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHN1cGVyLnNhbmUoKTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiAoZW5kVmFsdWUgPj0gc3RhcnRWYWx1ZSk7CisJCWFzc2VydCByZXRWYWx1ZTsKKwkJCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgKGluY3JlbWVudCA+IDBMKTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gc2FuZQorCit9IC8vTG9uZ1JhbmdlTW9kaWZpZXJJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL0xvbmdTZXF1ZW5jZU1vZGlmaWVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9Mb25nU2VxdWVuY2VNb2RpZmllckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTMxNjRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9Mb25nU2VxdWVuY2VNb2RpZmllckltcGwuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nU2VxdWVuY2VNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TG9uZyBTZXF1ZW5jZSBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTG9uZ1NlcXVlbmNlTW9kaWZpZXJJbXBsI2dldFNlcXVlbmNlIDxlbT5TZXF1ZW5jZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIExvbmdTZXF1ZW5jZU1vZGlmaWVySW1wbCBleHRlbmRzIFNlcXVlbmNlTW9kaWZpZXJJbXBsIGltcGxlbWVudHMgTG9uZ1NlcXVlbmNlTW9kaWZpZXIgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcXVlbmNlKCkgPGVtPlNlcXVlbmNlPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNlcXVlbmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8TG9uZz4gc2VxdWVuY2U7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTG9uZ1NlcXVlbmNlTW9kaWZpZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLkxPTkdfU0VRVUVOQ0VfTU9ESUZJRVI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PExvbmc+IGdldFNlcXVlbmNlKCkgeworCQlpZiAoc2VxdWVuY2UgPT0gbnVsbCkgeworCQkJc2VxdWVuY2UgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3Q8TG9uZz4oTG9uZy5jbGFzcywgdGhpcywgTW9kaWZpZXJQYWNrYWdlLkxPTkdfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFKTsKKwkJfQorCQlyZXR1cm4gc2VxdWVuY2U7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TZXF1ZW5jZU1vZGlmaWVySW1wbCNnZXROZXh0VmFsdWUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0TmV4dFZhbHVlKCkgeworCQlpbnQgaW5kZXggPSBnZXRDdXJyZW50U2VxdWVuY2VJbmRleCgpOworCQlmaW5hbCBPYmplY3QgcmV0VmFsdWUgPSBnZXRTZXF1ZW5jZSgpLmdldChpbmRleCsrKTsKKwkJc2V0Q3VycmVudFNlcXVlbmNlSW5kZXgoaW5kZXgpOwkKKwkJY3VycmVudFZhbHVlVGV4dCA9IHJldFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldE5leHRWYWx1ZQorCQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TZXF1ZW5jZU1vZGlmaWVySW1wbCNnZXRTZXF1ZW5jZVNpemUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZ2V0U2VxdWVuY2VTaXplKCkgeworCQlyZXR1cm4gZ2V0U2VxdWVuY2UoKS5zaXplKCk7CisJfSAvLyBnZXRTZXF1ZW5jZVNpemUKKwkKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRmVhdHVyZU1vZGlmaWVySW1wbCN1cGRhdGVGZWF0dXJlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGVGZWF0dXJlKCkgeworCQlzdXBlci51cGRhdGVGZWF0dXJlKCk7CisJCXRhcmdldC5lU2V0KGdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLCBnZXROZXh0VmFsdWUoKSk7CisJfQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRmVhdHVyZU1vZGlmaWVySW1wbCNyZXNldCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCXN1cGVyLnJlc2V0KCk7CisJCXRhcmdldC5lU2V0KGdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLCBnZXRPcmlnaW5hbFZhbHVlKCkpOworCX0KKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5MT05HX1NFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRToKKwkJCQlyZXR1cm4gZ2V0U2VxdWVuY2UoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTE9OR19TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0U6CisJCQkJZ2V0U2VxdWVuY2UoKS5jbGVhcigpOworCQkJCWdldFNlcXVlbmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBMb25nPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkxPTkdfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFOgorCQkJCWdldFNlcXVlbmNlKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkxPTkdfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFOgorCQkJCXJldHVybiBzZXF1ZW5jZSAhPSBudWxsICYmICFzZXF1ZW5jZS5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChzZXF1ZW5jZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChzZXF1ZW5jZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0xvbmdTZXF1ZW5jZU1vZGlmaWVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9Nb2RpZmllckZhY3RvcnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL01vZGlmaWVyRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDg0MGJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9Nb2RpZmllckZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSwzOTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVOT1BNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlUmFuZ2VNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlU2VxdWVuY2VNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJOT1BNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlclJhbmdlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJTZXF1ZW5jZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdOT1BNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ1JhbmdlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdTZXF1ZW5jZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTk9QTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lTk9QTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lUmFuZ2VNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TdHJpbmdOT1BNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU3RyaW5nU2VxdWVuY2VNb2RpZmllcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNb2RpZmllckZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgTW9kaWZpZXJGYWN0b3J5IHsKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBNb2RpZmllckZhY3RvcnkgaW5pdCgpIHsKKwkJdHJ5IHsKKwkJCU1vZGlmaWVyRmFjdG9yeSB0aGVNb2RpZmllckZhY3RvcnkgPSAoTW9kaWZpZXJGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci5lY29yZSIpOyAvLyROT04tTkxTLTEkIAorCQkJaWYgKHRoZU1vZGlmaWVyRmFjdG9yeSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoZU1vZGlmaWVyRmFjdG9yeTsKKwkJCX0KKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwkJcmV0dXJuIG5ldyBNb2RpZmllckZhY3RvcnlJbXBsKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTW9kaWZpZXJGYWN0b3J5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgeworCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRE9VQkxFX05PUF9NT0RJRklFUjogcmV0dXJuIGNyZWF0ZURvdWJsZU5PUE1vZGlmaWVyKCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfUkFOR0VfTU9ESUZJRVI6IHJldHVybiBjcmVhdGVEb3VibGVSYW5nZU1vZGlmaWVyKCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfU0VRVUVOQ0VfTU9ESUZJRVI6IHJldHVybiBjcmVhdGVEb3VibGVTZXF1ZW5jZU1vZGlmaWVyKCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX05PUF9NT0RJRklFUjogcmV0dXJuIGNyZWF0ZUludGVnZXJOT1BNb2RpZmllcigpOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9SQU5HRV9NT0RJRklFUjogcmV0dXJuIGNyZWF0ZUludGVnZXJSYW5nZU1vZGlmaWVyKCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX1NFUVVFTkNFX01PRElGSUVSOiByZXR1cm4gY3JlYXRlSW50ZWdlclNlcXVlbmNlTW9kaWZpZXIoKTsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkxPTkdfTk9QX01PRElGSUVSOiByZXR1cm4gY3JlYXRlTG9uZ05PUE1vZGlmaWVyKCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5MT05HX1JBTkdFX01PRElGSUVSOiByZXR1cm4gY3JlYXRlTG9uZ1JhbmdlTW9kaWZpZXIoKTsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkxPTkdfU0VRVUVOQ0VfTU9ESUZJRVI6IHJldHVybiBjcmVhdGVMb25nU2VxdWVuY2VNb2RpZmllcigpOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTU9ESUZJRVI6IHJldHVybiBjcmVhdGVNb2RpZmllcigpOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTk9QX01PRElGSUVSOiByZXR1cm4gY3JlYXRlTk9QTW9kaWZpZXIoKTsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNURU1fVElNRV9OT1BfTU9ESUZJRVI6IHJldHVybiBjcmVhdGVTVEVNVGltZU5PUE1vZGlmaWVyKCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVI6IHJldHVybiBjcmVhdGVTVEVNVGltZVJhbmdlTW9kaWZpZXIoKTsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNURU1fVElNRV9TRVFVRU5DRV9NT0RJRklFUjogcmV0dXJuIGNyZWF0ZVNURU1UaW1lU2VxdWVuY2VNb2RpZmllcigpOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RSSU5HX05PUF9NT0RJRklFUjogcmV0dXJuIGNyZWF0ZVN0cmluZ05PUE1vZGlmaWVyKCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TVFJJTkdfU0VRVUVOQ0VfTU9ESUZJRVI6IHJldHVybiBjcmVhdGVTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyKCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfTU9ESUZJRVI6IHJldHVybiBjcmVhdGVEb3VibGVNb2RpZmllcigpOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9NT0RJRklFUjogcmV0dXJuIGNyZWF0ZUludGVnZXJNb2RpZmllcigpOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTE9OR19NT0RJRklFUjogcmV0dXJuIGNyZWF0ZUxvbmdNb2RpZmllcigpOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX01PRElGSUVSOiByZXR1cm4gY3JlYXRlU1RFTVRpbWVNb2RpZmllcigpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5VUkk6CisJCQkJcmV0dXJuIGNyZWF0ZVVSSUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5VUkk6CisJCQkJcmV0dXJuIGNvbnZlcnRVUklUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEb3VibGVOT1BNb2RpZmllciBjcmVhdGVEb3VibGVOT1BNb2RpZmllcigpIHsKKwkJRG91YmxlTk9QTW9kaWZpZXJJbXBsIGRvdWJsZU5PUE1vZGlmaWVyID0gbmV3IERvdWJsZU5PUE1vZGlmaWVySW1wbCgpOworCQlyZXR1cm4gZG91YmxlTk9QTW9kaWZpZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERvdWJsZVJhbmdlTW9kaWZpZXIgY3JlYXRlRG91YmxlUmFuZ2VNb2RpZmllcigpIHsKKwkJRG91YmxlUmFuZ2VNb2RpZmllckltcGwgZG91YmxlUmFuZ2VNb2RpZmllciA9IG5ldyBEb3VibGVSYW5nZU1vZGlmaWVySW1wbCgpOworCQlyZXR1cm4gZG91YmxlUmFuZ2VNb2RpZmllcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRG91YmxlU2VxdWVuY2VNb2RpZmllciBjcmVhdGVEb3VibGVTZXF1ZW5jZU1vZGlmaWVyKCkgeworCQlEb3VibGVTZXF1ZW5jZU1vZGlmaWVySW1wbCBkb3VibGVTZXF1ZW5jZU1vZGlmaWVyID0gbmV3IERvdWJsZVNlcXVlbmNlTW9kaWZpZXJJbXBsKCk7CisJCXJldHVybiBkb3VibGVTZXF1ZW5jZU1vZGlmaWVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJbnRlZ2VyTk9QTW9kaWZpZXIgY3JlYXRlSW50ZWdlck5PUE1vZGlmaWVyKCkgeworCQlJbnRlZ2VyTk9QTW9kaWZpZXJJbXBsIGludGVnZXJOT1BNb2RpZmllciA9IG5ldyBJbnRlZ2VyTk9QTW9kaWZpZXJJbXBsKCk7CisJCXJldHVybiBpbnRlZ2VyTk9QTW9kaWZpZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEludGVnZXJSYW5nZU1vZGlmaWVyIGNyZWF0ZUludGVnZXJSYW5nZU1vZGlmaWVyKCkgeworCQlJbnRlZ2VyUmFuZ2VNb2RpZmllckltcGwgaW50ZWdlclJhbmdlTW9kaWZpZXIgPSBuZXcgSW50ZWdlclJhbmdlTW9kaWZpZXJJbXBsKCk7CisJCXJldHVybiBpbnRlZ2VyUmFuZ2VNb2RpZmllcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSW50ZWdlclNlcXVlbmNlTW9kaWZpZXIgY3JlYXRlSW50ZWdlclNlcXVlbmNlTW9kaWZpZXIoKSB7CisJCUludGVnZXJTZXF1ZW5jZU1vZGlmaWVySW1wbCBpbnRlZ2VyU2VxdWVuY2VNb2RpZmllciA9IG5ldyBJbnRlZ2VyU2VxdWVuY2VNb2RpZmllckltcGwoKTsKKwkJcmV0dXJuIGludGVnZXJTZXF1ZW5jZU1vZGlmaWVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMb25nTk9QTW9kaWZpZXIgY3JlYXRlTG9uZ05PUE1vZGlmaWVyKCkgeworCQlMb25nTk9QTW9kaWZpZXJJbXBsIGxvbmdOT1BNb2RpZmllciA9IG5ldyBMb25nTk9QTW9kaWZpZXJJbXBsKCk7CisJCXJldHVybiBsb25nTk9QTW9kaWZpZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExvbmdSYW5nZU1vZGlmaWVyIGNyZWF0ZUxvbmdSYW5nZU1vZGlmaWVyKCkgeworCQlMb25nUmFuZ2VNb2RpZmllckltcGwgbG9uZ1JhbmdlTW9kaWZpZXIgPSBuZXcgTG9uZ1JhbmdlTW9kaWZpZXJJbXBsKCk7CisJCXJldHVybiBsb25nUmFuZ2VNb2RpZmllcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTG9uZ1NlcXVlbmNlTW9kaWZpZXIgY3JlYXRlTG9uZ1NlcXVlbmNlTW9kaWZpZXIoKSB7CisJCUxvbmdTZXF1ZW5jZU1vZGlmaWVySW1wbCBsb25nU2VxdWVuY2VNb2RpZmllciA9IG5ldyBMb25nU2VxdWVuY2VNb2RpZmllckltcGwoKTsKKwkJcmV0dXJuIGxvbmdTZXF1ZW5jZU1vZGlmaWVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNb2RpZmllciBjcmVhdGVNb2RpZmllcigpIHsKKwkJTW9kaWZpZXJJbXBsIG1vZGlmaWVyID0gbmV3IE1vZGlmaWVySW1wbCgpOworCQlyZXR1cm4gbW9kaWZpZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5PUE1vZGlmaWVyIGNyZWF0ZU5PUE1vZGlmaWVyKCkgeworCQlOT1BNb2RpZmllckltcGwgbm9wTW9kaWZpZXIgPSBuZXcgTk9QTW9kaWZpZXJJbXBsKCk7CisJCXJldHVybiBub3BNb2RpZmllcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU1RFTVRpbWVOT1BNb2RpZmllciBjcmVhdGVTVEVNVGltZU5PUE1vZGlmaWVyKCkgeworCQlTVEVNVGltZU5PUE1vZGlmaWVySW1wbCBzdGVtVGltZU5PUE1vZGlmaWVyID0gbmV3IFNURU1UaW1lTk9QTW9kaWZpZXJJbXBsKCk7CisJCXJldHVybiBzdGVtVGltZU5PUE1vZGlmaWVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTVEVNVGltZVJhbmdlTW9kaWZpZXIgY3JlYXRlU1RFTVRpbWVSYW5nZU1vZGlmaWVyKCkgeworCQlTVEVNVGltZVJhbmdlTW9kaWZpZXJJbXBsIHN0ZW1UaW1lUmFuZ2VNb2RpZmllciA9IG5ldyBTVEVNVGltZVJhbmdlTW9kaWZpZXJJbXBsKCk7CisJCXJldHVybiBzdGVtVGltZVJhbmdlTW9kaWZpZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNURU1UaW1lU2VxdWVuY2VNb2RpZmllciBjcmVhdGVTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXIoKSB7CisJCVNURU1UaW1lU2VxdWVuY2VNb2RpZmllckltcGwgc3RlbVRpbWVTZXF1ZW5jZU1vZGlmaWVyID0gbmV3IFNURU1UaW1lU2VxdWVuY2VNb2RpZmllckltcGwoKTsKKwkJcmV0dXJuIHN0ZW1UaW1lU2VxdWVuY2VNb2RpZmllcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nTk9QTW9kaWZpZXIgY3JlYXRlU3RyaW5nTk9QTW9kaWZpZXIoKSB7CisJCVN0cmluZ05PUE1vZGlmaWVySW1wbCBzdHJpbmdOT1BNb2RpZmllciA9IG5ldyBTdHJpbmdOT1BNb2RpZmllckltcGwoKTsKKwkJcmV0dXJuIHN0cmluZ05PUE1vZGlmaWVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyIGNyZWF0ZVN0cmluZ1NlcXVlbmNlTW9kaWZpZXIoKSB7CisJCVN0cmluZ1NlcXVlbmNlTW9kaWZpZXJJbXBsIHN0cmluZ1NlcXVlbmNlTW9kaWZpZXIgPSBuZXcgU3RyaW5nU2VxdWVuY2VNb2RpZmllckltcGwoKTsKKwkJcmV0dXJuIHN0cmluZ1NlcXVlbmNlTW9kaWZpZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERvdWJsZU1vZGlmaWVyIGNyZWF0ZURvdWJsZU1vZGlmaWVyKCkgeworCQlEb3VibGVNb2RpZmllckltcGwgZG91YmxlTW9kaWZpZXIgPSBuZXcgRG91YmxlTW9kaWZpZXJJbXBsKCk7CisJCXJldHVybiBkb3VibGVNb2RpZmllcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSW50ZWdlck1vZGlmaWVyIGNyZWF0ZUludGVnZXJNb2RpZmllcigpIHsKKwkJSW50ZWdlck1vZGlmaWVySW1wbCBpbnRlZ2VyTW9kaWZpZXIgPSBuZXcgSW50ZWdlck1vZGlmaWVySW1wbCgpOworCQlyZXR1cm4gaW50ZWdlck1vZGlmaWVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMb25nTW9kaWZpZXIgY3JlYXRlTG9uZ01vZGlmaWVyKCkgeworCQlMb25nTW9kaWZpZXJJbXBsIGxvbmdNb2RpZmllciA9IG5ldyBMb25nTW9kaWZpZXJJbXBsKCk7CisJCXJldHVybiBsb25nTW9kaWZpZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNURU1UaW1lTW9kaWZpZXIgY3JlYXRlU1RFTVRpbWVNb2RpZmllcigpIHsKKwkJU1RFTVRpbWVNb2RpZmllckltcGwgc3RlbVRpbWVNb2RpZmllciA9IG5ldyBTVEVNVGltZU1vZGlmaWVySW1wbCgpOworCQlyZXR1cm4gc3RlbVRpbWVNb2RpZmllcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFVSSSBjcmVhdGVVUklGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoaW5pdGlhbFZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVVJJIGNyZWF0ZVVSSUZyb21TdHJpbmdHZW4oRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlyZXR1cm4gKFVSSSlzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwl9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFVSSVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFVSSVRvU3RyaW5nR2VuKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTW9kaWZpZXJQYWNrYWdlIGdldE1vZGlmaWVyUGFja2FnZSgpIHsKKwkJcmV0dXJuIChNb2RpZmllclBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBkZXByZWNhdGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBNb2RpZmllclBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKKwkJcmV0dXJuIE1vZGlmaWVyUGFja2FnZS5lSU5TVEFOQ0U7CisJfQorCit9IC8vTW9kaWZpZXJGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9Nb2RpZmllckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvTW9kaWZpZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIwZmQ5MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvTW9kaWZpZXJJbXBsLmphdmEKQEAgLTAsMCArMSw0OTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkRlY29yYXRvckltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkZlYXR1cmVNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW87CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnCisgKiA8ZW0+PGI+TW9kaWZpZXI8L2I+PC9lbT4nLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJJbXBsI2dldFRhcmdldFVSSSA8ZW0+VGFyZ2V0IFVSSTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJJbXBsI2dldEZlYXR1cmVNb2RpZmllcnMgPGVtPkZlYXR1cmUgTW9kaWZpZXJzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllckltcGwjaXNDb21wbGV0ZSA8ZW0+Q29tcGxldGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNb2RpZmllckltcGwgZXh0ZW5kcyBEZWNvcmF0b3JJbXBsIGltcGxlbWVudHMgTW9kaWZpZXIgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRVUkkoKSA8ZW0+VGFyZ2V0IFVSSTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRhcmdldFVSSSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgVEFSR0VUX1VSSV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRVUkkoKSA8ZW0+VGFyZ2V0IFVSSTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRhcmdldFVSSSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFVSSSB0YXJnZXRVUkkgPSBUQVJHRVRfVVJJX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmVhdHVyZU1vZGlmaWVycygpCisJICogPGVtPkZlYXR1cmUgTW9kaWZpZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNnZXRGZWF0dXJlTW9kaWZpZXJzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8RmVhdHVyZU1vZGlmaWVyPiBmZWF0dXJlTW9kaWZpZXJzOworCisJLy8gc2V0IHRvIHRydWUgd2hlbiB0aGVyZSdzIGFuIGVycm9yCisJcHJpdmF0ZSBib29sZWFuIGNvbXBsZXRlID0gZmFsc2U7CisKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0NvbXBsZXRlKCkgPGVtPkNvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNDb21wbGV0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENPTVBMRVRFX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBNb2RpZmllckltcGwoKSB7CisJCXN1cGVyKCk7CisJCXNldFVSSShTVEVNVVJJLmNyZWF0ZVVSSShVUklfVFlQRV9NT0RJRklFUl9TRUdNRU5UICsgIi8iCisJCQkJKyAgU1RFTVVSSS5nZW5lcmF0ZVVuaXF1ZVBhcnQoKSkpOworCQlzZXRUeXBlVVJJKFNURU1VUkkuTU9ESUZJRVJfVFlQRV9VUkkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIE1vZGlmaWVyUGFja2FnZS5MaXRlcmFscy5NT0RJRklFUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVSSSBnZXRUYXJnZXRVUkkoKSB7CisJCXJldHVybiB0YXJnZXRVUkk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRhcmdldFVSSShVUkkgbmV3VGFyZ2V0VVJJKSB7CisJCVVSSSBvbGRUYXJnZXRVUkkgPSB0YXJnZXRVUkk7CisJCXRhcmdldFVSSSA9IG5ld1RhcmdldFVSSTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kaWZpZXJQYWNrYWdlLk1PRElGSUVSX19UQVJHRVRfVVJJLCBvbGRUYXJnZXRVUkksIHRhcmdldFVSSSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8RmVhdHVyZU1vZGlmaWVyPiBnZXRGZWF0dXJlTW9kaWZpZXJzKCkgeworCQlpZiAoZmVhdHVyZU1vZGlmaWVycyA9PSBudWxsKSB7CisJCQlmZWF0dXJlTW9kaWZpZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEZlYXR1cmVNb2RpZmllcj4oRmVhdHVyZU1vZGlmaWVyLmNsYXNzLCB0aGlzLCBNb2RpZmllclBhY2thZ2UuTU9ESUZJRVJfX0ZFQVRVUkVfTU9ESUZJRVJTKTsKKwkJfQorCQlyZXR1cm4gZmVhdHVyZU1vZGlmaWVyczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7CisKKwkJaWYgKGNvbXBsZXRlKSB7CisJCQkvLyBZZXMKKwkJCXJldHVybiB0cnVlOworCQl9IC8vIGlmCisKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CisKKwkJZm9yIChGZWF0dXJlTW9kaWZpZXIgZmVhdHVyZU1vZGlmaWVyIDogZ2V0RmVhdHVyZU1vZGlmaWVycygpKSB7CisJCQlyZXRWYWx1ZSA9IGZlYXR1cmVNb2RpZmllci5pc0NvbXBsZXRlKCk7CisJCQkvLyBGb3VuZCBvbmUgdGhhdCdzIGZhbHNlPworCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCS8vIFllcworCQkJCWJyZWFrOworCQkJfSAvLyBpZgorCQl9IC8vIGZvciBlYWNoIEZlYXR1cmVNb2RpZmllcgorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBpc0NvbXBsZXRlCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCWZvciAoRmVhdHVyZU1vZGlmaWVyIGZlYXR1cmVNb2RpZmllciA6IGdldEZlYXR1cmVNb2RpZmllcnMoKSkgeworCQkJZmVhdHVyZU1vZGlmaWVyLnJlc2V0KCk7CisJCX0gLy8gZm9yIGVhY2ggRmVhdHVyZU1vZGlmaWVyCisJfSAvLyByZXNldAorCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5EZWNvcmF0b3JJbXBsI3Jlc2V0TGFiZWxzKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNldExhYmVscygpIHsKKwkJcmVzZXQoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkRlY29yYXRvckltcGwjZGVjb3JhdGVHcmFwaCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZGVjb3JhdGVHcmFwaChTVEVNVGltZSB0aW1lKSB7CisJCS8vIE5vdGhpbmcKKwkJcmV0dXJuIHRydWU7CisJfSAvLyBkZWNvcmF0ZUdyYXBoCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkRlY29yYXRvckltcGwjdXBkYXRlTGFiZWxzKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSwKKwkgKiAgICAgIGxvbmcpCisJICogICAgICAKKwkgKiAgT25seSBpbnZva2VkIGJ5IHRyaWdnZXJzCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlTGFiZWxzKFNURU1UaW1lIHRpbWUsIGxvbmcgdGltZXJQZXJpb2QsIGludCBjeWNsZSkgeworCQltb2RpZnlUYXJnZXQoZ2V0VGFyZ2V0KGdldEdyYXBoKCkpKTsKKwl9IC8vIHVwZGF0ZUxhYmVscworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGVTY2VuYXJpbyhmaW5hbCBTY2VuYXJpbyBzY2VuYXJpbykgeworCQltb2RpZnlUYXJnZXQoZ2V0VGFyZ2V0KHNjZW5hcmlvKSk7CisJfSAvLyB1cGRhdGVTY2VuYXJpbworCisJcHJpdmF0ZSBFT2JqZWN0IGdldFRhcmdldChmaW5hbCBTY2VuYXJpbyBzY2VuYXJpbykgeworCQlFT2JqZWN0IHJldFZhbHVlID0gbnVsbDsKKwkJLy8gU2VxdWVuY2VyPworCQlpZiAoc2NlbmFyaW8uZ2V0U2VxdWVuY2VyKCkuZ2V0VVJJKCkuZXF1YWxzKHRhcmdldFVSSSkpIHsKKwkJCS8vIFllcworCQkJcmV0VmFsdWUgPSBzY2VuYXJpby5nZXRTZXF1ZW5jZXIoKTsKKwkJfSAvLyBpZgorCQllbHNlIHsKKwkJCS8vIE5vCisJCQkvLyBTY2VuYXJpbyBEZWNvcmF0b3JzPworCQkJLyogQ29tbWVudGVkIG91dCA2LzEwLzA5IHNpbmNlIGEgbW9kaWZpZXIgZm9yIGluZmVjdG9ycyBuZWVkcyB0byBtb2RpZnkgdGhlIGluZmVjdG9yIGluIHRoZSBncmFwaAorCQkJZm9yIChEZWNvcmF0b3Igc2NlbmFyaW9EZWNvcmF0b3IgOiBzY2VuYXJpby5nZXRTY2VuYXJpb0RlY29yYXRvcnMoKSkgeworCQkJCS8vIE91ciB0YXJnZXQ/CisJCQkJaWYgKHNjZW5hcmlvRGVjb3JhdG9yLmdldFVSSSgpLmVxdWFscyh0YXJnZXRVUkkpKSB7CisJCQkJCS8vIFllcworCQkJCQlyZXRWYWx1ZSA9IHNjZW5hcmlvRGVjb3JhdG9yOworCQkJCQlicmVhazsKKwkJCQl9IC8vIGlmCisJCQl9IC8vIGZvciBlYWNoIFNjZW5hcmlvIERlY29yYXRvcgorCQkJKi8KKwkJCS8vIERpZCB3ZSBmaW5kIGEgU2NlbmFyaW8gZGVjb3JhdG9yPworCQkJaWYgKHJldFZhbHVlID09IG51bGwpIHsKKwkJCQkvLyBObworCQkJCS8vIFdlJ3ZlIGRvbmUgdGhlIGVhc3kgc3R1ZmYKKwkJCQlyZXRWYWx1ZSA9IGdldFRhcmdldChzY2VuYXJpby5nZXRNb2RlbCgpKTsKKwkJCX0gLy8gaWYgbm8gU2NlbmFyaW8gRGVjb3JhdG9yCisKKwkJfSAvLyBlbHNlIG5vdCBhIFNjZW5hcmlvIGRlY29yYXRvcgorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRJZGVudGlmaWFibGUKKworCXByaXZhdGUgRU9iamVjdCBnZXRUYXJnZXQoZmluYWwgTW9kZWwgbW9kZWwpIHsKKwkJRU9iamVjdCByZXRWYWx1ZSA9IG51bGw7CisJCWZvciAoRGVjb3JhdG9yIGRlY29yYXRvciA6IG1vZGVsLmdldE5vZGVEZWNvcmF0b3JzKCkpIHsKKwkJCS8vIE91ciB0YXJnZXQ/CisJCQlpZiAoZGVjb3JhdG9yLmdldFVSSSgpLmVxdWFscyh0YXJnZXRVUkkpKSB7CisJCQkJLy8gWWVzCisJCQkJcmV0VmFsdWUgPSBkZWNvcmF0b3I7CisJCQkJYnJlYWs7CisJCQl9IC8vIGlmCisJCQkKKwkJfSAvLyBmb3IgZWFjaCBEZWNvcmF0b3IKKworCQlpZihyZXRWYWx1ZSA9PSBudWxsKQorCQkJZm9yKE1vZGVsIG06bW9kZWwuZ2V0TW9kZWxzKCkpIHsKKwkJCQlyZXRWYWx1ZSA9IGdldFRhcmdldChtKTsKKwkJCQlpZihyZXRWYWx1ZSAhPSBudWxsKSBicmVhazsKKwkJCX0KKwkJCisJCS8vIEEgTm9kZSBsYWJlbD8KKwkJaWYgKHJldFZhbHVlID09IG51bGwpIHsKKwkJCWZvcihHcmFwaCBnOm1vZGVsLmdldEdyYXBocygpKSB7CisJCQkJcmV0VmFsdWUgPSBmaW5kTm9kZUxhYmVsKGcpOworCQkJCWlmKHJldFZhbHVlICE9IG51bGwpIGJyZWFrOworCQkJfQorCQl9IC8vIGlmIHJldFZhbHVlID09IG51bGwKKworCQkvLyBBbiBFZGdlIExhYmVsPworCQlpZiAocmV0VmFsdWUgPT0gbnVsbCkgeworCQkJZm9yKEdyYXBoIGc6bW9kZWwuZ2V0R3JhcGhzKCkpIHsKKwkJCQlyZXRWYWx1ZSA9IGZpbmRFZGdlTGFiZWwoZyk7CisJCQkJaWYocmV0VmFsdWUgIT0gbnVsbCkgYnJlYWs7CisJCQl9CisJCX0gLy8gaWYgcmV0VmFsdWUgPT0gbnVsbAorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAKKwkKKwlwcml2YXRlIEVPYmplY3QgZ2V0VGFyZ2V0KGZpbmFsIEdyYXBoIGdyYXBoKSB7CisJCUVPYmplY3QgcmV0VmFsdWUgPSBudWxsOworCQlmb3IgKERlY29yYXRvciBkZWNvcmF0b3IgOiBncmFwaC5nZXREZWNvcmF0b3JzKCkpIHsKKwkJCS8vIE91ciB0YXJnZXQ/CisJCQlpZiAoZGVjb3JhdG9yLmdldFVSSSgpLmVxdWFscyh0YXJnZXRVUkkpKSB7CisJCQkJLy8gWWVzCisJCQkJcmV0VmFsdWUgPSBkZWNvcmF0b3I7CisJCQkJYnJlYWs7CisJCQl9IC8vIGlmCisJCQkKKwkJfSAvLyBmb3IgZWFjaCBEZWNvcmF0b3IKKworCQkvLyBBIE5vZGUgbGFiZWw/CisJCWlmKHJldFZhbHVlID09IG51bGwpIHJldFZhbHVlID0gZmluZE5vZGVMYWJlbChncmFwaCk7CisJCWlmKHJldFZhbHVlID09IG51bGwpIHJldFZhbHVlID0gZmluZEVkZ2VMYWJlbChncmFwaCk7CisJCQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRJZGVudGlmaWFibGUKKworCisJcHJpdmF0ZSBFT2JqZWN0IGZpbmROb2RlTGFiZWwoR3JhcGggZykgeworCQlmb3IgKE5vZGVMYWJlbCBub2RlTGFiZWwgOiBnLmdldE5vZGVMYWJlbHMoKS52YWx1ZXMoKSkgeworCQkJLy8gT3VyIHRhcmdldD8KKwkJCWlmIChub2RlTGFiZWwuZ2V0VVJJKCkuZXF1YWxzKHRhcmdldFVSSSkpIHsKKwkJCQkvLyBZZXMKKwkJCQlyZXR1cm4gIG5vZGVMYWJlbDsKKwkJCX0gLy8gaWYKKwkJfSAvLyBmb3IgZWFjaCBOb2RlIExhYmVsCisJCXJldHVybiBudWxsOworCQkKKwl9CisJCisJcHJpdmF0ZSBFT2JqZWN0IGZpbmRFZGdlTGFiZWwoR3JhcGggZykgeworCQlmb3IgKEVkZ2UgZWRnZSA6IGcuZ2V0RWRnZXMoKS52YWx1ZXMoKSkgeworCQkJLy8gT3VyIHRhcmdldD8KKwkJCWlmIChlZGdlLmdldExhYmVsKCkuZ2V0VVJJKCkuZXF1YWxzKHRhcmdldFVSSSkpIHsKKwkJCQkvLyBZZXMKKwkJCQlyZXR1cm4gZWRnZS5nZXRMYWJlbCgpOworCQkJfSAvLyBpZgorCQl9IC8vIGZvciBlYWNoIEVkZ2UKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXByaXZhdGUgdm9pZCBtb2RpZnlUYXJnZXQoRU9iamVjdCB0YXJnZXQpIHsKKwkJLy8gWWVzCisJCWZvciAoRmVhdHVyZU1vZGlmaWVyIGZlYXR1cmVNb2RpZmllciA6IGdldEZlYXR1cmVNb2RpZmllcnMoKSkgeworCQkJCQorCQkJLy8gSWYgdGhlIElkZW50aWZpYWJsZSBpcyBhIHN0YXRpYyBsYWJlbCwgdGhlbiB0aGUgZmVhdHVyZSB3ZQorCQkJLy8gYXJlIG1vZGlmeWluZyBjb3VsZCBiZSBpbiB0aGUgY3VycmVudCBsYWJlbCB2YWx1ZS4gSWYgaXQgaXMKKwkJCS8vIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSB0YXJnZXQgb2YgdGhlIGZlYXR1cmUgbW9kaWZpZXIuCisJCQkvLyBTdGF0aWMgbGFiZWw/CisJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgU3RhdGljTGFiZWwpIHsKKwkJCQkvLyBZZXMKKwkJCQlmaW5hbCBTdGF0aWNMYWJlbCBzbCA9IChTdGF0aWNMYWJlbCl0YXJnZXQ7CisJCQkJdGFyZ2V0ID0gc2wuZ2V0Q3VycmVudFZhbHVlKCk7CisJCQl9CisJCQlmZWF0dXJlTW9kaWZpZXIuc2V0VGFyZ2V0KHRhcmdldCk7CisJCQlmZWF0dXJlTW9kaWZpZXIudXBkYXRlRmVhdHVyZSgpOworCQl9IC8vIGZvciBlYWNoIEZlYXR1cmVNb2RpZmllcgorCX0gLy8gbW9kaWZ5SWRlbnRpZmlhYmxlCisKKwkvKioKKwkgKiBMb29rIGluc2lkZSB0aGUgZGVjb3JhdG9ycyBmb3IgdGhlIHRhcmdldC4gVGhpcyBpcyB0byBmaW5kIHN0cmluZyB2YWx1ZXMgYW5kCisJICogZG91YmxlIHZhbHVlcy4gCisJICogQHBhcmFtIGVvYmoKKwkgKiBAcGFyYW0gdGFyZ2V0CisJICogQHJldHVybiBFT2JqZWN0IHRoZSB0YXJnZXQgaWYgZm91bmQsIG90aGVyd2lzZSBudWxsCisJICovCisJcHVibGljIEVPYmplY3QgZGVlcEZpbmRDaGlsZHJlbihFT2JqZWN0IGVvYmosIEVPYmplY3QgdGFyZ2V0KSB7CisJCWlmKGVvYmouZXF1YWxzKHRhcmdldCkpIHJldHVybiBlb2JqOworCQlmb3IoRU9iamVjdCBlbzplb2JqLmVDb250ZW50cygpKSB7CisJCQlkZWVwRmluZENoaWxkcmVuKGVvLCB0YXJnZXQpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllciNnZXRNb2RpZmljYXRpb25TdW1tYXJ5KCkKKwkgKi8KKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE1vZGlmaWNhdGlvblN1bW1hcnkoKSB7CisJCWZpbmFsIExpc3Q8U3RyaW5nPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlmb3IgKEZlYXR1cmVNb2RpZmllciBmZWF0dXJlTW9kaWZpZXIgOiBnZXRGZWF0dXJlTW9kaWZpZXJzKCkpIHsKKwkJCXJldFZhbHVlLmFkZChmZWF0dXJlTW9kaWZpZXIuZ2V0TW9kaWZpY2F0aW9uU3VtbWFyeSgpKTsKKwkJfSAvLyBmb3IgZWFjaCBGZWF0dXJlTW9kaWZpZXIKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0TW9kaWZpY2F0aW9uU3VtbWFyeQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuSWRlbnRpZmlhYmxlSW1wbCNzYW5lKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzYW5lKCkgeworCQlib29sZWFuIHJldFZhbHVlID0gc3VwZXIuc2FuZSgpOworCQlhc3NlcnQgcmV0VmFsdWU7CisKKwkJLyoKKwkJICogVGhpcyBpcyBjb21tZW50ZWQgb3V0IGJlY2F1c2Ugb2YgdGhlIGRpZmZpY3VsdHkgb2YgZHluYW1pY2FsbHkKKwkJICogY3JlYXRpbmcgYSB0ZXN0IG9iamVjdCB0aGF0IGlzIGRlcml2ZWQgZnJvbSBJZGVudGlmYWJsZS4gU28gdGhlIHRlc3QKKwkJICogb2JqZWN0IGRvZXNuJ3QgaGF2ZSBhIFVSSS4gU2VlIE1vbml0b3JUZXN0I2NyZWF0ZVRlc3RQYWNrYWdlKCkKKwkJICovCisJCS8vIHJldFZhbHVlID0gcmV0VmFsdWUgJiYgdGFyZ2V0VVJJICE9IG51bGw7CisJCS8vIGFzc2VydCByZXRWYWx1ZTsKKwkJZm9yIChGZWF0dXJlTW9kaWZpZXIgZmVhdHVyZU1vZGlmaWVyIDogZ2V0RmVhdHVyZU1vZGlmaWVycygpKSB7CisJCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIGZlYXR1cmVNb2RpZmllci5zYW5lKCk7CisJCQlhc3NlcnQgcmV0VmFsdWU7CisJCX0gLy8gZm9yIGVhY2ggRmVhdHVyZU1vZGlmaWVyCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHNhbmUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAorCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTU9ESUZJRVJfX0ZFQVRVUkVfTU9ESUZJRVJTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RmVhdHVyZU1vZGlmaWVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5NT0RJRklFUl9fVEFSR0VUX1VSSToKKwkJCQlyZXR1cm4gZ2V0VGFyZ2V0VVJJKCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5NT0RJRklFUl9fRkVBVFVSRV9NT0RJRklFUlM6CisJCQkJcmV0dXJuIGdldEZlYXR1cmVNb2RpZmllcnMoKTsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLk1PRElGSUVSX19DT01QTEVURToKKwkJCQlyZXR1cm4gaXNDb21wbGV0ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTU9ESUZJRVJfX1RBUkdFVF9VUkk6CisJCQkJc2V0VGFyZ2V0VVJJKChVUkkpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLk1PRElGSUVSX19GRUFUVVJFX01PRElGSUVSUzoKKwkJCQlnZXRGZWF0dXJlTW9kaWZpZXJzKCkuY2xlYXIoKTsKKwkJCQlnZXRGZWF0dXJlTW9kaWZpZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBGZWF0dXJlTW9kaWZpZXI+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLk1PRElGSUVSX19UQVJHRVRfVVJJOgorCQkJCXNldFRhcmdldFVSSShUQVJHRVRfVVJJX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5NT0RJRklFUl9fRkVBVFVSRV9NT0RJRklFUlM6CisJCQkJZ2V0RmVhdHVyZU1vZGlmaWVycygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTU9ESUZJRVJfX1RBUkdFVF9VUkk6CisJCQkJcmV0dXJuIFRBUkdFVF9VUklfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldFVSSSAhPSBudWxsIDogIVRBUkdFVF9VUklfRURFRkFVTFQuZXF1YWxzKHRhcmdldFVSSSk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5NT0RJRklFUl9fRkVBVFVSRV9NT0RJRklFUlM6CisJCQkJcmV0dXJuIGZlYXR1cmVNb2RpZmllcnMgIT0gbnVsbCAmJiAhZmVhdHVyZU1vZGlmaWVycy5pc0VtcHR5KCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5NT0RJRklFUl9fQ09NUExFVEU6CisJCQkJcmV0dXJuIGlzQ29tcGxldGUoKSAhPSBDT01QTEVURV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiICh0YXJnZXRVUkk6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQodGFyZ2V0VVJJKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vIE1vZGlmaWVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9Nb2RpZmllclBhY2thZ2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL01vZGlmaWVyUGFja2FnZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGM1NDAzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9Nb2RpZmllclBhY2thZ2VJbXBsLmphdmEKQEAgLTAsMCArMSwxMjk2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50UGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5pbXBsLkV4cGVyaW1lbnRQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlTk9QTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZVJhbmdlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZVNlcXVlbmNlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkZlYXR1cmVNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlck1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyTk9QTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJSYW5nZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyU2VxdWVuY2VNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ01vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nTk9QTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdSYW5nZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nU2VxdWVuY2VNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5OT1BNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuUmFuZ2VNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVOT1BNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVSYW5nZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZVNlcXVlbmNlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNlcXVlbmNlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNpbmdsZVZhbHVlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlN0cmluZ05PUE1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TdHJpbmdTZXF1ZW5jZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uaW1wbC5TY2VuYXJpb1BhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLmltcGwuU2VxdWVuY2VyUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuaW1wbC5Tb2x2ZXJQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5UcmlnZ2VyUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5pbXBsLlRyaWdnZXJQYWNrYWdlSW1wbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNb2RpZmllclBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgTW9kaWZpZXJQYWNrYWdlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBkb3VibGVOT1BNb2RpZmllckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBkb3VibGVSYW5nZU1vZGlmaWVyRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGRvdWJsZVNlcXVlbmNlTW9kaWZpZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZmVhdHVyZU1vZGlmaWVyRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGludGVnZXJOT1BNb2RpZmllckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBpbnRlZ2VyUmFuZ2VNb2RpZmllckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBpbnRlZ2VyU2VxdWVuY2VNb2RpZmllckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBsb25nTk9QTW9kaWZpZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgbG9uZ1JhbmdlTW9kaWZpZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgbG9uZ1NlcXVlbmNlTW9kaWZpZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgbW9kaWZpZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgbm9wTW9kaWZpZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcmFuZ2VNb2RpZmllckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzdGVtVGltZU5PUE1vZGlmaWVyRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHN0ZW1UaW1lUmFuZ2VNb2RpZmllckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzdGVtVGltZVNlcXVlbmNlTW9kaWZpZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc2VxdWVuY2VNb2RpZmllckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzdHJpbmdOT1BNb2RpZmllckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzdHJpbmdTZXF1ZW5jZU1vZGlmaWVyRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIG1vZGlmaWFibGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc2luZ2xlVmFsdWVNb2RpZmllckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBkb3VibGVNb2RpZmllckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBpbnRlZ2VyTW9kaWZpZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgbG9uZ01vZGlmaWVyRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHN0ZW1UaW1lTW9kaWZpZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRGF0YVR5cGUgdXJpRURhdGFUeXBlID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQorCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgorCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKKwkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcworCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCisJICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2UjZU5TX1VSSQorCSAqIEBzZWUgI2luaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIE1vZGlmaWVyUGFja2FnZUltcGwoKSB7CisJCXN1cGVyKGVOU19VUkksIE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIE1vZGlmaWVyUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KKwkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZU5TX1VSSQorCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCisJICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgTW9kaWZpZXJQYWNrYWdlIGluaXQoKSB7CisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChNb2RpZmllclBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kaWZpZXJQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKwkJTW9kaWZpZXJQYWNrYWdlSW1wbCB0aGVNb2RpZmllclBhY2thZ2UgPSAoTW9kaWZpZXJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgTW9kaWZpZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBNb2RpZmllclBhY2thZ2VJbXBsKCkpOworCisJCWlzSW5pdGVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKKwkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcworCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOworCQlFeHBlcmltZW50UGFja2FnZUltcGwgdGhlRXhwZXJpbWVudFBhY2thZ2UgPSAoRXhwZXJpbWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFeHBlcmltZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEV4cGVyaW1lbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEV4cGVyaW1lbnRQYWNrYWdlLmVOU19VUkkpIDogRXhwZXJpbWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJR3JhcGhQYWNrYWdlSW1wbCB0aGVHcmFwaFBhY2thZ2UgPSAoR3JhcGhQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoR3JhcGhQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgR3JhcGhQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEdyYXBoUGFja2FnZS5lTlNfVVJJKSA6IEdyYXBoUGFja2FnZS5lSU5TVEFOQ0UpOworCQlNb2RlbFBhY2thZ2VJbXBsIHRoZU1vZGVsUGFja2FnZSA9IChNb2RlbFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RlbFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBNb2RlbFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kZWxQYWNrYWdlLmVOU19VUkkpIDogTW9kZWxQYWNrYWdlLmVJTlNUQU5DRSk7CisJCVByZWRpY2F0ZVBhY2thZ2VJbXBsIHRoZVByZWRpY2F0ZVBhY2thZ2UgPSAoUHJlZGljYXRlUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFByZWRpY2F0ZVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBQcmVkaWNhdGVQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFByZWRpY2F0ZVBhY2thZ2UuZU5TX1VSSSkgOiBQcmVkaWNhdGVQYWNrYWdlLmVJTlNUQU5DRSk7CisJCVNjZW5hcmlvUGFja2FnZUltcGwgdGhlU2NlbmFyaW9QYWNrYWdlID0gKFNjZW5hcmlvUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNjZW5hcmlvUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFNjZW5hcmlvUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTY2VuYXJpb1BhY2thZ2UuZU5TX1VSSSkgOiBTY2VuYXJpb1BhY2thZ2UuZUlOU1RBTkNFKTsKKwkJU2VxdWVuY2VyUGFja2FnZUltcGwgdGhlU2VxdWVuY2VyUGFja2FnZSA9IChTZXF1ZW5jZXJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU2VxdWVuY2VyUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFNlcXVlbmNlclBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU2VxdWVuY2VyUGFja2FnZS5lTlNfVVJJKSA6IFNlcXVlbmNlclBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJVHJpZ2dlclBhY2thZ2VJbXBsIHRoZVRyaWdnZXJQYWNrYWdlID0gKFRyaWdnZXJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVHJpZ2dlclBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBUcmlnZ2VyUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUcmlnZ2VyUGFja2FnZS5lTlNfVVJJKSA6IFRyaWdnZXJQYWNrYWdlLmVJTlNUQU5DRSk7CisJCVNvbHZlclBhY2thZ2VJbXBsIHRoZVNvbHZlclBhY2thZ2UgPSAoU29sdmVyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNvbHZlclBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBTb2x2ZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNvbHZlclBhY2thZ2UuZU5TX1VSSSkgOiBTb2x2ZXJQYWNrYWdlLmVJTlNUQU5DRSk7CisKKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKKwkJdGhlTW9kaWZpZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVFeHBlcmltZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlR3JhcGhQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVNb2RlbFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVByZWRpY2F0ZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNjZW5hcmlvUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlU2VxdWVuY2VyUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlVHJpZ2dlclBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNvbHZlclBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQorCQl0aGVNb2RpZmllclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlRXhwZXJpbWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVHcmFwaFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVNb2RlbFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVQcmVkaWNhdGVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlU2NlbmFyaW9QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlU2VxdWVuY2VyUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVRyaWdnZXJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlU29sdmVyUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAorCQl0aGVNb2RpZmllclBhY2thZ2UuZnJlZXplKCk7CisKKyAgCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoTW9kaWZpZXJQYWNrYWdlLmVOU19VUkksIHRoZU1vZGlmaWVyUGFja2FnZSk7CisJCXJldHVybiB0aGVNb2RpZmllclBhY2thZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXREb3VibGVOT1BNb2RpZmllcigpIHsKKwkJcmV0dXJuIGRvdWJsZU5PUE1vZGlmaWVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0RG91YmxlUmFuZ2VNb2RpZmllcigpIHsKKwkJcmV0dXJuIGRvdWJsZVJhbmdlTW9kaWZpZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG91YmxlUmFuZ2VNb2RpZmllcl9TdGFydFZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZG91YmxlUmFuZ2VNb2RpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERvdWJsZVJhbmdlTW9kaWZpZXJfRW5kVmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkb3VibGVSYW5nZU1vZGlmaWVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG91YmxlUmFuZ2VNb2RpZmllcl9JbmNyZW1lbnQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkb3VibGVSYW5nZU1vZGlmaWVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG91YmxlUmFuZ2VNb2RpZmllcl9OZXh0VmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkb3VibGVSYW5nZU1vZGlmaWVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG91YmxlUmFuZ2VNb2RpZmllcl9PcmlnaW5hbFZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZG91YmxlUmFuZ2VNb2RpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0RG91YmxlU2VxdWVuY2VNb2RpZmllcigpIHsKKwkJcmV0dXJuIGRvdWJsZVNlcXVlbmNlTW9kaWZpZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG91YmxlU2VxdWVuY2VNb2RpZmllcl9TZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRvdWJsZVNlcXVlbmNlTW9kaWZpZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEZlYXR1cmVNb2RpZmllcigpIHsKKwkJcmV0dXJuIGZlYXR1cmVNb2RpZmllckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGZWF0dXJlTW9kaWZpZXJfVGFyZ2V0KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmVhdHVyZU1vZGlmaWVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RmVhdHVyZU1vZGlmaWVyX0VTdHJ1Y3R1cmFsRmVhdHVyZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWZlYXR1cmVNb2RpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEZlYXR1cmVNb2RpZmllcl9GZWF0dXJlTmFtZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWZlYXR1cmVNb2RpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEZlYXR1cmVNb2RpZmllcl9GZWF0dXJlSWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlmZWF0dXJlTW9kaWZpZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGZWF0dXJlTW9kaWZpZXJfQ3VycmVudFZhbHVlVGV4dCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWZlYXR1cmVNb2RpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEZlYXR1cmVNb2RpZmllcl9Db21wbGV0ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWZlYXR1cmVNb2RpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SW50ZWdlck5PUE1vZGlmaWVyKCkgeworCQlyZXR1cm4gaW50ZWdlck5PUE1vZGlmaWVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SW50ZWdlclJhbmdlTW9kaWZpZXIoKSB7CisJCXJldHVybiBpbnRlZ2VyUmFuZ2VNb2RpZmllckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbnRlZ2VyUmFuZ2VNb2RpZmllcl9TdGFydFZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW50ZWdlclJhbmdlTW9kaWZpZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbnRlZ2VyUmFuZ2VNb2RpZmllcl9FbmRWYWx1ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWludGVnZXJSYW5nZU1vZGlmaWVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW50ZWdlclJhbmdlTW9kaWZpZXJfSW5jcmVtZW50KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW50ZWdlclJhbmdlTW9kaWZpZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbnRlZ2VyUmFuZ2VNb2RpZmllcl9OZXh0VmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlpbnRlZ2VyUmFuZ2VNb2RpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEludGVnZXJSYW5nZU1vZGlmaWVyX09yaWdpbmFsVmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlpbnRlZ2VyUmFuZ2VNb2RpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SW50ZWdlclNlcXVlbmNlTW9kaWZpZXIoKSB7CisJCXJldHVybiBpbnRlZ2VyU2VxdWVuY2VNb2RpZmllckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbnRlZ2VyU2VxdWVuY2VNb2RpZmllcl9TZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWludGVnZXJTZXF1ZW5jZU1vZGlmaWVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRMb25nTk9QTW9kaWZpZXIoKSB7CisJCXJldHVybiBsb25nTk9QTW9kaWZpZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRMb25nUmFuZ2VNb2RpZmllcigpIHsKKwkJcmV0dXJuIGxvbmdSYW5nZU1vZGlmaWVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldExvbmdSYW5nZU1vZGlmaWVyX1N0YXJ0VmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlsb25nUmFuZ2VNb2RpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldExvbmdSYW5nZU1vZGlmaWVyX0VuZFZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9uZ1JhbmdlTW9kaWZpZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb25nUmFuZ2VNb2RpZmllcl9JbmNyZW1lbnQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlsb25nUmFuZ2VNb2RpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldExvbmdSYW5nZU1vZGlmaWVyX05leHRWYWx1ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWxvbmdSYW5nZU1vZGlmaWVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0TG9uZ1JhbmdlTW9kaWZpZXJfT3JpZ2luYWxWYWx1ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWxvbmdSYW5nZU1vZGlmaWVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRMb25nU2VxdWVuY2VNb2RpZmllcigpIHsKKwkJcmV0dXJuIGxvbmdTZXF1ZW5jZU1vZGlmaWVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldExvbmdTZXF1ZW5jZU1vZGlmaWVyX1NlcXVlbmNlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9uZ1NlcXVlbmNlTW9kaWZpZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldE1vZGlmaWVyKCkgeworCQlyZXR1cm4gbW9kaWZpZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0TW9kaWZpZXJfVGFyZ2V0VVJJKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbW9kaWZpZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNb2RpZmllcl9GZWF0dXJlTW9kaWZpZXJzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpbW9kaWZpZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNb2RpZmllcl9Db21wbGV0ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKW1vZGlmaWVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXROT1BNb2RpZmllcigpIHsKKwkJcmV0dXJuIG5vcE1vZGlmaWVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UmFuZ2VNb2RpZmllcigpIHsKKwkJcmV0dXJuIHJhbmdlTW9kaWZpZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTVEVNVGltZU5PUE1vZGlmaWVyKCkgeworCQlyZXR1cm4gc3RlbVRpbWVOT1BNb2RpZmllckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNURU1UaW1lUmFuZ2VNb2RpZmllcigpIHsKKwkJcmV0dXJuIHN0ZW1UaW1lUmFuZ2VNb2RpZmllckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTVEVNVGltZVJhbmdlTW9kaWZpZXJfU3RhcnRWYWx1ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXN0ZW1UaW1lUmFuZ2VNb2RpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNURU1UaW1lUmFuZ2VNb2RpZmllcl9FbmRWYWx1ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXN0ZW1UaW1lUmFuZ2VNb2RpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNURU1UaW1lUmFuZ2VNb2RpZmllcl9JbmNyZW1lbnQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzdGVtVGltZVJhbmdlTW9kaWZpZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTVEVNVGltZVJhbmdlTW9kaWZpZXJfTmV4dFZhbHVlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upc3RlbVRpbWVSYW5nZU1vZGlmaWVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U1RFTVRpbWVSYW5nZU1vZGlmaWVyX09yaWdpbmFsVmFsdWUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzdGVtVGltZVJhbmdlTW9kaWZpZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNURU1UaW1lU2VxdWVuY2VNb2RpZmllcigpIHsKKwkJcmV0dXJuIHN0ZW1UaW1lU2VxdWVuY2VNb2RpZmllckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJfU2VxdWVuY2UoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzdGVtVGltZVNlcXVlbmNlTW9kaWZpZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNlcXVlbmNlTW9kaWZpZXIoKSB7CisJCXJldHVybiBzZXF1ZW5jZU1vZGlmaWVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcXVlbmNlTW9kaWZpZXJfU2VxdWVuY2VTaXplKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VxdWVuY2VNb2RpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcXVlbmNlTW9kaWZpZXJfQ3VycmVudFNlcXVlbmNlSW5kZXgoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzZXF1ZW5jZU1vZGlmaWVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VxdWVuY2VNb2RpZmllcl9OZXh0VmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzZXF1ZW5jZU1vZGlmaWVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VxdWVuY2VNb2RpZmllcl9PcmlnaW5hbFZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VxdWVuY2VNb2RpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U3RyaW5nTk9QTW9kaWZpZXIoKSB7CisJCXJldHVybiBzdHJpbmdOT1BNb2RpZmllckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFN0cmluZ1NlcXVlbmNlTW9kaWZpZXIoKSB7CisJCXJldHVybiBzdHJpbmdTZXF1ZW5jZU1vZGlmaWVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFN0cmluZ1NlcXVlbmNlTW9kaWZpZXJfU2VxdWVuY2UoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzdHJpbmdTZXF1ZW5jZU1vZGlmaWVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRNb2RpZmlhYmxlKCkgeworCQlyZXR1cm4gbW9kaWZpYWJsZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNpbmdsZVZhbHVlTW9kaWZpZXIoKSB7CisJCXJldHVybiBzaW5nbGVWYWx1ZU1vZGlmaWVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0RG91YmxlTW9kaWZpZXIoKSB7CisJCXJldHVybiBkb3VibGVNb2RpZmllckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREb3VibGVNb2RpZmllcl9WYWx1ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRvdWJsZU1vZGlmaWVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG91YmxlTW9kaWZpZXJfT3JpZ2luYWxWYWx1ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRvdWJsZU1vZGlmaWVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRJbnRlZ2VyTW9kaWZpZXIoKSB7CisJCXJldHVybiBpbnRlZ2VyTW9kaWZpZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW50ZWdlck1vZGlmaWVyX1ZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW50ZWdlck1vZGlmaWVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW50ZWdlck1vZGlmaWVyX09yaWdpbmFsVmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlpbnRlZ2VyTW9kaWZpZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldExvbmdNb2RpZmllcigpIHsKKwkJcmV0dXJuIGxvbmdNb2RpZmllckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb25nTW9kaWZpZXJfVmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlsb25nTW9kaWZpZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb25nTW9kaWZpZXJfT3JpZ2luYWxWYWx1ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWxvbmdNb2RpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U1RFTVRpbWVNb2RpZmllcigpIHsKKwkJcmV0dXJuIHN0ZW1UaW1lTW9kaWZpZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U1RFTVRpbWVNb2RpZmllcl9WYWx1ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXN0ZW1UaW1lTW9kaWZpZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTVEVNVGltZU1vZGlmaWVyX09yaWdpbmFsVmFsdWUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzdGVtVGltZU1vZGlmaWVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVEYXRhVHlwZSBnZXRVUkkoKSB7CisJCXJldHVybiB1cmlFRGF0YVR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1vZGlmaWVyRmFjdG9yeSBnZXRNb2RpZmllckZhY3RvcnkoKSB7CisJCXJldHVybiAoTW9kaWZpZXJGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKKwkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47CisJCWlzQ3JlYXRlZCA9IHRydWU7CisKKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCisJCWRvdWJsZU5PUE1vZGlmaWVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKERPVUJMRV9OT1BfTU9ESUZJRVIpOworCisJCWRvdWJsZVJhbmdlTW9kaWZpZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRE9VQkxFX1JBTkdFX01PRElGSUVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkb3VibGVSYW5nZU1vZGlmaWVyRUNsYXNzLCBET1VCTEVfUkFOR0VfTU9ESUZJRVJfX1NUQVJUX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkb3VibGVSYW5nZU1vZGlmaWVyRUNsYXNzLCBET1VCTEVfUkFOR0VfTU9ESUZJRVJfX0VORF9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZG91YmxlUmFuZ2VNb2RpZmllckVDbGFzcywgRE9VQkxFX1JBTkdFX01PRElGSUVSX19JTkNSRU1FTlQpOworCQljcmVhdGVFQXR0cmlidXRlKGRvdWJsZVJhbmdlTW9kaWZpZXJFQ2xhc3MsIERPVUJMRV9SQU5HRV9NT0RJRklFUl9fTkVYVF9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZG91YmxlUmFuZ2VNb2RpZmllckVDbGFzcywgRE9VQkxFX1JBTkdFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSk7CisKKwkJZG91YmxlU2VxdWVuY2VNb2RpZmllckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhET1VCTEVfU0VRVUVOQ0VfTU9ESUZJRVIpOworCQljcmVhdGVFQXR0cmlidXRlKGRvdWJsZVNlcXVlbmNlTW9kaWZpZXJFQ2xhc3MsIERPVUJMRV9TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0UpOworCisJCWZlYXR1cmVNb2RpZmllckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGRUFUVVJFX01PRElGSUVSKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShmZWF0dXJlTW9kaWZpZXJFQ2xhc3MsIEZFQVRVUkVfTU9ESUZJRVJfX1RBUkdFVCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZmVhdHVyZU1vZGlmaWVyRUNsYXNzLCBGRUFUVVJFX01PRElGSUVSX19FU1RSVUNUVVJBTF9GRUFUVVJFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShmZWF0dXJlTW9kaWZpZXJFQ2xhc3MsIEZFQVRVUkVfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZmVhdHVyZU1vZGlmaWVyRUNsYXNzLCBGRUFUVVJFX01PRElGSUVSX19GRUFUVVJFX0lEKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShmZWF0dXJlTW9kaWZpZXJFQ2xhc3MsIEZFQVRVUkVfTU9ESUZJRVJfX0NVUlJFTlRfVkFMVUVfVEVYVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZmVhdHVyZU1vZGlmaWVyRUNsYXNzLCBGRUFUVVJFX01PRElGSUVSX19DT01QTEVURSk7CisKKwkJaW50ZWdlck5PUE1vZGlmaWVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOVEVHRVJfTk9QX01PRElGSUVSKTsKKworCQlpbnRlZ2VyUmFuZ2VNb2RpZmllckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTlRFR0VSX1JBTkdFX01PRElGSUVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShpbnRlZ2VyUmFuZ2VNb2RpZmllckVDbGFzcywgSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fU1RBUlRfVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKGludGVnZXJSYW5nZU1vZGlmaWVyRUNsYXNzLCBJTlRFR0VSX1JBTkdFX01PRElGSUVSX19FTkRfVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKGludGVnZXJSYW5nZU1vZGlmaWVyRUNsYXNzLCBJTlRFR0VSX1JBTkdFX01PRElGSUVSX19JTkNSRU1FTlQpOworCQljcmVhdGVFQXR0cmlidXRlKGludGVnZXJSYW5nZU1vZGlmaWVyRUNsYXNzLCBJTlRFR0VSX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShpbnRlZ2VyUmFuZ2VNb2RpZmllckVDbGFzcywgSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUpOworCisJCWludGVnZXJTZXF1ZW5jZU1vZGlmaWVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOVEVHRVJfU0VRVUVOQ0VfTU9ESUZJRVIpOworCQljcmVhdGVFQXR0cmlidXRlKGludGVnZXJTZXF1ZW5jZU1vZGlmaWVyRUNsYXNzLCBJTlRFR0VSX1NFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRSk7CisKKwkJbG9uZ05PUE1vZGlmaWVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKExPTkdfTk9QX01PRElGSUVSKTsKKworCQlsb25nUmFuZ2VNb2RpZmllckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT05HX1JBTkdFX01PRElGSUVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShsb25nUmFuZ2VNb2RpZmllckVDbGFzcywgTE9OR19SQU5HRV9NT0RJRklFUl9fU1RBUlRfVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKGxvbmdSYW5nZU1vZGlmaWVyRUNsYXNzLCBMT05HX1JBTkdFX01PRElGSUVSX19FTkRfVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKGxvbmdSYW5nZU1vZGlmaWVyRUNsYXNzLCBMT05HX1JBTkdFX01PRElGSUVSX19JTkNSRU1FTlQpOworCQljcmVhdGVFQXR0cmlidXRlKGxvbmdSYW5nZU1vZGlmaWVyRUNsYXNzLCBMT05HX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShsb25nUmFuZ2VNb2RpZmllckVDbGFzcywgTE9OR19SQU5HRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUpOworCisJCWxvbmdTZXF1ZW5jZU1vZGlmaWVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKExPTkdfU0VRVUVOQ0VfTU9ESUZJRVIpOworCQljcmVhdGVFQXR0cmlidXRlKGxvbmdTZXF1ZW5jZU1vZGlmaWVyRUNsYXNzLCBMT05HX1NFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRSk7CisKKwkJbW9kaWZpZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTU9ESUZJRVIpOworCQljcmVhdGVFQXR0cmlidXRlKG1vZGlmaWVyRUNsYXNzLCBNT0RJRklFUl9fVEFSR0VUX1VSSSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UobW9kaWZpZXJFQ2xhc3MsIE1PRElGSUVSX19GRUFUVVJFX01PRElGSUVSUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUobW9kaWZpZXJFQ2xhc3MsIE1PRElGSUVSX19DT01QTEVURSk7CisKKwkJbm9wTW9kaWZpZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTk9QX01PRElGSUVSKTsKKworCQlyYW5nZU1vZGlmaWVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJBTkdFX01PRElGSUVSKTsKKworCQlzdGVtVGltZU5PUE1vZGlmaWVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNURU1fVElNRV9OT1BfTU9ESUZJRVIpOworCisJCXN0ZW1UaW1lUmFuZ2VNb2RpZmllckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVIpOworCQljcmVhdGVFUmVmZXJlbmNlKHN0ZW1UaW1lUmFuZ2VNb2RpZmllckVDbGFzcywgU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19TVEFSVF9WQUxVRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc3RlbVRpbWVSYW5nZU1vZGlmaWVyRUNsYXNzLCBTVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfX0VORF9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc3RlbVRpbWVSYW5nZU1vZGlmaWVyRUNsYXNzLCBTVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfX0lOQ1JFTUVOVCk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc3RlbVRpbWVSYW5nZU1vZGlmaWVyRUNsYXNzLCBTVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfX05FWFRfVkFMVUUpOworCQljcmVhdGVFUmVmZXJlbmNlKHN0ZW1UaW1lUmFuZ2VNb2RpZmllckVDbGFzcywgU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSk7CisKKwkJc3RlbVRpbWVTZXF1ZW5jZU1vZGlmaWVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNURU1fVElNRV9TRVFVRU5DRV9NT0RJRklFUik7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc3RlbVRpbWVTZXF1ZW5jZU1vZGlmaWVyRUNsYXNzLCBTVEVNX1RJTUVfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFKTsKKworCQlzZXF1ZW5jZU1vZGlmaWVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUVVFTkNFX01PRElGSUVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzZXF1ZW5jZU1vZGlmaWVyRUNsYXNzLCBTRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0VfU0laRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc2VxdWVuY2VNb2RpZmllckVDbGFzcywgU0VRVUVOQ0VfTU9ESUZJRVJfX0NVUlJFTlRfU0VRVUVOQ0VfSU5ERVgpOworCQljcmVhdGVFQXR0cmlidXRlKHNlcXVlbmNlTW9kaWZpZXJFQ2xhc3MsIFNFUVVFTkNFX01PRElGSUVSX19ORVhUX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzZXF1ZW5jZU1vZGlmaWVyRUNsYXNzLCBTRVFVRU5DRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUpOworCisJCXN0cmluZ05PUE1vZGlmaWVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNUUklOR19OT1BfTU9ESUZJRVIpOworCisJCXN0cmluZ1NlcXVlbmNlTW9kaWZpZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1RSSU5HX1NFUVVFTkNFX01PRElGSUVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzdHJpbmdTZXF1ZW5jZU1vZGlmaWVyRUNsYXNzLCBTVFJJTkdfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFKTsKKworCQltb2RpZmlhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1PRElGSUFCTEUpOworCisJCXNpbmdsZVZhbHVlTW9kaWZpZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0lOR0xFX1ZBTFVFX01PRElGSUVSKTsKKworCQlkb3VibGVNb2RpZmllckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhET1VCTEVfTU9ESUZJRVIpOworCQljcmVhdGVFQXR0cmlidXRlKGRvdWJsZU1vZGlmaWVyRUNsYXNzLCBET1VCTEVfTU9ESUZJRVJfX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkb3VibGVNb2RpZmllckVDbGFzcywgRE9VQkxFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSk7CisKKwkJaW50ZWdlck1vZGlmaWVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOVEVHRVJfTU9ESUZJRVIpOworCQljcmVhdGVFQXR0cmlidXRlKGludGVnZXJNb2RpZmllckVDbGFzcywgSU5URUdFUl9NT0RJRklFUl9fVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKGludGVnZXJNb2RpZmllckVDbGFzcywgSU5URUdFUl9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUpOworCisJCWxvbmdNb2RpZmllckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT05HX01PRElGSUVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShsb25nTW9kaWZpZXJFQ2xhc3MsIExPTkdfTU9ESUZJRVJfX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShsb25nTW9kaWZpZXJFQ2xhc3MsIExPTkdfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFKTsKKworCQlzdGVtVGltZU1vZGlmaWVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNURU1fVElNRV9NT0RJRklFUik7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc3RlbVRpbWVNb2RpZmllckVDbGFzcywgU1RFTV9USU1FX01PRElGSUVSX19WQUxVRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc3RlbVRpbWVNb2RpZmllckVDbGFzcywgU1RFTV9USU1FX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSk7CisKKwkJLy8gQ3JlYXRlIGRhdGEgdHlwZXMKKwkJdXJpRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFVSSSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOworCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKKwkJc2V0TmFtZShlTkFNRSk7CisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOworCQlzZXROc1VSSShlTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCisJCUVjb3JlUGFja2FnZSB0aGVFY29yZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKKwkJTW9kZWxQYWNrYWdlIHRoZU1vZGVsUGFja2FnZSA9IChNb2RlbFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kZWxQYWNrYWdlLmVOU19VUkkpOworCQlTY2VuYXJpb1BhY2thZ2UgdGhlU2NlbmFyaW9QYWNrYWdlID0gKFNjZW5hcmlvUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTY2VuYXJpb1BhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycworCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycworCisJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJZG91YmxlTk9QTW9kaWZpZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROT1BNb2RpZmllcigpKTsKKwkJZG91YmxlUmFuZ2VNb2RpZmllckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJhbmdlTW9kaWZpZXIoKSk7CisJCWRvdWJsZVNlcXVlbmNlTW9kaWZpZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTZXF1ZW5jZU1vZGlmaWVyKCkpOworCQlpbnRlZ2VyTk9QTW9kaWZpZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROT1BNb2RpZmllcigpKTsKKwkJaW50ZWdlclJhbmdlTW9kaWZpZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSYW5nZU1vZGlmaWVyKCkpOworCQlpbnRlZ2VyU2VxdWVuY2VNb2RpZmllckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNlcXVlbmNlTW9kaWZpZXIoKSk7CisJCWxvbmdOT1BNb2RpZmllckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5PUE1vZGlmaWVyKCkpOworCQlsb25nUmFuZ2VNb2RpZmllckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJhbmdlTW9kaWZpZXIoKSk7CisJCWxvbmdTZXF1ZW5jZU1vZGlmaWVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U2VxdWVuY2VNb2RpZmllcigpKTsKKwkJbW9kaWZpZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlTW9kZWxQYWNrYWdlLmdldERlY29yYXRvcigpKTsKKwkJbm9wTW9kaWZpZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGZWF0dXJlTW9kaWZpZXIoKSk7CisJCXJhbmdlTW9kaWZpZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGZWF0dXJlTW9kaWZpZXIoKSk7CisJCXN0ZW1UaW1lTk9QTW9kaWZpZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROT1BNb2RpZmllcigpKTsKKwkJc3RlbVRpbWVSYW5nZU1vZGlmaWVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UmFuZ2VNb2RpZmllcigpKTsKKwkJc3RlbVRpbWVTZXF1ZW5jZU1vZGlmaWVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U2VxdWVuY2VNb2RpZmllcigpKTsKKwkJc2VxdWVuY2VNb2RpZmllckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEZlYXR1cmVNb2RpZmllcigpKTsKKwkJc3RyaW5nTk9QTW9kaWZpZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROT1BNb2RpZmllcigpKTsKKwkJc3RyaW5nU2VxdWVuY2VNb2RpZmllckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNlcXVlbmNlTW9kaWZpZXIoKSk7CisJCXNpbmdsZVZhbHVlTW9kaWZpZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGZWF0dXJlTW9kaWZpZXIoKSk7CisJCWRvdWJsZU1vZGlmaWVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U2luZ2xlVmFsdWVNb2RpZmllcigpKTsKKwkJaW50ZWdlck1vZGlmaWVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U2luZ2xlVmFsdWVNb2RpZmllcigpKTsKKwkJbG9uZ01vZGlmaWVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U2luZ2xlVmFsdWVNb2RpZmllcigpKTsKKwkJc3RlbVRpbWVNb2RpZmllckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNpbmdsZVZhbHVlTW9kaWZpZXIoKSk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKwkJaW5pdEVDbGFzcyhkb3VibGVOT1BNb2RpZmllckVDbGFzcywgRG91YmxlTk9QTW9kaWZpZXIuY2xhc3MsICJEb3VibGVOT1BNb2RpZmllciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MoZG91YmxlUmFuZ2VNb2RpZmllckVDbGFzcywgRG91YmxlUmFuZ2VNb2RpZmllci5jbGFzcywgIkRvdWJsZVJhbmdlTW9kaWZpZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RG91YmxlUmFuZ2VNb2RpZmllcl9TdGFydFZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJzdGFydFZhbHVlIiwgIi05OTk5OTk5OS4wIiwgMCwgMSwgRG91YmxlUmFuZ2VNb2RpZmllci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldERvdWJsZVJhbmdlTW9kaWZpZXJfRW5kVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImVuZFZhbHVlIiwgIi05OTk5OTk5OS4wIiwgMCwgMSwgRG91YmxlUmFuZ2VNb2RpZmllci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldERvdWJsZVJhbmdlTW9kaWZpZXJfSW5jcmVtZW50KCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJpbmNyZW1lbnQiLCAiLTk5OTk5OTk5LjAiLCAwLCAxLCBEb3VibGVSYW5nZU1vZGlmaWVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RG91YmxlUmFuZ2VNb2RpZmllcl9OZXh0VmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgIm5leHRWYWx1ZSIsICIwLjAiLCAwLCAxLCBEb3VibGVSYW5nZU1vZGlmaWVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RG91YmxlUmFuZ2VNb2RpZmllcl9PcmlnaW5hbFZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJvcmlnaW5hbFZhbHVlIiwgbnVsbCwgMCwgMSwgRG91YmxlUmFuZ2VNb2RpZmllci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MoZG91YmxlU2VxdWVuY2VNb2RpZmllckVDbGFzcywgRG91YmxlU2VxdWVuY2VNb2RpZmllci5jbGFzcywgIkRvdWJsZVNlcXVlbmNlTW9kaWZpZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RG91YmxlU2VxdWVuY2VNb2RpZmllcl9TZXF1ZW5jZSgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZU9iamVjdCgpLCAic2VxdWVuY2UiLCBudWxsLCAwLCAtMSwgRG91YmxlU2VxdWVuY2VNb2RpZmllci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MoZmVhdHVyZU1vZGlmaWVyRUNsYXNzLCBGZWF0dXJlTW9kaWZpZXIuY2xhc3MsICJGZWF0dXJlTW9kaWZpZXIiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRGZWF0dXJlTW9kaWZpZXJfVGFyZ2V0KCksIHRoZUVjb3JlUGFja2FnZS5nZXRFT2JqZWN0KCksIG51bGwsICJ0YXJnZXQiLCBudWxsLCAwLCAxLCBGZWF0dXJlTW9kaWZpZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RmVhdHVyZU1vZGlmaWVyX0VTdHJ1Y3R1cmFsRmVhdHVyZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCksIG51bGwsICJlU3RydWN0dXJhbEZlYXR1cmUiLCBudWxsLCAwLCAxLCBGZWF0dXJlTW9kaWZpZXIuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmVhdHVyZU1vZGlmaWVyX0ZlYXR1cmVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJmZWF0dXJlTmFtZSIsIG51bGwsIDAsIDEsIEZlYXR1cmVNb2RpZmllci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRGZWF0dXJlTW9kaWZpZXJfRmVhdHVyZUlkKCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJmZWF0dXJlSWQiLCBudWxsLCAwLCAxLCBGZWF0dXJlTW9kaWZpZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmVhdHVyZU1vZGlmaWVyX0N1cnJlbnRWYWx1ZVRleHQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImN1cnJlbnRWYWx1ZVRleHQiLCBudWxsLCAwLCAxLCBGZWF0dXJlTW9kaWZpZXIuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmVhdHVyZU1vZGlmaWVyX0NvbXBsZXRlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiY29tcGxldGUiLCBudWxsLCAwLCAxLCBGZWF0dXJlTW9kaWZpZXIuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWFkZEVPcGVyYXRpb24oZmVhdHVyZU1vZGlmaWVyRUNsYXNzLCBudWxsLCAidXBkYXRlRmVhdHVyZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlhZGRFT3BlcmF0aW9uKGZlYXR1cmVNb2RpZmllckVDbGFzcywgbnVsbCwgInJlc2V0IiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MoaW50ZWdlck5PUE1vZGlmaWVyRUNsYXNzLCBJbnRlZ2VyTk9QTW9kaWZpZXIuY2xhc3MsICJJbnRlZ2VyTk9QTW9kaWZpZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGludGVnZXJSYW5nZU1vZGlmaWVyRUNsYXNzLCBJbnRlZ2VyUmFuZ2VNb2RpZmllci5jbGFzcywgIkludGVnZXJSYW5nZU1vZGlmaWVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEludGVnZXJSYW5nZU1vZGlmaWVyX1N0YXJ0VmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgInN0YXJ0VmFsdWUiLCAiLTk5OTk5OTk5IiwgMCwgMSwgSW50ZWdlclJhbmdlTW9kaWZpZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RUF0dHJpYnV0ZShnZXRJbnRlZ2VyUmFuZ2VNb2RpZmllcl9FbmRWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAiZW5kVmFsdWUiLCAiLTk5OTk5OTk5IiwgMCwgMSwgSW50ZWdlclJhbmdlTW9kaWZpZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RUF0dHJpYnV0ZShnZXRJbnRlZ2VyUmFuZ2VNb2RpZmllcl9JbmNyZW1lbnQoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgImluY3JlbWVudCIsICItOTk5OTk5OTkiLCAwLCAxLCBJbnRlZ2VyUmFuZ2VNb2RpZmllci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldEludGVnZXJSYW5nZU1vZGlmaWVyX05leHRWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAibmV4dFZhbHVlIiwgIi05OTk5OTk5OSIsIDAsIDEsIEludGVnZXJSYW5nZU1vZGlmaWVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW50ZWdlclJhbmdlTW9kaWZpZXJfT3JpZ2luYWxWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAib3JpZ2luYWxWYWx1ZSIsIG51bGwsIDAsIDEsIEludGVnZXJSYW5nZU1vZGlmaWVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhpbnRlZ2VyU2VxdWVuY2VNb2RpZmllckVDbGFzcywgSW50ZWdlclNlcXVlbmNlTW9kaWZpZXIuY2xhc3MsICJJbnRlZ2VyU2VxdWVuY2VNb2RpZmllciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRJbnRlZ2VyU2VxdWVuY2VNb2RpZmllcl9TZXF1ZW5jZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUludGVnZXJPYmplY3QoKSwgInNlcXVlbmNlIiwgbnVsbCwgMCwgLTEsIEludGVnZXJTZXF1ZW5jZU1vZGlmaWVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhsb25nTk9QTW9kaWZpZXJFQ2xhc3MsIExvbmdOT1BNb2RpZmllci5jbGFzcywgIkxvbmdOT1BNb2RpZmllciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MobG9uZ1JhbmdlTW9kaWZpZXJFQ2xhc3MsIExvbmdSYW5nZU1vZGlmaWVyLmNsYXNzLCAiTG9uZ1JhbmdlTW9kaWZpZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9uZ1JhbmdlTW9kaWZpZXJfU3RhcnRWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUxvbmcoKSwgInN0YXJ0VmFsdWUiLCAiLTk5OTk5OTk5IiwgMCwgMSwgTG9uZ1JhbmdlTW9kaWZpZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RUF0dHJpYnV0ZShnZXRMb25nUmFuZ2VNb2RpZmllcl9FbmRWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUxvbmcoKSwgImVuZFZhbHVlIiwgIi05OTk5OTk5OSIsIDAsIDEsIExvbmdSYW5nZU1vZGlmaWVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9uZ1JhbmdlTW9kaWZpZXJfSW5jcmVtZW50KCksIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAiaW5jcmVtZW50IiwgIi05OTk5OTk5OSIsIDAsIDEsIExvbmdSYW5nZU1vZGlmaWVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9uZ1JhbmdlTW9kaWZpZXJfTmV4dFZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAibmV4dFZhbHVlIiwgIi05OTk5OTk5OSIsIDAsIDEsIExvbmdSYW5nZU1vZGlmaWVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9uZ1JhbmdlTW9kaWZpZXJfT3JpZ2luYWxWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUxvbmcoKSwgIm9yaWdpbmFsVmFsdWUiLCAiLTk5OTk5OTk5IiwgMCwgMSwgTG9uZ1JhbmdlTW9kaWZpZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCWluaXRFQ2xhc3MobG9uZ1NlcXVlbmNlTW9kaWZpZXJFQ2xhc3MsIExvbmdTZXF1ZW5jZU1vZGlmaWVyLmNsYXNzLCAiTG9uZ1NlcXVlbmNlTW9kaWZpZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9uZ1NlcXVlbmNlTW9kaWZpZXJfU2VxdWVuY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVMb25nT2JqZWN0KCksICJzZXF1ZW5jZSIsIG51bGwsIDAsIC0xLCBMb25nU2VxdWVuY2VNb2RpZmllci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MobW9kaWZpZXJFQ2xhc3MsIE1vZGlmaWVyLmNsYXNzLCAiTW9kaWZpZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kaWZpZXJfVGFyZ2V0VVJJKCksIHRoaXMuZ2V0VVJJKCksICJ0YXJnZXRVUkkiLCBudWxsLCAwLCAxLCBNb2RpZmllci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRNb2RpZmllcl9GZWF0dXJlTW9kaWZpZXJzKCksIHRoaXMuZ2V0RmVhdHVyZU1vZGlmaWVyKCksIG51bGwsICJmZWF0dXJlTW9kaWZpZXJzIiwgbnVsbCwgMCwgLTEsIE1vZGlmaWVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldE1vZGlmaWVyX0NvbXBsZXRlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiY29tcGxldGUiLCBudWxsLCAwLCAxLCBNb2RpZmllci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJRU9wZXJhdGlvbiBvcCA9IGFkZEVPcGVyYXRpb24obW9kaWZpZXJFQ2xhc3MsIG51bGwsICJ1cGRhdGVTY2VuYXJpbyIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgdGhlU2NlbmFyaW9QYWNrYWdlLmdldFNjZW5hcmlvKCksICJiYXNlU2NlbmFyaW8iLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJYWRkRU9wZXJhdGlvbihtb2RpZmllckVDbGFzcywgbnVsbCwgInJlc2V0IiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3Mobm9wTW9kaWZpZXJFQ2xhc3MsIE5PUE1vZGlmaWVyLmNsYXNzLCAiTk9QTW9kaWZpZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHJhbmdlTW9kaWZpZXJFQ2xhc3MsIFJhbmdlTW9kaWZpZXIuY2xhc3MsICJSYW5nZU1vZGlmaWVyIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHN0ZW1UaW1lTk9QTW9kaWZpZXJFQ2xhc3MsIFNURU1UaW1lTk9QTW9kaWZpZXIuY2xhc3MsICJTVEVNVGltZU5PUE1vZGlmaWVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzdGVtVGltZVJhbmdlTW9kaWZpZXJFQ2xhc3MsIFNURU1UaW1lUmFuZ2VNb2RpZmllci5jbGFzcywgIlNURU1UaW1lUmFuZ2VNb2RpZmllciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRTVEVNVGltZVJhbmdlTW9kaWZpZXJfU3RhcnRWYWx1ZSgpLCB0aGVNb2RlbFBhY2thZ2UuZ2V0U1RFTVRpbWUoKSwgbnVsbCwgInN0YXJ0VmFsdWUiLCBudWxsLCAwLCAxLCBTVEVNVGltZVJhbmdlTW9kaWZpZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U1RFTVRpbWVSYW5nZU1vZGlmaWVyX0VuZFZhbHVlKCksIHRoZU1vZGVsUGFja2FnZS5nZXRTVEVNVGltZSgpLCBudWxsLCAiZW5kVmFsdWUiLCBudWxsLCAwLCAxLCBTVEVNVGltZVJhbmdlTW9kaWZpZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U1RFTVRpbWVSYW5nZU1vZGlmaWVyX0luY3JlbWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RUxvbmcoKSwgImluY3JlbWVudCIsIG51bGwsIDAsIDEsIFNURU1UaW1lUmFuZ2VNb2RpZmllci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRTVEVNVGltZVJhbmdlTW9kaWZpZXJfTmV4dFZhbHVlKCksIHRoZU1vZGVsUGFja2FnZS5nZXRTVEVNVGltZSgpLCBudWxsLCAibmV4dFZhbHVlIiwgbnVsbCwgMCwgMSwgU1RFTVRpbWVSYW5nZU1vZGlmaWVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFNURU1UaW1lUmFuZ2VNb2RpZmllcl9PcmlnaW5hbFZhbHVlKCksIHRoZU1vZGVsUGFja2FnZS5nZXRTVEVNVGltZSgpLCBudWxsLCAib3JpZ2luYWxWYWx1ZSIsIG51bGwsIDAsIDEsIFNURU1UaW1lUmFuZ2VNb2RpZmllci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3Moc3RlbVRpbWVTZXF1ZW5jZU1vZGlmaWVyRUNsYXNzLCBTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXIuY2xhc3MsICJTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyX1NlcXVlbmNlKCksIHRoZU1vZGVsUGFja2FnZS5nZXRTVEVNVGltZSgpLCBudWxsLCAic2VxdWVuY2UiLCBudWxsLCAwLCAtMSwgU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzZXF1ZW5jZU1vZGlmaWVyRUNsYXNzLCBTZXF1ZW5jZU1vZGlmaWVyLmNsYXNzLCAiU2VxdWVuY2VNb2RpZmllciIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFNlcXVlbmNlTW9kaWZpZXJfU2VxdWVuY2VTaXplKCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJzZXF1ZW5jZVNpemUiLCBudWxsLCAwLCAxLCBTZXF1ZW5jZU1vZGlmaWVyLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VxdWVuY2VNb2RpZmllcl9DdXJyZW50U2VxdWVuY2VJbmRleCgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAiY3VycmVudFNlcXVlbmNlSW5kZXgiLCAiMCIsIDAsIDEsIFNlcXVlbmNlTW9kaWZpZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTZXF1ZW5jZU1vZGlmaWVyX05leHRWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUphdmFPYmplY3QoKSwgIm5leHRWYWx1ZSIsIG51bGwsIDAsIDEsIFNlcXVlbmNlTW9kaWZpZXIuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFNlcXVlbmNlTW9kaWZpZXJfT3JpZ2luYWxWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUphdmFPYmplY3QoKSwgIm9yaWdpbmFsVmFsdWUiLCBudWxsLCAwLCAxLCBTZXF1ZW5jZU1vZGlmaWVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzdHJpbmdOT1BNb2RpZmllckVDbGFzcywgU3RyaW5nTk9QTW9kaWZpZXIuY2xhc3MsICJTdHJpbmdOT1BNb2RpZmllciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3Moc3RyaW5nU2VxdWVuY2VNb2RpZmllckVDbGFzcywgU3RyaW5nU2VxdWVuY2VNb2RpZmllci5jbGFzcywgIlN0cmluZ1NlcXVlbmNlTW9kaWZpZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U3RyaW5nU2VxdWVuY2VNb2RpZmllcl9TZXF1ZW5jZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2VxdWVuY2UiLCBudWxsLCAwLCAtMSwgU3RyaW5nU2VxdWVuY2VNb2RpZmllci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MobW9kaWZpYWJsZUVDbGFzcywgTW9kaWZpYWJsZS5jbGFzcywgIk1vZGlmaWFibGUiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzaW5nbGVWYWx1ZU1vZGlmaWVyRUNsYXNzLCBTaW5nbGVWYWx1ZU1vZGlmaWVyLmNsYXNzLCAiU2luZ2xlVmFsdWVNb2RpZmllciIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhkb3VibGVNb2RpZmllckVDbGFzcywgRG91YmxlTW9kaWZpZXIuY2xhc3MsICJEb3VibGVNb2RpZmllciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXREb3VibGVNb2RpZmllcl9WYWx1ZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBEb3VibGVNb2RpZmllci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXREb3VibGVNb2RpZmllcl9PcmlnaW5hbFZhbHVlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJvcmlnaW5hbFZhbHVlIiwgbnVsbCwgMCwgMSwgRG91YmxlTW9kaWZpZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGludGVnZXJNb2RpZmllckVDbGFzcywgSW50ZWdlck1vZGlmaWVyLmNsYXNzLCAiSW50ZWdlck1vZGlmaWVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEludGVnZXJNb2RpZmllcl9WYWx1ZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUludCgpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBJbnRlZ2VyTW9kaWZpZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW50ZWdlck1vZGlmaWVyX09yaWdpbmFsVmFsdWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgIm9yaWdpbmFsVmFsdWUiLCBudWxsLCAwLCAxLCBJbnRlZ2VyTW9kaWZpZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGxvbmdNb2RpZmllckVDbGFzcywgTG9uZ01vZGlmaWVyLmNsYXNzLCAiTG9uZ01vZGlmaWVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldExvbmdNb2RpZmllcl9WYWx1ZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUxvbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgTG9uZ01vZGlmaWVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldExvbmdNb2RpZmllcl9PcmlnaW5hbFZhbHVlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAib3JpZ2luYWxWYWx1ZSIsIG51bGwsIDAsIDEsIExvbmdNb2RpZmllci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3Moc3RlbVRpbWVNb2RpZmllckVDbGFzcywgU1RFTVRpbWVNb2RpZmllci5jbGFzcywgIlNURU1UaW1lTW9kaWZpZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U1RFTVRpbWVNb2RpZmllcl9WYWx1ZSgpLCB0aGVNb2RlbFBhY2thZ2UuZ2V0U1RFTVRpbWUoKSwgbnVsbCwgInZhbHVlIiwgbnVsbCwgMCwgMSwgU1RFTVRpbWVNb2RpZmllci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRTVEVNVGltZU1vZGlmaWVyX09yaWdpbmFsVmFsdWUoKSwgdGhlTW9kZWxQYWNrYWdlLmdldFNURU1UaW1lKCksIG51bGwsICJvcmlnaW5hbFZhbHVlIiwgbnVsbCwgMCwgMSwgU1RFTVRpbWVNb2RpZmllci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcworCQlpbml0RURhdGFUeXBlKHVyaUVEYXRhVHlwZSwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSS5jbGFzcywgIlVSSSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBDcmVhdGUgcmVzb3VyY2UKKwkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJfQorCit9IC8vTW9kaWZpZXJQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9OT1BNb2RpZmllckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvTk9QTW9kaWZpZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUyZDJmZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvTk9QTW9kaWZpZXJJbXBsLmphdmEKQEAgLTAsMCArMSw2OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk5PUE1vZGlmaWVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OT1AgTW9kaWZpZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBOT1BNb2RpZmllckltcGwgZXh0ZW5kcyBGZWF0dXJlTW9kaWZpZXJJbXBsIGltcGxlbWVudHMKKwkJTk9QTW9kaWZpZXIgeworCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkZlYXR1cmVNb2RpZmllciNyZXNldCgpCisJICovCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCS8vIE5vdGhpbmcgdG8gZG8JCQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTk9QTW9kaWZpZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRmVhdHVyZU1vZGlmaWVySW1wbCNpc0NvbXBsZXRlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkZlYXR1cmVNb2RpZmllckltcGwjdXBkYXRlRmVhdHVyZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGVGZWF0dXJlKCkgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLk5PUF9NT0RJRklFUjsKKwl9CisKK30gLy8gTk9QTW9kaWZpZXJJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL1JhbmdlTW9kaWZpZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL1JhbmdlTW9kaWZpZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0NzFmOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvUmFuZ2VNb2RpZmllckltcGwuamF2YQpAQCAtMCwwICsxLDczIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuUmFuZ2VNb2RpZmllcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJhbmdlIE1vZGlmaWVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmFuZ2VNb2RpZmllckltcGwgZXh0ZW5kcyBGZWF0dXJlTW9kaWZpZXJJbXBsIGltcGxlbWVudHMgUmFuZ2VNb2RpZmllciB7CisJCisKKwkvKioKKwkgKiBJZiA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIHRoZSBtb2RpZmllciBoYXMgY29tcGxldGVkCisJICogQHNlZSBEb3VibGVSYW5nZU1vZGlmaWVySW1wbCNnZXROZXh0VmFsdWUoKQorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGNvbXBsZXRlID0gZmFsc2U7CisKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUmFuZ2VNb2RpZmllckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5GZWF0dXJlTW9kaWZpZXJJbXBsI2lzQ29tcGxldGUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7CisJCXJldHVybiBjb21wbGV0ZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkZlYXR1cmVNb2RpZmllckltcGwjcmVzZXQoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQljb21wbGV0ZSA9IGZhbHNlOwkJCisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuUkFOR0VfTU9ESUZJRVI7CisJfQorCit9IC8vUmFuZ2VNb2RpZmllckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvU1RFTVRpbWVNb2RpZmllckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvU1RFTVRpbWVNb2RpZmllckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzQ4MmNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9TVEVNVGltZU1vZGlmaWVySW1wbC5qYXZhCkBAIC0wLDAgKzEsMjU0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVNb2RpZmllcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNURU0gVGltZSBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU1RFTVRpbWVNb2RpZmllckltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TVEVNVGltZU1vZGlmaWVySW1wbCNnZXRPcmlnaW5hbFZhbHVlIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNURU1UaW1lTW9kaWZpZXJJbXBsIGV4dGVuZHMgU2luZ2xlVmFsdWVNb2RpZmllckltcGwgaW1wbGVtZW50cyBTVEVNVGltZU1vZGlmaWVyIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTVEVNVGltZSB2YWx1ZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yaWdpbmFsVmFsdWUoKSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9yaWdpbmFsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTVEVNVGltZSBvcmlnaW5hbFZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNURU1UaW1lTW9kaWZpZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLlNURU1fVElNRV9NT0RJRklFUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU1RFTVRpbWUgZ2V0VmFsdWUoKSB7CisJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRWYWx1ZSA9IChJbnRlcm5hbEVPYmplY3QpdmFsdWU7CisJCQl2YWx1ZSA9IChTVEVNVGltZSllUmVzb2x2ZVByb3h5KG9sZFZhbHVlKTsKKwkJCWlmICh2YWx1ZSAhPSBvbGRWYWx1ZSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfTU9ESUZJRVJfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNURU1UaW1lIGJhc2ljR2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTVEVNVGltZSBuZXdWYWx1ZSkgeworCQlTVEVNVGltZSBvbGRWYWx1ZSA9IHZhbHVlOworCQl2YWx1ZSA9IG5ld1ZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX01PRElGSUVSX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNURU1UaW1lIGdldE9yaWdpbmFsVmFsdWUoKSB7CisJCWlmIChvcmlnaW5hbFZhbHVlICE9IG51bGwgJiYgb3JpZ2luYWxWYWx1ZS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkT3JpZ2luYWxWYWx1ZSA9IChJbnRlcm5hbEVPYmplY3Qpb3JpZ2luYWxWYWx1ZTsKKwkJCW9yaWdpbmFsVmFsdWUgPSAoU1RFTVRpbWUpZVJlc29sdmVQcm94eShvbGRPcmlnaW5hbFZhbHVlKTsKKwkJCWlmIChvcmlnaW5hbFZhbHVlICE9IG9sZE9yaWdpbmFsVmFsdWUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSwgb2xkT3JpZ2luYWxWYWx1ZSwgb3JpZ2luYWxWYWx1ZSkpOworCQkJfQorCQl9CisJCXJldHVybiBvcmlnaW5hbFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTVEVNVGltZSBiYXNpY0dldE9yaWdpbmFsVmFsdWUoKSB7CisJCXJldHVybiBvcmlnaW5hbFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE9yaWdpbmFsVmFsdWUoU1RFTVRpbWUgbmV3T3JpZ2luYWxWYWx1ZSkgeworCQlTVEVNVGltZSBvbGRPcmlnaW5hbFZhbHVlID0gb3JpZ2luYWxWYWx1ZTsKKwkJb3JpZ2luYWxWYWx1ZSA9IG5ld09yaWdpbmFsVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFLCBvbGRPcmlnaW5hbFZhbHVlLCBvcmlnaW5hbFZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX01PRElGSUVSX19WQUxVRToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFZhbHVlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0VmFsdWUoKTsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNURU1fVElNRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRPcmlnaW5hbFZhbHVlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0T3JpZ2luYWxWYWx1ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfTU9ESUZJRVJfX1ZBTFVFOgorCQkJCXNldFZhbHVlKChTVEVNVGltZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX01PRElGSUVSX19PUklHSU5BTF9WQUxVRToKKwkJCQlzZXRPcmlnaW5hbFZhbHVlKChTVEVNVGltZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNURU1fVElNRV9NT0RJRklFUl9fVkFMVUU6CisJCQkJc2V0VmFsdWUoKFNURU1UaW1lKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNURU1fVElNRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUU6CisJCQkJc2V0T3JpZ2luYWxWYWx1ZSgoU1RFTVRpbWUpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZUZlYXR1cmUoKSB7CisJCS8vIE9yaWdpbmFsIHZhbHVlIGNhcHR1cmVkIHlldD8KKwkJaWYgKCFlSXNTZXQoTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUpKSB7CisJCQkvLyBObworCQkJc2V0T3JpZ2luYWxWYWx1ZSgoU1RFTVRpbWUpdGFyZ2V0LmVHZXQoZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkpKTsKKwkJfSAvLyBpZgorCQl0YXJnZXQuZVNldChnZXRFU3RydWN0dXJhbEZlYXR1cmUoKSwgZ2V0VmFsdWUoKSk7CisJCWNvbXBsZXRlID0gdHJ1ZTsKKwl9IC8vIHVwZGF0ZUZlYXR1cmUKKworCQorCS8qKgorCSAqcmVzZXQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJY29tcGxldGUgPSBmYWxzZTsKKwkJdGFyZ2V0LmVTZXQoZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCksIGdldE9yaWdpbmFsVmFsdWUoKSk7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBjb21wbGV0ZSA9IGZhbHNlOworCS8qKgorCSAqIGlzQ29tcGxldGUKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeworCQlyZXR1cm4gY29tcGxldGU7CisJfQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfTU9ESUZJRVJfX1ZBTFVFOgorCQkJCXJldHVybiB2YWx1ZSAhPSBudWxsOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX01PRElGSUVSX19PUklHSU5BTF9WQUxVRToKKwkJCQlyZXR1cm4gb3JpZ2luYWxWYWx1ZSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy9TVEVNVGltZU1vZGlmaWVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9TVEVNVGltZU5PUE1vZGlmaWVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9TVEVNVGltZU5PUE1vZGlmaWVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjRiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL1NURU1UaW1lTk9QTW9kaWZpZXJJbXBsLmphdmEKQEAgLTAsMCArMSw0NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lTk9QTW9kaWZpZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TVEVNIFRpbWUgTk9QIE1vZGlmaWVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU1RFTVRpbWVOT1BNb2RpZmllckltcGwgZXh0ZW5kcyBOT1BNb2RpZmllckltcGwgaW1wbGVtZW50cyBTVEVNVGltZU5PUE1vZGlmaWVyIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU1RFTVRpbWVOT1BNb2RpZmllckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuU1RFTV9USU1FX05PUF9NT0RJRklFUjsKKwl9CisKK30gLy8gU1RFTVRpbWVOT1BNb2RpZmllckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvU1RFTVRpbWVSYW5nZU1vZGlmaWVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9TVEVNVGltZVJhbmdlTW9kaWZpZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzMTQzYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvU1RFTVRpbWVSYW5nZU1vZGlmaWVySW1wbC5qYXZhCkBAIC0wLDAgKzEsNDQ0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZVJhbmdlTW9kaWZpZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNURU0gVGltZSBSYW5nZSBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU1RFTVRpbWVSYW5nZU1vZGlmaWVySW1wbCNnZXRTdGFydFZhbHVlIDxlbT5TdGFydCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU1RFTVRpbWVSYW5nZU1vZGlmaWVySW1wbCNnZXRFbmRWYWx1ZSA8ZW0+RW5kIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TVEVNVGltZVJhbmdlTW9kaWZpZXJJbXBsI2dldEluY3JlbWVudCA8ZW0+SW5jcmVtZW50PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TVEVNVGltZVJhbmdlTW9kaWZpZXJJbXBsI2dldE5leHRWYWx1ZSA8ZW0+TmV4dCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU1RFTVRpbWVSYW5nZU1vZGlmaWVySW1wbCNnZXRPcmlnaW5hbFZhbHVlIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNURU1UaW1lUmFuZ2VNb2RpZmllckltcGwgZXh0ZW5kcyBSYW5nZU1vZGlmaWVySW1wbCBpbXBsZW1lbnRzCisJCVNURU1UaW1lUmFuZ2VNb2RpZmllciB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnRWYWx1ZSgpIDxlbT5TdGFydCBWYWx1ZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFN0YXJ0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTVEVNVGltZSBzdGFydFZhbHVlOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVuZFZhbHVlKCkgPGVtPkVuZCBWYWx1ZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEVuZFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU1RFTVRpbWUgZW5kVmFsdWU7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY3JlbWVudCgpIDxlbT5JbmNyZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbmNyZW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBJTkNSRU1FTlRfRURFRkFVTFQgPSAwTDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmNyZW1lbnQoKSA8ZW0+SW5jcmVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW5jcmVtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgbG9uZyBpbmNyZW1lbnQgPSBJTkNSRU1FTlRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROZXh0VmFsdWUoKSA8ZW0+TmV4dCBWYWx1ZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5leHRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFNURU1UaW1lIG5leHRWYWx1ZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yaWdpbmFsVmFsdWUoKSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9yaWdpbmFsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTVEVNVGltZSBvcmlnaW5hbFZhbHVlOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqLworCXByb3RlY3RlZCBTVEVNVGltZVJhbmdlTW9kaWZpZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIE1vZGlmaWVyUGFja2FnZS5MaXRlcmFscy5TVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTVEVNVGltZSBnZXRTdGFydFZhbHVlKCkgeworCQlpZiAoc3RhcnRWYWx1ZSAhPSBudWxsICYmIHN0YXJ0VmFsdWUuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFN0YXJ0VmFsdWUgPSAoSW50ZXJuYWxFT2JqZWN0KXN0YXJ0VmFsdWU7CisJCQlzdGFydFZhbHVlID0gKFNURU1UaW1lKWVSZXNvbHZlUHJveHkob2xkU3RhcnRWYWx1ZSk7CisJCQlpZiAoc3RhcnRWYWx1ZSAhPSBvbGRTdGFydFZhbHVlKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgTW9kaWZpZXJQYWNrYWdlLlNURU1fVElNRV9SQU5HRV9NT0RJRklFUl9fU1RBUlRfVkFMVUUsIG9sZFN0YXJ0VmFsdWUsIHN0YXJ0VmFsdWUpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3RhcnRWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNURU1UaW1lIGJhc2ljR2V0U3RhcnRWYWx1ZSgpIHsKKwkJcmV0dXJuIHN0YXJ0VmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0YXJ0VmFsdWUoU1RFTVRpbWUgbmV3U3RhcnRWYWx1ZSkgeworCQlTVEVNVGltZSBvbGRTdGFydFZhbHVlID0gc3RhcnRWYWx1ZTsKKwkJc3RhcnRWYWx1ZSA9IG5ld1N0YXJ0VmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfX1NUQVJUX1ZBTFVFLCBvbGRTdGFydFZhbHVlLCBzdGFydFZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTVEVNVGltZSBnZXRFbmRWYWx1ZSgpIHsKKwkJaWYgKGVuZFZhbHVlICE9IG51bGwgJiYgZW5kVmFsdWUuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEVuZFZhbHVlID0gKEludGVybmFsRU9iamVjdCllbmRWYWx1ZTsKKwkJCWVuZFZhbHVlID0gKFNURU1UaW1lKWVSZXNvbHZlUHJveHkob2xkRW5kVmFsdWUpOworCQkJaWYgKGVuZFZhbHVlICE9IG9sZEVuZFZhbHVlKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgTW9kaWZpZXJQYWNrYWdlLlNURU1fVElNRV9SQU5HRV9NT0RJRklFUl9fRU5EX1ZBTFVFLCBvbGRFbmRWYWx1ZSwgZW5kVmFsdWUpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZW5kVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTVEVNVGltZSBiYXNpY0dldEVuZFZhbHVlKCkgeworCQlyZXR1cm4gZW5kVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVuZFZhbHVlKFNURU1UaW1lIG5ld0VuZFZhbHVlKSB7CisJCVNURU1UaW1lIG9sZEVuZFZhbHVlID0gZW5kVmFsdWU7CisJCWVuZFZhbHVlID0gbmV3RW5kVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfX0VORF9WQUxVRSwgb2xkRW5kVmFsdWUsIGVuZFZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBsb25nIGdldEluY3JlbWVudCgpIHsKKwkJcmV0dXJuIGluY3JlbWVudDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SW5jcmVtZW50KGxvbmcgbmV3SW5jcmVtZW50KSB7CisJCWxvbmcgb2xkSW5jcmVtZW50ID0gaW5jcmVtZW50OworCQlpbmNyZW1lbnQgPSBuZXdJbmNyZW1lbnQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfX0lOQ1JFTUVOVCwgb2xkSW5jcmVtZW50LCBpbmNyZW1lbnQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19TVEFSVF9WQUxVRToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFN0YXJ0VmFsdWUoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRTdGFydFZhbHVlKCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfX0VORF9WQUxVRToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVuZFZhbHVlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0RW5kVmFsdWUoKTsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNURU1fVElNRV9SQU5HRV9NT0RJRklFUl9fSU5DUkVNRU5UOgorCQkJCXJldHVybiBnZXRJbmNyZW1lbnQoKTsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNURU1fVElNRV9SQU5HRV9NT0RJRklFUl9fTkVYVF9WQUxVRToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE5leHRWYWx1ZSgpOworCQkJCXJldHVybiBiYXNpY0dldE5leHRWYWx1ZSgpOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE9yaWdpbmFsVmFsdWUoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRPcmlnaW5hbFZhbHVlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfX1NUQVJUX1ZBTFVFOgorCQkJCXNldFN0YXJ0VmFsdWUoKFNURU1UaW1lKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfX0VORF9WQUxVRToKKwkJCQlzZXRFbmRWYWx1ZSgoU1RFTVRpbWUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNURU1fVElNRV9SQU5HRV9NT0RJRklFUl9fSU5DUkVNRU5UOgorCQkJCXNldEluY3JlbWVudCgoTG9uZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFOgorCQkJCXNldE5leHRWYWx1ZSgoU1RFTVRpbWUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNURU1fVElNRV9SQU5HRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUU6CisJCQkJc2V0T3JpZ2luYWxWYWx1ZSgoU1RFTVRpbWUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19TVEFSVF9WQUxVRToKKwkJCQlzZXRTdGFydFZhbHVlKChTVEVNVGltZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfX0VORF9WQUxVRToKKwkJCQlzZXRFbmRWYWx1ZSgoU1RFTVRpbWUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19JTkNSRU1FTlQ6CisJCQkJc2V0SW5jcmVtZW50KElOQ1JFTUVOVF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFOgorCQkJCXNldE5leHRWYWx1ZSgoU1RFTVRpbWUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRToKKwkJCQlzZXRPcmlnaW5hbFZhbHVlKChTVEVNVGltZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfX1NUQVJUX1ZBTFVFOgorCQkJCXJldHVybiBzdGFydFZhbHVlICE9IG51bGw7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfX0VORF9WQUxVRToKKwkJCQlyZXR1cm4gZW5kVmFsdWUgIT0gbnVsbDsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNURU1fVElNRV9SQU5HRV9NT0RJRklFUl9fSU5DUkVNRU5UOgorCQkJCXJldHVybiBpbmNyZW1lbnQgIT0gSU5DUkVNRU5UX0VERUZBVUxUOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFOgorCQkJCXJldHVybiBuZXh0VmFsdWUgIT0gbnVsbDsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNURU1fVElNRV9SQU5HRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUU6CisJCQkJcmV0dXJuIG9yaWdpbmFsVmFsdWUgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChpbmNyZW1lbnQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaW5jcmVtZW50KTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgU1RFTVRpbWUgZ2V0TmV4dFZhbHVlKCkgeworCQkvLyBVbnNldD8KKwkJaWYgKCFlSXNTZXQoTW9kaWZpZXJQYWNrYWdlLlNURU1fVElNRV9SQU5HRV9NT0RJRklFUl9fTkVYVF9WQUxVRSkpIHsKKwkJCS8vIFllcworCQkJbmV4dFZhbHVlID0gc3RhcnRWYWx1ZTsKKwkJfSAvLyBpZgorCisJCWZpbmFsIFNURU1UaW1lIHJldFZhbHVlID0gbmV4dFZhbHVlOworCQljb21wbGV0ZSA9IHJldFZhbHVlLmVxdWFscyhlbmRWYWx1ZSk7CisKKwkJLy8gU3RpbGwgaW5jcmVtZW50aW5nPworCQlpZiAoIWNvbXBsZXRlKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIFNURU1UaW1lIHRlbXAgPSAoKFNURU1UaW1lKSBFY29yZVV0aWwuY29weShyZXRWYWx1ZSkpCisJCQkJCS5hZGRJbmNyZW1lbnQoaW5jcmVtZW50KTsKKwkJCS8vIFdvdWxkIHRoZSBuZXcgY3VycmVudFZhbHVlIGJlIGVxdWFsIG9yICJwYXN0IiB0aGUgZW5kVmFsdWU/CisJCQlpZiAodGVtcC5nZXRUaW1lKCkuYmVmb3JlKGVuZFZhbHVlLmdldFRpbWUoKSkpIHsKKwkJCQkvLyBObworCQkJCW5leHRWYWx1ZSA9IHRlbXA7CisJCQl9IC8vIGlmCisJCQllbHNlIHsKKwkJCQkvLyBZZXMKKwkJCQluZXh0VmFsdWUgPSBlbmRWYWx1ZTsKKwkJCX0gLy8gZWxzZQorCQl9IC8vIGlmCisJCWN1cnJlbnRWYWx1ZVRleHQgPSByZXRWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gcmV0VmFsdWU7CisKKwl9IC8vIGdldE5leHRWYWx1ZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTVEVNVGltZSBiYXNpY0dldE5leHRWYWx1ZSgpIHsKKwkJcmV0dXJuIG5leHRWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROZXh0VmFsdWUoU1RFTVRpbWUgbmV3TmV4dFZhbHVlKSB7CisJCVNURU1UaW1lIG9sZE5leHRWYWx1ZSA9IG5leHRWYWx1ZTsKKwkJbmV4dFZhbHVlID0gbmV3TmV4dFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFLCBvbGROZXh0VmFsdWUsIG5leHRWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTVEVNVGltZSBnZXRPcmlnaW5hbFZhbHVlKCkgeworCQlpZiAob3JpZ2luYWxWYWx1ZSAhPSBudWxsICYmIG9yaWdpbmFsVmFsdWUuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZE9yaWdpbmFsVmFsdWUgPSAoSW50ZXJuYWxFT2JqZWN0KW9yaWdpbmFsVmFsdWU7CisJCQlvcmlnaW5hbFZhbHVlID0gKFNURU1UaW1lKWVSZXNvbHZlUHJveHkob2xkT3JpZ2luYWxWYWx1ZSk7CisJCQlpZiAob3JpZ2luYWxWYWx1ZSAhPSBvbGRPcmlnaW5hbFZhbHVlKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgTW9kaWZpZXJQYWNrYWdlLlNURU1fVElNRV9SQU5HRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUsIG9sZE9yaWdpbmFsVmFsdWUsIG9yaWdpbmFsVmFsdWUpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gb3JpZ2luYWxWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU1RFTVRpbWUgYmFzaWNHZXRPcmlnaW5hbFZhbHVlKCkgeworCQlyZXR1cm4gb3JpZ2luYWxWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPcmlnaW5hbFZhbHVlKFNURU1UaW1lIG5ld09yaWdpbmFsVmFsdWUpIHsKKwkJU1RFTVRpbWUgb2xkT3JpZ2luYWxWYWx1ZSA9IG9yaWdpbmFsVmFsdWU7CisJCW9yaWdpbmFsVmFsdWUgPSBuZXdPcmlnaW5hbFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSwgb2xkT3JpZ2luYWxWYWx1ZSwgb3JpZ2luYWxWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRmVhdHVyZU1vZGlmaWVySW1wbCN1cGRhdGVGZWF0dXJlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGVGZWF0dXJlKCkgeworCQkvLyBPcmlnaW5hbCB2YWx1ZSBjYXB0dXJlZCB5ZXQ/CisJCWlmICghZUlzU2V0KE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX1JBTkdFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSkpIHsKKwkJCS8vIE5vCisJCQlzZXRPcmlnaW5hbFZhbHVlKChTVEVNVGltZSl0YXJnZXQuZUdldChnZXRFU3RydWN0dXJhbEZlYXR1cmUoKSkpOworCQl9IC8vIGlmCisJCXRhcmdldC5lU2V0KGdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLCBnZXROZXh0VmFsdWUoKSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5SYW5nZU1vZGlmaWVySW1wbCNyZXNldCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCXN1cGVyLnJlc2V0KCk7CisJCWVVbnNldChNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFKTsKKwkJdGFyZ2V0LmVTZXQoZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCksIGdldE9yaWdpbmFsVmFsdWUoKSk7CisJfQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyI3NhbmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5zYW5lKCk7CisJCWFzc2VydCByZXRWYWx1ZTsKKworCQlyZXRWYWx1ZSA9IHJldFZhbHVlCisJCQkJJiYgISgoZW5kVmFsdWUpLmdldFRpbWUoKS5iZWZvcmUoKHN0YXJ0VmFsdWUpLmdldFRpbWUoKSkpOworCQlhc3NlcnQgcmV0VmFsdWU7CisKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBpbmNyZW1lbnQgPiAwOworCQlhc3NlcnQgcmV0VmFsdWU7CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gc2FuZQorCit9IC8vIFNURU1UaW1lUmFuZ2VNb2RpZmllckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9TVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1MGI0ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZVNlcXVlbmNlTW9kaWZpZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TVEVNIFRpbWUgU2VxdWVuY2UgTW9kaWZpZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLlNURU1UaW1lU2VxdWVuY2VNb2RpZmllckltcGwjZ2V0U2VxdWVuY2UgPGVtPlNlcXVlbmNlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVySW1wbCBleHRlbmRzIFNlcXVlbmNlTW9kaWZpZXJJbXBsIGltcGxlbWVudHMgU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXF1ZW5jZSgpIDxlbT5TZXF1ZW5jZTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTZXF1ZW5jZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFNURU1UaW1lPiBzZXF1ZW5jZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLlNURU1fVElNRV9TRVFVRU5DRV9NT0RJRklFUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8U1RFTVRpbWU+IGdldFNlcXVlbmNlKCkgeworCQlpZiAoc2VxdWVuY2UgPT0gbnVsbCkgeworCQkJc2VxdWVuY2UgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFNURU1UaW1lPihTVEVNVGltZS5jbGFzcywgdGhpcywgTW9kaWZpZXJQYWNrYWdlLlNURU1fVElNRV9TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0UpOworCQl9CisJCXJldHVybiBzZXF1ZW5jZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLlNlcXVlbmNlTW9kaWZpZXJJbXBsI2dldE5leHRWYWx1ZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXROZXh0VmFsdWUoKSB7CisJCWludCBpbmRleCA9IGdldEN1cnJlbnRTZXF1ZW5jZUluZGV4KCk7CisJCWZpbmFsIE9iamVjdCByZXRWYWx1ZSA9IGdldFNlcXVlbmNlKCkuZ2V0KGluZGV4KyspOworCQlzZXRDdXJyZW50U2VxdWVuY2VJbmRleChpbmRleCk7CQkKKwkJY3VycmVudFZhbHVlVGV4dCA9IHJldFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldE5leHRWYWx1ZQorCQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TZXF1ZW5jZU1vZGlmaWVySW1wbCNnZXRTZXF1ZW5jZVNpemUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZ2V0U2VxdWVuY2VTaXplKCkgeworCQlyZXR1cm4gZ2V0U2VxdWVuY2UoKS5zaXplKCk7CisJfSAvLyBnZXRTZXF1ZW5jZVNpemUKKwkKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRmVhdHVyZU1vZGlmaWVySW1wbCN1cGRhdGVGZWF0dXJlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGVGZWF0dXJlKCkgeworCQlzdXBlci51cGRhdGVGZWF0dXJlKCk7CisJCXRhcmdldC5lU2V0KGdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLCBnZXROZXh0VmFsdWUoKSk7CisJfQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRmVhdHVyZU1vZGlmaWVySW1wbCNyZXNldCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCXN1cGVyLnJlc2V0KCk7CisJCXRhcmdldC5lU2V0KGdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLCBnZXRPcmlnaW5hbFZhbHVlKCkpOworCX0KKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFOgorCQkJCXJldHVybiBnZXRTZXF1ZW5jZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFOgorCQkJCWdldFNlcXVlbmNlKCkuY2xlYXIoKTsKKwkJCQlnZXRTZXF1ZW5jZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU1RFTVRpbWU+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX1NFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRToKKwkJCQlnZXRTZXF1ZW5jZSgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFOgorCQkJCXJldHVybiBzZXF1ZW5jZSAhPSBudWxsICYmICFzZXF1ZW5jZS5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL1NURU1UaW1lU2VxdWVuY2VNb2RpZmllckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvU2VxdWVuY2VNb2RpZmllckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvU2VxdWVuY2VNb2RpZmllckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDBkZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9TZXF1ZW5jZU1vZGlmaWVySW1wbC5qYXZhCkBAIC0wLDAgKzEsMzA5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNlcXVlbmNlTW9kaWZpZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXF1ZW5jZSBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU2VxdWVuY2VNb2RpZmllckltcGwjZ2V0U2VxdWVuY2VTaXplIDxlbT5TZXF1ZW5jZSBTaXplPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TZXF1ZW5jZU1vZGlmaWVySW1wbCNnZXRDdXJyZW50U2VxdWVuY2VJbmRleCA8ZW0+Q3VycmVudCBTZXF1ZW5jZSBJbmRleDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU2VxdWVuY2VNb2RpZmllckltcGwjZ2V0TmV4dFZhbHVlIDxlbT5OZXh0IFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TZXF1ZW5jZU1vZGlmaWVySW1wbCNnZXRPcmlnaW5hbFZhbHVlIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcXVlbmNlTW9kaWZpZXJJbXBsIGV4dGVuZHMgRmVhdHVyZU1vZGlmaWVySW1wbCBpbXBsZW1lbnRzIFNlcXVlbmNlTW9kaWZpZXIgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXF1ZW5jZVNpemUoKSA8ZW0+U2VxdWVuY2UgU2l6ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2VxdWVuY2VTaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTRVFVRU5DRV9TSVpFX0VERUZBVUxUID0gMDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXJyZW50U2VxdWVuY2VJbmRleCgpIDxlbT5DdXJyZW50IFNlcXVlbmNlIEluZGV4PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDdXJyZW50U2VxdWVuY2VJbmRleCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ1VSUkVOVF9TRVFVRU5DRV9JTkRFWF9FREVGQVVMVCA9IDA7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVudFNlcXVlbmNlSW5kZXgoKSA8ZW0+Q3VycmVudCBTZXF1ZW5jZSBJbmRleDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q3VycmVudFNlcXVlbmNlSW5kZXgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBpbnQgY3VycmVudFNlcXVlbmNlSW5kZXggPSBDVVJSRU5UX1NFUVVFTkNFX0lOREVYX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5leHRWYWx1ZSgpIDxlbT5OZXh0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROZXh0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IE5FWFRfVkFMVUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yaWdpbmFsVmFsdWUoKSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9yaWdpbmFsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IE9SSUdJTkFMX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yaWdpbmFsVmFsdWUoKSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9yaWdpbmFsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBPYmplY3Qgb3JpZ2luYWxWYWx1ZSA9IE9SSUdJTkFMX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNlcXVlbmNlTW9kaWZpZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTkNFX01PRElGSUVSOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0U2VxdWVuY2VTaXplKCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnU2VxdWVuY2UgU2l6ZScgYXR0cmlidXRlCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q3VycmVudFNlcXVlbmNlSW5kZXgoKSB7CisJCXJldHVybiBjdXJyZW50U2VxdWVuY2VJbmRleDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDdXJyZW50U2VxdWVuY2VJbmRleChpbnQgbmV3Q3VycmVudFNlcXVlbmNlSW5kZXgpIHsKKwkJaW50IG9sZEN1cnJlbnRTZXF1ZW5jZUluZGV4ID0gY3VycmVudFNlcXVlbmNlSW5kZXg7CisJCWN1cnJlbnRTZXF1ZW5jZUluZGV4ID0gbmV3Q3VycmVudFNlcXVlbmNlSW5kZXg7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGlmaWVyUGFja2FnZS5TRVFVRU5DRV9NT0RJRklFUl9fQ1VSUkVOVF9TRVFVRU5DRV9JTkRFWCwgb2xkQ3VycmVudFNlcXVlbmNlSW5kZXgsIGN1cnJlbnRTZXF1ZW5jZUluZGV4KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgT2JqZWN0IGdldE5leHRWYWx1ZSgpOworCQkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NldE5leHRWYWx1ZSgpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB3aGV0aGVyIHRoZSAnTmV4dCBWYWx1ZScgYXR0cmlidXRlIGlzIHNldAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldE9yaWdpbmFsVmFsdWUoKSB7CisJCXJldHVybiBvcmlnaW5hbFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE9yaWdpbmFsVmFsdWUoT2JqZWN0IG5ld09yaWdpbmFsVmFsdWUpIHsKKwkJT2JqZWN0IG9sZE9yaWdpbmFsVmFsdWUgPSBvcmlnaW5hbFZhbHVlOworCQlvcmlnaW5hbFZhbHVlID0gbmV3T3JpZ2luYWxWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kaWZpZXJQYWNrYWdlLlNFUVVFTkNFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSwgb2xkT3JpZ2luYWxWYWx1ZSwgb3JpZ2luYWxWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRmVhdHVyZU1vZGlmaWVySW1wbCNpc0NvbXBsZXRlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeworCQlyZXR1cm4gZ2V0Q3VycmVudFNlcXVlbmNlSW5kZXgoKSA+PSBnZXRTZXF1ZW5jZVNpemUoKTsKKwl9IC8vIGlzQ29tcGxldGUKKworCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuRmVhdHVyZU1vZGlmaWVySW1wbCNyZXNldCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCXNldEN1cnJlbnRTZXF1ZW5jZUluZGV4KENVUlJFTlRfU0VRVUVOQ0VfSU5ERVhfRURFRkFVTFQpOwkJCisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5GZWF0dXJlTW9kaWZpZXJJbXBsI3VwZGF0ZUZlYXR1cmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZUZlYXR1cmUoKSB7CisJCS8vIENhcHR1cmUgdGhlIG9yaWdpbmFsIHZhbHVlPworCQlpZiAoZ2V0Q3VycmVudFNlcXVlbmNlSW5kZXgoKSA9PSBDVVJSRU5UX1NFUVVFTkNFX0lOREVYX0VERUZBVUxUKSB7CisJCQkvLyBZZXMKKwkJCXNldE9yaWdpbmFsVmFsdWUodGFyZ2V0LmVHZXQoZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkpKTsKKwkJfSAvLyBpZgorCX0gLy8gdXBkYXRlRmVhdHVyZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFX1NJWkU6CisJCQkJcmV0dXJuIGdldFNlcXVlbmNlU2l6ZSgpOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU0VRVUVOQ0VfTU9ESUZJRVJfX0NVUlJFTlRfU0VRVUVOQ0VfSU5ERVg6CisJCQkJcmV0dXJuIGdldEN1cnJlbnRTZXF1ZW5jZUluZGV4KCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TRVFVRU5DRV9NT0RJRklFUl9fTkVYVF9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0TmV4dFZhbHVlKCk7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TRVFVRU5DRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUU6CisJCQkJcmV0dXJuIGdldE9yaWdpbmFsVmFsdWUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU0VRVUVOQ0VfTU9ESUZJRVJfX0NVUlJFTlRfU0VRVUVOQ0VfSU5ERVg6CisJCQkJc2V0Q3VycmVudFNlcXVlbmNlSW5kZXgoKEludGVnZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNFUVVFTkNFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRToKKwkJCQlzZXRPcmlnaW5hbFZhbHVlKG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU0VRVUVOQ0VfTU9ESUZJRVJfX0NVUlJFTlRfU0VRVUVOQ0VfSU5ERVg6CisJCQkJc2V0Q3VycmVudFNlcXVlbmNlSW5kZXgoQ1VSUkVOVF9TRVFVRU5DRV9JTkRFWF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU0VRVUVOQ0VfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFOgorCQkJCXNldE9yaWdpbmFsVmFsdWUoT1JJR0lOQUxfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFX1NJWkU6CisJCQkJcmV0dXJuIGdldFNlcXVlbmNlU2l6ZSgpICE9IFNFUVVFTkNFX1NJWkVfRURFRkFVTFQ7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TRVFVRU5DRV9NT0RJRklFUl9fQ1VSUkVOVF9TRVFVRU5DRV9JTkRFWDoKKwkJCQlyZXR1cm4gY3VycmVudFNlcXVlbmNlSW5kZXggIT0gQ1VSUkVOVF9TRVFVRU5DRV9JTkRFWF9FREVGQVVMVDsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNFUVVFTkNFX01PRElGSUVSX19ORVhUX1ZBTFVFOgorCQkJCXJldHVybiBpc1NldE5leHRWYWx1ZSgpOworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU0VRVUVOQ0VfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFOgorCQkJCXJldHVybiBPUklHSU5BTF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gb3JpZ2luYWxWYWx1ZSAhPSBudWxsIDogIU9SSUdJTkFMX1ZBTFVFX0VERUZBVUxULmVxdWFscyhvcmlnaW5hbFZhbHVlKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGN1cnJlbnRTZXF1ZW5jZUluZGV4OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGN1cnJlbnRTZXF1ZW5jZUluZGV4KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBvcmlnaW5hbFZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKG9yaWdpbmFsVmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9TZXF1ZW5jZU1vZGlmaWVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9TaW5nbGVWYWx1ZU1vZGlmaWVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9TaW5nbGVWYWx1ZU1vZGlmaWVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZTY2MjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL1NpbmdsZVZhbHVlTW9kaWZpZXJJbXBsLmphdmEKQEAgLTAsMCArMSw0OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2luZ2xlVmFsdWVNb2RpZmllcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNpbmdsZSBWYWx1ZSBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbmdsZVZhbHVlTW9kaWZpZXJJbXBsIGV4dGVuZHMgRmVhdHVyZU1vZGlmaWVySW1wbCBpbXBsZW1lbnRzIFNpbmdsZVZhbHVlTW9kaWZpZXIgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTaW5nbGVWYWx1ZU1vZGlmaWVySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIE1vZGlmaWVyUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfVkFMVUVfTU9ESUZJRVI7CisJfQorCit9IC8vU2luZ2xlVmFsdWVNb2RpZmllckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL2ltcGwvU3RyaW5nTk9QTW9kaWZpZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL1N0cmluZ05PUE1vZGlmaWVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjcwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL1N0cmluZ05PUE1vZGlmaWVySW1wbC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TdHJpbmdOT1BNb2RpZmllcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0cmluZyBOT1AgTW9kaWZpZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpbmdOT1BNb2RpZmllckltcGwgZXh0ZW5kcyBOT1BNb2RpZmllckltcGwgaW1wbGVtZW50cyBTdHJpbmdOT1BNb2RpZmllciB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZ05PUE1vZGlmaWVySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIE1vZGlmaWVyUGFja2FnZS5MaXRlcmFscy5TVFJJTkdfTk9QX01PRElGSUVSOworCX0KKworfSAvL1N0cmluZ05PUE1vZGlmaWVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9TdHJpbmdTZXF1ZW5jZU1vZGlmaWVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvaW1wbC9TdHJpbmdTZXF1ZW5jZU1vZGlmaWVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MjAwZmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9pbXBsL1N0cmluZ1NlcXVlbmNlTW9kaWZpZXJJbXBsLmphdmEKQEAgLTAsMCArMSwxOTMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TdHJpbmdTZXF1ZW5jZU1vZGlmaWVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RyaW5nIFNlcXVlbmNlIE1vZGlmaWVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5TdHJpbmdTZXF1ZW5jZU1vZGlmaWVySW1wbCNnZXRTZXF1ZW5jZSA8ZW0+U2VxdWVuY2U8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpbmdTZXF1ZW5jZU1vZGlmaWVySW1wbCBleHRlbmRzIFNlcXVlbmNlTW9kaWZpZXJJbXBsIGltcGxlbWVudHMgU3RyaW5nU2VxdWVuY2VNb2RpZmllciB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VxdWVuY2UoKSA8ZW0+U2VxdWVuY2U8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2VxdWVuY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IHNlcXVlbmNlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZ1NlcXVlbmNlTW9kaWZpZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLlNUUklOR19TRVFVRU5DRV9NT0RJRklFUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRTZXF1ZW5jZSgpIHsKKwkJaWYgKHNlcXVlbmNlID09IG51bGwpIHsKKwkJCXNlcXVlbmNlID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBNb2RpZmllclBhY2thZ2UuU1RSSU5HX1NFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRSk7CisJCX0KKwkJcmV0dXJuIHNlcXVlbmNlOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU2VxdWVuY2VNb2RpZmllckltcGwjZ2V0TmV4dFZhbHVlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldE5leHRWYWx1ZSgpIHsKKwkJaW50IGluZGV4ID0gZ2V0Q3VycmVudFNlcXVlbmNlSW5kZXgoKTsKKwkJZmluYWwgT2JqZWN0IHJldFZhbHVlID0gZ2V0U2VxdWVuY2UoKS5nZXQoaW5kZXgrKyk7CisJCXNldEN1cnJlbnRTZXF1ZW5jZUluZGV4KGluZGV4KTsJCisJCWN1cnJlbnRWYWx1ZVRleHQgPSByZXRWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXROZXh0VmFsdWUKKwkKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuU2VxdWVuY2VNb2RpZmllckltcGwjZ2V0U2VxdWVuY2VTaXplKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGdldFNlcXVlbmNlU2l6ZSgpIHsKKwkJcmV0dXJuIGdldFNlcXVlbmNlKCkuc2l6ZSgpOworCX0gLy8gZ2V0U2VxdWVuY2VTaXplCisJCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkZlYXR1cmVNb2RpZmllckltcGwjdXBkYXRlRmVhdHVyZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlRmVhdHVyZSgpIHsKKwkJc3VwZXIudXBkYXRlRmVhdHVyZSgpOworCQl0YXJnZXQuZVNldChnZXRFU3RydWN0dXJhbEZlYXR1cmUoKSwgZ2V0TmV4dFZhbHVlKCkpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLkZlYXR1cmVNb2RpZmllckltcGwjcmVzZXQoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlzdXBlci5yZXNldCgpOworCQl0YXJnZXQuZVNldChnZXRFU3RydWN0dXJhbEZlYXR1cmUoKSwgZ2V0T3JpZ2luYWxWYWx1ZSgpKTsKKwl9CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RSSU5HX1NFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRToKKwkJCQlyZXR1cm4gZ2V0U2VxdWVuY2UoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RSSU5HX1NFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRToKKwkJCQlnZXRTZXF1ZW5jZSgpLmNsZWFyKCk7CisJCQkJZ2V0U2VxdWVuY2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TVFJJTkdfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFOgorCQkJCWdldFNlcXVlbmNlKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNUUklOR19TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0U6CisJCQkJcmV0dXJuIHNlcXVlbmNlICE9IG51bGwgJiYgIXNlcXVlbmNlLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHNlcXVlbmNlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHNlcXVlbmNlKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vU3RyaW5nU2VxdWVuY2VNb2RpZmllckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL0RvdWJsZU1vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9Eb3VibGVNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwN2M3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9Eb3VibGVNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlTW9kaWZpZXJ9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIERvdWJsZU1vZGlmaWVySXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBTaW5nbGVWYWx1ZU1vZGlmaWVySXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEb3VibGVNb2RpZmllckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkT3JpZ2luYWxWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFsdWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0RvdWJsZU1vZGlmaWVyX3ZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RvdWJsZU1vZGlmaWVyX3ZhbHVlX2ZlYXR1cmUiLCAiX1VJX0RvdWJsZU1vZGlmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLkRPVUJMRV9NT0RJRklFUl9fVkFMVUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE9yaWdpbmFsIFZhbHVlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkT3JpZ2luYWxWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0RvdWJsZU1vZGlmaWVyX29yaWdpbmFsVmFsdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRG91YmxlTW9kaWZpZXJfb3JpZ2luYWxWYWx1ZV9mZWF0dXJlIiwgIl9VSV9Eb3VibGVNb2RpZmllcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIE1vZGlmaWVyUGFja2FnZS5MaXRlcmFscy5ET1VCTEVfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBEb3VibGVNb2RpZmllci5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Eb3VibGVNb2RpZmllciIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChEb3VibGVNb2RpZmllcilvYmplY3QpLmdldEZlYXR1cmVOYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfRG91YmxlTW9kaWZpZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfRG91YmxlTW9kaWZpZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERvdWJsZU1vZGlmaWVyLmNsYXNzKSkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRE9VQkxFX01PRElGSUVSX19WQUxVRToKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUU6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL0RvdWJsZU5PUE1vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9Eb3VibGVOT1BNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNGZjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9Eb3VibGVOT1BNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZU5PUE1vZGlmaWVyOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZU5PUE1vZGlmaWVyfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEb3VibGVOT1BNb2RpZmllckl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERvdWJsZU5PUE1vZGlmaWVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKERvdWJsZU5PUE1vZGlmaWVyKW9iamVjdCkuZ2V0RmVhdHVyZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9Eb3VibGVOT1BNb2RpZmllcl90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9Eb3VibGVOT1BNb2RpZmllcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9Eb3VibGVSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9Eb3VibGVSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg4NDA4OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL0RvdWJsZVJhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIwOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVSYW5nZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlUmFuZ2VNb2RpZmllcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRG91YmxlUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEb3VibGVSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZFN0YXJ0VmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZEVuZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRJbmNyZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN0YXJ0IFZhbHVlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkU3RhcnRWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0RvdWJsZVJhbmdlTW9kaWZpZXJfc3RhcnRWYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Eb3VibGVSYW5nZU1vZGlmaWVyX3N0YXJ0VmFsdWVfZmVhdHVyZSIsICJfVUlfRG91YmxlUmFuZ2VNb2RpZmllcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIE1vZGlmaWVyUGFja2FnZS5MaXRlcmFscy5ET1VCTEVfUkFOR0VfTU9ESUZJRVJfX1NUQVJUX1ZBTFVFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFbmQgVmFsdWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0RvdWJsZVJhbmdlTW9kaWZpZXJfZW5kVmFsdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRG91YmxlUmFuZ2VNb2RpZmllcl9lbmRWYWx1ZV9mZWF0dXJlIiwgIl9VSV9Eb3VibGVSYW5nZU1vZGlmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLkRPVUJMRV9SQU5HRV9NT0RJRklFUl9fRU5EX1ZBTFVFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbmNyZW1lbnQgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRJbmNyZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Eb3VibGVSYW5nZU1vZGlmaWVyX2luY3JlbWVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Eb3VibGVSYW5nZU1vZGlmaWVyX2luY3JlbWVudF9mZWF0dXJlIiwgIl9VSV9Eb3VibGVSYW5nZU1vZGlmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLkRPVUJMRV9SQU5HRV9NT0RJRklFUl9fSU5DUkVNRU5ULAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCWZpbmFsIERvdWJsZVJhbmdlTW9kaWZpZXIgcm0gPSAoRG91YmxlUmFuZ2VNb2RpZmllcilvYmplY3Q7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihybS5nZXRGZWF0dXJlTmFtZSgpKTsKKwkJc2IuYXBwZW5kKCI6ICIpOworCQlzYi5hcHBlbmQocm0uZ2V0U3RhcnRWYWx1ZSgpKTsKKwkJc2IuYXBwZW5kKCIgdG8gIik7CisJCXNiLmFwcGVuZChybS5nZXRFbmRWYWx1ZSgpKTsKKwkJc2IuYXBwZW5kKCIgYnkgIik7CisJCXNiLmFwcGVuZChybS5nZXRJbmNyZW1lbnQoKSk7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0gLy8gZ2V0VGV4dAorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKERvdWJsZVJhbmdlTW9kaWZpZXIpb2JqZWN0KS5nZXRGZWF0dXJlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0RvdWJsZVJhbmdlTW9kaWZpZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfRG91YmxlUmFuZ2VNb2RpZmllcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRG91YmxlUmFuZ2VNb2RpZmllci5jbGFzcykpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9SQU5HRV9NT0RJRklFUl9fU1RBUlRfVkFMVUU6CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfUkFOR0VfTU9ESUZJRVJfX0VORF9WQUxVRToKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9SQU5HRV9NT0RJRklFUl9fSU5DUkVNRU5UOgorCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRE9VQkxFX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFOgorCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRE9VQkxFX1JBTkdFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRToKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvRG91YmxlU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvRG91YmxlU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNDU4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9Eb3VibGVTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVTZXF1ZW5jZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlU2VxdWVuY2VNb2RpZmllcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRG91YmxlU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRG91YmxlU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRTZXF1ZW5jZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VxdWVuY2UgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZXF1ZW5jZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0RvdWJsZVNlcXVlbmNlTW9kaWZpZXJfc2VxdWVuY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRG91YmxlU2VxdWVuY2VNb2RpZmllcl9zZXF1ZW5jZV9mZWF0dXJlIiwgIl9VSV9Eb3VibGVTZXF1ZW5jZU1vZGlmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLkRPVUJMRV9TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0UsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKERvdWJsZVNlcXVlbmNlTW9kaWZpZXIpb2JqZWN0KS5nZXRGZWF0dXJlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0RvdWJsZVNlcXVlbmNlTW9kaWZpZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfRG91YmxlU2VxdWVuY2VNb2RpZmllcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRG91YmxlU2VxdWVuY2VNb2RpZmllci5jbGFzcykpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0U6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL0ZlYXR1cmVNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvRmVhdHVyZU1vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3YTVmYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL0ZlYXR1cmVNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkZlYXR1cmVNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkZlYXR1cmVNb2RpZmllcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRmVhdHVyZU1vZGlmaWVySXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCisJaW1wbGVtZW50cwkKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEZlYXR1cmVNb2RpZmllckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRGZWF0dXJlTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkQ29tcGxldGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCQorCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb21wbGV0ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZENvbXBsZXRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRmVhdHVyZU1vZGlmaWVyX2NvbXBsZXRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0ZlYXR1cmVNb2RpZmllcl9jb21wbGV0ZV9mZWF0dXJlIiwgIl9VSV9GZWF0dXJlTW9kaWZpZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuRkVBVFVSRV9NT0RJRklFUl9fQ09NUExFVEUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBGZWF0dXJlIE5hbWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRGZWF0dXJlTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0ZlYXR1cmVNb2RpZmllcl9mZWF0dXJlTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9GZWF0dXJlTW9kaWZpZXJfZmVhdHVyZU5hbWVfZmVhdHVyZSIsICJfVUlfRmVhdHVyZU1vZGlmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLkZFQVRVUkVfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKEZlYXR1cmVNb2RpZmllcilvYmplY3QpLmdldEZlYXR1cmVOYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfRmVhdHVyZU1vZGlmaWVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX0ZlYXR1cmVNb2RpZmllcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCQorCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEZlYXR1cmVNb2RpZmllci5jbGFzcykpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkZFQVRVUkVfTU9ESUZJRVJfX0ZFQVRVUkVfTkFNRToKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkZFQVRVUkVfTU9ESUZJRVJfX0ZFQVRVUkVfSUQ6CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5GRUFUVVJFX01PRElGSUVSX19DVVJSRU5UX1ZBTFVFX1RFWFQ6CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5GRUFUVVJFX01PRElGSUVSX19DT01QTEVURToKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9JbnRlZ2VyTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL0ludGVnZXJNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzN2FlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9JbnRlZ2VyTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyTW9kaWZpZXJ9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEludGVnZXJNb2RpZmllckl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgU2luZ2xlVmFsdWVNb2RpZmllckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSW50ZWdlck1vZGlmaWVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRPcmlnaW5hbFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYWx1ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfSW50ZWdlck1vZGlmaWVyX3ZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0ludGVnZXJNb2RpZmllcl92YWx1ZV9mZWF0dXJlIiwgIl9VSV9JbnRlZ2VyTW9kaWZpZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuSU5URUdFUl9NT0RJRklFUl9fVkFMVUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBPcmlnaW5hbCBWYWx1ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZE9yaWdpbmFsVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9JbnRlZ2VyTW9kaWZpZXJfb3JpZ2luYWxWYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbnRlZ2VyTW9kaWZpZXJfb3JpZ2luYWxWYWx1ZV9mZWF0dXJlIiwgIl9VSV9JbnRlZ2VyTW9kaWZpZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuSU5URUdFUl9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBJbnRlZ2VyTW9kaWZpZXIuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvSW50ZWdlck1vZGlmaWVyIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKEludGVnZXJNb2RpZmllcilvYmplY3QpLmdldEZlYXR1cmVOYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfSW50ZWdlck1vZGlmaWVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX0ludGVnZXJNb2RpZmllcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSW50ZWdlck1vZGlmaWVyLmNsYXNzKSkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9NT0RJRklFUl9fVkFMVUU6CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX01PRElGSUVSX19PUklHSU5BTF9WQUxVRToKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvSW50ZWdlck5PUE1vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9JbnRlZ2VyTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmIxYzJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvSW50ZWdlck5PUE1vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlck5PUE1vZGlmaWVyOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJOT1BNb2RpZmllcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgSW50ZWdlck5PUE1vZGlmaWVySXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBOT1BNb2RpZmllckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSW50ZWdlck5PUE1vZGlmaWVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKEludGVnZXJOT1BNb2RpZmllcilvYmplY3QpLmdldEZlYXR1cmVOYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfSW50ZWdlck5PUE1vZGlmaWVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX0ludGVnZXJOT1BNb2RpZmllcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9JbnRlZ2VyUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvSW50ZWdlclJhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjc5ZjVlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvSW50ZWdlclJhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIyNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyUmFuZ2VNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJSYW5nZU1vZGlmaWVyfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlZ2VyUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJbnRlZ2VyUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisvLwkvKioKKy8vCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorLy8JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKy8vCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorLy8JICogQGdlbmVyYXRlZAorLy8JICovCisvLwlAT3ZlcnJpZGUKKy8vCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKy8vCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworLy8JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisvLworLy8JCQlhZGRTdGFydFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisvLwkJCWFkZEVuZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisvLwkJCWFkZEluY3JlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworLy8JCQlhZGROZXh0VmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKy8vCQl9CisvLwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworLy8JfQorCQorCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkU3RhcnRWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkRW5kVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZEluY3JlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisJCisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3RhcnQgVmFsdWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTdGFydFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfSW50ZWdlclJhbmdlTW9kaWZpZXJfc3RhcnRWYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbnRlZ2VyUmFuZ2VNb2RpZmllcl9zdGFydFZhbHVlX2ZlYXR1cmUiLCAiX1VJX0ludGVnZXJSYW5nZU1vZGlmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLklOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX1NUQVJUX1ZBTFVFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuSU5URUdSQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRW5kIFZhbHVlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkRW5kVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9JbnRlZ2VyUmFuZ2VNb2RpZmllcl9lbmRWYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbnRlZ2VyUmFuZ2VNb2RpZmllcl9lbmRWYWx1ZV9mZWF0dXJlIiwgIl9VSV9JbnRlZ2VyUmFuZ2VNb2RpZmllcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIE1vZGlmaWVyUGFja2FnZS5MaXRlcmFscy5JTlRFR0VSX1JBTkdFX01PRElGSUVSX19FTkRfVkFMVUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbmNyZW1lbnQgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRJbmNyZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9JbnRlZ2VyUmFuZ2VNb2RpZmllcl9pbmNyZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSW50ZWdlclJhbmdlTW9kaWZpZXJfaW5jcmVtZW50X2ZlYXR1cmUiLCAiX1VJX0ludGVnZXJSYW5nZU1vZGlmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLklOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX0lOQ1JFTUVOVCwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJZmluYWwgSW50ZWdlclJhbmdlTW9kaWZpZXIgcm0gPSAoSW50ZWdlclJhbmdlTW9kaWZpZXIpb2JqZWN0OworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIocm0uZ2V0RmVhdHVyZU5hbWUoKSk7CisJCXNiLmFwcGVuZCgiOiAiKTsKKwkJc2IuYXBwZW5kKHJtLmdldFN0YXJ0VmFsdWUoKSk7CisJCXNiLmFwcGVuZCgiIHRvICIpOworCQlzYi5hcHBlbmQocm0uZ2V0RW5kVmFsdWUoKSk7CisJCXNiLmFwcGVuZCgiIGJ5ICIpOworCQlzYi5hcHBlbmQocm0uZ2V0SW5jcmVtZW50KCkpOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9IC8vIGdldFRleHQKKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoSW50ZWdlclJhbmdlTW9kaWZpZXIpb2JqZWN0KS5nZXRGZWF0dXJlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0ludGVnZXJSYW5nZU1vZGlmaWVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX0ludGVnZXJSYW5nZU1vZGlmaWVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJbnRlZ2VyUmFuZ2VNb2RpZmllci5jbGFzcykpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLklOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX1NUQVJUX1ZBTFVFOgorCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fRU5EX1ZBTFVFOgorCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fSU5DUkVNRU5UOgorCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9SQU5HRV9NT0RJRklFUl9fTkVYVF9WQUxVRToKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLklOVEVHRVJfUkFOR0VfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9JbnRlZ2VyU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTg3NDMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJTZXF1ZW5jZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJ9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEludGVnZXJTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJbnRlZ2VyU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRTZXF1ZW5jZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VxdWVuY2UgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZXF1ZW5jZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0ludGVnZXJTZXF1ZW5jZU1vZGlmaWVyX3NlcXVlbmNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0ludGVnZXJTZXF1ZW5jZU1vZGlmaWVyX3NlcXVlbmNlX2ZlYXR1cmUiLCAiX1VJX0ludGVnZXJTZXF1ZW5jZU1vZGlmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLklOVEVHRVJfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChJbnRlZ2VyU2VxdWVuY2VNb2RpZmllcilvYmplY3QpLmdldEZlYXR1cmVOYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEludGVnZXJTZXF1ZW5jZU1vZGlmaWVyLmNsYXNzKSkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0U6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL0xvbmdNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvTG9uZ01vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNmN2QzMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL0xvbmdNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdNb2RpZmllcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTG9uZ01vZGlmaWVySXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBTaW5nbGVWYWx1ZU1vZGlmaWVySXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMb25nTW9kaWZpZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZE9yaWdpbmFsVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhbHVlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Mb25nTW9kaWZpZXJfdmFsdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTG9uZ01vZGlmaWVyX3ZhbHVlX2ZlYXR1cmUiLCAiX1VJX0xvbmdNb2RpZmllcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIE1vZGlmaWVyUGFja2FnZS5MaXRlcmFscy5MT05HX01PRElGSUVSX19WQUxVRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE9yaWdpbmFsIFZhbHVlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkT3JpZ2luYWxWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0xvbmdNb2RpZmllcl9vcmlnaW5hbFZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0xvbmdNb2RpZmllcl9vcmlnaW5hbFZhbHVlX2ZlYXR1cmUiLCAiX1VJX0xvbmdNb2RpZmllcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIE1vZGlmaWVyUGFja2FnZS5MaXRlcmFscy5MT05HX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIExvbmdNb2RpZmllci5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Mb25nTW9kaWZpZXIiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoTG9uZ01vZGlmaWVyKW9iamVjdCkuZ2V0RmVhdHVyZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9Mb25nTW9kaWZpZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfTG9uZ01vZGlmaWVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChMb25nTW9kaWZpZXIuY2xhc3MpKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5MT05HX01PRElGSUVSX19WQUxVRToKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkxPTkdfTU9ESUZJRVJfX09SSUdJTkFMX1ZBTFVFOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9Mb25nTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL0xvbmdOT1BNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OGRmMzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9Mb25nTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nTk9QTW9kaWZpZXI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ05PUE1vZGlmaWVyfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBMb25nTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIKKwlleHRlbmRzIE5PUE1vZGlmaWVySXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMb25nTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoTG9uZ05PUE1vZGlmaWVyKW9iamVjdCkuZ2V0RmVhdHVyZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9Mb25nTk9QTW9kaWZpZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfTG9uZ05PUE1vZGlmaWVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL0xvbmdSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9Mb25nUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMDc4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9Mb25nUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjI2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ1JhbmdlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nUmFuZ2VNb2RpZmllcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTG9uZ1JhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXIKKwlleHRlbmRzIFJhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExvbmdSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKy8vCS8qKgorLy8JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisvLwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorLy8JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisvLwkgKiBAZ2VuZXJhdGVkCisvLwkgKi8KKy8vCUBPdmVycmlkZQorLy8JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworLy8JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisvLwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKy8vCisvLwkJCWFkZFN0YXJ0VmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKy8vCQkJYWRkRW5kVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKy8vCQkJYWRkSW5jcmVtZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisvLwkJCWFkZE5leHRWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworLy8JCX0KKy8vCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisvLwl9CisJCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRTdGFydFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRFbmRWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkSW5jcmVtZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdGFydCBWYWx1ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0VmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Mb25nUmFuZ2VNb2RpZmllcl9zdGFydFZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0xvbmdSYW5nZU1vZGlmaWVyX3N0YXJ0VmFsdWVfZmVhdHVyZSIsICJfVUlfTG9uZ1JhbmdlTW9kaWZpZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuTE9OR19SQU5HRV9NT0RJRklFUl9fU1RBUlRfVkFMVUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFbmQgVmFsdWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0xvbmdSYW5nZU1vZGlmaWVyX2VuZFZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0xvbmdSYW5nZU1vZGlmaWVyX2VuZFZhbHVlX2ZlYXR1cmUiLCAiX1VJX0xvbmdSYW5nZU1vZGlmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLkxPTkdfUkFOR0VfTU9ESUZJRVJfX0VORF9WQUxVRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEluY3JlbWVudCBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEluY3JlbWVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0xvbmdSYW5nZU1vZGlmaWVyX2luY3JlbWVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Mb25nUmFuZ2VNb2RpZmllcl9pbmNyZW1lbnRfZmVhdHVyZSIsICJfVUlfTG9uZ1JhbmdlTW9kaWZpZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuTE9OR19SQU5HRV9NT0RJRklFUl9fSU5DUkVNRU5ULAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuSU5URUdSQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlmaW5hbCBMb25nUmFuZ2VNb2RpZmllciBybSA9IChMb25nUmFuZ2VNb2RpZmllcilvYmplY3Q7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihybS5nZXRGZWF0dXJlTmFtZSgpKTsKKwkJc2IuYXBwZW5kKCI6ICIpOworCQlzYi5hcHBlbmQocm0uZ2V0U3RhcnRWYWx1ZSgpKTsKKwkJc2IuYXBwZW5kKCIgdG8gIik7CisJCXNiLmFwcGVuZChybS5nZXRFbmRWYWx1ZSgpKTsKKwkJc2IuYXBwZW5kKCIgYnkgIik7CisJCXNiLmFwcGVuZChybS5nZXRJbmNyZW1lbnQoKSk7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0gLy8gZ2V0VGV4dAorCQorCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChMb25nUmFuZ2VNb2RpZmllcilvYmplY3QpLmdldEZlYXR1cmVOYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfTG9uZ1JhbmdlTW9kaWZpZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfTG9uZ1JhbmdlTW9kaWZpZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKExvbmdSYW5nZU1vZGlmaWVyLmNsYXNzKSkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTE9OR19SQU5HRV9NT0RJRklFUl9fU1RBUlRfVkFMVUU6CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5MT05HX1JBTkdFX01PRElGSUVSX19FTkRfVkFMVUU6CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5MT05HX1JBTkdFX01PRElGSUVSX19JTkNSRU1FTlQ6CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5MT05HX1JBTkdFX01PRElGSUVSX19ORVhUX1ZBTFVFOgorCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTE9OR19SQU5HRV9NT0RJRklFUl9fT1JJR0lOQUxfVkFMVUU6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL0xvbmdTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9Mb25nU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYTQ3NzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9Mb25nU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ1NlcXVlbmNlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nU2VxdWVuY2VNb2RpZmllcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTG9uZ1NlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIKKwlleHRlbmRzIFNlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExvbmdTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZFNlcXVlbmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZXF1ZW5jZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFNlcXVlbmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTG9uZ1NlcXVlbmNlTW9kaWZpZXJfc2VxdWVuY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTG9uZ1NlcXVlbmNlTW9kaWZpZXJfc2VxdWVuY2VfZmVhdHVyZSIsICJfVUlfTG9uZ1NlcXVlbmNlTW9kaWZpZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuTE9OR19TRVFVRU5DRV9NT0RJRklFUl9fU0VRVUVOQ0UsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKExvbmdTZXF1ZW5jZU1vZGlmaWVyKW9iamVjdCkuZ2V0RmVhdHVyZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9Mb25nU2VxdWVuY2VNb2RpZmllcl90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9Mb25nU2VxdWVuY2VNb2RpZmllcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTG9uZ1NlcXVlbmNlTW9kaWZpZXIuY2xhc3MpKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5MT05HX1NFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRToKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL01vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhZmU2YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL01vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMzIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcm92aWRlci5EZWNvcmF0b3JJdGVtUHJvdmlkZXI7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLklkZW50aWZpYWJsZUl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJ9IG9iamVjdC4gPCEtLQorICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNb2RpZmllckl0ZW1Qcm92aWRlciBleHRlbmRzIERlY29yYXRvckl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNb2RpZmllckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkVGFyZ2V0VVJJUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRDb21wbGV0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFyZ2V0IFVSSSBmZWF0dXJlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUYXJnZXRVUklQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Nb2RpZmllcl90YXJnZXRVUklfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTW9kaWZpZXJfdGFyZ2V0VVJJX2ZlYXR1cmUiLCAiX1VJX01vZGlmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLk1PRElGSUVSX19UQVJHRVRfVVJJLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29tcGxldGUgZmVhdHVyZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQ29tcGxldGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Nb2RpZmllcl9jb21wbGV0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Nb2RpZmllcl9jb21wbGV0ZV9mZWF0dXJlIiwgIl9VSV9Nb2RpZmllcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIE1vZGlmaWVyUGFja2FnZS5MaXRlcmFscy5NT0RJRklFUl9fQ09NUExFVEUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCisJCQlPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKE1vZGlmaWVyUGFja2FnZS5MaXRlcmFscy5NT0RJRklFUl9fRkVBVFVSRV9NT0RJRklFUlMpOworCQl9CisJCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKKwkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgorCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCisKKwkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgTW9kaWZpZXIuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbW9iajE2L01vZGlmaWVyIikpOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCAgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJZmluYWwgU3RyaW5nIHRpdGxlID0gKChJZGVudGlmaWFibGUpb2JqZWN0KS5nZXRVUkkoKS5sYXN0U2VnbWVudCgpOworCQlyZXR1cm4gdGl0bGU7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlVUkkgbGFiZWxWYWx1ZSA9ICgoTW9kaWZpZXIpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9Nb2RpZmllcl90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9Nb2RpZmllcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCQorCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1vZGlmaWVyLmNsYXNzKSkgeworCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTU9ESUZJRVJfX0NPTVBMRVRFOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5NT0RJRklFUl9fRkVBVFVSRV9NT0RJRklFUlM6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cworCSAqIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAorCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBDb3JlRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL01vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL01vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGE4NWVhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvTW9kaWZpZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNjYzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnV0aWwuTW9kaWZpZXJBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuCisgKiBUaGUgYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4KKyAqIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCisgKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIE1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBNb2RpZmllckFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieSB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248T2JqZWN0PiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNb2RpZmllckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgeworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlTk9QTW9kaWZpZXJ9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRG91YmxlTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIgZG91YmxlTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZU5PUE1vZGlmaWVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb3VibGVOT1BNb2RpZmllckFkYXB0ZXIoKSB7CisJCWlmIChkb3VibGVOT1BNb2RpZmllckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlkb3VibGVOT1BNb2RpZmllckl0ZW1Qcm92aWRlciA9IG5ldyBEb3VibGVOT1BNb2RpZmllckl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBkb3VibGVOT1BNb2RpZmllckl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVSYW5nZU1vZGlmaWVyfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIERvdWJsZVJhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXIgZG91YmxlUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlUmFuZ2VNb2RpZmllcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRG91YmxlUmFuZ2VNb2RpZmllckFkYXB0ZXIoKSB7CisJCWlmIChkb3VibGVSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCWRvdWJsZVJhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXIgPSBuZXcgRG91YmxlUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBkb3VibGVSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZVNlcXVlbmNlTW9kaWZpZXJ9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRG91YmxlU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlciBkb3VibGVTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVTZXF1ZW5jZU1vZGlmaWVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb3VibGVTZXF1ZW5jZU1vZGlmaWVyQWRhcHRlcigpIHsKKwkJaWYgKGRvdWJsZVNlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJZG91YmxlU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlciA9IG5ldyBEb3VibGVTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGRvdWJsZVNlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlck5PUE1vZGlmaWVyfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEludGVnZXJOT1BNb2RpZmllckl0ZW1Qcm92aWRlciBpbnRlZ2VyTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJOT1BNb2RpZmllcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSW50ZWdlck5PUE1vZGlmaWVyQWRhcHRlcigpIHsKKwkJaWYgKGludGVnZXJOT1BNb2RpZmllckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlpbnRlZ2VyTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIgPSBuZXcgSW50ZWdlck5PUE1vZGlmaWVySXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGludGVnZXJOT1BNb2RpZmllckl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyUmFuZ2VNb2RpZmllcn0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJbnRlZ2VyUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlciBpbnRlZ2VyUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlclJhbmdlTW9kaWZpZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUludGVnZXJSYW5nZU1vZGlmaWVyQWRhcHRlcigpIHsKKwkJaWYgKGludGVnZXJSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCWludGVnZXJSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyID0gbmV3IEludGVnZXJSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGludGVnZXJSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJTZXF1ZW5jZU1vZGlmaWVyfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEludGVnZXJTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyIGludGVnZXJTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyU2VxdWVuY2VNb2RpZmllcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJBZGFwdGVyKCkgeworCQlpZiAoaW50ZWdlclNlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJaW50ZWdlclNlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIgPSBuZXcgSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gaW50ZWdlclNlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ05PUE1vZGlmaWVyfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIExvbmdOT1BNb2RpZmllckl0ZW1Qcm92aWRlciBsb25nTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdOT1BNb2RpZmllcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9uZ05PUE1vZGlmaWVyQWRhcHRlcigpIHsKKwkJaWYgKGxvbmdOT1BNb2RpZmllckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlsb25nTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIgPSBuZXcgTG9uZ05PUE1vZGlmaWVySXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGxvbmdOT1BNb2RpZmllckl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nUmFuZ2VNb2RpZmllcn0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBMb25nUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlciBsb25nUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ1JhbmdlTW9kaWZpZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvbmdSYW5nZU1vZGlmaWVyQWRhcHRlcigpIHsKKwkJaWYgKGxvbmdSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCWxvbmdSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyID0gbmV3IExvbmdSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGxvbmdSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdTZXF1ZW5jZU1vZGlmaWVyfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIExvbmdTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyIGxvbmdTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nU2VxdWVuY2VNb2RpZmllcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9uZ1NlcXVlbmNlTW9kaWZpZXJBZGFwdGVyKCkgeworCQlpZiAobG9uZ1NlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJbG9uZ1NlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIgPSBuZXcgTG9uZ1NlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gbG9uZ1NlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJ9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTW9kaWZpZXJJdGVtUHJvdmlkZXIgbW9kaWZpZXJJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2RpZmllckFkYXB0ZXIoKSB7CisJCWlmIChtb2RpZmllckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQltb2RpZmllckl0ZW1Qcm92aWRlciA9IG5ldyBNb2RpZmllckl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBtb2RpZmllckl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5OT1BNb2RpZmllcn0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBOT1BNb2RpZmllckl0ZW1Qcm92aWRlciBub3BNb2RpZmllckl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTk9QTW9kaWZpZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5PUE1vZGlmaWVyQWRhcHRlcigpIHsKKwkJaWYgKG5vcE1vZGlmaWVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCW5vcE1vZGlmaWVySXRlbVByb3ZpZGVyID0gbmV3IE5PUE1vZGlmaWVySXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIG5vcE1vZGlmaWVySXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lTk9QTW9kaWZpZXJ9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU1RFTVRpbWVOT1BNb2RpZmllckl0ZW1Qcm92aWRlciBzdGVtVGltZU5PUE1vZGlmaWVySXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZU5PUE1vZGlmaWVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTVEVNVGltZU5PUE1vZGlmaWVyQWRhcHRlcigpIHsKKwkJaWYgKHN0ZW1UaW1lTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJc3RlbVRpbWVOT1BNb2RpZmllckl0ZW1Qcm92aWRlciA9IG5ldyBTVEVNVGltZU5PUE1vZGlmaWVySXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHN0ZW1UaW1lTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVSYW5nZU1vZGlmaWVyfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNURU1UaW1lUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlciBzdGVtVGltZVJhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lUmFuZ2VNb2RpZmllcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU1RFTVRpbWVSYW5nZU1vZGlmaWVyQWRhcHRlcigpIHsKKwkJaWYgKHN0ZW1UaW1lUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlzdGVtVGltZVJhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXIgPSBuZXcgU1RFTVRpbWVSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHN0ZW1UaW1lUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJ9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyIHN0ZW1UaW1lU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJBZGFwdGVyKCkgeworCQlpZiAoc3RlbVRpbWVTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXN0ZW1UaW1lU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlciA9IG5ldyBTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gc3RlbVRpbWVTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlN0cmluZ05PUE1vZGlmaWVyfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZ05PUE1vZGlmaWVySXRlbVByb3ZpZGVyIHN0cmluZ05PUE1vZGlmaWVySXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TdHJpbmdOT1BNb2RpZmllcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RyaW5nTk9QTW9kaWZpZXJBZGFwdGVyKCkgeworCQlpZiAoc3RyaW5nTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJc3RyaW5nTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIgPSBuZXcgU3RyaW5nTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gc3RyaW5nTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU3RyaW5nU2VxdWVuY2VNb2RpZmllcn0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmdTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyIHN0cmluZ1NlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlN0cmluZ1NlcXVlbmNlTW9kaWZpZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0cmluZ1NlcXVlbmNlTW9kaWZpZXJBZGFwdGVyKCkgeworCQlpZiAoc3RyaW5nU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlzdHJpbmdTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyID0gbmV3IFN0cmluZ1NlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gc3RyaW5nU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVNb2RpZmllcn0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEb3VibGVNb2RpZmllckl0ZW1Qcm92aWRlciBkb3VibGVNb2RpZmllckl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlTW9kaWZpZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvdWJsZU1vZGlmaWVyQWRhcHRlcigpIHsKKwkJaWYgKGRvdWJsZU1vZGlmaWVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCWRvdWJsZU1vZGlmaWVySXRlbVByb3ZpZGVyID0gbmV3IERvdWJsZU1vZGlmaWVySXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGRvdWJsZU1vZGlmaWVySXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJNb2RpZmllcn0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJbnRlZ2VyTW9kaWZpZXJJdGVtUHJvdmlkZXIgaW50ZWdlck1vZGlmaWVySXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyTW9kaWZpZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUludGVnZXJNb2RpZmllckFkYXB0ZXIoKSB7CisJCWlmIChpbnRlZ2VyTW9kaWZpZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJaW50ZWdlck1vZGlmaWVySXRlbVByb3ZpZGVyID0gbmV3IEludGVnZXJNb2RpZmllckl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBpbnRlZ2VyTW9kaWZpZXJJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ01vZGlmaWVyfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIExvbmdNb2RpZmllckl0ZW1Qcm92aWRlciBsb25nTW9kaWZpZXJJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdNb2RpZmllcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9uZ01vZGlmaWVyQWRhcHRlcigpIHsKKwkJaWYgKGxvbmdNb2RpZmllckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlsb25nTW9kaWZpZXJJdGVtUHJvdmlkZXIgPSBuZXcgTG9uZ01vZGlmaWVySXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGxvbmdNb2RpZmllckl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZU1vZGlmaWVyfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNURU1UaW1lTW9kaWZpZXJJdGVtUHJvdmlkZXIgc3RlbVRpbWVNb2RpZmllckl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVNb2RpZmllcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU1RFTVRpbWVNb2RpZmllckFkYXB0ZXIoKSB7CisJCWlmIChzdGVtVGltZU1vZGlmaWVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXN0ZW1UaW1lTW9kaWZpZXJJdGVtUHJvdmlkZXIgPSBuZXcgU1RFTVRpbWVNb2RpZmllckl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBzdGVtVGltZU1vZGlmaWVySXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7CisJCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKKwkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKKwkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKKwkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzczw/PikgfHwgKCgoQ2xhc3M8Pz4pdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKKwkJCQlyZXR1cm4gYWRhcHRlcjsKKwkJCX0KKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKKwkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfSBhbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCisJCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7CisJCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LiAKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlpZiAoZG91YmxlTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIgIT0gbnVsbCkgZG91YmxlTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoZG91YmxlUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlciAhPSBudWxsKSBkb3VibGVSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKGRvdWJsZVNlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIgIT0gbnVsbCkgZG91YmxlU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChpbnRlZ2VyTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIgIT0gbnVsbCkgaW50ZWdlck5PUE1vZGlmaWVySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKGludGVnZXJSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyICE9IG51bGwpIGludGVnZXJSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKGludGVnZXJTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyICE9IG51bGwpIGludGVnZXJTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKGxvbmdOT1BNb2RpZmllckl0ZW1Qcm92aWRlciAhPSBudWxsKSBsb25nTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAobG9uZ1JhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXIgIT0gbnVsbCkgbG9uZ1JhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAobG9uZ1NlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIgIT0gbnVsbCkgbG9uZ1NlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAobW9kaWZpZXJJdGVtUHJvdmlkZXIgIT0gbnVsbCkgbW9kaWZpZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAobm9wTW9kaWZpZXJJdGVtUHJvdmlkZXIgIT0gbnVsbCkgbm9wTW9kaWZpZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoc3RlbVRpbWVOT1BNb2RpZmllckl0ZW1Qcm92aWRlciAhPSBudWxsKSBzdGVtVGltZU5PUE1vZGlmaWVySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKHN0ZW1UaW1lUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlciAhPSBudWxsKSBzdGVtVGltZVJhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoc3RlbVRpbWVTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyICE9IG51bGwpIHN0ZW1UaW1lU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChzdHJpbmdOT1BNb2RpZmllckl0ZW1Qcm92aWRlciAhPSBudWxsKSBzdHJpbmdOT1BNb2RpZmllckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChzdHJpbmdTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyICE9IG51bGwpIHN0cmluZ1NlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoZG91YmxlTW9kaWZpZXJJdGVtUHJvdmlkZXIgIT0gbnVsbCkgZG91YmxlTW9kaWZpZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoaW50ZWdlck1vZGlmaWVySXRlbVByb3ZpZGVyICE9IG51bGwpIGludGVnZXJNb2RpZmllckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChsb25nTW9kaWZpZXJJdGVtUHJvdmlkZXIgIT0gbnVsbCkgbG9uZ01vZGlmaWVySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKHN0ZW1UaW1lTW9kaWZpZXJJdGVtUHJvdmlkZXIgIT0gbnVsbCkgc3RlbVRpbWVNb2RpZmllckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9OT1BNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWU0YTM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5OT1BNb2RpZmllcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5OT1BNb2RpZmllcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIKKwlleHRlbmRzIEZlYXR1cmVNb2RpZmllckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgTk9QTW9kaWZpZXIuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTk9QTW9kaWZpZXIiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoTk9QTW9kaWZpZXIpb2JqZWN0KS5nZXRGZWF0dXJlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX05PUE1vZGlmaWVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX05PUE1vZGlmaWVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL1JhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL1JhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDRhZDNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5SYW5nZU1vZGlmaWVyOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlJhbmdlTW9kaWZpZXJ9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXIKKwlleHRlbmRzIEZlYXR1cmVNb2RpZmllckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSYW5nZU1vZGlmaWVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFJhbmdlTW9kaWZpZXIuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUmFuZ2VNb2RpZmllciIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChSYW5nZU1vZGlmaWVyKW9iamVjdCkuZ2V0RmVhdHVyZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9SYW5nZU1vZGlmaWVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX1JhbmdlTW9kaWZpZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvU1RFTVRpbWVNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvU1RFTVRpbWVNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYzdhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9TVEVNVGltZU1vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZU1vZGlmaWVyOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lTW9kaWZpZXJ9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNURU1UaW1lTW9kaWZpZXJJdGVtUHJvdmlkZXIKKwlleHRlbmRzIFNpbmdsZVZhbHVlTW9kaWZpZXJJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNURU1UaW1lTW9kaWZpZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZE9yaWdpbmFsVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhbHVlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TVEVNVGltZU1vZGlmaWVyX3ZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NURU1UaW1lTW9kaWZpZXJfdmFsdWVfZmVhdHVyZSIsICJfVUlfU1RFTVRpbWVNb2RpZmllcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIE1vZGlmaWVyUGFja2FnZS5MaXRlcmFscy5TVEVNX1RJTUVfTU9ESUZJRVJfX1ZBTFVFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgdHJ1ZSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBPcmlnaW5hbCBWYWx1ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZE9yaWdpbmFsVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TVEVNVGltZU1vZGlmaWVyX29yaWdpbmFsVmFsdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU1RFTVRpbWVNb2RpZmllcl9vcmlnaW5hbFZhbHVlX2ZlYXR1cmUiLCAiX1VJX1NURU1UaW1lTW9kaWZpZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuU1RFTV9USU1FX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIHRydWUsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgU1RFTVRpbWVNb2RpZmllci5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9TVEVNVGltZU1vZGlmaWVyIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKFNURU1UaW1lTW9kaWZpZXIpb2JqZWN0KS5nZXRGZWF0dXJlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1NURU1UaW1lTW9kaWZpZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfU1RFTVRpbWVNb2RpZmllcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9TVEVNVGltZU5PUE1vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9TVEVNVGltZU5PUE1vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5NjgwZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL1NURU1UaW1lTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZU5PUE1vZGlmaWVyOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lTk9QTW9kaWZpZXJ9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNURU1UaW1lTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIKKwlleHRlbmRzIE5PUE1vZGlmaWVySXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTVEVNVGltZU5PUE1vZGlmaWVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKFNURU1UaW1lTk9QTW9kaWZpZXIpb2JqZWN0KS5nZXRGZWF0dXJlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1NURU1UaW1lTk9QTW9kaWZpZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfU1RFTVRpbWVOT1BNb2RpZmllcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9TVEVNVGltZVJhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL1NURU1UaW1lUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMzA3ODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9TVEVNVGltZVJhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI0NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lUmFuZ2VNb2RpZmllcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZVJhbmdlTW9kaWZpZXJ9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNURU1UaW1lUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgUmFuZ2VNb2RpZmllckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTVEVNVGltZVJhbmdlTW9kaWZpZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworLy8JLyoqCisvLwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKy8vCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisvLwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKy8vCSAqIEBnZW5lcmF0ZWQKKy8vCSAqLworLy8JQE92ZXJyaWRlCisvLwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisvLwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKy8vCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworLy8KKy8vCQkJYWRkU3RhcnRWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworLy8JCQlhZGRFbmRWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworLy8JCQlhZGRJbmNyZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKy8vCQkJYWRkTmV4dFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisvLwkJfQorLy8JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKy8vCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZFN0YXJ0VmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZEVuZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRJbmNyZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZE5leHRWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisJCisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3RhcnQgVmFsdWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTdGFydFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU1RFTVRpbWVSYW5nZU1vZGlmaWVyX3N0YXJ0VmFsdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU1RFTVRpbWVSYW5nZU1vZGlmaWVyX3N0YXJ0VmFsdWVfZmVhdHVyZSIsICJfVUlfU1RFTVRpbWVSYW5nZU1vZGlmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLlNURU1fVElNRV9SQU5HRV9NT0RJRklFUl9fU1RBUlRfVkFMVUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSB0cnVlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVuZCBWYWx1ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEVuZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU1RFTVRpbWVSYW5nZU1vZGlmaWVyX2VuZFZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NURU1UaW1lUmFuZ2VNb2RpZmllcl9lbmRWYWx1ZV9mZWF0dXJlIiwgIl9VSV9TVEVNVGltZVJhbmdlTW9kaWZpZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19FTkRfVkFMVUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSB0cnVlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEluY3JlbWVudCBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEluY3JlbWVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NURU1UaW1lUmFuZ2VNb2RpZmllcl9pbmNyZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU1RFTVRpbWVSYW5nZU1vZGlmaWVyX2luY3JlbWVudF9mZWF0dXJlIiwgIl9VSV9TVEVNVGltZVJhbmdlTW9kaWZpZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuU1RFTV9USU1FX1JBTkdFX01PRElGSUVSX19JTkNSRU1FTlQsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOZXh0IFZhbHVlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkTmV4dFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU1RFTVRpbWVSYW5nZU1vZGlmaWVyX25leHRWYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TVEVNVGltZVJhbmdlTW9kaWZpZXJfbmV4dFZhbHVlX2ZlYXR1cmUiLCAiX1VJX1NURU1UaW1lUmFuZ2VNb2RpZmllcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIE1vZGlmaWVyUGFja2FnZS5MaXRlcmFscy5TVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfX05FWFRfVkFMVUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCWZpbmFsIFNURU1UaW1lUmFuZ2VNb2RpZmllciBybSA9IChTVEVNVGltZVJhbmdlTW9kaWZpZXIpb2JqZWN0OworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIocm0uZ2V0RmVhdHVyZU5hbWUoKSk7CisJCXNiLmFwcGVuZCgiOiAiKTsKKwkJc2IuYXBwZW5kKHJtLmdldFN0YXJ0VmFsdWUoKSk7CisJCXNiLmFwcGVuZCgiIHRvICIpOworCQlzYi5hcHBlbmQocm0uZ2V0RW5kVmFsdWUoKSk7CisJCXNiLmFwcGVuZCgiIGJ5ICIpOworCQlzYi5hcHBlbmQocm0uZ2V0SW5jcmVtZW50KCkpOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9IC8vIGdldFRleHQKKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoU1RFTVRpbWVSYW5nZU1vZGlmaWVyKW9iamVjdCkuZ2V0RmVhdHVyZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9TVEVNVGltZVJhbmdlTW9kaWZpZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfU1RFTVRpbWVSYW5nZU1vZGlmaWVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTVEVNVGltZVJhbmdlTW9kaWZpZXIuY2xhc3MpKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfUkFOR0VfTU9ESUZJRVJfX0lOQ1JFTUVOVDoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9TVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYThiMGZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lU2VxdWVuY2VNb2RpZmllcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJ9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNURU1UaW1lU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZFNlcXVlbmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZXF1ZW5jZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFNlcXVlbmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyX3NlcXVlbmNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NURU1UaW1lU2VxdWVuY2VNb2RpZmllcl9zZXF1ZW5jZV9mZWF0dXJlIiwgIl9VSV9TVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBNb2RpZmllclBhY2thZ2UuTGl0ZXJhbHMuU1RFTV9USU1FX1NFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIHRydWUsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyKW9iamVjdCkuZ2V0RmVhdHVyZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9TVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL1NlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Byb3ZpZGVyL1NlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmMzNDUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjIxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2VxdWVuY2VNb2RpZmllcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TZXF1ZW5jZU1vZGlmaWVyfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBGZWF0dXJlTW9kaWZpZXJJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRTZXF1ZW5jZVNpemVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZEN1cnJlbnRTZXF1ZW5jZUluZGV4UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGROZXh0VmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZE9yaWdpbmFsVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlcXVlbmNlIFNpemUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZXF1ZW5jZVNpemVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TZXF1ZW5jZU1vZGlmaWVyX3NlcXVlbmNlU2l6ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXF1ZW5jZU1vZGlmaWVyX3NlcXVlbmNlU2l6ZV9mZWF0dXJlIiwgIl9VSV9TZXF1ZW5jZU1vZGlmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRV9TSVpFLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEN1cnJlbnQgU2VxdWVuY2UgSW5kZXggZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDdXJyZW50U2VxdWVuY2VJbmRleFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NlcXVlbmNlTW9kaWZpZXJfY3VycmVudFNlcXVlbmNlSW5kZXhfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VxdWVuY2VNb2RpZmllcl9jdXJyZW50U2VxdWVuY2VJbmRleF9mZWF0dXJlIiwgIl9VSV9TZXF1ZW5jZU1vZGlmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTkNFX01PRElGSUVSX19DVVJSRU5UX1NFUVVFTkNFX0lOREVYLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5leHQgVmFsdWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGROZXh0VmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TZXF1ZW5jZU1vZGlmaWVyX25leHRWYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXF1ZW5jZU1vZGlmaWVyX25leHRWYWx1ZV9mZWF0dXJlIiwgIl9VSV9TZXF1ZW5jZU1vZGlmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTkNFX01PRElGSUVSX19ORVhUX1ZBTFVFLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgT3JpZ2luYWwgVmFsdWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRPcmlnaW5hbFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU2VxdWVuY2VNb2RpZmllcl9vcmlnaW5hbFZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcXVlbmNlTW9kaWZpZXJfb3JpZ2luYWxWYWx1ZV9mZWF0dXJlIiwgIl9VSV9TZXF1ZW5jZU1vZGlmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTW9kaWZpZXJQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTkNFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgU2VxdWVuY2VNb2RpZmllci5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9TZXF1ZW5jZU1vZGlmaWVyIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKFNlcXVlbmNlTW9kaWZpZXIpb2JqZWN0KS5nZXRGZWF0dXJlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1NlcXVlbmNlTW9kaWZpZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfU2VxdWVuY2VNb2RpZmllcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VxdWVuY2VNb2RpZmllci5jbGFzcykpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNFUVVFTkNFX01PRElGSUVSX19TRVFVRU5DRV9TSVpFOgorCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU0VRVUVOQ0VfTU9ESUZJRVJfX0NVUlJFTlRfU0VRVUVOQ0VfSU5ERVg6CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TRVFVRU5DRV9NT0RJRklFUl9fTkVYVF9WQUxVRToKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNFUVVFTkNFX01PRElGSUVSX19PUklHSU5BTF9WQUxVRToKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvU2luZ2xlVmFsdWVNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvU2luZ2xlVmFsdWVNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MGE1MmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9TaW5nbGVWYWx1ZU1vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMDggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNpbmdsZVZhbHVlTW9kaWZpZXI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2luZ2xlVmFsdWVNb2RpZmllcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU2luZ2xlVmFsdWVNb2RpZmllckl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgRmVhdHVyZU1vZGlmaWVySXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTaW5nbGVWYWx1ZU1vZGlmaWVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKFNpbmdsZVZhbHVlTW9kaWZpZXIpb2JqZWN0KS5nZXRGZWF0dXJlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1NpbmdsZVZhbHVlTW9kaWZpZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfU2luZ2xlVmFsdWVNb2RpZmllcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9TdHJpbmdOT1BNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvU3RyaW5nTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTRmNGE2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvU3RyaW5nTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TdHJpbmdOT1BNb2RpZmllcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TdHJpbmdOT1BNb2RpZmllcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RyaW5nTk9QTW9kaWZpZXJJdGVtUHJvdmlkZXIKKwlleHRlbmRzIE5PUE1vZGlmaWVySXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmdOT1BNb2RpZmllckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChTdHJpbmdOT1BNb2RpZmllcilvYmplY3QpLmdldEZlYXR1cmVOYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfU3RyaW5nTk9QTW9kaWZpZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfU3RyaW5nTk9QTW9kaWZpZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvU3RyaW5nU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJvdmlkZXIvU3RyaW5nU2VxdWVuY2VNb2RpZmllckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZjQ1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci9wcm92aWRlci9TdHJpbmdTZXF1ZW5jZU1vZGlmaWVySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TdHJpbmdTZXF1ZW5jZU1vZGlmaWVyOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlN0cmluZ1NlcXVlbmNlTW9kaWZpZXJ9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFN0cmluZ1NlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIKKwlleHRlbmRzIFNlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZ1NlcXVlbmNlTW9kaWZpZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkU2VxdWVuY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlcXVlbmNlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VxdWVuY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TdHJpbmdTZXF1ZW5jZU1vZGlmaWVyX3NlcXVlbmNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1N0cmluZ1NlcXVlbmNlTW9kaWZpZXJfc2VxdWVuY2VfZmVhdHVyZSIsICJfVUlfU3RyaW5nU2VxdWVuY2VNb2RpZmllcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIE1vZGlmaWVyUGFja2FnZS5MaXRlcmFscy5TVFJJTkdfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyKW9iamVjdCkuZ2V0RmVhdHVyZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9TdHJpbmdTZXF1ZW5jZU1vZGlmaWVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX1N0cmluZ1NlcXVlbmNlTW9kaWZpZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFN0cmluZ1NlcXVlbmNlTW9kaWZpZXIuY2xhc3MpKSB7CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TVFJJTkdfU0VRVUVOQ0VfTU9ESUZJRVJfX1NFUVVFTkNFOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci91dGlsL01vZGlmaWVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3V0aWwvTW9kaWZpZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYjQ1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci91dGlsL01vZGlmaWVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDYxOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuKjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE1vZGlmaWVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIE1vZGlmaWVyUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1vZGlmaWVyQWRhcHRlckZhY3RvcnkoKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gTW9kaWZpZXJQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7CisJCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTW9kaWZpZXJTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgTW9kaWZpZXJTd2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEb3VibGVOT1BNb2RpZmllcihEb3VibGVOT1BNb2RpZmllciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRG91YmxlTk9QTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEb3VibGVSYW5nZU1vZGlmaWVyKERvdWJsZVJhbmdlTW9kaWZpZXIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZURvdWJsZVJhbmdlTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEb3VibGVTZXF1ZW5jZU1vZGlmaWVyKERvdWJsZVNlcXVlbmNlTW9kaWZpZXIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZURvdWJsZVNlcXVlbmNlTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VGZWF0dXJlTW9kaWZpZXIoRmVhdHVyZU1vZGlmaWVyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVGZWF0dXJlTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJbnRlZ2VyTk9QTW9kaWZpZXIoSW50ZWdlck5PUE1vZGlmaWVyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVJbnRlZ2VyTk9QTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJbnRlZ2VyUmFuZ2VNb2RpZmllcihJbnRlZ2VyUmFuZ2VNb2RpZmllciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlSW50ZWdlclJhbmdlTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJbnRlZ2VyU2VxdWVuY2VNb2RpZmllcihJbnRlZ2VyU2VxdWVuY2VNb2RpZmllciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VMb25nTk9QTW9kaWZpZXIoTG9uZ05PUE1vZGlmaWVyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVMb25nTk9QTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VMb25nUmFuZ2VNb2RpZmllcihMb25nUmFuZ2VNb2RpZmllciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTG9uZ1JhbmdlTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VMb25nU2VxdWVuY2VNb2RpZmllcihMb25nU2VxdWVuY2VNb2RpZmllciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTG9uZ1NlcXVlbmNlTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNb2RpZmllcihNb2RpZmllciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VOT1BNb2RpZmllcihOT1BNb2RpZmllciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTk9QTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSYW5nZU1vZGlmaWVyKFJhbmdlTW9kaWZpZXIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVJhbmdlTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTVEVNVGltZU5PUE1vZGlmaWVyKFNURU1UaW1lTk9QTW9kaWZpZXIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNURU1UaW1lTk9QTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTVEVNVGltZVJhbmdlTW9kaWZpZXIoU1RFTVRpbWVSYW5nZU1vZGlmaWVyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTVEVNVGltZVJhbmdlTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXIoU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTZXF1ZW5jZU1vZGlmaWVyKFNlcXVlbmNlTW9kaWZpZXIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNlcXVlbmNlTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdHJpbmdOT1BNb2RpZmllcihTdHJpbmdOT1BNb2RpZmllciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU3RyaW5nTk9QTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyKFN0cmluZ1NlcXVlbmNlTW9kaWZpZXIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0cmluZ1NlcXVlbmNlTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNb2RpZmlhYmxlKE1vZGlmaWFibGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZU1vZGlmaWFibGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTaW5nbGVWYWx1ZU1vZGlmaWVyKFNpbmdsZVZhbHVlTW9kaWZpZXIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNpbmdsZVZhbHVlTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEb3VibGVNb2RpZmllcihEb3VibGVNb2RpZmllciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRG91YmxlTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJbnRlZ2VyTW9kaWZpZXIoSW50ZWdlck1vZGlmaWVyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVJbnRlZ2VyTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VMb25nTW9kaWZpZXIoTG9uZ01vZGlmaWVyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVMb25nTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTVEVNVGltZU1vZGlmaWVyKFNURU1UaW1lTW9kaWZpZXIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNURU1UaW1lTW9kaWZpZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyA8VD4gQWRhcHRlciBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGVjb3JhdG9yKERlY29yYXRvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGVjb3JhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworCQkJfQorCQl9OworCisJLyoqCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVOT1BNb2RpZmllciA8ZW0+RG91YmxlIE5PUCBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlTk9QTW9kaWZpZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRG91YmxlTk9QTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVSYW5nZU1vZGlmaWVyIDxlbT5Eb3VibGUgUmFuZ2UgTW9kaWZpZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZVJhbmdlTW9kaWZpZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRG91YmxlUmFuZ2VNb2RpZmllckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZVNlcXVlbmNlTW9kaWZpZXIgPGVtPkRvdWJsZSBTZXF1ZW5jZSBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlU2VxdWVuY2VNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb3VibGVTZXF1ZW5jZU1vZGlmaWVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRmVhdHVyZU1vZGlmaWVyIDxlbT5GZWF0dXJlIE1vZGlmaWVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRmVhdHVyZU1vZGlmaWVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlck5PUE1vZGlmaWVyIDxlbT5JbnRlZ2VyIE5PUCBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlck5PUE1vZGlmaWVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUludGVnZXJOT1BNb2RpZmllckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJSYW5nZU1vZGlmaWVyIDxlbT5JbnRlZ2VyIFJhbmdlIE1vZGlmaWVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyUmFuZ2VNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbnRlZ2VyUmFuZ2VNb2RpZmllckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJTZXF1ZW5jZU1vZGlmaWVyIDxlbT5JbnRlZ2VyIFNlcXVlbmNlIE1vZGlmaWVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyU2VxdWVuY2VNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbnRlZ2VyU2VxdWVuY2VNb2RpZmllckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdOT1BNb2RpZmllciA8ZW0+TG9uZyBOT1AgTW9kaWZpZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdOT1BNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb25nTk9QTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nUmFuZ2VNb2RpZmllciA8ZW0+TG9uZyBSYW5nZSBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ1JhbmdlTW9kaWZpZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9uZ1JhbmdlTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nU2VxdWVuY2VNb2RpZmllciA8ZW0+TG9uZyBTZXF1ZW5jZSBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ1NlcXVlbmNlTW9kaWZpZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9uZ1NlcXVlbmNlTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllciA8ZW0+TW9kaWZpZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZGlmaWVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTk9QTW9kaWZpZXIgPGVtPk5PUCBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTk9QTW9kaWZpZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTk9QTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5SYW5nZU1vZGlmaWVyIDxlbT5SYW5nZSBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuUmFuZ2VNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSYW5nZU1vZGlmaWVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVOT1BNb2RpZmllciA8ZW0+U1RFTSBUaW1lIE5PUCBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVOT1BNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTVEVNVGltZU5PUE1vZGlmaWVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVSYW5nZU1vZGlmaWVyIDxlbT5TVEVNIFRpbWUgUmFuZ2UgTW9kaWZpZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lUmFuZ2VNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTVEVNVGltZVJhbmdlTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZVNlcXVlbmNlTW9kaWZpZXIgPGVtPlNURU0gVGltZSBTZXF1ZW5jZSBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNURU1UaW1lU2VxdWVuY2VNb2RpZmllckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNlcXVlbmNlTW9kaWZpZXIgPGVtPlNlcXVlbmNlIE1vZGlmaWVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TZXF1ZW5jZU1vZGlmaWVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcXVlbmNlTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TdHJpbmdOT1BNb2RpZmllciA8ZW0+U3RyaW5nIE5PUCBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU3RyaW5nTk9QTW9kaWZpZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RyaW5nTk9QTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TdHJpbmdTZXF1ZW5jZU1vZGlmaWVyIDxlbT5TdHJpbmcgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlN0cmluZ1NlcXVlbmNlTW9kaWZpZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RyaW5nU2VxdWVuY2VNb2RpZmllckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUgPGVtPk1vZGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kaWZpYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNpbmdsZVZhbHVlTW9kaWZpZXIgPGVtPlNpbmdsZSBWYWx1ZSBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2luZ2xlVmFsdWVNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTaW5nbGVWYWx1ZU1vZGlmaWVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlTW9kaWZpZXIgPGVtPkRvdWJsZSBNb2RpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlTW9kaWZpZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRG91YmxlTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyTW9kaWZpZXIgPGVtPkludGVnZXIgTW9kaWZpZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbnRlZ2VyTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nTW9kaWZpZXIgPGVtPkxvbmcgTW9kaWZpZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdNb2RpZmllcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb25nTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZU1vZGlmaWVyIDxlbT5TVEVNIFRpbWUgTW9kaWZpZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lTW9kaWZpZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU1RFTVRpbWVNb2RpZmllckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YS5sYW5nLkNvbXBhcmFibGUgPGVtPkNvbXBhcmFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcGFyYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUgPGVtPklkZW50aWZpYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJZGVudGlmaWFibGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IgPGVtPkRlY29yYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlY29yYXRvckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9Nb2RpZmllckFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci91dGlsL01vZGlmaWVyU3dpdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci91dGlsL01vZGlmaWVyU3dpdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYyYTg0ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3V0aWwvTW9kaWZpZXJTd2l0Y2guamF2YQpAQCAtMCwwICsxLDczMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLio7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCisgKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9CisgKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCisgKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAorICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQorICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCisgKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTW9kaWZpZXJTd2l0Y2g8VDE+IHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIE1vZGlmaWVyUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1vZGlmaWVyU3dpdGNoKCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IE1vZGlmaWVyUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOworCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQxIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOworCQl9CisJCWVsc2UgeworCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7CisJCQlyZXR1cm4KKwkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPworCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6CisJCQkJCWRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUMSBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkRPVUJMRV9OT1BfTU9ESUZJRVI6IHsKKwkJCQlEb3VibGVOT1BNb2RpZmllciBkb3VibGVOT1BNb2RpZmllciA9IChEb3VibGVOT1BNb2RpZmllcil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VEb3VibGVOT1BNb2RpZmllcihkb3VibGVOT1BNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTk9QTW9kaWZpZXIoZG91YmxlTk9QTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZlYXR1cmVNb2RpZmllcihkb3VibGVOT1BNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuRE9VQkxFX1JBTkdFX01PRElGSUVSOiB7CisJCQkJRG91YmxlUmFuZ2VNb2RpZmllciBkb3VibGVSYW5nZU1vZGlmaWVyID0gKERvdWJsZVJhbmdlTW9kaWZpZXIpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlRG91YmxlUmFuZ2VNb2RpZmllcihkb3VibGVSYW5nZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSYW5nZU1vZGlmaWVyKGRvdWJsZVJhbmdlTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZlYXR1cmVNb2RpZmllcihkb3VibGVSYW5nZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfU0VRVUVOQ0VfTU9ESUZJRVI6IHsKKwkJCQlEb3VibGVTZXF1ZW5jZU1vZGlmaWVyIGRvdWJsZVNlcXVlbmNlTW9kaWZpZXIgPSAoRG91YmxlU2VxdWVuY2VNb2RpZmllcil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VEb3VibGVTZXF1ZW5jZU1vZGlmaWVyKGRvdWJsZVNlcXVlbmNlTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNlcXVlbmNlTW9kaWZpZXIoZG91YmxlU2VxdWVuY2VNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmVhdHVyZU1vZGlmaWVyKGRvdWJsZVNlcXVlbmNlTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkZFQVRVUkVfTU9ESUZJRVI6IHsKKwkJCQlGZWF0dXJlTW9kaWZpZXIgZmVhdHVyZU1vZGlmaWVyID0gKEZlYXR1cmVNb2RpZmllcil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VGZWF0dXJlTW9kaWZpZXIoZmVhdHVyZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX05PUF9NT0RJRklFUjogeworCQkJCUludGVnZXJOT1BNb2RpZmllciBpbnRlZ2VyTk9QTW9kaWZpZXIgPSAoSW50ZWdlck5PUE1vZGlmaWVyKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUludGVnZXJOT1BNb2RpZmllcihpbnRlZ2VyTk9QTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5PUE1vZGlmaWVyKGludGVnZXJOT1BNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmVhdHVyZU1vZGlmaWVyKGludGVnZXJOT1BNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuSU5URUdFUl9SQU5HRV9NT0RJRklFUjogeworCQkJCUludGVnZXJSYW5nZU1vZGlmaWVyIGludGVnZXJSYW5nZU1vZGlmaWVyID0gKEludGVnZXJSYW5nZU1vZGlmaWVyKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUludGVnZXJSYW5nZU1vZGlmaWVyKGludGVnZXJSYW5nZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSYW5nZU1vZGlmaWVyKGludGVnZXJSYW5nZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VGZWF0dXJlTW9kaWZpZXIoaW50ZWdlclJhbmdlTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLklOVEVHRVJfU0VRVUVOQ0VfTU9ESUZJRVI6IHsKKwkJCQlJbnRlZ2VyU2VxdWVuY2VNb2RpZmllciBpbnRlZ2VyU2VxdWVuY2VNb2RpZmllciA9IChJbnRlZ2VyU2VxdWVuY2VNb2RpZmllcil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VJbnRlZ2VyU2VxdWVuY2VNb2RpZmllcihpbnRlZ2VyU2VxdWVuY2VNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2VxdWVuY2VNb2RpZmllcihpbnRlZ2VyU2VxdWVuY2VNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmVhdHVyZU1vZGlmaWVyKGludGVnZXJTZXF1ZW5jZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5MT05HX05PUF9NT0RJRklFUjogeworCQkJCUxvbmdOT1BNb2RpZmllciBsb25nTk9QTW9kaWZpZXIgPSAoTG9uZ05PUE1vZGlmaWVyKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUxvbmdOT1BNb2RpZmllcihsb25nTk9QTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5PUE1vZGlmaWVyKGxvbmdOT1BNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmVhdHVyZU1vZGlmaWVyKGxvbmdOT1BNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTE9OR19SQU5HRV9NT0RJRklFUjogeworCQkJCUxvbmdSYW5nZU1vZGlmaWVyIGxvbmdSYW5nZU1vZGlmaWVyID0gKExvbmdSYW5nZU1vZGlmaWVyKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUxvbmdSYW5nZU1vZGlmaWVyKGxvbmdSYW5nZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSYW5nZU1vZGlmaWVyKGxvbmdSYW5nZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VGZWF0dXJlTW9kaWZpZXIobG9uZ1JhbmdlTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkxPTkdfU0VRVUVOQ0VfTU9ESUZJRVI6IHsKKwkJCQlMb25nU2VxdWVuY2VNb2RpZmllciBsb25nU2VxdWVuY2VNb2RpZmllciA9IChMb25nU2VxdWVuY2VNb2RpZmllcil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VMb25nU2VxdWVuY2VNb2RpZmllcihsb25nU2VxdWVuY2VNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2VxdWVuY2VNb2RpZmllcihsb25nU2VxdWVuY2VNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmVhdHVyZU1vZGlmaWVyKGxvbmdTZXF1ZW5jZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5NT0RJRklFUjogeworCQkJCU1vZGlmaWVyIG1vZGlmaWVyID0gKE1vZGlmaWVyKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZU1vZGlmaWVyKG1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZWNvcmF0b3IobW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShtb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShtb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuTk9QX01PRElGSUVSOiB7CisJCQkJTk9QTW9kaWZpZXIgbm9wTW9kaWZpZXIgPSAoTk9QTW9kaWZpZXIpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlTk9QTW9kaWZpZXIobm9wTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZlYXR1cmVNb2RpZmllcihub3BNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuUkFOR0VfTU9ESUZJRVI6IHsKKwkJCQlSYW5nZU1vZGlmaWVyIHJhbmdlTW9kaWZpZXIgPSAoUmFuZ2VNb2RpZmllcil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VSYW5nZU1vZGlmaWVyKHJhbmdlTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZlYXR1cmVNb2RpZmllcihyYW5nZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TVEVNX1RJTUVfTk9QX01PRElGSUVSOiB7CisJCQkJU1RFTVRpbWVOT1BNb2RpZmllciBzdGVtVGltZU5PUE1vZGlmaWVyID0gKFNURU1UaW1lTk9QTW9kaWZpZXIpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU1RFTVRpbWVOT1BNb2RpZmllcihzdGVtVGltZU5PUE1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOT1BNb2RpZmllcihzdGVtVGltZU5PUE1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VGZWF0dXJlTW9kaWZpZXIoc3RlbVRpbWVOT1BNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX1JBTkdFX01PRElGSUVSOiB7CisJCQkJU1RFTVRpbWVSYW5nZU1vZGlmaWVyIHN0ZW1UaW1lUmFuZ2VNb2RpZmllciA9IChTVEVNVGltZVJhbmdlTW9kaWZpZXIpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU1RFTVRpbWVSYW5nZU1vZGlmaWVyKHN0ZW1UaW1lUmFuZ2VNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmFuZ2VNb2RpZmllcihzdGVtVGltZVJhbmdlTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZlYXR1cmVNb2RpZmllcihzdGVtVGltZVJhbmdlTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNURU1fVElNRV9TRVFVRU5DRV9NT0RJRklFUjogeworCQkJCVNURU1UaW1lU2VxdWVuY2VNb2RpZmllciBzdGVtVGltZVNlcXVlbmNlTW9kaWZpZXIgPSAoU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVNURU1UaW1lU2VxdWVuY2VNb2RpZmllcihzdGVtVGltZVNlcXVlbmNlTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNlcXVlbmNlTW9kaWZpZXIoc3RlbVRpbWVTZXF1ZW5jZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VGZWF0dXJlTW9kaWZpZXIoc3RlbVRpbWVTZXF1ZW5jZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TRVFVRU5DRV9NT0RJRklFUjogeworCQkJCVNlcXVlbmNlTW9kaWZpZXIgc2VxdWVuY2VNb2RpZmllciA9IChTZXF1ZW5jZU1vZGlmaWVyKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVNlcXVlbmNlTW9kaWZpZXIoc2VxdWVuY2VNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmVhdHVyZU1vZGlmaWVyKHNlcXVlbmNlTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLlNUUklOR19OT1BfTU9ESUZJRVI6IHsKKwkJCQlTdHJpbmdOT1BNb2RpZmllciBzdHJpbmdOT1BNb2RpZmllciA9IChTdHJpbmdOT1BNb2RpZmllcil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VTdHJpbmdOT1BNb2RpZmllcihzdHJpbmdOT1BNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTk9QTW9kaWZpZXIoc3RyaW5nTk9QTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZlYXR1cmVNb2RpZmllcihzdHJpbmdOT1BNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RSSU5HX1NFUVVFTkNFX01PRElGSUVSOiB7CisJCQkJU3RyaW5nU2VxdWVuY2VNb2RpZmllciBzdHJpbmdTZXF1ZW5jZU1vZGlmaWVyID0gKFN0cmluZ1NlcXVlbmNlTW9kaWZpZXIpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU3RyaW5nU2VxdWVuY2VNb2RpZmllcihzdHJpbmdTZXF1ZW5jZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTZXF1ZW5jZU1vZGlmaWVyKHN0cmluZ1NlcXVlbmNlTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZlYXR1cmVNb2RpZmllcihzdHJpbmdTZXF1ZW5jZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5NT0RJRklBQkxFOiB7CisJCQkJTW9kaWZpYWJsZSBtb2RpZmlhYmxlID0gKE1vZGlmaWFibGUpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlTW9kaWZpYWJsZShtb2RpZmlhYmxlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5TSU5HTEVfVkFMVUVfTU9ESUZJRVI6IHsKKwkJCQlTaW5nbGVWYWx1ZU1vZGlmaWVyIHNpbmdsZVZhbHVlTW9kaWZpZXIgPSAoU2luZ2xlVmFsdWVNb2RpZmllcil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VTaW5nbGVWYWx1ZU1vZGlmaWVyKHNpbmdsZVZhbHVlTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZlYXR1cmVNb2RpZmllcihzaW5nbGVWYWx1ZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5ET1VCTEVfTU9ESUZJRVI6IHsKKwkJCQlEb3VibGVNb2RpZmllciBkb3VibGVNb2RpZmllciA9IChEb3VibGVNb2RpZmllcil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VEb3VibGVNb2RpZmllcihkb3VibGVNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2luZ2xlVmFsdWVNb2RpZmllcihkb3VibGVNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmVhdHVyZU1vZGlmaWVyKGRvdWJsZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIE1vZGlmaWVyUGFja2FnZS5JTlRFR0VSX01PRElGSUVSOiB7CisJCQkJSW50ZWdlck1vZGlmaWVyIGludGVnZXJNb2RpZmllciA9IChJbnRlZ2VyTW9kaWZpZXIpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlSW50ZWdlck1vZGlmaWVyKGludGVnZXJNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2luZ2xlVmFsdWVNb2RpZmllcihpbnRlZ2VyTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZlYXR1cmVNb2RpZmllcihpbnRlZ2VyTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgTW9kaWZpZXJQYWNrYWdlLkxPTkdfTU9ESUZJRVI6IHsKKwkJCQlMb25nTW9kaWZpZXIgbG9uZ01vZGlmaWVyID0gKExvbmdNb2RpZmllcil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VMb25nTW9kaWZpZXIobG9uZ01vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTaW5nbGVWYWx1ZU1vZGlmaWVyKGxvbmdNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmVhdHVyZU1vZGlmaWVyKGxvbmdNb2RpZmllcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBNb2RpZmllclBhY2thZ2UuU1RFTV9USU1FX01PRElGSUVSOiB7CisJCQkJU1RFTVRpbWVNb2RpZmllciBzdGVtVGltZU1vZGlmaWVyID0gKFNURU1UaW1lTW9kaWZpZXIpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU1RFTVRpbWVNb2RpZmllcihzdGVtVGltZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTaW5nbGVWYWx1ZU1vZGlmaWVyKHN0ZW1UaW1lTW9kaWZpZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZlYXR1cmVNb2RpZmllcihzdGVtVGltZU1vZGlmaWVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb3VibGUgTk9QIE1vZGlmaWVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG91YmxlIE5PUCBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VEb3VibGVOT1BNb2RpZmllcihEb3VibGVOT1BNb2RpZmllciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG91YmxlIFJhbmdlIE1vZGlmaWVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG91YmxlIFJhbmdlIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZURvdWJsZVJhbmdlTW9kaWZpZXIoRG91YmxlUmFuZ2VNb2RpZmllciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG91YmxlIFNlcXVlbmNlIE1vZGlmaWVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG91YmxlIFNlcXVlbmNlIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZURvdWJsZVNlcXVlbmNlTW9kaWZpZXIoRG91YmxlU2VxdWVuY2VNb2RpZmllciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmVhdHVyZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZlYXR1cmUgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRmVhdHVyZU1vZGlmaWVyKEZlYXR1cmVNb2RpZmllciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZWdlciBOT1AgTW9kaWZpZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlZ2VyIE5PUCBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VJbnRlZ2VyTk9QTW9kaWZpZXIoSW50ZWdlck5PUE1vZGlmaWVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlZ2VyIFJhbmdlIE1vZGlmaWVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZWdlciBSYW5nZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VJbnRlZ2VyUmFuZ2VNb2RpZmllcihJbnRlZ2VyUmFuZ2VNb2RpZmllciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZWdlciBTZXF1ZW5jZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVnZXIgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlSW50ZWdlclNlcXVlbmNlTW9kaWZpZXIoSW50ZWdlclNlcXVlbmNlTW9kaWZpZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvbmcgTk9QIE1vZGlmaWVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9uZyBOT1AgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTG9uZ05PUE1vZGlmaWVyKExvbmdOT1BNb2RpZmllciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9uZyBSYW5nZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvbmcgUmFuZ2UgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTG9uZ1JhbmdlTW9kaWZpZXIoTG9uZ1JhbmdlTW9kaWZpZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvbmcgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Mb25nIFNlcXVlbmNlIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUxvbmdTZXF1ZW5jZU1vZGlmaWVyKExvbmdTZXF1ZW5jZU1vZGlmaWVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2RpZmllcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZU1vZGlmaWVyKE1vZGlmaWVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OT1AgTW9kaWZpZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OT1AgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTk9QTW9kaWZpZXIoTk9QTW9kaWZpZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJhbmdlIE1vZGlmaWVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmFuZ2UgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlUmFuZ2VNb2RpZmllcihSYW5nZU1vZGlmaWVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TVEVNIFRpbWUgTk9QIE1vZGlmaWVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U1RFTSBUaW1lIE5PUCBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTVEVNVGltZU5PUE1vZGlmaWVyKFNURU1UaW1lTk9QTW9kaWZpZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNURU0gVGltZSBSYW5nZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNURU0gVGltZSBSYW5nZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTVEVNVGltZVJhbmdlTW9kaWZpZXIoU1RFTVRpbWVSYW5nZU1vZGlmaWVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TVEVNIFRpbWUgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TVEVNIFRpbWUgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyKFNURU1UaW1lU2VxdWVuY2VNb2RpZmllciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VxdWVuY2UgTW9kaWZpZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXF1ZW5jZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTZXF1ZW5jZU1vZGlmaWVyKFNlcXVlbmNlTW9kaWZpZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0cmluZyBOT1AgTW9kaWZpZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdHJpbmcgTk9QIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVN0cmluZ05PUE1vZGlmaWVyKFN0cmluZ05PUE1vZGlmaWVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdHJpbmcgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdHJpbmcgU2VxdWVuY2UgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlU3RyaW5nU2VxdWVuY2VNb2RpZmllcihTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2RpZmlhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kaWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VNb2RpZmlhYmxlKE1vZGlmaWFibGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNpbmdsZSBWYWx1ZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNpbmdsZSBWYWx1ZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTaW5nbGVWYWx1ZU1vZGlmaWVyKFNpbmdsZVZhbHVlTW9kaWZpZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvdWJsZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvdWJsZSBNb2RpZmllcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VEb3VibGVNb2RpZmllcihEb3VibGVNb2RpZmllciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZWdlciBNb2RpZmllcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVnZXIgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlSW50ZWdlck1vZGlmaWVyKEludGVnZXJNb2RpZmllciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9uZyBNb2RpZmllcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvbmcgTW9kaWZpZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTG9uZ01vZGlmaWVyKExvbmdNb2RpZmllciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U1RFTSBUaW1lIE1vZGlmaWVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U1RFTSBUaW1lIE1vZGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVNURU1UaW1lTW9kaWZpZXIoU1RFTVRpbWVNb2RpZmllciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyA8VD4gVDEgY2FzZUNvbXBhcmFibGUoQ29tcGFyYWJsZTxUPiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlY29yYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlY29yYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VEZWNvcmF0b3IoRGVjb3JhdG9yIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9Nb2RpZmllclN3aXRjaApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL0Fic29sdXRlVGltZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9BYnNvbHV0ZVRpbWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk3NWE3OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9BYnNvbHV0ZVRpbWVUZXN0LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLy8gQWJzb2x1dGVUaW1lVGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworCisvKioKKyAqIEEgPGNvZGU+QWJzb2x1dGVUaW1lVGVzdDwvY29kZT4gaXMgYSB7QGxpbmsgVGltZVRlc3R9IHRoYXQgcmV0dXJucyBhIGJvb2xlYW4KKyAqIHZhbHVlIGRlcGVuZGluZyB1cG9uIHRoZSBjb21wYXJpc29uIG9mIHRoZSBjdXJyZW50IHRpbWUgdmFsdWUgcGFzc2VkIHRvCisgKiB7QGxpbmsgI2V2YWx1YXRlKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSwgbG9uZywgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcil9CisgKiBhbmQgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0UmVmZXJlbmNlVGltZSgpfS4KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQWJzb2x1dGVUaW1lVGVzdCBleHRlbmRzIFRpbWVUZXN0IHsKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0aW1lIHZhbHVlIHVzZWQgZm9yIGNvbXBhcmlzb24gcHVycG9zZXMuCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqLworCVNURU1UaW1lIGdldFRpbWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuQWJzb2x1dGVUaW1lVGVzdCNnZXRUaW1lIDxlbT5UaW1lPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRUaW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUaW1lKFNURU1UaW1lIHZhbHVlKTsKKworCQorfSAvLyBBYnNvbHV0ZVRpbWVUZXN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL0FuZC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL0FuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YTI3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvQW5kLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLy8gQW5kLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogPGNvZGU+QW5kPC9jb2RlPiBpcyBhIHtAbGluayBOYXJ5Qm9vbGVhbk9wZXJhdG9yfSB3aG9zZSB2YWx1ZSBpcworICogPGNvZGU+dHJ1ZTwvY29kZT4gb25seSBpZiB0aGUgdmFsdWVzIG9mIGFsbCBvZiBpdHMgb3BlcmFuZHMgYXJlCisgKiA8Y29kZT50cnVlPC9jb2RlPi4KKyAqIAorICogQHNlZSBPcgorICogQHNlZSBOb3QKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIEFuZCBleHRlbmRzIE5hcnlCb29sZWFuT3BlcmF0b3IgeworCS8vIE5vdGhpbmcKK30gLy8gQW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL0Jvb2xlYW5FeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvQm9vbGVhbkV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTIwYmU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL0Jvb2xlYW5FeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLy8gQm9vbGVhbkV4cHJlc3Npb24uamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBBIDxjb2RlPkJvb2xlYW5FeHByZXNzaW9uPC9jb2RlPiBpcyBhIHtAbGluayBQcmVkaWNhdGV9IHdob3NlIHZhbHVlIGlzIHRoZQorICogcmVzdWx0IG9mIGV2YWx1YXRpbmcgYSBsb2dpY2FsIChib29sZWFuKSBleHByZXNzaW9uLgorICogCisgKiBAc2VlIFRlc3QKKyAqIEBzZWUgUHJlZGljYXRlUmVmZXJlbmNlCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQm9vbGVhbkV4cHJlc3Npb24gZXh0ZW5kcyBQcmVkaWNhdGUgeworCS8vIE5vdGhpbmcKK30gLy8gQm9vbGVhbkV4cHJlc3Npb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvQm9vbGVhbk9wZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvQm9vbGVhbk9wZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5NDIxMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9Cb29sZWFuT3BlcmF0b3IuamF2YQpAQCAtMCwwICsxLDI1IEBACisvLyBCb29sZWFuT3BlcmF0b3IuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBBIDxjb2RlPkJvb2xlYW5PcGVyYXRvcjwvY29kZT4gaXMgYSB7QGxpbmsgQm9vbGVhbkV4cHJlc3Npb259IHdob3NlIHZhbHVlIGlzCisgKiB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgYSBib29sZWFuIG9wZXJhdG9yLgorICogCisgKiBAc2VlIFVuYXJ5Qm9vbGVhbk9wZXJhdG9yCisgKiBAc2VlIE5hcnlCb29sZWFuT3BlcmF0b3IKKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKKyAqLworcHVibGljIGludGVyZmFjZSBCb29sZWFuT3BlcmF0b3IgZXh0ZW5kcyBCb29sZWFuRXhwcmVzc2lvbiB7CisJLy8gTm90aGluZworfSAvLyBCb29sZWFuT3BlcmF0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvRWxhcHNlZFRpbWVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvRWxhcHNlZFRpbWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyY2ZmNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9FbGFwc2VkVGltZVRlc3QuamF2YQpAQCAtMCwwICsxLDgzIEBACisvLyBFbGFwc2VkVGltZVRlc3QuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKKworLyoqCisgKiBBIDxjb2RlPkVsYXBzZWRUaW1lVGVzdDwvY29kZT4gaXMgYSB7QGxpbmsgVGltZVRlc3R9IHRoYXQgcmV0dXJucyBhIGJvb2xlYW4KKyAqIHZhbHVlIGRlcGVuZGluZyB1cG9uIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGZpcnN0IHRpbWUgdmFsdWUgcGFzc2VkIHRvCisgKiB7QGxpbmsgI2V2YWx1YXRlKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSwgbG9uZywgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcil9CisgKiBhbmQgc3Vic2VxdWVudCB2YWx1ZXMuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIEVsYXBzZWRUaW1lVGVzdCBleHRlbmRzIFRpbWVUZXN0IHsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHRpbWUgdmFsdWUgdXNlZCBmb3IgY29tcGFyaXNvbiBwdXJwb3Nlcy4KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICovCisJU1RFTVRpbWUgZ2V0UmVmZXJlbmNlVGltZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5FbGFwc2VkVGltZVRlc3QjZ2V0UmVmZXJlbmNlVGltZSA8ZW0+UmVmZXJlbmNlIFRpbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZSBUaW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRSZWZlcmVuY2VUaW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRSZWZlcmVuY2VUaW1lKFNURU1UaW1lIHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlZmVyZW5jZSB0aW1lIGhhcyBiZWVuIHNldAorCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIKKwkgKi8KKwlib29sZWFuIGlzUmVmZXJlbmNlVGltZVZhbGlkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLkVsYXBzZWRUaW1lVGVzdCNpc1JlZmVyZW5jZVRpbWVWYWxpZCA8ZW0+UmVmZXJlbmNlIFRpbWUgVmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZSBUaW1lIFZhbGlkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1JlZmVyZW5jZVRpbWVWYWxpZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVmZXJlbmNlVGltZVZhbGlkKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvZiBlbGFwc2VkIHRpbWUgdG8gYmUgdXNlZCBmb3IKKwkgKiAgICAgICAgIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgcmVmZXJlbmNlIHRpbWUgYW5kIHRoZSBjdXJyZW50IHRpbWUuCisJICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJbG9uZyBnZXRFbGFwc2VkTWlsbGlzZWNvbmRzKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZGF5cyBvZiBlbGFwc2VkIHRpbWUgdG8gYmUgdXNlZCBmb3IgdGhlIGNvbXBhcmlzb24KKwkgKiAgICAgICAgIGJldHdlZW4gdGhlIHJlZmVyZW5jZSB0aW1lIGFuZCB0aGUgY3VycmVudCB0aW1lLgorCSAqIEBtb2RlbCBkZWZhdWx0PSIwIgorCSAqLworCWludCBnZXROdW1iZXJvZkRheXMoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuRWxhcHNlZFRpbWVUZXN0I2dldE51bWJlcm9mRGF5cyA8ZW0+TnVtYmVyb2YgRGF5czwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TnVtYmVyb2YgRGF5czwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TnVtYmVyb2ZEYXlzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXROdW1iZXJvZkRheXMoaW50IHZhbHVlKTsKKworfSAvLyBFbGFwc2VkVGltZVRlc3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvRmFsc2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9GYWxzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ODlmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvRmFsc2UuamF2YQpAQCAtMCwwICsxLDIzIEBACisvLyBGYWxzZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIDxjb2RlPkZhbHNlPC9jb2RlPiBpcyBhIHtAbGluayBUZXN0fSB3aG9zZSB2YWx1ZSBpcyBhbHdheXMgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICogCisgKiBAc2VlIFRydWUKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIEZhbHNlIGV4dGVuZHMgVGVzdCB7CisJLy8gTm90aGluZworfSAvLyBGYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9JZGVudGlmaWFibGVQcmVkaWNhdGUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9JZGVudGlmaWFibGVQcmVkaWNhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmVlNWFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL0lkZW50aWZpYWJsZVByZWRpY2F0ZS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8vIElkZW50aWZpYWJsZVByZWRpY2F0ZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKKworLyoqCisgKiBBIDxjb2RlPklkZW50aWZpYWJsZVByZWRpY2F0ZTwvY29kZT4gcmVwcmVzZW50cyBhIHRlc3RhYmxlIGNvbmRpdGlvbiB0aGF0IGlzCisgKiBJZGVudGlmaWFibGUuCisgKiAKKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKKyAqLworcHVibGljIGludGVyZmFjZSBJZGVudGlmaWFibGVQcmVkaWNhdGUgZXh0ZW5kcyBJZGVudGlmaWFibGUsIFByZWRpY2F0ZSB7CisJCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VnbWVudCBvZiB0aGUgdHlwZSB7QGxpbmsgVVJJfSB0aGF0IHByZWZpeGVzIGFsbCBvdGhlciBzZWdtZW50cyBpbiBhCisJICogcHJlZGljYXRlIHtAbGluayBVUkl9cy4KKwkgKi8KKwlTdHJpbmcgVVJJX1RZUEVfUFJFRElDQVRFX1NFR01FTlQgPSAicHJlZGljYXRlIjsKK30gLy8gSWRlbnRpZmlhYmxlUHJlZGljYXRlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL0lkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9JZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4MmI3ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9JZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLy8gSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbi5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEFuIDxjb2RlPklkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb248L2NvZGU+IGlzIGEgUHJlZGljYXRlRXhwcmVzc2lvbiB0aGF0CisgKiBpcyBJZGVudGlmaWFibGUuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIElkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24gZXh0ZW5kcyBJZGVudGlmaWFibGVQcmVkaWNhdGUsCisJCVByZWRpY2F0ZUV4cHJlc3Npb24geworCS8vIE5vdGhpbmcKK30gLy8gSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9JZGVudGlmaWFibGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvSWRlbnRpZmlhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYjEzM2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvSWRlbnRpZmlhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8vIElkZW50aWZpYWJsZVRlc3QuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBBIDxjb2RlPklkZW50aWZpYWJsZVRlc3Q8Y29kZT4gaXMgYSA8Y29kZT5JZGVudGlmaWFibGVQcmVkaWNhdGU8L2NvZGU+IHJlcHJlc2VudHMgYSB0ZXN0YWJsZSBjb25kaXRpb24uCisgKiAKKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKKyAqLworcHVibGljIGludGVyZmFjZSBJZGVudGlmaWFibGVUZXN0IGV4dGVuZHMgSWRlbnRpZmlhYmxlUHJlZGljYXRlLCBUZXN0IHsKKwkvLyBOb3RoaW5nCit9IC8vIElkZW50aWZpYWJsZVRlc3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvTmFyeUJvb2xlYW5PcGVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL05hcnlCb29sZWFuT3BlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjc1OGNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL05hcnlCb29sZWFuT3BlcmF0b3IuamF2YQpAQCAtMCwwICsxLDMxIEBACisvLyBOYXJ5Qm9vbGVhbk9wZXJhdG9yLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKKy8qKgorICogQSA8Y29kZT5OYXJ5Qm9vbGVhbk9wZXJhdG9yPC9jb2RlPiBpcyBhIHtAbGluayBCb29sZWFuT3BlcmF0b3J9IHdob3NlIHZhbHVlCisgKiBpcyB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgYSBib29sZWFuIG9wZXJhdG9yIHRoYXQgdGFrZXMgb25lIG9yICh1c3VhbGx5KQorICogbW9yZSBvcGVyYW5kcy4KKyAqIAorICogQHNlZSBVbmFyeUJvb2xlYW5PcGVyYXRvcgorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5hcnlCb29sZWFuT3BlcmF0b3IgZXh0ZW5kcyBCb29sZWFuT3BlcmF0b3IgeworCS8qKgorCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2Ygb3BlcmFuZHMgdG8gdGhpcyBvcGVyYXRvcgorCSAqIEBtb2RlbCB0eXBlPSJQcmVkaWNhdGUiIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqLworCUVMaXN0PFByZWRpY2F0ZT4gZ2V0T3BlcmFuZHMoKTsKK30gLy8gTmFyeUJvb2xlYW5PcGVyYXRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9Ob3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9Ob3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODY4YzZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL05vdC5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8vIE5vdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIDxjb2RlPk5vdDwvY29kZT4gaXMgYSB7QGxpbmsgVW5hcnlCb29sZWFuT3BlcmF0b3J9IHdob3NlIHZhbHVlIGlzCisgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWUgb2YgaXRzIG9wZXJhbmQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LAorICogb3RoZXJ3aXNlIGl0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAqIAorICogQHNlZSBBbmQKKyAqIEBzZWUgT3IKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vdCBleHRlbmRzIFVuYXJ5Qm9vbGVhbk9wZXJhdG9yIHsKKwkvLyBOb3RoaW5nCit9IC8vIE5vdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9Pci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL09yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyMjQ2YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9Pci5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8vIE9yLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQW4gPGNvZGU+T3I8L2NvZGU+IGlzIGEge0BsaW5rIE5hcnlCb29sZWFuT3BlcmF0b3J9IHdob3NlIHZhbHVlIGlzCisgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbnkgb2YgdGhlIHZhbHVlcyBvZiBpdHMgb3BlcmFuZHMgYXJlIDxjb2RlPnRydWU8L2NvZGU+LgorICogCisgKiBAc2VlIEFuZAorICogQHNlZSBOb3QKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIE9yIGV4dGVuZHMgTmFyeUJvb2xlYW5PcGVyYXRvciB7CisJLy8gTm90aGluZworfSAvLyBPcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9QcmVkaWNhdGUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9QcmVkaWNhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjUzMTc5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL1ByZWRpY2F0ZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8vIFByZWRpY2F0ZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuVHJpZ2dlcjsKKworLyoqCisgKiBBIDxjb2RlPlByZWRpY2F0ZTwvY29kZT4gcmVwcmVzZW50cyBhIHRlc3RhYmxlIGNvbmRpdGlvbi4gSW5zdGFuY2VzIG9mCisgKiA8Y29kZT5QcmVkaWNhdGU8L2NvZGU+IGFyZSByZWZlcmVuY2VkIGJ5IHtAbGluayBUcmlnZ2VyfXMgdGhhdCB1c2UgdGhlIHZhbHVlCisgKiByZXR1cm5lZCBieSB7QGxpbmsgI2V2YWx1YXRlKFNURU1UaW1lLCBsb25nLCBEZWNvcmF0b3IpfSB0byBjb250cm9sIHRoZQorICogZXhlY3V0aW9uIG9mIGFub3RoZXIge0BsaW5rIERlY29yYXRvcn0gY2FsbGVkIHRoZSB7QGxpbmsgVHJpZ2dlcn0ncyAiYWN0aW9uIi4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5pdGlvbiBpcyBhbHNvIGFuICJBbm5vdGF0ZWQgSmF2YSBJbnRlcmZhY2UiIHRoYXQgZGVmaW5lcworICogb25lIGNsYXNzIGluIGEgPGEgaHJlZj0iaHR0cDovL3d3dy51bWwub3JnLyI+VU1MPC9hPiAibW9kZWwiLiBUaGUgVU1MIGNsYXNzCisgKiBkaWFncmFtIGZvciB0aGUgbW9kZWwgaXMgaW4gdGhlIDxjb2RlPmRvY3VtZW50YXRpb248L2NvZGU+IGZvbGRlciBvZiB0aGUKKyAqIHByb2plY3QuIFRoaXMgZmlsZSBhbmQgdGhlIG90aGVyIGludGVyZmFjZXMgaW4gdGhpcyBKYXZhIHBhY2thZ2UgYXJlCisgKiBwcm9jZXNzZWQgYnkgdGhlIEVjbGlwc2UgTW9kZWxpbmcgRnJhbWV3b3JrIChha2EgRU1GIDxhCisgKiBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UvZW1mIj5odHRwOi8vb3JnLmVjbGlwc2UvZW1mPC9hPikuIHRvIGF1dG9tYXRpY2FsbHkKKyAqIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbC4gRU1GIGlzIGRvY3VtZW50ZWQgaW4gdGhlIGJvb2sgPGEKKyAqIGhyZWY9Imh0dHA6Ly93d3cuYXdwcm9mZXNzaW9uYWwuY29tL2Jvb2tzdG9yZS9wcm9kdWN0LmFzcD9pc2JuPTAxMzE0MjU0MjAmcmw9MSI+RWNsaXBzZQorICogTW9kZWxpbmcgRnJhbWV3b3JrIDwvYT4gYnkgQnVkaW5za3ksIGV0IGFsLgorICogPC9wPgorICogQHNlZSBUcmlnZ2VyCisgKiBAc2VlIE1vZGlmaWVyCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJlZGljYXRlIGV4dGVuZHMgRU9iamVjdCB7CisKKwkvKioKKwkgKiBEZXRlcm1pbmUgaWYgYSBwYXJ0aWN1bGFyIGNvbmRpdGlvbiBpcyA8Y29kZT50cnVlPC9jb2RlPiBvcgorCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KKwkgKiAKKwkgKiBAcGFyYW0gdGltZQorCSAqICAgICAgICAgICAgdGhlIHRpbWUgdG8gYmUgdXNlZCB3aGVuIGRldGVybWluaW5nIGlmIHRoZSB7QGxpbmsgUHJlZGljYXRlfQorCSAqICAgICAgICAgICAgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gb3IgPGNvZGU+ZmFsc2U8L2NvZGU+LgorCSAqIEBwYXJhbSB0aW1lUGVyaW9kCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHRpbWUgYW5kIHRoZQorCSAqICAgICAgICAgICAgcHJldmlvdXMgdGltZSB2YWx1ZS4KKwkgKiBAcGFyYW0gYWN0aW9uCisJICogICAgICAgICAgICBhIHtAbGluayBEZWNvcmF0b3J9CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUge0BsaW5rIFByZWRpY2F0ZX0gaXMgPGNvZGU+dHJ1ZTwvY29kZT4sCisJICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwlib29sZWFuIGV2YWx1YXRlKGZpbmFsIFNURU1UaW1lIHRpbWUsIGZpbmFsIGxvbmcgdGltZXJQZXJpb2QsCisJCQlmaW5hbCBEZWNvcmF0b3IgYWN0aW9uKTsKKworfSAvLyBQcmVkaWNhdGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvUHJlZGljYXRlRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL1ByZWRpY2F0ZUV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmZkMDAxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL1ByZWRpY2F0ZUV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvLyBQcmVkaWNhdGVFeHByZXNzaW9uLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQSA8Y29kZT5QcmVkaWNhdGVFeHByZXNzaW9uPC9jb2RlPiBpcyBhIHtAbGluayBCb29sZWFuRXhwcmVzc2lvbn0gd2hvc2UgdmFsdWUKKyAqIGlzIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyBhIHtAbGluayBQcmVkaWNhdGV9LgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBQcmVkaWNhdGVFeHByZXNzaW9uIGV4dGVuZHMgQm9vbGVhbkV4cHJlc3Npb24geworCisJLyoqCisJICogQHJldHVybiB0aGUge0BsaW5rIFByZWRpY2F0ZX0gdGhhdCBkZXRlcm1pbmVzIHRoZSB2YWx1ZSBvZiB0aGlzCisJICogICAgICAgICBleHByZXNzaW9uLgorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKi8KKwlQcmVkaWNhdGUgZ2V0UHJlZGljYXRlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZUV4cHJlc3Npb24jZ2V0UHJlZGljYXRlIDxlbT5QcmVkaWNhdGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWRpY2F0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UHJlZGljYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRQcmVkaWNhdGUoUHJlZGljYXRlIHZhbHVlKTsKK30gLy8gUHJlZGljYXRlRXhwcmVzc2lvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9QcmVkaWNhdGVGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvUHJlZGljYXRlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YjQ4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvUHJlZGljYXRlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZVBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBQcmVkaWNhdGVGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgeworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUHJlZGljYXRlRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlRmFjdG9yeUltcGwuaW5pdCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BbmQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFuZDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQW5kIGNyZWF0ZUFuZCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GYWxzZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RmFsc2U8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUZhbHNlIGNyZWF0ZUZhbHNlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5vdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Tm90PC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlOb3QgY3JlYXRlTm90KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJT3IgY3JlYXRlT3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVmZXJlbmNlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZWZlcmVuY2U8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVByZWRpY2F0ZVJlZmVyZW5jZSBjcmVhdGVQcmVkaWNhdGVSZWZlcmVuY2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHJ1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHJ1ZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVHJ1ZSBjcmVhdGVUcnVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4cHJlc3Npb248L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4cHJlc3Npb248L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVByZWRpY2F0ZUV4cHJlc3Npb24gY3JlYXRlUHJlZGljYXRlRXhwcmVzc2lvbigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JZGVudGlmaWFibGUgUHJlZGljYXRlIEV4cHJlc3Npb248L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklkZW50aWZpYWJsZSBQcmVkaWNhdGUgRXhwcmVzc2lvbjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbiBjcmVhdGVJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFic29sdXRlIFRpbWUgVGVzdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWJzb2x1dGUgVGltZSBUZXN0PC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBYnNvbHV0ZVRpbWVUZXN0IGNyZWF0ZUFic29sdXRlVGltZVRlc3QoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxhcHNlZCBUaW1lIFRlc3Q8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsYXBzZWQgVGltZSBUZXN0PC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFbGFwc2VkVGltZVRlc3QgY3JlYXRlRWxhcHNlZFRpbWVUZXN0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogQGdlbmVyYXRlZAorCSAqLworCVByZWRpY2F0ZVBhY2thZ2UgZ2V0UHJlZGljYXRlUGFja2FnZSgpOworCit9IC8vUHJlZGljYXRlRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL1ByZWRpY2F0ZVBhY2thZ2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9QcmVkaWNhdGVQYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkOWI4MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9QcmVkaWNhdGVQYWNrYWdlLmphdmEKQEAgLTAsMCArMSwxMjA4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlRmFjdG9yeQorICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJlZGljYXRlUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTkFNRSA9ICJwcmVkaWNhdGUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS5lY29yZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVByZWRpY2F0ZVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZVBhY2thZ2VJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZUltcGwgPGVtPlByZWRpY2F0ZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGwjZ2V0UHJlZGljYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBSRURJQ0FURSA9IDc7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJlZGljYXRlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBSRURJQ0FURV9GRUFUVVJFX0NPVU5UID0gMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLkJvb2xlYW5FeHByZXNzaW9uSW1wbCA8ZW0+Qm9vbGVhbiBFeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLkJvb2xlYW5FeHByZXNzaW9uSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZVBhY2thZ2VJbXBsI2dldEJvb2xlYW5FeHByZXNzaW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEJPT0xFQU5fRVhQUkVTU0lPTiA9IDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Qm9vbGVhbiBFeHByZXNzaW9uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEJPT0xFQU5fRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UID0gUFJFRElDQVRFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuQm9vbGVhbk9wZXJhdG9ySW1wbCA8ZW0+Qm9vbGVhbiBPcGVyYXRvcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5Cb29sZWFuT3BlcmF0b3JJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGwjZ2V0Qm9vbGVhbk9wZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEJPT0xFQU5fT1BFUkFUT1IgPSAyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkJvb2xlYW4gT3BlcmF0b3I8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQk9PTEVBTl9PUEVSQVRPUl9GRUFUVVJFX0NPVU5UID0gQk9PTEVBTl9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuTmFyeUJvb2xlYW5PcGVyYXRvckltcGwgPGVtPk5hcnkgQm9vbGVhbiBPcGVyYXRvcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5OYXJ5Qm9vbGVhbk9wZXJhdG9ySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZVBhY2thZ2VJbXBsI2dldE5hcnlCb29sZWFuT3BlcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgTkFSWV9CT09MRUFOX09QRVJBVE9SID0gNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcGVyYW5kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTkFSWV9CT09MRUFOX09QRVJBVE9SX19PUEVSQU5EUyA9IEJPT0xFQU5fT1BFUkFUT1JfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TmFyeSBCb29sZWFuIE9wZXJhdG9yPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE5BUllfQk9PTEVBTl9PUEVSQVRPUl9GRUFUVVJFX0NPVU5UID0gQk9PTEVBTl9PUEVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLkFuZEltcGwgPGVtPkFuZDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5BbmRJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGwjZ2V0QW5kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEFORCA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3BlcmFuZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFORF9fT1BFUkFORFMgPSBOQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkRTOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFuZDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBTkRfRkVBVFVSRV9DT1VOVCA9IE5BUllfQk9PTEVBTl9PUEVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlRlc3RJbXBsIDxlbT5UZXN0PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlRlc3RJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGwjZ2V0VGVzdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBURVNUID0gOTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZXN0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfRkVBVFVSRV9DT1VOVCA9IFBSRURJQ0FURV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLkZhbHNlSW1wbCA8ZW0+RmFsc2U8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuRmFsc2VJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGwjZ2V0RmFsc2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgRkFMU0UgPSAzOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkZhbHNlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZBTFNFX0ZFQVRVUkVfQ09VTlQgPSBURVNUX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuVW5hcnlCb29sZWFuT3BlcmF0b3JJbXBsIDxlbT5VbmFyeSBCb29sZWFuIE9wZXJhdG9yPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlVuYXJ5Qm9vbGVhbk9wZXJhdG9ySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZVBhY2thZ2VJbXBsI2dldFVuYXJ5Qm9vbGVhbk9wZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFVOQVJZX0JPT0xFQU5fT1BFUkFUT1IgPSAxMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcGVyYW5kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVU5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORCA9IEJPT0xFQU5fT1BFUkFUT1JfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VW5hcnkgQm9vbGVhbiBPcGVyYXRvcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBVTkFSWV9CT09MRUFOX09QRVJBVE9SX0ZFQVRVUkVfQ09VTlQgPSBCT09MRUFOX09QRVJBVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuTm90SW1wbCA8ZW0+Tm90PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLk5vdEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVQYWNrYWdlSW1wbCNnZXROb3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgTk9UID0gNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcGVyYW5kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTk9UX19PUEVSQU5EID0gVU5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Ob3Q8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTk9UX0ZFQVRVUkVfQ09VTlQgPSBVTkFSWV9CT09MRUFOX09QRVJBVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuT3JJbXBsIDxlbT5PcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5PckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVQYWNrYWdlSW1wbCNnZXRPcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBPUiA9IDY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3BlcmFuZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE9SX19PUEVSQU5EUyA9IE5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORFM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+T3I8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgT1JfRkVBVFVSRV9DT1VOVCA9IE5BUllfQk9PTEVBTl9PUEVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZVJlZmVyZW5jZUltcGwgPGVtPlJlZmVyZW5jZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVSZWZlcmVuY2VJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGwjZ2V0UHJlZGljYXRlUmVmZXJlbmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBSRURJQ0FURV9SRUZFUkVOQ0UgPSA4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRpY2F0ZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBSRURJQ0FURV9SRUZFUkVOQ0VfX1BSRURJQ0FURSA9IFBSRURJQ0FURV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZWZlcmVuY2U8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUFJFRElDQVRFX1JFRkVSRU5DRV9GRUFUVVJFX0NPVU5UID0gUFJFRElDQVRFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuVHJ1ZUltcGwgPGVtPlRydWU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuVHJ1ZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVQYWNrYWdlSW1wbCNnZXRUcnVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRSVUUgPSAxMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UcnVlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRSVUVfRkVBVFVSRV9DT1VOVCA9IFRFU1RfRkVBVFVSRV9DT1VOVCArIDA7CisKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZUV4cHJlc3Npb25JbXBsIDxlbT5FeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZUV4cHJlc3Npb25JbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGwjZ2V0UHJlZGljYXRlRXhwcmVzc2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBQUkVESUNBVEVfRVhQUkVTU0lPTiA9IDEyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRpY2F0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUgPSBCT09MRUFOX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXhwcmVzc2lvbjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQUkVESUNBVEVfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UID0gQk9PTEVBTl9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOworCisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5JZGVudGlmaWFibGVQcmVkaWNhdGVJbXBsIDxlbT5JZGVudGlmaWFibGUgUHJlZGljYXRlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLklkZW50aWZpYWJsZVByZWRpY2F0ZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVQYWNrYWdlSW1wbCNnZXRJZGVudGlmaWFibGVQcmVkaWNhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgSURFTlRJRklBQkxFX1BSRURJQ0FURSA9IDEzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElERU5USUZJQUJMRV9QUkVESUNBVEVfX1VSSSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJREVOVElGSUFCTEVfUFJFRElDQVRFX19UWVBFX1VSSSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElERU5USUZJQUJMRV9QUkVESUNBVEVfX0RVQkxJTl9DT1JFID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklkZW50aWZpYWJsZSBQcmVkaWNhdGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSURFTlRJRklBQkxFX1BSRURJQ0FURV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5JZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uSW1wbCA8ZW0+SWRlbnRpZmlhYmxlIFByZWRpY2F0ZSBFeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLklkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb25JbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGwjZ2V0SWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBJREVOVElGSUFCTEVfUFJFRElDQVRFX0VYUFJFU1NJT04gPSAxNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJREVOVElGSUFCTEVfUFJFRElDQVRFX0VYUFJFU1NJT05fX1VSSSA9IElERU5USUZJQUJMRV9QUkVESUNBVEVfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElERU5USUZJQUJMRV9QUkVESUNBVEVfRVhQUkVTU0lPTl9fVFlQRV9VUkkgPSBJREVOVElGSUFCTEVfUFJFRElDQVRFX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElERU5USUZJQUJMRV9QUkVESUNBVEVfRVhQUkVTU0lPTl9fRFVCTElOX0NPUkUgPSBJREVOVElGSUFCTEVfUFJFRElDQVRFX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkaWNhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJREVOVElGSUFCTEVfUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURSA9IElERU5USUZJQUJMRV9QUkVESUNBVEVfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SWRlbnRpZmlhYmxlIFByZWRpY2F0ZSBFeHByZXNzaW9uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElERU5USUZJQUJMRV9QUkVESUNBVEVfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UID0gSURFTlRJRklBQkxFX1BSRURJQ0FURV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLklkZW50aWZpYWJsZVRlc3RJbXBsIDxlbT5JZGVudGlmaWFibGUgVGVzdDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5JZGVudGlmaWFibGVUZXN0SW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZVBhY2thZ2VJbXBsI2dldElkZW50aWZpYWJsZVRlc3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgSURFTlRJRklBQkxFX1RFU1QgPSAxNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJREVOVElGSUFCTEVfVEVTVF9fVVJJID0gSURFTlRJRklBQkxFX1BSRURJQ0FURV9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSURFTlRJRklBQkxFX1RFU1RfX1RZUEVfVVJJID0gSURFTlRJRklBQkxFX1BSRURJQ0FURV9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJREVOVElGSUFCTEVfVEVTVF9fRFVCTElOX0NPUkUgPSBJREVOVElGSUFCTEVfUFJFRElDQVRFX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JZGVudGlmaWFibGUgVGVzdDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJREVOVElGSUFCTEVfVEVTVF9GRUFUVVJFX0NPVU5UID0gSURFTlRJRklBQkxFX1BSRURJQ0FURV9GRUFUVVJFX0NPVU5UICsgMDsKKworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuVGltZVRlc3RJbXBsIDxlbT5UaW1lIFRlc3Q8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuVGltZVRlc3RJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGwjZ2V0VGltZVRlc3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVElNRV9URVNUID0gMTY7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGltZSBUZXN0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRJTUVfVEVTVF9GRUFUVVJFX0NPVU5UID0gVEVTVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuQWJzb2x1dGVUaW1lVGVzdEltcGwgPGVtPkFic29sdXRlIFRpbWUgVGVzdDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5BYnNvbHV0ZVRpbWVUZXN0SW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZVBhY2thZ2VJbXBsI2dldEFic29sdXRlVGltZVRlc3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQUJTT0xVVEVfVElNRV9URVNUID0gMTc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU09MVVRFX1RJTUVfVEVTVF9fVElNRSA9IFRJTUVfVEVTVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnNvbHV0ZSBUaW1lIFRlc3Q8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUJTT0xVVEVfVElNRV9URVNUX0ZFQVRVUkVfQ09VTlQgPSBUSU1FX1RFU1RfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5FbGFwc2VkVGltZVRlc3RJbXBsIDxlbT5FbGFwc2VkIFRpbWUgVGVzdDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5FbGFwc2VkVGltZVRlc3RJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGwjZ2V0RWxhcHNlZFRpbWVUZXN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEVMQVBTRURfVElNRV9URVNUID0gMTg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFRpbWUgVmFsaWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFTEFQU0VEX1RJTUVfVEVTVF9fUkVGRVJFTkNFX1RJTUVfVkFMSUQgPSBUSU1FX1RFU1RfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxhcHNlZCBNaWxsaXNlY29uZHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFTEFQU0VEX1RJTUVfVEVTVF9fRUxBUFNFRF9NSUxMSVNFQ09ORFMgPSBUSU1FX1RFU1RfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVtYmVyb2YgRGF5czwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVMQVBTRURfVElNRV9URVNUX19OVU1CRVJPRl9EQVlTID0gVElNRV9URVNUX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBUaW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRUxBUFNFRF9USU1FX1RFU1RfX1JFRkVSRU5DRV9USU1FID0gVElNRV9URVNUX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVsYXBzZWQgVGltZSBUZXN0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVMQVBTRURfVElNRV9URVNUX0ZFQVRVUkVfQ09VTlQgPSBUSU1FX1RFU1RfRkVBVFVSRV9DT1VOVCArIDQ7CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuQW5kIDxlbT5BbmQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QW5kPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5BbmQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEFuZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5Cb29sZWFuRXhwcmVzc2lvbiA8ZW0+Qm9vbGVhbiBFeHByZXNzaW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJvb2xlYW4gRXhwcmVzc2lvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuQm9vbGVhbkV4cHJlc3Npb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEJvb2xlYW5FeHByZXNzaW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLkJvb2xlYW5PcGVyYXRvciA8ZW0+Qm9vbGVhbiBPcGVyYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Cb29sZWFuIE9wZXJhdG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5Cb29sZWFuT3BlcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEJvb2xlYW5PcGVyYXRvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5GYWxzZSA8ZW0+RmFsc2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RmFsc2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLkZhbHNlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRGYWxzZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5OYXJ5Qm9vbGVhbk9wZXJhdG9yIDxlbT5OYXJ5IEJvb2xlYW4gT3BlcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TmFyeSBCb29sZWFuIE9wZXJhdG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5OYXJ5Qm9vbGVhbk9wZXJhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXROYXJ5Qm9vbGVhbk9wZXJhdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5OYXJ5Qm9vbGVhbk9wZXJhdG9yI2dldE9wZXJhbmRzIDxlbT5PcGVyYW5kczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3BlcmFuZHM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLk5hcnlCb29sZWFuT3BlcmF0b3IjZ2V0T3BlcmFuZHMoKQorCSAqIEBzZWUgI2dldE5hcnlCb29sZWFuT3BlcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldE5hcnlCb29sZWFuT3BlcmF0b3JfT3BlcmFuZHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuTm90IDxlbT5Ob3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Tm90PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5Ob3QKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldE5vdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5PciA8ZW0+T3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLk9yCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRPcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGUgPGVtPlByZWRpY2F0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QcmVkaWNhdGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0UHJlZGljYXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZVJlZmVyZW5jZSA8ZW0+UmVmZXJlbmNlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlZmVyZW5jZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlUmVmZXJlbmNlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRQcmVkaWNhdGVSZWZlcmVuY2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVSZWZlcmVuY2UjZ2V0UHJlZGljYXRlIDxlbT5QcmVkaWNhdGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QcmVkaWNhdGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZVJlZmVyZW5jZSNnZXRQcmVkaWNhdGUoKQorCSAqIEBzZWUgI2dldFByZWRpY2F0ZVJlZmVyZW5jZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UHJlZGljYXRlUmVmZXJlbmNlX1ByZWRpY2F0ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5UZXN0IDxlbT5UZXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRlc3Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlRlc3QKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFRlc3QoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuVHJ1ZSA8ZW0+VHJ1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UcnVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5UcnVlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUcnVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlVuYXJ5Qm9vbGVhbk9wZXJhdG9yIDxlbT5VbmFyeSBCb29sZWFuIE9wZXJhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlVuYXJ5IEJvb2xlYW4gT3BlcmF0b3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlVuYXJ5Qm9vbGVhbk9wZXJhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRVbmFyeUJvb2xlYW5PcGVyYXRvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlVuYXJ5Qm9vbGVhbk9wZXJhdG9yI2dldE9wZXJhbmQgPGVtPk9wZXJhbmQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5PcGVyYW5kPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5VbmFyeUJvb2xlYW5PcGVyYXRvciNnZXRPcGVyYW5kKCkKKwkgKiBAc2VlICNnZXRVbmFyeUJvb2xlYW5PcGVyYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0VW5hcnlCb29sZWFuT3BlcmF0b3JfT3BlcmFuZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4cHJlc3Npb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZUV4cHJlc3Npb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFByZWRpY2F0ZUV4cHJlc3Npb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVFeHByZXNzaW9uI2dldFByZWRpY2F0ZSA8ZW0+UHJlZGljYXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJlZGljYXRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVFeHByZXNzaW9uI2dldFByZWRpY2F0ZSgpCisJICogQHNlZSAjZ2V0UHJlZGljYXRlRXhwcmVzc2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UHJlZGljYXRlRXhwcmVzc2lvbl9QcmVkaWNhdGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuSWRlbnRpZmlhYmxlUHJlZGljYXRlIDxlbT5JZGVudGlmaWFibGUgUHJlZGljYXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklkZW50aWZpYWJsZSBQcmVkaWNhdGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLklkZW50aWZpYWJsZVByZWRpY2F0ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0SWRlbnRpZmlhYmxlUHJlZGljYXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLklkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24gPGVtPklkZW50aWZpYWJsZSBQcmVkaWNhdGUgRXhwcmVzc2lvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JZGVudGlmaWFibGUgUHJlZGljYXRlIEV4cHJlc3Npb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLklkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldElkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuSWRlbnRpZmlhYmxlVGVzdCA8ZW0+SWRlbnRpZmlhYmxlIFRlc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SWRlbnRpZmlhYmxlIFRlc3Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLklkZW50aWZpYWJsZVRlc3QKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldElkZW50aWZpYWJsZVRlc3QoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuVGltZVRlc3QgPGVtPlRpbWUgVGVzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UaW1lIFRlc3Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlRpbWVUZXN0CisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUaW1lVGVzdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5BYnNvbHV0ZVRpbWVUZXN0IDxlbT5BYnNvbHV0ZSBUaW1lIFRlc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWJzb2x1dGUgVGltZSBUZXN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5BYnNvbHV0ZVRpbWVUZXN0CisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRBYnNvbHV0ZVRpbWVUZXN0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuQWJzb2x1dGVUaW1lVGVzdCNnZXRUaW1lIDxlbT5UaW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VGltZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuQWJzb2x1dGVUaW1lVGVzdCNnZXRUaW1lKCkKKwkgKiBAc2VlICNnZXRBYnNvbHV0ZVRpbWVUZXN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRBYnNvbHV0ZVRpbWVUZXN0X1RpbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuRWxhcHNlZFRpbWVUZXN0IDxlbT5FbGFwc2VkIFRpbWUgVGVzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGFwc2VkIFRpbWUgVGVzdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuRWxhcHNlZFRpbWVUZXN0CisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRFbGFwc2VkVGltZVRlc3QoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5FbGFwc2VkVGltZVRlc3QjaXNSZWZlcmVuY2VUaW1lVmFsaWQgPGVtPlJlZmVyZW5jZSBUaW1lIFZhbGlkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVmZXJlbmNlIFRpbWUgVmFsaWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLkVsYXBzZWRUaW1lVGVzdCNpc1JlZmVyZW5jZVRpbWVWYWxpZCgpCisJICogQHNlZSAjZ2V0RWxhcHNlZFRpbWVUZXN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRFbGFwc2VkVGltZVRlc3RfUmVmZXJlbmNlVGltZVZhbGlkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuRWxhcHNlZFRpbWVUZXN0I2dldEVsYXBzZWRNaWxsaXNlY29uZHMgPGVtPkVsYXBzZWQgTWlsbGlzZWNvbmRzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWxhcHNlZCBNaWxsaXNlY29uZHM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLkVsYXBzZWRUaW1lVGVzdCNnZXRFbGFwc2VkTWlsbGlzZWNvbmRzKCkKKwkgKiBAc2VlICNnZXRFbGFwc2VkVGltZVRlc3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEVsYXBzZWRUaW1lVGVzdF9FbGFwc2VkTWlsbGlzZWNvbmRzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuRWxhcHNlZFRpbWVUZXN0I2dldE51bWJlcm9mRGF5cyA8ZW0+TnVtYmVyb2YgRGF5czwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk51bWJlcm9mIERheXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLkVsYXBzZWRUaW1lVGVzdCNnZXROdW1iZXJvZkRheXMoKQorCSAqIEBzZWUgI2dldEVsYXBzZWRUaW1lVGVzdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RWxhcHNlZFRpbWVUZXN0X051bWJlcm9mRGF5cygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLkVsYXBzZWRUaW1lVGVzdCNnZXRSZWZlcmVuY2VUaW1lIDxlbT5SZWZlcmVuY2UgVGltZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJlZmVyZW5jZSBUaW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5FbGFwc2VkVGltZVRlc3QjZ2V0UmVmZXJlbmNlVGltZSgpCisJICogQHNlZSAjZ2V0RWxhcHNlZFRpbWVUZXN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRFbGFwc2VkVGltZVRlc3RfUmVmZXJlbmNlVGltZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUHJlZGljYXRlRmFjdG9yeSBnZXRQcmVkaWNhdGVGYWN0b3J5KCk7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKKwkgKiA8dWw+CisJICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisJICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKwkgKiA8L3VsPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnRlcmZhY2UgTGl0ZXJhbHMgeworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5BbmRJbXBsIDxlbT5BbmQ8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuQW5kSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVQYWNrYWdlSW1wbCNnZXRBbmQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQU5EID0gZUlOU1RBTkNFLmdldEFuZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLkJvb2xlYW5FeHByZXNzaW9uSW1wbCA8ZW0+Qm9vbGVhbiBFeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLkJvb2xlYW5FeHByZXNzaW9uSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVQYWNrYWdlSW1wbCNnZXRCb29sZWFuRXhwcmVzc2lvbigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBCT09MRUFOX0VYUFJFU1NJT04gPSBlSU5TVEFOQ0UuZ2V0Qm9vbGVhbkV4cHJlc3Npb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5Cb29sZWFuT3BlcmF0b3JJbXBsIDxlbT5Cb29sZWFuIE9wZXJhdG9yPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLkJvb2xlYW5PcGVyYXRvckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGwjZ2V0Qm9vbGVhbk9wZXJhdG9yKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIEJPT0xFQU5fT1BFUkFUT1IgPSBlSU5TVEFOQ0UuZ2V0Qm9vbGVhbk9wZXJhdG9yKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuRmFsc2VJbXBsIDxlbT5GYWxzZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5GYWxzZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGwjZ2V0RmFsc2UoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgRkFMU0UgPSBlSU5TVEFOQ0UuZ2V0RmFsc2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5OYXJ5Qm9vbGVhbk9wZXJhdG9ySW1wbCA8ZW0+TmFyeSBCb29sZWFuIE9wZXJhdG9yPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLk5hcnlCb29sZWFuT3BlcmF0b3JJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZVBhY2thZ2VJbXBsI2dldE5hcnlCb29sZWFuT3BlcmF0b3IoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgTkFSWV9CT09MRUFOX09QRVJBVE9SID0gZUlOU1RBTkNFLmdldE5hcnlCb29sZWFuT3BlcmF0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9wZXJhbmRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBOQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkRTID0gZUlOU1RBTkNFLmdldE5hcnlCb29sZWFuT3BlcmF0b3JfT3BlcmFuZHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5Ob3RJbXBsIDxlbT5Ob3Q8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuTm90SW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVQYWNrYWdlSW1wbCNnZXROb3QoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgTk9UID0gZUlOU1RBTkNFLmdldE5vdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLk9ySW1wbCA8ZW0+T3I8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuT3JJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZVBhY2thZ2VJbXBsI2dldE9yKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIE9SID0gZUlOU1RBTkNFLmdldE9yKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlSW1wbCA8ZW0+UHJlZGljYXRlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGwjZ2V0UHJlZGljYXRlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFBSRURJQ0FURSA9IGVJTlNUQU5DRS5nZXRQcmVkaWNhdGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVSZWZlcmVuY2VJbXBsIDxlbT5SZWZlcmVuY2U8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUmVmZXJlbmNlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVQYWNrYWdlSW1wbCNnZXRQcmVkaWNhdGVSZWZlcmVuY2UoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUFJFRElDQVRFX1JFRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXRQcmVkaWNhdGVSZWZlcmVuY2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWRpY2F0ZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFBSRURJQ0FURV9SRUZFUkVOQ0VfX1BSRURJQ0FURSA9IGVJTlNUQU5DRS5nZXRQcmVkaWNhdGVSZWZlcmVuY2VfUHJlZGljYXRlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuVGVzdEltcGwgPGVtPlRlc3Q8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuVGVzdEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGwjZ2V0VGVzdCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBURVNUID0gZUlOU1RBTkNFLmdldFRlc3QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5UcnVlSW1wbCA8ZW0+VHJ1ZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5UcnVlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVQYWNrYWdlSW1wbCNnZXRUcnVlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRSVUUgPSBlSU5TVEFOQ0UuZ2V0VHJ1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlVuYXJ5Qm9vbGVhbk9wZXJhdG9ySW1wbCA8ZW0+VW5hcnkgQm9vbGVhbiBPcGVyYXRvcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5VbmFyeUJvb2xlYW5PcGVyYXRvckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGwjZ2V0VW5hcnlCb29sZWFuT3BlcmF0b3IoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVU5BUllfQk9PTEVBTl9PUEVSQVRPUiA9IGVJTlNUQU5DRS5nZXRVbmFyeUJvb2xlYW5PcGVyYXRvcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3BlcmFuZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFVOQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkQgPSBlSU5TVEFOQ0UuZ2V0VW5hcnlCb29sZWFuT3BlcmF0b3JfT3BlcmFuZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZUV4cHJlc3Npb25JbXBsIDxlbT5FeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZUV4cHJlc3Npb25JbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZVBhY2thZ2VJbXBsI2dldFByZWRpY2F0ZUV4cHJlc3Npb24oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUFJFRElDQVRFX0VYUFJFU1NJT04gPSBlSU5TVEFOQ0UuZ2V0UHJlZGljYXRlRXhwcmVzc2lvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZGljYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURSA9IGVJTlNUQU5DRS5nZXRQcmVkaWNhdGVFeHByZXNzaW9uX1ByZWRpY2F0ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLklkZW50aWZpYWJsZVByZWRpY2F0ZUltcGwgPGVtPklkZW50aWZpYWJsZSBQcmVkaWNhdGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuSWRlbnRpZmlhYmxlUHJlZGljYXRlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVQYWNrYWdlSW1wbCNnZXRJZGVudGlmaWFibGVQcmVkaWNhdGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgSURFTlRJRklBQkxFX1BSRURJQ0FURSA9IGVJTlNUQU5DRS5nZXRJZGVudGlmaWFibGVQcmVkaWNhdGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5JZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uSW1wbCA8ZW0+SWRlbnRpZmlhYmxlIFByZWRpY2F0ZSBFeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLklkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb25JbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZVBhY2thZ2VJbXBsI2dldElkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgSURFTlRJRklBQkxFX1BSRURJQ0FURV9FWFBSRVNTSU9OID0gZUlOU1RBTkNFLmdldElkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5JZGVudGlmaWFibGVUZXN0SW1wbCA8ZW0+SWRlbnRpZmlhYmxlIFRlc3Q8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuSWRlbnRpZmlhYmxlVGVzdEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGwjZ2V0SWRlbnRpZmlhYmxlVGVzdCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBJREVOVElGSUFCTEVfVEVTVCA9IGVJTlNUQU5DRS5nZXRJZGVudGlmaWFibGVUZXN0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuVGltZVRlc3RJbXBsIDxlbT5UaW1lIFRlc3Q8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuVGltZVRlc3RJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZVBhY2thZ2VJbXBsI2dldFRpbWVUZXN0KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRJTUVfVEVTVCA9IGVJTlNUQU5DRS5nZXRUaW1lVGVzdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLkFic29sdXRlVGltZVRlc3RJbXBsIDxlbT5BYnNvbHV0ZSBUaW1lIFRlc3Q8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuQWJzb2x1dGVUaW1lVGVzdEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUGFja2FnZUltcGwjZ2V0QWJzb2x1dGVUaW1lVGVzdCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBBQlNPTFVURV9USU1FX1RFU1QgPSBlSU5TVEFOQ0UuZ2V0QWJzb2x1dGVUaW1lVGVzdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGltZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEFCU09MVVRFX1RJTUVfVEVTVF9fVElNRSA9IGVJTlNUQU5DRS5nZXRBYnNvbHV0ZVRpbWVUZXN0X1RpbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5FbGFwc2VkVGltZVRlc3RJbXBsIDxlbT5FbGFwc2VkIFRpbWUgVGVzdDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5FbGFwc2VkVGltZVRlc3RJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZVBhY2thZ2VJbXBsI2dldEVsYXBzZWRUaW1lVGVzdCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBFTEFQU0VEX1RJTUVfVEVTVCA9IGVJTlNUQU5DRS5nZXRFbGFwc2VkVGltZVRlc3QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBUaW1lIFZhbGlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRUxBUFNFRF9USU1FX1RFU1RfX1JFRkVSRU5DRV9USU1FX1ZBTElEID0gZUlOU1RBTkNFLmdldEVsYXBzZWRUaW1lVGVzdF9SZWZlcmVuY2VUaW1lVmFsaWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVsYXBzZWQgTWlsbGlzZWNvbmRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRUxBUFNFRF9USU1FX1RFU1RfX0VMQVBTRURfTUlMTElTRUNPTkRTID0gZUlOU1RBTkNFLmdldEVsYXBzZWRUaW1lVGVzdF9FbGFwc2VkTWlsbGlzZWNvbmRzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OdW1iZXJvZiBEYXlzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRUxBUFNFRF9USU1FX1RFU1RfX05VTUJFUk9GX0RBWVMgPSBlSU5TVEFOQ0UuZ2V0RWxhcHNlZFRpbWVUZXN0X051bWJlcm9mRGF5cygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFRpbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBFTEFQU0VEX1RJTUVfVEVTVF9fUkVGRVJFTkNFX1RJTUUgPSBlSU5TVEFOQ0UuZ2V0RWxhcHNlZFRpbWVUZXN0X1JlZmVyZW5jZVRpbWUoKTsKKworCX0KKworfSAvL1ByZWRpY2F0ZVBhY2thZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9QcmVkaWNhdGVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9QcmVkaWNhdGVSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWY3NmY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL1ByZWRpY2F0ZVJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8vIFByZWRpY2F0ZVJlZmVyZW5jZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEFuIDxjb2RlPlByZWRpY2F0ZVJlZmVyZW5jZTwvY29kZT4gaXMgYSB7QGxpbmsgUHJlZGljYXRlfSB3aG9zZSB2YWx1ZSBpcyB0aGUKKyAqIHJlc3VsdCBvZiBldmFsdWF0aW5nIGEgcmVmZXJlbmNlZCAoaS5lLiwgbm9uLWNvbnRhaW5tZW50KSB7QGxpbmsgUHJlZGljYXRlfS4KKyAqIAorICogQHNlZSBUZXN0CisgKiBAc2VlIEJvb2xlYW5FeHByZXNzaW9uCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBQcmVkaWNhdGVSZWZlcmVuY2UgZXh0ZW5kcyBQcmVkaWNhdGUgeworCS8qKgorCSAqIEBtb2RlbCBjb250YWlubWVudD0iZmFsc2UiCisJICovCisJUHJlZGljYXRlIGdldFByZWRpY2F0ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVSZWZlcmVuY2UjZ2V0UHJlZGljYXRlIDxlbT5QcmVkaWNhdGU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWRpY2F0ZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UHJlZGljYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRQcmVkaWNhdGUoUHJlZGljYXRlIHZhbHVlKTsKK30gLy8gUHJlZGljYXRlUmVmZXJlbmNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1ZjBjZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9UZXN0LmphdmEKQEAgLTAsMCArMSwyNiBAQAorLy8gVGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEEgPGNvZGU+VGVzdDwvY29kZT4gaXMgYSB7QGxpbmsgUHJlZGljYXRlfSB3aG9zZSB2YWx1ZSBpcyB0aGUgcmVzdWx0IG9mCisgKiBleGVjdXRpbmcgdW5kZXJseWluZyBjb2RlIHJhdGhlciB0aGFuIGZyb20gdGhlIGV2YWx1YXRpb24gb2Ygc29tZSBib29sZWFuCisgKiBleHByZXNzaW9uLgorICogCisgKiBAc2VlIEJvb2xlYW5FeHByZXNzaW9uCisgKiBAc2VlIFByZWRpY2F0ZVJlZmVyZW5jZQorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRlc3QgZXh0ZW5kcyBQcmVkaWNhdGUgeworCS8vIE5vdGhpbmcKK30gLy8gVGVzdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9UaW1lVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL1RpbWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5MTRlMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9UaW1lVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8vIFRpbWVUZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqCisgKiBBIDxjb2RlPlRpbWVUZXN0PC9jb2RlPiBpcyBhIDxjb2RlPlRlc3Q8L2NvZGU+IHRoYXQgcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUKKyAqIGRlcGVuZGluZyB1cG9uIHRoZSBjb21wYXJpc29uIG9mIHRoZSB0aW1lIHZhbHVlcyBwYXNzZWQgdG8KKyAqIHtAbGluayAjZXZhbHVhdGUob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lLCBsb25nLCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yKX0KKyAqIGFuZCBhIHJlZmVyZW5jZSB0aW1lIHZhbHVlLgorICogCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGltZVRlc3QgZXh0ZW5kcyBUZXN0IHsKKwkvLyBOb3RoaW5nCQorfSAvLyBUaW1lVGVzdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9UcnVlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvVHJ1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDEyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvVHJ1ZS5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8vIFRydWUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiA8Y29kZT5UcnVlPC9jb2RlPiBpcyBhIHtAbGluayBUZXN0fSB3aG9zZSB2YWx1ZSBpcyBhbHdheXMgPGNvZGU+dHJ1ZTwvY29kZT4uCisgKiAKKyAqIEBzZWUgRmFsc2UKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRydWUgZXh0ZW5kcyBUZXN0IHsKKwkvLyBOb3RoaW5nCit9IC8vIFRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvVW5hcnlCb29sZWFuT3BlcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9VbmFyeUJvb2xlYW5PcGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOWE1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvVW5hcnlCb29sZWFuT3BlcmF0b3IuamF2YQpAQCAtMCwwICsxLDM5IEBACisvLyBVbmFyeUJvb2xlYW5PcGVyYXRvci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEFuIDxjb2RlPlVuYXJ5Qm9vbGVhbk9wZXJhdG9yPC9jb2RlPiBpcyBhIHtAbGluayBCb29sZWFuT3BlcmF0b3J9IHdob3NlIHZhbHVlCisgKiBpcyB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgYSBib29sZWFuIG9wZXJhdG9yIHRoYXQgdGFrZXMgb25seSBhIHNpbmdsZQorICogb3BlcmFuZC4KKyAqIAorICogQHNlZSBOYXJ5Qm9vbGVhbk9wZXJhdG9yCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVW5hcnlCb29sZWFuT3BlcmF0b3IgZXh0ZW5kcyBCb29sZWFuT3BlcmF0b3IgeworCS8qKgorCSAqIEByZXR1cm4gdGhlIG9wZXJhbmQgb2YgdGhlIG9wZXJhdG9yCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqLworCVByZWRpY2F0ZSBnZXRPcGVyYW5kKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlVuYXJ5Qm9vbGVhbk9wZXJhdG9yI2dldE9wZXJhbmQgPGVtPk9wZXJhbmQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9wZXJhbmQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE9wZXJhbmQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE9wZXJhbmQoUHJlZGljYXRlIHZhbHVlKTsKK30gLy8gVW5hcnlCb29sZWFuT3BlcmF0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9BYnNvbHV0ZVRpbWVUZXN0SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvQWJzb2x1dGVUaW1lVGVzdEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDUyMzUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvQWJzb2x1dGVUaW1lVGVzdEltcGwuamF2YQpAQCAtMCwwICsxLDE5MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5BYnNvbHV0ZVRpbWVUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFic29sdXRlIFRpbWUgVGVzdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLkFic29sdXRlVGltZVRlc3RJbXBsI2dldFRpbWUgPGVtPlRpbWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBBYnNvbHV0ZVRpbWVUZXN0SW1wbCBleHRlbmRzIFRpbWVUZXN0SW1wbCBpbXBsZW1lbnRzIEFic29sdXRlVGltZVRlc3QgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWUoKSA8ZW0+VGltZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGltZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFNURU1UaW1lIHRpbWU7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBBYnNvbHV0ZVRpbWVUZXN0SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwkJc2V0VGltZShNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNURU1UaW1lKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5BQlNPTFVURV9USU1FX1RFU1Q7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNURU1UaW1lIGdldFRpbWUoKSB7CisJCXJldHVybiB0aW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFRpbWUoU1RFTVRpbWUgbmV3VGltZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlTVEVNVGltZSBvbGRUaW1lID0gdGltZTsKKwkJdGltZSA9IG5ld1RpbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFByZWRpY2F0ZVBhY2thZ2UuQUJTT0xVVEVfVElNRV9URVNUX19USU1FLCBvbGRUaW1lLCBuZXdUaW1lKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUaW1lKFNURU1UaW1lIG5ld1RpbWUpIHsKKwkJaWYgKG5ld1RpbWUgIT0gdGltZSkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAodGltZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0aW1lKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUHJlZGljYXRlUGFja2FnZS5BQlNPTFVURV9USU1FX1RFU1RfX1RJTUUsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1RpbWUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VGltZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFByZWRpY2F0ZVBhY2thZ2UuQUJTT0xVVEVfVElNRV9URVNUX19USU1FLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFRpbWUobmV3VGltZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQcmVkaWNhdGVQYWNrYWdlLkFCU09MVVRFX1RJTUVfVEVTVF9fVElNRSwgbmV3VGltZSwgbmV3VGltZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5BQlNPTFVURV9USU1FX1RFU1RfX1RJTUU6CisJCQkJcmV0dXJuIGJhc2ljU2V0VGltZShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLkFCU09MVVRFX1RJTUVfVEVTVF9fVElNRToKKwkJCQlyZXR1cm4gZ2V0VGltZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuQUJTT0xVVEVfVElNRV9URVNUX19USU1FOgorCQkJCXNldFRpbWUoKFNURU1UaW1lKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLkFCU09MVVRFX1RJTUVfVEVTVF9fVElNRToKKwkJCQlzZXRUaW1lKChTVEVNVGltZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5BQlNPTFVURV9USU1FX1RFU1RfX1RJTUU6CisJCQkJcmV0dXJuIHRpbWUgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlSW1wbCNldmFsdWF0ZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIGxvbmcsIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoU1RFTVRpbWUgdGltZSwgbG9uZyB0aW1lclBlcmlvZCwgRGVjb3JhdG9yIGFjdGlvbikgeworCQlyZXR1cm4gdGltZS5lcXVhbHMoZ2V0VGltZSgpKTsKKwl9CisJCit9IC8vQWJzb2x1dGVUaW1lVGVzdEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL0FuZEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL0FuZEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTAyNDdkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvQW5kSW1wbC5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLkFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZVBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BbmQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBBbmRJbXBsIGV4dGVuZHMgTmFyeUJvb2xlYW5PcGVyYXRvckltcGwgaW1wbGVtZW50cyBBbmQgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBbmRJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5BTkQ7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlSW1wbCNldmFsdWF0ZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIGxvbmcsIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoU1RFTVRpbWUgdGltZSwgbG9uZyB0aW1lclBlcmlvZCwgRGVjb3JhdG9yIGFjdGlvbikgeworCQlib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKKwkJZm9yIChQcmVkaWNhdGUgcHJlZGljYXRlIDogZ2V0T3BlcmFuZHMoKSkgeworCQkJcmV0VmFsdWUgPSBwcmVkaWNhdGUuZXZhbHVhdGUodGltZSwgdGltZXJQZXJpb2QsIGFjdGlvbik7CisJCQkvLyBPbmUgaXMgdHJ1ZT8KKwkJCWlmIChyZXRWYWx1ZSkgeworCQkJCS8vIFllcworCQkJCWJyZWFrOworCQkJfSAvLyBpZiAKKwkJfSAvLyBmb3IgZWFjaCBQcmVkaWNhdGUKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZXZhbHVhdGUKK30gLy9BbmRJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9Cb29sZWFuRXhwcmVzc2lvbkltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL0Jvb2xlYW5FeHByZXNzaW9uSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYjNkYTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9Cb29sZWFuRXhwcmVzc2lvbkltcGwuamF2YQpAQCAtMCwwICsxLDQ4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5Cb29sZWFuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZVBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Cb29sZWFuIEV4cHJlc3Npb248L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCb29sZWFuRXhwcmVzc2lvbkltcGwgZXh0ZW5kcyBQcmVkaWNhdGVJbXBsIGltcGxlbWVudHMgQm9vbGVhbkV4cHJlc3Npb24geworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBCb29sZWFuRXhwcmVzc2lvbkltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLkJPT0xFQU5fRVhQUkVTU0lPTjsKKwl9CisKK30gLy9Cb29sZWFuRXhwcmVzc2lvbkltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL0Jvb2xlYW5PcGVyYXRvckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL0Jvb2xlYW5PcGVyYXRvckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjNmZTVlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvQm9vbGVhbk9wZXJhdG9ySW1wbC5qYXZhCkBAIC0wLDAgKzEsNDggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLkJvb2xlYW5PcGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZVBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Cb29sZWFuIE9wZXJhdG9yPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQm9vbGVhbk9wZXJhdG9ySW1wbCBleHRlbmRzIEJvb2xlYW5FeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIEJvb2xlYW5PcGVyYXRvciB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEJvb2xlYW5PcGVyYXRvckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLkJPT0xFQU5fT1BFUkFUT1I7CisJfQorCit9IC8vQm9vbGVhbk9wZXJhdG9ySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvRWxhcHNlZFRpbWVUZXN0SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvRWxhcHNlZFRpbWVUZXN0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZDFhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9FbGFwc2VkVGltZVRlc3RJbXBsLmphdmEKQEAgLTAsMCArMSwzNzQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5FbGFwc2VkVGltZVRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxhcHNlZCBUaW1lIFRlc3Q8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5FbGFwc2VkVGltZVRlc3RJbXBsI2lzUmVmZXJlbmNlVGltZVZhbGlkIDxlbT5SZWZlcmVuY2UgVGltZSBWYWxpZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLkVsYXBzZWRUaW1lVGVzdEltcGwjZ2V0RWxhcHNlZE1pbGxpc2Vjb25kcyA8ZW0+RWxhcHNlZCBNaWxsaXNlY29uZHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5FbGFwc2VkVGltZVRlc3RJbXBsI2dldE51bWJlcm9mRGF5cyA8ZW0+TnVtYmVyb2YgRGF5czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLkVsYXBzZWRUaW1lVGVzdEltcGwjZ2V0UmVmZXJlbmNlVGltZSA8ZW0+UmVmZXJlbmNlIFRpbWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFbGFwc2VkVGltZVRlc3RJbXBsIGV4dGVuZHMgVGltZVRlc3RJbXBsIGltcGxlbWVudHMgRWxhcHNlZFRpbWVUZXN0IHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWZlcmVuY2VUaW1lVmFsaWQoKSA8ZW0+UmVmZXJlbmNlIFRpbWUgVmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzUmVmZXJlbmNlVGltZVZhbGlkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVGRVJFTkNFX1RJTUVfVkFMSURfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVmZXJlbmNlVGltZVZhbGlkKCkgPGVtPlJlZmVyZW5jZSBUaW1lIFZhbGlkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1JlZmVyZW5jZVRpbWVWYWxpZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVmZXJlbmNlVGltZVZhbGlkID0gUkVGRVJFTkNFX1RJTUVfVkFMSURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxhcHNlZE1pbGxpc2Vjb25kcygpIDxlbT5FbGFwc2VkIE1pbGxpc2Vjb25kczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RWxhcHNlZE1pbGxpc2Vjb25kcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIEVMQVBTRURfTUlMTElTRUNPTkRTX0VERUZBVUxUID0gMEw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbGFwc2VkTWlsbGlzZWNvbmRzKCkgPGVtPkVsYXBzZWQgTWlsbGlzZWNvbmRzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFbGFwc2VkTWlsbGlzZWNvbmRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgbG9uZyBlbGFwc2VkTWlsbGlzZWNvbmRzID0gRUxBUFNFRF9NSUxMSVNFQ09ORFNfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtYmVyb2ZEYXlzKCkgPGVtPk51bWJlcm9mIERheXM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE51bWJlcm9mRGF5cygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTlVNQkVST0ZfREFZU19FREVGQVVMVCA9IDA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXJvZkRheXMoKSA8ZW0+TnVtYmVyb2YgRGF5czwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TnVtYmVyb2ZEYXlzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IG51bWJlcm9mRGF5cyA9IE5VTUJFUk9GX0RBWVNfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2VUaW1lKCkgPGVtPlJlZmVyZW5jZSBUaW1lPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWZlcmVuY2VUaW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU1RFTVRpbWUgcmVmZXJlbmNlVGltZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgRWxhcHNlZFRpbWVUZXN0SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwkJc2V0UmVmZXJlbmNlVGltZShNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNURU1UaW1lKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5FTEFQU0VEX1RJTUVfVEVTVDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZVRpbWVWYWxpZCgpIHsKKwkJcmV0dXJuIHJlZmVyZW5jZVRpbWVWYWxpZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VUaW1lVmFsaWQoYm9vbGVhbiBuZXdSZWZlcmVuY2VUaW1lVmFsaWQpIHsKKwkJYm9vbGVhbiBvbGRSZWZlcmVuY2VUaW1lVmFsaWQgPSByZWZlcmVuY2VUaW1lVmFsaWQ7CisJCXJlZmVyZW5jZVRpbWVWYWxpZCA9IG5ld1JlZmVyZW5jZVRpbWVWYWxpZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUHJlZGljYXRlUGFja2FnZS5FTEFQU0VEX1RJTUVfVEVTVF9fUkVGRVJFTkNFX1RJTUVfVkFMSUQsIG9sZFJlZmVyZW5jZVRpbWVWYWxpZCwgcmVmZXJlbmNlVGltZVZhbGlkKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGxvbmcgZ2V0RWxhcHNlZE1pbGxpc2Vjb25kcygpIHsKKwkJcmV0dXJuIGVsYXBzZWRNaWxsaXNlY29uZHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXROdW1iZXJvZkRheXMoKSB7CisJCXJldHVybiBudW1iZXJvZkRheXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHNldE51bWJlcm9mRGF5cyhpbnQgbmV3TnVtYmVyb2ZEYXlzKSB7CisJCWludCBvbGROdW1iZXJvZkRheXMgPSBudW1iZXJvZkRheXM7CisJCW51bWJlcm9mRGF5cyA9IG5ld051bWJlcm9mRGF5czsKKwkJCisJCWVsYXBzZWRNaWxsaXNlY29uZHMgPSBudW1iZXJvZkRheXMgKiBTVEVNVGltZS5Vbml0cy5EQVkuZ2V0TWlsbGlzZWNvbmRzKCk7CisJCQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQcmVkaWNhdGVQYWNrYWdlLkVMQVBTRURfVElNRV9URVNUX19OVU1CRVJPRl9EQVlTLCBvbGROdW1iZXJvZkRheXMsIG51bWJlcm9mRGF5cykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTVEVNVGltZSBnZXRSZWZlcmVuY2VUaW1lKCkgeworCQlyZXR1cm4gcmVmZXJlbmNlVGltZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZWZlcmVuY2VUaW1lKFNURU1UaW1lIG5ld1JlZmVyZW5jZVRpbWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJU1RFTVRpbWUgb2xkUmVmZXJlbmNlVGltZSA9IHJlZmVyZW5jZVRpbWU7CisJCXJlZmVyZW5jZVRpbWUgPSBuZXdSZWZlcmVuY2VUaW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQcmVkaWNhdGVQYWNrYWdlLkVMQVBTRURfVElNRV9URVNUX19SRUZFUkVOQ0VfVElNRSwgb2xkUmVmZXJlbmNlVGltZSwgbmV3UmVmZXJlbmNlVGltZSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlVGltZShTVEVNVGltZSBuZXdSZWZlcmVuY2VUaW1lKSB7CisJCWlmIChuZXdSZWZlcmVuY2VUaW1lICE9IHJlZmVyZW5jZVRpbWUpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKHJlZmVyZW5jZVRpbWUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmVmZXJlbmNlVGltZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFByZWRpY2F0ZVBhY2thZ2UuRUxBUFNFRF9USU1FX1RFU1RfX1JFRkVSRU5DRV9USU1FLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdSZWZlcmVuY2VUaW1lICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlZmVyZW5jZVRpbWUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBQcmVkaWNhdGVQYWNrYWdlLkVMQVBTRURfVElNRV9URVNUX19SRUZFUkVOQ0VfVElNRSwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRSZWZlcmVuY2VUaW1lKG5ld1JlZmVyZW5jZVRpbWUsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUHJlZGljYXRlUGFja2FnZS5FTEFQU0VEX1RJTUVfVEVTVF9fUkVGRVJFTkNFX1RJTUUsIG5ld1JlZmVyZW5jZVRpbWUsIG5ld1JlZmVyZW5jZVRpbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuRUxBUFNFRF9USU1FX1RFU1RfX1JFRkVSRU5DRV9USU1FOgorCQkJCXJldHVybiBiYXNpY1NldFJlZmVyZW5jZVRpbWUobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5FTEFQU0VEX1RJTUVfVEVTVF9fUkVGRVJFTkNFX1RJTUVfVkFMSUQ6CisJCQkJcmV0dXJuIGlzUmVmZXJlbmNlVGltZVZhbGlkKCk7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuRUxBUFNFRF9USU1FX1RFU1RfX0VMQVBTRURfTUlMTElTRUNPTkRTOgorCQkJCXJldHVybiBnZXRFbGFwc2VkTWlsbGlzZWNvbmRzKCk7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuRUxBUFNFRF9USU1FX1RFU1RfX05VTUJFUk9GX0RBWVM6CisJCQkJcmV0dXJuIGdldE51bWJlcm9mRGF5cygpOworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLkVMQVBTRURfVElNRV9URVNUX19SRUZFUkVOQ0VfVElNRToKKwkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlVGltZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuRUxBUFNFRF9USU1FX1RFU1RfX1JFRkVSRU5DRV9USU1FX1ZBTElEOgorCQkJCXNldFJlZmVyZW5jZVRpbWVWYWxpZCgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLkVMQVBTRURfVElNRV9URVNUX19OVU1CRVJPRl9EQVlTOgorCQkJCXNldE51bWJlcm9mRGF5cygoSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLkVMQVBTRURfVElNRV9URVNUX19SRUZFUkVOQ0VfVElNRToKKwkJCQlzZXRSZWZlcmVuY2VUaW1lKChTVEVNVGltZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5FTEFQU0VEX1RJTUVfVEVTVF9fUkVGRVJFTkNFX1RJTUVfVkFMSUQ6CisJCQkJc2V0UmVmZXJlbmNlVGltZVZhbGlkKFJFRkVSRU5DRV9USU1FX1ZBTElEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuRUxBUFNFRF9USU1FX1RFU1RfX05VTUJFUk9GX0RBWVM6CisJCQkJc2V0TnVtYmVyb2ZEYXlzKE5VTUJFUk9GX0RBWVNfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5FTEFQU0VEX1RJTUVfVEVTVF9fUkVGRVJFTkNFX1RJTUU6CisJCQkJc2V0UmVmZXJlbmNlVGltZSgoU1RFTVRpbWUpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuRUxBUFNFRF9USU1FX1RFU1RfX1JFRkVSRU5DRV9USU1FX1ZBTElEOgorCQkJCXJldHVybiByZWZlcmVuY2VUaW1lVmFsaWQgIT0gUkVGRVJFTkNFX1RJTUVfVkFMSURfRURFRkFVTFQ7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuRUxBUFNFRF9USU1FX1RFU1RfX0VMQVBTRURfTUlMTElTRUNPTkRTOgorCQkJCXJldHVybiBlbGFwc2VkTWlsbGlzZWNvbmRzICE9IEVMQVBTRURfTUlMTElTRUNPTkRTX0VERUZBVUxUOworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLkVMQVBTRURfVElNRV9URVNUX19OVU1CRVJPRl9EQVlTOgorCQkJCXJldHVybiBudW1iZXJvZkRheXMgIT0gTlVNQkVST0ZfREFZU19FREVGQVVMVDsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5FTEFQU0VEX1RJTUVfVEVTVF9fUkVGRVJFTkNFX1RJTUU6CisJCQkJcmV0dXJuIHJlZmVyZW5jZVRpbWUgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHJlZmVyZW5jZVRpbWVWYWxpZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChyZWZlcmVuY2VUaW1lVmFsaWQpOworCQlyZXN1bHQuYXBwZW5kKCIsIGVsYXBzZWRNaWxsaXNlY29uZHM6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZWxhcHNlZE1pbGxpc2Vjb25kcyk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbnVtYmVyb2ZEYXlzOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKG51bWJlcm9mRGF5cyk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZUltcGwjZXZhbHVhdGUob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lLCBsb25nLCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGV2YWx1YXRlKFNURU1UaW1lIHRpbWUsIGxvbmcgdGltZXJQZXJpb2QsIERlY29yYXRvciBhY3Rpb24pIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOworCQkvLyBJcyB0aGUgcmVmZXJlbmNlIHRpbWUgdmFsaWQ/CisJCWlmIChpc1JlZmVyZW5jZVRpbWVWYWxpZCgpKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIGxvbmcgZWxhcHNlZFRpbWVNUyA9IHRpbWUuZ2V0VGltZSgpLmdldFRpbWUoKSAtIGdldFJlZmVyZW5jZVRpbWUoKS5nZXRUaW1lKCkuZ2V0VGltZSgpOworCQkJLy8gSGFzIGVub3VnaCB0aW1lIGdvbmUgYnk/CisJCQlyZXRWYWx1ZSA9IGVsYXBzZWRUaW1lTVMgPiBnZXRFbGFwc2VkTWlsbGlzZWNvbmRzKCk7CisJCX0gLy8gaWYgcmVmZXJlbmNlIHRpbWUgdmFsaWQ/CisJCWVsc2UgeworCQkJLy8gTm8KKwkJCS8vIFRoaXMgbXVzdCBiZSB0aGUgZmlyc3QgdGltZSB0aGlzIGhhcyBiZWVuIGNhbGxlZCBzbyB0aGlzIG11c3QgYmUKKwkJCS8vIHRoZSBzdGFydCBvZiB0aGUgc2ltdWxhdGlvbi4gUmVtZW1iZXIgdGhlIHRpbWUgdmFsdWUgcGFzc2VkIGluIGFzCisJCQkvLyB0aGUgcmVmZXJlbmNlIHZhbHVlLgorCQkJc2V0UmVmZXJlbmNlVGltZSgoU1RFTVRpbWUpRWNvcmVVdGlsLmNvcHkodGltZSkpOworCQkJc2V0UmVmZXJlbmNlVGltZVZhbGlkKHRydWUpOwkJCQorCQl9IC8vIGVsc2UKKwkJCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGV2YWx1YXRlCisJCit9IC8vRWxhcHNlZFRpbWVUZXN0SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvRmFsc2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9GYWxzZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODBlMzE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvRmFsc2VJbXBsLmphdmEKQEAgLTAsMCArMSw1OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuRmFsc2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmFsc2U8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBGYWxzZUltcGwgZXh0ZW5kcyBUZXN0SW1wbCBpbXBsZW1lbnRzIEZhbHNlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRmFsc2VJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5GQUxTRTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVJbXBsI2V2YWx1YXRlKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSwgbG9uZywgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcikKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZShTVEVNVGltZSB0aW1lLCBsb25nIHRpbWVyUGVyaW9kLCBEZWNvcmF0b3IgYWN0aW9uKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCit9IC8vRmFsc2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9JZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzJkYjMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbkltcGwuamF2YQpAQCAtMCwwICsxLDI1OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLkJvb2xlYW5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SWRlbnRpZmlhYmxlIFByZWRpY2F0ZSBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbkltcGwjZ2V0UHJlZGljYXRlIDxlbT5QcmVkaWNhdGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uSW1wbCBleHRlbmRzIElkZW50aWZpYWJsZVByZWRpY2F0ZUltcGwgaW1wbGVtZW50cyBJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVkaWNhdGUoKSA8ZW0+UHJlZGljYXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQcmVkaWNhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBQcmVkaWNhdGUgcHJlZGljYXRlOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuSURFTlRJRklBQkxFX1BSRURJQ0FURV9FWFBSRVNTSU9OOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcmVkaWNhdGUgZ2V0UHJlZGljYXRlKCkgeworCQlyZXR1cm4gcHJlZGljYXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZWRpY2F0ZShQcmVkaWNhdGUgbmV3UHJlZGljYXRlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCVByZWRpY2F0ZSBvbGRQcmVkaWNhdGUgPSBwcmVkaWNhdGU7CisJCXByZWRpY2F0ZSA9IG5ld1ByZWRpY2F0ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUHJlZGljYXRlUGFja2FnZS5JREVOVElGSUFCTEVfUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURSwgb2xkUHJlZGljYXRlLCBuZXdQcmVkaWNhdGUpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFByZWRpY2F0ZShQcmVkaWNhdGUgbmV3UHJlZGljYXRlKSB7CisJCWlmIChuZXdQcmVkaWNhdGUgIT0gcHJlZGljYXRlKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChwcmVkaWNhdGUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcHJlZGljYXRlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUHJlZGljYXRlUGFja2FnZS5JREVOVElGSUFCTEVfUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3UHJlZGljYXRlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ByZWRpY2F0ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFByZWRpY2F0ZVBhY2thZ2UuSURFTlRJRklBQkxFX1BSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0UHJlZGljYXRlKG5ld1ByZWRpY2F0ZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQcmVkaWNhdGVQYWNrYWdlLklERU5USUZJQUJMRV9QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLCBuZXdQcmVkaWNhdGUsIG5ld1ByZWRpY2F0ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5JREVOVElGSUFCTEVfUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURToKKwkJCQlyZXR1cm4gYmFzaWNTZXRQcmVkaWNhdGUobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5JREVOVElGSUFCTEVfUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURToKKwkJCQlyZXR1cm4gZ2V0UHJlZGljYXRlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5JREVOVElGSUFCTEVfUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURToKKwkJCQlzZXRQcmVkaWNhdGUoKFByZWRpY2F0ZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5JREVOVElGSUFCTEVfUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURToKKwkJCQlzZXRQcmVkaWNhdGUoKFByZWRpY2F0ZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5JREVOVElGSUFCTEVfUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURToKKwkJCQlyZXR1cm4gcHJlZGljYXRlICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBCb29sZWFuRXhwcmVzc2lvbi5jbGFzcykgeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gUHJlZGljYXRlRXhwcmVzc2lvbi5jbGFzcykgeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7CisJCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLklERU5USUZJQUJMRV9QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFOiByZXR1cm4gUHJlZGljYXRlUGFja2FnZS5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgeworCQlpZiAoYmFzZUNsYXNzID09IEJvb2xlYW5FeHByZXNzaW9uLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBQcmVkaWNhdGVFeHByZXNzaW9uLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKKwkJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURTogcmV0dXJuIFByZWRpY2F0ZVBhY2thZ2UuSURFTlRJRklBQkxFX1BSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEU7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElkZW50aWZpYWJsZSNjb21wYXJlVG8oSWRlbnRpZmlhYmxlKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgY29tcGFyZVRvKElkZW50aWZpYWJsZSBvKSB7CisJCWZpbmFsIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgaXRlbVByb3ZpZGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KAorCQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkuRGVzY3JpcHRvci5SZWdpc3RyeS5JTlNUQU5DRSk7CisKKwkJZmluYWwgSUl0ZW1MYWJlbFByb3ZpZGVyIGxwMSA9IChJSXRlbUxhYmVsUHJvdmlkZXIpIGl0ZW1Qcm92aWRlckZhY3RvcnkuYWRhcHQoCisJCQkJdGhpcywgSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKKwkJZmluYWwgSUl0ZW1MYWJlbFByb3ZpZGVyIGxwMiA9IChJSXRlbUxhYmVsUHJvdmlkZXIpIGl0ZW1Qcm92aWRlckZhY3RvcnkuYWRhcHQobywKKwkJCQlJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOworCQlyZXR1cm4gbHAxLmdldFRleHQodGhpcykuY29tcGFyZVRvKGxwMi5nZXRUZXh0KG8pKTsKKwl9IC8vIGNvbXBhcmVUbworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuSWRlbnRpZmlhYmxlUHJlZGljYXRlSW1wbCNldmFsdWF0ZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIGxvbmcsIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoU1RFTVRpbWUgdGltZSwgbG9uZyB0aW1lclBlcmlvZCwgRGVjb3JhdG9yIGFjdGlvbikgeworCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisJCWZpbmFsIFByZWRpY2F0ZSBwcmVkaWNhdGUgPSBnZXRQcmVkaWNhdGUoKTsKKwkJLy8gV2FzIGEgcHJlZGljYXRlIHN1cHBsaWVkPworCQlpZiAocHJlZGljYXRlICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJcmV0VmFsdWUgPSBwcmVkaWNhdGUuZXZhbHVhdGUodGltZSwgdGltZXJQZXJpb2QsIGFjdGlvbik7CisJCX0JCQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBldmFsdWF0ZQorCit9IC8vSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbkltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL0lkZW50aWZpYWJsZVByZWRpY2F0ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL0lkZW50aWZpYWJsZVByZWRpY2F0ZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjQ2YjJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvSWRlbnRpZmlhYmxlUHJlZGljYXRlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLklkZW50aWZpYWJsZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5JZGVudGlmaWFibGVQcmVkaWNhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SWRlbnRpZmlhYmxlIFByZWRpY2F0ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIElkZW50aWZpYWJsZVByZWRpY2F0ZUltcGwgZXh0ZW5kcyBJZGVudGlmaWFibGVJbXBsIGltcGxlbWVudHMgSWRlbnRpZmlhYmxlUHJlZGljYXRlIHsKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIElkZW50aWZpYWJsZVByZWRpY2F0ZUltcGwoKSB7CisJCXN1cGVyKCk7CisJCXNldFVSSShTVEVNVVJJLmNyZWF0ZVVSSShVUklfVFlQRV9QUkVESUNBVEVfU0VHTUVOVCArICIvIgorCQkJCSsgIFNURU1VUkkuZ2VuZXJhdGVVbmlxdWVQYXJ0KCkpKTsKKwkJc2V0VHlwZVVSSShTVEVNVVJJLlBSRURJQ0FURV9UWVBFX1VSSSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLklERU5USUZJQUJMRV9QUkVESUNBVEU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCWFic3RyYWN0IHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKFNURU1UaW1lIHRpbWUsIGxvbmcgdGltZXJQZXJpb2QsIERlY29yYXRvciBhY3Rpb24pOworCit9IC8vSWRlbnRpZmlhYmxlUHJlZGljYXRlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvSWRlbnRpZmlhYmxlVGVzdEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL0lkZW50aWZpYWJsZVRlc3RJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIzNjk4NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL0lkZW50aWZpYWJsZVRlc3RJbXBsLmphdmEKQEAgLTAsMCArMSw0OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuSWRlbnRpZmlhYmxlVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZVBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JZGVudGlmaWFibGUgVGVzdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIElkZW50aWZpYWJsZVRlc3RJbXBsIGV4dGVuZHMgSWRlbnRpZmlhYmxlUHJlZGljYXRlSW1wbCBpbXBsZW1lbnRzIElkZW50aWZpYWJsZVRlc3QgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJZGVudGlmaWFibGVUZXN0SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuSURFTlRJRklBQkxFX1RFU1Q7CisJfQorCit9IC8vSWRlbnRpZmlhYmxlVGVzdEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL05hcnlCb29sZWFuT3BlcmF0b3JJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9OYXJ5Qm9vbGVhbk9wZXJhdG9ySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZTYwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9OYXJ5Qm9vbGVhbk9wZXJhdG9ySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLk5hcnlCb29sZWFuT3BlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFyeSBCb29sZWFuIE9wZXJhdG9yPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuTmFyeUJvb2xlYW5PcGVyYXRvckltcGwjZ2V0T3BlcmFuZHMgPGVtPk9wZXJhbmRzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmFyeUJvb2xlYW5PcGVyYXRvckltcGwgZXh0ZW5kcyBCb29sZWFuT3BlcmF0b3JJbXBsIGltcGxlbWVudHMgTmFyeUJvb2xlYW5PcGVyYXRvciB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3BlcmFuZHMoKSA8ZW0+T3BlcmFuZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3BlcmFuZHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxQcmVkaWNhdGU+IG9wZXJhbmRzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE5hcnlCb29sZWFuT3BlcmF0b3JJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5OQVJZX0JPT0xFQU5fT1BFUkFUT1I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFByZWRpY2F0ZT4gZ2V0T3BlcmFuZHMoKSB7CisJCWlmIChvcGVyYW5kcyA9PSBudWxsKSB7CisJCQlvcGVyYW5kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxQcmVkaWNhdGU+KFByZWRpY2F0ZS5jbGFzcywgdGhpcywgUHJlZGljYXRlUGFja2FnZS5OQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkRTKTsKKwkJfQorCQlyZXR1cm4gb3BlcmFuZHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLk5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORFM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRPcGVyYW5kcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5OQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkRTOgorCQkJCXJldHVybiBnZXRPcGVyYW5kcygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuTkFSWV9CT09MRUFOX09QRVJBVE9SX19PUEVSQU5EUzoKKwkJCQlnZXRPcGVyYW5kcygpLmNsZWFyKCk7CisJCQkJZ2V0T3BlcmFuZHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFByZWRpY2F0ZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuTkFSWV9CT09MRUFOX09QRVJBVE9SX19PUEVSQU5EUzoKKwkJCQlnZXRPcGVyYW5kcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuTkFSWV9CT09MRUFOX09QRVJBVE9SX19PUEVSQU5EUzoKKwkJCQlyZXR1cm4gb3BlcmFuZHMgIT0gbnVsbCAmJiAhb3BlcmFuZHMuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy9OYXJ5Qm9vbGVhbk9wZXJhdG9ySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvTm90SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvTm90SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNWNiMDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9Ob3RJbXBsLmphdmEKQEAgLTAsMCArMSw1OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuTm90OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5vdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE5vdEltcGwgZXh0ZW5kcyBVbmFyeUJvb2xlYW5PcGVyYXRvckltcGwgaW1wbGVtZW50cyBOb3QgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBOb3RJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5OT1Q7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlSW1wbCNldmFsdWF0ZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIGxvbmcsIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoU1RFTVRpbWUgdGltZSwgbG9uZyB0aW1lclBlcmlvZCwgRGVjb3JhdG9yIGFjdGlvbikgeworCQlyZXR1cm4gIWdldE9wZXJhbmQoKS5ldmFsdWF0ZSh0aW1lLCB0aW1lclBlcmlvZCwgYWN0aW9uKTsKKwl9CisKKwkKK30gLy9Ob3RJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9PckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL09ySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNmIxYmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9PckltcGwuamF2YQpAQCAtMCwwICsxLDY5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5PcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZVBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE9ySW1wbCBleHRlbmRzIE5hcnlCb29sZWFuT3BlcmF0b3JJbXBsIGltcGxlbWVudHMgT3IgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBPckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLk9SOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZUltcGwjZXZhbHVhdGUob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lLCBsb25nLCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGV2YWx1YXRlKFNURU1UaW1lIHRpbWUsIGxvbmcgdGltZXJQZXJpb2QsIERlY29yYXRvciBhY3Rpb24pIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOworCQlmb3IgKFByZWRpY2F0ZSBwcmVkaWNhdGUgOiBnZXRPcGVyYW5kcygpKSB7CisJCQlyZXRWYWx1ZSA9IHByZWRpY2F0ZS5ldmFsdWF0ZSh0aW1lLCB0aW1lclBlcmlvZCwgYWN0aW9uKTsKKwkJCS8vIE9uZSBpcyB0cnVlPworCQkJaWYgKHJldFZhbHVlKSB7CisJCQkJLy8gWWVzCisJCQkJYnJlYWs7CisJCQl9IC8vIGlmIAorCQl9IC8vIGZvciBlYWNoIFByZWRpY2F0ZQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBldmFsdWF0ZQorCisJCit9IC8vT3JJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9QcmVkaWNhdGVFeHByZXNzaW9uSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvUHJlZGljYXRlRXhwcmVzc2lvbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTdjYzU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvUHJlZGljYXRlRXhwcmVzc2lvbkltcGwuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhwcmVzc2lvbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZUV4cHJlc3Npb25JbXBsI2dldFByZWRpY2F0ZSA8ZW0+UHJlZGljYXRlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUHJlZGljYXRlRXhwcmVzc2lvbkltcGwgZXh0ZW5kcyBCb29sZWFuRXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQcmVkaWNhdGVFeHByZXNzaW9uIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVkaWNhdGUoKSA8ZW0+UHJlZGljYXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQcmVkaWNhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBQcmVkaWNhdGUgcHJlZGljYXRlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFByZWRpY2F0ZUV4cHJlc3Npb25JbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5QUkVESUNBVEVfRVhQUkVTU0lPTjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUHJlZGljYXRlIGdldFByZWRpY2F0ZSgpIHsKKwkJcmV0dXJuIHByZWRpY2F0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmVkaWNhdGUoUHJlZGljYXRlIG5ld1ByZWRpY2F0ZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlQcmVkaWNhdGUgb2xkUHJlZGljYXRlID0gcHJlZGljYXRlOworCQlwcmVkaWNhdGUgPSBuZXdQcmVkaWNhdGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFByZWRpY2F0ZVBhY2thZ2UuUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURSwgb2xkUHJlZGljYXRlLCBuZXdQcmVkaWNhdGUpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFByZWRpY2F0ZShQcmVkaWNhdGUgbmV3UHJlZGljYXRlKSB7CisJCWlmIChuZXdQcmVkaWNhdGUgIT0gcHJlZGljYXRlKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChwcmVkaWNhdGUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcHJlZGljYXRlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUHJlZGljYXRlUGFja2FnZS5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdQcmVkaWNhdGUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJlZGljYXRlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUHJlZGljYXRlUGFja2FnZS5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFByZWRpY2F0ZShuZXdQcmVkaWNhdGUsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUHJlZGljYXRlUGFja2FnZS5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLCBuZXdQcmVkaWNhdGUsIG5ld1ByZWRpY2F0ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFOgorCQkJCXJldHVybiBiYXNpY1NldFByZWRpY2F0ZShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEU6CisJCQkJcmV0dXJuIGdldFByZWRpY2F0ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURToKKwkJCQlzZXRQcmVkaWNhdGUoKFByZWRpY2F0ZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFOgorCQkJCXNldFByZWRpY2F0ZSgoUHJlZGljYXRlKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEU6CisJCQkJcmV0dXJuIHByZWRpY2F0ZSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVJbXBsI2V2YWx1YXRlKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSwgbG9uZywgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcikKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZShTVEVNVGltZSB0aW1lLCBsb25nIHRpbWVyUGVyaW9kLCBEZWNvcmF0b3IgYWN0aW9uKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gZ2V0UHJlZGljYXRlKCkuZXZhbHVhdGUodGltZSwgdGltZXJQZXJpb2QsIGFjdGlvbik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKK30gLy9QcmVkaWNhdGVFeHByZXNzaW9uSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvUHJlZGljYXRlRmFjdG9yeUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL1ByZWRpY2F0ZUZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlZmY2ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL1ByZWRpY2F0ZUZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSwyMDMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuKjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVkaWNhdGVGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFByZWRpY2F0ZUZhY3RvcnkgeworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFByZWRpY2F0ZUZhY3RvcnkgaW5pdCgpIHsKKwkJdHJ5IHsKKwkJCVByZWRpY2F0ZUZhY3RvcnkgdGhlUHJlZGljYXRlRmFjdG9yeSA9IChQcmVkaWNhdGVGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUuZWNvcmUiKTsgLy8kTk9OLU5MUy0xJCAKKwkJCWlmICh0aGVQcmVkaWNhdGVGYWN0b3J5ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdGhlUHJlZGljYXRlRmFjdG9yeTsKKwkJCX0KKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwkJcmV0dXJuIG5ldyBQcmVkaWNhdGVGYWN0b3J5SW1wbCgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByZWRpY2F0ZUZhY3RvcnlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7CisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuQU5EOiByZXR1cm4gY3JlYXRlQW5kKCk7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuRkFMU0U6IHJldHVybiBjcmVhdGVGYWxzZSgpOworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLk5PVDogcmV0dXJuIGNyZWF0ZU5vdCgpOworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLk9SOiByZXR1cm4gY3JlYXRlT3IoKTsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5QUkVESUNBVEVfUkVGRVJFTkNFOiByZXR1cm4gY3JlYXRlUHJlZGljYXRlUmVmZXJlbmNlKCk7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuVFJVRTogcmV0dXJuIGNyZWF0ZVRydWUoKTsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5QUkVESUNBVEVfRVhQUkVTU0lPTjogcmV0dXJuIGNyZWF0ZVByZWRpY2F0ZUV4cHJlc3Npb24oKTsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5JREVOVElGSUFCTEVfUFJFRElDQVRFX0VYUFJFU1NJT046IHJldHVybiBjcmVhdGVJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uKCk7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuQUJTT0xVVEVfVElNRV9URVNUOiByZXR1cm4gY3JlYXRlQWJzb2x1dGVUaW1lVGVzdCgpOworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLkVMQVBTRURfVElNRV9URVNUOiByZXR1cm4gY3JlYXRlRWxhcHNlZFRpbWVUZXN0KCk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFuZCBjcmVhdGVBbmQoKSB7CisJCUFuZEltcGwgYW5kID0gbmV3IEFuZEltcGwoKTsKKwkJcmV0dXJuIGFuZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRmFsc2UgY3JlYXRlRmFsc2UoKSB7CisJCUZhbHNlSW1wbCBmYWxzZV8gPSBuZXcgRmFsc2VJbXBsKCk7CisJCXJldHVybiBmYWxzZV87CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdCBjcmVhdGVOb3QoKSB7CisJCU5vdEltcGwgbm90ID0gbmV3IE5vdEltcGwoKTsKKwkJcmV0dXJuIG5vdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgT3IgY3JlYXRlT3IoKSB7CisJCU9ySW1wbCBvciA9IG5ldyBPckltcGwoKTsKKwkJcmV0dXJuIG9yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcmVkaWNhdGVSZWZlcmVuY2UgY3JlYXRlUHJlZGljYXRlUmVmZXJlbmNlKCkgeworCQlQcmVkaWNhdGVSZWZlcmVuY2VJbXBsIHByZWRpY2F0ZVJlZmVyZW5jZSA9IG5ldyBQcmVkaWNhdGVSZWZlcmVuY2VJbXBsKCk7CisJCXJldHVybiBwcmVkaWNhdGVSZWZlcmVuY2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRydWUgY3JlYXRlVHJ1ZSgpIHsKKwkJVHJ1ZUltcGwgdHJ1ZV8gPSBuZXcgVHJ1ZUltcGwoKTsKKwkJcmV0dXJuIHRydWVfOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcmVkaWNhdGVFeHByZXNzaW9uIGNyZWF0ZVByZWRpY2F0ZUV4cHJlc3Npb24oKSB7CisJCVByZWRpY2F0ZUV4cHJlc3Npb25JbXBsIHByZWRpY2F0ZUV4cHJlc3Npb24gPSBuZXcgUHJlZGljYXRlRXhwcmVzc2lvbkltcGwoKTsKKwkJcmV0dXJuIHByZWRpY2F0ZUV4cHJlc3Npb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24gY3JlYXRlSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbigpIHsKKwkJSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbkltcGwgaWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbiA9IG5ldyBJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uSW1wbCgpOworCQlyZXR1cm4gaWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWJzb2x1dGVUaW1lVGVzdCBjcmVhdGVBYnNvbHV0ZVRpbWVUZXN0KCkgeworCQlBYnNvbHV0ZVRpbWVUZXN0SW1wbCBhYnNvbHV0ZVRpbWVUZXN0ID0gbmV3IEFic29sdXRlVGltZVRlc3RJbXBsKCk7CisJCXJldHVybiBhYnNvbHV0ZVRpbWVUZXN0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFbGFwc2VkVGltZVRlc3QgY3JlYXRlRWxhcHNlZFRpbWVUZXN0KCkgeworCQlFbGFwc2VkVGltZVRlc3RJbXBsIGVsYXBzZWRUaW1lVGVzdCA9IG5ldyBFbGFwc2VkVGltZVRlc3RJbXBsKCk7CisJCXJldHVybiBlbGFwc2VkVGltZVRlc3Q7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByZWRpY2F0ZVBhY2thZ2UgZ2V0UHJlZGljYXRlUGFja2FnZSgpIHsKKwkJcmV0dXJuIChQcmVkaWNhdGVQYWNrYWdlKWdldEVQYWNrYWdlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZGVwcmVjYXRlZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlARGVwcmVjYXRlZAorCXB1YmxpYyBzdGF0aWMgUHJlZGljYXRlUGFja2FnZSBnZXRQYWNrYWdlKCkgeworCQlyZXR1cm4gUHJlZGljYXRlUGFja2FnZS5lSU5TVEFOQ0U7CisJfQorCit9IC8vUHJlZGljYXRlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL1ByZWRpY2F0ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL1ByZWRpY2F0ZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWVlZjIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvUHJlZGljYXRlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJlZGljYXRlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJlZGljYXRlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUHJlZGljYXRlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUHJlZGljYXRlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuUFJFRElDQVRFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZShTVEVNVGltZSB0aW1lLCBsb25nIHRpbWVyUGVyaW9kLCBEZWNvcmF0b3IgYWN0aW9uKTsKKworfSAvL1ByZWRpY2F0ZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL1ByZWRpY2F0ZVBhY2thZ2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9QcmVkaWNhdGVQYWNrYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMDU0NzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9QcmVkaWNhdGVQYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNzQ5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudFBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5pbXBsLkV4cGVyaW1lbnRQYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5BYnNvbHV0ZVRpbWVUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuQW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuQm9vbGVhbkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5Cb29sZWFuT3BlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5FbGFwc2VkVGltZVRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5GYWxzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLklkZW50aWZpYWJsZVByZWRpY2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLklkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5JZGVudGlmaWFibGVUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuTmFyeUJvb2xlYW5PcGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLk5vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLk9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlRpbWVUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuVHJ1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlVuYXJ5Qm9vbGVhbk9wZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5pbXBsLlNjZW5hcmlvUGFja2FnZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlclBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLmltcGwuU2VxdWVuY2VyUGFja2FnZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5pbXBsLlNvbHZlclBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuaW1wbC5UcmlnZ2VyUGFja2FnZUltcGw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUHJlZGljYXRlUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBQcmVkaWNhdGVQYWNrYWdlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBhbmRFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgYm9vbGVhbkV4cHJlc3Npb25FQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgYm9vbGVhbk9wZXJhdG9yRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGZhbHNlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIG5hcnlCb29sZWFuT3BlcmF0b3JFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgbm90RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIG9yRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHByZWRpY2F0ZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBwcmVkaWNhdGVSZWZlcmVuY2VFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGVzdEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB0cnVlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHVuYXJ5Qm9vbGVhbk9wZXJhdG9yRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHByZWRpY2F0ZUV4cHJlc3Npb25FQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgaWRlbnRpZmlhYmxlUHJlZGljYXRlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGlkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb25FQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgaWRlbnRpZmlhYmxlVGVzdEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB0aW1lVGVzdEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBhYnNvbHV0ZVRpbWVUZXN0RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGVsYXBzZWRUaW1lVGVzdEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKKwkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KKwkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCisJICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKKwkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZVBhY2thZ2UjZU5TX1VSSQorCSAqIEBzZWUgI2luaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIFByZWRpY2F0ZVBhY2thZ2VJbXBsKCkgeworCQlzdXBlcihlTlNfVVJJLCBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgorCSAqIAorCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgUHJlZGljYXRlUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KKwkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZU5TX1VSSQorCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCisJICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUHJlZGljYXRlUGFja2FnZSBpbml0KCkgeworCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoUHJlZGljYXRlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQcmVkaWNhdGVQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKwkJUHJlZGljYXRlUGFja2FnZUltcGwgdGhlUHJlZGljYXRlUGFja2FnZSA9IChQcmVkaWNhdGVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgUHJlZGljYXRlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgUHJlZGljYXRlUGFja2FnZUltcGwoKSk7CisKKwkJaXNJbml0ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcworCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCisJCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7CisJCUV4cGVyaW1lbnRQYWNrYWdlSW1wbCB0aGVFeHBlcmltZW50UGFja2FnZSA9IChFeHBlcmltZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEV4cGVyaW1lbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRXhwZXJpbWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRXhwZXJpbWVudFBhY2thZ2UuZU5TX1VSSSkgOiBFeHBlcmltZW50UGFja2FnZS5lSU5TVEFOQ0UpOworCQlHcmFwaFBhY2thZ2VJbXBsIHRoZUdyYXBoUGFja2FnZSA9IChHcmFwaFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShHcmFwaFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBHcmFwaFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoR3JhcGhQYWNrYWdlLmVOU19VUkkpIDogR3JhcGhQYWNrYWdlLmVJTlNUQU5DRSk7CisJCU1vZGVsUGFja2FnZUltcGwgdGhlTW9kZWxQYWNrYWdlID0gKE1vZGVsUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGVsUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIE1vZGVsUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RlbFBhY2thZ2UuZU5TX1VSSSkgOiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJTW9kaWZpZXJQYWNrYWdlSW1wbCB0aGVNb2RpZmllclBhY2thZ2UgPSAoTW9kaWZpZXJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kaWZpZXJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgTW9kaWZpZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGlmaWVyUGFja2FnZS5lTlNfVVJJKSA6IE1vZGlmaWVyUGFja2FnZS5lSU5TVEFOQ0UpOworCQlTY2VuYXJpb1BhY2thZ2VJbXBsIHRoZVNjZW5hcmlvUGFja2FnZSA9IChTY2VuYXJpb1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTY2VuYXJpb1BhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBTY2VuYXJpb1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU2NlbmFyaW9QYWNrYWdlLmVOU19VUkkpIDogU2NlbmFyaW9QYWNrYWdlLmVJTlNUQU5DRSk7CisJCVNlcXVlbmNlclBhY2thZ2VJbXBsIHRoZVNlcXVlbmNlclBhY2thZ2UgPSAoU2VxdWVuY2VyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNlcXVlbmNlclBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBTZXF1ZW5jZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNlcXVlbmNlclBhY2thZ2UuZU5TX1VSSSkgOiBTZXF1ZW5jZXJQYWNrYWdlLmVJTlNUQU5DRSk7CisJCVRyaWdnZXJQYWNrYWdlSW1wbCB0aGVUcmlnZ2VyUGFja2FnZSA9IChUcmlnZ2VyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRyaWdnZXJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVHJpZ2dlclBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVHJpZ2dlclBhY2thZ2UuZU5TX1VSSSkgOiBUcmlnZ2VyUGFja2FnZS5lSU5TVEFOQ0UpOworCQlTb2x2ZXJQYWNrYWdlSW1wbCB0aGVTb2x2ZXJQYWNrYWdlID0gKFNvbHZlclBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTb2x2ZXJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgU29sdmVyUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTb2x2ZXJQYWNrYWdlLmVOU19VUkkpIDogU29sdmVyUGFja2FnZS5lSU5TVEFOQ0UpOworCisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCisJCXRoZVByZWRpY2F0ZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUV4cGVyaW1lbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVHcmFwaFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU1vZGVsUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlTW9kaWZpZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVTY2VuYXJpb1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNlcXVlbmNlclBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVRyaWdnZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVTb2x2ZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKwkJdGhlUHJlZGljYXRlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVFeHBlcmltZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUdyYXBoUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU1vZGVsUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU1vZGlmaWVyUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNjZW5hcmlvUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNlcXVlbmNlclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVUcmlnZ2VyUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNvbHZlclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKwkJdGhlUHJlZGljYXRlUGFja2FnZS5mcmVlemUoKTsKKworICAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChQcmVkaWNhdGVQYWNrYWdlLmVOU19VUkksIHRoZVByZWRpY2F0ZVBhY2thZ2UpOworCQlyZXR1cm4gdGhlUHJlZGljYXRlUGFja2FnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEFuZCgpIHsKKwkJcmV0dXJuIGFuZEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEJvb2xlYW5FeHByZXNzaW9uKCkgeworCQlyZXR1cm4gYm9vbGVhbkV4cHJlc3Npb25FQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRCb29sZWFuT3BlcmF0b3IoKSB7CisJCXJldHVybiBib29sZWFuT3BlcmF0b3JFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRGYWxzZSgpIHsKKwkJcmV0dXJuIGZhbHNlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0TmFyeUJvb2xlYW5PcGVyYXRvcigpIHsKKwkJcmV0dXJuIG5hcnlCb29sZWFuT3BlcmF0b3JFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TmFyeUJvb2xlYW5PcGVyYXRvcl9PcGVyYW5kcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKW5hcnlCb29sZWFuT3BlcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldE5vdCgpIHsKKwkJcmV0dXJuIG5vdEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldE9yKCkgeworCQlyZXR1cm4gb3JFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQcmVkaWNhdGUoKSB7CisJCXJldHVybiBwcmVkaWNhdGVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQcmVkaWNhdGVSZWZlcmVuY2UoKSB7CisJCXJldHVybiBwcmVkaWNhdGVSZWZlcmVuY2VFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJlZGljYXRlUmVmZXJlbmNlX1ByZWRpY2F0ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXByZWRpY2F0ZVJlZmVyZW5jZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0VGVzdCgpIHsKKwkJcmV0dXJuIHRlc3RFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRUcnVlKCkgeworCQlyZXR1cm4gdHJ1ZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFVuYXJ5Qm9vbGVhbk9wZXJhdG9yKCkgeworCQlyZXR1cm4gdW5hcnlCb29sZWFuT3BlcmF0b3JFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0VW5hcnlCb29sZWFuT3BlcmF0b3JfT3BlcmFuZCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXVuYXJ5Qm9vbGVhbk9wZXJhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQcmVkaWNhdGVFeHByZXNzaW9uKCkgeworCQlyZXR1cm4gcHJlZGljYXRlRXhwcmVzc2lvbkVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcmVkaWNhdGVFeHByZXNzaW9uX1ByZWRpY2F0ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXByZWRpY2F0ZUV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldElkZW50aWZpYWJsZVByZWRpY2F0ZSgpIHsKKwkJcmV0dXJuIGlkZW50aWZpYWJsZVByZWRpY2F0ZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldElkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24oKSB7CisJCXJldHVybiBpZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SWRlbnRpZmlhYmxlVGVzdCgpIHsKKwkJcmV0dXJuIGlkZW50aWZpYWJsZVRlc3RFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRUaW1lVGVzdCgpIHsKKwkJcmV0dXJuIHRpbWVUZXN0RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0QWJzb2x1dGVUaW1lVGVzdCgpIHsKKwkJcmV0dXJuIGFic29sdXRlVGltZVRlc3RFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QWJzb2x1dGVUaW1lVGVzdF9UaW1lKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpYWJzb2x1dGVUaW1lVGVzdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0RWxhcHNlZFRpbWVUZXN0KCkgeworCQlyZXR1cm4gZWxhcHNlZFRpbWVUZXN0RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEVsYXBzZWRUaW1lVGVzdF9SZWZlcmVuY2VUaW1lVmFsaWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSllbGFwc2VkVGltZVRlc3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbGFwc2VkVGltZVRlc3RfRWxhcHNlZE1pbGxpc2Vjb25kcygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWVsYXBzZWRUaW1lVGVzdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEVsYXBzZWRUaW1lVGVzdF9OdW1iZXJvZkRheXMoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSllbGFwc2VkVGltZVRlc3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbGFwc2VkVGltZVRlc3RfUmVmZXJlbmNlVGltZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWVsYXBzZWRUaW1lVGVzdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcmVkaWNhdGVGYWN0b3J5IGdldFByZWRpY2F0ZUZhY3RvcnkoKSB7CisJCXJldHVybiAoUHJlZGljYXRlRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCisJICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOworCQlpc0NyZWF0ZWQgPSB0cnVlOworCisJCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcworCQlhbmRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQU5EKTsKKworCQlib29sZWFuRXhwcmVzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhCT09MRUFOX0VYUFJFU1NJT04pOworCisJCWJvb2xlYW5PcGVyYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhCT09MRUFOX09QRVJBVE9SKTsKKworCQlmYWxzZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGQUxTRSk7CisKKwkJbmFyeUJvb2xlYW5PcGVyYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOQVJZX0JPT0xFQU5fT1BFUkFUT1IpOworCQljcmVhdGVFUmVmZXJlbmNlKG5hcnlCb29sZWFuT3BlcmF0b3JFQ2xhc3MsIE5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORFMpOworCisJCW5vdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOT1QpOworCisJCW9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKE9SKTsKKworCQlwcmVkaWNhdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJFRElDQVRFKTsKKworCQlwcmVkaWNhdGVSZWZlcmVuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJFRElDQVRFX1JFRkVSRU5DRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UocHJlZGljYXRlUmVmZXJlbmNlRUNsYXNzLCBQUkVESUNBVEVfUkVGRVJFTkNFX19QUkVESUNBVEUpOworCisJCXRlc3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVTVCk7CisKKwkJdHJ1ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUUlVFKTsKKworCQl1bmFyeUJvb2xlYW5PcGVyYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhVTkFSWV9CT09MRUFOX09QRVJBVE9SKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh1bmFyeUJvb2xlYW5PcGVyYXRvckVDbGFzcywgVU5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORCk7CisKKwkJcHJlZGljYXRlRXhwcmVzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUkVESUNBVEVfRVhQUkVTU0lPTik7CisJCWNyZWF0ZUVSZWZlcmVuY2UocHJlZGljYXRlRXhwcmVzc2lvbkVDbGFzcywgUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURSk7CisKKwkJaWRlbnRpZmlhYmxlUHJlZGljYXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElERU5USUZJQUJMRV9QUkVESUNBVEUpOworCisJCWlkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSURFTlRJRklBQkxFX1BSRURJQ0FURV9FWFBSRVNTSU9OKTsKKworCQlpZGVudGlmaWFibGVUZXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElERU5USUZJQUJMRV9URVNUKTsKKworCQl0aW1lVGVzdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUSU1FX1RFU1QpOworCisJCWFic29sdXRlVGltZVRlc3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTT0xVVEVfVElNRV9URVNUKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShhYnNvbHV0ZVRpbWVUZXN0RUNsYXNzLCBBQlNPTFVURV9USU1FX1RFU1RfX1RJTUUpOworCisJCWVsYXBzZWRUaW1lVGVzdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFTEFQU0VEX1RJTUVfVEVTVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZWxhcHNlZFRpbWVUZXN0RUNsYXNzLCBFTEFQU0VEX1RJTUVfVEVTVF9fUkVGRVJFTkNFX1RJTUVfVkFMSUQpOworCQljcmVhdGVFQXR0cmlidXRlKGVsYXBzZWRUaW1lVGVzdEVDbGFzcywgRUxBUFNFRF9USU1FX1RFU1RfX0VMQVBTRURfTUlMTElTRUNPTkRTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShlbGFwc2VkVGltZVRlc3RFQ2xhc3MsIEVMQVBTRURfVElNRV9URVNUX19OVU1CRVJPRl9EQVlTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShlbGFwc2VkVGltZVRlc3RFQ2xhc3MsIEVMQVBTRURfVElNRV9URVNUX19SRUZFUkVOQ0VfVElNRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOworCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKKwkJc2V0TmFtZShlTkFNRSk7CisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOworCQlzZXROc1VSSShlTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCisJCU1vZGVsUGFja2FnZSB0aGVNb2RlbFBhY2thZ2UgPSAoTW9kZWxQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGVsUGFja2FnZS5lTlNfVVJJKTsKKwkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQlhbmRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROYXJ5Qm9vbGVhbk9wZXJhdG9yKCkpOworCQlib29sZWFuRXhwcmVzc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByZWRpY2F0ZSgpKTsKKwkJYm9vbGVhbk9wZXJhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Qm9vbGVhbkV4cHJlc3Npb24oKSk7CisJCWZhbHNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VGVzdCgpKTsKKwkJbmFyeUJvb2xlYW5PcGVyYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJvb2xlYW5PcGVyYXRvcigpKTsKKwkJbm90RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VW5hcnlCb29sZWFuT3BlcmF0b3IoKSk7CisJCW9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TmFyeUJvb2xlYW5PcGVyYXRvcigpKTsKKwkJcHJlZGljYXRlUmVmZXJlbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJlZGljYXRlKCkpOworCQl0ZXN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJlZGljYXRlKCkpOworCQl0cnVlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VGVzdCgpKTsKKwkJdW5hcnlCb29sZWFuT3BlcmF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCb29sZWFuT3BlcmF0b3IoKSk7CisJCXByZWRpY2F0ZUV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCb29sZWFuRXhwcmVzc2lvbigpKTsKKwkJaWRlbnRpZmlhYmxlUHJlZGljYXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SWRlbnRpZmlhYmxlKCkpOworCQlpZGVudGlmaWFibGVQcmVkaWNhdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcmVkaWNhdGUoKSk7CisJCWlkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJZGVudGlmaWFibGVQcmVkaWNhdGUoKSk7CisJCWlkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcmVkaWNhdGVFeHByZXNzaW9uKCkpOworCQlpZGVudGlmaWFibGVUZXN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SWRlbnRpZmlhYmxlUHJlZGljYXRlKCkpOworCQlpZGVudGlmaWFibGVUZXN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VGVzdCgpKTsKKwkJdGltZVRlc3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRUZXN0KCkpOworCQlhYnNvbHV0ZVRpbWVUZXN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VGltZVRlc3QoKSk7CisJCWVsYXBzZWRUaW1lVGVzdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFRpbWVUZXN0KCkpOworCisJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCWluaXRFQ2xhc3MoYW5kRUNsYXNzLCBBbmQuY2xhc3MsICJBbmQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGJvb2xlYW5FeHByZXNzaW9uRUNsYXNzLCBCb29sZWFuRXhwcmVzc2lvbi5jbGFzcywgIkJvb2xlYW5FeHByZXNzaW9uIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGJvb2xlYW5PcGVyYXRvckVDbGFzcywgQm9vbGVhbk9wZXJhdG9yLmNsYXNzLCAiQm9vbGVhbk9wZXJhdG9yIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGZhbHNlRUNsYXNzLCBGYWxzZS5jbGFzcywgIkZhbHNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhuYXJ5Qm9vbGVhbk9wZXJhdG9yRUNsYXNzLCBOYXJ5Qm9vbGVhbk9wZXJhdG9yLmNsYXNzLCAiTmFyeUJvb2xlYW5PcGVyYXRvciIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldE5hcnlCb29sZWFuT3BlcmF0b3JfT3BlcmFuZHMoKSwgdGhpcy5nZXRQcmVkaWNhdGUoKSwgbnVsbCwgIm9wZXJhbmRzIiwgbnVsbCwgMCwgLTEsIE5hcnlCb29sZWFuT3BlcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKG5vdEVDbGFzcywgTm90LmNsYXNzLCAiTm90IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhvckVDbGFzcywgT3IuY2xhc3MsICJPciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MocHJlZGljYXRlRUNsYXNzLCBQcmVkaWNhdGUuY2xhc3MsICJQcmVkaWNhdGUiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCUVPcGVyYXRpb24gb3AgPSBhZGRFT3BlcmF0aW9uKHByZWRpY2F0ZUVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJldmFsdWF0ZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgdGhlTW9kZWxQYWNrYWdlLmdldFNURU1UaW1lKCksICJ0aW1lIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RUxvbmcoKSwgInRpbWVyUGVyaW9kIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGVNb2RlbFBhY2thZ2UuZ2V0RGVjb3JhdG9yKCksICJhY3Rpb24iLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhwcmVkaWNhdGVSZWZlcmVuY2VFQ2xhc3MsIFByZWRpY2F0ZVJlZmVyZW5jZS5jbGFzcywgIlByZWRpY2F0ZVJlZmVyZW5jZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRQcmVkaWNhdGVSZWZlcmVuY2VfUHJlZGljYXRlKCksIHRoaXMuZ2V0UHJlZGljYXRlKCksIG51bGwsICJwcmVkaWNhdGUiLCBudWxsLCAwLCAxLCBQcmVkaWNhdGVSZWZlcmVuY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHRlc3RFQ2xhc3MsIFRlc3QuY2xhc3MsICJUZXN0IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHRydWVFQ2xhc3MsIFRydWUuY2xhc3MsICJUcnVlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyh1bmFyeUJvb2xlYW5PcGVyYXRvckVDbGFzcywgVW5hcnlCb29sZWFuT3BlcmF0b3IuY2xhc3MsICJVbmFyeUJvb2xlYW5PcGVyYXRvciIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFVuYXJ5Qm9vbGVhbk9wZXJhdG9yX09wZXJhbmQoKSwgdGhpcy5nZXRQcmVkaWNhdGUoKSwgbnVsbCwgIm9wZXJhbmQiLCBudWxsLCAwLCAxLCBVbmFyeUJvb2xlYW5PcGVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MocHJlZGljYXRlRXhwcmVzc2lvbkVDbGFzcywgUHJlZGljYXRlRXhwcmVzc2lvbi5jbGFzcywgIlByZWRpY2F0ZUV4cHJlc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJlZGljYXRlRXhwcmVzc2lvbl9QcmVkaWNhdGUoKSwgdGhpcy5nZXRQcmVkaWNhdGUoKSwgbnVsbCwgInByZWRpY2F0ZSIsIG51bGwsIDAsIDEsIFByZWRpY2F0ZUV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGlkZW50aWZpYWJsZVByZWRpY2F0ZUVDbGFzcywgSWRlbnRpZmlhYmxlUHJlZGljYXRlLmNsYXNzLCAiSWRlbnRpZmlhYmxlUHJlZGljYXRlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGlkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb25FQ2xhc3MsIElkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24uY2xhc3MsICJJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhpZGVudGlmaWFibGVUZXN0RUNsYXNzLCBJZGVudGlmaWFibGVUZXN0LmNsYXNzLCAiSWRlbnRpZmlhYmxlVGVzdCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyh0aW1lVGVzdEVDbGFzcywgVGltZVRlc3QuY2xhc3MsICJUaW1lVGVzdCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhhYnNvbHV0ZVRpbWVUZXN0RUNsYXNzLCBBYnNvbHV0ZVRpbWVUZXN0LmNsYXNzLCAiQWJzb2x1dGVUaW1lVGVzdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRBYnNvbHV0ZVRpbWVUZXN0X1RpbWUoKSwgdGhlTW9kZWxQYWNrYWdlLmdldFNURU1UaW1lKCksIG51bGwsICJ0aW1lIiwgbnVsbCwgMCwgMSwgQWJzb2x1dGVUaW1lVGVzdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MoZWxhcHNlZFRpbWVUZXN0RUNsYXNzLCBFbGFwc2VkVGltZVRlc3QuY2xhc3MsICJFbGFwc2VkVGltZVRlc3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWxhcHNlZFRpbWVUZXN0X1JlZmVyZW5jZVRpbWVWYWxpZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInJlZmVyZW5jZVRpbWVWYWxpZCIsICJmYWxzZSIsIDAsIDEsIEVsYXBzZWRUaW1lVGVzdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldEVsYXBzZWRUaW1lVGVzdF9FbGFwc2VkTWlsbGlzZWNvbmRzKCksIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAiZWxhcHNlZE1pbGxpc2Vjb25kcyIsIG51bGwsIDAsIDEsIEVsYXBzZWRUaW1lVGVzdC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRFbGFwc2VkVGltZVRlc3RfTnVtYmVyb2ZEYXlzKCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJudW1iZXJvZkRheXMiLCAiMCIsIDAsIDEsIEVsYXBzZWRUaW1lVGVzdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFUmVmZXJlbmNlKGdldEVsYXBzZWRUaW1lVGVzdF9SZWZlcmVuY2VUaW1lKCksIHRoZU1vZGVsUGFja2FnZS5nZXRTVEVNVGltZSgpLCBudWxsLCAicmVmZXJlbmNlVGltZSIsIG51bGwsIDAsIDEsIEVsYXBzZWRUaW1lVGVzdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIENyZWF0ZSByZXNvdXJjZQorCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKwl9CisKK30gLy9QcmVkaWNhdGVQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvUHJlZGljYXRlUmVmZXJlbmNlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvUHJlZGljYXRlUmVmZXJlbmNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZjJjODQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9QcmVkaWNhdGVSZWZlcmVuY2VJbXBsLmphdmEKQEAgLTAsMCArMSwxNzggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlUmVmZXJlbmNlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGwuUHJlZGljYXRlUmVmZXJlbmNlSW1wbCNnZXRQcmVkaWNhdGUgPGVtPlByZWRpY2F0ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFByZWRpY2F0ZVJlZmVyZW5jZUltcGwgZXh0ZW5kcyBQcmVkaWNhdGVJbXBsIGltcGxlbWVudHMgUHJlZGljYXRlUmVmZXJlbmNlIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVkaWNhdGUoKSA8ZW0+UHJlZGljYXRlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQcmVkaWNhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBQcmVkaWNhdGUgcHJlZGljYXRlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFByZWRpY2F0ZVJlZmVyZW5jZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlBSRURJQ0FURV9SRUZFUkVOQ0U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByZWRpY2F0ZSBnZXRQcmVkaWNhdGUoKSB7CisJCWlmIChwcmVkaWNhdGUgIT0gbnVsbCAmJiBwcmVkaWNhdGUuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByZWRpY2F0ZSA9IChJbnRlcm5hbEVPYmplY3QpcHJlZGljYXRlOworCQkJcHJlZGljYXRlID0gKFByZWRpY2F0ZSllUmVzb2x2ZVByb3h5KG9sZFByZWRpY2F0ZSk7CisJCQlpZiAocHJlZGljYXRlICE9IG9sZFByZWRpY2F0ZSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFByZWRpY2F0ZVBhY2thZ2UuUFJFRElDQVRFX1JFRkVSRU5DRV9fUFJFRElDQVRFLCBvbGRQcmVkaWNhdGUsIHByZWRpY2F0ZSkpOworCQkJfQorCQl9CisJCXJldHVybiBwcmVkaWNhdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByZWRpY2F0ZSBiYXNpY0dldFByZWRpY2F0ZSgpIHsKKwkJcmV0dXJuIHByZWRpY2F0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcmVkaWNhdGUoUHJlZGljYXRlIG5ld1ByZWRpY2F0ZSkgeworCQlQcmVkaWNhdGUgb2xkUHJlZGljYXRlID0gcHJlZGljYXRlOworCQlwcmVkaWNhdGUgPSBuZXdQcmVkaWNhdGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFByZWRpY2F0ZVBhY2thZ2UuUFJFRElDQVRFX1JFRkVSRU5DRV9fUFJFRElDQVRFLCBvbGRQcmVkaWNhdGUsIHByZWRpY2F0ZSkpOworCX0KKworCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZUltcGwjZXZhbHVhdGUob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lLCBsb25nLCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGV2YWx1YXRlKFNURU1UaW1lIHRpbWUsIGxvbmcgdGltZXJQZXJpb2QsIERlY29yYXRvciBhY3Rpb24pIHsKKwkJcmV0dXJuIGdldFByZWRpY2F0ZSgpLmV2YWx1YXRlKHRpbWUsIHRpbWVyUGVyaW9kLCBhY3Rpb24pOworCX0gLy8gZXZhbHVhdGUKKwkKKwkKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5QUkVESUNBVEVfUkVGRVJFTkNFX19QUkVESUNBVEU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRQcmVkaWNhdGUoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRQcmVkaWNhdGUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLlBSRURJQ0FURV9SRUZFUkVOQ0VfX1BSRURJQ0FURToKKwkJCQlzZXRQcmVkaWNhdGUoKFByZWRpY2F0ZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5QUkVESUNBVEVfUkVGRVJFTkNFX19QUkVESUNBVEU6CisJCQkJc2V0UHJlZGljYXRlKChQcmVkaWNhdGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuUFJFRElDQVRFX1JFRkVSRU5DRV9fUFJFRElDQVRFOgorCQkJCXJldHVybiBwcmVkaWNhdGUgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vUHJlZGljYXRlUmVmZXJlbmNlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvVGVzdEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL1Rlc3RJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzYmFmOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL1Rlc3RJbXBsLmphdmEKQEAgLTAsMCArMSw0OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlRlc3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXN0PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGVzdEltcGwgZXh0ZW5kcyBQcmVkaWNhdGVJbXBsIGltcGxlbWVudHMgVGVzdCB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRlc3RJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5URVNUOworCX0KKworfSAvL1Rlc3RJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9UaW1lVGVzdEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL1RpbWVUZXN0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YWRkNzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9UaW1lVGVzdEltcGwuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvLyBUaW1lVGVzdEltcGwuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5UaW1lVGVzdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRpbWUgVGVzdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRpbWVUZXN0SW1wbCBleHRlbmRzIFRlc3RJbXBsIGltcGxlbWVudHMgVGltZVRlc3QgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUaW1lVGVzdEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlRJTUVfVEVTVDsKKwl9CisJCit9IC8vVGltZVRlc3RJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvaW1wbC9UcnVlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvVHJ1ZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWQ3ODUyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvVHJ1ZUltcGwuamF2YQpAQCAtMCwwICsxLDU4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuVHJ1ZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRydWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUcnVlSW1wbCBleHRlbmRzIFRlc3RJbXBsIGltcGxlbWVudHMgVHJ1ZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRydWVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5UUlVFOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZUltcGwjZXZhbHVhdGUob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lLCBsb25nLCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGV2YWx1YXRlKFNURU1UaW1lIHRpbWUsIGxvbmcgdGltZXJQZXJpb2QsIERlY29yYXRvciBhY3Rpb24pIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCit9IC8vVHJ1ZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL1VuYXJ5Qm9vbGVhbk9wZXJhdG9ySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL2ltcGwvVW5hcnlCb29sZWFuT3BlcmF0b3JJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhOTc3NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9pbXBsL1VuYXJ5Qm9vbGVhbk9wZXJhdG9ySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTg0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlVuYXJ5Qm9vbGVhbk9wZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VW5hcnkgQm9vbGVhbiBPcGVyYXRvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlVuYXJ5Qm9vbGVhbk9wZXJhdG9ySW1wbCNnZXRPcGVyYW5kIDxlbT5PcGVyYW5kPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVW5hcnlCb29sZWFuT3BlcmF0b3JJbXBsIGV4dGVuZHMgQm9vbGVhbk9wZXJhdG9ySW1wbCBpbXBsZW1lbnRzIFVuYXJ5Qm9vbGVhbk9wZXJhdG9yIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcGVyYW5kKCkgPGVtPk9wZXJhbmQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9wZXJhbmQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBQcmVkaWNhdGUgb3BlcmFuZDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBVbmFyeUJvb2xlYW5PcGVyYXRvckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlVOQVJZX0JPT0xFQU5fT1BFUkFUT1I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByZWRpY2F0ZSBnZXRPcGVyYW5kKCkgeworCQlyZXR1cm4gb3BlcmFuZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPcGVyYW5kKFByZWRpY2F0ZSBuZXdPcGVyYW5kLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCVByZWRpY2F0ZSBvbGRPcGVyYW5kID0gb3BlcmFuZDsKKwkJb3BlcmFuZCA9IG5ld09wZXJhbmQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFByZWRpY2F0ZVBhY2thZ2UuVU5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORCwgb2xkT3BlcmFuZCwgbmV3T3BlcmFuZCk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0T3BlcmFuZChQcmVkaWNhdGUgbmV3T3BlcmFuZCkgeworCQlpZiAobmV3T3BlcmFuZCAhPSBvcGVyYW5kKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChvcGVyYW5kICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW9wZXJhbmQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBQcmVkaWNhdGVQYWNrYWdlLlVOQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkQsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld09wZXJhbmQgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T3BlcmFuZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFByZWRpY2F0ZVBhY2thZ2UuVU5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORCwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRPcGVyYW5kKG5ld09wZXJhbmQsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUHJlZGljYXRlUGFja2FnZS5VTkFSWV9CT09MRUFOX09QRVJBVE9SX19PUEVSQU5ELCBuZXdPcGVyYW5kLCBuZXdPcGVyYW5kKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLlVOQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkQ6CisJCQkJcmV0dXJuIGJhc2ljU2V0T3BlcmFuZChudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLlVOQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkQ6CisJCQkJcmV0dXJuIGdldE9wZXJhbmQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLlVOQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkQ6CisJCQkJc2V0T3BlcmFuZCgoUHJlZGljYXRlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLlVOQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkQ6CisJCQkJc2V0T3BlcmFuZCgoUHJlZGljYXRlKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLlVOQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkQ6CisJCQkJcmV0dXJuIG9wZXJhbmQgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vVW5hcnlCb29sZWFuT3BlcmF0b3JJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvQWJzb2x1dGVUaW1lVGVzdEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL0Fic29sdXRlVGltZVRlc3RJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTA3Y2NiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL0Fic29sdXRlVGltZVRlc3RJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLkFic29sdXRlVGltZVRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5BYnNvbHV0ZVRpbWVUZXN0fSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBBYnNvbHV0ZVRpbWVUZXN0SXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBUaW1lVGVzdEl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWJzb2x1dGVUaW1lVGVzdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRUaW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUaW1lIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkVGltZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0Fic29sdXRlVGltZVRlc3RfdGltZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BYnNvbHV0ZVRpbWVUZXN0X3RpbWVfZmVhdHVyZSIsICJfVUlfQWJzb2x1dGVUaW1lVGVzdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuQUJTT0xVVEVfVElNRV9URVNUX19USU1FLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgQWJzb2x1dGVUaW1lVGVzdC5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9BYnNvbHV0ZVRpbWVUZXN0IikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJZmluYWwgQWJzb2x1dGVUaW1lVGVzdCBhdHQgPSAoQWJzb2x1dGVUaW1lVGVzdClvYmplY3Q7CisJCXJldHVybiAiQXQgIiArIGF0dC5nZXRUaW1lKCkudG9TdHJpbmcoKTsKKwl9IC8vIGdldFRleHQKKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJLy9AT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQWJzb2x1dGVUaW1lVGVzdF90eXBlIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQWJzb2x1dGVUaW1lVGVzdC5jbGFzcykpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5BQlNPTFVURV9USU1FX1RFU1RfX1RJTUU6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcm92aWRlci9BbmRJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcm92aWRlci9BbmRJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWZjNDU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL0FuZEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5BbmR9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEFuZEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgTmFyeUJvb2xlYW5PcGVyYXRvckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQW5kSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIEFuZC5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9BbmQiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gIiYiOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworLy8JQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIGdldFN0cmluZygiX1VJX0FuZF90eXBlIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcm92aWRlci9Cb29sZWFuRXhwcmVzc2lvbkl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL0Jvb2xlYW5FeHByZXNzaW9uSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlNGVlZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcm92aWRlci9Cb29sZWFuRXhwcmVzc2lvbkl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLkJvb2xlYW5FeHByZXNzaW9ufSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBCb29sZWFuRXhwcmVzc2lvbkl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgUHJlZGljYXRlSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCb29sZWFuRXhwcmVzc2lvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIGdldFN0cmluZygiX1VJX0Jvb2xlYW5FeHByZXNzaW9uX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL0Jvb2xlYW5PcGVyYXRvckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL0Jvb2xlYW5PcGVyYXRvckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMDc3OGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvQm9vbGVhbk9wZXJhdG9ySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuQm9vbGVhbk9wZXJhdG9yfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBCb29sZWFuT3BlcmF0b3JJdGVtUHJvdmlkZXIKKwlleHRlbmRzIEJvb2xlYW5FeHByZXNzaW9uSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCb29sZWFuT3BlcmF0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9Cb29sZWFuT3BlcmF0b3JfdHlwZSIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvRWxhcHNlZFRpbWVUZXN0SXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvRWxhcHNlZFRpbWVUZXN0SXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhZjVhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcm92aWRlci9FbGFwc2VkVGltZVRlc3RJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5FbGFwc2VkVGltZVRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5FbGFwc2VkVGltZVRlc3R9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEVsYXBzZWRUaW1lVGVzdEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgVGltZVRlc3RJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVsYXBzZWRUaW1lVGVzdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGROdW1iZXJvZkRheXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCQorCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOdW1iZXJvZiBEYXlzIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkTnVtYmVyb2ZEYXlzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRWxhcHNlZFRpbWVUZXN0X251bWJlcm9mRGF5c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FbGFwc2VkVGltZVRlc3RfbnVtYmVyb2ZEYXlzX2ZlYXR1cmUiLCAiX1VJX0VsYXBzZWRUaW1lVGVzdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuRUxBUFNFRF9USU1FX1RFU1RfX05VTUJFUk9GX0RBWVMsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBFbGFwc2VkVGltZVRlc3QuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRWxhcHNlZFRpbWVUZXN0IikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJZmluYWwgRWxhcHNlZFRpbWVUZXN0IGV0dCA9IChFbGFwc2VkVGltZVRlc3Qpb2JqZWN0OworCQlyZXR1cm4gIkFmdGVyICIgKyAgZXR0LmdldE51bWJlcm9mRGF5cygpICsgIiBkYXlzIjsKKwl9IC8vIGdldFRleHQKKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJLy9AT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlFbGFwc2VkVGltZVRlc3QgZWxhcHNlZFRpbWVUZXN0ID0gKEVsYXBzZWRUaW1lVGVzdClvYmplY3Q7CisJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9FbGFwc2VkVGltZVRlc3RfdHlwZSIpICsgIiAiICsgZWxhcHNlZFRpbWVUZXN0LmlzUmVmZXJlbmNlVGltZVZhbGlkKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFbGFwc2VkVGltZVRlc3QuY2xhc3MpKSB7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuRUxBUFNFRF9USU1FX1RFU1RfX05VTUJFUk9GX0RBWVM6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30gLy8gRWxhcHNlZFRpbWVUZXN0SXRlbVByb3ZpZGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvRmFsc2VJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcm92aWRlci9GYWxzZUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZWJhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvRmFsc2VJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5GYWxzZX0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRmFsc2VJdGVtUHJvdmlkZXIKKwlleHRlbmRzIFRlc3RJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEZhbHNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIEZhbHNlLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0ZhbHNlIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuICJGYWxzZSI7CisJfQorCQorCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJLy9AT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfRmFsc2VfdHlwZSIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbkl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL0lkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb25JdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWY0MTg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL0lkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb25JdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI5NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLklkZW50aWZpYWJsZUl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLklkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbkl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgSWRlbnRpZmlhYmxlUHJlZGljYXRlSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOworCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFKTsKKwkJfQorCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKKwkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgorCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCisKKwkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgUHJlZGljYXRlLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9jdXN0b21vYmoxNi9QcmVkaWNhdGUiKSk7CisJfQorCQorCS8qKgorCSAqIFRoaXMgcmV0dXJucyBJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlR2VuKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0lkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24iKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBJZGVudGlmaWFibGVJdGVtUHJvdmlkZXIjZ2V0VGV4dChPYmplY3QpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gKChJZGVudGlmaWFibGUpb2JqZWN0KS5nZXRVUkkoKS5sYXN0U2VnbWVudCgpOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9JZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uLmNsYXNzKSkgeworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLklERU5USUZJQUJMRV9QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBbmQoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGYWxzZSgpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU5vdCgpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9yKCkpKTsKKworLy8JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisvLwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorLy8JCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURSwKKy8vCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmVkaWNhdGVSZWZlcmVuY2UoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUcnVlKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURSwKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJlZGljYXRlRXhwcmVzc2lvbigpKSk7CisKKy8vCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorLy8JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKy8vCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUsCisvLwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbigpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFic29sdXRlVGltZVRlc3QoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbGFwc2VkVGltZVRlc3QoKSkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCS8vQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnNHZW4oQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURSwKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQW5kKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURSwKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmFsc2UoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVOb3QoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPcigpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByZWRpY2F0ZVJlZmVyZW5jZSgpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRydWUoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURSwKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbigpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFic29sdXRlVGltZVRlc3QoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbGFwc2VkVGltZVRlc3QoKSkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL0lkZW50aWZpYWJsZVByZWRpY2F0ZUl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL0lkZW50aWZpYWJsZVByZWRpY2F0ZUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhODUwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvSWRlbnRpZmlhYmxlUHJlZGljYXRlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuSWRlbnRpZmlhYmxlSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuSWRlbnRpZmlhYmxlUHJlZGljYXRlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5JZGVudGlmaWFibGVQcmVkaWNhdGV9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIElkZW50aWZpYWJsZVByZWRpY2F0ZUl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgSWRlbnRpZmlhYmxlSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGVQcmVkaWNhdGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChJZGVudGlmaWFibGVQcmVkaWNhdGUpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9JZGVudGlmaWFibGVQcmVkaWNhdGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfSWRlbnRpZmlhYmxlUHJlZGljYXRlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIENvcmVFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL0lkZW50aWZpYWJsZVRlc3RJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcm92aWRlci9JZGVudGlmaWFibGVUZXN0SXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc5OGYyMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcm92aWRlci9JZGVudGlmaWFibGVUZXN0SXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5JZGVudGlmaWFibGVUZXN0OworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5JZGVudGlmaWFibGVUZXN0fSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBJZGVudGlmaWFibGVUZXN0SXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBJZGVudGlmaWFibGVQcmVkaWNhdGVJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElkZW50aWZpYWJsZVRlc3RJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChJZGVudGlmaWFibGVUZXN0KW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfSWRlbnRpZmlhYmxlVGVzdF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9JZGVudGlmaWFibGVUZXN0X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcm92aWRlci9OYXJ5Qm9vbGVhbk9wZXJhdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvTmFyeUJvb2xlYW5PcGVyYXRvckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZTY1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvTmFyeUJvb2xlYW5PcGVyYXRvckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjU2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuTmFyeUJvb2xlYW5PcGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5OYXJ5Qm9vbGVhbk9wZXJhdG9yfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBOYXJ5Qm9vbGVhbk9wZXJhdG9ySXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBCb29sZWFuT3BlcmF0b3JJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5hcnlCb29sZWFuT3BlcmF0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7CisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLk5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORFMpOworCQl9CisJCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgeworCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCisJCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KKworCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIGdldFN0cmluZygiX1VJX05hcnlCb29sZWFuT3BlcmF0b3JfdHlwZSIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTmFyeUJvb2xlYW5PcGVyYXRvci5jbGFzcykpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5OQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkRTOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5OQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkRTLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBbmQoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5OQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkRTLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGYWxzZSgpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLk5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORFMsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU5vdCgpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLk5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORFMsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9yKCkpKTsKKworLy8JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisvLwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorLy8JCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuTkFSWV9CT09MRUFOX09QRVJBVE9SX19PUEVSQU5EUywKKy8vCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmVkaWNhdGVSZWZlcmVuY2UoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5OQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkRTLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUcnVlKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuTkFSWV9CT09MRUFOX09QRVJBVE9SX19PUEVSQU5EUywKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJlZGljYXRlRXhwcmVzc2lvbigpKSk7CisKKy8vCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorLy8JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKy8vCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLk5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORFMsCisvLwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbigpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLk5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORFMsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFic29sdXRlVGltZVRlc3QoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5OQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkRTLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbGFwc2VkVGltZVRlc3QoKSkpOworCX0gLy8gY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMKKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCS8vQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnNHZW4oQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuTkFSWV9CT09MRUFOX09QRVJBVE9SX19PUEVSQU5EUywKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQW5kKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuTkFSWV9CT09MRUFOX09QRVJBVE9SX19PUEVSQU5EUywKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmFsc2UoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5OQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkRTLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVOb3QoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5OQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkRTLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPcigpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLk5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORFMsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByZWRpY2F0ZVJlZmVyZW5jZSgpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLk5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORFMsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRydWUoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5OQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkRTLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuTkFSWV9CT09MRUFOX09QRVJBVE9SX19PUEVSQU5EUywKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbigpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLk5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORFMsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFic29sdXRlVGltZVRlc3QoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5OQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkRTLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbGFwc2VkVGltZVRlc3QoKSkpOworCX0KKworCQorfSAvLyBOYXJ5Qm9vbGVhbk9wZXJhdG9ySXRlbVByb3ZpZGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvTm90SXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvTm90SXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NmOTI4ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcm92aWRlci9Ob3RJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuTm90fSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBOb3RJdGVtUHJvdmlkZXIKKwlleHRlbmRzIFVuYXJ5Qm9vbGVhbk9wZXJhdG9ySXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgTm90LmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L05vdCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiAiISI7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwkvL0BPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9Ob3RfdHlwZSIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL09ySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvT3JJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGVhN2IzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL09ySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLk9yfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBPckl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgTmFyeUJvb2xlYW5PcGVyYXRvckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgT3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgT3IuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvT3IiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9Pcl90eXBlIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCS8vQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIGdldFN0cmluZygiX1VJX09yX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCQorCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL1ByZWRpY2F0ZUV4cHJlc3Npb25JdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcm92aWRlci9QcmVkaWNhdGVFeHByZXNzaW9uSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNlODEyYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcm92aWRlci9QcmVkaWNhdGVFeHByZXNzaW9uSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyODggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVFeHByZXNzaW9ufSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVkaWNhdGVFeHByZXNzaW9uSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBCb29sZWFuRXhwcmVzc2lvbkl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUHJlZGljYXRlRXhwcmVzc2lvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURSk7CisJCX0KKwkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7CisJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKKwkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgorCisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFByZWRpY2F0ZUV4cHJlc3Npb24uZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbW9iajE2L1ByZWRpY2F0ZSIpKTsKKwl9CisJCisJLyoqCisJICogVGhpcyByZXR1cm5zIFByZWRpY2F0ZUV4cHJlc3Npb24uZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2VHZW4oT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUHJlZGljYXRlRXhwcmVzc2lvbiIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiAiKCkiOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCS8vQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIGdldFN0cmluZygiX1VJX1ByZWRpY2F0ZUV4cHJlc3Npb25fdHlwZSIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJlZGljYXRlRXhwcmVzc2lvbi5jbGFzcykpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBbmQoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGYWxzZSgpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU5vdCgpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9yKCkpKTsKKworLy8JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisvLwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorLy8JCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURSwKKy8vCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmVkaWNhdGVSZWZlcmVuY2UoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUcnVlKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURSwKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJlZGljYXRlRXhwcmVzc2lvbigpKSk7CisKKy8vCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorLy8JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKy8vCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUsCisvLwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbigpKSk7CisJCQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUsCisJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWJzb2x1dGVUaW1lVGVzdCgpKSk7CisKKwluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUsCisJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRWxhcHNlZFRpbWVUZXN0KCkpKTsKKwkJCisJfSAvLyBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycworCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJLy9AT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9yc0dlbihDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBbmQoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGYWxzZSgpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU5vdCgpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9yKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURSwKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJlZGljYXRlUmVmZXJlbmNlKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURSwKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHJ1ZSgpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByZWRpY2F0ZUV4cHJlc3Npb24oKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5QUkVESUNBVEVfRVhQUkVTU0lPTl9fUFJFRElDQVRFLAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuUFJFRElDQVRFX0VYUFJFU1NJT05fX1BSRURJQ0FURSwKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWJzb2x1dGVUaW1lVGVzdCgpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlBSRURJQ0FURV9FWFBSRVNTSU9OX19QUkVESUNBVEUsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVsYXBzZWRUaW1lVGVzdCgpKSk7CisJfQorCQorfSAvLyBQcmVkaWNhdGVFeHByZXNzaW9uSXRlbVByb3ZpZGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvUHJlZGljYXRlSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvUHJlZGljYXRlSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyZTJjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcm92aWRlci9QcmVkaWNhdGVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZX0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUHJlZGljYXRlSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcmVkaWNhdGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgUHJlZGljYXRlLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9jdXN0b21vYmoxNi9QcmVkaWNhdGUiKSk7CisJfQorCQorCS8qKgorCSAqIFRoaXMgcmV0dXJucyBQcmVkaWNhdGUuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2VHZW4oT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUHJlZGljYXRlIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfUHJlZGljYXRlX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2lzV3JhcHBpbmdOZWVkZWQoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJCit9IC8vIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL1ByZWRpY2F0ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvUHJlZGljYXRlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGE1YjlmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL1ByZWRpY2F0ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0MjUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUudXRpbC5QcmVkaWNhdGVBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuCisgKiBUaGUgYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4KKyAqIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCisgKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVkaWNhdGVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFByZWRpY2F0ZUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieSB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248T2JqZWN0PiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcmVkaWNhdGVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5BbmR9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQW5kSXRlbVByb3ZpZGVyIGFuZEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLkFuZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQW5kQWRhcHRlcigpIHsKKwkJaWYgKGFuZEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlhbmRJdGVtUHJvdmlkZXIgPSBuZXcgQW5kSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGFuZEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuRmFsc2V9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRmFsc2VJdGVtUHJvdmlkZXIgZmFsc2VJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5GYWxzZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRmFsc2VBZGFwdGVyKCkgeworCQlpZiAoZmFsc2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJZmFsc2VJdGVtUHJvdmlkZXIgPSBuZXcgRmFsc2VJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gZmFsc2VJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLk5vdH0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBOb3RJdGVtUHJvdmlkZXIgbm90SXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuTm90fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVOb3RBZGFwdGVyKCkgeworCQlpZiAobm90SXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCW5vdEl0ZW1Qcm92aWRlciA9IG5ldyBOb3RJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gbm90SXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5Pcn0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBPckl0ZW1Qcm92aWRlciBvckl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLk9yfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVPckFkYXB0ZXIoKSB7CisJCWlmIChvckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlvckl0ZW1Qcm92aWRlciA9IG5ldyBPckl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBvckl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlUmVmZXJlbmNlfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFByZWRpY2F0ZVJlZmVyZW5jZUl0ZW1Qcm92aWRlciBwcmVkaWNhdGVSZWZlcmVuY2VJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVSZWZlcmVuY2V9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByZWRpY2F0ZVJlZmVyZW5jZUFkYXB0ZXIoKSB7CisJCWlmIChwcmVkaWNhdGVSZWZlcmVuY2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJcHJlZGljYXRlUmVmZXJlbmNlSXRlbVByb3ZpZGVyID0gbmV3IFByZWRpY2F0ZVJlZmVyZW5jZUl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBwcmVkaWNhdGVSZWZlcmVuY2VJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlRydWV9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJ1ZUl0ZW1Qcm92aWRlciB0cnVlSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuVHJ1ZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVHJ1ZUFkYXB0ZXIoKSB7CisJCWlmICh0cnVlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXRydWVJdGVtUHJvdmlkZXIgPSBuZXcgVHJ1ZUl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiB0cnVlSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVFeHByZXNzaW9ufSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFByZWRpY2F0ZUV4cHJlc3Npb25JdGVtUHJvdmlkZXIgcHJlZGljYXRlRXhwcmVzc2lvbkl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZUV4cHJlc3Npb259LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByZWRpY2F0ZUV4cHJlc3Npb25BZGFwdGVyKCkgeworCQlpZiAocHJlZGljYXRlRXhwcmVzc2lvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlwcmVkaWNhdGVFeHByZXNzaW9uSXRlbVByb3ZpZGVyID0gbmV3IFByZWRpY2F0ZUV4cHJlc3Npb25JdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gcHJlZGljYXRlRXhwcmVzc2lvbkl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbn0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uSXRlbVByb3ZpZGVyIGlkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb25JdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5JZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uQWRhcHRlcigpIHsKKwkJaWYgKGlkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJaWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbkl0ZW1Qcm92aWRlciA9IG5ldyBJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGlkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb25JdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLkFic29sdXRlVGltZVRlc3R9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWJzb2x1dGVUaW1lVGVzdEl0ZW1Qcm92aWRlciBhYnNvbHV0ZVRpbWVUZXN0SXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuQWJzb2x1dGVUaW1lVGVzdH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWJzb2x1dGVUaW1lVGVzdEFkYXB0ZXIoKSB7CisJCWlmIChhYnNvbHV0ZVRpbWVUZXN0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCWFic29sdXRlVGltZVRlc3RJdGVtUHJvdmlkZXIgPSBuZXcgQWJzb2x1dGVUaW1lVGVzdEl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBhYnNvbHV0ZVRpbWVUZXN0SXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5FbGFwc2VkVGltZVRlc3R9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRWxhcHNlZFRpbWVUZXN0SXRlbVByb3ZpZGVyIGVsYXBzZWRUaW1lVGVzdEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLkVsYXBzZWRUaW1lVGVzdH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRWxhcHNlZFRpbWVUZXN0QWRhcHRlcigpIHsKKwkJaWYgKGVsYXBzZWRUaW1lVGVzdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQllbGFwc2VkVGltZVRlc3RJdGVtUHJvdmlkZXIgPSBuZXcgRWxhcHNlZFRpbWVUZXN0SXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGVsYXBzZWRUaW1lVGVzdEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgeworCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7CisJCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7CisJCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7CisJCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3M8Pz4pIHx8ICgoKENsYXNzPD8+KXR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7CisJCQkJcmV0dXJuIGFkYXB0ZXI7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn0gYW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKworCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgeworCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJaWYgKGFuZEl0ZW1Qcm92aWRlciAhPSBudWxsKSBhbmRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoZmFsc2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkgZmFsc2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAobm90SXRlbVByb3ZpZGVyICE9IG51bGwpIG5vdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChvckl0ZW1Qcm92aWRlciAhPSBudWxsKSBvckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChwcmVkaWNhdGVSZWZlcmVuY2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkgcHJlZGljYXRlUmVmZXJlbmNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKHRydWVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgdHJ1ZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChwcmVkaWNhdGVFeHByZXNzaW9uSXRlbVByb3ZpZGVyICE9IG51bGwpIHByZWRpY2F0ZUV4cHJlc3Npb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoaWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbkl0ZW1Qcm92aWRlciAhPSBudWxsKSBpZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKGFic29sdXRlVGltZVRlc3RJdGVtUHJvdmlkZXIgIT0gbnVsbCkgYWJzb2x1dGVUaW1lVGVzdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChlbGFwc2VkVGltZVRlc3RJdGVtUHJvdmlkZXIgIT0gbnVsbCkgZWxhcHNlZFRpbWVUZXN0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcm92aWRlci9QcmVkaWNhdGVSZWZlcmVuY2VJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcm92aWRlci9QcmVkaWNhdGVSZWZlcmVuY2VJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjg1YjU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL1ByZWRpY2F0ZVJlZmVyZW5jZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZVJlZmVyZW5jZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlUmVmZXJlbmNlfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVkaWNhdGVSZWZlcmVuY2VJdGVtUHJvdmlkZXIKKwlleHRlbmRzIFByZWRpY2F0ZUl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUHJlZGljYXRlUmVmZXJlbmNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOworCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5QUkVESUNBVEVfUkVGRVJFTkNFX19QUkVESUNBVEUpOworCQl9CisJCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgeworCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCisJCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KKworCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBQcmVkaWNhdGVSZWZlcmVuY2UuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUHJlZGljYXRlUmVmZXJlbmNlIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfUHJlZGljYXRlUmVmZXJlbmNlX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByZWRpY2F0ZVJlZmVyZW5jZS5jbGFzcykpIHsKKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5QUkVESUNBVEVfUkVGRVJFTkNFX19QUkVESUNBVEU6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcm92aWRlci9UZXN0SXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvVGVzdEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMjdhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvVGVzdEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlRlc3R9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRlc3RJdGVtUHJvdmlkZXIKKwlleHRlbmRzIFByZWRpY2F0ZUl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGVzdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBUZXN0LmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1Rlc3QiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9UZXN0X3R5cGUiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL1RpbWVUZXN0SXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvVGltZVRlc3RJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjBmY2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL1RpbWVUZXN0SXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5UaW1lVGVzdH0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVGltZVRlc3RJdGVtUHJvdmlkZXIKKwlleHRlbmRzIFRlc3RJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRpbWVUZXN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfVGltZVRlc3RfdHlwZSIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvVHJ1ZUl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL1RydWVJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTVhMDM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Byb3ZpZGVyL1RydWVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuVHJ1ZX0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVHJ1ZUl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgVGVzdEl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVHJ1ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBUcnVlLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1RydWUiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gIlRydWUiOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCS8vQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIGdldFN0cmluZygiX1VJX1RydWVfdHlwZSIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvVW5hcnlCb29sZWFuT3BlcmF0b3JJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcm92aWRlci9VbmFyeUJvb2xlYW5PcGVyYXRvckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmN2RiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJvdmlkZXIvVW5hcnlCb29sZWFuT3BlcmF0b3JJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI1NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuVW5hcnlCb29sZWFuT3BlcmF0b3I7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlVuYXJ5Qm9vbGVhbk9wZXJhdG9yfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBVbmFyeUJvb2xlYW5PcGVyYXRvckl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgQm9vbGVhbk9wZXJhdG9ySXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVbmFyeUJvb2xlYW5PcGVyYXRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuVU5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORCk7CisJCX0KKwkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7CisJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKKwkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgorCisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfVW5hcnlCb29sZWFuT3BlcmF0b3JfdHlwZSIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVW5hcnlCb29sZWFuT3BlcmF0b3IuY2xhc3MpKSB7CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuVU5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORDoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuVU5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORCwKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQW5kKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuVU5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORCwKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmFsc2UoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5VTkFSWV9CT09MRUFOX09QRVJBVE9SX19PUEVSQU5ELAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVOb3QoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5VTkFSWV9CT09MRUFOX09QRVJBVE9SX19PUEVSQU5ELAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPcigpKSk7CisKKy8vCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorLy8JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKy8vCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlVOQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkQsCisvLwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJlZGljYXRlUmVmZXJlbmNlKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuVU5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORCwKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHJ1ZSgpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlVOQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkQsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByZWRpY2F0ZUV4cHJlc3Npb24oKSkpOworCisvLwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKy8vCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisvLwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5VTkFSWV9CT09MRUFOX09QRVJBVE9SX19PUEVSQU5ELAorLy8JCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24oKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5VTkFSWV9CT09MRUFOX09QRVJBVE9SX19PUEVSQU5ELAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBYnNvbHV0ZVRpbWVUZXN0KCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuVU5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORCwKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRWxhcHNlZFRpbWVUZXN0KCkpKTsKKwl9IC8vIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzCisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwkvL0BPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzR2VuKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlVOQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkQsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFuZCgpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlVOQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkQsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZhbHNlKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuVU5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORCwKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTm90KCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuVU5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORCwKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3IoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5VTkFSWV9CT09MRUFOX09QRVJBVE9SX19PUEVSQU5ELAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmVkaWNhdGVSZWZlcmVuY2UoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5VTkFSWV9CT09MRUFOX09QRVJBVE9SX19PUEVSQU5ELAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUcnVlKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuVU5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORCwKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJlZGljYXRlRXhwcmVzc2lvbigpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShQcmVkaWNhdGVQYWNrYWdlLkxpdGVyYWxzLlVOQVJZX0JPT0xFQU5fT1BFUkFUT1JfX09QRVJBTkQsCisJCQkJIFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24oKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoUHJlZGljYXRlUGFja2FnZS5MaXRlcmFscy5VTkFSWV9CT09MRUFOX09QRVJBVE9SX19PUEVSQU5ELAorCQkJCSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBYnNvbHV0ZVRpbWVUZXN0KCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFByZWRpY2F0ZVBhY2thZ2UuTGl0ZXJhbHMuVU5BUllfQk9PTEVBTl9PUEVSQVRPUl9fT1BFUkFORCwKKwkJCQkgUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRWxhcHNlZFRpbWVUZXN0KCkpKTsKKwl9CisKK30gLy8gVW5hcnlCb29sZWFuT3BlcmF0b3JJdGVtUHJvdmlkZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS91dGlsL1ByZWRpY2F0ZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdXRpbC9QcmVkaWNhdGVBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YmFhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdXRpbC9QcmVkaWNhdGVBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDkxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS4qOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVkaWNhdGVBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgUHJlZGljYXRlUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByZWRpY2F0ZUFkYXB0ZXJGYWN0b3J5KCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IFByZWRpY2F0ZVBhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgeworCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKKwkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQcmVkaWNhdGVTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgUHJlZGljYXRlU3dpdGNoPEFkYXB0ZXI+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQW5kKEFuZCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQW5kQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQm9vbGVhbkV4cHJlc3Npb24oQm9vbGVhbkV4cHJlc3Npb24gb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUJvb2xlYW5FeHByZXNzaW9uQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQm9vbGVhbk9wZXJhdG9yKEJvb2xlYW5PcGVyYXRvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQm9vbGVhbk9wZXJhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRmFsc2UoRmFsc2Ugb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUZhbHNlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTmFyeUJvb2xlYW5PcGVyYXRvcihOYXJ5Qm9vbGVhbk9wZXJhdG9yIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVOYXJ5Qm9vbGVhbk9wZXJhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTm90KE5vdCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTm90QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlT3IoT3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZU9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJlZGljYXRlKFByZWRpY2F0ZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUHJlZGljYXRlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJlZGljYXRlUmVmZXJlbmNlKFByZWRpY2F0ZVJlZmVyZW5jZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUHJlZGljYXRlUmVmZXJlbmNlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGVzdChUZXN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVUZXN0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVHJ1ZShUcnVlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVUcnVlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVW5hcnlCb29sZWFuT3BlcmF0b3IoVW5hcnlCb29sZWFuT3BlcmF0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVVuYXJ5Qm9vbGVhbk9wZXJhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJlZGljYXRlRXhwcmVzc2lvbihQcmVkaWNhdGVFeHByZXNzaW9uIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVQcmVkaWNhdGVFeHByZXNzaW9uQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlUHJlZGljYXRlKElkZW50aWZpYWJsZVByZWRpY2F0ZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlSWRlbnRpZmlhYmxlUHJlZGljYXRlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbihJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlVGVzdChJZGVudGlmaWFibGVUZXN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVJZGVudGlmaWFibGVUZXN0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGltZVRlc3QoVGltZVRlc3Qgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRpbWVUZXN0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQWJzb2x1dGVUaW1lVGVzdChBYnNvbHV0ZVRpbWVUZXN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVBYnNvbHV0ZVRpbWVUZXN0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRWxhcHNlZFRpbWVUZXN0KEVsYXBzZWRUaW1lVGVzdCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRWxhcHNlZFRpbWVUZXN0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgPFQ+IEFkYXB0ZXIgY2FzZUNvbXBhcmFibGUoQ29tcGFyYWJsZTxUPiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ29tcGFyYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCisJICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7CisJCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOworCX0KKworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLkFuZCA8ZW0+QW5kPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuQW5kCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFuZEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5Cb29sZWFuRXhwcmVzc2lvbiA8ZW0+Qm9vbGVhbiBFeHByZXNzaW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuQm9vbGVhbkV4cHJlc3Npb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQm9vbGVhbkV4cHJlc3Npb25BZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuQm9vbGVhbk9wZXJhdG9yIDxlbT5Cb29sZWFuIE9wZXJhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuQm9vbGVhbk9wZXJhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJvb2xlYW5PcGVyYXRvckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5GYWxzZSA8ZW0+RmFsc2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5GYWxzZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVGYWxzZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5OYXJ5Qm9vbGVhbk9wZXJhdG9yIDxlbT5OYXJ5IEJvb2xlYW4gT3BlcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5OYXJ5Qm9vbGVhbk9wZXJhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5hcnlCb29sZWFuT3BlcmF0b3JBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuTm90IDxlbT5Ob3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5Ob3QKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTm90QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLk9yIDxlbT5PcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLk9yCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZSA8ZW0+UHJlZGljYXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByZWRpY2F0ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVSZWZlcmVuY2UgPGVtPlJlZmVyZW5jZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZVJlZmVyZW5jZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcmVkaWNhdGVSZWZlcmVuY2VBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuVGVzdCA8ZW0+VGVzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlRlc3QKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVzdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5UcnVlIDxlbT5UcnVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuVHJ1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUcnVlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlVuYXJ5Qm9vbGVhbk9wZXJhdG9yIDxlbT5VbmFyeSBCb29sZWFuIE9wZXJhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuVW5hcnlCb29sZWFuT3BlcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVW5hcnlCb29sZWFuT3BlcmF0b3JBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlRXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZUV4cHJlc3Npb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJlZGljYXRlRXhwcmVzc2lvbkFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5JZGVudGlmaWFibGVQcmVkaWNhdGUgPGVtPklkZW50aWZpYWJsZSBQcmVkaWNhdGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5JZGVudGlmaWFibGVQcmVkaWNhdGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpZmlhYmxlUHJlZGljYXRlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLklkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24gPGVtPklkZW50aWZpYWJsZSBQcmVkaWNhdGUgRXhwcmVzc2lvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLklkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbkFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5JZGVudGlmaWFibGVUZXN0IDxlbT5JZGVudGlmaWFibGUgVGVzdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLklkZW50aWZpYWJsZVRlc3QKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpZmlhYmxlVGVzdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5UaW1lVGVzdCA8ZW0+VGltZSBUZXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuVGltZVRlc3QKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVGltZVRlc3RBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuQWJzb2x1dGVUaW1lVGVzdCA8ZW0+QWJzb2x1dGUgVGltZSBUZXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuQWJzb2x1dGVUaW1lVGVzdAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBYnNvbHV0ZVRpbWVUZXN0QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLkVsYXBzZWRUaW1lVGVzdCA8ZW0+RWxhcHNlZCBUaW1lIFRlc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5FbGFwc2VkVGltZVRlc3QKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRWxhcHNlZFRpbWVUZXN0QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLmxhbmcuQ29tcGFyYWJsZSA8ZW0+Q29tcGFyYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9QcmVkaWNhdGVBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3V0aWwvUHJlZGljYXRlU3dpdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdXRpbC9QcmVkaWNhdGVTd2l0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzFkMmI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3V0aWwvUHJlZGljYXRlU3dpdGNoLmphdmEKQEAgLTAsMCArMSw1OTUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS51dGlsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuKjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KKyAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KKyAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKKyAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0CisgKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5CisgKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKKyAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZVBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFByZWRpY2F0ZVN3aXRjaDxUMT4geworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgUHJlZGljYXRlUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByZWRpY2F0ZVN3aXRjaCgpIHsKKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7CisJCQltb2RlbFBhY2thZ2UgPSBQcmVkaWNhdGVQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7CisJCX0KKwkJZWxzZSB7CisJCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKKwkJCXJldHVybgorCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/CisJCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKKwkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQxIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgeworCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLkFORDogeworCQkJCUFuZCBhbmQgPSAoQW5kKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUFuZChhbmQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hcnlCb29sZWFuT3BlcmF0b3IoYW5kKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCb29sZWFuT3BlcmF0b3IoYW5kKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCb29sZWFuRXhwcmVzc2lvbihhbmQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByZWRpY2F0ZShhbmQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5CT09MRUFOX0VYUFJFU1NJT046IHsKKwkJCQlCb29sZWFuRXhwcmVzc2lvbiBib29sZWFuRXhwcmVzc2lvbiA9IChCb29sZWFuRXhwcmVzc2lvbil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VCb29sZWFuRXhwcmVzc2lvbihib29sZWFuRXhwcmVzc2lvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJlZGljYXRlKGJvb2xlYW5FeHByZXNzaW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuQk9PTEVBTl9PUEVSQVRPUjogeworCQkJCUJvb2xlYW5PcGVyYXRvciBib29sZWFuT3BlcmF0b3IgPSAoQm9vbGVhbk9wZXJhdG9yKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUJvb2xlYW5PcGVyYXRvcihib29sZWFuT3BlcmF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJvb2xlYW5FeHByZXNzaW9uKGJvb2xlYW5PcGVyYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJlZGljYXRlKGJvb2xlYW5PcGVyYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLkZBTFNFOiB7CisJCQkJRmFsc2UgZmFsc2VfID0gKEZhbHNlKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUZhbHNlKGZhbHNlXyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlVGVzdChmYWxzZV8pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByZWRpY2F0ZShmYWxzZV8pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5OQVJZX0JPT0xFQU5fT1BFUkFUT1I6IHsKKwkJCQlOYXJ5Qm9vbGVhbk9wZXJhdG9yIG5hcnlCb29sZWFuT3BlcmF0b3IgPSAoTmFyeUJvb2xlYW5PcGVyYXRvcil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VOYXJ5Qm9vbGVhbk9wZXJhdG9yKG5hcnlCb29sZWFuT3BlcmF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJvb2xlYW5PcGVyYXRvcihuYXJ5Qm9vbGVhbk9wZXJhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCb29sZWFuRXhwcmVzc2lvbihuYXJ5Qm9vbGVhbk9wZXJhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcmVkaWNhdGUobmFyeUJvb2xlYW5PcGVyYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLk5PVDogeworCQkJCU5vdCBub3QgPSAoTm90KXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZU5vdChub3QpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVVuYXJ5Qm9vbGVhbk9wZXJhdG9yKG5vdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQm9vbGVhbk9wZXJhdG9yKG5vdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQm9vbGVhbkV4cHJlc3Npb24obm90KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcmVkaWNhdGUobm90KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuT1I6IHsKKwkJCQlPciBvciA9IChPcil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VPcihvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFyeUJvb2xlYW5PcGVyYXRvcihvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQm9vbGVhbk9wZXJhdG9yKG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCb29sZWFuRXhwcmVzc2lvbihvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJlZGljYXRlKG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuUFJFRElDQVRFOiB7CisJCQkJUHJlZGljYXRlIHByZWRpY2F0ZSA9IChQcmVkaWNhdGUpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlUHJlZGljYXRlKHByZWRpY2F0ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLlBSRURJQ0FURV9SRUZFUkVOQ0U6IHsKKwkJCQlQcmVkaWNhdGVSZWZlcmVuY2UgcHJlZGljYXRlUmVmZXJlbmNlID0gKFByZWRpY2F0ZVJlZmVyZW5jZSl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VQcmVkaWNhdGVSZWZlcmVuY2UocHJlZGljYXRlUmVmZXJlbmNlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcmVkaWNhdGUocHJlZGljYXRlUmVmZXJlbmNlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuVEVTVDogeworCQkJCVRlc3QgdGVzdCA9IChUZXN0KXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVRlc3QodGVzdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJlZGljYXRlKHRlc3QpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5UUlVFOiB7CisJCQkJVHJ1ZSB0cnVlXyA9IChUcnVlKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVRydWUodHJ1ZV8pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVRlc3QodHJ1ZV8pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByZWRpY2F0ZSh0cnVlXyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLlVOQVJZX0JPT0xFQU5fT1BFUkFUT1I6IHsKKwkJCQlVbmFyeUJvb2xlYW5PcGVyYXRvciB1bmFyeUJvb2xlYW5PcGVyYXRvciA9IChVbmFyeUJvb2xlYW5PcGVyYXRvcil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VVbmFyeUJvb2xlYW5PcGVyYXRvcih1bmFyeUJvb2xlYW5PcGVyYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQm9vbGVhbk9wZXJhdG9yKHVuYXJ5Qm9vbGVhbk9wZXJhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCb29sZWFuRXhwcmVzc2lvbih1bmFyeUJvb2xlYW5PcGVyYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJlZGljYXRlKHVuYXJ5Qm9vbGVhbk9wZXJhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuUFJFRElDQVRFX0VYUFJFU1NJT046IHsKKwkJCQlQcmVkaWNhdGVFeHByZXNzaW9uIHByZWRpY2F0ZUV4cHJlc3Npb24gPSAoUHJlZGljYXRlRXhwcmVzc2lvbil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VQcmVkaWNhdGVFeHByZXNzaW9uKHByZWRpY2F0ZUV4cHJlc3Npb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJvb2xlYW5FeHByZXNzaW9uKHByZWRpY2F0ZUV4cHJlc3Npb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByZWRpY2F0ZShwcmVkaWNhdGVFeHByZXNzaW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuSURFTlRJRklBQkxFX1BSRURJQ0FURTogeworCQkJCUlkZW50aWZpYWJsZVByZWRpY2F0ZSBpZGVudGlmaWFibGVQcmVkaWNhdGUgPSAoSWRlbnRpZmlhYmxlUHJlZGljYXRlKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZVByZWRpY2F0ZShpZGVudGlmaWFibGVQcmVkaWNhdGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShpZGVudGlmaWFibGVQcmVkaWNhdGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByZWRpY2F0ZShpZGVudGlmaWFibGVQcmVkaWNhdGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUoaWRlbnRpZmlhYmxlUHJlZGljYXRlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFByZWRpY2F0ZVBhY2thZ2UuSURFTlRJRklBQkxFX1BSRURJQ0FURV9FWFBSRVNTSU9OOiB7CisJCQkJSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbiBpZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uID0gKElkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24pdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbihpZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGVQcmVkaWNhdGUoaWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJlZGljYXRlRXhwcmVzc2lvbihpZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoaWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQm9vbGVhbkV4cHJlc3Npb24oaWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShpZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcmVkaWNhdGUoaWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLklERU5USUZJQUJMRV9URVNUOiB7CisJCQkJSWRlbnRpZmlhYmxlVGVzdCBpZGVudGlmaWFibGVUZXN0ID0gKElkZW50aWZpYWJsZVRlc3QpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlVGVzdChpZGVudGlmaWFibGVUZXN0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGVQcmVkaWNhdGUoaWRlbnRpZmlhYmxlVGVzdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlVGVzdChpZGVudGlmaWFibGVUZXN0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoaWRlbnRpZmlhYmxlVGVzdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJlZGljYXRlKGlkZW50aWZpYWJsZVRlc3QpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUoaWRlbnRpZmlhYmxlVGVzdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBQcmVkaWNhdGVQYWNrYWdlLlRJTUVfVEVTVDogeworCQkJCVRpbWVUZXN0IHRpbWVUZXN0ID0gKFRpbWVUZXN0KXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVRpbWVUZXN0KHRpbWVUZXN0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VUZXN0KHRpbWVUZXN0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcmVkaWNhdGUodGltZVRlc3QpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5BQlNPTFVURV9USU1FX1RFU1Q6IHsKKwkJCQlBYnNvbHV0ZVRpbWVUZXN0IGFic29sdXRlVGltZVRlc3QgPSAoQWJzb2x1dGVUaW1lVGVzdCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VBYnNvbHV0ZVRpbWVUZXN0KGFic29sdXRlVGltZVRlc3QpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVRpbWVUZXN0KGFic29sdXRlVGltZVRlc3QpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVRlc3QoYWJzb2x1dGVUaW1lVGVzdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJlZGljYXRlKGFic29sdXRlVGltZVRlc3QpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUHJlZGljYXRlUGFja2FnZS5FTEFQU0VEX1RJTUVfVEVTVDogeworCQkJCUVsYXBzZWRUaW1lVGVzdCBlbGFwc2VkVGltZVRlc3QgPSAoRWxhcHNlZFRpbWVUZXN0KXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUVsYXBzZWRUaW1lVGVzdChlbGFwc2VkVGltZVRlc3QpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVRpbWVUZXN0KGVsYXBzZWRUaW1lVGVzdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlVGVzdChlbGFwc2VkVGltZVRlc3QpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByZWRpY2F0ZShlbGFwc2VkVGltZVRlc3QpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFuZDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFuZDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VBbmQoQW5kIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Cb29sZWFuIEV4cHJlc3Npb248L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Cb29sZWFuIEV4cHJlc3Npb248L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlQm9vbGVhbkV4cHJlc3Npb24oQm9vbGVhbkV4cHJlc3Npb24gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJvb2xlYW4gT3BlcmF0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Cb29sZWFuIE9wZXJhdG9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUJvb2xlYW5PcGVyYXRvcihCb29sZWFuT3BlcmF0b3Igb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZhbHNlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmFsc2U8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRmFsc2UoRmFsc2Ugb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hcnkgQm9vbGVhbiBPcGVyYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hcnkgQm9vbGVhbiBPcGVyYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VOYXJ5Qm9vbGVhbk9wZXJhdG9yKE5hcnlCb29sZWFuT3BlcmF0b3Igb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vdDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VOb3QoTm90IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZU9yKE9yIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmVkaWNhdGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmVkaWNhdGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlUHJlZGljYXRlKFByZWRpY2F0ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVmZXJlbmNlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVmZXJlbmNlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVByZWRpY2F0ZVJlZmVyZW5jZShQcmVkaWNhdGVSZWZlcmVuY2Ugb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlc3Q8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVRlc3QoVGVzdCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VHJ1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRydWU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlVHJ1ZShUcnVlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5VbmFyeSBCb29sZWFuIE9wZXJhdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VW5hcnkgQm9vbGVhbiBPcGVyYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VVbmFyeUJvb2xlYW5PcGVyYXRvcihVbmFyeUJvb2xlYW5PcGVyYXRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhwcmVzc2lvbjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4cHJlc3Npb248L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlUHJlZGljYXRlRXhwcmVzc2lvbihQcmVkaWNhdGVFeHByZXNzaW9uIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGUgUHJlZGljYXRlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlIFByZWRpY2F0ZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VJZGVudGlmaWFibGVQcmVkaWNhdGUoSWRlbnRpZmlhYmxlUHJlZGljYXRlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGUgUHJlZGljYXRlIEV4cHJlc3Npb248L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGUgUHJlZGljYXRlIEV4cHJlc3Npb248L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbihJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGUgVGVzdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZSBUZXN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUlkZW50aWZpYWJsZVRlc3QoSWRlbnRpZmlhYmxlVGVzdCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGltZSBUZXN0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGltZSBUZXN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVRpbWVUZXN0KFRpbWVUZXN0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnNvbHV0ZSBUaW1lIFRlc3Q8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BYnNvbHV0ZSBUaW1lIFRlc3Q8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlQWJzb2x1dGVUaW1lVGVzdChBYnNvbHV0ZVRpbWVUZXN0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGFwc2VkIFRpbWUgVGVzdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsYXBzZWQgVGltZSBUZXN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUVsYXBzZWRUaW1lVGVzdChFbGFwc2VkVGltZVRlc3Qgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgPFQ+IFQxIGNhc2VDb21wYXJhYmxlKENvbXBhcmFibGU8VD4gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9QcmVkaWNhdGVTd2l0Y2gKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvL1NjZW5hcmlvLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby9TY2VuYXJpby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZTVhNmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby9TY2VuYXJpby5qYXZhCkBAIC0wLDAgKzEsMjQ3IEBACisvLyBTY2VuYXJpby5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpbzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyOworCisvKioKKyAqIEEgPGNvZGU+U2NlbmFyaW88L2NvZGU+IGNvbWJpbmVzIGFsbCBvZiB0aGUgY29tcG9uZW50cyByZXF1aXJlZCB0byBjcmVhdGUKKyAqIGFuZCBleGVjdXRlIGEgc2ltdWxhdGlvbi4gVGhlc2UgYXJlIGEge0BsaW5rIE1vZGVsfSwgYSB7QGxpbmsgU2VxdWVuY2VyfSwKKyAqIGFuZCBhIHNldCBvZiA8Y29kZT5TY2VuYXJpbzwvY29kZT4gc3BlY2lmaWMge0BsaW5rIERlY29yYXRvcn0ncy4KKyAqIDxwPgorICogVGhlIHtAbGluayBNb2RlbH0gY29udGFpbnMgdGhlIGRldGFpbHMgb2YgaG93IHRvIGNvbnN0cnVjdCB0aGUKKyAqIDxlbT5jYW5vbmljYWwgZ3JhcGg8L2VtPiAoc2VlIHtAbGluayBHcmFwaH0uIFRoaXMgZ3JhcGggaXMgd2hhdCB0aGUKKyAqIDxjb2RlPlNjZW5hcmlvPC9jb2RlPiB1c2VzIHRvIHJlcHJlc2VudCB0aGUgc3RhdGUgb2YgYSBzaW11bGF0aW9uLgorICogPHA+CisgKiBUaGUge0BsaW5rIFNlcXVlbmNlcn0gaXMgdXNlZCBieSB0aGUgPGNvZGU+U2NlbmFyaW88L2NvZGU+IHRvIGRldGVybWluZSB0aGUKKyAqIHNlcXVlbmNlIG9mIHBvaW50cyBpbiB0aW1lIHRocm91Z2ggd2hpY2ggdGhlIDxjb2RlPlNjZW5hcmlvPC9jb2RlPiB3aWxsCisgKiB7QGxpbmsgI3N0ZXAoKX0gYXMgaXQgY29tcHV0ZXMgc3VjY2Vzc2l2ZSBzaW11bGF0aW9uIHN0YXRlcy4KKyAqIDxwPgorICogVGhlICJzY2VuYXJpbyBkZWNvcmF0b3JzIiBpbXBsZW1lbnQgdGhhdCBwYXJ0IG9mIHRoZSBzaW11bGF0aW9uIGNvbXB1dGF0aW9uCisgKiB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSA8Y29kZT5TY2VuYXJpbzwvY29kZT4uCisgKiA8cD4KKyAqIEEgPGNvZGU+U2NlbmFyaW88L2NvZGU+IGltcGxlbWVudHMgYWxsIG9mIHRoZSBsb2dpYyBuZWNlc3NhcnkgdG8gc2VxdWVuY2UKKyAqIHRocm91Z2ggZWFjaCBzdGVwIG9mIGEgc2ltdWxhdGlvbiBhbmQgY2FuIGJlIGV4ZWN1dGVkIG91dHNpZGUgb2YgdGhlIEVjbGlwc2UKKyAqIHdvcmtiZW5jaC4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5pdGlvbiBpcyBhbHNvIGFuICJBbm5vdGF0ZWQgSmF2YSBJbnRlcmZhY2UiIHRoYXQgZGVmaW5lcworICogb25lIGNsYXNzIGluIGEgPGEgaHJlZj0iaHR0cDovL3d3dy51bWwub3JnLyI+VU1MPC9hPiAibW9kZWwiLiBUaGUgVU1MIGNsYXNzCisgKiBkaWFncmFtIGZvciB0aGUgbW9kZWwgaXMgaW4gdGhlIDxjb2RlPmRvY3VtZW50YXRpb248L2NvZGU+IGZvbGRlciBvZiB0aGUKKyAqIHByb2plY3QuIFRoaXMgZmlsZSBhbmQgdGhlIG90aGVyIGludGVyZmFjZXMgaW4gdGhpcyBKYXZhIHBhY2thZ2UgYXJlCisgKiBwcm9jZXNzZWQgYnkgdGhlIEVjbGlwc2UgTW9kZWxpbmcgRnJhbWV3b3JrIChha2EgRU1GIDxhCisgKiBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UvZW1mIj5odHRwOi8vb3JnLmVjbGlwc2UvZW1mPC9hPikuIHRvIGF1dG9tYXRpY2FsbHkKKyAqIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbC4gRU1GIGlzIGRvY3VtZW50ZWQgaW4gdGhlIGJvb2sgPGEKKyAqIGhyZWY9Imh0dHA6Ly93d3cuYXdwcm9mZXNzaW9uYWwuY29tL2Jvb2tzdG9yZS9wcm9kdWN0LmFzcD9pc2JuPTAxMzE0MjU0MjAmcmw9MSI+RWNsaXBzZQorICogTW9kZWxpbmcgRnJhbWV3b3JrIDwvYT4gYnkgQnVkaW5za3ksIGV0IGFsLgorICogPC9wPgorICogCisgKiBAc2VlIE1vZGVsCisgKiBAc2VlIEdyYXBoCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNjZW5hcmlvIGV4dGVuZHMgSWRlbnRpZmlhYmxlIHsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHNlZ21lbnQgb2YgdGhlIHR5cGUgVVJJIHRoYXQgcHJlZml4ZXMgYWxsIG90aGVyIHNlZ21lbnRzIGluIGEKKwkgKiBzY2VuYXJpbyBVUkkuCisJICovCisJU3RyaW5nIFVSSV9UWVBFX1NDRU5BUklPX1NFR01FTlQgPSAic2NlbmFyaW8iOworCQorCS8qKgorCSAqIFRoZSB7QGxpbmsgTW9kZWx9IGNvbnRhaW5zIGFsbCBvZiB0aGUgZGV0YWlscyByZXF1aXJlZCB0byBjb25zdHJ1Y3QgdGhlCisJICogY2Fub25pY2FsIGdyYXBoIHRoYXQgdGhlIHNjZW5hcmlvIHdpbGwgdXNlIHRvIHJlcHJlc2VudCB0aGUgc3RhdGUgb2YgYQorCSAqIHNpbXVsYXRpb24uCisJICogCisJICogQHJldHVybiB0aGUgU2NlbmFyaW8ncyB7QGxpbmsgTW9kZWx9LgorCSAqIEBtb2RlbCBjb250YWlubWVudD0iZmFsc2UiCisJICovCisJTW9kZWwgZ2V0TW9kZWwoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbyNnZXRNb2RlbCA8ZW0+TW9kZWw8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2RlbDwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0TW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1vZGVsKE1vZGVsIHZhbHVlKTsKKworCS8qKgorCSAqIFRoZSB7QGxpbmsgU2VxdWVuY2VyfSBpcyB0aGUgY29tcG9uZW50IHRoYXQgZGV0ZXJtaW5lcyB0aGUgdGltZSBvZiB0aGUKKwkgKiBzaW11bGF0aW9uLiBJdCBnZW5lcmF0ZXMge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZX0KKwkgKiB2YWx1ZXMgdGhhdCBhcmUgdGhlbiB1c2VkIGJ5IHRoZSB7QGxpbmsgRGVjb3JhdG9yfSdzIHRvIHVwZGF0ZSB0aGUKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsfSdzIGluIHRoZSBjYW5vbmljYWwgZ3JhcGguCisJICogCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJmYWxzZSIKKwkgKi8KKwlTZXF1ZW5jZXIgZ2V0U2VxdWVuY2VyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8jZ2V0U2VxdWVuY2VyIDxlbT5TZXF1ZW5jZXI8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXF1ZW5jZXI8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFNlcXVlbmNlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U2VxdWVuY2VyKFNlcXVlbmNlciB2YWx1ZSk7CisKKwkvKioKKwkgKiBUaGUgInNjZW5hcmlvIGRlY29yYXRvcnMiIGFyZSB0aGUge0BsaW5rIERlY29yYXRvcn0ncyB0aGF0IGNhbgorCSAqICJkZWNvcmF0ZSIgKGkuZS4sIG1vZGlmeSkgdGhlIGNhbm9uaWNhbCB7QGxpbmsgR3JhcGh9IGFmdGVyIGl0IGhhcyBiZWVuCisJICogZ2VuZXJhdGVkIGJ5IHRoZSB7QGxpbmsgTW9kZWx9LiBUeXBpY2FsbHksIHRoZXNlIGRlY29yYXRvcnMgYXJlIHVzZWQgdG8KKwkgKiBwcm92aWRlIHNjZW5hcmlvIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIG9mIGEgc2ltdWxhdGlvbiBpbmRlcGVuZGVudCBvZgorCSAqIHRoZSBtb3JlIGdlbmVyYWwgaW5pdGlhbGl6YXRpb24gcHJvdmlkZWQgYnkgdGhlIGRlY29yYXRvcnMgaW4gdGhlCisJICoge0BsaW5rIE1vZGVsfS4KKwkgKiA8cD4KKwkgKiBGb3IgaW5zdGFuY2UsIGluIHRoZSBjYXNlIG9mIGEgZGlzZWFzZSBzaW11bGF0aW9uLCB0aGUgbW9kZWwgZGVjb3JhdG9ycworCSAqIHdvdWxkIGluY2x1ZGUgb25lIHRoYXQgaW1wbGVtZW50cyBhIGRpc2Vhc2UgbW9kZWwuIFRoYXQgZGVjb3JhdG9yIHdvdWxkCisJICogaGF2ZSBhZGRlZCBsYWJlbHMgdG8gYXBwcm9wcmlhdGUgbm9kZXMgdG8gcmVwcmVzZW50IHRoZSBzdGF0ZSBvZiB0aGUKKwkgKiBkaXNlYXNlIGF0IHNwZWNpZmljIGdlb2dyYXBoaWMgbG9jYXRpb25zIChsaWtlbHkgbW9zdCBvZiB0aGUKKwkgKiB7QGxpbmsgTm9kZXN9IGluIHRoZSB7QGxpbmsgR3JhcGh9KS4gSG93ZXZlciwgbm9uZSBvZiB0aGUgZGlzZWFzZSBzdGF0ZXMKKwkgKiB3b3VsZCAobGlrZWx5KSBpbmNsdWRlIGluZmVjdGVkIHBvcHVsYXRpb24gbWVtYmVycy4gVGhlIGpvYiBvZgorCSAqIGludHJvZHVjaW5nIHRoZSBpbmZlY3RlZCBwb3B1bGF0aW9uIG1lbWJlcnMgd291bGQgYmUgbGVmdCB1cCB0byBhCisJICogZGVjb3JhdG9yIGNvbnRhaW5lZCBpbiB0aGUgc2NlbmFyaW8uIFRodXMsIG9uZSBjb3VsZCByZXVzZSB0aGUgc2FtZQorCSAqIHVuZGVybHlpbmcge0BsaW5rIE1vZGVsfSBpbiBkaWZmZXJlbnQge0BsaW5rIFNjZW5hcmlvfSdzLiBFYWNoCisJICoge0BsaW5rIFNjZW5hcmlvfSwgaW4gdHVybiwgd291bGQgY29udGFpbiBhIHtAbGluayBEZWNvcmF0b3J9IGNvbmZpZ3VyZWQKKwkgKiBmb3IgYSBkaWZmZXJlbnQgaW5mZWN0aW9uIHN0YXJ0aW5nIHBvaW50LgorCSAqIDxwPgorCSAqIAorCSAqIEBzZWUgI2luaXRpYWxpemUoKQorCSAqIEBzZWUgI2dldENhbm9uaWNhbEdyYXBoKCkKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBTY2VuYXJpbyBEZWNvcmF0b3JzCisJICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IiCisJICogICAgICAgIGNvbnRhaW5tZW50PSJmYWxzZSIKKwkgKi8KKwlFTGlzdDxEZWNvcmF0b3I+IGdldFNjZW5hcmlvRGVjb3JhdG9ycygpOworCisJLyoqCisJICogVGhlIGNhbm9uaWNhbCB7QGxpbmsgR3JhcGh9IGlzIGNyZWF0ZWQgYnkgdGhlIHNjZW5hcmlvJ3Mge0BsaW5rIE1vZGVsfQorCSAqIHdoZW4gdGhlIG1ldGhvZCB7QGxpbmsgI2luaXRpYWxpemUoKX0gaXMgaW52b2tlZC4gVGhpcyBvY2N1cnMgZWl0aGVyIGJ5IGEKKwkgKiBkaXJlY3QgY2FsbCBvciBtb3JlIHR5cGljYWxseSBpbiB0aGUge0BsaW5rICNzdGVwKCl9IG1ldGhvZC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjYW5vbmljYWwgZ3JhcGgsIG9yIG51bGwgaWYgdGhlIFNjZW5hcmlvIGhhc24ndCBiZWVuCisJICogICAgICAgICBpbml0aWFsaXplZC4KKwkgKiAKKwkgKiBAbW9kZWwgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwlHcmFwaCBnZXRDYW5vbmljYWxHcmFwaCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMC4wIjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9ncmVzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9ncmVzczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0UHJvZ3Jlc3MoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvUGFja2FnZSNnZXRTY2VuYXJpb19Qcm9ncmVzcygpCisJICogQG1vZGVsIGRlZmF1bHQ9IjAuMCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldFByb2dyZXNzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8jZ2V0UHJvZ3Jlc3MgPGVtPlByb2dyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9ncmVzczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0UHJvZ3Jlc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFByb2dyZXNzKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2x2ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvbHZlcjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2x2ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFNvbHZlcihTb2x2ZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW9QYWNrYWdlI2dldFNjZW5hcmlvX1NvbHZlcigpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTb2x2ZXIgZ2V0U29sdmVyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8jZ2V0U29sdmVyIDxlbT5Tb2x2ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvbHZlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0U29sdmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTb2x2ZXIoU29sdmVyIHZhbHVlKTsKKworCS8qKgorCSAqIFNlcXVlbmNlIHRoZSBtb2RlbCBieSBvbmUgc2ltdWxhdGlvbiBzdGVwLiBUaGlzIHBlcmZvcm1zIGFueQorCSAqIGluaXRpYWxpemF0aW9uIHJlcXVpcmVkIHRvIGNyZWF0ZSB0aGUgY2Fub25pY2FsIHtAbGluayBHcmFwaH0sIGlmCisJICogbmVjZXNzYXJ5LgorCSAqIAorCSAqIEBwYXJhbSBsIExpc3RlbmVyIHRoYXQgbmVlZHMgdG8gYmUgbm90aWZpZWQgb2YgcHJvZ3Jlc3Mgb2YgZGVjb3JhdG9ycworCSAqIEBzZWUgI2luaXRpYWxpemUoKQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlcXVlbmNlIGNhbiBjb250aW51ZSwKKwkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgc2VxdWVuY2UgaGFzIGNvbXBsZXRlZC4KKwkgKiAKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJYm9vbGVhbiBzdGVwKCk7CisJCisJLyoqCisJICogUmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBjYW5vbmljYWwge0BsaW5rIEdyYXBofSB0byBpdHMgaW5pdGlhbCBzdGF0ZS4gVGhpcworCSAqIGRvZXMgbm90IGRlbGV0ZSBhbmQgcmVjcmVhdGUgdGhlIGNhbm9uaWNhbCBncmFwaC4KKwkgKiAKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJdm9pZCByZXNldCgpOworCisJLyoqCisJICogQ3JlYXRlIHRoZSBjYW5vbmljYWwge0BsaW5rIEdyYXBofSBhbmQgcGVyZm9ybSBpbml0aWFsaXphdGlvbiBzdGVwcworCSAqIHJlcXVpcmVkIHRvIHNlcXVlbmNlIHRoZSBzY2VuYXJpby4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5CisJICoge0BsaW5rICNzdGVwKCl9IHdoZW4gaXQgbmVlZHMgdG8gY3JlYXRlIHRoZSBjYW5vbmljYWwge0BsaW5rIEdyYXBofS4gSXQKKwkgKiBjYW4gYmUgY2FsbGVkIGJlZm9yZSBhIGNhbGwgdG8ge0BsaW5rICNzdGVwKCl9IHRvIGNyZWF0ZSB0aGUKKwkgKiB7QGxpbmsgR3JhcGh9LgorCSAqIAorCSAqIEBzZWUgI2dldENhbm9uaWNhbEdyYXBoKCkKKwkgKiAKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJdm9pZCBpbml0aWFsaXplKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0aXRsZSBvZiB0aGUgc2NlbmFyaW8gYXMgc3BlY2lmaWVkIGJ5IGl0cworCSAqICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZX0sIG9yLCBpZiBubworCSAqICAgICAgICAgdGl0bGUgaXMgZGVmaW5lZCwgcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcuCisJICogCisJICogQHNlZSBJZGVudGlmaWFibGUjZ2V0RHVibGluQ29yZSgpCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCVN0cmluZyBwcm9kdWNlVGl0bGUoKTsKKwkKK30gLy8gU2NlbmFyaW8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvL1NjZW5hcmlvRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2NlbmFyaW8vU2NlbmFyaW9GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg4NzVhYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvL1NjZW5hcmlvRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW9QYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2NlbmFyaW9GYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgeworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU2NlbmFyaW9GYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5pbXBsLlNjZW5hcmlvRmFjdG9yeUltcGwuaW5pdCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TY2VuYXJpbzwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2NlbmFyaW88L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVNjZW5hcmlvIGNyZWF0ZVNjZW5hcmlvKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogQGdlbmVyYXRlZAorCSAqLworCVNjZW5hcmlvUGFja2FnZSBnZXRTY2VuYXJpb1BhY2thZ2UoKTsKKworfSAvL1NjZW5hcmlvRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2NlbmFyaW8vU2NlbmFyaW9QYWNrYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby9TY2VuYXJpb1BhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzA3Yjg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2NlbmFyaW8vU2NlbmFyaW9QYWNrYWdlLmphdmEKQEAgLTAsMCArMSwzMjggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAorICogPHVsPgorICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKyAqIDwvdWw+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvRmFjdG9yeQorICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2NlbmFyaW9QYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgeworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOQU1FID0gInNjZW5hcmlvIjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2NlbmFyaW8uZWNvcmUiOworCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvIjsKKworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU2NlbmFyaW9QYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5pbXBsLlNjZW5hcmlvUGFja2FnZUltcGwuaW5pdCgpOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uaW1wbC5TY2VuYXJpb0ltcGwgPGVtPlNjZW5hcmlvPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLmltcGwuU2NlbmFyaW9JbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uaW1wbC5TY2VuYXJpb1BhY2thZ2VJbXBsI2dldFNjZW5hcmlvKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNDRU5BUklPID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQ0VOQVJJT19fVVJJID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNDRU5BUklPX19UWVBFX1VSSSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNDRU5BUklPX19EVUJMSU5fQ09SRSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb2RlbDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNDRU5BUklPX19NT0RFTCA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlcjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNDRU5BUklPX19TRVFVRU5DRVIgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2VuYXJpbyBEZWNvcmF0b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQ0VOQVJJT19fU0NFTkFSSU9fREVDT1JBVE9SUyA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhbm9uaWNhbCBHcmFwaDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNDRU5BUklPX19DQU5PTklDQUxfR1JBUEggPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNDRU5BUklPX19QUk9HUkVTUyA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvbHZlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNDRU5BUklPX19TT0xWRVIgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TY2VuYXJpbzwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTQ0VOQVJJT19GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDY7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8gPGVtPlNjZW5hcmlvPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNjZW5hcmlvPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTY2VuYXJpbygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8jZ2V0TW9kZWwgPGVtPk1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+TW9kZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8jZ2V0TW9kZWwoKQorCSAqIEBzZWUgI2dldFNjZW5hcmlvKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTY2VuYXJpb19Nb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8jZ2V0U2VxdWVuY2VyIDxlbT5TZXF1ZW5jZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TZXF1ZW5jZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8jZ2V0U2VxdWVuY2VyKCkKKwkgKiBAc2VlICNnZXRTY2VuYXJpbygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U2NlbmFyaW9fU2VxdWVuY2VyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvI2dldFNjZW5hcmlvRGVjb3JhdG9ycyA8ZW0+U2NlbmFyaW8gRGVjb3JhdG9yczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2NlbmFyaW8gRGVjb3JhdG9yczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbyNnZXRTY2VuYXJpb0RlY29yYXRvcnMoKQorCSAqIEBzZWUgI2dldFNjZW5hcmlvKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTY2VuYXJpb19TY2VuYXJpb0RlY29yYXRvcnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvI2dldENhbm9uaWNhbEdyYXBoIDxlbT5DYW5vbmljYWwgR3JhcGg8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5DYW5vbmljYWwgR3JhcGg8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8jZ2V0Q2Fub25pY2FsR3JhcGgoKQorCSAqIEBzZWUgI2dldFNjZW5hcmlvKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTY2VuYXJpb19DYW5vbmljYWxHcmFwaCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8jZ2V0UHJvZ3Jlc3MgPGVtPlByb2dyZXNzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvZ3Jlc3M8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8jZ2V0UHJvZ3Jlc3MoKQorCSAqIEBzZWUgI2dldFNjZW5hcmlvKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTY2VuYXJpb19Qcm9ncmVzcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8jZ2V0U29sdmVyIDxlbT5Tb2x2ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Tb2x2ZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8jZ2V0U29sdmVyKCkKKwkgKiBAc2VlICNnZXRTY2VuYXJpbygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U2NlbmFyaW9fU29sdmVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTY2VuYXJpb0ZhY3RvcnkgZ2V0U2NlbmFyaW9GYWN0b3J5KCk7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKKwkgKiA8dWw+CisJICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisJICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKwkgKiA8L3VsPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uaW1wbC5TY2VuYXJpb0ltcGwgPGVtPlNjZW5hcmlvPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLmltcGwuU2NlbmFyaW9JbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLmltcGwuU2NlbmFyaW9QYWNrYWdlSW1wbCNnZXRTY2VuYXJpbygpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTQ0VOQVJJTyA9IGVJTlNUQU5DRS5nZXRTY2VuYXJpbygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TW9kZWw8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTQ0VOQVJJT19fTU9ERUwgPSBlSU5TVEFOQ0UuZ2V0U2NlbmFyaW9fTW9kZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlcjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNDRU5BUklPX19TRVFVRU5DRVIgPSBlSU5TVEFOQ0UuZ2V0U2NlbmFyaW9fU2VxdWVuY2VyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TY2VuYXJpbyBEZWNvcmF0b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTQ0VOQVJJT19fU0NFTkFSSU9fREVDT1JBVE9SUyA9IGVJTlNUQU5DRS5nZXRTY2VuYXJpb19TY2VuYXJpb0RlY29yYXRvcnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhbm9uaWNhbCBHcmFwaDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNDRU5BUklPX19DQU5PTklDQUxfR1JBUEggPSBlSU5TVEFOQ0UuZ2V0U2NlbmFyaW9fQ2Fub25pY2FsR3JhcGgoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2dyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0NFTkFSSU9fX1BST0dSRVNTID0gZUlOU1RBTkNFLmdldFNjZW5hcmlvX1Byb2dyZXNzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2x2ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTQ0VOQVJJT19fU09MVkVSID0gZUlOU1RBTkNFLmdldFNjZW5hcmlvX1NvbHZlcigpOworCit9CisKK30gLy9TY2VuYXJpb1BhY2thZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvL2ltcGwvU2NlbmFyaW9GYWN0b3J5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2NlbmFyaW8vaW1wbC9TY2VuYXJpb0ZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU0ZDY2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvL2ltcGwvU2NlbmFyaW9GYWN0b3J5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uKjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTY2VuYXJpb0ZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgU2NlbmFyaW9GYWN0b3J5IHsKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBTY2VuYXJpb0ZhY3RvcnkgaW5pdCgpIHsKKwkJdHJ5IHsKKwkJCVNjZW5hcmlvRmFjdG9yeSB0aGVTY2VuYXJpb0ZhY3RvcnkgPSAoU2NlbmFyaW9GYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby5lY29yZSIpOyAvLyROT04tTkxTLTEkIAorCQkJaWYgKHRoZVNjZW5hcmlvRmFjdG9yeSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoZVNjZW5hcmlvRmFjdG9yeTsKKwkJCX0KKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwkJcmV0dXJuIG5ldyBTY2VuYXJpb0ZhY3RvcnlJbXBsKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU2NlbmFyaW9GYWN0b3J5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgeworCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBTY2VuYXJpb1BhY2thZ2UuU0NFTkFSSU86IHJldHVybiBjcmVhdGVTY2VuYXJpbygpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTY2VuYXJpbyBjcmVhdGVTY2VuYXJpbygpIHsKKwkJU2NlbmFyaW9JbXBsIHNjZW5hcmlvID0gbmV3IFNjZW5hcmlvSW1wbCgpOworCQlyZXR1cm4gc2NlbmFyaW87CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNjZW5hcmlvUGFja2FnZSBnZXRTY2VuYXJpb1BhY2thZ2UoKSB7CisJCXJldHVybiAoU2NlbmFyaW9QYWNrYWdlKWdldEVQYWNrYWdlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZGVwcmVjYXRlZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlARGVwcmVjYXRlZAorCXB1YmxpYyBzdGF0aWMgU2NlbmFyaW9QYWNrYWdlIGdldFBhY2thZ2UoKSB7CisJCXJldHVybiBTY2VuYXJpb1BhY2thZ2UuZUlOU1RBTkNFOworCX0KKworfSAvL1NjZW5hcmlvRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvL2ltcGwvU2NlbmFyaW9JbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby9pbXBsL1NjZW5hcmlvSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NTU5MzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby9pbXBsL1NjZW5hcmlvSW1wbC5qYXZhCkBAIC0wLDAgKzEsNzU2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5JZGVudGlmaWFibGVGaWx0ZXJJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5JZGVudGlmaWFibGVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguVW5yZXNvbHZlZElkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNjZW5hcmlvPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uaW1wbC5TY2VuYXJpb0ltcGwjZ2V0TW9kZWwgPGVtPk1vZGVsPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uaW1wbC5TY2VuYXJpb0ltcGwjZ2V0U2VxdWVuY2VyIDxlbT5TZXF1ZW5jZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5pbXBsLlNjZW5hcmlvSW1wbCNnZXRTY2VuYXJpb0RlY29yYXRvcnMgPGVtPlNjZW5hcmlvIERlY29yYXRvcnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5pbXBsLlNjZW5hcmlvSW1wbCNnZXRDYW5vbmljYWxHcmFwaCA8ZW0+Q2Fub25pY2FsIEdyYXBoPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uaW1wbC5TY2VuYXJpb0ltcGwjZ2V0UHJvZ3Jlc3MgPGVtPlByb2dyZXNzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uaW1wbC5TY2VuYXJpb0ltcGwjZ2V0U29sdmVyIDxlbT5Tb2x2ZXI8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTY2VuYXJpb0ltcGwgZXh0ZW5kcyBJZGVudGlmaWFibGVJbXBsIGltcGxlbWVudHMgU2NlbmFyaW8geworCisJCisJLyoqCisJICogVGhpcyBpcyB0aGUge0BsaW5rIFVSSX0gdXNlZCB0byBpZGVudGlmeSB0aGUgY2Fub25pY2FsIHtAbGluayBHcmFwaH0gdXNlZCBkdXJpbmcgdGhlCisJICogc2ltdWxhdGlvbgorCSAqIAorCSAqIFRPRE8gaXMgdGhpcyB0aGUgcmlnaHQgVVJJIHRvIHVzZSBmb3IgY2Fub25pY2FsIGdyYXBocz8KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVSSSBDQU5PTklDQUxfR1JBUEhfVVJJID0gVVJJCisJCQkuY3JlYXRlVVJJKCJzdGVtOmNhbm9uaWNhbGdyYXBoIik7CisJCisJLyoqCisJICogVGhpcyBmbGFnIGNvbnRyb2xzIHRoZSByZXBvcnRpbmcgb2YgZWFjaCBhbmQgZXZlcnkgdW5yZXNvbHZlZCAKKwkgKiB7QGxpbmsgSWRlbnRpZmlhYmxlfSByZWZlcmVuY2UgZW5jb3VudGVyZWQgd2hlbiBjcmVhdGluZyB0aGUgCisJICogY2Fub25pY2FsIHtAbGluayBHcmFwaH0uICBEZWZhdWx0OiA8Y29kZT5mYWxzZTwvY29kZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVwb3J0RWFjaFVucmVzb2x2ZWRJZGVudGlmaWFibGUgPSB0cnVlOworCisJLyoqCisJICogVGhpcyBmbGFnIGNvbnRyb2xzIHRoZSByZXBvcnRpbmcgb2YgZGFuZ2xpbmcgYWlyIHRyYW5zcG9ydCBlZGdlcyAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVwb3J0RGFuZ2xpbmdBaXJUcmFuc3BvcnRFZGdlcyA9IGZhbHNlOyAKKworCS8qKgorCSAqIFRoaXMgZmxhZyBjb250cm9scyB0aGUgcmVwb3J0aW5nIG9mIGEgc2luZ2xlIHN1bW1hcnkgbWVzc2FnZSBvZiB0aGUgCisJICogbnVtYmVyIG9mIHVucmVzb2x2ZWQge0BsaW5rIElkZW50aWZpYWJsZX0gcmVmZXJlbmNlcyBlbmNvdW50ZXJlZCAKKwkgKiB3aGVuIGNyZWF0aW5nIHRoZSBjYW5vbmljYWwge0BsaW5rIEdyYXBofS4gRGVmYXVsdDogPGNvZGU+ZmFsc2U8L2NvZGU+CisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIHJlcG9ydE51bWJlcm9mVW5yZXNvbHZlZElkZW50aWZpYWJsZXMgPSBmYWxzZTsKKwkKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNb2RlbCgpIDxlbT5Nb2RlbDwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTW9kZWwgbW9kZWw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXF1ZW5jZXIoKSA8ZW0+U2VxdWVuY2VyPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2VxdWVuY2VyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU2VxdWVuY2VyIHNlcXVlbmNlcjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjZW5hcmlvRGVjb3JhdG9ycygpIDxlbT5TY2VuYXJpbyBEZWNvcmF0b3JzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTY2VuYXJpb0RlY29yYXRvcnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxEZWNvcmF0b3I+IHNjZW5hcmlvRGVjb3JhdG9yczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbm9uaWNhbEdyYXBoKCkgPGVtPkNhbm9uaWNhbCBHcmFwaDwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENhbm9uaWNhbEdyYXBoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgR3JhcGggY2Fub25pY2FsR3JhcGg7CisJCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2dyZXNzKCkgPGVtPlByb2dyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQcm9ncmVzcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgUFJPR1JFU1NfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9ncmVzcygpIDxlbT5Qcm9ncmVzczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJvZ3Jlc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgcHJvZ3Jlc3MgPSBQUk9HUkVTU19FREVGQVVMVDsKKworCQorCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvbHZlcigpIDxlbT5Tb2x2ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNvbHZlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFNvbHZlciBzb2x2ZXI7CisKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIFNjZW5hcmlvSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwkJc2V0VVJJKFNURU1VUkkuY3JlYXRlVVJJKFVSSV9UWVBFX1NDRU5BUklPX1NFR01FTlQgKyAiLyIKKwkJCQkrICBTVEVNVVJJLmdlbmVyYXRlVW5pcXVlUGFydCgpKSk7CisJCXNldFR5cGVVUkkoU1RFTVVSSS5TQ0VOQVJJT19UWVBFX1VSSSk7CisJfSAvLyBTY2VuYXJpb0ltcGwKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFNjZW5hcmlvUGFja2FnZS5MaXRlcmFscy5TQ0VOQVJJTzsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1vZGVsIGdldE1vZGVsKCkgeworCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkTW9kZWwgPSAoSW50ZXJuYWxFT2JqZWN0KW1vZGVsOworCQkJbW9kZWwgPSAoTW9kZWwpZVJlc29sdmVQcm94eShvbGRNb2RlbCk7CisJCQlpZiAobW9kZWwgIT0gb2xkTW9kZWwpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTY2VuYXJpb1BhY2thZ2UuU0NFTkFSSU9fX01PREVMLCBvbGRNb2RlbCwgbW9kZWwpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbW9kZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1vZGVsIGJhc2ljR2V0TW9kZWwoKSB7CisJCXJldHVybiBtb2RlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TW9kZWwoTW9kZWwgbmV3TW9kZWwpIHsKKwkJTW9kZWwgb2xkTW9kZWwgPSBtb2RlbDsKKwkJbW9kZWwgPSBuZXdNb2RlbDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19NT0RFTCwgb2xkTW9kZWwsIG1vZGVsKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTZXF1ZW5jZXIgZ2V0U2VxdWVuY2VyKCkgeworCQlpZiAoc2VxdWVuY2VyICE9IG51bGwgJiYgc2VxdWVuY2VyLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRTZXF1ZW5jZXIgPSAoSW50ZXJuYWxFT2JqZWN0KXNlcXVlbmNlcjsKKwkJCXNlcXVlbmNlciA9IChTZXF1ZW5jZXIpZVJlc29sdmVQcm94eShvbGRTZXF1ZW5jZXIpOworCQkJaWYgKHNlcXVlbmNlciAhPSBvbGRTZXF1ZW5jZXIpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTY2VuYXJpb1BhY2thZ2UuU0NFTkFSSU9fX1NFUVVFTkNFUiwgb2xkU2VxdWVuY2VyLCBzZXF1ZW5jZXIpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc2VxdWVuY2VyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTZXF1ZW5jZXIgYmFzaWNHZXRTZXF1ZW5jZXIoKSB7CisJCXJldHVybiBzZXF1ZW5jZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlcXVlbmNlcihTZXF1ZW5jZXIgbmV3U2VxdWVuY2VyKSB7CisJCVNlcXVlbmNlciBvbGRTZXF1ZW5jZXIgPSBzZXF1ZW5jZXI7CisJCXNlcXVlbmNlciA9IG5ld1NlcXVlbmNlcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19TRVFVRU5DRVIsIG9sZFNlcXVlbmNlciwgc2VxdWVuY2VyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBUaGUgdmFsdWUgaXMgc2V0IGluIHtAbGluayAjaW5pdGlhbGl6ZSgpfSA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEdyYXBoIGdldENhbm9uaWNhbEdyYXBoKCkgeworCQlyZXR1cm4gY2Fub25pY2FsR3JhcGg7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRQcm9ncmVzcygpIHsKKwkJcmV0dXJuIHByb2dyZXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzKGRvdWJsZSBuZXdQcm9ncmVzcykgeworCQlkb3VibGUgb2xkUHJvZ3Jlc3MgPSBwcm9ncmVzczsKKwkJcHJvZ3Jlc3MgPSBuZXdQcm9ncmVzczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19QUk9HUkVTUywgb2xkUHJvZ3Jlc3MsIHByb2dyZXNzKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNvbHZlciBnZXRTb2x2ZXIoKSB7CisJCXJldHVybiBzb2x2ZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U29sdmVyKFNvbHZlciBuZXdTb2x2ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJU29sdmVyIG9sZFNvbHZlciA9IHNvbHZlcjsKKwkJc29sdmVyID0gbmV3U29sdmVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTY2VuYXJpb1BhY2thZ2UuU0NFTkFSSU9fX1NPTFZFUiwgb2xkU29sdmVyLCBuZXdTb2x2ZXIpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNvbHZlcihTb2x2ZXIgbmV3U29sdmVyKSB7CisJCWlmIChuZXdTb2x2ZXIgIT0gc29sdmVyKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChzb2x2ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc29sdmVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19TT0xWRVIsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1NvbHZlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTb2x2ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBTY2VuYXJpb1BhY2thZ2UuU0NFTkFSSU9fX1NPTFZFUiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRTb2x2ZXIobmV3U29sdmVyLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNjZW5hcmlvUGFja2FnZS5TQ0VOQVJJT19fU09MVkVSLCBuZXdTb2x2ZXIsIG5ld1NvbHZlcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCdzIG9rIHRvIGNhbGwgc3RlcCBhZ2Fpbi4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBib29sZWFuIHN0ZXAoKSB7CisJCWJvb2xlYW4gc3VjY2VzcyA9IHRydWU7CisJCS8vIElzIHRoZSBzZXF1ZW5jZXIgZmluaXNoZWQ/CisJCQorCQlpZiAoIWdldFNlcXVlbmNlcigpLmlzVGltZVRvU3RvcCgpKSB7CisJCQkvLyBObworCQkJLy8gSXMgdGhlcmUgYSBjYW5vbmljYWwgZ3JhcGg/CisJCQlpZiAoY2Fub25pY2FsR3JhcGggPT0gbnVsbCkgeworCQkJCS8vIE5vCisJCQkJLy8gQ3JlYXRlIG9uZSB0aGVuLi4uCisJCQkJaW5pdGlhbGl6ZSgpOworCQkJfSAvLyBpZiBubyBjYW5vbmljYWwgZ3JhcGgKKworCQkJLy8gRXZlcnl0aGluZyBzaG91bGQgYmUgc2FuZQorCQkJYXNzZXJ0IHNhbmUoKTsKKworCQkJZmluYWwgU1RFTVRpbWUgY3VycmVudFRpbWUgPSBnZXRTZXF1ZW5jZXIoKS5nZXROZXh0VGltZSgpOworCQkJZmluYWwgbG9uZyB0aW1lRGVsdGEgPSBnZXRTZXF1ZW5jZXIoKS5nZXRUaW1lRGVsdGEoKTsKKwkJCQorCQkJLy8gRmlyc3QgcmVzZXQgdGhlIHByb2dyZXNzIG9mIGVhY2ggZGVjb3JhdG9yIHRvIDAuIE5lY2Vzc2FyeSBmb3IgdGhlIGl0ZXJhdGlvbiBwcm9ncmVzcworCQkJLy8gYmFyCisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPERlY29yYXRvcj4gZGVjb3JhdG9ySXRlciA9IGNhbm9uaWNhbEdyYXBoCisJCQkJCS5nZXREZWNvcmF0b3JzKCkuaXRlcmF0b3IoKTsgZGVjb3JhdG9ySXRlci5oYXNOZXh0KCk7KSB7CisJCQkJZmluYWwgRGVjb3JhdG9yIGRlY29yYXRvciA9IGRlY29yYXRvckl0ZXIubmV4dCgpOworCQkJCWRlY29yYXRvci5zZXRQcm9ncmVzcygwLjApOworCQkJfQorCQkJCisJCQkKKwkJCS8vIERvIHRoZSBvbmUgc3RlcCB1c2luZyB0aGUgY3VycmVudCBzb2x2ZXIKKwkJCXN1Y2Nlc3MgPSBzb2x2ZXIuc3RlcChjdXJyZW50VGltZSwgdGltZURlbHRhLCBnZXRTZXF1ZW5jZXIoKS5nZXRDeWNsZSgpKTsKKwkJCQkJCQorCQkJLy8gRXZlcnl0aGluZyBzaG91bGQgc3RpbGwgYmUgc2FuZQorCQkJYXNzZXJ0IHNhbmUoKTsKKwkKKwkJCS8vIE9uY2UgZXZlcnlvbmUgaXMgZG9uZSwgd2UgdGVsbCB0aGUgZ3JhcGggdG8gc3dpdGNoIGFsbCB0aGUKKwkJCS8vIGR5bmFtaWMgbGFiZWxzIHRvIHRoZWlyIG5leHQgdmFsdWUgYW5kIHRoZW4gd2UncmUgcmVhZHkgdG8gZG8KKwkJCS8vIGl0IGFsbCBvdmVyIGFnYWluLgorCQkJY2Fub25pY2FsR3JhcGguc3dpdGNoVG9OZXh0VmFsdWUoY3VycmVudFRpbWUpOworCQl9IC8vIGlmIHNlcXVlbmNlciBmaW5pc2hlZAorCQlpZihzdWNjZXNzKSBzdWNjZXNzID0gIWdldFNlcXVlbmNlcigpLmlzVGltZVRvU3RvcCgpOworCQlyZXR1cm4gc3VjY2VzczsKKwl9IC8vIHN0ZXAKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCS8vIFNldCB0aGUgc2VxdWVuY2VyIGJhY2sgdG8gaXRzIG9yaWdpbmFsIHN0YXRlLiBUaGUgc2VxdWVuY2VyIGRldGVybWluZXMKKwkJLy8gdGhlICJjdXJyZW50IiB0aW1lIG9mIHRoZSBzaW11bGF0aW9uLiBUaGlzIGlzIGEgdmFsdWUgdXNlZCB0byBjb21wdXRlCisJCS8vIHRoZSB2YWx1ZXMgb2YgZHluYW1pYyBsYWJlbHMgZm9yIGVhY2ggc3RlcCBvZiB0aGUgc2ltdWxhdGlvbi4KKwkJZ2V0U2VxdWVuY2VyKCkucmVzZXQoKTsKKwkJCisJCS8vICBOb3cgZ2l2ZSBlYWNoIGRlY29yYXRvciBhIGNoYW5jZSB0byByZXNldCBpdHMgZHluYW1pYworCQkvLyBsYWJlbHMgaW4gdGhlIGNhbm9uaWNhbCBncmFwaAorCQkKKwkJLy8gU0VEIGZpeC4gV2UgbmVlZCB0byByZXNldCB0aGUgZGlzZWFzZSBtb2RlbHMgZmlyc3Qgc2luY2UgdGhlIGluZmVjdG9ycworCQkvLyBpbm9jdWxhdG9ycyBkZXBlbmQgdXAgdGhvc2UgYmVpbmcgcmVzZXQgYmVmb3JlaGFuZC4KKwkJCisJCUFycmF5TGlzdDxEZWNvcmF0b3I+aW50RGVjb3JhdG9ycyA9IG5ldyBBcnJheUxpc3Q8RGVjb3JhdG9yPigpOworCQlBcnJheUxpc3Q8RGVjb3JhdG9yPm90aGVyRGVjb3JhdG9ycyA9IG5ldyBBcnJheUxpc3Q8RGVjb3JhdG9yPigpOworCQkKKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxEZWNvcmF0b3I+IGdyYXBoRGVjb3JhdG9ySXRlciA9IGNhbm9uaWNhbEdyYXBoLmdldERlY29yYXRvcnMoKQorCQkJCS5pdGVyYXRvcigpOyBncmFwaERlY29yYXRvckl0ZXIuaGFzTmV4dCgpOykgeworCQkJZmluYWwgRGVjb3JhdG9yIGRlY29yYXRvciA9IGdyYXBoRGVjb3JhdG9ySXRlcgorCQkJCQkubmV4dCgpOworCQkJaWYoZGVjb3JhdG9yIGluc3RhbmNlb2YgSW50ZWdyYXRpb25EZWNvcmF0b3IpaW50RGVjb3JhdG9ycy5hZGQoZGVjb3JhdG9yKTsKKwkJCWVsc2Ugb3RoZXJEZWNvcmF0b3JzLmFkZChkZWNvcmF0b3IpOworCQl9CisJCWZvcihEZWNvcmF0b3IgZGVjb3JhdG9yOmludERlY29yYXRvcnMpeworCQkJLy8gSXMgdGhlIERlY29yYXRvciBlbmFibGVkPworCQkJaWYgKGRlY29yYXRvci5pc0VuYWJsZWQoKSkgeworCQkJCS8vIFllcworCQkJCWRlY29yYXRvci5yZXNldExhYmVscygpOworCQkJfSAvLyBpZiAKKwkJCQorCQkJLy8gUmVzZXQgdGhlIHNvbHZlcgorCQl9IC8vIGZvciBlYWNoIGRlY29yYXRvcgorCQlmb3IoRGVjb3JhdG9yIGRlY29yYXRvcjpvdGhlckRlY29yYXRvcnMpeworCQkJLy8gSXMgdGhlIERlY29yYXRvciBlbmFibGVkPworCQkJaWYgKGRlY29yYXRvci5pc0VuYWJsZWQoKSkgeworCQkJCS8vIFllcworCQkJCWRlY29yYXRvci5yZXNldExhYmVscygpOworCQkJfSAvLyBpZiAKKwkJCQorCQkJLy8gUmVzZXQgdGhlIHNvbHZlcgorCQl9IC8vIGZvciBlYWNoIGRlY29yYXRvcgorCQorCQlzb2x2ZXIucmVzZXQoKTsKKwl9Ly8gcmVzZXQKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJLy8gU2V0IHRoZSBzZXF1ZW5jZXIgYmFjayB0byBpdHMgb3JpZ2luYWwgc3RhdGUuIFRoZSBzZXF1ZW5jZXIgZGV0ZXJtaW5lcworCQkvLyB0aGUgImN1cnJlbnQiIHRpbWUgb2YgdGhlIHNpbXVsYXRpb24uIFRoaXMgaXMgYSB2YWx1ZSB1c2VkIHRvIGNvbXB1dGUKKwkJLy8gdGhlIHZhbHVlcyBvZiBkeW5hbWljIGxhYmVscyBmb3IgZWFjaCBzdGVwIG9mIHRoZSBzaW11bGF0aW9uLgorCQlnZXRTZXF1ZW5jZXIoKS5yZXNldCgpOworCisJCS8vIFByZXBhcmUgdGhlIG1vZGVsIGFuZCBwZXJmb3JtIGFueSBwcmUtcHJvY2Vzc2luZyBzdGVwcyBuZWNlc3NhcnkKKwkJLy8gYmVmb3JlIHdlIGJlZ2luCisJCVNURU1UaW1lIHN0YXJ0ID0gZ2V0U2VxdWVuY2VyKCkuZ2V0U3RhcnRUaW1lKCk7CisJCWdldE1vZGVsKCkucHJlcGFyZShzdGFydCk7CisJCQorCQkvLyBHZXQgdGhlIGNhbm9uaWNhbCBncmFwaCB0aGF0IHdlJ2xsIHVzZSBmb3IgdGhlIHNpbXVsYXRpb24uIEl0CisJCS8vIG1haW50YWlucyBhbGwgc3RhdGUgaW5mb3JtYXRpb24gZHVyaW5nIHRoZSBzaW11bGF0aW9uLgorCQljYW5vbmljYWxHcmFwaCA9IGdldE1vZGVsKCkuZ2V0Q2Fub25pY2FsR3JhcGgoQ0FOT05JQ0FMX0dSQVBIX1VSSSwgbmV3IElkZW50aWZpYWJsZUZpbHRlckltcGwoZ2V0TW9kZWwoKS5nZXREdWJsaW5Db3JlKCkuZ2V0Q292ZXJhZ2UoKSksIHN0YXJ0KTsKKworCQljYW5vbmljYWxHcmFwaC5zZXRUaW1lKChTVEVNVGltZSkgRWNvcmVVdGlsLmNvcHkoZ2V0U2VxdWVuY2VyKCkKKwkJCQkuZ2V0Q3VycmVudFRpbWUoKSkpOworCisJCS8vCisJCS8vIENvbmZpcm0sIHJlLXZhbGlkYXRlIHRoZSBzZXQgb2YgdW5yZXNvbHZlZCBpZGVudGlmaWFibGVzLgorCQkvLyBCZWNhdXNlIHdlIGFkZCBncmFwaHMgdG8gZ3JhcGhzIGFuZCBtb2RlbHMgdG8gbW9kZWxzIHNvbWUgb2YgdGhlIAorCQkvLyB1bnJlc29sdmVkIGlkZW50aWZpYWJsZXMgZG8gbm90IHJlc29sdmUgdW50aWwgdGhlIHZlcnkgZW5kCisJCS8vIHRoaXMgbWV0aG9kIGRvZXMgdGhhdCBjaGVjayBvbiB0aGUgRklOQUwgY2Fub25pY2FsR3JhcGguCisJCS8vCisJCUl0ZXJhdG9yPFVucmVzb2x2ZWRJZGVudGlmaWFibGU+IHVucmVzb2x2ZWQgPSBjYW5vbmljYWxHcmFwaC5nZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlcygpLml0ZXJhdG9yKCk7CisJCSAgd2hpbGUgKHVucmVzb2x2ZWQuaGFzTmV4dCgpKSB7CisJCSAgIFVucmVzb2x2ZWRJZGVudGlmaWFibGUgdGVtcCA9IHVucmVzb2x2ZWQubmV4dCgpOworCQkgICAKKwkJICAgaWYgKGNhbm9uaWNhbEdyYXBoLmdldE5vZGVzKCkuZ2V0KHRlbXAuZ2V0VW5yZXNvbHZlZFVSSSgpKSAhPSBudWxsIAorCQkgICAgIHx8IGNhbm9uaWNhbEdyYXBoLmdldEVkZ2VzKCkuZ2V0KHRlbXAuZ2V0VW5yZXNvbHZlZFVSSSgpKSAhPSBudWxsKSB7CisJCSAgICB1bnJlc29sdmVkLnJlbW92ZSgpOworCQkgICB9CisJCX0KKwkJLy8gSnVzdCBjaGVja2luZy4uLgorCQlhc3NlcnQgY2Fub25pY2FsR3JhcGguc2FuZSgpOworCisJCS8vIEFkZCB0aGUgYWRhcHRvcnMgdG8ga2VlcCB0cmFjayBvZiB0aGUgcHJvZ3Jlc3MgZm9yIGVhY2ggZ3JhcGggZGVjb3JhdG9yCisJCWZpbmFsIGRvdWJsZSBudW1EZWNvcmF0b3JzID0gdGhpcy5nZXRDYW5vbmljYWxHcmFwaCgpLmdldERlY29yYXRvcnMoKS5zaXplKCk7CisJCWZpbmFsIFNjZW5hcmlvIHNlbGYgPSB0aGlzOworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPERlY29yYXRvcj4gc2NlbmFyaW9EZWNvcmF0b3JzID0gdGhpcy5nZXRDYW5vbmljYWxHcmFwaCgpLmdldERlY29yYXRvcnMoKQorCQkJCS5pdGVyYXRvcigpOyBzY2VuYXJpb0RlY29yYXRvcnMuaGFzTmV4dCgpOykgeworCQkJZmluYWwgRGVjb3JhdG9yIGRlY29yYXRvciA9IHNjZW5hcmlvRGVjb3JhdG9ycy5uZXh0KCk7CisJCQlkZWNvcmF0b3IuZUFkYXB0ZXJzKCkuYWRkKAorCQkJCQluZXcgQWRhcHRlckltcGwoKSB7CisJCQkJCQkvKioKKwkJCQkJCSAgICogQG92ZXJyaWRlCisJCQkJCQkgICAqLworCQkJCQkJICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpCisJCQkJCQkgIHsKKwkJCQkJCQkgIERlY29yYXRvciBkZWNvcmF0b3IgPSAoRGVjb3JhdG9yKW1zZy5nZXROb3RpZmllcigpOworCQkJCQkJCSAgc3dpdGNoKG1zZy5nZXRGZWF0dXJlSUQoRGVjb3JhdG9yLmNsYXNzKSkgeworCQkJCQkJCSAgCWNhc2UgTW9kZWxQYWNrYWdlLkRFQ09SQVRPUl9fUFJPR1JFU1M6CisJCQkJCQkJICAJCWRvdWJsZSBkZWx0YSA9IChtc2cuZ2V0TmV3RG91YmxlVmFsdWUoKSAtIG1zZy5nZXRPbGREb3VibGVWYWx1ZSgpKTsKKwkJCQkJCQkgIAkJZGVsdGEgLz0gbnVtRGVjb3JhdG9yczsKKwkJCQkJCQkgIAkJc2VsZi5zZXRQcm9ncmVzcyhzZWxmLmdldFByb2dyZXNzKCkrZGVsdGEpOworCQkJCQkJCSAgfQorCQkJCQkJICB9CisJCQkJCX0KKwkJCSk7CisJCX0KKwkJCisJCS8vIFRoZSBzY2VuYXJpbyBkZWNvcmF0b3JzIGFyZSByZWd1bGFyIGRlY29yYXRvcnMgdGhhdCBhcmUgYWxsb3dlZCB0bworCQkvLyBtb2RpZmllZCB0aGUgc3RhdGUgb2YgdGhlIGNhbm9uaWNhbCBncmFwaCB0byBjdXN0b21pemUgaXQgZm9yIGEKKwkJLy8gcGFydGljdWxhciBzY2VuYXJpby4gQXQgdGhpcyBwb2ludCB0aGUgbW9kZWwgZGVjb3JhdG9ycyBoYXZlIGRvbmUKKwkJLy8gdGhlaXIgam9iLiBUaGV5IHdlcmUgaW52b2tlZCBhYm92ZSBpbiB0aGUgY2FsbCB0bworCQkvLyBnZXRDYW5vbmljYWxHcmFwaCgpLiBOb3cgaXQgaXMgdGhlIHR1cm4gb2YgdGhlIHNjZW5hcmlvIGRlY29yYXRvcnMgdG8KKwkJLy8gYWRkIHRoZWlyIGZpbmFsIHRvdWNoIHRvIHRoZSBncmFwaC4gVGhlIHNjZW5hcmlvIGRlY29yYXRvcnMgbmVlZCB0bworCQkvLyBiZSBjb3BpZWQgaG93ZXZlciBzbyB0aGF0IGFueSBzdGF0ZSBpbmZvcm1hdGlvbiB0aGV5IG1heSBnZW5lcmF0ZSBhbmQKKwkJLy8gcmV0YWluIGRvZXMgbm90IGJlY29tZSBwYXJ0IG9mIHRoZSBzY2VuYXJpbyBpdHNlbGYuIAorCisJCUFycmF5TGlzdDxEZWNvcmF0b3I+aW50RGVjb3JhdG9ycyA9IG5ldyBBcnJheUxpc3Q8RGVjb3JhdG9yPigpOworCQlBcnJheUxpc3Q8RGVjb3JhdG9yPm90aGVyRGVjb3JhdG9ycyA9IG5ldyBBcnJheUxpc3Q8RGVjb3JhdG9yPigpOworCQkvLyBMZXQgdGhlIHNjZW5hcmlvIGRlY29yYXRvcnMgZGVjb3JhdGUgdGhlIGdyYXBoCisJCWZvciAoZmluYWwgSXRlcmF0b3I8RGVjb3JhdG9yPiBzY2VuYXJpb0RlY29yYXRvcnMgPSB0aGlzLmdldFNjZW5hcmlvRGVjb3JhdG9ycygpCisJCQkJLml0ZXJhdG9yKCk7IHNjZW5hcmlvRGVjb3JhdG9ycy5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBEZWNvcmF0b3IgZGVjb3JhdG9yID0gKERlY29yYXRvcikgRWNvcmVVdGlsLmNvcHkoc2NlbmFyaW9EZWNvcmF0b3JzLm5leHQoKSk7CisJCQlpZihkZWNvcmF0b3IgaW5zdGFuY2VvZiBJbnRlZ3JhdGlvbkRlY29yYXRvcilpbnREZWNvcmF0b3JzLmFkZChkZWNvcmF0b3IpOworCQkJZWxzZSBvdGhlckRlY29yYXRvcnMuYWRkKGRlY29yYXRvcik7CisJCX0KKwkJZm9yKERlY29yYXRvciBkZWNvcmF0b3I6aW50RGVjb3JhdG9ycykgeworCQkJY2Fub25pY2FsR3JhcGguZ2V0RGVjb3JhdG9ycygpLmFkZChkZWNvcmF0b3IpOworCQkJZGVjb3JhdG9yLmRlY29yYXRlR3JhcGgoc3RhcnQpOworCQkJZGVjb3JhdG9yLnNldEdyYXBoRGVjb3JhdGVkKHRydWUpOworCQl9IAorCQlmb3IoRGVjb3JhdG9yIGRlY29yYXRvcjpvdGhlckRlY29yYXRvcnMpIHsKKwkJCWNhbm9uaWNhbEdyYXBoLmdldERlY29yYXRvcnMoKS5hZGQoZGVjb3JhdG9yKTsKKwkJCWRlY29yYXRvci5kZWNvcmF0ZUdyYXBoKHN0YXJ0KTsKKwkJCWRlY29yYXRvci5zZXRHcmFwaERlY29yYXRlZCh0cnVlKTsKKwkJfSAKKworCQkKKwkJLy8gQXJlIHRoZXJlIGFueSB1bnJlc29sdmVkIGlkZW50aWZpYWJsZXMgaW4gdGhlIGNhbm9uaWNhbCBncmFwaCBhbmQgCisJCS8vIHNob3VsZCB3ZSByZXBvcnQgdGhlbT8KKwkJaWYgKCByZXBvcnRFYWNoVW5yZXNvbHZlZElkZW50aWZpYWJsZSAmJiBjYW5vbmljYWxHcmFwaC5nZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlcygpLnNpemUoKSA+IDApIHsKKwkJCS8vIFllcworCQkJbG9nVW5yZXNvbHZlZElkZW50aWZpYWJsZXMoKTsKKwkJfQorCQkKKwkJLy8gQXJlIHRoZXJlIGFueSB1bnJlc29sdmVkIGlkZW50aWZpYWJsZXMgaW4gdGhlIGNhbm9uaWNhbCBncmFwaCBhbmQgCisJCS8vIHNob3VsZCB3ZSByZXBvcnQgdGhlaXIgbnVtYmVyPworCQlpZiAoIHJlcG9ydE51bWJlcm9mVW5yZXNvbHZlZElkZW50aWZpYWJsZXMgJiYgY2Fub25pY2FsR3JhcGguZ2V0VW5yZXNvbHZlZElkZW50aWZpYWJsZXMoKS5zaXplKCkgPiAwKSB7CisJCQkvLyBZZXMKKwkJCWxvZ051bWJlck9mVW5yZXNvbHZlZElkZW50aWZpYWJsZXMoKTsKKwkJfQorCX0gLy8gaW5pdGlhbGl6ZQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBTdHJpbmcgcHJvZHVjZVRpdGxlKCkgeworCQlTdHJpbmcgcmV0VmFsdWUgPSAiIjsKKwkJaWYgKGR1YmxpbkNvcmUgIT0gbnVsbCkgeworCQkJZmluYWwgU3RyaW5nIHRpdGxlID0gZHVibGluQ29yZS5nZXRUaXRsZSgpOworCQkJcmV0VmFsdWUgPSB0aXRsZSA9PSBudWxsID8gIiIgOiB0aXRsZTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBwcm9kdWNlVGl0bGUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19TT0xWRVI6CisJCQkJcmV0dXJuIGJhc2ljU2V0U29sdmVyKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PERlY29yYXRvcj4gZ2V0U2NlbmFyaW9EZWNvcmF0b3JzKCkgeworCQlpZiAoc2NlbmFyaW9EZWNvcmF0b3JzID09IG51bGwpIHsKKwkJCXNjZW5hcmlvRGVjb3JhdG9ycyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RGVjb3JhdG9yPihEZWNvcmF0b3IuY2xhc3MsIHRoaXMsIFNjZW5hcmlvUGFja2FnZS5TQ0VOQVJJT19fU0NFTkFSSU9fREVDT1JBVE9SUyk7CisJCX0KKwkJcmV0dXJuIHNjZW5hcmlvRGVjb3JhdG9yczsKKwl9CisKKwkvKioKKwkgKiBSZXBvcnQgdGhlIHVucmVzb2x2ZWQgSWRlbnRpZmlhYmxlcyBpbiB0aGUgY2Fub25pY2FsIGdyYXBoCisJICovCisJcHJpdmF0ZSB2b2lkIGxvZ1VucmVzb2x2ZWRJZGVudGlmaWFibGVzKCkgeworCQlmb3IgKEl0ZXJhdG9yPFVucmVzb2x2ZWRJZGVudGlmaWFibGU+IHVucmVzb2x2ZWRJdGVyID0gY2Fub25pY2FsR3JhcGgKKwkJCQkuZ2V0VW5yZXNvbHZlZElkZW50aWZpYWJsZXMoKS5pdGVyYXRvcigpOyB1bnJlc29sdmVkSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBVbnJlc29sdmVkSWRlbnRpZmlhYmxlIHVucmVzb2x2ZWRJRCA9IHVucmVzb2x2ZWRJdGVyCisJCQkJCS5uZXh0KCk7CisJCQkJCisJCQlDb3JlUGx1Z2luLmxvZ0luZm9ybWF0aW9uKCJJbiBzY2VuYXJpbyAiCisJCQkJCSsgcHJvZHVjZVRpdGxlKCkKKwkJCQkJKyAiXCIsIG1vZGVsIFwiIgorCQkJCQkrIHVucmVzb2x2ZWRJRC5nZXRNb2RlbCgpLmdldER1YmxpbkNvcmUoKQorCQkJCQkJCS5nZXRUaXRsZSgpCisJCQkJCSsgIlwiLCAgdGhlIFVSSSBcIiIKKwkJCQkJKyB1bnJlc29sdmVkSUQuZ2V0VW5yZXNvbHZlZFVSSSgpCisJCQkJCSsgIlwiIHdhcyB1bnJlc29sdmVkLiIKKwkKKwkJCSwgbnVsbCk7CisJCX0gLy8gZm9yIGVhY2ggdW5yZXNvbHZlZCBpZGVudGlmaWFibGUKKwl9IC8vIHJlcG9ydFVucmVzb2x2ZWRJZGVudGlmaWFibGVzCisKKwkvKioKKwkgKiBSZXBvcnQgdGhlIG51bWJlciBvZiB1bnJlc29sdmVkIElkZW50aWZpYWJsZXMgaW4gdGhlIGNhbm9uaWNhbCBncmFwaC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgbG9nTnVtYmVyT2ZVbnJlc29sdmVkSWRlbnRpZmlhYmxlcygpIHsKKwkJQ29yZVBsdWdpbi5sb2dJbmZvcm1hdGlvbigiSW4gc2NlbmFyaW8gXCIiCisJCQkJKyBwcm9kdWNlVGl0bGUoKQorCQkJCSsgIlwiLCB0aGVyZSB3ZXJlICIKKwkJCQkrIGNhbm9uaWNhbEdyYXBoLmdldFVucmVzb2x2ZWRJZGVudGlmaWFibGVzKCkuc2l6ZSgpCisJCQkJKyAiIHVucmVzb2x2ZWQgcmVmZXJlbmNlcy4iCisJCSwgbnVsbCk7CisJCQorCX0gLy8gbG9nTnVtYmVyT2ZVbnJlc29sdmVkSWRlbnRpZmlhYmxlcworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19NT0RFTDoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1vZGVsKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0TW9kZWwoKTsKKwkJCWNhc2UgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19TRVFVRU5DRVI6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTZXF1ZW5jZXIoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRTZXF1ZW5jZXIoKTsKKwkJCWNhc2UgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19TQ0VOQVJJT19ERUNPUkFUT1JTOgorCQkJCXJldHVybiBnZXRTY2VuYXJpb0RlY29yYXRvcnMoKTsKKwkJCWNhc2UgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19DQU5PTklDQUxfR1JBUEg6CisJCQkJcmV0dXJuIGdldENhbm9uaWNhbEdyYXBoKCk7CisJCQljYXNlIFNjZW5hcmlvUGFja2FnZS5TQ0VOQVJJT19fUFJPR1JFU1M6CisJCQkJcmV0dXJuIGdldFByb2dyZXNzKCk7CisJCQljYXNlIFNjZW5hcmlvUGFja2FnZS5TQ0VOQVJJT19fU09MVkVSOgorCQkJCXJldHVybiBnZXRTb2x2ZXIoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFNjZW5hcmlvUGFja2FnZS5TQ0VOQVJJT19fTU9ERUw6CisJCQkJc2V0TW9kZWwoKE1vZGVsKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFNjZW5hcmlvUGFja2FnZS5TQ0VOQVJJT19fU0VRVUVOQ0VSOgorCQkJCXNldFNlcXVlbmNlcigoU2VxdWVuY2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFNjZW5hcmlvUGFja2FnZS5TQ0VOQVJJT19fU0NFTkFSSU9fREVDT1JBVE9SUzoKKwkJCQlnZXRTY2VuYXJpb0RlY29yYXRvcnMoKS5jbGVhcigpOworCQkJCWdldFNjZW5hcmlvRGVjb3JhdG9ycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVjb3JhdG9yPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTY2VuYXJpb1BhY2thZ2UuU0NFTkFSSU9fX1BST0dSRVNTOgorCQkJCXNldFByb2dyZXNzKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19TT0xWRVI6CisJCQkJc2V0U29sdmVyKChTb2x2ZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTY2VuYXJpb1BhY2thZ2UuU0NFTkFSSU9fX01PREVMOgorCQkJCXNldE1vZGVsKChNb2RlbCludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFNjZW5hcmlvUGFja2FnZS5TQ0VOQVJJT19fU0VRVUVOQ0VSOgorCQkJCXNldFNlcXVlbmNlcigoU2VxdWVuY2VyKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19TQ0VOQVJJT19ERUNPUkFUT1JTOgorCQkJCWdldFNjZW5hcmlvRGVjb3JhdG9ycygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTY2VuYXJpb1BhY2thZ2UuU0NFTkFSSU9fX1BST0dSRVNTOgorCQkJCXNldFByb2dyZXNzKFBST0dSRVNTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFNjZW5hcmlvUGFja2FnZS5TQ0VOQVJJT19fU09MVkVSOgorCQkJCXNldFNvbHZlcigoU29sdmVyKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19NT0RFTDoKKwkJCQlyZXR1cm4gbW9kZWwgIT0gbnVsbDsKKwkJCWNhc2UgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19TRVFVRU5DRVI6CisJCQkJcmV0dXJuIHNlcXVlbmNlciAhPSBudWxsOworCQkJY2FzZSBTY2VuYXJpb1BhY2thZ2UuU0NFTkFSSU9fX1NDRU5BUklPX0RFQ09SQVRPUlM6CisJCQkJcmV0dXJuIHNjZW5hcmlvRGVjb3JhdG9ycyAhPSBudWxsICYmICFzY2VuYXJpb0RlY29yYXRvcnMuaXNFbXB0eSgpOworCQkJY2FzZSBTY2VuYXJpb1BhY2thZ2UuU0NFTkFSSU9fX0NBTk9OSUNBTF9HUkFQSDoKKwkJCQlyZXR1cm4gY2Fub25pY2FsR3JhcGggIT0gbnVsbDsKKwkJCWNhc2UgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19QUk9HUkVTUzoKKwkJCQlyZXR1cm4gcHJvZ3Jlc3MgIT0gUFJPR1JFU1NfRURFRkFVTFQ7CisJCQljYXNlIFNjZW5hcmlvUGFja2FnZS5TQ0VOQVJJT19fU09MVkVSOgorCQkJCXJldHVybiBzb2x2ZXIgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvbW1vbi5pbXBsLklkZW50aWZpYWJsZUltcGwjdG9TdHJpbmcoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJLy8gSWYgdGhlcmUgaXMgYSB0aXRsZSB0aGVuIHdlIHVzZSB0aGF0IG90aGVyd2lzZSB3ZSBsZXQgdGhlIHN1cGVyIGNsYXNzCisJCS8vIGhhbmRsZSBpdAorCQlmaW5hbCBTdHJpbmcgdGl0bGUgPSBnZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKTsKKwkJcmV0dXJuICh0aXRsZSAhPSBudWxsID8gdGl0bGUgOiBzdXBlci50b1N0cmluZygpKTsKKwl9IC8vIHRvU3RyaW5nCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29tbW9uLmltcGwuSWRlbnRpZmlhYmxlSW1wbCNzYW5lKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5zYW5lKCk7CisKKwkJaWYgKHJldFZhbHVlICYmIG1vZGVsICE9IG51bGwpIHsKKwkJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgbW9kZWwuc2FuZSgpOworCQkJYXNzZXJ0IHJldFZhbHVlOworCQl9CisKKwkJaWYgKHJldFZhbHVlICYmIGNhbm9uaWNhbEdyYXBoICE9IG51bGwpIHsKKwkJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgY2Fub25pY2FsR3JhcGguc2FuZSgpOworCQkJYXNzZXJ0IHJldFZhbHVlOworCQl9CisKKwkJaWYgKHJldFZhbHVlICYmIHNlcXVlbmNlciAhPSBudWxsKSB7CisJCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIHNlcXVlbmNlci5zYW5lKCk7CisJCQlhc3NlcnQgcmV0VmFsdWU7CisJCX0KKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBzYW5lCisKK30gLy8gU2NlbmFyaW9JbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby9pbXBsL1NjZW5hcmlvUGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvL2ltcGwvU2NlbmFyaW9QYWNrYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYmE3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby9pbXBsL1NjZW5hcmlvUGFja2FnZUltcGwuamF2YQpAQCAtMCwwICsxLDMxMiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuQ29tbW9uUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuaW1wbC5FeHBlcmltZW50UGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5HcmFwaFBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW9QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5TZXF1ZW5jZXJQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5pbXBsLlNvbHZlclBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLmltcGwuVHJpZ2dlclBhY2thZ2VJbXBsOworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTY2VuYXJpb1BhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgU2NlbmFyaW9QYWNrYWdlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzY2VuYXJpb0VDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKKwkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KKwkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCisJICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKKwkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW9QYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBTY2VuYXJpb1BhY2thZ2VJbXBsKCkgeworCQlzdXBlcihlTlNfVVJJLCBTY2VuYXJpb0ZhY3RvcnkuZUlOU1RBTkNFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCisJICogCisJICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBTY2VuYXJpb1BhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFNjZW5hcmlvUGFja2FnZSBpbml0KCkgeworCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoU2NlbmFyaW9QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNjZW5hcmlvUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCisJCVNjZW5hcmlvUGFja2FnZUltcGwgdGhlU2NlbmFyaW9QYWNrYWdlID0gKFNjZW5hcmlvUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIFNjZW5hcmlvUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgU2NlbmFyaW9QYWNrYWdlSW1wbCgpKTsKKworCQlpc0luaXRlZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCisJCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisKKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKKwkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJRXhwZXJpbWVudFBhY2thZ2VJbXBsIHRoZUV4cGVyaW1lbnRQYWNrYWdlID0gKEV4cGVyaW1lbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRXhwZXJpbWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFeHBlcmltZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFeHBlcmltZW50UGFja2FnZS5lTlNfVVJJKSA6IEV4cGVyaW1lbnRQYWNrYWdlLmVJTlNUQU5DRSk7CisJCUdyYXBoUGFja2FnZUltcGwgdGhlR3JhcGhQYWNrYWdlID0gKEdyYXBoUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEdyYXBoUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEdyYXBoUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShHcmFwaFBhY2thZ2UuZU5TX1VSSSkgOiBHcmFwaFBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJTW9kZWxQYWNrYWdlSW1wbCB0aGVNb2RlbFBhY2thZ2UgPSAoTW9kZWxQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kZWxQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgTW9kZWxQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGVsUGFja2FnZS5lTlNfVVJJKSA6IE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UpOworCQlNb2RpZmllclBhY2thZ2VJbXBsIHRoZU1vZGlmaWVyUGFja2FnZSA9IChNb2RpZmllclBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RpZmllclBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBNb2RpZmllclBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kaWZpZXJQYWNrYWdlLmVOU19VUkkpIDogTW9kaWZpZXJQYWNrYWdlLmVJTlNUQU5DRSk7CisJCVByZWRpY2F0ZVBhY2thZ2VJbXBsIHRoZVByZWRpY2F0ZVBhY2thZ2UgPSAoUHJlZGljYXRlUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFByZWRpY2F0ZVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBQcmVkaWNhdGVQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFByZWRpY2F0ZVBhY2thZ2UuZU5TX1VSSSkgOiBQcmVkaWNhdGVQYWNrYWdlLmVJTlNUQU5DRSk7CisJCVNlcXVlbmNlclBhY2thZ2VJbXBsIHRoZVNlcXVlbmNlclBhY2thZ2UgPSAoU2VxdWVuY2VyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNlcXVlbmNlclBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBTZXF1ZW5jZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNlcXVlbmNlclBhY2thZ2UuZU5TX1VSSSkgOiBTZXF1ZW5jZXJQYWNrYWdlLmVJTlNUQU5DRSk7CisJCVRyaWdnZXJQYWNrYWdlSW1wbCB0aGVUcmlnZ2VyUGFja2FnZSA9IChUcmlnZ2VyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRyaWdnZXJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVHJpZ2dlclBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVHJpZ2dlclBhY2thZ2UuZU5TX1VSSSkgOiBUcmlnZ2VyUGFja2FnZS5lSU5TVEFOQ0UpOworCQlTb2x2ZXJQYWNrYWdlSW1wbCB0aGVTb2x2ZXJQYWNrYWdlID0gKFNvbHZlclBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTb2x2ZXJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgU29sdmVyUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTb2x2ZXJQYWNrYWdlLmVOU19VUkkpIDogU29sdmVyUGFja2FnZS5lSU5TVEFOQ0UpOworCisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCisJCXRoZVNjZW5hcmlvUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlRXhwZXJpbWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUdyYXBoUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlTW9kZWxQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVNb2RpZmllclBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVByZWRpY2F0ZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNlcXVlbmNlclBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVRyaWdnZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVTb2x2ZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKwkJdGhlU2NlbmFyaW9QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUV4cGVyaW1lbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlR3JhcGhQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlTW9kZWxQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlTW9kaWZpZXJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlUHJlZGljYXRlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNlcXVlbmNlclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVUcmlnZ2VyUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNvbHZlclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKwkJdGhlU2NlbmFyaW9QYWNrYWdlLmZyZWV6ZSgpOworCisgIAorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KFNjZW5hcmlvUGFja2FnZS5lTlNfVVJJLCB0aGVTY2VuYXJpb1BhY2thZ2UpOworCQlyZXR1cm4gdGhlU2NlbmFyaW9QYWNrYWdlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U2NlbmFyaW8oKSB7CisJCXJldHVybiBzY2VuYXJpb0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTY2VuYXJpb19Nb2RlbCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNjZW5hcmlvRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2NlbmFyaW9fU2VxdWVuY2VyKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2NlbmFyaW9FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTY2VuYXJpb19TY2VuYXJpb0RlY29yYXRvcnMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzY2VuYXJpb0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNjZW5hcmlvX0Nhbm9uaWNhbEdyYXBoKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2NlbmFyaW9FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTY2VuYXJpb19Qcm9ncmVzcygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNjZW5hcmlvRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2NlbmFyaW9fU29sdmVyKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2NlbmFyaW9FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU2NlbmFyaW9GYWN0b3J5IGdldFNjZW5hcmlvRmFjdG9yeSgpIHsKKwkJcmV0dXJuIChTY2VuYXJpb0ZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcworCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKKwkJaXNDcmVhdGVkID0gdHJ1ZTsKKworCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJc2NlbmFyaW9FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0NFTkFSSU8pOworCQljcmVhdGVFUmVmZXJlbmNlKHNjZW5hcmlvRUNsYXNzLCBTQ0VOQVJJT19fTU9ERUwpOworCQljcmVhdGVFUmVmZXJlbmNlKHNjZW5hcmlvRUNsYXNzLCBTQ0VOQVJJT19fU0VRVUVOQ0VSKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzY2VuYXJpb0VDbGFzcywgU0NFTkFSSU9fX1NDRU5BUklPX0RFQ09SQVRPUlMpOworCQljcmVhdGVFUmVmZXJlbmNlKHNjZW5hcmlvRUNsYXNzLCBTQ0VOQVJJT19fQ0FOT05JQ0FMX0dSQVBIKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzY2VuYXJpb0VDbGFzcywgU0NFTkFSSU9fX1BST0dSRVNTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzY2VuYXJpb0VDbGFzcywgU0NFTkFSSU9fX1NPTFZFUik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOworCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKKwkJc2V0TmFtZShlTkFNRSk7CisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOworCQlzZXROc1VSSShlTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCisJCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7CisJCU1vZGVsUGFja2FnZSB0aGVNb2RlbFBhY2thZ2UgPSAoTW9kZWxQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGVsUGFja2FnZS5lTlNfVVJJKTsKKwkJU2VxdWVuY2VyUGFja2FnZSB0aGVTZXF1ZW5jZXJQYWNrYWdlID0gKFNlcXVlbmNlclBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU2VxdWVuY2VyUGFja2FnZS5lTlNfVVJJKTsKKwkJR3JhcGhQYWNrYWdlIHRoZUdyYXBoUGFja2FnZSA9IChHcmFwaFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoR3JhcGhQYWNrYWdlLmVOU19VUkkpOworCQlTb2x2ZXJQYWNrYWdlIHRoZVNvbHZlclBhY2thZ2UgPSAoU29sdmVyUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTb2x2ZXJQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCXNjZW5hcmlvRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SWRlbnRpZmlhYmxlKCkpOworCisJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCWluaXRFQ2xhc3Moc2NlbmFyaW9FQ2xhc3MsIFNjZW5hcmlvLmNsYXNzLCAiU2NlbmFyaW8iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U2NlbmFyaW9fTW9kZWwoKSwgdGhlTW9kZWxQYWNrYWdlLmdldE1vZGVsKCksIG51bGwsICJtb2RlbCIsIG51bGwsIDAsIDEsIFNjZW5hcmlvLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFNjZW5hcmlvX1NlcXVlbmNlcigpLCB0aGVTZXF1ZW5jZXJQYWNrYWdlLmdldFNlcXVlbmNlcigpLCBudWxsLCAic2VxdWVuY2VyIiwgbnVsbCwgMCwgMSwgU2NlbmFyaW8uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U2NlbmFyaW9fU2NlbmFyaW9EZWNvcmF0b3JzKCksIHRoZU1vZGVsUGFja2FnZS5nZXREZWNvcmF0b3IoKSwgbnVsbCwgInNjZW5hcmlvRGVjb3JhdG9ycyIsIG51bGwsIDAsIC0xLCBTY2VuYXJpby5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRTY2VuYXJpb19DYW5vbmljYWxHcmFwaCgpLCB0aGVHcmFwaFBhY2thZ2UuZ2V0R3JhcGgoKSwgbnVsbCwgImNhbm9uaWNhbEdyYXBoIiwgbnVsbCwgMCwgMSwgU2NlbmFyaW8uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTY2VuYXJpb19Qcm9ncmVzcygpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAicHJvZ3Jlc3MiLCAiMC4wIiwgMCwgMSwgU2NlbmFyaW8uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RVJlZmVyZW5jZShnZXRTY2VuYXJpb19Tb2x2ZXIoKSwgdGhlU29sdmVyUGFja2FnZS5nZXRTb2x2ZXIoKSwgbnVsbCwgInNvbHZlciIsIG51bGwsIDAsIDEsIFNjZW5hcmlvLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJYWRkRU9wZXJhdGlvbihzY2VuYXJpb0VDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJzdGVwIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWFkZEVPcGVyYXRpb24oc2NlbmFyaW9FQ2xhc3MsIG51bGwsICJyZXNldCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlhZGRFT3BlcmF0aW9uKHNjZW5hcmlvRUNsYXNzLCBudWxsLCAiaW5pdGlhbGl6ZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlhZGRFT3BlcmF0aW9uKHNjZW5hcmlvRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicHJvZHVjZVRpdGxlIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIENyZWF0ZSByZXNvdXJjZQorCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKwl9CisKK30gLy9TY2VuYXJpb1BhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby9wcm92aWRlci9TY2VuYXJpb0VkaXRQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvL3Byb3ZpZGVyL1NjZW5hcmlvRWRpdFBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MmVlMDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby9wcm92aWRlci9TY2VuYXJpb0VkaXRQbHVnaW4uamF2YQpAQCAtMCwwICsxLDEwNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5FTUZQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5FY2xpcHNlVUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvbW1vbkVkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLkdyYXBoRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTW9kZWxFZGl0UGx1Z2luOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgU2NlbmFyaW8gZWRpdG9yIHBsdWdpbi4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNjZW5hcmlvRWRpdFBsdWdpbiBleHRlbmRzIEVNRlBsdWdpbiB7CisJLyoqCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2NlbmFyaW9FZGl0UGx1Z2luIElOU1RBTkNFID0gbmV3IFNjZW5hcmlvRWRpdFBsdWdpbigpOworCisJLyoqCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNjZW5hcmlvRWRpdFBsdWdpbigpIHsKKwkJc3VwZXIKKwkJICAobmV3IFJlc291cmNlTG9jYXRvciBbXSB7CisJCSAgICAgTW9kZWxFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkgICAgIENvbW1vbkVkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCSAgICAgR3JhcGhFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkgICB9KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKKwkvKioKKwkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlBsdWdpbjwvYj4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbiBleHRlbmRzIEVjbGlwc2VVSVBsdWdpbiB7CisJCS8qKgorCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgeworCQkJc3VwZXIoKTsKKworCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4KKwkJCS8vCisJCQlwbHVnaW4gPSB0aGlzOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby9wcm92aWRlci9TY2VuYXJpb0l0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2NlbmFyaW8vcHJvdmlkZXIvU2NlbmFyaW9JdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWU3NTIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2NlbmFyaW8vcHJvdmlkZXIvU2NlbmFyaW9JdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQwMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuVXRpbGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuSWRlbnRpZmlhYmxlSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW99IG9iamVjdC4gPCEtLQorICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTY2VuYXJpb0l0ZW1Qcm92aWRlciBleHRlbmRzIElkZW50aWZpYWJsZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTY2VuYXJpb0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisJCisJLyoqCisJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKKwkJCU9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOworCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoU2NlbmFyaW9QYWNrYWdlLkxpdGVyYWxzLlNDRU5BUklPX19NT0RFTCk7CisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChTY2VuYXJpb1BhY2thZ2UuTGl0ZXJhbHMuU0NFTkFSSU9fX1NFUVVFTkNFUik7CisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChTY2VuYXJpb1BhY2thZ2UuTGl0ZXJhbHMuU0NFTkFSSU9fX1NDRU5BUklPX0RFQ09SQVRPUlMpOworCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoU2NlbmFyaW9QYWNrYWdlLkxpdGVyYWxzLlNDRU5BUklPX19TT0xWRVIpOworCQl9CisJCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKKwkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgorCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCisKKwkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgU2NlbmFyaW8uZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCisJCQkJImZ1bGwvY3VzdG9tb2JqMTYvU2NlbmFyaW8iKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlVUkkgbGFiZWxWYWx1ZSA9ICgoU2NlbmFyaW8pb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9TY2VuYXJpb190eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9TY2VuYXJpb190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2NlbmFyaW8uY2xhc3MpKSB7CisJCQljYXNlIFNjZW5hcmlvUGFja2FnZS5TQ0VOQVJJT19fUFJPR1JFU1M6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19NT0RFTDoKKwkJCWNhc2UgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19TRVFVRU5DRVI6CisJCQljYXNlIFNjZW5hcmlvUGFja2FnZS5TQ0VOQVJJT19fU0NFTkFSSU9fREVDT1JBVE9SUzoKKwkJCWNhc2UgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19TT0xWRVI6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cworCSAqIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAorCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFNjZW5hcmlvUGFja2FnZS5MaXRlcmFscy5TQ0VOQVJJT19fTU9ERUwsCisJCQkJIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTW9kZWwoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoU2NlbmFyaW9QYWNrYWdlLkxpdGVyYWxzLlNDRU5BUklPX19TRVFVRU5DRVIsCisJCQkJIFNlcXVlbmNlckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcXVlbnRpYWxTZXF1ZW5jZXIoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoU2NlbmFyaW9QYWNrYWdlLkxpdGVyYWxzLlNDRU5BUklPX19TRVFVRU5DRVIsCisJCQkJIFNlcXVlbmNlckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlYWxUaW1lU2VxdWVuY2VyKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFNjZW5hcmlvUGFja2FnZS5MaXRlcmFscy5TQ0VOQVJJT19fU09MVkVSLAorCQkJCSBTb2x2ZXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTb2x2ZXIoKSkpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVBZGRDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAorCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCisJICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgaW50KQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCisJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKKwkJZmluYWwgQ29sbGVjdGlvbiBpZGVudGlmaWFibGVDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOworCQlmb3IgKE9iamVjdCB2YWx1ZSA6IGNvbGxlY3Rpb24pIHsKKworCQkJT2JqZWN0IHRlbXAgPSB2YWx1ZTsKKwkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIElGaWxlKSB7CisJCQkJLy8gWWVzCisJCQkJZmluYWwgSUZpbGUgaUZpbGUgPSAoSUZpbGUpIHZhbHVlOworCQkJCWZpbmFsIFVSSSB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShpRmlsZS5nZXRMb2NhdGlvbigpCisJCQkJCQkudG9TdHJpbmcoKSk7CisJCQkJZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50aWZhYmxlID0gVXRpbGl0eS5nZXRJZGVudGlmaWFibGUodXJpKTsKKwkJCQlpZGVudGlmaWFibGVDb2xsZWN0aW9uLmFkZChpZGVudGlmYWJsZSk7CisJCQkJdGVtcCA9IGlkZW50aWZhYmxlOworCQkJfSAvLyBpZiBJRmlsZQorCisJCQllbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJCS8vIFllcworCQkJCWZpbmFsIFN0cmluZyB1cmlTdHJpbmcgPSAoU3RyaW5nKSB2YWx1ZTsKKwkJCQl0cnkgeworCQkJCQlmaW5hbCBVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSSh1cmlTdHJpbmcpOworCQkJCQlmaW5hbCBJZGVudGlmaWFibGUgaWRlbnRpZmFibGUgPSBVdGlsaXR5CisJCQkJCQkJLmdldElkZW50aWZpYWJsZSh1cmkpOworCQkJCQl0ZW1wID0gaWRlbnRpZmFibGU7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gSWdub3JlIGl0CisJCQkJfQorCQkJfSAvLyBpZiBTdHJpbmcKKworCQkJaWYgKHRlbXAgaW5zdGFuY2VvZiBJZGVudGlmaWFibGUpIHsKKwkJCQlpZGVudGlmaWFibGVDb2xsZWN0aW9uLmFkZCh0ZW1wKTsKKwkJCX0KKwkJfSAvLyBmb3IgZWFjaCBPYmplY3QKKworCQlyZXR1cm4gc3VwZXIuY3JlYXRlQWRkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLAorCQkJCWlkZW50aWZpYWJsZUNvbGxlY3Rpb24sIGluZGV4KTsKKwl9IC8vIGNyZWF0ZUFkZENvbW1hbmQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVTZXRDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAorCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCisJICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlU2V0Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKKwkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgeworCQkvLyBBcmUgd2Ugc2V0dGluZyB0aGUgbW9kZWwgZHVyaW5nIGEgZHJhZyBhbmQgZHJvcD8KKwkJT2JqZWN0IHRlbXAgPSB2YWx1ZTsKKworCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJRmlsZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBJRmlsZSBpRmlsZSA9IChJRmlsZSkgdmFsdWU7CisJCQlmaW5hbCBVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkoaUZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKKwkJCWZpbmFsIElkZW50aWZpYWJsZSBpZGVudGlmYWJsZSA9IFV0aWxpdHkuZ2V0SWRlbnRpZmlhYmxlKHVyaSk7CisJCQl0ZW1wID0gaWRlbnRpZmFibGU7CisJCX0gLy8gaWYgSUZpbGUKKworCQllbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJLy8gWWVzCisJCQkvLyBUaGVzZSBjb21lIGZyb20gSWRlbnRpZmFibGVQbHVnaW5WaWV3CisJCQlmaW5hbCBTdHJpbmcgdXJpU3RyaW5nID0gKFN0cmluZykgdmFsdWU7CisJCQl0cnkgeworCQkJCWZpbmFsIFVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaVN0cmluZyk7CisJCQkJZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50aWZhYmxlID0gVXRpbGl0eS5nZXRJZGVudGlmaWFibGUodXJpKTsKKwkJCQl0ZW1wID0gaWRlbnRpZmFibGU7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCS8vIElnbm9yZSBpdAorCQkJfQorCQl9IC8vIGlmIFN0cmluZworCisJCWlmICh0ZW1wIGluc3RhbmNlb2YgTW9kZWwpIHsKKwkJCXJldHVybiBzdXBlci5jcmVhdGVTZXRDb21tYW5kKGRvbWFpbiwgb3duZXIsCisJCQkJCVNjZW5hcmlvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2NlbmFyaW9fTW9kZWwoKSwgdGVtcCwgaW5kZXgpOworCQl9IGVsc2UgaWYgKHRlbXAgaW5zdGFuY2VvZiBTZXF1ZW5jZXIpIHsKKwkJCXJldHVybiBzdXBlci5jcmVhdGVTZXRDb21tYW5kKGRvbWFpbiwgb3duZXIsCisJCQkJCVNjZW5hcmlvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2NlbmFyaW9fU2VxdWVuY2VyKCksIHRlbXAsCisJCQkJCWluZGV4KTsKKwkJfSAvLyBpZgorCQllbHNlIGlmICh0ZW1wIGluc3RhbmNlb2YgRGVjb3JhdG9yKSB7CisJCQlyZXR1cm4gc3VwZXIKKwkJCQkJLmNyZWF0ZUFkZENvbW1hbmQoCisJCQkJCQkJZG9tYWluLAorCQkJCQkJCW93bmVyLAorCQkJCQkJCVNjZW5hcmlvUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCQkJCS5nZXRTY2VuYXJpbygpCisJCQkJCQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKAorCQkJCQkJCQkJCQlTY2VuYXJpb1BhY2thZ2UuU0NFTkFSSU9fX1NDRU5BUklPX0RFQ09SQVRPUlMpLAorCQkJCQkJCUFycmF5cy5hc0xpc3QoKG5ldyBPYmplY3RbXSB7IHRlbXAgfSkpLCBpbmRleCk7CisJCX0gLy8gaWYKKwkJZWxzZSB7CisKKwkJCXJldHVybiBzdXBlci5jcmVhdGVTZXRDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIHZhbHVlLCBpbmRleCk7CisJCX0KKwl9IC8vIGNyZWF0ZVNldENvbW1hbmQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCisJICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBmbG9hdCwgaW50LCBpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKKwkJCU9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAorCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisJCS8vIFdlIGFkZCBETkQuRFJPUF9MSU5LIGFzIGFuIGFsbG93ZWQgb3BlcmF0aW9uIGJlY2F1c2UgYWxsIGRyb3BzIHdpbGwKKwkJLy8gYmUgbGlua3MgYW5kIHNvbWUgc291cmNlcyBkb24ndCBhbGxvdyBsaW5rcywgd2UgY29udmVydCB0byBsaW5rcworCQkvLyBhbnl3YXkKKwkJcmV0dXJuIHN1cGVyLmNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIG93bmVyLCBsb2NhdGlvbiwKKwkJCQlvcGVyYXRpb25zIHwgRE5ELkRST1BfTElOSywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKKwl9IC8vIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZAorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAorCQkJRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LAorCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisKKwkJcmV0dXJuIG5ldyBDcmVhdGVDaGlsZENvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgdmFsdWUsCisJCQkJY29sbGVjdGlvbiwgdGhpcykgeworCQkJLyoqCisJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kI2NyZWF0ZUNvbW1hbmQoKQorCQkJICovCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoKSB7CisKKwkJCQlDb21tYW5kIHJldFZhbHVlID0gbnVsbDsKKworCQkJCWZpbmFsIENvbW1hbmQgY3JlYXRlQ2hpbGRDb21tYW5kID0gc3VwZXIuY3JlYXRlQ29tbWFuZCgpOworCisJCQkJLy8gQXJlIHdlIGNyZWF0aW5nIGEgTW9kZWw/CisJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgTW9kZWwpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWZpbmFsIE1vZGVsIG1vZGVsID0gKE1vZGVsKSBjaGlsZDsKKwkJCQkJLy8gRG9lcyB0aGUgbW9kZWwgaGF2ZSBhIHJlc291cmNlIGFscmVhZHk/CisJCQkJCWlmIChtb2RlbC5lUmVzb3VyY2UoKSA9PSBudWxsKSB7CisJCQkJCQkvLyBObworCQkJCQkJZmluYWwgUmVzb3VyY2UgcGFyZW50UmVzb3VyY2UgPSBvd25lci5lUmVzb3VyY2UoKTsKKwkJCQkJCWZpbmFsIENvbW1hbmQgYWRkQ29tbWFuZCA9IG5ldyBBZGRDb21tYW5kKGRvbWFpbiwKKwkJCQkJCQkJcGFyZW50UmVzb3VyY2UuZ2V0Q29udGVudHMoKSwgbW9kZWwpOworCisJCQkJCQlmaW5hbCBDb21wb3VuZENvbW1hbmQgY29tcG91bmRDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZCgKKwkJCQkJCQkJMCwgY3JlYXRlQ2hpbGRDb21tYW5kLmdldExhYmVsKCksCisJCQkJCQkJCWNyZWF0ZUNoaWxkQ29tbWFuZC5nZXREZXNjcmlwdGlvbigpKTsKKwkJCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQoY3JlYXRlQ2hpbGRDb21tYW5kKTsKKwkJCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQoYWRkQ29tbWFuZCk7CisJCQkJCQlyZXRWYWx1ZSA9IGNvbXBvdW5kQ29tbWFuZDsKKwkJCQkJfSAvLyBpZiBNb2RlbCBkb2VzIG5vdCBoYXZlIGEgcmVzb3VyY2UKKwkJCQl9IC8vIGlmIE1vZGVsCisJCQkJZWxzZSB7CisJCQkJCXJldFZhbHVlID0gY3JlYXRlQ2hpbGRDb21tYW5kOworCQkJCX0KKworCQkJCXJldHVybiByZXRWYWx1ZTsKKwkJCX0KKwkJfTsgLy8gQ3JlYXRlQ2hpbGRDb21tYW5kCisKKwl9Ly8gY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaXNXcmFwcGluZ05lZWRlZChqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgeworCQkvLyByZXR1cm4gc3VwZXIuaXNXcmFwcGluZ05lZWRlZChvYmplY3QpOworCQkvLyBXZSByZXR1cm4gdHJ1ZSBzbyB0aGF0IG5vbi1jb250YWlubWVudCByZWZlcmVuY2VzIGFyZSB3cmFwcGVkLiBUaGlzCisJCS8vIGVuYWJsZXMgdGhlIGRlbGV0ZSBjb21tYW5kIGluIHRoZSBlZGl0b3IncyBjb250ZXh0IG1lbnUuCisJCXJldHVybiB0cnVlOworCX0gLy8gaXNXcmFwcGluZ05lZWRlZAorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9IC8vIFNjZW5hcmlvSXRlbVByb3ZpZGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby9wcm92aWRlci9TY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby9wcm92aWRlci9TY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyNGY1MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvL3Byb3ZpZGVyL1NjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDIwOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EaXNwb3NhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLnV0aWwuU2NlbmFyaW9BZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuCisgKiBUaGUgYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4KKyAqIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCisgKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgU2NlbmFyaW9BZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNjZW5hcmlvSXRlbVByb3ZpZGVyIHNjZW5hcmlvSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb30uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2NlbmFyaW9BZGFwdGVyKCkgeworCQlpZiAoc2NlbmFyaW9JdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJc2NlbmFyaW9JdGVtUHJvdmlkZXIgPSBuZXcgU2NlbmFyaW9JdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gc2NlbmFyaW9JdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7CisJCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOworCX0KKworCS8qKgorCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKKwkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7CisJCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgeworCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgeworCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOworCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzPD8+KSB8fCAoKChDbGFzczw/Pil0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgeworCQkJCXJldHVybiBhZGFwdGVyOworCQkJfQorCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKKwkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9IGFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisKKwkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKKwkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGRpc3Bvc2VzIGFsbCBvZiB0aGUgaXRlbSBwcm92aWRlcnMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkuIAorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWlmIChzY2VuYXJpb0l0ZW1Qcm92aWRlciAhPSBudWxsKSBzY2VuYXJpb0l0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby91dGlsL1NjZW5hcmlvQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvL3V0aWwvU2NlbmFyaW9BZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NTkyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby91dGlsL1NjZW5hcmlvQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE2MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8udXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby4qOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb1BhY2thZ2U7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLiBJdAorICogcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUKKyAqIG1vZGVsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU2NlbmFyaW9BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFNjZW5hcmlvUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNjZW5hcmlvQWRhcHRlckZhY3RvcnkoKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gU2NlbmFyaW9QYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4KKwkgKiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZgorCSAqIHRoZSBtb2RlbC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7CisJCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU2NlbmFyaW9Td2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgU2NlbmFyaW9Td2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTY2VuYXJpbyhTY2VuYXJpbyBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU2NlbmFyaW9BZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyA8VD4gQWRhcHRlciBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworCQkJfQorCQl9OworCisJLyoqCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbyA8ZW0+U2NlbmFyaW88L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdAorCSAqIHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2UKKwkgKiB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTY2VuYXJpb0FkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YS5sYW5nLkNvbXBhcmFibGUgPGVtPkNvbXBhcmFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcGFyYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUgPGVtPklkZW50aWZpYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0CisJICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQorCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMKKwkgKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy8gU2NlbmFyaW9BZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2NlbmFyaW8vdXRpbC9TY2VuYXJpb1N3aXRjaC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2NlbmFyaW8vdXRpbC9TY2VuYXJpb1N3aXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZDMzODYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby91dGlsL1NjZW5hcmlvU3dpdGNoLmphdmEKQEAgLTAsMCArMSwxNjIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLnV0aWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby4qOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb1BhY2thZ2U7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UKKyAqIGhpZXJhcmNoeS4gSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQorICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAorICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QgYW5kIHByb2NlZWRpbmcgdXAgdGhlCisgKiBpbmhlcml0YW5jZSBoaWVyYXJjaHkgdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsIHdoaWNoIGlzIHRoZQorICogcmVzdWx0IG9mIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW9QYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTY2VuYXJpb1N3aXRjaDxUMT4geworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFNjZW5hcmlvUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNjZW5hcmlvU3dpdGNoKCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IFNjZW5hcmlvUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOworCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQxIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOworCQl9CisJCWVsc2UgeworCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7CisJCQlyZXR1cm4KKwkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPworCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6CisJCQkJCWRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUMSBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKKwkJCWNhc2UgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPOiB7CisJCQkJU2NlbmFyaW8gc2NlbmFyaW8gPSAoU2NlbmFyaW8pdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU2NlbmFyaW8oc2NlbmFyaW8pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShzY2VuYXJpbyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShzY2VuYXJpbyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2NlbmFyaW88L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNjZW5hcmlvPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVNjZW5hcmlvKFNjZW5hcmlvIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIDxUPiBUMSBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQorCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlCisJICogYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9IC8vIFNjZW5hcmlvU3dpdGNoCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvUmVhbFRpbWVTZXF1ZW5jZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci9SZWFsVGltZVNlcXVlbmNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OTEyOWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvUmVhbFRpbWVTZXF1ZW5jZXIuamF2YQpAQCAtMCwwICsxLDI0IEBACisvLyBSZWFsVGltZVNlcXVlbmNlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEEgPGNvZGU+UmVhbFRpbWVTZXF1ZW5jZXI8L2NvZGU+IGlzIGEgPGNvZGU+U2VxdWVudGlhbFNlcXVlbmNlcjwvY29kZT4KKyAqIHRoYXQgYWx3YXlzIGFzIGEgc3RhcnRpbmcgdGltZSBlcXVhbCB0byB0aGUgY3VycmVudCB0aW1lLiBJdCBhbHNvIHNsZWVwcyBmb3IKKyAqIHRoZSB0aW1lIGluY3JlbWVudCBvZiB0aGUgc2VxdWVuY2UuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlYWxUaW1lU2VxdWVuY2VyIGV4dGVuZHMgU2VxdWVudGlhbFNlcXVlbmNlciB7CisKK30gLy8gUmVhbFRpbWVTZXF1ZW5jZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci9TZXF1ZW5jZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci9TZXF1ZW5jZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmE5MDg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL1NlcXVlbmNlci5qYXZhCkBAIC0wLDAgKzEsMjA3IEBACisvLyBTZXF1ZW5jZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvOworCisvKioKKyAqIEEgPGNvZGU+U2VxdWVuY2VyPC9jb2RlPiBpcyB0aGUgY29tcHV0YXRpb25hbCB1bml0IHRoYXQgZGV0ZXJtaW5lcyB0aGUKKyAqIHNlcXVlbmNlIG9mIHRpbWUgcG9pbnRzIGF0IHdoaWNoIHRoZSBzdGF0ZSBvZiB0aGUgY2Fub25pY2FsIHtAbGluayBHcmFwaH0gaXMKKyAqIGRldGVybWluZWQuIEl0IGFsc28gaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW5kIHdoZW4gdGhlIHNlcXVlbmNlIHRlcm1pbmF0ZXMuCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGRlZmluaXRpb24gaXMgYWxzbyBhbiAiQW5ub3RhdGVkIEphdmEgSW50ZXJmYWNlIiB0aGF0IGRlZmluZXMKKyAqIG9uZSBjbGFzcyBpbiBhIDxhIGhyZWY9Imh0dHA6Ly93d3cudW1sLm9yZy8iPlVNTDwvYT4gIm1vZGVsIi4gVGhlIFVNTCBjbGFzcworICogZGlhZ3JhbSBmb3IgdGhlIG1vZGVsIGlzIGluIHRoZSA8Y29kZT5kb2N1bWVudGF0aW9uPC9jb2RlPiBmb2xkZXIgb2YgdGhlCisgKiBwcm9qZWN0LiBUaGlzIGZpbGUgYW5kIHRoZSBvdGhlciBpbnRlcmZhY2VzIGluIHRoaXMgSmF2YSBwYWNrYWdlIGFyZQorICogcHJvY2Vzc2VkIGJ5IHRoZSBFY2xpcHNlIE1vZGVsaW5nIEZyYW1ld29yayAoYWthIEVNRiA8YQorICogaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlL2VtZiI+aHR0cDovL29yZy5lY2xpcHNlL2VtZjwvYT4pLiB0byBhdXRvbWF0aWNhbGx5CisgKiBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwuIEVNRiBpcyBkb2N1bWVudGVkIGluIHRoZSBib29rIDxhCisgKiBocmVmPSJodHRwOi8vd3d3LmF3cHJvZmVzc2lvbmFsLmNvbS9ib29rc3RvcmUvcHJvZHVjdC5hc3A/aXNibj0wMTMxNDI1NDIwJnJsPTEiPkVjbGlwc2UKKyAqIE1vZGVsaW5nIEZyYW1ld29yayA8L2E+IGJ5IEJ1ZGluc2t5LCBldCBhbC4KKyAqIDwvcD4KKyAqIEBzZWUgU2NlbmFyaW8jc3RlcCgpCisgKiBAc2VlIFNURU1UaW1lCisgKiAKKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKKyAqLworcHVibGljIGludGVyZmFjZSBTZXF1ZW5jZXIgZXh0ZW5kcyBJZGVudGlmaWFibGUgeworCisJLyoqCisJICogVGhpcyBjb25zdGFudCBpcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldEVuZFRpbWUoKX0gd2hlbiBhCisJICogPGNvZGU+U2VxdWVuY2VyPC9jb2RlPiBoYXMgbm8gc3BlY2lmaWVkIGVuZCB0aW1lLgorCSAqIAorCSAqIEBzZWUgI2dldER1cmF0aW9uKCkKKwkgKi8KKwlsb25nIFVOS05PV05fRFVSQVRJT04gPSAtMTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHN0YXJ0IHRpbWUgb2YgdGhlIHNlcXVlbmNlLgorCSAqIAorCSAqIEBtb2RlbCByZXNvbHZlUHJveGllcz0iZmFsc2UiIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqLworCVNURU1UaW1lIGdldFN0YXJ0VGltZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXIjZ2V0U3RhcnRUaW1lIDxlbT5TdGFydCBUaW1lPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgVGltZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0U3RhcnRUaW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTdGFydFRpbWUoU1RFTVRpbWUgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgZW5kaW5nIHRpbWUgb2YgdGhlIHNlcXVlbmNlLCBvciB7QGxpbmsgI1VOS05PV05fRFVSQVRJT059IGlmCisJICogICAgICAgICB0aGVyZSBpcyBubyBlbmQgdGltZS4KKwkgKiAKKwkgKiBAbW9kZWwgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBjb250YWlubWVudD0idHJ1ZSIKKwkgKi8KKwlTVEVNVGltZSBnZXRFbmRUaW1lKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlciNnZXRFbmRUaW1lIDxlbT5FbmQgVGltZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVuZCBUaW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRFbmRUaW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRFbmRUaW1lKFNURU1UaW1lIHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIDxjb2RlPlNlcXVlbmNlcjwvY29kZT4ncyBjdXJyZW50IHRpbWUuCisJICogQG1vZGVsIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgY29udGFpbm1lbnQ9InRydWUiCisJICovCisJU1RFTVRpbWUgZ2V0Q3VycmVudFRpbWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyI2dldEN1cnJlbnRUaW1lIDxlbT5DdXJyZW50IFRpbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW50IFRpbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEN1cnJlbnRUaW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDdXJyZW50VGltZShTVEVNVGltZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuZXh0IHRpbWUgcG9pbnQgaW4gdGhlIHNlcXVlbmNlLiBBcyBhIHNpZGUgZWZmZWN0IHRoZQorCSAqICAgICAgICAgPGNvZGU+c2VxdWVuY2VyPC9jb2RlPidzIGN1cnJlbnQgdGltZSBpcyBzZXQgdG8gdGhlIHJldHVybmVkCisJICogICAgICAgICB2YWx1ZS4KKwkgKiAKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICogICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKKwkgKi8KKwlTVEVNVGltZSBnZXROZXh0VGltZSgpOworCisJLyoqCisJICogQHJldHVybiB0aGUgdGltZSBkaWZmZXJlbmNlIGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHRoZSB2YWx1ZSByZXR1cm5lZCBieQorCSAqICAgICAgICAge0BsaW5rICAjZ2V0Q3VycmVudFRpbWUoKX0gYW5kIHRoYXQgcmV0dXJuZWQgYnkKKwkgKiAgICAgICAgIHtAbGluayAjZ2V0TmV4dFRpbWUoKX0uIFRoaXMgdmFsdWUgaXMgb25seSB2YWxpZCBhZnRlciBhIGNhbGwgdG8KKwkgKiAgICAgICAgIHtAbGluayAjZ2V0TmV4dFRpbWUoKX0uCisJICogCisJICogQHNlZSAjZ2V0Q3VycmVudFRpbWUoKQorCSAqIEBzZWUgI2dldE5leHRUaW1lKCkKKwkgKiAKKwkgKiBAbW9kZWwgY2hhbmdlYWJsZT0iZmFsc2UiIHRyYW5zaWVudD0idHJ1ZSIKKwkgKi8KKwlsb25nIGdldFRpbWVEZWx0YSgpOworCisJLyoqCisJICogQHJldHVybiB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGluIHRoZSBzZXF1ZW5jZS4gSWYKKwkgKiAgICAgICAgIHRoZXJlIGlzIG5vIGVuZGluZyB0aW1lIHNwZWNpZmllZCBmb3IgdGhlIHNlcXVlbmNlLCB0aGUgY29uc3RhbnQKKwkgKiAgICAgICAgIHtAbGluayAjVU5LTk9XTl9EVVJBVElPTn0gaXMgcmV0dXJuZWQuCisJICogQHNlZSAjVU5LTk9XTl9EVVJBVElPTgorCSAqIEBtb2RlbCBkZWZhdWx0PSItMSIKKwkgKi8KKwlsb25nIGdldER1cmF0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlciNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RHVyYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldER1cmF0aW9uKGxvbmcgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBzZXF1ZW5jZSBoYXMgZW5kZWQuCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCWJvb2xlYW4gaXNUaW1lVG9TdG9wKCk7CisKKwkvKioKKwkgKiBTZXQgdGhlIGN1cnJlbnQgdGltZSB0byB0aGUgc3RhcnQgdGltZSBhbmQgcHJlcGFyZSB0aGUKKwkgKiA8Y29kZT5TZXF1ZW5jZXI8L2NvZGU+IHRvIGJlZ2luIGNvbXB1dGluZyB0aGUgbmV4dCB0aW1lIGZyb20gdGhhdAorCSAqIHBvaW50LiBBbHNvIHJlc2V0IHRoZSBhbW91bnQgb2Ygd29yayBjb21wbGV0ZQorCSAqIAorCSAqIEBzZWUgI2dldE5leHRUaW1lKCkKKwkgKiBAc2VlICNnZXRXb3JrQ29tcGxldGUoKQorCSAqIAorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwl2b2lkIHJlc2V0KCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIGFuIHZhbHVlICgwLTEwMCkgcmVwcmVzZW50aW5nIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBzZXF1ZW5jZQorCSAqICAgICAgICAgdGhhdCBoYXMgYmVlbiBjb21wbGV0ZWQgc28gZmFyLiBJZiBubyBlbmQgdGltZSBoYXMgYmVlbgorCSAqICAgICAgICAgc3BlY2lmaWVkLCB0aGVuIHJldHVybiAwLgorCSAqIAorCSAqIEBtb2RlbAorCSAqLworCWRvdWJsZSBnZXRXb3JrQ29tcGxldGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyI2dldFdvcmtDb21wbGV0ZSA8ZW0+V29yayBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0V29ya0NvbXBsZXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRXb3JrQ29tcGxldGUoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gYW4gaW50ZWdlciAoMC0xMDApIHJlcHJlc2VudGluZyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgc2VxdWVuY2UKKwkgKiAgICAgICAgIHRoYXQgd2FzIGNvbXBsZXRlZCBieSB0aGUgdGltZSBkZWx0YSBiZXR3ZWVuIHRoZSBwcmV2aW91cyB0d28KKwkgKiAgICAgICAgIGNhbGxzIHRvIHtAbGluayAjZ2V0TmV4dFRpbWUoKX0KKwkgKiAKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJaW50IGdldFdvcmtJbmNyZW1lbnQoKTsKKworCS8qKgorCSAqIG9idGFpbiB0aGUgbnVtYmVyIG9mIHByb2Nlc3NpbmcgY3ljbGVzIHRoYXQgaGF2ZSAKKwkgKiBiZWVuIGNvbXBsZXRlZC4gIAorCSAqIEl0IHdpbGwgcmV0dXJuIDAgaWYgbm8gY3ljbGVzIGhhdmUgYmVlbiBjb21wbGV0ZWQgCisJICogb3IgaWYgdGhlIHNpbXVsYXRpb24gd2FzIHJlc2V0IG9yIGlzIGp1c3Qgc3RhcnRpbmcuCisJICogCisJICogQHJldHVybiBudW1iZXIgb2YgY29tcGxldGVkIGN5Y2xlcy4KKwkgKiBAbW9kZWwgZGVmYXVsdD0iMCIKKwkgKi8KKwlpbnQgZ2V0Q3ljbGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyI2dldEN5Y2xlIDxlbT5DeWNsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3ljbGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEN5Y2xlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDeWNsZShpbnQgdmFsdWUpOworCQorfSAvLyBTZXF1ZW5jZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci9TZXF1ZW5jZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvU2VxdWVuY2VyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYTZmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvU2VxdWVuY2VyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2VxdWVuY2VyRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVNlcXVlbmNlckZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5pbXBsLlNlcXVlbmNlckZhY3RvcnlJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVhbCBUaW1lIFNlcXVlbmNlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVhbCBUaW1lIFNlcXVlbmNlcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUmVhbFRpbWVTZXF1ZW5jZXIgY3JlYXRlUmVhbFRpbWVTZXF1ZW5jZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VxdWVudGlhbCBTZXF1ZW5jZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcXVlbnRpYWwgU2VxdWVuY2VyPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTZXF1ZW50aWFsU2VxdWVuY2VyIGNyZWF0ZVNlcXVlbnRpYWxTZXF1ZW5jZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU2VxdWVuY2VyUGFja2FnZSBnZXRTZXF1ZW5jZXJQYWNrYWdlKCk7CisKK30gLy9TZXF1ZW5jZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvU2VxdWVuY2VyUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL1NlcXVlbmNlclBhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTY5MDkxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL1NlcXVlbmNlclBhY2thZ2UuamF2YQpAQCAtMCwwICsxLDc4OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyRmFjdG9yeQorICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2VxdWVuY2VyUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTkFNRSA9ICJzZXF1ZW5jZXIiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci5lY29yZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVNlcXVlbmNlclBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5pbXBsLlNlcXVlbmNlclBhY2thZ2VJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5pbXBsLlNlcXVlbmNlckltcGwgPGVtPlNlcXVlbmNlcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5TZXF1ZW5jZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLmltcGwuU2VxdWVuY2VyUGFja2FnZUltcGwjZ2V0U2VxdWVuY2VyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNFUVVFTkNFUiA9IDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VRVUVOQ0VSX19VUkkgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VRVUVOQ0VSX19UWVBFX1VSSSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUVVFTkNFUl9fRFVCTElOX0NPUkUgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgVGltZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUVVFTkNFUl9fU1RBUlRfVElNRSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuZCBUaW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VRVUVOQ0VSX19FTkRfVElNRSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVGltZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUVVFTkNFUl9fQ1VSUkVOVF9USU1FID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBUaW1lPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VRVUVOQ0VSX19ORVhUX1RJTUUgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lIERlbHRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VRVUVOQ0VSX19USU1FX0RFTFRBID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVFVRU5DRVJfX0RVUkFUSU9OID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZSBUbyBTdG9wPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VRVUVOQ0VSX19USU1FX1RPX1NUT1AgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9GRUFUVVJFX0NPVU5UICsgNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VRVUVOQ0VSX19XT1JLX0NPTVBMRVRFID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBJbmNyZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVFVRU5DRVJfX1dPUktfSU5DUkVNRU5UID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3ljbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVFVRU5DRVJfX0NZQ0xFID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDk7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VxdWVuY2VyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUVVFTkNFUl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDEwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLmltcGwuU2VxdWVudGlhbFNlcXVlbmNlckltcGwgPGVtPlNlcXVlbnRpYWwgU2VxdWVuY2VyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5pbXBsLlNlcXVlbnRpYWxTZXF1ZW5jZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLmltcGwuU2VxdWVuY2VyUGFja2FnZUltcGwjZ2V0U2VxdWVudGlhbFNlcXVlbmNlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTRVFVRU5USUFMX1NFUVVFTkNFUiA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VRVUVOVElBTF9TRVFVRU5DRVJfX1VSSSA9IFNFUVVFTkNFUl9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VRVUVOVElBTF9TRVFVRU5DRVJfX1RZUEVfVVJJID0gU0VRVUVOQ0VSX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUVVFTlRJQUxfU0VRVUVOQ0VSX19EVUJMSU5fQ09SRSA9IFNFUVVFTkNFUl9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgVGltZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUVVFTlRJQUxfU0VRVUVOQ0VSX19TVEFSVF9USU1FID0gU0VRVUVOQ0VSX19TVEFSVF9USU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuZCBUaW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VRVUVOVElBTF9TRVFVRU5DRVJfX0VORF9USU1FID0gU0VRVUVOQ0VSX19FTkRfVElNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFRpbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVFVRU5USUFMX1NFUVVFTkNFUl9fQ1VSUkVOVF9USU1FID0gU0VRVUVOQ0VSX19DVVJSRU5UX1RJTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBUaW1lPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VRVUVOVElBTF9TRVFVRU5DRVJfX05FWFRfVElNRSA9IFNFUVVFTkNFUl9fTkVYVF9USU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWUgRGVsdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVFVRU5USUFMX1NFUVVFTkNFUl9fVElNRV9ERUxUQSA9IFNFUVVFTkNFUl9fVElNRV9ERUxUQTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUVVFTlRJQUxfU0VRVUVOQ0VSX19EVVJBVElPTiA9IFNFUVVFTkNFUl9fRFVSQVRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZSBUbyBTdG9wPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VRVUVOVElBTF9TRVFVRU5DRVJfX1RJTUVfVE9fU1RPUCA9IFNFUVVFTkNFUl9fVElNRV9UT19TVE9QOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVFVRU5USUFMX1NFUVVFTkNFUl9fV09SS19DT01QTEVURSA9IFNFUVVFTkNFUl9fV09SS19DT01QTEVURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIEluY3JlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUVVFTlRJQUxfU0VRVUVOQ0VSX19XT1JLX0lOQ1JFTUVOVCA9IFNFUVVFTkNFUl9fV09SS19JTkNSRU1FTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3ljbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVFVRU5USUFMX1NFUVVFTkNFUl9fQ1lDTEUgPSBTRVFVRU5DRVJfX0NZQ0xFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWUgSW5jcmVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VRVUVOVElBTF9TRVFVRU5DRVJfX1RJTUVfSU5DUkVNRU5UID0gU0VRVUVOQ0VSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlcXVlbnRpYWwgU2VxdWVuY2VyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFUVVFTlRJQUxfU0VRVUVOQ0VSX0ZFQVRVUkVfQ09VTlQgPSBTRVFVRU5DRVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5SZWFsVGltZVNlcXVlbmNlckltcGwgPGVtPlJlYWwgVGltZSBTZXF1ZW5jZXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLmltcGwuUmVhbFRpbWVTZXF1ZW5jZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLmltcGwuU2VxdWVuY2VyUGFja2FnZUltcGwjZ2V0UmVhbFRpbWVTZXF1ZW5jZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUkVBTF9USU1FX1NFUVVFTkNFUiA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVBTF9USU1FX1NFUVVFTkNFUl9fVVJJID0gU0VRVUVOVElBTF9TRVFVRU5DRVJfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFQUxfVElNRV9TRVFVRU5DRVJfX1RZUEVfVVJJID0gU0VRVUVOVElBTF9TRVFVRU5DRVJfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVBTF9USU1FX1NFUVVFTkNFUl9fRFVCTElOX0NPUkUgPSBTRVFVRU5USUFMX1NFUVVFTkNFUl9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgVGltZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFQUxfVElNRV9TRVFVRU5DRVJfX1NUQVJUX1RJTUUgPSBTRVFVRU5USUFMX1NFUVVFTkNFUl9fU1RBUlRfVElNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmQgVGltZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFQUxfVElNRV9TRVFVRU5DRVJfX0VORF9USU1FID0gU0VRVUVOVElBTF9TRVFVRU5DRVJfX0VORF9USU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVGltZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFQUxfVElNRV9TRVFVRU5DRVJfX0NVUlJFTlRfVElNRSA9IFNFUVVFTlRJQUxfU0VRVUVOQ0VSX19DVVJSRU5UX1RJTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBUaW1lPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVBTF9USU1FX1NFUVVFTkNFUl9fTkVYVF9USU1FID0gU0VRVUVOVElBTF9TRVFVRU5DRVJfX05FWFRfVElNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lIERlbHRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVBTF9USU1FX1NFUVVFTkNFUl9fVElNRV9ERUxUQSA9IFNFUVVFTlRJQUxfU0VRVUVOQ0VSX19USU1FX0RFTFRBOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVBTF9USU1FX1NFUVVFTkNFUl9fRFVSQVRJT04gPSBTRVFVRU5USUFMX1NFUVVFTkNFUl9fRFVSQVRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZSBUbyBTdG9wPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVBTF9USU1FX1NFUVVFTkNFUl9fVElNRV9UT19TVE9QID0gU0VRVUVOVElBTF9TRVFVRU5DRVJfX1RJTUVfVE9fU1RPUDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVBTF9USU1FX1NFUVVFTkNFUl9fV09SS19DT01QTEVURSA9IFNFUVVFTlRJQUxfU0VRVUVOQ0VSX19XT1JLX0NPTVBMRVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgSW5jcmVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVBTF9USU1FX1NFUVVFTkNFUl9fV09SS19JTkNSRU1FTlQgPSBTRVFVRU5USUFMX1NFUVVFTkNFUl9fV09SS19JTkNSRU1FTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3ljbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRUFMX1RJTUVfU0VRVUVOQ0VSX19DWUNMRSA9IFNFUVVFTlRJQUxfU0VRVUVOQ0VSX19DWUNMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lIEluY3JlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFQUxfVElNRV9TRVFVRU5DRVJfX1RJTUVfSU5DUkVNRU5UID0gU0VRVUVOVElBTF9TRVFVRU5DRVJfX1RJTUVfSU5DUkVNRU5UOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlYWwgVGltZSBTZXF1ZW5jZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVBTF9USU1FX1NFUVVFTkNFUl9GRUFUVVJFX0NPVU5UID0gU0VRVUVOVElBTF9TRVFVRU5DRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuUmVhbFRpbWVTZXF1ZW5jZXIgPGVtPlJlYWwgVGltZSBTZXF1ZW5jZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVhbCBUaW1lIFNlcXVlbmNlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuUmVhbFRpbWVTZXF1ZW5jZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFJlYWxUaW1lU2VxdWVuY2VyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlciA8ZW0+U2VxdWVuY2VyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlcXVlbmNlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTZXF1ZW5jZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXIjZ2V0U3RhcnRUaW1lIDxlbT5TdGFydCBUaW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U3RhcnQgVGltZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyI2dldFN0YXJ0VGltZSgpCisJICogQHNlZSAjZ2V0U2VxdWVuY2VyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTZXF1ZW5jZXJfU3RhcnRUaW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyI2dldEVuZFRpbWUgPGVtPkVuZCBUaW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RW5kIFRpbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlciNnZXRFbmRUaW1lKCkKKwkgKiBAc2VlICNnZXRTZXF1ZW5jZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNlcXVlbmNlcl9FbmRUaW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyI2dldEN1cnJlbnRUaW1lIDxlbT5DdXJyZW50IFRpbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DdXJyZW50IFRpbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlciNnZXRDdXJyZW50VGltZSgpCisJICogQHNlZSAjZ2V0U2VxdWVuY2VyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTZXF1ZW5jZXJfQ3VycmVudFRpbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXIjZ2V0TmV4dFRpbWUgPGVtPk5leHQgVGltZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPk5leHQgVGltZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyI2dldE5leHRUaW1lKCkKKwkgKiBAc2VlICNnZXRTZXF1ZW5jZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNlcXVlbmNlcl9OZXh0VGltZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlciNnZXRUaW1lRGVsdGEgPGVtPlRpbWUgRGVsdGE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UaW1lIERlbHRhPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXIjZ2V0VGltZURlbHRhKCkKKwkgKiBAc2VlICNnZXRTZXF1ZW5jZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNlcXVlbmNlcl9UaW1lRGVsdGEoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXIjZ2V0RHVyYXRpb24gPGVtPkR1cmF0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RHVyYXRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlciNnZXREdXJhdGlvbigpCisJICogQHNlZSAjZ2V0U2VxdWVuY2VyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTZXF1ZW5jZXJfRHVyYXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXIjaXNUaW1lVG9TdG9wIDxlbT5UaW1lIFRvIFN0b3A8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UaW1lIFRvIFN0b3A8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlciNpc1RpbWVUb1N0b3AoKQorCSAqIEBzZWUgI2dldFNlcXVlbmNlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U2VxdWVuY2VyX1RpbWVUb1N0b3AoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXIjZ2V0V29ya0NvbXBsZXRlIDxlbT5Xb3JrIENvbXBsZXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29yayBDb21wbGV0ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyI2dldFdvcmtDb21wbGV0ZSgpCisJICogQHNlZSAjZ2V0U2VxdWVuY2VyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTZXF1ZW5jZXJfV29ya0NvbXBsZXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyI2dldFdvcmtJbmNyZW1lbnQgPGVtPldvcmsgSW5jcmVtZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29yayBJbmNyZW1lbnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlciNnZXRXb3JrSW5jcmVtZW50KCkKKwkgKiBAc2VlICNnZXRTZXF1ZW5jZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNlcXVlbmNlcl9Xb3JrSW5jcmVtZW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyI2dldEN5Y2xlIDxlbT5DeWNsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkN5Y2xlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXIjZ2V0Q3ljbGUoKQorCSAqIEBzZWUgI2dldFNlcXVlbmNlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U2VxdWVuY2VyX0N5Y2xlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbnRpYWxTZXF1ZW5jZXIgPGVtPlNlcXVlbnRpYWwgU2VxdWVuY2VyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlcXVlbnRpYWwgU2VxdWVuY2VyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW50aWFsU2VxdWVuY2VyCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTZXF1ZW50aWFsU2VxdWVuY2VyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVudGlhbFNlcXVlbmNlciNnZXRUaW1lSW5jcmVtZW50IDxlbT5UaW1lIEluY3JlbWVudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRpbWUgSW5jcmVtZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW50aWFsU2VxdWVuY2VyI2dldFRpbWVJbmNyZW1lbnQoKQorCSAqIEBzZWUgI2dldFNlcXVlbnRpYWxTZXF1ZW5jZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNlcXVlbnRpYWxTZXF1ZW5jZXJfVGltZUluY3JlbWVudCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU2VxdWVuY2VyRmFjdG9yeSBnZXRTZXF1ZW5jZXJGYWN0b3J5KCk7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKKwkgKiA8dWw+CisJICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisJICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKwkgKiA8L3VsPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnRlcmZhY2UgTGl0ZXJhbHMgeworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5SZWFsVGltZVNlcXVlbmNlckltcGwgPGVtPlJlYWwgVGltZSBTZXF1ZW5jZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLmltcGwuUmVhbFRpbWVTZXF1ZW5jZXJJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5pbXBsLlNlcXVlbmNlclBhY2thZ2VJbXBsI2dldFJlYWxUaW1lU2VxdWVuY2VyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFJFQUxfVElNRV9TRVFVRU5DRVIgPSBlSU5TVEFOQ0UuZ2V0UmVhbFRpbWVTZXF1ZW5jZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5TZXF1ZW5jZXJJbXBsIDxlbT5TZXF1ZW5jZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLmltcGwuU2VxdWVuY2VySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5TZXF1ZW5jZXJQYWNrYWdlSW1wbCNnZXRTZXF1ZW5jZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU0VRVUVOQ0VSID0gZUlOU1RBTkNFLmdldFNlcXVlbmNlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgVGltZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNFUVVFTkNFUl9fU1RBUlRfVElNRSA9IGVJTlNUQU5DRS5nZXRTZXF1ZW5jZXJfU3RhcnRUaW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbmQgVGltZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNFUVVFTkNFUl9fRU5EX1RJTUUgPSBlSU5TVEFOQ0UuZ2V0U2VxdWVuY2VyX0VuZFRpbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVGltZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNFUVVFTkNFUl9fQ1VSUkVOVF9USU1FID0gZUlOU1RBTkNFLmdldFNlcXVlbmNlcl9DdXJyZW50VGltZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBUaW1lPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0VRVUVOQ0VSX19ORVhUX1RJTUUgPSBlSU5TVEFOQ0UuZ2V0U2VxdWVuY2VyX05leHRUaW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UaW1lIERlbHRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0VRVUVOQ0VSX19USU1FX0RFTFRBID0gZUlOU1RBTkNFLmdldFNlcXVlbmNlcl9UaW1lRGVsdGEoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0VRVUVOQ0VSX19EVVJBVElPTiA9IGVJTlNUQU5DRS5nZXRTZXF1ZW5jZXJfRHVyYXRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRpbWUgVG8gU3RvcDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNFUVVFTkNFUl9fVElNRV9UT19TVE9QID0gZUlOU1RBTkNFLmdldFNlcXVlbmNlcl9UaW1lVG9TdG9wKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0VRVUVOQ0VSX19XT1JLX0NPTVBMRVRFID0gZUlOU1RBTkNFLmdldFNlcXVlbmNlcl9Xb3JrQ29tcGxldGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmsgSW5jcmVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0VRVUVOQ0VSX19XT1JLX0lOQ1JFTUVOVCA9IGVJTlNUQU5DRS5nZXRTZXF1ZW5jZXJfV29ya0luY3JlbWVudCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q3ljbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTRVFVRU5DRVJfX0NZQ0xFID0gZUlOU1RBTkNFLmdldFNlcXVlbmNlcl9DeWNsZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5pbXBsLlNlcXVlbnRpYWxTZXF1ZW5jZXJJbXBsIDxlbT5TZXF1ZW50aWFsIFNlcXVlbmNlcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5TZXF1ZW50aWFsU2VxdWVuY2VySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5TZXF1ZW5jZXJQYWNrYWdlSW1wbCNnZXRTZXF1ZW50aWFsU2VxdWVuY2VyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNFUVVFTlRJQUxfU0VRVUVOQ0VSID0gZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxTZXF1ZW5jZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRpbWUgSW5jcmVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0VRVUVOVElBTF9TRVFVRU5DRVJfX1RJTUVfSU5DUkVNRU5UID0gZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxTZXF1ZW5jZXJfVGltZUluY3JlbWVudCgpOworCisJfQorCit9IC8vU2VxdWVuY2VyUGFja2FnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL1NlcXVlbnRpYWxTZXF1ZW5jZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci9TZXF1ZW50aWFsU2VxdWVuY2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBjMzk5YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci9TZXF1ZW50aWFsU2VxdWVuY2VyLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLy8gU2VxdWVudGlhbFNlcXVlbmNlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyogQSA8Y29kZT5TZXF1ZW50aWFsU2VxdWVuY2VyPC9jb2RlPiBpcyBhIHtAbGluayBTZXF1ZW5jZXJ9IHRoYXQgZ2VuZXJhdGVzCisqIHNlcXVlbnRpYWwgdGltZSBwb2ludHMgdGhhdCBhcmUgdW5pZm9ybWx5IHNwYWNlZCBhdCBhIGNvbnN0YW50IGludGVydmFsIG9mCisqIHRpbWUuCisqIAorKiBAbW9kZWwKKyovCitwdWJsaWMgaW50ZXJmYWNlIFNlcXVlbnRpYWxTZXF1ZW5jZXIgZXh0ZW5kcyBTZXF1ZW5jZXIgeworCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHRoZSB0aW1lIHBvaW50cyByZXR1cm5lZCBieQorCSAqICAgICAgICAgc3VjY2Vzc2l2ZSBjYWxscyB0byB7QGxpbmsgU2VxdWVuY2VyI2dldE5leHRUaW1lKCl9LgorCSAqIAorCSAqIEBtb2RlbAorCSAqLworCWxvbmcgZ2V0VGltZUluY3JlbWVudCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW50aWFsU2VxdWVuY2VyI2dldFRpbWVJbmNyZW1lbnQgPGVtPlRpbWUgSW5jcmVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGltZSBJbmNyZW1lbnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFRpbWVJbmNyZW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRpbWVJbmNyZW1lbnQobG9uZyB2YWx1ZSk7CisKK30gLy8gU2VxdWVudGlhbFNlcXVlbmNlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL2ltcGwvUmVhbFRpbWVTZXF1ZW5jZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvaW1wbC9SZWFsVGltZVNlcXVlbmNlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTE0NWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL2ltcGwvUmVhbFRpbWVTZXF1ZW5jZXJJbXBsLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlJlYWxUaW1lU2VxdWVuY2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVhbCBUaW1lIFNlcXVlbmNlcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJlYWxUaW1lU2VxdWVuY2VySW1wbCBleHRlbmRzIFNlcXVlbnRpYWxTZXF1ZW5jZXJJbXBsIGltcGxlbWVudHMKKwkJUmVhbFRpbWVTZXF1ZW5jZXIgeworCS8qKgorCSAqIElmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gdGhlIG1ldGhvZCB7QGxpbmsgI2dldE5leHRDYWxsZWQoKX0gaGFzIGJlZW4KKwkgKiBjYWxsZWQgb25jZS4gVGhpcyBpcyBjaGVja2VkIGJlbG93IGluIHtAbGluayAjZ2V0U3RhcnRUaW1lKCl9LgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBnZXROZXh0Q2FsbGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFJlYWxUaW1lU2VxdWVuY2VySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgc3RhcnQgdGltZSBmb3IgYSByZWFsLXRpbWUgc2VxdWVuY2VyIGlzIHRoZSBjdXJyZW50IHRpbWUgdW50aWwgdGhlcmUKKwkgKiBpcyBhIGNhbGwgdG8gZ2V0TmV4dFRpbWUoKSwgYXQgd2hpY2ggcG9pbnQgdGhlIHN0YXJ0IHRpbWUgaXMgZml4ZWQuCisJICogCisJICogQHNlZSAjZ2V0TmV4dENhbGxlZAorCSAqIEBzZWUgI2dldE5leHRUaW1lKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU1RFTVRpbWUgZ2V0U3RhcnRUaW1lKCkgeworCQkvLyBIYXMgZ2V0TmV4dFRpbWUgYmVlbiBjYWxsZWQgeWV0LgorCQlpZiAoIWdldE5leHRDYWxsZWQpIHsKKwkJCS8vIE5vCisJCQlyZXR1cm4gZ2V0Q3VycmVudFN5c3RlbVRpbWUoKTsKKwkJfSAvLyBpZgorCQllbHNlIHsKKwkJCXJldHVybiBzdXBlci5nZXRTdGFydFRpbWUoKTsKKwkJfQorCX0gLy8gZ2V0U3RhcnRUaW1lCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5TZXF1ZW50aWFsU2VxdWVuY2VySW1wbCNnZXROZXh0VGltZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFNURU1UaW1lIGdldE5leHRUaW1lKCkgeworCQlzdXBlci5nZXROZXh0VGltZSgpOworCQkKKwkJLy8gSXMgdGhpcyBvdXIgZmlyc3QgY2FsbD8KKwkJaWYgKCFnZXROZXh0Q2FsbGVkKSB7CisJCQkvLyBZZXMKKwkJCWdldE5leHRDYWxsZWQgPSB0cnVlOworCQkJLy8gVGhlIHN0YXJ0IHRpbWUgaXMgcmlnaHQgbm93CisJCQlzZXRTdGFydFRpbWUoZ2V0Q3VycmVudFN5c3RlbVRpbWUoKSk7CisJCX0gLy8gaWYKKworCQlmaW5hbCBTVEVNVGltZSBjdXJyZW50VGltZSA9IGdldEN1cnJlbnRUaW1lKCk7CisJCQorCQlmaW5hbCBTVEVNVGltZSB0aW1lVG9XYWtlVXAgPSBzdXBlci5nZXROZXh0VGltZSgpOworCisJCS8vIE5vdyB3ZSBzbGVlcCB1bnRpbCBpdCBpcyB0aGUgbmV4dCB0aW1lCisJCXNsZWVwVW50aWwodGltZVRvV2FrZVVwLCBjdXJyZW50VGltZSk7CisKKwkJLy8gV2UgbWF5IG9yIG1heSBub3QgaGF2ZSB3b2tlbiB1cCB3aGVuIHdlIGV4cGVjdGVkLiBTZXQgdGhlIGN1cnJlbnQKKwkJLy8gdGltZSB0byBiZSB3aGF0ZXZlciB0aGUgdGltZSBpcyBub3cuCisJCXNldEN1cnJlbnRUaW1lKGdldEN1cnJlbnRTeXN0ZW1UaW1lKCkpOworCQlyZXR1cm4gZ2V0Q3VycmVudFRpbWUoKTsKKwl9IC8vIGdldE5leHRUaW1lCisKKwkvKioKKwkgKiBAcGFyYW0gY3VycmVudFRpbWUgVE9ETworCSAqIEBwYXJhbSByZXRWYWx1ZQorCSAqLworCXByaXZhdGUgdm9pZCBzbGVlcFVudGlsKFNURU1UaW1lIGZ1dHVyZVRpbWUsIFNURU1UaW1lIGN1cnJlbnRUaW1lKSB7CisJCWZpbmFsIGxvbmcgbWlsbGlzZWNvbmRzVG9TbGVlcCA9IGZ1dHVyZVRpbWUuZ2V0VGltZSgpLmdldFRpbWUoKQorCQkJCS0gY3VycmVudFRpbWUuZ2V0VGltZSgpLmdldFRpbWUoKTsKKwkJdHJ5IHsKKwkJCVRocmVhZC5zbGVlcChtaWxsaXNlY29uZHNUb1NsZWVwKTsKKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJQ29yZVBsdWdpbi5sb2dJbmZvcm1hdGlvbigKKwkJCQkJIlJlYWxUaW1lU2VxdWVuY2VyJ3Mgc2xlZXAgd2FzIGludGVycnVwdGVkIiwgZSk7CisJCX0KKwl9IC8vIHNsZWVwVW50aWwKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5pbXBsLlNlcXVlbmNlckltcGwjc2V0RW5kVGltZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUpCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgbmV3IGVuZCB0aW1lIGlzIGJlZm9yZSB0aGUgY3VycmVudCAod2FsbCBjbG9jaykgdGltZS4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRFbmRUaW1lKFNURU1UaW1lIG5ld0VuZFRpbWUpIHsKKwkJLy8gVGhlIGVuZCB0aW1lIHNob3VsZCBiZSBsYXRlciB0aGFuIHRoZSBjdXJyZW50IHRpbWUKKwkJZmluYWwgU1RFTVRpbWUgY3VycmVudFRpbWUgPSBnZXRDdXJyZW50U3lzdGVtVGltZSgpOworCQlpZiAoaXNFbmRUaW1lQmVmb3JlKGN1cnJlbnRUaW1lKSkgeworCQkJc3VwZXIuc2V0RW5kVGltZShuZXdFbmRUaW1lKTsKKwkJfSAvLyBpZgorCQllbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBuZXcgZW5kIHRpbWUgXCIiCisJCQkJCSsgbmV3RW5kVGltZS50b1N0cmluZygpCisJCQkJCSsgIlwiIGlzIG5vdCBhZnRlciB0aGUgY3VycmVudCB0aW1lIG9mIFwiIgorCQkJCQkrIGN1cnJlbnRUaW1lLnRvU3RyaW5nKCkgKyAiXCIiKTsKKwkJfSAvLyBlbHNlCisJfSAvLyBzZXRFbmRUaW1lCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5TZXF1ZW50aWFsU2VxdWVuY2VySW1wbCNyZXNldCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCXN1cGVyLnJlc2V0KCk7CisJCWdldE5leHRDYWxsZWQgPSBmYWxzZTsKKwl9IC8vIHJlc2V0CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBTZXF1ZW5jZXJQYWNrYWdlLkxpdGVyYWxzLlJFQUxfVElNRV9TRVFVRU5DRVI7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgY3VycmVudCByZWFsIHdhbGwgY2xvY2sgdGltZSBhcyByZXR1cm5lZCBieSB0aGUgc3lzdGVtLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgU1RFTVRpbWUgZ2V0Q3VycmVudFN5c3RlbVRpbWUoKSB7CisJCXJldHVybiBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNURU1UaW1lKCk7CisJfSAvLyBnZXRDdXJyZW50U3lzdGVtVGltZQorfSAvLyBSZWFsVGltZVNlcXVlbmNlckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci9pbXBsL1NlcXVlbmNlckZhY3RvcnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvaW1wbC9TZXF1ZW5jZXJGYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNGE5MDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvaW1wbC9TZXF1ZW5jZXJGYWN0b3J5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLio7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU2VxdWVuY2VyRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBTZXF1ZW5jZXJGYWN0b3J5IHsKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBTZXF1ZW5jZXJGYWN0b3J5IGluaXQoKSB7CisJCXRyeSB7CisJCQlTZXF1ZW5jZXJGYWN0b3J5IHRoZVNlcXVlbmNlckZhY3RvcnkgPSAoU2VxdWVuY2VyRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyLmVjb3JlIik7IC8vJE5PTi1OTFMtMSQgCisJCQlpZiAodGhlU2VxdWVuY2VyRmFjdG9yeSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoZVNlcXVlbmNlckZhY3Rvcnk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXJldHVybiBuZXcgU2VxdWVuY2VyRmFjdG9yeUltcGwoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTZXF1ZW5jZXJGYWN0b3J5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgeworCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlJFQUxfVElNRV9TRVFVRU5DRVI6IHJldHVybiBjcmVhdGVSZWFsVGltZVNlcXVlbmNlcigpOworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTlRJQUxfU0VRVUVOQ0VSOiByZXR1cm4gY3JlYXRlU2VxdWVudGlhbFNlcXVlbmNlcigpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSZWFsVGltZVNlcXVlbmNlciBjcmVhdGVSZWFsVGltZVNlcXVlbmNlcigpIHsKKwkJUmVhbFRpbWVTZXF1ZW5jZXJJbXBsIHJlYWxUaW1lU2VxdWVuY2VyID0gbmV3IFJlYWxUaW1lU2VxdWVuY2VySW1wbCgpOworCQlyZXR1cm4gcmVhbFRpbWVTZXF1ZW5jZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNlcXVlbnRpYWxTZXF1ZW5jZXIgY3JlYXRlU2VxdWVudGlhbFNlcXVlbmNlcigpIHsKKwkJU2VxdWVudGlhbFNlcXVlbmNlckltcGwgc2VxdWVudGlhbFNlcXVlbmNlciA9IG5ldyBTZXF1ZW50aWFsU2VxdWVuY2VySW1wbCgpOworCQlyZXR1cm4gc2VxdWVudGlhbFNlcXVlbmNlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU2VxdWVuY2VyUGFja2FnZSBnZXRTZXF1ZW5jZXJQYWNrYWdlKCkgeworCQlyZXR1cm4gKFNlcXVlbmNlclBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBkZXByZWNhdGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBTZXF1ZW5jZXJQYWNrYWdlIGdldFBhY2thZ2UoKSB7CisJCXJldHVybiBTZXF1ZW5jZXJQYWNrYWdlLmVJTlNUQU5DRTsKKwl9CisKK30gLy9TZXF1ZW5jZXJGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL2ltcGwvU2VxdWVuY2VySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL2ltcGwvU2VxdWVuY2VySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZDBmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvaW1wbC9TZXF1ZW5jZXJJbXBsLmphdmEKQEAgLTAsMCArMSw2MTMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLklkZW50aWZpYWJsZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VxdWVuY2VyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLmltcGwuU2VxdWVuY2VySW1wbCNnZXRTdGFydFRpbWUgPGVtPlN0YXJ0IFRpbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5TZXF1ZW5jZXJJbXBsI2dldEVuZFRpbWUgPGVtPkVuZCBUaW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLmltcGwuU2VxdWVuY2VySW1wbCNnZXRDdXJyZW50VGltZSA8ZW0+Q3VycmVudCBUaW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLmltcGwuU2VxdWVuY2VySW1wbCNnZXROZXh0VGltZSA8ZW0+TmV4dCBUaW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLmltcGwuU2VxdWVuY2VySW1wbCNnZXRUaW1lRGVsdGEgPGVtPlRpbWUgRGVsdGE8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5TZXF1ZW5jZXJJbXBsI2dldER1cmF0aW9uIDxlbT5EdXJhdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5pbXBsLlNlcXVlbmNlckltcGwjaXNUaW1lVG9TdG9wIDxlbT5UaW1lIFRvIFN0b3A8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5TZXF1ZW5jZXJJbXBsI2dldFdvcmtDb21wbGV0ZSA8ZW0+V29yayBDb21wbGV0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5pbXBsLlNlcXVlbmNlckltcGwjZ2V0V29ya0luY3JlbWVudCA8ZW0+V29yayBJbmNyZW1lbnQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5TZXF1ZW5jZXJJbXBsI2dldEN5Y2xlIDxlbT5DeWNsZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcXVlbmNlckltcGwgZXh0ZW5kcyBJZGVudGlmaWFibGVJbXBsIGltcGxlbWVudHMKKwkJU2VxdWVuY2VyIHsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0VGltZSgpIDxlbT5TdGFydCBUaW1lPC9lbT59JworCSAqIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjZ2V0U3RhcnRUaW1lKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFNURU1UaW1lIHN0YXJ0VGltZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU1RFTVRpbWUoKTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVuZFRpbWUoKSA8ZW0+RW5kIFRpbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFbmRUaW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU1RFTVRpbWUgZW5kVGltZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1cnJlbnRUaW1lKCkgPGVtPkN1cnJlbnQgVGltZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEN1cnJlbnRUaW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU1RFTVRpbWUgY3VycmVudFRpbWU7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZURlbHRhKCkgPGVtPlRpbWUgRGVsdGE8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUaW1lRGVsdGEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBUSU1FX0RFTFRBX0VERUZBVUxUID0gMEw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaW1lRGVsdGEoKSA8ZW0+VGltZSBEZWx0YTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRpbWVEZWx0YSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGxvbmcgdGltZURlbHRhID0gVElNRV9ERUxUQV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbigpIDxlbT5EdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldER1cmF0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgRFVSQVRJT05fRURFRkFVTFQgPSAtMUw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbigpIDxlbT5EdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldER1cmF0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgbG9uZyBkdXJhdGlvbiA9IERVUkFUSU9OX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVGltZVRvU3RvcCgpIDxlbT5UaW1lIFRvIFN0b3A8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1RpbWVUb1N0b3AoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBUSU1FX1RPX1NUT1BfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrQ29tcGxldGUoKSA8ZW0+V29yayBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFdvcmtDb21wbGV0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgV09SS19DT01QTEVURV9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtDb21wbGV0ZSgpIDxlbT5Xb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0V29ya0NvbXBsZXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIHdvcmtDb21wbGV0ZSA9IFdPUktfQ09NUExFVEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya0luY3JlbWVudCgpIDxlbT5Xb3JrIEluY3JlbWVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFdvcmtJbmNyZW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFdPUktfSU5DUkVNRU5UX0VERUZBVUxUID0gMDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDeWNsZSgpIDxlbT5DeWNsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEN5Y2xlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDWUNMRV9FREVGQVVMVCA9IDA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDeWNsZSgpIDxlbT5DeWNsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEN5Y2xlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGN5Y2xlID0gQ1lDTEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNlcXVlbmNlckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gU2VxdWVuY2VyUGFja2FnZS5MaXRlcmFscy5TRVFVRU5DRVI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgU1RFTVRpbWUgZ2V0U3RhcnRUaW1lKCkgeworCQlyZXR1cm4gKFNURU1UaW1lKSBFY29yZVV0aWwuY29weShzdGFydFRpbWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdGFydFRpbWUoU1RFTVRpbWUgbmV3U3RhcnRUaW1lLAorCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlTVEVNVGltZSBvbGRTdGFydFRpbWUgPSBzdGFydFRpbWU7CisJCXN0YXJ0VGltZSA9IG5ld1N0YXJ0VGltZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX1NUQVJUX1RJTUUsIG9sZFN0YXJ0VGltZSwgbmV3U3RhcnRUaW1lKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3RhcnRUaW1lKFNURU1UaW1lIG5ld1N0YXJ0VGltZSkgeworCQlpZiAobmV3U3RhcnRUaW1lICE9IHN0YXJ0VGltZSkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoc3RhcnRUaW1lICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXN0YXJ0VGltZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFNlcXVlbmNlclBhY2thZ2UuU0VRVUVOQ0VSX19TVEFSVF9USU1FLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdTdGFydFRpbWUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U3RhcnRUaW1lKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX1NUQVJUX1RJTUUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0U3RhcnRUaW1lKG5ld1N0YXJ0VGltZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fU1RBUlRfVElNRSwgbmV3U3RhcnRUaW1lLCBuZXdTdGFydFRpbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNURU1UaW1lIGdldEVuZFRpbWUoKSB7CisJCXJldHVybiBlbmRUaW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFbmRUaW1lKFNURU1UaW1lIG5ld0VuZFRpbWUsCisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCVNURU1UaW1lIG9sZEVuZFRpbWUgPSBlbmRUaW1lOworCQllbmRUaW1lID0gbmV3RW5kVGltZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX0VORF9USU1FLCBvbGRFbmRUaW1lLCBuZXdFbmRUaW1lKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RW5kVGltZShTVEVNVGltZSBuZXdFbmRUaW1lKSB7CisJCWlmIChuZXdFbmRUaW1lICE9IGVuZFRpbWUpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGVuZFRpbWUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZW5kVGltZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFNlcXVlbmNlclBhY2thZ2UuU0VRVUVOQ0VSX19FTkRfVElNRSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3RW5kVGltZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFbmRUaW1lKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX0VORF9USU1FLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEVuZFRpbWUobmV3RW5kVGltZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fRU5EX1RJTUUsIG5ld0VuZFRpbWUsIG5ld0VuZFRpbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBTVEVNVGltZSBnZXRDdXJyZW50VGltZSgpIHsKKwkJLy8gSXMgdGhlIGN1cnJlbnQgdGltZSBzZXQgeWV0PworCQlpZiAoY3VycmVudFRpbWUgPT0gbnVsbCkgeworCQkJLy8gTm8KKwkJCS8vIFRoZW4gdGhlIGN1cnJlbnQgdGltZSBpcyB0aGUgc3RhcnQgdGltZS4KKwkJCXNldEN1cnJlbnRUaW1lKChTVEVNVGltZSkgRWNvcmVVdGlsLmNvcHkoZ2V0U3RhcnRUaW1lKCkpKTsKKwkJfQorCQlyZXR1cm4gKFNURU1UaW1lKSBFY29yZVV0aWwuY29weShjdXJyZW50VGltZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEN1cnJlbnRUaW1lKFNURU1UaW1lIG5ld0N1cnJlbnRUaW1lLAorCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlTVEVNVGltZSBvbGRDdXJyZW50VGltZSA9IGN1cnJlbnRUaW1lOworCQljdXJyZW50VGltZSA9IG5ld0N1cnJlbnRUaW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fQ1VSUkVOVF9USU1FLCBvbGRDdXJyZW50VGltZSwgbmV3Q3VycmVudFRpbWUpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDdXJyZW50VGltZShTVEVNVGltZSBuZXdDdXJyZW50VGltZSkgeworCQlpZiAobmV3Q3VycmVudFRpbWUgIT0gY3VycmVudFRpbWUpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGN1cnJlbnRUaW1lICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWN1cnJlbnRUaW1lKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX0NVUlJFTlRfVElNRSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q3VycmVudFRpbWUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q3VycmVudFRpbWUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fQ1VSUkVOVF9USU1FLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEN1cnJlbnRUaW1lKG5ld0N1cnJlbnRUaW1lLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcXVlbmNlclBhY2thZ2UuU0VRVUVOQ0VSX19DVVJSRU5UX1RJTUUsIG5ld0N1cnJlbnRUaW1lLCBuZXdDdXJyZW50VGltZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFNURU1UaW1lIGdldE5leHRUaW1lKCkgeworCQljeWNsZSsrOyAvLyBjb3VudCB0aGlzIGFzIGEgY29tcGxldGVkIGN5Y2xlCisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRUaW1lRGVsdGEoKSB7CisJCXJldHVybiB0aW1lRGVsdGE7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXREdXJhdGlvbigpIHsKKwkJLy8gQ2FuIHdlIGNvbXB1dGUgYSBkdXJhdGlvbj8KKwkJaWYgKGR1cmF0aW9uID09IFVOS05PV05fRFVSQVRJT04gJiYgZ2V0U3RhcnRUaW1lKCkgIT0gbnVsbAorCQkJCSYmIGdldEVuZFRpbWUoKSAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCWR1cmF0aW9uID0gZ2V0RW5kVGltZSgpLmdldFRpbWUoKS5nZXRUaW1lKCkKKwkJCQkJLSBnZXRTdGFydFRpbWUoKS5nZXRUaW1lKCkuZ2V0VGltZSgpOworCQl9CisJCXJldHVybiBkdXJhdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RHVyYXRpb24obG9uZyBuZXdEdXJhdGlvbikgeworCQlsb25nIG9sZER1cmF0aW9uID0gZHVyYXRpb247CisJCWR1cmF0aW9uID0gbmV3RHVyYXRpb247CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcXVlbmNlclBhY2thZ2UuU0VRVUVOQ0VSX19EVVJBVElPTiwgb2xkRHVyYXRpb24sIGR1cmF0aW9uKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVGltZVRvU3RvcCgpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJ1RpbWUgVG8gU3RvcCcgYXR0cmlidXRlCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFdvcmtDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHdvcmtDb21wbGV0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0V29ya0NvbXBsZXRlKGRvdWJsZSBuZXdXb3JrQ29tcGxldGUpIHsKKwkJZG91YmxlIG9sZFdvcmtDb21wbGV0ZSA9IHdvcmtDb21wbGV0ZTsKKwkJd29ya0NvbXBsZXRlID0gbmV3V29ya0NvbXBsZXRlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fV09SS19DT01QTEVURSwgb2xkV29ya0NvbXBsZXRlLCB3b3JrQ29tcGxldGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRXb3JrSW5jcmVtZW50KCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnV29yayBJbmNyZW1lbnQnIGF0dHJpYnV0ZQorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRDeWNsZSgpIHsKKwkJcmV0dXJuIGN5Y2xlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDeWNsZShpbnQgbmV3Q3ljbGUpIHsKKwkJaW50IG9sZEN5Y2xlID0gY3ljbGU7CisJCWN5Y2xlID0gbmV3Q3ljbGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcXVlbmNlclBhY2thZ2UuU0VRVUVOQ0VSX19DWUNMRSwgb2xkQ3ljbGUsIGN5Y2xlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJc2V0Q3VycmVudFRpbWUoKFNURU1UaW1lKSBFY29yZVV0aWwuY29weShnZXRTdGFydFRpbWUoKSkpOworCQlzZXRXb3JrQ29tcGxldGUoMCk7CisJCXNldEN5Y2xlKENZQ0xFX0VERUZBVUxUKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKKwkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX1NUQVJUX1RJTUU6CisJCQkJcmV0dXJuIGJhc2ljU2V0U3RhcnRUaW1lKG51bGwsIG1zZ3MpOworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fRU5EX1RJTUU6CisJCQkJcmV0dXJuIGJhc2ljU2V0RW5kVGltZShudWxsLCBtc2dzKTsKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX0NVUlJFTlRfVElNRToKKwkJCQlyZXR1cm4gYmFzaWNTZXRDdXJyZW50VGltZShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX1NUQVJUX1RJTUU6CisJCQkJcmV0dXJuIGdldFN0YXJ0VGltZSgpOworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fRU5EX1RJTUU6CisJCQkJcmV0dXJuIGdldEVuZFRpbWUoKTsKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX0NVUlJFTlRfVElNRToKKwkJCQlyZXR1cm4gZ2V0Q3VycmVudFRpbWUoKTsKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX05FWFRfVElNRToKKwkJCQlyZXR1cm4gZ2V0TmV4dFRpbWUoKTsKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX1RJTUVfREVMVEE6CisJCQkJcmV0dXJuIGdldFRpbWVEZWx0YSgpOworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fRFVSQVRJT046CisJCQkJcmV0dXJuIGdldER1cmF0aW9uKCk7CisJCQljYXNlIFNlcXVlbmNlclBhY2thZ2UuU0VRVUVOQ0VSX19USU1FX1RPX1NUT1A6CisJCQkJcmV0dXJuIGlzVGltZVRvU3RvcCgpOworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fV09SS19DT01QTEVURToKKwkJCQlyZXR1cm4gZ2V0V29ya0NvbXBsZXRlKCk7CisJCQljYXNlIFNlcXVlbmNlclBhY2thZ2UuU0VRVUVOQ0VSX19XT1JLX0lOQ1JFTUVOVDoKKwkJCQlyZXR1cm4gZ2V0V29ya0luY3JlbWVudCgpOworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fQ1lDTEU6CisJCQkJcmV0dXJuIGdldEN5Y2xlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFNlcXVlbmNlclBhY2thZ2UuU0VRVUVOQ0VSX19TVEFSVF9USU1FOgorCQkJCXNldFN0YXJ0VGltZSgoU1RFTVRpbWUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX0VORF9USU1FOgorCQkJCXNldEVuZFRpbWUoKFNURU1UaW1lKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFNlcXVlbmNlclBhY2thZ2UuU0VRVUVOQ0VSX19DVVJSRU5UX1RJTUU6CisJCQkJc2V0Q3VycmVudFRpbWUoKFNURU1UaW1lKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFNlcXVlbmNlclBhY2thZ2UuU0VRVUVOQ0VSX19EVVJBVElPTjoKKwkJCQlzZXREdXJhdGlvbigoTG9uZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fV09SS19DT01QTEVURToKKwkJCQlzZXRXb3JrQ29tcGxldGUoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fQ1lDTEU6CisJCQkJc2V0Q3ljbGUoKEludGVnZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fU1RBUlRfVElNRToKKwkJCQlzZXRTdGFydFRpbWUoKFNURU1UaW1lKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX0VORF9USU1FOgorCQkJCXNldEVuZFRpbWUoKFNURU1UaW1lKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX0NVUlJFTlRfVElNRToKKwkJCQlzZXRDdXJyZW50VGltZSgoU1RFTVRpbWUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fRFVSQVRJT046CisJCQkJc2V0RHVyYXRpb24oRFVSQVRJT05fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX1dPUktfQ09NUExFVEU6CisJCQkJc2V0V29ya0NvbXBsZXRlKFdPUktfQ09NUExFVEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX0NZQ0xFOgorCQkJCXNldEN5Y2xlKENZQ0xFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFNlcXVlbmNlclBhY2thZ2UuU0VRVUVOQ0VSX19TVEFSVF9USU1FOgorCQkJCXJldHVybiBzdGFydFRpbWUgIT0gbnVsbDsKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX0VORF9USU1FOgorCQkJCXJldHVybiBlbmRUaW1lICE9IG51bGw7CisJCQljYXNlIFNlcXVlbmNlclBhY2thZ2UuU0VRVUVOQ0VSX19DVVJSRU5UX1RJTUU6CisJCQkJcmV0dXJuIGN1cnJlbnRUaW1lICE9IG51bGw7CisJCQljYXNlIFNlcXVlbmNlclBhY2thZ2UuU0VRVUVOQ0VSX19ORVhUX1RJTUU6CisJCQkJcmV0dXJuIGdldE5leHRUaW1lKCkgIT0gbnVsbDsKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX1RJTUVfREVMVEE6CisJCQkJcmV0dXJuIHRpbWVEZWx0YSAhPSBUSU1FX0RFTFRBX0VERUZBVUxUOworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fRFVSQVRJT046CisJCQkJcmV0dXJuIGR1cmF0aW9uICE9IERVUkFUSU9OX0VERUZBVUxUOworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fVElNRV9UT19TVE9QOgorCQkJCXJldHVybiBpc1RpbWVUb1N0b3AoKSAhPSBUSU1FX1RPX1NUT1BfRURFRkFVTFQ7CisJCQljYXNlIFNlcXVlbmNlclBhY2thZ2UuU0VRVUVOQ0VSX19XT1JLX0NPTVBMRVRFOgorCQkJCXJldHVybiB3b3JrQ29tcGxldGUgIT0gV09SS19DT01QTEVURV9FREVGQVVMVDsKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX1dPUktfSU5DUkVNRU5UOgorCQkJCXJldHVybiBnZXRXb3JrSW5jcmVtZW50KCkgIT0gV09SS19JTkNSRU1FTlRfRURFRkFVTFQ7CisJCQljYXNlIFNlcXVlbmNlclBhY2thZ2UuU0VRVUVOQ0VSX19DWUNMRToKKwkJCQlyZXR1cm4gY3ljbGUgIT0gQ1lDTEVfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpCisJCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiTU1NIGQsIHl5eXkiKTsKKworCQlmaW5hbCBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlyZXN1bHQuYXBwZW5kKGRhdGVGb3JtYXQuZm9ybWF0KHN0YXJ0VGltZS5nZXRUaW1lKCkpKTsKKworCQlpZiAoZW5kVGltZSAhPSBudWxsKSB7CisJCQlyZXN1bHQuYXBwZW5kKCIgdG8gIik7CisJCQlyZXN1bHQuYXBwZW5kKGRhdGVGb3JtYXQuZm9ybWF0KGVuZFRpbWUuZ2V0VGltZSgpKSk7CisJCX0KKworCQlpZiAoY3VycmVudFRpbWUgIT0gbnVsbCkgeworCQkJcmVzdWx0LmFwcGVuZCgiLCBjdXJyZW50PSIpOworCQkJcmVzdWx0LmFwcGVuZChkYXRlRm9ybWF0LmZvcm1hdChjdXJyZW50VGltZS5nZXRUaW1lKCkpKTsKKwkJfQorCisJCXJlc3VsdC5hcHBlbmQoIiAodGltZURlbHRhOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHRpbWVEZWx0YSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoIik7CisJCWZpbmFsIGxvbmcgZGF5cyA9IHRpbWVEZWx0YSAvIFNURU1UaW1lLlVuaXRzLkRBWS5nZXRNaWxsaXNlY29uZHMoKTsKKwkJcmVzdWx0LmFwcGVuZChkYXlzKTsKKwkJcmVzdWx0LmFwcGVuZChkYXlzID09IDEgPyAiIGRheSkiIDogIiBkYXlzKSIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGR1cmF0aW9uKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrQ29tcGxldGU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQod29ya0NvbXBsZXRlKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vIFNlcXVlbmNlckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci9pbXBsL1NlcXVlbmNlclBhY2thZ2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvaW1wbC9TZXF1ZW5jZXJQYWNrYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZDM5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvaW1wbC9TZXF1ZW5jZXJQYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNDA3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuaW1wbC5FeHBlcmltZW50UGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLmltcGwuTW9kaWZpZXJQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZVBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb1BhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uaW1wbC5TY2VuYXJpb1BhY2thZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5SZWFsVGltZVNlcXVlbmNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVudGlhbFNlcXVlbmNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5pbXBsLlNvbHZlclBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLmltcGwuVHJpZ2dlclBhY2thZ2VJbXBsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNlcXVlbmNlclBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgU2VxdWVuY2VyUGFja2FnZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcmVhbFRpbWVTZXF1ZW5jZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc2VxdWVuY2VyRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHNlcXVlbnRpYWxTZXF1ZW5jZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCisJICogcGFja2FnZSBVUkkgdmFsdWUuCisJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYworCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCisJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKKwkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBTZXF1ZW5jZXJQYWNrYWdlSW1wbCgpIHsKKwkJc3VwZXIoZU5TX1VSSSwgU2VxdWVuY2VyRmFjdG9yeS5lSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIFNlcXVlbmNlclBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFNlcXVlbmNlclBhY2thZ2UgaW5pdCgpIHsKKwkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFNlcXVlbmNlclBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU2VxdWVuY2VyUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCisJCVNlcXVlbmNlclBhY2thZ2VJbXBsIHRoZVNlcXVlbmNlclBhY2thZ2UgPSAoU2VxdWVuY2VyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIFNlcXVlbmNlclBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IFNlcXVlbmNlclBhY2thZ2VJbXBsKCkpOworCisJCWlzSW5pdGVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKKwkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcworCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOworCQlFeHBlcmltZW50UGFja2FnZUltcGwgdGhlRXhwZXJpbWVudFBhY2thZ2UgPSAoRXhwZXJpbWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFeHBlcmltZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEV4cGVyaW1lbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEV4cGVyaW1lbnRQYWNrYWdlLmVOU19VUkkpIDogRXhwZXJpbWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJR3JhcGhQYWNrYWdlSW1wbCB0aGVHcmFwaFBhY2thZ2UgPSAoR3JhcGhQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoR3JhcGhQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgR3JhcGhQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEdyYXBoUGFja2FnZS5lTlNfVVJJKSA6IEdyYXBoUGFja2FnZS5lSU5TVEFOQ0UpOworCQlNb2RlbFBhY2thZ2VJbXBsIHRoZU1vZGVsUGFja2FnZSA9IChNb2RlbFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RlbFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBNb2RlbFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kZWxQYWNrYWdlLmVOU19VUkkpIDogTW9kZWxQYWNrYWdlLmVJTlNUQU5DRSk7CisJCU1vZGlmaWVyUGFja2FnZUltcGwgdGhlTW9kaWZpZXJQYWNrYWdlID0gKE1vZGlmaWVyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGlmaWVyUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIE1vZGlmaWVyUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RpZmllclBhY2thZ2UuZU5TX1VSSSkgOiBNb2RpZmllclBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJUHJlZGljYXRlUGFja2FnZUltcGwgdGhlUHJlZGljYXRlUGFja2FnZSA9IChQcmVkaWNhdGVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUHJlZGljYXRlUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFByZWRpY2F0ZVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUHJlZGljYXRlUGFja2FnZS5lTlNfVVJJKSA6IFByZWRpY2F0ZVBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJU2NlbmFyaW9QYWNrYWdlSW1wbCB0aGVTY2VuYXJpb1BhY2thZ2UgPSAoU2NlbmFyaW9QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU2NlbmFyaW9QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgU2NlbmFyaW9QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNjZW5hcmlvUGFja2FnZS5lTlNfVVJJKSA6IFNjZW5hcmlvUGFja2FnZS5lSU5TVEFOQ0UpOworCQlUcmlnZ2VyUGFja2FnZUltcGwgdGhlVHJpZ2dlclBhY2thZ2UgPSAoVHJpZ2dlclBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUcmlnZ2VyUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFRyaWdnZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRyaWdnZXJQYWNrYWdlLmVOU19VUkkpIDogVHJpZ2dlclBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJU29sdmVyUGFja2FnZUltcGwgdGhlU29sdmVyUGFja2FnZSA9IChTb2x2ZXJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU29sdmVyUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFNvbHZlclBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU29sdmVyUGFja2FnZS5lTlNfVVJJKSA6IFNvbHZlclBhY2thZ2UuZUlOU1RBTkNFKTsKKworCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cworCQl0aGVTZXF1ZW5jZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVFeHBlcmltZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlR3JhcGhQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVNb2RlbFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU1vZGlmaWVyUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlUHJlZGljYXRlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlU2NlbmFyaW9QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVUcmlnZ2VyUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlU29sdmVyUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCisJCXRoZVNlcXVlbmNlclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlRXhwZXJpbWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVHcmFwaFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVNb2RlbFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVNb2RpZmllclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVQcmVkaWNhdGVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlU2NlbmFyaW9QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlVHJpZ2dlclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVTb2x2ZXJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCisJCXRoZVNlcXVlbmNlclBhY2thZ2UuZnJlZXplKCk7CisKKyAgCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoU2VxdWVuY2VyUGFja2FnZS5lTlNfVVJJLCB0aGVTZXF1ZW5jZXJQYWNrYWdlKTsKKwkJcmV0dXJuIHRoZVNlcXVlbmNlclBhY2thZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRSZWFsVGltZVNlcXVlbmNlcigpIHsKKwkJcmV0dXJuIHJlYWxUaW1lU2VxdWVuY2VyRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U2VxdWVuY2VyKCkgeworCQlyZXR1cm4gc2VxdWVuY2VyRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcXVlbmNlcl9TdGFydFRpbWUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzZXF1ZW5jZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXF1ZW5jZXJfRW5kVGltZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcXVlbmNlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcXVlbmNlcl9DdXJyZW50VGltZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcXVlbmNlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcXVlbmNlcl9OZXh0VGltZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcXVlbmNlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcXVlbmNlcl9UaW1lRGVsdGEoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzZXF1ZW5jZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXF1ZW5jZXJfRHVyYXRpb24oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzZXF1ZW5jZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXF1ZW5jZXJfVGltZVRvU3RvcCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNlcXVlbmNlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcXVlbmNlcl9Xb3JrQ29tcGxldGUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzZXF1ZW5jZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXF1ZW5jZXJfV29ya0luY3JlbWVudCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNlcXVlbmNlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcXVlbmNlcl9DeWNsZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNlcXVlbmNlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U2VxdWVudGlhbFNlcXVlbmNlcigpIHsKKwkJcmV0dXJuIHNlcXVlbnRpYWxTZXF1ZW5jZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VxdWVudGlhbFNlcXVlbmNlcl9UaW1lSW5jcmVtZW50KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VxdWVudGlhbFNlcXVlbmNlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTZXF1ZW5jZXJGYWN0b3J5IGdldFNlcXVlbmNlckZhY3RvcnkoKSB7CisJCXJldHVybiAoU2VxdWVuY2VyRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCisJICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOworCQlpc0NyZWF0ZWQgPSB0cnVlOworCisJCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcworCQlyZWFsVGltZVNlcXVlbmNlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRUFMX1RJTUVfU0VRVUVOQ0VSKTsKKworCQlzZXF1ZW5jZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VRVUVOQ0VSKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzZXF1ZW5jZXJFQ2xhc3MsIFNFUVVFTkNFUl9fU1RBUlRfVElNRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2VxdWVuY2VyRUNsYXNzLCBTRVFVRU5DRVJfX0VORF9USU1FKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzZXF1ZW5jZXJFQ2xhc3MsIFNFUVVFTkNFUl9fQ1VSUkVOVF9USU1FKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzZXF1ZW5jZXJFQ2xhc3MsIFNFUVVFTkNFUl9fTkVYVF9USU1FKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzZXF1ZW5jZXJFQ2xhc3MsIFNFUVVFTkNFUl9fVElNRV9ERUxUQSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc2VxdWVuY2VyRUNsYXNzLCBTRVFVRU5DRVJfX0RVUkFUSU9OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzZXF1ZW5jZXJFQ2xhc3MsIFNFUVVFTkNFUl9fVElNRV9UT19TVE9QKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzZXF1ZW5jZXJFQ2xhc3MsIFNFUVVFTkNFUl9fV09SS19DT01QTEVURSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc2VxdWVuY2VyRUNsYXNzLCBTRVFVRU5DRVJfX1dPUktfSU5DUkVNRU5UKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzZXF1ZW5jZXJFQ2xhc3MsIFNFUVVFTkNFUl9fQ1lDTEUpOworCisJCXNlcXVlbnRpYWxTZXF1ZW5jZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VRVUVOVElBTF9TRVFVRU5DRVIpOworCQljcmVhdGVFQXR0cmlidXRlKHNlcXVlbnRpYWxTZXF1ZW5jZXJFQ2xhc3MsIFNFUVVFTlRJQUxfU0VRVUVOQ0VSX19USU1FX0lOQ1JFTUVOVCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOworCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKKwkJc2V0TmFtZShlTkFNRSk7CisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOworCQlzZXROc1VSSShlTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCisJCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7CisJCU1vZGVsUGFja2FnZSB0aGVNb2RlbFBhY2thZ2UgPSAoTW9kZWxQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGVsUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQlyZWFsVGltZVNlcXVlbmNlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNlcXVlbnRpYWxTZXF1ZW5jZXIoKSk7CisJCXNlcXVlbmNlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldElkZW50aWZpYWJsZSgpKTsKKwkJc2VxdWVudGlhbFNlcXVlbmNlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNlcXVlbmNlcigpKTsKKworCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycworCQlpbml0RUNsYXNzKHJlYWxUaW1lU2VxdWVuY2VyRUNsYXNzLCBSZWFsVGltZVNlcXVlbmNlci5jbGFzcywgIlJlYWxUaW1lU2VxdWVuY2VyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzZXF1ZW5jZXJFQ2xhc3MsIFNlcXVlbmNlci5jbGFzcywgIlNlcXVlbmNlciIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFNlcXVlbmNlcl9TdGFydFRpbWUoKSwgdGhlTW9kZWxQYWNrYWdlLmdldFNURU1UaW1lKCksIG51bGwsICJzdGFydFRpbWUiLCBudWxsLCAwLCAxLCBTZXF1ZW5jZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VxdWVuY2VyX0VuZFRpbWUoKSwgdGhlTW9kZWxQYWNrYWdlLmdldFNURU1UaW1lKCksIG51bGwsICJlbmRUaW1lIiwgbnVsbCwgMCwgMSwgU2VxdWVuY2VyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFNlcXVlbmNlcl9DdXJyZW50VGltZSgpLCB0aGVNb2RlbFBhY2thZ2UuZ2V0U1RFTVRpbWUoKSwgbnVsbCwgImN1cnJlbnRUaW1lIiwgbnVsbCwgMCwgMSwgU2VxdWVuY2VyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFNlcXVlbmNlcl9OZXh0VGltZSgpLCB0aGVNb2RlbFBhY2thZ2UuZ2V0U1RFTVRpbWUoKSwgbnVsbCwgIm5leHRUaW1lIiwgbnVsbCwgMCwgMSwgU2VxdWVuY2VyLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFNlcXVlbmNlcl9UaW1lRGVsdGEoKSwgZWNvcmVQYWNrYWdlLmdldEVMb25nKCksICJ0aW1lRGVsdGEiLCBudWxsLCAwLCAxLCBTZXF1ZW5jZXIuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VxdWVuY2VyX0R1cmF0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAiZHVyYXRpb24iLCAiLTEiLCAwLCAxLCBTZXF1ZW5jZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTZXF1ZW5jZXJfVGltZVRvU3RvcCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInRpbWVUb1N0b3AiLCBudWxsLCAwLCAxLCBTZXF1ZW5jZXIuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTZXF1ZW5jZXJfV29ya0NvbXBsZXRlKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJ3b3JrQ29tcGxldGUiLCBudWxsLCAwLCAxLCBTZXF1ZW5jZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VxdWVuY2VyX1dvcmtJbmNyZW1lbnQoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgIndvcmtJbmNyZW1lbnQiLCBudWxsLCAwLCAxLCBTZXF1ZW5jZXIuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTZXF1ZW5jZXJfQ3ljbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgImN5Y2xlIiwgIjAiLCAwLCAxLCBTZXF1ZW5jZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCWFkZEVPcGVyYXRpb24oc2VxdWVuY2VyRUNsYXNzLCBudWxsLCAicmVzZXQiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzZXF1ZW50aWFsU2VxdWVuY2VyRUNsYXNzLCBTZXF1ZW50aWFsU2VxdWVuY2VyLmNsYXNzLCAiU2VxdWVudGlhbFNlcXVlbmNlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTZXF1ZW50aWFsU2VxdWVuY2VyX1RpbWVJbmNyZW1lbnQoKSwgZWNvcmVQYWNrYWdlLmdldEVMb25nKCksICJ0aW1lSW5jcmVtZW50IiwgbnVsbCwgMCwgMSwgU2VxdWVudGlhbFNlcXVlbmNlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIENyZWF0ZSByZXNvdXJjZQorCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKwl9CisKK30gLy9TZXF1ZW5jZXJQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL2ltcGwvU2VxdWVudGlhbFNlcXVlbmNlckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci9pbXBsL1NlcXVlbnRpYWxTZXF1ZW5jZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE5YmNkOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci9pbXBsL1NlcXVlbnRpYWxTZXF1ZW5jZXJJbXBsLmphdmEKQEAgLTAsMCArMSwyOTUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVudGlhbFNlcXVlbmNlcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VxdWVudGlhbCBTZXF1ZW5jZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5TZXF1ZW50aWFsU2VxdWVuY2VySW1wbCNnZXRUaW1lSW5jcmVtZW50IDxlbT5UaW1lIEluY3JlbWVudDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNlcXVlbnRpYWxTZXF1ZW5jZXJJbXBsIGV4dGVuZHMgU2VxdWVuY2VySW1wbCBpbXBsZW1lbnRzCisJCVNlcXVlbnRpYWxTZXF1ZW5jZXIgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaW1lSW5jcmVtZW50KCkgPGVtPlRpbWUgSW5jcmVtZW50PC9lbT59JworCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjZ2V0VGltZUluY3JlbWVudCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBUSU1FX0lOQ1JFTUVOVF9FREVGQVVMVCA9IFNURU1UaW1lLlVuaXRzLkRBWS5nZXRNaWxsaXNlY29uZHMoKTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVJbmNyZW1lbnQoKSA8ZW0+VGltZSBJbmNyZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUaW1lSW5jcmVtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgbG9uZyB0aW1lSW5jcmVtZW50ID0gVElNRV9JTkNSRU1FTlRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGlzIGlzIGFuIGFjY3VtdWxhdG9yIG9mIHRoZSB3b3JrIGluY3JlbWVudCB0aGF0IGtlZXBzIGFjY291bnQgb2YgdGhlCisJICogZnJhY3Rpb24gb2YgdGhlIHdvcmsgaW5jcmVtZW50cyB1bnRpbCB0aGV5IGV4Y2VlZCAxLjAKKwkgKi8KKwlwcml2YXRlIGRvdWJsZSB3b3JrSW5jcmVtZW50UnVubmluZ1RvdGFsID0gMC4wOworCisJLyoqCisJICogSWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiB0aGUgbGFzdCB2YWx1ZSBoYXMgYmVlbiByZXR1cm5lZCBieQorCSAqIHtAbGluayAjZ2V0TmV4dFRpbWUoKX0KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gZW5kT2ZTZXF1ZW5jZVJlYWNoZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIElmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gdGhlIG1ldGhvZCB7QGxpbmsgI2dldE5leHRUaW1lKCl9IGhhcyBub3QKKwkgKiBiZWVuIGNhbGxlZCB5ZXQgc28gd2hlbiBpdCBpcyBpdCBzaG91bGQgcmV0dXJuIHRoZSB2YWx1ZSByZXR1cm5lZCBieQorCSAqIHtAbGluayAjZ2V0U3RhcnRUaW1lKCl9CisJICovCisJcHJpdmF0ZSBib29sZWFuIGdldE5leHRUaW1lTm90Q2FsbGVkID0gdHJ1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIFNlcXVlbnRpYWxTZXF1ZW5jZXJJbXBsKCkgeworCQlzdXBlcigpOworCQkvLyBUaGUgdGltZSBkZWx0YSBpcyBhbHdheXMgdGhlIHNhbWUgd2l0aCBhIHNlcXVlbnRpYWwgc2VxdWVuY2VyCisJCXRpbWVEZWx0YSA9IGdldFRpbWVJbmNyZW1lbnQoKTsKKwl9IC8vIFNlcXVlbnRpYWxTZXF1ZW5jZXJJbXBsCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBTZXF1ZW5jZXJQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTlRJQUxfU0VRVUVOQ0VSOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRUaW1lSW5jcmVtZW50KCkgeworCQlyZXR1cm4gdGltZUluY3JlbWVudDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uc2NlbmFyaW8uaW1wbC5TZXF1ZW5jZXJJbXBsI2lzVGltZVRvU3RvcCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNUaW1lVG9TdG9wKCkgeworCQlyZXR1cm4gZW5kT2ZTZXF1ZW5jZVJlYWNoZWQgfHwgaXNFbmRUaW1lQmVmb3JlKGdldEN1cnJlbnRUaW1lKCkpOworCX0gLy8gaXNUaW1lVG9TdG9wCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRpbWVJbmNyZW1lbnQobG9uZyBuZXdUaW1lSW5jcmVtZW50KSB7CisJCWxvbmcgb2xkVGltZUluY3JlbWVudCA9IHRpbWVJbmNyZW1lbnQ7CisJCXRpbWVJbmNyZW1lbnQgPSBuZXdUaW1lSW5jcmVtZW50OworCQl0aW1lRGVsdGEgPSB0aW1lSW5jcmVtZW50OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAorCQkJCQlTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTlRJQUxfU0VRVUVOQ0VSX19USU1FX0lOQ1JFTUVOVCwKKwkJCQkJb2xkVGltZUluY3JlbWVudCwgdGltZUluY3JlbWVudCkpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5zY2VuYXJpby5pbXBsLlNlcXVlbmNlckltcGwjZ2V0TmV4dFRpbWUoKQorCSAqIAorCSAqIEFtb25nIG90aGVyIHRoaW5ncyB0aGF0IHRoaXMgZG9lcywgaXQgaW5jcmVtZW50cyB0aGUgCisJICogY291bnQgb2YgdGhlIG51bWJlciBvZiBjb21wbGV0ZWQgY3ljbGVzLiAKKwkgKgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTVEVNVGltZSBnZXROZXh0VGltZSgpIHsKKwkJc3VwZXIuZ2V0TmV4dFRpbWUoKTsKKwkJCisJCVNURU1UaW1lIG5leHRUaW1lID0gbnVsbDsKKwkJLy8gSXMgdGhpcyBvdXIgZmlyc3QgY2FsbD8KKwkJaWYgKGdldE5leHRUaW1lTm90Q2FsbGVkKSB7CisJCQkvLyBZZXMKKwkJCS8vIHRoZW4gdGhlIHN0YXJ0IHRpbWUgaXMgdGhlIGZpcnN0IHZhbHVlIHRvIHJldHVybiwgd2UgZG9uJ3QKKwkJCS8vIHRlc3QgZm9yIGl0IHJlbGF0aW9uc2hpcCB0byB0aGUgZW5kIHRpbWUgaGVyZS4gIFRoaXMgbWFrZXMKKwkJCS8vIGl0IHBvc3NpYmxlIHRoYXQgdGhlIHZhbHVlIHJldHVybmVkIHdvdWxkIGJlIGFmdGVyIHRoZSBlbmQgdGltZS4KKwkJCW5leHRUaW1lID0gZ2V0U3RhcnRUaW1lKCk7CisJCQlnZXROZXh0VGltZU5vdENhbGxlZCA9IGZhbHNlOworCQl9IC8vIGlmIGZpcnN0IGNhbGwKKwkJZWxzZSB7CisJCQlmaW5hbCBTVEVNVGltZSBwb3RlbnRpYWxOZXh0VGltZSA9IGdldEN1cnJlbnRUaW1lKCkuYWRkSW5jcmVtZW50KAorCQkJCQlnZXRUaW1lSW5jcmVtZW50KCkpOworCQkJCisJCQkvLyBXYXMgYW4gZW5kIHRpbWUgc3BlY2lmaWVkIGFuZCBpcyBpdCBiZWZvcmUgdGhlIHBvdGVudGlhbCBuZXh0CisJCQkvLyB0aW1lPworCQkJaWYgKGlzRW5kVGltZUJlZm9yZShwb3RlbnRpYWxOZXh0VGltZSkpIHsKKwkJCQkvLyBZZXMKKwkJCQkvLyBUaGVuIHRoZSBlbmQgdGltZSBpcyB0aGUgbmV4dCB2YWx1ZSB0byByZXR1cm4KKwkJCQluZXh0VGltZSA9IChTVEVNVGltZSkgRWNvcmVVdGlsLmNvcHkoZ2V0RW5kVGltZSgpKTsKKwkJCX0gLy8gaWYgZW5kIHRpbWUgc3BlY2lmaWVkCisJCQllbHNlIHsKKwkJCQluZXh0VGltZSA9IHBvdGVudGlhbE5leHRUaW1lOworCQkJfSAvLyBlbHNlCisKKwkJCS8vIEFyZSB3ZSByZXR1cm5pbmcgYSB2YWx1ZSBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIGVuZCB0aW1lPworCQkJaWYgKG5leHRUaW1lLmVxdWFscyhnZXRFbmRUaW1lKCkpKSB7CisJCQkJLy8gWWVzCisJCQkJLy8gb2ssIHRoZW4gdGhpcyBpcyB0aGUgbGFzdCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2UuIFRoZSBuZXh0CisJCQkJLy8gY2FsbAorCQkJCS8vIHRvIGlzVGltZVRvU3RvcCgpIHNob3VsZCBmYWlsCisJCQkJZW5kT2ZTZXF1ZW5jZVJlYWNoZWQgPSB0cnVlOworCQkJfSAvLyBpZgorCQl9IC8vIGVsc2Ugbm90IGZpcnN0IGNhbGwKKwkJc2V0Q3VycmVudFRpbWUobmV4dFRpbWUpOworCQlzZXRXb3JrQ29tcGxldGUoTWF0aC5taW4oZ2V0V29ya0NvbXBsZXRlKCkgKyBnZXRXb3JrSW5jcmVtZW50KCksIDEwMCkpOworCQkKKwkJcmV0dXJuIGdldEN1cnJlbnRUaW1lKCk7CisJfSAvLyBnZXROZXh0VGltZQorCisJLyoqCisJICogQHBhcmFtIHRpbWUKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbmQgdGltZSBpcyBzcGVjaWZpZWQgYW5kIGl0IGlzIGJlZm9yZQorCSAqICAgICAgICAgdGhlIGN1cnJlbnQgdGltZSwgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvdGhlcndpc2UuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmRUaW1lQmVmb3JlKFNURU1UaW1lIHRpbWUpIHsKKwkJcmV0dXJuIGdldEVuZFRpbWUoKSAhPSBudWxsCisJCQkJJiYgKGdldEVuZFRpbWUoKS5nZXRUaW1lKCkuYmVmb3JlKHRpbWUuZ2V0VGltZSgpKSk7CisJfSAvLyBpc0VuZFRpbWVCZWZvcmUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5zY2VuYXJpby5pbXBsLlNlcXVlbmNlckltcGwjZ2V0V29ya0luY3JlbWVudCgpCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoImNhc3QiKQorCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZ2V0V29ya0luY3JlbWVudCgpIHsKKwkJaW50IHJldFZhbHVlID0gMDsKKwkJLy8gSXMgdGhlcmUgYSB3b3JrIGluY3JlbWVudD8KKwkJaWYgKGdldER1cmF0aW9uKCkgIT0gVU5LTk9XTl9EVVJBVElPTikgeworCQkJLy8gWWVzCisJCQkvLyBUaGUgd29yayBpbmNyZW1lbnQgY291bGQgYmUgZnJhY3Rpb25hbCAoPDEuMCkuIElmIHNvIHRoZW4gaXQgd2lsbAorCQkJLy8gbm90IGFjY3VtdWxhdGUgaW4gdGhlIHByb2dyZXNzIG1vbml0b3IuIFNvLCB3ZSBrZWVwIGEgcnVubmluZyBzdW0KKwkJCS8vIG9mIHRoZSB3b3JrIGluY3JlbWVudCBhbmQgd2hlbiBpdCBleGNlZWRzIDEuMCB3ZSByZXR1cm4gdGhlIHZhbHVlCisJCQkvLyBsZXNzIHRoZSBmcmFjdGlvbmFsIHBhcnQgYW5kIGtlZXAgdGhhdCBmb3IgdGhlIGZ1dHVyZS4KKwkJCXdvcmtJbmNyZW1lbnRSdW5uaW5nVG90YWwgKz0gMTAwLjAgKiAoZG91YmxlKSBnZXRUaW1lSW5jcmVtZW50KCkKKwkJCQkJLyAoZG91YmxlKSAoZ2V0RHVyYXRpb24oKStnZXRUaW1lSW5jcmVtZW50KCkpOworCisJCQkvLyBEbyB3ZSBoYXZlIG1vcmUgdGhhbiAxLjA/CisJCQlpZiAod29ya0luY3JlbWVudFJ1bm5pbmdUb3RhbCA+PSAxLjApIHsKKwkJCQkvLyBZZXMKKwkJCQlyZXRWYWx1ZSA9IChpbnQpIHdvcmtJbmNyZW1lbnRSdW5uaW5nVG90YWw7CisJCQkJd29ya0luY3JlbWVudFJ1bm5pbmdUb3RhbCAtPSByZXRWYWx1ZTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXRWYWx1ZTsKKworCX0gLy8gZ2V0V29ya0luY3JlbWVudAorCisJLyoqCisJICogaGFuZGxlIHdoYXQgbmVlZHMgdG8gYmUgZG9uZSB3aGVuIGEgc2ltdWxhdGlvbiBpcyByZXNldC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJc3VwZXIucmVzZXQoKTsKKwkJd29ya0luY3JlbWVudFJ1bm5pbmdUb3RhbCA9IDAuMDsKKwkJZ2V0TmV4dFRpbWVOb3RDYWxsZWQgPSB0cnVlOworCQllbmRPZlNlcXVlbmNlUmVhY2hlZCA9IGZhbHNlOworCX0gLy8gcmVzZXQKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTlRJQUxfU0VRVUVOQ0VSX19USU1FX0lOQ1JFTUVOVDoKKwkJCQlyZXR1cm4gZ2V0VGltZUluY3JlbWVudCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTlRJQUxfU0VRVUVOQ0VSX19USU1FX0lOQ1JFTUVOVDoKKwkJCQlzZXRUaW1lSW5jcmVtZW50KChMb25nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5USUFMX1NFUVVFTkNFUl9fVElNRV9JTkNSRU1FTlQ6CisJCQkJc2V0VGltZUluY3JlbWVudChUSU1FX0lOQ1JFTUVOVF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTlRJQUxfU0VRVUVOQ0VSX19USU1FX0lOQ1JFTUVOVDoKKwkJCQlyZXR1cm4gdGltZUluY3JlbWVudCAhPSBUSU1FX0lOQ1JFTUVOVF9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiICh0aW1lSW5jcmVtZW50OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHRpbWVJbmNyZW1lbnQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy8gU2VxdWVudGlhbFNlcXVlbmNlckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci9wcm92aWRlci9SZWFsVGltZVNlcXVlbmNlckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL3Byb3ZpZGVyL1JlYWxUaW1lU2VxdWVuY2VySXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1ZTYzMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci9wcm92aWRlci9SZWFsVGltZVNlcXVlbmNlckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlJlYWxUaW1lU2VxdWVuY2VyOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5SZWFsVGltZVNlcXVlbmNlcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUmVhbFRpbWVTZXF1ZW5jZXJJdGVtUHJvdmlkZXIKKwlleHRlbmRzIFNlcXVlbnRpYWxTZXF1ZW5jZXJJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUmVhbFRpbWVTZXF1ZW5jZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgUmVhbFRpbWVTZXF1ZW5jZXIuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbW9iajE2L1JlYWxUaW1lU2VxdWVuY2VyIikpOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChSZWFsVGltZVNlcXVlbmNlcilvYmplY3QpLmdldFVSSSgpOworCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1JlYWxUaW1lU2VxdWVuY2VyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX1JlYWxUaW1lU2VxdWVuY2VyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci9wcm92aWRlci9TZXF1ZW5jZXJJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci9wcm92aWRlci9TZXF1ZW5jZXJJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDA2MDNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL3Byb3ZpZGVyL1NlcXVlbmNlckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDAxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db3JlRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLklkZW50aWZpYWJsZUl0ZW1Qcm92aWRlcjsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTZXF1ZW5jZXJJdGVtUHJvdmlkZXIKKwlleHRlbmRzIElkZW50aWZpYWJsZUl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTZXF1ZW5jZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkU3RhcnRUaW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRFbmRUaW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRDdXJyZW50VGltZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkTmV4dFRpbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFRpbWVEZWx0YVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkRHVyYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFRpbWVUb1N0b3BQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFdvcmtDb21wbGV0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkV29ya0luY3JlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkQ3ljbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCQorCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdGFydCBUaW1lIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkU3RhcnRUaW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU2VxdWVuY2VyX3N0YXJ0VGltZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXF1ZW5jZXJfc3RhcnRUaW1lX2ZlYXR1cmUiLCAiX1VJX1NlcXVlbmNlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFNlcXVlbmNlclBhY2thZ2UuTGl0ZXJhbHMuU0VRVUVOQ0VSX19TVEFSVF9USU1FLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRW5kIFRpbWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRUaW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU2VxdWVuY2VyX2VuZFRpbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VxdWVuY2VyX2VuZFRpbWVfZmVhdHVyZSIsICJfVUlfU2VxdWVuY2VyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU2VxdWVuY2VyUGFja2FnZS5MaXRlcmFscy5TRVFVRU5DRVJfX0VORF9USU1FLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ3VycmVudCBUaW1lIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQ3VycmVudFRpbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TZXF1ZW5jZXJfY3VycmVudFRpbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VxdWVuY2VyX2N1cnJlbnRUaW1lX2ZlYXR1cmUiLCAiX1VJX1NlcXVlbmNlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFNlcXVlbmNlclBhY2thZ2UuTGl0ZXJhbHMuU0VRVUVOQ0VSX19DVVJSRU5UX1RJTUUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmV4dCBUaW1lIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkTmV4dFRpbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TZXF1ZW5jZXJfbmV4dFRpbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VxdWVuY2VyX25leHRUaW1lX2ZlYXR1cmUiLCAiX1VJX1NlcXVlbmNlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFNlcXVlbmNlclBhY2thZ2UuTGl0ZXJhbHMuU0VRVUVOQ0VSX19ORVhUX1RJTUUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGltZSBEZWx0YSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFRpbWVEZWx0YVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NlcXVlbmNlcl90aW1lRGVsdGFfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VxdWVuY2VyX3RpbWVEZWx0YV9mZWF0dXJlIiwgIl9VSV9TZXF1ZW5jZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTZXF1ZW5jZXJQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTkNFUl9fVElNRV9ERUxUQSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEdXJhdGlvbiBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZER1cmF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU2VxdWVuY2VyX2R1cmF0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcXVlbmNlcl9kdXJhdGlvbl9mZWF0dXJlIiwgIl9VSV9TZXF1ZW5jZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTZXF1ZW5jZXJQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTkNFUl9fRFVSQVRJT04sCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuSU5URUdSQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGltZSBUbyBTdG9wIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkVGltZVRvU3RvcFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NlcXVlbmNlcl90aW1lVG9TdG9wX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcXVlbmNlcl90aW1lVG9TdG9wX2ZlYXR1cmUiLCAiX1VJX1NlcXVlbmNlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFNlcXVlbmNlclBhY2thZ2UuTGl0ZXJhbHMuU0VRVUVOQ0VSX19USU1FX1RPX1NUT1AsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXb3JrIENvbXBsZXRlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkV29ya0NvbXBsZXRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU2VxdWVuY2VyX3dvcmtDb21wbGV0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXF1ZW5jZXJfd29ya0NvbXBsZXRlX2ZlYXR1cmUiLCAiX1VJX1NlcXVlbmNlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFNlcXVlbmNlclBhY2thZ2UuTGl0ZXJhbHMuU0VRVUVOQ0VSX19XT1JLX0NPTVBMRVRFLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV29yayBJbmNyZW1lbnQgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRXb3JrSW5jcmVtZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU2VxdWVuY2VyX3dvcmtJbmNyZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VxdWVuY2VyX3dvcmtJbmNyZW1lbnRfZmVhdHVyZSIsICJfVUlfU2VxdWVuY2VyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU2VxdWVuY2VyUGFja2FnZS5MaXRlcmFscy5TRVFVRU5DRVJfX1dPUktfSU5DUkVNRU5ULAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEN5Y2xlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQ3ljbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TZXF1ZW5jZXJfY3ljbGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VxdWVuY2VyX2N5Y2xlX2ZlYXR1cmUiLCAiX1VJX1NlcXVlbmNlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFNlcXVlbmNlclBhY2thZ2UuTGl0ZXJhbHMuU0VRVUVOQ0VSX19DWUNMRSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlVUkkgbGFiZWxWYWx1ZSA9ICgoU2VxdWVuY2VyKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfU2VxdWVuY2VyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX1NlcXVlbmNlcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCQorCS8qKgorCSAqIFRoaXMgcmV0dXJucyBTZXF1ZW5jZXIuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbW9iajE2L1NlcXVlbmNlciIpKTsKKwl9CisJCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VxdWVuY2VyLmNsYXNzKSkgeworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fU1RBUlRfVElNRToKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX0VORF9USU1FOgorCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fQ1VSUkVOVF9USU1FOgorCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fVElNRV9ERUxUQToKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX0RVUkFUSU9OOgorCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fVElNRV9UT19TVE9QOgorCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fV09SS19DT01QTEVURToKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5DRVJfX1dPUktfSU5DUkVNRU5UOgorCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTkNFUl9fQ1lDTEU6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIENvcmVFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL3Byb3ZpZGVyL1NlcXVlbmNlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvcHJvdmlkZXIvU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2RlZWUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL3Byb3ZpZGVyL1NlcXVlbmNlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMzMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIudXRpbC5TZXF1ZW5jZXJBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuCisgKiBUaGUgYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4KKyAqIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCisgKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFNlcXVlbmNlckFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieSB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248T2JqZWN0PiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5SZWFsVGltZVNlcXVlbmNlcn0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBSZWFsVGltZVNlcXVlbmNlckl0ZW1Qcm92aWRlciByZWFsVGltZVNlcXVlbmNlckl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlJlYWxUaW1lU2VxdWVuY2VyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWFsVGltZVNlcXVlbmNlckFkYXB0ZXIoKSB7CisJCWlmIChyZWFsVGltZVNlcXVlbmNlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlyZWFsVGltZVNlcXVlbmNlckl0ZW1Qcm92aWRlciA9IG5ldyBSZWFsVGltZVNlcXVlbmNlckl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiByZWFsVGltZVNlcXVlbmNlckl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVudGlhbFNlcXVlbmNlcn0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTZXF1ZW50aWFsU2VxdWVuY2VySXRlbVByb3ZpZGVyIHNlcXVlbnRpYWxTZXF1ZW5jZXJJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW50aWFsU2VxdWVuY2VyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXF1ZW50aWFsU2VxdWVuY2VyQWRhcHRlcigpIHsKKwkJaWYgKHNlcXVlbnRpYWxTZXF1ZW5jZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJc2VxdWVudGlhbFNlcXVlbmNlckl0ZW1Qcm92aWRlciA9IG5ldyBTZXF1ZW50aWFsU2VxdWVuY2VySXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHNlcXVlbnRpYWxTZXF1ZW5jZXJJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7CisJCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOworCX0KKworCS8qKgorCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKKwkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7CisJCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgeworCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgeworCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOworCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzPD8+KSB8fCAoKChDbGFzczw/Pil0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgeworCQkJCXJldHVybiBhZGFwdGVyOworCQkJfQorCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKKwkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9IGFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisKKwkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKKwkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGRpc3Bvc2VzIGFsbCBvZiB0aGUgaXRlbSBwcm92aWRlcnMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkuIAorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWlmIChyZWFsVGltZVNlcXVlbmNlckl0ZW1Qcm92aWRlciAhPSBudWxsKSByZWFsVGltZVNlcXVlbmNlckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChzZXF1ZW50aWFsU2VxdWVuY2VySXRlbVByb3ZpZGVyICE9IG51bGwpIHNlcXVlbnRpYWxTZXF1ZW5jZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL3Byb3ZpZGVyL1NlcXVlbnRpYWxTZXF1ZW5jZXJJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci9wcm92aWRlci9TZXF1ZW50aWFsU2VxdWVuY2VySXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2NjhiMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci9wcm92aWRlci9TZXF1ZW50aWFsU2VxdWVuY2VySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNjkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVudGlhbFNlcXVlbmNlcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVudGlhbFNlcXVlbmNlcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFNlcXVlbmNlckl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgU2VxdWVuY2VySXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cwkKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNlcXVlbnRpYWxTZXF1ZW5jZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkVGltZUluY3JlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGltZSBJbmNyZW1lbnQgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUaW1lSW5jcmVtZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU2VxdWVudGlhbFNlcXVlbmNlcl90aW1lSW5jcmVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcXVlbnRpYWxTZXF1ZW5jZXJfdGltZUluY3JlbWVudF9mZWF0dXJlIiwgIl9VSV9TZXF1ZW50aWFsU2VxdWVuY2VyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU2VxdWVuY2VyUGFja2FnZS5MaXRlcmFscy5TRVFVRU5USUFMX1NFUVVFTkNFUl9fVElNRV9JTkNSRU1FTlQsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBTZXF1ZW5jZXIuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbW9iajE2L1NlcXVlbmNlciIpKTsKKwl9CisJCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChTZXF1ZW50aWFsU2VxdWVuY2VyKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfU2VxdWVudGlhbFNlcXVlbmNlcl90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9TZXF1ZW50aWFsU2VxdWVuY2VyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZXF1ZW50aWFsU2VxdWVuY2VyLmNsYXNzKSkgeworCQkJY2FzZSBTZXF1ZW5jZXJQYWNrYWdlLlNFUVVFTlRJQUxfU0VRVUVOQ0VSX19USU1FX0lOQ1JFTUVOVDoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL3V0aWwvU2VxdWVuY2VyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci91dGlsL1NlcXVlbmNlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwMjc1ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci91dGlsL1NlcXVlbmNlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMDMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci51dGlsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5SZWFsVGltZVNlcXVlbmNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW50aWFsU2VxdWVuY2VyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTZXF1ZW5jZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgU2VxdWVuY2VyUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNlcXVlbmNlckFkYXB0ZXJGYWN0b3J5KCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IFNlcXVlbmNlclBhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgeworCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKKwkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTZXF1ZW5jZXJTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgU2VxdWVuY2VyU3dpdGNoPEFkYXB0ZXI+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVhbFRpbWVTZXF1ZW5jZXIoUmVhbFRpbWVTZXF1ZW5jZXIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVJlYWxUaW1lU2VxdWVuY2VyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU2VxdWVuY2VyKFNlcXVlbmNlciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU2VxdWVuY2VyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU2VxdWVudGlhbFNlcXVlbmNlcihTZXF1ZW50aWFsU2VxdWVuY2VyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTZXF1ZW50aWFsU2VxdWVuY2VyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgPFQ+IEFkYXB0ZXIgY2FzZUNvbXBhcmFibGUoQ29tcGFyYWJsZTxUPiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ29tcGFyYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCisJICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7CisJCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOworCX0KKworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlJlYWxUaW1lU2VxdWVuY2VyIDxlbT5SZWFsIFRpbWUgU2VxdWVuY2VyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuUmVhbFRpbWVTZXF1ZW5jZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVhbFRpbWVTZXF1ZW5jZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyIDxlbT5TZXF1ZW5jZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VxdWVuY2VyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbnRpYWxTZXF1ZW5jZXIgPGVtPlNlcXVlbnRpYWwgU2VxdWVuY2VyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVudGlhbFNlcXVlbmNlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXF1ZW50aWFsU2VxdWVuY2VyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLmxhbmcuQ29tcGFyYWJsZSA8ZW0+Q29tcGFyYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9TZXF1ZW5jZXJBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL3V0aWwvU2VxdWVuY2VyU3dpdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvdXRpbC9TZXF1ZW5jZXJTd2l0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmQzNmU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL3V0aWwvU2VxdWVuY2VyU3dpdGNoLmphdmEKQEAgLTAsMCArMSwyMTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci51dGlsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLio7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCisgKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9CisgKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCisgKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAorICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQorICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCisgKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTZXF1ZW5jZXJTd2l0Y2g8VDE+IHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFNlcXVlbmNlclBhY2thZ2UgbW9kZWxQYWNrYWdlOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTZXF1ZW5jZXJTd2l0Y2goKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gU2VxdWVuY2VyUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOworCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQxIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOworCQl9CisJCWVsc2UgeworCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7CisJCQlyZXR1cm4KKwkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPworCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6CisJCQkJCWRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUMSBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5SRUFMX1RJTUVfU0VRVUVOQ0VSOiB7CisJCQkJUmVhbFRpbWVTZXF1ZW5jZXIgcmVhbFRpbWVTZXF1ZW5jZXIgPSAoUmVhbFRpbWVTZXF1ZW5jZXIpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlUmVhbFRpbWVTZXF1ZW5jZXIocmVhbFRpbWVTZXF1ZW5jZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNlcXVlbnRpYWxTZXF1ZW5jZXIocmVhbFRpbWVTZXF1ZW5jZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNlcXVlbmNlcihyZWFsVGltZVNlcXVlbmNlcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHJlYWxUaW1lU2VxdWVuY2VyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHJlYWxUaW1lU2VxdWVuY2VyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFNlcXVlbmNlclBhY2thZ2UuU0VRVUVOQ0VSOiB7CisJCQkJU2VxdWVuY2VyIHNlcXVlbmNlciA9IChTZXF1ZW5jZXIpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU2VxdWVuY2VyKHNlcXVlbmNlcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHNlcXVlbmNlcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShzZXF1ZW5jZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgU2VxdWVuY2VyUGFja2FnZS5TRVFVRU5USUFMX1NFUVVFTkNFUjogeworCQkJCVNlcXVlbnRpYWxTZXF1ZW5jZXIgc2VxdWVudGlhbFNlcXVlbmNlciA9IChTZXF1ZW50aWFsU2VxdWVuY2VyKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVNlcXVlbnRpYWxTZXF1ZW5jZXIoc2VxdWVudGlhbFNlcXVlbmNlcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2VxdWVuY2VyKHNlcXVlbnRpYWxTZXF1ZW5jZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShzZXF1ZW50aWFsU2VxdWVuY2VyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHNlcXVlbnRpYWxTZXF1ZW5jZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlYWwgVGltZSBTZXF1ZW5jZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWFsIFRpbWUgU2VxdWVuY2VyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVJlYWxUaW1lU2VxdWVuY2VyKFJlYWxUaW1lU2VxdWVuY2VyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXF1ZW5jZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXF1ZW5jZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlU2VxdWVuY2VyKFNlcXVlbmNlciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VxdWVudGlhbCBTZXF1ZW5jZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXF1ZW50aWFsIFNlcXVlbmNlcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTZXF1ZW50aWFsU2VxdWVuY2VyKFNlcXVlbnRpYWxTZXF1ZW5jZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgPFQ+IFQxIGNhc2VDb21wYXJhYmxlKENvbXBhcmFibGU8VD4gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9TZXF1ZW5jZXJTd2l0Y2gKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlci9Tb2x2ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlci9Tb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzc0ZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL1NvbHZlci5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXI7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNvbHZlcjwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlciNnZXREZWNvcmF0b3JzIDxlbT5EZWNvcmF0b3JzPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXIjaXNJbml0aWFsaXplZCA8ZW0+SW5pdGlhbGl6ZWQ8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclBhY2thZ2UjZ2V0U29sdmVyKCkNCisgKiBAbW9kZWwNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBTb2x2ZXIgZXh0ZW5kcyBJZGVudGlmaWFibGUgew0KKwkNCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVJJX1RZUEUgPSAiU29sdmVyIjsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlY29yYXRvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlY29yYXRvcnM8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlY29yYXRvcnM8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXREZWNvcmF0b3JzKEVMaXN0KQ0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUGFja2FnZSNnZXRTb2x2ZXJfRGVjb3JhdG9ycygpDQorCSAqIEBtb2RlbCBtYW55PSJmYWxzZSIgdHJhbnNpZW50PSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFTGlzdDxEZWNvcmF0b3I+IGdldERlY29yYXRvcnMoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyI2dldERlY29yYXRvcnMgPGVtPkRlY29yYXRvcnM8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlY29yYXRvcnM8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXREZWNvcmF0b3JzKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXREZWNvcmF0b3JzKEVMaXN0PERlY29yYXRvcj4gdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdGlhbGl6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluaXRpYWxpemVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsaXplZDwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldEluaXRpYWxpemVkKGJvb2xlYW4pDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXJQYWNrYWdlI2dldFNvbHZlcl9Jbml0aWFsaXplZCgpDQorCSAqIEBtb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlib29sZWFuIGlzSW5pdGlhbGl6ZWQoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyI2lzSW5pdGlhbGl6ZWQgPGVtPkluaXRpYWxpemVkPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsaXplZDwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2lzSW5pdGlhbGl6ZWQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldEluaXRpYWxpemVkKGJvb2xlYW4gdmFsdWUpOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBtb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlib29sZWFuIHN0ZXAoU1RFTVRpbWUgdGltZSwgbG9uZyB0aW1lRGVsdGEsIGludCBjeWNsZSk7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQG1vZGVsDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgcmVzZXQoKTsNCisNCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTVEVNVGltZSB0KTsNCit9IC8vIFNvbHZlcg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlci9Tb2x2ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvU29sdmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NDY1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvU29sdmVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlcjsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5Ow0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuDQorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclBhY2thZ2UNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBTb2x2ZXJGYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnkgew0KKwkvKioNCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVNvbHZlckZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5pbXBsLlNvbHZlckZhY3RvcnlJbXBsLmluaXQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U29sdmVyPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Tb2x2ZXI8L2VtPicuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVNvbHZlciBjcmVhdGVTb2x2ZXIoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU29sdmVyUGFja2FnZSBnZXRTb2x2ZXJQYWNrYWdlKCk7DQorDQorfSAvL1NvbHZlckZhY3RvcnkNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvU29sdmVyUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL1NvbHZlclBhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjQ3MmEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL1NvbHZlclBhY2thZ2UuamF2YQpAQCAtMCwwICsxLDIxNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2U7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4NCisgKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50DQorICogPHVsPg0KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4NCisgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPg0KKyAqICAgPGxpPmVhY2ggZW51bSw8L2xpPg0KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+DQorICogPC91bD4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyRmFjdG9yeQ0KKyAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIFNvbHZlclBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7DQorCS8qKg0KKwkgKiBUaGUgcGFja2FnZSBuYW1lLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGVOQU1FID0gInNvbHZlciI7IC8vJE5PTi1OTFMtMSQNCisNCisJLyoqDQorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlciI7IC8vJE5PTi1OTFMtMSQNCisNCisJLyoqDQorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlciI7IC8vJE5PTi1OTFMtMSQNCisNCisJLyoqDQorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTb2x2ZXJQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuaW1wbC5Tb2x2ZXJQYWNrYWdlSW1wbC5pbml0KCk7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuaW1wbC5Tb2x2ZXJJbXBsIDxlbT5Tb2x2ZXI8L2VtPn0nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLmltcGwuU29sdmVySW1wbA0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuaW1wbC5Tb2x2ZXJQYWNrYWdlSW1wbCNnZXRTb2x2ZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgU09MVkVSID0gMDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTT0xWRVJfX1VSSSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19VUkk7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTT0xWRVJfX1RZUEVfVVJJID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfX1RZUEVfVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU09MVkVSX19EVUJMSU5fQ09SRSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19EVUJMSU5fQ09SRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWNvcmF0b3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU09MVkVSX19ERUNPUkFUT1JTID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbGl6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTT0xWRVJfX0lOSVRJQUxJWkVEID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDE7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U29sdmVyPC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNPTFZFUl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDI7DQorDQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlciA8ZW0+U29sdmVyPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNvbHZlcjwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlcg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0U29sdmVyKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyI2dldERlY29yYXRvcnMgPGVtPkRlY29yYXRvcnM8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWNvcmF0b3JzPC9lbT4nLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyI2dldERlY29yYXRvcnMoKQ0KKwkgKiBAc2VlICNnZXRTb2x2ZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldFNvbHZlcl9EZWNvcmF0b3JzKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyI2lzSW5pdGlhbGl6ZWQgPGVtPkluaXRpYWxpemVkPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5pdGlhbGl6ZWQ8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXIjaXNJbml0aWFsaXplZCgpDQorCSAqIEBzZWUgI2dldFNvbHZlcigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0U29sdmVyX0luaXRpYWxpemVkKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTb2x2ZXJGYWN0b3J5IGdldFNvbHZlckZhY3RvcnkoKTsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQNCisJICogPHVsPg0KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+DQorCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+DQorCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPg0KKwkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPg0KKwkgKiA8L3VsPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50ZXJmYWNlIExpdGVyYWxzIHsNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuaW1wbC5Tb2x2ZXJJbXBsIDxlbT5Tb2x2ZXI8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLmltcGwuU29sdmVySW1wbA0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLmltcGwuU29sdmVyUGFja2FnZUltcGwjZ2V0U29sdmVyKCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIFNPTFZFUiA9IGVJTlNUQU5DRS5nZXRTb2x2ZXIoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlY29yYXRvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIFNPTFZFUl9fREVDT1JBVE9SUyA9IGVJTlNUQU5DRS5nZXRTb2x2ZXJfRGVjb3JhdG9ycygpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbGl6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIFNPTFZFUl9fSU5JVElBTElaRUQgPSBlSU5TVEFOQ0UuZ2V0U29sdmVyX0luaXRpYWxpemVkKCk7DQorDQorCX0NCisNCit9IC8vU29sdmVyUGFja2FnZQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlci9pbXBsL1NvbHZlckZhY3RvcnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvaW1wbC9Tb2x2ZXJGYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MzNmODUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvaW1wbC9Tb2x2ZXJGYWN0b3J5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuaW1wbDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLio7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTb2x2ZXJGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFNvbHZlckZhY3Rvcnkgew0KKwkvKioNCisJICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTb2x2ZXJGYWN0b3J5IGluaXQoKSB7DQorCQl0cnkgew0KKwkJCVNvbHZlckZhY3RvcnkgdGhlU29sdmVyRmFjdG9yeSA9IChTb2x2ZXJGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlciIpOyAvLyROT04tTkxTLTEkIA0KKwkJCWlmICh0aGVTb2x2ZXJGYWN0b3J5ICE9IG51bGwpIHsNCisJCQkJcmV0dXJuIHRoZVNvbHZlckZhY3Rvcnk7DQorCQkJfQ0KKwkJfQ0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCX0NCisJCXJldHVybiBuZXcgU29sdmVyRmFjdG9yeUltcGwoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTb2x2ZXJGYWN0b3J5SW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsNCisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7DQorCQkJY2FzZSBTb2x2ZXJQYWNrYWdlLlNPTFZFUjogcmV0dXJuIGNyZWF0ZVNvbHZlcigpOw0KKwkJCWRlZmF1bHQ6DQorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNvbHZlciBjcmVhdGVTb2x2ZXIoKSB7DQorCQlTb2x2ZXJJbXBsIHNvbHZlciA9IG5ldyBTb2x2ZXJJbXBsKCk7DQorCQlyZXR1cm4gc29sdmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNvbHZlclBhY2thZ2UgZ2V0U29sdmVyUGFja2FnZSgpIHsNCisJCXJldHVybiAoU29sdmVyUGFja2FnZSlnZXRFUGFja2FnZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGRlcHJlY2F0ZWQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQERlcHJlY2F0ZWQNCisJcHVibGljIHN0YXRpYyBTb2x2ZXJQYWNrYWdlIGdldFBhY2thZ2UoKSB7DQorCQlyZXR1cm4gU29sdmVyUGFja2FnZS5lSU5TVEFOQ0U7DQorCX0NCisNCit9IC8vU29sdmVyRmFjdG9yeUltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvaW1wbC9Tb2x2ZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvaW1wbC9Tb2x2ZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTExYzkwNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlci9pbXBsL1NvbHZlckltcGwuamF2YQpAQCAtMCwwICsxLDI5MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLmltcGw7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuSWRlbnRpZmlhYmxlSW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TaW1wbGVEYXRhRXhjaGFuZ2VMYWJlbFZhbHVlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUGFja2FnZTsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Tb2x2ZXI8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5pbXBsLlNvbHZlckltcGwjZ2V0RGVjb3JhdG9ycyA8ZW0+RGVjb3JhdG9yczwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuaW1wbC5Tb2x2ZXJJbXBsI2lzSW5pdGlhbGl6ZWQgPGVtPkluaXRpYWxpemVkPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU29sdmVySW1wbCBleHRlbmRzIElkZW50aWZpYWJsZUltcGwgaW1wbGVtZW50cyBTb2x2ZXIgew0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVjb3JhdG9ycygpIDxlbT5EZWNvcmF0b3JzPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXREZWNvcmF0b3JzKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVMaXN0PERlY29yYXRvcj4gZGVjb3JhdG9yczsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0luaXRpYWxpemVkKCkgPGVtPkluaXRpYWxpemVkPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNpc0luaXRpYWxpemVkKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElOSVRJQUxJWkVEX0VERUZBVUxUID0gZmFsc2U7DQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0luaXRpYWxpemVkKCkgPGVtPkluaXRpYWxpemVkPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNpc0luaXRpYWxpemVkKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBJTklUSUFMSVpFRF9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIFNvbHZlckltcGwoKSB7DQorCQlzdXBlcigpOw0KKwkJdGhpcy5zZXRUeXBlVVJJKFNURU1VUkkuU09MVkVSX1RZUEVfVVJJKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBTb2x2ZXJQYWNrYWdlLkxpdGVyYWxzLlNPTFZFUjsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFTGlzdDxEZWNvcmF0b3I+IGdldERlY29yYXRvcnMoKSB7DQorCQlyZXR1cm4gZGVjb3JhdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldERlY29yYXRvcnMoRUxpc3Q8RGVjb3JhdG9yPiBuZXdEZWNvcmF0b3JzKSB7DQorCQlFTGlzdDxEZWNvcmF0b3I+IG9sZERlY29yYXRvcnMgPSBkZWNvcmF0b3JzOw0KKwkJZGVjb3JhdG9ycyA9IG5ld0RlY29yYXRvcnM7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU29sdmVyUGFja2FnZS5TT0xWRVJfX0RFQ09SQVRPUlMsIG9sZERlY29yYXRvcnMsIGRlY29yYXRvcnMpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7DQorCQlyZXR1cm4gaW5pdGlhbGl6ZWQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXplZChib29sZWFuIG5ld0luaXRpYWxpemVkKSB7DQorCQlib29sZWFuIG9sZEluaXRpYWxpemVkID0gaW5pdGlhbGl6ZWQ7DQorCQlpbml0aWFsaXplZCA9IG5ld0luaXRpYWxpemVkOw0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNvbHZlclBhY2thZ2UuU09MVkVSX19JTklUSUFMSVpFRCwgb2xkSW5pdGlhbGl6ZWQsIGluaXRpYWxpemVkKSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBzdGVwKFNURU1UaW1lIHRpbWUsIGxvbmcgdGltZURlbHRhLCBpbnQgY3ljbGUpIHsNCisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZA0KKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QNCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVzZXQoKSB7DQorCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QNCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UDQorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisJfQ0KKw0KKwkvKioNCisJICogaW5pdGlhbGl6ZSBiZWZvcmUgc2ltdWxhdGlvbiBiZWdpbnMuIFJld2luZC9mb3J3YXJkIGFueSBwb3B1bGF0aW9uIG1vZGVsDQorCSAqIHZhbHVlcyB0byB0aGUgc3RhcnQgdGltZSBvZiB0aGUgc2VxdWVuY2VyDQorCSAqIEBwYXJhbSB0aW1lDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFNURU1UaW1lIHRpbWUpIHsNCisJCUVMaXN0PERlY29yYXRvcj4gcmVkb0xpc3QgPSBuZXcgQmFzaWNFTGlzdDxEZWNvcmF0b3I+KCk7DQorCQkNCisJCWJvb2xlYW4gcmVkbyA9IGZhbHNlOw0KKwkJZm9yKERlY29yYXRvciBkOnRoaXMuZ2V0RGVjb3JhdG9ycygpKSB7DQorCQkJaWYoZCBpbnN0YW5jZW9mIEludGVncmF0aW9uRGVjb3JhdG9yKSB7DQorCQkJCUVMaXN0PER5bmFtaWNMYWJlbD4gbGFiZWxzID0gZC5nZXRMYWJlbHNUb1VwZGF0ZSgpOw0KKwkJCQlmb3IoRHluYW1pY0xhYmVsIGw6bGFiZWxzKSB7DQorCQkJCQlpZihsIGluc3RhbmNlb2YgSW50ZWdyYXRpb25MYWJlbCkgew0KKwkJCQkJCUludGVncmF0aW9uTGFiZWwgaWwgPSAoSW50ZWdyYXRpb25MYWJlbClsOw0KKwkJCQkJCWlsLnJlc2V0KHRpbWUpOw0KKwkJCQkJCWlmKCgoU2ltcGxlRGF0YUV4Y2hhbmdlTGFiZWxWYWx1ZSlpbC5nZXREZWx0YVZhbHVlKCkpLmdldEFycml2YWxzKCkuc2l6ZSgpID4gMCB8fA0KKwkJCQkJCQkJKChTaW1wbGVEYXRhRXhjaGFuZ2VMYWJlbFZhbHVlKWlsLmdldERlbHRhVmFsdWUoKSkuZ2V0RGVwYXJ0dXJlcygpLnNpemUoKSA+IDApDQorCQkJCQkJCXJlZG8gPSB0cnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmKCFyZWRvKXJlZG9MaXN0LmFkZChkKTsNCisJCX0NCisJCS8vIEZpeCBkZWNvcmF0b3JzIHdpdGggdW5hcHBsaWVkIGRlbHRhcw0KKwkJaWYocmVkbykgew0KKwkJCWZvcihEZWNvcmF0b3IgZDpyZWRvTGlzdCkgew0KKwkJCQlpZihkIGluc3RhbmNlb2YgSW50ZWdyYXRpb25EZWNvcmF0b3IpIHsNCisJCQkJCUVMaXN0PER5bmFtaWNMYWJlbD4gbGFiZWxzID0gZC5nZXRMYWJlbHNUb1VwZGF0ZSgpOw0KKwkJCQkJZm9yKER5bmFtaWNMYWJlbCBsOmxhYmVscykgew0KKwkJCQkJCWlmKGwgaW5zdGFuY2VvZiBJbnRlZ3JhdGlvbkxhYmVsKSB7DQorCQkJCQkJCUludGVncmF0aW9uTGFiZWwgaWwgPSAoSW50ZWdyYXRpb25MYWJlbClsOw0KKwkJCQkJCQlpbC5yZXNldCh0aW1lKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQl0aGlzLnNldEluaXRpYWxpemVkKHRydWUpOw0KKwl9DQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBTb2x2ZXJQYWNrYWdlLlNPTFZFUl9fREVDT1JBVE9SUzoNCisJCQkJcmV0dXJuIGdldERlY29yYXRvcnMoKTsNCisJCQljYXNlIFNvbHZlclBhY2thZ2UuU09MVkVSX19JTklUSUFMSVpFRDoNCisJCQkJcmV0dXJuIGlzSW5pdGlhbGl6ZWQoKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIFNvbHZlclBhY2thZ2UuU09MVkVSX19ERUNPUkFUT1JTOg0KKwkJCQlzZXREZWNvcmF0b3JzKChFTGlzdDxEZWNvcmF0b3I+KW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgU29sdmVyUGFja2FnZS5TT0xWRVJfX0lOSVRJQUxJWkVEOg0KKwkJCQlzZXRJbml0aWFsaXplZCgoQm9vbGVhbiluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBTb2x2ZXJQYWNrYWdlLlNPTFZFUl9fREVDT1JBVE9SUzoNCisJCQkJc2V0RGVjb3JhdG9ycygoRUxpc3Q8RGVjb3JhdG9yPiludWxsKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgU29sdmVyUGFja2FnZS5TT0xWRVJfX0lOSVRJQUxJWkVEOg0KKwkJCQlzZXRJbml0aWFsaXplZChJTklUSUFMSVpFRF9FREVGQVVMVCk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgU29sdmVyUGFja2FnZS5TT0xWRVJfX0RFQ09SQVRPUlM6DQorCQkJCXJldHVybiBkZWNvcmF0b3JzICE9IG51bGw7DQorCQkJY2FzZSBTb2x2ZXJQYWNrYWdlLlNPTFZFUl9fSU5JVElBTElaRUQ6DQorCQkJCXJldHVybiBpbml0aWFsaXplZCAhPSBJTklUSUFMSVpFRF9FREVGQVVMVDsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOw0KKw0KKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7DQorCQlyZXN1bHQuYXBwZW5kKCIgKGRlY29yYXRvcnM6ICIpOyAvLyROT04tTkxTLTEkDQorCQlyZXN1bHQuYXBwZW5kKGRlY29yYXRvcnMpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCBpbml0aWFsaXplZDogIik7IC8vJE5PTi1OTFMtMSQNCisJCXJlc3VsdC5hcHBlbmQoaW5pdGlhbGl6ZWQpOw0KKwkJcmVzdWx0LmFwcGVuZCgnKScpOw0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKwl9DQorDQorfSAvL1NvbHZlckltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvaW1wbC9Tb2x2ZXJQYWNrYWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL2ltcGwvU29sdmVyUGFja2FnZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmE2ZjUyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL2ltcGwvU29sdmVyUGFja2FnZUltcGwuamF2YQpAQCAtMCwwICsxLDI4NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLmltcGw7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUdlbmVyaWNUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50UGFja2FnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuaW1wbC5FeHBlcmltZW50UGFja2FnZUltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkdyYXBoUGFja2FnZUltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5pbXBsLk1vZGlmaWVyUGFja2FnZUltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlUGFja2FnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5pbXBsLlByZWRpY2F0ZVBhY2thZ2VJbXBsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW9QYWNrYWdlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uaW1wbC5TY2VuYXJpb1BhY2thZ2VJbXBsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlclBhY2thZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuaW1wbC5TZXF1ZW5jZXJQYWNrYWdlSW1wbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXJQYWNrYWdlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5UcmlnZ2VyUGFja2FnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuaW1wbC5UcmlnZ2VyUGFja2FnZUltcGw7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTb2x2ZXJQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFNvbHZlclBhY2thZ2Ugew0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIHNvbHZlckVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoDQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlDQorCSAqIHBhY2thZ2UgVVJJIHZhbHVlLg0KKwkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljDQorCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zDQorCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsDQorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5DQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXJQYWNrYWdlI2VOU19VUkkNCisJICogQHNlZSAjaW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU29sdmVyUGFja2FnZUltcGwoKSB7DQorCQlzdXBlcihlTlNfVVJJLCBTb2x2ZXJGYWN0b3J5LmVJTlNUQU5DRSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuDQorCSAqIA0KKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIFNvbHZlclBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuDQorCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNlTlNfVVJJDQorCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpDQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFNvbHZlclBhY2thZ2UgaW5pdCgpIHsNCisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChTb2x2ZXJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNvbHZlclBhY2thZ2UuZU5TX1VSSSk7DQorDQorCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlDQorCQlTb2x2ZXJQYWNrYWdlSW1wbCB0aGVTb2x2ZXJQYWNrYWdlID0gKFNvbHZlclBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBTb2x2ZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBTb2x2ZXJQYWNrYWdlSW1wbCgpKTsNCisNCisJCWlzSW5pdGVkID0gdHJ1ZTsNCisNCisJCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcw0KKwkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsNCisNCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzDQorCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOw0KKwkJRXhwZXJpbWVudFBhY2thZ2VJbXBsIHRoZUV4cGVyaW1lbnRQYWNrYWdlID0gKEV4cGVyaW1lbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRXhwZXJpbWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFeHBlcmltZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFeHBlcmltZW50UGFja2FnZS5lTlNfVVJJKSA6IEV4cGVyaW1lbnRQYWNrYWdlLmVJTlNUQU5DRSk7DQorCQlHcmFwaFBhY2thZ2VJbXBsIHRoZUdyYXBoUGFja2FnZSA9IChHcmFwaFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShHcmFwaFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBHcmFwaFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoR3JhcGhQYWNrYWdlLmVOU19VUkkpIDogR3JhcGhQYWNrYWdlLmVJTlNUQU5DRSk7DQorCQlNb2RlbFBhY2thZ2VJbXBsIHRoZU1vZGVsUGFja2FnZSA9IChNb2RlbFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RlbFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBNb2RlbFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kZWxQYWNrYWdlLmVOU19VUkkpIDogTW9kZWxQYWNrYWdlLmVJTlNUQU5DRSk7DQorCQlNb2RpZmllclBhY2thZ2VJbXBsIHRoZU1vZGlmaWVyUGFja2FnZSA9IChNb2RpZmllclBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RpZmllclBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBNb2RpZmllclBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kaWZpZXJQYWNrYWdlLmVOU19VUkkpIDogTW9kaWZpZXJQYWNrYWdlLmVJTlNUQU5DRSk7DQorCQlQcmVkaWNhdGVQYWNrYWdlSW1wbCB0aGVQcmVkaWNhdGVQYWNrYWdlID0gKFByZWRpY2F0ZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQcmVkaWNhdGVQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgUHJlZGljYXRlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQcmVkaWNhdGVQYWNrYWdlLmVOU19VUkkpIDogUHJlZGljYXRlUGFja2FnZS5lSU5TVEFOQ0UpOw0KKwkJU2NlbmFyaW9QYWNrYWdlSW1wbCB0aGVTY2VuYXJpb1BhY2thZ2UgPSAoU2NlbmFyaW9QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU2NlbmFyaW9QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgU2NlbmFyaW9QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNjZW5hcmlvUGFja2FnZS5lTlNfVVJJKSA6IFNjZW5hcmlvUGFja2FnZS5lSU5TVEFOQ0UpOw0KKwkJU2VxdWVuY2VyUGFja2FnZUltcGwgdGhlU2VxdWVuY2VyUGFja2FnZSA9IChTZXF1ZW5jZXJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU2VxdWVuY2VyUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFNlcXVlbmNlclBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU2VxdWVuY2VyUGFja2FnZS5lTlNfVVJJKSA6IFNlcXVlbmNlclBhY2thZ2UuZUlOU1RBTkNFKTsNCisJCVRyaWdnZXJQYWNrYWdlSW1wbCB0aGVUcmlnZ2VyUGFja2FnZSA9IChUcmlnZ2VyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRyaWdnZXJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVHJpZ2dlclBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVHJpZ2dlclBhY2thZ2UuZU5TX1VSSSkgOiBUcmlnZ2VyUGFja2FnZS5lSU5TVEFOQ0UpOw0KKw0KKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMNCisJCXRoZVNvbHZlclBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7DQorCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOw0KKwkJdGhlRXhwZXJpbWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7DQorCQl0aGVHcmFwaFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7DQorCQl0aGVNb2RlbFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7DQorCQl0aGVNb2RpZmllclBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7DQorCQl0aGVQcmVkaWNhdGVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOw0KKwkJdGhlU2NlbmFyaW9QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOw0KKwkJdGhlU2VxdWVuY2VyUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsNCisJCXRoZVRyaWdnZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOw0KKw0KKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQ0KKwkJdGhlU29sdmVyUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7DQorCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsNCisJCXRoZUV4cGVyaW1lbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsNCisJCXRoZUdyYXBoUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7DQorCQl0aGVNb2RlbFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOw0KKwkJdGhlTW9kaWZpZXJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsNCisJCXRoZVByZWRpY2F0ZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOw0KKwkJdGhlU2NlbmFyaW9QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsNCisJCXRoZVNlcXVlbmNlclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOw0KKwkJdGhlVHJpZ2dlclBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOw0KKw0KKwkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZA0KKwkJdGhlU29sdmVyUGFja2FnZS5mcmVlemUoKTsNCisNCisgIA0KKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlDQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoU29sdmVyUGFja2FnZS5lTlNfVVJJLCB0aGVTb2x2ZXJQYWNrYWdlKTsNCisJCXJldHVybiB0aGVTb2x2ZXJQYWNrYWdlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRTb2x2ZXIoKSB7DQorCQlyZXR1cm4gc29sdmVyRUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U29sdmVyX0RlY29yYXRvcnMoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc29sdmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTb2x2ZXJfSW5pdGlhbGl6ZWQoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc29sdmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU29sdmVyRmFjdG9yeSBnZXRTb2x2ZXJGYWN0b3J5KCkgew0KKwkJcmV0dXJuIChTb2x2ZXJGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsNCisNCisJLyoqDQorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcw0KKwkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7DQorCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47DQorCQlpc0NyZWF0ZWQgPSB0cnVlOw0KKw0KKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzDQorCQlzb2x2ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU09MVkVSKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoc29sdmVyRUNsYXNzLCBTT0xWRVJfX0RFQ09SQVRPUlMpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShzb2x2ZXJFQ2xhc3MsIFNPTFZFUl9fSU5JVElBTElaRUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsNCisNCisJLyoqDQorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzDQorCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgew0KKwkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsNCisJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOw0KKw0KKwkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlDQorCQlzZXROYW1lKGVOQU1FKTsNCisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOw0KKwkJc2V0TnNVUkkoZU5TX1VSSSk7DQorDQorCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzDQorCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOw0KKwkJRWNvcmVQYWNrYWdlIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOw0KKwkJTW9kZWxQYWNrYWdlIHRoZU1vZGVsUGFja2FnZSA9IChNb2RlbFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kZWxQYWNrYWdlLmVOU19VUkkpOw0KKw0KKwkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycw0KKw0KKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzDQorDQorCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzDQorCQlzb2x2ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRJZGVudGlmaWFibGUoKSk7DQorDQorCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycw0KKwkJaW5pdEVDbGFzcyhzb2x2ZXJFQ2xhc3MsIFNvbHZlci5jbGFzcywgIlNvbHZlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJA0KKwkJRUdlbmVyaWNUeXBlIGcxID0gY3JlYXRlRUdlbmVyaWNUeXBlKHRoZUVjb3JlUGFja2FnZS5nZXRFRUxpc3QoKSk7DQorCQlFR2VuZXJpY1R5cGUgZzIgPSBjcmVhdGVFR2VuZXJpY1R5cGUodGhlTW9kZWxQYWNrYWdlLmdldERlY29yYXRvcigpKTsNCisJCWcxLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGcyKTsNCisJCWluaXRFQXR0cmlidXRlKGdldFNvbHZlcl9EZWNvcmF0b3JzKCksIGcxLCAiZGVjb3JhdG9ycyIsIG51bGwsIDAsIDEsIFNvbHZlci5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQorCQlpbml0RUF0dHJpYnV0ZShnZXRTb2x2ZXJfSW5pdGlhbGl6ZWQoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpbml0aWFsaXplZCIsIG51bGwsIDAsIDEsIFNvbHZlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KKw0KKwkJRU9wZXJhdGlvbiBvcCA9IGFkZEVPcGVyYXRpb24oc29sdmVyRUNsYXNzLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInN0ZXAiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGVNb2RlbFBhY2thZ2UuZ2V0U1RFTVRpbWUoKSwgInRpbWUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUxvbmcoKSwgInRpbWVEZWx0YSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCisJCWFkZEVQYXJhbWV0ZXIob3AsIHRoZUVjb3JlUGFja2FnZS5nZXRFSW50KCksICJjeWNsZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCisNCisJCWFkZEVPcGVyYXRpb24oc29sdmVyRUNsYXNzLCBudWxsLCAicmVzZXQiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQorDQorCQkvLyBDcmVhdGUgcmVzb3VyY2UNCisJCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOw0KKwl9DQorDQorfSAvL1NvbHZlclBhY2thZ2VJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL3Byb3ZpZGVyL1NvbHZlckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL3Byb3ZpZGVyL1NvbHZlckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNzRlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvcHJvdmlkZXIvU29sdmVySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxODUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5wcm92aWRlcjsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db3JlRWRpdFBsdWdpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5JZGVudGlmaWFibGVJdGVtUHJvdmlkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclBhY2thZ2U7DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlcn0gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTb2x2ZXJJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBJZGVudGlmaWFibGVJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTb2x2ZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQorDQorCQkJYWRkRGVjb3JhdG9yc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJfQ0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVjb3JhdG9ycyBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkRGVjb3JhdG9yc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU29sdmVyX2RlY29yYXRvcnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NvbHZlcl9kZWNvcmF0b3JzX2ZlYXR1cmUiLCAiX1VJX1NvbHZlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQorCQkJCSBTb2x2ZXJQYWNrYWdlLkxpdGVyYWxzLlNPTFZFUl9fREVDT1JBVE9SUywNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIHRydWUsDQorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgU29sdmVyLmdpZi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Tb2x2ZXIiKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJVVJJIGxhYmVsVmFsdWUgPSAoKFNvbHZlcilvYmplY3QpLmdldFVSSSgpOw0KKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX1NvbHZlcl90eXBlIikgOiAvLyROT04tTkxTLTEkDQorCQkJZ2V0U3RyaW5nKCJfVUlfU29sdmVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgew0KKwkJVVJJIGxhYmVsVmFsdWUgPSAoKFNvbHZlcilvYmplY3QpLmdldFVSSSgpOw0KKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX1NvbHZlcl90eXBlIikgOiAvLyROT04tTkxTLTEkDQorCQkJZ2V0U3RyaW5nKCJfVUlfU29sdmVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCisJfQ0KKwkNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisNCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTb2x2ZXIuY2xhc3MpKSB7DQorCQkJY2FzZSBTb2x2ZXJQYWNrYWdlLlNPTFZFUl9fSU5JVElBTElaRUQ6DQorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KKwkJcmV0dXJuIENvcmVFZGl0UGx1Z2luLklOU1RBTkNFOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlci9wcm92aWRlci9Tb2x2ZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL3Byb3ZpZGVyL1NvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU3N2VjZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlci9wcm92aWRlci9Tb2x2ZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjA5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIucHJvdmlkZXI7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIudXRpbC5Tb2x2ZXJBZGFwdGVyRmFjdG9yeTsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuDQorICogVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uDQorICogVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4NCisgKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgU29sdmVyQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOw0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5IHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCisNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTb2x2ZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsNCisJCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7DQorCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCisJCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7DQorCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXJ9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTb2x2ZXJJdGVtUHJvdmlkZXIgc29sdmVySXRlbVByb3ZpZGVyOw0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTb2x2ZXJBZGFwdGVyKCkgew0KKwkJaWYgKHNvbHZlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQorCQkJc29sdmVySXRlbVByb3ZpZGVyID0gbmV3IFNvbHZlckl0ZW1Qcm92aWRlcih0aGlzKTsNCisJCX0NCisNCisJCXJldHVybiBzb2x2ZXJJdGVtUHJvdmlkZXI7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7DQorCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7DQorCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgew0KKwkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgew0KKwkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgew0KKwkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsNCisJCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7DQorCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzPD8+KSB8fCAoKChDbGFzczw/Pil0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgew0KKwkJCQlyZXR1cm4gYWRhcHRlcjsNCisJCQl9DQorCQl9DQorDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgew0KKwkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgew0KKwkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn0gYW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisNCisJCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7DQorCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LiANCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQorCQlpZiAoc29sdmVySXRlbVByb3ZpZGVyICE9IG51bGwpIHNvbHZlckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL3V0aWwvU29sdmVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlci91dGlsL1NvbHZlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3NmUzZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlci91dGlsL1NvbHZlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNjcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci51dGlsOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci4qOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4NCisgKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUGFja2FnZQ0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU29sdmVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgew0KKwkvKioNCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBTb2x2ZXJQYWNrYWdlIG1vZGVsUGFja2FnZTsNCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTb2x2ZXJBZGFwdGVyRmFjdG9yeSgpIHsNCisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgew0KKwkJCW1vZGVsUGFja2FnZSA9IFNvbHZlclBhY2thZ2UuZUlOU1RBTkNFOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgew0KKwkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNvbHZlclN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9DQorCQluZXcgU29sdmVyU3dpdGNoPEFkYXB0ZXI+KCkgew0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTb2x2ZXIoU29sdmVyIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlU29sdmVyQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgPFQ+IEFkYXB0ZXIgY2FzZUNvbXBhcmFibGUoQ29tcGFyYWJsZTxUPiBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUNvbXBhcmFibGVBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsNCisJCQl9DQorCQl9Ow0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4NCisJICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgew0KKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7DQorCX0NCisNCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXIgPGVtPlNvbHZlcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlcg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTb2x2ZXJBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YS5sYW5nLkNvbXBhcmFibGUgPGVtPkNvbXBhcmFibGU8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcGFyYWJsZUFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9IC8vU29sdmVyQWRhcHRlckZhY3RvcnkNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvdXRpbC9Tb2x2ZXJTd2l0Y2guamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlci91dGlsL1NvbHZlclN3aXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NGI5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvdXRpbC9Tb2x2ZXJTd2l0Y2guamF2YQpAQCAtMCwwICsxLDE2OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLnV0aWw7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuKjsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuDQorICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQ0KKyAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwNCisgKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdA0KKyAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkNCisgKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwNCisgKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclBhY2thZ2UNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNvbHZlclN3aXRjaDxUMT4gew0KKwkvKioNCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIFNvbHZlclBhY2thZ2UgbW9kZWxQYWNrYWdlOw0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNvbHZlclN3aXRjaCgpIHsNCisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgew0KKwkJCW1vZGVsUGFja2FnZSA9IFNvbHZlclBhY2thZ2UuZUlOU1RBTkNFOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsNCisJCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7DQorCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsNCisJCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsNCisJCX0NCisJCWVsc2Ugew0KKwkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOw0KKwkJCXJldHVybg0KKwkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPw0KKwkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOg0KKwkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7DQorCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgew0KKwkJCWNhc2UgU29sdmVyUGFja2FnZS5TT0xWRVI6IHsNCisJCQkJU29sdmVyIHNvbHZlciA9IChTb2x2ZXIpdGhlRU9iamVjdDsNCisJCQkJVDEgcmVzdWx0ID0gY2FzZVNvbHZlcihzb2x2ZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoc29sdmVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShzb2x2ZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNvbHZlcjwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNvbHZlcjwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlU29sdmVyKFNvbHZlciBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyA8VD4gVDEgY2FzZUNvbXBhcmFibGUoQ29tcGFyYWJsZTxUPiBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVDEgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30gLy9Tb2x2ZXJTd2l0Y2gNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90cmlnZ2VyL1RyaWdnZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3RyaWdnZXIvVHJpZ2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDBlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90cmlnZ2VyL1RyaWdnZXIuamF2YQpAQCAtMCwwICsxLDkwIEBACisvLyBUcmlnZ2VyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlOworCisvKioKKyAqIEEgPGNvZGU+VHJpZ2dlcjwvY29kZT4gaXMgYSB7QGxpbmsgRGVjb3JhdG9yfSB0aGF0IGFsbG93cyBmb3IgY29uZGl0aW9uYWwKKyAqIGV4ZWN1dGlvbiBvZiBhbm90aGVyIHtAbGluayBEZWNvcmF0b3J9LiBJdCBjb21iaW5lcyBhIHJlZmVyZW5jZSB0byBhCisgKiBjb25kaXRpb25hbCB7QGxpbmsgUHJlZGljYXRlfSB3aXRoIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIge0BsaW5rIERlY29yYXRvcn0KKyAqIGNhbGxlZCB0aGUgImFjdGlvbiIgKHtAbGluayAjZ2V0QWN0aW9uKCl9LiBXaGVuIHRoZSA8Y29kZT5UcmlnZ2VyPC9jb2RlPidzCisgKiB7QGxpbmsgI3VwZGF0ZUxhYmVscyhvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIGxvbmcpfSBtZXRob2QKKyAqIGlzIGNhbGxlZCBpdCBpbnZva2VzIHRoZSB7QGxpbmsgUHJlZGljYXRlfSBhbmQgaWYgaXQgcmV0dXJucworICogPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiB0aGUgPGNvZGU+VHJpZ2dlcjwvY29kZT4gY2FsbHMgdGhlCisgKiB7QGxpbmsgI3VwZGF0ZUxhYmVscyhvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIGxvbmcpfSBtZXRob2QKKyAqIG9mIHRoZSByZWZlcmVuY2VkIHtAbGluayBEZWNvcmF0b3J9LgorICogPHA+CisgKiBGcmVxdWVudGx5LCB0aGUgYWN0aW9uIHdpbGwgYmUgYW4gaW5zdGFuY2Ugb2YKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJ9IHdoaWNoIHdpbGwgdGhlbiBhbHRlcgorICogc29tZSBhc3BlY3Qgb2YgdGhlIHJ1bm5pbmcgU2ltdWxhdGlvbi4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5pdGlvbiBpcyBhbHNvIGFuICJBbm5vdGF0ZWQgSmF2YSBJbnRlcmZhY2UiIHRoYXQgZGVmaW5lcworICogb25lIGNsYXNzIGluIGEgPGEgaHJlZj0iaHR0cDovL3d3dy51bWwub3JnLyI+VU1MPC9hPiAibW9kZWwiLiBUaGUgVU1MIGNsYXNzCisgKiBkaWFncmFtIGZvciB0aGUgbW9kZWwgaXMgaW4gdGhlIDxjb2RlPmRvY3VtZW50YXRpb248L2NvZGU+IGZvbGRlciBvZiB0aGUKKyAqIHByb2plY3QuIFRoaXMgZmlsZSBhbmQgdGhlIG90aGVyIGludGVyZmFjZXMgaW4gdGhpcyBKYXZhIHBhY2thZ2UgYXJlCisgKiBwcm9jZXNzZWQgYnkgdGhlIEVjbGlwc2UgTW9kZWxpbmcgRnJhbWV3b3JrIChha2EgRU1GIDxhCisgKiBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UvZW1mIj5odHRwOi8vb3JnLmVjbGlwc2UvZW1mPC9hPikuIHRvIGF1dG9tYXRpY2FsbHkKKyAqIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbC4gRU1GIGlzIGRvY3VtZW50ZWQgaW4gdGhlIGJvb2sgPGEKKyAqIGhyZWY9Imh0dHA6Ly93d3cuYXdwcm9mZXNzaW9uYWwuY29tL2Jvb2tzdG9yZS9wcm9kdWN0LmFzcD9pc2JuPTAxMzE0MjU0MjAmcmw9MSI+RWNsaXBzZQorICogTW9kZWxpbmcgRnJhbWV3b3JrIDwvYT4gYnkgQnVkaW5za3ksIGV0IGFsLgorICogPC9wPgorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVHJpZ2dlciBleHRlbmRzIERlY29yYXRvciB7CisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VnbWVudCBvZiB0aGUgdHlwZSB7QGxpbmsgVVJJfSB0aGF0IHByZWZpeGVzIGFsbCBvdGhlcgorCSAqIHNlZ21lbnRzIGluIGEge0BsaW5rIFRyaWdnZXJ9IHtAbGluayBVUkl9LgorCSAqLworCVN0cmluZyBVUklfVFlQRV9UUklHR0VSX1NFR01FTlQgPSAidHJpZ2dlciI7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgVHJpZ2dlcn0ncyBQcmVkaWNhdGUKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9ImZhbHNlIgorCSAqLworCVByZWRpY2F0ZSBnZXRQcmVkaWNhdGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAnCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXIjZ2V0UHJlZGljYXRlCisJICogPGVtPlByZWRpY2F0ZTwvZW0+fScgcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZQorCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkaWNhdGU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFByZWRpY2F0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UHJlZGljYXRlKFByZWRpY2F0ZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgVHJpZ2dlcn0ncyBhY3Rpb24uCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJmYWxzZSIKKwkgKi8KKwlEZWNvcmF0b3IgZ2V0QWN0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJworCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5UcmlnZ2VyI2dldEFjdGlvbgorCSAqIDxlbT5BY3Rpb248L2VtPn0nIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aW9uPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRBY3Rpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEFjdGlvbihEZWNvcmF0b3IgdmFsdWUpOworfSAvLyBUcmlnZ2VyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdHJpZ2dlci9UcmlnZ2VyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdHJpZ2dlci9UcmlnZ2VyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YmJmMjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90cmlnZ2VyL1RyaWdnZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuVHJpZ2dlclBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBUcmlnZ2VyRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVRyaWdnZXJGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLmltcGwuVHJpZ2dlckZhY3RvcnlJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHJpZ2dlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHJpZ2dlcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVHJpZ2dlciBjcmVhdGVUcmlnZ2VyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogQGdlbmVyYXRlZAorCSAqLworCVRyaWdnZXJQYWNrYWdlIGdldFRyaWdnZXJQYWNrYWdlKCk7CisKK30gLy9UcmlnZ2VyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdHJpZ2dlci9UcmlnZ2VyUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdHJpZ2dlci9UcmlnZ2VyUGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OTllMTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90cmlnZ2VyL1RyaWdnZXJQYWNrYWdlLmphdmEKQEAgLTAsMCArMSwyNjAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJGYWN0b3J5CisgKiBAbW9kZWwga2luZD0icGFja2FnZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBUcmlnZ2VyUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTkFNRSA9ICJ0cmlnZ2VyIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90cmlnZ2VyLmVjb3JlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVRyaWdnZXJQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLmltcGwuVHJpZ2dlclBhY2thZ2VJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuaW1wbC5UcmlnZ2VySW1wbCA8ZW0+VHJpZ2dlcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLmltcGwuVHJpZ2dlckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLmltcGwuVHJpZ2dlclBhY2thZ2VJbXBsI2dldFRyaWdnZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVFJJR0dFUiA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVFJJR0dFUl9fVVJJID0gTW9kZWxQYWNrYWdlLkRFQ09SQVRPUl9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVFJJR0dFUl9fVFlQRV9VUkkgPSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRSSUdHRVJfX0RVQkxJTl9DT1JFID0gTW9kZWxQYWNrYWdlLkRFQ09SQVRPUl9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWxzIFRvIFVwZGF0ZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVFJJR0dFUl9fTEFCRUxTX1RPX1VQREFURSA9IE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0xBQkVMU19UT19VUERBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGg8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVFJJR0dFUl9fR1JBUEggPSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19HUkFQSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVFJJR0dFUl9fRU5BQkxFRCA9IE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0VOQUJMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRGVjb3JhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVFJJR0dFUl9fR1JBUEhfREVDT1JBVEVEID0gTW9kZWxQYWNrYWdlLkRFQ09SQVRPUl9fR1JBUEhfREVDT1JBVEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2dyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVFJJR0dFUl9fUFJPR1JFU1MgPSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19QUk9HUkVTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkaWNhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUUklHR0VSX19QUkVESUNBVEUgPSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRSSUdHRVJfX0FDVElPTiA9IE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VHJpZ2dlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUUklHR0VSX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAyOworCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5UcmlnZ2VyIDxlbT5UcmlnZ2VyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRyaWdnZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5UcmlnZ2VyCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUcmlnZ2VyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXIjZ2V0UHJlZGljYXRlIDxlbT5QcmVkaWNhdGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QcmVkaWNhdGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5UcmlnZ2VyI2dldFByZWRpY2F0ZSgpCisJICogQHNlZSAjZ2V0VHJpZ2dlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0VHJpZ2dlcl9QcmVkaWNhdGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuVHJpZ2dlciNnZXRBY3Rpb24gPGVtPkFjdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkFjdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXIjZ2V0QWN0aW9uKCkKKwkgKiBAc2VlICNnZXRUcmlnZ2VyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRUcmlnZ2VyX0FjdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVHJpZ2dlckZhY3RvcnkgZ2V0VHJpZ2dlckZhY3RvcnkoKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKwkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorCSAqIDwvdWw+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCWludGVyZmFjZSBMaXRlcmFscyB7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuaW1wbC5UcmlnZ2VySW1wbCA8ZW0+VHJpZ2dlcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLmltcGwuVHJpZ2dlckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5pbXBsLlRyaWdnZXJQYWNrYWdlSW1wbCNnZXRUcmlnZ2VyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRSSUdHRVIgPSBlSU5TVEFOQ0UuZ2V0VHJpZ2dlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZGljYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgVFJJR0dFUl9fUFJFRElDQVRFID0gZUlOU1RBTkNFLmdldFRyaWdnZXJfUHJlZGljYXRlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBUUklHR0VSX19BQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0VHJpZ2dlcl9BY3Rpb24oKTsKKworCX0KKworfSAvL1RyaWdnZXJQYWNrYWdlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90cmlnZ2VyL2ltcGwvVHJpZ2dlckZhY3RvcnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90cmlnZ2VyL2ltcGwvVHJpZ2dlckZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3YTBkNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3RyaWdnZXIvaW1wbC9UcmlnZ2VyRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLio7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVHJpZ2dlckZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgVHJpZ2dlckZhY3RvcnkgeworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRyaWdnZXJGYWN0b3J5IGluaXQoKSB7CisJCXRyeSB7CisJCQlUcmlnZ2VyRmFjdG9yeSB0aGVUcmlnZ2VyRmFjdG9yeSA9IChUcmlnZ2VyRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdHJpZ2dlci5lY29yZSIpOyAvLyROT04tTkxTLTEkIAorCQkJaWYgKHRoZVRyaWdnZXJGYWN0b3J5ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdGhlVHJpZ2dlckZhY3Rvcnk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXJldHVybiBuZXcgVHJpZ2dlckZhY3RvcnlJbXBsKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVHJpZ2dlckZhY3RvcnlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7CisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFRyaWdnZXJQYWNrYWdlLlRSSUdHRVI6IHJldHVybiBjcmVhdGVUcmlnZ2VyKCk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRyaWdnZXIgY3JlYXRlVHJpZ2dlcigpIHsKKwkJVHJpZ2dlckltcGwgdHJpZ2dlciA9IG5ldyBUcmlnZ2VySW1wbCgpOworCQlyZXR1cm4gdHJpZ2dlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVHJpZ2dlclBhY2thZ2UgZ2V0VHJpZ2dlclBhY2thZ2UoKSB7CisJCXJldHVybiAoVHJpZ2dlclBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBkZXByZWNhdGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBUcmlnZ2VyUGFja2FnZSBnZXRQYWNrYWdlKCkgeworCQlyZXR1cm4gVHJpZ2dlclBhY2thZ2UuZUlOU1RBTkNFOworCX0KKworfSAvL1RyaWdnZXJGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdHJpZ2dlci9pbXBsL1RyaWdnZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90cmlnZ2VyL2ltcGwvVHJpZ2dlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWE4MTExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdHJpZ2dlci9pbXBsL1RyaWdnZXJJbXBsLmphdmEKQEAgLTAsMCArMSwzMzUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5EZWNvcmF0b3JJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5UcmlnZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHJpZ2dlcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuaW1wbC5UcmlnZ2VySW1wbCNnZXRQcmVkaWNhdGUgPGVtPlByZWRpY2F0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuaW1wbC5UcmlnZ2VySW1wbCNnZXRBY3Rpb24gPGVtPkFjdGlvbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRyaWdnZXJJbXBsIGV4dGVuZHMgRGVjb3JhdG9ySW1wbCBpbXBsZW1lbnRzIFRyaWdnZXIgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRpY2F0ZSgpIDxlbT5QcmVkaWNhdGU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFByZWRpY2F0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFByZWRpY2F0ZSBwcmVkaWNhdGU7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3Rpb24oKSA8ZW0+QWN0aW9uPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBY3Rpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBEZWNvcmF0b3IgYWN0aW9uOworCisJcHJvdGVjdGVkIERlY29yYXRvciBhY3Rpb25Db3B5OworCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmlnZ2VySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFRyaWdnZXJQYWNrYWdlLkxpdGVyYWxzLlRSSUdHRVI7CisJfQorCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5EZWNvcmF0b3JJbXBsI2RlY29yYXRlR3JhcGgoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGRlY29yYXRlR3JhcGgoU1RFTVRpbWUgdGltZSkgeworCQkvLyBEbyB3ZSBoYXZlIGFuIGFjdGlvbj8KKwkJaWYgKGFjdGlvbiAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCS8vIEhhdmUgd2UgYWxyZWFkeSBtYWRlIGEgY29weSBvZiB0aGUgYWN0aW9uPworCQkJaWYgKGFjdGlvbkNvcHkgPT0gbnVsbCApIHsKKwkJCQkvLyBObworCQkJCWFjdGlvbkNvcHkgPSAoRGVjb3JhdG9yKSBFY29yZVV0aWwuY29weShhY3Rpb24pOworCQkJCWdldEdyYXBoKCkuZ2V0RGVjb3JhdG9ycygpLmFkZChhY3Rpb25Db3B5KTsKKwkJCX0gLy8gaWYKKwkJCWFjdGlvbkNvcHkuc2V0RW5hYmxlZChmYWxzZSk7CisJCX0gLy8gaWYgd2UgaGF2ZSBhbiBhY3Rpb24KKwkJZWxzZSB7CisJCQkvLyBObworCQkJQ29yZVBsdWdpbi5sb2dJbmZvcm1hdGlvbigiTm8gYWN0aW9uIHNwZWNpZmllZCBmb3IgdHJpZ2dlciBcIiIrdGhpcy5nZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKSsgIlwiIiwgbnVsbCk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfSAvLyBkZWNvcmF0ZUdyYXBoCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkRlY29yYXRvckltcGwjdXBkYXRlTGFiZWxzKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSwKKwkgKiAgICAgIGxvbmcpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlTGFiZWxzKFNURU1UaW1lIHRpbWUsIGxvbmcgdGltZXJQZXJpb2QsIGludCBjeWNsZSkgeworCQkvLyBFdmFsdWF0ZSB0aGUgcHJlZGljYXRlIGFuZCBpZiBpdCByZXR1cm5zIHRydWUsIHRoZW4gbGV0IHRoZSBhY3Rpb24KKwkJLy8gZGVjb3JhdGUgdGhlIGdyYXBoLgorCQkvLyBEbyB3ZSBoYXZlIGFuIGFjdGlvbj8KKwkJaWYgKGFjdGlvbkNvcHkgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQkvLyBMZXQgdGhlIGFjdGlvbiBkbyBpdCdzIHRoaW5nPworCQkJaWYgKGdldFByZWRpY2F0ZSgpLmV2YWx1YXRlKHRpbWUsIHRpbWVyUGVyaW9kLCBhY3Rpb25Db3B5KSkgeworCQkJCS8vIFllcworCQkJCWFjdGlvbkNvcHkuc2V0RW5hYmxlZCh0cnVlKTsKKworCQkJCS8vIEhhcyB0aGUgYWN0aW9uIGRlY29yYXRlZCB0aGUgZ3JhcGggeWV0PworCQkJCWlmICghYWN0aW9uQ29weS5pc0dyYXBoRGVjb3JhdGVkKCkpIHsKKwkJCQkJLy8gTm8KKwkJCQkJYWN0aW9uQ29weS5kZWNvcmF0ZUdyYXBoKHRpbWUpOworCQkJCQlhY3Rpb25Db3B5LnNldEdyYXBoRGVjb3JhdGVkKHRydWUpOworCQkJCX0gLy8gaWYgZ3JhcGggbm90IGRlY29yYXRlZCB5ZXQKKworCQkJCWFjdGlvbkNvcHkudXBkYXRlTGFiZWxzKHRpbWUsIHRpbWVyUGVyaW9kLCBjeWNsZSk7CisJCQl9IC8vIGlmIGFjdGlvbiB0aW1lCisJCQllbHNlIHsKKwkJCQkvLyBObworCQkJCWFjdGlvbkNvcHkuc2V0RW5hYmxlZChmYWxzZSk7CisJCQl9IC8vIGVsc2UKKwkJfSAvLyBpZiBhY3Rpb25Db3B5ICE9IG51bGwKKwl9IC8vIHVwZGF0ZUxhYmVscworCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5EZWNvcmF0b3JJbXBsI3Jlc2V0TGFiZWxzKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNldExhYmVscygpIHsKKwkJaWYgKGFjdGlvbkNvcHkgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlhY3Rpb25Db3B5LnNldEVuYWJsZWQoZmFsc2UpOworCQkJYWN0aW9uQ29weS5zZXRHcmFwaERlY29yYXRlZChmYWxzZSk7CisJCQkvLyBUaGUgcHJvYmxlbSB3aXRoIHJlc2V0aW5nIGxhYmVscyBpbiBhIFRyaWdnZXIgaXMgdGhhdCBpdCBpbXBsaWVzCisJCQkvLyBzb21lIGtpbmQgb2YgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGxhYmVscyBieSB0aGUgYWN0aW9uIHRoYXQgaW4KKwkJCS8vIGZhY3Qgc2hvdWxkIGJlIGNvbmRpdGlvbmFsIG9uIHRoZSB2YWx1ZSBvZiB0aGUgVHJpZ2dlcidzCisJCQkvLyBwcmVkaWNhdGUuCisJCQkvLyBJcyB0aGUgYWN0aW9uIGEgTW9kaWZpZXI/CisJCQlpZiAoYWN0aW9uQ29weSBpbnN0YW5jZW9mIE1vZGlmaWVyKSB7CisJCQkJLy8gWWVzCisJCQkJLy8gSXQncyBva2F5IGZvciBhIE1vZGlmaWVyIHRvIHJlc2V0IGl0cyBsYWJlbHMgYmVjYXVzZSB0aGlzCisJCQkJLy8gcmVzdG9yZXMgdGhlbSB0byB0aGVpciBvcmlnaW5hbCB2YWx1ZXMuIFRoaXMgd29ya3MgZm9yIHN0YXRpYworCQkJCS8vIGxhYmVscy4gQSBtb3JlIGdlbmVyYWwgRGVjb3JhdG9yLCBsaWtlIGFuIEluZmVjdG9yLCBtaWdodCBkbworCQkJCS8vIHRoaW5ncyBpdCBzaG91bGQgbm90IGRvIHVubGVzcyBpdCBpcyB0cmlnZ2VyZWQuCisJCQkJTW9kaWZpZXIgbW9kaWZpZXIgPSAoTW9kaWZpZXIpIGFjdGlvbkNvcHk7CisJCQkJbW9kaWZpZXIucmVzZXRMYWJlbHMoKTsKKwkJCX0KKwkJfSAvLyBpZgorCX0gLy8gcmVzZXRMYWJlbHMKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbCNzYW5lKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzYW5lKCkgeworCQlib29sZWFuIHJldFZhbHVlID0gc3VwZXIuc2FuZSgpOworCQkKKy8vCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIGdldFByZWRpY2F0ZSgpICE9IG51bGw7CisvLwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJLy9yZXRWYWx1ZSA9IHJldFZhbHVlICYmIGdldFByZWRpY2F0ZSgpLnNhbmUoKTsKKwkJLy9hc3NlcnQgcmV0VmFsdWU7CisJCQorCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIChnZXRBY3Rpb24oKSA9PSBudWxsIHx8IGdldEFjdGlvbigpLnNhbmUoKSk7CisJCWFzc2VydCByZXRWYWx1ZTsKKwkJCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgKGFjdGlvbkNvcHkgPT0gbnVsbCB8fCBhY3Rpb25Db3B5LnNhbmUoKSk7CisJCWFzc2VydCByZXRWYWx1ZTsKKwkJCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHNhbmUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcmVkaWNhdGUgZ2V0UHJlZGljYXRlKCkgeworCQlpZiAocHJlZGljYXRlICE9IG51bGwgJiYgcHJlZGljYXRlLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRQcmVkaWNhdGUgPSAoSW50ZXJuYWxFT2JqZWN0KXByZWRpY2F0ZTsKKwkJCXByZWRpY2F0ZSA9IChQcmVkaWNhdGUpZVJlc29sdmVQcm94eShvbGRQcmVkaWNhdGUpOworCQkJaWYgKHByZWRpY2F0ZSAhPSBvbGRQcmVkaWNhdGUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBUcmlnZ2VyUGFja2FnZS5UUklHR0VSX19QUkVESUNBVEUsIG9sZFByZWRpY2F0ZSwgcHJlZGljYXRlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHByZWRpY2F0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUHJlZGljYXRlIGJhc2ljR2V0UHJlZGljYXRlKCkgeworCQlyZXR1cm4gcHJlZGljYXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFByZWRpY2F0ZShQcmVkaWNhdGUgbmV3UHJlZGljYXRlKSB7CisJCVByZWRpY2F0ZSBvbGRQcmVkaWNhdGUgPSBwcmVkaWNhdGU7CisJCXByZWRpY2F0ZSA9IG5ld1ByZWRpY2F0ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVHJpZ2dlclBhY2thZ2UuVFJJR0dFUl9fUFJFRElDQVRFLCBvbGRQcmVkaWNhdGUsIHByZWRpY2F0ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEZWNvcmF0b3IgZ2V0QWN0aW9uKCkgeworCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgYWN0aW9uLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRBY3Rpb24gPSAoSW50ZXJuYWxFT2JqZWN0KWFjdGlvbjsKKwkJCWFjdGlvbiA9IChEZWNvcmF0b3IpZVJlc29sdmVQcm94eShvbGRBY3Rpb24pOworCQkJaWYgKGFjdGlvbiAhPSBvbGRBY3Rpb24pIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBUcmlnZ2VyUGFja2FnZS5UUklHR0VSX19BQ1RJT04sIG9sZEFjdGlvbiwgYWN0aW9uKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFjdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGVjb3JhdG9yIGJhc2ljR2V0QWN0aW9uKCkgeworCQlyZXR1cm4gYWN0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEFjdGlvbihEZWNvcmF0b3IgbmV3QWN0aW9uKSB7CisJCURlY29yYXRvciBvbGRBY3Rpb24gPSBhY3Rpb247CisJCWFjdGlvbiA9IG5ld0FjdGlvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVHJpZ2dlclBhY2thZ2UuVFJJR0dFUl9fQUNUSU9OLCBvbGRBY3Rpb24sIGFjdGlvbikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgVHJpZ2dlclBhY2thZ2UuVFJJR0dFUl9fUFJFRElDQVRFOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UHJlZGljYXRlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0UHJlZGljYXRlKCk7CisJCQljYXNlIFRyaWdnZXJQYWNrYWdlLlRSSUdHRVJfX0FDVElPTjoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEFjdGlvbigpOworCQkJCXJldHVybiBiYXNpY0dldEFjdGlvbigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFRyaWdnZXJQYWNrYWdlLlRSSUdHRVJfX1BSRURJQ0FURToKKwkJCQlzZXRQcmVkaWNhdGUoKFByZWRpY2F0ZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBUcmlnZ2VyUGFja2FnZS5UUklHR0VSX19BQ1RJT046CisJCQkJc2V0QWN0aW9uKChEZWNvcmF0b3IpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFRyaWdnZXJQYWNrYWdlLlRSSUdHRVJfX1BSRURJQ0FURToKKwkJCQlzZXRQcmVkaWNhdGUoKFByZWRpY2F0ZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFRyaWdnZXJQYWNrYWdlLlRSSUdHRVJfX0FDVElPTjoKKwkJCQlzZXRBY3Rpb24oKERlY29yYXRvciludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgVHJpZ2dlclBhY2thZ2UuVFJJR0dFUl9fUFJFRElDQVRFOgorCQkJCXJldHVybiBwcmVkaWNhdGUgIT0gbnVsbDsKKwkJCWNhc2UgVHJpZ2dlclBhY2thZ2UuVFJJR0dFUl9fQUNUSU9OOgorCQkJCXJldHVybiBhY3Rpb24gIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vVHJpZ2dlckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3RyaWdnZXIvaW1wbC9UcmlnZ2VyUGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3RyaWdnZXIvaW1wbC9UcmlnZ2VyUGFja2FnZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWY0Zjk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdHJpZ2dlci9pbXBsL1RyaWdnZXJQYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjY3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnRQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuaW1wbC5FeHBlcmltZW50UGFja2FnZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuR3JhcGhQYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuaW1wbC5Nb2RpZmllclBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuaW1wbC5QcmVkaWNhdGVQYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb1BhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uaW1wbC5TY2VuYXJpb1BhY2thZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5pbXBsLlNlcXVlbmNlclBhY2thZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuaW1wbC5Tb2x2ZXJQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5UcmlnZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRyaWdnZXJQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFRyaWdnZXJQYWNrYWdlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB0cmlnZ2VyRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQorCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgorCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKKwkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcworCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCisJICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBUcmlnZ2VyUGFja2FnZUltcGwoKSB7CisJCXN1cGVyKGVOU19VUkksIFRyaWdnZXJGYWN0b3J5LmVJTlNUQU5DRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgorCSAqIAorCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgVHJpZ2dlclBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRyaWdnZXJQYWNrYWdlIGluaXQoKSB7CisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChUcmlnZ2VyUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUcmlnZ2VyUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCisJCVRyaWdnZXJQYWNrYWdlSW1wbCB0aGVUcmlnZ2VyUGFja2FnZSA9IChUcmlnZ2VyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIFRyaWdnZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBUcmlnZ2VyUGFja2FnZUltcGwoKSk7CisKKwkJaXNJbml0ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcworCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCisJCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7CisJCUV4cGVyaW1lbnRQYWNrYWdlSW1wbCB0aGVFeHBlcmltZW50UGFja2FnZSA9IChFeHBlcmltZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEV4cGVyaW1lbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRXhwZXJpbWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRXhwZXJpbWVudFBhY2thZ2UuZU5TX1VSSSkgOiBFeHBlcmltZW50UGFja2FnZS5lSU5TVEFOQ0UpOworCQlHcmFwaFBhY2thZ2VJbXBsIHRoZUdyYXBoUGFja2FnZSA9IChHcmFwaFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShHcmFwaFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBHcmFwaFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoR3JhcGhQYWNrYWdlLmVOU19VUkkpIDogR3JhcGhQYWNrYWdlLmVJTlNUQU5DRSk7CisJCU1vZGVsUGFja2FnZUltcGwgdGhlTW9kZWxQYWNrYWdlID0gKE1vZGVsUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGVsUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIE1vZGVsUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNb2RlbFBhY2thZ2UuZU5TX1VSSSkgOiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJTW9kaWZpZXJQYWNrYWdlSW1wbCB0aGVNb2RpZmllclBhY2thZ2UgPSAoTW9kaWZpZXJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kaWZpZXJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgTW9kaWZpZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGlmaWVyUGFja2FnZS5lTlNfVVJJKSA6IE1vZGlmaWVyUGFja2FnZS5lSU5TVEFOQ0UpOworCQlQcmVkaWNhdGVQYWNrYWdlSW1wbCB0aGVQcmVkaWNhdGVQYWNrYWdlID0gKFByZWRpY2F0ZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQcmVkaWNhdGVQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgUHJlZGljYXRlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQcmVkaWNhdGVQYWNrYWdlLmVOU19VUkkpIDogUHJlZGljYXRlUGFja2FnZS5lSU5TVEFOQ0UpOworCQlTY2VuYXJpb1BhY2thZ2VJbXBsIHRoZVNjZW5hcmlvUGFja2FnZSA9IChTY2VuYXJpb1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTY2VuYXJpb1BhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBTY2VuYXJpb1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU2NlbmFyaW9QYWNrYWdlLmVOU19VUkkpIDogU2NlbmFyaW9QYWNrYWdlLmVJTlNUQU5DRSk7CisJCVNlcXVlbmNlclBhY2thZ2VJbXBsIHRoZVNlcXVlbmNlclBhY2thZ2UgPSAoU2VxdWVuY2VyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNlcXVlbmNlclBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBTZXF1ZW5jZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNlcXVlbmNlclBhY2thZ2UuZU5TX1VSSSkgOiBTZXF1ZW5jZXJQYWNrYWdlLmVJTlNUQU5DRSk7CisJCVNvbHZlclBhY2thZ2VJbXBsIHRoZVNvbHZlclBhY2thZ2UgPSAoU29sdmVyUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNvbHZlclBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBTb2x2ZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNvbHZlclBhY2thZ2UuZU5TX1VSSSkgOiBTb2x2ZXJQYWNrYWdlLmVJTlNUQU5DRSk7CisKKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKKwkJdGhlVHJpZ2dlclBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUV4cGVyaW1lbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVHcmFwaFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU1vZGVsUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlTW9kaWZpZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVQcmVkaWNhdGVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVTY2VuYXJpb1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNlcXVlbmNlclBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVNvbHZlclBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQorCQl0aGVUcmlnZ2VyUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVFeHBlcmltZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUdyYXBoUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU1vZGVsUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU1vZGlmaWVyUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVByZWRpY2F0ZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVTY2VuYXJpb1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVTZXF1ZW5jZXJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlU29sdmVyUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAorCQl0aGVUcmlnZ2VyUGFja2FnZS5mcmVlemUoKTsKKworICAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChUcmlnZ2VyUGFja2FnZS5lTlNfVVJJLCB0aGVUcmlnZ2VyUGFja2FnZSk7CisJCXJldHVybiB0aGVUcmlnZ2VyUGFja2FnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRyaWdnZXIoKSB7CisJCXJldHVybiB0cmlnZ2VyRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRyaWdnZXJfUHJlZGljYXRlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpdHJpZ2dlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRyaWdnZXJfQWN0aW9uKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpdHJpZ2dlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUcmlnZ2VyRmFjdG9yeSBnZXRUcmlnZ2VyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIChUcmlnZ2VyRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCisJICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOworCQlpc0NyZWF0ZWQgPSB0cnVlOworCisJCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcworCQl0cmlnZ2VyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRSSUdHRVIpOworCQljcmVhdGVFUmVmZXJlbmNlKHRyaWdnZXJFQ2xhc3MsIFRSSUdHRVJfX1BSRURJQ0FURSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UodHJpZ2dlckVDbGFzcywgVFJJR0dFUl9fQUNUSU9OKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOworCisJLyoqCisJICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKKwkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47CisJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgcGFja2FnZQorCQlzZXROYW1lKGVOQU1FKTsKKwkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7CisJCXNldE5zVVJJKGVOU19VUkkpOworCisJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKKwkJTW9kZWxQYWNrYWdlIHRoZU1vZGVsUGFja2FnZSA9IChNb2RlbFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kZWxQYWNrYWdlLmVOU19VUkkpOworCQlQcmVkaWNhdGVQYWNrYWdlIHRoZVByZWRpY2F0ZVBhY2thZ2UgPSAoUHJlZGljYXRlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQcmVkaWNhdGVQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCXRyaWdnZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlTW9kZWxQYWNrYWdlLmdldERlY29yYXRvcigpKTsKKworCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycworCQlpbml0RUNsYXNzKHRyaWdnZXJFQ2xhc3MsIFRyaWdnZXIuY2xhc3MsICJUcmlnZ2VyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFRyaWdnZXJfUHJlZGljYXRlKCksIHRoZVByZWRpY2F0ZVBhY2thZ2UuZ2V0UHJlZGljYXRlKCksIG51bGwsICJwcmVkaWNhdGUiLCBudWxsLCAwLCAxLCBUcmlnZ2VyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFRyaWdnZXJfQWN0aW9uKCksIHRoZU1vZGVsUGFja2FnZS5nZXREZWNvcmF0b3IoKSwgbnVsbCwgImFjdGlvbiIsIG51bGwsIDAsIDEsIFRyaWdnZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBDcmVhdGUgcmVzb3VyY2UKKwkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJfQorCit9IC8vVHJpZ2dlclBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90cmlnZ2VyL3Byb3ZpZGVyL1RyaWdnZXJJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3RyaWdnZXIvcHJvdmlkZXIvVHJpZ2dlckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjM2YyZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90cmlnZ2VyL3Byb3ZpZGVyL1RyaWdnZXJJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI3OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuVXRpbGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByb3ZpZGVyLkRlY29yYXRvckl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5UcmlnZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuVHJpZ2dlcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVHJpZ2dlckl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgRGVjb3JhdG9ySXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUcmlnZ2VySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOworCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVHJpZ2dlclBhY2thZ2UuTGl0ZXJhbHMuVFJJR0dFUl9fUFJFRElDQVRFKTsKKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFRyaWdnZXJQYWNrYWdlLkxpdGVyYWxzLlRSSUdHRVJfX0FDVElPTik7CisJCX0KKwkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7CisJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKKwkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgorCisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFRyaWdnZXIuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbW9iajE2L1RyaWdnZXIiKSk7CisJfQorCQorCS8qKgorCSAqIFRoaXMgcmV0dXJucyBUcmlnZ2VyLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlR2VuKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1RyaWdnZXIiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKFRyaWdnZXIpb2JqZWN0KS5nZXRVUkkoKS5sYXN0U2VnbWVudCgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1RyaWdnZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChUcmlnZ2VyKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfVHJpZ2dlcl90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9UcmlnZ2VyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisJCisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUcmlnZ2VyLmNsYXNzKSkgeworCQkJY2FzZSBUcmlnZ2VyUGFja2FnZS5UUklHR0VSX19QUkVESUNBVEU6CisJCQljYXNlIFRyaWdnZXJQYWNrYWdlLlRSSUdHRVJfX0FDVElPTjoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVTZXRDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAorCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCisJICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlU2V0Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKKwkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgeworCQkvLyBBcmUgd2Ugc2V0dGluZyB0aGUgbW9kZWwgZHVyaW5nIGEgZHJhZyBhbmQgZHJvcD8KKwkJT2JqZWN0IHRlbXAgPSB2YWx1ZTsKKworCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJRmlsZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBJRmlsZSBpRmlsZSA9IChJRmlsZSkgdmFsdWU7CisJCQlmaW5hbCBVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkoaUZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKKwkJCWZpbmFsIElkZW50aWZpYWJsZSBpZGVudGlmYWJsZSA9IFV0aWxpdHkuZ2V0SWRlbnRpZmlhYmxlKHVyaSk7CisJCQl0ZW1wID0gaWRlbnRpZmFibGU7CisJCX0gLy8gaWYgSUZpbGUKKworCQllbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJLy8gWWVzCisJCQkvLyBUaGVzZSBjb21lIGZyb20gSWRlbnRpZmFibGVQbHVnaW5WaWV3CisJCQlmaW5hbCBTdHJpbmcgdXJpU3RyaW5nID0gKFN0cmluZykgdmFsdWU7CisJCQl0cnkgeworCQkJCWZpbmFsIFVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaVN0cmluZyk7CisJCQkJZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50aWZhYmxlID0gVXRpbGl0eS5nZXRJZGVudGlmaWFibGUodXJpKTsKKwkJCQl0ZW1wID0gaWRlbnRpZmFibGU7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCS8vIElnbm9yZSBpdAorCQkJfQorCQl9IC8vIGlmIFN0cmluZworCisJCWlmICh0ZW1wIGluc3RhbmNlb2YgUHJlZGljYXRlKSB7CisJCQlyZXR1cm4gc3VwZXIuY3JlYXRlU2V0Q29tbWFuZChkb21haW4sIG93bmVyLAorCQkJCQlUcmlnZ2VyUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VHJpZ2dlcl9QcmVkaWNhdGUoKSwgdGVtcCwgaW5kZXgpOworCQl9IGVsc2UgaWYgKHRlbXAgaW5zdGFuY2VvZiBEZWNvcmF0b3IpIHsKKwkJCXJldHVybiBzdXBlci5jcmVhdGVTZXRDb21tYW5kKGRvbWFpbiwgb3duZXIsCisJCQkJCVRyaWdnZXJQYWNrYWdlLmVJTlNUQU5DRS5nZXRUcmlnZ2VyX0FjdGlvbigpLCB0ZW1wLAorCQkJCQlpbmRleCk7CisJCX0gLy8gaWYKKwkJZWxzZSB7CisJCQlyZXR1cm4gc3VwZXIuY3JlYXRlU2V0Q29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCB2YWx1ZSwgaW5kZXgpOworCQl9CisJfSAvLyBjcmVhdGVTZXRDb21tYW5kCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKKwkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGZsb2F0LCBpbnQsIGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAorCQkJT2JqZWN0IG93bmVyLCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sCisJCQlDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKKwkJLy8gV2UgYWRkIERORC5EUk9QX0xJTksgYXMgYW4gYWxsb3dlZCBvcGVyYXRpb24gYmVjYXVzZSBhbGwgZHJvcHMgd2lsbAorCQkvLyBiZSBsaW5rcyBhbmQgc29tZSBzb3VyY2VzIGRvbid0IGFsbG93IGxpbmtzLCB3ZSBjb252ZXJ0IHRvIGxpbmtzCisJCS8vIGFueXdheQorCQlyZXR1cm4gc3VwZXIuY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLAorCQkJCW9wZXJhdGlvbnMgfCBETkQuRFJPUF9MSU5LLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pOworCX0gLy8gY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2lzV3JhcHBpbmdOZWVkZWQoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKKwkJLy8gcmV0dXJuIHN1cGVyLmlzV3JhcHBpbmdOZWVkZWQob2JqZWN0KTsKKwkJLy8gV2UgcmV0dXJuIHRydWUgc28gdGhhdCBub24tY29udGFpbm1lbnQgcmVmZXJlbmNlcyBhcmUgd3JhcHBlZC4gVGhpcworCQkvLyBlbmFibGVzIHRoZSBkZWxldGUgY29tbWFuZCBpbiB0aGUgZWRpdG9yJ3MgY29udGV4dCBtZW51LgorCQlyZXR1cm4gdHJ1ZTsKKwl9IC8vIGlzV3JhcHBpbmdOZWVkZWQKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIENvcmVFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdHJpZ2dlci9wcm92aWRlci9UcmlnZ2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3RyaWdnZXIvcHJvdmlkZXIvVHJpZ2dlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4MmY1NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3RyaWdnZXIvcHJvdmlkZXIvVHJpZ2dlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMDkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci51dGlsLlRyaWdnZXJBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuCisgKiBUaGUgYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4KKyAqIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCisgKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUcmlnZ2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBUcmlnZ2VyQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKKworCS8qKgorCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5IHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxPYmplY3Q+IHN1cHBvcnRlZFR5cGVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRyaWdnZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuVHJpZ2dlcn0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmlnZ2VySXRlbVByb3ZpZGVyIHRyaWdnZXJJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuVHJpZ2dlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVHJpZ2dlckFkYXB0ZXIoKSB7CisJCWlmICh0cmlnZ2VySXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXRyaWdnZXJJdGVtUHJvdmlkZXIgPSBuZXcgVHJpZ2dlckl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiB0cmlnZ2VySXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7CisJCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKKwkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKKwkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKKwkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzczw/PikgfHwgKCgoQ2xhc3M8Pz4pdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKKwkJCQlyZXR1cm4gYWRhcHRlcjsKKwkJCX0KKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKKwkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfSBhbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCisJCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7CisJCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LiAKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlpZiAodHJpZ2dlckl0ZW1Qcm92aWRlciAhPSBudWxsKSB0cmlnZ2VySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3RyaWdnZXIvdXRpbC9UcmlnZ2VyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3RyaWdnZXIvdXRpbC9UcmlnZ2VyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDJkZWZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdHJpZ2dlci91dGlsL1RyaWdnZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLnV0aWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci4qOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuVHJpZ2dlclBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRyaWdnZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgVHJpZ2dlclBhY2thZ2UgbW9kZWxQYWNrYWdlOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUcmlnZ2VyQWRhcHRlckZhY3RvcnkoKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gVHJpZ2dlclBhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgeworCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKKwkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmlnZ2VyU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0KKwkJbmV3IFRyaWdnZXJTd2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUcmlnZ2VyKFRyaWdnZXIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRyaWdnZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyA8VD4gQWRhcHRlciBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGVjb3JhdG9yKERlY29yYXRvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGVjb3JhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworCQkJfQorCQl9OworCisJLyoqCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXIgPGVtPlRyaWdnZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuVHJpZ2dlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUcmlnZ2VyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLmxhbmcuQ29tcGFyYWJsZSA8ZW0+Q29tcGFyYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvciA8ZW0+RGVjb3JhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVjb3JhdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL1RyaWdnZXJBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdHJpZ2dlci91dGlsL1RyaWdnZXJTd2l0Y2guamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3RyaWdnZXIvdXRpbC9UcmlnZ2VyU3dpdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0MjkzZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3RyaWdnZXIvdXRpbC9UcmlnZ2VyU3dpdGNoLmphdmEKQEAgLTAsMCArMSwxODcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci4qOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQorICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAorICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKKyAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKyAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAorICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUcmlnZ2VyU3dpdGNoPFQxPiB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBUcmlnZ2VyUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRyaWdnZXJTd2l0Y2goKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gVHJpZ2dlclBhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUMSBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKKwkJfQorCQllbHNlIHsKKwkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOworCQkJcmV0dXJuCisJCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KKwkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgorCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7CisJCQljYXNlIFRyaWdnZXJQYWNrYWdlLlRSSUdHRVI6IHsKKwkJCQlUcmlnZ2VyIHRyaWdnZXIgPSAoVHJpZ2dlcil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VUcmlnZ2VyKHRyaWdnZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcih0cmlnZ2VyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUodHJpZ2dlcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZSh0cmlnZ2VyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UcmlnZ2VyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VHJpZ2dlcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VUcmlnZ2VyKFRyaWdnZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgPFQ+IFQxIGNhc2VDb21wYXJhYmxlKENvbXBhcmFibGU8VD4gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWNvcmF0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWNvcmF0b3I8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRGVjb3JhdG9yKERlY29yYXRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9IC8vVHJpZ2dlclN3aXRjaApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGU4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvLmN2c2lnbm9yZSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTI3YmU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy8uY3ZzaWdub3JlCkBAIC0wLDAgKzEgQEAKK3RleHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvLmZicHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLy5mYnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMjY4YTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLy5mYnByZWZzCkBAIC0wLDAgKzEsMTI1IEBACisjRmluZEJ1Z3MgVXNlciBQcmVmZXJlbmNlcworI1R1ZSBBdWcgMTEgMTU6MDg6MTIgRURUIDIwMDkKK2RldGVjdG9yQXBwZW5kaW5nVG9Bbk9iamVjdE91dHB1dFN0cmVhbT1BcHBlbmRpbmdUb0FuT2JqZWN0T3V0cHV0U3RyZWFtfHRydWUKK2RldGVjdG9yQmFkQXBwbGV0Q29uc3RydWN0b3I9QmFkQXBwbGV0Q29uc3RydWN0b3J8ZmFsc2UKK2RldGVjdG9yQmFkUmVzdWx0U2V0QWNjZXNzPUJhZFJlc3VsdFNldEFjY2Vzc3x0cnVlCitkZXRlY3RvckJhZFN5bnRheEZvclJlZ3VsYXJFeHByZXNzaW9uPUJhZFN5bnRheEZvclJlZ3VsYXJFeHByZXNzaW9ufHRydWUKK2RldGVjdG9yQmFkVXNlT2ZSZXR1cm5WYWx1ZT1CYWRVc2VPZlJldHVyblZhbHVlfHRydWUKK2RldGVjdG9yQmFkbHlPdmVycmlkZGVuQWRhcHRlcj1CYWRseU92ZXJyaWRkZW5BZGFwdGVyfHRydWUKK2RldGVjdG9yQm9vbGVhblJldHVybk51bGw9Qm9vbGVhblJldHVybk51bGx8dHJ1ZQorZGV0ZWN0b3JDYWxsVG9VbnN1cHBvcnRlZE1ldGhvZD1DYWxsVG9VbnN1cHBvcnRlZE1ldGhvZHx0cnVlCitkZXRlY3RvckNoZWNrSW1tdXRhYmxlQW5ub3RhdGlvbj1DaGVja0ltbXV0YWJsZUFubm90YXRpb258dHJ1ZQorZGV0ZWN0b3JDaGVja1R5cGVRdWFsaWZpZXJzPUNoZWNrVHlwZVF1YWxpZmllcnN8dHJ1ZQorZGV0ZWN0b3JDbG9uZUlkaW9tPUNsb25lSWRpb218dHJ1ZQorZGV0ZWN0b3JDb21wYXJhdG9ySWRpb209Q29tcGFyYXRvcklkaW9tfHRydWUKK2RldGVjdG9yQ29uZnVzZWRJbmhlcml0YW5jZT1Db25mdXNlZEluaGVyaXRhbmNlfHRydWUKK2RldGVjdG9yQ29uZnVzaW9uQmV0d2VlbkluaGVyaXRlZEFuZE91dGVyTWV0aG9kPUNvbmZ1c2lvbkJldHdlZW5Jbmhlcml0ZWRBbmRPdXRlck1ldGhvZHx0cnVlCitkZXRlY3RvckNyb3NzU2l0ZVNjcmlwdGluZz1Dcm9zc1NpdGVTY3JpcHRpbmd8dHJ1ZQorZGV0ZWN0b3JEb0luc2lkZURvUHJpdmlsZWdlZD1Eb0luc2lkZURvUHJpdmlsZWdlZHx0cnVlCitkZXRlY3RvckRvbnRDYXRjaElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb249RG9udENhdGNoSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbnx0cnVlCitkZXRlY3RvckRvbnRVc2VFbnVtPURvbnRVc2VFbnVtfHRydWUKK2RldGVjdG9yRHJvcHBlZEV4Y2VwdGlvbj1Ecm9wcGVkRXhjZXB0aW9ufHRydWUKK2RldGVjdG9yRHVtYk1ldGhvZEludm9jYXRpb25zPUR1bWJNZXRob2RJbnZvY2F0aW9uc3x0cnVlCitkZXRlY3RvckR1bWJNZXRob2RzPUR1bWJNZXRob2RzfHRydWUKK2RldGVjdG9yRHVwbGljYXRlQnJhbmNoZXM9RHVwbGljYXRlQnJhbmNoZXN8dHJ1ZQorZGV0ZWN0b3JFbXB0eVppcEZpbGVFbnRyeT1FbXB0eVppcEZpbGVFbnRyeXx0cnVlCitkZXRlY3RvckVxdWFsc09wZXJhbmRTaG91bGRIYXZlQ2xhc3NDb21wYXRpYmxlV2l0aFRoaXM9RXF1YWxzT3BlcmFuZFNob3VsZEhhdmVDbGFzc0NvbXBhdGlibGVXaXRoVGhpc3x0cnVlCitkZXRlY3RvckZpbmFsaXplck51bGxzRmllbGRzPUZpbmFsaXplck51bGxzRmllbGRzfHRydWUKK2RldGVjdG9yRmluZEJhZENhc3QyPUZpbmRCYWRDYXN0Mnx0cnVlCitkZXRlY3RvckZpbmRCYWRGb3JMb29wPUZpbmRCYWRGb3JMb29wfHRydWUKK2RldGVjdG9yRmluZENpcmN1bGFyRGVwZW5kZW5jaWVzPUZpbmRDaXJjdWxhckRlcGVuZGVuY2llc3xmYWxzZQorZGV0ZWN0b3JGaW5kRGVhZExvY2FsU3RvcmVzPUZpbmREZWFkTG9jYWxTdG9yZXN8dHJ1ZQorZGV0ZWN0b3JGaW5kRG91YmxlQ2hlY2s9RmluZERvdWJsZUNoZWNrfHRydWUKK2RldGVjdG9yRmluZEVtcHR5U3luY2hyb25pemVkQmxvY2s9RmluZEVtcHR5U3luY2hyb25pemVkQmxvY2t8dHJ1ZQorZGV0ZWN0b3JGaW5kRmllbGRTZWxmQXNzaWdubWVudD1GaW5kRmllbGRTZWxmQXNzaWdubWVudHx0cnVlCitkZXRlY3RvckZpbmRGaW5hbGl6ZUludm9jYXRpb25zPUZpbmRGaW5hbGl6ZUludm9jYXRpb25zfHRydWUKK2RldGVjdG9yRmluZEZsb2F0RXF1YWxpdHk9RmluZEZsb2F0RXF1YWxpdHl8dHJ1ZQorZGV0ZWN0b3JGaW5kSEVtaXNtYXRjaD1GaW5kSEVtaXNtYXRjaHx0cnVlCitkZXRlY3RvckZpbmRJbmNvbnNpc3RlbnRTeW5jMj1GaW5kSW5jb25zaXN0ZW50U3luYzJ8dHJ1ZQorZGV0ZWN0b3JGaW5kSlNSMTY2TG9ja01vbml0b3JlbnRlcj1GaW5kSlNSMTY2TG9ja01vbml0b3JlbnRlcnx0cnVlCitkZXRlY3RvckZpbmRMb2NhbFNlbGZBc3NpZ25tZW50Mj1GaW5kTG9jYWxTZWxmQXNzaWdubWVudDJ8dHJ1ZQorZGV0ZWN0b3JGaW5kTWFza2VkRmllbGRzPUZpbmRNYXNrZWRGaWVsZHN8dHJ1ZQorZGV0ZWN0b3JGaW5kTWlzbWF0Y2hlZFdhaXRPck5vdGlmeT1GaW5kTWlzbWF0Y2hlZFdhaXRPck5vdGlmeXx0cnVlCitkZXRlY3RvckZpbmROYWtlZE5vdGlmeT1GaW5kTmFrZWROb3RpZnl8dHJ1ZQorZGV0ZWN0b3JGaW5kTm9uU2VyaWFsaXphYmxlU3RvcmVJbnRvU2Vzc2lvbj1GaW5kTm9uU2VyaWFsaXphYmxlU3RvcmVJbnRvU2Vzc2lvbnx0cnVlCitkZXRlY3RvckZpbmROb25TZXJpYWxpemFibGVWYWx1ZVBhc3NlZFRvV3JpdGVPYmplY3Q9RmluZE5vblNlcmlhbGl6YWJsZVZhbHVlUGFzc2VkVG9Xcml0ZU9iamVjdHx0cnVlCitkZXRlY3RvckZpbmROb25TaG9ydENpcmN1aXQ9RmluZE5vblNob3J0Q2lyY3VpdHx0cnVlCitkZXRlY3RvckZpbmROdWxsRGVyZWY9RmluZE51bGxEZXJlZnx0cnVlCitkZXRlY3RvckZpbmROdWxsRGVyZWZzSW52b2x2aW5nTm9uU2hvcnRDaXJjdWl0RXZhbHVhdGlvbj1GaW5kTnVsbERlcmVmc0ludm9sdmluZ05vblNob3J0Q2lyY3VpdEV2YWx1YXRpb258dHJ1ZQorZGV0ZWN0b3JGaW5kT3BlblN0cmVhbT1GaW5kT3BlblN0cmVhbXx0cnVlCitkZXRlY3RvckZpbmRQdXp6bGVycz1GaW5kUHV6emxlcnN8dHJ1ZQorZGV0ZWN0b3JGaW5kUmVmQ29tcGFyaXNvbj1GaW5kUmVmQ29tcGFyaXNvbnx0cnVlCitkZXRlY3RvckZpbmRSZXR1cm5SZWY9RmluZFJldHVyblJlZnx0cnVlCitkZXRlY3RvckZpbmRSdW5JbnZvY2F0aW9ucz1GaW5kUnVuSW52b2NhdGlvbnN8dHJ1ZQorZGV0ZWN0b3JGaW5kU2VsZkNvbXBhcmlzb249RmluZFNlbGZDb21wYXJpc29ufHRydWUKK2RldGVjdG9yRmluZFNlbGZDb21wYXJpc29uMj1GaW5kU2VsZkNvbXBhcmlzb24yfHRydWUKK2RldGVjdG9yRmluZFNsZWVwV2l0aExvY2tIZWxkPUZpbmRTbGVlcFdpdGhMb2NrSGVsZHx0cnVlCitkZXRlY3RvckZpbmRTcGluTG9vcD1GaW5kU3Bpbkxvb3B8dHJ1ZQorZGV0ZWN0b3JGaW5kU3FsSW5qZWN0aW9uPUZpbmRTcWxJbmplY3Rpb258dHJ1ZQorZGV0ZWN0b3JGaW5kVHdvTG9ja1dhaXQ9RmluZFR3b0xvY2tXYWl0fHRydWUKK2RldGVjdG9yRmluZFVuY2FsbGVkUHJpdmF0ZU1ldGhvZHM9RmluZFVuY2FsbGVkUHJpdmF0ZU1ldGhvZHN8dHJ1ZQorZGV0ZWN0b3JGaW5kVW5jb25kaXRpb25hbFdhaXQ9RmluZFVuY29uZGl0aW9uYWxXYWl0fHRydWUKK2RldGVjdG9yRmluZFVuaW5pdGlhbGl6ZWRHZXQ9RmluZFVuaW5pdGlhbGl6ZWRHZXR8dHJ1ZQorZGV0ZWN0b3JGaW5kVW5yZWxhdGVkVHlwZXNJbkdlbmVyaWNDb250YWluZXI9RmluZFVucmVsYXRlZFR5cGVzSW5HZW5lcmljQ29udGFpbmVyfHRydWUKK2RldGVjdG9yRmluZFVucmVsZWFzZWRMb2NrPUZpbmRVbnJlbGVhc2VkTG9ja3x0cnVlCitkZXRlY3RvckZpbmRVbnNhdGlzZmllZE9ibGlnYXRpb249RmluZFVuc2F0aXNmaWVkT2JsaWdhdGlvbnx0cnVlCitkZXRlY3RvckZpbmRVbnN5bmNHZXQ9RmluZFVuc3luY0dldHx0cnVlCitkZXRlY3RvckZpbmRVc2VsZXNzQ29udHJvbEZsb3c9RmluZFVzZWxlc3NDb250cm9sRmxvd3x0cnVlCitkZXRlY3RvckZvcm1hdFN0cmluZ0NoZWNrZXI9Rm9ybWF0U3RyaW5nQ2hlY2tlcnx0cnVlCitkZXRlY3Rvckh1Z2VTaGFyZWRTdHJpbmdDb25zdGFudHM9SHVnZVNoYXJlZFN0cmluZ0NvbnN0YW50c3x0cnVlCitkZXRlY3RvcklEaXZSZXN1bHRDYXN0VG9Eb3VibGU9SURpdlJlc3VsdENhc3RUb0RvdWJsZXx0cnVlCitkZXRlY3RvckluY29tcGF0TWFzaz1JbmNvbXBhdE1hc2t8dHJ1ZQorZGV0ZWN0b3JJbmNvbnNpc3RlbnRBbm5vdGF0aW9ucz1JbmNvbnNpc3RlbnRBbm5vdGF0aW9uc3x0cnVlCitkZXRlY3RvckluZWZmaWNpZW50TWVtYmVyQWNjZXNzPUluZWZmaWNpZW50TWVtYmVyQWNjZXNzfGZhbHNlCitkZXRlY3RvckluZWZmaWNpZW50VG9BcnJheT1JbmVmZmljaWVudFRvQXJyYXl8dHJ1ZQorZGV0ZWN0b3JJbmZpbml0ZUxvb3A9SW5maW5pdGVMb29wfHRydWUKK2RldGVjdG9ySW5maW5pdGVSZWN1cnNpdmVMb29wPUluZmluaXRlUmVjdXJzaXZlTG9vcHx0cnVlCitkZXRlY3RvckluZmluaXRlUmVjdXJzaXZlTG9vcDI9SW5maW5pdGVSZWN1cnNpdmVMb29wMnxmYWxzZQorZGV0ZWN0b3JJbmhlcml0YW5jZVVuc2FmZUdldFJlc291cmNlPUluaGVyaXRhbmNlVW5zYWZlR2V0UmVzb3VyY2V8dHJ1ZQorZGV0ZWN0b3JJbml0aWFsaXphdGlvbkNoYWluPUluaXRpYWxpemF0aW9uQ2hhaW58dHJ1ZQorZGV0ZWN0b3JJbnN0YW50aWF0ZVN0YXRpY0NsYXNzPUluc3RhbnRpYXRlU3RhdGljQ2xhc3N8dHJ1ZQorZGV0ZWN0b3JJbnZhbGlkSlVuaXRUZXN0PUludmFsaWRKVW5pdFRlc3R8dHJ1ZQorZGV0ZWN0b3JJdGVyYXRvcklkaW9tcz1JdGVyYXRvcklkaW9tc3x0cnVlCitkZXRlY3RvckxhenlJbml0PUxhenlJbml0fHRydWUKK2RldGVjdG9yTG9hZE9mS25vd25OdWxsVmFsdWU9TG9hZE9mS25vd25OdWxsVmFsdWV8dHJ1ZQorZGV0ZWN0b3JNZXRob2RSZXR1cm5DaGVjaz1NZXRob2RSZXR1cm5DaGVja3x0cnVlCitkZXRlY3Rvck11bHRpdGhyZWFkZWRJbnN0YW5jZUFjY2Vzcz1NdWx0aXRocmVhZGVkSW5zdGFuY2VBY2Nlc3N8dHJ1ZQorZGV0ZWN0b3JNdXRhYmxlTG9jaz1NdXRhYmxlTG9ja3x0cnVlCitkZXRlY3Rvck11dGFibGVTdGF0aWNGaWVsZHM9TXV0YWJsZVN0YXRpY0ZpZWxkc3x0cnVlCitkZXRlY3Rvck5hbWluZz1OYW1pbmd8dHJ1ZQorZGV0ZWN0b3JOdW1iZXJDb25zdHJ1Y3Rvcj1OdW1iZXJDb25zdHJ1Y3RvcnxmYWxzZQorZGV0ZWN0b3JPdmVycmlkaW5nRXF1YWxzTm90U3ltbWV0cmljYWw9T3ZlcnJpZGluZ0VxdWFsc05vdFN5bW1ldHJpY2FsfHRydWUKK2RldGVjdG9yUHJlZmVyWmVyb0xlbmd0aEFycmF5cz1QcmVmZXJaZXJvTGVuZ3RoQXJyYXlzfHRydWUKK2RldGVjdG9yUHVibGljU2VtYXBob3Jlcz1QdWJsaWNTZW1hcGhvcmVzfGZhbHNlCitkZXRlY3RvclF1ZXN0aW9uYWJsZUJvb2xlYW5Bc3NpZ25tZW50PVF1ZXN0aW9uYWJsZUJvb2xlYW5Bc3NpZ25tZW50fHRydWUKK2RldGVjdG9yUmVhZFJldHVyblNob3VsZEJlQ2hlY2tlZD1SZWFkUmV0dXJuU2hvdWxkQmVDaGVja2VkfHRydWUKK2RldGVjdG9yUmVkdW5kYW50SW50ZXJmYWNlcz1SZWR1bmRhbnRJbnRlcmZhY2VzfHRydWUKK2RldGVjdG9yUmVwZWF0ZWRDb25kaXRpb25hbHM9UmVwZWF0ZWRDb25kaXRpb25hbHN8dHJ1ZQorZGV0ZWN0b3JSdW50aW1lRXhjZXB0aW9uQ2FwdHVyZT1SdW50aW1lRXhjZXB0aW9uQ2FwdHVyZXx0cnVlCitkZXRlY3RvclNlcmlhbGl6YWJsZUlkaW9tPVNlcmlhbGl6YWJsZUlkaW9tfHRydWUKK2RldGVjdG9yU3RhcnRJbkNvbnN0cnVjdG9yPVN0YXJ0SW5Db25zdHJ1Y3Rvcnx0cnVlCitkZXRlY3RvclN0YXRpY0NhbGVuZGFyRGV0ZWN0b3I9U3RhdGljQ2FsZW5kYXJEZXRlY3Rvcnx0cnVlCitkZXRlY3RvclN0cmluZ0NvbmNhdGVuYXRpb249U3RyaW5nQ29uY2F0ZW5hdGlvbnx0cnVlCitkZXRlY3RvclN1cGVyZmx1b3VzSW5zdGFuY2VPZj1TdXBlcmZsdW91c0luc3RhbmNlT2Z8dHJ1ZQorZGV0ZWN0b3JTdXNwaWNpb3VzVGhyZWFkSW50ZXJydXB0ZWQ9U3VzcGljaW91c1RocmVhZEludGVycnVwdGVkfHRydWUKK2RldGVjdG9yU3dpdGNoRmFsbHRocm91Z2g9U3dpdGNoRmFsbHRocm91Z2h8dHJ1ZQorZGV0ZWN0b3JTeW5jaHJvbml6ZUFuZE51bGxDaGVja0ZpZWxkPVN5bmNocm9uaXplQW5kTnVsbENoZWNrRmllbGR8dHJ1ZQorZGV0ZWN0b3JTeW5jaHJvbml6ZU9uQ2xhc3NMaXRlcmFsTm90R2V0Q2xhc3M9U3luY2hyb25pemVPbkNsYXNzTGl0ZXJhbE5vdEdldENsYXNzfHRydWUKK2RldGVjdG9yU3luY2hyb25pemluZ09uQ29udGVudHNPZkZpZWxkVG9Qcm90ZWN0RmllbGQ9U3luY2hyb25pemluZ09uQ29udGVudHNPZkZpZWxkVG9Qcm90ZWN0RmllbGR8dHJ1ZQorZGV0ZWN0b3JVUkxQcm9ibGVtcz1VUkxQcm9ibGVtc3x0cnVlCitkZXRlY3RvclVuY2FsbGFibGVNZXRob2RPZkFub255bW91c0NsYXNzPVVuY2FsbGFibGVNZXRob2RPZkFub255bW91c0NsYXNzfHRydWUKK2RldGVjdG9yVW5uZWNlc3NhcnlNYXRoPVVubmVjZXNzYXJ5TWF0aHx0cnVlCitkZXRlY3RvclVucmVhZEZpZWxkcz1VbnJlYWRGaWVsZHN8dHJ1ZQorZGV0ZWN0b3JVc2VPYmplY3RFcXVhbHM9VXNlT2JqZWN0RXF1YWxzfGZhbHNlCitkZXRlY3RvclVzZWxlc3NTdWJjbGFzc01ldGhvZD1Vc2VsZXNzU3ViY2xhc3NNZXRob2R8ZmFsc2UKK2RldGVjdG9yVmFyQXJnc1Byb2JsZW1zPVZhckFyZ3NQcm9ibGVtc3x0cnVlCitkZXRlY3RvclZvbGF0aWxlVXNhZ2U9Vm9sYXRpbGVVc2FnZXx0cnVlCitkZXRlY3RvcldhaXRJbkxvb3A9V2FpdEluTG9vcHx0cnVlCitkZXRlY3Rvcldyb25nTWFwSXRlcmF0b3I9V3JvbmdNYXBJdGVyYXRvcnx0cnVlCitkZXRlY3RvclhNTEZhY3RvcnlCeXBhc3M9WE1MRmFjdG9yeUJ5cGFzc3x0cnVlCitkZXRlY3Rvcl90aHJlc2hvbGQ9MgorZWZmb3J0PW1heAorZXhjbHVkZWZpbHRlcjA9LnNldHRpbmdzL2ZpbmRidWdzLmV4Y2x1ZGUueG1sCitmaWx0ZXJfc2V0dGluZ3M9TWVkaXVtfEJBRF9QUkFDVElDRSxDT1JSRUNUTkVTUyxFWFBFUklNRU5UQUwsSTE4TixNQUxJQ0lPVVNfQ09ERSxNVF9DT1JSRUNUTkVTUyxQRVJGT1JNQU5DRSxTRUNVUklUWSxTVFlMRXxmYWxzZQorZmlsdGVyX3NldHRpbmdzX25lZz1OT0lTRXwKK3J1bl9hdF9mdWxsX2J1aWxkPWZhbHNlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTVjMDZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvLnNldHRpbmdzL2ZpbmRidWdzLmV4Y2x1ZGUueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy8uc2V0dGluZ3MvZmluZGJ1Z3MuZXhjbHVkZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkZWJmYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvLnNldHRpbmdzL2ZpbmRidWdzLmV4Y2x1ZGUueG1sCkBAIC0wLDAgKzEsNDYgQEAKKzxGaW5kQnVnc0ZpbHRlcj4KKyAgICA8TWF0Y2g+CisgICAgICAgIDxQYWNrYWdlIG5hbWU9In5vcmdcLmVjbGlwc2VcLnN0ZW1cLmRlZmluaXRpb25zXC4qIiAvPgorICAgICAgICA8QnVnIGNvZGU9IlNULExJLE1TLElDIiAvPgorICAgIDwvTWF0Y2g+CisgICAgPE1hdGNoPgorICAgICAgICA8UGFja2FnZSBuYW1lPSJ+b3JnXC5lY2xpcHNlXC5zdGVtXC5kZWZpbml0aW9uc1wuKlwuKiIgLz4KKyAgICAgICAgPEJ1ZyBjb2RlPSJTVCxMSSxNUyxJQyIgLz4KKyAgICA8L01hdGNoPgorICAgIDxNYXRjaD4KKyAgICAgICAgPFBhY2thZ2UgbmFtZT0ifm9yZ1wuZWNsaXBzZVwuc3RlbVwuZGVmaW5pdGlvbnNcLipcLipcLioiIC8+CisgICAgICAgIDxCdWcgY29kZT0iU1QsTEksTVMsSUMiIC8+CisgICAgPC9NYXRjaD4KKyAgICA8TWF0Y2g+CisgICAgICAgIDxQYWNrYWdlIG5hbWU9In5vcmdcLmVjbGlwc2VcLnN0ZW1cLmRlZmluaXRpb25zXC5lZGdlc1wuKiIgLz4KKyAgICAgICAgPEJ1ZyBjb2RlPSJTVCxMSSxNUyxJQyIgLz4KKyAgICA8L01hdGNoPgorICAgIDxNYXRjaD4KKyAgICAgICAgPFBhY2thZ2UgbmFtZT0ifm9yZ1wuZWNsaXBzZVwuc3RlbVwuZGVmaW5pdGlvbnNcLmVkZ2VzXC51dGlsXC4qXC4qIiAvPgorICAgICAgICA8QnVnIGNvZGU9IlNULExJLE1TLElDIiAvPgorICAgIDwvTWF0Y2g+CisgICAgPE1hdGNoPgorICAgICAgICA8UGFja2FnZSBuYW1lPSJ+b3JnXC5lY2xpcHNlXC5zdGVtXC5kZWZpbml0aW9uc1wubGFiZWxzXC4qIiAvPgorICAgICAgICA8QnVnIGNvZGU9IlNULExJLE1TLElDIiAvPgorICAgIDwvTWF0Y2g+CisgICAgPE1hdGNoPgorICAgICAgICA8UGFja2FnZSBuYW1lPSJ+b3JnXC5lY2xpcHNlXC5zdGVtXC5kZWZpbml0aW9uc1wubGFiZWxzXC51dGlsXC4qXC4qIiAvPgorICAgICAgICA8QnVnIGNvZGU9IlNULExJLE1TLElDIiAvPgorICAgIDwvTWF0Y2g+CisgICAgICAgPE1hdGNoPgorICAgICAgICA8UGFja2FnZSBuYW1lPSJ+b3JnXC5lY2xpcHNlXC5zdGVtXC5kZWZpbml0aW9uc1wubm9kZXNcLioiIC8+CisgICAgICAgIDxCdWcgY29kZT0iU1QsTEksTVMsSUMiIC8+CisgICAgPC9NYXRjaD4KKyAgICAgICA8TWF0Y2g+CisgICAgICAgIDxQYWNrYWdlIG5hbWU9In5vcmdcLmVjbGlwc2VcLnN0ZW1cLmRlZmluaXRpb25zXC5ub2Rlc1wudXRpbFwuKlwuKiIgLz4KKyAgICAgICAgPEJ1ZyBjb2RlPSJTVCxMSSxNUyxJQyIgLz4KKyAgICA8L01hdGNoPgorICAgIDxNYXRjaD4KKyAgICAgICAgPFBhY2thZ2UgbmFtZT0ifm9yZ1wuZWNsaXBzZVwuc3RlbVwuZGVmaW5pdGlvbnNcLnR5cGVzXC4qIiAvPgorICAgICAgICA8QnVnIGNvZGU9IlNULExJLE1TLElDIiAvPgorICAgIDwvTWF0Y2g+CisgICAgPE1hdGNoPgorICAgICAgICA8UGFja2FnZSBuYW1lPSJ+b3JnXC5lY2xpcHNlXC5zdGVtXC5kZWZpbml0aW9uc1wudHlwZXNcLnV0aWxcLipcLioiIC8+CisgICAgICAgIDxCdWcgY29kZT0iU1QsTEksTVMsSUMiIC8+CisgICAgPC9NYXRjaD4KKzwvRmluZEJ1Z3NGaWx0ZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjU5ZWRjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw2OSBAQAorI01vbiBKYW4gMjEgMTI6Mzk6MjYgRVNUIDIwMDgKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YjU5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTAsMCArMSw1MCBAQAorI1dlZCBTZXAgMTIgMjI6MTc6MDUgRURUIDIwMDcKK2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD10cnVlCitjbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitjbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9dHJ1ZQorY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9dHJ1ZQorY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQorY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCitjbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQorY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCitjbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQorY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCitjbGVhbnVwLnVzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKK2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorY2xlYW51cF9wcm9maWxlPV9jbGVhbnVwCitjbGVhbnVwX3NldHRpbmdzX3ZlcnNpb249MgorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMGQ1OWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsNDQgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zOyBzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuQWN0aXZhdG9yCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucG9wdWxhdGlvbiwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUsCisgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLmhpc3RvcnksCisgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8sCisgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5wcmVmZXJlbmNlcywKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbCwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnByb3ZpZGVyLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMudXRpbCwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscywKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnByZXNlbnRhdGlvbiwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlciwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy51dGlsLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGF0dGljZSwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhdHRpY2UuaW1wbCwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuaW1wbCwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLnByZXNlbnRhdGlvbiwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLnByb3ZpZGVyLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMudXRpbCwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuaW1wbCwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLnByb3ZpZGVyLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMudXRpbAorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKKyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeSwKKyBvcmcuZWNsaXBzZS51aS5pZGU7dmlzaWJpbGl0eTo9cmVleHBvcnQKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmYwY2VkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTYgQEAKKyMgPGNvcHlyaWdodD4KKyMgPC9jb3B5cmlnaHQ+CisjCisjICRJZCQKKworYmluLmluY2x1ZGVzID0gLixcCisgICAgICAgICAgICAgICBpY29ucy8sXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgYmluLyxcCisgICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAorICAgICAgICAgICAgICAgbm90aWNlLmh0bWwKK2phcnMuY29tcGlsZS5vcmRlciA9IC4KK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNGIxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoreG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKK3htbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPGxpbmsgcmVsPUZpbGUtTGlzdAoraHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOkRvY3VtZW50UHJvcGVydGllcz4KKyAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KKyAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgorICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+CisgIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+CisgIDxvOlBhZ2VzPjQ8L286UGFnZXM+CisgIDxvOldvcmRzPjE2MjY8L286V29yZHM+CisgIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgorICAgPG86TGluZXM+Nzc8L286TGluZXM+CisgIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KKyAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+CisgIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+CisgPC9vOkRvY3VtZW50UHJvcGVydGllcz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OldvcmREb2N1bWVudD4KKyAgPHc6VHJhY2tSZXZpc2lvbnMvPgorIDwvdzpXb3JkRG9jdW1lbnQ+Cis8L3htbD48IVtlbmRpZl0tLT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlRhaG9tYTsKKwlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKKwltc28tZm9udC1jaGFyc2V0OjA7CisJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7CisJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7CisJbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KK3AuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bXNvLXN0eWxlLXBhcmVudDoiIjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwCisJe21hcmdpbi1yaWdodDowaW47CisJbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CisJbWFyZ2luLWxlZnQ6MGluOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKKwl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZTo4LjBwdDsKKwlmb250LWZhbWlseTpUYWhvbWE7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorQHBhZ2UgU2VjdGlvbjEKKwl7c2l6ZTo4LjVpbiAxMS4waW47CisJbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47CisJbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKKwltc28tZm9vdGVyLW1hcmdpbjouNWluOworCW1zby1wYXBlci1zb3VyY2U6MDt9CitkaXYuU2VjdGlvbjEKKwl7cGFnZTpTZWN0aW9uMTt9CistLT4KKzwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgorPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCitUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAorUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCitPRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCithZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKK3N1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKK2J5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgoraWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KK3N1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCit3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKK2VudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKK2NsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCitvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucworZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KK3JlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50CithIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KK3N0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5CitkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCitSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAorYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCitjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgorb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKK2J5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCit0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCithbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCitSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCitDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgordGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Citmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQordG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKK2lmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKK3RoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQorRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKK3JpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KK3RoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Cis8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK2l0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAorY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQorYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKK2FuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCitlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAoraW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAorYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCitzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0CitDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCitzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCitpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCitjb2RlIGZvcm06PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQorY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQorY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCitvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQorYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycworYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKK29mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAorbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCitDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKK2Nvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCit0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCitjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKK3RvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK3RvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCithbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQoraW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCit3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcworc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCitvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCitjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKK1dJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKK01FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQorUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcworQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKK2VxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgorVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgorVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKK29yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKK2Z1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgorYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAorb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCitzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCitwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQorY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKK3RoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKK0FncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCitzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAorZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCitTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCitBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKK0FncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKK2l0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9BcmVhTGFiZWxWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEeW5hbWljTGFiZWxfbmV4dFZhbHVlX0FyZWFMYWJlbFZhbHVlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjcwZDRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9BcmVhTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUR5bmFtaWNMYWJlbF9uZXh0VmFsdWVfQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5YWFkYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUR5bmFtaWNMYWJlbF9uZXh0VmFsdWVfQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9NaWdyYXRpb25FZGdlTGFiZWxWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEeW5hbWljTGFiZWxfbmV4dFZhbHVlX01pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzBmZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9NaWdyYXRpb25FZGdlTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9NaXhpbmdFZGdlTGFiZWxWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEeW5hbWljTGFiZWxfbmV4dFZhbHVlX01peGluZ0VkZ2VMYWJlbFZhbHVlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjIxOGNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9NaXhpbmdFZGdlTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzN2NlODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEeW5hbWljTGFiZWxfbmV4dFZhbHVlX1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9Qb3B1bGF0aW9uTGFiZWxWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEeW5hbWljTGFiZWxfbmV4dFZhbHVlX1BvcHVsYXRpb25MYWJlbFZhbHVlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzM0YTBmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9Qb3B1bGF0aW9uTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEeW5hbWljTGFiZWxfbmV4dFZhbHVlX1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjA4NGFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEeW5hbWljTGFiZWxfbmV4dFZhbHVlX1JvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjQ4NWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUR5bmFtaWNMYWJlbF9uZXh0VmFsdWVfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1Mjc2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUR5bmFtaWNMYWJlbF9uZXh0VmFsdWVfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWRnZV9sYWJlbF9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFZGdlX2xhYmVsX0NvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzUyZmYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWRnZV9sYWJlbF9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWRnZV9sYWJlbF9NaWdyYXRpb25FZGdlTGFiZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWRnZV9sYWJlbF9NaWdyYXRpb25FZGdlTGFiZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMDU2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFZGdlX2xhYmVsX01pZ3JhdGlvbkVkZ2VMYWJlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWRnZV9sYWJlbF9NaXhpbmdFZGdlTGFiZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWRnZV9sYWJlbF9NaXhpbmdFZGdlTGFiZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzODJhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFZGdlX2xhYmVsX01peGluZ0VkZ2VMYWJlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWRnZV9sYWJlbF9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWRnZV9sYWJlbF9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNDUzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFZGdlX2xhYmVsX1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWRnZV9sYWJlbF9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFZGdlX2xhYmVsX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjE0MjVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWRnZV9sYWJlbF9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSWRlbnRpZmlhYmxlX2R1YmxpbkNvcmVfRHVibGluQ29yZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJZGVudGlmaWFibGVfZHVibGluQ29yZV9EdWJsaW5Db3JlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjhmZjNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSWRlbnRpZmlhYmxlX2R1YmxpbkNvcmVfRHVibGluQ29yZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX0FyZWFMYWJlbFZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9BcmVhTGFiZWxWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4YjM4MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9BcmVhTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX0NvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX0NvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5M2M5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMYWJlbF9jdXJyZW50VmFsdWVfQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX01pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9NaWdyYXRpb25FZGdlTGFiZWxWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmNmJiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9NaWdyYXRpb25FZGdlTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX01peGluZ0VkZ2VMYWJlbFZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9NaXhpbmdFZGdlTGFiZWxWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxMDU2MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9NaXhpbmdFZGdlTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMYWJlbF9jdXJyZW50VmFsdWVfUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjc2NWUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1BvcHVsYXRpb25MYWJlbFZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9Qb3B1bGF0aW9uTGFiZWxWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2ZGEwMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9Qb3B1bGF0aW9uTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE5M2JmMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1JvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhZmFmZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZjE5ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMYWJlbF9jdXJyZW50VmFsdWVfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL29iajE2L0VhcnRoU2NpZW5jZUxhYmVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9vYmoxNi9FYXJ0aFNjaWVuY2VMYWJlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkM2I3NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9vYmoxNi9FYXJ0aFNjaWVuY2VMYWJlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL29iajE2L0VhcnRoU2NpZW5jZUxhYmVsVmFsdWUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL29iajE2L0VhcnRoU2NpZW5jZUxhYmVsVmFsdWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNWM3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvb2JqMTYvRWFydGhTY2llbmNlTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL29iajE2L0VkZ2VzTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9vYmoxNi9FZGdlc01vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxYzVkZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9vYmoxNi9FZGdlc01vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL29iajE2L0xhYmVsc01vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvb2JqMTYvTGFiZWxzTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjUxNzkyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL29iajE2L0xhYmVsc01vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL29iajE2L05vZGVzTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9vYmoxNi9Ob2Rlc01vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIzYWQ4MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9vYmoxNi9Ob2Rlc01vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL29iajE2L1BvcHVsYXRpb25FZGdlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9vYmoxNi9Qb3B1bGF0aW9uRWRnZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiMzUxZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvaWNvbnMvZnVsbC9vYmoxNi9Qb3B1bGF0aW9uRWRnZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL3dpemJhbi9OZXdFZGdlcy5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvd2l6YmFuL05ld0VkZ2VzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTg4NjVmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL3dpemJhbi9OZXdFZGdlcy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL3dpemJhbi9OZXdMYWJlbHMuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL3dpemJhbi9OZXdMYWJlbHMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZmQxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvd2l6YmFuL05ld0xhYmVscy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL3dpemJhbi9OZXdOb2Rlcy5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL2ljb25zL2Z1bGwvd2l6YmFuL05ld05vZGVzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2YyMTJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9pY29ucy9mdWxsL3dpemJhbi9OZXdOb2Rlcy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9tb2RlbC9kZWZpbml0aW9ucy5nZW5tb2RlbCBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvbW9kZWwvZGVmaW5pdGlvbnMuZ2VubW9kZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1ZjVlNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvbW9kZWwvZGVmaW5pdGlvbnMuZ2VubW9kZWwKQEAgLTAsMCArMSwxMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiDQorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiDQorICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBjb3B5cmlnaHRUZXh0PSIiDQorICAgIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMiIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYyINCisgICAgZWRpdG9yRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMiIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMiDQorICAgIHJlZGlyZWN0aW9uPSIiIG1vZGVsTmFtZT0iRGVmaW5pdGlvbnMiIG5vbk5MU01hcmtlcnM9InRydWUiIHRlc3RzRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMiDQorICAgIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5qYXZhIiBjb21wbGlhbmNlTGV2ZWw9IjUuMCIgY29weXJpZ2h0RmllbGRzPSJmYWxzZSINCisgICAgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL2dyYXBoIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vY29tbW9uIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vbW9kZWwgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZSAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL21vZGlmaWVyIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vc2NlbmFyaW8gLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9zZXF1ZW5jZXIgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9zb2x2ZXIiPg0KKyAgPGZvcmVpZ25Nb2RlbD5AbW9kZWw8L2ZvcmVpZ25Nb2RlbD4NCisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkVkZ2VzIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucyIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSINCisgICAgICBnZW5lcmF0ZUV4YW1wbGVDbGFzcz0iZmFsc2UiIG11bHRpcGxlRWRpdG9yUGFnZXM9ImZhbHNlIiBnZW5lcmF0ZU1vZGVsV2l6YXJkPSJmYWxzZSINCisgICAgICBlY29yZVBhY2thZ2U9ImVkZ2VzLmVjb3JlIy8iPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVkZ2VzLmVjb3JlIy8vTWlncmF0aW9uRWRnZSIvPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVkZ2VzLmVjb3JlIy8vTWlncmF0aW9uRWRnZUxhYmVsIi8+DQorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWRnZXMuZWNvcmUjLy9NaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSI+DQorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVkZ2VzLmVjb3JlIy8vTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUvbWlncmF0aW9uUmF0ZSIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWRnZXMuZWNvcmUjLy9NaXhpbmdFZGdlIi8+DQorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWRnZXMuZWNvcmUjLy9NaXhpbmdFZGdlTGFiZWwiLz4NCisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlZGdlcy5lY29yZSMvL01peGluZ0VkZ2VMYWJlbFZhbHVlIj4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWRnZXMuZWNvcmUjLy9NaXhpbmdFZGdlTGFiZWxWYWx1ZS9taXhpbmdSYXRlIi8+DQorICAgIDwvZ2VuQ2xhc3Nlcz4NCisgIDwvZ2VuUGFja2FnZXM+DQorICA8Z2VuUGFja2FnZXMgcHJlZml4PSJMYWJlbHMiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIg0KKyAgICAgIGdlbmVyYXRlRXhhbXBsZUNsYXNzPSJmYWxzZSIgbXVsdGlwbGVFZGl0b3JQYWdlcz0iZmFsc2UiIGdlbmVyYXRlTW9kZWxXaXphcmQ9ImZhbHNlIg0KKyAgICAgIGVjb3JlUGFja2FnZT0ibGFiZWxzLmVjb3JlIy8iPg0KKyAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJsYWJlbHMuZWNvcmUjLy9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwIj4NCisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImxhYmVscy5lY29yZSMvL1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAvVW5zcGVjaWZpZWQiLz4NCisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImxhYmVscy5lY29yZSMvL1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAvQWJvdmUiLz4NCisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImxhYmVscy5lY29yZSMvL1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAvQmVsb3ciLz4NCisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImxhYmVscy5lY29yZSMvL1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAvUmlnaHRPZiIvPg0KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ibGFiZWxzLmVjb3JlIy8vUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcC9MZWZ0T2YiLz4NCisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImxhYmVscy5lY29yZSMvL1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAvTm9ydGhPZiIvPg0KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ibGFiZWxzLmVjb3JlIy8vUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcC9Tb3V0aE9mIi8+DQorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJsYWJlbHMuZWNvcmUjLy9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwL1dlc3RPZiIvPg0KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ibGFiZWxzLmVjb3JlIy8vUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcC9FYXN0T2YiLz4NCisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImxhYmVscy5lY29yZSMvL1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAvQ29udGFpbnMiLz4NCisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImxhYmVscy5lY29yZSMvL1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAvQ29udGFpbmVkQnkiLz4NCisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImxhYmVscy5lY29yZSMvL1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAvT3ZlcmxhcHMiLz4NCisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImxhYmVscy5lY29yZSMvL1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAvT3JiaXRzIi8+DQorICAgIDwvZ2VuRW51bXM+DQorICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImxhYmVscy5lY29yZSMvL1RyYW5zcG9ydE1vZGUiPg0KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ibGFiZWxzLmVjb3JlIy8vVHJhbnNwb3J0TW9kZS91bnNwZWNpZmllZCIvPg0KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ibGFiZWxzLmVjb3JlIy8vVHJhbnNwb3J0TW9kZS9haXIiLz4NCisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImxhYmVscy5lY29yZSMvL1RyYW5zcG9ydE1vZGUvcm9hZCIvPg0KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ibGFiZWxzLmVjb3JlIy8vVHJhbnNwb3J0TW9kZS9yYWlsIi8+DQorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJsYWJlbHMuZWNvcmUjLy9UcmFuc3BvcnRNb2RlL21hcmluZSIvPg0KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ibGFiZWxzLmVjb3JlIy8vVHJhbnNwb3J0TW9kZS9mb290Ii8+DQorICAgIDwvZ2VuRW51bXM+DQorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ibGFiZWxzLmVjb3JlIy8vQXJlYUxhYmVsIj4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBsYWJlbHMuZWNvcmUjLy9BcmVhTGFiZWwvY3VycmVudEFyZWFWYWx1ZSIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ibGFiZWxzLmVjb3JlIy8vQXJlYUxhYmVsVmFsdWUiPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBsYWJlbHMuZWNvcmUjLy9BcmVhTGFiZWxWYWx1ZS9hcmVhIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGxhYmVscy5lY29yZSMvL0FyZWFMYWJlbFZhbHVlL2F2ZXJhZ2VFeHRlbnQiLz4NCisgICAgPC9nZW5DbGFzc2VzPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImxhYmVscy5lY29yZSMvL0NvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsIi8+DQorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ibGFiZWxzLmVjb3JlIy8vQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSI+DQorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGxhYmVscy5lY29yZSMvL0NvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUvYm9yZGVyTGVuZ3RoIi8+DQorICAgIDwvZ2VuQ2xhc3Nlcz4NCisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJsYWJlbHMuZWNvcmUjLy9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsIi8+DQorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ibGFiZWxzLmVjb3JlIy8vUG9wdWxhdGlvbkxhYmVsIj4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbGFiZWxzLmVjb3JlIy8vUG9wdWxhdGlvbkxhYmVsL3BvcHVsYXRpb25JZGVudGlmaWVyIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGxhYmVscy5lY29yZSMvL1BvcHVsYXRpb25MYWJlbC9uYW1lIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbGFiZWxzLmVjb3JlIy8vUG9wdWxhdGlvbkxhYmVsL2N1cnJlbnRQb3B1bGF0aW9uVmFsdWUiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbGFiZWxzLmVjb3JlIy8vUG9wdWxhdGlvbkxhYmVsL3BvcHVsYXRlZEFyZWEiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbGFiZWxzLmVjb3JlIy8vUG9wdWxhdGlvbkxhYmVsL3ZhbGlkWWVhciIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ibGFiZWxzLmVjb3JlIy8vUG9wdWxhdGlvbkxhYmVsVmFsdWUiPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBsYWJlbHMuZWNvcmUjLy9Qb3B1bGF0aW9uTGFiZWxWYWx1ZS9jb3VudCIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ibGFiZWxzLmVjb3JlIy8vUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsIj4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBsYWJlbHMuZWNvcmUjLy9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwvY3VycmVudFJlbGF0aW9uc2hpcCIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ibGFiZWxzLmVjb3JlIy8vUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUiPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBsYWJlbHMuZWNvcmUjLy9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS9hZGphY2VudCIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBsYWJlbHMuZWNvcmUjLy9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS9yZWxhdGlvbnNoaXAiLz4NCisgICAgPC9nZW5DbGFzc2VzPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImxhYmVscy5lY29yZSMvL1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsIj4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbGFiZWxzLmVjb3JlIy8vVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwvdHJhbnNwb3J0TW9kZSIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBsYWJlbHMuZWNvcmUjLy9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbC9wb3B1bGF0aW9uSWRlbnRpZmllciIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBsYWJlbHMuZWNvcmUjLy9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbC90cmFuc3BvcnRJZGVudGlmaWVyIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbGFiZWxzLmVjb3JlIy8vVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwvY3VycmVudFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbGFiZWxzLmVjb3JlIy8vVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwvcmF0ZVRpbWVQZXJpb2QiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBsYWJlbHMuZWNvcmUjLy9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbC9kZXBhcnR1cmVDYXBhY2l0eSIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBsYWJlbHMuZWNvcmUjLy9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbC9tYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHkiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBsYWJlbHMuZWNvcmUjLy9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbC9jYXBhY2l0eSIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBsYWJlbHMuZWNvcmUjLy9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbC9tYXhpbXVtQ2FwYWNpdHkiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbGFiZWxzLmVjb3JlIy8vVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwvdHJhbnNpdFRpbWUiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbGFiZWxzLmVjb3JlIy8vVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwvc3RhcnRVcERlbGF5Ii8+DQorICAgIDwvZ2VuQ2xhc3Nlcz4NCisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJsYWJlbHMuZWNvcmUjLy9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIj4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbGFiZWxzLmVjb3JlIy8vVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZS9hdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb24iLz4NCisgICAgPC9nZW5DbGFzc2VzPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImxhYmVscy5lY29yZSMvL1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSIvPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImxhYmVscy5lY29yZSMvL1JvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCIvPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImxhYmVscy5lY29yZSMvL1JvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIj4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbGFiZWxzLmVjb3JlIy8vUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUvcm9hZE5hbWUiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbGFiZWxzLmVjb3JlIy8vUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUvcm9hZENsYXNzIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGxhYmVscy5lY29yZSMvL1JvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlL251bWJlckNyb3NzaW5ncyIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICA8L2dlblBhY2thZ2VzPg0KKyAgPGdlblBhY2thZ2VzIHByZWZpeD0iTm9kZXMiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIg0KKyAgICAgIGdlbmVyYXRlRXhhbXBsZUNsYXNzPSJmYWxzZSIgbXVsdGlwbGVFZGl0b3JQYWdlcz0iZmFsc2UiIGdlbmVyYXRlTW9kZWxXaXphcmQ9ImZhbHNlIg0KKyAgICAgIGNvbnRlbnRUeXBlSWRlbnRpZmllcj0iIiBlY29yZVBhY2thZ2U9Im5vZGVzLmVjb3JlIy8iPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im5vZGVzLmVjb3JlIy8vR2VvZ3JhcGhpY0ZlYXR1cmUiLz4NCisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJub2Rlcy5lY29yZSMvL1JlZ2lvbiIvPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im5vZGVzLmVjb3JlIy8vTm9kZSIvPg0KKyAgPC9nZW5QYWNrYWdlcz4NCisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlR5cGVzIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucyIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSINCisgICAgICBlY29yZVBhY2thZ2U9InR5cGVzLmVjb3JlIy8iPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InR5cGVzLmVjb3JlIy8vQ2F0ZWdvcml6ZWRUeXBlIi8+DQorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idHlwZXMuZWNvcmUjLy9SYXRlIj4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdHlwZXMuZWNvcmUjLy9SYXRlL3JhdGUiLz4NCisgICAgPC9nZW5DbGFzc2VzPg0KKyAgPC9nZW5QYWNrYWdlcz4NCis8L2dlbm1vZGVsOkdlbk1vZGVsPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvbW9kZWwvZWRnZXMuZWNvcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL21vZGVsL2VkZ2VzLmVjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNDAzNGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL21vZGVsL2VkZ2VzLmVjb3JlCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImVkZ2VzIgorICAgIG5zVVJJPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMuZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzIj4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaWdyYXRpb25FZGdlIiBlU3VwZXJUeXBlcz0iIy8vUG9wdWxhdGlvbkVkZ2UiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaWdyYXRpb25FZGdlTGFiZWwiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUjLy9FZGdlTGFiZWwiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9ncmFwaC5lY29yZSMvL0xhYmVsVmFsdWUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaWdyYXRpb25SYXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIwLjAiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWl4aW5nRWRnZSIgZVN1cGVyVHlwZXM9IiMvL1BvcHVsYXRpb25FZGdlIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWl4aW5nRWRnZUxhYmVsIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2dyYXBoLmVjb3JlIy8vRWRnZUxhYmVsIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWl4aW5nRWRnZUxhYmVsVmFsdWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUjLy9MYWJlbFZhbHVlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWl4aW5nUmF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3B1bGF0aW9uRWRnZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9ncmFwaC5lY29yZSMvL0VkZ2UiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3B1bGF0aW9uSWRlbnRpZmllciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Imh1bWFuIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvbW9kZWwvbGFiZWxzLmVjb3JlIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9tb2RlbC9sYWJlbHMuZWNvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwZDdlZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvbW9kZWwvbGFiZWxzLmVjb3JlCkBAIC0wLDAgKzEsMTExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJsYWJlbHMiCisgICAgbnNVUkk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMuZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscyI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJlYUxhYmVsIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2dyYXBoLmVjb3JlIy8vU3RhdGljTm9kZUxhYmVsIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY3VycmVudEFyZWFWYWx1ZSIgZVR5cGU9IiMvL0FyZWFMYWJlbFZhbHVlIgorICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFyZWFMYWJlbFZhbHVlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2dyYXBoLmVjb3JlIy8vTGFiZWxWYWx1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFyZWEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXZlcmFnZUV4dGVudCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCIgZVN1cGVyVHlwZXM9IiMvL1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIgorICAgICAgZVN1cGVyVHlwZXM9IiMvL1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvcmRlckxlbmd0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUjLy9TdGF0aWNFZGdlTGFiZWwiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3B1bGF0aW9uTGFiZWwiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUjLy9TdGF0aWNOb2RlTGFiZWwiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3B1bGF0aW9uSWRlbnRpZmllciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImN1cnJlbnRQb3B1bGF0aW9uVmFsdWUiCisgICAgICAgIGVUeXBlPSIjLy9Qb3B1bGF0aW9uTGFiZWxWYWx1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiCisgICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3B1bGF0ZWRBcmVhIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIwIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbGlkWWVhciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMjAwNiIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3B1bGF0aW9uTGFiZWxWYWx1ZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9ncmFwaC5lY29yZSMvL0xhYmVsVmFsdWUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3VudCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwiIGVTdXBlclR5cGVzPSIjLy9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY3VycmVudFJlbGF0aW9uc2hpcCIgZVR5cGU9IiMvL1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIgorICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIgorICAgICAgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9ncmFwaC5lY29yZSMvL0xhYmVsVmFsdWUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGphY2VudCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVsYXRpb25zaGlwIiBlVHlwZT0iIy8vUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcCIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9ncmFwaC5lY29yZSMvL0R5bmFtaWNFZGdlTGFiZWwiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0cmFuc3BvcnRNb2RlIiBlVHlwZT0iIy8vVHJhbnNwb3J0TW9kZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3B1bGF0aW9uSWRlbnRpZmllciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0cmFuc3BvcnRJZGVudGlmaWVyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImN1cnJlbnRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIgorICAgICAgICBlVHlwZT0iIy8vVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgorICAgICAgICB0cmFuc2llbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYXRlVGltZVBlcmlvZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUxvbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVwYXJ0dXJlQ2FwYWNpdHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1heGltdW1EZXBhcnR1cmVDYXBhY2l0eSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXBhY2l0eSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIKKyAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWF4aW11bUNhcGFjaXR5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRyYW5zaXRUaW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTG9uZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydFVwRGVsYXkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VMb25nIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUjLy9MYWJlbFZhbHVlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXZhaWxhYmxlRGVwYXJ0dXJlQ2FwYWNpdHlQcm9wb3J0aW9uIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIxLjAiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2dyYXBoLmVjb3JlIy8vTGFiZWxWYWx1ZSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCIgZVN1cGVyVHlwZXM9IiMvL1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSIKKyAgICAgIGVTdXBlclR5cGVzPSIjLy9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2FkTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0icm9hZCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2FkQ2xhc3MiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InJvdXRlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im51bWJlckNyb3NzaW5ncyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAiPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iVW5zcGVjaWZpZWQiLz4KKyAgICA8ZUxpdGVyYWxzIG5hbWU9IkFib3ZlIiB2YWx1ZT0iMiIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iQmVsb3ciIHZhbHVlPSI0Ii8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJSaWdodE9mIiB2YWx1ZT0iNiIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iTGVmdE9mIiB2YWx1ZT0iOCIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iTm9ydGhPZiIgdmFsdWU9IjEwIi8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJTb3V0aE9mIiB2YWx1ZT0iMTIiLz4KKyAgICA8ZUxpdGVyYWxzIG5hbWU9Ildlc3RPZiIgdmFsdWU9IjE0Ii8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJFYXN0T2YiIHZhbHVlPSIxNiIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ29udGFpbnMiIHZhbHVlPSIxOCIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ29udGFpbmVkQnkiIHZhbHVlPSIyMCIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iT3ZlcmxhcHMiIHZhbHVlPSIyMiIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iT3JiaXRzIiB2YWx1ZT0iMjQiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJUcmFuc3BvcnRNb2RlIj4KKyAgICA8ZUxpdGVyYWxzIG5hbWU9InVuc3BlY2lmaWVkIi8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJhaXIiIHZhbHVlPSIyIi8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJyb2FkIiB2YWx1ZT0iNCIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0icmFpbCIgdmFsdWU9IjYiLz4KKyAgICA8ZUxpdGVyYWxzIG5hbWU9Im1hcmluZSIgdmFsdWU9IjgiLz4KKyAgICA8ZUxpdGVyYWxzIG5hbWU9ImZvb3QiIHZhbHVlPSIxMCIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFYXJ0aFNjaWVuY2VMYWJlbCIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9ncmFwaC5lY29yZSMvL1N0YXRpY05vZGVMYWJlbCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImN1cnJlbnRFYXJ0aFNjaWVuY2VWYWx1ZSIKKyAgICAgICAgZVR5cGU9IiMvL0VhcnRoU2NpZW5jZUxhYmVsVmFsdWUiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIgorICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWFydGhTY2llbmNlTGFiZWxWYWx1ZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9ncmFwaC5lY29yZSMvL0xhYmVsVmFsdWUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXRhIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VEb3VibGUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF0YVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuaXRzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKzwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL21vZGVsL25vZGVzLmVjb3JlIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9tb2RlbC9ub2Rlcy5lY29yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTg4ZTA4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9tb2RlbC9ub2Rlcy5lY29yZQpAQCAtMCwwICsxLDEwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIg0KKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQorICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJub2RlcyINCisgICAgbnNVUkk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMiPg0KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHZW9ncmFwaGljRmVhdHVyZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUjLy9Ob2RlIi8+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlZ2lvbiIgZVN1cGVyVHlwZXM9IiMvL0dlb2dyYXBoaWNGZWF0dXJlIi8+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5vZGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZSINCisgICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+DQorPC9lY29yZTpFUGFja2FnZT4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL21vZGVsL3R5cGVzLmVjb3JlIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9tb2RlbC90eXBlcy5lY29yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2Q0NjFjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9tb2RlbC90eXBlcy5lY29yZQpAQCAtMCwwICsxLDEwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIg0KKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQorICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ0eXBlcyINCisgICAgbnNVUkk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMiPg0KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYXRlZ29yaXplZFR5cGUiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiLz4NCisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmF0ZSIgYWJzdHJhY3Q9InRydWUiPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIvPg0KKyAgPC9lQ2xhc3NpZmllcnM+DQorPC9lY29yZTpFUGFja2FnZT4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL25vdGljZS5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9ub3RpY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFmOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9ub3RpY2UuaHRtbApAQCAtMCwwICsxLDc5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Cis8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPk1hcmNoIDE3LCAyMDA1PC9wPgorCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisKKzxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKyAgIAorPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAorICAgCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKKyAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorICAgCis8dWw+CisJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKzwvdWw+ICAgCisgCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKworPHVsPgorCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKwkJCis8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCitpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KK3RoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KKwk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCisJPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKwk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCis8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKworPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKyAgIAorPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTYyODU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9wbHVnaW4ucHJvcGVydGllcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyY2JhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvcGx1Z2luLnhtbApAQCAtMCwwICsxLDEwMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPCEtLQorIDxjb3B5cmlnaHQ+CisgPC9jb3B5cmlnaHQ+CisKKyAkSWQkCistLT4KKworPHBsdWdpbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQuaXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcmllcyI+CisgICAgICA8ZmFjdG9yeQorICAgICAgICAgICAgdXJpPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMuZWNvcmUiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcm92aWRlci5FZGdlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgorICAgICAgICAgICAgc3VwcG9ydGVkVHlwZXM9CisgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcgorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIKKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcgorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSIvPgorICAgPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Lml0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3JpZXMiPgorICAgICAgPGZhY3RvcnkKKyAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy5lY29yZSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlci5MYWJlbHNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKKyAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzPQorICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIKKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcgorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIKKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UiLz4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5pdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yaWVzIj4KKyAgICAgIDxmYWN0b3J5CisgICAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy5lY29yZSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLnByb3ZpZGVyLk5vZGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCisgICAgICAgICAgICBzdXBwb3J0ZWRUeXBlcz0KKyAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIKKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcgorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyCisgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlIi8+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KKyAgICAgIDxwYWNrYWdlCisgICAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy5lY29yZSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLkVkZ2VzUGFja2FnZSIKKyAgICAgICAgICAgIGdlbk1vZGVsPSJtb2RlbC9kZWZpbml0aW9ucy5nZW5tb2RlbCIvPgorICAgPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+CisgICAgICA8cGFja2FnZQorICAgICAgICAgICAgdXJpPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzLmVjb3JlIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc1BhY2thZ2UiCisgICAgICAgICAgICBnZW5Nb2RlbD0ibW9kZWwvZGVmaW5pdGlvbnMuZ2VubW9kZWwiLz4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgorICAgICAgPHBhY2thZ2UKKyAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzLmVjb3JlIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuTm9kZXNQYWNrYWdlIgorICAgICAgICAgICAgZ2VuTW9kZWw9Im1vZGVsL2RlZmluaXRpb25zLmdlbm1vZGVsIi8+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+CisgICAgICA8ZWRpdG9yCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcmVzZW50YXRpb24uRWRnZXNFZGl0b3JJRCIKKyAgICAgICAgICAgIG5hbWU9IiVfVUlfRWRnZXNFZGl0b3JfbGFiZWwiCisgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L0VkZ2VzTW9kZWxGaWxlLmdpZiIKKyAgICAgICAgICAgIGV4dGVuc2lvbnM9ImVkZ2VzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJlc2VudGF0aW9uLkVkZ2VzRWRpdG9yIgorICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcmVzZW50YXRpb24uRWRnZXNBY3Rpb25CYXJDb250cmlidXRvciI+CisgICAgICA8L2VkaXRvcj4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KKyAgICAgIDxlZGl0b3IKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcmVzZW50YXRpb24uTGFiZWxzRWRpdG9ySUQiCisgICAgICAgICAgICBuYW1lPSIlX1VJX0xhYmVsc0VkaXRvcl9sYWJlbCIKKyAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTGFiZWxzTW9kZWxGaWxlLmdpZiIKKyAgICAgICAgICAgIGV4dGVuc2lvbnM9ImxhYmVscyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcmVzZW50YXRpb24uTGFiZWxzRWRpdG9yIgorICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMucHJlc2VudGF0aW9uLkxhYmVsc0FjdGlvbkJhckNvbnRyaWJ1dG9yIj4KKyAgICAgIDwvZWRpdG9yPgorICAgPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgorICAgICAgPGVkaXRvcgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMucHJlc2VudGF0aW9uLk5vZGVzRWRpdG9ySUQiCisgICAgICAgICAgICBuYW1lPSIlX1VJX05vZGVzRWRpdG9yX2xhYmVsIgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9Ob2Rlc01vZGVsRmlsZS5naWYiCisgICAgICAgICAgICBleHRlbnNpb25zPSJub2RlcyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLnByZXNlbnRhdGlvbi5Ob2Rlc0VkaXRvciIKKyAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMucHJlc2VudGF0aW9uLk5vZGVzQWN0aW9uQmFyQ29udHJpYnV0b3IiPgorICAgICAgPC9lZGl0b3I+CisgICA8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL0FjdGl2YXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWQ1MmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9BY3RpdmF0b3IuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CisKKy8qKgorICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKKworCS8qKgorCSAqIFRoZSBwbHVnLWluIElECisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gQ29uc3RhbnRzLklEX1JPT1QgKyAiLmRlZmluaXRpb25zIjsKKworCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKKwlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOworCisJLyoqCisJICogVGhlIGNvbnN0cnVjdG9yCisJICovCisJcHVibGljIEFjdGl2YXRvcigpIHsKKwkJcGx1Z2luID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gY29udGV4dAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc3RhcnQoY29udGV4dCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlwbHVnaW4gPSBudWxsOworCQlzdXBlci5zdG9wKGNvbnRleHQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQorCSAqIAorCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogTG9nIGFuIGVycm9yIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgdGV4dAorCSAqIEBwYXJhbSBleGNlcHRpb24KKwkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQlwbHVnaW4uZ2V0TG9nKCkubG9nKAorCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAorCQkJCQkJMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7CisJfSAvLyBsb2dFcnJvcgorCisJLyoqCisJICogTG9nIGluZm9ybWF0aW9uIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIGluZm9ybWF0aW9uIG1lc3NhZ2UgdGV4dAorCSAqIEBwYXJhbSBleGNlcHRpb24KKwkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dJbmZvcm1hdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQkvLyBEbyB3ZSBoYXZlIGEgcGx1Z2luPworCQlpZiAocGx1Z2luICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJcGx1Z2luLmdldExvZygpLmxvZygKKwkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKKwkJCQkJCQkwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKKwkJfQorCQllbHNlIHsKKwkJCS8vIE5vCisJCQlTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7CisJCQkvLyBFeGNlcHRpb24/CisJCQlpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7CisJCQl9IC8vIGlmIAorCQl9CisJfSAvLyBsb2dJbmZvcm1hdGlvbgorCQorCQorCS8qKgorCSAqIExvZyBpbmZvcm1hdGlvbiB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4KKwkgKiBUaGUgbWV0aG9kIGlzIG92ZXJsb2FkZWQgdG8gYWxsb3cgZm9yIGxvZ0luZm9ybWF0aW9uIHdpdGhvdXQgYW4gZXJyb3IgCisJICogbWV0aG9kIHNldHMgdGhlIGVycm9yIHRvIG51bGwuIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBTeXN0ZW0ub3V0LnByaW50bG4KKwkgKiB0aHJvdWdob3V0IHRoZSBjb2RlLgorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIGluZm9ybWF0aW9uIG1lc3NhZ2UgdGV4dAorCSAqCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0luZm9ybWF0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJCS8vIERvIHdlIGhhdmUgYSBwbHVnaW4/CisJCWlmIChwbHVnaW4gIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlwbHVnaW4uZ2V0TG9nKCkubG9nKAorCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAorCQkJCQkJCTAsIG1lc3NhZ2UsIG51bGwpKTsKKwkJfQorCQllbHNlIHsKKwkJCS8vIE5vCisJCQlTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7CisJCX0KKwl9IC8vIGxvZ0luZm9ybWF0aW9uCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL0xvY2F0aW9uVXRpbGl0eS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9Mb2NhdGlvblV0aWxpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjcxNGMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9Mb2NhdGlvblV0aWxpdHkuamF2YQpAQCAtMCwwICsxLDI3MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5VdGlsaXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKKworCisvKioKKyAqIFV0aWxpdHkgdG8gZXh0cmFjdCBub2RlIGtleXMgZnJvbSBhIHByb2plY3QKKyAqLworcHVibGljIGNsYXNzIExvY2F0aW9uVXRpbGl0eSB7CisKKwlzdGF0aWMgTWFwPFN0cmluZywgU2V0PFN0cmluZz4+IFtdIHRyZWVJU09LZXlNYXBzID0gbmV3IE1hcFs0XTsKKwlzdGF0aWMgTWFwPFN0cmluZywgVVJJPiBpc29LZXlVUklNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFVSST4oKTsKKwlzdGF0aWMgTGlzdDxNb2RlbD4gcHJvY2Vzc2VkTW9kZWxzID0gbmV3IEFycmF5TGlzdDxNb2RlbD4oKTsKKwkKKwlzdGF0aWMgYm9vbGVhbiBsb2FkZWQgPSBmYWxzZTsKKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXQoKSB7dHJlZUlTT0tleU1hcHMgPSBuZXcgTWFwWzRdO2lzb0tleVVSSU1hcC5jbGVhcigpO3Byb2Nlc3NlZE1vZGVscy5jbGVhcigpO2xvYWRlZD1mYWxzZTt9CisKKwlwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IGdldEtleXMoSVByb2plY3QgcHJvamVjdCwgaW50IGxldmVsLCBTdHJpbmcgcGFyZW50KSB7CisJCQorCQlpZighbG9hZGVkKSB7CisJCQlmb3IoaW50IGk9MDtpPDQ7KytpKSB0cmVlSVNPS2V5TWFwc1tpXSA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2V0PFN0cmluZz4+KCk7CisJCQlJQ29udGFpbmVyIG1vZGVsRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoIm1vZGVscyIpOworCQkJCisJCQlJUmVzb3VyY2VbXSBtb2RlbHMgPSBudWxsOworCQkJdHJ5IHsKKwkJCQltb2RlbHMgPSBtb2RlbEZvbGRlci5tZW1iZXJzKCk7CisJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJCWlmIChtb2RlbHMgIT0gbnVsbCkgeworCQkJCWZvcihJUmVzb3VyY2Ugcjptb2RlbHMpIHsKKwkJCQkJLy8gaWdub3JlIHN5c3RlbSBmaWxlcworCQkJCQlpZihyLmdldE5hbWUoKS5zdGFydHNXaXRoKCIuIikpIGNvbnRpbnVlOworCQkJCQkKKwkJCQkJdHJ5IHsKKwkJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHIuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpKTsKKwkJCQkJCUlkZW50aWZpYWJsZSBpZCA9IFV0aWxpdHkuZ2V0SWRlbnRpZmlhYmxlKHVyaSk7CisJCQkJCQlpZihpZCBpbnN0YW5jZW9mIE1vZGVsKSBwcm9jZXNzTW9kZWwoKE1vZGVsKWlkKTsKKwkJCQkJCQkKKwkJCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgeworCQkJCQkJLy8gU2tpcCBiYWQgZmlsZQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkKKwkJCUlDb250YWluZXIgZ3JhcGhzRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoImdyYXBocyIpOworCQkJSVJlc291cmNlW10gZ3JhcGhzID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJZ3JhcGhzID0gZ3JhcGhzRm9sZGVyLm1lbWJlcnMoKTsKKwkJCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJaWYgKGdyYXBocyAhPSBudWxsKSB7CisJCQkJZm9yKElSZXNvdXJjZSByOmdyYXBocykgeworCQkJCQkvLyBpZ25vcmUgc3lzdGVtIGZpbGVzCisJCQkJCWlmKHIuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIi4iKSkgY29udGludWU7CisJCQkJCQorCQkJCQl0cnkgeworCQkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkoci5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCkpOworCQkJCQkJSWRlbnRpZmlhYmxlIGlkID0gVXRpbGl0eS5nZXRJZGVudGlmaWFibGUodXJpKTsKKwkJCQkJCWlmKGlkIGluc3RhbmNlb2YgR3JhcGgpIHByb2Nlc3NHcmFwaCgoR3JhcGgpaWQpOworCQkJCQkJCQorCQkJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkvLyBTa2lwIGJhZCBmaWxlCisJCQkJCX0KKwkJCQorCQkJCX0JCisJCQl9CisJCQlsb2FkZWQgPSB0cnVlOworCQl9CisJCQorCQlTZXQ8U3RyaW5nPnJlc3VsdCA9IG51bGw7CisJCQorCQlpZihwYXJlbnQgIT0gbnVsbCkgcmVzdWx0ID0gdHJlZUlTT0tleU1hcHNbbGV2ZWwtMV0uZ2V0KHBhcmVudCk7CisJCWVsc2UgcmVzdWx0ID0gdHJlZUlTT0tleU1hcHNbbGV2ZWxdLmtleVNldCgpOworCQlpZihyZXN1bHQhPSBudWxsKSAKKwkJCXJldHVybiByZXN1bHQ7CisJCXJldHVybiBuZXcgSGFzaFNldDxTdHJpbmc+KCk7IC8vIHJldHVybiBlbXB0eSBhcnJheQorCX0KKwkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NNb2RlbChNb2RlbCBtKSB7CisJCXByb2Nlc3NlZE1vZGVscy5hZGQobSk7CisJCS8vIEZpcnN0IGdldCBzdWIgbW9kZWxzCisJCWZvcihNb2RlbCBtMjptLmdldE1vZGVscygpKSAKKwkJCWlmKCFwcm9jZXNzZWRNb2RlbHMuY29udGFpbnMobTIpKSBwcm9jZXNzTW9kZWwobTIpOworCQorCQkvLyBUbyB0aGUgZ3JhcGhzIGluIHRoZSBtb2RlbAorCQlFTGlzdDxHcmFwaD5ncmFwaHMgPSBtLmdldEdyYXBocygpOworCQlmb3IoR3JhcGggZzpncmFwaHMpIAorCQkJcHJvY2Vzc0dyYXBoKGcpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NHcmFwaChHcmFwaCBnKSB7CisJCS8vIERvIHRoZSBlZGdlcyBmaXJzdCB0byBnZXQgdGhlIGhpZXJhcmNoeQorCQkKKwkJZm9yKEVkZ2UgZTpnLmdldEVkZ2VzKCkudmFsdWVzKCkpIHsKKwkJCWlmKGUuZ2V0TGFiZWwoKS5nZXRDdXJyZW50VmFsdWUoKSBpbnN0YW5jZW9mIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKSB7CisJCQkJCisJCQkJaW50IHNvdXJjZUxldmVsID0gVXRpbGl0eS5rZXlMZXZlbChlLmdldE5vZGVBVVJJKCkubGFzdFNlZ21lbnQoKSk7CisJCQkJaW50IHRhcmdldExldmVsID0gVXRpbGl0eS5rZXlMZXZlbChlLmdldE5vZGVCVVJJKCkubGFzdFNlZ21lbnQoKSk7CisJCQkJU3RyaW5nIHNvdXJjZUtleSA9IGUuZ2V0Tm9kZUFVUkkoKS5sYXN0U2VnbWVudCgpOworCQkJCVN0cmluZyB0YXJnZXRLZXkgPSBlLmdldE5vZGVCVVJJKCkubGFzdFNlZ21lbnQoKTsKKwkJCQkKKwkJCQlpZih0cmVlSVNPS2V5TWFwc1tzb3VyY2VMZXZlbF0uY29udGFpbnNLZXkoc291cmNlS2V5KSkKKwkJCQkJdHJlZUlTT0tleU1hcHNbc291cmNlTGV2ZWxdLmdldChzb3VyY2VLZXkpLmFkZCh0YXJnZXRLZXkpOworCQkJCWVsc2UgeworCQkJCQlTb3J0ZWRTZXQ8U3RyaW5nPm5sID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworCQkJCQl0cmVlSVNPS2V5TWFwc1tzb3VyY2VMZXZlbF0ucHV0KHNvdXJjZUtleSwgbmwpOworCQkJCQlubC5hZGQodGFyZ2V0S2V5KTsKKwkJCQl9CisgCQkJCQkKKwkJCQlpZighdHJlZUlTT0tleU1hcHNbdGFyZ2V0TGV2ZWxdLmNvbnRhaW5zS2V5KHRhcmdldEtleSkpIHsKKwkJCQkJLy8gQWRkIHdpdGggZW1wdHkgY2hpbGQgc2V0CisJCQkJCVRyZWVTZXQ8U3RyaW5nPm5sID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworCQkJCQl0cmVlSVNPS2V5TWFwc1t0YXJnZXRMZXZlbF0ucHV0KHRhcmdldEtleSwgbmwpOworCQkJCX0KKwkJCQkKKwkJCQlpc29LZXlVUklNYXAucHV0KHNvdXJjZUtleSwgZS5nZXROb2RlQVVSSSgpKTsKKwkJCQlpc29LZXlVUklNYXAucHV0KHRhcmdldEtleSwgZS5nZXROb2RlQlVSSSgpKTsKKwkJCQkJCisJCQl9CisJCX0KKwkJCisJCS8vIE5vdyBmaW5kIGRhbmdsaW5nIG5vZGVzCisJCUVNYXA8VVJJLCBOb2RlPiBtYXAgPSBnLmdldE5vZGVzKCk7CisJCWZvcihVUkkgdTptYXAua2V5U2V0KCkpIHsKKwkJCWludCBsID0gVXRpbGl0eS5rZXlMZXZlbCh1Lmxhc3RTZWdtZW50KCkpOworCQkJaWYobCA9PSAtMSkgY29udGludWU7IC8vIG5vIHdvcmxkCisJCQlTdHJpbmcga2V5ID0gdS5sYXN0U2VnbWVudCgpOworCQkJaWYoIXRyZWVJU09LZXlNYXBzW2xdLmNvbnRhaW5zS2V5KGtleSkpIHsKKwkJCQlUcmVlU2V0PFN0cmluZz5ubCA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKKwkJCQl0cmVlSVNPS2V5TWFwc1tsXS5wdXQoa2V5LCBubCk7CisJCQkJaXNvS2V5VVJJTWFwLnB1dChrZXksIHUpOworCQkJfQkJCQorCQl9CisJfQorCQorCQorCS8qKgorCSAqIFBsYWNlIHRoZSBlZGdlcyBmcm9tIHRoZSBncmFwaCBpbiBhIE1hcCBrZXllZCBieSB0aGUgVVJJIG9mIHRoZSBlZGdlLgorCSAqIFRoaXMgYXZvaWRzIGR1cGxpY2F0ZXMgaW4gY2FzZSBzYW1lIGdyYXBoIGV4aXN0cyBpbiBtdWx0aXBsZSBtb2RlbHMgCisJICogQHBhcmFtIHByb2plY3QKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIHN0YXRpYyBTZXQ8RWRnZT4gZ2V0Q29tbW9uQm9yZGVyRWRnZXMoSVByb2plY3QgcHJvamVjdCwgVVJJIGxvY2F0aW9uKSB7CisJICAgIE1hcDxTdHJpbmcsRWRnZT4gY2JFZGdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxFZGdlPigpOworCQorCQlJQ29udGFpbmVyIG1vZGVsRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoIm1vZGVscyIpOwkKKwkJSVJlc291cmNlW10gbW9kZWxzID0gbnVsbDsKKwkJdHJ5IHsKKwkJCW1vZGVscyA9IG1vZGVsRm9sZGVyLm1lbWJlcnMoKTsKKwkJfSBjYXRjaChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQlpZiAobW9kZWxzICE9IG51bGwpIHsKKwkJCWZvcihJUmVzb3VyY2Ugcjptb2RlbHMpIHsKKwkJCQkvLyBpZ25vcmUgc3lzdGVtIGZpbGVzCisJCQkJaWYoci5nZXROYW1lKCkuc3RhcnRzV2l0aCgiLiIpKSBjb250aW51ZTsKKwkJCQkKKwkJCQl0cnkgeworCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShyLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKSk7CisJCQkJCUlkZW50aWZpYWJsZSBpZCA9IFV0aWxpdHkuZ2V0SWRlbnRpZmlhYmxlKHVyaSk7CisJCQkJCUdyYXBoIGcgPSAoKE1vZGVsKWlkKS5nZXRDYW5vbmljYWxHcmFwaChTVEVNVVJJLmNyZWF0ZVVSSSgiIiksIG51bGwsIG51bGwpOworCQkJCQlpZihpZCBpbnN0YW5jZW9mIE1vZGVsKSBjYkVkZ2VzLnB1dEFsbChnZXRHcmFwaENvbW1vbkJvcmRlckVkZ2VzKGcsIGxvY2F0aW9uKSk7CisJCQkJCQkKKwkJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIFNraXAgYmFkIGZpbGUKKwkJCQl9CisJCQl9CisJCX0KKwkKKwkJLy8gT25seSBkbyB0aGUgZWRnZXMgaW4gdGhlIGdyYXBocyBmb2xkZXIgaWYgdGhlIHVzZXIgaGFzbid0IHNwZWNpZmllZCBhCisJCS8vIGxvY2F0aW9uLCBzaW5jZSB3ZSBuZWVkIHRvIHJlc29sdmUgdGhlIFVSSSdzIHRvIHN1cHBvcnQgbG9jYXRpb25zCisJCWlmKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24udG9TdHJpbmcoKS50cmltKCkuZXF1YWxzKCIiKSkgeworCQkJSUNvbnRhaW5lciBncmFwaHNGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcigiZ3JhcGhzIik7CisJCQlJUmVzb3VyY2VbXSBncmFwaHMgPSBudWxsOworCQkJdHJ5IHsKKwkJCQlncmFwaHMgPSBncmFwaHNGb2xkZXIubWVtYmVycygpOworCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCQlpZiAoZ3JhcGhzICE9IG51bGwpIHsKKwkJCQlmb3IoSVJlc291cmNlIHI6Z3JhcGhzKSB7CisJCQkJCS8vIGlnbm9yZSBzeXN0ZW0gZmlsZXMKKwkJCQkJaWYoci5nZXROYW1lKCkuc3RhcnRzV2l0aCgiLiIpKSBjb250aW51ZTsKKwkJCQkJCisJCQkJCXRyeSB7CisJCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShyLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKSk7CisJCQkJCQlJZGVudGlmaWFibGUgaWQgPSBVdGlsaXR5LmdldElkZW50aWZpYWJsZSh1cmkpOworCQkJCQkJaWYoaWQgaW5zdGFuY2VvZiBHcmFwaCkgY2JFZGdlcy5wdXRBbGwoZ2V0R3JhcGhDb21tb25Cb3JkZXJFZGdlcygoR3JhcGgpaWQsIGxvY2F0aW9uKSk7CisJCQkJCQkJCisJCQkJCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKwkJCQkJCS8vIFNraXAgYmFkIGZpbGUKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlTZXQ8RWRnZT4gcmV0VmFsID0gbmV3IEhhc2hTZXQ8RWRnZT4oKTsKKwkJcmV0VmFsLmFkZEFsbChjYkVkZ2VzLnZhbHVlcygpKTsKKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJLyoqKgorCSAqIFBsYWNlIHRoZSBlZGdlcyBmcm9tIHRoZSBncmFwaCBpbiBhIE1hcCBrZXllZCBieSB0aGUgVVJJIG9mIHRoZSBlZGdlLgorCSAqIFRoaXMgYXZvaWRzIGR1cGxpY2F0ZXMgaW4gY2FzZSBzYW1lIGdyYXBoIGV4aXN0cyBpbiBtdWx0aXBsZSBtb2RlbHMKKwkgKiBAcGFyYW0gZworCSAqLworCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsRWRnZT4gZ2V0R3JhcGhDb21tb25Cb3JkZXJFZGdlcyhHcmFwaCBnLCBVUkkgbG9jYXRpb24pIHsKKwkJCisJCU1hcDxTdHJpbmcsRWRnZT4gY2JFZGdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxFZGdlPigpOworCQlmb3IoRWRnZSBlOmcuZ2V0RWRnZXMoKS52YWx1ZXMoKSkgeworCQkJaWYoZS5nZXRMYWJlbCgpLmdldEN1cnJlbnRWYWx1ZSgpIGluc3RhbmNlb2YgQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSkgeworCQkJCVN0cmluZyB1cmlLZXkgPSBlLmdldFVSSSgpLmxhc3RTZWdtZW50KCk7CisJCQkJaWYobG9jYXRpb24gIT0gbnVsbCAmJiAhbG9jYXRpb24udG9TdHJpbmcoKS50cmltKCkuZXF1YWxzKCIiKSAgCisJCQkJCQkmJiBpc1NlbGZPckNoaWxkKGUuZ2V0QSgpLCBsb2NhdGlvbi5sYXN0U2VnbWVudCgpKSAmJiBpc1NlbGZPckNoaWxkKGUuZ2V0QigpLCBsb2NhdGlvbi5sYXN0U2VnbWVudCgpKSkKKwkJCQkJY2JFZGdlcy5wdXQodXJpS2V5LGUpOworCQkJCWVsc2UgaWYobG9jYXRpb24gPT0gbnVsbCB8fCBsb2NhdGlvbi50b1N0cmluZygpLnRyaW0oKS5lcXVhbHMoIiIpKQorCQkJCQljYkVkZ2VzLnB1dCh1cmlLZXksZSk7CisJCQl9CQorCQl9CisJCXJldHVybiBjYkVkZ2VzOworCX0vL2dldEdyYXBoQ29tbW9uQm9yZGVyRWRnZXMKKwkKKwlwdWJsaWMgc3RhdGljIFVSSSBnZXRVUklGcm9tSVNPS2V5KFN0cmluZyBrZXkpIHsKKwkJcmV0dXJuIGlzb0tleVVSSU1hcC5nZXQoa2V5KTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzU2VsZk9yQ2hpbGQoTm9kZSAgbiwgU3RyaW5nIHBhcmVudCkgeworCQlpZihuLmdldFVSSSgpLmxhc3RTZWdtZW50KCkuZXF1YWxzKHBhcmVudCkpIHJldHVybiB0cnVlOworCQlyZXR1cm4gaGFzUGFyZW50KG4sIHBhcmVudCk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNQYXJlbnQoTm9kZSBuLCBTdHJpbmcga2V5KSB7CisJCWZvcihFZGdlIGU6bi5nZXRFZGdlcygpKSB7CisJCQkvLyBNYWtlIHN1cmUgaXQncyBhIHBoeXNpY2FsIGNvbnRhaW5tZW50IGVkZ2UKKwkJCWJvb2xlYW4gcGh5cyA9IGUuZ2V0TGFiZWwoKSBpbnN0YW5jZW9mIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbDsKKwkJCWlmKCFwaHlzKSAKKwkJCQljb250aW51ZTsKKwkJCWlmKGUuZ2V0QSgpLmdldFVSSSgpLmxhc3RTZWdtZW50KCkuZXF1YWxzKGtleSkpIHJldHVybiB0cnVlOworCQkJZWxzZSBpZihVdGlsaXR5LmtleUxldmVsKGUuZ2V0QSgpLmdldFVSSSgpLmxhc3RTZWdtZW50KCkpIDwgVXRpbGl0eS5rZXlMZXZlbChuLmdldFVSSSgpLmxhc3RTZWdtZW50KCkpKQorCQkJCXJldHVybiBoYXNQYXJlbnQoZS5nZXRBKCksIGtleSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvcG9wdWxhdGlvbi9Qb3B1bGF0aW9uRW51bWVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9wb3B1bGF0aW9uL1BvcHVsYXRpb25FbnVtZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1MmNmOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvcG9wdWxhdGlvbi9Qb3B1bGF0aW9uRW51bWVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnBvcHVsYXRpb247CisKK3B1YmxpYyBpbnRlcmZhY2UgUG9wdWxhdGlvbkVudW1lcmF0b3IgeworCXB1YmxpYyBTdHJpbmcgW10gZ2V0UG9wdWxhdGlvbklkZW50aWZpZXJzKCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3BvcHVsYXRpb24vUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3BvcHVsYXRpb24vUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlMzE1NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvcG9wdWxhdGlvbi9Qb3B1bGF0aW9uRW51bWVyYXRvckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucG9wdWxhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7CisKKy8qKgorICogVGhlIGFkYXB0ZXIgaXMgaW1wbGVtZW50ZWQgYnkgYW55IGNsYXNzIHRoYXQgbmVlZHMgdG8gZW51bWVyYXRlIG11bHRpcGxlIHBvcHVsYXRpb24gaWRlbnRpZmllcnMsCisgKiBzdWNoIGFzIG11bHRpcG9wdWxhdGlvbiBkaXNlYXNlIG1vZGVscyBhbmQgZGVtb2dyYXBoaWMgcG9wdWxhdGlvbiBtb2RlbHMKKyAqIEBhdXRob3IgZWRsdW5kCisgKgorICovCitwdWJsaWMgY2xhc3MgUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBQb3B1bGF0aW9uRW51bWVyYXRvciB7CisKKwlwdWJsaWMgU3RyaW5nW10gZ2V0UG9wdWxhdGlvbklkZW50aWZpZXJzKCkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9wb3B1bGF0aW9uL1BvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvcG9wdWxhdGlvbi9Qb3B1bGF0aW9uRW51bWVyYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiMDQ4OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvcG9wdWxhdGlvbi9Qb3B1bGF0aW9uRW51bWVyYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLy8gUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnBvcHVsYXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKKworLyoqCisgKiAKKyAqLworcHVibGljIGludGVyZmFjZSBQb3B1bGF0aW9uRW51bWVyYXRvckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKKwkJQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7CisKKworCVBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlckZhY3RvcnlJbXBsIElOU1RBTkNFID0gbmV3IFBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlckZhY3RvcnlJbXBsKCk7CisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMKKwkgKiB7QGxpbmsgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyfSdzCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBQb3B1bGF0aW9uRW51bWVyYXRvckFkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzCisJCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMKKwkJCVBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlckZhY3RvcnkgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJCXJldHVybiB0eXBlID09IFBvcHVsYXRpb25FbnVtZXJhdG9yLmNsYXNzOworCQl9IC8vIGlzRmFjdG9yeUZvclR5cGUKKwl9IC8vIFBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlckZhY3RvcnlJbXBsCisKK30gLy8gUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9yZWxhdGl2ZXZhbHVlL1JlbGF0aXZlVmFsdWVQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9yZWxhdGl2ZXZhbHVlL1JlbGF0aXZlVmFsdWVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZTg2MDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3JlbGF0aXZldmFsdWUvUmVsYXRpdmVWYWx1ZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLy8gUmVsYXRpdmVWYWx1ZVByb3ZpZGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCBoYXZlIHByb3BlcnRpZXMgYW5kIGNhbiBtYXAgdGhlCisgKiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgdG8gYSB2YWx1ZSBiZXR3ZWVuIDAuMCAoemVybykgYW5kIDEuMCAob25lKSwgaW5jbHVzaXZlLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlbGF0aXZlVmFsdWVQcm92aWRlciB7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwcm92aWRlcgorCSAqLworCUxpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnRpZXMoKTsKKworCS8qKgorCSAqIERldGVybWluZSB0aGUgcmVsYXRpdmUgKDAuMCB0byAxLjApIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBhcyBjb21wYXJlZCB0bworCSAqIHRoZSBvdGhlciBwcm9wZXJ0aWVzLgorCSAqIAorCSAqIEBwYXJhbSBwcm9wZXJ0eQorCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHdob3NlIHJlbGF0aXZlIHZhbHVlIGlzIHRvIGJlIGRldGVybWluZWQKKwkgKiBAcmV0dXJuIHJlbGF0aXZlICgwLjAtMS4wKSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYXMgY29tcGFyZWQgdG8gdGhlIG90aGVyCisJICogICAgICAgICBwcm9wZXJ0aWVzLgorCSAqLworCWRvdWJsZSBnZXRSZWxhdGl2ZVZhbHVlKGZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpOworCisJLyoqCisJICogRGV0ZXJtaW5lIHRoZSByZWxhdGl2ZSAoMC4wIHRvIDEuMCkgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGFzIGNvbXBhcmVkIHRvCisJICogdGhlIG90aGVyIHByb3BlcnRpZXMuCisJICogCisJICogQHBhcmFtIGZlYXR1cmUKKwkgKiAgICAgICAgICAgIGZlYXR1cmUgb2YgdGhlIHByb3BlcnR5IHdob3NlIHJlbGF0aXZlIHZhbHVlIGlzIHRvIGJlCisJICogICAgICAgICAgICBkZXRlcm1pbmVkCisJICogQHJldHVybiByZWxhdGl2ZSAoMC4wLTEuMCkgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGFzIGNvbXBhcmVkIHRvIHRoZSBvdGhlcgorCSAqICAgICAgICAgcHJvcGVydGllcy4KKwkgKi8KKwlkb3VibGUgZ2V0UmVsYXRpdmVWYWx1ZShmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSk7CisJCisJLyoqCisJICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZGVub21pbmF0b3Igb3Igc2NhbGUgdXNlZCB0byBjb252ZXJ0IHRvIHJlbGF0aXZlCisJICogdmFsdWVzIGluIHRoZSByYW5nZSAwLTEuIEZvciBleGFtcGxlLCBpbiBhbiBFcGlkZW1pYyBDb21wYXJ0bWVudCBtb2RlbAorCSAqIHRoZSBzdGF0ZSB2YWx1ZXMgYXJlIG5vcm1hbGl6ZWQgYnkgcG9wdWxhdGlvbi4KKwkgKiBJdCBpcyByZXF1aXJlZCB3aGVuZXZlciB3ZSBuZWVkIHRvIHN3aXRjaCBiZXR3ZWVuIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSB2YWx1ZXMKKwkgKiBvciBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBsYWJlbCBzaG93aW5nIHRoZSBtYXhpbXVtIHNjYWxlIGZvciBhbnkgcmVsYXRpdmUgdmFsdWUuCisJICogQHJldHVybiB0aGUgZGVub21pbmF0b3Igb3Igc2NhbGUgdXNlZCB0byBub3JtYWxpemUgdGhlIHJlbGF0aXZlIHZhbHVlCisJICovCisJZG91YmxlIGdldERlbm9taW5hdG9yKGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSA7Cit9Ly8gUmVsYXRpdmVWYWx1ZVByb3ZpZGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3JlbGF0aXZldmFsdWUvUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9yZWxhdGl2ZXZhbHVlL1JlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDI2YjkzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9yZWxhdGl2ZXZhbHVlL1JlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDY1IEBACisvLyBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGFkYXB0cyA8Y29kZT5FT2JqZWN0czwvY29kZT4ncyB0bworICogPGNvZGU+UmVsYXRpdmVWYWx1ZVByb3ZpZGVyPC9jb2RlPidzLgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsCisJCWltcGxlbWVudHMgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyIHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlciNnZXRQcm9wZXJ0aWVzKCkKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydGllcygpOworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyI2dldFJlbGF0aXZlVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcikKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFJlbGF0aXZlVmFsdWUoSXRlbVByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSkgeworCQlyZXR1cm4gZ2V0UmVsYXRpdmVWYWx1ZSgoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0eS5nZXRGZWF0dXJlKG51bGwpKTsKKwl9IC8vIGdldFJlbGF0aXZlVmFsdWUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlciNnZXRSZWxhdGl2ZVZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCisJICovCisJcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRSZWxhdGl2ZVZhbHVlKGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKTsKKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBkZW5vbWluYXRvciBvciBzY2FsZSB1c2VkIHRvIGNvbnZlcnQgdG8gcmVsYXRpdmUKKwkgKiB2YWx1ZXMgaW4gdGhlIHJhbmdlIDAtMS4gRm9yIGV4YW1wbGUsIGluIGFuIEVwaWRlbWljIENvbXBhcnRtZW50IG1vZGVsCisJICogdGhlIHN0YXRlIHZhbHVlcyBhcmUgbm9ybWFsaXplZCBieSBwb3B1bGF0aW9uLgorCSAqIEl0IGlzIHJlcXVpcmVkIHdoZW5ldmVyIHdlIG5lZWQgdG8gc3dpdGNoIGJldHdlZW4gcmVsYXRpdmUgYW5kIGFic29sdXRlIHZhbHVlcworCSAqIG9yIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGxhYmVsIHNob3dpbmcgdGhlIG1heGltdW0gc2NhbGUgZm9yIGFueSByZWxhdGl2ZSB2YWx1ZS4KKwkgKiBAcmV0dXJuIHRoZSBkZW5vbWluYXRvciBvciBzY2FsZSB1c2VkIHRvIG5vcm1hbGl6ZSB0aGUgcmVsYXRpdmUgdmFsdWUKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldERlbm9taW5hdG9yKGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSA7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gUmVsYXRpdmVWYWx1ZVByb3ZpZGVyLmNsYXNzOworCX0KKwkKK30gLy8gUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9yZWxhdGl2ZXZhbHVlL1JlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3JlbGF0aXZldmFsdWUvUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDljNjg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9yZWxhdGl2ZXZhbHVlL1JlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3MyBAQAorLy8gUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgY3JlYXRlIGFkYXB0ZXJzIHRoYXQgYWRhcHQKKyAqIHtAbGluayAgRU9iamVjdH1zIHRvIHtAbGluayBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJ9cy4KKyAqLworcHVibGljIGludGVyZmFjZSBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCUNvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcworCSAqIHtAbGluayBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJ9IGluc3RhbmNlcy4KKwkgKiA8cD4KKwkgKiBUaGlzIGluc3RhbmNlIGlzIGEge0BsaW5rIENvbXBvc2VkQWRhcHRlckZhY3Rvcnl9IHdoaWNoIG1lYW5zIHRoYXQgaXQKKwkgKiBjb2xsZWN0cyB0b2dldGhlciBvdGhlciB7QGxpbmsgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeX0gYWRhcHRlcgorCSAqIGZhY3Rvcmllcy4gRWFjaCBjbGFzcyB0aGF0IGltcGxlbWVudHMKKwkgKiB7QGxpbmsgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnl9IG5lZWRzIHRvIGFkZCBpdHNlbGYgdG8gdGhpcworCSAqIGluc3RhbmNlIHdpdGggYSBjYWxsIHRvCisJICoge0BsaW5rIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjYWRkQWRhcHRlckZhY3Rvcnkob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpfS4KKwkgKiBUaGlzIHdpbGwgdGhlbiBhbGxvdyBhZGFwdGVycyBjcmVhdGVkIGJ5IHRoYXQgZmFjdG9yeSB0byBiZSBmb3VuZCB3aGVuCisJICogYWRhcHRpbmcgY2xhc3MgaW5zdGFuY2VzIGhhbmRsZWQgYnkgdGhlIG5ldyBmYWN0b3J5LgorCSAqIDxwPgorCSAqIEJhc2ljYWxseSwgaWYgeW91IGNyZWF0ZSBhbiBFTUYgbW9kZWwgYW5kIGRlZmluZSBhCisJICoge0BsaW5rIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5fSBmb3IgaXQgc28gdGhhdCB0aGUgY2xhc3NlcyBpbgorCSAqIHRoYXQgbW9kZWwgY2FuIGJlIGFkYXB0ZWQsIHlvdSBuZWVkIHRvIGhvb2sgdGhhdCBmYWN0b3J5IGludG8gdGhpcyBvbmUgc28KKwkgKiB0aGF0IGxhdGVyIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFkYXB0IGEgY2xhc3MgZnJvbSB0aGF0IG1vZGVsIGlzCisJICogbWFkZSB0aGUgYXNzb2NpYXRlZCBmYWN0b3J5IHdpbGwgYmUgZm91bmQuIFlvdSBjYW4gZG8gdGhhdCBieSBhZGRpbmcgdGhlCisJICogbGluZTogPGNvZGU+CisJICogUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRkQWRhcHRlckZhY3RvcnkodGhpcyk7CisJICogPC9jb2RlPgorCSAqIHRvIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIG9mIHRoZSBuZXcgZmFjdG9yeSBhZnRlciB0aGUgc3VwZXIgY2FsbC4KKwkgKiBZb3UncmUgbm90IGRvbmUgaG93ZXZlciwgeW91IGFsc28gaGF2ZSB0byAiZm9yY2UiIGFuIGluc3RhbmNlIG9mIHRoZQorCSAqIGNsYXNzIHRvIGJlIGNyZWF0ZWQgc28gdGhhdCB0aGUgY29uc3RydWN0b3IgaXMgcnVuLiBUaGlzIGlzIHR5cGljYWxseQorCSAqIGFjaGlldmVkIGJ5IGFsbG9jYXRpbmcgYW4gaW5zdGFuY2UgaW4gdGhlIDxjb2RlPnN0YXJ0PC9jb2RlPiBtZXRob2Qgb2YKKwkgKiB0aGUgPGNvZGU+QWN0aXZhdG9yPC9jb2RlPiBvZiB0aGUgcGx1Zy1pbiB0aGF0IGRlZmluZXMgdGhlIGZhY3RvcnkuCisJICovCisJUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsIElOU1RBTkNFID0gbmV3IFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbCgpOworCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzCisJICoge0BsaW5rIFJlbGF0aXZlVmFsdWVQcm92aWRlcn0ncworCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsIGV4dGVuZHMKKwkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cworCQkJUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJCXJldHVybiB0eXBlID09IFJlbGF0aXZlVmFsdWVQcm92aWRlci5jbGFzczsKKwkJfSAvLyBpc0ZhY3RvcnlGb3JUeXBlCisJfSAvLyBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGwKKworfSAvLyBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9yZWxhdGl2ZXZhbHVlL2hpc3RvcnkvUmVsYXRpdmVWYWx1ZUhpc3RvcnlFeHRlbmRlZExpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3JlbGF0aXZldmFsdWUvaGlzdG9yeS9SZWxhdGl2ZVZhbHVlSGlzdG9yeUV4dGVuZGVkTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTJiNTZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9yZWxhdGl2ZXZhbHVlL2hpc3RvcnkvUmVsYXRpdmVWYWx1ZUhpc3RvcnlFeHRlbmRlZExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLy8gUmVsYXRpdmVWYWx1ZUhpc3RvcnlFeHRlbmRlZExpc3RlbmVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLmhpc3Rvcnk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCB3YW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gYQorICoge0BsaW5rIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJ9IGNhbiBwcm92aWRlIGFkZGl0aW9uYWwgaGlzdG9yeSB2YWx1ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVsYXRpdmVWYWx1ZUhpc3RvcnlFeHRlbmRlZExpc3RlbmVyIHsKKwl2b2lkIHJlbGF0aXZlVmFsdWVIaXN0b3J5RXh0ZW5kZWQoCisJCQlmaW5hbCBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlciByZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlcik7Cit9IC8vIFJlbGF0aXZlVmFsdWVIaXN0b3J5RXh0ZW5kZWRMaXN0ZW5lcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9yZWxhdGl2ZXZhbHVlL2hpc3RvcnkvUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9yZWxhdGl2ZXZhbHVlL2hpc3RvcnkvUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNWRmYmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3JlbGF0aXZldmFsdWUvaGlzdG9yeS9SZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8vIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXI7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IGhhdmUgcHJvcGVydGllcyBhbmQgY2FuIG1hcCB0aGUKKyAqIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0byBhIHZhbHVlIGJldHdlZW4gMC4wICh6ZXJvKSBhbmQgMS4wIChvbmUpLCBpbmNsdXNpdmUsCisgKiBhbmQgd2hpY2ggY2FuIHByb3ZpZGUgaGlzdG9yaWMgdmFsdWVzIGZvciB0aG9zZSBwcm9wZXJ0aWVzIGFzIGEgZnVuY3Rpb24gb2YKKyAqIHRpbWUuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlciBleHRlbmRzIFJlbGF0aXZlVmFsdWVQcm92aWRlciB7CisJLyoqCisJICogRGV0ZXJtaW5lIHRoZSByZWxhdGl2ZSAoMC4wIHRvIDEuMCkgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGFzIGNvbXBhcmVkIHRvCisJICogdGhlIG90aGVyIHByb3BlcnRpZXMgYXMgYSBmdW5jdGlvbiBvZiBUaW1lLgorCSAqIAorCSAqIEBwYXJhbSBwcm9wZXJ0eQorCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHdob3NlIHJlbGF0aXZlIHZhbHVlIGlzIHRvIGJlIGRldGVybWluZWQKKwkgKiBAcGFyYW0gdGltZQorCSAqICAgICAgICAgICAgdGhlIHRpbWUgdG8gdXNlIHdoZW4gZGV0ZXJtaW5pbmcgd2hpY2ggdmFsdWUgdG8gcmV0dXJuLgorCSAqIEByZXR1cm4gcmVsYXRpdmUgKDAuMC0xLjApIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBhcyBjb21wYXJlZCB0byB0aGUgb3RoZXIKKwkgKiAgICAgICAgIHByb3BlcnRpZXMgYW5kIHdob3NlIGFzc29jaWF0ZWQgdGltZSB2YWx1ZSBpcyBlaXRoZXIgZXF1YWwgdG8gb3IKKwkgKiAgICAgICAgIGFmdGVyL2xhdGVyIHRoYW4gdGhlIHBhcmFtZXRlciB0aW1lLgorCSAqLworCWRvdWJsZSBnZXRSZWxhdGl2ZVZhbHVlKGZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHksCisJCQlmaW5hbCBTVEVNVGltZSB0aW1lKTsKKworCS8qKgorCSAqIERldGVybWluZSB0aGUgcmVsYXRpdmUgKDAuMCB0byAxLjApIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBhcyBjb21wYXJlZCB0bworCSAqIHRoZSBvdGhlciBwcm9wZXJ0aWVzLgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlCisJICogICAgICAgICAgICBmZWF0dXJlIG9mIHRoZSBwcm9wZXJ0eSB3aG9zZSByZWxhdGl2ZSB2YWx1ZSBpcyB0byBiZQorCSAqICAgICAgICAgICAgZGV0ZXJtaW5lZAorCSAqIEBwYXJhbSB0aW1lCisJICogICAgICAgICAgICB0aGUgdGltZSB0byB1c2Ugd2hlbiBkZXRlcm1pbmluZyB3aGljaCB2YWx1ZSB0byByZXR1cm4uCisJICogQHJldHVybiByZWxhdGl2ZSAoMC4wLTEuMCkgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGFzIGNvbXBhcmVkIHRvIHRoZSBvdGhlcgorCSAqICAgICAgICAgcHJvcGVydGllcyBhbmQgd2hvc2UgYXNzb2NpYXRlZCB0aW1lIHZhbHVlIGlzIGVpdGhlciBlcXVhbCB0byBvcgorCSAqICAgICAgICAgYWZ0ZXIvbGF0ZXIgdGhhbiB0aGUgcGFyYW1ldGVyIHRpbWUuCisJICovCisJZG91YmxlIGdldFJlbGF0aXZlVmFsdWUoZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCisJCQlmaW5hbCBTVEVNVGltZSB0aW1lKTsKKworCS8qKgorCSAqIFByb2R1Y2UgYWxsIHJlbGF0aXZlIHZhbHVlcyBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvcGVydHkKKwkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB3aG9zZSByZWxhdGl2ZSB2YWx1ZSBpcyB0byBiZSBkZXRlcm1pbmVkCisJICogCisJICogQHJldHVybiBhbGwgcmVsYXRpdmUgKDAuMC0xLjApIHZhbHVlcyBvZiB0aGUgcHJvcGVydHkgYXMgY29tcGFyZWQgdG8gdGhlCisJICogICAgICAgICBvdGhlciBwcm9wZXJ0aWVzLiBUaGUgZmlyc3QgdmFsdWUgb2YgdGhlIGFycmF5IChpbmRleCAwKSBpcyB0aGUKKwkgKiAgICAgICAgIG9sZGVzdCB2YWx1ZS4KKwkgKi8KKwlkb3VibGVbXSBnZXRBbGxIaXN0b3JpY1JlbGF0aXZlVmFsdWVzKGZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpOworCisJLyoqCisJICogUHJvZHVjZSBhbGwgcmVsYXRpdmUgdmFsdWVzIGZvciBhIGdpdmVuIGZlYXR1cmUuCisJICogCisJICogQHBhcmFtIGZlYXR1cmUKKwkgKiAgICAgICAgICAgIGZlYXR1cmUgb2YgdGhlIHByb3BlcnR5IHdob3NlIHJlbGF0aXZlIHZhbHVlIGlzIHRvIGJlCisJICogICAgICAgICAgICBkZXRlcm1pbmVkCisJICogQHJldHVybiBhbGwgcmVsYXRpdmUgKDAuMC0xLjApIHZhbHVlcyBvZiB0aGUgZmVhdHVyZSBhcyBjb21wYXJlZCB0byB0aGUKKwkgKiAgICAgICAgIG90aGVyIHByb3BlcnRpZXMuIFRoZSBmaXJzdCB2YWx1ZSBvZiB0aGUgYXJyYXkgKGluZGV4IDApIGlzIHRoZQorCSAqICAgICAgICAgb2xkZXN0IHZhbHVlLgorCSAqLworCWRvdWJsZVtdIGdldEFsbEhpc3RvcmljUmVsYXRpdmVWYWx1ZXMoZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpOworCQorCQorCS8qKgorCSAqIFByb2R1Y2UgYWxsIHJlbGF0aXZlIHZhbHVlcyBpbiBhIHRpbWUgcmFuZ2UKKwkgKiBAcGFyYW0gdGltZVJhbmdlCisJICogQHJldHVybiBhbGwgcmVsYXRpdmUgKDAuMC0xLjApIHZhbHVlcyBvZiB0aGUgZmVhdHVyZSBhcyBjb21wYXJlZCB0byB0aGUKKwkgKiAgICAgICAgIG90aGVyIHByb3BlcnRpZXMuIFRoZSBmaXJzdCB2YWx1ZSBvZiB0aGUgYXJyYXkgKGluZGV4IDApIGlzIHRoZQorCSAqICAgICAgICAgb2xkZXN0IHZhbHVlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5oaXN0b3J5Lkhpc3RvcnlQcm92aWRlckFkYXB0ZXIjZ2V0SGlzdG9yaWNJbnN0YW5jZXMoKQorCSAqLworCXB1YmxpYyBkb3VibGVbXSBnZXRIaXN0b3JpY0luc3RhbmNlcyhmaW5hbCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5LCBTVEVNVGltZVtdIHRpbWVSYW5nZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIGFsbCBvZiB0aGUgdGltZSB2YWx1ZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBoaXN0b3JpYyByZWxhdGl2ZQorCSAqICAgICAgICAgdGltZSB2YWx1ZXMuIFRoZSBmaXJzdCB2YWx1ZSBvZiB0aGUgY29sbGVjdGlvbiBpcyB0aGUgdGltZSB2YWx1ZQorCSAqICAgICAgICAgZm9yIHRoZSBmaXJzdCB2YWx1ZSBvZiB0aGUgY29sbGVjdGlvbiByZXR1cm5lZCBieQorCSAqICAgICAgICAge0BsaW5rICNnZXRBbGxIaXN0b3JpY1JlbGF0aXZlVmFsdWVzKEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpfSBhbmQKKwkgKiAgICAgICAgIGJ5IHtAbGluayAjZ2V0QWxsSGlzdG9yaWNSZWxhdGl2ZVZhbHVlcyhFU3RydWN0dXJhbEZlYXR1cmUpfS4KKwkgKi8KKwlTVEVNVGltZVtdIGdldEFsbEhpc3RvcmljVGltZVZhbHVlcygpOworCisJLyoqCisJICogQHJldHVybiB0aGUgZWFybGllc3QgdGltZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSByZWxhdGl2ZSB2YWx1ZS4KKwkgKi8KKwlTVEVNVGltZSBnZXRFYXJsaWVzdFRpbWVWYWx1ZSgpOworCisJLyoqCisJICogQHJldHVybiB0aGUgZWFybGllc3QgKGxvd2VzdCkgY3ljbGUgbnVtYmVyCisJICovCisJaW50IGdldEVhcmxpZXN0Q3ljbGVOdW1iZXIoKTsKKworfSAvLyBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3JlbGF0aXZldmFsdWUvaGlzdG9yeS9SZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9yZWxhdGl2ZXZhbHVlL2hpc3RvcnkvUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDM4OTYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9yZWxhdGl2ZXZhbHVlL2hpc3RvcnkvUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLy8gUmVsYXRpZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5oaXN0b3J5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMuaGlzdG9yeS5IaXN0b3J5RXh0ZW5kZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLmhpc3RvcnkuSGlzdG9yeVByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBhZGFwdHMgPGNvZGU+RU9iamVjdHM8L2NvZGU+J3MgdG8KKyAqIDxjb2RlPlJlbGF0aXZlVmFsdWVQcm92aWRlcjwvY29kZT4ncy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyIGV4dGVuZHMKKwkJUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIsCisJCUhpc3RvcnlFeHRlbmRlZExpc3RlbmVyIHsKKworCXByaXZhdGUgTGlzdDxSZWxhdGl2ZVZhbHVlSGlzdG9yeUV4dGVuZGVkTGlzdGVuZXI+IGV4dGVuc2lvbkxpc3RlbmVycyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxSZWxhdGl2ZVZhbHVlSGlzdG9yeUV4dGVuZGVkTGlzdGVuZXI+KCk7CisKKwkvLyBUaGlzIHNob3VsZCBiZSByZW1vdmVkIERBRgorCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBlYXJsaWVzdEN5Y2xlTnVtYmVyID0gMDsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLmhpc3RvcnkuUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlciNnZXRSZWxhdGl2ZVZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IsCisJICogICAgICBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUpCisJICovCisJcHVibGljIGRvdWJsZSBnZXRSZWxhdGl2ZVZhbHVlKGZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHksCisJCQlmaW5hbCBTVEVNVGltZSB0aW1lKSB7CisJCXJldHVybiBnZXRSZWxhdGl2ZVZhbHVlKChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BlcnR5LmdldEZlYXR1cmUobnVsbCksCisJCQkJdGltZSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeS5SZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyI2dldFJlbGF0aXZlVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwKKwkgKiAgICAgIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSkKKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgZG91YmxlIGdldFJlbGF0aXZlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCisJCQlTVEVNVGltZSB0aW1lKTsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLmhpc3RvcnkuUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlciNnZXRBbGxIaXN0b3JpY1JlbGF0aXZlVmFsdWVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCisJICovCisJYWJzdHJhY3QgcHVibGljIGRvdWJsZVtdIGdldEFsbEhpc3RvcmljUmVsYXRpdmVWYWx1ZXMoCisJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSk7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5oaXN0b3J5LlJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIjZ2V0QWxsSGlzdG9yaWNSZWxhdGl2ZVZhbHVlcyhvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yKQorCSAqLworCXB1YmxpYyBkb3VibGVbXSBnZXRBbGxIaXN0b3JpY1JlbGF0aXZlVmFsdWVzKAorCQkJZmluYWwgSXRlbVByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSkgeworCQlyZXR1cm4gZ2V0QWxsSGlzdG9yaWNSZWxhdGl2ZVZhbHVlcygoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0eQorCQkJCS5nZXRGZWF0dXJlKG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5oaXN0b3J5LlJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIjZ2V0QWxsSGlzdG9yaWNUaW1lVmFsdWVzKCkKKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgU1RFTVRpbWVbXSBnZXRBbGxIaXN0b3JpY1RpbWVWYWx1ZXMoKTsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLmhpc3RvcnkuUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlciNnZXRFYXJsaWVzdFRpbWVWYWx1ZSgpCisJICovCisJYWJzdHJhY3QgcHVibGljIFNURU1UaW1lIGdldEVhcmxpZXN0VGltZVZhbHVlKCk7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5oaXN0b3J5LlJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIjZ2V0RWFybGllc3RDeWNsZU51bWJlcigpCisJICovCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5oaXN0b3J5LlJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIjZ2V0RWFybGllc3RDeWNsZU51bWJlcigpCisJICovCisJcHVibGljIGludCBnZXRFYXJsaWVzdEN5Y2xlTnVtYmVyKCkgeworCQlyZXR1cm4gZWFybGllc3RDeWNsZU51bWJlcjsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoZmluYWwgT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlci5jbGFzczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMuaGlzdG9yeS5IaXN0b3J5RXh0ZW5kZWRMaXN0ZW5lciNoaXN0b3J5RXh0ZW5kZWQob3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5oaXN0b3J5Lkhpc3RvcnlQcm92aWRlckFkYXB0ZXIpCisJICovCisJcHVibGljIHZvaWQgaGlzdG9yeUV4dGVuZGVkKEhpc3RvcnlQcm92aWRlckFkYXB0ZXIgaGlzdG9yeVByb3ZpZGVyQWRhcHRlcikgeworCQlmaXJlSGlzdG9yeUV4dGVuZGVkKCk7CisJfQorCisJcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uTGlzdGVuZXIoCisJCQlSZWxhdGl2ZVZhbHVlSGlzdG9yeUV4dGVuZGVkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJZXh0ZW5zaW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlRXh0ZW5zaW9uTGlzdGVuZXIoCisJCQlSZWxhdGl2ZVZhbHVlSGlzdG9yeUV4dGVuZGVkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJZXh0ZW5zaW9uTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZmlyZUhpc3RvcnlFeHRlbmRlZCgpIHsKKwkJZm9yIChSZWxhdGl2ZVZhbHVlSGlzdG9yeUV4dGVuZGVkTGlzdGVuZXIgbGlzdGVuZXIgOiBleHRlbnNpb25MaXN0ZW5lcnMpIHsKKwkJCWxpc3RlbmVyLnJlbGF0aXZlVmFsdWVIaXN0b3J5RXh0ZW5kZWQodGhpcyk7CisJCX0gLy8gZm9yIGVhY2ggSGlzdG9yeUV4dGVuZGVkTGlzdGVuZXIKKwl9CisKK30gLy8gUmVsYXRpZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9yZWxhdGl2ZXZhbHVlL2hpc3RvcnkvUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3JlbGF0aXZldmFsdWUvaGlzdG9yeS9SZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTZhMTI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9yZWxhdGl2ZXZhbHVlL2hpc3RvcnkvUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLy8gUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLmhpc3Rvcnk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgY3JlYXRlIGFkYXB0ZXJzIHRoYXQgYWRhcHQKKyAqIHtAbGluayAgRU9iamVjdH1zIHRvIHtAbGluayBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyfXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKKwkJQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzCisJICoge0BsaW5rIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJ9IGluc3RhbmNlcy4KKwkgKiA8cD4KKwkgKiBUaGlzIGluc3RhbmNlIGlzIGEge0BsaW5rIENvbXBvc2VkQWRhcHRlckZhY3Rvcnl9IHdoaWNoIG1lYW5zIHRoYXQgaXQKKwkgKiBjb2xsZWN0cyB0b2dldGhlciBvdGhlciB7QGxpbmsgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeX0gYWRhcHRlcgorCSAqIGZhY3Rvcmllcy4gRWFjaCBjbGFzcyB0aGF0IGltcGxlbWVudHMKKwkgKiB7QGxpbmsgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnl9IG5lZWRzIHRvIGFkZCBpdHNlbGYgdG8gdGhpcworCSAqIGluc3RhbmNlIHdpdGggYSBjYWxsIHRvCisJICoge0BsaW5rIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjYWRkQWRhcHRlckZhY3Rvcnkob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpfS4KKwkgKiBUaGlzIHdpbGwgdGhlbiBhbGxvdyBhZGFwdGVycyBjcmVhdGVkIGJ5IHRoYXQgZmFjdG9yeSB0byBiZSBmb3VuZCB3aGVuCisJICogYWRhcHRpbmcgY2xhc3MgaW5zdGFuY2VzIGhhbmRsZWQgYnkgdGhlIG5ldyBmYWN0b3J5LgorCSAqIDxwPgorCSAqIEJhc2ljYWxseSwgaWYgeW91IGNyZWF0ZSBhbiBFTUYgbW9kZWwgYW5kIGRlZmluZSBhCisJICoge0BsaW5rIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeX0gZm9yIGl0IHNvIHRoYXQgdGhlCisJICogY2xhc3NlcyBpbiB0aGF0IG1vZGVsIGNhbiBiZSBhZGFwdGVkLCB5b3UgbmVlZCB0byBob29rIHRoYXQgZmFjdG9yeSBpbnRvCisJICogdGhpcyBvbmUgc28gdGhhdCBsYXRlciB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhZGFwdCBhIGNsYXNzIGZyb20gdGhhdAorCSAqIG1vZGVsIGlzIG1hZGUgdGhlIGFzc29jaWF0ZWQgZmFjdG9yeSB3aWxsIGJlIGZvdW5kLiBZb3UgY2FuIGRvIHRoYXQgYnkKKwkgKiBhZGRpbmcgdGhlIGxpbmU6IDxjb2RlPgorCSAqIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGRBZGFwdGVyRmFjdG9yeSh0aGlzKTsKKwkgKiA8L2NvZGU+CisJICogdG8gdGhlIGRlZmF1bHQgY29uc3RydWN0b3Igb2YgdGhlIG5ldyBmYWN0b3J5IGFmdGVyIHRoZSBzdXBlciBjYWxsLgorCSAqIFlvdSdyZSBub3QgZG9uZSBob3dldmVyLCB5b3UgYWxzbyBoYXZlIHRvICJmb3JjZSIgYW4gaW5zdGFuY2Ugb2YgdGhlCisJICogY2xhc3MgdG8gYmUgY3JlYXRlZCBzbyB0aGF0IHRoZSBjb25zdHJ1Y3RvciBpcyBydW4uIFRoaXMgaXMgdHlwaWNhbGx5CisJICogYWNoaWV2ZWQgYnkgYWxsb2NhdGluZyBhbiBpbnN0YW5jZSBpbiB0aGUgPGNvZGU+c3RhcnQ8L2NvZGU+IG1ldGhvZCBvZgorCSAqIHRoZSA8Y29kZT5BY3RpdmF0b3I8L2NvZGU+IG9mIHRoZSBwbHVnLWluIHRoYXQgZGVmaW5lcyB0aGUgZmFjdG9yeS4gIAorCSAqLworCVJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGwgSU5TVEFOQ0UgPSBuZXcgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbCgpOworCisJLyoqCisJICogVGhpcyBjbGFzcyByZXByZXNlbnRzCisJICovCisJcHVibGljIGNsYXNzIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGwgZXh0ZW5kcworCQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzCisJCQlSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgeworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCQlyZXR1cm4gdHlwZSA9PSBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyLmNsYXNzOworCQl9IC8vIGlzRmFjdG9yeUZvclR5cGUKKwl9IC8vIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGwKKworfSAvLyBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9TcGF0aWFsUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9TcGF0aWFsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzJhMmNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL1NwYXRpYWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8vIFNwYXRpYWxQcm92aWRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHByb3ZpZGUgc3BhdGlhbCBkZXNjcmlwdGlvbnMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3BhdGlhbFByb3ZpZGVyIHsKKwkvLyBNYXJrZXIgaW50ZXJmYWNlCit9IC8vIFNwYXRpYWxQcm92aWRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL1NwYXRpYWxQcm92aWRlckFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9TcGF0aWFsUHJvdmlkZXJBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmMmVjZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9TcGF0aWFsUHJvdmlkZXJBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLy8gU3BhdGlhbFByb3ZpZGVyQWRhcHRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgZXh0ZW5kZWQgYnkgY2xhc3NlcyB0aGF0IGFkYXB0IElkZW50aWZpYWJsZXMgdG8KKyAqIFNwYXRpYWxQcm92aWRlcnMuCisgKiAKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUKKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIFNwYXRpYWxQcm92aWRlckFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzCisJCVNwYXRpYWxQcm92aWRlciB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzY2hlbWUgdXNlZCBmb3Igc3BlY2lmeWluZyBVUkkncyB0aGF0IGFyZSB2YWx1ZXMgZm9yIHRoZQorCSAqIDxlbT5zcGF0aWFsPC9lbT4gYXR0cmlidXRlIG9mIGFuIDxjb2RlPklkZW50aWZpYWJsZTwvY29kZT4ncyBkdWJsaW4KKwkgKiBjb3JlIGluc3RhbmNlLiBJZiB0aGUgdmFsdWUgaXMgYSB2YWxpZCBVUkkgdGhhdCBjb25mb3JtcyB0byB0aGlzIHNjaGVtZSwKKwkgKiBpdCB3aWxsIGJlIGludGVycHJldGVkIGJ5IHRoZSBhZGFwdGVyLgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNnZXRTcGF0aWFsKCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNzZXRTcGF0aWFsKFN0cmluZykKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVNX1NQQVRJQUxfU0NIRU1FID0gInN0ZW1zcGF0aWFsIjsKKworCS8qKgorCSAqIHRoZSBzY2hlbWUgd2l0aCBhIGNvbG9uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RFTV9TUEFUSUFMX1NDSEVNRV9QUkVGSVggPSBTVEVNX1NQQVRJQUxfU0NIRU1FCisJCQkrICI6IjsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gdHlwZSA9PSBTcGF0aWFsUHJvdmlkZXIuY2xhc3M7CisJfSAvLyBpc0FkYXB0ZXJGb3JUeXBlCisJCisJCit9IC8vIFNwYXRpYWxQcm92aWRlckFkYXB0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9TcGF0aWFsUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL1NwYXRpYWxQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzNTM0MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9TcGF0aWFsUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8vIFNwYXRpYWxQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgZXh0ZW5kZWQgYnkgY2xhc3NlcyB0aGF0IGNyZWF0ZSBhZGFwdGVycyB0aGF0IGFkYXB0CisgKiBJZGVudGlmaWFibGVzIHRvIFNwYXRpYWxQcm92aWRlcnMuCisgKiAKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNwYXRpYWxQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGwjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gU3BhdGlhbFByb3ZpZGVyLmNsYXNzOworCX0gLy8gaXNGYWN0b3J5Rm9yVHlwZQorCit9IC8vIFNwYXRpYWxQcm92aWRlckFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3NwYXRpYWwvZ2VvL0lubGluZUxhdExvbmdEYXRhUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vSW5saW5lTGF0TG9uZ0RhdGFQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZTg4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3NwYXRpYWwvZ2VvL0lubGluZUxhdExvbmdEYXRhUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE2NiBAQAorLy8gSW5saW5lTGF0TG9uZ0RhdGFQcm92aWRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW87CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuU3BhdGlhbFByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmcuU2VnbWVudDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGludGVycHJldHMgYSBVUkkgdGhhdCBjb250YWlucyBlbWJlZGRlZCAoaS5lLiwgImlubGluZSIpIGxhdC9sb25nCisgKiBkYXRhLgorICogPHA+CisgKiBUaGUgZm9ybWF0IG9mIHRoZSBVUkkgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBsYXQvbG9uZyBwYWlycyBhcyBkb3VibGUKKyAqIHZhbHVlcy4gVGhlc2UgY2FuIGJlIHNlcGFyYXRlZCBpbnRvICJzZWdtZW50cyIgYnkgc2xhc2hlcyAoIi8iKSB3aGljaCB3aWxsCisgKiBjcmVhdGUgc2VwYXJhdGUgbGF0L2xvbmcgc2VxdWVuY2VzIChhcnJheXMpIGluIHRoZSByZXR1cm4gdmFsdWUuCisgKiAKKyAqIDxwcmU+CisgKiAgIGUuZy4sICZxdW90O2lubGluZTpMYXQxLExvbmcxLExhdDIsTG9uZzIvTGF0MyxMb25nMyxMYXQ0LExvbmc0JnF1b3Q7CisgKiA8L3ByZT4KKyAqIAorICogPC9wPgorICogCisgKiBAc2VlIFBsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlcgorICogQHNlZSBMYXRMb25nUHJvdmlkZXJBZGFwdGVyCisgKi8KK3B1YmxpYyBjbGFzcyBJbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyIGltcGxlbWVudHMgTGF0TG9uZ0RhdGFQcm92aWRlciB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzY2hlbWUgZm9yIGFuICJpbmxpbmUiIGRhdGEgVVJJIHRoYXQgc3BlY2lmaWVzIGxhdC9sb25nIGRhdGEKKwkgKiBpbiB0aGUgVVJJCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5MSU5FX1NDSEVNRSA9ICJpbmxpbmUiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTUJFUl9PRl9GQUNUSU9OQUxfRElHSVRTID0gMjsKKworCXByaXZhdGUgc3RhdGljIE51bWJlckZvcm1hdCBmb3JtYXR0ZXIgPSBudWxsOworCisJc3RhdGljIHsKKwkJLy8gVGhlIHN0YXRpYyBpbml0aWFsaXplciBpc24ndCBiZWluZyBjYWxsZWQgaW4gZWNsaXBzZQorCQkvLyBSZWdpc3RlciB0aGlzIGRhdGEgcHJvdmlkZXIgd2l0aCB0aGUgYWRhcHRlciBzbyBpdCBjYW4gZmluZCB1cyB3aGVuCisJCS8vIGl0IGNvbWVzIGFjcm9zcyBhbiAiaW5saW5lIiBVUkkuCisJCS8vIExhdExvbmdQcm92aWRlckFkYXB0ZXIucmVnaXN0ZXJMYXRMb25nRGF0YVByb3ZpZGVyKElOTElORV9TQ0hFTUUsCisJCS8vIG5ldyBJbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyKCkpOworCX0gLy8gc3RhdGljCisKKwkvKioKKwkgKiBAcGFyYW0gZGF0YVVSSQorCSAqIEByZXR1cm4gYSBsYXRpdHVkZS9sb25naXR1ZGUgdmFsdWUKKwkgKi8KKwlwdWJsaWMgTGF0TG9uZyBnZXRMYXRMb25nKGZpbmFsIFVSSSBkYXRhVVJJKSB7CisJCWZpbmFsIExhdExvbmcgcmV0VmFsdWUgPSBuZXcgTGF0TG9uZygpOworCisJCWZpbmFsIFN0cmluZ1tdIHNlZ21lbnRzID0gZGF0YVVSSS5zZWdtZW50cygpOworCQl0cnkgeworCQkJZm9yIChmaW5hbCBTdHJpbmcgc2VnbWVudFN0cmluZyA6IHNlZ21lbnRzKSB7CisJCQkJZmluYWwgTGF0TG9uZy5TZWdtZW50QnVpbGRlciBzYiA9IG5ldyBMYXRMb25nLlNlZ21lbnRCdWlsZGVyKCk7CisKKwkJCQlmaW5hbCBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNlZ21lbnRTdHJpbmcsCisJCQkJCQkiLCIpOworCQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQkJZmluYWwgU3RyaW5nIGxhdGl0dWRlU3RyaW5nID0gc3QubmV4dFRva2VuKCk7CisJCQkJCS8vIElzIHRoZXJlIGEgbWF0Y2hpbmcgTG9uZ2l0dWRlPworCQkJCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXNiLmFkZChsYXRpdHVkZVN0cmluZywgc3QubmV4dFRva2VuKCkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gTm8KKwkJCQkJCS8vIGxhdC9sb25nIG1pc21hdGNoCisJCQkJCQlBY3RpdmF0b3IKKwkJCQkJCQkJLmxvZ0Vycm9yKAorCQkJCQkJCQkJCSJJbmxpbmUgbGF0L2xvbmcgZGF0YSBcIiIKKwkJCQkJCQkJCQkJCSsgc2VnbWVudFN0cmluZworCQkJCQkJCQkJCQkJKyAiXCIgaXMgbWlzc2luZyBhIGxvbmdpdHVkZSBtYXRjaCBmb3IgdGhlIGxhdGl0dWRlIFwiIgorCQkJCQkJCQkJCQkJKyBsYXRpdHVkZVN0cmluZyArICJcIiIsIG51bGwpOworCQkJCQkJc2IuY2xlYXIoKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9IC8vIGVsc2UKKwkJCQl9IC8vIHdoaWxlIG1vcmUgdG9rZW5zCisKKwkJCQkvLyBBbnl0aGluZyBpbiB0aGUgc2VnbWVudCBidWlsZGVyPworCQkJCWlmIChzYi5zaXplKCkgPiAwKSB7CisJCQkJCS8vIFllcworCQkJCQlyZXRWYWx1ZS5hZGQoc2IudG9TZWdtZW50KCkpOworCQkJCX0KKwkJCX0gLy8gZm9yIGVhY2ggc2VnbWVudAorCQl9IC8vIHRyeQorCQljYXRjaCAoZmluYWwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKAorCQkJCQkiSW5saW5lIGxhdC9sb25nIGRhdGEgaXMgbm90IHByb3Blcmx5IGZvcm1hdHRlZCIsIG5mZSk7CisJCX0gLy8gY2F0Y2gKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0TGF0TG9uZworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmdEYXRhUHJvdmlkZXIjZ2V0TGF0TG9uZ05vV2FpdChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQorCSAqLworCXB1YmxpYyBMYXRMb25nIGdldExhdExvbmdOb1dhaXQoZmluYWwgVVJJIGRhdGFVUkkpIHsKKwkJcmV0dXJuIGdldExhdExvbmcoZGF0YVVSSSk7CisJfSAvLyBnZXRMYXRMb25nTm9XYWl0CisKKwkvKioKKwkgKiBFbmNvZGUgYSBsaXN0IG9mIGFycmF5cyBvZiBkb3VibGUgdmFsdWVzIHJlcHJlc2VudGluZyBwb2x5Z29ucy9saW5lcyBpbnRvCisJICogYW4gc3BhdGlhbCBpbmxpbmUgVVJJIHN0cmluZy4KKwkgKiAKKwkgKiBAcGFyYW0gc2VnbWVudEFycmF5cworCSAqICAgICAgICAgICAgYSBsaXN0IG9mIGFycmF5cyBlYWNoIG9mIHdoaWNoIHJlcHJlc2VudHMgYSBwb2x5Z29uL2xpbmUKKwkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHZhbHVlcyBpbiB0aGUgYXJyYXlzIGVuY29kZWQgaW4gYSBzcGF0aWFsIGlubGluZSBVUkkKKwkgKiAgICAgICAgIHN0cmluZworCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVNwYXRpYWxJbmxpbmVVUklTdHJpbmcoCisJCQlmaW5hbCBMYXRMb25nIHNlZ21lbnRBcnJheXMpIHsKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKAorCQkJCVNwYXRpYWxQcm92aWRlckFkYXB0ZXIuU1RFTV9TUEFUSUFMX1NDSEVNRV9QUkVGSVgpOworCQlzYi5hcHBlbmQoY3JlYXRlSW5saW5lVVJJU3RyaW5nKHNlZ21lbnRBcnJheXMpKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfSAvLyBjcmVhdGVTcGF0aWFsSW5saW5lVVJJU3RyaW5nCisKKwkvKioKKwkgKiBFbmNvZGUgYSBsaXN0IG9mIGFycmF5cyBvZiBkb3VibGUgdmFsdWVzIHJlcHJlc2VudGluZyBwb2x5Z29ucy9saW5lcyBpbnRvCisJICogYW4gaW5saW5lIFVSSSBzdHJpbmcuIFRoaXMgaXMgdGhlIGludmVyc2Ugb3BlcmF0aW9uIG9mCisJICoge0BsaW5rICNnZXRMYXRMb25nKFVSSSl9LgorCSAqIAorCSAqIEBwYXJhbSBsYXRMb25nCisJICogCisJICogQHJldHVybiB0aGUgbGlzdCBvZiB2YWx1ZXMgaW4gdGhlIGFycmF5cyBlbmNvZGVkIGluIGFuIGlubGluZSBVUkkgc3RyaW5nCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlSW5saW5lVVJJU3RyaW5nKGZpbmFsIExhdExvbmcgbGF0TG9uZykgeworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoSU5MSU5FX1NDSEVNRSk7CisJCXNiLmFwcGVuZCgiOi8vIik7CisJCWZvciAoZmluYWwgU2VnbWVudCBzZWdtZW50IDogbGF0TG9uZy5nZXRTZWdtZW50cygpKSB7CisJCQlzYi5hcHBlbmQoIi8iKTsKKwkJCXNiLmFwcGVuZChzZWdtZW50LnRvSW5saW5lVVJJU3RyaW5nKCkpOworCQl9IC8vIGZvciBlYWNoIHNlZ21lbnQKKworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9IC8vIGNyZWF0ZUlubGluZVVSSVN0cmluZworCisJLyoqCisJICogQHJldHVybiBhIGZvcm1hdHRlcgorCSAqLworCXByaXZhdGUgc3RhdGljIE51bWJlckZvcm1hdCBnZXRGb3JtYXR0ZXIoKSB7CisJCS8vIElzIHRoZXJlIGFscmVhZHkgYSBmb3JtYXR0ZXI/CisJCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgeworCQkJLy8gTm8KKwkJCWZvcm1hdHRlciA9IE51bWJlckZvcm1hdC5nZXROdW1iZXJJbnN0YW5jZSgpOworCQkJZm9ybWF0dGVyLnNldE1heGltdW1GcmFjdGlvbkRpZ2l0cyhOVU1CRVJfT0ZfRkFDVElPTkFMX0RJR0lUUyk7CisJCQlmb3JtYXR0ZXIuc2V0TWluaW11bUZyYWN0aW9uRGlnaXRzKE5VTUJFUl9PRl9GQUNUSU9OQUxfRElHSVRTKTsKKwkJfQorCQlyZXR1cm4gZm9ybWF0dGVyOworCX0gLy8gZ2V0Rm9ybWF0dGVyCisKK30gLy8gSW5saW5lTGF0TG9uZ0RhdGFQcm92aWRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9MYXRMb25nLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3NwYXRpYWwvZ2VvL0xhdExvbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NThjNGRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9MYXRMb25nLmphdmEKQEAgLTAsMCArMSw0ODcgQEAKKy8vIExhdExvbmcuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9sczsKK2ltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIGNvbGxlY3Rpb24gb2YgbGF0aXR1ZGUvbG9uZ2l0dWRlIGRhdGEgcGFpcnMgcGFydGl0aW9uZWQgaW50bworICogb25lIG9yIG1vcmUgInNlZ21lbnRzIi4gRWFjaCBzZWdtZW50IGlzIGEgc2VxdWVuY2Ugb2YgbGF0aXR1ZGUvbG9uZ2l0dWRlIGRhdGEKKyAqIHBhaXJzLiBBIHNlZ21lbnQgY291bGQgZm9ybSBhIGNsb3NlZCBwb2x5Z29uIG9yIGl0IGNvdWxkIGJlIGEgcGF0aC4gQQorICoge0BsaW5rIFNlZ21lbnRCdWlsZGVyfSBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgYSB7QGxpbmsgU2VnbWVudH0uCisgKi8KK3B1YmxpYyBjbGFzcyBMYXRMb25nIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1CRVJfT0ZfRkFDVElPTkFMX0RJR0lUUyA9IDI7CisKKwkvL3N0YXRpYyBOdW1iZXJGb3JtYXQgZm9ybWF0dGVyID0gbnVsbDsKKworCXByaXZhdGUgZmluYWwgTGlzdDxTZWdtZW50PiBzZWdtZW50cyA9IG5ldyBBcnJheUxpc3Q8U2VnbWVudD4oKTsKKworCS8qKgorCSAqIEFkZCBhIHNlZ21lbnQgdG8gYSBjb2xsZWN0aW9uCisJICogCisJICogQHBhcmFtIHNlZ21lbnQKKwkgKiAgICAgICAgICAgIHRoZSBzZWdtZW50IHRvIGFkZCB0byB0aGUgY29sbGVjdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIGFkZChmaW5hbCBTZWdtZW50IHNlZ21lbnQpIHsKKwkJc2VnbWVudHMuYWRkKHNlZ21lbnQpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBzZWdtZW50cworCSAqICAgICAgICAgICAgYWRkIHRoZSBsaXN0IG9mIHNlZ21lbnRzIHRvIHRoZSBjb2xsZWN0aW9uIG1haW50YWluZWQgYnkKKwkgKiAgICAgICAgICAgIExhdExvbmcKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGQoZmluYWwgTGlzdDxTZWdtZW50PiBzZWdtZW50cykgeworCQl0aGlzLnNlZ21lbnRzLmFkZEFsbChzZWdtZW50cyk7CisJfSAvLyBhZGQKKworCS8qKgorCSAqIEFkZCB0aGUgc2VnbWVudHMgZnJvbSBvbmUgPGNvZGU+TGF0TG9uZzwvY29kZT4gdG8gdGhpcyBvbmUuCisJICogCisJICogQHBhcmFtIGxhdExvbmcKKwkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5MYXRMb25nPC9jb2RlPiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBzZWdtZW50cworCSAqICAgICAgICAgICAgdG8gYWRkLgorCSAqLworCXB1YmxpYyB2b2lkIGFkZChmaW5hbCBMYXRMb25nIGxhdExvbmcpIHsKKwkJc2VnbWVudHMuYWRkQWxsKGxhdExvbmcuZ2V0U2VnbWVudHMoKSk7CisJfSAvLyBhZGQKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygc2VnbWVudHMKKwkgKi8KKwlwdWJsaWMgZmluYWwgTGlzdDxTZWdtZW50PiBnZXRTZWdtZW50cygpIHsKKwkJcmV0dXJuIHNlZ21lbnRzOworCX0gLy8gZ2V0U2VnbWVudHMKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzZWdtZW50cworCSAqLworCXB1YmxpYyBmaW5hbCBpbnQgc2l6ZSgpIHsKKwkJcmV0dXJuIHNlZ21lbnRzLnNpemUoKTsKKwl9IC8vIHNpemUKKworCS8qKgorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIEludGVnZXIudG9TdHJpbmcoc2l6ZSgpKTsKKwl9IC8vIHRvU3RyaW5nCisKKwkvKioKKwkgKiBAcmV0dXJuIGEgbnVtYmVyIGZvcm1hdHRlcgorCSAqLworLy8Jc3RhdGljIE51bWJlckZvcm1hdCBnZXRGb3JtYXR0ZXIoKSB7CisvLwkJLy8gSXMgdGhlcmUgYWxyZWFkeSBhIGZvcm1hdHRlcj8KKy8vCQlpZiAoZm9ybWF0dGVyID09IG51bGwpIHsKKy8vCQkJLy8gTm8KKy8vCQkJZm9ybWF0dGVyID0gTnVtYmVyRm9ybWF0LmdldE51bWJlckluc3RhbmNlKCk7CisvLwkJCWZvcm1hdHRlci5zZXRNYXhpbXVtRnJhY3Rpb25EaWdpdHMoTlVNQkVSX09GX0ZBQ1RJT05BTF9ESUdJVFMpOworLy8JCQlmb3JtYXR0ZXIuc2V0TWluaW11bUZyYWN0aW9uRGlnaXRzKE5VTUJFUl9PRl9GQUNUSU9OQUxfRElHSVRTKTsKKy8vCQl9CisvLwkJcmV0dXJuIGZvcm1hdHRlcjsKKy8vCX0gLy8gZ2V0Rm9ybWF0dGVyCisJCisJLyoqCisJICogQ29udmVydHMgZG91YmxlIHZhbHVlIGludG8gYSBmcmFjdGlvbmFsIHN0cmluZyB3aXRoIGZyYWNEaWdpdHMgCisJICogbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzLiAgU2hvdWxkIGJlIGxvY2FsZSBhZ25vc3RpYy4KKwkgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gY29udmVydAorCSAqIEBwYXJhbSBmcmFjRGlnaXRzIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgZGVjaW1hbCBwb2ludCB0byBob2xkCisJICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyBuZXcgdmFsdWUKKwkgKi8KKwlzdGF0aWMgU3RyaW5nIGZvcm1hdExhdExuZ1ZhbHVlKGRvdWJsZSB2YWx1ZSwgZG91YmxlIGZyYWNEaWdpdHMpIHsKKwkJCisJCWRvdWJsZSBwb3dlciA9IE1hdGgucG93KDEwLCBmcmFjRGlnaXRzKTsKKwkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKCgobG9uZykodmFsdWUqcG93ZXIpKS9wb3dlcik7CisJfQorCQorCS8qKgorCSAqIENvbnZlcnRzIGRvdWJsZSB2YWx1ZSBpbnRvIGEgZnJhY3Rpb25hbCBzdHJpbmcgd2l0aCBkZWZhdWx0IAorCSAqIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcy4gIFNob3VsZCBiZSBsb2NhbGUgYWdub3N0aWMuCisJICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIGNvbnZlcnQKKwkgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIG5ldyB2YWx1ZQorCSAqLworCXN0YXRpYyBTdHJpbmcgZm9ybWF0TGF0TG5nVmFsdWUoZG91YmxlIHZhbHVlKSB7CisJCXJldHVybiBmb3JtYXRMYXRMbmdWYWx1ZSh2YWx1ZSwgTlVNQkVSX09GX0ZBQ1RJT05BTF9ESUdJVFMpOworCX0KKworCS8qKgorCSAqIFRoaXMgY2xhc3MgY3JlYXRlcyB7QGxpbmsgU2VnbWVudH0ncworCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2VnbWVudEJ1aWxkZXIgeworCisJCXByaXZhdGUgZmluYWwgTGlzdDxMYXRMb25nUGFpcj4gY29sbGVjdGVkUGFpcnMgPSBuZXcgQXJyYXlMaXN0PExhdExvbmdQYWlyPigpOworCisJCS8qKgorCQkgKiBAcGFyYW0gbGF0aXR1ZGVTdHJpbmcKKwkJICogICAgICAgICAgICBhIGRvdWJsZSBsYXRpdHVkZSB2YWx1ZSByZXByZXNlbnRlZCBhcyBhCisJCSAqICAgICAgICAgICAgPGNvZGU+U3RyaW5nPC9jb2RlPgorCQkgKiBAcGFyYW0gbG9uZ2l0dWRlU3RyaW5nCisJCSAqICAgICAgICAgICAgYSBkb3VibGUgbG9uZ2l0dWRlIHZhbHVlIHJlcHJlc2VudGVkIGFzIGEKKwkJICogICAgICAgICAgICA8Y29kZT5TdHJpbmc8L2NvZGU+CisJCSAqLworCQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgU3RyaW5nIGxhdGl0dWRlU3RyaW5nLAorCQkJCWZpbmFsIFN0cmluZyBsb25naXR1ZGVTdHJpbmcpIHsKKwkJCWFkZChEb3VibGUucGFyc2VEb3VibGUobGF0aXR1ZGVTdHJpbmcpLCBEb3VibGUKKwkJCQkJLnBhcnNlRG91YmxlKGxvbmdpdHVkZVN0cmluZykpOworCQl9IC8vIGFkZAorCisJCS8qKgorCQkgKiBAcGFyYW0gbGF0aXR1ZGUKKwkJICogQHBhcmFtIGxvbmdpdHVkZQorCQkgKi8KKwkJcHVibGljIHZvaWQgYWRkKGZpbmFsIGRvdWJsZSBsYXRpdHVkZSwgZmluYWwgZG91YmxlIGxvbmdpdHVkZSkgeworCQkJY29sbGVjdGVkUGFpcnMuYWRkKG5ldyBMYXRMb25nUGFpcihsYXRpdHVkZSwgbG9uZ2l0dWRlKSk7CisJCX0gLy8gYWRkCisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YSBwYWlycyBpbiB0aGUgc2VnbWVudAorCQkgKiAgICAgICAgIGJlaW5nIGJ1aWx0LgorCQkgKi8KKwkJcHVibGljIGludCBzaXplKCkgeworCQkJcmV0dXJuIGNvbGxlY3RlZFBhaXJzLnNpemUoKTsKKwkJfSAvLyBzaXplCisKKwkJLyoqCisJCSAqIFJlbW92ZSBhbGwgb2YgdGhlIGNvbGxlY3RlZCBsYXRpdHVkZS9sb25naXR1ZGUgcGFpcnMgY29sbGVjdGVkIHNvIGZhcgorCQkgKi8KKwkJcHVibGljIHZvaWQgY2xlYXIoKSB7CisJCQljb2xsZWN0ZWRQYWlycy5jbGVhcigpOworCQl9IC8vIGNsZWFyCisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIGNvbGxlY3RlZCBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YSBwYWlycyBhcyBhIHNlZ21lbnQuCisJCSAqLworCQlwdWJsaWMgU2VnbWVudCB0b1NlZ21lbnQoKSB7CisJCQlyZXR1cm4gdG9TZWdtZW50KGNvbGxlY3RlZFBhaXJzKTsKKwkJfSAvLyB0b1NlZ21lbnQKKworCQkvKioKKwkJICogQ3JlYXRlIGEge0BsaW5rIFNlZ21lbnR9LCBidXQgcmVkdWNlIHRoZSBudW1iZXIgb2YgZGF0YSBwb2ludHMgaXQKKwkJICogY29udGFpbnMgYnkgdGhlIHNhbXBsZSBmcmVxdWVuY3kuIEEgdmFsdWUgb2YgIjEiIG1lYW5zIGFsbCBwb2ludHMgYXJlCisJCSAqIGluY2x1ZGVkLCBhIHZhbHVlIG9mICIyIiBtZWFucyB0aGF0IGV2ZXJ5IDJuZCBwb2ludCBpcyBpbmNsdWRlZC4gVGhlCisJCSAqIGZpcnN0IGFuZCBsYXN0IHBvaW50cyBhcmUgYWx3YXlzIGluY2x1ZGVkLgorCQkgKiAKKwkJICogQHBhcmFtIHNhbXBsZUZyZXF1ZW5jeQorCQkgKiAgICAgICAgICAgIHRoZSBmcmVxdWVuY3kgaW4gZGF0YSBwb2ludHMgYXQgd2hpY2ggdGhlIHBhaXJzIGFyZQorCQkgKiAgICAgICAgICAgIHNhbXBsZWQuCisJCSAqIEByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIGNvbGxlY3RlZCBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YSBwYWlycyBhcyBhCisJCSAqICAgICAgICAgc2VnbWVudC4KKwkJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgc2FtcGxlRnJlcXVlbmN5IGlzIDwgMQorCQkgKi8KKwkJcHVibGljIFNlZ21lbnQgdG9TZWdtZW50KGZpbmFsIGludCBzYW1wbGVGcmVxdWVuY3kpIHsKKwkJCXJldHVybiB0b1NlZ21lbnQoY3JlYXRlRG93blNhbXBsZWRQYWlycyhzYW1wbGVGcmVxdWVuY3ksCisJCQkJCWNvbGxlY3RlZFBhaXJzKSk7CisJCX0gLy8gdG9TZWdtZW50CisKKwkJLyoqCisJCSAqIEBwYXJhbSBzYW1wbGVGcmVxdWVuY3kgIHRoZSBmcmVxdWVuY3kgaW4gZGF0YSBwb2ludHMgYXQgd2hpY2ggdGhlIHBhaXJzIGFyZQorCQkgKiAgICAgICAgICAgIHNhbXBsZWQuCisJCSAqIEBwYXJhbSBwYWlycworCQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzYW1wbGVGcmVxdWVuY3kgaXMgPCAxCisJCSAqLworCQlwcml2YXRlIGZpbmFsIExpc3Q8TGF0TG9uZ1BhaXI+IGNyZWF0ZURvd25TYW1wbGVkUGFpcnMoCisJCQkJZmluYWwgaW50IHNhbXBsZUZyZXF1ZW5jeSwgZmluYWwgTGlzdDxMYXRMb25nUGFpcj4gcGFpcnMpIHsKKwkJCWZpbmFsIExpc3Q8TGF0TG9uZ1BhaXI+IGRvd25TYW1wbGVkUGFpcnMgPSBuZXcgQXJyYXlMaXN0PExhdExvbmdQYWlyPigpOworCisJCQkvLyBJcyB0aGUgc2FtcGxlIGZyZXF1ZW5jeSB0b28gc21hbGw/CisJCQlpZiAoc2FtcGxlRnJlcXVlbmN5ID49IDEpIHsKKwkJCQkvLyBObworCQkJCWZpbmFsIGludCBsYXN0UG9pbnQgPSBjb2xsZWN0ZWRQYWlycy5zaXplKCkgLSAxOworCisJCQkJLy8gSXMgaXQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcGFpcnM/CisJCQkJaWYgKHNhbXBsZUZyZXF1ZW5jeSA8IGxhc3RQb2ludCkgeworCQkJCQkvLyBObworCQkJCQlpbnQgZGF0YVBvaW50Q291bnRlciA9IDA7CisJCQkJCWZvciAoZmluYWwgTGF0TG9uZ1BhaXIgcGFpciA6IHBhaXJzKSB7CisJCQkJCQkvLyBJbmNsdWRlIHRoaXMgcG9pbnQ/CisJCQkJCQlpZiAoZGF0YVBvaW50Q291bnRlciAlIHNhbXBsZUZyZXF1ZW5jeSA9PSAwCisJCQkJCQkJCXx8IGRhdGFQb2ludENvdW50ZXIgPT0gbGFzdFBvaW50KSB7CisJCQkJCQkJLy8gWWVzCisJCQkJCQkJZG93blNhbXBsZWRQYWlycy5hZGQocGFpcik7CisJCQkJCQl9IC8vIGlmIGluY2x1ZGUgdGhpcyBwb2ludAorCQkJCQkJZGF0YVBvaW50Q291bnRlcisrOworCQkJCQl9IC8vIGZvciBlYWNoIGxhdC9sb25nIHBvaW50CisJCQkJfSAvLyBpZiBzYW1wbGUgZnJlcXVlbmN5IG5vdCBncmVhdGVyIHRoYW4gbnVtYmVyIG9mIHBhaXJzCisJCQkJZWxzZSB7CisJCQkJCS8vIFllcworCQkJCQkvLyBQaWNrIHRoZSBmaXJzdCBwb2ludCwgdGhlIG1pZGRsZSBwb2ludCBhbmQgdGhlIGxhc3QgcG9pbnQKKwkJCQkJZG93blNhbXBsZWRQYWlycy5hZGQocGFpcnMuZ2V0KDApKTsKKwkJCQkJZG93blNhbXBsZWRQYWlycy5hZGQocGFpcnMuZ2V0KHBhaXJzLnNpemUoKSAvIDIpKTsKKwkJCQkJZG93blNhbXBsZWRQYWlycy5hZGQocGFpcnMuZ2V0KGxhc3RQb2ludCkpOworCQkJCX0gLy8gZWxzZQorCisJCQl9IC8vIGlmIHNhbXBsZSBmcmVxdWVuY3kgbm90IHRvbyBzbWFsbAorCQkJZWxzZSB7CisJCQkJLy8gWWVzCisJCQkJLy8gQmFkIHNhbXBsZSBmcmVxdWVuY3kKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYW1wbGUgZnJlcXVlbmN5IFwiIgorCQkJCQkJKyBzYW1wbGVGcmVxdWVuY3kgKyAiXCIgbXVzdCBiZSAxIG9yIGdyZWF0ZXIiKTsKKwkJCX0KKworCQkJcmV0dXJuIGRvd25TYW1wbGVkUGFpcnM7CisJCX0gLy8gY3JlYXRlRG93blNhbXBsZWRQYWlycworCisJCS8qKgorCQkgKiBAcGFyYW0gcGFpcnMKKwkJICogICAgICAgICAgICBhIGxpc3Qgb2YgbGF0L2xvbmcgZGF0YSBwYWlycworCQkgKiBAcmV0dXJuIHRoZSBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YSBwYWlycyBhcyBhIHNlZ21lbnQuCisJCSAqLworCQlwcml2YXRlIFNlZ21lbnQgdG9TZWdtZW50KGZpbmFsIExpc3Q8TGF0TG9uZ1BhaXI+IHBhaXJzKSB7CisJCQlmaW5hbCBkb3VibGVbXVtdIGRhdGEgPSBuZXcgZG91YmxlW3BhaXJzLnNpemUoKV1bMl07CisKKwkJCWludCBpID0gMDsKKwkJCWZvciAoZmluYWwgTGF0TG9uZ1BhaXIgbGF0TG9uZ1BhaXIgOiBwYWlycykgeworCQkJCWRhdGFbaV1bU2VnbWVudC5MQVRJVFVERV9JTkRFWF0gPSBsYXRMb25nUGFpci5sYXRpdHVkZTsKKwkJCQlkYXRhW2ldW1NlZ21lbnQuTE9OR0lUVURFX0lOREVYXSA9IGxhdExvbmdQYWlyLmxvbmdpdHVkZTsKKwkJCQlpKys7CisJCQl9CisJCQlyZXR1cm4gbmV3IFNlZ21lbnQoZGF0YSk7CisJCX0gLy8gdG9TZWdtZW50CisKKwkJLyoqCisJCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJLy8gQW55IGxhdGl0dWRlL2xvbmdpdHVkZSBwYWlycz8KKwkJCWlmIChzaXplKCkgPiAwKSB7CisJCQkJc2IuYXBwZW5kKGNvbGxlY3RlZFBhaXJzLmdldCgwKS50b1N0cmluZygpKTsKKwkJCQkvLyBNb3JlIHRoYW4gMj8KKwkJCQlpZiAoc2l6ZSgpID4gMikgeworCQkJCQkvLyBZZXMKKwkJCQkJc2IuYXBwZW5kKCIuLi48IiArIChzaXplKCkgLSAyKSArICI+Li4uIik7CisJCQkJfQorCQkJCS8vIFdlcmUgdGhlcmUgYXQgbGVhc3QgdHdvPworCQkJCWlmIChzaXplKCkgPiAxKSB7CisJCQkJCS8vIFllcworCQkJCQlzYi5hcHBlbmQoY29sbGVjdGVkUGFpcnMuZ2V0KHNpemUoKSAtIDEpLnRvU3RyaW5nKCkpOworCQkJCX0KKwkJCX0gLy8gaWYgYW55IHBhaXJzCisKKwkJCXJldHVybiBzYi50b1N0cmluZygpOworCQl9IC8vIHRvU3RyaW5nCisKKwkJLyoqCisJCSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGxhdGl0dWRlL2xvbmdpdHVkZSBkYXRhIHBhaXIuCisJCSAqLworCQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMYXRMb25nUGFpciB7CisJCQlkb3VibGUgbGF0aXR1ZGUgPSAwLjA7CisKKwkJCWRvdWJsZSBsb25naXR1ZGUgPSAwLjA7CisKKwkJCS8qKgorCQkJICogQHBhcmFtIGxhdAorCQkJICogQHBhcmFtIGxuZworCQkJICovCisJCQlwcm90ZWN0ZWQgTGF0TG9uZ1BhaXIoZmluYWwgZG91YmxlIGxhdGl0dWRlLCBmaW5hbCBkb3VibGUgbG9uZ2l0dWRlKSB7CisJCQkJc3VwZXIoKTsKKwkJCQlhc3NlcnQgbG9uZ2l0dWRlID49IC0xODAuMCAmJiBsb25naXR1ZGUgPD0gMTgwLjA7CisJCQkJYXNzZXJ0IGxhdGl0dWRlID49IC05MC4wICYmIGxhdGl0dWRlIDw9IDkwLjA7CisJCQkJdGhpcy5sYXRpdHVkZSA9IGxhdGl0dWRlOworCQkJCXRoaXMubG9uZ2l0dWRlID0gbG9uZ2l0dWRlOworCQkJfSAvLyBMYXRMb25nUGFpcgorCisJCQkvKioKKwkJCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCisJCQkgKi8KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlmaW5hbCBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQkJc2IuYXBwZW5kKGZvcm1hdExhdExuZ1ZhbHVlKGxhdGl0dWRlKSk7CisJCQkJc2IuYXBwZW5kKCIsICIpOworCQkJCXNiLmFwcGVuZChmb3JtYXRMYXRMbmdWYWx1ZShsb25naXR1ZGUpKTsKKwkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwkJCX0KKworCQl9IC8vIExhdExvbmdQYWlyCisJfSAvLyBTZWdtZW50QnVpbGRlcgorCisJLyoqCisJICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2YgbGF0aXR1ZGUvbG9uZ2l0dWRlIGRhdGEgcGFpcnMuIEEKKwkgKiBzZWdtZW50IGNvdWxkIGZvcm0gYSBjbG9zZWQgcG9seWdvbiBvciBpdCBjb3VsZCBiZSBhIHBhdGguCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBTZWdtZW50IHsKKworCQkvLyBJbiBhIHR3byBlbGVtZW50IGFycmF5IHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBsYXRpdHVkZSB2YWx1ZQorCQlzdGF0aWMgZmluYWwgaW50IExBVElUVURFX0lOREVYID0gMDsKKworCQkvLyBJbiBhIHR3byBlbGVtZW50IGFycmF5IHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBsb25naXR1ZGUgdmFsdWUKKwkJc3RhdGljIGZpbmFsIGludCBMT05HSVRVREVfSU5ERVggPSAxOworCisJCS8qKgorCQkgKiBUaGUgbGF0aXR1ZGUvbG9uZ2l0dWRlIGRhdGEgcGFpcnMuCisJCSAqLworCQlwcml2YXRlIGRvdWJsZVtdW10gZGF0YSA9IG51bGw7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBkYXRhCisJCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgbGF0aXR1ZGUvbG9uZ2l0dWRlIHBhaXJzCisJCSAqLworCQlwdWJsaWMgU2VnbWVudChmaW5hbCBkb3VibGVbXVtdIGRhdGEpIHsKKwkJCXRoaXMuZGF0YSA9IGRhdGE7CisJCX0gLy8gU2VnbWVudAorCisJCS8qKgorCQkgKiBAcGFyYW0gaQorCQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZGF0YSBwYWlyCisJCSAqIEByZXR1cm4gdGhlIGxhdGl0dWRlIHZhbHVlIG9mIHRoZSBpJ3RoIGxhdGl0dWRlL2xvbmdpdHVkZSBkYXRhIHBhaXIKKwkJICovCisJCXB1YmxpYyBkb3VibGUgbGF0aXR1ZGUoZmluYWwgaW50IGkpIHsKKwkJCXJldHVybiBkYXRhW2ldW0xBVElUVURFX0lOREVYXTsKKwkJfSAvLyBsYXRpdHVkZQorCisJCS8qKgorCQkgKiBAcGFyYW0gaQorCQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgbGF0aXR1ZGUvbG9uZ2l0dWRlIGRhdGEgcGFpcgorCQkgKiBAcmV0dXJuIHRoZSBsb25naXR1ZGUgdmFsdWUgb2YgdGhlIGkndGggbGF0aXR1ZGUvbG9uZ2l0dWRlIGRhdGEgcGFpcgorCQkgKi8KKwkJcHVibGljIGRvdWJsZSBsb25naXR1ZGUoZmluYWwgaW50IGkpIHsKKwkJCXJldHVybiBkYXRhW2ldW0xPTkdJVFVERV9JTkRFWF07CisJCX0gLy8gbG9uZ2l0dWRlCisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YSBwYWlycworCQkgKi8KKwkJcHVibGljIGludCBzaXplKCkgeworCQkJcmV0dXJuIGRhdGEubGVuZ3RoOworCQl9IC8vIHNpemUKKworCQkvKioKKwkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VxdWVuY2Ugb2YgbGF0L2xvbmcgcGFpcnMgZm9ybSBhCisJCSAqICAgICAgICAgY2xvc2VkIHBvbHlnb24sIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3RoZXJ3aXNlLgorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaXNQb2x5Z29uKCkgeworCQkJZmluYWwgaW50IHNpemUgPSBkYXRhLmxlbmd0aDsKKwkJCXJldHVybiBzaXplID4gMiAmJiBkYXRhWzBdWzBdID09IGRhdGFbc2l6ZSAtIDFdWzBdCisJCQkJCSYmIGRhdGFbMF1bMV0gPT0gZGF0YVtzaXplIC0gMV1bMV07CisJCX0gLy8gaXNQb2x5Z29uCisKKwkJLyoqCisJCSAqIEByZXR1cm4gY3JlYXRlIGEgVVJJIHN0cmluZyB0aGUgZW5jb2RlcyB0aGUgbGF0aXR1ZGUvbG9uZ2l0dWRlIHZhbHVlcworCQkgKi8KKwkJcHVibGljIFN0cmluZyB0b0lubGluZVVSSVN0cmluZygpIHsKKwkJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKKwkJCQlzYi5hcHBlbmQoZm9ybWF0TGF0TG5nVmFsdWUoZGF0YVtpXVtMQVRJVFVERV9JTkRFWF0pKTsKKwkJCQlzYi5hcHBlbmQoIiwiKTsKKwkJCQlzYi5hcHBlbmQoZm9ybWF0TGF0TG5nVmFsdWUoZGF0YVtpXVtMT05HSVRVREVfSU5ERVhdKSk7CisJCQkJLy8gQW55IG1vcmUgdmFsdWVzPworCQkJCWlmIChpIDwgZGF0YS5sZW5ndGggLSAxKSB7CisJCQkJCS8vIFllcworCQkJCQlzYi5hcHBlbmQoIiwiKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwkJfSAvLyB0b0lubGluZVVSSVN0cmluZworCisJCS8qKgorCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKwkJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJLy8gQW55IGxhdGl0dWRlL2xvbmdpdHVkZSBwYWlycz8KKwkJCWlmIChkYXRhLmxlbmd0aCA+IDApIHsKKwkJCQkvLyBZZXMKKwkJCQlzYi5hcHBlbmQoZm9ybWF0TGF0TG5nVmFsdWUoZGF0YVswXVtMQVRJVFVERV9JTkRFWF0pKTsKKwkJCQlzYi5hcHBlbmQoIiwiKTsKKwkJCQlzYi5hcHBlbmQoZm9ybWF0TGF0TG5nVmFsdWUoZGF0YVswXVtMT05HSVRVREVfSU5ERVhdKSk7CisKKwkJCQkvLyBNb3JlIHRoYW4gMj8KKwkJCQlpZiAoZGF0YS5sZW5ndGggPiAyKSB7CisJCQkJCS8vIFllcworCQkJCQlzYi5hcHBlbmQoIi4uLjwiICsgKGRhdGEubGVuZ3RoIC0gMikgKyAiPi4uLiIpOworCQkJCX0KKwkJCQkvLyBXZXJlIHRoZXJlIGF0IGxlYXN0IHR3bz8KKwkJCQlpZiAoZGF0YS5sZW5ndGggPiAxKSB7CisJCQkJCS8vIFllcworCQkJCQlzYi5hcHBlbmQoZm9ybWF0TGF0TG5nVmFsdWUoCisJCQkJCQkJZGF0YVtkYXRhLmxlbmd0aCAtIDFdW0xBVElUVURFX0lOREVYXSkpOworCQkJCQlzYi5hcHBlbmQoIiwiKTsKKwkJCQkJc2IuYXBwZW5kKGZvcm1hdExhdExuZ1ZhbHVlKAorCQkJCQkJCWRhdGFbZGF0YS5sZW5ndGggLSAxXVtMT05HSVRVREVfSU5ERVhdKSk7CisJCQkJfQorCisJCQl9IC8vIGlmIGFueSBwYWlycworCisJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwkJfSAvLyB0b1N0cmluZworCisJCS8qKgorCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisKKwkJCWRvdWJsZSBzdW0gPSAxLjA7CisJCQlmb3IgKGZpbmFsIGRvdWJsZVtdIGVsZW1lbnQgOiBkYXRhKSB7CisJCQkJc3VtICs9IE1hdGguYWJzKGVsZW1lbnRbMF0gKyBlbGVtZW50WzFdKTsKKwkJCX0KKworCQkJLy8kQU5BTFlTSVMtSUdOT1JFCisJCQlmaW5hbCBpbnQgdGVtcCA9ICgoaW50KSBzdW0pICogMzE7CisKKwkJCXJldHVybiB0ZW1wICsgZGF0YS5sZW5ndGg7CisJCQkvLyBmaW5hbCBpbnQgUFJJTUUgPSAzMTsKKwkJCS8vIGludCByZXN1bHQgPSAxOworCQkJLy8gcmVzdWx0ID0gUFJJTUUgKiByZXN1bHQgKyBBcnJheXMuaGFzaENvZGUoZGF0YSk7CisJCQkvLyByZXR1cm4gcmVzdWx0OworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgeworCQkJaWYgKHRoaXMgPT0gb2JqKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlpZiAob2JqID09IG51bGwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWZpbmFsIFNlZ21lbnQgb3RoZXIgPSAoU2VnbWVudCkgb2JqOworCisJCQlpZiAoZGF0YS5sZW5ndGggIT0gb3RoZXIuZGF0YS5sZW5ndGgpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWZvciAoZmluYWwgZG91YmxlW10gZWxlbWVudCA6IGRhdGEpIHsKKwkJCQlpZiAoZWxlbWVudFtMQVRJVFVERV9JTkRFWF0gIT0gZWxlbWVudFtMQVRJVFVERV9JTkRFWF0pIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlpZiAoZWxlbWVudFtMT05HSVRVREVfSU5ERVhdICE9IGVsZW1lbnRbTE9OR0lUVURFX0lOREVYXSkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCisJCQkvLyBpZiAoIUFycmF5cy5lcXVhbHMoZGF0YSwgb3RoZXIuZGF0YSkpCisJCQkvLyByZXR1cm4gZmFsc2U7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJfSAvLyBTZWdtZW50CisKK30gLy8gTGF0TG9uZwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9MYXRMb25nRGF0YVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3NwYXRpYWwvZ2VvL0xhdExvbmdEYXRhUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQ2ZWRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9MYXRMb25nRGF0YVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLy8gTGF0TG9uZ0RhdGFQcm92aWRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW87CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBleHRlbmRlZCBieSBjbGFzc2VzIHRoYXQgY2FuIGludGVycHJldCBhICJkYXRhIHVyaSIgYXMKKyAqIGNvbnRhaW5lZCBpbiBhICJzdGVtc3BhdGlhbCIgVVJJIGFuZCByZXR1cm4gbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBkYXRhIGZyb20KKyAqIHRoZSBzb3VyY2Ugc3BlY2lmaWVkIGJ5IHRoZSBVUkkuIFRoZSB7QGxpbmsgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlcn0gbWFpbnRhaW5zCisgKiBhIHN0YXRpYyBzaW5nbGV0b24gY29sbGVjdGlvbiBvZiBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiBUaGUKKyAqIGNvbGxlY3Rpb24gaXMgaW5kZXhlZCBieSB0aGUgc2NoZW1lIG9mIHRoZSBVUkkgdGhleSBoYW5kbGUuIEl0IHVzZXMgdGhpcworICogY29sbGVjdGlvbiB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSBpbnN0YW5jZSBmb3IgdGhlIFVSSSdzIGl0IGVuY291bnRlcnMgdGhhdAorICogbmVlZCB0byBiZSBwcm9jZXNzZWQuIFRoYXQgcHJvY2Vzc2luZyBpcyBkZWxlZ2F0ZWQgdG8gY2xhc3NlcyB0aGF0IGV4dGVuZAorICogdGhpcyBpbnRlcmZhY2UuCisgKiA8cD4KKyAqIFRodXMsIGlmIHlvdSBleHRlbmQgdGhpcyBpbnRlcmZhY2UgeW91IHNob3VsZCBhbHNvIHJlZ2lzdGVyIGFuIGluc3RhbmNlIG9mCisgKiB5b3VyIGNsYXNzIHdpdGggdGhlIG1ldGhvZAorICoge0BsaW5rIExhdExvbmdQcm92aWRlckFkYXB0ZXIjcmVnaXN0ZXJMYXRMb25nRGF0YVByb3ZpZGVyKFN0cmluZywgTGF0TG9uZ0RhdGFQcm92aWRlcil9LgorICogCisgKiBAc2VlIExhdExvbmdQcm92aWRlckFkYXB0ZXIKKyAqLworcHVibGljIGludGVyZmFjZSBMYXRMb25nRGF0YVByb3ZpZGVyIHsKKworCS8qKgorCSAqIEBwYXJhbSBkYXRhVVJJCisJICogICAgICAgICAgICB0aGUgZGF0YSBVUkkgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoaXMgcHJvdmlkZXIKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBhcnJheXMgb2YgbGF0aXR1ZGUvbG9uZ2l0dWRlIHBhaXJzLgorCSAqLworCUxhdExvbmcgZ2V0TGF0TG9uZyhVUkkgZGF0YVVSSSk7CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBqdXN0IGxpa2Uge0BsaW5rICNnZXRMYXRMb25nKFVSSSl9IGV4Y2VwdCB0aGF0IGl0IHdpbGwKKwkgKiBpbW1lZGlhdGVseSByZXR1cm4gd2l0aCBhbiBlbXB0eSB7QGxpbmsgTGF0TG9uZ30gaW5zdGFuY2UgaWYgdGhlIGRhdGEKKwkgKiBpZGVudGlmaWVkIGJ5IHRoZSBVUkkgaGFzIG5vdCBiZWVuIHJldHJpZXZlZC4gQXMgYSBzaWRlIGVmZmVjdCwgaXQgd2lsbAorCSAqIGNyZWF0ZSBhIHNlcGFyYXRlIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2J9IChpLmUuLAorCSAqIDxjb2RlPlRocmVhZDwvY29kZT4pIHRvIHJldHJpZXZlIHRoZSBkYXRhLiBJZiB0aGF0CisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYn0gY29tcGxldGVzIHN1Y2Nlc3NmdWxseSwgYQorCSAqIGZ1dHVyZSBjYWxsIHdpbGwgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBkYXRhLgorCSAqIAorCSAqIEBwYXJhbSBkYXRhVVJJCisJICogICAgICAgICAgICB0aGUgZGF0YSBVUkkgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoaXMgcHJvdmlkZXIKKwkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIGxhdGl0dWRlL2xvbmdpdHVkZSBkYXRhLgorCSAqLworCUxhdExvbmcgZ2V0TGF0TG9uZ05vV2FpdChVUkkgZGF0YVVSSSk7CisKK30gLy8gTGF0TG9uZ0RhdGFQcm92aWRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9MYXRMb25nUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vTGF0TG9uZ1Byb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFiNGRjMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vTGF0TG9uZ1Byb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLy8gTGF0TG9uZ1Byb3ZpZGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlbzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuU3BhdGlhbFByb3ZpZGVyOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCBwcm92aWRlIExhdGl0dWRlIGFuZCBMb25naXR1ZGUKKyAqIGRhdGEuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTGF0TG9uZ1Byb3ZpZGVyIGV4dGVuZHMgU3BhdGlhbFByb3ZpZGVyIHsKKworCS8qKgorCSAqIEByZXR1cm4gbGF0aXR1ZGUvbG9uZ2l0dWRlIGRhdGEuCisJICovCisJTGF0TG9uZyBnZXRMYXRMb25nKCk7CisKKwkvKioKKwkgKiBUaGlzIGlzIGp1c3QgbGlrZSB7QGxpbmsgI2dldExhdExvbmcoKX0gZXhjZXB0IHRoYXQgaXQgcmV0dXJucyBhbiBlbXB0eQorCSAqIGluc3RhbmNlIG9mIHtAbGluayBMYXRMb25nfSBpZiB0aGUgZGF0YSBoYXMgbm90IGJlZW4gcmV0cmlldmVkIHlldC4gQXMgYQorCSAqIHNpZGUgZWZmZWN0LCBpdCBpbW1lZGlhdGVseSBzY2hlZHVsZXMgYQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2J9IHRvIHJldHJpZXZlIHRoZSBkYXRhLiBBcyBzdWNoLAorCSAqIGEgZnV0dXJlIGNhbGwgbWlnaHQgcHJvZHVjZSBhIGZ1bGx5IHBvcHVsYXRlZCByZXN1bHQuCisJICogCisJICogQHJldHVybiBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YS4KKwkgKi8KKwlMYXRMb25nIGdldExhdExvbmdOb1dhaXQoKTsKKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgTGF0aXR1ZGUgYW5kIExvbmdpdHVkZSB2YWx1ZXMgZm9yIHRoZSBhZGFwdGVkCisJICogb2JqZWN0LCBpZiBzdWNoIGV4aXN0cy4gCisJICogQHJldHVybiBMYXRpdHVkZSBhbmQgTG9uZ2l0dWRlIHZhbHVlcyBmb3IgdGhlIGFkYXB0ZWQgb2JqZWN0CisJICovCisJZG91YmxlW10gZ2V0Q2VudGVyKCk7CisKK30gLy8gTGF0TG9uZ1Byb3ZpZGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3NwYXRpYWwvZ2VvL0xhdExvbmdQcm92aWRlckFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZjVkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3NwYXRpYWwvZ2VvL0xhdExvbmdQcm92aWRlckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDM2MSBAQAorLy8gTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW87CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5TcGF0aWFsUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZy5TZWdtZW50OworCisvKioKKyAqIFRoaXMgY2xhc3MgYWRhcHRzIDxjb2RlPklkZW50aWZpYWJsZTwvY29kZT4ncyB0bworICogPGNvZGU+TGF0TG9uZ1Byb3ZpZGVyPC9jb2RlPidzLiBJdCBleHRyYWN0cyB0aGUgbGF0L2xvbmcgZGF0YSBieSBleGFtaW5pbmcKKyAqIHRoZSA8ZW0+c3BhdGlhbDwvZW0+IGF0dHJpYnV0ZSBvZiBhbiA8Y29kZT5JZGVudGlmaWFibGU8L2NvZGU+J3MgZHVibGluCisgKiBjb3JlIGluc3RhbmNlLiBUeXBpY2FsbHksIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHdpbGwgYmUgcmVjb2duaXplZCBieQorICogdGhlIGFkYXB0ZXIgYW5kIHRoZSB2YWx1ZXMgcmV0dXJuZWQuIElmIHRoZSBhdHRyaWJ1dGUgZG9lcyBub3QgaGF2ZSBhIHZhbHVlCisgKiBvciB0aGUgZm9ybWF0IG9mIHRoZSB2YWx1ZSBpcyBub3QgcmVjb2duaXplZCwgdGhlbiBhbiBlbXB0eSBsaXN0IHdpbGwgYmUKKyAqIHJldHVybmVkLgorICogPHA+CisgKiBUaGUgZm9ybWF0IHJlY29nbml6ZWQgYnkgdGhlIGFkYXB0ZXIgaXMgYSBVUkkgd2l0aCB0aGUgc2NoZW1lIGRlZmluZWQgYnkgdGhlCisgKiBjb25zdGFudCB7QGxpbmsgI1NURU1fU1BBVElBTF9TQ0hFTUUgU1RFTV9TUEFUSUFMX1NDSEVNRX0KKyAqIAorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZQorICovCitwdWJsaWMgY2xhc3MgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlciBleHRlbmRzIFNwYXRpYWxQcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cworCQlMYXRMb25nUHJvdmlkZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgTWFwPElkZW50aWZpYWJsZSwgTGF0TG9uZz4gaWRlbnRpZmlhYmxlTGF0TG9uZ0NhY2hlID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPElkZW50aWZpYWJsZSwgTGF0TG9uZz4oKTsKKwlwcml2YXRlIHN0YXRpYyBNYXA8SWRlbnRpZmlhYmxlLCBkb3VibGVbXT4gaWRlbnRpZmlhYmxlQ2VudGVyQ2FjaGUgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8SWRlbnRpZmlhYmxlLCBkb3VibGVbXT4oKTsKKworCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIExhdExvbmdEYXRhUHJvdmlkZXI+IGxhdExvbmdEYXRhUHJvdmlkZXJzID0gbnVsbDsKKworCS8qKgorCSAqIEFkZCB0aGUgbGF0TG9uZ0RhdGFQcm92aWRlciB0byB0aGUgY29sbGVjdGlvbiBvZiBhdmFpbGFibGUgdG8gdGhpcworCSAqIGFkYXB0ZXIKKwkgKiAKKwkgKiBAcGFyYW0gc2NoZW1lCisJICogICAgICAgICAgICB0aGUga2V5IG9mIHRoZSBVUkkncyB0aGF0IHRoZSBkYXRhIHByb3ZpZGVyIHByb2Nlc3NlcworCSAqIEBwYXJhbSBsYXRMb25nRGF0YVByb3ZpZGVyCisJICogICAgICAgICAgICB0aGUgZGF0YSBwcm92aWRlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckxhdExvbmdEYXRhUHJvdmlkZXIoZmluYWwgU3RyaW5nIHNjaGVtZSwKKwkJCWZpbmFsIExhdExvbmdEYXRhUHJvdmlkZXIgbGF0TG9uZ0RhdGFQcm92aWRlcikgeworCQlnZXRMYXRMb25nRGF0YVByb3ZpZGVycygpLnB1dChzY2hlbWUsIGxhdExvbmdEYXRhUHJvdmlkZXIpOworCX0gLy8gcmVnaXN0ZXJMYXRMb25nRGF0YVByb3ZpZGVyCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBtYXAgYmV0d2VlbiBzY2hlbWUncyBhbmQgdGhlaXIgbGF0L2xvbmcgZGF0YSBwcm92aWRlcnMKKwkgKi8KKwlzeW5jaHJvbml6ZWQgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBMYXRMb25nRGF0YVByb3ZpZGVyPiBnZXRMYXRMb25nRGF0YVByb3ZpZGVycygpIHsKKwkJLy8gSGFzIHRoZSBoYXMgTWFwIGJlZW4gYWxsb2NhdGVkIHlldD8KKwkJaWYgKGxhdExvbmdEYXRhUHJvdmlkZXJzID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQlsYXRMb25nRGF0YVByb3ZpZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGF0TG9uZ0RhdGFQcm92aWRlcj4oKTsKKworCQkJLy8gV2UncmUgZG9pbmcgdGhpcyBoZXJlIGJlY2F1c2UgdGhlIHN0YXRpYyBpbml0aWFsaXplciBpbgorCQkJLy8gSW5saW5lTGF0TG9uZ0RhdGFQcm92aWRlciBpc24ndCBiZWluZyBjYWxsZWQuCisJCQlsYXRMb25nRGF0YVByb3ZpZGVycy5wdXQoSW5saW5lTGF0TG9uZ0RhdGFQcm92aWRlci5JTkxJTkVfU0NIRU1FLAorCQkJCQluZXcgSW5saW5lTGF0TG9uZ0RhdGFQcm92aWRlcigpKTsKKwkJCWxhdExvbmdEYXRhUHJvdmlkZXJzLnB1dCgKKwkJCQkJUGxhdGZvcm1MYXRMb25nRGF0YVByb3ZpZGVyLlBMQVRGT1JNX1NDSEVNRSwKKwkJCQkJbmV3IFBsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlcigpKTsKKwkJfQorCQlyZXR1cm4gbGF0TG9uZ0RhdGFQcm92aWRlcnM7CisJfSAvLyBnZXRMYXRMb25nRGF0YVByb3ZpZGVycworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKGZpbmFsIE9iamVjdCB0eXBlKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSB0eXBlID09IExhdExvbmdQcm92aWRlci5jbGFzczsKKwkJLy8gVHJ5IHRvIHRoZSBzdXBlciBjbGFzcz8KKwkJaWYgKCFyZXRWYWx1ZSkgeworCQkJLy8gWWVzCisJCQlyZXRWYWx1ZSA9IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSk7CisJCX0gLy8gaWYKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gaXNBZGFwdGVyRm9yVHlwZQorCisJLyoqCisJICogQHJldHVybiB0aGUgbGF0L2xvbmcgdmFsdWUKKwkgKi8KKwlwdWJsaWMgTGF0TG9uZyBnZXRMYXRMb25nKCkgeworCQlmaW5hbCBJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlID0gKElkZW50aWZpYWJsZSkgZ2V0VGFyZ2V0KCk7CisJCUxhdExvbmcgcmV0VmFsdWUgPSBpZGVudGlmaWFibGVMYXRMb25nQ2FjaGUuZ2V0KGlkZW50aWZpYWJsZSk7CisKKwkJLy8gRG8gd2UgaGF2ZSBhIHZhbHVlIGluIHRoZSBjYWNoZT8KKwkJaWYgKHJldFZhbHVlID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQlyZXRWYWx1ZSA9IG5ldyBMYXRMb25nKCk7CisKKwkJCS8vIEZpcnN0IGxldCdzIGdldCB0aGUgdmFsdWUgb2YgdGhlIHNwYXRpYWwgYXR0cmlidXRlIG9mIHRoZQorCQkJLy8gSWRlbnRpZmlhYmxlLCBpZiB0aGVyZSBpcyBvbmUuCisJCQlmaW5hbCBTdHJpbmcgc3BhdGlhbFZhbHVlID0gaWRlbnRpZmlhYmxlLmdldER1YmxpbkNvcmUoKQorCQkJCQkuZ2V0U3BhdGlhbCgpOworCQkJLy8gSXMgdGhlcmUgYSBzcGF0aWFsIHZhbHVlIGZvciB0aGlzIElkZW50aWZpYWJsZSBhbmQgZG9lcyBpdCBzdGFydAorCQkJLy8gd2l0aCB0aGUgY29ycmVjdCBwcmVmaXg/CisJCQlpZiAoc3BhdGlhbFZhbHVlICE9IG51bGwKKwkJCQkJJiYgc3BhdGlhbFZhbHVlCisJCQkJCQkJLnN0YXJ0c1dpdGgoU3BhdGlhbFByb3ZpZGVyQWRhcHRlci5TVEVNX1NQQVRJQUxfU0NIRU1FX1BSRUZJWCkpIHsKKwkJCQkvLyBZZXMKKwkJCQkvLyBUcnkgdG8gaW50ZXJwcmV0IGl0IGJ5IHBhcnNpbmcgaXQgYXMgYSBVUkkKKwkJCQl0cnkgeworCQkJCQkvLyBUaGlzIGlzIHdoZXJlIGl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRvIGdldCBmYW5jeSB3aXRoCisJCQkJCS8vIGludGVycHJldGluZyB0aGUgVVJJLiBUaGUgZm9ybWF0IGlzCisJCQkJCS8vICJzdGVtc3BhdGlhbDpkYXRhVVJJIi4KKwkJCQkJLy8gV2hlcmUgImRhdGFVUkkiIGlzIHRoZSByZWFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGRhdGEuCisJCQkJCS8vIEZvciBleGFtcGxlIHdlIG1pZ2h0IGhhdmUKKwkJCQkJLy8gInN0ZW1wc3BhdGlhbDppbmxpbmU6Ly8vMTIwLjAsMTAxLjAsMTIwLjAsMTIwLjAiIHdoaWNoCisJCQkJCS8vIHdvdWxkIGRpcmVjdGx5IChpLmUuLCAiaW5saW5lIikgZGVmaW5lIHRoZSBkYXRhIGZvciBhCisJCQkJCS8vIGxpbmUgYmV0d2VlbiB0d28gcG9pbnRzIG9uIHRoZSBFYXJ0aCdzIHN1cmZhY2UgZnJvbQorCQkJCQkvLyAiMTIwLjBXLAorCQkJCQkvLyAxMDEuME4iIHRvICIxMjAuMFcsIDEyMC4wTiIuIE9yLAorCQkJCQkvLyAic3RlbXNwYXRpYWw6cGxhdGZvcm06Ly8vZm9vL2RhdGEvYmFyLmdtbCIgd2hpY2ggd291bGQKKwkJCQkJLy8gc3BlY2lmeSBhIGZpbGUgY29udGFpbmluZyB0aGUgZGF0YS4KKworCQkJCQlmaW5hbCBVUkkgZGF0YVVSSSA9IGV4dHJhY3REYXRhVVJJKHNwYXRpYWxWYWx1ZSk7CisKKwkJCQkJLy8gV2VyZSB3ZSBzdWNjZXNzZnVsIGluIGV4dHJhY3RpbmcgYSBVUkkgZnJvbSB0aGUgc3RyaW5nPworCQkJCQlpZiAoZGF0YVVSSSAhPSBudWxsKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCS8vIFRoaXMgY2FsbCB3aWxsIGF0dGVtcHQgdG8gZmluZCBzb21ldGhpbmcgdGhhdCBjYW4KKwkJCQkJCS8vIHVuZGVyc3RhbmQgdGhlIGRhdGFVUkkgYW5kIGNvbWUgdXAgd2l0aCBsYXQvbG9uZyBkYXRhCisJCQkJCQkvLyBpZiBpdCBjYW4sIG90aGVyd2lzZSBpZiBpdCBjYW4gYmUgaW50ZXJwcmV0ZWQsIGEKKwkJCQkJCS8vIG1lc3NhZ2UKKwkJCQkJCS8vIGlzIGRyb3BwZWQgaW50byB0aGUgbG9nIGFuZCBhbiBlbXB0eSBsaXN0IHdpbGwgYmUKKwkJCQkJCS8vIHJldHVybmVkCisJCQkJCQlyZXRWYWx1ZSA9IGdldExhdExvbmcoZGF0YVVSSSk7CisJCQkJCQlpZiAocmV0VmFsdWUgIT0gbnVsbCkgeworCQkJCQkJCWlkZW50aWZpYWJsZUxhdExvbmdDYWNoZQorCQkJCQkJCQkJLnB1dChpZGVudGlmaWFibGUsIHJldFZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvLyBlbHNlIHRoZSBwcm9ibGVtIHdhcyBsb2dnZWQgc28ganVzdCBpZ25vcmUgYW5kIHJldHVybiBhbgorCQkJCQkvLyBlbXB0eSBsaXN0CisJCQkJfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gV2UgZ2V0IGhlcmUgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIHNwYXRpYWwgYXR0cmlidXRlIGlzbid0CisJCQkJCS8vIHNvbWV0aGluZyB3ZSB1bmRlcnN0YW5kIHNvIHdlJ3JlIGRvbmUsIHdlJ2xsIGp1c3QgcmV0dXJuCisJCQkJCS8vIGFuCisJCQkJCS8vIGVtcHR5IGNvbGxlY3Rpb24uCisJCQkJfQorCisJCQl9IC8vIGlmIHNwYXRpYWwgdmFsdWUKKwkJfSAvLyBpZiB2YWx1ZSBpbiBjYWNoZQorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldExhdExvbmcKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGxhdC9sb25nIHZhbHVlCisJICovCisJcHVibGljIExhdExvbmcgZ2V0TGF0TG9uZ05vV2FpdCgpIHsKKworCQlmaW5hbCBJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlID0gKElkZW50aWZpYWJsZSkgZ2V0VGFyZ2V0KCk7CisJCUxhdExvbmcgcmV0VmFsdWUgPSBpZGVudGlmaWFibGVMYXRMb25nQ2FjaGUuZ2V0KGlkZW50aWZpYWJsZSk7CisKKwkJLy8gRG8gd2UgaGF2ZSBhIHZhbHVlIGluIHRoZSBjYWNoZT8KKwkJaWYgKHJldFZhbHVlID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQlyZXRWYWx1ZSA9IG5ldyBMYXRMb25nKCk7CisKKwkJCWZpbmFsIFN0cmluZyBzcGF0aWFsVmFsdWUgPSBpZGVudGlmaWFibGUuZ2V0RHVibGluQ29yZSgpCisJCQkJCS5nZXRTcGF0aWFsKCk7CisJCQkvLyBJcyB0aGVyZSBhIHNwYXRpYWwgdmFsdWUgZm9yIHRoaXMgSWRlbnRpZmlhYmxlIGFuZCBkb2VzIGl0IHN0YXJ0CisJCQkvLyB3aXRoIHRoZSBjb3JyZWN0IHByZWZpeD8KKwkJCWlmIChzcGF0aWFsVmFsdWUgIT0gbnVsbAorCQkJCQkmJiBzcGF0aWFsVmFsdWUKKwkJCQkJCQkuc3RhcnRzV2l0aChTcGF0aWFsUHJvdmlkZXJBZGFwdGVyLlNURU1fU1BBVElBTF9TQ0hFTUVfUFJFRklYKSkgeworCQkJCS8vIFllcworCQkJCS8vIFRyeSB0byBpbnRlcnByZXQgaXQgYnkgcGFyc2luZyBpdCBhcyBhIFVSSQorCQkJCXRyeSB7CisJCQkJCS8vIFRoaXMgaXMgd2hlcmUgaXQgbWlnaHQgYmUgcG9zc2libGUgdG8gZ2V0IGZhbmN5IHdpdGgKKwkJCQkJLy8gaW50ZXJwcmV0aW5nIHRoZSBVUkkuIFRoZSBmb3JtYXQgaXMKKwkJCQkJLy8gInN0ZW1zcGF0aWFsOmRhdGFVUkkiLiBXaGVyZSAiZGF0YVVSSSIgaXMgdGhlIHJlYWwKKwkJCQkJLy8gc3BlY2lmaWNhdGlvbiBvZiB0aGUgZGF0YS4gRm9yIGV4YW1wbGUgd2UgbWlnaHQgaGF2ZQorCQkJCQkvLyAic3RlbXBzcGF0aWFsOmlubGluZTovLy8xMjAuMCwxMDEuMCwxMjAuMCwxMjAuMCIgd2hpY2gKKwkJCQkJLy8gd291bGQgZGlyZWN0bHkgKGkuZS4sICIiKSBkZWZpbmUgdGhlIGRhdGEgZm9yIGEKKwkJCQkJLy8gbGluZSBiZXR3ZWVuIHR3byBwb2ludHMgb24gdGhlIEVhcnRoJ3Mgc3VyZmFjZSBmcm9tCisJCQkJCS8vICIxMjAuMFcsIDEwMS4wTiIgdG8gIjEyMC4wVywgMTIwLjBOIi4gT3IsCisJCQkJCS8vICJzdGVtc3BhdGlhbDpwbGF0Zm9ybTovLy9mb28vZGF0YS9iYXIuZ21sIiB3aGljaCB3b3VsZAorCQkJCQkvLyBzcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIHRoZSBkYXRhLgorCisJCQkJCWZpbmFsIFVSSSBkYXRhVVJJID0gZXh0cmFjdERhdGFVUkkoc3BhdGlhbFZhbHVlKTsKKworCQkJCQkvLyBXZXJlIHdlIHN1Y2Nlc3NmdWwgaW4gZXh0cmFjdGluZyBhIFVSSSBmcm9tIHRoZSBzdHJpbmc/CisJCQkJCWlmIChkYXRhVVJJICE9IG51bGwpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJLy8gVGhpcyBjYWxsIHdpbGwgYXR0ZW1wdCB0byBmaW5kIHNvbWV0aGluZyB0aGF0IGNhbgorCQkJCQkJLy8gdW5kZXJzdGFuZCB0aGUgZGF0YVVSSSBhbmQgY29tZSB1cCB3aXRoIGxhdC9sb25nIGRhdGEKKwkJCQkJCS8vIGlmIGl0IGNhbiwgb3RoZXJ3aXNlIGlmIGl0IGNhbiBiZSBpbnRlcnByZXRlZCwgYQorCQkJCQkJLy8gbWVzc2FnZSBpcyBkcm9wcGVkIGludG8gdGhlIGxvZyBhbmQgYW4gZW1wdHkgbGlzdAorCQkJCQkJLy8gd2lsbCBiZSByZXR1cm5lZAorCQkJCQkJcmV0VmFsdWUgPSBnZXRMYXRMb25nTm9XYWl0KGRhdGFVUkkpOworCQkJCQkJaWYgKHJldFZhbHVlICE9IG51bGwpIHsKKwkJCQkJCQkvLyBJcyBpdCBlbXB0eT8KKwkJCQkJCQlpZiAocmV0VmFsdWUuc2l6ZSgpID4gMCkgeworCQkJCQkJCQkvLyBObworCQkJCQkJCQkvLyBXZSBkb24ndCBjYWNoZSBlbXB0eSB2YWx1ZXMgYmVjYXVzZSB0aGF0IGlzCisJCQkJCQkJCS8vIHdoYXQgaXMgcmV0dXJuZWQgYXMgYSB0ZW1wb3JhcnkgdmFsdWUgaW4KKwkJCQkJCQkJLy8gIk5vV2FpdCIgY2FsbHMuIEEgc2VwYXJhdGUgSm9iIG1pZ2h0IGJlCisJCQkJCQkJCS8vIHJlYWRpbmcgaW4gdGhlIHZhbHVlcyBmb3IgdGhlIGZ1dHVyZSBzbyBpZiB3ZQorCQkJCQkJCQkvLyBjYWNoZSBlbXB0eSB2YWx1ZXMgd2UnZCByZXR1cm4gdGhlbSBpbnN0ZWFkCisJCQkJCQkJCS8vIG9mIGdldHRpbmcgdGhlIHJlYWwgdmFsdWUgcmVhZCBpbiBsYXRlci4KKwkJCQkJCQkJaWRlbnRpZmlhYmxlTGF0TG9uZ0NhY2hlLnB1dChpZGVudGlmaWFibGUsCisJCQkJCQkJCQkJcmV0VmFsdWUpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvLyBlbHNlIHRoZSBwcm9ibGVtIHdhcyBsb2dnZWQgc28ganVzdCBpZ25vcmUgYW5kIHJldHVybiBhbgorCQkJCQkvLyBlbXB0eSB2YWx1ZQorCQkJCX0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIFdlIGdldCBoZXJlIHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBzcGF0aWFsIGF0dHJpYnV0ZSBpc24ndAorCQkJCQkvLyBzb21ldGhpbmcgd2UgdW5kZXJzdGFuZCBzbyB3ZSdyZSBkb25lLCB3ZSdsbCBqdXN0IHJldHVybgorCQkJCQkvLyBhbiBlbXB0eSBjb2xsZWN0aW9uLgorCQkJCX0KKworCQkJfSAvLyBpZiBzcGF0aWFsIHZhbHVlCisJCX0gLy8gaWYgdmFsdWUgbm90IGluIGNhY2hlCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldExhdExvbmdOb1dhaXQKKworCS8qKgorCSAqIEBwYXJhbSBzdGVtU3BhdGlhbFVSSQorCSAqICAgICAgICAgICAgYSBVUkkgd2l0aCBhICJzdGVtc3BhdGlhbCIgc2NoZW1lLiBUaGUgZm9ybWF0IG9mIHRoZSBVUkkgaXMKKwkgKiAgICAgICAgICAgICJzdGVtcHNwYXRpYWw6ZGF0YVVSSSIKKwkgKiBAc2VlIFNwYXRpYWxQcm92aWRlckFkYXB0ZXIjU1RFTV9TUEFUSUFMX1NDSEVNRQorCSAqIEByZXR1cm4gdGhlIGRhdGEgVVJJIGV4dHJhY3RlZCBmcm9tIHRoZSBzdGVtU3BhdGlhbFVSSQorCSAqLworCXByaXZhdGUgVVJJIGV4dHJhY3REYXRhVVJJKGZpbmFsIFN0cmluZyBzdGVtU3BhdGlhbFVSSVN0cmluZykgeworCQlVUkkgcmV0VmFsdWUgPSBudWxsOworCisJCXRyeSB7CisJCQlmaW5hbCBTdHJpbmcgZGF0YVVSSVN0cmluZyA9IHN0ZW1TcGF0aWFsVVJJU3RyaW5nCisJCQkJCS5zdWJzdHJpbmcoU3BhdGlhbFByb3ZpZGVyQWRhcHRlci5TVEVNX1NQQVRJQUxfU0NIRU1FX1BSRUZJWAorCQkJCQkJCS5sZW5ndGgoKSk7CisKKwkJCXJldFZhbHVlID0gVVJJLmNyZWF0ZVVSSShkYXRhVVJJU3RyaW5nKTsKKwkJfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiQmFkbHkgZm9ybWF0ZWQgc3BhdGlhbCBVUkkgXCIiCisJCQkJCSsgc3RlbVNwYXRpYWxVUklTdHJpbmcgKyAiXCIiLCBudWxsKTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBleHRyYWN0RGF0YVVSSQorCisJLyoqCisJICogQHBhcmFtIGRhdGFVUkkKKwkgKiAgICAgICAgICAgIHRoZSBVUkkgZXh0cmFjdGVkIGZyb20gYSBkdWJsaW4gY29yZSA8ZW0+c3BhdGlhbDwvZW0+CisJICogICAgICAgICAgICBhdHRyaWJ1dGUgdGhhdCBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIGxhdC9sb25nIGRhdGEKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBhcnJheXMgb2YgbGF0aXR1ZGUvbG9uZ2l0dWRlIHBhaXJzLgorCSAqLworCXByaXZhdGUgTGF0TG9uZyBnZXRMYXRMb25nKGZpbmFsIFVSSSBkYXRhVVJJKSB7CisJCUxhdExvbmcgcmV0VmFsdWUgPSBuZXcgTGF0TG9uZygpOworCisJCWZpbmFsIExhdExvbmdEYXRhUHJvdmlkZXIgbGF0TG9uZ0RhdGFQcm92aWRlciA9IGdldExhdExvbmdEYXRhUHJvdmlkZXIoZGF0YVVSSQorCQkJCS5zY2hlbWUoKSk7CisJCS8vIERpZCB3ZSBmaW5kIGEgZGF0YSBwcm92aWRlcj8KKwkJaWYgKGxhdExvbmdEYXRhUHJvdmlkZXIgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlyZXRWYWx1ZSA9IGxhdExvbmdEYXRhUHJvdmlkZXIuZ2V0TGF0TG9uZyhkYXRhVVJJKTsKKwkJfSBlbHNlIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigKKwkJCQkJIlVuYWJsZSB0byBmaW5kIGEgbGF0L2xvbmcgZGF0YSBwcm92aWRlciBmb3Igc2NoZW1lIFwiIgorCQkJCQkJCSsgZGF0YVVSSS5zY2hlbWUoKSArICJcIiIsIG51bGwpOworCQl9CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0TGF0TG9uZworCisJLyoqCisJICogQHBhcmFtIGRhdGFVUkkKKwkgKiAgICAgICAgICAgIHRoZSBVUkkgZXh0cmFjdGVkIGZyb20gYSBkdWJsaW4gY29yZSA8ZW0+c3BhdGlhbDwvZW0+CisJICogICAgICAgICAgICBhdHRyaWJ1dGUgdGhhdCBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIGxhdC9sb25nIGRhdGEKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBhcnJheXMgb2YgbGF0aXR1ZGUvbG9uZ2l0dWRlIHBhaXJzLgorCSAqLworCXByaXZhdGUgTGF0TG9uZyBnZXRMYXRMb25nTm9XYWl0KGZpbmFsIFVSSSBkYXRhVVJJKSB7CisJCUxhdExvbmcgcmV0VmFsdWUgPSBuZXcgTGF0TG9uZygpOworCisJCWZpbmFsIExhdExvbmdEYXRhUHJvdmlkZXIgbGF0TG9uZ0RhdGFQcm92aWRlciA9IGdldExhdExvbmdEYXRhUHJvdmlkZXIoZGF0YVVSSQorCQkJCS5zY2hlbWUoKSk7CisJCS8vIERpZCB3ZSBmaW5kIGEgZGF0YSBwcm92aWRlcj8KKwkJaWYgKGxhdExvbmdEYXRhUHJvdmlkZXIgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlyZXRWYWx1ZSA9IGxhdExvbmdEYXRhUHJvdmlkZXIuZ2V0TGF0TG9uZ05vV2FpdChkYXRhVVJJKTsKKwkJfSBlbHNlIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigKKwkJCQkJIlVuYWJsZSB0byBmaW5kIGEgbGF0L2xvbmcgZGF0YSBwcm92aWRlciBmb3Igc2NoZW1lIFwiIgorCQkJCQkJCSsgZGF0YVVSSS5zY2hlbWUoKSArICJcIiIsIG51bGwpOworCQl9CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0TGF0TG9uZ05vV2FpdAorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZ1Byb3ZpZGVyI2dldENlbnRlcigpCisJICovCisJcHVibGljIGRvdWJsZVtdIGdldENlbnRlcigpIHsJCQorCQkvL0ZpcnN0IHRyeSB0byBnZXQgdGhlIGNlbnRlciBvZiB0aGUgaWRlbnRpZmlhYmxlIGZyb20gdGhlIGNhY2hlCisJCWRvdWJsZVtdIGNlbnRlckxhdExvbmcgPSBpZGVudGlmaWFibGVDZW50ZXJDYWNoZS5nZXQoZ2V0VGFyZ2V0KCkpOworCQlpZiAoY2VudGVyTGF0TG9uZyAhPSBudWxsKSB7CisJCQkvL1llcywgaXQgd2FzIGFscmVhZHkgY2FsY3VsYXRlZCBzbyBqdXN0IHJldHVybiB0aGUgdmFsdWUKKwkJCXJldHVybiBjZW50ZXJMYXRMb25nOworCQl9CisJCQorCQkvL0NhbGN1bGF0ZSB0aGUgY2VudGVyIGFuZCBwdXQgaXQgaW4gdGhlIGNhY2hlCisJCWNlbnRlckxhdExvbmcgPSBuZXcgZG91YmxlWzJdOworCQlkb3VibGUgbWF4TGF0ID0gRG91YmxlLk1BWF9WQUxVRSwgbWF4TG9uZyA9IERvdWJsZS5NQVhfVkFMVUUsIG1pbkxhdCA9IERvdWJsZS5NSU5fVkFMVUUsIG1pbkxvbmcgPSBEb3VibGUuTUlOX1ZBTFVFOworCQlMYXRMb25nIGxhdExvbmcgPSBnZXRMYXRMb25nKCk7CisJCWlmIChsYXRMb25nLmdldFNlZ21lbnRzKCkuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlJdGVyYXRvcjxTZWdtZW50PiBzZWdtZW50c0l0ZXIgPSBsYXRMb25nLmdldFNlZ21lbnRzKCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUoc2VnbWVudHNJdGVyLmhhc05leHQoKSkgeworCQkJU2VnbWVudCBzZWdtZW50ID0gc2VnbWVudHNJdGVyLm5leHQoKTsKKwkJCWlmIChtYXhMYXQgPT0gRG91YmxlLk1BWF9WQUxVRSAmJiBtaW5MYXQgPT0gRG91YmxlLk1JTl9WQUxVRSkgeyAvL0FyYml0cmFyeSBpbml0aWFsaXplIHZhbHVlcyBmcm9tIHNlZ21lbnQKKwkJCQltYXhMYXQgPSBtaW5MYXQgPSBzZWdtZW50LmxhdGl0dWRlKDApOworCQkJCW1heExvbmcgPSBtaW5Mb25nID0gc2VnbWVudC5sb25naXR1ZGUoMCk7CisJCQl9CisJCQlmaW5hbCBpbnQgc2l6ZSA9IHNlZ21lbnQuc2l6ZSgpOworCQkJZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgewkJCQkKKwkJCQlkb3VibGUgbG9uID0gc2VnbWVudC5sb25naXR1ZGUoaSk7CisJCQkJZG91YmxlIGxhdCA9IHNlZ21lbnQubGF0aXR1ZGUoaSk7CisJCQkJaWYgKG1heExvbmcgPCBsb24pIG1heExvbmcgPSBsb247CisJCQkJaWYgKG1heExhdCA8IGxhdCkgbWF4TGF0ID0gbGF0OworCQkJCWlmIChtaW5Mb25nID4gbG9uKSBtaW5Mb25nID0gbG9uOworCQkJCWlmIChtaW5MYXQgPiBsYXQpIG1pbkxhdCA9IGxhdDsKKwkJCX0KKwkJfQorCQljZW50ZXJMYXRMb25nWzBdID0gKG1heExhdCArIG1pbkxhdCkgLyAyLjA7CisJCWNlbnRlckxhdExvbmdbMV0gPSAobWF4TG9uZyArIG1pbkxvbmcpIC8gMi4wOworCQlpZGVudGlmaWFibGVDZW50ZXJDYWNoZS5wdXQoKElkZW50aWZpYWJsZSlnZXRUYXJnZXQoKSwgY2VudGVyTGF0TG9uZyk7CisJCXJldHVybiBjZW50ZXJMYXRMb25nOworCX0gLy8gZ2V0Q2VudGVyCisKKwkvKioKKwkgKiBAcGFyYW0gc2NoZW1lCisJICogICAgICAgICAgICB0aGUgc2NoZW1lIG9mIHRoZSBkYXRhIFVSSSB0aGF0IHdlJ3JlIGxvb2tpbmcgZm9yIGEgbGF0L2xvbmcKKwkgKiAgICAgICAgICAgIGRhdGEgcHJvdmlkZXIgZm9yCisJICogQHJldHVybiBhIExhdExvbmdEYXRhUHJvdmlkZXIgdGhhdCBjYW4gaW50ZXJwcmV0IHRoZSBVUkkgYW5kIGV4dHJhY3QKKwkgKiAgICAgICAgIGxhdC9sb25nIGRhdGEsIG9yIG51bGwKKwkgKi8KKwlwcm90ZWN0ZWQgTGF0TG9uZ0RhdGFQcm92aWRlciBnZXRMYXRMb25nRGF0YVByb3ZpZGVyKGZpbmFsIFN0cmluZyBzY2hlbWUpIHsKKwkJcmV0dXJuIGdldExhdExvbmdEYXRhUHJvdmlkZXJzKCkuZ2V0KHNjaGVtZSk7CisJfSAvLyBnZXRMYXRMb25nRGF0YVByb3ZpZGVyCisKK30gLy8gTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9MYXRMb25nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9MYXRMb25nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOGEwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3NwYXRpYWwvZ2VvL0xhdExvbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLy8gTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLlNwYXRpYWxQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCisvKioKKyAqIFRoaXMgY2xhc3MgY3JlYXRlcyBhZGFwdGVycyB0aGF0IHRoYXQgYWRhcHQgPGNvZGU+SWRlbnRpZmlhYmxlPC9jb2RlPidzIHRvCisgKiA8Y29kZT5MYXRMb25nUHJvdmlkZXI8L2NvZGU+J3MuIFRoZSB0eXBpY2FsIDxjb2RlPkxhdExvbmdQcm92aWRlcjwvY29kZT4KKyAqIHRoYXQgaXMgcmV0dXJuZWQgZXh0cmFjdHMgdGhlIGxhdC9sb25nIGRhdGEgZnJvbSB0aGUgPGVtPnNwYXRpYWw8L2VtPgorICogYXR0cmlidXRlIG9mIGFuIDxjb2RlPklkZW50aWZpYWJsZTwvY29kZT4ncyBkdWJsaW4gY29yZSBpbnN0YW5jZS4KKyAqIAorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZQorICovCitwdWJsaWMgY2xhc3MgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcworCQlTcGF0aWFsUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKKworCS8qKgorCSAqIFRoaXMgaXMgYSBzdGF0aWMgcmVmZXJlbmNlIHRvIHRoZSBhZGFwdGVyIGZhY3RvcnkgdG8gdXNlLgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLlNwYXRpYWxQcm92aWRlckFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKGZpbmFsIE9iamVjdCB0eXBlKSB7CisJCXJldHVybiB0eXBlID09IExhdExvbmdQcm92aWRlci5jbGFzczsKKwl9IC8vIGlzRmFjdG9yeUZvclR5cGUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLkxhdExvbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFkYXB0ZXIob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihmaW5hbCBOb3RpZmllciB0YXJnZXQpIHsKKwkJLy8gSGF2ZSB3ZSBhbHJlYWR5IGNyZWF0ZWQgYW4gYWRhcHRlcj8KKwkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgeworCQkJLy8gTm8KKwkJCWFkYXB0ZXIgPSBuZXcgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlcigpOworCQl9CisJCXJldHVybiBhZGFwdGVyOworCX0gLy8gY3JlYXRlQWRhcHRlcgorCit9IC8vIExhdExvbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3NwYXRpYWwvZ2VvL1BsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9QbGF0Zm9ybUxhdExvbmdEYXRhUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDBmOGZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9QbGF0Zm9ybUxhdExvbmdEYXRhUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDc2NiBAQAorLy8gUGxhdGZvcm1MYXRMb25nRGF0YVByb3ZpZGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlbzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmcuU2VnbWVudEJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5YTUxSZWFkZXJGYWN0b3J5OworCisvKioKKyAqIFRoaXMgY2xhc3MgaW50ZXJwcmV0cyBhIFVSSSB0aGF0IHNwZWNpZmllcyBhIGZpbGUgb2YgKGkuZS4sICJwbGF0Zm9ybSIpCisgKiBsYXQvbG9uZyBkYXRhIGluIHNvbWUgZm9ybWF0IChjdXJyZW50bHkgPGEKKyAqIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sLyI+R01MPC9hPikuCisgKiAKKyAqIEBzZWUgSW5saW5lTGF0TG9uZ0RhdGFQcm92aWRlcgorICogQHNlZSBMYXRMb25nUHJvdmlkZXJBZGFwdGVyCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCitwdWJsaWMgY2xhc3MgUGxhdGZvcm1MYXRMb25nRGF0YVByb3ZpZGVyIGltcGxlbWVudHMgTGF0TG9uZ0RhdGFQcm92aWRlciB7CisJLyoqCisJICogVGhlIGNsYXNzIG5hbWUgb2YgdGhlIGZpcnN0IFNBWCBYTUwgcGFyc2VyIHRvIGF0dGVtcHQgdG8gY3JlYXRlIGlmIHRoZQorCSAqIGRlZmF1bHQgY2Fubm90IGJlIGZvdW5kLiBWYWx1ZToKKwkgKiA8Y29kZT5vcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcjwvY29kZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVhfUEFSU0VSMSA9ICJvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlciI7CisKKwkvKioKKwkgKiBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgc2Vjb25kIFNBWCBYTUwgcGFyc2VyIHRvIGF0dGVtcHQgdG8gY3JlYXRlIGlmIHRoZQorCSAqIGRlZmF1bHQgY2Fubm90IGJlIGZvdW5kLiBWYWx1ZToKKwkgKiA8Y29kZT5vcmcuYXBhY2hlLmNyaW1zb24ucGFyc2VyLlhNTFJlYWRlckltcGw8L2NvZGU+CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FYX1BBUlNFUjIgPSAib3JnLmFwYWNoZS5jcmltc29uLnBhcnNlci5YTUxSZWFkZXJJbXBsIjsKKworCS8qKgorCSAqIFRoaXMgc2V0IG9mIG5lc3RlZCBNYXBzIGltcGxlbWVudHMgYSBjYWNoZSBmb3IgbGF0aXR1ZGUvbG9uZ2l0dWRlIGRhdGEKKwkgKiByZWFkIGluLiBUaGUga2V5IG9mIHRoZSBmaXJzdCBtYXAgaXMgdGhlIFVSSSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorCSAqIGRhdGEuIFRoZSBrZXkgb2YgdGhlIHNlY29uZCBtYXAgaXMgdGhlIGlkZW50aWZpZXIgdGhhdCBpcyB0aGUgZnJhZ21lbnQgb2YKKwkgKiB0aGUgb3JpZ2luYWwgcXVlcnkgVVJJLiBJZiB0aGUgZmlyc3QgbWFwIGRvZXMgbm90IGNvbnRhaW4gYW4gZW50cnkgZm9yIGEKKwkgKiBzcGVjaWZpZWQgZmlsZSwgdGhlbiBvbmUgaXMgY3JlYXRlZCBhbmQgcG9wdWxhdGVkIHdpdGggdGhlIGNvbnRlbnRzIG9mCisJICogdGhlIGZpbGUuCisJICovCisJc3RhdGljIE1hcDxVUkksIE1hcDxTdHJpbmcsIExhdExvbmc+PiBjYWNoZSA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxVUkksIE1hcDxTdHJpbmcsIExhdExvbmc+PigpOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2NoZW1lIGZvciBhICJwbGF0Zm9ybSIgZGF0YSBVUkkgdGhhdCBzcGVjaWZpZXMgYSBmaWxlIHRoYXQKKwkgKiBjb250YWlucyBsYXQvbG9uZyBkYXRhLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1NDSEVNRSA9ICJwbGF0Zm9ybSI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBmb2xkZXIgdGhhdCBjb250YWlucyB0aGUgbm9ybWFsIHJlc29sdXRpb24gR01MCisJICogZmlsZXMuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhclNlcXVlbmNlIE5PUk1BTF9SRVNfRk9MREVSID0gImNvdW50cnkiOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgZm9sZGVyIHRoYXQgY29udGFpbnMgdGhlIGxvd2VyIHJlc29sdXRpb24gR01MCisJICogZmlsZXMKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDaGFyU2VxdWVuY2UgTE9XX1JFU19GT0xERVIgPSAiY291bnRyeV9yZWR1Y2VkIjsKKworCS8qKgorCSAqIElmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gdGhlIGxhdGl0dWRlL2xvbmdpdHVkZSBwb2ludHMgd2lsbCBiZSBzYW1wbGVkCisJICogYW5kIHNvbWUgd2lsbCBiZSBkaXNjYXJkZWQgdG8gcmVkdWNlIHRoZWlyIG51bWJlci4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NhbXBsaW5nID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBmcmVxdWVuY3kgYXQgd2hpY2ggdGhlIGxhdGl0dWRlL2xvbmdpdHVkZSBkYXRhIHBvaW50cyB3aWxsIGJlCisJICogc2FtcGxlZC4gQSB2YWx1ZSBvZiAiMSIgbWVhbnMgZXZlcnkgcG9pbnQgd2lsbCBiZSBpbmNsdWRlZCwgYSB2YWx1ZSBvZgorCSAqICIyIiBtZWFucyB0aGF0IGV2ZXJ5IDJuZCBwb2ludCB3aWxsIGJlIGluY2x1ZGVkLiBUaGUgZmlyc3QgYW5kIGxhc3QgZGF0YQorCSAqIHBvaW50cyBhcmUgYWx3YXlzIGluY2x1ZGVkLgorCSAqLworCXB1YmxpYyBpbnQgc2FtcGxlRnJlcXVlbmN5ID0gMTsKKworCS8qKgorCSAqIElmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gSS9PIEV4Y2VwdGlvbnMgYXJlIGxvZ2dlZCwgb3RoZXJ3aXNlIHRoZXkgYXJlCisJICogaWdub3JlZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiByZXBvcnRJT0V4Y2VwdGlvbnMgPSB0cnVlOworCisJLyoqCisJICogSWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiB0aGUgcGF0aCB0byB0aGUgR01MIGZpbGUgd2lsbCBiZSBtb2RpZmllZCB0bworCSAqIHBvaW50IHRvIGEgc21hbGxlciBHTUwgZmlsZSB0aGF0IGhhcyBhIGxvd2VyIHJlc29sdXRpb24uCisJICovCisJcHVibGljIGJvb2xlYW4gdXNlTG93ZXJSZXNvbHV0aW9uTGF0TG9uZ0RhdGEgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJcHVibGljIFBsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwkJc2V0UHJlZmVyZW5jZXMoKTsKKworCQlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkKKwkJCQkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKGZpbmFsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQkJCXNldFByZWZlcmVuY2VzKCk7CisJCQkJCQkvLyBGbHVzaCBldmVyeXRoaW5nIGluIHRoZSBjYWNoZSB0byBmb3JjZSBpdCB0byBiZSByZWFkCisJCQkJCQkvLyBhZ2FpbiBmcm9tIHRoZSBnbWwgZmlsZSBhbmQgcmUtc2FtcGxlZAorCQkJCQkJY2FjaGUgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8VVJJLCBNYXA8U3RyaW5nLCBMYXRMb25nPj4oKTsKKwkJCQkJfSAvLyBwcm9wZXJ0eUNoYW5nZQorCQkJCX0gLy8gSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKKwkJCQkpOworCisJfSAvLyBQbGF0Zm9ybUxhdExvbmdEYXRhUHJvdmlkZXIKKworCS8qKgorCSAqIEBwYXJhbSBsYXRsb25nRmlsZVVSSQorCSAqIEByZXR1cm4gdGhlIGxhdC9sb25nIHZhbHVlcworCSAqLworCXB1YmxpYyBMYXRMb25nIGdldExhdExvbmcoZmluYWwgVVJJIGxhdGxvbmdGaWxlVVJJKSB7CisJCUxhdExvbmcgcmV0VmFsdWUgPSBudWxsOworCisJCS8vIFRoZSBVUkkgc2hvdWxkIGhhdmUgYW4gSUQgYXMgdGhlIGZyYWdtZW50IHRoYXQgc3BlY2lmaWVzIHRoZQorCQkvLyBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YSBpbiB0aGUgR01MIGZpbGUuCisKKwkJLy8gSXMgdGhlcmUgYW4gZW50cnkgZm9yIG91ciBrZXk/CisJCXJldFZhbHVlID0gZ2V0TGF0TG9uZ01hcChsYXRsb25nRmlsZVVSSS50cmltRnJhZ21lbnQoKSkuZ2V0KAorCQkJCWxhdGxvbmdGaWxlVVJJLmZyYWdtZW50KCkpOworCisJCXJldFZhbHVlID0gcmV0VmFsdWUgIT0gbnVsbCA/IHJldFZhbHVlIDogbmV3IExhdExvbmcoKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0TGF0TG9uZworCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMganVzdCBsaWtlIHtAbGluayAjZ2V0TGF0TG9uZyhVUkkpfSBleGNlcHQgdGhhdCBpdCB3aWxsCisJICogaW1tZWRpYXRlbHkgcmV0dXJuIGFuICJlbXB0eSIgTGF0TG9uZyBpbnN0YW5jZSBpZiB0aGUgZGF0YSBmb3IgdGhlIFVSSQorCSAqIGhhcyBub3QgYmVlbiByZXRyaWV2ZWQuIEl0IHdpbGwgYWxzbyBzdGFydCBhIHNlcGFyYXRlIGpvYiB0byByZXRyaWV2ZQorCSAqIHRoYXQgZGF0YSBhbmQgd2lsbCByZXR1cm4gaXQgd2hlbiB0aGF0IGpvYiBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LgorCSAqIAorCSAqIEBwYXJhbSBsYXRsb25nRmlsZVVSSQorCSAqIEByZXR1cm4gdGhlIGxhdC9sb25nIHZhbHVlcworCSAqLworCXB1YmxpYyBMYXRMb25nIGdldExhdExvbmdOb1dhaXQoZmluYWwgVVJJIGxhdGxvbmdGaWxlVVJJKSB7CisJCUxhdExvbmcgcmV0VmFsdWUgPSBudWxsOworCisJCS8vIFRoZSBVUkkgc2hvdWxkIGhhdmUgYW4gSUQgYXMgdGhlIGZyYWdtZW50IHRoYXQgc3BlY2lmaWVzIHRoZQorCQkvLyBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YSBpbiB0aGUgR01MIGZpbGUuCisKKwkJLy8gSXMgdGhlcmUgYW4gZW50cnkgZm9yIG91ciBrZXk/CisJCXJldFZhbHVlID0gZ2V0TGF0TG9uZ01hcE5vV2FpdChsYXRsb25nRmlsZVVSSS50cmltRnJhZ21lbnQoKSkuZ2V0KAorCQkJCWxhdGxvbmdGaWxlVVJJLmZyYWdtZW50KCkpOworCisJCXJldFZhbHVlID0gcmV0VmFsdWUgIT0gbnVsbCA/IHJldFZhbHVlIDogbmV3IExhdExvbmcoKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0TGF0TG9uZworCisJLyoqCisJICogQHBhcmFtIGZpbGVVUkkKKwkgKiAgICAgICAgICAgIHRoZSB1cmkgb2YgYSBmaWxlIG9mIGxhdGl0dWRlL2xvbmdpdHVkZSBkYXRhCisJICogQHJldHVybiB0aGUgaWRlbnRpZmllcnMgb2YgdGhlIGxhdGl0dWRlL2xvbmdpdHVkZSBkYXRhIGluIHRoZSBmaWxlCisJICovCisJcHVibGljIFNldDxTdHJpbmc+IGdldElkcyhmaW5hbCBVUkkgZmlsZVVSSSkgeworCQlyZXR1cm4gZ2V0TGF0TG9uZ01hcChmaWxlVVJJKS5rZXlTZXQoKTsKKwl9IC8vIGdldElkcworCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMganVzdCBsaWtlIHtAbGluayAjZ2V0SWRzKFVSSSl9IGV4Y2VwdCB0aGF0IGl0IHdpbGwgcmV0dXJuCisJICogYW4gZW1wdHkgc2V0IGlmIHRoZSBkYXRhIHJlZmVyZW5jZWQgYnkgdGhlIFVSSSBoYXMgbm90IGJlZW4gcmVhZCB5ZXQuIEl0CisJICogd2lsbCB0aGVuIGNhdXNlIGEgc2VwYXJhdGUgam9iIHRvIHN0YXJ0IHRoYXQgd2lsbCByZWFkIHRoYXQgZGF0YS4gQQorCSAqIHN1YnNlcXVlbnQgY2FsbCwgYWZ0ZXIgdGhhdCBqb2IgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSwgd291bGQgcmV0dXJuIGEKKwkgKiBzZXQgb2YgaWRzLgorCSAqIAorCSAqIEBwYXJhbSBmaWxlVVJJCisJICogICAgICAgICAgICB0aGUgdXJpIG9mIGEgZmlsZSBvZiBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YQorCSAqIEByZXR1cm4gdGhlIGlkZW50aWZpZXJzIG9mIHRoZSBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YSBpbiB0aGUgZmlsZQorCSAqLworCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRJZHNOb1dhaXQoZmluYWwgVVJJIGZpbGVVUkkpIHsKKwkJcmV0dXJuIGdldExhdExvbmdNYXBOb1dhaXQoZmlsZVVSSSkua2V5U2V0KCk7CisJfSAvLyBnZXRJZHMKKworCS8qKgorCSAqIEBwYXJhbSBmaWxlVVJJCisJICogICAgICAgICAgICB0aGUgdXJpIG9mIGEgZmlsZSBvZiBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YQorCSAqIEByZXR1cm4gdGhlIG1hcCBiZXR3ZWVuIGlkJ3MgYW5kIGRhdGEgdmFsdWVzIGZvciB0aGF0IGZpbGUuCisJICovCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBMYXRMb25nPiBnZXRMYXRMb25nTWFwKGZpbmFsIFVSSSBmaWxlVVJJKSB7CisJCS8vIEhhdmUgd2UgcHJvY2Vzc2VkIHRoaXMgZmlsZSBiZWZvcmU/CisJCU1hcDxTdHJpbmcsIExhdExvbmc+IGxhdExvbmdNYXAgPSBjYWNoZS5nZXQoZmlsZVVSSSk7CisJCWlmIChsYXRMb25nTWFwID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQkvLyBXZSBuZWVkIHRvIHJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFuZCBwb3B1bGF0ZSB0aGUgZW50cnkKKwkJCWxhdExvbmdNYXAgPSBjcmVhdGVMYXRMb25nTWFwKGZpbGVVUkkpOworCQkJY2FjaGUucHV0KGZpbGVVUkksIGxhdExvbmdNYXApOworCQl9CisJCXJldHVybiBsYXRMb25nTWFwOworCX0gLy8gZ2V0TGF0TG9uZ01hcAorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgdGhlIHNhbWUgYXMge0BsaW5rICNnZXRMYXRMb25nTWFwKFVSSSl9LCBleGNlcHQgdGhhdCBpdAorCSAqIGltbWVkaWF0ZWx5IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGxhdC9sb25nIG1hcC4gVGhpcyBtYXAgd2lsbCBiZQorCSAqIGVtcHR5IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgYSByZXF1ZXN0IGhhcyBiZWVuIG1hZGUgZm9yIGl0LiBJbiB0aGF0CisJICogY2FzZSBhIHNlcGFyYXRlIEpvYiAoaS5lLiwgdGhyZWFkKSBpcyBzY2hlZHVsZWQgdG8gcmVhZCBhbmQgcG9wdWxhdGUgdGhlCisJICogbWFwIGZyb20gYSBHTUwgZmlsZS4gV2hlbiB0aGF0IGlzIGZpbmlzaGVkLCB0aGUgZW1wdHkgbWFwIGlzIHJlcGxhY2VkIGJ5CisJICogdGhlIHBvcHVsYXRlZCBvbmUgc28gdGhhdCB0aGUgbmV4dCBjYWxsIHdpbGwgcmV0dXJuIHRoZSBwb3B1bGF0ZWQgbWFwLgorCSAqIAorCSAqIEBwYXJhbSBmaWxlVVJJCisJICogICAgICAgICAgICB0aGUgdXJpIG9mIGEgZmlsZSBvZiBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YQorCSAqIEByZXR1cm4gdGhlIG1hcCBiZXR3ZWVuIGlkJ3MgYW5kIGRhdGEgdmFsdWVzIGZvciB0aGF0IGZpbGUuCisJICovCisJc3luY2hyb25pemVkIHByaXZhdGUgTWFwPFN0cmluZywgTGF0TG9uZz4gZ2V0TGF0TG9uZ01hcE5vV2FpdCgKKwkJCWZpbmFsIFVSSSBmaWxlVVJJKSB7CisJCS8vIEhhdmUgd2UgcHJvY2Vzc2VkIHRoaXMgZmlsZSBiZWZvcmU/CisJCU1hcDxTdHJpbmcsIExhdExvbmc+IGxhdExvbmdNYXAgPSBjYWNoZS5nZXQoZmlsZVVSSSk7CisJCWlmIChsYXRMb25nTWFwID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQkvLyBXZSBuZWVkIHRvIHB1dCBhbiBlbXB0eSBtYXAgaW50byB0aGUgY2FjaGUgc28gdGhhdCB0aGUgbmV4dCBjYWxsCisJCQkvLyBkb2Vzbid0IHRyeSB0byBzdGFydCB1cCBhbm90aGVyIGpvYiB0byByZWFkIGluIHRoZSBmaWxlLgorCQkJbGF0TG9uZ01hcCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIExhdExvbmc+KCk7CisJCQljYWNoZS5wdXQoZmlsZVVSSSwgbGF0TG9uZ01hcCk7CisKKwkJCS8vIE5vdyBkb3duIHRvIGJ1c2luZXNzLCB3ZSBjcmVhdGUgYSBzZXBhcmF0ZSBqb2IgdG8gcmVhZCBpbiB0aGUKKwkJCS8vIGxhdC9sb25nIGRhdGEgZnJvbSB0aGUgR01MIGZpbGUgYW5kIHBvcHVsYXRlIHRoZSBtYXAuCisJCQlmaW5hbCBKb2IgcmVhZEdNTEpvYiA9IG5ldyBKb2IoZmlsZVVSSS50b1N0cmluZygpKSB7CisJCQkJLyoqCisJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2IjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQorCQkJCSAqLworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQkJbW9uaXRvci5iZWdpblRhc2soZmlsZVVSSS50b1N0cmluZygpLCAxMDApOworCQkJCQkvLyBXZSBuZWVkIHRvIHJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFuZCBwb3B1bGF0ZSB0aGUKKwkJCQkJLy8gZW50cnkKKwkJCQkJZmluYWwgTWFwPFN0cmluZywgTGF0TG9uZz4gbGF0TG9uZ01hcCA9IGNyZWF0ZUxhdExvbmdNYXAoZmlsZVVSSSk7CisJCQkJCS8vIFJlcGxhY2UgdGhlIGVtcHR5IG1hcCB3aXRoIHRoaXMgb25lLgorCQkJCQljYWNoZS5wdXQoZmlsZVVSSSwgbGF0TG9uZ01hcCk7CisJCQkJCW1vbml0b3IuZG9uZSgpOworCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBBY3RpdmF0b3IuUExVR0lOX0lELAorCQkJCQkJCUlTdGF0dXMuT0ssICJEb25lIiwgbnVsbCk7CisJCQkJfSAvLyBydW4KKwkJCX07IC8vIHJlYWRHTUxKb2IKKwkJCXJlYWRHTUxKb2Iuc2NoZWR1bGUoKTsKKwkJfSAvLyBpZiBubyBsYXQvbG9uZyBtYXAKKworCQlyZXR1cm4gbGF0TG9uZ01hcDsKKwl9IC8vIGdldExhdExvbmdNYXAKKworCU1hcDxTdHJpbmcsIExhdExvbmc+IGNyZWF0ZUxhdExvbmdNYXAoZmluYWwgVVJJIGZpbGVVUkkpIHsKKwkJZmluYWwgTWFwPFN0cmluZywgTGF0TG9uZz4gbGF0TG9uZ01hcCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIExhdExvbmc+KCk7CisJCWZpbmFsIFVSSUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgVVJJQ29udmVydGVySW1wbCgpOworCQlmaW5hbCBHTUxEZWNvZGVyIGdNTERlY29kZXIgPSBuZXcgR01MRGVjb2RlcihsYXRMb25nTWFwKTsKKwkJdHJ5IHsKKwkJCWZpbmFsIElucHV0U3RyZWFtIGlzID0gY29udmVydGVyCisJCQkJCS5jcmVhdGVJbnB1dFN0cmVhbShhZGp1c3RGaWxlUGF0aChmaWxlVVJJKSk7CisJCQlmaW5hbCBCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCisJCQkJCWlzKSk7CisJCQlwYXJzZUlucHV0U3RyZWFtKGluLCBnTUxEZWNvZGVyKTsKKwkJfSAvLyB0cnkKKwkJY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIEl0IGNvdWxkIGJlIHRoYXQgd2UgdHJpZWQgdG8gZ2V0IGEgbG93IHJlc29sdXRpb24gdmVyc2lvbiBvZiB0aGUKKwkJCS8vIGZpbGUgYW5kIGl0IHdhc24ndCBmb3VuZC4gU28gbGV0J3MgdHJ5IGdldHRpbmcgdGhlIHJlZ3VsYXIKKwkJCS8vIHJlc29sdXRpb24KKwkJCS8vIEFyZSB3ZSBnZXR0aW5nIGxvdyByZXNvbHV0aW9uIGZpbGVzPworCQkJaWYgKHVzZUxvd2VyUmVzb2x1dGlvbkxhdExvbmdEYXRhKSB7CisJCQkJLy8gWWVzCisJCQkJdHJ5IHsKKwkJCQkJLy8gVHJ5IGFnYWluIHdpdGhvdXQgYWRqdXN0aW5nIHRoZSBmaWxlIHBhdGgKKwkJCQkJZmluYWwgSW5wdXRTdHJlYW0gaXMgPSBjb252ZXJ0ZXIuY3JlYXRlSW5wdXRTdHJlYW0oZmlsZVVSSSk7CisJCQkJCWZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOworCQkJCQlwYXJzZUlucHV0U3RyZWFtKGluLCBnTUxEZWNvZGVyKTsKKwkJCQl9IGNhdGNoIChmaW5hbCBGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgeworCQkJCQkvLyBTaG91bGQgd2UgcmVwb3J0IHRoZSBtaXNzaW5nIGZpbGU/CisJCQkJCWlmIChyZXBvcnRJT0V4Y2VwdGlvbnMpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJQWN0aXZhdG9yLmxvZ0luZm9ybWF0aW9uKGZuZmUuZ2V0TWVzc2FnZSgpLCBmbmZlKTsKKwkJCQkJfQorCQkJCX0gLy8gY2F0Y2ggRmlsZU5vdEZvdW5kRXhjZXB0aW9uCisJCQkJY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUyKSB7CisJCQkJCS8vIFNob3VsZCB3ZSByZXBvcnQgdGhlIGVycm9yPworCQkJCQlpZiAocmVwb3J0SU9FeGNlcHRpb25zKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCUFjdGl2YXRvci5sb2dFcnJvcihlMi5nZXRNZXNzYWdlKCksIGUyKTsKKwkJCQkJfQorCQkJCX0gLy8gY2F0Y2ggSU9FeGNlcHRpb24KKwkJCX0gLy8gaWYgdXNpbmcgbG93IHJlc29sdXRpb24KKwkJCS8vIFNob3VsZCB3ZSByZXBvcnQgdGhlIGVycm9yPworCQkJZWxzZSBpZiAocmVwb3J0SU9FeGNlcHRpb25zKSB7CisJCQkJLy8gWWVzCisJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCX0KKwkJfSAvLyBjYXRjaAorCisJCXJldHVybiBsYXRMb25nTWFwOworCX0gLy8gY3JlYXRlTGF0TG9uZ01hcAorCisJLyoqCisJICogVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyBpZiBpdCBzaG91bGQgbW9kaWZ5IHRoZSBwYXRoIHRvIHRoZSBHTUwgZmlsZSBzbworCSAqIHRoYXQgYSBkaWZmZXJlbnQgZmlsZSBpcyBzZWxlY3RlZC4gVHlwaWNhbGx5LCB0aGlzIGlzIHRvIHN3aXRjaCB0byBhCisJICogbG93ZXIgcmVzb2x1dGlvbiBHTUwgZmlsZS4KKwkgKiAKKwkgKiBAcGFyYW0gZmlsZVVSSQorCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIFVSSQorCSAqIEByZXR1cm4gdGhlIGFkanVzdGVkIFVSSQorCSAqLworCXByaXZhdGUgVVJJIGFkanVzdEZpbGVQYXRoKGZpbmFsIFVSSSBmaWxlVVJJKSB7CisJCVVSSSByZXRWYWx1ZSA9IGZpbGVVUkk7CisKKwkJLy8gU2hvdWxkIHdlIHVzZSBhIGxvd2VyIHJlc29sdXRpb24gdmVyc2lvbiBvZiB0aGUgZmlsZT8KKwkJaWYgKHVzZUxvd2VyUmVzb2x1dGlvbkxhdExvbmdEYXRhKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIFN0cmluZyBhZGp1c3RlZFBhdGggPSBmaWxlVVJJLnRvU3RyaW5nKCkucmVwbGFjZSgKKwkJCQkJTk9STUFMX1JFU19GT0xERVIsIExPV19SRVNfRk9MREVSKTsKKwkJCXJldFZhbHVlID0gVVJJLmNyZWF0ZVVSSShhZGp1c3RlZFBhdGgpOworCQl9CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gYWRqdXN0RmlsZVBhdGgKKworCS8qKgorCSAqIFNldCB0aGUgcHJlZmVyZW5jZXMuCisJICogCisJICogQHNlZSAjaXNTYW1wbGluZworCSAqIEBzZWUgI3NhbXBsZUZyZXF1ZW5jeQorCSAqLworCXByaXZhdGUgdm9pZCBzZXRQcmVmZXJlbmNlcygpIHsKKwkJZmluYWwgUHJlZmVyZW5jZXMgcGVyZmVyZW5jZXMgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpCisJCQkJLmdldFBsdWdpblByZWZlcmVuY2VzKCk7CisJCWlzU2FtcGxpbmcgPSBwZXJmZXJlbmNlcworCQkJCS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRE9XTl9TQU1QTEVfTEFUX0xPTkdfREFUQV9CT09MRUFOX1BSRUZFUkVOQ0UpOworCQlzYW1wbGVGcmVxdWVuY3kgPSBwZXJmZXJlbmNlcworCQkJCS5nZXRJbnQoUHJlZmVyZW5jZUNvbnN0YW50cy5MQVRfTE9OR19TQU1QTEVfRlJFUVVFTkNZX0lOVEVHRVJfUFJFRkVSRU5DRSk7CisJCXJlcG9ydElPRXhjZXB0aW9ucyA9IHBlcmZlcmVuY2VzCisJCQkJLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5SRVBPUlRfSU9fRVhDRVBUSU9OU19CT09MRUFOX1BSRUZFUkVOQ0UpOworCQl1c2VMb3dlclJlc29sdXRpb25MYXRMb25nRGF0YSA9IHBlcmZlcmVuY2VzCisJCQkJLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5VU0VfTE9XRVJfUkVTT0xVVElPTl9MQVRfTE9OR19EQVRBX0JPT0xFQU5fUFJFRkVSRU5DRSk7CisJfSAvLyBzZXRQZXJmZXJlbmNlcworCisJLyoqCisJICogVHJ5IHRvIGNyZWF0ZSBhIFNBWCBQYXJzZXIuIFRoZSBtZXRob2QgZmlyc3QgYXR0ZW1wdHMgdG8gY3JlYXRlIHRoZQorCSAqIGRlZmF1bHQgcGFyc2VyLiBUaGUgY2xhc3MgbmFtZSBvZiB0aGlzIHBhcnNlciBpcyBhc3NpZ25lZCB0byB0aGUgcHJvcGVydHkKKwkgKiAib3JnLnhtbC5zYXguZHJpdmVyIi4gVGhpcyB2YWx1ZSBpcyBkZWZpbmVkIG9uIHRoZSBjb21tYW5kIGxpbmUgdGhhdAorCSAqIHN0YXJ0cyB0aGUgSmF2YSBpbnRlcnByZXRlcgorCSAqIDxjb2RlPmphdmEgLURvcmcueG1sLnNheC5kcml2ZXI9b3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXI8L2NvZGU+CisJICogSWYgaXQgaXMgbm90IHN1Y2Nlc3NmdWwgaW4gZmluZGluZyB0aGlzIHBhcnNlciwgaXQgd2lsbCBhdHRlbXB0IHRvIGNyZWF0ZQorCSAqIGFuIGluc3RhbmNlIG9mIDxjb2RlPm9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyPC9jb2RlPiwgaWYKKwkgKiB0aGF0IGZhaWxzLCBpdCB3aWxsIHRyeSB0aGUgcGFyc2VyCisJICogPGNvZGU+Im9yZy5hcGFjaGUuY3JpbXNvbi5wYXJzZXIuWE1MUmVhZGVySW1wbDwvY29kZT4uIElmIHRoYXQgZmFpbHMsCisJICogaXQgd2lsbCB0aHJvdyBhIDxjb2RlPlNpbXVsYXRpb25FeGNlcHRpb248L2NvZGU+IHJlcG9ydGluZyB0aGUKKwkgKiBpbmFiaWxpdHkgdG8gY3JlYXRlIGEgU0FYIFhNTCBQYXJzZXIuCisJICogCisJICogQHJldHVybiBhIFNBWFBhcnNlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgWE1MUmVhZGVyIGdldFNBWFBhcnNlcigpIHsKKworCQlYTUxSZWFkZXIgcmV0VmFsdWUgPSBudWxsOworCQl0cnkgeworCQkJLy8gVHJ5IHRvIG1ha2UgdGhlIGRlZmF1bHQgU0FYIFBhcnNlcgorCQkJcmV0VmFsdWUgPSBYTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcigpOworCisJCX0gLy8gdHJ5CisJCWNhdGNoIChmaW5hbCBTQVhFeGNlcHRpb24gc2F4ZSkgeworCQkJLy8gVHJ5IHNwZWNpZmljIHBhcnNlcnMKKwkJCXRyeSB7IC8vIFNBWF9QQVJTRVIxCisJCQkJcmV0VmFsdWUgPSBYTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcihTQVhfUEFSU0VSMSk7CisJCQl9IC8vIHRyeSBTQVhfUEFSU0VSMQorCQkJY2F0Y2ggKGZpbmFsIFNBWEV4Y2VwdGlvbiBzYXhlMSkgeworCQkJCXRyeSB7IC8vIHRyeSBTQVhfUEFSU0VSMgorCQkJCQlyZXRWYWx1ZSA9IFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKFNBWF9QQVJTRVIyKTsKKwkJCQl9IC8vIHRyeSBTQVhfUEFSU0VSMgorCQkJCWNhdGNoIChmaW5hbCBTQVhFeGNlcHRpb24gc2F4ZTIpIHsKKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKHNheGUyLmdldE1lc3NhZ2UoKSwgc2F4ZTIpOworCQkJCX0gLy8gY2F0Y2ggU0FYX1BBUlNFUjIKKwkJCX0gLy8gY2F0Y2ggU0FYX1BBUlNFUjEKKwkJfSAvLyBjYXRjaCBkZWZhdWx0CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0U0FYUGFyc2VyKCkKKworCS8qKgorCSAqIFBhcnNlIHRoZSBzcGVjaWZpZWQgaW5wdXQgY2hhcmFjdGVyIHN0cmVhbSB1c2luZyB0aGUKKwkgKiAKKwkgKiBzcGVjaWZpZWQgSGFuZGxlci4gV2hlcmUgdGhlIG91dHB1dCBpcyBzdG9yZWQgZGVwZW5kcyBvbiB0aGUgaGFuZGxlcgorCSAqIAorCSAqIEBwYXJhbSBpbgorCSAqICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgdG8gcmVhZCB0aGUgWE1MIGZyb20uCisJICogQHBhcmFtIGhhbmRsZXIKKwkgKiAgICAgICAgICAgIFRoZSBjbGFzcyB0aGF0IHdpbGwgaGFuZGxlIHRoZSBwYXJzaW5nCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHBhcnNlSW5wdXRTdHJlYW0oZmluYWwgQnVmZmVyZWRSZWFkZXIgaW4sCisJCQlmaW5hbCBEZWZhdWx0SGFuZGxlciBoYW5kbGVyKSB7CisJCXRyeSB7CisJCQlmaW5hbCBYTUxSZWFkZXIgc2F4UGFyc2VyID0gZ2V0U0FYUGFyc2VyKCk7CisJCQlzYXhQYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7CisJCQlzYXhQYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGluKSk7CisJCQlpbi5jbG9zZSgpOworCQl9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOworCQl9IGNhdGNoIChmaW5hbCBTQVhFeGNlcHRpb24gZSkgeworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0gLy8gcGFyc2VJbnB1dFN0cmVhbQorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBhIFNBWCBIYW5kbGVyIHVzZWQgdG8gcHJvY2VzcyB0aGUgY29udGVudHMgb2YgYSBHTUwgZmlsZQorCSAqIHNwZWNpZnlpbmcgbGF0aXR1ZGUvbG9uZ2l0dWRlIGRhdGEuCisJICovCisJcHVibGljIGNsYXNzIEdNTERlY29kZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7CisKKwkJLy8gWE1MIGVsZW1lbnQgbmFtZQorCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX01BUF9FTEVNRU5UX05BTUUgPSAiTWFwIjsKKworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RJVExFX0VMRU1FTlRfTkFNRSA9ICJ0aXRsZSI7CisKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9TVUJUSVRMRV9FTEVNRU5UX05BTUUgPSAic3ViVGl0bGUiOworCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVVBEQVRFRF9FTEVNRU5UX05BTUUgPSAidXBkYXRlZCI7CisKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTlRSWV9FTEVNRU5UX05BTUUgPSAiZW50cnkiOworCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfV0hFUkVfRUxFTUVOVF9OQU1FID0gIndoZXJlIjsKKworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX09VVEVSX0JPVU5EQVJZX0VMRU1FTlRfTkFNRSA9ICJvdXRlckJvdW5kYXJ5SXMiOworCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTElORUFSX1JJTkdfRUxFTUVOVF9OQU1FID0gIkxpbmVhclJpbmciOworCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUE9MWUdPTl9FTEVNRU5UX05BTUUgPSAiUG9seWdvbiI7CisKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QT1NMSVNUX0VMRU1FTlRfTkFNRSA9ICJwb3NMaXN0IjsKKworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0lEX0FUVFIgPSAiZ21sOmlkIjsKKworCQkvKioKKwkJICogVGhpcyBpcyB0aGUgdGl0bGUgcGFyc2VkIGZyb20gdGhlIGZpbGUKKwkJICovCisJCXByaXZhdGUgU3RyaW5nIHRpdGxlID0gIiI7CisKKwkJLyoqCisJCSAqIFRoaXMgaXMgdGhlIHN1Yi10aXRsZSBwYXJzZWQgZnJvbSB0aGUgZmlsZTsKKwkJICovCisJCS8vIFdlJ3JlIGlnbm9yaW5nIHN1YnRpdGxlcyByaWdodCBub3cKKwkJLy8gcHJpdmF0ZSBTdHJpbmcgc3ViVGl0bGUgPSAiIjsKKwkJLyoqCisJCSAqIFRoaXMgaXMgdGhlIGRhdGUgdGhlIGZpbGUgd2FzIHVwZGF0ZWQgYXMgcGFyc2VkIGZyb20gdGhlIGZpbGU7CisJCSAqLworCQkvLyBXZSdyZSBpZ25vcmluZyB1cGRhdGVkIHJpZ2h0IG5vdworCQkvLyBwcml2YXRlIFN0cmluZyB1cGRhdGVkID0gIiI7CisJCS8qKgorCQkgKiBUaGlzIGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBjdXJyZW50IHBvbHlnb24gYmVpbmcgcGFyc2VkCisJCSAqLworCQlwcml2YXRlIFN0cmluZyBjdXJyZW50UG9seWdvbklkID0gbnVsbDsKKworCQkvLyBQYXJzZSBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQgYmVpbmcgcGFyc2VkCisJCXByaXZhdGUgTG9jYXRvciBsb2NhdG9yID0gbnVsbDsKKworCQkvKioKKwkJICogVGhlIG1hcCB0aGF0IGlzIGNvbnN0cnVjdGVkIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgR01MIGZpbGUuCisJCSAqLworCQlNYXA8U3RyaW5nLCBMYXRMb25nPiBsYXRMb25nTWFwID0gbnVsbDsKKworCQkvKioKKwkJICogVGhpcyBpcyB0aGUgY29sbGVjdGlvbiBvZgorCQkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nLlNlZ21lbnR9J3MKKwkJICogY29sbGVjdGVkIGZvciBhIHBvbHlnb24uCisJCSAqLworCQlwcml2YXRlIExhdExvbmcgcG9seWdvbkxhdExvbmcgPSBudWxsOworCisJCS8qKgorCQkgKiBUaGlzIHNlZ21lbnQgYnVpbGRlciBpcyB1c2VkIHRvIGNvbGxlY3QgdG9nZXRoZXIgcmVsYXRlZAorCQkgKiBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YSBwYWlycyB0byBjcmVhdGUgYQorCQkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nLlNlZ21lbnR9CisJCSAqLworCQlwcml2YXRlIExhdExvbmcuU2VnbWVudEJ1aWxkZXIgc2VnbWVudEJ1aWxkZXIgPSBudWxsOworCisJCS8qKgorCQkgKiBUaGVzZSBhcmUgdGhlIGNoYXJhY3RlcnMgdGhhdCBoYXZlIGJlZW4gY29sbGVjdGVkIGJ1dCBhcmUgbm90IHlldAorCQkgKiBjb21wbGV0ZS4KKwkJICovCisJCXByaXZhdGUgU3RyaW5nQnVpbGRlciBjaGFyYWN0ZXJTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworCQkvKioKKwkJICogQ29uc3RydWN0b3IKKwkJICovCisJCXByb3RlY3RlZCBHTUxEZWNvZGVyKGZpbmFsIE1hcDxTdHJpbmcsIExhdExvbmc+IGxhdExvbmdNYXApIHsKKwkJCXN1cGVyKCk7CisJCQl0aGlzLmxhdExvbmdNYXAgPSBsYXRMb25nTWFwOworCQl9IC8vIEdNTERlY29kZXIKKworCQkvKioKKwkJICogQHNlZSBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyI3N0YXJ0RWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLAorCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KGZpbmFsIFN0cmluZyBuYW1lc3BhY2UsIGZpbmFsIFN0cmluZyBzTmFtZSwgZmluYWwgU3RyaW5nIHFOYW1lLAorCQkJCWZpbmFsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisJCQkvLyBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudAorCQkJZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lID0gc05hbWUuZXF1YWxzKCIiKSA/IHFOYW1lIDogc05hbWU7CisKKwkJCS8vIFRoZSAiTWFwIiByb290IGVsZW1lbnQ/CisJCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShYTUxfTUFQX0VMRU1FTlRfTkFNRSkpIHsKKwkJCQkvLyBZZXMKKwkJCQlhc3NlcnQgbGF0TG9uZ01hcCAhPSBudWxsOworCQkJfSAvLyBlbHNlIGlmIE1hcAorCisJCQkvLyBBIHRpdGxlIGVsZW1lbnQ/CisJCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFhNTF9USVRMRV9FTEVNRU5UX05BTUUpKSB7CisJCQkJLy8gWWVzCisJCQkJY2hhcmFjdGVyU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQl9IC8vIHRpdGxlCisKKwkJCS8vIHN1YlRpdGxlIGVsZW1lbnQ/CisJCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFhNTF9TVUJUSVRMRV9FTEVNRU5UX05BTUUpKSB7CisJCQkJLy8gWWVzCisJCQkJY2hhcmFjdGVyU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQl9IC8vIHN1YlRpdGxlCisKKwkJCS8vIHVwZGF0ZWQgZWxlbWVudD8KKwkJCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoWE1MX1VQREFURURfRUxFTUVOVF9OQU1FKSkgeworCQkJCS8vIFllcworCQkJCWNoYXJhY3RlclN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJfSAvLyB1cGRhdGVkCisKKwkJCS8vIGVudHJ5IGVsZW1lbnQ/CisJCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFhNTF9FTlRSWV9FTEVNRU5UX05BTUUpKSB7CisJCQkJLy8gWWVzCisJCQl9IC8vIHVwZGF0ZWQKKworCQkJLy8gd2hlcmUgZWxlbWVudD8KKwkJCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoWE1MX1dIRVJFX0VMRU1FTlRfTkFNRSkpIHsKKwkJCQkvLyBZZXMKKwkJCX0gLy8gd2hlcmUKKworCQkJLy8gb3V0ZXJCb3VuZGFyeUlzIGVsZW1lbnQ/CisJCQllbHNlIGlmIChlbGVtZW50TmFtZQorCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShYTUxfT1VURVJfQk9VTkRBUllfRUxFTUVOVF9OQU1FKSkgeworCQkJCS8vIFllcworCQkJfSAvLyBvdXRlckJvdW5kYXJ5SXMKKworCQkJLy8gbGluZWFyUmluZyBlbGVtZW50PworCQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShYTUxfTElORUFSX1JJTkdfRUxFTUVOVF9OQU1FKSkgeworCQkJCS8vIFllcworCQkJfSAvLyBsaW5lYXJSaW5nCisKKwkJCS8vIHBvbHlnb24gZWxlbWVudD8KKwkJCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoWE1MX1BPTFlHT05fRUxFTUVOVF9OQU1FKSkgeworCQkJCS8vIFllcworCQkJCWFzc2VydCBjdXJyZW50UG9seWdvbklkID09IG51bGw7CisJCQkJYXNzZXJ0IHBvbHlnb25MYXRMb25nID09IG51bGw7CisJCQkJY3VycmVudFBvbHlnb25JZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoWE1MX0lEX0FUVFIpOworCQkJCXBvbHlnb25MYXRMb25nID0gbmV3IExhdExvbmcoKTsKKwkJCX0gLy8gcG9seWdvbgorCisJCQkvLyBwb3NMaXN0IGVsZW1lbnQ/CisJCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFhNTF9QT1NMSVNUX0VMRU1FTlRfTkFNRSkpIHsKKwkJCQkvLyBZZXMKKwkJCQlhc3NlcnQgc2VnbWVudEJ1aWxkZXIgPT0gbnVsbDsKKwkJCQlzZWdtZW50QnVpbGRlciA9IG5ldyBTZWdtZW50QnVpbGRlcigpOworCQkJCWNoYXJhY3RlclN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJfSAvLyBwb3NMaXN0CisKKwkJCWVsc2UgeworCQkJCS8vIE5vCisJCQkJLy8gV2UgaGF2ZSBubyBpZGVhIHdoYXQgdGhpcyBlbGVtZW50IGlzCisJCQkJdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJJbnZhbGlkIGVsZW1lbnQgbmFtZSBcIiIKKwkJCQkJCSsgZWxlbWVudE5hbWUgKyAiXCIiLCBsb2NhdG9yKTsKKwkJCX0gLy8gZWxzZSB1bnJlY29nbml6ZWQgZWxlbWVudCBuYW1lCisJCX0gLy8gc3RhcnRFbGVtZW50CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciNlbmRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsCisJCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KGZpbmFsIFN0cmluZyBuYW1lc3BhY2UsIGZpbmFsIFN0cmluZyBzTmFtZSwgZmluYWwgU3RyaW5nIHFOYW1lKQorCQkJCXRocm93cyBTQVhFeGNlcHRpb24geworCQkJLy8gVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQKKwkJCWZpbmFsIFN0cmluZyBlbGVtZW50TmFtZSA9IHNOYW1lLmVxdWFscygiIikgPyBxTmFtZSA6IHNOYW1lOworCisJCQkvLyBUaGUgIk1hcCIgcm9vdCBlbGVtZW50PworCQkJaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoWE1MX01BUF9FTEVNRU5UX05BTUUpKSB7CisJCQkJLy8gWWVzCisJCQkJYXNzZXJ0IGxhdExvbmdNYXAgIT0gbnVsbDsKKwkJCX0gLy8gZWxzZSBpZiBNYXAKKworCQkJLy8gQSB0aXRsZSBlbGVtZW50PworCQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShYTUxfVElUTEVfRUxFTUVOVF9OQU1FKSkgeworCQkJCS8vIFllcworCQkJCXRpdGxlID0gY2hhcmFjdGVyU3RyaW5nQnVpbGRlci50b1N0cmluZygpOworCQkJCWNoYXJhY3RlclN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJfSAvLyB0aXRsZQorCisJCQkvLyBzdWJUaXRsZSBlbGVtZW50PworCQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShYTUxfU1VCVElUTEVfRUxFTUVOVF9OQU1FKSkgeworCQkJCS8vIFllcworCQkJCS8vIFdlJ3JlIGlnbm9yaW5nIHN1YnRpdGxlcyByaWdodCBub3cKKwkJCQkvLyBzdWJUaXRsZSA9IGNoYXJhY3RlclN0cmluZ0J1aWxkZXIudG9TdHJpbmcoKTsKKwkJCQljaGFyYWN0ZXJTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCX0gLy8gc3ViVGl0bGUKKworCQkJLy8gdXBkYXRlZCBlbGVtZW50PworCQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShYTUxfVVBEQVRFRF9FTEVNRU5UX05BTUUpKSB7CisJCQkJLy8gWWVzCisJCQkJLy8gdXBkYXRlZCA9IGNoYXJhY3RlclN0cmluZ0J1aWxkZXIudG9TdHJpbmcoKTsKKwkJCQljaGFyYWN0ZXJTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCX0gLy8gdXBkYXRlZAorCisJCQkvLyBlbnRyeSBlbGVtZW50PworCQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShYTUxfRU5UUllfRUxFTUVOVF9OQU1FKSkgeworCQkJCS8vIFllcworCQkJfSAvLyBlbnRyeQorCisJCQkvLyB3aGVyZSBlbGVtZW50PworCQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShYTUxfV0hFUkVfRUxFTUVOVF9OQU1FKSkgeworCQkJCS8vIFllcworCQkJfSAvLyB3aGVyZQorCisJCQkvLyBvdXRlckJvdW5kYXJ5SXMgZWxlbWVudD8KKwkJCWVsc2UgaWYgKGVsZW1lbnROYW1lCisJCQkJCS5lcXVhbHNJZ25vcmVDYXNlKFhNTF9PVVRFUl9CT1VOREFSWV9FTEVNRU5UX05BTUUpKSB7CisJCQkJLy8gWWVzCisJCQl9IC8vIG91dGVyQm91bmRhcnlJcworCisJCQkvLyBsaW5lYXJSaW5nIGVsZW1lbnQ/CisJCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFhNTF9MSU5FQVJfUklOR19FTEVNRU5UX05BTUUpKSB7CisJCQkJLy8gWWVzCisJCQl9IC8vIGxpbmVhclJpbmcKKworCQkJLy8gcG9seWdvbiBlbGVtZW50PworCQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShYTUxfUE9MWUdPTl9FTEVNRU5UX05BTUUpKSB7CisJCQkJLy8gWWVzCisJCQkJbGF0TG9uZ01hcC5wdXQoY3VycmVudFBvbHlnb25JZCwgcG9seWdvbkxhdExvbmcpOworCQkJCWN1cnJlbnRQb2x5Z29uSWQgPSBudWxsOworCQkJCXBvbHlnb25MYXRMb25nID0gbnVsbDsKKwkJCX0gLy8gcG9seWdvbgorCisJCQkvLyBwb3NMaXN0IGVsZW1lbnQ/CisJCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFhNTF9QT1NMSVNUX0VMRU1FTlRfTkFNRSkpIHsKKwkJCQkvLyBZZXMKKwkJCQkvLyBQYXJzZSB0aGUgY3VycmVudCBjaGFyYWN0ZXJzIGZvciB0aGUgbGF0aXR1ZGUvbG9uZ2l0dWRlIGRhdGEKKwkJCQkvLyBwYWlycworCisJCQkJZmluYWwgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcigKKwkJCQkJCWNoYXJhY3RlclN0cmluZ0J1aWxkZXIudG9TdHJpbmcoKSwgIiBcbiIpOworCQkJCWNoYXJhY3RlclN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisJCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworCQkJCQlmaW5hbCBTdHJpbmcgdmFsdWUxID0gc3QubmV4dFRva2VuKCk7CisJCQkJCS8vIElzIHRoZXJlIGEgbWF0Y2hpbmcgTG9uZ2l0dWRlPworCQkJCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCS8vIExhdAorCQkJCQkJZmluYWwgU3RyaW5nIHZhbHVlMiA9IHN0Lm5leHRUb2tlbigpOworCQkJCQkJc2VnbWVudEJ1aWxkZXIuYWRkKHZhbHVlMSwgdmFsdWUyKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIE5vCisJCQkJCQkvLyBsYXQvbG9uZyBtaXNtYXRjaAorCQkJCQkJQWN0aXZhdG9yCisJCQkJCQkJCS5sb2dFcnJvcigKKwkJCQkJCQkJCQkiTGF0aXR1ZGUvTG9uZ2l0dWRlIGRhdGEgdGl0bGVkIFwiIgorCQkJCQkJCQkJCQkJKyB0aXRsZQorCQkJCQkJCQkJCQkJKyAiXCIgaXMgbWlzc2luZyBhIGxvbmdpdHVkZSAgbWF0Y2ggZm9yIHRoZSBsYXRpdHVkZSB2YWx1ZSBcIiIKKwkJCQkJCQkJCQkJCSsgdmFsdWUxICsgIlwiIGF0IGxpbmU6ICIKKwkJCQkJCQkJCQkJCSsgbG9jYXRvci5nZXRMaW5lTnVtYmVyKCkKKwkJCQkJCQkJCQkJCSsgIiwgY29sdW1uOiAiCisJCQkJCQkJCQkJCQkrIGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCksCisJCQkJCQkJCQkJbnVsbCk7CisJCQkJCQkvLyBkaXNjYXJkIHdoYXRldmVyIHdlJ3ZlIGNvbGxlY3RlZCBzbyBmYXIKKwkJCQkJCXNlZ21lbnRCdWlsZGVyLmNsZWFyKCk7CisJCQkJCQlicmVhazsKKwkJCQkJfSAvLyBlbHNlCisJCQkJfSAvLyB3aGlsZSBtb3JlIHRva2VucworCisJCQkJLy8gQW55dGhpbmcgaW4gdGhlIHNlZ21lbnQ/CisJCQkJaWYgKHNlZ21lbnRCdWlsZGVyLnNpemUoKSA+IDApIHsKKwkJCQkJLy8gWWVzCisJCQkJCXRyeSB7CisJCQkJCQlwb2x5Z29uTGF0TG9uZy5hZGQoaXNTYW1wbGluZyA/IHNlZ21lbnRCdWlsZGVyCisJCQkJCQkJCS50b1NlZ21lbnQoc2FtcGxlRnJlcXVlbmN5KSA6IHNlZ21lbnRCdWlsZGVyCisJCQkJCQkJCS50b1NlZ21lbnQoKSk7CisJCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKKwkJCQkJCUFjdGl2YXRvci5sb2dFcnJvcigKKwkJCQkJCQkJIlByb2JsZW0gcHJvY2Vzc2luZyBMYXRpdHVkZS9Mb25naXR1ZGUgZGF0YSB0aXRsZWQgXCIiCisJCQkJCQkJCQkJKyB0aXRsZSArICJcIiIsIGlhZSk7CisJCQkJCX0KKwkJCQl9IC8vIGlmCisJCQkJc2VnbWVudEJ1aWxkZXIgPSBudWxsOworCQkJfSAvLyBwb3NMaXN0CisJCQllbHNlIHsKKwkJCQkvLyBObworCQkJCS8vIFdlIGhhdmUgbm8gaWRlYSB3aGF0IHRoaXMgZWxlbWVudCBpcworCQkJCXRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiSW52YWxpZCBlbGVtZW50IG5hbWUgXCIiCisJCQkJCQkrIGVsZW1lbnROYW1lICsgIlwiIiwgbG9jYXRvcik7CisJCQl9IC8vIGVsc2UgdW5yZWNvZ25pemVkIGVsZW1lbnQgbmFtZQorCQl9IC8vIGVuZEVsZW1lbnQKKworCQkvKioKKwkJICogQHNlZSBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyI2NoYXJhY3RlcnMoY2hhcltdLCBpbnQsIGludCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGZpbmFsIGNoYXJbXSBjaCwgZmluYWwgaW50IHN0YXJ0LAorCQkJCWZpbmFsIGludCBsZW5ndGgpIHsKKwkJCWNoYXJhY3RlclN0cmluZ0J1aWxkZXIuYXBwZW5kKG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpKTsKKwkJfSAvLyBjaGFyYWN0ZXJzCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHdhcm5pbmcoZmluYWwgU0FYUGFyc2VFeGNlcHRpb24gc3BlKSB7CisJCQlBY3RpdmF0b3IubG9nSW5mb3JtYXRpb24oc3BlLmdldE1lc3NhZ2UoKSwgc3BlKTsKKwkJfSAvLyB3YXJuaW5nCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBlcnJvcihmaW5hbCBTQVhQYXJzZUV4Y2VwdGlvbiBzcGUpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcihzcGUuZ2V0TWVzc2FnZSgpLCBzcGUpOworCQl9IC8vIGVycm9yCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciNmYXRhbEVycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoZmluYWwgU0FYUGFyc2VFeGNlcHRpb24gc3BlKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3Ioc3BlLmdldE1lc3NhZ2UoKSwgc3BlKTsKKwkJfSAvLyBmYXRhbEVycm9yCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciNzZXREb2N1bWVudExvY2F0b3Iob3JnLnhtbC5zYXguTG9jYXRvcikKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoZmluYWwgTG9jYXRvciBsb2NhdG9yKSB7CisJCQl0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOworCQl9IC8vIHNldERvY3VtZW50TG9jYXRvcgorCisJfSAvLyBHTUxEZWNvZGVyCisKK30gLy8gUGxhdGZvcm1MYXRMb25nRGF0YVByb3ZpZGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3NwYXRpYWwvZ2VvL3ByZWZlcmVuY2VzL01hcERhdGFNYW5hZ2VtZW50UHJlZmVyZW5jZVBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vcHJlZmVyZW5jZXMvTWFwRGF0YU1hbmFnZW1lbnRQcmVmZXJlbmNlUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MTI3OTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3NwYXRpYWwvZ2VvL3ByZWZlcmVuY2VzL01hcERhdGFNYW5hZ2VtZW50UHJlZmVyZW5jZVBhZ2UuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLnByZWZlcmVuY2VzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuQm9vbGVhbkZpZWxkRWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkludGVnZXJGaWVsZEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwcmVmZXJlbmNlIHBhZ2UgdGhhdCBpcyBjb250cmlidXRlZCB0byB0aGUKKyAqIFByZWZlcmVuY2VzIGRpYWxvZy4gQnkgc3ViLWNsYXNzaW5nIDxjb2RlPkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U8L2NvZGU+LAorICogd2UgY2FuIHVzZSB0aGUgZmllbGQgc3VwcG9ydCBidWlsdCBpbnRvIEpGYWNlIHRoYXQgYWxsb3dzIHVzIHRvIGNyZWF0ZSBhIHBhZ2UKKyAqIHRoYXQgaXMgc21hbGwgYW5kIGtub3dzIGhvdyB0byBzYXZlLCByZXN0b3JlIGFuZCBhcHBseSBpdHNlbGYuCisgKiA8cD4KKyAqIFRoaXMgcGFnZSBpcyB1c2VkIHRvIG1vZGlmeSBwcmVmZXJlbmNlcyBvbmx5LiBUaGV5IGFyZSBzdG9yZWQgaW4gdGhlCisgKiBwcmVmZXJlbmNlIHN0b3JlIHRoYXQgYmVsb25ncyB0byB0aGUgbWFpbiBwbHVnLWluIGNsYXNzLiBUaGF0IHdheSwKKyAqIHByZWZlcmVuY2VzIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSB2aWEgdGhlIHByZWZlcmVuY2Ugc3RvcmUuCisgKi8KKworcHVibGljIGNsYXNzIE1hcERhdGFNYW5hZ2VtZW50UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlCisJCWltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1pbmltdW0gc2FtcGxlIGZyZXF1ZW5jeSBmb3IgbGF0L2xvbmcgcG9seWdvbiBkYXRhLiBBIHZhbHVlCisJICogb2YgMSBtZWFucyBhbGwgcG9pbnRzIGFyZSBpbmNsdWRlZCAoaS5lLiBubyBzYW1wbGluZykKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fU0FNUExFX0ZSRVFVRU5DWSA9IDE7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtYXhpbXVtIHNhbXBsZSBmcmVxdWVuY3kgZm9yIGxhdC9sb25nIHBvbHlnb24gZGF0YS4gVGhlcmUgaXMKKwkgKiBubyBnb29kIHZhbHVlIGZvciB0aGlzLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfU0FNUExFX0ZSRVFVRU5DWSA9IDEwMDA7CisKKwlCb29sZWFuRmllbGRFZGl0b3IgZW5hYmxlRG93bnNhbXBsZUZpZWxkRWRpdG9yID0gbnVsbDsKKworCUludGVnZXJGaWVsZEVkaXRvciBsYXRMb25nU2FtcGxlRnJlcXVlbmN5RmllbGRFZGl0b3IgPSBudWxsOworCisJQm9vbGVhbkZpZWxkRWRpdG9yIGVuYWJsZUlPRXhjZXB0aW9uUmVwb3J0aW5nRmllbGRFZGl0b3IgPSBudWxsOworCisJQm9vbGVhbkZpZWxkRWRpdG9yIHVzZUxvd1Jlc29sdXRpb25MYXRMb25nRGF0YUZpZWxkRWRpdG9yID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJcHVibGljIE1hcERhdGFNYW5hZ2VtZW50UHJlZmVyZW5jZVBhZ2UoKSB7CisJCXN1cGVyKEdSSUQpOworCQlzZXRQcmVmZXJlbmNlU3RvcmUoQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7CisJCXNldERlc2NyaXB0aW9uKCJMYXRpdHVkZS9Mb25naXR1ZGUgcG9seWdvbiBzYW1wbGUgZnJlcXVlbmNlIHNwZWNpZmljYXRpb24uIik7CisJfSAvLyBNYXBEYXRhTWFuYWdlbWVudFByZWZlcmVuY2VQYWdlCisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBmaWVsZCBlZGl0b3JzLiBGaWVsZCBlZGl0b3JzIGFyZSBhYnN0cmFjdGlvbnMgb2YgdGhlIGNvbW1vbgorCSAqIEdVSSBibG9ja3MgbmVlZGVkIHRvIG1hbmlwdWxhdGUgdmFyaW91cyB0eXBlcyBvZiBwcmVmZXJlbmNlcy4gRWFjaCBmaWVsZAorCSAqIGVkaXRvciBrbm93cyBob3cgdG8gc2F2ZSBhbmQgcmVzdG9yZSBpdHNlbGYuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3JlYXRlRmllbGRFZGl0b3JzKCkgeworCQllbmFibGVEb3duc2FtcGxlRmllbGRFZGl0b3IgPSBuZXcgQm9vbGVhbkZpZWxkRWRpdG9yKAorCQkJCVByZWZlcmVuY2VDb25zdGFudHMuRE9XTl9TQU1QTEVfTEFUX0xPTkdfREFUQV9CT09MRUFOX1BSRUZFUkVOQ0UsCisJCQkJIiZEb3duIHNhbXBsZSBsYXRpdHVkZS9sb25naXR1ZGUgcG9seWdvbnMuIiwKKwkJCQlnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKKworCQlsYXRMb25nU2FtcGxlRnJlcXVlbmN5RmllbGRFZGl0b3IgPSBuZXcgSW50ZWdlckZpZWxkRWRpdG9yKAorCQkJCVByZWZlcmVuY2VDb25zdGFudHMuTEFUX0xPTkdfU0FNUExFX0ZSRVFVRU5DWV9JTlRFR0VSX1BSRUZFUkVOQ0UsCisJCQkJIiZsYXRpdHVkZS9sb25naXR1ZGUgZGF0YSBzYW1wbGUgZnJlcXVlbmN5LiIsCisJCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7CisJCWxhdExvbmdTYW1wbGVGcmVxdWVuY3lGaWVsZEVkaXRvci5zZXRWYWxpZFJhbmdlKE1JTl9TQU1QTEVfRlJFUVVFTkNZLAorCQkJCU1BWF9TQU1QTEVfRlJFUVVFTkNZKTsKKwkJbGF0TG9uZ1NhbXBsZUZyZXF1ZW5jeUZpZWxkRWRpdG9yCisJCQkJLnNldEVycm9yTWVzc2FnZSgiRXJyb3I6IFZhbGlkIHJhbmdlOiAiICsgTUlOX1NBTVBMRV9GUkVRVUVOQ1kKKwkJCQkJCSsgIiB0byAiICsgTUFYX1NBTVBMRV9GUkVRVUVOQ1kgKyAiIGRhdGEgcG9pbnRzLiIpOworCisJCWVuYWJsZUlPRXhjZXB0aW9uUmVwb3J0aW5nRmllbGRFZGl0b3IgPSBuZXcgQm9vbGVhbkZpZWxkRWRpdG9yKAorCQkJCVByZWZlcmVuY2VDb25zdGFudHMuUkVQT1JUX0lPX0VYQ0VQVElPTlNfQk9PTEVBTl9QUkVGRVJFTkNFLAorCQkJCSImUmVwb3J0IEkvTyBFeGNlcHRpb25zLiIsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOworCisJCXVzZUxvd1Jlc29sdXRpb25MYXRMb25nRGF0YUZpZWxkRWRpdG9yID0gbmV3IEJvb2xlYW5GaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlVTRV9MT1dFUl9SRVNPTFVUSU9OX0xBVF9MT05HX0RBVEFfQk9PTEVBTl9QUkVGRVJFTkNFLAorCQkJCSImVXNlIGxvd2VyIHJlc29sdXRpb24gbGF0L2xvbmcgZGF0YSBpZiBhdmFpbGFibGUuIiwKKwkJCQlnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKKworCQlhZGRGaWVsZChlbmFibGVEb3duc2FtcGxlRmllbGRFZGl0b3IpOworCQlhZGRGaWVsZChsYXRMb25nU2FtcGxlRnJlcXVlbmN5RmllbGRFZGl0b3IpOworCQlhZGRGaWVsZChlbmFibGVJT0V4Y2VwdGlvblJlcG9ydGluZ0ZpZWxkRWRpdG9yKTsKKwkJYWRkRmllbGQodXNlTG93UmVzb2x1dGlvbkxhdExvbmdEYXRhRmllbGRFZGl0b3IpOworCX0gLy8gY3JlYXRlRmllbGRFZGl0b3JzCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCisJICovCisJcHVibGljIHZvaWQgaW5pdChmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCkgeworCQkvLyBOb3RoaW5nCisJfQorCit9IC8vIE1hcERhdGFNYW5hZ2VtZW50UHJlZmVyZW5jZVBhZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1NzBkNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5wcmVmZXJlbmNlczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQ29uc3RhbnQgZGVmaW5pdGlvbnMgZm9yIHBsdWctaW4gcHJlZmVyZW5jZXMKKyAqLworcHVibGljIGludGVyZmFjZSBQcmVmZXJlbmNlQ29uc3RhbnRzIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPV05fU0FNUExFX0xBVF9MT05HX0RBVEFfQk9PTEVBTl9QUkVGRVJFTkNFID0gIm9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGF0bG9uZy5zYW1wbGUiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFUX0xPTkdfU0FNUExFX0ZSRVFVRU5DWV9JTlRFR0VSX1BSRUZFUkVOQ0UgPSAib3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYXRsb25nLnNhbXBsZWZyZXF1ZW5jeSI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRfSU9fRVhDRVBUSU9OU19CT09MRUFOX1BSRUZFUkVOQ0UgPSAib3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYXRsb25nLmlvcmVwb3J0IjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9MT1dFUl9SRVNPTFVUSU9OX0xBVF9MT05HX0RBVEFfQk9PTEVBTl9QUkVGRVJFTkNFID0gIm9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGF0bG9uZy5sb3dyZXNvbHV0aW9uIjsKKworfSAvLyBQcmVmZXJlbmNlQ29uc3RhbnRzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3NwYXRpYWwvZ2VvL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDlhZWZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDQ2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8ucHJlZmVyZW5jZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLkFjdGl2YXRvcjsKKworLyoqCisgKiBDbGFzcyB1c2VkIHRvIGluaXRpYWxpemUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KKyAqLworcHVibGljIGNsYXNzIFByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7CisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOworCQlzdG9yZQorCQkJCS5zZXREZWZhdWx0KAorCQkJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5MQVRfTE9OR19TQU1QTEVfRlJFUVVFTkNZX0lOVEVHRVJfUFJFRkVSRU5DRSwKKwkJCQkJCU1hcERhdGFNYW5hZ2VtZW50UHJlZmVyZW5jZVBhZ2UuTUlOX1NBTVBMRV9GUkVRVUVOQ1kpOworCQlzdG9yZQorCQkJCS5zZXREZWZhdWx0KAorCQkJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5ET1dOX1NBTVBMRV9MQVRfTE9OR19EQVRBX0JPT0xFQU5fUFJFRkVSRU5DRSwKKwkJCQkJCWZhbHNlKTsKKwkJc3RvcmUuc2V0RGVmYXVsdCgKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlJFUE9SVF9JT19FWENFUFRJT05TX0JPT0xFQU5fUFJFRkVSRU5DRSwKKwkJCQlmYWxzZSk7CisJCXN0b3JlCisJCQkJLnNldERlZmF1bHQoCisJCQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlVTRV9MT1dFUl9SRVNPTFVUSU9OX0xBVF9MT05HX0RBVEFfQk9PTEVBTl9QUkVGRVJFTkNFLAorCQkJCQkJdHJ1ZSk7CisJfSAvLyBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzCit9IC8vIFByZWZlcmVuY2VJbml0aWFsaXplcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9FZGdlc0ZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvRWRnZXNGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxNTg0MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvRWRnZXNGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMDUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5FZGdlc1BhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBFZGdlc0ZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7CisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFZGdlc0ZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLkVkZ2VzRmFjdG9yeUltcGwuaW5pdCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NaWdyYXRpb24gRWRnZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWlncmF0aW9uIEVkZ2U8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCU1pZ3JhdGlvbkVkZ2UgY3JlYXRlTWlncmF0aW9uRWRnZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NaWdyYXRpb24gRWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWlncmF0aW9uIEVkZ2UgTGFiZWw8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCU1pZ3JhdGlvbkVkZ2VMYWJlbCBjcmVhdGVNaWdyYXRpb25FZGdlTGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWlncmF0aW9uIEVkZ2UgTGFiZWwgVmFsdWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1pZ3JhdGlvbiBFZGdlIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSBjcmVhdGVNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NaXhpbmcgRWRnZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWl4aW5nIEVkZ2U8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCU1peGluZ0VkZ2UgY3JlYXRlTWl4aW5nRWRnZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NaXhpbmcgRWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWl4aW5nIEVkZ2UgTGFiZWw8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCU1peGluZ0VkZ2VMYWJlbCBjcmVhdGVNaXhpbmdFZGdlTGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWl4aW5nIEVkZ2UgTGFiZWwgVmFsdWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1peGluZyBFZGdlIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlNaXhpbmdFZGdlTGFiZWxWYWx1ZSBjcmVhdGVNaXhpbmdFZGdlTGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3B1bGF0aW9uIEVkZ2U8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcHVsYXRpb24gRWRnZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUG9wdWxhdGlvbkVkZ2UgY3JlYXRlUG9wdWxhdGlvbkVkZ2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRWRnZXNQYWNrYWdlIGdldEVkZ2VzUGFja2FnZSgpOworCit9IC8vRWRnZXNGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL0VkZ2VzUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9FZGdlc1BhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjhkMzMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9FZGdlc1BhY2thZ2UuamF2YQpAQCAtMCwwICsxLDgzOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50CisgKiA8dWw+CisgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorICogPC91bD4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLkVkZ2VzRmFjdG9yeQorICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWRnZXNQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgeworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOQU1FID0gImVkZ2VzIjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzLmVjb3JlIjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMiOworCisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFZGdlc1BhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLkVkZ2VzUGFja2FnZUltcGwuaW5pdCgpOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuUG9wdWxhdGlvbkVkZ2VJbXBsIDxlbT5Qb3B1bGF0aW9uIEVkZ2U8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuUG9wdWxhdGlvbkVkZ2VJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuRWRnZXNQYWNrYWdlSW1wbCNnZXRQb3B1bGF0aW9uRWRnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBQT1BVTEFUSU9OX0VER0UgPSA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBPUFVMQVRJT05fRURHRV9fVVJJID0gR3JhcGhQYWNrYWdlLkVER0VfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBPUFVMQVRJT05fRURHRV9fVFlQRV9VUkkgPSBHcmFwaFBhY2thZ2UuRURHRV9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQT1BVTEFUSU9OX0VER0VfX0RVQkxJTl9DT1JFID0gR3JhcGhQYWNrYWdlLkVER0VfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkE8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQT1BVTEFUSU9OX0VER0VfX0EgPSBHcmFwaFBhY2thZ2UuRURHRV9fQTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlIEFVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQT1BVTEFUSU9OX0VER0VfX05PREVfQVVSSSA9IEdyYXBoUGFja2FnZS5FREdFX19OT0RFX0FVUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBPUFVMQVRJT05fRURHRV9fQiA9IEdyYXBoUGFja2FnZS5FREdFX19COworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGUgQlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBPUFVMQVRJT05fRURHRV9fTk9ERV9CVVJJID0gR3JhcGhQYWNrYWdlLkVER0VfX05PREVfQlVSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBPUFVMQVRJT05fRURHRV9fTEFCRUwgPSBHcmFwaFBhY2thZ2UuRURHRV9fTEFCRUw7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlyZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQT1BVTEFUSU9OX0VER0VfX0RJUkVDVEVEID0gR3JhcGhQYWNrYWdlLkVER0VfX0RJUkVDVEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBPUFVMQVRJT05fRURHRV9fUE9QVUxBVElPTl9JREVOVElGSUVSID0gR3JhcGhQYWNrYWdlLkVER0VfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbiBFZGdlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBPUFVMQVRJT05fRURHRV9GRUFUVVJFX0NPVU5UID0gR3JhcGhQYWNrYWdlLkVER0VfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbC5NaWdyYXRpb25FZGdlSW1wbCA8ZW0+TWlncmF0aW9uIEVkZ2U8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuTWlncmF0aW9uRWRnZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbC5FZGdlc1BhY2thZ2VJbXBsI2dldE1pZ3JhdGlvbkVkZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgTUlHUkFUSU9OX0VER0UgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1JR1JBVElPTl9FREdFX19VUkkgPSBQT1BVTEFUSU9OX0VER0VfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1JR1JBVElPTl9FREdFX19UWVBFX1VSSSA9IFBPUFVMQVRJT05fRURHRV9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSUdSQVRJT05fRURHRV9fRFVCTElOX0NPUkUgPSBQT1BVTEFUSU9OX0VER0VfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkE8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSUdSQVRJT05fRURHRV9fQSA9IFBPUFVMQVRJT05fRURHRV9fQTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlIEFVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSUdSQVRJT05fRURHRV9fTk9ERV9BVVJJID0gUE9QVUxBVElPTl9FREdFX19OT0RFX0FVUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1JR1JBVElPTl9FREdFX19CID0gUE9QVUxBVElPTl9FREdFX19COworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGUgQlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1JR1JBVElPTl9FREdFX19OT0RFX0JVUkkgPSBQT1BVTEFUSU9OX0VER0VfX05PREVfQlVSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1JR1JBVElPTl9FREdFX19MQUJFTCA9IFBPUFVMQVRJT05fRURHRV9fTEFCRUw7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlyZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSUdSQVRJT05fRURHRV9fRElSRUNURUQgPSBQT1BVTEFUSU9OX0VER0VfX0RJUkVDVEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1JR1JBVElPTl9FREdFX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBQT1BVTEFUSU9OX0VER0VfX1BPUFVMQVRJT05fSURFTlRJRklFUjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NaWdyYXRpb24gRWRnZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSUdSQVRJT05fRURHRV9GRUFUVVJFX0NPVU5UID0gUE9QVUxBVElPTl9FREdFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuTWlncmF0aW9uRWRnZUxhYmVsSW1wbCA8ZW0+TWlncmF0aW9uIEVkZ2UgTGFiZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuTWlncmF0aW9uRWRnZUxhYmVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLkVkZ2VzUGFja2FnZUltcGwjZ2V0TWlncmF0aW9uRWRnZUxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IE1JR1JBVElPTl9FREdFX0xBQkVMID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSUdSQVRJT05fRURHRV9MQUJFTF9fVVJJID0gR3JhcGhQYWNrYWdlLkVER0VfTEFCRUxfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1JR1JBVElPTl9FREdFX0xBQkVMX19UWVBFX1VSSSA9IEdyYXBoUGFja2FnZS5FREdFX0xBQkVMX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1JR1JBVElPTl9FREdFX0xBQkVMX19EVUJMSU5fQ09SRSA9IEdyYXBoUGFja2FnZS5FREdFX0xBQkVMX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkkgT2YgSWRlbnRpZmlhYmxlIFRvIEJlIExhYmVsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSUdSQVRJT05fRURHRV9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEID0gR3JhcGhQYWNrYWdlLkVER0VfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUlHUkFUSU9OX0VER0VfTEFCRUxfX0NVUlJFTlRfVkFMVUUgPSBHcmFwaFBhY2thZ2UuRURHRV9MQUJFTF9fQ1VSUkVOVF9WQUxVRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZGVudGlmaWFibGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSUdSQVRJT05fRURHRV9MQUJFTF9fSURFTlRJRklBQkxFID0gR3JhcGhQYWNrYWdlLkVER0VfTEFCRUxfX0lERU5USUZJQUJMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FZGdlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1JR1JBVElPTl9FREdFX0xBQkVMX19FREdFID0gR3JhcGhQYWNrYWdlLkVER0VfTEFCRUxfX0VER0U7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWlncmF0aW9uIEVkZ2UgTGFiZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUlHUkFUSU9OX0VER0VfTEFCRUxfRkVBVFVSRV9DT1VOVCA9IEdyYXBoUGFja2FnZS5FREdFX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuTWlncmF0aW9uRWRnZUxhYmVsVmFsdWVJbXBsIDxlbT5NaWdyYXRpb24gRWRnZSBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbC5NaWdyYXRpb25FZGdlTGFiZWxWYWx1ZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbC5FZGdlc1BhY2thZ2VJbXBsI2dldE1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IE1JR1JBVElPTl9FREdFX0xBQkVMX1ZBTFVFID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaWdyYXRpb24gUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1JR1JBVElPTl9FREdFX0xBQkVMX1ZBTFVFX19NSUdSQVRJT05fUkFURSA9IEdyYXBoUGFja2FnZS5MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NaWdyYXRpb24gRWRnZSBMYWJlbCBWYWx1ZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSUdSQVRJT05fRURHRV9MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UID0gR3JhcGhQYWNrYWdlLkxBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuTWl4aW5nRWRnZUltcGwgPGVtPk1peGluZyBFZGdlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLk1peGluZ0VkZ2VJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuRWRnZXNQYWNrYWdlSW1wbCNnZXRNaXhpbmdFZGdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IE1JWElOR19FREdFID0gMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSVhJTkdfRURHRV9fVVJJID0gUE9QVUxBVElPTl9FREdFX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSVhJTkdfRURHRV9fVFlQRV9VUkkgPSBQT1BVTEFUSU9OX0VER0VfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUlYSU5HX0VER0VfX0RVQkxJTl9DT1JFID0gUE9QVUxBVElPTl9FREdFX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUlYSU5HX0VER0VfX0EgPSBQT1BVTEFUSU9OX0VER0VfX0E7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZSBBVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUlYSU5HX0VER0VfX05PREVfQVVSSSA9IFBPUFVMQVRJT05fRURHRV9fTk9ERV9BVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSVhJTkdfRURHRV9fQiA9IFBPUFVMQVRJT05fRURHRV9fQjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlIEJVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSVhJTkdfRURHRV9fTk9ERV9CVVJJID0gUE9QVUxBVElPTl9FREdFX19OT0RFX0JVUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSVhJTkdfRURHRV9fTEFCRUwgPSBQT1BVTEFUSU9OX0VER0VfX0xBQkVMOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUlYSU5HX0VER0VfX0RJUkVDVEVEID0gUE9QVUxBVElPTl9FREdFX19ESVJFQ1RFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSVhJTkdfRURHRV9fUE9QVUxBVElPTl9JREVOVElGSUVSID0gUE9QVUxBVElPTl9FREdFX19QT1BVTEFUSU9OX0lERU5USUZJRVI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWl4aW5nIEVkZ2U8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUlYSU5HX0VER0VfRkVBVFVSRV9DT1VOVCA9IFBPUFVMQVRJT05fRURHRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLk1peGluZ0VkZ2VMYWJlbEltcGwgPGVtPk1peGluZyBFZGdlIExhYmVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLk1peGluZ0VkZ2VMYWJlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbC5FZGdlc1BhY2thZ2VJbXBsI2dldE1peGluZ0VkZ2VMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBNSVhJTkdfRURHRV9MQUJFTCA9IDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUlYSU5HX0VER0VfTEFCRUxfX1VSSSA9IEdyYXBoUGFja2FnZS5FREdFX0xBQkVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSVhJTkdfRURHRV9MQUJFTF9fVFlQRV9VUkkgPSBHcmFwaFBhY2thZ2UuRURHRV9MQUJFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSVhJTkdfRURHRV9MQUJFTF9fRFVCTElOX0NPUkUgPSBHcmFwaFBhY2thZ2UuRURHRV9MQUJFTF9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUlYSU5HX0VER0VfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCA9IEdyYXBoUGFja2FnZS5FREdFX0xBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1JWElOR19FREdFX0xBQkVMX19DVVJSRU5UX1ZBTFVFID0gR3JhcGhQYWNrYWdlLkVER0VfTEFCRUxfX0NVUlJFTlRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRlbnRpZmlhYmxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUlYSU5HX0VER0VfTEFCRUxfX0lERU5USUZJQUJMRSA9IEdyYXBoUGFja2FnZS5FREdFX0xBQkVMX19JREVOVElGSUFCTEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWRnZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSVhJTkdfRURHRV9MQUJFTF9fRURHRSA9IEdyYXBoUGFja2FnZS5FREdFX0xBQkVMX19FREdFOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1peGluZyBFZGdlIExhYmVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1JWElOR19FREdFX0xBQkVMX0ZFQVRVUkVfQ09VTlQgPSBHcmFwaFBhY2thZ2UuRURHRV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLk1peGluZ0VkZ2VMYWJlbFZhbHVlSW1wbCA8ZW0+TWl4aW5nIEVkZ2UgTGFiZWwgVmFsdWU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuTWl4aW5nRWRnZUxhYmVsVmFsdWVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuRWRnZXNQYWNrYWdlSW1wbCNnZXRNaXhpbmdFZGdlTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBNSVhJTkdfRURHRV9MQUJFTF9WQUxVRSA9IDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWl4aW5nIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSVhJTkdfRURHRV9MQUJFTF9WQUxVRV9fTUlYSU5HX1JBVEUgPSBHcmFwaFBhY2thZ2UuTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWl4aW5nIEVkZ2UgTGFiZWwgVmFsdWU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUlYSU5HX0VER0VfTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCA9IEdyYXBoUGFja2FnZS5MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UICsgMTsKKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlIDxlbT5NaWdyYXRpb24gRWRnZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NaWdyYXRpb24gRWRnZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0TWlncmF0aW9uRWRnZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlTGFiZWwgPGVtPk1pZ3JhdGlvbiBFZGdlIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1pZ3JhdGlvbiBFZGdlIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldE1pZ3JhdGlvbkVkZ2VMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSA8ZW0+TWlncmF0aW9uIEVkZ2UgTGFiZWwgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWlncmF0aW9uIEVkZ2UgTGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlI2dldE1pZ3JhdGlvblJhdGUgPGVtPk1pZ3JhdGlvbiBSYXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWlncmF0aW9uIFJhdGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlI2dldE1pZ3JhdGlvblJhdGUoKQorCSAqIEBzZWUgI2dldE1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZV9NaWdyYXRpb25SYXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1peGluZ0VkZ2UgPGVtPk1peGluZyBFZGdlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1peGluZyBFZGdlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaXhpbmdFZGdlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRNaXhpbmdFZGdlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1peGluZ0VkZ2VMYWJlbCA8ZW0+TWl4aW5nIEVkZ2UgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWl4aW5nIEVkZ2UgTGFiZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1peGluZ0VkZ2VMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0TWl4aW5nRWRnZUxhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1peGluZ0VkZ2VMYWJlbFZhbHVlIDxlbT5NaXhpbmcgRWRnZSBMYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NaXhpbmcgRWRnZSBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWl4aW5nRWRnZUxhYmVsVmFsdWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldE1peGluZ0VkZ2VMYWJlbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWl4aW5nRWRnZUxhYmVsVmFsdWUjZ2V0TWl4aW5nUmF0ZSA8ZW0+TWl4aW5nIFJhdGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NaXhpbmcgUmF0ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWl4aW5nRWRnZUxhYmVsVmFsdWUjZ2V0TWl4aW5nUmF0ZSgpCisJICogQHNlZSAjZ2V0TWl4aW5nRWRnZUxhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldE1peGluZ0VkZ2VMYWJlbFZhbHVlX01peGluZ1JhdGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuUG9wdWxhdGlvbkVkZ2UgPGVtPlBvcHVsYXRpb24gRWRnZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qb3B1bGF0aW9uIEVkZ2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLlBvcHVsYXRpb25FZGdlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRQb3B1bGF0aW9uRWRnZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLlBvcHVsYXRpb25FZGdlI2dldFBvcHVsYXRpb25JZGVudGlmaWVyIDxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLlBvcHVsYXRpb25FZGdlI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkKKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uRWRnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UG9wdWxhdGlvbkVkZ2VfUG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogQGdlbmVyYXRlZAorCSAqLworCUVkZ2VzRmFjdG9yeSBnZXRFZGdlc0ZhY3RvcnkoKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKwkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorCSAqIDwvdWw+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCWludGVyZmFjZSBMaXRlcmFscyB7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLk1pZ3JhdGlvbkVkZ2VJbXBsIDxlbT5NaWdyYXRpb24gRWRnZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbC5NaWdyYXRpb25FZGdlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbC5FZGdlc1BhY2thZ2VJbXBsI2dldE1pZ3JhdGlvbkVkZ2UoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgTUlHUkFUSU9OX0VER0UgPSBlSU5TVEFOQ0UuZ2V0TWlncmF0aW9uRWRnZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLk1pZ3JhdGlvbkVkZ2VMYWJlbEltcGwgPGVtPk1pZ3JhdGlvbiBFZGdlIExhYmVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLk1pZ3JhdGlvbkVkZ2VMYWJlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuRWRnZXNQYWNrYWdlSW1wbCNnZXRNaWdyYXRpb25FZGdlTGFiZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgTUlHUkFUSU9OX0VER0VfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0TWlncmF0aW9uRWRnZUxhYmVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuTWlncmF0aW9uRWRnZUxhYmVsVmFsdWVJbXBsIDxlbT5NaWdyYXRpb24gRWRnZSBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbC5NaWdyYXRpb25FZGdlTGFiZWxWYWx1ZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuRWRnZXNQYWNrYWdlSW1wbCNnZXRNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBNSUdSQVRJT05fRURHRV9MQUJFTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWlncmF0aW9uIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBNSUdSQVRJT05fRURHRV9MQUJFTF9WQUxVRV9fTUlHUkFUSU9OX1JBVEUgPSBlSU5TVEFOQ0UuZ2V0TWlncmF0aW9uRWRnZUxhYmVsVmFsdWVfTWlncmF0aW9uUmF0ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLk1peGluZ0VkZ2VJbXBsIDxlbT5NaXhpbmcgRWRnZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbC5NaXhpbmdFZGdlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbC5FZGdlc1BhY2thZ2VJbXBsI2dldE1peGluZ0VkZ2UoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgTUlYSU5HX0VER0UgPSBlSU5TVEFOQ0UuZ2V0TWl4aW5nRWRnZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLk1peGluZ0VkZ2VMYWJlbEltcGwgPGVtPk1peGluZyBFZGdlIExhYmVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLk1peGluZ0VkZ2VMYWJlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuRWRnZXNQYWNrYWdlSW1wbCNnZXRNaXhpbmdFZGdlTGFiZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgTUlYSU5HX0VER0VfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0TWl4aW5nRWRnZUxhYmVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuTWl4aW5nRWRnZUxhYmVsVmFsdWVJbXBsIDxlbT5NaXhpbmcgRWRnZSBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbC5NaXhpbmdFZGdlTGFiZWxWYWx1ZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuRWRnZXNQYWNrYWdlSW1wbCNnZXRNaXhpbmdFZGdlTGFiZWxWYWx1ZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBNSVhJTkdfRURHRV9MQUJFTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRNaXhpbmdFZGdlTGFiZWxWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWl4aW5nIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBNSVhJTkdfRURHRV9MQUJFTF9WQUxVRV9fTUlYSU5HX1JBVEUgPSBlSU5TVEFOQ0UuZ2V0TWl4aW5nRWRnZUxhYmVsVmFsdWVfTWl4aW5nUmF0ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLlBvcHVsYXRpb25FZGdlSW1wbCA8ZW0+UG9wdWxhdGlvbiBFZGdlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLlBvcHVsYXRpb25FZGdlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbC5FZGdlc1BhY2thZ2VJbXBsI2dldFBvcHVsYXRpb25FZGdlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFBPUFVMQVRJT05fRURHRSA9IGVJTlNUQU5DRS5nZXRQb3B1bGF0aW9uRWRnZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUE9QVUxBVElPTl9FREdFX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBlSU5TVEFOQ0UuZ2V0UG9wdWxhdGlvbkVkZ2VfUG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKworCX0KKworfSAvL0VkZ2VzUGFja2FnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9NaWdyYXRpb25FZGdlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL01pZ3JhdGlvbkVkZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWQ4MGNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9NaWdyYXRpb25FZGdlLmphdmEKQEAgLTAsMCArMSw0MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworCisvKioKKyAqIEFuIGVkZ2UgcmVwcmVzZW50aW5nIG1pZ3JhdGlvbiBiZXR3ZWVuIAorICogdHdvIGFyZWFzLiBUaGVzZSBlZGdlcyBoYXZlIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICogLWdldExhYmVsKCkgbXVzdCByZXR1cm4gYSBtaWdyYXRpb24gZWRnZSBsYWJlbAorICogLWlzRGlyZWN0ZWQoKSBtdXN0IHJldHVybiB0cnVlCisgKiAKKyAqIEBhdXRob3Igamxlc3NsZXIKKyAqCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBNaWdyYXRpb25FZGdlIGV4dGVuZHMgUG9wdWxhdGlvbkVkZ2UgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VnbWVudCBvZiB0aGUgdHlwZSBVUkkgdGhhdCBwcmVmaXhlcyBhbGwgb3RoZXIgc2VnbWVudHMgaW4gYQorCSAqIG1pZ3JhdGlvbiBlZGdlIFVSSS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIFVSSV9UWVBFX01JR1JBVElPTl9FREdFX1NFR01FTlQgPSBVUklfVFlQRV9FREdFX1NFR01FTlQgKyAiL21pZ3JhdGlvbiI7CisJCisJCisJCisJLyoqT3ZlcnJpZGVzIGdldExhYmVsKCkgdG8gZW5mb3JjZSB0aGUgcmV0dXJuaW5nIG9mIGEgbWlncmF0aW9uIGVkZ2UgbGFiZWwKKwkgKiovCisJTWlncmF0aW9uRWRnZUxhYmVsIGdldExhYmVsKCk7CisJdm9pZCBzZXRMYWJlbChNaWdyYXRpb25FZGdlTGFiZWwgbGJsKTsKKwkJCQkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvTWlncmF0aW9uRWRnZUxhYmVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL01pZ3JhdGlvbkVkZ2VMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjN2Q2MDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL01pZ3JhdGlvbkVkZ2VMYWJlbC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZUxhYmVsOworCisKKy8qKgorICogRGVmaW5lcyBhIGRpcmVjdGVkIGVkZ2UgdGhhdCByZXByZXNlbnRzIG1pZ3JhdGlvbiBiZXR3ZWVuIHR3byBub2Rlcy4KKyAqIE1pZ3JhdGlvbiBkZW5vdGVzIG1vdmVtZW50IG9mIHRoZSBwb3B1bGF0aW9uIGJldHdlZW4gdHdvIG5vZGVzIChpLmUuLCB0aGUKKyAqIGhvbWUgbm9kZSBvZiBtaWdyYXRpbmcgcG9wdWxhdGlvbiBjaGFuZ2VzKS4KKyAqIAorICogQGF1dGhvciBqbGVzc2xlcgorICogQG1vZGVsCisgKi8KKworcHVibGljIGludGVyZmFjZSBNaWdyYXRpb25FZGdlTGFiZWwgZXh0ZW5kcyBFZGdlTGFiZWwgeworCQorCQorCS8qKgorCSAqIFRoaXMgaXMgdGhlIHNlZ21lbnQgb2YgdGhlIHR5cGUgVVJJIHRoYXQgcHJlZml4ZXMgYWxsIG90aGVyIHNlZ21lbnRzIGluIGEKKwkgKiBtaWdyYXRpb24gcmVsYXRpb25zaGlwIGxhYmVsIHR5cGUgVVJJLgorCSAqLworCVN0cmluZyBVUklfVFlQRV9NSUdSQVRJT05fUkVMQVRJT05TSElQX0xBQkVMX1NFR01FTlQgPSBVUklfVFlQRV9MQUJFTF9TRUdNRU5UCisJCQkrICIvbWlncmF0aW9uIjsKKwkKKwkKKwkvKipNYWtlIHRoZSBjdXJyZW50ICB2YWx1ZSBzdHVmZiBoYXZlIHRvIGJlIE1peGluZ0VkZ2VMYWJlbFZhbHVlcworCSAqICovCisJTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUgZ2V0Q3VycmVudFZhbHVlKCk7CisJdm9pZCBzZXRDdXJyZW50VmFsdWUoTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUgdmFsKTsKKwkJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL01pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL01pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJjY2Y0ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUuamF2YQpAQCAtMCwwICsxLDQyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CisKKy8qKgorICogUmVwcmVzZW50cyB0aGUgcmF0ZSBvZiBtaWdyYXRpb24gYmV0d2VlbiB0d28gbm9kZXMuIFRoaXMgaXMgYSAKKyAqIG51bWJlciBiZXR3ZWVuIDAgYW5kIGluZmluaXR5CisgKiAKKyAqIEBhdXRob3Igamxlc3NsZXIKKyAqCisgKkBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIE1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlIGV4dGVuZHMgTGFiZWxWYWx1ZSB7CisJCisJLyoqUmV0dXJucyB0aGUgbWlncmF0aW9uIHJhdGUKKwkgKiBAcmV0dXJuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgaW5maW5pdHkKKwkgKiAKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMC4wIiovCisJZG91YmxlIGdldE1pZ3JhdGlvblJhdGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUjZ2V0TWlncmF0aW9uUmF0ZSA8ZW0+TWlncmF0aW9uIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pZ3JhdGlvbiBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRNaWdyYXRpb25SYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNaWdyYXRpb25SYXRlKGRvdWJsZSB2YWx1ZSk7CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvTWl4aW5nRWRnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9NaXhpbmdFZGdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4ZmJiMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvTWl4aW5nRWRnZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZTsKKworLyoqCisgKiBBIG1peGluZyBlZGdlLiBBIG1peGluZyBlZGdlIG11c3QgaGF2ZSB0aGUgcHJvcGVydHkgdGhhdDoKKyAqICAtIGl0IGlzIHVuZGlyZWN0ZWQKKyAqICAtIGdldExhYmVsKCkgcmV0dXJucyBhIG1peGluZyBlZGdlIGxhYmVsCisgKiBAYXV0aG9yIGpsZXNzbGVyCisgKgorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWl4aW5nRWRnZSBleHRlbmRzIFBvcHVsYXRpb25FZGdlIHsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHNlZ21lbnQgb2YgdGhlIHR5cGUgVVJJIHRoYXQgcHJlZml4ZXMgYWxsIG90aGVyIHNlZ21lbnRzIGluIGEKKwkgKiBtaXhpbmcgZWRnZSBVUkkuCisJICovCisJcHVibGljIFN0cmluZyBVUklfVFlQRV9NSVhJTkdfRURHRV9TRUdNRU5UID0gVVJJX1RZUEVfRURHRV9TRUdNRU5UICsgIi9taXhpbmciOworCQorCQorCS8qKk92ZXJyaWRlcyBnZXRMYWJlbCgpIHRvIGVuZm9yY2UgdGhlIHJldHVybmluZyBvZiBhIG1peGluZyBlZGdlIGxhYmVsCQorCSAqLworCU1peGluZ0VkZ2VMYWJlbCBnZXRMYWJlbCgpOworCXZvaWQgc2V0TGFiZWwoTWl4aW5nRWRnZUxhYmVsIGxibCk7CisJCQkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvTWl4aW5nRWRnZUxhYmVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL01peGluZ0VkZ2VMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZjBmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL01peGluZ0VkZ2VMYWJlbC5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZUxhYmVsOworCisvKioKKyAqIERlZmluZXMgYSBtaXhpbmcgZWRnZS4gTWl4aW5nIGVkZ2VzIGFyZSB1bmRpcmVjdGVkIGFuZCBkZWZpbmVzIHNvbWUgcmF0ZSBvZiAKKyAqIGNvbnRhY3QgYmV0d2VlbiBtZW1iZXJzIG9mIHR3byBwb3B1bGF0aW9ucyBpbiB3aGljaCB0aGUgaG9tZSBwb3B1bGF0aW9uIG9mCisgKiB0aGUgaW5kaXZpZHVhbHMgaW52b2x2ZWQgZG9lcyBub3QgY2hhbmdlLgorICogCisgKiBAbW9kZWwKKyAqICovCitwdWJsaWMgaW50ZXJmYWNlIE1peGluZ0VkZ2VMYWJlbCBleHRlbmRzIEVkZ2VMYWJlbCB7CisJCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VnbWVudCBvZiB0aGUgdHlwZSBVUkkgdGhhdCBwcmVmaXhlcyBhbGwgb3RoZXIgc2VnbWVudHMgaW4gYQorCSAqIG1peGluZyByZWxhdGlvbnNoaXAgbGFiZWwgdHlwZSBVUkkuCisJICovCisJU3RyaW5nIFVSSV9UWVBFX01JWElOR19SRUxBVElPTlNISVBfTEFCRUxfU0VHTUVOVCA9IFVSSV9UWVBFX0xBQkVMX1NFR01FTlQKKwkJCSsgIi9taXhpbmciOworCQorCS8qKk1ha2UgdGhlIGN1cnJlbnQgIHZhbHVlIHN0dWZmIGhhdmUgdG8gYmUgTWl4aW5nRWRnZUxhYmVsVmFsdWVzCisJICogKi8KKwlNaXhpbmdFZGdlTGFiZWxWYWx1ZSBnZXRDdXJyZW50VmFsdWUoKTsKKwl2b2lkIHNldEN1cnJlbnRWYWx1ZShNaXhpbmdFZGdlTGFiZWxWYWx1ZSB2YWwpOworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL01peGluZ0VkZ2VMYWJlbFZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL01peGluZ0VkZ2VMYWJlbFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1MTA1YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvTWl4aW5nRWRnZUxhYmVsVmFsdWUuamF2YQpAQCAtMCwwICsxLDM5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CisKKworLyoqCisgKiBMYWJlbCB2YWx1ZSBkZW5vdGluZyB0aGUgcmF0ZSBvZiBtaXhpbmcgYmV0d2VlbiB0d28gcG9wdWxhdGlvbnMuCisgKiAKKyAqIEBtb2RlbAorICoqLworcHVibGljIGludGVyZmFjZSBNaXhpbmdFZGdlTGFiZWxWYWx1ZSBleHRlbmRzIExhYmVsVmFsdWUgeworCQkKKwkvKipUaGUgcmF0ZSBvZiBtaXhpbmcgYmV0d2VlbiB0aGUgdHdvIHBvcHVsYXRpb25zLgorCSAqIAorCSAqIEBtb2RlbCovCisJZG91YmxlIGdldE1peGluZ1JhdGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWl4aW5nRWRnZUxhYmVsVmFsdWUjZ2V0TWl4aW5nUmF0ZSA8ZW0+TWl4aW5nIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1peGluZyBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRNaXhpbmdSYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNaXhpbmdSYXRlKGRvdWJsZSB2YWx1ZSk7CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvUG9wdWxhdGlvbkVkZ2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvUG9wdWxhdGlvbkVkZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzMzODAyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9Qb3B1bGF0aW9uRWRnZS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZCQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcHVsYXRpb24gRWRnZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLlBvcHVsYXRpb25FZGdlI2dldFBvcHVsYXRpb25JZGVudGlmaWVyIDxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNQYWNrYWdlI2dldFBvcHVsYXRpb25FZGdlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFBvcHVsYXRpb25FZGdlIGV4dGVuZHMgRWRnZSB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Imh1bWFuIjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRQb3B1bGF0aW9uSWRlbnRpZmllcihTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLkVkZ2VzUGFja2FnZSNnZXRQb3B1bGF0aW9uRWRnZV9Qb3B1bGF0aW9uSWRlbnRpZmllcigpCisJICogQG1vZGVsIGRlZmF1bHQ9Imh1bWFuIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuUG9wdWxhdGlvbkVkZ2UjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIgPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBQb3B1bGF0aW9uRWRnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9pbXBsL0VkZ2VzRmFjdG9yeUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvaW1wbC9FZGdlc0ZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJiZTY0NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvaW1wbC9FZGdlc0ZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSwxNzAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuKjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFZGdlc0ZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgRWRnZXNGYWN0b3J5IHsKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBFZGdlc0ZhY3RvcnkgaW5pdCgpIHsKKwkJdHJ5IHsKKwkJCUVkZ2VzRmFjdG9yeSB0aGVFZGdlc0ZhY3RvcnkgPSAoRWRnZXNGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMuZWNvcmUiKTsgLy8kTk9OLU5MUy0xJCAKKwkJCWlmICh0aGVFZGdlc0ZhY3RvcnkgIT0gbnVsbCkgeworCQkJCXJldHVybiB0aGVFZGdlc0ZhY3Rvcnk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXJldHVybiBuZXcgRWRnZXNGYWN0b3J5SW1wbCgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkZ2VzRmFjdG9yeUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKKwkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgRWRnZXNQYWNrYWdlLk1JR1JBVElPTl9FREdFOiByZXR1cm4gY3JlYXRlTWlncmF0aW9uRWRnZSgpOworCQkJY2FzZSBFZGdlc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfTEFCRUw6IHJldHVybiBjcmVhdGVNaWdyYXRpb25FZGdlTGFiZWwoKTsKKwkJCWNhc2UgRWRnZXNQYWNrYWdlLk1JR1JBVElPTl9FREdFX0xBQkVMX1ZBTFVFOiByZXR1cm4gY3JlYXRlTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUoKTsKKwkJCWNhc2UgRWRnZXNQYWNrYWdlLk1JWElOR19FREdFOiByZXR1cm4gY3JlYXRlTWl4aW5nRWRnZSgpOworCQkJY2FzZSBFZGdlc1BhY2thZ2UuTUlYSU5HX0VER0VfTEFCRUw6IHJldHVybiBjcmVhdGVNaXhpbmdFZGdlTGFiZWwoKTsKKwkJCWNhc2UgRWRnZXNQYWNrYWdlLk1JWElOR19FREdFX0xBQkVMX1ZBTFVFOiByZXR1cm4gY3JlYXRlTWl4aW5nRWRnZUxhYmVsVmFsdWUoKTsKKwkJCWNhc2UgRWRnZXNQYWNrYWdlLlBPUFVMQVRJT05fRURHRTogcmV0dXJuIGNyZWF0ZVBvcHVsYXRpb25FZGdlKCk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1pZ3JhdGlvbkVkZ2UgY3JlYXRlTWlncmF0aW9uRWRnZSgpIHsKKwkJTWlncmF0aW9uRWRnZUltcGwgbWlncmF0aW9uRWRnZSA9IG5ldyBNaWdyYXRpb25FZGdlSW1wbCgpOworCQlyZXR1cm4gbWlncmF0aW9uRWRnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTWlncmF0aW9uRWRnZUxhYmVsIGNyZWF0ZU1pZ3JhdGlvbkVkZ2VMYWJlbCgpIHsKKwkJTWlncmF0aW9uRWRnZUxhYmVsSW1wbCBtaWdyYXRpb25FZGdlTGFiZWwgPSBuZXcgTWlncmF0aW9uRWRnZUxhYmVsSW1wbCgpOworCQlyZXR1cm4gbWlncmF0aW9uRWRnZUxhYmVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSBjcmVhdGVNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSgpIHsKKwkJTWlncmF0aW9uRWRnZUxhYmVsVmFsdWVJbXBsIG1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlID0gbmV3IE1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlSW1wbCgpOworCQlyZXR1cm4gbWlncmF0aW9uRWRnZUxhYmVsVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1peGluZ0VkZ2UgY3JlYXRlTWl4aW5nRWRnZSgpIHsKKwkJTWl4aW5nRWRnZUltcGwgbWl4aW5nRWRnZSA9IG5ldyBNaXhpbmdFZGdlSW1wbCgpOworCQlyZXR1cm4gbWl4aW5nRWRnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTWl4aW5nRWRnZUxhYmVsIGNyZWF0ZU1peGluZ0VkZ2VMYWJlbCgpIHsKKwkJTWl4aW5nRWRnZUxhYmVsSW1wbCBtaXhpbmdFZGdlTGFiZWwgPSBuZXcgTWl4aW5nRWRnZUxhYmVsSW1wbCgpOworCQlyZXR1cm4gbWl4aW5nRWRnZUxhYmVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNaXhpbmdFZGdlTGFiZWxWYWx1ZSBjcmVhdGVNaXhpbmdFZGdlTGFiZWxWYWx1ZSgpIHsKKwkJTWl4aW5nRWRnZUxhYmVsVmFsdWVJbXBsIG1peGluZ0VkZ2VMYWJlbFZhbHVlID0gbmV3IE1peGluZ0VkZ2VMYWJlbFZhbHVlSW1wbCgpOworCQlyZXR1cm4gbWl4aW5nRWRnZUxhYmVsVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBvcHVsYXRpb25FZGdlIGNyZWF0ZVBvcHVsYXRpb25FZGdlKCkgeworCQlQb3B1bGF0aW9uRWRnZUltcGwgcG9wdWxhdGlvbkVkZ2UgPSBuZXcgUG9wdWxhdGlvbkVkZ2VJbXBsKCk7CisJCXJldHVybiBwb3B1bGF0aW9uRWRnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRnZXNQYWNrYWdlIGdldEVkZ2VzUGFja2FnZSgpIHsKKwkJcmV0dXJuIChFZGdlc1BhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBkZXByZWNhdGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBFZGdlc1BhY2thZ2UgZ2V0UGFja2FnZSgpIHsKKwkJcmV0dXJuIEVkZ2VzUGFja2FnZS5lSU5TVEFOQ0U7CisJfQorCit9IC8vRWRnZXNGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9pbXBsL0VkZ2VzUGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvaW1wbC9FZGdlc1BhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxZDc4MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvaW1wbC9FZGdlc1BhY2thZ2VJbXBsLmphdmEKQEAgLTAsMCArMSwzODcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWl4aW5nRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1peGluZ0VkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1peGluZ0VkZ2VMYWJlbFZhbHVlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5Qb3B1bGF0aW9uRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuTm9kZXNQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5pbXBsLk5vZGVzUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50eXBlcy5UeXBlc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50eXBlcy5pbXBsLlR5cGVzUGFja2FnZUltcGw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRWRnZXNQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEVkZ2VzUGFja2FnZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgbWlncmF0aW9uRWRnZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBtaWdyYXRpb25FZGdlTGFiZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgbWlncmF0aW9uRWRnZUxhYmVsVmFsdWVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgbWl4aW5nRWRnZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBtaXhpbmdFZGdlTGFiZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgbWl4aW5nRWRnZUxhYmVsVmFsdWVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcG9wdWxhdGlvbkVkZ2VFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCisJICogcGFja2FnZSBVUkkgdmFsdWUuCisJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYworCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCisJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKKwkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5FZGdlc1BhY2thZ2UjZU5TX1VSSQorCSAqIEBzZWUgI2luaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVkZ2VzUGFja2FnZUltcGwoKSB7CisJCXN1cGVyKGVOU19VUkksIEVkZ2VzRmFjdG9yeS5lSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIEVkZ2VzUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KKwkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZU5TX1VSSQorCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCisJICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgRWRnZXNQYWNrYWdlIGluaXQoKSB7CisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChFZGdlc1BhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWRnZXNQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKwkJRWRnZXNQYWNrYWdlSW1wbCB0aGVFZGdlc1BhY2thZ2UgPSAoRWRnZXNQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRWRnZXNQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBFZGdlc1BhY2thZ2VJbXBsKCkpOworCisJCWlzSW5pdGVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKKwkJR3JhcGhQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCU1vZGlmaWVyUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCVNjZW5hcmlvUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCVNlcXVlbmNlclBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCQlTb2x2ZXJQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcworCQlMYWJlbHNQYWNrYWdlSW1wbCB0aGVMYWJlbHNQYWNrYWdlID0gKExhYmVsc1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShMYWJlbHNQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgTGFiZWxzUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShMYWJlbHNQYWNrYWdlLmVOU19VUkkpIDogTGFiZWxzUGFja2FnZS5lSU5TVEFOQ0UpOworCQlOb2Rlc1BhY2thZ2VJbXBsIHRoZU5vZGVzUGFja2FnZSA9IChOb2Rlc1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShOb2Rlc1BhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBOb2Rlc1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTm9kZXNQYWNrYWdlLmVOU19VUkkpIDogTm9kZXNQYWNrYWdlLmVJTlNUQU5DRSk7CisJCVR5cGVzUGFja2FnZUltcGwgdGhlVHlwZXNQYWNrYWdlID0gKFR5cGVzUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFR5cGVzUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFR5cGVzUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUeXBlc1BhY2thZ2UuZU5TX1VSSSkgOiBUeXBlc1BhY2thZ2UuZUlOU1RBTkNFKTsKKworCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cworCQl0aGVFZGdlc1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUxhYmVsc1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU5vZGVzUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlVHlwZXNQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKwkJdGhlRWRnZXNQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlTGFiZWxzUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU5vZGVzUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVR5cGVzUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAorCQl0aGVFZGdlc1BhY2thZ2UuZnJlZXplKCk7CisKKyAgCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoRWRnZXNQYWNrYWdlLmVOU19VUkksIHRoZUVkZ2VzUGFja2FnZSk7CisJCXJldHVybiB0aGVFZGdlc1BhY2thZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRNaWdyYXRpb25FZGdlKCkgeworCQlyZXR1cm4gbWlncmF0aW9uRWRnZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldE1pZ3JhdGlvbkVkZ2VMYWJlbCgpIHsKKwkJcmV0dXJuIG1pZ3JhdGlvbkVkZ2VMYWJlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldE1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlKCkgeworCQlyZXR1cm4gbWlncmF0aW9uRWRnZUxhYmVsVmFsdWVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWlncmF0aW9uRWRnZUxhYmVsVmFsdWVfTWlncmF0aW9uUmF0ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKW1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRNaXhpbmdFZGdlKCkgeworCQlyZXR1cm4gbWl4aW5nRWRnZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldE1peGluZ0VkZ2VMYWJlbCgpIHsKKwkJcmV0dXJuIG1peGluZ0VkZ2VMYWJlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldE1peGluZ0VkZ2VMYWJlbFZhbHVlKCkgeworCQlyZXR1cm4gbWl4aW5nRWRnZUxhYmVsVmFsdWVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWl4aW5nRWRnZUxhYmVsVmFsdWVfTWl4aW5nUmF0ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKW1peGluZ0VkZ2VMYWJlbFZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQb3B1bGF0aW9uRWRnZSgpIHsKKwkJcmV0dXJuIHBvcHVsYXRpb25FZGdlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvcHVsYXRpb25FZGdlX1BvcHVsYXRpb25JZGVudGlmaWVyKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9wdWxhdGlvbkVkZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRnZXNGYWN0b3J5IGdldEVkZ2VzRmFjdG9yeSgpIHsKKwkJcmV0dXJuIChFZGdlc0ZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcworCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKKwkJaXNDcmVhdGVkID0gdHJ1ZTsKKworCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJbWlncmF0aW9uRWRnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNSUdSQVRJT05fRURHRSk7CisKKwkJbWlncmF0aW9uRWRnZUxhYmVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1JR1JBVElPTl9FREdFX0xBQkVMKTsKKworCQltaWdyYXRpb25FZGdlTGFiZWxWYWx1ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNSUdSQVRJT05fRURHRV9MQUJFTF9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUobWlncmF0aW9uRWRnZUxhYmVsVmFsdWVFQ2xhc3MsIE1JR1JBVElPTl9FREdFX0xBQkVMX1ZBTFVFX19NSUdSQVRJT05fUkFURSk7CisKKwkJbWl4aW5nRWRnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNSVhJTkdfRURHRSk7CisKKwkJbWl4aW5nRWRnZUxhYmVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1JWElOR19FREdFX0xBQkVMKTsKKworCQltaXhpbmdFZGdlTGFiZWxWYWx1ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNSVhJTkdfRURHRV9MQUJFTF9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUobWl4aW5nRWRnZUxhYmVsVmFsdWVFQ2xhc3MsIE1JWElOR19FREdFX0xBQkVMX1ZBTFVFX19NSVhJTkdfUkFURSk7CisKKwkJcG9wdWxhdGlvbkVkZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUE9QVUxBVElPTl9FREdFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwb3B1bGF0aW9uRWRnZUVDbGFzcywgUE9QVUxBVElPTl9FREdFX19QT1BVTEFUSU9OX0lERU5USUZJRVIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcworCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKKwkJaXNJbml0aWFsaXplZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCisJCXNldE5hbWUoZU5BTUUpOworCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKKwkJc2V0TnNVUkkoZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcworCQlHcmFwaFBhY2thZ2UgdGhlR3JhcGhQYWNrYWdlID0gKEdyYXBoUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShHcmFwaFBhY2thZ2UuZU5TX1VSSSk7CisJCUVjb3JlUGFja2FnZSB0aGVFY29yZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQltaWdyYXRpb25FZGdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UG9wdWxhdGlvbkVkZ2UoKSk7CisJCW1pZ3JhdGlvbkVkZ2VMYWJlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVHcmFwaFBhY2thZ2UuZ2V0RWRnZUxhYmVsKCkpOworCQltaWdyYXRpb25FZGdlTGFiZWxWYWx1ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVHcmFwaFBhY2thZ2UuZ2V0TGFiZWxWYWx1ZSgpKTsKKwkJbWl4aW5nRWRnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBvcHVsYXRpb25FZGdlKCkpOworCQltaXhpbmdFZGdlTGFiZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlR3JhcGhQYWNrYWdlLmdldEVkZ2VMYWJlbCgpKTsKKwkJbWl4aW5nRWRnZUxhYmVsVmFsdWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlR3JhcGhQYWNrYWdlLmdldExhYmVsVmFsdWUoKSk7CisJCXBvcHVsYXRpb25FZGdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUdyYXBoUGFja2FnZS5nZXRFZGdlKCkpOworCisJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCWluaXRFQ2xhc3MobWlncmF0aW9uRWRnZUVDbGFzcywgTWlncmF0aW9uRWRnZS5jbGFzcywgIk1pZ3JhdGlvbkVkZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKG1pZ3JhdGlvbkVkZ2VMYWJlbEVDbGFzcywgTWlncmF0aW9uRWRnZUxhYmVsLmNsYXNzLCAiTWlncmF0aW9uRWRnZUxhYmVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhtaWdyYXRpb25FZGdlTGFiZWxWYWx1ZUVDbGFzcywgTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUuY2xhc3MsICJNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZV9NaWdyYXRpb25SYXRlKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJtaWdyYXRpb25SYXRlIiwgIjAuMCIsIDAsIDEsIE1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQlpbml0RUNsYXNzKG1peGluZ0VkZ2VFQ2xhc3MsIE1peGluZ0VkZ2UuY2xhc3MsICJNaXhpbmdFZGdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhtaXhpbmdFZGdlTGFiZWxFQ2xhc3MsIE1peGluZ0VkZ2VMYWJlbC5jbGFzcywgIk1peGluZ0VkZ2VMYWJlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MobWl4aW5nRWRnZUxhYmVsVmFsdWVFQ2xhc3MsIE1peGluZ0VkZ2VMYWJlbFZhbHVlLmNsYXNzLCAiTWl4aW5nRWRnZUxhYmVsVmFsdWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWl4aW5nRWRnZUxhYmVsVmFsdWVfTWl4aW5nUmF0ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAibWl4aW5nUmF0ZSIsIG51bGwsIDAsIDEsIE1peGluZ0VkZ2VMYWJlbFZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhwb3B1bGF0aW9uRWRnZUVDbGFzcywgUG9wdWxhdGlvbkVkZ2UuY2xhc3MsICJQb3B1bGF0aW9uRWRnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRQb3B1bGF0aW9uRWRnZV9Qb3B1bGF0aW9uSWRlbnRpZmllcigpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicG9wdWxhdGlvbklkZW50aWZpZXIiLCAiaHVtYW4iLCAwLCAxLCBQb3B1bGF0aW9uRWRnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJLy8gQ3JlYXRlIHJlc291cmNlCisJCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCX0KKworfSAvL0VkZ2VzUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvaW1wbC9NaWdyYXRpb25FZGdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9pbXBsL01pZ3JhdGlvbkVkZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQxNmYxMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvaW1wbC9NaWdyYXRpb25FZGdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5FZGdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2VMYWJlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1pZ3JhdGlvbiBFZGdlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTWlncmF0aW9uRWRnZUltcGwgZXh0ZW5kcyBQb3B1bGF0aW9uRWRnZUltcGwgaW1wbGVtZW50cyBNaWdyYXRpb25FZGdlIHsKKwkKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIFVSSSdzIGZvciBlYWNoIE1pZ3JhdGlvbkVkZ2UgZ2VuZXJhdGVkCisJICovCisJc3RhdGljIGludCBtaWdyYXRpb25FZGdlQ291bnRlciA9IDA7CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBNaWdyYXRpb25FZGdlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwkJCisJCS8vc2V0IHRoZSBVUkkKKwkJc2V0VVJJKFNURU1VUkkuY3JlYXRlVVJJKFVSSV9UWVBFX01JR1JBVElPTl9FREdFX1NFR01FTlQgKyAiLyIKKwkJCQkrIEludGVnZXIudG9TdHJpbmcobWlncmF0aW9uRWRnZUNvdW50ZXIrKykpKTsKKwkJCisJCS8vTWFrZSBhIGxhYmVsCisJCXNldExhYmVsKEVkZ2VzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWlncmF0aW9uRWRnZUxhYmVsKCkpOwkJCQkKKwkJCisJCS8vdGhpcyBlZGdlIG11c3QgYmUgZGlyZWN0ZWQKKwkJc2V0RGlyZWN0ZWQodHJ1ZSk7CisJCQorCX0KKwkKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEVkZ2VzUGFja2FnZS5MaXRlcmFscy5NSUdSQVRJT05fRURHRTsKKwl9CisJCisJLyoqKgorCSAqIE92ZXJyaWRlIHNldHRlciBmb3Igc2V0RGlyZWN0ZWQgc28gdGhhdCBpdCB3aWxsIGJsb3cgdXAgaWYgYW55b25lIHRyaWVzIHRvIG1ha2UgaXQgZGlyZWN0ZWQgKHdoZW4gYXNzZXJ0aW9ucyBhcmUgb24pLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldERpcmVjdGVkKGJvb2xlYW4gaXNEaXJlY3RlZCkgeworCQlhc3NlcnQoaXNEaXJlY3RlZD09dHJ1ZSk7CisJCXN1cGVyLnNldERpcmVjdGVkKGlzRGlyZWN0ZWQpOworCX0KKwkKKwkKKwkvKipPdmVycmlkZSB0byBtYWtlIGdldEVkZ2UgcmV0dXJuIHRoZSAKKwkgKiBjb3JyZWN0IHR5cGUuKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWlncmF0aW9uRWRnZUxhYmVsIGdldExhYmVsKCkgeworCQlyZXR1cm4gKE1pZ3JhdGlvbkVkZ2VMYWJlbClzdXBlci5nZXRMYWJlbCgpOwkKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChNaWdyYXRpb25FZGdlTGFiZWwgbGJsKSB7CisJCS8vanVzdCBkZWFsIHdpdGggbWFraW5nIHN1cmUgdGhlIFVSSSBsYWJlbGluZyBzY2hlbWUgaXMgY29ycmVjdCBoZXJlLgorCQlsYmwuc2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCh0aGlzLmdldFVSSSgpKTsKKwkJCisJCXN1cGVyLnNldExhYmVsKGxibCk7CisJfQorCQorCQorfSAvL01pZ3JhdGlvbkVkZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL2ltcGwvTWlncmF0aW9uRWRnZUxhYmVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9pbXBsL01pZ3JhdGlvbkVkZ2VMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTdjZTMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9pbXBsL01pZ3JhdGlvbkVkZ2VMYWJlbEltcGwuamF2YQpAQCAtMCwwICsxLDk3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkVkZ2VMYWJlbEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLkVkZ2VzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLkVkZ2VzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWlncmF0aW9uIEVkZ2UgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNaWdyYXRpb25FZGdlTGFiZWxJbXBsIGV4dGVuZHMgRWRnZUxhYmVsSW1wbCBpbXBsZW1lbnRzIE1pZ3JhdGlvbkVkZ2VMYWJlbCB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBNaWdyYXRpb25FZGdlTGFiZWxJbXBsKCkgeworCQlzdXBlcigpOworCQlzZXRDdXJyZW50VmFsdWUoRWRnZXNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSgpKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbm9kZQorCSAqICAgICAgICAgICAgdGhlIG5vZGUKKwkgKiBAcmV0dXJuIHRoZSBFZGdlcyB0aGF0IHJlcHJlc2VudCB0aGUgY29tbW9uIGJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbgorCSAqICAgICAgICAgdGhlIG5vZGUgYW5kIG90aGVyIG5vZGVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdDxFZGdlPiBnZXRNaWdyYXRpb25FZGdlc0Zyb21Ob2RlKGZpbmFsIE5vZGUgbm9kZSkgeworCQlmaW5hbCBMaXN0PEVkZ2U+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxFZGdlPigpOworCisJCWZvciAoSXRlcmF0b3I8RWRnZT4gZWRnZUl0ZXIgPSBub2RlLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgZWRnZUl0ZXIuaGFzTmV4dCgpOykgeworCQkJZmluYWwgRWRnZSBlZGdlID0gZWRnZUl0ZXIubmV4dCgpOworCQkJZmluYWwgRWRnZUxhYmVsIGVkZ2VMYWJlbCA9IGVkZ2UuZ2V0TGFiZWwoKTsKKwkJCS8vIElzIHRoZSBsYWJlbCBhIG1pZ3JhdGlvbkVkZ2UgbGFiZWw/CisJCQlpZiAoZWRnZUxhYmVsIGluc3RhbmNlb2YgTWlncmF0aW9uRWRnZUxhYmVsKSB7CisJCQkJLy8gWWVzCisJCQkJcmV0VmFsdWUuYWRkKGVkZ2UpOworCQkJfQorCQl9IC8vIGZvcgorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldE1pZ3JhdGlvbkVkZ2VzRnJvbU5vZGUKKwkKKwkKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEVkZ2VzUGFja2FnZS5MaXRlcmFscy5NSUdSQVRJT05fRURHRV9MQUJFTDsKKwl9CisJCisJLyoqCisJICogTWFrZSB0aGUgY3VycmVudCB2YWx1ZSBzdHVmZiBoYXZlIHRvIGJlIE1peGluZ0VkZ2VMYWJlbFZhbHVlcworCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSBnZXRDdXJyZW50VmFsdWUoKSB7CisJCXJldHVybigoTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUpc3VwZXIuZ2V0Q3VycmVudFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRDdXJyZW50VmFsdWUoTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUgdmFsKSB7CisJCXN1cGVyLnNldEN1cnJlbnRWYWx1ZSh2YWwpOworCX0KKworfSAvL01pZ3JhdGlvbkVkZ2VMYWJlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvaW1wbC9NaWdyYXRpb25FZGdlTGFiZWxWYWx1ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvaW1wbC9NaWdyYXRpb25FZGdlTGFiZWxWYWx1ZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDg3NDk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9pbXBsL01pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjAwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbFZhbHVlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZUxhYmVsVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NaWdyYXRpb24gRWRnZSBMYWJlbCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLk1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlSW1wbCNnZXRNaWdyYXRpb25SYXRlIDxlbT5NaWdyYXRpb24gUmF0ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlSW1wbCBleHRlbmRzIExhYmVsVmFsdWVJbXBsIGltcGxlbWVudHMgTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaWdyYXRpb25SYXRlKCkgPGVtPk1pZ3JhdGlvbiBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNaWdyYXRpb25SYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBNSUdSQVRJT05fUkFURV9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pZ3JhdGlvblJhdGUoKSA8ZW0+TWlncmF0aW9uIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1pZ3JhdGlvblJhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgbWlncmF0aW9uUmF0ZSA9IE1JR1JBVElPTl9SQVRFX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEVkZ2VzUGFja2FnZS5MaXRlcmFscy5NSUdSQVRJT05fRURHRV9MQUJFTF9WQUxVRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE1pZ3JhdGlvblJhdGUoKSB7CisJCXJldHVybiBtaWdyYXRpb25SYXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1pZ3JhdGlvblJhdGUoZG91YmxlIG5ld01pZ3JhdGlvblJhdGUpIHsKKwkJZG91YmxlIG9sZE1pZ3JhdGlvblJhdGUgPSBtaWdyYXRpb25SYXRlOworCQltaWdyYXRpb25SYXRlID0gbmV3TWlncmF0aW9uUmF0ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWRnZXNQYWNrYWdlLk1JR1JBVElPTl9FREdFX0xBQkVMX1ZBTFVFX19NSUdSQVRJT05fUkFURSwgb2xkTWlncmF0aW9uUmF0ZSwgbWlncmF0aW9uUmF0ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRWRnZXNQYWNrYWdlLk1JR1JBVElPTl9FREdFX0xBQkVMX1ZBTFVFX19NSUdSQVRJT05fUkFURToKKwkJCQlyZXR1cm4gZ2V0TWlncmF0aW9uUmF0ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVkZ2VzUGFja2FnZS5NSUdSQVRJT05fRURHRV9MQUJFTF9WQUxVRV9fTUlHUkFUSU9OX1JBVEU6CisJCQkJc2V0TWlncmF0aW9uUmF0ZSgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFZGdlc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfTEFCRUxfVkFMVUVfX01JR1JBVElPTl9SQVRFOgorCQkJCXNldE1pZ3JhdGlvblJhdGUoTUlHUkFUSU9OX1JBVEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFZGdlc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfTEFCRUxfVkFMVUVfX01JR1JBVElPTl9SQVRFOgorCQkJCXJldHVybiBtaWdyYXRpb25SYXRlICE9IE1JR1JBVElPTl9SQVRFX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobWlncmF0aW9uUmF0ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChtaWdyYXRpb25SYXRlKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCQorCS8qKgorCSAqIFJlc2V0cyB0aGUgdmFsdWUgZm9yIHRoaXMgbWlncmF0aW9uIGVkZ2UgdG8gdGhlIGRlZmF1bHQgdmFsdWUuIElzIHRoaXMKKwkgKiByZWFsbHkgdGhlIGNvcnJlY3QgYmVoYXZpb3I/IGRvIHdlIHJlYWxseSB3YW50IHRvIGdvIHRvIHRoZSBtb2RlbCBzdGFydAorCSAqIHN0YXRlPworCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlzZXRNaWdyYXRpb25SYXRlKE1JR1JBVElPTl9SQVRFX0VERUZBVUxUKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkxhYmVsVmFsdWVJbXBsI3NhbmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5zYW5lKCk7CisJCQorCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmICFEb3VibGUuaXNOYU4oIGdldE1pZ3JhdGlvblJhdGUoKSk7CisJCWFzc2VydCByZXRWYWx1ZSA6ICJNaWdyYXRpb24gcmF0ZSBpcyBOYU4iOworCQkKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiAhRG91YmxlLmlzSW5maW5pdGUoIGdldE1pZ3JhdGlvblJhdGUoKSk7CisJCWFzc2VydCByZXRWYWx1ZTogIk1pZ3JhdGlvbiByYXRlIGlzIEluZmluaXRlIjsKKwkJCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHNhbmUKKworCQorfSAvL01pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9pbXBsL01peGluZ0VkZ2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL2ltcGwvTWl4aW5nRWRnZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODBkMjRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9pbXBsL01peGluZ0VkZ2VJbXBsLmphdmEKQEAgLTAsMCArMSw5MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkVkZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5FZGdlc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5FZGdlc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaXhpbmdFZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWl4aW5nRWRnZUxhYmVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWl4aW5nIEVkZ2U8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNaXhpbmdFZGdlSW1wbCBleHRlbmRzIFBvcHVsYXRpb25FZGdlSW1wbCBpbXBsZW1lbnRzIE1peGluZ0VkZ2UgeworCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBVUkkncyBmb3IgZWFjaCBNaXhpbmdFZGdlIGdlbmVyYXRlZAorCSAqLworCXN0YXRpYyBpbnQgbWl4aW5nRWRnZUNvdW50ZXIgPSAwOworCQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgTWl4aW5nRWRnZUltcGwoKSB7CisJCXN1cGVyKCk7CisJCQkJCisJCS8vc2V0IHRoZSBVUkkKKwkJc2V0VVJJKFNURU1VUkkuY3JlYXRlVVJJKFVSSV9UWVBFX01JWElOR19FREdFX1NFR01FTlQgKyAiLyIKKwkJCQkrIEludGVnZXIudG9TdHJpbmcobWl4aW5nRWRnZUNvdW50ZXIrKykpKTsKKwkJCisJCS8vTWFrZSBhIGxhYmVsCisJCXNldExhYmVsKEVkZ2VzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWl4aW5nRWRnZUxhYmVsKCkpOwkJCQkKKwkJCQkKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEVkZ2VzUGFja2FnZS5MaXRlcmFscy5NSVhJTkdfRURHRTsKKwl9CisJCisJCisJLyoqKgorCSAqIE92ZXJyaWRlIHNldHRlciBmb3Igc2V0RGlyZWN0ZWQgc28gdGhhdCBpdCB3aWxsIGJsb3cgdXAgaWYgYW55b25lIHRyaWVzIHRvIG1ha2UgaXQgZGlyZWN0ZWQgKHdoZW4gYXNzZXJ0aW9ucyBhcmUgb24pLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldERpcmVjdGVkKGJvb2xlYW4gaXNEaXJlY3RlZCkgeworCQlhc3NlcnQoaXNEaXJlY3RlZD09ZmFsc2UpOworCQlzdXBlci5zZXREaXJlY3RlZChpc0RpcmVjdGVkKTsKKwl9CisJCisJLyoqT3ZlcnJpZGVzIG1ldGhvZHMgZnJvbSBFZGdlSW1wbCBjb3JyZWN0bHkKKwkgKiBmb3IgY29ycmVjdCByZXR1cm4gdHlwZXMqLworCUBPdmVycmlkZQorCXB1YmxpYyBNaXhpbmdFZGdlTGFiZWwgZ2V0TGFiZWwoKSB7CisJCXJldHVybiAoTWl4aW5nRWRnZUxhYmVsKXN1cGVyLmdldExhYmVsKCk7CisJfQorCXB1YmxpYyB2b2lkIHNldExhYmVsKE1peGluZ0VkZ2VMYWJlbCBsYmwpIHsKKwkJLy9qdXN0IGRlYWwgd2l0aCBtYWtpbmcgc3VyZSB0aGUgVVJJIGxhYmVsaW5nIHNjaGVtZSBpcyBjb3JyZWN0IGhlcmUuCisJCWxibC5zZXRVUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKHRoaXMuZ2V0VVJJKCkpOworCQlzdXBlci5zZXRMYWJlbChsYmwpOworCX0KKworfSAvL01peGluZ0VkZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL2ltcGwvTWl4aW5nRWRnZUxhYmVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9pbXBsL01peGluZ0VkZ2VMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmQxOTJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9pbXBsL01peGluZ0VkZ2VMYWJlbEltcGwuamF2YQpAQCAtMCwwICsxLDcxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkVkZ2VMYWJlbEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLkVkZ2VzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLkVkZ2VzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1peGluZ0VkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1peGluZ0VkZ2VMYWJlbFZhbHVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWl4aW5nIEVkZ2UgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNaXhpbmdFZGdlTGFiZWxJbXBsIGV4dGVuZHMgRWRnZUxhYmVsSW1wbCBpbXBsZW1lbnRzIE1peGluZ0VkZ2VMYWJlbCB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBNaXhpbmdFZGdlTGFiZWxJbXBsKCkgeworCQlzdXBlcigpOworCQkKKwkJLy9zZXQgdGhlIE1peGluZ0VkZ2VMYWJlbAorCQlzZXRDdXJyZW50VmFsdWUoRWRnZXNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNaXhpbmdFZGdlTGFiZWxWYWx1ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEVkZ2VzUGFja2FnZS5MaXRlcmFscy5NSVhJTkdfRURHRV9MQUJFTDsKKwl9CisJCisJLyoqCisJICogTWV0aG9kcyBuZWVkIHRvIG1ha2UgdGhpcyByZXR1cm4gZWRnZSBsYWJlbHMgcHJvcGVybHkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWl4aW5nRWRnZUxhYmVsVmFsdWUgZ2V0Q3VycmVudFZhbHVlKCkgeworCQlyZXR1cm4gKE1peGluZ0VkZ2VMYWJlbFZhbHVlKXN1cGVyLmdldEN1cnJlbnRWYWx1ZSgpOworCX0KKwlwdWJsaWMgdm9pZCBzZXRDdXJyZW50VmFsdWUoTWl4aW5nRWRnZUxhYmVsVmFsdWUgdmFsKSB7CisJCXN1cGVyLnNldEN1cnJlbnRWYWx1ZSh2YWwpOworCX0KKworfSAvL01peGluZ0VkZ2VMYWJlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvaW1wbC9NaXhpbmdFZGdlTGFiZWxWYWx1ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvaW1wbC9NaXhpbmdFZGdlTGFiZWxWYWx1ZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjc2NzBjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9pbXBsL01peGluZ0VkZ2VMYWJlbFZhbHVlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbFZhbHVlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWl4aW5nRWRnZUxhYmVsVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NaXhpbmcgRWRnZSBMYWJlbCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLk1peGluZ0VkZ2VMYWJlbFZhbHVlSW1wbCNnZXRNaXhpbmdSYXRlIDxlbT5NaXhpbmcgUmF0ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE1peGluZ0VkZ2VMYWJlbFZhbHVlSW1wbCBleHRlbmRzIExhYmVsVmFsdWVJbXBsIGltcGxlbWVudHMgTWl4aW5nRWRnZUxhYmVsVmFsdWUgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaXhpbmdSYXRlKCkgPGVtPk1peGluZyBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNaXhpbmdSYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBNSVhJTkdfUkFURV9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1peGluZ1JhdGUoKSA8ZW0+TWl4aW5nIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1peGluZ1JhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgbWl4aW5nUmF0ZSA9IE1JWElOR19SQVRFX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1peGluZ0VkZ2VMYWJlbFZhbHVlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEVkZ2VzUGFja2FnZS5MaXRlcmFscy5NSVhJTkdfRURHRV9MQUJFTF9WQUxVRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE1peGluZ1JhdGUoKSB7CisJCXJldHVybiBtaXhpbmdSYXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1peGluZ1JhdGUoZG91YmxlIG5ld01peGluZ1JhdGUpIHsKKwkJZG91YmxlIG9sZE1peGluZ1JhdGUgPSBtaXhpbmdSYXRlOworCQltaXhpbmdSYXRlID0gbmV3TWl4aW5nUmF0ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWRnZXNQYWNrYWdlLk1JWElOR19FREdFX0xBQkVMX1ZBTFVFX19NSVhJTkdfUkFURSwgb2xkTWl4aW5nUmF0ZSwgbWl4aW5nUmF0ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRWRnZXNQYWNrYWdlLk1JWElOR19FREdFX0xBQkVMX1ZBTFVFX19NSVhJTkdfUkFURToKKwkJCQlyZXR1cm4gZ2V0TWl4aW5nUmF0ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVkZ2VzUGFja2FnZS5NSVhJTkdfRURHRV9MQUJFTF9WQUxVRV9fTUlYSU5HX1JBVEU6CisJCQkJc2V0TWl4aW5nUmF0ZSgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFZGdlc1BhY2thZ2UuTUlYSU5HX0VER0VfTEFCRUxfVkFMVUVfX01JWElOR19SQVRFOgorCQkJCXNldE1peGluZ1JhdGUoTUlYSU5HX1JBVEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFZGdlc1BhY2thZ2UuTUlYSU5HX0VER0VfTEFCRUxfVkFMVUVfX01JWElOR19SQVRFOgorCQkJCXJldHVybiBtaXhpbmdSYXRlICE9IE1JWElOR19SQVRFX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobWl4aW5nUmF0ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChtaXhpbmdSYXRlKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCQorCS8qKgorCSAqIGZvciByZXNldCBzZXQgdGhlIHJhdGUgdG8gdGhlIGRlZmF1bHQgcmF0ZS4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJc2V0TWl4aW5nUmF0ZShNSVhJTkdfUkFURV9FREVGQVVMVCk7CQorCX0KKwkKKworfSAvL01peGluZ0VkZ2VMYWJlbFZhbHVlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9pbXBsL1BvcHVsYXRpb25FZGdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9pbXBsL1BvcHVsYXRpb25FZGdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxODg4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL2ltcGwvUG9wdWxhdGlvbkVkZ2VJbXBsLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZCQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5FZGdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuUG9wdWxhdGlvbkVkZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3B1bGF0aW9uIEVkZ2U8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbC5Qb3B1bGF0aW9uRWRnZUltcGwjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIgPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBvcHVsYXRpb25FZGdlSW1wbCBleHRlbmRzIEVkZ2VJbXBsIGltcGxlbWVudHMgUG9wdWxhdGlvbkVkZ2UgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpIDxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1BVTEFUSU9OX0lERU5USUZJRVJfRURFRkFVTFQgPSAiaHVtYW4iOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpIDxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHBvcHVsYXRpb25JZGVudGlmaWVyID0gUE9QVUxBVElPTl9JREVOVElGSUVSX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBvcHVsYXRpb25FZGdlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEVkZ2VzUGFja2FnZS5MaXRlcmFscy5QT1BVTEFUSU9OX0VER0U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpIHsKKwkJcmV0dXJuIHBvcHVsYXRpb25JZGVudGlmaWVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBvcHVsYXRpb25JZGVudGlmaWVyKFN0cmluZyBuZXdQb3B1bGF0aW9uSWRlbnRpZmllcikgeworCQlTdHJpbmcgb2xkUG9wdWxhdGlvbklkZW50aWZpZXIgPSBwb3B1bGF0aW9uSWRlbnRpZmllcjsKKwkJcG9wdWxhdGlvbklkZW50aWZpZXIgPSBuZXdQb3B1bGF0aW9uSWRlbnRpZmllcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWRnZXNQYWNrYWdlLlBPUFVMQVRJT05fRURHRV9fUE9QVUxBVElPTl9JREVOVElGSUVSLCBvbGRQb3B1bGF0aW9uSWRlbnRpZmllciwgcG9wdWxhdGlvbklkZW50aWZpZXIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVkZ2VzUGFja2FnZS5QT1BVTEFUSU9OX0VER0VfX1BPUFVMQVRJT05fSURFTlRJRklFUjoKKwkJCQlyZXR1cm4gZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFZGdlc1BhY2thZ2UuUE9QVUxBVElPTl9FREdFX19QT1BVTEFUSU9OX0lERU5USUZJRVI6CisJCQkJc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRWRnZXNQYWNrYWdlLlBPUFVMQVRJT05fRURHRV9fUE9QVUxBVElPTl9JREVOVElGSUVSOgorCQkJCXNldFBvcHVsYXRpb25JZGVudGlmaWVyKFBPUFVMQVRJT05fSURFTlRJRklFUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVkZ2VzUGFja2FnZS5QT1BVTEFUSU9OX0VER0VfX1BPUFVMQVRJT05fSURFTlRJRklFUjoKKwkJCQlyZXR1cm4gUE9QVUxBVElPTl9JREVOVElGSUVSX0VERUZBVUxUID09IG51bGwgPyBwb3B1bGF0aW9uSWRlbnRpZmllciAhPSBudWxsIDogIVBPUFVMQVRJT05fSURFTlRJRklFUl9FREVGQVVMVC5lcXVhbHMocG9wdWxhdGlvbklkZW50aWZpZXIpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAocG9wdWxhdGlvbklkZW50aWZpZXI6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQocG9wdWxhdGlvbklkZW50aWZpZXIpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Qb3B1bGF0aW9uRWRnZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvcHJlc2VudGF0aW9uL0VkZ2VzQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvcHJlc2VudGF0aW9uL0VkZ2VzQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmNjZTFjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9wcmVzZW50YXRpb24vRWRnZXNBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCkBAIC0wLDAgKzEsNDM2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db250cm9sQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Mb2FkUmVzb3VyY2VBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlZhbGlkYXRlQWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uSXRlbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXIuRGVmaW5pdGlvbnNFZGl0UGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBpcyB0aGUgYWN0aW9uIGJhciBjb250cmlidXRvciBmb3IgdGhlIEVkZ2VzIG1vZGVsIGVkaXRvci4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEVkZ2VzQWN0aW9uQmFyQ29udHJpYnV0b3IKKwlleHRlbmRzIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcgorCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yUGFydDsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGFjdGlvbiBvcGVucyB0aGUgUHJvcGVydGllcyB2aWV3LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQWN0aW9uIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbiA9CisJCW5ldyBBY3Rpb24oRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW0iKSkgLy8kTk9OLU5MUy0xJAorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQl0cnkgeworCQkJCQlnZXRQYWdlKCkuc2hvd1ZpZXcoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCURlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIGFjdGlvbiByZWZyZXNoZXMgdGhlIHZpZXdlciBvZiB0aGUgY3VycmVudCBlZGl0b3IgaWYgdGhlIGVkaXRvcgorCSAqIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElBY3Rpb24gcmVmcmVzaFZpZXdlckFjdGlvbiA9CisJCW5ldyBBY3Rpb24oRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtIikpIC8vJE5PTi1OTFMtMSQKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisJCQkJcmV0dXJuIGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWlmIChhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7CisJCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRWaWV3ZXIoKTsKKwkJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7CisJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyB3aWxsIGNvbnRhaW4gb25lIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlQ2hpbGRBY3Rpb25zOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVDaGlsZCBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlU2libGluZ0FjdGlvbnM7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZVNpYmxpbmcgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgY29udHJpYnV0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkZ2VzQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7CisJCXN1cGVyKEFERElUSU9OU19MQVNUX1NUWUxFKTsKKwkJbG9hZFJlc291cmNlQWN0aW9uID0gbmV3IExvYWRSZXNvdXJjZUFjdGlvbigpOworCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBWYWxpZGF0ZUFjdGlvbigpOworCQljb250cm9sQWN0aW9uID0gbmV3IENvbnRyb2xBY3Rpb24oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgU2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucyB0byB0aGUgdG9vbCBiYXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImVkZ2VzLXNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJlZGdlcy1hZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgdG8gdGhlIG1lbnUgYmFyIGEgbWVudSBhbmQgc29tZSBzZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zLAorCSAqIGFzIHdlbGwgYXMgdGhlIHN1Yi1tZW51cyBmb3Igb2JqZWN0IGNyZWF0aW9uIGl0ZW1zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudU1hbmFnZXIpOworCisJCUlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRWRnZXNFZGl0b3JfbWVudSIpLCAib3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlc01lbnVJRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigic2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIFByZXBhcmUgZm9yIENyZWF0ZUNoaWxkIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KKwkJLy8KKwkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVTaWJsaW5nIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KKwkJLy8KKwkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKERlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBGb3JjZSBhbiB1cGRhdGUgYmVjYXVzZSBFY2xpcHNlIGhpZGVzIGVtcHR5IG1lbnVzIG5vdy4KKwkJLy8KKwkJc3VibWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyCisJCQkobmV3IElNZW51TGlzdGVuZXIoKSB7CisJCQkJIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJCQkJIG1lbnVNYW5hZ2VyLnVwZGF0ZUFsbCh0cnVlKTsKKwkJCQkgfQorCQkJIH0pOworCisJCWFkZEdsb2JhbEFjdGlvbnMoc3VibWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIFdoZW4gdGhlIGFjdGl2ZSBlZGl0b3IgY2hhbmdlcywgdGhpcyByZW1lbWJlcnMgdGhlIGNoYW5nZSBhbmQgcmVnaXN0ZXJzIHdpdGggaXQgYXMgYSBzZWxlY3Rpb24gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHBhcnQpIHsKKwkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOworCQlhY3RpdmVFZGl0b3JQYXJ0ID0gcGFydDsKKworCQkvLyBTd2l0Y2ggdG8gdGhlIG5ldyBzZWxlY3Rpb24gcHJvdmlkZXIuCisJCS8vCisJCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCX0KKwkJaWYgKHBhcnQgPT0gbnVsbCkgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOworCQl9CisJCWVsc2UgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBwYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOworCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCQkvLyBGYWtlIGEgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgdG8gdXBkYXRlIHRoZSBtZW51cy4KKwkJCS8vCisJCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkgeworCQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfSwKKwkgKiBoYW5kbGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnR9cyBieSBxdWVyeWluZyBmb3IgdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncworCSAqIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZWxlY3RlZCBvYmplY3QgYW5kIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uCisJCS8vCisJCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7CisJCX0KKwkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsKKwkJfQorCisJCS8vIFF1ZXJ5IHRoZSBuZXcgc2VsZWN0aW9uIGZvciBhcHByb3ByaWF0ZSBuZXcgY2hpbGQvc2libGluZyBkZXNjcmlwdG9ycworCQkvLworCQlDb2xsZWN0aW9uPD8+IG5ld0NoaWxkRGVzY3JpcHRvcnMgPSBudWxsOworCQlDb2xsZWN0aW9uPD8+IG5ld1NpYmxpbmdEZXNjcmlwdG9ycyA9IG51bGw7CisKKwkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5zaXplKCkgPT0gMSkgeworCQkJT2JqZWN0IG9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKKworCQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpYWN0aXZlRWRpdG9yUGFydCkuZ2V0RWRpdGluZ0RvbWFpbigpOworCisJCQluZXdDaGlsZERlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMob2JqZWN0LCBudWxsKTsKKwkJCW5ld1NpYmxpbmdEZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG51bGwsIG9iamVjdCk7CisJCX0KKworCQkvLyBHZW5lcmF0ZSBhY3Rpb25zIGZvciBzZWxlY3Rpb247IHBvcHVsYXRlIGFuZCByZWRyYXcgdGhlIG1lbnVzLgorCQkvLworCQljcmVhdGVDaGlsZEFjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhuZXdDaGlsZERlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOworCQljcmVhdGVTaWJsaW5nQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMobmV3U2libGluZ0Rlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOworCisJCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOworCQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7CisJCX0KKwkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7CisJCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LAorCSAqIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMoQ29sbGVjdGlvbjw/PiBkZXNjcmlwdG9ycywgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJQ29sbGVjdGlvbjxJQWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOworCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgeworCQkJZm9yIChPYmplY3QgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7CisJCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZUNoaWxkQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwgZGVzY3JpcHRvcikpOworCQkJfQorCQl9CisJCXJldHVybiBhY3Rpb25zOworCX0KKworCS8qKgorCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LAorCSAqIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7CisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7CisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlU2libGluZ0FjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYWN0aW9uczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IHdpdGgge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMKKwkgKiBiYXNlZCBvbiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLAorCSAqIGJ5IGluc2VydGluZyB0aGVtIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGNvbnRyaWJ1dGlvbiBpdGVtIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPi4KKwkgKiBJZiA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZXkgYXJlIHNpbXBseSBhZGRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucywgU3RyaW5nIGNvbnRyaWJ1dGlvbklEKSB7CisJCWlmIChhY3Rpb25zICE9IG51bGwpIHsKKwkJCWZvciAoSUFjdGlvbiBhY3Rpb24gOiBhY3Rpb25zKSB7CisJCQkJaWYgKGNvbnRyaWJ1dGlvbklEICE9IG51bGwpIHsKKwkJCQkJbWFuYWdlci5pbnNlcnRCZWZvcmUoY29udHJpYnV0aW9uSUQsIGFjdGlvbik7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQltYW5hZ2VyLmFkZChhY3Rpb24pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkJCisJLyoqCisJICogVGhpcyByZW1vdmVzIGZyb20gdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMKKwkgKiBiYXNlZCBvbiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGRlcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248PyBleHRlbmRzIElBY3Rpb24+IGFjdGlvbnMpIHsKKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgeworCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0SXRlbXMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKKwkJCQkvLyBMb29rIGludG8gU3ViQ29udHJpYnV0aW9uSXRlbXMKKwkJCQkvLworCQkJCUlDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbkl0ZW0gPSBpdGVtc1tpXTsKKwkJCQl3aGlsZSAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIHsKKwkJCQkJY29udHJpYnV0aW9uSXRlbSA9ICgoU3ViQ29udHJpYnV0aW9uSXRlbSljb250cmlidXRpb25JdGVtKS5nZXRJbm5lckl0ZW0oKTsKKwkJCQl9CisKKwkJCQkvLyBEZWxldGUgdGhlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1zIHdpdGggbWF0Y2hpbmcgYWN0aW9uLgorCQkJCS8vCisJCQkJaWYgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7CisJCQkJCUlBY3Rpb24gYWN0aW9uID0gKChBY3Rpb25Db250cmlidXRpb25JdGVtKWNvbnRyaWJ1dGlvbkl0ZW0pLmdldEFjdGlvbigpOworCQkJCQlpZiAoYWN0aW9ucy5jb250YWlucyhhY3Rpb24pKSB7CisJCQkJCQltYW5hZ2VyLnJlbW92ZShjb250cmlidXRpb25JdGVtKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBwb3AtdXAgbWVudSBiZWZvcmUgaXQgYXBwZWFycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7CisJCU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbnVsbDsKKworCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisKKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOworCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGluc2VydHMgZ2xvYmFsIGFjdGlvbnMgYmVmb3JlIHRoZSAiYWRkaXRpb25zLWVuZCIgc2VwYXJhdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMtZW5kIiwgbmV3IFNlcGFyYXRvcigidWktYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uKTsgLy8kTk9OLU5MUy0xJAorCisJCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsJCQorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHJlZnJlc2hWaWV3ZXJBY3Rpb24pOyAvLyROT04tTkxTLTEkCisKKwkJc3VwZXIuYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogVGhpcyBlbnN1cmVzIHRoYXQgYSBkZWxldGUgYWN0aW9uIHdpbGwgY2xlYW4gdXAgYWxsIHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBvYmplY3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUFsbFJlZmVyZW5jZXNPbkRlbGV0ZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9wcmVzZW50YXRpb24vRWRnZXNFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvcHJlc2VudGF0aW9uL0VkZ2VzRWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzYzZmMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvcHJlc2VudGF0aW9uL0VkZ2VzRWRpdG9yLmphdmEKQEAgLTAsMCArMSwxNTczIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuTWFya2VySGVscGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5lZGl0b3IuUHJvYmxlbUVkaXRvclBhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuY2VsbGVkaXRvci5BZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5Mb2NhbFRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5VbndyYXBwaW5nU2VsZWN0aW9uUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSU1hcmtlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSVV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS52aWV3LkV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnByb3ZpZGVyLkVkZ2VzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLkdyYXBoSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5wcm92aWRlci5Nb2RpZmllckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5wcm92aWRlci5TY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIucHJvdmlkZXIuU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5wcm92aWRlci5Tb2x2ZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnByb3ZpZGVyLkRlZmluaXRpb25zRWRpdFBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnByb3ZpZGVyLkxhYmVsc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5wcm92aWRlci5Ob2Rlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50eXBlcy5wcm92aWRlci5UeXBlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOworCisKKy8qKgorICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgRWRnZXMgbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRWRnZXNFZGl0b3IKKwlleHRlbmRzIE11bHRpUGFnZUVkaXRvclBhcnQKKwlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluUHJvdmlkZXIsIElTZWxlY3Rpb25Qcm92aWRlciwgSU1lbnVMaXN0ZW5lciwgSVZpZXdlclByb3ZpZGVyLCBJR290b01hcmtlciB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgZWRpdGluZyBkb21haW4gdGhhdCBpcyB1c2VkIHRvIHRyYWNrIGFsbCBjaGFuZ2VzIHRvIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBvbmUgYWRhcHRlciBmYWN0b3J5IHVzZWQgZm9yIHByb3ZpZGluZyB2aWV3cyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNvbnRlbnRPdXRsaW5lUGFnZSBjb250ZW50T3V0bGluZVBhZ2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIGEga2x1ZGdlLi4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBjb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UncyB2aWV3ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgY29udGVudE91dGxpbmVWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBwcm9wZXJ0eSBzaGVldCBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQcm9wZXJ0eVNoZWV0UGFnZSBwcm9wZXJ0eVNoZWV0UGFnZTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHZpZXdlciB0aGF0IHNoYWRvd3MgdGhlIHNlbGVjdGlvbiBpbiB0aGUgY29udGVudCBvdXRsaW5lLgorCSAqIFRoZSBwYXJlbnQgcmVsYXRpb24gbXVzdCBiZSBjb3JyZWN0bHkgZGVmaW5lZCBmb3IgdGhpcyB0byB3b3JrLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmVlVmlld2VyIHNlbGVjdGlvblZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBjb250ZW50IHZpZXdlciwgd2hpY2ggbWF5IGJlIGVpdGhlciBvbmUgb2YgdGhlIHZpZXdlcnMgaW4gdGhlIHBhZ2VzIG9yIHRoZSBjb250ZW50IG91dGxpbmUgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBWaWV3ZXIgY3VycmVudFZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyB0byB3aGljaCBldmVyIHZpZXdlciBpcyBhY3RpdmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9cyB0aGF0IGFyZSBsaXN0ZW5pbmcgdG8gdGhpcyBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZWRpdG9yIGFzIGEgd2hvbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb24gZWRpdG9yU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKKworCS8qKgorCSAqIFRoZSBNYXJrZXJIZWxwZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHdvcmtzcGFjZSByZXNvdXJjZSBtYXJrZXJzIHByZXNlbnRlZAorCSAqIGluIEVjbGlwc2UncyBQcm9ibGVtcyBWaWV3LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXJrZXJIZWxwZXIgbWFya2VySGVscGVyID0gbmV3IEVkaXRVSU1hcmtlckhlbHBlcigpOworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIGZvciB3aGVuIHRoZSBvdXRsaW5lIGJlY29tZXMgYWN0aXZlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyID0KKwkJbmV3IElQYXJ0TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQlpZiAocCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSB7CisJCQkJCWlmICgoKENvbnRlbnRPdXRsaW5lKXApLmdldEN1cnJlbnRQYWdlKCkgPT0gY29udGVudE91dGxpbmVQYWdlKSB7CisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihFZGdlc0VkaXRvci50aGlzKTsKKworCQkJCQkJc2V0Q3VycmVudFZpZXdlcihjb250ZW50T3V0bGluZVZpZXdlcik7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAocCBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpIHsKKwkJCQkJaWYgKCgoUHJvcGVydHlTaGVldClwKS5nZXRDdXJyZW50UGFnZSgpID09IHByb3BlcnR5U2hlZXRQYWdlKSB7CisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihFZGdlc0VkaXRvci50aGlzKTsKKwkJCQkJCWhhbmRsZUFjdGl2YXRlKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAocCA9PSBFZGdlc0VkaXRvci50aGlzKSB7CisJCQkJCWhhbmRsZUFjdGl2YXRlKCk7CisJCQkJfQorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCX07CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBzYXZlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gc2F2ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogTWFwIHRvIHN0b3JlIHRoZSBkaWFnbm9zdGljIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+IHJlc291cmNlVG9EaWFnbm9zdGljTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+KCk7CisKKwkvKioKKwkgKiBDb250cm9scyB3aGV0aGVyIHRoZSBwcm9ibGVtIGluZGljYXRpb24gc2hvdWxkIGJlIHVwZGF0ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOworCisJLyoqCisJICogQWRhcHRlciB1c2VkIHRvIHVwZGF0ZSB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHdoZW4gcmVzb3VyY2VzIGFyZSBkZW1hbmRlZCBsb2FkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEVDb250ZW50QWRhcHRlciBwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIgPSAKKwkJbmV3IEVDb250ZW50QWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKKwkJCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJlc291cmNlLmNsYXNzKSkgeworCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEOgorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fRVJST1JTOgorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fV0FSTklOR1M6IHsKKwkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKKwkJCQkJCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgbnVsbCk7CisJCQkJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgZGlhZ25vc3RpYyk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5yZW1vdmUocmVzb3VyY2UpOworCQkJCQkJCX0KKworCQkJCQkJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgeworCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQkJCQkJCQkJCSB9CisJCQkJCQkJCQkgfSk7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCQkJfQorCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsKKwkJCQliYXNpY1NldFRhcmdldCh0YXJnZXQpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHVuc2V0VGFyZ2V0KFJlc291cmNlIHRhcmdldCkgeworCQkJCWJhc2ljVW5zZXRUYXJnZXQodGFyZ2V0KTsKKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyBmb3Igd29ya3NwYWNlIGNoYW5nZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPQorCQluZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7CisJCQkJdHJ5IHsKKwkJCQkJY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgeworCQkJCQkJcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpOworCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworCQkJCQkJCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgeworCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgfHwKKwkJCQkJCQkJICAgIGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIGRlbHRhLmdldEZsYWdzKCkgIT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUykgeworCQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShkZWx0YS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpLCBmYWxzZSk7CisJCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworCQkJCQkJCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgeworCQkJCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWVsc2UgaWYgKCFzYXZlZFJlc291cmNlcy5yZW1vdmUocmVzb3VyY2UpKSB7CisJCQkJCQkJCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCX0KKworCQkJCQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldENoYW5nZWRSZXNvdXJjZXMoKSB7CisJCQkJCQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7CisJCQkJCQl9CisKKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRSZW1vdmVkUmVzb3VyY2VzKCkgeworCQkJCQkJCXJldHVybiByZW1vdmVkUmVzb3VyY2VzOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJZmluYWwgUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOworCQkJCQlkZWx0YS5hY2NlcHQodmlzaXRvcik7CisKKwkJCQkJaWYgKCF2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJIHJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsKKwkJCQkJCQkJCSBpZiAoIWlzRGlydHkoKSkgeworCQkJCQkJCQkJCSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKEVkZ2VzRWRpdG9yLnRoaXMsIGZhbHNlKTsKKwkJCQkJCQkJCSB9CisJCQkJCQkJCSB9CisJCQkJCQkJIH0pOworCQkJCQl9CisKKwkJCQkJaWYgKCF2aXNpdG9yLmdldENoYW5nZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJIGNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKKwkJCQkJCQkJCSBpZiAoZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSBFZGdlc0VkaXRvci50aGlzKSB7CisJCQkJCQkJCQkJIGhhbmRsZUFjdGl2YXRlKCk7CisJCQkJCQkJCQkgfQorCQkJCQkJCQkgfQorCQkJCQkJCSB9KTsKKwkJCQkJfQorCQkJCX0KKwkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIEhhbmRsZXMgYWN0aXZhdGlvbiBvZiB0aGUgZWRpdG9yIG9yIGl0J3MgYXNzb2NpYXRlZCB2aWV3cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0ZSgpIHsKKwkJLy8gUmVjb21wdXRlIHRoZSByZWFkIG9ubHkgc3RhdGUuCisJCS8vCisJCWlmIChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpICE9IG51bGwpIHsKKwkJICBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpLmNsZWFyKCk7CisKKwkJICAvLyBSZWZyZXNoIGFueSBhY3Rpb25zIHRoYXQgbWF5IGJlY29tZSBlbmFibGVkIG9yIGRpc2FibGVkLgorCQkgIC8vCisJCSAgc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKKwkJfQorCisJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCWlmIChoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpIHsKKwkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKEVkZ2VzRWRpdG9yLnRoaXMsIGZhbHNlKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCWNoYW5nZWRSZXNvdXJjZXMucmVtb3ZlQWxsKHNhdmVkUmVzb3VyY2VzKTsKKwkJCWhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKTsKKwkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBIYW5kbGVzIHdoYXQgdG8gZG8gd2l0aCBjaGFuZ2VkIHJlc291cmNlcyBvbiBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKSB7CisJCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkgJiYgKCFpc0RpcnR5KCkgfHwgaGFuZGxlRGlydHlDb25mbGljdCgpKSkgeworCQkJaWYgKGlzRGlydHkoKSkgeworCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSk7CisJCQl9CisJCQllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7CisKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgeworCQkJCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKSB7CisJCQkJCXJlc291cmNlLnVubG9hZCgpOworCQkJCQl0cnkgeworCQkJCQkJcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOworCQkJCQl9CisJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCWlmICghcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAuY29udGFpbnNLZXkocmVzb3VyY2UpKSB7CisJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4uaXNTdGFsZShlZGl0b3JTZWxlY3Rpb24pKSB7CisJCQkJc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOworCQkJfQorCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQl9CisJfQorICAKKwkvKioKKwkgKiBVcGRhdGVzIHRoZSBwcm9ibGVtcyBpbmRpY2F0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWVkIGRpYWdub3N0aWMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKSB7CisJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgeworCQkJQmFzaWNEaWFnbm9zdGljIGRpYWdub3N0aWMgPQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMKKwkJCQkJKERpYWdub3N0aWMuT0ssCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucyIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJIDAsCisJCQkJCSBudWxsLAorCQkJCQkgbmV3IE9iamVjdCBbXSB7IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSB9KTsKKwkJCWZvciAoRGlhZ25vc3RpYyBjaGlsZERpYWdub3N0aWMgOiByZXNvdXJjZVRvRGlhZ25vc3RpY01hcC52YWx1ZXMoKSkgeworCQkJCWlmIChjaGlsZERpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCWRpYWdub3N0aWMuYWRkKGNoaWxkRGlhZ25vc3RpYyk7CisJCQkJfQorCQkJfQorCisJCQlpbnQgbGFzdEVkaXRvclBhZ2UgPSBnZXRQYWdlQ291bnQoKSAtIDE7CisJCQlpZiAobGFzdEVkaXRvclBhZ2UgPj0gMCAmJiBnZXRFZGl0b3IobGFzdEVkaXRvclBhZ2UpIGluc3RhbmNlb2YgUHJvYmxlbUVkaXRvclBhcnQpIHsKKwkJCQkoKFByb2JsZW1FZGl0b3JQYXJ0KWdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkpLnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7CisJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCXNldEFjdGl2ZVBhZ2UobGFzdEVkaXRvclBhZ2UpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJUHJvYmxlbUVkaXRvclBhcnQgcHJvYmxlbUVkaXRvclBhcnQgPSBuZXcgUHJvYmxlbUVkaXRvclBhcnQoKTsKKwkJCQlwcm9ibGVtRWRpdG9yUGFydC5zZXREaWFnbm9zdGljKGRpYWdub3N0aWMpOworCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldE1hcmtlckhlbHBlcihtYXJrZXJIZWxwZXIpOworCQkJCXRyeSB7CisJCQkJCWFkZFBhZ2UoKytsYXN0RWRpdG9yUGFnZSwgcHJvYmxlbUVkaXRvclBhcnQsIGdldEVkaXRvcklucHV0KCkpOworCQkJCQlzZXRQYWdlVGV4dChsYXN0RWRpdG9yUGFnZSwgcHJvYmxlbUVkaXRvclBhcnQuZ2V0UGFydE5hbWUoKSk7CisJCQkJCXNldEFjdGl2ZVBhZ2UobGFzdEVkaXRvclBhZ2UpOworCQkJCQlzaG93VGFicygpOworCQkJCX0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCURlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChtYXJrZXJIZWxwZXIuaGFzTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpKSB7CisJCQkJbWFya2VySGVscGVyLmRlbGV0ZU1hcmtlcnMoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCW1hcmtlckhlbHBlci5jcmVhdGVNYXJrZXJzKGRpYWdub3N0aWMpOworCQkJCQl9CisJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogU2hvd3MgYSBkaWFsb2cgdGhhdCBhc2tzIGlmIGNvbmZsaWN0aW5nIGNoYW5nZXMgc2hvdWxkIGJlIGRpc2NhcmRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkgeworCQlyZXR1cm4KKwkJCU1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uCisJCQkJKGdldFNpdGUoKS5nZXRTaGVsbCgpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9GaWxlQ29uZmxpY3RfbGFiZWwiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9XQVJOX0ZpbGVDb25mbGljdCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhIG1vZGVsIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRnZXNFZGl0b3IoKSB7CisJCXN1cGVyKCk7CisJCWluaXRpYWxpemVFZGl0aW5nRG9tYWluKCk7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHVwIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1vZGVsIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWRpdGluZ0RvbWFpbigpIHsKKwkJLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlpZWxkcyBpdGVtIHByb3ZpZGVycy4KKwkJLy8KKwkJYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOworCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRWRnZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IExhYmVsc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTm9kZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFR5cGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBHcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTb2x2ZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKworCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUgZXhlY3V0ZWQuCisJCS8vCisJCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOworCisJCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCisJCS8vCisJCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcgorCQkJKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKKwkJCQkgcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgeworCQkJCQkgZ2V0Q29udGFpbmVyKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJIChuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJICBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCSAgZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworCisJCQkJCQkJCSAgLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KKwkJCQkJCQkJICAvLworCQkJCQkJCQkgIENvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaylldmVudC5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsKKwkJCQkJCQkJICBpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgeworCQkJCQkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihtb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7CisJCQkJCQkJCSAgfQorCQkJCQkJCQkgIGlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsICYmICFwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQkJCQkgIHByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsKKwkJCQkJCQkJICB9CisJCQkJCQkJICB9CisJCQkJCQkgIH0pOworCQkJCSB9CisJCQkgfSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgorCQkvLworCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgQm9vbGVhbj4oKSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBoZXJlIGZvciB0aGUgbGlzdGVuZXIgdG8gYmUgYWJsZSB0byBjYWxsIGl0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCQkJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGludCBhY3Rpb24pIHsKKwkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKGFjdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHRoZSBzZWxlY3Rpb24gaW50byB3aGljaGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKKwkJZmluYWwgQ29sbGVjdGlvbjw/PiB0aGVTZWxlY3Rpb24gPSBjb2xsZWN0aW9uOworCQkvLyBNYWtlIHN1cmUgaXQncyBva2F5LgorCQkvLworCQlpZiAodGhlU2VsZWN0aW9uICE9IG51bGwgJiYgIXRoZVNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKKwkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0KKwkJCQluZXcgUnVubmFibGUoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGl0ZW1zIGluIHRoZSBjdXJyZW50IGNvbnRlbnQgdmlld2VyIG9mIHRoZSBlZGl0b3IuCisJCQkJCQkvLworCQkJCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgeworCQkJCQkJCWN1cnJlbnRWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoZVNlbGVjdGlvbi50b0FycmF5KCkpLCB0cnVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX07CisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgZWRpdGluZyBkb21haW4gYXMgcmVxdWlyZWQgYnkgdGhlIHtAbGluayBJRWRpdGluZ0RvbWFpblByb3ZpZGVyfSBpbnRlcmZhY2UuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGltcGxlbWVudGluZyB0aGUgc3RhdGljIG1ldGhvZHMgb2Yge0BsaW5rIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbn0KKwkgKiBhbmQgZm9yIHN1cHBvcnRpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgeworCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgY2xhc3MgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgeworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0IFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIHBhcmVudCAhPSBudWxsOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ha2VzIHN1cmUgdGhhdCBvbmUgY29udGVudCB2aWV3ZXIsIGVpdGhlciBmb3IgdGhlIGN1cnJlbnQgcGFnZSBvciB0aGUgb3V0bGluZSB2aWV3LCBpZiBpdCBoYXMgZm9jdXMsCisJICogaXMgdGhlIGN1cnJlbnQgb25lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRWaWV3ZXIoVmlld2VyIHZpZXdlcikgeworCQkvLyBJZiBpdCBpcyBjaGFuZ2luZy4uLgorCQkvLworCQlpZiAoY3VycmVudFZpZXdlciAhPSB2aWV3ZXIpIHsKKwkJCWlmIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgeworCQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgb24gZGVtYW5kLgorCQkJCS8vCisJCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0KKwkJCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQkJCQkvLyBUaGlzIGp1c3Qgbm90aWZpZXMgdGhvc2UgdGhpbmdzIHRoYXQgYXJlIGFmZmVjdGVkIGJ5IHRoZSBzZWN0aW9uLgorCQkJCQkJLy8KKwkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHNlbGVjdGlvbkNoYW5nZWRFdmVudCkgeworCQkJCQkJCXNldFNlbGVjdGlvbihzZWxlY3Rpb25DaGFuZ2VkRXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQkJfQorCQkJCQl9OworCQkJfQorCisJCQkvLyBTdG9wIGxpc3RlbmluZyB0byB0aGUgb2xkIG9uZS4KKwkJCS8vCisJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7CisJCQkJY3VycmVudFZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKKwkJCX0KKworCQkJLy8gU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXcgb25lLgorCQkJLy8KKwkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgeworCQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKKwkJCX0KKworCQkJLy8gUmVtZW1iZXIgaXQuCisJCQkvLworCQkJY3VycmVudFZpZXdlciA9IHZpZXdlcjsKKworCQkJLy8gU2V0IHRoZSBlZGl0b3JzIHNlbGVjdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCB2aWV3ZXIncyBzZWxlY3Rpb24uCisJCQkvLworCQkJc2V0U2VsZWN0aW9uKGN1cnJlbnRWaWV3ZXIgPT0gbnVsbCA/IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkgOiBjdXJyZW50Vmlld2VyLmdldFNlbGVjdGlvbigpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgdmlld2VyIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSVZpZXdlclByb3ZpZGVyfSBpbnRlcmZhY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7CisJCXJldHVybiBjdXJyZW50Vmlld2VyOworCX0KKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlciBhbmQgYWRkcyBhIGxpc3RlbmVyIGFzIHdlbGwgcmVnaXN0ZXJpbmcgdGhlIG1lbnUgZm9yIGV4dGVuc2lvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgeworCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQKKwkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7CisJCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKKwkJTWVudSBtZW51PSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKKwkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOworCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgbmV3IFVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcih2aWV3ZXIpKTsKKworCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSzsKKwkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OworCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgVmlld2VyRHJhZ0FkYXB0ZXIodmlld2VyKSk7CisJCXZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIGNhbGxlZCB0byBsb2FkIGEgcmVzb3VyY2UgaW50byB0aGUgZWRpdGluZyBkb21haW4ncyByZXNvdXJjZSBzZXQgYmFzZWQgb24gdGhlIGVkaXRvcidzIGlucHV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZU1vZGVsKCkgeworCQlVUkkgcmVzb3VyY2VVUkkgPSBFZGl0VUlVdGlsLmdldFVSSShnZXRFZGl0b3JJbnB1dCgpKTsKKwkJRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCS8vIExvYWQgdGhlIHJlc291cmNlIHRocm91Z2ggdGhlIGVkaXRpbmcgZG9tYWluLgorCQkJLy8KKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCB0cnVlKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWV4Y2VwdGlvbiA9IGU7CisJCQlyZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgZmFsc2UpOworCQl9CisKKwkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbik7CisJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCAgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQl9CisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5hZGQocHJvYmxlbUluZGljYXRpb25BZGFwdGVyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgZGlhZ25vc3RpYyBkZXNjcmliaW5nIHRoZSBlcnJvcnMgYW5kIHdhcm5pbmdzIGxpc3RlZCBpbiB0aGUgcmVzb3VyY2UKKwkgKiBhbmQgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gKGlmIGFueSkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERpYWdub3N0aWMgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMoUmVzb3VyY2UgcmVzb3VyY2UsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJaWYgKCFyZXNvdXJjZS5nZXRFcnJvcnMoKS5pc0VtcHR5KCkgfHwgIXJlc291cmNlLmdldFdhcm5pbmdzKCkuaXNFbXB0eSgpKSB7CisJCQlCYXNpY0RpYWdub3N0aWMgYmFzaWNEaWFnbm9zdGljID0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZXhjZXB0aW9uID09IG51bGwgPyAoT2JqZWN0KXJlc291cmNlIDogZXhjZXB0aW9uIH0pOworCQkJYmFzaWNEaWFnbm9zdGljLm1lcmdlKEVjb3JlVXRpbC5jb21wdXRlRGlhZ25vc3RpYyhyZXNvdXJjZSwgdHJ1ZSkpOworCQkJcmV0dXJuIGJhc2ljRGlhZ25vc3RpYzsKKwkJfQorCQllbHNlIGlmIChleGNlcHRpb24gIT0gbnVsbCkgeworCQkJcmV0dXJuCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkgMCwKKwkJCQkJIGdldFN0cmluZygiX1VJX0NyZWF0ZU1vZGVsRXJyb3JfbWVzc2FnZSIsIHJlc291cmNlLmdldFVSSSgpKSwgLy8kTk9OLU5MUy0xJAorCQkJCQkgbmV3IE9iamVjdFtdIHsgZXhjZXB0aW9uIH0pOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIERpYWdub3N0aWMuT0tfSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGluc3RhbGwgeW91ciBvd24gY29udHJvbHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3JlYXRlUGFnZXMoKSB7CisJCS8vIENyZWF0ZXMgdGhlIG1vZGVsIGZyb20gdGhlIGVkaXRvciBpbnB1dAorCQkvLworCQljcmVhdGVNb2RlbCgpOworCisJCS8vIE9ubHkgY3JlYXRlcyB0aGUgb3RoZXIgcGFnZXMgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGVkaXRlZAorCQkvLworCQlpZiAoIWdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJLy8gQ3JlYXRlIGEgcGFnZSBmb3IgdGhlIHNlbGVjdGlvbiB0cmVlIHZpZXcuCisJCQkvLworCQkJVHJlZSB0cmVlID0gbmV3IFRyZWUoZ2V0Q29udGFpbmVyKCksIFNXVC5NVUxUSSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKKwkJCXNldEN1cnJlbnRWaWV3ZXIoc2VsZWN0aW9uVmlld2VyKTsKKworCQkJc2VsZWN0aW9uVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7CisKKwkJCW5ldyBBZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3Ioc2VsZWN0aW9uVmlld2VyLmdldFRyZWUoKSwgYWRhcHRlckZhY3RvcnkpOworCisJCQljcmVhdGVDb250ZXh0TWVudUZvcihzZWxlY3Rpb25WaWV3ZXIpOworCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2UodHJlZSk7CisJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKworCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkgc2V0QWN0aXZlUGFnZSgwKTsKKwkJCQkJIH0KKwkJCQkgfSk7CisJCX0KKworCQkvLyBFbnN1cmVzIHRoYXQgdGhpcyBlZGl0b3Igd2lsbCBvbmx5IGRpc3BsYXkgdGhlIHBhZ2UncyB0YWIKKwkJLy8gYXJlYSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBwYWdlCisJCS8vCisJCWdldENvbnRhaW5lcigpLmFkZENvbnRyb2xMaXN0ZW5lcgorCQkJKG5ldyBDb250cm9sQWRhcHRlcigpIHsKKwkJCQlib29sZWFuIGd1YXJkID0gZmFsc2U7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7CisJCQkJCWlmICghZ3VhcmQpIHsKKwkJCQkJCWd1YXJkID0gdHJ1ZTsKKwkJCQkJCWhpZGVUYWJzKCk7CisJCQkJCQlndWFyZCA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJIH0pOworCisJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCQkJIH0KKwkJCSB9KTsKKwl9CisKKwkvKioKKwkgKiBJZiB0aGVyZSBpcyBqdXN0IG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LAorCSAqIHRoaXMgaGlkZXMgdGhlIHNpbmdsZSB0YWIgYXQgdGhlIGJvdHRvbS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoaWRlVGFicygpIHsKKwkJaWYgKGdldFBhZ2VDb3VudCgpIDw9IDEpIHsKKwkJCXNldFBhZ2VUZXh0KDAsICIiKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgeworCQkJCSgoQ1RhYkZvbGRlcilnZXRDb250YWluZXIoKSkuc2V0VGFiSGVpZ2h0KDEpOworCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOworCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSArIDYpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LAorCSAqIHRoaXMgc2hvd3MgdGhlIHRhYnMgYXQgdGhlIGJvdHRvbS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzaG93VGFicygpIHsKKwkJaWYgKGdldFBhZ2VDb3VudCgpID4gMSkgeworCQkJc2V0UGFnZVRleHQoMCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgeworCQkJCSgoQ1RhYkZvbGRlcilnZXRDb250YWluZXIoKSkuc2V0VGFiSGVpZ2h0KFNXVC5ERUZBVUxUKTsKKwkJCQlQb2ludCBwb2ludCA9IGdldENvbnRhaW5lcigpLmdldFNpemUoKTsKKwkJCQlnZXRDb250YWluZXIoKS5zZXRTaXplKHBvaW50LngsIHBvaW50LnkgLSA2KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdXNlZCB0byB0cmFjayB0aGUgYWN0aXZlIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBwYWdlSW5kZXgpIHsKKwkJc3VwZXIucGFnZUNoYW5nZShwYWdlSW5kZXgpOworCisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgIT0gbnVsbCkgeworCQkJaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oY29udGVudE91dGxpbmVQYWdlLmdldFNlbGVjdGlvbigpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgaG93IHRoZSBmcmFtZXdvcmsgZGV0ZXJtaW5lcyB3aGljaCBpbnRlcmZhY2VzIHdlIGltcGxlbWVudC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7CisJCWlmIChrZXkuZXF1YWxzKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gc2hvd091dGxpbmVWaWV3KCkgPyBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSA6IG51bGw7CisJCX0KKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gZ2V0UHJvcGVydHlTaGVldFBhZ2UoKTsKKwkJfQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IG91dGxpbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQ29udGVudE91dGxpbmVQYWdlIGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIHsKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSA9PSBudWxsKSB7CisJCQkvLyBUaGUgY29udGVudCBvdXRsaW5lIGlzIGp1c3QgYSB0cmVlLgorCQkJLy8KKwkJCWNsYXNzIE15Q29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgQ29udGVudE91dGxpbmVQYWdlIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCQkJCS8vIFNldCB1cCB0aGUgdHJlZSB2aWV3ZXIuCisJCQkJCS8vCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisKKwkJCQkJLy8gTWFrZSBzdXJlIG91ciBwb3B1cHMgd29yay4KKwkJCQkJLy8KKwkJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IoY29udGVudE91dGxpbmVWaWV3ZXIpOworCisJCQkJCWlmICghZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkgIC8vIFNlbGVjdCB0aGUgcm9vdCBvYmplY3QgaW4gdGhlIHZpZXcuCisJCQkJCSAgLy8KKwkJCQkJICBjb250ZW50T3V0bGluZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCQkJCQl9CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgbWFrZUNvbnRyaWJ1dGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlcikgeworCQkJCQlzdXBlci5tYWtlQ29udHJpYnV0aW9ucyhtZW51TWFuYWdlciwgdG9vbEJhck1hbmFnZXIsIHN0YXR1c0xpbmVNYW5hZ2VyKTsKKwkJCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsKKwkJCQl9CisJCQl9CisKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZSA9IG5ldyBNeUNvbnRlbnRPdXRsaW5lUGFnZSgpOworCisJCQkvLyBMaXN0ZW4gdG8gc2VsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBpdCBpcyBhIHNwZWNpYWwgd2F5LgorCQkJLy8KKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKKwkJCQkobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQkJCSAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBoYW5kbGUgc2VsZWN0aW9ucyBjb3JyZWN0bHkuCisJCQkJCSAvLworCQkJCQkgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQkJCSBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJcmV0dXJuIGNvbnRlbnRPdXRsaW5lUGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIHByb3BlcnR5IHNoZWV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7CisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZSA9CisJCQkJbmV3IEV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2UoZWRpdGluZ0RvbWFpbikgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoTGlzdDw/PiBzZWxlY3Rpb24pIHsKKwkJCQkJCUVkZ2VzRWRpdG9yLnRoaXMuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0aW9uKTsKKwkJCQkJCUVkZ2VzRWRpdG9yLnRoaXMuc2V0Rm9jdXMoKTsKKwkJCQkJfQorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKKwkJCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7CisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsKKwkJCQkJfQorCQkJCX07CisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQl9CisKKwkJcmV0dXJuIHByb3BlcnR5U2hlZXRQYWdlOworCX0KKworCS8qKgorCSAqIFRoaXMgZGVhbHMgd2l0aCBob3cgd2Ugd2FudCBzZWxlY3Rpb24gaW4gdGhlIG91dGxpbmVyIHRvIGFmZmVjdCB0aGUgb3RoZXIgdmlld3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJaWYgKHNlbGVjdGlvblZpZXdlciAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQlJdGVyYXRvcjw/PiBzZWxlY3RlZEVsZW1lbnRzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLml0ZXJhdG9yKCk7CisJCQlpZiAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsKKwkJCQkvLyBHZXQgdGhlIGZpcnN0IHNlbGVjdGVkIGVsZW1lbnQuCisJCQkJLy8KKwkJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCk7CisKKwkJCQlBcnJheUxpc3Q8T2JqZWN0PiBzZWxlY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisJCQkJc2VsZWN0aW9uTGlzdC5hZGQoc2VsZWN0ZWRFbGVtZW50KTsKKwkJCQl3aGlsZSAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsKKwkJCQkJc2VsZWN0aW9uTGlzdC5hZGQoc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCkpOworCQkJCX0KKworCQkJCS8vIFNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSB3aWRnZXQuCisJCQkJLy8KKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbkxpc3QpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSUVkaXRvclBhcnR9IGFuZCBzaW1wbHkgdGVzdHMgdGhlIGNvbW1hbmQgc3RhY2suCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKwkJcmV0dXJuICgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuaXNTYXZlTmVlZGVkKCk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSBzYXZlcyB0aGUgbW9kZWwgZmlsZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKKwkJLy8gU2F2ZSBvbmx5IHJlc291cmNlcyB0aGF0IGhhdmUgYWN0dWFsbHkgY2hhbmdlZC4KKwkJLy8KKwkJZmluYWwgTWFwPE9iamVjdCwgT2JqZWN0PiBzYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOworCQlzYXZlT3B0aW9ucy5wdXQoUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VELCBSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRURfTUVNT1JZX0JVRkZFUik7CisKKwkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbiBiZWNhdXNlIHRoaXMgaXMgYSBsb25nIHJ1bm5pbmcgYWN0aXZpdHkgdGhhdCBtb2RpZmllcyB0aGUgd29ya2JlbmNoLgorCQkvLworCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0KKwkJCW5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7CisJCQkJLy8gVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBydW5zLgorCQkJCS8vCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQkJLy8gU2F2ZSB0aGUgcmVzb3VyY2VzIHRvIHRoZSBmaWxlIHN5c3RlbS4KKwkJCQkJLy8KKwkJCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7CisJCQkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpIHsKKwkJCQkJCWlmICgoZmlyc3QgfHwgIXJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpIHx8IGlzUGVyc2lzdGVkKHJlc291cmNlKSkgJiYgIWVkaXRpbmdEb21haW4uaXNSZWFkT25seShyZXNvdXJjZSkpIHsKKwkJCQkJCQl0cnkgeworCQkJCQkJCQlsb25nIHRpbWVTdGFtcCA9IHJlc291cmNlLmdldFRpbWVTdGFtcCgpOworCQkJCQkJCQlyZXNvdXJjZS5zYXZlKHNhdmVPcHRpb25zKTsKKwkJCQkJCQkJaWYgKHJlc291cmNlLmdldFRpbWVTdGFtcCgpICE9IHRpbWVTdGFtcCkgeworCQkJCQkJCQkJc2F2ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJCQkJCQl9CisJCQkJCQkJZmlyc3QgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX07CisKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCS8vIFRoaXMgcnVucyB0aGUgb3B0aW9ucywgYW5kIHNob3dzIHByb2dyZXNzLgorCQkJLy8KKwkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpLnJ1bih0cnVlLCBmYWxzZSwgb3BlcmF0aW9uKTsKKworCQkJLy8gUmVmcmVzaCB0aGUgbmVjZXNzYXJ5IHN0YXRlLgorCQkJLy8KKwkJCSgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuc2F2ZUlzRG9uZSgpOworCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZyB0aGF0IHNob3VsZG4ndC4KKwkJCS8vCisJCQlEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOworCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB3aGV0aGVyIHNvbWV0aGluZyBoYXMgYmVlbiBwZXJzaXN0ZWQgdG8gdGhlIFVSSSBvZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBVUkkgY29udmVydGVyIGZyb20gdGhlIGVkaXRvcidzIHJlc291cmNlIHNldCB0byB0cnkgdG8gb3BlbiBhbiBpbnB1dCBzdHJlYW0uIAorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzUGVyc2lzdGVkKFJlc291cmNlIHJlc291cmNlKSB7CisJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisJCXRyeSB7CisJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0ocmVzb3VyY2UuZ2V0VVJJKCkpOworCQkJaWYgKHN0cmVhbSAhPSBudWxsKSB7CisJCQkJcmVzdWx0ID0gdHJ1ZTsKKwkJCQlzdHJlYW0uY2xvc2UoKTsKKwkJCX0KKwkJfQorCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gSWdub3JlCisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIHRydWUgYmVjYXVzZSBpdCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFRoaXMgYWxzbyBjaGFuZ2VzIHRoZSBlZGl0b3IncyBpbnB1dC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKKwkJU2F2ZUFzRGlhbG9nIHNhdmVBc0RpYWxvZyA9IG5ldyBTYXZlQXNEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOworCQlzYXZlQXNEaWFsb2cub3BlbigpOworCQlJUGF0aCBwYXRoID0gc2F2ZUFzRGlhbG9nLmdldFJlc3VsdCgpOworCQlpZiAocGF0aCAhPSBudWxsKSB7CisJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOworCQkJaWYgKGZpbGUgIT0gbnVsbCkgeworCQkJCWRvU2F2ZUFzKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKSwgbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVBcyhVUkkgdXJpLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKKwkJKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLnNldFVSSSh1cmkpOworCQlzZXRJbnB1dFdpdGhOb3RpZnkoZWRpdG9ySW5wdXQpOworCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOworCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9CisJCQlnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSAhPSBudWxsID8KKwkJCQlnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5nZXRQcm9ncmVzc01vbml0b3IoKSA6CisJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKKwkJZG9TYXZlKHByb2dyZXNzTW9uaXRvcik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgeworCQl0cnkgeworCQkJaWYgKG1hcmtlci5nZXRUeXBlKCkuZXF1YWxzKEVWYWxpZGF0b3IuTUFSS0VSKSkgeworCQkJCVN0cmluZyB1cmlBdHRyaWJ1dGUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKEVWYWxpZGF0b3IuVVJJX0FUVFJJQlVURSwgbnVsbCk7CisJCQkJaWYgKHVyaUF0dHJpYnV0ZSAhPSBudWxsKSB7CisJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaUF0dHJpYnV0ZSk7CisJCQkJCUVPYmplY3QgZU9iamVjdCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7CisJCQkJCWlmIChlT2JqZWN0ICE9IG51bGwpIHsKKwkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9ucy5zaW5nbGV0b24oZWRpdGluZ0RvbWFpbi5nZXRXcmFwcGVyKGVPYmplY3QpKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQlEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgc3RhcnR1cC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgeworCQlzZXRTaXRlKHNpdGUpOworCQlzZXRJbnB1dFdpdGhOb3RpZnkoZWRpdG9ySW5wdXQpOworCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOworCQlzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKHRoaXMpOworCQlzaXRlLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgeworCQlnZXRDb250cm9sKGdldEFjdGl2ZVBhZ2UoKSkuc2V0Rm9jdXMoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHJldHVybiB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKKwkJcmV0dXJuIGVkaXRvclNlbGVjdGlvbjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byBzZXQgdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4KKwkgKiBDYWxsaW5nIHRoaXMgcmVzdWx0IHdpbGwgbm90aWZ5IHRoZSBsaXN0ZW5lcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWVkaXRvclNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKworCQlmb3IgKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgOiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzKSB7CisJCQlsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7CisJCX0KKwkJc2V0U3RhdHVzTGluZU1hbmFnZXIoc2VsZWN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXNMaW5lTWFuYWdlcihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBjdXJyZW50Vmlld2VyICE9IG51bGwgJiYgY3VycmVudFZpZXdlciA9PSBjb250ZW50T3V0bGluZVZpZXdlciA/CisJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyIDogZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7CisKKwkJaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJCUNvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS50b0xpc3QoKTsKKwkJCQlzd2l0Y2ggKGNvbGxlY3Rpb24uc2l6ZSgpKSB7CisJCQkJCWNhc2UgMDogeworCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9Ob09iamVjdFNlbGVjdGVkIikpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIDE6IHsKKwkJCQkJCVN0cmluZyB0ZXh0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcihhZGFwdGVyRmFjdG9yeSkuZ2V0VGV4dChjb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQiLCB0ZXh0KSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWRlZmF1bHQ6IHsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTXVsdGlPYmplY3RTZWxlY3RlZCIsIEludGVnZXIudG9TdHJpbmcoY29sbGVjdGlvbi5zaXplKCkpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZSgiIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gdGhlIHBsdWdpbidzIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7CisJCXJldHVybiBEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSk7CisJfQorCisJLyoqCisJICogVGhpcyBsb29rcyB1cCBhIHN0cmluZyBpbiBwbHVnaW4ucHJvcGVydGllcywgbWFraW5nIGEgc3Vic3RpdHV0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxKSB7CisJCXJldHVybiBEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSwgbmV3IE9iamVjdCBbXSB7IHMxIH0pOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXJ9IHRvIGhlbHAgZmlsbCB0aGUgY29udGV4dCBtZW51cyB3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgRWRpdCBtZW51LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJKChJTWVudUxpc3RlbmVyKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpKS5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7CisJCXJldHVybiAoRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgeworCQlyZXR1cm4gZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3Rpb25CYXJzKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKKworCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworCisJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKKworCQlpZiAoZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSB0aGlzKSB7CisJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihudWxsKTsKKwkJfQorCisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBvdXRsaW5lIHZpZXcgc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93T3V0bGluZVZpZXcoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Byb3ZpZGVyL0RlZmluaXRpb25zRWRpdFBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9wcm92aWRlci9EZWZpbml0aW9uc0VkaXRQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTkzZDdiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9wcm92aWRlci9EZWZpbml0aW9uc0VkaXRQbHVnaW4uamF2YQpAQCAtMCwwICsxLDEwNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5FY2xpcHNlVUlQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgRGVmaW5pdGlvbnMgZWRpdG9yIHBsdWdpbi4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERlZmluaXRpb25zRWRpdFBsdWdpbiBleHRlbmRzIEVNRlBsdWdpbiB7CisJLyoqCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVmaW5pdGlvbnNFZGl0UGx1Z2luIElOU1RBTkNFID0gbmV3IERlZmluaXRpb25zRWRpdFBsdWdpbigpOworCQorCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEZWZpbml0aW9uc0VkaXRQbHVnaW4oKSB7CisJCXN1cGVyCisJCQkobmV3IFJlc291cmNlTG9jYXRvciBbXSB7CisJCQkJQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCQkJRWNvcmVFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkJfSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlBsdWdpbjwvYj4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbiBleHRlbmRzIEVjbGlwc2VVSVBsdWdpbiB7CisJCS8qKgorCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgeworCQkJc3VwZXIoKTsKKwkKKwkJCS8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuCisJCQkvLworCQkJcGx1Z2luID0gdGhpczsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9wcm92aWRlci9FZGdlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Byb3ZpZGVyL0VkZ2VzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWE0YTJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9wcm92aWRlci9FZGdlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzNTIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMudXRpbC5FZGdlc0FkYXB0ZXJGYWN0b3J5OworCisvKioKKyAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4KKyAqIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LgorICogVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4KKyAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEVkZ2VzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBFZGdlc0FkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieSB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248T2JqZWN0PiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGdlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgeworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2V9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWlncmF0aW9uRWRnZUl0ZW1Qcm92aWRlciBtaWdyYXRpb25FZGdlSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlncmF0aW9uRWRnZUFkYXB0ZXIoKSB7CisJCWlmIChtaWdyYXRpb25FZGdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCW1pZ3JhdGlvbkVkZ2VJdGVtUHJvdmlkZXIgPSBuZXcgTWlncmF0aW9uRWRnZUl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBtaWdyYXRpb25FZGdlSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlTGFiZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWlncmF0aW9uRWRnZUxhYmVsSXRlbVByb3ZpZGVyIG1pZ3JhdGlvbkVkZ2VMYWJlbEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2VMYWJlbH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlncmF0aW9uRWRnZUxhYmVsQWRhcHRlcigpIHsKKwkJaWYgKG1pZ3JhdGlvbkVkZ2VMYWJlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQltaWdyYXRpb25FZGdlTGFiZWxJdGVtUHJvdmlkZXIgPSBuZXcgTWlncmF0aW9uRWRnZUxhYmVsSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIG1pZ3JhdGlvbkVkZ2VMYWJlbEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZUxhYmVsVmFsdWV9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWlncmF0aW9uRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgbWlncmF0aW9uRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlTGFiZWxWYWx1ZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlncmF0aW9uRWRnZUxhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlpZiAobWlncmF0aW9uRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJbWlncmF0aW9uRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgPSBuZXcgTWlncmF0aW9uRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gbWlncmF0aW9uRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1peGluZ0VkZ2V9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWl4aW5nRWRnZUl0ZW1Qcm92aWRlciBtaXhpbmdFZGdlSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWl4aW5nRWRnZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTWl4aW5nRWRnZUFkYXB0ZXIoKSB7CisJCWlmIChtaXhpbmdFZGdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCW1peGluZ0VkZ2VJdGVtUHJvdmlkZXIgPSBuZXcgTWl4aW5nRWRnZUl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBtaXhpbmdFZGdlSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaXhpbmdFZGdlTGFiZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWl4aW5nRWRnZUxhYmVsSXRlbVByb3ZpZGVyIG1peGluZ0VkZ2VMYWJlbEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1peGluZ0VkZ2VMYWJlbH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTWl4aW5nRWRnZUxhYmVsQWRhcHRlcigpIHsKKwkJaWYgKG1peGluZ0VkZ2VMYWJlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQltaXhpbmdFZGdlTGFiZWxJdGVtUHJvdmlkZXIgPSBuZXcgTWl4aW5nRWRnZUxhYmVsSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIG1peGluZ0VkZ2VMYWJlbEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWl4aW5nRWRnZUxhYmVsVmFsdWV9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWl4aW5nRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgbWl4aW5nRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaXhpbmdFZGdlTGFiZWxWYWx1ZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTWl4aW5nRWRnZUxhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlpZiAobWl4aW5nRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJbWl4aW5nRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgPSBuZXcgTWl4aW5nRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gbWl4aW5nRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLlBvcHVsYXRpb25FZGdlfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBvcHVsYXRpb25FZGdlSXRlbVByb3ZpZGVyIHBvcHVsYXRpb25FZGdlSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuUG9wdWxhdGlvbkVkZ2V9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcHVsYXRpb25FZGdlQWRhcHRlcigpIHsKKwkJaWYgKHBvcHVsYXRpb25FZGdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXBvcHVsYXRpb25FZGdlSXRlbVByb3ZpZGVyID0gbmV3IFBvcHVsYXRpb25FZGdlSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHBvcHVsYXRpb25FZGdlSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7CisJCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKKwkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKKwkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKKwkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzczw/PikgfHwgKCgoQ2xhc3M8Pz4pdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKKwkJCQlyZXR1cm4gYWRhcHRlcjsKKwkJCX0KKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKKwkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfSBhbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCisJCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7CisJCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LiAKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlpZiAobWlncmF0aW9uRWRnZUl0ZW1Qcm92aWRlciAhPSBudWxsKSBtaWdyYXRpb25FZGdlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKG1pZ3JhdGlvbkVkZ2VMYWJlbEl0ZW1Qcm92aWRlciAhPSBudWxsKSBtaWdyYXRpb25FZGdlTGFiZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAobWlncmF0aW9uRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgbWlncmF0aW9uRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAobWl4aW5nRWRnZUl0ZW1Qcm92aWRlciAhPSBudWxsKSBtaXhpbmdFZGdlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKG1peGluZ0VkZ2VMYWJlbEl0ZW1Qcm92aWRlciAhPSBudWxsKSBtaXhpbmdFZGdlTGFiZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAobWl4aW5nRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgbWl4aW5nRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAocG9wdWxhdGlvbkVkZ2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkgcG9wdWxhdGlvbkVkZ2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9wcm92aWRlci9NaWdyYXRpb25FZGdlSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Byb3ZpZGVyL01pZ3JhdGlvbkVkZ2VJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGNlM2MxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9wcm92aWRlci9NaWdyYXRpb25FZGdlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuRWRnZUl0ZW1Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2V9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE1pZ3JhdGlvbkVkZ2VJdGVtUHJvdmlkZXIKKwlleHRlbmRzIFBvcHVsYXRpb25FZGdlSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNaWdyYXRpb25FZGdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlVUkkgbGFiZWxWYWx1ZSA9ICgoTWlncmF0aW9uRWRnZSlvYmplY3QpLmdldFVSSSgpOworCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX01pZ3JhdGlvbkVkZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfTWlncmF0aW9uRWRnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Byb3ZpZGVyL01pZ3JhdGlvbkVkZ2VMYWJlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9wcm92aWRlci9NaWdyYXRpb25FZGdlTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzQzZmZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9wcm92aWRlci9NaWdyYXRpb25FZGdlTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuRWRnZUxhYmVsSXRlbVByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5FZGdlc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlTGFiZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNGYWN0b3J5OworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlTGFiZWx9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE1pZ3JhdGlvbkVkZ2VMYWJlbEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgRWRnZUxhYmVsSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNaWdyYXRpb25FZGdlTGFiZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChNaWdyYXRpb25FZGdlTGFiZWwpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9NaWdyYXRpb25FZGdlTGFiZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfTWlncmF0aW9uRWRnZUxhYmVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIERlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvcHJvdmlkZXIvTWlncmF0aW9uRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvcHJvdmlkZXIvTWlncmF0aW9uRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2E5MTc3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9wcm92aWRlci9NaWdyYXRpb25FZGdlTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZUxhYmVsVmFsdWU7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTWlncmF0aW9uRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkTWlncmF0aW9uUmF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWlncmF0aW9uIFJhdGUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRNaWdyYXRpb25SYXRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTWlncmF0aW9uRWRnZUxhYmVsVmFsdWVfbWlncmF0aW9uUmF0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NaWdyYXRpb25FZGdlTGFiZWxWYWx1ZV9taWdyYXRpb25SYXRlX2ZlYXR1cmUiLCAiX1VJX01pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgRWRnZXNQYWNrYWdlLkxpdGVyYWxzLk1JR1JBVElPTl9FREdFX0xBQkVMX1ZBTFVFX19NSUdSQVRJT05fUkFURSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCU1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlIG1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlID0gKE1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlKW9iamVjdDsKKwkJcmV0dXJuIGdldFN0cmluZygiX1VJX01pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlX3R5cGUiKSArICIgIiArIG1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlLmdldE1pZ3JhdGlvblJhdGUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUuY2xhc3MpKSB7CisJCQljYXNlIEVkZ2VzUGFja2FnZS5NSUdSQVRJT05fRURHRV9MQUJFTF9WQUxVRV9fTUlHUkFUSU9OX1JBVEU6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIERlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvcHJvdmlkZXIvTWl4aW5nRWRnZUl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9wcm92aWRlci9NaXhpbmdFZGdlSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY2ZDQ2NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvcHJvdmlkZXIvTWl4aW5nRWRnZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlci5FZGdlSXRlbVByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5FZGdlc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaXhpbmdFZGdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWl4aW5nRWRnZX0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTWl4aW5nRWRnZUl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgUG9wdWxhdGlvbkVkZ2VJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1peGluZ0VkZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChNaXhpbmdFZGdlKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfTWl4aW5nRWRnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9NaXhpbmdFZGdlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvcHJvdmlkZXIvTWl4aW5nRWRnZUxhYmVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Byb3ZpZGVyL01peGluZ0VkZ2VMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMzZhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Byb3ZpZGVyL01peGluZ0VkZ2VMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlci5FZGdlTGFiZWxJdGVtUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLkVkZ2VzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1peGluZ0VkZ2VMYWJlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1peGluZ0VkZ2VMYWJlbH0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTWl4aW5nRWRnZUxhYmVsSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBFZGdlTGFiZWxJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1peGluZ0VkZ2VMYWJlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKE1peGluZ0VkZ2VMYWJlbClvYmplY3QpLmdldFVSSSgpOworCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX01peGluZ0VkZ2VMYWJlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9NaXhpbmdFZGdlTGFiZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9wcm92aWRlci9NaXhpbmdFZGdlTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9wcm92aWRlci9NaXhpbmdFZGdlTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Y2RlYTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Byb3ZpZGVyL01peGluZ0VkZ2VMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWl4aW5nRWRnZUxhYmVsVmFsdWU7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1peGluZ0VkZ2VMYWJlbFZhbHVlfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNaXhpbmdFZGdlTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTWl4aW5nRWRnZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkTWl4aW5nUmF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWl4aW5nIFJhdGUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRNaXhpbmdSYXRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTWl4aW5nRWRnZUxhYmVsVmFsdWVfbWl4aW5nUmF0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NaXhpbmdFZGdlTGFiZWxWYWx1ZV9taXhpbmdSYXRlX2ZlYXR1cmUiLCAiX1VJX01peGluZ0VkZ2VMYWJlbFZhbHVlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgRWRnZXNQYWNrYWdlLkxpdGVyYWxzLk1JWElOR19FREdFX0xBQkVMX1ZBTFVFX19NSVhJTkdfUkFURSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCU1peGluZ0VkZ2VMYWJlbFZhbHVlIG1peGluZ0VkZ2VMYWJlbFZhbHVlID0gKE1peGluZ0VkZ2VMYWJlbFZhbHVlKW9iamVjdDsKKwkJcmV0dXJuIGdldFN0cmluZygiX1VJX01peGluZ0VkZ2VMYWJlbFZhbHVlX3R5cGUiKSArICIgIiArIG1peGluZ0VkZ2VMYWJlbFZhbHVlLmdldE1peGluZ1JhdGUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWl4aW5nRWRnZUxhYmVsVmFsdWUuY2xhc3MpKSB7CisJCQljYXNlIEVkZ2VzUGFja2FnZS5NSVhJTkdfRURHRV9MQUJFTF9WQUxVRV9fTUlYSU5HX1JBVEU6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIERlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvcHJvdmlkZXIvUG9wdWxhdGlvbkVkZ2VJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvcHJvdmlkZXIvUG9wdWxhdGlvbkVkZ2VJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGJkNDNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy9wcm92aWRlci9Qb3B1bGF0aW9uRWRnZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTk5IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcm92aWRlcjsKKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLkVkZ2VJdGVtUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLkVkZ2VzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLkVkZ2VzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLlBvcHVsYXRpb25FZGdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuUG9wdWxhdGlvbkVkZ2V9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBvcHVsYXRpb25FZGdlSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBFZGdlSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQb3B1bGF0aW9uRWRnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRQb3B1bGF0aW9uSWRlbnRpZmllclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUG9wdWxhdGlvbiBJZGVudGlmaWVyIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkUG9wdWxhdGlvbklkZW50aWZpZXJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qb3B1bGF0aW9uRWRnZV9wb3B1bGF0aW9uSWRlbnRpZmllcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3B1bGF0aW9uRWRnZV9wb3B1bGF0aW9uSWRlbnRpZmllcl9mZWF0dXJlIiwgIl9VSV9Qb3B1bGF0aW9uRWRnZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIEVkZ2VzUGFja2FnZS5MaXRlcmFscy5QT1BVTEFUSU9OX0VER0VfX1BPUFVMQVRJT05fSURFTlRJRklFUiwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgUG9wdWxhdGlvbkVkZ2UuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUG9wdWxhdGlvbkVkZ2UiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChQb3B1bGF0aW9uRWRnZSlvYmplY3QpLmdldFVSSSgpOworCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1BvcHVsYXRpb25FZGdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX1BvcHVsYXRpb25FZGdlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQb3B1bGF0aW9uRWRnZS5jbGFzcykpIHsKKwkJCWNhc2UgRWRnZXNQYWNrYWdlLlBPUFVMQVRJT05fRURHRV9fUE9QVUxBVElPTl9JREVOVElGSUVSOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuRURHRV9fTEFCRUwsCisJCQkJIEVkZ2VzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWlncmF0aW9uRWRnZUxhYmVsKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKEdyYXBoUGFja2FnZS5MaXRlcmFscy5FREdFX19MQUJFTCwKKwkJCQkgRWRnZXNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNaXhpbmdFZGdlTGFiZWwoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoR3JhcGhQYWNrYWdlLkxpdGVyYWxzLkVER0VfX0xBQkVMLAorCQkJCSBMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCgpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuRURHRV9fTEFCRUwsCisJCQkJIExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCgpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuRURHRV9fTEFCRUwsCisJCQkJIExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKEdyYXBoUGFja2FnZS5MaXRlcmFscy5FREdFX19MQUJFTCwKKwkJCQkgTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKCkpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIERlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvdXRpbC9FZGdlc0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3V0aWwvRWRnZXNBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMzI0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3V0aWwvRWRnZXNBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzkwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy4qOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5FZGdlc1BhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEVkZ2VzQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIEVkZ2VzUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkZ2VzQWRhcHRlckZhY3RvcnkoKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gRWRnZXNQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7CisJCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRWRnZXNTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgRWRnZXNTd2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNaWdyYXRpb25FZGdlKE1pZ3JhdGlvbkVkZ2Ugb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZU1pZ3JhdGlvbkVkZ2VBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNaWdyYXRpb25FZGdlTGFiZWwoTWlncmF0aW9uRWRnZUxhYmVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVNaWdyYXRpb25FZGdlTGFiZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZShNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTWlncmF0aW9uRWRnZUxhYmVsVmFsdWVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNaXhpbmdFZGdlKE1peGluZ0VkZ2Ugb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZU1peGluZ0VkZ2VBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNaXhpbmdFZGdlTGFiZWwoTWl4aW5nRWRnZUxhYmVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVNaXhpbmdFZGdlTGFiZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNaXhpbmdFZGdlTGFiZWxWYWx1ZShNaXhpbmdFZGdlTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTWl4aW5nRWRnZUxhYmVsVmFsdWVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQb3B1bGF0aW9uRWRnZShQb3B1bGF0aW9uRWRnZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUG9wdWxhdGlvbkVkZ2VBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyA8VD4gQWRhcHRlciBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTW9kaWZpYWJsZShNb2RpZmlhYmxlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVNb2RpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRWRnZShFZGdlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFZGdlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTGFiZWwoTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRWRnZUxhYmVsKEVkZ2VMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRWRnZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU2FuaXR5Q2hlY2tlcihTYW5pdHlDaGVja2VyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTYW5pdHlDaGVja2VyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTGFiZWxWYWx1ZShMYWJlbFZhbHVlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVMYWJlbFZhbHVlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworCQkJfQorCQl9OworCisJLyoqCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZSA8ZW0+TWlncmF0aW9uIEVkZ2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pZ3JhdGlvbkVkZ2VBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZUxhYmVsIDxlbT5NaWdyYXRpb24gRWRnZSBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2VMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaWdyYXRpb25FZGdlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUgPGVtPk1pZ3JhdGlvbiBFZGdlIExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlncmF0aW9uRWRnZUxhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWl4aW5nRWRnZSA8ZW0+TWl4aW5nIEVkZ2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaXhpbmdFZGdlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1peGluZ0VkZ2VBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWl4aW5nRWRnZUxhYmVsIDxlbT5NaXhpbmcgRWRnZSBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1peGluZ0VkZ2VMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaXhpbmdFZGdlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWl4aW5nRWRnZUxhYmVsVmFsdWUgPGVtPk1peGluZyBFZGdlIExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWl4aW5nRWRnZUxhYmVsVmFsdWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTWl4aW5nRWRnZUxhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuUG9wdWxhdGlvbkVkZ2UgPGVtPlBvcHVsYXRpb24gRWRnZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLlBvcHVsYXRpb25FZGdlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcHVsYXRpb25FZGdlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLmxhbmcuQ29tcGFyYWJsZSA8ZW0+Q29tcGFyYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUgPGVtPk1vZGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kaWZpYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2UgPGVtPkVkZ2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2UKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRWRnZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsIDxlbT5MYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlTGFiZWwgPGVtPkVkZ2UgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFZGdlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlciA8ZW0+U2FuaXR5IENoZWNrZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNhbml0eUNoZWNrZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlIDxlbT5MYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVMYWJlbFZhbHVlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL0VkZ2VzQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvdXRpbC9FZGdlc1N3aXRjaC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy91dGlsL0VkZ2VzU3dpdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0ODlkZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvdXRpbC9FZGdlc1N3aXRjaC5qYXZhCkBAIC0wLDAgKzEsNDE2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuKjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KKyAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KKyAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKKyAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0CisgKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5CisgKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKKyAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLkVkZ2VzUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRWRnZXNTd2l0Y2g8VDE+IHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIEVkZ2VzUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkZ2VzU3dpdGNoKCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IEVkZ2VzUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOworCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQxIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOworCQl9CisJCWVsc2UgeworCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7CisJCQlyZXR1cm4KKwkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPworCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6CisJCQkJCWRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUMSBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKKwkJCWNhc2UgRWRnZXNQYWNrYWdlLk1JR1JBVElPTl9FREdFOiB7CisJCQkJTWlncmF0aW9uRWRnZSBtaWdyYXRpb25FZGdlID0gKE1pZ3JhdGlvbkVkZ2UpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlTWlncmF0aW9uRWRnZShtaWdyYXRpb25FZGdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQb3B1bGF0aW9uRWRnZShtaWdyYXRpb25FZGdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFZGdlKG1pZ3JhdGlvbkVkZ2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShtaWdyYXRpb25FZGdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKG1pZ3JhdGlvbkVkZ2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUobWlncmF0aW9uRWRnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBFZGdlc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfTEFCRUw6IHsKKwkJCQlNaWdyYXRpb25FZGdlTGFiZWwgbWlncmF0aW9uRWRnZUxhYmVsID0gKE1pZ3JhdGlvbkVkZ2VMYWJlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VNaWdyYXRpb25FZGdlTGFiZWwobWlncmF0aW9uRWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFZGdlTGFiZWwobWlncmF0aW9uRWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbChtaWdyYXRpb25FZGdlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShtaWdyYXRpb25FZGdlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUobWlncmF0aW9uRWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEVkZ2VzUGFja2FnZS5NSUdSQVRJT05fRURHRV9MQUJFTF9WQUxVRTogeworCQkJCU1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlIG1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlID0gKE1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZU1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlKG1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbFZhbHVlKG1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTYW5pdHlDaGVja2VyKG1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEVkZ2VzUGFja2FnZS5NSVhJTkdfRURHRTogeworCQkJCU1peGluZ0VkZ2UgbWl4aW5nRWRnZSA9IChNaXhpbmdFZGdlKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZU1peGluZ0VkZ2UobWl4aW5nRWRnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUG9wdWxhdGlvbkVkZ2UobWl4aW5nRWRnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWRnZShtaXhpbmdFZGdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUobWl4aW5nRWRnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kaWZpYWJsZShtaXhpbmdFZGdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKG1peGluZ0VkZ2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgRWRnZXNQYWNrYWdlLk1JWElOR19FREdFX0xBQkVMOiB7CisJCQkJTWl4aW5nRWRnZUxhYmVsIG1peGluZ0VkZ2VMYWJlbCA9IChNaXhpbmdFZGdlTGFiZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlTWl4aW5nRWRnZUxhYmVsKG1peGluZ0VkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWRnZUxhYmVsKG1peGluZ0VkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGFiZWwobWl4aW5nRWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUobWl4aW5nRWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKG1peGluZ0VkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBFZGdlc1BhY2thZ2UuTUlYSU5HX0VER0VfTEFCRUxfVkFMVUU6IHsKKwkJCQlNaXhpbmdFZGdlTGFiZWxWYWx1ZSBtaXhpbmdFZGdlTGFiZWxWYWx1ZSA9IChNaXhpbmdFZGdlTGFiZWxWYWx1ZSl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VNaXhpbmdFZGdlTGFiZWxWYWx1ZShtaXhpbmdFZGdlTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGFiZWxWYWx1ZShtaXhpbmdFZGdlTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcihtaXhpbmdFZGdlTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBFZGdlc1BhY2thZ2UuUE9QVUxBVElPTl9FREdFOiB7CisJCQkJUG9wdWxhdGlvbkVkZ2UgcG9wdWxhdGlvbkVkZ2UgPSAoUG9wdWxhdGlvbkVkZ2UpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlUG9wdWxhdGlvbkVkZ2UocG9wdWxhdGlvbkVkZ2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVkZ2UocG9wdWxhdGlvbkVkZ2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShwb3B1bGF0aW9uRWRnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kaWZpYWJsZShwb3B1bGF0aW9uRWRnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShwb3B1bGF0aW9uRWRnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWlncmF0aW9uIEVkZ2U8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NaWdyYXRpb24gRWRnZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VNaWdyYXRpb25FZGdlKE1pZ3JhdGlvbkVkZ2Ugb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pZ3JhdGlvbiBFZGdlIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWlncmF0aW9uIEVkZ2UgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTWlncmF0aW9uRWRnZUxhYmVsKE1pZ3JhdGlvbkVkZ2VMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWlncmF0aW9uIEVkZ2UgTGFiZWwgVmFsdWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NaWdyYXRpb24gRWRnZSBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZShNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWl4aW5nIEVkZ2U8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NaXhpbmcgRWRnZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VNaXhpbmdFZGdlKE1peGluZ0VkZ2Ugb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1peGluZyBFZGdlIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWl4aW5nIEVkZ2UgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTWl4aW5nRWRnZUxhYmVsKE1peGluZ0VkZ2VMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWl4aW5nIEVkZ2UgTGFiZWwgVmFsdWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NaXhpbmcgRWRnZSBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VNaXhpbmdFZGdlTGFiZWxWYWx1ZShNaXhpbmdFZGdlTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9wdWxhdGlvbiBFZGdlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9wdWxhdGlvbiBFZGdlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVBvcHVsYXRpb25FZGdlKFBvcHVsYXRpb25FZGdlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIDxUPiBUMSBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kaWZpYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZGlmaWFibGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTW9kaWZpYWJsZShNb2RpZmlhYmxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FZGdlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWRnZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VFZGdlKEVkZ2Ugb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTGFiZWwoTGFiZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVkZ2UgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FZGdlIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUVkZ2VMYWJlbChFZGdlTGFiZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNhbml0eSBDaGVja2VyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2FuaXR5IENoZWNrZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlU2FuaXR5Q2hlY2tlcihTYW5pdHlDaGVja2VyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUxhYmVsVmFsdWUoTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9IC8vRWRnZXNTd2l0Y2gKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL0FyZWFMYWJlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvQXJlYUxhYmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkM2UwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL0FyZWFMYWJlbC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8vIEFyZWFMYWJlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY05vZGVMYWJlbDsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgY2xhc3MgaW4gYW4gRU1GIG1vZGVsIGZvciBBcmVhTGFiZWwuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIEFyZWFMYWJlbCBleHRlbmRzIFN0YXRpY05vZGVMYWJlbCB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzZWdtZW50IG9mIHRoZSB0eXBlIFVSSSB0aGF0IHByZWZpeGVzIGFsbCBvdGhlciBzZWdtZW50cyBpbiBhCisJICogYXJlYSBsYWJlbCB0eXBlIFVSSS4KKwkgKi8KKwlTdHJpbmcgVVJJX1RZUEVfQVJFQV9MQUJFTF9TRUdNRU5UID0gVVJJX1RZUEVfTEFCRUxfU0VHTUVOVCArICIvYXJlYSI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB0eXBlIFVSSSBmb3IgYXJlYSBsYWJlbHMKKwkgKi8KKwlVUkkgVVJJX1RZUEVfQVJFQV9MQUJFTCA9IFNURU1VUkkKKwkJCS5jcmVhdGVUeXBlVVJJKFVSSV9UWVBFX0FSRUFfTEFCRUxfU0VHTUVOVCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGFyZWEgdmFsdWUKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICogICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKKwkgKi8KKwlBcmVhTGFiZWxWYWx1ZSBnZXRDdXJyZW50QXJlYVZhbHVlKCk7CisKK30gLy8gQXJlYUxhYmVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9BcmVhTGFiZWxWYWx1ZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvQXJlYUxhYmVsVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDllYmU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvQXJlYUxhYmVsVmFsdWUuamF2YQpAQCAtMCwwICsxLDU5IEBACisvLyBBcmVhTGFiZWxWYWx1ZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBjbGFzcyBpbiBhbiBFTUYgbW9kZWwgZm9yIGEgQXJlYSBMYWJlbCBWYWx1ZS4KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQXJlYUxhYmVsVmFsdWUgZXh0ZW5kcyBMYWJlbFZhbHVlIHsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGFyZWEgaW4gc3F1YXJlIEtpbG9tZXRlcnMKKwkgKiBAbW9kZWwKKwkgKi8KKwlkb3VibGUgZ2V0QXJlYSgpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGFyZWEgaW4gc3F1YXJlIEtpbG9tZXRlcnMKKwkgKiBAbW9kZWwKKwkgKi8KKwlkb3VibGUgZ2V0QXZlcmFnZUV4dGVudCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsVmFsdWUjZ2V0QXZlcmFnZUV4dGVudCA8ZW0+QXZlcmFnZSBFeHRlbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoZSBBdmVyYWdlIEV4dGVudCBpcyBqdXN0IHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgYXJlYS4KKwkgKiBJdCBpcyBuZWNlc3NhcnkgdG8gcmV0YWluIHRoaXMgdmFsdWUgYXMgaXQgaXMgcXVpdGUgZXhwZW5zZWl2ZSB0byBjb21tdXRlLgorCSAqIEF2ZXJhZ2UgZXh0ZW50IGNhbiBiZSBjb21wYXJlZCwgZm9yIGV4YW1wbGUsIHRvIGFuIGF2ZXJhZ2UgY29tbXV0ZSBkaXN0YW5jZS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmVyYWdlIEV4dGVudDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0QXZlcmFnZUV4dGVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QXZlcmFnZUV4dGVudChkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsVmFsdWUjZ2V0QXJlYSA8ZW0+QXJlYTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXJlYTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0QXJlYSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QXJlYShkb3VibGUgdmFsdWUpOworCit9IC8vIEFyZWFMYWJlbFZhbHVlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2E0ZjFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWwuamF2YQpAQCAtMCwwICsxLDMxIEBACisvLyBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBhbiBFTUYgZGVmaW5pdGlvbiBvZiBhIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIGxhYmVsIGZvciBhbgorICogRWRnZSB0aGF0IHJlcHJlc2VudHMgYSB0aGUgcmVsYXRpb25zaGlwIG9mIHR3byBub2RlcyBzaGFyaW5nIGEgY29tbW9uIGJvcmRlcgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCBleHRlbmRzCisJCVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VnbWVudCBvZiB0aGUgdHlwZSBVUkkgdGhhdCBwcmVmaXhlcyBhbGwgb3RoZXIgc2VnbWVudHMgaW4gYQorCSAqIHJlbGF0aXZlIHBoeXNpY2FsIHJlbGF0aW9uc2hpcCBsYWJlbCB0eXBlIFVSSS4KKwkgKi8KKwlTdHJpbmcgVVJJX1RZUEVfQ09NTU9OX0JPUkRFUl9SRUxBVElPTlNISVBfTEFCRUxfU0VHTUVOVCA9IFVSSV9UWVBFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9TRUdNRU5UCisJCQkrICIvYm9yZGVyIjsKKworfSAvLyBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNmU1MzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLy8gQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgY2xhc3MgaW4gYW4gRU1GIG1vZGVsIGZvciBhIENvbW1vbiBib3JkZXIKKyAqIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZS4KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSBleHRlbmRzCisJCVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZXsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgY29tbW9uIGJvcmRlciBpbiBraWxvbWV0ZXJzCisJICogQG1vZGVsCisJICovCisJZG91YmxlIGdldEJvcmRlckxlbmd0aCgpOworCQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUjZ2V0Qm9yZGVyTGVuZ3RoIDxlbT5Cb3JkZXIgTGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Cb3JkZXIgTGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRCb3JkZXJMZW5ndGgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEJvcmRlckxlbmd0aChkb3VibGUgdmFsdWUpOworCit9IC8vIENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL0VhcnRoU2NpZW5jZUxhYmVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9FYXJ0aFNjaWVuY2VMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjA4NjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9FYXJ0aFNjaWVuY2VMYWJlbC5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZCQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY05vZGVMYWJlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWFydGggU2NpZW5jZSBMYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5FYXJ0aFNjaWVuY2VMYWJlbCNnZXRDdXJyZW50RWFydGhTY2llbmNlVmFsdWUgPGVtPkN1cnJlbnQgRWFydGggU2NpZW5jZSBWYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZSNnZXRFYXJ0aFNjaWVuY2VMYWJlbCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBFYXJ0aFNjaWVuY2VMYWJlbCBleHRlbmRzIFN0YXRpY05vZGVMYWJlbCB7CisJCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VnbWVudCBvZiB0aGUgdHlwZSBVUkkgdGhhdCBwcmVmaXhlcyBhbGwgb3RoZXIgc2VnbWVudHMgaW4gYQorCSAqIGVhcnRoIHNjaWVuY2UgbGFiZWwgdHlwZSBVUkkuCisJICovCisJU3RyaW5nIFVSSV9UWVBFX0VBUlRIX1NDSUVOQ0VfTEFCRUxfU0VHTUVOVCA9IFVSSV9UWVBFX0xBQkVMX1NFR01FTlQgKyAiL2VhcnRoc2NpZW5jZSI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB0eXBlIFVSSSBmb3IgYXJlYSBsYWJlbHMKKwkgKi8KKwlVUkkgVVJJX1RZUEVfRUFSVEhfU0NJRU5DRV9MQUJFTCA9IFNURU1VUkkKKwkJCS5jcmVhdGVUeXBlVVJJKFVSSV9UWVBFX0VBUlRIX1NDSUVOQ0VfTEFCRUxfU0VHTUVOVCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DdXJyZW50IEVhcnRoIFNjaWVuY2UgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1cnJlbnQgRWFydGggU2NpZW5jZSBWYWx1ZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW50IEVhcnRoIFNjaWVuY2UgVmFsdWU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZSNnZXRFYXJ0aFNjaWVuY2VMYWJlbF9DdXJyZW50RWFydGhTY2llbmNlVmFsdWUoKQorCSAqIEBtb2RlbCByZXNvbHZlUHJveGllcz0iZmFsc2UiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlIGdldEN1cnJlbnRFYXJ0aFNjaWVuY2VWYWx1ZSgpOworCit9IC8vIEVhcnRoU2NpZW5jZUxhYmVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9FYXJ0aFNjaWVuY2VMYWJlbFZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9FYXJ0aFNjaWVuY2VMYWJlbFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkNjhmNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL0VhcnRoU2NpZW5jZUxhYmVsVmFsdWUuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVhcnRoIFNjaWVuY2UgTGFiZWwgVmFsdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWxWYWx1ZSNnZXREYXRhIDxlbT5EYXRhPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5FYXJ0aFNjaWVuY2VMYWJlbFZhbHVlI2dldERhdGFUeXBlIDxlbT5EYXRhIFR5cGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkVhcnRoU2NpZW5jZUxhYmVsVmFsdWUjZ2V0VW5pdHMgPGVtPlVuaXRzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlI2dldEVhcnRoU2NpZW5jZUxhYmVsVmFsdWUoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWFydGhTY2llbmNlTGFiZWxWYWx1ZSBleHRlbmRzIExhYmVsVmFsdWUgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuRG91YmxlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRhdGE8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZSNnZXRFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlX0RhdGEoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxEb3VibGU+IGdldERhdGEoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRhdGEgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRhdGEgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RGF0YVR5cGUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZSNnZXRFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlX0RhdGFUeXBlKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldERhdGFUeXBlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5FYXJ0aFNjaWVuY2VMYWJlbFZhbHVlI2dldERhdGFUeXBlIDxlbT5EYXRhIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRhdGEgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RGF0YVR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERhdGFUeXBlKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vbml0czwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5pdHM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pdHM8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFVuaXRzKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc1BhY2thZ2UjZ2V0RWFydGhTY2llbmNlTGFiZWxWYWx1ZV9Vbml0cygpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRVbml0cygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWxWYWx1ZSNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuaXRzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRVbml0cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VW5pdHMoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9MYWJlbHNGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9MYWJlbHNGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4MGFhYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL0xhYmVsc0ZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVsczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIExhYmVsc0ZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7CisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMYWJlbHNGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuTGFiZWxzRmFjdG9yeUltcGwuaW5pdCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcmVhIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcmVhIExhYmVsPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBcmVhTGFiZWwgY3JlYXRlQXJlYUxhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFyZWEgTGFiZWwgVmFsdWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFyZWEgTGFiZWwgVmFsdWU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUFyZWFMYWJlbFZhbHVlIGNyZWF0ZUFyZWFMYWJlbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbW1vbiBCb3JkZXIgUmVsYXRpb25zaGlwIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db21tb24gQm9yZGVyIFJlbGF0aW9uc2hpcCBMYWJlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWwgY3JlYXRlQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tbW9uIEJvcmRlciBSZWxhdGlvbnNoaXAgTGFiZWwgVmFsdWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbW1vbiBCb3JkZXIgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIGNyZWF0ZUNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9wdWxhdGlvbiBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9wdWxhdGlvbiBMYWJlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUG9wdWxhdGlvbkxhYmVsIGNyZWF0ZVBvcHVsYXRpb25MYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3B1bGF0aW9uIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3B1bGF0aW9uIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQb3B1bGF0aW9uTGFiZWxWYWx1ZSBjcmVhdGVQb3B1bGF0aW9uTGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZWxhdGl2ZSBQaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlbGF0aXZlIFBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsIGNyZWF0ZVJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZWxhdGl2ZSBQaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWwgVmFsdWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlbGF0aXZlIFBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgY3JlYXRlUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwgY3JlYXRlVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSBjcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgY3JlYXRlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvYWQgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9hZCBUcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwgY3JlYXRlUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvYWQgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9hZCBUcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSBjcmVhdGVSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FYXJ0aCBTY2llbmNlIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FYXJ0aCBTY2llbmNlIExhYmVsPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFYXJ0aFNjaWVuY2VMYWJlbCBjcmVhdGVFYXJ0aFNjaWVuY2VMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FYXJ0aCBTY2llbmNlIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FYXJ0aCBTY2llbmNlIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlIGNyZWF0ZUVhcnRoU2NpZW5jZUxhYmVsVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGFiZWxzUGFja2FnZSBnZXRMYWJlbHNQYWNrYWdlKCk7CisKK30gLy9MYWJlbHNGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9MYWJlbHNQYWNrYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9MYWJlbHNQYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhYzQzOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL0xhYmVsc1BhY2thZ2UuamF2YQpAQCAtMCwwICsxLDIyMDYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50CisgKiA8dWw+CisgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorICogPC91bD4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNGYWN0b3J5CisgKiBAbW9kZWwga2luZD0icGFja2FnZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBMYWJlbHNQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgeworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOQU1FID0gImxhYmVscyI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMuZWNvcmUiOworCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMiOworCisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMYWJlbHNQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuTGFiZWxzUGFja2FnZUltcGwuaW5pdCgpOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkFyZWFMYWJlbEltcGwgPGVtPkFyZWEgTGFiZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkFyZWFMYWJlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuTGFiZWxzUGFja2FnZUltcGwjZ2V0QXJlYUxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEFSRUFfTEFCRUwgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFSRUFfTEFCRUxfX1VSSSA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVJFQV9MQUJFTF9fVFlQRV9VUkkgPSBHcmFwaFBhY2thZ2UuU1RBVElDX05PREVfTEFCRUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVJFQV9MQUJFTF9fRFVCTElOX0NPUkUgPSBHcmFwaFBhY2thZ2UuU1RBVElDX05PREVfTEFCRUxfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSSBPZiBJZGVudGlmaWFibGUgVG8gQmUgTGFiZWxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFSRUFfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBUkVBX0xBQkVMX19DVVJSRU5UX1ZBTFVFID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19OT0RFX0xBQkVMX19DVVJSRU5UX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkZW50aWZpYWJsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFSRUFfTEFCRUxfX0lERU5USUZJQUJMRSA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9fSURFTlRJRklBQkxFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBUkVBX0xBQkVMX19OT0RFID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19OT0RFX0xBQkVMX19OT0RFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgQXJlYSBWYWx1ZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFSRUFfTEFCRUxfX0NVUlJFTlRfQVJFQV9WQUxVRSA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcmVhIExhYmVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFSRUFfTEFCRUxfRkVBVFVSRV9DT1VOVCA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5BcmVhTGFiZWxWYWx1ZUltcGwgPGVtPkFyZWEgTGFiZWwgVmFsdWU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkFyZWFMYWJlbFZhbHVlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRBcmVhTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBBUkVBX0xBQkVMX1ZBTFVFID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcmVhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVJFQV9MQUJFTF9WQUxVRV9fQVJFQSA9IEdyYXBoUGFja2FnZS5MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmVyYWdlIEV4dGVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFSRUFfTEFCRUxfVkFMVUVfX0FWRVJBR0VfRVhURU5UID0gR3JhcGhQYWNrYWdlLkxBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFyZWEgTGFiZWwgVmFsdWU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVJFQV9MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UID0gR3JhcGhQYWNrYWdlLkxBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJbXBsIDxlbT5QaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkxhYmVsc1BhY2thZ2VJbXBsI2dldFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMID0gNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfX1VSSSA9IEdyYXBoUGFja2FnZS5TVEFUSUNfRURHRV9MQUJFTF9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX19UWVBFX1VSSSA9IEdyYXBoUGFja2FnZS5TVEFUSUNfRURHRV9MQUJFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfX0RVQkxJTl9DT1JFID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19FREdFX0xBQkVMX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkkgT2YgSWRlbnRpZmlhYmxlIFRvIEJlIExhYmVsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCA9IEdyYXBoUGFja2FnZS5TVEFUSUNfRURHRV9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfX0NVUlJFTlRfVkFMVUUgPSBHcmFwaFBhY2thZ2UuU1RBVElDX0VER0VfTEFCRUxfX0NVUlJFTlRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRlbnRpZmlhYmxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX19JREVOVElGSUFCTEUgPSBHcmFwaFBhY2thZ2UuU1RBVElDX0VER0VfTEFCRUxfX0lERU5USUZJQUJMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FZGdlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9fRURHRSA9IEdyYXBoUGFja2FnZS5TVEFUSUNfRURHRV9MQUJFTF9fRURHRTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX0ZFQVRVUkVfQ09VTlQgPSBHcmFwaFBhY2thZ2UuU1RBVElDX0VER0VfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsSW1wbCA8ZW0+UmVsYXRpdmUgUGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkxhYmVsc1BhY2thZ2VJbXBsI2dldFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBSRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUwgPSA3OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsSW1wbCA8ZW0+Q29tbW9uIEJvcmRlciBSZWxhdGlvbnNoaXAgTGFiZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDT01NT05fQk9SREVSX1JFTEFUSU9OU0hJUF9MQUJFTCA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09NTU9OX0JPUkRFUl9SRUxBVElPTlNISVBfTEFCRUxfX1VSSSA9IFBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09NTU9OX0JPUkRFUl9SRUxBVElPTlNISVBfTEFCRUxfX1RZUEVfVVJJID0gUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTU1PTl9CT1JERVJfUkVMQVRJT05TSElQX0xBQkVMX19EVUJMSU5fQ09SRSA9IFBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09NTU9OX0JPUkRFUl9SRUxBVElPTlNISVBfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCA9IFBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT01NT05fQk9SREVSX1JFTEFUSU9OU0hJUF9MQUJFTF9fQ1VSUkVOVF9WQUxVRSA9IFBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9fQ1VSUkVOVF9WQUxVRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZGVudGlmaWFibGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT01NT05fQk9SREVSX1JFTEFUSU9OU0hJUF9MQUJFTF9fSURFTlRJRklBQkxFID0gUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX19JREVOVElGSUFCTEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWRnZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT01NT05fQk9SREVSX1JFTEFUSU9OU0hJUF9MQUJFTF9fRURHRSA9IFBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9fRURHRTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db21tb24gQm9yZGVyIFJlbGF0aW9uc2hpcCBMYWJlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT01NT05fQk9SREVSX1JFTEFUSU9OU0hJUF9MQUJFTF9GRUFUVVJFX0NPVU5UID0gUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwgPGVtPlBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFID0gMTE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UID0gR3JhcGhQYWNrYWdlLkxBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCA8ZW0+UmVsYXRpdmUgUGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuTGFiZWxzUGFja2FnZUltcGwjZ2V0UmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFID0gODsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCA8ZW0+Q29tbW9uIEJvcmRlciBSZWxhdGlvbnNoaXAgTGFiZWwgVmFsdWU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkxhYmVsc1BhY2thZ2VJbXBsI2dldENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQ09NTU9OX0JPUkRFUl9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUUgPSAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJvcmRlciBMZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT01NT05fQk9SREVSX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fQk9SREVSX0xFTkdUSCA9IFBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db21tb24gQm9yZGVyIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT01NT05fQk9SREVSX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UID0gUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlBvcHVsYXRpb25MYWJlbEltcGwgPGVtPlBvcHVsYXRpb24gTGFiZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlBvcHVsYXRpb25MYWJlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuTGFiZWxzUGFja2FnZUltcGwjZ2V0UG9wdWxhdGlvbkxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBPUFVMQVRJT05fTEFCRUwgPSA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBPUFVMQVRJT05fTEFCRUxfX1VSSSA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUE9QVUxBVElPTl9MQUJFTF9fVFlQRV9VUkkgPSBHcmFwaFBhY2thZ2UuU1RBVElDX05PREVfTEFCRUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUE9QVUxBVElPTl9MQUJFTF9fRFVCTElOX0NPUkUgPSBHcmFwaFBhY2thZ2UuU1RBVElDX05PREVfTEFCRUxfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSSBPZiBJZGVudGlmaWFibGUgVG8gQmUgTGFiZWxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBPUFVMQVRJT05fTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQT1BVTEFUSU9OX0xBQkVMX19DVVJSRU5UX1ZBTFVFID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19OT0RFX0xBQkVMX19DVVJSRU5UX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkZW50aWZpYWJsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBPUFVMQVRJT05fTEFCRUxfX0lERU5USUZJQUJMRSA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9fSURFTlRJRklBQkxFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQT1BVTEFUSU9OX0xBQkVMX19OT0RFID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19OT0RFX0xBQkVMX19OT0RFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBPUFVMQVRJT05fTEFCRUxfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUE9QVUxBVElPTl9MQUJFTF9fTkFNRSA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFBvcHVsYXRpb24gVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQT1BVTEFUSU9OX0xBQkVMX19DVVJSRU5UX1BPUFVMQVRJT05fVkFMVUUgPSBHcmFwaFBhY2thZ2UuU1RBVElDX05PREVfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGVkIEFyZWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQT1BVTEFUSU9OX0xBQkVMX19QT1BVTEFURURfQVJFQSA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBZZWFyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUE9QVUxBVElPTl9MQUJFTF9fVkFMSURfWUVBUiA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qb3B1bGF0aW9uIExhYmVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBPUFVMQVRJT05fTEFCRUxfRkVBVFVSRV9DT1VOVCA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5Qb3B1bGF0aW9uTGFiZWxWYWx1ZUltcGwgPGVtPlBvcHVsYXRpb24gTGFiZWwgVmFsdWU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlBvcHVsYXRpb25MYWJlbFZhbHVlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRQb3B1bGF0aW9uTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBQT1BVTEFUSU9OX0xBQkVMX1ZBTFVFID0gNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3VudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBPUFVMQVRJT05fTEFCRUxfVkFMVUVfX0NPVU5UID0gR3JhcGhQYWNrYWdlLkxBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvcHVsYXRpb24gTGFiZWwgVmFsdWU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUE9QVUxBVElPTl9MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UID0gR3JhcGhQYWNrYWdlLkxBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFTEFUSVZFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9fVVJJID0gUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfX1RZUEVfVVJJID0gUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFTEFUSVZFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9fRFVCTElOX0NPUkUgPSBQSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSSBPZiBJZGVudGlmaWFibGUgVG8gQmUgTGFiZWxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFTEFUSVZFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEID0gUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFTEFUSVZFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9fQ1VSUkVOVF9WQUxVRSA9IFBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9fQ1VSUkVOVF9WQUxVRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZGVudGlmaWFibGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfX0lERU5USUZJQUJMRSA9IFBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9fSURFTlRJRklBQkxFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVkZ2U8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX19FREdFID0gUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX19FREdFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgUmVsYXRpb25zaGlwPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX19DVVJSRU5UX1JFTEFUSU9OU0hJUCA9IFBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZWxhdGl2ZSBQaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX0ZFQVRVUkVfQ09VTlQgPSBQSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRqYWNlbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX0FESkFDRU5UID0gR3JhcGhQYWNrYWdlLkxBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aW9uc2hpcDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFTEFUSVZFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fUkVMQVRJT05TSElQID0gR3JhcGhQYWNrYWdlLkxBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlbGF0aXZlIFBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCA9IEdyYXBoUGFja2FnZS5MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEltcGwgPGVtPlRyYW5zcG9ydCBSZWxhdGlvbnNoaXAgTGFiZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMID0gOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19VUkkgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19FREdFX0xBQkVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19UWVBFX1VSSSA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX0VER0VfTEFCRUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fRFVCTElOX0NPUkUgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19FREdFX0xBQkVMX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkkgT2YgSWRlbnRpZmlhYmxlIFRvIEJlIExhYmVsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19FREdFX0xBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX0NVUlJFTlRfVkFMVUUgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19FREdFX0xBQkVMX19DVVJSRU5UX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkZW50aWZpYWJsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX0lERU5USUZJQUJMRSA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX0VER0VfTEFCRUxfX0lERU5USUZJQUJMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlIFZhbGlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fTkVYVF9WQUxVRV9WQUxJRCA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX0VER0VfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX05FWFRfVkFMVUUgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19FREdFX0xBQkVMX19ORVhUX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlY29yYXRvcjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX0RFQ09SQVRPUiA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX0VER0VfTEFCRUxfX0RFQ09SQVRPUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FZGdlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX0VER0UgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19FREdFX0xBQkVMX19FREdFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zcG9ydCBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fVFJBTlNQT1JUX01PREUgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19FREdFX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX0VER0VfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNwb3J0IElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19UUkFOU1BPUlRfSURFTlRJRklFUiA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX0VER0VfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBUcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fQ1VSUkVOVF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfRURHRV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYXRlIFRpbWUgUGVyaW9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fUkFURV9USU1FX1BFUklPRCA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX0VER0VfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVwYXJ0dXJlIENhcGFjaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fREVQQVJUVVJFX0NBUEFDSVRZID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfRURHRV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXhpbXVtIERlcGFydHVyZSBDYXBhY2l0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX01BWElNVU1fREVQQVJUVVJFX0NBUEFDSVRZID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfRURHRV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXBhY2l0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX0NBUEFDSVRZID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfRURHRV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgNzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXhpbXVtIENhcGFjaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fTUFYSU1VTV9DQVBBQ0lUWSA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX0VER0VfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNpdCBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fVFJBTlNJVF9USU1FID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfRURHRV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydCBVcCBEZWxheTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1NUQVJUX1VQX0RFTEFZID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfRURHRV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMTA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX0ZFQVRVUkVfQ09VTlQgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19FREdFX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAxMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCA8ZW0+VHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuTGFiZWxzUGFja2FnZUltcGwjZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFID0gMTA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIERlcGFydHVyZSBDYXBhY2l0eSBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fQVZBSUxBQkxFX0RFUEFSVFVSRV9DQVBBQ0lUWV9QUk9QT1JUSU9OID0gR3JhcGhQYWNrYWdlLkxBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRyYW5zcG9ydCBSZWxhdGlvbnNoaXAgTGFiZWwgVmFsdWU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UID0gR3JhcGhQYWNrYWdlLkxBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEltcGwgPGVtPlJvYWQgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMID0gMTI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19VUkkgPSBQSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPQURfVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fVFlQRV9VUkkgPSBQSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19EVUJMSU5fQ09SRSA9IFBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQgPSBQSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19DVVJSRU5UX1ZBTFVFID0gUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX19DVVJSRU5UX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkZW50aWZpYWJsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPQURfVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fSURFTlRJRklBQkxFID0gUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX19JREVOVElGSUFCTEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWRnZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0FEX1RSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX0VER0UgPSBQSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfX0VER0U7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9hZCBUcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPQURfVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9GRUFUVVJFX0NPVU5UID0gUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCA8ZW0+Um9hZCBUcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuTGFiZWxzUGFja2FnZUltcGwjZ2V0Um9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFID0gMTM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19ST0FEX05BTUUgPSBQSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPQURfVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fUk9BRF9DTEFTUyA9IFBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdW1iZXIgQ3Jvc3NpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19OVU1CRVJfQ1JPU1NJTkdTID0gUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvYWQgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0FEX1RSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCA9IFBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5FYXJ0aFNjaWVuY2VMYWJlbEltcGwgPGVtPkVhcnRoIFNjaWVuY2UgTGFiZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkVhcnRoU2NpZW5jZUxhYmVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRFYXJ0aFNjaWVuY2VMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBFQVJUSF9TQ0lFTkNFX0xBQkVMID0gMTQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRUFSVEhfU0NJRU5DRV9MQUJFTF9fVVJJID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19OT0RFX0xBQkVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFQVJUSF9TQ0lFTkNFX0xBQkVMX19UWVBFX1VSSSA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFQVJUSF9TQ0lFTkNFX0xBQkVMX19EVUJMSU5fQ09SRSA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRUFSVEhfU0NJRU5DRV9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19OT0RFX0xBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVBUlRIX1NDSUVOQ0VfTEFCRUxfX0NVUlJFTlRfVkFMVUUgPSBHcmFwaFBhY2thZ2UuU1RBVElDX05PREVfTEFCRUxfX0NVUlJFTlRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRlbnRpZmlhYmxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRUFSVEhfU0NJRU5DRV9MQUJFTF9fSURFTlRJRklBQkxFID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19OT0RFX0xBQkVMX19JREVOVElGSUFCTEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVBUlRIX1NDSUVOQ0VfTEFCRUxfX05PREUgPSBHcmFwaFBhY2thZ2UuU1RBVElDX05PREVfTEFCRUxfX05PREU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBFYXJ0aCBTY2llbmNlIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRUFSVEhfU0NJRU5DRV9MQUJFTF9fQ1VSUkVOVF9FQVJUSF9TQ0lFTkNFX1ZBTFVFID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19OT0RFX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVhcnRoIFNjaWVuY2UgTGFiZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRUFSVEhfU0NJRU5DRV9MQUJFTF9GRUFUVVJFX0NPVU5UID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19OT0RFX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkVhcnRoU2NpZW5jZUxhYmVsVmFsdWVJbXBsIDxlbT5FYXJ0aCBTY2llbmNlIExhYmVsIFZhbHVlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5FYXJ0aFNjaWVuY2VMYWJlbFZhbHVlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEVBUlRIX1NDSUVOQ0VfTEFCRUxfVkFMVUUgPSAxNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFQVJUSF9TQ0lFTkNFX0xBQkVMX1ZBTFVFX19EQVRBID0gR3JhcGhQYWNrYWdlLkxBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGEgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVBUlRIX1NDSUVOQ0VfTEFCRUxfVkFMVUVfX0RBVEFfVFlQRSA9IEdyYXBoUGFja2FnZS5MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vbml0czwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVBUlRIX1NDSUVOQ0VfTEFCRUxfVkFMVUVfX1VOSVRTID0gR3JhcGhQYWNrYWdlLkxBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVhcnRoIFNjaWVuY2UgTGFiZWwgVmFsdWU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRUFSVEhfU0NJRU5DRV9MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UID0gR3JhcGhQYWNrYWdlLkxBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwIDxlbT5SZWxhdGl2ZSBQaHlzaWNhbCBSZWxhdGlvbnNoaXA8L2VtPn0nIGVudW0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuTGFiZWxzUGFja2FnZUltcGwjZ2V0UmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBSRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVAgPSAxNjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0TW9kZSA8ZW0+VHJhbnNwb3J0IE1vZGU8L2VtPn0nIGVudW0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydE1vZGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuTGFiZWxzUGFja2FnZUltcGwjZ2V0VHJhbnNwb3J0TW9kZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUUkFOU1BPUlRfTU9ERSA9IDE3OworCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWwgPGVtPkFyZWEgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXJlYSBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkFyZWFMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0QXJlYUxhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkFyZWFMYWJlbCNnZXRDdXJyZW50QXJlYVZhbHVlIDxlbT5DdXJyZW50IEFyZWEgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5DdXJyZW50IEFyZWEgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWwjZ2V0Q3VycmVudEFyZWFWYWx1ZSgpCisJICogQHNlZSAjZ2V0QXJlYUxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRBcmVhTGFiZWxfQ3VycmVudEFyZWFWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsVmFsdWUgPGVtPkFyZWEgTGFiZWwgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXJlYSBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkFyZWFMYWJlbFZhbHVlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRBcmVhTGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWxWYWx1ZSNnZXRBcmVhIDxlbT5BcmVhPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXJlYTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkFyZWFMYWJlbFZhbHVlI2dldEFyZWEoKQorCSAqIEBzZWUgI2dldEFyZWFMYWJlbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRBcmVhTGFiZWxWYWx1ZV9BcmVhKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkFyZWFMYWJlbFZhbHVlI2dldEF2ZXJhZ2VFeHRlbnQgPGVtPkF2ZXJhZ2UgRXh0ZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXZlcmFnZSBFeHRlbnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWxWYWx1ZSNnZXRBdmVyYWdlRXh0ZW50KCkKKwkgKiBAc2VlICNnZXRBcmVhTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0QXJlYUxhYmVsVmFsdWVfQXZlcmFnZUV4dGVudCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWwgPGVtPkNvbW1vbiBCb3JkZXIgUmVsYXRpb25zaGlwIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbW1vbiBCb3JkZXIgUmVsYXRpb25zaGlwIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIDxlbT5Db21tb24gQm9yZGVyIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db21tb24gQm9yZGVyIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSNnZXRCb3JkZXJMZW5ndGggPGVtPkJvcmRlciBMZW5ndGg8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Cb3JkZXIgTGVuZ3RoPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSNnZXRCb3JkZXJMZW5ndGgoKQorCSAqIEBzZWUgI2dldENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWVfQm9yZGVyTGVuZ3RoKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsIDxlbT5QaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0UGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsIDxlbT5Qb3B1bGF0aW9uIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvcHVsYXRpb24gTGFiZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBvcHVsYXRpb25MYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWwjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIgPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbCNnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpCisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbkxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRQb3B1bGF0aW9uTGFiZWxfUG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsI2dldE5hbWUoKQorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25MYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UG9wdWxhdGlvbkxhYmVsX05hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsI2dldEN1cnJlbnRQb3B1bGF0aW9uVmFsdWUgPGVtPkN1cnJlbnQgUG9wdWxhdGlvbiBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkN1cnJlbnQgUG9wdWxhdGlvbiBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbCNnZXRDdXJyZW50UG9wdWxhdGlvblZhbHVlKCkKKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBvcHVsYXRpb25MYWJlbF9DdXJyZW50UG9wdWxhdGlvblZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbCNnZXRQb3B1bGF0ZWRBcmVhIDxlbT5Qb3B1bGF0ZWQgQXJlYTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvcHVsYXRlZCBBcmVhPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsI2dldFBvcHVsYXRlZEFyZWEoKQorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25MYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UG9wdWxhdGlvbkxhYmVsX1BvcHVsYXRlZEFyZWEoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsI2dldFZhbGlkWWVhciA8ZW0+VmFsaWQgWWVhcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbGlkIFllYXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWwjZ2V0VmFsaWRZZWFyKCkKKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFBvcHVsYXRpb25MYWJlbF9WYWxpZFllYXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbFZhbHVlIDxlbT5Qb3B1bGF0aW9uIExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvcHVsYXRpb24gTGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWxWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0UG9wdWxhdGlvbkxhYmVsVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsVmFsdWUjZ2V0Q291bnQgPGVtPkNvdW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q291bnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWxWYWx1ZSNnZXRDb3VudCgpCisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbkxhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFBvcHVsYXRpb25MYWJlbFZhbHVlX0NvdW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwgPGVtPlJlbGF0aXZlIFBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZWxhdGl2ZSBQaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwjZ2V0Q3VycmVudFJlbGF0aW9uc2hpcCA8ZW0+Q3VycmVudCBSZWxhdGlvbnNoaXA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5DdXJyZW50IFJlbGF0aW9uc2hpcDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCNnZXRDdXJyZW50UmVsYXRpb25zaGlwKCkKKwkgKiBAc2VlICNnZXRSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbF9DdXJyZW50UmVsYXRpb25zaGlwKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSA8ZW0+UmVsYXRpdmUgUGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlbGF0aXZlIFBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSNpc0FkamFjZW50IDxlbT5BZGphY2VudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFkamFjZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUjaXNBZGphY2VudCgpCisJICogQHNlZSAjZ2V0UmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX0FkamFjZW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlI2dldFJlbGF0aW9uc2hpcCA8ZW0+UmVsYXRpb25zaGlwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVsYXRpb25zaGlwPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUjZ2V0UmVsYXRpb25zaGlwKCkKKwkgKiBAc2VlICNnZXRSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVfUmVsYXRpb25zaGlwKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCA8ZW0+VHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsI2dldFRyYW5zcG9ydE1vZGUgPGVtPlRyYW5zcG9ydCBNb2RlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHJhbnNwb3J0IE1vZGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCNnZXRUcmFuc3BvcnRNb2RlKCkKKwkgKiBAc2VlICNnZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfVHJhbnNwb3J0TW9kZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCNnZXRQb3B1bGF0aW9uSWRlbnRpZmllciA8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQorCSAqIEBzZWUgI2dldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9Qb3B1bGF0aW9uSWRlbnRpZmllcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCNnZXRUcmFuc3BvcnRJZGVudGlmaWVyIDxlbT5UcmFuc3BvcnQgSWRlbnRpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRyYW5zcG9ydCBJZGVudGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwjZ2V0VHJhbnNwb3J0SWRlbnRpZmllcigpCisJICogQHNlZSAjZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX1RyYW5zcG9ydElkZW50aWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwjZ2V0Q3VycmVudFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgPGVtPkN1cnJlbnQgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkN1cnJlbnQgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsI2dldEN1cnJlbnRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkKKwkgKiBAc2VlICNnZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfQ3VycmVudFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwjZ2V0UmF0ZVRpbWVQZXJpb2QgPGVtPlJhdGUgVGltZSBQZXJpb2Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SYXRlIFRpbWUgUGVyaW9kPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwjZ2V0UmF0ZVRpbWVQZXJpb2QoKQorCSAqIEBzZWUgI2dldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9SYXRlVGltZVBlcmlvZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCNnZXREZXBhcnR1cmVDYXBhY2l0eSA8ZW0+RGVwYXJ0dXJlIENhcGFjaXR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVwYXJ0dXJlIENhcGFjaXR5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwjZ2V0RGVwYXJ0dXJlQ2FwYWNpdHkoKQorCSAqIEBzZWUgI2dldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9EZXBhcnR1cmVDYXBhY2l0eSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCNnZXRNYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHkgPGVtPk1heGltdW0gRGVwYXJ0dXJlIENhcGFjaXR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWF4aW11bSBEZXBhcnR1cmUgQ2FwYWNpdHk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCNnZXRNYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHkoKQorCSAqIEBzZWUgI2dldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9NYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwjZ2V0Q2FwYWNpdHkgPGVtPkNhcGFjaXR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FwYWNpdHk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCNnZXRDYXBhY2l0eSgpCisJICogQHNlZSAjZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX0NhcGFjaXR5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsI2dldE1heGltdW1DYXBhY2l0eSA8ZW0+TWF4aW11bSBDYXBhY2l0eTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1heGltdW0gQ2FwYWNpdHk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCNnZXRNYXhpbXVtQ2FwYWNpdHkoKQorCSAqIEBzZWUgI2dldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9NYXhpbXVtQ2FwYWNpdHkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwjZ2V0VHJhbnNpdFRpbWUgPGVtPlRyYW5zaXQgVGltZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRyYW5zaXQgVGltZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsI2dldFRyYW5zaXRUaW1lKCkKKwkgKiBAc2VlICNnZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfVHJhbnNpdFRpbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwjZ2V0U3RhcnRVcERlbGF5IDxlbT5TdGFydCBVcCBEZWxheTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0IFVwIERlbGF5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwjZ2V0U3RhcnRVcERlbGF5KCkKKwkgKiBAc2VlICNnZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfU3RhcnRVcERlbGF5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIDxlbT5UcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRyYW5zcG9ydCBSZWxhdGlvbnNoaXAgTGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUjZ2V0QXZhaWxhYmxlRGVwYXJ0dXJlQ2FwYWNpdHlQcm9wb3J0aW9uIDxlbT5BdmFpbGFibGUgRGVwYXJ0dXJlIENhcGFjaXR5IFByb3BvcnRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdmFpbGFibGUgRGVwYXJ0dXJlIENhcGFjaXR5IFByb3BvcnRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlI2dldEF2YWlsYWJsZURlcGFydHVyZUNhcGFjaXR5UHJvcG9ydGlvbigpCisJICogQHNlZSAjZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9BdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSA8ZW0+UGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0UGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwgPGVtPlJvYWQgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2FkIFRyYW5zcG9ydCBSZWxhdGlvbnNoaXAgTGFiZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgPGVtPlJvYWQgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2FkIFRyYW5zcG9ydCBSZWxhdGlvbnNoaXAgTGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Um9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUjZ2V0Um9hZE5hbWUgPGVtPlJvYWQgTmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJvYWQgTmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlI2dldFJvYWROYW1lKCkKKwkgKiBAc2VlICNnZXRSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Um9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVfUm9hZE5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUjZ2V0Um9hZENsYXNzIDxlbT5Sb2FkIENsYXNzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um9hZCBDbGFzczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlI2dldFJvYWRDbGFzcygpCisJICogQHNlZSAjZ2V0Um9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX1JvYWRDbGFzcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSNnZXROdW1iZXJDcm9zc2luZ3MgPGVtPk51bWJlciBDcm9zc2luZ3M8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OdW1iZXIgQ3Jvc3NpbmdzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUjZ2V0TnVtYmVyQ3Jvc3NpbmdzKCkKKwkgKiBAc2VlICNnZXRSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Um9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVfTnVtYmVyQ3Jvc3NpbmdzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5FYXJ0aFNjaWVuY2VMYWJlbCA8ZW0+RWFydGggU2NpZW5jZSBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FYXJ0aCBTY2llbmNlIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEVhcnRoU2NpZW5jZUxhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkVhcnRoU2NpZW5jZUxhYmVsI2dldEN1cnJlbnRFYXJ0aFNjaWVuY2VWYWx1ZSA8ZW0+Q3VycmVudCBFYXJ0aCBTY2llbmNlIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+Q3VycmVudCBFYXJ0aCBTY2llbmNlIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWwjZ2V0Q3VycmVudEVhcnRoU2NpZW5jZVZhbHVlKCkKKwkgKiBAc2VlICNnZXRFYXJ0aFNjaWVuY2VMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0RWFydGhTY2llbmNlTGFiZWxfQ3VycmVudEVhcnRoU2NpZW5jZVZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5FYXJ0aFNjaWVuY2VMYWJlbFZhbHVlIDxlbT5FYXJ0aCBTY2llbmNlIExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVhcnRoIFNjaWVuY2UgTGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5FYXJ0aFNjaWVuY2VMYWJlbFZhbHVlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWxWYWx1ZSNnZXREYXRhIDxlbT5EYXRhPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5EYXRhPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWxWYWx1ZSNnZXREYXRhKCkKKwkgKiBAc2VlICNnZXRFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlX0RhdGEoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWxWYWx1ZSNnZXREYXRhVHlwZSA8ZW0+RGF0YSBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF0YSBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWxWYWx1ZSNnZXREYXRhVHlwZSgpCisJICogQHNlZSAjZ2V0RWFydGhTY2llbmNlTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RWFydGhTY2llbmNlTGFiZWxWYWx1ZV9EYXRhVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5FYXJ0aFNjaWVuY2VMYWJlbFZhbHVlI2dldFVuaXRzIDxlbT5Vbml0czwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVuaXRzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWxWYWx1ZSNnZXRVbml0cygpCisJICogQHNlZSAjZ2V0RWFydGhTY2llbmNlTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RWFydGhTY2llbmNlTGFiZWxWYWx1ZV9Vbml0cygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwIDxlbT5SZWxhdGl2ZSBQaHlzaWNhbCBSZWxhdGlvbnNoaXA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5SZWxhdGl2ZSBQaHlzaWNhbCBSZWxhdGlvbnNoaXA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwCisJICogQGdlbmVyYXRlZAorCSAqLworCUVFbnVtIGdldFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0TW9kZSA8ZW0+VHJhbnNwb3J0IE1vZGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5UcmFuc3BvcnQgTW9kZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydE1vZGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0VHJhbnNwb3J0TW9kZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGFiZWxzRmFjdG9yeSBnZXRMYWJlbHNGYWN0b3J5KCk7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKKwkgKiA8dWw+CisJICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisJICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKwkgKiA8L3VsPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkFyZWFMYWJlbEltcGwgPGVtPkFyZWEgTGFiZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkFyZWFMYWJlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkxhYmVsc1BhY2thZ2VJbXBsI2dldEFyZWFMYWJlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBBUkVBX0xBQkVMID0gZUlOU1RBTkNFLmdldEFyZWFMYWJlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBBcmVhIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQVJFQV9MQUJFTF9fQ1VSUkVOVF9BUkVBX1ZBTFVFID0gZUlOU1RBTkNFLmdldEFyZWFMYWJlbF9DdXJyZW50QXJlYVZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkFyZWFMYWJlbFZhbHVlSW1wbCA8ZW0+QXJlYSBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuQXJlYUxhYmVsVmFsdWVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRBcmVhTGFiZWxWYWx1ZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBBUkVBX0xBQkVMX1ZBTFVFID0gZUlOU1RBTkNFLmdldEFyZWFMYWJlbFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BcmVhPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQVJFQV9MQUJFTF9WQUxVRV9fQVJFQSA9IGVJTlNUQU5DRS5nZXRBcmVhTGFiZWxWYWx1ZV9BcmVhKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdmVyYWdlIEV4dGVudDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEFSRUFfTEFCRUxfVkFMVUVfX0FWRVJBR0VfRVhURU5UID0gZUlOU1RBTkNFLmdldEFyZWFMYWJlbFZhbHVlX0F2ZXJhZ2VFeHRlbnQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxJbXBsIDxlbT5Db21tb24gQm9yZGVyIFJlbGF0aW9uc2hpcCBMYWJlbDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBDT01NT05fQk9SREVSX1JFTEFUSU9OU0hJUF9MQUJFTCA9IGVJTlNUQU5DRS5nZXRDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCA8ZW0+Q29tbW9uIEJvcmRlciBSZWxhdGlvbnNoaXAgTGFiZWwgVmFsdWU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENPTU1PTl9CT1JERVJfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFID0gZUlOU1RBTkNFLmdldENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJvcmRlciBMZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDT01NT05fQk9SREVSX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fQk9SREVSX0xFTkdUSCA9IGVJTlNUQU5DRS5nZXRDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX0JvcmRlckxlbmd0aCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsSW1wbCA8ZW0+UGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuTGFiZWxzUGFja2FnZUltcGwjZ2V0UGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBQSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0UGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5Qb3B1bGF0aW9uTGFiZWxJbXBsIDxlbT5Qb3B1bGF0aW9uIExhYmVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5Qb3B1bGF0aW9uTGFiZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRQb3B1bGF0aW9uTGFiZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUE9QVUxBVElPTl9MQUJFTCA9IGVJTlNUQU5DRS5nZXRQb3B1bGF0aW9uTGFiZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBPUFVMQVRJT05fTEFCRUxfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IGVJTlNUQU5DRS5nZXRQb3B1bGF0aW9uTGFiZWxfUG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBQT1BVTEFUSU9OX0xBQkVMX19OQU1FID0gZUlOU1RBTkNFLmdldFBvcHVsYXRpb25MYWJlbF9OYW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFBvcHVsYXRpb24gVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBQT1BVTEFUSU9OX0xBQkVMX19DVVJSRU5UX1BPUFVMQVRJT05fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0UG9wdWxhdGlvbkxhYmVsX0N1cnJlbnRQb3B1bGF0aW9uVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRlZCBBcmVhPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUE9QVUxBVElPTl9MQUJFTF9fUE9QVUxBVEVEX0FSRUEgPSBlSU5TVEFOQ0UuZ2V0UG9wdWxhdGlvbkxhYmVsX1BvcHVsYXRlZEFyZWEoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbGlkIFllYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBQT1BVTEFUSU9OX0xBQkVMX19WQUxJRF9ZRUFSID0gZUlOU1RBTkNFLmdldFBvcHVsYXRpb25MYWJlbF9WYWxpZFllYXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuUG9wdWxhdGlvbkxhYmVsVmFsdWVJbXBsIDxlbT5Qb3B1bGF0aW9uIExhYmVsIFZhbHVlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5Qb3B1bGF0aW9uTGFiZWxWYWx1ZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkxhYmVsc1BhY2thZ2VJbXBsI2dldFBvcHVsYXRpb25MYWJlbFZhbHVlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFBPUFVMQVRJT05fTEFCRUxfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0UG9wdWxhdGlvbkxhYmVsVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUE9QVUxBVElPTl9MQUJFTF9WQUxVRV9fQ09VTlQgPSBlSU5TVEFOQ0UuZ2V0UG9wdWxhdGlvbkxhYmVsVmFsdWVfQ291bnQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsSW1wbCA8ZW0+UmVsYXRpdmUgUGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMID0gZUlOU1RBTkNFLmdldFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBSZWxhdGlvbnNoaXA8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBSRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfX0NVUlJFTlRfUkVMQVRJT05TSElQID0gZUlOU1RBTkNFLmdldFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbF9DdXJyZW50UmVsYXRpb25zaGlwKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCA8ZW0+UmVsYXRpdmUgUGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkxhYmVsc1BhY2thZ2VJbXBsI2dldFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFJFTEFUSVZFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRqYWNlbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBSRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX0FESkFDRU5UID0gZUlOU1RBTkNFLmdldFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX0FkamFjZW50KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWxhdGlvbnNoaXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBSRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX1JFTEFUSU9OU0hJUCA9IGVJTlNUQU5DRS5nZXRSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9SZWxhdGlvbnNoaXAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsIDxlbT5UcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkxhYmVsc1BhY2thZ2VJbXBsI2dldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zcG9ydCBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fVFJBTlNQT1JUX01PREUgPSBlSU5TVEFOQ0UuZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfVHJhbnNwb3J0TW9kZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSID0gZUlOU1RBTkNFLmdldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX1BvcHVsYXRpb25JZGVudGlmaWVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFuc3BvcnQgSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1RSQU5TUE9SVF9JREVOVElGSUVSID0gZUlOU1RBTkNFLmdldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX1RyYW5zcG9ydElkZW50aWZpZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX0NVUlJFTlRfVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9DdXJyZW50VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmF0ZSBUaW1lIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1JBVEVfVElNRV9QRVJJT0QgPSBlSU5TVEFOQ0UuZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfUmF0ZVRpbWVQZXJpb2QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlcGFydHVyZSBDYXBhY2l0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX0RFUEFSVFVSRV9DQVBBQ0lUWSA9IGVJTlNUQU5DRS5nZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9EZXBhcnR1cmVDYXBhY2l0eSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWF4aW11bSBEZXBhcnR1cmUgQ2FwYWNpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBUUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19NQVhJTVVNX0RFUEFSVFVSRV9DQVBBQ0lUWSA9IGVJTlNUQU5DRS5nZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9NYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhcGFjaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fQ0FQQUNJVFkgPSBlSU5TVEFOQ0UuZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfQ2FwYWNpdHkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1heGltdW0gQ2FwYWNpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBUUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19NQVhJTVVNX0NBUEFDSVRZID0gZUlOU1RBTkNFLmdldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX01heGltdW1DYXBhY2l0eSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNpdCBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fVFJBTlNJVF9USU1FID0gZUlOU1RBTkNFLmdldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX1RyYW5zaXRUaW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGFydCBVcCBEZWxheTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1NUQVJUX1VQX0RFTEFZID0gZUlOU1RBTkNFLmdldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX1N0YXJ0VXBEZWxheSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCA8ZW0+VHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkxhYmVsc1BhY2thZ2VJbXBsI2dldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFibGUgRGVwYXJ0dXJlIENhcGFjaXR5IFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBUUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19BVkFJTEFCTEVfREVQQVJUVVJFX0NBUEFDSVRZX1BST1BPUlRJT04gPSBlSU5TVEFOQ0UuZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9BdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCA8ZW0+UGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFID0gZUlOU1RBTkNFLmdldFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsIDxlbT5Sb2FkIFRyYW5zcG9ydCBSZWxhdGlvbnNoaXAgTGFiZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkxhYmVsc1BhY2thZ2VJbXBsI2dldFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBST0FEX1RSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0Um9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCA8ZW0+Um9hZCBUcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkxhYmVsc1BhY2thZ2VJbXBsI2dldFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFJPQURfVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9hZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19ST0FEX05BTUUgPSBlSU5TVEFOQ0UuZ2V0Um9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVfUm9hZE5hbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvYWQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBST0FEX1RSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX1JPQURfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0Um9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVfUm9hZENsYXNzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OdW1iZXIgQ3Jvc3NpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19OVU1CRVJfQ1JPU1NJTkdTID0gZUlOU1RBTkNFLmdldFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX051bWJlckNyb3NzaW5ncygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5FYXJ0aFNjaWVuY2VMYWJlbEltcGwgPGVtPkVhcnRoIFNjaWVuY2UgTGFiZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkVhcnRoU2NpZW5jZUxhYmVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuTGFiZWxzUGFja2FnZUltcGwjZ2V0RWFydGhTY2llbmNlTGFiZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgRUFSVEhfU0NJRU5DRV9MQUJFTCA9IGVJTlNUQU5DRS5nZXRFYXJ0aFNjaWVuY2VMYWJlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBFYXJ0aCBTY2llbmNlIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgRUFSVEhfU0NJRU5DRV9MQUJFTF9fQ1VSUkVOVF9FQVJUSF9TQ0lFTkNFX1ZBTFVFID0gZUlOU1RBTkNFLmdldEVhcnRoU2NpZW5jZUxhYmVsX0N1cnJlbnRFYXJ0aFNjaWVuY2VWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5FYXJ0aFNjaWVuY2VMYWJlbFZhbHVlSW1wbCA8ZW0+RWFydGggU2NpZW5jZSBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuRWFydGhTY2llbmNlTGFiZWxWYWx1ZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkxhYmVsc1BhY2thZ2VJbXBsI2dldEVhcnRoU2NpZW5jZUxhYmVsVmFsdWUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgRUFSVEhfU0NJRU5DRV9MQUJFTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBFQVJUSF9TQ0lFTkNFX0xBQkVMX1ZBTFVFX19EQVRBID0gZUlOU1RBTkNFLmdldEVhcnRoU2NpZW5jZUxhYmVsVmFsdWVfRGF0YSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGF0YSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRUFSVEhfU0NJRU5DRV9MQUJFTF9WQUxVRV9fREFUQV9UWVBFID0gZUlOU1RBTkNFLmdldEVhcnRoU2NpZW5jZUxhYmVsVmFsdWVfRGF0YVR5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRUFSVEhfU0NJRU5DRV9MQUJFTF9WQUxVRV9fVU5JVFMgPSBlSU5TVEFOQ0UuZ2V0RWFydGhTY2llbmNlTGFiZWxWYWx1ZV9Vbml0cygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcCA8ZW0+UmVsYXRpdmUgUGh5c2ljYWwgUmVsYXRpb25zaGlwPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQID0gZUlOU1RBTkNFLmdldFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydE1vZGUgPGVtPlRyYW5zcG9ydCBNb2RlPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRNb2RlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRUcmFuc3BvcnRNb2RlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gVFJBTlNQT1JUX01PREUgPSBlSU5TVEFOQ0UuZ2V0VHJhbnNwb3J0TW9kZSgpOworCisJfQorCit9IC8vTGFiZWxzUGFja2FnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNTAwOTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLy8gUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNFZGdlTGFiZWw7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgYW4gRU1GIGRlZmluaXRpb24gb2YgYSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBsYWJlbCBmb3IgYW4KKyAqIEVkZ2UgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIG5vZGVzLgorICogCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCBleHRlbmRzIFN0YXRpY0VkZ2VMYWJlbCB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzZWdtZW50IG9mIHRoZSB0eXBlIFVSSSB0aGF0IHByZWZpeGVzIGFsbCBvdGhlciBzZWdtZW50cyBpbiBhCisJICogcmVsYXRpdmUgcGh5c2ljYWwgcmVsYXRpb25zaGlwIGxhYmVsIHR5cGUgVVJJLgorCSAqLworCVN0cmluZyBVUklfVFlQRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfU0VHTUVOVCA9IFVSSV9UWVBFX0xBQkVMX1NFR01FTlQKKwkJCSsgIi9waHlzaWNhbCI7CisKKwkvLyBOb3RoaW5nCit9IC8vIFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjYjE1MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8vIFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHBoeXNpY2FsIHJlbGF0aW9uc2hpcAorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgZXh0ZW5kcyBMYWJlbFZhbHVlIHsKKwkvLyBOb3RoaW5nCit9IC8vIFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL1BvcHVsYXRpb25MYWJlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvUG9wdWxhdGlvbkxhYmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q3ZDY5OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL1BvcHVsYXRpb25MYWJlbC5qYXZhCkBAIC0wLDAgKzEsMjE1IEBACisvLyBQb3B1bGF0aW9uTGFiZWwuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVsczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNOb2RlTGFiZWw7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgUG9wdWxhdGlvbkxhYmVsLgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBQb3B1bGF0aW9uTGFiZWwgZXh0ZW5kcyBTdGF0aWNOb2RlTGFiZWwgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VnbWVudCBvZiB0aGUgdHlwZSBVUkkgdGhhdCBwcmVmaXhlcyBhbGwgb3RoZXIgc2VnbWVudHMgaW4gYQorCSAqIHBvcHVsYXRpb24gbGFiZWwgdHlwZSBVUkkuCisJICovCisJU3RyaW5nIFVSSV9UWVBFX1BPUFVMQVRJT05fTEFCRUxfU0VHTUVOVCA9IFVSSV9UWVBFX0xBQkVMX1NFR01FTlQKKwkJCSsgIi9wb3B1bGF0aW9uIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHR5cGUgVVJJIGZvciBwb3B1bGF0aW9uIGxhYmVscworCSAqLworCVVSSSBVUklfVFlQRV9QT1BVTEFUSU9OX0xBQkVMID0gU1RFTVVSSQorCQkJLmNyZWF0ZVR5cGVVUkkoVVJJX1RZUEVfUE9QVUxBVElPTl9MQUJFTF9TRUdNRU5UKTsKKworCS8vIFRoZXNlIGNvbnN0YW50cyBhcmUgaWRlbnRpZmllcnMgb2YgdmFyaW91cyAiYnVpbHQtaW4iIHBvcHVsYXRpb24gdHlwZXMKKwkvKioKKwkgKiBHZW5lcmljIGh1bWFuIHBvcHVsYXRpb24uCisJICogCisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQorCSAqLworCVN0cmluZyBIVU1BTiA9ICJodW1hbiI7CisKKwkvKioKKwkgKiBIdW1hbiBtYWxlIHBvcHVsYXRpb24uCisJICogCisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQorCSAqLworCVN0cmluZyBIVU1BTl9NQUxFID0gImh1bWFuX21hbGUiOworCisJLyoqCisJICogSHVtYW4gYWR1bHQgbWFsZSBwb3B1bGF0aW9uLgorCSAqIAorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkKKwkgKi8KKwlTdHJpbmcgSFVNQU5fTUFMRV9BRFVMVCA9ICJodW1hbl9tYWxlX2FkdWx0IjsKKworCS8qKgorCSAqIEh1bWFuIGNoaWxkIG1hbGUgcG9wdWxhdGlvbi4KKwkgKiAKKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpCisJICovCisJU3RyaW5nIEhVTUFOX01BTEVfQ0hJTEQgPSAiaHVtYW5fbWFsZV9jaGlsZCI7CisKKwkvKioKKwkgKiBIdW1hbiBhZHVsdCBmZW1hbGUgcG9wdWxhdGlvbi4KKwkgKiAKKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpCisJICovCisJU3RyaW5nIEhVTUFOX0ZFTUFMRV9BRFVMVCA9ICJodW1hbl9mZW1hbGVfYWR1bHQiOworCisJLyoqCisJICogSHVtYW4gY2hpbGQgZmVtYWxlIHBvcHVsYXRpb24uCisJICogCisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQorCSAqLworCVN0cmluZyBIVU1BTl9GRU1BTEVfQ0hJTEQgPSAiaHVtYW5fZmVtYWxlX2NoaWxkIjsKKworCS8qKgorCSAqIEdlbmVyaWMgYmlyZCBwb3B1bGF0aW9uLgorCSAqIAorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkKKwkgKi8KKwlTdHJpbmcgQklSRCA9ICJiaXJkIjsKKworCS8qKgorCSAqIER1Y2sgcG9wdWxhdGlvbi4KKwkgKiAKKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpCisJICovCisJU3RyaW5nIEJJUkRfRFVDSyA9ICJiaXJkX2R1Y2siOworCisJLyoqCisJICogQ2hpY2tlbiBwb3B1bGF0aW9uLgorCSAqIAorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkKKwkgKi8KKwlTdHJpbmcgQklSRF9DSElDS0VOID0gImJpcmRfY2hpY2tlbiI7CisKKwkvKioKKwkgKiBHZW5lcmljIHN3aW5lIChwaWcpIHBvcHVsYXRpb24uCisJICogCisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQorCSAqLworCVN0cmluZyBTV0lORSA9ICJzd2luZSI7CisKKwkvKioKKwkgKiBHZW5lcmljIG1vc3F1aXRvIHBvcHVsYXRpb24uCisJICogCisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQorCSAqLworCVN0cmluZyBNT1NRVUlUTyA9ICJtb3NxdWl0byI7CisKKwkvKioKKwkgKiBBbm9waGVsZXMgbW9zcXVpdG8gcG9wdWxhdGlvbi4KKwkgKiAKKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpCisJICovCisJU3RyaW5nIE1PU1FVSVRPX0FOT1BIRUxFUyA9ICJtb3NxdWl0b19hbm9waGVsZXMiOworCisJLyoqCisJICogQHJldHVybiBhIHN0cmluZyB0aGF0IGlzIGEgbm9uLU5MUydkIGlkZW50aWZpZXIgb2YgdGhlIHBvcHVsYXRpb24uIGUuZy4KKwkgKiAgICAgICAgICJib3lzIiwgImJpcmRzIgorCSAqIEBtb2RlbAorCSAqLworCVN0cmluZyBnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsI2dldFBvcHVsYXRpb25JZGVudGlmaWVyIDxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRQb3B1bGF0aW9uSWRlbnRpZmllcihTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgTkxTJ2QgbmFtZSBvZiB0aGUgcG9wdWxhdGlvbgorCSAqIEBtb2RlbAorCSAqLworCVN0cmluZyBnZXROYW1lKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcG9wdWxhdGlvbiB2YWx1ZQorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKiAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgorCSAqLworCVBvcHVsYXRpb25MYWJlbFZhbHVlIGdldEN1cnJlbnRQb3B1bGF0aW9uVmFsdWUoKTsKKworCS8qKgorCSAqIFRoaXMgdmFsdWUgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSBhIG1vcmUgYWNjdXJhdGUgcG9wdWxhdGlvbiBkZW5zaXR5IGZvcgorCSAqIGNhc2VzIHdoZXJlIHRoZSBhcmVhIG9mIGEgbm9kZSBtaWdodCBiZSBxdWl0ZSBsYXJnZSB3aGlsZSB0aGUgYWN0dWFsCisJICogZGlzdHJpYnV0aW9uIG9mIHBvcHVsYXRpb24gbWVtYmVycyBpcyBxdWl0ZSBzbWFsbC4gVGhpcyB3b3VsZCBiZSB0aGUgY2FzZQorCSAqIGZvciBpbnN0YW5jZSBpZiBhIG5vZGUgcmVwcmVzZW50ZWQgYSBsYXJnZSBlbXB0eSBhcmVhIHdpdGggYSBmZXcgY2l0aWVzCisJICogYW5kIHRvd25zIChlLmcuLCBUaGUgU3RhdGUgb2YgV3lvbWluZyBpbiB0aGUgVW5pdGVkIFN0YXRlcykuIElmIHRoaXMKKwkgKiBvcHRpb25hbCB2YWx1ZSB2YWx1ZSBpcyBzZXQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgc21hbGxlciBhcmVhIHRoYXQgaXMKKwkgKiBhY3R1YWxseSBwb3B1bGF0ZWQuIFR5cGljYWxseSwgdGhpcyB2YWx1ZSB3b3VsZCBub3QgYmUgc2V0IGFuZCB0aGUKKwkgKiBwb3B1bGF0aW9uIGRlbnNpdHkgd291bGQgYmUgY29tcHV0ZWQgYnkgdXNpbmcgdGhlIGFjdHVhbCBhcmVhIG9mIHRoZQorCSAqIHJlZ2lvbiB0aGF0IHRoaXMgbGFiZWwgbGFiZWxzLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGFjdHVhbCBhcmVhIHRoYXQgaXMgcG9wdWxhdGVkIChzcXVhcmUga2lsb21ldGVycykuCisJICogQG1vZGVsIGRlZmF1bHQ9IjAiCisJICovCisJZG91YmxlIGdldFBvcHVsYXRlZEFyZWEoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbCNnZXRQb3B1bGF0ZWRBcmVhIDxlbT5Qb3B1bGF0ZWQgQXJlYTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9wdWxhdGVkIEFyZWE8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFBvcHVsYXRlZEFyZWEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFBvcHVsYXRlZEFyZWEoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbGlkIFllYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMjAwNiI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsaWQgWWVhcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWxpZCBZZWFyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRWYWxpZFllYXIoaW50KQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZSNnZXRQb3B1bGF0aW9uTGFiZWxfVmFsaWRZZWFyKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMjAwNiIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IGdldFZhbGlkWWVhcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsI2dldFZhbGlkWWVhciA8ZW0+VmFsaWQgWWVhcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWQgWWVhcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VmFsaWRZZWFyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRWYWxpZFllYXIoaW50IHZhbHVlKTsKKworfSAvLyBQb3B1bGF0aW9uTGFiZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL1BvcHVsYXRpb25MYWJlbFZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9Qb3B1bGF0aW9uTGFiZWxWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NjAzZDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9Qb3B1bGF0aW9uTGFiZWxWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8vIFBvcHVsYXRpb25MYWJlbFZhbHVlLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgYSBQb3B1bGF0aW9uIExhYmVsIFZhbHVlLgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBQb3B1bGF0aW9uTGFiZWxWYWx1ZSBleHRlbmRzIExhYmVsVmFsdWUgeworCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBvcHVsYXRpb24gbWVtYmVycworCSAqIEBtb2RlbAorCSAqLworCWRvdWJsZSBnZXRDb3VudCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsVmFsdWUjZ2V0Q291bnQgPGVtPkNvdW50PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q291bnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldENvdW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDb3VudChkb3VibGUgdmFsdWUpOworCit9IC8vIFBvcHVsYXRpb25MYWJlbFZhbHVlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUzNDA4MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAuamF2YQpAQCAtMCwwICsxLDM5MSBAQAorLy8gUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBlbnVtZXJhdGlvbiBvZiB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHJlbGF0aXZlCisgKiBwaHlzaWNhbCByZWxhdGlvbnNoaXBzLgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGVudW0gUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcCBpbXBsZW1lbnRzIEVudW1lcmF0b3IKK3sKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5VbnNwZWNpZmllZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNVTlNQRUNJRklFRAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVVOU1BFQ0lGSUVEX0xJVEVSQUwoMCwgIlVuc3BlY2lmaWVkIiwgIlVuc3BlY2lmaWVkIiksCisJLyoqCisJICogVGhlICc8ZW0+PGI+QWJvdmU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQUJPVkUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlBQk9WRV9MSVRFUkFMKDIsICJBYm92ZSIsICJBYm92ZSIpLAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPkJlbG93PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0JFTE9XCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQkVMT1dfTElURVJBTCg0LCAiQmVsb3ciLCAiQmVsb3ciKSwKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5SaWdodCBPZjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNSSUdIVF9PRgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVJJR0hUX09GX0xJVEVSQUwoNiwgIlJpZ2h0T2YiLCAiUmlnaHRPZiIpLAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPkxlZnQgT2Y8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTEVGVF9PRgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUxFRlRfT0ZfTElURVJBTCg4LCAiTGVmdE9mIiwgIkxlZnRPZiIpLAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPk5vcnRoIE9mPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PUlRIX09GCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJTk9SVEhfT0ZfTElURVJBTCgxMCwgIk5vcnRoT2YiLCAiTm9ydGhPZiIpLAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNvdXRoIE9mPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NPVVRIX09GCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJU09VVEhfT0ZfTElURVJBTCgxMiwgIlNvdXRoT2YiLCAiU291dGhPZiIpLAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPldlc3QgT2Y8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjV0VTVF9PRgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVdFU1RfT0ZfTElURVJBTCgxNCwgIldlc3RPZiIsICJXZXN0T2YiKSwKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5FYXN0IE9mPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0VBU1RfT0YKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlFQVNUX09GX0xJVEVSQUwoMTYsICJFYXN0T2YiLCAiRWFzdE9mIiksCisJLyoqCisJICogVGhlICc8ZW0+PGI+Q29udGFpbnM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ09OVEFJTlMKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlDT05UQUlOU19MSVRFUkFMKDE4LCAiQ29udGFpbnMiLCAiQ29udGFpbnMiKSwKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5Db250YWluZWQgQnk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ09OVEFJTkVEX0JZCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQ09OVEFJTkVEX0JZX0xJVEVSQUwoMjAsICJDb250YWluZWRCeSIsICJDb250YWluZWRCeSIpLAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPk92ZXJsYXBzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI09WRVJMQVBTCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJT1ZFUkxBUFNfTElURVJBTCgyMiwgIk92ZXJsYXBzIiwgIk92ZXJsYXBzIiksCisJLyoqCisJICogVGhlICc8ZW0+PGI+T3JiaXRzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI09SQklUUworCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU9SQklUU19MSVRFUkFMKDI0LCAiT3JiaXRzIiwgIk9yYml0cyIpOworCS8qKgorCSAqIEBtb2RlbCBuYW1lPSJVbnNwZWNpZmllZCIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNQRUNJRklFRCA9IDA7CisKKwkvKioKKwkgKiBPbmUgdGhpbmcgaXMgYWJvdmUgYW5vdGhlciwgYnV0IG5vdCB0b3VjaGluZy4KKwkgKiAKKwkgKiBAbW9kZWwgbmFtZT0iQWJvdmUiCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJPVkUgPSAyOworCisJLyoqCisJICogT25lIHRoaW5nIGlzIGJlbG93IGFub3RoZXIsIGJ1dCBub3QgdG91Y2hpbmcuCisJICogCisJICogQG1vZGVsIG5hbWU9IkJlbG93IgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFTE9XID0gNDsKKworCS8qKgorCSAqIE9uZSB0aGluZyBpcyB0byB0aGUgcmlnaHQgb2YgYW5vdGhlciwgYnV0IG5vdCB0b3VjaGluZy4KKwkgKiAKKwkgKiBAbW9kZWwgbmFtZT0iUmlnaHRPZiIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVF9PRiA9IDY7CisKKwkvKioKKwkgKiBPbmUgdGhpbmcgaXMgdG8gdGhlIGxlZnQgb2YgYW5vdGhlciwgYnV0IG5vdCB0b3VjaGluZy4KKwkgKiAKKwkgKiBAbW9kZWwgbmFtZT0iTGVmdE9mIgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlRfT0YgPSA4OworCisJLyoqCisJICogT25lIHRoaW5nIGlzIHRvIHRoZSBub3J0aCBvZiBhbm90aGVyLCBidXQgbm90IHRvdWNoaW5nLgorCSAqIAorCSAqIEBtb2RlbCBuYW1lPSJOb3J0aE9mIgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PUlRIX09GID0gMTA7CisKKwkvKioKKwkgKiBPbmUgdGhpbmcgaXMgdG8gdGhlIHNvdXRoIG9mIGFub3RoZXIsIGJ1dCBub3QgdG91Y2hpbmcuCisJICogCisJICogQG1vZGVsIG5hbWU9IlNvdXRoT2YiCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09VVEhfT0YgPSAxMjsKKworCS8qKgorCSAqIE9uZSB0aGluZyBpcyB0byB0aGUgd2VzdCBvZiBhbm90aGVyLCBidXQgbm90IHRvdWNoaW5nLgorCSAqIAorCSAqIEBtb2RlbCBuYW1lPSJXZXN0T2YiCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VTVF9PRiA9IDE0OworCisJLyoqCisJICogQG1vZGVsIG5hbWU9IkVhc3RPZiIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFQVNUX09GID0gMTY7CisKKwkvKioKKwkgKiBPbmUgdGhpbmcgY29tcGxldGVseSBjb250YWlucyBhbm90aGVyLgorCSAqIAorCSAqIEBtb2RlbCBuYW1lPSJDb250YWlucyIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05UQUlOUyA9IDE4OworCisJLyoqCisJICogT25lIHRoaW5nIGlzIGNvbnRhaW5lZCBieSBhbm90aGVyLgorCSAqIAorCSAqIEBtb2RlbCBuYW1lPSJDb250YWluZWRCeSIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05UQUlORURfQlkgPSAyMDsKKworCS8qKgorCSAqIE9uZSB0aGluZyBvdmVybGFwcyBhbm90aGVyLgorCSAqIAorCSAqIEBtb2RlbCBuYW1lPSJPdmVybGFwcyIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVkVSTEFQUyA9IDIyOworCisJLyoqCisJICogT25lIG9yYml0cyBhbm90aGVyCisJICogCisJICogQG1vZGVsIG5hbWU9Ik9yYml0cyIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUkJJVFMgPSAyNDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5SZWxhdGl2ZSBQaHlzaWNhbCBSZWxhdGlvbnNoaXA8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBbXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcFtdIHsKKwkJCVVOU1BFQ0lGSUVEX0xJVEVSQUwsCisJCQlBQk9WRV9MSVRFUkFMLAorCQkJQkVMT1dfTElURVJBTCwKKwkJCVJJR0hUX09GX0xJVEVSQUwsCisJCQlMRUZUX09GX0xJVEVSQUwsCisJCQlOT1JUSF9PRl9MSVRFUkFMLAorCQkJU09VVEhfT0ZfTElURVJBTCwKKwkJCVdFU1RfT0ZfTElURVJBTCwKKwkJCUVBU1RfT0ZfTElURVJBTCwKKwkJCUNPTlRBSU5TX0xJVEVSQUwsCisJCQlDT05UQUlORURfQllfTElURVJBTCwKKwkJCU9WRVJMQVBTX0xJVEVSQUwsCisJCQlPUkJJVFNfTElURVJBTCwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5SZWxhdGl2ZSBQaHlzaWNhbCBSZWxhdGlvbnNoaXA8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlbGF0aXZlIFBoeXNpY2FsIFJlbGF0aW9uc2hpcDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAgZ2V0KFN0cmluZyBsaXRlcmFsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVsYXRpdmUgUGh5c2ljYWwgUmVsYXRpb25zaGlwPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcCBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlbGF0aXZlIFBoeXNpY2FsIFJlbGF0aW9uc2hpcDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAgZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIFVOU1BFQ0lGSUVEOiByZXR1cm4gVU5TUEVDSUZJRURfTElURVJBTDsKKwkJCWNhc2UgQUJPVkU6IHJldHVybiBBQk9WRV9MSVRFUkFMOworCQkJY2FzZSBCRUxPVzogcmV0dXJuIEJFTE9XX0xJVEVSQUw7CisJCQljYXNlIFJJR0hUX09GOiByZXR1cm4gUklHSFRfT0ZfTElURVJBTDsKKwkJCWNhc2UgTEVGVF9PRjogcmV0dXJuIExFRlRfT0ZfTElURVJBTDsKKwkJCWNhc2UgTk9SVEhfT0Y6IHJldHVybiBOT1JUSF9PRl9MSVRFUkFMOworCQkJY2FzZSBTT1VUSF9PRjogcmV0dXJuIFNPVVRIX09GX0xJVEVSQUw7CisJCQljYXNlIFdFU1RfT0Y6IHJldHVybiBXRVNUX09GX0xJVEVSQUw7CisJCQljYXNlIEVBU1RfT0Y6IHJldHVybiBFQVNUX09GX0xJVEVSQUw7CisJCQljYXNlIENPTlRBSU5TOiByZXR1cm4gQ09OVEFJTlNfTElURVJBTDsKKwkJCWNhc2UgQ09OVEFJTkVEX0JZOiByZXR1cm4gQ09OVEFJTkVEX0JZX0xJVEVSQUw7CisJCQljYXNlIE9WRVJMQVBTOiByZXR1cm4gT1ZFUkxBUFNfTElURVJBTDsKKwkJCWNhc2UgT1JCSVRTOiByZXR1cm4gT1JCSVRTX0xJVEVSQUw7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzg5NTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwuamF2YQpAQCAtMCwwICsxLDM3IEBACisvLyBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVsczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgYW4gRU1GIGRlZmluaXRpb24gb2YgYSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBsYWJlbCBmb3IgYW4KKyAqIEVkZ2UgdGhhdCByZXByZXNlbnRzIGEgcmVsYXR2aWUgcGh5c2ljYWwgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIG5vZGVzLgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwgZXh0ZW5kcworCQlQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsIHsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHNlZ21lbnQgb2YgdGhlIHR5cGUgVVJJIHRoYXQgcHJlZml4ZXMgYWxsIG90aGVyIHNlZ21lbnRzIGluIGEKKwkgKiByZWxhdGl2ZSBwaHlzaWNhbCByZWxhdGlvbnNoaXAgbGFiZWwgdHlwZSBVUkkuCisJICovCisJU3RyaW5nIFVSSV9UWVBFX1JFTEFUSVZFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9TRUdNRU5UID0gVVJJX1RZUEVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX1NFR01FTlQKKwkJCSsgIi9yZWxhdGl2ZSI7CisKKwkvKioKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICogICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKKwkgKi8KKwlSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSBnZXRDdXJyZW50UmVsYXRpb25zaGlwKCk7CisKK30gLy8gUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTQzNTk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuamF2YQpAQCAtMCwwICsxLDU3IEBACisvLyBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBjbGFzcyBpbiBhbiBFTUYgbW9kZWwgZm9yIGEgUGh5c2ljYWwgUmVsYXRpb25zaGlwCisgKiBMYWJlbCBWYWx1ZS4KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgZXh0ZW5kcyBMYWJlbFZhbHVlIHsKKworCS8qKgorCSAqIFRydWUgaWYgdGhlIHJlbGF0aW9uc2hpcCBpbnZvbHZlcyBwaHlzaWNhbCBjb250YWN0IChpLmUuIHRvdWNoaW5nKS4KKwkgKiBAbW9kZWwKKwkgKi8KKwlib29sZWFuIGlzQWRqYWNlbnQoKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSNpc0FkamFjZW50IDxlbT5BZGphY2VudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWRqYWNlbnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzQWRqYWNlbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEFkamFjZW50KGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgcGh5c2ljYWwgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIHRoaW5ncy4KKwkgKiBAbW9kZWwKKwkgKi8KKwlSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUjZ2V0UmVsYXRpb25zaGlwIDxlbT5SZWxhdGlvbnNoaXA8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWxhdGlvbnNoaXA8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcAorCSAqIEBzZWUgI2dldFJlbGF0aW9uc2hpcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVsYXRpb25zaGlwKFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAgdmFsdWUpOworCit9IC8vIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL1JvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYmE1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwuamF2YQpAQCAtMCwwICsxLDMxIEBACisvLyBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBhbiBFTUYgZGVmaW5pdGlvbiBvZiBhIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIGxhYmVsIGZvciBhbgorICogRWRnZSB0aGF0IHJlcHJlc2VudHMgYSB0aGUgcmVsYXRpb25zaGlwIG9mIHR3byBub2RlcyBjb25uZWN0ZWQgYnkgc29tZSB0eXBlIG9mIHJvYWQKKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsIGV4dGVuZHMKKwkJUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzZWdtZW50IG9mIHRoZSB0eXBlIFVSSSB0aGF0IHByZWZpeGVzIGFsbCBvdGhlciBzZWdtZW50cyBpbiBhCisJICogcmVsYXRpdmUgcGh5c2ljYWwgcmVsYXRpb25zaGlwIGxhYmVsIHR5cGUgVVJJLgorCSAqLworCVN0cmluZyBVUklfVFlQRV9ST0FEX1RSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfU0VHTUVOVCA9IFVSSV9UWVBFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9TRUdNRU5UCisJCQkrICIvcm9hZCI7CisKK30gLy8gQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL1JvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNDA4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8vIENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVsczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgUm9hZCBUcmFuc3BvcnQKKyAqIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZXMuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIGV4dGVuZHMKKwkJUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVleworCisJLyoqCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcm9hZAorCSAqIEBtb2RlbCBkZWZhdWx0PSJyb2FkIgorCSAqLworCVN0cmluZyBnZXRSb2FkTmFtZSgpOworCQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlI2dldFJvYWROYW1lIDxlbT5Sb2FkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvYWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0Um9hZE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFJvYWROYW1lKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjbGFzcyBvZiB0aGUgcm9hZCAoZS5nLiwgSW50ZXJzdGF0ZSwgU3RhdGUgUm91dGUsIGV0Yy4pCisJICogQG1vZGVsIGRlZmF1bHQ9InJvdXRlIgorCSAqLworCVN0cmluZyBnZXRSb2FkQ2xhc3MoKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSNnZXRSb2FkQ2xhc3MgPGVtPlJvYWQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvYWQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFJvYWRDbGFzcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Um9hZENsYXNzKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSb2FkcyBtYXkgd2FuZGVyIGJhY2sgYW5kIGZvcnRoIGFjcm9zcyBhIHNpbmdsZSBib3JkZXIuIFRoaXMgY291bnRzIHRoZSBjcm9zc2luZ3MKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgYSByb2FkIGNyb3NzZXMgYSBib3JkZXIgYmV0d2VlbiB0d28gbG9jYXRpb25zCisJICogQG1vZGVsIGRlZmF1bHQ9IjEiCisJICovCisJaW50IGdldE51bWJlckNyb3NzaW5ncygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUjZ2V0TnVtYmVyQ3Jvc3NpbmdzIDxlbT5OdW1iZXIgQ3Jvc3NpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OdW1iZXIgQ3Jvc3NpbmdzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXROdW1iZXJDcm9zc2luZ3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE51bWJlckNyb3NzaW5ncyhpbnQgdmFsdWUpOworCQorCit9IC8vIFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9UcmFuc3BvcnRNb2RlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9UcmFuc3BvcnRNb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjZjUwZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL1RyYW5zcG9ydE1vZGUuamF2YQpAQCAtMCwwICsxLDI2NiBAQAorLy8gVHJhbnNwb3J0TW9kZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBlbnVtZXJhdGlvbiBvZiB0aGUgZGlmZmVyZW50IHR5cGVzIG9mCisgKiB0cmFuc3BvcnRhdGlvbiBtb2RlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG1vdmUgcG9wdWxhdGlvbiBtZW1iZXJzIGJldHdlZW4gb25lCisgKiBsb2NhdGlvbiBhbmQgYW5vdGhlci4KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBlbnVtIFRyYW5zcG9ydE1vZGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCit7CisJLyoqCisJICogVGhlICc8ZW0+PGI+VW5zcGVjaWZpZWQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjVU5TUEVDSUZJRUQKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlVTlNQRUNJRklFRF9MSVRFUkFMKDAsICJ1bnNwZWNpZmllZCIsICJ1bnNwZWNpZmllZCIpLAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPkFpcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNBSVIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlBSVJfTElURVJBTCgyLCAiYWlyIiwgImFpciIpLAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPlJvYWQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUk9BRAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVJPQURfTElURVJBTCg0LCAicm9hZCIsICJyb2FkIiksCisJLyoqCisJICogVGhlICc8ZW0+PGI+UmFpbDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNSQUlMCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJUkFJTF9MSVRFUkFMKDYsICJyYWlsIiwgInJhaWwiKSwKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5NYXJpbmU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTUFSSU5FCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJTUFSSU5FX0xJVEVSQUwoOCwgIm1hcmluZSIsICJtYXJpbmUiKSwKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5Gb290PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0ZPT1QKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlGT09UX0xJVEVSQUwoMTAsICJmb290IiwgImZvb3QiKTsKKwkvKioKKwkgKiBAbW9kZWwgbmFtZT0idW5zcGVjaWZpZWQiCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TUEVDSUZJRUQgPSAwOworCisJLyoqCisJICogQG1vZGVsIG5hbWU9ImFpciIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBSVIgPSAyOworCisJLyoqCisJICogVmVoaWN1bGFyIHRyYW5zcG9ydAorCSAqIAorCSAqIEBtb2RlbCBuYW1lPSJyb2FkIgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPQUQgPSA0OworCisJLyoqCisJICogUmFpbCByb2FkCisJICogCisJICogQG1vZGVsIG5hbWU9InJhaWwiCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFJTCA9IDY7CisKKwkvKioKKwkgKiBUcmF2ZWwgYnkgd2F0ZXJ3YXkKKwkgKiAKKwkgKiBAbW9kZWwgbmFtZT0ibWFyaW5lIgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BUklORSA9IDg7CisKKwkvKioKKwkgKiBTZWxmLXBvd2VyZWQgd2Fsa2luZworCSAqIAorCSAqIEBtb2RlbCBuYW1lPSJmb290IgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPT1QgPSAxMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFuc3BvcnQgTW9kZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNwb3J0TW9kZVtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBUcmFuc3BvcnRNb2RlW10geworCQkJVU5TUEVDSUZJRURfTElURVJBTCwKKwkJCUFJUl9MSVRFUkFMLAorCQkJUk9BRF9MSVRFUkFMLAorCQkJUkFJTF9MSVRFUkFMLAorCQkJTUFSSU5FX0xJVEVSQUwsCisJCQlGT09UX0xJVEVSQUwsCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+VHJhbnNwb3J0IE1vZGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxUcmFuc3BvcnRNb2RlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYW5zcG9ydCBNb2RlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0TW9kZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVRyYW5zcG9ydE1vZGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc3BvcnQgTW9kZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydE1vZGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlUcmFuc3BvcnRNb2RlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc3BvcnQgTW9kZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydE1vZGUgZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIFVOU1BFQ0lGSUVEOiByZXR1cm4gVU5TUEVDSUZJRURfTElURVJBTDsKKwkJCWNhc2UgQUlSOiByZXR1cm4gQUlSX0xJVEVSQUw7CisJCQljYXNlIFJPQUQ6IHJldHVybiBST0FEX0xJVEVSQUw7CisJCQljYXNlIFJBSUw6IHJldHVybiBSQUlMX0xJVEVSQUw7CisJCQljYXNlIE1BUklORTogcmV0dXJuIE1BUklORV9MSVRFUkFMOworCQkJY2FzZSBGT09UOiByZXR1cm4gRk9PVF9MSVRFUkFMOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBUcmFuc3BvcnRNb2RlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUwZjIyZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsLmphdmEKQEAgLTAsMCArMSwyMjAgQEAKKy8vIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBhbiBFTUYgZGVmaW5pdGlvbiBvZiBhIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIGxhYmVsIGZvciBhbgorICogRWRnZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBoeXNpY2FsIHRyYW5zcG9ydGF0aW9uIG9mIHBvcHVsYXRpb24gbWVtYmVycworICogYmV0d2VlbiB0d28gbm9kZXMuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsIGV4dGVuZHMgRHluYW1pY0VkZ2VMYWJlbCB7CisKKwkvKioKKwkgKiBAbW9kZWwKKwkgKi8KKwlUcmFuc3BvcnRNb2RlIGdldFRyYW5zcG9ydE1vZGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsI2dldFRyYW5zcG9ydE1vZGUgPGVtPlRyYW5zcG9ydCBNb2RlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNwb3J0IE1vZGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0TW9kZQorCSAqIEBzZWUgI2dldFRyYW5zcG9ydE1vZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRyYW5zcG9ydE1vZGUoVHJhbnNwb3J0TW9kZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBAbW9kZWwKKwkgKi8KKwlTdHJpbmcgZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsI2dldFBvcHVsYXRpb25JZGVudGlmaWVyIDxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRQb3B1bGF0aW9uSWRlbnRpZmllcihTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0YWtlcyB0byB0cmFuc3BvcnQgdGhlIHRoYXQgZGVmaW5lcworCSAqICAgICAgICAgdGhlIHJhdGUgYXQgd2hpY2ggcG9wdWxhdGlvbiBtZW1iZXJzIGFyZSB0cmFuc3BvcnRlZC4KKwkgKiAgICAgICAgIChNaWxsaXNlY29uZHMpCisJICogQHNlZSBTVEVNVGltZQorCSAqIEBtb2RlbAorCSAqLworCWxvbmcgZ2V0UmF0ZVRpbWVQZXJpb2QoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsI2dldFJhdGVUaW1lUGVyaW9kIDxlbT5SYXRlIFRpbWUgUGVyaW9kPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlIFRpbWUgUGVyaW9kPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRSYXRlVGltZVBlcmlvZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmF0ZVRpbWVQZXJpb2QobG9uZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgdGhhdCBjYW4gZGVwYXJ0IGdpdmVuCisJICogICAgICAgICB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBkZXBhcnR1cmUgY2FwYWNpdHkuCisJICogQHNlZSBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlI2dldEF2YWlsYWJsZURlcGFydHVyZUNhcGFjaXR5UHJvcG9ydGlvbigpCisJICogQHNlZSAjZ2V0TWF4aW11bURlcGFydHVyZUNhcGFjaXR5KCkKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJaW50IGdldERlcGFydHVyZUNhcGFjaXR5KCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgdGhhdCBjYW4gZGVwYXJ0IHVzaW5nCisJICogICAgICAgICB0aGUgdHJhbnNwb3J0YXRpb24gbW9kZS9pZGVudGlmaWVyIGVhY2ggdGltZSBwZXJpb2QKKwkgKiBAc2VlICNnZXRUaW1lUGVyaW9kKCkKKwkgKiBAc2VlICNnZXRNYXhpbXVtQ2FwYWNpdHkoKQorCSAqIEBzZWUgI2dldFN0YXJ0VXBEZWxheSgpCisJICogQG1vZGVsCisJICovCisJaW50IGdldE1heGltdW1EZXBhcnR1cmVDYXBhY2l0eSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwjZ2V0TWF4aW11bURlcGFydHVyZUNhcGFjaXR5IDxlbT5NYXhpbXVtIERlcGFydHVyZSBDYXBhY2l0eTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1heGltdW0gRGVwYXJ0dXJlIENhcGFjaXR5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRNYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1heGltdW1EZXBhcnR1cmVDYXBhY2l0eShpbnQgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgY3VycmVudCBudW1iZXIgb2YgcG9wdWxhdGlvbiBtZW1iZXJzIHRoYXQgY2FuIGJlIGluIHRyYW5zaXQKKwkgKiAgICAgICAgIGF0IGFueSBvbmUgdGltZS4KKwkgKiAKKwkgKiBAc2VlIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUjZ2V0QXZhaWxhYmxlRGVwYXJ0dXJlQ2FwYWNpdHlQcm9wb3J0aW9uKCkKKwkgKiBAc2VlICNnZXRNYXhpbXVtQ2FwYWNpdHkoKQorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwlpbnQgZ2V0Q2FwYWNpdHkoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHRvdGFsIG1heGltdW0gbnVtYmVyIG9mIHBvcHVsYXRpb24gbWVtYmVycyB0aGF0IGNhbiBiZSBpbgorCSAqICAgICAgICAgdHJhbnNpdCBhdCBhbnkgb25lIHRpbWUuCisJICogQHNlZSAjZ2V0VGltZVBlcmlvZCgpCisJICogQHNlZSAjZ2V0Q2FwYWNpdHkoKQorCSAqIEBzZWUgI2dldFN0YXJ0VXBEZWxheSgpCisJICogQG1vZGVsCisJICovCisJaW50IGdldE1heGltdW1DYXBhY2l0eSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwjZ2V0TWF4aW11bUNhcGFjaXR5IDxlbT5NYXhpbXVtIENhcGFjaXR5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWF4aW11bSBDYXBhY2l0eTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TWF4aW11bUNhcGFjaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNYXhpbXVtQ2FwYWNpdHkoaW50IHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdGFrZXMgcG9wdWxhdGlvbiBtZW1iZXJzIHRvIHRyYXZlbAorCSAqICAgICAgICAgZnJvbSBvbmUgPGNvZGU+Tm9kZTwvY29kZT4gdG8gYW5vdGhlciB1c2luZyB0aGUgdGhlIHR5cGUgb2YKKwkgKiAgICAgICAgIHRyYW5zcG9ydGF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByZWxhdGlvbnNoaXAuCisJICogQG1vZGVsIGRlZmF1bHQ9MAorCSAqLworCWxvbmcgZ2V0VHJhbnNpdFRpbWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsI2dldFRyYW5zaXRUaW1lIDxlbT5UcmFuc2l0IFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zaXQgVGltZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VHJhbnNpdFRpbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRyYW5zaXRUaW1lKGxvbmcgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0YWtlcyB0aGUgdHJhbnNwb3J0YXRpb24gY2FwYWNpdHkKKwkgKiAgICAgICAgIHRvIGxpbmVhcmx5IGluY3JlYXNlIGZyb20gemVybyB0byBtYXhpbXVtIGNhcGFjaXR5LiBUaGUgZGVwYXJ0dXJlCisJICogICAgICAgICBjYXBhY2l0eSBhbHNvIGluY3JlYXNlcyBhdCB0aGlzIHJhdGUgZnJvbSAwIHRvIGl0cyBtYXhpbXVtLgorCSAqIEBzZWUgI2dldE1heGltdW1DYXBhY2l0eSgpCisJICogQHNlZSAjZ2V0RGVwYXJ0dXJlQ2FwYWNpdHkoKQorCSAqIEBtb2RlbCBkZWZhdWx0PTAKKwkgKi8KKwlsb25nIGdldFN0YXJ0VXBEZWxheSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwjZ2V0U3RhcnRVcERlbGF5IDxlbT5TdGFydCBVcCBEZWxheTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IFVwIERlbGF5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRTdGFydFVwRGVsYXkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFN0YXJ0VXBEZWxheShsb25nIHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gYSBTdHJpbmcgdGhhdCBpZGVudGlmaWVycyB0aGUgc3BlY2lmaWMgdHJhbnNwb3J0YXRpb24gaW5zdGFuY2UuCisJICogICAgICAgICBGb3IgZXhhbXBsZSwgdGhpcyBtaWdodCBiZSB0aGUgbmFtZSBvZiBhIHJvYWQuCisJICogQG1vZGVsCisJICovCisJU3RyaW5nIGdldFRyYW5zcG9ydElkZW50aWZpZXIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsI2dldFRyYW5zcG9ydElkZW50aWZpZXIgPGVtPlRyYW5zcG9ydCBJZGVudGlmaWVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNwb3J0IElkZW50aWZpZXI8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFRyYW5zcG9ydElkZW50aWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRyYW5zcG9ydElkZW50aWZpZXIoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFNlbmQgYSByZXByZXNlbnRhdGlvbiBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgdG8gYmUgInRyYW5zcG9ydGVkIiBmcm9tIHRoZQorCSAqIDxjb2RlPk5vZGU8L2NvZGU+IDxjb2RlPmhlcmU8L2NvZGU+IHRvIHRoZSBvdGhlciA8Y29kZT5Ob2RlPC9jb2RlPgorCSAqIGluIHRoZSByZWxhdGlvbnNoaXAuCisJICogCisJICogQHBhcmFtIGhlcmUKKwkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5Ob2RlPC9jb2RlPiB0aGUgcG9wdWxhdGlvbiBtZW1iZXJzIGRlcGFydCBmcm9tCisJICogQHBhcmFtIGRlcGFydGVlcworCSAqICAgICAgICAgICAgdGhlIHBvcHVsYXRpb24gbWVtYmVyIHJlcHJlc2VudGF0aW9uCisJICovCisJdm9pZCBzZW5kKGZpbmFsIE5vZGUgaGVyZSwgZmluYWwgRU9iamVjdCBkZXBhcnRlZXMpOworCisJLyoqCisJICogUmVjZWl2ZSBzb21lIHRyYXZlbGVycy4KKwkgKiAKKwkgKiBAcGFyYW0gaGVyZQorCSAqICAgICAgICAgICAgdGhlIDxjb2RlPk5vZGU8L2NvZGU+IG9mIGFycml2YWwKKwkgKiBAcGFyYW0gY3VycmVudFRpbWUKKwkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHRpbWUgb2YgdGhlIHNpbXVsYXRpb24KKwkgKiBAcmV0dXJuIGFsbCBvZiB0aGUgcmVwcmVzZW50YXRpb25zIG9mIHBvcHVsYXRpb24gbWVtYmVycyB3aG8gaGF2ZQorCSAqICAgICAgICAgdHJhdmVsZWQgdG8gdGhlIDxjb2RlPk5vZGU8L2NvZGU+IDxjb2RlPmhlcmU8L2NvZGU+IGJ5IHRoZQorCSAqICAgICAgICAgPGNvZGU+Y3VycmVudFRpbWU8L2NvZGU+CisJICogQHNlZSBTVEVNVGltZQorCSAqLworCUVMaXN0PEVPYmplY3Q+IHJlY2VpdmUoZmluYWwgTm9kZSBoZXJlLCBmaW5hbCBTVEVNVGltZSBjdXJyZW50VGltZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHRyYW5zcG9ydCByZWxhdGlvbnNoaXAgdmFsdWUKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICogICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKKwkgKi8KKwlUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIGdldEN1cnJlbnRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCk7Cit9IC8vIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlYTczMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvLyBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CisKKy8qKgorICogVGhlIHZhbHVlIG9mIGEgdHJhbnNwb3J0YXRpb24gcmVsYXRpb25zaGlwIGxhYmVsIGlzIHRoZSBjdXJyZW50IGF2YWlsYWJsZQorICogY2FwYWNpdHkgZXhwcmVzc2VkIGFzIGEgcHJvcG9ydGlvbiBvZiB0aGUgbWF4aW11bSBjYXBhY2l0eSBvZiB0aGUKKyAqIHRyYW5zcG9ydGF0aW9uIG1vZGUvaWRlbnRpZmllci4gVHlwaWNhbGx5LCB0aGlzIHZhbHVlIHdpbGwgYmUgMS4wICgxMDAlKSwgYnV0CisgKiBpdCBjb3VsZCBiZSByZWR1Y2VkIGJ5IHRyYXZlbCByZXN0cmljdGlvbnMuCisgKiAKKyAqIEBzZWUgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwjZ2V0TWF4aW11bUNhcGFjaXR5KCkKKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSBleHRlbmRzIExhYmVsVmFsdWUgeworCisJLyoqCisJICogQHJldHVybiB0aGUgcHJvcG9ydGlvbiAoaS5lLiwgMC4wLTEuMCkgb2YgdGhlIGRlcGFydHVyZSB0cmFuc3BvcnRhdGlvbgorCSAqICAgICAgICAgY2FwYWNpdHkgdGhhdCBpcyBhdmFpbGFibGUuCisJICogQHNlZSBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCNnZXREZXBhcnR1cmVDYXBhY2l0eSgpCisJICogQG1vZGVsIGRlZmF1bHQ9IjEuMCIKKwkgKi8KKwlkb3VibGUgZ2V0QXZhaWxhYmxlRGVwYXJ0dXJlQ2FwYWNpdHlQcm9wb3J0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlI2dldEF2YWlsYWJsZURlcGFydHVyZUNhcGFjaXR5UHJvcG9ydGlvbiA8ZW0+QXZhaWxhYmxlIERlcGFydHVyZSBDYXBhY2l0eSBQcm9wb3J0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgRGVwYXJ0dXJlIENhcGFjaXR5IFByb3BvcnRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEF2YWlsYWJsZURlcGFydHVyZUNhcGFjaXR5UHJvcG9ydGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QXZhaWxhYmxlRGVwYXJ0dXJlQ2FwYWNpdHlQcm9wb3J0aW9uKGRvdWJsZSB2YWx1ZSk7CisKK30gLy8gVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9BcmVhTGFiZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9pbXBsL0FyZWFMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmIxMmZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9BcmVhTGFiZWxJbXBsLmphdmEKQEAgLTAsMCArMSwxMTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuU3RhdGljTm9kZUxhYmVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcmVhIExhYmVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkFyZWFMYWJlbEltcGwjZ2V0Q3VycmVudEFyZWFWYWx1ZSA8ZW0+Q3VycmVudCBBcmVhIFZhbHVlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQXJlYUxhYmVsSW1wbCBleHRlbmRzIFN0YXRpY05vZGVMYWJlbEltcGwgaW1wbGVtZW50cyBBcmVhTGFiZWwgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIEFyZWFMYWJlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJCXNldEN1cnJlbnRWYWx1ZShMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcmVhTGFiZWxWYWx1ZSgpKTsKKwl9IC8vIEFyZWFMYWJlbEltcGwKKworCS8qKgorCSAqIEBwYXJhbSBhZG1pbkxldmVsCisJICogQHBhcmFtIGNvdW50cnlDb2RlCisJICogQHBhcmFtIG5vZGVDb2RlCisJICogQHJldHVybiB0aGUgVVJJIGZvciBhIHNwZWNpZmljIGFyZWEgbGFiZWwgZm9yIGEgZ2VvZ3JhcGhpYyByZWdpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVBcmVhTGFiZWxVUkkoZmluYWwgaW50IGFkbWluTGV2ZWwsCisJCQlmaW5hbCBTdHJpbmcgY291bnRyeUNvZGUsIGZpbmFsIFN0cmluZyBub2RlQ29kZSkgeworCQlmaW5hbCBVUkkgcmV0VmFsdWUgPSBTVEVNVVJJLmNyZWF0ZVVSSShVUklfVFlQRV9BUkVBX0xBQkVMX1NFR01FTlQKKwkJCQkrICIvIiArIGNvdW50cnlDb2RlICsgIi8iICsgYWRtaW5MZXZlbCArICIvIiArIG5vZGVDb2RlKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlQXJlYUxhYmVsVVJJCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLkFSRUFfTEFCRUw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgQXJlYUxhYmVsVmFsdWUgZ2V0Q3VycmVudEFyZWFWYWx1ZSgpIHsKKwkJcmV0dXJuIChBcmVhTGFiZWxWYWx1ZSkgZ2V0Q3VycmVudFZhbHVlKCk7CisJfSAvLyBnZXRDdXJyZW50QXJlYVZhbHVlCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcGFyYW0gcmVzb2x2ZQorCSAqIEBwYXJhbSBjb3JlVHlwZQorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLkFSRUFfTEFCRUxfX0NVUlJFTlRfQVJFQV9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0Q3VycmVudEFyZWFWYWx1ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5BUkVBX0xBQkVMX19DVVJSRU5UX0FSRUFfVkFMVUU6CisJCQkJcmV0dXJuIGdldEN1cnJlbnRBcmVhVmFsdWUoKSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy8gQXJlYUxhYmVsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9BcmVhTGFiZWxWYWx1ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvQXJlYUxhYmVsVmFsdWVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg3ZjNiMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvQXJlYUxhYmVsVmFsdWVJbXBsLmphdmEKQEAgLTAsMCArMSwyNzIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbFZhbHVlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcmVhIExhYmVsIFZhbHVlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkFyZWFMYWJlbFZhbHVlSW1wbCNnZXRBcmVhIDxlbT5BcmVhPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkFyZWFMYWJlbFZhbHVlSW1wbCNnZXRBdmVyYWdlRXh0ZW50IDxlbT5BdmVyYWdlIEV4dGVudDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCitwdWJsaWMgY2xhc3MgQXJlYUxhYmVsVmFsdWVJbXBsIGV4dGVuZHMgTGFiZWxWYWx1ZUltcGwgaW1wbGVtZW50cworCQlBcmVhTGFiZWxWYWx1ZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFyZWEoKSA8ZW0+QXJlYTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFyZWEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIEFSRUFfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcmVhKCkgPGVtPkFyZWE8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBcmVhKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIGFyZWEgPSBBUkVBX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2ZXJhZ2VFeHRlbnQoKSA8ZW0+QXZlcmFnZSBFeHRlbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEF2ZXJhZ2VFeHRlbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIEFWRVJBR0VfRVhURU5UX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZlcmFnZUV4dGVudCgpIDxlbT5BdmVyYWdlIEV4dGVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QXZlcmFnZUV4dGVudCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBhdmVyYWdlRXh0ZW50ID0gQVZFUkFHRV9FWFRFTlRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFyZWFMYWJlbFZhbHVlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLkFSRUFfTEFCRUxfVkFMVUU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0QXJlYSgpIHsKKwkJcmV0dXJuIGFyZWE7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbFZhbHVlSW1wbCNyZXNldCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCS8vIFdlIGRvbid0IHJlc2V0CisJfSAvLyByZXNldAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIjc2FuZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2FuZSgpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CisKKwkJLy8gVGhlIGFyZWEgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgZ2V0QXJlYSgpID4gMDsKKwkJLy9hc3NlcnQgcmV0VmFsdWU7CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gc2FuZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmV3QXJlYQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgc2V0QXJlYShkb3VibGUgbmV3QXJlYSkgeworCQlkb3VibGUgb2xkQXJlYSA9IGFyZWE7CisJCWFyZWEgPSBuZXdBcmVhOworCQlpZihhcmVhID49IDEuMCkgeworCQkJc2V0QXZlcmFnZUV4dGVudChNYXRoLnNxcnQoYXJlYSkpOworCQl9IGVsc2UgeworCQkJc2V0QXZlcmFnZUV4dGVudCgxLjApOworCQl9CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExhYmVsc1BhY2thZ2UuQVJFQV9MQUJFTF9WQUxVRV9fQVJFQSwgb2xkQXJlYSwgYXJlYSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0QXZlcmFnZUV4dGVudCgpIHsKKwkJcmV0dXJuIGF2ZXJhZ2VFeHRlbnQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QXZlcmFnZUV4dGVudChkb3VibGUgbmV3QXZlcmFnZUV4dGVudCkgeworCQlkb3VibGUgb2xkQXZlcmFnZUV4dGVudCA9IGF2ZXJhZ2VFeHRlbnQ7CisJCWF2ZXJhZ2VFeHRlbnQgPSBuZXdBdmVyYWdlRXh0ZW50OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBMYWJlbHNQYWNrYWdlLkFSRUFfTEFCRUxfVkFMVUVfX0FWRVJBR0VfRVhURU5ULCBvbGRBdmVyYWdlRXh0ZW50LCBhdmVyYWdlRXh0ZW50KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogQHBhcmFtIHJlc29sdmUKKwkgKiBAcGFyYW0gY29yZVR5cGUKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLkFSRUFfTEFCRUxfVkFMVUVfX0FSRUE6CisJCQkJcmV0dXJuIGdldEFyZWEoKTsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5BUkVBX0xBQkVMX1ZBTFVFX19BVkVSQUdFX0VYVEVOVDoKKwkJCQlyZXR1cm4gZ2V0QXZlcmFnZUV4dGVudCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSBuZXdWYWx1ZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLkFSRUFfTEFCRUxfVkFMVUVfX0FSRUE6CisJCQkJc2V0QXJlYSgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIExhYmVsc1BhY2thZ2UuQVJFQV9MQUJFTF9WQUxVRV9fQVZFUkFHRV9FWFRFTlQ6CisJCQkJc2V0QXZlcmFnZUV4dGVudCgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5BUkVBX0xBQkVMX1ZBTFVFX19BUkVBOgorCQkJCXNldEFyZWEoQVJFQV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLkFSRUFfTEFCRUxfVkFMVUVfX0FWRVJBR0VfRVhURU5UOgorCQkJCXNldEF2ZXJhZ2VFeHRlbnQoQVZFUkFHRV9FWFRFTlRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuQVJFQV9MQUJFTF9WQUxVRV9fQVJFQToKKwkJCQlyZXR1cm4gYXJlYSAhPSBBUkVBX0VERUZBVUxUOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLkFSRUFfTEFCRUxfVkFMVUVfX0FWRVJBR0VfRVhURU5UOgorCQkJCXJldHVybiBhdmVyYWdlRXh0ZW50ICE9IEFWRVJBR0VfRVhURU5UX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKQorCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJcmVzdWx0LmFwcGVuZChhcmVhKTsKKwkJcmVzdWx0LmFwcGVuZCgiIGttXjIiKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvLyBBcmVhTGFiZWxWYWx1ZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9pbXBsL0NvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhN2IxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9pbXBsL0NvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlTGFiZWw7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuRWRnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc1BhY2thZ2U7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29tbW9uIEJvcmRlciBSZWxhdGlvbnNoaXAgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbEltcGwgZXh0ZW5kcworCQlQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsSW1wbCBpbXBsZW1lbnRzIENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJCXNldEN1cnJlbnRWYWx1ZShMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkpOworCX0gLy8gQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxJbXBsCisKKwkvKioKKwkgKiBDcmVhdGUgYW4gZWRnZSBiZXR3ZWVuIHR3byBub2RlcyB0aGF0IHJlcHJlc2VudHMgdGhlIHJlbGF0aW9uc2hpcCBvZgorCSAqIHNoYXJpbmcgYSBjb21tb24gYm9yZGVyLgorCSAqIAorCSAqIEBwYXJhbSBub2RlQQorCSAqICAgICAgICAgICAgdGhlIGZpcnN0IG5vZGUKKwkgKiBAcGFyYW0gbm9kZUIKKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgbm9kZQorCSAqIEBwYXJhbSBib3JkZXJMZW5ndGgKKwkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGJvcmRlciAoa20ncykKKwkgKiBAcmV0dXJuIGFuIGVkZ2UgYmV0d2VlbiB0aGUgdHdvIG5vZGVzCisJICovCisJcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZUNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcChmaW5hbCBOb2RlIG5vZGVBLAorCQkJZmluYWwgTm9kZSBub2RlQiwgZmluYWwgaW50IGJvcmRlckxlbmd0aCkgeworCQlmaW5hbCBFZGdlIHJldFZhbHVlID0gRWRnZUltcGwuY3JlYXRlRWRnZShub2RlQSwgbm9kZUIpOworCQlmaW5hbCBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCBsYWJlbCA9IExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZUNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsKCk7CisJCWxhYmVsLnNldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQocmV0VmFsdWUuZ2V0VVJJKCkpOworCisJCWZpbmFsIENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUgbGFiZWxWYWx1ZSA9IChDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKSBsYWJlbAorCQkJCS5nZXRDdXJyZW50VmFsdWUoKTsKKwkJbGFiZWxWYWx1ZS5zZXRCb3JkZXJMZW5ndGgoYm9yZGVyTGVuZ3RoKTsKKworCQlyZXRWYWx1ZS5zZXRMYWJlbChsYWJlbCk7CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwCisKKwkvKioKKwkgKiBAcGFyYW0gbm9kZQorCSAqICAgICAgICAgICAgdGhlIG5vZGUKKwkgKiBAcmV0dXJuIHRoZSBFZGdlcyB0aGF0IHJlcHJlc2VudCB0aGUgY29tbW9uIGJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbgorCSAqICAgICAgICAgdGhlIG5vZGUgYW5kIG90aGVyIG5vZGVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdDxFZGdlPiBnZXRDb21tb25Cb3JkZXJFZGdlc0Zyb21Ob2RlKGZpbmFsIE5vZGUgbm9kZSkgeworCQlmaW5hbCBMaXN0PEVkZ2U+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxFZGdlPigpOworCisJCWlmKG5vZGUgPT0gbnVsbCB8fCBub2RlLmdldEVkZ2VzKCkgPT0gbnVsbCkgcmV0dXJuIHJldFZhbHVlOworCQkKKwkJZm9yIChJdGVyYXRvcjxFZGdlPiBlZGdlSXRlciA9IG5vZGUuZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBlZGdlSXRlci5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBFZGdlIGVkZ2UgPSBlZGdlSXRlci5uZXh0KCk7CisJCQlmaW5hbCBFZGdlTGFiZWwgZWRnZUxhYmVsID0gZWRnZS5nZXRMYWJlbCgpOworCQkJLy8gSXMgdGhlIGxhYmVsIGEgY29tbW9uIGJvcmRlciBsYWJlbD8KKwkJCWlmIChlZGdlTGFiZWwgaW5zdGFuY2VvZiBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCkgeworCQkJCS8vIFllcworCQkJCXJldFZhbHVlLmFkZChlZGdlKTsKKwkJCX0KKwkJfSAvLyBmb3IKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRDb21tb25Cb3JkZXJFZGdlc0Zyb21Ob2RlCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLkNPTU1PTl9CT1JERVJfUkVMQVRJT05TSElQX0xBQkVMOworCX0KKworfSAvLyBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTkxNmI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29tbW9uIEJvcmRlciBSZWxhdGlvbnNoaXAgTGFiZWwgVmFsdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwjZ2V0Qm9yZGVyTGVuZ3RoIDxlbT5Cb3JkZXIgTGVuZ3RoPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwgZXh0ZW5kcworCQlQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsIGltcGxlbWVudHMKKwkJQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvcmRlckxlbmd0aCgpIDxlbT5Cb3JkZXIgTGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Qm9yZGVyTGVuZ3RoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBCT1JERVJfTEVOR1RIX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9yZGVyTGVuZ3RoKCkgPGVtPkJvcmRlciBMZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRCb3JkZXJMZW5ndGgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgYm9yZGVyTGVuZ3RoID0gQk9SREVSX0xFTkdUSF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gTGFiZWxzUGFja2FnZS5MaXRlcmFscy5DT01NT05fQk9SREVSX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRCb3JkZXJMZW5ndGgoKSB7CisJCXJldHVybiBib3JkZXJMZW5ndGg7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Qm9yZGVyTGVuZ3RoKGRvdWJsZSBuZXdCb3JkZXJMZW5ndGgpIHsKKwkJZG91YmxlIG9sZEJvcmRlckxlbmd0aCA9IGJvcmRlckxlbmd0aDsKKwkJYm9yZGVyTGVuZ3RoID0gbmV3Qm9yZGVyTGVuZ3RoOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBMYWJlbHNQYWNrYWdlLkNPTU1PTl9CT1JERVJfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19CT1JERVJfTEVOR1RILCBvbGRCb3JkZXJMZW5ndGgsIGJvcmRlckxlbmd0aCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuQ09NTU9OX0JPUkRFUl9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX0JPUkRFUl9MRU5HVEg6CisJCQkJcmV0dXJuIGdldEJvcmRlckxlbmd0aCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLkNPTU1PTl9CT1JERVJfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19CT1JERVJfTEVOR1RIOgorCQkJCXNldEJvcmRlckxlbmd0aCgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5DT01NT05fQk9SREVSX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fQk9SREVSX0xFTkdUSDoKKwkJCQlzZXRCb3JkZXJMZW5ndGgoQk9SREVSX0xFTkdUSF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLkNPTU1PTl9CT1JERVJfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19CT1JERVJfTEVOR1RIOgorCQkJCXJldHVybiBib3JkZXJMZW5ndGggIT0gQk9SREVSX0xFTkdUSF9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChib3JkZXJMZW5ndGg6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoYm9yZGVyTGVuZ3RoKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vIENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9pbXBsL0VhcnRoU2NpZW5jZUxhYmVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9FYXJ0aFNjaWVuY2VMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGY4YmJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9FYXJ0aFNjaWVuY2VMYWJlbEltcGwuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuU3RhdGljTm9kZUxhYmVsSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkVhcnRoU2NpZW5jZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkVhcnRoU2NpZW5jZUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWFydGggU2NpZW5jZSBMYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5FYXJ0aFNjaWVuY2VMYWJlbEltcGwjZ2V0Q3VycmVudEVhcnRoU2NpZW5jZVZhbHVlIDxlbT5DdXJyZW50IEVhcnRoIFNjaWVuY2UgVmFsdWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFYXJ0aFNjaWVuY2VMYWJlbEltcGwgZXh0ZW5kcyBTdGF0aWNOb2RlTGFiZWxJbXBsIGltcGxlbWVudHMgRWFydGhTY2llbmNlTGFiZWwgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgRWFydGhTY2llbmNlTGFiZWxJbXBsKCkgeworCQlzdXBlcigpOworCQlzZXRDdXJyZW50VmFsdWUoTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRWFydGhTY2llbmNlTGFiZWxWYWx1ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuRUFSVEhfU0NJRU5DRV9MQUJFTDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIEVhcnRoU2NpZW5jZUxhYmVsVmFsdWUgZ2V0Q3VycmVudEVhcnRoU2NpZW5jZVZhbHVlKCkgeworCQlyZXR1cm4gKEVhcnRoU2NpZW5jZUxhYmVsVmFsdWUpZ2V0Q3VycmVudFZhbHVlKCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGFkbWluTGV2ZWwKKwkgKiBAcGFyYW0gY291bnRyeUNvZGUKKwkgKiBAcGFyYW0gbm9kZUNvZGUKKwkgKiBAcmV0dXJuIHRoZSBVUkkgZm9yIGEgc3BlY2lmaWMgYXJlYSBsYWJlbCBmb3IgYSBnZW9ncmFwaGljIHJlZ2lvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZUVhcnRoU2NpZW5jZUxhYmVsVVJJKGZpbmFsIGludCBhZG1pbkxldmVsLAorCQkJZmluYWwgU3RyaW5nIGNvdW50cnlDb2RlLCBmaW5hbCBTdHJpbmcgbm9kZUNvZGUsIGZpbmFsIFN0cmluZyBkYXRhVHlwZSkgeworCQlmaW5hbCBVUkkgcmV0VmFsdWUgPSBTVEVNVVJJLmNyZWF0ZVVSSShVUklfVFlQRV9FQVJUSF9TQ0lFTkNFX0xBQkVMX1NFR01FTlQKKwkJCQkrICIvIiArIGNvdW50cnlDb2RlICsgIi8iICsgYWRtaW5MZXZlbCArICIvIiArIG5vZGVDb2RlKyIvIitkYXRhVHlwZSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUFyZWFMYWJlbFVSSQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5FQVJUSF9TQ0lFTkNFX0xBQkVMX19DVVJSRU5UX0VBUlRIX1NDSUVOQ0VfVkFMVUU6CisJCQkJcmV0dXJuIGdldEN1cnJlbnRFYXJ0aFNjaWVuY2VWYWx1ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuRUFSVEhfU0NJRU5DRV9MQUJFTF9fQ1VSUkVOVF9FQVJUSF9TQ0lFTkNFX1ZBTFVFOgorCQkJCXJldHVybiBnZXRDdXJyZW50RWFydGhTY2llbmNlVmFsdWUoKSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy9FYXJ0aFNjaWVuY2VMYWJlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvRWFydGhTY2llbmNlTGFiZWxWYWx1ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvRWFydGhTY2llbmNlTGFiZWxWYWx1ZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODk4OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9FYXJ0aFNjaWVuY2VMYWJlbFZhbHVlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjY2IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbFZhbHVlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkVhcnRoU2NpZW5jZUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVhcnRoIFNjaWVuY2UgTGFiZWwgVmFsdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuRWFydGhTY2llbmNlTGFiZWxWYWx1ZUltcGwjZ2V0RGF0YSA8ZW0+RGF0YTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5FYXJ0aFNjaWVuY2VMYWJlbFZhbHVlSW1wbCNnZXREYXRhVHlwZSA8ZW0+RGF0YSBUeXBlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkVhcnRoU2NpZW5jZUxhYmVsVmFsdWVJbXBsI2dldFVuaXRzIDxlbT5Vbml0czwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEVhcnRoU2NpZW5jZUxhYmVsVmFsdWVJbXBsIGV4dGVuZHMgTGFiZWxWYWx1ZUltcGwgaW1wbGVtZW50cyBFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhKCkgPGVtPkRhdGE8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGF0YSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PERvdWJsZT4gZGF0YTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhVHlwZSgpIDxlbT5EYXRhIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERhdGFUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1RZUEVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YVR5cGUoKSA8ZW0+RGF0YSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREYXRhVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBkYXRhVHlwZSA9IERBVEFfVFlQRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbml0cygpIDxlbT5Vbml0czwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VW5pdHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVOSVRTX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaXRzKCkgPGVtPlVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRVbml0cygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyB1bml0cyA9IFVOSVRTX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEVhcnRoU2NpZW5jZUxhYmVsVmFsdWVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gTGFiZWxzUGFja2FnZS5MaXRlcmFscy5FQVJUSF9TQ0lFTkNFX0xBQkVMX1ZBTFVFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxEb3VibGU+IGdldERhdGEoKSB7CisJCWlmIChkYXRhID09IG51bGwpIHsKKwkJCWRhdGEgPSBuZXcgRURhdGFUeXBlRUxpc3Q8RG91YmxlPihEb3VibGUuY2xhc3MsIHRoaXMsIExhYmVsc1BhY2thZ2UuRUFSVEhfU0NJRU5DRV9MQUJFTF9WQUxVRV9fREFUQSk7CisJCX0KKwkJcmV0dXJuIGRhdGE7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXREYXRhVHlwZSgpIHsKKwkJcmV0dXJuIGRhdGFUeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERhdGFUeXBlKFN0cmluZyBuZXdEYXRhVHlwZSkgeworCQlTdHJpbmcgb2xkRGF0YVR5cGUgPSBkYXRhVHlwZTsKKwkJZGF0YVR5cGUgPSBuZXdEYXRhVHlwZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTGFiZWxzUGFja2FnZS5FQVJUSF9TQ0lFTkNFX0xBQkVMX1ZBTFVFX19EQVRBX1RZUEUsIG9sZERhdGFUeXBlLCBkYXRhVHlwZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pdHMoKSB7CisJCXJldHVybiB1bml0czsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRVbml0cyhTdHJpbmcgbmV3VW5pdHMpIHsKKwkJU3RyaW5nIG9sZFVuaXRzID0gdW5pdHM7CisJCXVuaXRzID0gbmV3VW5pdHM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExhYmVsc1BhY2thZ2UuRUFSVEhfU0NJRU5DRV9MQUJFTF9WQUxVRV9fVU5JVFMsIG9sZFVuaXRzLCB1bml0cykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5FQVJUSF9TQ0lFTkNFX0xBQkVMX1ZBTFVFX19EQVRBOgorCQkJCXJldHVybiBnZXREYXRhKCk7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuRUFSVEhfU0NJRU5DRV9MQUJFTF9WQUxVRV9fREFUQV9UWVBFOgorCQkJCXJldHVybiBnZXREYXRhVHlwZSgpOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLkVBUlRIX1NDSUVOQ0VfTEFCRUxfVkFMVUVfX1VOSVRTOgorCQkJCXJldHVybiBnZXRVbml0cygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuRUFSVEhfU0NJRU5DRV9MQUJFTF9WQUxVRV9fREFUQToKKwkJCQlnZXREYXRhKCkuY2xlYXIoKTsKKwkJCQlnZXREYXRhKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEb3VibGU+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIExhYmVsc1BhY2thZ2UuRUFSVEhfU0NJRU5DRV9MQUJFTF9WQUxVRV9fREFUQV9UWVBFOgorCQkJCXNldERhdGFUeXBlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5FQVJUSF9TQ0lFTkNFX0xBQkVMX1ZBTFVFX19VTklUUzoKKwkJCQlzZXRVbml0cygoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLkVBUlRIX1NDSUVOQ0VfTEFCRUxfVkFMVUVfX0RBVEE6CisJCQkJZ2V0RGF0YSgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLkVBUlRIX1NDSUVOQ0VfTEFCRUxfVkFMVUVfX0RBVEFfVFlQRToKKwkJCQlzZXREYXRhVHlwZShEQVRBX1RZUEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5FQVJUSF9TQ0lFTkNFX0xBQkVMX1ZBTFVFX19VTklUUzoKKwkJCQlzZXRVbml0cyhVTklUU19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuRUFSVEhfU0NJRU5DRV9MQUJFTF9WQUxVRV9fREFUQToKKwkJCQlyZXR1cm4gZGF0YSAhPSBudWxsICYmICFkYXRhLmlzRW1wdHkoKTsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5FQVJUSF9TQ0lFTkNFX0xBQkVMX1ZBTFVFX19EQVRBX1RZUEU6CisJCQkJcmV0dXJuIERBVEFfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZGF0YVR5cGUgIT0gbnVsbCA6ICFEQVRBX1RZUEVfRURFRkFVTFQuZXF1YWxzKGRhdGFUeXBlKTsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5FQVJUSF9TQ0lFTkNFX0xBQkVMX1ZBTFVFX19VTklUUzoKKwkJCQlyZXR1cm4gVU5JVFNfRURFRkFVTFQgPT0gbnVsbCA/IHVuaXRzICE9IG51bGwgOiAhVU5JVFNfRURFRkFVTFQuZXF1YWxzKHVuaXRzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRhdGE6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZGF0YSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgZGF0YVR5cGU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZGF0YVR5cGUpOworCQlyZXN1bHQuYXBwZW5kKCIsIHVuaXRzOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHVuaXRzKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vRWFydGhTY2llbmNlTGFiZWxWYWx1ZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvTGFiZWxzRmFjdG9yeUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvTGFiZWxzRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzNmZGI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9MYWJlbHNGYWN0b3J5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMzQ1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy4qOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkFyZWFMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRNb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTGFiZWxzRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBMYWJlbHNGYWN0b3J5IHsKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBMYWJlbHNGYWN0b3J5IGluaXQoKSB7CisJCXRyeSB7CisJCQlMYWJlbHNGYWN0b3J5IHRoZUxhYmVsc0ZhY3RvcnkgPSAoTGFiZWxzRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy5lY29yZSIpOyAvLyROT04tTkxTLTEkIAorCQkJaWYgKHRoZUxhYmVsc0ZhY3RvcnkgIT0gbnVsbCkgeworCQkJCXJldHVybiB0aGVMYWJlbHNGYWN0b3J5OworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IExhYmVsc0ZhY3RvcnlJbXBsKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGFiZWxzRmFjdG9yeUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKKwkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5BUkVBX0xBQkVMOiByZXR1cm4gY3JlYXRlQXJlYUxhYmVsKCk7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuQVJFQV9MQUJFTF9WQUxVRTogcmV0dXJuIGNyZWF0ZUFyZWFMYWJlbFZhbHVlKCk7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuQ09NTU9OX0JPUkRFUl9SRUxBVElPTlNISVBfTEFCRUw6IHJldHVybiBjcmVhdGVDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCgpOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLkNPTU1PTl9CT1JERVJfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFOiByZXR1cm4gY3JlYXRlQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlBPUFVMQVRJT05fTEFCRUw6IHJldHVybiBjcmVhdGVQb3B1bGF0aW9uTGFiZWwoKTsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMX1ZBTFVFOiByZXR1cm4gY3JlYXRlUG9wdWxhdGlvbkxhYmVsVmFsdWUoKTsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5SRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUw6IHJldHVybiBjcmVhdGVSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwoKTsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5SRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUU6IHJldHVybiBjcmVhdGVSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUw6IHJldHVybiBjcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCgpOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUU6IHJldHVybiBjcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCk7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFOiByZXR1cm4gY3JlYXRlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCk7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMOiByZXR1cm4gY3JlYXRlUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKCk7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFOiByZXR1cm4gY3JlYXRlUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKTsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5FQVJUSF9TQ0lFTkNFX0xBQkVMOiByZXR1cm4gY3JlYXRlRWFydGhTY2llbmNlTGFiZWwoKTsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5FQVJUSF9TQ0lFTkNFX0xBQkVMX1ZBTFVFOiByZXR1cm4gY3JlYXRlRWFydGhTY2llbmNlTGFiZWxWYWx1ZSgpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQOgorCQkJCXJldHVybiBjcmVhdGVSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX01PREU6CisJCQkJcmV0dXJuIGNyZWF0ZVRyYW5zcG9ydE1vZGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlJFTEFUSVZFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUDoKKwkJCQlyZXR1cm4gY29udmVydFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9NT0RFOgorCQkJCXJldHVybiBjb252ZXJ0VHJhbnNwb3J0TW9kZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFyZWFMYWJlbCBjcmVhdGVBcmVhTGFiZWwoKSB7CisJCUFyZWFMYWJlbEltcGwgYXJlYUxhYmVsID0gbmV3IEFyZWFMYWJlbEltcGwoKTsKKwkJcmV0dXJuIGFyZWFMYWJlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQXJlYUxhYmVsVmFsdWUgY3JlYXRlQXJlYUxhYmVsVmFsdWUoKSB7CisJCUFyZWFMYWJlbFZhbHVlSW1wbCBhcmVhTGFiZWxWYWx1ZSA9IG5ldyBBcmVhTGFiZWxWYWx1ZUltcGwoKTsKKwkJcmV0dXJuIGFyZWFMYWJlbFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCBjcmVhdGVDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCgpIHsKKwkJQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxJbXBsIGNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsID0gbmV3IENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsSW1wbCgpOworCQlyZXR1cm4gY29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUgY3JlYXRlQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpIHsKKwkJQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwgY29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSA9IG5ldyBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCgpOworCQlyZXR1cm4gY29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUG9wdWxhdGlvbkxhYmVsIGNyZWF0ZVBvcHVsYXRpb25MYWJlbCgpIHsKKwkJUG9wdWxhdGlvbkxhYmVsSW1wbCBwb3B1bGF0aW9uTGFiZWwgPSBuZXcgUG9wdWxhdGlvbkxhYmVsSW1wbCgpOworCQlyZXR1cm4gcG9wdWxhdGlvbkxhYmVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQb3B1bGF0aW9uTGFiZWxWYWx1ZSBjcmVhdGVQb3B1bGF0aW9uTGFiZWxWYWx1ZSgpIHsKKwkJUG9wdWxhdGlvbkxhYmVsVmFsdWVJbXBsIHBvcHVsYXRpb25MYWJlbFZhbHVlID0gbmV3IFBvcHVsYXRpb25MYWJlbFZhbHVlSW1wbCgpOworCQlyZXR1cm4gcG9wdWxhdGlvbkxhYmVsVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCBjcmVhdGVSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwoKSB7CisJCVJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEltcGwgcmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsID0gbmV3IFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEltcGwoKTsKKwkJcmV0dXJuIHJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgY3JlYXRlUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKSB7CisJCVJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCByZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSA9IG5ldyBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwoKTsKKwkJcmV0dXJuIHJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCBjcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCgpIHsKKwkJVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsIHRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsID0gbmV3IFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSW1wbCgpOworCQlyZXR1cm4gdHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgY3JlYXRlVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpIHsKKwkJVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwgdHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSA9IG5ldyBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCgpOworCQlyZXR1cm4gdHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIGNyZWF0ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpIHsKKwkJUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCBwaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgPSBuZXcgUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCgpOworCQlyZXR1cm4gcGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwgY3JlYXRlUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKCkgeworCQlSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsIHJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCA9IG5ldyBSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsKCk7CisJCXJldHVybiByb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIGNyZWF0ZVJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkgeworCQlSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwgcm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgPSBuZXcgUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsKCk7CisJCXJldHVybiByb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWFydGhTY2llbmNlTGFiZWwgY3JlYXRlRWFydGhTY2llbmNlTGFiZWwoKSB7CisJCUVhcnRoU2NpZW5jZUxhYmVsSW1wbCBlYXJ0aFNjaWVuY2VMYWJlbCA9IG5ldyBFYXJ0aFNjaWVuY2VMYWJlbEltcGwoKTsKKwkJcmV0dXJuIGVhcnRoU2NpZW5jZUxhYmVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlIGNyZWF0ZUVhcnRoU2NpZW5jZUxhYmVsVmFsdWUoKSB7CisJCUVhcnRoU2NpZW5jZUxhYmVsVmFsdWVJbXBsIGVhcnRoU2NpZW5jZUxhYmVsVmFsdWUgPSBuZXcgRWFydGhTY2llbmNlTGFiZWxWYWx1ZUltcGwoKTsKKwkJcmV0dXJuIGVhcnRoU2NpZW5jZUxhYmVsVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAgY3JlYXRlUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwIHJlc3VsdCA9IFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAuZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVHJhbnNwb3J0TW9kZSBjcmVhdGVUcmFuc3BvcnRNb2RlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCVRyYW5zcG9ydE1vZGUgcmVzdWx0ID0gVHJhbnNwb3J0TW9kZS5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0VHJhbnNwb3J0TW9kZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMYWJlbHNQYWNrYWdlIGdldExhYmVsc1BhY2thZ2UoKSB7CisJCXJldHVybiAoTGFiZWxzUGFja2FnZSlnZXRFUGFja2FnZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGRlcHJlY2F0ZWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQERlcHJlY2F0ZWQKKwlwdWJsaWMgc3RhdGljIExhYmVsc1BhY2thZ2UgZ2V0UGFja2FnZSgpIHsKKwkJcmV0dXJuIExhYmVsc1BhY2thZ2UuZUlOU1RBTkNFOworCX0KKworfSAvL0xhYmVsc0ZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9pbXBsL0xhYmVsc1BhY2thZ2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9pbXBsL0xhYmVsc1BhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2MWI3MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvTGFiZWxzUGFja2FnZUltcGwuamF2YQpAQCAtMCwwICsxLDk2MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLkVkZ2VzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuRWRnZXNQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5FYXJ0aFNjaWVuY2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5FYXJ0aFNjaWVuY2VMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydE1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLk5vZGVzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLmltcGwuTm9kZXNQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLlR5cGVzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLmltcGwuVHlwZXNQYWNrYWdlSW1wbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBMYWJlbHNQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIExhYmVsc1BhY2thZ2UgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGFyZWFMYWJlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBhcmVhTGFiZWxWYWx1ZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcG9wdWxhdGlvbkxhYmVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHBvcHVsYXRpb25MYWJlbFZhbHVlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyByZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyByb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgcm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZWFydGhTY2llbmNlTGFiZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZWFydGhTY2llbmNlTGFiZWxWYWx1ZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVFbnVtIHJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBFRW51bSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVFbnVtIHRyYW5zcG9ydE1vZGVFRW51bSA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKKwkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KKwkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCisJICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKKwkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBMYWJlbHNQYWNrYWdlSW1wbCgpIHsKKwkJc3VwZXIoZU5TX1VSSSwgTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIExhYmVsc1BhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIExhYmVsc1BhY2thZ2UgaW5pdCgpIHsKKwkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKExhYmVsc1BhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTGFiZWxzUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCisJCUxhYmVsc1BhY2thZ2VJbXBsIHRoZUxhYmVsc1BhY2thZ2UgPSAoTGFiZWxzUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIExhYmVsc1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IExhYmVsc1BhY2thZ2VJbXBsKCkpOworCisJCWlzSW5pdGVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKKwkJR3JhcGhQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCU1vZGlmaWVyUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCVNjZW5hcmlvUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCVNlcXVlbmNlclBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCQlTb2x2ZXJQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcworCQlFZGdlc1BhY2thZ2VJbXBsIHRoZUVkZ2VzUGFja2FnZSA9IChFZGdlc1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFZGdlc1BhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFZGdlc1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWRnZXNQYWNrYWdlLmVOU19VUkkpIDogRWRnZXNQYWNrYWdlLmVJTlNUQU5DRSk7CisJCU5vZGVzUGFja2FnZUltcGwgdGhlTm9kZXNQYWNrYWdlID0gKE5vZGVzUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE5vZGVzUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIE5vZGVzUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShOb2Rlc1BhY2thZ2UuZU5TX1VSSSkgOiBOb2Rlc1BhY2thZ2UuZUlOU1RBTkNFKTsKKwkJVHlwZXNQYWNrYWdlSW1wbCB0aGVUeXBlc1BhY2thZ2UgPSAoVHlwZXNQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVHlwZXNQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVHlwZXNQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFR5cGVzUGFja2FnZS5lTlNfVVJJKSA6IFR5cGVzUGFja2FnZS5lSU5TVEFOQ0UpOworCisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCisJCXRoZUxhYmVsc1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUVkZ2VzUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlTm9kZXNQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVUeXBlc1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQorCQl0aGVMYWJlbHNQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlRWRnZXNQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlTm9kZXNQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlVHlwZXNQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCisJCXRoZUxhYmVsc1BhY2thZ2UuZnJlZXplKCk7CisKKyAgCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoTGFiZWxzUGFja2FnZS5lTlNfVVJJLCB0aGVMYWJlbHNQYWNrYWdlKTsKKwkJcmV0dXJuIHRoZUxhYmVsc1BhY2thZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRBcmVhTGFiZWwoKSB7CisJCXJldHVybiBhcmVhTGFiZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QXJlYUxhYmVsX0N1cnJlbnRBcmVhVmFsdWUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlhcmVhTGFiZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEFyZWFMYWJlbFZhbHVlKCkgeworCQlyZXR1cm4gYXJlYUxhYmVsVmFsdWVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJlYUxhYmVsVmFsdWVfQXJlYSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWFyZWFMYWJlbFZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJlYUxhYmVsVmFsdWVfQXZlcmFnZUV4dGVudCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWFyZWFMYWJlbFZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCgpIHsKKwkJcmV0dXJuIGNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Q29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpIHsKKwkJcmV0dXJuIGNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9Cb3JkZXJMZW5ndGgoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsKCkgeworCQlyZXR1cm4gcGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFBvcHVsYXRpb25MYWJlbCgpIHsKKwkJcmV0dXJuIHBvcHVsYXRpb25MYWJlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3B1bGF0aW9uTGFiZWxfUG9wdWxhdGlvbklkZW50aWZpZXIoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwb3B1bGF0aW9uTGFiZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3B1bGF0aW9uTGFiZWxfTmFtZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXBvcHVsYXRpb25MYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBvcHVsYXRpb25MYWJlbF9DdXJyZW50UG9wdWxhdGlvblZhbHVlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcG9wdWxhdGlvbkxhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9wdWxhdGlvbkxhYmVsX1BvcHVsYXRlZEFyZWEoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwb3B1bGF0aW9uTGFiZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3B1bGF0aW9uTGFiZWxfVmFsaWRZZWFyKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9wdWxhdGlvbkxhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQb3B1bGF0aW9uTGFiZWxWYWx1ZSgpIHsKKwkJcmV0dXJuIHBvcHVsYXRpb25MYWJlbFZhbHVlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvcHVsYXRpb25MYWJlbFZhbHVlX0NvdW50KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9wdWxhdGlvbkxhYmVsVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCgpIHsKKwkJcmV0dXJuIHJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxfQ3VycmVudFJlbGF0aW9uc2hpcCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKSB7CisJCXJldHVybiByZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9BZGphY2VudCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVfUmVsYXRpb25zaGlwKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKCkgeworCQlyZXR1cm4gdHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfVHJhbnNwb3J0TW9kZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfUG9wdWxhdGlvbklkZW50aWZpZXIoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX1RyYW5zcG9ydElkZW50aWZpZXIoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX0N1cnJlbnRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpdHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9SYXRlVGltZVBlcmlvZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfRGVwYXJ0dXJlQ2FwYWNpdHkoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX01heGltdW1EZXBhcnR1cmVDYXBhY2l0eSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfQ2FwYWNpdHkoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX01heGltdW1DYXBhY2l0eSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfVHJhbnNpdFRpbWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX1N0YXJ0VXBEZWxheSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpIHsKKwkJcmV0dXJuIHRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9BdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb24oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKSB7CisJCXJldHVybiBwaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwoKSB7CisJCXJldHVybiByb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpIHsKKwkJcmV0dXJuIHJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX1JvYWROYW1lKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9Sb2FkQ2xhc3MoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlyb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX051bWJlckNyb3NzaW5ncygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRFYXJ0aFNjaWVuY2VMYWJlbCgpIHsKKwkJcmV0dXJuIGVhcnRoU2NpZW5jZUxhYmVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVhcnRoU2NpZW5jZUxhYmVsX0N1cnJlbnRFYXJ0aFNjaWVuY2VWYWx1ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWVhcnRoU2NpZW5jZUxhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlKCkgeworCQlyZXR1cm4gZWFydGhTY2llbmNlTGFiZWxWYWx1ZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlX0RhdGEoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSllYXJ0aFNjaWVuY2VMYWJlbFZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWFydGhTY2llbmNlTGFiZWxWYWx1ZV9EYXRhVHlwZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWVhcnRoU2NpZW5jZUxhYmVsVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlX1VuaXRzKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWFydGhTY2llbmNlTGFiZWxWYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRW51bSBnZXRSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwKCkgeworCQlyZXR1cm4gcmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcEVFbnVtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRW51bSBnZXRUcmFuc3BvcnRNb2RlKCkgeworCQlyZXR1cm4gdHJhbnNwb3J0TW9kZUVFbnVtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMYWJlbHNGYWN0b3J5IGdldExhYmVsc0ZhY3RvcnkoKSB7CisJCXJldHVybiAoTGFiZWxzRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCisJICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOworCQlpc0NyZWF0ZWQgPSB0cnVlOworCisJCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcworCQlhcmVhTGFiZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVJFQV9MQUJFTCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoYXJlYUxhYmVsRUNsYXNzLCBBUkVBX0xBQkVMX19DVVJSRU5UX0FSRUFfVkFMVUUpOworCisJCWFyZWFMYWJlbFZhbHVlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSRUFfTEFCRUxfVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKGFyZWFMYWJlbFZhbHVlRUNsYXNzLCBBUkVBX0xBQkVMX1ZBTFVFX19BUkVBKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShhcmVhTGFiZWxWYWx1ZUVDbGFzcywgQVJFQV9MQUJFTF9WQUxVRV9fQVZFUkFHRV9FWFRFTlQpOworCisJCWNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTU1PTl9CT1JERVJfUkVMQVRJT05TSElQX0xBQkVMKTsKKworCQljb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTU1PTl9CT1JERVJfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlRUNsYXNzLCBDT01NT05fQk9SREVSX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fQk9SREVSX0xFTkdUSCk7CisKKwkJcGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUwpOworCisJCXBvcHVsYXRpb25MYWJlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1BVTEFUSU9OX0xBQkVMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwb3B1bGF0aW9uTGFiZWxFQ2xhc3MsIFBPUFVMQVRJT05fTEFCRUxfX1BPUFVMQVRJT05fSURFTlRJRklFUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocG9wdWxhdGlvbkxhYmVsRUNsYXNzLCBQT1BVTEFUSU9OX0xBQkVMX19OQU1FKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShwb3B1bGF0aW9uTGFiZWxFQ2xhc3MsIFBPUFVMQVRJT05fTEFCRUxfX0NVUlJFTlRfUE9QVUxBVElPTl9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocG9wdWxhdGlvbkxhYmVsRUNsYXNzLCBQT1BVTEFUSU9OX0xBQkVMX19QT1BVTEFURURfQVJFQSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocG9wdWxhdGlvbkxhYmVsRUNsYXNzLCBQT1BVTEFUSU9OX0xBQkVMX19WQUxJRF9ZRUFSKTsKKworCQlwb3B1bGF0aW9uTGFiZWxWYWx1ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1BVTEFUSU9OX0xBQkVMX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwb3B1bGF0aW9uTGFiZWxWYWx1ZUVDbGFzcywgUE9QVUxBVElPTl9MQUJFTF9WQUxVRV9fQ09VTlQpOworCisJCXJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUwpOworCQljcmVhdGVFUmVmZXJlbmNlKHJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcywgUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX19DVVJSRU5UX1JFTEFUSU9OU0hJUCk7CisKKwkJcmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShyZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUVDbGFzcywgUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19BREpBQ0VOVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVFQ2xhc3MsIFJFTEFUSVZFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fUkVMQVRJT05TSElQKTsKKworCQl0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcywgVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fVFJBTlNQT1JUX01PREUpOworCQljcmVhdGVFQXR0cmlidXRlKHRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsRUNsYXNzLCBUUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIpOworCQljcmVhdGVFQXR0cmlidXRlKHRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsRUNsYXNzLCBUUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19UUkFOU1BPUlRfSURFTlRJRklFUik7CisJCWNyZWF0ZUVSZWZlcmVuY2UodHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxFQ2xhc3MsIFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX0NVUlJFTlRfVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxFQ2xhc3MsIFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1JBVEVfVElNRV9QRVJJT0QpOworCQljcmVhdGVFQXR0cmlidXRlKHRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsRUNsYXNzLCBUUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19ERVBBUlRVUkVfQ0FQQUNJVFkpOworCQljcmVhdGVFQXR0cmlidXRlKHRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsRUNsYXNzLCBUUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19NQVhJTVVNX0RFUEFSVFVSRV9DQVBBQ0lUWSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxFQ2xhc3MsIFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX0NBUEFDSVRZKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcywgVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fTUFYSU1VTV9DQVBBQ0lUWSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxFQ2xhc3MsIFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1RSQU5TSVRfVElNRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxFQ2xhc3MsIFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1NUQVJUX1VQX0RFTEFZKTsKKworCQl0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKHRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVFQ2xhc3MsIFRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX0FWQUlMQUJMRV9ERVBBUlRVUkVfQ0FQQUNJVFlfUFJPUE9SVElPTik7CisKKwkJcGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRSk7CisKKwkJcm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPQURfVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTCk7CisKKwkJcm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShyb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUVDbGFzcywgUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19ST0FEX05BTUUpOworCQljcmVhdGVFQXR0cmlidXRlKHJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlRUNsYXNzLCBST0FEX1RSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX1JPQURfQ0xBU1MpOworCQljcmVhdGVFQXR0cmlidXRlKHJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlRUNsYXNzLCBST0FEX1RSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX05VTUJFUl9DUk9TU0lOR1MpOworCisJCWVhcnRoU2NpZW5jZUxhYmVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVBUlRIX1NDSUVOQ0VfTEFCRUwpOworCQljcmVhdGVFUmVmZXJlbmNlKGVhcnRoU2NpZW5jZUxhYmVsRUNsYXNzLCBFQVJUSF9TQ0lFTkNFX0xBQkVMX19DVVJSRU5UX0VBUlRIX1NDSUVOQ0VfVkFMVUUpOworCisJCWVhcnRoU2NpZW5jZUxhYmVsVmFsdWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUFSVEhfU0NJRU5DRV9MQUJFTF9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZWFydGhTY2llbmNlTGFiZWxWYWx1ZUVDbGFzcywgRUFSVEhfU0NJRU5DRV9MQUJFTF9WQUxVRV9fREFUQSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZWFydGhTY2llbmNlTGFiZWxWYWx1ZUVDbGFzcywgRUFSVEhfU0NJRU5DRV9MQUJFTF9WQUxVRV9fREFUQV9UWVBFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShlYXJ0aFNjaWVuY2VMYWJlbFZhbHVlRUNsYXNzLCBFQVJUSF9TQ0lFTkNFX0xBQkVMX1ZBTFVFX19VTklUUyk7CisKKwkJLy8gQ3JlYXRlIGVudW1zCisJCXJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBFRW51bSA9IGNyZWF0ZUVFbnVtKFJFTEFUSVZFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUCk7CisJCXRyYW5zcG9ydE1vZGVFRW51bSA9IGNyZWF0ZUVFbnVtKFRSQU5TUE9SVF9NT0RFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOworCisJLyoqCisJICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKKwkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47CisJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgcGFja2FnZQorCQlzZXROYW1lKGVOQU1FKTsKKwkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7CisJCXNldE5zVVJJKGVOU19VUkkpOworCisJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKKwkJR3JhcGhQYWNrYWdlIHRoZUdyYXBoUGFja2FnZSA9IChHcmFwaFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoR3JhcGhQYWNrYWdlLmVOU19VUkkpOworCQlFY29yZVBhY2thZ2UgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycworCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycworCisJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJYXJlYUxhYmVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUdyYXBoUGFja2FnZS5nZXRTdGF0aWNOb2RlTGFiZWwoKSk7CisJCWFyZWFMYWJlbFZhbHVlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUdyYXBoUGFja2FnZS5nZXRMYWJlbFZhbHVlKCkpOworCQljb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwoKSk7CisJCWNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKSk7CisJCXBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlR3JhcGhQYWNrYWdlLmdldFN0YXRpY0VkZ2VMYWJlbCgpKTsKKwkJcG9wdWxhdGlvbkxhYmVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUdyYXBoUGFja2FnZS5nZXRTdGF0aWNOb2RlTGFiZWwoKSk7CisJCXBvcHVsYXRpb25MYWJlbFZhbHVlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUdyYXBoUGFja2FnZS5nZXRMYWJlbFZhbHVlKCkpOworCQlyZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsKCkpOworCQlyZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVHcmFwaFBhY2thZ2UuZ2V0TGFiZWxWYWx1ZSgpKTsKKwkJdHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlR3JhcGhQYWNrYWdlLmdldER5bmFtaWNFZGdlTGFiZWwoKSk7CisJCXRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlR3JhcGhQYWNrYWdlLmdldExhYmVsVmFsdWUoKSk7CisJCXBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVHcmFwaFBhY2thZ2UuZ2V0TGFiZWxWYWx1ZSgpKTsKKwkJcm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCgpKTsKKwkJcm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKSk7CisJCWVhcnRoU2NpZW5jZUxhYmVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUdyYXBoUGFja2FnZS5nZXRTdGF0aWNOb2RlTGFiZWwoKSk7CisJCWVhcnRoU2NpZW5jZUxhYmVsVmFsdWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlR3JhcGhQYWNrYWdlLmdldExhYmVsVmFsdWUoKSk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKwkJaW5pdEVDbGFzcyhhcmVhTGFiZWxFQ2xhc3MsIEFyZWFMYWJlbC5jbGFzcywgIkFyZWFMYWJlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRBcmVhTGFiZWxfQ3VycmVudEFyZWFWYWx1ZSgpLCB0aGlzLmdldEFyZWFMYWJlbFZhbHVlKCksIG51bGwsICJjdXJyZW50QXJlYVZhbHVlIiwgbnVsbCwgMCwgMSwgQXJlYUxhYmVsLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhhcmVhTGFiZWxWYWx1ZUVDbGFzcywgQXJlYUxhYmVsVmFsdWUuY2xhc3MsICJBcmVhTGFiZWxWYWx1ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRBcmVhTGFiZWxWYWx1ZV9BcmVhKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJhcmVhIiwgbnVsbCwgMCwgMSwgQXJlYUxhYmVsVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJlYUxhYmVsVmFsdWVfQXZlcmFnZUV4dGVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiYXZlcmFnZUV4dGVudCIsIG51bGwsIDAsIDEsIEFyZWFMYWJlbFZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhjb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcywgQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWwuY2xhc3MsICJDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MoY29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUVDbGFzcywgQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5jbGFzcywgIkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9Cb3JkZXJMZW5ndGgoKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImJvcmRlckxlbmd0aCIsIG51bGwsIDAsIDEsIENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxFQ2xhc3MsIFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwuY2xhc3MsICJQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHBvcHVsYXRpb25MYWJlbEVDbGFzcywgUG9wdWxhdGlvbkxhYmVsLmNsYXNzLCAiUG9wdWxhdGlvbkxhYmVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFBvcHVsYXRpb25MYWJlbF9Qb3B1bGF0aW9uSWRlbnRpZmllcigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicG9wdWxhdGlvbklkZW50aWZpZXIiLCBudWxsLCAwLCAxLCBQb3B1bGF0aW9uTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9wdWxhdGlvbkxhYmVsX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBQb3B1bGF0aW9uTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UG9wdWxhdGlvbkxhYmVsX0N1cnJlbnRQb3B1bGF0aW9uVmFsdWUoKSwgdGhpcy5nZXRQb3B1bGF0aW9uTGFiZWxWYWx1ZSgpLCBudWxsLCAiY3VycmVudFBvcHVsYXRpb25WYWx1ZSIsIG51bGwsIDAsIDEsIFBvcHVsYXRpb25MYWJlbC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRQb3B1bGF0aW9uTGFiZWxfUG9wdWxhdGVkQXJlYSgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAicG9wdWxhdGVkQXJlYSIsICIwIiwgMCwgMSwgUG9wdWxhdGlvbkxhYmVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9wdWxhdGlvbkxhYmVsX1ZhbGlkWWVhcigpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAidmFsaWRZZWFyIiwgIjIwMDYiLCAwLCAxLCBQb3B1bGF0aW9uTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCWluaXRFQ2xhc3MocG9wdWxhdGlvbkxhYmVsVmFsdWVFQ2xhc3MsIFBvcHVsYXRpb25MYWJlbFZhbHVlLmNsYXNzLCAiUG9wdWxhdGlvbkxhYmVsVmFsdWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9wdWxhdGlvbkxhYmVsVmFsdWVfQ291bnQoKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImNvdW50IiwgbnVsbCwgMCwgMSwgUG9wdWxhdGlvbkxhYmVsVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEVDbGFzcywgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsLmNsYXNzLCAiUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbF9DdXJyZW50UmVsYXRpb25zaGlwKCksIHRoaXMuZ2V0UmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKSwgbnVsbCwgImN1cnJlbnRSZWxhdGlvbnNoaXAiLCBudWxsLCAwLCAxLCBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlRUNsYXNzLCBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5jbGFzcywgIlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX0FkamFjZW50KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiYWRqYWNlbnQiLCBudWxsLCAwLCAxLCBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9SZWxhdGlvbnNoaXAoKSwgdGhpcy5nZXRSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwKCksICJyZWxhdGlvbnNoaXAiLCBudWxsLCAwLCAxLCBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3ModHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxFQ2xhc3MsIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsLmNsYXNzLCAiVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfVHJhbnNwb3J0TW9kZSgpLCB0aGlzLmdldFRyYW5zcG9ydE1vZGUoKSwgInRyYW5zcG9ydE1vZGUiLCBudWxsLCAwLCAxLCBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9Qb3B1bGF0aW9uSWRlbnRpZmllcigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicG9wdWxhdGlvbklkZW50aWZpZXIiLCBudWxsLCAwLCAxLCBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9UcmFuc3BvcnRJZGVudGlmaWVyKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0cmFuc3BvcnRJZGVudGlmaWVyIiwgbnVsbCwgMCwgMSwgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfQ3VycmVudFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKSwgdGhpcy5nZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCksIG51bGwsICJjdXJyZW50VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSIsIG51bGwsIDAsIDEsIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX1JhdGVUaW1lUGVyaW9kKCksIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAicmF0ZVRpbWVQZXJpb2QiLCBudWxsLCAwLCAxLCBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9EZXBhcnR1cmVDYXBhY2l0eSgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAiZGVwYXJ0dXJlQ2FwYWNpdHkiLCBudWxsLCAwLCAxLCBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX01heGltdW1EZXBhcnR1cmVDYXBhY2l0eSgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAibWF4aW11bURlcGFydHVyZUNhcGFjaXR5IiwgbnVsbCwgMCwgMSwgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfQ2FwYWNpdHkoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgImNhcGFjaXR5IiwgbnVsbCwgMCwgMSwgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9NYXhpbXVtQ2FwYWNpdHkoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgIm1heGltdW1DYXBhY2l0eSIsIG51bGwsIDAsIDEsIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX1RyYW5zaXRUaW1lKCksIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAidHJhbnNpdFRpbWUiLCBudWxsLCAwLCAxLCBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9TdGFydFVwRGVsYXkoKSwgZWNvcmVQYWNrYWdlLmdldEVMb25nKCksICJzdGFydFVwRGVsYXkiLCBudWxsLCAwLCAxLCBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3ModHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUVDbGFzcywgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5jbGFzcywgIlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9BdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImF2YWlsYWJsZURlcGFydHVyZUNhcGFjaXR5UHJvcG9ydGlvbiIsICIxLjAiLCAwLCAxLCBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQlpbml0RUNsYXNzKHBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUVDbGFzcywgUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmNsYXNzLCAiUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhyb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxFQ2xhc3MsIFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbC5jbGFzcywgIlJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3Mocm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVFQ2xhc3MsIFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmNsYXNzLCAiUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVfUm9hZE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJvYWROYW1lIiwgInJvYWQiLCAwLCAxLCBSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX1JvYWRDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicm9hZENsYXNzIiwgInJvdXRlIiwgMCwgMSwgUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RUF0dHJpYnV0ZShnZXRSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9OdW1iZXJDcm9zc2luZ3MoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgIm51bWJlckNyb3NzaW5ncyIsICIxIiwgMCwgMSwgUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCWluaXRFQ2xhc3MoZWFydGhTY2llbmNlTGFiZWxFQ2xhc3MsIEVhcnRoU2NpZW5jZUxhYmVsLmNsYXNzLCAiRWFydGhTY2llbmNlTGFiZWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RWFydGhTY2llbmNlTGFiZWxfQ3VycmVudEVhcnRoU2NpZW5jZVZhbHVlKCksIHRoaXMuZ2V0RWFydGhTY2llbmNlTGFiZWxWYWx1ZSgpLCBudWxsLCAiY3VycmVudEVhcnRoU2NpZW5jZVZhbHVlIiwgbnVsbCwgMCwgMSwgRWFydGhTY2llbmNlTGFiZWwuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGVhcnRoU2NpZW5jZUxhYmVsVmFsdWVFQ2xhc3MsIEVhcnRoU2NpZW5jZUxhYmVsVmFsdWUuY2xhc3MsICJFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEVhcnRoU2NpZW5jZUxhYmVsVmFsdWVfRGF0YSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiZGF0YSIsIG51bGwsIDAsIC0xLCBFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlX0RhdGFUeXBlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkYXRhVHlwZSIsIG51bGwsIDAsIDEsIEVhcnRoU2NpZW5jZUxhYmVsVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWFydGhTY2llbmNlTGFiZWxWYWx1ZV9Vbml0cygpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidW5pdHMiLCBudWxsLCAwLCAxLCBFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKKwkJaW5pdEVFbnVtKHJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBFRW51bSwgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcC5jbGFzcywgIlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAiKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFRW51bUxpdGVyYWwocmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcEVFbnVtLCBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwLlVOU1BFQ0lGSUVEX0xJVEVSQUwpOworCQlhZGRFRW51bUxpdGVyYWwocmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcEVFbnVtLCBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwLkFCT1ZFX0xJVEVSQUwpOworCQlhZGRFRW51bUxpdGVyYWwocmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcEVFbnVtLCBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwLkJFTE9XX0xJVEVSQUwpOworCQlhZGRFRW51bUxpdGVyYWwocmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcEVFbnVtLCBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwLlJJR0hUX09GX0xJVEVSQUwpOworCQlhZGRFRW51bUxpdGVyYWwocmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcEVFbnVtLCBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwLkxFRlRfT0ZfTElURVJBTCk7CisJCWFkZEVFbnVtTGl0ZXJhbChyZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwRUVudW0sIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAuTk9SVEhfT0ZfTElURVJBTCk7CisJCWFkZEVFbnVtTGl0ZXJhbChyZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwRUVudW0sIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAuU09VVEhfT0ZfTElURVJBTCk7CisJCWFkZEVFbnVtTGl0ZXJhbChyZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwRUVudW0sIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAuV0VTVF9PRl9MSVRFUkFMKTsKKwkJYWRkRUVudW1MaXRlcmFsKHJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBFRW51bSwgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcC5FQVNUX09GX0xJVEVSQUwpOworCQlhZGRFRW51bUxpdGVyYWwocmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcEVFbnVtLCBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwLkNPTlRBSU5TX0xJVEVSQUwpOworCQlhZGRFRW51bUxpdGVyYWwocmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcEVFbnVtLCBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwLkNPTlRBSU5FRF9CWV9MSVRFUkFMKTsKKwkJYWRkRUVudW1MaXRlcmFsKHJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBFRW51bSwgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcC5PVkVSTEFQU19MSVRFUkFMKTsKKwkJYWRkRUVudW1MaXRlcmFsKHJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBFRW51bSwgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcC5PUkJJVFNfTElURVJBTCk7CisKKwkJaW5pdEVFbnVtKHRyYW5zcG9ydE1vZGVFRW51bSwgVHJhbnNwb3J0TW9kZS5jbGFzcywgIlRyYW5zcG9ydE1vZGUiKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFRW51bUxpdGVyYWwodHJhbnNwb3J0TW9kZUVFbnVtLCBUcmFuc3BvcnRNb2RlLlVOU1BFQ0lGSUVEX0xJVEVSQUwpOworCQlhZGRFRW51bUxpdGVyYWwodHJhbnNwb3J0TW9kZUVFbnVtLCBUcmFuc3BvcnRNb2RlLkFJUl9MSVRFUkFMKTsKKwkJYWRkRUVudW1MaXRlcmFsKHRyYW5zcG9ydE1vZGVFRW51bSwgVHJhbnNwb3J0TW9kZS5ST0FEX0xJVEVSQUwpOworCQlhZGRFRW51bUxpdGVyYWwodHJhbnNwb3J0TW9kZUVFbnVtLCBUcmFuc3BvcnRNb2RlLlJBSUxfTElURVJBTCk7CisJCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc3BvcnRNb2RlRUVudW0sIFRyYW5zcG9ydE1vZGUuTUFSSU5FX0xJVEVSQUwpOworCQlhZGRFRW51bUxpdGVyYWwodHJhbnNwb3J0TW9kZUVFbnVtLCBUcmFuc3BvcnRNb2RlLkZPT1RfTElURVJBTCk7CisKKwkJLy8gQ3JlYXRlIHJlc291cmNlCisJCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCX0KKworfSAvL0xhYmVsc1BhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9pbXBsL1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9pbXBsL1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5MmE5MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEltcGwuamF2YQpAQCAtMCwwICsxLDY0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuU3RhdGljRWRnZUxhYmVsSW1wbDsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuRHluYW1pY0VkZ2VMYWJlbEltcGw7CisvLworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKy8vCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKy8vCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CisvLworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworLy8KKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkxhYmVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsSW1wbCBleHRlbmRzIFN0YXRpY0VkZ2VMYWJlbEltcGwgaW1wbGVtZW50cyBQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTDsKKwl9CisKK30gLy9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwY2IzYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxWYWx1ZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwgZXh0ZW5kcyBMYWJlbFZhbHVlSW1wbCBpbXBsZW1lbnRzIFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRTsKKwl9CisKK30gLy9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9Qb3B1bGF0aW9uTGFiZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9pbXBsL1BvcHVsYXRpb25MYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWI4ODk5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9Qb3B1bGF0aW9uTGFiZWxJbXBsLmphdmEKQEAgLTAsMCArMSw0MzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5TdGF0aWNOb2RlTGFiZWxJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnCisgKiA8ZW0+PGI+UG9wdWxhdGlvbiBMYWJlbDwvYj48L2VtPicuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlBvcHVsYXRpb25MYWJlbEltcGwjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIgPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5Qb3B1bGF0aW9uTGFiZWxJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuUG9wdWxhdGlvbkxhYmVsSW1wbCNnZXRDdXJyZW50UG9wdWxhdGlvblZhbHVlIDxlbT5DdXJyZW50IFBvcHVsYXRpb24gVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuUG9wdWxhdGlvbkxhYmVsSW1wbCNnZXRQb3B1bGF0ZWRBcmVhIDxlbT5Qb3B1bGF0ZWQgQXJlYTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5Qb3B1bGF0aW9uTGFiZWxJbXBsI2dldFZhbGlkWWVhciA8ZW0+VmFsaWQgWWVhcjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBvcHVsYXRpb25MYWJlbEltcGwgZXh0ZW5kcyBTdGF0aWNOb2RlTGFiZWxJbXBsIGltcGxlbWVudHMKKwkJUG9wdWxhdGlvbkxhYmVsIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSA8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9QVUxBVElPTl9JREVOVElGSUVSX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkgPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgcG9wdWxhdGlvbklkZW50aWZpZXIgPSBQT1BVTEFUSU9OX0lERU5USUZJRVJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcHVsYXRlZEFyZWEoKSA8ZW0+UG9wdWxhdGVkIEFyZWE8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBvcHVsYXRlZEFyZWEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFBPUFVMQVRFRF9BUkVBX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9wdWxhdGVkQXJlYSgpIDxlbT5Qb3B1bGF0ZWQgQXJlYTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UG9wdWxhdGVkQXJlYSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBwb3B1bGF0ZWRBcmVhID0gUE9QVUxBVEVEX0FSRUFfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsaWRZZWFyKCkgPGVtPlZhbGlkIFllYXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbGlkWWVhcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURfWUVBUl9FREVGQVVMVCA9IDIwMDY7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWxpZFllYXIoKSA8ZW0+VmFsaWQgWWVhcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmFsaWRZZWFyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IHZhbGlkWWVhciA9IFZBTElEX1lFQVJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBQb3B1bGF0aW9uTGFiZWxJbXBsKCkgeworCQlzdXBlcigpOworCQlzZXRUeXBlVVJJKFBvcHVsYXRpb25MYWJlbC5VUklfVFlQRV9QT1BVTEFUSU9OX0xBQkVMKTsKKwkJc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoUG9wdWxhdGlvbkxhYmVsLkhVTUFOKTsKKwkJc2V0Q3VycmVudFZhbHVlKExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvcHVsYXRpb25MYWJlbFZhbHVlKCkpOworCX0gLy8gUG9wdWxhdGlvbkxhYmVsSW1wbAorCisJLyoqCisJICogQHBhcmFtIGFkbWluTGV2ZWwKKwkgKiBAcGFyYW0gY291bnRyeUNvZGUKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbklkZW50aWZpZXIKKwkgKiBAcGFyYW0geWVhcgorCSAqICAgICAgICAgICAgdGhlIHllYXIgZm9yIHdoaWNoIHRoZSBwb3B1bGF0aW9uIGRhdGEgaXMgdmFsaWQKKwkgKiBAcGFyYW0gbm9kZUNvZGUKKwkgKiBAcmV0dXJuIHRoZSBVUkkgZm9yIGEgc3BlY2lmaWMgcG9wdWxhdGlvbiBsYWJlbCBmb3IgYSBnZW9ncmFwaGljIHJlZ2lvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVBvcHVsYXRpb25MYWJlbFVSSShmaW5hbCBpbnQgYWRtaW5MZXZlbCwKKwkJCWZpbmFsIFN0cmluZyBjb3VudHJ5Q29kZSwgZmluYWwgU3RyaW5nIHBvcHVsYXRpb25JZGVudGlmaWVyLAorCQkJZmluYWwgU3RyaW5nIHllYXIsIGZpbmFsIFN0cmluZyBub2RlQ29kZSkgeworCQlmaW5hbCBVUkkgcmV0VmFsdWUgPSBTVEVNVVJJCisJCQkJLmNyZWF0ZVVSSShQb3B1bGF0aW9uTGFiZWwuVVJJX1RZUEVfUE9QVUxBVElPTl9MQUJFTF9TRUdNRU5UCisJCQkJCQkrICIvIiArIGNvdW50cnlDb2RlICsgIi8iICsgYWRtaW5MZXZlbCArICIvIgorCQkJCQkJKyBwb3B1bGF0aW9uSWRlbnRpZmllciArICIvIiArIHllYXIgKyAiLyIgKyBub2RlQ29kZSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZVBvcHVsYXRpb25MYWJlbFVSSQorCisJLyoqCisJICogCisJICogQHBhcmFtIHBvcHVsYXRpb25JZGVudGlmaWVyCisJICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBvZiB0aGUgcG9wdWxhdGlvbgorCSAqIEBwYXJhbSBub2RlCisJICogICAgICAgICAgICB0aGUgbm9kZSB3aXRoIHRoZSBsYWJlbAorCSAqIEByZXR1cm4gdGhlIHBvcHVsYXRpb24gbGFiZWwgZm9yIHRoZSBwb3B1bGF0aW9uIG9uIHRoZSBub2RlLCBvciBudWxsIGlmCisJICogICAgICAgICB0aGVyZSBpc24ndCBvbmUuCisJICovCisJcHVibGljIHN0YXRpYyBQb3B1bGF0aW9uTGFiZWwgZ2V0UG9wdWxhdGlvbkxhYmVsKAorCQkJZmluYWwgU3RyaW5nIHBvcHVsYXRpb25JZGVudGlmaWVyLCBmaW5hbCBOb2RlIG5vZGUpIHsKKwkJUG9wdWxhdGlvbkxhYmVsIHJldFZhbHVlID0gbnVsbDsKKworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPE5vZGVMYWJlbD4gbm9kZUxhYmVsSXRlciA9IG5vZGUuZ2V0TGFiZWxzKCkKKwkJCQkuaXRlcmF0b3IoKTsgbm9kZUxhYmVsSXRlci5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBOb2RlTGFiZWwgbm9kZUxhYmVsID0gbm9kZUxhYmVsSXRlci5uZXh0KCk7CisJCQkvLyBJcyB0aGlzIGEgUG9wdWxhdGlvbkxhYmVsPworCQkJaWYgKG5vZGVMYWJlbCBpbnN0YW5jZW9mIFBvcHVsYXRpb25MYWJlbCkgeworCQkJCS8vIFllcworCQkJCWZpbmFsIFBvcHVsYXRpb25MYWJlbCBwb3B1bGF0aW9uTGFiZWwgPSAoUG9wdWxhdGlvbkxhYmVsKSBub2RlTGFiZWw7CisJCQkJLy8gVGhlIGNvcnJlY3QgcG9wdWxhdGlvbj8KKwkJCQlpZiAocG9wdWxhdGlvbkxhYmVsLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkuZXF1YWxzSWdub3JlQ2FzZSgKKwkJCQkJCXBvcHVsYXRpb25JZGVudGlmaWVyKSkgeworCQkJCQkvLyBZZXMKKwkJCQkJcmV0VmFsdWUgPSBwb3B1bGF0aW9uTGFiZWw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSAvLyBmb3IKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0UG9wdWxhdGlvbkxhYmVsCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlBPUFVMQVRJT05fTEFCRUw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkgeworCQlyZXR1cm4gcG9wdWxhdGlvbklkZW50aWZpZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmV3UG9wdWxhdGlvbklkZW50aWZpZXIKKwkgKiAKKwkgKiAgICAgICAgICAgIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQb3B1bGF0aW9uSWRlbnRpZmllcihTdHJpbmcgbmV3UG9wdWxhdGlvbklkZW50aWZpZXIpIHsKKwkJU3RyaW5nIG9sZFBvcHVsYXRpb25JZGVudGlmaWVyID0gcG9wdWxhdGlvbklkZW50aWZpZXI7CisJCXBvcHVsYXRpb25JZGVudGlmaWVyID0gbmV3UG9wdWxhdGlvbklkZW50aWZpZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExhYmVsc1BhY2thZ2UuUE9QVUxBVElPTl9MQUJFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSLCBvbGRQb3B1bGF0aW9uSWRlbnRpZmllciwgcG9wdWxhdGlvbklkZW50aWZpZXIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCS8vIElzIGEgbmFtZSBzZXQ/CisJCWlmIChlSXNTZXQoTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMX19OQU1FKSkgeworCQkJcmV0dXJuIG5hbWU7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKwkJfQorCX0gLy8gZ2V0TmFtZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmV3TmFtZQorCSAqIAorCSAqICAgICAgICAgICAgPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOworCQluYW1lID0gbmV3TmFtZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFBvcHVsYXRpb25MYWJlbFZhbHVlIGdldEN1cnJlbnRQb3B1bGF0aW9uVmFsdWUoKSB7CisJCXJldHVybiAoUG9wdWxhdGlvbkxhYmVsVmFsdWUpIGdldEN1cnJlbnRWYWx1ZSgpOworCX0gLy8gZ2V0Q3VycmVudFBvcHVsYXRpb25WYWx1ZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0UG9wdWxhdGVkQXJlYSgpIHsKKwkJcmV0dXJuIHBvcHVsYXRlZEFyZWE7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBvcHVsYXRlZEFyZWEoZG91YmxlIG5ld1BvcHVsYXRlZEFyZWEpIHsKKwkJZG91YmxlIG9sZFBvcHVsYXRlZEFyZWEgPSBwb3B1bGF0ZWRBcmVhOworCQlwb3B1bGF0ZWRBcmVhID0gbmV3UG9wdWxhdGVkQXJlYTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMX19QT1BVTEFURURfQVJFQSwgb2xkUG9wdWxhdGVkQXJlYSwgcG9wdWxhdGVkQXJlYSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsaWRZZWFyKCkgeworCQlyZXR1cm4gdmFsaWRZZWFyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbGlkWWVhcihpbnQgbmV3VmFsaWRZZWFyKSB7CisJCWludCBvbGRWYWxpZFllYXIgPSB2YWxpZFllYXI7CisJCXZhbGlkWWVhciA9IG5ld1ZhbGlkWWVhcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMX19WQUxJRF9ZRUFSLCBvbGRWYWxpZFllYXIsIHZhbGlkWWVhcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSByZXNvbHZlCisJICogQHBhcmFtIGNvcmVUeXBlCisJICogQHJldHVybiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlBPUFVMQVRJT05fTEFCRUxfX1BPUFVMQVRJT05fSURFTlRJRklFUjoKKwkJCQlyZXR1cm4gZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMX19OQU1FOgorCQkJCXJldHVybiBnZXROYW1lKCk7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUE9QVUxBVElPTl9MQUJFTF9fQ1VSUkVOVF9QT1BVTEFUSU9OX1ZBTFVFOgorCQkJCXJldHVybiBnZXRDdXJyZW50UG9wdWxhdGlvblZhbHVlKCk7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUE9QVUxBVElPTl9MQUJFTF9fUE9QVUxBVEVEX0FSRUE6CisJCQkJcmV0dXJuIGdldFBvcHVsYXRlZEFyZWEoKTsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMX19WQUxJRF9ZRUFSOgorCQkJCXJldHVybiBnZXRWYWxpZFllYXIoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcGFyYW0gbmV3VmFsdWUKKwkgKiAKKwkgKiAgICAgICAgICAgIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlBPUFVMQVRJT05fTEFCRUxfX1BPUFVMQVRJT05fSURFTlRJRklFUjoKKwkJCQlzZXRQb3B1bGF0aW9uSWRlbnRpZmllcigoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUE9QVUxBVElPTl9MQUJFTF9fTkFNRToKKwkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMX19QT1BVTEFURURfQVJFQToKKwkJCQlzZXRQb3B1bGF0ZWRBcmVhKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMX19WQUxJRF9ZRUFSOgorCQkJCXNldFZhbGlkWWVhcigoSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogCisJICogICAgICAgICAgICA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMX19QT1BVTEFUSU9OX0lERU5USUZJRVI6CisJCQkJc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoUE9QVUxBVElPTl9JREVOVElGSUVSX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUE9QVUxBVElPTl9MQUJFTF9fTkFNRToKKwkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMX19QT1BVTEFURURfQVJFQToKKwkJCQlzZXRQb3B1bGF0ZWRBcmVhKFBPUFVMQVRFRF9BUkVBX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUE9QVUxBVElPTl9MQUJFTF9fVkFMSURfWUVBUjoKKwkJCQlzZXRWYWxpZFllYXIoVkFMSURfWUVBUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEByZXR1cm4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUE9QVUxBVElPTl9MQUJFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSOgorCQkJCXJldHVybiBQT1BVTEFUSU9OX0lERU5USUZJRVJfRURFRkFVTFQgPT0gbnVsbCA/IHBvcHVsYXRpb25JZGVudGlmaWVyICE9IG51bGwgOiAhUE9QVUxBVElPTl9JREVOVElGSUVSX0VERUZBVUxULmVxdWFscyhwb3B1bGF0aW9uSWRlbnRpZmllcik7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUE9QVUxBVElPTl9MQUJFTF9fTkFNRToKKwkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlBPUFVMQVRJT05fTEFCRUxfX0NVUlJFTlRfUE9QVUxBVElPTl9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0Q3VycmVudFBvcHVsYXRpb25WYWx1ZSgpICE9IG51bGw7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUE9QVUxBVElPTl9MQUJFTF9fUE9QVUxBVEVEX0FSRUE6CisJCQkJcmV0dXJuIHBvcHVsYXRlZEFyZWEgIT0gUE9QVUxBVEVEX0FSRUFfRURFRkFVTFQ7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUE9QVUxBVElPTl9MQUJFTF9fVkFMSURfWUVBUjoKKwkJCQlyZXR1cm4gdmFsaWRZZWFyICE9IFZBTElEX1lFQVJfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKQorCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoCisJCQkJbmFtZSA9PSBudWxsID8gcG9wdWxhdGlvbklkZW50aWZpZXIgOiBuYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgiIFsiKTsKKwkJcmVzdWx0LmFwcGVuZChnZXRDdXJyZW50UG9wdWxhdGlvblZhbHVlKCkuZ2V0Q291bnQoKSk7CisJCS8vIFdhcyBhbiBhcmVhIGV4dGVuZCBzcGVjaWZpZWQ/CisJCXJlc3VsdAorCQkJCS5hcHBlbmQoZUlzU2V0KExhYmVsc1BhY2thZ2UuUE9QVUxBVElPTl9MQUJFTF9fUE9QVUxBVEVEX0FSRUEpID8gIi8iCisJCQkJCQkrIERvdWJsZS50b1N0cmluZyhnZXRQb3B1bGF0ZWRBcmVhKCkpICsgImttXjIiCisJCQkJCQk6ICIiKTsKKwkJcmVzdWx0LmFwcGVuZCgiXSIpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfSAvLyB0b1N0cmluZworfSAvLyBQb3B1bGF0aW9uTGFiZWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9pbXBsL1BvcHVsYXRpb25MYWJlbFZhbHVlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9Qb3B1bGF0aW9uTGFiZWxWYWx1ZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWRhMWI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9Qb3B1bGF0aW9uTGFiZWxWYWx1ZUltcGwuamF2YQpAQCAtMCwwICsxLDIxMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkxhYmVsVmFsdWVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcHVsYXRpb24gTGFiZWwgVmFsdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuUG9wdWxhdGlvbkxhYmVsVmFsdWVJbXBsI2dldENvdW50IDxlbT5Db3VudDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBvcHVsYXRpb25MYWJlbFZhbHVlSW1wbCBleHRlbmRzIExhYmVsVmFsdWVJbXBsIGltcGxlbWVudHMKKwkJUG9wdWxhdGlvbkxhYmVsVmFsdWUgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3VudCgpIDxlbT5Db3VudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvdW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBDT1VOVF9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvdW50KCkgPGVtPkNvdW50PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q291bnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgY291bnQgPSBDT1VOVF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUG9wdWxhdGlvbkxhYmVsVmFsdWVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuUE9QVUxBVElPTl9MQUJFTF9WQUxVRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRDb3VudCgpIHsKKwkJcmV0dXJuIGNvdW50OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb3VudChkb3VibGUgbmV3Q291bnQpIHsKKwkJZG91YmxlIG9sZENvdW50ID0gY291bnQ7CisJCWNvdW50ID0gbmV3Q291bnQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExhYmVsc1BhY2thZ2UuUE9QVUxBVElPTl9MQUJFTF9WQUxVRV9fQ09VTlQsIG9sZENvdW50LCBjb3VudCkpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxWYWx1ZUltcGwjcmVzZXQoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQkvLyBXZSBkb24ndCByZXNldAorCQkvLyBzZXRDb3VudChDT1VOVF9FREVGQVVMVCk7CisJfSAvLyByZXNldAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogQHBhcmFtIHJlc29sdmUKKwkgKiBAcGFyYW0gY29yZVR5cGUKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMX1ZBTFVFX19DT1VOVDoKKwkJCQlyZXR1cm4gZ2V0Q291bnQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcGFyYW0gbmV3VmFsdWUKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMX1ZBTFVFX19DT1VOVDoKKwkJCQlzZXRDb3VudCgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMX1ZBTFVFX19DT1VOVDoKKwkJCQlzZXRDb3VudChDT1VOVF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMX1ZBTFVFX19DT1VOVDoKKwkJCQlyZXR1cm4gY291bnQgIT0gQ09VTlRfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoY291bnQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoY291bnQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZSBpcyBzYW5lCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbEltcGwjc2FuZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2FuZSgpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CisKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZQorCQkJCSYmICghZUlzU2V0KExhYmVsc1BhY2thZ2UuUE9QVUxBVElPTl9MQUJFTF9WQUxVRV9fQ09VTlQpIHx8IGdldENvdW50KCkgPj0gMCk7CisJCWFzc2VydCByZXRWYWx1ZTsKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBzYW5lCit9IC8vIFBvcHVsYXRpb25MYWJlbFZhbHVlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9pbXBsL1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDJkNTMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJbXBsLmphdmEKQEAgLTAsMCArMSw5OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVsYXRpdmUgUGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEltcGwjZ2V0Q3VycmVudFJlbGF0aW9uc2hpcCA8ZW0+Q3VycmVudCBSZWxhdGlvbnNoaXA8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJbXBsIGV4dGVuZHMKKwkJUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEltcGwgaW1wbGVtZW50cworCQlSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJCXNldEN1cnJlbnRWYWx1ZShMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpKTsKKwl9IC8vIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEltcGwKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIGdldEN1cnJlbnRSZWxhdGlvbnNoaXAoKSB7CisJCXJldHVybiAoUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpIGdldEN1cnJlbnRWYWx1ZSgpOworCX0gLy8gZ2V0Q3VycmVudFJlbGF0aW9uc2hpcAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5SRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfX0NVUlJFTlRfUkVMQVRJT05TSElQOgorCQkJCXJldHVybiBnZXRDdXJyZW50UmVsYXRpb25zaGlwKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX19DVVJSRU5UX1JFTEFUSU9OU0hJUDoKKwkJCQlyZXR1cm4gZ2V0Q3VycmVudFJlbGF0aW9uc2hpcCgpICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxJbXBsI3RvU3RyaW5nKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKwl9CisKK30gLy8gUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhhODZiOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsLmphdmEKQEAgLTAsMCArMSwyMjYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbFZhbHVlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlbGF0aXZlIFBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwjaXNBZGphY2VudCA8ZW0+QWRqYWNlbnQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsI2dldFJlbGF0aW9uc2hpcCA8ZW0+UmVsYXRpb25zaGlwPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsIGV4dGVuZHMgTGFiZWxWYWx1ZUltcGwKKwkJaW1wbGVtZW50cyBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWRqYWNlbnQoKSA8ZW0+QWRqYWNlbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0FkamFjZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQURKQUNFTlRfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWRqYWNlbnQoKSA8ZW0+QWRqYWNlbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0FkamFjZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGphY2VudCA9IEFESkFDRU5UX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbGF0aW9uc2hpcCgpIDxlbT5SZWxhdGlvbnNoaXA8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWxhdGlvbnNoaXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcCBSRUxBVElPTlNISVBfRURFRkFVTFQgPSBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwLlVOU1BFQ0lGSUVEX0xJVEVSQUw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWxhdGlvbnNoaXAoKSA8ZW0+UmVsYXRpb25zaGlwPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVsYXRpb25zaGlwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgPSBSRUxBVElPTlNISVBfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlJFTEFUSVZFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNBZGphY2VudCgpIHsKKwkJcmV0dXJuIGFkamFjZW50OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBZGphY2VudChib29sZWFuIG5ld0FkamFjZW50KSB7CisJCWJvb2xlYW4gb2xkQWRqYWNlbnQgPSBhZGphY2VudDsKKwkJYWRqYWNlbnQgPSBuZXdBZGphY2VudDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTGFiZWxzUGFja2FnZS5SRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX0FESkFDRU5ULCBvbGRBZGphY2VudCwgYWRqYWNlbnQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCkgeworCQlyZXR1cm4gcmVsYXRpb25zaGlwOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZWxhdGlvbnNoaXAoUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXApIHsKKwkJUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcCBvbGRSZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXA7CisJCXJlbGF0aW9uc2hpcCA9IG5ld1JlbGF0aW9uc2hpcCA9PSBudWxsID8gUkVMQVRJT05TSElQX0VERUZBVUxUIDogbmV3UmVsYXRpb25zaGlwOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBMYWJlbHNQYWNrYWdlLlJFTEFUSVZFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fUkVMQVRJT05TSElQLCBvbGRSZWxhdGlvbnNoaXAsIHJlbGF0aW9uc2hpcCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19BREpBQ0VOVDoKKwkJCQlyZXR1cm4gaXNBZGphY2VudCgpOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlJFTEFUSVZFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fUkVMQVRJT05TSElQOgorCQkJCXJldHVybiBnZXRSZWxhdGlvbnNoaXAoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5SRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX0FESkFDRU5UOgorCQkJCXNldEFkamFjZW50KChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19SRUxBVElPTlNISVA6CisJCQkJc2V0UmVsYXRpb25zaGlwKChSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5SRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX0FESkFDRU5UOgorCQkJCXNldEFkamFjZW50KEFESkFDRU5UX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19SRUxBVElPTlNISVA6CisJCQkJc2V0UmVsYXRpb25zaGlwKFJFTEFUSU9OU0hJUF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlJFTEFUSVZFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fQURKQUNFTlQ6CisJCQkJcmV0dXJuIGFkamFjZW50ICE9IEFESkFDRU5UX0VERUZBVUxUOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlJFTEFUSVZFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fUkVMQVRJT05TSElQOgorCQkJCXJldHVybiByZWxhdGlvbnNoaXAgIT0gUkVMQVRJT05TSElQX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKQorCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworCQlyZXN1bHQuYXBwZW5kKCJhZGphY2VudDogIik7CisJCXJlc3VsdC5hcHBlbmQoYWRqYWNlbnQpOworCQlyZXN1bHQuYXBwZW5kKCIsIHJlbGF0aW9uc2hpcDogIik7CisJCXJlc3VsdC5hcHBlbmQocmVsYXRpb25zaGlwKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0gLy8gdG9TdHJpbmcKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxWYWx1ZUltcGwjcmVzZXQoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQkvLyBOb3RoaW5nIHRvIHJlc2V0LgorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyI3NhbmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworfSAvLyBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViZGZmZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5FZGdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2FkIFRyYW5zcG9ydCBSZWxhdGlvbnNoaXAgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsIGV4dGVuZHMgUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEltcGwgaW1wbGVtZW50cyBSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwgeworCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwkJc2V0Q3VycmVudFZhbHVlKExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZVJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGUgYW4gZWRnZSBiZXR3ZWVuIHR3byBub2RlcyB0aGF0IHJlcHJlc2VudHMgdGhlIHJlbGF0aW9uc2hpcCBvZgorCSAqIHNoYXJpbmcgYSBjb21tb24gYm9yZGVyLgorCSAqIAorCSAqIEBwYXJhbSBub2RlQQorCSAqICAgICAgICAgICAgdGhlIGZpcnN0IG5vZGUKKwkgKiBAcGFyYW0gbm9kZUIKKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgbm9kZQorCSAqIEBwYXJhbSByb2FkTmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJvYWR3YXkKKwkgKiBAcGFyYW0gcm9hZENsYXNzICAgICAgICAgICAKKwkgKiAgICAgICAgICAgIHRoZSBjbGFzcyBvZiByb2FkIChJbnRlcnN0YXRlLCByb3V0ZSwgZXRjKQorCSAqIEBwYXJhbSBudW1Dcm9zc2luZ3MKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHJvYWQgY3Jvc3NlcyBiZXR3ZWVuIG5vZGVBIGFuZCBub2RlQgorCSAqIEByZXR1cm4gYW4gZWRnZSBiZXR3ZWVuIHRoZSB0d28gbm9kZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEVkZ2UgY3JlYXRlUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcChmaW5hbCBOb2RlIG5vZGVBLAorCQkJZmluYWwgTm9kZSBub2RlQiwgZmluYWwgU3RyaW5nIHJvYWROYW1lLCBmaW5hbCBTdHJpbmcgcm9hZENsYXNzLCBmaW5hbCBpbnQgbnVtQ3Jvc3NpbmdzKSB7CisJCWZpbmFsIEVkZ2UgcmV0VmFsdWUgPSBFZGdlSW1wbC5jcmVhdGVFZGdlKG5vZGVBLCBub2RlQik7CisJCWZpbmFsIFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCBsYWJlbCA9IExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZVJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCgpOworCQlsYWJlbC5zZXRVUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKHJldFZhbHVlLmdldFVSSSgpKTsKKworCQlmaW5hbCBSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSBsYWJlbFZhbHVlID0gKFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKSBsYWJlbAorCQkJCS5nZXRDdXJyZW50VmFsdWUoKTsKKwkJbGFiZWxWYWx1ZS5zZXRSb2FkTmFtZShyb2FkTmFtZSk7CisJCWxhYmVsVmFsdWUuc2V0Um9hZENsYXNzKHJvYWRDbGFzcyk7CisJCWxhYmVsVmFsdWUuc2V0TnVtYmVyQ3Jvc3NpbmdzKG51bUNyb3NzaW5ncyk7CisJCXJldFZhbHVlLnNldExhYmVsKGxhYmVsKTsKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXAKKwkKKwkKKwkvKioKKwkgKiBAcGFyYW0gbm9kZQorCSAqICAgICAgICAgICAgdGhlIG5vZGUKKwkgKiBAcmV0dXJuIHRoZSBFZGdlcyB0aGF0IHJlcHJlc2VudCB0aGUgY29tbW9uIGJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbgorCSAqICAgICAgICAgdGhlIG5vZGUgYW5kIG90aGVyIG5vZGVzLgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHN0YXRpYyBMaXN0PEVkZ2U+IGdldFJvYWRFZGdlc0Zyb21Ob2RlKGZpbmFsIE5vZGUgbm9kZSkgeworCQlmaW5hbCBMaXN0PEVkZ2U+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxFZGdlPigpOworCisJCWlmKG5vZGUgPT0gbnVsbCB8fCBub2RlLmdldEVkZ2VzKCkgPT0gbnVsbCkgcmV0dXJuIHJldFZhbHVlOworCQkKKwkJZm9yIChJdGVyYXRvcjxFZGdlPiBlZGdlSXRlciA9IG5vZGUuZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBlZGdlSXRlci5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBFZGdlIGVkZ2UgPSBlZGdlSXRlci5uZXh0KCk7CisJCQlmaW5hbCBFZGdlTGFiZWwgZWRnZUxhYmVsID0gZWRnZS5nZXRMYWJlbCgpOworCQkJLy8gSXMgdGhlIGxhYmVsIGEgY29tbW9uIGJvcmRlciBsYWJlbD8KKwkJCWlmIChlZGdlTGFiZWwgaW5zdGFuY2VvZiBSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwpIHsKKwkJCQkvLyBZZXMKKwkJCQlyZXRWYWx1ZS5hZGQoZWRnZSk7CisJCQl9CisJCX0gLy8gZm9yCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0Q29tbW9uQm9yZGVyRWRnZXNGcm9tTm9kZQorCQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlJPQURfVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTDsKKwl9CisKK30gLy9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9pbXBsL1JvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2JhMDY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvaW1wbC9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwuamF2YQpAQCAtMCwwICsxLDI3NyBAQAorCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvYWQgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwjZ2V0Um9hZE5hbWUgPGVtPlJvYWQgTmFtZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwjZ2V0Um9hZENsYXNzIDxlbT5Sb2FkIENsYXNzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCNnZXROdW1iZXJDcm9zc2luZ3MgPGVtPk51bWJlciBDcm9zc2luZ3M8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwgZXh0ZW5kcyBQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsIGltcGxlbWVudHMgUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2FkTmFtZSgpIDxlbT5Sb2FkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJvYWROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBST0FEX05BTUVfRURFRkFVTFQgPSAicm9hZCI7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2FkTmFtZSgpIDxlbT5Sb2FkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJvYWROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHJvYWROYW1lID0gUk9BRF9OQU1FX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvYWRDbGFzcygpIDxlbT5Sb2FkIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSb2FkQ2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJPQURfQ0xBU1NfRURFRkFVTFQgPSAicm91dGUiOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9hZENsYXNzKCkgPGVtPlJvYWQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJvYWRDbGFzcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyByb2FkQ2xhc3MgPSBST0FEX0NMQVNTX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bWJlckNyb3NzaW5ncygpIDxlbT5OdW1iZXIgQ3Jvc3NpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROdW1iZXJDcm9zc2luZ3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5VTUJFUl9DUk9TU0lOR1NfRURFRkFVTFQgPSAxOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtYmVyQ3Jvc3NpbmdzKCkgPGVtPk51bWJlciBDcm9zc2luZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE51bWJlckNyb3NzaW5ncygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGludCBudW1iZXJDcm9zc2luZ3MgPSBOVU1CRVJfQ1JPU1NJTkdTX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Um9hZE5hbWUoKSB7CisJCXJldHVybiByb2FkTmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSb2FkTmFtZShTdHJpbmcgbmV3Um9hZE5hbWUpIHsKKwkJU3RyaW5nIG9sZFJvYWROYW1lID0gcm9hZE5hbWU7CisJCXJvYWROYW1lID0gbmV3Um9hZE5hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExhYmVsc1BhY2thZ2UuUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19ST0FEX05BTUUsIG9sZFJvYWROYW1lLCByb2FkTmFtZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Um9hZENsYXNzKCkgeworCQlyZXR1cm4gcm9hZENsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJvYWRDbGFzcyhTdHJpbmcgbmV3Um9hZENsYXNzKSB7CisJCVN0cmluZyBvbGRSb2FkQ2xhc3MgPSByb2FkQ2xhc3M7CisJCXJvYWRDbGFzcyA9IG5ld1JvYWRDbGFzczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTGFiZWxzUGFja2FnZS5ST0FEX1RSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX1JPQURfQ0xBU1MsIG9sZFJvYWRDbGFzcywgcm9hZENsYXNzKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXROdW1iZXJDcm9zc2luZ3MoKSB7CisJCXJldHVybiBudW1iZXJDcm9zc2luZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TnVtYmVyQ3Jvc3NpbmdzKGludCBuZXdOdW1iZXJDcm9zc2luZ3MpIHsKKwkJaW50IG9sZE51bWJlckNyb3NzaW5ncyA9IG51bWJlckNyb3NzaW5nczsKKwkJbnVtYmVyQ3Jvc3NpbmdzID0gbmV3TnVtYmVyQ3Jvc3NpbmdzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBMYWJlbHNQYWNrYWdlLlJPQURfVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fTlVNQkVSX0NST1NTSU5HUywgb2xkTnVtYmVyQ3Jvc3NpbmdzLCBudW1iZXJDcm9zc2luZ3MpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19ST0FEX05BTUU6CisJCQkJcmV0dXJuIGdldFJvYWROYW1lKCk7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19ST0FEX0NMQVNTOgorCQkJCXJldHVybiBnZXRSb2FkQ2xhc3MoKTsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5ST0FEX1RSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX05VTUJFUl9DUk9TU0lOR1M6CisJCQkJcmV0dXJuIGdldE51bWJlckNyb3NzaW5ncygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19ST0FEX05BTUU6CisJCQkJc2V0Um9hZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlJPQURfVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fUk9BRF9DTEFTUzoKKwkJCQlzZXRSb2FkQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlJPQURfVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fTlVNQkVSX0NST1NTSU5HUzoKKwkJCQlzZXROdW1iZXJDcm9zc2luZ3MoKEludGVnZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19ST0FEX05BTUU6CisJCQkJc2V0Um9hZE5hbWUoUk9BRF9OQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19ST0FEX0NMQVNTOgorCQkJCXNldFJvYWRDbGFzcyhST0FEX0NMQVNTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19OVU1CRVJfQ1JPU1NJTkdTOgorCQkJCXNldE51bWJlckNyb3NzaW5ncyhOVU1CRVJfQ1JPU1NJTkdTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5ST0FEX1RSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX1JPQURfTkFNRToKKwkJCQlyZXR1cm4gUk9BRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyByb2FkTmFtZSAhPSBudWxsIDogIVJPQURfTkFNRV9FREVGQVVMVC5lcXVhbHMocm9hZE5hbWUpOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlJPQURfVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fUk9BRF9DTEFTUzoKKwkJCQlyZXR1cm4gUk9BRF9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gcm9hZENsYXNzICE9IG51bGwgOiAhUk9BRF9DTEFTU19FREVGQVVMVC5lcXVhbHMocm9hZENsYXNzKTsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5ST0FEX1RSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX05VTUJFUl9DUk9TU0lOR1M6CisJCQkJcmV0dXJuIG51bWJlckNyb3NzaW5ncyAhPSBOVU1CRVJfQ1JPU1NJTkdTX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAocm9hZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQocm9hZE5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIHJvYWRDbGFzczogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChyb2FkQ2xhc3MpOworCQlyZXN1bHQuYXBwZW5kKCIsIG51bWJlckNyb3NzaW5nczogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChudW1iZXJDcm9zc2luZ3MpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9pbXBsL1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YjllMjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9pbXBsL1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsODkyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5EeW5hbWljRWRnZUxhYmVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRWRnZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5FZGdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0TW9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJworICogPGVtPjxiPlRyYW5zcG9ydCBSZWxhdGlvbnNoaXAgTGFiZWw8L2I+PC9lbT4nLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEltcGwjZ2V0VHJhbnNwb3J0TW9kZSA8ZW0+VHJhbnNwb3J0IE1vZGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsI2dldFBvcHVsYXRpb25JZGVudGlmaWVyIDxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsI2dldFRyYW5zcG9ydElkZW50aWZpZXIgPGVtPlRyYW5zcG9ydCBJZGVudGlmaWVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSW1wbCNnZXRDdXJyZW50VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSA8ZW0+Q3VycmVudCBUcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSW1wbCNnZXRSYXRlVGltZVBlcmlvZCA8ZW0+UmF0ZSBUaW1lIFBlcmlvZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEltcGwjZ2V0RGVwYXJ0dXJlQ2FwYWNpdHkgPGVtPkRlcGFydHVyZSBDYXBhY2l0eTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEltcGwjZ2V0TWF4aW11bURlcGFydHVyZUNhcGFjaXR5IDxlbT5NYXhpbXVtIERlcGFydHVyZSBDYXBhY2l0eTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEltcGwjZ2V0Q2FwYWNpdHkgPGVtPkNhcGFjaXR5PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSW1wbCNnZXRNYXhpbXVtQ2FwYWNpdHkgPGVtPk1heGltdW0gQ2FwYWNpdHk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsI2dldFRyYW5zaXRUaW1lIDxlbT5UcmFuc2l0IFRpbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsI2dldFN0YXJ0VXBEZWxheSA8ZW0+U3RhcnQgVXAgRGVsYXk8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEltcGwgZXh0ZW5kcyBEeW5hbWljRWRnZUxhYmVsSW1wbAorCQlpbXBsZW1lbnRzIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNwb3J0TW9kZSgpIDxlbT5UcmFuc3BvcnQgTW9kZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VHJhbnNwb3J0TW9kZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc3BvcnRNb2RlIFRSQU5TUE9SVF9NT0RFX0VERUZBVUxUID0gVHJhbnNwb3J0TW9kZS5VTlNQRUNJRklFRF9MSVRFUkFMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNwb3J0TW9kZSgpIDxlbT5UcmFuc3BvcnQgTW9kZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VHJhbnNwb3J0TW9kZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFRyYW5zcG9ydE1vZGUgdHJhbnNwb3J0TW9kZSA9IFRSQU5TUE9SVF9NT0RFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkgPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUFVMQVRJT05fSURFTlRJRklFUl9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpIDxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHBvcHVsYXRpb25JZGVudGlmaWVyID0gUE9QVUxBVElPTl9JREVOVElGSUVSX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zcG9ydElkZW50aWZpZXIoKSA8ZW0+VHJhbnNwb3J0IElkZW50aWZpZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRyYW5zcG9ydElkZW50aWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9JREVOVElGSUVSX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zcG9ydElkZW50aWZpZXIoKSA8ZW0+VHJhbnNwb3J0IElkZW50aWZpZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRyYW5zcG9ydElkZW50aWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNwb3J0SWRlbnRpZmllciA9IFRSQU5TUE9SVF9JREVOVElGSUVSX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVUaW1lUGVyaW9kKCkgPGVtPlJhdGUgVGltZSBQZXJpb2Q8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJhdGVUaW1lUGVyaW9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgUkFURV9USU1FX1BFUklPRF9FREVGQVVMVCA9IDBMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZVRpbWVQZXJpb2QoKSA8ZW0+UmF0ZSBUaW1lIFBlcmlvZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmF0ZVRpbWVQZXJpb2QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBsb25nIHJhdGVUaW1lUGVyaW9kID0gUkFURV9USU1FX1BFUklPRF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXBhcnR1cmVDYXBhY2l0eSgpIDxlbT5EZXBhcnR1cmUgQ2FwYWNpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlcGFydHVyZUNhcGFjaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERVBBUlRVUkVfQ0FQQUNJVFlfRURFRkFVTFQgPSAwOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1heGltdW1EZXBhcnR1cmVDYXBhY2l0eSgpIDxlbT5NYXhpbXVtIERlcGFydHVyZSBDYXBhY2l0eTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWF4aW11bURlcGFydHVyZUNhcGFjaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX0RFUEFSVFVSRV9DQVBBQ0lUWV9FREVGQVVMVCA9IDA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHkoKSA8ZW0+TWF4aW11bSBEZXBhcnR1cmUgQ2FwYWNpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1heGltdW1EZXBhcnR1cmVDYXBhY2l0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGludCBtYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHkgPSBNQVhJTVVNX0RFUEFSVFVSRV9DQVBBQ0lUWV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXBhY2l0eSgpIDxlbT5DYXBhY2l0eTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENhcGFjaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDQVBBQ0lUWV9FREVGQVVMVCA9IDA7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF4aW11bUNhcGFjaXR5KCkgPGVtPk1heGltdW0gQ2FwYWNpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1heGltdW1DYXBhY2l0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUFYSU1VTV9DQVBBQ0lUWV9FREVGQVVMVCA9IDA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXhpbXVtQ2FwYWNpdHkoKSA8ZW0+TWF4aW11bSBDYXBhY2l0eTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWF4aW11bUNhcGFjaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IG1heGltdW1DYXBhY2l0eSA9IE1BWElNVU1fQ0FQQUNJVFlfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNpdFRpbWUoKSA8ZW0+VHJhbnNpdCBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VHJhbnNpdFRpbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBUUkFOU0lUX1RJTUVfRURFRkFVTFQgPSAwTDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zaXRUaW1lKCkgPGVtPlRyYW5zaXQgVGltZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRyYW5zaXRUaW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgbG9uZyB0cmFuc2l0VGltZSA9IFRSQU5TSVRfVElNRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydFVwRGVsYXkoKSA8ZW0+U3RhcnQgVXAgRGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFN0YXJ0VXBEZWxheSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIFNUQVJUX1VQX0RFTEFZX0VERUZBVUxUID0gMEw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydFVwRGVsYXkoKSA8ZW0+U3RhcnQgVXAgRGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFN0YXJ0VXBEZWxheSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGxvbmcgc3RhcnRVcERlbGF5ID0gU1RBUlRfVVBfREVMQVlfRURFRkFVTFQ7CisKKwlwcml2YXRlIEVPYmplY3Qgbm9kZUJBcnJpdmFscyA9IG51bGw7CisKKwlwcml2YXRlIEVPYmplY3Qgbm9kZUFBcnJpdmFscyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJCXNldEN1cnJlbnRWYWx1ZShMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkpOworCQlzZXROZXh0VmFsdWUoTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpKTsKKwl9IC8vIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSW1wbAorCisJLyoqCisJICogQ3JlYXRlIGFuIGVkZ2UgdGhlIHJlcHJlc2VudHMgYSByZWZsZXhpdmUgdHJhbnNwb3J0YXRpb24gcmVsYXRpb25zaGlwCisJICogYmV0d2VlbiB0d28gbm9kZXMuCisJICogCisJICogQHBhcmFtIG5vZGVBCisJICogICAgICAgICAgICB0aGUgZmlyc3Qgbm9kZQorCSAqIEBwYXJhbSBub2RlQgorCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBub2RlCisJICogQHBhcmFtIHRyYW5zcG9ydE1vZGUKKwkgKiAgICAgICAgICAgIHRoZSB0cmFuc3BvcnRhdGlvbiBtb2RlCisJICogQHBhcmFtIHRyYW5zcG9ydElkZW50aWZpZXIKKwkgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB0cmFuc3BvcnRhdGlvbiAoZS5nLiwgcm9hZCBuYW1lKQorCSAqIEBwYXJhbSBwb3B1bGF0aW9uSWRlbnRpZmllcgorCSAqICAgICAgICAgICAgdGhlIHBvcHVsYXRpb24gYmVpbmcgdHJhbnNwb3J0ZWQKKwkgKiBAcGFyYW0gZWRnZURlY29yYXRvcgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEVkZ2UgY3JlYXRlVHJhbnNwb3J0UmVsYXRpb25zaGlwKGZpbmFsIE5vZGUgbm9kZUEsCisJCQlmaW5hbCBOb2RlIG5vZGVCLCBmaW5hbCBUcmFuc3BvcnRNb2RlIHRyYW5zcG9ydE1vZGUsCisJCQlmaW5hbCBTdHJpbmcgdHJhbnNwb3J0SWRlbnRpZmllciwKKwkJCWZpbmFsIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllciwgZmluYWwgbG9uZyByYXRlVGltZVBlcmlvZCwKKwkJCWZpbmFsIGludCBtYXhpbXVtQ2FwYWNpdHksIEVkZ2VEZWNvcmF0b3IgZWRnZURlY29yYXRvcikgeworCQlyZXR1cm4gY3JlYXRlVHJhbnNwb3J0UmVsYXRpb25zaGlwKG5vZGVBLCBub2RlQiwgdHJhbnNwb3J0TW9kZSwKKwkJCQl0cmFuc3BvcnRJZGVudGlmaWVyLCBwb3B1bGF0aW9uSWRlbnRpZmllciwgcmF0ZVRpbWVQZXJpb2QsCisJCQkJbWF4aW11bUNhcGFjaXR5LCBmYWxzZSwgZWRnZURlY29yYXRvcik7CisJfSAvLyBjcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXAKKworCS8qKgorCSAqIENyZWF0ZSBhbiBlZGdlIHRoZSByZXByZXNlbnRzIGEgcmVmbGV4aXZlIHRyYW5zcG9ydGF0aW9uIHJlbGF0aW9uc2hpcAorCSAqIGJldHdlZW4gdHdvIG5vZGVzLgorCSAqIAorCSAqIEBwYXJhbSBub2RlQQorCSAqICAgICAgICAgICAgdGhlIGZpcnN0IG5vZGUKKwkgKiBAcGFyYW0gbm9kZUIKKwkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgbm9kZQorCSAqIEBwYXJhbSB0cmFuc3BvcnRNb2RlCisJICogICAgICAgICAgICB0aGUgdHJhbnNwb3J0YXRpb24gbW9kZQorCSAqIEBwYXJhbSB0cmFuc3BvcnRJZGVudGlmaWVyCisJICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBvZiB0aGUgdHJhbnNwb3J0YXRpb24gKGUuZy4sIHJvYWQgbmFtZSkKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbklkZW50aWZpZXIKKwkgKiAgICAgICAgICAgIHRoZSBwb3B1bGF0aW9uIGJlaW5nIHRyYW5zcG9ydGVkCisJICogQHBhcmFtIGVkZ2VEZWNvcmF0b3IKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZVRyYW5zcG9ydFJlbGF0aW9uc2hpcChmaW5hbCBOb2RlIG5vZGVBLAorCQkJZmluYWwgTm9kZSBub2RlQiwgZmluYWwgVHJhbnNwb3J0TW9kZSB0cmFuc3BvcnRNb2RlLAorCQkJZmluYWwgU3RyaW5nIHRyYW5zcG9ydElkZW50aWZpZXIsCisJCQlmaW5hbCBTdHJpbmcgcG9wdWxhdGlvbklkZW50aWZpZXIsIGZpbmFsIGxvbmcgcmF0ZVRpbWVQZXJpb2QsCisJCQlmaW5hbCBpbnQgbWF4aW11bUNhcGFjaXR5LCBmaW5hbCBib29sZWFuIGRpcmVjdGVkLAorCQkJRWRnZURlY29yYXRvciBlZGdlRGVjb3JhdG9yKSB7CisJCXJldHVybiBjcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXAobm9kZUEsIG5vZGVCLCB0cmFuc3BvcnRNb2RlLAorCQkJCXRyYW5zcG9ydElkZW50aWZpZXIsIHBvcHVsYXRpb25JZGVudGlmaWVyLCByYXRlVGltZVBlcmlvZCwKKwkJCQltYXhpbXVtQ2FwYWNpdHksIG1heGltdW1DYXBhY2l0eSwgMCwgMCwgZGlyZWN0ZWQsIGVkZ2VEZWNvcmF0b3IpOworCX0gLy8gY3JlYXRlVHJhbnNwb3J0UmVsYXRpb25zaGlwCisKKwkvKioKKwkgKiBDcmVhdGUgYW4gZWRnZSB0aGUgcmVwcmVzZW50cyBhIHJlZmxleGl2ZSB0cmFuc3BvcnRhdGlvbiByZWxhdGlvbnNoaXAKKwkgKiBiZXR3ZWVuIHR3byBub2Rlcy4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZUEKKwkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBub2RlCisJICogQHBhcmFtIG5vZGVCCisJICogICAgICAgICAgICB0aGUgc2Vjb25kIG5vZGUKKwkgKiBAcGFyYW0gdHJhbnNwb3J0TW9kZQorCSAqICAgICAgICAgICAgdGhlIHRyYW5zcG9ydGF0aW9uIG1vZGUKKwkgKiBAcGFyYW0gdHJhbnNwb3J0SWRlbnRpZmllcgorCSAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHRyYW5zcG9ydGF0aW9uIChlLmcuLCByb2FkIG5hbWUpCisJICogQHBhcmFtIHBvcHVsYXRpb25JZGVudGlmaWVyCisJICogICAgICAgICAgICB0aGUgcG9wdWxhdGlvbiBiZWluZyB0cmFuc3BvcnRlZAorCSAqIEBwYXJhbSBlZGdlRGVjb3JhdG9yCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBzdGF0aWMgRWRnZSBjcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXAoZmluYWwgTm9kZSBub2RlQSwKKwkJCWZpbmFsIE5vZGUgbm9kZUIsIGZpbmFsIFRyYW5zcG9ydE1vZGUgdHJhbnNwb3J0TW9kZSwKKwkJCWZpbmFsIFN0cmluZyB0cmFuc3BvcnRJZGVudGlmaWVyLAorCQkJZmluYWwgU3RyaW5nIHBvcHVsYXRpb25JZGVudGlmaWVyLCBmaW5hbCBsb25nIHJhdGVUaW1lUGVyaW9kLAorCQkJZmluYWwgaW50IG1heGltdW1EZXBhcnR1cmVDYXBhY2l0eSwgZmluYWwgaW50IG1heGltdW1DYXBhY2l0eSwKKwkJCWZpbmFsIGxvbmcgdHJhbnNpdFRpbWUsIGZpbmFsIGxvbmcgc3RhcnRVcERlbGF5LAorCQkJRWRnZURlY29yYXRvciBlZGdlRGVjb3JhdG9yKSB7CisJCXJldHVybiBjcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXAobm9kZUEsIG5vZGVCLCB0cmFuc3BvcnRNb2RlLAorCQkJCXRyYW5zcG9ydElkZW50aWZpZXIsIHBvcHVsYXRpb25JZGVudGlmaWVyLCByYXRlVGltZVBlcmlvZCwKKwkJCQltYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHksIG1heGltdW1DYXBhY2l0eSwgdHJhbnNpdFRpbWUsCisJCQkJc3RhcnRVcERlbGF5LCBmYWxzZSwgZWRnZURlY29yYXRvcik7CisJfSAvLyBjcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXAKKworCS8qKgorCSAqIENyZWF0ZSBhbiBlZGdlIHRoZSByZXByZXNlbnRzIGEgdHJhbnNwb3J0YXRpb24gcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvCisJICogbm9kZXMuCisJICogCisJICogQHBhcmFtIG5vZGVBCisJICogICAgICAgICAgICB0aGUgZmlyc3Qgbm9kZQorCSAqIEBwYXJhbSBub2RlQgorCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBub2RlCisJICogQHBhcmFtIHRyYW5zcG9ydE1vZGUKKwkgKiAgICAgICAgICAgIHRoZSB0cmFuc3BvcnRhdGlvbiBtb2RlCisJICogQHBhcmFtIHRyYW5zcG9ydElkZW50aWZpZXIKKwkgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB0cmFuc3BvcnRpb24gKGUuZy4sIHJvYWQgbmFtZSkKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbklkZW50aWZpZXIKKwkgKiAgICAgICAgICAgIHRoZSBwb3B1bGF0aW9uIGJlaW5nIHRyYW5zcG9ydGVkCisJICogQHBhcmFtIHJhdGVUaW1lUGVyaW9kCisJICogICAgICAgICAgICB0aGUgdW5pdCBvZiB0aW1lIHRoZSBwb3B1bGF0aW9uIGNvdW50IGlzIHRyYW5zcG9ydGVkIGluCisJICogICAgICAgICAgICAobWlsbGlzZWNvbmRzKQorCSAqIEBwYXJhbSBkaXJlY3RlZAorCSAqICAgICAgICAgICAgaWYgdHJ1ZSB0aGVuIHRoZSByZWxhdGlvbnNoaXAgaXMgb25seSBmcm9tIG5vZGVBIHRvIG5vZGVCLCBhbmQKKwkgKiAgICAgICAgICAgIG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4gVGhpcyBtZWFucyB0aGluZ3MgbW92ZSBmcm9tIG5vZGVBIHRvCisJICogICAgICAgICAgICBub2RlQiwgYnV0IG5vdCBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLgorCSAqIEBwYXJhbSBlZGdlRGVjb3JhdG9yCisJICogICAgICAgICAgICBUT0RPCisJICogQHBhcmFtIHBvcHVsYXRpb25Db3VudAorCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZVRyYW5zcG9ydFJlbGF0aW9uc2hpcChmaW5hbCBOb2RlIG5vZGVBLAorCQkJZmluYWwgTm9kZSBub2RlQiwgZmluYWwgVHJhbnNwb3J0TW9kZSB0cmFuc3BvcnRNb2RlLAorCQkJZmluYWwgU3RyaW5nIHRyYW5zcG9ydElkZW50aWZpZXIsCisJCQlmaW5hbCBTdHJpbmcgcG9wdWxhdGlvbklkZW50aWZpZXIsIGZpbmFsIGxvbmcgcmF0ZVRpbWVQZXJpb2QsCisJCQlmaW5hbCBpbnQgbWF4aW11bURlcGFydHVyZUNhcGFjaXR5LCBmaW5hbCBpbnQgbWF4aW11bUNhcGFjaXR5LAorCQkJZmluYWwgbG9uZyB0cmFuc2l0VGltZSwgZmluYWwgbG9uZyBzdGFydFVwRGVsYXksCisJCQlmaW5hbCBib29sZWFuIGRpcmVjdGVkLCBFZGdlRGVjb3JhdG9yIGVkZ2VEZWNvcmF0b3IpIHsKKworCQlmaW5hbCBFZGdlIHJldFZhbHVlID0gRWRnZUltcGwuY3JlYXRlRWRnZShub2RlQSwgbm9kZUIsIGRpcmVjdGVkKTsKKworCQlmaW5hbCBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCBsYWJlbCA9IExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZVRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKCk7CisJCWxhYmVsLnNldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQocmV0VmFsdWUuZ2V0VVJJKCkpOworCQlsYWJlbC5zZXREZWNvcmF0b3IoZWRnZURlY29yYXRvcik7CisJCWxhYmVsLnNldFBvcHVsYXRpb25JZGVudGlmaWVyKHBvcHVsYXRpb25JZGVudGlmaWVyKTsKKwkJbGFiZWwuc2V0VHJhbnNwb3J0SWRlbnRpZmllcih0cmFuc3BvcnRJZGVudGlmaWVyKTsKKwkJbGFiZWwuc2V0UmF0ZVRpbWVQZXJpb2QocmF0ZVRpbWVQZXJpb2QpOworCQlsYWJlbC5zZXRNYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHkobWF4aW11bURlcGFydHVyZUNhcGFjaXR5KTsKKwkJbGFiZWwuc2V0TWF4aW11bUNhcGFjaXR5KG1heGltdW1DYXBhY2l0eSk7CisJCWxhYmVsLnNldFRyYW5zaXRUaW1lKHRyYW5zaXRUaW1lKTsKKwkJbGFiZWwuc2V0U3RhcnRVcERlbGF5KHN0YXJ0VXBEZWxheSk7CisJCWxhYmVsLnNldFRyYW5zcG9ydE1vZGUodHJhbnNwb3J0TW9kZSk7CisKKwkJZmluYWwgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSB0cmx2ID0gbGFiZWwKKwkJCQkuZ2V0Q3VycmVudFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKTsKKwkJdHJsdi5zZXRBdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb24oMS4wKTsKKworCQlyZXRWYWx1ZS5zZXRMYWJlbChsYWJlbCk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZVRyYW5zcG9ydFJlbGF0aW9uc2hpcAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gTGFiZWxzUGFja2FnZS5MaXRlcmFscy5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVHJhbnNwb3J0TW9kZSBnZXRUcmFuc3BvcnRNb2RlKCkgeworCQlyZXR1cm4gdHJhbnNwb3J0TW9kZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VHJhbnNwb3J0TW9kZShUcmFuc3BvcnRNb2RlIG5ld1RyYW5zcG9ydE1vZGUpIHsKKwkJVHJhbnNwb3J0TW9kZSBvbGRUcmFuc3BvcnRNb2RlID0gdHJhbnNwb3J0TW9kZTsKKwkJdHJhbnNwb3J0TW9kZSA9IG5ld1RyYW5zcG9ydE1vZGUgPT0gbnVsbCA/IFRSQU5TUE9SVF9NT0RFX0VERUZBVUxUIDogbmV3VHJhbnNwb3J0TW9kZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19UUkFOU1BPUlRfTU9ERSwgb2xkVHJhbnNwb3J0TW9kZSwgdHJhbnNwb3J0TW9kZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkgeworCQlyZXR1cm4gcG9wdWxhdGlvbklkZW50aWZpZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBvcHVsYXRpb25JZGVudGlmaWVyKFN0cmluZyBuZXdQb3B1bGF0aW9uSWRlbnRpZmllcikgeworCQlTdHJpbmcgb2xkUG9wdWxhdGlvbklkZW50aWZpZXIgPSBwb3B1bGF0aW9uSWRlbnRpZmllcjsKKwkJcG9wdWxhdGlvbklkZW50aWZpZXIgPSBuZXdQb3B1bGF0aW9uSWRlbnRpZmllcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIsIG9sZFBvcHVsYXRpb25JZGVudGlmaWVyLCBwb3B1bGF0aW9uSWRlbnRpZmllcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRyYW5zcG9ydElkZW50aWZpZXIoKSB7CisJCXJldHVybiB0cmFuc3BvcnRJZGVudGlmaWVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUcmFuc3BvcnRJZGVudGlmaWVyKFN0cmluZyBuZXdUcmFuc3BvcnRJZGVudGlmaWVyKSB7CisJCVN0cmluZyBvbGRUcmFuc3BvcnRJZGVudGlmaWVyID0gdHJhbnNwb3J0SWRlbnRpZmllcjsKKwkJdHJhbnNwb3J0SWRlbnRpZmllciA9IG5ld1RyYW5zcG9ydElkZW50aWZpZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fVFJBTlNQT1JUX0lERU5USUZJRVIsIG9sZFRyYW5zcG9ydElkZW50aWZpZXIsIHRyYW5zcG9ydElkZW50aWZpZXIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIGdldEN1cnJlbnRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkgeworCQlyZXR1cm4gKFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpIGdldEN1cnJlbnRWYWx1ZSgpOworCX0gLy8gZ2V0Q3VycmVudFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRSYXRlVGltZVBlcmlvZCgpIHsKKwkJcmV0dXJuIHJhdGVUaW1lUGVyaW9kOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSYXRlVGltZVBlcmlvZChsb25nIG5ld1JhdGVUaW1lUGVyaW9kKSB7CisJCWxvbmcgb2xkUmF0ZVRpbWVQZXJpb2QgPSByYXRlVGltZVBlcmlvZDsKKwkJcmF0ZVRpbWVQZXJpb2QgPSBuZXdSYXRlVGltZVBlcmlvZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19SQVRFX1RJTUVfUEVSSU9ELCBvbGRSYXRlVGltZVBlcmlvZCwgcmF0ZVRpbWVQZXJpb2QpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBpbnQgZ2V0RGVwYXJ0dXJlQ2FwYWNpdHkoKSB7CisJCS8vICRBTkFMWVNJUy1JR05PUkUKKwkJcmV0dXJuIChpbnQpIChnZXRNYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHkoKSAqIGdldEN1cnJlbnRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkKKwkJCQkuZ2V0QXZhaWxhYmxlRGVwYXJ0dXJlQ2FwYWNpdHlQcm9wb3J0aW9uKCkpOworCX0gLy8gZ2V0RGVwYXJ0dXJlQ2FwYWNpdHkKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldE1heGltdW1EZXBhcnR1cmVDYXBhY2l0eSgpIHsKKwkJcmV0dXJuIG1heGltdW1EZXBhcnR1cmVDYXBhY2l0eTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWF4aW11bURlcGFydHVyZUNhcGFjaXR5KGludCBuZXdNYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHkpIHsKKwkJaW50IG9sZE1heGltdW1EZXBhcnR1cmVDYXBhY2l0eSA9IG1heGltdW1EZXBhcnR1cmVDYXBhY2l0eTsKKwkJbWF4aW11bURlcGFydHVyZUNhcGFjaXR5ID0gbmV3TWF4aW11bURlcGFydHVyZUNhcGFjaXR5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX01BWElNVU1fREVQQVJUVVJFX0NBUEFDSVRZLCBvbGRNYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHksIG1heGltdW1EZXBhcnR1cmVDYXBhY2l0eSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIGludCBnZXRDYXBhY2l0eSgpIHsKKwkJLy8gJEFOQUxZU0lTLUlHTk9SRQorCQlyZXR1cm4gKGludCkgKGdldE1heGltdW1DYXBhY2l0eSgpICogZ2V0Q3VycmVudFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKQorCQkJCS5nZXRBdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb24oKSk7CisJfSAvLyBnZXRDYXBhY2l0eQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0TWF4aW11bUNhcGFjaXR5KCkgeworCQlyZXR1cm4gbWF4aW11bUNhcGFjaXR5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXhpbXVtQ2FwYWNpdHkoaW50IG5ld01heGltdW1DYXBhY2l0eSkgeworCQlpbnQgb2xkTWF4aW11bUNhcGFjaXR5ID0gbWF4aW11bUNhcGFjaXR5OworCQltYXhpbXVtQ2FwYWNpdHkgPSBuZXdNYXhpbXVtQ2FwYWNpdHk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fTUFYSU1VTV9DQVBBQ0lUWSwgb2xkTWF4aW11bUNhcGFjaXR5LCBtYXhpbXVtQ2FwYWNpdHkpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGxvbmcgZ2V0VHJhbnNpdFRpbWUoKSB7CisJCXJldHVybiB0cmFuc2l0VGltZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VHJhbnNpdFRpbWUobG9uZyBuZXdUcmFuc2l0VGltZSkgeworCQlsb25nIG9sZFRyYW5zaXRUaW1lID0gdHJhbnNpdFRpbWU7CisJCXRyYW5zaXRUaW1lID0gbmV3VHJhbnNpdFRpbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fVFJBTlNJVF9USU1FLCBvbGRUcmFuc2l0VGltZSwgdHJhbnNpdFRpbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGxvbmcgZ2V0U3RhcnRVcERlbGF5KCkgeworCQlyZXR1cm4gc3RhcnRVcERlbGF5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdGFydFVwRGVsYXkobG9uZyBuZXdTdGFydFVwRGVsYXkpIHsKKwkJbG9uZyBvbGRTdGFydFVwRGVsYXkgPSBzdGFydFVwRGVsYXk7CisJCXN0YXJ0VXBEZWxheSA9IG5ld1N0YXJ0VXBEZWxheTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19TVEFSVF9VUF9ERUxBWSwgb2xkU3RhcnRVcERlbGF5LCBzdGFydFVwRGVsYXkpKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsI3NlbmQob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGUsCisJICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZW5kKE5vZGUgaGVyZSwgRU9iamVjdCBkZXBhcnRlZXMpIHsKKwkJLy8gQXJlIHdlIHNlbmRpbmcgZnJvbSBOb2RlIEE/CisJCWlmIChnZXRFZGdlKCkuZ2V0QSgpLmVxdWFscyhoZXJlKSkgeworCQkJLy8gWWVzCisJCQlub2RlQkFycml2YWxzID0gZGVwYXJ0ZWVzOworCQl9IGVsc2UgeworCQkJLy8gTm8KKwkJCS8vIE11c3QgYmUgTm9kZSBCCisJCQlub2RlQUFycml2YWxzID0gZGVwYXJ0ZWVzOworCQl9CisJfSAvLyBzZW5kCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsI3JlY2VpdmUob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGUsCisJICogICAgICBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUpCisJICovCisJcHVibGljIEVMaXN0PEVPYmplY3Q+IHJlY2VpdmUoTm9kZSBoZXJlLCBTVEVNVGltZSBjdXJyZW50VGltZSkgeworCQlmaW5hbCBFTGlzdDxFT2JqZWN0PiByZXRWYWx1ZSA9IG5ldyBCYXNpY0VMaXN0PEVPYmplY3Q+KCk7CisJCS8vIEFyZSB3ZSByZWNlaXZpbmcgYXQgTm9kZSBBPworCQlpZiAoZ2V0RWRnZSgpLmdldEEoKS5lcXVhbHMoaGVyZSkpIHsKKwkJCS8vIFllcworCQkJLy8gQW55dGhpbmcgdG8gZ2V0PworCQkJaWYgKG5vZGVBQXJyaXZhbHMgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCXJldFZhbHVlLmFkZChub2RlQUFycml2YWxzKTsKKwkJCQlub2RlQUFycml2YWxzID0gbnVsbDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIE5vCisJCQkvLyBBbnl0aGluZyB0byBnZXQ/CisJCQlpZiAobm9kZUJBcnJpdmFscyAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJcmV0VmFsdWUuYWRkKG5vZGVCQXJyaXZhbHMpOworCQkJCW5vZGVCQXJyaXZhbHMgPSBudWxsOworCQkJfQorCQl9CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHJlY2VpdmUKKworCS8qKgorCSAqIEBwYXJhbSBub2RlCisJICogICAgICAgICAgICB0aGUgbm9kZQorCSAqIEBwYXJhbSBwb3B1bGF0aW9uSWRlbnRpZmllcgorCSAqICAgICAgICAgICAgdGhlIHBvcHVsYXRpb24gYmVpbmcgdHJhbnNwb3J0ZWQKKwkgKiBAcmV0dXJuIHRoZSBFZGdlcyB0aGF0IHJlcHJlc2VudCB0aGUgdHJhbnNwb3J0YXRpb24gb2YgcG9wdWxhdGlvbiBtZW1iZXJzCisJICogICAgICAgICB0byB0aGUgbm9kZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIExpc3Q8RWRnZT4gZ2V0VHJhbnNwb3J0RWRnZXNUb05vZGUoZmluYWwgTm9kZSBub2RlLAorCQkJZmluYWwgU3RyaW5nIHBvcHVsYXRpb25JZGVudGlmaWVyKSB7CisJCWZpbmFsIExpc3Q8RWRnZT4gcmV0VmFsdWUgPSBuZXcgQXJyYXlMaXN0PEVkZ2U+KCk7CisKKwkJZm9yIChJdGVyYXRvcjxFZGdlPiBlZGdlSXRlciA9IG5vZGUuZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBlZGdlSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBFZGdlIGVkZ2UgPSBlZGdlSXRlci5uZXh0KCk7CisJCQkvLyBJcyB0aGUgZWRnZSBkaXJlY3RlZCBhd2F5IGZyb20gdXM/CisJCQlpZiAoIWVkZ2UuaXNEaXJlY3RlZCgpIHx8IGVkZ2UuaXNEaXJlY3RlZEF0KG5vZGUpKSB7CisJCQkJLy8gTm8KKwkJCQkvLyBJdCBjb3VsZCBiZSB0cmFuc3BvcnRpbmcgcG9wdWxhdGlvbiBtZW1iZXJzIHRvIHRoZSBub2RlIHRoZW4KKwkJCQlmaW5hbCBMYWJlbCBlZGdlTGFiZWwgPSBlZGdlLmdldExhYmVsKCk7CisJCQkJLy8gSXMgdGhlIGxhYmVsIGEgdHJhbnNwb3J0IGxhYmVsPworCQkJCWlmIChlZGdlTGFiZWwgaW5zdGFuY2VvZiBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCkgeworCQkJCQkvLyBZZXMKKwkJCQkJZmluYWwgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwgdHJhbnNwb3J0TGFiZWwgPSAoVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwpIGVkZ2VMYWJlbDsKKwkJCQkJLy8gU2FtZSBwb3B1bGF0aW9uPworCQkJCQlpZiAodHJhbnNwb3J0TGFiZWwuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQorCQkJCQkJCS5lcXVhbHNJZ25vcmVDYXNlKHBvcHVsYXRpb25JZGVudGlmaWVyKSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQkvLyBJdCdzIGEga2VlcGVyCisJCQkJCQlyZXRWYWx1ZS5hZGQoZWRnZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gLy8gZm9yCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0VHJhbnNwb3J0RWRnZXNUb05vZGUKKworCS8qKgorCSAqIEBwYXJhbSBub2RlCisJICogICAgICAgICAgICB0aGUgbm9kZQorCSAqIEBwYXJhbSBwb3B1bGF0aW9uSWRlbnRpZmllcgorCSAqICAgICAgICAgICAgdGhlIHBvcHVsYXRpb24gYmVpbmcgdHJhbnNwb3J0ZWQKKwkgKiBAcmV0dXJuIHRoZSBFZGdlcyB0aGF0IHJlcHJlc2VudCB0aGUgdHJhbnNwb3J0YXRpb24gb2YgcG9wdWxhdGlvbiBtZW1iZXJzCisJICogICAgICAgICB0byB0aGUgbm9kZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIExpc3Q8RWRnZT4gZ2V0VHJhbnNwb3J0RWRnZXNGcm9tTm9kZShmaW5hbCBOb2RlIG5vZGUsCisJCQlmaW5hbCBTdHJpbmcgcG9wdWxhdGlvbklkZW50aWZpZXIpIHsKKwkJZmluYWwgTGlzdDxFZGdlPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8RWRnZT4oKTsKKworCQlmb3IgKEl0ZXJhdG9yPEVkZ2U+IGVkZ2VJdGVyID0gbm9kZS5nZXRFZGdlcygpLml0ZXJhdG9yKCk7IGVkZ2VJdGVyCisJCQkJLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIEVkZ2UgZWRnZSA9IGVkZ2VJdGVyLm5leHQoKTsKKwkJCS8vIElzIHRoZSBlZGdlIGRpcmVjdGVkIGF3YXkgZnJvbSB1cz8KKwkJCWlmICghZWRnZS5pc0RpcmVjdGVkKCkgfHwgIWVkZ2UuaXNEaXJlY3RlZEF0KG5vZGUpKSB7CisJCQkJLy8gWWVzCisJCQkJLy8gSXQgY291bGQgYmUgdHJhbnNwb3J0aW5nIHBvcHVsYXRpb24gbWVtYmVycyBmcm9tIHRoZSBub2RlCisJCQkJLy8gdGhlbgorCQkJCWZpbmFsIExhYmVsIGVkZ2VMYWJlbCA9IGVkZ2UuZ2V0TGFiZWwoKTsKKwkJCQkvLyBJcyB0aGUgbGFiZWwgYSB0cmFuc3BvcnQgbGFiZWw/CisJCQkJaWYgKGVkZ2VMYWJlbCBpbnN0YW5jZW9mIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKSB7CisJCQkJCS8vIFllcworCQkJCQlmaW5hbCBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCB0cmFuc3BvcnRMYWJlbCA9IChUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCkgZWRnZUxhYmVsOworCQkJCQkvLyBTYW1lIHBvcHVsYXRpb24/CisJCQkJCWlmICh0cmFuc3BvcnRMYWJlbC5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpCisJCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UocG9wdWxhdGlvbklkZW50aWZpZXIpKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCS8vIEl0J3MgYSBrZWVwZXIKKwkJCQkJCXJldFZhbHVlLmFkZChlZGdlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSAvLyBmb3IKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRUcmFuc3BvcnRFZGdlc1RvTm9kZQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCXN1cGVyLnJlc2V0KCk7CisJCW5vZGVBQXJyaXZhbHMgPSBudWxsOworCQlub2RlQkFycml2YWxzID0gbnVsbDsKKwl9IC8vIHJlc2V0CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1RSQU5TUE9SVF9NT0RFOgorCQkJCXJldHVybiBnZXRUcmFuc3BvcnRNb2RlKCk7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSOgorCQkJCXJldHVybiBnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1RSQU5TUE9SVF9JREVOVElGSUVSOgorCQkJCXJldHVybiBnZXRUcmFuc3BvcnRJZGVudGlmaWVyKCk7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fQ1VSUkVOVF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFOgorCQkJCXJldHVybiBnZXRDdXJyZW50VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1JBVEVfVElNRV9QRVJJT0Q6CisJCQkJcmV0dXJuIGdldFJhdGVUaW1lUGVyaW9kKCk7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fREVQQVJUVVJFX0NBUEFDSVRZOgorCQkJCXJldHVybiBnZXREZXBhcnR1cmVDYXBhY2l0eSgpOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX01BWElNVU1fREVQQVJUVVJFX0NBUEFDSVRZOgorCQkJCXJldHVybiBnZXRNYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHkoKTsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19DQVBBQ0lUWToKKwkJCQlyZXR1cm4gZ2V0Q2FwYWNpdHkoKTsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19NQVhJTVVNX0NBUEFDSVRZOgorCQkJCXJldHVybiBnZXRNYXhpbXVtQ2FwYWNpdHkoKTsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19UUkFOU0lUX1RJTUU6CisJCQkJcmV0dXJuIGdldFRyYW5zaXRUaW1lKCk7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fU1RBUlRfVVBfREVMQVk6CisJCQkJcmV0dXJuIGdldFN0YXJ0VXBEZWxheSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1RSQU5TUE9SVF9NT0RFOgorCQkJCXNldFRyYW5zcG9ydE1vZGUoKFRyYW5zcG9ydE1vZGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19QT1BVTEFUSU9OX0lERU5USUZJRVI6CisJCQkJc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1RSQU5TUE9SVF9JREVOVElGSUVSOgorCQkJCXNldFRyYW5zcG9ydElkZW50aWZpZXIoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1JBVEVfVElNRV9QRVJJT0Q6CisJCQkJc2V0UmF0ZVRpbWVQZXJpb2QoKExvbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19NQVhJTVVNX0RFUEFSVFVSRV9DQVBBQ0lUWToKKwkJCQlzZXRNYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHkoKEludGVnZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19NQVhJTVVNX0NBUEFDSVRZOgorCQkJCXNldE1heGltdW1DYXBhY2l0eSgoSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1RSQU5TSVRfVElNRToKKwkJCQlzZXRUcmFuc2l0VGltZSgoTG9uZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1NUQVJUX1VQX0RFTEFZOgorCQkJCXNldFN0YXJ0VXBEZWxheSgoTG9uZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fVFJBTlNQT1JUX01PREU6CisJCQkJc2V0VHJhbnNwb3J0TW9kZShUUkFOU1BPUlRfTU9ERV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1BPUFVMQVRJT05fSURFTlRJRklFUjoKKwkJCQlzZXRQb3B1bGF0aW9uSWRlbnRpZmllcihQT1BVTEFUSU9OX0lERU5USUZJRVJfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19UUkFOU1BPUlRfSURFTlRJRklFUjoKKwkJCQlzZXRUcmFuc3BvcnRJZGVudGlmaWVyKFRSQU5TUE9SVF9JREVOVElGSUVSX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fUkFURV9USU1FX1BFUklPRDoKKwkJCQlzZXRSYXRlVGltZVBlcmlvZChSQVRFX1RJTUVfUEVSSU9EX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fTUFYSU1VTV9ERVBBUlRVUkVfQ0FQQUNJVFk6CisJCQkJc2V0TWF4aW11bURlcGFydHVyZUNhcGFjaXR5KE1BWElNVU1fREVQQVJUVVJFX0NBUEFDSVRZX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fTUFYSU1VTV9DQVBBQ0lUWToKKwkJCQlzZXRNYXhpbXVtQ2FwYWNpdHkoTUFYSU1VTV9DQVBBQ0lUWV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1RSQU5TSVRfVElNRToKKwkJCQlzZXRUcmFuc2l0VGltZShUUkFOU0lUX1RJTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19TVEFSVF9VUF9ERUxBWToKKwkJCQlzZXRTdGFydFVwRGVsYXkoU1RBUlRfVVBfREVMQVlfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19UUkFOU1BPUlRfTU9ERToKKwkJCQlyZXR1cm4gdHJhbnNwb3J0TW9kZSAhPSBUUkFOU1BPUlRfTU9ERV9FREVGQVVMVDsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19QT1BVTEFUSU9OX0lERU5USUZJRVI6CisJCQkJcmV0dXJuIFBPUFVMQVRJT05fSURFTlRJRklFUl9FREVGQVVMVCA9PSBudWxsID8gcG9wdWxhdGlvbklkZW50aWZpZXIgIT0gbnVsbCA6ICFQT1BVTEFUSU9OX0lERU5USUZJRVJfRURFRkFVTFQuZXF1YWxzKHBvcHVsYXRpb25JZGVudGlmaWVyKTsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19UUkFOU1BPUlRfSURFTlRJRklFUjoKKwkJCQlyZXR1cm4gVFJBTlNQT1JUX0lERU5USUZJRVJfRURFRkFVTFQgPT0gbnVsbCA/IHRyYW5zcG9ydElkZW50aWZpZXIgIT0gbnVsbCA6ICFUUkFOU1BPUlRfSURFTlRJRklFUl9FREVGQVVMVC5lcXVhbHModHJhbnNwb3J0SWRlbnRpZmllcik7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fQ1VSUkVOVF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFOgorCQkJCXJldHVybiBnZXRDdXJyZW50VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpICE9IG51bGw7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fUkFURV9USU1FX1BFUklPRDoKKwkJCQlyZXR1cm4gcmF0ZVRpbWVQZXJpb2QgIT0gUkFURV9USU1FX1BFUklPRF9FREVGQVVMVDsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19ERVBBUlRVUkVfQ0FQQUNJVFk6CisJCQkJcmV0dXJuIGdldERlcGFydHVyZUNhcGFjaXR5KCkgIT0gREVQQVJUVVJFX0NBUEFDSVRZX0VERUZBVUxUOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX01BWElNVU1fREVQQVJUVVJFX0NBUEFDSVRZOgorCQkJCXJldHVybiBtYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHkgIT0gTUFYSU1VTV9ERVBBUlRVUkVfQ0FQQUNJVFlfRURFRkFVTFQ7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fQ0FQQUNJVFk6CisJCQkJcmV0dXJuIGdldENhcGFjaXR5KCkgIT0gQ0FQQUNJVFlfRURFRkFVTFQ7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fTUFYSU1VTV9DQVBBQ0lUWToKKwkJCQlyZXR1cm4gbWF4aW11bUNhcGFjaXR5ICE9IE1BWElNVU1fQ0FQQUNJVFlfRURFRkFVTFQ7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fVFJBTlNJVF9USU1FOgorCQkJCXJldHVybiB0cmFuc2l0VGltZSAhPSBUUkFOU0lUX1RJTUVfRURFRkFVTFQ7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fU1RBUlRfVVBfREVMQVk6CisJCQkJcmV0dXJuIHN0YXJ0VXBEZWxheSAhPSBTVEFSVF9VUF9ERUxBWV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkKKwkJCXJldHVybiBzdXBlci50b1N0cmluZygpOworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlyZXN1bHQuYXBwZW5kKHRyYW5zcG9ydE1vZGUpOworCQlyZXN1bHQuYXBwZW5kKCIsICIpOworCQlyZXN1bHQuYXBwZW5kKHBvcHVsYXRpb25JZGVudGlmaWVyKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBcIiIpOworCQlyZXN1bHQuYXBwZW5kKHRyYW5zcG9ydElkZW50aWZpZXIpOworCQlyZXN1bHQuYXBwZW5kKCJcIiAiKTsKKwkJcmVzdWx0LmFwcGVuZChnZXRDdXJyZW50VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpLnRvU3RyaW5nKCkpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfSAvLyB0b1N0cmluZworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5EeW5hbWljTGFiZWxJbXBsI3NhbmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5zYW5lKCk7CisKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiByYXRlVGltZVBlcmlvZCA+PSAwOworCQlhc3NlcnQgcmV0VmFsdWU7CisKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZQorCQkJCSYmIGdldEN1cnJlbnRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkuc2FuZSgpOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9CisKK30gLy8gVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9pbXBsL1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9pbXBsL1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmMTAwNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL2ltcGwvVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwuamF2YQpAQCAtMCwwICsxLDE4NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkxhYmVsVmFsdWVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCNnZXRBdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb24gPGVtPkF2YWlsYWJsZSBEZXBhcnR1cmUgQ2FwYWNpdHkgUHJvcG9ydGlvbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsIGV4dGVuZHMgTGFiZWxWYWx1ZUltcGwKKwkJaW1wbGVtZW50cyBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZhaWxhYmxlRGVwYXJ0dXJlQ2FwYWNpdHlQcm9wb3J0aW9uKCkgPGVtPkF2YWlsYWJsZSBEZXBhcnR1cmUgQ2FwYWNpdHkgUHJvcG9ydGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QXZhaWxhYmxlRGVwYXJ0dXJlQ2FwYWNpdHlQcm9wb3J0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBBVkFJTEFCTEVfREVQQVJUVVJFX0NBUEFDSVRZX1BST1BPUlRJT05fRURFRkFVTFQgPSAxLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb24oKSA8ZW0+QXZhaWxhYmxlIERlcGFydHVyZSBDYXBhY2l0eSBQcm9wb3J0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgYXZhaWxhYmxlRGVwYXJ0dXJlQ2FwYWNpdHlQcm9wb3J0aW9uID0gQVZBSUxBQkxFX0RFUEFSVFVSRV9DQVBBQ0lUWV9QUk9QT1JUSU9OX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRBdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb24oKSB7CisJCXJldHVybiBhdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlRGVwYXJ0dXJlQ2FwYWNpdHlQcm9wb3J0aW9uKGRvdWJsZSBuZXdBdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb24pIHsKKwkJZG91YmxlIG9sZEF2YWlsYWJsZURlcGFydHVyZUNhcGFjaXR5UHJvcG9ydGlvbiA9IGF2YWlsYWJsZURlcGFydHVyZUNhcGFjaXR5UHJvcG9ydGlvbjsKKwkJYXZhaWxhYmxlRGVwYXJ0dXJlQ2FwYWNpdHlQcm9wb3J0aW9uID0gbmV3QXZhaWxhYmxlRGVwYXJ0dXJlQ2FwYWNpdHlQcm9wb3J0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX0FWQUlMQUJMRV9ERVBBUlRVUkVfQ0FQQUNJVFlfUFJPUE9SVElPTiwgb2xkQXZhaWxhYmxlRGVwYXJ0dXJlQ2FwYWNpdHlQcm9wb3J0aW9uLCBhdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb24pKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkxhYmVsVmFsdWVJbXBsI3Jlc2V0KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJLy8gTm90aGluZyB0byBkbworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyI3NhbmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOworCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgYXZhaWxhYmxlRGVwYXJ0dXJlQ2FwYWNpdHlQcm9wb3J0aW9uID49IDAgJiYgYXZhaWxhYmxlRGVwYXJ0dXJlQ2FwYWNpdHlQcm9wb3J0aW9uPD0gQVZBSUxBQkxFX0RFUEFSVFVSRV9DQVBBQ0lUWV9QUk9QT1JUSU9OX0VERUZBVUxUOworCQlhc3NlcnQgcmV0VmFsdWU7CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gc2FuZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19BVkFJTEFCTEVfREVQQVJUVVJFX0NBUEFDSVRZX1BST1BPUlRJT046CisJCQkJcmV0dXJuIGdldEF2YWlsYWJsZURlcGFydHVyZUNhcGFjaXR5UHJvcG9ydGlvbigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX0FWQUlMQUJMRV9ERVBBUlRVUkVfQ0FQQUNJVFlfUFJPUE9SVElPTjoKKwkJCQlzZXRBdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb24oKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fQVZBSUxBQkxFX0RFUEFSVFVSRV9DQVBBQ0lUWV9QUk9QT1JUSU9OOgorCQkJCXNldEF2YWlsYWJsZURlcGFydHVyZUNhcGFjaXR5UHJvcG9ydGlvbihBVkFJTEFCTEVfREVQQVJUVVJFX0NBUEFDSVRZX1BST1BPUlRJT05fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19BVkFJTEFCTEVfREVQQVJUVVJFX0NBUEFDSVRZX1BST1BPUlRJT046CisJCQkJcmV0dXJuIGF2YWlsYWJsZURlcGFydHVyZUNhcGFjaXR5UHJvcG9ydGlvbiAhPSBBVkFJTEFCTEVfREVQQVJUVVJFX0NBUEFDSVRZX1BST1BPUlRJT05fRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpCisJCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlyZXN1bHQuYXBwZW5kKCIgKGF2YWlsYWJsZSBwcm9wb3J0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChhdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb24pOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9IC8vIHRvU3RyaW5nCisKK30gLy8gVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3ByZXNlbnRhdGlvbi9MYWJlbHNBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJlc2VudGF0aW9uL0xhYmVsc0FjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzNzYzMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3ByZXNlbnRhdGlvbi9MYWJlbHNBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCkBAIC0wLDAgKzEsNDM3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworLy9pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29udHJvbEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YkNvbnRyaWJ1dGlvbkl0ZW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnByb3ZpZGVyLkRlZmluaXRpb25zRWRpdFBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGFjdGlvbiBiYXIgY29udHJpYnV0b3IgZm9yIHRoZSBMYWJlbHMgbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTGFiZWxzQWN0aW9uQmFyQ29udHJpYnV0b3IKKwlleHRlbmRzIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcgorCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yUGFydDsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGFjdGlvbiBvcGVucyB0aGUgUHJvcGVydGllcyB2aWV3LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQWN0aW9uIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbiA9CisJCW5ldyBBY3Rpb24oRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW0iKSkgLy8kTk9OLU5MUy0xJAorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQl0cnkgeworCQkJCQlnZXRQYWdlKCkuc2hvd1ZpZXcoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCURlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIGFjdGlvbiByZWZyZXNoZXMgdGhlIHZpZXdlciBvZiB0aGUgY3VycmVudCBlZGl0b3IgaWYgdGhlIGVkaXRvcgorCSAqIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElBY3Rpb24gcmVmcmVzaFZpZXdlckFjdGlvbiA9CisJCW5ldyBBY3Rpb24oRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtIikpIC8vJE5PTi1OTFMtMSQKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisJCQkJcmV0dXJuIGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWlmIChhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7CisJCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRWaWV3ZXIoKTsKKwkJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7CisJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyB3aWxsIGNvbnRhaW4gb25lIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlQ2hpbGRBY3Rpb25zOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVDaGlsZCBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlU2libGluZ0FjdGlvbnM7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZVNpYmxpbmcgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgY29udHJpYnV0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExhYmVsc0FjdGlvbkJhckNvbnRyaWJ1dG9yKCkgeworCQlzdXBlcihBRERJVElPTlNfTEFTVF9TVFlMRSk7CisJCWxvYWRSZXNvdXJjZUFjdGlvbiA9IG5ldyBMb2FkUmVzb3VyY2VBY3Rpb24oKTsKKwkJdmFsaWRhdGVBY3Rpb24gPSBuZXcgVmFsaWRhdGVBY3Rpb24oKTsKKwkJY29udHJvbEFjdGlvbiA9IG5ldyBDb250cm9sQWN0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIFNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMgdG8gdGhlIHRvb2wgYmFyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7CisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJsYWJlbHMtc2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImxhYmVscy1hZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgdG8gdGhlIG1lbnUgYmFyIGEgbWVudSBhbmQgc29tZSBzZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zLAorCSAqIGFzIHdlbGwgYXMgdGhlIHN1Yi1tZW51cyBmb3Igb2JqZWN0IGNyZWF0aW9uIGl0ZW1zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudU1hbmFnZXIpOworCisJCUlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfTGFiZWxzRWRpdG9yX21lbnUiKSwgIm9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzTWVudUlEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlQ2hpbGQgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgorCQkvLworCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKERlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIFByZXBhcmUgZm9yIENyZWF0ZVNpYmxpbmcgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgorCQkvLworCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEZvcmNlIGFuIHVwZGF0ZSBiZWNhdXNlIEVjbGlwc2UgaGlkZXMgZW1wdHkgbWVudXMgbm93LgorCQkvLworCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIKKwkJCShuZXcgSU1lbnVMaXN0ZW5lcigpIHsKKwkJCQkgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQkJCQkgbWVudU1hbmFnZXIudXBkYXRlQWxsKHRydWUpOworCQkJCSB9CisJCQkgfSk7CisKKwkJYWRkR2xvYmFsQWN0aW9ucyhzdWJtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogV2hlbiB0aGUgYWN0aXZlIGVkaXRvciBjaGFuZ2VzLCB0aGlzIHJlbWVtYmVycyB0aGUgY2hhbmdlIGFuZCByZWdpc3RlcnMgd2l0aCBpdCBhcyBhIHNlbGVjdGlvbiBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkgeworCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IocGFydCk7CisJCWFjdGl2ZUVkaXRvclBhcnQgPSBwYXJ0OworCisJCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KKwkJLy8KKwkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKwkJfQorCQlpZiAocGFydCA9PSBudWxsKSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7CisJCX0KKwkJZWxzZSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7CisJCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisKKwkJCS8vIEZha2UgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCB0byB1cGRhdGUgdGhlIG1lbnVzLgorCQkJLy8KKwkJCWlmIChzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSAhPSBudWxsKSB7CisJCQkJc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNlbGVjdGlvblByb3ZpZGVyLCBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LAorCSAqIGhhbmRsaW5nIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH1zIGJ5IHF1ZXJ5aW5nIGZvciB0aGUgY2hpbGRyZW4gYW5kIHNpYmxpbmdzCisJICogdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGVkIG9iamVjdCBhbmQgdXBkYXRpbmcgdGhlIG1lbnVzIGFjY29yZGluZ2x5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCS8vIFJlbW92ZSBhbnkgbWVudSBpdGVtcyBmb3Igb2xkIHNlbGVjdGlvbi4KKwkJLy8KKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMpOworCQl9CisKKwkJLy8gUXVlcnkgdGhlIG5ldyBzZWxlY3Rpb24gZm9yIGFwcHJvcHJpYXRlIG5ldyBjaGlsZC9zaWJsaW5nIGRlc2NyaXB0b3JzCisJCS8vCisJCUNvbGxlY3Rpb248Pz4gbmV3Q2hpbGREZXNjcmlwdG9ycyA9IG51bGw7CisJCUNvbGxlY3Rpb248Pz4gbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gbnVsbDsKKworCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOworCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnNpemUoKSA9PSAxKSB7CisJCQlPYmplY3Qgb2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOworCisJCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7CisKKwkJCW5ld0NoaWxkRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhvYmplY3QsIG51bGwpOworCQkJbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobnVsbCwgb2JqZWN0KTsKKwkJfQorCisJCS8vIEdlbmVyYXRlIGFjdGlvbnMgZm9yIHNlbGVjdGlvbjsgcG9wdWxhdGUgYW5kIHJlZHJhdyB0aGUgbWVudXMuCisJCS8vCisJCWNyZWF0ZUNoaWxkQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKG5ld0NoaWxkRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7CisJCWNyZWF0ZVNpYmxpbmdBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhuZXdTaWJsaW5nRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7CisKKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7CisJCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKKwkJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7CisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7CisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlQ2hpbGRBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCisJLyoqCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgeworCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVTaWJsaW5nQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwgZGVzY3JpcHRvcikpOworCQkJfQorCQl9CisJCXJldHVybiBhY3Rpb25zOworCX0KKworCS8qKgorCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gd2l0aCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cworCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sCisJICogYnkgaW5zZXJ0aW5nIHRoZW0gYmVmb3JlIHRoZSBzcGVjaWZpZWQgY29udHJpYnV0aW9uIGl0ZW0gPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+LgorCSAqIElmIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgc2ltcGx5IGFkZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zLCBTdHJpbmcgY29udHJpYnV0aW9uSUQpIHsKKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChJQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMpIHsKKwkJCQlpZiAoY29udHJpYnV0aW9uSUQgIT0gbnVsbCkgeworCQkJCQltYW5hZ2VyLmluc2VydEJlZm9yZShjb250cmlidXRpb25JRCwgYWN0aW9uKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCW1hbmFnZXIuYWRkKGFjdGlvbik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQkKKwkvKioKKwkgKiBUaGlzIHJlbW92ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cworCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucykgeworCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7CisJCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgeworCQkJCS8vIExvb2sgaW50byBTdWJDb250cmlidXRpb25JdGVtcworCQkJCS8vCisJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uSXRlbSA9IGl0ZW1zW2ldOworCQkJCXdoaWxlIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCQljb250cmlidXRpb25JdGVtID0gKChTdWJDb250cmlidXRpb25JdGVtKWNvbnRyaWJ1dGlvbkl0ZW0pLmdldElubmVySXRlbSgpOworCQkJCX0KKworCQkJCS8vIERlbGV0ZSB0aGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbXMgd2l0aCBtYXRjaGluZyBhY3Rpb24uCisJCQkJLy8KKwkJCQlpZiAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKKwkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0QWN0aW9uKCk7CisJCQkJCWlmIChhY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsKKwkJCQkJCW1hbmFnZXIucmVtb3ZlKGNvbnRyaWJ1dGlvbkl0ZW0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHBvcC11cCBtZW51IGJlZm9yZSBpdCBhcHBlYXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKKwkJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBudWxsOworCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKERlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOworCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7CisJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZWRpdCIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgaW5zZXJ0cyBnbG9iYWwgYWN0aW9ucyBiZWZvcmUgdGhlICJhZGRpdGlvbnMtZW5kIiBzZXBhcmF0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucy1lbmQiLCBuZXcgU2VwYXJhdG9yKCJ1aS1hY3Rpb25zIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24pOyAvLyROT04tTkxTLTEkCisKKwkJcmVmcmVzaFZpZXdlckFjdGlvbi5zZXRFbmFibGVkKHJlZnJlc2hWaWV3ZXJBY3Rpb24uaXNFbmFibGVkKCkpOwkJCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgcmVmcmVzaFZpZXdlckFjdGlvbik7IC8vJE5PTi1OTFMtMSQKKworCQlzdXBlci5hZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGVuc3VyZXMgdGhhdCBhIGRlbGV0ZSBhY3Rpb24gd2lsbCBjbGVhbiB1cCBhbGwgcmVmZXJlbmNlcyB0byBkZWxldGVkIG9iamVjdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlQWxsUmVmZXJlbmNlc09uRGVsZXRlKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3ByZXNlbnRhdGlvbi9MYWJlbHNFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3ByZXNlbnRhdGlvbi9MYWJlbHNFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmVjZTRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJlc2VudGF0aW9uL0xhYmVsc0VkaXRvci5qYXZhCkBAIC0wLDAgKzEsMTU1OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TYXZlQXNEaWFsb2c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5NYXJrZXJIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5WaWV3ZXJQYW5lOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5lZGl0b3IuUHJvYmxlbUVkaXRvclBhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuY2VsbGVkaXRvci5BZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5Mb2NhbFRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLlVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSU1hcmtlckhlbHBlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS52aWV3LkV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlci5MYWJlbHNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcm92aWRlci5Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByb3ZpZGVyLk1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLnByb3ZpZGVyLlNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5wcm92aWRlci5TZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLnByb3ZpZGVyLlNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXIuRGVmaW5pdGlvbnNFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXIuRWRnZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMucHJvdmlkZXIuTm9kZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMucHJvdmlkZXIuVHlwZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKKworCisvKioKKyAqIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIExhYmVscyBtb2RlbCBlZGl0b3IuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBMYWJlbHNFZGl0b3IKKwlleHRlbmRzIE11bHRpUGFnZUVkaXRvclBhcnQKKwlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluUHJvdmlkZXIsIElTZWxlY3Rpb25Qcm92aWRlciwgSU1lbnVMaXN0ZW5lciwgSVZpZXdlclByb3ZpZGVyLCBJR290b01hcmtlciB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgZWRpdGluZyBkb21haW4gdGhhdCBpcyB1c2VkIHRvIHRyYWNrIGFsbCBjaGFuZ2VzIHRvIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBvbmUgYWRhcHRlciBmYWN0b3J5IHVzZWQgZm9yIHByb3ZpZGluZyB2aWV3cyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNvbnRlbnRPdXRsaW5lUGFnZSBjb250ZW50T3V0bGluZVBhZ2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIGEga2x1ZGdlLi4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBjb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UncyB2aWV3ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgY29udGVudE91dGxpbmVWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBwcm9wZXJ0eSBzaGVldCBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQcm9wZXJ0eVNoZWV0UGFnZSBwcm9wZXJ0eVNoZWV0UGFnZTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHZpZXdlciB0aGF0IHNoYWRvd3MgdGhlIHNlbGVjdGlvbiBpbiB0aGUgY29udGVudCBvdXRsaW5lLgorCSAqIFRoZSBwYXJlbnQgcmVsYXRpb24gbXVzdCBiZSBjb3JyZWN0bHkgZGVmaW5lZCBmb3IgdGhpcyB0byB3b3JrLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmVlVmlld2VyIHNlbGVjdGlvblZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBjb250ZW50IHZpZXdlciwgd2hpY2ggbWF5IGJlIGVpdGhlciBvbmUgb2YgdGhlIHZpZXdlcnMgaW4gdGhlIHBhZ2VzIG9yIHRoZSBjb250ZW50IG91dGxpbmUgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBWaWV3ZXIgY3VycmVudFZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyB0byB3aGljaCBldmVyIHZpZXdlciBpcyBhY3RpdmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9cyB0aGF0IGFyZSBsaXN0ZW5pbmcgdG8gdGhpcyBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZWRpdG9yIGFzIGEgd2hvbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb24gZWRpdG9yU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKKworCS8qKgorCSAqIFRoZSBNYXJrZXJIZWxwZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHdvcmtzcGFjZSByZXNvdXJjZSBtYXJrZXJzIHByZXNlbnRlZAorCSAqIGluIEVjbGlwc2UncyBQcm9ibGVtcyBWaWV3LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXJrZXJIZWxwZXIgbWFya2VySGVscGVyID0gbmV3IEVkaXRVSU1hcmtlckhlbHBlcigpOworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIGZvciB3aGVuIHRoZSBvdXRsaW5lIGJlY29tZXMgYWN0aXZlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyID0KKwkJbmV3IElQYXJ0TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQlpZiAocCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSB7CisJCQkJCWlmICgoKENvbnRlbnRPdXRsaW5lKXApLmdldEN1cnJlbnRQYWdlKCkgPT0gY29udGVudE91dGxpbmVQYWdlKSB7CisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihMYWJlbHNFZGl0b3IudGhpcyk7CisKKwkJCQkJCXNldEN1cnJlbnRWaWV3ZXIoY29udGVudE91dGxpbmVWaWV3ZXIpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHAgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSB7CisJCQkJCWlmICgoKFByb3BlcnR5U2hlZXQpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBwcm9wZXJ0eVNoZWV0UGFnZSkgeworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoTGFiZWxzRWRpdG9yLnRoaXMpOworCQkJCQkJaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChwID09IExhYmVsc0VkaXRvci50aGlzKSB7CisJCQkJCWhhbmRsZUFjdGl2YXRlKCk7CisJCQkJfQorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCX07CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBzYXZlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gc2F2ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogTWFwIHRvIHN0b3JlIHRoZSBkaWFnbm9zdGljIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+IHJlc291cmNlVG9EaWFnbm9zdGljTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+KCk7CisKKwkvKioKKwkgKiBDb250cm9scyB3aGV0aGVyIHRoZSBwcm9ibGVtIGluZGljYXRpb24gc2hvdWxkIGJlIHVwZGF0ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOworCisJLyoqCisJICogQWRhcHRlciB1c2VkIHRvIHVwZGF0ZSB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHdoZW4gcmVzb3VyY2VzIGFyZSBkZW1hbmRlZCBsb2FkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEVDb250ZW50QWRhcHRlciBwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIgPSAKKwkJbmV3IEVDb250ZW50QWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKKwkJCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJlc291cmNlLmNsYXNzKSkgeworCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEOgorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fRVJST1JTOgorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fV0FSTklOR1M6IHsKKwkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKKwkJCQkJCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgbnVsbCk7CisJCQkJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgZGlhZ25vc3RpYyk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5yZW1vdmUocmVzb3VyY2UpOworCQkJCQkJCX0KKworCQkJCQkJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgeworCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQkJCQkJCQkJCSB9CisJCQkJCQkJCQkgfSk7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCQkJfQorCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsKKwkJCQliYXNpY1NldFRhcmdldCh0YXJnZXQpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHVuc2V0VGFyZ2V0KFJlc291cmNlIHRhcmdldCkgeworCQkJCWJhc2ljVW5zZXRUYXJnZXQodGFyZ2V0KTsKKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyBmb3Igd29ya3NwYWNlIGNoYW5nZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPQorCQluZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7CisJCQkJdHJ5IHsKKwkJCQkJY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgeworCQkJCQkJcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpOworCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworCQkJCQkJCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgeworCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgfHwKKwkJCQkJCQkJICAgIGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIGRlbHRhLmdldEZsYWdzKCkgIT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUykgeworCQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShkZWx0YS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpLCBmYWxzZSk7CisJCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworCQkJCQkJCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgeworCQkJCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWVsc2UgaWYgKCFzYXZlZFJlc291cmNlcy5yZW1vdmUocmVzb3VyY2UpKSB7CisJCQkJCQkJCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCX0KKworCQkJCQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldENoYW5nZWRSZXNvdXJjZXMoKSB7CisJCQkJCQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7CisJCQkJCQl9CisKKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRSZW1vdmVkUmVzb3VyY2VzKCkgeworCQkJCQkJCXJldHVybiByZW1vdmVkUmVzb3VyY2VzOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJZmluYWwgUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOworCQkJCQlkZWx0YS5hY2NlcHQodmlzaXRvcik7CisKKwkJCQkJaWYgKCF2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJIHJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsKKwkJCQkJCQkJCSBpZiAoIWlzRGlydHkoKSkgeworCQkJCQkJCQkJCSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKExhYmVsc0VkaXRvci50aGlzLCBmYWxzZSk7CisJCQkJCQkJCQkgfQorCQkJCQkJCQkgfQorCQkJCQkJCSB9KTsKKwkJCQkJfQorCisJCQkJCWlmICghdmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCSBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7CisJCQkJCQkJCQkgaWYgKGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gTGFiZWxzRWRpdG9yLnRoaXMpIHsKKwkJCQkJCQkJCQkgaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQkJCQkJCSB9CisJCQkJCQkJCSB9CisJCQkJCQkJIH0pOworCQkJCQl9CisJCQkJfQorCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogSGFuZGxlcyBhY3RpdmF0aW9uIG9mIHRoZSBlZGl0b3Igb3IgaXQncyBhc3NvY2lhdGVkIHZpZXdzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFjdGl2YXRlKCkgeworCQkvLyBSZWNvbXB1dGUgdGhlIHJlYWQgb25seSBzdGF0ZS4KKwkJLy8KKwkJaWYgKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkgIT0gbnVsbCkgeworCQkgIGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkuY2xlYXIoKTsKKworCQkgIC8vIFJlZnJlc2ggYW55IGFjdGlvbnMgdGhhdCBtYXkgYmVjb21lIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisJCSAgLy8KKwkJICBzZXRTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpOworCQl9CisKKwkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgeworCQkJaWYgKGhhbmRsZURpcnR5Q29uZmxpY3QoKSkgeworCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoTGFiZWxzRWRpdG9yLnRoaXMsIGZhbHNlKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCWNoYW5nZWRSZXNvdXJjZXMucmVtb3ZlQWxsKHNhdmVkUmVzb3VyY2VzKTsKKwkJCWhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKTsKKwkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBIYW5kbGVzIHdoYXQgdG8gZG8gd2l0aCBjaGFuZ2VkIHJlc291cmNlcyBvbiBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKSB7CisJCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkgJiYgKCFpc0RpcnR5KCkgfHwgaGFuZGxlRGlydHlDb25mbGljdCgpKSkgeworCQkJaWYgKGlzRGlydHkoKSkgeworCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSk7CisJCQl9CisJCQllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7CisKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgeworCQkJCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKSB7CisJCQkJCXJlc291cmNlLnVubG9hZCgpOworCQkJCQl0cnkgeworCQkJCQkJcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOworCQkJCQl9CisJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCWlmICghcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAuY29udGFpbnNLZXkocmVzb3VyY2UpKSB7CisJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4uaXNTdGFsZShlZGl0b3JTZWxlY3Rpb24pKSB7CisJCQkJc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOworCQkJfQorCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQl9CisJfQorICAKKwkvKioKKwkgKiBVcGRhdGVzIHRoZSBwcm9ibGVtcyBpbmRpY2F0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWVkIGRpYWdub3N0aWMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKSB7CisJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgeworCQkJQmFzaWNEaWFnbm9zdGljIGRpYWdub3N0aWMgPQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMKKwkJCQkJKERpYWdub3N0aWMuT0ssCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucyIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJIDAsCisJCQkJCSBudWxsLAorCQkJCQkgbmV3IE9iamVjdCBbXSB7IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSB9KTsKKwkJCWZvciAoRGlhZ25vc3RpYyBjaGlsZERpYWdub3N0aWMgOiByZXNvdXJjZVRvRGlhZ25vc3RpY01hcC52YWx1ZXMoKSkgeworCQkJCWlmIChjaGlsZERpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCWRpYWdub3N0aWMuYWRkKGNoaWxkRGlhZ25vc3RpYyk7CisJCQkJfQorCQkJfQorCisJCQlpbnQgbGFzdEVkaXRvclBhZ2UgPSBnZXRQYWdlQ291bnQoKSAtIDE7CisJCQlpZiAobGFzdEVkaXRvclBhZ2UgPj0gMCAmJiBnZXRFZGl0b3IobGFzdEVkaXRvclBhZ2UpIGluc3RhbmNlb2YgUHJvYmxlbUVkaXRvclBhcnQpIHsKKwkJCQkoKFByb2JsZW1FZGl0b3JQYXJ0KWdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkpLnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7CisJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCXNldEFjdGl2ZVBhZ2UobGFzdEVkaXRvclBhZ2UpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJUHJvYmxlbUVkaXRvclBhcnQgcHJvYmxlbUVkaXRvclBhcnQgPSBuZXcgUHJvYmxlbUVkaXRvclBhcnQoKTsKKwkJCQlwcm9ibGVtRWRpdG9yUGFydC5zZXREaWFnbm9zdGljKGRpYWdub3N0aWMpOworCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldE1hcmtlckhlbHBlcihtYXJrZXJIZWxwZXIpOworCQkJCXRyeSB7CisJCQkJCWFkZFBhZ2UoKytsYXN0RWRpdG9yUGFnZSwgcHJvYmxlbUVkaXRvclBhcnQsIGdldEVkaXRvcklucHV0KCkpOworCQkJCQlzZXRQYWdlVGV4dChsYXN0RWRpdG9yUGFnZSwgcHJvYmxlbUVkaXRvclBhcnQuZ2V0UGFydE5hbWUoKSk7CisJCQkJCXNldEFjdGl2ZVBhZ2UobGFzdEVkaXRvclBhZ2UpOworCQkJCQlzaG93VGFicygpOworCQkJCX0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCURlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChtYXJrZXJIZWxwZXIuaGFzTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpKSB7CisJCQkJbWFya2VySGVscGVyLmRlbGV0ZU1hcmtlcnMoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCW1hcmtlckhlbHBlci5jcmVhdGVNYXJrZXJzKGRpYWdub3N0aWMpOworCQkJCQl9CisJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogU2hvd3MgYSBkaWFsb2cgdGhhdCBhc2tzIGlmIGNvbmZsaWN0aW5nIGNoYW5nZXMgc2hvdWxkIGJlIGRpc2NhcmRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkgeworCQlyZXR1cm4KKwkJCU1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uCisJCQkJKGdldFNpdGUoKS5nZXRTaGVsbCgpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9GaWxlQ29uZmxpY3RfbGFiZWwiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9XQVJOX0ZpbGVDb25mbGljdCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhIG1vZGVsIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGFiZWxzRWRpdG9yKCkgeworCQlzdXBlcigpOworCQlpbml0aWFsaXplRWRpdGluZ0RvbWFpbigpOworCX0KKworCS8qKgorCSAqIFRoaXMgc2V0cyB1cCB0aGUgZWRpdGluZyBkb21haW4gZm9yIHRoZSBtb2RlbCBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKSB7CisJCS8vIENyZWF0ZSBhbiBhZGFwdGVyIGZhY3RvcnkgdGhhdCB5aWVsZHMgaXRlbSBwcm92aWRlcnMuCisJCS8vCisJCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5EZXNjcmlwdG9yLlJlZ2lzdHJ5LklOU1RBTkNFKTsKKworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEVkZ2VzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBMYWJlbHNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE5vZGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBUeXBlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IENvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RpZmllckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNlcXVlbmNlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU29sdmVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlIGV4ZWN1dGVkLgorCQkvLworCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKKworCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLgorCQkvLworCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIKKwkJCShuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7CisJCQkJIHB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsKKwkJCQkJIGdldENvbnRhaW5lcigpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCSAobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCSAgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkgIGZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKKworCQkJCQkJCQkgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuCisJCQkJCQkJCSAgLy8KKwkJCQkJCQkJICBDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spZXZlbnQuZ2V0U291cmNlKCkpLmdldE1vc3RSZWNlbnRDb21tYW5kKCk7CisJCQkJCQkJCSAgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKKwkJCQkJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOworCQkJCQkJCQkgIH0KKwkJCQkJCQkJICBpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCAmJiAhcHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgeworCQkJCQkJCQkJICBwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7CisJCQkJCQkJCSAgfQorCQkJCQkJCSAgfQorCQkJCQkJICB9KTsKKwkJCQkgfQorCQkJIH0pOworCisJCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KKwkJLy8KKwkJZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywgbmV3IEhhc2hNYXA8UmVzb3VyY2UsIEJvb2xlYW4+KCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgaGVyZSBmb3IgdGhlIGxpc3RlbmVyIHRvIGJlIGFibGUgdG8gY2FsbCBpdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoaW50IGFjdGlvbikgeworCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UoYWN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdGhlIHNlbGVjdGlvbiBpbnRvIHdoaWNoZXZlciB2aWV3ZXIgaXMgYWN0aXZlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgeworCQlmaW5hbCBDb2xsZWN0aW9uPD8+IHRoZVNlbGVjdGlvbiA9IGNvbGxlY3Rpb247CisJCS8vIE1ha2Ugc3VyZSBpdCdzIG9rYXkuCisJCS8vCisJCWlmICh0aGVTZWxlY3Rpb24gIT0gbnVsbCAmJiAhdGhlU2VsZWN0aW9uLmlzRW1wdHkoKSkgeworCQkJUnVubmFibGUgcnVubmFibGUgPQorCQkJCW5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgY29udGVudCB2aWV3ZXIgb2YgdGhlIGVkaXRvci4KKwkJCQkJCS8vCisJCQkJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7CisJCQkJCQkJY3VycmVudFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhlU2VsZWN0aW9uLnRvQXJyYXkoKSksIHRydWUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfTsKKwkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMocnVubmFibGUpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBlZGl0aW5nIGRvbWFpbiBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElFZGl0aW5nRG9tYWluUHJvdmlkZXJ9IGludGVyZmFjZS4KKwkgKiBUaGlzIGlzIGltcG9ydGFudCBmb3IgaW1wbGVtZW50aW5nIHRoZSBzdGF0aWMgbWV0aG9kcyBvZiB7QGxpbmsgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWlufQorCSAqIGFuZCBmb3Igc3VwcG9ydGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb259LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7CisJCXJldHVybiBlZGl0aW5nRG9tYWluOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBjbGFzcyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciB7CisJCXB1YmxpYyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0IFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIHBhcmVudCAhPSBudWxsOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBtYWtlcyBzdXJlIHRoYXQgb25lIGNvbnRlbnQgdmlld2VyLCBlaXRoZXIgZm9yIHRoZSBjdXJyZW50IHBhZ2Ugb3IgdGhlIG91dGxpbmUgdmlldywgaWYgaXQgaGFzIGZvY3VzLAorCSAqIGlzIHRoZSBjdXJyZW50IG9uZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vmlld2VyKFZpZXdlciB2aWV3ZXIpIHsKKwkJLy8gSWYgaXQgaXMgY2hhbmdpbmcuLi4KKwkJLy8KKwkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gdmlld2VyKSB7CisJCQlpZiAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsKKwkJCQkvLyBDcmVhdGUgdGhlIGxpc3RlbmVyIG9uIGRlbWFuZC4KKwkJCQkvLworCQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9CisJCQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJCQkJLy8gVGhpcyBqdXN0IG5vdGlmaWVzIHRob3NlIHRoaW5ncyB0aGF0IGFyZSBhZmZlY3RlZCBieSB0aGUgc2VjdGlvbi4KKwkJCQkJCS8vCisJCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBzZWxlY3Rpb25DaGFuZ2VkRXZlbnQpIHsKKwkJCQkJCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCX0KKworCQkJLy8gU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG9sZCBvbmUuCisJCQkvLworCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgeworCQkJCWN1cnJlbnRWaWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7CisJCQl9CisKKwkJCS8vIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmV3IG9uZS4KKwkJCS8vCisJCQlpZiAodmlld2VyICE9IG51bGwpIHsKKwkJCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7CisJCQl9CisKKwkJCS8vIFJlbWVtYmVyIGl0LgorCQkJLy8KKwkJCWN1cnJlbnRWaWV3ZXIgPSB2aWV3ZXI7CisKKwkJCS8vIFNldCB0aGUgZWRpdG9ycyBzZWxlY3Rpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgdmlld2VyJ3Mgc2VsZWN0aW9uLgorCQkJLy8KKwkJCXNldFNlbGVjdGlvbihjdXJyZW50Vmlld2VyID09IG51bGwgPyBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZIDogY3VycmVudFZpZXdlci5nZXRTZWxlY3Rpb24oKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHZpZXdlciBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElWaWV3ZXJQcm92aWRlcn0gaW50ZXJmYWNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgeworCQlyZXR1cm4gY3VycmVudFZpZXdlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIgYW5kIGFkZHMgYSBsaXN0ZW5lciBhcyB3ZWxsIHJlZ2lzdGVyaW5nIHRoZSBtZW51IGZvciBleHRlbnNpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKKwkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOworCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7CisJCU1lbnUgbWVudT0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7CisJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKKwkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUsIG5ldyBVbndyYXBwaW5nU2VsZWN0aW9uUHJvdmlkZXIodmlld2VyKSk7CisKKwkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTks7CisJCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKKwkJdmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyYWdBZGFwdGVyKHZpZXdlcikpOworCQl2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyKGVkaXRpbmdEb21haW4sIHZpZXdlcikpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCBjYWxsZWQgdG8gbG9hZCBhIHJlc291cmNlIGludG8gdGhlIGVkaXRpbmcgZG9tYWluJ3MgcmVzb3VyY2Ugc2V0IGJhc2VkIG9uIHRoZSBlZGl0b3IncyBpbnB1dC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVNb2RlbCgpIHsKKwkJVVJJIHJlc291cmNlVVJJID0gRWRpdFVJVXRpbC5nZXRVUkkoZ2V0RWRpdG9ySW5wdXQoKSk7CisJCUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7CisJCXRyeSB7CisJCQkvLyBMb2FkIHRoZSByZXNvdXJjZSB0aHJvdWdoIHRoZSBlZGl0aW5nIGRvbWFpbi4KKwkJCS8vCisJCQlyZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgdHJ1ZSk7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlleGNlcHRpb24gPSBlOworCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIGZhbHNlKTsKKwkJfQorCisJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pOworCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJfQorCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkuYWRkKHByb2JsZW1JbmRpY2F0aW9uQWRhcHRlcik7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIGRpYWdub3N0aWMgZGVzY3JpYmluZyB0aGUgZXJyb3JzIGFuZCB3YXJuaW5ncyBsaXN0ZWQgaW4gdGhlIHJlc291cmNlCisJICogYW5kIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIChpZiBhbnkpLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEaWFnbm9zdGljIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKFJlc291cmNlIHJlc291cmNlLCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCWlmICghcmVzb3VyY2UuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpIHx8ICFyZXNvdXJjZS5nZXRXYXJuaW5ncygpLmlzRW1wdHkoKSkgeworCQkJQmFzaWNEaWFnbm9zdGljIGJhc2ljRGlhZ25vc3RpYyA9CisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkgMCwKKwkJCQkJIGdldFN0cmluZygiX1VJX0NyZWF0ZU1vZGVsRXJyb3JfbWVzc2FnZSIsIHJlc291cmNlLmdldFVSSSgpKSwgLy8kTk9OLU5MUy0xJAorCQkJCQkgbmV3IE9iamVjdCBbXSB7IGV4Y2VwdGlvbiA9PSBudWxsID8gKE9iamVjdClyZXNvdXJjZSA6IGV4Y2VwdGlvbiB9KTsKKwkJCWJhc2ljRGlhZ25vc3RpYy5tZXJnZShFY29yZVV0aWwuY29tcHV0ZURpYWdub3N0aWMocmVzb3VyY2UsIHRydWUpKTsKKwkJCXJldHVybiBiYXNpY0RpYWdub3N0aWM7CisJCX0KKwkJZWxzZSBpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKKwkJCXJldHVybgorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMKKwkJCQkJKERpYWdub3N0aWMuRVJST1IsCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucyIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJIDAsCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksIC8vJE5PTi1OTFMtMSQKKwkJCQkJIG5ldyBPYmplY3RbXSB7IGV4Y2VwdGlvbiB9KTsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBEaWFnbm9zdGljLk9LX0lOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBpbnN0YWxsIHlvdXIgb3duIGNvbnRyb2xzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VzKCkgeworCQkvLyBDcmVhdGVzIHRoZSBtb2RlbCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQKKwkJLy8KKwkJY3JlYXRlTW9kZWwoKTsKKworCQkvLyBPbmx5IGNyZWF0ZXMgdGhlIG90aGVyIHBhZ2VzIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBlZGl0ZWQKKwkJLy8KKwkJaWYgKCFnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCS8vIENyZWF0ZSBhIHBhZ2UgZm9yIHRoZSBzZWxlY3Rpb24gdHJlZSB2aWV3LgorCQkJLy8KKwkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGdldENvbnRhaW5lcigpLCBTV1QuTVVMVEkpOworCQkJc2VsZWN0aW9uVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7CisJCQlzZXRDdXJyZW50Vmlld2VyKHNlbGVjdGlvblZpZXdlcik7CisKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCisJCQluZXcgQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yKHNlbGVjdGlvblZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsKKworCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Ioc2VsZWN0aW9uVmlld2VyKTsKKwkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHRyZWUpOworCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisKKwkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJIHNldEFjdGl2ZVBhZ2UoMCk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJLy8gRW5zdXJlcyB0aGF0IHRoaXMgZWRpdG9yIHdpbGwgb25seSBkaXNwbGF5IHRoZSBwYWdlJ3MgdGFiCisJCS8vIGFyZWEgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgcGFnZQorCQkvLworCQlnZXRDb250YWluZXIoKS5hZGRDb250cm9sTGlzdGVuZXIKKwkJCShuZXcgQ29udHJvbEFkYXB0ZXIoKSB7CisJCQkJYm9vbGVhbiBndWFyZCA9IGZhbHNlOworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBldmVudCkgeworCQkJCQlpZiAoIWd1YXJkKSB7CisJCQkJCQlndWFyZCA9IHRydWU7CisJCQkJCQloaWRlVGFicygpOworCQkJCQkJZ3VhcmQgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCSB9KTsKKworCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQkJCSB9CisJCQkgfSk7CisJfQorCisJLyoqCisJICogSWYgdGhlcmUgaXMganVzdCBvbmUgcGFnZSBpbiB0aGUgbXVsdGktcGFnZSBlZGl0b3IgcGFydCwKKwkgKiB0aGlzIGhpZGVzIHRoZSBzaW5nbGUgdGFiIGF0IHRoZSBib3R0b20uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGlkZVRhYnMoKSB7CisJCWlmIChnZXRQYWdlQ291bnQoKSA8PSAxKSB7CisJCQlzZXRQYWdlVGV4dCgwLCAiIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsKKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodCgxKTsKKwkJCQlQb2ludCBwb2ludCA9IGdldENvbnRhaW5lcigpLmdldFNpemUoKTsKKwkJCQlnZXRDb250YWluZXIoKS5zZXRTaXplKHBvaW50LngsIHBvaW50LnkgKyA2KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGFnZSBpbiB0aGUgbXVsdGktcGFnZSBlZGl0b3IgcGFydCwKKwkgKiB0aGlzIHNob3dzIHRoZSB0YWJzIGF0IHRoZSBib3R0b20uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2hvd1RhYnMoKSB7CisJCWlmIChnZXRQYWdlQ291bnQoKSA+IDEpIHsKKwkJCXNldFBhZ2VUZXh0KDAsIGdldFN0cmluZygiX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsKKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodChTV1QuREVGQVVMVCk7CisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7CisJCQkJZ2V0Q29udGFpbmVyKCkuc2V0U2l6ZShwb2ludC54LCBwb2ludC55IC0gNik7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWQgdG8gdHJhY2sgdGhlIGFjdGl2ZSB2aWV3ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgcGFnZUluZGV4KSB7CisJCXN1cGVyLnBhZ2VDaGFuZ2UocGFnZUluZGV4KTsKKworCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsKKwkJCWhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKGNvbnRlbnRPdXRsaW5lUGFnZS5nZXRTZWxlY3Rpb24oKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGhvdyB0aGUgZnJhbWV3b3JrIGRldGVybWluZXMgd2hpY2ggaW50ZXJmYWNlcyB3ZSBpbXBsZW1lbnQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKKwkJaWYgKGtleS5lcXVhbHMoSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcykpIHsKKwkJCXJldHVybiBzaG93T3V0bGluZVZpZXcoKSA/IGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIDogbnVsbDsKKwkJfQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykpIHsKKwkJCXJldHVybiBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOworCQl9CisJCWVsc2UgaWYgKGtleS5lcXVhbHMoSUdvdG9NYXJrZXIuY2xhc3MpKSB7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGtleSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIGNvbnRlbnQgb3V0bGluZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElDb250ZW50T3V0bGluZVBhZ2UgZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgeworCQlpZiAoY29udGVudE91dGxpbmVQYWdlID09IG51bGwpIHsKKwkJCS8vIFRoZSBjb250ZW50IG91dGxpbmUgaXMganVzdCBhIHRyZWUuCisJCQkvLworCQkJY2xhc3MgTXlDb250ZW50T3V0bGluZVBhZ2UgZXh0ZW5kcyBDb250ZW50T3V0bGluZVBhZ2UgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQkJCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyID0gZ2V0VHJlZVZpZXdlcigpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisKKwkJCQkJLy8gU2V0IHVwIHRoZSB0cmVlIHZpZXdlci4KKwkJCQkJLy8KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKworCQkJCQkvLyBNYWtlIHN1cmUgb3VyIHBvcHVwcyB3b3JrLgorCQkJCQkvLworCQkJCQljcmVhdGVDb250ZXh0TWVudUZvcihjb250ZW50T3V0bGluZVZpZXdlcik7CisKKwkJCQkJaWYgKCFlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCSAgLy8gU2VsZWN0IHRoZSByb290IG9iamVjdCBpbiB0aGUgdmlldy4KKwkJCQkJICAvLworCQkJCQkgIGNvbnRlbnRPdXRsaW5lVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBtYWtlQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyKSB7CisJCQkJCXN1cGVyLm1ha2VDb250cmlidXRpb25zKG1lbnVNYW5hZ2VyLCB0b29sQmFyTWFuYWdlciwgc3RhdHVzTGluZU1hbmFnZXIpOworCQkJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyID0gc3RhdHVzTGluZU1hbmFnZXI7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisJCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7CisJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOworCQkJCX0KKwkJCX0KKworCQkJY29udGVudE91dGxpbmVQYWdlID0gbmV3IE15Q29udGVudE91dGxpbmVQYWdlKCk7CisKKwkJCS8vIExpc3RlbiB0byBzZWxlY3Rpb24gc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGl0IGlzIGEgc3BlY2lhbCB3YXkuCisJCQkvLworCQkJY29udGVudE91dGxpbmVQYWdlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgorCQkJCShuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCQkJIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGhhbmRsZSBzZWxlY3Rpb25zIGNvcnJlY3RseS4KKwkJCQkJIC8vCisJCQkJCSBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCQkJIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKKwkJCQkJIH0KKwkJCQkgfSk7CisJCX0KKworCQlyZXR1cm4gY29udGVudE91dGxpbmVQYWdlOworCX0KKworCS8qKgorCSAqIFRoaXMgYWNjZXNzZXMgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUgcHJvcGVydHkgc2hlZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElQcm9wZXJ0eVNoZWV0UGFnZSBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKKwkJaWYgKHByb3BlcnR5U2hlZXRQYWdlID09IG51bGwpIHsKKwkJCXByb3BlcnR5U2hlZXRQYWdlID0KKwkJCQluZXcgRXh0ZW5kZWRQcm9wZXJ0eVNoZWV0UGFnZShlZGl0aW5nRG9tYWluKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihMaXN0PD8+IHNlbGVjdGlvbikgeworCQkJCQkJTGFiZWxzRWRpdG9yLnRoaXMuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0aW9uKTsKKwkJCQkJCUxhYmVsc0VkaXRvci50aGlzLnNldEZvY3VzKCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisJCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7CisJCQkJCX0KKwkJCQl9OworCQkJcHJvcGVydHlTaGVldFBhZ2Uuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJfQorCisJCXJldHVybiBwcm9wZXJ0eVNoZWV0UGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGRlYWxzIHdpdGggaG93IHdlIHdhbnQgc2VsZWN0aW9uIGluIHRoZSBvdXRsaW5lciB0byBhZmZlY3QgdGhlIG90aGVyIHZpZXdzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWlmIChzZWxlY3Rpb25WaWV3ZXIgIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJSXRlcmF0b3I8Pz4gc2VsZWN0ZWRFbGVtZW50cyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5pdGVyYXRvcigpOworCQkJaWYgKHNlbGVjdGVkRWxlbWVudHMuaGFzTmV4dCgpKSB7CisJCQkJLy8gR2V0IHRoZSBmaXJzdCBzZWxlY3RlZCBlbGVtZW50LgorCQkJCS8vCisJCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHMubmV4dCgpOworCisJCQkJQXJyYXlMaXN0PE9iamVjdD4gc2VsZWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudCk7CisJCQkJd2hpbGUgKHNlbGVjdGVkRWxlbWVudHMuaGFzTmV4dCgpKSB7CisJCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudHMubmV4dCgpKTsKKwkJCQl9CisKKwkJCQkvLyBTZXQgdGhlIHNlbGVjdGlvbiB0byB0aGUgd2lkZ2V0LgorCQkJCS8vCisJCQkJc2VsZWN0aW9uVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb25MaXN0KSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHRlc3RzIHRoZSBjb21tYW5kIHN0YWNrLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7CisJCXJldHVybiAoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLmlzU2F2ZU5lZWRlZCgpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSUVkaXRvclBhcnR9IGFuZCBzaW1wbHkgc2F2ZXMgdGhlIG1vZGVsIGZpbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisJCS8vIFNhdmUgb25seSByZXNvdXJjZXMgdGhhdCBoYXZlIGFjdHVhbGx5IGNoYW5nZWQuCisJCS8vCisJCWZpbmFsIE1hcDxPYmplY3QsIE9iamVjdD4gc2F2ZU9wdGlvbnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKKwkJc2F2ZU9wdGlvbnMucHV0KFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRCwgUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOworCisJCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtiZW5jaC4KKwkJLy8KKwkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9CisJCQluZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgeworCQkJCS8vIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IGdldHMgaW52b2tlZCB3aGVuIHRoZSBvcGVyYXRpb24gcnVucy4KKwkJCQkvLworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJCS8vIFNhdmUgdGhlIHJlc291cmNlcyB0byB0aGUgZmlsZSBzeXN0ZW0uCisJCQkJCS8vCisJCQkJCWJvb2xlYW4gZmlyc3QgPSB0cnVlOworCQkJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKSB7CisJCQkJCQlpZiAoKGZpcnN0IHx8ICFyZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSB8fCBpc1BlcnNpc3RlZChyZXNvdXJjZSkpICYmICFlZGl0aW5nRG9tYWluLmlzUmVhZE9ubHkocmVzb3VyY2UpKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJbG9uZyB0aW1lU3RhbXAgPSByZXNvdXJjZS5nZXRUaW1lU3RhbXAoKTsKKwkJCQkJCQkJcmVzb3VyY2Uuc2F2ZShzYXZlT3B0aW9ucyk7CisJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUaW1lU3RhbXAoKSAhPSB0aW1lU3RhbXApIHsKKwkJCQkJCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCQkJCQkJfQorCQkJCQkJCWZpcnN0ID0gZmFsc2U7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9OworCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisJCXRyeSB7CisJCQkvLyBUaGlzIHJ1bnMgdGhlIG9wdGlvbnMsIGFuZCBzaG93cyBwcm9ncmVzcy4KKwkJCS8vCisJCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7CisKKwkJCS8vIFJlZnJlc2ggdGhlIG5lY2Vzc2FyeSBzdGF0ZS4KKwkJCS8vCisJCQkoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLnNhdmVJc0RvbmUoKTsKKwkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgdGhhdCBzaG91bGRuJ3QuCisJCQkvLworCQkJRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgd2hldGhlciBzb21ldGhpbmcgaGFzIGJlZW4gcGVyc2lzdGVkIHRvIHRoZSBVUkkgb2YgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgVVJJIGNvbnZlcnRlciBmcm9tIHRoZSBlZGl0b3IncyByZXNvdXJjZSBzZXQgdG8gdHJ5IHRvIG9wZW4gYW4gaW5wdXQgc3RyZWFtLiAKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BlcnNpc3RlZChSZXNvdXJjZSByZXNvdXJjZSkgeworCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQl0cnkgeworCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKHJlc291cmNlLmdldFVSSSgpKTsKKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgeworCQkJCXJlc3VsdCA9IHRydWU7CisJCQkJc3RyZWFtLmNsb3NlKCk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElnbm9yZQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogVGhpcyBhbHdheXMgcmV0dXJucyB0cnVlIGJlY2F1c2UgaXQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFsc28gY2hhbmdlcyB0aGUgZWRpdG9yJ3MgaW5wdXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7CisJCVNhdmVBc0RpYWxvZyBzYXZlQXNEaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKKwkJc2F2ZUFzRGlhbG9nLm9wZW4oKTsKKwkJSVBhdGggcGF0aCA9IHNhdmVBc0RpYWxvZy5nZXRSZXN1bHQoKTsKKwkJaWYgKHBhdGggIT0gbnVsbCkgeworCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKKwkJCWlmIChmaWxlICE9IG51bGwpIHsKKwkJCQlkb1NhdmVBcyhVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZG9TYXZlQXMoVVJJIHVyaSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisJCShlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKS5zZXRVUkkodXJpKTsKKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKKwkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPQorCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgIT0gbnVsbCA/CisJCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgOgorCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisJCWRvU2F2ZShwcm9ncmVzc01vbml0b3IpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKKwkJdHJ5IHsKKwkJCWlmIChtYXJrZXIuZ2V0VHlwZSgpLmVxdWFscyhFVmFsaWRhdG9yLk1BUktFUikpIHsKKwkJCQlTdHJpbmcgdXJpQXR0cmlidXRlID0gbWFya2VyLmdldEF0dHJpYnV0ZShFVmFsaWRhdG9yLlVSSV9BVFRSSUJVVEUsIG51bGwpOworCQkJCWlmICh1cmlBdHRyaWJ1dGUgIT0gbnVsbCkgeworCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSSh1cmlBdHRyaWJ1dGUpOworCQkJCQlFT2JqZWN0IGVPYmplY3QgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0RU9iamVjdCh1cmksIHRydWUpOworCQkJCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7CisJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGVkaXRpbmdEb21haW4uZ2V0V3JhcHBlcihlT2JqZWN0KSkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHN0YXJ0dXAuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKKwkJc2V0U2l0ZShzaXRlKTsKKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKKwkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsKKwkJc2l0ZS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7CisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJZ2V0Q29udHJvbChnZXRBY3RpdmVQYWdlKCkpLnNldEZvY3VzKCk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byByZXR1cm4gdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7CisJCXJldHVybiBlZGl0b3JTZWxlY3Rpb247CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gc2V0IHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCisJICogQ2FsbGluZyB0aGlzIHJlc3VsdCB3aWxsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQllZGl0b3JTZWxlY3Rpb24gPSBzZWxlY3Rpb247CisKKwkJZm9yIChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyIDogc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycykgeworCQkJbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOworCQl9CisJCXNldFN0YXR1c0xpbmVNYW5hZ2VyKHNlbGVjdGlvbik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZU1hbmFnZXIoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyID0gY3VycmVudFZpZXdlciAhPSBudWxsICYmIGN1cnJlbnRWaWV3ZXIgPT0gY29udGVudE91dGxpbmVWaWV3ZXIgPworCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA6IGdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOworCisJCWlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKSB7CisJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCQlDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikudG9MaXN0KCk7CisJCQkJc3dpdGNoIChjb2xsZWN0aW9uLnNpemUoKSkgeworCQkJCQljYXNlIDA6IHsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTm9PYmplY3RTZWxlY3RlZCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAxOiB7CisJCQkJCQlTdHJpbmcgdGV4dCA9IG5ldyBBZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3IoYWRhcHRlckZhY3RvcnkpLmdldFRleHQoY29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkIiwgdGV4dCkpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlkZWZhdWx0OiB7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQiLCBJbnRlZ2VyLnRvU3RyaW5nKGNvbGxlY3Rpb24uc2l6ZSgpKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoIiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHRoZSBwbHVnaW4ncyBwbHVnaW4ucHJvcGVydGllcyBmaWxlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQlyZXR1cm4gRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXkpOworCX0KKworCS8qKgorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gcGx1Z2luLnByb3BlcnRpZXMsIG1ha2luZyBhIHN1YnN0aXR1dGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgeworCQlyZXR1cm4gRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXksIG5ldyBPYmplY3QgW10geyBzMSB9KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyfSB0byBoZWxwIGZpbGwgdGhlIGNvbnRleHQgbWVudXMgd2l0aCBjb250cmlidXRpb25zIGZyb20gdGhlIEVkaXQgbWVudS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCSgoSU1lbnVMaXN0ZW5lcilnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSkubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgeworCQlyZXR1cm4gKEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcilnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsKKwkJcmV0dXJuIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aW9uQmFycygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisKKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7CisKKwkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKKworCQlhZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7CisKKwkJaWYgKGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gdGhpcykgeworCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IobnVsbCk7CisJCX0KKworCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgeworCQkJcHJvcGVydHlTaGVldFBhZ2UuZGlzcG9zZSgpOworCQl9CisKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7CisJCQljb250ZW50T3V0bGluZVBhZ2UuZGlzcG9zZSgpOworCQl9CisKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgb3V0bGluZSB2aWV3IHNob3VsZCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd091dGxpbmVWaWV3KCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvQXJlYUxhYmVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9BcmVhTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWI4NTNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvQXJlYUxhYmVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxOTQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLlN0YXRpY05vZGVMYWJlbEl0ZW1Qcm92aWRlcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXIuRGVmaW5pdGlvbnNFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkFyZWFMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5HZW9ncmFwaGljRmVhdHVyZTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuUmVnaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuR2VvZ3JhcGhpY05hbWVzOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYQorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkFyZWFMYWJlbH0gb2JqZWN0LiA8IS0tCisgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiAKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEFyZWFMYWJlbEl0ZW1Qcm92aWRlciBleHRlbmRzIFN0YXRpY05vZGVMYWJlbEl0ZW1Qcm92aWRlcgorCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFyZWFMYWJlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZEN1cnJlbnRBcmVhVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEN1cnJlbnQgQXJlYSBWYWx1ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEN1cnJlbnRBcmVhVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9BcmVhTGFiZWxfY3VycmVudEFyZWFWYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BcmVhTGFiZWxfY3VycmVudEFyZWFWYWx1ZV9mZWF0dXJlIiwgIl9VSV9BcmVhTGFiZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLkFSRUFfTEFCRUxfX0NVUlJFTlRfQVJFQV9WQUxVRSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJZmluYWwgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBpdGVtUHJvdmlkZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoCisJCQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5EZXNjcmlwdG9yLlJlZ2lzdHJ5LklOU1RBTkNFKTsKKwkJZmluYWwgQXJlYUxhYmVsIGFyZWFMYWJlbCA9IChBcmVhTGFiZWwpIG9iamVjdDsKKwkJZmluYWwgSUl0ZW1MYWJlbFByb3ZpZGVyIGFsdmlwID0gKEFyZWFMYWJlbFZhbHVlSXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXJGYWN0b3J5CisJCQkJLmFkYXB0KGFyZWFMYWJlbC5nZXRDdXJyZW50QXJlYVZhbHVlKCksCisJCQkJCQlJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOworCisJCWZpbmFsIFN0cmluZyBnZW9OYW1lID0gR2VvZ3JhcGhpY05hbWVzLmdldE5hbWUoYXJlYUxhYmVsLmdldFVSSSgpKTsKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKAorCQkJCWdlb05hbWUuc3RhcnRzV2l0aCgiISIpID8gZ2V0VGV4dEdlbihvYmplY3QpIDogZ2VvTmFtZSk7CisJCXNiLmFwcGVuZCgiICgiKTsKKwkJc2IuYXBwZW5kKGFsdmlwLmdldFRleHQoYXJlYUxhYmVsLmdldEN1cnJlbnRBcmVhVmFsdWUoKSkpOworCQlzYi5hcHBlbmQoIikiKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfSAvLyBnZXRUZXh0CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKEFyZWFMYWJlbClvYmplY3QpLmdldFVSSSgpOworCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0FyZWFMYWJlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9BcmVhTGFiZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5vdGlmaWNhdGlvbgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvQXJlYUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Byb3ZpZGVyL0FyZWFMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhMWU0NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Byb3ZpZGVyL0FyZWFMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMjMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnByb3ZpZGVyLkRlZmluaXRpb25zRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYQorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkFyZWFMYWJlbFZhbHVlfSBvYmplY3QuIDwhLS0KKyAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQXJlYUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyCisJCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTUJFUl9PRl9GQUNUSU9OQUxfRElHSVRTID0gMjsKKwlwcml2YXRlIHN0YXRpYyBOdW1iZXJGb3JtYXQgZm9ybWF0dGVyOworCisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5CisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBcmVhTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCQorCS8qCisJICogQHJldHVybiBhIG51bWJlciBmb3JtYXR0ZXIKKwkgKi8KKwlzdGF0aWMgTnVtYmVyRm9ybWF0IGdldEZvcm1hdHRlcigpIHsKKwkJLy8gSXMgdGhlcmUgYWxyZWFkeSBhIGZvcm1hdHRlcj8KKwkJaWYgKGZvcm1hdHRlciA9PSBudWxsKSB7CisJCQkvLyBObworCQkJZm9ybWF0dGVyID0gTnVtYmVyRm9ybWF0LmdldE51bWJlckluc3RhbmNlKCk7CisJCQlmb3JtYXR0ZXIuc2V0TWF4aW11bUZyYWN0aW9uRGlnaXRzKE5VTUJFUl9PRl9GQUNUSU9OQUxfRElHSVRTKTsKKwkJCWZvcm1hdHRlci5zZXRNaW5pbXVtRnJhY3Rpb25EaWdpdHMoTlVNQkVSX09GX0ZBQ1RJT05BTF9ESUdJVFMpOworCQl9CisJCXJldHVybiBmb3JtYXR0ZXI7CisJfSAvLyBnZXRGb3JtYXR0ZXIKKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRBcmVhUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRBdmVyYWdlRXh0ZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBcmVhIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQXJlYVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0FyZWFMYWJlbFZhbHVlX2FyZWFfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXJlYUxhYmVsVmFsdWVfYXJlYV9mZWF0dXJlIiwgIl9VSV9BcmVhTGFiZWxWYWx1ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuQVJFQV9MQUJFTF9WQUxVRV9fQVJFQSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXZlcmFnZSBFeHRlbnQgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRBdmVyYWdlRXh0ZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfQXJlYUxhYmVsVmFsdWVfYXZlcmFnZUV4dGVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BcmVhTGFiZWxWYWx1ZV9hdmVyYWdlRXh0ZW50X2ZlYXR1cmUiLCAiX1VJX0FyZWFMYWJlbFZhbHVlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTGFiZWxzUGFja2FnZS5MaXRlcmFscy5BUkVBX0xBQkVMX1ZBTFVFX19BVkVSQUdFX0VYVEVOVCwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihnZXRGb3JtYXR0ZXIoKS5mb3JtYXQoKChBcmVhTGFiZWxWYWx1ZSlvYmplY3QpLmdldEFyZWEoKSkpOworCQlzYi5hcHBlbmQoIiBrbV4yIik7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0gLy8gZ2V0VGV4dAorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworLy8JQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJQXJlYUxhYmVsVmFsdWUgYXJlYUxhYmVsVmFsdWUgPSAoQXJlYUxhYmVsVmFsdWUpb2JqZWN0OworCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQXJlYUxhYmVsVmFsdWVfdHlwZSIpICsgIiAiICsgYXJlYUxhYmVsVmFsdWUuZ2V0QXJlYSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisJCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBub3RpZmljYXRpb24KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFyZWFMYWJlbFZhbHVlLmNsYXNzKSkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLkFSRUFfTEFCRUxfVkFMVUVfX0FSRUE6CisJCQljYXNlIExhYmVsc1BhY2thZ2UuQVJFQV9MQUJFTF9WQUxVRV9fQVZFUkFHRV9FWFRFTlQ6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Q4YjU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXIuRGVmaW5pdGlvbnNFZGl0UGx1Z2luOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5HZW9ncmFwaGljTmFtZXM7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbH0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlciBleHRlbmRzCisJCVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIgaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIoCisJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlmaW5hbCBVUkkgbGFiZWxVUkkgPSAoKENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsKW9iamVjdCkuZ2V0VVJJKCk7CisJCWZpbmFsIFN0cmluZyBsYXN0U2VnbWVudCA9IGxhYmVsVVJJLmxhc3RTZWdtZW50KCkudG9TdHJpbmcoKTsKKwkJZmluYWwgaW50IGkgPSBsYXN0U2VnbWVudC5pbmRleE9mKCJfIik7CisJCWZpbmFsIFN0cmluZyBmaXJzdElTT0tleSA9IGxhc3RTZWdtZW50LnN1YnN0cmluZygwLCBpKTsKKwkJZmluYWwgU3RyaW5nIHNlY29uZElTT0tleSA9IGxhc3RTZWdtZW50LnN1YnN0cmluZyhpKzEpOworCQkKKwkJZmluYWwgU3RyaW5nIGZpcnN0R2VvTmFtZSA9IEdlb2dyYXBoaWNOYW1lcy5nZXROYW1lKGZpcnN0SVNPS2V5KTsKKwkJZmluYWwgU3RyaW5nIHNlY29uZEdlb05hbWUgPSBHZW9ncmFwaGljTmFtZXMuZ2V0TmFtZShzZWNvbmRJU09LZXkpOworCQkKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKAorCQkJCWZpcnN0R2VvTmFtZS5zdGFydHNXaXRoKCIhIikgPyBmaXJzdElTT0tleSA6IGZpcnN0R2VvTmFtZSk7CisJCWZpbmFsIEVkZ2UgZWRnZSA9ICgoRWRnZUxhYmVsKSBvYmplY3QpLmdldEVkZ2UoKTsKKwkJc2IuYXBwZW5kKGVkZ2UuaXNEaXJlY3RlZCgpID8gIiAtPiAiIDogIiA8LT4gIik7CisJCQorCQkvLyBGaW5kIEJ1Z3MgaWRlbnRpZmllZCBhbiBlcnJvci4gIHNlY29uZEdlb05hbWUgd2FzIHVzZWQgCisJCS8vIGZvciBib3RoIGNvbmRpdGlvbnMgb2ZmIHRoZSB0ZXJuYXJ5CisJCXNiLmFwcGVuZChzZWNvbmRHZW9OYW1lLnN0YXJ0c1dpdGgoIiEiKSA/IHNlY29uZElTT0tleQorCQkJCQkJOiBzZWNvbmRHZW9OYW1lKTsKKworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9IC8vIGdldFRleHQKKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJLy9AT3ZlcnJpZGUKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlVUkkgbGFiZWxWYWx1ZSA9ICgoQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWwpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCQorCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzI5NDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnByb3ZpZGVyLkRlZmluaXRpb25zRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc1BhY2thZ2U7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIgZXh0ZW5kcworCQlQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcigKKwkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRCb3JkZXJMZW5ndGhQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJvcmRlciBMZW5ndGggZmVhdHVyZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQm9yZGVyTGVuZ3RoUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9ib3JkZXJMZW5ndGhfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9ib3JkZXJMZW5ndGhfZmVhdHVyZSIsICJfVUlfQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuQ09NTU9OX0JPUkRFUl9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX0JPUkRFUl9MRU5HVEgsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSBjb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlID0gKENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUpb2JqZWN0OworCQlyZXR1cm4gY29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5nZXRCb3JkZXJMZW5ndGgoKSArICIga20iOyAvLyROT04tTkxTLTEkIAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJLy9AT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIGNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUgPSAoQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSlvYmplY3Q7CisJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX3R5cGUiKSArICIgIiArIGNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2V0Qm9yZGVyTGVuZ3RoKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmNsYXNzKSkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLkNPTU1PTl9CT1JERVJfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19CT1JERVJfTEVOR1RIOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9EZWZpbml0aW9uc0VkaXRQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Byb3ZpZGVyL0RlZmluaXRpb25zRWRpdFBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTYwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9EZWZpbml0aW9uc0VkaXRQbHVnaW4uamF2YQpAQCAtMCwwICsxLDExMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuRWNsaXBzZVVJUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CisKKy8qKgorICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBEZWZpbml0aW9ucyBlZGl0b3IgcGx1Z2luLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGVmaW5pdGlvbnNFZGl0UGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiIjsKKworCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIERlZmluaXRpb25zRWRpdFBsdWdpbiBJTlNUQU5DRSA9IG5ldyBEZWZpbml0aW9uc0VkaXRQbHVnaW4oKTsKKworCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlzdGF0aWMgSW1wbGVtZW50YXRpb24gcGx1Z2luOworCisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGVmaW5pdGlvbnNFZGl0UGx1Z2luKCkgeworCQlzdXBlcgorCQkJKG5ldyBSZXNvdXJjZUxvY2F0b3IgW10geworCQkJCUNvcmVFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkJfSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4geworCQkvKioKKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKKwkJCXN1cGVyKCk7CisJCisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgorCQkJLy8KKwkJCXBsdWdpbiA9IHRoaXM7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Byb3ZpZGVyL0VhcnRoU2NpZW5jZUxhYmVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9FYXJ0aFNjaWVuY2VMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYmQ4NDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9FYXJ0aFNjaWVuY2VMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMucHJvdmlkZXI7CisKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLlN0YXRpY05vZGVMYWJlbEl0ZW1Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXIuRGVmaW5pdGlvbnNFZGl0UGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkVhcnRoU2NpZW5jZUxhYmVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFYXJ0aFNjaWVuY2VMYWJlbEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgU3RhdGljTm9kZUxhYmVsSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFYXJ0aFNjaWVuY2VMYWJlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRDdXJyZW50RWFydGhTY2llbmNlVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEN1cnJlbnQgRWFydGggU2NpZW5jZSBWYWx1ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEN1cnJlbnRFYXJ0aFNjaWVuY2VWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0VhcnRoU2NpZW5jZUxhYmVsX2N1cnJlbnRFYXJ0aFNjaWVuY2VWYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FYXJ0aFNjaWVuY2VMYWJlbF9jdXJyZW50RWFydGhTY2llbmNlVmFsdWVfZmVhdHVyZSIsICJfVUlfRWFydGhTY2llbmNlTGFiZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLkVBUlRIX1NDSUVOQ0VfTEFCRUxfX0NVUlJFTlRfRUFSVEhfU0NJRU5DRV9WQUxVRSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBFYXJ0aFNjaWVuY2VMYWJlbC5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9FYXJ0aFNjaWVuY2VMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKEVhcnRoU2NpZW5jZUxhYmVsKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfRWFydGhTY2llbmNlTGFiZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfRWFydGhTY2llbmNlTGFiZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvRWFydGhTY2llbmNlTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvRWFydGhTY2llbmNlTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NDMzMjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9FYXJ0aFNjaWVuY2VMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMTIgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZCQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlcjsKKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLkxhYmVsVmFsdWVJdGVtUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnByb3ZpZGVyLkRlZmluaXRpb25zRWRpdFBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkVhcnRoU2NpZW5jZUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkVhcnRoU2NpZW5jZUxhYmVsVmFsdWV9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEVhcnRoU2NpZW5jZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIKKwlleHRlbmRzIExhYmVsVmFsdWVJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVhcnRoU2NpZW5jZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkRGF0YVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkRGF0YVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFVuaXRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEYXRhIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkRGF0YVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0VhcnRoU2NpZW5jZUxhYmVsVmFsdWVfZGF0YV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FYXJ0aFNjaWVuY2VMYWJlbFZhbHVlX2RhdGFfZmVhdHVyZSIsICJfVUlfRWFydGhTY2llbmNlTGFiZWxWYWx1ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuRUFSVEhfU0NJRU5DRV9MQUJFTF9WQUxVRV9fREFUQSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGF0YSBUeXBlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkRGF0YVR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9FYXJ0aFNjaWVuY2VMYWJlbFZhbHVlX2RhdGFUeXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VhcnRoU2NpZW5jZUxhYmVsVmFsdWVfZGF0YVR5cGVfZmVhdHVyZSIsICJfVUlfRWFydGhTY2llbmNlTGFiZWxWYWx1ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuRUFSVEhfU0NJRU5DRV9MQUJFTF9WQUxVRV9fREFUQV9UWVBFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBVbml0cyBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFVuaXRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRWFydGhTY2llbmNlTGFiZWxWYWx1ZV91bml0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FYXJ0aFNjaWVuY2VMYWJlbFZhbHVlX3VuaXRzX2ZlYXR1cmUiLCAiX1VJX0VhcnRoU2NpZW5jZUxhYmVsVmFsdWVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLkVBUlRIX1NDSUVOQ0VfTEFCRUxfVkFMVUVfX1VOSVRTLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0VhcnRoU2NpZW5jZUxhYmVsVmFsdWUiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoRWFydGhTY2llbmNlTGFiZWxWYWx1ZSlvYmplY3QpLmdldERhdGFUeXBlKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfRWFydGhTY2llbmNlTGFiZWxWYWx1ZV90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9FYXJ0aFNjaWVuY2VMYWJlbFZhbHVlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlLmNsYXNzKSkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLkVBUlRIX1NDSUVOQ0VfTEFCRUxfVkFMVUVfX0RBVEE6CisJCQljYXNlIExhYmVsc1BhY2thZ2UuRUFSVEhfU0NJRU5DRV9MQUJFTF9WQUxVRV9fREFUQV9UWVBFOgorCQkJY2FzZSBMYWJlbHNQYWNrYWdlLkVBUlRIX1NDSUVOQ0VfTEFCRUxfVkFMVUVfX1VOSVRTOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9MYWJlbHNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvTGFiZWxzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzNlZTA2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvTGFiZWxzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMudXRpbC5MYWJlbHNBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuCisgKiBUaGUgYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4KKyAqIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCisgKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisgKiBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBMYWJlbHNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIExhYmVsc0FkYXB0ZXJGYWN0b3J5CisJCWltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExhYmVsc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgeworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBvcHVsYXRpb25MYWJlbEl0ZW1Qcm92aWRlciBwb3B1bGF0aW9uTGFiZWxJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWx9LiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3B1bGF0aW9uTGFiZWxBZGFwdGVyKCkgeworCQlpZiAocG9wdWxhdGlvbkxhYmVsSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXBvcHVsYXRpb25MYWJlbEl0ZW1Qcm92aWRlciA9IG5ldyBQb3B1bGF0aW9uTGFiZWxJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gcG9wdWxhdGlvbkxhYmVsSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsVmFsdWV9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBvcHVsYXRpb25MYWJlbFZhbHVlSXRlbVByb3ZpZGVyIHBvcHVsYXRpb25MYWJlbFZhbHVlSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbFZhbHVlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9wdWxhdGlvbkxhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlpZiAocG9wdWxhdGlvbkxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJcG9wdWxhdGlvbkxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgPSBuZXcgUG9wdWxhdGlvbkxhYmVsVmFsdWVJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gcG9wdWxhdGlvbkxhYmVsVmFsdWVJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkFyZWFMYWJlbH0gaW5zdGFuY2VzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQXJlYUxhYmVsSXRlbVByb3ZpZGVyIGFyZWFMYWJlbEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkFyZWFMYWJlbH0uIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFyZWFMYWJlbEFkYXB0ZXIoKSB7CisJCWlmIChhcmVhTGFiZWxJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJYXJlYUxhYmVsSXRlbVByb3ZpZGVyID0gbmV3IEFyZWFMYWJlbEl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBhcmVhTGFiZWxJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWxWYWx1ZX0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQXJlYUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgYXJlYUxhYmVsVmFsdWVJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWxWYWx1ZX0uIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFyZWFMYWJlbFZhbHVlQWRhcHRlcigpIHsKKwkJaWYgKGFyZWFMYWJlbFZhbHVlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCWFyZWFMYWJlbFZhbHVlSXRlbVByb3ZpZGVyID0gbmV3IEFyZWFMYWJlbFZhbHVlSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGFyZWFMYWJlbFZhbHVlSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIgcmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEFkYXB0ZXIoKSB7CisJCWlmIChyZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJcmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyID0gbmV3IFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiByZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZX0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIgcmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUFkYXB0ZXIoKSB7CisJCWlmIChyZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlyZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciA9IG5ldyBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiByZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlciBjb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsQWRhcHRlcigpIHsKKwkJaWYgKGNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCWNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyID0gbmV3IENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZX0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciBjb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlQWRhcHRlcigpIHsKKwkJaWYgKGNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJY29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciA9IG5ldyBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbH0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIgdHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWx9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEFkYXB0ZXIoKSB7CisJCWlmICh0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQl0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlciA9IG5ldyBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiB0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWV9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIgdHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUFkYXB0ZXIoKSB7CisJCWlmICh0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIgPSBuZXcgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiB0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciBwaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlpZiAocGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciA9IG5ldyBQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gcGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlciByb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxBZGFwdGVyKCkgeworCQlpZiAocm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlciA9IG5ldyBSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gcm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWV9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIgcm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlQWRhcHRlcigpIHsKKwkJaWYgKHJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyID0gbmV3IFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRWFydGhTY2llbmNlTGFiZWxJdGVtUHJvdmlkZXIgZWFydGhTY2llbmNlTGFiZWxJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWx9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVhcnRoU2NpZW5jZUxhYmVsQWRhcHRlcigpIHsKKwkJaWYgKGVhcnRoU2NpZW5jZUxhYmVsSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCWVhcnRoU2NpZW5jZUxhYmVsSXRlbVByb3ZpZGVyID0gbmV3IEVhcnRoU2NpZW5jZUxhYmVsSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGVhcnRoU2NpZW5jZUxhYmVsSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWxWYWx1ZX0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlSXRlbVByb3ZpZGVyIGVhcnRoU2NpZW5jZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWxWYWx1ZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRWFydGhTY2llbmNlTGFiZWxWYWx1ZUFkYXB0ZXIoKSB7CisJCWlmIChlYXJ0aFNjaWVuY2VMYWJlbFZhbHVlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCWVhcnRoU2NpZW5jZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgPSBuZXcgRWFydGhTY2llbmNlTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBlYXJ0aFNjaWVuY2VMYWJlbFZhbHVlSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50QWRhcHRlckZhY3RvcnkKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoCisJCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7CisJCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB0eXBlCisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5vdGlmaWVyCisJICogQHBhcmFtIHR5cGUKKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEBwYXJhbSB0eXBlCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7CisJCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7CisJCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7CisJCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3M8Pz4pIHx8ICgoKENsYXNzPD8+KXR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7CisJCQkJcmV0dXJuIGFkYXB0ZXI7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBub3RpZnlDaGFuZ2VkTGlzdGVuZXIKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKKwkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBub3RpZnlDaGFuZ2VkTGlzdGVuZXIKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKKwkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfSBhbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKworCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgeworCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJaWYgKGFyZWFMYWJlbEl0ZW1Qcm92aWRlciAhPSBudWxsKSBhcmVhTGFiZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoYXJlYUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgYXJlYUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoY29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIgIT0gbnVsbCkgY29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoY29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciAhPSBudWxsKSBjb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKHBvcHVsYXRpb25MYWJlbEl0ZW1Qcm92aWRlciAhPSBudWxsKSBwb3B1bGF0aW9uTGFiZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAocG9wdWxhdGlvbkxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgcG9wdWxhdGlvbkxhYmVsVmFsdWVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAocmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyICE9IG51bGwpIHJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChyZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciAhPSBudWxsKSByZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmICh0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlciAhPSBudWxsKSB0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmICh0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyICE9IG51bGwpIHRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAocGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyICE9IG51bGwpIHBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChyb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIgIT0gbnVsbCkgcm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKHJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyICE9IG51bGwpIHJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKGVhcnRoU2NpZW5jZUxhYmVsSXRlbVByb3ZpZGVyICE9IG51bGwpIGVhcnRoU2NpZW5jZUxhYmVsSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKGVhcnRoU2NpZW5jZUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgZWFydGhTY2llbmNlTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI3NzEwMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Byb3ZpZGVyL1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLlN0YXRpY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuRHluYW1pY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlcjsKKy8vCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuTGFiZWxJdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXIuRGVmaW5pdGlvbnNFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5HZW9ncmFwaGljTmFtZXM7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIgZXh0ZW5kcyBTdGF0aWNFZGdlTGFiZWxJdGVtUHJvdmlkZXIKKwkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlmaW5hbCBVUkkgbGFiZWxVUkkgPSAoKFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwpIG9iamVjdCkuZ2V0VVJJKCk7CisJCWZpbmFsIFN0cmluZyBsYXN0U2VnbWVudCA9IGxhYmVsVVJJCisJCQkJLnNlZ21lbnQobGFiZWxVUkkuc2VnbWVudENvdW50KCkgLSAyKS50b1N0cmluZygpOworCQlmaW5hbCBpbnQgaSA9IGxhc3RTZWdtZW50LmluZGV4T2YoIl8iKTsKKwkJZmluYWwgU3RyaW5nIGZpcnN0SVNPS2V5ID0gbGFzdFNlZ21lbnQuc3Vic3RyaW5nKDAsIGkpOworCQlmaW5hbCBTdHJpbmcgc2Vjb25kSVNPS2V5ID0gbGFzdFNlZ21lbnQuc3Vic3RyaW5nKGkgKyAxKTsKKworCQlmaW5hbCBTdHJpbmcgZmlyc3RHZW9OYW1lID0gR2VvZ3JhcGhpY05hbWVzLmdldE5hbWUoZmlyc3RJU09LZXkpOworCQlmaW5hbCBTdHJpbmcgc2Vjb25kR2VvTmFtZSA9IEdlb2dyYXBoaWNOYW1lcy5nZXROYW1lKHNlY29uZElTT0tleSk7CisKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKAorCQkJCWZpcnN0R2VvTmFtZS5zdGFydHNXaXRoKCIhIikgPyBmaXJzdElTT0tleSA6IGZpcnN0R2VvTmFtZSk7CisJCWZpbmFsIEVkZ2UgZWRnZSA9ICgoRWRnZUxhYmVsKSBvYmplY3QpLmdldEVkZ2UoKTsKKwkJc2IuYXBwZW5kKGVkZ2UuaXNEaXJlY3RlZCgpID8gIiAtPiAiIDogIiA8LT4gIik7CisJCS8vIEZpbmQgQnVncyBpZGVudGlmaWVkIGFzIGVycm9yLiAgc2Vjb25kR2VvTmFtZSB3YXMgdXNlZCAKKwkJLy8gZm9yIGJvdGggY29uZGl0aW9ucyBvZmYgdGhlIHRlcm5hcnkKKwkJc2IuYXBwZW5kKHNlY29uZEdlb05hbWUuc3RhcnRzV2l0aCgiISIpID8gc2Vjb25kSVNPS2V5CisJCQkJCQk6IHNlY29uZEdlb05hbWUpOworCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0gLy8gZ2V0VGV4dAorCQorCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Byb3ZpZGVyL1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjI0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXIuRGVmaW5pdGlvbnNFZGl0UGx1Z2luOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIKKwlleHRlbmRzIExhYmVsVmFsdWVJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvUG9wdWxhdGlvbkxhYmVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9Qb3B1bGF0aW9uTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTg3MGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvUG9wdWxhdGlvbkxhYmVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyOTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuU3RhdGljTm9kZUxhYmVsSXRlbVByb3ZpZGVyOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcm92aWRlci5EZWZpbml0aW9uc0VkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5FZGdlc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5Lkdlb2dyYXBoaWNOYW1lczsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWx9IG9iamVjdC4gPCEtLQorICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQb3B1bGF0aW9uTGFiZWxJdGVtUHJvdmlkZXIgZXh0ZW5kcyBTdGF0aWNOb2RlTGFiZWxJdGVtUHJvdmlkZXIKKwkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5CisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQb3B1bGF0aW9uTGFiZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRQb3B1bGF0aW9uSWRlbnRpZmllclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkQ3VycmVudFBvcHVsYXRpb25WYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkUG9wdWxhdGVkQXJlYVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkVmFsaWRZZWFyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQb3B1bGF0aW9uIElkZW50aWZpZXIgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkUG9wdWxhdGlvbklkZW50aWZpZXJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qb3B1bGF0aW9uTGFiZWxfcG9wdWxhdGlvbklkZW50aWZpZXJfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9wdWxhdGlvbkxhYmVsX3BvcHVsYXRpb25JZGVudGlmaWVyX2ZlYXR1cmUiLCAiX1VJX1BvcHVsYXRpb25MYWJlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuUE9QVUxBVElPTl9MQUJFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1BvcHVsYXRpb25MYWJlbF9uYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcHVsYXRpb25MYWJlbF9uYW1lX2ZlYXR1cmUiLCAiX1VJX1BvcHVsYXRpb25MYWJlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuUE9QVUxBVElPTl9MQUJFTF9fTkFNRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ3VycmVudCBQb3B1bGF0aW9uIFZhbHVlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEN1cnJlbnRQb3B1bGF0aW9uVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qb3B1bGF0aW9uTGFiZWxfY3VycmVudFBvcHVsYXRpb25WYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3B1bGF0aW9uTGFiZWxfY3VycmVudFBvcHVsYXRpb25WYWx1ZV9mZWF0dXJlIiwgIl9VSV9Qb3B1bGF0aW9uTGFiZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlBPUFVMQVRJT05fTEFCRUxfX0NVUlJFTlRfUE9QVUxBVElPTl9WQUxVRSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQb3B1bGF0ZWQgQXJlYSBmZWF0dXJlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRQb3B1bGF0ZWRBcmVhUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUG9wdWxhdGlvbkxhYmVsX3BvcHVsYXRlZEFyZWFfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9wdWxhdGlvbkxhYmVsX3BvcHVsYXRlZEFyZWFfZmVhdHVyZSIsICJfVUlfUG9wdWxhdGlvbkxhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTGFiZWxzUGFja2FnZS5MaXRlcmFscy5QT1BVTEFUSU9OX0xBQkVMX19QT1BVTEFURURfQVJFQSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFsaWQgWWVhciBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFZhbGlkWWVhclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1BvcHVsYXRpb25MYWJlbF92YWxpZFllYXJfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9wdWxhdGlvbkxhYmVsX3ZhbGlkWWVhcl9mZWF0dXJlIiwgIl9VSV9Qb3B1bGF0aW9uTGFiZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlBPUFVMQVRJT05fTEFCRUxfX1ZBTElEX1lFQVIsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJZmluYWwgUG9wdWxhdGlvbkxhYmVsIHBvcHVsYXRpb25MYWJlbCA9IChQb3B1bGF0aW9uTGFiZWwpIG9iamVjdDsKKworCQlzYi5hcHBlbmQoR2VvZ3JhcGhpY05hbWVzLmdldE5hbWUocG9wdWxhdGlvbkxhYmVsCisJCQkJLmdldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQoKSkpOworCQlzYi5hcHBlbmQoIiwgXCIiKTsKKwkJc2IuYXBwZW5kKHBvcHVsYXRpb25MYWJlbC5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpKTsKKwkJc2IuYXBwZW5kKCJcIiBwb3B1bGF0aW9uOiAiKTsKKwkJc2IuYXBwZW5kKChpbnQpIHBvcHVsYXRpb25MYWJlbC5nZXRDdXJyZW50UG9wdWxhdGlvblZhbHVlKCkuZ2V0Q291bnQoKSk7CisJCXNiLmFwcGVuZChwb3B1bGF0aW9uTGFiZWwuZ2V0UG9wdWxhdGVkQXJlYSgpID09IDAuMCA/ICIiIDogKCIgKCIKKwkJCQkrIHBvcHVsYXRpb25MYWJlbC5nZXRQb3B1bGF0ZWRBcmVhKCkgKyAiIGttXjIpIikpOworCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0gLy8gZ2V0VGV4dAorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoUG9wdWxhdGlvbkxhYmVsKW9iamVjdCkuZ2V0TmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1BvcHVsYXRpb25MYWJlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9Qb3B1bGF0aW9uTGFiZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5vdGlmaWNhdGlvbgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUG9wdWxhdGlvbkxhYmVsLmNsYXNzKSkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlBPUFVMQVRJT05fTEFCRUxfX1BPUFVMQVRJT05fSURFTlRJRklFUjoKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMX19OQU1FOgorCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlBPUFVMQVRJT05fTEFCRUxfX1BPUFVMQVRFRF9BUkVBOgorCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlBPUFVMQVRJT05fTEFCRUxfX1ZBTElEX1lFQVI6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9Qb3B1bGF0aW9uTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvUG9wdWxhdGlvbkxhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWY2ZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvUG9wdWxhdGlvbkxhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXIuRGVmaW5pdGlvbnNFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsVmFsdWU7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWxWYWx1ZX0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQb3B1bGF0aW9uTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciBleHRlbmRzIExhYmVsVmFsdWVJdGVtUHJvdmlkZXIKKwkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5CisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQb3B1bGF0aW9uTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZENvdW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb3VudCBmZWF0dXJlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDb3VudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1BvcHVsYXRpb25MYWJlbFZhbHVlX2NvdW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcHVsYXRpb25MYWJlbFZhbHVlX2NvdW50X2ZlYXR1cmUiLCAiX1VJX1BvcHVsYXRpb25MYWJlbFZhbHVlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTGFiZWxzUGFja2FnZS5MaXRlcmFscy5QT1BVTEFUSU9OX0xBQkVMX1ZBTFVFX19DT1VOVCwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJUG9wdWxhdGlvbkxhYmVsVmFsdWUgcG9wdWxhdGlvbkxhYmVsVmFsdWUgPSAoUG9wdWxhdGlvbkxhYmVsVmFsdWUpIG9iamVjdDsKKwkJcmV0dXJuIEludGVnZXIudG9TdHJpbmcoKGludCkgcG9wdWxhdGlvbkxhYmVsVmFsdWUuZ2V0Q291bnQoKSk7CisJfSAvLyBnZXRUZXh0CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwkvL0BPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVBvcHVsYXRpb25MYWJlbFZhbHVlIHBvcHVsYXRpb25MYWJlbFZhbHVlID0gKFBvcHVsYXRpb25MYWJlbFZhbHVlKW9iamVjdDsKKwkJcmV0dXJuIGdldFN0cmluZygiX1VJX1BvcHVsYXRpb25MYWJlbFZhbHVlX3R5cGUiKSArICIgIiArIHBvcHVsYXRpb25MYWJlbFZhbHVlLmdldENvdW50KCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCQorCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQb3B1bGF0aW9uTGFiZWxWYWx1ZS5jbGFzcykpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMX1ZBTFVFX19DT1VOVDoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIERlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Byb3ZpZGVyL1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyYThmYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Byb3ZpZGVyL1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXIuRGVmaW5pdGlvbnNFZGl0UGx1Z2luOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIKKwlleHRlbmRzIFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZEN1cnJlbnRSZWxhdGlvbnNoaXBQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEN1cnJlbnQgUmVsYXRpb25zaGlwIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQ3VycmVudFJlbGF0aW9uc2hpcFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbF9jdXJyZW50UmVsYXRpb25zaGlwX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbF9jdXJyZW50UmVsYXRpb25zaGlwX2ZlYXR1cmUiLCAiX1VJX1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX19DVVJSRU5UX1JFTEFUSU9OU0hJUCwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlVUkkgbGFiZWxWYWx1ZSA9ICgoUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmM3N2NmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE5MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlci5MYWJlbFZhbHVlSXRlbVByb3ZpZGVyOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcm92aWRlci5EZWZpbml0aW9uc0VkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWV9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cwkKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZEFkamFjZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRSZWxhdGlvbnNoaXBQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFkamFjZW50IGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQWRqYWNlbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9hZGphY2VudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9hZGphY2VudF9mZWF0dXJlIiwgIl9VSV9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19BREpBQ0VOVCwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVsYXRpb25zaGlwIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkUmVsYXRpb25zaGlwUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVfcmVsYXRpb25zaGlwX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX3JlbGF0aW9uc2hpcF9mZWF0dXJlIiwgIl9VSV9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19SRUxBVElPTlNISVAsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWZpbmFsIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIHJwcmx2ID0gKFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKW9iamVjdDsKKwkJZmluYWwgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgPSBycHJsdi5nZXRSZWxhdGlvbnNoaXAoKTsKKwkJc2IuYXBwZW5kKHJlbGF0aW9uc2hpcC5nZXRMaXRlcmFsKCkpOworCQlzYi5hcHBlbmQocnBybHYuaXNBZGphY2VudCgpID8gIi9BZGphY2VudCIgOiAiL05vdCBBZGphY2VudCIpOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9IC8vIGdldFRleHQKKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJLy9AT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSByZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSA9IChSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSlvYmplY3Q7CisJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZV90eXBlIikgKyAiICIgKyByZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5pc0FkamFjZW50KCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5jbGFzcykpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5SRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX0FESkFDRU5UOgorCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlJFTEFUSVZFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fUkVMQVRJT05TSElQOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Byb3ZpZGVyL1JvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMjc4YzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXIuRGVmaW5pdGlvbnNFZGl0UGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuR2VvZ3JhcGhpY05hbWVzOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIKKwlleHRlbmRzIFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJZmluYWwgVVJJIGxhYmVsVVJJID0gKChSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwpb2JqZWN0KS5nZXRVUkkoKTsKKwkJZmluYWwgU3RyaW5nIGxhc3RTZWdtZW50ID0gbGFiZWxVUkkubGFzdFNlZ21lbnQoKS50b1N0cmluZygpOworCQlmaW5hbCBpbnQgaSA9IGxhc3RTZWdtZW50LmluZGV4T2YoIl8iKTsKKwkJZmluYWwgU3RyaW5nIGZpcnN0SVNPS2V5ID0gbGFzdFNlZ21lbnQuc3Vic3RyaW5nKDAsIGkpOworCQlmaW5hbCBTdHJpbmcgc2Vjb25kSVNPS2V5ID0gbGFzdFNlZ21lbnQuc3Vic3RyaW5nKGkrMSk7CisJCQorCQlmaW5hbCBTdHJpbmcgZmlyc3RHZW9OYW1lID0gR2VvZ3JhcGhpY05hbWVzLmdldE5hbWUoZmlyc3RJU09LZXkpOworCQlmaW5hbCBTdHJpbmcgc2Vjb25kR2VvTmFtZSA9IEdlb2dyYXBoaWNOYW1lcy5nZXROYW1lKHNlY29uZElTT0tleSk7CisJCQorCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoCisJCQkJZmlyc3RHZW9OYW1lLnN0YXJ0c1dpdGgoIiEiKSA/IGZpcnN0SVNPS2V5IDogZmlyc3RHZW9OYW1lKTsKKwkJZmluYWwgRWRnZSBlZGdlID0gKChFZGdlTGFiZWwpIG9iamVjdCkuZ2V0RWRnZSgpOworCQlzYi5hcHBlbmQoZWRnZS5pc0RpcmVjdGVkKCkgPyAiIC0+ICIgOiAiIDwtPiAiKTsKKwkJLy8gRmluZCBCdWdzIGlkZW50aWZpZWQgYW4gZXJyb3IuICBzZWNvbmRHZW9OYW1lIHdhcyB1c2VkIAorCQkvLyBmb3IgYm90aCBjb25kaXRpb25zIG9mIHRoZSB0ZXJuYXJ5CisJCXNiLmFwcGVuZChzZWNvbmRHZW9OYW1lLnN0YXJ0c1dpdGgoIiEiKSA/IHNlY29uZElTT0tleQorCQkJCQkJOiBzZWNvbmRHZW9OYW1lKTsKKworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9IC8vIGdldFRleHQKKworCQorCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbClvYmplY3QpLmdldFVSSSgpOworCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1JvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Byb3ZpZGVyL1JvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDViY2RlNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Byb3ZpZGVyL1JvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcm92aWRlci5EZWZpbml0aW9uc0VkaXRQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWV9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkUm9hZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFJvYWRDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkTnVtYmVyQ3Jvc3NpbmdzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSb2FkIE5hbWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRSb2FkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1JvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX3JvYWROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX3JvYWROYW1lX2ZlYXR1cmUiLCAiX1VJX1JvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTGFiZWxzUGFja2FnZS5MaXRlcmFscy5ST0FEX1RSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX1JPQURfTkFNRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm9hZCBDbGFzcyBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFJvYWRDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1JvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX3JvYWRDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9yb2FkQ2xhc3NfZmVhdHVyZSIsICJfVUlfUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlJPQURfVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fUk9BRF9DTEFTUywKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTnVtYmVyIENyb3NzaW5ncyBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZE51bWJlckNyb3NzaW5nc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1JvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX251bWJlckNyb3NzaW5nc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9udW1iZXJDcm9zc2luZ3NfZmVhdHVyZSIsICJfVUlfUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlJPQURfVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fTlVNQkVSX0NST1NTSU5HUywKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWZpbmFsIFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIGxhYmVsVmFsdWUgPSAoUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpb2JqZWN0OworCQlzYi5hcHBlbmQobGFiZWxWYWx1ZS5nZXRSb2FkQ2xhc3MoKSk7CisJCXNiLmFwcGVuZCgiOiBcIiIpOworCQlzYi5hcHBlbmQobGFiZWxWYWx1ZS5nZXRSb2FkTmFtZSgpKTsKKwkJc2IuYXBwZW5kKCJcIiwgQ3Jvc3NpbmdzOiAiKTsKKwkJc2IuYXBwZW5kKGxhYmVsVmFsdWUuZ2V0TnVtYmVyQ3Jvc3NpbmdzKCkpOworCQkKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfSAvLyBnZXRUZXh0CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCS8vQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSlvYmplY3QpLmdldFJvYWROYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5jbGFzcykpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5ST0FEX1RSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX1JPQURfTkFNRToKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5ST0FEX1RSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX1JPQURfQ0xBU1M6CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUk9BRF9UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19OVU1CRVJfQ1JPU1NJTkdTOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy9wcm92aWRlci9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2RiMjcyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQyOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuRHluYW1pY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlcjsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLkxhYmVsSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnByb3ZpZGVyLkRlZmluaXRpb25zRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLkVkZ2VzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuR2VvZ3JhcGhpY05hbWVzOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWx9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEeW5hbWljRWRnZUxhYmVsSXRlbVByb3ZpZGVyCisJCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRUcmFuc3BvcnRNb2RlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRQb3B1bGF0aW9uSWRlbnRpZmllclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkVHJhbnNwb3J0SWRlbnRpZmllclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkQ3VycmVudFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFJhdGVUaW1lUGVyaW9kUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGREZXBhcnR1cmVDYXBhY2l0eVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkTWF4aW11bURlcGFydHVyZUNhcGFjaXR5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRDYXBhY2l0eVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkTWF4aW11bUNhcGFjaXR5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRUcmFuc2l0VGltZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkU3RhcnRVcERlbGF5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUcmFuc3BvcnQgTW9kZSBmZWF0dXJlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUcmFuc3BvcnRNb2RlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfdHJhbnNwb3J0TW9kZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF90cmFuc3BvcnRNb2RlX2ZlYXR1cmUiLCAiX1VJX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTGFiZWxzUGFja2FnZS5MaXRlcmFscy5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19UUkFOU1BPUlRfTU9ERSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUG9wdWxhdGlvbiBJZGVudGlmaWVyIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFBvcHVsYXRpb25JZGVudGlmaWVyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfcG9wdWxhdGlvbklkZW50aWZpZXJfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfcG9wdWxhdGlvbklkZW50aWZpZXJfZmVhdHVyZSIsICJfVUlfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1BPUFVMQVRJT05fSURFTlRJRklFUiwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVHJhbnNwb3J0IElkZW50aWZpZXIgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkVHJhbnNwb3J0SWRlbnRpZmllclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX3RyYW5zcG9ydElkZW50aWZpZXJfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfdHJhbnNwb3J0SWRlbnRpZmllcl9mZWF0dXJlIiwgIl9VSV9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fVFJBTlNQT1JUX0lERU5USUZJRVIsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEN1cnJlbnQgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDdXJyZW50VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX2N1cnJlbnRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX2N1cnJlbnRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlX2ZlYXR1cmUiLCAiX1VJX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTGFiZWxzUGFja2FnZS5MaXRlcmFscy5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19DVVJSRU5UX1RSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmF0ZSBUaW1lIFBlcmlvZCBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFJhdGVUaW1lUGVyaW9kUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfcmF0ZVRpbWVQZXJpb2RfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfcmF0ZVRpbWVQZXJpb2RfZmVhdHVyZSIsICJfVUlfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1JBVEVfVElNRV9QRVJJT0QsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXBhcnR1cmUgQ2FwYWNpdHkgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGREZXBhcnR1cmVDYXBhY2l0eVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX2RlcGFydHVyZUNhcGFjaXR5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX2RlcGFydHVyZUNhcGFjaXR5X2ZlYXR1cmUiLCAiX1VJX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTGFiZWxzUGFja2FnZS5MaXRlcmFscy5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19ERVBBUlRVUkVfQ0FQQUNJVFksCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuSU5URUdSQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWF4aW11bSBEZXBhcnR1cmUgQ2FwYWNpdHkgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRNYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9tYXhpbXVtRGVwYXJ0dXJlQ2FwYWNpdHlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfbWF4aW11bURlcGFydHVyZUNhcGFjaXR5X2ZlYXR1cmUiLCAiX1VJX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTGFiZWxzUGFja2FnZS5MaXRlcmFscy5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19NQVhJTVVNX0RFUEFSVFVSRV9DQVBBQ0lUWSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENhcGFjaXR5IGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2FwYWNpdHlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9jYXBhY2l0eV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9jYXBhY2l0eV9mZWF0dXJlIiwgIl9VSV9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9fQ0FQQUNJVFksCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuSU5URUdSQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWF4aW11bSBDYXBhY2l0eSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZE1heGltdW1DYXBhY2l0eVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX21heGltdW1DYXBhY2l0eV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9tYXhpbXVtQ2FwYWNpdHlfZmVhdHVyZSIsICJfVUlfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX01BWElNVU1fQ0FQQUNJVFksCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUcmFuc2l0IFRpbWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUcmFuc2l0VGltZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX3RyYW5zaXRUaW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX3RyYW5zaXRUaW1lX2ZlYXR1cmUiLCAiX1VJX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgTGFiZWxzUGFja2FnZS5MaXRlcmFscy5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19UUkFOU0lUX1RJTUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdGFydCBVcCBEZWxheSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0VXBEZWxheVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsX3N0YXJ0VXBEZWxheV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF9zdGFydFVwRGVsYXlfZmVhdHVyZSIsICJfVUlfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1NUQVJUX1VQX0RFTEFZLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuSU5URUdSQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlmaW5hbCBVUkkgbGFiZWxVUkkgPSAoKFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKW9iamVjdCkuZ2V0VVJJKCk7CisJCWZpbmFsIFN0cmluZyBsYXN0U2VnbWVudCA9IGxhYmVsVVJJLmxhc3RTZWdtZW50KCkudG9TdHJpbmcoKTsKKwkJZmluYWwgaW50IGkgPSBsYXN0U2VnbWVudC5pbmRleE9mKCJfIik7CisJCWZpbmFsIFN0cmluZyBmaXJzdElTT0tleSA9IGxhc3RTZWdtZW50LnN1YnN0cmluZygwLCBpKTsKKwkJZmluYWwgU3RyaW5nIHNlY29uZElTT0tleSA9IGxhc3RTZWdtZW50LnN1YnN0cmluZyhpKzEpOworCQkKKwkJZmluYWwgU3RyaW5nIGZpcnN0R2VvTmFtZSA9IEdlb2dyYXBoaWNOYW1lcy5nZXROYW1lKGZpcnN0SVNPS2V5KTsKKwkJZmluYWwgU3RyaW5nIHNlY29uZEdlb05hbWUgPSBHZW9ncmFwaGljTmFtZXMuZ2V0TmFtZShzZWNvbmRJU09LZXkpOworCQkKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKAorCQkJCWZpcnN0R2VvTmFtZS5zdGFydHNXaXRoKCIhIikgPyBmaXJzdElTT0tleSA6IGZpcnN0R2VvTmFtZSk7CisJCWZpbmFsIEVkZ2UgZWRnZSA9ICgoRWRnZUxhYmVsKSBvYmplY3QpLmdldEVkZ2UoKTsKKwkJc2IuYXBwZW5kKGVkZ2UuaXNEaXJlY3RlZCgpID8gIiAtPiAiIDogIiA8LT4gIik7CisJCS8vIEZpbmQgQnVncyBpZGVudGlmaWVkIGFuIGVycm9yLiAgc2Vjb25kR2VvTmFtZSB3YXMgdXNlZCAKKwkJLy8gZm9yIGJvdGggY29uZGl0aW9ucyBvZiB0aGUgdGVybmFyeQorCQlzYi5hcHBlbmQoc2Vjb25kR2VvTmFtZS5zdGFydHNXaXRoKCIhIikgPyBzZWNvbmRJU09LZXkKKwkJCQkJCTogc2Vjb25kR2VvTmFtZSk7CisKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfSAvLyBnZXRUZXh0CisKKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlVUkkgbGFiZWxWYWx1ZSA9ICgoVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCQorCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsLmNsYXNzKSkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1RSQU5TUE9SVF9NT0RFOgorCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1BPUFVMQVRJT05fSURFTlRJRklFUjoKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19UUkFOU1BPUlRfSURFTlRJRklFUjoKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19SQVRFX1RJTUVfUEVSSU9EOgorCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX0RFUEFSVFVSRV9DQVBBQ0lUWToKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19NQVhJTVVNX0RFUEFSVFVSRV9DQVBBQ0lUWToKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19DQVBBQ0lUWToKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19NQVhJTVVNX0NBUEFDSVRZOgorCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfX1RSQU5TSVRfVElNRToKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMX19TVEFSVF9VUF9ERUxBWToKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIERlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Byb3ZpZGVyL1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Byb3ZpZGVyL1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzIyNjQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvcHJvdmlkZXIvVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlci5MYWJlbFZhbHVlSXRlbVByb3ZpZGVyOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcm92aWRlci5EZWZpbml0aW9uc0VkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZX0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyIGV4dGVuZHMKKwkJTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyKAorCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZEF2YWlsYWJsZURlcGFydHVyZUNhcGFjaXR5UHJvcG9ydGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXZhaWxhYmxlIERlcGFydHVyZSBDYXBhY2l0eSBQcm9wb3J0aW9uIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQXZhaWxhYmxlRGVwYXJ0dXJlQ2FwYWNpdHlQcm9wb3J0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9hdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZV9hdmFpbGFibGVEZXBhcnR1cmVDYXBhY2l0eVByb3BvcnRpb25fZmVhdHVyZSIsICJfVUlfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRV9fQVZBSUxBQkxFX0RFUEFSVFVSRV9DQVBBQ0lUWV9QUk9QT1JUSU9OLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSB0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlID0gKFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpb2JqZWN0OworCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZV90eXBlIikgKyAiICIgKyB0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmdldEF2YWlsYWJsZURlcGFydHVyZUNhcGFjaXR5UHJvcG9ydGlvbigpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmNsYXNzKSkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX0FWQUlMQUJMRV9ERVBBUlRVUkVfQ0FQQUNJVFlfUFJPUE9SVElPTjoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIERlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3V0aWwvTGFiZWxzQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3V0aWwvTGFiZWxzQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDY2NmJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvdXRpbC9MYWJlbHNBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNjQyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnV0aWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNFZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNFZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNOb2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkFyZWFMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4gSXQKKyAqIHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlCisgKiBtb2RlbC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc1BhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIExhYmVsc0FkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgTGFiZWxzUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExhYmVsc0FkYXB0ZXJGYWN0b3J5KCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IExhYmVsc1BhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPgorCSAqIGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mCisJICogdGhlIG1vZGVsLgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgeworCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKKwkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBMYWJlbHNTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgTGFiZWxzU3dpdGNoPEFkYXB0ZXI+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQXJlYUxhYmVsKEFyZWFMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQXJlYUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQXJlYUxhYmVsVmFsdWUoQXJlYUxhYmVsVmFsdWUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUFyZWFMYWJlbFZhbHVlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWwoQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZShDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbChQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUG9wdWxhdGlvbkxhYmVsKFBvcHVsYXRpb25MYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUG9wdWxhdGlvbkxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUG9wdWxhdGlvbkxhYmVsVmFsdWUoUG9wdWxhdGlvbkxhYmVsVmFsdWUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVBvcHVsYXRpb25MYWJlbFZhbHVlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsKFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwoVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZShUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRWFydGhTY2llbmNlTGFiZWwoRWFydGhTY2llbmNlTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUVhcnRoU2NpZW5jZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRWFydGhTY2llbmNlTGFiZWxWYWx1ZShFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgPFQ+IEFkYXB0ZXIgY2FzZUNvbXBhcmFibGUoQ29tcGFyYWJsZTxUPiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ29tcGFyYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUxhYmVsKExhYmVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVMYWJlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU5vZGVMYWJlbChOb2RlTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZU5vZGVMYWJlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1vZGlmaWFibGUoTW9kaWZpYWJsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTW9kaWZpYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVN0YXRpY0xhYmVsKFN0YXRpY0xhYmVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTdGF0aWNMYWJlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVN0YXRpY05vZGVMYWJlbChTdGF0aWNOb2RlTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0YXRpY05vZGVMYWJlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNhbml0eUNoZWNrZXIoU2FuaXR5Q2hlY2tlciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU2FuaXR5Q2hlY2tlckFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUxhYmVsVmFsdWUoTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTGFiZWxWYWx1ZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUVkZ2VMYWJlbChFZGdlTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUVkZ2VMYWJlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVN0YXRpY0VkZ2VMYWJlbChTdGF0aWNFZGdlTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0YXRpY0VkZ2VMYWJlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUR5bmFtaWNMYWJlbChEeW5hbWljTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUR5bmFtaWNMYWJlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUR5bmFtaWNFZGdlTGFiZWwoRHluYW1pY0VkZ2VMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRHluYW1pY0VkZ2VMYWJlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCisJICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7CisJCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOworCX0KKworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWwgPGVtPlBvcHVsYXRpb24gTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdAorCSAqIHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2UKKwkgKiB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3B1bGF0aW9uTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbFZhbHVlIDxlbT5Qb3B1bGF0aW9uIExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWxWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3B1bGF0aW9uTGFiZWxWYWx1ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsIDxlbT5BcmVhIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJlYUxhYmVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWxWYWx1ZSA8ZW0+QXJlYSBMYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0CisJICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQorCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsVmFsdWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJlYUxhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwgPGVtPlBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0CisJICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQorCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwgPGVtPlJlbGF0aXZlIFBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0CisJICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQorCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgPGVtPlJlbGF0aXZlIFBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0CisJICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQorCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsIDxlbT5Db21tb24gQm9yZGVyIFJlbGF0aW9uc2hpcCBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0CisJICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQorCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUgPGVtPkNvbW1vbiBCb3JkZXIgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsIDxlbT5UcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIDxlbT5UcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIDxlbT5QaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWwgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsIDxlbT5Sb2FkIFRyYW5zcG9ydCBSZWxhdGlvbnNoaXAgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgPGVtPlJvYWQgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWwgPGVtPkVhcnRoIFNjaWVuY2UgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRWFydGhTY2llbmNlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkVhcnRoU2NpZW5jZUxhYmVsVmFsdWUgPGVtPkVhcnRoIFNjaWVuY2UgTGFiZWwgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWxWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLmxhbmcuQ29tcGFyYWJsZSA8ZW0+Q29tcGFyYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJZGVudGlmaWFibGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbCA8ZW0+TGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdAorCSAqIHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2UKKwkgKiB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbCA8ZW0+Tm9kZSBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0CisJICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQorCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVOb2RlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNMYWJlbCA8ZW0+U3RhdGljIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGF0aWNMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUgPGVtPk1vZGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kaWZpYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY05vZGVMYWJlbCA8ZW0+U3RhdGljIE5vZGUgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdAorCSAqIHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2UKKwkgKiB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNOb2RlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RhdGljTm9kZUxhYmVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIgPGVtPlNhbml0eSBDaGVja2VyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTYW5pdHlDaGVja2VyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZSA8ZW0+TGFiZWwgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdAorCSAqIHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2UKKwkgKiB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlTGFiZWwgPGVtPkVkZ2UgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFZGdlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNFZGdlTGFiZWwgPGVtPlN0YXRpYyBFZGdlIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNFZGdlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RhdGljRWRnZUxhYmVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsIDxlbT5EeW5hbWljIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRHluYW1pY0xhYmVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0VkZ2VMYWJlbCA8ZW0+RHluYW1pYyBFZGdlIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljRWRnZUxhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUR5bmFtaWNFZGdlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcworCSAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvLyBMYWJlbHNBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvdXRpbC9MYWJlbHNTd2l0Y2guamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3V0aWwvTGFiZWxzU3dpdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3YzMzZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3V0aWwvTGFiZWxzU3dpdGNoLmphdmEKQEAgLTAsMCArMSw3MTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZQorICogaGllcmFyY2h5LiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9CisgKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCisgKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdCBhbmQgcHJvY2VlZGluZyB1cCB0aGUKKyAqIGluaGVyaXRhbmNlIGhpZXJhcmNoeSB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwgd2hpY2ggaXMgdGhlCisgKiByZXN1bHQgb2YgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc1BhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIExhYmVsc1N3aXRjaDxUMT4geworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIExhYmVsc1BhY2thZ2UgbW9kZWxQYWNrYWdlOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMYWJlbHNTd2l0Y2goKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gTGFiZWxzUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB0aGVFT2JqZWN0CisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7CisJCX0KKwkJZWxzZSB7CisJCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKKwkJCXJldHVybgorCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/CisJCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKKwkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQxIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLkFSRUFfTEFCRUw6IHsKKwkJCQlBcmVhTGFiZWwgYXJlYUxhYmVsID0gKEFyZWFMYWJlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VBcmVhTGFiZWwoYXJlYUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGF0aWNOb2RlTGFiZWwoYXJlYUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlTGFiZWwoYXJlYUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGF0aWNMYWJlbChhcmVhTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsKGFyZWFMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kaWZpYWJsZShhcmVhTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShhcmVhTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUoYXJlYUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIExhYmVsc1BhY2thZ2UuQVJFQV9MQUJFTF9WQUxVRTogeworCQkJCUFyZWFMYWJlbFZhbHVlIGFyZWFMYWJlbFZhbHVlID0gKEFyZWFMYWJlbFZhbHVlKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUFyZWFMYWJlbFZhbHVlKGFyZWFMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbFZhbHVlKGFyZWFMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTYW5pdHlDaGVja2VyKGFyZWFMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIExhYmVsc1BhY2thZ2UuQ09NTU9OX0JPUkRFUl9SRUxBVElPTlNISVBfTEFCRUw6IHsKKwkJCQlDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCBjb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCA9IChDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbChjb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbChjb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhdGljRWRnZUxhYmVsKGNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFZGdlTGFiZWwoY29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0YXRpY0xhYmVsKGNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbChjb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kaWZpYWJsZShjb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKGNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKGNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIExhYmVsc1BhY2thZ2UuQ09NTU9OX0JPUkRFUl9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUU6IHsKKwkJCQlDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIGNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUgPSAoQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKGNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZShjb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbFZhbHVlKGNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNhbml0eUNoZWNrZXIoY29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlBIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTDogeworCQkJCVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwgcGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCA9IChQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwocGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhdGljRWRnZUxhYmVsKHBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVkZ2VMYWJlbChwaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGF0aWNMYWJlbChwaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbChwaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKHBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShwaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5QT1BVTEFUSU9OX0xBQkVMOiB7CisJCQkJUG9wdWxhdGlvbkxhYmVsIHBvcHVsYXRpb25MYWJlbCA9IChQb3B1bGF0aW9uTGFiZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlUG9wdWxhdGlvbkxhYmVsKHBvcHVsYXRpb25MYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhdGljTm9kZUxhYmVsKHBvcHVsYXRpb25MYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZUxhYmVsKHBvcHVsYXRpb25MYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhdGljTGFiZWwocG9wdWxhdGlvbkxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbChwb3B1bGF0aW9uTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUocG9wdWxhdGlvbkxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUocG9wdWxhdGlvbkxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHBvcHVsYXRpb25MYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlBPUFVMQVRJT05fTEFCRUxfVkFMVUU6IHsKKwkJCQlQb3B1bGF0aW9uTGFiZWxWYWx1ZSBwb3B1bGF0aW9uTGFiZWxWYWx1ZSA9IChQb3B1bGF0aW9uTGFiZWxWYWx1ZSl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VQb3B1bGF0aW9uTGFiZWxWYWx1ZShwb3B1bGF0aW9uTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGFiZWxWYWx1ZShwb3B1bGF0aW9uTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcihwb3B1bGF0aW9uTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlJFTEFUSVZFX1BIWVNJQ0FMX1JFTEFUSU9OU0hJUF9MQUJFTDogeworCQkJCVJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCByZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwgPSAoUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbChyZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwocmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGF0aWNFZGdlTGFiZWwocmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFZGdlTGFiZWwocmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGF0aWNMYWJlbChyZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsKHJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kaWZpYWJsZShyZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShyZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUocmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIExhYmVsc1BhY2thZ2UuUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFOiB7CisJCQkJUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgcmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgPSAoUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUocmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsVmFsdWUocmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNhbml0eUNoZWNrZXIocmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5UUkFOU1BPUlRfUkVMQVRJT05TSElQX0xBQkVMOiB7CisJCQkJVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwgdHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwgPSAoVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwodHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUR5bmFtaWNFZGdlTGFiZWwodHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUR5bmFtaWNMYWJlbCh0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWRnZUxhYmVsKHRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbCh0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRTogeworCQkJCVRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgdHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSA9IChUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUodHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGFiZWxWYWx1ZSh0cmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTYW5pdHlDaGVja2VyKHRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUU6IHsKKwkJCQlQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgcGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlID0gKFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUocGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbFZhbHVlKHBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcihwaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5ST0FEX1RSQU5TUE9SVF9SRUxBVElPTlNISVBfTEFCRUw6IHsKKwkJCQlSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwgcm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsID0gKFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwocm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsKHJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhdGljRWRnZUxhYmVsKHJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWRnZUxhYmVsKHJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhdGljTGFiZWwocm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbChyb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUocm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUocm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlJPQURfVFJBTlNQT1JUX1JFTEFUSU9OU0hJUF9MQUJFTF9WQUxVRTogeworCQkJCVJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIHJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlID0gKFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKHJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUocm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsVmFsdWUocm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNhbml0eUNoZWNrZXIocm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5FQVJUSF9TQ0lFTkNFX0xBQkVMOiB7CisJCQkJRWFydGhTY2llbmNlTGFiZWwgZWFydGhTY2llbmNlTGFiZWwgPSAoRWFydGhTY2llbmNlTGFiZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlRWFydGhTY2llbmNlTGFiZWwoZWFydGhTY2llbmNlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0YXRpY05vZGVMYWJlbChlYXJ0aFNjaWVuY2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZUxhYmVsKGVhcnRoU2NpZW5jZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGF0aWNMYWJlbChlYXJ0aFNjaWVuY2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGFiZWwoZWFydGhTY2llbmNlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUoZWFydGhTY2llbmNlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShlYXJ0aFNjaWVuY2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShlYXJ0aFNjaWVuY2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBMYWJlbHNQYWNrYWdlLkVBUlRIX1NDSUVOQ0VfTEFCRUxfVkFMVUU6IHsKKwkJCQlFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlIGVhcnRoU2NpZW5jZUxhYmVsVmFsdWUgPSAoRWFydGhTY2llbmNlTGFiZWxWYWx1ZSl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlKGVhcnRoU2NpZW5jZUxhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsVmFsdWUoZWFydGhTY2llbmNlTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcihlYXJ0aFNjaWVuY2VMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3B1bGF0aW9uIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQorCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3B1bGF0aW9uIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVBvcHVsYXRpb25MYWJlbChQb3B1bGF0aW9uTGFiZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcHVsYXRpb24gTGFiZWwgVmFsdWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcHVsYXRpb24gTGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlUG9wdWxhdGlvbkxhYmVsVmFsdWUoUG9wdWxhdGlvbkxhYmVsVmFsdWUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFyZWEgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFyZWEgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlQXJlYUxhYmVsKEFyZWFMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJlYSBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKKwkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJlYSBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VBcmVhTGFiZWxWYWx1ZShBcmVhTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQorCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbChQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWxhdGl2ZSBQaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlbGF0aXZlIFBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwoCisJCQlSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlbGF0aXZlIFBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKKwkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVsYXRpdmUgUGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKAorCQkJUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbW1vbiBCb3JkZXIgUmVsYXRpb25zaGlwIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQorCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21tb24gQm9yZGVyIFJlbGF0aW9uc2hpcCBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbCgKKwkJCUNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21tb24gQm9yZGVyIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKKwkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tbW9uIEJvcmRlciBSZWxhdGlvbnNoaXAgTGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgKKwkJCUNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRyYW5zcG9ydCBSZWxhdGlvbnNoaXAgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2FkIFRyYW5zcG9ydCBSZWxhdGlvbnNoaXAgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2FkIFRyYW5zcG9ydCBSZWxhdGlvbnNoaXAgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9hZCBUcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9hZCBUcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FYXJ0aCBTY2llbmNlIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWFydGggU2NpZW5jZSBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VFYXJ0aFNjaWVuY2VMYWJlbChFYXJ0aFNjaWVuY2VMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWFydGggU2NpZW5jZSBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVhcnRoIFNjaWVuY2UgTGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRWFydGhTY2llbmNlTGFiZWxWYWx1ZShFYXJ0aFNjaWVuY2VMYWJlbFZhbHVlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIDxUPiBUMSBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKKwkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTGFiZWwoTGFiZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTm9kZUxhYmVsKE5vZGVMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RhdGljIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RhdGljIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVN0YXRpY0xhYmVsKFN0YXRpY0xhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2RpZmlhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kaWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VNb2RpZmlhYmxlKE1vZGlmaWFibGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0YXRpYyBOb2RlIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQorCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGF0aWMgTm9kZSBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTdGF0aWNOb2RlTGFiZWwoU3RhdGljTm9kZUxhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNhbml0eSBDaGVja2VyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVNhbml0eUNoZWNrZXIoU2FuaXR5Q2hlY2tlciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGFiZWwgVmFsdWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUxhYmVsVmFsdWUoTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVkZ2UgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRWRnZUxhYmVsKEVkZ2VMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RhdGljIEVkZ2UgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGF0aWMgRWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTdGF0aWNFZGdlTGFiZWwoU3RhdGljRWRnZUxhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EeW5hbWljIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RHluYW1pYyBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VEeW5hbWljTGFiZWwoRHluYW1pY0xhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EeW5hbWljIEVkZ2UgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EeW5hbWljIEVkZ2UgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRHluYW1pY0VkZ2VMYWJlbChEeW5hbWljRWRnZUxhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQorCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlCisJICogYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9IC8vIExhYmVsc1N3aXRjaApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYXR0aWNlL0dyYXBoTGF0dGljZUdlbmVyYXRvckludGVyZmFjZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYXR0aWNlL0dyYXBoTGF0dGljZUdlbmVyYXRvckludGVyZmFjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYTFiZmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhdHRpY2UvR3JhcGhMYXR0aWNlR2VuZXJhdG9ySW50ZXJmYWNlLmphdmEKQEAgLTAsMCArMSw2NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhdHRpY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCitwdWJsaWMgaW50ZXJmYWNlIEdyYXBoTGF0dGljZUdlbmVyYXRvckludGVyZmFjZSB7CisJCisJLyoqCisJICogQnkgY29udmVudGlvbiBhbGwgTGF0dGljZXMgd2lsbCB1c2UgVVJJJ3MgdGhhdCBiZWdpbiB3aXRoCisJICogIkxBVF8iLgorCSAqIFRoZSB0eXBlIG9mIGxhdHRpY2Ugd2lsbCB0aGVuIGJlIGFwcGVuZGVkLiBGb3IgZXhhbXBsZSBhIFNxdWFyZSBMYXR0aWNlCisJICogd2lsbCBoYXZlIGEgVVJJIHRoYXQgYmVnaW5zCisJICogIkxBVF9TUVJfIgorCSAqIGFuZCBhIFRyaWFuZ2xlIExhdHRpY2Ugd2lsbCBoYXZlIG5vZGVzIHdpdGggVVJJCisJICogIkxBVF9UUkkiLgorCSAqIFRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIGlzICJfIiBpbnN0ZWFkIG9mICItIiBhcyB1c2VkIGluIGdlbyBVUkkncyBiZWNhdXNlCisJICogYWxsIG5vZGVzIGluIGFueSBsYXR0aWNlIGFyZSBsZXZlbCAwIG5vZGVzICh0aGVyZSBpcyBubyBjb250YWlubWVudCByZWxhdGlvbnNoaXAgcmVnYXJkbGVzcworCSAqIG9mIGxhdHRpY2Ugc2l6ZSkuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1BSRUZJWD0iTEFUXyI7CisJCisJLyoqIAorCSAqIExhdHRpY2UgdHlwZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNRUl9MQVRUSUNFX1RZUEU9IlNxdWFyZSBMYXR0aWNlIjsKKwkKKwkvKiogCisJICogTGF0dGljZSB0eXBlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0xPQkVfTEFUVElDRV9UWVBFPSJQbGF0ZSBDYXJyZWUiOworCQorCQorCS8qKiAKKwkgKiBMYXR0aWNlIHR5cGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUklfTEFUVElDRV9UWVBFPSJUcmlhbmdsZSBMYXR0aWNlIjsKKwkKKwkvKioKKwkgKgorCSAqIHJldHVybnMgYSBzcXVhcmUgbGF0dGljZSBvZiBzcGVjaWZpZWQgc2l6ZSBhcyBhIGdyYXBoCisJICoKKwkgKiBAcGFyYW0geFNpemUKKwkgKiBAcGFyYW0geVNpemUKKwkgKiBAcGFyYW0gYXJlYQorCSAqIEBwYXJhbSBhZGROZWFyZXN0TmVpZ2hib3JzCisJICogQHBhcmFtIGFkZE5leHROZWFyZXN0TmVpZ2hib3JzCisJICogQHBhcmFtIHBlcmlvZGljQm91bmRhcmllcworCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgR3JhcGggZ2V0R3JhcGgoaW50IHhTaXplLCBpbnQgeVNpemUsIGRvdWJsZSBhcmVhLCBib29sZWFuIGFkZE5lYXJlc3ROZWlnaGJvcnMsIGJvb2xlYW4gYWRkTmV4dE5lYXJlc3ROZWlnaGJvcnMsIGJvb2xlYW4gcGVyaW9kaWNCb3VuZGFyaWVzKTsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYXR0aWNlL2ltcGwvR3JhcGhMYXR0aWNlR2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhdHRpY2UvaW1wbC9HcmFwaExhdHRpY2VHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGZmNmYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYXR0aWNlL2ltcGwvR3JhcGhMYXR0aWNlR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwyMzcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYXR0aWNlLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuRWRnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGF0dGljZS5HcmFwaExhdHRpY2VHZW5lcmF0b3JJbnRlcmZhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5Ob2Rlc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5SZWdpb247CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIEdyYXBoTGF0dGljZUdlbmVyYXRvciBpbXBsZW1lbnRzIEdyYXBoTGF0dGljZUdlbmVyYXRvckludGVyZmFjZSB7CisKKwkvKioKKwkgKiBAcGFyYW0geAorCSAqICAgICAgICAgICAgdGhlIHggY29vcmQgb2YgdGhlIG5vZGUgaW4gdGhlIGxhdHRpY2UKKwkgKiBAcGFyYW0geQorCSAqICAgICAgICAgICAgdGhlIHkgY29vcmQgb2YgdGhlIG5vZGUgaW4gdGhlIGxhdHRpY2UKKwkgKiBAcmV0dXJuIGEgbm9kZQorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVnaW9uIGNyZWF0ZVJlZ2lvbk5vZGUoU3RyaW5nIHVyaVByZWZpeCwgaW50IHgsIGludCB5LCBHcmFwaCBncmFwaCkgeworCQlmaW5hbCBSZWdpb24gbm9kZSA9IE5vZGVzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVnaW9uKCk7CisJCWZpbmFsIER1YmxpbkNvcmUgZGMgPSBub2RlLmdldER1YmxpbkNvcmUoKTsKKwkJZGMuc2V0VGl0bGUoY3JlYXRlTm9kZVRpdGxlKHgsIHkpKTsKKwkJbm9kZS5zZXRVUkkoY3JlYXRlUmVnaW9uTm9kZVVSSSh1cmlQcmVmaXgsIHgsIHksIGdyYXBoKSk7CisJCXJldHVybiBub2RlOworCX0gLy8gY3JlYXRlUmVnaW9uTm9kZQorCQorCisJLyoqCisJICogCisJICogQHBhcmFtIHVyaVByZWZpeAorCSAqIEBwYXJhbSBsYXQKKwkgKiBAcGFyYW0gbG5nCisJICogQHBhcmFtIGdyYXBoCisJICogQHJldHVybiBub2RlCisJICovCisJcHVibGljIHN0YXRpYyBSZWdpb24gY3JlYXRlUmVnaW9uTm9kZShTdHJpbmcgdXJpUHJlZml4LCBTdHJpbmcgbGF0LCBTdHJpbmcgbG5nLCBHcmFwaCBncmFwaCkgeworCQlmaW5hbCBSZWdpb24gbm9kZSA9IE5vZGVzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVnaW9uKCk7CisJCWZpbmFsIER1YmxpbkNvcmUgZGMgPSBub2RlLmdldER1YmxpbkNvcmUoKTsKKwkJZGMuc2V0VGl0bGUoY3JlYXRlTm9kZVRpdGxlKGxhdCwgbG5nKSk7CisJCW5vZGUuc2V0VVJJKGNyZWF0ZVJlZ2lvbk5vZGVVUkkodXJpUHJlZml4LCBsYXQsIGxuZywgZ3JhcGgpKTsKKwkJcmV0dXJuIG5vZGU7CisJfSAvLyBjcmVhdGVSZWdpb25Ob2RlCisJCisJCisJCisJLyoqCisJICogQHBhcmFtIHgKKwkgKiAgICAgICAgICAgIHRoZSBsYXQgb2YgdGhlIG5vZGUgaW4gdGhlIGxhdHRpY2UKKwkgKiBAcGFyYW0geQorCSAqICAgICAgICAgICAgdGhlIGxuZyBvZiB0aGUgbm9kZSBpbiB0aGUgbGF0dGljZQorCSAqIEByZXR1cm4gYSB0aXRsZSBmb3IgYSBub2RlCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlTm9kZVRpdGxlKGRvdWJsZSB4LCBkb3VibGUgeSkgeworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIk5vZGVbIik7CisJCXNiLmFwcGVuZChEb3VibGUudG9TdHJpbmcoeCkpOworCQlzYi5hcHBlbmQoIiwgIik7CisJCXNiLmFwcGVuZChEb3VibGUudG9TdHJpbmcoeSkpOworCQlzYi5hcHBlbmQoIl0iKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfSAvLyBjcmVhdGVOb2RlVGl0bGUKKwkKKwkvKioKKwkgKiBAcGFyYW0geAorCSAqICAgICAgICAgICAgdGhlIGxhdCBvZiB0aGUgbm9kZSBhcyBhIHN0cmluZy4gQWxsb3dzIE4vUyBpbmRpY2F0b3IKKwkgKiBAcGFyYW0geQorCSAqICAgICAgICAgICAgdGhlIGxuZyBvZiB0aGUgbm9kZSBhcyBhIHN0cmluZy4gQWxsb3dzIE4vUyBpbmRpY2F0b3IKKwkgKiBAcmV0dXJuIGEgdGl0bGUgZm9yIGEgbm9kZQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZU5vZGVUaXRsZShTdHJpbmcgeCwgU3RyaW5nIHkpIHsKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJOb2RlWyIpOworCQlzYi5hcHBlbmQoeCk7CisJCXNiLmFwcGVuZCgiLCAiKTsKKwkJc2IuYXBwZW5kKHkpOworCQlzYi5hcHBlbmQoIl0iKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfSAvLyBjcmVhdGVOb2RlVGl0bGUKKwkKKwkKKwkvKioKKwkgKiBAcGFyYW0geAorCSAqICAgICAgICAgICAgdGhlIHggb2YgdGhlIHJlZ2lvbiBpbiB0aGUgbGF0dGljZQorCSAqIEBwYXJhbSB5CisJICogICAgICAgICAgICB0aGUgeSBvZiB0aGUgcmVnaW9uIGluIHRoZSBsYXR0aWNlCisJICogQHJldHVybiBhIFVSSSBmb3IgdGhlIHJlZ2lvbiBub2RlCisJICovCisJcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlUmVnaW9uTm9kZVVSSShTdHJpbmcgdXJpUHJlZml4LCBpbnQgeCwgaW50IHksIEdyYXBoIGdyYXBoKSB7CisJCVN0cmluZyBub2RlVXJpU3VmZml4ID0gdXJpUHJlZml4K3grIl8iK3k7CisJCVN0cmluZyBub2RlVXJpU3RyaW5nID0gTm9kZS5VUklfVFlQRV9OT0RFX1NFR01FTlQgKyAiLyIKKwkJCQkJCQkJKyBncmFwaC5nZXRVUkkoKS5sYXN0U2VnbWVudCgpKyIvIgorCQkJCQkJCQkrIG5vZGVVcmlTdWZmaXg7CisJCQorICAgICAgICBVUkkgdXJpID0gU1RFTVVSSS5jcmVhdGVVUkkobm9kZVVyaVN0cmluZyk7CisJCXJldHVybiB1cmk7CisJfSAvLyBjcmVhdGVSZWdpb25Ob2RlVVJJCisJCisJLyoqCisJICogQHBhcmFtIHgKKwkgKiAgICAgICAgICAgIHRoZSB4IG9mIHRoZSByZWdpb24gbm9kZSBhcyBhIHN0cmluZy4gQWxsb3dzIE4vUyBpbmRpY2F0b3IKKwkgKiBAcGFyYW0geQorCSAqICAgICAgICAgICAgdGhlIHkgb2YgdGhlIHJlZ2lvbiBub2RlIGFzIGEgc3RyaW5nLiBBbGxvd3MgTi9TIGluZGljYXRvcgorCSAqIEByZXR1cm4gYSBVUkkgZm9yIHRoZSByZWdpb24gbm9kZQorCSAqLworCXB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVJlZ2lvbk5vZGVVUkkoU3RyaW5nIHVyaVByZWZpeCwgU3RyaW5nIHgsIFN0cmluZyB5LCBHcmFwaCBncmFwaCkgeworCQlTdHJpbmcgbm9kZVVyaVN1ZmZpeCA9IHVyaVByZWZpeCt4KyJfIit5OworCQlTdHJpbmcgbm9kZVVyaVN0cmluZyA9IE5vZGUuVVJJX1RZUEVfTk9ERV9TRUdNRU5UICsgIi8iCisJCQkJCQkJCSsgZ3JhcGguZ2V0VVJJKCkubGFzdFNlZ21lbnQoKSsiLyIKKwkJCQkJCQkJKyBub2RlVXJpU3VmZml4OworCQkKKyAgICAgICAgVVJJIHVyaSA9IFNURU1VUkkuY3JlYXRlVVJJKG5vZGVVcmlTdHJpbmcpOworCQlyZXR1cm4gdXJpOworCX0gLy8gY3JlYXRlUmVnaW9uTm9kZVVSSQorCQorCQorCS8qKgorCSAqIEBwYXJhbSB4CisJICogICAgICAgICAgICB0aGUgeCBvZiB0aGUgcmVnaW9uIGluIHRoZSBsYXR0aWNlCisJICogQHBhcmFtIHkKKwkgKiAgICAgICAgICAgIHRoZSB5IG9mIHRoZSByZWdpb24gaW4gdGhlIGxhdHRpY2UKKwkgKiBAcmV0dXJuIGEgVVJJIGZvciB0aGUgcmVnaW9uIG5vZGUKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBVUkkgY3JlYXRlRWRnZUxhYmVsVVJJKE5vZGUgbm9kZUEsIE5vZGUgbm9kZUIpIHsKKwkJVVJJIHVyaUEgPSBub2RlQS5nZXRVUkkoKTsKKwkJVVJJIHVyaUIgPSBub2RlQi5nZXRVUkkoKTsKKwkJU3RyaW5nIHNBID0gdXJpQS5sYXN0U2VnbWVudCgpOworCQlTdHJpbmcgc0IgPSB1cmlCLmxhc3RTZWdtZW50KCk7CisJCS8vIENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyCisJCS8vIHVzZXMgXyBhcyBhIHNwZWNpYWwgY2hhcmFjdGVyIHRvIHNlcGFyYXRlIHRoZSB0d28gbm9kZXMKKwkJLy8gc28gd2UgbmVlZCB0byByZXBsYWNlIGl0LgorCQlzQT1zQS5yZXBsYWNlKCdfJywnLicpOworCQlzQj1zQi5yZXBsYWNlKCdfJywnLicpOworCQlTdHJpbmcgdXJpU3RyaW5nID0gc0ErIl8iK3NCOworICAgICAgICBVUkkgdXJpID0gU1RFTVVSSS5jcmVhdGVVUkkodXJpU3RyaW5nKTsKKwkJcmV0dXJuIHVyaTsKKwl9IC8vIGNyZWF0ZVJlZ2lvbk5vZGVVUkkKKwkKKwkKKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBncmFwaAorCSAqIEBwYXJhbSBub2RlQQorCSAqIEBwYXJhbSBub2RlQgorCSAqIEBwYXJhbSBib3JkZXJMZW5ndGgKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlRWRnZShmaW5hbCBHcmFwaCBncmFwaCwgZmluYWwgTm9kZSBub2RlQSwKKwkJCWZpbmFsIE5vZGUgbm9kZUIsIGludCBib3JkZXJMZW5ndGgpIHsKKwkJLy9maW5hbCBMaXN0PEVkZ2U+IGVkZ2VMaXN0ID0gbmV3IEFycmF5TGlzdDxFZGdlPigpOworCQkgCisJCS8vIGNyZWF0ZSB0aGUgZWRnZQorCQlmaW5hbCBFZGdlIGVkZ2UgPSBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbEltcGwuY3JlYXRlQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwKG5vZGVBLCBub2RlQiwKKwkJCQlib3JkZXJMZW5ndGgpOworCQkKKwkJVVJJIGVkZ2VVUkkgPSBlZGdlLmdldFVSSSgpOworCQkvLyB0aGUgYXV0b2dlbmVyYXRlZCBlZGdlIHVyaSBpcyBub3QgY29ycmVjdC4gTmVlZCB0byByZXBsYWNlIGl0CisJCVN0cmluZyBzRWRnZSA9IGVkZ2VVUkkudG9TdHJpbmcoKTsKKwkJaW50IGxhc3QgPSBzRWRnZS5sYXN0SW5kZXhPZigiLyIpOworCQlTdHJpbmcgc0VkZ2UxID0gc0VkZ2Uuc3Vic3RyaW5nKDAsbGFzdCk7CisJCVN0cmluZyBzRWRnZTIgPSBzRWRnZS5zdWJzdHJpbmcobGFzdCxzRWRnZS5sZW5ndGgoKSk7CisJCXNFZGdlID0gc0VkZ2UxKyIvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlciIrc0VkZ2UyOworCQlVUkkgbmV3VVJJID0gVVJJLmNyZWF0ZVVSSShzRWRnZSk7CisJCWVkZ2Uuc2V0VVJJKG5ld1VSSSk7CisJCQorCQkvLyBub3cgd2UgbmVlZCB0byBzZXQgdGhlIHVyaSBmb3IgdGhlIGxhYmVsCisJCUNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsIGxhYmVsID0gKENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsKWVkZ2UuZ2V0TGFiZWwoKTsKKwkJbGFiZWwuc2V0VVJJKGNyZWF0ZUVkZ2VMYWJlbFVSSShub2RlQSwgbm9kZUIpKTsKKwkJLy9VUkkgbGFiZWxVUkkgPSBsYWJlbC5nZXRVUkkoKTsKKwkJCisJCWZpbmFsIER1YmxpbkNvcmUgZGMgPSBlZGdlLmdldER1YmxpbkNvcmUoKTsKKwkJZGMuc2V0VGl0bGUoY3JlYXRlRWRnZVRpdGxlKG5vZGVBLCBub2RlQikpOworCQkKKwkJZ3JhcGgucHV0RWRnZShlZGdlKTsKKwl9IC8vIGNyZWF0ZUVkZ2VMaXN0CisJCisJLyoqCisJICogQHBhcmFtIHgKKwkgKiAgICAgICAgICAgIHRoZSB4IG9mIHRoZSBub2RlIGluIHRoZSBsYXR0aWNlCisJICogQHBhcmFtIHkKKwkgKiAgICAgICAgICAgIHRoZSB5IG9mIHRoZSBub2RlIGluIHRoZSBsYXR0aWNlCisJICogQHJldHVybiBhIHRpdGxlIGZvciBhIG5vZGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVFZGdlVGl0bGUoTm9kZSBub2RlQSwgTm9kZSBub2RlQikgeworCQlTdHJpbmcgbkEgPSBub2RlQS5nZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKTsKKwkJU3RyaW5nIG5CID0gbm9kZUIuZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCk7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiRWRnZVsoIik7CisJCXNiLmFwcGVuZChuQSk7CisJCXNiLmFwcGVuZCgiKTwtLT4oIik7CisJCXNiLmFwcGVuZChuQik7CisJCXNiLmFwcGVuZCgiKV0iKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfSAvLyBjcmVhdGVFZGdlVGl0bGUKKwkKKwkvKioKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbkNvdW50CisJICogICAgICAgICAgICBudW1iZXIgb2YgKERlZmF1bHQ6IGh1bWFuKSBwb3B1bGF0aW9uIG1lbWJlcnMgYXQgdGhlIG5vZGUKKwkgKiBAcGFyYW0gbm9kZQorCSAqICAgICAgICAgICAgdGhlIG5vZGUKKwkgKiBAcmV0dXJuIGEgcG9wdWxhdGlvbiBsYWJlbAorCSAqLworCXB1YmxpYyBzdGF0aWMgUG9wdWxhdGlvbkxhYmVsIGNyZWF0ZVBvcHVsYXRpb25MYWJlbCgKKwkJCWZpbmFsIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllciwgZmluYWwgZG91YmxlIHBvcHVsYXRpb25Db3VudCwKKwkJCWZpbmFsIE5vZGUgbm9kZSkgeworCQlmaW5hbCBQb3B1bGF0aW9uTGFiZWwgcmV0VmFsdWUgPSBMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVQb3B1bGF0aW9uTGFiZWwoKTsKKwkJcmV0VmFsdWUuc2V0UG9wdWxhdGlvbklkZW50aWZpZXIocG9wdWxhdGlvbklkZW50aWZpZXIpOworCQlyZXRWYWx1ZS5nZXRDdXJyZW50UG9wdWxhdGlvblZhbHVlKCkuc2V0Q291bnQocG9wdWxhdGlvbkNvdW50KTsKKwkJbm9kZS5nZXRMYWJlbHMoKS5hZGQocmV0VmFsdWUpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfS8vIGNyZWF0ZSBQb3B1bGF0aW9uTGFiZWwKKwkKKwkKK30gLy9HcmFwaExhdHRpY2VHZW5lcmF0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGF0dGljZS9pbXBsL0xhdHRpY2VHZW5lcmF0b3JVdGlsaXR5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYXR0aWNlL2ltcGwvTGF0dGljZUdlbmVyYXRvclV0aWxpdHlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhMTQ3OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGF0dGljZS9pbXBsL0xhdHRpY2VHZW5lcmF0b3JVdGlsaXR5SW1wbC5qYXZhCkBAIC0wLDAgKzEsNjE4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGF0dGljZS5pbXBsOworCitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuVXRpbGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkVkZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLk5vZGVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLklubGluZUxhdExvbmdEYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZ1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZy5TZWdtZW50QnVpbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydE1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYXR0aWNlLkdyYXBoTGF0dGljZUdlbmVyYXRvckludGVyZmFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLk5vZGVzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLlJlZ2lvbjsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3B1YmxpYyBjbGFzcyBMYXR0aWNlR2VuZXJhdG9yVXRpbGl0eUltcGwgZXh0ZW5kcyBHcmFwaExhdHRpY2VHZW5lcmF0b3IgeworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfU1FSX1BSRUZJWCA9IFVSSV9QUkVGSVgrIlNRUl8iOworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfR0xCTF9QUkVGSVggPSBVUklfUFJFRklYKyJHTEJfIjsKKwkKKwkvKiogCisJICogbXVzdCBzcGVjaWZ5IHRoZSBsYXR0aWNlIHR5cGUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIExBVFRJQ0VfVFlQRT1TUVJfTEFUVElDRV9UWVBFOworCQorCS8vIHRlc3RpbmcKKwkvL3N0YXRpYyBkb3VibGVbXVtdW10gbHRsZzsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBERUdSRUVTX1RPX1JBRElBTlMgPSBNYXRoLlBJLzE4MC4wOworCQorCQorCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUE9QVUxBVElPTl9OQU1FPSJodW1hbiI7CisJCisJLyoqCisJICogCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgUE9QVUxBVElPTl9OQU1FPURFRkFVTFRfUE9QVUxBVElPTl9OQU1FOworCQorCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIERFRkFVTFRfUE9QVUxBVElPTl9DT1VOVCA9IDEuMDsKKwkKKwlwdWJsaWMgTGF0dGljZUdlbmVyYXRvclV0aWxpdHlJbXBsKFN0cmluZyB0eXBlKSB7CisJCUxBVFRJQ0VfVFlQRSA9IHR5cGU7CisJfQorCQorCS8qKgorCSAqIEtpbG9tZXRlcnMgcGVyIGRlZ3JlZSBsYXRpdHVkZS4KKwkgKi8KKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBLTV9QRVJfREVHX0xBVCA9IDQwMDA4LjYyOSAvIDM2MC4wOworCQorCS8qKgorCSAqIEtpbG9tZXRlcnMgcGVyIGRlZ3JlZSBsYXRpdHVkZS4KKwkgKi8KKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBLTV9QRVJfREVHX0xPTiA9IDQwMDA4LjYyOSAvIDM2MC4wOworCisJCisJLyoqCisJICoKKwkgKiByZXR1cm5zIGEgc3F1YXJlIGxhdHRpY2Ugb2Ygc3BlY2lmaWVkIHNpemUgYXMgYSBncmFwaAorCSAqCisJICogQHBhcmFtIHhTaXplCisJICogQHBhcmFtIHlTaXplCisJICogQHBhcmFtIGFyZWEKKwkgKiBAcGFyYW0gYWRkTmVhcmVzdE5laWdoYm9ycworCSAqIEBwYXJhbSBhZGROZXh0TmVhcmVzdE5laWdoYm9ycworCSAqIEBwYXJhbSBwZXJpb2RpY0JvdW5kYXJpZXMKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEdyYXBoIGdldEdyYXBoKGludCB4U2l6ZSwgaW50IHlTaXplLCBkb3VibGUgYXJlYSwgYm9vbGVhbiBhZGROZWFyZXN0TmVpZ2hib3JzLCBib29sZWFuIGFkZE5leHROZWFyZXN0TmVpZ2hib3JzLCBib29sZWFuIHBlcmlvZGljQm91bmRhcmllcykgeworCQlmaW5hbCBHcmFwaCBncmFwaCA9IEdyYXBoRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGgoKTsKKwkJZmluYWwgRHVibGluQ29yZSBkYyA9IGdyYXBoLmdldER1YmxpbkNvcmUoKTsKKwkJZGMucG9wdWxhdGUoKTsKKwkJZGMuc2V0VGl0bGUoTEFUVElDRV9UWVBFKTsKKwkJZGMuc2V0U291cmNlKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworCQlDYWxlbmRhciBjID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRSB5eXl5Lk1NLmRkICdhdCcgaGg6bW06c3MgYSB6enoiKTsKKyAgICAgICAgU3RyaW5nIHZhbGlkID0gZm9ybWF0dGVyLmZvcm1hdChjLmdldFRpbWUoKSk7CisgICAgICAgCWRjLnNldFZhbGlkKHZhbGlkKTsKKwkJCQkJCQorCQkJZmluYWwgTm9kZSBub2RlSG9sZGVyW11bXSA9IG5ldyBOb2RlW3hTaXplXVt5U2l6ZV07CisKKwkJCS8vIENyZWF0ZSB0aGUgbm9kZXMgYW5kIHB1dCB0aGVtIGludG8gdGhlIGdyYXBoCisJCQlmb3IgKGludCB4ID0gMDsgeCA8IHhTaXplOyB4KyspIHsKKwkJCQlmb3IgKGludCB5ID0gMDsgeSA8IHlTaXplOyB5KyspIHsKKwkJCQkJZmluYWwgUmVnaW9uIHJlZ2lvbk5vZGUgPSBjcmVhdGVSZWdpb25Ob2RlKFVSSV9TUVJfUFJFRklYLCB4LCB5LCBncmFwaCk7CisJCQkJCQorCQkJCQkvLyBvbiBhIHNxdWFyZSBsYXR0aWNlIGFsbCBub2RlcyBoYXZlIGFyZWE9MS4wCisJCQkJCWZpbmFsIEFyZWFMYWJlbCBhcmVhTGFiZWwgPSBMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcmVhTGFiZWwoKTsKKwkJCQkJYXJlYUxhYmVsLmdldEN1cnJlbnRBcmVhVmFsdWUoKS5zZXRBcmVhKGFyZWEpOworCQkJCQlhcmVhTGFiZWwuc2V0VVJJKFNURU1VUkkuY3JlYXRlVVJJKExhYmVsLlVSSV9UWVBFX0xBQkVMX1NFR01FTlQgKyAiLyIrIFNURU1VUkkuZ2VuZXJhdGVVbmlxdWVQYXJ0KCkpKTsKKwkJCQkJcmVnaW9uTm9kZS5nZXRMYWJlbHMoKS5hZGQoYXJlYUxhYmVsKTsKKwkJCQkJCQkJCQkKKwkJCQkJCisJCQkJCW5vZGVIb2xkZXJbeF1beV0gPSByZWdpb25Ob2RlOworCQkJCQlncmFwaC5wdXROb2RlKHJlZ2lvbk5vZGUpOworCQkJCX0gLy8gZm9yIGVhY2ggeQorCQkJfSAvLyBmb3IgZWFjaCB4CisKKwkJCQorCQkJLy8gdGhlIGVnZGUgY3JlYXRpb24gcmVxdWlyZWQgYSBjb21tb24gYm9yZGVyIGxlbmd0aC4KKwkJCS8vIHJpZ2h0IG5vdyB0aGlzIGlzIGFuIGludCBzbyBzZXQgdGhlIG1pbmltdW0gYXQgMQorCQkJLy8gdGhpcyBpcyBOT1QgYWN0dWFsbHkgdXNlZCBpbiBhbnkgY2FsY3VsYXRpb24KKwkJCS8vIFRPRE8gY29tbW9uQm9yZGVyTGVuZ3RoIHNob3VsZCBiZSBvZiB0eXBlIGRvdWJsZQorCQkJZG91YmxlIGJvcmRlckxlbmd0aCA9IE1hdGguc3FydChhcmVhKTsKKwkJCWlmKGJvcmRlckxlbmd0aCA8IDEuMCApIGJvcmRlckxlbmd0aCA9IDEuMDsKKwkJCWludCBjb21tb25Cb3JkZXJMZW5ndGggPSAoaW50KSBib3JkZXJMZW5ndGg7CisJCQkKKyAJCQkvLyBJZiB3ZSBhcmUgaW5jbHVkaW5nIE5lYXJlc3QgTmVpZ2hib3JzIChOTikKKwkJCWlmKGFkZE5lYXJlc3ROZWlnaGJvcnMpIHsKKwkJCQkvL0FkZCB0aGUgZWRnZXMKKwkJCQlmb3IgKGludCB4ID0gMDsgeCA8IHhTaXplOyB4KyspIHsKKwkJCQkJZm9yIChpbnQgeSA9IDA7IHkgPCB5U2l6ZTsgeSsrKSB7CisJCQkJCQlpZigoeS0xKT49MCkgeworCQkJCQkJCWNyZWF0ZUVkZ2UoZ3JhcGgsbm9kZUhvbGRlclt4XVt5IC0gMV0sbm9kZUhvbGRlclt4XVt5XSwgY29tbW9uQm9yZGVyTGVuZ3RoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYocGVyaW9kaWNCb3VuZGFyaWVzKSB7CisJCQkJCQkJCWNyZWF0ZUVkZ2UoZ3JhcGgsbm9kZUhvbGRlclt4XVt5U2l6ZSAtIDFdLG5vZGVIb2xkZXJbeF1beV0sIGNvbW1vbkJvcmRlckxlbmd0aCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJCisJCQkJCQlpZigoeC0xKT49MCkgeworCQkJCQkJCWNyZWF0ZUVkZ2UoZ3JhcGgsbm9kZUhvbGRlclt4IC0gMV1beV0sbm9kZUhvbGRlclt4XVt5XSwgY29tbW9uQm9yZGVyTGVuZ3RoKTsKKwkJCQkJCX1lbHNlIHsKKwkJCQkJCQlpZihwZXJpb2RpY0JvdW5kYXJpZXMpIHsKKwkJCQkJCQkJY3JlYXRlRWRnZShncmFwaCxub2RlSG9sZGVyW3hTaXplIC0gMV1beV0sbm9kZUhvbGRlclt4XVt5XSwgY29tbW9uQm9yZGVyTGVuZ3RoKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJfSAvLyBmb3IgZWFjaCB5CisJCQkJfSAvLyBmb3IgZWFjaCB4CisJCQl9Ly8gTk4gZWRnZXMKKworCQkJLy8gSWYgd2UgYXJlIGluY2x1ZGluZyBORVhUIE5lYXJlc3QgTmVpZ2hib3JzIChOTk4pCisJCQlpZihhZGROZXh0TmVhcmVzdE5laWdoYm9ycykgeworCQkJCWZvciAoaW50IHggPSAwOyB4IDwgeFNpemU7IHgrKykgeworCQkJCQlmb3IgKGludCB5ID0gMDsgeSA8IHlTaXplOyB5KyspIHsKKwkJCQkJCS8vIHVwcHBlciByaWdodD8KKwkJCQkJCWlmKCAoKHgrMSk8eFNpemUpICYmICgoeSsxKTx5U2l6ZSkgKSB7CisJCQkJCQkJY3JlYXRlRWRnZShncmFwaCxub2RlSG9sZGVyW3hdW3ldLG5vZGVIb2xkZXJbeCsxXVt5KzFdLCBjb21tb25Cb3JkZXJMZW5ndGgpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJaWYocGVyaW9kaWNCb3VuZGFyaWVzKSB7CisJCQkJCQkJCQlpbnQgeDIgPSB4KzE7CisJCQkJCQkJCQlpbnQgeTIgPSB5KzE7CisJCQkJCQkJCQlpZih4Mj49eFNpemUpIHgyPTA7CisJCQkJCQkJCQlpZih5Mj49eVNpemUpIHkyPTA7CisJCQkJCQkJCQljcmVhdGVFZGdlKGdyYXBoLG5vZGVIb2xkZXJbeF1beV0sbm9kZUhvbGRlclt4Ml1beTJdLCBjb21tb25Cb3JkZXJMZW5ndGgpOworCQkJCQkJCQl9CisJCQkJCQl9Ly8gdXBwZXIgcmlnaHQKKwkJCQkJCQkKKwkJCQkJCS8vIGxvd2VyIHJpZ2h0CisJCQkJCQlpZiggKCh4KzEpPHhTaXplKSAmJiAoKHktMSk+PTApICkgeworCQkJCQkJCWNyZWF0ZUVkZ2UoZ3JhcGgsbm9kZUhvbGRlclt4XVt5XSxub2RlSG9sZGVyW3grMV1beS0xXSwgY29tbW9uQm9yZGVyTGVuZ3RoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYocGVyaW9kaWNCb3VuZGFyaWVzKSB7CisJCQkJCQkJCWludCB4MiA9IHgrMTsKKwkJCQkJCQkJaW50IHkyID0geS0xOworCQkJCQkJCQlpZih4Mj49eFNpemUpIHgyPTA7CisJCQkJCQkJCWlmKHkyIDw9IC0xKSB5Mj15U2l6ZS0xOworCQkJCQkJCQljcmVhdGVFZGdlKGdyYXBoLG5vZGVIb2xkZXJbeF1beV0sbm9kZUhvbGRlclt4Ml1beTJdLCBjb21tb25Cb3JkZXJMZW5ndGgpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCQorCQkJCQl9IC8vIGZvciBlYWNoIHkKKwkJCQl9IC8vIGZvciBlYWNoIHgKKwkJCQkKKwkJCX0vLyBOTk4gZWRnZXMKKworCQkJLy8gQWRkIHRoZSBzcGF0aWFsIHBvbHlnb25zIHRvIHRoZSBzcGF0aWFsIGF0dHJpYnV0ZSBvZiBlYWNoIG5vZGUncworCQkJLy8gZHVibGluIGNvcmUgaW5zdGFuY2UgYW5kIGZvciBlYWNoIGVkZ2UuIFRoZSB2YWx1ZSBmb3IgdGhlIG5vZGVzIHdpbGwKKwkJCS8vIGJlIGEgcmVjdGFuZ3VsYXIgYXJlYSBleHByZXNzZWQgYXMgYSBzZXQgb2YgbGF0L2xvbmcgcG9pbnRzIHRoYXQKKwkJCS8vIGxheW91dCBhIHBvbHlnb24uIFRoZSBwb3NpdGlvbiBvZiB0aGUgcG9seWdvbiB3aWxsIGF0IHBvc2l0aW9uIHRoYXQKKwkJCS8vIG1hdGNoZXMgdGhlIHBvc2l0aW9uICh4LCB5KSBvZiB0aGUgbm9kZSBpbiB0aGUgbGF0dGljZS4KKwkJCWFkZFNwYXRpYWxTcGVjaWZpY2F0aW9ucyhub2RlSG9sZGVyLCB4U2l6ZSwgeVNpemUsIGFyZWEpOworCisJCQlhc3NlcnQgZ3JhcGguc2FuZSgpOworCisJCQlyZXR1cm4gZ3JhcGg7CisJCX0KKwkJCisJCisJCisJCisJCisJCisJCisJCQorCisJLyoqCisJICogQWRkIHRoZSBzcGF0aWFsIHNwZWNpZmljYXRpb24gdG8gdGhlIHNwYXRpYWwgYXR0cmlidXRlIG9mIGVhY2ggbm9kZSdzCisJICogZHVibGluIGNvcmUgaW5zdGFuY2UuIFRoZSB2YWx1ZSB3aWxsIGJlIGEgcmV0YW5ndWxhciBhcmVhIGV4cHJlc3NlZCBhcyBhCisJICogc2V0IG9mIGxhdC9sb25nIHBvaW50cyB0aGF0IGxheW91dCBhIHBvbHlnb24uIFRoZSBwb3NpdGlvbiBvZiB0aGUgcG9seWdvbgorCSAqIHdpbGwgYXQgcG9zaXRpb24gdGhhdCBtYXRjaGVzIHRoZSBwb3NpdGlvbiAoeCwgeSkgb2YgdGhlIG5vZGUgaW4KKwkgKiB0aGUgbGF0dGljZS4gTm9kZSBhdCBwb3NpdGlvbiBbMF1bMF0gd2lsbCBiZSBpbiB0aGUgdXBwZXIgbGVmdCB3aGlsZSB0aGUKKwkgKiBub2RlIGF0IHBvc2l0b24gW251bXhzXVtudW15c10gd2lsbCBiZSBpbiB0aGUgbG93ZXIgcmlnaHQgb2YgdGhlCisJICogcmVjdGFuZ3VsYXIgYXJlYS4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZUhvbGRlcgorCSAqIEBwYXJhbSB4U2l6ZQorCSAqIEBwYXJhbSB5U2l6ZQorCSAqIEBwYXJhbSBhcmVhCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRTcGF0aWFsU3BlY2lmaWNhdGlvbnMoZmluYWwgTm9kZVtdW10gbm9kZUhvbGRlciwgaW50IHhTaXplLCBpbnQgeVNpemUsIGRvdWJsZSBhcmVhKSB7CisKKwkJLy8gRmlyc3QgcnVuIHRocm91Z2ggYWxsIG9mIHRoZSBub2RlcyBjcmVhdGluZyBhIHBvbHlnb24gZm9yIHRoZWlyCisJCS8vIGJvcmRlciBhbmQgYWRkaW5nIHRoZSBkYXRhIGFzIGFuIGlubGluZSB2YWx1ZSBpbiB0aGUgc3BhdGlhbAorCQkvLyBhdHRyaWJ1dGUgb2YgdGhlIG5vZGUncyBkdWJsaW4gY29yZS4KKwkJLy8gc2NhbGUgaXMgdGhlIHNjYWxlIGZhY3RvciAoYW5kIHR3aWNlIHRoZSBzdGVwIHNpemUpIGZvciB0aGUgbGF0dGljZQorCQlkb3VibGUgc2NhbGUgPSBNYXRoLnNxcnQoYXJlYSk7CisJCWZvciAoaW50IHggPSAwOyB4IDwgeFNpemU7IHgrKykgeworCQkJZm9yIChpbnQgeSA9IDA7IHkgPCB5U2l6ZTsgeSsrKSB7CisJCQkJZmluYWwgTm9kZSBub2RlID0gbm9kZUhvbGRlclt4XVt5XTsKKwkJCQlmaW5hbCBMYXRMb25nIG5vZGVTZWdtZW50cyA9IGNyZWF0ZU5vZGVQb2x5Z29uKHgseSxzY2FsZSk7CisJCQkJZmluYWwgU3RyaW5nIHNwYXRpYWxVUklTdHJpbmcgPSBJbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyCisJCQkJCQkuY3JlYXRlU3BhdGlhbElubGluZVVSSVN0cmluZyhub2RlU2VnbWVudHMpOworCQkJCW5vZGUuZ2V0RHVibGluQ29yZSgpLnNldFNwYXRpYWwoc3BhdGlhbFVSSVN0cmluZyk7CisJCQkJCisJCQl9IC8vIGZvciBlYWNoIHkKKwkJfSAvLyBmb3IgZWFjaCB4CisJfSAvLyBhZGRTcGF0aWFsU3BlY2lmaWNhdGlvbnMKKwkKKwkvKioKKwkgKiBBZGQgdGhlIHNwYXRpYWwgc3BlY2lmaWNhdGlvbiB0byB0aGUgc3BhdGlhbCBhdHRyaWJ1dGUgb2YgZWFjaCBub2RlJ3MKKwkgKiBkdWJsaW4gY29yZSBpbnN0YW5jZS4gVGhlIHZhbHVlIHdpbGwgYmUgYSByZXRhbmd1bGFyIGFyZWEgZXhwcmVzc2VkIGFzIGEKKwkgKiBzZXQgb2YgbGF0L2xvbmcgcG9pbnRzIHRoYXQgbGF5b3V0IGEgcG9seWdvbi4gVGhlIHBvc2l0aW9uIG9mIHRoZSBwb2x5Z29uCisJICogd2lsbCBhdCBwb3NpdGlvbiB0aGF0IG1hdGNoZXMgdGhlIHBvc2l0aW9uICh4LCB5KSBvZiB0aGUgbm9kZSBpbgorCSAqIHRoZSBsYXR0aWNlLiBOb2RlIGF0IHBvc2l0aW9uIFswXVswXSB3aWxsIGJlIGluIHRoZSB1cHBlciBsZWZ0IHdoaWxlIHRoZQorCSAqIG5vZGUgYXQgcG9zaXRvbiBbbnVteHNdW251bXlzXSB3aWxsIGJlIGluIHRoZSBsb3dlciByaWdodCBvZiB0aGUKKwkgKiByZWN0YW5ndWxhciBhcmVhLgorCSAqIAorCSAqIEBwYXJhbSBub2RlSG9sZGVyCisJICogQHBhcmFtIHhTaXplCisJICogQHBhcmFtIHlTaXplCisJICogQHBhcmFtIGFyZWEKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFNwYXRpYWxTcGVjaWZpY2F0aW9ucyhmaW5hbCBOb2RlW11bXSBub2RlSG9sZGVyLCBpbnQgYW5ndWxhclN0ZXAsIGludCBsYXRTaXplLCBpbnQgbG5nU2l6ZSkgeworCisJCS8vIEZpcnN0IHJ1biB0aHJvdWdoIGFsbCBvZiB0aGUgbm9kZXMgY3JlYXRpbmcgYSBwb2x5Z29uIGZvciB0aGVpcgorCQkvLyBib3JkZXIgYW5kIGFkZGluZyB0aGUgZGF0YSBhcyBhbiBpbmxpbmUgdmFsdWUgaW4gdGhlIHNwYXRpYWwKKwkJLy8gYXR0cmlidXRlIG9mIHRoZSBub2RlJ3MgZHVibGluIGNvcmUuCisJCS8vIHVzZSBlcXVpLWFuZ3VsYXIgc3RlcHMKKwkJaW50IG9mZnNldCA9IGFuZ3VsYXJTdGVwLzI7CisJCWludCBsYXQgPSAtOTA7CisJCWludCBsbmcgPSAtMTgwOworCQlmb3IgKGludCB4ID0gMDsgeCA8IGxhdFNpemU7IHgrKykgeworCQkJZm9yIChpbnQgeSA9IDA7IHkgPCBsbmdTaXplOyB5KyspIHsKKwkJCQlmaW5hbCBOb2RlIG5vZGUgPSBub2RlSG9sZGVyW3hdW3ldOworCQkJCWZpbmFsIExhdExvbmcgbm9kZVNlZ21lbnRzID0gY3JlYXRlUGxhdGVDYXJyZWVQb2x5Z29uKGxhdCtvZmZzZXQsbG5nK29mZnNldCxhbmd1bGFyU3RlcCk7CisJCQkJZmluYWwgU3RyaW5nIHNwYXRpYWxVUklTdHJpbmcgPSBJbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyCisJCQkJCQkuY3JlYXRlU3BhdGlhbElubGluZVVSSVN0cmluZyhub2RlU2VnbWVudHMpOworCQkJCW5vZGUuZ2V0RHVibGluQ29yZSgpLnNldFNwYXRpYWwoc3BhdGlhbFVSSVN0cmluZyk7CisJCQkJbG5nKz0gYW5ndWxhclN0ZXA7CisJCQl9IC8vIGZvciBlYWNoIGxuZworCQkJbGF0Kz0gYW5ndWxhclN0ZXA7CisJCQlsbmcgPSAtMTgwOy8vIHJlc2V0CisJCX0gLy8gZm9yIGVhY2ggbGF0CisJCQorCX0gLy8gYWRkU3BhdGlhbFNwZWNpZmljYXRpb25zCisJCisJCisJCisKKworCQorCS8qKgorCSAqIAorCSAqIEBwYXJhbSB4aSBhIGNvdW50ZXIgaW4geAorCSAqIEBwYXJhbSB5aSBhIGNvdW50ZXIgaW4geQorCSAqIEBwYXJhbSBzY2FsZSBpcyB0aGUgc2NhbGUgZmFjdG9yIChhbmQgdHdpY2UgdGhlIHN0ZXAgc2l6ZSkgZm9yIHRoZSBsYXR0aWNlCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgc3RhdGljIExhdExvbmcgY3JlYXRlTm9kZVBvbHlnb24oZmluYWwgZG91YmxlIHhpLCBkb3VibGUgeWksIGRvdWJsZSBzY2FsZSkgeworCQlmaW5hbCBMYXRMb25nIHJldFZhbHVlID0gbmV3IExhdExvbmcoKTsKKwkJCisJCWZpbmFsIFNlZ21lbnRCdWlsZGVyIHNiID0gbmV3IFNlZ21lbnRCdWlsZGVyKCk7CisJCWRvdWJsZSB4ID0geGkqc2NhbGUvS01fUEVSX0RFR19MT047IC8vIGNvbnZlcnQgdG8gbG9uCisJCWRvdWJsZSB5ID0geWkqc2NhbGUvS01fUEVSX0RFR19MQVQ7IC8vIGNvbnZlcnQgdG8gbGF0CisJCWRvdWJsZSB4c3RlcCA9IHNjYWxlLygyLjAqS01fUEVSX0RFR19MT04pOworCQlkb3VibGUgeXN0ZXAgPSBzY2FsZS8oMi4wKktNX1BFUl9ERUdfTEFUKTsKKwkJCisJCS8vIFdlIGp1c3QgbWFrZSBhIHNxdWFyZS4uLgorCQlzYi5hZGQoeC14c3RlcCwgeSt5c3RlcCk7CisJCXNiLmFkZCh4K3hzdGVwLCB5K3lzdGVwKTsKKwkJc2IuYWRkKHgreHN0ZXAsIHkteXN0ZXApOworCQlzYi5hZGQoeC14c3RlcCwgeS15c3RlcCk7CisJCXJldFZhbHVlLmFkZChzYi50b1NlZ21lbnQoKSk7CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlTm9kZVBvbHlnb24KKwkKKworCS8qKgorCSAqIEFsbW9zdCB0aGUgc2FtZSBhcyBjcmVhdGVOb2RlUG9seWdvbgorCSAqIHRoaXMgY29kZSBoYW5kbGVzIHRoZSBub3J0aCBhbmQgc291dGggcG9sZXMgaW4gYSBzcGVjaWFsIHdheQorCSAqIEBwYXJhbSBsYXQKKwkgKiBAcGFyYW0gbG5nCisJICogQHBhcmFtIHNjYWxlIGlzIHRoZSBzY2FsZSBmYWN0b3IgKGFuZCB0d2ljZSB0aGUgc3RlcCBzaXplKSBmb3IgdGhlIGxhdHRpY2UKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgTGF0TG9uZyBjcmVhdGVQbGF0ZUNhcnJlZVBvbHlnb24oZmluYWwgZG91YmxlIGxhdCwgZG91YmxlIGxuZywgZG91YmxlIHNjYWxlKSB7CisJCWZpbmFsIExhdExvbmcgcmV0VmFsdWUgPSBuZXcgTGF0TG9uZygpOworCQkKKwkJZmluYWwgU2VnbWVudEJ1aWxkZXIgc2IgPSBuZXcgU2VnbWVudEJ1aWxkZXIoKTsKKwkJZG91YmxlIHggPSBsYXQ7CisJCWRvdWJsZSB5ID0gbG5nOworCQlkb3VibGUgc3RlcCA9IHNjYWxlLzIuMDsKKwkJZG91YmxlIHhtaW4gPSB4LXN0ZXA7CisJCWRvdWJsZSB4bWF4ID0geCtzdGVwOworCQlkb3VibGUgeW1pbiA9IHktc3RlcDsKKwkJZG91YmxlIHltYXggPSB5K3N0ZXA7CisJCWlmKHhtaW4gPCAtOTApIHhtaW4gPSAtOTA7CisJCWlmKHhtYXggPiA5MCkgeG1heCA9IDkwOworCQkKKwkJLy8gV2UganVzdCBtYWtlIGEgc3F1YXJlLi4uaW4gbGF0IGxvbmcgc3BhY2UKKwkJc2IuYWRkKHhtaW4sIHltYXgpOworCQlzYi5hZGQoeG1heCwgeW1heCk7CisJCXNiLmFkZCh4bWF4LCB5bWluKTsKKwkJc2IuYWRkKHhtaW4sIHltaW4pOworCQlyZXRWYWx1ZS5hZGQoc2IudG9TZWdtZW50KCkpOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZU5vZGVQb2x5Z29uCisJCisJCisJCisJCisvLwkvKioKKy8vCSAqIEZvciB0ZXN0aW5nCisvLwkgKiBAcGFyYW0gYXJncworLy8JICovCisvLwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisvLwkJTGF0dGljZUdlbmVyYXRvclV0aWxpdHlJbXBsIHNsZ2kgPSBuZXcgTGF0dGljZUdlbmVyYXRvclV0aWxpdHlJbXBsKFNRUl9MQVRUSUNFX1RZUEUpOworLy8JCS8vR3JhcGggZyA9IHNsZ2kuZ2V0R3JhcGgoMTAsIDEwLCAxLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisvLwkJR3JhcGggZyA9IHNsZ2kuZ2V0UGxhdGVDYXJlZUdyYXBoKDEwLCAxMDAuMCwgdHJ1ZSwgZmFsc2UsIHRydWUpOworLy8JCUFjdGl2YXRvci5sb2dJbmZvcm1hdGlvbigiZ3JhcGggYnVpbHQgLi5ub3cgc2F2ZSBpdCIpOworLy8JCQorLy8JCVN0cmluZyBncmFwaFVyaVN0cmluZyA9ICJwbGF0Zm9ybTovcmVzb3VyY2UvcGxheS9ncmFwaHMvdGVzdGluZ0xhdHRpY2VHcmFwaC5ncmFwaCI7CisvLwkJZy5zZXRVUkkoVVJJLmNyZWF0ZVVSSShncmFwaFVyaVN0cmluZykpOworLy8JCVVSSSBvdXRwdXRVUkkgPSBVUkkuY3JlYXRlRmlsZVVSSSgiL1VzZXJzL2poa2F1Zi9Eb2N1bWVudHMvcnVudGltZS1zdGVtTWFjT1MucHJvZHVjdC9wbGF5L2dyYXBocy9zcXJMYXR0aWNlR3JhcGguZ3JhcGgiKTsKKy8vCQkKKy8vCQl0cnkgeworLy8JCQlVdGlsaXR5LnNlcmlhbGl6ZUlkZW50aWZpYWJsZShnLCBvdXRwdXRVUkkpOworLy8JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKy8vCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKy8vCQl9CisvLwkJCisvLwkJCisvLwkJQWN0aXZhdG9yLmxvZ0luZm9ybWF0aW9uKCJkb25lIik7CisvLworLy8JfQorCisJLyoqCisJICogCisJICogQHBhcmFtIGFuZ3VsYXJTdGVwCisJICogQHBhcmFtIGVhcnRoUmFkaXVzCisJICogQHBhcmFtIHVzZU5lYXJlc3ROZWlnaGJvcnMKKwkgKiBAcGFyYW0gdXNlTmV4dE5lYXJlc3ROZWlnaGJvcnMKKwkgKiBAcGFyYW0gcGVyaW9kaWNCb3VuZGFyaWVzCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBHcmFwaCBnZXRQbGF0ZUNhcmVlR3JhcGgoaW50IGFuZ3VsYXJTdGVwLCBkb3VibGUgZWFydGhSYWRpdXMsCisJCQlib29sZWFuIGFkZE5lYXJlc3ROZWlnaGJvcnMsIGJvb2xlYW4gYWRkTmV4dE5lYXJlc3ROZWlnaGJvcnMsCisJCQlib29sZWFuIHBlcmlvZGljQm91bmRhcmllcykgeworCQkKKwkJZmluYWwgR3JhcGggZ3JhcGggPSBHcmFwaEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoKCk7CisJCWZpbmFsIER1YmxpbkNvcmUgZGMgPSBncmFwaC5nZXREdWJsaW5Db3JlKCk7CisJCWRjLnBvcHVsYXRlKCk7CisJCWRjLnNldFRpdGxlKExBVFRJQ0VfVFlQRSk7CisJCWRjLnNldFNvdXJjZSh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKwkJQ2FsZW5kYXIgYyA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIkUgeXl5eS5NTS5kZCAnYXQnIGhoOm1tOnNzIGEgenp6Iik7CisgICAgICAgIFN0cmluZyB2YWxpZCA9IGZvcm1hdHRlci5mb3JtYXQoYy5nZXRUaW1lKCkpOworICAgICAgIAlkYy5zZXRWYWxpZCh2YWxpZCk7CisJCQkJCQkKKyAgICAgICAJaW50IGxhdFNpemUgPSAgKDE4MC9hbmd1bGFyU3RlcCk7CisgICAgCWludCBsbmdTaXplID0gICgzNjAvYW5ndWxhclN0ZXApOworCQkJZmluYWwgTm9kZSBub2RlSG9sZGVyW11bXSA9IG5ldyBOb2RlW2xhdFNpemVdW2xuZ1NpemVdOworCQkJCisJCQkvL2x0bGcgPSBuZXcgZG91YmxlW2xhdFNpemVdW2xuZ1NpemVdWzJdOworCQkJCisJCQkvLyBDcmVhdGUgdGhlIG5vZGVzIGFuZCBwdXQgdGhlbSBpbnRvIHRoZSBncmFwaAorCQkJLy8gd2Ugb2Zmc2V0IHRoZSBjZW50ZXJzIHNvIHRoZSBsaW5lcyBvZiBsb25nL2xhdCBhcmUgcmlnaHQKKwkJCS8vIHRoZXJlIGlzIG5vIG5vZGUgYXQgZWl0aGVyIHBvbGUsIGp1c3Qgc2VnbWVudHMgd3JhcHBpbmcgYXJvdW5kCisJCQlpbnQgb2Zmc2V0ID0gYW5ndWxhclN0ZXAvMjsKKwkJCWludCBsYXQgPSAtOTA7CisJCQlpbnQgbG5nID0gLTE4MDsKKwkJCQorCQkJLy8gZm9yIHRlc3RpbmcKKwkJCWRvdWJsZSB0b3RhbFNwaGVyZVN1cmZhY2VBcmVhID0gMC4wOworCQkJCisJCQlmb3IgKGludCB4ID0gMDsgeCA8IGxhdFNpemU7IHgrKykgeworCQkJCWZvciAoaW50IHkgPSAwOyB5IDwgbG5nU2l6ZTsgeSsrKSB7CisJCQkJCQorCQkJCQlTdHJpbmcgbGF0U1RSID0gIiI7CisJCQkJCVN0cmluZyBsbmdTVFIgPSAiIjsKKwkJCQkJaWYoKGxhdCtvZmZzZXQpPj0wLjApIHsKKwkJCQkJCWxhdFNUUiArPSAobGF0K29mZnNldCkrIk4iOworCQkJCQl9IGVsc2UgeworCQkJCQkJbGF0U1RSICs9IE1hdGguYWJzKGxhdCtvZmZzZXQpKyJTIjsKKwkJCQkJfQorCQkJCQlpZigobG5nK29mZnNldCk+PTAuMCkgeworCQkJCQkJbG5nU1RSICs9IChsbmcrb2Zmc2V0KSsiRSI7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlsbmdTVFIgKz0gTWF0aC5hYnMobG5nK29mZnNldCkrIlciOworCQkJCQl9CisJCQkJCQkKKwkJCQkJZmluYWwgUmVnaW9uIHJlZ2lvbk5vZGUgPSBjcmVhdGVSZWdpb25Ob2RlKFVSSV9HTEJMX1BSRUZJWCwgbGF0U1RSLCBsbmdTVFIsIGdyYXBoKTsKKwkJCQkJCisJCQkJCS8vIHRlc3QKKwkJCQkJLy9sdGxnW3hdW3ldWzBdID0gbGF0K29mZnNldDsKKwkJCQkJLy9sdGxnW3hdW3ldWzFdID0gbG5nK29mZnNldDsKKwkJCQkJCisJCQkJCQorCQkJCQlmaW5hbCBBcmVhTGFiZWwgYXJlYUxhYmVsID0gTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXJlYUxhYmVsKCk7CisJCQkJCWRvdWJsZSBhcmVhID0gZ2V0QXJlYU9uU3BoZXJlKGxhdCtvZmZzZXQsbG5nK29mZnNldCxhbmd1bGFyU3RlcCxlYXJ0aFJhZGl1cyk7CisJCQkJCXRvdGFsU3BoZXJlU3VyZmFjZUFyZWErPSBhcmVhOworCQkJCQlhcmVhTGFiZWwuZ2V0Q3VycmVudEFyZWFWYWx1ZSgpLnNldEFyZWEoYXJlYSk7CisJCQkJCXJlZ2lvbk5vZGUuZ2V0TGFiZWxzKCkuYWRkKGFyZWFMYWJlbCk7CisJCQkKKwkJCQkJbm9kZUhvbGRlclt4XVt5XSA9IHJlZ2lvbk5vZGU7CisJCQkJCWdyYXBoLnB1dE5vZGUocmVnaW9uTm9kZSk7CisJCQkJCQorCQkJCQlsbmcrPSBhbmd1bGFyU3RlcDsKKwkJCQkJCisJCQkJfSAvLyBmb3IgZWFjaCBsbmcKKwkJCQkKKwkJCQlsYXQrPSBhbmd1bGFyU3RlcDsKKwkJCQlsbmcgPSAtMTgwOy8vIHJlc2V0CisJCQl9IC8vIGZvciBlYWNoIGxhdAorCQkJCisJCQkvLyB0ZXN0aW5nCisJCQkvL0FjdGl2YXRvci5sb2dJbmZvcm1hdGlvbigiR290IHRvdGFsIEFSRUEgPSAiK3RvdGFsU3BoZXJlU3VyZmFjZUFyZWErIiAgZWFydGggc2hvdWxkIGJlIDUxMDA3MjAwMCBrbTIiKTsKKwkJCQorCQkJLy8gQWRkIHRoZSBzcGF0aWFsIHBvbHlnb25zIHRvIHRoZSBzcGF0aWFsIGF0dHJpYnV0ZSBvZiBlYWNoIG5vZGUncworCQkJLy8gZHVibGluIGNvcmUgaW5zdGFuY2UgYW5kIGZvciBlYWNoIGVkZ2UuIFRoZSB2YWx1ZSBmb3IgdGhlIG5vZGVzIHdpbGwKKwkJCS8vIGJlIGEgcmVjdGFuZ3VsYXIgYXJlYSBleHByZXNzZWQgYXMgYSBzZXQgb2YgbGF0L2xvbmcgcG9pbnRzIHRoYXQKKwkJCS8vIGxheW91dCBhIHBvbHlnb24uIFRoZSBwb3NpdGlvbiBvZiB0aGUgcG9seWdvbiB3aWxsIGF0IHBvc2l0aW9uIHRoYXQKKwkJCS8vIG1hdGNoZXMgdGhlIHBvc2l0aW9uICh4LCB5KSBvZiB0aGUgbm9kZSBpbiB0aGUgbGF0dGljZS4KKwkJCWFkZFNwYXRpYWxTcGVjaWZpY2F0aW9ucyhub2RlSG9sZGVyLCBhbmd1bGFyU3RlcCwgbGF0U2l6ZSwgbG5nU2l6ZSk7CisJCQkKKworIAkJCS8vIElmIHdlIGFyZSBpbmNsdWRpbmcgTmVhcmVzdCBOZWlnaGJvcnMgKE5OKQorCQkJaWYoYWRkTmVhcmVzdE5laWdoYm9ycykgeworCQkJCS8vQWRkIHRoZSBlZGdlcworCQkJCWZvciAoaW50IHggPSAwOyB4IDwgbGF0U2l6ZTsgeCsrKSB7CisJCQkJCWZvciAoaW50IHkgPSAwOyB5IDwgbG5nU2l6ZTsgeSsrKSB7CisJCQkJCQlpZigoeS0xKT49MCkgeworCQkJCQkJCWNyZWF0ZUVkZ2UoZ3JhcGgsbm9kZUhvbGRlclt4XVt5IC0gMV0sbm9kZUhvbGRlclt4XVt5XSwgYW5ndWxhclN0ZXApOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZihwZXJpb2RpY0JvdW5kYXJpZXMpIHsKKwkJCQkJCQkJY3JlYXRlRWRnZShncmFwaCxub2RlSG9sZGVyW3hdW2xuZ1NpemUgLSAxXSxub2RlSG9sZGVyW3hdW3ldLCBhbmd1bGFyU3RlcCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJCisJCQkJCQlpZigoeC0xKT49MCkgeworCQkJCQkJCWNyZWF0ZUVkZ2UoZ3JhcGgsbm9kZUhvbGRlclt4IC0gMV1beV0sbm9kZUhvbGRlclt4XVt5XSwgYW5ndWxhclN0ZXApOworCQkJCQkJfQorCQkJCQkJLy8gd2UgZG9uJ3Qgd3JhcCBpbiBsYXRpdHVkZSAoeCkgYXMgbm9ydGggcG9sZSBpcyBub3QgY29ubmVjdGVkIHRvIHNvdXRoCisJCQkJCQkKKwkJCQkJfSAvLyBmb3IgZWFjaCB5CisJCQkJfSAvLyBmb3IgZWFjaCB4CisJCQl9Ly8gTk4gZWRnZXMKKworCQkJLy8gSWYgd2UgYXJlIGluY2x1ZGluZyBORVhUIE5lYXJlc3QgTmVpZ2hib3JzIChOTk4pCisJCQkvLyBUT0RPIG5vIG5leHQgbmVhcmVzdCBuZWlnaGJvcnMgZm9yIG5vdworLy8JCQlpZihhZGROZXh0TmVhcmVzdE5laWdoYm9ycykgeworLy8JCQkJZm9yIChpbnQgeCA9IDA7IHggPCB4U2l6ZTsgeCsrKSB7CisvLwkJCQkJZm9yIChpbnQgeSA9IDA7IHkgPCB5U2l6ZTsgeSsrKSB7CisvLwkJCQkJCS8vIHVwcHBlciByaWdodD8KKy8vCQkJCQkJaWYoICgoeCsxKTx4U2l6ZSkgJiYgKCh5KzEpPHlTaXplKSApIHsKKy8vCQkJCQkJCWNyZWF0ZUVkZ2UoZ3JhcGgsbm9kZUhvbGRlclt4XVt5XSxub2RlSG9sZGVyW3grMV1beSsxXSwgY29tbW9uQm9yZGVyTGVuZ3RoKTsKKy8vCQkJCQkJfSBlbHNlIHsKKy8vCQkJCQkJCQlpZihwZXJpb2RpY0JvdW5kYXJpZXMpIHsKKy8vCQkJCQkJCQkJaW50IHgyID0geCsxOworLy8JCQkJCQkJCQlpbnQgeTIgPSB5KzE7CisvLwkJCQkJCQkJCWlmKHgyPj14U2l6ZSkgeDI9MDsKKy8vCQkJCQkJCQkJaWYoeTI+PXlTaXplKSB5Mj0wOworLy8JCQkJCQkJCQljcmVhdGVFZGdlKGdyYXBoLG5vZGVIb2xkZXJbeF1beV0sbm9kZUhvbGRlclt4Ml1beTJdLCBjb21tb25Cb3JkZXJMZW5ndGgpOworLy8JCQkJCQkJCX0KKy8vCQkJCQkJfS8vIHVwcGVyIHJpZ2h0CisvLwkJCQkJCQkKKy8vCQkJCQkJLy8gbG93ZXIgcmlnaHQKKy8vCQkJCQkJaWYoICgoeCsxKTx4U2l6ZSkgJiYgKCh5LTEpPj0wKSApIHsKKy8vCQkJCQkJCWNyZWF0ZUVkZ2UoZ3JhcGgsbm9kZUhvbGRlclt4XVt5XSxub2RlSG9sZGVyW3grMV1beS0xXSwgY29tbW9uQm9yZGVyTGVuZ3RoKTsKKy8vCQkJCQkJfSBlbHNlIHsKKy8vCQkJCQkJCWlmKHBlcmlvZGljQm91bmRhcmllcykgeworLy8JCQkJCQkJCWludCB4MiA9IHgrMTsKKy8vCQkJCQkJCQlpbnQgeTIgPSB5LTE7CisvLwkJCQkJCQkJaWYoeDI+PXhTaXplKSB4Mj0wOworLy8JCQkJCQkJCWlmKHkyIDw9IC0xKSB5Mj15U2l6ZS0xOworLy8JCQkJCQkJCWNyZWF0ZUVkZ2UoZ3JhcGgsbm9kZUhvbGRlclt4XVt5XSxub2RlSG9sZGVyW3gyXVt5Ml0sIGNvbW1vbkJvcmRlckxlbmd0aCk7CisvLwkJCQkJCQl9CisvLwkJCQkJCX0KKy8vCQkJCQkJCisvLwkJCQkJfSAvLyBmb3IgZWFjaCB5CisvLwkJCQl9IC8vIGZvciBlYWNoIHgKKy8vCQkJCQorLy8JCQl9Ly8gTk5OIGVkZ2VzCisKKwkJCWFzc2VydCBncmFwaC5zYW5lKCk7CisKKwkJCS8vdGVzdENvbW1vbkJvcmRlckVkZ2VzKGdyYXBoLCAxMC4wKTsKKwkJCQorCQkJcmV0dXJuIGdyYXBoOworCX0KKwkKKwkvKioKKwkgKiBhcmVhIGVsZW1lbnQgb24gc3BoZXJlIGlzCisJICogZEEgPSAoUl4yKSBzaW4odGhldGEpIGQodGhldGEpIGQocGhpKQorCSAqIG9yCisJICogZEEgPSAoUl4yKSBzaW4obG5nKWQobG5nKWQocGhpKSBhbGwgaW4gcmFkaWFucworCSAqIGludGVncmF0aW5nIHRoaXMgdGhlIGFyZWEgaXMKKwkgKiBBID0gKFJeMilbY29zKG1heExhdCktY29zKG1pbkxhdCldW21heExuZyAtIG1pbkxuZ10KKwkgKiBSIGlzIGNvbnN0YW50IGFzIGlzIFttYXhMbmctbWluTG5nXQorCSAqIEBwYXJhbSBjZW50ZXJMYXQKKwkgKiBAcGFyYW0gY2VudGVyTG5nCisJICogQHBhcmFtIGFuZ3VsYXJTdGVwCisJICogQHBhcmFtIGVhcnRoUmFkaXVzCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0QXJlYU9uU3BoZXJlKGRvdWJsZSBjZW50ZXJMYXQsIGRvdWJsZSBjZW50ZXJMbmcsIGRvdWJsZSBhbmd1bGFyU2l6ZSwgZG91YmxlIHJhZGl1cyl7CisJCWRvdWJsZSBzdGVwID0gYW5ndWxhclNpemUvMi4wOworCQlkb3VibGUgbWluTGF0ID0gKDkwLjArY2VudGVyTGF0IC0gc3RlcCkqREVHUkVFU19UT19SQURJQU5TOyAvLyAwIHRvIHBpCisJCWRvdWJsZSBtYXhMYXQgPSAoOTAuMCtjZW50ZXJMYXQgKyBzdGVwKSpERUdSRUVTX1RPX1JBRElBTlM7IC8vIDAgdG8gcGkKKwkJZG91YmxlIG1pbkxuZyA9IChjZW50ZXJMbmcgLSBzdGVwKSpERUdSRUVTX1RPX1JBRElBTlM7CisJCWRvdWJsZSBtYXhMbmcgPSAoY2VudGVyTG5nICsgc3RlcCkqREVHUkVFU19UT19SQURJQU5TOworCQkKKwkJZmluYWwgZG91YmxlIGRMbmcgPSBNYXRoLmFicyhtYXhMbmcgLSBtaW5MbmcpOworCQlmaW5hbCBkb3VibGUgcjIgPSAgcmFkaXVzKnJhZGl1czsKKwkJZmluYWwgZG91YmxlIGxhdFRlcm0gPSBNYXRoLmNvcyhtYXhMYXQpLU1hdGguY29zKG1pbkxhdCk7CisJCWZpbmFsIGRvdWJsZSBhcmVhID0gcjIqZExuZyooTWF0aC5hYnMobGF0VGVybSkpOworCQkKKwkJcmV0dXJuIGFyZWE7CisJfQorCQorCS8qKgorCSAqIHRlc3QgdGhhdCB0aGUgY29tbW9uIGJvcmRlciBlZGdlcyBhcmUgc2FuZQorCSAqIGxlbmd0aCBzaG91bGQgYmUgPD0gc3FydCgyKSBtYXggbGF0aWNlIGNvbnN0LgorCSAqIEBwYXJhbSBnCisJICogQHBhcmFtIG1heExhdHRpY2VDb25zdGFudAorCSAqLworCXB1YmxpYyBib29sZWFuIHRlc3RDb21tb25Cb3JkZXJFZGdlcyhHcmFwaCBnLCBkb3VibGUgbWF4TGF0dGljZUNvbnN0YW50KSB7CisJCQlkb3VibGUgZG1heCA9IDEuMDEqTWF0aC5zcXJ0KDIuMCkqbWF4TGF0dGljZUNvbnN0YW50OworCQkJRU1hcDxVUkksRWRnZT4gZWRnZU1hcCA9IGcuZ2V0RWRnZXMoKTsKKwkJCUl0ZXJhdG9yPFVSST4gaXRlciA9IGVkZ2VNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJVVJJIGtleSA9IGl0ZXIubmV4dCgpOworCQkJCUVkZ2UgZSA9IGVkZ2VNYXAuZ2V0KGtleSk7CisJCQkJTm9kZSBuQSA9IGUuZ2V0QSgpOworCQkJCU5vZGUgbkIgPSBlLmdldEIoKTsKKwkJCQkKKwkJCQlmaW5hbCBMYXRMb25nUHJvdmlkZXJBZGFwdGVyIGxhdExvbmdQcm92aWRlckEgPSAoTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlcikgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQobkEsIExhdExvbmdQcm92aWRlci5jbGFzcyk7CisJCQkJbGF0TG9uZ1Byb3ZpZGVyQS5zZXRUYXJnZXQobkEpOworCQkJCWRvdWJsZVtdIGFDID0gbGF0TG9uZ1Byb3ZpZGVyQS5nZXRDZW50ZXIoKTsKKwkJCQkKKwkJCQlmaW5hbCBMYXRMb25nUHJvdmlkZXJBZGFwdGVyIGxhdExvbmdQcm92aWRlckIgPSAoTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlcikgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQobkIsIExhdExvbmdQcm92aWRlci5jbGFzcyk7CisJCQkJbGF0TG9uZ1Byb3ZpZGVyQi5zZXRUYXJnZXQobkIpOworCQkJCWRvdWJsZVtdIGJDID0gbGF0TG9uZ1Byb3ZpZGVyQi5nZXRDZW50ZXIoKTsKKwkJCQlkb3VibGUgcjIgPSAoKGFDWzBdLWJDWzBdKSooYUNbMF0tYkNbMF0pKSArICgoYUNbMV0tYkNbMV0pKihhQ1sxXS1iQ1sxXSkpOworCQkJCWRvdWJsZSBkaXN0ID0gTWF0aC5zcXJ0KHIyKTsKKwkJCQorCQkJCWlmKGRpc3QgPiBkbWF4KSB7CisJCQkJCS8vIG9uZSBlcnJvciBpcyBlbm91Z2ggdG8gZmFpbAorCQkJCQlBY3RpdmF0b3IubG9nSW5mb3JtYXRpb24oIkVycm9yIC0gZm91bmQgYm9uZCBsZW5ndGggIitkaXN0KyAiIHhhLHlhPSAiK2FDWzBdKyIsIithQ1sxXSsgIj09IitiQ1swXSsiLCIrYkNbMV0pOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHRydWU7CisJfQorCisKKwkKK30vLyBTcXJMYXR0aWNlR2VuZXJhdG9ySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy9HZW9ncmFwaGljRmVhdHVyZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy9HZW9ncmFwaGljRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1Zjg2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL0dlb2dyYXBoaWNGZWF0dXJlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLy8gR2VvZ3JhcGhpY0ZlYXR1cmUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgYSBHZW9ncmFwaGljIEZlYXR1cmUgbm9kZS4KKyAqIAorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICovCitwdWJsaWMgaW50ZXJmYWNlIEdlb2dyYXBoaWNGZWF0dXJlIGV4dGVuZHMgTm9kZSB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzZWdtZW50IG9mIHRoZSB0eXBlIFVSSSB0aGF0IHByZWZpeGVzIGFsbCBvdGhlciBzZWdtZW50cyBpbiBhCisJICogZ2VvZ3JhcGhpYyBmZWF0dXJlIG5vZGUgdHlwZSBVUkkuCisJICovCisJU3RyaW5nIFVSSV9UWVBFX0dFT0dSQVBISUNfRkVBVFVSRV9OT0RFX1NFR01FTlQgPSBVUklfVFlQRV9OT0RFX1NFR01FTlQKKwkJCSsgIi9nZW8iOworCit9IC8vIEdlb2dyYXBoaWNGZWF0dXJlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL05vZGVzRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy9Ob2Rlc0ZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWU1ZDMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy9Ob2Rlc0ZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuTm9kZXNQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZXNGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgeworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTm9kZXNGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuaW1wbC5Ob2Rlc0ZhY3RvcnlJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVnaW9uPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZWdpb248L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVJlZ2lvbiBjcmVhdGVSZWdpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTm9kZXNQYWNrYWdlIGdldE5vZGVzUGFja2FnZSgpOworCit9IC8vTm9kZXNGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL05vZGVzUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy9Ob2Rlc1BhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzAxZDMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy9Ob2Rlc1BhY2thZ2UuamF2YQpAQCAtMCwwICsxLDMwMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50CisgKiA8dWw+CisgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorICogPC91bD4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLk5vZGVzRmFjdG9yeQorICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZXNQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgeworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOQU1FID0gIm5vZGVzIjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzLmVjb3JlIjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMiOworCisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlOb2Rlc1BhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5pbXBsLk5vZGVzUGFja2FnZUltcGwuaW5pdCgpOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZSA8ZW0+Tm9kZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLmltcGwuTm9kZXNQYWNrYWdlSW1wbCNnZXROb2RlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IE5PREUgPSAyOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLmltcGwuR2VvZ3JhcGhpY0ZlYXR1cmVJbXBsIDxlbT5HZW9ncmFwaGljIEZlYXR1cmU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLmltcGwuR2VvZ3JhcGhpY0ZlYXR1cmVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLmltcGwuTm9kZXNQYWNrYWdlSW1wbCNnZXRHZW9ncmFwaGljRmVhdHVyZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBHRU9HUkFQSElDX0ZFQVRVUkUgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdFT0dSQVBISUNfRkVBVFVSRV9fVVJJID0gR3JhcGhQYWNrYWdlLk5PREVfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdFT0dSQVBISUNfRkVBVFVSRV9fVFlQRV9VUkkgPSBHcmFwaFBhY2thZ2UuTk9ERV9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHRU9HUkFQSElDX0ZFQVRVUkVfX0RVQkxJTl9DT1JFID0gR3JhcGhQYWNrYWdlLk5PREVfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVkZ2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHRU9HUkFQSElDX0ZFQVRVUkVfX0VER0VTID0gR3JhcGhQYWNrYWdlLk5PREVfX0VER0VTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0VPR1JBUEhJQ19GRUFUVVJFX19MQUJFTFMgPSBHcmFwaFBhY2thZ2UuTk9ERV9fTEFCRUxTOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkdlb2dyYXBoaWMgRmVhdHVyZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHRU9HUkFQSElDX0ZFQVRVUkVfRkVBVFVSRV9DT1VOVCA9IEdyYXBoUGFja2FnZS5OT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLmltcGwuUmVnaW9uSW1wbCA8ZW0+UmVnaW9uPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5pbXBsLlJlZ2lvbkltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuaW1wbC5Ob2Rlc1BhY2thZ2VJbXBsI2dldFJlZ2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBSRUdJT04gPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFR0lPTl9fVVJJID0gR0VPR1JBUEhJQ19GRUFUVVJFX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRUdJT05fX1RZUEVfVVJJID0gR0VPR1JBUEhJQ19GRUFUVVJFX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFR0lPTl9fRFVCTElOX0NPUkUgPSBHRU9HUkFQSElDX0ZFQVRVUkVfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVkZ2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRUdJT05fX0VER0VTID0gR0VPR1JBUEhJQ19GRUFUVVJFX19FREdFUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFR0lPTl9fTEFCRUxTID0gR0VPR1JBUEhJQ19GRUFUVVJFX19MQUJFTFM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVnaW9uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFR0lPTl9GRUFUVVJFX0NPVU5UID0gR0VPR1JBUEhJQ19GRUFUVVJFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Tm9kZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBOT0RFX0ZFQVRVUkVfQ09VTlQgPSAwOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5HZW9ncmFwaGljRmVhdHVyZSA8ZW0+R2VvZ3JhcGhpYyBGZWF0dXJlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkdlb2dyYXBoaWMgRmVhdHVyZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuR2VvZ3JhcGhpY0ZlYXR1cmUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEdlb2dyYXBoaWNGZWF0dXJlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLlJlZ2lvbiA8ZW0+UmVnaW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlZ2lvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuUmVnaW9uCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSZWdpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlIDxlbT5Ob2RlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk5vZGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZQorCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldE5vZGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogQGdlbmVyYXRlZAorCSAqLworCU5vZGVzRmFjdG9yeSBnZXROb2Rlc0ZhY3RvcnkoKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKwkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorCSAqIDwvdWw+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCWludGVyZmFjZSBMaXRlcmFscyAgeworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuaW1wbC5HZW9ncmFwaGljRmVhdHVyZUltcGwgPGVtPkdlb2dyYXBoaWMgRmVhdHVyZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuaW1wbC5HZW9ncmFwaGljRmVhdHVyZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLmltcGwuTm9kZXNQYWNrYWdlSW1wbCNnZXRHZW9ncmFwaGljRmVhdHVyZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBHRU9HUkFQSElDX0ZFQVRVUkUgPSBlSU5TVEFOQ0UuZ2V0R2VvZ3JhcGhpY0ZlYXR1cmUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuaW1wbC5SZWdpb25JbXBsIDxlbT5SZWdpb248L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLmltcGwuUmVnaW9uSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuaW1wbC5Ob2Rlc1BhY2thZ2VJbXBsI2dldFJlZ2lvbigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBSRUdJT04gPSBlSU5TVEFOQ0UuZ2V0UmVnaW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZSA8ZW0+Tm9kZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5pbXBsLk5vZGVzUGFja2FnZUltcGwjZ2V0Tm9kZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBOT0RFID0gZUlOU1RBTkNFLmdldE5vZGUoKTsKKworCX0KKworfSAvL05vZGVzUGFja2FnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy9SZWdpb24uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbm9kZXMvUmVnaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkyY2Q2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbm9kZXMvUmVnaW9uLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLy8gUmVnaW9uLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2RlczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgYSBSZWdpb24gbm9kZS4KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVnaW9uIGV4dGVuZHMgR2VvZ3JhcGhpY0ZlYXR1cmUgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VnbWVudCBvZiB0aGUgdHlwZSBVUkkgdGhhdCBwcmVmaXhlcyBhbGwgb3RoZXIgc2VnbWVudHMgaW4gYQorCSAqIGdlb2dyYXBoaWMgZmVhdHVyZSBub2RlIHR5cGUgVVJJLgorCSAqLworCVN0cmluZyBVUklfVFlQRV9SRUdJT05fTk9ERV9TRUdNRU5UID0gVVJJX1RZUEVfR0VPR1JBUEhJQ19GRUFUVVJFX05PREVfU0VHTUVOVAorCQkJKyAiL3JlZ2lvbiI7CisKKwlTdHJpbmcgRFVCTElOX0NPUkVfU1VCSkVDVCA9ICJyZWdpb24iOworCQorfSAvLyBSZWdpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbm9kZXMvaW1wbC9HZW9ncmFwaGljRmVhdHVyZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbm9kZXMvaW1wbC9HZW9ncmFwaGljRmVhdHVyZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWY3ZWNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy9pbXBsL0dlb2dyYXBoaWNGZWF0dXJlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNDggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTm9kZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5HZW9ncmFwaGljRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLk5vZGVzUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdlb2dyYXBoaWMgRmVhdHVyZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEdlb2dyYXBoaWNGZWF0dXJlSW1wbCBleHRlbmRzIE5vZGVJbXBsICBpbXBsZW1lbnRzIEdlb2dyYXBoaWNGZWF0dXJlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgR2VvZ3JhcGhpY0ZlYXR1cmVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gTm9kZXNQYWNrYWdlLkxpdGVyYWxzLkdFT0dSQVBISUNfRkVBVFVSRTsKKwl9CisKK30gLy9HZW9ncmFwaGljRmVhdHVyZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL2ltcGwvTm9kZXNGYWN0b3J5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy9pbXBsL05vZGVzRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGMzZjMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy9pbXBsL05vZGVzRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLk5vZGVzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLk5vZGVzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLlJlZ2lvbjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBOb2Rlc0ZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgTm9kZXNGYWN0b3J5IHsKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBOb2Rlc0ZhY3RvcnkgaW5pdCgpIHsKKwkJdHJ5IHsKKwkJCU5vZGVzRmFjdG9yeSB0aGVOb2Rlc0ZhY3RvcnkgPSAoTm9kZXNGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbm9kZXMuZWNvcmUiKTsgLy8kTk9OLU5MUy0xJCAKKwkJCWlmICh0aGVOb2Rlc0ZhY3RvcnkgIT0gbnVsbCkgeworCQkJCXJldHVybiB0aGVOb2Rlc0ZhY3Rvcnk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXJldHVybiBuZXcgTm9kZXNGYWN0b3J5SW1wbCgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vZGVzRmFjdG9yeUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKKwkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgTm9kZXNQYWNrYWdlLlJFR0lPTjogcmV0dXJuIGNyZWF0ZVJlZ2lvbigpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSZWdpb24gY3JlYXRlUmVnaW9uKCkgeworCQlSZWdpb25JbXBsIHJlZ2lvbiA9IG5ldyBSZWdpb25JbXBsKCk7CisJCXJldHVybiByZWdpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vZGVzUGFja2FnZSBnZXROb2Rlc1BhY2thZ2UoKSB7CisJCXJldHVybiAoTm9kZXNQYWNrYWdlKWdldEVQYWNrYWdlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZGVwcmVjYXRlZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlARGVwcmVjYXRlZAorCXB1YmxpYyBzdGF0aWMgTm9kZXNQYWNrYWdlIGdldFBhY2thZ2UoKSB7CisJCXJldHVybiBOb2Rlc1BhY2thZ2UuZUlOU1RBTkNFOworCX0KKworfSAvL05vZGVzRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbm9kZXMvaW1wbC9Ob2Rlc1BhY2thZ2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL2ltcGwvTm9kZXNQYWNrYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOWFjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL2ltcGwvTm9kZXNQYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjUzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbC5FZGdlc1BhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLkdlb2dyYXBoaWNGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuTm9kZXNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuTm9kZXNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuUmVnaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuVHlwZXNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuaW1wbC5UeXBlc1BhY2thZ2VJbXBsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE5vZGVzUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBOb2Rlc1BhY2thZ2UgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGdlb2dyYXBoaWNGZWF0dXJlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHJlZ2lvbkVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBub2RlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQorCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgorCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKKwkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcworCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCisJICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuTm9kZXNQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBOb2Rlc1BhY2thZ2VJbXBsKCkgeworCQlzdXBlcihlTlNfVVJJLCBOb2Rlc0ZhY3RvcnkuZUlOU1RBTkNFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCisJICogCisJICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBOb2Rlc1BhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIE5vZGVzUGFja2FnZSBpbml0KCkgeworCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoTm9kZXNQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE5vZGVzUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCisJCU5vZGVzUGFja2FnZUltcGwgdGhlTm9kZXNQYWNrYWdlID0gKE5vZGVzUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIE5vZGVzUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgTm9kZXNQYWNrYWdlSW1wbCgpKTsKKworCQlpc0luaXRlZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCisJCUdyYXBoUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCQlNb2RpZmllclBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCQlTY2VuYXJpb1BhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCQlTZXF1ZW5jZXJQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJU29sdmVyUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisKKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKKwkJRWRnZXNQYWNrYWdlSW1wbCB0aGVFZGdlc1BhY2thZ2UgPSAoRWRnZXNQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWRnZXNQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWRnZXNQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVkZ2VzUGFja2FnZS5lTlNfVVJJKSA6IEVkZ2VzUGFja2FnZS5lSU5TVEFOQ0UpOworCQlMYWJlbHNQYWNrYWdlSW1wbCB0aGVMYWJlbHNQYWNrYWdlID0gKExhYmVsc1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShMYWJlbHNQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgTGFiZWxzUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShMYWJlbHNQYWNrYWdlLmVOU19VUkkpIDogTGFiZWxzUGFja2FnZS5lSU5TVEFOQ0UpOworCQlUeXBlc1BhY2thZ2VJbXBsIHRoZVR5cGVzUGFja2FnZSA9IChUeXBlc1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUeXBlc1BhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBUeXBlc1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVHlwZXNQYWNrYWdlLmVOU19VUkkpIDogVHlwZXNQYWNrYWdlLmVJTlNUQU5DRSk7CisKKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKKwkJdGhlTm9kZXNQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVFZGdlc1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUxhYmVsc1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVR5cGVzUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCisJCXRoZU5vZGVzUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUVkZ2VzUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUxhYmVsc1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVUeXBlc1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKwkJdGhlTm9kZXNQYWNrYWdlLmZyZWV6ZSgpOworCisgIAorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KE5vZGVzUGFja2FnZS5lTlNfVVJJLCB0aGVOb2Rlc1BhY2thZ2UpOworCQlyZXR1cm4gdGhlTm9kZXNQYWNrYWdlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0R2VvZ3JhcGhpY0ZlYXR1cmUoKSB7CisJCXJldHVybiBnZW9ncmFwaGljRmVhdHVyZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFJlZ2lvbigpIHsKKwkJcmV0dXJuIHJlZ2lvbkVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldE5vZGUoKSB7CisJCXJldHVybiBub2RlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb2Rlc0ZhY3RvcnkgZ2V0Tm9kZXNGYWN0b3J5KCkgeworCQlyZXR1cm4gKE5vZGVzRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCisJICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOworCQlpc0NyZWF0ZWQgPSB0cnVlOworCisJCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcworCQlnZW9ncmFwaGljRmVhdHVyZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHRU9HUkFQSElDX0ZFQVRVUkUpOworCisJCXJlZ2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRUdJT04pOworCisJCW5vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTk9ERSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOworCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKKwkJc2V0TmFtZShlTkFNRSk7CisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOworCQlzZXROc1VSSShlTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCisJCUdyYXBoUGFja2FnZSB0aGVHcmFwaFBhY2thZ2UgPSAoR3JhcGhQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEdyYXBoUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQlnZW9ncmFwaGljRmVhdHVyZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVHcmFwaFBhY2thZ2UuZ2V0Tm9kZSgpKTsKKwkJcmVnaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R2VvZ3JhcGhpY0ZlYXR1cmUoKSk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKwkJaW5pdEVDbGFzcyhnZW9ncmFwaGljRmVhdHVyZUVDbGFzcywgR2VvZ3JhcGhpY0ZlYXR1cmUuY2xhc3MsICJHZW9ncmFwaGljRmVhdHVyZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhyZWdpb25FQ2xhc3MsIFJlZ2lvbi5jbGFzcywgIlJlZ2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3Mobm9kZUVDbGFzcywgTm9kZS5jbGFzcywgIk5vZGUiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIENyZWF0ZSByZXNvdXJjZQorCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKwl9CisKK30gLy9Ob2Rlc1BhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL2ltcGwvUmVnaW9uSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy9pbXBsL1JlZ2lvbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWI2NmE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy9pbXBsL1JlZ2lvbkltcGwuamF2YQpAQCAtMCwwICsxLDc0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5Ob2Rlc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5SZWdpb247CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlZ2lvbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJlZ2lvbkltcGwgZXh0ZW5kcyBHZW9ncmFwaGljRmVhdHVyZUltcGwgaW1wbGVtZW50cyBSZWdpb24geworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUmVnaW9uSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbm9kZUNvZGUKKwkgKiAgICAgICAgICAgIHRoZSBjb2RlIGZvciB0aGUgcmVnaW9uCisJICogQHJldHVybiB0aGUgVVJJIGZvciBhIHNwZWNpZmljIHJlZ2lvbiBub2RlCisJICovCisJcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlUmVnaW9uTm9kZVVSSShTdHJpbmcgbm9kZUNvZGUpIHsKKwkJZmluYWwgVVJJIHJldFZhbHVlID0gU1RFTVVSSS5jcmVhdGVVUkkoVVJJX1RZUEVfUkVHSU9OX05PREVfU0VHTUVOVAorCQkJCSsgIi8iICsgbm9kZUNvZGUpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVSZWdpb25Ob2RlVVJJCisKKy8vCS8qKgorLy8JICogQHBhcmFtIGFkbWluTGV2ZWwKKy8vCSAqICAgICAgICAgICAgdGhlIGFkbWluaXN0cmF0aW9uIGxldmVsIG9mIHRoZSByZWdpb24KKy8vCSAqIEBwYXJhbSBjb3VudHJ5Q29kZQorLy8JICogICAgICAgICAgICB0aGUgSVNPLTMxNjYtMSBjb2RlIGZvciB0aGUgY291bnRyeSBjb250YWluaW5nIHRoZSByZWdpb24KKy8vCSAqIEBwYXJhbSBub2RlQ29kZQorLy8JICogICAgICAgICAgICB0aGUgY29kZSBmb3IgdGhlIHJlZ2lvbgorLy8JICogQHJldHVybiB0aGUgVVJJIGZvciBhIHNwZWNpZmljIHJlZ2lvbiBub2RlCisvLwkgKi8KKy8vCXB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVJlZ2lvbk5vZGVVUkkoaW50IGFkbWluTGV2ZWwsCisvLwkJCWZpbmFsIFN0cmluZyBjb3VudHJ5Q29kZSwgU3RyaW5nIG5vZGVDb2RlKSB7CisvLwkJZmluYWwgVVJJIHJldFZhbHVlID0gU1RFTVVSSS5jcmVhdGVVUkkoVVJJX1RZUEVfUkVHSU9OX05PREVfU0VHTUVOVAorLy8JCQkJKyAiLyIgKyBjb3VudHJ5Q29kZSArICIvIiArIGFkbWluTGV2ZWwgKyAiLyIgKyBub2RlQ29kZSk7CisvLwkJcmV0dXJuIHJldFZhbHVlOworLy8JfSAvLyBjcmVhdGVSZWdpb25Ob2RlVVJJCisKKwkKKwkJCQkJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gTm9kZXNQYWNrYWdlLkxpdGVyYWxzLlJFR0lPTjsKKwl9CisKK30gLy8gUmVnaW9uSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy9wcmVzZW50YXRpb24vTm9kZXNBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy9wcmVzZW50YXRpb24vTm9kZXNBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYmUzNmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL3ByZXNlbnRhdGlvbi9Ob2Rlc0FjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKQEAgLTAsMCArMSw0MzcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKy8vaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbnRyb2xBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkxvYWRSZXNvdXJjZUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJDb250cmlidXRpb25JdGVtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcm92aWRlci5EZWZpbml0aW9uc0VkaXRQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZvciB0aGUgTm9kZXMgbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTm9kZXNBY3Rpb25CYXJDb250cmlidXRvcgorCWV4dGVuZHMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yCisJaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3JQYXJ0OworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgYWN0aW9uIG9wZW5zIHRoZSBQcm9wZXJ0aWVzIHZpZXcuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElBY3Rpb24gc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uID0KKwkJbmV3IEFjdGlvbihEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbSIpKSAvLyROT04tTkxTLTEkCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCXRyeSB7CisJCQkJCWdldFBhZ2UoKS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgYWN0aW9uIHJlZnJlc2hlcyB0aGUgdmlld2VyIG9mIHRoZSBjdXJyZW50IGVkaXRvciBpZiB0aGUgZWRpdG9yCisJICogaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUFjdGlvbiByZWZyZXNoVmlld2VyQWN0aW9uID0KKwkJbmV3IEFjdGlvbihEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0iKSkgLy8kTk9OLU5MUy0xJAorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKwkJCQlyZXR1cm4gYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcjsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJaWYgKGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKKwkJCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldFZpZXdlcigpOworCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKKwkJCQkJCXZpZXdlci5yZWZyZXNoKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gY29ycmVzcG9uZGluZyB0byBlYWNoIGRlc2NyaXB0b3IKKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBjcmVhdGVDaGlsZEFjdGlvbnM7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZUNoaWxkIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyB3aWxsIGNvbnRhaW4gb25lIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gY29ycmVzcG9uZGluZyB0byBlYWNoIGRlc2NyaXB0b3IKKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBjcmVhdGVTaWJsaW5nQWN0aW9uczsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCBmb3IgQ3JlYXRlU2libGluZyBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBjb250cmlidXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm9kZXNBY3Rpb25CYXJDb250cmlidXRvcigpIHsKKwkJc3VwZXIoQURESVRJT05TX0xBU1RfU1RZTEUpOworCQlsb2FkUmVzb3VyY2VBY3Rpb24gPSBuZXcgTG9hZFJlc291cmNlQWN0aW9uKCk7CisJCXZhbGlkYXRlQWN0aW9uID0gbmV3IFZhbGlkYXRlQWN0aW9uKCk7CisJCWNvbnRyb2xBY3Rpb24gPSBuZXcgQ29udHJvbEFjdGlvbigpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBTZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zIHRvIHRoZSB0b29sIGJhci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgeworCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigibm9kZXMtc2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoIm5vZGVzLWFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB0byB0aGUgbWVudSBiYXIgYSBtZW51IGFuZCBzb21lIHNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMsCisJICogYXMgd2VsbCBhcyB0aGUgc3ViLW1lbnVzIGZvciBvYmplY3QgY3JlYXRpb24gaXRlbXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51TWFuYWdlcik7CisKKwkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKERlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Ob2Rlc0VkaXRvcl9tZW51IiksICJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzTWVudUlEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlQ2hpbGQgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgorCQkvLworCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKERlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIFByZXBhcmUgZm9yIENyZWF0ZVNpYmxpbmcgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgorCQkvLworCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEZvcmNlIGFuIHVwZGF0ZSBiZWNhdXNlIEVjbGlwc2UgaGlkZXMgZW1wdHkgbWVudXMgbm93LgorCQkvLworCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIKKwkJCShuZXcgSU1lbnVMaXN0ZW5lcigpIHsKKwkJCQkgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQkJCQkgbWVudU1hbmFnZXIudXBkYXRlQWxsKHRydWUpOworCQkJCSB9CisJCQkgfSk7CisKKwkJYWRkR2xvYmFsQWN0aW9ucyhzdWJtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogV2hlbiB0aGUgYWN0aXZlIGVkaXRvciBjaGFuZ2VzLCB0aGlzIHJlbWVtYmVycyB0aGUgY2hhbmdlIGFuZCByZWdpc3RlcnMgd2l0aCBpdCBhcyBhIHNlbGVjdGlvbiBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkgeworCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IocGFydCk7CisJCWFjdGl2ZUVkaXRvclBhcnQgPSBwYXJ0OworCisJCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KKwkJLy8KKwkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKwkJfQorCQlpZiAocGFydCA9PSBudWxsKSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7CisJCX0KKwkJZWxzZSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7CisJCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisKKwkJCS8vIEZha2UgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCB0byB1cGRhdGUgdGhlIG1lbnVzLgorCQkJLy8KKwkJCWlmIChzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSAhPSBudWxsKSB7CisJCQkJc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNlbGVjdGlvblByb3ZpZGVyLCBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LAorCSAqIGhhbmRsaW5nIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH1zIGJ5IHF1ZXJ5aW5nIGZvciB0aGUgY2hpbGRyZW4gYW5kIHNpYmxpbmdzCisJICogdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGVkIG9iamVjdCBhbmQgdXBkYXRpbmcgdGhlIG1lbnVzIGFjY29yZGluZ2x5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCS8vIFJlbW92ZSBhbnkgbWVudSBpdGVtcyBmb3Igb2xkIHNlbGVjdGlvbi4KKwkJLy8KKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMpOworCQl9CisKKwkJLy8gUXVlcnkgdGhlIG5ldyBzZWxlY3Rpb24gZm9yIGFwcHJvcHJpYXRlIG5ldyBjaGlsZC9zaWJsaW5nIGRlc2NyaXB0b3JzCisJCS8vCisJCUNvbGxlY3Rpb248Pz4gbmV3Q2hpbGREZXNjcmlwdG9ycyA9IG51bGw7CisJCUNvbGxlY3Rpb248Pz4gbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gbnVsbDsKKworCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOworCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnNpemUoKSA9PSAxKSB7CisJCQlPYmplY3Qgb2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOworCisJCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7CisKKwkJCW5ld0NoaWxkRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhvYmplY3QsIG51bGwpOworCQkJbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobnVsbCwgb2JqZWN0KTsKKwkJfQorCisJCS8vIEdlbmVyYXRlIGFjdGlvbnMgZm9yIHNlbGVjdGlvbjsgcG9wdWxhdGUgYW5kIHJlZHJhdyB0aGUgbWVudXMuCisJCS8vCisJCWNyZWF0ZUNoaWxkQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKG5ld0NoaWxkRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7CisJCWNyZWF0ZVNpYmxpbmdBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhuZXdTaWJsaW5nRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7CisKKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7CisJCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKKwkJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7CisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7CisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlQ2hpbGRBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCisJLyoqCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgeworCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVTaWJsaW5nQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwgZGVzY3JpcHRvcikpOworCQkJfQorCQl9CisJCXJldHVybiBhY3Rpb25zOworCX0KKworCS8qKgorCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gd2l0aCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cworCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sCisJICogYnkgaW5zZXJ0aW5nIHRoZW0gYmVmb3JlIHRoZSBzcGVjaWZpZWQgY29udHJpYnV0aW9uIGl0ZW0gPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+LgorCSAqIElmIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgc2ltcGx5IGFkZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zLCBTdHJpbmcgY29udHJpYnV0aW9uSUQpIHsKKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChJQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMpIHsKKwkJCQlpZiAoY29udHJpYnV0aW9uSUQgIT0gbnVsbCkgeworCQkJCQltYW5hZ2VyLmluc2VydEJlZm9yZShjb250cmlidXRpb25JRCwgYWN0aW9uKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCW1hbmFnZXIuYWRkKGFjdGlvbik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQkKKwkvKioKKwkgKiBUaGlzIHJlbW92ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cworCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucykgeworCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7CisJCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgeworCQkJCS8vIExvb2sgaW50byBTdWJDb250cmlidXRpb25JdGVtcworCQkJCS8vCisJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uSXRlbSA9IGl0ZW1zW2ldOworCQkJCXdoaWxlIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCQljb250cmlidXRpb25JdGVtID0gKChTdWJDb250cmlidXRpb25JdGVtKWNvbnRyaWJ1dGlvbkl0ZW0pLmdldElubmVySXRlbSgpOworCQkJCX0KKworCQkJCS8vIERlbGV0ZSB0aGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbXMgd2l0aCBtYXRjaGluZyBhY3Rpb24uCisJCQkJLy8KKwkJCQlpZiAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKKwkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0QWN0aW9uKCk7CisJCQkJCWlmIChhY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsKKwkJCQkJCW1hbmFnZXIucmVtb3ZlKGNvbnRyaWJ1dGlvbkl0ZW0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHBvcC11cCBtZW51IGJlZm9yZSBpdCBhcHBlYXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKKwkJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBudWxsOworCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKERlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOworCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7CisJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZWRpdCIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgaW5zZXJ0cyBnbG9iYWwgYWN0aW9ucyBiZWZvcmUgdGhlICJhZGRpdGlvbnMtZW5kIiBzZXBhcmF0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucy1lbmQiLCBuZXcgU2VwYXJhdG9yKCJ1aS1hY3Rpb25zIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24pOyAvLyROT04tTkxTLTEkCisKKwkJcmVmcmVzaFZpZXdlckFjdGlvbi5zZXRFbmFibGVkKHJlZnJlc2hWaWV3ZXJBY3Rpb24uaXNFbmFibGVkKCkpOwkJCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgcmVmcmVzaFZpZXdlckFjdGlvbik7IC8vJE5PTi1OTFMtMSQKKworCQlzdXBlci5hZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGVuc3VyZXMgdGhhdCBhIGRlbGV0ZSBhY3Rpb24gd2lsbCBjbGVhbiB1cCBhbGwgcmVmZXJlbmNlcyB0byBkZWxldGVkIG9iamVjdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlQWxsUmVmZXJlbmNlc09uRGVsZXRlKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbm9kZXMvcHJlc2VudGF0aW9uL05vZGVzRWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL3ByZXNlbnRhdGlvbi9Ob2Rlc0VkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNWI1ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL3ByZXNlbnRhdGlvbi9Ob2Rlc0VkaXRvci5qYXZhCkBAIC0wLDAgKzEsMTU1OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNhdmVBc0RpYWxvZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldFBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlZpZXdlclBhbmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLmVkaXRvci5Qcm9ibGVtRWRpdG9yUGFydDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVmFsaWRhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlJdGVtRGVsZWdhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5jZWxsZWRpdG9yLkFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkxvY2FsVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLlZpZXdlckRyYWdBZGFwdGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuVW53cmFwcGluZ1NlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJTWFya2VySGVscGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnZpZXcuRXh0ZW5kZWRQcm9wZXJ0eVNoZWV0UGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMucHJvdmlkZXIuTm9kZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcm92aWRlci5Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByb3ZpZGVyLk1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLnByb3ZpZGVyLlNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5wcm92aWRlci5TZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLnByb3ZpZGVyLlNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXIuRGVmaW5pdGlvbnNFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXIuRWRnZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlci5MYWJlbHNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMucHJvdmlkZXIuVHlwZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKKworCisvKioKKyAqIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIE5vZGVzIG1vZGVsIGVkaXRvci4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE5vZGVzRWRpdG9yCisJZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0CisJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpblByb3ZpZGVyLCBJU2VsZWN0aW9uUHJvdmlkZXIsIElNZW51TGlzdGVuZXIsIElWaWV3ZXJQcm92aWRlciwgSUdvdG9NYXJrZXIgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGVkaXRpbmcgZG9tYWluIHRoYXQgaXMgdXNlZCB0byB0cmFjayBhbGwgY2hhbmdlcyB0byB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgb25lIGFkYXB0ZXIgZmFjdG9yeSB1c2VkIGZvciBwcm92aWRpbmcgdmlld3Mgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElDb250ZW50T3V0bGluZVBhZ2UgY29udGVudE91dGxpbmVQYWdlOworCisJLyoqCisJICogVGhpcyBpcyBhIGtsdWRnZS4uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlJ3Mgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmVlVmlld2VyIGNvbnRlbnRPdXRsaW5lVmlld2VyOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgcHJvcGVydHkgc2hlZXQgcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB2aWV3ZXIgdGhhdCBzaGFkb3dzIHRoZSBzZWxlY3Rpb24gaW4gdGhlIGNvbnRlbnQgb3V0bGluZS4KKwkgKiBUaGUgcGFyZW50IHJlbGF0aW9uIG11c3QgYmUgY29ycmVjdGx5IGRlZmluZWQgZm9yIHRoaXMgdG8gd29yay4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBzZWxlY3Rpb25WaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgY29udGVudCB2aWV3ZXIsIHdoaWNoIG1heSBiZSBlaXRoZXIgb25lIG9mIHRoZSB2aWV3ZXJzIGluIHRoZSBwYWdlcyBvciB0aGUgY29udGVudCBvdXRsaW5lIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVmlld2VyIGN1cnJlbnRWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgdG8gd2hpY2ggZXZlciB2aWV3ZXIgaXMgYWN0aXZlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfXMgdGhhdCBhcmUgbGlzdGVuaW5nIHRvIHRoaXMgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+KCk7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGVkaXRvciBhcyBhIHdob2xlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uIGVkaXRvclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7CisKKwkvKioKKwkgKiBUaGUgTWFya2VySGVscGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB3b3Jrc3BhY2UgcmVzb3VyY2UgbWFya2VycyBwcmVzZW50ZWQKKwkgKiBpbiBFY2xpcHNlJ3MgUHJvYmxlbXMgVmlldy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFya2VySGVscGVyIG1hcmtlckhlbHBlciA9IG5ldyBFZGl0VUlNYXJrZXJIZWxwZXIoKTsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyBmb3Igd2hlbiB0aGUgb3V0bGluZSBiZWNvbWVzIGFjdGl2ZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9CisJCW5ldyBJUGFydExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJaWYgKHAgaW5zdGFuY2VvZiBDb250ZW50T3V0bGluZSkgeworCQkJCQlpZiAoKChDb250ZW50T3V0bGluZSlwKS5nZXRDdXJyZW50UGFnZSgpID09IGNvbnRlbnRPdXRsaW5lUGFnZSkgeworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoTm9kZXNFZGl0b3IudGhpcyk7CisKKwkJCQkJCXNldEN1cnJlbnRWaWV3ZXIoY29udGVudE91dGxpbmVWaWV3ZXIpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHAgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSB7CisJCQkJCWlmICgoKFByb3BlcnR5U2hlZXQpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBwcm9wZXJ0eVNoZWV0UGFnZSkgeworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoTm9kZXNFZGl0b3IudGhpcyk7CisJCQkJCQloYW5kbGVBY3RpdmF0ZSgpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHAgPT0gTm9kZXNFZGl0b3IudGhpcykgeworCQkJCQloYW5kbGVBY3RpdmF0ZSgpOworCQkJCX0KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQl9OworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkIHNpbmNlIGxhc3QgYWN0aXZhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gc2F2ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHNhdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIE1hcCB0byBzdG9yZSB0aGUgZGlhZ25vc3RpYyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwPFJlc291cmNlLCBEaWFnbm9zdGljPiByZXNvdXJjZVRvRGlhZ25vc3RpY01hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFJlc291cmNlLCBEaWFnbm9zdGljPigpOworCisJLyoqCisJICogQ29udHJvbHMgd2hldGhlciB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHNob3VsZCBiZSB1cGRhdGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKworCS8qKgorCSAqIEFkYXB0ZXIgdXNlZCB0byB1cGRhdGUgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiB3aGVuIHJlc291cmNlcyBhcmUgZGVtYW5kZWQgbG9hZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBFQ29udGVudEFkYXB0ZXIgcHJvYmxlbUluZGljYXRpb25BZGFwdGVyID0gCisJCW5ldyBFQ29udGVudEFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisJCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZXNvdXJjZS5jbGFzcykpIHsKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRDoKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0VSUk9SUzoKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX1dBUk5JTkdTOiB7CisJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2Upbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7CisJCQkJCQkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIG51bGwpOworCQkJCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGRpYWdub3N0aWMpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucmVtb3ZlKHJlc291cmNlKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAodXBkYXRlUHJvYmxlbUluZGljYXRpb24pIHsKKwkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkJCQkJCQkgfQorCQkJCQkJCQkJIH0pOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCQkJCX0KKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7CisJCQkJYmFzaWNTZXRUYXJnZXQodGFyZ2V0KTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCB1bnNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsKKwkJCQliYXNpY1Vuc2V0VGFyZ2V0KHRhcmdldCk7CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdvcmtzcGFjZSBjaGFuZ2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0KKwkJbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOworCQkJCXRyeSB7CisJCQkJCWNsYXNzIFJlc291cmNlRGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKKwkJCQkJCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKwkJCQkJCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKKwkJCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIHx8CisJCQkJCQkJCSAgICBkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiBkZWx0YS5nZXRGbGFncygpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMpIHsKKwkJCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZGVsdGEuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKSwgZmFsc2UpOworCQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKKwkJCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKKwkJCQkJCQkJCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQllbHNlIGlmICghc2F2ZWRSZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlKSkgeworCQkJCQkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQl9CisKKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgeworCQkJCQkJCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOworCQkJCQkJfQorCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsKKwkJCQkJCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlczsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWZpbmFsIFJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsKKwkJCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOworCisJCQkJCWlmICghdmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCSByZW1vdmVkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKSk7CisJCQkJCQkJCQkgaWYgKCFpc0RpcnR5KCkpIHsKKwkJCQkJCQkJCQkgZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihOb2Rlc0VkaXRvci50aGlzLCBmYWxzZSk7CisJCQkJCQkJCQkgfQorCQkJCQkJCQkgfQorCQkJCQkJCSB9KTsKKwkJCQkJfQorCisJCQkJCWlmICghdmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCSBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7CisJCQkJCQkJCQkgaWYgKGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gTm9kZXNFZGl0b3IudGhpcykgeworCQkJCQkJCQkJCSBoYW5kbGVBY3RpdmF0ZSgpOworCQkJCQkJCQkJIH0KKwkJCQkJCQkJIH0KKwkJCQkJCQkgfSk7CisJCQkJCX0KKwkJCQl9CisJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCURlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBIYW5kbGVzIGFjdGl2YXRpb24gb2YgdGhlIGVkaXRvciBvciBpdCdzIGFzc29jaWF0ZWQgdmlld3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoKSB7CisJCS8vIFJlY29tcHV0ZSB0aGUgcmVhZCBvbmx5IHN0YXRlLgorCQkvLworCQlpZiAoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKSAhPSBudWxsKSB7CisJCSAgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKS5jbGVhcigpOworCisJCSAgLy8gUmVmcmVzaCBhbnkgYWN0aW9ucyB0aGF0IG1heSBiZWNvbWUgZW5hYmxlZCBvciBkaXNhYmxlZC4KKwkJICAvLworCQkgIHNldFNlbGVjdGlvbihnZXRTZWxlY3Rpb24oKSk7CisJCX0KKworCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7CisJCQlpZiAoaGFuZGxlRGlydHlDb25mbGljdCgpKSB7CisJCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihOb2Rlc0VkaXRvci50aGlzLCBmYWxzZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZW1vdmVkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOworCQkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7CisJCQljaGFuZ2VkUmVzb3VyY2VzLnJlbW92ZUFsbChzYXZlZFJlc291cmNlcyk7CisJCQloYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCk7CisJCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOworCQl9CisJfQorCisJLyoqCisJICogSGFuZGxlcyB3aGF0IHRvIGRvIHdpdGggY2hhbmdlZCByZXNvdXJjZXMgb24gYWN0aXZhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCkgeworCQlpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpICYmICghaXNEaXJ0eSgpIHx8IGhhbmRsZURpcnR5Q29uZmxpY3QoKSkpIHsKKwkJCWlmIChpc0RpcnR5KCkpIHsKKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpOworCQkJfQorCQkJZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOworCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOworCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGNoYW5nZWRSZXNvdXJjZXMpIHsKKwkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgeworCQkJCQlyZXNvdXJjZS51bmxvYWQoKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKKwkJCQkJfQorCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQlpZiAoIXJlc291cmNlVG9EaWFnbm9zdGljTWFwLmNvbnRhaW5zS2V5KHJlc291cmNlKSkgeworCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluLmlzU3RhbGUoZWRpdG9yU2VsZWN0aW9uKSkgeworCQkJCXNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKKwkJCX0KKworCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOworCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJfQorCX0KKyAgCisJLyoqCisJICogVXBkYXRlcyB0aGUgcHJvYmxlbXMgaW5kaWNhdGlvbiB3aXRoIHRoZSBpbmZvcm1hdGlvbiBkZXNjcmliZWQgaW4gdGhlIHNwZWNpZmllZCBkaWFnbm9zdGljLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCkgeworCQlpZiAodXBkYXRlUHJvYmxlbUluZGljYXRpb24pIHsKKwkJCUJhc2ljRGlhZ25vc3RpYyBkaWFnbm9zdGljID0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLk9LLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgbnVsbCwKKwkJCQkJIG5ldyBPYmplY3QgW10geyBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkgfSk7CisJCQlmb3IgKERpYWdub3N0aWMgY2hpbGREaWFnbm9zdGljIDogcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAudmFsdWVzKCkpIHsKKwkJCQlpZiAoY2hpbGREaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQlkaWFnbm9zdGljLmFkZChjaGlsZERpYWdub3N0aWMpOworCQkJCX0KKwkJCX0KKworCQkJaW50IGxhc3RFZGl0b3JQYWdlID0gZ2V0UGFnZUNvdW50KCkgLSAxOworCQkJaWYgKGxhc3RFZGl0b3JQYWdlID49IDAgJiYgZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSBpbnN0YW5jZW9mIFByb2JsZW1FZGl0b3JQYXJ0KSB7CisJCQkJKChQcm9ibGVtRWRpdG9yUGFydClnZXRFZGl0b3IobGFzdEVkaXRvclBhZ2UpKS5zZXREaWFnbm9zdGljKGRpYWdub3N0aWMpOworCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQlzZXRBY3RpdmVQYWdlKGxhc3RFZGl0b3JQYWdlKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCVByb2JsZW1FZGl0b3JQYXJ0IHByb2JsZW1FZGl0b3JQYXJ0ID0gbmV3IFByb2JsZW1FZGl0b3JQYXJ0KCk7CisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsKKwkJCQlwcm9ibGVtRWRpdG9yUGFydC5zZXRNYXJrZXJIZWxwZXIobWFya2VySGVscGVyKTsKKwkJCQl0cnkgeworCQkJCQlhZGRQYWdlKCsrbGFzdEVkaXRvclBhZ2UsIHByb2JsZW1FZGl0b3JQYXJ0LCBnZXRFZGl0b3JJbnB1dCgpKTsKKwkJCQkJc2V0UGFnZVRleHQobGFzdEVkaXRvclBhZ2UsIHByb2JsZW1FZGl0b3JQYXJ0LmdldFBhcnROYW1lKCkpOworCQkJCQlzZXRBY3RpdmVQYWdlKGxhc3RFZGl0b3JQYWdlKTsKKwkJCQkJc2hvd1RhYnMoKTsKKwkJCQl9CisJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfQorCisJCQlpZiAobWFya2VySGVscGVyLmhhc01hcmtlcnMoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKSkgeworCQkJCW1hcmtlckhlbHBlci5kZWxldGVNYXJrZXJzKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCXRyeSB7CisJCQkJCQltYXJrZXJIZWxwZXIuY3JlYXRlTWFya2VycyhkaWFnbm9zdGljKTsKKwkJCQkJfQorCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCURlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFNob3dzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsKKwkJcmV0dXJuCisJCQlNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbgorCQkJCShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRmlsZUNvbmZsaWN0X2xhYmVsIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfV0FSTl9GaWxlQ29uZmxpY3QiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBtb2RlbCBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vZGVzRWRpdG9yKCkgeworCQlzdXBlcigpOworCQlpbml0aWFsaXplRWRpdGluZ0RvbWFpbigpOworCX0KKworCS8qKgorCSAqIFRoaXMgc2V0cyB1cCB0aGUgZWRpdGluZyBkb21haW4gZm9yIHRoZSBtb2RlbCBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKSB7CisJCS8vIENyZWF0ZSBhbiBhZGFwdGVyIGZhY3RvcnkgdGhhdCB5aWVsZHMgaXRlbSBwcm92aWRlcnMuCisJCS8vCisJCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5EZXNjcmlwdG9yLlJlZ2lzdHJ5LklOU1RBTkNFKTsKKworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEVkZ2VzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBMYWJlbHNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE5vZGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBUeXBlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IENvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RpZmllckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNlcXVlbmNlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU29sdmVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlIGV4ZWN1dGVkLgorCQkvLworCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKKworCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLgorCQkvLworCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIKKwkJCShuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7CisJCQkJIHB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsKKwkJCQkJIGdldENvbnRhaW5lcigpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCSAobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCSAgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkgIGZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKKworCQkJCQkJCQkgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuCisJCQkJCQkJCSAgLy8KKwkJCQkJCQkJICBDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spZXZlbnQuZ2V0U291cmNlKCkpLmdldE1vc3RSZWNlbnRDb21tYW5kKCk7CisJCQkJCQkJCSAgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKKwkJCQkJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOworCQkJCQkJCQkgIH0KKwkJCQkJCQkJICBpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCAmJiAhcHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgeworCQkJCQkJCQkJICBwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7CisJCQkJCQkJCSAgfQorCQkJCQkJCSAgfQorCQkJCQkJICB9KTsKKwkJCQkgfQorCQkJIH0pOworCisJCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KKwkJLy8KKwkJZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywgbmV3IEhhc2hNYXA8UmVzb3VyY2UsIEJvb2xlYW4+KCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgaGVyZSBmb3IgdGhlIGxpc3RlbmVyIHRvIGJlIGFibGUgdG8gY2FsbCBpdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoaW50IGFjdGlvbikgeworCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UoYWN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdGhlIHNlbGVjdGlvbiBpbnRvIHdoaWNoZXZlciB2aWV3ZXIgaXMgYWN0aXZlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgeworCQlmaW5hbCBDb2xsZWN0aW9uPD8+IHRoZVNlbGVjdGlvbiA9IGNvbGxlY3Rpb247CisJCS8vIE1ha2Ugc3VyZSBpdCdzIG9rYXkuCisJCS8vCisJCWlmICh0aGVTZWxlY3Rpb24gIT0gbnVsbCAmJiAhdGhlU2VsZWN0aW9uLmlzRW1wdHkoKSkgeworCQkJUnVubmFibGUgcnVubmFibGUgPQorCQkJCW5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgY29udGVudCB2aWV3ZXIgb2YgdGhlIGVkaXRvci4KKwkJCQkJCS8vCisJCQkJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7CisJCQkJCQkJY3VycmVudFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhlU2VsZWN0aW9uLnRvQXJyYXkoKSksIHRydWUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfTsKKwkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMocnVubmFibGUpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBlZGl0aW5nIGRvbWFpbiBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElFZGl0aW5nRG9tYWluUHJvdmlkZXJ9IGludGVyZmFjZS4KKwkgKiBUaGlzIGlzIGltcG9ydGFudCBmb3IgaW1wbGVtZW50aW5nIHRoZSBzdGF0aWMgbWV0aG9kcyBvZiB7QGxpbmsgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWlufQorCSAqIGFuZCBmb3Igc3VwcG9ydGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb259LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7CisJCXJldHVybiBlZGl0aW5nRG9tYWluOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBjbGFzcyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciB7CisJCXB1YmxpYyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0IFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIHBhcmVudCAhPSBudWxsOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBtYWtlcyBzdXJlIHRoYXQgb25lIGNvbnRlbnQgdmlld2VyLCBlaXRoZXIgZm9yIHRoZSBjdXJyZW50IHBhZ2Ugb3IgdGhlIG91dGxpbmUgdmlldywgaWYgaXQgaGFzIGZvY3VzLAorCSAqIGlzIHRoZSBjdXJyZW50IG9uZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vmlld2VyKFZpZXdlciB2aWV3ZXIpIHsKKwkJLy8gSWYgaXQgaXMgY2hhbmdpbmcuLi4KKwkJLy8KKwkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gdmlld2VyKSB7CisJCQlpZiAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsKKwkJCQkvLyBDcmVhdGUgdGhlIGxpc3RlbmVyIG9uIGRlbWFuZC4KKwkJCQkvLworCQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9CisJCQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJCQkJLy8gVGhpcyBqdXN0IG5vdGlmaWVzIHRob3NlIHRoaW5ncyB0aGF0IGFyZSBhZmZlY3RlZCBieSB0aGUgc2VjdGlvbi4KKwkJCQkJCS8vCisJCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBzZWxlY3Rpb25DaGFuZ2VkRXZlbnQpIHsKKwkJCQkJCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCX0KKworCQkJLy8gU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG9sZCBvbmUuCisJCQkvLworCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgeworCQkJCWN1cnJlbnRWaWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7CisJCQl9CisKKwkJCS8vIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmV3IG9uZS4KKwkJCS8vCisJCQlpZiAodmlld2VyICE9IG51bGwpIHsKKwkJCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7CisJCQl9CisKKwkJCS8vIFJlbWVtYmVyIGl0LgorCQkJLy8KKwkJCWN1cnJlbnRWaWV3ZXIgPSB2aWV3ZXI7CisKKwkJCS8vIFNldCB0aGUgZWRpdG9ycyBzZWxlY3Rpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgdmlld2VyJ3Mgc2VsZWN0aW9uLgorCQkJLy8KKwkJCXNldFNlbGVjdGlvbihjdXJyZW50Vmlld2VyID09IG51bGwgPyBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZIDogY3VycmVudFZpZXdlci5nZXRTZWxlY3Rpb24oKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHZpZXdlciBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElWaWV3ZXJQcm92aWRlcn0gaW50ZXJmYWNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgeworCQlyZXR1cm4gY3VycmVudFZpZXdlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIgYW5kIGFkZHMgYSBsaXN0ZW5lciBhcyB3ZWxsIHJlZ2lzdGVyaW5nIHRoZSBtZW51IGZvciBleHRlbnNpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKKwkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOworCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7CisJCU1lbnUgbWVudT0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7CisJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKKwkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUsIG5ldyBVbndyYXBwaW5nU2VsZWN0aW9uUHJvdmlkZXIodmlld2VyKSk7CisKKwkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTks7CisJCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKKwkJdmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyYWdBZGFwdGVyKHZpZXdlcikpOworCQl2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyKGVkaXRpbmdEb21haW4sIHZpZXdlcikpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCBjYWxsZWQgdG8gbG9hZCBhIHJlc291cmNlIGludG8gdGhlIGVkaXRpbmcgZG9tYWluJ3MgcmVzb3VyY2Ugc2V0IGJhc2VkIG9uIHRoZSBlZGl0b3IncyBpbnB1dC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVNb2RlbCgpIHsKKwkJVVJJIHJlc291cmNlVVJJID0gRWRpdFVJVXRpbC5nZXRVUkkoZ2V0RWRpdG9ySW5wdXQoKSk7CisJCUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7CisJCXRyeSB7CisJCQkvLyBMb2FkIHRoZSByZXNvdXJjZSB0aHJvdWdoIHRoZSBlZGl0aW5nIGRvbWFpbi4KKwkJCS8vCisJCQlyZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgdHJ1ZSk7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlleGNlcHRpb24gPSBlOworCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIGZhbHNlKTsKKwkJfQorCisJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pOworCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJfQorCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkuYWRkKHByb2JsZW1JbmRpY2F0aW9uQWRhcHRlcik7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIGRpYWdub3N0aWMgZGVzY3JpYmluZyB0aGUgZXJyb3JzIGFuZCB3YXJuaW5ncyBsaXN0ZWQgaW4gdGhlIHJlc291cmNlCisJICogYW5kIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIChpZiBhbnkpLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEaWFnbm9zdGljIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKFJlc291cmNlIHJlc291cmNlLCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCWlmICghcmVzb3VyY2UuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpIHx8ICFyZXNvdXJjZS5nZXRXYXJuaW5ncygpLmlzRW1wdHkoKSkgeworCQkJQmFzaWNEaWFnbm9zdGljIGJhc2ljRGlhZ25vc3RpYyA9CisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkgMCwKKwkJCQkJIGdldFN0cmluZygiX1VJX0NyZWF0ZU1vZGVsRXJyb3JfbWVzc2FnZSIsIHJlc291cmNlLmdldFVSSSgpKSwgLy8kTk9OLU5MUy0xJAorCQkJCQkgbmV3IE9iamVjdCBbXSB7IGV4Y2VwdGlvbiA9PSBudWxsID8gKE9iamVjdClyZXNvdXJjZSA6IGV4Y2VwdGlvbiB9KTsKKwkJCWJhc2ljRGlhZ25vc3RpYy5tZXJnZShFY29yZVV0aWwuY29tcHV0ZURpYWdub3N0aWMocmVzb3VyY2UsIHRydWUpKTsKKwkJCXJldHVybiBiYXNpY0RpYWdub3N0aWM7CisJCX0KKwkJZWxzZSBpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKKwkJCXJldHVybgorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMKKwkJCQkJKERpYWdub3N0aWMuRVJST1IsCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucyIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJIDAsCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksIC8vJE5PTi1OTFMtMSQKKwkJCQkJIG5ldyBPYmplY3RbXSB7IGV4Y2VwdGlvbiB9KTsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBEaWFnbm9zdGljLk9LX0lOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBpbnN0YWxsIHlvdXIgb3duIGNvbnRyb2xzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VzKCkgeworCQkvLyBDcmVhdGVzIHRoZSBtb2RlbCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQKKwkJLy8KKwkJY3JlYXRlTW9kZWwoKTsKKworCQkvLyBPbmx5IGNyZWF0ZXMgdGhlIG90aGVyIHBhZ2VzIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBlZGl0ZWQKKwkJLy8KKwkJaWYgKCFnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCS8vIENyZWF0ZSBhIHBhZ2UgZm9yIHRoZSBzZWxlY3Rpb24gdHJlZSB2aWV3LgorCQkJLy8KKwkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGdldENvbnRhaW5lcigpLCBTV1QuTVVMVEkpOworCQkJc2VsZWN0aW9uVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7CisJCQlzZXRDdXJyZW50Vmlld2VyKHNlbGVjdGlvblZpZXdlcik7CisKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCisJCQluZXcgQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yKHNlbGVjdGlvblZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsKKworCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Ioc2VsZWN0aW9uVmlld2VyKTsKKwkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHRyZWUpOworCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisKKwkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJIHNldEFjdGl2ZVBhZ2UoMCk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJLy8gRW5zdXJlcyB0aGF0IHRoaXMgZWRpdG9yIHdpbGwgb25seSBkaXNwbGF5IHRoZSBwYWdlJ3MgdGFiCisJCS8vIGFyZWEgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgcGFnZQorCQkvLworCQlnZXRDb250YWluZXIoKS5hZGRDb250cm9sTGlzdGVuZXIKKwkJCShuZXcgQ29udHJvbEFkYXB0ZXIoKSB7CisJCQkJYm9vbGVhbiBndWFyZCA9IGZhbHNlOworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBldmVudCkgeworCQkJCQlpZiAoIWd1YXJkKSB7CisJCQkJCQlndWFyZCA9IHRydWU7CisJCQkJCQloaWRlVGFicygpOworCQkJCQkJZ3VhcmQgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCSB9KTsKKworCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQkJCSB9CisJCQkgfSk7CisJfQorCisJLyoqCisJICogSWYgdGhlcmUgaXMganVzdCBvbmUgcGFnZSBpbiB0aGUgbXVsdGktcGFnZSBlZGl0b3IgcGFydCwKKwkgKiB0aGlzIGhpZGVzIHRoZSBzaW5nbGUgdGFiIGF0IHRoZSBib3R0b20uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGlkZVRhYnMoKSB7CisJCWlmIChnZXRQYWdlQ291bnQoKSA8PSAxKSB7CisJCQlzZXRQYWdlVGV4dCgwLCAiIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsKKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodCgxKTsKKwkJCQlQb2ludCBwb2ludCA9IGdldENvbnRhaW5lcigpLmdldFNpemUoKTsKKwkJCQlnZXRDb250YWluZXIoKS5zZXRTaXplKHBvaW50LngsIHBvaW50LnkgKyA2KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGFnZSBpbiB0aGUgbXVsdGktcGFnZSBlZGl0b3IgcGFydCwKKwkgKiB0aGlzIHNob3dzIHRoZSB0YWJzIGF0IHRoZSBib3R0b20uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2hvd1RhYnMoKSB7CisJCWlmIChnZXRQYWdlQ291bnQoKSA+IDEpIHsKKwkJCXNldFBhZ2VUZXh0KDAsIGdldFN0cmluZygiX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsKKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodChTV1QuREVGQVVMVCk7CisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7CisJCQkJZ2V0Q29udGFpbmVyKCkuc2V0U2l6ZShwb2ludC54LCBwb2ludC55IC0gNik7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWQgdG8gdHJhY2sgdGhlIGFjdGl2ZSB2aWV3ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgcGFnZUluZGV4KSB7CisJCXN1cGVyLnBhZ2VDaGFuZ2UocGFnZUluZGV4KTsKKworCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsKKwkJCWhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKGNvbnRlbnRPdXRsaW5lUGFnZS5nZXRTZWxlY3Rpb24oKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGhvdyB0aGUgZnJhbWV3b3JrIGRldGVybWluZXMgd2hpY2ggaW50ZXJmYWNlcyB3ZSBpbXBsZW1lbnQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKKwkJaWYgKGtleS5lcXVhbHMoSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcykpIHsKKwkJCXJldHVybiBzaG93T3V0bGluZVZpZXcoKSA/IGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIDogbnVsbDsKKwkJfQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykpIHsKKwkJCXJldHVybiBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOworCQl9CisJCWVsc2UgaWYgKGtleS5lcXVhbHMoSUdvdG9NYXJrZXIuY2xhc3MpKSB7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGtleSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIGNvbnRlbnQgb3V0bGluZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElDb250ZW50T3V0bGluZVBhZ2UgZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgeworCQlpZiAoY29udGVudE91dGxpbmVQYWdlID09IG51bGwpIHsKKwkJCS8vIFRoZSBjb250ZW50IG91dGxpbmUgaXMganVzdCBhIHRyZWUuCisJCQkvLworCQkJY2xhc3MgTXlDb250ZW50T3V0bGluZVBhZ2UgZXh0ZW5kcyBDb250ZW50T3V0bGluZVBhZ2UgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQkJCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyID0gZ2V0VHJlZVZpZXdlcigpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisKKwkJCQkJLy8gU2V0IHVwIHRoZSB0cmVlIHZpZXdlci4KKwkJCQkJLy8KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKworCQkJCQkvLyBNYWtlIHN1cmUgb3VyIHBvcHVwcyB3b3JrLgorCQkJCQkvLworCQkJCQljcmVhdGVDb250ZXh0TWVudUZvcihjb250ZW50T3V0bGluZVZpZXdlcik7CisKKwkJCQkJaWYgKCFlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCSAgLy8gU2VsZWN0IHRoZSByb290IG9iamVjdCBpbiB0aGUgdmlldy4KKwkJCQkJICAvLworCQkJCQkgIGNvbnRlbnRPdXRsaW5lVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBtYWtlQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyKSB7CisJCQkJCXN1cGVyLm1ha2VDb250cmlidXRpb25zKG1lbnVNYW5hZ2VyLCB0b29sQmFyTWFuYWdlciwgc3RhdHVzTGluZU1hbmFnZXIpOworCQkJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyID0gc3RhdHVzTGluZU1hbmFnZXI7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisJCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7CisJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOworCQkJCX0KKwkJCX0KKworCQkJY29udGVudE91dGxpbmVQYWdlID0gbmV3IE15Q29udGVudE91dGxpbmVQYWdlKCk7CisKKwkJCS8vIExpc3RlbiB0byBzZWxlY3Rpb24gc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGl0IGlzIGEgc3BlY2lhbCB3YXkuCisJCQkvLworCQkJY29udGVudE91dGxpbmVQYWdlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgorCQkJCShuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCQkJIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGhhbmRsZSBzZWxlY3Rpb25zIGNvcnJlY3RseS4KKwkJCQkJIC8vCisJCQkJCSBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCQkJIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKKwkJCQkJIH0KKwkJCQkgfSk7CisJCX0KKworCQlyZXR1cm4gY29udGVudE91dGxpbmVQYWdlOworCX0KKworCS8qKgorCSAqIFRoaXMgYWNjZXNzZXMgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUgcHJvcGVydHkgc2hlZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElQcm9wZXJ0eVNoZWV0UGFnZSBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKKwkJaWYgKHByb3BlcnR5U2hlZXRQYWdlID09IG51bGwpIHsKKwkJCXByb3BlcnR5U2hlZXRQYWdlID0KKwkJCQluZXcgRXh0ZW5kZWRQcm9wZXJ0eVNoZWV0UGFnZShlZGl0aW5nRG9tYWluKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihMaXN0PD8+IHNlbGVjdGlvbikgeworCQkJCQkJTm9kZXNFZGl0b3IudGhpcy5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihzZWxlY3Rpb24pOworCQkJCQkJTm9kZXNFZGl0b3IudGhpcy5zZXRGb2N1cygpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworCQkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOworCQkJCQl9CisJCQkJfTsKKwkJCXByb3BlcnR5U2hlZXRQYWdlLnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCX0KKworCQlyZXR1cm4gcHJvcGVydHlTaGVldFBhZ2U7CisJfQorCisJLyoqCisJICogVGhpcyBkZWFscyB3aXRoIGhvdyB3ZSB3YW50IHNlbGVjdGlvbiBpbiB0aGUgb3V0bGluZXIgdG8gYWZmZWN0IHRoZSBvdGhlciB2aWV3cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlpZiAoc2VsZWN0aW9uVmlld2VyICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCUl0ZXJhdG9yPD8+IHNlbGVjdGVkRWxlbWVudHMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuaXRlcmF0b3IoKTsKKwkJCWlmIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgeworCQkJCS8vIEdldCB0aGUgZmlyc3Qgc2VsZWN0ZWQgZWxlbWVudC4KKwkJCQkvLworCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzLm5leHQoKTsKKworCQkJCUFycmF5TGlzdDxPYmplY3Q+IHNlbGVjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKwkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnQpOworCQkJCXdoaWxlIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgeworCQkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnRzLm5leHQoKSk7CisJCQkJfQorCisJCQkJLy8gU2V0IHRoZSBzZWxlY3Rpb24gdG8gdGhlIHdpZGdldC4KKwkJCQkvLworCQkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uTGlzdCkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSB0ZXN0cyB0aGUgY29tbWFuZCBzdGFjay4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgeworCQlyZXR1cm4gKChCYXNpY0NvbW1hbmRTdGFjayllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5pc1NhdmVOZWVkZWQoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHNhdmVzIHRoZSBtb2RlbCBmaWxlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworCQkvLyBTYXZlIG9ubHkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBhY3R1YWxseSBjaGFuZ2VkLgorCQkvLworCQlmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7CisJCXNhdmVPcHRpb25zLnB1dChSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRUQsIFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRF9NRU1PUllfQlVGRkVSKTsKKworCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guCisJCS8vCisJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPQorCQkJbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKKwkJCQkvLyBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBnZXRzIGludm9rZWQgd2hlbiB0aGUgb3BlcmF0aW9uIHJ1bnMuCisJCQkJLy8KKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJCQkvLyBTYXZlIHRoZSByZXNvdXJjZXMgdG8gdGhlIGZpbGUgc3lzdGVtLgorCQkJCQkvLworCQkJCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwkJCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSkgeworCQkJCQkJaWYgKChmaXJzdCB8fCAhcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkgfHwgaXNQZXJzaXN0ZWQocmVzb3VyY2UpKSAmJiAhZWRpdGluZ0RvbWFpbi5pc1JlYWRPbmx5KHJlc291cmNlKSkgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCWxvbmcgdGltZVN0YW1wID0gcmVzb3VyY2UuZ2V0VGltZVN0YW1wKCk7CisJCQkJCQkJCXJlc291cmNlLnNhdmUoc2F2ZU9wdGlvbnMpOworCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VGltZVN0YW1wKCkgIT0gdGltZVN0YW1wKSB7CisJCQkJCQkJCQlzYXZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQkJCQkJCX0KKwkJCQkJCQlmaXJzdCA9IGZhbHNlOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfTsKKworCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOworCQl0cnkgeworCQkJLy8gVGhpcyBydW5zIHRoZSBvcHRpb25zLCBhbmQgc2hvd3MgcHJvZ3Jlc3MuCisJCQkvLworCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSkucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOworCisJCQkvLyBSZWZyZXNoIHRoZSBuZWNlc3Nhcnkgc3RhdGUuCisJCQkvLworCQkJKChCYXNpY0NvbW1hbmRTdGFjayllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5zYXZlSXNEb25lKCk7CisJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCS8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHRoYXQgc2hvdWxkbid0LgorCQkJLy8KKwkJCURlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHdoZXRoZXIgc29tZXRoaW5nIGhhcyBiZWVuIHBlcnNpc3RlZCB0byB0aGUgVVJJIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisJICogVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIFVSSSBjb252ZXJ0ZXIgZnJvbSB0aGUgZWRpdG9yJ3MgcmVzb3VyY2Ugc2V0IHRvIHRyeSB0byBvcGVuIGFuIGlucHV0IHN0cmVhbS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNQZXJzaXN0ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbShyZXNvdXJjZS5nZXRVUkkoKSk7CisJCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKKwkJCQlyZXN1bHQgPSB0cnVlOworCQkJCXN0cmVhbS5jbG9zZSgpOworCQkJfQorCQl9CisJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBJZ25vcmUKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgdHJ1ZSBiZWNhdXNlIGl0IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogVGhpcyBhbHNvIGNoYW5nZXMgdGhlIGVkaXRvcidzIGlucHV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgeworCQlTYXZlQXNEaWFsb2cgc2F2ZUFzRGlhbG9nID0gbmV3IFNhdmVBc0RpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7CisJCXNhdmVBc0RpYWxvZy5vcGVuKCk7CisJCUlQYXRoIHBhdGggPSBzYXZlQXNEaWFsb2cuZ2V0UmVzdWx0KCk7CisJCWlmIChwYXRoICE9IG51bGwpIHsKKwkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7CisJCQlpZiAoZmlsZSAhPSBudWxsKSB7CisJCQkJZG9TYXZlQXMoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpLCBuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGRvU2F2ZUFzKFVSSSB1cmksIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgeworCQkoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSkuc2V0VVJJKHVyaSk7CisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7CisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7CisJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0KKwkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpICE9IG51bGwgPworCQkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpIDoKKwkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworCQlkb1NhdmUocHJvZ3Jlc3NNb25pdG9yKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7CisJCXRyeSB7CisJCQlpZiAobWFya2VyLmdldFR5cGUoKS5lcXVhbHMoRVZhbGlkYXRvci5NQVJLRVIpKSB7CisJCQkJU3RyaW5nIHVyaUF0dHJpYnV0ZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoRVZhbGlkYXRvci5VUklfQVRUUklCVVRFLCBudWxsKTsKKwkJCQlpZiAodXJpQXR0cmlidXRlICE9IG51bGwpIHsKKwkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpQXR0cmlidXRlKTsKKwkJCQkJRU9iamVjdCBlT2JqZWN0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldEVPYmplY3QodXJpLCB0cnVlKTsKKwkJCQkJaWYgKGVPYmplY3QgIT0gbnVsbCkgeworCQkJCQkgIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zLnNpbmdsZXRvbihlZGl0aW5nRG9tYWluLmdldFdyYXBwZXIoZU9iamVjdCkpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCURlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBzdGFydHVwLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisJCXNldFNpdGUoc2l0ZSk7CisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7CisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7CisJCXNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7CisJCXNpdGUuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCWdldENvbnRyb2woZ2V0QWN0aXZlUGFnZSgpKS5zZXRGb2N1cygpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gcmV0dXJuIHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgeworCQlyZXR1cm4gZWRpdG9yU2VsZWN0aW9uOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHNldCB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLgorCSAqIENhbGxpbmcgdGhpcyByZXN1bHQgd2lsbCBub3RpZnkgdGhlIGxpc3RlbmVycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJZWRpdG9yU2VsZWN0aW9uID0gc2VsZWN0aW9uOworCisJCWZvciAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA6IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMpIHsKKwkJCWxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsKKwkJfQorCQlzZXRTdGF0dXNMaW5lTWFuYWdlcihzZWxlY3Rpb24pOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0YXR1c0xpbmVNYW5hZ2VyKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciA9IGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCAmJiBjdXJyZW50Vmlld2VyID09IGNvbnRlbnRPdXRsaW5lVmlld2VyID8KKwkJCWNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXIgOiBnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKKworCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgeworCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnRvTGlzdCgpOworCQkJCXN3aXRjaCAoY29sbGVjdGlvbi5zaXplKCkpIHsKKwkJCQkJY2FzZSAwOiB7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX05vT2JqZWN0U2VsZWN0ZWQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNhc2UgMTogeworCQkJCQkJU3RyaW5nIHRleHQgPSBuZXcgQWRhcHRlckZhY3RvcnlJdGVtRGVsZWdhdG9yKGFkYXB0ZXJGYWN0b3J5KS5nZXRUZXh0KGNvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkpOworCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZCIsIHRleHQpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZGVmYXVsdDogeworCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9NdWx0aU9iamVjdFNlbGVjdGVkIiwgSW50ZWdlci50b1N0cmluZyhjb2xsZWN0aW9uLnNpemUoKSkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBsb29rcyB1cCBhIHN0cmluZyBpbiB0aGUgcGx1Z2luJ3MgcGx1Z2luLnByb3BlcnRpZXMgZmlsZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJcmV0dXJuIERlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHBsdWdpbi5wcm9wZXJ0aWVzLCBtYWtpbmcgYSBzdWJzdGl0dXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEpIHsKKwkJcmV0dXJuIERlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5LCBuZXcgT2JqZWN0IFtdIHsgczEgfSk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcn0gdG8gaGVscCBmaWxsIHRoZSBjb250ZXh0IG1lbnVzIHdpdGggY29udHJpYnV0aW9ucyBmcm9tIHRoZSBFZGl0IG1lbnUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQkoKElNZW51TGlzdGVuZXIpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkpLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpIHsKKwkJcmV0dXJuIChFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKSB7CisJCXJldHVybiBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGlvbkJhcnMoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7CisJCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOworCisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOworCisJCWdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7CisKKwkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOworCisJCWlmIChnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGl2ZUVkaXRvcigpID09IHRoaXMpIHsKKwkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKG51bGwpOworCQl9CisKKwkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKKwkJCXByb3BlcnR5U2hlZXRQYWdlLmRpc3Bvc2UoKTsKKwkJfQorCisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgIT0gbnVsbCkgeworCQkJY29udGVudE91dGxpbmVQYWdlLmRpc3Bvc2UoKTsKKwkJfQorCisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG91dGxpbmUgdmlldyBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHNob3dPdXRsaW5lVmlldygpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbm9kZXMvcHJvdmlkZXIvR2VvZ3JhcGhpY0ZlYXR1cmVJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbm9kZXMvcHJvdmlkZXIvR2VvZ3JhcGhpY0ZlYXR1cmVJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2UwYTFiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy9wcm92aWRlci9HZW9ncmFwaGljRmVhdHVyZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuTm9kZUl0ZW1Qcm92aWRlcjsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnByb3ZpZGVyLkRlZmluaXRpb25zRWRpdFBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuR2VvZ3JhcGhpY0ZlYXR1cmU7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLkdlb2dyYXBoaWNGZWF0dXJlfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBHZW9ncmFwaGljRmVhdHVyZUl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgTm9kZUl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHZW9ncmFwaGljRmVhdHVyZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKEdlb2dyYXBoaWNGZWF0dXJlKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfR2VvZ3JhcGhpY0ZlYXR1cmVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfR2VvZ3JhcGhpY0ZlYXR1cmVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy9wcm92aWRlci9Ob2Rlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL3Byb3ZpZGVyL05vZGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmI2YTY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy9wcm92aWRlci9Ob2Rlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMDYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy51dGlsLk5vZGVzQWRhcHRlckZhY3Rvcnk7CisKKy8qKgorICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLgorICogVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uCisgKiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgorICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTm9kZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIE5vZGVzQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKKworCS8qKgorCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5IHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxPYmplY3Q+IHN1cHBvcnRlZFR5cGVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vZGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuUmVnaW9ufSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFJlZ2lvbkl0ZW1Qcm92aWRlciByZWdpb25JdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5SZWdpb259LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlZ2lvbkFkYXB0ZXIoKSB7CisJCWlmIChyZWdpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJcmVnaW9uSXRlbVByb3ZpZGVyID0gbmV3IFJlZ2lvbkl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiByZWdpb25JdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7CisJCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOworCX0KKworCS8qKgorCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKKwkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7CisJCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgeworCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgeworCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOworCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzPD8+KSB8fCAoKChDbGFzczw/Pil0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgeworCQkJCXJldHVybiBhZGFwdGVyOworCQkJfQorCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKKwkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9IGFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisKKwkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKKwkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGRpc3Bvc2VzIGFsbCBvZiB0aGUgaXRlbSBwcm92aWRlcnMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkuIAorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWlmIChyZWdpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkgcmVnaW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbm9kZXMvcHJvdmlkZXIvUmVnaW9uSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL3Byb3ZpZGVyL1JlZ2lvbkl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YTFlMjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL3Byb3ZpZGVyL1JlZ2lvbkl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnByb3ZpZGVyLkRlZmluaXRpb25zRWRpdFBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuUmVnaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuR2VvZ3JhcGhpY05hbWVzOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5SZWdpb259IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJlZ2lvbkl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgR2VvZ3JhcGhpY0ZlYXR1cmVJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUmVnaW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJZmluYWwgUmVnaW9uIHJlZ2lvbiA9IChSZWdpb24pb2JqZWN0OworCQkKKwkJZmluYWwgVVJJIHJlZ2lvblVSSSA9IHJlZ2lvbi5nZXRVUkkoKTsKKwkJZmluYWwgU3RyaW5nIGxhc3RTZWdtZW50ID0gcmVnaW9uVVJJLmxhc3RTZWdtZW50KCk7CisJCWZpbmFsIFN0cmluZyBpc29LZXkgPSBsYXN0U2VnbWVudC50b1N0cmluZygpOworCisJCWZpbmFsIFN0cmluZyBnZW9OYW1lID0gR2VvZ3JhcGhpY05hbWVzLmdldE5hbWUoaXNvS2V5KTsKKwkJaWYgKGdlb05hbWUuc3RhcnRzV2l0aCgiISIpKSB7CisJCQkvLyBZZXMKKwkJCXJldHVybiBnZXRUZXh0R2VuKG9iamVjdCk7CisJCX0gLy8gaWYgCisJCWVsc2UgeworCQkJcmV0dXJuIGdlb05hbWU7CisJCX0KKwl9IC8vIGdldFRleHQKKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlVUkkgbGFiZWxWYWx1ZSA9ICgoUmVnaW9uKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfUmVnaW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX1JlZ2lvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCQorCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy91dGlsL05vZGVzQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbm9kZXMvdXRpbC9Ob2Rlc0FkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyODc4MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbm9kZXMvdXRpbC9Ob2Rlc0FkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMjQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy51dGlsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy4qOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5HZW9ncmFwaGljRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLk5vZGVzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLlJlZ2lvbjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuTm9kZXNQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBOb2Rlc0FkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBOb2Rlc1BhY2thZ2UgbW9kZWxQYWNrYWdlOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb2Rlc0FkYXB0ZXJGYWN0b3J5KCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IE5vZGVzUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgeworCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBUaGUgc3dpdGNoIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE5vZGVzU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0KKwkJbmV3IE5vZGVzU3dpdGNoPEFkYXB0ZXI+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlR2VvZ3JhcGhpY0ZlYXR1cmUoR2VvZ3JhcGhpY0ZlYXR1cmUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUdlb2dyYXBoaWNGZWF0dXJlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVnaW9uKFJlZ2lvbiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUmVnaW9uQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTm9kZShOb2RlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVOb2RlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgPFQ+IEFkYXB0ZXIgY2FzZUNvbXBhcmFibGUoQ29tcGFyYWJsZTxUPiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ29tcGFyYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUdyYXBoX05vZGUoTm9kZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlR3JhcGhfTm9kZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCisJICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7CisJCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOworCX0KKworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLkdlb2dyYXBoaWNGZWF0dXJlIDxlbT5HZW9ncmFwaGljIEZlYXR1cmU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5HZW9ncmFwaGljRmVhdHVyZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVHZW9ncmFwaGljRmVhdHVyZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5SZWdpb24gPGVtPlJlZ2lvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLlJlZ2lvbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWdpb25BZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlIDxlbT5Ob2RlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5vZGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmEubGFuZy5Db21wYXJhYmxlIDxlbT5Db21wYXJhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhcmFibGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlIDxlbT5JZGVudGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZSA8ZW0+Tm9kZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaF9Ob2RlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL05vZGVzQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbm9kZXMvdXRpbC9Ob2Rlc1N3aXRjaC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy91dGlsL05vZGVzU3dpdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RlY2NlOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbm9kZXMvdXRpbC9Ob2Rlc1N3aXRjaC5qYXZhCkBAIC0wLDAgKzEsMjI5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuR2VvZ3JhcGhpY0ZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5Ob2Rlc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5SZWdpb247CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCisgKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9CisgKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCisgKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAorICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQorICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCisgKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5Ob2Rlc1BhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE5vZGVzU3dpdGNoPFQxPiB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBOb2Rlc1BhY2thZ2UgbW9kZWxQYWNrYWdlOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb2Rlc1N3aXRjaCgpIHsKKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7CisJCQltb2RlbFBhY2thZ2UgPSBOb2Rlc1BhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUMSBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKKwkJfQorCQllbHNlIHsKKwkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOworCQkJcmV0dXJuCisJCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KKwkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgorCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7CisJCQljYXNlIE5vZGVzUGFja2FnZS5HRU9HUkFQSElDX0ZFQVRVUkU6IHsKKwkJCQlHZW9ncmFwaGljRmVhdHVyZSBnZW9ncmFwaGljRmVhdHVyZSA9IChHZW9ncmFwaGljRmVhdHVyZSl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VHZW9ncmFwaGljRmVhdHVyZShnZW9ncmFwaGljRmVhdHVyZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3JhcGhfTm9kZShnZW9ncmFwaGljRmVhdHVyZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKGdlb2dyYXBoaWNGZWF0dXJlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKGdlb2dyYXBoaWNGZWF0dXJlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIE5vZGVzUGFja2FnZS5SRUdJT046IHsKKwkJCQlSZWdpb24gcmVnaW9uID0gKFJlZ2lvbil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VSZWdpb24ocmVnaW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHZW9ncmFwaGljRmVhdHVyZShyZWdpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUdyYXBoX05vZGUocmVnaW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUocmVnaW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHJlZ2lvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R2VvZ3JhcGhpYyBGZWF0dXJlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R2VvZ3JhcGhpYyBGZWF0dXJlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUdlb2dyYXBoaWNGZWF0dXJlKEdlb2dyYXBoaWNGZWF0dXJlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWdpb248L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWdpb248L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlUmVnaW9uKFJlZ2lvbiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTm9kZShOb2RlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIDxUPiBUMSBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlR3JhcGhfTm9kZShOb2RlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9Ob2Rlc1N3aXRjaApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy9DYXRlZ29yaXplZFR5cGUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHlwZXMvQ2F0ZWdvcml6ZWRUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU2ZTU1MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHlwZXMvQ2F0ZWdvcml6ZWRUeXBlLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLy8gQ2F0ZWdvcml6ZWRUeXBlLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50eXBlczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworLyoqCisgKiBBIDxjb2RlPkNhdGFnb3JpemVkVHlwZTwvY29kZT4gaXMgYSBtYXJrZXIgaW50ZXJmYWNlIGZvciB0aGUgdHlwZXMgb2YKKyAqIHByb3BlcnRpZXMgc3BlY2lmaWVkIGZvciB7QGxpbmsgRGVjb3JhdG9yfXMuIFRoZSBpbnRlbnQgaXMgdGhhdCBwYXJ0aWN1bGFyCisgKiBwcm9wZXJ0aWVzIGNhbiBiZSAibWFya2VkIiBhcyBoYXZpbmcgYSAiY2F0ZWdvcnkiIGJ5IHRoZSB0eXBlIG9mIHRoZQorICogcHJvcGVydHkuIFRoaXMgd2lsbCBmYWNpbGl0YXRlIHRoaW5ncyBsaWtlIGdyb3VwaW5nIHByb3BlcnRpZXMgaW4gdGhlIHNhbWUKKyAqIGNhdGVnb3J5IHRvZ2V0aGVyIGluIGEgdXNlciBpbnRlcmZhY2UuCisgKiAKKyAqIEBtb2RlbCBpbnRlcmZhY2U9InRydWUiCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ2F0ZWdvcml6ZWRUeXBlIGV4dGVuZHMgRU9iamVjdCB7CisJLy8gTm90aGluZworfSAvLyBDYXRlZ29yaXplZFR5cGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHlwZXMvUmF0ZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy9SYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzNjA4ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHlwZXMvUmF0ZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8vIFJhdGUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEEgPGNvZGU+UmF0ZTwvY29kZT4gaXMgYSB0eXBlIHRoYXQgc3BlY2lmaWVzIGEgcmF0ZSBvZiBjaGFuZ2Ugb2Ygb25lIHVuaXQgb2YKKyAqIG1lYXN1cmUgd2l0aCByZXNwZWN0IHRvIGFub3RoZXIgdW5pdCBvZiBtZWFzdXJlLgorICogCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmF0ZSBleHRlbmRzIEVPYmplY3QgeworCS8qKgorCSAqIEBtb2RlbAorCSAqLworCWRvdWJsZSBnZXRSYXRlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLlJhdGUjZ2V0UmF0ZSA8ZW0+UmF0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0UmF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmF0ZShkb3VibGUgdmFsdWUpOworfSAvLyBSYXRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3R5cGVzL1R5cGVzRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy9UeXBlc0ZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWRkNjg1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy9UeXBlc0ZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuVHlwZXNQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVHlwZXNGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgeworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVHlwZXNGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuaW1wbC5UeXBlc0ZhY3RvcnlJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVHlwZXNQYWNrYWdlIGdldFR5cGVzUGFja2FnZSgpOworCit9IC8vVHlwZXNGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3R5cGVzL1R5cGVzUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy9UeXBlc1BhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2I4N2JlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy9UeXBlc1BhY2thZ2UuamF2YQpAQCAtMCwwICsxLDE5NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuVHlwZXNGYWN0b3J5CisgKiBAbW9kZWwga2luZD0icGFja2FnZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBUeXBlc1BhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7CisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5BTUUgPSAidHlwZXMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy5lY29yZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVR5cGVzUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLmltcGwuVHlwZXNQYWNrYWdlSW1wbC5pbml0KCk7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuQ2F0ZWdvcml6ZWRUeXBlIDxlbT5DYXRlZ29yaXplZCBUeXBlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50eXBlcy5DYXRlZ29yaXplZFR5cGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuaW1wbC5UeXBlc1BhY2thZ2VJbXBsI2dldENhdGVnb3JpemVkVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDQVRFR09SSVpFRF9UWVBFID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5DYXRlZ29yaXplZCBUeXBlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENBVEVHT1JJWkVEX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuaW1wbC5SYXRlSW1wbCA8ZW0+UmF0ZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuaW1wbC5SYXRlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50eXBlcy5pbXBsLlR5cGVzUGFja2FnZUltcGwjZ2V0UmF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBSQVRFID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkFURV9fUkFURSA9IDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmF0ZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSQVRFX0ZFQVRVUkVfQ09VTlQgPSAxOworCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLkNhdGVnb3JpemVkVHlwZSA8ZW0+Q2F0ZWdvcml6ZWQgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DYXRlZ29yaXplZCBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50eXBlcy5DYXRlZ29yaXplZFR5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldENhdGVnb3JpemVkVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50eXBlcy5SYXRlIDxlbT5SYXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJhdGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLlJhdGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFJhdGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50eXBlcy5SYXRlI2dldFJhdGUgPGVtPlJhdGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SYXRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50eXBlcy5SYXRlI2dldFJhdGUoKQorCSAqIEBzZWUgI2dldFJhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFJhdGVfUmF0ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVHlwZXNGYWN0b3J5IGdldFR5cGVzRmFjdG9yeSgpOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50CisJICogPHVsPgorCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisJICogPC91bD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50ZXJmYWNlIExpdGVyYWxzIHsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLkNhdGVnb3JpemVkVHlwZSA8ZW0+Q2F0ZWdvcml6ZWQgVHlwZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuQ2F0ZWdvcml6ZWRUeXBlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50eXBlcy5pbXBsLlR5cGVzUGFja2FnZUltcGwjZ2V0Q2F0ZWdvcml6ZWRUeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENBVEVHT1JJWkVEX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q2F0ZWdvcml6ZWRUeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLmltcGwuUmF0ZUltcGwgPGVtPlJhdGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLmltcGwuUmF0ZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLmltcGwuVHlwZXNQYWNrYWdlSW1wbCNnZXRSYXRlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFJBVEUgPSBlSU5TVEFOQ0UuZ2V0UmF0ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFJBVEVfX1JBVEUgPSBlSU5TVEFOQ0UuZ2V0UmF0ZV9SYXRlKCk7CisKKwl9CisKK30gLy9UeXBlc1BhY2thZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHlwZXMvaW1wbC9SYXRlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy9pbXBsL1JhdGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwYTczOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHlwZXMvaW1wbC9SYXRlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLlJhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50eXBlcy5UeXBlc1BhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SYXRlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLmltcGwuUmF0ZUltcGwjZ2V0UmF0ZSA8ZW0+UmF0ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFJhdGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSYXRlIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZSgpIDxlbT5SYXRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBSQVRFX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZSgpIDxlbT5SYXRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIHJhdGUgPSBSQVRFX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFJhdGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gVHlwZXNQYWNrYWdlLkxpdGVyYWxzLlJBVEU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRSYXRlKCkgeworCQlyZXR1cm4gcmF0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSYXRlKGRvdWJsZSBuZXdSYXRlKSB7CisJCWRvdWJsZSBvbGRSYXRlID0gcmF0ZTsKKwkJcmF0ZSA9IG5ld1JhdGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFR5cGVzUGFja2FnZS5SQVRFX19SQVRFLCBvbGRSYXRlLCByYXRlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBUeXBlc1BhY2thZ2UuUkFURV9fUkFURToKKwkJCQlyZXR1cm4gZ2V0UmF0ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFR5cGVzUGFja2FnZS5SQVRFX19SQVRFOgorCQkJCXNldFJhdGUoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgVHlwZXNQYWNrYWdlLlJBVEVfX1JBVEU6CisJCQkJc2V0UmF0ZShSQVRFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgVHlwZXNQYWNrYWdlLlJBVEVfX1JBVEU6CisJCQkJcmV0dXJuIHJhdGUgIT0gUkFURV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHJhdGU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQocmF0ZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1JhdGVJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3R5cGVzL2ltcGwvVHlwZXNGYWN0b3J5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy9pbXBsL1R5cGVzRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjdhY2VmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy9pbXBsL1R5cGVzRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDkzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLio7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVHlwZXNGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFR5cGVzRmFjdG9yeSB7CisJLyoqCisJICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVHlwZXNGYWN0b3J5IGluaXQoKSB7CisJCXRyeSB7CisJCQlUeXBlc0ZhY3RvcnkgdGhlVHlwZXNGYWN0b3J5ID0gKFR5cGVzRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3R5cGVzLmVjb3JlIik7IC8vJE5PTi1OTFMtMSQgCisJCQlpZiAodGhlVHlwZXNGYWN0b3J5ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdGhlVHlwZXNGYWN0b3J5OworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IFR5cGVzRmFjdG9yeUltcGwoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUeXBlc0ZhY3RvcnlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7CisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFR5cGVzUGFja2FnZSBnZXRUeXBlc1BhY2thZ2UoKSB7CisJCXJldHVybiAoVHlwZXNQYWNrYWdlKWdldEVQYWNrYWdlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZGVwcmVjYXRlZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlARGVwcmVjYXRlZAorCXB1YmxpYyBzdGF0aWMgVHlwZXNQYWNrYWdlIGdldFBhY2thZ2UoKSB7CisJCXJldHVybiBUeXBlc1BhY2thZ2UuZUlOU1RBTkNFOworCX0KKworfSAvL1R5cGVzRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHlwZXMvaW1wbC9UeXBlc1BhY2thZ2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3R5cGVzL2ltcGwvVHlwZXNQYWNrYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMGM5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3R5cGVzL2ltcGwvVHlwZXNQYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjUyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb1BhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlclBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5FZGdlc1BhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuRWRnZXNQYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc1BhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkxhYmVsc1BhY2thZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5Ob2Rlc1BhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLmltcGwuTm9kZXNQYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuQ2F0ZWdvcml6ZWRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuUmF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLlR5cGVzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLlR5cGVzUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUeXBlc1BhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgVHlwZXNQYWNrYWdlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjYXRlZ29yaXplZFR5cGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcmF0ZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKKwkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KKwkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCisJICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKKwkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLlR5cGVzUGFja2FnZSNlTlNfVVJJCisJICogQHNlZSAjaW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgVHlwZXNQYWNrYWdlSW1wbCgpIHsKKwkJc3VwZXIoZU5TX1VSSSwgVHlwZXNGYWN0b3J5LmVJTlNUQU5DRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgorCSAqIAorCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgVHlwZXNQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgorCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNlTlNfVVJJCisJICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUeXBlc1BhY2thZ2UgaW5pdCgpIHsKKwkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFR5cGVzUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUeXBlc1BhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQorCQlUeXBlc1BhY2thZ2VJbXBsIHRoZVR5cGVzUGFja2FnZSA9IChUeXBlc1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBUeXBlc1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IFR5cGVzUGFja2FnZUltcGwoKSk7CisKKwkJaXNJbml0ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcworCQlHcmFwaFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJTW9kaWZpZXJQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJU2NlbmFyaW9QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJU2VxdWVuY2VyUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCVNvbHZlclBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCisJCUVkZ2VzUGFja2FnZUltcGwgdGhlRWRnZXNQYWNrYWdlID0gKEVkZ2VzUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVkZ2VzUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVkZ2VzUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFZGdlc1BhY2thZ2UuZU5TX1VSSSkgOiBFZGdlc1BhY2thZ2UuZUlOU1RBTkNFKTsKKwkJTGFiZWxzUGFja2FnZUltcGwgdGhlTGFiZWxzUGFja2FnZSA9IChMYWJlbHNQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTGFiZWxzUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIExhYmVsc1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTGFiZWxzUGFja2FnZS5lTlNfVVJJKSA6IExhYmVsc1BhY2thZ2UuZUlOU1RBTkNFKTsKKwkJTm9kZXNQYWNrYWdlSW1wbCB0aGVOb2Rlc1BhY2thZ2UgPSAoTm9kZXNQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTm9kZXNQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgTm9kZXNQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE5vZGVzUGFja2FnZS5lTlNfVVJJKSA6IE5vZGVzUGFja2FnZS5lSU5TVEFOQ0UpOworCisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCisJCXRoZVR5cGVzUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlRWRnZXNQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVMYWJlbHNQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVOb2Rlc1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQorCQl0aGVUeXBlc1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVFZGdlc1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVMYWJlbHNQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlTm9kZXNQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCisJCXRoZVR5cGVzUGFja2FnZS5mcmVlemUoKTsKKworICAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChUeXBlc1BhY2thZ2UuZU5TX1VSSSwgdGhlVHlwZXNQYWNrYWdlKTsKKwkJcmV0dXJuIHRoZVR5cGVzUGFja2FnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldENhdGVnb3JpemVkVHlwZSgpIHsKKwkJcmV0dXJuIGNhdGVnb3JpemVkVHlwZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFJhdGUoKSB7CisJCXJldHVybiByYXRlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfUmF0ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXJhdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVHlwZXNGYWN0b3J5IGdldFR5cGVzRmFjdG9yeSgpIHsKKwkJcmV0dXJuIChUeXBlc0ZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcworCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKKwkJaXNDcmVhdGVkID0gdHJ1ZTsKKworCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJY2F0ZWdvcml6ZWRUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENBVEVHT1JJWkVEX1RZUEUpOworCisJCXJhdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkFURSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocmF0ZUVDbGFzcywgUkFURV9fUkFURSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOworCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKKwkJc2V0TmFtZShlTkFNRSk7CisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOworCQlzZXROc1VSSShlTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCisJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCWluaXRFQ2xhc3MoY2F0ZWdvcml6ZWRUeXBlRUNsYXNzLCBDYXRlZ29yaXplZFR5cGUuY2xhc3MsICJDYXRlZ29yaXplZFR5cGUiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhyYXRlRUNsYXNzLCBSYXRlLmNsYXNzLCAiUmF0ZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFJhdGVfUmF0ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAicmF0ZSIsIG51bGwsIDAsIDEsIFJhdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBDcmVhdGUgcmVzb3VyY2UKKwkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJfQorCit9IC8vVHlwZXNQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy9wcm92aWRlci9SYXRlSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3R5cGVzL3Byb3ZpZGVyL1JhdGVJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjU0NDQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy9wcm92aWRlci9SYXRlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50eXBlcy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcm92aWRlci5EZWZpbml0aW9uc0VkaXRQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLlJhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50eXBlcy5UeXBlc1BhY2thZ2U7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLlJhdGV9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJhdGVJdGVtUHJvdmlkZXIKKwlleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJhdGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkUmF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmF0ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFJhdGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9SYXRlX3JhdGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmF0ZV9yYXRlX2ZlYXR1cmUiLCAiX1VJX1JhdGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBUeXBlc1BhY2thZ2UuTGl0ZXJhbHMuUkFURV9fUkFURSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVJhdGUgcmF0ZSA9IChSYXRlKW9iamVjdDsKKwkJcmV0dXJuIGdldFN0cmluZygiX1VJX1JhdGVfdHlwZSIpICsgIiAiICsgcmF0ZS5nZXRSYXRlKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJhdGUuY2xhc3MpKSB7CisJCQljYXNlIFR5cGVzUGFja2FnZS5SQVRFX19SQVRFOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3R5cGVzL3Byb3ZpZGVyL1R5cGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHlwZXMvcHJvdmlkZXIvVHlwZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlY2JjMTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3R5cGVzL3Byb3ZpZGVyL1R5cGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE4NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50eXBlcy51dGlsLlR5cGVzQWRhcHRlckZhY3Rvcnk7CisKKy8qKgorICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLgorICogVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uCisgKiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgorICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVHlwZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFR5cGVzQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKKworCS8qKgorCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5IHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxPYmplY3Q+IHN1cHBvcnRlZFR5cGVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFR5cGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgeworCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7CisJCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7CisJCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7CisJCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3M8Pz4pIHx8ICgoKENsYXNzPD8+KXR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7CisJCQkJcmV0dXJuIGFkYXB0ZXI7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn0gYW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKworCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgeworCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHlwZXMvdXRpbC9UeXBlc0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3R5cGVzL3V0aWwvVHlwZXNBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMzVhNjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3R5cGVzL3V0aWwvVHlwZXNBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuKjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuVHlwZXNQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUeXBlc0FkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBUeXBlc1BhY2thZ2UgbW9kZWxQYWNrYWdlOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUeXBlc0FkYXB0ZXJGYWN0b3J5KCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IFR5cGVzUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgeworCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBUaGUgc3dpdGNoIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFR5cGVzU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0KKwkJbmV3IFR5cGVzU3dpdGNoPEFkYXB0ZXI+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQ2F0ZWdvcml6ZWRUeXBlKENhdGVnb3JpemVkVHlwZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ2F0ZWdvcml6ZWRUeXBlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUmF0ZShSYXRlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVSYXRlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworCQkJfQorCQl9OworCisJLyoqCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuQ2F0ZWdvcml6ZWRUeXBlIDxlbT5DYXRlZ29yaXplZCBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuQ2F0ZWdvcml6ZWRUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhdGVnb3JpemVkVHlwZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50eXBlcy5SYXRlIDxlbT5SYXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuUmF0ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSYXRlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL1R5cGVzQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHlwZXMvdXRpbC9UeXBlc1N3aXRjaC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy91dGlsL1R5cGVzU3dpdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1MmMwMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHlwZXMvdXRpbC9UeXBlc1N3aXRjaC5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLio7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCisgKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9CisgKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCisgKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAorICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQorICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCisgKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50eXBlcy5UeXBlc1BhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFR5cGVzU3dpdGNoPFQ+IHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFR5cGVzUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFR5cGVzU3dpdGNoKCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IFR5cGVzUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKKwkJfQorCQllbHNlIHsKKwkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOworCQkJcmV0dXJuCisJCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KKwkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgorCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKKwkJCWNhc2UgVHlwZXNQYWNrYWdlLkNBVEVHT1JJWkVEX1RZUEU6IHsKKwkJCQlDYXRlZ29yaXplZFR5cGUgY2F0ZWdvcml6ZWRUeXBlID0gKENhdGVnb3JpemVkVHlwZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUNhdGVnb3JpemVkVHlwZShjYXRlZ29yaXplZFR5cGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgVHlwZXNQYWNrYWdlLlJBVEU6IHsKKwkJCQlSYXRlIHJhdGUgPSAoUmF0ZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVJhdGUocmF0ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2F0ZWdvcml6ZWQgVHlwZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhdGVnb3JpemVkIFR5cGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VDYXRlZ29yaXplZFR5cGUoQ2F0ZWdvcml6ZWRUeXBlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SYXRlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmF0ZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVJhdGUoUmF0ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9UeXBlc1N3aXRjaApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZTg2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLy5jdnNpZ25vcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMjdiZTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS8uY3ZzaWdub3JlCkBAIC0wLDAgKzEgQEAKK3RleHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1YWVkMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzE5NzAwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsNzggQEAKKyNUdWUgTm92IDI3IDE5OjExOjAxIFBTVCAyMDA3CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwYjc0NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMzkgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZTtzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLnByb3ZpZGVyLkV4YW1wbGVFZGl0UGx1Z2luJEltcGxlbWVudGF0aW9uCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5lbWYuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydAorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZTt1c2VzOj0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLG9yZy5lY2xpcHNlLmVtZi5lY29yZSIsCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuaW1wbDsKKyAgdXNlczo9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZCwKKyAgIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLAorICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwsCisgICBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbCwKKyAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZSIsCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUucHJvdmlkZXI7CisgIHVzZXM6PSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS51dGlsLAorICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbiwKKyAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWksCisgICBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIsCisgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeSwKKyAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLAorICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsIiwKKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS51dGlsOworICB1c2VzOj0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbCwKKyAgIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZCwKKyAgIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLAorICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnksCisgICBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwsCisgICBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLAorICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwNWM1ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNSBAQAorIyA8Y29weXJpZ2h0PgorIyA8L2NvcHlyaWdodD4KKyMKKyMgJElkJAorCitiaW4uaW5jbHVkZXMgPSAuLFwKKyAgICAgICAgICAgICAgIGljb25zLyxcCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAorICAgICAgICAgICAgICAgbm90aWNlLmh0bWwKK2phcnMuY29tcGlsZS5vcmRlciA9IC4KK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YjE5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoreG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKK3htbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPGxpbmsgcmVsPUZpbGUtTGlzdAoraHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOkRvY3VtZW50UHJvcGVydGllcz4KKyAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KKyAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgorICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+CisgIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+CisgIDxvOlBhZ2VzPjQ8L286UGFnZXM+CisgIDxvOldvcmRzPjE2MjY8L286V29yZHM+CisgIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgorICAgPG86TGluZXM+Nzc8L286TGluZXM+CisgIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KKyAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+CisgIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+CisgPC9vOkRvY3VtZW50UHJvcGVydGllcz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OldvcmREb2N1bWVudD4KKyAgPHc6VHJhY2tSZXZpc2lvbnMvPgorIDwvdzpXb3JkRG9jdW1lbnQ+Cis8L3htbD48IVtlbmRpZl0tLT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlRhaG9tYTsKKwlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKKwltc28tZm9udC1jaGFyc2V0OjA7CisJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7CisJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7CisJbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KK3AuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bXNvLXN0eWxlLXBhcmVudDoiIjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwCisJe21hcmdpbi1yaWdodDowaW47CisJbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CisJbWFyZ2luLWxlZnQ6MGluOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKKwl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZTo4LjBwdDsKKwlmb250LWZhbWlseTpUYWhvbWE7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorQHBhZ2UgU2VjdGlvbjEKKwl7c2l6ZTo4LjVpbiAxMS4waW47CisJbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47CisJbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKKwltc28tZm9vdGVyLW1hcmdpbjouNWluOworCW1zby1wYXBlci1zb3VyY2U6MDt9CitkaXYuU2VjdGlvbjEKKwl7cGFnZTpTZWN0aW9uMTt9CistLT4KKzwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgorPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCitUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAorUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCitPRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCithZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKK3N1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKK2J5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgoraWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KK3N1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCit3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKK2VudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKK2NsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCitvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucworZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KK3JlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50CithIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KK3N0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5CitkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCitSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAorYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCitjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgorb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKK2J5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCit0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCithbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCitSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCitDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgordGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Citmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQordG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKK2lmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKK3RoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQorRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKK3JpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KK3RoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Cis8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK2l0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAorY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQorYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKK2FuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCitlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAoraW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAorYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCitzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0CitDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCitzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCitpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCitjb2RlIGZvcm06PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQorY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQorY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCitvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQorYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycworYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKK29mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAorbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCitDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKK2Nvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCit0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCitjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKK3RvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK3RvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCithbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQoraW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCit3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcworc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCitvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCitjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKK1dJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKK01FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQorUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcworQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKK2VxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgorVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgorVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKK29yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKK2Z1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgorYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAorb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCitzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCitwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQorY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKK3RoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKK0FncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCitzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAorZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCitTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCitBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKK0FncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKK2l0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvaWNvbnMvZnVsbC9vYmoxNi9FeGFtcGxlRGlzZWFzZU1vZGVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZURpc2Vhc2VNb2RlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyOWEwNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZURpc2Vhc2VNb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvaWNvbnMvZnVsbC9vYmoxNi9FeGFtcGxlTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZU1vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzMDllZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZU1vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvaWNvbnMvZnVsbC9vYmoxNi9FeHBlcmltZW50YWxEaXNlYXNlTW9kZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvaWNvbnMvZnVsbC9vYmoxNi9FeHBlcmltZW50YWxEaXNlYXNlTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOGZiOGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9pY29ucy9mdWxsL29iajE2L0V4cGVyaW1lbnRhbERpc2Vhc2VNb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvaWNvbnMvZnVsbC93aXpiYW4vTmV3RXhhbXBsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9pY29ucy9mdWxsL3dpemJhbi9OZXdFeGFtcGxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2RlNDQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvaWNvbnMvZnVsbC93aXpiYW4vTmV3RXhhbXBsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvbW9kZWwvZXhhbXBsZS5lY29yZSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL21vZGVsL2V4YW1wbGUuZWNvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMxMmY0NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL21vZGVsL2V4YW1wbGUuZWNvcmUKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iZXhhbXBsZSIKKyAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlIj4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeGFtcGxlRGlzZWFzZU1vZGVsIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL21vZGVsL3N0YW5kYXJkLmVjb3JlIy8vU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50IgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMi4wIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vZHVsYXRpb25QZXJpb2QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjM2NS4yNTYzNjMwNTEiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW9kdWxhdGlvblBoYXNlU2hpZnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjAuMCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWFzb25hbE1vZHVsYXRpb25GbG9vciIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VEb3VibGUiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjAuNiIvPgorICA8L2VDbGFzc2lmaWVycz4KKzwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9tb2RlbC9leGFtcGxlLmdlbm1vZGVsIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvbW9kZWwvZXhhbXBsZS5nZW5tb2RlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmUwNjk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvbW9kZWwvZXhhbXBsZS5nZW5tb2RlbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKKyAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMiCisgICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjIgorICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlIiBtb2RlbE5hbWU9IkV4YW1wbGUiCisgICAgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5wcm92aWRlci5FeGFtcGxlRWRpdFBsdWdpbiIKKyAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUucHJlc2VudGF0aW9uLkV4YW1wbGVFZGl0b3JQbHVnaW4iCisgICAgbm9uTkxTTWFya2Vycz0idHJ1ZSIgdGVzdHNEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMiCisgICAgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLmphdmEiIGNvbXBsaWFuY2VMZXZlbD0iNS4wIiBjb3B5cmlnaHRGaWVsZHM9ImZhbHNlIgorICAgIGVkaXRQbHVnaW5JRD0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUiIGVkaXRvclBsdWdpbklEPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5lZGl0b3IiCisgICAgdGVzdHNQbHVnaW5JRD0ib3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4YW1wbGUiIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL21vZGVsL2Rpc2Vhc2Vtb2RlbHMuZ2VubW9kZWwjLy9zdGFuZGFyZCAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL2NvbW1vbiAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL21vZGVsIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vZ3JhcGggLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9tb2RpZmllciBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vc2NlbmFyaW8gLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9zZXF1ZW5jZXIgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9tb2RlbC9kZWZpbml0aW9ucy5nZW5tb2RlbCMvL2xhYmVscyI+CisgIDxmb3JlaWduTW9kZWw+QG1vZGVsPC9mb3JlaWduTW9kZWw+CisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkV4YW1wbGUiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCisgICAgICBnZW5lcmF0ZUV4YW1wbGVDbGFzcz0iZmFsc2UiIG11bHRpcGxlRWRpdG9yUGFnZXM9ImZhbHNlIiBnZW5lcmF0ZU1vZGVsV2l6YXJkPSJmYWxzZSIKKyAgICAgIGVjb3JlUGFja2FnZT0iZXhhbXBsZS5lY29yZSMvIj4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJleGFtcGxlLmVjb3JlIy8vRXhhbXBsZURpc2Vhc2VNb2RlbCI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZXhhbXBsZS5lY29yZSMvL0V4YW1wbGVEaXNlYXNlTW9kZWwvc2Vhc29uYWxNb2R1bGF0aW9uIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZXhhbXBsZS5lY29yZSMvL0V4YW1wbGVEaXNlYXNlTW9kZWwvbW9kdWxhdGlvblBlcmlvZCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGV4YW1wbGUuZWNvcmUjLy9FeGFtcGxlRGlzZWFzZU1vZGVsL21vZHVsYXRpb25QaGFzZVNoaWZ0Ii8+CisgICAgPC9nZW5DbGFzc2VzPgorICA8L2dlblBhY2thZ2VzPgorPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL25vdGljZS5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvbm90aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhZjk2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL25vdGljZS5odG1sCkBAIC0wLDAgKzEsNzkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+TWFyY2ggMTcsIDIwMDU8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorICAgCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCisgICAKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUworICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisgICAKKzx1bD4KKwk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4gICAKKyAKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKwk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCQkKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKwk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKKwk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorICAgCis8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0NmIxZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL3BsdWdpbi5wcm9wZXJ0aWVzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMzQzMWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsNDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+CisKKzwhLS0KKyA8Y29weXJpZ2h0PgorIDwvY29weXJpZ2h0PgorCisgJElkJAorLS0+CisKKzxwbHVnaW4+CisgICAgCisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Lml0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3JpZXMiPgorICAgIDxmYWN0b3J5IAorICAgICAgIHVyaSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlLmVjb3JlIiAKKyAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5wcm92aWRlci5FeGFtcGxlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiIAorICAgICAgIHN1cHBvcnRlZFR5cGVzID0gCisgICAgICAgICAib3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIKKyAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIKKyAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIKKyAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIKKyAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlIiAvPgorICA8L2V4dGVuc2lvbj4KKworICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgorICAgIDxwYWNrYWdlCisgICAgICAgdXJpID0gImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUuZWNvcmUiCisgICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuRXhhbXBsZVBhY2thZ2UiCisgICAgICAgZ2VuTW9kZWwgPSAibW9kZWwvZXhhbXBsZS5nZW5tb2RlbCIgLz4gCisgIDwvZXh0ZW5zaW9uPgorICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZGlzZWFzZW1vZGVsIj4KKyAgICAgPGNsYXNzZGVmCisgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5pbXBsLkV4YW1wbGVEaXNlYXNlTW9kZWxJbXBsIj4KKyAgICAgPC9jbGFzc2RlZj4KKyAgICAgPGR1Ymxpbl9jb3JlCisgICAgICAgICAgIGNyZWF0b3I9IiVkY19jcmVhdG9yX2thdWZtYW4iCisgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlZGNfZGVzY19FX1NfU0VJUiIKKyAgICAgICAgICAgaWRlbnRpZmllcj0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5kdWJsaW5fY29yZTQiCisgICAgICAgICAgIHRpdGxlPSIlZGNfdGl0bGVfRV9TX1NFSVIiPgorICAgICA8L2R1Ymxpbl9jb3JlPgorICA8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvRXhhbXBsZURpc2Vhc2VNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL0V4YW1wbGVEaXNlYXNlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmFmZWExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL0V4YW1wbGVEaXNlYXNlTW9kZWwuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLy8gRXhhbXBsZURpc2Vhc2VNb2RlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGFuIEVNRiBNb2RlbC4KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXhhbXBsZURpc2Vhc2VNb2RlbCBleHRlbmRzIFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlYXNvbmFsIE1vZHVsYXRpb24gRXhwb25lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMi4wIjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWFzb25hbCBNb2R1bGF0aW9uIEV4cG9uZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRXhwb25lbnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLkV4YW1wbGVQYWNrYWdlI2dldEV4YW1wbGVEaXNlYXNlTW9kZWxfU2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSIyLjAiCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuRXhhbXBsZURpc2Vhc2VNb2RlbCNnZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCA8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IG1vZHVsYXRpb24gcGVyaW9kIGlzIDEgeWVhci4gVGhpcyBkZWZhdWx0IHZhbHVlIGFzc3VtZXMgdGltZSBzdGVwcyBpbiBkYXlzLiBOb3RlIHRoYXQgb25lIHllYXIgPSAzNjUuMjU2MzYzMDUxIGRheXMgCisJICogQG1vZGVsIGRlZmF1bHQ9IjM2NS4yNTYzNjMwNTEiCisJICovCisJZG91YmxlIGdldE1vZHVsYXRpb25QZXJpb2QoKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5FeGFtcGxlRGlzZWFzZU1vZGVsI2dldE1vZHVsYXRpb25QZXJpb2QgPGVtPk1vZHVsYXRpb24gUGVyaW9kPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2R1bGF0aW9uIFBlcmlvZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TW9kdWxhdGlvblBlcmlvZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TW9kdWxhdGlvblBlcmlvZChkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgbW9kdWxhdGlvbiBwaGFzZSBzaGlmdCBzaGlmdC4gCisJICogQG1vZGVsIGRlZmF1bHQ9IjAuMCIKKwkgKi8KKwlkb3VibGUgZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLkV4YW1wbGVEaXNlYXNlTW9kZWwjZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQgPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNb2R1bGF0aW9uUGhhc2VTaGlmdChkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2Vhc29uYWwgTW9kdWxhdGlvbiBGbG9vcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIwLjYiPC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRmxvb3I8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBGbG9vcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuRXhhbXBsZVBhY2thZ2UjZ2V0RXhhbXBsZURpc2Vhc2VNb2RlbF9TZWFzb25hbE1vZHVsYXRpb25GbG9vcigpCisJICogQG1vZGVsIGRlZmF1bHQ9IjAuNiIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5FeGFtcGxlRGlzZWFzZU1vZGVsI2dldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yIDxlbT5TZWFzb25hbCBNb2R1bGF0aW9uIEZsb29yPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZWFzb25hbCBNb2R1bGF0aW9uIEZsb29yPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRTZWFzb25hbE1vZHVsYXRpb25GbG9vcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoZG91YmxlIHZhbHVlKTsKK30gLy8gRXhhbXBsZURpc2Vhc2VNb2RlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL0V4YW1wbGVGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvRXhhbXBsZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTI0NjI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL0V4YW1wbGVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuRXhhbXBsZVBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBFeGFtcGxlRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUV4YW1wbGVGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLmltcGwuRXhhbXBsZUZhY3RvcnlJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRXhhbXBsZURpc2Vhc2VNb2RlbCBjcmVhdGVFeGFtcGxlRGlzZWFzZU1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogQGdlbmVyYXRlZAorCSAqLworCUV4YW1wbGVQYWNrYWdlIGdldEV4YW1wbGVQYWNrYWdlKCk7CisKK30gLy9FeGFtcGxlRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL0V4YW1wbGVQYWNrYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvRXhhbXBsZVBhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDYxNDdiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL0V4YW1wbGVQYWNrYWdlLmphdmEKQEAgLTAsMCArMSw1MTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLkV4YW1wbGVGYWN0b3J5CisgKiBAbW9kZWwga2luZD0icGFja2FnZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBFeGFtcGxlUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTkFNRSA9ICJleGFtcGxlIjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS5lY29yZSI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZSI7CisKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUV4YW1wbGVQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLmltcGwuRXhhbXBsZVBhY2thZ2VJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuaW1wbC5FeGFtcGxlRGlzZWFzZU1vZGVsSW1wbCA8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLmltcGwuRXhhbXBsZURpc2Vhc2VNb2RlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLmltcGwuRXhhbXBsZVBhY2thZ2VJbXBsI2dldEV4YW1wbGVEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgRVhBTVBMRV9ESVNFQVNFX01PREVMID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX1VSSSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX1RZUEVfVVJJID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRVhBTVBMRV9ESVNFQVNFX01PREVMX19EVUJMSU5fQ09SRSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX0xBQkVMU19UT19VUERBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fTEFCRUxTX1RPX1VQREFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX0dSQVBIID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0dSQVBIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX0VOQUJMRUQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fRU5BQkxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX0dSQVBIX0RFQ09SQVRFRCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX1BST0dSRVNTID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1BST0dSRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYQU1QTEVfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0RJU0VBU0VfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWxhdGl2ZSBUb2xlcmFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX1JFTEFUSVZFX1RPTEVSQU5DRSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXRlIERpZmZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX0ZJTklURV9ESUZGRVJFTkNFID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0ZJTklURV9ESUZGRVJFTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyZXF1ZW5jeSBEZXBlbmRlbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX0ZSRVFVRU5DWV9ERVBFTkRFTlQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIEJpcnRoIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfQklSVEhfUkFURSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYQU1QTEVfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQgUmVjaXByb2NhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYQU1QTEVfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBBcmVhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRVhBTVBMRV9ESVNFQVNFX01PREVMX19UT1RBTF9BUkVBID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX0FSRUE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFBvcHVsYXRpb24gRGVuc2l0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYQU1QTEVfRElTRUFTRV9NT0RFTF9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zbWlzc2lvbiBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRVhBTVBMRV9ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob24gTGluZWFyaXR5IENvZWZmaWNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRVhBTVBMRV9ESVNFQVNFX01PREVMX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX05PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVjb3ZlcnkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYQU1QTEVfRElTRUFTRV9NT0RFTF9fUkVDT1ZFUllfUkFURSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaHlzaWNhbGx5IEFkamFjZW50IEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYQU1QTEVfRElTRUFTRV9NT0RFTF9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT04gPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYQU1QTEVfRElTRUFTRV9NT0RFTF9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTiA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRVhBTVBMRV9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbW11bml0eSBMb3NzIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX0lNTVVOSVRZX0xPU1NfUkFURSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19JTU1VTklUWV9MT1NTX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYQU1QTEVfRElTRUFTRV9NT0RFTF9fU0VFRCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19TRUVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhbmRvbSBHZW5lcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1IgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HYWluPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRVhBTVBMRV9ESVNFQVNFX01PREVMX19HQUlOID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0dBSU47CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYQU1QTEVfRElTRUFTRV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9FWFBPTkVOVCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsYXRpb24gUGVyaW9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRVhBTVBMRV9ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BFUklPRCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEhBU0VfU0hJRlQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWFzb25hbCBNb2R1bGF0aW9uIEZsb29yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRVhBTVBMRV9ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0ZMT09SID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA0OworCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5FeGFtcGxlRGlzZWFzZU1vZGVsIDxlbT5EaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5FeGFtcGxlRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRFeGFtcGxlRGlzZWFzZU1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLkV4YW1wbGVEaXNlYXNlTW9kZWwjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQgPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRXhwb25lbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZWFzb25hbCBNb2R1bGF0aW9uIEV4cG9uZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuRXhhbXBsZURpc2Vhc2VNb2RlbCNnZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCgpCisJICogQHNlZSAjZ2V0RXhhbXBsZURpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RXhhbXBsZURpc2Vhc2VNb2RlbF9TZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5FeGFtcGxlRGlzZWFzZU1vZGVsI2dldE1vZHVsYXRpb25QZXJpb2QgPGVtPk1vZHVsYXRpb24gUGVyaW9kPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW9kdWxhdGlvbiBQZXJpb2Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5FeGFtcGxlRGlzZWFzZU1vZGVsI2dldE1vZHVsYXRpb25QZXJpb2QoKQorCSAqIEBzZWUgI2dldEV4YW1wbGVEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEV4YW1wbGVEaXNlYXNlTW9kZWxfTW9kdWxhdGlvblBlcmlvZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5FeGFtcGxlRGlzZWFzZU1vZGVsI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0IDxlbT5Nb2R1bGF0aW9uIFBoYXNlIFNoaWZ0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW9kdWxhdGlvbiBQaGFzZSBTaGlmdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLkV4YW1wbGVEaXNlYXNlTW9kZWwjZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoKQorCSAqIEBzZWUgI2dldEV4YW1wbGVEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEV4YW1wbGVEaXNlYXNlTW9kZWxfTW9kdWxhdGlvblBoYXNlU2hpZnQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuRXhhbXBsZURpc2Vhc2VNb2RlbCNnZXRTZWFzb25hbE1vZHVsYXRpb25GbG9vciA8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBGbG9vcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRmxvb3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5FeGFtcGxlRGlzZWFzZU1vZGVsI2dldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCkKKwkgKiBAc2VlICNnZXRFeGFtcGxlRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRFeGFtcGxlRGlzZWFzZU1vZGVsX1NlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFeGFtcGxlRmFjdG9yeSBnZXRFeGFtcGxlRmFjdG9yeSgpOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50CisJICogPHVsPgorCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisJICogPC91bD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50ZXJmYWNlIExpdGVyYWxzIHsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5pbXBsLkV4YW1wbGVEaXNlYXNlTW9kZWxJbXBsIDxlbT5EaXNlYXNlIE1vZGVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuaW1wbC5FeGFtcGxlRGlzZWFzZU1vZGVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLmltcGwuRXhhbXBsZVBhY2thZ2VJbXBsI2dldEV4YW1wbGVEaXNlYXNlTW9kZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgRVhBTVBMRV9ESVNFQVNFX01PREVMID0gZUlOU1RBTkNFLmdldEV4YW1wbGVEaXNlYXNlTW9kZWwoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWFzb25hbCBNb2R1bGF0aW9uIEV4cG9uZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRVhBTVBMRV9ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0VYUE9ORU5UID0gZUlOU1RBTkNFLmdldEV4YW1wbGVEaXNlYXNlTW9kZWxfU2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGF0aW9uIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEVYQU1QTEVfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0QgPSBlSU5TVEFOQ0UuZ2V0RXhhbXBsZURpc2Vhc2VNb2RlbF9Nb2R1bGF0aW9uUGVyaW9kKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxhdGlvbiBQaGFzZSBTaGlmdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEVYQU1QTEVfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVCA9IGVJTlNUQU5DRS5nZXRFeGFtcGxlRGlzZWFzZU1vZGVsX01vZHVsYXRpb25QaGFzZVNoaWZ0KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2Vhc29uYWwgTW9kdWxhdGlvbiBGbG9vcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEVYQU1QTEVfRElTRUFTRV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUiA9IGVJTlNUQU5DRS5nZXRFeGFtcGxlRGlzZWFzZU1vZGVsX1NlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCk7CisKKwl9CisKK30gLy9FeGFtcGxlUGFja2FnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL2ltcGwvRXhhbXBsZURpc2Vhc2VNb2RlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS9pbXBsL0V4YW1wbGVEaXNlYXNlTW9kZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ3NTY4MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS9pbXBsL0V4YW1wbGVEaXNlYXNlTW9kZWxJbXBsLmphdmEKQEAgLTAsMCArMSw0ODEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuRXhhbXBsZURpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5FeGFtcGxlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0VJUkxhYmVsVmFsdWVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJUkxhYmVsVmFsdWVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxJbXBsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuaW1wbC5FeGFtcGxlRGlzZWFzZU1vZGVsSW1wbCNnZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCA8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuaW1wbC5FeGFtcGxlRGlzZWFzZU1vZGVsSW1wbCNnZXRNb2R1bGF0aW9uUGVyaW9kIDxlbT5Nb2R1bGF0aW9uIFBlcmlvZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuaW1wbC5FeGFtcGxlRGlzZWFzZU1vZGVsSW1wbCNnZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCA8ZW0+TW9kdWxhdGlvbiBQaGFzZSBTaGlmdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuaW1wbC5FeGFtcGxlRGlzZWFzZU1vZGVsSW1wbCNnZXRTZWFzb25hbE1vZHVsYXRpb25GbG9vciA8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBGbG9vcjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEV4YW1wbGVEaXNlYXNlTW9kZWxJbXBsIGV4dGVuZHMgU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwgaW1wbGVtZW50cyBFeGFtcGxlRGlzZWFzZU1vZGVsIHsKKwkKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKSA8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFNFQVNPTkFMX01PRFVMQVRJT05fRVhQT05FTlRfRURFRkFVTFQgPSAyLjA7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKSA8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgc2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQgPSBTRUFTT05BTF9NT0RVTEFUSU9OX0VYUE9ORU5UX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNb2R1bGF0aW9uUGVyaW9kKCkgPGVtPk1vZHVsYXRpb24gUGVyaW9kPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNb2R1bGF0aW9uUGVyaW9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBNT0RVTEFUSU9OX1BFUklPRF9FREVGQVVMVCA9IDM2NS4yNTYzNjMwNTE7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TW9kdWxhdGlvblBlcmlvZCgpIDxlbT5Nb2R1bGF0aW9uIFBlcmlvZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TW9kdWxhdGlvblBlcmlvZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBtb2R1bGF0aW9uUGVyaW9kID0gTU9EVUxBVElPTl9QRVJJT0RfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkgPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBNT0RVTEFUSU9OX1BIQVNFX1NISUZUX0VERUZBVUxUID0gMC4wOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkgPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIG1vZHVsYXRpb25QaGFzZVNoaWZ0ID0gTU9EVUxBVElPTl9QSEFTRV9TSElGVF9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKSA8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBGbG9vcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFNFQVNPTkFMX01PRFVMQVRJT05fRkxPT1JfRURFRkFVTFQgPSAwLjY7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKSA8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBGbG9vcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgc2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IgPSBTRUFTT05BTF9NT0RVTEFUSU9OX0ZMT09SX0VERUZBVUxUOworCS8qKgorCSAqIGEgZmFsc2UgKEhpZGRlbikgdGltZSBjb3VudGVyIHVzZWQgZm9yIHRoaXMgdG95IGV4YW1wbGUKKwkgKi8KKwkvL3ByaXZhdGUgZG91YmxlIGZhbHNlSGlkZGVuVGltZUV4YW1wbGUgPSAwLjA7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIE1JTExJU19QRVJfREFZID0gMTAwMC4wKjYwLjAqNjAuMCoyNC4wOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBNSUxMSVNfUEVSX1lFQVIgPSBNSUxMSVNfUEVSX0RBWSozNjUuMjU2MzYzMDUxOworCQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgRXhhbXBsZURpc2Vhc2VNb2RlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCS8qKgorCSAqIFRvIGNyZWF0ZSBhIHVzZXIgZGVmaW5lZCAoZXhwZXJpbWVudGFsKSBkaXNlYXNlIG1vZGUsIHRoZSB1c2VyIG1heSB3aXNoIAorCSAqIHRvIGV4dGVuZCB0aGUgZXhpc3RpbmcgbW9kZWxzIGJ1dCBzaW1wbHkgb3ZlcnJpZGUgdHdvIG1ldGhvZHMuCisJICogY29tcHV0ZURpc2Vhc2VEZWx0YXMoKSBzZXRzIHRoZSB3b3JrIGZsb3cgZm9yIHRoZSBtb2RlbC4gVGhlIGZvbGxvd2luZyBleGFtcGxlCisJICogaXMgZGVyaXZlZCBmcm9tIHRoZSBzdGFuZGFyZCBjb2RlIGZvciBhbGwgYnVpbGQgaW4gbW9kZWxzIGJ1dCBpbiB0aGUgbGluZSBiZWxvdworCSAqIHdoZXJlIHdlIGRlZmluZSBmaW5hbCAiZG91YmxlIHRyYW5zbWlzaW9uUmF0ZSIgd2Ugc2hvdyBhbmQgZXhhbXBsZSBtb2RpZmljYXRpb24KKwkgKiB3aGVyZSBhIHBlcmlvZGljIGZvcmNpbmcgZmFjdG9yIHsgc2luKGZyZXEqdCkgfSBpcyBhZGRlZCB0byB0aGUgY29kZSBhcyBhbiBleGFtcGxlCisJICogbW9kaWZpY2F0aW9uLgorCSAqIAorCSAqIEBwYXJhbSB0aW1lCisJICogCQkJICBjdXJyZW50IHRpbWUKKwkgKiBAcGFyYW0gY3VycmVudFN0YXRlCisJICogICAgICAgICAgICB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG9wdWxhdGlvbgorCSAqIEBwYXJhbSBkaXNlYXNlTGFiZWwKKwkgKiAgICAgICAgICAgIHRoZSBkaXNlYXNlIGxhYmVsIGZvciB3aGljaCB0aGUgc3RhdGUgdHJhbnNpdGlvbnMgYXJlIGJlaW5nCisJICogICAgICAgICAgICBjb21wdXRlZC4KKwkgKiBAcGFyYW0gdGltZURlbHRhCisJICogICAgICAgICAgICB0aGUgdGltZSBwZXJpb2QgKG1pbGxpc2Vjb25kcykgb3ZlciB3aGljaCB0aGUgcG9wdWxhdGlvbgorCSAqICAgICAgICAgICAgbWVtYmVycyB0cmFuc2l0aW9uIHRvIG5ldyBzdGF0ZXMgICAgICAgICAgCisJICogQHJldHVybiBhIGRpc2Vhc2Ugc3RhdGUgbGFiZWwgdmFsdWUgdGhhdCBjb250YWlucyB0aGUgbnVtYmVyIG9mCisJICogICAgICAgICBkZWx0YSBjaGFuZ2VzIGluIGVhY2ggZGlzZWFzZSBzdGF0ZQorCSAqIAorCSAqIFVzZXJzIGNhbiBtb2RpZnkgdGhlIG1ldGhvZCBiZWxvdyB0byBjcmVhdGUgdGhlaXIgb3duIG1vZGVsLgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lJbXBsI2NvbXB1dGVEaXNlYXNlRGVsdGFzKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSwKKwkgKiAgICAgIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwsIGxvbmcpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjb21wdXRlRGlzZWFzZURlbHRhcygKKwkJCWZpbmFsIFNURU1UaW1lIHRpbWUsCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY3VycmVudFN0YXRlLAorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTGFiZWwsIGZpbmFsIGxvbmcgdGltZURlbHRhLCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHJldHVyblZhbHVlKSB7CitmaW5hbCBTSVJMYWJlbFZhbHVlIGN1cnJlbnRTSVIgPSAoU0lSTGFiZWxWYWx1ZSkgY3VycmVudFN0YXRlOworCQkKKwkJZG91YmxlIGN1cnJlbnRNaWxsaXMgPSB0aW1lLmdldFRpbWUoKS5nZXRUaW1lKCk7CisJCWRvdWJsZSBzZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCA9IGdldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KCk7CisJCWRvdWJsZSBzZWFzb25hbE1vZHVsYXRpb25GbG9vciA9IGdldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCk7CisJCWRvdWJsZSBwaGFzZSA9IGdldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCk7CQorCQlkb3VibGUgbW9kdWxhdGlvbiA9IHNlYXNvbmFsTW9kdWxhdGlvbkZsb29yICsgKDEtc2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IpKk1hdGgucG93KE1hdGguYWJzKE1hdGguc2luKHBoYXNlICsgTWF0aC5QSSpjdXJyZW50TWlsbGlzLyhnZXRNb2R1bGF0aW9uUGVyaW9kKCkqTUlMTElTX1BFUl9EQVkpKSksIHNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KTsKKwkJCisJCS8vIFRoaXMgaXMgYmV0YSoKKwkJZG91YmxlIHRyYW5zbWlzc2lvblJhdGUgPSBtb2R1bGF0aW9uICogKGdldEFkanVzdGVkVHJhbnNtaXNzaW9uUmF0ZSh0aW1lRGVsdGEpKTsKKworCQlpZighdGhpcy5pc0ZyZXF1ZW5jeURlcGVuZGVudCgpKSAgdHJhbnNtaXNzaW9uUmF0ZSAqPSBnZXRUcmFuc21pc3Npb25SYXRlU2NhbGVGYWN0b3IoZGlzZWFzZUxhYmVsKTsKKwkJCisJCS8vIFRoZSBlZmZlY3RpdmUgSW5mZWN0aW91cyBwb3B1bGF0aW9uICBpcyBhIGRpbWVuc2lvbmxlcyBudW1iZXIgbm9ybWFsaXplIGJ5IHRvdGFsCisJCS8vIHBvcHVsYXRpb24gdXNlZCBpbiB0ZWggY29tcHV0YXRpb24gb2YgYmV0cypTKmkgd2hlcmUgaSA9IEllZmZlY3RpdmUvUG9wLgorCQkvLyBUaGlzIGluY2x1ZGVzIGEgY29ycmVjdGlvbiB0byB0aGUgY3VycmVudAorCQkvLyBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gKEllZmZlY3RpdmUpIGJhc2VkIG9uIHRoZSBjb25zZXJ2ZWQgZXhjaGFuZ2Ugb2YgcGVvcGxlIChjaXJjdWxhdGlvbikKKwkJLy8gYmV0d2VlbiByZWdpb25zLiBOb3RlIHRoYXQgdGhpcyBpcyBubyB0aGUgImFycml2YWxzIiBhbmQgImRlcGFydHVyZXMiIHdoaWNoIGFyZQorCQkvLyBhIGRpZmZlcmVudCBwcm9jZXNzLgorCQlmaW5hbCBkb3VibGUgZWZmZWN0aXZlSW5mZWN0aW91cyA9IGdldE5vcm1hbGl6ZWRFZmZlY3RpdmVJbmZlY3Rpb3VzKGRpc2Vhc2VMYWJlbC5nZXROb2RlKCksIGRpc2Vhc2VMYWJlbCwgY3VycmVudFNJUi5nZXRJKCkpOworCisJCS8qCisJCSAqIENvbXB1dGUgc3RhdGUgdHJhbnNpdGlvbnMKKwkJICogCisJCSAqIFJlZ2FyZGluZyBjb21wdXRpbmcgdGhlIG51bWJlciBvZiB0cmFuc2l0aW9ucyBmcm9tIFN1c2NlcHRpYmxlIHRvIEV4cG9zZWQ6CisJCSAqIEluIGEgbGluZWFyIG1vZGVsIHRoZSAiZWZmZWN0aXZlIiBudW1iZXIgb2YgaW5mZWN0aW91cyBwZW9wbGUgaXMganVzdAorCQkgKiB0aGUgbnVtYmVyIG9mIGluZmVjdGlvdXMgcGVvcGxlIEluIGEgbm9ubGluZWFyIG1vZGVsIHdlIGhhdmUgYQorCQkgKiBub25MaW5lYXJpdHkgZXhwb25lbnQgdGhhdCBpcyA+IDEgdGhpcyBtb2RlbHMgdGhlIGVmZmVjdCBvZiBpbW11bmUKKwkJICogc3lzdGVtIHNhdHVyYXRpb24gd2hlbiBTdXNjZXB0aWJsZSBwZW9wbGUgYXJlIGV4cG9zZWQgdG8gbGFyZ2UKKwkJICogbnVtYmVycyBvZiBpbmZlY3Rpb3VzIHBlb3BsZS4gdGhlbiB0aGUgImVmZmVjdGl2ZSIgbnVtYmVyIG9mCisJCSAqIGluZmVjdGlvdXMgcGVvcGxlIGlzIElebm9uTGluZWFyaXR5IGV4cG9uZW50IHRvIGFsbG93IGZvciBlaXRoZXIKKwkJICogbGluZWFyIG9yIG5vbmxpbmVhciBtb2RlbHMgd2UgYWx3YXlzIGNhbGN1bGF0ZSBJXm5vbkxpbmVhcml0eQorCQkgKiBleHBvbmVudCBhbmQgYWxsb3cgbm9uTGluZWFyaXR5IGV4cG9uZW50ID49IDEuMAorCQkgKi8KKwkJZG91YmxlIG51bWJlck9mSW5mZWN0ZWRUb1JlY292ZXJlZCA9IGdldEFkanVzdGVkUmVjb3ZlcnlSYXRlKHRpbWVEZWx0YSkKKwkJKiBjdXJyZW50U0lSLmdldEkoKTsKKwkJZG91YmxlIG51bWJlck9mUmVjb3ZlcmVkVG9TdXNjZXB0aWJsZSA9IGdldEFkanVzdGVkSW1tdW5pdHlMb3NzUmF0ZSh0aW1lRGVsdGEpCisJCSogY3VycmVudFNJUi5nZXRSKCk7CisJCS8vIE5lZWQgdG8gY2hlY2tlZCB3aGF0IGRvIGRvIGhlcmUuIElmIG5vbiBsaW5lYXIgY29lZmZpY2llbnQgaXMgbm90IDEgYW5kCisJCS8vIHRoZSBlZmZlY3RpdmUgaW5mZWN0aW91cyBpcyBuZWdhdGl2ZSAod2hpY2ggaXMgcG9zc2libGUpLCB3aGF0IGRvIGRvPyAKKwkJLy8gTGV0J3MgZmFsbCBiYWNrIG9uIHRoZSBsaW5lYXIgbWV0aG9kIGZvciBub3cuCisJCWRvdWJsZSBudW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZCA9IDAuMDsKKwkJaWYoZ2V0Tm9uTGluZWFyaXR5Q29lZmZpY2llbnQoKSAhPSAxLjAgJiYgZWZmZWN0aXZlSW5mZWN0aW91cyA+PSAwLjApCisJCQludW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZCA9IHRyYW5zbWlzc2lvblJhdGUKKwkJCSogY3VycmVudFNJUi5nZXRTKCkqIE1hdGgucG93KGVmZmVjdGl2ZUluZmVjdGlvdXMsIGdldE5vbkxpbmVhcml0eUNvZWZmaWNpZW50KCkpOworCQllbHNlCisJCQludW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZCA9IHRyYW5zbWlzc2lvblJhdGUKKwkJCSogY3VycmVudFNJUi5nZXRTKCkqIGVmZmVjdGl2ZUluZmVjdGlvdXM7CisJCQorCQkvLyBEZXRlcm1pbmUgZGVsdGEgUworCQlmaW5hbCBkb3VibGUgZGVsdGFTID0gbnVtYmVyT2ZSZWNvdmVyZWRUb1N1c2NlcHRpYmxlIC0gbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQ7CisJCQkvLyBEZXRlcm1pbmUgZGVsdGEgSQorCQlmaW5hbCBkb3VibGUgZGVsdGFJID0gbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQtIG51bWJlck9mSW5mZWN0ZWRUb1JlY292ZXJlZDsKKwkJLy8gRGV0ZXJtaW5lIGRlbHRhIFIKKwkJZmluYWwgZG91YmxlIGRlbHRhUiA9IG51bWJlck9mSW5mZWN0ZWRUb1JlY292ZXJlZCAtIG51bWJlck9mUmVjb3ZlcmVkVG9TdXNjZXB0aWJsZTsKKwkJCisJCVNJUkxhYmVsVmFsdWVJbXBsIHJldCA9IChTSVJMYWJlbFZhbHVlSW1wbClyZXR1cm5WYWx1ZTsKKwkJcmV0LnNldFMoZGVsdGFTKTsKKwkJcmV0LnNldEkoZGVsdGFJKTsKKwkJcmV0LnNldEluY2lkZW5jZShudW1iZXJPZkluZmVjdGVkVG9SZWNvdmVyZWQpOworCQlyZXQuc2V0UihkZWx0YVIpOworCQlyZXQuc2V0RGlzZWFzZURlYXRocygwKTsKKwkJcmV0dXJuIHJldDsKKwkJCisJfSAvLyBjb21wdXRlVHJhbnNpdGlvbnMKKworCQorCQorCS8qKgorCSAqIE1vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyBmb3IgYSBTdG9jaGFzdGljIG1vZGVsIGFkZHMgbm9pc2UgdG8gb3IgYWRqdXN0cyAKKwkgKiB0aGUgZGlzZWFzZSBzdGF0ZSB0cmFuc2l0aW9uIHZhbHVlcyBieSBtdWx0aXBseWluZworCSAqIHRoZSBhZGRpdGlvbnMgYnkgYSByYW5kb20gdmFyaWFibGUgciB+ICgxKy8teCkgd2l0aCB4IHNtYWxsLgorCSAqIFRoZSByZXF1aXJlbWVudHMgdGhhdCBubyBtb3JlIGluZGl2aWR1YWxzIGNhbiBiZSBtb3ZlZCBmcm9tIGEgc3RhdGUgdGhhbiBhcmUKKwkgKiBhbHJlYWR5IGluIHRoYXQgc3RhdGUgaXMgc3RpbGwgZW5mb3JjZWQuCisJICogCisJICovCisJcHVibGljIHZvaWQgZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgc3RhdGUpIHsKKwkJCWZpbmFsIFNJTGFiZWxWYWx1ZSBjdXJyZW50U0kgPSAoU0lMYWJlbFZhbHVlKSBzdGF0ZTsKKwkJCWRvdWJsZSBvbGRJID0gY3VycmVudFNJLmdldEkoKTsKKwkJCWRvdWJsZSBJbm9pc3kgPSBjdXJyZW50U0kuZ2V0SSgpKiBjb21wdXRlTm9pc2UoKTsKKwkJCWRvdWJsZSBjaGFuZ2UgPSBvbGRJLUlub2lzeTsKKwkJCWN1cnJlbnRTSS5zZXRJKElub2lzeSk7CisJCQlkb3VibGUgbmV3UyA9IGN1cnJlbnRTSS5nZXRTKCkgKyBjaGFuZ2U7CisJCQlpZihuZXdTIDwgMC4wKSB7CisJCQkJLy8gTmVlZCB0byByZXNjYWxlCisJCQkJZG91YmxlIHNjYWxlID0gKGN1cnJlbnRTSS5nZXRTKCkgKyBuZXdTKSAvIGN1cnJlbnRTSS5nZXRTKCk7CisJCQkJY3VycmVudFNJLnNldEkoSW5vaXN5KnNjYWxlKTsKKwkJCX0gZWxzZSAgY3VycmVudFNJLnNldFMobmV3Uyk7CisJCQlyZXR1cm47CisJfSAvLyBkb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cworCQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBFeGFtcGxlUGFja2FnZS5MaXRlcmFscy5FWEFNUExFX0RJU0VBU0VfTU9ERUw7CisJfQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KCkgeworCQlyZXR1cm4gc2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQ7CisJfQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudChkb3VibGUgbmV3U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQpIHsKKwkJZG91YmxlIG9sZFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50ID0gc2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQ7CisJCXNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50ID0gbmV3U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEV4YW1wbGVQYWNrYWdlLkVYQU1QTEVfRElTRUFTRV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9FWFBPTkVOVCwgb2xkU2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQsIHNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KSk7CisJfQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE1vZHVsYXRpb25QZXJpb2QoKSB7CisJCXJldHVybiBtb2R1bGF0aW9uUGVyaW9kOworCX0KKworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TW9kdWxhdGlvblBlcmlvZChkb3VibGUgbmV3TW9kdWxhdGlvblBlcmlvZCkgeworCQlkb3VibGUgb2xkTW9kdWxhdGlvblBlcmlvZCA9IG1vZHVsYXRpb25QZXJpb2Q7CisJCW1vZHVsYXRpb25QZXJpb2QgPSBuZXdNb2R1bGF0aW9uUGVyaW9kOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFeGFtcGxlUGFja2FnZS5FWEFNUExFX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9ELCBvbGRNb2R1bGF0aW9uUGVyaW9kLCBtb2R1bGF0aW9uUGVyaW9kKSk7CisJfQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkgeworCQlyZXR1cm4gbW9kdWxhdGlvblBoYXNlU2hpZnQ7CisJfQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNb2R1bGF0aW9uUGhhc2VTaGlmdChkb3VibGUgbmV3TW9kdWxhdGlvblBoYXNlU2hpZnQpIHsKKwkJZG91YmxlIG9sZE1vZHVsYXRpb25QaGFzZVNoaWZ0ID0gbW9kdWxhdGlvblBoYXNlU2hpZnQ7CisJCW1vZHVsYXRpb25QaGFzZVNoaWZ0ID0gbmV3TW9kdWxhdGlvblBoYXNlU2hpZnQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEV4YW1wbGVQYWNrYWdlLkVYQU1QTEVfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVCwgb2xkTW9kdWxhdGlvblBoYXNlU2hpZnQsIG1vZHVsYXRpb25QaGFzZVNoaWZ0KSk7CisJfQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCkgeworCQlyZXR1cm4gc2Vhc29uYWxNb2R1bGF0aW9uRmxvb3I7CisJfQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWFzb25hbE1vZHVsYXRpb25GbG9vcihkb3VibGUgbmV3U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IpIHsKKwkJZG91YmxlIG9sZFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yID0gc2Vhc29uYWxNb2R1bGF0aW9uRmxvb3I7CisJCXNlYXNvbmFsTW9kdWxhdGlvbkZsb29yID0gbmV3U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3I7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEV4YW1wbGVQYWNrYWdlLkVYQU1QTEVfRElTRUFTRV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUiwgb2xkU2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IsIHNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKSk7CisJfQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEV4YW1wbGVQYWNrYWdlLkVYQU1QTEVfRElTRUFTRV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9FWFBPTkVOVDoKKwkJCQlyZXR1cm4gbmV3IERvdWJsZShnZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCgpKTsKKwkJCWNhc2UgRXhhbXBsZVBhY2thZ2UuRVhBTVBMRV9ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BFUklPRDoKKwkJCQlyZXR1cm4gbmV3IERvdWJsZShnZXRNb2R1bGF0aW9uUGVyaW9kKCkpOworCQkJY2FzZSBFeGFtcGxlUGFja2FnZS5FWEFNUExFX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEhBU0VfU0hJRlQ6CisJCQkJcmV0dXJuIG5ldyBEb3VibGUoZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoKSk7CisJCQljYXNlIEV4YW1wbGVQYWNrYWdlLkVYQU1QTEVfRElTRUFTRV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUjoKKwkJCQlyZXR1cm4gbmV3IERvdWJsZShnZXRTZWFzb25hbE1vZHVsYXRpb25GbG9vcigpKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEV4YW1wbGVQYWNrYWdlLkVYQU1QTEVfRElTRUFTRV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9FWFBPTkVOVDoKKwkJCQlzZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCgoKERvdWJsZSluZXdWYWx1ZSkuZG91YmxlVmFsdWUoKSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFeGFtcGxlUGFja2FnZS5FWEFNUExFX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EOgorCQkJCXNldE1vZHVsYXRpb25QZXJpb2QoKChEb3VibGUpbmV3VmFsdWUpLmRvdWJsZVZhbHVlKCkpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRXhhbXBsZVBhY2thZ2UuRVhBTVBMRV9ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZUOgorCQkJCXNldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCgoRG91YmxlKW5ld1ZhbHVlKS5kb3VibGVWYWx1ZSgpKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEV4YW1wbGVQYWNrYWdlLkVYQU1QTEVfRElTRUFTRV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUjoKKwkJCQlzZXRTZWFzb25hbE1vZHVsYXRpb25GbG9vcigoKERvdWJsZSluZXdWYWx1ZSkuZG91YmxlVmFsdWUoKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFeGFtcGxlUGFja2FnZS5FWEFNUExFX0RJU0VBU0VfTU9ERUxfX1NFQVNPTkFMX01PRFVMQVRJT05fRVhQT05FTlQ6CisJCQkJc2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoU0VBU09OQUxfTU9EVUxBVElPTl9FWFBPTkVOVF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFeGFtcGxlUGFja2FnZS5FWEFNUExFX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EOgorCQkJCXNldE1vZHVsYXRpb25QZXJpb2QoTU9EVUxBVElPTl9QRVJJT0RfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRXhhbXBsZVBhY2thZ2UuRVhBTVBMRV9ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZUOgorCQkJCXNldE1vZHVsYXRpb25QaGFzZVNoaWZ0KE1PRFVMQVRJT05fUEhBU0VfU0hJRlRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRXhhbXBsZVBhY2thZ2UuRVhBTVBMRV9ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0ZMT09SOgorCQkJCXNldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKFNFQVNPTkFMX01PRFVMQVRJT05fRkxPT1JfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEV4YW1wbGVQYWNrYWdlLkVYQU1QTEVfRElTRUFTRV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9FWFBPTkVOVDoKKwkJCQlyZXR1cm4gc2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQgIT0gU0VBU09OQUxfTU9EVUxBVElPTl9FWFBPTkVOVF9FREVGQVVMVDsKKwkJCWNhc2UgRXhhbXBsZVBhY2thZ2UuRVhBTVBMRV9ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BFUklPRDoKKwkJCQlyZXR1cm4gbW9kdWxhdGlvblBlcmlvZCAhPSBNT0RVTEFUSU9OX1BFUklPRF9FREVGQVVMVDsKKwkJCWNhc2UgRXhhbXBsZVBhY2thZ2UuRVhBTVBMRV9ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZUOgorCQkJCXJldHVybiBtb2R1bGF0aW9uUGhhc2VTaGlmdCAhPSBNT0RVTEFUSU9OX1BIQVNFX1NISUZUX0VERUZBVUxUOworCQkJY2FzZSBFeGFtcGxlUGFja2FnZS5FWEFNUExFX0RJU0VBU0VfTU9ERUxfX1NFQVNPTkFMX01PRFVMQVRJT05fRkxPT1I6CisJCQkJcmV0dXJuIHNlYXNvbmFsTW9kdWxhdGlvbkZsb29yICE9IFNFQVNPTkFMX01PRFVMQVRJT05fRkxPT1JfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtb2R1bGF0aW9uUGVyaW9kOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKG1vZHVsYXRpb25QZXJpb2QpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1vZHVsYXRpb25QaGFzZVNoaWZ0OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKG1vZHVsYXRpb25QaGFzZVNoaWZ0KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBzZWFzb25hbE1vZHVsYXRpb25GbG9vcjogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChzZWFzb25hbE1vZHVsYXRpb25GbG9vcik7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0V4YW1wbGVEaXNlYXNlTW9kZWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvaW1wbC9FeGFtcGxlRmFjdG9yeUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS9pbXBsL0V4YW1wbGVGYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDI4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvaW1wbC9FeGFtcGxlRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLio7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRXhhbXBsZUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgRXhhbXBsZUZhY3RvcnkgeworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEV4YW1wbGVGYWN0b3J5IGluaXQoKSB7CisJCXRyeSB7CisJCQlFeGFtcGxlRmFjdG9yeSB0aGVFeGFtcGxlRmFjdG9yeSA9IChFeGFtcGxlRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS5lY29yZSIpOyAvLyROT04tTkxTLTEkIAorCQkJaWYgKHRoZUV4YW1wbGVGYWN0b3J5ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdGhlRXhhbXBsZUZhY3Rvcnk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXJldHVybiBuZXcgRXhhbXBsZUZhY3RvcnlJbXBsKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXhhbXBsZUZhY3RvcnlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7CisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIEV4YW1wbGVQYWNrYWdlLkVYQU1QTEVfRElTRUFTRV9NT0RFTDogcmV0dXJuIGNyZWF0ZUV4YW1wbGVEaXNlYXNlTW9kZWwoKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXhhbXBsZURpc2Vhc2VNb2RlbCBjcmVhdGVFeGFtcGxlRGlzZWFzZU1vZGVsKCkgeworCQlFeGFtcGxlRGlzZWFzZU1vZGVsSW1wbCBleGFtcGxlRGlzZWFzZU1vZGVsID0gbmV3IEV4YW1wbGVEaXNlYXNlTW9kZWxJbXBsKCk7CisJCXJldHVybiBleGFtcGxlRGlzZWFzZU1vZGVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFeGFtcGxlUGFja2FnZSBnZXRFeGFtcGxlUGFja2FnZSgpIHsKKwkJcmV0dXJuIChFeGFtcGxlUGFja2FnZSlnZXRFUGFja2FnZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGRlcHJlY2F0ZWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQERlcHJlY2F0ZWQKKwlwdWJsaWMgc3RhdGljIEV4YW1wbGVQYWNrYWdlIGdldFBhY2thZ2UoKSB7CisJCXJldHVybiBFeGFtcGxlUGFja2FnZS5lSU5TVEFOQ0U7CisJfQorCit9IC8vRXhhbXBsZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvaW1wbC9FeGFtcGxlUGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS9pbXBsL0V4YW1wbGVQYWNrYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZGUyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvaW1wbC9FeGFtcGxlUGFja2FnZUltcGwuamF2YQpAQCAtMCwwICsxLDI0NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc1BhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5FeGFtcGxlRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLkV4YW1wbGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLkV4YW1wbGVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFeGFtcGxlUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBFeGFtcGxlUGFja2FnZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZXhhbXBsZURpc2Vhc2VNb2RlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKKwkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KKwkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCisJICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKKwkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5FeGFtcGxlUGFja2FnZSNlTlNfVVJJCisJICogQHNlZSAjaW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRXhhbXBsZVBhY2thZ2VJbXBsKCkgeworCQlzdXBlcihlTlNfVVJJLCBFeGFtcGxlRmFjdG9yeS5lSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcworCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCisJICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKKwkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKKwkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCisJICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KKwkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCisJICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCisJICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgorCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55CisJICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KKwkgKiB0aG9zZSBvZiBhbm90aGVyLgorCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKKwkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNlTlNfVVJJCisJICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBFeGFtcGxlUGFja2FnZSBpbml0KCkgeworCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoRXhhbXBsZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRXhhbXBsZVBhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQorCQlFeGFtcGxlUGFja2FnZUltcGwgdGhlRXhhbXBsZVBhY2thZ2UgPSAoRXhhbXBsZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEV4YW1wbGVQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEV4YW1wbGVQYWNrYWdlSW1wbCgpKTsKKworCQlpc0luaXRlZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCisJCVN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisKKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKKwkJdGhlRXhhbXBsZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQorCQl0aGVFeGFtcGxlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAorCQl0aGVFeGFtcGxlUGFja2FnZS5mcmVlemUoKTsKKworCQlyZXR1cm4gdGhlRXhhbXBsZVBhY2thZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRFeGFtcGxlRGlzZWFzZU1vZGVsKCkgeworCQlyZXR1cm4gZXhhbXBsZURpc2Vhc2VNb2RlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeGFtcGxlRGlzZWFzZU1vZGVsX1NlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXhhbXBsZURpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4YW1wbGVEaXNlYXNlTW9kZWxfTW9kdWxhdGlvblBlcmlvZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWV4YW1wbGVEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeGFtcGxlRGlzZWFzZU1vZGVsX01vZHVsYXRpb25QaGFzZVNoaWZ0KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXhhbXBsZURpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4YW1wbGVEaXNlYXNlTW9kZWxfU2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlleGFtcGxlRGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4YW1wbGVGYWN0b3J5IGdldEV4YW1wbGVGYWN0b3J5KCkgeworCQlyZXR1cm4gKEV4YW1wbGVGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKKwkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47CisJCWlzQ3JlYXRlZCA9IHRydWU7CisKKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCisJCWV4YW1wbGVEaXNlYXNlTW9kZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVhBTVBMRV9ESVNFQVNFX01PREVMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShleGFtcGxlRGlzZWFzZU1vZGVsRUNsYXNzLCBFWEFNUExFX0RJU0VBU0VfTU9ERUxfX1NFQVNPTkFMX01PRFVMQVRJT05fRVhQT05FTlQpOworCQljcmVhdGVFQXR0cmlidXRlKGV4YW1wbGVEaXNlYXNlTW9kZWxFQ2xhc3MsIEVYQU1QTEVfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0QpOworCQljcmVhdGVFQXR0cmlidXRlKGV4YW1wbGVEaXNlYXNlTW9kZWxFQ2xhc3MsIEVYQU1QTEVfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZXhhbXBsZURpc2Vhc2VNb2RlbEVDbGFzcywgRVhBTVBMRV9ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0ZMT09SKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOworCisJLyoqCisJICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKKwkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47CisJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgcGFja2FnZQorCQlzZXROYW1lKGVOQU1FKTsKKwkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7CisJCXNldE5zVVJJKGVOU19VUkkpOworCisJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKKwkJU3RhbmRhcmRQYWNrYWdlIHRoZVN0YW5kYXJkUGFja2FnZSA9IChTdGFuZGFyZFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU3RhbmRhcmRQYWNrYWdlLmVOU19VUkkpOworCQlFY29yZVBhY2thZ2UgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycworCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycworCisJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJZXhhbXBsZURpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVTdGFuZGFyZFBhY2thZ2UuZ2V0U3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCgpKTsKKworCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycworCQlpbml0RUNsYXNzKGV4YW1wbGVEaXNlYXNlTW9kZWxFQ2xhc3MsIEV4YW1wbGVEaXNlYXNlTW9kZWwuY2xhc3MsICJFeGFtcGxlRGlzZWFzZU1vZGVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEV4YW1wbGVEaXNlYXNlTW9kZWxfU2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50IiwgIjIuMCIsIDAsIDEsIEV4YW1wbGVEaXNlYXNlTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RUF0dHJpYnV0ZShnZXRFeGFtcGxlRGlzZWFzZU1vZGVsX01vZHVsYXRpb25QZXJpb2QoKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgIm1vZHVsYXRpb25QZXJpb2QiLCAiMzY1LjI1NjM2MzA1MSIsIDAsIDEsIEV4YW1wbGVEaXNlYXNlTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RUF0dHJpYnV0ZShnZXRFeGFtcGxlRGlzZWFzZU1vZGVsX01vZHVsYXRpb25QaGFzZVNoaWZ0KCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJtb2R1bGF0aW9uUGhhc2VTaGlmdCIsICIwLjAiLCAwLCAxLCBFeGFtcGxlRGlzZWFzZU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXhhbXBsZURpc2Vhc2VNb2RlbF9TZWFzb25hbE1vZHVsYXRpb25GbG9vcigpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAic2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IiLCAiMC42IiwgMCwgMSwgRXhhbXBsZURpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJLy8gQ3JlYXRlIHJlc291cmNlCisJCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCX0KKworfSAvL0V4YW1wbGVQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL3Byb3ZpZGVyL0V4YW1wbGVEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS9wcm92aWRlci9FeGFtcGxlRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlMTlmNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS9wcm92aWRlci9FeGFtcGxlRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyNTMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5FeGFtcGxlRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLkV4YW1wbGVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5FeGFtcGxlRGlzZWFzZU1vZGVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFeGFtcGxlRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFeGFtcGxlRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRNb2R1bGF0aW9uUGVyaW9kUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRNb2R1bGF0aW9uUGhhc2VTaGlmdFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkU2Vhc29uYWxNb2R1bGF0aW9uRmxvb3JQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlYXNvbmFsIE1vZHVsYXRpb24gRXhwb25lbnQgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0V4YW1wbGVEaXNlYXNlTW9kZWxfc2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRXhhbXBsZURpc2Vhc2VNb2RlbF9zZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudF9mZWF0dXJlIiwgIl9VSV9FeGFtcGxlRGlzZWFzZU1vZGVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgRXhhbXBsZVBhY2thZ2UuTGl0ZXJhbHMuRVhBTVBMRV9ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0VYUE9ORU5ULAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNb2R1bGF0aW9uIFBlcmlvZCBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZE1vZHVsYXRpb25QZXJpb2RQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9FeGFtcGxlRGlzZWFzZU1vZGVsX21vZHVsYXRpb25QZXJpb2RfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRXhhbXBsZURpc2Vhc2VNb2RlbF9tb2R1bGF0aW9uUGVyaW9kX2ZlYXR1cmUiLCAiX1VJX0V4YW1wbGVEaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBFeGFtcGxlUGFja2FnZS5MaXRlcmFscy5FWEFNUExFX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9ELAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNb2R1bGF0aW9uIFBoYXNlIFNoaWZ0IGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkTW9kdWxhdGlvblBoYXNlU2hpZnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9FeGFtcGxlRGlzZWFzZU1vZGVsX21vZHVsYXRpb25QaGFzZVNoaWZ0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0V4YW1wbGVEaXNlYXNlTW9kZWxfbW9kdWxhdGlvblBoYXNlU2hpZnRfZmVhdHVyZSIsICJfVUlfRXhhbXBsZURpc2Vhc2VNb2RlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIEV4YW1wbGVQYWNrYWdlLkxpdGVyYWxzLkVYQU1QTEVfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVCwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2Vhc29uYWwgTW9kdWxhdGlvbiBGbG9vciBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRXhhbXBsZURpc2Vhc2VNb2RlbF9zZWFzb25hbE1vZHVsYXRpb25GbG9vcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FeGFtcGxlRGlzZWFzZU1vZGVsX3NlYXNvbmFsTW9kdWxhdGlvbkZsb29yX2ZlYXR1cmUiLCAiX1VJX0V4YW1wbGVEaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBFeGFtcGxlUGFja2FnZS5MaXRlcmFscy5FWEFNUExFX0RJU0VBU0VfTU9ERUxfX1NFQVNPTkFMX01PRFVMQVRJT05fRkxPT1IsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIEV4YW1wbGVEaXNlYXNlTW9kZWwuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRXhhbXBsZURpc2Vhc2VNb2RlbCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChFeGFtcGxlRGlzZWFzZU1vZGVsKW9iamVjdCkuZ2V0VVJJKCkubGFzdFNlZ21lbnQoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9FeGFtcGxlRGlzZWFzZU1vZGVsX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoRXhhbXBsZURpc2Vhc2VNb2RlbClvYmplY3QpLmdldERpc2Vhc2VOYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfRXhhbXBsZURpc2Vhc2VNb2RlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9FeGFtcGxlRGlzZWFzZU1vZGVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisJCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRXhhbXBsZURpc2Vhc2VNb2RlbC5jbGFzcykpIHsKKwkJCWNhc2UgRXhhbXBsZVBhY2thZ2UuRVhBTVBMRV9ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0VYUE9ORU5UOgorCQkJY2FzZSBFeGFtcGxlUGFja2FnZS5FWEFNUExFX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EOgorCQkJY2FzZSBFeGFtcGxlUGFja2FnZS5FWEFNUExFX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEhBU0VfU0hJRlQ6CisJCQljYXNlIEV4YW1wbGVQYWNrYWdlLkVYQU1QTEVfRElTRUFTRV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUjoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gRXhhbXBsZUVkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvcHJvdmlkZXIvRXhhbXBsZUVkaXRQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS9wcm92aWRlci9FeGFtcGxlRWRpdFBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NjM4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvcHJvdmlkZXIvRXhhbXBsZUVkaXRQbHVnaW4uamF2YQpAQCAtMCwwICsxLDExMiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuRWNsaXBzZVVJUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcm92aWRlci5EZWZpbml0aW9uc0VkaXRQbHVnaW47CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlci5EZWZpbml0aW9uc0VkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLkRpc2Vhc2Vtb2RlbHNFZGl0UGx1Z2luOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgRXhhbXBsZSBlZGl0IHBsdWdpbi4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEV4YW1wbGVFZGl0UGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIHsKKwkvKioKKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBFeGFtcGxlRWRpdFBsdWdpbiBJTlNUQU5DRSA9IG5ldyBFeGFtcGxlRWRpdFBsdWdpbigpOworCQorCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgRXhhbXBsZUVkaXRQbHVnaW4oKSB7CisJCXN1cGVyCisJCQkobmV3IFJlc291cmNlTG9jYXRvciBbXSB7CisJCQkJRGlzZWFzZW1vZGVsc0VkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCQkJQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCQkJLy9FY29yZUVkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCQkJRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkJfSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlBsdWdpbjwvYj4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbiBleHRlbmRzIEVjbGlwc2VQbHVnaW4geworCQkvKioKKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgeworCQkJc3VwZXIoKTsKKworCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4KKwkJCS8vCisJCQlwbHVnaW4gPSB0aGlzOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvcHJvdmlkZXIvRXhhbXBsZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvcHJvdmlkZXIvRXhhbXBsZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1OGQxNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS9wcm92aWRlci9FeGFtcGxlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDIwOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLnV0aWwuRXhhbXBsZUFkYXB0ZXJGYWN0b3J5OworCisvKioKKyAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4KKyAqIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LgorICogVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4KKyAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEV4YW1wbGVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEV4YW1wbGVBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXhhbXBsZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgeworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5FeGFtcGxlRGlzZWFzZU1vZGVsfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEV4YW1wbGVEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgZXhhbXBsZURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5FeGFtcGxlRGlzZWFzZU1vZGVsfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeGFtcGxlRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJaWYgKGV4YW1wbGVEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJZXhhbXBsZURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciA9IG5ldyBFeGFtcGxlRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGV4YW1wbGVEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7CisJCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOworCX0KKworCS8qKgorCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKKwkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7CisJCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgeworCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgeworCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOworCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzczw/Pil0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgeworCQkJCXJldHVybiBhZGFwdGVyOworCQkJfQorCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKKwkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9IGFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisKKwkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKKwkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGRpc3Bvc2VzIGFsbCBvZiB0aGUgaXRlbSBwcm92aWRlcnMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkuIAorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWlmIChleGFtcGxlRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyICE9IG51bGwpIGV4YW1wbGVEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL3V0aWwvRXhhbXBsZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvdXRpbC9FeGFtcGxlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDllOTA4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL3V0aWwvRXhhbXBsZUFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzOTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuRXhhbXBsZVBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEV4YW1wbGVBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgRXhhbXBsZVBhY2thZ2UgbW9kZWxQYWNrYWdlOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFeGFtcGxlQWRhcHRlckZhY3RvcnkoKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gRXhhbXBsZVBhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgeworCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKKwkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBFeGFtcGxlU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0KKwkJbmV3IEV4YW1wbGVTd2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFeGFtcGxlRGlzZWFzZU1vZGVsKEV4YW1wbGVEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUV4YW1wbGVEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyA8VD4gQWRhcHRlciBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGVjb3JhdG9yKERlY29yYXRvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGVjb3JhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTm9kZURlY29yYXRvcihOb2RlRGVjb3JhdG9yIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVOb2RlRGVjb3JhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU2FuaXR5Q2hlY2tlcihTYW5pdHlDaGVja2VyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTYW5pdHlDaGVja2VyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTW9kaWZpYWJsZShNb2RpZmlhYmxlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVNb2RpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGlzZWFzZU1vZGVsKERpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGlzZWFzZU1vZGVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSW50ZWdyYXRpb25EZWNvcmF0b3IoSW50ZWdyYXRpb25EZWNvcmF0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUludGVncmF0aW9uRGVjb3JhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3RhbmRhcmREaXNlYXNlTW9kZWwoU3RhbmRhcmREaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0YW5kYXJkRGlzZWFzZU1vZGVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU0koU0kgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNJQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU0lSKFNJUiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU0lSQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbChTdG9jaGFzdGljRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTdG9jaGFzdGljRGlzZWFzZU1vZGVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKFN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbChTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworCQkJfQorCQl9OworCisJLyoqCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLkV4YW1wbGVEaXNlYXNlTW9kZWwgPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuRXhhbXBsZURpc2Vhc2VNb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeGFtcGxlRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLmxhbmcuQ29tcGFyYWJsZSA8ZW0+Q29tcGFyYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvciA8ZW0+RGVjb3JhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVjb3JhdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvciA8ZW0+Tm9kZSBEZWNvcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTm9kZURlY29yYXRvckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyIDxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2FuaXR5Q2hlY2tlckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUgPGVtPk1vZGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kaWZpYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCA8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yIDxlbT5JbnRlZ3JhdGlvbiBEZWNvcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUludGVncmF0aW9uRGVjb3JhdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwgPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0YW5kYXJkRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kgPGVtPlNJPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTSUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUiA8ZW0+U0lSPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU0lSQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCA8ZW0+U3RvY2hhc3RpYyBEaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0b2NoYXN0aWNEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwgPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwgPGVtPlN0b2NoYXN0aWMgU0lSIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9FeGFtcGxlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS91dGlsL0V4YW1wbGVTd2l0Y2guamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS91dGlsL0V4YW1wbGVTd2l0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTA5ZDlkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL3V0aWwvRXhhbXBsZVN3aXRjaC5qYXZhCkBAIC0wLDAgKzEsMzc3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLnV0aWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS4qOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0k7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCisgKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9CisgKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCisgKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAorICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQorICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCisgKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuRXhhbXBsZVBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEV4YW1wbGVTd2l0Y2g8VDE+IHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIEV4YW1wbGVQYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXhhbXBsZVN3aXRjaCgpIHsKKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7CisJCQltb2RlbFBhY2thZ2UgPSBFeGFtcGxlUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOworCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQxIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOworCQl9CisJCWVsc2UgeworCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7CisJCQlyZXR1cm4KKwkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPworCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6CisJCQkJCWRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUMSBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKKwkJCWNhc2UgRXhhbXBsZVBhY2thZ2UuRVhBTVBMRV9ESVNFQVNFX01PREVMOiB7CisJCQkJRXhhbXBsZURpc2Vhc2VNb2RlbCBleGFtcGxlRGlzZWFzZU1vZGVsID0gKEV4YW1wbGVEaXNlYXNlTW9kZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlRXhhbXBsZURpc2Vhc2VNb2RlbChleGFtcGxlRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsKGV4YW1wbGVEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNJUihleGFtcGxlRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoZXhhbXBsZURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU0koZXhhbXBsZURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbChleGFtcGxlRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbChleGFtcGxlRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEaXNlYXNlTW9kZWwoZXhhbXBsZURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSW50ZWdyYXRpb25EZWNvcmF0b3IoZXhhbXBsZURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZURlY29yYXRvcihleGFtcGxlRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTYW5pdHlDaGVja2VyKGV4YW1wbGVEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUoZXhhbXBsZURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKGV4YW1wbGVEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShleGFtcGxlRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKGV4YW1wbGVEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUV4YW1wbGVEaXNlYXNlTW9kZWwoRXhhbXBsZURpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyA8VD4gVDEgY2FzZUNvbXBhcmFibGUoQ29tcGFyYWJsZTxUPiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlY29yYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlY29yYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VEZWNvcmF0b3IoRGVjb3JhdG9yIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlIERlY29yYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgRGVjb3JhdG9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZU5vZGVEZWNvcmF0b3IoTm9kZURlY29yYXRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2FuaXR5IENoZWNrZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTYW5pdHlDaGVja2VyKFNhbml0eUNoZWNrZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZGlmaWFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2RpZmlhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZU1vZGlmaWFibGUoTW9kaWZpYWJsZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRGlzZWFzZU1vZGVsKERpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZWdyYXRpb24gRGVjb3JhdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZWdyYXRpb24gRGVjb3JhdG9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKEludGVncmF0aW9uRGVjb3JhdG9yIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbChTdGFuZGFyZERpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0k8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TSTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTSShTSSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0lSPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0lSPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVNJUihTSVIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTdG9jaGFzdGljRGlzZWFzZU1vZGVsKFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdG9jaGFzdGljIFNJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RvY2hhc3RpYyBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsKFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL0V4YW1wbGVTd2l0Y2gKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRlODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjk0NjQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjM2E2OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsMTUgQEAKKyNUdWUgU2VwIDAxIDE2OjU3OjU2IEVEVCAyMDA5CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb249cmV0dXJuX3RhZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ODM0YjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMzkgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsOyBzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwucHJvdmlkZXIuRXhwZXJpbWVudGFsRWRpdFBsdWdpbiRJbXBsZW1lbnRhdGlvbgorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsO3VzZXM6PSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQsb3JnLmVjbGlwc2UuZW1mLmVjb3JlIiwKKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLmltcGw7CisgIHVzZXM6PSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQsCisgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbCwKKyAgIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwsCisgICBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbCwKKyAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZSIsCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5wcm92aWRlcjsKKyAgdXNlczo9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24sCisgICBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLnV0aWwsCisgICBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIsCisgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeSwKKyAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLAorICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsIiwKKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLnV0aWw7CisgIHVzZXM6PSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLAorICAgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLAorICAgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbCwKKyAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LAorICAgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLAorICAgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbiwKKyAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZSIKK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVsczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9uczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5lbWYuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydAorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjQ1MzQzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTMgQEAKKyMgPGNvcHlyaWdodD4KKyMgPC9jb3B5cmlnaHQ+CisjCisjICRJZCQKKworYmluLmluY2x1ZGVzID0gLixcCisgICAgICAgICAgICAgICBpY29ucy8sXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKK2phcnMuY29tcGlsZS5vcmRlciA9IC4KK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL2ljb25zL2Z1bGwvb2JqMTYvUGVyY3VsYXRpb25EaXNlYXNlTW9kZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9pY29ucy9mdWxsL29iajE2L1BlcmN1bGF0aW9uRGlzZWFzZU1vZGVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzhmYjhkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9pY29ucy9mdWxsL29iajE2L1BlcmN1bGF0aW9uRGlzZWFzZU1vZGVsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL21vZGVsL2V4cGVyaW1lbnRhbC5lY29yZSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvbW9kZWwvZXhwZXJpbWVudGFsLmVjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMWZhMmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL21vZGVsL2V4cGVyaW1lbnRhbC5lY29yZQpAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImV4cGVyaW1lbnRhbCIKKyAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbCI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGVyY3VsYXRpb25EaXNlYXNlTW9kZWwiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvbW9kZWwvc3RhbmRhcmQuZWNvcmUjLy9TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCIvPgorPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvbW9kZWwvZXhwZXJpbWVudGFsLmdlbm1vZGVsIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9tb2RlbC9leHBlcmltZW50YWwuZ2VubW9kZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiMTMwNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvbW9kZWwvZXhwZXJpbWVudGFsLmdlbm1vZGVsCkBAIC0wLDAgKzEsMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjIgorICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMiCisgICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbCIgbW9kZWxOYW1lPSJFeHBlcmltZW50YWwiCisgICAgdGVzdHNEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMudGVzdHMuZXhwZXJpbWVudGFsL3NyYyIgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLmphdmEiCisgICAgY29tcGxpYW5jZUxldmVsPSI1LjAiIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL21vZGVsL2Rpc2Vhc2Vtb2RlbHMuZ2VubW9kZWwjLy9zdGFuZGFyZCAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL2NvbW1vbiAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL21vZGVsIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vZ3JhcGggLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9tb2RlbC9kZWZpbml0aW9ucy5nZW5tb2RlbCMvL2xhYmVscyI+CisgIDxmb3JlaWduTW9kZWw+QG1vZGVsPC9mb3JlaWduTW9kZWw+CisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkV4cGVyaW1lbnRhbCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscyIKKyAgICAgIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiIGVjb3JlUGFja2FnZT0iZXhwZXJpbWVudGFsLmVjb3JlIy8iPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImV4cGVyaW1lbnRhbC5lY29yZSMvL1BlcmN1bGF0aW9uRGlzZWFzZU1vZGVsIi8+CisgIDwvZ2VuUGFja2FnZXM+Cis8L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmMTZlYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvcGx1Z2luLnByb3BlcnRpZXMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNjhiOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3BsdWdpbi54bWwKQEAgLTAsMCArMSw0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPCEtLQorIDxjb3B5cmlnaHQ+CisgPC9jb3B5cmlnaHQ+CisKKyAkSWQkCistLT4KKworPHBsdWdpbj4KKyAgICAKKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQuaXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcmllcyI+CisgICAgPGZhY3RvcnkgCisgICAgICAgdXJpID0gImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC5lY29yZSIgCisgICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5wcm92aWRlci5FeHBlcmltZW50YWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIgCisgICAgICAgc3VwcG9ydGVkVHlwZXMgPSAKKyAgICAgICAgICJvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcgorICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcgorICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcgorICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcgorICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UiIC8+CisgIDwvZXh0ZW5zaW9uPgorCisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+CisgICAgPHBhY2thZ2UKKyAgICAgICB1cmkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsLmVjb3JlIgorICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuRXhwZXJpbWVudGFsUGFja2FnZSIKKyAgICAgICBnZW5Nb2RlbCA9ICJtb2RlbC9leHBlcmltZW50YWwuZ2VubW9kZWwiIC8+IAorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmRpc2Vhc2Vtb2RlbCI+CisgICAgIDxjbGFzc2RlZgorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5pbXBsLlBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsSW1wbCI+CisgICAgIDwvY2xhc3NkZWY+CisgICAgIDxkdWJsaW5fY29yZQorICAgICAgICAgICBjcmVhdG9yPSJLYXVmbWFuIgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iUGVyY29sYXRpb24gU0VJUiBTdG9jaGFzdGljIERpc2Vhc2UgTW9kZWwiCisgICAgICAgICAgIGlkZW50aWZpZXI9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuZHVibGluX2NvcmU0IgorICAgICAgICAgICB0aXRsZT0iUGVyY29sYXRpb24gU0VJUiBEaXNlYXNlIE1vZGVsIj4KKyAgICAgPC9kdWJsaW5fY29yZT4KKyAgPC9leHRlbnNpb24+CisKKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC9DZWxsdWxhckF1dG9tYXRhTW9kZWxMYWJlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC9DZWxsdWxhckF1dG9tYXRhTW9kZWxMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZDM2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL0NlbGx1bGFyQXV0b21hdGFNb2RlbExhYmVsLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLy8gQ2VsbHVsYXJBdXRvbWF0YU1vZGVsTGFiZWwuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNOb2RlTGFiZWw7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgYW4gU1RFTSBEaXNlYXNlIG1vZGVsCisgKiBsYWJlbC4gSXQgaXMgdGhlIHRvcC1sZXZlbCBkaXNlYXNlIG1vZGVsLCBhbGwgb3RoZXIgZGlzZWFzZSBtb2RlbCBsYWJlbHMKKyAqIGRlcml2ZSBmcm9tIHRoaXMgY2xhc3MuCisgKiAKKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKKyAqLworcHVibGljIGludGVyZmFjZSBDZWxsdWxhckF1dG9tYXRhTW9kZWxMYWJlbCBleHRlbmRzIER5bmFtaWNOb2RlTGFiZWwgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdG9wLWxldmVsIHNlZ21lbnQgZm9yIGFsbCB0eXBlIFVSSSdzIGZvciBkaXNlYXNlIG1vZGVsCisJICogbGFiZWxzLgorCSAqLworCVN0cmluZyBVUklfVFlQRV9ESVNFQVNFX01PREVMX0xBQkVMX1NFR01FTlQgPSBVUklfVFlQRV9EWU5BTUlDX0xBQkVMX1NFR01FTlQKKwkJCSsgIi9kaXNlYXNlbW9kZWwiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB0eXBlIFVSSSBmb3IgZGlzZWFzZSBtb2RlbCBsYWJlbHMKKwkgKi8KKwlVUkkgVVJJX1RZUEVfU0lSX0xBQkVMID0gU1RFTVVSSQorCQkJLmNyZWF0ZVR5cGVVUkkoVVJJX1RZUEVfRElTRUFTRV9NT0RFTF9MQUJFTF9TRUdNRU5UKTsKKworCQorCisJLyoqCisJICogQHJldHVybiB0aGUgZGlzZWFzZSBtb2RlbCBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYWJlbCAoaWYgYW55KS4KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIG9wcG9zaXRlPSJsYWJlbCIKKwkgKi8KKwlDZWxsdWxhckF1dG9tYXRhTW9kZWxTdGF0ZSBnZXRDZWxsdWxhckF1dG9tYXRhTW9kZWxTdGF0ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzZWFzZSBNb2RlbCBTdGF0ZTwvZW0+IGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDZWxsdWxhckF1dG9tYXRhTW9kZWxTdGF0ZShDZWxsdWxhckF1dG9tYXRhTW9kZWxTdGF0ZSB2YWx1ZSk7CisKKwkKKwkKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IFNJIGxhYmVsIHZhbHVlCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgorCSAqLworCUNlbGx1bGFyQXV0b21hdGFNb2RlbExhYmVsVmFsdWUgZ2V0Q3VycmVudENlbGx1bGFyQXV0b21hdGFNb2RlbExhYmVsVmFsdWUoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG5leHQgU0kgbGFiZWwgdmFsdWUKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCisJICovCisJQ2VsbHVsYXJBdXRvbWF0YU1vZGVsTGFiZWxWYWx1ZSBnZXROZXh0Q2VsbHVsYXJBdXRvbWF0YU1vZGVsTGFiZWxWYWx1ZSgpOworfSAvLyBDZWxsdWxhckF1dG9tYXRhTW9kZWxMYWJlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC9DZWxsdWxhckF1dG9tYXRhTW9kZWxMYWJlbFZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL0NlbGx1bGFyQXV0b21hdGFNb2RlbExhYmVsVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYThhYWRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC9DZWxsdWxhckF1dG9tYXRhTW9kZWxMYWJlbFZhbHVlLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLy8gQ2VsbHVsYXJBdXRvbWF0YU1vZGVsTGFiZWxWYWx1ZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgYW4gZGlzZWFzZSBtb2RlbCBsYWJlbAorICogdmFsdWUuIFRoZSB2YWx1ZXMgb2YgdGhpcyBsYWJlbCByZWNvcmQgdGhlIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgd2hvCisgKiBoYXZlIGJlZW4gImJvcm4iIGFuZCB3aG8gaGF2ZSAiZGllZCIuCisgKiAKKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIENlbGx1bGFyQXV0b21hdGFNb2RlbExhYmVsVmFsdWUgZXh0ZW5kcyBMYWJlbFZhbHVlIHsKKworCQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGdlbm9tZSBwcm9wZXJ0eSAKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMCIKKwkgKi8KKwlkb3VibGUgZ2V0R2Vub21lKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgPGVtPkdlbm9tZTwvZW0+IGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CaXJ0aHM8L2VtPicgYXR0cmlidXRlLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEdlbm9tZShTdHJpbmcgdmFsdWUpOworCisKKwkvKioKKwkgKiBTZXQgdGhlIHZhbHVlIG9mIHRoaXMgZGlzZWFzZSBtb2RlbCBsYWJlbCB0byBiZSB0aGUgc2FtZSBhcyB0aGUgdmFsdWUKKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoaXMgZGlzZWFzZSBtb2RlbCB2YWx1ZQorCSAqIEByZXR1cm4gdGhpcyBpbnN0YW5jZSB3aXRoIHRoZSBuZXcgdmFsdWVzCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCUNlbGx1bGFyQXV0b21hdGFNb2RlbExhYmVsVmFsdWUgc2V0KGZpbmFsIENlbGx1bGFyQXV0b21hdGFNb2RlbExhYmVsVmFsdWUgdmFsdWUpOworCisJLyoqCisJICogQWRkIHRoZSB2YWx1ZSBvZiB0aGlzIGRpc2Vhc2UgbW9kZWwgbGFiZWwgdG8gdGhlIHZhbHVlCisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gYmUgYWRkZWQgdG8gdGhpcyBkaXNlYXNlIG1vZGVsIHZhbHVlCisJICogQHJldHVybiB0aGlzIGluc3RhbmNlIHdpdGggdGhlIHN1bSBvZiB2YWx1ZXMKKwkgKiAKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJQ2VsbHVsYXJBdXRvbWF0YU1vZGVsTGFiZWxWYWx1ZSBhZGQoZmluYWwgQ2VsbHVsYXJBdXRvbWF0YU1vZGVsTGFiZWxWYWx1ZSB2YWx1ZSk7CisKKwkKK30gLy8gQ2VsbHVsYXJBdXRvbWF0YU1vZGVsTGFiZWxWYWx1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC9DZWxsdWxhckF1dG9tYXRhTW9kZWxTdGF0ZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC9DZWxsdWxhckF1dG9tYXRhTW9kZWxTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjODM1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL0NlbGx1bGFyQXV0b21hdGFNb2RlbFN0YXRlLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLy8gQ2VsbHVsYXJBdXRvbWF0YU1vZGVsU3RhdGUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgY2xhc3MgaW4gYW4gRU1GIG1vZGVsIHRoYXQgY29udGFpbnMgc3RhdGUKKyAqIGluZm9ybWF0aW9uIGZvciBhIFNURU0gY2VsbHVsYXIgYXV0b21hdGEgbW9kZWwncyBjb21wdXRhdGlvbnMgZnJvbSBvbmUgc2ltdWxhdGlvbiBjeWNsZQorICogdG8gYW5vdGhlci4gVGhlIGJhc2ljIGlkZWEgaXMgdGhhdCB0aGUgY2VsbHVsYXIgYXV0b21hdGEgbW9kZWwgY2FuIHN0b3JlIHN0YXRlCisgKiBpbmZvcm1hdGlvbiBpbiBhbiBpbnN0YW5jZSBhbmQgYXR0YWNoIGl0IHRvIGEgY2VsbHVsYXIgYXV0b21hdGEgbW9kZWwgbGFiZWwgc3VjaCB0aGF0CisgKiB3aGVuIGl0IHJldmlzaXRzIHRoZSBsYWJlbCB0byBjb21wdXRlIGl0cyB2YWx1ZSBpdCBjYW4gcmVmZXIgdG8gdGhlIHN0YXRlCisgKiBpbmZvcm1hdGlvbiB0byBhcyBwYXJ0IG9mIGl0cyBjb21wdXRhdGlvbi4gRm9yIGluc3RhbmNlLCBpZiB0aGUgdmFsdWUgb2YKKyAqIGEgbGFiZWwgaXMgZGVwZW5kZW50IG9uIHRoZSB2YWx1ZXMgb2Ygb3RoZXIgbGFiZWxzLCByZWZlcmVuY2VzIHRvIHRob3NlCisgKiBsYWJlbHMgY291bGQgYmUgImNhY2hlZCIgaW4gdGhlIHN0YXRlIGluc3RhbmNlIGFuZCBub3QgcmVjb21wdXRlZCBmb3IgZWFjaAorICogY3ljbGUuCisgKiAKKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBpbXBsZW1lbnRzIFNhbml0eUNoZWNrZXIKKyAqLworcHVibGljIGludGVyZmFjZSBDZWxsdWxhckF1dG9tYXRhTW9kZWxTdGF0ZSBleHRlbmRzIEVPYmplY3QsIFNhbml0eUNoZWNrZXIgeworCisJLyoqCisJICogQHJldHVybiB0aGUgbGFiZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbgorCSAqIEBtb2RlbAorCSAqLworCUNlbGx1bGFyQXV0b21hdGFNb2RlbExhYmVsIGdldExhYmVsKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLkNlbGx1bGFyQXV0b21hdGFNb2RlbFN0YXRlI2dldExhYmVsIDxlbT5MYWJlbDwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYWJlbDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldExhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRMYWJlbChDZWxsdWxhckF1dG9tYXRhTW9kZWxMYWJlbCB2YWx1ZSk7CisKK30vLyBDZWxsdWxhckF1dG9tYXRhTW9kZWxTdGF0ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC9DZWxsdWxhckRpc2Vhc2VNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC9DZWxsdWxhckRpc2Vhc2VNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZWVmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL0NlbGx1bGFyRGlzZWFzZU1vZGVsLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLy8gQ2VsbHVsYXJEaXNlYXNlTW9kZWwuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbDsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBhbiBFTUYgTW9kZWwuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIENlbGx1bGFyRGlzZWFzZU1vZGVsIGV4dGVuZHMgU3RhbmRhcmREaXNlYXNlTW9kZWwgeworCS8vIE5vdGhpbmcKK30gLy8gQ2VsbHVsYXJEaXNlYXNlTW9kZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvRXhwZXJpbWVudGFsRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC9FeHBlcmltZW50YWxGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzNDgzMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvRXhwZXJpbWVudGFsRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5FeHBlcmltZW50YWxQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXhwZXJpbWVudGFsRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUV4cGVyaW1lbnRhbEZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5pbXBsLkV4cGVyaW1lbnRhbEZhY3RvcnlJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyY29sYXRpb24gRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGVyY29sYXRpb24gRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGVyY29sYXRpb25EaXNlYXNlTW9kZWwgY3JlYXRlUGVyY29sYXRpb25EaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRXhwZXJpbWVudGFsUGFja2FnZSBnZXRFeHBlcmltZW50YWxQYWNrYWdlKCk7CisKK30gLy9FeHBlcmltZW50YWxGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL0V4cGVyaW1lbnRhbFBhY2thZ2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvRXhwZXJpbWVudGFsUGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNzQxNzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL0V4cGVyaW1lbnRhbFBhY2thZ2UuamF2YQpAQCAtMCwwICsxLDMyOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAorICogPHVsPgorICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKyAqIDwvdWw+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5FeHBlcmltZW50YWxGYWN0b3J5CisgKiBAbW9kZWwga2luZD0icGFja2FnZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBFeHBlcmltZW50YWxQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgeworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOQU1FID0gImV4cGVyaW1lbnRhbCI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC5lY29yZSI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsIjsKKworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRXhwZXJpbWVudGFsUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLmltcGwuRXhwZXJpbWVudGFsUGFja2FnZUltcGwuaW5pdCgpOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLmltcGwuUGVyY29sYXRpb25EaXNlYXNlTW9kZWxJbXBsIDxlbT5QZXJjb2xhdGlvbiBEaXNlYXNlIE1vZGVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5pbXBsLlBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5pbXBsLkV4cGVyaW1lbnRhbFBhY2thZ2VJbXBsI2dldFBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBFUkNPTEFUSU9OX0RJU0VBU0VfTU9ERUwgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUkNPTEFUSU9OX0RJU0VBU0VfTU9ERUxfX1VSSSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSQ09MQVRJT05fRElTRUFTRV9NT0RFTF9fVFlQRV9VUkkgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSQ09MQVRJT05fRElTRUFTRV9NT0RFTF9fRFVCTElOX0NPUkUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUkNPTEFUSU9OX0RJU0VBU0VfTU9ERUxfX0xBQkVMU19UT19VUERBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0xBQkVMU19UT19VUERBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGg8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSQ09MQVRJT05fRElTRUFTRV9NT0RFTF9fR1JBUEggPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0dSQVBIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJDT0xBVElPTl9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUkNPTEFUSU9OX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSQ09MQVRJT05fRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0QgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUkNPTEFUSU9OX0RJU0VBU0VfTU9ERUxfX0RJU0VBU0VfTkFNRSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJDT0xBVElPTl9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQgUmVjaXByb2NhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUkNPTEFUSU9OX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIEFyZWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJDT0xBVElPTl9ESVNFQVNFX01PREVMX19UT1RBTF9BUkVBID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19UT1RBTF9BUkVBOworCisJCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zbWlzc2lvbiBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSQ09MQVRJT05fRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBMaW5lYXJpdHkgQ29lZmZpY2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJDT0xBVElPTl9ESVNFQVNFX01PREVMX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlY292ZXJ5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJDT0xBVElPTl9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJDT0xBVElPTl9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBoeXNpY2FsbHkgQWRqYWNlbnQgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSQ09MQVRJT05fRElTRUFTRV9NT0RFTF9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT04gPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltbXVuaXR5IExvc3MgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUkNPTEFUSU9OX0RJU0VBU0VfTU9ERUxfX0lNTVVOSVRZX0xPU1NfUkFURSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fSU1NVU5JVFlfTE9TU19SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY3ViYXRpb24gUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBFUkNPTEFUSU9OX0RJU0VBU0VfTU9ERUxfX0lOQ1VCQVRJT05fUkFURSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fSU5DVUJBVElPTl9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJDT0xBVElPTl9ESVNFQVNFX01PREVMX19TRUVEID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19TRUVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhbmRvbSBHZW5lcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJDT0xBVElPTl9ESVNFQVNFX01PREVMX19SQU5ET01fR0VORVJBVE9SID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19SQU5ET01fR0VORVJBVE9SOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdhaW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQRVJDT0xBVElPTl9ESVNFQVNFX01PREVMX19HQUlOID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19HQUlOOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBlcmNvbGF0aW9uIERpc2Vhc2UgTW9kZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEVSQ09MQVRJT05fRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLlBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsIDxlbT5QZXJjb2xhdGlvbiBEaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBlcmNvbGF0aW9uIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLlBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRQZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRXhwZXJpbWVudGFsRmFjdG9yeSBnZXRFeHBlcmltZW50YWxGYWN0b3J5KCk7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKKwkgKiA8dWw+CisJICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisJICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKwkgKiA8L3VsPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnRlcmZhY2UgTGl0ZXJhbHMgeworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuaW1wbC5QZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbEltcGwgPGVtPlBlcmNvbGF0aW9uIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLmltcGwuUGVyY29sYXRpb25EaXNlYXNlTW9kZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5pbXBsLkV4cGVyaW1lbnRhbFBhY2thZ2VJbXBsI2dldFBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFBFUkNPTEFUSU9OX0RJU0VBU0VfTU9ERUwgPSBlSU5TVEFOQ0UuZ2V0UGVyY29sYXRpb25EaXNlYXNlTW9kZWwoKTsKKworCX0KKworfSAvL0V4cGVyaW1lbnRhbFBhY2thZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvUGVyY29sYXRpb25EaXNlYXNlTW9kZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvUGVyY29sYXRpb25EaXNlYXNlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjliYzlmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC9QZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8vIFBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWw7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgYW4gRU1GIE1vZGVsLgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBQZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbCBleHRlbmRzIFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsIHsKKwkvLyBOb3RoaW5nCit9IC8vIFBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL2ltcGwvQ2VsbHVsYXJEaXNlYXNlTW9kZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL2ltcGwvQ2VsbHVsYXJEaXNlYXNlTW9kZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VkNWQyNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvaW1wbC9DZWxsdWxhckRpc2Vhc2VNb2RlbEltcGwuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5DZWxsdWxhckRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLkV4cGVyaW1lbnRhbFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSUxhYmVsVmFsdWVJbXBsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGVyY29sYXRpb24gRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENlbGx1bGFyRGlzZWFzZU1vZGVsSW1wbCBleHRlbmRzIFNJSW1wbCBpbXBsZW1lbnRzIENlbGx1bGFyRGlzZWFzZU1vZGVsIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ2VsbHVsYXJEaXNlYXNlTW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8vTG9nRGlzZWFzZVN0YXRlIGxkcyA9IG51bGw7CisJLy9pbnQgaWNvdW50ID0gMDsKKwkKKwkKKwkKKwkvKioKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJSW1wbCNjb21wdXRlRGlzZWFzZURlbHRhcyhvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUsIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsLCBsb25nKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY29tcHV0ZURpc2Vhc2VEZWx0YXMoCisJCQlmaW5hbCBTVEVNVGltZSB0aW1lLAorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGN1cnJlbnRTdGF0ZSwKKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZUxhYmVsLCBmaW5hbCBsb25nIHRpbWVEZWx0YSwgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSByZXR1cm5WYWx1ZSkgeworCQkKKwkJZmluYWwgU0lMYWJlbFZhbHVlIGN1cnJlbnRTSSA9IChTSUxhYmVsVmFsdWUpIGN1cnJlbnRTdGF0ZTsKKwkJCisJCS8vIFRoaXMgaXMgYmV0YSoKKwkJZmluYWwgZG91YmxlIHRyYW5zbWlzc2lvblJhdGUgPSAoZ2V0QWRqdXN0ZWRUcmFuc21pc3Npb25SYXRlKHRpbWVEZWx0YSkKKwkJCQkqIGdldFRyYW5zbWlzc2lvblJhdGVTY2FsZUZhY3RvcihkaXNlYXNlTGFiZWwpKTsKKwkJCQkKKwkJCisJCS8vIFRoZSBlZmZlY3RpdmUgSW5mZWN0aW91cyBwb3B1bGF0aW9uICBpcyBhIGRpbWVuc2lvbmxlcyBudW1iZXIgbm9ybWFsaXplIGJ5IHRvdGFsCisJCS8vIHBvcHVsYXRpb24gdXNlZCBpbiB0ZWggY29tcHV0YXRpb24gb2YgYmV0cypTKmkgd2hlcmUgaSA9IEllZmZlY3RpdmUvUG9wLgorCQkvLyBUaGlzIGluY2x1ZGVzIGEgY29ycmVjdGlvbiB0byB0aGUgY3VycmVudAorCQkvLyBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gKEllZmZlY3RpdmUpIGJhc2VkIG9uIHRoZSBjb25zZXJ2ZWQgZXhjaGFuZ2Ugb2YgcGVvcGxlIChjaXJjdWxhdGlvbikKKwkJLy8gYmV0d2VlbiByZWdpb25zLiBOb3RlIHRoYXQgdGhpcyBpcyBubyB0aGUgImFycml2YWxzIiBhbmQgImRlcGFydHVyZXMiIHdoaWNoIGFyZQorCQkvLyBhIGRpZmZlcmVudCBwcm9jZXNzLgorCQlmaW5hbCBkb3VibGUgZWZmZWN0aXZlSW5mZWN0aW91cyA9IGdldE5vcm1hbGl6ZWRFZmZlY3RpdmVJbmZlY3Rpb3VzKGRpc2Vhc2VMYWJlbC5nZXROb2RlKCksIGRpc2Vhc2VMYWJlbCwgY3VycmVudFNJLmdldEkoKSk7CisKKwkJLyoKKwkJICogQ29tcHV0ZSBzdGF0ZSB0cmFuc2l0aW9ucworCQkgKiAKKwkJICogUmVnYXJkaW5nIGNvbXB1dGluZyB0aGUgbnVtYmVyIG9mIHRyYW5zaXRpb25zIGZyb20gU3VzY2VwdGlibGUgdG8gRXhwb3NlZDoKKwkJICogSW4gYSBsaW5lYXIgbW9kZWwgdGhlICJlZmZlY3RpdmUiIG51bWJlciBvZiBpbmZlY3Rpb3VzIHBlb3BsZSBpcyBqdXN0CisJCSAqIHRoZSBudW1iZXIgb2YgaW5mZWN0aW91cyBwZW9wbGUgSW4gYSBub25saW5lYXIgbW9kZWwgd2UgaGF2ZSBhCisJCSAqIG5vbkxpbmVhcml0eSBleHBvbmVudCB0aGF0IGlzID4gMSB0aGlzIG1vZGVscyB0aGUgZWZmZWN0IG9mIGltbXVuZQorCQkgKiBzeXN0ZW0gc2F0dXJhdGlvbiB3aGVuIFN1c2NlcHRpYmxlIHBlb3BsZSBhcmUgZXhwb3NlZCB0byBsYXJnZQorCQkgKiBudW1iZXJzIG9mIGluZmVjdGlvdXMgcGVvcGxlLiB0aGVuIHRoZSAiZWZmZWN0aXZlIiBudW1iZXIgb2YKKwkJICogaW5mZWN0aW91cyBwZW9wbGUgaXMgSV5ub25MaW5lYXJpdHkgZXhwb25lbnQgdG8gYWxsb3cgZm9yIGVpdGhlcgorCQkgKiBsaW5lYXIgb3Igbm9ubGluZWFyIG1vZGVscyB3ZSBhbHdheXMgY2FsY3VsYXRlIElebm9uTGluZWFyaXR5CisJCSAqIGV4cG9uZW50IGFuZCBhbGxvdyBub25MaW5lYXJpdHkgZXhwb25lbnQgPj0gMS4wCisJCSAqLworCQkKKwkJZG91YmxlIG51bWJlck9mU3VzY2VwdGlibGVUb0luZmVjdGVkID0gdHJhbnNtaXNzaW9uUmF0ZQorCQkqIGN1cnJlbnRTSS5nZXRTKCkqIE1hdGgucG93KGVmZmVjdGl2ZUluZmVjdGlvdXMsIGdldE5vbkxpbmVhcml0eUNvZWZmaWNpZW50KCkpOworCQkKKwkJLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHJlY292ZXJpbmcgImluZmVjdGlvdXMiIHRoYXQgYmVjb21lICJyZWNvdmVyZWQiCisJCS8vIHRoaXMgaXMgcmVzY2FsZWQgYnkgdGhlIHN1cnZpdmluZyBJIHBvcHVsYXRpb24gIHNvIHdlIGRvbid0IG1vdmUgcGVvcGxlIHRoYXQKKwkJLy8gYXJlIGFscmVhZHkgZGVhZC4KKwkJZG91YmxlIG51bWJlck9mSW5mZWN0ZWRUb1N1c2NlcHRpYmxlID0gZ2V0QWRqdXN0ZWRSZWNvdmVyeVJhdGUodGltZURlbHRhKQorCQkJCSogY3VycmVudFNJLmdldEkoKTsKKwkJCisKKwkJCisJCS8vIERldGVybWluZSBkZWx0YSBTCisJCWZpbmFsIGRvdWJsZSBkZWx0YVMgPSAtIG51bWJlck9mU3VzY2VwdGlibGVUb0luZmVjdGVkICsgbnVtYmVyT2ZJbmZlY3RlZFRvU3VzY2VwdGlibGU7CisJCS8vIERldGVybWluZSBkZWx0YSBJCisJCWZpbmFsIGRvdWJsZSBkZWx0YUkgPSBudW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZCAtIG51bWJlck9mSW5mZWN0ZWRUb1N1c2NlcHRpYmxlOwkKKwkJCisJCVNJTGFiZWxWYWx1ZUltcGwgcmV0ID0gKFNJTGFiZWxWYWx1ZUltcGwpcmV0dXJuVmFsdWU7CisJCXJldC5zZXRTKGRlbHRhUyk7CisJCXJldC5zZXRJKGRlbHRhSSk7CisJCXJldC5zZXRJbmNpZGVuY2UobnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQpOworCQlyZXQuc2V0RGlzZWFzZURlYXRocygwLjApOworCQlyZXR1cm4gcmV0OworCX0gLy8gY29tcHV0ZURpc2Vhc2VEZWx0YXMKKwkKKwkKKwkKKwkKKwkvKioKKwkgKiBNb2RlbFNwZWNpZmljQWRqdXN0bWVudHMgZm9yIGEgU3RvY2hhc3RpYyBtb2RlbCBhZGRzIG5vaXNlIHRvIG9yIGFkanVzdHMgCisJICogdGhlIGRpc2Vhc2Ugc3RhdGUgdHJhbnNpdGlvbiB2YWx1ZXMgYnkgbXVsdGlwbHlpbmcKKwkgKiB0aGUgYWRkaXRpb25zIGJ5IGEgcmFuZG9tIHZhcmlhYmxlIHIgfiAoMSsvLXgpIHdpdGggeCBzbWFsbC4KKwkgKiBUaGUgcmVxdWlyZW1lbnRzIHRoYXQgbm8gbW9yZSBpbmRpdmlkdWFscyBjYW4gYmUgbW92ZWQgZnJvbSBhIHN0YXRlIHRoYW4gYXJlCisJICogYWxyZWFkeSBpbiB0aGF0IHN0YXRlIGlzIHN0aWxsIGVuZm9yY2VkLgorCSAqIAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKAorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGN1cnJlbnRTdGF0ZSkgeworCisJCisJCXJldHVybjsKKwkJCisJfSAvLyBkb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cworCQorCQorCQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gRXhwZXJpbWVudGFsUGFja2FnZS5MaXRlcmFscy5QRVJDT0xBVElPTl9ESVNFQVNFX01PREVMOworCX0KKworCXB1YmxpYyB2b2lkIGRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKExhYmVsVmFsdWUgbGFiZWwpIHsKKwkJLy8gTm90aGluZworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0RldGVybWluaXN0aWMoKSB7CisJCXJldHVybiB0cnVlOworCX0KK30gLy9DZWxsdWxhckRpc2Vhc2VNb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvaW1wbC9FeHBlcmltZW50YWxGYWN0b3J5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC9pbXBsL0V4cGVyaW1lbnRhbEZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVlMDQ3YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvaW1wbC9FeHBlcmltZW50YWxGYWN0b3J5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLkV4cGVyaW1lbnRhbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5FeHBlcmltZW50YWxQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuUGVyY29sYXRpb25EaXNlYXNlTW9kZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRXhwZXJpbWVudGFsRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBFeHBlcmltZW50YWxGYWN0b3J5IHsKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIEV4cGVyaW1lbnRhbEZhY3RvcnkgaW5zdGFuY2UKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBFeHBlcmltZW50YWxGYWN0b3J5IGluaXQoKSB7CisJCXRyeSB7CisJCQlFeHBlcmltZW50YWxGYWN0b3J5IHRoZUV4cGVyaW1lbnRhbEZhY3RvcnkgPSAoRXhwZXJpbWVudGFsRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsLmVjb3JlIik7IAorCQkJaWYgKHRoZUV4cGVyaW1lbnRhbEZhY3RvcnkgIT0gbnVsbCkgeworCQkJCXJldHVybiB0aGVFeHBlcmltZW50YWxGYWN0b3J5OworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IEV4cGVyaW1lbnRhbEZhY3RvcnlJbXBsKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXhwZXJpbWVudGFsRmFjdG9yeUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKKwkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgRXhwZXJpbWVudGFsUGFja2FnZS5QRVJDT0xBVElPTl9ESVNFQVNFX01PREVMOiByZXR1cm4gY3JlYXRlUGVyY29sYXRpb25EaXNlYXNlTW9kZWwoKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgcGVyY29sYXRpb25EaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsIGNyZWF0ZVBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsKCkgeworCQlQZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbEltcGwgcGVyY29sYXRpb25EaXNlYXNlTW9kZWwgPSBuZXcgUGVyY29sYXRpb25EaXNlYXNlTW9kZWxJbXBsKCk7CisJCXJldHVybiBwZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gZXhwZXJpbWVudGFsUGFja2FnZSAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4cGVyaW1lbnRhbFBhY2thZ2UgZ2V0RXhwZXJpbWVudGFsUGFja2FnZSgpIHsKKwkJcmV0dXJuIChFeHBlcmltZW50YWxQYWNrYWdlKWdldEVQYWNrYWdlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIEV4cGVyaW1lbnRhbFBhY2thZ2UgZUluc3RhbmNlCisJICogQGRlcHJlY2F0ZWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQERlcHJlY2F0ZWQKKwlwdWJsaWMgc3RhdGljIEV4cGVyaW1lbnRhbFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKKwkJcmV0dXJuIEV4cGVyaW1lbnRhbFBhY2thZ2UuZUlOU1RBTkNFOworCX0KKworfSAvL0V4cGVyaW1lbnRhbEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL2ltcGwvRXhwZXJpbWVudGFsUGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvaW1wbC9FeHBlcmltZW50YWxQYWNrYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNWQ2MzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL2ltcGwvRXhwZXJpbWVudGFsUGFja2FnZUltcGwuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLkV4cGVyaW1lbnRhbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5FeHBlcmltZW50YWxQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuUGVyY29sYXRpb25EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFeHBlcmltZW50YWxQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEV4cGVyaW1lbnRhbFBhY2thZ2UgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIFBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQorCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgorCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKKwkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcworCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCisJICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuRXhwZXJpbWVudGFsUGFja2FnZSNlTlNfVVJJCisJICogQHNlZSAjaW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRXhwZXJpbWVudGFsUGFja2FnZUltcGwoKSB7CisJCXN1cGVyKGVOU19VUkksIEV4cGVyaW1lbnRhbEZhY3RvcnkuZUlOU1RBTkNFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKKwkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQorCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCisJICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCisJICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAorCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCisJICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAorCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAorCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKKwkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQorCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCisJICogdGhvc2Ugb2YgYW5vdGhlci4KKwkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCisJICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiAgRXhwZXJpbWVudGFsUGFja2F0ZSBpbnN0YW5jZQorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEV4cGVyaW1lbnRhbFBhY2thZ2UgaW5pdCgpIHsKKwkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEV4cGVyaW1lbnRhbFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRXhwZXJpbWVudGFsUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCisJCUV4cGVyaW1lbnRhbFBhY2thZ2VJbXBsIHRoZUV4cGVyaW1lbnRhbFBhY2thZ2UgPSAoRXhwZXJpbWVudGFsUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgRXhwZXJpbWVudGFsUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBFeHBlcmltZW50YWxQYWNrYWdlSW1wbCgpKTsKKworCQlpc0luaXRlZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCisJCVN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCQlHcmFwaFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCQlMYWJlbHNQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKworCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cworCQl0aGVFeHBlcmltZW50YWxQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKwkJdGhlRXhwZXJpbWVudGFsUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAorCQl0aGVFeHBlcmltZW50YWxQYWNrYWdlLmZyZWV6ZSgpOworCisJCXJldHVybiB0aGVFeHBlcmltZW50YWxQYWNrYWdlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBQZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbEVDbGFzcworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsKCkgeworCQlyZXR1cm4gUGVyY29sYXRpb25EaXNlYXNlTW9kZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIEV4cGVyaW1lbnRhbEZhY3RvcnkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4cGVyaW1lbnRhbEZhY3RvcnkgZ2V0RXhwZXJpbWVudGFsRmFjdG9yeSgpIHsKKwkJcmV0dXJuIChFeHBlcmltZW50YWxGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKKwkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47CisJCWlzQ3JlYXRlZCA9IHRydWU7CisKKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCisJCVBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBFUkNPTEFUSU9OX0RJU0VBU0VfTU9ERUwpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcworCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKKwkJaXNJbml0aWFsaXplZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCisJCXNldE5hbWUoZU5BTUUpOworCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKKwkJc2V0TnNVUkkoZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcworCQlTdGFuZGFyZFBhY2thZ2UgdGhlU3RhbmRhcmRQYWNrYWdlID0gKFN0YW5kYXJkUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShTdGFuZGFyZFBhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycworCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycworCisJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJUGVyY29sYXRpb25EaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlU3RhbmRhcmRQYWNrYWdlLmdldFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsKCkpOworCisJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCWluaXRFQ2xhc3MoUGVyY29sYXRpb25EaXNlYXNlTW9kZWxFQ2xhc3MsIFBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsLmNsYXNzLCAiUGVyY29sYXRpb25EaXNlYXNlTW9kZWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJLy8gQ3JlYXRlIHJlc291cmNlCisJCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCX0KKworfSAvL0V4cGVyaW1lbnRhbFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL2ltcGwvTG9nRGlzZWFzZVN0YXRlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL2ltcGwvTG9nRGlzZWFzZVN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmYmEwOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvaW1wbC9Mb2dEaXNlYXNlU3RhdGUuamF2YQpAQCAtMCwwICsxLDY4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5BY3RpdmF0b3I7CisKK2NsYXNzIExvZ0Rpc2Vhc2VTdGF0ZSB7CisKKwlwcml2YXRlIHN0YXRpYyBGaWxlV3JpdGVyIGZ3OworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiBAcGFyYW0gZmlsZU5hbWUKKwkgKi8KKwlwdWJsaWMgTG9nRGlzZWFzZVN0YXRlKFN0cmluZyBmaWxlTmFtZSkgeworCQl0cnkgeworCQkJZncgPSBuZXcgRmlsZVdyaXRlcihmaWxlTmFtZSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCUFjdGl2YXRvci5sb2dJbmZvcm1hdGlvbigiRXJyb3IgY3JlYXRpbmcgZmlsZSB3cml0ZXIgIitlLmdldE1lc3NhZ2UoKSxlKTsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkvL1N5c3RlbS5leGl0KDEpOworCQl9CisJfQorCisKKwkvKioKKwkgKiB3cml0ZSBzdHJpbmcKKwkgKiBAcGFyYW0gc3RyCisJICovCisJcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHN0cikgeworCQl0cnkgeworCQkJLy9TeXN0ZW0ub3V0LnByaW50KHN0cik7CisJCQlmdy53cml0ZShzdHIpOyAKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3cml0aW5nIHRvIGZpbGUgd3JpdGVyICIrZS5nZXRNZXNzYWdlKCkpOworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCS8vU3lzdGVtLmV4aXQoMSk7CisJCX0vLyB0cnkKKwl9IC8vIHdyaXRlCisKKwkvKioKKwkgKiBjbG9zZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZSgpIHsKKworCQl0cnkgeworCQkJZncuZmx1c2goKTsKKwkJCWZ3LmNsb3NlKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgY2xvc2luZyBmaWxlIHdyaXRlciAiK2UuZ2V0TWVzc2FnZSgpKTsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0vLyB0cnkKKwl9CisKKworfSAvLyBMb2dEaXNlYXNlU3RhdGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL2ltcGwvUGVyY29sYXRpb25EaXNlYXNlTW9kZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL2ltcGwvUGVyY29sYXRpb25EaXNlYXNlTW9kZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjNzUxYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvaW1wbC9QZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbEltcGwuamF2YQpAQCAtMCwwICsxLDI0NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5FeHBlcmltZW50YWxQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuUGVyY29sYXRpb25EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TRUlSTGFiZWxWYWx1ZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxJbXBsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGVyY29sYXRpb24gRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsSW1wbCBleHRlbmRzIFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsSW1wbCBpbXBsZW1lbnRzIFBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGVyY29sYXRpb25EaXNlYXNlTW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCUxvZ0Rpc2Vhc2VTdGF0ZSBsZHMgPSBudWxsOworCWludCBpY291bnQgPSAwOworCXN0YXRpYyBib29sZWFuIGxvZ0NvbXBsZXRlID0gZmFsc2U7CisKKwkKKwkvKioKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNFSVJJbXBsI2NvbXB1dGVEaXNlYXNlRGVsdGFzKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSwgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSwgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwsIGxvbmcpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjb21wdXRlRGlzZWFzZURlbHRhcygKKwkJCWZpbmFsIFNURU1UaW1lIHRpbWUsCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY3VycmVudFN0YXRlLAorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTGFiZWwsIGZpbmFsIGxvbmcgdGltZURlbHRhLCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHJldHVyblZhbHVlKSB7CisJCWZpbmFsIFNFSVJMYWJlbFZhbHVlIGN1cnJlbnRTRUlSID0gKFNFSVJMYWJlbFZhbHVlKSBjdXJyZW50U3RhdGU7CisKKwkJLy8gVGhpcyBpcyBiZXRhKiBUaGUgZWZmZWN0aXZlIHRyYW5zbWlzc2lvbiByYXRlIGNvbnN0YW50IChub3JtYWxpemVkKQorCQlmaW5hbCBkb3VibGUgdHJhbnNtaXNpb25SYXRlID0gZ2V0QWRqdXN0ZWRUcmFuc21pc3Npb25SYXRlKHRpbWVEZWx0YSkKKwkJCQkqIGdldFRyYW5zbWlzc2lvblJhdGVTY2FsZUZhY3RvcihkaXNlYXNlTGFiZWwpOworCQkKKwkJCisJCS8qCisJCSAqIFRoaXMgTXVzdCBiZWNvbWUgYSBwYXJhbWV0ZXIKKwkJICovCisJCWZpbmFsIGRvdWJsZSBDUklUSUNBTF9TVVNDRVBUSUJMRSA9IDAuMjU7CisJCQorCQkvKgorICAgICAgICAgKiA0KSBDb21wdXRlIHRoZSAiTG9jYWwgVHJhbnNtaXNzaW9uIENvZWZmaWNpZW50IgorICAgICAgICAgKiAKKyAgICAgICAgICogVGhlIChOb3JtYWxpemVkKSAiTG9jYWwgVHJhbnNtaXNzaW9uIENvZWZmaWNpZW50IiBkZXBlbmRzIHVwb24gdGhlCisgICAgICAgICAqIGRpc2Vhc2UncyBzcGVjaWZpZWQgdHJhbnNtaXNzaW9uIGNvZWZmaWNpZW50LCBidXQgaXQgc2NhbGVzIHdpdGggdGhlCisgICAgICAgICAqIGxvY2FsIHBvcHVsYXRpb24gZGVuc2l0eS4gVGhpcyByZXNjYWxpbmcgb3IgIm5vcm1hbGl6YXRpb24iIGlzIGRvbmUKKyAgICAgICAgICogYnkgdGhlIGN1cnJlbnRDb3VudHkuZ2V0VHJhbnNTY2FsZUZhY3RvcigpIG1ldGhvZC4KKyAgICAgICAgICovCisJCQorCQlkb3VibGUgZGVuID0gY3VycmVudFNFSVIuZ2V0UG9wdWxhdGlvbkNvdW50KCk7CisKKwkJZG91YmxlIHNlID0gIChjdXJyZW50U0VJUi5nZXRTKCkrIGN1cnJlbnRTRUlSLmdldEUoKSsgY3VycmVudFNFSVIuZ2V0SSgpKSAvIGRlbjsKKyAgICAgICAgLy9kb3VibGUgc2UgPSAgKGN1cnJlbnRTRUlSLmdldFMoKSsgY3VycmVudFNFSVIuZ2V0RSgpKSAvIGRlbjsKKyAgICAgICAgLy9kb3VibGUgc2UgPSAgY3VycmVudFNFSVIuZ2V0UygpIC8gZGVuOworICAgICAgICBkb3VibGUgcGVyY0ZhY3QgPSAxLjA7CisgICAgICAgIGRvdWJsZSBsb2NhbFRyYW5zbWlzaW9uQ29lZmZpY2llbnQgPSAwLjA7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLyoKKyAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgKiBUSElTIElTIFdIRVJFIFdFIEFERCBUSEUgUEVSQ09MQVRJT04gVEhSRVNIT0xEIFRPIFRIRSBNT0RFTCAqKioqCisgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICovIAorICAgICAgICAvLyBpZiBhYm92ZSBwZXJjb2xhdGlvbiB0aHJlc2hvbGQKKyAgICAgICAgaWYgKHNlID49IENSSVRJQ0FMX1NVU0NFUFRJQkxFKSB7CisJCQkvLyBub3cgd2UgcHV0IGluIHBlcmNvbGF0aW9uCisJCQlkb3VibGUgcGVyY051bSA9IHNlIC0gQ1JJVElDQUxfU1VTQ0VQVElCTEU7CisJCQlpZiAocGVyY051bSA8PSAwLjApCisJCQkJcGVyY051bSA9IDAuMDsgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgorCQkJLy8gTm9ybWFsaXphdGlvbiAoc28gYWxsIHBlcmNvbGF0aW9uIGZuIHRlcm1zIG1heCBhdCAxLjAKKwkJCWRvdWJsZSBwZXJjTm9ybSA9IDEuMCAtIENSSVRJQ0FMX1NVU0NFUFRJQkxFOworCQkJLyoKKwkJCSAqIGdldE5vbkxpbmVhcml0eUNvZWZmaWNpZW50KCkgdXNlZCBkaWZmZXJlbnRseSBoZXJlLi4uLgorCQkJICovCisJCQlwZXJjRmFjdCA9IE1hdGgucG93KChwZXJjTnVtIC8gcGVyY05vcm0pLCBnZXROb25MaW5lYXJpdHlDb2VmZmljaWVudCgpKTsKKwkJCS8vIFRIRSBUUkFOU01JU1NJT04gQ09FRiBBQk9WRSBDUklUSUNBTCBQT0lOVAorCQkJbG9jYWxUcmFuc21pc2lvbkNvZWZmaWNpZW50ID0gdHJhbnNtaXNpb25SYXRlICogcGVyY0ZhY3Q7CisJCX0gZWxzZSB7CisJCQlsb2NhbFRyYW5zbWlzaW9uQ29lZmZpY2llbnQgPSAwLjA7CisJCQkvLy8vRUxTRSBhZGQgYW4gZXhwb25lbnRpYWwgdGFpbAorCQkJLy9kb3VibGUgbnVtID0gLTEuMCAqIE1hdGguYWJzKENSSVRJQ0FMX1NVU0NFUFRJQkxFIC0gc2kpOworCQkJLy9udW0gKj0gKDIwLjAgLyBub25MaW5lYXJpdHlFeHBvbmVudCk7CisJCQkvLy8vVEhFIFRSQU5TTUlTU0lPTiBDT0VGIEJFTE9XIENSSVRJQ0FMIFBPSU5UCisJCQkvL2xvY2FsVHJhbnNtaXNpb25Db2VmZmljaWVudCA9IC4wMipNYXRoLmV4cChudW0pOworCQkJLy8vL1N5c3RlbS5vdXQucHJpbnRsbigicz0gIitzaSsiIGJldGE9ICIrbG9jYWxUcmFuc21pc2lvbkNvZWZmaWNpZW50KTsKKwkJfQorICAgICAgICAvKgorICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgKiBFTkQgUEVSQ09MQVRJT04gVEhSRVNIT0xEIENPREUgKioqKgorICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgKi8gCisgICAgICAgIAorCQkKKwkJaWYgKGxkcz09bnVsbCkgeworCQkJaW50IGluYyA9IChpbnQpICh0aGlzLmluY3ViYXRpb25SYXRlKjEwMC4wKTsKKwkJCWludCBiZXRhID0gKGludCkgKHRoaXMudHJhbnNtaXNzaW9uUmF0ZSoxMDAuMCk7CisJCQlpbnQgcmVjID0gKGludCkgKHRoaXMucmVjb3ZlcnlSYXRlKjEwMC4wKTsKKwkJCWludCBpbWxvc3MgPSAoaW50KSAodGhpcy5pbW11bml0eUxvc3NSYXRlKjEwMDAuMCk7CisJCQkKKwkJCWxkcyA9IG5ldyBMb2dEaXNlYXNlU3RhdGUoIi4vdGltZWxvZ0kiK2luYysiQiIrYmV0YSsiaWwiK2ltbG9zcysiciIrcmVjKyIudHh0Iik7CisJCX0KKwkJCisJCQorCQlkb3VibGUgcGQgPSAxLjAgLyBjdXJyZW50U0VJUi5nZXRQb3B1bGF0aW9uQ291bnQoKTsKKwkJU3RyaW5nIHN0ciA9IGljb3VudCsiLCAiK2N1cnJlbnRTRUlSLmdldFMoKSAqIHBkICsiLCAiK2N1cnJlbnRTRUlSLmdldEUoKSogcGQgKyAiLCAiICsgY3VycmVudFNFSVIuZ2V0SSgpKiBwZCArICIsICIgKyBjdXJyZW50U0VJUi5nZXRSKCkqIHBkICsgIlxuIjsKKyAgICAgICAgCisJCWlmIChpY291bnQgPD0gNTAwKSB7CisJCQlsZHMud3JpdGUoc3RyKTsKKwkJCWljb3VudCsrOworCQl9CisgICAgICAgIAorCQlpZiAoaWNvdW50ID09IDUwMSkgeworCQkJaWYgKCghbG9nQ29tcGxldGUpICYmIChsZHMgIT0gbnVsbCkpIHsKKwkJCQlMb2dEaXNlYXNlU3RhdGUuY2xvc2UoKTsKKwkJCQlsb2dDb21wbGV0ZSA9IHRydWU7CisJCQl9CisJCX0KKyAgICAgIAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBzaSA9ICIrc2krIiBzdHIgPSAiK3N0ciApOworCQkKKwkJLy8gVGhlIGVmZmVjdGl2ZSBJbmZlY3Rpb3VzIHBvcHVsYXRpb24gIGlzIGEgZGltZW5zaW9ubGVzcyBudW1iZXIgbm9ybWFsaXplIGJ5IHRvdGFsCisJCS8vIHBvcHVsYXRpb24gdXNlZCBpbiB0aGUgY29tcHV0YXRpb24gb2YgYmV0cypTKmkgd2hlcmUgaSA9IEl7ZWZmZWN0aXZlfS9Qb3AuCisJCS8vIFRoaXMgaW5jbHVkZXMgYSBjb3JyZWN0aW9uIHRvIHRoZSBjdXJyZW50CisJCS8vIGluZmVjdGlvdXMgcG9wdWxhdGlvbiAoSXtlZmZlY3RpdmV9KSBiYXNlZCBvbiB0aGUgY29uc2VydmVkIGV4Y2hhbmdlIG9mIHBlb3BsZSAoY2lyY3VsYXRpb24pCisJCS8vIGJldHdlZW4gcmVnaW9ucy4gTm90ZSB0aGF0IHRoaXMgaXMgbm8gdGhlICJhcnJpdmFscyIgYW5kICJkZXBhcnR1cmVzIiB3aGljaCBhcmUKKwkJLy8gYSBkaWZmZXJlbnQgcHJvY2Vzcy4KKwkJZmluYWwgZG91YmxlIGVmZmVjdGl2ZUluZmVjdGlvdXMgPSBnZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cyhkaXNlYXNlTGFiZWwuZ2V0Tm9kZSgpLCBkaXNlYXNlTGFiZWwsIGN1cnJlbnRTRUlSLmdldEkoKSk7CisKKwkJCisJCS8vIENvbXB1dGUgdGhlIG51bWJlciBvZiByZWNvdmVyaW5nICJpbmZlY3Rpb3VzIiB0aGF0IGJlY29tZSAicmVjb3ZlcmVkIgorCQlkb3VibGUgbnVtYmVyT2ZJbmZlY3RlZFRvUmVjb3ZlcmVkID0gZ2V0QWRqdXN0ZWRSZWNvdmVyeVJhdGUodGltZURlbHRhKQorCQkJCSogY3VycmVudFNFSVIuZ2V0SSgpOworCisJCS8vIENvbXB1dGUgdGhlIG51bWJlciBvZiAicmVjb3ZlcmVkIiB0aGF0IGxvc2UgdGhlaXIgaW1tdW5pdHkgYW5kCisJCS8vIGJlY29tZSAic3VzY2VwdGlibGUiCisJCWRvdWJsZSBudW1iZXJPZlJlY292ZXJlZFRvU3VzY2VwdGlibGUgPSBnZXRBZGp1c3RlZEltbXVuaXR5TG9zc1JhdGUodGltZURlbHRhKQorCQkJCSogY3VycmVudFNFSVIuZ2V0UigpOworCisJCS8qCisJCSAqIENvbXB1dGUgdGhlIG51bWJlciBvZiB0cmFuc2l0aW9ucyBmcm9tIFN1c2NlcHRpYmxlIHRvIEV4cG9zZWQKKwkJICogCisJCSAqIEluIGEgbGluZWFyIG1vZGVsIHRoZSAiZWZmZWN0aXZlIiBudW1iZXIgb2YgaW5mZWN0aW91cyBwZW9wbGUgaXMganVzdAorCQkgKiB0aGUgbnVtYmVyIG9mIGluZmVjdGlvdXMgcGVvcGxlIEluIGEgbm9ubGluZWFyIG1vZGVsIHdlIGhhdmUgYQorCQkgKiBub25MaW5lYXJpdHkgZXhwb25lbnQgdGhhdCBpcyA+IDEgdGhpcyBtb2RlbHMgdGhlIGVmZmVjdCBvZiBpbW11bmUKKwkJICogc3lzdGVtIHNhdHVyYXRpb24gd2hlbiBTdXNjZXB0aWJsZSBwZW9wbGUgYXJlIGV4cG9zZWQgdG8gbGFyZ2UKKwkJICogbnVtYmVycyBvZiBpbmZlY3Rpb3VzIHBlb3BsZS4gdGhlbiB0aGUgImVmZmVjdGl2ZSIgbnVtYmVyIG9mCisJCSAqIGluZmVjdGlvdXMgcGVvcGxlIGlzIElebm9uTGluZWFyaXR5IGV4cG9uZW50IHRvIGFsbG93IGZvciBlaXRoZXIKKwkJICogbGluZWFyIG9yIG5vbmxpbmVhciBtb2RlbHMgd2UgYWx3YXlzIGNhbGN1bGF0ZSBJXm5vbkxpbmVhcml0eQorCQkgKiBleHBvbmVudCBhbmQgYWxsb3cgbm9uTGluZWFyaXR5IGV4cG9uZW50ID49IDEuMAorCQkgKi8KKworCQlkb3VibGUgbnVtYmVyT2ZTdXNjZXB0aWJsZVRvRXhwb3NlZCA9IGxvY2FsVHJhbnNtaXNpb25Db2VmZmljaWVudAorCQkJCSogY3VycmVudFNFSVIuZ2V0UygpCisJCQkJKiBlZmZlY3RpdmVJbmZlY3Rpb3VzOworCisJCS8vIENvbXB1dGUgdGhlIG51bWJlciBvZiAiZXhwb3NlZCIgdGhhdCBiZWNvbWUgImluZmVjdGlvdXMiCisJCWRvdWJsZSBudW1iZXJPZkV4cG9zZWRUb0luZmVjdGlvdXMgPSBnZXRBZGp1c3RlZEluY3ViYXRpb25SYXRlKHRpbWVEZWx0YSkKKwkJCQkqIGN1cnJlbnRTRUlSLmdldEUoKTsKKwkJCisJCQorCQlmaW5hbCBkb3VibGUgZGVsdGFTID0gbnVtYmVyT2ZSZWNvdmVyZWRUb1N1c2NlcHRpYmxlIC0gbnVtYmVyT2ZTdXNjZXB0aWJsZVRvRXhwb3NlZDsKKwkJZmluYWwgZG91YmxlIGRlbHRhRSA9IG51bWJlck9mU3VzY2VwdGlibGVUb0V4cG9zZWQgLSBudW1iZXJPZkV4cG9zZWRUb0luZmVjdGlvdXM7CisJCWZpbmFsIGRvdWJsZSBkZWx0YUkgPSBudW1iZXJPZkV4cG9zZWRUb0luZmVjdGlvdXMgLSBudW1iZXJPZkluZmVjdGVkVG9SZWNvdmVyZWQ7CisJCWZpbmFsIGRvdWJsZSBkZWx0YVIgPSBudW1iZXJPZkluZmVjdGVkVG9SZWNvdmVyZWQgLSBudW1iZXJPZlJlY292ZXJlZFRvU3VzY2VwdGlibGU7CisJCQorCQlTRUlSTGFiZWxWYWx1ZUltcGwgcmV0ID0gKFNFSVJMYWJlbFZhbHVlSW1wbClyZXR1cm5WYWx1ZTsKKwkJcmV0LnNldFMoZGVsdGFTKTsKKwkJcmV0LnNldEUoZGVsdGFFKTsKKwkJcmV0LnNldEkoZGVsdGFJKTsKKwkJcmV0LnNldEluY2lkZW5jZShudW1iZXJPZlN1c2NlcHRpYmxlVG9FeHBvc2VkKTsKKwkJcmV0LnNldFIoZGVsdGFSKTsKKwkJcmV0LnNldERpc2Vhc2VEZWF0aHMoMCk7CisJCXJldHVybiByZXQ7CisJCisJfSAvLyBjb21wdXRlRGlzZWFzZURlbHRhcworCQorCS8qKgorCSAqIE1vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyBmb3IgYSBTdG9jaGFzdGljIG1vZGVsIGFkZHMgbm9pc2UgdG8gb3IgYWRqdXN0cyAKKwkgKiB0aGUgZGlzZWFzZSBzdGF0ZSB0cmFuc2l0aW9uIHZhbHVlcyBieSBtdWx0aXBseWluZworCSAqIHRoZSBhZGRpdGlvbnMgYnkgYSByYW5kb20gdmFyaWFibGUgciB+ICgxKy8teCkgd2l0aCB4IHNtYWxsLgorCSAqIFRoZSByZXF1aXJlbWVudHMgdGhhdCBubyBtb3JlIGluZGl2aWR1YWxzIGNhbiBiZSBtb3ZlZCBmcm9tIGEgc3RhdGUgdGhhbiBhcmUKKwkgKiBhbHJlYWR5IGluIHRoYXQgc3RhdGUgaXMgc3RpbGwgZW5mb3JjZWQuCisJICogCisJICovCisJcHVibGljIHZvaWQgZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgc3RhdGUpIHsKKwkJCWZpbmFsIFNJTGFiZWxWYWx1ZSBjdXJyZW50U0kgPSAoU0lMYWJlbFZhbHVlKSBzdGF0ZTsKKwkJCWRvdWJsZSBvbGRJID0gY3VycmVudFNJLmdldEkoKTsKKwkJCWRvdWJsZSBJbm9pc3kgPSBjdXJyZW50U0kuZ2V0SSgpKiBjb21wdXRlTm9pc2UoKTsKKwkJCWRvdWJsZSBjaGFuZ2UgPSBvbGRJLUlub2lzeTsKKwkJCWN1cnJlbnRTSS5zZXRJKElub2lzeSk7CisJCQlkb3VibGUgbmV3UyA9IGN1cnJlbnRTSS5nZXRTKCkgKyBjaGFuZ2U7CisJCQlpZihuZXdTIDwgMC4wKSB7CisJCQkJLy8gTmVlZCB0byByZXNjYWxlCisJCQkJZG91YmxlIHNjYWxlID0gKGN1cnJlbnRTSS5nZXRTKCkgKyBuZXdTKSAvIGN1cnJlbnRTSS5nZXRTKCk7CisJCQkJY3VycmVudFNJLnNldEkoSW5vaXN5KnNjYWxlKTsKKwkJCX0gZWxzZSAgY3VycmVudFNJLnNldFMobmV3Uyk7CisJCQlyZXR1cm47CisJfSAvLyBkb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cworCQorCQorCQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gRXhwZXJpbWVudGFsUGFja2FnZS5MaXRlcmFscy5QRVJDT0xBVElPTl9ESVNFQVNFX01PREVMOworCX0KKworfSAvL1BlcmNvbGF0aW9uRGlzZWFzZU1vZGVsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC9wcm92aWRlci9DZWxsdWxhckRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC9wcm92aWRlci9DZWxsdWxhckRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZDdlYTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL3Byb3ZpZGVyL0NlbGx1bGFyRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLkNlbGx1bGFyRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuQ2VsbHVsYXJEaXNlYXNlTW9kZWx9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENlbGx1bGFyRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5IAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ2VsbHVsYXJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgQ2VsbHVsYXJEaXNlYXNlTW9kZWwuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ2VsbHVsYXJEaXNlYXNlTW9kZWwiKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChDZWxsdWxhckRpc2Vhc2VNb2RlbClvYmplY3QpLmdldFVSSSgpLmxhc3RTZWdtZW50KCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfQ2VsbHVsYXJEaXNlYXNlTW9kZWxfdHlwZSIpIDoKKwkJCWxhYmVsOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChDZWxsdWxhckRpc2Vhc2VNb2RlbClvYmplY3QpLmdldERpc2Vhc2VOYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfQ2VsbHVsYXJEaXNlYXNlTW9kZWxfdHlwZSIpIDoKKwkJCWdldFN0cmluZygiX1VJX0NlbGx1bGFyRGlzZWFzZU1vZGVsX3R5cGUiKSArICIgIiArIGxhYmVsOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBFeHBlcmltZW50YWxFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC9wcm92aWRlci9FeHBlcmltZW50YWxFZGl0UGx1Z2luLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL3Byb3ZpZGVyL0V4cGVyaW1lbnRhbEVkaXRQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGY2N2U1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC9wcm92aWRlci9FeHBlcmltZW50YWxFZGl0UGx1Z2luLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMucHJvdmlkZXIuRGVmaW5pdGlvbnNFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5EaXNlYXNlbW9kZWxzRWRpdFBsdWdpbjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBjZW50cmFsIHNpbmdsZXRvbiBmb3IgdGhlIEV4cGVyaW1lbnRhbCBlZGl0IHBsdWdpbi4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEV4cGVyaW1lbnRhbEVkaXRQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4geworCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEV4cGVyaW1lbnRhbEVkaXRQbHVnaW4gSU5TVEFOQ0UgPSBuZXcgRXhwZXJpbWVudGFsRWRpdFBsdWdpbigpOworCisJLyoqCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFeHBlcmltZW50YWxFZGl0UGx1Z2luKCkgeworCQlzdXBlcgorCQkgIChuZXcgUmVzb3VyY2VMb2NhdG9yIFtdIHsKKwkJICAgICBEaXNlYXNlbW9kZWxzRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJICAgICBDb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJICAgICBEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCSAgIH0pOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKworCS8qKgorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7CisJCS8qKgorCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgeworCQkJc3VwZXIoKTsKKworCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4KKwkJCS8vCisJCQlwbHVnaW4gPSB0aGlzOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL3Byb3ZpZGVyL0V4cGVyaW1lbnRhbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL3Byb3ZpZGVyL0V4cGVyaW1lbnRhbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI5MzljNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvcHJvdmlkZXIvRXhwZXJpbWVudGFsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDIxMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLnV0aWwuRXhwZXJpbWVudGFsQWRhcHRlckZhY3Rvcnk7CisKKy8qKgorICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLgorICogVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uCisgKiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgorICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRXhwZXJpbWVudGFsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBFeHBlcmltZW50YWxBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXhwZXJpbWVudGFsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuUGVyY29sYXRpb25EaXNlYXNlTW9kZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGVyY29sYXRpb25EaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgcGVyY29sYXRpb25EaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5QZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUGVyY29sYXRpb25EaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlpZiAocGVyY29sYXRpb25EaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJcGVyY29sYXRpb25EaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPSBuZXcgUGVyY29sYXRpb25EaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gcGVyY29sYXRpb25EaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gcm9vdEFkYXB0ZXJGYWN0b3J5CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gcGFyZW50QWRhcHRlckZhY3RvcnkgCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKKwkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7CisJCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgeworCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgeworCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOworCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzczw/Pil0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgeworCQkJCXJldHVybiBhZGFwdGVyOworCQkJfQorCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gbm90aWZ5Q2hhbmdlZExpc3RlbmVyIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG5vdGlmeUNoYW5nZWRMaXN0ZW5lciAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKKwkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBub3RpZmljYXRpb24gCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKworCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgeworCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJaWYgKHBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyICE9IG51bGwpIHBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvcHJvdmlkZXIvUGVyY29sYXRpb25EaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvcHJvdmlkZXIvUGVyY29sYXRpb25EaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDI5MDcxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC9wcm92aWRlci9QZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTU3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5QZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLlBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeSAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgUGVyY29sYXRpb25EaXNlYXNlTW9kZWwuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCAKKwkgKiBAcmV0dXJuIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlR2VuKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1BlcmNvbGF0aW9uRGlzZWFzZU1vZGVsIikpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoUGVyY29sYXRpb25EaXNlYXNlTW9kZWwpb2JqZWN0KS5nZXRVUkkoKS5sYXN0U2VnbWVudCgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1BlcmNvbGF0aW9uRGlzZWFzZU1vZGVsX3R5cGUiKSA6CisJCQlsYWJlbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoUGVyY29sYXRpb25EaXNlYXNlTW9kZWwpb2JqZWN0KS5nZXREaXNlYXNlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1BlcmNvbGF0aW9uRGlzZWFzZU1vZGVsX3R5cGUiKSA6CisJCQlnZXRTdHJpbmcoIl9VSV9QZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbF90eXBlIikgKyAiICIgKyBsYWJlbDsKKwl9CisJCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB1cGRhdGVDaGlsZHJlbiB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gRXhwZXJpbWVudGFsRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvdXRpbC9FeHBlcmltZW50YWxBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC91dGlsL0V4cGVyaW1lbnRhbEFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3NzgyZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvdXRpbC9FeHBlcmltZW50YWxBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzU1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuRXhwZXJpbWVudGFsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLlBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5FeHBlcmltZW50YWxQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFeHBlcmltZW50YWxBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgRXhwZXJpbWVudGFsUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4cGVyaW1lbnRhbEFkYXB0ZXJGYWN0b3J5KCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IEV4cGVyaW1lbnRhbFBhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgeworCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKKwkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEV4cGVyaW1lbnRhbFN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9CisJCW5ldyBFeHBlcmltZW50YWxTd2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbChQZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUGVyY29sYXRpb25EaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVJZGVudGlmaWFibGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZWNvcmF0b3IoRGVjb3JhdG9yIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVEZWNvcmF0b3JBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VOb2RlRGVjb3JhdG9yKE5vZGVEZWNvcmF0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZU5vZGVEZWNvcmF0b3JBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTYW5pdHlDaGVja2VyKFNhbml0eUNoZWNrZXIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNhbml0eUNoZWNrZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEaXNlYXNlTW9kZWwoRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbChTdGFuZGFyZERpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU3RhbmRhcmREaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTSShTSSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU0lBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTSVIoU0lSIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTSVJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTRUlSKFNFSVIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNFSVJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdG9jaGFzdGljRGlzZWFzZU1vZGVsKFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0b2NoYXN0aWNEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbChTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgorCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgeworCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKKwl9CisKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5QZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbCA8ZW0+UGVyY29sYXRpb24gRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLlBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvciA8ZW0+RGVjb3JhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVjb3JhdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvciA8ZW0+Tm9kZSBEZWNvcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTm9kZURlY29yYXRvckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyIDxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2FuaXR5Q2hlY2tlckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCA8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsIDxlbT5EaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGFuZGFyZERpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJIDxlbT5TSTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU0lBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVIgPGVtPlNJUjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNJUkFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVIgPGVtPlNFSVI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU0VJUkFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNEaXNlYXNlTW9kZWwgPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdG9jaGFzdGljRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsIDxlbT5TdG9jaGFzdGljIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCA8ZW0+U3RvY2hhc3RpYyBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL0V4cGVyaW1lbnRhbEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL3V0aWwvRXhwZXJpbWVudGFsU3dpdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL3V0aWwvRXhwZXJpbWVudGFsU3dpdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4OTRiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvdXRpbC9FeHBlcmltZW50YWxTd2l0Y2guamF2YQpAQCAtMCwwICsxLDM0NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLnV0aWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuRXhwZXJpbWVudGFsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLlBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQorICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAorICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKKyAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKyAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAorICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAcGFyYW0gPFQ+IAorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLkV4cGVyaW1lbnRhbFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBFeHBlcmltZW50YWxTd2l0Y2g8VD4geworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgRXhwZXJpbWVudGFsUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4cGVyaW1lbnRhbFN3aXRjaCgpIHsKKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7CisJCQltb2RlbFBhY2thZ2UgPSBFeHBlcmltZW50YWxQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHRoZUVPYmplY3QgCisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOworCQl9CisJCWVsc2UgeworCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7CisJCQlyZXR1cm4KKwkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPworCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6CisJCQkJCWRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgeworCQkJY2FzZSBFeHBlcmltZW50YWxQYWNrYWdlLlBFUkNPTEFUSU9OX0RJU0VBU0VfTU9ERUw6IHsKKwkJCQlQZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbCBwZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbCA9IChQZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsKHBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbChwZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU0VJUihwZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKHBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTSVIocGVyY29sYXRpb25EaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0b2NoYXN0aWNEaXNlYXNlTW9kZWwocGVyY29sYXRpb25EaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNJKHBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEaXNlYXNlTW9kZWwocGVyY29sYXRpb25EaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0YW5kYXJkRGlzZWFzZU1vZGVsKHBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlRGVjb3JhdG9yKHBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTYW5pdHlDaGVja2VyKHBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZWNvcmF0b3IocGVyY29sYXRpb25EaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShwZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBlcmNvbGF0aW9uIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJjb2xhdGlvbiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUGVyY29sYXRpb25EaXNlYXNlTW9kZWwoUGVyY29sYXRpb25EaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWNvcmF0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVjb3JhdG9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlRGVjb3JhdG9yKERlY29yYXRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgRGVjb3JhdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgRGVjb3JhdG9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlTm9kZURlY29yYXRvcihOb2RlRGVjb3JhdG9yIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2FuaXR5IENoZWNrZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2FuaXR5IENoZWNrZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VTYW5pdHlDaGVja2VyKFNhbml0eUNoZWNrZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VEaXNlYXNlTW9kZWwoRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU3RhbmRhcmREaXNlYXNlTW9kZWwoU3RhbmRhcmREaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TSTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TSTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVNJKFNJIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0lSPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNJUjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVNJUihTSVIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TRUlSPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNFSVI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VTRUlSKFNFSVIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdG9jaGFzdGljIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RvY2hhc3RpYyBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbChTdG9jaGFzdGljRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RvY2hhc3RpYyBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbChTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdG9jaGFzdGljIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdG9jaGFzdGljIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsKFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL0V4cGVyaW1lbnRhbFN3aXRjaApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGU4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNzgyODUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2U8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTFmMmRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw3OCBAQAorI1R1ZSBTZXAgMjMgMDk6MzU6MTIgRURUIDIwMDgKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODdkZTIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDQwIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZTtzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UucHJvdmlkZXIuRXh0ZXJuYWxEYXRhU291cmNlRWRpdFBsdWdpbiRJbXBsZW1lbnRhdGlvbgorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcywKKyBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2U7dXNlczo9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZCxvcmcuZWNsaXBzZS5lbWYuZWNvcmUiLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuaW1wbDsKKyAgdXNlczo9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZCwKKyAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLAorICAgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZSwKKyAgIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLAorICAgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLAorICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMsCisgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUiLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UucHJvdmlkZXI7CisgIHVzZXM6PSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLAorICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aSwKKyAgIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlciwKKyAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LAorICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIsCisgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwsCisgICBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLnV0aWwiLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UudXRpbDsKKyAgdXNlczo9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZCwKKyAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwsCisgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeSwKKyAgIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbCwKKyAgIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24sCisgICBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLAorICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZDdmNDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMyBAQAorIyA8Y29weXJpZ2h0PgorIyA8L2NvcHlyaWdodD4KKyMKKyMgJElkOiBidWlsZC5wcm9wZXJ0aWVzLHYgMS4xIDIwMDgvMDMvMTggMDQ6NDg6MzggamthdWZtYW4gRXhwICQKKworYmluLmluY2x1ZGVzID0gLixcCisgICAgICAgICAgICAgICBpY29ucy8sXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKK2phcnMuY29tcGlsZS5vcmRlciA9IC4KK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNDA0ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL2ljb25zL2Z1bGwvb2JqMTYvRXhwZXJpbWVudGFsRGlzZWFzZU1vZGVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvaWNvbnMvZnVsbC9vYmoxNi9FeHBlcmltZW50YWxEaXNlYXNlTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOGZiOGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL2ljb25zL2Z1bGwvb2JqMTYvRXhwZXJpbWVudGFsRGlzZWFzZU1vZGVsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL2ljb25zL2Z1bGwvb2JqMTYvRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvaWNvbnMvZnVsbC9vYmoxNi9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNmUzYjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL2ljb25zL2Z1bGwvb2JqMTYvRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL2ljb25zL2Z1bGwvb2JqMTYvRXh0ZXJuYWxEYXRhU291cmNlTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvaWNvbnMvZnVsbC9vYmoxNi9FeHRlcm5hbERhdGFTb3VyY2VNb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOTQ0MTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL2ljb25zL2Z1bGwvb2JqMTYvRXh0ZXJuYWxEYXRhU291cmNlTW9kZWxGaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL2ljb25zL2Z1bGwvd2l6YmFuL05ld0V4dGVybmFsRGF0YVNvdXJjZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL2ljb25zL2Z1bGwvd2l6YmFuL05ld0V4dGVybmFsRGF0YVNvdXJjZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjOGI3NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvaWNvbnMvZnVsbC93aXpiYW4vTmV3RXh0ZXJuYWxEYXRhU291cmNlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL21vZGVsL0V4dGVybmFsRGF0YVNvdXJjZS5nZW5tb2RlbCBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvbW9kZWwvRXh0ZXJuYWxEYXRhU291cmNlLmdlbm1vZGVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZWI1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL21vZGVsL0V4dGVybmFsRGF0YVNvdXJjZS5nZW5tb2RlbApAQCAtMCwwICsxLDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKKyAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYyIKKyAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjIgorICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UiIG1vZGVsTmFtZT0iRXh0ZXJuYWxEYXRhU291cmNlIgorICAgIG5vbk5MU01hcmtlcnM9InRydWUiIHRlc3RzRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMiCisgICAgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLmphdmEiIGNvbXBsaWFuY2VMZXZlbD0iNS4wIiBjb3B5cmlnaHRGaWVsZHM9ImZhbHNlIgorICAgIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL21vZGVsL2Rpc2Vhc2Vtb2RlbHMuZ2VubW9kZWwjLy9zdGFuZGFyZCAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL2NvbW1vbiAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL21vZGVsIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vZ3JhcGggLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9tb2RlbC9kZWZpbml0aW9ucy5nZW5tb2RlbCMvL2xhYmVscyAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL21vZGlmaWVyIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9zY2VuYXJpbyAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL3NlcXVlbmNlciI+CisgIDxmb3JlaWduTW9kZWw+QG1vZGVsPC9mb3JlaWduTW9kZWw+CisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkV4dGVybmFsRGF0YVNvdXJjZSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscyIKKyAgICAgIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiIG11bHRpcGxlRWRpdG9yUGFnZXM9ImZhbHNlIiBlY29yZVBhY2thZ2U9ImV4dGVybmFsZGF0YXNvdXJjZS5lY29yZSMvIj4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJleHRlcm5hbGRhdGFzb3VyY2UuZWNvcmUjLy9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGV4dGVybmFsZGF0YXNvdXJjZS5lY29yZSMvL0V4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbC9kYXRhUGF0aCIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBleHRlcm5hbGRhdGFzb3VyY2UuZWNvcmUjLy9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwvZGlzZWFzZVR5cGUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgIDwvZ2VuUGFja2FnZXM+Cis8L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9tb2RlbC9leHRlcm5hbGRhdGFzb3VyY2UuZWNvcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL21vZGVsL2V4dGVybmFsZGF0YXNvdXJjZS5lY29yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzViOTRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9tb2RlbC9leHRlcm5hbGRhdGFzb3VyY2UuZWNvcmUKQEAgLTAsMCArMSwxMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iZXh0ZXJuYWxkYXRhc291cmNlIgorICAgIG5zVVJJPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UuZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlIj4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvbW9kZWwvc3RhbmRhcmQuZWNvcmUjLy9EaXNlYXNlTW9kZWwiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXRhUGF0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkaXNlYXNlVHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKzwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjhkZDEwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9wbHVnaW4ucHJvcGVydGllcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmViNzc5MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvcGx1Z2luLnhtbApAQCAtMCwwICsxLDQ0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgorCis8IS0tCisgPGNvcHlyaWdodD4KKyA8L2NvcHlyaWdodD4KKworICRJZDogcGx1Z2luLnhtbCx2IDEuMSAyMDA4LzAzLzE4IDA0OjQ4OjM4IGprYXVmbWFuIEV4cCAkCistLT4KKworPHBsdWdpbj4KKyAgICAKKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQuaXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcmllcyI+CisgICAgPGZhY3RvcnkgCisgICAgICAgdXJpID0gImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS5lY29yZSIgCisgICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5wcm92aWRlci5FeHRlcm5hbERhdGFTb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIgCisgICAgICAgc3VwcG9ydGVkVHlwZXMgPSAKKyAgICAgICAgICJvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcgorICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcgorICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcgorICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcgorICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UiIC8+CisgIDwvZXh0ZW5zaW9uPgorCisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+CisgICAgPHBhY2thZ2UKKyAgICAgICB1cmkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlLmVjb3JlIgorICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZSIKKyAgICAgICBnZW5Nb2RlbCA9ICJtb2RlbC9leHRlcm5hbGRhdGFzb3VyY2UuZ2VubW9kZWwiIC8+IAorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmRpc2Vhc2Vtb2RlbCI+CisgICAgIDxjbGFzc2RlZgorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5pbXBsLkV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEltcGwiPgorICAgICA8L2NsYXNzZGVmPgorICAgICA8ZHVibGluX2NvcmUKKyAgICAgICAgICAgY3JlYXRvcj0iJWRjX2NyZWF0b3Jfa2F1Zm1hbiIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IiVkY19kZXNjX0VfU19TRUlSIgorICAgICAgICAgICBpZGVudGlmaWVyPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLmR1Ymxpbl9jb3JlNCIKKyAgICAgICAgICAgdGl0bGU9IiVkY190aXRsZV9FX1NfU0VJUiI+CisgICAgIDwvZHVibGluX2NvcmU+CisgIDwvZXh0ZW5zaW9uPgorCis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL0V4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNmFiODYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL0V4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvLyBFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwuamF2YQ0KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZTsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitpbXBvcnQgamF2YS5pby5GaWxlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLkFjdGl2YXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsNCisNCisvKioNCisgKiBUaGlzIGludGVyZmFjZSBpcyBhbiBFTUYgTW9kZWwuDQorICogDQorICogQG1vZGVsDQorICovDQorcHVibGljIGludGVyZmFjZSBFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwgZXh0ZW5kcyBEaXNlYXNlTW9kZWwsIEludGVncmF0aW9uRGVjb3JhdG9yIHsNCisNCisNCisJLyoqDQorICAgICAqIGRlZmF1bHQgdHlwZSBvZiBkYXRhIHRvIGlucHV0DQorICAgICAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfVFlQRV9TSSA9ICJTSSI7DQorCS8qKg0KKyAgICAgKiBkZWZhdWx0IHR5cGUgb2YgZGF0YSB0byBpbnB1dA0KKyAgICAgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX1RZUEVfU0lSID0gIlNJUiI7DQorCS8qKg0KKyAgICAgKiBkZWZhdWx0IHR5cGUgb2YgZGF0YSB0byBpbnB1dA0KKyAgICAgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX1RZUEVfU0VJUiA9ICJTRUlSIjsNCisJDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBEZWZhdWx0IFJPT1QgZm9sZGVyIGZvciBJbXBvcnQgZmlsZXMuDQorCSAqIFRoZSBVc2VyIGNhbiBjaGFuZ2UgdGhpcyBidXQgYnkgZGVmYXVsdCwgYW5kIGZvciB0ZXN0aW5nLA0KKwkgKiBkYXRhIHdpbGwgYmUgaW4gc3ViLWZvbGRlcnMgb2YgdGhlIGRpc2Vhc2UgbW9kZWwgcGx1Zy1pbiBydW50aW1lIHByZWZlcmVuY2VzDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIFBBVEggPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKTsNCisNCisJLyoqDQorCSAqIHBhdGggc2VwYXJhdG9yDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBzZXAgPSBGaWxlLnNlcGFyYXRvcjsNCisJDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBEZWZhdWx0IGZvbGRlciBmb3IgSW1wb3J0IGZpbGVzLg0KKwkgKiBUaGUgVXNlciBjYW4gY2hhbmdlIHRoaXMgYnV0IGJ5IGRlZmF1bHQsIGFuZCBmb3IgdGVzdGluZywNCisJICogZGF0YSB3aWxsIGJlIGluIHN1Yi1mb2xkZXJzIG9mIHRoZSBkaXNlYXNlIG1vZGVsIHBsdWctaW4gcnVudGltZSBwcmVmZXJlbmNlcw0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBWUJBQ0tfU1VCRElSID0gc2VwKyJjc3YiK3NlcCsiSW1wb3J0IjsNCisJDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBEZWZhdWx0IGRpcmVjdG9yeSBmb3IgSW1wb3J0IGZpbGVzLg0KKwkgKiBUaGUgVXNlciBjYW4gY2hhbmdlIHRoaXMgYnV0IGJ5IGRlZmF1bHQsIGFuZCBmb3IgdGVzdGluZywNCisJICogZGF0YSB3aWxsIGJlIGluIHN1Yi1mb2xkZXJzIG9mIHRoZSBkaXNlYXNlIG1vZGVsIHBsdWctaW4gcnVudGltZSBwcmVmZXJlbmNlcw0KKwkgKi8JDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRElSID0gUEFUSC50b09TU3RyaW5nKCkgKyBQTEFZQkFDS19TVUJESVIrc2VwOw0KKwkNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRhdGEgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YSBQYXRoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhIFBhdGg8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXREYXRhUGF0aChTdHJpbmcpDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlI2dldEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbF9EYXRhUGF0aCgpDQorCSAqIEBtb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZ2V0RGF0YVBhdGgoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsI2dldERhdGFQYXRoIDxlbT5EYXRhIFBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRhdGEgUGF0aDwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2dldERhdGFQYXRoKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXREYXRhUGF0aChTdHJpbmcgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzZWFzZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNlYXNlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc2Vhc2UgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldERpc2Vhc2VUeXBlKFN0cmluZykNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLkV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UjZ2V0RXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsX0Rpc2Vhc2VUeXBlKCkNCisJICogQG1vZGVsDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBnZXREaXNlYXNlVHlwZSgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwjZ2V0RGlzZWFzZVR5cGUgPGVtPkRpc2Vhc2UgVHlwZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlzZWFzZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0RGlzZWFzZVR5cGUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldERpc2Vhc2VUeXBlKFN0cmluZyB2YWx1ZSk7CQ0KKw0KKwkNCisJDQorCQ0KKwkNCit9IC8vIEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvRXh0ZXJuYWxEYXRhU291cmNlRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS9FeHRlcm5hbERhdGFTb3VyY2VGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4NWFhYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvRXh0ZXJuYWxEYXRhU291cmNlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8vIEV4dGVybmFsRGF0YVNvdXJjZUZhY3RvcnkKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXh0ZXJuYWxEYXRhU291cmNlRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUV4dGVybmFsRGF0YVNvdXJjZUZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5pbXBsLkV4dGVybmFsRGF0YVNvdXJjZUZhY3RvcnlJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsIGNyZWF0ZUV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlIGdldEV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UoKTsKKworfSAvL0V4dGVybmFsRGF0YVNvdXJjZUZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS9FeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA2ZTkyYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsMjg3IEBACisvLyBFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlIAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAorICogPHVsPgorICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKyAqIDwvdWw+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VGYWN0b3J5CisgKiBAbW9kZWwga2luZD0icGFja2FnZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgeworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOQU1FID0gImV4dGVybmFsZGF0YXNvdXJjZSI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS5lY29yZSI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlIjsKKworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLmltcGwuRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZUltcGwuaW5pdCgpOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLmltcGwuRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsSW1wbCA8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuaW1wbC5FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLmltcGwuRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZUltcGwjZ2V0RXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUwgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUxfX1VSSSA9IFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWFRFUk5BTF9EQVRBX1NPVVJDRV9ESVNFQVNFX01PREVMX19UWVBFX1VSSSA9IFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFID0gU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUxfX0xBQkVMU19UT19VUERBVEUgPSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fTEFCRUxTX1RPX1VQREFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWFRFUk5BTF9EQVRBX1NPVVJDRV9ESVNFQVNFX01PREVMX19HUkFQSCA9IFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19HUkFQSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRVhURVJOQUxfREFUQV9TT1VSQ0VfRElTRUFTRV9NT0RFTF9fRU5BQkxFRCA9IFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19FTkFCTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUxfX0dSQVBIX0RFQ09SQVRFRCA9IFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEUgPSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWFRFUk5BTF9EQVRBX1NPVVJDRV9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRVhURVJOQUxfREFUQV9TT1VSQ0VfRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0QgPSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0Q7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRVhURVJOQUxfREFUQV9TT1VSQ0VfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FID0gU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfX0RJU0VBU0VfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhIFBhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWFRFUk5BTF9EQVRBX1NPVVJDRV9ESVNFQVNFX01PREVMX19EQVRBX1BBVEggPSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNlYXNlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFWFRFUk5BTF9EQVRBX1NPVVJDRV9ESVNFQVNFX01PREVMX19ESVNFQVNFX1RZUEUgPSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EaXNlYXNlIE1vZGVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCA9IFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAyOworCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLkV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCA8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLkV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCNnZXREYXRhUGF0aCA8ZW0+RGF0YSBQYXRoPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF0YSBQYXRoPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwjZ2V0RGF0YVBhdGgoKQorCSAqIEBzZWUgI2dldEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsX0RhdGFQYXRoKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsI2dldERpc2Vhc2VUeXBlIDxlbT5EaXNlYXNlIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaXNlYXNlIFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLkV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCNnZXREaXNlYXNlVHlwZSgpCisJICogQHNlZSAjZ2V0RXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxfRGlzZWFzZVR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogQGdlbmVyYXRlZAorCSAqLworCUV4dGVybmFsRGF0YVNvdXJjZUZhY3RvcnkgZ2V0RXh0ZXJuYWxEYXRhU291cmNlRmFjdG9yeSgpOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50CisJICogPHVsPgorCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisJICogPC91bD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50ZXJmYWNlIExpdGVyYWxzIHsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLmltcGwuRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsSW1wbCA8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuaW1wbC5FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5pbXBsLkV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2VJbXBsI2dldEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBFWFRFUk5BTF9EQVRBX1NPVVJDRV9ESVNFQVNFX01PREVMID0gZUlOU1RBTkNFLmdldEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGF0YSBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRVhURVJOQUxfREFUQV9TT1VSQ0VfRElTRUFTRV9NT0RFTF9fREFUQV9QQVRIID0gZUlOU1RBTkNFLmdldEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbF9EYXRhUGF0aCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRVhURVJOQUxfREFUQV9TT1VSQ0VfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9UWVBFID0gZUlOU1RBTkNFLmdldEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbF9EaXNlYXNlVHlwZSgpOworCisJfQorCit9IC8vRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS9pbXBsL0V4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvaW1wbC9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNmNDRhMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvaW1wbC9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxJbXBsLmphdmEKQEAgLTAsMCArMSw4MDQgQEAKKy8vIEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEltcGwNCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuaW1wbDsNCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLnV0aWwuQ1NWc2NlbmFyaW9Mb2FkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLkFjdGl2YXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbFN0YXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWxWYWx1ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsVmFsdWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuRGlzZWFzZU1vZGVsSW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0VJUkxhYmVsVmFsdWVJbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSUxhYmVsVmFsdWVJbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJMYWJlbFZhbHVlSW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzZWFzZSBNb2RlbDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLmltcGwuRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsSW1wbCNnZXREYXRhUGF0aCA8ZW0+RGF0YSBQYXRoPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5pbXBsLkV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEltcGwjZ2V0RGlzZWFzZVR5cGUgPGVtPkRpc2Vhc2UgVHlwZTwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEltcGwgZXh0ZW5kcyBEaXNlYXNlTW9kZWxJbXBsIGltcGxlbWVudHMgRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsIHsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhUGF0aCgpIDxlbT5EYXRhIFBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldERhdGFQYXRoKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9QQVRIX0VERUZBVUxUID0gbnVsbDsNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGFQYXRoKCkgPGVtPkRhdGEgUGF0aDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0RGF0YVBhdGgoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFQYXRoID0gREFUQV9QQVRIX0VERUZBVUxUOw0KKw0KKwkvL3ByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBVUklfUFJFRklYX1BBVFRFUk4gPSAiZ2VvL3JlZ2lvbi8iOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc2Vhc2VUeXBlKCkgPGVtPkRpc2Vhc2UgVHlwZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0RGlzZWFzZVR5cGUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBESVNFQVNFX1RZUEVfRURFRkFVTFQgPSBudWxsOw0KKwkvKioNCisJICogVGhpcyBwcmVmaXggcHJlY2VkZXMgdGhlIG5vZGUgaWQgYW5kIG11c3QgYmUgcmVtb3ZlZCBpbiB0aGUgDQorCSAqIGZpbHRlckZpbGVuYW1lIG1ldGhvZCB0byBhdXRvLWdlbmVyYXRlIHRoZSBvdXRwdXQgZmlsZSBuYW1lLg0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05JRF9QUkVGSVggPSAiL25vZGUvZ2VvL3JlZ2lvbi8iOw0KKw0KKw0KKwkvKioNCisJICogRGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNjZW5hcmlvIHRvIGltcG9ydCBhbmQgcGxheSBiYWNrDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGRpck5hbWUgPSBERUZBVUxUX0RJUjsNCisNCisJLyoqDQorCSAqIGEgbWFwIG9mIG1hcHMgKG9uZSBmb3IgZWFjaCBsb2NhdGlvbiBjb250YWluaW5nIGEgZGF0YSBmaWxlDQorCSAqLw0KKwlwcml2YXRlIFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwgc2NlbmFyaW9NYXAgPSBudWxsOw0KKw0KKwkvKioNCisJICogYSBsaXN0IG9mIGRhdGEgZm9yIGVhY2ggbG9jYXRpb24ga2V5ZWQgYnkgbm9kZUlEDQorCSAqLw0KKwlwcml2YXRlIFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGRhdGFJbnN0YW5jZSA9IG51bGw7DQorDQorDQorCS8qKg0KKwkgKiBhIGZhbHNlIChIaWRkZW4pIHRpbWUgY291bnRlciB1c2VkIGZvciB0aGlzIHRveSBleGFtcGxlDQorCSAqLw0KKwlwcml2YXRlIGludCBmaWxlTGluZUNvdW50ZXIgPSAwOw0KKw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBsYWJlbFMgID0gbnVsbCA7DQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxhYmVsRSAgPSBudWxsIDsNCisJcHVibGljIHN0YXRpYyBTdHJpbmcgbGFiZWxJID0gbnVsbCA7DQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxhYmVsUiAgPSBudWxsIDsNCisNCisJLyoqDQorCSAqIG5vdCB1c2VkDQorCSAqLw0KKwlwcml2YXRlIGRvdWJsZSB0b3RhbFBvcHVsYXRpb25Db3VudCA9IDAuMDsNCisJcHJpdmF0ZSBkb3VibGUgdG90YWxBcmVhID0gMC4wOw0KKw0KKwlwcml2YXRlIFN0cmluZyBkaXNlYXNlVHlwZTsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEltcGwoKSB7DQorCQlzdXBlcigpOw0KKwl9DQorDQorDQorDQorDQorCS8qKg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkRlY29yYXRvckltcGwjdXBkYXRlTGFiZWxzKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCwNCisJICogICAgICBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUpDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgdXBkYXRlTGFiZWxzKGZpbmFsIFNURU1UaW1lIHRpbWUsIGZpbmFsIGxvbmcgdGltZURlbHRhLCBpbnQgY3ljbGUpIHsNCisNCisNCisJCS8vIE1BRCAxMC8yOS8yMDA5DQorCQkvLyBDb21tZW50ZWQgb3V0IGNvZGUsIG1vdmVkIHRvICJjYWxjdWxhdGVEZWx0YSIgZm9yIEludGVncmF0aW9uRGVjb3JhdG9yLg0KKwkJLy8gTm90IHN1cmUgd2hhdCB1cGRhdGVzIG5lZWQgdG8gaGFwcGVuIHRvICJ1cGRhdGVMYWJlbHMiLg0KKw0KKwkJLyoNCisJCS8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIG9mIHRoZSBsYWJlbHMgd2UgbmVlZCB0byB1cGRhdGUuDQorCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPER5bmFtaWNMYWJlbD4gY3VycmVudFN0YXRlTGFiZWxJdGVyID0gZ2V0TGFiZWxzVG9VcGRhdGUoKQ0KKwkJCQkuaXRlcmF0b3IoKTsgY3VycmVudFN0YXRlTGFiZWxJdGVyLmhhc05leHQoKTspIHsNCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VMYWJlbCA9IChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKSBjdXJyZW50U3RhdGVMYWJlbEl0ZXINCisJCQkJCS5uZXh0KCk7DQorDQorCQkJYXNzZXJ0IGRpc2Vhc2VMYWJlbC5nZXRQb3B1bGF0aW9uTGFiZWwoKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpDQorCQkJCQkuZXF1YWxzKGdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkpOw0KKw0KKwkJCS8vIFRoaXMgaXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRpc2Vhc2UgZm9yIHRoaXMgbGFiZWwNCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY3VycmVudFN0YXRlID0gKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwNCisJCQkJCS5nZXRDdXJyZW50VmFsdWUoKTsNCisNCisNCisJCQkvLyAyKSBDb21wdXRlIHRoZSBzdGF0ZSB0cmFuc2l0aW9ucw0KKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBudWxsQWRkaXRpb25zID0gaW1wb3J0RGlzZWFzZURhdGEoY3VycmVudFN0YXRlLCBkaXNlYXNlTGFiZWwsIHRpbWUsIHRpbWVEZWx0YSk7DQorDQorDQorCQkJLy8gVGhpcyB3aWxsIGJlIHRoZSBzdGF0ZSB0aGF0IHdlIGNvbXB1dGUuDQorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIG5leHRTdGF0ZSA9IChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpZGlzZWFzZUxhYmVsLmdldE5leHRWYWx1ZSgpOw0KKw0KKwkJCS8vIEluaXRpYWxpemUgdGhlIG5leHQgc3RhdGUgZnJvbSB0aGUgY3VycmVudCBzdGF0ZSBhbmQgdGhlbiB3ZSdsbA0KKwkJCS8vIG1ha2UgdGhlIGNoYW5nZXMgdG8gdGhhdC4NCisJCQluZXh0U3RhdGUuc2V0KGN1cnJlbnRTdGF0ZSk7DQorDQorDQorDQorCQkJYXNzZXJ0IG5leHRTdGF0ZS5zYW5lKCk6ImRpc2Vhc2Ugc3RhdGUgaXMgaW5zYW5lIGFmdGVyIHN1YnRyYWN0aW5nIGRlYXRoczogIituZXh0U3RhdGUudG9TdHJpbmcoKTsNCisNCisNCisJCQkvLyBUaGUgbmV4dCB2YWx1ZSBpcyB2YWxpZCBub3cuDQorCQkJZGlzZWFzZUxhYmVsLnNldE5leHRWYWx1ZVZhbGlkKHRydWUpOw0KKw0KKw0KKwkJfSAvLyBmb3INCisJCSsrZmlsZUxpbmVDb3VudGVyOw0KKwkJICovDQorCX0gLy8gdXBkYXRlTGFiZWxzDQorDQorCS8qKg0KKwkgKiBnZXQgdGhlIGNvbnN0YW50cyB3aGljaCBpZGVudGlmeSB0aGUgZGlzZWFzZSBsYWJlbCBzdGF0ZSB2YXJpYWJsZXMNCisJICogQHBhcmFtIGRpc2Vhc2VMYWJlbA0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eUxhYmVscygpIHsNCisJCVNFSVJMYWJlbFZhbHVlIGRpc2Vhc2VMYWJlbCA9IFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0VJUkxhYmVsKCkuZ2V0Q3VycmVudFNFSVJWYWx1ZSgpOw0KKwkJU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBpdGVtUHJvdmlkZXJGYWN0b3J5ID0gbmV3IFN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsNCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgcHJvcGVydHlTb3VyY2UgPSAoSUl0ZW1Qcm9wZXJ0eVNvdXJjZSkgaXRlbVByb3ZpZGVyRmFjdG9yeS5hZGFwdChkaXNlYXNlTGFiZWwsIFByb3BlcnR5U291cmNlLmNsYXNzKTsNCisJCUxpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BlcnRpZXMgPSBwcm9wZXJ0eVNvdXJjZS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG51bGwpOw0KKw0KKwkJSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlTID0gcHJvcGVydGllcy5nZXQoU3RhbmRhcmRQYWNrYWdlLlNFSVJfTEFCRUxfVkFMVUVfX1MpOw0KKwkJSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlFID0gcHJvcGVydGllcy5nZXQoU3RhbmRhcmRQYWNrYWdlLlNFSVJfTEFCRUxfVkFMVUVfX0UpOw0KKwkJSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlJID0gcHJvcGVydGllcy5nZXQoU3RhbmRhcmRQYWNrYWdlLlNFSVJfTEFCRUxfVkFMVUVfX0kpOw0KKwkJSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlSID0gcHJvcGVydGllcy5nZXQoU3RhbmRhcmRQYWNrYWdlLlNFSVJfTEFCRUxfVkFMVUVfX1IpOw0KKw0KKwkJbGFiZWxTID0gcHJvcGVydHlTLmdldERpc3BsYXlOYW1lKHByb3BlcnR5Uyk7DQorCQlsYWJlbEUgPSBwcm9wZXJ0eUUuZ2V0RGlzcGxheU5hbWUocHJvcGVydHlFKTsNCisJCWxhYmVsSSA9IHByb3BlcnR5SS5nZXREaXNwbGF5TmFtZShwcm9wZXJ0eUkpOw0KKwkJbGFiZWxSID0gcHJvcGVydHlSLmdldERpc3BsYXlOYW1lKHByb3BlcnR5Uik7DQorCX0vLyBzZXRQcm9wZXJ0eUxhYmVscw0KKw0KKwkvLyBXZSBuZWVkIHRoaXMgdG8gZGV0ZXJtaW5lIHdoZW4gYSBzaW11bGF0aW9uIGlzIHJlc3RhcnRlZCBzbyB3ZSANCisJLy8gY2FuIHJlc2V0IHRoZSBmaWxlIGxpbmUgY291bnRlci4gQWxzbyBuZWVkZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGluZSBudW1iZXIgaW4gdGhlIGZpbGUNCisJcHJpdmF0ZSBTVEVNVGltZSBmaXJzdFNURU1UaW1lID0gbnVsbDsNCisNCisJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCByZWFkRGF0YWZpbGVzKCkgew0KKwkJaWYoc2NlbmFyaW9NYXAgPT0gbnVsbCkgeyAvLyBOb3QgeWV0IGxvYWRlZA0KKwkJCXRyeSB7DQorCQkJCUNTVnNjZW5hcmlvTG9hZGVyIGxvYWRlciA9IG5ldyBDU1ZzY2VuYXJpb0xvYWRlcih0aGlzLmRhdGFQYXRoKTsNCisJCQkJLy9pbnQgbWF4cmVzb2x1dGlvbiA9IGxvYWRlci5nZXRNYXhSZXNvbHV0aW9uKCk7DQorCQkJCXNjZW5hcmlvTWFwID0gbG9hZGVyLnBhcnNlQWxsRmlsZXMoKTsNCisJCQkJLy8gU2V0IHRoZSBkaXNlYXNlIHR5cGUgaGVyZSBzaW5jZSB3ZSBkb24ndCBuZWVkIHRoYXQNCisJCQkJLy8gaW5wdXQgZnJvbSB0aGUgZW5kLXVzZXIgYW55IGxvbmdlcg0KKwkJCQl0aGlzLmRpc2Vhc2VUeXBlID0gbG9hZGVyLmdldFR5cGUoKS5uYW1lKCk7DQorCQkJfSBjYXRjaChTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uIHNpZSkgew0KKwkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkVycm9yIHJlYWRpbmcgc2NlbmFyaW8gZmlsZXMiLCBzaWUpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogDQorCSAqIFRoaXMgbWV0aG9kIHJlYWRzIHRoZSBuZXh0IHN0YXRlIGRhdGEgZnJvbSB0aGUgZXh0ZXJuYWwgZGF0YUZpbGUNCisJICogDQorCSAqIEBwYXJhbSBkZWx0YVN0YXRlDQorCSAqIEBwYXJhbSBkaXNlYXNlTGFiZWwNCisJICogQHBhcmFtIHRpbWUNCisJICogQHBhcmFtIHRpbWVEZWx0YQ0KKwkgKiBAcmV0dXJuDQorCSAqLw0KKwlwdWJsaWMgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGltcG9ydERpc2Vhc2VEYXRhKA0KKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBkZWx0YVN0YXRlLA0KKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZUxhYmVsLCBmaW5hbCBTVEVNVGltZSB0aW1lLCBmaW5hbCBsb25nIHRpbWVEZWx0YSkgew0KKw0KKwkJaWYobGFiZWxTPT1udWxsKSBzZXRQcm9wZXJ0eUxhYmVscygpOw0KKw0KKwkJLy8gVE9ETw0KKwkJLy8gdGhlIGZpbGVuYW1lIGFjdHVhbGx5IGNvbWVzIGZyb20gdGhlIG5vZGUgaXRzZWxmDQorCQkvLyB3ZSBuZWVkIHRvIHJlZ2VuIHRoZSBjb2RlIHdpdGggYSBzY2VuYXJpb0RpcmVjdG9yeSANCisJCS8vIHNwZWNpZmljYXRpb24gYXMgZXZlcnkgbm9kZSBtYXBzIHRvIGEgZGlmZmVyZW50IGRhdGEgZmlsZS4gZm9yIG5vdyB3ZSB3aWxsIHRlc3QNCisJCS8vIHdpdGggb25seSBvbmUgbm9kZSBhbmQgb25lIGZpbGUNCisJCS8vIG5lZWQgYSBtYXAgb2YgbWFwcyBrZXllZCBieSBsb2NhdGlvbiBuYW1lDQorDQorDQorCQlJZGVudGlmaWFibGUgaWRlbnQgPSBkaXNlYXNlTGFiZWwuZ2V0SWRlbnRpZmlhYmxlKCk7DQorCQlTdHJpbmcgZmlsZU5hbWUgPSBpZGVudC5nZXRVUkkoKS50b1N0cmluZygpOw0KKwkJaW50IGxhc3QgPSBmaWxlTmFtZS5sYXN0SW5kZXhPZihMT0NBVElPTklEX1BSRUZJWCk7DQorCQlsYXN0ICs9IExPQ0FUSU9OSURfUFJFRklYLmxlbmd0aCgpOw0KKwkJU3RyaW5nIGtleSA9IGZpbGVOYW1lLnN1YnN0cmluZyhsYXN0LGZpbGVOYW1lLmxlbmd0aCgpKTsNCisNCisNCisJCWRhdGFJbnN0YW5jZSA9IHNjZW5hcmlvTWFwLmdldExvY2F0aW9uKGtleSk7DQorCQkvLyBpZiBubyBkYXRhDQorCQlpZigoZGF0YUluc3RhbmNlPT1udWxsKXx8KGRhdGFJbnN0YW5jZS5nZXRTaXplKCkgPT0gMCkpIHsNCisJCQkvLyBubyBkYXRhIGZvciBsb2NhdGlvbiBpbiBxdWVzdGlvbnMNCisJCQlpZiAoZGlzZWFzZVR5cGUuZXF1YWxzKElNUE9SVF9UWVBFX1NJKSkgew0KKwkJCQlyZXR1cm4gbmV3IFNJTGFiZWxWYWx1ZUltcGwoMC4wICwgMC4wLCAwLjAsIDAuMCk7DQorCQkJfSBlbHNlIGlmIChkaXNlYXNlVHlwZS5lcXVhbHMoSU1QT1JUX1RZUEVfU0lSKSkgew0KKwkJCQlyZXR1cm4gbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDAuMCwgMC4wICwgMC4wLCAwLjAsIDAuMCk7DQorCQkJfSBlbHNlIGlmIChkaXNlYXNlVHlwZS5lcXVhbHMoSU1QT1JUX1RZUEVfU0VJUikpIHsNCisJCQkJcmV0dXJuIG5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoIDAuMCwgMC4wLCAwLjAgLCAwLjAsIDAuMCwgMC4wKTsNCisJCQl9IGVsc2Ugew0KKwkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkV4dGVybmFsRGF0YVNvdXJjZSBJbnZhbGlkIFR5cGUgIitkaXNlYXNlVHlwZSsiIG11c3QgYmUgU0ksIFNJUiwgb3IgU0VJUiIpOw0KKwkJCX0NCisJCX0NCisNCisJCS8vIEpISyBOb3RlczogSE9XIERPIEkgR0VUIFRIRSBDVVJSRU5UIFNURVA/Pw0KKwkJLy8gIA0KKwkJLy8gbm9kZSA+PiBncmFwaA0KKwkJLy8gZ3JhcGggPj4gc2NlbmFyaW8gdXNpbmcgU2ltdWxhdGlvbk1hbmdlciBtZXRob2QNCisJCS8vIFNpbXVsYXRpb25NYW5nZXIuZ2V0TWFuZ2VyKCkNCisJCS8vIHRoZW4gY2FsbCBtYW5hZ2VyLm1hcEdyYXBoVG9TaW11bGF0aW9uKGZpbmFsIEdyYXBoIGdyYXBoKSB7DQorCQkvLyB0byBnZXQgdGhlIHJ2aHAgeW91IGp1c3QgaGF2ZSB0byBhZGFwdCBpdCBhZ2Fpbi4NCisNCisJCS8vIGNzdiBkaXNlYXNlcyByZWFkIGZyb20gZmlsZSBrbm93IHRoZWlyIG93bg0KKwkJLy8gdGltZSBwZXJpb2QgcHJvcGVydHkgaW4gbWlsbGlzZWNzDQorCQkvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgInVwZGF0ZUxhYmVscyINCisJCS8vIHNob3VsZCByZWFsbHkgb3ZlcnJpZGUgdGhhdCBpbnN0ZWFkIGZvIGNvbXB1dGUgdHJhbnNpdGlvbnMNCisJCS8vIHVwZGF0ZUxhYmVscyBoYXMgdGhlIFRJTUUuDQorDQorCQkvLyBUT0RPDQorCQkvLyByZW1vdmUgZmlsdGVyIGluIFN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgDQorCQkvLyB3aGljaCBpcyBwcmV2ZW50aW5nIGRpc2Vhc2UgZGVhdGhzIGZyb20gYmVpbmcgbG9nZ2VkLg0KKwkJLy8gbWV0aG9kIGlzIFN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydGllcygpDQorDQorCQlkb3VibGUgZGVsdGFTICA9IDAuMDsNCisJCWRvdWJsZSBkZWx0YUUgID0gMC4wOw0KKwkJZG91YmxlIGRlbHRhSSA9IDAuMDsNCisJCWRvdWJsZSBkZWx0YVIgID0gMC4wOw0KKw0KKw0KKwkJU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGN1cnJlbnRWYWx1ZSA9IChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpZGlzZWFzZUxhYmVsLmdldEN1cnJlbnRWYWx1ZSgpOw0KKwkJLy8JCVN0cmluZyBpZCA9IGlkZW50LmdldFVSSSgpLnRvU3RyaW5nKCk7DQorCQkvLwkJaW50IHN0cnQgPSBpZC5pbmRleE9mKFVSSV9QUkVGSVhfUEFUVEVSTik7DQorCQkvLwkJaWYoc3RydD49MCkgew0KKwkJLy8JCQlpZCA9IGlkLnN1YnN0cmluZyhzdHJ0K1VSSV9QUkVGSVhfUEFUVEVSTi5sZW5ndGgoKSxpZC5sZW5ndGgoKSk7DQorCQkvLwkJfQ0KKw0KKwkJLy8JCWlmKChkYXRhSW5zdGFuY2UhPW51bGwpJiYoZGF0YUluc3RhbmNlLmluc3RhbmNlLmNvbnRhaW5zS2V5KGlkKSkpIHsNCisNCisJCS8vaWYoZGF0YUluc3RhbmNlIT1udWxsKSB7DQorCQkvLyBjb21wdXRlIHRoZSBjaGFuZ2VzDQorCQlpZihkYXRhSW5zdGFuY2UuZ2V0RGF0YShsYWJlbFMpLnNpemUoKSA+IGZpbGVMaW5lQ291bnRlcikgew0KKwkJCVN0cmluZyBzU3RyaW5nMSA9IGRhdGFJbnN0YW5jZS5nZXREYXRhKGxhYmVsUykuZ2V0KGZpbGVMaW5lQ291bnRlcik7DQorCQkJZGVsdGFTID0gbmV3IERvdWJsZShzU3RyaW5nMSkuZG91YmxlVmFsdWUoKSAtIGN1cnJlbnRWYWx1ZS5nZXRTKCk7DQorCQl9Ly8gUyANCisNCisJCWlmIChkaXNlYXNlVHlwZS5lcXVhbHMoSU1QT1JUX1RZUEVfU0VJUikpIA0KKwkJCWlmKGRhdGFJbnN0YW5jZS5nZXREYXRhKGxhYmVsRSkuc2l6ZSgpID4gZmlsZUxpbmVDb3VudGVyKSB7DQorCQkJCVN0cmluZyBlU3RyaW5nMSA9IGRhdGFJbnN0YW5jZS5nZXREYXRhKGxhYmVsRSkuZ2V0KGZpbGVMaW5lQ291bnRlcik7DQorCQkJCWRlbHRhRSA9IG5ldyBEb3VibGUoZVN0cmluZzEpLmRvdWJsZVZhbHVlKCkgLSAoKFNFSVJMYWJlbFZhbHVlKWN1cnJlbnRWYWx1ZSkuZ2V0RSgpOw0KKwkJCX0vLyBFDQorDQorCQlpZihkYXRhSW5zdGFuY2UuZ2V0RGF0YShsYWJlbEkpLnNpemUoKSA+IGZpbGVMaW5lQ291bnRlcikgew0KKwkJCVN0cmluZyBpU3RyaW5nMSA9IGRhdGFJbnN0YW5jZS5nZXREYXRhKGxhYmVsSSkuZ2V0KGZpbGVMaW5lQ291bnRlcik7DQorCQkJZGVsdGFJID0gbmV3IERvdWJsZShpU3RyaW5nMSkuZG91YmxlVmFsdWUoKSAtICgoU0lMYWJlbFZhbHVlKWN1cnJlbnRWYWx1ZSkuZ2V0SSgpOw0KKwkJfS8vaQ0KKw0KKwkJaWYgKGRpc2Vhc2VUeXBlLmVxdWFscyhJTVBPUlRfVFlQRV9TSVIpIHx8IGRpc2Vhc2VUeXBlLmVxdWFscyhJTVBPUlRfVFlQRV9TRUlSKSkgDQorCQkJaWYoZGF0YUluc3RhbmNlLmdldERhdGEobGFiZWxSKS5zaXplKCkgPiBmaWxlTGluZUNvdW50ZXIpIHsNCisJCQkJU3RyaW5nIHJTdHJpbmcxID0gZGF0YUluc3RhbmNlLmdldERhdGEobGFiZWxSKS5nZXQoZmlsZUxpbmVDb3VudGVyKTsNCisJCQkJZGVsdGFSID0gbmV3IERvdWJsZShyU3RyaW5nMSkuZG91YmxlVmFsdWUoKSAtICgoU0lSTGFiZWxWYWx1ZSljdXJyZW50VmFsdWUpLmdldFIoKTsNCisJCQl9Ly8gUg0KKw0KKwkJaWYgKGRpc2Vhc2VUeXBlLmVxdWFscyhJTVBPUlRfVFlQRV9TSSkpIHsNCisJCQkoKFNJTGFiZWxWYWx1ZSlkZWx0YVN0YXRlKS5zZXRTKGRlbHRhUyk7DQorCQkJKChTSUxhYmVsVmFsdWUpZGVsdGFTdGF0ZSkuc2V0SShkZWx0YUkpOw0KKwkJCSgoU0lMYWJlbFZhbHVlKWRlbHRhU3RhdGUpLnNldEluY2lkZW5jZShkZWx0YUkpOw0KKwkJCXJldHVybiBuZXcgU0lMYWJlbFZhbHVlSW1wbCggMC4wICwgMC4wLCAwLjAsIDAuMCk7DQorCQl9IGVsc2UgaWYgKGRpc2Vhc2VUeXBlLmVxdWFscyhJTVBPUlRfVFlQRV9TSVIpKSB7DQorCQkJKChTSVJMYWJlbFZhbHVlKWRlbHRhU3RhdGUpLnNldFMoZGVsdGFTKTsNCisJCQkoKFNJUkxhYmVsVmFsdWUpZGVsdGFTdGF0ZSkuc2V0SShkZWx0YUkpOw0KKwkJCSgoU0lSTGFiZWxWYWx1ZSlkZWx0YVN0YXRlKS5zZXRSKGRlbHRhUik7DQorCQkJKChTSVJMYWJlbFZhbHVlKWRlbHRhU3RhdGUpLnNldEluY2lkZW5jZShkZWx0YUkpOw0KKwkJCXJldHVybiBuZXcgU0lSTGFiZWxWYWx1ZUltcGwoMC4wLCAwLjAgLCAwLjAsIDAuMCwgMC4wKTsNCisJCX0gZWxzZSBpZiAoZGlzZWFzZVR5cGUuZXF1YWxzKElNUE9SVF9UWVBFX1NFSVIpKSB7DQorCQkJKChTRUlSTGFiZWxWYWx1ZSlkZWx0YVN0YXRlKS5zZXRTKGRlbHRhUyk7DQorCQkJKChTRUlSTGFiZWxWYWx1ZSlkZWx0YVN0YXRlKS5zZXRFKGRlbHRhRSk7DQorCQkJKChTRUlSTGFiZWxWYWx1ZSlkZWx0YVN0YXRlKS5zZXRJKGRlbHRhSSk7DQorCQkJKChTRUlSTGFiZWxWYWx1ZSlkZWx0YVN0YXRlKS5zZXRSKGRlbHRhUik7DQorCQkJKChTRUlSTGFiZWxWYWx1ZSlkZWx0YVN0YXRlKS5zZXRJbmNpZGVuY2UoZGVsdGFJKTsNCisJCQlyZXR1cm4gbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgwLjAsIDAuMCwgMC4wICwgMC4wLCAwLjAsIDAuMCk7DQorCQl9IGVsc2Ugew0KKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiRXh0ZXJuYWxEYXRhU291cmNlIEludmFsaWQgVHlwZSAiK2Rpc2Vhc2VUeXBlKyIgbXVzdCBiZSBTSSwgU0lSLCBvciBTRUlSIik7DQorCQl9DQorCQkvLwkJfWVsc2Ugew0KKwkJLy8JCQkvLyBpZiBkYXRhID09IG51bGwNCisJCS8vCQkJLy8gbm8gZGF0YSBmb3IgbG9jYXRpb24gaW4gcXVlc3Rpb25zDQorCQkvLwkJCWlmIChkaXNlYXNlVHlwZS5lcXVhbHMoSU1QT1JUX1RZUEVfU0kpKSB7DQorCQkvLwkJCQlyZXR1cm4gbmV3IFNJTGFiZWxWYWx1ZUltcGwoMC4wICwgMC4wLCAwLjAsIDAuMCk7DQorCQkvLwkJCX0gZWxzZSBpZiAoZGlzZWFzZVR5cGUuZXF1YWxzKElNUE9SVF9UWVBFX1NJUikpIHsNCisJCS8vCQkJCXJldHVybiBuZXcgU0lSTGFiZWxWYWx1ZUltcGwoMC4wLCAwLjAgLCAwLjAsIDAuMCwgMC4wKTsNCisJCS8vCQkJfSBlbHNlIGlmIChkaXNlYXNlVHlwZS5lcXVhbHMoSU1QT1JUX1RZUEVfU0VJUikpIHsNCisJCS8vCQkJCXJldHVybiBuZXcgU0VJUkxhYmVsVmFsdWVJbXBsKCAwLjAsIDAuMCwgMC4wICwgMC4wLCAwLjAsIDAuMCk7DQorCQkvLwkJCX0gZWxzZSB7DQorCQkvLwkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkV4dGVybmFsRGF0YVNvdXJjZSBJbnZhbGlkIFR5cGUgIitkaXNlYXNlVHlwZSsiIG11c3QgYmUgU0ksIFNJUiwgb3IgU0VJUiIpOw0KKwkJLy8JCQl9DQorCQkvLwkJfQ0KKw0KKw0KKwl9IC8vIGltcG9ydERpc2Vhc2VEYXRhDQorDQorDQorDQorCS8qKg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbEltcGwjY3JlYXRlRGlzZWFzZU1vZGVsU3RhdGUoKQ0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBEaXNlYXNlTW9kZWxTdGF0ZSBjcmVhdGVEaXNlYXNlTW9kZWxTdGF0ZSgpIHsNCisJCXJldHVybiBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNJRGlzZWFzZU1vZGVsU3RhdGUoKTsNCisJfSAvLyBjcmVhdGVEaXNlYXNlTW9kZWxTdGF0ZQ0KKw0KKw0KKwkvKioNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxJbXBsI2NyZWF0ZURpc2Vhc2VNb2RlbExhYmVsKCkNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWwgY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWwoKSB7DQorCQlyZWFkRGF0YWZpbGVzKCk7DQorCQlpZiAoZGlzZWFzZVR5cGU9PUlNUE9SVF9UWVBFX1NJKSByZXR1cm4gU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTSUxhYmVsKCk7DQorCQlpZiAoZGlzZWFzZVR5cGU9PUlNUE9SVF9UWVBFX1NJUikgcmV0dXJuIFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0lSTGFiZWwoKTsNCisJCS8vIGVsc2UgZGVmYXVsdA0KKwkJcmV0dXJuIFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0VJUkxhYmVsKCk7DQorCX0gLy8gY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWwNCisNCisJLyoqDQorCSAqIA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKSB7DQorCQlyZWFkRGF0YWZpbGVzKCk7DQorCQlpZihkaXNlYXNlVHlwZT09SU1QT1JUX1RZUEVfU0kpIHJldHVybiBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNJTGFiZWxWYWx1ZSgpOw0KKwkJaWYoZGlzZWFzZVR5cGU9PUlNUE9SVF9UWVBFX1NJUikgcmV0dXJuIFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0lSTGFiZWxWYWx1ZSgpOw0KKwkJcmV0dXJuIFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0VJUkxhYmVsVmFsdWUoKTsNCisJfSAvLyBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbFZhbHVlDQorDQorCS8qKg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbEltcGwjaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZShvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsU3RhdGUsDQorCSAqICAgICAgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsKQ0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBEaXNlYXNlTW9kZWxTdGF0ZSBpbml0aWFsaXplRGlzZWFzZVN0YXRlKA0KKwkJCWZpbmFsIERpc2Vhc2VNb2RlbFN0YXRlIGRpc2Vhc2VNb2RlbFN0YXRlLA0KKwkJCWZpbmFsIERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VNb2RlbExhYmVsKSB7DQorDQorCQlmaW5hbCBQb3B1bGF0aW9uTGFiZWwgcG9wdWxhdGlvbkxhYmVsID0gZGlzZWFzZU1vZGVsTGFiZWwNCisJCS5nZXRQb3B1bGF0aW9uTGFiZWwoKTsNCisJCWZpbmFsIGRvdWJsZSBwb3B1bGF0aW9uQ291bnQgPSBwb3B1bGF0aW9uTGFiZWwNCisJCS5nZXRDdXJyZW50UG9wdWxhdGlvblZhbHVlKCkuZ2V0Q291bnQoKTsNCisNCisJCS8vIEFjY3VtdWxhdGUgdGhlIHBvcHVsYXRpb24gY291bnQgaW4gdGhlIGRpc2Vhc2UgbW9kZWwNCisJCWFkZFRvVG90YWxQb3B1bGF0aW9uQ291bnQocG9wdWxhdGlvbkNvdW50KTsNCisNCisJCWRvdWJsZSBhcmVhID0gZ2V0QXJlYShwb3B1bGF0aW9uTGFiZWwpOw0KKwkJLy8gSWYgd2UgaGF2ZSBhIGJhZCBkYXRhIHNldCBpdCBjb3VsZCBiZSB0aGF0IHRoZSBhcmVhIHdvdWxkIGJlDQorCQkvLyB1bnNwZWNpZmllZCBvciB6ZXJvLg0KKwkJLy8gRG8gd2UgaGF2ZSBhIGJhZCBhcmVhIHZhbHVlPw0KKwkJaWYgKGFyZWEgPD0gMC4wKSB7DQorCQkJLy8gWWVzDQorCQkJcmVwb3J0QmFkQXJlYVZhbHVlKHBvcHVsYXRpb25MYWJlbCwgYXJlYSk7DQorCQkJYXJlYSA9IDEuMDsNCisJCX0gLy8gaWYgYmFkIGFyZWEgdmFsdWUNCisNCisJCS8vIEFjY3VtdWxhdGUgdGhlIGFyZWEgaW4gdGhlIGRpc2Vhc2UgbW9kZWwgc28gd2UnbGwga25vdyB0aGUgdG90YWwgd2hlbg0KKwkJLy8gd2UgZG8gb3VyIG5leHQgcGFzcyBhbmQgY29tcHV0ZSB0aGUgYXJlYSByYXRpbw0KKwkJYWRkVG9Ub3RhbEFyZWEoYXJlYSk7DQorDQorCQlyZXR1cm4gZGlzZWFzZU1vZGVsU3RhdGU7DQorCX0gLy8gaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZQ0KKw0KKw0KKwkvKioNCisJICogSGVyZSB3ZSBjb21wdXRlIGFuZCBzZXQgdGhlIHJhdGlvIGJldHdlZW4gdGhlIHRvdGFsIGFyZWEgYW5kIHRoZSBhcmVhDQorCSAqIHVzZWQgZm9yIHRoaXMge0BsaW5rIERpc2Vhc2VNb2RlbExhYmVsfS4gVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIGRldGVybWluZQ0KKwkgKiB0aGUgPGVtPnRyYW5zbWlzc2lvbiBzY2FsZSBmYWN0b3I8L2VtPi4NCisJICogDQorCSAqIEBzZWUgI2NvbXB1dGVUcmFuc2l0aW9ucyhTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUsDQorCSAqICAgICAgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCwgbG9uZykNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxJbXBsI2luaXRpYWxpemVEaXNlYXNlU3RhdGUob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsKQ0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEaXNlYXNlU3RhdGUoZmluYWwgRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZU1vZGVsTGFiZWwpIHsNCisJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUgc2RtcyA9IChTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlKSBkaXNlYXNlTW9kZWxMYWJlbA0KKwkJLmdldERpc2Vhc2VNb2RlbFN0YXRlKCk7DQorCQkvLyBJcyB0aGVyZSBhIHBvcHVsYXRpb24gPw0KKwkJaWYgKHRvdGFsUG9wdWxhdGlvbkNvdW50ID4gMC4wKSB7DQorCQkJLy8gWWVzDQorCQkJZG91YmxlIGFyZWEgPSBnZXRBcmVhKGRpc2Vhc2VNb2RlbExhYmVsLmdldFBvcHVsYXRpb25MYWJlbCgpKTsNCisJCQkvLyBEbyB3ZSBoYXZlIGEgYmFkIGFyZWEgdmFsdWU/DQorCQkJaWYgKGFyZWEgPD0gMC4wKSB7DQorCQkJCS8vIFllcw0KKwkJCQlyZXBvcnRCYWRBcmVhVmFsdWUoZGlzZWFzZU1vZGVsTGFiZWwuZ2V0UG9wdWxhdGlvbkxhYmVsKCksIGFyZWEpOw0KKwkJCQlhcmVhID0gMS4wOw0KKwkJCX0gLy8gaWYgYmFkIGFyZWEgdmFsdWUNCisNCisJCQlmaW5hbCBkb3VibGUgcmF0aW8gPSB0b3RhbEFyZWEgLyBhcmVhOw0KKwkJCXNkbXMuc2V0QXJlYVJhdGlvKHJhdGlvKTsNCisJCX0NCisJfSAvLyBpbml0aWFsaXplRGlzZWFzZVN0YXRlDQorDQorCS8qKg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbEltcGwjY3JlYXRlSW5mZWN0b3IoKQ0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBJbmZlY3RvciBjcmVhdGVJbmZlY3RvcigpIHsNCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKwl9IC8vIGNyZWF0ZUluZmVjdG9yDQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhZGRUb1RvdGFsQXJlYShkb3VibGUgYXJlYSkgew0KKwkJdG90YWxBcmVhICs9IGFyZWE7DQorCX0gLy8gYWRkVG9Ub3RhbEFyZWENCisNCisNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiANCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXB1YmxpYyB2b2lkIGFkZFRvVG90YWxQb3B1bGF0aW9uQ291bnQoZG91YmxlIHBvcHVsYXRpb25Db3VudCkgew0KKwkJdG90YWxQb3B1bGF0aW9uQ291bnQgKz0gcG9wdWxhdGlvbkNvdW50Ow0KKwl9IC8vIGFkZFRvVG90YWxQb3B1bGF0aW9uQ291bnQNCisNCisJLyoqDQorCSAqIEBwYXJhbSBwb3B1bGF0aW9uTGFiZWwNCisJICogICAgICAgICAgICB0aGUgcG9wdWxhdGlvbiBsYWJlbCB0aGF0IGxhYmVscyB0aGUgbm9kZQ0KKwkgKiBAcmV0dXJuIHRoZSBhcmVhIG9mIHRoZSBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGFiZWwNCisJICovDQorCXByaXZhdGUgZG91YmxlIGdldEFyZWEoZmluYWwgUG9wdWxhdGlvbkxhYmVsIHBvcHVsYXRpb25MYWJlbCkgew0KKwkJZG91YmxlIHJldFZhbHVlID0gMC4wOw0KKw0KKwkJLy8gVGhlIHBvcHVsYXRpb24gbGFiZWwgY291bGQgaGF2ZSBhbiBhcmVhIHNwZWNpZmllZCBmb3IgdGhlIHBvcHVsYXRpb24NCisJCS8vIHRoYXQgd2Ugc2hvdWxkIHVzZSBpbnN0ZWFkIG9mIHRoZSBhcmVhIG9mIHRoZSByZWdpb24gbGFiZWxlZCBieSB0aGUNCisJCS8vIHBvcHVsYXRpb24gbGFiZWwuIFRoaXMgdmFsdWUgd291bGQgYmUgc3BlY2lmaWVkIGlmIHRoZSBwb3B1bGF0aW9uIHdhcw0KKwkJLy8gZGVuc2VseSBwYWNrZWQgaW50byBhIHNtYWxsIGFyZWEgb2YgdGhlIGxhcmdlciByZWdpb24sIGZvciBpbnN0YW5jZQ0KKwkJLy8gbGlrZSBhIGNpdHkgaW4gYW4gb3RoZXJ3aXNlIGxhcmdlIGRlc2VydC4NCisNCisJCXJldFZhbHVlID0gcG9wdWxhdGlvbkxhYmVsLmdldFBvcHVsYXRlZEFyZWEoKTsNCisNCisJCS8vIElzIHRoZXJlIGFuIGFyZWEgc3BlY2lmaWVkIGZvciB0aGUgcG9wdWxhdGlvbj8NCisJCWlmIChyZXRWYWx1ZSA9PSAwLjApIHsNCisJCQkvLyBObw0KKwkJCS8vIE9rLCBnbyBmaW5kIHRoZSBhcmVhIGxhYmVsIGFuZCByZXR1cm4gdGhlIGFyZWEgb2YgdGhlIHJlZ2lvbg0KKwkJCWZvciAoZmluYWwgSXRlcmF0b3I8Tm9kZUxhYmVsPiBsYWJlbEl0ZXIgPSBwb3B1bGF0aW9uTGFiZWwuZ2V0Tm9kZSgpDQorCQkJCQkuZ2V0TGFiZWxzKCkuaXRlcmF0b3IoKTsgbGFiZWxJdGVyLmhhc05leHQoKTspIHsNCisJCQkJZmluYWwgTm9kZUxhYmVsIG5vZGVMYWJlbCA9IGxhYmVsSXRlci5uZXh0KCk7DQorCQkJCS8vIElzIHRoaXMgYW4gYXJlYSBsYWJlbD8NCisJCQkJaWYgKG5vZGVMYWJlbCBpbnN0YW5jZW9mIEFyZWFMYWJlbCkgew0KKwkJCQkJLy8gWWVzDQorCQkJCQlmaW5hbCBBcmVhTGFiZWwgYXJlYUxhYmVsID0gKEFyZWFMYWJlbCkgbm9kZUxhYmVsOw0KKwkJCQkJcmV0VmFsdWUgPSBhcmVhTGFiZWwuZ2V0Q3VycmVudEFyZWFWYWx1ZSgpLmdldEFyZWEoKTsNCisJCQkJCWJyZWFrOw0KKwkJCQl9DQorCQkJfSAvLyBmb3INCisJCX0gLy8gSWYgbm8gcG9wdWxhdGlvbiBhcmVhIHNwZWNpZmllZA0KKw0KKwkJcmV0dXJuIHJldFZhbHVlOw0KKwl9IC8vIGdldEFyZWENCisNCisNCisJLyoqDQorCSAqIEBwYXJhbSBwb3B1bGF0aW9uTGFiZWwNCisJICogQHBhcmFtIGFyZWENCisJICovDQorCXByaXZhdGUgdm9pZCByZXBvcnRCYWRBcmVhVmFsdWUoZmluYWwgUG9wdWxhdGlvbkxhYmVsIHBvcHVsYXRpb25MYWJlbCwNCisJCQlkb3VibGUgYXJlYSkgew0KKwkJLy8gVGhlIGJhZCB2YWx1ZSBjb3VsZCBiZSBzcGVjaWZpZWQgZm9yIHRoZSBub2RlIG9yIGJlIGFuIG92ZXJpZGUNCisJCS8vIHZhbHVlIHNwZWNpZmllZCBmb3IgdGhlIHBvcHVsYXRpb24uDQorCQkvLyBJcyB0aGUgYmFkIHZhbHVlIGZyb20gdGhlIG5vZGU/DQorCQlpZiAocG9wdWxhdGlvbkxhYmVsLmdldFBvcHVsYXRlZEFyZWEoKSA9PSAwLjApIHsNCisJCQkvLyBZZXMNCisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlRoZSBhcmVhIHZhbHVlIG9mIFwiIiArIGFyZWENCisJCQkJCSsgIlwiIHNwZWNpZmllZCBmb3IgXCIiDQorCQkJCQkrIHBvcHVsYXRpb25MYWJlbC5nZXROb2RlKCkudG9TdHJpbmcoKQ0KKwkJCQkJKyAiXCIgaXMgbm90IGdyZWF0ZXIgdGhhbiB6ZXJvICgwLjApIiwgbnVsbCk7DQorCQl9IC8vIGlmIGJhZCB2YWx1ZSBmb3Igbm9kZSBhcmVhDQorCQllbHNlIHsNCisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlRoZSBhcmVhIHZhbHVlIG9mIFwiIiArIGFyZWENCisJCQkJCSsgIlwiIHNwZWNpZmllZCBmb3IgdGhlIHBvcHVsYXRpb24gXCIiDQorCQkJCQkrIHBvcHVsYXRpb25MYWJlbC5nZXROYW1lKCkgKyAiXCIgZm9yIHRoZSByZWdpb24gXCIiDQorCQkJCQkrIHBvcHVsYXRpb25MYWJlbC5nZXROb2RlKCkudG9TdHJpbmcoKQ0KKwkJCQkJKyAiXCIgaXMgbm90IGdyZWF0ZXIgdGhhbiB6ZXJvICgwLjApIiwgbnVsbCk7DQorCQl9DQorCX0gLy8gcmVwb3J0QmFkQXJlYVZhbHVlDQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KKwkJcmV0dXJuIEV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UuTGl0ZXJhbHMuRVhURVJOQUxfREFUQV9TT1VSQ0VfRElTRUFTRV9NT0RFTDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVBhdGgoKSB7DQorCQlyZXR1cm4gZGF0YVBhdGg7DQorCX0NCisNCisNCisNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXREYXRhUGF0aChTdHJpbmcgbmV3RGF0YVBhdGgpIHsNCisJCVN0cmluZyBvbGREYXRhUGF0aCA9IGRhdGFQYXRoOw0KKwkJZGF0YVBhdGggPSBuZXdEYXRhUGF0aDsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlLkVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUxfX0RBVEFfUEFUSCwgb2xkRGF0YVBhdGgsIGRhdGFQYXRoKSk7DQorCX0NCisNCisNCisNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldERpc2Vhc2VUeXBlKCkgew0KKwkJcmV0dXJuIGRpc2Vhc2VUeXBlOw0KKwl9DQorDQorDQorDQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0RGlzZWFzZVR5cGUoU3RyaW5nIG5ld0Rpc2Vhc2VUeXBlKSB7DQorCQlTdHJpbmcgb2xkRGlzZWFzZVR5cGUgPSBkaXNlYXNlVHlwZTsNCisJCWRpc2Vhc2VUeXBlID0gbmV3RGlzZWFzZVR5cGU7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZS5FWFRFUk5BTF9EQVRBX1NPVVJDRV9ESVNFQVNFX01PREVMX19ESVNFQVNFX1RZUEUsIG9sZERpc2Vhc2VUeXBlLCBkaXNlYXNlVHlwZSkpOw0KKwl9DQorDQorDQorDQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQljYXNlIEV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UuRVhURVJOQUxfREFUQV9TT1VSQ0VfRElTRUFTRV9NT0RFTF9fREFUQV9QQVRIOg0KKwkJCXJldHVybiBnZXREYXRhUGF0aCgpOw0KKwkJY2FzZSBFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlLkVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUxfX0RJU0VBU0VfVFlQRToNCisJCQlyZXR1cm4gZ2V0RGlzZWFzZVR5cGUoKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJY2FzZSBFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlLkVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUxfX0RBVEFfUEFUSDoNCisJCQlzZXREYXRhUGF0aCgoU3RyaW5nKW5ld1ZhbHVlKTsNCisJCQlyZXR1cm47DQorCQljYXNlIEV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UuRVhURVJOQUxfREFUQV9TT1VSQ0VfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9UWVBFOg0KKwkJCXNldERpc2Vhc2VUeXBlKChTdHJpbmcpbmV3VmFsdWUpOw0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQljYXNlIEV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UuRVhURVJOQUxfREFUQV9TT1VSQ0VfRElTRUFTRV9NT0RFTF9fREFUQV9QQVRIOg0KKwkJCXNldERhdGFQYXRoKERBVEFfUEFUSF9FREVGQVVMVCk7DQorCQkJcmV0dXJuOw0KKwkJY2FzZSBFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlLkVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUxfX0RJU0VBU0VfVFlQRToNCisJCQlzZXREaXNlYXNlVHlwZShESVNFQVNFX1RZUEVfRURFRkFVTFQpOw0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJY2FzZSBFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlLkVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUxfX0RBVEFfUEFUSDoNCisJCQlyZXR1cm4gREFUQV9QQVRIX0VERUZBVUxUID09IG51bGwgPyBkYXRhUGF0aCAhPSBudWxsIDogIURBVEFfUEFUSF9FREVGQVVMVC5lcXVhbHMoZGF0YVBhdGgpOw0KKwkJY2FzZSBFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlLkVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUxfX0RJU0VBU0VfVFlQRToNCisJCQlyZXR1cm4gRElTRUFTRV9UWVBFX0VERUZBVUxUID09IG51bGwgPyBkaXNlYXNlVHlwZSAhPSBudWxsIDogIURJU0VBU0VfVFlQRV9FREVGQVVMVC5lcXVhbHMoZGlzZWFzZVR5cGUpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQorDQorCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCisJCXJlc3VsdC5hcHBlbmQoIiAoZGF0YVBhdGg6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChkYXRhUGF0aCk7DQorCQlyZXN1bHQuYXBwZW5kKCIsIGRpc2Vhc2VUeXBlOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQoZGlzZWFzZVR5cGUpOw0KKwkJcmVzdWx0LmFwcGVuZCgnKScpOw0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKwl9DQorDQorDQorCS8qKg0KKwkgKiAgU2luY2UgZGF0YSBpcyByZWFkIGZyb20gYSBmaWxlIHdlIGRvbid0IGhhdmUgdG8gdGFrZSBpbnRvIGFjY291bnQNCisJICogICBiaXJ0aC9kZWF0aHMgZXRjIGZyb20gb3RoZXIgZGVjb3JhdG9ycywgdGhlIGRhdGEgaXMgYWxyZWFkeSBzdXBwb3NlZA0KKwkgKgkgdG8gaGFuZGxlIHRoYXQuDQorCSAqLw0KKw0KKwlwdWJsaWMgdm9pZCBhcHBseUV4dGVybmFsRGVsdGFzKFNURU1UaW1lIHRpbWUsIGxvbmcgdGltZURlbHRhLA0KKwkJCUVMaXN0PER5bmFtaWNMYWJlbD4gbGFiZWxzKSB7DQorCQkvLyBOb3RoaW5nIHRvIGRvLg0KKw0KKwl9DQorDQorDQorCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjYWxjdWxhdGVEZWx0YShTVEVNVGltZSB0aW1lLCBsb25nIHRpbWVEZWx0YSwNCisJCQlFTGlzdDxEeW5hbWljTGFiZWw+IGxhYmVscykgew0KKw0KKwkJaWYoZmlyc3RTVEVNVGltZSA9PSBudWxsIHx8IHRpbWUuZ2V0VGltZSgpLmVxdWFscyhmaXJzdFNURU1UaW1lLmdldFRpbWUoKSkpDQorCQkJZmlsZUxpbmVDb3VudGVyID0gMDsNCisJCWVsc2UNCisJCQlmaWxlTGluZUNvdW50ZXIgPSAoaW50KSgodGltZS5nZXRUaW1lKCkuZ2V0VGltZSgpIC0gZmlyc3RTVEVNVGltZS5nZXRUaW1lKCkuZ2V0VGltZSgpKSAvIHRpbWVEZWx0YSk7DQorDQorCQlpZihmaXJzdFNURU1UaW1lID09IG51bGwpIGZpcnN0U1RFTVRpbWUgPSB0aW1lOw0KKw0KKwkJLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggb2YgdGhlIGxhYmVscyB3ZSBuZWVkIHRvIHVwZGF0ZS4NCisJCWZvciAoZmluYWwgRHluYW1pY0xhYmVsIGR5bkxhYmVsIDogbGFiZWxzKSB7DQorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTGFiZWwgPSAoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCkgZHluTGFiZWw7DQorDQorDQorDQorCQkJYXNzZXJ0IGRpc2Vhc2VMYWJlbC5nZXRQb3B1bGF0aW9uTGFiZWwoKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpDQorCQkJLmVxdWFscyhnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpKTsNCisNCisJCQkvLyBUaGlzIGlzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkaXNlYXNlIGZvciB0aGlzIGxhYmVsDQorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGRlbHRhU3RhdGUgPSAoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKWRpc2Vhc2VMYWJlbA0KKwkJCS5nZXREZWx0YVZhbHVlKCk7DQorDQorDQorCQkJLy8gMikgVGhpcyB3aWxsIHNldCB0aGUgZGVsdGENCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgbnVsbEFkZGl0aW9ucyA9IGltcG9ydERpc2Vhc2VEYXRhKGRlbHRhU3RhdGUsIGRpc2Vhc2VMYWJlbCwgdGltZSwgdGltZURlbHRhKTsNCisNCisNCisJCQkvLyBUaGlzIHdpbGwgYmUgdGhlIHN0YXRlIHRoYXQgd2UgY29tcHV0ZS4NCisJCQkvLwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBuZXh0U3RhdGUgPSAoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKWRpc2Vhc2VMYWJlbC5nZXROZXh0VmFsdWUoKTsNCisNCisJCQkvLyBJbml0aWFsaXplIHRoZSBuZXh0IHN0YXRlIGZyb20gdGhlIGN1cnJlbnQgc3RhdGUgYW5kIHRoZW4gd2UnbGwNCisJCQkvLyBtYWtlIHRoZSBjaGFuZ2VzIHRvIHRoYXQuDQorCQkJLy8gbmV4dFN0YXRlLnNldChjdXJyZW50U3RhdGUpOw0KKw0KKw0KKw0KKwkJCS8vCQkJYXNzZXJ0IG5leHRTdGF0ZS5zYW5lKCk6ImRpc2Vhc2Ugc3RhdGUgaXMgaW5zYW5lIGFmdGVyIHN1YnRyYWN0aW5nIGRlYXRoczogIituZXh0U3RhdGUudG9TdHJpbmcoKTsNCisNCisNCisJCQkvLyBUaGUgbmV4dCB2YWx1ZSBpcyB2YWxpZCBub3cuDQorCQkJLy8JCQlkaXNlYXNlTGFiZWwuc2V0TmV4dFZhbHVlVmFsaWQodHJ1ZSk7DQorDQorDQorCQl9IC8vIGZvcg0KKwl9DQorDQorDQorDQorDQorCXB1YmxpYyB2b2lkIGRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKExhYmVsVmFsdWUgbGFiZWwpIHsNCisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCisNCisJfQ0KKw0KKw0KKwlwdWJsaWMgYm9vbGVhbiBpc0RldGVybWluaXN0aWMoKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KK30gLy9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS9pbXBsL0V4dGVybmFsRGF0YVNvdXJjZUZhY3RvcnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL2ltcGwvRXh0ZXJuYWxEYXRhU291cmNlRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzFhZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS9pbXBsL0V4dGVybmFsRGF0YVNvdXJjZUZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8vIEV4dGVybmFsRGF0YVNvdXJjZUZhY3RvcnlJbXBsIAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlcm5hbERhdGFTb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEV4dGVybmFsRGF0YVNvdXJjZUZhY3RvcnkgeworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEV4dGVybmFsRGF0YVNvdXJjZUZhY3RvcnkgaW5pdCgpIHsKKwkJdHJ5IHsKKwkJCUV4dGVybmFsRGF0YVNvdXJjZUZhY3RvcnkgdGhlRXh0ZXJuYWxEYXRhU291cmNlRmFjdG9yeSA9IChFeHRlcm5hbERhdGFTb3VyY2VGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UuZWNvcmUiKTsgCisJCQlpZiAodGhlRXh0ZXJuYWxEYXRhU291cmNlRmFjdG9yeSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoZUV4dGVybmFsRGF0YVNvdXJjZUZhY3Rvcnk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXJldHVybiBuZXcgRXh0ZXJuYWxEYXRhU291cmNlRmFjdG9yeUltcGwoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFeHRlcm5hbERhdGFTb3VyY2VGYWN0b3J5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgeworCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlLkVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUw6IHJldHVybiBjcmVhdGVFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwoKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwgY3JlYXRlRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsKCkgeworCQlFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxJbXBsIGV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCA9IG5ldyBFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxJbXBsKCk7CisJCXJldHVybiBleHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UgZ2V0RXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZSgpIHsKKwkJcmV0dXJuIChFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlKWdldEVQYWNrYWdlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZGVwcmVjYXRlZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlARGVwcmVjYXRlZAorCXB1YmxpYyBzdGF0aWMgRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZSBnZXRQYWNrYWdlKCkgeworCQlyZXR1cm4gRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZS5lSU5TVEFOQ0U7CisJfQorCit9IC8vRXh0ZXJuYWxEYXRhU291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvaW1wbC9FeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS9pbXBsL0V4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxNmQ4YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvaW1wbC9FeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjE5IEBACisvLyBFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlSW1wbAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLkV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLkV4dGVybmFsRGF0YVNvdXJjZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBleHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCisJICogcGFja2FnZSBVUkkgdmFsdWUuCisJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYworCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCisJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKKwkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlSW1wbCgpIHsKKwkJc3VwZXIoZU5TX1VSSSwgRXh0ZXJuYWxEYXRhU291cmNlRmFjdG9yeS5lSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcworCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCisJICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKKwkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKKwkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCisJICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KKwkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCisJICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCisJICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgorCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55CisJICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KKwkgKiB0aG9zZSBvZiBhbm90aGVyLgorCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKKwkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNlTlNfVVJJCisJICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlIGluaXQoKSB7CisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQorCQlFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlSW1wbCB0aGVFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlID0gKEV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZUltcGwoKSk7CisKKwkJaXNJbml0ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcworCQlTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJR3JhcGhQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJTGFiZWxzUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisKKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKKwkJdGhlRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCisJCXRoZUV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKwkJdGhlRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZS5mcmVlemUoKTsKKworCQlyZXR1cm4gdGhlRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCgpIHsKKwkJcmV0dXJuIGV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxfRGF0YVBhdGgoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlleHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxfRGlzZWFzZVR5cGUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlleHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXh0ZXJuYWxEYXRhU291cmNlRmFjdG9yeSBnZXRFeHRlcm5hbERhdGFTb3VyY2VGYWN0b3J5KCkgeworCQlyZXR1cm4gKEV4dGVybmFsRGF0YVNvdXJjZUZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcworCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKKwkJaXNDcmVhdGVkID0gdHJ1ZTsKKworCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJZXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUwpOworCQljcmVhdGVFQXR0cmlidXRlKGV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEVDbGFzcywgRVhURVJOQUxfREFUQV9TT1VSQ0VfRElTRUFTRV9NT0RFTF9fREFUQV9QQVRIKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShleHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxFQ2xhc3MsIEVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUxfX0RJU0VBU0VfVFlQRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOworCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKKwkJc2V0TmFtZShlTkFNRSk7CisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOworCQlzZXROc1VSSShlTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCisJCVN0YW5kYXJkUGFja2FnZSB0aGVTdGFuZGFyZFBhY2thZ2UgPSAoU3RhbmRhcmRQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFN0YW5kYXJkUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQlleHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlU3RhbmRhcmRQYWNrYWdlLmdldERpc2Vhc2VNb2RlbCgpKTsKKworCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycworCQlpbml0RUNsYXNzKGV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEVDbGFzcywgRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsLmNsYXNzLCAiRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxfRGF0YVBhdGgoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRhdGFQYXRoIiwgbnVsbCwgMCwgMSwgRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxfRGlzZWFzZVR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRpc2Vhc2VUeXBlIiwgbnVsbCwgMCwgMSwgRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCS8vIENyZWF0ZSByZXNvdXJjZQorCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKwl9CisKK30gLy9FeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS9wcm92aWRlci9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvcHJvdmlkZXIvRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjOTg5YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvcHJvdmlkZXIvRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8vIEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWx9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cwkKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGREYXRhUGF0aFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGF0YSBQYXRoIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkRGF0YVBhdGhQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxfZGF0YVBhdGhfZmVhdHVyZSIpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0V4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbF9kYXRhUGF0aF9mZWF0dXJlIiwgIl9VSV9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxfdHlwZSIpLAorCQkJCSBFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlLkxpdGVyYWxzLkVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUxfX0RBVEFfUEFUSCwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbW9iajE2L0V4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsKW9iamVjdCkuZ2V0VVJJKCkubGFzdFNlZ21lbnQoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxfdHlwZSIpIDoKKwkJIGxhYmVsOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsKW9iamVjdCkuZ2V0RGlzZWFzZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxfdHlwZSIpIDoKKwkJCWdldFN0cmluZygiX1VJX0V4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbF90eXBlIikgKyAiICIgKyBsYWJlbDsKKwl9CQkJCQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsLmNsYXNzKSkgeworCQkJY2FzZSBFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlLkVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUxfX0RBVEFfUEFUSDoKKwkJCWNhc2UgRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZS5FWFRFUk5BTF9EQVRBX1NPVVJDRV9ESVNFQVNFX01PREVMX19ESVNFQVNFX1RZUEU6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIEV4dGVybmFsRGF0YVNvdXJjZUVkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3Byb3ZpZGVyL0V4dGVybmFsRGF0YVNvdXJjZUVkaXRQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvcHJvdmlkZXIvRXh0ZXJuYWxEYXRhU291cmNlRWRpdFBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YTY1ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3Byb3ZpZGVyL0V4dGVybmFsRGF0YVNvdXJjZUVkaXRQbHVnaW4uamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLy8gRXh0ZXJuYWxEYXRhU291cmNlRWRpdFBsdWdpbgorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuRWNsaXBzZVVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db3JlRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlci5EZWZpbml0aW9uc0VkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLkRpc2Vhc2Vtb2RlbHNFZGl0UGx1Z2luOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgRXh0ZXJuYWxEYXRhU291cmNlIGVkaXRvciBwbHVnaW4uCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFeHRlcm5hbERhdGFTb3VyY2VFZGl0UGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIHsKKwkvKioKKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBFeHRlcm5hbERhdGFTb3VyY2VFZGl0UGx1Z2luIElOU1RBTkNFID0gbmV3IEV4dGVybmFsRGF0YVNvdXJjZUVkaXRQbHVnaW4oKTsKKwkKKwkvKioKKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gcGx1Z2luOworCisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXh0ZXJuYWxEYXRhU291cmNlRWRpdFBsdWdpbigpIHsKKwkJc3VwZXIKKwkJCShuZXcgUmVzb3VyY2VMb2NhdG9yIFtdIHsKKwkJCQlEaXNlYXNlbW9kZWxzRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJCQlDb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJCQlEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCQl9KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCQorCS8qKgorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVVJUGx1Z2luIHsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOworCQorCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4KKwkJCS8vCisJCQlwbHVnaW4gPSB0aGlzOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3Byb3ZpZGVyL0V4dGVybmFsRGF0YVNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3Byb3ZpZGVyL0V4dGVybmFsRGF0YVNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA5MmQ5OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvcHJvdmlkZXIvRXh0ZXJuYWxEYXRhU291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDIwOSBAQAorLy8gRXh0ZXJuYWxEYXRhU291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5wcm92aWRlcjsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLnV0aWwuRXh0ZXJuYWxEYXRhU291cmNlQWRhcHRlckZhY3Rvcnk7CisKKy8qKgorICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLgorICogVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uCisgKiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgorICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBFeHRlcm5hbERhdGFTb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEV4dGVybmFsRGF0YVNvdXJjZUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieSB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248T2JqZWN0PiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFeHRlcm5hbERhdGFTb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyIGV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLkV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJaWYgKGV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlleHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPSBuZXcgRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgeworCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7CisJCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7CisJCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7CisJCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHx8ICgoKENsYXNzPD8+KXR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7CisJCQkJcmV0dXJuIGFkYXB0ZXI7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn0gYW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKworCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgeworCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJaWYgKGV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciAhPSBudWxsKSBleHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS91dGlsL0V4dGVybmFsRGF0YVNvdXJjZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3V0aWwvRXh0ZXJuYWxEYXRhU291cmNlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWI4ODE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS91dGlsL0V4dGVybmFsRGF0YVNvdXJjZUFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyNjAgQEAKKy8vIEV4dGVybmFsRGF0YVNvdXJjZUFkYXB0ZXJGYWN0b3J5CitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlcm5hbERhdGFTb3VyY2VBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4dGVybmFsRGF0YVNvdXJjZUFkYXB0ZXJGYWN0b3J5KCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IEV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgeworCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKKwkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBFeHRlcm5hbERhdGFTb3VyY2VTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgRXh0ZXJuYWxEYXRhU291cmNlU3dpdGNoPEFkYXB0ZXI+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsKEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgPFQ+IEFkYXB0ZXIgY2FzZUNvbXBhcmFibGUoQ29tcGFyYWJsZTxUPiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ29tcGFyYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlY29yYXRvcihEZWNvcmF0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZURlY29yYXRvckFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU5vZGVEZWNvcmF0b3IoTm9kZURlY29yYXRvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTm9kZURlY29yYXRvckFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNhbml0eUNoZWNrZXIoU2FuaXR5Q2hlY2tlciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU2FuaXR5Q2hlY2tlckFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1vZGlmaWFibGUoTW9kaWZpYWJsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTW9kaWZpYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZURpc2Vhc2VNb2RlbChEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZURpc2Vhc2VNb2RlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCisJICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7CisJCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOworCX0KKworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLkV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCA8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLkV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmEubGFuZy5Db21wYXJhYmxlIDxlbT5Db21wYXJhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhcmFibGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlIDxlbT5JZGVudGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yIDxlbT5EZWNvcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWNvcmF0b3JBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yIDxlbT5Ob2RlIERlY29yYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVOb2RlRGVjb3JhdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIgPGVtPlNhbml0eSBDaGVja2VyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTYW5pdHlDaGVja2VyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZSA8ZW0+TW9kaWZpYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2RpZmlhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsIDxlbT5EaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL0V4dGVybmFsRGF0YVNvdXJjZUFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3V0aWwvRXh0ZXJuYWxEYXRhU291cmNlU3dpdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3V0aWwvRXh0ZXJuYWxEYXRhU291cmNlU3dpdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwNGEwZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvdXRpbC9FeHRlcm5hbERhdGFTb3VyY2VTd2l0Y2guamF2YQpAQCAtMCwwICsxLDI1NCBAQAorLy8gRXh0ZXJuYWxEYXRhU291cmNlU3dpdGNoCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCisgKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9CisgKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCisgKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAorICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQorICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCisgKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlcm5hbERhdGFTb3VyY2VTd2l0Y2g8VDE+IHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIEV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UgbW9kZWxQYWNrYWdlOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFeHRlcm5hbERhdGFTb3VyY2VTd2l0Y2goKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOworCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQxIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOworCQl9CisJCWVsc2UgeworCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7CisJCQlyZXR1cm4KKwkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPworCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6CisJCQkJCWRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUMSBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKKwkJCWNhc2UgRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZS5FWFRFUk5BTF9EQVRBX1NPVVJDRV9ESVNFQVNFX01PREVMOiB7CisJCQkJRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsIGV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCA9IChFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsKGV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlzZWFzZU1vZGVsKGV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZURlY29yYXRvcihleHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNhbml0eUNoZWNrZXIoZXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKGV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKGV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKGV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShleHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbChFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgPFQ+IFQxIGNhc2VDb21wYXJhYmxlKENvbXBhcmFibGU8VD4gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWNvcmF0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWNvcmF0b3I8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRGVjb3JhdG9yKERlY29yYXRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZSBEZWNvcmF0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlIERlY29yYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VOb2RlRGVjb3JhdG9yKE5vZGVEZWNvcmF0b3Igb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNhbml0eSBDaGVja2VyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2FuaXR5IENoZWNrZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlU2FuaXR5Q2hlY2tlcihTYW5pdHlDaGVja2VyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2RpZmlhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kaWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VNb2RpZmlhYmxlKE1vZGlmaWFibGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZURpc2Vhc2VNb2RlbChEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL0V4dGVybmFsRGF0YVNvdXJjZVN3aXRjaApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZTg2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM1Y2JkMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njk4MmE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsMTUgQEAKKyNUdWUgU2VwIDAxIDE2OjU0OjU3IEVEVCAyMDA5CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb249cmV0dXJuX3RhZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiOGRkYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMjMgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZztzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLnByb3ZpZGVyLkZvcmNpbmdFZGl0UGx1Z2luJEltcGxlbWVudGF0aW9uCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwsCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcucHJvdmlkZXIsCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcudXRpbAorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLmVtZi5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVsczt2aXNpYmlsaXR5Oj1yZWV4cG9ydAorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NzNlYjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTQgQEAKKworIyA8Y29weXJpZ2h0PgorIyA8L2NvcHlyaWdodD4KKyMKKyMgJElkOiBidWlsZC5wcm9wZXJ0aWVzLHYgMS4xIDIwMDkvMDMvMTMgMDA6MDU6NDkgc2VkbHVuZCBFeHAgJAorCitiaW4uaW5jbHVkZXMgPSAuLFwKKyAgICAgICAgICAgICAgIGljb25zLyxcCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcworamFycy5jb21waWxlLm9yZGVyID0gLgorc291cmNlLi4gPSBzcmMvCitvdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZURpc2Vhc2VNb2RlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9pY29ucy9mdWxsL29iajE2L0V4YW1wbGVEaXNlYXNlTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MjlhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9pY29ucy9mdWxsL29iajE2L0V4YW1wbGVEaXNlYXNlTW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZU1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9pY29ucy9mdWxsL29iajE2L0V4YW1wbGVNb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMzA5ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9pY29ucy9mdWxsL29iajE2L0V4YW1wbGVNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL2ljb25zL2Z1bGwvb2JqMTYvRXhwZXJpbWVudGFsRGlzZWFzZU1vZGVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL2ljb25zL2Z1bGwvb2JqMTYvRXhwZXJpbWVudGFsRGlzZWFzZU1vZGVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzhmYjhkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvaWNvbnMvZnVsbC9vYmoxNi9FeHBlcmltZW50YWxEaXNlYXNlTW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL2ljb25zL2Z1bGwvb2JqMTYvRm9yY2luZ0Rpc2Vhc2VNb2RlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9pY29ucy9mdWxsL29iajE2L0ZvcmNpbmdEaXNlYXNlTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNDA0ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9pY29ucy9mdWxsL29iajE2L0ZvcmNpbmdEaXNlYXNlTW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL2ljb25zL2Z1bGwvb2JqMTYvR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9pY29ucy9mdWxsL29iajE2L0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYWZiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9pY29ucy9mdWxsL29iajE2L0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL2ljb25zL2Z1bGwvb2JqMTYvR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9pY29ucy9mdWxsL29iajE2L0dhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MDQxZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9pY29ucy9mdWxsL29iajE2L0dhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL2ljb25zL2Z1bGwvb2JqMTYvR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL2ljb25zL2Z1bGwvb2JqMTYvR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTQwNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvaWNvbnMvZnVsbC9vYmoxNi9HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL2ljb25zL2Z1bGwvd2l6YmFuL05ld0V4YW1wbGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvaWNvbnMvZnVsbC93aXpiYW4vTmV3RXhhbXBsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkZTQ0MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL2ljb25zL2Z1bGwvd2l6YmFuL05ld0V4YW1wbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL21vZGVsL2ZvcmNpbmcuZWNvcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9tb2RlbC9mb3JjaW5nLmVjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYTgzMDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9tb2RlbC9mb3JjaW5nLmVjb3JlCkBAIC0wLDAgKzEsNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImZvcmNpbmciCisgICAgbnNVUkk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcuZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZyI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRm9yY2luZ0Rpc2Vhc2VNb2RlbCIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9tb2RlbC9zdGFuZGFyZC5lY29yZSMvL1N0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VEb3VibGUiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjIuMCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb2R1bGF0aW9uUGVyaW9kIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIzNjUuMjU2MzYzMDUxIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vZHVsYXRpb25QaGFzZVNoaWZ0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIwLjAiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IiCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIwLjYiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL21vZGVsL3N0YW5kYXJkLmVjb3JlIy8vU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNpZ21hMiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMTAwIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vZHVsYXRpb25QZXJpb2QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjM2NS4yNSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb2R1bGF0aW9uUGhhc2VTaGlmdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb2R1bGF0aW9uRmxvb3IiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjAuNiIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL21vZGVsL3N0YW5kYXJkLmVjb3JlIy8vU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNpZ21hMl8yIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaWdtYTIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW9kdWxhdGlvblBlcmlvZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb2R1bGF0aW9uUGhhc2VTaGlmdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb2R1bGF0aW9uRmxvb3IiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FRG91YmxlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dDEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FRG91YmxlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dDIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FRG91YmxlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dDMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FRG91YmxlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dDQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FRG91YmxlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwiIGVTdXBlclR5cGVzPSIjLy9HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2lnbWEyXzMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FRG91YmxlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRyYW5zbWlzc2lvblJhdGUyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0cmFuc21pc3Npb25SYXRlMyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VEb3VibGUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW9kdWxhdGlvbkZsb29yXzIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FRG91YmxlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL21vZGVsL2ZvcmNpbmcuZ2VubW9kZWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9tb2RlbC9mb3JjaW5nLmdlbm1vZGVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OWE2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9tb2RlbC9mb3JjaW5nLmdlbm1vZGVsCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgorICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYyIKKyAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMiCisgICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmciIG1vZGVsTmFtZT0iRm9yY2luZyIKKyAgICBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLnByb3ZpZGVyLkZvcmNpbmdFZGl0UGx1Z2luIgorICAgIGVkaXRvclBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5wcmVzZW50YXRpb24uRm9yY2luZ0VkaXRvclBsdWdpbiIKKyAgICBub25OTFNNYXJrZXJzPSJ0cnVlIiB0ZXN0c0RpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYyIKKyAgICBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIuamF2YSIgY29tcGxpYW5jZUxldmVsPSI1LjAiIGNvcHlyaWdodEZpZWxkcz0iZmFsc2UiCisgICAgZWRpdFBsdWdpbklEPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZyIgZWRpdG9yUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nLmVkaXRvciIKKyAgICB0ZXN0c1BsdWdpbklEPSJvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZyIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvbW9kZWwvZGlzZWFzZW1vZGVscy5nZW5tb2RlbCMvL3N0YW5kYXJkIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vY29tbW9uIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vbW9kZWwgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9ncmFwaCAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL21vZGlmaWVyIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9zY2VuYXJpbyAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL3NlcXVlbmNlciAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL21vZGVsL2RlZmluaXRpb25zLmdlbm1vZGVsIy8vbGFiZWxzIj4KKyAgPGZvcmVpZ25Nb2RlbD5AbW9kZWw8L2ZvcmVpZ25Nb2RlbD4KKyAgPGdlblBhY2thZ2VzIHByZWZpeD0iRm9yY2luZyIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscyIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKKyAgICAgIGdlbmVyYXRlRXhhbXBsZUNsYXNzPSJmYWxzZSIgbXVsdGlwbGVFZGl0b3JQYWdlcz0iZmFsc2UiIGdlbmVyYXRlTW9kZWxXaXphcmQ9ImZhbHNlIgorICAgICAgZWNvcmVQYWNrYWdlPSJmb3JjaW5nLmVjb3JlIy8iPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImZvcmNpbmcuZWNvcmUjLy9Gb3JjaW5nRGlzZWFzZU1vZGVsIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBmb3JjaW5nLmVjb3JlIy8vRm9yY2luZ0Rpc2Vhc2VNb2RlbC9zZWFzb25hbE1vZHVsYXRpb24iLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBmb3JjaW5nLmVjb3JlIy8vRm9yY2luZ0Rpc2Vhc2VNb2RlbC9tb2R1bGF0aW9uUGVyaW9kIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZm9yY2luZy5lY29yZSMvL0ZvcmNpbmdEaXNlYXNlTW9kZWwvbW9kdWxhdGlvblBoYXNlU2hpZnQiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBmb3JjaW5nLmVjb3JlIy8vRm9yY2luZ0Rpc2Vhc2VNb2RlbC9hdHRlbnVhdGlvbiIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgPC9nZW5QYWNrYWdlcz4KKzwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NDYzODkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9wbHVnaW4ucHJvcGVydGllcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjIxNjc5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvcGx1Z2luLnhtbApAQCAtMCwwICsxLDY3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgorCis8IS0tCisgPGNvcHlyaWdodD4KKyA8L2NvcHlyaWdodD4KKworICRJZDogcGx1Z2luLnhtbCx2IDEuMSAyMDA5LzAzLzEzIDAwOjA1OjQ5IHNlZGx1bmQgRXhwICQKKy0tPgorCis8cGx1Z2luPgorICAgIAorICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5pdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yaWVzIj4KKyAgICA8ZmFjdG9yeSAKKyAgICAgICB1cmkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy5lY29yZSIgCisgICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcucHJvdmlkZXIuRm9yY2luZ0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IiAKKyAgICAgICBzdXBwb3J0ZWRUeXBlcyA9IAorICAgICAgICAgIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyCisgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyCisgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyCisgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyCisgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSIgLz4KKyAgPC9leHRlbnNpb24+CisKKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KKyAgICA8cGFja2FnZQorICAgICAgIHVyaSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nLmVjb3JlIgorICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdQYWNrYWdlIgorICAgICAgIGdlbk1vZGVsID0gIm1vZGVsL2ZvcmNpbmcuZ2VubW9kZWwiIC8+IAorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmRpc2Vhc2Vtb2RlbCI+CisgICAgIDxjbGFzc2RlZgorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5Gb3JjaW5nRGlzZWFzZU1vZGVsSW1wbCI+CisgICAgIDwvY2xhc3NkZWY+CisgICAgIDxkdWJsaW5fY29yZQorICAgICAgICAgICBjcmVhdG9yPSIlZGNfY3JlYXRvcl9lZGx1bmQiCisgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlZGNfZGVzY19FX1NfU0VJUiIKKyAgICAgICAgICAgaWRlbnRpZmllcj0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5kdWJsaW5fY29yZTQiCisgICAgICAgICAgIHRpdGxlPSIlZGNfdGl0bGVfRV9TX1NFSVIiPgorICAgICA8L2R1Ymxpbl9jb3JlPgorICA8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZGlzZWFzZW1vZGVsIj4KKyAgICAgPGNsYXNzZGVmCisgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5pbXBsLkdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwiPgorICAgICA8L2NsYXNzZGVmPgorICAgICA8ZHVibGluX2NvcmUKKyAgICAgICAgICAgY3JlYXRvcj0iJWRjX2NyZWF0b3JfZWRsdW5kIgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWRjX2Rlc2NfRV9TX1NFSVIiCisgICAgICAgICAgIGlkZW50aWZpZXI9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuZHVibGluX2NvcmU0IgorICAgICAgICAgICB0aXRsZT0iJWRjX3RpdGxlX0VfU19TRUlSIj4KKyAgICAgPC9kdWJsaW5fY29yZT4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5kaXNlYXNlbW9kZWwiPgorICAgICA8Y2xhc3NkZWYKKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwuR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwiPgorICAgICA8L2NsYXNzZGVmPgorICAgICA8ZHVibGluX2NvcmUKKyAgICAgICAgICAgY3JlYXRvcj0iJWRjX2NyZWF0b3JfZWRsdW5kIgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWRjX2Rlc2NfRV9TX1NFSVIiCisgICAgICAgICAgIGlkZW50aWZpZXI9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuZHVibGluX2NvcmU0IgorICAgICAgICAgICB0aXRsZT0iJWRjX3RpdGxlX0VfU19TRUlSIj4KKyAgICAgPC9kdWJsaW5fY29yZT4KKyAgPC9leHRlbnNpb24+Cis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9Gb3JjaW5nRGlzZWFzZU1vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvRm9yY2luZ0Rpc2Vhc2VNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YjFkMWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvRm9yY2luZ0Rpc2Vhc2VNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvLyBFeGFtcGxlRGlzZWFzZU1vZGVsLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmc7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWw7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgYW4gRU1GIE1vZGVsLgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBGb3JjaW5nRGlzZWFzZU1vZGVsIGV4dGVuZHMgU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIyLjAiPC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRXhwb25lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ1BhY2thZ2UjZ2V0Rm9yY2luZ0Rpc2Vhc2VNb2RlbF9TZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCgpCisJICogQG1vZGVsIGRlZmF1bHQ9IjIuMCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nRGlzZWFzZU1vZGVsI2dldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50IDxlbT5TZWFzb25hbCBNb2R1bGF0aW9uIEV4cG9uZW50PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZWFzb25hbCBNb2R1bGF0aW9uIEV4cG9uZW50PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgbW9kdWxhdGlvbiBwZXJpb2QgaXMgMSB5ZWFyLiBUaGlzIGRlZmF1bHQgdmFsdWUgYXNzdW1lcyB0aW1lIHN0ZXBzIGluIGRheXMuIE5vdGUgdGhhdCBvbmUgeWVhciA9IDM2NS4yNTYzNjMwNTEgZGF5cyAKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMzY1LjI1NjM2MzA1MSIKKwkgKi8KKwlkb3VibGUgZ2V0TW9kdWxhdGlvblBlcmlvZCgpOworCQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0TW9kdWxhdGlvblBlcmlvZCA8ZW0+TW9kdWxhdGlvbiBQZXJpb2Q8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsYXRpb24gUGVyaW9kPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRNb2R1bGF0aW9uUGVyaW9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNb2R1bGF0aW9uUGVyaW9kKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBtb2R1bGF0aW9uIHBoYXNlIHNoaWZ0IHNoaWZ0LiAKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMC4wIgorCSAqLworCWRvdWJsZSBnZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCA8ZW0+TW9kdWxhdGlvbiBQaGFzZSBTaGlmdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TW9kdWxhdGlvbiBQaGFzZSBTaGlmdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1vZHVsYXRpb25QaGFzZVNoaWZ0KGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWFzb25hbCBNb2R1bGF0aW9uIEZsb29yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjAuNiI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBGbG9vcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWFzb25hbCBNb2R1bGF0aW9uIEZsb29yPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRTZWFzb25hbE1vZHVsYXRpb25GbG9vcihkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nUGFja2FnZSNnZXRGb3JjaW5nRGlzZWFzZU1vZGVsX1NlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMC42IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IgPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRmxvb3I8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRmxvb3I8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTZWFzb25hbE1vZHVsYXRpb25GbG9vcihkb3VibGUgdmFsdWUpOworfSAvLyBFeGFtcGxlRGlzZWFzZU1vZGVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvRm9yY2luZ0ZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9Gb3JjaW5nRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzEyMDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvRm9yY2luZ0ZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDc4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEZvcmNpbmdGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgeworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRm9yY2luZ0ZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5Gb3JjaW5nRmFjdG9yeUltcGwuaW5pdCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlGb3JjaW5nRGlzZWFzZU1vZGVsIGNyZWF0ZUZvcmNpbmdEaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R2F1c3NpYW4gRm9yY2luZyBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HYXVzc2lhbiBGb3JjaW5nIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCBjcmVhdGVHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R2F1c3NpYW4yIEZvcmNpbmcgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R2F1c3NpYW4yIEZvcmNpbmcgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCBjcmVhdGVHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdhdXNzaWFuMyBGb3JjaW5nIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdhdXNzaWFuMyBGb3JjaW5nIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwgY3JlYXRlR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlGb3JjaW5nUGFja2FnZSBnZXRGb3JjaW5nUGFja2FnZSgpOworCit9IC8vRXhhbXBsZUZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9Gb3JjaW5nUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL0ZvcmNpbmdQYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMzMTVhYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9Gb3JjaW5nUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsMjA0OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAorICogPHVsPgorICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKyAqIDwvdWw+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ0ZhY3RvcnkKKyAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEZvcmNpbmdQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgeworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOQU1FID0gImZvcmNpbmciOworCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nLmVjb3JlIjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nIjsKKworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRm9yY2luZ1BhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5Gb3JjaW5nUGFja2FnZUltcGwuaW5pdCgpOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5pbXBsLkZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsIDxlbT5EaXNlYXNlIE1vZGVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5Gb3JjaW5nRGlzZWFzZU1vZGVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5Gb3JjaW5nUGFja2FnZUltcGwjZ2V0Rm9yY2luZ0Rpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBGT1JDSU5HX0RJU0VBU0VfTU9ERUwgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVVJJID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVFlQRV9VUkkgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBGT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTEFCRUxTX1RPX1VQREFURSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fR1JBUEggPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fR1JBUEg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fRU5BQkxFRCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19FTkFCTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fR1JBUEhfREVDT1JBVEVEID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fUFJPR1JFU1MgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUFJPR1JFU1M7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0QgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0Q7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRk9SQ0lOR19ESVNFQVNFX01PREVMX19ESVNFQVNFX05BTUUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aXZlIFRvbGVyYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fUkVMQVRJVkVfVE9MRVJBTkNFID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1JFTEFUSVZFX1RPTEVSQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pdGUgRGlmZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0UgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJlcXVlbmN5IERlcGVuZGVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19GUkVRVUVOQ1lfREVQRU5ERU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgQmlydGggUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9CSVJUSF9SQVRFID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfQklSVEhfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBQb3B1bGF0aW9uIENvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRk9SQ0lOR19ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudCBSZWNpcHJvY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRk9SQ0lOR19ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UX1JFQ0lQUk9DQUwgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIEFyZWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBGT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1RPVEFMX0FSRUEgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fVE9UQUxfQVJFQTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgUG9wdWxhdGlvbiBEZW5zaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRk9SQ0lOR19ESVNFQVNFX01PREVMX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNtaXNzaW9uIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBGT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBMaW5lYXJpdHkgQ29lZmZpY2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBGT1JDSU5HX0RJU0VBU0VfTU9ERUxfX05PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWNvdmVyeSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRk9SQ0lOR19ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBoeXNpY2FsbHkgQWRqYWNlbnQgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRk9SQ0lOR19ESVNFQVNFX01PREVMX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTiA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkIE5ldHdvcmsgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRk9SQ0lOR19ESVNFQVNFX01PREVMX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBGT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbW11bml0eSBMb3NzIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBGT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0lNTVVOSVRZX0xPU1NfUkFURSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19JTU1VTklUWV9MT1NTX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fU0VFRCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19TRUVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhbmRvbSBHZW5lcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBGT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1IgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HYWluPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRk9SQ0lOR19ESVNFQVNFX01PREVMX19HQUlOID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0dBSU47CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9FWFBPTkVOVCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsYXRpb24gUGVyaW9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BFUklPRCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBGT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEhBU0VfU0hJRlQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWFzb25hbCBNb2R1bGF0aW9uIEZsb29yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRk9SQ0lOR19ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0ZMT09SID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBGT1JDSU5HX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA0OworCisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwuR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsSW1wbCA8ZW0+R2F1c3NpYW4gRm9yY2luZyBEaXNlYXNlIE1vZGVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5pbXBsLkZvcmNpbmdQYWNrYWdlSW1wbCNnZXRHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1VSSSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1RZUEVfVVJJID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19EVUJMSU5fQ09SRSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0xBQkVMU19UT19VUERBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fTEFCRUxTX1RPX1VQREFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0dSQVBIID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0dSQVBIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0VOQUJMRUQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fRU5BQkxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0dSQVBIX0RFQ09SQVRFRCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1BST0dSRVNTID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1BST0dSRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0RJU0VBU0VfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWxhdGl2ZSBUb2xlcmFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1JFTEFUSVZFX1RPTEVSQU5DRSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXRlIERpZmZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0ZJTklURV9ESUZGRVJFTkNFID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0ZJTklURV9ESUZGRVJFTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyZXF1ZW5jeSBEZXBlbmRlbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0ZSRVFVRU5DWV9ERVBFTkRFTlQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIEJpcnRoIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfQklSVEhfUkFURSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQgUmVjaXByb2NhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBBcmVhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19UT1RBTF9BUkVBID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX0FSRUE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFBvcHVsYXRpb24gRGVuc2l0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zbWlzc2lvbiBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob24gTGluZWFyaXR5IENvZWZmaWNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX05PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVjb3ZlcnkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fUkVDT1ZFUllfUkFURSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaHlzaWNhbGx5IEFkamFjZW50IEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT04gPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTiA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFyYWN0ZXJpc3RpYyBNaXhpbmcgRGlzdGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1tdW5pdHkgTG9zcyBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19JTU1VTklUWV9MT1NTX1JBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fSU1NVU5JVFlfTE9TU19SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NFRUQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fU0VFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5kb20gR2VuZXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19SQU5ET01fR0VORVJBVE9SID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1I7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2FpbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fR0FJTiA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19HQUlOOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNpZ21hMjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fU0lHTUEyID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxhdGlvbiBQZXJpb2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxhdGlvbiBQaGFzZSBTaGlmdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsYXRpb24gRmxvb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fRkxPT1IgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HYXVzc2lhbiBGb3JjaW5nIERpc2Vhc2UgTW9kZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgNDsKKworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5pbXBsLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsIDxlbT5HYXVzc2lhbjIgRm9yY2luZyBEaXNlYXNlIE1vZGVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5Gb3JjaW5nUGFja2FnZUltcGwjZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19VUkkgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVFlQRV9VUkkgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19EVUJMSU5fQ09SRSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19MQUJFTFNfVE9fVVBEQVRFID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0xBQkVMU19UT19VUERBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGg8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fR1JBUEggPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fR1JBUEg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0VOQUJMRUQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fRU5BQkxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fR1JBUEhfREVDT1JBVEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2dyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fUFJPR1JFU1MgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUFJPR1JFU1M7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0QgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0Q7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0RJU0VBU0VfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWxhdGl2ZSBUb2xlcmFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0UgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUkVMQVRJVkVfVE9MRVJBTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbml0ZSBEaWZmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0UgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJlcXVlbmN5IERlcGVuZGVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0ZSRVFVRU5DWV9ERVBFTkRFTlQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIEJpcnRoIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9CSVJUSF9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudCBSZWNpcHJvY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBBcmVhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVE9UQUxfQVJFQSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19UT1RBTF9BUkVBOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBQb3B1bGF0aW9uIERlbnNpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNtaXNzaW9uIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob24gTGluZWFyaXR5IENvZWZmaWNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlY292ZXJ5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaHlzaWNhbGx5IEFkamFjZW50IEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWQgTmV0d29yayBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFyYWN0ZXJpc3RpYyBNaXhpbmcgRGlzdGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0UgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltbXVuaXR5IExvc3MgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0lNTVVOSVRZX0xPU1NfUkFURSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19JTU1VTklUWV9MT1NTX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NFRUQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fU0VFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5kb20gR2VuZXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUiA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19SQU5ET01fR0VORVJBVE9SOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdhaW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19HQUlOID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0dBSU47CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2lnbWEyIDI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTJfMiA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNpZ21hMjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NJR01BMiA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsYXRpb24gUGVyaW9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0QgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGF0aW9uIFBoYXNlIFNoaWZ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsYXRpb24gRmxvb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX0ZMT09SID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0MTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0FUVDEgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHQyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUMiA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dDM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19BVFQzID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0NDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0FUVDQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgODsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HYXVzc2lhbjIgRm9yY2luZyBEaXNlYXNlIE1vZGVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA5OworCisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwuR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwgPGVtPkdhdXNzaWFuMyBGb3JjaW5nIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5pbXBsLkdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5pbXBsLkZvcmNpbmdQYWNrYWdlSW1wbCNnZXRHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUwgPSAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1VSSSA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1RZUEVfVVJJID0gR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19EVUJMSU5fQ09SRSA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0xBQkVMU19UT19VUERBVEUgPSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0dSQVBIID0gR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fR1JBUEg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0VOQUJMRUQgPSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19FTkFCTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0dSQVBIX0RFQ09SQVRFRCA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1BST0dSRVNTID0gR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fUFJPR1JFU1M7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEUgPSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EID0gR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0Q7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FID0gR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aXZlIFRvbGVyYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1JFTEFUSVZFX1RPTEVSQU5DRSA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1JFTEFUSVZFX1RPTEVSQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pdGUgRGlmZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0ZJTklURV9ESUZGRVJFTkNFID0gR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJlcXVlbmN5IERlcGVuZGVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0ZSRVFVRU5DWV9ERVBFTkRFTlQgPSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19GUkVRVUVOQ1lfREVQRU5ERU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgQmlydGggUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfQklSVEhfUkFURSA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfQklSVEhfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBQb3B1bGF0aW9uIENvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVCA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudCBSZWNpcHJvY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMID0gR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIEFyZWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19UT1RBTF9BUkVBID0gR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVE9UQUxfQVJFQTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgUG9wdWxhdGlvbiBEZW5zaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWSA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNtaXNzaW9uIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURSA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBMaW5lYXJpdHkgQ29lZmZpY2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UID0gR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWNvdmVyeSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fUkVDT1ZFUllfUkFURSA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUgPSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBoeXNpY2FsbHkgQWRqYWNlbnQgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT04gPSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkIE5ldHdvcmsgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTiA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWSA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRSA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbW11bml0eSBMb3NzIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19JTU1VTklUWV9MT1NTX1JBVEUgPSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19JTU1VTklUWV9MT1NTX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NFRUQgPSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19TRUVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhbmRvbSBHZW5lcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19SQU5ET01fR0VORVJBVE9SID0gR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HYWluPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fR0FJTiA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0dBSU47CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2lnbWEyIDI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTJfMiA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NJR01BMl8yOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNpZ21hMjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NJR01BMiA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NJR01BMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGF0aW9uIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EID0gR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0Q7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxhdGlvbiBQaGFzZSBTaGlmdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEhBU0VfU0hJRlQgPSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsYXRpb24gRmxvb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX0ZMT09SID0gR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9GTE9PUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHQxPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUMSA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0FUVDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0MjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0FUVDIgPSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19BVFQyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dDM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19BVFQzID0gR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHQ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUNCA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0FUVDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2lnbWEyIDM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTJfMyA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNtaXNzaW9uIFJhdGUyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEUyID0gR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc21pc3Npb24gUmF0ZTM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURTMgPSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsYXRpb24gRmxvb3IgMjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fRkxPT1JfMiA9IEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R2F1c3NpYW4zIEZvcmNpbmcgRGlzZWFzZSBNb2RlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgPSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA0OworCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nRGlzZWFzZU1vZGVsIDxlbT5EaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRGb3JjaW5nRGlzZWFzZU1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQgPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRXhwb25lbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZWFzb25hbCBNb2R1bGF0aW9uIEV4cG9uZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCgpCisJICogQHNlZSAjZ2V0Rm9yY2luZ0Rpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Rm9yY2luZ0Rpc2Vhc2VNb2RlbF9TZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nRGlzZWFzZU1vZGVsI2dldE1vZHVsYXRpb25QZXJpb2QgPGVtPk1vZHVsYXRpb24gUGVyaW9kPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW9kdWxhdGlvbiBQZXJpb2Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nRGlzZWFzZU1vZGVsI2dldE1vZHVsYXRpb25QZXJpb2QoKQorCSAqIEBzZWUgI2dldEZvcmNpbmdEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEZvcmNpbmdEaXNlYXNlTW9kZWxfTW9kdWxhdGlvblBlcmlvZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nRGlzZWFzZU1vZGVsI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0IDxlbT5Nb2R1bGF0aW9uIFBoYXNlIFNoaWZ0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW9kdWxhdGlvbiBQaGFzZSBTaGlmdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoKQorCSAqIEBzZWUgI2dldEZvcmNpbmdEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEZvcmNpbmdEaXNlYXNlTW9kZWxfTW9kdWxhdGlvblBoYXNlU2hpZnQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRTZWFzb25hbE1vZHVsYXRpb25GbG9vciA8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBGbG9vcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRmxvb3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nRGlzZWFzZU1vZGVsI2dldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCkKKwkgKiBAc2VlICNnZXRGb3JjaW5nRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRGb3JjaW5nRGlzZWFzZU1vZGVsX1NlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwgPGVtPkdhdXNzaWFuIEZvcmNpbmcgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HYXVzc2lhbiBGb3JjaW5nIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0U2lnbWEyIDxlbT5TaWdtYTI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaWdtYTI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0U2lnbWEyKCkKKwkgKiBAc2VlICNnZXRHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbF9TaWdtYTIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsI2dldE1vZHVsYXRpb25QZXJpb2QgPGVtPk1vZHVsYXRpb24gUGVyaW9kPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW9kdWxhdGlvbiBQZXJpb2Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0TW9kdWxhdGlvblBlcmlvZCgpCisJICogQHNlZSAjZ2V0R2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxfTW9kdWxhdGlvblBlcmlvZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQgPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Nb2R1bGF0aW9uIFBoYXNlIFNoaWZ0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkKKwkgKiBAc2VlICNnZXRHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbF9Nb2R1bGF0aW9uUGhhc2VTaGlmdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0TW9kdWxhdGlvbkZsb29yIDxlbT5Nb2R1bGF0aW9uIEZsb29yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW9kdWxhdGlvbiBGbG9vcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRNb2R1bGF0aW9uRmxvb3IoKQorCSAqIEBzZWUgI2dldEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0R2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsX01vZHVsYXRpb25GbG9vcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCA8ZW0+R2F1c3NpYW4yIEZvcmNpbmcgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HYXVzc2lhbjIgRm9yY2luZyBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsI2dldFNpZ21hMl8yIDxlbT5TaWdtYTIgMjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNpZ21hMiAyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRTaWdtYTJfMigpCisJICogQHNlZSAjZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9TaWdtYTJfMigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsI2dldFNpZ21hMiA8ZW0+U2lnbWEyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2lnbWEyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRTaWdtYTIoKQorCSAqIEBzZWUgI2dldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfU2lnbWEyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0TW9kdWxhdGlvblBlcmlvZCA8ZW0+TW9kdWxhdGlvbiBQZXJpb2Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Nb2R1bGF0aW9uIFBlcmlvZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0TW9kdWxhdGlvblBlcmlvZCgpCisJICogQHNlZSAjZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9Nb2R1bGF0aW9uUGVyaW9kKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQgPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Nb2R1bGF0aW9uIFBoYXNlIFNoaWZ0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCgpCisJICogQHNlZSAjZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9Nb2R1bGF0aW9uUGhhc2VTaGlmdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsI2dldE1vZHVsYXRpb25GbG9vciA8ZW0+TW9kdWxhdGlvbiBGbG9vcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1vZHVsYXRpb24gRmxvb3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsI2dldE1vZHVsYXRpb25GbG9vcigpCisJICogQHNlZSAjZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9Nb2R1bGF0aW9uRmxvb3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRBdHQxIDxlbT5BdHQxPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXR0MTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0QXR0MSgpCisJICogQHNlZSAjZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9BdHQxKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0QXR0MiA8ZW0+QXR0MjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF0dDI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsI2dldEF0dDIoKQorCSAqIEBzZWUgI2dldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfQXR0MigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsI2dldEF0dDMgPGVtPkF0dDM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdHQzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRBdHQzKCkKKwkgKiBAc2VlICNnZXRHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsX0F0dDMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRBdHQ0IDxlbT5BdHQ0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXR0NDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0QXR0NCgpCisJICogQHNlZSAjZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9BdHQ0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsIDxlbT5HYXVzc2lhbjMgRm9yY2luZyBEaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkdhdXNzaWFuMyBGb3JjaW5nIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0U2lnbWEyXzMgPGVtPlNpZ21hMiAzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2lnbWEyIDM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsI2dldFNpZ21hMl8zKCkKKwkgKiBAc2VlICNnZXRHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsX1NpZ21hMl8zKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0VHJhbnNtaXNzaW9uUmF0ZTIgPGVtPlRyYW5zbWlzc2lvbiBSYXRlMjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRyYW5zbWlzc2lvbiBSYXRlMjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0VHJhbnNtaXNzaW9uUmF0ZTIoKQorCSAqIEBzZWUgI2dldEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxfVHJhbnNtaXNzaW9uUmF0ZTIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRUcmFuc21pc3Npb25SYXRlMyA8ZW0+VHJhbnNtaXNzaW9uIFJhdGUzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHJhbnNtaXNzaW9uIFJhdGUzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRUcmFuc21pc3Npb25SYXRlMygpCisJICogQHNlZSAjZ2V0R2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0R2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbF9UcmFuc21pc3Npb25SYXRlMygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsI2dldE1vZHVsYXRpb25GbG9vcl8yIDxlbT5Nb2R1bGF0aW9uIEZsb29yIDI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Nb2R1bGF0aW9uIEZsb29yIDI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsI2dldE1vZHVsYXRpb25GbG9vcl8yKCkKKwkgKiBAc2VlICNnZXRHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsX01vZHVsYXRpb25GbG9vcl8yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlGb3JjaW5nRmFjdG9yeSBnZXRGb3JjaW5nRmFjdG9yeSgpOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50CisJICogPHVsPgorCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisJICogPC91bD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50ZXJmYWNlIExpdGVyYWxzIHsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5pbXBsLkZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsIDxlbT5EaXNlYXNlIE1vZGVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5Gb3JjaW5nRGlzZWFzZU1vZGVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwuRm9yY2luZ1BhY2thZ2VJbXBsI2dldEZvcmNpbmdEaXNlYXNlTW9kZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgRk9SQ0lOR19ESVNFQVNFX01PREVMID0gZUlOU1RBTkNFLmdldEZvcmNpbmdEaXNlYXNlTW9kZWwoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWFzb25hbCBNb2R1bGF0aW9uIEV4cG9uZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRk9SQ0lOR19ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0VYUE9ORU5UID0gZUlOU1RBTkNFLmdldEZvcmNpbmdEaXNlYXNlTW9kZWxfU2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGF0aW9uIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0QgPSBlSU5TVEFOQ0UuZ2V0Rm9yY2luZ0Rpc2Vhc2VNb2RlbF9Nb2R1bGF0aW9uUGVyaW9kKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxhdGlvbiBQaGFzZSBTaGlmdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVCA9IGVJTlNUQU5DRS5nZXRGb3JjaW5nRGlzZWFzZU1vZGVsX01vZHVsYXRpb25QaGFzZVNoaWZ0KCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2Vhc29uYWwgTW9kdWxhdGlvbiBGbG9vcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUiA9IGVJTlNUQU5DRS5nZXRGb3JjaW5nRGlzZWFzZU1vZGVsX1NlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsIDxlbT5HYXVzc2lhbiBGb3JjaW5nIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5pbXBsLkdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5pbXBsLkZvcmNpbmdQYWNrYWdlSW1wbCNnZXRHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMID0gZUlOU1RBTkNFLmdldEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNpZ21hMjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fU0lHTUEyID0gZUlOU1RBTkNFLmdldEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbF9TaWdtYTIoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGF0aW9uIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0QgPSBlSU5TVEFOQ0UuZ2V0R2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsX01vZHVsYXRpb25QZXJpb2QoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGF0aW9uIFBoYXNlIFNoaWZ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZUID0gZUlOU1RBTkNFLmdldEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbF9Nb2R1bGF0aW9uUGhhc2VTaGlmdCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZHVsYXRpb24gRmxvb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBHQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fRkxPT1IgPSBlSU5TVEFOQ0UuZ2V0R2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsX01vZHVsYXRpb25GbG9vcigpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwgPGVtPkdhdXNzaWFuMiBGb3JjaW5nIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5pbXBsLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5Gb3JjaW5nUGFja2FnZUltcGwjZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMID0gZUlOU1RBTkNFLmdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TaWdtYTIgMjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NJR01BMl8yID0gZUlOU1RBTkNFLmdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfU2lnbWEyXzIoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TaWdtYTI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTIgPSBlSU5TVEFOQ0UuZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9TaWdtYTIoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGF0aW9uIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EID0gZUlOU1RBTkNFLmdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfTW9kdWxhdGlvblBlcmlvZCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZUID0gZUlOU1RBTkNFLmdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfTW9kdWxhdGlvblBoYXNlU2hpZnQoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGF0aW9uIEZsb29yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9GTE9PUiA9IGVJTlNUQU5DRS5nZXRHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsX01vZHVsYXRpb25GbG9vcigpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF0dDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19BVFQxID0gZUlOU1RBTkNFLmdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfQXR0MSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF0dDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19BVFQyID0gZUlOU1RBTkNFLmdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfQXR0MigpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF0dDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19BVFQzID0gZUlOU1RBTkNFLmdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfQXR0MygpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF0dDQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19BVFQ0ID0gZUlOU1RBTkNFLmdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfQXR0NCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwuR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwgPGVtPkdhdXNzaWFuMyBGb3JjaW5nIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5pbXBsLkdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5Gb3JjaW5nUGFja2FnZUltcGwjZ2V0R2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMID0gZUlOU1RBTkNFLmdldEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TaWdtYTIgMzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NJR01BMl8zID0gZUlOU1RBTkNFLmdldEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxfU2lnbWEyXzMoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFuc21pc3Npb24gUmF0ZTI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURTIgPSBlSU5TVEFOQ0UuZ2V0R2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbF9UcmFuc21pc3Npb25SYXRlMigpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zbWlzc2lvbiBSYXRlMzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFMyA9IGVJTlNUQU5DRS5nZXRHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsX1RyYW5zbWlzc2lvblJhdGUzKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxhdGlvbiBGbG9vciAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9GTE9PUl8yID0gZUlOU1RBTkNFLmdldEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxfTW9kdWxhdGlvbkZsb29yXzIoKTsKKworCX0KKworfSAvL0V4YW1wbGVQYWNrYWdlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTg5NGZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwuamF2YQpAQCAtMCwwICsxLDI3NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZzsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdhdXNzaWFuMiBGb3JjaW5nIERpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRTaWdtYTJfMiA8ZW0+U2lnbWEyIDI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0U2lnbWEyIDxlbT5TaWdtYTI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0TW9kdWxhdGlvblBlcmlvZCA8ZW0+TW9kdWxhdGlvbiBQZXJpb2Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQgPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0TW9kdWxhdGlvbkZsb29yIDxlbT5Nb2R1bGF0aW9uIEZsb29yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsI2dldEF0dDEgPGVtPkF0dDE8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0QXR0MiA8ZW0+QXR0MjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRBdHQzIDxlbT5BdHQzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsI2dldEF0dDQgPGVtPkF0dDQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdQYWNrYWdlI2dldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCBleHRlbmRzIFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNpZ21hMiAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TaWdtYTIgMjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaWdtYTIgMjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U2lnbWEyXzIoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ1BhY2thZ2UjZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9TaWdtYTJfMigpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRTaWdtYTJfMigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRTaWdtYTJfMiA8ZW0+U2lnbWEyIDI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNpZ21hMiAyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRTaWdtYTJfMigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U2lnbWEyXzIoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNpZ21hMjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2lnbWEyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNpZ21hMjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U2lnbWEyKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdQYWNrYWdlI2dldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfU2lnbWEyKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldFNpZ21hMigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRTaWdtYTIgPGVtPlNpZ21hMjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2lnbWEyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRTaWdtYTIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNpZ21hMihkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TW9kdWxhdGlvbiBQZXJpb2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1vZHVsYXRpb24gUGVyaW9kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsYXRpb24gUGVyaW9kPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNb2R1bGF0aW9uUGVyaW9kKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdQYWNrYWdlI2dldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfTW9kdWxhdGlvblBlcmlvZCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRNb2R1bGF0aW9uUGVyaW9kKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsI2dldE1vZHVsYXRpb25QZXJpb2QgPGVtPk1vZHVsYXRpb24gUGVyaW9kPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2R1bGF0aW9uIFBlcmlvZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TW9kdWxhdGlvblBlcmlvZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TW9kdWxhdGlvblBlcmlvZChkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TW9kdWxhdGlvbiBQaGFzZSBTaGlmdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TW9kdWxhdGlvbiBQaGFzZSBTaGlmdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2R1bGF0aW9uIFBoYXNlIFNoaWZ0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNb2R1bGF0aW9uUGhhc2VTaGlmdChkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nUGFja2FnZSNnZXRHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsX01vZHVsYXRpb25QaGFzZVNoaWZ0KCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0IDxlbT5Nb2R1bGF0aW9uIFBoYXNlIFNoaWZ0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2R1bGF0aW9uIFBoYXNlIFNoaWZ0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vZHVsYXRpb24gRmxvb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1vZHVsYXRpb24gRmxvb3I8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW9kdWxhdGlvbiBGbG9vcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TW9kdWxhdGlvbkZsb29yKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdQYWNrYWdlI2dldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfTW9kdWxhdGlvbkZsb29yKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldE1vZHVsYXRpb25GbG9vcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRNb2R1bGF0aW9uRmxvb3IgPGVtPk1vZHVsYXRpb24gRmxvb3I8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsYXRpb24gRmxvb3I8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25GbG9vcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TW9kdWxhdGlvbkZsb29yKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHQxPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHQxPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dDE8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEF0dDEoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ1BhY2thZ2UjZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9BdHQxKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldEF0dDEoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0QXR0MSA8ZW0+QXR0MTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0MTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0QXR0MSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QXR0MShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0MjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0MjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHQyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRBdHQyKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdQYWNrYWdlI2dldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfQXR0MigpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRBdHQyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsI2dldEF0dDIgPGVtPkF0dDI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dDI8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEF0dDIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEF0dDIoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dDM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dDM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0MzwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0QXR0Myhkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nUGFja2FnZSNnZXRHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsX0F0dDMoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0QXR0MygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRBdHQzIDxlbT5BdHQzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHQzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRBdHQzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRBdHQzKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHQ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHQ0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dDQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEF0dDQoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ1BhY2thZ2UjZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9BdHQ0KCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldEF0dDQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0QXR0NCA8ZW0+QXR0NDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0NDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0QXR0NCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QXR0NChkb3VibGUgdmFsdWUpOworCit9IC8vIEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDk0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R2F1c3NpYW4zIEZvcmNpbmcgRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsI2dldFNpZ21hMl8zIDxlbT5TaWdtYTIgMzwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRUcmFuc21pc3Npb25SYXRlMiA8ZW0+VHJhbnNtaXNzaW9uIFJhdGUyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsI2dldFRyYW5zbWlzc2lvblJhdGUzIDxlbT5UcmFuc21pc3Npb24gUmF0ZTM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0TW9kdWxhdGlvbkZsb29yXzIgPGVtPk1vZHVsYXRpb24gRmxvb3IgMjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ1BhY2thZ2UjZ2V0R2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsIGV4dGVuZHMgR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2lnbWEyIDM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNpZ21hMiAzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNpZ21hMiAzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRTaWdtYTJfMyhkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nUGFja2FnZSNnZXRHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsX1NpZ21hMl8zKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldFNpZ21hMl8zKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsI2dldFNpZ21hMl8zIDxlbT5TaWdtYTIgMzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2lnbWEyIDM8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFNpZ21hMl8zKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTaWdtYTJfMyhkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHJhbnNtaXNzaW9uIFJhdGUyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UcmFuc21pc3Npb24gUmF0ZTI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNtaXNzaW9uIFJhdGUyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRUcmFuc21pc3Npb25SYXRlMihkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nUGFja2FnZSNnZXRHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsX1RyYW5zbWlzc2lvblJhdGUyKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldFRyYW5zbWlzc2lvblJhdGUyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsI2dldFRyYW5zbWlzc2lvblJhdGUyIDxlbT5UcmFuc21pc3Npb24gUmF0ZTI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zbWlzc2lvbiBSYXRlMjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VHJhbnNtaXNzaW9uUmF0ZTIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRyYW5zbWlzc2lvblJhdGUyKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UcmFuc21pc3Npb24gUmF0ZTM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRyYW5zbWlzc2lvbiBSYXRlMzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc21pc3Npb24gUmF0ZTM8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFRyYW5zbWlzc2lvblJhdGUzKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdQYWNrYWdlI2dldEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxfVHJhbnNtaXNzaW9uUmF0ZTMoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0VHJhbnNtaXNzaW9uUmF0ZTMoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0VHJhbnNtaXNzaW9uUmF0ZTMgPGVtPlRyYW5zbWlzc2lvbiBSYXRlMzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNtaXNzaW9uIFJhdGUzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRUcmFuc21pc3Npb25SYXRlMygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VHJhbnNtaXNzaW9uUmF0ZTMoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vZHVsYXRpb24gRmxvb3IgMjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TW9kdWxhdGlvbiBGbG9vciAyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsYXRpb24gRmxvb3IgMjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TW9kdWxhdGlvbkZsb29yXzIoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ1BhY2thZ2UjZ2V0R2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbF9Nb2R1bGF0aW9uRmxvb3JfMigpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRNb2R1bGF0aW9uRmxvb3JfMigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRNb2R1bGF0aW9uRmxvb3JfMiA8ZW0+TW9kdWxhdGlvbiBGbG9vciAyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2R1bGF0aW9uIEZsb29yIDI8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25GbG9vcl8yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNb2R1bGF0aW9uRmxvb3JfMihkb3VibGUgdmFsdWUpOworCit9IC8vIEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjMxNzE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL0dhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R2F1c3NpYW4gRm9yY2luZyBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRTaWdtYTIgPGVtPlNpZ21hMjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsI2dldE1vZHVsYXRpb25QZXJpb2QgPGVtPk1vZHVsYXRpb24gUGVyaW9kPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQgPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRNb2R1bGF0aW9uRmxvb3IgPGVtPk1vZHVsYXRpb24gRmxvb3I8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdQYWNrYWdlI2dldEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwgZXh0ZW5kcyBTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsIHsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNpZ21hMjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIxMDAiPC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNpZ21hMjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaWdtYTI8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFNpZ21hMihkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nUGFja2FnZSNnZXRHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxfU2lnbWEyKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMTAwIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0U2lnbWEyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0U2lnbWEyIDxlbT5TaWdtYTI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNpZ21hMjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0U2lnbWEyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTaWdtYTIoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vZHVsYXRpb24gUGVyaW9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjM2NS4yNSI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TW9kdWxhdGlvbiBQZXJpb2Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW9kdWxhdGlvbiBQZXJpb2Q8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE1vZHVsYXRpb25QZXJpb2QoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ1BhY2thZ2UjZ2V0R2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsX01vZHVsYXRpb25QZXJpb2QoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSIzNjUuMjUiCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRNb2R1bGF0aW9uUGVyaW9kKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0TW9kdWxhdGlvblBlcmlvZCA8ZW0+TW9kdWxhdGlvbiBQZXJpb2Q8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsYXRpb24gUGVyaW9kPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRNb2R1bGF0aW9uUGVyaW9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNb2R1bGF0aW9uUGVyaW9kKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb2R1bGF0aW9uIFBoYXNlIFNoaWZ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjAiPC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW9kdWxhdGlvbiBQaGFzZSBTaGlmdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ1BhY2thZ2UjZ2V0R2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsX01vZHVsYXRpb25QaGFzZVNoaWZ0KCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwjZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQgPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNb2R1bGF0aW9uUGhhc2VTaGlmdChkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TW9kdWxhdGlvbiBGbG9vcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIwLjYiPC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1vZHVsYXRpb24gRmxvb3I8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW9kdWxhdGlvbiBGbG9vcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TW9kdWxhdGlvbkZsb29yKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdQYWNrYWdlI2dldEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbF9Nb2R1bGF0aW9uRmxvb3IoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSIwLjYiCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRNb2R1bGF0aW9uRmxvb3IoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCNnZXRNb2R1bGF0aW9uRmxvb3IgPGVtPk1vZHVsYXRpb24gRmxvb3I8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsYXRpb24gRmxvb3I8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25GbG9vcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TW9kdWxhdGlvbkZsb29yKGRvdWJsZSB2YWx1ZSk7Cit9IC8vIEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL2ltcGwvRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9pbXBsL0ZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5Mzc1YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9pbXBsL0ZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsLmphdmEKQEAgLTAsMCArMSw0OTUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJMYWJlbFZhbHVlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSW1wbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwuRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQgPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRXhwb25lbnQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwuRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwjZ2V0TW9kdWxhdGlvblBlcmlvZCA8ZW0+TW9kdWxhdGlvbiBQZXJpb2Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwuRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwjZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQgPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwuRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IgPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRmxvb3I8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQorcHVibGljIGNsYXNzIEZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsIGV4dGVuZHMgU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwgaW1wbGVtZW50cyBGb3JjaW5nRGlzZWFzZU1vZGVsIHsKKwkKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKSA8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFNFQVNPTkFMX01PRFVMQVRJT05fRVhQT05FTlRfRURFRkFVTFQgPSAyLjA7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKSA8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgc2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQgPSBTRUFTT05BTF9NT0RVTEFUSU9OX0VYUE9ORU5UX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNb2R1bGF0aW9uUGVyaW9kKCkgPGVtPk1vZHVsYXRpb24gUGVyaW9kPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNb2R1bGF0aW9uUGVyaW9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBNT0RVTEFUSU9OX1BFUklPRF9FREVGQVVMVCA9IDM2NS4yNTYzNjMwNTE7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TW9kdWxhdGlvblBlcmlvZCgpIDxlbT5Nb2R1bGF0aW9uIFBlcmlvZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TW9kdWxhdGlvblBlcmlvZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBtb2R1bGF0aW9uUGVyaW9kID0gTU9EVUxBVElPTl9QRVJJT0RfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkgPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBNT0RVTEFUSU9OX1BIQVNFX1NISUZUX0VERUZBVUxUID0gMC4wOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkgPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIG1vZHVsYXRpb25QaGFzZVNoaWZ0ID0gTU9EVUxBVElPTl9QSEFTRV9TSElGVF9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKSA8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBGbG9vcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFNFQVNPTkFMX01PRFVMQVRJT05fRkxPT1JfRURFRkFVTFQgPSAwLjY7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKSA8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBGbG9vcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgc2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IgPSBTRUFTT05BTF9NT0RVTEFUSU9OX0ZMT09SX0VERUZBVUxUOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBNSUxMSVNfUEVSX0RBWSA9IDEwMDAuMCo2MC4wKjYwLjAqMjQuMDsKKwkKKwlwcml2YXRlIGZpbmFsIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwkKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIEZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwkvKioKKwkgKiBUbyBjcmVhdGUgYSB1c2VyIGRlZmluZWQgKGV4cGVyaW1lbnRhbCkgZGlzZWFzZSBtb2RlLCB0aGUgdXNlciBtYXkgd2lzaCAKKwkgKiB0byBleHRlbmQgdGhlIGV4aXN0aW5nIG1vZGVscyBidXQgc2ltcGx5IG92ZXJyaWRlIHR3byBtZXRob2RzLgorCSAqIGNvbXB1dGVEaXNlYXNlRGVsdGFzKCkgc2V0cyB0aGUgd29yayBmbG93IGZvciB0aGUgbW9kZWwuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZQorCSAqIGlzIGRlcml2ZWQgZnJvbSB0aGUgc3RhbmRhcmQgY29kZSBmb3IgYWxsIGJ1aWxkIGluIG1vZGVscyBidXQgaW4gdGhlIGxpbmUgYmVsb3cKKwkgKiB3aGVyZSB3ZSBkZWZpbmUgZmluYWwgImRvdWJsZSB0cmFuc21pc2lvblJhdGUiIHdlIHNob3cgYW5kIGV4YW1wbGUgbW9kaWZpY2F0aW9uCisJICogd2hlcmUgYSBwZXJpb2RpYyBmb3JjaW5nIGZhY3RvciB7IHNpbihmcmVxKnQpIH0gaXMgYWRkZWQgdG8gdGhlIGNvZGUgYXMgYW4gZXhhbXBsZQorCSAqIG1vZGlmaWNhdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gdGltZQorCSAqIAkJCSAgY3VycmVudCB0aW1lCisJICogQHBhcmFtIGN1cnJlbnRTdGF0ZQorCSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvcHVsYXRpb24KKwkgKiBAcGFyYW0gZGlzZWFzZUxhYmVsCisJICogICAgICAgICAgICB0aGUgZGlzZWFzZSBsYWJlbCBmb3Igd2hpY2ggdGhlIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBiZWluZworCSAqICAgICAgICAgICAgY29tcHV0ZWQuCisJICogQHBhcmFtIHRpbWVEZWx0YQorCSAqICAgICAgICAgICAgdGhlIHRpbWUgcGVyaW9kIChtaWxsaXNlY29uZHMpIG92ZXIgd2hpY2ggdGhlIHBvcHVsYXRpb24KKwkgKiAgICAgICAgICAgIG1lbWJlcnMgdHJhbnNpdGlvbiB0byBuZXcgc3RhdGVzICAgICAgICAgIAorCSAqIEByZXR1cm4gYSBkaXNlYXNlIHN0YXRlIGxhYmVsIHZhbHVlIHRoYXQgY29udGFpbnMgdGhlIG51bWJlciBvZgorCSAqICAgICAgICAgZGVsdGEgY2hhbmdlcyBpbiBlYWNoIGRpc2Vhc2Ugc3RhdGUKKwkgKiAKKwkgKiBVc2VycyBjYW4gbW9kaWZ5IHRoZSBtZXRob2QgYmVsb3cgdG8gY3JlYXRlIHRoZWlyIG93biBtb2RlbC4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJSW1wbCNjb21wdXRlRGlzZWFzZURlbHRhcyhTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUsCisJICogICAgICBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsLCBsb25nKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY29tcHV0ZURpc2Vhc2VEZWx0YXMoCisJCQlmaW5hbCBTVEVNVGltZSB0aW1lLAorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGN1cnJlbnRTdGF0ZSwKKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZUxhYmVsLCBmaW5hbCBsb25nIHRpbWVEZWx0YSwgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSByZXR1cm5WYWx1ZSkgeworZmluYWwgU0lSTGFiZWxWYWx1ZSBjdXJyZW50U0lSID0gKFNJUkxhYmVsVmFsdWUpIGN1cnJlbnRTdGF0ZTsKKwkJCisJCWRvdWJsZSBjdXJyZW50TWlsbGlzID0gdGltZS5nZXRUaW1lKCkuZ2V0VGltZSgpOworCQlkb3VibGUgc2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQgPSBnZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCgpOworCQlkb3VibGUgc2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IgPSBnZXRTZWFzb25hbE1vZHVsYXRpb25GbG9vcigpOworCQlkb3VibGUgbW9kdWxhdGlvblBlcmlvZCA9IGdldE1vZHVsYXRpb25QZXJpb2QoKTsKKwkJZG91YmxlIHBoYXNlID0gZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoKTsJCisJCQkJCisJCS8vIEdldCB0aGUgeWVhciB0aGF0IG1hdGNoZXMgdGhlIHBoYXNlIHNoaWZ0LiAtcGkvMiBpcyAtbW9kdWxhdGlvblBlcmlvZC8yLCBwaS8yIGlzIG1vZHVsYXRpb25QZXJpb2QvMgorCQlsb25nIGFkanVzdGVkTWlsbGlzZWNzRm9yUGhhc2VTaGZ0ID0gKGxvbmcpKGN1cnJlbnRNaWxsaXMgKyBtb2R1bGF0aW9uUGVyaW9kKk1JTExJU19QRVJfREFZKnBoYXNlLygyLjAqTWF0aC5QSS8yLjApKTsKKwkJCisJCS8vaW50IHllYXI9MDsKKwkJLy8gU2hhcmVkIGNhbGVuZGFyIG9iamVjdCBub3QgdGhyZWFkIHNhZmUKKwkJc3luY2hyb25pemVkKGNhbGVuZGFyKSB7CisJCQljYWxlbmRhci5zZXRUaW1lSW5NaWxsaXMoYWRqdXN0ZWRNaWxsaXNlY3NGb3JQaGFzZVNoZnQpOworCQkJLy95ZWFyID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLllFQVIpOworCQl9CisJCQorCQkKKwkJZG91YmxlIG1vZHVsYXRpb24gPSBzZWFzb25hbE1vZHVsYXRpb25GbG9vciArICgxLXNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKSpNYXRoLnBvdyhNYXRoLmFicyhNYXRoLnNpbihwaGFzZSArIE1hdGguUEkqY3VycmVudE1pbGxpcy8obW9kdWxhdGlvblBlcmlvZCpNSUxMSVNfUEVSX0RBWSkpKSwgc2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQpOworCQkKKwkJCisJCQorCQkvLyBUaGlzIGlzIGJldGEqCisJCWRvdWJsZSB0cmFuc21pc3Npb25SYXRlID0gbW9kdWxhdGlvbiAqIChnZXRBZGp1c3RlZFRyYW5zbWlzc2lvblJhdGUodGltZURlbHRhKSk7CisKKwkJaWYoIXRoaXMuaXNGcmVxdWVuY3lEZXBlbmRlbnQoKSkgIHRyYW5zbWlzc2lvblJhdGUgKj0gZ2V0VHJhbnNtaXNzaW9uUmF0ZVNjYWxlRmFjdG9yKGRpc2Vhc2VMYWJlbCk7CisJCQorCQkvLyBUaGUgZWZmZWN0aXZlIEluZmVjdGlvdXMgcG9wdWxhdGlvbiAgaXMgYSBkaW1lbnNpb25sZXMgbnVtYmVyIG5vcm1hbGl6ZSBieSB0b3RhbAorCQkvLyBwb3B1bGF0aW9uIHVzZWQgaW4gdGVoIGNvbXB1dGF0aW9uIG9mIGJldHMqUyppIHdoZXJlIGkgPSBJZWZmZWN0aXZlL1BvcC4KKwkJLy8gVGhpcyBpbmNsdWRlcyBhIGNvcnJlY3Rpb24gdG8gdGhlIGN1cnJlbnQKKwkJLy8gaW5mZWN0aW91cyBwb3B1bGF0aW9uIChJZWZmZWN0aXZlKSBiYXNlZCBvbiB0aGUgY29uc2VydmVkIGV4Y2hhbmdlIG9mIHBlb3BsZSAoY2lyY3VsYXRpb24pCisJCS8vIGJldHdlZW4gcmVnaW9ucy4gTm90ZSB0aGF0IHRoaXMgaXMgbm8gdGhlICJhcnJpdmFscyIgYW5kICJkZXBhcnR1cmVzIiB3aGljaCBhcmUKKwkJLy8gYSBkaWZmZXJlbnQgcHJvY2Vzcy4KKwkJZmluYWwgZG91YmxlIGVmZmVjdGl2ZUluZmVjdGlvdXMgPSBnZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cyhkaXNlYXNlTGFiZWwuZ2V0Tm9kZSgpLCBkaXNlYXNlTGFiZWwsIGN1cnJlbnRTSVIuZ2V0SSgpKTsKKworCQkvKgorCQkgKiBDb21wdXRlIHN0YXRlIHRyYW5zaXRpb25zCisJCSAqIAorCQkgKiBSZWdhcmRpbmcgY29tcHV0aW5nIHRoZSBudW1iZXIgb2YgdHJhbnNpdGlvbnMgZnJvbSBTdXNjZXB0aWJsZSB0byBFeHBvc2VkOgorCQkgKiBJbiBhIGxpbmVhciBtb2RlbCB0aGUgImVmZmVjdGl2ZSIgbnVtYmVyIG9mIGluZmVjdGlvdXMgcGVvcGxlIGlzIGp1c3QKKwkJICogdGhlIG51bWJlciBvZiBpbmZlY3Rpb3VzIHBlb3BsZSBJbiBhIG5vbmxpbmVhciBtb2RlbCB3ZSBoYXZlIGEKKwkJICogbm9uTGluZWFyaXR5IGV4cG9uZW50IHRoYXQgaXMgPiAxIHRoaXMgbW9kZWxzIHRoZSBlZmZlY3Qgb2YgaW1tdW5lCisJCSAqIHN5c3RlbSBzYXR1cmF0aW9uIHdoZW4gU3VzY2VwdGlibGUgcGVvcGxlIGFyZSBleHBvc2VkIHRvIGxhcmdlCisJCSAqIG51bWJlcnMgb2YgaW5mZWN0aW91cyBwZW9wbGUuIHRoZW4gdGhlICJlZmZlY3RpdmUiIG51bWJlciBvZgorCQkgKiBpbmZlY3Rpb3VzIHBlb3BsZSBpcyBJXm5vbkxpbmVhcml0eSBleHBvbmVudCB0byBhbGxvdyBmb3IgZWl0aGVyCisJCSAqIGxpbmVhciBvciBub25saW5lYXIgbW9kZWxzIHdlIGFsd2F5cyBjYWxjdWxhdGUgSV5ub25MaW5lYXJpdHkKKwkJICogZXhwb25lbnQgYW5kIGFsbG93IG5vbkxpbmVhcml0eSBleHBvbmVudCA+PSAxLjAKKwkJICovCisJCWRvdWJsZSBudW1iZXJPZkluZmVjdGVkVG9SZWNvdmVyZWQgPSBnZXRBZGp1c3RlZFJlY292ZXJ5UmF0ZSh0aW1lRGVsdGEpCisJCSogY3VycmVudFNJUi5nZXRJKCk7CisJCWRvdWJsZSBudW1iZXJPZlJlY292ZXJlZFRvU3VzY2VwdGlibGUgPSBnZXRBZGp1c3RlZEltbXVuaXR5TG9zc1JhdGUodGltZURlbHRhKQorCQkqIGN1cnJlbnRTSVIuZ2V0UigpOworCQkvLyBOZWVkIHRvIGNoZWNrZWQgd2hhdCBkbyBkbyBoZXJlLiBJZiBub24gbGluZWFyIGNvZWZmaWNpZW50IGlzIG5vdCAxIGFuZAorCQkvLyB0aGUgZWZmZWN0aXZlIGluZmVjdGlvdXMgaXMgbmVnYXRpdmUgKHdoaWNoIGlzIHBvc3NpYmxlKSwgd2hhdCBkbyBkbz8gCisJCS8vIExldCdzIGZhbGwgYmFjayBvbiB0aGUgbGluZWFyIG1ldGhvZCBmb3Igbm93LgorCQlkb3VibGUgbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgPSAwLjA7CisJCWlmKGdldE5vbkxpbmVhcml0eUNvZWZmaWNpZW50KCkgIT0gMS4wICYmIGVmZmVjdGl2ZUluZmVjdGlvdXMgPj0gMC4wKQorCQkJbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgPSB0cmFuc21pc3Npb25SYXRlCisJCQkqIGN1cnJlbnRTSVIuZ2V0UygpKiBNYXRoLnBvdyhlZmZlY3RpdmVJbmZlY3Rpb3VzLCBnZXROb25MaW5lYXJpdHlDb2VmZmljaWVudCgpKTsKKwkJZWxzZQorCQkJbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgPSB0cmFuc21pc3Npb25SYXRlCisJCQkqIGN1cnJlbnRTSVIuZ2V0UygpKiBlZmZlY3RpdmVJbmZlY3Rpb3VzOworCQkKKwkJCisJCS8vIERldGVybWluZSBkZWx0YSBTCisJCWZpbmFsIGRvdWJsZSBkZWx0YVMgPSBudW1iZXJPZlJlY292ZXJlZFRvU3VzY2VwdGlibGUgLSBudW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZDsKKwkJCS8vIERldGVybWluZSBkZWx0YSBJCisJCWZpbmFsIGRvdWJsZSBkZWx0YUkgPSBudW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZC0gbnVtYmVyT2ZJbmZlY3RlZFRvUmVjb3ZlcmVkOworCQkvLyBEZXRlcm1pbmUgZGVsdGEgUgorCQlmaW5hbCBkb3VibGUgZGVsdGFSID0gbnVtYmVyT2ZJbmZlY3RlZFRvUmVjb3ZlcmVkIC0gbnVtYmVyT2ZSZWNvdmVyZWRUb1N1c2NlcHRpYmxlOworCQkKKwkJU0lSTGFiZWxWYWx1ZUltcGwgcmV0ID0gKFNJUkxhYmVsVmFsdWVJbXBsKXJldHVyblZhbHVlOworCQlyZXQuc2V0UyhkZWx0YVMpOworCQlyZXQuc2V0SShkZWx0YUkpOworCQlyZXQuc2V0SW5jaWRlbmNlKG51bWJlck9mSW5mZWN0ZWRUb1JlY292ZXJlZCk7CisJCXJldC5zZXRSKGRlbHRhUik7CisJCXJldC5zZXREaXNlYXNlRGVhdGhzKDApOworCQlyZXR1cm4gcmV0OworCX0gLy8gY29tcHV0ZVRyYW5zaXRpb25zCisKKwkKKwkKKwkvKioKKwkgKiBNb2RlbFNwZWNpZmljQWRqdXN0bWVudHMgZm9yIGEgU3RvY2hhc3RpYyBtb2RlbCBhZGRzIG5vaXNlIHRvIG9yIGFkanVzdHMgCisJICogdGhlIGRpc2Vhc2Ugc3RhdGUgdHJhbnNpdGlvbiB2YWx1ZXMgYnkgbXVsdGlwbHlpbmcKKwkgKiB0aGUgYWRkaXRpb25zIGJ5IGEgcmFuZG9tIHZhcmlhYmxlIHIgfiAoMSsvLXgpIHdpdGggeCBzbWFsbC4KKwkgKiBUaGUgcmVxdWlyZW1lbnRzIHRoYXQgbm8gbW9yZSBpbmRpdmlkdWFscyBjYW4gYmUgbW92ZWQgZnJvbSBhIHN0YXRlIHRoYW4gYXJlCisJICogYWxyZWFkeSBpbiB0aGF0IHN0YXRlIGlzIHN0aWxsIGVuZm9yY2VkLgorCSAqIAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKAorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHN0YXRlKSB7CisJCQlmaW5hbCBTSUxhYmVsVmFsdWUgY3VycmVudFNJID0gKFNJTGFiZWxWYWx1ZSkgc3RhdGU7CisJCQlkb3VibGUgb2xkSSA9IGN1cnJlbnRTSS5nZXRJKCk7CisJCQlkb3VibGUgSW5vaXN5ID0gY3VycmVudFNJLmdldEkoKSogY29tcHV0ZU5vaXNlKCk7CisJCQlkb3VibGUgY2hhbmdlID0gb2xkSS1Jbm9pc3k7CisJCQljdXJyZW50U0kuc2V0SShJbm9pc3kpOworCQkJZG91YmxlIG5ld1MgPSBjdXJyZW50U0kuZ2V0UygpICsgY2hhbmdlOworCQkJaWYobmV3UyA8IDAuMCkgeworCQkJCS8vIE5lZWQgdG8gcmVzY2FsZQorCQkJCWRvdWJsZSBzY2FsZSA9IChjdXJyZW50U0kuZ2V0UygpICsgbmV3UykgLyBjdXJyZW50U0kuZ2V0UygpOworCQkJCWN1cnJlbnRTSS5zZXRJKElub2lzeSpzY2FsZSk7CisJCQl9IGVsc2UgIGN1cnJlbnRTSS5zZXRTKG5ld1MpOworCQkJcmV0dXJuOworCX0gLy8gZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEZvcmNpbmdQYWNrYWdlLkxpdGVyYWxzLkZPUkNJTkdfRElTRUFTRV9NT0RFTDsKKwl9CisKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKSB7CisJCXJldHVybiBzZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudDsKKwl9CisKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KGRvdWJsZSBuZXdTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCkgeworCQlkb3VibGUgb2xkU2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQgPSBzZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudDsKKwkJc2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQgPSBuZXdTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRm9yY2luZ1BhY2thZ2UuRk9SQ0lOR19ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0VYUE9ORU5ULCBvbGRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCwgc2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQpKTsKKwl9CisKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0TW9kdWxhdGlvblBlcmlvZCgpIHsKKwkJcmV0dXJuIG1vZHVsYXRpb25QZXJpb2Q7CisJfQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNb2R1bGF0aW9uUGVyaW9kKGRvdWJsZSBuZXdNb2R1bGF0aW9uUGVyaW9kKSB7CisJCWRvdWJsZSBvbGRNb2R1bGF0aW9uUGVyaW9kID0gbW9kdWxhdGlvblBlcmlvZDsKKwkJbW9kdWxhdGlvblBlcmlvZCA9IG5ld01vZHVsYXRpb25QZXJpb2Q7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEZvcmNpbmdQYWNrYWdlLkZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0QsIG9sZE1vZHVsYXRpb25QZXJpb2QsIG1vZHVsYXRpb25QZXJpb2QpKTsKKwl9CisKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoKSB7CisJCXJldHVybiBtb2R1bGF0aW9uUGhhc2VTaGlmdDsKKwl9CisKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1vZHVsYXRpb25QaGFzZVNoaWZ0KGRvdWJsZSBuZXdNb2R1bGF0aW9uUGhhc2VTaGlmdCkgeworCQlkb3VibGUgb2xkTW9kdWxhdGlvblBoYXNlU2hpZnQgPSBtb2R1bGF0aW9uUGhhc2VTaGlmdDsKKwkJbW9kdWxhdGlvblBoYXNlU2hpZnQgPSBuZXdNb2R1bGF0aW9uUGhhc2VTaGlmdDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRm9yY2luZ1BhY2thZ2UuRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZULCBvbGRNb2R1bGF0aW9uUGhhc2VTaGlmdCwgbW9kdWxhdGlvblBoYXNlU2hpZnQpKTsKKwl9CisKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKSB7CisJCXJldHVybiBzZWFzb25hbE1vZHVsYXRpb25GbG9vcjsKKwl9CisKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKGRvdWJsZSBuZXdTZWFzb25hbE1vZHVsYXRpb25GbG9vcikgeworCQlkb3VibGUgb2xkU2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IgPSBzZWFzb25hbE1vZHVsYXRpb25GbG9vcjsKKwkJc2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IgPSBuZXdTZWFzb25hbE1vZHVsYXRpb25GbG9vcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRm9yY2luZ1BhY2thZ2UuRk9SQ0lOR19ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0ZMT09SLCBvbGRTZWFzb25hbE1vZHVsYXRpb25GbG9vciwgc2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IpKTsKKwl9CisKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuRk9SQ0lOR19ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0VYUE9ORU5UOgorCQkJCXJldHVybiBnZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCgpOworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EOgorCQkJCXJldHVybiBnZXRNb2R1bGF0aW9uUGVyaW9kKCk7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVDoKKwkJCQlyZXR1cm4gZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoKTsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuRk9SQ0lOR19ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0ZMT09SOgorCQkJCXJldHVybiBnZXRTZWFzb25hbE1vZHVsYXRpb25GbG9vcigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuRk9SQ0lOR19ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0VYUE9ORU5UOgorCQkJCXNldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BFUklPRDoKKwkJCQlzZXRNb2R1bGF0aW9uUGVyaW9kKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZUOgorCQkJCXNldE1vZHVsYXRpb25QaGFzZVNoaWZ0KChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuRk9SQ0lOR19ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0ZMT09SOgorCQkJCXNldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuRk9SQ0lOR19ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0VYUE9ORU5UOgorCQkJCXNldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KFNFQVNPTkFMX01PRFVMQVRJT05fRVhQT05FTlRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BFUklPRDoKKwkJCQlzZXRNb2R1bGF0aW9uUGVyaW9kKE1PRFVMQVRJT05fUEVSSU9EX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVDoKKwkJCQlzZXRNb2R1bGF0aW9uUGhhc2VTaGlmdChNT0RVTEFUSU9OX1BIQVNFX1NISUZUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkZPUkNJTkdfRElTRUFTRV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUjoKKwkJCQlzZXRTZWFzb25hbE1vZHVsYXRpb25GbG9vcihTRUFTT05BTF9NT0RVTEFUSU9OX0ZMT09SX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NFQVNPTkFMX01PRFVMQVRJT05fRVhQT05FTlQ6CisJCQkJcmV0dXJuIHNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50ICE9IFNFQVNPTkFMX01PRFVMQVRJT05fRVhQT05FTlRfRURFRkFVTFQ7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0Q6CisJCQkJcmV0dXJuIG1vZHVsYXRpb25QZXJpb2QgIT0gTU9EVUxBVElPTl9QRVJJT0RfRURFRkFVTFQ7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVDoKKwkJCQlyZXR1cm4gbW9kdWxhdGlvblBoYXNlU2hpZnQgIT0gTU9EVUxBVElPTl9QSEFTRV9TSElGVF9FREVGQVVMVDsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuRk9SQ0lOR19ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0ZMT09SOgorCQkJCXJldHVybiBzZWFzb25hbE1vZHVsYXRpb25GbG9vciAhPSBTRUFTT05BTF9NT0RVTEFUSU9OX0ZMT09SX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChzZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChzZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbW9kdWxhdGlvblBlcmlvZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChtb2R1bGF0aW9uUGVyaW9kKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtb2R1bGF0aW9uUGhhc2VTaGlmdDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChtb2R1bGF0aW9uUGhhc2VTaGlmdCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgc2Vhc29uYWxNb2R1bGF0aW9uRmxvb3I6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoc2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Gb3JjaW5nRGlzZWFzZU1vZGVsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL2ltcGwvRm9yY2luZ0ZhY3RvcnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvaW1wbC9Gb3JjaW5nRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDM2YzIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL2ltcGwvRm9yY2luZ0ZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy4qOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEZvcmNpbmdGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEZvcmNpbmdGYWN0b3J5IHsKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBGb3JjaW5nRmFjdG9yeSBpbml0KCkgeworCQl0cnkgeworCQkJRm9yY2luZ0ZhY3RvcnkgdGhlRm9yY2luZ0ZhY3RvcnkgPSAoRm9yY2luZ0ZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcuZWNvcmUiKTsgLy8kTk9OLU5MUy0xJCAKKwkJCWlmICh0aGVGb3JjaW5nRmFjdG9yeSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoZUZvcmNpbmdGYWN0b3J5OworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IEZvcmNpbmdGYWN0b3J5SW1wbCgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEZvcmNpbmdGYWN0b3J5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgeworCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5GT1JDSU5HX0RJU0VBU0VfTU9ERUw6IHJldHVybiBjcmVhdGVGb3JjaW5nRGlzZWFzZU1vZGVsKCk7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTDogcmV0dXJuIGNyZWF0ZUdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpOworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMOiByZXR1cm4gY3JlYXRlR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpOworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMOiByZXR1cm4gY3JlYXRlR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBGb3JjaW5nRGlzZWFzZU1vZGVsIGNyZWF0ZUZvcmNpbmdEaXNlYXNlTW9kZWwoKSB7CisJCUZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsIGZvcmNpbmdEaXNlYXNlTW9kZWwgPSBuZXcgRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwoKTsKKwkJcmV0dXJuIGZvcmNpbmdEaXNlYXNlTW9kZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCBjcmVhdGVHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwoKSB7CisJCUdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwgZ2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsID0gbmV3IEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwoKTsKKwkJcmV0dXJuIGdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCBjcmVhdGVHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsKCkgeworCQlHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsSW1wbCBnYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsID0gbmV3IEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsKCk7CisJCXJldHVybiBnYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsIGNyZWF0ZUdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwoKSB7CisJCUdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsIGdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwgPSBuZXcgR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwoKTsKKwkJcmV0dXJuIGdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEZvcmNpbmdQYWNrYWdlIGdldEZvcmNpbmdQYWNrYWdlKCkgeworCQlyZXR1cm4gKEZvcmNpbmdQYWNrYWdlKWdldEVQYWNrYWdlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZGVwcmVjYXRlZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlARGVwcmVjYXRlZAorCXB1YmxpYyBzdGF0aWMgRm9yY2luZ1BhY2thZ2UgZ2V0UGFja2FnZSgpIHsKKwkJcmV0dXJuIEZvcmNpbmdQYWNrYWdlLmVJTlNUQU5DRTsKKwl9CisKK30gLy9FeGFtcGxlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9pbXBsL0ZvcmNpbmdQYWNrYWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL2ltcGwvRm9yY2luZ1BhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxYTQ2MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9pbXBsL0ZvcmNpbmdQYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNDc5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ1BhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRm9yY2luZ1BhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgRm9yY2luZ1BhY2thZ2UgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZ2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcyA9IG51bGw7CisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCisJICogcGFja2FnZSBVUkkgdmFsdWUuCisJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYworCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCisJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKKwkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ1BhY2thZ2UjZU5TX1VSSQorCSAqIEBzZWUgI2luaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEZvcmNpbmdQYWNrYWdlSW1wbCgpIHsKKwkJc3VwZXIoZU5TX1VSSSwgRm9yY2luZ0ZhY3RvcnkuZUlOU1RBTkNFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCisJICogCisJICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBGb3JjaW5nUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KKwkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZU5TX1VSSQorCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCisJICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgRm9yY2luZ1BhY2thZ2UgaW5pdCgpIHsKKwkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEZvcmNpbmdQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEZvcmNpbmdQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKwkJRm9yY2luZ1BhY2thZ2VJbXBsIHRoZUZvcmNpbmdQYWNrYWdlID0gKEZvcmNpbmdQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRm9yY2luZ1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IEZvcmNpbmdQYWNrYWdlSW1wbCgpKTsKKworCQlpc0luaXRlZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCisJCVN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisKKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKKwkJdGhlRm9yY2luZ1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQorCQl0aGVGb3JjaW5nUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAorCQl0aGVGb3JjaW5nUGFja2FnZS5mcmVlemUoKTsKKworICAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChGb3JjaW5nUGFja2FnZS5lTlNfVVJJLCB0aGVGb3JjaW5nUGFja2FnZSk7CisJCXJldHVybiB0aGVGb3JjaW5nUGFja2FnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEZvcmNpbmdEaXNlYXNlTW9kZWwoKSB7CisJCXJldHVybiBmb3JjaW5nRGlzZWFzZU1vZGVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEZvcmNpbmdEaXNlYXNlTW9kZWxfU2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlmb3JjaW5nRGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Rm9yY2luZ0Rpc2Vhc2VNb2RlbF9Nb2R1bGF0aW9uUGVyaW9kKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEZvcmNpbmdEaXNlYXNlTW9kZWxfTW9kdWxhdGlvblBoYXNlU2hpZnQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlmb3JjaW5nRGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Rm9yY2luZ0Rpc2Vhc2VNb2RlbF9TZWFzb25hbE1vZHVsYXRpb25GbG9vcigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpIHsKKwkJcmV0dXJuIGdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxfU2lnbWEyKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZ2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0R2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsX01vZHVsYXRpb25QZXJpb2QoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlnYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxfTW9kdWxhdGlvblBoYXNlU2hpZnQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlnYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxfTW9kdWxhdGlvbkZsb29yKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZ2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsKCkgeworCQlyZXR1cm4gZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsX1NpZ21hMl8yKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfU2lnbWEyKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfTW9kdWxhdGlvblBlcmlvZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsX01vZHVsYXRpb25QaGFzZVNoaWZ0KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfTW9kdWxhdGlvbkZsb29yKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfQXR0MSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsX0F0dDIoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlnYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9BdHQzKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfQXR0NCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwoKSB7CisJCXJldHVybiBnYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxfU2lnbWEyXzMoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlnYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0R2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbF9UcmFuc21pc3Npb25SYXRlMigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsX1RyYW5zbWlzc2lvblJhdGUzKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZ2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxfTW9kdWxhdGlvbkZsb29yXzIoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlnYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEZvcmNpbmdGYWN0b3J5IGdldEZvcmNpbmdGYWN0b3J5KCkgeworCQlyZXR1cm4gKEZvcmNpbmdGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKKwkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47CisJCWlzQ3JlYXRlZCA9IHRydWU7CisKKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCisJCWZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRk9SQ0lOR19ESVNFQVNFX01PREVMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShmb3JjaW5nRGlzZWFzZU1vZGVsRUNsYXNzLCBGT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NFQVNPTkFMX01PRFVMQVRJT05fRVhQT05FTlQpOworCQljcmVhdGVFQXR0cmlidXRlKGZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MsIEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0QpOworCQljcmVhdGVFQXR0cmlidXRlKGZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MsIEZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcywgRk9SQ0lOR19ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0ZMT09SKTsKKworCQlnYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShnYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MsIEdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fU0lHTUEyKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShnYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MsIEdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0QpOworCQljcmVhdGVFQXR0cmlidXRlKGdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcywgR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZUKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShnYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MsIEdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9GTE9PUik7CisKKwkJZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShnYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsRUNsYXNzLCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTJfMik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcywgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fU0lHTUEyKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShnYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsRUNsYXNzLCBHQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BFUklPRCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcywgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcywgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9GTE9PUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcywgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUMSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcywgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUMik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcywgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUMyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcywgR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUNCk7CisKKwkJZ2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShnYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsRUNsYXNzLCBHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTJfMyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZ2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcywgR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEUyKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShnYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsRUNsYXNzLCBHQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURTMpOworCQljcmVhdGVFQXR0cmlidXRlKGdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MsIEdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fRkxPT1JfMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOworCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKKwkJc2V0TmFtZShlTkFNRSk7CisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOworCQlzZXROc1VSSShlTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCisJCVN0YW5kYXJkUGFja2FnZSB0aGVTdGFuZGFyZFBhY2thZ2UgPSAoU3RhbmRhcmRQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFN0YW5kYXJkUGFja2FnZS5lTlNfVVJJKTsKKwkJRWNvcmVQYWNrYWdlIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCWZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlU3RhbmRhcmRQYWNrYWdlLmdldFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwoKSk7CisJCWdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVTdGFuZGFyZFBhY2thZ2UuZ2V0U3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCgpKTsKKwkJZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVTdGFuZGFyZFBhY2thZ2UuZ2V0U3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCgpKTsKKwkJZ2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwoKSk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKwkJaW5pdEVDbGFzcyhmb3JjaW5nRGlzZWFzZU1vZGVsRUNsYXNzLCBGb3JjaW5nRGlzZWFzZU1vZGVsLmNsYXNzLCAiRm9yY2luZ0Rpc2Vhc2VNb2RlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRGb3JjaW5nRGlzZWFzZU1vZGVsX1NlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJzZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCIsICIyLjAiLCAwLCAxLCBGb3JjaW5nRGlzZWFzZU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Rm9yY2luZ0Rpc2Vhc2VNb2RlbF9Nb2R1bGF0aW9uUGVyaW9kKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJtb2R1bGF0aW9uUGVyaW9kIiwgIjM2NS4yNTYzNjMwNTEiLCAwLCAxLCBGb3JjaW5nRGlzZWFzZU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Rm9yY2luZ0Rpc2Vhc2VNb2RlbF9Nb2R1bGF0aW9uUGhhc2VTaGlmdCgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAibW9kdWxhdGlvblBoYXNlU2hpZnQiLCAiMC4wIiwgMCwgMSwgRm9yY2luZ0Rpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldEZvcmNpbmdEaXNlYXNlTW9kZWxfU2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInNlYXNvbmFsTW9kdWxhdGlvbkZsb29yIiwgIjAuNiIsIDAsIDEsIEZvcmNpbmdEaXNlYXNlTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCWluaXRFQ2xhc3MoZ2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsRUNsYXNzLCBHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwuY2xhc3MsICJHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0R2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsX1NpZ21hMigpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAic2lnbWEyIiwgIjEwMCIsIDAsIDEsIEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbF9Nb2R1bGF0aW9uUGVyaW9kKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJtb2R1bGF0aW9uUGVyaW9kIiwgIjM2NS4yNSIsIDAsIDEsIEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbF9Nb2R1bGF0aW9uUGhhc2VTaGlmdCgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAibW9kdWxhdGlvblBoYXNlU2hpZnQiLCAiMCIsIDAsIDEsIEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbF9Nb2R1bGF0aW9uRmxvb3IoKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgIm1vZHVsYXRpb25GbG9vciIsICIwLjYiLCAwLCAxLCBHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCWluaXRFQ2xhc3MoZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEVDbGFzcywgR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbC5jbGFzcywgIkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9TaWdtYTJfMigpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAic2lnbWEyXzIiLCBudWxsLCAwLCAxLCBHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfU2lnbWEyKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJzaWdtYTIiLCBudWxsLCAwLCAxLCBHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfTW9kdWxhdGlvblBlcmlvZCgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAibW9kdWxhdGlvblBlcmlvZCIsIG51bGwsIDAsIDEsIEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9Nb2R1bGF0aW9uUGhhc2VTaGlmdCgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAibW9kdWxhdGlvblBoYXNlU2hpZnQiLCBudWxsLCAwLCAxLCBHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfTW9kdWxhdGlvbkZsb29yKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJtb2R1bGF0aW9uRmxvb3IiLCBudWxsLCAwLCAxLCBHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfQXR0MSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiYXR0MSIsIG51bGwsIDAsIDEsIEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0R2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9BdHQyKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJhdHQyIiwgbnVsbCwgMCwgMSwgR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsX0F0dDMoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImF0dDMiLCBudWxsLCAwLCAxLCBHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfQXR0NCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiYXR0NCIsIG51bGwsIDAsIDEsIEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxFQ2xhc3MsIEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwuY2xhc3MsICJHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxfU2lnbWEyXzMoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInNpZ21hMl8zIiwgbnVsbCwgMCwgMSwgR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsX1RyYW5zbWlzc2lvblJhdGUyKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJ0cmFuc21pc3Npb25SYXRlMiIsIG51bGwsIDAsIDEsIEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0R2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbF9UcmFuc21pc3Npb25SYXRlMygpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAidHJhbnNtaXNzaW9uUmF0ZTMiLCBudWxsLCAwLCAxLCBHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxfTW9kdWxhdGlvbkZsb29yXzIoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgIm1vZHVsYXRpb25GbG9vcl8yIiwgbnVsbCwgMCwgMSwgR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIENyZWF0ZSByZXNvdXJjZQorCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKwl9CisKK30gLy9FeGFtcGxlUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9pbXBsL0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvaW1wbC9HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NzIwMDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvaW1wbC9HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsNzU5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGw7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJUkxhYmVsVmFsdWVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxJbXBsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R2F1c3NpYW4yIEZvcmNpbmcgRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsSW1wbCNnZXRTaWdtYTJfMiA8ZW0+U2lnbWEyIDI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwjZ2V0U2lnbWEyIDxlbT5TaWdtYTI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwjZ2V0TW9kdWxhdGlvblBlcmlvZCA8ZW0+TW9kdWxhdGlvbiBQZXJpb2Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwjZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQgPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwjZ2V0TW9kdWxhdGlvbkZsb29yIDxlbT5Nb2R1bGF0aW9uIEZsb29yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5pbXBsLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsI2dldEF0dDEgPGVtPkF0dDE8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwjZ2V0QXR0MiA8ZW0+QXR0MjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsSW1wbCNnZXRBdHQzIDxlbT5BdHQzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5pbXBsLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsI2dldEF0dDQgPGVtPkF0dDQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsSW1wbCBleHRlbmRzIFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxJbXBsIGltcGxlbWVudHMgR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNpZ21hMl8yKCkgPGVtPlNpZ21hMiAyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTaWdtYTJfMigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgU0lHTUEyXzJfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaWdtYTJfMigpIDxlbT5TaWdtYTIgMjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2lnbWEyXzIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgc2lnbWEyXzIgPSBTSUdNQTJfMl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaWdtYTIoKSA8ZW0+U2lnbWEyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTaWdtYTIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFNJR01BMl9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNpZ21hMigpIDxlbT5TaWdtYTI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNpZ21hMigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBzaWdtYTIgPSBTSUdNQTJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TW9kdWxhdGlvblBlcmlvZCgpIDxlbT5Nb2R1bGF0aW9uIFBlcmlvZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TW9kdWxhdGlvblBlcmlvZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgTU9EVUxBVElPTl9QRVJJT0RfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNb2R1bGF0aW9uUGVyaW9kKCkgPGVtPk1vZHVsYXRpb24gUGVyaW9kPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNb2R1bGF0aW9uUGVyaW9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIG1vZHVsYXRpb25QZXJpb2QgPSBNT0RVTEFUSU9OX1BFUklPRF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCgpIDxlbT5Nb2R1bGF0aW9uIFBoYXNlIFNoaWZ0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgTU9EVUxBVElPTl9QSEFTRV9TSElGVF9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkgPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIG1vZHVsYXRpb25QaGFzZVNoaWZ0ID0gTU9EVUxBVElPTl9QSEFTRV9TSElGVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNb2R1bGF0aW9uRmxvb3IoKSA8ZW0+TW9kdWxhdGlvbiBGbG9vcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TW9kdWxhdGlvbkZsb29yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBNT0RVTEFUSU9OX0ZMT09SX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TW9kdWxhdGlvbkZsb29yKCkgPGVtPk1vZHVsYXRpb24gRmxvb3I8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25GbG9vcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBtb2R1bGF0aW9uRmxvb3IgPSBNT0RVTEFUSU9OX0ZMT09SX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dDEoKSA8ZW0+QXR0MTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QXR0MSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgQVRUMV9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dDEoKSA8ZW0+QXR0MTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QXR0MSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBhdHQxID0gQVRUMV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHQyKCkgPGVtPkF0dDI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEF0dDIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIEFUVDJfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHQyKCkgPGVtPkF0dDI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEF0dDIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgYXR0MiA9IEFUVDJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0MygpIDxlbT5BdHQzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBdHQzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBBVFQzX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0MygpIDxlbT5BdHQzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBdHQzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIGF0dDMgPSBBVFQzX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dDQoKSA8ZW0+QXR0NDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QXR0NCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgQVRUNF9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dDQoKSA8ZW0+QXR0NDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QXR0NCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBhdHQ0ID0gQVRUNF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBGb3JjaW5nUGFja2FnZS5MaXRlcmFscy5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0U2lnbWEyXzIoKSB7CisJCXJldHVybiBzaWdtYTJfMjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTaWdtYTJfMihkb3VibGUgbmV3U2lnbWEyXzIpIHsKKwkJZG91YmxlIG9sZFNpZ21hMl8yID0gc2lnbWEyXzI7CisJCXNpZ21hMl8yID0gbmV3U2lnbWEyXzI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NJR01BMl8yLCBvbGRTaWdtYTJfMiwgc2lnbWEyXzIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFNpZ21hMigpIHsKKwkJcmV0dXJuIHNpZ21hMjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTaWdtYTIoZG91YmxlIG5ld1NpZ21hMikgeworCQlkb3VibGUgb2xkU2lnbWEyID0gc2lnbWEyOworCQlzaWdtYTIgPSBuZXdTaWdtYTI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NJR01BMiwgb2xkU2lnbWEyLCBzaWdtYTIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE1vZHVsYXRpb25QZXJpb2QoKSB7CisJCXJldHVybiBtb2R1bGF0aW9uUGVyaW9kOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1vZHVsYXRpb25QZXJpb2QoZG91YmxlIG5ld01vZHVsYXRpb25QZXJpb2QpIHsKKwkJZG91YmxlIG9sZE1vZHVsYXRpb25QZXJpb2QgPSBtb2R1bGF0aW9uUGVyaW9kOworCQltb2R1bGF0aW9uUGVyaW9kID0gbmV3TW9kdWxhdGlvblBlcmlvZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0QsIG9sZE1vZHVsYXRpb25QZXJpb2QsIG1vZHVsYXRpb25QZXJpb2QpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkgeworCQlyZXR1cm4gbW9kdWxhdGlvblBoYXNlU2hpZnQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoZG91YmxlIG5ld01vZHVsYXRpb25QaGFzZVNoaWZ0KSB7CisJCWRvdWJsZSBvbGRNb2R1bGF0aW9uUGhhc2VTaGlmdCA9IG1vZHVsYXRpb25QaGFzZVNoaWZ0OworCQltb2R1bGF0aW9uUGhhc2VTaGlmdCA9IG5ld01vZHVsYXRpb25QaGFzZVNoaWZ0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZULCBvbGRNb2R1bGF0aW9uUGhhc2VTaGlmdCwgbW9kdWxhdGlvblBoYXNlU2hpZnQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE1vZHVsYXRpb25GbG9vcigpIHsKKwkJcmV0dXJuIG1vZHVsYXRpb25GbG9vcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNb2R1bGF0aW9uRmxvb3IoZG91YmxlIG5ld01vZHVsYXRpb25GbG9vcikgeworCQlkb3VibGUgb2xkTW9kdWxhdGlvbkZsb29yID0gbW9kdWxhdGlvbkZsb29yOworCQltb2R1bGF0aW9uRmxvb3IgPSBuZXdNb2R1bGF0aW9uRmxvb3I7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fRkxPT1IsIG9sZE1vZHVsYXRpb25GbG9vciwgbW9kdWxhdGlvbkZsb29yKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRBdHQxKCkgeworCQlyZXR1cm4gYXR0MTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBdHQxKGRvdWJsZSBuZXdBdHQxKSB7CisJCWRvdWJsZSBvbGRBdHQxID0gYXR0MTsKKwkJYXR0MSA9IG5ld0F0dDE7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0FUVDEsIG9sZEF0dDEsIGF0dDEpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldEF0dDIoKSB7CisJCXJldHVybiBhdHQyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEF0dDIoZG91YmxlIG5ld0F0dDIpIHsKKwkJZG91YmxlIG9sZEF0dDIgPSBhdHQyOworCQlhdHQyID0gbmV3QXR0MjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUMiwgb2xkQXR0MiwgYXR0MikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0QXR0MygpIHsKKwkJcmV0dXJuIGF0dDM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QXR0Myhkb3VibGUgbmV3QXR0MykgeworCQlkb3VibGUgb2xkQXR0MyA9IGF0dDM7CisJCWF0dDMgPSBuZXdBdHQzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19BVFQzLCBvbGRBdHQzLCBhdHQzKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRBdHQ0KCkgeworCQlyZXR1cm4gYXR0NDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBdHQ0KGRvdWJsZSBuZXdBdHQ0KSB7CisJCWRvdWJsZSBvbGRBdHQ0ID0gYXR0NDsKKwkJYXR0NCA9IG5ld0F0dDQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0FUVDQsIG9sZEF0dDQsIGF0dDQpKTsKKwl9CisKKwlwcml2YXRlIExvbmcgZmlyc3RUaW1lID0gbmV3IExvbmcoTG9uZy5NQVhfVkFMVUUpOworCXByaXZhdGUgQ2FsZW5kYXIgY2FsZW5kYXIgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworCXByaXZhdGUgQ2FsZW5kYXIgY2FsZW5kYXIyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgTUlMTElTX1BFUl9EQVkgPSAxMDAwLjAqNjAuMCo2MC4wKjI0LjA7CisKKwlwcml2YXRlIEFycmF5TGlzdDxMb25nPiB3cml0dGVkVGltZXMgPSBuZXcgQXJyYXlMaXN0PExvbmc+KCk7CisJcHJpdmF0ZSBGaWxlV3JpdGVyIGZ3OworCUBPdmVycmlkZQorCXB1YmxpYyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY29tcHV0ZURpc2Vhc2VEZWx0YXMoCisJCQlmaW5hbCBTVEVNVGltZSB0aW1lLAorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGN1cnJlbnRTdGF0ZSwKKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZUxhYmVsLCBmaW5hbCBsb25nIHRpbWVEZWx0YSwgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSByZXR1cm5WYWx1ZSkgeworZmluYWwgU0lSTGFiZWxWYWx1ZSBjdXJyZW50U0lSID0gKFNJUkxhYmVsVmFsdWUpIGN1cnJlbnRTdGF0ZTsKKwkJCisJCWxvbmcgY3VycmVudE1pbGxpcyA9IHRpbWUuZ2V0VGltZSgpLmdldFRpbWUoKTsKKwkJZG91YmxlIHNlYXNvbmFsTW9kdWxhdGlvbkZsb29yID0gZ2V0TW9kdWxhdGlvbkZsb29yKCk7CisJCWRvdWJsZSBtb2R1bGF0aW9uUGVyaW9kID0gZ2V0TW9kdWxhdGlvblBlcmlvZCgpOworCQlkb3VibGUgcGhhc2UgPSBnZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCgpOwkKKwkJZG91YmxlIHNpZ21hMiA9IGdldFNpZ21hMigpOworCQlkb3VibGUgc2lnbWEyXzIgPSBnZXRTaWdtYTJfMigpOworCQkKKwkJc3luY2hyb25pemVkKHRoaXMpIHsKKwkJCWlmKGZpcnN0VGltZS5sb25nVmFsdWUoKSA9PSBMb25nLk1BWF9WQUxVRSkKKwkJCQlmaXJzdFRpbWUgPSBMb25nLnZhbHVlT2YodGltZS5nZXRUaW1lKCkuZ2V0VGltZSgpKTsKKwkJfQorCQkKKwkJLy8gR2V0IHRoZSBkYXkgZnJvbSB0aW1lIGFuZCBhZGp1c3QgZm9yIHRoZSBwaGFzZQkKKwkJZG91YmxlIGRheT0wOworCQkvLyBTaGFyZWQgY2FsZW5kYXIgb2JqZWN0IG5vdCB0aHJlYWQgc2FmZQorCQlzeW5jaHJvbml6ZWQoY2FsZW5kYXIpIHsKKwkJCWNhbGVuZGFyLnNldFRpbWVJbk1pbGxpcyhjdXJyZW50TWlsbGlzKTsKKwkJCWNhbGVuZGFyMi5zZXRUaW1lSW5NaWxsaXMoZmlyc3RUaW1lLmxvbmdWYWx1ZSgpKTsKKwkJCWRheSA9IChjYWxlbmRhci5nZXRUaW1lSW5NaWxsaXMoKSAtIGNhbGVuZGFyMi5nZXRUaW1lSW5NaWxsaXMoKSkvTUlMTElTX1BFUl9EQVk7CisJCX0KKwkJCisJCQorCQlkb3VibGUgbXUxID0gcGhhc2U7CisJCWRvdWJsZSBtdTIgPSBwaGFzZSArIG1vZHVsYXRpb25QZXJpb2Q7CisJCQorCQlkb3VibGUgbW9kdWxhdGlvbjEgPSAoMS9NYXRoLnNxcnQoMipNYXRoLlBJKnNpZ21hMikpKk1hdGguZXhwKC0oTWF0aC5wb3coZGF5LW11MSwyKSkvKDIqc2lnbWEyKSk7CQkJCQkJCisJCWRvdWJsZSBtb2R1bGF0aW9uMiA9ICgxL01hdGguc3FydCgyKk1hdGguUEkqc2lnbWEyXzIpKSpNYXRoLmV4cCgtKE1hdGgucG93KGRheS1tdTIsMikpLygyKnNpZ21hMl8yKSk7CisJCQorCQkvLyBUaGlzIGlzIGJldGEqCisJCWRvdWJsZSB0cmFuc21pc3Npb25SYXRlID0gc2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IgKyAoZ2V0QWRqdXN0ZWRUcmFuc21pc3Npb25SYXRlKHRpbWVEZWx0YSkpICogKG1vZHVsYXRpb24xK21vZHVsYXRpb24yKTsKKworCQlpZihkYXkgPj0gMTE2ICYmIGRheSA8PSAxMTkpIC8vIEFwcmlsIDI0IC0gMjcKKwkJCXRyYW5zbWlzc2lvblJhdGUgPSB0cmFuc21pc3Npb25SYXRlICogdGhpcy5nZXRBdHQxKCk7CisJCWVsc2UgCWlmKGRheSA+PSAxMjAgJiYgZGF5IDw9IDEyNykgLy8gQXByaWwgMjggLSBNYXkgNQorCQkJdHJhbnNtaXNzaW9uUmF0ZSA9IHRyYW5zbWlzc2lvblJhdGUgKiB0aGlzLmdldEF0dDIoKTsKKwkJZWxzZSBpZihkYXkgPj0gMTI4ICYmIGRheSA8PSAxMzIpIC8vIE1heSA2IC0gTWF5IDEwCisJCQl0cmFuc21pc3Npb25SYXRlID0gdHJhbnNtaXNzaW9uUmF0ZSAqIHRoaXMuZ2V0QXR0MygpOworCQkKKwkJc3luY2hyb25pemVkKHdyaXR0ZWRUaW1lcykgeworCQkJaWYoIXdyaXR0ZWRUaW1lcy5jb250YWlucyh0aW1lLmdldFRpbWUoKS5nZXRUaW1lKCkpKSB7CisJCQkJdHJ5IHsKKwkJCQlpZihmdyA9PSBudWxsKSBmdyA9IG5ldyBGaWxlV3JpdGVyKCJiZXRhLmNzdiIpOworCQkJCWZ3LndyaXRlKHRpbWUuZ2V0VGltZSgpLmdldFRpbWUoKSsiLCIrdHJhbnNtaXNzaW9uUmF0ZSsiXG4iKTsKKwkJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJCXdyaXR0ZWRUaW1lcy5hZGQodGltZS5nZXRUaW1lKCkuZ2V0VGltZSgpKTsKKwkJCX0KKwkJfQorCQkKKwkJaWYoIXRoaXMuaXNGcmVxdWVuY3lEZXBlbmRlbnQoKSkgIHRyYW5zbWlzc2lvblJhdGUgKj0gZ2V0VHJhbnNtaXNzaW9uUmF0ZVNjYWxlRmFjdG9yKGRpc2Vhc2VMYWJlbCk7CisJCQorCQkvLyBUaGUgZWZmZWN0aXZlIEluZmVjdGlvdXMgcG9wdWxhdGlvbiAgaXMgYSBkaW1lbnNpb25sZXMgbnVtYmVyIG5vcm1hbGl6ZSBieSB0b3RhbAorCQkvLyBwb3B1bGF0aW9uIHVzZWQgaW4gdGVoIGNvbXB1dGF0aW9uIG9mIGJldHMqUyppIHdoZXJlIGkgPSBJZWZmZWN0aXZlL1BvcC4KKwkJLy8gVGhpcyBpbmNsdWRlcyBhIGNvcnJlY3Rpb24gdG8gdGhlIGN1cnJlbnQKKwkJLy8gaW5mZWN0aW91cyBwb3B1bGF0aW9uIChJZWZmZWN0aXZlKSBiYXNlZCBvbiB0aGUgY29uc2VydmVkIGV4Y2hhbmdlIG9mIHBlb3BsZSAoY2lyY3VsYXRpb24pCisJCS8vIGJldHdlZW4gcmVnaW9ucy4gTm90ZSB0aGF0IHRoaXMgaXMgbm8gdGhlICJhcnJpdmFscyIgYW5kICJkZXBhcnR1cmVzIiB3aGljaCBhcmUKKwkJLy8gYSBkaWZmZXJlbnQgcHJvY2Vzcy4KKwkJZmluYWwgZG91YmxlIGVmZmVjdGl2ZUluZmVjdGlvdXMgPSBnZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cyhkaXNlYXNlTGFiZWwuZ2V0Tm9kZSgpLCBkaXNlYXNlTGFiZWwsIGN1cnJlbnRTSVIuZ2V0SSgpKTsKKworCQkvKgorCQkgKiBDb21wdXRlIHN0YXRlIHRyYW5zaXRpb25zCisJCSAqIAorCQkgKiBSZWdhcmRpbmcgY29tcHV0aW5nIHRoZSBudW1iZXIgb2YgdHJhbnNpdGlvbnMgZnJvbSBTdXNjZXB0aWJsZSB0byBFeHBvc2VkOgorCQkgKiBJbiBhIGxpbmVhciBtb2RlbCB0aGUgImVmZmVjdGl2ZSIgbnVtYmVyIG9mIGluZmVjdGlvdXMgcGVvcGxlIGlzIGp1c3QKKwkJICogdGhlIG51bWJlciBvZiBpbmZlY3Rpb3VzIHBlb3BsZSBJbiBhIG5vbmxpbmVhciBtb2RlbCB3ZSBoYXZlIGEKKwkJICogbm9uTGluZWFyaXR5IGV4cG9uZW50IHRoYXQgaXMgPiAxIHRoaXMgbW9kZWxzIHRoZSBlZmZlY3Qgb2YgaW1tdW5lCisJCSAqIHN5c3RlbSBzYXR1cmF0aW9uIHdoZW4gU3VzY2VwdGlibGUgcGVvcGxlIGFyZSBleHBvc2VkIHRvIGxhcmdlCisJCSAqIG51bWJlcnMgb2YgaW5mZWN0aW91cyBwZW9wbGUuIHRoZW4gdGhlICJlZmZlY3RpdmUiIG51bWJlciBvZgorCQkgKiBpbmZlY3Rpb3VzIHBlb3BsZSBpcyBJXm5vbkxpbmVhcml0eSBleHBvbmVudCB0byBhbGxvdyBmb3IgZWl0aGVyCisJCSAqIGxpbmVhciBvciBub25saW5lYXIgbW9kZWxzIHdlIGFsd2F5cyBjYWxjdWxhdGUgSV5ub25MaW5lYXJpdHkKKwkJICogZXhwb25lbnQgYW5kIGFsbG93IG5vbkxpbmVhcml0eSBleHBvbmVudCA+PSAxLjAKKwkJICovCisJCWRvdWJsZSBudW1iZXJPZkluZmVjdGVkVG9SZWNvdmVyZWQgPSBnZXRBZGp1c3RlZFJlY292ZXJ5UmF0ZSh0aW1lRGVsdGEpCisJCSogY3VycmVudFNJUi5nZXRJKCk7CisJCWRvdWJsZSBudW1iZXJPZlJlY292ZXJlZFRvU3VzY2VwdGlibGUgPSBnZXRBZGp1c3RlZEltbXVuaXR5TG9zc1JhdGUodGltZURlbHRhKQorCQkqIGN1cnJlbnRTSVIuZ2V0UigpOworCQkvLyBOZWVkIHRvIGNoZWNrZWQgd2hhdCBkbyBkbyBoZXJlLiBJZiBub24gbGluZWFyIGNvZWZmaWNpZW50IGlzIG5vdCAxIGFuZAorCQkvLyB0aGUgZWZmZWN0aXZlIGluZmVjdGlvdXMgaXMgbmVnYXRpdmUgKHdoaWNoIGlzIHBvc3NpYmxlKSwgd2hhdCBkbyBkbz8gCisJCS8vIExldCdzIGZhbGwgYmFjayBvbiB0aGUgbGluZWFyIG1ldGhvZCBmb3Igbm93LgorCQlkb3VibGUgbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgPSAwLjA7CisJCWlmKGdldE5vbkxpbmVhcml0eUNvZWZmaWNpZW50KCkgIT0gMS4wICYmIGVmZmVjdGl2ZUluZmVjdGlvdXMgPj0gMC4wKQorCQkJbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgPSB0cmFuc21pc3Npb25SYXRlCisJCQkqIGN1cnJlbnRTSVIuZ2V0UygpKiBNYXRoLnBvdyhlZmZlY3RpdmVJbmZlY3Rpb3VzLCBnZXROb25MaW5lYXJpdHlDb2VmZmljaWVudCgpKTsKKwkJZWxzZQorCQkJbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgPSB0cmFuc21pc3Npb25SYXRlCisJCQkqIGN1cnJlbnRTSVIuZ2V0UygpKiBlZmZlY3RpdmVJbmZlY3Rpb3VzOworCQkKKwkJCisJCS8vIERldGVybWluZSBkZWx0YSBTCisJCWZpbmFsIGRvdWJsZSBkZWx0YVMgPSBudW1iZXJPZlJlY292ZXJlZFRvU3VzY2VwdGlibGUgLSBudW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZDsKKwkJCS8vIERldGVybWluZSBkZWx0YSBJCisJCWZpbmFsIGRvdWJsZSBkZWx0YUkgPSBudW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZC0gbnVtYmVyT2ZJbmZlY3RlZFRvUmVjb3ZlcmVkOworCQkvLyBEZXRlcm1pbmUgZGVsdGEgUgorCQlmaW5hbCBkb3VibGUgZGVsdGFSID0gbnVtYmVyT2ZJbmZlY3RlZFRvUmVjb3ZlcmVkIC0gbnVtYmVyT2ZSZWNvdmVyZWRUb1N1c2NlcHRpYmxlOworCQkKKwkJU0lSTGFiZWxWYWx1ZUltcGwgcmV0ID0gKFNJUkxhYmVsVmFsdWVJbXBsKXJldHVyblZhbHVlOworCQlyZXQuc2V0UyhkZWx0YVMpOworCQlyZXQuc2V0SShkZWx0YUkpOworCQlyZXQuc2V0SW5jaWRlbmNlKG51bWJlck9mSW5mZWN0ZWRUb1JlY292ZXJlZCk7CisJCXJldC5zZXRSKGRlbHRhUik7CisJCXJldC5zZXREaXNlYXNlRGVhdGhzKDApOworCQlyZXR1cm4gcmV0OworCX0gLy8gY29tcHV0ZVRyYW5zaXRpb25zCisJCisJLyoqCisJICogTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzIGZvciBhIFN0b2NoYXN0aWMgbW9kZWwgYWRkcyBub2lzZSB0byBvciBhZGp1c3RzIAorCSAqIHRoZSBkaXNlYXNlIHN0YXRlIHRyYW5zaXRpb24gdmFsdWVzIGJ5IG11bHRpcGx5aW5nCisJICogdGhlIGFkZGl0aW9ucyBieSBhIHJhbmRvbSB2YXJpYWJsZSByIH4gKDErLy14KSB3aXRoIHggc21hbGwuCisJICogVGhlIHJlcXVpcmVtZW50cyB0aGF0IG5vIG1vcmUgaW5kaXZpZHVhbHMgY2FuIGJlIG1vdmVkIGZyb20gYSBzdGF0ZSB0aGFuIGFyZQorCSAqIGFscmVhZHkgaW4gdGhhdCBzdGF0ZSBpcyBzdGlsbCBlbmZvcmNlZC4KKwkgKiAKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cygKKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBzdGF0ZSkgeworCQkJZmluYWwgU0lMYWJlbFZhbHVlIGN1cnJlbnRTSSA9IChTSUxhYmVsVmFsdWUpIHN0YXRlOworCQkJZG91YmxlIG9sZEkgPSBjdXJyZW50U0kuZ2V0SSgpOworCQkJZG91YmxlIElub2lzeSA9IGN1cnJlbnRTSS5nZXRJKCkqIGNvbXB1dGVOb2lzZSgpOworCQkJZG91YmxlIGNoYW5nZSA9IG9sZEktSW5vaXN5OworCQkJY3VycmVudFNJLnNldEkoSW5vaXN5KTsKKwkJCWRvdWJsZSBuZXdTID0gY3VycmVudFNJLmdldFMoKSArIGNoYW5nZTsKKwkJCWlmKG5ld1MgPCAwLjApIHsKKwkJCQkvLyBOZWVkIHRvIHJlc2NhbGUKKwkJCQlkb3VibGUgc2NhbGUgPSAoY3VycmVudFNJLmdldFMoKSArIG5ld1MpIC8gY3VycmVudFNJLmdldFMoKTsKKwkJCQljdXJyZW50U0kuc2V0SShJbm9pc3kqc2NhbGUpOworCQkJfSBlbHNlICBjdXJyZW50U0kuc2V0UyhuZXdTKTsKKwkJCXJldHVybjsKKwl9IC8vIGRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTJfMjoKKwkJCQlyZXR1cm4gZ2V0U2lnbWEyXzIoKTsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fU0lHTUEyOgorCQkJCXJldHVybiBnZXRTaWdtYTIoKTsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0Q6CisJCQkJcmV0dXJuIGdldE1vZHVsYXRpb25QZXJpb2QoKTsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVDoKKwkJCQlyZXR1cm4gZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoKTsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9GTE9PUjoKKwkJCQlyZXR1cm4gZ2V0TW9kdWxhdGlvbkZsb29yKCk7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0FUVDE6CisJCQkJcmV0dXJuIGdldEF0dDEoKTsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUMjoKKwkJCQlyZXR1cm4gZ2V0QXR0MigpOworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19BVFQzOgorCQkJCXJldHVybiBnZXRBdHQzKCk7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0FUVDQ6CisJCQkJcmV0dXJuIGdldEF0dDQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTJfMjoKKwkJCQlzZXRTaWdtYTJfMigoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NJR01BMjoKKwkJCQlzZXRTaWdtYTIoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BFUklPRDoKKwkJCQlzZXRNb2R1bGF0aW9uUGVyaW9kKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVDoKKwkJCQlzZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fRkxPT1I6CisJCQkJc2V0TW9kdWxhdGlvbkZsb29yKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUMToKKwkJCQlzZXRBdHQxKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUMjoKKwkJCQlzZXRBdHQyKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUMzoKKwkJCQlzZXRBdHQzKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUNDoKKwkJCQlzZXRBdHQ0KChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NJR01BMl8yOgorCQkJCXNldFNpZ21hMl8yKFNJR01BMl8yX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NJR01BMjoKKwkJCQlzZXRTaWdtYTIoU0lHTUEyX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EOgorCQkJCXNldE1vZHVsYXRpb25QZXJpb2QoTU9EVUxBVElPTl9QRVJJT0RfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVDoKKwkJCQlzZXRNb2R1bGF0aW9uUGhhc2VTaGlmdChNT0RVTEFUSU9OX1BIQVNFX1NISUZUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fRkxPT1I6CisJCQkJc2V0TW9kdWxhdGlvbkZsb29yKE1PRFVMQVRJT05fRkxPT1JfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUMToKKwkJCQlzZXRBdHQxKEFUVDFfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUMjoKKwkJCQlzZXRBdHQyKEFUVDJfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUMzoKKwkJCQlzZXRBdHQzKEFUVDNfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUNDoKKwkJCQlzZXRBdHQ0KEFUVDRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTJfMjoKKwkJCQlyZXR1cm4gc2lnbWEyXzIgIT0gU0lHTUEyXzJfRURFRkFVTFQ7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NJR01BMjoKKwkJCQlyZXR1cm4gc2lnbWEyICE9IFNJR01BMl9FREVGQVVMVDsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0Q6CisJCQkJcmV0dXJuIG1vZHVsYXRpb25QZXJpb2QgIT0gTU9EVUxBVElPTl9QRVJJT0RfRURFRkFVTFQ7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEhBU0VfU0hJRlQ6CisJCQkJcmV0dXJuIG1vZHVsYXRpb25QaGFzZVNoaWZ0ICE9IE1PRFVMQVRJT05fUEhBU0VfU0hJRlRfRURFRkFVTFQ7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fRkxPT1I6CisJCQkJcmV0dXJuIG1vZHVsYXRpb25GbG9vciAhPSBNT0RVTEFUSU9OX0ZMT09SX0VERUZBVUxUOworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19BVFQxOgorCQkJCXJldHVybiBhdHQxICE9IEFUVDFfRURFRkFVTFQ7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0FUVDI6CisJCQkJcmV0dXJuIGF0dDIgIT0gQVRUMl9FREVGQVVMVDsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUMzoKKwkJCQlyZXR1cm4gYXR0MyAhPSBBVFQzX0VERUZBVUxUOworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19BVFQ0OgorCQkJCXJldHVybiBhdHQ0ICE9IEFUVDRfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChzaWdtYTJfMjogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChzaWdtYTJfMik7CisJCXJlc3VsdC5hcHBlbmQoIiwgc2lnbWEyOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHNpZ21hMik7CisJCXJlc3VsdC5hcHBlbmQoIiwgbW9kdWxhdGlvblBlcmlvZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChtb2R1bGF0aW9uUGVyaW9kKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtb2R1bGF0aW9uUGhhc2VTaGlmdDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChtb2R1bGF0aW9uUGhhc2VTaGlmdCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbW9kdWxhdGlvbkZsb29yOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKG1vZHVsYXRpb25GbG9vcik7CisJCXJlc3VsdC5hcHBlbmQoIiwgYXR0MTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChhdHQxKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBhdHQyOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGF0dDIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGF0dDM6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoYXR0Myk7CisJCXJlc3VsdC5hcHBlbmQoIiwgYXR0NDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChhdHQ0KTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9pbXBsL0dhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvaW1wbC9HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZjM2MTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvaW1wbC9HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsNTYxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lSTGFiZWxWYWx1ZUltcGw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HYXVzc2lhbjMgRm9yY2luZyBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5pbXBsLkdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsI2dldFNpZ21hMl8zIDxlbT5TaWdtYTIgMzwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsSW1wbCNnZXRUcmFuc21pc3Npb25SYXRlMiA8ZW0+VHJhbnNtaXNzaW9uIFJhdGUyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5pbXBsLkdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsI2dldFRyYW5zbWlzc2lvblJhdGUzIDxlbT5UcmFuc21pc3Npb24gUmF0ZTM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwuR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwjZ2V0TW9kdWxhdGlvbkZsb29yXzIgPGVtPk1vZHVsYXRpb24gRmxvb3IgMjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsIGV4dGVuZHMgR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwgaW1wbGVtZW50cyBHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2lnbWEyXzMoKSA8ZW0+U2lnbWEyIDM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNpZ21hMl8zKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBTSUdNQTJfM19FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNpZ21hMl8zKCkgPGVtPlNpZ21hMiAzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTaWdtYTJfMygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBzaWdtYTJfMyA9IFNJR01BMl8zX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zbWlzc2lvblJhdGUyKCkgPGVtPlRyYW5zbWlzc2lvbiBSYXRlMjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VHJhbnNtaXNzaW9uUmF0ZTIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFRSQU5TTUlTU0lPTl9SQVRFMl9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zbWlzc2lvblJhdGUyKCkgPGVtPlRyYW5zbWlzc2lvbiBSYXRlMjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VHJhbnNtaXNzaW9uUmF0ZTIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgdHJhbnNtaXNzaW9uUmF0ZTIgPSBUUkFOU01JU1NJT05fUkFURTJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNtaXNzaW9uUmF0ZTMoKSA8ZW0+VHJhbnNtaXNzaW9uIFJhdGUzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUcmFuc21pc3Npb25SYXRlMygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgVFJBTlNNSVNTSU9OX1JBVEUzX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNtaXNzaW9uUmF0ZTMoKSA8ZW0+VHJhbnNtaXNzaW9uIFJhdGUzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUcmFuc21pc3Npb25SYXRlMygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSB0cmFuc21pc3Npb25SYXRlMyA9IFRSQU5TTUlTU0lPTl9SQVRFM19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNb2R1bGF0aW9uRmxvb3JfMigpIDxlbT5Nb2R1bGF0aW9uIEZsb29yIDI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25GbG9vcl8yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBNT0RVTEFUSU9OX0ZMT09SXzJfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNb2R1bGF0aW9uRmxvb3JfMigpIDxlbT5Nb2R1bGF0aW9uIEZsb29yIDI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25GbG9vcl8yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIG1vZHVsYXRpb25GbG9vcl8yID0gTU9EVUxBVElPTl9GTE9PUl8yX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwcml2YXRlIExvbmcgZmlyc3RUaW1lID0gbmV3IExvbmcoTG9uZy5NQVhfVkFMVUUpOworCXByaXZhdGUgQ2FsZW5kYXIgY2FsZW5kYXIgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworCXByaXZhdGUgQ2FsZW5kYXIgY2FsZW5kYXIyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgTUlMTElTX1BFUl9EQVkgPSAxMDAwLjAqNjAuMCo2MC4wKjI0LjA7CisKKwlwcml2YXRlIEFycmF5TGlzdDxMb25nPiB3cml0dGVkVGltZXMgPSBuZXcgQXJyYXlMaXN0PExvbmc+KCk7CisJcHJpdmF0ZSBGaWxlV3JpdGVyIGZ3OworCS8vcHJpdmF0ZSBGaWxlV3JpdGVyIGZ3MjsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XU0laRSA9IDMwOworCQorCWVudW0gSFlQIHtIMCwgSDEsIEgyfTsKKwlIWVAgY3VycmVudEh5cG90aGVzaXMgPSBIWVAuSDI7CisJCisJLy8gcHJpdmF0ZSBpbnQgW10gd2hpY2hHYXVzc2lhbiA9IHswLCAwLCAwLCAxLCAwLCAyLCAwLCAwLCAyLCAwLCAxfTsgLy8gMD1BL0gzTjIgMT1BL0gxTjEgMj1CCisJcHJpdmF0ZSBpbnQgW10gd2hpY2hHYXVzc2lhbiA9IHswLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAxLCAwLCAwfTsgLy8gMD1BIDE9QgorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY29tcHV0ZURpc2Vhc2VEZWx0YXMoCisJCQlmaW5hbCBTVEVNVGltZSB0aW1lLAorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGN1cnJlbnRTdGF0ZSwKKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZUxhYmVsLCBmaW5hbCBsb25nIHRpbWVEZWx0YSwgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSByZXR1cm5WYWx1ZSkgeworCQlmaW5hbCBTSVJMYWJlbFZhbHVlIGN1cnJlbnRTSVIgPSAoU0lSTGFiZWxWYWx1ZSkgY3VycmVudFN0YXRlOworCQkKKwkJbG9uZyBjdXJyZW50TWlsbGlzID0gdGltZS5nZXRUaW1lKCkuZ2V0VGltZSgpOworCQlkb3VibGUgbW9kdWxhdGlvblBlcmlvZCA9IGdldE1vZHVsYXRpb25QZXJpb2QoKTsKKwkJZG91YmxlIHBoYXNlID0gZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoKTsJCisJCWRvdWJsZSBzaWdtYTIgPSBnZXRTaWdtYTIoKTsJCQorCQlkb3VibGUgc2lnbWEyXzIgPSBnZXRTaWdtYTJfMigpOworCQkKKwkJc3luY2hyb25pemVkKHRoaXMpIHsKKwkJCWlmKGZpcnN0VGltZS5sb25nVmFsdWUoKSA9PSBMb25nLk1BWF9WQUxVRSkKKwkJCQlmaXJzdFRpbWUgPSBMb25nLnZhbHVlT2YodGltZS5nZXRUaW1lKCkuZ2V0VGltZSgpKTsKKwkJfQorCQkKKwkJLy8gR2V0IHRoZSBkYXkgZnJvbSB0aW1lIGFuZCBhZGp1c3QgZm9yIHRoZSBwaGFzZQkKKwkJZG91YmxlIGRheT0wOworCQkvLyBTaGFyZWQgY2FsZW5kYXIgb2JqZWN0IG5vdCB0aHJlYWQgc2FmZQorCQlzeW5jaHJvbml6ZWQoY2FsZW5kYXIpIHsKKwkJCWNhbGVuZGFyLnNldFRpbWVJbk1pbGxpcyhjdXJyZW50TWlsbGlzKyhsb25nKShwaGFzZSpNSUxMSVNfUEVSX0RBWSkpOworCQkJY2FsZW5kYXIyLnNldFRpbWVJbk1pbGxpcyhmaXJzdFRpbWUubG9uZ1ZhbHVlKCkpOworCQkJZGF5ID0gKGNhbGVuZGFyLmdldFRpbWVJbk1pbGxpcygpIC0gY2FsZW5kYXIyLmdldFRpbWVJbk1pbGxpcygpKS9NSUxMSVNfUEVSX0RBWTsKKwkJfQorCQlpbnQgeWVhciA9IChpbnQpKGRheSAvIG1vZHVsYXRpb25QZXJpb2QpOworCQlpbnQgbmV4dERheVllYXIgPSAoaW50KSgoZGF5KzEpIC8gbW9kdWxhdGlvblBlcmlvZCk7CisJCQorCQlkb3VibGUgZmRheSA9ICgoZGF5ICUgbW9kdWxhdGlvblBlcmlvZCktbW9kdWxhdGlvblBlcmlvZC8yLjApL21vZHVsYXRpb25QZXJpb2Q7CisJCQorCQlpbnQgZ2F1c3NpYW4gPSB3aGljaEdhdXNzaWFuW3llYXJdOworCisJCWRvdWJsZSBmMT0wOworCQlzd2l0Y2goY3VycmVudEh5cG90aGVzaXMpIHsKKwkJCWNhc2UgSDA6CisJCQkJZjEgPSAoZ2V0QWRqdXN0ZWRUcmFuc21pc3Npb25SYXRlKGdldFRyYW5zbWlzc2lvblJhdGUoKSx0aW1lRGVsdGEpKSAgKiAobW9kdWxhdGlvbkZsb29yICsgKDEtbW9kdWxhdGlvbkZsb29yKSpNYXRoLmV4cCgtKE1hdGgucG93KGZkYXksMikpLygyKnNpZ21hMikpKTsKKwkJCQlicmVhazsJCisJCQljYXNlIEgxOgorCQkJCWlmKGdhdXNzaWFuID09IDApIHsgLy8gQQorCQkJCQlmMSA9IChnZXRBZGp1c3RlZFRyYW5zbWlzc2lvblJhdGUoZ2V0VHJhbnNtaXNzaW9uUmF0ZSgpLHRpbWVEZWx0YSkpICAqIChtb2R1bGF0aW9uRmxvb3IgKyAoMS1tb2R1bGF0aW9uRmxvb3IpKk1hdGguZXhwKC0oTWF0aC5wb3coZmRheSwyKSkvKDIqc2lnbWEyKSkpOworCQkJCX0gZWxzZSBpZihnYXVzc2lhbiA9PSAxKSB7CisJCQkJCWYxID0gKGdldEFkanVzdGVkVHJhbnNtaXNzaW9uUmF0ZShnZXRUcmFuc21pc3Npb25SYXRlMigpLHRpbWVEZWx0YSkpICAqIChtb2R1bGF0aW9uRmxvb3IgKyAoMS1tb2R1bGF0aW9uRmxvb3IpKk1hdGguZXhwKC0oTWF0aC5wb3coZmRheSwyKSkvKDIqc2lnbWEyKSkpOworCQkJCX0KKwkJCQlicmVhazsJCisJCQljYXNlIEgyOgorCQkJCWlmKGdhdXNzaWFuID09IDApIHsKKwkJCQkJZjEgPSAoZ2V0QWRqdXN0ZWRUcmFuc21pc3Npb25SYXRlKGdldFRyYW5zbWlzc2lvblJhdGUoKSx0aW1lRGVsdGEpKSAgKiAoZ2V0TW9kdWxhdGlvbkZsb29yKCkgKyAoMS1nZXRNb2R1bGF0aW9uRmxvb3IoKSkqTWF0aC5leHAoLShNYXRoLnBvdyhmZGF5LDIpKS8oMipzaWdtYTIpKSk7CisJCQkJfSBlbHNlIGlmKGdhdXNzaWFuPT0xKSB7CisJCQkJCWYxID0gKGdldEFkanVzdGVkVHJhbnNtaXNzaW9uUmF0ZShnZXRUcmFuc21pc3Npb25SYXRlMigpLHRpbWVEZWx0YSkpICAqIChnZXRNb2R1bGF0aW9uRmxvb3JfMigpICsgKDEtZ2V0TW9kdWxhdGlvbkZsb29yXzIoKSkqTWF0aC5leHAoLShNYXRoLnBvdyhmZGF5LDIpKS8oMipzaWdtYTJfMikpKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkJCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCQorCQlkb3VibGUgbW9kdWxhdGVkVHJhbnNtaXNzaW9uUmF0ZSA9IDA7CisJCS8vIFNtb290aGluZworCQlpZihkYXkgJSBtb2R1bGF0aW9uUGVyaW9kIDwgV0lORE9XU0laRSB8fCBkYXkgJSBtb2R1bGF0aW9uUGVyaW9kID4gbW9kdWxhdGlvblBlcmlvZC1XSU5ET1dTSVpFKSB7CisJCQkKKwkJCWRvdWJsZSBwb3M7CisJCQlkb3VibGUgZjI9MCwgZjM9MDsKKwkJCWludCBuZXh0R2F1c3NpYW4gPSAwOworCQkJaWYoeWVhciA9PSB3aGljaEdhdXNzaWFuLmxlbmd0aC0xKSBuZXh0R2F1c3NpYW4gPSBnYXVzc2lhbjsKKwkJCWVsc2UgbmV4dEdhdXNzaWFuID0gd2hpY2hHYXVzc2lhblt5ZWFyKzFdOworCQkJCisJCQlpbnQgcHJldkdhdXNzaWFuID0gMDsKKwkJCWlmKHllYXIgPT0gMCkgcHJldkdhdXNzaWFuID0gZ2F1c3NpYW47CisJCQllbHNlIHByZXZHYXVzc2lhbiA9IHdoaWNoR2F1c3NpYW5beWVhci0xXTsKKwkJCQorCQkJc3dpdGNoKGN1cnJlbnRIeXBvdGhlc2lzKSB7CisJCQkJCisJCQkJY2FzZSBIMDoKKwkJCQkJZjIgPSAoZ2V0QWRqdXN0ZWRUcmFuc21pc3Npb25SYXRlKGdldFRyYW5zbWlzc2lvblJhdGUoKSx0aW1lRGVsdGEpKSAgKiAobW9kdWxhdGlvbkZsb29yICsgKDEtbW9kdWxhdGlvbkZsb29yKSpNYXRoLmV4cCgtKE1hdGgucG93KGZkYXktMSwyKSkvKDIqc2lnbWEyKSkpOworCQkJCQlmMyA9IChnZXRBZGp1c3RlZFRyYW5zbWlzc2lvblJhdGUoZ2V0VHJhbnNtaXNzaW9uUmF0ZSgpLHRpbWVEZWx0YSkpICAqIChtb2R1bGF0aW9uRmxvb3IgKyAoMS1tb2R1bGF0aW9uRmxvb3IpKk1hdGguZXhwKC0oTWF0aC5wb3coZmRheSsxLDIpKS8oMipzaWdtYTIpKSk7CisJCQkJCWJyZWFrOwkKKwkJCQljYXNlIEgxOgorCQkJCQlpZihuZXh0R2F1c3NpYW4gPT0gMCkKKwkJCQkJCWYyID0gKGdldEFkanVzdGVkVHJhbnNtaXNzaW9uUmF0ZShnZXRUcmFuc21pc3Npb25SYXRlKCksdGltZURlbHRhKSkgICogKG1vZHVsYXRpb25GbG9vciArICgxLW1vZHVsYXRpb25GbG9vcikqTWF0aC5leHAoLShNYXRoLnBvdyhmZGF5LTEsMikpLygyKnNpZ21hMikpKTsKKwkJCQkJZWxzZSBpZihuZXh0R2F1c3NpYW4gPT0gMSkgCisJCQkJCQlmMiA9IChnZXRBZGp1c3RlZFRyYW5zbWlzc2lvblJhdGUoZ2V0VHJhbnNtaXNzaW9uUmF0ZTIoKSx0aW1lRGVsdGEpKSAgKiAobW9kdWxhdGlvbkZsb29yICsgKDEtbW9kdWxhdGlvbkZsb29yKSpNYXRoLmV4cCgtKE1hdGgucG93KGZkYXktMSwyKSkvKDIqc2lnbWEyKSkpOworCQkJCQlpZihwcmV2R2F1c3NpYW4gPT0gMCkKKwkJCQkJCWYzID0gKGdldEFkanVzdGVkVHJhbnNtaXNzaW9uUmF0ZShnZXRUcmFuc21pc3Npb25SYXRlKCksdGltZURlbHRhKSkgICogKG1vZHVsYXRpb25GbG9vciArICgxLW1vZHVsYXRpb25GbG9vcikqTWF0aC5leHAoLShNYXRoLnBvdyhmZGF5KzEsMikpLygyKnNpZ21hMikpKTsKKwkJCQkJZWxzZSBpZihwcmV2R2F1c3NpYW4gPT0gMSkKKwkJCQkJCWYzID0gKGdldEFkanVzdGVkVHJhbnNtaXNzaW9uUmF0ZShnZXRUcmFuc21pc3Npb25SYXRlMigpLHRpbWVEZWx0YSkpICAqIChtb2R1bGF0aW9uRmxvb3IgKyAoMS1tb2R1bGF0aW9uRmxvb3IpKk1hdGguZXhwKC0oTWF0aC5wb3coZmRheSsxLDIpKS8oMipzaWdtYTIpKSk7CQkJCisJCQkJCQkJCQkKKwkJCQkJYnJlYWs7CQorCQkJCWNhc2UgSDI6CisJCQkJCWlmKG5leHRHYXVzc2lhbiA9PSAwKSAKKwkJCQkJCWYyID0gKGdldEFkanVzdGVkVHJhbnNtaXNzaW9uUmF0ZShnZXRUcmFuc21pc3Npb25SYXRlKCksdGltZURlbHRhKSkgICogKGdldE1vZHVsYXRpb25GbG9vcigpICsgKDEtZ2V0TW9kdWxhdGlvbkZsb29yKCkpKk1hdGguZXhwKC0oTWF0aC5wb3coZmRheS0xLDIpKS8oMipzaWdtYTIpKSk7CisJCQkJCWVsc2UgaWYobmV4dEdhdXNzaWFuID09IDEpIAorCQkJCQkJZjIgPSAoZ2V0QWRqdXN0ZWRUcmFuc21pc3Npb25SYXRlKGdldFRyYW5zbWlzc2lvblJhdGUyKCksdGltZURlbHRhKSkgICogKGdldE1vZHVsYXRpb25GbG9vcl8yKCkgKyAoMS1nZXRNb2R1bGF0aW9uRmxvb3JfMigpKSpNYXRoLmV4cCgtKE1hdGgucG93KGZkYXktMSwyKSkvKDIqc2lnbWEyXzIpKSk7CisJCQkJCWlmKHByZXZHYXVzc2lhbiA9PSAwKQorCQkJCQkJZjMgPSAoZ2V0QWRqdXN0ZWRUcmFuc21pc3Npb25SYXRlKGdldFRyYW5zbWlzc2lvblJhdGUoKSx0aW1lRGVsdGEpKSAgKiAoZ2V0TW9kdWxhdGlvbkZsb29yKCkgKyAoMS1nZXRNb2R1bGF0aW9uRmxvb3IoKSkqTWF0aC5leHAoLShNYXRoLnBvdyhmZGF5KzEsMikpLygyKnNpZ21hMikpKTsKKwkJCQkJZWxzZSBpZihwcmV2R2F1c3NpYW4gPT0gMSkKKwkJCQkJCWYzID0gKGdldEFkanVzdGVkVHJhbnNtaXNzaW9uUmF0ZShnZXRUcmFuc21pc3Npb25SYXRlMigpLHRpbWVEZWx0YSkpICAqIChnZXRNb2R1bGF0aW9uRmxvb3JfMigpICsgKDEtZ2V0TW9kdWxhdGlvbkZsb29yXzIoKSkqTWF0aC5leHAoLShNYXRoLnBvdyhmZGF5KzEsMikpLygyKnNpZ21hMl8yKSkpOwkJCQorCQkJCQlicmVhazsKKwkJCQkKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJaWYoKGRheSAlIG1vZHVsYXRpb25QZXJpb2QpID4gbW9kdWxhdGlvblBlcmlvZCAtIFdJTkRPV1NJWkUpCisJCQkJcG9zID0gV0lORE9XU0laRSAtIChtb2R1bGF0aW9uUGVyaW9kIC0gKGRheSAlIG1vZHVsYXRpb25QZXJpb2QpKTsKKwkJCWVsc2UgcG9zID0gV0lORE9XU0laRSsoZGF5ICUgbW9kdWxhdGlvblBlcmlvZCk7CisJCQkKKwkJCXBvcyA9IE1hdGguZmxvb3IocG9zKTsKKwkJCWRvdWJsZSBzbW9vdGggPSAwOworCQkJaWYocG9zID09IFdJTkRPV1NJWkUgJiYgbmV4dERheVllYXIgPT0geWVhcikKKwkJCQlzbW9vdGggPSAwLjUqZjEgKyAwLjUqZjM7CisJCQllbHNlIGlmKHBvcyA9PSBXSU5ET1dTSVpFICYmIG5leHREYXlZZWFyID09IHllYXIrMSkKKwkJCQlzbW9vdGggPSAwLjUqZjEgKzAuNSpmMjsKKwkJCWVsc2UgaWYgKHBvcyA8IFdJTkRPV1NJWkUpCisJCQkJc21vb3RoID0gKCgyKldJTkRPV1NJWkUtcG9zKS8oMipXSU5ET1dTSVpFKSkqZjEgKyAocG9zLygyKldJTkRPV1NJWkUpKSpmMjsKKwkJCWVsc2UgCisJCQkJc21vb3RoID0gKHBvcy8oMipXSU5ET1dTSVpFKSkqZjEgKyAoKDIqV0lORE9XU0laRS1wb3MpLygyKldJTkRPV1NJWkUpKSpmMzsKKworCQkJbW9kdWxhdGVkVHJhbnNtaXNzaW9uUmF0ZSA9IHNtb290aDsKKwkJfSAgZWxzZSB7CisJCQltb2R1bGF0ZWRUcmFuc21pc3Npb25SYXRlID0gZjE7CisJCX0KKwkJCisJCQorCQkKKy8vCQlpZighdGhpcy5pc0ZyZXF1ZW5jeURlcGVuZGVudCgpKSAgdHJhbnNtaXNzaW9uUmF0ZSAqPSBnZXRUcmFuc21pc3Npb25SYXRlU2NhbGVGYWN0b3IoZGlzZWFzZUxhYmVsKTsKKwkJCisJCS8vIHBvcHVsYXRpb24gdXNlZCBpbiB0ZWggY29tcHV0YXRpb24gb2YgYmV0cypTKmkgd2hlcmUgaSA9IEllZmZlY3RpdmUvUG9wLgorCQkvLyBUaGlzIGluY2x1ZGVzIGEgY29ycmVjdGlvbiB0byB0aGUgY3VycmVudAorCQkvLyBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gKEllZmZlY3RpdmUpIGJhc2VkIG9uIHRoZSBjb25zZXJ2ZWQgZXhjaGFuZ2Ugb2YgcGVvcGxlIChjaXJjdWxhdGlvbikKKwkJLy8gYmV0d2VlbiByZWdpb25zLiBOb3RlIHRoYXQgdGhpcyBpcyBubyB0aGUgImFycml2YWxzIiBhbmQgImRlcGFydHVyZXMiIHdoaWNoIGFyZQorCQkvLyBhIGRpZmZlcmVudCBwcm9jZXNzLgorCQlmaW5hbCBkb3VibGUgZWZmZWN0aXZlSW5mZWN0aW91cyA9IGdldE5vcm1hbGl6ZWRFZmZlY3RpdmVJbmZlY3Rpb3VzKGRpc2Vhc2VMYWJlbC5nZXROb2RlKCksIGRpc2Vhc2VMYWJlbCwgY3VycmVudFNJUi5nZXRJKCkpOworCisJCQorCQlzeW5jaHJvbml6ZWQod3JpdHRlZFRpbWVzKSB7CisJCQlpZighd3JpdHRlZFRpbWVzLmNvbnRhaW5zKHRpbWUuZ2V0VGltZSgpLmdldFRpbWUoKSkgJiYgZGlzZWFzZUxhYmVsLmdldE5vZGUoKS5nZXRVUkkoKS5sYXN0U2VnbWVudCgpLmNvbnRhaW5zKCJJTC0wMy0xMTEiKSkgeworCQkJCXRyeSB7CisJCQkJaWYoZncgPT0gbnVsbCkgZncgPSBuZXcgRmlsZVdyaXRlcigiYmV0YS5jc3YiKTsKKy8vCQkJCWlmKGZ3MiA9PSBudWxsKSBmdzI9IG5ldyBGaWxlV3JpdGVyKCJyMC5jc3YiKTsKKwkJCQlmdy53cml0ZSh0aW1lLmdldFRpbWUoKS5nZXRUaW1lKCkrIiwiK21vZHVsYXRlZFRyYW5zbWlzc2lvblJhdGUrIlxuIik7CisvLwkJCQlmdzIud3JpdGUodGltZS5nZXRUaW1lKCkuZ2V0VGltZSgpKyIsIit0cmFuc21pc3Npb25SYXRlKyIsIisoKHRyYW5zbWlzc2lvblJhdGUgLyBnZXRBZGp1c3RlZFJlY292ZXJ5UmF0ZSh0aW1lRGVsdGEpKSAqY3VycmVudFNJUi5nZXRTKCkgLyBlZmZlY3RpdmVQb3B1bGF0aW9uKSsiLCIrZ2V0QWRqdXN0ZWRSZWNvdmVyeVJhdGUodGltZURlbHRhKSsiLCIrZ2V0QWRqdXN0ZWRJbW11bml0eUxvc3NSYXRlKHRpbWVEZWx0YSkrIiwiK2VmZmVjdGl2ZUluZmVjdGlvdXMrIiwiK2N1cnJlbnRTSVIuZ2V0UG9wdWxhdGlvbkNvdW50KCkrIlxuIik7CisJCQkJCisJCQkJZncuZmx1c2goKTsKKy8vCQkJCWZ3Mi5mbHVzaCgpOworCQkJCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQkJd3JpdHRlZFRpbWVzLmFkZCh0aW1lLmdldFRpbWUoKS5nZXRUaW1lKCkpOworCQkJfQorCQl9CisJCQorCQkvKgorCQkgKiBDb21wdXRlIHN0YXRlIHRyYW5zaXRpb25zCisJCSAqIAorCQkgKiBSZWdhcmRpbmcgY29tcHV0aW5nIHRoZSBudW1iZXIgb2YgdHJhbnNpdGlvbnMgZnJvbSBTdXNjZXB0aWJsZSB0byBFeHBvc2VkOgorCQkgKiBJbiBhIGxpbmVhciBtb2RlbCB0aGUgImVmZmVjdGl2ZSIgbnVtYmVyIG9mIGluZmVjdGlvdXMgcGVvcGxlIGlzIGp1c3QKKwkJICogdGhlIG51bWJlciBvZiBpbmZlY3Rpb3VzIHBlb3BsZSBJbiBhIG5vbmxpbmVhciBtb2RlbCB3ZSBoYXZlIGEKKwkJICogbm9uTGluZWFyaXR5IGV4cG9uZW50IHRoYXQgaXMgPiAxIHRoaXMgbW9kZWxzIHRoZSBlZmZlY3Qgb2YgaW1tdW5lCisJCSAqIHN5c3RlbSBzYXR1cmF0aW9uIHdoZW4gU3VzY2VwdGlibGUgcGVvcGxlIGFyZSBleHBvc2VkIHRvIGxhcmdlCisJCSAqIG51bWJlcnMgb2YgaW5mZWN0aW91cyBwZW9wbGUuIHRoZW4gdGhlICJlZmZlY3RpdmUiIG51bWJlciBvZgorCQkgKiBpbmZlY3Rpb3VzIHBlb3BsZSBpcyBJXm5vbkxpbmVhcml0eSBleHBvbmVudCB0byBhbGxvdyBmb3IgZWl0aGVyCisJCSAqIGxpbmVhciBvciBub25saW5lYXIgbW9kZWxzIHdlIGFsd2F5cyBjYWxjdWxhdGUgSV5ub25MaW5lYXJpdHkKKwkJICogZXhwb25lbnQgYW5kIGFsbG93IG5vbkxpbmVhcml0eSBleHBvbmVudCA+PSAxLjAKKwkJICovCisJCWRvdWJsZSBudW1iZXJPZkluZmVjdGVkVG9SZWNvdmVyZWQgPSBnZXRBZGp1c3RlZFJlY292ZXJ5UmF0ZSh0aW1lRGVsdGEpCisJCSogY3VycmVudFNJUi5nZXRJKCk7CisJCWRvdWJsZSBudW1iZXJPZlJlY292ZXJlZFRvU3VzY2VwdGlibGUgPSBnZXRBZGp1c3RlZEltbXVuaXR5TG9zc1JhdGUodGltZURlbHRhKQorCQkqIGN1cnJlbnRTSVIuZ2V0UigpOworCQkvLyBOZWVkIHRvIGNoZWNrZWQgd2hhdCBkbyBkbyBoZXJlLiBJZiBub24gbGluZWFyIGNvZWZmaWNpZW50IGlzIG5vdCAxIGFuZAorCQkvLyB0aGUgZWZmZWN0aXZlIGluZmVjdGlvdXMgaXMgbmVnYXRpdmUgKHdoaWNoIGlzIHBvc3NpYmxlKSwgd2hhdCBkbyBkbz8gCisJCS8vIExldCdzIGZhbGwgYmFjayBvbiB0aGUgbGluZWFyIG1ldGhvZCBmb3Igbm93LgorCQlkb3VibGUgbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgPSAwLjA7CisJCWlmKGdldE5vbkxpbmVhcml0eUNvZWZmaWNpZW50KCkgIT0gMS4wICYmIGVmZmVjdGl2ZUluZmVjdGlvdXMgPj0gMC4wKQorCQkJbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgPSBtb2R1bGF0ZWRUcmFuc21pc3Npb25SYXRlCisJCQkqIGN1cnJlbnRTSVIuZ2V0UygpKiBNYXRoLnBvdyhlZmZlY3RpdmVJbmZlY3Rpb3VzLCBnZXROb25MaW5lYXJpdHlDb2VmZmljaWVudCgpKTsKKwkJZWxzZQorCQkJbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgPSBtb2R1bGF0ZWRUcmFuc21pc3Npb25SYXRlCisJCQkqIGN1cnJlbnRTSVIuZ2V0UygpKiBlZmZlY3RpdmVJbmZlY3Rpb3VzOworCQkKKwkJCisJCS8vIERldGVybWluZSBkZWx0YSBTCisJCWZpbmFsIGRvdWJsZSBkZWx0YVMgPSBudW1iZXJPZlJlY292ZXJlZFRvU3VzY2VwdGlibGUgLSBudW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZDsKKwkJCS8vIERldGVybWluZSBkZWx0YSBJCisJCWZpbmFsIGRvdWJsZSBkZWx0YUkgPSBudW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZC0gbnVtYmVyT2ZJbmZlY3RlZFRvUmVjb3ZlcmVkOworCQkvLyBEZXRlcm1pbmUgZGVsdGEgUgorCQlmaW5hbCBkb3VibGUgZGVsdGFSID0gbnVtYmVyT2ZJbmZlY3RlZFRvUmVjb3ZlcmVkIC0gbnVtYmVyT2ZSZWNvdmVyZWRUb1N1c2NlcHRpYmxlOworCQkKKwkJU0lSTGFiZWxWYWx1ZUltcGwgcmV0ID0gKFNJUkxhYmVsVmFsdWVJbXBsKXJldHVyblZhbHVlOworCQlyZXQuc2V0UyhkZWx0YVMpOworCQlyZXQuc2V0SShkZWx0YUkpOworCQlyZXQuc2V0SW5jaWRlbmNlKG51bWJlck9mU3VzY2VwdGlibGVUb0luZmVjdGVkKTsKKwkJcmV0LnNldFIoZGVsdGFSKTsKKwkJcmV0LnNldERpc2Vhc2VEZWF0aHMoMCk7CisJCXJldHVybiByZXQ7CisJfSAvLyBjb21wdXRlVHJhbnNpdGlvbnMKKwkKKwlwdWJsaWMgZG91YmxlIGdldEFkanVzdGVkVHJhbnNtaXNzaW9uUmF0ZShkb3VibGUgdHIsIGxvbmcgdGltZURlbHRhKSB7CisJCXJldHVybiB0cgorCQkJCSogKChkb3VibGUpIHRpbWVEZWx0YSAvIChkb3VibGUpIGdldFRpbWVQZXJpb2QoKSk7CisJfSAvLyBnZXRBZGp1c3RlZFRyYW5zbWlzc2lvblJhdGUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gRm9yY2luZ1BhY2thZ2UuTGl0ZXJhbHMuR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFNpZ21hMl8zKCkgeworCQlyZXR1cm4gc2lnbWEyXzM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2lnbWEyXzMoZG91YmxlIG5ld1NpZ21hMl8zKSB7CisJCWRvdWJsZSBvbGRTaWdtYTJfMyA9IHNpZ21hMl8zOworCQlzaWdtYTJfMyA9IG5ld1NpZ21hMl8zOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTJfMywgb2xkU2lnbWEyXzMsIHNpZ21hMl8zKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRUcmFuc21pc3Npb25SYXRlMigpIHsKKwkJcmV0dXJuIHRyYW5zbWlzc2lvblJhdGUyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRyYW5zbWlzc2lvblJhdGUyKGRvdWJsZSBuZXdUcmFuc21pc3Npb25SYXRlMikgeworCQlkb3VibGUgb2xkVHJhbnNtaXNzaW9uUmF0ZTIgPSB0cmFuc21pc3Npb25SYXRlMjsKKwkJdHJhbnNtaXNzaW9uUmF0ZTIgPSBuZXdUcmFuc21pc3Npb25SYXRlMjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEUyLCBvbGRUcmFuc21pc3Npb25SYXRlMiwgdHJhbnNtaXNzaW9uUmF0ZTIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFRyYW5zbWlzc2lvblJhdGUzKCkgeworCQlyZXR1cm4gdHJhbnNtaXNzaW9uUmF0ZTM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VHJhbnNtaXNzaW9uUmF0ZTMoZG91YmxlIG5ld1RyYW5zbWlzc2lvblJhdGUzKSB7CisJCWRvdWJsZSBvbGRUcmFuc21pc3Npb25SYXRlMyA9IHRyYW5zbWlzc2lvblJhdGUzOworCQl0cmFuc21pc3Npb25SYXRlMyA9IG5ld1RyYW5zbWlzc2lvblJhdGUzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURTMsIG9sZFRyYW5zbWlzc2lvblJhdGUzLCB0cmFuc21pc3Npb25SYXRlMykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0TW9kdWxhdGlvbkZsb29yXzIoKSB7CisJCXJldHVybiBtb2R1bGF0aW9uRmxvb3JfMjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNb2R1bGF0aW9uRmxvb3JfMihkb3VibGUgbmV3TW9kdWxhdGlvbkZsb29yXzIpIHsKKwkJZG91YmxlIG9sZE1vZHVsYXRpb25GbG9vcl8yID0gbW9kdWxhdGlvbkZsb29yXzI7CisJCW1vZHVsYXRpb25GbG9vcl8yID0gbmV3TW9kdWxhdGlvbkZsb29yXzI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fRkxPT1JfMiwgb2xkTW9kdWxhdGlvbkZsb29yXzIsIG1vZHVsYXRpb25GbG9vcl8yKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTJfMzoKKwkJCQlyZXR1cm4gZ2V0U2lnbWEyXzMoKTsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEUyOgorCQkJCXJldHVybiBnZXRUcmFuc21pc3Npb25SYXRlMigpOworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURTM6CisJCQkJcmV0dXJuIGdldFRyYW5zbWlzc2lvblJhdGUzKCk7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fRkxPT1JfMjoKKwkJCQlyZXR1cm4gZ2V0TW9kdWxhdGlvbkZsb29yXzIoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTJfMzoKKwkJCQlzZXRTaWdtYTJfMygoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFMjoKKwkJCQlzZXRUcmFuc21pc3Npb25SYXRlMigoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFMzoKKwkJCQlzZXRUcmFuc21pc3Npb25SYXRlMygoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fRkxPT1JfMjoKKwkJCQlzZXRNb2R1bGF0aW9uRmxvb3JfMigoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTJfMzoKKwkJCQlzZXRTaWdtYTJfMyhTSUdNQTJfM19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURTI6CisJCQkJc2V0VHJhbnNtaXNzaW9uUmF0ZTIoVFJBTlNNSVNTSU9OX1JBVEUyX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFMzoKKwkJCQlzZXRUcmFuc21pc3Npb25SYXRlMyhUUkFOU01JU1NJT05fUkFURTNfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9GTE9PUl8yOgorCQkJCXNldE1vZHVsYXRpb25GbG9vcl8yKE1PRFVMQVRJT05fRkxPT1JfMl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NJR01BMl8zOgorCQkJCXJldHVybiBzaWdtYTJfMyAhPSBTSUdNQTJfM19FREVGQVVMVDsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEUyOgorCQkJCXJldHVybiB0cmFuc21pc3Npb25SYXRlMiAhPSBUUkFOU01JU1NJT05fUkFURTJfRURFRkFVTFQ7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFMzoKKwkJCQlyZXR1cm4gdHJhbnNtaXNzaW9uUmF0ZTMgIT0gVFJBTlNNSVNTSU9OX1JBVEUzX0VERUZBVUxUOworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX0ZMT09SXzI6CisJCQkJcmV0dXJuIG1vZHVsYXRpb25GbG9vcl8yICE9IE1PRFVMQVRJT05fRkxPT1JfMl9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHNpZ21hMl8zOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHNpZ21hMl8zKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB0cmFuc21pc3Npb25SYXRlMjogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCh0cmFuc21pc3Npb25SYXRlMik7CisJCXJlc3VsdC5hcHBlbmQoIiwgdHJhbnNtaXNzaW9uUmF0ZTM6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQodHJhbnNtaXNzaW9uUmF0ZTMpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1vZHVsYXRpb25GbG9vcl8yOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKG1vZHVsYXRpb25GbG9vcl8yKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9pbXBsL0dhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9pbXBsL0dhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmI2YjRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL2ltcGwvR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsNTM3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGw7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJMYWJlbFZhbHVlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSW1wbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdhdXNzaWFuIEZvcmNpbmcgRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsI2dldFNpZ21hMiA8ZW0+U2lnbWEyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5pbXBsLkdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwjZ2V0TW9kdWxhdGlvblBlcmlvZCA8ZW0+TW9kdWxhdGlvbiBQZXJpb2Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLmltcGwuR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsSW1wbCNnZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCA8ZW0+TW9kdWxhdGlvbiBQaGFzZSBTaGlmdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsI2dldE1vZHVsYXRpb25GbG9vciA8ZW0+TW9kdWxhdGlvbiBGbG9vcjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGwgZXh0ZW5kcyBTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSW1wbCBpbXBsZW1lbnRzIEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNpZ21hMigpIDxlbT5TaWdtYTI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNpZ21hMigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgU0lHTUEyX0VERUZBVUxUID0gMTAwLjA7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2lnbWEyKCkgPGVtPlNpZ21hMjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2lnbWEyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIHNpZ21hMiA9IFNJR01BMl9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TW9kdWxhdGlvblBlcmlvZCgpIDxlbT5Nb2R1bGF0aW9uIFBlcmlvZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TW9kdWxhdGlvblBlcmlvZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgTU9EVUxBVElPTl9QRVJJT0RfRURFRkFVTFQgPSAzNjUuMjU7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TW9kdWxhdGlvblBlcmlvZCgpIDxlbT5Nb2R1bGF0aW9uIFBlcmlvZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TW9kdWxhdGlvblBlcmlvZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBtb2R1bGF0aW9uUGVyaW9kID0gTU9EVUxBVElPTl9QRVJJT0RfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkgPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBNT0RVTEFUSU9OX1BIQVNFX1NISUZUX0VERUZBVUxUID0gMC4wOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkgPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIG1vZHVsYXRpb25QaGFzZVNoaWZ0ID0gTU9EVUxBVElPTl9QSEFTRV9TSElGVF9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TW9kdWxhdGlvbkZsb29yKCkgPGVtPk1vZHVsYXRpb24gRmxvb3I8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25GbG9vcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgTU9EVUxBVElPTl9GTE9PUl9FREVGQVVMVCA9IDAuNjsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNb2R1bGF0aW9uRmxvb3IoKSA8ZW0+TW9kdWxhdGlvbiBGbG9vcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TW9kdWxhdGlvbkZsb29yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIG1vZHVsYXRpb25GbG9vciA9IE1PRFVMQVRJT05fRkxPT1JfRURFRkFVTFQ7CisKKwlwcml2YXRlIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwlwcml2YXRlIENhbGVuZGFyIGNhbGVuZGFyMiA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIE1JTExJU19QRVJfREFZID0gMTAwMC4wKjYwLjAqNjAuMCoyNC4wOworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSU5ET1dTSVpFID0gMzA7CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gRm9yY2luZ1BhY2thZ2UuTGl0ZXJhbHMuR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0U2lnbWEyKCkgeworCQlyZXR1cm4gc2lnbWEyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNpZ21hMihkb3VibGUgbmV3U2lnbWEyKSB7CisJCWRvdWJsZSBvbGRTaWdtYTIgPSBzaWdtYTI7CisJCXNpZ21hMiA9IG5ld1NpZ21hMjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTIsIG9sZFNpZ21hMiwgc2lnbWEyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRNb2R1bGF0aW9uUGVyaW9kKCkgeworCQlyZXR1cm4gbW9kdWxhdGlvblBlcmlvZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNb2R1bGF0aW9uUGVyaW9kKGRvdWJsZSBuZXdNb2R1bGF0aW9uUGVyaW9kKSB7CisJCWRvdWJsZSBvbGRNb2R1bGF0aW9uUGVyaW9kID0gbW9kdWxhdGlvblBlcmlvZDsKKwkJbW9kdWxhdGlvblBlcmlvZCA9IG5ld01vZHVsYXRpb25QZXJpb2Q7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0QsIG9sZE1vZHVsYXRpb25QZXJpb2QsIG1vZHVsYXRpb25QZXJpb2QpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkgeworCQlyZXR1cm4gbW9kdWxhdGlvblBoYXNlU2hpZnQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoZG91YmxlIG5ld01vZHVsYXRpb25QaGFzZVNoaWZ0KSB7CisJCWRvdWJsZSBvbGRNb2R1bGF0aW9uUGhhc2VTaGlmdCA9IG1vZHVsYXRpb25QaGFzZVNoaWZ0OworCQltb2R1bGF0aW9uUGhhc2VTaGlmdCA9IG5ld01vZHVsYXRpb25QaGFzZVNoaWZ0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEhBU0VfU0hJRlQsIG9sZE1vZHVsYXRpb25QaGFzZVNoaWZ0LCBtb2R1bGF0aW9uUGhhc2VTaGlmdCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0TW9kdWxhdGlvbkZsb29yKCkgeworCQlyZXR1cm4gbW9kdWxhdGlvbkZsb29yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1vZHVsYXRpb25GbG9vcihkb3VibGUgbmV3TW9kdWxhdGlvbkZsb29yKSB7CisJCWRvdWJsZSBvbGRNb2R1bGF0aW9uRmxvb3IgPSBtb2R1bGF0aW9uRmxvb3I7CisJCW1vZHVsYXRpb25GbG9vciA9IG5ld01vZHVsYXRpb25GbG9vcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX0ZMT09SLCBvbGRNb2R1bGF0aW9uRmxvb3IsIG1vZHVsYXRpb25GbG9vcikpOworCX0KKworCS8qKgorCSAqIFRvIGNyZWF0ZSBhIHVzZXIgZGVmaW5lZCAoZXhwZXJpbWVudGFsKSBkaXNlYXNlIG1vZGUsIHRoZSB1c2VyIG1heSB3aXNoIAorCSAqIHRvIGV4dGVuZCB0aGUgZXhpc3RpbmcgbW9kZWxzIGJ1dCBzaW1wbHkgb3ZlcnJpZGUgdHdvIG1ldGhvZHMuCisJICogY29tcHV0ZURpc2Vhc2VEZWx0YXMoKSBzZXRzIHRoZSB3b3JrIGZsb3cgZm9yIHRoZSBtb2RlbC4gVGhlIGZvbGxvd2luZyBleGFtcGxlCisJICogaXMgZGVyaXZlZCBmcm9tIHRoZSBzdGFuZGFyZCBjb2RlIGZvciBhbGwgYnVpbGQgaW4gbW9kZWxzIGJ1dCBpbiB0aGUgbGluZSBiZWxvdworCSAqIHdoZXJlIHdlIGRlZmluZSBmaW5hbCAiZG91YmxlIHRyYW5zbWlzaW9uUmF0ZSIgd2Ugc2hvdyBhbmQgZXhhbXBsZSBtb2RpZmljYXRpb24KKwkgKiB3aGVyZSBhIHBlcmlvZGljIGZvcmNpbmcgZmFjdG9yIHsgc2luKGZyZXEqdCkgfSBpcyBhZGRlZCB0byB0aGUgY29kZSBhcyBhbiBleGFtcGxlCisJICogbW9kaWZpY2F0aW9uLgorCSAqIAorCSAqIEBwYXJhbSB0aW1lCisJICogCQkJICBjdXJyZW50IHRpbWUKKwkgKiBAcGFyYW0gY3VycmVudFN0YXRlCisJICogICAgICAgICAgICB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG9wdWxhdGlvbgorCSAqIEBwYXJhbSBkaXNlYXNlTGFiZWwKKwkgKiAgICAgICAgICAgIHRoZSBkaXNlYXNlIGxhYmVsIGZvciB3aGljaCB0aGUgc3RhdGUgdHJhbnNpdGlvbnMgYXJlIGJlaW5nCisJICogICAgICAgICAgICBjb21wdXRlZC4KKwkgKiBAcGFyYW0gdGltZURlbHRhCisJICogICAgICAgICAgICB0aGUgdGltZSBwZXJpb2QgKG1pbGxpc2Vjb25kcykgb3ZlciB3aGljaCB0aGUgcG9wdWxhdGlvbgorCSAqICAgICAgICAgICAgbWVtYmVycyB0cmFuc2l0aW9uIHRvIG5ldyBzdGF0ZXMgICAgICAgICAgCisJICogQHJldHVybiBhIGRpc2Vhc2Ugc3RhdGUgbGFiZWwgdmFsdWUgdGhhdCBjb250YWlucyB0aGUgbnVtYmVyIG9mCisJICogICAgICAgICBkZWx0YSBjaGFuZ2VzIGluIGVhY2ggZGlzZWFzZSBzdGF0ZQorCSAqIAorCSAqIFVzZXJzIGNhbiBtb2RpZnkgdGhlIG1ldGhvZCBiZWxvdyB0byBjcmVhdGUgdGhlaXIgb3duIG1vZGVsLgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lJbXBsI2NvbXB1dGVEaXNlYXNlRGVsdGFzKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSwKKwkgKiAgICAgIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwsIGxvbmcpCisJICovCisJcHJpdmF0ZSBBcnJheUxpc3Q8TG9uZz4gd3JpdHRlZFRpbWVzID0gbmV3IEFycmF5TGlzdDxMb25nPigpOworCXByaXZhdGUgRmlsZVdyaXRlciBmdzsKKwlwcml2YXRlIExvbmcgZmlyc3RUaW1lID0gbmV3IExvbmcoTG9uZy5NQVhfVkFMVUUpOworCUBPdmVycmlkZQorCXB1YmxpYyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY29tcHV0ZURpc2Vhc2VEZWx0YXMoCisJCQlmaW5hbCBTVEVNVGltZSB0aW1lLAorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGN1cnJlbnRTdGF0ZSwKKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZUxhYmVsLCBmaW5hbCBsb25nIHRpbWVEZWx0YSwgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSByZXR1cm5WYWx1ZSkgeworZmluYWwgU0lSTGFiZWxWYWx1ZSBjdXJyZW50U0lSID0gKFNJUkxhYmVsVmFsdWUpIGN1cnJlbnRTdGF0ZTsKKwkJCisJCWxvbmcgY3VycmVudE1pbGxpcyA9IHRpbWUuZ2V0VGltZSgpLmdldFRpbWUoKTsKKwkJZG91YmxlIG1vZHVsYXRpb25QZXJpb2QgPSBnZXRNb2R1bGF0aW9uUGVyaW9kKCk7CisJCWRvdWJsZSBwaGFzZSA9IGdldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCk7CQorCQlkb3VibGUgc2lnbWEyID0gZ2V0U2lnbWEyKCk7CQkKKwkJCisJCXN5bmNocm9uaXplZCh0aGlzKSB7CisJCQlpZihmaXJzdFRpbWUubG9uZ1ZhbHVlKCkgPT0gTG9uZy5NQVhfVkFMVUUpCisJCQkJZmlyc3RUaW1lID0gTG9uZy52YWx1ZU9mKHRpbWUuZ2V0VGltZSgpLmdldFRpbWUoKSk7CisJCX0KKwkJCisJCS8vIEdldCB0aGUgZGF5IGZyb20gdGltZSBhbmQgYWRqdXN0IGZvciB0aGUgcGhhc2UJCisJCWRvdWJsZSBkYXk9MDsKKwkJLy8gU2hhcmVkIGNhbGVuZGFyIG9iamVjdCBub3QgdGhyZWFkIHNhZmUKKwkJc3luY2hyb25pemVkKGNhbGVuZGFyKSB7CisJCQljYWxlbmRhci5zZXRUaW1lSW5NaWxsaXMoY3VycmVudE1pbGxpcysobG9uZykocGhhc2UqTUlMTElTX1BFUl9EQVkpKTsKKwkJCWNhbGVuZGFyMi5zZXRUaW1lSW5NaWxsaXMoZmlyc3RUaW1lLmxvbmdWYWx1ZSgpKTsKKwkJCWRheSA9IChjYWxlbmRhci5nZXRUaW1lSW5NaWxsaXMoKSAtIGNhbGVuZGFyMi5nZXRUaW1lSW5NaWxsaXMoKSkvTUlMTElTX1BFUl9EQVk7CisJCQorCQl9CisJCWRvdWJsZSBpbnREYXkgPSBkYXk7CisJCWludCB5ZWFyID0gKGludCkoZGF5IC8gbW9kdWxhdGlvblBlcmlvZCk7CisJCWludCBuZXh0RGF5WWVhciA9IChpbnQpKChkYXkrMSkgLyBtb2R1bGF0aW9uUGVyaW9kKTsKKwkJCisJCWRvdWJsZSBtb2R1bGF0ZWRUcmFuc21pc3Npb25SYXRlID0gMC4wOworCQkKKwkJLy8gU21vb3RoaW5nCisJCWlmKGRheSAlIG1vZHVsYXRpb25QZXJpb2QgPCBXSU5ET1dTSVpFIHx8IGRheSAlIG1vZHVsYXRpb25QZXJpb2QgPiBtb2R1bGF0aW9uUGVyaW9kLVdJTkRPV1NJWkUpIHsKKwkJCWRvdWJsZSBwb3M7CisJCQlkb3VibGUgZmRheSA9ICgoZGF5ICUgbW9kdWxhdGlvblBlcmlvZCktbW9kdWxhdGlvblBlcmlvZC8yLjApL21vZHVsYXRpb25QZXJpb2Q7CisJCQlkb3VibGUgZjEgPSAoZ2V0QWRqdXN0ZWRUcmFuc21pc3Npb25SYXRlKHRpbWVEZWx0YSkpICAqIChtb2R1bGF0aW9uRmxvb3IgKyAoMS1tb2R1bGF0aW9uRmxvb3IpKk1hdGguZXhwKC0oTWF0aC5wb3coZmRheSwyKSkvKDIqc2lnbWEyKSkpOworCQkJZG91YmxlIGYyID0gKGdldEFkanVzdGVkVHJhbnNtaXNzaW9uUmF0ZSh0aW1lRGVsdGEpKSAgKiAobW9kdWxhdGlvbkZsb29yICsgKDEtbW9kdWxhdGlvbkZsb29yKSpNYXRoLmV4cCgtKE1hdGgucG93KGZkYXktMSwyKSkvKDIqc2lnbWEyKSkpOworCQkJZG91YmxlIGYzID0gKGdldEFkanVzdGVkVHJhbnNtaXNzaW9uUmF0ZSh0aW1lRGVsdGEpKSAgKiAobW9kdWxhdGlvbkZsb29yICsgKDEtbW9kdWxhdGlvbkZsb29yKSpNYXRoLmV4cCgtKE1hdGgucG93KGZkYXkrMSwyKSkvKDIqc2lnbWEyKSkpOworCisKKwkJCWlmKChkYXkgJSBtb2R1bGF0aW9uUGVyaW9kKSA+IG1vZHVsYXRpb25QZXJpb2QgLSBXSU5ET1dTSVpFKQorCQkJCXBvcyA9IFdJTkRPV1NJWkUgLSAobW9kdWxhdGlvblBlcmlvZCAtIChkYXkgJSBtb2R1bGF0aW9uUGVyaW9kKSk7CisJCQllbHNlIHBvcyA9IFdJTkRPV1NJWkUrKGRheSAlIG1vZHVsYXRpb25QZXJpb2QpOworCQkJCisJCQlwb3MgPSBNYXRoLnJvdW5kKHBvcyk7CisJCQlkb3VibGUgc21vb3RoID0gMDsKKwkJCWlmKHBvcyA9PSBXSU5ET1dTSVpFICYmIG5leHREYXlZZWFyID09IHllYXIpCisJCQkJc21vb3RoID0gMC41KmYxICsgMC41KmYzOworCQkJZWxzZSBpZihwb3MgPT0gV0lORE9XU0laRSAmJiBuZXh0RGF5WWVhciA9PSB5ZWFyKzEpCisJCQkJc21vb3RoID0gMC41KmYxICswLjUqZjI7CisJCQllbHNlIGlmIChwb3MgPCBXSU5ET1dTSVpFKQorCQkJCXNtb290aCA9ICgoMipXSU5ET1dTSVpFLXBvcykvKDIqV0lORE9XU0laRSkpKmYxICsgKHBvcy8oMipXSU5ET1dTSVpFKSkqZjI7CisJCQllbHNlIAorCQkJCXNtb290aCA9IChwb3MvKDIqV0lORE9XU0laRSkpKmYxICsgKCgyKldJTkRPV1NJWkUtcG9zKS8oMipXSU5ET1dTSVpFKSkqZjM7CisKKwkJCW1vZHVsYXRlZFRyYW5zbWlzc2lvblJhdGUgPSBzbW9vdGg7CisJCX0gZWxzZSB7CisJCQlkb3VibGUgZmRheSA9ICgoZGF5ICUgbW9kdWxhdGlvblBlcmlvZCktbW9kdWxhdGlvblBlcmlvZC8yLjApL21vZHVsYXRpb25QZXJpb2Q7CisJCQltb2R1bGF0ZWRUcmFuc21pc3Npb25SYXRlID0gKGdldEFkanVzdGVkVHJhbnNtaXNzaW9uUmF0ZSh0aW1lRGVsdGEpKSAgKiAobW9kdWxhdGlvbkZsb29yICsgKDEtbW9kdWxhdGlvbkZsb29yKSpNYXRoLmV4cCgtKE1hdGgucG93KGZkYXksMikpLygyKnNpZ21hMikpKTsKKwkJfQorCQkKKworLyoJCWlmKGRpc2Vhc2VMYWJlbC5nZXROb2RlKCkuZ2V0VVJJKCkudG9TdHJpbmcoKS5oYXNoQ29kZSgpICUgMiA9PSAwIAorCQkJCSYmICgoaW50KWludERheSkgPT0gMzI4NSkKKwkJCQl0cmFuc21pc3Npb25SYXRlICo9MTA7CisJCWVsc2UgCisJCWlmKGRpc2Vhc2VMYWJlbC5nZXROb2RlKCkuZ2V0VVJJKCkudG9TdHJpbmcoKS5oYXNoQ29kZSgpICUgMiA9PSAxIAorCQkJJiYgKChpbnQpaW50RGF5KSA9PSAzMjg1KQkKKwkJCQl0cmFuc21pc3Npb25SYXRlICo9MC4xOworKi8JCQorCQkKKwkJCisJCWlmKCF0aGlzLmlzRnJlcXVlbmN5RGVwZW5kZW50KCkpICBtb2R1bGF0ZWRUcmFuc21pc3Npb25SYXRlICo9IGdldFRyYW5zbWlzc2lvblJhdGVTY2FsZUZhY3RvcihkaXNlYXNlTGFiZWwpOworCisJCXN5bmNocm9uaXplZCh3cml0dGVkVGltZXMpIHsKKwkJCWlmKCF3cml0dGVkVGltZXMuY29udGFpbnModGltZS5nZXRUaW1lKCkuZ2V0VGltZSgpKSkgeworCQkJCXRyeSB7CisJCQkJaWYoZncgPT0gbnVsbCkgZncgPSBuZXcgRmlsZVdyaXRlcigiYmV0YS5jc3YiKTsKKwkJCQlmdy53cml0ZSgoaW50KWludERheSsiLCIrbW9kdWxhdGVkVHJhbnNtaXNzaW9uUmF0ZSsiXG4iKTsKKwkJCQlmdy5mbHVzaCgpOworCQkJCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQkJd3JpdHRlZFRpbWVzLmFkZCh0aW1lLmdldFRpbWUoKS5nZXRUaW1lKCkpOworCQkJfQorCQl9CisKKwkJLy8gVGhlIGVmZmVjdGl2ZSBJbmZlY3Rpb3VzIHBvcHVsYXRpb24gIGlzIGEgZGltZW5zaW9ubGVzIG51bWJlciBub3JtYWxpemUgYnkgdG90YWwKKwkJLy8gcG9wdWxhdGlvbiB1c2VkIGluIHRlaCBjb21wdXRhdGlvbiBvZiBiZXRzKlMqaSB3aGVyZSBpID0gSWVmZmVjdGl2ZS9Qb3AuCisJCS8vIFRoaXMgaW5jbHVkZXMgYSBjb3JyZWN0aW9uIHRvIHRoZSBjdXJyZW50CisJCS8vIGluZmVjdGlvdXMgcG9wdWxhdGlvbiAoSWVmZmVjdGl2ZSkgYmFzZWQgb24gdGhlIGNvbnNlcnZlZCBleGNoYW5nZSBvZiBwZW9wbGUgKGNpcmN1bGF0aW9uKQorCQkvLyBiZXR3ZWVuIHJlZ2lvbnMuIE5vdGUgdGhhdCB0aGlzIGlzIG5vIHRoZSAiYXJyaXZhbHMiIGFuZCAiZGVwYXJ0dXJlcyIgd2hpY2ggYXJlCisJCS8vIGEgZGlmZmVyZW50IHByb2Nlc3MuCisJCWZpbmFsIGRvdWJsZSBlZmZlY3RpdmVJbmZlY3Rpb3VzID0gZ2V0Tm9ybWFsaXplZEVmZmVjdGl2ZUluZmVjdGlvdXMoZGlzZWFzZUxhYmVsLmdldE5vZGUoKSwgZGlzZWFzZUxhYmVsLCBjdXJyZW50U0lSLmdldEkoKSk7CisKKwkJLyoKKwkJICogQ29tcHV0ZSBzdGF0ZSB0cmFuc2l0aW9ucworCQkgKiAKKwkJICogUmVnYXJkaW5nIGNvbXB1dGluZyB0aGUgbnVtYmVyIG9mIHRyYW5zaXRpb25zIGZyb20gU3VzY2VwdGlibGUgdG8gRXhwb3NlZDoKKwkJICogSW4gYSBsaW5lYXIgbW9kZWwgdGhlICJlZmZlY3RpdmUiIG51bWJlciBvZiBpbmZlY3Rpb3VzIHBlb3BsZSBpcyBqdXN0CisJCSAqIHRoZSBudW1iZXIgb2YgaW5mZWN0aW91cyBwZW9wbGUgSW4gYSBub25saW5lYXIgbW9kZWwgd2UgaGF2ZSBhCisJCSAqIG5vbkxpbmVhcml0eSBleHBvbmVudCB0aGF0IGlzID4gMSB0aGlzIG1vZGVscyB0aGUgZWZmZWN0IG9mIGltbXVuZQorCQkgKiBzeXN0ZW0gc2F0dXJhdGlvbiB3aGVuIFN1c2NlcHRpYmxlIHBlb3BsZSBhcmUgZXhwb3NlZCB0byBsYXJnZQorCQkgKiBudW1iZXJzIG9mIGluZmVjdGlvdXMgcGVvcGxlLiB0aGVuIHRoZSAiZWZmZWN0aXZlIiBudW1iZXIgb2YKKwkJICogaW5mZWN0aW91cyBwZW9wbGUgaXMgSV5ub25MaW5lYXJpdHkgZXhwb25lbnQgdG8gYWxsb3cgZm9yIGVpdGhlcgorCQkgKiBsaW5lYXIgb3Igbm9ubGluZWFyIG1vZGVscyB3ZSBhbHdheXMgY2FsY3VsYXRlIElebm9uTGluZWFyaXR5CisJCSAqIGV4cG9uZW50IGFuZCBhbGxvdyBub25MaW5lYXJpdHkgZXhwb25lbnQgPj0gMS4wCisJCSAqLworCQlkb3VibGUgbnVtYmVyT2ZJbmZlY3RlZFRvUmVjb3ZlcmVkID0gZ2V0QWRqdXN0ZWRSZWNvdmVyeVJhdGUodGltZURlbHRhKQorCQkqIGN1cnJlbnRTSVIuZ2V0SSgpOworCQlkb3VibGUgbnVtYmVyT2ZSZWNvdmVyZWRUb1N1c2NlcHRpYmxlID0gZ2V0QWRqdXN0ZWRJbW11bml0eUxvc3NSYXRlKHRpbWVEZWx0YSkKKwkJKiBjdXJyZW50U0lSLmdldFIoKTsKKwkJLy8gTmVlZCB0byBjaGVja2VkIHdoYXQgZG8gZG8gaGVyZS4gSWYgbm9uIGxpbmVhciBjb2VmZmljaWVudCBpcyBub3QgMSBhbmQKKwkJLy8gdGhlIGVmZmVjdGl2ZSBpbmZlY3Rpb3VzIGlzIG5lZ2F0aXZlICh3aGljaCBpcyBwb3NzaWJsZSksIHdoYXQgZG8gZG8/IAorCQkvLyBMZXQncyBmYWxsIGJhY2sgb24gdGhlIGxpbmVhciBtZXRob2QgZm9yIG5vdy4KKwkJZG91YmxlIG51bWJlck9mU3VzY2VwdGlibGVUb0luZmVjdGVkID0gMC4wOworCQlpZihnZXROb25MaW5lYXJpdHlDb2VmZmljaWVudCgpICE9IDEuMCAmJiBlZmZlY3RpdmVJbmZlY3Rpb3VzID49IDAuMCkKKwkJCW51bWJlck9mU3VzY2VwdGlibGVUb0luZmVjdGVkID0gbW9kdWxhdGVkVHJhbnNtaXNzaW9uUmF0ZQorCQkJKiBjdXJyZW50U0lSLmdldFMoKSogTWF0aC5wb3coZWZmZWN0aXZlSW5mZWN0aW91cywgZ2V0Tm9uTGluZWFyaXR5Q29lZmZpY2llbnQoKSk7CisJCWVsc2UKKwkJCW51bWJlck9mU3VzY2VwdGlibGVUb0luZmVjdGVkID0gbW9kdWxhdGVkVHJhbnNtaXNzaW9uUmF0ZQorCQkJKiBjdXJyZW50U0lSLmdldFMoKSogZWZmZWN0aXZlSW5mZWN0aW91czsKKwkJCisJCQorCQkvLyBEZXRlcm1pbmUgZGVsdGEgUworCQlmaW5hbCBkb3VibGUgZGVsdGFTID0gbnVtYmVyT2ZSZWNvdmVyZWRUb1N1c2NlcHRpYmxlIC0gbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQ7CisJCQkvLyBEZXRlcm1pbmUgZGVsdGEgSQorCQlmaW5hbCBkb3VibGUgZGVsdGFJID0gbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQtIG51bWJlck9mSW5mZWN0ZWRUb1JlY292ZXJlZDsKKwkJLy8gRGV0ZXJtaW5lIGRlbHRhIFIKKwkJZmluYWwgZG91YmxlIGRlbHRhUiA9IG51bWJlck9mSW5mZWN0ZWRUb1JlY292ZXJlZCAtIG51bWJlck9mUmVjb3ZlcmVkVG9TdXNjZXB0aWJsZTsKKwkJCisJCVNJUkxhYmVsVmFsdWVJbXBsIHJldCA9IChTSVJMYWJlbFZhbHVlSW1wbClyZXR1cm5WYWx1ZTsKKwkJcmV0LnNldFMoZGVsdGFTKTsKKwkJcmV0LnNldEkoZGVsdGFJKTsKKwkJcmV0LnNldEluY2lkZW5jZShudW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZCk7CisJCXJldC5zZXRSKGRlbHRhUik7CisJCXJldC5zZXREaXNlYXNlRGVhdGhzKDApOworCQlyZXR1cm4gcmV0OworCX0gLy8gY29tcHV0ZVRyYW5zaXRpb25zCisJCisJLyoqCisJICogTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzIGZvciBhIFN0b2NoYXN0aWMgbW9kZWwgYWRkcyBub2lzZSB0byBvciBhZGp1c3RzIAorCSAqIHRoZSBkaXNlYXNlIHN0YXRlIHRyYW5zaXRpb24gdmFsdWVzIGJ5IG11bHRpcGx5aW5nCisJICogdGhlIGFkZGl0aW9ucyBieSBhIHJhbmRvbSB2YXJpYWJsZSByIH4gKDErLy14KSB3aXRoIHggc21hbGwuCisJICogVGhlIHJlcXVpcmVtZW50cyB0aGF0IG5vIG1vcmUgaW5kaXZpZHVhbHMgY2FuIGJlIG1vdmVkIGZyb20gYSBzdGF0ZSB0aGFuIGFyZQorCSAqIGFscmVhZHkgaW4gdGhhdCBzdGF0ZSBpcyBzdGlsbCBlbmZvcmNlZC4KKwkgKiAKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cygKKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBzdGF0ZSkgeworCQkJZmluYWwgU0lMYWJlbFZhbHVlIGN1cnJlbnRTSSA9IChTSUxhYmVsVmFsdWUpIHN0YXRlOworCQkJZG91YmxlIG9sZEkgPSBjdXJyZW50U0kuZ2V0SSgpOworCQkJZG91YmxlIElub2lzeSA9IGN1cnJlbnRTSS5nZXRJKCkqIGNvbXB1dGVOb2lzZSgpOworCQkJZG91YmxlIGNoYW5nZSA9IG9sZEktSW5vaXN5OworCQkJY3VycmVudFNJLnNldEkoSW5vaXN5KTsKKwkJCWRvdWJsZSBuZXdTID0gY3VycmVudFNJLmdldFMoKSArIGNoYW5nZTsKKwkJCWlmKG5ld1MgPCAwLjApIHsKKwkJCQkvLyBOZWVkIHRvIHJlc2NhbGUKKwkJCQlkb3VibGUgc2NhbGUgPSAoY3VycmVudFNJLmdldFMoKSArIG5ld1MpIC8gY3VycmVudFNJLmdldFMoKTsKKwkJCQljdXJyZW50U0kuc2V0SShJbm9pc3kqc2NhbGUpOworCQkJfSBlbHNlICBjdXJyZW50U0kuc2V0UyhuZXdTKTsKKwkJCXJldHVybjsKKwl9IC8vIGRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NJR01BMjoKKwkJCQlyZXR1cm4gZ2V0U2lnbWEyKCk7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0Q6CisJCQkJcmV0dXJuIGdldE1vZHVsYXRpb25QZXJpb2QoKTsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZUOgorCQkJCXJldHVybiBnZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCgpOworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fRkxPT1I6CisJCQkJcmV0dXJuIGdldE1vZHVsYXRpb25GbG9vcigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fU0lHTUEyOgorCQkJCXNldFNpZ21hMigoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0Q6CisJCQkJc2V0TW9kdWxhdGlvblBlcmlvZCgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVDoKKwkJCQlzZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9GTE9PUjoKKwkJCQlzZXRNb2R1bGF0aW9uRmxvb3IoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTI6CisJCQkJc2V0U2lnbWEyKFNJR01BMl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EOgorCQkJCXNldE1vZHVsYXRpb25QZXJpb2QoTU9EVUxBVElPTl9QRVJJT0RfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZUOgorCQkJCXNldE1vZHVsYXRpb25QaGFzZVNoaWZ0KE1PRFVMQVRJT05fUEhBU0VfU0hJRlRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX0ZMT09SOgorCQkJCXNldE1vZHVsYXRpb25GbG9vcihNT0RVTEFUSU9OX0ZMT09SX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTI6CisJCQkJcmV0dXJuIHNpZ21hMiAhPSBTSUdNQTJfRURFRkFVTFQ7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0Q6CisJCQkJcmV0dXJuIG1vZHVsYXRpb25QZXJpb2QgIT0gTU9EVUxBVElPTl9QRVJJT0RfRURFRkFVTFQ7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVDoKKwkJCQlyZXR1cm4gbW9kdWxhdGlvblBoYXNlU2hpZnQgIT0gTU9EVUxBVElPTl9QSEFTRV9TSElGVF9FREVGQVVMVDsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX0ZMT09SOgorCQkJCXJldHVybiBtb2R1bGF0aW9uRmxvb3IgIT0gTU9EVUxBVElPTl9GTE9PUl9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHNpZ21hMjogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChzaWdtYTIpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1vZHVsYXRpb25QZXJpb2Q6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobW9kdWxhdGlvblBlcmlvZCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbW9kdWxhdGlvblBoYXNlU2hpZnQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobW9kdWxhdGlvblBoYXNlU2hpZnQpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1vZHVsYXRpb25GbG9vcjogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChtb2R1bGF0aW9uRmxvb3IpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJvdmlkZXIvRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL3Byb3ZpZGVyL0ZvcmNpbmdEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmQ1NGNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL3Byb3ZpZGVyL0ZvcmNpbmdEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI1NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ1BhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdEaXNlYXNlTW9kZWx9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIAorcHVibGljIGNsYXNzIEZvcmNpbmdEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIKKwlleHRlbmRzIFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEZvcmNpbmdEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkU2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZE1vZHVsYXRpb25QZXJpb2RQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZE1vZHVsYXRpb25QaGFzZVNoaWZ0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRTZWFzb25hbE1vZHVsYXRpb25GbG9vclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudCBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRm9yY2luZ0Rpc2Vhc2VNb2RlbF9zZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Gb3JjaW5nRGlzZWFzZU1vZGVsX3NlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50X2ZlYXR1cmUiLCAiX1VJX0ZvcmNpbmdEaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBGb3JjaW5nUGFja2FnZS5MaXRlcmFscy5GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NFQVNPTkFMX01PRFVMQVRJT05fRVhQT05FTlQsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1vZHVsYXRpb24gUGVyaW9kIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkTW9kdWxhdGlvblBlcmlvZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0ZvcmNpbmdEaXNlYXNlTW9kZWxfbW9kdWxhdGlvblBlcmlvZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Gb3JjaW5nRGlzZWFzZU1vZGVsX21vZHVsYXRpb25QZXJpb2RfZmVhdHVyZSIsICJfVUlfRm9yY2luZ0Rpc2Vhc2VNb2RlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIEZvcmNpbmdQYWNrYWdlLkxpdGVyYWxzLkZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0QsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1vZHVsYXRpb24gUGhhc2UgU2hpZnQgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRNb2R1bGF0aW9uUGhhc2VTaGlmdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0ZvcmNpbmdEaXNlYXNlTW9kZWxfbW9kdWxhdGlvblBoYXNlU2hpZnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRm9yY2luZ0Rpc2Vhc2VNb2RlbF9tb2R1bGF0aW9uUGhhc2VTaGlmdF9mZWF0dXJlIiwgIl9VSV9Gb3JjaW5nRGlzZWFzZU1vZGVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgRm9yY2luZ1BhY2thZ2UuTGl0ZXJhbHMuRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZULAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZWFzb25hbCBNb2R1bGF0aW9uIEZsb29yIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkU2Vhc29uYWxNb2R1bGF0aW9uRmxvb3JQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Gb3JjaW5nRGlzZWFzZU1vZGVsX3NlYXNvbmFsTW9kdWxhdGlvbkZsb29yX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0ZvcmNpbmdEaXNlYXNlTW9kZWxfc2Vhc29uYWxNb2R1bGF0aW9uRmxvb3JfZmVhdHVyZSIsICJfVUlfRm9yY2luZ0Rpc2Vhc2VNb2RlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIEZvcmNpbmdQYWNrYWdlLkxpdGVyYWxzLkZPUkNJTkdfRElTRUFTRV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUiwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgRm9yY2luZ0Rpc2Vhc2VNb2RlbC5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Gb3JjaW5nRGlzZWFzZU1vZGVsIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChGb3JjaW5nRGlzZWFzZU1vZGVsKW9iamVjdCkuZ2V0VVJJKCkubGFzdFNlZ21lbnQoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9Gb3JjaW5nRGlzZWFzZU1vZGVsX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoRm9yY2luZ0Rpc2Vhc2VNb2RlbClvYmplY3QpLmdldERpc2Vhc2VOYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfRm9yY2luZ0Rpc2Vhc2VNb2RlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9Gb3JjaW5nRGlzZWFzZU1vZGVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisJCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRm9yY2luZ0Rpc2Vhc2VNb2RlbC5jbGFzcykpIHsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuRk9SQ0lOR19ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0VYUE9ORU5UOgorCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EOgorCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEhBU0VfU0hJRlQ6CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkZPUkNJTkdfRElTRUFTRV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUjoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gRm9yY2luZ0VkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJvdmlkZXIvRm9yY2luZ0VkaXRQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9wcm92aWRlci9Gb3JjaW5nRWRpdFBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NTY4YzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJvdmlkZXIvRm9yY2luZ0VkaXRQbHVnaW4uamF2YQpAQCAtMCwwICsxLDExMiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsKKworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcm92aWRlci5EZWZpbml0aW9uc0VkaXRQbHVnaW47CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlci5EZWZpbml0aW9uc0VkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLkRpc2Vhc2Vtb2RlbHNFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdGFuZGFyZEVkaXRQbHVnaW47CisKKy8qKgorICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBGb3JjaW5nIGVkaXQgcGx1Z2luLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRm9yY2luZ0VkaXRQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4geworCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEZvcmNpbmdFZGl0UGx1Z2luIElOU1RBTkNFID0gbmV3IEZvcmNpbmdFZGl0UGx1Z2luKCk7CisJCisJLyoqCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBGb3JjaW5nRWRpdFBsdWdpbigpIHsKKwkJc3VwZXIKKwkJCShuZXcgUmVzb3VyY2VMb2NhdG9yIFtdIHsKKwkJCQlEaXNlYXNlbW9kZWxzRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJCQlDb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJCQkvL0Vjb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJCQlEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCQl9KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCQorCS8qKgorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7CisJCS8qKgorCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQorCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOworCisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgorCQkJLy8KKwkJCXBsdWdpbiA9IHRoaXM7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9wcm92aWRlci9Gb3JjaW5nSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9wcm92aWRlci9Gb3JjaW5nSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTQzYjI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL3Byb3ZpZGVyL0ZvcmNpbmdJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjgwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcudXRpbC5Gb3JjaW5nQWRhcHRlckZhY3Rvcnk7CisKKy8qKgorICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLgorICogVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uCisgKiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgorICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRm9yY2luZ0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgRm9yY2luZ0FkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieSB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248T2JqZWN0PiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBGb3JjaW5nSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdEaXNlYXNlTW9kZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciBmb3JjaW5nRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdEaXNlYXNlTW9kZWx9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZvcmNpbmdEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlpZiAoZm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlmb3JjaW5nRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyID0gbmV3IEZvcmNpbmdEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gZm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbH0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgZ2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJaWYgKGdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlnYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPSBuZXcgR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciBnYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWx9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlpZiAoZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlnYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyID0gbmV3IEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciBnYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWx9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlpZiAoZ2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlnYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyID0gbmV3IEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gZ2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgeworCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7CisJCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7CisJCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7CisJCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3M8Pz4pIHx8ICgoKENsYXNzPD8+KXR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7CisJCQkJcmV0dXJuIGFkYXB0ZXI7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn0gYW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKworCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgeworCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJaWYgKGZvcmNpbmdEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgIT0gbnVsbCkgZm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChnYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgIT0gbnVsbCkgZ2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKGdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgIT0gbnVsbCkgZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChnYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyICE9IG51bGwpIGdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL3Byb3ZpZGVyL0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9wcm92aWRlci9HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzODFkYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9wcm92aWRlci9HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzNTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcucHJvdmlkZXI7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbH0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRTaWdtYTJfMlByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkU2lnbWEyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRNb2R1bGF0aW9uUGVyaW9kUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRNb2R1bGF0aW9uUGhhc2VTaGlmdFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkTW9kdWxhdGlvbkZsb29yUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRBdHQxUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRBdHQyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRBdHQzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRBdHQ0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTaWdtYTIgMiBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFNpZ21hMl8yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9zaWdtYTJfMl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsX3NpZ21hMl8yX2ZlYXR1cmUiLCAiX1VJX0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBGb3JjaW5nUGFja2FnZS5MaXRlcmFscy5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTJfMiwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2lnbWEyIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkU2lnbWEyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9zaWdtYTJfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9zaWdtYTJfZmVhdHVyZSIsICJfVUlfR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIEZvcmNpbmdQYWNrYWdlLkxpdGVyYWxzLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NJR01BMiwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTW9kdWxhdGlvbiBQZXJpb2QgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRNb2R1bGF0aW9uUGVyaW9kUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9tb2R1bGF0aW9uUGVyaW9kX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfbW9kdWxhdGlvblBlcmlvZF9mZWF0dXJlIiwgIl9VSV9HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgRm9yY2luZ1BhY2thZ2UuTGl0ZXJhbHMuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0QsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1vZHVsYXRpb24gUGhhc2UgU2hpZnQgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRNb2R1bGF0aW9uUGhhc2VTaGlmdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfbW9kdWxhdGlvblBoYXNlU2hpZnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9tb2R1bGF0aW9uUGhhc2VTaGlmdF9mZWF0dXJlIiwgIl9VSV9HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgRm9yY2luZ1BhY2thZ2UuTGl0ZXJhbHMuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVCwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTW9kdWxhdGlvbiBGbG9vciBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZE1vZHVsYXRpb25GbG9vclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfbW9kdWxhdGlvbkZsb29yX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfbW9kdWxhdGlvbkZsb29yX2ZlYXR1cmUiLCAiX1VJX0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBGb3JjaW5nUGFja2FnZS5MaXRlcmFscy5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX0ZMT09SLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBdHQxIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQXR0MVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfYXR0MV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsX2F0dDFfZmVhdHVyZSIsICJfVUlfR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIEZvcmNpbmdQYWNrYWdlLkxpdGVyYWxzLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0FUVDEsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEF0dDIgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRBdHQyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9hdHQyX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfYXR0Ml9mZWF0dXJlIiwgIl9VSV9HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgRm9yY2luZ1BhY2thZ2UuTGl0ZXJhbHMuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fQVRUMiwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXR0MyBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEF0dDNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsX2F0dDNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF9hdHQzX2ZlYXR1cmUiLCAiX1VJX0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBGb3JjaW5nUGFja2FnZS5MaXRlcmFscy5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19BVFQzLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBdHQ0IGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQXR0NFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfYXR0NF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsX2F0dDRfZmVhdHVyZSIsICJfVUlfR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIEZvcmNpbmdQYWNrYWdlLkxpdGVyYWxzLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX0FUVDQsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsKW9iamVjdCkuZ2V0RGlzZWFzZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwuY2xhc3MpKSB7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NJR01BMl8yOgorCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTI6CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOMl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EOgorCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZUOgorCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX0ZMT09SOgorCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19BVFQxOgorCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19BVFQyOgorCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19BVFQzOgorCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjJfRk9SQ0lOR19ESVNFQVNFX01PREVMX19BVFQ0OgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBGb3JjaW5nRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9wcm92aWRlci9HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJvdmlkZXIvR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYjcyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJvdmlkZXIvR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbH0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRTaWdtYTJfM1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkVHJhbnNtaXNzaW9uUmF0ZTJQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFRyYW5zbWlzc2lvblJhdGUzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRNb2R1bGF0aW9uRmxvb3JfMlByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2lnbWEyIDMgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTaWdtYTJfM1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0dhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxfc2lnbWEyXzNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbF9zaWdtYTJfM19mZWF0dXJlIiwgIl9VSV9HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgRm9yY2luZ1BhY2thZ2UuTGl0ZXJhbHMuR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fU0lHTUEyXzMsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRyYW5zbWlzc2lvbiBSYXRlMiBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFRyYW5zbWlzc2lvblJhdGUyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbF90cmFuc21pc3Npb25SYXRlMl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsX3RyYW5zbWlzc2lvblJhdGUyX2ZlYXR1cmUiLCAiX1VJX0dhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBGb3JjaW5nUGFja2FnZS5MaXRlcmFscy5HQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURTIsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRyYW5zbWlzc2lvbiBSYXRlMyBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFRyYW5zbWlzc2lvblJhdGUzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbF90cmFuc21pc3Npb25SYXRlM19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsX3RyYW5zbWlzc2lvblJhdGUzX2ZlYXR1cmUiLCAiX1VJX0dhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBGb3JjaW5nUGFja2FnZS5MaXRlcmFscy5HQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURTMsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1vZHVsYXRpb24gRmxvb3IgMiBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZE1vZHVsYXRpb25GbG9vcl8yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbF9tb2R1bGF0aW9uRmxvb3JfMl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsX21vZHVsYXRpb25GbG9vcl8yX2ZlYXR1cmUiLCAiX1VJX0dhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBGb3JjaW5nUGFja2FnZS5MaXRlcmFscy5HQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX0ZMT09SXzIsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsKW9iamVjdCkuZ2V0RGlzZWFzZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX0dhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwuY2xhc3MpKSB7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1NJR01BMl8zOgorCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTjNfRk9SQ0lOR19ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURTI6CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFMzoKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4zX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9GTE9PUl8yOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJvdmlkZXIvR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJvdmlkZXIvR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxZmYxZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9wcm92aWRlci9HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI1MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5wcm92aWRlcjsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbH0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkU2lnbWEyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRNb2R1bGF0aW9uUGVyaW9kUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRNb2R1bGF0aW9uUGhhc2VTaGlmdFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkTW9kdWxhdGlvbkZsb29yUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTaWdtYTIgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTaWdtYTJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxfc2lnbWEyX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0dhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbF9zaWdtYTJfZmVhdHVyZSIsICJfVUlfR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgRm9yY2luZ1BhY2thZ2UuTGl0ZXJhbHMuR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19TSUdNQTIsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1vZHVsYXRpb24gUGVyaW9kIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkTW9kdWxhdGlvblBlcmlvZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0dhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbF9tb2R1bGF0aW9uUGVyaW9kX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0dhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbF9tb2R1bGF0aW9uUGVyaW9kX2ZlYXR1cmUiLCAiX1VJX0dhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIEZvcmNpbmdQYWNrYWdlLkxpdGVyYWxzLkdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0QsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1vZHVsYXRpb24gUGhhc2UgU2hpZnQgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRNb2R1bGF0aW9uUGhhc2VTaGlmdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0dhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbF9tb2R1bGF0aW9uUGhhc2VTaGlmdF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxfbW9kdWxhdGlvblBoYXNlU2hpZnRfZmVhdHVyZSIsICJfVUlfR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgRm9yY2luZ1BhY2thZ2UuTGl0ZXJhbHMuR0FVU1NJQU5fRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZULAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNb2R1bGF0aW9uIEZsb29yIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkTW9kdWxhdGlvbkZsb29yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsX21vZHVsYXRpb25GbG9vcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxfbW9kdWxhdGlvbkZsb29yX2ZlYXR1cmUiLCAiX1VJX0dhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIEZvcmNpbmdQYWNrYWdlLkxpdGVyYWxzLkdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9GTE9PUiwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0dhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsKW9iamVjdCkuZ2V0VVJJKCkubGFzdFNlZ21lbnQoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwpb2JqZWN0KS5nZXREaXNlYXNlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0dhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwuY2xhc3MpKSB7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fU0lHTUEyOgorCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EOgorCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5HQVVTU0lBTl9GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEhBU0VfU0hJRlQ6CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9GTE9PUjoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gRm9yY2luZ0VkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvdXRpbC9Gb3JjaW5nQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy91dGlsL0ZvcmNpbmdBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMzc0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvdXRpbC9Gb3JjaW5nQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQ1MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy51dGlsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy4qOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0k7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBGb3JjaW5nQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIEZvcmNpbmdQYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRm9yY2luZ0FkYXB0ZXJGYWN0b3J5KCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IEZvcmNpbmdQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7CisJCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRm9yY2luZ1N3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9CisJCW5ldyBGb3JjaW5nU3dpdGNoPEFkYXB0ZXI+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRm9yY2luZ0Rpc2Vhc2VNb2RlbChGb3JjaW5nRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVGb3JjaW5nRGlzZWFzZU1vZGVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsKEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbChHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbChHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgPFQ+IEFkYXB0ZXIgY2FzZUNvbXBhcmFibGUoQ29tcGFyYWJsZTxUPiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ29tcGFyYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlY29yYXRvcihEZWNvcmF0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZURlY29yYXRvckFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU5vZGVEZWNvcmF0b3IoTm9kZURlY29yYXRvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTm9kZURlY29yYXRvckFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNhbml0eUNoZWNrZXIoU2FuaXR5Q2hlY2tlciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU2FuaXR5Q2hlY2tlckFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1vZGlmaWFibGUoTW9kaWZpYWJsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTW9kaWZpYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZURpc2Vhc2VNb2RlbChEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZURpc2Vhc2VNb2RlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKEludGVncmF0aW9uRGVjb3JhdG9yIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVJbnRlZ3JhdGlvbkRlY29yYXRvckFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVN0YW5kYXJkRGlzZWFzZU1vZGVsKFN0YW5kYXJkRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTdGFuZGFyZERpc2Vhc2VNb2RlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNJKFNJIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTSUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNJUihTSVIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNJUkFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbChTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwoU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCisJICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7CisJCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOworCX0KKworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nRGlzZWFzZU1vZGVsIDxlbT5EaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRm9yY2luZ0Rpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsIDxlbT5HYXVzc2lhbiBGb3JjaW5nIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCA8ZW0+R2F1c3NpYW4yIEZvcmNpbmcgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwgPGVtPkdhdXNzaWFuMyBGb3JjaW5nIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLmxhbmcuQ29tcGFyYWJsZSA8ZW0+Q29tcGFyYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvciA8ZW0+RGVjb3JhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVjb3JhdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvciA8ZW0+Tm9kZSBEZWNvcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTm9kZURlY29yYXRvckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyIDxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2FuaXR5Q2hlY2tlckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUgPGVtPk1vZGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kaWZpYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCA8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yIDxlbT5JbnRlZ3JhdGlvbiBEZWNvcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUludGVncmF0aW9uRGVjb3JhdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwgPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0YW5kYXJkRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kgPGVtPlNJPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTSUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUiA8ZW0+U0lSPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU0lSQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCA8ZW0+U3RvY2hhc3RpYyBEaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0b2NoYXN0aWNEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwgPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwgPGVtPlN0b2NoYXN0aWMgU0lSIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9FeGFtcGxlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy91dGlsL0ZvcmNpbmdTd2l0Y2guamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy91dGlsL0ZvcmNpbmdTd2l0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjRjYzRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL3V0aWwvRm9yY2luZ1N3aXRjaC5qYXZhCkBAIC0wLDAgKzEsNDgyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLnV0aWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy4qOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0k7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KKyAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KKyAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKKyAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0CisgKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5CisgKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKKyAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBGb3JjaW5nU3dpdGNoPFQxPiB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBGb3JjaW5nUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEZvcmNpbmdTd2l0Y2goKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gRm9yY2luZ1BhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUMSBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKKwkJfQorCQllbHNlIHsKKwkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOworCQkJcmV0dXJuCisJCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KKwkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgorCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkZPUkNJTkdfRElTRUFTRV9NT0RFTDogeworCQkJCUZvcmNpbmdEaXNlYXNlTW9kZWwgZm9yY2luZ0Rpc2Vhc2VNb2RlbCA9IChGb3JjaW5nRGlzZWFzZU1vZGVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUZvcmNpbmdEaXNlYXNlTW9kZWwoZm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbChmb3JjaW5nRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTSVIoZm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKGZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNJKGZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoZm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmREaXNlYXNlTW9kZWwoZm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlzZWFzZU1vZGVsKGZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKGZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3IoZm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcihmb3JjaW5nRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKGZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcihmb3JjaW5nRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoZm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShmb3JjaW5nRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOX0ZPUkNJTkdfRElTRUFTRV9NT0RFTDogeworCQkJCUdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCBnYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwgPSAoR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbChnYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwoZ2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTSVIoZ2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoZ2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTSShnYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoZ2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbChnYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpc2Vhc2VNb2RlbChnYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKGdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZURlY29yYXRvcihnYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNhbml0eUNoZWNrZXIoZ2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKGdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKGdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKGdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShnYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuR0FVU1NJQU4yX0ZPUkNJTkdfRElTRUFTRV9NT0RFTDogeworCQkJCUdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwgZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCA9IChHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwoZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbChnYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTSVIoZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKGdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNJKGdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmREaXNlYXNlTW9kZWwoZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlzZWFzZU1vZGVsKGdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKGdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3IoZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcihnYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKGdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcihnYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoZ2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShnYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkdBVVNTSUFOM19GT1JDSU5HX0RJU0VBU0VfTU9ERUw6IHsKKwkJCQlHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsIGdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwgPSAoR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsKGdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwoZ2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbChnYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTSVIoZ2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKGdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNJKGdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoZ2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmREaXNlYXNlTW9kZWwoZ2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlzZWFzZU1vZGVsKGdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKGdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3IoZ2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcihnYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKGdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcihnYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoZ2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShnYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VGb3JjaW5nRGlzZWFzZU1vZGVsKEZvcmNpbmdEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdhdXNzaWFuIEZvcmNpbmcgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdhdXNzaWFuIEZvcmNpbmcgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwoR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HYXVzc2lhbjIgRm9yY2luZyBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R2F1c3NpYW4yIEZvcmNpbmcgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsKEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdhdXNzaWFuMyBGb3JjaW5nIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HYXVzc2lhbjMgRm9yY2luZyBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwoR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyA8VD4gVDEgY2FzZUNvbXBhcmFibGUoQ29tcGFyYWJsZTxUPiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlY29yYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlY29yYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VEZWNvcmF0b3IoRGVjb3JhdG9yIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlIERlY29yYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgRGVjb3JhdG9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZU5vZGVEZWNvcmF0b3IoTm9kZURlY29yYXRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2FuaXR5IENoZWNrZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTYW5pdHlDaGVja2VyKFNhbml0eUNoZWNrZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZGlmaWFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2RpZmlhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZU1vZGlmaWFibGUoTW9kaWZpYWJsZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRGlzZWFzZU1vZGVsKERpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZWdyYXRpb24gRGVjb3JhdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZWdyYXRpb24gRGVjb3JhdG9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKEludGVncmF0aW9uRGVjb3JhdG9yIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbChTdGFuZGFyZERpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0k8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TSTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTSShTSSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0lSPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0lSPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVNJUihTSVIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTdG9jaGFzdGljRGlzZWFzZU1vZGVsKFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdG9jaGFzdGljIFNJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RvY2hhc3RpYyBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsKFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL0V4YW1wbGVTd2l0Y2gKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmMDI0ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8Y2xhc3NwYXRoPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQorPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZjY0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8cHJvamVjdERlc2NyaXB0aW9uPg0KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWw8L25hbWU+DQorCTxjb21tZW50PjwvY29tbWVudD4NCisJPHByb2plY3RzPg0KKwk8L3Byb2plY3RzPg0KKwk8YnVpbGRTcGVjPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCTwvYnVpbGRTcGVjPg0KKwk8bmF0dXJlcz4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQorCTwvbmF0dXJlcz4NCis8L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzA3MzlkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDggQEAKKyNXZWQgSnVsIDE1IDEyOjA3OjI0IFBEVCAyMDA5DQorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1YjZmMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDIzIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjANCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lDQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsO3NpbmdsZXRvbjo9dHJ1ZQ0KK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXINCitCdW5kbGUtQ2xhc3NQYXRoOiAuDQorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLnByb3ZpZGVyLkdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdFBsdWdpbiRJbXBsZW1lbnRhdGlvbg0KK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUNCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4NCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUNCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLA0KKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuaW1wbCwNCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLnByb3ZpZGVyLA0KKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwudXRpbA0KK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsDQorIG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHksDQorIG9yZy5lY2xpcHNlLmVtZi5lY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LA0KKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsDQorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnM7dmlzaWJpbGl0eTo9cmVleHBvcnQsDQorIG9yZy5lY2xpcHNlLmVtZi5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LA0KKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydA0KK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTIyYWU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNSBAQAorDQorIyA8Y29weXJpZ2h0Pg0KKyMgPC9jb3B5cmlnaHQ+DQorIw0KKyMgJElkJA0KKw0KK2Jpbi5pbmNsdWRlcyA9IC4sXA0KKyAgICAgICAgICAgICAgIG1vZGVsLyxcDQorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcDQorICAgICAgICAgICAgICAgaWNvbnMvDQoramFycy5jb21waWxlLm9yZGVyID0gLg0KK3NvdXJjZS4uID0gc3JjLw0KK291dHB1dC4uID0gYmluLw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9pY29ucy9mdWxsL29iajE2L0dsb2JhbEluZmx1ZW56YU1vZGVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9pY29ucy9mdWxsL29iajE2L0dsb2JhbEluZmx1ZW56YU1vZGVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTQwNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL2ljb25zL2Z1bGwvb2JqMTYvR2xvYmFsSW5mbHVlbnphTW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9pY29ucy9mdWxsL29iajE2L0dsb2JhbGluZmx1ZW56YW1vZGVsTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9pY29ucy9mdWxsL29iajE2L0dsb2JhbGluZmx1ZW56YW1vZGVsTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmI3MWVjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL2ljb25zL2Z1bGwvb2JqMTYvR2xvYmFsaW5mbHVlbnphbW9kZWxNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9pY29ucy9mdWxsL29iajE2L1RodW1icy5kYiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9pY29ucy9mdWxsL29iajE2L1RodW1icy5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2MwYjQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL2ljb25zL2Z1bGwvb2JqMTYvVGh1bWJzLmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9pY29ucy9mdWxsL3dpemJhbi9OZXdHbG9iYWxpbmZsdWVuemFtb2RlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvaWNvbnMvZnVsbC93aXpiYW4vTmV3R2xvYmFsaW5mbHVlbnphbW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NzQzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvaWNvbnMvZnVsbC93aXpiYW4vTmV3R2xvYmFsaW5mbHVlbnphbW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9tb2RlbC9nbG9iYWxpbmZsdWVuemFtb2RlbC5lY29yZSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9tb2RlbC9nbG9iYWxpbmZsdWVuemFtb2RlbC5lY29yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjQ2YjIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL21vZGVsL2dsb2JhbGluZmx1ZW56YW1vZGVsLmVjb3JlCkBAIC0wLDAgKzEsMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiDQorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCisgICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Imdsb2JhbGluZmx1ZW56YW1vZGVsIg0KKyAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwuZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwiPg0KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHbG9iYWxJbmZsdWVuemFNb2RlbCIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9tb2RlbC9zdGFuZGFyZC5lY29yZSMvL1N0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwiPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGF0aXR1ZGVTaWdtb2lkV2lkdGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiDQorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSI0LjUwIi8+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCINCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjIuMCIvPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW9kdWxhdGlvblBlcmlvZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSINCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjM2NS4yNTYzNjMwNTEiLz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vZHVsYXRpb25QaGFzZVNoaWZ0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIg0KKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMC4wIi8+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWFzb25hbE1vZHVsYXRpb25GbG9vciINCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjAuNiIvPg0KKyAgPC9lQ2xhc3NpZmllcnM+DQorPC9lY29yZTpFUGFja2FnZT4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvbW9kZWwvZ2xvYmFsaW5mbHVlbnphbW9kZWwuZ2VubW9kZWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvbW9kZWwvZ2xvYmFsaW5mbHVlbnphbW9kZWwuZ2VubW9kZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhNDhhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9tb2RlbC9nbG9iYWxpbmZsdWVuemFtb2RlbC5nZW5tb2RlbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIg0KKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIg0KKyAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjIg0KKyAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYyINCisgICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsIiByZWRpcmVjdGlvbj0iIg0KKyAgICBtb2RlbE5hbWU9Ikdsb2JhbGluZmx1ZW56YW1vZGVsIiBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLnByZXNlbnRhdGlvbi5HbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvclBsdWdpbiINCisgICAgdGVzdHNEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjIg0KKyAgICBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIuamF2YSIgY29tcGxpYW5jZUxldmVsPSI2LjAiIGNvcHlyaWdodEZpZWxkcz0iZmFsc2UiDQorICAgIHByb3ZpZGVyUm9vdEV4dGVuZHNDbGFzcz0iIiBlZGl0b3JQbHVnaW5JRD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmVkaXRvciINCisgICAgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvbW9kZWwvZGlzZWFzZW1vZGVscy5nZW5tb2RlbCMvL3N0YW5kYXJkIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vY29tbW9uIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vbW9kZWwgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9ncmFwaCAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL21vZGlmaWVyIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9zY2VuYXJpbyAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL3NlcXVlbmNlciAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL21vZGVsL2RlZmluaXRpb25zLmdlbm1vZGVsIy8vbGFiZWxzIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vc29sdmVyIg0KKyAgICBpbnRlcmZhY2VOYW1lUGF0dGVybj0iIj4NCisgIDxmb3JlaWduTW9kZWw+QG1vZGVsPC9mb3JlaWduTW9kZWw+DQorICA8Z2VuUGFja2FnZXMgcHJlZml4PSJHbG9iYWxpbmZsdWVuemFtb2RlbCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscyINCisgICAgICBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIiBlY29yZVBhY2thZ2U9Imdsb2JhbGluZmx1ZW56YW1vZGVsLmVjb3JlIy8iPg0KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJnbG9iYWxpbmZsdWVuemFtb2RlbC5lY29yZSMvL0dsb2JhbEluZmx1ZW56YU1vZGVsIj4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZ2xvYmFsaW5mbHVlbnphbW9kZWwuZWNvcmUjLy9HbG9iYWxJbmZsdWVuemFNb2RlbC9sYXRpdHVkZVNpZ21vaWRXaWR0aCIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBnbG9iYWxpbmZsdWVuemFtb2RlbC5lY29yZSMvL0dsb2JhbEluZmx1ZW56YU1vZGVsL3NlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50Ii8+DQorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGdsb2JhbGluZmx1ZW56YW1vZGVsLmVjb3JlIy8vR2xvYmFsSW5mbHVlbnphTW9kZWwvbW9kdWxhdGlvblBlcmlvZCIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBnbG9iYWxpbmZsdWVuemFtb2RlbC5lY29yZSMvL0dsb2JhbEluZmx1ZW56YU1vZGVsL21vZHVsYXRpb25QaGFzZVNoaWZ0Ii8+DQorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGdsb2JhbGluZmx1ZW56YW1vZGVsLmVjb3JlIy8vR2xvYmFsSW5mbHVlbnphTW9kZWwvc2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IiLz4NCisgICAgPC9nZW5DbGFzc2VzPg0KKyAgPC9nZW5QYWNrYWdlcz4NCis8L2dlbm1vZGVsOkdlbk1vZGVsPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTNmOWY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3BsdWdpbi5wcm9wZXJ0aWVzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNhNTA1ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/Pg0KKw0KKzwhLS0NCisgPGNvcHlyaWdodD4NCisgPC9jb3B5cmlnaHQ+DQorDQorICRJZCQNCistLT4NCisNCis8cGx1Z2luPg0KKyAgIDxleHRlbnNpb24NCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQuaXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcmllcyI+DQorICAgICAgPGZhY3RvcnkNCisgICAgICAgCQl1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsLmVjb3JlIg0KKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwucHJvdmlkZXIuR2xvYmFsaW5mbHVlbnphbW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSINCisgICAgICAgCQlzdXBwb3J0ZWRUeXBlcyA9IA0KKwkJCQkgICAgICAgICAib3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXINCisJCQkJICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcg0KKwkJCQkgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyDQorCQkJCSAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXINCisJCQkJICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UiIC8+DQorICAgPC9leHRlbnNpb24+DQorDQorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4NCisgICAgICA8cGFja2FnZQ0KKyAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwuZWNvcmUiDQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5HbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UiDQorICAgICAgICAgICAgZ2VuTW9kZWw9Im1vZGVsL2dsb2JhbGluZmx1ZW56YW1vZGVsLmdlbm1vZGVsIi8+DQorICAgPC9leHRlbnNpb24+DQorICAgPGV4dGVuc2lvbg0KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZGlzZWFzZW1vZGVsIj4NCisgICAgICA8Y2xhc3NkZWYNCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmltcGwuR2xvYmFsSW5mbHVlbnphTW9kZWxJbXBsIj4NCisgICAgICA8L2NsYXNzZGVmPg0KKyAgICAgIDxkdWJsaW5fY29yZQ0KKyAgICAgICAgICAgIGNhdGVnb3J5X2lkPSIvIg0KKyAgICAgICAgICAgIGNyZWF0b3I9IkphbWVzIEthdWZtYW4iDQorICAgICAgICAgICAgZGVzY3JpcHRpb249IkEgZ2xvYmFsIERpc2Vhc2UgTW9kZWwgdGhhdCBhZGp1c3RzIHNlYXNvbmFsIHRyYW5zbWlzc2lvbiBmb3JjaW5nIHdpdGggbGF0dGlkdWUiDQorICAgICAgICAgICAgaWRlbnRpZmllcj0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmR1Ymxpbl9jb3JlMSINCisgICAgICAgICAgICB0aXRsZT0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmR1Ymxpbl9jb3JlMSI+DQorICAgICAgPC9kdWJsaW5fY29yZT4NCisgICA8L2V4dGVuc2lvbj4NCisNCis8L3BsdWdpbj4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9HbG9iYWxJbmZsdWVuemFNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvR2xvYmFsSW5mbHVlbnphTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2ExZWEwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvR2xvYmFsSW5mbHVlbnphTW9kZWwuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoqDQorICogDQorICovDQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWw7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsOw0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGFuIEVNRiBNb2RlbC4NCisgKiANCisgKiBAbW9kZWwNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIEdsb2JhbEluZmx1ZW56YU1vZGVsICBleHRlbmRzIFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwgew0KKw0KKwkNCisvKioNCisgKiBMYXRpdHVkZSBvZiB0aGUgVHJvcGljIG9mIENhbmNlciBpbiBEZWdyZWVzIChUcm9waWMgb2YgQ2Fwcmljb3JuIGlzIC12ZSBvZiB0aGlzKS4NCisgKi8NCitwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBUUk9QSUNfT0ZfQ0FOQ0VSX0xBVElUVURFID0gMjMuNDM5NDQ0Ow0KKw0KKw0KKy8qKg0KKyAqIFRoZSBtb2R1bGF0aW9uIG9mIHRoZSB0cmFuc21pc3Npb24gY29lZmZpY2llbnQgb2YgaW5mbHVlbnphIGlzIExhdGl0dWRlIGRlcGVuZGVudC4NCisgKiBXZSBtb2RlbCB0aGlzIHdpdGggYSBzaWdtb2lkIGZ1bmN0aW9uIHRoYXQgZ29lcyBmcm9tIHplcm8gdG8gb25lDQorICogd2l0aCBjZW50ZXIgYXQgdGhlIHRyb3BpYyBvZiBjYW5jZXIsIGFuZCB0aGUgdHJvcGljIG9mIGNhcHJpY29ybi4NCisgKiBUaGUgZGVmYXVsdCB3aWR0aCBmYWN0b3IgaXMgNC41IHdoaWNoIGdpdmVzIHRoZSBzaWdtb2lkIGEgc2xvcGUgcHJvcG9ydGlvbmFsIHRvIHRoZSANCisgKiBvYnNlcnZlZCB2YXJpYXRpb24gaW4gc2Vhc29uYWwgZmx1IGVwaWRlbWljcyBhcyBhIGZ1bmN0aW9uIG9mIGxhdGl0dWRlIGluIEJyYXppbC4NCisgKiBTZWU6IGh0dHA6Ly9hamUub3hmb3Jkam91cm5hbHMub3JnL2NnaS9jb250ZW50L2Z1bGwvMTY1LzEyLzE0MzQNCisgKiANCisgKiBBcyBvdXIgc2lnbW9pZCB3ZSB1c2UgdGhlIGJhc2ljIGxvZ2lzdGljIGZ1bmN0aW9uIDEvMStleHAoLXgpIA0KKyAqIHNvDQorICogU2lnbW9pZCBGdW5jdGlvbiAobGF0KSAgPSBTZWFzb25hbE1vZHVsYXRpb25GbG9vci8oMS4wICsgZXhwKChUUk9QSUNfT0ZfQ0FOQ0VSX0xBVElUVURFIC0gYWJzKExhdCkpLi80LjUpICk7DQorICogVGhpcyBpcyBuZWFyIHplcm8gbmVhciB0aGUgZXF1YXRvciBhbmQgZ29lcyB0byBTZWFzb25hbE1vZHVsYXRpb25GbG9vciBhYm92ZSBhbmQgYmVsb3cgDQorICogdGhlIHRyb3BpY3MuDQorICogDQorICogQHJldHVybiB0aGUgTGF0aXR1ZGUgU2lnbW9pZCB3aWR0aA0KKyAqIEBtb2RlbCBkZWZhdWx0PSI0LjUwIg0KKyAqLw0KK2RvdWJsZSBnZXRMYXRpdHVkZVNpZ21vaWRXaWR0aCgpOw0KKw0KKy8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuR2xvYmFsSW5mbHVlbnphTW9kZWwjZ2V0TGF0aXR1ZGVTaWdtb2lkV2lkdGggPGVtPkxhdGl0dWRlIFNpZ21vaWQgV2lkdGg8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhdGl0dWRlIFNpZ21vaWQgV2lkdGg8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXRMYXRpdHVkZVNpZ21vaWRXaWR0aCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0TGF0aXR1ZGVTaWdtb2lkV2lkdGgoZG91YmxlIHZhbHVlKTsNCisNCisvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMi4wIjwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPHA+DQorICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKyAqIDwvcD4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudDwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KGRvdWJsZSkNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlI2dldEdsb2JhbEluZmx1ZW56YU1vZGVsX1NlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KCkNCisJICogQG1vZGVsIGRlZmF1bHQ9IjIuMCINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCitkb3VibGUgZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKTsNCisNCisvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLkdsb2JhbEluZmx1ZW56YU1vZGVsI2dldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50IDxlbT5TZWFzb25hbCBNb2R1bGF0aW9uIEV4cG9uZW50PC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRXhwb25lbnQ8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQordm9pZCBzZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudChkb3VibGUgdmFsdWUpOw0KKw0KKy8qKg0KKyAqIEByZXR1cm4gdGhlIGRlZmF1bHQgbW9kdWxhdGlvbiBwZXJpb2QgaXMgMSB5ZWFyLiBUaGlzIGRlZmF1bHQgdmFsdWUgYXNzdW1lcyB0aW1lIHN0ZXBzIGluIGRheXMuIE5vdGUgdGhhdCBvbmUgeWVhciA9IDM2NS4yNTYzNjMwNTEgZGF5cyANCisgKiBAbW9kZWwgZGVmYXVsdD0iMzY1LjI1NjM2MzA1MSINCisgKi8NCitkb3VibGUgZ2V0TW9kdWxhdGlvblBlcmlvZCgpOw0KKw0KKy8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuR2xvYmFsSW5mbHVlbnphTW9kZWwjZ2V0TW9kdWxhdGlvblBlcmlvZCA8ZW0+TW9kdWxhdGlvbiBQZXJpb2Q8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TW9kdWxhdGlvbiBQZXJpb2Q8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXRNb2R1bGF0aW9uUGVyaW9kKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCit2b2lkIHNldE1vZHVsYXRpb25QZXJpb2QoZG91YmxlIHZhbHVlKTsNCisNCisvKioNCisgKiBAcmV0dXJuIHRoZSBtb2R1bGF0aW9uIHBoYXNlIHNoaWZ0IHNoaWZ0LiANCisgKiBAbW9kZWwgZGVmYXVsdD0iMC4wIg0KKyAqLw0KK2RvdWJsZSBnZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCgpOw0KKw0KKy8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuR2xvYmFsSW5mbHVlbnphTW9kZWwjZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQgPGVtPk1vZHVsYXRpb24gUGhhc2UgU2hpZnQ8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TW9kdWxhdGlvbiBQaGFzZSBTaGlmdDwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCit2b2lkIHNldE1vZHVsYXRpb25QaGFzZVNoaWZ0KGRvdWJsZSB2YWx1ZSk7DQorDQorLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlYXNvbmFsIE1vZHVsYXRpb24gRmxvb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjAuNiI8L2NvZGU+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRmxvb3I8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKyAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisgKiA8L3A+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRmxvb3I8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXRTZWFzb25hbE1vZHVsYXRpb25GbG9vcihkb3VibGUpDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLkdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZSNnZXRHbG9iYWxJbmZsdWVuemFNb2RlbF9TZWFzb25hbE1vZHVsYXRpb25GbG9vcigpDQorCSAqIEBtb2RlbCBkZWZhdWx0PSIwLjYiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorZG91YmxlIGdldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCk7DQorDQorLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5HbG9iYWxJbmZsdWVuemFNb2RlbCNnZXRTZWFzb25hbE1vZHVsYXRpb25GbG9vciA8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBGbG9vcjwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZWFzb25hbCBNb2R1bGF0aW9uIEZsb29yPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KK3ZvaWQgc2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoZG91YmxlIHZhbHVlKTsNCit9IC8vIEdsb2JhbEluZmx1ZW56YU1vZGVsDQorDQorDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvR2xvYmFsaW5mbHVlbnphbW9kZWxGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9HbG9iYWxpbmZsdWVuemFtb2RlbEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDI1NmJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvR2xvYmFsaW5mbHVlbnphbW9kZWxGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWw7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLg0KKyAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLkdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZQ0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIEdsb2JhbGluZmx1ZW56YW1vZGVsRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsNCisJLyoqDQorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlHbG9iYWxpbmZsdWVuemFtb2RlbEZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmltcGwuR2xvYmFsaW5mbHVlbnphbW9kZWxGYWN0b3J5SW1wbC5pbml0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdsb2JhbCBJbmZsdWVuemEgTW9kZWw8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdsb2JhbCBJbmZsdWVuemEgTW9kZWw8L2VtPicuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUdsb2JhbEluZmx1ZW56YU1vZGVsIGNyZWF0ZUdsb2JhbEluZmx1ZW56YU1vZGVsKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZSBnZXRHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UoKTsNCisNCit9IC8vR2xvYmFsaW5mbHVlbnphbW9kZWxGYWN0b3J5DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9HbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjcyZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLmphdmEKQEAgLTAsMCArMSw1NTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuDQorICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudA0KKyAqIDx1bD4NCisgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+DQorICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4NCisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4NCisgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPg0KKyAqIDwvdWw+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuR2xvYmFsaW5mbHVlbnphbW9kZWxGYWN0b3J5DQorICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2Ugew0KKwkvKioNCisJICogVGhlIHBhY2thZ2UgbmFtZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBlTkFNRSA9ICJnbG9iYWxpbmZsdWVuemFtb2RlbCI7DQorDQorCS8qKg0KKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwuZWNvcmUiOw0KKw0KKwkvKioNCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwiOw0KKw0KKwkvKioNCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuaW1wbC5HbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2VJbXBsLmluaXQoKTsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmltcGwuR2xvYmFsSW5mbHVlbnphTW9kZWxJbXBsIDxlbT5HbG9iYWwgSW5mbHVlbnphIE1vZGVsPC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmltcGwuR2xvYmFsSW5mbHVlbnphTW9kZWxJbXBsDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmltcGwuR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlSW1wbCNnZXRHbG9iYWxJbmZsdWVuemFNb2RlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBHTE9CQUxfSU5GTFVFTlpBX01PREVMID0gMDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19VUkkgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fVFlQRV9VUkkgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fVFlQRV9VUkk7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19EVUJMSU5fQ09SRSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19EVUJMSU5fQ09SRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19MQUJFTFNfVE9fVVBEQVRFID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0xBQkVMU19UT19VUERBVEU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGg8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fR1JBUEggPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fR1JBUEg7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX0VOQUJMRUQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fRU5BQkxFRDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19HUkFQSF9ERUNPUkFURUQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fR1JBUEhfREVDT1JBVEVEOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2dyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fUFJPR1JFU1MgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUFJPR1JFU1M7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fVElNRV9QRVJJT0QgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0Q7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fRElTRUFTRV9OQU1FID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0RJU0VBU0VfTkFNRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWxhdGl2ZSBUb2xlcmFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0UgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUkVMQVRJVkVfVE9MRVJBTkNFOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbml0ZSBEaWZmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0UgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0U7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJlcXVlbmN5IERlcGVuZGVudDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX0ZSRVFVRU5DWV9ERVBFTkRFTlQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIEJpcnRoIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9CSVJUSF9SQVRFOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudCBSZWNpcHJvY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBBcmVhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fVE9UQUxfQVJFQSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19UT1RBTF9BUkVBOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBQb3B1bGF0aW9uIERlbnNpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFk7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNtaXNzaW9uIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19UUkFOU01JU1NJT05fUkFURSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob24gTGluZWFyaXR5IENvZWZmaWNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVCA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlY292ZXJ5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19SRUNPVkVSWV9SQVRFID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaHlzaWNhbGx5IEFkamFjZW50IEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWQgTmV0d29yayBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT047DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWSA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbW11bml0eSBMb3NzIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19JTU1VTklUWV9MT1NTX1JBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fSU1NVU5JVFlfTE9TU19SQVRFOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19TRUVEID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1NFRUQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZG9tIEdlbmVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1IgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HYWluPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fR0FJTiA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19HQUlOOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhdGl0dWRlIFNpZ21vaWQgV2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19MQVRJVFVERV9TSUdNT0lEX1dJRFRIID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX1NFQVNPTkFMX01PRFVMQVRJT05fRVhQT05FTlQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGF0aW9uIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDI7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxhdGlvbiBQaGFzZSBTaGlmdDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX01PRFVMQVRJT05fUEhBU0VfU0hJRlQgPSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMzsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWFzb25hbCBNb2R1bGF0aW9uIEZsb29yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUiA9IFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkdsb2JhbCBJbmZsdWVuemEgTW9kZWw8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9GRUFUVVJFX0NPVU5UID0gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDU7DQorDQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuR2xvYmFsSW5mbHVlbnphTW9kZWwgPGVtPkdsb2JhbCBJbmZsdWVuemEgTW9kZWw8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R2xvYmFsIEluZmx1ZW56YSBNb2RlbDwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuR2xvYmFsSW5mbHVlbnphTW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldEdsb2JhbEluZmx1ZW56YU1vZGVsKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5HbG9iYWxJbmZsdWVuemFNb2RlbCNnZXRMYXRpdHVkZVNpZ21vaWRXaWR0aCA8ZW0+TGF0aXR1ZGUgU2lnbW9pZCBXaWR0aDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhdGl0dWRlIFNpZ21vaWQgV2lkdGg8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLkdsb2JhbEluZmx1ZW56YU1vZGVsI2dldExhdGl0dWRlU2lnbW9pZFdpZHRoKCkNCisJICogQHNlZSAjZ2V0R2xvYmFsSW5mbHVlbnphTW9kZWwoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldEdsb2JhbEluZmx1ZW56YU1vZGVsX0xhdGl0dWRlU2lnbW9pZFdpZHRoKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5HbG9iYWxJbmZsdWVuemFNb2RlbCNnZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCA8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRXhwb25lbnQ8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLkdsb2JhbEluZmx1ZW56YU1vZGVsI2dldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KCkNCisJICogQHNlZSAjZ2V0R2xvYmFsSW5mbHVlbnphTW9kZWwoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldEdsb2JhbEluZmx1ZW56YU1vZGVsX1NlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5HbG9iYWxJbmZsdWVuemFNb2RlbCNnZXRNb2R1bGF0aW9uUGVyaW9kIDxlbT5Nb2R1bGF0aW9uIFBlcmlvZDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1vZHVsYXRpb24gUGVyaW9kPC9lbT4nLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5HbG9iYWxJbmZsdWVuemFNb2RlbCNnZXRNb2R1bGF0aW9uUGVyaW9kKCkNCisJICogQHNlZSAjZ2V0R2xvYmFsSW5mbHVlbnphTW9kZWwoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldEdsb2JhbEluZmx1ZW56YU1vZGVsX01vZHVsYXRpb25QZXJpb2QoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLkdsb2JhbEluZmx1ZW56YU1vZGVsI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0IDxlbT5Nb2R1bGF0aW9uIFBoYXNlIFNoaWZ0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW9kdWxhdGlvbiBQaGFzZSBTaGlmdDwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuR2xvYmFsSW5mbHVlbnphTW9kZWwjZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoKQ0KKwkgKiBAc2VlICNnZXRHbG9iYWxJbmZsdWVuemFNb2RlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0R2xvYmFsSW5mbHVlbnphTW9kZWxfTW9kdWxhdGlvblBoYXNlU2hpZnQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLkdsb2JhbEluZmx1ZW56YU1vZGVsI2dldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yIDxlbT5TZWFzb25hbCBNb2R1bGF0aW9uIEZsb29yPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2Vhc29uYWwgTW9kdWxhdGlvbiBGbG9vcjwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuR2xvYmFsSW5mbHVlbnphTW9kZWwjZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKQ0KKwkgKiBAc2VlICNnZXRHbG9iYWxJbmZsdWVuemFNb2RlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0R2xvYmFsSW5mbHVlbnphTW9kZWxfU2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUdsb2JhbGluZmx1ZW56YW1vZGVsRmFjdG9yeSBnZXRHbG9iYWxpbmZsdWVuemFtb2RlbEZhY3RvcnkoKTsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQNCisJICogPHVsPg0KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+DQorCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+DQorCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPg0KKwkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPg0KKwkgKiA8L3VsPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50ZXJmYWNlIExpdGVyYWxzIHsNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5pbXBsLkdsb2JhbEluZmx1ZW56YU1vZGVsSW1wbCA8ZW0+R2xvYmFsIEluZmx1ZW56YSBNb2RlbDwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5pbXBsLkdsb2JhbEluZmx1ZW56YU1vZGVsSW1wbA0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuaW1wbC5HbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2VJbXBsI2dldEdsb2JhbEluZmx1ZW56YU1vZGVsKCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIEdMT0JBTF9JTkZMVUVOWkFfTU9ERUwgPSBlSU5TVEFOQ0UuZ2V0R2xvYmFsSW5mbHVlbnphTW9kZWwoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxhdGl0dWRlIFNpZ21vaWQgV2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIEdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX0xBVElUVURFX1NJR01PSURfV0lEVEggPSBlSU5TVEFOQ0UuZ2V0R2xvYmFsSW5mbHVlbnphTW9kZWxfTGF0aXR1ZGVTaWdtb2lkV2lkdGgoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlYXNvbmFsIE1vZHVsYXRpb24gRXhwb25lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIEdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX1NFQVNPTkFMX01PRFVMQVRJT05fRVhQT05FTlQgPSBlSU5TVEFOQ0UuZ2V0R2xvYmFsSW5mbHVlbnphTW9kZWxfU2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZHVsYXRpb24gUGVyaW9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19NT0RVTEFUSU9OX1BFUklPRCA9IGVJTlNUQU5DRS5nZXRHbG9iYWxJbmZsdWVuemFNb2RlbF9Nb2R1bGF0aW9uUGVyaW9kKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGF0aW9uIFBoYXNlIFNoaWZ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZUID0gZUlOU1RBTkNFLmdldEdsb2JhbEluZmx1ZW56YU1vZGVsX01vZHVsYXRpb25QaGFzZVNoaWZ0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWFzb25hbCBNb2R1bGF0aW9uIEZsb29yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0ZMT09SID0gZUlOU1RBTkNFLmdldEdsb2JhbEluZmx1ZW56YU1vZGVsX1NlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCk7DQorDQorCX0NCisNCit9IC8vR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvaW1wbC9HbG9iYWxJbmZsdWVuemFNb2RlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL2ltcGwvR2xvYmFsSW5mbHVlbnphTW9kZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiYWQyZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL2ltcGwvR2xvYmFsSW5mbHVlbnphTW9kZWxJbXBsLmphdmEKQEAgLTAsMCArMSw2MjEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmltcGw7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuY2VudGVycy5HZW9ncmFwaGljQ2VudGVyczsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5pbXBsLlJlZ2lvbkltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5BY3RpdmF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5HbG9iYWxJbmZsdWVuemFNb2RlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLkdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbFZhbHVlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lSTGFiZWxWYWx1ZUltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxJbXBsOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdsb2JhbCBJbmZsdWVuemEgTW9kZWw8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmltcGwuR2xvYmFsSW5mbHVlbnphTW9kZWxJbXBsI2dldExhdGl0dWRlU2lnbW9pZFdpZHRoIDxlbT5MYXRpdHVkZSBTaWdtb2lkIFdpZHRoPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmltcGwuR2xvYmFsSW5mbHVlbnphTW9kZWxJbXBsI2dldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50IDxlbT5TZWFzb25hbCBNb2R1bGF0aW9uIEV4cG9uZW50PC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmltcGwuR2xvYmFsSW5mbHVlbnphTW9kZWxJbXBsI2dldE1vZHVsYXRpb25QZXJpb2QgPGVtPk1vZHVsYXRpb24gUGVyaW9kPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmltcGwuR2xvYmFsSW5mbHVlbnphTW9kZWxJbXBsI2dldE1vZHVsYXRpb25QaGFzZVNoaWZ0IDxlbT5Nb2R1bGF0aW9uIFBoYXNlIFNoaWZ0PC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmltcGwuR2xvYmFsSW5mbHVlbnphTW9kZWxJbXBsI2dldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yIDxlbT5TZWFzb25hbCBNb2R1bGF0aW9uIEZsb29yPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgR2xvYmFsSW5mbHVlbnphTW9kZWxJbXBsIGV4dGVuZHMgU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwgaW1wbGVtZW50cyBHbG9iYWxJbmZsdWVuemFNb2RlbCB7DQorDQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBNSUxMSVNfUEVSX0RBWSA9IDEwMDAuMCo2MC4wKjYwLjAqMjQuMDsNCisJDQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGF0aXR1ZGVTaWdtb2lkV2lkdGgoKSA8ZW0+TGF0aXR1ZGUgU2lnbW9pZCBXaWR0aDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0TGF0aXR1ZGVTaWdtb2lkV2lkdGgoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBMQVRJVFVERV9TSUdNT0lEX1dJRFRIX0VERUZBVUxUID0gNC41Ow0KKwkNCisJLyoqDQorCSAqIHRoZSBlcXVhdG9yDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgRVFVQVRPUl9MQVRJVFVERSA9IDAuMDsNCisJDQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXRpdHVkZVNpZ21vaWRXaWR0aCgpIDxlbT5MYXRpdHVkZSBTaWdtb2lkIFdpZHRoPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRMYXRpdHVkZVNpZ21vaWRXaWR0aCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBkb3VibGUgbGF0aXR1ZGVTaWdtb2lkV2lkdGggPSBMQVRJVFVERV9TSUdNT0lEX1dJRFRIX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KCkgPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRXhwb25lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgU0VBU09OQUxfTU9EVUxBVElPTl9FWFBPTkVOVF9FREVGQVVMVCA9IDIuMDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KCkgPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRXhwb25lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGRvdWJsZSBzZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCA9IFNFQVNPTkFMX01PRFVMQVRJT05fRVhQT05FTlRfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TW9kdWxhdGlvblBlcmlvZCgpIDxlbT5Nb2R1bGF0aW9uIFBlcmlvZDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0TW9kdWxhdGlvblBlcmlvZCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIE1PRFVMQVRJT05fUEVSSU9EX0VERUZBVUxUID0gMzY1LjI1NjM2MzA1MTsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vZHVsYXRpb25QZXJpb2QoKSA8ZW0+TW9kdWxhdGlvbiBQZXJpb2Q8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25QZXJpb2QoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgZG91YmxlIG1vZHVsYXRpb25QZXJpb2QgPSBNT0RVTEFUSU9OX1BFUklPRF9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCgpIDxlbT5Nb2R1bGF0aW9uIFBoYXNlIFNoaWZ0PC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIE1PRFVMQVRJT05fUEhBU0VfU0hJRlRfRURFRkFVTFQgPSAwLjA7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCgpIDxlbT5Nb2R1bGF0aW9uIFBoYXNlIFNoaWZ0PC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBkb3VibGUgbW9kdWxhdGlvblBoYXNlU2hpZnQgPSBNT0RVTEFUSU9OX1BIQVNFX1NISUZUX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCkgPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRmxvb3I8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUl9FREVGQVVMVCA9IDAuNjsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCkgPGVtPlNlYXNvbmFsIE1vZHVsYXRpb24gRmxvb3I8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGRvdWJsZSBzZWFzb25hbE1vZHVsYXRpb25GbG9vciA9IFNFQVNPTkFMX01PRFVMQVRJT05fRkxPT1JfRURFRkFVTFQ7DQorCQ0KKwlwdWJsaWMgc3RhdGljIGxvbmcgZmlyc3REYXkgPSAtMTsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIEdsb2JhbEluZmx1ZW56YU1vZGVsSW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQorCQlyZXR1cm4gR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLkxpdGVyYWxzLkdMT0JBTF9JTkZMVUVOWkFfTU9ERUw7DQorCX0NCisNCisJDQorDQorCS8qKg0KKwkgKiBUbyBtb2RlbCBpbmZsdWVuemEgb24gYSBnbG9iYWwgc2NhbGUsIHRoaXMgbWV0aG9kIHRha2VzIGludG8gYWNjb3VudA0KKwkgKiB0aGUgbW9kdWxhdGlvbiBvZiB0aGUgdHJhbnNtaXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSB2aXJ1cyBhcyBhIGZ1bmN0aW9uIG9mIExhdGl0dWRlLg0KKwkgKiBOZWFyIHRoZSB0cm9waWNzIHRoZSB0cmFuc21pc3Npb24gY29lZmZpY2llbnQgaXMgYWxtb3N0IGNvbnN0YW50IChhbmQgYXQgYSB2YWx1ZQ0KKwkgKiBjYWxsZWQgdGhlIFNFQVNPTkFMX01PRFVMQVRJT05fRkxPT1IuDQorCSAqIEFzIG9uZSBtb3ZlZCBpbiBsYXRpdHVkZSBhd2F5IGZyb20gdGhlIHRyb3BpY3MgdGhlIG1vZHVsYXRpb24gKGFuZCBNQVhJTVVNKSBhbXBsaXR1ZGUgb2YgdGhlIA0KKwkgKiB0cmFuc21pc3Npb24gY29lZmZpY2llbnQgaW5jcmVhc2VzLiBXZSBtb2RlbCB0aGlzIHNlYXNvbmFsIGluY3JlYXNlIAkgDQorCSAqIFdlIG1vZGVsIHRoaXMgd2l0aCBhIHNpZ21vaWRhbCBmdW5jdGlvbiB0aGF0IGdvZXMgZnJvbSB6ZXJvIHRvIG9uZQ0KKwkgKiB3aXRoIGNlbnRlciBhdCB0aGUgdHJvcGljIG9mIGNhbmNlciwgYW5kIHRoZSB0cm9waWMgb2YgQ2Fwcmljb3JuLg0KKwkgKiBUaGUgZGVmYXVsdCB3aWR0aCBmYWN0b3IgaXMgNC41IHdoaWNoIGdpdmVzIHRoZSBzaWdtb2lkIGEgc2xvcGUgcHJvcG9ydGlvbmFsIHRvIHRoZSANCisJICogb2JzZXJ2ZWQgdmFyaWF0aW9uIGluIHNlYXNvbmFsIGluZmx1ZW56YSBlcGlkZW1pY3MgYXMgYSBmdW5jdGlvbiBvZiBsYXRpdHVkZSBpbiBCcmF6aWwuDQorCSAqIFNlZTogaHR0cDovL2FqZS5veGZvcmRqb3VybmFscy5vcmcvY2dpL2NvbnRlbnQvZnVsbC8xNjUvMTIvMTQzNA0KKwkgKiANCisJICogQXMgb3VyIHNpZ21vaWQgd2UgdXNlIHRoZSBiYXNpYyBsb2dpc3RpYyBmdW5jdGlvbiAxLzErZXhwKC14KSANCisJICogc28NCisJICogU2lnbW9pZCBGdW5jdGlvbiAobGF0KSAgPSBTZWFzb25hbE1vZHVsYXRpb25GbG9vci8oMS4wICsgZXhwKChUUk9QSUNfT0ZfQ0FOQ0VSX0xBVElUVURFIC0gYWJzKExhdCkpLi80LjUpICk7DQorCSAqIFRoaXMgaXMgbmVhciB6ZXJvIG5lYXIgdGhlIGVxdWF0b3IgYW5kIGdvZXMgdG8gU2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IgYWJvdmUgYW5kIGJlbG93IA0KKwkgKiB0aGUgdHJvcGljcy4NCisJICogDQorCSAqIA0KKwkgKiBAcGFyYW0gdGltZQ0KKwkgKiAJCQkgIGN1cnJlbnQgdGltZQ0KKwkgKiBAcGFyYW0gY3VycmVudFN0YXRlDQorCSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvcHVsYXRpb24NCisJICogQHBhcmFtIGRpc2Vhc2VMYWJlbA0KKwkgKiAgICAgICAgICAgIHRoZSBkaXNlYXNlIGxhYmVsIGZvciB3aGljaCB0aGUgc3RhdGUgdHJhbnNpdGlvbnMgYXJlIGJlaW5nDQorCSAqICAgICAgICAgICAgY29tcHV0ZWQuDQorCSAqIEBwYXJhbSB0aW1lRGVsdGENCisJICogICAgICAgICAgICB0aGUgdGltZSBwZXJpb2QgKG1pbGxpc2Vjb25kcykgb3ZlciB3aGljaCB0aGUgcG9wdWxhdGlvbg0KKwkgKiAgICAgICAgICAgIG1lbWJlcnMgdHJhbnNpdGlvbiB0byBuZXcgc3RhdGVzICAgICAgICAgIA0KKwkgKiBAcmV0dXJuIGEgZGlzZWFzZSBzdGF0ZSBsYWJlbCB2YWx1ZSB0aGF0IGNvbnRhaW5zIHRoZSBudW1iZXIgb2YNCisJICogICAgICAgICBkZWx0YSBjaGFuZ2VzIGluIGVhY2ggZGlzZWFzZSBzdGF0ZQ0KKwkgKiANCisJICogVXNlcnMgY2FuIG1vZGlmeSB0aGUgbWV0aG9kIGJlbG93IHRvIGNyZWF0ZSB0aGVpciBvd24gbW9kZWwuDQorCSAqIA0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJSW1wbCNjb21wdXRlRGlzZWFzZURlbHRhcyhTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUsDQorCSAqICAgICAgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCwgbG9uZykNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGNvbXB1dGVEaXNlYXNlRGVsdGFzKA0KKwkJCWZpbmFsIFNURU1UaW1lIHRpbWUsDQorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGN1cnJlbnRTdGF0ZSwNCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VMYWJlbCwgZmluYWwgbG9uZyB0aW1lRGVsdGEsIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgcmV0dXJuVmFsdWUpIHsNCisJCQlmaW5hbCBTSVJMYWJlbFZhbHVlIGN1cnJlbnRTSVIgPSAoU0lSTGFiZWxWYWx1ZSkgY3VycmVudFN0YXRlOw0KKwkJDQorCQlsb25nIGN1cnJlbnRNaWxsaXMgPSB0aW1lLmdldFRpbWUoKS5nZXRUaW1lKCk7DQorCQlkb3VibGUgc2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQgPSBnZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCgpOw0KKwkJZG91YmxlIHNlYXNvbmFsTW9kdWxhdGlvbkZsb29yID0gZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKTsNCisJCWRvdWJsZSBtb2R1bGF0aW9uUGVyaW9kID0gZ2V0TW9kdWxhdGlvblBlcmlvZCgpOw0KKwkJZmluYWwgZG91YmxlIGFic29sdXRlUGhhc2UgPSBnZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCgpOwkNCisJCQ0KKwkJDQorCQkvKioNCisJCSAqIHRoZSBsYXRpdHVkZSBvZiB0aGlzIHJlZ2lvbnMNCisJCSAqLw0KKwkJZG91YmxlIGxhdGl0dWRlID0gRVFVQVRPUl9MQVRJVFVERTsNCisNCisJCQ0KKwkJLyoqDQorCQkgKiB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGNlbnRlciBvZiB0aGlzIHJlZ2lvbnMNCisJCSAqLw0KKwkJZG91YmxlW10gbGF0X2xvbmcgPSBudWxsOw0KKwkJDQorCQlpZiAoZmlyc3REYXkgPT0gLTEpIHsNCisJCQlmaXJzdERheSA9IGN1cnJlbnRNaWxsaXM7DQorCQl9DQorCQkNCisJCU5vZGUgbm9kZSA9IGRpc2Vhc2VMYWJlbC5nZXROb2RlKCk7DQorCQkNCisJCWlmKG5vZGUgaW5zdGFuY2VvZiBSZWdpb25JbXBsKSB7DQorCQkJU3RyaW5nIG5vZGVVUkkgPSBub2RlLmdldFVSSSgpLmxhc3RTZWdtZW50KCk7DQorCQkJbGF0X2xvbmcgPSBHZW9ncmFwaGljQ2VudGVycy5nZXRDZW50ZXIobm9kZVVSSSk7DQorCQkJLy8gc3RpbGwgbnVsbD8gQ29tcHV0ZSBpdA0KKwkJCWlmKGxhdF9sb25nPT1udWxsKSB7DQorCQkJCS8vIEdldCB0aGUgbGF0L2xvbmcgb2YgdGhlIGNlbnRlciBvZiB0aGUgbm9kZQ0KKwkJCQlmaW5hbCBMYXRMb25nUHJvdmlkZXJBZGFwdGVyIGxhdExvbmdQcm92aWRlckIgPSAoTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlcikgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UNCisJCQkJCQkuYWRhcHQobm9kZSwgTGF0TG9uZ1Byb3ZpZGVyLmNsYXNzKTsNCisJCQkJbGF0TG9uZ1Byb3ZpZGVyQi5zZXRUYXJnZXQobm9kZSk7DQorCQkJCWxhdF9sb25nID0gbGF0TG9uZ1Byb3ZpZGVyQi5nZXRDZW50ZXIoKTsNCisJCQl9DQorCQkJaWYgKGxhdF9sb25nID09IG51bGwpIHsNCisJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJDYW5ub3QgZmluZCBsYXRpdHVkZSBmb3IgIisgbm9kZVVSSSwgbnVsbCk7DQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlsYXRfbG9uZyA9IG5ldyBkb3VibGVbMl07DQorCQkJbGF0X2xvbmdbMF0gPSBFUVVBVE9SX0xBVElUVURFOw0KKwkJCWxhdF9sb25nWzFdID0gRVFVQVRPUl9MQVRJVFVERTsgLy8gbm90IHVzZWQuIHNldHMgaXQgdG8gMCwwDQorCQl9DQorDQorDQorCQkvLyBnZXQgdGhlIGxhdGl0dWRlDQorCQlpZihsYXRfbG9uZyAhPSBudWxsKSB7DQorCQkJbGF0aXR1ZGUgPSBsYXRfbG9uZ1swXSA7DQorCQl9IA0KKwkJDQorCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkJLy8gY29ycmVjdHMgcGhhc2UgZm9yIG5vcnRoZXJuIHZzIHNvdXRoZXJuIGhlbWlzcGhlcmUNCisJCWRvdWJsZSBwaGFzZSA9IGFic29sdXRlUGhhc2U7DQorCQlpZihsYXRpdHVkZTwwLjApIHBoYXNlICs9IE1hdGguUEkvMi4wOw0KKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJCQ0KKwkJDQorCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJCS8vIG5vdyBjb21wdXRlIHRoZSB0cmFuc21pc3Npb24gcmF0ZQ0KKwkJLy8gd2l0aCB0aGUgc2Vhc29uYWwgZm9yY2luZyBmdW5jdGlvbg0KKwkJLy8gYWRqdXN0ZWQgYnkgbGF0aXR1ZGUNCisJCWRvdWJsZSBsYXRGYWN0b3IgID0gc2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IvKDEuMCArIE1hdGguZXhwKChUUk9QSUNfT0ZfQ0FOQ0VSX0xBVElUVURFIC0gTWF0aC5hYnMobGF0aXR1ZGUpKS9sYXRpdHVkZVNpZ21vaWRXaWR0aCkgKTsNCisJCWxhdEZhY3RvciAqPSBNYXRoLnBvdyhNYXRoLmFicyhNYXRoLmNvcyhwaGFzZSArIE1hdGguUEkqY3VycmVudE1pbGxpcy8obW9kdWxhdGlvblBlcmlvZCpNSUxMSVNfUEVSX0RBWSkpKSwgc2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQpOw0KKwkJZG91YmxlIG1vZHVsYXRpb24gPSAoICgxLjAtKHNlYXNvbmFsTW9kdWxhdGlvbkZsb29yLzIuMCkpICsgKGxhdEZhY3Rvci8yLjApICk7DQorCQkvLyBUaGlzIGlzIGJldGENCisJCWRvdWJsZSB0cmFuc21pc3Npb25SYXRlID0gbW9kdWxhdGlvbiAqIChnZXRBZGp1c3RlZFRyYW5zbWlzc2lvblJhdGUodGltZURlbHRhKSk7DQorCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkJDQorCQkvL0xvZ1dyaXRlci53cml0ZShsYXRpdHVkZSArIiwiKyBNYXRoLnJvdW5kKChjdXJyZW50TWlsbGlzIC0gZmlyc3REYXkpLzg2NDAwMDAwKSArIiwiICsgdHJhbnNtaXNzaW9uUmF0ZSk7DQorCQkNCisJCWlmKCF0aGlzLmlzRnJlcXVlbmN5RGVwZW5kZW50KCkpICB0cmFuc21pc3Npb25SYXRlICo9IGdldFRyYW5zbWlzc2lvblJhdGVTY2FsZUZhY3RvcihkaXNlYXNlTGFiZWwpOw0KKwkJDQorCQkvLyBUaGUgZWZmZWN0aXZlIEluZmVjdGlvdXMgcG9wdWxhdGlvbiAgaXMgYSBkaW1lbnNpb25sZXMgbnVtYmVyIG5vcm1hbGl6ZSBieSB0b3RhbA0KKwkJLy8gcG9wdWxhdGlvbiB1c2VkIGluIHRlaCBjb21wdXRhdGlvbiBvZiBiZXRzKlMqaSB3aGVyZSBpID0gSWVmZmVjdGl2ZS9Qb3AuDQorCQkvLyBUaGlzIGluY2x1ZGVzIGEgY29ycmVjdGlvbiB0byB0aGUgY3VycmVudA0KKwkJLy8gaW5mZWN0aW91cyBwb3B1bGF0aW9uIChJZWZmZWN0aXZlKSBiYXNlZCBvbiB0aGUgY29uc2VydmVkIGV4Y2hhbmdlIG9mIHBlb3BsZSAoY2lyY3VsYXRpb24pDQorCQkvLyBiZXR3ZWVuIHJlZ2lvbnMuIE5vdGUgdGhhdCB0aGlzIGlzIG5vIHRoZSAiYXJyaXZhbHMiIGFuZCAiZGVwYXJ0dXJlcyIgd2hpY2ggYXJlDQorCQkvLyBhIGRpZmZlcmVudCBwcm9jZXNzLg0KKwkJZmluYWwgZG91YmxlIGVmZmVjdGl2ZUluZmVjdGlvdXMgPSBnZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cyhkaXNlYXNlTGFiZWwuZ2V0Tm9kZSgpLCBkaXNlYXNlTGFiZWwsIGN1cnJlbnRTSVIuZ2V0SSgpKTsNCisNCisJCS8qDQorCQkgKiBDb21wdXRlIHN0YXRlIHRyYW5zaXRpb25zDQorCQkgKiANCisJCSAqIFJlZ2FyZGluZyBjb21wdXRpbmcgdGhlIG51bWJlciBvZiB0cmFuc2l0aW9ucyBmcm9tIFN1c2NlcHRpYmxlIHRvIEV4cG9zZWQ6DQorCQkgKiBJbiBhIGxpbmVhciBtb2RlbCB0aGUgImVmZmVjdGl2ZSIgbnVtYmVyIG9mIGluZmVjdGlvdXMgcGVvcGxlIGlzIGp1c3QNCisJCSAqIHRoZSBudW1iZXIgb2YgaW5mZWN0aW91cyBwZW9wbGUgSW4gYSBub25saW5lYXIgbW9kZWwgd2UgaGF2ZSBhDQorCQkgKiBub25MaW5lYXJpdHkgZXhwb25lbnQgdGhhdCBpcyA+IDEgdGhpcyBtb2RlbHMgdGhlIGVmZmVjdCBvZiBpbW11bmUNCisJCSAqIHN5c3RlbSBzYXR1cmF0aW9uIHdoZW4gU3VzY2VwdGlibGUgcGVvcGxlIGFyZSBleHBvc2VkIHRvIGxhcmdlDQorCQkgKiBudW1iZXJzIG9mIGluZmVjdGlvdXMgcGVvcGxlLiB0aGVuIHRoZSAiZWZmZWN0aXZlIiBudW1iZXIgb2YNCisJCSAqIGluZmVjdGlvdXMgcGVvcGxlIGlzIElebm9uTGluZWFyaXR5IGV4cG9uZW50IHRvIGFsbG93IGZvciBlaXRoZXINCisJCSAqIGxpbmVhciBvciBub25saW5lYXIgbW9kZWxzIHdlIGFsd2F5cyBjYWxjdWxhdGUgSV5ub25MaW5lYXJpdHkNCisJCSAqIGV4cG9uZW50IGFuZCBhbGxvdyBub25MaW5lYXJpdHkgZXhwb25lbnQgPj0gMS4wDQorCQkgKi8NCisJCWRvdWJsZSBudW1iZXJPZkluZmVjdGVkVG9SZWNvdmVyZWQgPSBnZXRBZGp1c3RlZFJlY292ZXJ5UmF0ZSh0aW1lRGVsdGEpDQorCQkqIGN1cnJlbnRTSVIuZ2V0SSgpOw0KKwkJZG91YmxlIG51bWJlck9mUmVjb3ZlcmVkVG9TdXNjZXB0aWJsZSA9IGdldEFkanVzdGVkSW1tdW5pdHlMb3NzUmF0ZSh0aW1lRGVsdGEpDQorCQkqIGN1cnJlbnRTSVIuZ2V0UigpOw0KKwkJLy8gTmVlZCB0byBjaGVja2VkIHdoYXQgZG8gZG8gaGVyZS4gSWYgbm9uIGxpbmVhciBjb2VmZmljaWVudCBpcyBub3QgMSBhbmQNCisJCS8vIHRoZSBlZmZlY3RpdmUgaW5mZWN0aW91cyBpcyBuZWdhdGl2ZSAod2hpY2ggaXMgcG9zc2libGUpLCB3aGF0IGRvIGRvPyANCisJCS8vIExldCdzIGZhbGwgYmFjayBvbiB0aGUgbGluZWFyIG1ldGhvZCBmb3Igbm93Lg0KKwkJZG91YmxlIG51bWJlck9mU3VzY2VwdGlibGVUb0luZmVjdGVkID0gMC4wOw0KKwkJaWYoZ2V0Tm9uTGluZWFyaXR5Q29lZmZpY2llbnQoKSAhPSAxLjAgJiYgZWZmZWN0aXZlSW5mZWN0aW91cyA+PSAwLjApDQorCQkJbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgPSB0cmFuc21pc3Npb25SYXRlDQorCQkJKiBjdXJyZW50U0lSLmdldFMoKSogTWF0aC5wb3coZWZmZWN0aXZlSW5mZWN0aW91cywgZ2V0Tm9uTGluZWFyaXR5Q29lZmZpY2llbnQoKSk7DQorCQllbHNlDQorCQkJbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgPSB0cmFuc21pc3Npb25SYXRlDQorCQkJKiBjdXJyZW50U0lSLmdldFMoKSogZWZmZWN0aXZlSW5mZWN0aW91czsNCisJCQ0KKwkJLy8gRGV0ZXJtaW5lIGRlbHRhIFMNCisJCWZpbmFsIGRvdWJsZSBkZWx0YVMgPSBudW1iZXJPZlJlY292ZXJlZFRvU3VzY2VwdGlibGUgLSBudW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZDsNCisJCQkvLyBEZXRlcm1pbmUgZGVsdGEgSQ0KKwkJZmluYWwgZG91YmxlIGRlbHRhSSA9IG51bWJlck9mU3VzY2VwdGlibGVUb0luZmVjdGVkLSBudW1iZXJPZkluZmVjdGVkVG9SZWNvdmVyZWQ7DQorCQkvLyBEZXRlcm1pbmUgZGVsdGEgUg0KKwkJZmluYWwgZG91YmxlIGRlbHRhUiA9IG51bWJlck9mSW5mZWN0ZWRUb1JlY292ZXJlZCAtIG51bWJlck9mUmVjb3ZlcmVkVG9TdXNjZXB0aWJsZTsNCisJCQ0KKwkJU0lSTGFiZWxWYWx1ZUltcGwgcmV0ID0gKFNJUkxhYmVsVmFsdWVJbXBsKXJldHVyblZhbHVlOw0KKwkJcmV0LnNldFMoZGVsdGFTKTsNCisJCXJldC5zZXRJKGRlbHRhSSk7DQorCQlyZXQuc2V0SW5jaWRlbmNlKG51bWJlck9mSW5mZWN0ZWRUb1JlY292ZXJlZCk7DQorCQlyZXQuc2V0UihkZWx0YVIpOw0KKwkJcmV0LnNldERpc2Vhc2VEZWF0aHMoMCk7DQorCQlyZXR1cm4gcmV0Ow0KKwl9IC8vIGNvbXB1dGVUcmFuc2l0aW9ucw0KKw0KKwkNCisJDQorCS8qKg0KKwkgKiBNb2RlbFNwZWNpZmljQWRqdXN0bWVudHMgZm9yIGEgU3RvY2hhc3RpYyBtb2RlbCBhZGRzIG5vaXNlIHRvIG9yIGFkanVzdHMgDQorCSAqIHRoZSBkaXNlYXNlIHN0YXRlIHRyYW5zaXRpb24gdmFsdWVzIGJ5IG11bHRpcGx5aW5nDQorCSAqIHRoZSBhZGRpdGlvbnMgYnkgYSByYW5kb20gdmFyaWFibGUgciB+ICgxKy8teCkgd2l0aCB4IHNtYWxsLg0KKwkgKiBUaGUgcmVxdWlyZW1lbnRzIHRoYXQgbm8gbW9yZSBpbmRpdmlkdWFscyBjYW4gYmUgbW92ZWQgZnJvbSBhIHN0YXRlIHRoYW4gYXJlDQorCSAqIGFscmVhZHkgaW4gdGhhdCBzdGF0ZSBpcyBzdGlsbCBlbmZvcmNlZC4NCisJICogDQorCSAqLw0KKwkNCisJcHVibGljIHZvaWQgZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoDQorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHN0YXRlKSB7DQorCQkJZmluYWwgU0lMYWJlbFZhbHVlIGN1cnJlbnRTSSA9IChTSUxhYmVsVmFsdWUpIHN0YXRlOw0KKwkJCWRvdWJsZSBpbmNpZGVuY2UgPSBzdGF0ZS5nZXRJbmNpZGVuY2UoKTsNCisJCQlkb3VibGUgbmV3SW5jaWRlbmNlID0gaW5jaWRlbmNlKmNvbXB1dGVOb2lzZSgpOw0KKwkJCWRvdWJsZSBkaWZmID0gbmV3SW5jaWRlbmNlIC0gaW5jaWRlbmNlOw0KKwkJCQ0KKwkJCWRvdWJsZSBuZXdJID0gY3VycmVudFNJLmdldEkoKSArIGRpZmY7DQorCQkJZG91YmxlIG5ld1MgPSBjdXJyZW50U0kuZ2V0UygpIC0gZGlmZjsNCisJCQlpZihuZXdJIDwgMC4wKSB7DQorCQkJCWRvdWJsZSBzY2FsZSA9ICgtbmV3SSkgLyBjdXJyZW50U0kuZ2V0SSgpOw0KKwkJCQlkaWZmID0gZGlmZiAqIHNjYWxlOw0KKwkJCQluZXdJID0gY3VycmVudFNJLmdldEkoKSArIGRpZmY7IC8vIDANCisJCQkJbmV3UyA9IGN1cnJlbnRTSS5nZXRTKCkgLSBkaWZmOw0KKwkJCX0NCisJCQlpZihuZXdTIDwgMC4wKSB7DQorCQkJCWRvdWJsZSBzY2FsZSA9ICgtbmV3UykgLyBjdXJyZW50U0kuZ2V0UygpOw0KKwkJCQlkaWZmID0gZGlmZiAqIHNjYWxlOw0KKwkJCQluZXdJID0gY3VycmVudFNJLmdldEkoKSArIGRpZmY7DQorCQkJCW5ld1MgPSBjdXJyZW50U0kuZ2V0UygpIC0gZGlmZjsgLy8gMA0KKwkJCX0NCisJCQluZXdJbmNpZGVuY2UgPSBpbmNpZGVuY2UgKyBkaWZmOw0KKwkJCWN1cnJlbnRTSS5zZXRTKG5ld1MpOw0KKwkJCWN1cnJlbnRTSS5zZXRJKG5ld0kpOw0KKwkJCWN1cnJlbnRTSS5zZXRJbmNpZGVuY2UobmV3SW5jaWRlbmNlKTsNCisJCQlyZXR1cm47DQorCX0gLy8gZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMNCisJDQorCQ0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBkb3VibGUgZ2V0TGF0aXR1ZGVTaWdtb2lkV2lkdGgoKSB7DQorCQlyZXR1cm4gbGF0aXR1ZGVTaWdtb2lkV2lkdGg7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYXRpdHVkZVNpZ21vaWRXaWR0aChkb3VibGUgbmV3TGF0aXR1ZGVTaWdtb2lkV2lkdGgpIHsNCisJCWRvdWJsZSBvbGRMYXRpdHVkZVNpZ21vaWRXaWR0aCA9IGxhdGl0dWRlU2lnbW9pZFdpZHRoOw0KKwkJbGF0aXR1ZGVTaWdtb2lkV2lkdGggPSBuZXdMYXRpdHVkZVNpZ21vaWRXaWR0aDsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fTEFUSVRVREVfU0lHTU9JRF9XSURUSCwgb2xkTGF0aXR1ZGVTaWdtb2lkV2lkdGgsIGxhdGl0dWRlU2lnbW9pZFdpZHRoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgZG91YmxlIGdldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KCkgew0KKwkJcmV0dXJuIHNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50Ow0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoZG91YmxlIG5ld1NlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KSB7DQorCQlkb3VibGUgb2xkU2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQgPSBzZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudDsNCisJCXNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50ID0gbmV3U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQ7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLkdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX1NFQVNPTkFMX01PRFVMQVRJT05fRVhQT05FTlQsIG9sZFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50LCBzZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGRvdWJsZSBnZXRNb2R1bGF0aW9uUGVyaW9kKCkgew0KKwkJcmV0dXJuIG1vZHVsYXRpb25QZXJpb2Q7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRNb2R1bGF0aW9uUGVyaW9kKGRvdWJsZSBuZXdNb2R1bGF0aW9uUGVyaW9kKSB7DQorCQlkb3VibGUgb2xkTW9kdWxhdGlvblBlcmlvZCA9IG1vZHVsYXRpb25QZXJpb2Q7DQorCQltb2R1bGF0aW9uUGVyaW9kID0gbmV3TW9kdWxhdGlvblBlcmlvZDsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0QsIG9sZE1vZHVsYXRpb25QZXJpb2QsIG1vZHVsYXRpb25QZXJpb2QpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBkb3VibGUgZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoKSB7DQorCQlyZXR1cm4gbW9kdWxhdGlvblBoYXNlU2hpZnQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRNb2R1bGF0aW9uUGhhc2VTaGlmdChkb3VibGUgbmV3TW9kdWxhdGlvblBoYXNlU2hpZnQpIHsNCisJCWRvdWJsZSBvbGRNb2R1bGF0aW9uUGhhc2VTaGlmdCA9IG1vZHVsYXRpb25QaGFzZVNoaWZ0Ow0KKwkJbW9kdWxhdGlvblBoYXNlU2hpZnQgPSBuZXdNb2R1bGF0aW9uUGhhc2VTaGlmdDsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVCwgb2xkTW9kdWxhdGlvblBoYXNlU2hpZnQsIG1vZHVsYXRpb25QaGFzZVNoaWZ0KSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgZG91YmxlIGdldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCkgew0KKwkJcmV0dXJuIHNlYXNvbmFsTW9kdWxhdGlvbkZsb29yOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoZG91YmxlIG5ld1NlYXNvbmFsTW9kdWxhdGlvbkZsb29yKSB7DQorCQlkb3VibGUgb2xkU2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IgPSBzZWFzb25hbE1vZHVsYXRpb25GbG9vcjsNCisJCXNlYXNvbmFsTW9kdWxhdGlvbkZsb29yID0gbmV3U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3I7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLkdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX1NFQVNPTkFMX01PRFVMQVRJT05fRkxPT1IsIG9sZFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yLCBzZWFzb25hbE1vZHVsYXRpb25GbG9vcikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fTEFUSVRVREVfU0lHTU9JRF9XSURUSDoNCisJCQkJcmV0dXJuIG5ldyBEb3VibGUoZ2V0TGF0aXR1ZGVTaWdtb2lkV2lkdGgoKSk7DQorCQkJY2FzZSBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9FWFBPTkVOVDoNCisJCQkJcmV0dXJuIG5ldyBEb3VibGUoZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoKSk7DQorCQkJY2FzZSBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0Q6DQorCQkJCXJldHVybiBuZXcgRG91YmxlKGdldE1vZHVsYXRpb25QZXJpb2QoKSk7DQorCQkJY2FzZSBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fTU9EVUxBVElPTl9QSEFTRV9TSElGVDoNCisJCQkJcmV0dXJuIG5ldyBEb3VibGUoZ2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoKSk7DQorCQkJY2FzZSBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUjoNCisJCQkJcmV0dXJuIG5ldyBEb3VibGUoZ2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZS5HTE9CQUxfSU5GTFVFTlpBX01PREVMX19MQVRJVFVERV9TSUdNT0lEX1dJRFRIOg0KKwkJCQlzZXRMYXRpdHVkZVNpZ21vaWRXaWR0aCgoKERvdWJsZSluZXdWYWx1ZSkuZG91YmxlVmFsdWUoKSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZS5HTE9CQUxfSU5GTFVFTlpBX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0VYUE9ORU5UOg0KKwkJCQlzZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCgoKERvdWJsZSluZXdWYWx1ZSkuZG91YmxlVmFsdWUoKSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZS5HTE9CQUxfSU5GTFVFTlpBX01PREVMX19NT0RVTEFUSU9OX1BFUklPRDoNCisJCQkJc2V0TW9kdWxhdGlvblBlcmlvZCgoKERvdWJsZSluZXdWYWx1ZSkuZG91YmxlVmFsdWUoKSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZS5HTE9CQUxfSU5GTFVFTlpBX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZUOg0KKwkJCQlzZXRNb2R1bGF0aW9uUGhhc2VTaGlmdCgoKERvdWJsZSluZXdWYWx1ZSkuZG91YmxlVmFsdWUoKSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZS5HTE9CQUxfSU5GTFVFTlpBX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0ZMT09SOg0KKwkJCQlzZXRTZWFzb25hbE1vZHVsYXRpb25GbG9vcigoKERvdWJsZSluZXdWYWx1ZSkuZG91YmxlVmFsdWUoKSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fTEFUSVRVREVfU0lHTU9JRF9XSURUSDoNCisJCQkJc2V0TGF0aXR1ZGVTaWdtb2lkV2lkdGgoTEFUSVRVREVfU0lHTU9JRF9XSURUSF9FREVGQVVMVCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZS5HTE9CQUxfSU5GTFVFTlpBX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0VYUE9ORU5UOg0KKwkJCQlzZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudChTRUFTT05BTF9NT0RVTEFUSU9OX0VYUE9ORU5UX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLkdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EOg0KKwkJCQlzZXRNb2R1bGF0aW9uUGVyaW9kKE1PRFVMQVRJT05fUEVSSU9EX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLkdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX01PRFVMQVRJT05fUEhBU0VfU0hJRlQ6DQorCQkJCXNldE1vZHVsYXRpb25QaGFzZVNoaWZ0KE1PRFVMQVRJT05fUEhBU0VfU0hJRlRfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUjoNCisJCQkJc2V0U2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUl9FREVGQVVMVCk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLkdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX0xBVElUVURFX1NJR01PSURfV0lEVEg6DQorCQkJCXJldHVybiBsYXRpdHVkZVNpZ21vaWRXaWR0aCAhPSBMQVRJVFVERV9TSUdNT0lEX1dJRFRIX0VERUZBVUxUOw0KKwkJCWNhc2UgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLkdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX1NFQVNPTkFMX01PRFVMQVRJT05fRVhQT05FTlQ6DQorCQkJCXJldHVybiBzZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCAhPSBTRUFTT05BTF9NT0RVTEFUSU9OX0VYUE9ORU5UX0VERUZBVUxUOw0KKwkJCWNhc2UgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLkdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EOg0KKwkJCQlyZXR1cm4gbW9kdWxhdGlvblBlcmlvZCAhPSBNT0RVTEFUSU9OX1BFUklPRF9FREVGQVVMVDsNCisJCQljYXNlIEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZS5HTE9CQUxfSU5GTFVFTlpBX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZUOg0KKwkJCQlyZXR1cm4gbW9kdWxhdGlvblBoYXNlU2hpZnQgIT0gTU9EVUxBVElPTl9QSEFTRV9TSElGVF9FREVGQVVMVDsNCisJCQljYXNlIEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZS5HTE9CQUxfSU5GTFVFTlpBX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0ZMT09SOg0KKwkJCQlyZXR1cm4gc2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IgIT0gU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUl9FREVGQVVMVDsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOw0KKw0KKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7DQorCQlyZXN1bHQuYXBwZW5kKCIgKGxhdGl0dWRlU2lnbW9pZFdpZHRoOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQobGF0aXR1ZGVTaWdtb2lkV2lkdGgpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCBzZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudDogIik7DQorCQlyZXN1bHQuYXBwZW5kKHNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KTsNCisJCXJlc3VsdC5hcHBlbmQoIiwgbW9kdWxhdGlvblBlcmlvZDogIik7DQorCQlyZXN1bHQuYXBwZW5kKG1vZHVsYXRpb25QZXJpb2QpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCBtb2R1bGF0aW9uUGhhc2VTaGlmdDogIik7DQorCQlyZXN1bHQuYXBwZW5kKG1vZHVsYXRpb25QaGFzZVNoaWZ0KTsNCisJCXJlc3VsdC5hcHBlbmQoIiwgc2Vhc29uYWxNb2R1bGF0aW9uRmxvb3I6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChzZWFzb25hbE1vZHVsYXRpb25GbG9vcik7DQorCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQorCX0NCisNCit9IC8vR2xvYmFsSW5mbHVlbnphTW9kZWxJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvaW1wbC9HbG9iYWxpbmZsdWVuemFtb2RlbEZhY3RvcnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9pbXBsL0dsb2JhbGluZmx1ZW56YW1vZGVsRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzZmYWE2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvaW1wbC9HbG9iYWxpbmZsdWVuemFtb2RlbEZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmltcGw7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLio7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBHbG9iYWxpbmZsdWVuemFtb2RlbEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgR2xvYmFsaW5mbHVlbnphbW9kZWxGYWN0b3J5IHsNCisJLyoqDQorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgR2xvYmFsaW5mbHVlbnphbW9kZWxGYWN0b3J5IGluaXQoKSB7DQorCQl0cnkgew0KKwkJCUdsb2JhbGluZmx1ZW56YW1vZGVsRmFjdG9yeSB0aGVHbG9iYWxpbmZsdWVuemFtb2RlbEZhY3RvcnkgPSAoR2xvYmFsaW5mbHVlbnphbW9kZWxGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC5lY29yZSIpOyANCisJCQlpZiAodGhlR2xvYmFsaW5mbHVlbnphbW9kZWxGYWN0b3J5ICE9IG51bGwpIHsNCisJCQkJcmV0dXJuIHRoZUdsb2JhbGluZmx1ZW56YW1vZGVsRmFjdG9yeTsNCisJCQl9DQorCQl9DQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJfQ0KKwkJcmV0dXJuIG5ldyBHbG9iYWxpbmZsdWVuemFtb2RlbEZhY3RvcnlJbXBsKCk7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgR2xvYmFsaW5mbHVlbnphbW9kZWxGYWN0b3J5SW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsNCisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7DQorCQkJY2FzZSBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuR0xPQkFMX0lORkxVRU5aQV9NT0RFTDogcmV0dXJuIGNyZWF0ZUdsb2JhbEluZmx1ZW56YU1vZGVsKCk7DQorCQkJZGVmYXVsdDoNCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBHbG9iYWxJbmZsdWVuemFNb2RlbCBjcmVhdGVHbG9iYWxJbmZsdWVuemFNb2RlbCgpIHsNCisJCUdsb2JhbEluZmx1ZW56YU1vZGVsSW1wbCBnbG9iYWxJbmZsdWVuemFNb2RlbCA9IG5ldyBHbG9iYWxJbmZsdWVuemFNb2RlbEltcGwoKTsNCisJCXJldHVybiBnbG9iYWxJbmZsdWVuemFNb2RlbDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UgZ2V0R2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlKCkgew0KKwkJcmV0dXJuIChHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBkZXByZWNhdGVkDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBEZXByZWNhdGVkDQorCXB1YmxpYyBzdGF0aWMgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlIGdldFBhY2thZ2UoKSB7DQorCQlyZXR1cm4gR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsNCisJfQ0KKw0KK30gLy9HbG9iYWxpbmZsdWVuemFtb2RlbEZhY3RvcnlJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvaW1wbC9HbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9pbXBsL0dsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjYwNWVjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvaW1wbC9HbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2VJbXBsLmphdmEKQEAgLTAsMCArMSwyNDYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmltcGw7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLkdsb2JhbEluZmx1ZW56YU1vZGVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuR2xvYmFsaW5mbHVlbnphbW9kZWxGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+Lg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZSB7DQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3MgZ2xvYmFsSW5mbHVlbnphTW9kZWxFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aA0KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQ0KKwkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4NCisJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYw0KKwkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3Jtcw0KKwkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLA0KKwkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQ0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5HbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UjZU5TX1VSSQ0KKwkgKiBAc2VlICNpbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2VJbXBsKCkgew0KKwkJc3VwZXIoZU5TX1VSSSwgR2xvYmFsaW5mbHVlbnphbW9kZWxGYWN0b3J5LmVJTlNUQU5DRSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMNCisJICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUNCisJICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwNCisJICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzDQorCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwNCisJICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4NCisJICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaA0KKwkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQNCisJICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOg0KKwkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQ0KKwkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bw0KKwkgKiB0aG9zZSBvZiBhbm90aGVyLg0KKwkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlDQorCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2VOU19VUkkNCisJICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkNCisJICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlIGluaXQoKSB7DQorCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZS5lTlNfVVJJKTsNCisNCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UNCisJCUdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZUltcGwgdGhlR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlID0gKEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZUltcGwoKSk7DQorDQorCQlpc0luaXRlZCA9IHRydWU7DQorDQorCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMNCisJCVN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7DQorDQorCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cw0KKwkJdGhlR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOw0KKw0KKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQ0KKwkJdGhlR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsNCisNCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQNCisJCXRoZUdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZS5mcmVlemUoKTsNCisNCisJCXJldHVybiB0aGVHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2U7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldEdsb2JhbEluZmx1ZW56YU1vZGVsKCkgew0KKwkJcmV0dXJuIGdsb2JhbEluZmx1ZW56YU1vZGVsRUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0R2xvYmFsSW5mbHVlbnphTW9kZWxfTGF0aXR1ZGVTaWdtb2lkV2lkdGgoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZ2xvYmFsSW5mbHVlbnphTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldEdsb2JhbEluZmx1ZW56YU1vZGVsX1NlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKWdsb2JhbEluZmx1ZW56YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRHbG9iYWxJbmZsdWVuemFNb2RlbF9Nb2R1bGF0aW9uUGVyaW9kKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKWdsb2JhbEluZmx1ZW56YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRHbG9iYWxJbmZsdWVuemFNb2RlbF9Nb2R1bGF0aW9uUGhhc2VTaGlmdCgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSlnbG9iYWxJbmZsdWVuemFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0R2xvYmFsSW5mbHVlbnphTW9kZWxfU2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZ2xvYmFsSW5mbHVlbnphTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBHbG9iYWxpbmZsdWVuemFtb2RlbEZhY3RvcnkgZ2V0R2xvYmFsaW5mbHVlbnphbW9kZWxGYWN0b3J5KCkgew0KKwkJcmV0dXJuIChHbG9iYWxpbmZsdWVuemFtb2RlbEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOw0KKw0KKwkvKioNCisJICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzDQorCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsNCisJCWlmIChpc0NyZWF0ZWQpIHJldHVybjsNCisJCWlzQ3JlYXRlZCA9IHRydWU7DQorDQorCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMNCisJCWdsb2JhbEluZmx1ZW56YU1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdMT0JBTF9JTkZMVUVOWkFfTU9ERUwpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShnbG9iYWxJbmZsdWVuemFNb2RlbEVDbGFzcywgR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fTEFUSVRVREVfU0lHTU9JRF9XSURUSCk7DQorCQljcmVhdGVFQXR0cmlidXRlKGdsb2JhbEluZmx1ZW56YU1vZGVsRUNsYXNzLCBHTE9CQUxfSU5GTFVFTlpBX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0VYUE9ORU5UKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoZ2xvYmFsSW5mbHVlbnphTW9kZWxFQ2xhc3MsIEdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoZ2xvYmFsSW5mbHVlbnphTW9kZWxFQ2xhc3MsIEdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX01PRFVMQVRJT05fUEhBU0VfU0hJRlQpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShnbG9iYWxJbmZsdWVuemFNb2RlbEVDbGFzcywgR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOw0KKw0KKwkvKioNCisJICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMNCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7DQorCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOw0KKwkJaXNJbml0aWFsaXplZCA9IHRydWU7DQorDQorCQkvLyBJbml0aWFsaXplIHBhY2thZ2UNCisJCXNldE5hbWUoZU5BTUUpOw0KKwkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7DQorCQlzZXROc1VSSShlTlNfVVJJKTsNCisNCisJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMNCisJCVN0YW5kYXJkUGFja2FnZSB0aGVTdGFuZGFyZFBhY2thZ2UgPSAoU3RhbmRhcmRQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFN0YW5kYXJkUGFja2FnZS5lTlNfVVJJKTsNCisNCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMNCisNCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycw0KKw0KKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3Nlcw0KKwkJZ2xvYmFsSW5mbHVlbnphTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlU3RhbmRhcmRQYWNrYWdlLmdldFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwoKSk7DQorDQorCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycw0KKwkJaW5pdEVDbGFzcyhnbG9iYWxJbmZsdWVuemFNb2RlbEVDbGFzcywgR2xvYmFsSW5mbHVlbnphTW9kZWwuY2xhc3MsICJHbG9iYWxJbmZsdWVuemFNb2RlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFQXR0cmlidXRlKGdldEdsb2JhbEluZmx1ZW56YU1vZGVsX0xhdGl0dWRlU2lnbW9pZFdpZHRoKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJsYXRpdHVkZVNpZ21vaWRXaWR0aCIsICI0LjUwIiwgMCwgMSwgR2xvYmFsSW5mbHVlbnphTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRHbG9iYWxJbmZsdWVuemFNb2RlbF9TZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAic2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQiLCAiMi4wIiwgMCwgMSwgR2xvYmFsSW5mbHVlbnphTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRHbG9iYWxJbmZsdWVuemFNb2RlbF9Nb2R1bGF0aW9uUGVyaW9kKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJtb2R1bGF0aW9uUGVyaW9kIiwgIjM2NS4yNTYzNjMwNTEiLCAwLCAxLCBHbG9iYWxJbmZsdWVuemFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFQXR0cmlidXRlKGdldEdsb2JhbEluZmx1ZW56YU1vZGVsX01vZHVsYXRpb25QaGFzZVNoaWZ0KCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJtb2R1bGF0aW9uUGhhc2VTaGlmdCIsICIwLjAiLCAwLCAxLCBHbG9iYWxJbmZsdWVuemFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFQXR0cmlidXRlKGdldEdsb2JhbEluZmx1ZW56YU1vZGVsX1NlYXNvbmFsTW9kdWxhdGlvbkZsb29yKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJzZWFzb25hbE1vZHVsYXRpb25GbG9vciIsICIwLjYiLCAwLCAxLCBHbG9iYWxJbmZsdWVuemFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisNCisJCS8vIENyZWF0ZSByZXNvdXJjZQ0KKwkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7DQorCX0NCisNCit9IC8vR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlSW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3Byb3ZpZGVyL0dsb2JhbEluZmx1ZW56YU1vZGVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9wcm92aWRlci9HbG9iYWxJbmZsdWVuemFNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOWNhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9wcm92aWRlci9HbG9iYWxJbmZsdWVuemFNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjc4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5wcm92aWRlcjsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLkdsb2JhbEluZmx1ZW56YU1vZGVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5HbG9iYWxJbmZsdWVuemFNb2RlbH0gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBHbG9iYWxJbmZsdWVuemFNb2RlbEl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBHbG9iYWxJbmZsdWVuemFNb2RlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCQlhZGRMYXRpdHVkZVNpZ21vaWRXaWR0aFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJCWFkZFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkTW9kdWxhdGlvblBlcmlvZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJCWFkZE1vZHVsYXRpb25QaGFzZVNoaWZ0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkU2Vhc29uYWxNb2R1bGF0aW9uRmxvb3JQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExhdGl0dWRlIFNpZ21vaWQgV2lkdGggZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZExhdGl0dWRlU2lnbW9pZFdpZHRoUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9HbG9iYWxJbmZsdWVuemFNb2RlbF9sYXRpdHVkZVNpZ21vaWRXaWR0aF9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0dsb2JhbEluZmx1ZW56YU1vZGVsX2xhdGl0dWRlU2lnbW9pZFdpZHRoX2ZlYXR1cmUiLCAiX1VJX0dsb2JhbEluZmx1ZW56YU1vZGVsX3R5cGUiKSwNCisJCQkJIEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZS5MaXRlcmFscy5HTE9CQUxfSU5GTFVFTlpBX01PREVMX19MQVRJVFVERV9TSUdNT0lEX1dJRFRILA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2Vhc29uYWwgTW9kdWxhdGlvbiBFeHBvbmVudCBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX0dsb2JhbEluZmx1ZW56YU1vZGVsX3NlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50X2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfR2xvYmFsSW5mbHVlbnphTW9kZWxfc2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnRfZmVhdHVyZSIsICJfVUlfR2xvYmFsSW5mbHVlbnphTW9kZWxfdHlwZSIpLA0KKwkJCQkgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLkxpdGVyYWxzLkdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX1NFQVNPTkFMX01PRFVMQVRJT05fRVhQT05FTlQsDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNb2R1bGF0aW9uIFBlcmlvZCBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTW9kdWxhdGlvblBlcmlvZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfR2xvYmFsSW5mbHVlbnphTW9kZWxfbW9kdWxhdGlvblBlcmlvZF9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0dsb2JhbEluZmx1ZW56YU1vZGVsX21vZHVsYXRpb25QZXJpb2RfZmVhdHVyZSIsICJfVUlfR2xvYmFsSW5mbHVlbnphTW9kZWxfdHlwZSIpLA0KKwkJCQkgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLkxpdGVyYWxzLkdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9ELA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTW9kdWxhdGlvbiBQaGFzZSBTaGlmdCBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTW9kdWxhdGlvblBoYXNlU2hpZnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX0dsb2JhbEluZmx1ZW56YU1vZGVsX21vZHVsYXRpb25QaGFzZVNoaWZ0X2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfR2xvYmFsSW5mbHVlbnphTW9kZWxfbW9kdWxhdGlvblBoYXNlU2hpZnRfZmVhdHVyZSIsICJfVUlfR2xvYmFsSW5mbHVlbnphTW9kZWxfdHlwZSIpLA0KKwkJCQkgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLkxpdGVyYWxzLkdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX01PRFVMQVRJT05fUEhBU0VfU0hJRlQsDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZWFzb25hbCBNb2R1bGF0aW9uIEZsb29yIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZWFzb25hbE1vZHVsYXRpb25GbG9vclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfR2xvYmFsSW5mbHVlbnphTW9kZWxfc2Vhc29uYWxNb2R1bGF0aW9uRmxvb3JfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HbG9iYWxJbmZsdWVuemFNb2RlbF9zZWFzb25hbE1vZHVsYXRpb25GbG9vcl9mZWF0dXJlIiwgIl9VSV9HbG9iYWxJbmZsdWVuemFNb2RlbF90eXBlIiksDQorCQkJCSBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuTGl0ZXJhbHMuR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUiwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIEdsb2JhbEluZmx1ZW56YU1vZGVsLmdpZi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9HbG9iYWxJbmZsdWVuemFNb2RlbCIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChHbG9iYWxJbmZsdWVuemFNb2RlbClvYmplY3QpLmdldFVSSSgpLmxhc3RTZWdtZW50KCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9HbG9iYWxJbmZsdWVuemFNb2RlbF90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX0dsb2JhbEluZmx1ZW56YU1vZGVsX3R5cGUiKSArICIgIiArIGxhYmVsOw0KKwl9DQorCQ0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChHbG9iYWxJbmZsdWVuemFNb2RlbClvYmplY3QpLmdldERpc2Vhc2VOYW1lKCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9HbG9iYWxJbmZsdWVuemFNb2RlbF90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX0dsb2JhbEluZmx1ZW56YU1vZGVsX3R5cGUiKSArICIgIiArIGxhYmVsOw0KKwl9DQorCQ0KKw0KKwkvKioNCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KKw0KKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEdsb2JhbEluZmx1ZW56YU1vZGVsLmNsYXNzKSkgew0KKwkJCWNhc2UgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLkdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX0xBVElUVURFX1NJR01PSURfV0lEVEg6DQorCQkJY2FzZSBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9FWFBPTkVOVDoNCisJCQljYXNlIEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZS5HTE9CQUxfSU5GTFVFTlpBX01PREVMX19NT0RVTEFUSU9OX1BFUklPRDoNCisJCQljYXNlIEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZS5HTE9CQUxfSU5GTFVFTlpBX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZUOg0KKwkJCWNhc2UgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLkdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX1NFQVNPTkFMX01PRFVMQVRJT05fRkxPT1I6DQorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KKwkJcmV0dXJuIEdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdFBsdWdpbi5JTlNUQU5DRTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9wcm92aWRlci9HbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3Byb3ZpZGVyL0dsb2JhbGluZmx1ZW56YW1vZGVsRWRpdFBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OWI3NTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9wcm92aWRlci9HbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRQbHVnaW4uamF2YQpAQCAtMCwwICsxLDExMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwucHJvdmlkZXI7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRWNvcmVFZGl0UGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnByb3ZpZGVyLkRlZmluaXRpb25zRWRpdFBsdWdpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLkRpc2Vhc2Vtb2RlbHNFZGl0UGx1Z2luOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgR2xvYmFsaW5mbHVlbnphbW9kZWwgZWRpdCBwbHVnaW4uDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGZpbmFsIGNsYXNzIEdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdFBsdWdpbiBleHRlbmRzIEVNRlBsdWdpbiB7DQorCS8qKg0KKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdFBsdWdpbiBJTlNUQU5DRSA9IG5ldyBHbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRQbHVnaW4oKTsNCisNCisJLyoqDQorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsNCisNCisJLyoqDQorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0UGx1Z2luKCkgew0KKwkJc3VwZXINCisJCSAgKG5ldyBSZXNvdXJjZUxvY2F0b3IgW10gew0KKwkJICAgICBEaXNlYXNlbW9kZWxzRWRpdFBsdWdpbi5JTlNUQU5DRSwNCisJCSAgICAgQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0UsDQorCQkgICAgIEVjb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwNCisJCSAgICAgRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLA0KKwkJICAgfSk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsNCisJCXJldHVybiBwbHVnaW47DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgew0KKwkJcmV0dXJuIHBsdWdpbjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbiBleHRlbmRzIEVjbGlwc2VQbHVnaW4gew0KKwkJLyoqDQorCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7DQorCQkJc3VwZXIoKTsNCisNCisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLg0KKwkJCS8vDQorCQkJcGx1Z2luID0gdGhpczsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9wcm92aWRlci9HbG9iYWxpbmZsdWVuemFtb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9wcm92aWRlci9HbG9iYWxpbmZsdWVuemFtb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk4ZjVkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3Byb3ZpZGVyL0dsb2JhbGluZmx1ZW56YW1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDIwOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwucHJvdmlkZXI7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC51dGlsLkdsb2JhbGluZmx1ZW56YW1vZGVsQWRhcHRlckZhY3Rvcnk7DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLg0KKyAqIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKyAqIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuDQorICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBHbG9iYWxpbmZsdWVuemFtb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgR2xvYmFsaW5mbHVlbnphbW9kZWxBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgew0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248T2JqZWN0PiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KKw0KKwkvKioNCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEdsb2JhbGluZmx1ZW56YW1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7DQorCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOw0KKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQorCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOw0KKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5HbG9iYWxJbmZsdWVuemFNb2RlbH0gaW5zdGFuY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEdsb2JhbEluZmx1ZW56YU1vZGVsSXRlbVByb3ZpZGVyIGdsb2JhbEluZmx1ZW56YU1vZGVsSXRlbVByb3ZpZGVyOw0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5HbG9iYWxJbmZsdWVuemFNb2RlbH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlR2xvYmFsSW5mbHVlbnphTW9kZWxBZGFwdGVyKCkgew0KKwkJaWYgKGdsb2JhbEluZmx1ZW56YU1vZGVsSXRlbVByb3ZpZGVyID09IG51bGwpIHsNCisJCQlnbG9iYWxJbmZsdWVuemFNb2RlbEl0ZW1Qcm92aWRlciA9IG5ldyBHbG9iYWxJbmZsdWVuemFNb2RlbEl0ZW1Qcm92aWRlcih0aGlzKTsNCisJCX0NCisNCisJCXJldHVybiBnbG9iYWxJbmZsdWVuemFNb2RlbEl0ZW1Qcm92aWRlcjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsNCisJCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsNCisJCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7DQorCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7DQorCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsNCisJCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7DQorCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOw0KKwkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3M8Pz4pdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsNCisJCQkJcmV0dXJuIGFkYXB0ZXI7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsNCisJCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsNCisJCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9IGFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorDQorCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgew0KKwkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4gDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KKwkJaWYgKGdsb2JhbEluZmx1ZW56YU1vZGVsSXRlbVByb3ZpZGVyICE9IG51bGwpIGdsb2JhbEluZmx1ZW56YU1vZGVsSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC91dGlsL0dsb2JhbGluZmx1ZW56YW1vZGVsQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3V0aWwvR2xvYmFsaW5mbHVlbnphbW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YWUyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC91dGlsL0dsb2JhbGluZmx1ZW56YW1vZGVsQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM5OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwudXRpbDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC4qOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNEaXNlYXNlTW9kZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4NCisgKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5HbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEdsb2JhbGluZmx1ZW56YW1vZGVsQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgew0KKwkvKioNCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UgbW9kZWxQYWNrYWdlOw0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEdsb2JhbGluZmx1ZW56YW1vZGVsQWRhcHRlckZhY3RvcnkoKSB7DQorCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsNCisJCQltb2RlbFBhY2thZ2UgPSBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuZUlOU1RBTkNFOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgew0KKwkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEdsb2JhbGluZmx1ZW56YW1vZGVsU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0NCisJCW5ldyBHbG9iYWxpbmZsdWVuemFtb2RlbFN3aXRjaDxBZGFwdGVyPigpIHsNCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlR2xvYmFsSW5mbHVlbnphTW9kZWwoR2xvYmFsSW5mbHVlbnphTW9kZWwgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVHbG9iYWxJbmZsdWVuemFNb2RlbEFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIDxUPiBBZGFwdGVyIGNhc2VDb21wYXJhYmxlKENvbXBhcmFibGU8VD4gb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlY29yYXRvcihEZWNvcmF0b3Igb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVEZWNvcmF0b3JBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VOb2RlRGVjb3JhdG9yKE5vZGVEZWNvcmF0b3Igb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVOb2RlRGVjb3JhdG9yQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU2FuaXR5Q2hlY2tlcihTYW5pdHlDaGVja2VyIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlU2FuaXR5Q2hlY2tlckFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1vZGlmaWFibGUoTW9kaWZpYWJsZSBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZU1vZGlmaWFibGVBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEaXNlYXNlTW9kZWwoRGlzZWFzZU1vZGVsIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlRGlzZWFzZU1vZGVsQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSW50ZWdyYXRpb25EZWNvcmF0b3IoSW50ZWdyYXRpb25EZWNvcmF0b3Igb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVJbnRlZ3JhdGlvbkRlY29yYXRvckFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVN0YW5kYXJkRGlzZWFzZU1vZGVsKFN0YW5kYXJkRGlzZWFzZU1vZGVsIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlU3RhbmRhcmREaXNlYXNlTW9kZWxBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTSShTSSBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZVNJQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU0lSKFNJUiBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZVNJUkFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZVN0b2NoYXN0aWNEaXNlYXNlTW9kZWxBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbChTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7DQorCQkJfQ0KKwkJfTsNCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuDQorCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+Lg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsNCisJCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOw0KKwl9DQorDQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5HbG9iYWxJbmZsdWVuemFNb2RlbCA8ZW0+R2xvYmFsIEluZmx1ZW56YSBNb2RlbDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuR2xvYmFsSW5mbHVlbnphTW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlR2xvYmFsSW5mbHVlbnphTW9kZWxBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YS5sYW5nLkNvbXBhcmFibGUgPGVtPkNvbXBhcmFibGU8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcGFyYWJsZUFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yIDxlbT5EZWNvcmF0b3I8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWNvcmF0b3JBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3IgPGVtPk5vZGUgRGVjb3JhdG9yPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5vZGVEZWNvcmF0b3JBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyIDxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2FuaXR5Q2hlY2tlckFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZSA8ZW0+TW9kaWZpYWJsZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2RpZmlhYmxlQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwgPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNlYXNlTW9kZWxBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yIDxlbT5JbnRlZ3JhdGlvbiBEZWNvcmF0b3I8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUludGVncmF0aW9uRGVjb3JhdG9yQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbCA8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RhbmRhcmREaXNlYXNlTW9kZWxBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJIDxlbT5TSTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU0lBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUiA8ZW0+U0lSPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU0lSQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsIDxlbT5TdG9jaGFzdGljIERpc2Vhc2UgTW9kZWw8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNEaXNlYXNlTW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsIDxlbT5TdG9jaGFzdGljIERpc2Vhc2UgTW9kZWw8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwgPGVtPlN0b2NoYXN0aWMgU0lSIERpc2Vhc2UgTW9kZWw8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9IC8vR2xvYmFsaW5mbHVlbnphbW9kZWxBZGFwdGVyRmFjdG9yeQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3V0aWwvR2xvYmFsaW5mbHVlbnphbW9kZWxTd2l0Y2guamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3V0aWwvR2xvYmFsaW5mbHVlbnphbW9kZWxTd2l0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTY0N2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvdXRpbC9HbG9iYWxpbmZsdWVuemFtb2RlbFN3aXRjaC5qYXZhCkBAIC0wLDAgKzEsMzc2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC51dGlsOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuKjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuDQorICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQ0KKyAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwNCisgKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdA0KKyAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkNCisgKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwNCisgKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBHbG9iYWxpbmZsdWVuemFtb2RlbFN3aXRjaDxUMT4gew0KKwkvKioNCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZSBtb2RlbFBhY2thZ2U7DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgR2xvYmFsaW5mbHVlbnphbW9kZWxTd2l0Y2goKSB7DQorCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsNCisJCQltb2RlbFBhY2thZ2UgPSBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuZUlOU1RBTkNFOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsNCisJCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7DQorCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsNCisJCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsNCisJCX0NCisJCWVsc2Ugew0KKwkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOw0KKwkJCXJldHVybg0KKwkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPw0KKwkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOg0KKwkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7DQorCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgew0KKwkJCWNhc2UgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLkdMT0JBTF9JTkZMVUVOWkFfTU9ERUw6IHsNCisJCQkJR2xvYmFsSW5mbHVlbnphTW9kZWwgZ2xvYmFsSW5mbHVlbnphTW9kZWwgPSAoR2xvYmFsSW5mbHVlbnphTW9kZWwpdGhlRU9iamVjdDsNCisJCQkJVDEgcmVzdWx0ID0gY2FzZUdsb2JhbEluZmx1ZW56YU1vZGVsKGdsb2JhbEluZmx1ZW56YU1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbChnbG9iYWxJbmZsdWVuemFNb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNJUihnbG9iYWxJbmZsdWVuemFNb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbChnbG9iYWxJbmZsdWVuemFNb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNJKGdsb2JhbEluZmx1ZW56YU1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbChnbG9iYWxJbmZsdWVuemFNb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0YW5kYXJkRGlzZWFzZU1vZGVsKGdsb2JhbEluZmx1ZW56YU1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlzZWFzZU1vZGVsKGdsb2JhbEluZmx1ZW56YU1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSW50ZWdyYXRpb25EZWNvcmF0b3IoZ2xvYmFsSW5mbHVlbnphTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlRGVjb3JhdG9yKGdsb2JhbEluZmx1ZW56YU1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcihnbG9iYWxJbmZsdWVuemFNb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUoZ2xvYmFsSW5mbHVlbnphTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZWNvcmF0b3IoZ2xvYmFsSW5mbHVlbnphTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoZ2xvYmFsSW5mbHVlbnphTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKGdsb2JhbEluZmx1ZW56YU1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HbG9iYWwgSW5mbHVlbnphIE1vZGVsPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R2xvYmFsIEluZmx1ZW56YSBNb2RlbDwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlR2xvYmFsSW5mbHVlbnphTW9kZWwoR2xvYmFsSW5mbHVlbnphTW9kZWwgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgPFQ+IFQxIGNhc2VDb21wYXJhYmxlKENvbXBhcmFibGU8VD4gb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlY29yYXRvcjwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlY29yYXRvcjwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlRGVjb3JhdG9yKERlY29yYXRvciBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlIERlY29yYXRvcjwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgRGVjb3JhdG9yPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VOb2RlRGVjb3JhdG9yKE5vZGVEZWNvcmF0b3Igb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2FuaXR5IENoZWNrZXI8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlU2FuaXR5Q2hlY2tlcihTYW5pdHlDaGVja2VyIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZGlmaWFibGU8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2RpZmlhYmxlPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VNb2RpZmlhYmxlKE1vZGlmaWFibGUgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVDEgY2FzZURpc2Vhc2VNb2RlbChEaXNlYXNlTW9kZWwgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZWdyYXRpb24gRGVjb3JhdG9yPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZWdyYXRpb24gRGVjb3JhdG9yPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VJbnRlZ3JhdGlvbkRlY29yYXRvcihJbnRlZ3JhdGlvbkRlY29yYXRvciBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNlYXNlIE1vZGVsPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlU3RhbmRhcmREaXNlYXNlTW9kZWwoU3RhbmRhcmREaXNlYXNlTW9kZWwgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0k8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TSTwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlU0koU0kgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0lSPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0lSPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VTSVIoU0lSIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbChTdG9jaGFzdGljRGlzZWFzZU1vZGVsIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKFN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdG9jaGFzdGljIFNJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RvY2hhc3RpYyBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbChTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9IC8vR2xvYmFsaW5mbHVlbnphbW9kZWxTd2l0Y2gNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZTg2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi8ucHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUyNDIyMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbjwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YzZlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDggQEAKKyNNb24gRmViIDIyIDE1OjM5OjM1IFBTVCAyMDEwCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiNTVlZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSw0MSBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb247c2luZ2xldG9uOj10cnVlCitCdW5kbGUtVmVyc2lvbjogMS4wLjEucXVhbGlmaWVyCitCdW5kbGUtQ2xhc3NQYXRoOiAuCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb247dXNlczo9Im9yZy5lY2xpcHNlLmVtZi5lY29yZSxvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQiLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uaW1wbDsKKyAgdXNlczo9Im9yZy5lY2xpcHNlLmVtZi5lY29yZSwKKyAgIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24sCisgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbCwKKyAgIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsIiwKKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLnByb3ZpZGVyOworICB1c2VzOj0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLAorICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLAorICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbiwKKyAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLAorICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnksCisgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLAorICAgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi51dGlsIiwKKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLnV0aWw7CisgIHVzZXM6PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCisgICBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLAorICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbCwKKyAgIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZCwKKyAgIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllciwKKyAgIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbCwKKyAgIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24sCisgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeSIKK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0O2J1bmRsZS12ZXJzaW9uPSIyLjUuMCI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLAorIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVsczt2aXNpYmlsaXR5Oj1yZWV4cG9ydAorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uQWN0aXZhdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0NWRkNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE1IEBACisKKyMgPGNvcHlyaWdodD4KKyMgPC9jb3B5cmlnaHQ+CisjCisjICRJZCQKKworYmluLmluY2x1ZGVzID0gLixcCisgICAgICAgICAgICAgICBtb2RlbC8sXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgaWNvbnMvCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuCitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbF9pbmN1YmF0aW9uUmF0ZV9Eb3VibGVWYWx1ZUxpc3QuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbF9pbmN1YmF0aW9uUmF0ZV9Eb3VibGVWYWx1ZUxpc3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MWI3ODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsX2luY3ViYXRpb25SYXRlX0RvdWJsZVZhbHVlTGlzdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfaW5mZWN0aW91c01vcnRhbGl0eVJhdGVfRG91YmxlVmFsdWVMaXN0LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX2luZmVjdGlvdXNNb3J0YWxpdHlSYXRlX0RvdWJsZVZhbHVlTGlzdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkZGEzYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX2luZmVjdGlvdXNNb3J0YWxpdHlSYXRlX0RvdWJsZVZhbHVlTGlzdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfcG9wdWxhdGlvbkdyb3Vwc19TdHJpbmdWYWx1ZUxpc3QuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfcG9wdWxhdGlvbkdyb3Vwc19TdHJpbmdWYWx1ZUxpc3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiN2Q1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9wb3B1bGF0aW9uR3JvdXBzX1N0cmluZ1ZhbHVlTGlzdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfcmVjb3ZlcnlSYXRlX0RvdWJsZVZhbHVlTGlzdC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9yZWNvdmVyeVJhdGVfRG91YmxlVmFsdWVMaXN0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmRkYTNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfcmVjb3ZlcnlSYXRlX0RvdWJsZVZhbHVlTGlzdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfdHJhbnNtaXNzaW9uUmF0ZV9Eb3VibGVWYWx1ZU1hdHJpeC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF90cmFuc21pc3Npb25SYXRlX0RvdWJsZVZhbHVlTWF0cml4LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWM0YWRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfdHJhbnNtaXNzaW9uUmF0ZV9Eb3VibGVWYWx1ZU1hdHJpeC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsX2ltbXVuaXR5TG9zc1JhdGVfRG91YmxlVmFsdWVMaXN0LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbF9pbW11bml0eUxvc3NSYXRlX0RvdWJsZVZhbHVlTGlzdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VlZTUyYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbF9pbW11bml0eUxvc3NSYXRlX0RvdWJsZVZhbHVlTGlzdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL2N1c3RvbTE2L21kaXNlYXNlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vaWNvbnMvZnVsbC9jdXN0b20xNi9tZGlzZWFzZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2YmJjYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vaWNvbnMvZnVsbC9jdXN0b20xNi9tZGlzZWFzZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL29iajE2L011bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL29iajE2L011bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMjI0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL2ljb25zL2Z1bGwvb2JqMTYvTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL29iajE2L011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vaWNvbnMvZnVsbC9vYmoxNi9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2NDNkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vaWNvbnMvZnVsbC9vYmoxNi9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL29iajE2L011bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL2ljb25zL2Z1bGwvb2JqMTYvTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzY1OTYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL29iajE2L011bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL29iajE2L011bHRpcG9wdWxhdGlvbk1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL2ljb25zL2Z1bGwvb2JqMTYvTXVsdGlwb3B1bGF0aW9uTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGU1MjIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL29iajE2L011bHRpcG9wdWxhdGlvbk1vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL3dpemJhbi9OZXdNdWx0aXBvcHVsYXRpb24uZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9pY29ucy9mdWxsL3dpemJhbi9OZXdNdWx0aXBvcHVsYXRpb24uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMzI0OTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL2ljb25zL2Z1bGwvd2l6YmFuL05ld011bHRpcG9wdWxhdGlvbi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9tb2RlbC9tdWx0aXBvcHVsYXRpb24uZWNvcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL21vZGVsL211bHRpcG9wdWxhdGlvbi5lY29yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWVlMDUwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9tb2RlbC9tdWx0aXBvcHVsYXRpb24uZWNvcmUKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ibXVsdGlwb3B1bGF0aW9uIgorICAgIG5zVVJJPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24uZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uIj4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9tb2RlbC9zdGFuZGFyZC5lY29yZSMvL1N0YW5kYXJkRGlzZWFzZU1vZGVsIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9wdWxhdGlvbkdyb3VwcyIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29tbW9uLmVjb3JlIy8vU3RyaW5nVmFsdWVMaXN0IgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0cmFuc21pc3Npb25SYXRlIiBsb3dlckJvdW5kPSIxIgorICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb21tb24uZWNvcmUjLy9Eb3VibGVWYWx1ZU1hdHJpeCIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVjb3ZlcnlSYXRlIiBsb3dlckJvdW5kPSIxIgorICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb21tb24uZWNvcmUjLy9Eb3VibGVWYWx1ZUxpc3QiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluZmVjdGlvdXNNb3J0YWxpdHlSYXRlIgorICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb21tb24uZWNvcmUjLy9Eb3VibGVWYWx1ZUxpc3QiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMC4wMSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMC4wNSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMi4yNSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwiIGVTdXBlclR5cGVzPSIjLy9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltbXVuaXR5TG9zc1JhdGUiIGxvd2VyQm91bmQ9IjEiCisgICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvbW1vbi5lY29yZSMvL0RvdWJsZVZhbHVlTGlzdCIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCIgZVN1cGVyVHlwZXM9IiMvL011bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY3ViYXRpb25SYXRlIiBsb3dlckJvdW5kPSIxIgorICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb21tb24uZWNvcmUjLy9Eb3VibGVWYWx1ZUxpc3QiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vbW9kZWwvbXVsdGlwb3B1bGF0aW9uLmdlbm1vZGVsIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9tb2RlbC9tdWx0aXBvcHVsYXRpb24uZ2VubW9kZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhYWNlMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vbW9kZWwvbXVsdGlwb3B1bGF0aW9uLmdlbm1vZGVsCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgorICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjIgorICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMiCisgICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbiIgbW9kZWxOYW1lPSJNdWx0aXBvcHVsYXRpb24iCisgICAgdGVzdHNEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYyIgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLmphdmEiCisgICAgY29tcGxpYW5jZUxldmVsPSI2LjAiIGNvcHlyaWdodEZpZWxkcz0iZmFsc2UiIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL21vZGVsL2Rpc2Vhc2Vtb2RlbHMuZ2VubW9kZWwjLy9zdGFuZGFyZCAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL2NvbW1vbiAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL21vZGVsIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9ncmFwaCAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL21vZGlmaWVyIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vc2NlbmFyaW8gLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9zZXF1ZW5jZXIgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9zb2x2ZXIgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9tb2RlbC9kZWZpbml0aW9ucy5nZW5tb2RlbCMvL2xhYmVscyAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvbW9kZWwvc3RhbmRhcmQuZ2VubW9kZWwjLy9zdGFuZGFyZCI+CisgIDxmb3JlaWduTW9kZWw+QG1vZGVsPC9mb3JlaWduTW9kZWw+CisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9Ik11bHRpcG9wdWxhdGlvbiIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscyIKKyAgICAgIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiIGVjb3JlUGFja2FnZT0ibXVsdGlwb3B1bGF0aW9uLmVjb3JlIy8iPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im11bHRpcG9wdWxhdGlvbi5lY29yZSMvL011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtdWx0aXBvcHVsYXRpb24uZWNvcmUjLy9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbC9wb3B1bGF0aW9uR3JvdXBzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXVsdGlwb3B1bGF0aW9uLmVjb3JlIy8vTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwvdHJhbnNtaXNzaW9uUmF0ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG11bHRpcG9wdWxhdGlvbi5lY29yZSMvL011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsL3JlY292ZXJ5UmF0ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG11bHRpcG9wdWxhdGlvbi5lY29yZSMvL011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsL2luZmVjdGlvdXNNb3J0YWxpdHlSYXRlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG11bHRpcG9wdWxhdGlvbi5lY29yZSMvL011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsL3BoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXVsdGlwb3B1bGF0aW9uLmVjb3JlIy8vTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwvcm9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbiIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG11bHRpcG9wdWxhdGlvbi5lY29yZSMvL011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsL2NoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXVsdGlwb3B1bGF0aW9uLmVjb3JlIy8vTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtdWx0aXBvcHVsYXRpb24uZWNvcmUjLy9NdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwvaW1tdW5pdHlMb3NzUmF0ZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtdWx0aXBvcHVsYXRpb24uZWNvcmUjLy9NdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtdWx0aXBvcHVsYXRpb24uZWNvcmUjLy9NdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsL2luY3ViYXRpb25SYXRlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICA8L2dlblBhY2thZ2VzPgorPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYjdjOGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNjMgQEAKKworIyA8Y29weXJpZ2h0PgorIyA8L2NvcHlyaWdodD4KKyMKKyMgJElkJAorCitwbHVnaW5OYW1lID0gTXVsdGlwb3B1bGF0aW9uIE1vZGVsCitwcm92aWRlck5hbWUgPSB3d3cuZXhhbXBsZS5vcmcKK19VSV9DcmVhdGVDaGlsZF90ZXh0ID0gezB9CitfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIgPSB7MX0gezB9CitfVUlfQ3JlYXRlQ2hpbGRfdGV4dDMgPSB7MX0KK19VSV9DcmVhdGVDaGlsZF90b29sdGlwID0gQ3JlYXRlIE5ldyB7MH0gVW5kZXIgezF9IEZlYXR1cmUKK19VSV9DcmVhdGVDaGlsZF9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBjaGlsZCBvZiB0eXBlIHswfSBmb3IgdGhlIHsxfSBmZWF0dXJlIG9mIHRoZSBzZWxlY3RlZCB7Mn0uCitfVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBzaWJsaW5nIG9mIHR5cGUgezB9IGZvciB0aGUgc2VsZWN0ZWQgezJ9LCB1bmRlciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlaXIgcGFyZW50LgorX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiA9IFRoZSB7MH0gb2YgdGhlIHsxfQorX1VJX011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX3R5cGUgPSBNdWx0aSBQb3B1bGF0aW9uIFNJIERpc2Vhc2UgTW9kZWwKK19VSV9Vbmtub3duX3R5cGUgPSBPYmplY3QKK19VSV9Vbmtub3duX2RhdGF0eXBlPSBWYWx1ZQorX1VJX1Vua25vd25fZmVhdHVyZSA9IFVuc3BlY2lmaWVkCitfVUlfTXVsdGlwb3B1bGF0aW9uRWRpdG9yX21lbnUgPSAmTXVsdGlwb3B1bGF0aW9uIEVkaXRvcgorX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSA9ICZOZXcgQ2hpbGQKK19VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSA9IE4mZXcgU2libGluZworX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW0gPSBTaG93ICZQcm9wZXJ0aWVzIFZpZXcKK19VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbSA9ICZSZWZyZXNoCitfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCA9IFNlbGVjdGlvbgorX1VJX1BhcmVudFBhZ2VfbGFiZWwgPSBQYXJlbnQKK19VSV9MaXN0UGFnZV9sYWJlbCA9IExpc3QKK19VSV9UcmVlUGFnZV9sYWJlbCA9IFRyZWUKK19VSV9UYWJsZVBhZ2VfbGFiZWwgPSBUYWJsZQorX1VJX1RyZWVXaXRoQ29sdW1uc1BhZ2VfbGFiZWwgPSBUcmVlIHdpdGggQ29sdW1ucworX1VJX09iamVjdENvbHVtbl9sYWJlbCA9IE9iamVjdAorX1VJX1NlbGZDb2x1bW5fbGFiZWwgPSBTZWxmCitfVUlfTm9PYmplY3RTZWxlY3RlZCA9IFNlbGVjdGVkIE5vdGhpbmcKK19VSV9TaW5nbGVPYmplY3RTZWxlY3RlZCA9IFNlbGVjdGVkIE9iamVjdDogezB9CitfVUlfTXVsdGlPYmplY3RTZWxlY3RlZCA9IFNlbGVjdGVkIHswfSBPYmplY3RzCitfVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsID0gT3BlbiBFZGl0b3IKK19VSV9XaXphcmRfY2F0ZWdvcnkgPSBFeGFtcGxlIEVNRiBNb2RlbCBDcmVhdGlvbiBXaXphcmRzCitfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlID0gUHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gZmlsZSAiezB9IgorX1VJX011bHRpcG9wdWxhdGlvbk1vZGVsV2l6YXJkX2xhYmVsID0gTXVsdGlwb3B1bGF0aW9uIE1vZGVsCitfVUlfTXVsdGlwb3B1bGF0aW9uTW9kZWxXaXphcmRfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgTXVsdGlwb3B1bGF0aW9uIG1vZGVsCitfVUlfTXVsdGlwb3B1bGF0aW9uRWRpdG9yX2xhYmVsID0gTXVsdGlwb3B1bGF0aW9uIE1vZGVsIEVkaXRvcgorX1VJX011bHRpcG9wdWxhdGlvbkVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2UgPSBNeQorX1VJX011bHRpcG9wdWxhdGlvbkVkaXRvckZpbGVuYW1lRXh0ZW5zaW9ucyA9IG11bHRpcG9wdWxhdGlvbgorX1VJX1dpemFyZF9sYWJlbCA9IE5ldworX1dBUk5fRmlsZW5hbWVFeHRlbnNpb24gPSBUaGUgZmlsZSBuYW1lIG11c3QgZW5kIGluICcnLnswfScnCitfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbnMgPSBUaGUgZmlsZSBuYW1lIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zOiB7MH0KK19VSV9Nb2RlbE9iamVjdCA9ICZNb2RlbCBPYmplY3QKK19VSV9YTUxFbmNvZGluZyA9ICZYTUwgRW5jb2RpbmcKK19VSV9YTUxFbmNvZGluZ0Nob2ljZXMgPSBVVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQorX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbiA9IFNlbGVjdCBhIG1vZGVsIG9iamVjdCB0byBjcmVhdGUKK19VSV9GaWxlQ29uZmxpY3RfbGFiZWwgPSBGaWxlIENvbmZsaWN0CitfV0FSTl9GaWxlQ29uZmxpY3QgPSBUaGVyZSBhcmUgdW5zYXZlZCBjaGFuZ2VzIHRoYXQgY29uZmxpY3Qgd2l0aCBjaGFuZ2VzIG1hZGUgb3V0c2lkZSB0aGUgZWRpdG9yLiAgRG8geW91IHdpc2ggdG8gZGlzY2FyZCB0aGlzIGVkaXRvcidzIGNoYW5nZXM/CitfVUlfTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfdHJhbnNtaXNzaW9uUmF0ZV9mZWF0dXJlID0gVHJhbnNtaXNzaW9uIFJhdGUKK19VSV9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9wb3B1bGF0aW9uR3JvdXBzX2ZlYXR1cmUgPSBQb3B1bGF0aW9uIEdyb3VwcworX1VJX011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX3JlY292ZXJ5UmF0ZV9mZWF0dXJlID0gUmVjb3ZlcnkgUmF0ZQorX1VJX011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX2luZmVjdGlvdXNNb3J0YWxpdHlSYXRlX2ZlYXR1cmUgPSBJbmZlY3Rpb3VzIE1vcnRhbGl0eSBSYXRlCitfVUlfTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfcGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb25fZmVhdHVyZSA9IFBoeXNpY2FsbHkgQWRqYWNlbnQgSW5mZWN0aW91cyBQcm9wb3J0aW9uCitfVUlfTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfcm9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbl9mZWF0dXJlID0gUm9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbgorX1VJX011bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbF90eXBlID0gTXVsdGkgUG9wdWxhdGlvbiBTSVIgRGlzZWFzZSBNb2RlbAorX1VJX011bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxfdHlwZSA9IE11bHRpIFBvcHVsYXRpb24gU0VJUiBEaXNlYXNlIE1vZGVsCitfVUlfTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsX2ltbXVuaXR5TG9zc1JhdGVfZmVhdHVyZSA9IEltbXVuaXR5IExvc3MgUmF0ZQorX1VJX011bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxfaW5jdWJhdGlvblJhdGVfZmVhdHVyZSA9IEluY3ViYXRpb24gUmF0ZQorX1VJX011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX2NoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2VfZmVhdHVyZSA9IENoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOGFhOGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3BsdWdpbi54bWwKQEAgLTAsMCArMSw2NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjQiPz4KKzxwbHVnaW4+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQuaXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcmllcyI+CisgICAgICA8ZmFjdG9yeQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24ucHJvdmlkZXIuTXVsdGlwb3B1bGF0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCisgICAgICAgICAgICBzdXBwb3J0ZWRUeXBlcz0ib3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIKKyAgICAgICAgCSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIKKyAgICAgICAgCSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIKKyAgICAgICAgCSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIKKyAgICAgICAgCSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlIgorICAgICAgICAgICAgdXJpPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24uZWNvcmUiPgorICAgICAgPC9mYWN0b3J5PgorICAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KKyAgICAgIDxwYWNrYWdlCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aXBvcHVsYXRpb25QYWNrYWdlIgorICAgICAgICAgICAgZ2VuTW9kZWw9Im1vZGVsL211bHRpcG9wdWxhdGlvbi5nZW5tb2RlbCIKKyAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uLmVjb3JlIj4KKyAgICAgIDwvcGFja2FnZT4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5kaXNlYXNlbW9kZWwiPgorICAgICAgPGNsYXNzZGVmCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5pbXBsLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsSW1wbCI+CisgICAgICA8L2NsYXNzZGVmPgorICAgICAgPGR1Ymxpbl9jb3JlCisgICAgICAgICAgICBjYXRlZ29yeV9pZD0iLyIKKyAgICAgICAgICAgIGNyZWF0b3I9ImVkbHVuZCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBIG11bHRpIHBvcHVsYXRpb24gU0kgZGlzZWFzZSBtb2RlbCIKKyAgICAgICAgICAgIGlkZW50aWZpZXI9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uc2kiCisgICAgICAgICAgICB0aXRsZT0iTXVsdGlQb3B1bGF0aW9uIFNJIERpc2Vhc2UgTW9kZWwiPgorICAgICAgPC9kdWJsaW5fY29yZT4KKyAgIDwvZXh0ZW5zaW9uPgorCisgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZGlzZWFzZW1vZGVsIj4KKyAgICAgIDxjbGFzc2RlZgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uaW1wbC5NdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxJbXBsIj4KKyAgICAgIDwvY2xhc3NkZWY+CisgICAgICA8ZHVibGluX2NvcmUKKyAgICAgICAgICAgIGNhdGVnb3J5X2lkPSIvIgorICAgICAgICAgICAgY3JlYXRvcj0iZWRsdW5kIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkEgbXVsdGkgcG9wdWxhdGlvbiBTSVIgZGlzZWFzZSBtb2RlbCIKKyAgICAgICAgICAgIGlkZW50aWZpZXI9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uc2lyIgorICAgICAgICAgICAgdGl0bGU9Ik11bHRpUG9wdWxhdGlvbiBTSVIgRGlzZWFzZSBNb2RlbCI+CisgICAgICA8L2R1Ymxpbl9jb3JlPgorICAgPC9leHRlbnNpb24+CisKKyAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5kaXNlYXNlbW9kZWwiPgorICAgICAgPGNsYXNzZGVmCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5pbXBsLk11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxJbXBsIj4KKyAgICAgIDwvY2xhc3NkZWY+CisgICAgICA8ZHVibGluX2NvcmUKKyAgICAgICAgICAgIGNhdGVnb3J5X2lkPSIvIgorICAgICAgICAgICAgY3JlYXRvcj0iZWRsdW5kIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkEgbXVsdGkgcG9wdWxhdGlvbiBTRUlSIGRpc2Vhc2UgbW9kZWwiCisgICAgICAgICAgICBpZGVudGlmaWVyPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLnNlaXIiCisgICAgICAgICAgICB0aXRsZT0iTXVsdGlQb3B1bGF0aW9uIFNFSVIgRGlzZWFzZSBNb2RlbCI+CisgICAgICA8L2R1Ymxpbl9jb3JlPgorICAgPC9leHRlbnNpb24+CisKKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi9BY3RpdmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vQWN0aXZhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmNTFkOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLnByb3ZpZGVyLk11bHRpcG9wdWxhdGlvblBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0YW5kYXJkSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0YW5kYXJkUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdGFuZGFyZFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCisvKioKKyAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQorICovCitwdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7CisKKwkvKioKKwkgKiBUaGUgcGx1Zy1pbiBJRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IENvbnN0YW50cy5JRF9ST09UICsgIi5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbiI7CisKKwkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCisJcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsKKworCS8qKgorCSAqIFRoZSBjb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBBY3RpdmF0b3IoKSB7CisJCXBsdWdpbiA9IHRoaXM7CisJfQorCisJLyoqCisJICogQHBhcmFtIGNvbnRleHQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCQkvLyBXZSBjcmVhdGUgdGhlc2UgaW5zdGFuY2VzIHNvIHRoYXQgdGhlaXIgY29uc3RydWN0b3JzIHJ1biBhbmQgdGhleQorCQkvLyB0aGVuIGFkZCB0aGVtc2VsdmVzIHRvIGEgY29sbGVjdGlvbiBvZiBmYWN0b3JpZXMgbWFpbnRhaW5lZCBieSB0aGUKKwkJLy8gZmFjdG9yeSBpbnRlcmZhY2VzIHRoZXkgaW1wbGVtZW50IHJlc3BlY3RpdmVseS4KKwkJCisJCW5ldyBNdWx0aXBvcHVsYXRpb25Qb3B1bGF0aW9uRW51bWVyYXRvckFkYXB0ZXJGYWN0b3J5KCk7CQkKKwl9IC8vIAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICovCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlwbHVnaW4gPSBudWxsOworCQlzdXBlci5zdG9wKGNvbnRleHQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQorCSAqIAorCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogTG9nIGFuIGVycm9yIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgdGV4dAorCSAqIEBwYXJhbSBleGNlcHRpb24KKwkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQkvLyBSdW5uaW5nIGFzIGEgcGx1Z2luPworCQlpZiAocGx1Z2luICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJcGx1Z2luLmdldExvZygpLmxvZygKKwkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBwbHVnaW4uZ2V0QnVuZGxlKCkKKwkJCQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOworCQl9IGVsc2UgeworCQkJU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UpOworCQkJLy8gRXhjZXB0aW9uPworCQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJU3lzdGVtLmVyci5wcmludGxuKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisJCQl9CisJCX0KKworCX0gLy8gbG9nRXJyb3IKKworCS8qKgorCSAqIExvZyBpbmZvcm1hdGlvbiB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4KKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqICAgICAgICAgICAgdGhlIGxvY2FsaXplZCBpbmZvcm1hdGlvbiBtZXNzYWdlIHRleHQKKwkgKiBAcGFyYW0gZXhjZXB0aW9uCisJICogICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW5mb3JtYXRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJLy8gRG8gd2UgaGF2ZSBhIHBsdWdpbj8KKwkJaWYgKHBsdWdpbiAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXBsdWdpbi5nZXRMb2coKS5sb2coCisJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCisJCQkJCQkJMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7CisJCX0KKwkJZWxzZSB7CisJCQkvLyBObworCQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOworCQkJLy8gRXhjZXB0aW9uPworCQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJU3lzdGVtLm91dC5wcmludGxuKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworCQkJfSAvLyBpZiAKKwkJfQorCX0gLy8gbG9nSW5mb3JtYXRpb24KKwkKKwkKKwkvKioKKwkgKiBMb2cgaW5mb3JtYXRpb24gdG8gdGhlIElMb2cgZm9yIHRoaXMgcGx1Z2luCisJICogVGhlIG1ldGhvZCBpcyBvdmVybG9hZGVkIHRvIGFsbG93IGZvciBsb2dJbmZvcm1hdGlvbiB3aXRob3V0IGFuIGVycm9yIAorCSAqIG1ldGhvZCBzZXRzIHRoZSBlcnJvciB0byBudWxsLiBUaGlzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgU3lzdGVtLm91dC5wcmludGxuCisJICogdGhyb3VnaG91dCB0aGUgY29kZS4KKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqICAgICAgICAgICAgdGhlIGxvY2FsaXplZCBpbmZvcm1hdGlvbiBtZXNzYWdlIHRleHQKKwkgKgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dJbmZvcm1hdGlvbihTdHJpbmcgbWVzc2FnZSkgeworCQkvLyBEbyB3ZSBoYXZlIGEgcGx1Z2luPworCQlpZiAocGx1Z2luICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJcGx1Z2luLmdldExvZygpLmxvZygKKwkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKKwkJCQkJCQkwLCBtZXNzYWdlLCBudWxsKSk7CisJCX0KKwkJZWxzZSB7CisJCQkvLyBObworCQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOworCQl9CisJfSAvLyBsb2dJbmZvcm1hdGlvbgorfSAvLyBBY3RpdmF0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi9NdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc3ZTljNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbC5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZCQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZUxpc3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk11bHRpIFBvcHVsYXRpb24gU0VJUiBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCNnZXRJbmN1YmF0aW9uUmF0ZSA8ZW0+SW5jdWJhdGlvbiBSYXRlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpcG9wdWxhdGlvblBhY2thZ2UjZ2V0TXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBNdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsIGV4dGVuZHMgTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmN1YmF0aW9uIFJhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluY3ViYXRpb24gUmF0ZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmN1YmF0aW9uIFJhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEluY3ViYXRpb25SYXRlKERvdWJsZVZhbHVlTGlzdCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlwb3B1bGF0aW9uUGFja2FnZSNnZXRNdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsX0luY3ViYXRpb25SYXRlKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEb3VibGVWYWx1ZUxpc3QgZ2V0SW5jdWJhdGlvblJhdGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCNnZXRJbmN1YmF0aW9uUmF0ZSA8ZW0+SW5jdWJhdGlvbiBSYXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmN1YmF0aW9uIFJhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEluY3ViYXRpb25SYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJbmN1YmF0aW9uUmF0ZShEb3VibGVWYWx1ZUxpc3QgdmFsdWUpOworCit9IC8vIE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDMwNzNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjMwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZU1hdHJpeDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlN0cmluZ1ZhbHVlTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uR3JvdXA7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk11bHRpIFBvcHVsYXRpb24gU0kgRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsI2dldFBvcHVsYXRpb25Hcm91cHMgPGVtPlBvcHVsYXRpb24gR3JvdXBzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsI2dldFRyYW5zbWlzc2lvblJhdGUgPGVtPlRyYW5zbWlzc2lvbiBSYXRlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsI2dldFJlY292ZXJ5UmF0ZSA8ZW0+UmVjb3ZlcnkgUmF0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCNnZXRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSA8ZW0+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCNnZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbiA8ZW0+UGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwjZ2V0Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbiA8ZW0+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCNnZXRDaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlIDxlbT5DaGFyYWN0ZXJpc3RpYyBNaXhpbmcgRGlzdGFuY2U8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlwb3B1bGF0aW9uUGFja2FnZSNnZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCBleHRlbmRzIFN0YW5kYXJkRGlzZWFzZU1vZGVsIHsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRyYW5zbWlzc2lvbiBSYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UcmFuc21pc3Npb24gUmF0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc21pc3Npb24gUmF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0VHJhbnNtaXNzaW9uUmF0ZShEb3VibGVWYWx1ZU1hdHJpeCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlwb3B1bGF0aW9uUGFja2FnZSNnZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9UcmFuc21pc3Npb25SYXRlKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEb3VibGVWYWx1ZU1hdHJpeCBnZXRUcmFuc21pc3Npb25SYXRlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsI2dldFRyYW5zbWlzc2lvblJhdGUgPGVtPlRyYW5zbWlzc2lvbiBSYXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc21pc3Npb24gUmF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0VHJhbnNtaXNzaW9uUmF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VHJhbnNtaXNzaW9uUmF0ZShEb3VibGVWYWx1ZU1hdHJpeCB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWNvdmVyeSBSYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWNvdmVyeSBSYXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlY292ZXJ5IFJhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFJlY292ZXJ5UmF0ZShEb3VibGVWYWx1ZUxpc3QpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpcG9wdWxhdGlvblBhY2thZ2UjZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfUmVjb3ZlcnlSYXRlKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEb3VibGVWYWx1ZUxpc3QgZ2V0UmVjb3ZlcnlSYXRlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsI2dldFJlY292ZXJ5UmF0ZSA8ZW0+UmVjb3ZlcnkgUmF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVjb3ZlcnkgUmF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UmVjb3ZlcnlSYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRSZWNvdmVyeVJhdGUoRG91YmxlVmFsdWVMaXN0IHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0SW5mZWN0aW91c01vcnRhbGl0eVJhdGUoRG91YmxlVmFsdWVMaXN0KQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aXBvcHVsYXRpb25QYWNrYWdlI2dldE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX0luZmVjdGlvdXNNb3J0YWxpdHlSYXRlKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEb3VibGVWYWx1ZUxpc3QgZ2V0SW5mZWN0aW91c01vcnRhbGl0eVJhdGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwjZ2V0SW5mZWN0aW91c01vcnRhbGl0eVJhdGUgPGVtPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZShEb3VibGVWYWx1ZUxpc3QgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMC4wMSI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlwb3B1bGF0aW9uUGFja2FnZSNnZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9QaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbigpCisJICogQG1vZGVsIGRlZmF1bHQ9IjAuMDEiCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCNnZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbiA8ZW0+UGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBoeXNpY2FsbHkgQWRqYWNlbnQgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb24oZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvYWQgTmV0d29yayBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMC4wNSI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2FkIE5ldHdvcmsgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRSb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlwb3B1bGF0aW9uUGFja2FnZSNnZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9Sb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMC4wNSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldFJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwjZ2V0Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbiA8ZW0+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbihkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhcmFjdGVyaXN0aWMgTWl4aW5nIERpc3RhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjIuMjUiPC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFyYWN0ZXJpc3RpYyBNaXhpbmcgRGlzdGFuY2U8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aXBvcHVsYXRpb25QYWNrYWdlI2dldE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX0NoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSIyLjI1IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0Q2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCNnZXRDaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlIDxlbT5DaGFyYWN0ZXJpc3RpYyBNaXhpbmcgRGlzdGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0Q2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Q2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBHcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvcHVsYXRpb24gR3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvcHVsYXRpb24gR3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRQb3B1bGF0aW9uR3JvdXBzKFN0cmluZ1ZhbHVlTGlzdCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlwb3B1bGF0aW9uUGFja2FnZSNnZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9Qb3B1bGF0aW9uR3JvdXBzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmdWYWx1ZUxpc3QgZ2V0UG9wdWxhdGlvbkdyb3VwcygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCNnZXRQb3B1bGF0aW9uR3JvdXBzIDxlbT5Qb3B1bGF0aW9uIEdyb3VwczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbiBHcm91cHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25Hcm91cHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFBvcHVsYXRpb25Hcm91cHMoU3RyaW5nVmFsdWVMaXN0IHZhbHVlKTsKK30gLy8gTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL011bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NTZkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL011bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbC5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZCQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZUxpc3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk11bHRpIFBvcHVsYXRpb24gU0lSIERpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwjZ2V0SW1tdW5pdHlMb3NzUmF0ZSA8ZW0+SW1tdW5pdHkgTG9zcyBSYXRlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpcG9wdWxhdGlvblBhY2thZ2UjZ2V0TXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIE11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbCBleHRlbmRzIE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbW11bml0eSBMb3NzIFJhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkltbXVuaXR5IExvc3MgUmF0ZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbW11bml0eSBMb3NzIFJhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEltbXVuaXR5TG9zc1JhdGUoRG91YmxlVmFsdWVMaXN0KQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aXBvcHVsYXRpb25QYWNrYWdlI2dldE11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbF9JbW11bml0eUxvc3NSYXRlKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEb3VibGVWYWx1ZUxpc3QgZ2V0SW1tdW5pdHlMb3NzUmF0ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwjZ2V0SW1tdW5pdHlMb3NzUmF0ZSA8ZW0+SW1tdW5pdHkgTG9zcyBSYXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbW11bml0eSBMb3NzIFJhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEltbXVuaXR5TG9zc1JhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEltbXVuaXR5TG9zc1JhdGUoRG91YmxlVmFsdWVMaXN0IHZhbHVlKTsKKworfSAvLyBNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vTXVsdGlwb3B1bGF0aW9uRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi9NdWx0aXBvcHVsYXRpb25GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhOGExOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vTXVsdGlwb3B1bGF0aW9uRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aXBvcHVsYXRpb25QYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTXVsdGlwb3B1bGF0aW9uRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCU11bHRpcG9wdWxhdGlvbkZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5pbXBsLk11bHRpcG9wdWxhdGlvbkZhY3RvcnlJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TXVsdGkgUG9wdWxhdGlvbiBTSSBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NdWx0aSBQb3B1bGF0aW9uIFNJIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCU11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsIGNyZWF0ZU11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk11bHRpIFBvcHVsYXRpb24gU0lSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk11bHRpIFBvcHVsYXRpb24gU0lSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCU11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbCBjcmVhdGVNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TXVsdGkgUG9wdWxhdGlvbiBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk11bHRpIFBvcHVsYXRpb24gU0VJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlNdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsIGNyZWF0ZU11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTXVsdGlwb3B1bGF0aW9uUGFja2FnZSBnZXRNdWx0aXBvcHVsYXRpb25QYWNrYWdlKCk7CisKK30gLy9NdWx0aXBvcHVsYXRpb25GYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL011bHRpcG9wdWxhdGlvblBhY2thZ2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiN2MyYWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL011bHRpcG9wdWxhdGlvblBhY2thZ2UuamF2YQpAQCAtMCwwICsxLDExMjggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAorICogPHVsPgorICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKyAqIDwvdWw+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aXBvcHVsYXRpb25GYWN0b3J5CisgKiBAbW9kZWwga2luZD0icGFja2FnZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgeworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOQU1FID0gIm11bHRpcG9wdWxhdGlvbiI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi5lY29yZSI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uIjsKKworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTXVsdGlwb3B1bGF0aW9uUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLmltcGwuTXVsdGlwb3B1bGF0aW9uUGFja2FnZUltcGwuaW5pdCgpOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLmltcGwuTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxJbXBsIDxlbT5NdWx0aSBQb3B1bGF0aW9uIFNJIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLmltcGwuTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLmltcGwuTXVsdGlwb3B1bGF0aW9uUGFja2FnZUltcGwjZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1VSSSA9IFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1RZUEVfVVJJID0gU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19EVUJMSU5fQ09SRSA9IFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0xBQkVMU19UT19VUERBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fTEFCRUxTX1RPX1VQREFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0dSQVBIID0gU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX0dSQVBIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0VOQUJMRUQgPSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fRU5BQkxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0dSQVBIX0RFQ09SQVRFRCA9IFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1BST0dSRVNTID0gU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1BST0dSRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EID0gU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FID0gU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX0RJU0VBU0VfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWxhdGl2ZSBUb2xlcmFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1JFTEFUSVZFX1RPTEVSQU5DRSA9IFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXRlIERpZmZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0ZJTklURV9ESUZGRVJFTkNFID0gU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX0ZJTklURV9ESUZGRVJFTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyZXF1ZW5jeSBEZXBlbmRlbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0ZSRVFVRU5DWV9ERVBFTkRFTlQgPSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIEJpcnRoIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfQklSVEhfUkFURSA9IFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVCA9IFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQgUmVjaXByb2NhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMID0gU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBBcmVhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19UT1RBTF9BUkVBID0gU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1RPVEFMX0FSRUE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFBvcHVsYXRpb24gRGVuc2l0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWSA9IFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0dST1VQUyA9IFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zbWlzc2lvbiBSYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURSA9IFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlY292ZXJ5IFJhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEUgPSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmZlY3Rpb3VzIE1vcnRhbGl0eSBSYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFID0gU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTiA9IFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFID0gU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDY7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TXVsdGkgUG9wdWxhdGlvbiBTSSBEaXNlYXNlIE1vZGVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UID0gU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDc7CisKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5pbXBsLk11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbEltcGwgPGVtPk11bHRpIFBvcHVsYXRpb24gU0lSIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLmltcGwuTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5pbXBsLk11bHRpcG9wdWxhdGlvblBhY2thZ2VJbXBsI2dldE11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19VUkkgPSBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX1RZUEVfVVJJID0gTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFID0gTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19MQUJFTFNfVE9fVVBEQVRFID0gTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0dSQVBIID0gTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19HUkFQSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fRU5BQkxFRCA9IE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fRU5BQkxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQgPSBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX1BST0dSRVNTID0gTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19QUk9HUkVTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIE1vcnRhbGl0eSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURSA9IE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EID0gTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19USU1FX1BFUklPRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNlYXNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19ESVNFQVNFX05BTUUgPSBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0RJU0VBU0VfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWxhdGl2ZSBUb2xlcmFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0UgPSBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1JFTEFUSVZFX1RPTEVSQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pdGUgRGlmZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0ZJTklURV9ESUZGRVJFTkNFID0gTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19GSU5JVEVfRElGRkVSRU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GcmVxdWVuY3kgRGVwZW5kZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVCA9IE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIEJpcnRoIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEUgPSBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfQklSVEhfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBQb3B1bGF0aW9uIENvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVCA9IE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBQb3B1bGF0aW9uIENvdW50IFJlY2lwcm9jYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UX1JFQ0lQUk9DQUwgPSBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBBcmVhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fVE9UQUxfQVJFQSA9IE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fVE9UQUxfQVJFQTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgUG9wdWxhdGlvbiBEZW5zaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWSA9IE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIEdyb3VwczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTID0gTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0dST1VQUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc21pc3Npb24gUmF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFID0gTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWNvdmVyeSBSYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fUkVDT1ZFUllfUkFURSA9IE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUkVDT1ZFUllfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmZlY3Rpb3VzIE1vcnRhbGl0eSBSYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURSA9IE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaHlzaWNhbGx5IEFkamFjZW50IEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkIE5ldHdvcmsgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTiA9IE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFyYWN0ZXJpc3RpYyBNaXhpbmcgRGlzdGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0UgPSBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbW11bml0eSBMb3NzIFJhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19JTU1VTklUWV9MT1NTX1JBVEUgPSBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TXVsdGkgUG9wdWxhdGlvbiBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgPSBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uaW1wbC5NdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsSW1wbCA8ZW0+TXVsdGkgUG9wdWxhdGlvbiBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLmltcGwuTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uaW1wbC5NdWx0aXBvcHVsYXRpb25QYWNrYWdlSW1wbCNnZXRNdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTF9fVVJJID0gTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX1RZUEVfVVJJID0gTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTF9fRFVCTElOX0NPUkUgPSBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTF9fTEFCRUxTX1RPX1VQREFURSA9IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0xBQkVMU19UT19VUERBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGg8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0dSQVBIID0gTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fR1JBUEg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMX19FTkFCTEVEID0gTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fRU5BQkxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTF9fR1JBUEhfREVDT1JBVEVEID0gTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fR1JBUEhfREVDT1JBVEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2dyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX1BST0dSRVNTID0gTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fUFJPR1JFU1M7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFID0gTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSID0gTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EID0gTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0Q7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0RJU0VBU0VfTkFNRSA9IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0RJU0VBU0VfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWxhdGl2ZSBUb2xlcmFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTF9fUkVMQVRJVkVfVE9MRVJBTkNFID0gTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fUkVMQVRJVkVfVE9MRVJBTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbml0ZSBEaWZmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0ZJTklURV9ESUZGRVJFTkNFID0gTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJlcXVlbmN5IERlcGVuZGVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMX19GUkVRVUVOQ1lfREVQRU5ERU5UID0gTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIEJpcnRoIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9CSVJUSF9SQVRFID0gTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9CSVJUSF9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVCA9IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudCBSZWNpcHJvY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTCA9IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBBcmVhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX0FSRUEgPSBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19UT1RBTF9BUkVBOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBQb3B1bGF0aW9uIERlbnNpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTF9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWSA9IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBHcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9HUk9VUFMgPSBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0dST1VQUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc21pc3Npb24gUmF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURSA9IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlY292ZXJ5IFJhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTF9fUkVDT1ZFUllfUkFURSA9IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFID0gTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaHlzaWNhbGx5IEFkamFjZW50IEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTiA9IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWQgTmV0d29yayBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTF9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTiA9IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhcmFjdGVyaXN0aWMgTWl4aW5nIERpc3RhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRSA9IE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbW11bml0eSBMb3NzIFJhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTF9fSU1NVU5JVFlfTE9TU19SQVRFID0gTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fSU1NVU5JVFlfTE9TU19SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY3ViYXRpb24gUmF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMX19JTkNVQkFUSU9OX1JBVEUgPSBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk11bHRpIFBvcHVsYXRpb24gU0VJUiBEaXNlYXNlIE1vZGVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgPSBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxOworCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsIDxlbT5NdWx0aSBQb3B1bGF0aW9uIFNJIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TXVsdGkgUG9wdWxhdGlvbiBTSSBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCNnZXRUcmFuc21pc3Npb25SYXRlIDxlbT5UcmFuc21pc3Npb24gUmF0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlRyYW5zbWlzc2lvbiBSYXRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCNnZXRUcmFuc21pc3Npb25SYXRlKCkKKwkgKiBAc2VlICNnZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfVHJhbnNtaXNzaW9uUmF0ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsI2dldFJlY292ZXJ5UmF0ZSA8ZW0+UmVjb3ZlcnkgUmF0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJlY292ZXJ5IFJhdGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsI2dldFJlY292ZXJ5UmF0ZSgpCisJICogQHNlZSAjZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX1JlY292ZXJ5UmF0ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsI2dldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlIDxlbT5JbmZlY3Rpb3VzIE1vcnRhbGl0eSBSYXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwjZ2V0SW5mZWN0aW91c01vcnRhbGl0eVJhdGUoKQorCSAqIEBzZWUgI2dldE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9JbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsI2dldFBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uIDxlbT5QaHlzaWNhbGx5IEFkamFjZW50IEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBoeXNpY2FsbHkgQWRqYWNlbnQgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCNnZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbigpCisJICogQHNlZSAjZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX1BoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwjZ2V0Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbiA8ZW0+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJvYWQgTmV0d29yayBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsI2dldFJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24oKQorCSAqIEBzZWUgI2dldE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9Sb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwjZ2V0Q2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSA8ZW0+Q2hhcmFjdGVyaXN0aWMgTWl4aW5nIERpc3RhbmNlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhcmFjdGVyaXN0aWMgTWl4aW5nIERpc3RhbmNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCNnZXRDaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlKCkKKwkgKiBAc2VlICNnZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfQ2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwgPGVtPk11bHRpIFBvcHVsYXRpb24gU0lSIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TXVsdGkgUG9wdWxhdGlvbiBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwjZ2V0SW1tdW5pdHlMb3NzUmF0ZSA8ZW0+SW1tdW5pdHkgTG9zcyBSYXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW1tdW5pdHkgTG9zcyBSYXRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwjZ2V0SW1tdW5pdHlMb3NzUmF0ZSgpCisJICogQHNlZSAjZ2V0TXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxfSW1tdW5pdHlMb3NzUmF0ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsIDxlbT5NdWx0aSBQb3B1bGF0aW9uIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NdWx0aSBQb3B1bGF0aW9uIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0TXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwjZ2V0SW5jdWJhdGlvblJhdGUgPGVtPkluY3ViYXRpb24gUmF0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkluY3ViYXRpb24gUmF0ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCNnZXRJbmN1YmF0aW9uUmF0ZSgpCisJICogQHNlZSAjZ2V0TXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0TXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbF9JbmN1YmF0aW9uUmF0ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsI2dldFBvcHVsYXRpb25Hcm91cHMgPGVtPlBvcHVsYXRpb24gR3JvdXBzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UG9wdWxhdGlvbiBHcm91cHM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsI2dldFBvcHVsYXRpb25Hcm91cHMoKQorCSAqIEBzZWUgI2dldE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9Qb3B1bGF0aW9uR3JvdXBzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlNdWx0aXBvcHVsYXRpb25GYWN0b3J5IGdldE11bHRpcG9wdWxhdGlvbkZhY3RvcnkoKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKwkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorCSAqIDwvdWw+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCWludGVyZmFjZSBMaXRlcmFscyB7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5pbXBsLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsSW1wbCA8ZW0+TXVsdGkgUG9wdWxhdGlvbiBTSSBEaXNlYXNlIE1vZGVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5pbXBsLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uaW1wbC5NdWx0aXBvcHVsYXRpb25QYWNrYWdlSW1wbCNnZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUwgPSBlSU5TVEFOQ0UuZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFuc21pc3Npb24gUmF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEUgPSBlSU5TVEFOQ0UuZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfVHJhbnNtaXNzaW9uUmF0ZSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlY292ZXJ5IFJhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEUgPSBlSU5TVEFOQ0UuZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfUmVjb3ZlcnlSYXRlKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURSA9IGVJTlNUQU5DRS5nZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9JbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBoeXNpY2FsbHkgQWRqYWNlbnQgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTiA9IGVJTlNUQU5DRS5nZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9QaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbigpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvYWQgTmV0d29yayBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT04gPSBlSU5TVEFOQ0UuZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfUm9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbigpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFID0gZUlOU1RBTkNFLmdldE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX0NoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UoKTsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLmltcGwuTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsSW1wbCA8ZW0+TXVsdGkgUG9wdWxhdGlvbiBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uaW1wbC5NdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5pbXBsLk11bHRpcG9wdWxhdGlvblBhY2thZ2VJbXBsI2dldE11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMID0gZUlOU1RBTkNFLmdldE11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbCgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltbXVuaXR5IExvc3MgUmF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0lNTVVOSVRZX0xPU1NfUkFURSA9IGVJTlNUQU5DRS5nZXRNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxfSW1tdW5pdHlMb3NzUmF0ZSgpOworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uaW1wbC5NdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsSW1wbCA8ZW0+TXVsdGkgUG9wdWxhdGlvbiBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLmltcGwuTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLmltcGwuTXVsdGlwb3B1bGF0aW9uUGFja2FnZUltcGwjZ2V0TXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBNVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTCA9IGVJTlNUQU5DRS5nZXRNdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5jdWJhdGlvbiBSYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0lOQ1VCQVRJT05fUkFURSA9IGVJTlNUQU5DRS5nZXRNdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsX0luY3ViYXRpb25SYXRlKCk7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBHcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTID0gZUlOU1RBTkNFLmdldE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX1BvcHVsYXRpb25Hcm91cHMoKTsKKworCX0KKworfSAvL011bHRpcG9wdWxhdGlvblBhY2thZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vaW1wbC9NdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi9pbXBsL011bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3ZjFjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vaW1wbC9NdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzQ0IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlN0cmluZ1ZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlwb3B1bGF0aW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TRUlSTGFiZWxWYWx1ZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lMYWJlbFZhbHVlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJMYWJlbFZhbHVlSW1wbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk11bHRpIFBvcHVsYXRpb24gU0VJUiBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLmltcGwuTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbEltcGwjZ2V0SW5jdWJhdGlvblJhdGUgPGVtPkluY3ViYXRpb24gUmF0ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxJbXBsIGV4dGVuZHMgTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsSW1wbCBpbXBsZW1lbnRzIE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY3ViYXRpb25SYXRlKCkgPGVtPkluY3ViYXRpb24gUmF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW5jdWJhdGlvblJhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBEb3VibGVWYWx1ZUxpc3QgaW5jdWJhdGlvblJhdGU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5MaXRlcmFscy5NVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRG91YmxlVmFsdWVMaXN0IGdldEluY3ViYXRpb25SYXRlKCkgeworCQlyZXR1cm4gaW5jdWJhdGlvblJhdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW5jdWJhdGlvblJhdGUoRG91YmxlVmFsdWVMaXN0IG5ld0luY3ViYXRpb25SYXRlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCURvdWJsZVZhbHVlTGlzdCBvbGRJbmN1YmF0aW9uUmF0ZSA9IGluY3ViYXRpb25SYXRlOworCQlpbmN1YmF0aW9uUmF0ZSA9IG5ld0luY3ViYXRpb25SYXRlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMX19JTkNVQkFUSU9OX1JBVEUsIG9sZEluY3ViYXRpb25SYXRlLCBuZXdJbmN1YmF0aW9uUmF0ZSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SW5jdWJhdGlvblJhdGUoRG91YmxlVmFsdWVMaXN0IG5ld0luY3ViYXRpb25SYXRlKSB7CisJCWlmIChuZXdJbmN1YmF0aW9uUmF0ZSAhPSBpbmN1YmF0aW9uUmF0ZSkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoaW5jdWJhdGlvblJhdGUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaW5jdWJhdGlvblJhdGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMX19JTkNVQkFUSU9OX1JBVEUsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0luY3ViYXRpb25SYXRlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0luY3ViYXRpb25SYXRlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTF9fSU5DVUJBVElPTl9SQVRFLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEluY3ViYXRpb25SYXRlKG5ld0luY3ViYXRpb25SYXRlLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0lOQ1VCQVRJT05fUkFURSwgbmV3SW5jdWJhdGlvblJhdGUsIG5ld0luY3ViYXRpb25SYXRlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMX19JTkNVQkFUSU9OX1JBVEU6CisJCQkJcmV0dXJuIGJhc2ljU2V0SW5jdWJhdGlvblJhdGUobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmREaXNlYXNlTW9kZWxJbXBsI2NvbXB1dGVEZWF0aHMob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSwKKwkgKiAgICAgIGxvbmcpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjb21wdXRlRGlzZWFzZURlYXRoc0RlbHRhcygKKwkJCWZpbmFsIFNURU1UaW1lIHRpbWUsIGZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZUxhYmVsLCBmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY3VycmVudExhYmVsVmFsdWUsIGZpbmFsIGxvbmcgdGltZURlbHRhLCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHJldHVyblZhbHVlKSB7CisKKwkJU3RyaW5nIHRoaXNQb3B1bGF0aW9uID0gZGlzZWFzZUxhYmVsLmdldFBvcHVsYXRpb25Nb2RlbExhYmVsKCkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKwkJZmluYWwgU0VJUkxhYmVsVmFsdWUgY3VycmVudFNFSVIgPSAoU0VJUkxhYmVsVmFsdWUpIGN1cnJlbnRMYWJlbFZhbHVlOworCQkKKwkJZmluYWwgZG91YmxlIGFkanVzdGVkSW5mZWN0aW91c01vcnRhbGl0eVJhdGUgPSBnZXRBZGp1c3RlZEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKHRpbWVEZWx0YSwgdGhpc1BvcHVsYXRpb24pOworCQkKKwkJZmluYWwgZG91YmxlIGRpc2Vhc2VEZWF0aHMgPSBhZGp1c3RlZEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlCisJCQkJKiBjdXJyZW50U0VJUi5nZXRJKCk7CisKKwkJU0VJUkxhYmVsVmFsdWVJbXBsIHJldCA9IChTRUlSTGFiZWxWYWx1ZUltcGwpcmV0dXJuVmFsdWU7CisJCXJldC5zZXRTKDAuMCk7CisJCXJldC5zZXRJKC1kaXNlYXNlRGVhdGhzKTsKKwkJcmV0LnNldEUoMC4wKTsKKwkJcmV0LnNldFIoMC4wKTsKKwkJcmV0LnNldEluY2lkZW5jZSgwLjApOworCQlyZXQuc2V0RGlzZWFzZURlYXRocyhkaXNlYXNlRGVhdGhzKTsKKwkJCisJCXJldHVybiByZXQ7CisJfSAvLyBjb21wdXRlQmlydGhEZWF0aHNEZWx0YXMKKworCUBPdmVycmlkZQorCXB1YmxpYyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY29tcHV0ZURpc2Vhc2VEZWx0YXMoU1RFTVRpbWUgdGltZSwKKwkJCVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjdXJyZW50U3RhdGUsCisJCQlTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VMYWJlbCwgbG9uZyB0aW1lRGVsdGEsCisJCQlEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHJldHVyblZhbHVlKSB7CisJCQorCQkvLyBUSElTIG1ldGhvZCBnZXRzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgb25jZSBmb3IgZWFjaCBwb3B1bGF0aW9uIGlkZW50aWZpZXIKKwkJLy8gaW4gdGhlIHBvcHVsYXRpb24gbW9kZWwuCisJCS8vIHdoaWNoIHBvcHVsYXRpb24gaXMgInRoaXMiLi4uLgorCQlmaW5hbCBTRUlSTGFiZWxWYWx1ZSBjdXJyZW50U0VJUiA9IChTRUlSTGFiZWxWYWx1ZSkgY3VycmVudFN0YXRlOworCQlTdHJpbmcgdGhpc1BvcHVsYXRpb24gPSBkaXNlYXNlTGFiZWwuZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpOworCQkJCQorCQkvLyBuZXh0IGdldCBpdCdzIElOREVYIGluIHRoZSBtb2RlbAorCQlpbnQgcG9wdWxhdGlvbkluZGV4ID0gdGhpcy5nZXRQb3B1bGF0aW9uSW5kZXgodGhpc1BvcHVsYXRpb24pOwkKKwkJCQorCQkvLyBub3cgd2Uga25vdyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgcG9wdWxhdGlvbiBiZWluZyBpbnRlZ3JhdGVkLgorCQkvLyBHZXQgdGhlIGNvcnJlY3QgdHJhbnNtaXNzaW9uIHJhdGUgbGlzdCBmcm9tIHRoZSBNQVRSSVgKKwkJRUxpc3Q8RG91YmxlVmFsdWU+IHRyYW5zbWlzc2lvblZlY3RvciA9IHRyYW5zbWlzc2lvblJhdGUuZ2V0VmFsdWVMaXN0cygpLmdldChwb3B1bGF0aW9uSW5kZXgpLmdldFZhbHVlcygpOworCQkKKwkJLy8gQUxMIHRoZSBvdGhlciBkaXNlYXNlIHBhcmFtZXRlcnMgYXJlIGFsc28gRG91YmxlVmFsdWVMaXN0cy4gV2Ugbm93IGl0ZXJhdGUgdGhyb3VnaCBhbGwgcG9wdWxhdGlvbnMKKwkJLy8gZ2V0IHRoZSBzcGVjaWZpYyByYXRlIHBhcmFtZXRlcnMgZnJvbSBFQUNIIGxpc3QgYmFzZWQgb24gdGhpcyBwb3B1bGF0aW9uIGluZGV4CisJCWRvdWJsZSB0aGlzUmVjb3ZlcnlSYXRlID0gMC4wOworCQlpZihyZWNvdmVyeVJhdGUgIT0gbnVsbCkgdGhpc1JlY292ZXJ5UmF0ZSA9IHJlY292ZXJ5UmF0ZS5nZXRWYWx1ZXMoKS5nZXQocG9wdWxhdGlvbkluZGV4KS5nZXRWYWx1ZSgpOworCQlkb3VibGUgdGhpc0ltbXVuaXR5TG9zc1JhdGUgPSAwLjA7CisJCWlmKGltbXVuaXR5TG9zc1JhdGUgIT0gbnVsbCkKKwkJCXRoaXNJbW11bml0eUxvc3NSYXRlID0gaW1tdW5pdHlMb3NzUmF0ZS5nZXRWYWx1ZXMoKS5nZXQocG9wdWxhdGlvbkluZGV4KS5nZXRWYWx1ZSgpOworCQlkb3VibGUgdGhpc0luY3ViYXRpb25SYXRlID0gMC4wOworCQlpZihpbmN1YmF0aW9uUmF0ZSAhPSBudWxsKSAKKwkJCXRoaXNJbmN1YmF0aW9uUmF0ZSA9IGluY3ViYXRpb25SYXRlLmdldFZhbHVlcygpLmdldChwb3B1bGF0aW9uSW5kZXgpLmdldFZhbHVlKCk7CisJCQorCQkvLyAgTk9XIGl0ZXJhdGUgb3ZlciBldmVyeSBwb3B1bGF0aW9uIChpbmNsdWRpbmcgdGhpcyBvbmUpIHRvIGNvbXB1dGUgbmV3IGluZmVjdGlvbnMKKwkJLy8gIHRoaXMgaW5jbHVkZXMgaW5mZWN0aW9ucyB3aXRoaW4gYSBwb3B1bGF0aW9uIGdyb3VwCisJCS8vICBhbmQgYWxsIHRoZSBjcm9zcyB0ZXJtcworCQlkb3VibGUgbnVtYmVyT2ZTdXNjZXB0aWJsZVRvRXhwb3NlZCA9IDAuMDsKKwkJZG91YmxlIG51bWJlclN1c2NlcHRpYmxlID0gY3VycmVudFNFSVIuZ2V0UygpOworCQlOb2RlIHRoaXNOb2RlID0gZGlzZWFzZUxhYmVsLmdldE5vZGUoKTsKKwkJCisJCUVMaXN0PFN0cmluZ1ZhbHVlPiBncm91cExpc3QgPSBwb3B1bGF0aW9uR3JvdXBzLmdldFZhbHVlcygpOworCQkKKwkJZm9yKGludCBpID0gMDsgaTwgdHJhbnNtaXNzaW9uVmVjdG9yLnNpemUoKTsgaSArKykgeworCQkJLy8gV2UgbmVlZCB0byBnZXQgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGl0aCBwb3B1bGF0aW9uIG1vZGVsCisJCQlTdHJpbmcgbmV4dFBvcCA9IGdyb3VwTGlzdC5nZXQoaSkuZ2V0VmFsdWUoKTsKKwkJCQorICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vCisJCQkvLyAxLiBjb21wdXRlIEJFVEEgZm9yIHRyYW5zbWlzc2lvbiBmcm9tIHRoZSBpdGggcG9wdWxhdGlvbiB0byB0aGlzIHBvcHVsYXRpb24KKwkJCSBkb3VibGUgc3BlY2lmaWNUcmFuc21pc3Npb24gPSB0cmFuc21pc3Npb25WZWN0b3IuZ2V0KGkpLmdldFZhbHVlKCk7CisJCQkgZG91YmxlIGFkanVzdGVkVHJhbnNtaXNzaW9uID0gZ2V0QWRqdXN0ZWRUcmFuc21pc3Npb25SYXRlKHNwZWNpZmljVHJhbnNtaXNzaW9uLCB0aW1lRGVsdGEpOworCQkJIGlmKCF0aGlzLmlzRnJlcXVlbmN5RGVwZW5kZW50KCkpIGFkanVzdGVkVHJhbnNtaXNzaW9uICo9IGdldFRyYW5zbWlzc2lvblJhdGVTY2FsZUZhY3RvcihkaXNlYXNlTGFiZWwpOworCQkJIAorCQkJCisJCQkvLyB3ZSBuZWVkIHRvIGdldCB0aGUgZGlzZWFzZSBsYWJlbCBmb3IgdGhlIGl0aCBwb3B1bGF0aW9uIGFzIHdlbGwuCisJCQkvLyB0byBnZXQgdGhlIG9uIHNpdGUgbnVtYmVyIG9mIGluZmVjdGlvcyBpbmRpdmlkdWFscyBvZiB0eXBlIGkKKwkJCUVMaXN0PE5vZGVMYWJlbD4gbm9kZUxhYmVscyA9IHRoaXNOb2RlLmdldExhYmVscygpOworCQkJZm9yKGludCBqID0gMDsgaiA8IG5vZGVMYWJlbHMuc2l6ZSgpOyBqICsrKSB7CisJCQkJTm9kZUxhYmVsIGxhYmVsID0gbm9kZUxhYmVscy5nZXQoaik7CisJCQkJaWYobGFiZWwgaW5zdGFuY2VvZiBTRUlSTGFiZWwpIHsKKwkJCQkJaWYgKHRoaXMgPT0gKChTRUlSTGFiZWwpbGFiZWwpLmdldERlY29yYXRvcigpKSB7CisJCQkJCQlTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIG90aGVyRGlzZWFzZUxhYmVsID0gKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwpIGxhYmVsOworCQkJCQkJLy8gbm93IGNoZWNrIHRoZSBwb3B1YWx0aW9uIHR5cGUKKwkJCQkJCVN0cmluZyBvdGhlclBvcHVsYXRpb24gPSBvdGhlckRpc2Vhc2VMYWJlbC5nZXRQb3B1bGF0aW9uTW9kZWxMYWJlbCgpLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCk7CisJCQkJCQlpZihvdGhlclBvcHVsYXRpb24uZXF1YWxzKG5leHRQb3ApKSB7CisJCQkJCQkJLy8gWWVzPworCQkJCQkJCS8vIHRoZW4gd2UgZm91bmQgdGhlIGxhYmVsIGZvciB0aGUgY29ycmVjdCBuZXh0IHBvcHVsYXRpb24KKwkJCQkJCQkKKwkJCQorCQkJCQkJCS8vIGZvciB0aGlzIHBvcHVsYXRpb24gd2UgbmVlZCB0byBnZXQgdGhlIEVGRkVDVElWRSBJbmZlY3Rpb3VzIGluY2x1ZGluZworCQkJCQkJCS8vIEFMTCBuZWlnaGJvcmluZyBub2RlcworCQkJCQkJCWRvdWJsZSBvbnNpdGVJbmZlY3Rpb3VzID0gKChTRUlSTGFiZWwpIG90aGVyRGlzZWFzZUxhYmVsKS5nZXRUZW1wVmFsdWUoKS5nZXRJKCk7CisJCQkJCQkJZmluYWwgZG91YmxlIGVmZmVjdGl2ZUluZmVjdGlvdXMgPSBnZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cyhvdGhlclBvcHVsYXRpb24sIHRoaXNOb2RlLCBvdGhlckRpc2Vhc2VMYWJlbCwgb25zaXRlSW5mZWN0aW91cyk7CisJCQkJCQkJCisJCQkJCQkgICAgLy8gQUREIHVwIHRoZSBuZXcgaW5jaWRlbmNlCisJCQkJCQkJbnVtYmVyT2ZTdXNjZXB0aWJsZVRvRXhwb3NlZCArPSBhZGp1c3RlZFRyYW5zbWlzc2lvbiAqIG51bWJlclN1c2NlcHRpYmxlICogZWZmZWN0aXZlSW5mZWN0aW91czsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0vLyBpZiBpdCdzIGFuIFNJIGxhYmVsCisJCQl9Ly9mb3IgYWxsIGxhYmVscyBpbiBUSElTIG5vZGUKKwkJfS8vIEZvciBhbGwgcG9wdWxhdGlvbiBpbiB0aGUgbW9kZWwKKwkJCisJCWRvdWJsZSBudW1iZXJPZkluZmVjdGVkVG9SZWNvdmVyZWQgPSBnZXRBZGp1c3RlZFJlY292ZXJ5UmF0ZSh0aGlzUmVjb3ZlcnlSYXRlLCB0aW1lRGVsdGEpICogY3VycmVudFNFSVIuZ2V0SSgpOworCQlkb3VibGUgbnVtYmVyT2ZSZWNvdmVyZWRUb1N1c2NlcHRpYmxlID0gZ2V0QWRqdXN0ZWRJbW11bml0eUxvc3NSYXRlKHRoaXNJbW11bml0eUxvc3NSYXRlLCB0aW1lRGVsdGEpICogY3VycmVudFNFSVIuZ2V0UigpOworCQlkb3VibGUgbnVtYmVyT2ZFeHBvc2VkVG9JbmZlY3RlZCA9IGdldEFkanVzdGVkSW5jdWJhdGlvblJhdGUodGhpc0luY3ViYXRpb25SYXRlLCB0aW1lRGVsdGEpICogY3VycmVudFNFSVIuZ2V0RSgpOworCQkKKwkJLy8gRGV0ZXJtaW5lIGRlbHRhIFMKKwkJZmluYWwgZG91YmxlIGRlbHRhUyA9IC0gbnVtYmVyT2ZTdXNjZXB0aWJsZVRvRXhwb3NlZCArIG51bWJlck9mUmVjb3ZlcmVkVG9TdXNjZXB0aWJsZTsKKwkJLy8gRGVsdGEgRQorCQlmaW5hbCBkb3VibGUgZGVsdGFFID0gbnVtYmVyT2ZTdXNjZXB0aWJsZVRvRXhwb3NlZCAtIG51bWJlck9mRXhwb3NlZFRvSW5mZWN0ZWQ7CisJCS8vIERldGVybWluZSBkZWx0YSBJCisJCWZpbmFsIGRvdWJsZSBkZWx0YUkgPSBudW1iZXJPZkV4cG9zZWRUb0luZmVjdGVkIC0gbnVtYmVyT2ZJbmZlY3RlZFRvUmVjb3ZlcmVkOworCQkvLyBEZXRlcm1pbmUgZGVsdGEgUgkKKwkJZmluYWwgZG91YmxlIGRlbHRhUiA9IG51bWJlck9mSW5mZWN0ZWRUb1JlY292ZXJlZCAtIG51bWJlck9mUmVjb3ZlcmVkVG9TdXNjZXB0aWJsZTsKKwkJCisJCVNFSVJMYWJlbFZhbHVlSW1wbCByZXQgPSAoU0VJUkxhYmVsVmFsdWVJbXBsKXJldHVyblZhbHVlOworCQlyZXQuc2V0UyhkZWx0YVMpOworCQlyZXQuc2V0RShkZWx0YUUpOworCQlyZXQuc2V0SShkZWx0YUkpOworCQlyZXQuc2V0UihkZWx0YVIpOworCQlyZXQuc2V0SW5jaWRlbmNlKG51bWJlck9mU3VzY2VwdGlibGVUb0V4cG9zZWQpOworCQlyZXQuc2V0RGlzZWFzZURlYXRocygwLjApOworCQlyZXR1cm4gcmV0OworCQkKKwl9CisJCisJcHVibGljIGRvdWJsZSBnZXRBZGp1c3RlZEluY3ViYXRpb25SYXRlKGRvdWJsZSBzcGVjaWZpY0luY1JhdGUsIGxvbmcgdGltZURlbHRhKSB7CisJCXJldHVybiAoc3BlY2lmaWNJbmNSYXRlICogKChkb3VibGUpIHRpbWVEZWx0YSAvIChkb3VibGUpIGdldFRpbWVQZXJpb2QoKSkgKTsKKwl9IC8vIGdldEFkanVzdGVkSW5jdWJhdGlvblJhdGUKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWwgY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWwoKSB7CisJCXJldHVybiBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNFSVJMYWJlbCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKSB7CisJCXJldHVybiBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNFSVJMYWJlbFZhbHVlKCk7CisJfQorCisKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0lOQ1VCQVRJT05fUkFURToKKwkJCQlyZXR1cm4gZ2V0SW5jdWJhdGlvblJhdGUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMX19JTkNVQkFUSU9OX1JBVEU6CisJCQkJc2V0SW5jdWJhdGlvblJhdGUoKERvdWJsZVZhbHVlTGlzdCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTF9fSU5DVUJBVElPTl9SQVRFOgorCQkJCXNldEluY3ViYXRpb25SYXRlKChEb3VibGVWYWx1ZUxpc3QpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0lOQ1VCQVRJT05fUkFURToKKwkJCQlyZXR1cm4gaW5jdWJhdGlvblJhdGUgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vaW1wbC9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vaW1wbC9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzI4M2ZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi9pbXBsL011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTExNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlTWF0cml4OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU3RyaW5nVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbC5NaWdyYXRpb25FZGdlTGFiZWxJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkFyZWFMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5SZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlwb3B1bGF0aW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbFN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lJbmZlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lMYWJlbFZhbHVlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZERpc2Vhc2VNb2RlbEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZEZhY3RvcnlJbXBsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TXVsdGkgUG9wdWxhdGlvbiBTSSBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLmltcGwuTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxJbXBsI2dldFBvcHVsYXRpb25Hcm91cHMgPGVtPlBvcHVsYXRpb24gR3JvdXBzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLmltcGwuTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxJbXBsI2dldFRyYW5zbWlzc2lvblJhdGUgPGVtPlRyYW5zbWlzc2lvbiBSYXRlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLmltcGwuTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxJbXBsI2dldFJlY292ZXJ5UmF0ZSA8ZW0+UmVjb3ZlcnkgUmF0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5pbXBsLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsSW1wbCNnZXRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSA8ZW0+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5pbXBsLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsSW1wbCNnZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbiA8ZW0+UGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uaW1wbC5NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbEltcGwjZ2V0Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbiA8ZW0+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5pbXBsLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsSW1wbCNnZXRDaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlIDxlbT5DaGFyYWN0ZXJpc3RpYyBNaXhpbmcgRGlzdGFuY2U8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbEltcGwgZXh0ZW5kcyBTdGFuZGFyZERpc2Vhc2VNb2RlbEltcGwgaW1wbGVtZW50cyBNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9wdWxhdGlvbkdyb3VwcygpIDxlbT5Qb3B1bGF0aW9uIEdyb3VwczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbkdyb3VwcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZ1ZhbHVlTGlzdCBwb3B1bGF0aW9uR3JvdXBzOworCQorCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNtaXNzaW9uUmF0ZSgpIDxlbT5UcmFuc21pc3Npb24gUmF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VHJhbnNtaXNzaW9uUmF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIERvdWJsZVZhbHVlTWF0cml4IHRyYW5zbWlzc2lvblJhdGU7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWNvdmVyeVJhdGUoKSA8ZW0+UmVjb3ZlcnkgUmF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVjb3ZlcnlSYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRG91YmxlVmFsdWVMaXN0IHJlY292ZXJ5UmF0ZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKCkgPGVtPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRG91YmxlVmFsdWVMaXN0IGluZmVjdGlvdXNNb3J0YWxpdHlSYXRlOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKCkgPGVtPlBoeXNpY2FsbHkgQWRqYWNlbnQgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT05fRURFRkFVTFQgPSAwLjAxOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb24oKSA8ZW0+UGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIHBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uID0gUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT05fRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbigpIDxlbT5Sb2FkIE5ldHdvcmsgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OX0VERUZBVUxUID0gMC4wNTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24oKSA8ZW0+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSByb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uID0gUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTl9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSgpIDxlbT5DaGFyYWN0ZXJpc3RpYyBNaXhpbmcgRGlzdGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIENIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRV9FREVGQVVMVCA9IDIuMjU7CisKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UoKSA8ZW0+Q2hhcmFjdGVyaXN0aWMgTWl4aW5nIERpc3RhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIGNoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UgPSBDSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0VfRURFRkFVTFQ7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLkxpdGVyYWxzLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRG91YmxlVmFsdWVNYXRyaXggZ2V0VHJhbnNtaXNzaW9uUmF0ZSgpIHsKKwkJcmV0dXJuIHRyYW5zbWlzc2lvblJhdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VHJhbnNtaXNzaW9uUmF0ZShEb3VibGVWYWx1ZU1hdHJpeCBuZXdUcmFuc21pc3Npb25SYXRlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCURvdWJsZVZhbHVlTWF0cml4IG9sZFRyYW5zbWlzc2lvblJhdGUgPSB0cmFuc21pc3Npb25SYXRlOworCQl0cmFuc21pc3Npb25SYXRlID0gbmV3VHJhbnNtaXNzaW9uUmF0ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFLCBvbGRUcmFuc21pc3Npb25SYXRlLCBuZXdUcmFuc21pc3Npb25SYXRlKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUcmFuc21pc3Npb25SYXRlKERvdWJsZVZhbHVlTWF0cml4IG5ld1RyYW5zbWlzc2lvblJhdGUpIHsKKwkJaWYgKG5ld1RyYW5zbWlzc2lvblJhdGUgIT0gdHJhbnNtaXNzaW9uUmF0ZSkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAodHJhbnNtaXNzaW9uUmF0ZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0cmFuc21pc3Npb25SYXRlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdUcmFuc21pc3Npb25SYXRlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RyYW5zbWlzc2lvblJhdGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0VHJhbnNtaXNzaW9uUmF0ZShuZXdUcmFuc21pc3Npb25SYXRlLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURSwgbmV3VHJhbnNtaXNzaW9uUmF0ZSwgbmV3VHJhbnNtaXNzaW9uUmF0ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEb3VibGVWYWx1ZUxpc3QgZ2V0UmVjb3ZlcnlSYXRlKCkgeworCQlyZXR1cm4gcmVjb3ZlcnlSYXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlY292ZXJ5UmF0ZShEb3VibGVWYWx1ZUxpc3QgbmV3UmVjb3ZlcnlSYXRlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCURvdWJsZVZhbHVlTGlzdCBvbGRSZWNvdmVyeVJhdGUgPSByZWNvdmVyeVJhdGU7CisJCXJlY292ZXJ5UmF0ZSA9IG5ld1JlY292ZXJ5UmF0ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEUsIG9sZFJlY292ZXJ5UmF0ZSwgbmV3UmVjb3ZlcnlSYXRlKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZWNvdmVyeVJhdGUoRG91YmxlVmFsdWVMaXN0IG5ld1JlY292ZXJ5UmF0ZSkgeworCQlpZiAobmV3UmVjb3ZlcnlSYXRlICE9IHJlY292ZXJ5UmF0ZSkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAocmVjb3ZlcnlSYXRlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlY292ZXJ5UmF0ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdSZWNvdmVyeVJhdGUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVjb3ZlcnlSYXRlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0UmVjb3ZlcnlSYXRlKG5ld1JlY292ZXJ5UmF0ZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUkVDT1ZFUllfUkFURSwgbmV3UmVjb3ZlcnlSYXRlLCBuZXdSZWNvdmVyeVJhdGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRG91YmxlVmFsdWVMaXN0IGdldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKCkgeworCQlyZXR1cm4gaW5mZWN0aW91c01vcnRhbGl0eVJhdGU7CisJfQorCQorCS8qKgorCSAqIEdldCB0aGUgcGFydGljdWxhciBpbmZlY3Rpb3VzIG1vcnRhbGl0eSByYXRlIGZvciBhIHNwZWNpZmljIHBvcHVsYXRpb24gZ3JvdXAgYnkgbmFtZQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIGRvdWJsZSBnZXRJbmZlY3Rpb3VzTW9ydGFsaXR5KFN0cmluZyBwb3B1bGF0aW9uTmFtZSkgeworCQkvLyBuZXh0IGdldCBpdCdzIElOREVYIGluIHRoZSBtb2RlbAorCQkvLyBUT0RPIHdlIHNob3VsZCBlbmNhcHN1bGF0ZSB0aGlzIGNvZGUgaW4gYSBoZWxwZXIgbWV0aG9kCisJCWludCBwb3B1bGF0aW9uSW5kZXggPSB0aGlzLmdldFBvcHVsYXRpb25JbmRleChwb3B1bGF0aW9uTmFtZSk7CisJCWlmKGluZmVjdGlvdXNNb3J0YWxpdHlSYXRlICE9IG51bGwpCisJCQlyZXR1cm4gaW5mZWN0aW91c01vcnRhbGl0eVJhdGUuZ2V0VmFsdWVzKCkuZ2V0KHBvcHVsYXRpb25JbmRleCkuZ2V0VmFsdWUoKTsKKwkJZWxzZSByZXR1cm4gMC4wOyAvL2RlZmF1bHQgaWYgbm90IHNwZWNpZmllZAorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKERvdWJsZVZhbHVlTGlzdCBuZXdJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlEb3VibGVWYWx1ZUxpc3Qgb2xkSW5mZWN0aW91c01vcnRhbGl0eVJhdGUgPSBpbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZTsKKwkJaW5mZWN0aW91c01vcnRhbGl0eVJhdGUgPSBuZXdJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUsIG9sZEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlLCBuZXdJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SW5mZWN0aW91c01vcnRhbGl0eVJhdGUoRG91YmxlVmFsdWVMaXN0IG5ld0luZmVjdGlvdXNNb3J0YWxpdHlSYXRlKSB7CisJCWlmIChuZXdJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSAhPSBpbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoaW5mZWN0aW91c01vcnRhbGl0eVJhdGUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaW5mZWN0aW91c01vcnRhbGl0eVJhdGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3SW5mZWN0aW91c01vcnRhbGl0eVJhdGUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SW5mZWN0aW91c01vcnRhbGl0eVJhdGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURSwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZShuZXdJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURSwgbmV3SW5mZWN0aW91c01vcnRhbGl0eVJhdGUsIG5ld0luZmVjdGlvdXNNb3J0YWxpdHlSYXRlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbigpIHsKKwkJcmV0dXJuIHBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKGRvdWJsZSBuZXdQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbikgeworCQlkb3VibGUgb2xkUGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb24gPSBwaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbjsKKwkJcGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb24gPSBuZXdQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OLCBvbGRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbiwgcGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb24pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24oKSB7CisJCXJldHVybiByb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24oZG91YmxlIG5ld1JvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24pIHsKKwkJZG91YmxlIG9sZFJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24gPSByb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uOworCQlyb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uID0gbmV3Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT04sIG9sZFJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24sIHJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UoKSB7CisJCXJldHVybiBjaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UoZG91YmxlIG5ld0NoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UpIHsKKwkJZG91YmxlIG9sZENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UgPSBjaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlOworCQljaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlID0gbmV3Q2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRSwgb2xkQ2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSwgY2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmdWYWx1ZUxpc3QgZ2V0UG9wdWxhdGlvbkdyb3VwcygpIHsKKwkJcmV0dXJuIHBvcHVsYXRpb25Hcm91cHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9wdWxhdGlvbkdyb3VwcyhTdHJpbmdWYWx1ZUxpc3QgbmV3UG9wdWxhdGlvbkdyb3VwcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlTdHJpbmdWYWx1ZUxpc3Qgb2xkUG9wdWxhdGlvbkdyb3VwcyA9IHBvcHVsYXRpb25Hcm91cHM7CisJCXBvcHVsYXRpb25Hcm91cHMgPSBuZXdQb3B1bGF0aW9uR3JvdXBzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9HUk9VUFMsIG9sZFBvcHVsYXRpb25Hcm91cHMsIG5ld1BvcHVsYXRpb25Hcm91cHMpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBvcHVsYXRpb25Hcm91cHMoU3RyaW5nVmFsdWVMaXN0IG5ld1BvcHVsYXRpb25Hcm91cHMpIHsKKwkJaWYgKG5ld1BvcHVsYXRpb25Hcm91cHMgIT0gcG9wdWxhdGlvbkdyb3VwcykgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAocG9wdWxhdGlvbkdyb3VwcyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwb3B1bGF0aW9uR3JvdXBzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdQb3B1bGF0aW9uR3JvdXBzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1BvcHVsYXRpb25Hcm91cHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9HUk9VUFMsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0UG9wdWxhdGlvbkdyb3VwcyhuZXdQb3B1bGF0aW9uR3JvdXBzLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0dST1VQUywgbmV3UG9wdWxhdGlvbkdyb3VwcywgbmV3UG9wdWxhdGlvbkdyb3VwcykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTOgorCQkJCXJldHVybiBiYXNpY1NldFBvcHVsYXRpb25Hcm91cHMobnVsbCwgbXNncyk7CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURToKKwkJCQlyZXR1cm4gYmFzaWNTZXRUcmFuc21pc3Npb25SYXRlKG51bGwsIG1zZ3MpOworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUkVDT1ZFUllfUkFURToKKwkJCQlyZXR1cm4gYmFzaWNTZXRSZWNvdmVyeVJhdGUobnVsbCwgbXNncyk7CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFOgorCQkJCXJldHVybiBiYXNpY1NldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0dST1VQUzoKKwkJCQlyZXR1cm4gZ2V0UG9wdWxhdGlvbkdyb3VwcygpOworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEU6CisJCQkJcmV0dXJuIGdldFRyYW5zbWlzc2lvblJhdGUoKTsKKwkJCWNhc2UgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEU6CisJCQkJcmV0dXJuIGdldFJlY292ZXJ5UmF0ZSgpOworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURToKKwkJCQlyZXR1cm4gZ2V0SW5mZWN0aW91c01vcnRhbGl0eVJhdGUoKTsKKwkJCWNhc2UgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OOgorCQkJCXJldHVybiBnZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbigpOworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTjoKKwkJCQlyZXR1cm4gZ2V0Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbigpOworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFOgorCQkJCXJldHVybiBnZXRDaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTOgorCQkJCXNldFBvcHVsYXRpb25Hcm91cHMoKFN0cmluZ1ZhbHVlTGlzdCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEU6CisJCQkJc2V0VHJhbnNtaXNzaW9uUmF0ZSgoRG91YmxlVmFsdWVNYXRyaXgpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEU6CisJCQkJc2V0UmVjb3ZlcnlSYXRlKChEb3VibGVWYWx1ZUxpc3QpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEU6CisJCQkJc2V0SW5mZWN0aW91c01vcnRhbGl0eVJhdGUoKERvdWJsZVZhbHVlTGlzdCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT046CisJCQkJc2V0UGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb24oKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTjoKKwkJCQlzZXRSb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRToKKwkJCQlzZXRDaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0dST1VQUzoKKwkJCQlzZXRQb3B1bGF0aW9uR3JvdXBzKChTdHJpbmdWYWx1ZUxpc3QpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEU6CisJCQkJc2V0VHJhbnNtaXNzaW9uUmF0ZSgoRG91YmxlVmFsdWVNYXRyaXgpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUkVDT1ZFUllfUkFURToKKwkJCQlzZXRSZWNvdmVyeVJhdGUoKERvdWJsZVZhbHVlTGlzdCludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFOgorCQkJCXNldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKChEb3VibGVWYWx1ZUxpc3QpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT046CisJCQkJc2V0UGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb24oUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT05fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT046CisJCQkJc2V0Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbihST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0U6CisJCQkJc2V0Q2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZShDSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0VfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9HUk9VUFM6CisJCQkJcmV0dXJuIHBvcHVsYXRpb25Hcm91cHMgIT0gbnVsbDsKKwkJCWNhc2UgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFOgorCQkJCXJldHVybiB0cmFuc21pc3Npb25SYXRlICE9IG51bGw7CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFOgorCQkJCXJldHVybiByZWNvdmVyeVJhdGUgIT0gbnVsbDsKKwkJCWNhc2UgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEU6CisJCQkJcmV0dXJuIGluZmVjdGlvdXNNb3J0YWxpdHlSYXRlICE9IG51bGw7CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTjoKKwkJCQlyZXR1cm4gcGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb24gIT0gUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT05fRURFRkFVTFQ7CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OOgorCQkJCXJldHVybiByb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uICE9IFJPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT05fRURFRkFVTFQ7CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0U6CisJCQkJcmV0dXJuIGNoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UgIT0gQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAocGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKHBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCByb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChyb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBjaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChjaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjb21wdXRlRGVwYXJ0dXJlcygKKwkJCWRvdWJsZSBmcmFjdGlvblRvRGVwYXJ0LCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgbmV4dFN0YXRlKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZERpc2Vhc2VNb2RlbEltcGwjY29tcHV0ZURlYXRocyhvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlLAorCSAqICAgICAgbG9uZykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGNvbXB1dGVEaXNlYXNlRGVhdGhzRGVsdGFzKAorCQkJZmluYWwgU1RFTVRpbWUgdGltZSwgZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTGFiZWwsIGZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjdXJyZW50TGFiZWxWYWx1ZSwgZmluYWwgbG9uZyB0aW1lRGVsdGEsIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgcmV0dXJuVmFsdWUpIHsKKworCQlTdHJpbmcgdGhpc1BvcHVsYXRpb24gPSBkaXNlYXNlTGFiZWwuZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpOworCQlmaW5hbCBTSUxhYmVsVmFsdWUgY3VycmVudFNJID0gKFNJTGFiZWxWYWx1ZSkgY3VycmVudExhYmVsVmFsdWU7CisJCQorCQlmaW5hbCBkb3VibGUgYWRqdXN0ZWRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSA9IGdldEFkanVzdGVkSW5mZWN0aW91c01vcnRhbGl0eVJhdGUodGltZURlbHRhLCB0aGlzUG9wdWxhdGlvbik7CisJCQorCQlmaW5hbCBkb3VibGUgZGlzZWFzZURlYXRocyA9IGFkanVzdGVkSW5mZWN0aW91c01vcnRhbGl0eVJhdGUKKwkJCQkqIGN1cnJlbnRTSS5nZXRJKCk7CisKKwkJU0lMYWJlbFZhbHVlSW1wbCByZXQgPSAoU0lMYWJlbFZhbHVlSW1wbClyZXR1cm5WYWx1ZTsKKwkJcmV0LnNldFMoMC4wKTsKKwkJcmV0LnNldEkoLWRpc2Vhc2VEZWF0aHMpOworCQlyZXQuc2V0SW5jaWRlbmNlKDAuMCk7CisJCXJldC5zZXREaXNlYXNlRGVhdGhzKGRpc2Vhc2VEZWF0aHMpOworCQkKKwkJcmV0dXJuIHJldDsKKwl9IC8vIGNvbXB1dGVCaXJ0aERlYXRoc0RlbHRhcworCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldEFkanVzdGVkSW5mZWN0aW91c01vcnRhbGl0eVJhdGUobG9uZyB0aW1lRGVsdGEsIGZpbmFsIFN0cmluZyBwb3B1bGF0aW9uTmFtZSkgeworCQkvLyBUT0RPIHRoaXMgZGl2aXNpb24gY2FuIGJlIGVsaW1pbmF0ZWQgaWYgdGltZURlbHRhPT1nZXRUaW1lUGVyaW9kCisJCXJldHVybiBnZXRJbmZlY3Rpb3VzTW9ydGFsaXR5KHBvcHVsYXRpb25OYW1lKQorCQkqICgoZG91YmxlKSB0aW1lRGVsdGEgLyAoZG91YmxlKSBnZXRUaW1lUGVyaW9kKCkpOworCX0gLy8gZ2V0QWRqdXN0ZWRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZQorCisKKworCUBPdmVycmlkZQorCXB1YmxpYyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY29tcHV0ZURpc2Vhc2VEZWx0YXMoU1RFTVRpbWUgdGltZSwKKwkJCVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjdXJyZW50U3RhdGUsCisJCQlTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VMYWJlbCwgbG9uZyB0aW1lRGVsdGEsCisJCQlEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHJldHVyblZhbHVlKSB7CisJCQorCQkvLyBUSElTIG1ldGhvZCBnZXRzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgb25jZSBmb3IgZWFjaCBwb3B1bGF0aW9uIGlkZW50aWZpZXIKKwkJLy8gaW4gdGhlIHBvcHVsYXRpb24gbW9kZWwuCisJCS8vIHdoaWNoIHBvcHVsYXRpb24gaXMgInRoaXMiLi4uLgorCQlmaW5hbCBTSUxhYmVsVmFsdWUgY3VycmVudFNJID0gKFNJTGFiZWxWYWx1ZSkgY3VycmVudFN0YXRlOworCQlTdHJpbmcgdGhpc1BvcHVsYXRpb24gPSBkaXNlYXNlTGFiZWwuZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpOworCQkJCQorCQkvLyBuZXh0IGdldCBpdCdzIElOREVYIGluIHRoZSBtb2RlbAorCQlpbnQgcG9wdWxhdGlvbkluZGV4ID0gZ2V0UG9wdWxhdGlvbkluZGV4KHRoaXNQb3B1bGF0aW9uKTsKKwkJCQorCQkvLyBub3cgd2Uga25vdyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgcG9wdWxhdGlvbiBiZWluZyBpbnRlZ3JhdGVkLgorCQkvLyBHZXQgdGhlIGNvcnJlY3QgdHJhbnNtaXNzaW9uIHJhdGUgbGlzdCBmcm9tIHRoZSBNQVRSSVgKKwkJRUxpc3Q8RG91YmxlVmFsdWU+IHRyYW5zbWlzc2lvblZlY3RvciA9IHRyYW5zbWlzc2lvblJhdGUuZ2V0VmFsdWVMaXN0cygpLmdldChwb3B1bGF0aW9uSW5kZXgpLmdldFZhbHVlcygpOworCQkKKwkJLy8gQUxMIHRoZSBvdGhlciBkaXNlYXNlIHBhcmFtZXRlcnMgYXJlIGFsc28gRG91YmxlVmFsdWVMaXN0cy4gV2Ugbm93IGl0ZXJhdGUgdGhyb3VnaCBhbGwgcG9wdWxhdGlvbnMKKwkJLy8gZ2V0IHRoZSBzcGVjaWZpYyByYXRlIHBhcmFtZXRlcnMgZnJvbSBFQUNIIGxpc3QgYmFzZWQgb24gdGhpcyBwb3B1bGF0aW9uIGluZGV4CisJCWRvdWJsZSB0aGlzUmVjb3ZlcnlSYXRlID0gMC4wOworCQlpZihyZWNvdmVyeVJhdGUgIT0gbnVsbCkgdGhpc1JlY292ZXJ5UmF0ZSA9IHJlY292ZXJ5UmF0ZS5nZXRWYWx1ZXMoKS5nZXQocG9wdWxhdGlvbkluZGV4KS5nZXRWYWx1ZSgpOworCQkKKwkJCisJCS8vICBOT1cgaXRlcmF0ZSBvdmVyIGV2ZXJ5IHBvcHVsYXRpb24gKGluY2x1ZGluZyB0aGlzIG9uZSkgdG8gY29tcHV0ZSBuZXcgaW5mZWN0aW9ucworCQkvLyAgdGhpcyBpbmNsdWRlcyBpbmZlY3Rpb25zIHdpdGhpbiBhIHBvcHVsYXRpb24gZ3JvdXAKKwkJLy8gIGFuZCBhbGwgdGhlIGNyb3NzIHRlcm1zCisJCWRvdWJsZSBudW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZCA9IDAuMDsKKwkJZG91YmxlIG51bWJlclN1c2NlcHRpYmxlID0gY3VycmVudFNJLmdldFMoKTsKKwkJTm9kZSB0aGlzTm9kZSA9IGRpc2Vhc2VMYWJlbC5nZXROb2RlKCk7CisJCQorCQlFTGlzdDxTdHJpbmdWYWx1ZT4gZ3JvdXBMaXN0ID0gcG9wdWxhdGlvbkdyb3Vwcy5nZXRWYWx1ZXMoKTsKKwkJCisJCWZvcihpbnQgaSA9IDA7IGk8IHRyYW5zbWlzc2lvblZlY3Rvci5zaXplKCk7IGkgKyspIHsKKwkJCS8vIFdlIG5lZWQgdG8gZ2V0IHRoZSBpZGVudGlmaWVyIG9mIHRoZSBpdGggcG9wdWxhdGlvbiBtb2RlbAorCQkJU3RyaW5nIG5leHRQb3AgPSBncm91cExpc3QuZ2V0KGkpLmdldFZhbHVlKCk7CisJCQkKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLworCQkJLy8gMS4gY29tcHV0ZSBCRVRBIGZvciB0cmFuc21pc3Npb24gZnJvbSB0aGUgaXRoIHBvcHVsYXRpb24gdG8gdGhpcyBwb3B1bGF0aW9uCisJCQkgZG91YmxlIHNwZWNpZmljVHJhbnNtaXNzaW9uID0gdHJhbnNtaXNzaW9uVmVjdG9yLmdldChpKS5nZXRWYWx1ZSgpOworCQkJIGRvdWJsZSBhZGp1c3RlZFRyYW5zbWlzc2lvbiA9IGdldEFkanVzdGVkVHJhbnNtaXNzaW9uUmF0ZShzcGVjaWZpY1RyYW5zbWlzc2lvbiwgdGltZURlbHRhKTsKKwkJCSBpZighdGhpcy5pc0ZyZXF1ZW5jeURlcGVuZGVudCgpKSBhZGp1c3RlZFRyYW5zbWlzc2lvbiAqPSBnZXRUcmFuc21pc3Npb25SYXRlU2NhbGVGYWN0b3IoZGlzZWFzZUxhYmVsKTsKKwkJCSAKKwkJCQorCQkJLy8gd2UgbmVlZCB0byBnZXQgdGhlIGRpc2Vhc2UgbGFiZWwgZm9yIHRoZSBpdGggcG9wdWxhdGlvbiBhcyB3ZWxsLgorCQkJLy8gdG8gZ2V0IHRoZSBvbiBzaXRlIG51bWJlciBvZiBpbmZlY3Rpb3MgaW5kaXZpZHVhbHMgb2YgdHlwZSBpCisJCQlFTGlzdDxOb2RlTGFiZWw+IG5vZGVMYWJlbHMgPSB0aGlzTm9kZS5nZXRMYWJlbHMoKTsKKwkJCWZvcihpbnQgaiA9IDA7IGogPCBub2RlTGFiZWxzLnNpemUoKTsgaiArKykgeworCQkJCU5vZGVMYWJlbCBsYWJlbCA9IG5vZGVMYWJlbHMuZ2V0KGopOworCQkJCWlmKGxhYmVsIGluc3RhbmNlb2YgU0lMYWJlbCkgeworCQkJCQlpZiAodGhpcyA9PSAoKFNJTGFiZWwpbGFiZWwpLmdldERlY29yYXRvcigpKSB7CisJCQkJCQlTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIG90aGVyRGlzZWFzZUxhYmVsID0gKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwpIGxhYmVsOworCQkJCQkJLy8gbm93IGNoZWNrIHRoZSBwb3B1YWx0aW9uIHR5cGUKKwkJCQkJCVN0cmluZyBvdGhlclBvcHVsYXRpb24gPSBvdGhlckRpc2Vhc2VMYWJlbC5nZXRQb3B1bGF0aW9uTW9kZWxMYWJlbCgpLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCk7CisJCQkJCQlpZihvdGhlclBvcHVsYXRpb24uZXF1YWxzKG5leHRQb3ApKSB7CisJCQkJCQkJLy8gWWVzPworCQkJCQkJCS8vIHRoZW4gd2UgZm91bmQgdGhlIGxhYmVsIGZvciB0aGUgY29ycmVjdCBuZXh0IHBvcHVsYXRpb24KKwkJCQkJCQkKKwkJCQorCQkJCQkJCS8vIGZvciB0aGlzIHBvcHVsYXRpb24gd2UgbmVlZCB0byBnZXQgdGhlIEVGRkVDVElWRSBJbmZlY3Rpb3VzIGluY2x1ZGluZworCQkJCQkJCS8vIEFMTCBuZWlnaGJvcmluZyBub2RlcworCQkJCQkJCWRvdWJsZSBvbnNpdGVJbmZlY3Rpb3VzID0gKChTSUxhYmVsKSBvdGhlckRpc2Vhc2VMYWJlbCkuZ2V0VGVtcFZhbHVlKCkuZ2V0SSgpOworCQkJCQkJCWZpbmFsIGRvdWJsZSBlZmZlY3RpdmVJbmZlY3Rpb3VzID0gZ2V0Tm9ybWFsaXplZEVmZmVjdGl2ZUluZmVjdGlvdXMob3RoZXJQb3B1bGF0aW9uLCB0aGlzTm9kZSwgb3RoZXJEaXNlYXNlTGFiZWwsIG9uc2l0ZUluZmVjdGlvdXMpOworCQkJCQkJCQorCQkJCQkJICAgIC8vIEFERCB1cCB0aGUgbmV3IGluY2lkZW5jZQorCQkJCQkJCW51bWJlck9mU3VzY2VwdGlibGVUb0luZmVjdGVkICs9IGFkanVzdGVkVHJhbnNtaXNzaW9uICogbnVtYmVyU3VzY2VwdGlibGUgKiBlZmZlY3RpdmVJbmZlY3Rpb3VzOworCQkJCQkJfQorCQkJCQl9CisJCQkJfS8vIGlmIGl0J3MgYW4gU0kgbGFiZWwKKwkJCX0vL2ZvciBhbGwgbGFiZWxzIGluIFRISVMgbm9kZQorCQl9Ly8gRm9yIGFsbCBwb3B1bGF0aW9uIGluIHRoZSBtb2RlbAorCQkKKwkJZG91YmxlIG51bWJlck9mSW5mZWN0ZWRUb1N1c2NlcHRpYmxlID0gZ2V0QWRqdXN0ZWRSZWNvdmVyeVJhdGUodGhpc1JlY292ZXJ5UmF0ZSwgdGltZURlbHRhKSAqIGN1cnJlbnRTSS5nZXRJKCk7CisJCQorCQorCQkvLyBEZXRlcm1pbmUgZGVsdGEgUworCQlmaW5hbCBkb3VibGUgZGVsdGFTID0gLSBudW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZCArIG51bWJlck9mSW5mZWN0ZWRUb1N1c2NlcHRpYmxlOworCQkvLyBEZXRlcm1pbmUgZGVsdGEgSQorCQlmaW5hbCBkb3VibGUgZGVsdGFJID0gbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgLSBudW1iZXJPZkluZmVjdGVkVG9TdXNjZXB0aWJsZTsJCisJCisJCVNJTGFiZWxWYWx1ZUltcGwgcmV0ID0gKFNJTGFiZWxWYWx1ZUltcGwpcmV0dXJuVmFsdWU7CisJCXJldC5zZXRTKGRlbHRhUyk7CisJCXJldC5zZXRJKGRlbHRhSSk7CisJCXJldC5zZXRJbmNpZGVuY2UobnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQpOworCQlyZXQuc2V0RGlzZWFzZURlYXRocygwLjApOworCQlyZXR1cm4gcmV0OworCQkKKwl9CisJCisJcHJvdGVjdGVkIGludCBnZXRQb3B1bGF0aW9uSW5kZXgoU3RyaW5nIHRoaXNQb3B1bGF0aW9uKSB7CisJCS8vIG5leHQgZ2V0IGl0J3MgSU5ERVggaW4gdGhlIG1vZGVsCisJCS8vIFRPRE8gd2Ugc2hvdWxkIGVuY2Fwc3VsYXRlIHRoaXMgY29kZSBpbiBhIGhlbHBlciBtZXRob2QKKwkJaW50IHBvcHVsYXRpb25JbmRleCA9IC0xOworCQlFTGlzdDxTdHJpbmdWYWx1ZT4gZ3JvdXBMaXN0ID0gcG9wdWxhdGlvbkdyb3Vwcy5nZXRWYWx1ZXMoKTsKKwkJZm9yKGludCBpID0wOyBpIDwgZ3JvdXBMaXN0LnNpemUoKTsgaSArKykgeworCQkJU3RyaW5nIG5leHRQb3AgPSBncm91cExpc3QuZ2V0KGkpLmdldFZhbHVlKCk7CisJCQlpZihuZXh0UG9wLmVxdWFsc0lnbm9yZUNhc2UodGhpc1BvcHVsYXRpb24pKSB7CisJCQlwb3B1bGF0aW9uSW5kZXggPSBpOworCQkJYnJlYWs7CisJCQl9CQorCQl9CisJCWlmKHBvcHVsYXRpb25JbmRleCA8IDApIHsKKwkJCS8vIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwuY29tcHV0ZURpc2Vhc2VEZWx0YXMoKSBFcnJvciwgUG9wdWxhdGlvbiBuYW1lZCAiK3RoaXNQb3B1bGF0aW9uKyIgbm90IGZvdW5kLiBjaGVjayBzcGVsbGluZyAhISIsIG5ldyBFeGNlcHRpb24oKSk7CisJCX0KKwkJcmV0dXJuIHBvcHVsYXRpb25JbmRleDsKKwl9CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBSZXR1cm5zIHRoZSB0aW1lIGludGVydmFsIGRlbHRhVCBkaXZpZGVkIGJ5IHRoZSBpbml0aWFsIHRpbWUgcGVyaW9kCisJICogQHBhcmFtIHRpbWVEZWx0YQorCSAqIEBwYXJhbSBzcGVjaWZpY1RyYW5zbWlzc2lvbgorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0QWRqdXN0ZWRUcmFuc21pc3Npb25SYXRlKGRvdWJsZSBzcGVjaWZpY1RyYW5zbWlzc2lvbiwgbG9uZyB0aW1lRGVsdGEpIHsKKwkJcmV0dXJuIChzcGVjaWZpY1RyYW5zbWlzc2lvbiAqICgoZG91YmxlKSB0aW1lRGVsdGEgLyAoZG91YmxlKSBnZXRUaW1lUGVyaW9kKCkpICk7CisJfSAvLyBnZXRBZGp1c3RlZFRyYW5zbWlzc2lvblJhdGUKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB0aW1lRGVsdGEKKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldEFkanVzdGVkUmVjb3ZlcnlSYXRlKGRvdWJsZSBzcGVjaWZpY1JlY292ZXJ5UmF0ZSwgbG9uZyB0aW1lRGVsdGEpIHsKKwkJcmV0dXJuIChzcGVjaWZpY1JlY292ZXJ5UmF0ZSAqICgoZG91YmxlKSB0aW1lRGVsdGEgLyAoZG91YmxlKSBnZXRUaW1lUGVyaW9kKCkpICk7CisJfSAvLyBnZXRBZGp1c3RlZFJlY292ZXJ5UmF0ZQorCQorCQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2NhbGUgdGhlIHRyYW5zbWlzc2lvbiByYXRlLgorIAkgKiBpdCByZXR1cm5zIHRoZSBsb2NhbCBkZW5zaXR5IGRpdmlkZWQgYnkgYSAicmVmZXJlbmNlIiBkZW5zaXR5CisJICogQHBhcmFtIGRpc2Vhc2VMYWJlbCB0aGUgbGFiZWwgYmVpbmcgcHJvY2Vzc2VkCisJICogQHJldHVybiB0aGUgdHJhbnNtaXNzaW9uIHJhdGUgc2NhbGUgZmFjdG9yIGZvciB0aGUgbGFiZWwgYmVpbmcgcHJvY2Vzc2VkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRUcmFuc21pc3Npb25SYXRlU2NhbGVGYWN0b3IoCisJCQlTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VMYWJlbCkgeworCQkKKwkJZG91YmxlIHJlZmVyZW5jZURlbnNpdHkgPSBnZXRSZWZlcmVuY2VQb3B1bGF0aW9uRGVuc2l0eSgpOworCQkvLyBhc3NlcnQocmVmZXJlbmNlRGVuc2l0eSA+IDApOworCQkvLyBuZWVkIGVkaXRvciBjaGVjayBzbyByZWYgZGVuc2l0eSBhbHdheXMgPjEuIERlZmF1bHQgaXMgMTAwLgorCQlhc3NlcnQgZ2V0QXJlYShkaXNlYXNlTGFiZWwuZ2V0UG9wdWxhdGlvbkxhYmVsKCkpID4gMC4wOworCQlkb3VibGUgbG9jYWxEZW5zaXR5ID0gKChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpZGlzZWFzZUxhYmVsLmdldFRlbXBWYWx1ZSgpKS5nZXRQb3B1bGF0aW9uQ291bnQoKS9nZXRBcmVhKGRpc2Vhc2VMYWJlbC5nZXRQb3B1bGF0aW9uTGFiZWwoKSk7CisJCXJldHVybiBsb2NhbERlbnNpdHkvcmVmZXJlbmNlRGVuc2l0eTsKKwl9IC8vIGdldFRyYW5zbWlzc2lvblJhdGVTY2FsZUZhY3RvcgorCQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIHJlcGxhY2VzIHRoZSBvbnNpdGVJbmZlY3Rpb3VzIHZhbHVlIAorCSAqIGZvciBhIHNwZWNpZmljIHBvcHVsYXRpb24gdHlwZSAoYnkgaW5kZXgpCisJICogd2l0aCBhbiBlZmZlY3RpdmVJbmZlY3Rpb3VzIG9mIGEgcGFydGljdWxhciBwb3B1bGF0aW9uIGdyb3VwIChieSBuYW1lKQorCSAqIHNpemUgYmFzZWQgb24gbWl4aW5nIHdpdGggbmVpZ2hib3Jpbmcgc2l0ZXMuIEluIHRoaXMgaW1wbGVtZW50YXRpb24gdGhlIGVkZ2VzIGFyZSBiaWRpcmVjdGlvbmFsCisJICogYW5kIGhhdmUgYSBmaXhlZCB3ZWlnaHQgYmFzZWQgb24gZ2V0UGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb24oKSAoY2FsbGVkIGluIHRoZSBoZWxwZXIgbWV0aG9kCisJICogZ2V0SW5mZWN0aW91c0NoYW5nZUZyb21NaXhpbmcoKS4gQnV0IHRoZSBtaXhpbmcgaXMgYWxzbyB3ZWlnaHRlZCBieSB0aGUgYXJlYXMgYW5kIHBvcHVsYXRpb25zIG9mIGEgc2l0ZSByZWxhdGl2ZQorCSAqIHRvIHRoZSBhcmVhIGFuZCBwb3B1bGF0aW9uIG9mIGl0J3MgbmVpZ2hib3JzLiBOb3RlIHRoYXQgdGhlIHZhbHVlIHJldHVybmVkIG11c3QgYmUgTk9STUFMSVpFRCBieSB0aGUgdG90YWwKKwkgKiBwb3B1bGF0aW9uIGJlY2F1c2UgdGhlIHByb2R1Y3QgYmV0YSAqIFMgKiBJZWZmZWN0aXZlIG11c3QgaGF2ZSB1bml0cyBvZiBwZXJzb25zLiBTaW5jZSBTIGhhcyB1bml0cyBvZiBwZXJzb25zCisJICogdGhlIEllZmZlY3RpdmUgbXVzdCBiZSBkaW1lbnNpb25sZXNzIChub3JtYWxpemVkIHRvIHRoZSBwb3B1bGF0aW9uKS4gYmV0YSBpcyB0aGUgaW5mZWN0aW9uIHJhdGUgYW5kIGhhcyB1bml0cworCSAqIG9mIGludmVyc2UgdGltZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSS5nZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cworCSAqIEBwYXJhbSB0YXJnZXRQb3B1bGF0aW9uTmFtZQorCSAqIEBwYXJhbSBub2RlCisJICogQHBhcmFtIGRpc2Vhc2VMYWJlbAorCSAqIEBwYXJhbSBvbnNpdGVJbmZlY3Rpb3VzCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIGRvdWJsZSBnZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cyhmaW5hbCBTdHJpbmcgdGFyZ2V0UG9wdWxhdGlvbk5hbWUsIGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTGFiZWwsIGZpbmFsIGRvdWJsZSBvbnNpdGVJbmZlY3Rpb3VzKSB7CisgICAgICAgIC8vIHJ1bm5pbmcgdGFsbHkgb2YgY2hhbmdlcyBmcm9tIG1peGluZyB3aXRoIG90aGVyIG5vZGVzCisJCWRvdWJsZSBpbmZlY3Rpb3VzQ2hhbmdlRnJvbU1peGluZyA9IDAuMDsKKwkJZG91YmxlIGJvcmRlckRpdmlzb3IgPSAwLjA7CisJCWRvdWJsZSByb2FkRGl2aXNvciA9IDAuMDsKKwkJCisJCWZvciAoZmluYWwgSXRlcmF0b3I8RWRnZT4gY29tbW9uQm9yZGVyRWRnZUl0ZXIgPSBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbEltcGwKKwkJCQkuZ2V0Q29tbW9uQm9yZGVyRWRnZXNGcm9tTm9kZShub2RlKS5pdGVyYXRvcigpOyBjb21tb25Cb3JkZXJFZGdlSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBFZGdlIGJvcmRlckVkZ2UgPSBjb21tb25Cb3JkZXJFZGdlSXRlci5uZXh0KCk7CisJCQkvLyBJZiBpdCBleGlzdHMsIHdlJ3JlIGxvb2tpbmcgZm9yIHRoZSBsYWJlbCB0aGlzIGRpc2Vhc2UgbW9kZWwKKwkJCS8vIHVwZGF0ZXMgb24gdGhlIG5vZGUgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgYm9yZGVyIGVkZ2UuCisJCQlmaW5hbCBOb2RlIG90aGVyTm9kZSA9IGJvcmRlckVkZ2UuZ2V0T3RoZXJOb2RlKG5vZGUpOworCQkJCisJCQlkb3VibGUgY2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSA9IGdldENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UoKTsKKwkJCQorCQkJZG91YmxlIG1peGluZ0ZhY3RvciA9IDAuMDsgCisJCQlpZiAob3RoZXJOb2RlIGluc3RhbmNlb2YgUmVnaW9uKSB7CisJCQkJZG91YmxlIG90aGVyQXZnRXh0ZW50ID0gLTEuMDsKKwkJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPE5vZGVMYWJlbD4gbGFiZWxJdGVyID0gb3RoZXJOb2RlLmdldExhYmVscygpLml0ZXJhdG9yKCk7IGxhYmVsSXRlci5oYXNOZXh0KCk7KSB7CisJCQkJCWZpbmFsIE5vZGVMYWJlbCBub2RlTGFiZWwgPSBsYWJlbEl0ZXIubmV4dCgpOworCQkJCQkvLyBJcyB0aGlzIGFuIGFyZWEgbGFiZWw/CisJCQkJCWlmIChub2RlTGFiZWwgaW5zdGFuY2VvZiBBcmVhTGFiZWwpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJZmluYWwgQXJlYUxhYmVsIGFyZWFMYWJlbCA9IChBcmVhTGFiZWwpIG5vZGVMYWJlbDsKKwkJCQkJCW90aGVyQXZnRXh0ZW50ID0gYXJlYUxhYmVsLmdldEN1cnJlbnRBcmVhVmFsdWUoKS5nZXRBdmVyYWdlRXh0ZW50KCk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0gLy8gZm9yCisJCQkJLy8gSUYgd2UgaGF2ZSBhIHZhbGlkIGFyZWEgCisJCQkJaWYob3RoZXJBdmdFeHRlbnQgPj0gMC4wKSB7CisJCQkJCW1peGluZ0ZhY3RvciA9IChjaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlL290aGVyQXZnRXh0ZW50KSA7CisJCQkJCWlmKG1peGluZ0ZhY3RvciA+IDEuMCkgbWl4aW5nRmFjdG9yID0gMS4wOworCQkJCX0KKwkJCX0KKwkJCQorCQkJCisJCQkvLyBmb3IgRUFDSCBjb25uZWN0ZWQgTm9kZSBhZGQgdXAgdGhlIGluZmVjdGlvdXMgb2YgdGhlIHBhcnRpY3VsYXIKKwkJCS8vIHBvcHVsYXRpb24gR1JPVVBECisJCQlpbmZlY3Rpb3VzQ2hhbmdlRnJvbU1peGluZyArPSBnZXRJbmZlY3Rpb3VzQ2hhbmdlRnJvbU1peGluZyh0aGlzLCBvdGhlck5vZGUsIHRhcmdldFBvcHVsYXRpb25OYW1lLCBkaXNlYXNlTGFiZWwsIG9uc2l0ZUluZmVjdGlvdXMsIG1peGluZ0ZhY3Rvcik7CisJCQorCQkJYm9yZGVyRGl2aXNvciArPSBtaXhpbmdGYWN0b3IqdGhpcy5nZXRMb2NhbFBvcHVsYXRpb24odGhpcywgb3RoZXJOb2RlLCB0YXJnZXRQb3B1bGF0aW9uTmFtZSk7CisJCX0gLy8gZm9yIGVhY2ggYm9yZGVyIGVkZ2UKKwkJCisJCWZvciAoZmluYWwgSXRlcmF0b3I8RWRnZT4gcm9hZEVkZ2VJdGVyID0gUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSW1wbC5nZXRSb2FkRWRnZXNGcm9tTm9kZShub2RlKS5pdGVyYXRvcigpOyAJcm9hZEVkZ2VJdGVyLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIEVkZ2Ugcm9hZEVkZ2UgPSByb2FkRWRnZUl0ZXIubmV4dCgpOworCQkJCisJCQkvLyBmaW5kIHRoZSBudW1iZXIgb2YgZWRnZXMgZnJvbSB0aGUgcm9hZCBlZGdlIC0gY291bGQgYmUgbW9yZSB0aGFuIG9uZQorCQkJLy8gYWxzbywgcm9hZHMgaGF2ZSBkaWZmZXJlbmN0IGNhcGFjaXRpZXMKKwkJCWZpbmFsIEVkZ2VMYWJlbCBlZGdlTGFiZWwgPSByb2FkRWRnZS5nZXRMYWJlbCgpOworCQkJLy8gaW5pdCB0aGUgbnVtYmVyIG9mIGNyb3NzaW5ncyBvciB0b3RhbCByb2FkIGNvbm5lY3Rpb25zIGFjcm9zcyB0aGUgYm9yZGVyCisJCQlkb3VibGUgbnVtQ3Jvc3NpbmdzID0gMS4wOworCQkKKwkJCWlmIChlZGdlTGFiZWwgaW5zdGFuY2VvZiBSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsKSB7CisJCQkJUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsIHJvYWRMYWJlbFZhbHVlID0gKFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlSW1wbCkoZWRnZUxhYmVsLmdldEN1cnJlbnRWYWx1ZSgpKTsKKwkJCQludW1Dcm9zc2luZ3MgPSByb2FkTGFiZWxWYWx1ZS5nZXROdW1iZXJDcm9zc2luZ3MoKTsKKwkJCX0KKwkJCWRvdWJsZSBpbmZlY3Rpb3VzUHJvcG9ydGlvbiA9IGdldFJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24oKSAqIG51bUNyb3NzaW5nczsKKwkJCQorCQkJLy8gbXVzdCBuZXZlciBiZSBncmVhdGVyIHRoYW4gMQorCQkJaWYoaW5mZWN0aW91c1Byb3BvcnRpb24gPiAxLjApIGluZmVjdGlvdXNQcm9wb3J0aW9uID0gMS4wOworCQkJCisJCQkvLyBJZiBpdCBleGlzdHMsIHdlJ3JlIGxvb2tpbmcgZm9yIHRoZSBsYWJlbCB0aGlzIGRpc2Vhc2UgbW9kZWwKKwkJCS8vIHVwZGF0ZXMgb24gdGhlIG5vZGUgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgYm9yZGVyIGVkZ2UuCisJCQlmaW5hbCBOb2RlIG90aGVyTm9kZSA9IHJvYWRFZGdlLmdldE90aGVyTm9kZShub2RlKTsKKwkJCisJCQkvLyBzdW0gdXAgdGhlIGNoYW5nZXMgZnJvbSBlYWNoIGNvbm5lY3RlZCBub2RlIGJ5IHBvcHVsYXRpb24gZ3JvdXAgKGJ5IG5hbWUpLgorCQkJLy8gTk9URTogc29tZSBvZiB0aGVzZSBjaGFuZ2VzIGNvdWxkIGJlIG5lZ2F0aXZlCisJCQlpbmZlY3Rpb3VzQ2hhbmdlRnJvbU1peGluZyArPSBnZXRJbmZlY3Rpb3VzQ2hhbmdlRnJvbU1peGluZyh0aGlzLCBvdGhlck5vZGUsIHRhcmdldFBvcHVsYXRpb25OYW1lLCBkaXNlYXNlTGFiZWwsIG9uc2l0ZUluZmVjdGlvdXMsIGluZmVjdGlvdXNQcm9wb3J0aW9uKTsKKwkJCQorCQkJcm9hZERpdmlzb3IgKz0gaW5mZWN0aW91c1Byb3BvcnRpb24qdGhpcy5nZXRMb2NhbFBvcHVsYXRpb24odGhpcywgb3RoZXJOb2RlLCB0YXJnZXRQb3B1bGF0aW9uTmFtZSk7CisJCX0gLy8gZm9yIGVhY2ggcm9hZCBlZGdlCisJCQorCQorCQkvLyByZXR1cm4gdGhlIHN1bSBub3JtYWxpemVkIHRvIHRoZSB0b3RhbCBwb3B1bGF0aW9uCisJCWRvdWJsZSBkZW5vbSA9ICgoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKWRpc2Vhc2VMYWJlbC5nZXRUZW1wVmFsdWUoKSkuZ2V0UG9wdWxhdGlvbkNvdW50KCkgKyBib3JkZXJEaXZpc29yICsgcm9hZERpdmlzb3I7CisJCWRvdWJsZSByZXRWYWwgPSAwLjA7CisJCWlmIChkZW5vbSA+IDAuMCkgeworCQkJcmV0VmFsID0gKCBvbnNpdGVJbmZlY3Rpb3VzICsgaW5mZWN0aW91c0NoYW5nZUZyb21NaXhpbmcgKSAvIGRlbm9tOworCQl9CisJCQorCQkKKwkJcmV0dXJuIHJldFZhbDsKKworCX0gLy8gZ2V0Tm9ybWFsaXplZEVmZmVjdGl2ZUluZmVjdGlvdXMKKwkKKwkKKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBjb3JyZWN0bHkgY29tcHV0ZXMgdGhlIG1peGluZyBvZiB0aGUgaW5mZWN0aW91cyBwb3B1bGF0aW9uIChvbnNpdGUpIHdpdGggdGhlIGluZmVjdGlvdXMgcG9wdWxhdGlvbgorCSAqIGF0IG5laWdoYm9yaW5nIG5vZGVzCisJICogQHBhcmFtIGRpc2Vhc2VNb2RlbAorCSAqIEBwYXJhbSB0aGUgbm9kZQorCSAqIEBwYXJhbSBkaXNlYXNlTGFiZWwKKwkgKiBAcGFyYW0gb25zaXRlSW5mZWN0aW91cworCSAqIEBwYXJhbSBjb25uZWN0ZWRJbmZlY3Rpb3VzUHJvcG9ydGlvbiAodGhpcyBpcyB0aGUgd2VpZ2h0IGdpdmVuIHRvIHRoZSBlZGdlIGNvbm5lY3Rpb24pCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBvcHVsYXRpb24gbWVtYmVycyBhdCBhIG5vZGUgaW5mZWN0ZWQgYnkgdGhlIGRpc2Vhc2UgbW9kZWxlZCBieSBkaXNlYXNlTW9kZWwKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIGdldEluZmVjdGlvdXNDaGFuZ2VGcm9tTWl4aW5nKGZpbmFsIE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsIGRpc2Vhc2VNb2RlbCwKKwkJCWZpbmFsIE5vZGUgbm9kZSwgZmluYWwgU3RyaW5nIHBvcHVsYXRpb25OYW1lLCBmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VMYWJlbCwgZmluYWwgZG91YmxlIG9uc2l0ZUluZmVjdGlvdXMsIGRvdWJsZSBjb25uZWN0ZWRJbmZlY3Rpb3VzUHJvcG9ydGlvbikgeworCQorCQkvLyBpbmZlY3Rpb3VzIGZyb20gb3RoZXIgc2l0ZXMgbWl4aW5nIGhlcmUgYXQgc2l0ZSAwCisJCWRvdWJsZSBtaXhpbmcgPSAwLjA7CisJCQkKKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxOb2RlTGFiZWw+IGxhYmVsSXRlciA9IG5vZGUuZ2V0TGFiZWxzKCkuaXRlcmF0b3IoKTsgbGFiZWxJdGVyCisJCQkJLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIE5vZGVMYWJlbCBub2RlTGFiZWwgPSBsYWJlbEl0ZXIubmV4dCgpOworCQkJLy8gSXMgdGhpcyBhIGRpc2Vhc2UgbGFiZWw/CisJCQlpZiAobm9kZUxhYmVsIGluc3RhbmNlb2YgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCkgeworCQkJCWZpbmFsIEludGVncmF0aW9uTGFiZWwgb3RoZXJTSUxhYmVsID0gKEludGVncmF0aW9uTGFiZWwpIG5vZGVMYWJlbDsKKwkJCQkvLyBZZXMKKwkJCQkvLyBJcyBpdCB1cGRhdGVkIGJ5IHRoaXMgZGlzZWFzZSBtb2RlbD8KKwkJCQlpZiAoZGlzZWFzZU1vZGVsID09IG90aGVyU0lMYWJlbC5nZXREZWNvcmF0b3IoKSkgeworCQkJCQkKKwkJCQkJCisJCQkJCS8vIENIRUNLIFRIRSBQT1BVTEFUSU9OIE9GIFRIRSBORUlHSEJPUgorCQkJCQlTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGNoZWNrTGFiZWwgPSAoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbClvdGhlclNJTGFiZWw7CisJCQkJCVN0cmluZyBjaGVja1BvcHVsYXRpb24gPSBjaGVja0xhYmVsLmdldFBvcHVsYXRpb25Nb2RlbExhYmVsKCkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKwkJCQkJaWYoY2hlY2tQb3B1bGF0aW9uLmVxdWFscyhwb3B1bGF0aW9uTmFtZSkpIHsKKwkJCQkJCWlmKHRoaXMuaXNGcmVxdWVuY3lEZXBlbmRlbnQoKSkgeworCQkJCQkJCWRvdWJsZSBJb3RoZXIgPSAoKChTSUxhYmVsVmFsdWUpb3RoZXJTSUxhYmVsLmdldFRlbXBWYWx1ZSgpKSkuZ2V0SSgpOworCQkJCQkJCS8vZG91YmxlIElvdGhlciA9IG90aGVyU0lMYWJlbC5nZXRDdXJyZW50U0lWYWx1ZSgpLmdldEkoKTsKKwkJCQkJCQlkb3VibGUgbWl4aW5nRmFjdG9yID0gY29ubmVjdGVkSW5mZWN0aW91c1Byb3BvcnRpb247CQkJCQkKKwkJCQkJCQltaXhpbmcgPSBJb3RoZXIgKiBtaXhpbmdGYWN0b3I7CisJCQkJCQl9IAorCQkJCQkvLyBicmVhayA/IG9ubHkgb25lIHBlciBwb3B1bGF0aW9uPworCQkJCQl9Ly9pZihjaGVja1BvcHVsYXRpb24uZXF1YWxzKHBvcHVsYXRpb25OYW1lKSkgCisJCQkJCQorCQkJCX0gLy8gaWYKKwkJCX0KKwkJfSAvLyBmb3IKKworCQlyZXR1cm4gbWl4aW5nOworCX0gLy8gZ2V0SW5mZWN0aW91c0NoYW5nZUZyb21NaXhpbmcKKwkKKwkKKwkKKwkKKworCS8qKgorCSAqIEdldCB0aGUgb25zaXRlIHRvdGFsIHBvcHVsYXRpb24gZm9yIGEgcGFydGljdWxhciBwb3B1bGF0aW9uIGdyb3VwIGJ5IG5hbWUKKwkgKiBAcGFyYW0gZGlzZWFzZU1vZGVsCisJICogQHBhcmFtIG5vZGUKKwkgKiBAcmV0dXJuCisJICovCisgICAgcHJpdmF0ZSBkb3VibGUgZ2V0TG9jYWxQb3B1bGF0aW9uKGZpbmFsIE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsIGRpc2Vhc2VNb2RlbCwgTm9kZSBub2RlLCAgZmluYWwgU3RyaW5nIHBvcHVsYXRpb25OYW1lKSB7CisgICAgCWRvdWJsZSB0b3RhbFBvcHVsYXRpb24gPSAwLjA7CisgICAgCWZvciAoZmluYWwgSXRlcmF0b3I8Tm9kZUxhYmVsPiBsYWJlbEl0ZXIgPSBub2RlLmdldExhYmVscygpLml0ZXJhdG9yKCk7IGxhYmVsSXRlci5oYXNOZXh0KCk7KSB7CisgICAgCQlmaW5hbCBOb2RlTGFiZWwgbm9kZUxhYmVsID0gbGFiZWxJdGVyLm5leHQoKTsKKyAgICAJCS8vIElzIHRoaXMgYSBkaXNlYXNlIGxhYmVsPworICAgIAkJaWYgKG5vZGVMYWJlbCBpbnN0YW5jZW9mIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwpIHsKKyAgICAJCQlmaW5hbCBJbnRlZ3JhdGlvbkxhYmVsIG90aGVyU0lMYWJlbCA9IChJbnRlZ3JhdGlvbkxhYmVsKSBub2RlTGFiZWw7CisgICAgCQkJLy8gWWVzCisgICAgCQkJLy8gSXMgaXQgdXBkYXRlZCBieSB0aGlzIGRpc2Vhc2UgbW9kZWw/CisgICAgCQkJaWYgKGRpc2Vhc2VNb2RlbCA9PSBvdGhlclNJTGFiZWwuZ2V0RGVjb3JhdG9yKCkpIHsKKyAgICAJCQkJCisKKyAgICAJCQkJLy8gQ0hFQ0sgVEhFIFBPUFVMQVRJT04gT0YgVEhFIE5FSUdIQk9SCisJCQkJCVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgY2hlY2tMYWJlbCA9IChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKW90aGVyU0lMYWJlbDsKKwkJCQkJU3RyaW5nIGNoZWNrUG9wdWxhdGlvbiA9IGNoZWNrTGFiZWwuZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpOworCQkJCQlpZihjaGVja1BvcHVsYXRpb24uZXF1YWxzKHBvcHVsYXRpb25OYW1lKSkgeworCQkJCQkJdG90YWxQb3B1bGF0aW9uID0gKChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpb3RoZXJTSUxhYmVsLmdldFRlbXBWYWx1ZSgpKS5nZXRQb3B1bGF0aW9uQ291bnQoKTsKKwkJCQkJCXJldHVybiB0b3RhbFBvcHVsYXRpb247CisJCQkJCX0vL2lmKGNoZWNrUG9wdWxhdGlvbi5lcXVhbHMocG9wdWxhdGlvbk5hbWUpKSAKKyAgICAJCQkJCisgICAgCQkJCQorICAgIAkJCX0KKyAgICAJCSAgICAgCisgICAgCQl9CisgICAgCX0KKyAgICAJcmV0dXJuIDAuMDsKKyAgICB9CisJICAKKworCUBPdmVycmlkZQorCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbCBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbCgpIHsKKwkJcmV0dXJuIFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0lMYWJlbCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKSB7CisJCXJldHVybiBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNJTGFiZWxWYWx1ZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBEaXNlYXNlTW9kZWxTdGF0ZSBjcmVhdGVEaXNlYXNlTW9kZWxTdGF0ZSgpIHsKKwkJcmV0dXJuIFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0lEaXNlYXNlTW9kZWxTdGF0ZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuRGlzZWFzZU1vZGVsSW1wbCNjcmVhdGVJbmZlY3RvcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEluZmVjdG9yIGNyZWF0ZUluZmVjdG9yKCkgeworCQlTSUluZmVjdG9yIHJldFZhbHVlID0gU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTSUluZmVjdG9yKCk7CisJCXJldFZhbHVlLnNldERpc2Vhc2VOYW1lKHRoaXMuZ2V0RGlzZWFzZU5hbWUoKSk7CisJCXJldFZhbHVlLnNldFBvcHVsYXRpb25JZGVudGlmaWVyKGdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVJbmZlY3RvcgorCisJcHVibGljIHZvaWQgZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoTGFiZWxWYWx1ZSBsYWJlbCkgeworCQkvLyBOb3RoaW5nIHRvIGRvIGhlcmUuLi4KKwl9CisJCisJCisKKwkvKioKKwkgKiBXZSBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiBhbGwgcG9wdWxhdGlvbiBtb2RlbCBsYWJlbHMgZm9yIHRoZSBwb3B1bGF0aW9uIGdyb3VwcworCSAqIAorCSAqIEBwYXJhbSBwb3B1bGF0aW9uSWRlbnRpZmllcgorCSAqICAgICAgICAgICAgdGhlIHBvcHVsYXRpb24gYmVpbmcgbGFiZWxlZAorCSAqIEBwYXJhbSBncmFwaAorCSAqICAgICAgICAgICAgdGhlIGdyYXBoIHRvIHNlYXJjaAorCSAqIEByZXR1cm4gdGhlIFBvcHVsYXRpb25MYWJlbCBpbnN0YW5jZXMgb2YgdGhlIGdyYXBoIHRoYXQgbWF0Y2ggdGhlCisJICogICAgICAgICBpZGVudGlmaWVyLgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPFBvcHVsYXRpb25Nb2RlbExhYmVsPiBnZXRQb3B1bGF0aW9uTW9kZWxMYWJlbHMoCisJCQlmaW5hbCBTdHJpbmcgcG9wdWxhdGlvbklkZW50aWZpZXIsIGZpbmFsIEdyYXBoIGdyYXBoKSB7CisJCWZpbmFsIExpc3Q8UG9wdWxhdGlvbk1vZGVsTGFiZWw+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxQb3B1bGF0aW9uTW9kZWxMYWJlbD4oKTsKKworCQkvLyBJdGVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSBwb3B1bGF0aW9uIGxhYmVscyBpbiB0aGUgZ3JhcGgKKwkJRUxpc3Q8Tm9kZUxhYmVsPiBsYWJlbHMgPSBncmFwaC5nZXROb2RlTGFiZWxzQnlUeXBlVVJJKAorCQkJCVBvcHVsYXRpb25Nb2RlbExhYmVsLlVSSV9UWVBFX0RZTkFNSUNfUE9QVUxBVElPTl9MQUJFTCk7CisJCWZvciAoTm9kZUxhYmVsIHBsOmxhYmVscykgeworCQkJZmluYWwgUG9wdWxhdGlvbk1vZGVsTGFiZWwgcG9wdWxhdGlvbkxhYmVsID0gKFBvcHVsYXRpb25Nb2RlbExhYmVsKSBwbDsKKwkJCS8vIElzIHRoaXMgbGFiZWwgZm9yIHRoZSBwb3B1bGF0aW9uIHdlJ3JlIGxvb2tpbmcgZm9yPworCQkJYm9vbGVhbiBrZWVwID0gZmFsc2U7CisvLwkJCWlmIChwb3B1bGF0aW9uTGFiZWwuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKS5lcXVhbHMoCisvLwkJCQkJcG9wdWxhdGlvbklkZW50aWZpZXIpKSBrZWVwID0gdHJ1ZTsKKy8vCQkJZWxzZQorCQkJCWZvcihTdHJpbmdWYWx1ZSBnOnRoaXMuZ2V0UG9wdWxhdGlvbkdyb3VwcygpLmdldFZhbHVlcygpKQorCQkJCQlpZihnLmdldFZhbHVlKCkuZXF1YWxzKHBvcHVsYXRpb25MYWJlbC5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpKSkge2tlZXA9dHJ1ZTticmVhazt9CisJCQkJCQorCQkJaWYgKGtlZXApIHsKKwkJCQkvLyBZZXMKKwkJCQkvLyBJZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgIm5vZGUgdXJpIiBvZiB0aGUgcG9wdWxhdGlvbgorCQkJCS8vIGxhYmVsIHRoZW4gaXQgd291bGQgbm90IGhhdmUgYmVlbiBhc3NvY2lhdGVkIHdpdGggYSBub2RlCisJCQkJLy8gaW5zdGFuY2UgaW4gdGhlIGdyYXBoIGF0IHRoaXMgcG9pbnQuIFRoaXMgaXMgYSBwcm9ibGVtIGZvcgorCQkJCS8vIGRpc2Vhc2UgbW9kZWxzIHRoYXQgYXJlIHRyeWluZyB0byBsYWJlbCB0aGUgbm9kZSAodGhlcmUgaXNuJ3QKKwkJCQkvLyBvbmUhKS4gU28gZmlsdGVyIG91dCB0aG9zZSBtaXN0YWtlcyBoZXJlLgorCisJCQkJLy8gRG9lcyB0aGUgcG9wdWxhdGlvbiBsYWJlbCBoYXZlIGFuIGFzc29jaWF0ZWQgbm9kZT8KKwkJCQlpZiAocG9wdWxhdGlvbkxhYmVsLmdldE5vZGUoKSAhPSBudWxsKSB7CisJCQkJCS8vIFllcworCQkJCQlyZXRWYWx1ZS5hZGQocG9wdWxhdGlvbkxhYmVsKTsKKwkJCQl9IC8vIGlmIHRoZSBwb3B1bGF0aW9uIGxhYmVsIGhhcyBhIG5vZGUKKwkJCX0gLy8gaWYgdGhlIHBvcHVsYXRpb24gd2UncmUgbG9va2luZyBmb3IKKwkJfSAvLyBmb3IgZWFjaCBwb3B1bGF0aW9uIGxhYmVsCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0UG9wdWxhdGlvbkxhYmVscworCisJLyoqCisJICogV2UgbmVlZCB0byBvdmVycmlkZSB0byBjaGVjayBhbGwgcG9wdWxhdGlvbiBncm91cHMKKwkgKi8KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwcmVwYXJlKE1vZGVsIG1vZGVsLCBTVEVNVGltZSB0aW1lKSB7CisKKwkJZm9yKFN0cmluZ1ZhbHVlIHN2OnRoaXMuZ2V0UG9wdWxhdGlvbkdyb3VwcygpLmdldFZhbHVlcygpKSB7CisJCQlib29sZWFuIGZvdW5kID0gZmluZFBvcHVsYXRpb25Nb2RlbChtb2RlbCwgc3YuZ2V0VmFsdWUoKSk7CisJCQkKKwkJCWlmKCFmb3VuZCkgeworCQkJCS8vIENyZWF0ZSBhIG5ldyBzdGFuZGFyZCBwb3B1bGF0aW9uIG1vZGVsCisJCQkJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwgc3BtID0gU3RhbmRhcmRGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwoKTsKKwkJCQlzcG0uc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoc3YuZ2V0VmFsdWUoKSk7CisJCQkJU3RyaW5nIHRpdGxlID0gIkF1dG8gR2VuZXJhdGVkICIrc3YuZ2V0VmFsdWUoKSsiIHBvcHVsYXRpb24gbW9kZWwiOworCQkJCVN0cmluZyBuYW1lID0gImF1dG9fZ2VuXyIrc3YuZ2V0VmFsdWUoKSsiX3BvcHVsYXRpb25fbW9kZWwiOworCQkJCXNwbS5zZXRVUkkoU1RFTVVSSS5jcmVhdGVVUkkobmFtZSsiLyIrU1RFTVVSSS5nZW5lcmF0ZVVuaXF1ZVBhcnQoKSkpOworCQkJCXNwbS5zZXROYW1lKG5hbWUpOworCQkJCXNwbS5nZXREdWJsaW5Db3JlKCkuc2V0VGl0bGUodGl0bGUpOworCQkJCW1vZGVsLmdldE5vZGVEZWNvcmF0b3JzKCkuYWRkKDAsIHNwbSk7CisJCQl9CisJCX0KKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNEZXRlcm1pbmlzdGljKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCit9IC8vTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL2ltcGwvTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi9pbXBsL011bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWU4MDRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi9pbXBsL011bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbEltcGwuamF2YQpAQCAtMCwwICsxLDMzOSBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aXBvcHVsYXRpb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJTGFiZWxWYWx1ZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lSTGFiZWxWYWx1ZUltcGw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NdWx0aSBQb3B1bGF0aW9uIFNJUiBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLmltcGwuTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsSW1wbCNnZXRJbW11bml0eUxvc3NSYXRlIDxlbT5JbW11bml0eSBMb3NzIFJhdGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxJbXBsIGV4dGVuZHMgTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxJbXBsIGltcGxlbWVudHMgTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbW11bml0eUxvc3NSYXRlKCkgPGVtPkltbXVuaXR5IExvc3MgUmF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW1tdW5pdHlMb3NzUmF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIERvdWJsZVZhbHVlTGlzdCBpbW11bml0eUxvc3NSYXRlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5MaXRlcmFscy5NVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEb3VibGVWYWx1ZUxpc3QgZ2V0SW1tdW5pdHlMb3NzUmF0ZSgpIHsKKwkJcmV0dXJuIGltbXVuaXR5TG9zc1JhdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW1tdW5pdHlMb3NzUmF0ZShEb3VibGVWYWx1ZUxpc3QgbmV3SW1tdW5pdHlMb3NzUmF0ZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlEb3VibGVWYWx1ZUxpc3Qgb2xkSW1tdW5pdHlMb3NzUmF0ZSA9IGltbXVuaXR5TG9zc1JhdGU7CisJCWltbXVuaXR5TG9zc1JhdGUgPSBuZXdJbW11bml0eUxvc3NSYXRlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0lNTVVOSVRZX0xPU1NfUkFURSwgb2xkSW1tdW5pdHlMb3NzUmF0ZSwgbmV3SW1tdW5pdHlMb3NzUmF0ZSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SW1tdW5pdHlMb3NzUmF0ZShEb3VibGVWYWx1ZUxpc3QgbmV3SW1tdW5pdHlMb3NzUmF0ZSkgeworCQlpZiAobmV3SW1tdW5pdHlMb3NzUmF0ZSAhPSBpbW11bml0eUxvc3NSYXRlKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChpbW11bml0eUxvc3NSYXRlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWltbXVuaXR5TG9zc1JhdGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0lNTVVOSVRZX0xPU1NfUkFURSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3SW1tdW5pdHlMb3NzUmF0ZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbW11bml0eUxvc3NSYXRlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19JTU1VTklUWV9MT1NTX1JBVEUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0SW1tdW5pdHlMb3NzUmF0ZShuZXdJbW11bml0eUxvc3NSYXRlLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fSU1NVU5JVFlfTE9TU19SQVRFLCBuZXdJbW11bml0eUxvc3NSYXRlLCBuZXdJbW11bml0eUxvc3NSYXRlKSk7CisJfQorCisJCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0lNTVVOSVRZX0xPU1NfUkFURToKKwkJCQlyZXR1cm4gYmFzaWNTZXRJbW11bml0eUxvc3NSYXRlKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkRGlzZWFzZU1vZGVsSW1wbCNjb21wdXRlRGVhdGhzKG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUsCisJICogICAgICBsb25nKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY29tcHV0ZURpc2Vhc2VEZWF0aHNEZWx0YXMoCisJCQlmaW5hbCBTVEVNVGltZSB0aW1lLCBmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VMYWJlbCwgZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGN1cnJlbnRMYWJlbFZhbHVlLCBmaW5hbCBsb25nIHRpbWVEZWx0YSwgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSByZXR1cm5WYWx1ZSkgeworCisJCVN0cmluZyB0aGlzUG9wdWxhdGlvbiA9IGRpc2Vhc2VMYWJlbC5nZXRQb3B1bGF0aW9uTW9kZWxMYWJlbCgpLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCk7CisJCWZpbmFsIFNJUkxhYmVsVmFsdWUgY3VycmVudFNJUiA9IChTSVJMYWJlbFZhbHVlKSBjdXJyZW50TGFiZWxWYWx1ZTsKKwkJCisJCWZpbmFsIGRvdWJsZSBhZGp1c3RlZEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlID0gZ2V0QWRqdXN0ZWRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSh0aW1lRGVsdGEsIHRoaXNQb3B1bGF0aW9uKTsKKwkJCisJCWZpbmFsIGRvdWJsZSBkaXNlYXNlRGVhdGhzID0gYWRqdXN0ZWRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZQorCQkJCSogY3VycmVudFNJUi5nZXRJKCk7CisKKwkJU0lSTGFiZWxWYWx1ZUltcGwgcmV0ID0gKFNJUkxhYmVsVmFsdWVJbXBsKXJldHVyblZhbHVlOworCQlyZXQuc2V0UygwLjApOworCQlyZXQuc2V0SSgtZGlzZWFzZURlYXRocyk7CisJCXJldC5zZXRSKDAuMCk7CisJCXJldC5zZXRJbmNpZGVuY2UoMC4wKTsKKwkJcmV0LnNldERpc2Vhc2VEZWF0aHMoZGlzZWFzZURlYXRocyk7CisJCQorCQlyZXR1cm4gcmV0OworCX0gLy8gY29tcHV0ZUJpcnRoRGVhdGhzRGVsdGFzCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGNvbXB1dGVEaXNlYXNlRGVsdGFzKFNURU1UaW1lIHRpbWUsCisJCQlTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY3VycmVudFN0YXRlLAorCQkJU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTGFiZWwsIGxvbmcgdGltZURlbHRhLAorCQkJRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSByZXR1cm5WYWx1ZSkgeworCQkKKwkJLy8gVEhJUyBtZXRob2QgZ2V0cyBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIG9uY2UgZm9yIGVhY2ggcG9wdWxhdGlvbiBpZGVudGlmaWVyCisJCS8vIGluIHRoZSBwb3B1bGF0aW9uIG1vZGVsLgorCQkvLyB3aGljaCBwb3B1bGF0aW9uIGlzICJ0aGlzIi4uLi4KKwkJZmluYWwgU0lSTGFiZWxWYWx1ZSBjdXJyZW50U0lSID0gKFNJUkxhYmVsVmFsdWUpIGN1cnJlbnRTdGF0ZTsKKwkJU3RyaW5nIHRoaXNQb3B1bGF0aW9uID0gZGlzZWFzZUxhYmVsLmdldFBvcHVsYXRpb25Nb2RlbExhYmVsKCkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKwkJCQkKKwkJLy8gbmV4dCBnZXQgaXQncyBJTkRFWCBpbiB0aGUgbW9kZWwKKwkJaW50IHBvcHVsYXRpb25JbmRleCA9IHRoaXMuZ2V0UG9wdWxhdGlvbkluZGV4KHRoaXNQb3B1bGF0aW9uKTsJCisJCQkKKwkJLy8gbm93IHdlIGtub3cgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHBvcHVsYXRpb24gYmVpbmcgaW50ZWdyYXRlZC4KKwkJLy8gR2V0IHRoZSBjb3JyZWN0IHRyYW5zbWlzc2lvbiByYXRlIGxpc3QgZnJvbSB0aGUgTUFUUklYCisJCUVMaXN0PERvdWJsZVZhbHVlPiB0cmFuc21pc3Npb25WZWN0b3IgPSB0cmFuc21pc3Npb25SYXRlLmdldFZhbHVlTGlzdHMoKS5nZXQocG9wdWxhdGlvbkluZGV4KS5nZXRWYWx1ZXMoKTsKKwkJCisJCS8vIEFMTCB0aGUgb3RoZXIgZGlzZWFzZSBwYXJhbWV0ZXJzIGFyZSBhbHNvIERvdWJsZVZhbHVlTGlzdHMuIFdlIG5vdyBpdGVyYXRlIHRocm91Z2ggYWxsIHBvcHVsYXRpb25zCisJCS8vIGdldCB0aGUgc3BlY2lmaWMgcmF0ZSBwYXJhbWV0ZXJzIGZyb20gRUFDSCBsaXN0IGJhc2VkIG9uIHRoaXMgcG9wdWxhdGlvbiBpbmRleAorCQlkb3VibGUgdGhpc1JlY292ZXJ5UmF0ZSA9IDAuMDsKKwkJaWYocmVjb3ZlcnlSYXRlICE9IG51bGwpIHRoaXNSZWNvdmVyeVJhdGUgPSByZWNvdmVyeVJhdGUuZ2V0VmFsdWVzKCkuZ2V0KHBvcHVsYXRpb25JbmRleCkuZ2V0VmFsdWUoKTsKKwkJZG91YmxlIHRoaXNJbW11bml0eUxvc3NSYXRlID0gMC4wOworCQlpZihpbW11bml0eUxvc3NSYXRlICE9IG51bGwpIHRoaXNJbW11bml0eUxvc3NSYXRlID0gIGltbXVuaXR5TG9zc1JhdGUuZ2V0VmFsdWVzKCkuZ2V0KHBvcHVsYXRpb25JbmRleCkuZ2V0VmFsdWUoKTsKKwkJCisJCQorCQkvLyAgTk9XIGl0ZXJhdGUgb3ZlciBldmVyeSBwb3B1bGF0aW9uIChpbmNsdWRpbmcgdGhpcyBvbmUpIHRvIGNvbXB1dGUgbmV3IGluZmVjdGlvbnMKKwkJLy8gIHRoaXMgaW5jbHVkZXMgaW5mZWN0aW9ucyB3aXRoaW4gYSBwb3B1bGF0aW9uIGdyb3VwCisJCS8vICBhbmQgYWxsIHRoZSBjcm9zcyB0ZXJtcworCQlkb3VibGUgbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgPSAwLjA7CisJCWRvdWJsZSBudW1iZXJTdXNjZXB0aWJsZSA9IGN1cnJlbnRTSVIuZ2V0UygpOworCQlOb2RlIHRoaXNOb2RlID0gZGlzZWFzZUxhYmVsLmdldE5vZGUoKTsKKwkJCisJCUVMaXN0PFN0cmluZ1ZhbHVlPiBncm91cExpc3QgPSBwb3B1bGF0aW9uR3JvdXBzLmdldFZhbHVlcygpOworCQkKKwkJZm9yKGludCBpID0gMDsgaTwgdHJhbnNtaXNzaW9uVmVjdG9yLnNpemUoKTsgaSArKykgeworCQkJLy8gV2UgbmVlZCB0byBnZXQgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGl0aCBwb3B1bGF0aW9uIG1vZGVsCisJCQlTdHJpbmcgbmV4dFBvcCA9IGdyb3VwTGlzdC5nZXQoaSkuZ2V0VmFsdWUoKTsKKwkJCQorICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vCisJCQkvLyAxLiBjb21wdXRlIEJFVEEgZm9yIHRyYW5zbWlzc2lvbiBmcm9tIHRoZSBpdGggcG9wdWxhdGlvbiB0byB0aGlzIHBvcHVsYXRpb24KKwkJCSBkb3VibGUgc3BlY2lmaWNUcmFuc21pc3Npb24gPSB0cmFuc21pc3Npb25WZWN0b3IuZ2V0KGkpLmdldFZhbHVlKCk7CisJCQkgZG91YmxlIGFkanVzdGVkVHJhbnNtaXNzaW9uID0gZ2V0QWRqdXN0ZWRUcmFuc21pc3Npb25SYXRlKHNwZWNpZmljVHJhbnNtaXNzaW9uLCB0aW1lRGVsdGEpOworCQkJIGlmKCF0aGlzLmlzRnJlcXVlbmN5RGVwZW5kZW50KCkpIGFkanVzdGVkVHJhbnNtaXNzaW9uICo9IGdldFRyYW5zbWlzc2lvblJhdGVTY2FsZUZhY3RvcihkaXNlYXNlTGFiZWwpOworCQkJIAorCQkJCisJCQkvLyB3ZSBuZWVkIHRvIGdldCB0aGUgZGlzZWFzZSBsYWJlbCBmb3IgdGhlIGl0aCBwb3B1bGF0aW9uIGFzIHdlbGwuCisJCQkvLyB0byBnZXQgdGhlIG9uIHNpdGUgbnVtYmVyIG9mIGluZmVjdGlvcyBpbmRpdmlkdWFscyBvZiB0eXBlIGkKKwkJCUVMaXN0PE5vZGVMYWJlbD4gbm9kZUxhYmVscyA9IHRoaXNOb2RlLmdldExhYmVscygpOworCQkJZm9yKGludCBqID0gMDsgaiA8IG5vZGVMYWJlbHMuc2l6ZSgpOyBqICsrKSB7CisJCQkJTm9kZUxhYmVsIGxhYmVsID0gbm9kZUxhYmVscy5nZXQoaik7CisJCQkJaWYobGFiZWwgaW5zdGFuY2VvZiBTSVJMYWJlbCkgeworCQkJCQlpZiAodGhpcyA9PSAoKFNJUkxhYmVsKWxhYmVsKS5nZXREZWNvcmF0b3IoKSkgeworCQkJCQkJU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBvdGhlckRpc2Vhc2VMYWJlbCA9IChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKSBsYWJlbDsKKwkJCQkJCS8vIG5vdyBjaGVjayB0aGUgcG9wdWFsdGlvbiB0eXBlCisJCQkJCQlTdHJpbmcgb3RoZXJQb3B1bGF0aW9uID0gb3RoZXJEaXNlYXNlTGFiZWwuZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpOworCQkJCQkJaWYob3RoZXJQb3B1bGF0aW9uLmVxdWFscyhuZXh0UG9wKSkgeworCQkJCQkJCS8vIFllcz8KKwkJCQkJCQkvLyB0aGVuIHdlIGZvdW5kIHRoZSBsYWJlbCBmb3IgdGhlIGNvcnJlY3QgbmV4dCBwb3B1bGF0aW9uCisJCQkJCQkJCisJCQkKKwkJCQkJCQkvLyBmb3IgdGhpcyBwb3B1bGF0aW9uIHdlIG5lZWQgdG8gZ2V0IHRoZSBFRkZFQ1RJVkUgSW5mZWN0aW91cyBpbmNsdWRpbmcKKwkJCQkJCQkvLyBBTEwgbmVpZ2hib3Jpbmcgbm9kZXMKKwkJCQkJCQlkb3VibGUgb25zaXRlSW5mZWN0aW91cyA9ICgoU0lSTGFiZWwpIG90aGVyRGlzZWFzZUxhYmVsKS5nZXRUZW1wVmFsdWUoKS5nZXRJKCk7CisJCQkJCQkJZmluYWwgZG91YmxlIGVmZmVjdGl2ZUluZmVjdGlvdXMgPSBnZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cyhvdGhlclBvcHVsYXRpb24sIHRoaXNOb2RlLCBvdGhlckRpc2Vhc2VMYWJlbCwgb25zaXRlSW5mZWN0aW91cyk7CisJCQkJCQkJCisJCQkJCQkgICAgLy8gQUREIHVwIHRoZSBuZXcgaW5jaWRlbmNlCisJCQkJCQkJbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgKz0gYWRqdXN0ZWRUcmFuc21pc3Npb24gKiBudW1iZXJTdXNjZXB0aWJsZSAqIGVmZmVjdGl2ZUluZmVjdGlvdXM7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9Ly8gaWYgaXQncyBhbiBTSSBsYWJlbAorCQkJfS8vZm9yIGFsbCBsYWJlbHMgaW4gVEhJUyBub2RlCisJCX0vLyBGb3IgYWxsIHBvcHVsYXRpb24gaW4gdGhlIG1vZGVsCisJCQorCQlkb3VibGUgbnVtYmVyT2ZJbmZlY3RlZFRvUmVjb3ZlcmVkID0gZ2V0QWRqdXN0ZWRSZWNvdmVyeVJhdGUodGhpc1JlY292ZXJ5UmF0ZSwgdGltZURlbHRhKSAqIGN1cnJlbnRTSVIuZ2V0SSgpOworCQlkb3VibGUgbnVtYmVyT2ZSZWNvdmVyZWRUb1N1c2NlcHRpYmxlID0gZ2V0QWRqdXN0ZWRJbW11bml0eUxvc3NSYXRlKHRoaXNJbW11bml0eUxvc3NSYXRlLCB0aW1lRGVsdGEpICogY3VycmVudFNJUi5nZXRSKCk7CisJCisJCS8vIERldGVybWluZSBkZWx0YSBTCisJCWZpbmFsIGRvdWJsZSBkZWx0YVMgPSAtIG51bWJlck9mU3VzY2VwdGlibGVUb0luZmVjdGVkICsgbnVtYmVyT2ZSZWNvdmVyZWRUb1N1c2NlcHRpYmxlOworCQkvLyBEZXRlcm1pbmUgZGVsdGEgSQorCQlmaW5hbCBkb3VibGUgZGVsdGFJID0gbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgLSBudW1iZXJPZkluZmVjdGVkVG9SZWNvdmVyZWQ7CisJCS8vIERldGVybWluZSBkZWx0YSBSCQorCQlmaW5hbCBkb3VibGUgZGVsdGFSID0gbnVtYmVyT2ZJbmZlY3RlZFRvUmVjb3ZlcmVkIC0gbnVtYmVyT2ZSZWNvdmVyZWRUb1N1c2NlcHRpYmxlOworCQkKKwkJU0lSTGFiZWxWYWx1ZUltcGwgcmV0ID0gKFNJUkxhYmVsVmFsdWVJbXBsKXJldHVyblZhbHVlOworCQlyZXQuc2V0UyhkZWx0YVMpOworCQlyZXQuc2V0SShkZWx0YUkpOworCQlyZXQuc2V0UihkZWx0YVIpOworCQlyZXQuc2V0SW5jaWRlbmNlKG51bWJlck9mU3VzY2VwdGlibGVUb0luZmVjdGVkKTsKKwkJcmV0LnNldERpc2Vhc2VEZWF0aHMoMC4wKTsKKwkJcmV0dXJuIHJldDsKKwkJCisJfQorCisJcHVibGljIGRvdWJsZSBnZXRBZGp1c3RlZEltbXVuaXR5TG9zc1JhdGUoZG91YmxlIHNwZWNpZmljTG9zc1JhdGUsIGxvbmcgdGltZURlbHRhKSB7CisJCXJldHVybiAoc3BlY2lmaWNMb3NzUmF0ZSAqICgoZG91YmxlKSB0aW1lRGVsdGEgLyAoZG91YmxlKSBnZXRUaW1lUGVyaW9kKCkpICk7CisJfSAvLyBnZXRBZGp1c3RlZEltbXVuaXR5TG9zc1JhdGUKKwkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWwgY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWwoKSB7CisJCXJldHVybiBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNJUkxhYmVsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpIHsKKwkJcmV0dXJuIFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0lSTGFiZWxWYWx1ZSgpOworCX0KKworCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0lNTVVOSVRZX0xPU1NfUkFURToKKwkJCQlyZXR1cm4gZ2V0SW1tdW5pdHlMb3NzUmF0ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fSU1NVU5JVFlfTE9TU19SQVRFOgorCQkJCXNldEltbXVuaXR5TG9zc1JhdGUoKERvdWJsZVZhbHVlTGlzdCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19JTU1VTklUWV9MT1NTX1JBVEU6CisJCQkJc2V0SW1tdW5pdHlMb3NzUmF0ZSgoRG91YmxlVmFsdWVMaXN0KW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0lNTVVOSVRZX0xPU1NfUkFURToKKwkJCQlyZXR1cm4gaW1tdW5pdHlMb3NzUmF0ZSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy9NdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL2ltcGwvTXVsdGlwb3B1bGF0aW9uRmFjdG9yeUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vaW1wbC9NdWx0aXBvcHVsYXRpb25GYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZmFjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL2ltcGwvTXVsdGlwb3B1bGF0aW9uRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uKjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aXBvcHVsYXRpb25GYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIE11bHRpcG9wdWxhdGlvbkZhY3RvcnkgeworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIE11bHRpcG9wdWxhdGlvbkZhY3RvcnkgaW5pdCgpIHsKKwkJdHJ5IHsKKwkJCU11bHRpcG9wdWxhdGlvbkZhY3RvcnkgdGhlTXVsdGlwb3B1bGF0aW9uRmFjdG9yeSA9IChNdWx0aXBvcHVsYXRpb25GYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24uZWNvcmUiKTsgCisJCQlpZiAodGhlTXVsdGlwb3B1bGF0aW9uRmFjdG9yeSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoZU11bHRpcG9wdWxhdGlvbkZhY3Rvcnk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXJldHVybiBuZXcgTXVsdGlwb3B1bGF0aW9uRmFjdG9yeUltcGwoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNdWx0aXBvcHVsYXRpb25GYWN0b3J5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgeworCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTDogcmV0dXJuIGNyZWF0ZU11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKCk7CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTDogcmV0dXJuIGNyZWF0ZU11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbCgpOworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMOiByZXR1cm4gY3JlYXRlTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCgpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsIGNyZWF0ZU11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKCkgeworCQlNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbEltcGwgbXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwgPSBuZXcgTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxJbXBsKCk7CisJCXJldHVybiBtdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsIGNyZWF0ZU11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbCgpIHsKKwkJTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsSW1wbCBtdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwgPSBuZXcgTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsSW1wbCgpOworCQlyZXR1cm4gbXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsIGNyZWF0ZU11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwoKSB7CisJCU11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxJbXBsIG11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwgPSBuZXcgTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbEltcGwoKTsKKwkJcmV0dXJuIG11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE11bHRpcG9wdWxhdGlvblBhY2thZ2UgZ2V0TXVsdGlwb3B1bGF0aW9uUGFja2FnZSgpIHsKKwkJcmV0dXJuIChNdWx0aXBvcHVsYXRpb25QYWNrYWdlKWdldEVQYWNrYWdlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZGVwcmVjYXRlZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlARGVwcmVjYXRlZAorCXB1YmxpYyBzdGF0aWMgTXVsdGlwb3B1bGF0aW9uUGFja2FnZSBnZXRQYWNrYWdlKCkgeworCQlyZXR1cm4gTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5lSU5TVEFOQ0U7CisJfQorCit9IC8vTXVsdGlwb3B1bGF0aW9uRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vaW1wbC9NdWx0aXBvcHVsYXRpb25QYWNrYWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi9pbXBsL011bHRpcG9wdWxhdGlvblBhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhOTU3MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vaW1wbC9NdWx0aXBvcHVsYXRpb25QYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzMwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpcG9wdWxhdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aXBvcHVsYXRpb25QYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aXBvcHVsYXRpb25QYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIE11bHRpcG9wdWxhdGlvblBhY2thZ2UgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIG11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIG11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbEVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgbXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKKwkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KKwkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCisJICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKKwkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpcG9wdWxhdGlvblBhY2thZ2UjZU5TX1VSSQorCSAqIEBzZWUgI2luaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIE11bHRpcG9wdWxhdGlvblBhY2thZ2VJbXBsKCkgeworCQlzdXBlcihlTlNfVVJJLCBNdWx0aXBvcHVsYXRpb25GYWN0b3J5LmVJTlNUQU5DRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgorCSAqIAorCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgTXVsdGlwb3B1bGF0aW9uUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KKwkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZU5TX1VSSQorCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCisJICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgTXVsdGlwb3B1bGF0aW9uUGFja2FnZSBpbml0KCkgeworCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoTXVsdGlwb3B1bGF0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNdWx0aXBvcHVsYXRpb25QYWNrYWdlLmVOU19VUkkpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKwkJTXVsdGlwb3B1bGF0aW9uUGFja2FnZUltcGwgdGhlTXVsdGlwb3B1bGF0aW9uUGFja2FnZSA9IChNdWx0aXBvcHVsYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgTXVsdGlwb3B1bGF0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgTXVsdGlwb3B1bGF0aW9uUGFja2FnZUltcGwoKSk7CisKKwkJaXNJbml0ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcworCQlTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCisJCXRoZU11bHRpcG9wdWxhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQorCQl0aGVNdWx0aXBvcHVsYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCisJCXRoZU11bHRpcG9wdWxhdGlvblBhY2thZ2UuZnJlZXplKCk7CisKKyAgCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5lTlNfVVJJLCB0aGVNdWx0aXBvcHVsYXRpb25QYWNrYWdlKTsKKwkJcmV0dXJuIHRoZU11bHRpcG9wdWxhdGlvblBhY2thZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCgpIHsKKwkJcmV0dXJuIG11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX1RyYW5zbWlzc2lvblJhdGUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSltdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX1JlY292ZXJ5UmF0ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKW11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfSW5mZWN0aW91c01vcnRhbGl0eVJhdGUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSltdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX1BoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9Sb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9DaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldE11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbCgpIHsKKwkJcmV0dXJuIG11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxfSW1tdW5pdHlMb3NzUmF0ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKW11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0TXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCgpIHsKKwkJcmV0dXJuIG11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbF9JbmN1YmF0aW9uUmF0ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKW11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9Qb3B1bGF0aW9uR3JvdXBzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpbXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTXVsdGlwb3B1bGF0aW9uRmFjdG9yeSBnZXRNdWx0aXBvcHVsYXRpb25GYWN0b3J5KCkgeworCQlyZXR1cm4gKE11bHRpcG9wdWxhdGlvbkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcworCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKKwkJaXNDcmVhdGVkID0gdHJ1ZTsKKworCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJbXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShtdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbEVDbGFzcywgTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0dST1VQUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UobXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxFQ2xhc3MsIE1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEUpOworCQljcmVhdGVFUmVmZXJlbmNlKG11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsRUNsYXNzLCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEUpOworCQljcmVhdGVFUmVmZXJlbmNlKG11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsRUNsYXNzLCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUpOworCQljcmVhdGVFQXR0cmlidXRlKG11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsRUNsYXNzLCBNVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShtdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbEVDbGFzcywgTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShtdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbEVDbGFzcywgTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0UpOworCisJCW11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShtdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxFQ2xhc3MsIE1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0lNTVVOSVRZX0xPU1NfUkFURSk7CisKKwkJbXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UobXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbEVDbGFzcywgTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0lOQ1VCQVRJT05fUkFURSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOworCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKKwkJc2V0TmFtZShlTkFNRSk7CisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOworCQlzZXROc1VSSShlTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCisJCVN0YW5kYXJkUGFja2FnZSB0aGVTdGFuZGFyZFBhY2thZ2UgPSAoU3RhbmRhcmRQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFN0YW5kYXJkUGFja2FnZS5lTlNfVVJJKTsKKwkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKKwkJRWNvcmVQYWNrYWdlIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCW11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVN0YW5kYXJkUGFja2FnZS5nZXRTdGFuZGFyZERpc2Vhc2VNb2RlbCgpKTsKKwkJbXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwoKSk7CisJCW11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwoKSk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKwkJaW5pdEVDbGFzcyhtdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbEVDbGFzcywgTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwuY2xhc3MsICJNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfUG9wdWxhdGlvbkdyb3VwcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFN0cmluZ1ZhbHVlTGlzdCgpLCBudWxsLCAicG9wdWxhdGlvbkdyb3VwcyIsIG51bGwsIDEsIDEsIE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9UcmFuc21pc3Npb25SYXRlKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RG91YmxlVmFsdWVNYXRyaXgoKSwgbnVsbCwgInRyYW5zbWlzc2lvblJhdGUiLCBudWxsLCAxLCAxLCBNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfUmVjb3ZlcnlSYXRlKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RG91YmxlVmFsdWVMaXN0KCksIG51bGwsICJyZWNvdmVyeVJhdGUiLCBudWxsLCAxLCAxLCBNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfSW5mZWN0aW91c01vcnRhbGl0eVJhdGUoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREb3VibGVWYWx1ZUxpc3QoKSwgbnVsbCwgImluZmVjdGlvdXNNb3J0YWxpdHlSYXRlIiwgbnVsbCwgMSwgMSwgTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX1BoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJwaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbiIsICIwLjAxIiwgMCwgMSwgTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX1JvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24oKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24iLCAiMC4wNSIsIDAsIDEsIE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9DaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJjaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlIiwgIjIuMjUiLCAwLCAxLCBNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKG11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbEVDbGFzcywgTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsLmNsYXNzLCAiTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxfSW1tdW5pdHlMb3NzUmF0ZSgpLCB0aGVDb21tb25QYWNrYWdlLmdldERvdWJsZVZhbHVlTGlzdCgpLCBudWxsLCAiaW1tdW5pdHlMb3NzUmF0ZSIsIG51bGwsIDEsIDEsIE11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKG11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxFQ2xhc3MsIE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwuY2xhc3MsICJNdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRNdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsX0luY3ViYXRpb25SYXRlKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RG91YmxlVmFsdWVMaXN0KCksIG51bGwsICJpbmN1YmF0aW9uUmF0ZSIsIG51bGwsIDEsIDEsIE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJLy8gQ3JlYXRlIHJlc291cmNlCisJCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCX0KKworfSAvL011bHRpcG9wdWxhdGlvblBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3Byb3ZpZGVyL011bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJvdmlkZXIvTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ODliY2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3Byb3ZpZGVyL011bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIwOCBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24ucHJvdmlkZXI7CisKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpcG9wdWxhdGlvblBhY2thZ2U7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWx9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIKKwlleHRlbmRzIE11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRJbmN1YmF0aW9uUmF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSW5jdWJhdGlvbiBSYXRlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkSW5jdWJhdGlvblJhdGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9NdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsX2luY3ViYXRpb25SYXRlX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsX2luY3ViYXRpb25SYXRlX2ZlYXR1cmUiLCAiX1VJX011bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxfdHlwZSIpLAorCQkJCSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLkxpdGVyYWxzLk1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMX19JTkNVQkFUSU9OX1JBVEUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0lOQ1VCQVRJT05fUkFURSk7CisJCX0KKwkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7CisJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKKwkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgorCisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbTE2L21kaXNlYXNlLmdpZiIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwpb2JqZWN0KS5nZXRVUkkoKS5sYXN0U2VnbWVudCgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX011bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxfdHlwZSIpIDoKKwkJCWxhYmVsOworCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwuY2xhc3MpKSB7CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0lOQ1VCQVRJT05fUkFURToKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5MaXRlcmFscy5NVUxUSV9QT1BVTEFUSU9OX1NFSVJfRElTRUFTRV9NT0RFTF9fSU5DVUJBVElPTl9SQVRFLAorCQkJCSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEb3VibGVWYWx1ZUxpc3QoKSkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLCBPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7CisJCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOworCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKKworCQlib29sZWFuIHF1YWxpZnkgPQorCQkJY2hpbGRGZWF0dXJlID09IE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFIHx8CisJCQljaGlsZEZlYXR1cmUgPT0gTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5MaXRlcmFscy5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUgfHwKKwkJCWNoaWxkRmVhdHVyZSA9PSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLkxpdGVyYWxzLk1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0lNTVVOSVRZX0xPU1NfUkFURSB8fAorCQkJY2hpbGRGZWF0dXJlID09IE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0lOQ1VCQVRJT05fUkFURTsKKworCQlpZiAocXVhbGlmeSkgeworCQkJcmV0dXJuIGdldFN0cmluZworCQkJCSgiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwKKwkJCQkgbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLCBnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3Byb3ZpZGVyL011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3Byb3ZpZGVyL011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiZGY2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJvdmlkZXIvTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDM4MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlwb3B1bGF0aW9uUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdGFuZGFyZERpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWx9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBTdGFuZGFyZERpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkUG9wdWxhdGlvbkdyb3Vwc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkVHJhbnNtaXNzaW9uUmF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkUmVjb3ZlcnlSYXRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkUm9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkQ2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUG9wdWxhdGlvbiBHcm91cHMgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRQb3B1bGF0aW9uR3JvdXBzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfcG9wdWxhdGlvbkdyb3Vwc19mZWF0dXJlIiksCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfcG9wdWxhdGlvbkdyb3Vwc19mZWF0dXJlIiwgIl9VSV9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF90eXBlIiksCisJCQkJIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0dST1VQUywKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRyYW5zbWlzc2lvbiBSYXRlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkVHJhbnNtaXNzaW9uUmF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX3RyYW5zbWlzc2lvblJhdGVfZmVhdHVyZSIpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX3RyYW5zbWlzc2lvblJhdGVfZmVhdHVyZSIsICJfVUlfTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfdHlwZSIpLAorCQkJCSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLkxpdGVyYWxzLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWNvdmVyeSBSYXRlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkUmVjb3ZlcnlSYXRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfcmVjb3ZlcnlSYXRlX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9yZWNvdmVyeVJhdGVfZmVhdHVyZSIsICJfVUlfTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfdHlwZSIpLAorCQkJCSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLkxpdGVyYWxzLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUkVDT1ZFUllfUkFURSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX2luZmVjdGlvdXNNb3J0YWxpdHlSYXRlX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9pbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZV9mZWF0dXJlIiwgIl9VSV9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF90eXBlIiksCisJCQkJIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbiBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9yb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9yb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uX2ZlYXR1cmUiLCAiX1VJX011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX3R5cGUiKSwKKwkJCQkgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5MaXRlcmFscy5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT04sCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9jaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9jaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlX2ZlYXR1cmUiLCAiX1VJX011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX3R5cGUiKSwKKwkJCQkgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5MaXRlcmFscy5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7CisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChNdWx0aXBvcHVsYXRpb25QYWNrYWdlLkxpdGVyYWxzLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9HUk9VUFMpOworCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5MaXRlcmFscy5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFKTsKKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFKTsKKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFKTsKKwkJfQorCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKKwkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgorCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCisKKwkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbTE2L21kaXNlYXNlLmdpZiIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKW9iamVjdCkuZ2V0VVJJKCkubGFzdFNlZ21lbnQoKS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX3R5cGUiKSA6CisJCQlsYWJlbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwpb2JqZWN0KS5nZXREaXNlYXNlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX3R5cGUiKSA6CisJCQlnZXRTdHJpbmcoIl9VSV9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF90eXBlIikgKyAiICIgKyBsYWJlbDsKKwl9CisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwuY2xhc3MpKSB7CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTjoKKwkJCWNhc2UgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT046CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0U6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTOgorCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEU6CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFOgorCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURToKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5MaXRlcmFscy5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTLAorCQkJCSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdHJpbmdWYWx1ZUxpc3QoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5MaXRlcmFscy5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFLAorCQkJCSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEb3VibGVWYWx1ZU1hdHJpeCgpKSk7CisKKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgorCQkJCShNdWx0aXBvcHVsYXRpb25QYWNrYWdlLkxpdGVyYWxzLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUkVDT1ZFUllfUkFURSwKKwkJCQkgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG91YmxlVmFsdWVMaXN0KCkpKTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFLAorCQkJCSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEb3VibGVWYWx1ZUxpc3QoKSkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLCBPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7CisJCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOworCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKKworCQlib29sZWFuIHF1YWxpZnkgPQorCQkJY2hpbGRGZWF0dXJlID09IE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFIHx8CisJCQljaGlsZEZlYXR1cmUgPT0gTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5MaXRlcmFscy5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEU7CisKKwkJaWYgKHF1YWxpZnkpIHsKKwkJCXJldHVybiBnZXRTdHJpbmcKKwkJCQkoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsCisJCQkJIG5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwgZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOworCQl9CisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gTXVsdGlwb3B1bGF0aW9uRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJvdmlkZXIvTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3Byb3ZpZGVyL011bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYzM1YTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3Byb3ZpZGVyL011bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjA3IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5wcm92aWRlcjsKKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aXBvcHVsYXRpb25QYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWx9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRJbW11bml0eUxvc3NSYXRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbW11bml0eSBMb3NzIFJhdGUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRJbW11bml0eUxvc3NSYXRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsX2ltbXVuaXR5TG9zc1JhdGVfZmVhdHVyZSIpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX011bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbF9pbW11bml0eUxvc3NSYXRlX2ZlYXR1cmUiLCAiX1VJX011bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbF90eXBlIiksCisJCQkJIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fSU1NVU5JVFlfTE9TU19SQVRFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7CisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChNdWx0aXBvcHVsYXRpb25QYWNrYWdlLkxpdGVyYWxzLk1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0lNTVVOSVRZX0xPU1NfUkFURSk7CisJCX0KKwkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7CisJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKKwkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgorCisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIE11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbC5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvY3VzdG9tMTYvbWRpc2Vhc2UuZ2lmIikpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsKW9iamVjdCkuZ2V0VVJJKCkubGFzdFNlZ21lbnQoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9NdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxfdHlwZSIpIDoKKwkJCWxhYmVsOworCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbC5jbGFzcykpIHsKKwkJCWNhc2UgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19JTU1VTklUWV9MT1NTX1JBVEU6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfUE9QVUxBVElPTl9TSVJfRElTRUFTRV9NT0RFTF9fSU1NVU5JVFlfTE9TU19SQVRFLAorCQkJCSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEb3VibGVWYWx1ZUxpc3QoKSkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLCBPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7CisJCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOworCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKKworCQlib29sZWFuIHF1YWxpZnkgPQorCQkJY2hpbGRGZWF0dXJlID09IE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFIHx8CisJCQljaGlsZEZlYXR1cmUgPT0gTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5MaXRlcmFscy5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUgfHwKKwkJCWNoaWxkRmVhdHVyZSA9PSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLkxpdGVyYWxzLk1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0lNTVVOSVRZX0xPU1NfUkFURTsKKworCQlpZiAocXVhbGlmeSkgeworCQkJcmV0dXJuIGdldFN0cmluZworCQkJCSgiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwKKwkJCQkgbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLCBnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3Byb3ZpZGVyL011bHRpcG9wdWxhdGlvbkVkaXRQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJvdmlkZXIvTXVsdGlwb3B1bGF0aW9uRWRpdFBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OTI0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3Byb3ZpZGVyL011bHRpcG9wdWxhdGlvbkVkaXRQbHVnaW4uamF2YQpAQCAtMCwwICsxLDExNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5FY2xpcHNlVUlQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUVkaXRQbHVnaW47CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnByb3ZpZGVyLkRlZmluaXRpb25zRWRpdFBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5EaXNlYXNlbW9kZWxzRWRpdFBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdGFuZGFyZEVkaXRQbHVnaW47CisKKy8qKgorICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBNdWx0aXBvcHVsYXRpb24gZWRpdCBwbHVnaW4uCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNdWx0aXBvcHVsYXRpb25FZGl0UGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIHsKKwkvKioKKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBNdWx0aXBvcHVsYXRpb25FZGl0UGx1Z2luIElOU1RBTkNFID0gbmV3IE11bHRpcG9wdWxhdGlvbkVkaXRQbHVnaW4oKTsKKwkKKwkvKioKKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gcGx1Z2luOworCisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTXVsdGlwb3B1bGF0aW9uRWRpdFBsdWdpbigpIHsKKwkJc3VwZXIKKwkJICAobmV3IFJlc291cmNlTG9jYXRvciBbXSB7CisJCSAgICAgRGlzZWFzZW1vZGVsc0VkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCSAgICAgQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCSAgICAgRWNvcmVFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkgICAgIERlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJICAgICBTdGFuZGFyZEVkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCSAgIH0pOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisJCisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOworCisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgorCQkJLy8KKwkJCXBsdWdpbiA9IHRoaXM7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJvdmlkZXIvTXVsdGlwb3B1bGF0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJvdmlkZXIvTXVsdGlwb3B1bGF0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDMzZjllCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi9wcm92aWRlci9NdWx0aXBvcHVsYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjU2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24ucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLnV0aWwuTXVsdGlwb3B1bGF0aW9uQWRhcHRlckZhY3Rvcnk7CisKKy8qKgorICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLgorICogVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uCisgKiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgorICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTXVsdGlwb3B1bGF0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBNdWx0aXBvcHVsYXRpb25BZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTXVsdGlwb3B1bGF0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgbXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlpZiAobXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJbXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPSBuZXcgTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gbXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbH0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgbXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlpZiAobXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCW11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciA9IG5ldyBNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gbXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgbXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWx9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlpZiAobXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQltdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyID0gbmV3IE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gbXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgeworCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7CisJCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7CisJCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7CisJCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3M8Pz4pIHx8ICgoKENsYXNzPD8+KXR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7CisJCQkJcmV0dXJuIGFkYXB0ZXI7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn0gYW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKworCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgeworCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJaWYgKG11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyICE9IG51bGwpIG11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKG11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciAhPSBudWxsKSBtdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAobXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciAhPSBudWxsKSBtdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJvdmlkZXIvTXVsdGlwb3B1bGF0aW9uUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3Byb3ZpZGVyL011bHRpcG9wdWxhdGlvblBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZjkyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3Byb3ZpZGVyL011bHRpcG9wdWxhdGlvblBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5wcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU3RyaW5nVmFsdWVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucG9wdWxhdGlvbi5Qb3B1bGF0aW9uRW51bWVyYXRvckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbDsKKworcHVibGljIGNsYXNzIE11bHRpcG9wdWxhdGlvblBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlciBleHRlbmRzCisJCVBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlciBpbXBsZW1lbnRzIEFkYXB0ZXIgeworCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZ1tdIGdldFBvcHVsYXRpb25JZGVudGlmaWVycygpIHsKKwkJTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwgZG0gPSAoTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwpZ2V0VGFyZ2V0KCk7CisJCQorCQlTdHJpbmdWYWx1ZUxpc3QgbGlzdCA9IGRtLmdldFBvcHVsYXRpb25Hcm91cHMoKTsKKwkJRUxpc3Q8b3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZT4gdmFscyA9IGxpc3QuZ2V0VmFsdWVzKCk7CisJCVN0cmluZyBbXSByZXMgPSBuZXcgU3RyaW5nW3ZhbHMuc2l6ZSgpKzFdOworCQlyZXNbMF0gPSBkbS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpOworCQlmb3IoaW50IGk9MTtpPHZhbHMuc2l6ZSgpKzE7KytpKQorCQkJcmVzW2ldID0gdmFscy5nZXQoaS0xKS5nZXRWYWx1ZSgpOworCQlyZXR1cm4gcmVzOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJvdmlkZXIvTXVsdGlwb3B1bGF0aW9uUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi9wcm92aWRlci9NdWx0aXBvcHVsYXRpb25Qb3B1bGF0aW9uRW51bWVyYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM2OTdmZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJvdmlkZXIvTXVsdGlwb3B1bGF0aW9uUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvLyBTdGFuZGFyZFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnBvcHVsYXRpb24uUG9wdWxhdGlvbkVudW1lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5wb3B1bGF0aW9uLlBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi51dGlsLk11bHRpcG9wdWxhdGlvbkFkYXB0ZXJGYWN0b3J5OworCisvKgorICovCitwdWJsaWMgY2xhc3MgTXVsdGlwb3B1bGF0aW9uUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCU11bHRpcG9wdWxhdGlvbkFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyRmFjdG9yeSB7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzCisJICogYWRhcHRlciBmYWN0b3J5LgorCSAqLyAKKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKKworCS8qKgorCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4KKwkgKi8KKwlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7CisKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJcHVibGljIE11bHRpcG9wdWxhdGlvblBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJCVBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRkQWRhcHRlckZhY3RvcnkodGhpcyk7CisJfSAvLyBNdWx0aXBvcHVsYXRpb25Qb3B1bGF0aW9uRW51bWVyYXRvckFkYXB0ZXJGYWN0b3J5CisKKwkvKioKKwkgKiAJIAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBNdWx0aXBvcHVsYXRpb25Qb3B1bGF0aW9uRW51bWVyYXRvckFkYXB0ZXIoKTsKKwl9IAorCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfSAvLyBhZGRMaXN0ZW5lcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXIjZmlyZU5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKKwkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCX0KKwl9IC8vIGZpcmVOb3RpZnlDaGFuZ2VkCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfSAvLyByZW1vdmVMaXN0ZW5lcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5I2dldFJvb3RBZGFwdGVyRmFjdG9yeSgpCisJICovCisJcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeQorCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKKwl9IC8vIGdldFJvb3RBZGFwdGVyRmFjdG9yeQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5I3NldFBhcmVudEFkYXB0ZXJGYWN0b3J5KG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3RvcnkpCisJICovCisJcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoCisJCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7CisJCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKKwl9IC8vIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC51dGlsLlN0YW5kYXJkQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gUG9wdWxhdGlvbkVudW1lcmF0b3IuY2xhc3MKKwkJCQl8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOworCX0gLy8gaXNGYWN0b3J5Rm9yVHlwZQorCisJLyoqCisJICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGUjZGlzcG9zZSgpCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJLy8gTm90aGluZworCX0gLy8gZGlzcG9zZQorCisJLyoqCisJICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2YgdGhlIFJlbGF0aXZlIFZhbHVlIFByb3ZpZGVyIEFkYXB0ZXIgRmFjdG9yeQorCSAqLworCXByaXZhdGUgc3RhdGljIFBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlckZhY3RvcnkgZ2V0UG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIFBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0U7CisJfSAvLyBnZXRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQorCisJCit9IC8vIFN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vdXRpbC9NdWx0aXBvcHVsYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi91dGlsL011bHRpcG9wdWxhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI0ZDNlOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vdXRpbC9NdWx0aXBvcHVsYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzM4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24udXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi4qOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpcG9wdWxhdGlvblBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE11bHRpcG9wdWxhdGlvbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBNdWx0aXBvcHVsYXRpb25QYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTXVsdGlwb3B1bGF0aW9uQWRhcHRlckZhY3RvcnkoKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgeworCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBUaGUgc3dpdGNoIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE11bHRpcG9wdWxhdGlvblN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9CisJCW5ldyBNdWx0aXBvcHVsYXRpb25Td2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbChNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwoTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsKE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZU11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyA8VD4gQWRhcHRlciBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGVjb3JhdG9yKERlY29yYXRvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGVjb3JhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTm9kZURlY29yYXRvcihOb2RlRGVjb3JhdG9yIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVOb2RlRGVjb3JhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU2FuaXR5Q2hlY2tlcihTYW5pdHlDaGVja2VyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTYW5pdHlDaGVja2VyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTW9kaWZpYWJsZShNb2RpZmlhYmxlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVNb2RpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGlzZWFzZU1vZGVsKERpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGlzZWFzZU1vZGVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSW50ZWdyYXRpb25EZWNvcmF0b3IoSW50ZWdyYXRpb25EZWNvcmF0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUludGVncmF0aW9uRGVjb3JhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3RhbmRhcmREaXNlYXNlTW9kZWwoU3RhbmRhcmREaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0YW5kYXJkRGlzZWFzZU1vZGVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworCQkJfQorCQl9OworCisJLyoqCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwgPGVtPk11bHRpIFBvcHVsYXRpb24gU0kgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbCA8ZW0+TXVsdGkgUG9wdWxhdGlvbiBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCA8ZW0+TXVsdGkgUG9wdWxhdGlvbiBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmEubGFuZy5Db21wYXJhYmxlIDxlbT5Db21wYXJhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhcmFibGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlIDxlbT5JZGVudGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yIDxlbT5EZWNvcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWNvcmF0b3JBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yIDxlbT5Ob2RlIERlY29yYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVOb2RlRGVjb3JhdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIgPGVtPlNhbml0eSBDaGVja2VyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTYW5pdHlDaGVja2VyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZSA8ZW0+TW9kaWZpYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2RpZmlhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsIDxlbT5EaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3IgPGVtPkludGVncmF0aW9uIERlY29yYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSW50ZWdyYXRpb25EZWNvcmF0b3JBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbCA8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RhbmRhcmREaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9IC8vTXVsdGlwb3B1bGF0aW9uQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vdXRpbC9NdWx0aXBvcHVsYXRpb25Td2l0Y2guamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vdXRpbC9NdWx0aXBvcHVsYXRpb25Td2l0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzNiMWNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi91dGlsL011bHRpcG9wdWxhdGlvblN3aXRjaC5qYXZhCkBAIC0wLDAgKzEsMzUzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24udXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQorICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAorICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKKyAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKyAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAorICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlwb3B1bGF0aW9uUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTXVsdGlwb3B1bGF0aW9uU3dpdGNoPFQxPiB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBNdWx0aXBvcHVsYXRpb25QYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTXVsdGlwb3B1bGF0aW9uU3dpdGNoKCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IE11bHRpcG9wdWxhdGlvblBhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUMSBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKKwkJfQorCQllbHNlIHsKKwkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOworCQkJcmV0dXJuCisJCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KKwkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgorCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7CisJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMOiB7CisJCQkJTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwgbXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwgPSAoTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwobXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0YW5kYXJkRGlzZWFzZU1vZGVsKG11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEaXNlYXNlTW9kZWwobXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKG11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlRGVjb3JhdG9yKG11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTYW5pdHlDaGVja2VyKG11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKG11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZWNvcmF0b3IobXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShtdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShtdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUw6IHsKKwkJCQlNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwgbXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsID0gKE11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwobXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbChtdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0YW5kYXJkRGlzZWFzZU1vZGVsKG11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlzZWFzZU1vZGVsKG11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSW50ZWdyYXRpb25EZWNvcmF0b3IobXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlRGVjb3JhdG9yKG11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcihtdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUobXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZWNvcmF0b3IobXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUobXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKG11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMOiB7CisJCQkJTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCBtdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsID0gKE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbChtdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwobXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwobXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmREaXNlYXNlTW9kZWwobXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlzZWFzZU1vZGVsKG11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKG11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3IobXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcihtdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKG11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcihtdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUobXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShtdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NdWx0aSBQb3B1bGF0aW9uIFNJIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NdWx0aSBQb3B1bGF0aW9uIFNJIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwoTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk11bHRpIFBvcHVsYXRpb24gU0lSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NdWx0aSBQb3B1bGF0aW9uIFNJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZU11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbChNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk11bHRpIFBvcHVsYXRpb24gU0VJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TXVsdGkgUG9wdWxhdGlvbiBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbChNdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIDxUPiBUMSBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVjb3JhdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVjb3JhdG9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZURlY29yYXRvcihEZWNvcmF0b3Igb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgRGVjb3JhdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZSBEZWNvcmF0b3I8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTm9kZURlY29yYXRvcihOb2RlRGVjb3JhdG9yIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNhbml0eSBDaGVja2VyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVNhbml0eUNoZWNrZXIoU2FuaXR5Q2hlY2tlciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kaWZpYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZGlmaWFibGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTW9kaWZpYWJsZShNb2RpZmlhYmxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VEaXNlYXNlTW9kZWwoRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlZ3JhdGlvbiBEZWNvcmF0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlZ3JhdGlvbiBEZWNvcmF0b3I8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlSW50ZWdyYXRpb25EZWNvcmF0b3IoSW50ZWdyYXRpb25EZWNvcmF0b3Igb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVN0YW5kYXJkRGlzZWFzZU1vZGVsKFN0YW5kYXJkRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9NdWx0aXBvcHVsYXRpb25Td2l0Y2gKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZTg2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvLmZicHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvLmZicHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdkMzcyNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy8uZmJwcmVmcwpAQCAtMCwwICsxLDEyOSBAQAorI0ZpbmRCdWdzIFVzZXIgUHJlZmVyZW5jZXMKKyNGcmkgTWFyIDE2IDE1OjIyOjA2IEVEVCAyMDA3CitkZWZhdWx0X2RpcmVjdG9yeT1DXDpcXFByb2dyYW0gRmlsZXNcXGVjbGlwc2VcXGVjbGlwc2UzLjIuMgorZGV0ZWN0b3JCQ1BNZXRob2RSZXR1cm5DaGVjaz1CQ1BNZXRob2RSZXR1cm5DaGVja3xmYWxzZQorZGV0ZWN0b3JCYWRBcHBsZXRDb25zdHJ1Y3Rvcj1CYWRBcHBsZXRDb25zdHJ1Y3RvcnxmYWxzZQorZGV0ZWN0b3JCYWRSZXN1bHRTZXRBY2Nlc3M9QmFkUmVzdWx0U2V0QWNjZXNzfHRydWUKK2RldGVjdG9yQmFkU3ludGF4Rm9yUmVndWxhckV4cHJlc3Npb249QmFkU3ludGF4Rm9yUmVndWxhckV4cHJlc3Npb258dHJ1ZQorZGV0ZWN0b3JCYWRVc2VPZlJldHVyblZhbHVlPUJhZFVzZU9mUmV0dXJuVmFsdWV8dHJ1ZQorZGV0ZWN0b3JCYWRseU92ZXJyaWRkZW5BZGFwdGVyPUJhZGx5T3ZlcnJpZGRlbkFkYXB0ZXJ8dHJ1ZQorZGV0ZWN0b3JDYWxsZWRNZXRob2RzPUNhbGxlZE1ldGhvZHN8dHJ1ZQorZGV0ZWN0b3JDaGVja0NhbGxzPUNoZWNrQ2FsbHN8ZmFsc2UKK2RldGVjdG9yQ2hlY2tJbW11dGFibGVBbm5vdGF0aW9uPUNoZWNrSW1tdXRhYmxlQW5ub3RhdGlvbnx0cnVlCitkZXRlY3RvckNsb25lSWRpb209Q2xvbmVJZGlvbXx0cnVlCitkZXRlY3RvckNvbXBhcmF0b3JJZGlvbT1Db21wYXJhdG9ySWRpb218dHJ1ZQorZGV0ZWN0b3JDb25mdXNlZEluaGVyaXRhbmNlPUNvbmZ1c2VkSW5oZXJpdGFuY2V8dHJ1ZQorZGV0ZWN0b3JDb25mdXNpb25CZXR3ZWVuSW5oZXJpdGVkQW5kT3V0ZXJNZXRob2Q9Q29uZnVzaW9uQmV0d2VlbkluaGVyaXRlZEFuZE91dGVyTWV0aG9kfHRydWUKK2RldGVjdG9yRG9JbnNpZGVEb1ByaXZpbGVnZWQ9RG9JbnNpZGVEb1ByaXZpbGVnZWR8dHJ1ZQorZGV0ZWN0b3JEb250Q2F0Y2hJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uPURvbnRDYXRjaElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb258dHJ1ZQorZGV0ZWN0b3JEcm9wcGVkRXhjZXB0aW9uPURyb3BwZWRFeGNlcHRpb258dHJ1ZQorZGV0ZWN0b3JEdW1iTWV0aG9kSW52b2NhdGlvbnM9RHVtYk1ldGhvZEludm9jYXRpb25zfHRydWUKK2RldGVjdG9yRHVtYk1ldGhvZHM9RHVtYk1ldGhvZHN8dHJ1ZQorZGV0ZWN0b3JEdXBsaWNhdGVCcmFuY2hlcz1EdXBsaWNhdGVCcmFuY2hlc3x0cnVlCitkZXRlY3RvckVtcHR5WmlwRmlsZUVudHJ5PUVtcHR5WmlwRmlsZUVudHJ5fHRydWUKK2RldGVjdG9yRXFTdHJpbmdUZXN0PUVxU3RyaW5nVGVzdHxmYWxzZQorZGV0ZWN0b3JGaW5kQmFkQ2FzdD1GaW5kQmFkQ2FzdHxmYWxzZQorZGV0ZWN0b3JGaW5kQmFkQ2FzdDI9RmluZEJhZENhc3QyfHRydWUKK2RldGVjdG9yRmluZEJhZEVxdWFsc0ltcGxlbWVudGF0aW9uPUZpbmRCYWRFcXVhbHNJbXBsZW1lbnRhdGlvbnxmYWxzZQorZGV0ZWN0b3JGaW5kQmFkRm9yTG9vcD1GaW5kQmFkRm9yTG9vcHx0cnVlCitkZXRlY3RvckZpbmRCdWdzU3VtbWFyeVN0YXRzPUZpbmRCdWdzU3VtbWFyeVN0YXRzfHRydWUKK2RldGVjdG9yRmluZENpcmN1bGFyRGVwZW5kZW5jaWVzPUZpbmRDaXJjdWxhckRlcGVuZGVuY2llc3xmYWxzZQorZGV0ZWN0b3JGaW5kRGVhZExvY2FsU3RvcmVzPUZpbmREZWFkTG9jYWxTdG9yZXN8dHJ1ZQorZGV0ZWN0b3JGaW5kRG91YmxlQ2hlY2s9RmluZERvdWJsZUNoZWNrfHRydWUKK2RldGVjdG9yRmluZEVtcHR5U3luY2hyb25pemVkQmxvY2s9RmluZEVtcHR5U3luY2hyb25pemVkQmxvY2t8dHJ1ZQorZGV0ZWN0b3JGaW5kRmllbGRTZWxmQXNzaWdubWVudD1GaW5kRmllbGRTZWxmQXNzaWdubWVudHx0cnVlCitkZXRlY3RvckZpbmRGaW5hbGl6ZUludm9jYXRpb25zPUZpbmRGaW5hbGl6ZUludm9jYXRpb25zfHRydWUKK2RldGVjdG9yRmluZEZsb2F0RXF1YWxpdHk9RmluZEZsb2F0RXF1YWxpdHl8dHJ1ZQorZGV0ZWN0b3JGaW5kRmxvYXRNYXRoPUZpbmRGbG9hdE1hdGh8ZmFsc2UKK2RldGVjdG9yRmluZEhFbWlzbWF0Y2g9RmluZEhFbWlzbWF0Y2h8dHJ1ZQorZGV0ZWN0b3JGaW5kSW5jb25zaXN0ZW50U3luYzI9RmluZEluY29uc2lzdGVudFN5bmMyfHRydWUKK2RldGVjdG9yRmluZEpTUjE2NkxvY2tNb25pdG9yZW50ZXI9RmluZEpTUjE2NkxvY2tNb25pdG9yZW50ZXJ8dHJ1ZQorZGV0ZWN0b3JGaW5kTG9jYWxTZWxmQXNzaWdubWVudDI9RmluZExvY2FsU2VsZkFzc2lnbm1lbnQyfHRydWUKK2RldGVjdG9yRmluZE1hc2tlZEZpZWxkcz1GaW5kTWFza2VkRmllbGRzfHRydWUKK2RldGVjdG9yRmluZE1pc21hdGNoZWRXYWl0T3JOb3RpZnk9RmluZE1pc21hdGNoZWRXYWl0T3JOb3RpZnl8dHJ1ZQorZGV0ZWN0b3JGaW5kTmFrZWROb3RpZnk9RmluZE5ha2VkTm90aWZ5fHRydWUKK2RldGVjdG9yRmluZE5vblNlcmlhbGl6YWJsZVN0b3JlSW50b1Nlc3Npb249RmluZE5vblNlcmlhbGl6YWJsZVN0b3JlSW50b1Nlc3Npb258dHJ1ZQorZGV0ZWN0b3JGaW5kTm9uU2VyaWFsaXphYmxlVmFsdWVQYXNzZWRUb1dyaXRlT2JqZWN0PUZpbmROb25TZXJpYWxpemFibGVWYWx1ZVBhc3NlZFRvV3JpdGVPYmplY3R8dHJ1ZQorZGV0ZWN0b3JGaW5kTm9uU2hvcnRDaXJjdWl0PUZpbmROb25TaG9ydENpcmN1aXR8dHJ1ZQorZGV0ZWN0b3JGaW5kTnVsbERlcmVmPUZpbmROdWxsRGVyZWZ8dHJ1ZQorZGV0ZWN0b3JGaW5kT3BlblN0cmVhbT1GaW5kT3BlblN0cmVhbXx0cnVlCitkZXRlY3RvckZpbmRQdXp6bGVycz1GaW5kUHV6emxlcnN8dHJ1ZQorZGV0ZWN0b3JGaW5kUmVmQ29tcGFyaXNvbj1GaW5kUmVmQ29tcGFyaXNvbnx0cnVlCitkZXRlY3RvckZpbmRSZXR1cm5SZWY9RmluZFJldHVyblJlZnx0cnVlCitkZXRlY3RvckZpbmRSdW5JbnZvY2F0aW9ucz1GaW5kUnVuSW52b2NhdGlvbnN8dHJ1ZQorZGV0ZWN0b3JGaW5kU2VsZkNvbXBhcmlzb249RmluZFNlbGZDb21wYXJpc29ufHRydWUKK2RldGVjdG9yRmluZFNlbGZDb21wYXJpc29uMj1GaW5kU2VsZkNvbXBhcmlzb24yfHRydWUKK2RldGVjdG9yRmluZFNsZWVwV2l0aExvY2tIZWxkPUZpbmRTbGVlcFdpdGhMb2NrSGVsZHx0cnVlCitkZXRlY3RvckZpbmRTcGluTG9vcD1GaW5kU3Bpbkxvb3B8dHJ1ZQorZGV0ZWN0b3JGaW5kU3FsSW5qZWN0aW9uPUZpbmRTcWxJbmplY3Rpb258dHJ1ZQorZGV0ZWN0b3JGaW5kVHdvTG9ja1dhaXQ9RmluZFR3b0xvY2tXYWl0fHRydWUKK2RldGVjdG9yRmluZFVuY2FsbGVkUHJpdmF0ZU1ldGhvZHM9RmluZFVuY2FsbGVkUHJpdmF0ZU1ldGhvZHN8dHJ1ZQorZGV0ZWN0b3JGaW5kVW5jb25kaXRpb25hbFdhaXQ9RmluZFVuY29uZGl0aW9uYWxXYWl0fHRydWUKK2RldGVjdG9yRmluZFVuaW5pdGlhbGl6ZWRHZXQ9RmluZFVuaW5pdGlhbGl6ZWRHZXR8dHJ1ZQorZGV0ZWN0b3JGaW5kVW5yZWxhdGVkVHlwZXNJbkdlbmVyaWNDb250YWluZXI9RmluZFVucmVsYXRlZFR5cGVzSW5HZW5lcmljQ29udGFpbmVyfHRydWUKK2RldGVjdG9yRmluZFVucmVsZWFzZWRMb2NrPUZpbmRVbnJlbGVhc2VkTG9ja3x0cnVlCitkZXRlY3RvckZpbmRVbnNhdGlzZmllZE9ibGlnYXRpb249RmluZFVuc2F0aXNmaWVkT2JsaWdhdGlvbnxmYWxzZQorZGV0ZWN0b3JGaW5kVW5zeW5jR2V0PUZpbmRVbnN5bmNHZXR8dHJ1ZQorZGV0ZWN0b3JGaW5kVXNlbGVzc0NvbnRyb2xGbG93PUZpbmRVc2VsZXNzQ29udHJvbEZsb3d8dHJ1ZQorZGV0ZWN0b3JIdWdlU2hhcmVkU3RyaW5nQ29uc3RhbnRzPUh1Z2VTaGFyZWRTdHJpbmdDb25zdGFudHN8dHJ1ZQorZGV0ZWN0b3JJRGl2UmVzdWx0Q2FzdFRvRG91YmxlPUlEaXZSZXN1bHRDYXN0VG9Eb3VibGV8dHJ1ZQorZGV0ZWN0b3JJbmNvbXBhdE1hc2s9SW5jb21wYXRNYXNrfHRydWUKK2RldGVjdG9ySW5lZmZpY2llbnRNZW1iZXJBY2Nlc3M9SW5lZmZpY2llbnRNZW1iZXJBY2Nlc3N8ZmFsc2UKK2RldGVjdG9ySW5lZmZpY2llbnRUb0FycmF5PUluZWZmaWNpZW50VG9BcnJheXx0cnVlCitkZXRlY3RvckluZmluaXRlTG9vcD1JbmZpbml0ZUxvb3B8dHJ1ZQorZGV0ZWN0b3JJbmZpbml0ZVJlY3Vyc2l2ZUxvb3A9SW5maW5pdGVSZWN1cnNpdmVMb29wfHRydWUKK2RldGVjdG9ySW5maW5pdGVSZWN1cnNpdmVMb29wMj1JbmZpbml0ZVJlY3Vyc2l2ZUxvb3AyfGZhbHNlCitkZXRlY3RvckluaGVyaXRhbmNlVW5zYWZlR2V0UmVzb3VyY2U9SW5oZXJpdGFuY2VVbnNhZmVHZXRSZXNvdXJjZXx0cnVlCitkZXRlY3RvckluaXRpYWxpemF0aW9uQ2hhaW49SW5pdGlhbGl6YXRpb25DaGFpbnx0cnVlCitkZXRlY3Rvckluc3RhbnRpYXRlU3RhdGljQ2xhc3M9SW5zdGFudGlhdGVTdGF0aWNDbGFzc3x0cnVlCitkZXRlY3RvckludmFsaWRKVW5pdFRlc3Q9SW52YWxpZEpVbml0VGVzdHx0cnVlCitkZXRlY3Rvckl0ZXJhdG9ySWRpb21zPUl0ZXJhdG9ySWRpb21zfHRydWUKK2RldGVjdG9yTGF6eUluaXQ9TGF6eUluaXR8dHJ1ZQorZGV0ZWN0b3JMb2FkT2ZLbm93bk51bGxWYWx1ZT1Mb2FkT2ZLbm93bk51bGxWYWx1ZXx0cnVlCitkZXRlY3RvckxvY2tlZEZpZWxkcz1Mb2NrZWRGaWVsZHN8ZmFsc2UKK2RldGVjdG9yTWV0aG9kUmV0dXJuQ2hlY2s9TWV0aG9kUmV0dXJuQ2hlY2t8dHJ1ZQorZGV0ZWN0b3JNZXRob2RzPU1ldGhvZHN8dHJ1ZQorZGV0ZWN0b3JNdWx0aXRocmVhZGVkSW5zdGFuY2VBY2Nlc3M9TXVsdGl0aHJlYWRlZEluc3RhbmNlQWNjZXNzfHRydWUKK2RldGVjdG9yTXV0YWJsZUxvY2s9TXV0YWJsZUxvY2t8dHJ1ZQorZGV0ZWN0b3JNdXRhYmxlU3RhdGljRmllbGRzPU11dGFibGVTdGF0aWNGaWVsZHN8dHJ1ZQorZGV0ZWN0b3JOYW1pbmc9TmFtaW5nfHRydWUKK2RldGVjdG9yTm90ZUFubm90YXRpb25SZXRlbnRpb249Tm90ZUFubm90YXRpb25SZXRlbnRpb258dHJ1ZQorZGV0ZWN0b3JOb3RlQ2hlY2tSZXR1cm5WYWx1ZT1Ob3RlQ2hlY2tSZXR1cm5WYWx1ZXx0cnVlCitkZXRlY3Rvck5vdGVDaGVja1JldHVyblZhbHVlQW5ub3RhdGlvbnM9Tm90ZUNoZWNrUmV0dXJuVmFsdWVBbm5vdGF0aW9uc3x0cnVlCitkZXRlY3Rvck5vdGVKQ0lQQW5ub3RhdGlvbj1Ob3RlSkNJUEFubm90YXRpb258dHJ1ZQorZGV0ZWN0b3JOb3RlTm9uTnVsbEFubm90YXRpb25zPU5vdGVOb25OdWxsQW5ub3RhdGlvbnN8dHJ1ZQorZGV0ZWN0b3JOb3RlU3VwcHJlc3NlZFdhcm5pbmdzPU5vdGVTdXBwcmVzc2VkV2FybmluZ3N8dHJ1ZQorZGV0ZWN0b3JOb3RlVW5jb25kaXRpb25hbFBhcmFtRGVyZWZzPU5vdGVVbmNvbmRpdGlvbmFsUGFyYW1EZXJlZnN8dHJ1ZQorZGV0ZWN0b3JOdW1iZXJDb25zdHJ1Y3Rvcj1OdW1iZXJDb25zdHJ1Y3RvcnxmYWxzZQorZGV0ZWN0b3JQcmVmZXJaZXJvTGVuZ3RoQXJyYXlzPVByZWZlclplcm9MZW5ndGhBcnJheXN8dHJ1ZQorZGV0ZWN0b3JQdWJsaWNTZW1hcGhvcmVzPVB1YmxpY1NlbWFwaG9yZXN8ZmFsc2UKK2RldGVjdG9yUXVlc3Rpb25hYmxlQm9vbGVhbkFzc2lnbm1lbnQ9UXVlc3Rpb25hYmxlQm9vbGVhbkFzc2lnbm1lbnR8dHJ1ZQorZGV0ZWN0b3JSZWFkUmV0dXJuU2hvdWxkQmVDaGVja2VkPVJlYWRSZXR1cm5TaG91bGRCZUNoZWNrZWR8dHJ1ZQorZGV0ZWN0b3JSZWR1bmRhbnRJbnRlcmZhY2VzPVJlZHVuZGFudEludGVyZmFjZXN8dHJ1ZQorZGV0ZWN0b3JSZXNvbHZlQWxsUmVmZXJlbmNlcz1SZXNvbHZlQWxsUmVmZXJlbmNlc3xmYWxzZQorZGV0ZWN0b3JSdW50aW1lRXhjZXB0aW9uQ2FwdHVyZT1SdW50aW1lRXhjZXB0aW9uQ2FwdHVyZXx0cnVlCitkZXRlY3RvclNlcmlhbGl6YWJsZUlkaW9tPVNlcmlhbGl6YWJsZUlkaW9tfHRydWUKK2RldGVjdG9yU3RhcnRJbkNvbnN0cnVjdG9yPVN0YXJ0SW5Db25zdHJ1Y3Rvcnx0cnVlCitkZXRlY3RvclN0cmluZ0NvbmNhdGVuYXRpb249U3RyaW5nQ29uY2F0ZW5hdGlvbnx0cnVlCitkZXRlY3RvclN1cGVyZmx1b3VzSW5zdGFuY2VPZj1TdXBlcmZsdW91c0luc3RhbmNlT2Z8dHJ1ZQorZGV0ZWN0b3JTdXNwaWNpb3VzVGhyZWFkSW50ZXJydXB0ZWQ9U3VzcGljaW91c1RocmVhZEludGVycnVwdGVkfHRydWUKK2RldGVjdG9yU3dpdGNoRmFsbHRocm91Z2g9U3dpdGNoRmFsbHRocm91Z2h8dHJ1ZQorZGV0ZWN0b3JUZXN0QVNNPVRlc3RBU018ZmFsc2UKK2RldGVjdG9yVGVzdGluZ0dyb3VuZD1UZXN0aW5nR3JvdW5kfGZhbHNlCitkZXRlY3RvclRyYWluRmllbGRTdG9yZVR5cGVzPVRyYWluRmllbGRTdG9yZVR5cGVzfHRydWUKK2RldGVjdG9yVHJhaW5Ob25OdWxsQW5ub3RhdGlvbnM9VHJhaW5Ob25OdWxsQW5ub3RhdGlvbnN8dHJ1ZQorZGV0ZWN0b3JUcmFpblVuY29uZGl0aW9uYWxEZXJlZlBhcmFtcz1UcmFpblVuY29uZGl0aW9uYWxEZXJlZlBhcmFtc3x0cnVlCitkZXRlY3RvclVSTFByb2JsZW1zPVVSTFByb2JsZW1zfHRydWUKK2RldGVjdG9yVW5jYWxsYWJsZU1ldGhvZE9mQW5vbnltb3VzQ2xhc3M9VW5jYWxsYWJsZU1ldGhvZE9mQW5vbnltb3VzQ2xhc3N8dHJ1ZQorZGV0ZWN0b3JVbm5lY2Vzc2FyeU1hdGg9VW5uZWNlc3NhcnlNYXRofHRydWUKK2RldGVjdG9yVW5yZWFkRmllbGRzPVVucmVhZEZpZWxkc3x0cnVlCitkZXRlY3RvclVzZU9iamVjdEVxdWFscz1Vc2VPYmplY3RFcXVhbHN8ZmFsc2UKK2RldGVjdG9yVXNlbGVzc1N1YmNsYXNzTWV0aG9kPVVzZWxlc3NTdWJjbGFzc01ldGhvZHxmYWxzZQorZGV0ZWN0b3JWYXJBcmdzUHJvYmxlbXM9VmFyQXJnc1Byb2JsZW1zfHRydWUKK2RldGVjdG9yVm9sYXRpbGVVc2FnZT1Wb2xhdGlsZVVzYWdlfHRydWUKK2RldGVjdG9yV2FpdEluTG9vcD1XYWl0SW5Mb29wfHRydWUKK2RldGVjdG9yV3JvbmdNYXBJdGVyYXRvcj1Xcm9uZ01hcEl0ZXJhdG9yfHRydWUKK2RldGVjdG9yWE1MRmFjdG9yeUJ5cGFzcz1YTUxGYWN0b3J5QnlwYXNzfHRydWUKK2RldGVjdG9yX3RocmVzaG9sZD0yCitmaWx0ZXJfc2V0dGluZ3M9TWVkaXVtfEkxOE4sTVRfQ09SUkVDVE5FU1MsTUFMSUNJT1VTX0NPREUsQkFEX1BSQUNUSUNFLFNUWUxFLENPUlJFQ1RORVNTLFBFUkZPUk1BTkNFfGZhbHNlCitmaWx0ZXJfc2V0dGluZ3NfbmVnPXwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy8ucHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODliZWIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVsczwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDAzYWI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDY5IEBACisjTW9uIEphbiAyMSAxMjozOTo0NyBFU1QgMjAwOAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3NWU4NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0wLDAgKzEsNTAgQEAKKyNXZWQgSnVsIDI1IDEyOjI3OjAwIEVEVCAyMDA3CitjbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9dHJ1ZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQorY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKK2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQorY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQorY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKK2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQorY2xlYW51cC51c2VfYmxvY2tzPXRydWUKK2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitjbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXBfcHJvZmlsZT1fY2xlYW51cAorY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI1MjE2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDIwIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzOyBzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5BY3RpdmF0b3IKK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscywKKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQsCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwsCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC51dGlsCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzO3Zpc2liaWxpdHk6PXJlZXhwb3J0CitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZjBjZWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE2IEBACisjIDxjb3B5cmlnaHQ+CisjIDwvY29weXJpZ2h0PgorIworIyAkSWQkCisKK2Jpbi5pbmNsdWRlcyA9IC4sXAorICAgICAgICAgICAgICAgaWNvbnMvLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIGJpbi8sXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKKyAgICAgICAgICAgICAgIG5vdGljZS5odG1sCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuCitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YjE5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9lcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwzMjggQEAKKzxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKK3htbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCit4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Cis8bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Cis8bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxsaW5rIHJlbD1GaWxlLUxpc3QKK2hyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgorPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Cis8IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8bzpEb2N1bWVudFByb3BlcnRpZXM+CisgIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+CisgIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KKyAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgorICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgorICA8bzpQYWdlcz40PC9vOlBhZ2VzPgorICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgorICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KKyAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgorICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+CisgIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgorICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgorIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Cis8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8dzpXb3JkRG9jdW1lbnQ+CisgIDx3OlRyYWNrUmV2aXNpb25zLz4KKyA8L3c6V29yZERvY3VtZW50PgorPC94bWw+PCFbZW5kaWZdLS0+Cis8c3R5bGU+Cis8IS0tCisgLyogRm9udCBEZWZpbml0aW9ucyAqLworQGZvbnQtZmFjZQorCXtmb250LWZhbWlseTpUYWhvbWE7CisJcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7CisJbXNvLWZvbnQtY2hhcnNldDowOworCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOworCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOworCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQorIC8qIFN0eWxlIERlZmluaXRpb25zICovCitwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCisJe21zby1zdHlsZS1wYXJlbnQ6IiI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorcAorCXttYXJnaW4tcmlnaHQ6MGluOworCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOworCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOworCW1hcmdpbi1sZWZ0OjBpbjsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0CisJe21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOworCW1hcmdpbjowaW47CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6OC4wcHQ7CisJZm9udC1mYW1pbHk6VGFob21hOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK0BwYWdlIFNlY3Rpb24xCisJe3NpemU6OC41aW4gMTEuMGluOworCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOworCW1zby1oZWFkZXItbWFyZ2luOi41aW47CisJbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKKwltc28tcGFwZXItc291cmNlOjA7fQorZGl2LlNlY3Rpb24xCisJe3BhZ2U6U2VjdGlvbjE7fQorLS0+Cis8L3N0eWxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+CisKKzxkaXYgY2xhc3M9U2VjdGlvbjE+CisKKzxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KKzwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgorVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKK1JFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQorT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2luIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCitkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+CitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2NoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCitzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCitieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKK2lmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCitzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKK1Byb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgord2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQord29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCitlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50CitjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQorb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKK2Rpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCityZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAorYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCitzdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQorZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQorU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cworUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKK3BhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKK2FuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQorY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KK29mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCitieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgordG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bworYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQorUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cworQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKK3RoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAorZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAorbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKK3RvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCitpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCit0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCitkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKK0VhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0CityaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCit0aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgorPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2VmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKK2NvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKK2FuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5CithbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKK2luY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKK2FzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQorc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAorQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQorc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAoraW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQorY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKK2NvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKK2NvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQorb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKK3N1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKK2FjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKK2FuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCitvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKK2xpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCitDb250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgorQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCitjb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCitsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwordGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgorY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKK29mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcworcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCit0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCit0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAorYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKK2luIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAord2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKK3NlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQorb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQorY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKK0FHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCitXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCitNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQorcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKK1Byb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKK0FncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKK2NvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCitlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCitPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKK1RIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKK1RIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCitvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0CitmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQorbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KK2FnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKK290aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQorc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAorc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQorcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKK3JpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKK2NvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50CitTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKK3RoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCit0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCitBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bworc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KKyhpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKK2V4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKK2V4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQorU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgorQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCitBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCitpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KKworPC9kaXY+CisKKzwvYm9keT4KKworPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlzZWFzZU1vZGVsTGFiZWxfZGlzZWFzZU1vZGVsU3RhdGVfQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpc2Vhc2VNb2RlbExhYmVsX2Rpc2Vhc2VNb2RlbFN0YXRlX0FnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZmFmYTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpc2Vhc2VNb2RlbExhYmVsX2Rpc2Vhc2VNb2RlbFN0YXRlX0FnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlzZWFzZU1vZGVsTGFiZWxfZGlzZWFzZU1vZGVsU3RhdGVfU0lEaXNlYXNlTW9kZWxTdGF0ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpc2Vhc2VNb2RlbExhYmVsX2Rpc2Vhc2VNb2RlbFN0YXRlX1NJRGlzZWFzZU1vZGVsU3RhdGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZjgxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpc2Vhc2VNb2RlbExhYmVsX2Rpc2Vhc2VNb2RlbFN0YXRlX1NJRGlzZWFzZU1vZGVsU3RhdGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9BcmVhTGFiZWxWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUR5bmFtaWNMYWJlbF9uZXh0VmFsdWVfQXJlYUxhYmVsVmFsdWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNDcxNGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUR5bmFtaWNMYWJlbF9uZXh0VmFsdWVfQXJlYUxhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTE4MDBjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEeW5hbWljTGFiZWxfbmV4dFZhbHVlX0NvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEeW5hbWljTGFiZWxfbmV4dFZhbHVlX1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkYzM0YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9Qb3B1bGF0aW9uTGFiZWxWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUR5bmFtaWNMYWJlbF9uZXh0VmFsdWVfUG9wdWxhdGlvbkxhYmVsVmFsdWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZTI3Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUR5bmFtaWNMYWJlbF9uZXh0VmFsdWVfUG9wdWxhdGlvbkxhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUR5bmFtaWNMYWJlbF9uZXh0VmFsdWVfUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYWQ4ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUR5bmFtaWNMYWJlbF9uZXh0VmFsdWVfUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9TRUlSTGFiZWxWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUR5bmFtaWNMYWJlbF9uZXh0VmFsdWVfU0VJUkxhYmVsVmFsdWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YTUxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUR5bmFtaWNMYWJlbF9uZXh0VmFsdWVfU0VJUkxhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9TSUxhYmVsVmFsdWUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEeW5hbWljTGFiZWxfbmV4dFZhbHVlX1NJTGFiZWxWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3MjU5YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9TSUxhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9TSVJMYWJlbFZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9TSVJMYWJlbFZhbHVlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTFiODZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEeW5hbWljTGFiZWxfbmV4dFZhbHVlX1NJUkxhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGY4MTExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEeW5hbWljTGFiZWxfbmV4dFZhbHVlX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSWRlbnRpZmlhYmxlX2R1YmxpbkNvcmVfRHVibGluQ29yZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlkZW50aWZpYWJsZV9kdWJsaW5Db3JlX0R1YmxpbkNvcmUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNGRjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlkZW50aWZpYWJsZV9kdWJsaW5Db3JlX0R1YmxpbkNvcmUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX0FyZWFMYWJlbFZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX0FyZWFMYWJlbFZhbHVlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTQ3MTRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMYWJlbF9jdXJyZW50VmFsdWVfQXJlYUxhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX0NvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMYWJlbF9jdXJyZW50VmFsdWVfQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExODAwYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX0NvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZGMzNGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1BvcHVsYXRpb25MYWJlbFZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1BvcHVsYXRpb25MYWJlbFZhbHVlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWUyN2NlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMYWJlbF9jdXJyZW50VmFsdWVfUG9wdWxhdGlvbkxhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmFkOGVjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMYWJlbF9jdXJyZW50VmFsdWVfUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1NFSVJMYWJlbFZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1NFSVJMYWJlbFZhbHVlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWE1MWQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMYWJlbF9jdXJyZW50VmFsdWVfU0VJUkxhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1NJTGFiZWxWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9TSUxhYmVsVmFsdWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNzI1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9TSUxhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1NJUkxhYmVsVmFsdWUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMYWJlbF9jdXJyZW50VmFsdWVfU0lSTGFiZWxWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkxYjg2YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1NJUkxhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMYWJlbF9jdXJyZW50VmFsdWVfVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhmODExMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L2Rpc2Vhc2UuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvZGlzZWFzZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0MDRlNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L2Rpc2Vhc2UuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L2luZmVjdG9yLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L2luZmVjdG9yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWJiNjg2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvaW5mZWN0b3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L2luZmVjdG9yY29sbGVjdGlvbi5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdXN0b20xNi9pbmZlY3RvcmNvbGxlY3Rpb24uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ODAxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdXN0b20xNi9pbmZlY3RvcmNvbGxlY3Rpb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L2lub2N1bGF0b3IuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvaW5vY3VsYXRvci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3YTM2MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L2lub2N1bGF0b3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L0luZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24uZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI3NDE0ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L0luZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L05ld0RldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L05ld0RldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjc0MTRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvTmV3RGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L05ld0RldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9OZXdEZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NzMxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9OZXdEZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L05ld0RldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvTmV3RGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwYWVkZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L05ld0RldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L1BvaXNzb25TSURpc2Vhc2VNb2RlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9Qb2lzc29uU0lEaXNlYXNlTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNTM0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9Qb2lzc29uU0lEaXNlYXNlTW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L1NJUklub2N1bGF0b3IuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvU0lSSW5vY3VsYXRvci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRjOTUzZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L1NJUklub2N1bGF0b3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L1N0b2NoYXN0aWNQb2lzc29uRGlzZWFzZU1vZGVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L1N0b2NoYXN0aWNQb2lzc29uRGlzZWFzZU1vZGVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjdjNDI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvU3RvY2hhc3RpY1BvaXNzb25EaXNlYXNlTW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L1N0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9TdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjhhZmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9TdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L1N0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiYzIyZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L1N0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L1N0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L1N0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjc0MTRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9tb2RlbC9kaXNlYXNlbW9kZWxzLmdlbm1vZGVsIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL21vZGVsL2Rpc2Vhc2Vtb2RlbHMuZ2VubW9kZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJhNjQyMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9tb2RlbC9kaXNlYXNlbW9kZWxzLmdlbm1vZGVsCkBAIC0wLDAgKzEsMjIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKKyAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjIgorICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjIgorICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscyIgbW9kZWxOYW1lPSJEaXNlYXNlbW9kZWxzIiBub25OTFNNYXJrZXJzPSJ0cnVlIgorICAgIHJpY2hDbGllbnRQbGF0Zm9ybT0idHJ1ZSIgdGVzdHNEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjIgorICAgIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5qYXZhIiBjb21wbGlhbmNlTGV2ZWw9IjUuMCIgY29weXJpZ2h0RmllbGRzPSJmYWxzZSIKKyAgICB1c2VkR2VuUGFja2FnZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vbW9kZWwgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9jb21tb24gLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9ncmFwaCAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL21vZGlmaWVyIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9zY2VuYXJpbyAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL3NlcXVlbmNlciAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL21vZGVsL2RlZmluaXRpb25zLmdlbm1vZGVsIy8vbGFiZWxzIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vc29sdmVyIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9tb2RlbC9zdGFuZGFyZC5nZW5tb2RlbCMvL3N0YW5kYXJkIj4KKyAgPGZvcmVpZ25Nb2RlbD5AbW9kZWw8L2ZvcmVpZ25Nb2RlbD4KKyAgPGdlblBhY2thZ2VzIHByZWZpeD0iU3RhbmRhcmQiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCisgICAgICBnZW5lcmF0ZUV4YW1wbGVDbGFzcz0iZmFsc2UiIGVjb3JlUGFja2FnZT0ic3RhbmRhcmQuZWNvcmUjLyI+CisgICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJzdGFuZGFyZC5lY29yZSMvL1VSSSIvPgorICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ic3RhbmRhcmQuZWNvcmUjLy9FTGlzdCIvPgorICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ic3RhbmRhcmQuZWNvcmUjLy9SYW5kb20iLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwiLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJzdGFuZGFyZC5lY29yZSMvL0RldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwiLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vRGlzZWFzZU1vZGVsIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzdGFuZGFyZC5lY29yZSMvL0Rpc2Vhc2VNb2RlbC9iYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vRGlzZWFzZU1vZGVsL3BvcHVsYXRpb25JZGVudGlmaWVyIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9EaXNlYXNlTW9kZWwvdGltZVBlcmlvZCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vRGlzZWFzZU1vZGVsL2Rpc2Vhc2VOYW1lIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vRGlzZWFzZU1vZGVsL3JlbGF0aXZlVG9sZXJhbmNlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vRGlzZWFzZU1vZGVsL2Zpbml0ZURpZmZlcmVuY2UiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzdGFuZGFyZC5lY29yZSMvL0Rpc2Vhc2VNb2RlbC9mcmVxdWVuY3lEZXBlbmRlbnQiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzdGFuZGFyZC5lY29yZSMvL0Rpc2Vhc2VNb2RlbC9iYWNrZ3JvdW5kQmlydGhSYXRlIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic3RhbmRhcmQuZWNvcmUjLy9EaXNlYXNlTW9kZWwvZ2V0QWRqdXN0ZWRCYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJzdGFuZGFyZC5lY29yZSMvL0Rpc2Vhc2VNb2RlbC9nZXRBZGp1c3RlZEJhY2tncm91bmRNb3J0YWxpdHlSYXRlL3RpbWVEZWx0YSIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249InN0YW5kYXJkLmVjb3JlIy8vRGlzZWFzZU1vZGVsL2NyZWF0ZURpc2Vhc2VNb2RlbExhYmVsIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic3RhbmRhcmQuZWNvcmUjLy9EaXNlYXNlTW9kZWwvY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249InN0YW5kYXJkLmVjb3JlIy8vRGlzZWFzZU1vZGVsL2NyZWF0ZURpc2Vhc2VNb2RlbFN0YXRlIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic3RhbmRhcmQuZWNvcmUjLy9EaXNlYXNlTW9kZWwvaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZSI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJzdGFuZGFyZC5lY29yZSMvL0Rpc2Vhc2VNb2RlbC9pbml0aWFsaXplRGlzZWFzZVN0YXRlL2Rpc2Vhc2VNb2RlbFN0YXRlIi8+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJzdGFuZGFyZC5lY29yZSMvL0Rpc2Vhc2VNb2RlbC9pbml0aWFsaXplRGlzZWFzZVN0YXRlL2Rpc2Vhc2VNb2RlbExhYmVsIi8+CisgICAgICA8L2dlbk9wZXJhdGlvbnM+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic3RhbmRhcmQuZWNvcmUjLy9EaXNlYXNlTW9kZWwvaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZS4xIj4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9InN0YW5kYXJkLmVjb3JlIy8vRGlzZWFzZU1vZGVsL2luaXRpYWxpemVEaXNlYXNlU3RhdGUuMS9kaXNlYXNlTW9kZWxMYWJlbCIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249InN0YW5kYXJkLmVjb3JlIy8vRGlzZWFzZU1vZGVsL2NyZWF0ZUluZmVjdG9yIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic3RhbmRhcmQuZWNvcmUjLy9EaXNlYXNlTW9kZWwvZ2V0QWRqdXN0ZWRCYWNrZ3JvdW5kQmlydGhSYXRlIj4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9InN0YW5kYXJkLmVjb3JlIy8vRGlzZWFzZU1vZGVsL2dldEFkanVzdGVkQmFja2dyb3VuZEJpcnRoUmF0ZS90aW1lRGVsdGEiLz4KKyAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJzdGFuZGFyZC5lY29yZSMvL0Rpc2Vhc2VNb2RlbExhYmVsIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzdGFuZGFyZC5lY29yZSMvL0Rpc2Vhc2VNb2RlbExhYmVsL3BvcHVsYXRpb25MYWJlbCIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzdGFuZGFyZC5lY29yZSMvL0Rpc2Vhc2VNb2RlbExhYmVsL2Rpc2Vhc2VNb2RlbFN0YXRlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc3RhbmRhcmQuZWNvcmUjLy9EaXNlYXNlTW9kZWxMYWJlbC9wb3B1bGF0aW9uTW9kZWxMYWJlbCIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlL2Rpc2Vhc2VEZWF0aHMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZS9wb3B1bGF0aW9uQ291bnQiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzdGFuZGFyZC5lY29yZSMvL0Rpc2Vhc2VNb2RlbExhYmVsVmFsdWUvaW5jaWRlbmNlIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic3RhbmRhcmQuZWNvcmUjLy9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlL3NldCI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJzdGFuZGFyZC5lY29yZSMvL0Rpc2Vhc2VNb2RlbExhYmVsVmFsdWUvc2V0L3ZhbHVlIi8+CisgICAgICA8L2dlbk9wZXJhdGlvbnM+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic3RhbmRhcmQuZWNvcmUjLy9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlL2FkZCI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJzdGFuZGFyZC5lY29yZSMvL0Rpc2Vhc2VNb2RlbExhYmVsVmFsdWUvYWRkL3ZhbHVlIi8+CisgICAgICA8L2dlbk9wZXJhdGlvbnM+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic3RhbmRhcmQuZWNvcmUjLy9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlL3N1YiI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJzdGFuZGFyZC5lY29yZSMvL0Rpc2Vhc2VNb2RlbExhYmVsVmFsdWUvc3ViL3ZhbHVlIi8+CisgICAgICA8L2dlbk9wZXJhdGlvbnM+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic3RhbmRhcmQuZWNvcmUjLy9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlL3NjYWxlIj4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9InN0YW5kYXJkLmVjb3JlIy8vRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZS9zY2FsZS9zY2FsZUZhY3RvciIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249InN0YW5kYXJkLmVjb3JlIy8vRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZS96ZXJvT3V0UG9wdWxhdGlvbkNvdW50Ii8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic3RhbmRhcmQuZWNvcmUjLy9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlL2dldEFkZGl0aW9ucyIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249InN0YW5kYXJkLmVjb3JlIy8vRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZS9nZXRTdWJzdHJhY3Rpb25zIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9EaXNlYXNlTW9kZWxTdGF0ZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHN0YW5kYXJkLmVjb3JlIy8vRGlzZWFzZU1vZGVsU3RhdGUvbGFiZWwiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJzdGFuZGFyZC5lY29yZSMvL0luZmVjdG9yIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzdGFuZGFyZC5lY29yZSMvL0luZmVjdG9yL2Rpc2Vhc2VNb2RlbCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vSW5mZWN0b3IvdGFyZ2V0VVJJIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9JbmZlY3Rvci9kaXNlYXNlTmFtZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vSW5mZWN0b3IvdGFyZ2V0SVNPS2V5Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc3RhbmRhcmQuZWNvcmUjLy9JbmZlY3Rvci9sYWJlbHNUb0luZmVjdCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vSW5mZWN0b3IvcG9wdWxhdGlvbklkZW50aWZpZXIiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzdGFuZGFyZC5lY29yZSMvL0luZmVjdG9yL2luZmVjdFBlcmNlbnRhZ2UiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJzdGFuZGFyZC5lY29yZSMvL1NFSVIiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vU0VJUi9pbmN1YmF0aW9uUmF0ZSIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249InN0YW5kYXJkLmVjb3JlIy8vU0VJUi9nZXRBZGp1c3RlZEluY3ViYXRpb25SYXRlIj4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9InN0YW5kYXJkLmVjb3JlIy8vU0VJUi9nZXRBZGp1c3RlZEluY3ViYXRpb25SYXRlL3RpbWVEZWx0YSIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vU0VJUkxhYmVsIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzdGFuZGFyZC5lY29yZSMvL1NFSVJMYWJlbC9kZWx0YVZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc3RhbmRhcmQuZWNvcmUjLy9TRUlSTGFiZWwvcHJvYmVWYWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHN0YW5kYXJkLmVjb3JlIy8vU0VJUkxhYmVsL3RlbXBWYWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHN0YW5kYXJkLmVjb3JlIy8vU0VJUkxhYmVsL29yaWdpbmFsVmFsdWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzdGFuZGFyZC5lY29yZSMvL1NFSVJMYWJlbC9lcnJvclNjYWxlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9TRUlSTGFiZWxWYWx1ZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TRUlSTGFiZWxWYWx1ZS9lIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9TSSI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TSS90cmFuc21pc3Npb25SYXRlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TSS9ub25MaW5lYXJpdHlDb2VmZmljaWVudCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vU0kvcmVjb3ZlcnlSYXRlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TSS9pbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzdGFuZGFyZC5lY29yZSMvL1NJL3BoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TSS9yb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vU0kvaW5mZWN0aW91c01vcnRhbGl0eSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vU0kvY2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249InN0YW5kYXJkLmVjb3JlIy8vU0kvZ2V0QWRqdXN0ZWRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJzdGFuZGFyZC5lY29yZSMvL1NJL2dldEFkanVzdGVkSW5mZWN0aW91c01vcnRhbGl0eVJhdGUvdGltZURlbHRhIi8+CisgICAgICA8L2dlbk9wZXJhdGlvbnM+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic3RhbmRhcmQuZWNvcmUjLy9TSS9nZXRBZGp1c3RlZFRyYW5zbWlzc2lvblJhdGUiPgorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ic3RhbmRhcmQuZWNvcmUjLy9TSS9nZXRBZGp1c3RlZFRyYW5zbWlzc2lvblJhdGUvdGltZURlbHRhIi8+CisgICAgICA8L2dlbk9wZXJhdGlvbnM+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic3RhbmRhcmQuZWNvcmUjLy9TSS9nZXRBZGp1c3RlZFJlY292ZXJ5UmF0ZSI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJzdGFuZGFyZC5lY29yZSMvL1NJL2dldEFkanVzdGVkUmVjb3ZlcnlSYXRlL3RpbWVEZWx0YSIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249InN0YW5kYXJkLmVjb3JlIy8vU0kvZ2V0RWZmZWN0aXZlSW5mZWN0aW91cyI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJzdGFuZGFyZC5lY29yZSMvL1NJL2dldEVmZmVjdGl2ZUluZmVjdGlvdXMvbm9kZSIvPgorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ic3RhbmRhcmQuZWNvcmUjLy9TSS9nZXRFZmZlY3RpdmVJbmZlY3Rpb3VzL2Rpc2Vhc2VMYWJlbCIvPgorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ic3RhbmRhcmQuZWNvcmUjLy9TSS9nZXRFZmZlY3RpdmVJbmZlY3Rpb3VzL29uc2l0ZUluZmVjdGlvdXMiLz4KKyAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJzdGFuZGFyZC5lY29yZSMvL1NJL2dldE5vcm1hbGl6ZWRFZmZlY3RpdmVJbmZlY3Rpb3VzIj4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9InN0YW5kYXJkLmVjb3JlIy8vU0kvZ2V0Tm9ybWFsaXplZEVmZmVjdGl2ZUluZmVjdGlvdXMvbm9kZSIvPgorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ic3RhbmRhcmQuZWNvcmUjLy9TSS9nZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cy9kaXNlYXNlTGFiZWwiLz4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9InN0YW5kYXJkLmVjb3JlIy8vU0kvZ2V0Tm9ybWFsaXplZEVmZmVjdGl2ZUluZmVjdGlvdXMvb25zaXRlSW5mZWN0aW91cyIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vU0lEaXNlYXNlTW9kZWxTdGF0ZSIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9TSUluZmVjdG9yIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzdGFuZGFyZC5lY29yZSMvL1NJSW5mZWN0b3IvaW5mZWN0aW91c0NvdW50Ii8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9TSUxhYmVsIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzdGFuZGFyZC5lY29yZSMvL1NJTGFiZWwvZGVsdGFWYWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHN0YW5kYXJkLmVjb3JlIy8vU0lMYWJlbC9wcm9iZVZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc3RhbmRhcmQuZWNvcmUjLy9TSUxhYmVsL3RlbXBWYWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHN0YW5kYXJkLmVjb3JlIy8vU0lMYWJlbC9vcmlnaW5hbFZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc3RhbmRhcmQuZWNvcmUjLy9TSUxhYmVsL2Vycm9yU2NhbGUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJzdGFuZGFyZC5lY29yZSMvL1NJTGFiZWxWYWx1ZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TSUxhYmVsVmFsdWUvaSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vU0lSIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzdGFuZGFyZC5lY29yZSMvL1NJUi9pbW11bml0eUxvc3NSYXRlIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic3RhbmRhcmQuZWNvcmUjLy9TSVIvZ2V0QWRqdXN0ZWRJbW11bml0eUxvc3NSYXRlIj4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9InN0YW5kYXJkLmVjb3JlIy8vU0lSL2dldEFkanVzdGVkSW1tdW5pdHlMb3NzUmF0ZS90aW1lRGVsdGEiLz4KKyAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJzdGFuZGFyZC5lY29yZSMvL1NJUkxhYmVsIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzdGFuZGFyZC5lY29yZSMvL1NJUkxhYmVsL2RlbHRhVmFsdWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzdGFuZGFyZC5lY29yZSMvL1NJUkxhYmVsL3Byb2JlVmFsdWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzdGFuZGFyZC5lY29yZSMvL1NJUkxhYmVsL3RlbXBWYWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHN0YW5kYXJkLmVjb3JlIy8vU0lSTGFiZWwvb3JpZ2luYWxWYWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHN0YW5kYXJkLmVjb3JlIy8vU0lSTGFiZWwvZXJyb3JTY2FsZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vU0lSTGFiZWxWYWx1ZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TSVJMYWJlbFZhbHVlL3IiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJzdGFuZGFyZC5lY29yZSMvL1N0YW5kYXJkRGlzZWFzZU1vZGVsIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzdGFuZGFyZC5lY29yZSMvL1N0YW5kYXJkRGlzZWFzZU1vZGVsL3RvdGFsUG9wdWxhdGlvbkNvdW50Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzdGFuZGFyZC5lY29yZSMvL1N0YW5kYXJkRGlzZWFzZU1vZGVsL3RvdGFsUG9wdWxhdGlvbkNvdW50UmVjaXByb2NhbCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vU3RhbmRhcmREaXNlYXNlTW9kZWwvdG90YWxBcmVhIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZERpc2Vhc2VNb2RlbC9yZWZlcmVuY2VQb3B1bGF0aW9uRGVuc2l0eSIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249InN0YW5kYXJkLmVjb3JlIy8vU3RhbmRhcmREaXNlYXNlTW9kZWwvYWRkVG9Ub3RhbFBvcHVsYXRpb25Db3VudCI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJzdGFuZGFyZC5lY29yZSMvL1N0YW5kYXJkRGlzZWFzZU1vZGVsL2FkZFRvVG90YWxQb3B1bGF0aW9uQ291bnQvcG9wdWxhdGlvbkNvdW50Ii8+CisgICAgICA8L2dlbk9wZXJhdGlvbnM+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZERpc2Vhc2VNb2RlbC9jb21wdXRlVG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZERpc2Vhc2VNb2RlbC9hZGRUb1RvdGFsQXJlYSI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJzdGFuZGFyZC5lY29yZSMvL1N0YW5kYXJkRGlzZWFzZU1vZGVsL2FkZFRvVG90YWxBcmVhL2FyZWEiLz4KKyAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJzdGFuZGFyZC5lY29yZSMvL1N0YW5kYXJkRGlzZWFzZU1vZGVsL2NhbGN1bGF0ZURlbHRhIj4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9InN0YW5kYXJkLmVjb3JlIy8vU3RhbmRhcmREaXNlYXNlTW9kZWwvY2FsY3VsYXRlRGVsdGEvdGltZSIvPgorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ic3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZERpc2Vhc2VNb2RlbC9jYWxjdWxhdGVEZWx0YS90aW1lRGVsdGEiLz4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9InN0YW5kYXJkLmVjb3JlIy8vU3RhbmRhcmREaXNlYXNlTW9kZWwvY2FsY3VsYXRlRGVsdGEvbGFiZWxzIi8+CisgICAgICA8L2dlbk9wZXJhdGlvbnM+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZERpc2Vhc2VNb2RlbC9kb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJzdGFuZGFyZC5lY29yZSMvL1N0YW5kYXJkRGlzZWFzZU1vZGVsL2RvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzL2xhYmVsIi8+CisgICAgICA8L2dlbk9wZXJhdGlvbnM+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJzdGFuZGFyZC5lY29yZSMvL1N0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUvcyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlL2FyZWFSYXRpbyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vU3RhbmRhcmRJbmZlY3RvciIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9TdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwiLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9TYW5pdHlDaGVja2VyIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJzdGFuZGFyZC5lY29yZSMvL0ludGVncmF0aW9uTGFiZWwiLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vSW50ZWdyYXRpb25MYWJlbFZhbHVlIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJzdGFuZGFyZC5lY29yZSMvL0ludGVncmF0aW9uRGVjb3JhdG9yIj4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJzdGFuZGFyZC5lY29yZSMvL0ludGVncmF0aW9uRGVjb3JhdG9yL2lzRGV0ZXJtaW5pc3RpYyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbCIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9BZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzdGFuZGFyZC5lY29yZSMvL0FnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUvY2hpbGRyZW5zTGFiZWxzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9BZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwiLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwiLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TdG9jaGFzdGljRGlzZWFzZU1vZGVsL3NlZWQiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbC9yYW5kb21HZW5lcmF0b3IiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJzdGFuZGFyZC5lY29yZSMvL1N0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwvZ2FpbiIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249InN0YW5kYXJkLmVjb3JlIy8vU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsL2NvbXB1dGVOb2lzZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzdGFuZGFyZC5lY29yZSMvL1NJUklub2N1bGF0b3IiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vU0lSSW5vY3VsYXRvci9pbm9jdWxhdGVkUGVyY2VudGFnZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vU0lSSW5vY3VsYXRvci9pbm9jdWxhdGVQZXJjZW50YWdlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbCIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzdGFuZGFyZC5lY29yZSMvL1N0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbCIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbiI+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIKKyAgICAgICAgICBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc3RhbmRhcmQuZWNvcmUjLy9JbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uL2xpc3QiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzdGFuZGFyZC5lY29yZSMvL0luZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24vaW1wb3J0Rm9sZGVyIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICA8L2dlblBhY2thZ2VzPgorPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9tb2RlbC9zdGFuZGFyZC5lY29yZSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9tb2RlbC9zdGFuZGFyZC5lY29yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjUxNGJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL21vZGVsL3N0YW5kYXJkLmVjb3JlCkBAIC0wLDAgKzEsMjYzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJzdGFuZGFyZCIKKyAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQuZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQiPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsIiBlU3VwZXJUeXBlcz0iIy8vU0VJUiIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbCIgZVN1cGVyVHlwZXM9IiMvL1NJIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbCIgZVN1cGVyVHlwZXM9IiMvL1NJUiIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2Vhc2VNb2RlbCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvbW9kZWwuZWNvcmUjLy9Ob2RlRGVjb3JhdG9yICMvL1Nhbml0eUNoZWNrZXIgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL21vZGlmaWVyLmVjb3JlIy8vTW9kaWZpYWJsZSI+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEFkanVzdGVkQmFja2dyb3VuZE1vcnRhbGl0eVJhdGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InRpbWVEZWx0YSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUxvbmciLz4KKyAgICA8L2VPcGVyYXRpb25zPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbCIgZVR5cGU9IiMvL0Rpc2Vhc2VNb2RlbExhYmVsIi8+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUiIGVUeXBlPSIjLy9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlIi8+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZURpc2Vhc2VNb2RlbFN0YXRlIiBlVHlwZT0iIy8vRGlzZWFzZU1vZGVsU3RhdGUiLz4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZSIgZVR5cGU9IiMvL0Rpc2Vhc2VNb2RlbFN0YXRlIj4KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJkaXNlYXNlTW9kZWxTdGF0ZSIgZVR5cGU9IiMvL0Rpc2Vhc2VNb2RlbFN0YXRlIi8+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZGlzZWFzZU1vZGVsTGFiZWwiIGVUeXBlPSIjLy9EaXNlYXNlTW9kZWxMYWJlbCIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImluaXRpYWxpemVEaXNlYXNlU3RhdGUiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImRpc2Vhc2VNb2RlbExhYmVsIiBlVHlwZT0iIy8vRGlzZWFzZU1vZGVsTGFiZWwiLz4KKyAgICA8L2VPcGVyYXRpb25zPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVJbmZlY3RvciIgZVR5cGU9IiMvL0luZmVjdG9yIi8+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEFkanVzdGVkQmFja2dyb3VuZEJpcnRoUmF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VEb3VibGUiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InRpbWVEZWx0YSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VMb25nIi8+CisgICAgPC9lT3BlcmF0aW9ucz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFja2dyb3VuZE1vcnRhbGl0eVJhdGUiCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjUuNUUtNSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3B1bGF0aW9uSWRlbnRpZmllciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iaHVtYW4iLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGltZVBlcmlvZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUxvbmciCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ijg2NDAwMDAwIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc2Vhc2VOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbGF0aXZlVG9sZXJhbmNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIxRS05Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbml0ZURpZmZlcmVuY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZyZXF1ZW5jeURlcGVuZGVudCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFja2dyb3VuZEJpcnRoUmF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VEb3VibGUiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjUuNUUtNSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNlYXNlTW9kZWxMYWJlbCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUjLy9EeW5hbWljTm9kZUxhYmVsIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9wdWxhdGlvbkxhYmVsIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvbW9kZWwvbGFiZWxzLmVjb3JlIy8vUG9wdWxhdGlvbkxhYmVsIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpc2Vhc2VNb2RlbFN0YXRlIiBlVHlwZT0iIy8vRGlzZWFzZU1vZGVsU3RhdGUiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIGVPcHBvc2l0ZT0iIy8vRGlzZWFzZU1vZGVsU3RhdGUvbGFiZWwiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9wdWxhdGlvbk1vZGVsTGFiZWwiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL21vZGVsL3N0YW5kYXJkLmVjb3JlIy8vUG9wdWxhdGlvbk1vZGVsTGFiZWwiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSIgYWJzdHJhY3Q9InRydWUiCisgICAgICBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2dyYXBoLmVjb3JlIy8vTGFiZWxWYWx1ZSAjLy9JbnRlZ3JhdGlvbkxhYmVsVmFsdWUiPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXQiIGVUeXBlPSIjLy9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlIj4KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJ2YWx1ZSIgZVR5cGU9IiMvL0Rpc2Vhc2VNb2RlbExhYmVsVmFsdWUiLz4KKyAgICA8L2VPcGVyYXRpb25zPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGQiIGVUeXBlPSIjLy9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlIj4KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJ2YWx1ZSIgZVR5cGU9IiMvL0Rpc2Vhc2VNb2RlbExhYmVsVmFsdWUiLz4KKyAgICA8L2VPcGVyYXRpb25zPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzdWIiIGVUeXBlPSIjLy9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlIj4KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJ2YWx1ZSIgZVR5cGU9IiMvL0Rpc2Vhc2VNb2RlbExhYmVsVmFsdWUiLz4KKyAgICA8L2VPcGVyYXRpb25zPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzY2FsZSIgZVR5cGU9IiMvL0Rpc2Vhc2VNb2RlbExhYmVsVmFsdWUiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InNjYWxlRmFjdG9yIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIi8+CisgICAgPC9lT3BlcmF0aW9ucz4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iemVyb091dFBvcHVsYXRpb25Db3VudCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkaXNlYXNlRGVhdGhzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIwIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvcHVsYXRpb25Db3VudCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5jaWRlbmNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2Vhc2VNb2RlbFN0YXRlIiBhYnN0cmFjdD0idHJ1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxhYmVsIiBlVHlwZT0iIy8vRGlzZWFzZU1vZGVsTGFiZWwiCisgICAgICAgIGVPcHBvc2l0ZT0iIy8vRGlzZWFzZU1vZGVsTGFiZWwvZGlzZWFzZU1vZGVsU3RhdGUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW5mZWN0b3IiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL21vZGVsLmVjb3JlIy8vTm9kZURlY29yYXRvciAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvbW9kaWZpZXIuZWNvcmUjLy9Nb2RpZmlhYmxlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlzZWFzZU1vZGVsIiBlVHlwZT0iIy8vU3RhbmRhcmREaXNlYXNlTW9kZWwiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFyZ2V0VVJJIiBlVHlwZT0iIy8vVVJJIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc2Vhc2VOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldElTT0tleSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsYWJlbHNUb0luZmVjdCIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9EaXNlYXNlTW9kZWxMYWJlbCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3B1bGF0aW9uSWRlbnRpZmllciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbmZlY3RQZXJjZW50YWdlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUJvb2xlYW4iCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNFSVIiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vU0lSIj4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0QWRqdXN0ZWRJbmN1YmF0aW9uUmF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSI+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0idGltZURlbHRhIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTG9uZyIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluY3ViYXRpb25SYXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIwLjAiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU0VJUkxhYmVsIiBlU3VwZXJUeXBlcz0iIy8vU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbHRhVmFsdWUiIGVUeXBlPSIjLy9TRUlSTGFiZWxWYWx1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9iZVZhbHVlIiBlVHlwZT0iIy8vU0VJUkxhYmVsVmFsdWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVtcFZhbHVlIiBlVHlwZT0iIy8vU0VJUkxhYmVsVmFsdWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3JpZ2luYWxWYWx1ZSIgZVR5cGU9IiMvL1NFSVJMYWJlbFZhbHVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVycm9yU2NhbGUiIGVUeXBlPSIjLy9TRUlSTGFiZWxWYWx1ZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTRUlSTGFiZWxWYWx1ZSIgZVN1cGVyVHlwZXM9IiMvL1NJUkxhYmVsVmFsdWUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNJIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1N0YW5kYXJkRGlzZWFzZU1vZGVsIj4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0QWRqdXN0ZWRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSI+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0idGltZURlbHRhIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTG9uZyIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEFkanVzdGVkVHJhbnNtaXNzaW9uUmF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSI+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0idGltZURlbHRhIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTG9uZyIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEFkanVzdGVkUmVjb3ZlcnlSYXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIj4KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJ0aW1lRGVsdGEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VMb25nIi8+CisgICAgPC9lT3BlcmF0aW9ucz4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RWZmZWN0aXZlSW5mZWN0aW91cyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSI+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibm9kZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUjLy9Ob2RlIi8+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZGlzZWFzZUxhYmVsIiBlVHlwZT0iIy8vU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCIvPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im9uc2l0ZUluZmVjdGlvdXMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiLz4KKyAgICA8L2VPcGVyYXRpb25zPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSI+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibm9kZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUjLy9Ob2RlIi8+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZGlzZWFzZUxhYmVsIiBlVHlwZT0iIy8vU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCIvPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im9uc2l0ZUluZmVjdGlvdXMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiLz4KKyAgICA8L2VPcGVyYXRpb25zPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0cmFuc21pc3Npb25SYXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIwLjAiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9uTGluZWFyaXR5Q29lZmZpY2llbnQiCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjEuMCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWNvdmVyeVJhdGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjAuMCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMC4wIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIwLjA1Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24iCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjAuMDEiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5mZWN0aW91c01vcnRhbGl0eSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VEb3VibGUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VEb3VibGUiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjIuMjUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU0lEaXNlYXNlTW9kZWxTdGF0ZSIgZVN1cGVyVHlwZXM9IiMvL1N0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTSUluZmVjdG9yIiBlU3VwZXJUeXBlcz0iIy8vU3RhbmRhcmRJbmZlY3RvciI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluZmVjdGlvdXNDb3VudCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTSUxhYmVsIiBlU3VwZXJUeXBlcz0iIy8vU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbHRhVmFsdWUiIGVUeXBlPSIjLy9TSUxhYmVsVmFsdWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvYmVWYWx1ZSIgZVR5cGU9IiMvL1NJTGFiZWxWYWx1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZW1wVmFsdWUiIGVUeXBlPSIjLy9TSUxhYmVsVmFsdWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3JpZ2luYWxWYWx1ZSIgZVR5cGU9IiMvL1NJTGFiZWxWYWx1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlcnJvclNjYWxlIiBlVHlwZT0iIy8vU0lMYWJlbFZhbHVlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNJTGFiZWxWYWx1ZSIgZVN1cGVyVHlwZXM9IiMvL1N0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU0lSIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1NJIj4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0QWRqdXN0ZWRJbW11bml0eUxvc3NSYXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIj4KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJ0aW1lRGVsdGEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VMb25nIi8+CisgICAgPC9lT3BlcmF0aW9ucz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW1tdW5pdHlMb3NzUmF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMC4wIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNJUkxhYmVsIiBlU3VwZXJUeXBlcz0iIy8vU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbHRhVmFsdWUiIGVUeXBlPSIjLy9TSVJMYWJlbFZhbHVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2JlVmFsdWUiIGVUeXBlPSIjLy9TSVJMYWJlbFZhbHVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlbXBWYWx1ZSIgZVR5cGU9IiMvL1NJUkxhYmVsVmFsdWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3JpZ2luYWxWYWx1ZSIgZVR5cGU9IiMvL1NJUkxhYmVsVmFsdWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXJyb3JTY2FsZSIgZVR5cGU9IiMvL1NJUkxhYmVsVmFsdWUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU0lSTGFiZWxWYWx1ZSIgZVN1cGVyVHlwZXM9IiMvL1NJTGFiZWxWYWx1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RhbmRhcmREaXNlYXNlTW9kZWwiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgZVN1cGVyVHlwZXM9IiMvL0Rpc2Vhc2VNb2RlbCAjLy9JbnRlZ3JhdGlvbkRlY29yYXRvciI+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZFRvVG90YWxQb3B1bGF0aW9uQ291bnQiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBvcHVsYXRpb25Db3VudCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImNvbXB1dGVUb3RhbFBvcHVsYXRpb25Db3VudFJlY2lwcm9jYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiLz4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iYWRkVG9Ub3RhbEFyZWEiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImFyZWEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiLz4KKyAgICA8L2VPcGVyYXRpb25zPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjYWxjdWxhdGVEZWx0YSI+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0idGltZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvbW9kZWwuZWNvcmUjLy9TVEVNVGltZSIvPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InRpbWVEZWx0YSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VMb25nIi8+CisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibGFiZWxzIj4KKyAgICAgICAgPGVHZW5lcmljVHlwZSBlQ2xhc3NpZmllcj0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUVMaXN0Ij4KKyAgICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUjLy9EeW5hbWljTGFiZWwiLz4KKyAgICAgICAgPC9lR2VuZXJpY1R5cGU+CisgICAgICA8L2VQYXJhbWV0ZXJzPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzIj4KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJsYWJlbCIgZVR5cGU9IiMvL1N0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvdGFsUG9wdWxhdGlvbkNvdW50IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIwIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvdGFsUG9wdWxhdGlvbkNvdW50UmVjaXByb2NhbCIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIgY2hhbmdlYWJsZT0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG90YWxBcmVhIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIwIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmVyZW5jZVBvcHVsYXRpb25EZW5zaXR5IgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIxMDAiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCIgYWJzdHJhY3Q9InRydWUiCisgICAgICBlU3VwZXJUeXBlcz0iIy8vRGlzZWFzZU1vZGVsTGFiZWwgIy8vSW50ZWdyYXRpb25MYWJlbCIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSIgYWJzdHJhY3Q9InRydWUiCisgICAgICBlU3VwZXJUeXBlcz0iIy8vRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZSIgYWJzdHJhY3Q9InRydWUiCisgICAgICBlU3VwZXJUeXBlcz0iIy8vRGlzZWFzZU1vZGVsU3RhdGUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcmVhUmF0aW8iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RhbmRhcmRJbmZlY3RvciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9JbmZlY3RvciIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsIiBlU3VwZXJUeXBlcz0iIy8vU0VJUiAjLy9TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwiIGVTdXBlclR5cGVzPSIjLy9TSSAjLy9TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsIiBlU3VwZXJUeXBlcz0iIy8vU0lSICMvL1N0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNhbml0eUNoZWNrZXIiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIiCisgICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW50ZWdyYXRpb25MYWJlbCIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsIgorICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkludGVncmF0aW9uTGFiZWxWYWx1ZSIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsVmFsdWUiCisgICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW50ZWdyYXRpb25EZWNvcmF0b3IiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3IiCisgICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNEZXRlcm1pbmlzdGljIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUJvb2xlYW4iLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbCIgZVN1cGVyVHlwZXM9IiMvL1NJIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZSIgZVN1cGVyVHlwZXM9IiMvL0Rpc2Vhc2VNb2RlbFN0YXRlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hpbGRyZW5zTGFiZWxzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL1NJTGFiZWwiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsIiBlU3VwZXJUeXBlcz0iIy8vQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCIgZVN1cGVyVHlwZXM9IiMvL0FnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdG9jaGFzdGljRGlzZWFzZU1vZGVsIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgIGVTdXBlclR5cGVzPSIjLy9EaXNlYXNlTW9kZWwiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTG9uZyIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYW5kb21HZW5lcmF0b3IiIGVUeXBlPSIjLy9SYW5kb20iCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIwIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCIgYWJzdHJhY3Q9InRydWUiCisgICAgICBlU3VwZXJUeXBlcz0iIy8vU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCI+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImNvbXB1dGVOb2lzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnYWluIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIwLjAxIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNJUklub2N1bGF0b3IiIGVTdXBlclR5cGVzPSIjLy9TSUluZmVjdG9yIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5vY3VsYXRlZFBlcmNlbnRhZ2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjEiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5vY3VsYXRlUGVyY2VudGFnZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VCb29sZWFuIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVSSSIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJFTGlzdCIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdCIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlJhbmRvbSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5SYW5kb20iLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsIiBlU3VwZXJUeXBlcz0iIy8vU0kiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbCIgZVN1cGVyVHlwZXM9IiMvL1NJUiIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbCIgZVN1cGVyVHlwZXM9IiMvL1NFSVIiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL21vZGVsLmVjb3JlIy8vTm9kZURlY29yYXRvciAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvbW9kaWZpZXIuZWNvcmUjLy9Nb2RpZmlhYmxlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGlzdCIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9JbmZlY3RvciIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW1wb3J0Rm9sZGVyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9ub3RpY2UuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9ub3RpY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFmOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL25vdGljZS5odG1sCkBAIC0wLDAgKzEsNzkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+TWFyY2ggMTcsIDIwMDU8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorICAgCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCisgICAKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUworICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisgICAKKzx1bD4KKwk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4gICAKKyAKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKwk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCQkKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKwk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKKwk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorICAgCis8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWJjYzA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3BsdWdpbi5wcm9wZXJ0aWVzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzYWY2MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsMTQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgorCis8IS0tCisgPGNvcHlyaWdodD4KKyA8L2NvcHlyaWdodD4KKworICRJZCQKKy0tPgorCis8cGx1Z2luPgorICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZGlzZWFzZSIgbmFtZT0iJUVQX0Rpc2Vhc2UiIHNjaGVtYT0ic2NoZW1hL2Rpc2Vhc2UuZXhzZCIvPgorICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZGlzZWFzZW1vZGVsIiBuYW1lPSIlRVBfRGlzZWFzZV9Nb2RlbCIgc2NoZW1hPSJzY2hlbWEvZGlzZWFzZW1vZGVsLmV4c2QiLz4KKyAgICAKKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQuaXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcmllcyI+CisgICAgPGZhY3RvcnkgCisgICAgICAgdXJpID0gImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkLmVjb3JlIiAKKyAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIgCisgICAgICAgc3VwcG9ydGVkVHlwZXMgPSAKKyAgICAgICAgICJvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcgorICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcgorICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcgorICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcgorICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UiIC8+CisgIDwvZXh0ZW5zaW9uPgorCisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+CisgICAgPHBhY2thZ2UKKyAgICAgICB1cmkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQuZWNvcmUiCisgICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSIKKyAgICAgICBnZW5Nb2RlbCA9ICJtb2RlbC9kaXNlYXNlbW9kZWxzLmdlbm1vZGVsIiAvPiAKKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5kaXNlYXNlbW9kZWwiPgorICAgICA8Y2xhc3NkZWYgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbEltcGwiLz4KKyAgICAgPGR1Ymxpbl9jb3JlCisgICAgICAgICAgIGNhdGVnb3J5X2lkPSIvIgorICAgICAgICAgICBjcmVhdG9yPSIlZGNfY3JlYXRvcl9kYWZvcmQiCisgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlZGNfZGVzY19EX1NJIgorICAgICAgICAgICBpZGVudGlmaWVyPSJmb28iCisgICAgICAgICAgIHRpdGxlPSIlZGNfZGVzY19EX1NJIi8+CisgIDwvZXh0ZW5zaW9uPgorICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZGlzZWFzZW1vZGVsIj4KKyAgICAgPGNsYXNzZGVmIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbEltcGwiLz4KKyAgICAgPGR1Ymxpbl9jb3JlCisgICAgICAgICAgIGNhdGVnb3J5X2lkPSIvIgorICAgICAgICAgICBjcmVhdG9yPSIlZGNfY3JlYXRvcl9kYWZvcmQiCisgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlZGNfZGVzY19EX1NFSVIiCisgICAgICAgICAgIGlkZW50aWZpZXI9ImZvbyIKKyAgICAgICAgICAgdGl0bGU9IiVkY19kZXNjX0RfU0VJUiIvPgorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmRpc2Vhc2Vtb2RlbCI+CisgICAgIDxjbGFzc2RlZiBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwiLz4KKyAgICAgPGR1Ymxpbl9jb3JlCisgICAgICAgICAgIGNhdGVnb3J5X2lkPSIvIgorICAgICAgICAgICBjcmVhdG9yPSIlZGNfY3JlYXRvcl9kYWZvcmQiCisgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlZGNfZGVzY19EX1NJUiIKKyAgICAgICAgICAgaWRlbnRpZmllcj0iZm9vIgorICAgICAgICAgICB0aXRsZT0iJWRjX2Rlc2NfRF9TSVIiLz4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5kaXNlYXNlbW9kZWwiPgorICAgICA8Y2xhc3NkZWYKKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsSW1wbCI+CisgICAgIDwvY2xhc3NkZWY+CisgICAgIDxkdWJsaW5fY29yZQorICAgICAgICAgICBjcmVhdG9yPSIlZGNfY3JlYXRvcl9rYXVmbWFuIgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWRjX2Rlc2NfU19TRUlSIgorICAgICAgICAgICBpZGVudGlmaWVyPSJmb28iCisgICAgICAgICAgIHRpdGxlPSIlZGNfZGVzY19TX1NFSVIiPgorICAgICA8L2R1Ymxpbl9jb3JlPgorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmRpc2Vhc2Vtb2RlbCI+CisgICAgIDxjbGFzc2RlZgorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwiPgorICAgICA8L2NsYXNzZGVmPgorICAgICA8ZHVibGluX2NvcmUKKyAgICAgICAgICAgY3JlYXRvcj0iJWRjX2NyZWF0b3Jfa2F1Zm1hbiIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IiVkY19kZXNjX1NfU0lSIgorICAgICAgICAgICBpZGVudGlmaWVyPSJmb28iCisgICAgICAgICAgIHRpdGxlPSIlZGNfZGVzY19TX1NJUiI+CisgICAgIDwvZHVibGluX2NvcmU+CisgIDwvZXh0ZW5zaW9uPgorICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZGlzZWFzZW1vZGVsIj4KKyAgICAgPGNsYXNzZGVmCisgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxJbXBsIj4KKyAgICAgPC9jbGFzc2RlZj4KKyAgICAgPGR1Ymxpbl9jb3JlCisgICAgICAgICAgIGNyZWF0b3I9IiVkY19jcmVhdG9yX2thdWZtYW4iCisgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlZGNfZGVzY19TX1NJIgorICAgICAgICAgICBpZGVudGlmaWVyPSJmb28iCisgICAgICAgICAgIHRpdGxlPSIlZGNfZGVzY19TX1NJIj4KKyAgICAgPC9kdWJsaW5fY29yZT4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5kaXNlYXNlbW9kZWwiPgorICAgICA8Y2xhc3NkZWYKKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWxJbXBsIj4KKyAgICAgPC9jbGFzc2RlZj4KKyAgICAgPGR1Ymxpbl9jb3JlCisgICAgICAgICAgIGNyZWF0b3I9IiVkY19jcmVhdG9yX2VkbHVuZCIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IiVkY19kZXNjX1NfU0kiCisgICAgICAgICAgIGlkZW50aWZpZXI9ImZvbyIKKyAgICAgICAgICAgdGl0bGU9IiVkY19kZXNjX1NfU0kiPgorICAgICA8L2R1Ymxpbl9jb3JlPgorICA8L2V4dGVuc2lvbj4KKyAgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5kaXNlYXNlbW9kZWwiPgorICAgICA8Y2xhc3NkZWYKKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsSW1wbCI+CisgICAgIDwvY2xhc3NkZWY+CisgICAgIDxkdWJsaW5fY29yZQorICAgICAgICAgICBjcmVhdG9yPSIlZGNfY3JlYXRvcl9lZGx1bmQiCisgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlZGNfZGVzY19TX1NJIgorICAgICAgICAgICBpZGVudGlmaWVyPSJmb28iCisgICAgICAgICAgIHRpdGxlPSIlZGNfZGVzY19TX1NJIj4KKyAgICAgPC9kdWJsaW5fY29yZT4KKyAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZGlzZWFzZW1vZGVsIj4KKyAgICAgPGNsYXNzZGVmCisgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWxJbXBsIj4KKyAgICAgPC9jbGFzc2RlZj4KKyAgICAgPGR1Ymxpbl9jb3JlCisgICAgICAgICAgIGNyZWF0b3I9IiVkY19jcmVhdG9yX2VkbHVuZCIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IiVkY19kZXNjX1NfU0kiCisgICAgICAgICAgIGlkZW50aWZpZXI9ImZvbyIKKyAgICAgICAgICAgdGl0bGU9IiVkY19kZXNjX1NfU0kiPgorICAgICA8L2R1Ymxpbl9jb3JlPgorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KKyAgICAgPGluaXRpYWxpemVyCisgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUluaXRpYWxpemVyIj4KKyAgICAgPC9pbml0aWFsaXplcj4KKyAgPC9leHRlbnNpb24+CisKKzwvcGx1Z2luPgorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc2NoZW1hL2Rpc2Vhc2UuZXhzZCBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zY2hlbWEvZGlzZWFzZS5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZGNkZWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc2NoZW1hL2Rpc2Vhc2UuZXhzZApAQCAtMCwwICsxLDk1IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscyIgaWQ9ImRpc2Vhc2UiIG5hbWU9IlNURU0gRGlzZWFzZSBEZWZpbml0aW9uIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc2NoZW1hL3N0ZW1fY2F0ZWdvcnkuZXhzZCIvPgorCisgICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ic2NoZW1hOi8vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL3NjaGVtYS9kdWJsaW5fY29yZS5leHNkIi8+CisKKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9InN0ZW1fY2F0ZWdvcnkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZHVibGluX2NvcmUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIAorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zY2hlbWEvZGlzZWFzZW1vZGVsLmV4c2QgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc2NoZW1hL2Rpc2Vhc2Vtb2RlbC5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOTViOTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc2NoZW1hL2Rpc2Vhc2Vtb2RlbC5leHNkCkBAIC0wLDAgKzEsMTA4IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscyIgaWQ9ImRpc2Vhc2Vtb2RlbCIgbmFtZT0iU1RFTSBEaXNlYXNlIE1vZGVsIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc2NoZW1hL2R1Ymxpbl9jb3JlLmV4c2QiLz4KKworICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2xhc3NkZWYiLz4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZHVibGluX2NvcmUiLz4KKyAgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NkZWYiPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPgorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbEltcGw6b3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCIvPgorICAgICAgICAgICAgICAgPC9hcHBJbmZvPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvQWN0aXZhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDcxM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSwxNTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdGFuZGFyZEhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdGFuZGFyZFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworLyoqCisgKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKKyAqLworcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4geworCisJLyoqCisJICogVGhlIHBsdWctaW4gSUQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBDb25zdGFudHMuSURfUk9PVCArICIuZGlzZWFzZW1vZGVscyI7CisKKwkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCisJcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsKKworCS8qKgorCSAqIFRoZSBjb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBBY3RpdmF0b3IoKSB7CisJCXBsdWdpbiA9IHRoaXM7CisJfQorCisJLyoqCisJICogQHBhcmFtIGNvbnRleHQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCQkvLyBXZSBjcmVhdGUgdGhlc2UgaW5zdGFuY2VzIHNvIHRoYXQgdGhlaXIgY29uc3RydWN0b3JzIHJ1biBhbmQgdGhleQorCQkvLyB0aGVuIGFkZCB0aGVtc2VsdmVzIHRvIGEgY29sbGVjdGlvbiBvZiBmYWN0b3JpZXMgbWFpbnRhaW5lZCBieSB0aGUKKwkJLy8gZmFjdG9yeSBpbnRlcmZhY2VzIHRoZXkgaW1wbGVtZW50IHJlc3BlY3RpdmVseS4KKwkJCisJCS8vIEFkZCB0byBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQluZXcgU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOworCQkKKwkJLy8gQWRkIHRvIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQluZXcgU3RhbmRhcmRSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKKwkJCisJCS8vIEFkZCB0byBIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQluZXcgU3RhbmRhcmRIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOworCX0gLy8gc3RhcnQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcGx1Z2luID0gbnVsbDsKKwkJc3VwZXIuc3RvcChjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKworCS8qKgorCSAqIExvZyBhbiBlcnJvciB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4KKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqICAgICAgICAgICAgdGhlIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIHRleHQKKwkgKiBAcGFyYW0gZXhjZXB0aW9uCisJICogICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJLy8gUnVubmluZyBhcyBhIHBsdWdpbj8KKwkJaWYgKHBsdWdpbiAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXBsdWdpbi5nZXRMb2coKS5sb2coCisJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luLmdldEJ1bmRsZSgpCisJCQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLCAwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKKwkJfSBlbHNlIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKKwkJCS8vIEV4Y2VwdGlvbj8KKwkJCWlmIChleGNlcHRpb24gIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCVN5c3RlbS5lcnIucHJpbnRsbihleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKKwkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworCQkJfQorCQl9CisKKwl9IC8vIGxvZ0Vycm9yCisKKwkvKioKKwkgKiBMb2cgaW5mb3JtYXRpb24gdG8gdGhlIElMb2cgZm9yIHRoaXMgcGx1Z2luCisJICogCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiAgICAgICAgICAgIHRoZSBsb2NhbGl6ZWQgaW5mb3JtYXRpb24gbWVzc2FnZSB0ZXh0CisJICogQHBhcmFtIGV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgdGhlIGFzc29jaWF0ZWQgZXhjZXB0aW9uLCBvciBudWxsCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0luZm9ybWF0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisJCS8vIERvIHdlIGhhdmUgYSBwbHVnaW4/CisJCWlmIChwbHVnaW4gIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlwbHVnaW4uZ2V0TG9nKCkubG9nKAorCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAorCQkJCQkJCTAsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOworCQl9CisJCWVsc2UgeworCQkJLy8gTm8KKwkJCVN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKKwkJCS8vIEV4Y2VwdGlvbj8KKwkJCWlmIChleGNlcHRpb24gIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCVN5c3RlbS5vdXQucHJpbnRsbihleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKKwkJCX0gLy8gaWYgCisJCX0KKwl9IC8vIGxvZ0luZm9ybWF0aW9uCisJCisJCisJLyoqCisJICogTG9nIGluZm9ybWF0aW9uIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgorCSAqIFRoZSBtZXRob2QgaXMgb3ZlcmxvYWRlZCB0byBhbGxvdyBmb3IgbG9nSW5mb3JtYXRpb24gd2l0aG91dCBhbiBlcnJvciAKKwkgKiBtZXRob2Qgc2V0cyB0aGUgZXJyb3IgdG8gbnVsbC4gVGhpcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIFN5c3RlbS5vdXQucHJpbnRsbgorCSAqIHRocm91Z2hvdXQgdGhlIGNvZGUuCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiAgICAgICAgICAgIHRoZSBsb2NhbGl6ZWQgaW5mb3JtYXRpb24gbWVzc2FnZSB0ZXh0CisJICoKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW5mb3JtYXRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKwkJLy8gRG8gd2UgaGF2ZSBhIHBsdWdpbj8KKwkJaWYgKHBsdWdpbiAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXBsdWdpbi5nZXRMb2coKS5sb2coCisJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCisJCQkJCQkJMCwgbWVzc2FnZSwgbnVsbCkpOworCQl9CisJCWVsc2UgeworCQkJLy8gTm8KKwkJCVN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKKwkJfQorCX0gLy8gbG9nSW5mb3JtYXRpb24KKwkKK30gLy8gQWN0aXZhdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9Db25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZTNiNDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvLyBDb25zdGFudHMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyB0aGF0IGFyZSBzaWduaWZpY2FudCB0byB0aGUgU1RFTSBkaXNlYXNlCisgKiBtb2RlbCBkZWZpbml0aW9ucy4KKyAqLworcHVibGljIGludGVyZmFjZSBDb25zdGFudHMgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgZXh0ZW5zaW9uIHBvaW50IGlkIGZvciB0aGUgImRpc2Vhc2UgbW9kZWwiIGV4dGVuc2lvbiBwb2ludC4gQQorCSAqIHtAbGluayBEaXNlYXNlTW9kZWx9IGRlZmluZXMgdGhlIHVuZGVybHlpbmcgY29tcHV0YXRpb25hbCBtb2RlbCBmb3IgaG93IGEKKwkgKiBkaXNlYXNlIHByb3BhZ2F0ZXMuCisJICoge0B2YWx1ZX0KKwkgKi8KKwlTdHJpbmcgSURfRElTRUFTRV9NT0RFTF9FWFRFTlNJT05fUE9JTlQgPSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29uc3RhbnRzLklEX1JPT1QKKwkrICIuZGlzZWFzZW1vZGVscy5kaXNlYXNlbW9kZWwiOworCisJCisJLyoqCisJICogVGhpcyBpcyB0aGUgZXh0ZW5zaW9uIHBvaW50IGlkIGZvciB0aGUgImRpc2Vhc2UiIGV4dGVuc2lvbiBwb2ludC4KKwkgKiB7QHZhbHVlfQorCSAqLworCVN0cmluZyBJRF9ESVNFQVNFX0VYVEVOU0lPTl9QT0lOVCA9IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHMuSURfUk9PVAorCQkJKyAiLmRpc2Vhc2Vtb2RlbHMuZGlzZWFzZSI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBlbGVtZW50IGluIGEKKwkgKiA8Y29kZT5Db25maWd1cmF0aW9uRWxlbWVudDwvY29kZT4gdGhhdCBzcGVjaWZpZXMgdGhlIG5hbWUgYW5kCisJICogaW1wbGVtZW50aW5nIGNsYXNzIGZvciBTVEVNICJkaXNlYXNlIG1vZGVscyIuCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29uc3RhbnRzI0VYRUNVVEFCTEVfTkFNRV9BVFRSSUJVVEUKKwkgKi8KKwlTdHJpbmcgRElTRUFTRV9NT0RFTF9FTEVNRU5UID0gImNsYXNzZGVmIjsKKworfSAvLyBDb25zdGFudHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL0FnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL0FnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjRjMjc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8vIEFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiBhbiBhZ2dyZWdhdGUgZGlzZWFzZSBtb2RlbCBhdCBhIGxhYmVsLgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlIGV4dGVuZHMgRGlzZWFzZU1vZGVsU3RhdGUgeworCisJLyoqCisJICogQHJldHVybiB0aGUgZGlzZWFzZSBtb2RlbCBsYWJlbHMgd2hvc2UgdmFsdWVzIGFyZSB0byBiZSBhZ2dyZWdhdGVkCisJICogQG1vZGVsIHR5cGU9IlNJTGFiZWwiIGNvbnRhaW5tZW50PSJmYWxzZSIKKwkgKi8KKwlFTGlzdDxTSUxhYmVsPiBnZXRDaGlsZHJlbnNMYWJlbHMoKTsKKworfSAvLyBBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9BZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL0FnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YjYxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9BZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwuamF2YQpAQCAtMCwwICsxLDM4IEBACisvLyBBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgYW4gYWdncmVnYXRpbmcgU0VJUgorICogZGlzZWFzZSBtb2RlbC4gVGhpcyBkaXNlYXNlIG1vZGVsIGRldGVybWluZXMgaXRzIGRpc2Vhc2Ugc3RhdGUgdmFsdWVzIGJ5CisgKiBzdW1taW5nIChhZ2dyZWdhdGluZykgdGhlIChuZXh0KSB2YWx1ZXMgb2YgdGhlIGxhYmVscyBvZiBvdGhlciBTRUlSIGRpc2Vhc2UKKyAqIG1vZGVscy4gVHlwaWNhbGx5LCBpdCBpcyBwbGFjZWQgaW4gYSBtb2RlbCB0aGF0IGNvbnRhaW5zIHRoZSB0YXJnZXQgU0VJUgorICogZGlzZWFzZSBtb2RlbCBzbyB0aGF0IGl0cworICoge0BsaW5rIERlY29yYXRvciN1cGRhdGVMYWJlbHMob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lLCBsb25nKX0KKyAqIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgY29udGFpbmVkIGRpc2Vhc2UgbW9kZWwuIFRoaXMgZW5zdXJlcyB0aGF0CisgKiB0aGUgIm5leHQiIHZhbHVlcyB0aGF0IHRoaXMgbW9kZWwgY29sbGVjdHMgd2lsbCBiZSB2YWxpZCBieSB0aGUgdGltZSBpdCBydW5zLgorICogCisgKiBAc2VlIFNFSVJMYWJlbAorICogQHNlZSBTRUlSTGFiZWxWYWx1ZQorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwgZXh0ZW5kcyBBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCB7CisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VnbWVudCBvZiB0aGUgdHlwZSBVUkkgdGhhdCBwcmVmaXhlcyBhbGwgb3RoZXIgc2VnbWVudHMgaW4gYQorCSAqIHN0YW5kYXJkIHN0b2NoYXN0aWMgU0VJUiBkaXNlYXNlIG1vZGVsIHR5cGUgVVJJLgorCSAqLworCVN0cmluZyBVUklfVFlQRV9BR0dSRUdBVElOR19TRUlSX0RJU0VBU0VfTU9ERUxfU0VHTUVOVCA9IFVSSV9UWVBFX0FHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfU0VHTUVOVAorCQkJKyAiL1NFSVIiOworfSAvLyBBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL0FnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL0FnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmE0ZmMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8vIEFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgYW4gYWdncmVnYXRpbmcgU0kgZGlzZWFzZQorICogbW9kZWwuIFRoaXMgZGlzZWFzZSBtb2RlbCBkZXRlcm1pbmVzIGl0cyBkaXNlYXNlIHN0YXRlIHZhbHVlcyBieSBzdW1taW5nCisgKiAoYWdncmVnYXRpbmcpIHRoZSAobmV4dCkgdmFsdWVzIG9mIHRoZSBsYWJlbHMgb2Ygb3RoZXIgU0kgZGlzZWFzZSBtb2RlbHMuCisgKiBUeXBpY2FsbHksIGl0IGlzIHBsYWNlZCBpbiBhIG1vZGVsIHRoYXQgY29udGFpbnMgdGhlIHRhcmdldCBTSSBkaXNlYXNlIG1vZGVsCisgKiBzbyB0aGF0IGl0cworICoge0BsaW5rIERlY29yYXRvciN1cGRhdGVMYWJlbHMob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lLCBsb25nKX0KKyAqIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgY29udGFpbmVkIGRpc2Vhc2UgbW9kZWwuIFRoaXMgZW5zdXJlcyB0aGF0CisgKiB0aGUgIm5leHQiIHZhbHVlcyB0aGF0IHRoaXMgbW9kZWwgY29sbGVjdHMgd2lsbCBiZSB2YWxpZCBieSB0aGUgdGltZSBpdCBydW5zLgorICogCisgKiBAc2VlIFNJTGFiZWwKKyAqIEBzZWUgU0lMYWJlbFZhbHVlCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIEFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwgZXh0ZW5kcyBTSSB7CisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VnbWVudCBvZiB0aGUgdHlwZSBVUkkgdGhhdCBwcmVmaXhlcyBhbGwgb3RoZXIgc2VnbWVudHMgaW4gYQorCSAqIHN0YW5kYXJkIHN0b2NoYXN0aWMgU0kgZGlzZWFzZSBtb2RlbCB0eXBlIFVSSS4KKwkgKi8KKwlTdHJpbmcgVVJJX1RZUEVfQUdHUkVHQVRJTkdfU0lfRElTRUFTRV9NT0RFTF9TRUdNRU5UID0gVVJJX1RZUEVfU1RBTkRBUkRfU0lfRElTRUFTRV9NT0RFTF9TRUdNRU5UCisJCQkrICIvYWdncmVnYXRpbmciOworfSAvLyBBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9BZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTFjOTkyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwuamF2YQpAQCAtMCwwICsxLDM4IEBACisvLyBBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgY2xhc3MgaW4gYW4gRU1GIG1vZGVsIGZvciBhbiBhZ2dyZWdhdGluZyBTSVIgZGlzZWFzZQorICogbW9kZWwuIFRoaXMgZGlzZWFzZSBtb2RlbCBkZXRlcm1pbmVzIGl0cyBkaXNlYXNlIHN0YXRlIHZhbHVlcyBieSBzdW1taW5nCisgKiAoYWdncmVnYXRpbmcpIHRoZSAobmV4dCkgdmFsdWVzIG9mIHRoZSBsYWJlbHMgb2Ygb3RoZXIgU0lSIGRpc2Vhc2UgbW9kZWxzLgorICogVHlwaWNhbGx5LCBpdCBpcyBwbGFjZWQgaW4gYSBtb2RlbCB0aGF0IGNvbnRhaW5zIHRoZSB0YXJnZXQgU0lSIGRpc2Vhc2UgbW9kZWwKKyAqIHNvIHRoYXQgaXRzCisgKiB7QGxpbmsgRGVjb3JhdG9yI3VwZGF0ZUxhYmVscyhvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIGxvbmcpfQorICogbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBjb250YWluZWQgZGlzZWFzZSBtb2RlbC4gVGhpcyBlbnN1cmVzIHRoYXQKKyAqIHRoZSAibmV4dCIgdmFsdWVzIHRoYXQgdGhpcyBtb2RlbCBjb2xsZWN0cyB3aWxsIGJlIHZhbGlkIGJ5IHRoZSB0aW1lIGl0IHJ1bnMuCisgKiAKKyAqIEBzZWUgU0lSTGFiZWwKKyAqIEBzZWUgU0lSTGFiZWxWYWx1ZQorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCBleHRlbmRzIEFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwgeworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHNlZ21lbnQgb2YgdGhlIHR5cGUgVVJJIHRoYXQgcHJlZml4ZXMgYWxsIG90aGVyIHNlZ21lbnRzIGluIGEKKwkgKiBzdGFuZGFyZCBzdG9jaGFzdGljIFNJUiBkaXNlYXNlIG1vZGVsIHR5cGUgVVJJLgorCSAqLworCVN0cmluZyBVUklfVFlQRV9BR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9TRUdNRU5UID0gVVJJX1RZUEVfQUdHUkVHQVRJTkdfU0lfRElTRUFTRV9NT0RFTF9TRUdNRU5UCisJCQkrICIvU0lSIjsKK30gLy8gQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9EZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWI4NWRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwuamF2YQpAQCAtMCwwICsxLDMyIEBACisvLyBEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgYW4gRGV0ZXJtaW5pc3RpYyBTRUlSCisgKiBkaXNlYXNlIG1vZGVsLgorICogCisgKiBAc2VlIFNFSVJMYWJlbAorICogQHNlZSBTRUlSTGFiZWxWYWx1ZQorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbCBleHRlbmRzIFNFSVIgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VnbWVudCBvZiB0aGUgdHlwZSBVUkkgdGhhdCBwcmVmaXhlcyBhbGwgb3RoZXIgc2VnbWVudHMgaW4gYQorCSAqIHN0YW5kYXJkIHN0b2NoYXN0aWMgU0VJUiBkaXNlYXNlIG1vZGVsIHR5cGUgVVJJLgorCSAqLworCVN0cmluZyBVUklfVFlQRV9ERVRFUk1JTklTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9TRUdNRU5UID0gVVJJX1RZUEVfU1RBTkRBUkRfU0VJUl9ESVNFQVNFX01PREVMX1NFR01FTlQKKwkJCSsgIi9zdG9jaGFzdGljIjsKK30gLy8gRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL0RldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRhOTdlOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL0RldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8vIERldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgYW4gRGV0ZXJtaW5pc3RpYyBTSQorICogZGlzZWFzZSBtb2RlbC4KKyAqIAorICogQHNlZSBTSUxhYmVsCisgKiBAc2VlIFNJTGFiZWxWYWx1ZQorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBEZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWwgZXh0ZW5kcyBTSSB7CisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VnbWVudCBvZiB0aGUgdHlwZSBVUkkgdGhhdCBwcmVmaXhlcyBhbGwgb3RoZXIgc2VnbWVudHMgaW4gYQorCSAqIHN0YW5kYXJkIHN0b2NoYXN0aWMgU0kgZGlzZWFzZSBtb2RlbCB0eXBlIFVSSS4KKwkgKi8KKwlTdHJpbmcgVVJJX1RZUEVfREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMX1NFR01FTlQgPSBVUklfVFlQRV9TVEFOREFSRF9TSV9ESVNFQVNFX01PREVMX1NFR01FTlQKKwkJCSsgIi9kZXRlcm1pbmlzdGljIjsKK30gLy8gRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3N2U0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9EZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLy8gRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgYW4gRGV0ZXJtaW5pc3RpYyBTSVIKKyAqIGRpc2Vhc2UgbW9kZWwuCisgKiAKKyAqIEBzZWUgU0lSTGFiZWwKKyAqIEBzZWUgU0lSTGFiZWxWYWx1ZQorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsIGV4dGVuZHMgU0lSIHsKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzZWdtZW50IG9mIHRoZSB0eXBlIFVSSSB0aGF0IHByZWZpeGVzIGFsbCBvdGhlciBzZWdtZW50cyBpbiBhCisJICogc3RhbmRhcmQgZGV0ZXJtaW5pc3RpYyBTSVIgZGlzZWFzZSBtb2RlbCB0eXBlIFVSSS4KKwkgKi8KKwlTdHJpbmcgVVJJX1RZUEVfREVURVJNSU5JU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9TRUdNRU5UID0gVVJJX1RZUEVfU1RBTkRBUkRfU0lSX0RJU0VBU0VfTU9ERUxfU0VHTUVOVAorCQkJKyAiL2RldGVybWluaXN0aWMiOworfSAvLyBEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9EaXNlYXNlTW9kZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL0Rpc2Vhc2VNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYTU2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9EaXNlYXNlTW9kZWwuamF2YQpAQCAtMCwwICsxLDI5NiBAQAorLy8gRGlzZWFzZU1vZGVsLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgY2xhc3MgaW4gYW4gRU1GIG1vZGVsIGZvciBhbiBTVEVNIERpc2Vhc2UgbW9kZWwuIEl0CisgKiBpcyB0aGUgdG9wLWxldmVsIGRpc2Vhc2UgbW9kZWwsIGFsbCBvdGhlciBkaXNlYXNlIG1vZGVscyBkZXJpdmUgZnJvbSB0aGlzCisgKiBjbGFzcy4KKyAqIAorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICovCitwdWJsaWMgaW50ZXJmYWNlIERpc2Vhc2VNb2RlbCBleHRlbmRzIE5vZGVEZWNvcmF0b3IsIFNhbml0eUNoZWNrZXIsIE1vZGlmaWFibGUgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VnbWVudCBvZiB0aGUgdHlwZSBVUkkgdGhhdCBwcmVmaXhlcyBhbGwgb3RoZXIgc2VnbWVudHMgaW4gYQorCSAqIGRpc2Vhc2UgbW9kZWwgdHlwZSBVUkkuCisJICovCisJU3RyaW5nIFVSSV9UWVBFX0RJU0VBU0VNT0RFTF9TRUdNRU5UID0gImRpc2Vhc2Vtb2RlbCI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSAiYmFja2dyb3VuZCIgcmF0ZSAoaS5lLiwgaW4gdGhlIGFic2VuY2Ugb2YgZGlzZWFzZSkgYXQgd2hpY2gKKwkgKiBwb3B1bGF0aW9uIG1lbWJlcnMgKG9uIGF2ZXJhZ2UpIHRyYW5zaXRpb24gZnJvbSBhbGwgb2YgdGhlIG90aGVyIHN0YXRlcworCSAqIChleGNlcHQgPGVtPlByZS1Cb3JuPC9lbT4gYW5kIGluY2x1ZGluZyBJbmZlY3Rpb3VzKSB0byB0aGUgc3RhdGUKKwkgKiA8ZW0+RGVhZDwvZW0+LCBwZXIgdGltZSBwZXJpb2QuIEZvciB0aGUgcG9wdWxhdGlvbiBpbiB0aGUgSW5mZWN0aW91cworCSAqIHN0YXRlIHRoZSBtb3J0YWxpdHkgcmF0ZSBtYXkgYWxzbyBiZSBpbmNyZWFzZWQuIFRoaXMgaXMgc3BlY2lmaWVkIGJ5CisJICoge0BsaW5rICNnZXRJbmZlY3Rpb3VzTW9ydGFsaXR5KCl9LgorCSAqIAorCSAqIDEvbW9ydGFsaXR5UmF0ZSBpcyB0aGUgYXZlcmFnZSBsaWZlIHNwYW4gaW4gdGltZSBwZXJpb2RzLCBvbiBhdmVyYWdlLAorCSAqIHRoYXQgaXMgdGFrZXMgZm9yIGEgcG9wdWxhdGlvbiBtZW1iZXIgdG8gZGllIGZyb20gYW55IHN0YXRlLgorCSAqIAorCSAqIEluIHR5cGljYWwgbW9kZWxzLCB0aGUgYmFja2dyb3VuZCBtb3J0YWxpdHkgcmF0ZSBpcyBzcGVjaWZpZWQgdG8gYmUgdGhlCisJICogc2FtZSBhcyB0aGUgImJpcnRoIHJhdGUiIHRvIGtlZXAgdGhlIHBvcHVsYXRpb24gZml4ZWQuCisJICogCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBvcHVsYXRpb24gbWVtYmVycyB0aGF0IGRpZSBwZXIgdGltZSBwZXJpb2QKKwkgKiBAbW9kZWwgZGVmYXVsdD0iNS41RS01IgorCSAqLworCWRvdWJsZSBnZXRCYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCNnZXRCYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSA8ZW0+QmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0QmFja2dyb3VuZE1vcnRhbGl0eVJhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEJhY2tncm91bmRNb3J0YWxpdHlSYXRlKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBDb21wdXRlIHRoZSBiYWNrZ3JvdW5kIG1vcnRhbGl0eSByYXRlIGFkanVzdGVkIGZvciBhIHRpbWUgZGVsdGEKKwkgKiBwb3RlbnRpYWxseSBkaWZmZXJlbnQgZnJvbSB0aGUgdGltZSBwZXJpb2Qgc3BlY2lmaWVkIGZvciB0aGUgcmF0ZS4KKwkgKiAKKwkgKiBAcGFyYW0gdGltZURlbHRhCisJICogICAgICAgICAgICB0aGUgdGltZSBwZXJpb2QgKG1pbGxpc2Vjb25kcykgdG8gd2hpY2ggdGhlIHJhdGUgaXMgdG8gYmUKKwkgKiAgICAgICAgICAgIGFkanVzdGVkLgorCSAqIEByZXR1cm4gdGhlIGFkanVzdGVkIHJhdGUKKwkgKiAKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJZG91YmxlIGdldEFkanVzdGVkQmFja2dyb3VuZE1vcnRhbGl0eVJhdGUoZmluYWwgbG9uZyB0aW1lRGVsdGEpOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgZGlzZWFzZQorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGRpc2Vhc2UKKwkgKiAKKwkgKiBAbW9kZWwKKwkgKi8KKwlTdHJpbmcgZ2V0RGlzZWFzZU5hbWUoKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2dldERpc2Vhc2VOYW1lIDxlbT5EaXNlYXNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpc2Vhc2UgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RGlzZWFzZU5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERpc2Vhc2VOYW1lKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWxhdGl2ZSBUb2xlcmFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMUUtOSI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVsYXRpdmUgVG9sZXJhbmNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbGF0aXZlIFRvbGVyYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0UmVsYXRpdmVUb2xlcmFuY2UoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXREaXNlYXNlTW9kZWxfUmVsYXRpdmVUb2xlcmFuY2UoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSIxRS05IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0UmVsYXRpdmVUb2xlcmFuY2UoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwjZ2V0UmVsYXRpdmVUb2xlcmFuY2UgPGVtPlJlbGF0aXZlIFRvbGVyYW5jZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVsYXRpdmUgVG9sZXJhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRSZWxhdGl2ZVRvbGVyYW5jZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVsYXRpdmVUb2xlcmFuY2UoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbml0ZSBEaWZmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZpbml0ZSBEaWZmZXJlbmNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbml0ZSBEaWZmZXJlbmNlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRGaW5pdGVEaWZmZXJlbmNlKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldERpc2Vhc2VNb2RlbF9GaW5pdGVEaWZmZXJlbmNlKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0Zpbml0ZURpZmZlcmVuY2UoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwjaXNGaW5pdGVEaWZmZXJlbmNlIDxlbT5GaW5pdGUgRGlmZmVyZW5jZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXRlIERpZmZlcmVuY2U8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzRmluaXRlRGlmZmVyZW5jZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RmluaXRlRGlmZmVyZW5jZShib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZyZXF1ZW5jeSBEZXBlbmRlbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RnJlcXVlbmN5IERlcGVuZGVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GcmVxdWVuY3kgRGVwZW5kZW50PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRGcmVxdWVuY3lEZXBlbmRlbnQoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0RGlzZWFzZU1vZGVsX0ZyZXF1ZW5jeURlcGVuZGVudCgpCisJICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNGcmVxdWVuY3lEZXBlbmRlbnQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwjaXNGcmVxdWVuY3lEZXBlbmRlbnQgPGVtPkZyZXF1ZW5jeSBEZXBlbmRlbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZyZXF1ZW5jeSBEZXBlbmRlbnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzRnJlcXVlbmN5RGVwZW5kZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRGcmVxdWVuY3lEZXBlbmRlbnQoYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIEJpcnRoIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iNS41RS01IjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYWNrZ3JvdW5kIEJpcnRoIFJhdGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFja2dyb3VuZCBCaXJ0aCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRCYWNrZ3JvdW5kQmlydGhSYXRlKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0RGlzZWFzZU1vZGVsX0JhY2tncm91bmRCaXJ0aFJhdGUoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSI1LjVFLTUiCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRCYWNrZ3JvdW5kQmlydGhSYXRlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2dldEJhY2tncm91bmRCaXJ0aFJhdGUgPGVtPkJhY2tncm91bmQgQmlydGggUmF0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFja2dyb3VuZCBCaXJ0aCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRCYWNrZ3JvdW5kQmlydGhSYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCYWNrZ3JvdW5kQmlydGhSYXRlKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwb3B1bGF0aW9uIGJlaW5nIGluZmVjdGVkIGJ5IGEgRGlzZWFzZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBQb3B1bGF0aW9uIGFmZmVjdGVkIGJ5IHRoZSBkaXNlYXNlLgorCSAqIAorCSAqIEBtb2RlbCBkZWZhdWx0PSJodW1hbiIKKwkgKi8KKwlTdHJpbmcgZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIgPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFBvcHVsYXRpb25JZGVudGlmaWVyKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBUaGUgdGltZSBwZXJpb2QgZm9yIHRoZSBzcGVjaWZpZWQgcmF0ZXMuICBEZWZhdWx0OiAxIERheQorCSAqIEByZXR1cm4gdGhlIHRpbWUgcGVyaW9kIChtaWxsaXNlY29uZHMpIG9mIHRoZSByYXRlcyBzcGVjaWZpZWQgZm9yIHRoaXMKKwkgKiAgICAgICAgIGRpc2Vhc2UgbW9kZWwKKwkgKiAKKwkgKiBAbW9kZWwgZGVmYXVsdD0iODY0MDAwMDAiCisJICovCisJbG9uZyBnZXRUaW1lUGVyaW9kKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2dldFRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFRpbWVQZXJpb2QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRpbWVQZXJpb2QobG9uZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBkaXNlYXNlIG1vZGVsIGxhYmVsIHRoYXQgdGhpcyBkaXNlYXNlIG1vZGVsCisJICogICAgICAgICB1cGRhdGVzLgorCSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKKwkgKi8KKwlEaXNlYXNlTW9kZWxMYWJlbCBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbCgpOworCisJLyoqCisJICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgZGlzZWFzZSBtb2RlbCBsYWJlbCB2YWx1ZSB0aGF0IHRoaXMgZGlzZWFzZSBtb2RlbAorCSAqICAgICAgICAgdXBkYXRlcy4KKwkgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisJICovCisJRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCk7CisJCisJLyoqCisJICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgZGlzZWFzZSBtb2RlbCBzdGF0ZSB0aGF0IHRoaXMgZGlzZWFzZSBtb2RlbAorCSAqICAgICAgICAgd291bGQgdXNlIHRvIGhvbGQgY29tcHV0YXRpb24gc3RhdGUgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gYQorCSAqICAgICAgICAgZGlzZWFzZSBtb2RlbCBsYWJlbC4KKwkgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisJICovCisJRGlzZWFzZU1vZGVsU3RhdGUgY3JlYXRlRGlzZWFzZU1vZGVsU3RhdGUoKTsKKworCS8qKgorCSAqIEBwYXJhbSBkaXNlYXNlTW9kZWxTdGF0ZQorCSAqICAgICAgICAgICAgdGhlIHN0YXRlIGluZm9ybWF0aW9uIHRvIGJlIGluaXRpYWxpemVkCisJICogQHBhcmFtIGRpc2Vhc2VNb2RlbExhYmVsCisJICogICAgICAgICAgICB0aGUgbGFiZWwgdG8gdXNlIHRvIGluaXRpYWxpemUgdGhlIHN0YXRlIGluZm9ybWF0aW9uCisJICogQHJldHVybiB0aGUgaW5pdGlhbGl6ZWQgZGlzZWFzZSBtb2RlbCBzdGF0ZSBpbnN0YW5jZQorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwlEaXNlYXNlTW9kZWxTdGF0ZSBpbml0aWFsaXplRGlzZWFzZVN0YXRlKAorCQkJRGlzZWFzZU1vZGVsU3RhdGUgZGlzZWFzZU1vZGVsU3RhdGUsCisJCQlEaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTW9kZWxMYWJlbCk7CisKKwkKKwkvKioKKwkgKiBAcGFyYW0gZGlzZWFzZU1vZGVsTGFiZWwKKwkgKiAgICAgICAgICAgIHRoZSBsYWJlbCB0byB1c2UgdG8gaW5pdGlhbGl6ZSB0aGUgc3RhdGUgaW5mb3JtYXRpb24KKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJdm9pZCBpbml0aWFsaXplRGlzZWFzZVN0YXRlKAorCQkJRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZU1vZGVsTGFiZWwpOworCisJLyoqCisJICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBhbiBpbmZlY3RvciBmb3IgdGhpcyBkaXNlYXNlIG1vZGVsLgorCSAqIAorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwlJbmZlY3RvciBjcmVhdGVJbmZlY3RvcigpOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldEFkanVzdGVkQmFja2dyb3VuZEJpcnRoUmF0ZShsb25nIHRpbWVEZWx0YSk7CisKK30gLy8gRGlzZWFzZU1vZGVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9EaXNlYXNlTW9kZWxMYWJlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvRGlzZWFzZU1vZGVsTGFiZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDJkZjdhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvRGlzZWFzZU1vZGVsTGFiZWwuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLy8gRGlzZWFzZU1vZGVsTGFiZWwuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY05vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBjbGFzcyBpbiBhbiBFTUYgbW9kZWwgZm9yIGFuIFNURU0gRGlzZWFzZSBtb2RlbAorICogbGFiZWwuIEl0IGlzIHRoZSB0b3AtbGV2ZWwgZGlzZWFzZSBtb2RlbCwgYWxsIG90aGVyIGRpc2Vhc2UgbW9kZWwgbGFiZWxzCisgKiBkZXJpdmUgZnJvbSB0aGlzIGNsYXNzLgorICogCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGlzZWFzZU1vZGVsTGFiZWwgZXh0ZW5kcyBEeW5hbWljTm9kZUxhYmVsIHsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHRvcC1sZXZlbCBzZWdtZW50IGZvciBhbGwgdHlwZSBVUkkncyBmb3IgZGlzZWFzZSBtb2RlbAorCSAqIGxhYmVscy4KKwkgKi8KKwlTdHJpbmcgVVJJX1RZUEVfRElTRUFTRV9NT0RFTF9MQUJFTF9TRUdNRU5UID0gVVJJX1RZUEVfRFlOQU1JQ19MQUJFTF9TRUdNRU5UCisJCQkrICIvZGlzZWFzZW1vZGVsIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHR5cGUgVVJJIGZvciBkaXNlYXNlIG1vZGVsIGxhYmVscworCSAqLworCVVSSSBVUklfVFlQRV9TSVJfTEFCRUwgPSBTVEVNVVJJCisJCQkuY3JlYXRlVHlwZVVSSShVUklfVFlQRV9ESVNFQVNFX01PREVMX0xBQkVMX1NFR01FTlQpOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgUG9wdWxhdGlvbiBiZWluZyBpbmZlY3RlZCBieSBhIERpc2Vhc2UuIFRoZSB2YWx1ZXMgZm9yIHRoaXMKKwkgKiBkaXNlYXNlIG1vZGVsIGxhYmVsIGFwcGx5IHRvIHRoZSBwb3B1bGF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSBwb3B1bGF0aW9uCisJICogbGFiZWwuCisJICogCisJICogQHJldHVybiB0aGUgUG9wdWxhdGlvbiBhZmZlY3RlZCBieSB0aGUgZGlzZWFzZS4KKwkgKiAKKwkgKiBAbW9kZWwKKwkgKi8KKwlQb3B1bGF0aW9uTGFiZWwgZ2V0UG9wdWxhdGlvbkxhYmVsKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWwjZ2V0UG9wdWxhdGlvbkxhYmVsIDxlbT5Qb3B1bGF0aW9uIExhYmVsPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbiBMYWJlbDwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbkxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRQb3B1bGF0aW9uTGFiZWwoUG9wdWxhdGlvbkxhYmVsIHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGRpc2Vhc2UgbW9kZWwgc3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGFiZWwgKGlmIGFueSkuCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiBvcHBvc2l0ZT0ibGFiZWwiCisJICovCisJRGlzZWFzZU1vZGVsU3RhdGUgZ2V0RGlzZWFzZU1vZGVsU3RhdGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbCNnZXREaXNlYXNlTW9kZWxTdGF0ZSA8ZW0+RGlzZWFzZSBNb2RlbCBTdGF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpc2Vhc2UgTW9kZWwgU3RhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldERpc2Vhc2VNb2RlbFN0YXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREaXNlYXNlTW9kZWxTdGF0ZShEaXNlYXNlTW9kZWxTdGF0ZSB2YWx1ZSk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRQb3B1bGF0aW9uTW9kZWxMYWJlbChQb3B1bGF0aW9uTW9kZWxMYWJlbCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0RGlzZWFzZU1vZGVsTGFiZWxfUG9wdWxhdGlvbk1vZGVsTGFiZWwoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQb3B1bGF0aW9uTW9kZWxMYWJlbCBnZXRQb3B1bGF0aW9uTW9kZWxMYWJlbCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsI2dldFBvcHVsYXRpb25Nb2RlbExhYmVsIDxlbT5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uTW9kZWxMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoUG9wdWxhdGlvbk1vZGVsTGFiZWwgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgd2hvIGhhdmUgZGllZCBmcm9tCisJICogICAgICAgICB0aGUgZGlzZWFzZS4KKwkgKi8KKwlkb3VibGUgZ2V0RGlzZWFzZURlYXRocygpOworCisJLyoqCisJICogQHBhcmFtIGQgdGhlIG51bWJlciBvZiBkZWF0aHMKKwkgKi8KKwl2b2lkIHNldERpc2Vhc2VEZWF0aHMoZmluYWwgZG91YmxlIGQpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG5leHQgdmFsdWUgb2YgdGhlIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgd2hvIGhhdmUgZGllZAorCSAqICAgICAgICAgZnJvbSB0aGUgZGlzZWFzZS4KKwkgKi8KKwlkb3VibGUgZ2V0TmV4dERpc2Vhc2VEZWF0aHMoKTsKKworCS8qKgorCSAqIEBwYXJhbSBkIHRoZSBudW1iZXIgb2YgZGVhdGhzCisJICovCisJdm9pZCBzZXROZXh0RGlzZWFzZURlYXRocyhmaW5hbCBkb3VibGUgZCk7CisJCit9IC8vIERpc2Vhc2VNb2RlbExhYmVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDliOGI4ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL0Rpc2Vhc2VNb2RlbExhYmVsVmFsdWUuamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLy8gRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBjbGFzcyBpbiBhbiBFTUYgbW9kZWwgZm9yIGFuIGRpc2Vhc2UgbW9kZWwgbGFiZWwKKyAqIHZhbHVlLiBUaGUgdmFsdWVzIG9mIHRoaXMgbGFiZWwgcmVjb3JkIHRoZSBudW1iZXIgb2YgcG9wdWxhdGlvbiBtZW1iZXJzIHdobworICogaGF2ZSBiZWVuICJib3JuIiBhbmQgd2hvIGhhdmUgImRpZWQiLgorICogCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKi8KKworcHVibGljIGludGVyZmFjZSBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGV4dGVuZHMgTGFiZWxWYWx1ZSwgSW50ZWdyYXRpb25MYWJlbFZhbHVlIHsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1heGltdW0gdmFsdWUgZm9yIGFueSBwb3B1bGF0aW9uLgorCSAqLworCWRvdWJsZSBNQVhfUE9QVUxBVElPTl9WQUxVRSA9IDFlMTI7CisJCisJLyoqCisJICogU2V0IHRoZSBpbmNpZGVuY2UuCisJICogQHBhcmFtIGluY2lkZW5jZQorCSAqIEBtb2RlbAorCSAqLworCWRvdWJsZSBnZXRJbmNpZGVuY2UoKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSNnZXRJbmNpZGVuY2UgPGVtPkluY2lkZW5jZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5jaWRlbmNlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJbmNpZGVuY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEluY2lkZW5jZShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBvcHVsYXRpb24gbWVtYmVycyB3aG8gaGF2ZSBkaWVkIGR1ZSB0byB0aGUgZGlzZWFzZQorCSAqICAgICAgICAgYmVpbmcgbW9kZWxlZAorCSAqIEBtb2RlbCBkZWZhdWx0PSIwIgorCSAqLworCWRvdWJsZSBnZXREaXNlYXNlRGVhdGhzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSNnZXREaXNlYXNlRGVhdGhzIDxlbT5EaXNlYXNlIERlYXRoczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpc2Vhc2UgRGVhdGhzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXREaXNlYXNlRGVhdGhzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREaXNlYXNlRGVhdGhzKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBTZXQgdGhlIHZhbHVlIG9mIHRoaXMgZGlzZWFzZSBtb2RlbCBsYWJlbCB0byBiZSB0aGUgc2FtZSBhcyB0aGUgdmFsdWUKKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoaXMgZGlzZWFzZSBtb2RlbCB2YWx1ZQorCSAqIEByZXR1cm4gdGhpcyBpbnN0YW5jZSB3aXRoIHRoZSBuZXcgdmFsdWVzCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCURpc2Vhc2VNb2RlbExhYmVsVmFsdWUgc2V0KGZpbmFsIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgdmFsdWUpOworCisJLyoqCisJICogQWRkIHRoZSB2YWx1ZSBvZiB0aGlzIGRpc2Vhc2UgbW9kZWwgbGFiZWwgdG8gdGhlIHZhbHVlCisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gYmUgYWRkZWQgdG8gdGhpcyBkaXNlYXNlIG1vZGVsIHZhbHVlCisJICogQHJldHVybiB0aGlzIGluc3RhbmNlIHdpdGggdGhlIHN1bSBvZiB2YWx1ZXMKKwkgKiAKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBhZGQoZmluYWwgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBTdWJ0cmFjdCB0aGUgdmFsdWUgb2YgdGhlIHBhc3NlZCBkaXNlYXNlIG1vZGVsIGxhYmVsIHZhbHVlIGZyb20gdGhpcworCSAqIGRpc2Vhc2UgbW9kZWwgbGFiZWwgdG8gdGhlIHZhbHVlLgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZQorCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIGFkZGVkIHRvIHRoaXMgZGlzZWFzZSBtb2RlbCB2YWx1ZQorCSAqIEByZXR1cm4gdGhpcyBpbnN0YW5jZSB3aXRoIHRoZSBkaWZmZXJlbmNlIG9mIHZhbHVlcworCSAqIAorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwlEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHN1YihmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHZhbHVlKTsKKworCS8qKgorCSAqIE11bHRpcGx5IHRoZSB2YWx1ZXMgYnkgYSBzY2FsZSBmYWN0b3IuCisJICogCisJICogQHBhcmFtIHNjYWxlRmFjdG9yCisJICogCXRoZSBtdWx0aXBsaWVyCisJICogQHJldHVybiB0aGlzIGluc3RhbmNlIHdpdGggdGhlIG5ldyBzY2FsZWQgdmFsdWVzCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCURpc2Vhc2VNb2RlbExhYmVsVmFsdWUgc2NhbGUoZmluYWwgZG91YmxlIHNjYWxlRmFjdG9yKTsKKworCS8qKgorCSAqIEFkZCBhIHNjYWxhciB0byBlYWNoIHZhbHVlCisJICogCisJICogQHBhcmFtIHNjYWxhcgorCSAqIAlUaGUgc2NhbGFyCisJICogQHJldHVybiB0aGlzIGluc3RhbmNlIHdpdGggdGhlIG5ldyBhZGRlZCB2YWx1ZQorCSAqIAorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwlEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGFkZChmaW5hbCBkb3VibGUgc2NhbGVGYWN0b3IpOworCisJLyoqCisJICogTWFrZSB0aGUgdmFsdWVzIGFic29sdXRlIAorCSAqIAorCSAqIEByZXR1cm4gdGhpcyBpbnN0YW5jZSB3aXRoIG5lZ2F0aXZlIHJlcGxhY2VkIHdpdGggcG9zaXRpdmUgdmFsdWVzCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCURpc2Vhc2VNb2RlbExhYmVsVmFsdWUgYWJzKCk7CisKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHN1bSBvZiB0aGUgbGl2aW5nIHBvcHVsYXRpb24gbWVtYmVycyBpbiBhbGwgc3RhdGVzCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCWRvdWJsZSBnZXRQb3B1bGF0aW9uQ291bnQoKTsKKworCS8qKgorCSAqIFNldCBhbGwgcG9wdWxhdGlvbiB2YWx1ZXMgaW4gYWxsIHN0YXRlcyB0byB6ZXJvLgorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwl2b2lkIHplcm9PdXRQb3B1bGF0aW9uQ291bnQoKTsKK30gLy8gRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvRGlzZWFzZU1vZGVsU3RhdGUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL0Rpc2Vhc2VNb2RlbFN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmODZiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL0Rpc2Vhc2VNb2RlbFN0YXRlLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLy8gRGlzZWFzZU1vZGVsU3RhdGUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBjbGFzcyBpbiBhbiBFTUYgbW9kZWwgdGhhdCBjb250YWlucyBzdGF0ZQorICogaW5mb3JtYXRpb24gZm9yIGEgU1RFTSBkaXNlYXNlIG1vZGVsJ3MgY29tcHV0YXRpb25zIGZyb20gb25lIHNpbXVsYXRpb24gY3ljbGUKKyAqIHRvIGFub3RoZXIuIFRoZSBiYXNpYyBpZGVhIGlzIHRoYXQgdGhlIGRpc2Vhc2UgbW9kZWwgY2FuIHN0b3JlIHN0YXRlCisgKiBpbmZvcm1hdGlvbiBpbiBhbiBpbnN0YW5jZSBhbmQgYXR0YWNoIGl0IHRvIGEgZGlzZWFzZSBtb2RlbCBsYWJlbCBzdWNoIHRoYXQKKyAqIHdoZW4gaXQgcmV2aXNpdHMgdGhlIGxhYmVsIHRvIGNvbXB1dGUgaXRzIHZhbHVlIGl0IGNhbiByZWZlciB0byB0aGUgc3RhdGUKKyAqIGluZm9ybWF0aW9uIHRvIGFzIHBhcnQgb2YgaXRzIGNvbXB1dGF0aW9uLiBGb3IgaW5zdGFuY2UsIGlmIHRoZSB2YWx1ZSBvZgorICogYSBsYWJlbCBpcyBkZXBlbmRlbnQgb24gdGhlIHZhbHVlcyBvZiBvdGhlciBsYWJlbHMsIHJlZmVyZW5jZXMgdG8gdGhvc2UKKyAqIGxhYmVscyBjb3VsZCBiZSAiY2FjaGVkIiBpbiB0aGUgc3RhdGUgaW5zdGFuY2UgYW5kIG5vdCByZWNvbXB1dGVkIGZvciBlYWNoCisgKiBjeWNsZS4KKyAqIAorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICogQGltcGxlbWVudHMgU2FuaXR5Q2hlY2tlcgorICovCitwdWJsaWMgaW50ZXJmYWNlIERpc2Vhc2VNb2RlbFN0YXRlIGV4dGVuZHMgRU9iamVjdCwgU2FuaXR5Q2hlY2tlciB7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBsYWJlbCBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXRlIGluZm9ybWF0aW9uCisJICogQG1vZGVsCisJICovCisJRGlzZWFzZU1vZGVsTGFiZWwgZ2V0TGFiZWwoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxTdGF0ZSNnZXRMYWJlbCA8ZW0+TGFiZWw8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFiZWw8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TGFiZWwoRGlzZWFzZU1vZGVsTGFiZWwgdmFsdWUpOworCit9Ly8gRGlzZWFzZU1vZGVsU3RhdGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL0luZmVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9JbmZlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNGQ4ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9JbmZlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvLyBJbmZlY3Rvci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgY2xhc3MgaW4gYW4gRU1GIG1vZGVsIGZvciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYW4KKyAqIGluZmVjdGlvdXMgcG9wdWxhdGlvbiBpbiBhIGRpc2Vhc2UgbW9kZWwuCisgKiAKKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKKyAqLworcHVibGljIGludGVyZmFjZSBJbmZlY3RvciBleHRlbmRzIE5vZGVEZWNvcmF0b3IsIE1vZGlmaWFibGUgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VnbWVudCBvZiB0aGUgdHlwZSBVUkkgdGhhdCBwcmVmaXhlcyBhbGwgb3RoZXIgc2VnbWVudHMgaW4gYQorCSAqIGluZmVjdG9yIHR5cGUgVVJJLgorCSAqLworCVN0cmluZyBVUklfVFlQRV9JTkZFQ1RPUl9TRUdNRU5UID0gImluZmVjdG9yIjsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGRpc2Vhc2UgdG8gYmUgaW5mZWN0ZWQKKwkgKiBAbW9kZWwKKwkgKi8KKwlTdHJpbmcgZ2V0RGlzZWFzZU5hbWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvciNnZXREaXNlYXNlTmFtZSA8ZW0+RGlzZWFzZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlzZWFzZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXREaXNlYXNlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RGlzZWFzZU5hbWUoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIElTTzMxNjYgYmFzZWQga2V5IGZvciB0aGUge0BsaW5rIFJlZ2lvbn0gdG8gYmUgaW5mZWN0ZWQuCisJICogQG1vZGVsCisJICovCisJU3RyaW5nIGdldFRhcmdldElTT0tleSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9yI2dldFRhcmdldElTT0tleSA8ZW0+VGFyZ2V0IElTTyBLZXk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBJU08gS2V5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRUYXJnZXRJU09LZXkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRhcmdldElTT0tleShTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgaWRlbnRpZmllciBvZiB0aGUgcG9wdWxhdGlvbiB0aGF0IGlzIHRvIGJlIGluZmVjdGVkCisJICogQG1vZGVsCisJICovCisJU3RyaW5nIGdldFBvcHVsYXRpb25JZGVudGlmaWVyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3IjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIgPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluZmVjdCBQZXJjZW50YWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmZlY3QgUGVyY2VudGFnZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmZlY3QgUGVyY2VudGFnZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SW5mZWN0UGVyY2VudGFnZShib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRJbmZlY3Rvcl9JbmZlY3RQZXJjZW50YWdlKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNJbmZlY3RQZXJjZW50YWdlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3IjaXNJbmZlY3RQZXJjZW50YWdlIDxlbT5JbmZlY3QgUGVyY2VudGFnZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5mZWN0IFBlcmNlbnRhZ2U8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzSW5mZWN0UGVyY2VudGFnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SW5mZWN0UGVyY2VudGFnZShib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGRpc2Vhc2UgbW9kZWwgdGhhdCB0aGlzIGluZmVjdG9yIGluaXRpYWxpemVzCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJmYWxzZSIKKwkgKi8KKwlTdGFuZGFyZERpc2Vhc2VNb2RlbCBnZXREaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvciNnZXREaXNlYXNlTW9kZWwgPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNlYXNlIE1vZGVsPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXREaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERpc2Vhc2VNb2RlbChTdGFuZGFyZERpc2Vhc2VNb2RlbCB2YWx1ZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBVUkkgb2YgdGhlIG5vZGUgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIGluZmVjdGlvdXMgcG9wdWxhdGlvbgorCSAqIEBtb2RlbAorCSAqLworCVVSSSBnZXRUYXJnZXRVUkkoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvciNnZXRUYXJnZXRVUkkgPGVtPlRhcmdldCBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRUYXJnZXRVUkkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRhcmdldFVSSShVUkkgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgbGlzdCBvZiB7QGxpbmsgRGlzZWFzZUxhYmVsfXMgdGhhdCB0aGlzIDxjb2RlPkluZmVjdG9yPC9jb2RlPgorCSAqIAkgaXMgcmVzcG9uc2libGUgZm9yICJpbmZlY3RpbmciLgorCSAqIEBtb2RlbCB0eXBlPSJEaXNlYXNlTW9kZWxMYWJlbCIgY29udGFpbm1lbnQ9ImZhbHNlIiAKKwkgKi8KKwlFTGlzdDxEaXNlYXNlTW9kZWxMYWJlbD4gZ2V0TGFiZWxzVG9JbmZlY3QoKTsKK30gLy8gSW5mZWN0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL0luZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL0luZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzU2YWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZCQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbmZlY3RvciBJbm9jdWxhdG9yIENvbGxlY3Rpb248L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24jZ2V0TGlzdCA8ZW0+TGlzdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24jZ2V0SW1wb3J0Rm9sZGVyIDxlbT5JbXBvcnQgRm9sZGVyPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24oKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbiBleHRlbmRzIE5vZGVEZWNvcmF0b3IsIE1vZGlmaWFibGUgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3J9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGlzdDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25fTGlzdCgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxJbmZlY3Rvcj4gZ2V0TGlzdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW1wb3J0IEZvbGRlcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkltcG9ydCBGb2xkZXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wb3J0IEZvbGRlcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SW1wb3J0Rm9sZGVyKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0SW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbl9JbXBvcnRGb2xkZXIoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSIiCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRJbXBvcnRGb2xkZXIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uI2dldEltcG9ydEZvbGRlciA8ZW0+SW1wb3J0IEZvbGRlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW1wb3J0IEZvbGRlcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SW1wb3J0Rm9sZGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJbXBvcnRGb2xkZXIoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TRUlSLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TRUlSLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkNTQzYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1NFSVIuamF2YQpAQCAtMCwwICsxLDI1MiBAQAorLy8gU0VJUi5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworCisvKioKKyAqIEEge0BsaW5rIERpc2Vhc2VNb2RlbH0gd2l0aCBmb3VyIHN0YXRlcyA8ZW0+U3VzY2VwdGlibGU8L2VtPiwKKyAqIDxlbT5FeHBvc2VkPC9lbT4sIDxlbT5JbmZlY3Rpb3VzPC9lbT4gYW5kIDxlbT5SZWNvdmVyZWQ8L2VtPihTRUlSKS4KKyAqIAorICogPHA+CisgKiBUaGUgYmFzaWMgPGVtPlNFSVI8L2VtPiAoU3VzY2VwdGlibGUsIEV4cG9zZWQsIEluZmVjdGlvdXMsIFJlY292ZXJlZCkKKyAqIGRpc2Vhc2UgbW9kZWwgYXNzdW1lcyBhIHVuaWZvcm0gcG9wdWxhdGlvbiBhdCBhIHNpbmdsZSBsb2NhdGlvbiBhbmQgdGhhdCB0aGUKKyAqIHBvcHVsYXRpb24gbWVtYmVycyBhcmUgd2VsbCAibWl4ZWQiLCBtZWFuaW5nIHRoYXQgdGhleSBhcmUgZXF1YWxseSBsaWtlbHkgdG8KKyAqIG1lZXQgYW5kIGluZmVjdCBlYWNoIG90aGVyLiBUaGlzIG1vZGVsLCBmb3IgYSBub3JtYWxpemVkIHBvcHVsYXRpb24sIGlzCisgKiBkZWZpbmVkIGJ5IHRoZSB0aHJlZSBlcXVhdGlvbnMgYmVsb3c6CisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtzID0gJm11OyAgJm1pbnVzOyAmYmV0YTtzIGkgKyAmZ2FtbWE7ciAmbWludXM7ICZtdTtzPC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtlID0gJmJldGE7cyBpICZtaW51czsgJnBoaTtlICAmbWludXM7ICZtdTtlPC9lbT4gPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO2kgPSAmcGhpO2UgJm1pbnVzOyAmc2lnbWE7aSAgJm1pbnVzOyAmbXU7aTwvZW0+IDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtyID0gICAmc2lnbWE7aSAmbWludXM7ICZnYW1tYTtyICZtaW51czsgJm11O3I8L2VtPiA8L2xpPgorICogPC91bD4KKyAqIAorICogCisgKiA8cD4KKyAqIFdoZXJlOgorICogPHVsPgorICogPGxpPjxlbT5zPC9lbT4gaXMgdGhlIG5vcm1hbGl6ZWQgPGVtPlN1c2NlcHRpYmxlPC9lbT4gcG9wdWxhdGlvbiA8L2xpPgorICogPGxpPiA8ZW0+aTwvZW0+IGlzIHRoZSBub3JtYWxpemVkIDxlbT5JbmZlY3Rpb3VzPC9lbT4gcG9wdWxhdGlvbjwvbGk+CisgKiA8bGk+Jm11OyBpcyB0aGUgPGVtPmJhY2tncm91bmQgbW9ydGFsaXR5IHJhdGU8L2VtPiwgYW5kLCBiZWNhdXNlIGl0IGlzCisgKiBhc3N1bWVkIHRoYXQgdGhlIHBvcHVsYXRpb24gd2FzIG5vdCBncm93aW5nIG9yIHNocmlua2luZyBzaWduaWZpY2FudGx5IGJlZm9yZQorICogdGhlIG9uc2V0IG9mIHRoZSBkaXNlYXNlLCAmbXU7IGlzIGFsc28gYXNzdW1lZCB0byBiZSB0aGUgYmlydGggcmF0ZS4gPC9saT4KKyAqIDxsaT4gPGVtPiZiZXRhOzwvZW0+IGlzIHRoZSBkaXNlYXNlIDxlbT50cmFuc21pc3Npb24gKGluZmVjdGlvbikgcmF0ZTwvZW0+LgorICogVGhpcyBjb2VmZmljaWVudCBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgcG9wdWxhdGlvbiBtZW1iZXJzIHRoYXQgYmVjb21lCisgKiA8ZW0+RXhwb3NlZDwvZW0+IHBlciBwb3B1bGF0aW9uIG1lbWJlciBpbiB0aGUgPGVtPkluZmVjdGlvdXM8L2VtPiBzdGF0ZSwKKyAqIGFzc3VtaW5nIHRoZSBlbnRpcmUgcG9wdWxhdGlvbiBpcyBpbiB0aGUgPGVtPlN1c2NlcHRpYmxlPC9lbT4gc3RhdGUuIDwvbGk+CisgKiA8bGk+ICZzaWdtYTsgaXMgdGhlIDxlbT5JbmZlY3Rpb3VzPC9lbT4gcmVjb3ZlcnkgcmF0ZS4gVGhpcyBjb2VmZmljaWVudAorICogZGV0ZXJtaW5lcyB0aGUgcmF0ZSBhdCB3aGljaCA8ZW0+SW5mZWN0aW91czwvZW0+IHBvcHVsYXRpb24gbWVtYmVycworICogPGVtPlJlY292ZXI8L2VtPi48L2xpPgorICogPGxpPjxlbT4mZ2FtbWE7PC9lbT4gaXMgdGhlIDxlbT5pbW11bml0eSBsb3NzIHJhdGU8L2VtPi4gVGhpcworICogY29lZmZpY2llbnQgZGV0ZXJtaW5lcyB0aGUgcmF0ZSBhdCB3aGljaCA8ZW0+UmVjb3ZlcmVkPC9lbT4gcG9wdWxhdGlvbgorICogbWVtYmVycyBsb3NlIHRoZWlyIGltbXVuaXR5IHRvIHRoZSBkaXNlYXNlIGFuZCBiZWNvbWUgPGVtPlN1c2NlcHRpYmxlPC9lbT4KKyAqIGFnYWluLjwvbGk+CisgKiA8bGk+PGVtPiZwaGk7PC9lbT4gaXMgdGhlIDxlbT5pbmN1YmF0aW9uIHJhdGU8L2VtPi4gVGhpcyBjb2VmZmljaWVudAorICogZGV0ZXJtaW5lcyB0aGUgcmF0ZSBhdCB3aGljaCA8ZW0+RXhwb3NlZDwvZW0+IHBvcHVsYXRpb24gbWVtYmVycyBiZWNvbWUKKyAqIDxlbT5JbmZlY3Rpb3VzPC9lbT4uPC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBGb2xsb3dpbmcgYmFzaWNhbGx5IHRoZSBzYW1lIGRlcml2YXRpb24gYXMgb3V0bGluZWQgZm9yIHRoZSB7QGxpbmsgU0l9IGFuZAorICoge0BsaW5rIFNJUn0gbW9kZWxzLCB0aGVzZSBiZWNvbWU6CisgKiAKKyAqIDxwPgorICogTGV0CisgKiA8dWw+CisgKiA8bGk+PGVtPng8L2VtPiBiZSB0aGUgPGVtPkluZmVjdGlvdXMgTW9ydGFsaXR5PC9lbT4gd2hpY2ggaXMgdGhlCisgKiBwcm9wb3J0aW9uIG9mIHRoZSBwb3B1bGF0aW9uIG1lbWJlcnMgd2hvIGJlY29tZSA8ZW0+SW5mZWN0aW91czwvZW0+IHRoYXQKKyAqIHdpbGwgZXZlbnR1YWxseSBkaWUuPC9saT4KKyAqIDxsaT48ZW0+Jm11OzxzdWI+aTwvc3ViPjwvZW0+IGJlIHRoZSA8ZW0+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvZW0+LgorICogVGhpcyBpcyB0aGUgcmF0ZSBhdCB3aGljaCBmYXRhbGx5IGluZmVjdGVkIHBvcHVsYXRpb24gbWVtYmVycyBkaWUKKyAqIHNwZWNpZmljYWxseSBkdWUgdG8gdGhlIGRpc2Vhc2UuIDwvbGk+CisgKiA8L3VsPgorICogVGh1cywgd2Ugbm93IGhhdmUgdHdvIHR5cGVzIG9mIDxlbT5JbmZlY3Rpb3VzPC9lbT4gcG9wdWxhdGlvbiBtZW1iZXJzLAorICogdGhvc2UgdGhhdCB3aWxsIGV2ZW50dWFsbHkgcmVjb3ZlciBhdCByYXRlIDxlbT4mc2lnbWE7PC9lbT4sIGFuZCB0aG9zZSB0aGF0CisgKiB3aWxsIGV2ZW50dWFsbHkgZGllIGF0IHJhdGUgPGVtPiZtdTs8c3ViPmk8L3N1Yj48L2VtPiAob2YgY291cnNlLCBtZW1iZXJzCisgKiBpbiBhbGwgdGhyZWUgc3RhdGVzIHN0aWxsIGRpZSBhdCB0aGUgYmFja2dyb3VuZCByYXRlIDxlbT4mbXU7PC9lbT4pLgorICogPC9wPgorICogPHA+CisgKiBMZXQKKyAqIDx1bD4KKyAqIDxsaT48ZW0+IGkgPHN1cD5SPC9zdXA+PC9lbT4gYmUgdGhlIG5vcm1hbGl6ZWQgaW5mZWN0aW91cyBwb3B1bGF0aW9uIHRoYXQKKyAqIHdpbGwgcmVjb3Zlci48L2xpPgorICogPGxpPjxlbT4gaSA8c3VwPkY8L3N1cD48L2VtPiBiZSB0aGUgbm9ybWFsaXplZCBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gdGhhdAorICogd2lsbCBkaWUgZnJvbSB0aGUgZGlzZWFzZS48L2xpPgorICogPGxpPjxlbT4gaSA9IGkgPHN1cD5SPC9zdXA+ICsgIGkgPHN1cD5GPC9zdXA+PC9lbT4gYmUgdGhlIHRvdGFsIG5vcm1hbGl6ZWQKKyAqIGluZmVjdGlvdXMgcG9wdWxhdGlvbiAoYXMgYmVmb3JlKS48L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIAorICogPHA+CisgKiBXZSBtb2RpZnkgb3VyIG1vZGVsIHRvIGluY2x1ZGUgdGhlc2UgYWRkaXRpb25hbCBzdGF0ZXMgYW5kIHJhdGVzLgorICogPHVsPgorICogPGxpPjxlbT4mRGVsdGE7cyA9ICZtdTsgICZtaW51czsgJmJldGE7cyBpICsgJmdhbW1hO3IgICZtaW51czsgJm11OyBzPC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtlID0gJmJldGE7cyBpICZtaW51czsgJnBoaTtlICAmbWludXM7ICZtdTtlPC9lbT4gPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO2kgPHN1cD5SPC9zdXA+ID0gKDEteCkmcGhpO2UgICZtaW51czsgJnNpZ21hO2kgPHN1cD5SPC9zdXA+ICAmbWludXM7ICZtdTtpIDxzdXA+Ujwvc3VwPjwvZW0+CisgKiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7aSA8c3VwPkY8L3N1cD4gPSB4JnBoaTtlICAmbWludXM7ICgmbXU7ICsgJm11OzxzdWI+aTwvc3ViPikgaSA8c3VwPkY8L3N1cD48L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO3IgPSAgICZzaWdtYTtpPHN1cD5SPC9zdXA+ICZtaW51czsgJmdhbW1hO3IgJm1pbnVzOyAmbXU7cjwvZW0+CisgKiA8L2xpPgorICogCisgKiA8L3VsPgorICogPC9wPgorICogPGgzPlNwYXRpYWwgQWRhcHRhdGlvbjwvaDM+CisgKiA8cD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO3MgUDxzdWI+bDwvc3ViPj0gJm11O1A8c3ViPmw8L3N1Yj4gICZtaW51czsgJmJldGE7PHN1Yj5sPC9zdWI+IHMgaSBQPHN1Yj5sPC9zdWI+ICsgJmdhbW1hOyByIFA8c3ViPmw8L3N1Yj4gICZtaW51czsgJm11OyBzIFA8c3ViPmw8L3N1Yj48L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO2UgUDxzdWI+bDwvc3ViPj0gJmJldGE7c2lQPHN1Yj5sPC9zdWI+ICZtaW51czsgJnBoaTtlUDxzdWI+bDwvc3ViPiAgJm1pbnVzOyAmbXU7ZVA8c3ViPmw8L3N1Yj48L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO2kgPHN1cD5SPC9zdXA+IFA8c3ViPmw8L3N1Yj4gPSAoMS14KSZwaGk7ZSBQPHN1Yj5sPC9zdWI+ICZtaW51czsgJnNpZ21hOyBpIDxzdXA+Ujwvc3VwPiBQPHN1Yj5sPC9zdWI+ICZtaW51czsgJm11O2kgPHN1cD5SPC9zdXA+IFA8c3ViPmw8L3N1Yj48L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO2kgPHN1cD5GPC9zdXA+IFA8c3ViPmw8L3N1Yj4gPSB4ICZwaGk7ZSBQPHN1Yj5sPC9zdWI+ICZtaW51czsgKCZtdTsgKyAmbXU7PHN1Yj5pPC9zdWI+KSBpIDxzdXA+Rjwvc3VwPiBQPHN1Yj5sPC9zdWI+PC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtyIFA8c3ViPmw8L3N1Yj49ICAgJnNpZ21hO2k8c3VwPlI8L3N1cD5QPHN1Yj5sPC9zdWI+ICZtaW51czsgJmdhbW1hO3IgUDxzdWI+bDwvc3ViPiZtaW51czsgJm11O3IgUDxzdWI+bDwvc3ViPjwvZW0+CisgKiA8L2xpPgorICogPC91bD4KKyAqIDxwPgorICogTGV0IDxlbT5TPHN1Yj5sPC9zdWI+ID0gcyBQPHN1Yj5sPC9zdWI+PC9lbT4gYmUgdGhlIG51bWJlciBvZgorICogPGVtPlN1c2NlcHRpYmxlPC9lbT4gcG9wdWxhdGlvbiBtZW1iZXJzIGF0IGxvY2F0aW9uIDxlbT5sPC9lbT4uCisgKiBTaW1pbGFybHksIGxldCA8ZW0+STxzdWI+bDwvc3ViPiA9IGkgUDxzdWI+bDwvc3ViPjwvZW0+IGJlIHRoZSBudW1iZXIKKyAqIG9mIHBvcHVsYXRpb24gbWVtYmVycyBhdCBsb2NhdGlvbiA8ZW0+bDwvZW0+IHRoYXQgYXJlIDxlbT5JbmZlY3Rpb3VzPC9lbT4KKyAqIChib3RoIHN0YXRlcyBjb21iaW5lZCksIGFuZCBsZXQKKyAqIDxlbT5yIFA8c3ViPmw8L3N1Yj4gYmUgdGhlIDxlbT5SZWNvdmVyZWQ8L2VtPiBwb3B1bGF0aW9uLgorICogRm9yIHJlYWRhYmlsaXR5LCB3ZSBkcm9wIHRoZSA8ZW0+bDwvZW0+IHN1YnNjcmlwdCBhbmQgc3Vic3RpdHV0ZS4KKyAqIDwvcD4KKyAqIFN1YnN0aXR1dGluZworICogIAorICogPC9wPgorICogPHVsPgorICogPGxpPjxlbT4mRGVsdGE7UyA9ICZtdTtQPHN1Yj5sPC9zdWI+ICAmbWludXM7ICZiZXRhOzxzdWI+bDwvc3ViPiBTIGkgKyAmZ2FtbWE7UiAgJm1pbnVzOyAmbXU7IFM8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0UgPSAmYmV0YTtTIGkgJm1pbnVzOyAmcGhpO0UgICZtaW51czsgJm11O0U8L2VtPiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7SSA8c3VwPlI8L3N1cD4gPSAoMS14KSZwaGk7RSAgJm1pbnVzOyAmc2lnbWE7SSA8c3VwPlI8L3N1cD4gJm1pbnVzOyAmbXU7SSA8c3VwPlI8L3N1cD4gPC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJIDxzdXA+Rjwvc3VwPiA9IHgmcGhpO0UgICAmbWludXM7ICgmbXU7ICsgJm11OzxzdWI+aTwvc3ViPikgSSA8c3VwPkY8L3N1cD4gPC9lbT4KKyAqIDwvbGk+CisgKiAgPGxpPjxlbT4mRGVsdGE7Uj0gICAmc2lnbWE7STxzdXA+Ujwvc3VwPiAmbWludXM7ICZnYW1tYTtSICZtaW51czsgJm11O1I8L2VtPiA8L2xpPgorICogPC91bD4KKyAqIAorICogICBDb250aW51aW5nIHdpdGggPGVtPiBpID0gSS9QPHN1Yj5sPC9zdWI+PC9lbT4sIHdlIGhhdmU6CisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtTID0gJm11O1A8c3ViPmw8L3N1Yj4gICZtaW51czsgKCZiZXRhOzxzdWI+bDwvc3ViPi9QPHN1Yj5sPC9zdWI+KVNJICsgJmdhbW1hO1IgICZtaW51czsgJm11OyBTPC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtFID0gKCZiZXRhOzxzdWI+bDwvc3ViPi9QPHN1Yj5sPC9zdWI+KVNJICZtaW51czsgJnBoaTtFICAmbWludXM7ICZtdTtFPC9lbT4gPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0kgPHN1cD5SPC9zdXA+ID0gKDEteCkmcGhpO0UgICZtaW51czsgJnNpZ21hO0kgPHN1cD5SPC9zdXA+ICAmbWludXM7ICZtdTtJIDxzdXA+Ujwvc3VwPiA8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0kgPHN1cD5GPC9zdXA+ID0geCZwaGk7RSAgICZtaW51czsgKCZtdTsgKyAmbXU7PHN1Yj5pPC9zdWI+KSBJIDxzdXA+Rjwvc3VwPiA8L2VtPgorICogPC9saT4KKyAqICAgPGxpPjxlbT4mRGVsdGE7Uj0gICAmc2lnbWE7STxzdXA+Ujwvc3VwPiAmbWludXM7ICZnYW1tYTtSICZtaW51czsgJm11O1I8L2VtPiA8L2xpPgorICogPC91bD4KKyAqIAorICogTGV0dGluZworICogPGVtPiZiZXRhOzxzdXA+Kjwvc3VwPiA9ICZiZXRhOzxzdWI+bDwvc3ViPi9QPHN1Yj5sPC9zdWI+ID0gJmJldGE7IChkPHN1Yj5sPC9zdWI+LyhBUEQgKiBQPHN1Yj5sPC9zdWI+KSkKKyAqIDwvZW0+CisgKiBnaXZlczoKKyAqIAorICogPHVsPgorICogPGxpPjxlbT4mRGVsdGE7UyA9ICZtdTtQPHN1Yj5sPC9zdWI+ICAmbWludXM7ICZiZXRhOzxzdXA+Kjwvc3VwPiBTIEkgKyAmZ2FtbWE7UiAgJm1pbnVzOyAmbXU7IFM8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0UgPSAgJmJldGE7PHN1cD4qPC9zdXA+IFMgSSAmbWludXM7ICZwaGk7RSAgJm1pbnVzOyAmbXU7RTwvZW0+IDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJIDxzdXA+Ujwvc3VwPiA9ICgxLXgpJnBoaTtFICZtaW51czsgJnNpZ21hO0kgPHN1cD5SPC9zdXA+ICAmbWludXM7ICZtdTtJIDxzdXA+Ujwvc3VwPiA8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0kgPHN1cD5GPC9zdXA+ID0geCZwaGk7RSAgJm1pbnVzOyAoJm11OyArICZtdTs8c3ViPmk8L3N1Yj4pIEkgPHN1cD5GPC9zdXA+IDwvZW0+CisgKiA8L2xpPgorICogICA8bGk+PGVtPiZEZWx0YTtSPSAgICZzaWdtYTtJPHN1cD5SPC9zdXA+ICZtaW51czsgJmdhbW1hO1IgJm1pbnVzOyAmbXU7UjwvZW0+IDwvbGk+CisgKiA8L3VsPgorICogVFNGCisgKiA8dWw+CisgKiA8bGk+PGVtPlRTRjxzdWI+bDwvc3ViPiA9ICgoUytFK0krUikvQXJlYTxzdWI+bDwvc3ViPikgLyAoUC9BcmVhICogKFMrRStJK1IpKTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+VFNGPHN1Yj5sPC9zdWI+ID0gKDEvQXJlYTxzdWI+bDwvc3ViPikgLyAoUC9BcmVhICk8L2VtPjwvbGk+CisgKiA8bGk+PGVtPlRTRjxzdWI+bDwvc3ViPiA9IEFyZWEgLyAoUCAqQXJlYTxzdWI+bDwvc3ViPiApPC9lbT48L2xpPgorICogPGxpPjxlbT5UU0Y8c3ViPmw8L3N1Yj4gPSAoMSAvIFApKiAoQXJlYS9BcmVhPHN1Yj5sPC9zdWI+ICk8L2VtPjwvbGk+CisgKiA8L3VsPgorICogPGgzPk5laWdoYm9yaW5nIEluZmVjdGlvdXMgUG9wdWxhdGlvbnM8L2gzPgorICogPC9wPgorICogPHVsPgorICogPGxpPjxlbT4mRGVsdGE7UyA9ICZtdTtQPHN1Yj5sPC9zdWI+ICAmbWludXM7ICZiZXRhOzxzdXA+Kjwvc3VwPiBTIChJICsgSTxzdWI+bmVpZ2hib3I8L3N1Yj4oKSApICsgJmdhbW1hO1IgICZtaW51czsgJm11OyBTPC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtFID0gICZiZXRhOzxzdXA+Kjwvc3VwPiBTIChJICsgSTxzdWI+bmVpZ2hib3I8L3N1Yj4oKSApICZtaW51czsgJnBoaTtFICAmbWludXM7ICZtdTtFPC9lbT4gPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0kgPHN1cD5SPC9zdXA+ID0gKDEteCkmcGhpO0UgJm1pbnVzOyAmc2lnbWE7SSA8c3VwPlI8L3N1cD4gICZtaW51czsgJm11O0kgPHN1cD5SPC9zdXA+IDwvZW0+CisgKiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7SSA8c3VwPkY8L3N1cD4gPSB4JnBoaTtFICAmbWludXM7ICgmbXU7ICsgJm11OzxzdWI+aTwvc3ViPikgSSA8c3VwPkY8L3N1cD4gPC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtSPSAgICZzaWdtYTtJPHN1cD5SPC9zdXA+ICZtaW51czsgJmdhbW1hO1IgJm1pbnVzOyAmbXU7UjwvZW0+IDwvbGk+CisgKiA8L3VsPgorICogCisgKiBTcGVjaWZpYyBzdGF0aXN0aWNzIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgYmlydGhzLCBkZWF0aHMgYW5kIGRlYXRocyBkdWUgdG8KKyAqIHRoZSBkaXNlYXNlIGNhbiBiZSBjb21wdXRlZCBieSBhZGRpbmcgdGhlIGFwcHJvcHJpYXRlIHRlcm1zIG9mIHRoZSBlcXVhdGlvbnMKKyAqIGFib3ZlLgorICogPHVsPgorICogPGxpPjxlbT5CPSAmbXU7KFMgKyBFICsgSSArIFIpPC9lbT4sIGlzIHRoZSBudW1iZXIgb2YgPGVtPkJpcnRoczwvZW0+IDwvbGk+CisgKiA8bGk+PGVtPkQgPSAmbXU7UyArICZtdTtFICsgKCZtdTsgKyAmbXU7PHN1Yj5pPC9zdWI+IClJPHN1cD5GPC9zdXA+ICsgJm11O0k8c3VwPlI8L3N1cD4gKyAmbXU7UjwvZW0+LGlzCisgKiB0aGUgdG90YWwgbnVtYmVyIG9mIDxlbT5EZWF0aHM8L2VtPjwvbGk+CisgKiA8bGk+PGVtPkREPSAmbXU7PHN1Yj5pPC9zdWI+IEk8c3VwPkY8L3N1cD48L2VtPiwgaXMgdGhlIG51bWJlciBvZgorICogPGVtPkRpc2Vhc2UgRGVhdGhzPC9lbT4gPC9saT4KKyAqIDwvdWw+CisgKiBAc2VlIFNJUgorICogQHNlZSBTSVJMYWJlbAorICogQHNlZSBTSVJMYWJlbFZhbHVlCisgKiBAc2VlIFNFSVJMYWJlbAorICogQHNlZSBTRUlSTGFiZWxWYWx1ZQorICogCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU0VJUiBleHRlbmRzIFNJUiB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzZWdtZW50IG9mIHRoZSB0eXBlIFVSSSB0aGF0IHByZWZpeGVzIGFsbCBvdGhlciBzZWdtZW50cyBpbiBhCisJICogc3RhbmRhcmQgZGlzZWFzZSBtb2RlbCB0eXBlIFVSSS4KKwkgKi8KKwlTdHJpbmcgVVJJX1RZUEVfU1RBTkRBUkRfU0VJUl9ESVNFQVNFX01PREVMX1NFR01FTlQgPSBVUklfVFlQRV9TVEFOREFSRF9ESVNFQVNFTU9ERUxfU0VHTUVOVAorCQkJKyAiL3NlaXIiOworCisJLyoqCisJICogVGhlIFR5cGUgVVJJIGZvciB0aGUgc3RhbmRhcmQgU0VJUiBkaXNlYXNlIG1vZGVsCisJICovCisJVVJJIFVSSV9UWVBFX1NUQU5EQVJEX1NFSVJfRElTRUFTRV9NT0RFTCA9IFNURU1VUkkKKwkJCS5jcmVhdGVUeXBlVVJJKFVSSV9UWVBFX1NUQU5EQVJEX1NFSVJfRElTRUFTRV9NT0RFTF9TRUdNRU5UKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgaW4gdGhlIDxlbT5FeHBvc2VkPC9lbT4gc3RhdGUKKwkgKiAgICAgICAgIHRoYXQgbW92ZSB0byB0aGUgPGVtPmluZmVjdGlvdXM8L2VtPiBzdGF0ZSwgcGVyIHRpbWUgcGVyaW9kLgorCSAqIEBtb2RlbCBkZWZhdWx0PSIwLjAiCisJICovCisJZG91YmxlIGdldEluY3ViYXRpb25SYXRlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUiNnZXRJbmN1YmF0aW9uUmF0ZSA8ZW0+SW5jdWJhdGlvbiBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5jdWJhdGlvbiBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJbmN1YmF0aW9uUmF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SW5jdWJhdGlvblJhdGUoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIENvbXB1dGUgdGhlIGluY3ViYXRpb24gcmF0ZSBhZGp1c3RlZCBmb3IgYSB0aW1lIGRlbHRhIHBvdGVudGlhbGx5CisJICogZGlmZmVyZW50IGZyb20gdGhlIHRpbWUgcGVyaW9kIHNwZWNpZmllZCBmb3IgdGhlIHJhdGUuCisJICogCisJICogQHBhcmFtIHRpbWVEZWx0YQorCSAqICAgICAgICAgICAgdGhlIHRpbWUgcGVyaW9kIChtaWxsaXNlY29uZHMpIHRvIHdoaWNoIHRoZSByYXRlIGlzIHRvIGJlCisJICogICAgICAgICAgICBhZGp1c3RlZC4KKwkgKiBAcmV0dXJuIHRoZSBhZGp1c3RlZCByYXRlCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCWRvdWJsZSBnZXRBZGp1c3RlZEluY3ViYXRpb25SYXRlKGZpbmFsIGxvbmcgdGltZURlbHRhKTsKKworfSAvLyBTRUlSCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TRUlSTGFiZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1NFSVJMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNjllNTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TRUlSTGFiZWwuamF2YQpAQCAtMCwwICsxLDIxOCBAQAorLy8gU0VJUkxhYmVsLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CisKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgY2xhc3MgaW4gYW4gRU1GIG1vZGVsIGZvciBhIHN0YW5kYXJkIFNFSVIgZGlzZWFzZQorICogbW9kZWwgZHluYW1pYyBsYWJlbC4KKyAqIAorICogQHNlZSBTdGFuZGFyZERpc2Vhc2VNb2RlbAorICogQHNlZSBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsCisgKiBAc2VlIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZQorICogQHNlZSBTSQorICogQHNlZSBTSUxhYmVsCisgKiBAc2VlIFNJTGFiZWxWYWx1ZQorICogQHNlZSBTSVIKKyAqIEBzZWUgU0lSTGFiZWwKKyAqIEBzZWUgU0lSTGFiZWxWYWx1ZQorICogQHNlZSBTRUlSCisgKiBAc2VlIFNFSVJMYWJlbFZhbHVlCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNFSVJMYWJlbCBleHRlbmRzIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgeworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsdGEgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbHRhIFZhbHVlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbHRhIFZhbHVlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXREZWx0YVZhbHVlKFNFSVJMYWJlbFZhbHVlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRTRUlSTGFiZWxfRGVsdGFWYWx1ZSgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCVNFSVJMYWJlbFZhbHVlIGdldERlbHRhVmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWwjZ2V0RGVsdGFWYWx1ZSA8ZW0+RGVsdGEgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlbHRhIFZhbHVlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXREZWx0YVZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREZWx0YVZhbHVlKFNFSVJMYWJlbFZhbHVlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2JlIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9iZSBWYWx1ZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9iZSBWYWx1ZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UHJvYmVWYWx1ZShTRUlSTGFiZWxWYWx1ZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U0VJUkxhYmVsX1Byb2JlVmFsdWUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTRUlSTGFiZWxWYWx1ZSBnZXRQcm9iZVZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsI2dldFByb2JlVmFsdWUgPGVtPlByb2JlIFZhbHVlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9iZSBWYWx1ZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UHJvYmVWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UHJvYmVWYWx1ZShTRUlSTGFiZWxWYWx1ZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW1wIFZhbHVlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbXAgVmFsdWU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFRlbXBWYWx1ZShTRUlSTGFiZWxWYWx1ZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U0VJUkxhYmVsX1RlbXBWYWx1ZSgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCVNFSVJMYWJlbFZhbHVlIGdldFRlbXBWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbCNnZXRUZW1wVmFsdWUgPGVtPlRlbXAgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRlbXAgVmFsdWU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFRlbXBWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VGVtcFZhbHVlKFNFSVJMYWJlbFZhbHVlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0T3JpZ2luYWxWYWx1ZShTRUlSTGFiZWxWYWx1ZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U0VJUkxhYmVsX09yaWdpbmFsVmFsdWUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTRUlSTGFiZWxWYWx1ZSBnZXRPcmlnaW5hbFZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsI2dldE9yaWdpbmFsVmFsdWUgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0T3JpZ2luYWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0T3JpZ2luYWxWYWx1ZShTRUlSTGFiZWxWYWx1ZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FcnJvciBTY2FsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXJyb3IgU2NhbGU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXJyb3IgU2NhbGU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEVycm9yU2NhbGUoU0VJUkxhYmVsVmFsdWUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFNFSVJMYWJlbF9FcnJvclNjYWxlKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU0VJUkxhYmVsVmFsdWUgZ2V0RXJyb3JTY2FsZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbCNnZXRFcnJvclNjYWxlIDxlbT5FcnJvciBTY2FsZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXJyb3IgU2NhbGU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEVycm9yU2NhbGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEVycm9yU2NhbGUoU0VJUkxhYmVsVmFsdWUgdmFsdWUpOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdG9wLWxldmVsIHNlZ21lbnQgZm9yIGFsbCB0eXBlIFVSSSdzIGZvciBTRUlSIGRpc2Vhc2UgbW9kZWwKKwkgKiBsYWJlbHMuCisJICovCisJU3RyaW5nIFVSSV9UWVBFX1NFSVJfTEFCRUxfU0VHTUVOVCA9IFVSSV9UWVBFX1NUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfU0VHTUVOVAorCQkJKyAiL3NlaXIiOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdHlwZSBVUkkgZm9yIHN0YW5kYXJkIFNFSVIgZGlzZWFzZSBsYWJlbHMKKwkgKi8KKwlVUkkgVVJJX1RZUEVfU0VJUl9MQUJFTCA9IFNURU1VUkkKKwkJCS5jcmVhdGVUeXBlVVJJKFVSSV9UWVBFX1NFSVJfTEFCRUxfU0VHTUVOVCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IG51bWJlciBvZiAiZXhwb3NlZCIgcG9wdWxhdGlvbiBtZW1iZXJzCisJICovCisJcHVibGljIGRvdWJsZSBnZXRFKCk7CisKKwkvKioKKwkgKiBAcGFyYW0gZQorCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgbnVtYmVyIG9mICJleHBvc2VkIiBwb3B1bGF0aW9uCisJICogICAgICAgICAgICBtZW1iZXJzCisJICovCisJcHVibGljIHZvaWQgc2V0RShkb3VibGUgZSk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuZXh0IG51bWJlciBvZiAiZXhwb3NlZCIgcG9wdWxhdGlvbiBtZW1iZXJzCisJICovCisJcHVibGljIGRvdWJsZSBnZXROZXh0RSgpOworCisJLyoqCisJICogQHBhcmFtIGUKKwkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBuZXh0IG51bWJlciBvZiAiZXhwb3NlZCIgcG9wdWxhdGlvbgorCSAqICAgICAgICAgICAgbWVtYmVycworCSAqLworCXB1YmxpYyB2b2lkIHNldE5leHRFKGRvdWJsZSBlKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgU0VJUiBsYWJlbCB2YWx1ZQorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKKwkgKi8KKwlTRUlSTGFiZWxWYWx1ZSBnZXRDdXJyZW50U0VJUlZhbHVlKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuZXh0IFNFSVIgbGFiZWwgdmFsdWUKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCisJICovCisJU0VJUkxhYmVsVmFsdWUgZ2V0TmV4dFNFSVJWYWx1ZSgpOworCit9IC8vIFNFSVJMYWJlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU0VJUkxhYmVsVmFsdWUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1NFSVJMYWJlbFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxMWE0NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1NFSVJMYWJlbFZhbHVlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLy8gU0VJUkxhYmVsVmFsdWUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBjbGFzcyBpbiBhbiBFTUYgbW9kZWwgZm9yIGFuIFNFSVIgZGlzZWFzZSBtb2RlbAorICogbGFiZWwgdmFsdWUuIFRoZSB2YWx1ZXMgb2YgdGhpcyBsYWJlbCByZWNvcmQgdGhlIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMKKyAqIHdobyBhcmUgaW4gb25lIG9mIGZvdXIgc3RhdGVzIHdpdGggcmVwc2VjdCB0byBhIHBhcnRpY3VsYXIgZGlzZWFzZS4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+U3VzY2VwdGlibGU8L2VtPiB3aGljaCBtZWFucyB0aGF0IHRoZXkgYXJlIG5vdCBpbmZlY3RlZCBieSB0aGUKKyAqIGRpc2Vhc2UsIGJ1dCB0aGV5IGNhbiBiZWNvbWUgZXhwb3NlZCAoYW5kIGxhdGVyIGluZmVjdGVkKSB0byB0aGUgZGlzZWFzZS48L2xpPgorICogPGxpPjxlbT5FeHBvc2VkPC9lbT4gd2hpY2ggbWVhbnMgdGhhdCB0aGV5IGFyZSBpbmZlY3RlZCB3aXRoIHRoZSBkaXNlYXNlLAorICogYnV0IGFyZSBub3QgeWV0IGluZmVjdGlvdXMgdG8gb3RoZXJzLiA8L2xpPgorICogPGxpPjxlbT5JbmZlY3Rpb3VzPC9lbT4gd2hpY2ggbWVhbnMgdGhhdCBwb3B1bGF0aW9uIG1lbWJlcnMgYXJlIGluZmVjdGVkCisgKiB3aXRoIHRoZSBkaXNlYXNlIGFuZCB0aGV5IGNhbiBpbmZlY3Qgb3RoZXJzLiA8L2xpPgorICogPGxpPjxlbT5SZWNvdmVyZWQ8L2VtPiB3aGljaCBtZWFucyB0aGF0IHBvcHVsYXRpb24gbWVtYmVycyBhcmUgbm90CisgKiBpbmZlY3RlZCB3aXRoIHRoZSBkaXNlYXNlIGFuZCA8ZW0+Y2Fubm90PC9lbT4gYmVjb21lIGluZmVjdGVkIGJ5IHRoZQorICogZGlzZWFzZS4gTm90ZSB0aGF0IGluIHNvbWUgZGlzZWFzZSBtb2RlbHMgYSBwb3B1bGF0aW9uIG1lbWJlciBpbiB0aGUKKyAqIDxlbT5SZWNvdmVyZWQ8L2VtPiBzdGF0ZSBjb3VsZCB0cmFuc2l0aW9uIHRvIHRoZSA8ZW0+U3VzY2VwdGlibGU8L2VtPgorICogc3RhdGUgYW5kIHRoZW4gYmVjb21lIGEgY2FuZGlkYXRlIGZvciByZS1pbmZlY3Rpb24uPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIFN1Yi1jbGFzc2VzIGNvdWxkIGludHJvZHVjZSBhZGRpdGlvbmFsIHN0YXRlcyBpbiB3aGljaCBwb3B1bGF0aW9uIG1lbWJlcnMKKyAqIGNvdWxkIGV4aXN0LgorICogPC9wPgorICogCisgKiBAc2VlIFNJUgorICogQHNlZSBTSVJMYWJlbAorICogQHNlZSBTSVJMYWJlbFZhbHVlCisgKiBAc2VlIFNFSVIKKyAqIEBzZWUgU0VJUkxhYmVsCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNFSVJMYWJlbFZhbHVlIGV4dGVuZHMgU0lSTGFiZWxWYWx1ZSB7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcG9wdWxhdGlvbiBtZW1iZXJzIGluIHRoZSA8ZW0+RXhwb3NlZDwvZW0+IHN0YXRlLgorCSAqIEBtb2RlbAorCSAqLworCWRvdWJsZSBnZXRFKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsVmFsdWUjZ2V0RSA8ZW0+RTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEUoZG91YmxlIHZhbHVlKTsKKworfSAvLyBTRUlSTGFiZWxWYWx1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU0kuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1NJLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2OWEzMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1NJLmphdmEKQEAgLTAsMCArMSw1ODUgQEAKKy8vIFNJLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworCisvKioKKyAqIEEge0BsaW5rIERpc2Vhc2VNb2RlbH0gd2l0aCB0d28gc3RhdGVzIDxlbT5TdXNjZXB0aWJsZTwvZW0+IGFuZAorICogPGVtPkluZmVjdGlvdXM8L2VtPiAoU0kpLgorICogCisgKiA8cD4KKyAqIFRoZSBiYXNpYyA8ZW0+U0k8L2VtPiAoU3VzY2VwdGlibGUsIEluZmVjdGlvdXMpIGRpc2Vhc2UgbW9kZWwgYXNzdW1lcyBhCisgKiB1bmlmb3JtIHBvcHVsYXRpb24gYXQgYSBzaW5nbGUgbG9jYXRpb24gYW5kIHRoYXQgdGhlIHBvcHVsYXRpb24gbWVtYmVycyBhcmUKKyAqIHdlbGwgIm1peGVkIiwgbWVhbmluZyB0aGF0IHRoZXkgYXJlIGVxdWFsbHkgbGlrZWx5IHRvIG1lZXQgYW5kIGluZmVjdCBlYWNoCisgKiBvdGhlci4gVGhpcyBtb2RlbCwgZm9yIGEgbm9ybWFsaXplZCBwb3B1bGF0aW9uLCBpcyBkZWZpbmVkIGJ5IHRoZSB0d28KKyAqIGVxdWF0aW9ucyBiZWxvdzoKKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO3MgPSAmbXU7ICAmbWludXM7ICZiZXRhO3MgaSArICZzaWdtYTtpICZtaW51czsgJm11O3M8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO2kgPSAmYmV0YTtzIGkgJm1pbnVzOyAmc2lnbWE7aSAgJm1pbnVzOyAgCWk8L2VtPiA8L2xpPgorICogPC91bD4KKyAqIDxwPgorICogV2hlcmU6CisgKiA8dWw+CisgKiA8bGk+PGVtPnM8L2VtPiBpcyB0aGUgbm9ybWFsaXplZCA8ZW0+U3VzY2VwdGlibGU8L2VtPiBwb3B1bGF0aW9uIDwvbGk+CisgKiA8bGk+IDxlbT5pPC9lbT4gaXMgdGhlIG5vcm1hbGl6ZWQgPGVtPkluZmVjdGlvdXM8L2VtPiBwb3B1bGF0aW9uPC9saT4KKyAqIDxsaT4mbXU7IGlzIHRoZSBiYWNrZ3JvdW5kIG1vcnRhbGl0eSByYXRlLCBhbmQsIGJlY2F1c2UgaXQgaXMgYXNzdW1lZCB0aGF0CisgKiB0aGUgcG9wdWxhdGlvbiB3YXMgbm90IGdyb3dpbmcgb3Igc2hyaW5raW5nIHNpZ25pZmljYW50bHkgYmVmb3JlIHRoZSBvbnNldCBvZgorICogdGhlIGRpc2Vhc2UsICZtdTsgaXMgYWxzbyBhc3N1bWVkIHRvIGJlIHRoZSBiaXJ0aCByYXRlLiA8L2xpPgorICogPGxpPiA8ZW0+JmJldGE7PC9lbT4gaXMgdGhlIGRpc2Vhc2UgdHJhbnNtaXNzaW9uIChpbmZlY3Rpb24pIHJhdGUuIFRoaXMKKyAqIGNvZWZmaWNpZW50IGRldGVybWluZXMgdGhlIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgdGhhdCBiZWNvbWUKKyAqIGluZmVjdGVkL2V4cG9zZWQgcGVyIHBvcHVsYXRpb24gbWVtYmVyIGluIHRoZSA8ZW0+SW5mZWN0aW91czwvZW0+IHN0YXRlLAorICogYXNzdW1pbmcgdGhlIGVudGlyZSBwb3B1bGF0aW9uIGlzIGluIHRoZSA8ZW0+U3VzY2VwdGlibGU8L2VtPiBzdGF0ZS4gPC9saT4KKyAqIDxsaT4gJnNpZ21hOyBpcyB0aGUgPGVtPkluZmVjdGlvdXM8L2VtPiByZWNvdmVyeSByYXRlLiBUaGlzIGNvZWZmaWNpZW50CisgKiBkZXRlcm1pbmVzIHRoZSByYXRlIGF0IHdoaWNoIDxlbT5JbmZlY3Rpb3VzPC9lbT4gcG9wdWxhdGlvbiBtZW1iZXJzCisgKiA8ZW0+UmVjb3ZlcjwvZW0+LiBJbiB0aGlzIG1vZGVsIDxlbT5yZWNvdmVyeTwvZW0+IG1lYW5zIGJlY29taW5nCisgKiA8ZW0+U3VzY2VwdGlibGU8L2VtPiBhZ2Fpbi48L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIDxwPgorICogSW4gdGhlIGZpcnN0IGVxdWF0aW9uLCB0aGUgPGVtPlN1c2NlcHRpYmxlPC9lbT4gcG9wdWxhdGlvbiBpbmNyZWFzZXMgd2hlbgorICogbmV3IG1lbWJlcnMgYXJlIGJvcm4uIFRoaXMgdmFsdWUgaXMgdGhlIGJpcnRoIHJhdGUgJm11OyBtdWx0aXBsaWVkIGJ5IHRoZQorICogdG90YWwgcG9wdWxhdGlvbiwgd2hpY2gsIGJlY2F1c2UgdGhlIHZhbHVlcyBhcmUgbm9ybWFsaXplZCwgaXMgMS4gSXQgYWxzbworICogaW5jcmVhc2VzIGR1ZSB0byA8ZW0+SW5mZWN0aW91czwvZW0+IHBvcHVsYXRpb24gbWVtYmVycyByZWNvdmVyaW5nLiBUaGUKKyAqIDxlbT5TdXNjZXB0aWJsZTwvZW0+IHBvcHVsYXRpb24gZGVjcmVhc2VzIGJ5IG1lbWJlcnMgd2hvIGRpZS4gVGhhdCB2YWx1ZSBpcworICogJm11OywgdGhlIG1vcnRhbGl0eSByYXRlLCBtdWx0aXBsaWVkIGJ5IHRoZSA8ZW0+U3VzY2VwdGlibGU8L2VtPgorICogcG9wdWxhdGlvbiwgPGVtPnM8L2VtPi4gVGhlIDxlbT5TdXNjZXB0aWJsZTwvZW0+IHBvcHVsYXRpb24gYWxzbworICogZGVjcmVhc2VzIGJ5IGhhdmluZyBtZW1iZXJzIGJlY29tZSA8ZW0+aW5mZWN0ZWQ8L2VtPi4gVGhlIHByb2R1Y3Qgb2YKKyAqIDxlbT4mYmV0YTs8L2VtPiBhbmQgPGVtPmk8L2VtPiBnaXZlcyB0aGUgbm9ybWFsaXplZCBudW1iZXIgb2YKKyAqIDxlbT5TdXNjZXB0aWJsZTwvZW0+IHBvcHVsYXRpb24gbWVtYmVycyB0aGF0IHdvdWxkIGJlY29tZSBpbmZlY3RlZCBmb3IgZWFjaAorICogPGVtPkluZmVjdGlvdXM8L2VtPiBwb3B1bGF0aW9uIG1lbWJlciBhc3N1bWluZyBhbGwgcG9wdWxhdGlvbiBtZW1iZXJzIGFyZQorICogaW4gdGhlIDxlbT5TdXNjZXB0aWJsZTwvZW0+IHN0YXRlLiBNdWx0aXBseWluZyB0aGF0IGJ5IDxlbT5zPC9lbT4sIHRoZQorICogZnJhY3Rpb24gdGhhdCBhY3R1YWxseSBhcmUgPGVtPlN1c2NlcHRpYmxlPC9lbT4sIGdpdmVzIHRoZSBub3JtYWxpemVkCisgKiBhbW91bnQgdGhhdCBiZWNvbWUgPGVtPkluZmVjdGlvdXM8L2VtPi4KKyAqIDwvcD4KKyAqIDxwPgorICogSW4gdGhlIHNlY29uZCBlcXVhdGlvbiwgdGhlIDxlbT5JbmZlY3Rpb3VzPC9lbT4gcG9wdWxhdGlvbiBpbmNyZWFzZXMgYnkgdGhlCisgKiBudW1iZXIgb2YgPGVtPlN1c2NlcHRpYmxlPC9lbT4gcG9wdWxhdGlvbiBtZW1iZXJzIHRoYXQgYmVjb21lCisgKiA8ZW0+SW5mZWN0aW91czwvZW0+ICh0aGUgZmlyc3QgdGVybSkuIEl0IGFsc28gZGVjcmVhc2VzIGJ5IHRoZSBwcm9wb3J0aW9uCisgKiB0aGF0IDxlbT5SZWNvdmVyPC9lbT4gZnJvbSB0aGUgZGlzZWFzZSAobWlkZGxlIHRlcm0pIGFuZCBieSB0aGUgcHJvcG9ydGlvbgorICogdGhhdCBkaWUgKGxhc3QgdGVybSkuCisgKiA8L3A+CisgKiA8cD4KKyAqIEZyZXF1ZW50bHksIGJlaW5nIGluZmVjdGVkIGJ5IGEgZGlzZWFzZSB3aWxsIGluY3JlYXNlIHRoZSBsaWtlbGlob29kIHRoYXQgYQorICogcG9wdWxhdGlvbiBtZW1iZXIgd2lsbCBkaWUuIFRoZSBtb2RlbCBhYm92ZSBuZWVkcyB0byBiZSBlbmhhbmNlZCB0byBpbmNsdWRlCisgKiB0aGUgbGlrZWxpaG9vZCBvZiBhIGZhdGFsIGluZmVjdGlvbiBhbmQgYSBwb3RlbnRpYWxseSBkaWZmZXJlbnQgcmF0ZSBhdCB3aGljaAorICogaW5mZWN0ZWQgbWVtYmVycyBkaWUuCisgKiA8L3A+CisgKiA8cD4KKyAqIExldAorICogPHVsPgorICogPGxpPjxlbT54PC9lbT4gYmUgdGhlIDxlbT5JbmZlY3Rpb3VzIE1vcnRhbGl0eTwvZW0+IHdoaWNoIGlzIHRoZQorICogcHJvcG9ydGlvbiBvZiB0aGUgcG9wdWxhdGlvbiBtZW1iZXJzIHdobyBiZWNvbWUgPGVtPkluZmVjdGlvdXM8L2VtPiB0aGF0CisgKiB3aWxsIGV2ZW50dWFsbHkgZGllLjwvbGk+CisgKiA8bGk+PGVtPiZtdTs8c3ViPmk8L3N1Yj48L2VtPiBiZSB0aGUgPGVtPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2VtPi4KKyAqIFRoaXMgaXMgdGhlIHJhdGUgYXQgd2hpY2ggZmF0YWxseSBpbmZlY3RlZCBwb3B1bGF0aW9uIG1lbWJlcnMgZGllCisgKiBzcGVjaWZpY2FsbHkgZHVlIHRvIHRoZSBkaXNlYXNlLiA8L2xpPgorICogPC91bD4KKyAqIFRodXMsIHdlIG5vdyBoYXZlIHR3byB0eXBlcyBvZiA8ZW0+SW5mZWN0aW91czwvZW0+IHBvcHVsYXRpb24gbWVtYmVycywKKyAqIHRob3NlIHRoYXQgd2lsbCBldmVudHVhbGx5IHJlY292ZXIgYXQgcmF0ZSA8ZW0+JnNpZ21hOzwvZW0+LCBhbmQgdGhvc2UKKyAqIHRoYXQgd2lsbCBldmVudHVhbGx5IGRpZSBhdCByYXRlIDxlbT4mbXU7PHN1Yj5pPC9zdWI+PC9lbT4gKG9mIGNvdXJzZSwKKyAqIG1lbWJlcnMgaW4gYm90aCBzdGF0ZXMgc3RpbGwgZGllIGF0IHRoZSBiYWNrZ3JvdW5kIHJhdGUgPGVtPiZtdTs8L2VtPikuCisgKiA8L3A+CisgKiA8cD4KKyAqIExldAorICogPHVsPgorICogPGxpPjxlbT4gaSA8c3VwPlI8L3N1cD48L2VtPiBiZSB0aGUgbm9ybWFsaXplZCBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gdGhhdAorICogd2lsbCByZWNvdmVyLjwvbGk+CisgKiA8bGk+PGVtPiBpIDxzdXA+Rjwvc3VwPjwvZW0+IGJlIHRoZSBub3JtYWxpemVkIGluZmVjdGlvdXMgcG9wdWxhdGlvbiB0aGF0CisgKiB3aWxsIGRpZSBmcm9tIHRoZSBkaXNlYXNlLjwvbGk+CisgKiA8bGk+PGVtPiBpID0gaSA8c3VwPlI8L3N1cD4gKyAgaSA8c3VwPkY8L3N1cD48L2VtPiBiZSB0aGUgdG90YWwgbm9ybWFsaXplZAorICogaW5mZWN0aW91cyBwb3B1bGF0aW9uIChhcyBiZWZvcmUpLjwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogCisgKiA8cD4KKyAqIFdlIG1vZGlmeSBvdXIgbW9kZWwgdG8gaW5jbHVkZSB0aGVzZSBhZGRpdGlvbmFsIHN0YXRlcyBhbmQgcmF0ZXMuCisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtzID0gJm11OyAgJm1pbnVzOyAmYmV0YTtzIGkgKyAmc2lnbWE7aSA8c3VwPlI8L3N1cD4gICZtaW51czsgJm11OyBzPC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtpIDxzdXA+Ujwvc3VwPiA9ICgxLXgpJmJldGE7cyBpICZtaW51czsgJnNpZ21hO2kgPHN1cD5SPC9zdXA+ICAmbWludXM7ICZtdTtpIDxzdXA+Ujwvc3VwPjwvZW0+CisgKiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7aSA8c3VwPkY8L3N1cD4gPSB4ICZiZXRhO3MgaSAmbWludXM7ICgmbXU7ICsgJm11OzxzdWI+aTwvc3ViPikgaSA8c3VwPkY8L3N1cD48L2VtPgorICogPC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiA8aDM+U3BhdGlhbCBBZGFwdGF0aW9uPC9oMz4KKyAqIDxwPgorICogVGhlICJTSSIgZGlzZWFzZSBtb2RlbCBjb21wdXRhdGlvbnMgaW4gU1RFTSBlbmhhbmNlIHRoZXNlIGVxdWF0aW9ucyBieQorICogYWRhcHRpbmcgdGhlbSB0byBwb3B1bGF0aW9ucyB0aGF0IGFyZSBzcGF0aWFsbHkgZGlzdHJpYnV0ZWQuIFRoaXMgcmVsYXhlcyB0aGUKKyAqIGFzc3VtcHRpb24gdGhhdCB0aGUgcG9wdWxhdGlvbnMgYXJlIGF0IGEgc2luZ2xlIGxvY2F0aW9uIGFuZCBvcGVucyB1cCB0aGUKKyAqIHBvc3NpYmlsaXR5IHRoYXQgZGlmZmVyZW50IGxvY2F0aW9ucyBjb3VsZCBoYXZlIGRpZmZlcmVudCBhcmVhcyBhbmQgbnVtYmVycworICogb2YgcG9wdWxhdGlvbiBtZW1iZXJzIChpLmUuLCBkaWZmZXJlbnQgcG9wdWxhdGlvbiBkZW5zaXRpZXMpLiBUbyBhY2NvbW1vZGF0ZQorICogdGhpcyBzaXR1YXRpb24gU1RFTSBtYWludGFpbnMgc2VwYXJhdGUgZGlzZWFzZSBzdGF0ZSB2YWx1ZXMgZm9yIGVhY2ggbG9jYXRpb24KKyAqIGFuZCB1c2VzIHVubm9ybWFsaXplZCB2ZXJzaW9ucyBvZiB0aGUgZXF1YXRpb25zIHByZXNlbnRlZCBhYm92ZS4gV2UgZGV2ZWxvcAorICogdGhvc2UgYmVsb3cuCisgKiA8cD4KKyAqIFRvIGFjY291bnQgZm9yIHBvcHVsYXRpb24gZGlmZmVyZW5jZXMgYXQgZGlmZmVyZW50IGxvY2F0aW9ucywgd2UgZGVmaW5lIGEgbmV3CisgKiBwYXJhbWV0ZXIgPGVtPlA8c3ViPmw8L3N1Yj48L2VtPiB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHBvcHVsYXRpb24KKyAqIG1lbWJlcnMgYXQgbG9jYXRpb24gPGVtPmw8L2VtPiAoTm90ZTogPGVtPlA8c3ViPmw8L3N1Yj4gPSBTICsgSTwvZW0+KS4KKyAqIFdlIGFsc28gbmVlZCB0byBhY2NvdW50IGZvciB2YXJpYWJpbGl0eSBpbiB0aGUgZGlzZWFzZSB0cmFuc21pc3Npb24KKyAqIChpbmZlY3Rpb24pIHJhdGUsICZiZXRhOywgZHVlIHRvIHBvdGVudGlhbGx5IGRpZmZlcmVudCBwb3B1bGF0aW9uIGRlbnNpdGllcy4KKyAqIFRoaXMgbW9kaWZpY2F0aW9uIGlzIGJhc2VkIHVwb24gdGhlIGFzc3VtcHRpb24gdGhhdCBsb2NhdGlvbnMgd2l0aCBncmVhdGVyCisgKiBwb3B1bGF0aW9uIGRlbnNpdGllcyB3aWxsIGhhdmUgYSBoaWdoZXIgZWZmZWN0aXZlIHRyYW5zbWlzc2lvbiByYXRlcyB0aGFuCisgKiBsb2NhdGlvbnMgd2l0aCBsb3dlciBkZW5zaXRpZXMgKGkuZS4sIG9uZSB2YWx1ZSBjYW4ndCBiZSB1c2VkIGZvciBhbGwKKyAqIGxvY2F0aW9ucykuIFRodXMsIHdlIG5lZWQgdG8gcmVwbGFjZSB0aGUgPGVtPiZiZXRhOzwvZW0+IGluIHRoZSBub24tc3BhdGlhbAorICogdmVyc2lvbnMgb2YgdGhlIGVxdWF0aW9ucyB3aXRoIGEgPGVtPiZiZXRhOyA8c3ViPmw8L3N1Yj48L2VtPiB0aGF0IGlzCisgKiBzcGVjaWZpYyB0byB0aGUgbG9jYXRpb24uCisgKiA8L3A+CisgKiBNYWtpbmcgdGhlIHN1YnN0aXR1dGlvbiBmb3IgPGVtPiZiZXRhOzwvZW0+IGFuZCBtdWx0aXBseSBib3RoIHNpZGVzIG9mIHRoZQorICogZXF1YXRpb25zIGJ5IDxlbT5QPHN1Yj5sPC9zdWI+PC9lbT4sIHdlIG9idGFpbjoKKyAqIDwvcD4KKyAqIAorICogPHVsPgorICogPGxpPjxlbT4mRGVsdGE7cyBQPHN1Yj5sPC9zdWI+PSAmbXU7UDxzdWI+bDwvc3ViPiAgJm1pbnVzOyAmYmV0YTs8c3ViPmw8L3N1Yj4gcyBpIFA8c3ViPmw8L3N1Yj4gKyAmc2lnbWE7IGkgPHN1cD5SPC9zdXA+UDxzdWI+bDwvc3ViPiAgJm1pbnVzOyAmbXU7IHMgUDxzdWI+bDwvc3ViPjwvZW0+CisgKiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7aSA8c3VwPlI8L3N1cD4gUDxzdWI+bDwvc3ViPiA9ICgxLXgpJmJldGE7PHN1Yj5sPC9zdWI+IHMgaSBQPHN1Yj5sPC9zdWI+ICZtaW51czsgJnNpZ21hOyBpIDxzdXA+Ujwvc3VwPiBQPHN1Yj5sPC9zdWI+ICZtaW51czsgJm11O2kgPHN1cD5SPC9zdXA+IFA8c3ViPmw8L3N1Yj48L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO2kgPHN1cD5GPC9zdXA+IFA8c3ViPmw8L3N1Yj4gPSB4ICZiZXRhOzxzdWI+bDwvc3ViPnMgaSBQPHN1Yj5sPC9zdWI+ICZtaW51czsgKCZtdTsgKyAmbXU7PHN1Yj5pPC9zdWI+KSBpIDxzdXA+Rjwvc3VwPiBQPHN1Yj5sPC9zdWI+PC9lbT4KKyAqIDwvbGk+CisgKiA8L3VsPgorICogCisgKiBXZSBjaG9vc2UgdGhlIHZhbHVlIGZvciA8ZW0+JmJldGE7PHN1Yj5sPC9zdWI+PC9lbT4gdG8gYmUgb3JpZ2luYWwKKyAqIDxlbT4mYmV0YTs8L2VtPiBzY2FsZWQgYnkgdGhlIHJhdGlvIGJldHdlZW4gdGhlIHBvcHVsYXRpb24gZGVuc2l0eSBhdCB0aGUKKyAqIGxvY2F0aW9uIGFuZCB0aGUgYXZlcmFnZSBwb3B1bGF0aW9uIGRlbnNpdHkgb2YgYWxsIGxvY2F0aW9ucy4KKyAqIDx1bD4KKyAqIDxsaT4gPGVtPiAmYmV0YTs8c3ViPmw8L3N1Yj4gPSAmYmV0YTsgZDxzdWI+bDwvc3ViPi9BUEQ8L2VtPjwvbGk+CisgKiA8L3VsPgorICogV2hlcmUgPGVtPmQ8c3ViPmw8L3N1Yj48L2VtPiBpcyB0aGUgcG9wdWxhdGlvbiBkZW5zaXR5IGF0IGxvY2F0aW9uCisgKiA8ZW0+bDwvZW0+LCBhbmQgPGVtPkFQRDwvZW0+IGlzIHRoZSBhdmVyYWdlIHBvcHVsYXRpb24gZGVuc2l0eSBmb3IgYWxsCisgKiBsb2NhdGlvbnMuCisgKiAKKyAqIAorICogCisgKiAKKyAqIDxwPgorICogTGV0IDxlbT5TPHN1Yj5sPC9zdWI+ID0gcyBQPHN1Yj5sPC9zdWI+PC9lbT4gYmUgdGhlIG51bWJlciBvZgorICogPGVtPlN1c2NlcHRpYmxlPC9lbT4gcG9wdWxhdGlvbiBtZW1iZXJzIGF0IGxvY2F0aW9uIDxlbT5sPC9lbT4uICwgbGV0CisgKiA8ZW0+STxzdWI+bDwvc3ViPiA9IGkgUDxzdWI+bDwvc3ViPjwvZW0+IGJlIHRoZSBudW1iZXIgb2YgcG9wdWxhdGlvbgorICogbWVtYmVycyBhdCBsb2NhdGlvbiA8ZW0+bDwvZW0+IHRoYXQgYXJlIDxlbT5JbmZlY3Rpb3VzPC9lbT4gKGJvdGggc3RhdGVzCisgKiBjb21iaW5lZCkuIEZvciByZWFkYWJpbGl0eSwgd2UgZHJvcCB0aGUgPGVtPmw8L2VtPiBzdWJzY3JpcHQgYW5kCisgKiBzdWJzdGl0dXRlLgorICogPC9wPgorICogCisgKiAKKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO1MgPSAmbXU7UDxzdWI+bDwvc3ViPiAgJm1pbnVzOyAmYmV0YTs8c3ViPmw8L3N1Yj4gUyBpICsgJnNpZ21hO0kgPHN1cD5SPC9zdXA+ICAmbWludXM7ICZtdTsgUzwvZW0+CisgKiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7SSA8c3VwPlI8L3N1cD4gPSAoMS14KSZiZXRhOzxzdWI+bDwvc3ViPiBTIGkgJm1pbnVzOyAmc2lnbWE7SSA8c3VwPlI8L3N1cD4gJm1pbnVzOyAmbXU7SSA8c3VwPlI8L3N1cD4gPC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJIDxzdXA+Rjwvc3VwPiA9IHggJmJldGE7PHN1Yj5sPC9zdWI+UyBpICAmbWludXM7ICgmbXU7ICsgJm11OzxzdWI+aTwvc3ViPikgSSA8c3VwPkY8L3N1cD4gPC9lbT4KKyAqIDwvbGk+CisgKiA8L3VsPgorICogCisgKiBDb250aW51aW5nIHdpdGggPGVtPiBpID0gSS9QPHN1Yj5sPC9zdWI+PC9lbT4sIHdlIGhhdmU6CisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtTID0gJm11O1A8c3ViPmw8L3N1Yj4gICZtaW51czsgKCZiZXRhOzxzdWI+bDwvc3ViPi9QPHN1Yj5sPC9zdWI+KSBTIEkgKyAmc2lnbWE7SSA8c3VwPlI8L3N1cD4gICZtaW51czsgJm11OyBTPC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJIDxzdXA+Ujwvc3VwPiA9ICgxLXgpKCZiZXRhOzxzdWI+bDwvc3ViPi9QPHN1Yj5sPC9zdWI+KSBTIEkgJm1pbnVzOyAmc2lnbWE7SSA8c3VwPlI8L3N1cD4gICZtaW51czsgJm11O0kgPHN1cD5SPC9zdXA+IDwvZW0+CisgKiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7SSA8c3VwPkY8L3N1cD4gPSB4ICgmYmV0YTs8c3ViPmw8L3N1Yj4vUDxzdWI+bDwvc3ViPikgUyBJICAmbWludXM7ICgmbXU7ICsgJm11OzxzdWI+aTwvc3ViPikgSSA8c3VwPkY8L3N1cD4gPC9lbT4KKyAqIDwvbGk+CisgKiA8L3VsPgorICogCisgKiBMZXR0aW5nCisgKiA8ZW0+JmJldGE7PHN1cD4qPC9zdXA+ID0gJmJldGE7PHN1Yj5sPC9zdWI+L1A8c3ViPmw8L3N1Yj4gPSAmYmV0YTsgKGQ8c3ViPmw8L3N1Yj4vKEFQRCAqIFA8c3ViPmw8L3N1Yj4pKQorICogPC9lbT4KKyAqIGdpdmVzOgorICogCisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtTID0gJm11O1A8c3ViPmw8L3N1Yj4gICZtaW51czsgJmJldGE7PHN1cD4qPC9zdXA+IFMgSSArICZzaWdtYTtJIDxzdXA+Ujwvc3VwPiAgJm1pbnVzOyAmbXU7IFM8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0kgPHN1cD5SPC9zdXA+ID0gKDEteCkmYmV0YTs8c3VwPio8L3N1cD4gUyBJICZtaW51czsgJnNpZ21hO0kgPHN1cD5SPC9zdXA+ICAmbWludXM7ICZtdTtJIDxzdXA+Ujwvc3VwPiA8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0kgPHN1cD5GPC9zdXA+ID0geCAmYmV0YTs8c3VwPio8L3N1cD4gUyBJICAmbWludXM7ICgmbXU7ICsgJm11OzxzdWI+aTwvc3ViPikgSSA8c3VwPkY8L3N1cD4gPC9lbT4KKyAqIDwvbGk+CisgKiA8L3VsPgorICogCisgKiA8cD4KKyAqIENvbXB1dGluZyA8ZW0+JmJldGE7PHN1cD4qPC9zdXA+PC9lbT4gaXMgc3RyYWlnaHRmb3J3YXJkLiBMZXQKKyAqIDxlbT5UU0Y8c3ViPmw8L3N1Yj4gPSAoZDxzdWI+bDwvc3ViPi8oQVBEICogUDxzdWI+bDwvc3ViPik8L2VtPiBiZQorICogdGhlIDxlbT50cmFuc21pc3Npb24gc2NhbGUgZmFjdG9yPC9lbT4gYXQgbG9jYXRpb24gPGVtPmw8L2VtPi4KKyAqIDwvcD4KKyAqIDxwPgorICogVGh1cworICogPHVsPgorICogPGxpPjxlbT4mYmV0YTs8c3VwPio8L3N1cD4gPSAmYmV0YTsgVFNGPHN1Yj5sPC9zdWI+PC9lbT48L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIDxwPgorICogU3Vic3RpdHV0aW5nIDxlbT5QPHN1Yj5sPC9zdWI+ID0gUyArIEk8L2VtPiwgPGVtPkFQRCA9IFAvQXJlYTwvZW0+IGFuZAorICogPGVtPmQ8c3ViPmw8L3N1Yj4gPSAoUytJKS9BcmVhPHN1Yj5sPC9zdWI+PC9lbT4sIHdoZXJlIDxlbT5QPC9lbT4gaXMKKyAqIHRoZSB0b3RhbCBwb3B1bGF0aW9uIGZvciBhbGwgbG9jYXRpb25zLCA8ZW0+QXJlYTxzdWI+bDwvc3ViPjwvZW0+IGlzIHRoZQorICogYXJlYSBvZiBsb2NhdGlvbiA8ZW0+bDwvZW0+LCBhbmQgPGVtPkFyZWE8L2VtPiBpcyB0aGUgdG90YWwgYXJlYSBvZiBhbGwKKyAqIGxvY2F0aW9ucywgd2UgZ2V0OgorICogPHVsPgorICogPGxpPjxlbT5UU0Y8c3ViPmw8L3N1Yj4gPSAoKFMrSSkvQXJlYTxzdWI+bDwvc3ViPikgLyAoUC9BcmVhICogICAgKFMrSSkpPC9lbT48L2xpPgorICogPGxpPjxlbT5UU0Y8c3ViPmw8L3N1Yj4gPSAoMS9BcmVhPHN1Yj5sPC9zdWI+KSAvIChQL0FyZWEgKTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+VFNGPHN1Yj5sPC9zdWI+ID0gQXJlYSAvIChQICpBcmVhPHN1Yj5sPC9zdWI+ICk8L2VtPjwvbGk+CisgKiA8bGk+PGVtPlRTRjxzdWI+bDwvc3ViPiA9ICgxIC8gUCkqIChBcmVhL0FyZWE8c3ViPmw8L3N1Yj4gKTwvZW0+PC9saT4KKyAqIDwvdWw+CisgKiBTbyB0aGUgPGVtPlRTRjxzdWI+bDwvc3ViPjwvZW0+IGlzIHRoZSBwcm9kdWN0IG9mIHRoZSByZWNpcHJvY2FsIG9mIHRoZQorICogdG90YWwgcG9wdWxhdGlvbiBvZiBhbGwgbG9jYXRpb25zIGFuZCB0aGUgY29uc3RhbnQgcmF0aW8gYmV0d2VlbiB0aGUgYXJlYSBvZgorICogdGhlIGxvY2F0aW9uIGFuZCB0aGUgdG90YWwgYXJlYSBvZiBhbGwgbG9jYXRpb25zLiBUaGUgZm9ybWVyIGNhbiBiZSBjb21wdXRlZAorICogYnkgYWNjdW11bGF0aW5nIHRoZSBwb3B1bGF0aW9uIG9mIGFsbCBsb2NhdGlvbnMgYXMgdGhleSBhcmUgZ2VuZXJhdGVkIGFuZCB0aGUKKyAqIGxhdGVyIHJhdGlvIGNhbiBiZSBjb21wdXRlZCBvbmNlIGF0IHRoZSBzdGFydCBvZiB0aGUgc2ltdWxhdGlvbi4KKyAqIDwvcD4KKyAqIAorICogPGgzPk5laWdoYm9yaW5nIEluZmVjdGlvdXMgUG9wdWxhdGlvbnM8L2gzPgorICogPHA+CisgKiBUaGUgZXh0ZW5zaW9uIG9mIHRoZSBub24tc3BhdGlhbCBtb2RlbCBpbnRvIGEgc3BhdGlhbCBvbmUgaW4gU1RFTSBhbHNvIG5lZWRzCisgKiB0byBhY2NvdW50IGZvciBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gbWVtYmVycyB0aGF0IHJlc2lkZSBpbiBhIGxvY2F0aW9uJ3MKKyAqICJuZWlnaGJvcnMiLiBDb25zaWRlciBhIGxvY2F0aW9uIHdpdGggbm8gaW5mZWN0aW9ucyB0aGF0IGlzIHBoeXNpY2FsbHkKKyAqIGFkamFjZW50IHRvIHNldmVyYWwgbG9jYXRpb25zIHRoYXQgaGF2ZSBsYXJnZSBpbmZlY3Rpb3VzIHBvcHVsYXRpb25zLiBUaGlzCisgKiBwaHlzaWNhbCBhZGphY2VuY3kgd291bGQgbmF0dXJhbGx5IGxlYWQgdG8gcG9wdWxhdGlvbi10by1wb3B1bGF0aW9uIGNvbnRhY3QKKyAqIGFuZCBldmVudHVhbGx5IHRvIGRpc2Vhc2UgdHJhbnNtaXNzaW9uLiBXZSBuZWVkIHRvIGZ1cnRoZXIgZXh0ZW5kIHRoZQorICogZXF1YXRpb25zIHdlIGFyZSBoZXJlIHRvIGluY29ycG9yYXRlIHRoaXMgYXNwZWN0IG9mIGEgc3BhdGlhbGx5IGRpc3RyaWJ1dGVkCisgKiBwb3B1bGF0aW9uLgorICogPC9wPgorICogPHA+CisgKiBJbiBTVEVNLCBhIGxvY2F0aW9uIGhhcyBhbm90aGVyIGxvY2F0aW9uIGFzIGEgbmVpZ2hib3IgPGVtPlJlbGF0aW9uc2hpcDwvZW0+CisgKiB0aGF0IGxpbmtzIGl0IHRvIHRoYXQgbG9jYXRpb24uIElmIHRoZSA8ZW0+UmVsYXRpb25zaGlwPC9lbT4gcmVwcmVzZW50cyB0aGUKKyAqIGV4Y2hhbmdlIG9mIG9mIHBvcHVsYXRpb24gbWVtYmVycyAoaS5lLiwgc29tZSBraW5kIG9mCisgKiB7QGxpbmsgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwgdHJhbnNwb3J0YXRpb24gcmVsYXRpb25zaGlwfSBsaWtlIHBhdGh3YXlzLAorICogcm9hZHMgb3IgYWlyIHRyYXZlbCkgdGhlbiBpdCB3b3VsZCBiZSBwb3NzaWJsZSBmb3IgPGVtPkluZmVjdGlvdXM8L2VtPgorICogcG9wdWxhdGlvbiBtZW1iZXJzIGZyb20gYSBuZWlnaGJvciB0byAidmlzaXQiIGEgbG9jYXRpb24uIFdlIG5lZWQgdG8gYWNjb3VudAorICogZm9yIHRoaXMgcG90ZW50aWFsIGJ5IGluY3JlYXNpbmcgdGhlICJlZmZlY3RpdmUiIDxlbT5JbmZlY3Rpb3VzPC9lbT4KKyAqIHBvcHVsYXRpb24gYXQgYSBsb2NhdGlvbiB3aGVuIGRvaW5nIG91ciBjb21wdXRhdGlvbnMuIEVhY2ggUmVsYXRpb25zaGlwIGhhcyBhCisgKiByYXRlIGF0IHdoaWNoIHBvcHVsYXRpb24gbWVtYmVycyB0cmF2ZWwgZnJvbSBvbmUgbG9jYXRpb24gdG8gYW5vdGhlci4gSXQgaXMKKyAqIGFzc3VtZWQgdGhhdCB0aGUgdmlzaXRvcnMgd291bGQgaGF2ZSB0aGUgc2FtZSBsZXZlbCBvZiAiaW5mZWN0aW91cyBjb250YWN0IgorICogYXMgYW4gaW5mZWN0aW91cyBtZW1iZXIgb2YgdGhlIHBvcHVsYXRpb24gYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gKGkuZS4sIHRoYXQKKyAqIHRoZXkgY291bGQgY291bGQgYmUgY291bnRlZCBhcyBhbiBpbmZlY3Rpb3VzIG1lbWJlciBvZiB0aGUgcG9wdWxhdGlvbiBhdCB0aGUKKyAqIGN1cnJlbnQgbG9jYXRpb24pLgorICogPC9wPgorICogPHA+CisgKiBUaGUgZXF1YXRpb25zIGJlY29tZToKKyAqIDwvcD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO1MgPSAmbXU7UDxzdWI+bDwvc3ViPiAgJm1pbnVzOyAmYmV0YTs8c3VwPio8L3N1cD4gUyAoSSArIEk8c3ViPm5laWdoYm9yPC9zdWI+KCkgKSArICZzaWdtYTtJIDxzdXA+Ujwvc3VwPiAgJm1pbnVzOyAmbXU7IFM8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0kgPHN1cD5SPC9zdXA+ID0gKDEteCkmYmV0YTs8c3VwPio8L3N1cD4gUyAoSSArIEk8c3ViPm5laWdoYm9yPC9zdWI+KCkgKSAmbWludXM7ICZzaWdtYTtJIDxzdXA+Ujwvc3VwPiAgJm1pbnVzOyAmbXU7SSA8c3VwPlI8L3N1cD4gPC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJIDxzdXA+Rjwvc3VwPiA9IHggJmJldGE7PHN1cD4qPC9zdXA+IFMgKEkgKyBJPHN1Yj5uZWlnaGJvcjwvc3ViPigpICkgICZtaW51czsgKCZtdTsgKyAmbXU7PHN1Yj5pPC9zdWI+KSBJIDxzdXA+Rjwvc3VwPiA8L2VtPgorICogPC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiA8cD4KKyAqIFdoZXJlCisgKiA8dWw+CisgKiA8bGk+CisgKiA8ZW0+STxzdWI+bmVpZ2hib3I8L3N1Yj4oKSA9ICZzdW07IDxzdWI+bTwvc3ViPiAgIEkgPHN1Yj5tPC9zdWI+dHJhbnNwb3J0KG0pL1A8c3ViPm08L3N1Yj48L2VtPgorICogaXMgdGhlIG51bWJlciBvZiA8ZW0+SW5mZWN0aW91czwvZW0+IHZpc2l0b3JzIGZyb20gbmVpZ2hib3IgPGVtPm08L2VtPi48L2xpPgorICogPGxpPnRyYW5zcG9ydChtKSA9IHRoZSB0aGUgbnVtYmVyIG9mIHBvcHVsYXRpb24gbWVtYmVycyBhcmUgdHJhbnNwb3J0ZWQgZnJvbQorICogbmVpZ2hib3IgPGVtPm08L2VtPjwvbGk+CisgKiA8bGk+UDxzdWI+bTwvc3ViPiBpcyB0aGUgbnVtYmVyIG9mIHBvcHVsYXRpb24gbWVtYmVycyBhdCBuZWlnaGJvcgorICogPGVtPm08L2VtPjwvbGk+CisgKiA8bGk+STxzdWI+bTwvc3ViPiBpcyB0aGUgbnVtYmVyIG9mIDxlbT5JbmZlY3Rpb3VzPC9lbT4gcG9wdWxhdGlvbgorICogbWVtYmVycyBhdCBuZWlnaGJvciA8ZW0+bTwvZW0+PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiA8cD4KKyAqIFNwZWNpZmljIHN0YXRpc3RpY3Mgb24gdGhlIHRvdGFsIG51bWJlciBvZiBiaXJ0aHMsIGRlYXRocyBhbmQgZGVhdGhzIGR1ZSB0bworICogdGhlIGRpc2Vhc2UgY2FuIGJlIGNvbXB1dGVkIGJ5IGFkZGluZyB0aGUgYXBwcm9wcmlhdGUgdGVybXMgb2YgdGhlIGVxdWF0aW9ucworICogYWJvdmUuCisgKiA8dWw+CisgKiA8bGk+PGVtPkI9ICZtdTsgKFMgKyBJKTwvZW0+LCBpcyB0aGUgbnVtYmVyIG9mIDxlbT5CaXJ0aHM8L2VtPiA8L2xpPgorICogPGxpPjxlbT5EID0gJm11OyBTICsgKCZtdTsgKyAmbXU7PHN1Yj5pPC9zdWI+IClJPHN1cD5GPC9zdXA+ICsgJm11O0k8c3VwPlI8L3N1cD48L2VtPixpcworICogdGhlIHRvdGFsIG51bWJlciBvZiA8ZW0+RGVhdGhzPC9lbT48L2xpPgorICogPGxpPjxlbT5ERD0gJm11OzxzdWI+aTwvc3ViPiBJPHN1cD5GPC9zdXA+PC9lbT4sIGlzIHRoZSBudW1iZXIgb2YKKyAqIDxlbT5EaXNlYXNlIERlYXRoczwvZW0+IDwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogCisgKiBAc2VlIFNJSW1wbCNjb21wdXRlSW5mZWN0aW91c01vcnRhbGl0eVJhdGUoZG91YmxlLCBkb3VibGUpCisgKiBAc2VlIFNJUkxhYmVsCisgKiBAc2VlIFNJUkxhYmVsCisgKiBAc2VlIFNJUkxhYmVsVmFsdWUKKyAqIEBzZWUgU0VJUgorICogQHNlZSBTRUlSTGFiZWwKKyAqIEBzZWUgU0VJUkxhYmVsVmFsdWUKKyAqIAorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICovCitwdWJsaWMgaW50ZXJmYWNlIFNJIGV4dGVuZHMgU3RhbmRhcmREaXNlYXNlTW9kZWwgeworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHNlZ21lbnQgb2YgdGhlIHR5cGUgVVJJIHRoYXQgcHJlZml4ZXMgYWxsIG90aGVyIHNlZ21lbnRzIGluIGEKKwkgKiBzdGFuZGFyZCBkaXNlYXNlIG1vZGVsIHR5cGUgVVJJLgorCSAqLworCVN0cmluZyBVUklfVFlQRV9TVEFOREFSRF9TSV9ESVNFQVNFX01PREVMX1NFR01FTlQgPSBVUklfVFlQRV9TVEFOREFSRF9ESVNFQVNFTU9ERUxfU0VHTUVOVAorCQkJKyAiL3NpIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHByb3BvcnRpb24gd2hpY2ggPGVtPkluZmVjdGlvdXM8L2VtPiBwb3B1bGF0aW9uCisJICogbWVtYmVycyBkaWUgcGVyIHRpbWUgcGVyaW9kLiBUaGlzIGlzIDxlbT4mbXU7PHN1Yj5pPC9zdWI+PC9lbT4uCisJICogCisJICogQHJldHVybiB0aGUgaW5jcmVhc2VkIHJhdGUgYXQgd2hpY2ggaW5mZWN0ZWQgcG9wdWxhdGlvbiBtZW1iZXJzIHRoYXQgZGllIHBlcgorCSAqICAgICAgICAgdGltZSBwZXJpb2QuCisJICogQHNlZSBEaXNlYXNlTW9kZWwjZ2V0QmFja2dyb3VuZE1vcnRhbGl0eVJhdGUoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSIwLjAiCisJICovCisJZG91YmxlIGdldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kjZ2V0SW5mZWN0aW91c01vcnRhbGl0eVJhdGUgPGVtPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmZlY3Rpb3VzIE1vcnRhbGl0eSBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SW5mZWN0aW91c01vcnRhbGl0eVJhdGUoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIENvbXB1dGUgdGhlIGluZmVjdGlvdXMgbW9ydGFsaXR5IHJhdGUgYWRqdXN0ZWQgZm9yIGEgdGltZSBkZWx0YQorCSAqIHBvdGVudGlhbGx5IGRpZmZlcmVudCBmcm9tIHRoZSB0aW1lIHBlcmlvZCBzcGVjaWZpZWQgZm9yIHRoZSByYXRlLgorCSAqIAorCSAqIEBwYXJhbSB0aW1lRGVsdGEKKwkgKiAgICAgICAgICAgIHRoZSB0aW1lIHBlcmlvZCAobWlsbGlzZWNvbmRzKSB0byB3aGljaCB0aGUgcmF0ZSBpcyB0byBiZQorCSAqICAgICAgICAgICAgYWRqdXN0ZWQuCisJICogQHJldHVybiB0aGUgYWRqdXN0ZWQgcmF0ZQorCSAqIAorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwlkb3VibGUgZ2V0QWRqdXN0ZWRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZShmaW5hbCBsb25nIHRpbWVEZWx0YSk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBwcm9wb3J0aW9uIG9mIHBvcHVsYXRpb24gbWVtYmVycyB0aGF0IGJlY29tZSBpbmZlY3RlZC9leHBvc2VkCisJICogcGVyIHBvcHVsYXRpb24gbWVtYmVyIGluIHRoZSA8ZW0+SW5mZWN0aW91czwvZW0+IHN0YXRlLCBhc3N1bWluZyB0aGUKKwkgKiBlbnRpcmUgcG9wdWxhdGlvbiBpcyBpbiB0aGUgPGVtPlN1c2NlcHRpYmxlPC9lbT4gc3RhdGUsIHBlciB0aW1lCisJICogcGVyaW9kLgorCSAqIDxwPgorCSAqIEluIHRoZSByYXRlIGVxdWF0aW9uIHRoaXMgY29lZmZpY2llbnQgaXMgbm9ybWFsaXplIGJ5IHRoZSByYXRpbyBvZiB0aGUKKwkgKiBTdXNjZXB0aWJsZSBwb3B1bGF0aW9uIHRvIHRoZSB0b3RhbCBwb3B1bGF0aW9uLiBUaGUgZmluYWwgdmFsdWUgbWF5IGFsc28KKwkgKiBiZSByZXNjYWxlZCBiYXNlZCBvbiB2YXJpYXRpb25zIGluIGxvY2FsIHBvcHVsYXRpb24gZGVuc2l0eSAoYWJvdmUgb3IKKwkgKiBiZWxvdyBhdmVyYWdlKS4gVGhpcyBpcyA8ZW0+JmJldGE7PC9lbT4uCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgdGhhdCBiZWNvbWUgaW5mZWN0ZWQgcGVyIHRpbWUKKwkgKiAgICAgICAgIHBlcmlvZAorCSAqIEBtb2RlbCBkZWZhdWx0PSIwLjAiCisJICovCisJZG91YmxlIGdldFRyYW5zbWlzc2lvblJhdGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRUcmFuc21pc3Npb25SYXRlIDxlbT5UcmFuc21pc3Npb24gUmF0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zbWlzc2lvbiBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRUcmFuc21pc3Npb25SYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUcmFuc21pc3Npb25SYXRlKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBDb21wdXRlIHRoZSB0cmFuc21pc3Npb24gcmF0ZSBhZGp1c3RlZCBmb3IgYSB0aW1lIGRlbHRhIHBvdGVudGlhbGx5CisJICogZGlmZmVyZW50IGZyb20gdGhlIHRpbWUgcGVyaW9kIHNwZWNpZmllZCBmb3IgdGhlIHJhdGUuCisJICogCisJICogQHBhcmFtIHRpbWVEZWx0YQorCSAqICAgICAgICAgICAgdGhlIHRpbWUgcGVyaW9kIChtaWxsaXNlY29uZHMpIHRvIHdoaWNoIHRoZSByYXRlIGlzIHRvIGJlCisJICogICAgICAgICAgICBhZGp1c3RlZC4KKwkgKiBAcmV0dXJuIHRoZSBhZGp1c3RlZCByYXRlCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCWRvdWJsZSBnZXRBZGp1c3RlZFRyYW5zbWlzc2lvblJhdGUoZmluYWwgbG9uZyB0aW1lRGVsdGEpOworCisJLyoqCisJICogQnkgZGVmYXVsdCB0aGlzIGV4cG9uZW50IGlzIG9uZSAoMS4wKSBhbmQgdGhlIHJhdGUgb2YgaW5mZWN0aW9uIHNjYWxlcyBhcworCSAqIHRoZSBwcm9kdWN0IG9mIHRoZSBTdXNjZXB0aWJsZSBwb3B1bGF0aW9uIGFuZCB0aGUgSW5mZWN0aW91cyBwb3B1bGF0aW9uLgorCSAqIEluIGEgbm9ubGluZWFyIG1vZGVsICh3aGljaCBjYXB0dXJlcyBzYXR1cmF0aW9uIG9mIHRoZSBpbW11bmUgc3lzdGVtIGZvcgorCSAqIFN1c2NlcHRpYmxlIHBvcHVsYXRpb24pLCB0aGUgSW5mZWN0aW91cyB0ZXJtIGlzIHJhaXNlIHRvIHRoaXMgcG93ZXIgKD49CisJICogMS4wKSBUaGlzIGV4cG9uZW50IHNob3VsZCBuZXZlciBiZSBsZXNzIHRoYW4gb25lICh0aGF0IHdvdWxkIGltcGx5CisJICogU3VzY2VwdGlibGUgcG9wdWxhdGlvbiB3b3VsZCBiZWNvbWUgbGVzcyBzdXNjZXB0aWJsZSBhcyB0aGVpciBwcm9iYWJpbGl0eQorCSAqIG9mIGV4cG9zdXJlIGluY3JlYXNlcy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBub24tbGluZWFyaXR5IGNvZWZmaWNpZW50CisJICogQG1vZGVsIGRlZmF1bHQ9IjEuMCIKKwkgKi8KKwlkb3VibGUgZ2V0Tm9uTGluZWFyaXR5Q29lZmZpY2llbnQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXROb25MaW5lYXJpdHlDb2VmZmljaWVudCA8ZW0+Tm9uIExpbmVhcml0eSBDb2VmZmljaWVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBMaW5lYXJpdHkgQ29lZmZpY2llbnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE5vbkxpbmVhcml0eUNvZWZmaWNpZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXROb25MaW5lYXJpdHlDb2VmZmljaWVudChkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogVGhpcyBjb2VmZmljaWVudCBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgcG9wdWxhdGlvbiBtZW1iZXJzIHRoYXQgcmVjb3ZlcgorCSAqIGZyb20gdGhlIGRpc2Vhc2UgcGVyIHBvcHVsYXRpb24gbWVtYmVyIGluIHRoZSA8ZW0+SW5mZWN0aW91czwvZW0+CisJICogc3RhdGUuIFRoaXMgaXMgPGVtPiZzaWdtYTs8L2VtPi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcG9wdWxhdGlvbiBtZW1iZXJzIHRoYXQgcmVjb3ZlciBwZXIgdGltZSBwZXJpb2QKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMC4wIgorCSAqLworCWRvdWJsZSBnZXRSZWNvdmVyeVJhdGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRSZWNvdmVyeVJhdGUgPGVtPlJlY292ZXJ5IFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWNvdmVyeSBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRSZWNvdmVyeVJhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFJlY292ZXJ5UmF0ZShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogQ29tcHV0ZSB0aGUgcmVjb3ZlcnkgcmF0ZSBhZGp1c3RlZCBmb3IgYSB0aW1lIGRlbHRhIHBvdGVudGlhbGx5IGRpZmZlcmVudAorCSAqIGZyb20gdGhlIHRpbWUgcGVyaW9kIHNwZWNpZmllZCBmb3IgdGhlIHJhdGUuCisJICogCisJICogQHBhcmFtIHRpbWVEZWx0YQorCSAqICAgICAgICAgICAgdGhlIHRpbWUgcGVyaW9kIChtaWxsaXNlY29uZHMpIHRvIHdoaWNoIHRoZSByYXRlIGlzIHRvIGJlCisJICogICAgICAgICAgICBhZGp1c3RlZC4KKwkgKiBAcmV0dXJuIHRoZSBhZGp1c3RlZCByYXRlCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCWRvdWJsZSBnZXRBZGp1c3RlZFJlY292ZXJ5UmF0ZShmaW5hbCBsb25nIHRpbWVEZWx0YSk7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0RWZmZWN0aXZlSW5mZWN0aW91cyhOb2RlIG5vZGUsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZUxhYmVsLCBkb3VibGUgb25zaXRlSW5mZWN0aW91cyk7CisKKwkvKioKKwkgKiBUd28gPGNvZGU+Tm9kZTwvY29kZT5zIHRoYXQgc2hhcmUgYSBib3JkZXIgZXhjaGFuZ2UgcG9wdWxhdGlvbiBtZW1iZXJzCisJICogdGhyb3VnaCBvdGhlcndpc2UgdW4tbW9kZWxlZCB0cmFuc3BvcnRhdGlvbiByb3V0ZXMuIFRoaXMgaXMgdGhlIHByb3BvcnRpb24KKwkgKiBvZiB0aGUgaW5mZWN0aW91cyBwb3B1bGF0aW9uIG1lbWJlcnMgaW4gYW55IGFkamFjZW50IDxjb2RlPk5vZGU8L2NvZGU+CisJICogdG8gaW5jbHVkZSBpbiB0aGUgY29tcHV0YXRpb25zIG9mIGFub3RoZXIgPGNvZGU+Tm9kZTwvY29kZT4uCisJICogCisJICogQHJldHVybiB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgaW5mZWN0aW91cyBwb3B1bGF0aW9uIGluIHBoeXNpY2FsbHkKKwkgKiAgICAgICAgIGFkamFjZW50IDxjb2RlPk5vZGU8L2NvZGU+cyB0aGF0IGNvbnRyaWJ1dGUgdG8gdGhlIGVmZmVjdGl2ZQorCSAqICAgICAgICAgaW5mZWN0aW91cyBwb3B1bGF0aW9uIGF0IHRoZSBjdXJyZW50IDxjb2RlPk5vZGU8L2NvZGU+LgorCSAqIEBtb2RlbCBkZWZhdWx0PSIwLjA1IgorCSAqLworCWRvdWJsZSBnZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbigpOworCQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJI2dldFBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uIDxlbT5QaHlzaWNhbGx5IEFkamFjZW50IEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbihkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogVGhpcyBwYXJhbWV0ZXIgYWRqdXN0IHRoZSBzdHJlbmd0aCBvZiBtaXhpbmcgb2YgcGVvcGxlIGJldHdlZW4KKwkgKiBhZGphY2VudCBub2RlcyA8Y29kZT5Ob2RlPC9jb2RlPnMgdGhhdCBhcmUgY29ubmVjdGVkIGJ5IG9uZSBvciBtb3JlIHJvYWRzLgorCSAqIEV4Y2hhbmdlIG9mIHBvcHVsYXRpb24gbWVtYmVycyBieSB0aGUgcm9hZCBuZXR3b3JrIGNhbiBhZGQgb3IsIG9yIGF1Z21lbnQsIG1peGluZworCSAqIGJhc2VkIG9uICBwaHlzaWNhbCBhZGphY2VuY3kgYmFzZWQgb24gdGhlIHJlbGF0aXZlIHN0cmVuZ3RoIG9mIHRoZXNlIGluZGVwZW5kZW50CisJICogbWl4aW5nIHByb3BvcnRpb25zLiBUd28gPGNvZGU+Tm9kZTwvY29kZT5zIHRoYXQgYXJlIGNvbm5lY3RlZCBieSBvbmUgb3IgbW9yZSByb2FkcyBleGNoYW5nZSBwb3B1bGF0aW9uIG1lbWJlcnMKKwkgKiBieSByb2FkIHRyYW5zcG9ydC4gVGhpcyBpcyB0aGUgdGhlIHByb3BvcnRpb24gZXhjaGFuZ2VkIFBFUiBST0FELgorCSAqIEFuIHJvYWQgdHJhbnNwb3J0IGVkZ2UgbWF5IHJlcHJlc2VudCBtdWx0aXBsZSByb2FkcyBpbiB3aGljaCBjYXNlIHRoZSB2YWx1ZSByZXR1cm5lZAorCSAqIGlzIHNjYWxlZCAobXVsdGlwbGllZCkgYnkgdGhlIG51bWJlciBvZiByb2FkcyBlbmNvZGVkIGJ5IHRoYXQgZWRnZS4KKwkgKiBUaGlzIHByb2R1Y3QgaXMgdGhlbiB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgaW5mZWN0aW91cyBwb3B1bGF0aW9uIG1lbWJlcnMgaW4gYW55IGFkamFjZW50IDxjb2RlPk5vZGU8L2NvZGU+CisJICogdG8gaW5jbHVkZSBpbiB0aGUgY29tcHV0YXRpb25zIG9mIGFub3RoZXIgPGNvZGU+Tm9kZTwvY29kZT4uCisJICogCisJICogQHJldHVybiB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgaW5mZWN0aW91cyBwb3B1bGF0aW9uIGluIHBoeXNpY2FsbHkKKwkgKiAgICAgICAgIGFkamFjZW50IDxjb2RlPk5vZGU8L2NvZGU+cyB0aGF0IGNvbnRyaWJ1dGUgdG8gdGhlIGVmZmVjdGl2ZQorCSAqICAgICAgICAgaW5mZWN0aW91cyBwb3B1bGF0aW9uIGF0IHRoZSBjdXJyZW50IDxjb2RlPk5vZGU8L2NvZGU+LgorCSAqIEBtb2RlbCBkZWZhdWx0PSIwLjAxIgorCSAqLworCWRvdWJsZSBnZXRSb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kjZ2V0Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbiA8ZW0+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbihkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluZmVjdGlvdXMgTW9ydGFsaXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluZmVjdGlvdXMgTW9ydGFsaXR5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJbmZlY3Rpb3VzTW9ydGFsaXR5KGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U0lfSW5mZWN0aW91c01vcnRhbGl0eSgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRJbmZlY3Rpb3VzTW9ydGFsaXR5KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kjZ2V0SW5mZWN0aW91c01vcnRhbGl0eSA8ZW0+SW5mZWN0aW91cyBNb3J0YWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluZmVjdGlvdXMgTW9ydGFsaXR5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJbmZlY3Rpb3VzTW9ydGFsaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJbmZlY3Rpb3VzTW9ydGFsaXR5KGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFyYWN0ZXJpc3RpYyBNaXhpbmcgRGlzdGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMi4yNSI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2hhcmFjdGVyaXN0aWMgTWl4aW5nIERpc3RhbmNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0Q2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZShkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFNJX0NoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSIyLjI1IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0Q2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJI2dldENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UgPGVtPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhcmFjdGVyaXN0aWMgTWl4aW5nIERpc3RhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCByZXBsYWNlcyB0aGUgb25zaXRlSW5mZWN0aW91cyB2YWx1ZSB3aXRoIGFuIGVmZmVjdGl2ZUluZmVjdGlvdXMgcG9wdWxhdGlvbgorCSAqIHNpemUgYmFzZWQgb24gbWl4aW5nIHdpdGggb3RoZXIgc2l0ZXMuIEZvciBleGFtcGxlLCAKKwkgKiBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXBsYWNlcyB0aGUgb25zaXRlSW5mZWN0aW91cyB2YWx1ZSB3aXRoIGFuIGVmZmVjdGl2ZUluZmVjdGlvdXMgcG9wdWxhdGlvbgorCSAqIHNpemUgYmFzZWQgb24gbWl4aW5nIHdpdGggbmVpZ2hoYm9yaW5nIHNpdGVzLiBJbiB0aGlzIGltcGxlbWVudGF0aW9uIHRoZSBlZGdlcyBhcmUgYmlkaXJlY3Rpb25hbAorCSAqIGFuZCBoYXZlIGEgZml4ZWQgd2VpZ2h0IGJhc2VkIG9uIGdldFBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKCkgKGNhbGxlZCBpbiB0aGUgaGVscGVyIG1ldGhvZAorCSAqIGdldEluZmVjdGlvdXNDaGFuZ2VGcm9tTWl4aW5nKCkuIEJ1dCB0aGUgbWl4aW5nIGlzIGFsc28gd2VpZ2h0ZWQgYnkgdGhlIGFyZWFzIGFuZCBwb3B1bGF0aW9ucyBvZiBhIHNpdGUgcmVsYXRpdmUKKwkgKiB0byB0aGUgYXJlYSBhbmQgcG9wdWxhdGlvbiBvZiBpdCdzIG5laWdoYm9ycy4gTm90ZSB0aGF0IHRoZSB2YWx1ZSByZXR1cm5lZCBtdXN0IGJlIE5PUk1BTElaRUQgYnkgdGhlIHRvdGFsCisJICogcG9wdWxhdGlvbiBiZWNhdXNlIHRoZSBwcm9kdWN0IGJldGEgKiBTICogSWVmZmVjdGl2ZSBtdXN0IGhhdmUgdW5pdHMgb2YgcGVyc29ucy4gU2luY2UgUyBoYXMgdW5pdHMgb2YgcGVyc29ucworCSAqIHRoZSBJZWZmZWN0aXZlIG11c3QgYmUgZGltZW5zaW9ubGVzcyAobm9ybWFsaXplZCB0byB0aGUgcG9wdWxhdGlvbikuIGJldGEgaXMgdGhlIGluZmVjdGlvbiByYXRlIGFuZCBoYXMgdW5pdHMKKwkgKiBvZiBpbnZlcnNlIHRpbWUuCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgd2UgYXJlIGN1cnJlbnRseSBsb29raW5nIGF0IHRvIGNvbXB1dGUgdGhlIG5leHQgZGlzZWFzZSBzdGF0ZQorCSAqIEBwYXJhbSBkaXNlYXNlTGFiZWwgdGhlIGxhYmVsIGZvciB0aGUgY3VycmVudCBkaXNlYXNlIGNvbXB1dGF0aW9uCisJICogQHBhcmFtIG9uc2l0ZUluZmVjdGlvdXMgdGhlIG51bWJlciBvZiBpbmZlY3Rpb3VzIHBlb3BsZSBvbiBzaXRlIChhdCB0aGUgbm9kZSBhYm92ZSkKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgaW5mZWN0aW91cyBwb3B1bGF0aW9uIG1lbWJlcnMgaW4gPGNvZGU+Tm9kZTwvY29kZT5zCisJICogICAgICAgICB0aGF0IHNoYXJlIGEge0BsaW5rIENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsfSB3aXRoIHRoaXMKKwkgKiAgICAgICAgIDxjb2RlPk5vZGU8L2NvZGU+LgorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwlkb3VibGUgZ2V0Tm9ybWFsaXplZEVmZmVjdGl2ZUluZmVjdGlvdXMoZmluYWwgTm9kZSBub2RlLCBmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VMYWJlbCwgZmluYWwgZG91YmxlIG9uc2l0ZUluZmVjdGlvdXMpOworCit9IC8vIFNJCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TSURpc2Vhc2VNb2RlbFN0YXRlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TSURpc2Vhc2VNb2RlbFN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ0ZWI4NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1NJRGlzZWFzZU1vZGVsU3RhdGUuamF2YQpAQCAtMCwwICsxLDI0IEBACisvLyBTSURpc2Vhc2VNb2RlbFN0YXRlLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgY2xhc3MgaW4gYW4gRU1GIG1vZGVsIHRoYXQgY29udGFpbnMgc3RhdGUKKyAqIGluZm9ybWF0aW9uIGZvciBhIFNJIFNURU0gZGlzZWFzZSBtb2RlbCdzIGNvbXB1dGF0aW9ucyBmcm9tIG9uZSBzaW11bGF0aW9uCisgKiBjeWNsZSB0byBhbm90aGVyLgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBTSURpc2Vhc2VNb2RlbFN0YXRlIGV4dGVuZHMgU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZSB7CisJLy8gTm90aGluZworfSAvLyBTSURpc2Vhc2VNb2RlbFN0YXRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TSUluZmVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TSUluZmVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY4NDY1NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1NJSW5mZWN0b3IuamF2YQpAQCAtMCwwICsxLDU5IEBACisvLyBTSUluZmVjdG9yLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgY2xhc3MgaW4gYW4gRU1GIG1vZGVsIGZvciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYW4KKyAqIGluZmVjdGlvdXMgcG9wdWxhdGlvbiBpbiBhIFN0YW5kYXJkIGRpc2Vhc2UgbW9kZWwuCisgKiAKKyAqIFRoZSBpbmZlY3RvciByZW1vdmVzIHBvcHVsYXRpb24gbWVtYmVycyBmcm9tIHRoZSA8ZW0+U3VzY2VwdGlibGU8L2VtPiBzdGF0ZQorICogdG8gdGhlIDxlbT5JbmZlY3Rpb3VzPC9lbT4gc3RhdGUgYXQgYXQgcGFydGljdWxhciBub2RlLgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBTSUluZmVjdG9yIGV4dGVuZHMgU3RhbmRhcmRJbmZlY3RvciB7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmZlY3Rpb3VzIENvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjEiPC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluZmVjdGlvdXMgQ291bnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5mZWN0aW91cyBDb3VudDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SW5mZWN0aW91c0NvdW50KGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U0lJbmZlY3Rvcl9JbmZlY3Rpb3VzQ291bnQoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSIxIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0SW5mZWN0aW91c0NvdW50KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lJbmZlY3RvciNnZXRJbmZlY3Rpb3VzQ291bnQgPGVtPkluZmVjdGlvdXMgQ291bnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluZmVjdGlvdXMgQ291bnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEluZmVjdGlvdXNDb3VudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SW5mZWN0aW91c0NvdW50KGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzZWdtZW50IG9mIHRoZSB0eXBlIFVSSSB0aGF0IHByZWZpeGVzIGFsbCBvdGhlciBzZWdtZW50cyBpbiBhCisJICogc3RhbmRhcmQgaW5mZWN0b3IgdHlwZSBVUkkuCisJICovCisJU3RyaW5nIFVSSV9UWVBFX1NJX0lORkVDVE9SX1NFR01FTlQgPSBVUklfVFlQRV9TVEFOREFSRF9JTkZFQ1RPUl9TRUdNRU5UCisJCQkrICIvc2kiOworfSAvLyBTSUluZmVjdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TSUxhYmVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TSUxhYmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg1Zjc1NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1NJTGFiZWwuamF2YQpAQCAtMCwwICsxLDIwOCBAQAorLy8gU0lMYWJlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgYW4gU0kgZGlzZWFzZSBtb2RlbAorICogZHluYW1pYyBsYWJlbC4KKyAqIAorICogQHNlZSBTdGFuZGFyZERpc2Vhc2VNb2RlbAorICogQHNlZSBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsCisgKiBAc2VlIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZQorICogQHNlZSBTSVIKKyAqIEBzZWUgU0lSTGFiZWwKKyAqIEBzZWUgU0lSTGFiZWxWYWx1ZQorICogQHNlZSBTRUlSCisgKiBAc2VlIFNFSVJMYWJlbAorICogQHNlZSBTRUlSTGFiZWxWYWx1ZQorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBTSUxhYmVsIGV4dGVuZHMgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCB7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWx0YSBWYWx1ZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVsdGEgVmFsdWU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsdGEgVmFsdWU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldERlbHRhVmFsdWUoU0lMYWJlbFZhbHVlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRTSUxhYmVsX0RlbHRhVmFsdWUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTSUxhYmVsVmFsdWUgZ2V0RGVsdGFWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWwjZ2V0RGVsdGFWYWx1ZSA8ZW0+RGVsdGEgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlbHRhIFZhbHVlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXREZWx0YVZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREZWx0YVZhbHVlKFNJTGFiZWxWYWx1ZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9iZSBWYWx1ZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvYmUgVmFsdWU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvYmUgVmFsdWU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFByb2JlVmFsdWUoU0lMYWJlbFZhbHVlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRTSUxhYmVsX1Byb2JlVmFsdWUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTSUxhYmVsVmFsdWUgZ2V0UHJvYmVWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWwjZ2V0UHJvYmVWYWx1ZSA8ZW0+UHJvYmUgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2JlIFZhbHVlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRQcm9iZVZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRQcm9iZVZhbHVlKFNJTGFiZWxWYWx1ZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW1wIFZhbHVlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbXAgVmFsdWU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFRlbXBWYWx1ZShTSUxhYmVsVmFsdWUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFNJTGFiZWxfVGVtcFZhbHVlKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU0lMYWJlbFZhbHVlIGdldFRlbXBWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWwjZ2V0VGVtcFZhbHVlIDxlbT5UZW1wIFZhbHVlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wIFZhbHVlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRUZW1wVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRlbXBWYWx1ZShTSUxhYmVsVmFsdWUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JpZ2luYWwgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRPcmlnaW5hbFZhbHVlKFNJTGFiZWxWYWx1ZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U0lMYWJlbF9PcmlnaW5hbFZhbHVlKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU0lMYWJlbFZhbHVlIGdldE9yaWdpbmFsVmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsI2dldE9yaWdpbmFsVmFsdWUgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0T3JpZ2luYWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0T3JpZ2luYWxWYWx1ZShTSUxhYmVsVmFsdWUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXJyb3IgU2NhbGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVycm9yIFNjYWxlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVycm9yIFNjYWxlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRFcnJvclNjYWxlKFNJTGFiZWxWYWx1ZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U0lMYWJlbF9FcnJvclNjYWxlKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU0lMYWJlbFZhbHVlIGdldEVycm9yU2NhbGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsI2dldEVycm9yU2NhbGUgPGVtPkVycm9yIFNjYWxlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FcnJvciBTY2FsZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0RXJyb3JTY2FsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RXJyb3JTY2FsZShTSUxhYmVsVmFsdWUgdmFsdWUpOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdG9wLWxldmVsIHNlZ21lbnQgZm9yIGFsbCB0eXBlIFVSSSdzIGZvciBTSSBkaXNlYXNlIG1vZGVsCisJICogbGFiZWxzLgorCSAqLworCVN0cmluZyBVUklfVFlQRV9TSV9MQUJFTF9TRUdNRU5UID0gVVJJX1RZUEVfU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9TRUdNRU5UCisJCQkrICIvc2kiOworCisJLyoqCisJICogQHJldHVybiB0aGUgY3VycmVudCBudW1iZXIgb2YgImluZmVjdGlvdXMiIHBvcHVsYXRpb24gbWVtYmVycworCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0SSgpOworCisJLyoqCisJICogQHJldHVybiBzZXQgdGhlIGN1cnJlbnQgbnVtYmVyIG9mICJpbmZlY3Rpb3VzIiBwb3B1bGF0aW9uIG1lbWJlcnMKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJKGRvdWJsZSBpKTsKKworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGluY2lkZW5jZSAtIHdoaWNoIGlzIHRoZSAibmV3IGluZmVjdGlvdXMiIG9yICJuZXcgZXhwb3NlZCIgbnVtYmVyIHRoYXQgY29tZXMgZnJvbQorCSAqIHRoZSBpbnRlcmFjdGlvbiB0ZXJtIGluIGFueSBkaXNlYXNlIG1vZGVsLiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBjb3VudCBvZiBhY3R1YWwgbmV3IGRpc2Vhc2UKKwkgKiByZXBvcnRzIGluIHJlYWwgcHVibGljIGhlYWx0aCBzdXJ2ZWlsbGFuY2Ugc3RhdGlzdGljcy4KKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldEluY2lkZW5jZSgpOworCQorCS8qKgorCSAqIHNldCB0aGUgaW5jaWRlbmNlIC0gd2hpY2ggaXMgdGhlICJuZXcgaW5mZWN0aW91cyIgb3IgIm5ldyBleHBvc2VkIiBudW1iZXIgdGhhdCBjb21lcyBmcm9tCisJICogdGhlIGludGVyYWN0aW9uIHRlcm0gaW4gYW55IGRpc2Vhc2UgbW9kZWwuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGNvdW50IG9mIGFjdHVhbCBuZXcgZGlzZWFzZQorCSAqIHJlcG9ydHMgaW4gcmVhbCBwdWJsaWMgaGVhbHRoIHN1cnZlaWxsYW5jZSBzdGF0aXN0aWNzLgorCSAqLworCXB1YmxpYyB2b2lkIHNldEluY2lkZW5jZShkb3VibGUgaW5jaWRlbmNlKTsKKworCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuZXh0IG51bWJlciBvZiAiaW5mZWN0aW91cyIgcG9wdWxhdGlvbiBtZW1iZXJzCisJICovCisJcHVibGljIGRvdWJsZSBnZXROZXh0SSgpOworCisJLyoqCisJICogQHJldHVybiBzZXQgdGhlIG51bWJlciBudW1iZXIgb2YgaW5mZWN0aW91cyBwb3B1bGF0aW9uIG1lbWJlcnMKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROZXh0SShkb3VibGUgaSk7CisKKworfSAvLyBTSUxhYmVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TSUxhYmVsVmFsdWUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1NJTGFiZWxWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYWRmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TSUxhYmVsVmFsdWUuamF2YQpAQCAtMCwwICsxLDY2IEBACisvLyBTSUxhYmVsVmFsdWUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBjbGFzcyBpbiBhbiBFTUYgbW9kZWwgZm9yIGFuIFNJIGRpc2Vhc2UgbW9kZWwgbGFiZWwKKyAqIHZhbHVlLiBUaGUgdmFsdWVzIG9mIHRoaXMgbGFiZWwgcmVjb3JkIHRoZSBudW1iZXIgb2YgcG9wdWxhdGlvbiBtZW1iZXJzIHdobworICogYXJlIGluIG9uZSBvZiB0d28gc3RhdGVzIHdpdGggcmVzcGVjdCB0byBhIHBhcnRpY3VsYXIgZGlzZWFzZS4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+U3VzY2VwdGlibGU8L2VtPiB3aGljaCBtZWFucyB0aGF0IHRoZXkgYXJlIG5vdCBpbmZlY3RlZCBieSB0aGUKKyAqIGRpc2Vhc2UsIGJ1dCB0aGV5IGNhbiBiZWNvbWUgaW5mZWN0ZWQgYnkgdGhlIGRpc2Vhc2UuPC9saT4KKyAqIDxsaT48ZW0+SW5mZWN0aW91czwvZW0+IHdoaWNoIG1lYW5zIHRoYXQgcG9wdWxhdGlvbiBtZW1iZXJzIGFyZSBpbmZlY3RlZAorICogd2l0aCB0aGUgZGlzZWFzZSBhbmQgdGhleSBjYW4gaW5mZWN0IG90aGVycy4gPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIFN1Yi1jbGFzc2VzIGNvdWxkIGludHJvZHVjZSBhZGRpdGlvbmFsIHN0YXRlcyBpbiB3aGljaCBwb3B1bGF0aW9uIG1lbWJlcnMKKyAqIGNvdWxkIGV4aXN0LgorICogPC9wPgorICogCisgKiBAc2VlIFNJUgorICogQHNlZSBTSVJMYWJlbAorICogQHNlZSBTRUlSCisgKiBAc2VlIFNFSVJMYWJlbAorICogQHNlZSBTRUlSTGFiZWxWYWx1ZQorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBTSUxhYmVsVmFsdWUgZXh0ZW5kcyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgeworCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBvcHVsYXRpb24gbWVtYmVycyBpbiB0aGUgPGVtPkluZmVjdGlvdXM8L2VtPgorCSAqICAgICAgICAgc3RhdGUuCisJICogQG1vZGVsCisJICovCisJZG91YmxlIGdldEkoKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbFZhbHVlI2dldEkgPGVtPkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEkoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGluY2lkZW5jZSAtIHdoaWNoIGlzIHRoZSAibmV3IGluZmVjdGlvdXMiIG9yICJuZXcgZXhwb3NlZCIgbnVtYmVyIHRoYXQgY29tZXMgZnJvbQorCSAqIHRoZSBpbnRlcmFjdGlvbiB0ZXJtIGluIGFueSBkaXNlYXNlIG1vZGVsLiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBjb3VudCBvZiBhY3R1YWwgbmV3IGRpc2Vhc2UKKwkgKiByZXBvcnRzIGluIHJlYWwgcHVibGljIGhlYWx0aCBzdXJ2ZWlsbGFuY2Ugc3RhdGlzdGljcy4KKwkgKiBAc2VlICNnZXRJKCkKKwkgKgorCSAqLworCWRvdWJsZSBnZXRJbmNpZGVuY2UoKTsKKworfSAvLyBTSUxhYmVsVmFsdWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1NJUi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU0lSLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4MDY5MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1NJUi5qYXZhCkBAIC0wLDAgKzEsMjQ3IEBACisvLyBTSVIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKKworLyoqCisgKiBBIHtAbGluayBEaXNlYXNlTW9kZWx9IHdpdGggdGhyZWUgc3RhdGVzIDxlbT5TdXNjZXB0aWJsZTwvZW0+LAorICogPGVtPkluZmVjdGlvdXM8L2VtPiBhbmQgPGVtPlJlY292ZXJlZDwvZW0+KFNJUikuCisgKiAKKyAqIDxwPgorICogVGhlIGJhc2ljIDxlbT5TSVI8L2VtPiAoU3VzY2VwdGlibGUsIEluZmVjdGlvdXMsIFJlY292ZXJlZCkgZGlzZWFzZSBtb2RlbAorICogYXNzdW1lcyBhIHVuaWZvcm0gcG9wdWxhdGlvbiBhdCBhIHNpbmdsZSBsb2NhdGlvbiBhbmQgdGhhdCB0aGUgcG9wdWxhdGlvbgorICogbWVtYmVycyBhcmUgd2VsbCAibWl4ZWQiLCBtZWFuaW5nIHRoYXQgdGhleSBhcmUgZXF1YWxseSBsaWtlbHkgdG8gbWVldCBhbmQKKyAqIGluZmVjdCBlYWNoIG90aGVyLiBUaGlzIG1vZGVsLCBmb3IgYSBub3JtYWxpemVkIHBvcHVsYXRpb24sIGlzIGRlZmluZWQgYnkgdGhlCisgKiB0aHJlZSBlcXVhdGlvbnMgYmVsb3c6CisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtzID0gJm11OyAgJm1pbnVzOyAmYmV0YTtzIGkgKyAmZ2FtbWE7ciAmbWludXM7ICZtdTtzPC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtpID0gJmJldGE7cyBpICZtaW51czsgJnNpZ21hO2kgICZtaW51czsgJm11O2k8L2VtPiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7ciA9ICAgJnNpZ21hO2kgJm1pbnVzOyAmZ2FtbWE7ciAmbWludXM7ICZtdTtyPC9lbT4gPC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIAorICogPHA+CisgKiBXaGVyZToKKyAqIDx1bD4KKyAqIDxsaT48ZW0+czwvZW0+IGlzIHRoZSBub3JtYWxpemVkIDxlbT5TdXNjZXB0aWJsZTwvZW0+IHBvcHVsYXRpb24gPC9saT4KKyAqIDxsaT4gPGVtPmk8L2VtPiBpcyB0aGUgbm9ybWFsaXplZCA8ZW0+SW5mZWN0aW91czwvZW0+IHBvcHVsYXRpb248L2xpPgorICogPGxpPiZtdTsgaXMgdGhlIGJhY2tncm91bmQgbW9ydGFsaXR5IHJhdGUsIGFuZCwgYmVjYXVzZSBpdCBpcyBhc3N1bWVkIHRoYXQKKyAqIHRoZSBwb3B1bGF0aW9uIHdhcyBub3QgZ3Jvd2luZyBvciBzaHJpbmtpbmcgc2lnbmlmaWNhbnRseSBiZWZvcmUgdGhlIG9uc2V0IG9mCisgKiB0aGUgZGlzZWFzZSwgJm11OyBpcyBhbHNvIGFzc3VtZWQgdG8gYmUgdGhlIGJpcnRoIHJhdGUuIDwvbGk+CisgKiA8bGk+IDxlbT4mYmV0YTs8L2VtPiBpcyB0aGUgZGlzZWFzZSB0cmFuc21pc3Npb24gKGluZmVjdGlvbikgcmF0ZS4gVGhpcworICogY29lZmZpY2llbnQgZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHBvcHVsYXRpb24gbWVtYmVycyB0aGF0IGJlY29tZQorICogaW5mZWN0ZWQvZXhwb3NlZCBwZXIgcG9wdWxhdGlvbiBtZW1iZXIgaW4gdGhlIDxlbT5JbmZlY3Rpb3VzPC9lbT4gc3RhdGUsCisgKiBhc3N1bWluZyB0aGUgZW50aXJlIHBvcHVsYXRpb24gaXMgaW4gdGhlIDxlbT5TdXNjZXB0aWJsZTwvZW0+IHN0YXRlLiA8L2xpPgorICogPGxpPiAmc2lnbWE7IGlzIHRoZSA8ZW0+SW5mZWN0aW91czwvZW0+IHJlY292ZXJ5IHJhdGUuIFRoaXMgY29lZmZpY2llbnQKKyAqIGRldGVybWluZXMgdGhlIHJhdGUgYXQgd2hpY2ggPGVtPkluZmVjdGlvdXM8L2VtPiBwb3B1bGF0aW9uIG1lbWJlcnMKKyAqIDxlbT5SZWNvdmVyPC9lbT4uPC9saT4KKyAqIDxsaT48ZW0+JmdhbW1hOzwvZW0+IGlzIHRoZSBpbW11bml0eSBsb3NzIHJhdGUuIFRoaXMgY29lZmZpY2llbnQKKyAqIGRldGVybWluZXMgdGhlIHJhdGUgYXQgd2hpY2ggPGVtPlJlY292ZXJlZDwvZW0+IHBvcHVsYXRpb24gbWVtYmVycyBsb3NlCisgKiB0aGVpciBpbW11bml0eSB0byB0aGUgZGlzZWFzZSBhbmQgYmVjb21lIDxlbT5TdXNjZXB0aWJsZTwvZW0+IGFnYWluLjwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogRm9sbG93aW5nIGJhc2ljYWxseSB0aGUgc2FtZSBkZXJpdmF0aW9uIGFzIG91dGxpbmVkIGluIHtAbGluayBTSX0gZm9yIHRoZSBTSQorICogbW9kZWwsIHRoZXNlIGJlY29tZToKKyAqIAorICogPHA+CisgKiBMZXQKKyAqIDx1bD4KKyAqIDxsaT48ZW0+eDwvZW0+IGJlIHRoZSA8ZW0+SW5mZWN0aW91cyBNb3J0YWxpdHk8L2VtPiB3aGljaCBpcyB0aGUKKyAqIHByb3BvcnRpb24gb2YgdGhlIHBvcHVsYXRpb24gbWVtYmVycyB3aG8gYmVjb21lIDxlbT5JbmZlY3Rpb3VzPC9lbT4gdGhhdAorICogd2lsbCBldmVudHVhbGx5IGRpZS48L2xpPgorICogPGxpPjxlbT4mbXU7PHN1Yj5pPC9zdWI+PC9lbT4gYmUgdGhlIDxlbT5JbmZlY3Rpb3VzIE1vcnRhbGl0eSBSYXRlPC9lbT4uCisgKiBUaGlzIGlzIHRoZSByYXRlIGF0IHdoaWNoIGZhdGFsbHkgaW5mZWN0ZWQgcG9wdWxhdGlvbiBtZW1iZXJzIGRpZQorICogc3BlY2lmaWNhbGx5IGR1ZSB0byB0aGUgZGlzZWFzZS4gPC9saT4KKyAqIDwvdWw+CisgKiBUaHVzLCB3ZSBub3cgaGF2ZSB0d28gdHlwZXMgb2YgPGVtPkluZmVjdGlvdXM8L2VtPiBwb3B1bGF0aW9uIG1lbWJlcnMsCisgKiB0aG9zZSB0aGF0IHdpbGwgZXZlbnR1YWxseSByZWNvdmVyIGF0IHJhdGUgPGVtPiZzaWdtYTs8L2VtPiwgYW5kIHRob3NlIHRoYXQKKyAqIHdpbGwgZXZlbnR1YWxseSBkaWUgYXQgcmF0ZSA8ZW0+Jm11OzxzdWI+aTwvc3ViPjwvZW0+IChvZiBjb3Vyc2UsIG1lbWJlcnMKKyAqIGluIGFsbCB0aHJlZSBzdGF0ZXMgc3RpbGwgZGllIGF0IHRoZSBiYWNrZ3JvdW5kIHJhdGUgPGVtPiZtdTs8L2VtPikuCisgKiA8L3A+CisgKiA8cD4KKyAqIExldAorICogPHVsPgorICogPGxpPjxlbT4gaSA8c3VwPlI8L3N1cD48L2VtPiBiZSB0aGUgbm9ybWFsaXplZCBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gdGhhdAorICogd2lsbCByZWNvdmVyLjwvbGk+CisgKiA8bGk+PGVtPiBpIDxzdXA+Rjwvc3VwPjwvZW0+IGJlIHRoZSBub3JtYWxpemVkIGluZmVjdGlvdXMgcG9wdWxhdGlvbiB0aGF0CisgKiB3aWxsIGRpZSBmcm9tIHRoZSBkaXNlYXNlLjwvbGk+CisgKiA8bGk+PGVtPiBpID0gaSA8c3VwPlI8L3N1cD4gKyAgaSA8c3VwPkY8L3N1cD48L2VtPiBiZSB0aGUgdG90YWwgbm9ybWFsaXplZAorICogaW5mZWN0aW91cyBwb3B1bGF0aW9uIChhcyBiZWZvcmUpLjwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogCisgKiA8cD4KKyAqIFdlIG1vZGlmeSBvdXIgbW9kZWwgdG8gaW5jbHVkZSB0aGVzZSBhZGRpdGlvbmFsIHN0YXRlcyBhbmQgcmF0ZXMuCisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtzID0gJm11OyAgJm1pbnVzOyAmYmV0YTtzIGkgKyAmZ2FtbWE7ciAgJm1pbnVzOyAmbXU7IHM8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO2kgPHN1cD5SPC9zdXA+ID0gKDEteCkmYmV0YTtzIGkgJm1pbnVzOyAmc2lnbWE7aSA8c3VwPlI8L3N1cD4gICZtaW51czsgJm11O2kgPHN1cD5SPC9zdXA+PC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtpIDxzdXA+Rjwvc3VwPiA9IHggJmJldGE7cyBpICZtaW51czsgKCZtdTsgKyAmbXU7PHN1Yj5pPC9zdWI+KSBpIDxzdXA+Rjwvc3VwPjwvZW0+CisgKiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7ciA9ICAgJnNpZ21hO2k8c3VwPlI8L3N1cD4gJm1pbnVzOyAmZ2FtbWE7ciAmbWludXM7ICZtdTtyPC9lbT4KKyAqIDwvbGk+CisgKiAKKyAqIDwvdWw+CisgKiA8L3A+CisgKiA8aDM+U3BhdGlhbCBBZGFwdGF0aW9uPC9oMz4KKyAqIDxwPgorICogPHVsPgorICogPGxpPjxlbT4mRGVsdGE7cyBQPHN1Yj5sPC9zdWI+PSAmbXU7UDxzdWI+bDwvc3ViPiAgJm1pbnVzOyAmYmV0YTs8c3ViPmw8L3N1Yj4gcyBpIFA8c3ViPmw8L3N1Yj4gKyAmZ2FtbWE7IHIgUDxzdWI+bDwvc3ViPiAgJm1pbnVzOyAmbXU7IHMgUDxzdWI+bDwvc3ViPjwvZW0+CisgKiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7aSA8c3VwPlI8L3N1cD4gUDxzdWI+bDwvc3ViPiA9ICgxLXgpJmJldGE7PHN1Yj5sPC9zdWI+IHMgaSBQPHN1Yj5sPC9zdWI+ICZtaW51czsgJnNpZ21hOyBpIDxzdXA+Ujwvc3VwPiBQPHN1Yj5sPC9zdWI+ICZtaW51czsgJm11O2kgPHN1cD5SPC9zdXA+IFA8c3ViPmw8L3N1Yj48L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO2kgPHN1cD5GPC9zdXA+IFA8c3ViPmw8L3N1Yj4gPSB4ICZiZXRhOzxzdWI+bDwvc3ViPnMgaSBQPHN1Yj5sPC9zdWI+ICZtaW51czsgKCZtdTsgKyAmbXU7PHN1Yj5pPC9zdWI+KSBpIDxzdXA+Rjwvc3VwPiBQPHN1Yj5sPC9zdWI+PC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtyIFA8c3ViPmw8L3N1Yj49ICAgJnNpZ21hO2k8c3VwPlI8L3N1cD5QPHN1Yj5sPC9zdWI+ICZtaW51czsgJmdhbW1hO3IgUDxzdWI+bDwvc3ViPiZtaW51czsgJm11O3IgUDxzdWI+bDwvc3ViPjwvZW0+CisgKiA8L2xpPgorICogPC91bD4KKyAqIAorICogPHA+CisgKiBMZXQgPGVtPlM8c3ViPmw8L3N1Yj4gPSBzIFA8c3ViPmw8L3N1Yj48L2VtPiBiZSB0aGUgbnVtYmVyIG9mCisgKiA8ZW0+U3VzY2VwdGlibGU8L2VtPiBwb3B1bGF0aW9uIG1lbWJlcnMgYXQgbG9jYXRpb24gPGVtPmw8L2VtPi4KKyAqIFNpbWlsYXJseSwgbGV0IDxlbT5JPHN1Yj5sPC9zdWI+ID0gaSBQPHN1Yj5sPC9zdWI+PC9lbT4gYmUgdGhlIG51bWJlcgorICogb2YgcG9wdWxhdGlvbiBtZW1iZXJzIGF0IGxvY2F0aW9uIDxlbT5sPC9lbT4gdGhhdCBhcmUgPGVtPkluZmVjdGlvdXM8L2VtPgorICogKGJvdGggc3RhdGVzIGNvbWJpbmVkKSwgYW5kIGxldAorICogPGVtPnIgUDxzdWI+bDwvc3ViPiBiZSB0aGUgPGVtPlJlY292ZXJlZDwvZW0+IHBvcHVsYXRpb24uCisgKiBGb3IgcmVhZGFiaWxpdHksIHdlIGRyb3AgdGhlIDxlbT5sPC9lbT4gc3Vic2NyaXB0IGFuZCBzdWJzdGl0dXRlLgorICogPC9wPgorICogU3Vic3RpdHV0aW5nCisgKiAgCisgKiA8L3A+CisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtTID0gJm11O1A8c3ViPmw8L3N1Yj4gICZtaW51czsgJmJldGE7PHN1Yj5sPC9zdWI+IFMgaSArICZnYW1tYTtSICAmbWludXM7ICZtdTsgUzwvZW0+CisgKiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7SSA8c3VwPlI8L3N1cD4gPSAoMS14KSZiZXRhOzxzdWI+bDwvc3ViPiBTIGkgJm1pbnVzOyAmc2lnbWE7SSA8c3VwPlI8L3N1cD4gJm1pbnVzOyAmbXU7SSA8c3VwPlI8L3N1cD4gPC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJIDxzdXA+Rjwvc3VwPiA9IHggJmJldGE7PHN1Yj5sPC9zdWI+UyBpICAmbWludXM7ICgmbXU7ICsgJm11OzxzdWI+aTwvc3ViPikgSSA8c3VwPkY8L3N1cD4gPC9lbT4KKyAqIDwvbGk+CisgKiAgPGxpPjxlbT4mRGVsdGE7Uj0gICAmc2lnbWE7STxzdXA+Ujwvc3VwPiAmbWludXM7ICZnYW1tYTtSICZtaW51czsgJm11O1I8L2VtPiA8L2xpPgorICogPC91bD4KKyAqIAorICogICBDb250aW51aW5nIHdpdGggPGVtPiBpID0gSS9QPHN1Yj5sPC9zdWI+PC9lbT4sIHdlIGhhdmU6CisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtTID0gJm11O1A8c3ViPmw8L3N1Yj4gICZtaW51czsgKCZiZXRhOzxzdWI+bDwvc3ViPi9QPHN1Yj5sPC9zdWI+KSBTIEkgKyAmZ2FtbWE7UiAgJm1pbnVzOyAmbXU7IFM8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0kgPHN1cD5SPC9zdXA+ID0gKDEteCkoJmJldGE7PHN1Yj5sPC9zdWI+L1A8c3ViPmw8L3N1Yj4pIFMgSSAmbWludXM7ICZzaWdtYTtJIDxzdXA+Ujwvc3VwPiAgJm1pbnVzOyAmbXU7SSA8c3VwPlI8L3N1cD4gPC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJIDxzdXA+Rjwvc3VwPiA9IHggKCZiZXRhOzxzdWI+bDwvc3ViPi9QPHN1Yj5sPC9zdWI+KSBTIEkgICZtaW51czsgKCZtdTsgKyAmbXU7PHN1Yj5pPC9zdWI+KSBJIDxzdXA+Rjwvc3VwPiA8L2VtPgorICogPC9saT4KKyAqICAgPGxpPjxlbT4mRGVsdGE7Uj0gICAmc2lnbWE7STxzdXA+Ujwvc3VwPiAmbWludXM7ICZnYW1tYTtSICZtaW51czsgJm11O1I8L2VtPiA8L2xpPgorICogPC91bD4KKyAqIAorICogTGV0dGluZworICogPGVtPiZiZXRhOzxzdXA+Kjwvc3VwPiA9ICZiZXRhOzxzdWI+bDwvc3ViPi9QPHN1Yj5sPC9zdWI+ID0gJmJldGE7IChkPHN1Yj5sPC9zdWI+LyhBUEQgKiBQPHN1Yj5sPC9zdWI+KSkKKyAqIDwvZW0+CisgKiBnaXZlczoKKyAqIAorICogPHVsPgorICogPGxpPjxlbT4mRGVsdGE7UyA9ICZtdTtQPHN1Yj5sPC9zdWI+ICAmbWludXM7ICZiZXRhOzxzdXA+Kjwvc3VwPiBTIEkgKyAmZ2FtbWE7UiAgJm1pbnVzOyAmbXU7IFM8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0kgPHN1cD5SPC9zdXA+ID0gKDEteCkmYmV0YTs8c3VwPio8L3N1cD4gUyBJICZtaW51czsgJnNpZ21hO0kgPHN1cD5SPC9zdXA+ICAmbWludXM7ICZtdTtJIDxzdXA+Ujwvc3VwPiA8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0kgPHN1cD5GPC9zdXA+ID0geCAmYmV0YTs8c3VwPio8L3N1cD4gUyBJICAmbWludXM7ICgmbXU7ICsgJm11OzxzdWI+aTwvc3ViPikgSSA8c3VwPkY8L3N1cD4gPC9lbT4KKyAqIDwvbGk+CisgKiAgIDxsaT48ZW0+JkRlbHRhO1I9ICAgJnNpZ21hO0k8c3VwPlI8L3N1cD4gJm1pbnVzOyAmZ2FtbWE7UiAmbWludXM7ICZtdTtSPC9lbT4gPC9saT4KKyAqIDwvdWw+CisgKiBUU0YKKyAqIDx1bD4KKyAqIDxsaT48ZW0+VFNGPHN1Yj5sPC9zdWI+ID0gKChTK0krUikvQXJlYTxzdWI+bDwvc3ViPikgLyAoUC9BcmVhICogKFMrSStSKSk8L2VtPjwvbGk+CisgKiA8bGk+PGVtPlRTRjxzdWI+bDwvc3ViPiA9ICgxL0FyZWE8c3ViPmw8L3N1Yj4pIC8gKFAvQXJlYSApPC9lbT48L2xpPgorICogPGxpPjxlbT5UU0Y8c3ViPmw8L3N1Yj4gPSBBcmVhIC8gKFAgKkFyZWE8c3ViPmw8L3N1Yj4gKTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+VFNGPHN1Yj5sPC9zdWI+ID0gKDEgLyBQKSogKEFyZWEvQXJlYTxzdWI+bDwvc3ViPiApPC9lbT48L2xpPgorICogPC91bD4KKyAqIDxoMz5OZWlnaGJvcmluZyBJbmZlY3Rpb3VzIFBvcHVsYXRpb25zPC9oMz4KKyAqIDwvcD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO1MgPSAmbXU7UDxzdWI+bDwvc3ViPiAgJm1pbnVzOyAmYmV0YTs8c3VwPio8L3N1cD4gUyAoSSArIEk8c3ViPm5laWdoYm9yPC9zdWI+KCkgKSArICZnYW1tYTtSICAmbWludXM7ICZtdTsgUzwvZW0+CisgKiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7SSA8c3VwPlI8L3N1cD4gPSAoMS14KSZiZXRhOzxzdXA+Kjwvc3VwPiBTIChJICsgSTxzdWI+bmVpZ2hib3I8L3N1Yj4oKSApICZtaW51czsgJnNpZ21hO0kgPHN1cD5SPC9zdXA+ICAmbWludXM7ICZtdTtJIDxzdXA+Ujwvc3VwPiA8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0kgPHN1cD5GPC9zdXA+ID0geCAmYmV0YTs8c3VwPio8L3N1cD4gUyAoSSArIEk8c3ViPm5laWdoYm9yPC9zdWI+KCkgKSAgJm1pbnVzOyAoJm11OyArICZtdTs8c3ViPmk8L3N1Yj4pIEkgPHN1cD5GPC9zdXA+IDwvZW0+CisgKiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7Uj0gICAmc2lnbWE7STxzdXA+Ujwvc3VwPiAmbWludXM7ICZnYW1tYTtSICZtaW51czsgJm11O1I8L2VtPiA8L2xpPgorICogPC91bD4KKyAqIAorICogU3BlY2lmaWMgc3RhdGlzdGljcyBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIGJpcnRocywgZGVhdGhzIGFuZCBkZWF0aHMgZHVlIHRvCisgKiB0aGUgZGlzZWFzZSBjYW4gYmUgY29tcHV0ZWQgYnkgYWRkaW5nIHRoZSBhcHByb3ByaWF0ZSB0ZXJtcyBvZiB0aGUgZXF1YXRpb25zCisgKiBhYm92ZS4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+Qj0gJm11OyAoUyArIEkgKyBSKTwvZW0+LCBpcyB0aGUgbnVtYmVyIG9mIDxlbT5CaXJ0aHM8L2VtPiA8L2xpPgorICogPGxpPjxlbT5EID0gJm11OyBTICsgKCZtdTsgKyAmbXU7PHN1Yj5pPC9zdWI+IClJPHN1cD5GPC9zdXA+ICsgJm11O0k8c3VwPlI8L3N1cD4gKyAmbXU7UjwvZW0+LGlzCisgKiB0aGUgdG90YWwgbnVtYmVyIG9mIDxlbT5EZWF0aHM8L2VtPjwvbGk+CisgKiA8bGk+PGVtPkREPSAmbXU7PHN1Yj5pPC9zdWI+IEk8c3VwPkY8L3N1cD48L2VtPiwgaXMgdGhlIG51bWJlciBvZgorICogPGVtPkRpc2Vhc2UgRGVhdGhzPC9lbT4gPC9saT4KKyAqIDwvdWw+CisgKiBAc2VlIFNJCisgKiBAc2VlIFNJUkxhYmVsCisgKiBAc2VlIFNJUkxhYmVsVmFsdWUKKyAqIEBzZWUgU0VJUgorICogQHNlZSBTRUlSTGFiZWwKKyAqIEBzZWUgU0VJUkxhYmVsVmFsdWUKKyAqIAorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICovCitwdWJsaWMgaW50ZXJmYWNlIFNJUiBleHRlbmRzIFNJIHsKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzZWdtZW50IG9mIHRoZSB0eXBlIFVSSSB0aGF0IHByZWZpeGVzIGFsbCBvdGhlciBzZWdtZW50cyBpbiBhCisJICogc3RhbmRhcmQgZGlzZWFzZSBtb2RlbCB0eXBlIFVSSS4KKwkgKi8KKwlTdHJpbmcgVVJJX1RZUEVfU1RBTkRBUkRfU0lSX0RJU0VBU0VfTU9ERUxfU0VHTUVOVCA9IFVSSV9UWVBFX1NUQU5EQVJEX0RJU0VBU0VNT0RFTF9TRUdNRU5UCisJCQkrICIvc2lyIjsKKworCS8qKgorCSAqIFRoZSBUeXBlIFVSSSBmb3IgdGhlIHN0YW5kYXJkIFNJUiBkaXNlYXNlIG1vZGVsCisJICovCisJVVJJIFVSSV9UWVBFX1NUQU5EQVJEX1NJUl9ESVNFQVNFX01PREVMID0gU1RFTVVSSQorCQkJLmNyZWF0ZVR5cGVVUkkoVVJJX1RZUEVfU1RBTkRBUkRfU0lSX0RJU0VBU0VfTU9ERUxfU0VHTUVOVCk7CisKKwkvKioKKwkgKiBUaGlzIGNvZWZmaWNpZW50IGRldGVybWluZXMgdGhlIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgdGhhdCBsb3NlCisJICogdGhlaXIgaW1tdW5pdHkgdG8gYSBkaXNlYXNlIGFuZCBiZWNvbWUgU3VzY2VwdGlibGUgdG8gdGhlIGRpc2Vhc2UgcGVyCisJICogcG9wdWxhdGlvbiBtZW1iZXIgaW4gdGhlIDxlbT5SZWNvdmVyZWQ8L2VtPiBzdGF0ZS4gQSB2YWx1ZSBvZiB6ZXJvCisJICogKDAuMCksIHRoZSBkZWZhdWx0LCBtZWFucyB0aGUgcG9wdWxhdGlvbiBtZW1iZXJzIG5ldmVyIGxvc2UgdGhlaXIKKwkgKiBpbW11bml0eS4gVGhpcyBpcyA8ZW0+JmdhbW1hOzwvZW0+LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHByb3BvcnRpb24gb2YgPGVtPlJlY292ZXJlZDwvZW0+IHBvcHVsYXRpb24gbWVtYmVycyB0aGF0CisJICogICAgICAgICBsb3NlIHRoZWlyIGltbXVuaXR5IHBlciB0aW1lIHBlcmlvZC4KKwkgKiBAbW9kZWwgZGVmYXVsdD0iMC4wIgorCSAqLworCWRvdWJsZSBnZXRJbW11bml0eUxvc3NSYXRlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSI2dldEltbXVuaXR5TG9zc1JhdGUgPGVtPkltbXVuaXR5IExvc3MgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkltbXVuaXR5IExvc3MgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SW1tdW5pdHlMb3NzUmF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SW1tdW5pdHlMb3NzUmF0ZShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogQ29tcHV0ZSB0aGUgaW1tdW5pdHkgcmF0ZSBhZGp1c3RlZCBmb3IgYSB0aW1lIGRlbHRhIHBvdGVudGlhbGx5IGRpZmZlcmVudAorCSAqIGZyb20gdGhlIHRpbWUgcGVyaW9kIHNwZWNpZmllZCBmb3IgdGhlIHJhdGUuCisJICogCisJICogQHBhcmFtIHRpbWVEZWx0YQorCSAqICAgICAgICAgICAgdGhlIHRpbWUgcGVyaW9kIChtaWxsaXNlY29uZHMpIHRvIHdoaWNoIHRoZSByYXRlIGlzIHRvIGJlCisJICogICAgICAgICAgICBhZGp1c3RlZC4KKwkgKiBAcmV0dXJuIHRoZSBhZGp1c3RlZCByYXRlCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCWRvdWJsZSBnZXRBZGp1c3RlZEltbXVuaXR5TG9zc1JhdGUoZmluYWwgbG9uZyB0aW1lRGVsdGEpOworCit9IC8vIFNJUgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU0lSSW5vY3VsYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU0lSSW5vY3VsYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MWUzYWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TSVJJbm9jdWxhdG9yLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLy8gU0lSSW5vY3VsYXRvci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgdGhlIGluaXRpYWxpemF0aW9uIG9mIGFuCisgKiBpbm9jdWxhdGVkIHBvcHVsYXRpb24gaW4gYSBTdGFuZGFyZCBkaXNlYXNlIG1vZGVsLgorICogCisgKiBUaGUgaW5vY3VsYXRvciByZW1vdmVzIGEgZnJhY3Rpb24gb2YgdGhlIHBvcHVsYXRpb24gZnJvbSB0aGUgPGVtPlN1c2NlcHRpYmxlPC9lbT4gc3RhdGUKKyAqIHRvIHRoZSA8ZW0+UmVjb3ZlcmVkPC9lbT4gc3RhdGUgYXQgYXQgcGFydGljdWxhciBub2RlLgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBTSVJJbm9jdWxhdG9yIGV4dGVuZHMgU0lJbmZlY3RvciB7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbm9jdWxhdGVkIFBlcmNlbnRhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMSI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5vY3VsYXRlZCBQZXJjZW50YWdlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklub2N1bGF0ZWQgUGVyY2VudGFnZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SW5vY3VsYXRlZFBlcmNlbnRhZ2UoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRTSVJJbm9jdWxhdG9yX0lub2N1bGF0ZWRQZXJjZW50YWdlKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldElub2N1bGF0ZWRQZXJjZW50YWdlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSSW5vY3VsYXRvciNnZXRJbm9jdWxhdGVkUGVyY2VudGFnZSA8ZW0+SW5vY3VsYXRlZCBQZXJjZW50YWdlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbm9jdWxhdGVkIFBlcmNlbnRhZ2U8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldElub2N1bGF0ZWRQZXJjZW50YWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJbm9jdWxhdGVkUGVyY2VudGFnZShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5vY3VsYXRlIFBlcmNlbnRhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5vY3VsYXRlIFBlcmNlbnRhZ2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5vY3VsYXRlIFBlcmNlbnRhZ2U8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldElub2N1bGF0ZVBlcmNlbnRhZ2UoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U0lSSW5vY3VsYXRvcl9Jbm9jdWxhdGVQZXJjZW50YWdlKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0lub2N1bGF0ZVBlcmNlbnRhZ2UoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJJbm9jdWxhdG9yI2lzSW5vY3VsYXRlUGVyY2VudGFnZSA8ZW0+SW5vY3VsYXRlIFBlcmNlbnRhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklub2N1bGF0ZSBQZXJjZW50YWdlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc0lub2N1bGF0ZVBlcmNlbnRhZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldElub2N1bGF0ZVBlcmNlbnRhZ2UoYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzZWdtZW50IG9mIHRoZSB0eXBlIFVSSSB0aGF0IHByZWZpeGVzIGFsbCBvdGhlciBzZWdtZW50cyBpbiBhCisJICogc3RhbmRhcmQgaW5mZWN0b3Igb3IgaW5vY3VsYXRvciB0eXBlIFVSSS4KKwkgKi8KKwlTdHJpbmcgVVJJX1RZUEVfU0lSX0lORkVDVE9SX1NFR01FTlQgPSBVUklfVFlQRV9TVEFOREFSRF9JTkZFQ1RPUl9TRUdNRU5UCisJCQkrICIvc2lyIjsKKworfSAvLyBTSUlub2N1bGF0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1NJUkxhYmVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TSVJMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YzIwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TSVJMYWJlbC5qYXZhCkBAIC0wLDAgKzEsMjE2IEBACisvLyBTSVJMYWJlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgYW4gU0lSIGRpc2Vhc2UgbW9kZWwKKyAqIGR5bmFtaWMgbGFiZWwuCisgKiAKKyAqIEBzZWUgU3RhbmRhcmREaXNlYXNlTW9kZWwKKyAqIEBzZWUgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbAorICogQHNlZSBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUKKyAqIEBzZWUgU0kKKyAqIEBzZWUgU0lMYWJlbAorICogQHNlZSBTSUxhYmVsVmFsdWUKKyAqIEBzZWUgU0lSCisgKiBAc2VlIFNJUkxhYmVsVmFsdWUKKyAqIEBzZWUgU0VJUgorICogQHNlZSBTRUlSTGFiZWwKKyAqIEBzZWUgU0VJUkxhYmVsVmFsdWUKKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU0lSTGFiZWwgZXh0ZW5kcyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIHsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlbHRhIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWx0YSBWYWx1ZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWx0YSBWYWx1ZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0RGVsdGFWYWx1ZShTSVJMYWJlbFZhbHVlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRTSVJMYWJlbF9EZWx0YVZhbHVlKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU0lSTGFiZWxWYWx1ZSBnZXREZWx0YVZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWwjZ2V0RGVsdGFWYWx1ZSA8ZW0+RGVsdGEgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlbHRhIFZhbHVlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXREZWx0YVZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREZWx0YVZhbHVlKFNJUkxhYmVsVmFsdWUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvYmUgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2JlIFZhbHVlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2JlIFZhbHVlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRQcm9iZVZhbHVlKFNJUkxhYmVsVmFsdWUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFNJUkxhYmVsX1Byb2JlVmFsdWUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTSVJMYWJlbFZhbHVlIGdldFByb2JlVmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbCNnZXRQcm9iZVZhbHVlIDxlbT5Qcm9iZSBWYWx1ZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvYmUgVmFsdWU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFByb2JlVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFByb2JlVmFsdWUoU0lSTGFiZWxWYWx1ZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW1wIFZhbHVlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbXAgVmFsdWU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFRlbXBWYWx1ZShTSVJMYWJlbFZhbHVlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRTSVJMYWJlbF9UZW1wVmFsdWUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTSVJMYWJlbFZhbHVlIGdldFRlbXBWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsI2dldFRlbXBWYWx1ZSA8ZW0+VGVtcCBWYWx1ZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcCBWYWx1ZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0VGVtcFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUZW1wVmFsdWUoU0lSTGFiZWxWYWx1ZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcmlnaW5hbCBWYWx1ZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldE9yaWdpbmFsVmFsdWUoU0lSTGFiZWxWYWx1ZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U0lSTGFiZWxfT3JpZ2luYWxWYWx1ZSgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCVNJUkxhYmVsVmFsdWUgZ2V0T3JpZ2luYWxWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsI2dldE9yaWdpbmFsVmFsdWUgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0T3JpZ2luYWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0T3JpZ2luYWxWYWx1ZShTSVJMYWJlbFZhbHVlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVycm9yIFNjYWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FcnJvciBTY2FsZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FcnJvciBTY2FsZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0RXJyb3JTY2FsZShTSVJMYWJlbFZhbHVlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRTSVJMYWJlbF9FcnJvclNjYWxlKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU0lSTGFiZWxWYWx1ZSBnZXRFcnJvclNjYWxlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWwjZ2V0RXJyb3JTY2FsZSA8ZW0+RXJyb3IgU2NhbGU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVycm9yIFNjYWxlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRFcnJvclNjYWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRFcnJvclNjYWxlKFNJUkxhYmVsVmFsdWUgdmFsdWUpOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdG9wLWxldmVsIHNlZ21lbnQgZm9yIGFsbCB0eXBlIFVSSSdzIGZvciBTSVIgZGlzZWFzZSBtb2RlbAorCSAqIGxhYmVscy4KKwkgKi8KKwlTdHJpbmcgVVJJX1RZUEVfU0lSX0xBQkVMX1NFR01FTlQgPSBVUklfVFlQRV9TVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX1NFR01FTlQKKwkJCSsgIi9zaXIiOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdHlwZSBVUkkgZm9yIHN0YW5kYXJkIFNJUiBkaXNlYXNlIGxhYmVscworCSAqLworCVVSSSBVUklfVFlQRV9TSVJfTEFCRUwgPSBTVEVNVVJJLmNyZWF0ZVR5cGVVUkkoVVJJX1RZUEVfU0lSX0xBQkVMX1NFR01FTlQpOworCisJLyoqCisJICogQHJldHVybiB0aGUgY3VycmVudCBudW1iZXIgb2YgInJlY292ZXJlZCIgcG9wdWxhdGlvbiBtZW1iZXJzCisJICovCisJcHVibGljIGRvdWJsZSBnZXRSKCk7CisKKwkvKioKKwkgKiBAcGFyYW0gcgorCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgbnVtYmVyIG9mICJyZWNvdmVyZWQiIHBvcHVsYXRpb24KKwkgKiAgICAgICAgICAgIG1lbWJlcnMKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSKGRvdWJsZSByKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG5leHQgbnVtYmVyIG9mICJyZWNvdmVyZWQiIHBvcHVsYXRpb24gbWVtYmVycworCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0TmV4dFIoKTsKKworCS8qKgorCSAqIEBwYXJhbSByCisJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgbmV4dCBudW1iZXIgb2YgInJlY292ZXJlZCIgcG9wdWxhdGlvbgorCSAqICAgICAgICAgICAgbWVtYmVycworCSAqLworCXB1YmxpYyB2b2lkIHNldE5leHRSKGRvdWJsZSByKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgU0lSIGxhYmVsIHZhbHVlCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgorCSAqLworCVNJUkxhYmVsVmFsdWUgZ2V0Q3VycmVudFNJUlZhbHVlKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuZXh0IFNJUiBsYWJlbCB2YWx1ZQorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKKwkgKi8KKwlTSVJMYWJlbFZhbHVlIGdldE5leHRTSVJWYWx1ZSgpOworfSAvLyBTSVJMYWJlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU0lSTGFiZWxWYWx1ZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU0lSTGFiZWxWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYWY4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TSVJMYWJlbFZhbHVlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLy8gU0lSTGFiZWxWYWx1ZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgYW4gU0lSIGRpc2Vhc2UgbW9kZWwgbGFiZWwKKyAqIHZhbHVlLiBUaGUgdmFsdWVzIG9mIHRoaXMgbGFiZWwgcmVjb3JkIHRoZSBudW1iZXIgb2YgcG9wdWxhdGlvbiBtZW1iZXJzIHdobworICogYXJlIGluIG9uZSBvZiB0aHJlZSBzdGF0ZXMgd2l0aCByZXNwZWN0IHRvIGEgcGFydGljdWxhciBkaXNlYXNlLgorICogPHVsPgorICogPGxpPjxlbT5TdXNjZXB0aWJsZTwvZW0+IHdoaWNoIG1lYW5zIHRoYXQgdGhleSBhcmUgbm90IGluZmVjdGVkIGJ5IHRoZQorICogZGlzZWFzZSwgYnV0IHRoZXkgY2FuIGJlY29tZSBpbmZlY3RlZCBieSB0aGUgZGlzZWFzZS48L2xpPgorICogPGxpPjxlbT5JbmZlY3Rpb3VzPC9lbT4gd2hpY2ggbWVhbnMgdGhhdCBwb3B1bGF0aW9uIG1lbWJlcnMgYXJlIGluZmVjdGVkCisgKiB3aXRoIHRoZSBkaXNlYXNlIGFuZCB0aGV5IGNhbiBpbmZlY3Qgb3RoZXJzLiA8L2xpPgorICogPGxpPjxlbT5SZWNvdmVyZWQ8L2VtPiB3aGljaCBtZWFucyB0aGF0IHBvcHVsYXRpb24gbWVtYmVycyBhcmUgbm90CisgKiBpbmZlY3RlZCB3aXRoIHRoZSBkaXNlYXNlIGFuZCA8ZW0+Y2Fubm90PC9lbT4gYmVjb21lIGluZmVjdGVkIGJ5IHRoZQorICogZGlzZWFzZS4gTm90ZSB0aGF0IGluIHNvbWUgZGlzZWFzZSBtb2RlbHMgYSBwb3B1bGF0aW9uIG1lbWJlciBpbiB0aGUKKyAqIDxlbT5SZWNvdmVyZWQ8L2VtPiBzdGF0ZSBjb3VsZCB0cmFuc2l0aW9uIHRvIHRoZSA8ZW0+U3VzY2VwdGlibGU8L2VtPgorICogc3RhdGUgYW5kIHRoZW4gYmVjb21lIGEgY2FuZGlkYXRlIGZvciByZS1pbmZlY3Rpb24uPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIFN1Yi1jbGFzc2VzIGNvdWxkIGludHJvZHVjZSBhZGRpdGlvbmFsIHN0YXRlcyBpbiB3aGljaCBwb3B1bGF0aW9uIG1lbWJlcnMKKyAqIGNvdWxkIGV4aXN0LgorICogPC9wPgorICogCisgKiBAc2VlIFNJUgorICogQHNlZSBTSVJMYWJlbAorICogQHNlZSBTRUlSCisgKiBAc2VlIFNFSVJMYWJlbAorICogQHNlZSBTRUlSTGFiZWxWYWx1ZQorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBTSVJMYWJlbFZhbHVlIGV4dGVuZHMgU0lMYWJlbFZhbHVlIHsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgaW4gdGhlIDxlbT5SZWNvdmVyZWQ8L2VtPgorCSAqICAgICAgICAgc3RhdGUuCisJICogQG1vZGVsCisJICovCisJZG91YmxlIGdldFIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbFZhbHVlI2dldFIgPGVtPlI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRSKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRSKGRvdWJsZSB2YWx1ZSk7CisKK30gLy8gU0lSTGFiZWxWYWx1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU3RhbmRhcmREaXNlYXNlTW9kZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkRGlzZWFzZU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhZTk0MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkRGlzZWFzZU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8vIFN0YW5kYXJkRGlzZWFzZU1vZGVsLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgY2xhc3MgaW4gYW4gRU1GIG1vZGVsIGZvciBhIFN0YW5kYXJkIGRpc2Vhc2UgbW9kZWwuCisgKiAKKyAqIEBzZWUgU0lSCisgKiBAc2VlIFNJUkxhYmVsCisgKiBAc2VlIFNJUkxhYmVsVmFsdWUKKyAqIEBzZWUgU0VJUgorICogQHNlZSBTRUlSTGFiZWwKKyAqIEBzZWUgU0VJUkxhYmVsVmFsdWUKKyAqIAorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICovCitwdWJsaWMgaW50ZXJmYWNlIFN0YW5kYXJkRGlzZWFzZU1vZGVsIGV4dGVuZHMgRGlzZWFzZU1vZGVsLCBJbnRlZ3JhdGlvbkRlY29yYXRvciB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzZWdtZW50IG9mIHRoZSB0eXBlIFVSSSB0aGF0IHByZWZpeGVzIGFsbCBvdGhlciBzZWdtZW50cyBpbiBhCisJICogc3RhbmRhcmQgZGlzZWFzZSBtb2RlbCB0eXBlIFVSSS4KKwkgKi8KKwlTdHJpbmcgVVJJX1RZUEVfU1RBTkRBUkRfRElTRUFTRU1PREVMX1NFR01FTlQgPSBVUklfVFlQRV9ESVNFQVNFTU9ERUxfU0VHTUVOVAorCQkJKyAiL3N0YW5kYXJkIjsKKworCisJLyoqCisJICogQWRkIGEgbnVtYmVyIG9mIHBvcHVsYXRpb24gbWVtYmVycyB0byBhbiBhY2N1bXVsYXRpbmcgdmFsdWUgZm9yIHRoZSB0b3RhbAorCSAqIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgKGluIGFsbCBkaXNlYXNlIHN0YXRlcykgZm9yIGFsbCB7QGxpbmsgTm9kZX1zCisJICogZm9yIHdoaWNoIHRoaXMge0BsaW5rIFN0YW5kYXJkRGlzZXNlTW9kZWx9IGNvbXB1dGVzCisJICoge0BsaW5rIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWx9IHZhbHVlcy4KKwkgKiAKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbkNvdW50CisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHBvcHVsYXRpb24gbWVtYmVycyB0byBhZGQgdG8gdGhlIHRvdGFsCisJICogQHNlZSAjZ2V0VG90YWxQb3B1bGF0aW9uQ291bnQoKQorCSAqIEBzZWUgI3NldFRvdGFsUG9wdWxhdGlvbkNvdW50KGRvdWJsZSkKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJdm9pZCBhZGRUb1RvdGFsUG9wdWxhdGlvbkNvdW50KGZpbmFsIGRvdWJsZSBwb3B1bGF0aW9uQ291bnQpOworCisJLyoqCisJICogQHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIHBvcHVsYXRpb24gbWVtYmVycyB0aGlzIGRpc2Vhc2UgbW9kZWwgaXMKKwkgKiAgICAgICAgIHByb2Nlc3NpbmcKKwkgKiBAc2VlICNzZXRUb3RhbFBvcHVsYXRpb25Db3VudChkb3VibGUpCisJICogQHNlZSAjYWRkVG9Ub3RhbFBvcHVsYXRpb25Db3VudChkb3VibGUpCisJICogQG1vZGVsIGRlZmF1bHQ9IjAiCisJICovCisJZG91YmxlIGdldFRvdGFsUG9wdWxhdGlvbkNvdW50KCk7CisJCisJLyoqCisJICogCS8qKgorCSAqIFRoZSBUcmFuc21pc3Npb24gQ29lZmZpY2llbnQgKGJldGEpIG11c3QgYmUgc2NhbGVkIGJ5CisJICogdGhlIGxvY2FsIHBvcHVsYXRpb24gZGVuc2l0eSBkaXZpZGVkIGJ5IGEgcmVmZXJlbmNlCisJICogcG9wdWxhdGlvbiBkZW5zaXR5IChlLmcuIHRoZSBwYXJ0aWN1bGFyIGxvY2F0aW9uIHdoZXJlIGJldGEgaXMga25vdyBvciB3YXMgbWVhc3VyZWQpCisJICogRm9yIGV4YW1wbGUsIGluIHRoZSBVUyB0aGUgYXZnIHBvcCBkZW5zaXR5IGlzIDMyLjkgcGVvcGxlIHBlciBzcXVhcmUga20KKwkgKiBJbiBDaGluYSwgMTQxLjggcGVvcGxlIHBlciBzcSBrbSwKKwkgKiBJbiBFdXJvcGUgNjkuNyBwZW9wbGUgcGVyIHNxIGttCisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTAwIGJ1dCB0aGlzIHNob3VsZCBiZSBzcGVjaWZpZWQgZm9yIGFueQorICAgICAqIGRpc2Vhc2UgYWxvbmcgd2l0aCB0aGUgdmFsdWUgYmV0YS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGluCisgICAgICogZ2V0VHJhbnNtaXNzaW9uUmF0ZVNjYWxlRmFjdG9yIGFuZCB1c2VkIHRvIGNvbXB1dGVUcmFuc2lvbnMgbWV0aG9kIGZvciBhIGRpc2VhZXMgbW9kZWwuCisJICogQHJldHVybiB0aGUgUmVmZXJlbmNlIFBvcHVsYXRpb24gCisJICogQHNlZSAjU0lJbXBsLmdldFRyYW5zbWlzc2lvblJhdGVTY2FsZUZhY3RvcigpCisJICogQHNlZSAjc2V0UmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHkoZG91YmxlKQorCSAqIEBtb2RlbCBkZWZhdWx0PSIxMDAiCisJICovCisJZG91YmxlIGdldFJlZmVyZW5jZVBvcHVsYXRpb25EZW5zaXR5KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwjZ2V0UmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHkgPGVtPlJlZmVyZW5jZSBQb3B1bGF0aW9uIERlbnNpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZSBQb3B1bGF0aW9uIERlbnNpdHk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFJlZmVyZW5jZVBvcHVsYXRpb25EZW5zaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRSZWZlcmVuY2VQb3B1bGF0aW9uRGVuc2l0eShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsI2dldFRvdGFsUG9wdWxhdGlvbkNvdW50IDxlbT5Ub3RhbCBQb3B1bGF0aW9uIENvdW50PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VG90YWwgUG9wdWxhdGlvbiBDb3VudDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VG90YWxQb3B1bGF0aW9uQ291bnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRvdGFsUG9wdWxhdGlvbkNvdW50KGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBDb21wdXRlIGFuZCBzdG9yZSB0aGUgcmVjaXByb2NhbCBvZiB0aGUgdG90YWwgcG9wdWxhdGlvbiBjb3VudC4gVGhpcworCSAqIHZhbHVlIG9ubHkgbmVlZHMgdG8gYmUgY29tcHV0ZWQgb25jZSBmb3IgZWFjaCBzaW11bGF0aW9uIGN5Y2xlIHNvIHdlCisJICogc3RvcmUgdGhlIHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3QgY29tcHV0ZSBpdCBtb3JlIHRoYW4gb25jZS4gVGhpcyBtZXRob2QKKwkgKiBpcyBjYWxsZWQgb25jZSBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgY3ljbGUsIGFuZCB0aGVuIGFnYWluIGF0IHRoZSBlbmQgb2YKKwkgKiBldmVyeSBjeWNsZSB3aGVuIHRoZSBjdXJyZW50IHRvdGFsIHBvcHVsYXRpb24gY291bnQgaGFzIGJlZW4gZGV0ZXJtaW5lZC4KKwkgKiAKKwkgKiBAcmV0dXJuIDEvZ2V0VG90YWxQb3B1bGF0aW9uQ291bnQoKQorCSAqIEBzZWUgI2dldFRvdGFsUG9wdWxhdGlvbkNvdW50UmVjaXByb2NhbCgpCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCWRvdWJsZSBjb21wdXRlVG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSByZWNpcHJvY2FsIG9mIHRoZSB0b3RhbCBwb3B1bGF0aW9uIGNvdW50LgorCSAqIEBzZWUgI2NvbXB1dGVUb3RhbFBvcHVsYXRpb25SZWNpcHJvY2FsKCkKKwkgKiBAbW9kZWwgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJZG91YmxlIGdldFRvdGFsUG9wdWxhdGlvbkNvdW50UmVjaXByb2NhbCgpOworCisJLyoqCisJICogQWRkIHRoZSBhcmVhIHZhbHVlIHRvIHRoZSBhY2N1bXVsYXRpbmcgdmFsdWUgZm9yIHRoZSB0b3RhbCBhcmVhIG9mIGFsbAorCSAqIHtAbGluayBOb2RlfXMgZm9yIHdoaWNoIHRoaXMge0BsaW5rIFN0YW5kYXJkRGlzZXNlTW9kZWx9IGNvbXB1dGVzCisJICoge0BsaW5rIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWx9IHZhbHVlcy4KKwkgKiAKKwkgKiBAcGFyYW0gYXJlYQorCSAqICAgICAgICAgICAgdGhlIGFyZWEgdG8gYWRkIChrbV4yKQorCSAqIEBzZWUgI2dldFRvdGFsQXJlYSgpCisJICogQHNlZSAjc2V0VG90YWxBcmVhKGRvdWJsZSkKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJdm9pZCBhZGRUb1RvdGFsQXJlYShmaW5hbCBkb3VibGUgYXJlYSk7CisKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBtb2RlbCBsYWJlbHNNYW55PSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBjYWxjdWxhdGVEZWx0YShTVEVNVGltZSB0aW1lLCBsb25nIHRpbWVEZWx0YSwgRUxpc3Q8RHluYW1pY0xhYmVsPiBsYWJlbHMpOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBkb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyhTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgbGFiZWwpOworCisJLyoqCisJICogQHJldHVybiB0aGUgdG90YWwgYXJlYSAoa21eMikgb2NjdXBpZWQgYnkgdGhlIHBvcHVsYXRpb24gd2hvc2UgZGlzZWFzZQorCSAqICAgICAgICAgc3RhdGUgaXMgcHJvY2Vzc2VkIGJ5IHRoaXMgPGNvZGU+U3RhbmRhcmREaXNlc2VNb2RlbDwvY29kZT4KKwkgKiBAc2VlICNhZGRUb1RvdGFsQXJlYShkb3VibGUpCisJICogQHNlZSAjc2V0VG90YWxBcmVhKGRvdWJsZSkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMCIKKwkgKi8KKwlkb3VibGUgZ2V0VG90YWxBcmVhKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwjZ2V0VG90YWxBcmVhIDxlbT5Ub3RhbCBBcmVhPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VG90YWwgQXJlYTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VG90YWxBcmVhKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUb3RhbEFyZWEoZG91YmxlIHZhbHVlKTsKKworfSAvLyBTdGFuZGFyZERpc2Vhc2VNb2RlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZDY0MjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLy8gU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgY2xhc3MgaW4gYW4gRU1GIG1vZGVsIGZvciBhIFN0YW5kYXJkIERpc2Vhc2UgbW9kZWwKKyAqIGxhYmVsLiBBIHN0YW5kYXJkIGRpc2Vhc2UgbW9kZWwgaXMgb25lIHRoYXQgY29tcHV0ZXMgdGhlIGNoYW5nZXMgaW4KKyAqIHBvcHVsYXRpb24gc3RhdGUgd2hlbiB0aGVyZSBpcyBhIHNpbmdsZSA8ZW0+U3VzY2VwdGlibGU8L2VtPiBzdGF0ZS4KKyAqIAorICogQHNlZSBTSQorICogQHNlZSBTSUxhYmVsCisgKiBAc2VlIFNJTGFiZWxWYWx1ZQorICogQHNlZSBTSVIKKyAqIEBzZWUgU0lSTGFiZWwKKyAqIEBzZWUgU0lSTGFiZWxWYWx1ZQorICogQHNlZSBTRUlSCisgKiBAc2VlIFNFSVJMYWJlbAorICogQHNlZSBTRUlSTGFiZWxWYWx1ZQorICogCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBleHRlbmRzIERpc2Vhc2VNb2RlbExhYmVsLCBJbnRlZ3JhdGlvbkxhYmVsIHsKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB0b3AtbGV2ZWwgc2VnbWVudCBmb3IgYWxsIHR5cGUgVVJJJ3MgZm9yIHN0YW5kYXJkIGRpc2Vhc2UKKwkgKiBtb2RlbCBsYWJlbHMuCisJICovCisJU3RyaW5nIFVSSV9UWVBFX1NUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfU0VHTUVOVCA9IFVSSV9UWVBFX0RJU0VBU0VfTU9ERUxfTEFCRUxfU0VHTUVOVAorCQkJKyAiL3N0YW5kYXJkIjsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgbnVtYmVyIG9mICJzdXNjZXB0aWJsZSIgcG9wdWxhdGlvbiBtZW1iZXJzCisJICovCisJcHVibGljIGRvdWJsZSBnZXRTKCk7CisKKwkvKioKKwkgKiBAcGFyYW0gcworCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgbnVtYmVyIG9mICJzdXNjZXB0aWJsZSIKKwkgKiAgICAgICAgICAgIHBvcHVsYXRpb24gbWVtYmVycworCSAqLworCXB1YmxpYyB2b2lkIHNldFMoZG91YmxlIHMpOworCisJLyoqCisJICogQHJldHVybiB0aGUgbmV4dCBudW1iZXIgb2YgInN1c2NlcHRpYmxlIiBwb3B1bGF0aW9uIG1lbWJlcnMKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE5leHRTKCk7CisKKwkvKioKKwkgKiBAcGFyYW0gcworCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIG5leHQgbnVtYmVyIG9mICJzdXNjZXB0aWJsZSIgcG9wdWxhdGlvbgorCSAqICAgICAgICAgICAgbWVtYmVycworCSAqLworCXB1YmxpYyB2b2lkIHNldE5leHRTKGRvdWJsZSBzKTsKKworCit9IC8vIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2NzU3NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8vIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgYW4gU3RhbmRhcmQgZGlzZWFzZSBtb2RlbAorICogbGFiZWwgdmFsdWUuIEluIGEgc3RhbmRhcmQgZGlzZWFzZSBtb2RlbCBwb3B1bGF0aW9uIG1lbWJlcnMgY2FuIGJlIGluIGEKKyAqIHNpbmdsZSA8ZW0+U3VzY2VwdGlibGU8L2VtPiBzdGF0ZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGV5IGFyZSBub3QgZXhwb3NlZCBvcgorICogaW5mZWN0ZWQgYnkgYSBkaXNlYXNlLiBTdWItY2xhc3NlcyBjb3VsZCBpbnRyb2R1Y2UgYWRkaXRpb25hbCBzdGF0ZXMgaW4gd2hpY2gKKyAqIHBvcHVsYXRpb24gbWVtYmVycyBjb3VsZCBleGlzdC4KKyAqIAorICogQHNlZSBTSVIKKyAqIEBzZWUgU0lSTGFiZWwKKyAqIEBzZWUgU0lSTGFiZWxWYWx1ZQorICogQHNlZSBTRUlSCisgKiBAc2VlIFNFSVJMYWJlbAorICogQHNlZSBTRUlSTGFiZWxWYWx1ZQorICogCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKi8KKworcHVibGljIGludGVyZmFjZSBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZXh0ZW5kcyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHsKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcG9wdWxhdGlvbiBtZW1iZXJzIGluIHRoZSA8ZW0+U3VzY2VwdGlibGU8L2VtPgorCSAqICAgICAgICAgc3RhdGUuCisJICogQG1vZGVsCisJICovCisJZG91YmxlIGdldFMoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUjZ2V0UyA8ZW0+UzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UzwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0UygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Uyhkb3VibGUgdmFsdWUpOworCisKK30gLy8gU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJlNjFmYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvLyBTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgY2xhc3MgaW4gYW4gRU1GIG1vZGVsIHRoYXQgY29udGFpbnMgc3RhdGUKKyAqIGluZm9ybWF0aW9uIGZvciBhIHN0YW5kYXJkIFNURU0gZGlzZWFzZSBtb2RlbCdzIGNvbXB1dGF0aW9ucyBmcm9tIG9uZQorICogc2ltdWxhdGlvbiBjeWNsZSB0byBhbm90aGVyLgorICogCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZSBleHRlbmRzIERpc2Vhc2VNb2RlbFN0YXRlIHsKKworCS8qKgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHJhdGlvIGJldHdlZW4gdGhlIHRvdGFsIGFyZWEgb2YgYWxsIHtAbGluayBOb2RlfXMgcHJvY2Vzc2VkCisJICogICAgICAgICBieSB0aGUge0BsaW5rIFN0YW5kYXJkRGlzZWFzZU1vZGVsfSBhbmQgdGhlIGFyZWEgb2YgdGhlCisJICogICAgICAgICB7QGxpbmsgTm9kZX0gdGhhdCB0aGUge0BsaW5rIERpc2Vhc2VNb2RlbExhYmVsfSBpcyBhc3NvY2lhdGVkCisJICogICAgICAgICB3aXRoLgorCSAqIEBtb2RlbAorCSAqLworCWRvdWJsZSBnZXRBcmVhUmF0aW8oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlI2dldEFyZWFSYXRpbyA8ZW0+QXJlYSBSYXRpbzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXJlYSBSYXRpbzwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0QXJlYVJhdGlvKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRBcmVhUmF0aW8oZG91YmxlIHZhbHVlKTsKKworfS8vIFN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU3RhbmRhcmRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZlMGJiNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjQ5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFN0YW5kYXJkRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0YW5kYXJkRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZEZhY3RvcnlJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGV0ZXJtaW5pc3RpYyBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRldGVybWluaXN0aWMgU0VJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbCBjcmVhdGVEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXRlcm1pbmlzdGljIFNJIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRldGVybWluaXN0aWMgU0kgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsIGNyZWF0ZURldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXRlcm1pbmlzdGljIFNJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXRlcm1pbmlzdGljIFNJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsIGNyZWF0ZURldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0VJUiBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0VJUiBMYWJlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU0VJUkxhYmVsIGNyZWF0ZVNFSVJMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TRUlSIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TRUlSIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTRUlSTGFiZWxWYWx1ZSBjcmVhdGVTRUlSTGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TSSBEaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TSSBEaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTSURpc2Vhc2VNb2RlbFN0YXRlIGNyZWF0ZVNJRGlzZWFzZU1vZGVsU3RhdGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0kgSW5mZWN0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNJIEluZmVjdG9yPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTSUluZmVjdG9yIGNyZWF0ZVNJSW5mZWN0b3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0kgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNJIExhYmVsPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTSUxhYmVsIGNyZWF0ZVNJTGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0kgTGFiZWwgVmFsdWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNJIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTSUxhYmVsVmFsdWUgY3JlYXRlU0lMYWJlbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNJUiBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0lSIExhYmVsPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTSVJMYWJlbCBjcmVhdGVTSVJMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TSVIgTGFiZWwgVmFsdWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNJUiBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU0lSTGFiZWxWYWx1ZSBjcmVhdGVTSVJMYWJlbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN0b2NoYXN0aWMgU0VJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdG9jaGFzdGljIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwgY3JlYXRlU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3RvY2hhc3RpYyBTSSBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdG9jaGFzdGljIFNJIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbCBjcmVhdGVTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3RvY2hhc3RpYyBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3RvY2hhc3RpYyBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCBjcmVhdGVTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFnZ3JlZ2F0aW5nIFNJIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFnZ3JlZ2F0aW5nIFNJIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwgY3JlYXRlQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BZ2dyZWdhdGluZyBEaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BZ2dyZWdhdGluZyBEaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlIGNyZWF0ZUFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWdncmVnYXRpbmcgU0VJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BZ2dyZWdhdGluZyBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbCBjcmVhdGVBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWdncmVnYXRpbmcgU0lSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFnZ3JlZ2F0aW5nIFNJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCBjcmVhdGVBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TSVIgSW5vY3VsYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U0lSIElub2N1bGF0b3I8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVNJUklub2N1bGF0b3IgY3JlYXRlU0lSSW5vY3VsYXRvcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdG9jaGFzdGljIFBvaXNzb24gU0kgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3RvY2hhc3RpYyBQb2lzc29uIFNJIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwgY3JlYXRlU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdG9jaGFzdGljIFBvaXNzb24gU0lSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN0b2NoYXN0aWMgUG9pc3NvbiBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwgY3JlYXRlU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3RvY2hhc3RpYyBQb2lzc29uIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3RvY2hhc3RpYyBQb2lzc29uIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsIGNyZWF0ZVN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbmZlY3RvciBJbm9jdWxhdG9yIENvbGxlY3Rpb248L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluZmVjdG9yIElub2N1bGF0b3IgQ29sbGVjdGlvbjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbiBjcmVhdGVJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0YW5kYXJkUGFja2FnZSBnZXRTdGFuZGFyZFBhY2thZ2UoKTsKKworfSAvL1N0YW5kYXJkRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU3RhbmRhcmRJbmZlY3Rvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU3RhbmRhcmRJbmZlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMWZkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TdGFuZGFyZEluZmVjdG9yLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLy8gU3RhbmRhcmRJbmZlY3Rvci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgdGhlIGluaXRpYWxpemF0aW9uIG9mIGFuCisgKiBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gaW4gYSBTdGFuZGFyZCBkaXNlYXNlIG1vZGVsLgorICogCisgKiBUaGUgaW5mZWN0b3IgcmVtb3ZlcyBwb3B1bGF0aW9uIG1lbWJlcnMgZnJvbSB0aGUgPGVtPlN1c2NlcHRpYmxlPC9lbT4gc3RhdGUKKyAqIHRvIHRoZSA8ZW0+SW5mZWN0aW91czwvZW0+IHN0YXRlLgorICogCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3RhbmRhcmRJbmZlY3RvciBleHRlbmRzIEluZmVjdG9yIHsKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzZWdtZW50IG9mIHRoZSB0eXBlIFVSSSB0aGF0IHByZWZpeGVzIGFsbCBvdGhlciBzZWdtZW50cyBpbiBhCisJICogc3RhbmRhcmQgaW5mZWN0b3IgdHlwZSBVUkkuCisJICovCisJU3RyaW5nIFVSSV9UWVBFX1NUQU5EQVJEX0lORkVDVE9SX1NFR01FTlQgPSBVUklfVFlQRV9JTkZFQ1RPUl9TRUdNRU5UCisJCQkrICIvc3RhbmRhcmQiOworfSAvLyBTdGFuZGFyZEluZmVjdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TdGFuZGFyZFBhY2thZ2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkUGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYjgzMWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TdGFuZGFyZFBhY2thZ2UuamF2YQpAQCAtMCwwICsxLDkzNjkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50CisgKiA8dWw+CisgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorICogPC91bD4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5CisgKiBAbW9kZWwga2luZD0icGFja2FnZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBTdGFuZGFyZFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7CisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5BTUUgPSAic3RhbmRhcmQiOworCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC5lY29yZSI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQiOworCisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdGFuZGFyZFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbC5pbml0KCk7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbEltcGwgPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldERpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBESVNFQVNFX01PREVMID0gMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX19VUkkgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERJU0VBU0VfTU9ERUxfX1RZUEVfVVJJID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX19MQUJFTFNfVE9fVVBEQVRFID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERJU0VBU0VfTU9ERUxfX0dSQVBIID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19HUkFQSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRElTRUFTRV9NT0RFTF9fRU5BQkxFRCA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9fRU5BQkxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERJU0VBU0VfTU9ERUxfX1BST0dSRVNTID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19QUk9HUkVTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIE1vcnRhbGl0eSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURSA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX19USU1FX1BFUklPRCA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNlYXNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX19ESVNFQVNFX05BTUUgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVsYXRpdmUgVG9sZXJhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRElTRUFTRV9NT0RFTF9fUkVMQVRJVkVfVE9MRVJBTkNFID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbml0ZSBEaWZmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0UgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJlcXVlbmN5IERlcGVuZGVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERJU0VBU0VfTU9ERUxfX0ZSRVFVRU5DWV9ERVBFTkRFTlQgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBCaXJ0aCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9CSVJUSF9SQVRFID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyA3OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyA4OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZERpc2Vhc2VNb2RlbEltcGwgPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZERpc2Vhc2VNb2RlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfRElTRUFTRV9NT0RFTCA9IDE5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1VSSSA9IERJU0VBU0VfTU9ERUxfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1RZUEVfVVJJID0gRElTRUFTRV9NT0RFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFOREFSRF9ESVNFQVNFX01PREVMX19EVUJMSU5fQ09SRSA9IERJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX0xBQkVMU19UT19VUERBVEUgPSBESVNFQVNFX01PREVMX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX0dSQVBIID0gRElTRUFTRV9NT0RFTF9fR1JBUEg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX0VOQUJMRUQgPSBESVNFQVNFX01PREVMX19FTkFCTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX0dSQVBIX0RFQ09SQVRFRCA9IERJU0VBU0VfTU9ERUxfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1BST0dSRVNTID0gRElTRUFTRV9NT0RFTF9fUFJPR1JFU1M7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEUgPSBESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IERJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EID0gRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0Q7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FID0gRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aXZlIFRvbGVyYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1JFTEFUSVZFX1RPTEVSQU5DRSA9IERJU0VBU0VfTU9ERUxfX1JFTEFUSVZFX1RPTEVSQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pdGUgRGlmZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX0ZJTklURV9ESUZGRVJFTkNFID0gRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJlcXVlbmN5IERlcGVuZGVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX0ZSRVFVRU5DWV9ERVBFTkRFTlQgPSBESVNFQVNFX01PREVMX19GUkVRVUVOQ1lfREVQRU5ERU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgQmlydGggUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfQklSVEhfUkFURSA9IERJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfQklSVEhfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBQb3B1bGF0aW9uIENvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVCA9IERJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudCBSZWNpcHJvY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMID0gRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBBcmVhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fVE9UQUxfQVJFQSA9IERJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFBvcHVsYXRpb24gRGVuc2l0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFkgPSBESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UID0gRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lJbXBsIDxlbT5TSTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTSSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTSSA9IDExOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX19VUkkgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9fVFlQRV9VUkkgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX19EVUJMSU5fQ09SRSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX19MQUJFTFNfVE9fVVBEQVRFID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fTEFCRUxTX1RPX1VQREFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9fR1JBUEggPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX19HUkFQSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfX0VOQUJMRUQgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX19FTkFCTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX19HUkFQSF9ERUNPUkFURUQgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9fUFJPR1JFU1MgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX19QUk9HUkVTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIE1vcnRhbGl0eSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEUgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9fVElNRV9QRVJJT0QgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX19USU1FX1BFUklPRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNlYXNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9fRElTRUFTRV9OQU1FID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aXZlIFRvbGVyYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX19SRUxBVElWRV9UT0xFUkFOQ0UgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXRlIERpZmZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9fRklOSVRFX0RJRkZFUkVOQ0UgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX19GSU5JVEVfRElGRkVSRU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GcmVxdWVuY3kgRGVwZW5kZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfX0ZSRVFVRU5DWV9ERVBFTkRFTlQgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX19GUkVRVUVOQ1lfREVQRU5ERU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgQmlydGggUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX19CQUNLR1JPVU5EX0JJUlRIX1JBVEUgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBQb3B1bGF0aW9uIENvdW50IFJlY2lwcm9jYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIEFyZWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9fVE9UQUxfQVJFQSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1RPVEFMX0FSRUE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFBvcHVsYXRpb24gRGVuc2l0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc21pc3Npb24gUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX19UUkFOU01JU1NJT05fUkFURSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9uIExpbmVhcml0eSBDb2VmZmljaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWNvdmVyeSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfX1JFQ09WRVJZX1JBVEUgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT04gPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWQgTmV0d29yayBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTiA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9fSU5GRUNUSU9VU19NT1JUQUxJVFkgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0UgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA3OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNJPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX0ZFQVRVUkVfQ09VTlQgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA4OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJJbXBsIDxlbT5TSVI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFNJUigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTSVIgPSAxNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfX1VSSSA9IFNJX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfX1RZUEVfVVJJID0gU0lfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX19EVUJMSU5fQ09SRSA9IFNJX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfX0xBQkVMU19UT19VUERBVEUgPSBTSV9fTEFCRUxTX1RPX1VQREFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfX0dSQVBIID0gU0lfX0dSQVBIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfX0VOQUJMRUQgPSBTSV9fRU5BQkxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfX0dSQVBIX0RFQ09SQVRFRCA9IFNJX19HUkFQSF9ERUNPUkFURUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfX1BST0dSRVNTID0gU0lfX1BST0dSRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEUgPSBTSV9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IFNJX19QT1BVTEFUSU9OX0lERU5USUZJRVI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfX1RJTUVfUEVSSU9EID0gU0lfX1RJTUVfUEVSSU9EOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9fRElTRUFTRV9OQU1FID0gU0lfX0RJU0VBU0VfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWxhdGl2ZSBUb2xlcmFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfX1JFTEFUSVZFX1RPTEVSQU5DRSA9IFNJX19SRUxBVElWRV9UT0xFUkFOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXRlIERpZmZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfX0ZJTklURV9ESUZGRVJFTkNFID0gU0lfX0ZJTklURV9ESUZGRVJFTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyZXF1ZW5jeSBEZXBlbmRlbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfX0ZSRVFVRU5DWV9ERVBFTkRFTlQgPSBTSV9fRlJFUVVFTkNZX0RFUEVOREVOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIEJpcnRoIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfX0JBQ0tHUk9VTkRfQklSVEhfUkFURSA9IFNJX19CQUNLR1JPVU5EX0JJUlRIX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVCA9IFNJX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQgUmVjaXByb2NhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMID0gU0lfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBBcmVhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX19UT1RBTF9BUkVBID0gU0lfX1RPVEFMX0FSRUE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFBvcHVsYXRpb24gRGVuc2l0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWSA9IFNJX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zbWlzc2lvbiBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX19UUkFOU01JU1NJT05fUkFURSA9IFNJX19UUkFOU01JU1NJT05fUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob24gTGluZWFyaXR5IENvZWZmaWNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UID0gU0lfX05PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVjb3ZlcnkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9fUkVDT1ZFUllfUkFURSA9IFNJX19SRUNPVkVSWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUgPSBTSV9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaHlzaWNhbGx5IEFkamFjZW50IEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT04gPSBTSV9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTiA9IFNJX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX19JTkZFQ1RJT1VTX01PUlRBTElUWSA9IFNJX19JTkZFQ1RJT1VTX01PUlRBTElUWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFyYWN0ZXJpc3RpYyBNaXhpbmcgRGlzdGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRSA9IFNJX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1tdW5pdHkgTG9zcyBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX19JTU1VTklUWV9MT1NTX1JBVEUgPSBTSV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TSVI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX0ZFQVRVUkVfQ09VTlQgPSBTSV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0VJUkltcGwgPGVtPlNFSVI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TRUlSSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTRUlSKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNFSVIgPSA4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfX1VSSSA9IFNJUl9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VJUl9fVFlQRV9VUkkgPSBTSVJfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VJUl9fRFVCTElOX0NPUkUgPSBTSVJfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfX0xBQkVMU19UT19VUERBVEUgPSBTSVJfX0xBQkVMU19UT19VUERBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGg8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VJUl9fR1JBUEggPSBTSVJfX0dSQVBIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX19FTkFCTEVEID0gU0lSX19FTkFCTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfX0dSQVBIX0RFQ09SQVRFRCA9IFNJUl9fR1JBUEhfREVDT1JBVEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2dyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VJUl9fUFJPR1JFU1MgPSBTSVJfX1BST0dSRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFID0gU0lSX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IFNJUl9fUE9QVUxBVElPTl9JREVOVElGSUVSOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VJUl9fVElNRV9QRVJJT0QgPSBTSVJfX1RJTUVfUEVSSU9EOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfX0RJU0VBU0VfTkFNRSA9IFNJUl9fRElTRUFTRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aXZlIFRvbGVyYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfX1JFTEFUSVZFX1RPTEVSQU5DRSA9IFNJUl9fUkVMQVRJVkVfVE9MRVJBTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbml0ZSBEaWZmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VJUl9fRklOSVRFX0RJRkZFUkVOQ0UgPSBTSVJfX0ZJTklURV9ESUZGRVJFTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyZXF1ZW5jeSBEZXBlbmRlbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX19GUkVRVUVOQ1lfREVQRU5ERU5UID0gU0lSX19GUkVRVUVOQ1lfREVQRU5ERU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgQmlydGggUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfX0JBQ0tHUk9VTkRfQklSVEhfUkFURSA9IFNJUl9fQkFDS0dST1VORF9CSVJUSF9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UID0gU0lSX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQgUmVjaXByb2NhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTCA9IFNJUl9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIEFyZWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX19UT1RBTF9BUkVBID0gU0lSX19UT1RBTF9BUkVBOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBQb3B1bGF0aW9uIERlbnNpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZID0gU0lSX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zbWlzc2lvbiBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VJUl9fVFJBTlNNSVNTSU9OX1JBVEUgPSBTSVJfX1RSQU5TTUlTU0lPTl9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBMaW5lYXJpdHkgQ29lZmZpY2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UID0gU0lSX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlY292ZXJ5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX19SRUNPVkVSWV9SQVRFID0gU0lSX19SRUNPVkVSWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFID0gU0lSX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBoeXNpY2FsbHkgQWRqYWNlbnQgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VJUl9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT04gPSBTSVJfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWQgTmV0d29yayBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gU0lSX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VJUl9fSU5GRUNUSU9VU19NT1JUQUxJVFkgPSBTSVJfX0lORkVDVElPVVNfTU9SVEFMSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRSA9IFNJUl9fQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltbXVuaXR5IExvc3MgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfX0lNTVVOSVRZX0xPU1NfUkFURSA9IFNJUl9fSU1NVU5JVFlfTE9TU19SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY3ViYXRpb24gUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfX0lOQ1VCQVRJT05fUkFURSA9IFNJUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TRUlSPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfRkVBVFVSRV9DT1VOVCA9IFNJUl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWxJbXBsIDxlbT5EZXRlcm1pbmlzdGljIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXREZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NFSVJfRElTRUFTRV9NT0RFTCA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1VSSSA9IFNFSVJfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19UWVBFX1VSSSA9IFNFSVJfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFID0gU0VJUl9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWxzIFRvIFVwZGF0ZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0xBQkVMU19UT19VUERBVEUgPSBTRUlSX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19HUkFQSCA9IFNFSVJfX0dSQVBIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fRU5BQkxFRCA9IFNFSVJfX0VOQUJMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRGVjb3JhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0dSQVBIX0RFQ09SQVRFRCA9IFNFSVJfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19QUk9HUkVTUyA9IFNFSVJfX1BST0dSRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURSA9IFNFSVJfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IFNFSVJfX1BPUFVMQVRJT05fSURFTlRJRklFUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19USU1FX1BFUklPRCA9IFNFSVJfX1RJTUVfUEVSSU9EOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19ESVNFQVNFX05BTUUgPSBTRUlSX19ESVNFQVNFX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVsYXRpdmUgVG9sZXJhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1JFTEFUSVZFX1RPTEVSQU5DRSA9IFNFSVJfX1JFTEFUSVZFX1RPTEVSQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pdGUgRGlmZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19GSU5JVEVfRElGRkVSRU5DRSA9IFNFSVJfX0ZJTklURV9ESUZGRVJFTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyZXF1ZW5jeSBEZXBlbmRlbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVCA9IFNFSVJfX0ZSRVFVRU5DWV9ERVBFTkRFTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBCaXJ0aCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfQklSVEhfUkFURSA9IFNFSVJfX0JBQ0tHUk9VTkRfQklSVEhfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBQb3B1bGF0aW9uIENvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlQgPSBTRUlSX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQgUmVjaXByb2NhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UX1JFQ0lQUk9DQUwgPSBTRUlSX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UX1JFQ0lQUk9DQUw7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgQXJlYTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19UT1RBTF9BUkVBID0gU0VJUl9fVE9UQUxfQVJFQTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgUG9wdWxhdGlvbiBEZW5zaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFkgPSBTRUlSX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zbWlzc2lvbiBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFID0gU0VJUl9fVFJBTlNNSVNTSU9OX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9uIExpbmVhcml0eSBDb2VmZmljaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UID0gU0VJUl9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWNvdmVyeSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEUgPSBTRUlSX19SRUNPVkVSWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURSA9IFNFSVJfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT04gPSBTRUlSX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkIE5ldHdvcmsgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT04gPSBTRUlSX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZID0gU0VJUl9fSU5GRUNUSU9VU19NT1JUQUxJVFk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhcmFjdGVyaXN0aWMgTWl4aW5nIERpc3RhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRSA9IFNFSVJfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbW11bml0eSBMb3NzIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fSU1NVU5JVFlfTE9TU19SQVRFID0gU0VJUl9fSU1NVU5JVFlfTE9TU19SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY3ViYXRpb24gUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19JTkNVQkFUSU9OX1JBVEUgPSBTRUlSX19JTkNVQkFUSU9OX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGV0ZXJtaW5pc3RpYyBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCA9IFNFSVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbEltcGwgPGVtPkRldGVybWluaXN0aWMgU0kgRGlzZWFzZSBNb2RlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0RGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0lfRElTRUFTRV9NT0RFTCA9IDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMX19VUkkgPSBTSV9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMX19UWVBFX1VSSSA9IFNJX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fRFVCTElOX0NPUkUgPSBTSV9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWxzIFRvIFVwZGF0ZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMX19MQUJFTFNfVE9fVVBEQVRFID0gU0lfX0xBQkVMU19UT19VUERBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGg8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMX19HUkFQSCA9IFNJX19HUkFQSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMX19FTkFCTEVEID0gU0lfX0VOQUJMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRGVjb3JhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQgPSBTSV9fR1JBUEhfREVDT1JBVEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2dyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMX19QUk9HUkVTUyA9IFNJX19QUk9HUkVTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIE1vcnRhbGl0eSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFID0gU0lfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBTSV9fUE9QVUxBVElPTl9JREVOVElGSUVSOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMX19USU1FX1BFUklPRCA9IFNJX19USU1FX1BFUklPRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNlYXNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJX0RJU0VBU0VfTU9ERUxfX0RJU0VBU0VfTkFNRSA9IFNJX19ESVNFQVNFX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVsYXRpdmUgVG9sZXJhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0UgPSBTSV9fUkVMQVRJVkVfVE9MRVJBTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbml0ZSBEaWZmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMX19GSU5JVEVfRElGRkVSRU5DRSA9IFNJX19GSU5JVEVfRElGRkVSRU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GcmVxdWVuY3kgRGVwZW5kZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMX19GUkVRVUVOQ1lfREVQRU5ERU5UID0gU0lfX0ZSRVFVRU5DWV9ERVBFTkRFTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBCaXJ0aCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEUgPSBTSV9fQkFDS0dST1VORF9CSVJUSF9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlQgPSBTSV9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBQb3B1bGF0aW9uIENvdW50IFJlY2lwcm9jYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTCA9IFNJX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UX1JFQ0lQUk9DQUw7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgQXJlYTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fVE9UQUxfQVJFQSA9IFNJX19UT1RBTF9BUkVBOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBQb3B1bGF0aW9uIERlbnNpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJX0RJU0VBU0VfTU9ERUxfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFkgPSBTSV9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc21pc3Npb24gUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEUgPSBTSV9fVFJBTlNNSVNTSU9OX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9uIExpbmVhcml0eSBDb2VmZmljaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVCA9IFNJX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlY292ZXJ5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEUgPSBTSV9fUkVDT1ZFUllfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmZlY3Rpb3VzIE1vcnRhbGl0eSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFID0gU0lfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJX0RJU0VBU0VfTU9ERUxfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gU0lfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWQgTmV0d29yayBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJX0RJU0VBU0VfTU9ERUxfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT04gPSBTSV9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmZlY3Rpb3VzIE1vcnRhbGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFkgPSBTSV9fSU5GRUNUSU9VU19NT1JUQUxJVFk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhcmFjdGVyaXN0aWMgTWl4aW5nIERpc3RhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0UgPSBTSV9fQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRldGVybWluaXN0aWMgU0kgRGlzZWFzZSBNb2RlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCA9IFNJX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsSW1wbCA8ZW0+RGV0ZXJtaW5pc3RpYyBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldERldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSVJfRElTRUFTRV9NT0RFTCA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fVVJJID0gU0lSX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJUl9ESVNFQVNFX01PREVMX19UWVBFX1VSSSA9IFNJUl9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJUl9ESVNFQVNFX01PREVMX19EVUJMSU5fQ09SRSA9IFNJUl9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWxzIFRvIFVwZGF0ZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fTEFCRUxTX1RPX1VQREFURSA9IFNJUl9fTEFCRUxTX1RPX1VQREFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJUl9ESVNFQVNFX01PREVMX19HUkFQSCA9IFNJUl9fR1JBUEg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0VOQUJMRUQgPSBTSVJfX0VOQUJMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRGVjb3JhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fR1JBUEhfREVDT1JBVEVEID0gU0lSX19HUkFQSF9ERUNPUkFURUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJUl9ESVNFQVNFX01PREVMX19QUk9HUkVTUyA9IFNJUl9fUFJPR1JFU1M7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEUgPSBTSVJfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSID0gU0lSX19QT1BVTEFUSU9OX0lERU5USUZJRVI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJUl9ESVNFQVNFX01PREVMX19USU1FX1BFUklPRCA9IFNJUl9fVElNRV9QRVJJT0Q7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FID0gU0lSX19ESVNFQVNFX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVsYXRpdmUgVG9sZXJhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUkVMQVRJVkVfVE9MRVJBTkNFID0gU0lSX19SRUxBVElWRV9UT0xFUkFOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXRlIERpZmZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJUl9ESVNFQVNFX01PREVMX19GSU5JVEVfRElGRkVSRU5DRSA9IFNJUl9fRklOSVRFX0RJRkZFUkVOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJlcXVlbmN5IERlcGVuZGVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0ZSRVFVRU5DWV9ERVBFTkRFTlQgPSBTSVJfX0ZSRVFVRU5DWV9ERVBFTkRFTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBCaXJ0aCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9CSVJUSF9SQVRFID0gU0lSX19CQUNLR1JPVU5EX0JJUlRIX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlQgPSBTSVJfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudCBSZWNpcHJvY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMID0gU0lSX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UX1JFQ0lQUk9DQUw7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgQXJlYTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX0FSRUEgPSBTSVJfX1RPVEFMX0FSRUE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFBvcHVsYXRpb24gRGVuc2l0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFkgPSBTSVJfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNtaXNzaW9uIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJUl9ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURSA9IFNJUl9fVFJBTlNNSVNTSU9OX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9uIExpbmVhcml0eSBDb2VmZmljaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX05PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQgPSBTSVJfX05PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVjb3ZlcnkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEUgPSBTSVJfX1JFQ09WRVJZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUgPSBTSVJfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJUl9ESVNFQVNFX01PREVMX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTiA9IFNJUl9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERFVEVSTUlOSVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT04gPSBTSVJfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJUl9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWSA9IFNJUl9fSU5GRUNUSU9VU19NT1JUQUxJVFk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhcmFjdGVyaXN0aWMgTWl4aW5nIERpc3RhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFID0gU0lSX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1tdW5pdHkgTG9zcyBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREVURVJNSU5JU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fSU1NVU5JVFlfTE9TU19SQVRFID0gU0lSX19JTU1VTklUWV9MT1NTX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGV0ZXJtaW5pc3RpYyBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVRFUk1JTklTVElDX1NJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgPSBTSVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbExhYmVsSW1wbCA8ZW0+RGlzZWFzZSBNb2RlbCBMYWJlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbExhYmVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXREaXNlYXNlTW9kZWxMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX0xBQkVMID0gNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX0xBQkVMX19VUkkgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19OT0RFX0xBQkVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX0xBQkVMX19UWVBFX1VSSSA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRElTRUFTRV9NT0RFTF9MQUJFTF9fRFVCTElOX0NPUkUgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19OT0RFX0xBQkVMX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkkgT2YgSWRlbnRpZmlhYmxlIFRvIEJlIExhYmVsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX0xBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19OT0RFX0xBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERJU0VBU0VfTU9ERUxfTEFCRUxfX0NVUlJFTlRfVkFMVUUgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19OT0RFX0xBQkVMX19DVVJSRU5UX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkZW50aWZpYWJsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERJU0VBU0VfTU9ERUxfTEFCRUxfX0lERU5USUZJQUJMRSA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfX0lERU5USUZJQUJMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlIFZhbGlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRElTRUFTRV9NT0RFTF9MQUJFTF9fTkVYVF9WQUxVRV9WQUxJRCA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERJU0VBU0VfTU9ERUxfTEFCRUxfX05FWFRfVkFMVUUgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19OT0RFX0xBQkVMX19ORVhUX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlY29yYXRvcjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERJU0VBU0VfTU9ERUxfTEFCRUxfX0RFQ09SQVRPUiA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfX0RFQ09SQVRPUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRElTRUFTRV9NT0RFTF9MQUJFTF9fTk9ERSA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfX05PREU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBMYWJlbDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERJU0VBU0VfTU9ERUxfTEFCRUxfX1BPUFVMQVRJT05fTEFCRUwgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19OT0RFX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgTW9kZWwgU3RhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX0xBQkVMX19ESVNFQVNFX01PREVMX1NUQVRFID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTk9ERV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRElTRUFTRV9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9NT0RFTF9MQUJFTCA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlzZWFzZSBNb2RlbCBMYWJlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX0xBQkVMX0ZFQVRVUkVfQ09VTlQgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19OT0RFX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbCA8ZW0+RGlzZWFzZSBNb2RlbCBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldERpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRSA9IDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBEZWF0aHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19ESVNFQVNFX0RFQVRIUyA9IEdyYXBoUGFja2FnZS5MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIENvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fUE9QVUxBVElPTl9DT1VOVCA9IEdyYXBoUGFja2FnZS5MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNpZGVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19JTkNJREVOQ0UgPSBHcmFwaFBhY2thZ2UuTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlzZWFzZSBNb2RlbCBMYWJlbCBWYWx1ZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgPSBHcmFwaFBhY2thZ2UuTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbFN0YXRlSW1wbCA8ZW0+RGlzZWFzZSBNb2RlbCBTdGF0ZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbFN0YXRlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXREaXNlYXNlTW9kZWxTdGF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX1NUQVRFID0gNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX1NUQVRFX19MQUJFTCA9IDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlzZWFzZSBNb2RlbCBTdGF0ZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBESVNFQVNFX01PREVMX1NUQVRFX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5JbmZlY3RvckltcGwgPGVtPkluZmVjdG9yPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuSW5mZWN0b3JJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldEluZmVjdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IElORkVDVE9SID0gNzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTkZFQ1RPUl9fVVJJID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTkZFQ1RPUl9fVFlQRV9VUkkgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5GRUNUT1JfX0RVQkxJTl9DT1JFID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTkZFQ1RPUl9fTEFCRUxTX1RPX1VQREFURSA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9fTEFCRUxTX1RPX1VQREFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTkZFQ1RPUl9fR1JBUEggPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfX0dSQVBIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTkZFQ1RPUl9fRU5BQkxFRCA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9fRU5BQkxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTkZFQ1RPUl9fR1JBUEhfREVDT1JBVEVEID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19HUkFQSF9ERUNPUkFURUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTkZFQ1RPUl9fUFJPR1JFU1MgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfX1BST0dSRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTkZFQ1RPUl9fRElTRUFTRV9NT0RFTCA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5GRUNUT1JfX1RBUkdFVF9VUkkgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5GRUNUT1JfX0RJU0VBU0VfTkFNRSA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgSVNPIEtleTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElORkVDVE9SX19UQVJHRVRfSVNPX0tFWSA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gSW5mZWN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTkZFQ1RPUl9fTEFCRUxTX1RPX0lORkVDVCA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTkZFQ1RPUl9fUE9QVUxBVElPTl9JREVOVElGSUVSID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdCBQZXJjZW50YWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5GRUNUT1JfX0lORkVDVF9QRVJDRU5UQUdFID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyA2OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkluZmVjdG9yPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElORkVDVE9SX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDc7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxJbXBsIDxlbT5EaXNlYXNlIE1vZGVsIExhYmVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMID0gMjA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9fVVJJID0gRElTRUFTRV9NT0RFTF9MQUJFTF9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9fVFlQRV9VUkkgPSBESVNFQVNFX01PREVMX0xBQkVMX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX0RVQkxJTl9DT1JFID0gRElTRUFTRV9NT0RFTF9MQUJFTF9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEID0gRElTRUFTRV9NT0RFTF9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX19DVVJSRU5UX1ZBTFVFID0gRElTRUFTRV9NT0RFTF9MQUJFTF9fQ1VSUkVOVF9WQUxVRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZGVudGlmaWFibGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX19JREVOVElGSUFCTEUgPSBESVNFQVNFX01PREVMX0xBQkVMX19JREVOVElGSUFCTEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBWYWx1ZSBWYWxpZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQgPSBESVNFQVNFX01PREVMX0xBQkVMX19ORVhUX1ZBTFVFX1ZBTElEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5leHQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX19ORVhUX1ZBTFVFID0gRElTRUFTRV9NT0RFTF9MQUJFTF9fTkVYVF9WQUxVRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWNvcmF0b3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX19ERUNPUkFUT1IgPSBESVNFQVNFX01PREVMX0xBQkVMX19ERUNPUkFUT1I7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX05PREUgPSBESVNFQVNFX01PREVMX0xBQkVMX19OT0RFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gTGFiZWw8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX0xBQkVMID0gRElTRUFTRV9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9MQUJFTDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNlYXNlIE1vZGVsIFN0YXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9fRElTRUFTRV9NT0RFTF9TVEFURSA9IERJU0VBU0VfTU9ERUxfTEFCRUxfX0RJU0VBU0VfTU9ERUxfU1RBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX1BPUFVMQVRJT05fTU9ERUxfTEFCRUwgPSBESVNFQVNFX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX01PREVMX0xBQkVMOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc2Vhc2UgTW9kZWwgTGFiZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9GRUFUVVJFX0NPVU5UID0gRElTRUFTRV9NT0RFTF9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lMYWJlbEltcGwgPGVtPlNJIExhYmVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lMYWJlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U0lMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTSV9MQUJFTCA9IDE0OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJMYWJlbEltcGwgPGVtPlNJUiBMYWJlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJUkxhYmVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTSVJMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTSVJfTEFCRUwgPSAxNzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0VJUkxhYmVsSW1wbCA8ZW0+U0VJUiBMYWJlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNFSVJMYWJlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U0VJUkxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNFSVJfTEFCRUwgPSA5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfTEFCRUxfX1VSSSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfTEFCRUxfX1RZUEVfVVJJID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX0xBQkVMX19EVUJMSU5fQ09SRSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSSBPZiBJZGVudGlmaWFibGUgVG8gQmUgTGFiZWxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VJUl9MQUJFTF9fQ1VSUkVOVF9WQUxVRSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX0NVUlJFTlRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRlbnRpZmlhYmxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VJUl9MQUJFTF9fSURFTlRJRklBQkxFID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9fSURFTlRJRklBQkxFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5leHQgVmFsdWUgVmFsaWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX0xBQkVMX19ORVhUX1ZBTFVFX1ZBTElEID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9fTkVYVF9WQUxVRV9WQUxJRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VJUl9MQUJFTF9fTkVYVF9WQUxVRSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX05FWFRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVjb3JhdG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VJUl9MQUJFTF9fREVDT1JBVE9SID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9fREVDT1JBVE9SOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX0xBQkVMX19OT0RFID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9fTk9ERTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIExhYmVsPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VJUl9MQUJFTF9fUE9QVUxBVElPTl9MQUJFTCA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX1BPUFVMQVRJT05fTEFCRUw7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBNb2RlbCBTdGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfTEFCRUxfX0RJU0VBU0VfTU9ERUxfU1RBVEUgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX19ESVNFQVNFX01PREVMX1NUQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gTW9kZWwgTGFiZWw8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX0xBQkVMX19QT1BVTEFUSU9OX01PREVMX0xBQkVMID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9NT0RFTF9MQUJFTDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWx0YSBWYWx1ZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfTEFCRUxfX0RFTFRBX1ZBTFVFID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9iZSBWYWx1ZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfTEFCRUxfX1BST0JFX1ZBTFVFID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VJUl9MQUJFTF9fVEVNUF9WQUxVRSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JpZ2luYWwgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX0xBQkVMX19PUklHSU5BTF9WQUxVRSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXJyb3IgU2NhbGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX0xBQkVMX19FUlJPUl9TQ0FMRSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U0VJUiBMYWJlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX0xBQkVMX0ZFQVRVUkVfQ09VTlQgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVJbXBsIDxlbT5EaXNlYXNlIE1vZGVsIExhYmVsIFZhbHVlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRSA9IDIxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgRGVhdGhzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fRElTRUFTRV9ERUFUSFMgPSBESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19ESVNFQVNFX0RFQVRIUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIENvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fUE9QVUxBVElPTl9DT1VOVCA9IERJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfX1BPUFVMQVRJT05fQ09VTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jaWRlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fSU5DSURFTkNFID0gRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fSU5DSURFTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19TID0gRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EaXNlYXNlIE1vZGVsIExhYmVsIFZhbHVlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCA9IERJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJTGFiZWxWYWx1ZUltcGwgPGVtPlNJIExhYmVsIFZhbHVlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lMYWJlbFZhbHVlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTSUxhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU0lfTEFCRUxfVkFMVUUgPSAxNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNlYXNlIERlYXRoczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX0xBQkVMX1ZBTFVFX19ESVNFQVNFX0RFQVRIUyA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfX0RJU0VBU0VfREVBVEhTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gQ291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9MQUJFTF9WQUxVRV9fUE9QVUxBVElPTl9DT1VOVCA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfX1BPUFVMQVRJT05fQ09VTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jaWRlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfTEFCRUxfVkFMVUVfX0lOQ0lERU5DRSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfX0lOQ0lERU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfTEFCRUxfVkFMVUVfX1MgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19TOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9MQUJFTF9WQUxVRV9fSSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U0kgTGFiZWwgVmFsdWU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJUkxhYmVsVmFsdWVJbXBsIDxlbT5TSVIgTGFiZWwgVmFsdWU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJMYWJlbFZhbHVlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTSVJMYWJlbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNJUl9MQUJFTF9WQUxVRSA9IDE4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgRGVhdGhzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX0xBQkVMX1ZBTFVFX19ESVNFQVNFX0RFQVRIUyA9IFNJX0xBQkVMX1ZBTFVFX19ESVNFQVNFX0RFQVRIUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIENvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX0xBQkVMX1ZBTFVFX19QT1BVTEFUSU9OX0NPVU5UID0gU0lfTEFCRUxfVkFMVUVfX1BPUFVMQVRJT05fQ09VTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jaWRlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX0xBQkVMX1ZBTFVFX19JTkNJREVOQ0UgPSBTSV9MQUJFTF9WQUxVRV9fSU5DSURFTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfTEFCRUxfVkFMVUVfX1MgPSBTSV9MQUJFTF9WQUxVRV9fUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX0xBQkVMX1ZBTFVFX19JID0gU0lfTEFCRUxfVkFMVUVfX0k7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9MQUJFTF9WQUxVRV9fUiA9IFNJX0xBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNJUiBMYWJlbCBWYWx1ZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCA9IFNJX0xBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TRUlSTGFiZWxWYWx1ZUltcGwgPGVtPlNFSVIgTGFiZWwgVmFsdWU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TRUlSTGFiZWxWYWx1ZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U0VJUkxhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU0VJUl9MQUJFTF9WQUxVRSA9IDEwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgRGVhdGhzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VJUl9MQUJFTF9WQUxVRV9fRElTRUFTRV9ERUFUSFMgPSBTSVJfTEFCRUxfVkFMVUVfX0RJU0VBU0VfREVBVEhTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gQ291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX0xBQkVMX1ZBTFVFX19QT1BVTEFUSU9OX0NPVU5UID0gU0lSX0xBQkVMX1ZBTFVFX19QT1BVTEFUSU9OX0NPVU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2lkZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFSVJfTEFCRUxfVkFMVUVfX0lOQ0lERU5DRSA9IFNJUl9MQUJFTF9WQUxVRV9fSU5DSURFTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX0xBQkVMX1ZBTFVFX19TID0gU0lSX0xBQkVMX1ZBTFVFX19TOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX0xBQkVMX1ZBTFVFX19JID0gU0lSX0xBQkVMX1ZBTFVFX19JOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX0xBQkVMX1ZBTFVFX19SID0gU0lSX0xBQkVMX1ZBTFVFX19SOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUlSX0xBQkVMX1ZBTFVFX19FID0gU0lSX0xBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNFSVIgTGFiZWwgVmFsdWU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VJUl9MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UID0gU0lSX0xBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlSW1wbCA8ZW0+RGlzZWFzZSBNb2RlbCBTdGF0ZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9TVEFURSA9IDIyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVsPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfU1RBVEVfX0xBQkVMID0gRElTRUFTRV9NT0RFTF9TVEFURV9fTEFCRUw7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXJlYSBSYXRpbzwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfU1RBVEVfX0FSRUFfUkFUSU8gPSBESVNFQVNFX01PREVMX1NUQVRFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc2Vhc2UgTW9kZWwgU3RhdGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9TVEFURV9GRUFUVVJFX0NPVU5UID0gRElTRUFTRV9NT0RFTF9TVEFURV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lEaXNlYXNlTW9kZWxTdGF0ZUltcGwgPGVtPlNJIERpc2Vhc2UgTW9kZWwgU3RhdGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSURpc2Vhc2VNb2RlbFN0YXRlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTSURpc2Vhc2VNb2RlbFN0YXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNJX0RJU0VBU0VfTU9ERUxfU1RBVEUgPSAxMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9ESVNFQVNFX01PREVMX1NUQVRFX19MQUJFTCA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfU1RBVEVfX0xBQkVMOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFyZWEgUmF0aW88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9ESVNFQVNFX01PREVMX1NUQVRFX19BUkVBX1JBVElPID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9TVEFURV9fQVJFQV9SQVRJTzsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TSSBEaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX0RJU0VBU0VfTU9ERUxfU1RBVEVfRkVBVFVSRV9DT1VOVCA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfU1RBVEVfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkSW5mZWN0b3JJbXBsIDxlbT5JbmZlY3RvcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkSW5mZWN0b3JJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFN0YW5kYXJkSW5mZWN0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfSU5GRUNUT1IgPSAyMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFOREFSRF9JTkZFQ1RPUl9fVVJJID0gSU5GRUNUT1JfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0lORkVDVE9SX19UWVBFX1VSSSA9IElORkVDVE9SX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0lORkVDVE9SX19EVUJMSU5fQ09SRSA9IElORkVDVE9SX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFOREFSRF9JTkZFQ1RPUl9fTEFCRUxTX1RPX1VQREFURSA9IElORkVDVE9SX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0lORkVDVE9SX19HUkFQSCA9IElORkVDVE9SX19HUkFQSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfSU5GRUNUT1JfX0VOQUJMRUQgPSBJTkZFQ1RPUl9fRU5BQkxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFOREFSRF9JTkZFQ1RPUl9fR1JBUEhfREVDT1JBVEVEID0gSU5GRUNUT1JfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0lORkVDVE9SX19QUk9HUkVTUyA9IElORkVDVE9SX19QUk9HUkVTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNlYXNlIE1vZGVsPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfSU5GRUNUT1JfX0RJU0VBU0VfTU9ERUwgPSBJTkZFQ1RPUl9fRElTRUFTRV9NT0RFTDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfSU5GRUNUT1JfX1RBUkdFVF9VUkkgPSBJTkZFQ1RPUl9fVEFSR0VUX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNlYXNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFOREFSRF9JTkZFQ1RPUl9fRElTRUFTRV9OQU1FID0gSU5GRUNUT1JfX0RJU0VBU0VfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgSVNPIEtleTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0lORkVDVE9SX19UQVJHRVRfSVNPX0tFWSA9IElORkVDVE9SX19UQVJHRVRfSVNPX0tFWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gSW5mZWN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFOREFSRF9JTkZFQ1RPUl9fTEFCRUxTX1RPX0lORkVDVCA9IElORkVDVE9SX19MQUJFTFNfVE9fSU5GRUNUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0lORkVDVE9SX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBJTkZFQ1RPUl9fUE9QVUxBVElPTl9JREVOVElGSUVSOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdCBQZXJjZW50YWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfSU5GRUNUT1JfX0lORkVDVF9QRVJDRU5UQUdFID0gSU5GRUNUT1JfX0lORkVDVF9QRVJDRU5UQUdFOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkluZmVjdG9yPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX0lORkVDVE9SX0ZFQVRVUkVfQ09VTlQgPSBJTkZFQ1RPUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lJbmZlY3RvckltcGwgPGVtPlNJIEluZmVjdG9yPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lJbmZlY3RvckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U0lJbmZlY3RvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTSV9JTkZFQ1RPUiA9IDEzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX0lORkVDVE9SX19VUkkgPSBTVEFOREFSRF9JTkZFQ1RPUl9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfSU5GRUNUT1JfX1RZUEVfVVJJID0gU1RBTkRBUkRfSU5GRUNUT1JfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfSU5GRUNUT1JfX0RVQkxJTl9DT1JFID0gU1RBTkRBUkRfSU5GRUNUT1JfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX0lORkVDVE9SX19MQUJFTFNfVE9fVVBEQVRFID0gU1RBTkRBUkRfSU5GRUNUT1JfX0xBQkVMU19UT19VUERBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGg8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfSU5GRUNUT1JfX0dSQVBIID0gU1RBTkRBUkRfSU5GRUNUT1JfX0dSQVBIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9JTkZFQ1RPUl9fRU5BQkxFRCA9IFNUQU5EQVJEX0lORkVDVE9SX19FTkFCTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX0lORkVDVE9SX19HUkFQSF9ERUNPUkFURUQgPSBTVEFOREFSRF9JTkZFQ1RPUl9fR1JBUEhfREVDT1JBVEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2dyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfSU5GRUNUT1JfX1BST0dSRVNTID0gU1RBTkRBUkRfSU5GRUNUT1JfX1BST0dSRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9JTkZFQ1RPUl9fRElTRUFTRV9NT0RFTCA9IFNUQU5EQVJEX0lORkVDVE9SX19ESVNFQVNFX01PREVMOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9JTkZFQ1RPUl9fVEFSR0VUX1VSSSA9IFNUQU5EQVJEX0lORkVDVE9SX19UQVJHRVRfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX0lORkVDVE9SX19ESVNFQVNFX05BTUUgPSBTVEFOREFSRF9JTkZFQ1RPUl9fRElTRUFTRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBJU08gS2V5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfSU5GRUNUT1JfX1RBUkdFVF9JU09fS0VZID0gU1RBTkRBUkRfSU5GRUNUT1JfX1RBUkdFVF9JU09fS0VZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBJbmZlY3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX0lORkVDVE9SX19MQUJFTFNfVE9fSU5GRUNUID0gU1RBTkRBUkRfSU5GRUNUT1JfX0xBQkVMU19UT19JTkZFQ1Q7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfSU5GRUNUT1JfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IFNUQU5EQVJEX0lORkVDVE9SX19QT1BVTEFUSU9OX0lERU5USUZJRVI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0IFBlcmNlbnRhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9JTkZFQ1RPUl9fSU5GRUNUX1BFUkNFTlRBR0UgPSBTVEFOREFSRF9JTkZFQ1RPUl9fSU5GRUNUX1BFUkNFTlRBR0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBDb3VudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX0lORkVDVE9SX19JTkZFQ1RJT1VTX0NPVU5UID0gU1RBTkRBUkRfSU5GRUNUT1JfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U0kgSW5mZWN0b3I8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfSU5GRUNUT1JfRkVBVFVSRV9DT1VOVCA9IFNUQU5EQVJEX0lORkVDVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX0xBQkVMX19VUkkgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9MQUJFTF9fVFlQRV9VUkkgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX0xBQkVMX19EVUJMSU5fQ09SRSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSSBPZiBJZGVudGlmaWFibGUgVG8gQmUgTGFiZWxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX0xBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX0xBQkVMX19DVVJSRU5UX1ZBTFVFID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9fQ1VSUkVOVF9WQUxVRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZGVudGlmaWFibGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9MQUJFTF9fSURFTlRJRklBQkxFID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9fSURFTlRJRklBQkxFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5leHQgVmFsdWUgVmFsaWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9MQUJFTF9fTkVYVF9WQUxVRV9WQUxJRCA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX0xBQkVMX19ORVhUX1ZBTFVFID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9fTkVYVF9WQUxVRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWNvcmF0b3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9MQUJFTF9fREVDT1JBVE9SID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9fREVDT1JBVE9SOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9MQUJFTF9fTk9ERSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX05PREU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBMYWJlbDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX0xBQkVMX19QT1BVTEFUSU9OX0xBQkVMID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9MQUJFTDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNlYXNlIE1vZGVsIFN0YXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfTEFCRUxfX0RJU0VBU0VfTU9ERUxfU1RBVEUgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX19ESVNFQVNFX01PREVMX1NUQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gTW9kZWwgTGFiZWw8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9MQUJFTF9fUE9QVUxBVElPTl9NT0RFTF9MQUJFTCA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX1BPUFVMQVRJT05fTU9ERUxfTEFCRUw7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVsdGEgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSV9MQUJFTF9fREVMVEFfVkFMVUUgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2JlIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfTEFCRUxfX1BST0JFX1ZBTFVFID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfTEFCRUxfX1RFTVBfVkFMVUUgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfTEFCRUxfX09SSUdJTkFMX1ZBTFVFID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FcnJvciBTY2FsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJX0xBQkVMX19FUlJPUl9TQ0FMRSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U0kgTGFiZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lfTEFCRUxfRkVBVFVSRV9DT1VOVCA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX0xBQkVMX19VUkkgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfTEFCRUxfX1RZUEVfVVJJID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfTEFCRUxfX0RVQkxJTl9DT1JFID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX0xBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9MQUJFTF9fQ1VSUkVOVF9WQUxVRSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX0NVUlJFTlRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRlbnRpZmlhYmxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX0xBQkVMX19JREVOVElGSUFCTEUgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX19JREVOVElGSUFCTEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBWYWx1ZSBWYWxpZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9MQUJFTF9fTkVYVF9WQUxVRV9WQUxJRCA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9MQUJFTF9fTkVYVF9WQUxVRSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX05FWFRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVjb3JhdG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX0xBQkVMX19ERUNPUkFUT1IgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX19ERUNPUkFUT1I7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9MQUJFTF9fTk9ERSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX05PREU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBMYWJlbDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9MQUJFTF9fUE9QVUxBVElPTl9MQUJFTCA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX1BPUFVMQVRJT05fTEFCRUw7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBNb2RlbCBTdGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9MQUJFTF9fRElTRUFTRV9NT0RFTF9TVEFURSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX0RJU0VBU0VfTU9ERUxfU1RBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9MQUJFTF9fUE9QVUxBVElPTl9NT0RFTF9MQUJFTCA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfX1BPUFVMQVRJT05fTU9ERUxfTEFCRUw7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVsdGEgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfTEFCRUxfX0RFTFRBX1ZBTFVFID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9iZSBWYWx1ZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9MQUJFTF9fUFJPQkVfVkFMVUUgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXAgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfTEFCRUxfX1RFTVBfVkFMVUUgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX0xBQkVMX19PUklHSU5BTF9WQUxVRSA9IFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXJyb3IgU2NhbGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfTEFCRUxfX0VSUk9SX1NDQUxFID0gU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TSVIgTGFiZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX0xBQkVMX0ZFQVRVUkVfQ09VTlQgPSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbEltcGwgPGVtPlN0b2NoYXN0aWMgU0VJUiBEaXNlYXNlIE1vZGVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMID0gMjQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1VSSSA9IFNFSVJfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19UWVBFX1VSSSA9IFNFSVJfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFID0gU0VJUl9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWxzIFRvIFVwZGF0ZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0xBQkVMU19UT19VUERBVEUgPSBTRUlSX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19HUkFQSCA9IFNFSVJfX0dSQVBIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fRU5BQkxFRCA9IFNFSVJfX0VOQUJMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRGVjb3JhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0dSQVBIX0RFQ09SQVRFRCA9IFNFSVJfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19QUk9HUkVTUyA9IFNFSVJfX1BST0dSRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURSA9IFNFSVJfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IFNFSVJfX1BPUFVMQVRJT05fSURFTlRJRklFUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19USU1FX1BFUklPRCA9IFNFSVJfX1RJTUVfUEVSSU9EOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19ESVNFQVNFX05BTUUgPSBTRUlSX19ESVNFQVNFX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVsYXRpdmUgVG9sZXJhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1JFTEFUSVZFX1RPTEVSQU5DRSA9IFNFSVJfX1JFTEFUSVZFX1RPTEVSQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pdGUgRGlmZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19GSU5JVEVfRElGRkVSRU5DRSA9IFNFSVJfX0ZJTklURV9ESUZGRVJFTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyZXF1ZW5jeSBEZXBlbmRlbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVCA9IFNFSVJfX0ZSRVFVRU5DWV9ERVBFTkRFTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBCaXJ0aCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfQklSVEhfUkFURSA9IFNFSVJfX0JBQ0tHUk9VTkRfQklSVEhfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBQb3B1bGF0aW9uIENvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlQgPSBTRUlSX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQgUmVjaXByb2NhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UX1JFQ0lQUk9DQUwgPSBTRUlSX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UX1JFQ0lQUk9DQUw7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgQXJlYTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19UT1RBTF9BUkVBID0gU0VJUl9fVE9UQUxfQVJFQTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgUG9wdWxhdGlvbiBEZW5zaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFkgPSBTRUlSX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zbWlzc2lvbiBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFID0gU0VJUl9fVFJBTlNNSVNTSU9OX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9uIExpbmVhcml0eSBDb2VmZmljaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UID0gU0VJUl9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWNvdmVyeSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEUgPSBTRUlSX19SRUNPVkVSWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURSA9IFNFSVJfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT04gPSBTRUlSX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkIE5ldHdvcmsgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT04gPSBTRUlSX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZID0gU0VJUl9fSU5GRUNUSU9VU19NT1JUQUxJVFk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhcmFjdGVyaXN0aWMgTWl4aW5nIERpc3RhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRSA9IFNFSVJfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbW11bml0eSBMb3NzIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fSU1NVU5JVFlfTE9TU19SQVRFID0gU0VJUl9fSU1NVU5JVFlfTE9TU19SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY3ViYXRpb24gUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19JTkNVQkFUSU9OX1JBVEUgPSBTRUlSX19JTkNVQkFUSU9OX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19TRUVEID0gU0VJUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5kb20gR2VuZXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1IgPSBTRUlSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdhaW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fR0FJTiA9IFNFSVJfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U3RvY2hhc3RpYyBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCA9IFNFSVJfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbEltcGwgPGVtPlN0b2NoYXN0aWMgU0kgRGlzZWFzZSBNb2RlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTCA9IDI1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fVVJJID0gU0lfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fVFlQRV9VUkkgPSBTSV9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NJX0RJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFID0gU0lfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fTEFCRUxTX1RPX1VQREFURSA9IFNJX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fR1JBUEggPSBTSV9fR1JBUEg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fRU5BQkxFRCA9IFNJX19FTkFCTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fR1JBUEhfREVDT1JBVEVEID0gU0lfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fUFJPR1JFU1MgPSBTSV9fUFJPR1JFU1M7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURSA9IFNJX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSID0gU0lfX1BPUFVMQVRJT05fSURFTlRJRklFUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0QgPSBTSV9fVElNRV9QRVJJT0Q7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19ESVNFQVNFX05BTUUgPSBTSV9fRElTRUFTRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aXZlIFRvbGVyYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fUkVMQVRJVkVfVE9MRVJBTkNFID0gU0lfX1JFTEFUSVZFX1RPTEVSQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pdGUgRGlmZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0UgPSBTSV9fRklOSVRFX0RJRkZFUkVOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJlcXVlbmN5IERlcGVuZGVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVCA9IFNJX19GUkVRVUVOQ1lfREVQRU5ERU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgQmlydGggUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9CSVJUSF9SQVRFID0gU0lfX0JBQ0tHUk9VTkRfQklSVEhfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBQb3B1bGF0aW9uIENvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UID0gU0lfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudCBSZWNpcHJvY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UX1JFQ0lQUk9DQUwgPSBTSV9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIEFyZWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NJX0RJU0VBU0VfTU9ERUxfX1RPVEFMX0FSRUEgPSBTSV9fVE9UQUxfQVJFQTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgUG9wdWxhdGlvbiBEZW5zaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZID0gU0lfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNtaXNzaW9uIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NJX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFID0gU0lfX1RSQU5TTUlTU0lPTl9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBMaW5lYXJpdHkgQ29lZmZpY2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NJX0RJU0VBU0VfTU9ERUxfX05PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQgPSBTSV9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWNvdmVyeSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFID0gU0lfX1JFQ09WRVJZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURSA9IFNJX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBoeXNpY2FsbHkgQWRqYWNlbnQgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTiA9IFNJX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkIE5ldHdvcmsgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gU0lfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NJX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZID0gU0lfX0lORkVDVElPVVNfTU9SVEFMSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFID0gU0lfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19TRUVEID0gU0lfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZG9tIEdlbmVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUiA9IFNJX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdhaW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NJX0RJU0VBU0VfTU9ERUxfX0dBSU4gPSBTSV9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TdG9jaGFzdGljIFNJIERpc2Vhc2UgTW9kZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgPSBTSV9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwgPGVtPlN0b2NoYXN0aWMgU0lSIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUwgPSAyNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19VUkkgPSBTSVJfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RZUEVfVVJJID0gU0lSX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFID0gU0lSX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19MQUJFTFNfVE9fVVBEQVRFID0gU0lSX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0dSQVBIID0gU0lSX19HUkFQSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fRU5BQkxFRCA9IFNJUl9fRU5BQkxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQgPSBTSVJfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1BST0dSRVNTID0gU0lSX19QUk9HUkVTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIE1vcnRhbGl0eSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURSA9IFNJUl9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBTSVJfX1BPUFVMQVRJT05fSURFTlRJRklFUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EID0gU0lSX19USU1FX1BFUklPRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNlYXNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19ESVNFQVNFX05BTUUgPSBTSVJfX0RJU0VBU0VfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWxhdGl2ZSBUb2xlcmFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0UgPSBTSVJfX1JFTEFUSVZFX1RPTEVSQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pdGUgRGlmZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0ZJTklURV9ESUZGRVJFTkNFID0gU0lSX19GSU5JVEVfRElGRkVSRU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GcmVxdWVuY3kgRGVwZW5kZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVCA9IFNJUl9fRlJFUVVFTkNZX0RFUEVOREVOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIEJpcnRoIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEUgPSBTSVJfX0JBQ0tHUk9VTkRfQklSVEhfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBQb3B1bGF0aW9uIENvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVCA9IFNJUl9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBQb3B1bGF0aW9uIENvdW50IFJlY2lwcm9jYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UX1JFQ0lQUk9DQUwgPSBTSVJfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBBcmVhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fVE9UQUxfQVJFQSA9IFNJUl9fVE9UQUxfQVJFQTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgUG9wdWxhdGlvbiBEZW5zaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWSA9IFNJUl9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc21pc3Npb24gUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFID0gU0lSX19UUkFOU01JU1NJT05fUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob24gTGluZWFyaXR5IENvZWZmaWNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVCA9IFNJUl9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWNvdmVyeSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUkVDT1ZFUllfUkFURSA9IFNJUl9fUkVDT1ZFUllfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmZlY3Rpb3VzIE1vcnRhbGl0eSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURSA9IFNJUl9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaHlzaWNhbGx5IEFkamFjZW50IEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gU0lSX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkIE5ldHdvcmsgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTiA9IFNJUl9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmZlY3Rpb3VzIE1vcnRhbGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZID0gU0lSX19JTkZFQ1RJT1VTX01PUlRBTElUWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFyYWN0ZXJpc3RpYyBNaXhpbmcgRGlzdGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0UgPSBTSVJfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbW11bml0eSBMb3NzIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19JTU1VTklUWV9MT1NTX1JBVEUgPSBTSVJfX0lNTVVOSVRZX0xPU1NfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fU0VFRCA9IFNJUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5kb20gR2VuZXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUiA9IFNJUl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HYWluPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fR0FJTiA9IFNJUl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TdG9jaGFzdGljIFNJUiBEaXNlYXNlIE1vZGVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCA9IFNJUl9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyIDxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTYW5pdHlDaGVja2VyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNBTklUWV9DSEVDS0VSID0gMjc7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2FuaXR5IENoZWNrZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0FOSVRZX0NIRUNLRVJfRkVBVFVSRV9DT1VOVCA9IDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsIDxlbT5JbnRlZ3JhdGlvbiBMYWJlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldEludGVncmF0aW9uTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgSU5URUdSQVRJT05fTEFCRUwgPSAyODsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JbnRlZ3JhdGlvbiBMYWJlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTlRFR1JBVElPTl9MQUJFTF9GRUFUVVJFX0NPVU5UID0gMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWxWYWx1ZSA8ZW0+SW50ZWdyYXRpb24gTGFiZWwgVmFsdWU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbFZhbHVlCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldEludGVncmF0aW9uTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBJTlRFR1JBVElPTl9MQUJFTF9WQUxVRSA9IDI5OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkludGVncmF0aW9uIExhYmVsIFZhbHVlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElOVEVHUkFUSU9OX0xBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgPSAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3IgPGVtPkludGVncmF0aW9uIERlY29yYXRvcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvcgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRJbnRlZ3JhdGlvbkRlY29yYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBJTlRFR1JBVElPTl9ERUNPUkFUT1IgPSAzMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JbnRlZ3JhdGlvbiBEZWNvcmF0b3I8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5URUdSQVRJT05fREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgPSAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5BZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsSW1wbCA8ZW0+QWdncmVnYXRpbmcgU0kgRGlzZWFzZSBNb2RlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldEFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0lfRElTRUFTRV9NT0RFTCA9IDMxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX1VSSSA9IFNJX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19UWVBFX1VSSSA9IFNJX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFID0gU0lfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX0xBQkVMU19UT19VUERBVEUgPSBTSV9fTEFCRUxTX1RPX1VQREFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19HUkFQSCA9IFNJX19HUkFQSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0lfRElTRUFTRV9NT0RFTF9fRU5BQkxFRCA9IFNJX19FTkFCTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX0dSQVBIX0RFQ09SQVRFRCA9IFNJX19HUkFQSF9ERUNPUkFURUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19QUk9HUkVTUyA9IFNJX19QUk9HUkVTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIE1vcnRhbGl0eSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0lfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURSA9IFNJX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IFNJX19QT1BVTEFUSU9OX0lERU5USUZJRVI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19USU1FX1BFUklPRCA9IFNJX19USU1FX1BFUklPRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNlYXNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19ESVNFQVNFX05BTUUgPSBTSV9fRElTRUFTRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aXZlIFRvbGVyYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX1JFTEFUSVZFX1RPTEVSQU5DRSA9IFNJX19SRUxBVElWRV9UT0xFUkFOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXRlIERpZmZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19GSU5JVEVfRElGRkVSRU5DRSA9IFNJX19GSU5JVEVfRElGRkVSRU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GcmVxdWVuY3kgRGVwZW5kZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0lfRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVCA9IFNJX19GUkVRVUVOQ1lfREVQRU5ERU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgQmlydGggUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfQklSVEhfUkFURSA9IFNJX19CQUNLR1JPVU5EX0JJUlRIX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlQgPSBTSV9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBQb3B1bGF0aW9uIENvdW50IFJlY2lwcm9jYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UX1JFQ0lQUk9DQUwgPSBTSV9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIEFyZWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19UT1RBTF9BUkVBID0gU0lfX1RPVEFMX0FSRUE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFBvcHVsYXRpb24gRGVuc2l0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFkgPSBTSV9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc21pc3Npb24gUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFID0gU0lfX1RSQU5TTUlTU0lPTl9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBMaW5lYXJpdHkgQ29lZmZpY2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UID0gU0lfX05PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVjb3ZlcnkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEUgPSBTSV9fUkVDT1ZFUllfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmZlY3Rpb3VzIE1vcnRhbGl0eSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0lfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURSA9IFNJX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBoeXNpY2FsbHkgQWRqYWNlbnQgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0lfRElTRUFTRV9NT0RFTF9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT04gPSBTSV9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT04gPSBTSV9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmZlY3Rpb3VzIE1vcnRhbGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZID0gU0lfX0lORkVDVElPVVNfTU9SVEFMSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRSA9IFNJX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0U7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWdncmVnYXRpbmcgU0kgRGlzZWFzZSBNb2RlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgPSBTSV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZUltcGwgPGVtPkFnZ3JlZ2F0aW5nIERpc2Vhc2UgTW9kZWwgU3RhdGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5BZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX0RJU0VBU0VfTU9ERUxfU1RBVEUgPSAzMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19ESVNFQVNFX01PREVMX1NUQVRFX19MQUJFTCA9IERJU0VBU0VfTU9ERUxfU1RBVEVfX0xBQkVMOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoaWxkcmVucyBMYWJlbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX0RJU0VBU0VfTU9ERUxfU1RBVEVfX0NISUxEUkVOU19MQUJFTFMgPSBESVNFQVNFX01PREVMX1NUQVRFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFnZ3JlZ2F0aW5nIERpc2Vhc2UgTW9kZWwgU3RhdGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfRElTRUFTRV9NT0RFTF9TVEFURV9GRUFUVVJFX0NPVU5UID0gRElTRUFTRV9NT0RFTF9TVEFURV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxJbXBsIDxlbT5BZ2dyZWdhdGluZyBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTCA9IDM0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19VUkkgPSBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fVFlQRV9VUkkgPSBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19EVUJMSU5fQ09SRSA9IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19MQUJFTFNfVE9fVVBEQVRFID0gQUdHUkVHQVRJTkdfU0lfRElTRUFTRV9NT0RFTF9fTEFCRUxTX1RPX1VQREFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fR1JBUEggPSBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19HUkFQSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX0VOQUJMRUQgPSBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19FTkFCTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQgPSBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fUFJPR1JFU1MgPSBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19QUk9HUkVTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIE1vcnRhbGl0eSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEUgPSBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0QgPSBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19USU1FX1BFUklPRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNlYXNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FID0gQUdHUkVHQVRJTkdfU0lfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aXZlIFRvbGVyYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0UgPSBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXRlIERpZmZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0UgPSBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19GSU5JVEVfRElGRkVSRU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GcmVxdWVuY3kgRGVwZW5kZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX0ZSRVFVRU5DWV9ERVBFTkRFTlQgPSBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19GUkVRVUVOQ1lfREVQRU5ERU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgQmlydGggUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEUgPSBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UID0gQUdHUkVHQVRJTkdfU0lfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBQb3B1bGF0aW9uIENvdW50IFJlY2lwcm9jYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMID0gQUdHUkVHQVRJTkdfU0lfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIEFyZWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fVE9UQUxfQVJFQSA9IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX1RPVEFMX0FSRUE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFBvcHVsYXRpb24gRGVuc2l0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZID0gQUdHUkVHQVRJTkdfU0lfRElTRUFTRV9NT0RFTF9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc21pc3Npb24gUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURSA9IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBMaW5lYXJpdHkgQ29lZmZpY2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVCA9IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX05PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVjb3ZlcnkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFID0gQUdHUkVHQVRJTkdfU0lfRElTRUFTRV9NT0RFTF9fUkVDT1ZFUllfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmZlY3Rpb3VzIE1vcnRhbGl0eSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUgPSBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBoeXNpY2FsbHkgQWRqYWNlbnQgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gQUdHUkVHQVRJTkdfU0lfRElTRUFTRV9NT0RFTF9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gQUdHUkVHQVRJTkdfU0lfRElTRUFTRV9NT0RFTF9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmZlY3Rpb3VzIE1vcnRhbGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWSA9IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0UgPSBBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0U7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWdncmVnYXRpbmcgU0lSIERpc2Vhc2UgTW9kZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCA9IEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbEltcGwgPGVtPkFnZ3JlZ2F0aW5nIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0QWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTCA9IDMzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTF9fVVJJID0gQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTF9fVFlQRV9VUkkgPSBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TRUlSX0RJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFID0gQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTF9fTEFCRUxTX1RPX1VQREFURSA9IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTF9fR1JBUEggPSBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fR1JBUEg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTF9fRU5BQkxFRCA9IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19FTkFCTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTF9fR1JBUEhfREVDT1JBVEVEID0gQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTF9fUFJPR1JFU1MgPSBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fUFJPR1JFU1M7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURSA9IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSID0gQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0QgPSBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0Q7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0VJUl9ESVNFQVNFX01PREVMX19ESVNFQVNFX05BTUUgPSBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aXZlIFRvbGVyYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTF9fUkVMQVRJVkVfVE9MRVJBTkNFID0gQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX1JFTEFUSVZFX1RPTEVSQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pdGUgRGlmZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0UgPSBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJlcXVlbmN5IERlcGVuZGVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVCA9IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19GUkVRVUVOQ1lfREVQRU5ERU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgQmlydGggUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9CSVJUSF9SQVRFID0gQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfQklSVEhfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBQb3B1bGF0aW9uIENvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0VJUl9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UID0gQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudCBSZWNpcHJvY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0VJUl9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UX1JFQ0lQUk9DQUwgPSBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIEFyZWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TRUlSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX0FSRUEgPSBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fVE9UQUxfQVJFQTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgUG9wdWxhdGlvbiBEZW5zaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0VJUl9ESVNFQVNFX01PREVMX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZID0gQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNtaXNzaW9uIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TRUlSX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFID0gQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBMaW5lYXJpdHkgQ29lZmZpY2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TRUlSX0RJU0VBU0VfTU9ERUxfX05PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQgPSBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWNvdmVyeSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0VJUl9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFID0gQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURSA9IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBoeXNpY2FsbHkgQWRqYWNlbnQgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0VJUl9ESVNFQVNFX01PREVMX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTiA9IEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkIE5ldHdvcmsgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0VJUl9ESVNFQVNFX01PREVMX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBR0dSRUdBVElOR19TRUlSX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZID0gQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTF9fQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFID0gQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUxfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BZ2dyZWdhdGluZyBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUdHUkVHQVRJTkdfU0VJUl9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgPSBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGwgPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMID0gMzU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19VUkkgPSBESVNFQVNFX01PREVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1RZUEVfVVJJID0gRElTRUFTRV9NT0RFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFID0gRElTRUFTRV9NT0RFTF9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWxzIFRvIFVwZGF0ZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19MQUJFTFNfVE9fVVBEQVRFID0gRElTRUFTRV9NT0RFTF9fTEFCRUxTX1RPX1VQREFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0dSQVBIID0gRElTRUFTRV9NT0RFTF9fR1JBUEg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fRU5BQkxFRCA9IERJU0VBU0VfTU9ERUxfX0VOQUJMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRGVjb3JhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQgPSBESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1BST0dSRVNTID0gRElTRUFTRV9NT0RFTF9fUFJPR1JFU1M7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURSA9IERJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EID0gRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0Q7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19ESVNFQVNFX05BTUUgPSBESVNFQVNFX01PREVMX19ESVNFQVNFX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVsYXRpdmUgVG9sZXJhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0UgPSBESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXRlIERpZmZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0ZJTklURV9ESUZGRVJFTkNFID0gRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJlcXVlbmN5IERlcGVuZGVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVCA9IERJU0VBU0VfTU9ERUxfX0ZSRVFVRU5DWV9ERVBFTkRFTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBCaXJ0aCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEUgPSBESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fU0VFRCA9IERJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZG9tIEdlbmVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUiA9IERJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U3RvY2hhc3RpYyBEaXNlYXNlIE1vZGVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UID0gRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbCA8ZW0+U3RvY2hhc3RpYyBEaXNlYXNlIE1vZGVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMID0gMzY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19VUkkgPSBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX1NUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fVFlQRV9VUkkgPSBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19EVUJMSU5fQ09SRSA9IFNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWxzIFRvIFVwZGF0ZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19MQUJFTFNfVE9fVVBEQVRFID0gU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX1NUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fR1JBUEggPSBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0dSQVBIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFOREFSRF9TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0VOQUJMRUQgPSBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0VOQUJMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRGVjb3JhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQgPSBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX1NUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fUFJPR1JFU1MgPSBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1BST0dSRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFOREFSRF9TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEUgPSBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX1NUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0QgPSBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX1NUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FID0gU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19ESVNFQVNFX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVsYXRpdmUgVG9sZXJhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0UgPSBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1JFTEFUSVZFX1RPTEVSQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pdGUgRGlmZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX1NUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0UgPSBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0ZJTklURV9ESUZGRVJFTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyZXF1ZW5jeSBEZXBlbmRlbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFOREFSRF9TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0ZSRVFVRU5DWV9ERVBFTkRFTlQgPSBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0ZSRVFVRU5DWV9ERVBFTkRFTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBCaXJ0aCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEUgPSBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfQklSVEhfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19TRUVEID0gU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19TRUVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhbmRvbSBHZW5lcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFOREFSRF9TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1IgPSBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1I7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2FpbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQU5EQVJEX1NUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fR0FJTiA9IFNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TdG9jaGFzdGljIERpc2Vhc2UgTW9kZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBTkRBUkRfU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgPSBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJUklub2N1bGF0b3JJbXBsIDxlbT5TSVIgSW5vY3VsYXRvcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJUklub2N1bGF0b3JJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFNJUklub2N1bGF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU0lSX0lOT0NVTEFUT1IgPSAzNzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfSU5PQ1VMQVRPUl9fVVJJID0gU0lfSU5GRUNUT1JfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9JTk9DVUxBVE9SX19UWVBFX1VSSSA9IFNJX0lORkVDVE9SX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9JTk9DVUxBVE9SX19EVUJMSU5fQ09SRSA9IFNJX0lORkVDVE9SX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfSU5PQ1VMQVRPUl9fTEFCRUxTX1RPX1VQREFURSA9IFNJX0lORkVDVE9SX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9JTk9DVUxBVE9SX19HUkFQSCA9IFNJX0lORkVDVE9SX19HUkFQSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX0lOT0NVTEFUT1JfX0VOQUJMRUQgPSBTSV9JTkZFQ1RPUl9fRU5BQkxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfSU5PQ1VMQVRPUl9fR1JBUEhfREVDT1JBVEVEID0gU0lfSU5GRUNUT1JfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9JTk9DVUxBVE9SX19QUk9HUkVTUyA9IFNJX0lORkVDVE9SX19QUk9HUkVTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNlYXNlIE1vZGVsPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX0lOT0NVTEFUT1JfX0RJU0VBU0VfTU9ERUwgPSBTSV9JTkZFQ1RPUl9fRElTRUFTRV9NT0RFTDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX0lOT0NVTEFUT1JfX1RBUkdFVF9VUkkgPSBTSV9JTkZFQ1RPUl9fVEFSR0VUX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNlYXNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfSU5PQ1VMQVRPUl9fRElTRUFTRV9OQU1FID0gU0lfSU5GRUNUT1JfX0RJU0VBU0VfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgSVNPIEtleTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9JTk9DVUxBVE9SX19UQVJHRVRfSVNPX0tFWSA9IFNJX0lORkVDVE9SX19UQVJHRVRfSVNPX0tFWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gSW5mZWN0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfSU5PQ1VMQVRPUl9fTEFCRUxTX1RPX0lORkVDVCA9IFNJX0lORkVDVE9SX19MQUJFTFNfVE9fSU5GRUNUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9JTk9DVUxBVE9SX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBTSV9JTkZFQ1RPUl9fUE9QVUxBVElPTl9JREVOVElGSUVSOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdCBQZXJjZW50YWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0lSX0lOT0NVTEFUT1JfX0lORkVDVF9QRVJDRU5UQUdFID0gU0lfSU5GRUNUT1JfX0lORkVDVF9QRVJDRU5UQUdFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgQ291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTSVJfSU5PQ1VMQVRPUl9fSU5GRUNUSU9VU19DT1VOVCA9IFNJX0lORkVDVE9SX19JTkZFQ1RJT1VTX0NPVU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklub2N1bGF0ZWQgUGVyY2VudGFnZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9JTk9DVUxBVE9SX19JTk9DVUxBVEVEX1BFUkNFTlRBR0UgPSBTSV9JTkZFQ1RPUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbm9jdWxhdGUgUGVyY2VudGFnZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9JTk9DVUxBVE9SX19JTk9DVUxBVEVfUEVSQ0VOVEFHRSA9IFNJX0lORkVDVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNJUiBJbm9jdWxhdG9yPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNJUl9JTk9DVUxBVE9SX0ZFQVRVUkVfQ09VTlQgPSBTSV9JTkZFQ1RPUl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbEltcGwgPGVtPlN0b2NoYXN0aWMgUG9pc3NvbiBTSSBEaXNlYXNlIE1vZGVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lfRElTRUFTRV9NT0RFTCA9IDM4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSV9ESVNFQVNFX01PREVMX19VUkkgPSBTSV9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJX0RJU0VBU0VfTU9ERUxfX1RZUEVfVVJJID0gU0lfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJX0RJU0VBU0VfTU9ERUxfX0RVQkxJTl9DT1JFID0gU0lfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSV9ESVNFQVNFX01PREVMX19MQUJFTFNfVE9fVVBEQVRFID0gU0lfX0xBQkVMU19UT19VUERBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGg8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJX0RJU0VBU0VfTU9ERUxfX0dSQVBIID0gU0lfX0dSQVBIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lfRElTRUFTRV9NT0RFTF9fRU5BQkxFRCA9IFNJX19FTkFCTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSV9ESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQgPSBTSV9fR1JBUEhfREVDT1JBVEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2dyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJX0RJU0VBU0VfTU9ERUxfX1BST0dSRVNTID0gU0lfX1BST0dSRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lfRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURSA9IFNJX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSV9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBTSV9fUE9QVUxBVElPTl9JREVOVElGSUVSOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJX0RJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EID0gU0lfX1RJTUVfUEVSSU9EOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSV9ESVNFQVNFX01PREVMX19ESVNFQVNFX05BTUUgPSBTSV9fRElTRUFTRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aXZlIFRvbGVyYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSV9ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0UgPSBTSV9fUkVMQVRJVkVfVE9MRVJBTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbml0ZSBEaWZmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJX0RJU0VBU0VfTU9ERUxfX0ZJTklURV9ESUZGRVJFTkNFID0gU0lfX0ZJTklURV9ESUZGRVJFTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyZXF1ZW5jeSBEZXBlbmRlbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lfRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVCA9IFNJX19GUkVRVUVOQ1lfREVQRU5ERU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgQmlydGggUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSV9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEUgPSBTSV9fQkFDS0dST1VORF9CSVJUSF9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVCA9IFNJX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQgUmVjaXByb2NhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSV9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UX1JFQ0lQUk9DQUwgPSBTSV9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIEFyZWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lfRElTRUFTRV9NT0RFTF9fVE9UQUxfQVJFQSA9IFNJX19UT1RBTF9BUkVBOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBQb3B1bGF0aW9uIERlbnNpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lfRElTRUFTRV9NT0RFTF9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWSA9IFNJX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zbWlzc2lvbiBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFID0gU0lfX1RSQU5TTUlTU0lPTl9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBMaW5lYXJpdHkgQ29lZmZpY2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lfRElTRUFTRV9NT0RFTF9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVCA9IFNJX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlY292ZXJ5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lfRElTRUFTRV9NT0RFTF9fUkVDT1ZFUllfUkFURSA9IFNJX19SRUNPVkVSWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURSA9IFNJX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBoeXNpY2FsbHkgQWRqYWNlbnQgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJX0RJU0VBU0VfTU9ERUxfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gU0lfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWQgTmV0d29yayBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lfRElTRUFTRV9NT0RFTF9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTiA9IFNJX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZID0gU0lfX0lORkVDVElPVVNfTU9SVEFMSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSV9ESVNFQVNFX01PREVMX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0UgPSBTSV9fQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlN0b2NoYXN0aWMgUG9pc3NvbiBTSSBEaXNlYXNlIE1vZGVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSV9ESVNFQVNFX01PREVMX0ZFQVRVUkVfQ09VTlQgPSBTSV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxJbXBsIDxlbT5TdG9jaGFzdGljIFBvaXNzb24gU0lSIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJUl9ESVNFQVNFX01PREVMID0gMzk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJUl9ESVNFQVNFX01PREVMX19VUkkgPSBTSVJfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSVJfRElTRUFTRV9NT0RFTF9fVFlQRV9VUkkgPSBTSVJfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJUl9ESVNFQVNFX01PREVMX19EVUJMSU5fQ09SRSA9IFNJUl9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWxzIFRvIFVwZGF0ZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJUl9ESVNFQVNFX01PREVMX19MQUJFTFNfVE9fVVBEQVRFID0gU0lSX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSVJfRElTRUFTRV9NT0RFTF9fR1JBUEggPSBTSVJfX0dSQVBIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lSX0RJU0VBU0VfTU9ERUxfX0VOQUJMRUQgPSBTSVJfX0VOQUJMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRGVjb3JhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJUl9ESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQgPSBTSVJfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSVJfRElTRUFTRV9NT0RFTF9fUFJPR1JFU1MgPSBTSVJfX1BST0dSRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lSX0RJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEUgPSBTSVJfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJUl9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBTSVJfX1BPUFVMQVRJT05fSURFTlRJRklFUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSVJfRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0QgPSBTSVJfX1RJTUVfUEVSSU9EOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSVJfRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FID0gU0lSX19ESVNFQVNFX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVsYXRpdmUgVG9sZXJhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJUl9ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0UgPSBTSVJfX1JFTEFUSVZFX1RPTEVSQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pdGUgRGlmZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSVJfRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0UgPSBTSVJfX0ZJTklURV9ESUZGRVJFTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyZXF1ZW5jeSBEZXBlbmRlbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lSX0RJU0VBU0VfTU9ERUxfX0ZSRVFVRU5DWV9ERVBFTkRFTlQgPSBTSVJfX0ZSRVFVRU5DWV9ERVBFTkRFTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBCaXJ0aCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJUl9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEUgPSBTSVJfX0JBQ0tHUk9VTkRfQklSVEhfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBQb3B1bGF0aW9uIENvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJUl9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UID0gU0lSX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQgUmVjaXByb2NhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSVJfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMID0gU0lSX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UX1JFQ0lQUk9DQUw7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgQXJlYTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSVJfRElTRUFTRV9NT0RFTF9fVE9UQUxfQVJFQSA9IFNJUl9fVE9UQUxfQVJFQTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgUG9wdWxhdGlvbiBEZW5zaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJUl9ESVNFQVNFX01PREVMX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZID0gU0lSX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zbWlzc2lvbiBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJUl9ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURSA9IFNJUl9fVFJBTlNNSVNTSU9OX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9uIExpbmVhcml0eSBDb2VmZmljaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TSVJfRElTRUFTRV9NT0RFTF9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVCA9IFNJUl9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWNvdmVyeSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJUl9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFID0gU0lSX19SRUNPVkVSWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lSX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUgPSBTSVJfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lSX0RJU0VBU0VfTU9ERUxfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gU0lSX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkIE5ldHdvcmsgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJUl9ESVNFQVNFX01PREVMX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gU0lSX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJUl9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWSA9IFNJUl9fSU5GRUNUSU9VU19NT1JUQUxJVFk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhcmFjdGVyaXN0aWMgTWl4aW5nIERpc3RhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NJUl9ESVNFQVNFX01PREVMX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0UgPSBTSVJfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbW11bml0eSBMb3NzIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lSX0RJU0VBU0VfTU9ERUxfX0lNTVVOSVRZX0xPU1NfUkFURSA9IFNJUl9fSU1NVU5JVFlfTE9TU19SQVRFOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlN0b2NoYXN0aWMgUG9pc3NvbiBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0lSX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCA9IFNJUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsSW1wbCA8ZW0+U3RvY2hhc3RpYyBQb2lzc29uIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TRUlSX0RJU0VBU0VfTU9ERUwgPSA0MDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMX19VUkkgPSBTRUlSX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMX19UWVBFX1VSSSA9IFNFSVJfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NFSVJfRElTRUFTRV9NT0RFTF9fRFVCTElOX0NPUkUgPSBTRUlSX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMX19MQUJFTFNfVE9fVVBEQVRFID0gU0VJUl9fTEFCRUxTX1RPX1VQREFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMX19HUkFQSCA9IFNFSVJfX0dSQVBIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMX19FTkFCTEVEID0gU0VJUl9fRU5BQkxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMX19HUkFQSF9ERUNPUkFURUQgPSBTRUlSX19HUkFQSF9ERUNPUkFURUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMX19QUk9HUkVTUyA9IFNFSVJfX1BST0dSRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFID0gU0VJUl9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBTRUlSX19QT1BVTEFUSU9OX0lERU5USUZJRVI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMX19USU1FX1BFUklPRCA9IFNFSVJfX1RJTUVfUEVSSU9EOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0RJU0VBU0VfTkFNRSA9IFNFSVJfX0RJU0VBU0VfTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWxhdGl2ZSBUb2xlcmFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0UgPSBTRUlSX19SRUxBVElWRV9UT0xFUkFOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXRlIERpZmZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMX19GSU5JVEVfRElGRkVSRU5DRSA9IFNFSVJfX0ZJTklURV9ESUZGRVJFTkNFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyZXF1ZW5jeSBEZXBlbmRlbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMX19GUkVRVUVOQ1lfREVQRU5ERU5UID0gU0VJUl9fRlJFUVVFTkNZX0RFUEVOREVOVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kIEJpcnRoIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEUgPSBTRUlSX19CQUNLR1JPVU5EX0JJUlRIX1JBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlQgPSBTRUlSX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvdGFsIFBvcHVsYXRpb24gQ291bnQgUmVjaXByb2NhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTCA9IFNFSVJfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBBcmVhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NFSVJfRElTRUFTRV9NT0RFTF9fVE9UQUxfQVJFQSA9IFNFSVJfX1RPVEFMX0FSRUE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFBvcHVsYXRpb24gRGVuc2l0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFkgPSBTRUlSX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zbWlzc2lvbiBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NFSVJfRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEUgPSBTRUlSX19UUkFOU01JU1NJT05fUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob24gTGluZWFyaXR5IENvZWZmaWNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NFSVJfRElTRUFTRV9NT0RFTF9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVCA9IFNFSVJfX05PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVjb3ZlcnkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEUgPSBTRUlSX19SRUNPVkVSWV9SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFID0gU0VJUl9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaHlzaWNhbGx5IEFkamFjZW50IEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gU0VJUl9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT04gPSBTRUlSX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NFSVJfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFkgPSBTRUlSX19JTkZFQ1RJT1VTX01PUlRBTElUWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFyYWN0ZXJpc3RpYyBNaXhpbmcgRGlzdGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0UgPSBTRUlSX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0U7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1tdW5pdHkgTG9zcyBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RPQ0hBU1RJQ19QT0lTU09OX1NFSVJfRElTRUFTRV9NT0RFTF9fSU1NVU5JVFlfTE9TU19SQVRFID0gU0VJUl9fSU1NVU5JVFlfTE9TU19SQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY3ViYXRpb24gUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0lOQ1VCQVRJT05fUkFURSA9IFNFSVJfX0lOQ1VCQVRJT05fUkFURTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TdG9jaGFzdGljIFBvaXNzb24gU0VJUiBEaXNlYXNlIE1vZGVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUT0NIQVNUSUNfUE9JU1NPTl9TRUlSX0RJU0VBU0VfTU9ERUxfRkVBVFVSRV9DT1VOVCA9IFNFSVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25JbXBsIDxlbT5JbmZlY3RvciBJbm9jdWxhdG9yIENvbGxlY3Rpb248L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5JbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IElORkVDVE9SX0lOT0NVTEFUT1JfQ09MTEVDVElPTiA9IDQxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElORkVDVE9SX0lOT0NVTEFUT1JfQ09MTEVDVElPTl9fVVJJID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTkZFQ1RPUl9JTk9DVUxBVE9SX0NPTExFQ1RJT05fX1RZUEVfVVJJID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElORkVDVE9SX0lOT0NVTEFUT1JfQ09MTEVDVElPTl9fRFVCTElOX0NPUkUgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElORkVDVE9SX0lOT0NVTEFUT1JfQ09MTEVDVElPTl9fTEFCRUxTX1RPX1VQREFURSA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9fTEFCRUxTX1RPX1VQREFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTkZFQ1RPUl9JTk9DVUxBVE9SX0NPTExFQ1RJT05fX0dSQVBIID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19HUkFQSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5GRUNUT1JfSU5PQ1VMQVRPUl9DT0xMRUNUSU9OX19FTkFCTEVEID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19FTkFCTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElORkVDVE9SX0lOT0NVTEFUT1JfQ09MTEVDVElPTl9fR1JBUEhfREVDT1JBVEVEID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19HUkFQSF9ERUNPUkFURUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTkZFQ1RPUl9JTk9DVUxBVE9SX0NPTExFQ1RJT05fX1BST0dSRVNTID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19QUk9HUkVTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTkZFQ1RPUl9JTk9DVUxBVE9SX0NPTExFQ1RJT05fX0xJU1QgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wb3J0IEZvbGRlcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElORkVDVE9SX0lOT0NVTEFUT1JfQ09MTEVDVElPTl9fSU1QT1JUX0ZPTERFUiA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JbmZlY3RvciBJbm9jdWxhdG9yIENvbGxlY3Rpb248L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5GRUNUT1JfSU5PQ1VMQVRPUl9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlVSSTwvZW0+JyBkYXRhIHR5cGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0VVJJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFVSSSA9IDQyOworCisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVMaXN0PC9lbT4nIGRhdGEgdHlwZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldEVMaXN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEVMSVNUID0gNDM7CisKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UmFuZG9tPC9lbT4nIGRhdGEgdHlwZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgamF2YS51dGlsLlJhbmRvbQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRSYW5kb20oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUkFORE9NID0gNDQ7CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbCA8ZW0+RGV0ZXJtaW5pc3RpYyBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGV0ZXJtaW5pc3RpYyBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldERldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsIDxlbT5EZXRlcm1pbmlzdGljIFNJIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGV0ZXJtaW5pc3RpYyBTSSBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbCA8ZW0+RGV0ZXJtaW5pc3RpYyBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZXRlcm1pbmlzdGljIFNJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldERldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwgPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldERpc2Vhc2VNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2dldEJhY2tncm91bmRNb3J0YWxpdHlSYXRlIDxlbT5CYWNrZ3JvdW5kIE1vcnRhbGl0eSBSYXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwjZ2V0QmFja2dyb3VuZE1vcnRhbGl0eVJhdGUoKQorCSAqIEBzZWUgI2dldERpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RGlzZWFzZU1vZGVsX0JhY2tncm91bmRNb3J0YWxpdHlSYXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIgPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQorCSAqIEBzZWUgI2dldERpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RGlzZWFzZU1vZGVsX1BvcHVsYXRpb25JZGVudGlmaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwjZ2V0VGltZVBlcmlvZCA8ZW0+VGltZSBQZXJpb2Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UaW1lIFBlcmlvZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwjZ2V0VGltZVBlcmlvZCgpCisJICogQHNlZSAjZ2V0RGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREaXNlYXNlTW9kZWxfVGltZVBlcmlvZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2dldERpc2Vhc2VOYW1lIDxlbT5EaXNlYXNlIE5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaXNlYXNlIE5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2dldERpc2Vhc2VOYW1lKCkKKwkgKiBAc2VlICNnZXREaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERpc2Vhc2VNb2RlbF9EaXNlYXNlTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2dldFJlbGF0aXZlVG9sZXJhbmNlIDxlbT5SZWxhdGl2ZSBUb2xlcmFuY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWxhdGl2ZSBUb2xlcmFuY2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2dldFJlbGF0aXZlVG9sZXJhbmNlKCkKKwkgKiBAc2VlICNnZXREaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERpc2Vhc2VNb2RlbF9SZWxhdGl2ZVRvbGVyYW5jZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2lzRmluaXRlRGlmZmVyZW5jZSA8ZW0+RmluaXRlIERpZmZlcmVuY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pdGUgRGlmZmVyZW5jZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwjaXNGaW5pdGVEaWZmZXJlbmNlKCkKKwkgKiBAc2VlICNnZXREaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERpc2Vhc2VNb2RlbF9GaW5pdGVEaWZmZXJlbmNlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwjaXNGcmVxdWVuY3lEZXBlbmRlbnQgPGVtPkZyZXF1ZW5jeSBEZXBlbmRlbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GcmVxdWVuY3kgRGVwZW5kZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCNpc0ZyZXF1ZW5jeURlcGVuZGVudCgpCisJICogQHNlZSAjZ2V0RGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREaXNlYXNlTW9kZWxfRnJlcXVlbmN5RGVwZW5kZW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwjZ2V0QmFja2dyb3VuZEJpcnRoUmF0ZSA8ZW0+QmFja2dyb3VuZCBCaXJ0aCBSYXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QmFja2dyb3VuZCBCaXJ0aCBSYXRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCNnZXRCYWNrZ3JvdW5kQmlydGhSYXRlKCkKKwkgKiBAc2VlICNnZXREaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERpc2Vhc2VNb2RlbF9CYWNrZ3JvdW5kQmlydGhSYXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWwgPGVtPkRpc2Vhc2UgTW9kZWwgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlzZWFzZSBNb2RlbCBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RGlzZWFzZU1vZGVsTGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsI2dldFBvcHVsYXRpb25MYWJlbCA8ZW0+UG9wdWxhdGlvbiBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlBvcHVsYXRpb24gTGFiZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWwjZ2V0UG9wdWxhdGlvbkxhYmVsKCkKKwkgKiBAc2VlICNnZXREaXNlYXNlTW9kZWxMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0RGlzZWFzZU1vZGVsTGFiZWxfUG9wdWxhdGlvbkxhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbCNnZXREaXNlYXNlTW9kZWxTdGF0ZSA8ZW0+RGlzZWFzZSBNb2RlbCBTdGF0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkRpc2Vhc2UgTW9kZWwgU3RhdGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWwjZ2V0RGlzZWFzZU1vZGVsU3RhdGUoKQorCSAqIEBzZWUgI2dldERpc2Vhc2VNb2RlbExhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXREaXNlYXNlTW9kZWxMYWJlbF9EaXNlYXNlTW9kZWxTdGF0ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWwjZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwgPGVtPlBvcHVsYXRpb24gTW9kZWwgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsI2dldFBvcHVsYXRpb25Nb2RlbExhYmVsKCkKKwkgKiBAc2VlICNnZXREaXNlYXNlTW9kZWxMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0RGlzZWFzZU1vZGVsTGFiZWxfUG9wdWxhdGlvbk1vZGVsTGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlIDxlbT5EaXNlYXNlIE1vZGVsIExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc2Vhc2UgTW9kZWwgTGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSNnZXREaXNlYXNlRGVhdGhzIDxlbT5EaXNlYXNlIERlYXRoczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRpc2Vhc2UgRGVhdGhzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUjZ2V0RGlzZWFzZURlYXRocygpCisJICogQHNlZSAjZ2V0RGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RGlzZWFzZU1vZGVsTGFiZWxWYWx1ZV9EaXNlYXNlRGVhdGhzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlI2dldFBvcHVsYXRpb25Db3VudCA8ZW0+UG9wdWxhdGlvbiBDb3VudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvcHVsYXRpb24gQ291bnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSNnZXRQb3B1bGF0aW9uQ291bnQoKQorCSAqIEBzZWUgI2dldERpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERpc2Vhc2VNb2RlbExhYmVsVmFsdWVfUG9wdWxhdGlvbkNvdW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlI2dldEluY2lkZW5jZSA8ZW0+SW5jaWRlbmNlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5jaWRlbmNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUjZ2V0SW5jaWRlbmNlKCkKKwkgKiBAc2VlICNnZXREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREaXNlYXNlTW9kZWxMYWJlbFZhbHVlX0luY2lkZW5jZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbFN0YXRlIDxlbT5EaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc2Vhc2UgTW9kZWwgU3RhdGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsU3RhdGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldERpc2Vhc2VNb2RlbFN0YXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsU3RhdGUjZ2V0TGFiZWwgPGVtPkxhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkxhYmVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbFN0YXRlI2dldExhYmVsKCkKKwkgKiBAc2VlICNnZXREaXNlYXNlTW9kZWxTdGF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0RGlzZWFzZU1vZGVsU3RhdGVfTGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvciA8ZW0+SW5mZWN0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW5mZWN0b3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEluZmVjdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvciNnZXREaXNlYXNlTW9kZWwgPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5EaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9yI2dldERpc2Vhc2VNb2RlbCgpCisJICogQHNlZSAjZ2V0SW5mZWN0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEluZmVjdG9yX0Rpc2Vhc2VNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3IjZ2V0VGFyZ2V0VVJJIDxlbT5UYXJnZXQgVVJJPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IFVSSTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvciNnZXRUYXJnZXRVUkkoKQorCSAqIEBzZWUgI2dldEluZmVjdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRJbmZlY3Rvcl9UYXJnZXRVUkkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9yI2dldERpc2Vhc2VOYW1lIDxlbT5EaXNlYXNlIE5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaXNlYXNlIE5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3IjZ2V0RGlzZWFzZU5hbWUoKQorCSAqIEBzZWUgI2dldEluZmVjdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRJbmZlY3Rvcl9EaXNlYXNlTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3IjZ2V0VGFyZ2V0SVNPS2V5IDxlbT5UYXJnZXQgSVNPIEtleTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhcmdldCBJU08gS2V5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9yI2dldFRhcmdldElTT0tleSgpCisJICogQHNlZSAjZ2V0SW5mZWN0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEluZmVjdG9yX1RhcmdldElTT0tleSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvciNnZXRMYWJlbHNUb0luZmVjdCA8ZW0+TGFiZWxzIFRvIEluZmVjdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+TGFiZWxzIFRvIEluZmVjdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvciNnZXRMYWJlbHNUb0luZmVjdCgpCisJICogQHNlZSAjZ2V0SW5mZWN0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEluZmVjdG9yX0xhYmVsc1RvSW5mZWN0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvciNnZXRQb3B1bGF0aW9uSWRlbnRpZmllciA8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9yI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkKKwkgKiBAc2VlICNnZXRJbmZlY3RvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0SW5mZWN0b3JfUG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9yI2lzSW5mZWN0UGVyY2VudGFnZSA8ZW0+SW5mZWN0IFBlcmNlbnRhZ2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbmZlY3QgUGVyY2VudGFnZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvciNpc0luZmVjdFBlcmNlbnRhZ2UoKQorCSAqIEBzZWUgI2dldEluZmVjdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRJbmZlY3Rvcl9JbmZlY3RQZXJjZW50YWdlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUiA8ZW0+U0VJUjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TRUlSPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNFSVIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVIjZ2V0SW5jdWJhdGlvblJhdGUgPGVtPkluY3ViYXRpb24gUmF0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluY3ViYXRpb24gUmF0ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSI2dldEluY3ViYXRpb25SYXRlKCkKKwkgKiBAc2VlICNnZXRTRUlSKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTRUlSX0luY3ViYXRpb25SYXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsIDxlbT5TRUlSIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNFSVIgTGFiZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTRUlSTGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbCNnZXREZWx0YVZhbHVlIDxlbT5EZWx0YSBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkRlbHRhIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbCNnZXREZWx0YVZhbHVlKCkKKwkgKiBAc2VlICNnZXRTRUlSTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNFSVJMYWJlbF9EZWx0YVZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWwjZ2V0UHJvYmVWYWx1ZSA8ZW0+UHJvYmUgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Qcm9iZSBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWwjZ2V0UHJvYmVWYWx1ZSgpCisJICogQHNlZSAjZ2V0U0VJUkxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTRUlSTGFiZWxfUHJvYmVWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsI2dldFRlbXBWYWx1ZSA8ZW0+VGVtcCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlRlbXAgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsI2dldFRlbXBWYWx1ZSgpCisJICogQHNlZSAjZ2V0U0VJUkxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTRUlSTGFiZWxfVGVtcFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWwjZ2V0T3JpZ2luYWxWYWx1ZSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWwjZ2V0T3JpZ2luYWxWYWx1ZSgpCisJICogQHNlZSAjZ2V0U0VJUkxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTRUlSTGFiZWxfT3JpZ2luYWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsI2dldEVycm9yU2NhbGUgPGVtPkVycm9yIFNjYWxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RXJyb3IgU2NhbGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsI2dldEVycm9yU2NhbGUoKQorCSAqIEBzZWUgI2dldFNFSVJMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0VJUkxhYmVsX0Vycm9yU2NhbGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWxWYWx1ZSA8ZW0+U0VJUiBMYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TRUlSIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbFZhbHVlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTRUlSTGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsVmFsdWUjZ2V0RSA8ZW0+RTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsVmFsdWUjZ2V0RSgpCisJICogQHNlZSAjZ2V0U0VJUkxhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNFSVJMYWJlbFZhbHVlX0UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSA8ZW0+U0k8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U0k8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNJKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRUcmFuc21pc3Npb25SYXRlIDxlbT5UcmFuc21pc3Npb24gUmF0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRyYW5zbWlzc2lvbiBSYXRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJI2dldFRyYW5zbWlzc2lvblJhdGUoKQorCSAqIEBzZWUgI2dldFNJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTSV9UcmFuc21pc3Npb25SYXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXROb25MaW5lYXJpdHlDb2VmZmljaWVudCA8ZW0+Tm9uIExpbmVhcml0eSBDb2VmZmljaWVudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vbiBMaW5lYXJpdHkgQ29lZmZpY2llbnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kjZ2V0Tm9uTGluZWFyaXR5Q29lZmZpY2llbnQoKQorCSAqIEBzZWUgI2dldFNJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTSV9Ob25MaW5lYXJpdHlDb2VmZmljaWVudCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kjZ2V0UmVjb3ZlcnlSYXRlIDxlbT5SZWNvdmVyeSBSYXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVjb3ZlcnkgUmF0ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRSZWNvdmVyeVJhdGUoKQorCSAqIEBzZWUgI2dldFNJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTSV9SZWNvdmVyeVJhdGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJI2dldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlIDxlbT5JbmZlY3Rpb3VzIE1vcnRhbGl0eSBSYXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSgpCisJICogQHNlZSAjZ2V0U0koKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNJX0luZmVjdGlvdXNNb3J0YWxpdHlSYXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbiA8ZW0+UGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QaHlzaWNhbGx5IEFkamFjZW50IEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbigpCisJICogQHNlZSAjZ2V0U0koKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNJX1BoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRSb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uIDxlbT5Sb2FkIE5ldHdvcmsgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRSb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uKCkKKwkgKiBAc2VlICNnZXRTSSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U0lfUm9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kjZ2V0SW5mZWN0aW91c01vcnRhbGl0eSA8ZW0+SW5mZWN0aW91cyBNb3J0YWxpdHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbmZlY3Rpb3VzIE1vcnRhbGl0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRJbmZlY3Rpb3VzTW9ydGFsaXR5KCkKKwkgKiBAc2VlICNnZXRTSSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U0lfSW5mZWN0aW91c01vcnRhbGl0eSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kjZ2V0Q2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSA8ZW0+Q2hhcmFjdGVyaXN0aWMgTWl4aW5nIERpc3RhbmNlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhcmFjdGVyaXN0aWMgTWl4aW5nIERpc3RhbmNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJI2dldENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UoKQorCSAqIEBzZWUgI2dldFNJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTSV9DaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lEaXNlYXNlTW9kZWxTdGF0ZSA8ZW0+U0kgRGlzZWFzZSBNb2RlbCBTdGF0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TSSBEaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJRGlzZWFzZU1vZGVsU3RhdGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNJRGlzZWFzZU1vZGVsU3RhdGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUluZmVjdG9yIDxlbT5TSSBJbmZlY3RvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TSSBJbmZlY3RvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUluZmVjdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTSUluZmVjdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUluZmVjdG9yI2dldEluZmVjdGlvdXNDb3VudCA8ZW0+SW5mZWN0aW91cyBDb3VudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluZmVjdGlvdXMgQ291bnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lJbmZlY3RvciNnZXRJbmZlY3Rpb3VzQ291bnQoKQorCSAqIEBzZWUgI2dldFNJSW5mZWN0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNJSW5mZWN0b3JfSW5mZWN0aW91c0NvdW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbCA8ZW0+U0kgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U0kgTGFiZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U0lMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbCNnZXREZWx0YVZhbHVlIDxlbT5EZWx0YSBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkRlbHRhIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWwjZ2V0RGVsdGFWYWx1ZSgpCisJICogQHNlZSAjZ2V0U0lMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0lMYWJlbF9EZWx0YVZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsI2dldFByb2JlVmFsdWUgPGVtPlByb2JlIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UHJvYmUgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbCNnZXRQcm9iZVZhbHVlKCkKKwkgKiBAc2VlICNnZXRTSUxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTSUxhYmVsX1Byb2JlVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWwjZ2V0VGVtcFZhbHVlIDxlbT5UZW1wIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+VGVtcCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsI2dldFRlbXBWYWx1ZSgpCisJICogQHNlZSAjZ2V0U0lMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0lMYWJlbF9UZW1wVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWwjZ2V0T3JpZ2luYWxWYWx1ZSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsI2dldE9yaWdpbmFsVmFsdWUoKQorCSAqIEBzZWUgI2dldFNJTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNJTGFiZWxfT3JpZ2luYWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbCNnZXRFcnJvclNjYWxlIDxlbT5FcnJvciBTY2FsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVycm9yIFNjYWxlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWwjZ2V0RXJyb3JTY2FsZSgpCisJICogQHNlZSAjZ2V0U0lMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0lMYWJlbF9FcnJvclNjYWxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbFZhbHVlIDxlbT5TSSBMYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TSSBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNJTGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbFZhbHVlI2dldEkgPGVtPkk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZSNnZXRJKCkKKwkgKiBAc2VlICNnZXRTSUxhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNJTGFiZWxWYWx1ZV9JKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSIDxlbT5TSVI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U0lSPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U0lSKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVIjZ2V0SW1tdW5pdHlMb3NzUmF0ZSA8ZW0+SW1tdW5pdHkgTG9zcyBSYXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW1tdW5pdHkgTG9zcyBSYXRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUiNnZXRJbW11bml0eUxvc3NSYXRlKCkKKwkgKiBAc2VlICNnZXRTSVIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNJUl9JbW11bml0eUxvc3NSYXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWwgPGVtPlNJUiBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TSVIgTGFiZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNJUkxhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbCNnZXREZWx0YVZhbHVlIDxlbT5EZWx0YSBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkRlbHRhIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsI2dldERlbHRhVmFsdWUoKQorCSAqIEBzZWUgI2dldFNJUkxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTSVJMYWJlbF9EZWx0YVZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbCNnZXRQcm9iZVZhbHVlIDxlbT5Qcm9iZSBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlByb2JlIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsI2dldFByb2JlVmFsdWUoKQorCSAqIEBzZWUgI2dldFNJUkxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTSVJMYWJlbF9Qcm9iZVZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbCNnZXRUZW1wVmFsdWUgPGVtPlRlbXAgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5UZW1wIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsI2dldFRlbXBWYWx1ZSgpCisJICogQHNlZSAjZ2V0U0lSTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNJUkxhYmVsX1RlbXBWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWwjZ2V0T3JpZ2luYWxWYWx1ZSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbCNnZXRPcmlnaW5hbFZhbHVlKCkKKwkgKiBAc2VlICNnZXRTSVJMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0lSTGFiZWxfT3JpZ2luYWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWwjZ2V0RXJyb3JTY2FsZSA8ZW0+RXJyb3IgU2NhbGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FcnJvciBTY2FsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbCNnZXRFcnJvclNjYWxlKCkKKwkgKiBAc2VlICNnZXRTSVJMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U0lSTGFiZWxfRXJyb3JTY2FsZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsVmFsdWUgPGVtPlNJUiBMYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TSVIgTGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWxWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U0lSTGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWxWYWx1ZSNnZXRSIDxlbT5SPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbFZhbHVlI2dldFIoKQorCSAqIEBzZWUgI2dldFNJUkxhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNJUkxhYmVsVmFsdWVfUigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsIDxlbT5EaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFN0YW5kYXJkRGlzZWFzZU1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbCNnZXRUb3RhbFBvcHVsYXRpb25Db3VudCA8ZW0+VG90YWwgUG9wdWxhdGlvbiBDb3VudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvdGFsIFBvcHVsYXRpb24gQ291bnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwjZ2V0VG90YWxQb3B1bGF0aW9uQ291bnQoKQorCSAqIEBzZWUgI2dldFN0YW5kYXJkRGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTdGFuZGFyZERpc2Vhc2VNb2RlbF9Ub3RhbFBvcHVsYXRpb25Db3VudCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwjZ2V0VG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsIDxlbT5Ub3RhbCBQb3B1bGF0aW9uIENvdW50IFJlY2lwcm9jYWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ub3RhbCBQb3B1bGF0aW9uIENvdW50IFJlY2lwcm9jYWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwjZ2V0VG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsKCkKKwkgKiBAc2VlICNnZXRTdGFuZGFyZERpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxfVG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbCNnZXRUb3RhbEFyZWEgPGVtPlRvdGFsIEFyZWE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ub3RhbCBBcmVhPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsI2dldFRvdGFsQXJlYSgpCisJICogQHNlZSAjZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFN0YW5kYXJkRGlzZWFzZU1vZGVsX1RvdGFsQXJlYSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwjZ2V0UmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHkgPGVtPlJlZmVyZW5jZSBQb3B1bGF0aW9uIERlbnNpdHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWZlcmVuY2UgUG9wdWxhdGlvbiBEZW5zaXR5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsI2dldFJlZmVyZW5jZVBvcHVsYXRpb25EZW5zaXR5KCkKKwkgKiBAc2VlICNnZXRTdGFuZGFyZERpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxfUmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIDxlbT5EaXNlYXNlIE1vZGVsIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc2Vhc2UgTW9kZWwgTGFiZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSA8ZW0+RGlzZWFzZSBNb2RlbCBMYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaXNlYXNlIE1vZGVsIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUjZ2V0UyA8ZW0+UzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlI2dldFMoKQorCSAqIEBzZWUgI2dldFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlX1MoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlIDxlbT5EaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc2Vhc2UgTW9kZWwgU3RhdGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZSNnZXRBcmVhUmF0aW8gPGVtPkFyZWEgUmF0aW88L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BcmVhIFJhdGlvPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUjZ2V0QXJlYVJhdGlvKCkKKwkgKiBAc2VlICNnZXRTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlX0FyZWFSYXRpbygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkSW5mZWN0b3IgPGVtPkluZmVjdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkluZmVjdG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkSW5mZWN0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFN0YW5kYXJkSW5mZWN0b3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCA8ZW0+U3RvY2hhc3RpYyBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U3RvY2hhc3RpYyBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsIDxlbT5TdG9jaGFzdGljIFNJIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U3RvY2hhc3RpYyBTSSBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCA8ZW0+U3RvY2hhc3RpYyBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TdG9jaGFzdGljIFNJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlciA8ZW0+U2FuaXR5IENoZWNrZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2FuaXR5IENoZWNrZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIKKwkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U2FuaXR5Q2hlY2tlcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWwgPGVtPkludGVncmF0aW9uIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkludGVncmF0aW9uIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWwKKwkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWwiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRJbnRlZ3JhdGlvbkxhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbFZhbHVlIDxlbT5JbnRlZ3JhdGlvbiBMYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbnRlZ3JhdGlvbiBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsVmFsdWUKKwkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWxWYWx1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEludGVncmF0aW9uTGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yIDxlbT5JbnRlZ3JhdGlvbiBEZWNvcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW50ZWdyYXRpb24gRGVjb3JhdG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yCisJICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvciIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEludGVncmF0aW9uRGVjb3JhdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbCA8ZW0+QWdncmVnYXRpbmcgU0kgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BZ2dyZWdhdGluZyBTSSBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlIDxlbT5BZ2dyZWdhdGluZyBEaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFnZ3JlZ2F0aW5nIERpc2Vhc2UgTW9kZWwgU3RhdGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0QWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlI2dldENoaWxkcmVuc0xhYmVscyA8ZW0+Q2hpbGRyZW5zIExhYmVsczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q2hpbGRyZW5zIExhYmVsczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlI2dldENoaWxkcmVuc0xhYmVscygpCisJICogQHNlZSAjZ2V0QWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZV9DaGlsZHJlbnNMYWJlbHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwgPGVtPkFnZ3JlZ2F0aW5nIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BZ2dyZWdhdGluZyBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCA8ZW0+QWdncmVnYXRpbmcgU0lSIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWdncmVnYXRpbmcgU0lSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCA8ZW0+U3RvY2hhc3RpYyBEaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsI2dldFNlZWQgPGVtPlNlZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZWVkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNEaXNlYXNlTW9kZWwjZ2V0U2VlZCgpCisJICogQHNlZSAjZ2V0U3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbF9TZWVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsI2dldFJhbmRvbUdlbmVyYXRvciA8ZW0+UmFuZG9tIEdlbmVyYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhbmRvbSBHZW5lcmF0b3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCNnZXRSYW5kb21HZW5lcmF0b3IoKQorCSAqIEBzZWUgI2dldFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxfUmFuZG9tR2VuZXJhdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsIDxlbT5TdG9jaGFzdGljIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U3RvY2hhc3RpYyBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwjZ2V0R2FpbiA8ZW0+R2FpbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdhaW48L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsI2dldEdhaW4oKQorCSAqIEBzZWUgI2dldFN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsX0dhaW4oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJJbm9jdWxhdG9yIDxlbT5TSVIgSW5vY3VsYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TSVIgSW5vY3VsYXRvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJJbm9jdWxhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTSVJJbm9jdWxhdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJJbm9jdWxhdG9yI2dldElub2N1bGF0ZWRQZXJjZW50YWdlIDxlbT5Jbm9jdWxhdGVkIFBlcmNlbnRhZ2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Jbm9jdWxhdGVkIFBlcmNlbnRhZ2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSSW5vY3VsYXRvciNnZXRJbm9jdWxhdGVkUGVyY2VudGFnZSgpCisJICogQHNlZSAjZ2V0U0lSSW5vY3VsYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U0lSSW5vY3VsYXRvcl9Jbm9jdWxhdGVkUGVyY2VudGFnZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSSW5vY3VsYXRvciNpc0lub2N1bGF0ZVBlcmNlbnRhZ2UgPGVtPklub2N1bGF0ZSBQZXJjZW50YWdlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5vY3VsYXRlIFBlcmNlbnRhZ2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSSW5vY3VsYXRvciNpc0lub2N1bGF0ZVBlcmNlbnRhZ2UoKQorCSAqIEBzZWUgI2dldFNJUklub2N1bGF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNJUklub2N1bGF0b3JfSW5vY3VsYXRlUGVyY2VudGFnZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwgPGVtPlN0b2NoYXN0aWMgUG9pc3NvbiBTSSBEaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlN0b2NoYXN0aWMgUG9pc3NvbiBTSSBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbCA8ZW0+U3RvY2hhc3RpYyBQb2lzc29uIFNJUiBEaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlN0b2NoYXN0aWMgUG9pc3NvbiBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwgPGVtPlN0b2NoYXN0aWMgUG9pc3NvbiBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U3RvY2hhc3RpYyBQb2lzc29uIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24gPGVtPkluZmVjdG9yIElub2N1bGF0b3IgQ29sbGVjdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbmZlY3RvciBJbm9jdWxhdG9yIENvbGxlY3Rpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0SW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uI2dldExpc3QgPGVtPkxpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkxpc3Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbiNnZXRMaXN0KCkKKwkgKiBAc2VlICNnZXRJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uX0xpc3QoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24jZ2V0SW1wb3J0Rm9sZGVyIDxlbT5JbXBvcnQgRm9sZGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW1wb3J0IEZvbGRlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uI2dldEltcG9ydEZvbGRlcigpCisJICogQHNlZSAjZ2V0SW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0SW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbl9JbXBvcnRGb2xkZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIDxlbT5VUkk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlVSSTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkKKwkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRURhdGFUeXBlIGdldFVSSSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdCA8ZW0+RUxpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkVMaXN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0CisJICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRURhdGFUeXBlIGdldEVMaXN0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS51dGlsLlJhbmRvbSA8ZW0+UmFuZG9tPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5SYW5kb208L2VtPicuCisJICogQHNlZSBqYXZhLnV0aWwuUmFuZG9tCisJICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEudXRpbC5SYW5kb20iCisJICogQGdlbmVyYXRlZAorCSAqLworCUVEYXRhVHlwZSBnZXRSYW5kb20oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0YW5kYXJkRmFjdG9yeSBnZXRTdGFuZGFyZEZhY3RvcnkoKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKwkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorCSAqIDwvdWw+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCWludGVyZmFjZSBMaXRlcmFscyAgeworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsSW1wbCA8ZW0+RGV0ZXJtaW5pc3RpYyBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldERldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIERFVEVSTUlOSVNUSUNfU0VJUl9ESVNFQVNFX01PREVMID0gZUlOU1RBTkNFLmdldERldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWxJbXBsIDxlbT5EZXRlcm1pbmlzdGljIFNJIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXREZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMID0gZUlOU1RBTkNFLmdldERldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwgPGVtPkRldGVybWluaXN0aWMgU0lSIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0RGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBERVRFUk1JTklTVElDX1NJUl9ESVNFQVNFX01PREVMID0gZUlOU1RBTkNFLmdldERldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbEltcGwgPGVtPkRpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXREaXNlYXNlTW9kZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgRElTRUFTRV9NT0RFTCA9IGVJTlNUQU5DRS5nZXREaXNlYXNlTW9kZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQgTW9ydGFsaXR5IFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFID0gZUlOU1RBTkNFLmdldERpc2Vhc2VNb2RlbF9CYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSID0gZUlOU1RBTkNFLmdldERpc2Vhc2VNb2RlbF9Qb3B1bGF0aW9uSWRlbnRpZmllcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBESVNFQVNFX01PREVMX19USU1FX1BFUklPRCA9IGVJTlNUQU5DRS5nZXREaXNlYXNlTW9kZWxfVGltZVBlcmlvZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FID0gZUlOU1RBTkNFLmdldERpc2Vhc2VNb2RlbF9EaXNlYXNlTmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVsYXRpdmUgVG9sZXJhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRElTRUFTRV9NT0RFTF9fUkVMQVRJVkVfVE9MRVJBTkNFID0gZUlOU1RBTkNFLmdldERpc2Vhc2VNb2RlbF9SZWxhdGl2ZVRvbGVyYW5jZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmluaXRlIERpZmZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBESVNFQVNFX01PREVMX19GSU5JVEVfRElGRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXREaXNlYXNlTW9kZWxfRmluaXRlRGlmZmVyZW5jZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RnJlcXVlbmN5IERlcGVuZGVudDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERJU0VBU0VfTU9ERUxfX0ZSRVFVRU5DWV9ERVBFTkRFTlQgPSBlSU5TVEFOQ0UuZ2V0RGlzZWFzZU1vZGVsX0ZyZXF1ZW5jeURlcGVuZGVudCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZCBCaXJ0aCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9CSVJUSF9SQVRFID0gZUlOU1RBTkNFLmdldERpc2Vhc2VNb2RlbF9CYWNrZ3JvdW5kQmlydGhSYXRlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxMYWJlbEltcGwgPGVtPkRpc2Vhc2UgTW9kZWwgTGFiZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxMYWJlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldERpc2Vhc2VNb2RlbExhYmVsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIERJU0VBU0VfTU9ERUxfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0RGlzZWFzZU1vZGVsTGFiZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gTGFiZWw8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBESVNFQVNFX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX0xBQkVMID0gZUlOU1RBTkNFLmdldERpc2Vhc2VNb2RlbExhYmVsX1BvcHVsYXRpb25MYWJlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBNb2RlbCBTdGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIERJU0VBU0VfTU9ERUxfTEFCRUxfX0RJU0VBU0VfTU9ERUxfU1RBVEUgPSBlSU5TVEFOQ0UuZ2V0RGlzZWFzZU1vZGVsTGFiZWxfRGlzZWFzZU1vZGVsU3RhdGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gTW9kZWwgTGFiZWw8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBESVNFQVNFX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX01PREVMX0xBQkVMID0gZUlOU1RBTkNFLmdldERpc2Vhc2VNb2RlbExhYmVsX1BvcHVsYXRpb25Nb2RlbExhYmVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbCA8ZW0+RGlzZWFzZSBNb2RlbCBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIERJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0RGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzZWFzZSBEZWF0aHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19ESVNFQVNFX0RFQVRIUyA9IGVJTlNUQU5DRS5nZXREaXNlYXNlTW9kZWxMYWJlbFZhbHVlX0Rpc2Vhc2VEZWF0aHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gQ291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19QT1BVTEFUSU9OX0NPVU5UID0gZUlOU1RBTkNFLmdldERpc2Vhc2VNb2RlbExhYmVsVmFsdWVfUG9wdWxhdGlvbkNvdW50KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmNpZGVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19JTkNJREVOQ0UgPSBlSU5TVEFOQ0UuZ2V0RGlzZWFzZU1vZGVsTGFiZWxWYWx1ZV9JbmNpZGVuY2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbFN0YXRlSW1wbCA8ZW0+RGlzZWFzZSBNb2RlbCBTdGF0ZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbFN0YXRlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0RGlzZWFzZU1vZGVsU3RhdGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgRElTRUFTRV9NT0RFTF9TVEFURSA9IGVJTlNUQU5DRS5nZXREaXNlYXNlTW9kZWxTdGF0ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGFiZWw8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgRElTRUFTRV9NT0RFTF9TVEFURV9fTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0RGlzZWFzZU1vZGVsU3RhdGVfTGFiZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkluZmVjdG9ySW1wbCA8ZW0+SW5mZWN0b3I8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5JbmZlY3RvckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldEluZmVjdG9yKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIElORkVDVE9SID0gZUlOU1RBTkNFLmdldEluZmVjdG9yKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNlYXNlIE1vZGVsPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgSU5GRUNUT1JfX0RJU0VBU0VfTU9ERUwgPSBlSU5TVEFOQ0UuZ2V0SW5mZWN0b3JfRGlzZWFzZU1vZGVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgSU5GRUNUT1JfX1RBUkdFVF9VUkkgPSBlSU5TVEFOQ0UuZ2V0SW5mZWN0b3JfVGFyZ2V0VVJJKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNlYXNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBJTkZFQ1RPUl9fRElTRUFTRV9OQU1FID0gZUlOU1RBTkNFLmdldEluZmVjdG9yX0Rpc2Vhc2VOYW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgSVNPIEtleTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIElORkVDVE9SX19UQVJHRVRfSVNPX0tFWSA9IGVJTlNUQU5DRS5nZXRJbmZlY3Rvcl9UYXJnZXRJU09LZXkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBJbmZlY3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIElORkVDVE9SX19MQUJFTFNfVE9fSU5GRUNUID0gZUlOU1RBTkNFLmdldEluZmVjdG9yX0xhYmVsc1RvSW5mZWN0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBJTkZFQ1RPUl9fUE9QVUxBVElPTl9JREVOVElGSUVSID0gZUlOU1RBTkNFLmdldEluZmVjdG9yX1BvcHVsYXRpb25JZGVudGlmaWVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmZlY3QgUGVyY2VudGFnZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIElORkVDVE9SX19JTkZFQ1RfUEVSQ0VOVEFHRSA9IGVJTlNUQU5DRS5nZXRJbmZlY3Rvcl9JbmZlY3RQZXJjZW50YWdlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TRUlSSW1wbCA8ZW0+U0VJUjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNFSVJJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTRUlSKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNFSVIgPSBlSU5TVEFOQ0UuZ2V0U0VJUigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5jdWJhdGlvbiBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0VJUl9fSU5DVUJBVElPTl9SQVRFID0gZUlOU1RBTkNFLmdldFNFSVJfSW5jdWJhdGlvblJhdGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNFSVJMYWJlbEltcGwgPGVtPlNFSVIgTGFiZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TRUlSTGFiZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTRUlSTGFiZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU0VJUl9MQUJFTCA9IGVJTlNUQU5DRS5nZXRTRUlSTGFiZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbHRhIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0VJUl9MQUJFTF9fREVMVEFfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0U0VJUkxhYmVsX0RlbHRhVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2JlIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0VJUl9MQUJFTF9fUFJPQkVfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0U0VJUkxhYmVsX1Byb2JlVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRlbXAgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTRUlSX0xBQkVMX19URU1QX1ZBTFVFID0gZUlOU1RBTkNFLmdldFNFSVJMYWJlbF9UZW1wVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0VJUl9MQUJFTF9fT1JJR0lOQUxfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0U0VJUkxhYmVsX09yaWdpbmFsVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVycm9yIFNjYWxlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0VJUl9MQUJFTF9fRVJST1JfU0NBTEUgPSBlSU5TVEFOQ0UuZ2V0U0VJUkxhYmVsX0Vycm9yU2NhbGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNFSVJMYWJlbFZhbHVlSW1wbCA8ZW0+U0VJUiBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNFSVJMYWJlbFZhbHVlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U0VJUkxhYmVsVmFsdWUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU0VJUl9MQUJFTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRTRUlSTGFiZWxWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNFSVJfTEFCRUxfVkFMVUVfX0UgPSBlSU5TVEFOQ0UuZ2V0U0VJUkxhYmVsVmFsdWVfRSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lJbXBsIDxlbT5TSTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U0koKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU0kgPSBlSU5TVEFOQ0UuZ2V0U0koKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zbWlzc2lvbiBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0lfX1RSQU5TTUlTU0lPTl9SQVRFID0gZUlOU1RBTkNFLmdldFNJX1RyYW5zbWlzc2lvblJhdGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vbiBMaW5lYXJpdHkgQ29lZmZpY2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTSV9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVCA9IGVJTlNUQU5DRS5nZXRTSV9Ob25MaW5lYXJpdHlDb2VmZmljaWVudCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVjb3ZlcnkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNJX19SRUNPVkVSWV9SQVRFID0gZUlOU1RBTkNFLmdldFNJX1JlY292ZXJ5UmF0ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNJX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFID0gZUlOU1RBTkNFLmdldFNJX0luZmVjdGlvdXNNb3J0YWxpdHlSYXRlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QaHlzaWNhbGx5IEFkamFjZW50IEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNJX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTiA9IGVJTlNUQU5DRS5nZXRTSV9QaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9hZCBOZXR3b3JrIEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNJX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OID0gZUlOU1RBTkNFLmdldFNJX1JvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgTW9ydGFsaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0lfX0lORkVDVElPVVNfTU9SVEFMSVRZID0gZUlOU1RBTkNFLmdldFNJX0luZmVjdGlvdXNNb3J0YWxpdHkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNJX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0UgPSBlSU5TVEFOQ0UuZ2V0U0lfQ2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lEaXNlYXNlTW9kZWxTdGF0ZUltcGwgPGVtPlNJIERpc2Vhc2UgTW9kZWwgU3RhdGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSURpc2Vhc2VNb2RlbFN0YXRlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U0lEaXNlYXNlTW9kZWxTdGF0ZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTSV9ESVNFQVNFX01PREVMX1NUQVRFID0gZUlOU1RBTkNFLmdldFNJRGlzZWFzZU1vZGVsU3RhdGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJSW5mZWN0b3JJbXBsIDxlbT5TSSBJbmZlY3RvcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJSW5mZWN0b3JJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTSUluZmVjdG9yKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNJX0lORkVDVE9SID0gZUlOU1RBTkNFLmdldFNJSW5mZWN0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluZmVjdGlvdXMgQ291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTSV9JTkZFQ1RPUl9fSU5GRUNUSU9VU19DT1VOVCA9IGVJTlNUQU5DRS5nZXRTSUluZmVjdG9yX0luZmVjdGlvdXNDb3VudCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lMYWJlbEltcGwgPGVtPlNJIExhYmVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lMYWJlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFNJTGFiZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU0lfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0U0lMYWJlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVsdGEgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTSV9MQUJFTF9fREVMVEFfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0U0lMYWJlbF9EZWx0YVZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9iZSBWYWx1ZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNJX0xBQkVMX19QUk9CRV9WQUxVRSA9IGVJTlNUQU5DRS5nZXRTSUxhYmVsX1Byb2JlVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRlbXAgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTSV9MQUJFTF9fVEVNUF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRTSUxhYmVsX1RlbXBWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3JpZ2luYWwgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTSV9MQUJFTF9fT1JJR0lOQUxfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0U0lMYWJlbF9PcmlnaW5hbFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FcnJvciBTY2FsZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNJX0xBQkVMX19FUlJPUl9TQ0FMRSA9IGVJTlNUQU5DRS5nZXRTSUxhYmVsX0Vycm9yU2NhbGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJTGFiZWxWYWx1ZUltcGwgPGVtPlNJIExhYmVsIFZhbHVlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lMYWJlbFZhbHVlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U0lMYWJlbFZhbHVlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNJX0xBQkVMX1ZBTFVFID0gZUlOU1RBTkNFLmdldFNJTGFiZWxWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+STwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNJX0xBQkVMX1ZBTFVFX19JID0gZUlOU1RBTkNFLmdldFNJTGFiZWxWYWx1ZV9JKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJJbXBsIDxlbT5TSVI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTSVIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU0lSID0gZUlOU1RBTkNFLmdldFNJUigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW1tdW5pdHkgTG9zcyBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0lSX19JTU1VTklUWV9MT1NTX1JBVEUgPSBlSU5TVEFOQ0UuZ2V0U0lSX0ltbXVuaXR5TG9zc1JhdGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJUkxhYmVsSW1wbCA8ZW0+U0lSIExhYmVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lSTGFiZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTSVJMYWJlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTSVJfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0U0lSTGFiZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbHRhIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0lSX0xBQkVMX19ERUxUQV9WQUxVRSA9IGVJTlNUQU5DRS5nZXRTSVJMYWJlbF9EZWx0YVZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9iZSBWYWx1ZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNJUl9MQUJFTF9fUFJPQkVfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0U0lSTGFiZWxfUHJvYmVWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVtcCBWYWx1ZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNJUl9MQUJFTF9fVEVNUF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRTSVJMYWJlbF9UZW1wVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0lSX0xBQkVMX19PUklHSU5BTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRTSVJMYWJlbF9PcmlnaW5hbFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FcnJvciBTY2FsZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNJUl9MQUJFTF9fRVJST1JfU0NBTEUgPSBlSU5TVEFOQ0UuZ2V0U0lSTGFiZWxfRXJyb3JTY2FsZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lSTGFiZWxWYWx1ZUltcGwgPGVtPlNJUiBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJUkxhYmVsVmFsdWVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTSVJMYWJlbFZhbHVlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNJUl9MQUJFTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRTSVJMYWJlbFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0lSX0xBQkVMX1ZBTFVFX19SID0gZUlOU1RBTkNFLmdldFNJUkxhYmVsVmFsdWVfUigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmREaXNlYXNlTW9kZWxJbXBsIDxlbT5EaXNlYXNlIE1vZGVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmREaXNlYXNlTW9kZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTdGFuZGFyZERpc2Vhc2VNb2RlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTVEFOREFSRF9ESVNFQVNFX01PREVMID0gZUlOU1RBTkNFLmdldFN0YW5kYXJkRGlzZWFzZU1vZGVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBQb3B1bGF0aW9uIENvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVCA9IGVJTlNUQU5DRS5nZXRTdGFuZGFyZERpc2Vhc2VNb2RlbF9Ub3RhbFBvcHVsYXRpb25Db3VudCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgUG9wdWxhdGlvbiBDb3VudCBSZWNpcHJvY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMID0gZUlOU1RBTkNFLmdldFN0YW5kYXJkRGlzZWFzZU1vZGVsX1RvdGFsUG9wdWxhdGlvbkNvdW50UmVjaXByb2NhbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgQXJlYTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1RPVEFMX0FSRUEgPSBlSU5TVEFOQ0UuZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxfVG90YWxBcmVhKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgUG9wdWxhdGlvbiBEZW5zaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWSA9IGVJTlNUQU5DRS5nZXRTdGFuZGFyZERpc2Vhc2VNb2RlbF9SZWZlcmVuY2VQb3B1bGF0aW9uRGVuc2l0eSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbEltcGwgPGVtPkRpc2Vhc2UgTW9kZWwgTGFiZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMID0gZUlOU1RBTkNFLmdldFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUltcGwgPGVtPkRpc2Vhc2UgTW9kZWwgTGFiZWwgVmFsdWU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19TID0gZUlOU1RBTkNFLmdldFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZV9TKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlSW1wbCA8ZW0+RGlzZWFzZSBNb2RlbCBTdGF0ZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfU1RBVEUgPSBlSU5TVEFOQ0UuZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXJlYSBSYXRpbzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfU1RBVEVfX0FSRUFfUkFUSU8gPSBlSU5TVEFOQ0UuZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZV9BcmVhUmF0aW8oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkSW5mZWN0b3JJbXBsIDxlbT5JbmZlY3RvcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkSW5mZWN0b3JJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTdGFuZGFyZEluZmVjdG9yKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNUQU5EQVJEX0lORkVDVE9SID0gZUlOU1RBTkNFLmdldFN0YW5kYXJkSW5mZWN0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsSW1wbCA8ZW0+U3RvY2hhc3RpYyBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMID0gZUlOU1RBTkNFLmdldFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxJbXBsIDxlbT5TdG9jaGFzdGljIFNJIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMID0gZUlOU1RBTkNFLmdldFN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwgPGVtPlN0b2NoYXN0aWMgU0lSIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMID0gZUlOU1RBTkNFLmdldFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlciA8ZW0+U2FuaXR5IENoZWNrZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFNhbml0eUNoZWNrZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU0FOSVRZX0NIRUNLRVIgPSBlSU5TVEFOQ0UuZ2V0U2FuaXR5Q2hlY2tlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWwgPGVtPkludGVncmF0aW9uIExhYmVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldEludGVncmF0aW9uTGFiZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgSU5URUdSQVRJT05fTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0SW50ZWdyYXRpb25MYWJlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWxWYWx1ZSA8ZW0+SW50ZWdyYXRpb24gTGFiZWwgVmFsdWU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbFZhbHVlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRJbnRlZ3JhdGlvbkxhYmVsVmFsdWUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgSU5URUdSQVRJT05fTEFCRUxfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0SW50ZWdyYXRpb25MYWJlbFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3IgPGVtPkludGVncmF0aW9uIERlY29yYXRvcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvcgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0SW50ZWdyYXRpb25EZWNvcmF0b3IoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgSU5URUdSQVRJT05fREVDT1JBVE9SID0gZUlOU1RBTkNFLmdldEludGVncmF0aW9uRGVjb3JhdG9yKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5BZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsSW1wbCA8ZW0+QWdncmVnYXRpbmcgU0kgRGlzZWFzZSBNb2RlbDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIEFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUwgPSBlSU5TVEFOQ0UuZ2V0QWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZUltcGwgPGVtPkFnZ3JlZ2F0aW5nIERpc2Vhc2UgTW9kZWwgU3RhdGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5BZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0QWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBBR0dSRUdBVElOR19ESVNFQVNFX01PREVMX1NUQVRFID0gZUlOU1RBTkNFLmdldEFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoaWxkcmVucyBMYWJlbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEFHR1JFR0FUSU5HX0RJU0VBU0VfTU9ERUxfU1RBVEVfX0NISUxEUkVOU19MQUJFTFMgPSBlSU5TVEFOQ0UuZ2V0QWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZV9DaGlsZHJlbnNMYWJlbHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbEltcGwgPGVtPkFnZ3JlZ2F0aW5nIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldEFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBBR0dSRUdBVElOR19TRUlSX0RJU0VBU0VfTU9ERUwgPSBlSU5TVEFOQ0UuZ2V0QWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5BZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbEltcGwgPGVtPkFnZ3JlZ2F0aW5nIFNJUiBEaXNlYXNlIE1vZGVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBBR0dSRUdBVElOR19TSVJfRElTRUFTRV9NT0RFTCA9IGVJTlNUQU5DRS5nZXRBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGwgPGVtPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTCA9IGVJTlNUQU5DRS5nZXRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19TRUVEID0gZUlOU1RBTkNFLmdldFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxfU2VlZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmFuZG9tIEdlbmVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRTdG9jaGFzdGljRGlzZWFzZU1vZGVsX1JhbmRvbUdlbmVyYXRvcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbCA8ZW0+U3RvY2hhc3RpYyBEaXNlYXNlIE1vZGVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNUQU5EQVJEX1NUT0NIQVNUSUNfRElTRUFTRV9NT0RFTCA9IGVJTlNUQU5DRS5nZXRTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdhaW48L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTVEFOREFSRF9TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0dBSU4gPSBlSU5TVEFOQ0UuZ2V0U3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsX0dhaW4oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJUklub2N1bGF0b3JJbXBsIDxlbT5TSVIgSW5vY3VsYXRvcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJUklub2N1bGF0b3JJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTSVJJbm9jdWxhdG9yKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNJUl9JTk9DVUxBVE9SID0gZUlOU1RBTkNFLmdldFNJUklub2N1bGF0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklub2N1bGF0ZWQgUGVyY2VudGFnZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNJUl9JTk9DVUxBVE9SX19JTk9DVUxBVEVEX1BFUkNFTlRBR0UgPSBlSU5TVEFOQ0UuZ2V0U0lSSW5vY3VsYXRvcl9Jbm9jdWxhdGVkUGVyY2VudGFnZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5vY3VsYXRlIFBlcmNlbnRhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTSVJfSU5PQ1VMQVRPUl9fSU5PQ1VMQVRFX1BFUkNFTlRBR0UgPSBlSU5TVEFOQ0UuZ2V0U0lSSW5vY3VsYXRvcl9Jbm9jdWxhdGVQZXJjZW50YWdlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsSW1wbCA8ZW0+U3RvY2hhc3RpYyBQb2lzc29uIFNJIERpc2Vhc2UgTW9kZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTVE9DSEFTVElDX1BPSVNTT05fU0lfRElTRUFTRV9NT0RFTCA9IGVJTlNUQU5DRS5nZXRTdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbEltcGwgPGVtPlN0b2NoYXN0aWMgUG9pc3NvbiBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU1RPQ0hBU1RJQ19QT0lTU09OX1NJUl9ESVNFQVNFX01PREVMID0gZUlOU1RBTkNFLmdldFN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWxJbXBsIDxlbT5TdG9jaGFzdGljIFBvaXNzb24gU0VJUiBEaXNlYXNlIE1vZGVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNUT0NIQVNUSUNfUE9JU1NPTl9TRUlSX0RJU0VBU0VfTU9ERUwgPSBlSU5TVEFOQ0UuZ2V0U3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5JbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uSW1wbCA8ZW0+SW5mZWN0b3IgSW5vY3VsYXRvciBDb2xsZWN0aW9uPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbkltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgSU5GRUNUT1JfSU5PQ1VMQVRPUl9DT0xMRUNUSU9OID0gZUlOU1RBTkNFLmdldEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIElORkVDVE9SX0lOT0NVTEFUT1JfQ09MTEVDVElPTl9fTElTVCA9IGVJTlNUQU5DRS5nZXRJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uX0xpc3QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcG9ydCBGb2xkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBJTkZFQ1RPUl9JTk9DVUxBVE9SX0NPTExFQ1RJT05fX0lNUE9SVF9GT0xERVIgPSBlSU5TVEFOQ0UuZ2V0SW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbl9JbXBvcnRGb2xkZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlVSSTwvZW0+JyBkYXRhIHR5cGUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFVSSSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVEYXRhVHlwZSBVUkkgPSBlSU5TVEFOQ0UuZ2V0VVJJKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5FTGlzdDwvZW0+JyBkYXRhIHR5cGUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0RUxpc3QoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRGF0YVR5cGUgRUxJU1QgPSBlSU5TVEFOQ0UuZ2V0RUxpc3QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlJhbmRvbTwvZW0+JyBkYXRhIHR5cGUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIGphdmEudXRpbC5SYW5kb20KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFJhbmRvbSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVEYXRhVHlwZSBSQU5ET00gPSBlSU5TVEFOQ0UuZ2V0UmFuZG9tKCk7CisKKwl9CisKK30gLy9TdGFuZGFyZFBhY2thZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU2ZWI3NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8vIFN0YW5kYXJkU3RvY2hhc3RpRGlzZWFzZU1vZGVsLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGFuIEVNRiBtb2RlbC4KKyAqIAorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICovCitwdWJsaWMgaW50ZXJmYWNlIFN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCBleHRlbmRzIFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwgeworCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBtb2RlbCBkZWZhdWx0PSIwLjAxIgorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0R2FpbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCNnZXRHYWluIDxlbT5HYWluPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HYWluPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRHYWluKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRHYWluKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisJICovCisJcHVibGljIGRvdWJsZSBjb21wdXRlTm9pc2UoKTsKKwkKK30gLy8gU3RhbmRhcmRTdG9jaGFzdGlEaXNlYXNlTW9kZWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TdG9jaGFzdGljRGlzZWFzZU1vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TdG9jaGFzdGljRGlzZWFzZU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiZmIyMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1N0b2NoYXN0aWNEaXNlYXNlTW9kZWwuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvLyBTdG9jaGFzdGljRGlzZWFzZU1vZGVsLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhbiBFTUYgbW9kZWwKKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKKyAqLworcHVibGljIGludGVyZmFjZSBTdG9jaGFzdGljRGlzZWFzZU1vZGVsIGV4dGVuZHMgRGlzZWFzZU1vZGVsIHsKKworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHNlZWQgdXNlZCB0byBpbml0aWFsaXplIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKwkgKiBAbW9kZWwgZGVmYXVsdD0iMCIKKwkgKi8KKwlsb25nIGdldFNlZWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsI2dldFNlZWQgPGVtPlNlZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFNlZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNlZWQobG9uZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBAbW9kZWwgY2hhbmdlYWJsZT0iZmFsc2UiIGRlZmF1bHQ9IjAiCisJICovCisJUmFuZG9tIGdldFJhbmRvbUdlbmVyYXRvcigpOworfSAvLyBTdG9jaGFzdGljRGlzZWFzZU1vZGVsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzI1NzI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdG9jaGFzdGljIFBvaXNzb24gU0VJUiBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbCBleHRlbmRzIFNFSVIgeworfSAvLyBTdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1N0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1N0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzdjZThiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQ7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RvY2hhc3RpYyBQb2lzc29uIFNJIERpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRTdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwgZXh0ZW5kcyBTSSB7Cit9IC8vIFN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1N0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MGNmZTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQ7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RvY2hhc3RpYyBQb2lzc29uIFNJUiBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwgZXh0ZW5kcyBTSVIgeworfSAvLyBTdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1N0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdiYTY4ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL1N0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLy8gU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBjbGFzcyBpbiBhbiBFTUYgbW9kZWwgZm9yIGFuIFN0b2NoYXN0aWMgU0VJUiBkaXNlYXNlCisgKiBtb2RlbC4KKyAqIAorICogQHNlZSBTRUlSTGFiZWwKKyAqIEBzZWUgU0VJUkxhYmVsVmFsdWUKKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwgZXh0ZW5kcyBTRUlSLCBTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VnbWVudCBvZiB0aGUgdHlwZSBVUkkgdGhhdCBwcmVmaXhlcyBhbGwgb3RoZXIgc2VnbWVudHMgaW4gYQorCSAqIHN0YW5kYXJkIHN0b2NoYXN0aWMgU0VJUiBkaXNlYXNlIG1vZGVsIHR5cGUgVVJJLgorCSAqLworCVN0cmluZyBVUklfVFlQRV9TVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9TRUdNRU5UID0gVVJJX1RZUEVfU1RBTkRBUkRfU0VJUl9ESVNFQVNFX01PREVMX1NFR01FTlQKKwkJCSsgIi9zdG9jaGFzdGljIjsKKworfSAvLyBTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjkyNWI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLy8gU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgY2xhc3MgaW4gYW4gRU1GIG1vZGVsIGZvciBhbiBTdG9jaGFzdGljIFNJIGRpc2Vhc2UKKyAqIG1vZGVsLgorICogCisgKiBAc2VlIFNJTGFiZWwKKyAqIEBzZWUgU0lMYWJlbFZhbHVlCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIFN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbCBleHRlbmRzIFNJLCBTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwgeworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHNlZ21lbnQgb2YgdGhlIHR5cGUgVVJJIHRoYXQgcHJlZml4ZXMgYWxsIG90aGVyIHNlZ21lbnRzIGluIGEKKwkgKiBzdGFuZGFyZCBzdG9jaGFzdGljIFNJIGRpc2Vhc2UgbW9kZWwgdHlwZSBVUkkuCisJICovCisJU3RyaW5nIFVSSV9UWVBFX1NUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9TRUdNRU5UID0gVVJJX1RZUEVfU1RBTkRBUkRfU0lfRElTRUFTRV9NT0RFTF9TRUdNRU5UCisJCQkrICIvc3RvY2hhc3RpYyI7Cit9IC8vIFN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMmQwNDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLy8gU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIGNsYXNzIGluIGFuIEVNRiBtb2RlbCBmb3IgYW4gU3RvY2hhc3RpYyBTSVIgZGlzZWFzZQorICogbW9kZWwuCisgKiAKKyAqIEBzZWUgU0lSTGFiZWwKKyAqIEBzZWUgU0lSTGFiZWxWYWx1ZQorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsIGV4dGVuZHMgU0lSLCBTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwgeworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHNlZ21lbnQgb2YgdGhlIHR5cGUgVVJJIHRoYXQgcHJlZml4ZXMgYWxsIG90aGVyIHNlZ21lbnRzIGluIGEKKwkgKiBzdGFuZGFyZCBzdG9jaGFzdGljIFNJUiBkaXNlYXNlIG1vZGVsIHR5cGUgVVJJLgorCSAqLworCVN0cmluZyBVUklfVFlQRV9TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX1NFR01FTlQgPSBVUklfVFlQRV9TVEFOREFSRF9TSVJfRElTRUFTRV9NT0RFTF9TRUdNRU5UCisJCQkrICIvc3RvY2hhc3RpYyI7Cit9IC8vIFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTI5NzE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9BZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjg4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0TW9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BZ2dyZWdhdGluZyBEaXNlYXNlIE1vZGVsIFN0YXRlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5BZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlSW1wbCNnZXRDaGlsZHJlbnNMYWJlbHMgPGVtPkNoaWxkcmVucyBMYWJlbHM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlSW1wbCBleHRlbmRzIERpc2Vhc2VNb2RlbFN0YXRlSW1wbAorCQlpbXBsZW1lbnRzIEFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUgeworCisJLy8gQSBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUgdHJhbnNwb3J0YXRpb24gbW9kZXMKKwlwcm90ZWN0ZWQgTGlzdDxUcmFuc3BvcnRNb2RlPiB0cmFuc3BvcnRNb2RlcyA9IG51bGw7CisKKwkvLyBNYXAgYmV0d2VlbiB0cmFuc3BvcnQgbW9kZSBhbmQgbGlzdCBvZiBjaGlsZHJlbidzIHRyYW5zcG9ydAorCXByb3RlY3RlZCBNYXA8VHJhbnNwb3J0TW9kZSwgTGlzdDxFZGdlPj4gY2hpbGRUcmFuc3BvcnRFZGdlcyA9IG51bGw7CisKKwkvLyBNYXAgYmV0d2VlbiB0cmFuc3BvcnQgbW9kZSBhbmQgbGlzdCBvZiBwYXJlbnQvcGVlciBlZGdlcworCXByb3RlY3RlZCBNYXA8VHJhbnNwb3J0TW9kZSwgTGlzdDxFZGdlPj4gcGFyZW50UGVlclRyYW5zcG9ydEVkZ2VzID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoaWxkcmVuc0xhYmVscygpIDxlbT5DaGlsZHJlbnMgTGFiZWxzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDaGlsZHJlbnNMYWJlbHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxTSUxhYmVsPiBjaGlsZHJlbnNMYWJlbHM7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5BR0dSRUdBVElOR19ESVNFQVNFX01PREVMX1NUQVRFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8U0lMYWJlbD4gZ2V0Q2hpbGRyZW5zTGFiZWxzKCkgeworCQlpZiAoY2hpbGRyZW5zTGFiZWxzID09IG51bGwpIHsKKwkJCWNoaWxkcmVuc0xhYmVscyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8U0lMYWJlbD4oU0lMYWJlbC5jbGFzcywgdGhpcywgU3RhbmRhcmRQYWNrYWdlLkFHR1JFR0FUSU5HX0RJU0VBU0VfTU9ERUxfU1RBVEVfX0NISUxEUkVOU19MQUJFTFMpOworCQl9CisJCXJldHVybiBjaGlsZHJlbnNMYWJlbHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkFHR1JFR0FUSU5HX0RJU0VBU0VfTU9ERUxfU1RBVEVfX0NISUxEUkVOU19MQUJFTFM6CisJCQkJcmV0dXJuIGdldENoaWxkcmVuc0xhYmVscygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkFHR1JFR0FUSU5HX0RJU0VBU0VfTU9ERUxfU1RBVEVfX0NISUxEUkVOU19MQUJFTFM6CisJCQkJZ2V0Q2hpbGRyZW5zTGFiZWxzKCkuY2xlYXIoKTsKKwkJCQlnZXRDaGlsZHJlbnNMYWJlbHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNJTGFiZWw+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkFHR1JFR0FUSU5HX0RJU0VBU0VfTU9ERUxfU1RBVEVfX0NISUxEUkVOU19MQUJFTFM6CisJCQkJZ2V0Q2hpbGRyZW5zTGFiZWxzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5BR0dSRUdBVElOR19ESVNFQVNFX01PREVMX1NUQVRFX19DSElMRFJFTlNfTEFCRUxTOgorCQkJCXJldHVybiBjaGlsZHJlbnNMYWJlbHMgIT0gbnVsbCAmJiAhY2hpbGRyZW5zTGFiZWxzLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogQHJldHVybiBhIGxpc3Qgb2YgdGhlIHRyYW5zcG9ydGF0aW9uIG1vZGVzIHRoYXQgc2VuZCBhbmQgcmVjZWl2ZQorCSAqICAgICAgICAgcG9wdWxhdGlvbiBtZW1iZXJzIHRvIGFuZCBmcm9tIHRoZSA8Y29kZT5Ob2RlPC9jb2RlPiBsYWJlbGVkIGJ5CisJICogICAgICAgICB0aGUgZGlzZWFzZSBtb2RlbCBsYWJlbC4KKwkgKi8KKwlwdWJsaWMgTGlzdDxUcmFuc3BvcnRNb2RlPiBnZXRUcmFuc3BvcnRNb2RlcygpIHsKKwkJLy8gSGF2ZSB3ZSBzZXQgdGhlIHRyYW5zcG9ydCBtb2RlcyB5ZXQ/CisJCWlmICh0cmFuc3BvcnRNb2RlcyA9PSBudWxsKSB7CisJCQkvLyBObworCQkJaW5pdGlhbGl6ZVRyYW5zcG9ydENvbGxlY3Rpb25zKCk7CisJCX0gLy8gaWYgdHJhbnNwb3J0IG1vZGVzCisKKwkJcmV0dXJuIHRyYW5zcG9ydE1vZGVzOworCX0gLy8gZ2V0VHJhbnNwb3J0TW9kZXMKKworCS8qKgorCSAqIEByZXR1cm4gYSBNYXAgYmV0d2VlbiB0aGUgdHJhbnNwb3J0YXRpb24gbW9kZXMgdGhhdCBzZW5kIGFuZCByZWNlaXZlCisJICogICAgICAgICBwb3B1bGF0aW9uIG1lbWJlcnMgdG8gYW5kIGZyb20gdGhlIDxjb2RlPk5vZGU8L2NvZGU+IGxhYmVsZWQgYnkKKwkgKiAgICAgICAgIHRoZSBkaXNlYXNlIG1vZGVsIGxhYmVsIGFuZCB0aGUgPGNvZGU+RWRnZTwvY29kZT5zIHRvL2Zyb20gdGhlCisJICogICAgICAgICA8Y29kZT5Ob2RlPC9jb2RlPidzIGNoaWxkcmVuLgorCSAqLworCXB1YmxpYyBNYXA8VHJhbnNwb3J0TW9kZSwgTGlzdDxFZGdlPj4gZ2V0Q2hpbGRUcmFuc3BvcnRFZGdlcygpIHsKKwkJLy8gSGF2ZSB3ZSBzZXQgdGhlIGNoaWxkIHRyYW5zcG9ydCBlZGdlcyB5ZXQ/CisJCWlmIChjaGlsZFRyYW5zcG9ydEVkZ2VzID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQlpbml0aWFsaXplVHJhbnNwb3J0Q29sbGVjdGlvbnMoKTsKKwkJfQorCQlyZXR1cm4gY2hpbGRUcmFuc3BvcnRFZGdlczsKKwl9IC8vIGdldENoaWxkVHJhbnNwb3J0RWRnZXMKKworCS8qKgorCSAqIEByZXR1cm4gYSBNYXAgYmV0d2VlbiB0aGUgdHJhbnNwb3J0YXRpb24gbW9kZXMgdGhhdCBzZW5kIGFuZCByZWNlaXZlCisJICogICAgICAgICBwb3B1bGF0aW9uIG1lbWJlcnMgdG8gYW5kIGZyb20gdGhlIDxjb2RlPk5vZGU8L2NvZGU+IGxhYmVsZWQgYnkKKwkgKiAgICAgICAgIHRoZSBkaXNlYXNlIG1vZGVsIGxhYmVsIGFuZCB0aGUgPGNvZGU+RWRnZTwvY29kZT5zIHRvL2Zyb20gdGhlCisJICogICAgICAgICA8Y29kZT5Ob2RlPC9jb2RlPidzIHBhcmVudCBhbmQgcGVlcnMgKGkuZS4sIG5vdCB0aGUgY2hpbGRyZW4pLgorCSAqLworCXB1YmxpYyBNYXA8VHJhbnNwb3J0TW9kZSwgTGlzdDxFZGdlPj4gZ2V0UGFyZW50UGVlclRyYW5zcG9ydEVkZ2VzKCkgeworCQkvLyBIYXZlIHdlIHNldCB0aGUgY2hpbGQgdHJhbnNwb3J0IGVkZ2VzIHlldD8KKwkJaWYgKHBhcmVudFBlZXJUcmFuc3BvcnRFZGdlcyA9PSBudWxsKSB7CisJCQkvLyBObworCQkJaW5pdGlhbGl6ZVRyYW5zcG9ydENvbGxlY3Rpb25zKCk7CisJCX0KKwkJcmV0dXJuIHBhcmVudFBlZXJUcmFuc3BvcnRFZGdlczsKKwl9IC8vIGdldFBhcmVudFBlZXJUcmFuc3BvcnRFZGdlcworCisJLyoqCisJICogSW5pdGlhbGl6ZSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VHJhbnNwb3J0TW9kZXMoKX0sCisJICoge0BsaW5rICNnZXRDaGlsZHJlbnNMYWJlbHMoKX0sIGFuZAorCSAqIHtAbGluayAjZ2V0UGFyZW50UGVlclRyYW5zcG9ydEVkZ2VzKCl9LgorCSAqIAorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUcmFuc3BvcnRDb2xsZWN0aW9ucygpIHsKKwkJdHJhbnNwb3J0TW9kZXMgPSBuZXcgQXJyYXlMaXN0PFRyYW5zcG9ydE1vZGU+KCk7CisJCWNoaWxkVHJhbnNwb3J0RWRnZXMgPSBuZXcgSGFzaE1hcDxUcmFuc3BvcnRNb2RlLCBMaXN0PEVkZ2U+PigpOworCQlwYXJlbnRQZWVyVHJhbnNwb3J0RWRnZXMgPSBuZXcgSGFzaE1hcDxUcmFuc3BvcnRNb2RlLCBMaXN0PEVkZ2U+PigpOworCisJCWZpbmFsIE5vZGUgbm9kZSA9IGdldExhYmVsKCkuZ2V0Tm9kZSgpOworCisJCWZpbmFsIExpc3Q8RWRnZT4gdHJhbnNwb3J0RWRnZXMgPSBnZXRUcmFuc3BvcnRFZGdlcyhub2RlKTsKKworCQkvLyBTb3J0IG91dCB0aGUgdHJhbnNwb3J0IGVkZ2VzCisJCWZvciAoRWRnZSBlZGdlIDogdHJhbnNwb3J0RWRnZXMpIHsKKwkJCS8vIElzIHRoZSBlZGdlIHdpdGggb25lIHRoaXMgbm9kZSdzIGNoaWxkcmVuPworCQkJaWYgKGlzRWRnZVdpdGhBQ2hpbGROb2RlKGVkZ2UsIG5vZGUpKSB7CisJCQkJLy8gWWVzCisJCQkJYWRkRWRnZShlZGdlLCBjaGlsZFRyYW5zcG9ydEVkZ2VzKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gTm8KKwkJCQkvLyBNdXN0IGJlIHRoZSBwYXJlbnQgb3IgYSBwZWVyCisJCQkJYWRkRWRnZShlZGdlLCBwYXJlbnRQZWVyVHJhbnNwb3J0RWRnZXMpOworCQkJfQorCQl9IC8vIGZvciBlYWNoIGVkZ2UKKworCQlmaW5hbCBTZXQ8VHJhbnNwb3J0TW9kZT4gdGVtcFNldCA9IG5ldyBIYXNoU2V0PFRyYW5zcG9ydE1vZGU+KCk7CisJCXRlbXBTZXQuYWRkQWxsKGNoaWxkVHJhbnNwb3J0RWRnZXMua2V5U2V0KCkpOworCQl0ZW1wU2V0LmFkZEFsbChwYXJlbnRQZWVyVHJhbnNwb3J0RWRnZXMua2V5U2V0KCkpOworCQl0cmFuc3BvcnRNb2Rlcy5hZGRBbGwodGVtcFNldCk7CisJfSAvLyBpbml0aWFsaXplVHJhbnNwb3J0Q29sbGVjdGlvbnMKKworCS8qKgorCSAqIEBwYXJhbSBub2RlCisJICogQHJldHVybiBhbGwgb2YgdGhlIHRyYW5zcG9ydGF0aW9uIGVkZ2VzIHRvL2Zyb20gdGhlIGFyZ3VtZW50CisJICogICAgICAgICA8Y29kZT5Ob2RlPC9jb2RlPgorCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdDxFZGdlPiBnZXRUcmFuc3BvcnRFZGdlcyhOb2RlIG5vZGUpIHsKKwkJZmluYWwgTGlzdDxFZGdlPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8RWRnZT4oKTsKKworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPEVkZ2U+IGVkZ2VJdGVyID0gbm9kZS5nZXRFZGdlcygpLml0ZXJhdG9yKCk7IGVkZ2VJdGVyCisJCQkJLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIEVkZ2UgZWRnZSA9IGVkZ2VJdGVyLm5leHQoKTsKKwkJCS8vIElzIHRoaXMgYSB0cmFuc3BvcnRhdGlvbiBlZGdlPworCQkJZmluYWwgTGFiZWwgbGFiZWwgPSBlZGdlLmdldExhYmVsKCk7CisJCQlpZiAobGFiZWwgaW5zdGFuY2VvZiBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCkgeworCQkJCS8vIFllcworCQkJCXJldFZhbHVlLmFkZChlZGdlKTsKKwkJCX0KKwkJfSAvLyBmb3IgZWFjaCBlZGdlCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0VHJhbnNwb3J0RWRnZXMKKworCS8qKgorCSAqIEBwYXJhbSBlZGdlCisJICogQHBhcmFtIG5vZGUKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSA8Y29kZT5FZGdlPC9jb2RlPiBpcyB3aXRoIG9uZSBvZiB0aGUKKwkgKiAgICAgICAgIDxjb2RlPk5vZGU8L2NvZGU+J3MgY2hpbGRyZW4uCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzRWRnZVdpdGhBQ2hpbGROb2RlKEVkZ2UgZWRnZSwgTm9kZSBub2RlKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKKwkJZmluYWwgTm9kZSBvdGhlck5vZGUgPSBlZGdlLmdldE90aGVyTm9kZShub2RlKTsKKwkJcmV0VmFsdWUgPSBBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsSW1wbC5nZXRQYXJlbnROb2RlKG90aGVyTm9kZSkgPT0gbm9kZTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gaXNFZGdlV2l0aEFDaGlsZE5vZGUKKworCS8qKgorCSAqIEFkZCB0aGUgZWRnZSB0byB0aGUgbWFwIHVuZGVyIHRoZSBjb3JyZWN0IHRyYW5zcG9ydGF0aW9uIG1vZGUKKwkgKiAKKwkgKiBAcGFyYW0gZWRnZQorCSAqIEBwYXJhbSB0cmFuc3BvcnRNYXAKKwkgKi8KKwlwcml2YXRlIHZvaWQgYWRkRWRnZShFZGdlIGVkZ2UsIE1hcDxUcmFuc3BvcnRNb2RlLCBMaXN0PEVkZ2U+PiB0cmFuc3BvcnRNYXApIHsKKwkJLy8gR2V0IHRoZSB0cmFuc3BvcnQgbW9kZQorCQlmaW5hbCBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCB0cmwgPSAoVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwpIGVkZ2UKKwkJCQkuZ2V0TGFiZWwoKTsKKwkJZmluYWwgVHJhbnNwb3J0TW9kZSB0cmFuc3BvcnRNb2RlID0gdHJsLmdldFRyYW5zcG9ydE1vZGUoKTsKKwkJTGlzdDxFZGdlPiBlZGdlTGlzdCA9IHRyYW5zcG9ydE1hcC5nZXQodHJhbnNwb3J0TW9kZSk7CisJCS8vIFdhcyB0aGVyZSBhbHJlYWR5IGEgbGlzdD8KKwkJaWYgKGVkZ2VMaXN0ID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQkvLyAuLi50aGVyZSB3aWxsIGJlLgorCQkJZWRnZUxpc3QgPSBuZXcgQXJyYXlMaXN0PEVkZ2U+KCk7CisJCQl0cmFuc3BvcnRNYXAucHV0KHRyYW5zcG9ydE1vZGUsIGVkZ2VMaXN0KTsKKwkJfQorCQllZGdlTGlzdC5hZGQoZWRnZSk7CisJfSAvLyBhZGRFZGdlCisKK30gLy8gQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9BZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg1NjhjZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFnZ3JlZ2F0aW5nIFNFSVIgRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbEltcGwgZXh0ZW5kcworCQlBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbEltcGwgaW1wbGVtZW50cyBBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuQUdHUkVHQVRJTkdfU0VJUl9ESVNFQVNFX01PREVMOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbCBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbCgpIHsKKwkJcmV0dXJuIFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0VJUkxhYmVsKCk7CisJfSAvLyBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbAorCisJQE92ZXJyaWRlCisJcHVibGljIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpIHsKKwkJcmV0dXJuIFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0VJUkxhYmVsVmFsdWUoKTsKKwl9IC8vIGNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUZyb21DaGlsZExhYmVsKGZpbmFsIFNJTGFiZWwgcGFyZW50TGFiZWwsCisJCQlmaW5hbCBTSUxhYmVsIGNoaWxkTGFiZWwpIHsKKwkJc3VwZXIudXBkYXRlRnJvbUNoaWxkTGFiZWwocGFyZW50TGFiZWwsIGNoaWxkTGFiZWwpOworCisJCWZpbmFsIFNFSVJMYWJlbCBzZWlyUGFyZW50TGFiZWwgPSAoU0VJUkxhYmVsKSBwYXJlbnRMYWJlbDsKKwkJZmluYWwgU0VJUkxhYmVsIHNlaXJDaGlsZExhYmVsID0gKFNFSVJMYWJlbCkgY2hpbGRMYWJlbDsKKworCQlmaW5hbCBkb3VibGUgbmV4dEUgPSAoKFNFSVJMYWJlbFZhbHVlKXNlaXJQYXJlbnRMYWJlbC5nZXROZXh0VmFsdWUoKSkuZ2V0UigpOworCQlzZWlyUGFyZW50TGFiZWwuc2V0TmV4dEUobmV4dEUgKyBzZWlyQ2hpbGRMYWJlbC5nZXROZXh0RSgpKTsKKwl9IC8vIHVwZGF0ZUZyb21DaGlsZExhYmVsCisKK30gLy8gQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9BZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9BZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MmMxYWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL0FnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxJbXBsLmphdmEKQEAgLTAsMCArMSw3MzcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5VUklUb05vZGVNYXBFbnRyeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydE1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbFN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BZ2dyZWdhdGluZyBTSSBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbEltcGwgZXh0ZW5kcyBTSUltcGwgaW1wbGVtZW50cworCQlBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsIHsKKworCUJhc2ljRUxpc3QgcmV2ZXJzZUxhYmVsc1RvVXBkYXRlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLkFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUw7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxJbXBsI2RlY29yYXRlR3JhcGgoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGRlY29yYXRlR3JhcGgoU1RFTVRpbWUgdGltZSkgeworCQlmaW5hbCBOb2RlIHJvb3ROb2RlID0gZ2V0Um9vdE5vZGUoZ2V0R3JhcGgoKSk7CisJCS8vIERpZCB3ZSBmaW5kIGEgcm9vdCBub2RlPworCQlpZiAocm9vdE5vZGUgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlkZWNvcmF0ZUdyYXBoKHJvb3ROb2RlKTsKKwkJfSAvLyBpZgorCQllbHNlIHsKKwkJCS8vIE5vCisJCQlBY3RpdmF0b3IKKwkJCQkJLmxvZ0luZm9ybWF0aW9uKAorCQkJCQkJCWdldER1YmxpbkNvcmUoKS5nZXRUaXRsZSgpCisJCQkJCQkJCQkrICIgZGlkbid0IGZpbmQgYSByb290IG5vZGUgZm9yIHRoZSBncmFwaC4gIE1pc3NpbmcgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwPyIsCisJCQkJCQkJbnVsbCk7CisJCX0gLy8gZWxzZQorCQlyZXR1cm4gdHJ1ZTsKKwl9IC8vIGRlY29yYXRlR3JhcGgKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHJvb3Qge0BsaW5rIE5vZGV9IGluIHRoZSB0cmVlIGluIHRoZSBncmFwaCBmb3JtZWQgYnkgdGhlCisJICogICAgICAgICBjb250YWlubWVudCBlZGdlcy4KKwkgKi8KKwlwcml2YXRlIE5vZGUgZ2V0Um9vdE5vZGUoZmluYWwgR3JhcGggZ3JhcGgpIHsKKworCQlOb2RlIHBhcmVudCA9IG51bGw7CisJCS8vIEZpbmQgYSBub2RlIHRoYXQgaGFzIGEgY29udGFpbm1lbnQgZWRnZSBkaXJlY3RlZCBhdCBpdAorCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPE5vZGU+IG5vZGVJdGVyID0gZ3JhcGguZ2V0Tm9kZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBub2RlSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBOb2RlIG5vZGUgPSBub2RlSXRlci5uZXh0KCk7CisJCQkvLyBJcyB0aGlzIG5vZGUgImNvbnRhaW5lZCIgYnkgYW5vdGhlcj8KKwkJCXBhcmVudCA9IGdldFBhcmVudE5vZGUobm9kZSk7CisJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQlicmVhazsKKwkJCX0KKwkJfSAvLyBmb3IgZWFjaCBub2RlCisKKwkJLy8gRGlkIHdlIGZpbmQgYSBwYXJlbnQ/CisJCWlmIChwYXJlbnQgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQkvLyBXYWxrIHVwIHRoZSB0cmVlIHRvIHRoZSByb290CisJCQlOb2RlIG5ld1BhcmVudCA9IHBhcmVudDsKKwkJCWRvIHsKKwkJCQlwYXJlbnQgPSBuZXdQYXJlbnQ7CisJCQkJbmV3UGFyZW50ID0gZ2V0UGFyZW50Tm9kZShwYXJlbnQpOworCQkJfSB3aGlsZSAobmV3UGFyZW50ICE9IG51bGwpOworCQl9IC8vIGlmCisKKwkJcmV0dXJuIHBhcmVudDsKKwl9IC8vIGdldFJvb3ROb2RlCisKKwkvKioKKwkgKiBAcGFyYW0gbm9kZQorCSAqIEByZXR1cm4gdGhlIHtAbGluayBOb2RlfSB0aGF0IGNvbnRhaW5zIHRoaXMgb25lLCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqICAgICAgICAgaWYgdGhlcmUgaXMgbm8gcGFyZW50CisJICovCisJc3RhdGljIHB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoZmluYWwgTm9kZSBub2RlKSB7CisJCU5vZGUgcGFyZW50ID0gbnVsbDsKKwkJaWYgKG5vZGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPEVkZ2U+IGVkZ2VJdGVyID0gbm9kZS5nZXRFZGdlcygpLml0ZXJhdG9yKCk7IGVkZ2VJdGVyCisJCQkJLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIEVkZ2UgZWRnZSA9IGVkZ2VJdGVyLm5leHQoKTsKKwkJCS8vIERpcmVjdGVkIGF0IHRoaXMgbm9kZT8KKwkJCWlmIChlZGdlLmlzRGlyZWN0ZWRBdChub2RlKSkgeworCQkJCS8vIFllcworCQkJCWZpbmFsIExhYmVsIGxhYmVsID0gZWRnZS5nZXRMYWJlbCgpOworCQkJCS8vIENvbnRhaW5tZW50PworCQkJCWlmIChsYWJlbCBpbnN0YW5jZW9mIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCkgeworCQkJCQlmaW5hbCBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwgcnBybCA9IChSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwpIGxhYmVsOworCQkJCQlpZiAocnBybC5nZXRDdXJyZW50UmVsYXRpb25zaGlwKCkuZ2V0UmVsYXRpb25zaGlwKCkgPT0gUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcC5DT05UQUlOU19MSVRFUkFMKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXBhcmVudCA9IGVkZ2UuZ2V0T3RoZXJOb2RlKG5vZGUpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gLy8gZm9yIGVhY2ggZWRnZQorCisJCXJldHVybiBwYXJlbnQ7CisJfSAvLyBnZXRQYXJlbnROb2RlCisKKwkvKioKKwkgKiBSZWN1cnNpdmVseSBkZXNjZW5kIHRoZSB0cmVlIGZvcm1lZCBieSB0aGUge0BsaW5rIEVkZ2V9cyB3aXRoCisJICoge0BsaW5rIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbH1zCisJICoge0BsaW5rIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXAjQ09OVEFJTlN9IHZhbHVlcy4gRm9yIGluc3RhbmNlLCBmcm9tCisJICogYSBjb3VudHJ5IHRvIGl0cyBzdGF0ZXMuCisJICogCisJICogQHBhcmFtIG5vZGUKKwkgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyB7QGxpbmsgTm9kZX0KKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgU0lMYWJlbH0gaW5zdGFuY2UgdGhhdCBkZWNvcmF0ZXMgdGhlIHRyZWUgcm9vdGVkIGF0CisJICogICAgICAgICA8Y29kZT5ub2RlPC9jb2RlPi4KKwkgKi8KKwlwcm90ZWN0ZWQgU0lMYWJlbCBkZWNvcmF0ZUdyYXBoKGZpbmFsIE5vZGUgbm9kZSkgeworCQlTSUxhYmVsIHJldFZhbHVlID0gbnVsbDsKKwkJLy8gSXMgdGhlcmUgYSBub2RlIHRvIGRlY29yYXRlPworCQlpZiAobm9kZSAhPSBudWxsKSB7CisJCQkvLyBZZXMKKworCQkJLy8gRG9lcyB0aGlzIG5vZGUgYWxyZWFkeSBoYXZlIGEgbGFiZWwgZm9yIHRoZSByaWdodCBwb3B1bGF0aW9uIGFuZAorCQkJLy8gZGlzZWFzZSBtb2RlbCB0eXBlPworCQkJZm9yIChmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTW9kZWxMYWJlbCA6IGdldERpc2Vhc2VMYWJlbHMobm9kZSkpIHsKKwkJCQkvLyBJcyB0aGlzIG9uZSB3ZSdyZSBsb29raW5nIGZvcj8KKwkJCQlpZiAoZGlzZWFzZU1vZGVsTGFiZWwgaW5zdGFuY2VvZiBTSUxhYmVsKSB7CisJCQkJCS8vIElzIHRoZSBwb3B1bGF0aW9uIHRoZSBzYW1lPworCQkJCQlpZiAoZGlzZWFzZU1vZGVsTGFiZWwuZ2V0UG9wdWxhdGlvbkxhYmVsKCkuZ2V0TmFtZSgpCisJCQkJCQkJLmVxdWFscyhnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpKSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQkvLyBUaGlzIGlzIHRoZSBvbmUgd2Ugd2FudCB0aGVuCisJCQkJCQlyZXRWYWx1ZSA9IChTSUxhYmVsKSBkaXNlYXNlTW9kZWxMYWJlbDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfSAvLyBmb3IgZWFjaCBkaXNlYXNlIG1vZGVsIGxhYmVsIG9uIHRoaXMgbm9kZQorCisJCQkvLyBEaWQgd2UgZmluZCBhIGxhYmVsIGhlcmUgYWxyZWFkeT8KKwkJCWlmIChyZXRWYWx1ZSA9PSBudWxsKSB7CisJCQkJLy8gTm8KKwkJCQlmaW5hbCBFTGlzdCBjaGlsZHJlbnNMYWJlbHMgPSBnZXRDaGlsZHJlbnNMYWJlbHMobm9kZSk7CisKKwkJCQlmaW5hbCBQb3B1bGF0aW9uTW9kZWxMYWJlbCBwb3B1bGF0aW9uTGFiZWwgPSBnZXRPckNyZWF0ZVBvcHVsYXRpb25MYWJlbCgKKwkJCQkJCW5vZGUsIGdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkpOworCisJCQkJZmluYWwgRGlzZWFzZU1vZGVsTGFiZWwgZG1sID0gY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWwoKTsKKwkJCQlEaXNlYXNlTW9kZWxMYWJlbEltcGwubGFiZWxOb2RlKGRtbCwgcG9wdWxhdGlvbkxhYmVsLCBub2RlKTsKKwkJCQlnZXRMYWJlbHNUb1VwZGF0ZSgpLmFkZChkbWwpOworCisJCQkJZ2V0R3JhcGgoKS5wdXROb2RlTGFiZWwoZG1sKTsKKworCQkJCS8vIEluaXRpYWxpemUgdGhlIGRpc2Vhc2UgbW9kZWwgc3RhdGUgKGlmIGFueSkuIFRoZSBzdGF0ZSBob2xkcworCQkJCS8vIHZhbHVlcyB1c2VmdWwgZm9yIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgZGlzZWFzZSBtb2RlbAorCQkJCWZpbmFsIERpc2Vhc2VNb2RlbFN0YXRlIGRtcyA9IGNyZWF0ZURpc2Vhc2VNb2RlbFN0YXRlKCk7CisJCQkJZmluYWwgQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZSBhZG1zID0gKEFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUpIGRtczsKKwkJCQlhZG1zLmdldENoaWxkcmVuc0xhYmVscygpLmFkZEFsbChjaGlsZHJlbnNMYWJlbHMpOworCQkJCWRtbC5zZXREaXNlYXNlTW9kZWxTdGF0ZShhZG1zKTsKKworCQkJCXJldFZhbHVlID0gKFNJTGFiZWwpIGRtbDsKKwkJCX0KKwkJfSAvLyBpZiBub2RlIHRvIGRlY29yYXRlCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZGVjb3JhdGVHcmFwaAorCisJLyoqCisJICogQHBhcmFtIG5vZGUKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBhbGwgb2YgdGhlIHtAbGluayBEaXNlYXNlTW9kZWxMYWJlbH1zIHRoYXQgbGFiZWwgdGhlCisJICogICAgICAgICB7QGxpbmsgTm9kZX0KKwkgKi8KKwlwcml2YXRlIExpc3Q8RGlzZWFzZU1vZGVsTGFiZWw+IGdldERpc2Vhc2VMYWJlbHMoZmluYWwgTm9kZSBub2RlKSB7CisJCWZpbmFsIExpc3Q8RGlzZWFzZU1vZGVsTGFiZWw+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxEaXNlYXNlTW9kZWxMYWJlbD4oKTsKKwkJdHJ5IHsKKwkJCWZvciAoZmluYWwgSXRlcmF0b3I8Tm9kZUxhYmVsPiBsYWJlbEl0ZXIgPSBub2RlLmdldExhYmVscygpLml0ZXJhdG9yKCk7IGxhYmVsSXRlcgorCQkJCQkuaGFzTmV4dCgpOykgeworCQkJCWZpbmFsIExhYmVsIGxhYmVsID0gbGFiZWxJdGVyLm5leHQoKTsKKwkJCQkvLyBJcyB0aGlzIGEgZGlzZWFzZSBtb2RlbCBsYWJlbD8KKwkJCQlpZiAobGFiZWwgaW5zdGFuY2VvZiBEaXNlYXNlTW9kZWxMYWJlbCkgeworCQkJCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTW9kZWxMYWJlbCA9IChEaXNlYXNlTW9kZWxMYWJlbCkgbGFiZWw7CisJCQkJCXJldFZhbHVlLmFkZChkaXNlYXNlTW9kZWxMYWJlbCk7CisJCQkJfQorCQkJfQorCQl9IC8vIHRyeQorCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisJCQkvLyBXZSBnZXQgYSBOUEUgaWYgbm9kZSBpcyBudWxsCisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkludGVybmFsIGVycm9yIiwgbnBlKTsKKwkJfSAvLyBjYXRjaCBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXREaXNlYXNlTGFiZWxzCisKKwkvKioKKwkgKiBAcGFyYW0gbm9kZQorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSB7QGxpbmsgRGlzZWFzZU1vZGVsTGFiZWx9cyB0aGF0IGxhYmVsIHtAbGluayBOb2RlfXMKKwkgKiAgICAgICAgIHRoYXQgYXJlICJjaGlsZHJlbiIgb2YgcGFyYW1ldGVyIDxjb2RlPm5vZGU8L2NvZGU+CisJICovCisJcHJpdmF0ZSBFTGlzdCBnZXRDaGlsZHJlbnNMYWJlbHMoZmluYWwgTm9kZSBub2RlKSB7CisJCWZpbmFsIEVMaXN0IHJldFZhbHVlID0gbmV3IEJhc2ljRUxpc3QoKTsKKwkJLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSByZWN1cnNpdmVseQorCQlmb3IgKGZpbmFsIE5vZGUgY2hpbGROb2RlIDogZ2V0Q2hpbGROb2Rlcyhub2RlKSkgeworCQkJcmV0VmFsdWUuYWRkKGRlY29yYXRlR3JhcGgoY2hpbGROb2RlKSk7CisJCX0KKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0Q2hpbGRyZW5zTGFiZWxzCisKKwkvKioKKwkgKiBAcGFyYW0gbm9kZQorCSAqIEByZXR1cm4gdGhlIHtAbGluayBOb2RlfXMgdGhhdCBhcmUgY2hpbGRyZW4gb2YgdGhlIHBhcmFtZXRlcgorCSAqICAgICAgICAgPGNvZGU+bm9kZTwvY29kZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIExpc3Q8Tm9kZT4gZ2V0Q2hpbGROb2RlcyhmaW5hbCBOb2RlIG5vZGUpIHsKKwkJZmluYWwgTGlzdDxOb2RlPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPEVkZ2U+IGVkZ2VJdGVyID0gbm9kZS5nZXRFZGdlcygpLml0ZXJhdG9yKCk7IGVkZ2VJdGVyCisJCQkJLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIEVkZ2UgZWRnZSA9IGVkZ2VJdGVyLm5leHQoKTsKKwkJCS8vIElzIHRoaXMgYSBwaHlzaWNhbCBjb250YWlubWVudCBlZGdlIGRpcmVjdGVkIGZyb20gdXM/CisJCQlmaW5hbCBMYWJlbCBsYWJlbCA9IGVkZ2UuZ2V0TGFiZWwoKTsKKwkJCWlmIChsYWJlbCBpbnN0YW5jZW9mIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCkgeworCQkJCWZpbmFsIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCBycHJMYWJlbCA9IChSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwpIGxhYmVsOworCQkJCWlmICghZWRnZS5pc0RpcmVjdGVkQXQobm9kZSkKKwkJCQkJCSYmIHJwckxhYmVsLmdldEN1cnJlbnRSZWxhdGlvbnNoaXAoKS5nZXRSZWxhdGlvbnNoaXAoKSA9PSBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwLkNPTlRBSU5TX0xJVEVSQUwpIHsKKwkJCQkJLy8gWWVzCisJCQkJCS8vIEhhcyB0aGUgb3RoZXIgbm9kZSBiZWVuIHJlc29sdmVkPworCQkJCQlmaW5hbCBOb2RlIG90aGVyTm9kZSA9IGVkZ2UuZ2V0T3RoZXJOb2RlKG5vZGUpOworCQkJCQlpZiAob3RoZXJOb2RlICE9IG51bGwpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJcmV0VmFsdWUuYWRkKG90aGVyTm9kZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gLy8gZm9yIGVhY2ggZWRnZQorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldENoaWxkTm9kZXMKKworCS8qKgorCSAqIEBwYXJhbSBub2RlCisJICogQHBhcmFtIHBvcHVsYXRpb25JZGVudGlmaWVyCisJICogQHJldHVybiBhIHtAbGluayBQb3B1bGF0aW9uTGFiZWx9IHRoYXQgbGFiZWxzIHRoZSBwYXJhbWV0ZXIKKwkgKiAgICAgICAgIDxjb2RlPm5vZGU8L25vZGU+LCBlaXRoZXIgYnkgZmluZGluZyBpdCBsYWJlbGluZyB0aGUge0BsaW5rIE5vZGV9LCBvciBieSBjcmVhdGluZyBpdC4KKwkgKi8KKwlwcml2YXRlIFBvcHVsYXRpb25Nb2RlbExhYmVsIGdldE9yQ3JlYXRlUG9wdWxhdGlvbkxhYmVsKGZpbmFsIE5vZGUgbm9kZSwKKwkJCWZpbmFsIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllcikgeworCQlQb3B1bGF0aW9uTW9kZWxMYWJlbCByZXRWYWx1ZSA9IG51bGw7CisKKwkJLy8gVHJ5IHRvIGZpbmQgdGhlIHBvcHVsYXRpb24gbGFiZWwgaWYgaXQgZXhpc3RzCisJCWZvciAoZmluYWwgSXRlcmF0b3I8Tm9kZUxhYmVsPiBsYWJlbEl0ZXIgPSBub2RlLmdldExhYmVscygpLml0ZXJhdG9yKCk7IGxhYmVsSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBMYWJlbCBsYWJlbCA9IGxhYmVsSXRlci5uZXh0KCk7CisJCQkvLyBJcyBpdCB0aGUgcG9wdWxhdGlvbiBsYWJlbCB3ZSdyZSBsb29raW5nIGZvcj8KKwkJCWlmIChsYWJlbCBpbnN0YW5jZW9mIFBvcHVsYXRpb25Nb2RlbExhYmVsKSB7CisJCQkJZmluYWwgUG9wdWxhdGlvbk1vZGVsTGFiZWwgcG9wdWxhdGlvbkxhYmVsID0gKFBvcHVsYXRpb25Nb2RlbExhYmVsKSBsYWJlbDsKKwkJCQlpZiAocG9wdWxhdGlvbkxhYmVsLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkuZXF1YWxzKHBvcHVsYXRpb25JZGVudGlmaWVyKSkgeworCQkJCQkvLyBZZXMKKwkJCQkJcmV0VmFsdWUgPSBwb3B1bGF0aW9uTGFiZWw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSAvLyBmb3IgZWFjaCBsYWJlbAorCisJCS8vIERpZCB3ZSBmaW5kIHRoZSBwb3B1bGF0aW9uIExhYmVsPworCQlpZiAocmV0VmFsdWUgPT0gbnVsbCkgeworCQkJLy8gTm8KKwkJCS8vIE1ha2Ugb25lIHRoZW4uCisJCQlyZXRWYWx1ZSA9IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvcHVsYXRpb25Nb2RlbExhYmVsKCk7CisJCQlyZXRWYWx1ZS5zZXRVUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKG5vZGUuZ2V0VVJJKCkpOworCQkJLy8gV2UgZG9uJ3Qgc2V0IHRoZSBwb3B1bGF0aW9uIHZhbHVlCisJCQlub2RlLmdldExhYmVscygpLmFkZChyZXRWYWx1ZSk7CisJCQlVUklUb05vZGVNYXBFbnRyeUltcGwgZW50cnkgPSAoVVJJVG9Ob2RlTWFwRW50cnlJbXBsKSBub2RlCisJCQkJCS5lQ29udGFpbmVyKCk7CisJCQlHcmFwaCBncmFwaCA9IChHcmFwaCkgZW50cnkuZUNvbnRhaW5lcigpOworCQkJZ3JhcGgucHV0Tm9kZUxhYmVsKHJldFZhbHVlKTsKKwkJfQorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldE9yQ3JlYXRlUG9wdWxhdGlvbkxhYmVsCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkRGlzZWFzZU1vZGVsSW1wbCN1cGRhdGVMYWJlbHMob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lLAorCSAqICAgICAgbG9uZykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGVMYWJlbHMoZmluYWwgU1RFTVRpbWUgdGltZSwgZmluYWwgbG9uZyB0aW1lRGVsdGEsIGludCBjeWNsZSkgeworCQkvLyBUaGUgIm5leHQiIHZhbHVlcyBvZiB0aGUgZGlzZWFzZSBtb2RlbCBsYWJlbHMgb2YgdGhlIHVuZGVybHlpbmcgY2hpbGQKKwkJLy8gbm9kZXMgaGF2ZSBiZWVuIGNvbXB1dGVkIGJ5IHRoZSB0aW1lIHRoaXMgaXMgY2FsbGVkLiBBbmQsIHRoZSBsYWJlbAorCQkvLyB2YWx1ZXMgZm9yIHRoaXMgZGVjb3JhdG9yIGhhdmUgYmVlbiBvcmRlcmVkIHNvIHRoYXQgdGhlIHBhcmVudCBpcworCQkvLyBwcm9jZXNzZWQgYWZ0ZXIgaXRzIGNoaWxkcmVuLCB3aXRoIHRoZSByb290IGxhYmVsIGJlaW5nIGxhc3QuCisKKwkJLy8gRmlyc3Qgd2UgInJlc2V0IiB0aGUgbGFiZWxzIHNvIHRoZXkgYWxsIGhhdmUgemVybyB2YWx1ZXMuIFdlJ3JlIGdvaW5nCisJCS8vIHRvIGFjY3VtdWxhdGUgdGhlIHZhbHVlcyBvZiB0aGVpciBjaGlsZHJlbidzIG5leHQgdmFsdWVzIHNvIHdlIHdhbnQKKwkJLy8gdG8gc3RhcnQgdGhlIHN1bSBvZmYgZnJvbSB6ZXJvLgorCisJCXplcm9PdXRQb3B1bGF0aW9uQ291bnRzT25MYWJlbHMoKTsKKworCQkvLyBTZXQgdGhlIHByb2dyZXNzIG9mIHRoaXMgaXRlcmF0b3IgdG8gMAorCQl0aGlzLnNldFByb2dyZXNzKDAuMCk7CisJCS8vIE5vdyBnbyB0aHJvdWdoIGVhY2ggbGFiZWwgd2UgdXBkYXRlIGFuZCB1cGRhdGUgaXQgZnJvbSBhbGwgb2YgaXRzCisJCS8vIGNoaWxkcmVuCisJCWRvdWJsZSBudW1MYWJlbHMgPSBnZXRMYWJlbHNUb1VwZGF0ZSgpLnNpemUoKTsKKwkJZG91YmxlIG4gPSAwLjA7CisJCWZvciAoZmluYWwgSXRlcmF0b3I8RHluYW1pY0xhYmVsPiBsYWJlbEl0ZXIgPSBnZXRMYWJlbHNUb1VwZGF0ZSgpLml0ZXJhdG9yKCk7IGxhYmVsSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBTSUxhYmVsIHBhcmVudFNJTGFiZWwgPSAoU0lMYWJlbCkgbGFiZWxJdGVyLm5leHQoKTsKKwkJCWZpbmFsIEFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUgYWRtcyA9IChBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlKSBwYXJlbnRTSUxhYmVsCisJCQkJCS5nZXREaXNlYXNlTW9kZWxTdGF0ZSgpOworCQkJZm9yIChmaW5hbCBJdGVyYXRvciBjaGlsZERNTEl0ZXIgPSBhZG1zLmdldENoaWxkcmVuc0xhYmVscygpCisJCQkJCS5pdGVyYXRvcigpOyBjaGlsZERNTEl0ZXIuaGFzTmV4dCgpOykgeworCQkJCWZpbmFsIFNJTGFiZWwgY2hpbGRTSUxhYmVsID0gKFNJTGFiZWwpIGNoaWxkRE1MSXRlci5uZXh0KCk7CisJCQkJdXBkYXRlRnJvbUNoaWxkTGFiZWwocGFyZW50U0lMYWJlbCwgY2hpbGRTSUxhYmVsKTsKKwkJCX0gLy8gZm9yCisJCQlwYXJlbnRTSUxhYmVsLnNldE5leHRWYWx1ZVZhbGlkKHRydWUpOworCQkJdGhpcy5zZXRQcm9ncmVzcyhuL251bUxhYmVscyk7CisJCQluKz0xLjA7CisJCX0gLy8gZm9yIGVhY2ggZGlzZWFzZSBtb2RlbCBsYWJlbCB0byB1cGRhdGUKKworCQkvLyBOb3cgd2UgZm9yd2FyZCB0aGUgcG9wdWxhdGlvbiBtZW1iZXJzIHRoYXQgYXJlIGJlaW5nIHRyYW5zcG9ydGVkCisJCWZvcndhcmRUcmFuc3BvcnRhdGlvbih0aW1lKTsKKwkJLy8gRG9uZQorCQl0aGlzLnNldFByb2dyZXNzKDEuMCk7CisJfSAvLyB1cGRhdGVMYWJlbHMKKworCS8qKgorCSAqIEFjY3VtdWxhdGUgdGhlIHZhbHVlcyBmcm9tIHRoZSBjaGlsZCBsYWJlbCBpbiB0byB0aGUgbmV4dCB2YWx1ZSBvZiB0aGUKKwkgKiBwYXJlbnQgbGFiZWwKKwkgKiAKKwkgKiBAcGFyYW0gY2hpbGRMYWJlbAorCSAqLworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUZyb21DaGlsZExhYmVsKGZpbmFsIFNJTGFiZWwgcGFyZW50TGFiZWwsCisJCQlmaW5hbCBTSUxhYmVsIGNoaWxkTGFiZWwpIHsKKwkJZmluYWwgZG91YmxlIG5leHREaXNlYXNlRGVhdGhzID0gcGFyZW50TGFiZWwuZ2V0TmV4dERpc2Vhc2VEZWF0aHMoKTsKKworCQlwYXJlbnRMYWJlbC5zZXROZXh0RGlzZWFzZURlYXRocyhuZXh0RGlzZWFzZURlYXRocworCQkJCSsgY2hpbGRMYWJlbC5nZXROZXh0RGlzZWFzZURlYXRocygpKTsKKworCQlmaW5hbCBkb3VibGUgbmV4dFMgPSBwYXJlbnRMYWJlbC5nZXROZXh0UygpOworCQlmaW5hbCBkb3VibGUgbmV4dEkgPSBwYXJlbnRMYWJlbC5nZXROZXh0SSgpOworCisJCXBhcmVudExhYmVsLnNldE5leHRTKG5leHRTICsgY2hpbGRMYWJlbC5nZXROZXh0UygpKTsKKwkJcGFyZW50TGFiZWwuc2V0TmV4dEkobmV4dEkgKyBjaGlsZExhYmVsLmdldE5leHRJKCkpOworCisJfSAvLyB1cGRhdGVGcm9tQ2hpbGRMYWJlbAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSUltcGwjY29tcHV0ZURlcGFydHVyZXMoZG91YmxlLAorCSAqICAgICAgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGNvbXB1dGVEZXBhcnR1cmVzKAorCQkJZmluYWwgZG91YmxlIGZyYWN0aW9uVG9EZXBhcnQsCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgbmV4dFN0YXRlKSB7CisJCXJldHVybiBzdXBlci5jb21wdXRlRGVwYXJ0dXJlcyhmcmFjdGlvblRvRGVwYXJ0LCBuZXh0U3RhdGUpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lJbXBsI2NyZWF0ZURpc2Vhc2VNb2RlbFN0YXRlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRGlzZWFzZU1vZGVsU3RhdGUgY3JlYXRlRGlzZWFzZU1vZGVsU3RhdGUoKSB7CisJCXJldHVybiBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUoKTsKKwl9IC8vIGNyZWF0ZURpc2Vhc2VNb2RlbFN0YXRlCisKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmREaXNlYXNlTW9kZWxJbXBsI2luaXRpYWxpemVEaXNlYXNlU3RhdGUob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEaXNlYXNlU3RhdGUoZmluYWwgRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZU1vZGVsTGFiZWwpIHsKKwkJLy8gc3VwZXIuaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZShkaXNlYXNlTW9kZWxMYWJlbCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZERpc2Vhc2VNb2RlbEltcGwjaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZShvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsU3RhdGUsCisJICogICAgICBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWwpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIERpc2Vhc2VNb2RlbFN0YXRlIGluaXRpYWxpemVEaXNlYXNlU3RhdGUoCisJCQlmaW5hbCBEaXNlYXNlTW9kZWxTdGF0ZSBkaXNlYXNlTW9kZWxTdGF0ZSwKKwkJCWZpbmFsIERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VNb2RlbExhYmVsKSB7CisKKwkJcmV0dXJuIGRpc2Vhc2VNb2RlbFN0YXRlOworCX0gLy8gaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZQorCisJCisKKwkvKioKKwkgKiBPbmUgb2YgdGhlIGpvYnMgb2YgdGhlIGFnZ3JlZ2F0aW5nIGRpc2Vhc2UgbW9kZWwgaXMgdG8gYWxzbyBmb3J3YXJkCisJICogcG9wdWxhdGlvbiBtZW1iZXJzIGFsb25nIHRoZSB0cmFuc3BvcnRhdGlvbiBuZXR3b3JrLgorCSAqIAorCSAqIEBwYXJhbSB0aW1lCisJICovCisJcHJvdGVjdGVkIHZvaWQgZm9yd2FyZFRyYW5zcG9ydGF0aW9uKGZpbmFsIFNURU1UaW1lIHRpbWUpIHsKKwkJLy8gR28gdGhyb3VnaCBlYWNoIGxhYmVsIHRoYXQgbmVlZHMgdG8gYmUgdXBkYXRlZCBhbmQgYWNjdW11bGF0ZSB0aGUKKwkJLy8gYXJyaXZhbHMgZnJvbSB0aGVpciBjaGlsZHJlbiwgdGhlbiBwYXNzIHRob3NlIGFsb25nIHRvIHRoZSBub2RlJ3MKKwkJLy8gcGFyZW50IGFuZCBwZWVycyAoaWYgYW55KS4KKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxEeW5hbWljTGFiZWw+IGxhYmVsSXRlciA9IGdldExhYmVsc1RvVXBkYXRlKCkuaXRlcmF0b3IoKTsgbGFiZWxJdGVyCisJCQkJLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIFNJTGFiZWwgc2lMYWJlbCA9IChTSUxhYmVsKSBsYWJlbEl0ZXIubmV4dCgpOworCQkJZmluYWwgQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZUltcGwgYWRtcyA9IChBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlSW1wbCkgc2lMYWJlbAorCQkJCQkuZ2V0RGlzZWFzZU1vZGVsU3RhdGUoKTsKKwkJCWZpbmFsIE5vZGUgbm9kZSA9IHNpTGFiZWwuZ2V0Tm9kZSgpOworCisJCQlib29sZWFuIGlzUm9vdE5vZGUgPSAhbGFiZWxJdGVyLmhhc05leHQoKTsKKwkJCS8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIG9mIHRoZSB0cmFuc3BvcnRhdGlvbiBtb2RlcyB0aGF0CisJCQkvLyBzZW5kL3JlY2VpdmUgcG9wdWxhdGlvbiBtZW1iZXJzIGZyb20gdGhlIG5vZGUuCisJCQlmb3IgKGZpbmFsIFRyYW5zcG9ydE1vZGUgdHJhbnNwb3J0YXRpb25Nb2RlIDogYWRtcworCQkJCQkuZ2V0VHJhbnNwb3J0TW9kZXMoKSkgeworCQkJCS8vIEdldCBhbGwgb2YgdGhlIGFycml2YWxzIGF0IHRoaXMgbm9kZSBmcm9tIHRoZSBraWRzIGZvcgorCQkJCS8vIHRoZSBjdXJyZW50IHRyYW5zcG9ydGF0aW9uIG1vZGUKKwkJCQlmaW5hbCBTSUxhYmVsVmFsdWUga2lkQXJyaXZhbHMgPSBnZXRBcnJpdmFsc0Zyb21LaWRzKG5vZGUsCisJCQkJCQlhZG1zLCB0cmFuc3BvcnRhdGlvbk1vZGUsIHRpbWUpOworCQkJCS8vIElzIHRoaXMgdGhlIHJvb3Q/CisJCQkJaWYgKCFpc1Jvb3ROb2RlKSB7CisJCQkJCS8vIE5vCisJCQkJCS8vIE5vdyBzZW5kIHdoYXQgd2UgZ290IGZyb20gdGhlIGtpZHMgYWxvbmcgdG8gb3VyIHBhcmVudAorCQkJCQkvLyBhbmQgb3VyIHBlZXJzCisJCQkJCS8vIEFueXRoaW5nIHRvIHNlbmQ/CisJCQkJCWlmIChraWRBcnJpdmFscy5nZXRQb3B1bGF0aW9uQ291bnQoKSA+IDAuMCkgeworCQkJCQkJLy8gWWVzCisJCQkJCQlzZW5kRGVwYXJ0dXJlc1RvUGFyZW50QW5kUGVlcnMoa2lkQXJyaXZhbHMsIG5vZGUsIGFkbXMsCisJCQkJCQkJCXRyYW5zcG9ydGF0aW9uTW9kZSwgdGltZSk7CisJCQkJCX0gLy8gaWYgQW55dGhpbmcgdG8gc2VuZD8KKwkJCQl9IC8vIGlmIHJvb3QKKwkJCQllbHNlIHsKKwkJCQkJLy8gWWVzCisJCQkJCS8vIFRoaXMgaXMgdGhlIHJvb3QsIG5vIHBhcmVudCwgbm8gcGVlcnMsIHRpbWUgdG8KKwkJCQkJLy8gcmVkaXN0cmlidXRlIHdoYXQgdGhlIGtpZHMgaGF2ZSBiZWVuIHNlbmRpbmcgb3V0LgorCQkJCQkvLyBTZW5kIHdoYXQgd2UgZ290IGZyb20gdGhlIGtpZHMsIGJhY2sgdG8gdGhlIGtpZHMKKwkJCQkJLy8gQW55dGhpbmcgdG8gc2VuZD8KKwkJCQkJaWYgKGtpZEFycml2YWxzLmdldFBvcHVsYXRpb25Db3VudCgpID4gMC4wKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXNlbmREZXBhcnR1cmVzVG9LaWRzKGtpZEFycml2YWxzLCBub2RlLCBhZG1zLAorCQkJCQkJCQl0cmFuc3BvcnRhdGlvbk1vZGUsIHRpbWUpOworCQkJCQl9IC8vIGlmIEFueXRoaW5nIHRvIHNlbmQ/CisJCQkJfSAvLyBlbHNlIHJvb3QKKwkJCX0gLy8gZm9yIGVhY2ggdHJhbnNwb3J0IG1vZGUKKwkJfSAvLyBmb3IgZWFjaCBsYWJlbCB0byB1cGRhdGUKKworCQkvLyBOb3cgd2Ugd2FudCB0byB3b3JrIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSBsaXN0IG9mIGxhYmVscyB0bworCQkvLyB1cGRhdGUgdG8gcHJvcGFnYXRlIHRoZSBwb3B1bGF0aW9uIG1lbWJlcnMgZG93biB0aHJvdWdoIHRoZSB0cmVlCisJCS8vIHRvIHRoZWlyIHVsdGltYXRlIGRlc3RpbmF0aW9ucyBpbiB0aGUgbGVhZiBOb2Rlcy4KKwkJYm9vbGVhbiBmaXJzdE9uZSA9IHRydWU7CisJCWZvciAoZmluYWwgSXRlcmF0b3IgcmV2ZXJzZUxhYmVsc1RvVXBkYXRlSXRlciA9IGdldFJldmVyc2VMYWJlbHNUb1VwZGF0ZSgpCisJCQkJLml0ZXJhdG9yKCk7IHJldmVyc2VMYWJlbHNUb1VwZGF0ZUl0ZXIuaGFzTmV4dCgpOykgeworCQkJZmluYWwgU0lMYWJlbCByZXZlcnNlU0lMYWJlbCA9IChTSUxhYmVsKSByZXZlcnNlTGFiZWxzVG9VcGRhdGVJdGVyCisJCQkJCS5uZXh0KCk7CisJCQlmaW5hbCBBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlSW1wbCByZXZhZG1zID0gKEFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGVJbXBsKSByZXZlcnNlU0lMYWJlbAorCQkJCQkuZ2V0RGlzZWFzZU1vZGVsU3RhdGUoKTsKKwkJCWZpbmFsIE5vZGUgbm9kZSA9IHJldmVyc2VTSUxhYmVsLmdldE5vZGUoKTsKKworCQkJLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggb2YgdGhlIHRyYW5zcG9ydGF0aW9uIG1vZGVzIHRoYXQKKwkJCS8vIHNlbmQvcmVjZWl2ZSBwb3B1bGF0aW9uIG1lbWJlcnMgZnJvbSB0aGUgbm9kZS4KKwkJCWZvciAoZmluYWwgVHJhbnNwb3J0TW9kZSB0cmFuc3BvcnRhdGlvbk1vZGUgOiByZXZhZG1zCisJCQkJCS5nZXRUcmFuc3BvcnRNb2RlcygpKSB7CisJCQkJLy8gSXMgdGhpcyB0aGUgcm9vdD8KKwkJCQlpZiAoIWZpcnN0T25lKSB7CisJCQkJCS8vIE5vCisJCQkJCWZpbmFsIFNJTGFiZWxWYWx1ZSBwYXJlbnRQZWVyQXJyaXZhbHMgPSBnZXRBcnJpdmFsc0Zyb21QYXJlbnRQZWVycygKKwkJCQkJCQlub2RlLCByZXZhZG1zLCB0cmFuc3BvcnRhdGlvbk1vZGUsIHRpbWUpOworCQkJCQkvLyBOb3cgc2VuZCB3aGF0IHdlIGdvdCBmcm9tIG91ciBwYXJlbnQgb3Igb3VyIHBlZXJzCisJCQkJCS8vIGFsb25nIHRvIG91ciBjaGlsZHJlbgorCQkJCQkvLyBBbnl0aGluZyB0byBzZW5kPworCQkJCQlpZiAocGFyZW50UGVlckFycml2YWxzLmdldFBvcHVsYXRpb25Db3VudCgpID4gMC4wKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXNlbmREZXBhcnR1cmVzVG9LaWRzKHBhcmVudFBlZXJBcnJpdmFscywgbm9kZSwgcmV2YWRtcywKKwkJCQkJCQkJdHJhbnNwb3J0YXRpb25Nb2RlLCB0aW1lKTsKKwkJCQkJfSAvLyBpZiBBbnl0aGluZyB0byBzZW5kPworCisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gWWVzCisJCQkJCS8vIFdlIHNraXAgb3ZlciB0aGUgcm9vdCBiZWNhdXNlIHdlIGFscmVhZHkgcHJvY2Vzc2VkIGl0CisJCQkJCS8vIGF0IHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIGZvciBsb29wLgorCQkJCQlmaXJzdE9uZSA9IGZhbHNlOworCQkJCX0gLy8gZWxzZQorCQkJfSAvLyBmb3IgZWFjaCB0cmFuc3BvcnQgbW9kZQorCQl9IC8vIGZvciBlYWNoIGxhYmVsIHRvIHVwZGF0ZSBpbiByZXZlcnNlIG9yZGVyCisJfS8vIGZvcndhcmRUcmFuc3BvcnRhdGlvbgorCisJLyoqCisJICogQHBhcmFtIG5vZGUKKwkgKiBAcGFyYW0gYWRtcworCSAqIEBwYXJhbSB0cmFuc3BvcnRhdGlvbk1vZGUKKwkgKiBAcGFyYW0gdGltZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgU0lMYWJlbFZhbHVlIGdldEFycml2YWxzRnJvbUtpZHMoZmluYWwgTm9kZSBub2RlLAorCQkJZmluYWwgQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZUltcGwgYWRtcywKKwkJCWZpbmFsIFRyYW5zcG9ydE1vZGUgdHJhbnNwb3J0YXRpb25Nb2RlLCBmaW5hbCBTVEVNVGltZSB0aW1lKSB7CisJCXJldHVybiByZWNlaXZlRnJvbUVkZ2VzKG5vZGUsIGFkbXMuZ2V0Q2hpbGRUcmFuc3BvcnRFZGdlcygpLmdldCgKKwkJCQl0cmFuc3BvcnRhdGlvbk1vZGUpLCB0aW1lKTsKKwl9IC8vIGdldEFycml2YWxzRnJvbUtpZHMKKworCS8qKgorCSAqIEBwYXJhbSBwYXJlbnRQZWVyQXJyaXZhbHMKKwkgKiBAcGFyYW0gbm9kZQorCSAqIEBwYXJhbSBhZG1zCisJICogQHBhcmFtIHRyYW5zcG9ydGF0aW9uTW9kZQorCSAqIEBwYXJhbSB0aW1lCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VuZERlcGFydHVyZXNUb0tpZHMoZmluYWwgU0lMYWJlbFZhbHVlIHBhcmVudFBlZXJBcnJpdmFscywKKwkJCWZpbmFsIE5vZGUgbm9kZSwgZmluYWwgQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZUltcGwgYWRtcywKKwkJCWZpbmFsIFRyYW5zcG9ydE1vZGUgdHJhbnNwb3J0YXRpb25Nb2RlLCBmaW5hbCBTVEVNVGltZSB0aW1lKSB7CisJCXNlbmRUb0VkZ2VzKG5vZGUsIHBhcmVudFBlZXJBcnJpdmFscywgYWRtcy5nZXRDaGlsZFRyYW5zcG9ydEVkZ2VzKCkKKwkJCQkuZ2V0KHRyYW5zcG9ydGF0aW9uTW9kZSksIHRpbWUpOworCX0gLy8gc2VuZERlcGFydHVyZXNUb0tpZHMKKworCS8qKgorCSAqIEBwYXJhbSBub2RlCisJICogQHBhcmFtIHJldmFkbXMKKwkgKiBAcGFyYW0gdHJhbnNwb3J0YXRpb25Nb2RlCisJICogQHBhcmFtIHRpbWUKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIFNJTGFiZWxWYWx1ZSBnZXRBcnJpdmFsc0Zyb21QYXJlbnRQZWVycyhmaW5hbCBOb2RlIG5vZGUsCisJCQlmaW5hbCBBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlSW1wbCBhZG1zLAorCQkJZmluYWwgVHJhbnNwb3J0TW9kZSB0cmFuc3BvcnRhdGlvbk1vZGUsIGZpbmFsIFNURU1UaW1lIHRpbWUpIHsKKwkJcmV0dXJuIHJlY2VpdmVGcm9tRWRnZXMobm9kZSwgYWRtcy5nZXRQYXJlbnRQZWVyVHJhbnNwb3J0RWRnZXMoKS5nZXQoCisJCQkJdHJhbnNwb3J0YXRpb25Nb2RlKSwgdGltZSk7CisJfSAvLyBnZXRBcnJpdmFsc0Zyb21QYXJlbnRQZWVycworCisJLyoqCisJICogQHBhcmFtIGtpZEFycml2YWxzCisJICogQHBhcmFtIG5vZGUKKwkgKiBAcGFyYW0gYWRtcworCSAqIEBwYXJhbSB0cmFuc3BvcnRhdGlvbk1vZGUKKwkgKiBAcGFyYW0gdGltZQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlbmREZXBhcnR1cmVzVG9QYXJlbnRBbmRQZWVycygKKwkJCWZpbmFsIFNJTGFiZWxWYWx1ZSBraWRBcnJpdmFscywgZmluYWwgTm9kZSBub2RlLAorCQkJZmluYWwgQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZUltcGwgYWRtcywKKwkJCWZpbmFsIFRyYW5zcG9ydE1vZGUgdHJhbnNwb3J0YXRpb25Nb2RlLCBmaW5hbCBTVEVNVGltZSB0aW1lKSB7CisJCXNlbmRUb0VkZ2VzKG5vZGUsIGtpZEFycml2YWxzLCBhZG1zLmdldFBhcmVudFBlZXJUcmFuc3BvcnRFZGdlcygpLmdldCgKKwkJCQl0cmFuc3BvcnRhdGlvbk1vZGUpLCB0aW1lKTsKKwl9IC8vIHNlbmREZXBhcnR1cmVzVG9QYXJlbnRBbmRQZWVycworCisJLyoqCisJICogQHBhcmFtIG5vZGUKKwkgKiBAcGFyYW0gdHJhbnNwb3J0RWRnZXMKKwkgKiBAcGFyYW0gdGltZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIFNJTGFiZWxWYWx1ZSByZWNlaXZlRnJvbUVkZ2VzKGZpbmFsIE5vZGUgbm9kZSwKKwkJCWZpbmFsIExpc3Q8RWRnZT4gdHJhbnNwb3J0RWRnZXMsIGZpbmFsIFNURU1UaW1lIHRpbWUpIHsKKwkJZmluYWwgU0lMYWJlbFZhbHVlIHJldFZhbHVlID0gKFNJTGFiZWxWYWx1ZSkgY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpOworCisJCS8vIEFueSBlZGdlcyBmb3IgdGhpcyB0cmFuc3BvcnRhdGlvbiBtb2RlPworCQlpZiAodHJhbnNwb3J0RWRnZXMgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlmb3IgKGZpbmFsIEVkZ2UgZWRnZSA6IHRyYW5zcG9ydEVkZ2VzKSB7CisJCQkJZmluYWwgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwgdHJsID0gKFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKSBlZGdlCisJCQkJCQkuZ2V0TGFiZWwoKTsKKwkJCQlmaW5hbCBFTGlzdCBhcnJpdmFscyA9IHRybC5yZWNlaXZlKG5vZGUsIHRpbWUpOworCQkJCWZvciAoZmluYWwgSXRlcmF0b3IgYXJyaXZhbEl0ZXIgPSBhcnJpdmFscy5pdGVyYXRvcigpOyBhcnJpdmFsSXRlcgorCQkJCQkJLmhhc05leHQoKTspIHsKKwkJCQkJZmluYWwgU0lMYWJlbFZhbHVlIGFycml2YWxTSUxhYmVsVmFsdWUgPSAoU0lMYWJlbFZhbHVlKSBhcnJpdmFsSXRlcgorCQkJCQkJCS5uZXh0KCk7CisJCQkJCXJldFZhbHVlLmFkZChhcnJpdmFsU0lMYWJlbFZhbHVlKTsKKwkJCQl9IC8vIGZvciBlYWNoIGFycml2YWwKKwkJCX0gLy8gZm9yIGVhY2ggZWRnZQorCQl9IC8vIGlmIHRyYW5zcG9ydCBlZGdlcworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHJlY2VpdmVGcm9tRWRnZXMKKworCS8qKgorCSAqIEBwYXJhbSBub2RlCisJICogQHBhcmFtIGFycml2YWxzCisJICogQHBhcmFtIHRyYW5zcG9ydEVkZ2VzCisJICogQHBhcmFtIHRpbWUKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSB2b2lkIHNlbmRUb0VkZ2VzKGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgU0lMYWJlbFZhbHVlIGFycml2YWxzLAorCQkJZmluYWwgTGlzdDxFZGdlPiB0cmFuc3BvcnRFZGdlcywgZmluYWwgU1RFTVRpbWUgdGltZSkgeworCQkvLyBBbnkgZWRnZXMgZm9yIHRoaXMgdHJhbnNwb3J0YXRpb24gbW9kZT8KKwkJaWYgKHRyYW5zcG9ydEVkZ2VzICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJLy8gU3VtIHVwIHRoZSB0b3RhbCBjYXBhY2l0eS4gVGhpcyBjYW4gY2hhbmdlIGlmIHRyYW5zcG9ydGF0aW9uCisJCQkvLyBsaW5rcyBhcmUgY2xvc2VkIG9yIG9wZW5lZCBkdXJpbmcgdGhlIHNpbXVsYXRpb24KKwkJCWRvdWJsZSB0b3RhbENhcGFjaXR5ID0gMDsKKwkJCWZvciAoZmluYWwgRWRnZSBlZGdlIDogdHJhbnNwb3J0RWRnZXMpIHsKKwkJCQlmaW5hbCBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCB0cmwgPSAoVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwpIGVkZ2UKKwkJCQkJCS5nZXRMYWJlbCgpOworCQkJCXRvdGFsQ2FwYWNpdHkgKz0gdHJsLmdldERlcGFydHVyZUNhcGFjaXR5KCk7CisJCQl9IC8vIGZvciBlYWNoIGVkZ2UKKworCQkJLy8gV2FzIHRoZXJlIGFueSBjYXBhY2l0eT8KKwkJCWlmICh0b3RhbENhcGFjaXR5ID4gMC4wKSB7CisJCQkJLy8gWWVzCisJCQkJLy8gTm93IHNlbmQgdGhlIHJpZ2h0IHByb3BvcnRpb24gYWxvbmcgZWFjaCBlZGdlCisJCQkJZm9yIChmaW5hbCBFZGdlIGVkZ2UgOiB0cmFuc3BvcnRFZGdlcykgeworCQkJCQlmaW5hbCBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCB0cmwgPSAoVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwpIGVkZ2UKKwkJCQkJCQkuZ2V0TGFiZWwoKTsKKwkJCQkJZmluYWwgZG91YmxlIHByb3BvcnRpb24gPSB0cmwuZ2V0RGVwYXJ0dXJlQ2FwYWNpdHkoKQorCQkJCQkJCS8gdG90YWxDYXBhY2l0eTsKKwkJCQkJZmluYWwgU0lMYWJlbFZhbHVlIGRlcGFydGVlcyA9IChTSUxhYmVsVmFsdWUpIGNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKTsKKwkJCQkJZGVwYXJ0ZWVzLmFkZChhcnJpdmFscykuc2NhbGUocHJvcG9ydGlvbik7CisJCQkJCXRybC5zZW5kKG5vZGUsIGRlcGFydGVlcyk7CisJCQkJfSAvLyBmb3IgZWFjaCBlZGdlCisJCQl9IC8vIGNhcGFjaXR5CisJCX0gLy8gaWYgdHJhbnNwb3J0IGVkZ2VzCisJfSAvLyBzZW5kVG9FZGdlcworCisJLyoqCisJICogQHJldHVybiB0aGUgbGFiZWxzIHRvIHVwZGF0ZSBpbiByZXZlcnNlIG9yZGVyCisJICovCisJcHJpdmF0ZSBCYXNpY0VMaXN0IGdldFJldmVyc2VMYWJlbHNUb1VwZGF0ZSgpIHsKKwkJLy8gRG8gd2UgaGF2ZSB0aGUgcmV2ZXJzZSBsaXN0PworCQlpZiAocmV2ZXJzZUxhYmVsc1RvVXBkYXRlID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQkvLyBSZXZlcnNlIHRoZSBsaXN0CisJCQkvLyBUaGVyZSBtdXN0IGJlIGEgdXRpbGl0eSB0byBkbyB0aGlzIGJldHRlci4KKwkJCWZpbmFsIEVMaXN0PER5bmFtaWNMYWJlbD4gZm9yd2FyZExpc3QgPSBnZXRMYWJlbHNUb1VwZGF0ZSgpOworCQkJZmluYWwgaW50IG51bUxhYmVscyA9IGZvcndhcmRMaXN0LnNpemUoKTsKKworCQkJcmV2ZXJzZUxhYmVsc1RvVXBkYXRlID0gbmV3IEJhc2ljRUxpc3QoKTsKKwkJCWZvciAoaW50IGkgPSBudW1MYWJlbHMgLSAxOyBpID49IDA7IGktLSkgeworCQkJCXJldmVyc2VMYWJlbHNUb1VwZGF0ZS5hZGQoZm9yd2FyZExpc3QuZ2V0KGkpKTsKKwkJCX0gLy8gZm9yCisJCX0gLy8gaWYgd2UgaGF2ZSB0aGUgcmV2ZXJzZSBsaXN0CisKKwkJcmV0dXJuIHJldmVyc2VMYWJlbHNUb1VwZGF0ZTsKKwl9IC8vIGdldFJldmVyc2VMYWJlbHNUb1VwZGF0ZQorCisJLyoqCisJICogTWFrZSBhbGwgdGhlIHBvcHVsYXRpb24gdmFsdWVzIGJlIHplcm8gZm9yIGFsbCBvZiB0aGUgbGFiZWxzIHdlIHVwZGF0ZS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgemVyb091dFBvcHVsYXRpb25Db3VudHNPbkxhYmVscygpIHsKKwkJLy8gVGhlIHJlc2V0IGNhbGwgYWJvdmUgc2V0cyB0aGUgc3VzY2VwdGlibGUgcG9wdWxhdGlvbiB0byB0aGUKKwkJLy8gcG9wdWxhdGlvbiBvZiB0aGUgbm9kZSBiZWluZyBsYWJlbGVkLiBNYWtlIHN1cmUgd2UgemVybyB0aGF0IG91dCB0b28uCisJCWZvciAoZmluYWwgSXRlcmF0b3I8RHluYW1pY0xhYmVsPiBsYWJlbEl0ZXIgPSBnZXRMYWJlbHNUb1VwZGF0ZSgpLml0ZXJhdG9yKCk7IGxhYmVsSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBTSUxhYmVsIHNpTGFiZWwgPSAoU0lMYWJlbCkgbGFiZWxJdGVyLm5leHQoKTsKKwkJCSgoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKSBzaUxhYmVsLmdldEN1cnJlbnRWYWx1ZSgpKS56ZXJvT3V0UG9wdWxhdGlvbkNvdW50KCk7CisJCQkoKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSkgc2lMYWJlbC5nZXROZXh0VmFsdWUoKSkuemVyb091dFBvcHVsYXRpb25Db3VudCgpOworCQl9IC8vIGZvciBlYWNoIHBvcHVsYXRpb24gbGFiZWwKKwl9IC8vIHplcm9PdXRQb3B1bGF0aW9uQ291bnRzT25MYWJlbHMKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlc2V0TGFiZWxzKCkgeworCQlzdXBlci5yZXNldExhYmVscygpOworCQkvLyBUaGUgcmVzZXQgY2FsbCBhYm92ZSBzZXRzIHRoZSBzdXNjZXB0aWJsZSBwb3B1bGF0aW9uIHRvIHRoZQorCQkvLyBwb3B1bGF0aW9uIG9mIHRoZSBub2RlIGJlaW5nIGxhYmVsZWQuIE1ha2Ugc3VyZSB3ZSB6ZXJvIHRoYXQgb3V0IHRvby4KKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxEeW5hbWljTGFiZWw+IGxhYmVsSXRlciA9IGdldExhYmVsc1RvVXBkYXRlKCkuaXRlcmF0b3IoKTsgbGFiZWxJdGVyCisJCQkJLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIFNJTGFiZWwgc2lMYWJlbCA9IChTSUxhYmVsKSBsYWJlbEl0ZXIubmV4dCgpOworCQkJc2lMYWJlbC5zZXRTKDApOworCQkJc2lMYWJlbC5zZXROZXh0UygwKTsKKwkJfSAvLyBmb3IKKwl9IC8vIHJlc2V0TGFiZWxzCisKKwlwdWJsaWMgdm9pZCBkb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyhMYWJlbFZhbHVlIGxhYmVsKSB7CisJCS8vIE5vdGhpbmcKKwl9CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSUltcGwjdG9TdHJpbmcoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBzdXBlci50b1N0cmluZygpOworCX0gLy8gdG9TdHJpbmcKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lJbXBsI3NhbmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCXJldHVybiB0cnVlOworCX0gLy8gc2FuZQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNEZXRlcm1pbmlzdGljKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9IC8vIEFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL0FnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9BZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTU1OWQzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9BZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbEltcGwuamF2YQpAQCAtMCwwICsxLDczIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWdncmVnYXRpbmcgU0lSIERpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbEltcGwgZXh0ZW5kcyBBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsSW1wbCBpbXBsZW1lbnRzIEFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLkFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbCBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbCgpIHsKKwkJcmV0dXJuIFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0lSTGFiZWwoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCkgeworCQlyZXR1cm4gU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTSVJMYWJlbFZhbHVlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlRnJvbUNoaWxkTGFiZWwoU0lMYWJlbCBwYXJlbnRMYWJlbCwgU0lMYWJlbCBjaGlsZExhYmVsKSB7CisJCXN1cGVyLnVwZGF0ZUZyb21DaGlsZExhYmVsKHBhcmVudExhYmVsLCBjaGlsZExhYmVsKTsKKwkJCisJCWZpbmFsIFNJUkxhYmVsIHNpclBhcmVudExhYmVsID0gKFNJUkxhYmVsKXBhcmVudExhYmVsOworCQlmaW5hbCBTSVJMYWJlbCBzaXJDaGlsZExhYmVsID0gKFNJUkxhYmVsKWNoaWxkTGFiZWw7CisJCQorCQlmaW5hbCBkb3VibGUgbmV4dFIgPSBzaXJQYXJlbnRMYWJlbC5nZXROZXh0UigpOworCQlzaXJQYXJlbnRMYWJlbC5zZXROZXh0UihuZXh0UiArIHNpckNoaWxkTGFiZWwuZ2V0TmV4dFIoKSk7CisJfSAvLyB1cGRhdGVGcm9tQ2hpbGRMYWJlbAorCQorfSAvLyBBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL0RldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9EZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjE5YjU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9EZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbEltcGwuamF2YQpAQCAtMCwwICsxLDk2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGV0ZXJtaW5pc3RpYyBTRUlSIERpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbEltcGwgZXh0ZW5kcyBTRUlSSW1wbCBpbXBsZW1lbnRzCisJCURldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIFRoZSBjb25zdHJ1Y3RvciBuZWVkcyB0byBiZSBwdWJsaWMgc28gdGhhdCB0aGUgbmV3IGRpc2Vhc2Ugd2l6YXJkIGNhbgorCSAqIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgd2l0aG91dCB1c2luZyB0aGUgZmFjdG9yeS4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJfSAvLyBEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbEltcGwKKworCS8qKgorCSAqIEBwYXJhbSBkaXNlYXNlTW9kZWxOYW1lCisJICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZGlzZWFzZSBtb2RlbAorCSAqIEBwYXJhbSBiYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZQorCSAqIEBwYXJhbSBpbmZlY3Rpb3VzTW9ydGFsaXR5CisJICogQHBhcmFtIHRyYW5zbWlzc2lvblJhdGUKKwkgKiBAcGFyYW0gcmVjb3ZlcnlSYXRlCisJICogQHBhcmFtIGltbXVuaXR5TG9zc1JhdGUKKwkgKiBAcGFyYW0gaW5jdWJhdGlvblJhdGUKKwkgKiBAcGFyYW0gbm9uTGluZWFyaXR5Q29lZmZpY2llbnQKKwkgKiBAcGFyYW0gdGltZVBlcmlvZAorCSAqICAgICAgICAgICAgdGhlIHRpbWUgcGVyaW9kIGZvciB0aGUgcmF0ZXMgKG1pbGxpc2Vjb25kcykKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbklkZW50aWZpZXIKKwkgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwb3B1bGF0aW9uIGFmZmVjdGVkIGJ5IHRoZSBkaXNlYXNlCisJICogQHJldHVybiBhbiBpbml0aWFsaXplZCBpbnN0YW5jZSBvZiBEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwgY3JlYXRlRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwoCisJCQlmaW5hbCBTdHJpbmcgZGlzZWFzZU1vZGVsTmFtZSwKKwkJCWZpbmFsIGRvdWJsZSBiYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSwKKwkJCWZpbmFsIGRvdWJsZSBpbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSwKKwkJCWZpbmFsIGRvdWJsZSB0cmFuc21pc3Npb25SYXRlLCBmaW5hbCBkb3VibGUgcmVjb3ZlcnlSYXRlLAorCQkJZmluYWwgZG91YmxlIGltbXVuaXR5TG9zc1JhdGUsIGZpbmFsIGRvdWJsZSBpbmN1YmF0aW9uUmF0ZSwKKwkJCWZpbmFsIGRvdWJsZSBub25MaW5lYXJpdHlDb2VmZmljaWVudCwgZmluYWwgbG9uZyB0aW1lUGVyaW9kLAorCQkJZmluYWwgU3RyaW5nIHBvcHVsYXRpb25JZGVudGlmaWVyKSB7CisJCWZpbmFsIERldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsIHNlaXJEaXNlYXNlTW9kZWwgPSBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZURldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsKCk7CisJCWluaXRpYWxpemVTRUlSRGlzZWFzZU1vZGVsKHNlaXJEaXNlYXNlTW9kZWwsIGRpc2Vhc2VNb2RlbE5hbWUsCisJCQkJYmFja2dyb3VuZE1vcnRhbGl0eVJhdGUsCisJCQkJaW5mZWN0aW91c01vcnRhbGl0eVJhdGUsIHRyYW5zbWlzc2lvblJhdGUsIHJlY292ZXJ5UmF0ZSwKKwkJCQlpbW11bml0eUxvc3NSYXRlLCBpbmN1YmF0aW9uUmF0ZSwgbm9uTGluZWFyaXR5Q29lZmZpY2llbnQsCisJCQkJdGltZVBlcmlvZCwgcG9wdWxhdGlvbklkZW50aWZpZXIpOworCQlyZXR1cm4gc2VpckRpc2Vhc2VNb2RlbDsKKwl9IC8vIGNyZWF0ZURldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsCisKKwlwdWJsaWMgdm9pZCBkb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyhMYWJlbFZhbHVlIGxhYmVsKSB7CisJCS8vIE5vdGhpbmcKKwl9CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLkRFVEVSTUlOSVNUSUNfU0VJUl9ESVNFQVNFX01PREVMOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRGV0ZXJtaW5pc3RpYygpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorfSAvLyBEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9EZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxZTJlMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGV0ZXJtaW5pc3RpYyBTSSBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsSW1wbCBleHRlbmRzIFNJSW1wbCBpbXBsZW1lbnRzCisJCURldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbCB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBUaGUgY29uc3RydWN0b3IgbmVlZHMgdG8gYmUgcHVibGljIHNvIHRoYXQgdGhlIG5ldyBkaXNlYXNlIHdpemFyZCBjYW4KKwkgKiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHdpdGhvdXQgdXNpbmcgdGhlIGZhY3RvcnkuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9IC8vIERldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbEltcGwKKworCS8qKgorCSAqIEBwYXJhbSBkaXNlYXNlTW9kZWxOYW1lCisJICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZGlzZWFzZSBtb2RlbAorCSAqIEBwYXJhbSBiYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZQorCSAqIEBwYXJhbSBpbmZlY3Rpb3VzTW9ydGFsaXR5CisJICogQHBhcmFtIHRyYW5zbWlzc2lvblJhdGUKKwkgKiBAcGFyYW0gcmVjb3ZlcnlSYXRlCisJICogQHBhcmFtIGltbXVuaXR5TG9zc1JhdGUKKwkgKiBAcGFyYW0gbm9uTGluZWFyaXR5Q29lZmZpY2llbnQKKwkgKiBAcGFyYW0gdGltZVBlcmlvZAorCSAqICAgICAgICAgICAgdGhlIHRpbWUgcGVyaW9kIGZvciB0aGUgcmF0ZXMgKG1pbGxpc2Vjb25kcykKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbklkZW50aWZpZXIKKwkgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwb3B1bGF0aW9uIGFmZmVjdGVkIGJ5IHRoZSBkaXNlYXNlCisJICogQHJldHVybiBhbiBpbml0aWFsaXplZCBpbnN0YW5jZSBvZiBEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBEZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWwgY3JlYXRlRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsKAorCQkJZmluYWwgU3RyaW5nIGRpc2Vhc2VNb2RlbE5hbWUsCisJCQlmaW5hbCBkb3VibGUgYmFja2dyb3VuZE1vcnRhbGl0eVJhdGUsCisJCQlmaW5hbCBkb3VibGUgaW5mZWN0aW91c01vcnRhbGl0eVJhdGUsCisJCQlmaW5hbCBkb3VibGUgdHJhbnNtaXNzaW9uUmF0ZSwgZmluYWwgZG91YmxlIHJlY292ZXJ5UmF0ZSwKKwkJCWZpbmFsIGRvdWJsZSBub25MaW5lYXJpdHlDb2VmZmljaWVudCwgZmluYWwgbG9uZyB0aW1lUGVyaW9kLAorCQkJZmluYWwgU3RyaW5nIHBvcHVsYXRpb25JZGVudGlmaWVyKSB7CisJCWZpbmFsIERldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbCBzaURpc2Vhc2VNb2RlbCA9IFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsKCk7CisJCWluaXRpYWxpemVTSURpc2Vhc2VNb2RlbChzaURpc2Vhc2VNb2RlbCwgZGlzZWFzZU1vZGVsTmFtZSwKKwkJCQliYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSwgCisJCQkJaW5mZWN0aW91c01vcnRhbGl0eVJhdGUsIHRyYW5zbWlzc2lvblJhdGUsIHJlY292ZXJ5UmF0ZSwKKwkJCQlub25MaW5lYXJpdHlDb2VmZmljaWVudCwgdGltZVBlcmlvZCwgcG9wdWxhdGlvbklkZW50aWZpZXIpOworCQlyZXR1cm4gc2lEaXNlYXNlTW9kZWw7CisJfSAvLyBjcmVhdGVEZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWwKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5ERVRFUk1JTklTVElDX1NJX0RJU0VBU0VfTU9ERUw7CisJfQorCisJcHVibGljIHZvaWQgZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoTGFiZWxWYWx1ZSBsYWJlbCkgeworCQkvLyBOb3RoaW5nCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNEZXRlcm1pbmlzdGljKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9IC8vIERldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjU3NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9EZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRldGVybWluaXN0aWMgU0lSIERpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsSW1wbCBleHRlbmRzIFNJUkltcGwgaW1wbGVtZW50cworCQlEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIFRoZSBjb25zdHJ1Y3RvciBuZWVkcyB0byBiZSBwdWJsaWMgc28gdGhhdCB0aGUgbmV3IGRpc2Vhc2Ugd2l6YXJkIGNhbgorCSAqIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgd2l0aG91dCB1c2luZyB0aGUgZmFjdG9yeS4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKi8KKwlwdWJsaWMgRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJfSAvLyBEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsSW1wbAorCisJLyoqCisJICogQHBhcmFtIGRpc2Vhc2VNb2RlbE5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBkaXNlYXNlIG1vZGVsCisJICogQHBhcmFtIGJhY2tncm91bmRNb3J0YWxpdHlSYXRlCisJICogQHBhcmFtIGluZmVjdGlvdXNNb3J0YWxpdHkKKwkgKiBAcGFyYW0gaW5mZWN0aW91c01vcnRhbGl0eVJhdGUKKwkgKiAgICAgICAgICAgIHRoZSByYXRlIGF0IHdoaWNoIGZhdGFsbHkgaW5mZWN0aW91cyBwb3B1bGF0aW9uIG1lbWJlcnMgZGllCisJICogQHBhcmFtIHRyYW5zbWlzc2lvblJhdGUKKwkgKiBAcGFyYW0gcmVjb3ZlcnlSYXRlCisJICogQHBhcmFtIGltbXVuaXR5TG9zc1JhdGUKKwkgKiBAcGFyYW0gbm9uTGluZWFyaXR5Q29lZmZpY2llbnQKKwkgKiBAcGFyYW0gdGltZVBlcmlvZAorCSAqICAgICAgICAgICAgdGhlIHRpbWUgcGVyaW9kIGZvciB0aGUgcmF0ZXMgKG1pbGxpc2Vjb25kcykKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbklkZW50aWZpZXIKKwkgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwb3B1bGF0aW9uIGFmZmVjdGVkIGJ5IHRoZSBkaXNlYXNlCisJICogQHJldHVybiBhbiBpbml0aWFsaXplZCBpbnN0YW5jZSBvZiBEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsIGNyZWF0ZURldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwoCisJCQlmaW5hbCBTdHJpbmcgZGlzZWFzZU1vZGVsTmFtZSwKKwkJCWZpbmFsIGRvdWJsZSBiYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSwKKwkJCWZpbmFsIGRvdWJsZSBpbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSwKKwkJCWZpbmFsIGRvdWJsZSB0cmFuc21pc3Npb25SYXRlLCBmaW5hbCBkb3VibGUgcmVjb3ZlcnlSYXRlLAorCQkJZmluYWwgZG91YmxlIGltbXVuaXR5TG9zc1JhdGUsCisJCQlmaW5hbCBkb3VibGUgbm9uTGluZWFyaXR5Q29lZmZpY2llbnQsIGZpbmFsIGxvbmcgdGltZVBlcmlvZCwKKwkJCWZpbmFsIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllcikgeworCQlmaW5hbCBEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsIHNpckRpc2Vhc2VNb2RlbCA9IFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbCgpOworCQlpbml0aWFsaXplU0lSRGlzZWFzZU1vZGVsKHNpckRpc2Vhc2VNb2RlbCwgZGlzZWFzZU1vZGVsTmFtZSwKKwkJCQliYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSwKKwkJCQlpbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSwgdHJhbnNtaXNzaW9uUmF0ZSwgcmVjb3ZlcnlSYXRlLAorCQkJCWltbXVuaXR5TG9zc1JhdGUsIG5vbkxpbmVhcml0eUNvZWZmaWNpZW50LCB0aW1lUGVyaW9kLAorCQkJCXBvcHVsYXRpb25JZGVudGlmaWVyKTsKKwkJcmV0dXJuIHNpckRpc2Vhc2VNb2RlbDsKKwl9IC8vIGNyZWF0ZURldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwKKworCXB1YmxpYyB2b2lkIGRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKExhYmVsVmFsdWUgbGFiZWwpIHsKKwkJLy8gTm90aGluZworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRGV0ZXJtaW5pc3RpYygpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5ERVRFUk1JTklTVElDX1NJUl9ESVNFQVNFX01PREVMOworCX0KKworfSAvLyBEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9EaXNlYXNlTW9kZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL0Rpc2Vhc2VNb2RlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDk1MzRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9EaXNlYXNlTW9kZWxJbXBsLmphdmEKQEAgLTAsMCArMSw5MjcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTm9kZURlY29yYXRvckltcGw7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxTdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Hcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuRGlzZWFzZU1vZGVsSW1wbCNnZXRCYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSA8ZW0+QmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuRGlzZWFzZU1vZGVsSW1wbCNnZXRQb3B1bGF0aW9uSWRlbnRpZmllciA8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxJbXBsI2dldFRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxJbXBsI2dldERpc2Vhc2VOYW1lIDxlbT5EaXNlYXNlIE5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbEltcGwjZ2V0UmVsYXRpdmVUb2xlcmFuY2UgPGVtPlJlbGF0aXZlIFRvbGVyYW5jZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuRGlzZWFzZU1vZGVsSW1wbCNpc0Zpbml0ZURpZmZlcmVuY2UgPGVtPkZpbml0ZSBEaWZmZXJlbmNlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxJbXBsI2lzRnJlcXVlbmN5RGVwZW5kZW50IDxlbT5GcmVxdWVuY3kgRGVwZW5kZW50PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxJbXBsI2dldEJhY2tncm91bmRCaXJ0aFJhdGUgPGVtPkJhY2tncm91bmQgQmlydGggUmF0ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIERpc2Vhc2VNb2RlbEltcGwgZXh0ZW5kcyBOb2RlRGVjb3JhdG9ySW1wbCBpbXBsZW1lbnRzCisJCURpc2Vhc2VNb2RlbCB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhY2tncm91bmRNb3J0YWxpdHlSYXRlKCkgPGVtPkJhY2tncm91bmQgTW9ydGFsaXR5IFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEJhY2tncm91bmRNb3J0YWxpdHlSYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBCQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFX0VERUZBVUxUID0gNS41RS01OworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFja2dyb3VuZE1vcnRhbGl0eVJhdGUoKSA8ZW0+QmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QmFja2dyb3VuZE1vcnRhbGl0eVJhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgYmFja2dyb3VuZE1vcnRhbGl0eVJhdGUgPSBCQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkgPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1BVTEFUSU9OX0lERU5USUZJRVJfRURFRkFVTFQgPSAiaHVtYW4iOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSA8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgcG9wdWxhdGlvbklkZW50aWZpZXIgPSBQT1BVTEFUSU9OX0lERU5USUZJRVJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZVBlcmlvZCgpIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScKKwkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI2dldFRpbWVQZXJpb2QoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgVElNRV9QRVJJT0RfRURFRkFVTFQgPSBTVEVNVGltZS5Vbml0cy5EQVkuZ2V0TWlsbGlzZWNvbmRzKCk7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaW1lUGVyaW9kKCkgPGVtPlRpbWUgUGVyaW9kPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGltZVBlcmlvZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGxvbmcgdGltZVBlcmlvZCA9IFRJTUVfUEVSSU9EX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc2Vhc2VOYW1lKCkgPGVtPkRpc2Vhc2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERpc2Vhc2VOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBESVNFQVNFX05BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzZWFzZU5hbWUoKSA8ZW0+RGlzZWFzZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGlzZWFzZU5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZGlzZWFzZU5hbWUgPSBESVNFQVNFX05BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVsYXRpdmVUb2xlcmFuY2UoKSA8ZW0+UmVsYXRpdmUgVG9sZXJhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWxhdGl2ZVRvbGVyYW5jZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgUkVMQVRJVkVfVE9MRVJBTkNFX0VERUZBVUxUID0gMS4wRS05OworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVsYXRpdmVUb2xlcmFuY2UoKSA8ZW0+UmVsYXRpdmUgVG9sZXJhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWxhdGl2ZVRvbGVyYW5jZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSByZWxhdGl2ZVRvbGVyYW5jZSA9IFJFTEFUSVZFX1RPTEVSQU5DRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Zpbml0ZURpZmZlcmVuY2UoKSA8ZW0+RmluaXRlIERpZmZlcmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzRmluaXRlRGlmZmVyZW5jZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJTklURV9ESUZGRVJFTkNFX0VERUZBVUxUID0gdHJ1ZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmluaXRlRGlmZmVyZW5jZSgpIDxlbT5GaW5pdGUgRGlmZmVyZW5jZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNGaW5pdGVEaWZmZXJlbmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBmaW5pdGVEaWZmZXJlbmNlID0gRklOSVRFX0RJRkZFUkVOQ0VfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGcmVxdWVuY3lEZXBlbmRlbnQoKSA8ZW0+RnJlcXVlbmN5IERlcGVuZGVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNGcmVxdWVuY3lEZXBlbmRlbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBGUkVRVUVOQ1lfREVQRU5ERU5UX0VERUZBVUxUID0gdHJ1ZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRnJlcXVlbmN5RGVwZW5kZW50KCkgPGVtPkZyZXF1ZW5jeSBEZXBlbmRlbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzRnJlcXVlbmN5RGVwZW5kZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBmcmVxdWVuY3lEZXBlbmRlbnQgPSBGUkVRVUVOQ1lfREVQRU5ERU5UX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhY2tncm91bmRCaXJ0aFJhdGUoKSA8ZW0+QmFja2dyb3VuZCBCaXJ0aCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRCYWNrZ3JvdW5kQmlydGhSYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBCQUNLR1JPVU5EX0JJUlRIX1JBVEVfRURFRkFVTFQgPSA1LjVFLTU7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYWNrZ3JvdW5kQmlydGhSYXRlKCkgPGVtPkJhY2tncm91bmQgQmlydGggUmF0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QmFja2dyb3VuZEJpcnRoUmF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBiYWNrZ3JvdW5kQmlydGhSYXRlID0gQkFDS0dST1VORF9CSVJUSF9SQVRFX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEaXNlYXNlTW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBzdGFuZGFyZERpc2Vhc2VNb2RlbAorCSAqICAgICAgICAgICAgdGhlIFN0YW5kYXJkRGlzZWFzZU1vZGVsIGRpc2Vhc2UgbW9kZWwgdG8gYmUgaW5pdGlhbGl6ZWQKKwkgKiBAcGFyYW0gZGlzZWFzZU1vZGVsTmFtZQorCSAqIEBwYXJhbSBiYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZQorCSAqIEBwYXJhbSBpbW11bml0eUxvc3NSYXRlCisJICogQHBhcmFtIGluY3ViYXRpb25SYXRlCisJICogQHBhcmFtIG5vbkxpbmVhcml0eUNvZWZmaWNpZW50CisJICogQHBhcmFtIHRpbWVQZXJpb2QKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbklkZW50aWZpZXIKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIERpc2Vhc2VNb2RlbCBpbml0aWFsaXplRGlzZWFzZU1vZGVsKAorCQkJZmluYWwgRGlzZWFzZU1vZGVsIGRpc2Vhc2VNb2RlbCwgZmluYWwgU3RyaW5nIGRpc2Vhc2VNb2RlbE5hbWUsCisJCQlmaW5hbCBkb3VibGUgYmFja2dyb3VuZE1vcnRhbGl0eVJhdGUsIGZpbmFsIGxvbmcgdGltZVBlcmlvZCwKKwkJCWZpbmFsIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllcikgeworCQlkaXNlYXNlTW9kZWwuc2V0RGlzZWFzZU5hbWUoZGlzZWFzZU1vZGVsTmFtZSk7CisJCWRpc2Vhc2VNb2RlbC5nZXREdWJsaW5Db3JlKCkuc2V0VGl0bGUoZGlzZWFzZU1vZGVsTmFtZSk7CisJCWRpc2Vhc2VNb2RlbC5zZXRCYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZShiYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSk7CisJCWRpc2Vhc2VNb2RlbC5zZXRUaW1lUGVyaW9kKHRpbWVQZXJpb2QpOworCQlkaXNlYXNlTW9kZWwuc2V0UG9wdWxhdGlvbklkZW50aWZpZXIocG9wdWxhdGlvbklkZW50aWZpZXIpOworCisJCXJldHVybiBkaXNlYXNlTW9kZWw7CisJfSAvLyBpbml0aWFsaXplRGlzZWFzZU1vZGVsCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuRElTRUFTRV9NT0RFTDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldEJhY2tncm91bmRNb3J0YWxpdHlSYXRlKCkgeworCQlyZXR1cm4gYmFja2dyb3VuZE1vcnRhbGl0eVJhdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZE1vcnRhbGl0eVJhdGUoZG91YmxlIG5ld0JhY2tncm91bmRNb3J0YWxpdHlSYXRlKSB7CisJCWRvdWJsZSBvbGRCYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSA9IGJhY2tncm91bmRNb3J0YWxpdHlSYXRlOworCQliYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSA9IG5ld0JhY2tncm91bmRNb3J0YWxpdHlSYXRlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURSwgb2xkQmFja2dyb3VuZE1vcnRhbGl0eVJhdGUsIGJhY2tncm91bmRNb3J0YWxpdHlSYXRlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBsb25nIGdldFRpbWVQZXJpb2QoKSB7CisJCXJldHVybiB0aW1lUGVyaW9kOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5ld1RpbWVQZXJpb2QKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VGltZVBlcmlvZChsb25nIG5ld1RpbWVQZXJpb2QpIHsKKwkJbG9uZyBvbGRUaW1lUGVyaW9kID0gdGltZVBlcmlvZDsKKwkJdGltZVBlcmlvZCA9IG5ld1RpbWVQZXJpb2Q7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19USU1FX1BFUklPRCwgb2xkVGltZVBlcmlvZCwgdGltZVBlcmlvZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkgeworCQlyZXR1cm4gcG9wdWxhdGlvbklkZW50aWZpZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmV3UG9wdWxhdGlvbklkZW50aWZpZXIKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoU3RyaW5nIG5ld1BvcHVsYXRpb25JZGVudGlmaWVyKSB7CisJCVN0cmluZyBvbGRQb3B1bGF0aW9uSWRlbnRpZmllciA9IHBvcHVsYXRpb25JZGVudGlmaWVyOworCQlwb3B1bGF0aW9uSWRlbnRpZmllciA9IG5ld1BvcHVsYXRpb25JZGVudGlmaWVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSLCBvbGRQb3B1bGF0aW9uSWRlbnRpZmllciwgcG9wdWxhdGlvbklkZW50aWZpZXIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXREaXNlYXNlTmFtZSgpIHsKKwkJcmV0dXJuIGRpc2Vhc2VOYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREaXNlYXNlTmFtZShTdHJpbmcgbmV3RGlzZWFzZU5hbWUpIHsKKwkJU3RyaW5nIG9sZERpc2Vhc2VOYW1lID0gZGlzZWFzZU5hbWU7CisJCWRpc2Vhc2VOYW1lID0gbmV3RGlzZWFzZU5hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19ESVNFQVNFX05BTUUsIG9sZERpc2Vhc2VOYW1lLCBkaXNlYXNlTmFtZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0UmVsYXRpdmVUb2xlcmFuY2UoKSB7CisJCXJldHVybiByZWxhdGl2ZVRvbGVyYW5jZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZWxhdGl2ZVRvbGVyYW5jZShkb3VibGUgbmV3UmVsYXRpdmVUb2xlcmFuY2UpIHsKKwkJZG91YmxlIG9sZFJlbGF0aXZlVG9sZXJhbmNlID0gcmVsYXRpdmVUb2xlcmFuY2U7CisJCXJlbGF0aXZlVG9sZXJhbmNlID0gbmV3UmVsYXRpdmVUb2xlcmFuY2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0UsIG9sZFJlbGF0aXZlVG9sZXJhbmNlLCByZWxhdGl2ZVRvbGVyYW5jZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRmluaXRlRGlmZmVyZW5jZSgpIHsKKwkJcmV0dXJuIGZpbml0ZURpZmZlcmVuY2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RmluaXRlRGlmZmVyZW5jZShib29sZWFuIG5ld0Zpbml0ZURpZmZlcmVuY2UpIHsKKwkJYm9vbGVhbiBvbGRGaW5pdGVEaWZmZXJlbmNlID0gZmluaXRlRGlmZmVyZW5jZTsKKwkJZmluaXRlRGlmZmVyZW5jZSA9IG5ld0Zpbml0ZURpZmZlcmVuY2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19GSU5JVEVfRElGRkVSRU5DRSwgb2xkRmluaXRlRGlmZmVyZW5jZSwgZmluaXRlRGlmZmVyZW5jZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRnJlcXVlbmN5RGVwZW5kZW50KCkgeworCQlyZXR1cm4gZnJlcXVlbmN5RGVwZW5kZW50OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZyZXF1ZW5jeURlcGVuZGVudChib29sZWFuIG5ld0ZyZXF1ZW5jeURlcGVuZGVudCkgeworCQlib29sZWFuIG9sZEZyZXF1ZW5jeURlcGVuZGVudCA9IGZyZXF1ZW5jeURlcGVuZGVudDsKKwkJZnJlcXVlbmN5RGVwZW5kZW50ID0gbmV3RnJlcXVlbmN5RGVwZW5kZW50OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVCwgb2xkRnJlcXVlbmN5RGVwZW5kZW50LCBmcmVxdWVuY3lEZXBlbmRlbnQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldEJhY2tncm91bmRCaXJ0aFJhdGUoKSB7CisJCXJldHVybiBiYWNrZ3JvdW5kQmlydGhSYXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRCaXJ0aFJhdGUoZG91YmxlIG5ld0JhY2tncm91bmRCaXJ0aFJhdGUpIHsKKwkJZG91YmxlIG9sZEJhY2tncm91bmRCaXJ0aFJhdGUgPSBiYWNrZ3JvdW5kQmlydGhSYXRlOworCQliYWNrZ3JvdW5kQmlydGhSYXRlID0gbmV3QmFja2dyb3VuZEJpcnRoUmF0ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfQklSVEhfUkFURSwgb2xkQmFja2dyb3VuZEJpcnRoUmF0ZSwgYmFja2dyb3VuZEJpcnRoUmF0ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHRpbWVEZWx0YQorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0QWRqdXN0ZWRCYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZShsb25nIHRpbWVEZWx0YSkgeworCQlyZXR1cm4gZ2V0QmFja2dyb3VuZE1vcnRhbGl0eVJhdGUoKQorCQkJCSogKChkb3VibGUpIHRpbWVEZWx0YSAvIChkb3VibGUpIGdldFRpbWVQZXJpb2QoKSk7CisJfSAvLyBnZXRBZGp1c3RlZEJhY2tncm91bmRNb3J0YWxpdHlSYXRlCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBEaXNlYXNlTW9kZWxMYWJlbCBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbCgpOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIGFic3RyYWN0IERpc2Vhc2VNb2RlbFN0YXRlIGNyZWF0ZURpc2Vhc2VNb2RlbFN0YXRlKCk7CisKKworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZGlzZWFzZU1vZGVsU3RhdGUKKwkgKiBAcGFyYW0gZGlzZWFzZU1vZGVsTGFiZWwKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgRGlzZWFzZU1vZGVsU3RhdGUgaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZSgKKwkJCWZpbmFsIERpc2Vhc2VNb2RlbFN0YXRlIGRpc2Vhc2VNb2RlbFN0YXRlLAorCQkJZmluYWwgRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZU1vZGVsTGFiZWwpOworCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGlzIGEgc2Vjb25kIGNoYW5jZSB0byB1cGRhdGUgdGhlIHtAbGluayBEaXNlYXNlTW9kZWxTdGF0ZX0gaW5zdGFuY2UgdGhhdAorCSAqIGlzIGJlaW5nIGtlcHQgYXQgYSB7QGxpbmsgRGlzZWFzZU1vZGVsTGFiZWx9LiAgV2UgZ2V0IHRoaXMgYmVjYXVzZSB3ZSd2ZQorCSAqIGFscmVhZHkgZG9uZSBvbmUgcGFzcyBvdmVyIHRoZSBsYWJsZWwncyB0aGF0IHRoZSBkaXNlYXNlIG1vZGVsIHVwZGF0ZXMuICBJbgorCSAqIHRoYXQgcGFzcyB3ZSBhY2N1bWxhdGVkIGdsb2JhbCBzdGF0ZSBpbmZvcm1hdGlvbiAoZS5nLiwgdGhlIHRvdGFsIHBvcHVsYXRpb24pCisJICogYW5kIG5vdyB3ZSBtaWdodCBuZWVkIHRvIGFkZCBzb21ldGhpbmcgdG8gdGhlIHN0YXRlIGluZm9ybWF0aW9uIHN1Y2gKKwkgKiBhcyB0aGUgZ2xvYmFsIHBvcHVsYXRpb24gZGVuc2l0eS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCWFic3RyYWN0IHB1YmxpYyB2b2lkIGluaXRpYWxpemVEaXNlYXNlU3RhdGUoRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZU1vZGVsTGFiZWwpOworCisKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIGFic3RyYWN0IEluZmVjdG9yIGNyZWF0ZUluZmVjdG9yKCk7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIGRvdWJsZSBnZXRBZGp1c3RlZEJhY2tncm91bmRCaXJ0aFJhdGUobG9uZyB0aW1lRGVsdGEpIHsKKwkJcmV0dXJuIGdldEJhY2tncm91bmRCaXJ0aFJhdGUoKQorCQkqICgoZG91YmxlKSB0aW1lRGVsdGEgLyAoZG91YmxlKSBnZXRUaW1lUGVyaW9kKCkpOworCX0KKworCS8qKgorCSAqIFNlYXJjaCB0aHJvdWdoIHRoZSBncmFwaCBhbmQgZmluZCBhbGwgb2YgdGhlIHBvcHVsYXRpb24gbGFiZWxzIHRoYXQgaGF2ZQorCSAqIHRoZSBzYW1lIGlkZW50aWZpZXIuCisJICogCisJICogQHBhcmFtIHBvcHVsYXRpb25JZGVudGlmaWVyCisJICogICAgICAgICAgICB0aGUgcG9wdWxhdGlvbiBiZWluZyBsYWJlbGVkCisJICogQHBhcmFtIGdyYXBoCisJICogICAgICAgICAgICB0aGUgZ3JhcGggdG8gc2VhcmNoCisJICogQHJldHVybiB0aGUgUG9wdWxhdGlvbkxhYmVsIGluc3RhbmNlcyBvZiB0aGUgZ3JhcGggdGhhdCBtYXRjaCB0aGUKKwkgKiAgICAgICAgIGlkZW50aWZpZXIuCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UG9wdWxhdGlvbkxhYmVsPiBnZXRQb3B1bGF0aW9uTGFiZWxzKAorCQkJZmluYWwgU3RyaW5nIHBvcHVsYXRpb25JZGVudGlmaWVyLCBmaW5hbCBHcmFwaCBncmFwaCkgeworCQlmaW5hbCBMaXN0PFBvcHVsYXRpb25MYWJlbD4gcmV0VmFsdWUgPSBuZXcgQXJyYXlMaXN0PFBvcHVsYXRpb25MYWJlbD4oKTsKKworCQkvLyBJdGVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSBwb3B1bGF0aW9uIGxhYmVscyBpbiB0aGUgZ3JhcGgKKwkJRUxpc3Q8Tm9kZUxhYmVsPiBsYWJlbHMgPSBncmFwaC5nZXROb2RlTGFiZWxzQnlUeXBlVVJJKAorCQkJCVBvcHVsYXRpb25MYWJlbC5VUklfVFlQRV9QT1BVTEFUSU9OX0xBQkVMKTsKKwkJZm9yIChOb2RlTGFiZWwgcGw6bGFiZWxzKSB7CisJCQlmaW5hbCBQb3B1bGF0aW9uTGFiZWwgcG9wdWxhdGlvbkxhYmVsID0gKFBvcHVsYXRpb25MYWJlbCkgcGw7CisJCQkvLyBJcyB0aGlzIGxhYmVsIGZvciB0aGUgcG9wdWxhdGlvbiB3ZSdyZSBsb29raW5nIGZvcj8KKwkJCWlmIChwb3B1bGF0aW9uTGFiZWwuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKS5lcXVhbHMoCisJCQkJCXBvcHVsYXRpb25JZGVudGlmaWVyKSkgeworCQkJCS8vIFllcworCQkJCS8vIElmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSAibm9kZSB1cmkiIG9mIHRoZSBwb3B1bGF0aW9uCisJCQkJLy8gbGFiZWwgdGhlbiBpdCB3b3VsZCBub3QgaGF2ZSBiZWVuIGFzc29jaWF0ZWQgd2l0aCBhIG5vZGUKKwkJCQkvLyBpbnN0YW5jZSBpbiB0aGUgZ3JhcGggYXQgdGhpcyBwb2ludC4gVGhpcyBpcyBhIHByb2JsZW0gZm9yCisJCQkJLy8gZGlzZWFzZSBtb2RlbHMgdGhhdCBhcmUgdHJ5aW5nIHRvIGxhYmVsIHRoZSBub2RlICh0aGVyZSBpc24ndAorCQkJCS8vIG9uZSEpLiBTbyBmaWx0ZXIgb3V0IHRob3NlIG1pc3Rha2VzIGhlcmUuCisKKwkJCQkvLyBEb2VzIHRoZSBwb3B1bGF0aW9uIGxhYmVsIGhhdmUgYW4gYXNzb2NpYXRlZCBub2RlPworCQkJCWlmIChwb3B1bGF0aW9uTGFiZWwuZ2V0Tm9kZSgpICE9IG51bGwpIHsKKwkJCQkJLy8gWWVzCisJCQkJCXJldFZhbHVlLmFkZChwb3B1bGF0aW9uTGFiZWwpOworCQkJCX0gLy8gaWYgdGhlIHBvcHVsYXRpb24gbGFiZWwgaGFzIGEgbm9kZQorCQkJfSAvLyBpZiB0aGUgcG9wdWxhdGlvbiB3ZSdyZSBsb29raW5nIGZvcgorCQl9IC8vIGZvciBlYWNoIHBvcHVsYXRpb24gbGFiZWwKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRQb3B1bGF0aW9uTGFiZWxzCisKKwkvKioKKwkgKiBTZWFyY2ggdGhyb3VnaCB0aGUgZ3JhcGggYW5kIGZpbmQgYWxsIG9mIHRoZSBwb3B1bGF0aW9uIG1vZGVsIGxhYmVscyAoaS5lLiBkeW5hbWljIGxhYmVscykgdGhhdCBoYXZlCisJICogdGhlIHNhbWUgaWRlbnRpZmllci4KKwkgKiAKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbklkZW50aWZpZXIKKwkgKiAgICAgICAgICAgIHRoZSBwb3B1bGF0aW9uIGJlaW5nIGxhYmVsZWQKKwkgKiBAcGFyYW0gZ3JhcGgKKwkgKiAgICAgICAgICAgIHRoZSBncmFwaCB0byBzZWFyY2gKKwkgKiBAcmV0dXJuIHRoZSBQb3B1bGF0aW9uTGFiZWwgaW5zdGFuY2VzIG9mIHRoZSBncmFwaCB0aGF0IG1hdGNoIHRoZQorCSAqICAgICAgICAgaWRlbnRpZmllci4KKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxQb3B1bGF0aW9uTW9kZWxMYWJlbD4gZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWxzKAorCQkJZmluYWwgU3RyaW5nIHBvcHVsYXRpb25JZGVudGlmaWVyLCBmaW5hbCBHcmFwaCBncmFwaCkgeworCQlmaW5hbCBMaXN0PFBvcHVsYXRpb25Nb2RlbExhYmVsPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8UG9wdWxhdGlvbk1vZGVsTGFiZWw+KCk7CisKKwkJLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgcG9wdWxhdGlvbiBsYWJlbHMgaW4gdGhlIGdyYXBoCisJCUVMaXN0PE5vZGVMYWJlbD4gbGFiZWxzID0gZ3JhcGguZ2V0Tm9kZUxhYmVsc0J5VHlwZVVSSSgKKwkJCQlQb3B1bGF0aW9uTW9kZWxMYWJlbC5VUklfVFlQRV9EWU5BTUlDX1BPUFVMQVRJT05fTEFCRUwpOworCQlmb3IgKE5vZGVMYWJlbCBwbDpsYWJlbHMpIHsKKwkJCWZpbmFsIFBvcHVsYXRpb25Nb2RlbExhYmVsIHBvcHVsYXRpb25MYWJlbCA9IChQb3B1bGF0aW9uTW9kZWxMYWJlbCkgcGw7CisJCQkvLyBJcyB0aGlzIGxhYmVsIGZvciB0aGUgcG9wdWxhdGlvbiB3ZSdyZSBsb29raW5nIGZvcj8KKwkJCWlmIChwb3B1bGF0aW9uTGFiZWwuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKS5lcXVhbHMoCisJCQkJCXBvcHVsYXRpb25JZGVudGlmaWVyKSkgeworCQkJCS8vIFllcworCQkJCS8vIElmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSAibm9kZSB1cmkiIG9mIHRoZSBwb3B1bGF0aW9uCisJCQkJLy8gbGFiZWwgdGhlbiBpdCB3b3VsZCBub3QgaGF2ZSBiZWVuIGFzc29jaWF0ZWQgd2l0aCBhIG5vZGUKKwkJCQkvLyBpbnN0YW5jZSBpbiB0aGUgZ3JhcGggYXQgdGhpcyBwb2ludC4gVGhpcyBpcyBhIHByb2JsZW0gZm9yCisJCQkJLy8gZGlzZWFzZSBtb2RlbHMgdGhhdCBhcmUgdHJ5aW5nIHRvIGxhYmVsIHRoZSBub2RlICh0aGVyZSBpc24ndAorCQkJCS8vIG9uZSEpLiBTbyBmaWx0ZXIgb3V0IHRob3NlIG1pc3Rha2VzIGhlcmUuCisKKwkJCQkvLyBEb2VzIHRoZSBwb3B1bGF0aW9uIGxhYmVsIGhhdmUgYW4gYXNzb2NpYXRlZCBub2RlPworCQkJCWlmIChwb3B1bGF0aW9uTGFiZWwuZ2V0Tm9kZSgpICE9IG51bGwpIHsKKwkJCQkJLy8gWWVzCisJCQkJCXJldFZhbHVlLmFkZChwb3B1bGF0aW9uTGFiZWwpOworCQkJCX0gLy8gaWYgdGhlIHBvcHVsYXRpb24gbGFiZWwgaGFzIGEgbm9kZQorCQkJfSAvLyBpZiB0aGUgcG9wdWxhdGlvbiB3ZSdyZSBsb29raW5nIGZvcgorCQl9IC8vIGZvciBlYWNoIHBvcHVsYXRpb24gbGFiZWwKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRQb3B1bGF0aW9uTGFiZWxzCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5EZWNvcmF0b3JJbXBsI2RlY29yYXRlR3JhcGgob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGRlY29yYXRlR3JhcGgoU1RFTVRpbWUgdGltZSkgeworCQlpZih0aGlzLmlzR3JhcGhEZWNvcmF0ZWQoKSkgcmV0dXJuIHRydWU7CisJCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOworCQkJCQorCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPFBvcHVsYXRpb25Nb2RlbExhYmVsPiBwb3B1bGF0aW9uTW9kZWxMYWJlbEl0ZXIgPSBnZXRQb3B1bGF0aW9uTW9kZWxMYWJlbHMoCisJCQkJZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSwgZ2V0R3JhcGgoKSkuaXRlcmF0b3IoKTsgcG9wdWxhdGlvbk1vZGVsTGFiZWxJdGVyCisJCQkJLmhhc05leHQoKTspIHsKKwkJCXN1Y2Nlc3MgPSB0cnVlOworCQkJZmluYWwgUG9wdWxhdGlvbk1vZGVsTGFiZWwgcG9wdWxhdGlvbk1vZGVsTGFiZWwgPSBwb3B1bGF0aW9uTW9kZWxMYWJlbEl0ZXIubmV4dCgpOworCisJCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbCBkbWwgPSBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbCgpOworCQkJRGlzZWFzZU1vZGVsTGFiZWxJbXBsLmxhYmVsTm9kZShkbWwsIHBvcHVsYXRpb25Nb2RlbExhYmVsLAorCQkJCQlwb3B1bGF0aW9uTW9kZWxMYWJlbC5nZXROb2RlKCkpOworCQkJZ2V0TGFiZWxzVG9VcGRhdGUoKS5hZGQoZG1sKTsKKworCQkJZ2V0R3JhcGgoKS5wdXROb2RlTGFiZWwoZG1sKTsKKworCQkJLy8gSW5pdGlhbGl6ZSB0aGUgZGlzZWFzZSBtb2RlbCBzdGF0ZSAoaWYgYW55KS4gVGhlIHN0YXRlIGhvbGRzCisJCQkvLyB2YWx1ZXMgdXNlZnVsIGZvciB0aGUgY29tcHV0YXRpb24gb2YgdGhlIGRpc2Vhc2UgbW9kZWwKKwkJCWZpbmFsIERpc2Vhc2VNb2RlbFN0YXRlIGRpc2Vhc2VNb2RlbFN0YXRlID0gY3JlYXRlRGlzZWFzZU1vZGVsU3RhdGUoKTsKKworCQkJLy8gQ29tbWVudGVkIG91dCA0LzEvMTAgTm90IHVzZWQgYW55IG1vcmUgCisvLwkJCWRtbC5zZXREaXNlYXNlTW9kZWxTdGF0ZShpbml0aWFsaXplRGlzZWFzZVN0YXRlKGRpc2Vhc2VNb2RlbFN0YXRlLAorLy8JCQkJCWRtbCkpOworCQl9IC8vIGZvciBlYWNoIHBvcHVsYXRpb24gbGFiZWwKKwkJCisJCS8vIFdlJ3ZlIG1hZGUgb25lIHBhc3MgbGFiZWxpbmcgdGhlIE5vZGUncyB3aXRoIHRoZSBkaXNlYXNlIG1vZGVsIGxhYmVsLAorCQkvLyBhbmQgd2UgY3JlYXRlZCBEaXNlYXNlTW9kZWxTdGF0ZSBpbnN0YW5jZXMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhpcworCQkvLyBkaXNlYXNlIHRoYXQgaG9sZCBzdGF0ZSBpbmZvcm1hdGlvbiB1c2VmdWwgaW4gaXRzIGNvbXB1dGF0aW9ucy4KKwkJLy8gSGF2aW5nIG1hZGUgb25lIHBhc3Mgd2UgbmVlZCB0byBnaXZlIHRoZSBkaXNlYXNlIG1vZGVsIGFub3RoZXIgY2hhbmNlCisJCS8vIHRvIHVwZGF0ZSBpdHMgc3RhdGUgaW5mb3JtYXRpb24gd2l0aCB0aGluZ3MgaXQgbGVhcm5lZCBkdXJpbmcgdGhlCisJCS8vIGZpcnN0IHBhc3MgKGUuZy4sIHRoZSB0b3RhbCBwb3B1bGF0aW9uIG9yIHRvdGFsIGFyZWEpLiAgCisJCisJCS8vIENvbW1lbnRlZCBvdXQgNC8xLzEwIE5vdCB1c2VkIGFueSBtb3JlCisJCQorLy8JCWZvciAoSXRlcmF0b3IgZGlzZXNlTW9kZWxMYWJlbEl0ZXIgPSBnZXRMYWJlbHNUb1VwZGF0ZSgpLml0ZXJhdG9yKCk7IGRpc2VzZU1vZGVsTGFiZWxJdGVyLmhhc05leHQoKTspIHsKKy8vCQkJaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZSgoRGlzZWFzZU1vZGVsTGFiZWwpIGRpc2VzZU1vZGVsTGFiZWxJdGVyLm5leHQoKSk7CisvLwkJfSAvLyBmb3IgZWFjaCBsYWJlbCB0aGlzIGRpc2Vhc2UgbW9kZWwgdXBkYXRlcworCisJCQorCQkvLyBUaGlzIGluaXRpYWxpemVzIHRoZSBkaXNlYXNlIG1vZGVsIHZhbHVlcyBmcm9tIHRoZSBwb3B1bGF0aW9uIHZhbHVlcy4KKwkJLy8gRm9yIGluc3RhbmNlIGZvciBTdGFuZGFyZERpc2Vhc2VNb2RlbHMsIGl0IGluaXRpYWxpemVzIHRoZQorCQkvLyBzdXNjZXB0aWFibGUgcG9wdWxhdGlvbiBmcm9tIHRoZSBwb3B1bGF0aW9uCisJCXJlc2V0TGFiZWxzKCk7CisJCXJldHVybiBzdWNjZXNzOworCX0gLy8gZGVjb3JhdGVHcmFwaAorCisJcHJvdGVjdGVkIGJvb2xlYW4gZmluZFBvcHVsYXRpb25Nb2RlbChNb2RlbCBtLCBTdHJpbmcgcG9wdWxhdGlvbikgeworCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCS8vIENoZWNrIHN1YiBtb2RlbHMgZmlyc3QKKwkJZm9yKE1vZGVsIG0yOm0uZ2V0TW9kZWxzKCkpIHsKKwkJCWZvdW5kID0gZmluZFBvcHVsYXRpb25Nb2RlbChtMiwgcG9wdWxhdGlvbik7CisJCQlpZihmb3VuZClicmVhazsKKwkJfQorCQlpZihmb3VuZCkgcmV0dXJuIGZvdW5kOworCQkKKwkJZm9yKE5vZGVEZWNvcmF0b3IgZGVjOiBtLmdldE5vZGVEZWNvcmF0b3JzKCkpIHsKKwkJCWlmKGRlYyBpbnN0YW5jZW9mIERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsKSB7CisJCQkJRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwgZHBtID0gKERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsKWRlYzsKKwkJCQlpZihkcG0uZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKS5lcXVhbHMocG9wdWxhdGlvbikpIHsKKwkJCQkJZm91bmQgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gQW55IG9mIHRoZSBncm91cHMgbWF0Y2g/CisJCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOworCQkJCWZvcihQb3B1bGF0aW9uR3JvdXAgcGc6ZHBtLmdldFBvcHVsYXRpb25Hcm91cHMoKSkgeworCQkJCQlpZihwZy5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKHBvcHVsYXRpb24pKSB7bWF0Y2g9dHJ1ZTticmVhazt9CisJCQkJfQorCQkJCWlmKG1hdGNoKSB7CisJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlCisJCQlpZihkZWMgaW5zdGFuY2VvZiBQb3B1bGF0aW9uTW9kZWwgJiYgCisJCQkJCSgoUG9wdWxhdGlvbk1vZGVsKWRlYykuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKS5lcXVhbHMocG9wdWxhdGlvbikpIHsKKwkJCQlmb3VuZCA9IHRydWU7YnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZvdW5kOworCX0KKwkKKwkvKioKKwkgKiBQcmVwYXJlIHRoZSBkZWNvcmF0b3IuIEEgc3ViY2xhc3MgbmVlZHMgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYKKwkgKiBwcmUtcHJvY2Vzc2luZyBzdGVwcyBhcmUgbmVjZXNzYXJ5IGJlZm9yZSB0aGUgZGVjb3JhdG9yIGlzIGJlaW5nIHVzZWQKKwkgKiAKKwkgKiAKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwcmVwYXJlKE1vZGVsIG1vZGVsLCBTVEVNVGltZSB0aW1lKSB7CisKKwkJLy8gQ2hlY2sgd2hldGhlciBhIHBvcHVsYXRpb24gbW9kZWwgZXhpc3RzIGZvciB0aGUgZGlzZWFzZSBtb2RlbC4gSWYgbm90LCBjcmVhdGUKKwkJLy8gYSBuZXcgcG9wdWxhdGlvbiBtb2RlbCB3aXRoIGJpcnRoL2RlYXRoIHJhdGUgMC4KKwkJCisJCWJvb2xlYW4gZm91bmQgPSBmaW5kUG9wdWxhdGlvbk1vZGVsKG1vZGVsLCB0aGlzLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkpOworCQkKKwkJaWYoIWZvdW5kKSB7CisJCQkvLyBDcmVhdGUgYSBuZXcgc3RhbmRhcmQgcG9wdWxhdGlvbiBtb2RlbAorCQkJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwgc3BtID0gU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCgpOworCQkJc3BtLnNldFBvcHVsYXRpb25JZGVudGlmaWVyKHRoaXMuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSk7CisJCQlTdHJpbmcgdGl0bGUgPSAiQXV0byBHZW5lcmF0ZWQgIit0aGlzLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkrIiBwb3B1bGF0aW9uIG1vZGVsIjsKKwkJCVN0cmluZyBuYW1lID0gImF1dG9fZ2VuXyIrdGhpcy5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpKyJfcG9wdWxhdGlvbl9tb2RlbCI7CisJCQlzcG0uc2V0VVJJKFNURU1VUkkuY3JlYXRlVVJJKG5hbWUrIi8iK1NURU1VUkkuZ2VuZXJhdGVVbmlxdWVQYXJ0KCkpKTsKKwkJCXNwbS5zZXROYW1lKG5hbWUpOworCQkJc3BtLmdldER1YmxpbkNvcmUoKS5zZXRUaXRsZSh0aXRsZSk7CisJCQltb2RlbC5nZXROb2RlRGVjb3JhdG9ycygpLmFkZCgwLCBzcG0pOworCQl9CisJfQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSByZXNvbHZlCisJICogQHBhcmFtIGNvcmVUeXBlCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFOgorCQkJCXJldHVybiBnZXRCYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSOgorCQkJCXJldHVybiBnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0Q6CisJCQkJcmV0dXJuIGdldFRpbWVQZXJpb2QoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfX0RJU0VBU0VfTkFNRToKKwkJCQlyZXR1cm4gZ2V0RGlzZWFzZU5hbWUoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfX1JFTEFUSVZFX1RPTEVSQU5DRToKKwkJCQlyZXR1cm4gZ2V0UmVsYXRpdmVUb2xlcmFuY2UoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfX0ZJTklURV9ESUZGRVJFTkNFOgorCQkJCXJldHVybiBpc0Zpbml0ZURpZmZlcmVuY2UoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfX0ZSRVFVRU5DWV9ERVBFTkRFTlQ6CisJCQkJcmV0dXJuIGlzRnJlcXVlbmN5RGVwZW5kZW50KCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEU6CisJCQkJcmV0dXJuIGdldEJhY2tncm91bmRCaXJ0aFJhdGUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcGFyYW0gbmV3VmFsdWUKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEU6CisJCQkJc2V0QmFja2dyb3VuZE1vcnRhbGl0eVJhdGUoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSOgorCQkJCXNldFBvcHVsYXRpb25JZGVudGlmaWVyKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EOgorCQkJCXNldFRpbWVQZXJpb2QoKExvbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfX0RJU0VBU0VfTkFNRToKKwkJCQlzZXREaXNlYXNlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0U6CisJCQkJc2V0UmVsYXRpdmVUb2xlcmFuY2UoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0U6CisJCQkJc2V0RmluaXRlRGlmZmVyZW5jZSgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVDoKKwkJCQlzZXRGcmVxdWVuY3lEZXBlbmRlbnQoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfQklSVEhfUkFURToKKwkJCQlzZXRCYWNrZ3JvdW5kQmlydGhSYXRlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURToKKwkJCQlzZXRCYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZShCQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVI6CisJCQkJc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoUE9QVUxBVElPTl9JREVOVElGSUVSX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19USU1FX1BFUklPRDoKKwkJCQlzZXRUaW1lUGVyaW9kKFRJTUVfUEVSSU9EX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19ESVNFQVNFX05BTUU6CisJCQkJc2V0RGlzZWFzZU5hbWUoRElTRUFTRV9OQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0U6CisJCQkJc2V0UmVsYXRpdmVUb2xlcmFuY2UoUkVMQVRJVkVfVE9MRVJBTkNFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19GSU5JVEVfRElGRkVSRU5DRToKKwkJCQlzZXRGaW5pdGVEaWZmZXJlbmNlKEZJTklURV9ESUZGRVJFTkNFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19GUkVRVUVOQ1lfREVQRU5ERU5UOgorCQkJCXNldEZyZXF1ZW5jeURlcGVuZGVudChGUkVRVUVOQ1lfREVQRU5ERU5UX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEU6CisJCQkJc2V0QmFja2dyb3VuZEJpcnRoUmF0ZShCQUNLR1JPVU5EX0JJUlRIX1JBVEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFOgorCQkJCXJldHVybiBiYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSAhPSBCQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFX0VERUZBVUxUOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSOgorCQkJCXJldHVybiBQT1BVTEFUSU9OX0lERU5USUZJRVJfRURFRkFVTFQgPT0gbnVsbCA/IHBvcHVsYXRpb25JZGVudGlmaWVyICE9IG51bGwgOiAhUE9QVUxBVElPTl9JREVOVElGSUVSX0VERUZBVUxULmVxdWFscyhwb3B1bGF0aW9uSWRlbnRpZmllcik7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19USU1FX1BFUklPRDoKKwkJCQlyZXR1cm4gdGltZVBlcmlvZCAhPSBUSU1FX1BFUklPRF9FREVGQVVMVDsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfX0RJU0VBU0VfTkFNRToKKwkJCQlyZXR1cm4gRElTRUFTRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBkaXNlYXNlTmFtZSAhPSBudWxsIDogIURJU0VBU0VfTkFNRV9FREVGQVVMVC5lcXVhbHMoZGlzZWFzZU5hbWUpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fUkVMQVRJVkVfVE9MRVJBTkNFOgorCQkJCXJldHVybiByZWxhdGl2ZVRvbGVyYW5jZSAhPSBSRUxBVElWRV9UT0xFUkFOQ0VfRURFRkFVTFQ7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19GSU5JVEVfRElGRkVSRU5DRToKKwkJCQlyZXR1cm4gZmluaXRlRGlmZmVyZW5jZSAhPSBGSU5JVEVfRElGRkVSRU5DRV9FREVGQVVMVDsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfX0ZSRVFVRU5DWV9ERVBFTkRFTlQ6CisJCQkJcmV0dXJuIGZyZXF1ZW5jeURlcGVuZGVudCAhPSBGUkVRVUVOQ1lfREVQRU5ERU5UX0VERUZBVUxUOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9CSVJUSF9SQVRFOgorCQkJCXJldHVybiBiYWNrZ3JvdW5kQmlydGhSYXRlICE9IEJBQ0tHUk9VTkRfQklSVEhfUkFURV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkKKwkJCXJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCWZpbmFsIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKwkJZmluYWwgU3RyaW5nIHRpdGxlID0gZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCk7CisJCXJlc3VsdC5hcHBlbmQodGl0bGUgPT0gbnVsbCA/ICI8ZGlzZWFzZSBtb2RlbD4iIDogdGl0bGUpOworCQlyZXN1bHQuYXBwZW5kKCIoIik7CisJCXJlc3VsdC5hcHBlbmQocG9wdWxhdGlvbklkZW50aWZpZXIpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9IC8vIHRvU3RyaW5nCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLk5vZGVEZWNvcmF0b3JJbXBsI3NhbmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5zYW5lKCk7CisKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBkaXNlYXNlTmFtZSAhPSBudWxsOworCQlhc3NlcnQgcmV0VmFsdWU7CisKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZQorCQkJCSYmIGJhY2tncm91bmRNb3J0YWxpdHlSYXRlID49IDAuMDsKKwkJYXNzZXJ0IHJldFZhbHVlOworCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgIURvdWJsZS5pc0luZmluaXRlKGJhY2tncm91bmRNb3J0YWxpdHlSYXRlKTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiAhRG91YmxlLmlzTmFOKGJhY2tncm91bmRNb3J0YWxpdHlSYXRlKTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiB0aW1lUGVyaW9kID49IFRJTUVfUEVSSU9EX0VERUZBVUxUOworCQlhc3NlcnQgcmV0VmFsdWU7CisKKwkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gc2FuZQorCit9IC8vIERpc2Vhc2VNb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvRGlzZWFzZU1vZGVsTGFiZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL0Rpc2Vhc2VNb2RlbExhYmVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZGFkOWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL0Rpc2Vhc2VNb2RlbExhYmVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsNDM5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuRHluYW1pY05vZGVMYWJlbEltcGw7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5TdGF0aWNOb2RlTGFiZWxJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbFN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNlYXNlIE1vZGVsIExhYmVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxMYWJlbEltcGwjZ2V0UG9wdWxhdGlvbkxhYmVsIDxlbT5Qb3B1bGF0aW9uIExhYmVsPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxMYWJlbEltcGwjZ2V0RGlzZWFzZU1vZGVsU3RhdGUgPGVtPkRpc2Vhc2UgTW9kZWwgU3RhdGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbExhYmVsSW1wbCNnZXRQb3B1bGF0aW9uTW9kZWxMYWJlbCA8ZW0+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIERpc2Vhc2VNb2RlbExhYmVsSW1wbCBleHRlbmRzIER5bmFtaWNOb2RlTGFiZWxJbXBsCisJCWltcGxlbWVudHMgRGlzZWFzZU1vZGVsTGFiZWwgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcHVsYXRpb25MYWJlbCgpIDxlbT5Qb3B1bGF0aW9uIExhYmVsPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbkxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUG9wdWxhdGlvbkxhYmVsIHBvcHVsYXRpb25MYWJlbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc2Vhc2VNb2RlbFN0YXRlKCkgPGVtPkRpc2Vhc2UgTW9kZWwgU3RhdGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREaXNlYXNlTW9kZWxTdGF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIERpc2Vhc2VNb2RlbFN0YXRlIGRpc2Vhc2VNb2RlbFN0YXRlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKSA8ZW0+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbDwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBQb3B1bGF0aW9uTW9kZWxMYWJlbCBwb3B1bGF0aW9uTW9kZWxMYWJlbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGlzZWFzZU1vZGVsTGFiZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBkb3VibGUgZ2V0RGlzZWFzZURlYXRocygpIHsKKwkJcmV0dXJuIGdldEN1cnJlbnREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCkuZ2V0RGlzZWFzZURlYXRocygpOworCX0gLy8gZ2V0RGlzZWFzZURlYXRocworCisJcHVibGljIHZvaWQgc2V0RGlzZWFzZURlYXRocyhmaW5hbCBkb3VibGUgZCkgeworCQlnZXRDdXJyZW50RGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpLnNldERpc2Vhc2VEZWF0aHMoZCk7CisJfSAvLyBzZXREaXNlYXNlRGVhdGhzCisKKworCXB1YmxpYyBkb3VibGUgZ2V0TmV4dERpc2Vhc2VEZWF0aHMoKSB7CisJCXJldHVybiBnZXROZXh0RGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpLmdldERpc2Vhc2VEZWF0aHMoKTsKKwl9IC8vIGdldE5leHREaXNlYXNlRGVhdGhzCisKKwlwdWJsaWMgdm9pZCBzZXROZXh0RGlzZWFzZURlYXRocyhmaW5hbCBkb3VibGUgZCkgeworCQlnZXROZXh0RGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpLnNldERpc2Vhc2VEZWF0aHMoZCk7CisJfSAvLyBzZXROZXh0RGlzZWFzZURlYXRocworCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLkRJU0VBU0VfTU9ERUxfTEFCRUw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQb3B1bGF0aW9uTGFiZWwgZ2V0UG9wdWxhdGlvbkxhYmVsKCkgeworCQlpZiAocG9wdWxhdGlvbkxhYmVsICE9IG51bGwgJiYgcG9wdWxhdGlvbkxhYmVsLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRQb3B1bGF0aW9uTGFiZWwgPSAoSW50ZXJuYWxFT2JqZWN0KXBvcHVsYXRpb25MYWJlbDsKKwkJCXBvcHVsYXRpb25MYWJlbCA9IChQb3B1bGF0aW9uTGFiZWwpZVJlc29sdmVQcm94eShvbGRQb3B1bGF0aW9uTGFiZWwpOworCQkJaWYgKHBvcHVsYXRpb25MYWJlbCAhPSBvbGRQb3B1bGF0aW9uTGFiZWwpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9MQUJFTCwgb2xkUG9wdWxhdGlvbkxhYmVsLCBwb3B1bGF0aW9uTGFiZWwpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcG9wdWxhdGlvbkxhYmVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUG9wdWxhdGlvbkxhYmVsIGJhc2ljR2V0UG9wdWxhdGlvbkxhYmVsKCkgeworCQlyZXR1cm4gcG9wdWxhdGlvbkxhYmVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5ld1BvcHVsYXRpb25MYWJlbAorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQb3B1bGF0aW9uTGFiZWwoUG9wdWxhdGlvbkxhYmVsIG5ld1BvcHVsYXRpb25MYWJlbCkgeworCQlQb3B1bGF0aW9uTGFiZWwgb2xkUG9wdWxhdGlvbkxhYmVsID0gcG9wdWxhdGlvbkxhYmVsOworCQlwb3B1bGF0aW9uTGFiZWwgPSBuZXdQb3B1bGF0aW9uTGFiZWw7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX0xBQkVMLCBvbGRQb3B1bGF0aW9uTGFiZWwsIHBvcHVsYXRpb25MYWJlbCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGlzZWFzZU1vZGVsU3RhdGUgZ2V0RGlzZWFzZU1vZGVsU3RhdGUoKSB7CisJCXJldHVybiBkaXNlYXNlTW9kZWxTdGF0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuZXdEaXNlYXNlTW9kZWxTdGF0ZQorCSAqIEBwYXJhbSBtc2dzCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREaXNlYXNlTW9kZWxTdGF0ZShEaXNlYXNlTW9kZWxTdGF0ZSBuZXdEaXNlYXNlTW9kZWxTdGF0ZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlEaXNlYXNlTW9kZWxTdGF0ZSBvbGREaXNlYXNlTW9kZWxTdGF0ZSA9IGRpc2Vhc2VNb2RlbFN0YXRlOworCQlkaXNlYXNlTW9kZWxTdGF0ZSA9IG5ld0Rpc2Vhc2VNb2RlbFN0YXRlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9MQUJFTF9fRElTRUFTRV9NT0RFTF9TVEFURSwgb2xkRGlzZWFzZU1vZGVsU3RhdGUsIG5ld0Rpc2Vhc2VNb2RlbFN0YXRlKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuZXdEaXNlYXNlTW9kZWxTdGF0ZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREaXNlYXNlTW9kZWxTdGF0ZShEaXNlYXNlTW9kZWxTdGF0ZSBuZXdEaXNlYXNlTW9kZWxTdGF0ZSkgeworCQlpZiAobmV3RGlzZWFzZU1vZGVsU3RhdGUgIT0gZGlzZWFzZU1vZGVsU3RhdGUpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGRpc2Vhc2VNb2RlbFN0YXRlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRpc2Vhc2VNb2RlbFN0YXRlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9TVEFURV9fTEFCRUwsIERpc2Vhc2VNb2RlbFN0YXRlLmNsYXNzLCBtc2dzKTsKKwkJCWlmIChuZXdEaXNlYXNlTW9kZWxTdGF0ZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdEaXNlYXNlTW9kZWxTdGF0ZSkuZUludmVyc2VBZGQodGhpcywgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfU1RBVEVfX0xBQkVMLCBEaXNlYXNlTW9kZWxTdGF0ZS5jbGFzcywgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXREaXNlYXNlTW9kZWxTdGF0ZShuZXdEaXNlYXNlTW9kZWxTdGF0ZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9MQUJFTF9fRElTRUFTRV9NT0RFTF9TVEFURSwgbmV3RGlzZWFzZU1vZGVsU3RhdGUsIG5ld0Rpc2Vhc2VNb2RlbFN0YXRlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBvcHVsYXRpb25Nb2RlbExhYmVsIGdldFBvcHVsYXRpb25Nb2RlbExhYmVsKCkgeworCQlpZiAocG9wdWxhdGlvbk1vZGVsTGFiZWwgIT0gbnVsbCAmJiBwb3B1bGF0aW9uTW9kZWxMYWJlbC5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkUG9wdWxhdGlvbk1vZGVsTGFiZWwgPSAoSW50ZXJuYWxFT2JqZWN0KXBvcHVsYXRpb25Nb2RlbExhYmVsOworCQkJcG9wdWxhdGlvbk1vZGVsTGFiZWwgPSAoUG9wdWxhdGlvbk1vZGVsTGFiZWwpZVJlc29sdmVQcm94eShvbGRQb3B1bGF0aW9uTW9kZWxMYWJlbCk7CisJCQlpZiAocG9wdWxhdGlvbk1vZGVsTGFiZWwgIT0gb2xkUG9wdWxhdGlvbk1vZGVsTGFiZWwpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9NT0RFTF9MQUJFTCwgb2xkUG9wdWxhdGlvbk1vZGVsTGFiZWwsIHBvcHVsYXRpb25Nb2RlbExhYmVsKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHBvcHVsYXRpb25Nb2RlbExhYmVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQb3B1bGF0aW9uTW9kZWxMYWJlbCBiYXNpY0dldFBvcHVsYXRpb25Nb2RlbExhYmVsKCkgeworCQlyZXR1cm4gcG9wdWxhdGlvbk1vZGVsTGFiZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoUG9wdWxhdGlvbk1vZGVsTGFiZWwgbmV3UG9wdWxhdGlvbk1vZGVsTGFiZWwpIHsKKwkJUG9wdWxhdGlvbk1vZGVsTGFiZWwgb2xkUG9wdWxhdGlvbk1vZGVsTGFiZWwgPSBwb3B1bGF0aW9uTW9kZWxMYWJlbDsKKwkJcG9wdWxhdGlvbk1vZGVsTGFiZWwgPSBuZXdQb3B1bGF0aW9uTW9kZWxMYWJlbDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfTEFCRUxfX1BPUFVMQVRJT05fTU9ERUxfTEFCRUwsIG9sZFBvcHVsYXRpb25Nb2RlbExhYmVsLCBwb3B1bGF0aW9uTW9kZWxMYWJlbCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBnZXRDdXJyZW50RGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpIHsKKwkJcmV0dXJuIChEaXNlYXNlTW9kZWxMYWJlbFZhbHVlKWdldEN1cnJlbnRWYWx1ZSgpOyAKKwl9IC8vIGdldEN1cnJlbnREaXNlYXNlTW9kZWxMYWJlbFZhbHVlCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZ2V0TmV4dERpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKSB7CisJCXJldHVybiAoRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSlnZXROZXh0VmFsdWUoKTsKKwl9IC8vIGdldE5leHREaXNlYXNlTW9kZWxMYWJlbFZhbHVlCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvdGhlckVuZAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcGFyYW0gbXNncworCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9MQUJFTF9fRElTRUFTRV9NT0RFTF9TVEFURToKKwkJCQlpZiAoZGlzZWFzZU1vZGVsU3RhdGUgIT0gbnVsbCkKKwkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRpc2Vhc2VNb2RlbFN0YXRlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfTEFCRUxfX0RJU0VBU0VfTU9ERUxfU1RBVEUsIG51bGwsIG1zZ3MpOworCQkJCXJldHVybiBiYXNpY1NldERpc2Vhc2VNb2RlbFN0YXRlKChEaXNlYXNlTW9kZWxTdGF0ZSlvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG90aGVyRW5kCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSBtc2dzCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX19ESVNFQVNFX01PREVMX1NUQVRFOgorCQkJCXJldHVybiBiYXNpY1NldERpc2Vhc2VNb2RlbFN0YXRlKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiBMYWJlbCB0aGUgbm9kZSB3aXRoIHRoZSBkaXNlYXNlIG1vZGVsIGxhYmVsCisJICogCisJICogQHBhcmFtIGRtbAorCSAqICAgICAgICAgICAgdGhlIGRpc2Vhc2UgbW9kZWwgbGFiZWwKKwkgKiAgICAgICAgICAgIAorCSAqIEBwYXJhbSBwb3B1bGF0aW9uTW9kZWxMYWJlbAorCSAqIAkJCSAgdGhlIGR5bmFtaWMgcG9wdWxhdGlvbiBsYWJlbCBhZmZlY3RlZCBieSB0aGUgZGlzZWFzZSAoZS5nLiB3b21lbikKKwkgKiAKKwkgKiBAcGFyYW0gbm9kZQorCSAqICAgICAgICAgICAgdGhlIG5vZGUgdGhhdCBoYXMgdGhlIHBvcHVsYXRpb24gYmVpbmcgYWZmZWN0ZWQgYnkgdGhlIGRpc2Vhc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbGFiZWxOb2RlKGZpbmFsIERpc2Vhc2VNb2RlbExhYmVsIGRtbCwKKwkJCWZpbmFsIFBvcHVsYXRpb25Nb2RlbExhYmVsIHBvcHVsYXRpb25Nb2RlbExhYmVsLCBmaW5hbCBOb2RlIG5vZGUpIHsKKwkJZG1sLnNldFBvcHVsYXRpb25MYWJlbChwb3B1bGF0aW9uTW9kZWxMYWJlbC5nZXRQb3B1bGF0aW9uTGFiZWwoKSk7CisJCWRtbC5zZXRQb3B1bGF0aW9uTW9kZWxMYWJlbChwb3B1bGF0aW9uTW9kZWxMYWJlbCk7CisJCW5vZGUuZ2V0TGFiZWxzKCkuYWRkKGRtbCk7CisJfSAvLyBsYWJlbE5vZGUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSByZXNvbHZlCisJICogQHBhcmFtIGNvcmVUeXBlCisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX0xBQkVMOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UG9wdWxhdGlvbkxhYmVsKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0UG9wdWxhdGlvbkxhYmVsKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX19ESVNFQVNFX01PREVMX1NUQVRFOgorCQkJCXJldHVybiBnZXREaXNlYXNlTW9kZWxTdGF0ZSgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9NT0RFTF9MQUJFTDoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFBvcHVsYXRpb25Nb2RlbExhYmVsKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcGFyYW0gbmV3VmFsdWUKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfTEFCRUxfX1BPUFVMQVRJT05fTEFCRUw6CisJCQkJc2V0UG9wdWxhdGlvbkxhYmVsKChQb3B1bGF0aW9uTGFiZWwpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfTEFCRUxfX0RJU0VBU0VfTU9ERUxfU1RBVEU6CisJCQkJc2V0RGlzZWFzZU1vZGVsU3RhdGUoKERpc2Vhc2VNb2RlbFN0YXRlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX01PREVMX0xBQkVMOgorCQkJCXNldFBvcHVsYXRpb25Nb2RlbExhYmVsKChQb3B1bGF0aW9uTW9kZWxMYWJlbCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX0xBQkVMOgorCQkJCXNldFBvcHVsYXRpb25MYWJlbCgoUG9wdWxhdGlvbkxhYmVsKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfTEFCRUxfX0RJU0VBU0VfTU9ERUxfU1RBVEU6CisJCQkJc2V0RGlzZWFzZU1vZGVsU3RhdGUoKERpc2Vhc2VNb2RlbFN0YXRlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfTEFCRUxfX1BPUFVMQVRJT05fTU9ERUxfTEFCRUw6CisJCQkJc2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKFBvcHVsYXRpb25Nb2RlbExhYmVsKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX0xBQkVMOgorCQkJCXJldHVybiBwb3B1bGF0aW9uTGFiZWwgIT0gbnVsbDsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfTEFCRUxfX0RJU0VBU0VfTU9ERUxfU1RBVEU6CisJCQkJcmV0dXJuIGRpc2Vhc2VNb2RlbFN0YXRlICE9IG51bGw7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX01PREVMX0xBQkVMOgorCQkJCXJldHVybiBwb3B1bGF0aW9uTW9kZWxMYWJlbCAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkR5bmFtaWNOb2RlTGFiZWxJbXBsI3NhbmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5zYW5lKCk7CisKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBkaXNlYXNlTW9kZWxTdGF0ZSAhPSBudWxsID8gZGlzZWFzZU1vZGVsU3RhdGUKKwkJCQkuc2FuZSgpIDogdHJ1ZTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHNhbmUKKworfSAvLyBEaXNlYXNlTW9kZWxMYWJlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWY4MDZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNDA4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxWYWx1ZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzZWFzZSBNb2RlbCBMYWJlbCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUltcGwjZ2V0RGlzZWFzZURlYXRocyA8ZW0+RGlzZWFzZSBEZWF0aHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWVJbXBsI2dldFBvcHVsYXRpb25Db3VudCA8ZW0+UG9wdWxhdGlvbiBDb3VudDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUltcGwjZ2V0SW5jaWRlbmNlIDxlbT5JbmNpZGVuY2U8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbCBleHRlbmRzIExhYmVsVmFsdWVJbXBsCisJCWltcGxlbWVudHMgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc2Vhc2VEZWF0aHMoKSA8ZW0+RGlzZWFzZSBEZWF0aHM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREaXNlYXNlRGVhdGhzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBESVNFQVNFX0RFQVRIU19FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc2Vhc2VEZWF0aHMoKSA8ZW0+RGlzZWFzZSBEZWF0aHM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREaXNlYXNlRGVhdGhzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIGRpc2Vhc2VEZWF0aHMgPSBESVNFQVNFX0RFQVRIU19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3B1bGF0aW9uQ291bnQoKSA8ZW0+UG9wdWxhdGlvbiBDb3VudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25Db3VudCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgUE9QVUxBVElPTl9DT1VOVF9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmNpZGVuY2UoKSA8ZW0+SW5jaWRlbmNlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbmNpZGVuY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIElOQ0lERU5DRV9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY2lkZW5jZSgpIDxlbT5JbmNpZGVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEluY2lkZW5jZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBpbmNpZGVuY2UgPSBJTkNJREVOQ0VfRURFRkFVTFQ7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBBQlNfVE9MRVJBTkNFID0gMUUtMTI7IC8vIGZpeCBoYXJkY29kZWQ/CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2VzIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorCSAqIAorCSAqIEBwYXJhbSBiaXJ0aHMKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYmlydGhzIHRoYXQgaGF2ZSBvY2N1cmVkIGluIHRoZSBwb3B1bGF0aW9uCisJICogQHBhcmFtIGRlYXRocworCSAqICAgICAgICAgICAgdGhlIHRvdGFsIG51bWJlciBvZiBkZWF0aHMgdGhhdCBoYXZlIG9jY3VyZWQgaW4gdGhlIHBvcHVsYXRpb24KKwkgKiBAcGFyYW0gZGlzZWFzZURlYXRocworCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBkZWF0aHMgZHVlIHRvIHRoZSBkaXNlYXNlIHRoYXQgaGF2ZSBvY2N1cmVkIGluCisJICogICAgICAgICAgICB0aGUgcG9wdWxhdGlvbgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqLworCXByb3RlY3RlZCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbChmaW5hbCBkb3VibGUgZGlzZWFzZURlYXRocykgeworCQl0aGlzLmRpc2Vhc2VEZWF0aHMgPSBkaXNlYXNlRGVhdGhzOworCX0gLy8gRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUltcGwKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRQb3B1bGF0aW9uQ291bnQoKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0SW5jaWRlbmNlKCkgeworCQlyZXR1cm4gaW5jaWRlbmNlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluY2lkZW5jZShkb3VibGUgbmV3SW5jaWRlbmNlKSB7CisJCWRvdWJsZSBvbGRJbmNpZGVuY2UgPSBpbmNpZGVuY2U7CisJCWluY2lkZW5jZSA9IG5ld0luY2lkZW5jZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfX0lOQ0lERU5DRSwgb2xkSW5jaWRlbmNlLCBpbmNpZGVuY2UpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJYWJzdHJhY3QgcHVibGljIHZvaWQgemVyb091dFBvcHVsYXRpb25Db3VudCgpOworCisJcHJpdmF0ZSBNYXA8Tm9kZSwgRG91YmxlPmFycml2YWxzOworCXByaXZhdGUgTWFwPE5vZGUsIERvdWJsZT5kZXBhcnR1cmVzOworCS8qKgorCSAqCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgTWFwPE5vZGUsIERvdWJsZT4gZ2V0QXJyaXZhbHMoKSB7CisJCWlmKGFycml2YWxzID09IG51bGwpIGFycml2YWxzID0gbmV3IEhhc2hNYXA8Tm9kZSwgRG91YmxlPigpOworCQlyZXR1cm4gYXJyaXZhbHM7CisJfQorCisJLyoqCisJICoKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBNYXA8Tm9kZSwgRG91YmxlPiBnZXREZXBhcnR1cmVzKCkgeworCQlpZihkZXBhcnR1cmVzID09IG51bGwpIGRlcGFydHVyZXMgPSBuZXcgSGFzaE1hcDxOb2RlLCBEb3VibGU+KCk7CisJCXJldHVybiBkZXBhcnR1cmVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldERpc2Vhc2VEZWF0aHMoKSB7CisJCXJldHVybiBkaXNlYXNlRGVhdGhzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5ld0Rpc2Vhc2VEZWF0aHMKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RGlzZWFzZURlYXRocyhkb3VibGUgbmV3RGlzZWFzZURlYXRocykgeworCQlkb3VibGUgb2xkRGlzZWFzZURlYXRocyA9IGRpc2Vhc2VEZWF0aHM7CisJCWRpc2Vhc2VEZWF0aHMgPSBuZXdEaXNlYXNlRGVhdGhzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fRElTRUFTRV9ERUFUSFMsIG9sZERpc2Vhc2VEZWF0aHMsIGRpc2Vhc2VEZWF0aHMpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZQorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHNldChEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHZhbHVlKSB7CisJCXNldERpc2Vhc2VEZWF0aHModmFsdWUuZ2V0RGlzZWFzZURlYXRocygpKTsKKwkJc2V0SW5jaWRlbmNlKHZhbHVlLmdldEluY2lkZW5jZSgpKTsKKwkJcmV0dXJuIHRoaXM7CisJfSAvLyBzZXQKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgYWRkKERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgdmFsdWUpIHsKKwkJcmV0dXJuIHRoaXM7CisJfSAvLyBhZGQKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgc3ViKERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgdmFsdWUpIHsKKwkJcmV0dXJuIHRoaXM7CisJfSAvLyBzdWIKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBzY2FsZShkb3VibGUgc2NhbGVGYWN0b3IpIHsKKwkJcmV0dXJuIHRoaXM7CisJfSAvLyBzY2FsZQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxWYWx1ZUltcGwjcmVzZXQoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlzdXBlci5yZXNldCgpOworCQlzZXREaXNlYXNlRGVhdGhzKERJU0VBU0VfREVBVEhTX0VERUZBVUxUKTsKKwkJYXJyaXZhbHMgPSBudWxsOworCQlkZXBhcnR1cmVzID0gbnVsbDsKKwl9IC8vIHJlc2V0CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlciNzYW5lKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzYW5lKCkgeworCQlib29sZWFuIHJldFZhbHVlID0gc3VwZXIuc2FuZSgpOworCQkJCQorCQkvLyBkaXNlYXNlIGRlYXRocworCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIGRpc2Vhc2VEZWF0aHMgPj0gRElTRUFTRV9ERUFUSFNfRURFRkFVTFQ7CisJCWFzc2VydCByZXRWYWx1ZTsKKworCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIGRpc2Vhc2VEZWF0aHMgPD0gTUFYX1BPUFVMQVRJT05fVkFMVUU7CisJCWFzc2VydCByZXRWYWx1ZTsKKwkJCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgIURvdWJsZS5pc0luZmluaXRlKGRpc2Vhc2VEZWF0aHMpOworCQlhc3NlcnQgcmV0VmFsdWU7CisJCQorCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmICFEb3VibGUuaXNOYU4oZGlzZWFzZURlYXRocyk7CisJCWFzc2VydCByZXRWYWx1ZTsKKwkJCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHNhbmUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSByZXNvbHZlCisJICogQHBhcmFtIGNvcmVUeXBlCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19ESVNFQVNFX0RFQVRIUzoKKwkJCQlyZXR1cm4gZ2V0RGlzZWFzZURlYXRocygpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fUE9QVUxBVElPTl9DT1VOVDoKKwkJCQlyZXR1cm4gZ2V0UG9wdWxhdGlvbkNvdW50KCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19JTkNJREVOQ0U6CisJCQkJcmV0dXJuIGdldEluY2lkZW5jZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSBuZXdWYWx1ZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fRElTRUFTRV9ERUFUSFM6CisJCQkJc2V0RGlzZWFzZURlYXRocygoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19JTkNJREVOQ0U6CisJCQkJc2V0SW5jaWRlbmNlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fRElTRUFTRV9ERUFUSFM6CisJCQkJc2V0RGlzZWFzZURlYXRocyhESVNFQVNFX0RFQVRIU19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fSU5DSURFTkNFOgorCQkJCXNldEluY2lkZW5jZShJTkNJREVOQ0VfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19ESVNFQVNFX0RFQVRIUzoKKwkJCQlyZXR1cm4gZGlzZWFzZURlYXRocyAhPSBESVNFQVNFX0RFQVRIU19FREVGQVVMVDsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfX1BPUFVMQVRJT05fQ09VTlQ6CisJCQkJcmV0dXJuIGdldFBvcHVsYXRpb25Db3VudCgpICE9IFBPUFVMQVRJT05fQ09VTlRfRURFRkFVTFQ7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19JTkNJREVOQ0U6CisJCQkJcmV0dXJuIGluY2lkZW5jZSAhPSBJTkNJREVOQ0VfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpCisJCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiKEREOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGRpc2Vhc2VEZWF0aHMpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9IC8vIHRvU3RyaW5nCisKK30gLy8gRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvRGlzZWFzZU1vZGVsU3RhdGVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL0Rpc2Vhc2VNb2RlbFN0YXRlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NmE2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL0Rpc2Vhc2VNb2RlbFN0YXRlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjY3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzZWFzZSBNb2RlbCBTdGF0ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuRGlzZWFzZU1vZGVsU3RhdGVJbXBsI2dldExhYmVsIDxlbT5MYWJlbDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIERpc2Vhc2VNb2RlbFN0YXRlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMKKwkJRGlzZWFzZU1vZGVsU3RhdGUgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGlzZWFzZU1vZGVsU3RhdGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5ESVNFQVNFX01PREVMX1NUQVRFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWwgZ2V0TGFiZWwoKSB7CisJCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgIT0gU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfU1RBVEVfX0xBQkVMKSByZXR1cm4gbnVsbDsKKwkJcmV0dXJuIChEaXNlYXNlTW9kZWxMYWJlbCllQ29udGFpbmVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmV3TGFiZWwKKwkgKiBAcGFyYW0gbXNncworCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TGFiZWwoRGlzZWFzZU1vZGVsTGFiZWwgbmV3TGFiZWwsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0xhYmVsLCBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9TVEFURV9fTEFCRUwsIG1zZ3MpOworCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuZXdMYWJlbAorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChEaXNlYXNlTW9kZWxMYWJlbCBuZXdMYWJlbCkgeworCQlpZiAobmV3TGFiZWwgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQoKSAhPSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9TVEFURV9fTEFCRUwgJiYgbmV3TGFiZWwgIT0gbnVsbCkpIHsKKwkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdMYWJlbCkpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCisJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7CisJCQlpZiAobmV3TGFiZWwgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TGFiZWwpLmVJbnZlcnNlQWRkKHRoaXMsIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX19ESVNFQVNFX01PREVMX1NUQVRFLCBEaXNlYXNlTW9kZWxMYWJlbC5jbGFzcywgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRMYWJlbChuZXdMYWJlbCwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9TVEFURV9fTEFCRUwsIG5ld0xhYmVsLCBuZXdMYWJlbCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG90aGVyRW5kCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSBtc2dzCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX1NUQVRFX19MQUJFTDoKKwkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKKwkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7CisJCQkJcmV0dXJuIGJhc2ljU2V0TGFiZWwoKERpc2Vhc2VNb2RlbExhYmVsKW90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb3RoZXJFbmQKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogQHBhcmFtIG1zZ3MKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfU1RBVEVfX0xBQkVMOgorCQkJCXJldHVybiBiYXNpY1NldExhYmVsKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBtc2dzCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQoKSkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9TVEFURV9fTEFCRUw6CisJCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX19ESVNFQVNFX01PREVMX1NUQVRFLCBEaXNlYXNlTW9kZWxMYWJlbC5jbGFzcywgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSByZXNvbHZlCisJICogQHBhcmFtIGNvcmVUeXBlCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX1NUQVRFX19MQUJFTDoKKwkJCQlyZXR1cm4gZ2V0TGFiZWwoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcGFyYW0gbmV3VmFsdWUKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfU1RBVEVfX0xBQkVMOgorCQkJCXNldExhYmVsKChEaXNlYXNlTW9kZWxMYWJlbCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX1NUQVRFX19MQUJFTDoKKwkJCQlzZXRMYWJlbCgoRGlzZWFzZU1vZGVsTGFiZWwpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfU1RBVEVfX0xBQkVMOgorCQkJCXJldHVybiBnZXRMYWJlbCgpICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpCisJCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIjc2FuZSgpCisJICovCisJcHVibGljIGJvb2xlYW4gc2FuZSgpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHNhbmUKKworfSAvLyBEaXNlYXNlTW9kZWxTdGF0ZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvSW5mZWN0b3JJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL0luZmVjdG9ySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYjYzMjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL0luZmVjdG9ySW1wbC5qYXZhCkBAIC0wLDAgKzEsNzU1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5VdGlsaXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLk5vZGVEZWNvcmF0b3JJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuaW1wbC5SZWdpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbmZlY3RvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuSW5mZWN0b3JJbXBsI2dldERpc2Vhc2VNb2RlbCA8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuSW5mZWN0b3JJbXBsI2dldFRhcmdldFVSSSA8ZW0+VGFyZ2V0IFVSSTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuSW5mZWN0b3JJbXBsI2dldERpc2Vhc2VOYW1lIDxlbT5EaXNlYXNlIE5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkluZmVjdG9ySW1wbCNnZXRUYXJnZXRJU09LZXkgPGVtPlRhcmdldCBJU08gS2V5PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5JbmZlY3RvckltcGwjZ2V0TGFiZWxzVG9JbmZlY3QgPGVtPkxhYmVscyBUbyBJbmZlY3Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkluZmVjdG9ySW1wbCNnZXRQb3B1bGF0aW9uSWRlbnRpZmllciA8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5JbmZlY3RvckltcGwjaXNJbmZlY3RQZXJjZW50YWdlIDxlbT5JbmZlY3QgUGVyY2VudGFnZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEluZmVjdG9ySW1wbCBleHRlbmRzIE5vZGVEZWNvcmF0b3JJbXBsIGltcGxlbWVudHMKKwkJSW5mZWN0b3IgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc2Vhc2VNb2RlbCgpIDxlbT5EaXNlYXNlIE1vZGVsPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGlzZWFzZU1vZGVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RhbmRhcmREaXNlYXNlTW9kZWwgZGlzZWFzZU1vZGVsOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldFVSSSgpIDxlbT5UYXJnZXQgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGFyZ2V0VVJJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVSSSBUQVJHRVRfVVJJX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldFVSSSgpIDxlbT5UYXJnZXQgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGFyZ2V0VVJJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVVJJIHRhcmdldFVSSSA9IFRBUkdFVF9VUklfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzZWFzZU5hbWUoKSA8ZW0+RGlzZWFzZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGlzZWFzZU5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0VBU0VfTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNlYXNlTmFtZSgpIDxlbT5EaXNlYXNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREaXNlYXNlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBkaXNlYXNlTmFtZSA9IERJU0VBU0VfTkFNRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRJU09LZXkoKSA8ZW0+VGFyZ2V0IElTTyBLZXk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUYXJnZXRJU09LZXkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9JU09fS0VZX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldElTT0tleSgpIDxlbT5UYXJnZXQgSVNPIEtleTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRhcmdldElTT0tleSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRJU09LZXkgPSBUQVJHRVRfSVNPX0tFWV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhYmVsc1RvSW5mZWN0KCkgPGVtPkxhYmVscyBUbyBJbmZlY3Q8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TGFiZWxzVG9JbmZlY3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxEaXNlYXNlTW9kZWxMYWJlbD4gbGFiZWxzVG9JbmZlY3Q7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSA8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9QVUxBVElPTl9JREVOVElGSUVSX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkgPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgcG9wdWxhdGlvbklkZW50aWZpZXIgPSBQT1BVTEFUSU9OX0lERU5USUZJRVJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbmZlY3RQZXJjZW50YWdlKCkgPGVtPkluZmVjdCBQZXJjZW50YWdlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0luZmVjdFBlcmNlbnRhZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJTkZFQ1RfUEVSQ0VOVEFHRV9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbmZlY3RQZXJjZW50YWdlKCkgPGVtPkluZmVjdCBQZXJjZW50YWdlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0luZmVjdFBlcmNlbnRhZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGluZmVjdFBlcmNlbnRhZ2UgPSBJTkZFQ1RfUEVSQ0VOVEFHRV9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSW5mZWN0b3JJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbCNkZWNvcmF0ZUdyYXBoKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBkZWNvcmF0ZUdyYXBoKFNURU1UaW1lIHRpbWUpIHsKKwkJaWYodGhpcy5pc0dyYXBoRGVjb3JhdGVkKCkpIHJldHVybiB0cnVlOworCQlHcmFwaCBncmFwaCA9IGdldEdyYXBoKCk7CisJCWlmKGdyYXBoID09IG51bGwgJiYgdGhpcy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uKSAvLyBNaWdodCBiZSBwYXJ0IG9mIGEgY29sbGVjdGlvbgorCQkJZ3JhcGggPSAoKE5vZGVEZWNvcmF0b3IpZUNvbnRhaW5lcigpKS5nZXRHcmFwaCgpOworCQkKKwkJLy8gRG8gd2UgbmVlZCB0byBsb29rIHVwIHRoZSBkaXNlYXNlIG1vZGVsIGZyb20gaXRzIG5hbWU/CisJCWlmIChkaXNlYXNlTW9kZWwgPT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQkvLyBUaGVyZSdzIGEgZGlzZWFzZSBtb2RlbCBvdXQgdGhlcmUgd2l0aCBvdXIgbmFtZSBvbiBpdAorCQkJLy8gKG1heWJlKS4uLmxldCdzIGZpbmQgaXQKKwkJCWZvciAoSXRlcmF0b3I8RGVjb3JhdG9yPiBkZWNvcmF0b3JJdGVyID0gZ3JhcGguZ2V0RGVjb3JhdG9ycygpLml0ZXJhdG9yKCk7IGRlY29yYXRvckl0ZXIKKwkJCQkJLmhhc05leHQoKTspIHsKKwkJCQlmaW5hbCBEZWNvcmF0b3IgZGVjb3JhdG9yID0gZGVjb3JhdG9ySXRlci5uZXh0KCk7CisJCQkJLy8gRGlzZWFzZSBNb2RlbD8KKwkJCQlpZiAoZGVjb3JhdG9yIGluc3RhbmNlb2YgU3RhbmRhcmREaXNlYXNlTW9kZWwpIHsKKwkJCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWwgZGlzZWFzZU1vZGVsID0gKFN0YW5kYXJkRGlzZWFzZU1vZGVsKSBkZWNvcmF0b3I7CisJCQkJCS8vIElzIHRoaXMgdGhlIG9uZSB3ZSdyZSBsb29raW5nIGZvcj8KKwkJCQkJaWYgKGRpc2Vhc2VNb2RlbC5nZXREaXNlYXNlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoCisJCQkJCQkJZ2V0RGlzZWFzZU5hbWUoKSkpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJdGhpcy5kaXNlYXNlTW9kZWwgPSBkaXNlYXNlTW9kZWw7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0gLy8gZm9yIGVhY2ggZGVjb3JhdG9yCisJCX0gLy8gaWYgbG9vayB1cCBkaXNlYXNlIG1vZGVsCisKKwkJLy8gRGlkIHdlIGZpbmQgdGhlIGRpc2Vhc2UgbW9kZWwgd2UncmUgc3VwcG9zZSB0byB3b3JrIGZvcj8KKwkJaWYgKGRpc2Vhc2VNb2RlbCAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCS8vIE5vdyB0cnkgdG8gZmluZCB0aGUgbm9kZSB0byBiZSBpbmZlY3RlZAorCQkJZmluYWwgTm9kZSBwYXJlbnQgPSBncmFwaC5nZXROb2RlKGdldFRhcmdldFVSSSgpKTsKKwkJCQorCQkJU2V0PE5vZGU+IGFsbE5vZGVzID0gbnVsbDsKKwkJCQorCQkJaWYodGhpcy5pc0luZmVjdFBlcmNlbnRhZ2UoKSkgeworCQkJCWFsbE5vZGVzID0gZ2V0QWxsQ2hpbGRyZW4ocGFyZW50KTsJCisJCQkJYWxsTm9kZXMuYWRkKHBhcmVudCk7CisJCQl9IGVsc2UgeworCQkJCWFsbE5vZGVzID0gbmV3IEhhc2hTZXQ8Tm9kZT4oKTsKKwkJCQlhbGxOb2Rlcy5hZGQocGFyZW50KTsKKwkJCX0JCQkKKworCQkJSXRlcmF0b3I8Tm9kZT4gaXRlciA9IGFsbE5vZGVzLml0ZXJhdG9yKCk7CisJCQl3aGlsZShpdGVyIT1udWxsICYmIGl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJCU5vZGUgbm9kZSA9IGl0ZXIubmV4dCgpOworCQkJCisJCQkJCS8vIERpZCB3ZSBmaW5kIHRoZSBOb2RlPworCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCWZvciAoZmluYWwgSXRlcmF0b3I8Tm9kZUxhYmVsPiBsYWJlbEl0ZXIgPSBub2RlLmdldExhYmVscygpLml0ZXJhdG9yKCk7IGxhYmVsSXRlcgorCQkJCQkJCQkuaGFzTmV4dCgpOykgeworCQkJCQkJCWZpbmFsIE5vZGVMYWJlbCBub2RlTGFiZWwgPSBsYWJlbEl0ZXIubmV4dCgpOworCQkJCQkJCS8vIElzIHRoaXMgYSBkaXNlYXNlIGxhYmVsPworCQkJCQkJCWlmIChub2RlTGFiZWwgaW5zdGFuY2VvZiBEaXNlYXNlTW9kZWxMYWJlbCkgeworCQkJCQkJCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTW9kZWxMYWJlbCA9IChEaXNlYXNlTW9kZWxMYWJlbCkgbm9kZUxhYmVsOworCQkJCQkJCQkvLyBZZXMKKwkJCQkJCQkJLy8gSXMgaXQgdXBkYXRlZCBieSB0aGlzIGRpc2Vhc2UgbW9kZWw/CisJCQkJCQkJCWlmIChkaXNlYXNlTW9kZWxMYWJlbC5nZXREZWNvcmF0b3IoKSA9PSBkaXNlYXNlTW9kZWwgJiYgZGlzZWFzZU1vZGVsTGFiZWwuZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpLmVxdWFscyh0aGlzLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkpKSB7CisJCQkJCQkJCQkvLyBZZXMKKwkJCQkJCQkJCWRvSW5pdGlhbGl6YXRpb24oZGlzZWFzZU1vZGVsTGFiZWwpOworCQkJCQkJCQkJZ2V0TGFiZWxzVG9JbmZlY3QoKS5hZGQoZGlzZWFzZU1vZGVsTGFiZWwpOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0gLy8gaWYKKwkJCQkJCQl9CisJCQkJCQl9IC8vIGZvcgorCQkJCQl9IC8vIGlmIG5vZGUgdG8gaW5mZWN0IHdhcyBmb3VuZAorCQkJCWVsc2UgeworCQkJCQkvLyBObworCQkJCQkvLyBUaGUgdGFyZ2V0IFVSSSB3YXMgcHJvYmFibHkgYmFkCisJCQkJCUFjdGl2YXRvci5sb2dFcnJvcigiVGhlIG5vZGUgdG8gaW5mZWN0IHNwZWNpZmllZCBieSB0aGUgVVJJIFwiIgorCQkJCQkJCSsgZ2V0VGFyZ2V0VVJJKCkKKwkJCQkJCQkrICJcIiB3YXMgbm90IGZvdW5kLiAgVGhlIFVSSSBpcyBsaWtlbHkgaW5jb3JyZWN0LiIsCisJCQkJCQkJbnVsbCk7CisJCQkJfSAvLyBlbHNlIG5vZGUgbm90IGZvdW5kCisJCQl9IC8vIGZvciBlYWNoIG5vZGUKKwkJfSAvLyBpZiBkaXNlYXNlIG1vZGVsIGZvdW5kCisJCWVsc2UgeworCQkJLy8gTm8KKwkJCS8vIFRoZSBkaXNlYXNlIG5hbWUgd2FzIHByb2JhYmx5IHdyb25nCisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlRoZSBkaXNlYXNlIG5hbWVkIFwiIiArIGRpc2Vhc2VOYW1lCisJCQkJCSsgIlwiIHdhcyBub3QgZm91bmQuIiwgbnVsbCk7CisJCX0gLy8gZWxzZSBub2RlIG5vdCBmb3VuZAorCisJCXRoaXMuc2V0UHJvZ3Jlc3MoMS4wKTsgLy8gd2UncmUgZG9uZQorCQlyZXR1cm4gdHJ1ZTsKKwl9IC8vIGRlY29yYXRlR3JhcGgKKworCS8qKgorCSAqIHRoaXMgbWV0aG9kIGNvbmZpcm1zIHRoYXQgc3BlY2lmaWMgVVJJcyBkZWZpbmVkIGluIGFuIGluZmVjdG9yIGFyZSBhY3R1YWxseSAKKwkgKiB2YWxpZCBVUklzIHdpdGhpbiB0aGUgZ3JhcGguIElzc3VlIGEgd2FybmluZyBvbiBzdGFydHVwIGlmIHRoZXkgYXJlIG5vdC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjaGVja0luZmVjdG9yVVJJcygpIHsKKwkJCisJCVVSSSB0YXJnZXQgPSBnZXRUYXJnZXRVUkkoKTsKKwkJCisJCWlmKHRhcmdldCE9bnVsbCkgeworCQkJR3JhcGggZyA9IHRoaXMuZ2V0R3JhcGgoKTsKKwkJCUVNYXA8VVJJLE5vZGU+IG5vZGVNYXAgPSBnLmdldE5vZGVzKCk7CisJCQlpZighbm9kZU1hcC5rZXlTZXQoKS5jb250YWlucyh0YXJnZXQpKSB7CisJCQkJVXRpbGl0eS5kaXNwbGF5U2NlbmFyaW9Db21wb3NpdGlvbldhcm5pbmcoVXRpbGl0eS5VUklfV0FSTklORyk7CisJCQl9CisJCX0KKwl9Ly8gdmFsaWRhdGUgaW5mZWN0b3JzCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5EZWNvcmF0b3JJbXBsI3Jlc2V0TGFiZWxzKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNldExhYmVscygpIHsKKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxEaXNlYXNlTW9kZWxMYWJlbD4gbm9kZUl0ZXIgPSBnZXRMYWJlbHNUb0luZmVjdCgpLml0ZXJhdG9yKCk7IG5vZGVJdGVyCisJCQkJLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VNb2RlbExhYmVsID0gbm9kZUl0ZXIubmV4dCgpOworCQkJZG9Jbml0aWFsaXphdGlvbihkaXNlYXNlTW9kZWxMYWJlbCk7CisJCX0gLy8gZm9yCisJfSAvLyByZXNldExhYmVscworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5EZWNvcmF0b3JJbXBsI3VwZGF0ZUxhYmVscyhvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgsCisJICogICAgICBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIGxvbmcpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlTGFiZWxzKFNURU1UaW1lIHRpbWUsIGxvbmcgdGltZXJQZXJpb2QsIGludCBjeWNsZSkgeworCQkvLyBEbyBub3RoaW5nCisJfSAvLyB1cGRhdGVMYWJlbHMKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5JTkZFQ1RPUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0YW5kYXJkRGlzZWFzZU1vZGVsIGdldERpc2Vhc2VNb2RlbCgpIHsKKwkJaWYgKGRpc2Vhc2VNb2RlbCAhPSBudWxsICYmIGRpc2Vhc2VNb2RlbC5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkRGlzZWFzZU1vZGVsID0gKEludGVybmFsRU9iamVjdClkaXNlYXNlTW9kZWw7CisJCQlkaXNlYXNlTW9kZWwgPSAoU3RhbmRhcmREaXNlYXNlTW9kZWwpZVJlc29sdmVQcm94eShvbGREaXNlYXNlTW9kZWwpOworCQkJaWYgKGRpc2Vhc2VNb2RlbCAhPSBvbGREaXNlYXNlTW9kZWwpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfX0RJU0VBU0VfTU9ERUwsIG9sZERpc2Vhc2VNb2RlbCwgZGlzZWFzZU1vZGVsKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGRpc2Vhc2VNb2RlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0YW5kYXJkRGlzZWFzZU1vZGVsIGJhc2ljR2V0RGlzZWFzZU1vZGVsKCkgeworCQlyZXR1cm4gZGlzZWFzZU1vZGVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5ld0Rpc2Vhc2VNb2RlbAorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgc2V0RGlzZWFzZU1vZGVsKFN0YW5kYXJkRGlzZWFzZU1vZGVsIG5ld0Rpc2Vhc2VNb2RlbCkgeworCQlTdGFuZGFyZERpc2Vhc2VNb2RlbCBvbGREaXNlYXNlTW9kZWwgPSBkaXNlYXNlTW9kZWw7CisJCWRpc2Vhc2VNb2RlbCA9IG5ld0Rpc2Vhc2VNb2RlbDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKKwkJCQkJU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX19ESVNFQVNFX01PREVMLCBvbGREaXNlYXNlTW9kZWwsCisJCQkJCWRpc2Vhc2VNb2RlbCkpOworCQkKKwkJc2V0RGlzZWFzZU5hbWUoZGlzZWFzZU1vZGVsICE9IG51bGw/IGRpc2Vhc2VNb2RlbC5nZXREaXNlYXNlTmFtZSgpOm51bGwpOworCX0gLy8gc2V0RGlzZWFzZU1vZGVsCisKKwkKKwkvKioKKwkgKiBmaW5kcyBhbGwgdGhlIGNoaWxkIG5vZGVzIG9mIGEgcGFyZW50IChkaXJlY3QgY2hpbGRyZW4gYW5kIGNoaWxkcmVuIG9mIGNoaWxkcmVuIGV0Yy4uLikKKwkgKiBhbmQgcmV0dXJucyB0aGVtIGluIGEgc2V0LiAKKwkgKiBDaGlsZCBpcyBkZWZpbmVkIGJ5IGEgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwCisJICogQHBhcmFtIHBhcmVudAorCSAqLworCXB1YmxpYyBTZXQ8Tm9kZT4gZ2V0QWxsQ2hpbGRyZW4oTm9kZSBwYXJlbnQpIHsKKwkJU2V0PE5vZGU+IGFsbENoaWxkcmVuID0gbmV3IEhhc2hTZXQ8Tm9kZT4oKTsKKwkJU2V0PE5vZGU+IHRvRG9TZXQgPSBnZXRDaGlsZFNldChwYXJlbnQpOworCQl0b0RvU2V0LnJlbW92ZShwYXJlbnQpOworCQlTZXQ8Tm9kZT4gZGlyZWN0Q2hpbGRyZW4gID0gbmV3IEhhc2hTZXQ8Tm9kZT4oKTsKKwkJCisJCXdoaWxlKHRvRG9TZXQuc2l6ZSgpID49MSkgeworCQkJZGlyZWN0Q2hpbGRyZW4uYWRkQWxsKHRvRG9TZXQpOworCQkJSXRlcmF0b3I8Tm9kZT4gaXRlciA9IGRpcmVjdENoaWxkcmVuLml0ZXJhdG9yKCk7CisJCQl3aGlsZShpdGVyIT1udWxsICYmIGl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJTm9kZSBuZXh0ID0gaXRlci5uZXh0KCk7CisJCQkJYWxsQ2hpbGRyZW4uYWRkKG5leHQpOworCQkJCVNldDxOb2RlPiBuZXh0U2V0ID0gZ2V0Q2hpbGRTZXQobmV4dCk7CisJCQkJbmV4dFNldC5yZW1vdmVBbGwoYWxsQ2hpbGRyZW4pOworCQkJCXRvRG9TZXQuYWRkQWxsKG5leHRTZXQpOworCQkJfQorCQkJdG9Eb1NldC5yZW1vdmVBbGwoZGlyZWN0Q2hpbGRyZW4pOworCQkJZGlyZWN0Q2hpbGRyZW4uY2xlYXIoKTsKKwkJfQorCQlyZXR1cm4gYWxsQ2hpbGRyZW47CisJfQorCQorCQorCS8qKgorCSAqIGZpbmRzIGFsbCB0aGUgZGlyZWN0IGNoaWxkIG5vZGVzIG9mIGEgcGFyZW50IGFuZCByZXR1cm5zIHRoZW0gaW4gYSBzZXQuCisJICogQ2hpbGQgaXMgZGVmaW5lZCBieSBhIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKi8KKwlwdWJsaWMgU2V0PE5vZGU+IGdldENoaWxkU2V0KE5vZGUgcGFyZW50KSB7CisJCVNldDxOb2RlPiBjaGlsZHJlbiA9IG5ldyBIYXNoU2V0PE5vZGU+KCk7CisJCWlmKHBhcmVudCA9PSBudWxsKSByZXR1cm4gY2hpbGRyZW47CisJCVN0cmluZyBwYXJlbnRJRCA9IGdldFRhcmdldFVSSSgpLmxhc3RTZWdtZW50KCk7CisJCS8vUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUKKwkJRUxpc3Q8RWRnZT4gYWxsRWRnZXMgPSBwYXJlbnQuZ2V0RWRnZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFZGdlcy5zaXplKCk7IGkgKyspIHsKKwkJCUVkZ2UgZSA9IGFsbEVkZ2VzLmdldChpKTsKKwkJCUxhYmVsVmFsdWUgbHYgPSBlLmdldExhYmVsKCkuZ2V0Q3VycmVudFZhbHVlKCk7CisJCQlpZihsdiBpbnN0YW5jZW9mIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKSB7CisJCQkJUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgY29udGFpbm1lbnQgPSAoUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUpbHY7CisJCQkJTm9kZSBuZWlnaGJvck5vZGUgPSBlLmdldE90aGVyTm9kZShwYXJlbnQpOworCQkJCVN0cmluZyBuZWlnaGJvcklEPSBuZWlnaGJvck5vZGUuZ2V0VVJJKCkubGFzdFNlZ21lbnQoKTsKKwkJCQkvLyBpcyBpdCByZWFsbHkgYSBjaGlsZAorCQkJCWlmKG5laWdoYm9ySUQubGVuZ3RoKCkgPiBwYXJlbnRJRC5sZW5ndGgoKSkgeworCQkJCQkvL3llcworCQkJCQljaGlsZHJlbi5hZGQobmVpZ2hib3JOb2RlKTsKKwkJCQl9Ly8gaXMgY2hpbGQKKwkJCX0vLyBpcyBjb250YWlubWVudCByZWxhdGlvbnNoaXAKKwkJfS8vIGZvciBhbGwgZWRnZXMKKwkJLy9qdXN0IHRvIGJlIHN1cmUKKwkJY2hpbGRyZW4ucmVtb3ZlKHBhcmVudCk7CisJCXJldHVybiBjaGlsZHJlbjsKKwl9CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgVVJJIGdldFRhcmdldFVSSSgpIHsKKwkJLy8gSXMgaXQgc2V0PworCQlpZiAodGFyZ2V0VVJJID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQl0YXJnZXRVUkkgPSBSZWdpb25JbXBsLmNyZWF0ZVJlZ2lvbk5vZGVVUkkodGFyZ2V0SVNPS2V5KTsKKwkJfQorCQlyZXR1cm4gdGFyZ2V0VVJJOworCX0gLy8gZ2V0VGFyZ2V0VVJJCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuZXdUYXJnZXRVUkkKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VGFyZ2V0VVJJKFVSSSBuZXdUYXJnZXRVUkkpIHsKKwkJVVJJIG9sZFRhcmdldFVSSSA9IHRhcmdldFVSSTsKKwkJdGFyZ2V0VVJJID0gbmV3VGFyZ2V0VVJJOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfX1RBUkdFVF9VUkksIG9sZFRhcmdldFVSSSwgdGFyZ2V0VVJJKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGlzZWFzZU5hbWUoKSB7CisJCXJldHVybiBkaXNlYXNlTmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RGlzZWFzZU5hbWUoU3RyaW5nIG5ld0Rpc2Vhc2VOYW1lKSB7CisJCVN0cmluZyBvbGREaXNlYXNlTmFtZSA9IGRpc2Vhc2VOYW1lOworCQlkaXNlYXNlTmFtZSA9IG5ld0Rpc2Vhc2VOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfX0RJU0VBU0VfTkFNRSwgb2xkRGlzZWFzZU5hbWUsIGRpc2Vhc2VOYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0SVNPS2V5KCkgeworCQlyZXR1cm4gdGFyZ2V0SVNPS2V5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRhcmdldFVSSSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUYXJnZXRJU09LZXkoU3RyaW5nIG5ld1RhcmdldElTT0tleSkgeworCQlTdHJpbmcgb2xkVGFyZ2V0SVNPS2V5ID0gdGFyZ2V0SVNPS2V5OworCQl0YXJnZXRJU09LZXkgPSBuZXdUYXJnZXRJU09LZXk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5JTkZFQ1RPUl9fVEFSR0VUX0lTT19LRVksIG9sZFRhcmdldElTT0tleSwgdGFyZ2V0SVNPS2V5KSk7CisJCS8vIFRoaXMgd2lsbCBjYXVzZSB0aGUgVVJJIHRvIGJlIHJlY3JlYXRlZCB3aXRoIHRoZSBuZXcgSVNPIGtleQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxEaXNlYXNlTW9kZWxMYWJlbD4gZ2V0TGFiZWxzVG9JbmZlY3QoKSB7CisJCWlmIChsYWJlbHNUb0luZmVjdCA9PSBudWxsKSB7CisJCQlsYWJlbHNUb0luZmVjdCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RGlzZWFzZU1vZGVsTGFiZWw+KERpc2Vhc2VNb2RlbExhYmVsLmNsYXNzLCB0aGlzLCBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfX0xBQkVMU19UT19JTkZFQ1QpOworCQl9CisJCXJldHVybiBsYWJlbHNUb0luZmVjdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkgeworCQlyZXR1cm4gcG9wdWxhdGlvbklkZW50aWZpZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoU3RyaW5nIG5ld1BvcHVsYXRpb25JZGVudGlmaWVyKSB7CisJCVN0cmluZyBvbGRQb3B1bGF0aW9uSWRlbnRpZmllciA9IHBvcHVsYXRpb25JZGVudGlmaWVyOworCQlwb3B1bGF0aW9uSWRlbnRpZmllciA9IG5ld1BvcHVsYXRpb25JZGVudGlmaWVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfX1BPUFVMQVRJT05fSURFTlRJRklFUiwgb2xkUG9wdWxhdGlvbklkZW50aWZpZXIsIHBvcHVsYXRpb25JZGVudGlmaWVyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbmZlY3RQZXJjZW50YWdlKCkgeworCQlyZXR1cm4gaW5mZWN0UGVyY2VudGFnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbmZlY3RQZXJjZW50YWdlKGJvb2xlYW4gbmV3SW5mZWN0UGVyY2VudGFnZSkgeworCQlib29sZWFuIG9sZEluZmVjdFBlcmNlbnRhZ2UgPSBpbmZlY3RQZXJjZW50YWdlOworCQlpbmZlY3RQZXJjZW50YWdlID0gbmV3SW5mZWN0UGVyY2VudGFnZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX19JTkZFQ1RfUEVSQ0VOVEFHRSwgb2xkSW5mZWN0UGVyY2VudGFnZSwgaW5mZWN0UGVyY2VudGFnZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSByZXNvbHZlCisJICogQHBhcmFtIGNvcmVUeXBlCisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5JTkZFQ1RPUl9fRElTRUFTRV9NT0RFTDoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldERpc2Vhc2VNb2RlbCgpOworCQkJCXJldHVybiBiYXNpY0dldERpc2Vhc2VNb2RlbCgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfX1RBUkdFVF9VUkk6CisJCQkJcmV0dXJuIGdldFRhcmdldFVSSSgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfX0RJU0VBU0VfTkFNRToKKwkJCQlyZXR1cm4gZ2V0RGlzZWFzZU5hbWUoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX19UQVJHRVRfSVNPX0tFWToKKwkJCQlyZXR1cm4gZ2V0VGFyZ2V0SVNPS2V5KCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5JTkZFQ1RPUl9fTEFCRUxTX1RPX0lORkVDVDoKKwkJCQlyZXR1cm4gZ2V0TGFiZWxzVG9JbmZlY3QoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX19QT1BVTEFUSU9OX0lERU5USUZJRVI6CisJCQkJcmV0dXJuIGdldFBvcHVsYXRpb25JZGVudGlmaWVyKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5JTkZFQ1RPUl9fSU5GRUNUX1BFUkNFTlRBR0U6CisJCQkJcmV0dXJuIGlzSW5mZWN0UGVyY2VudGFnZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSBuZXdWYWx1ZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX19ESVNFQVNFX01PREVMOgorCQkJCXNldERpc2Vhc2VNb2RlbCgoU3RhbmRhcmREaXNlYXNlTW9kZWwpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX19UQVJHRVRfVVJJOgorCQkJCXNldFRhcmdldFVSSSgoVVJJKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5JTkZFQ1RPUl9fRElTRUFTRV9OQU1FOgorCQkJCXNldERpc2Vhc2VOYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX19UQVJHRVRfSVNPX0tFWToKKwkJCQlzZXRUYXJnZXRJU09LZXkoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfX0xBQkVMU19UT19JTkZFQ1Q6CisJCQkJZ2V0TGFiZWxzVG9JbmZlY3QoKS5jbGVhcigpOworCQkJCWdldExhYmVsc1RvSW5mZWN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEaXNlYXNlTW9kZWxMYWJlbD4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX19QT1BVTEFUSU9OX0lERU5USUZJRVI6CisJCQkJc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfX0lORkVDVF9QRVJDRU5UQUdFOgorCQkJCXNldEluZmVjdFBlcmNlbnRhZ2UoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfX0RJU0VBU0VfTU9ERUw6CisJCQkJc2V0RGlzZWFzZU1vZGVsKChTdGFuZGFyZERpc2Vhc2VNb2RlbCludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5JTkZFQ1RPUl9fVEFSR0VUX1VSSToKKwkJCQlzZXRUYXJnZXRVUkkoVEFSR0VUX1VSSV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfX0RJU0VBU0VfTkFNRToKKwkJCQlzZXREaXNlYXNlTmFtZShESVNFQVNFX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX19UQVJHRVRfSVNPX0tFWToKKwkJCQlzZXRUYXJnZXRJU09LZXkoVEFSR0VUX0lTT19LRVlfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX19MQUJFTFNfVE9fSU5GRUNUOgorCQkJCWdldExhYmVsc1RvSW5mZWN0KCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5JTkZFQ1RPUl9fUE9QVUxBVElPTl9JREVOVElGSUVSOgorCQkJCXNldFBvcHVsYXRpb25JZGVudGlmaWVyKFBPUFVMQVRJT05fSURFTlRJRklFUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfX0lORkVDVF9QRVJDRU5UQUdFOgorCQkJCXNldEluZmVjdFBlcmNlbnRhZ2UoSU5GRUNUX1BFUkNFTlRBR0VfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5JTkZFQ1RPUl9fRElTRUFTRV9NT0RFTDoKKwkJCQlyZXR1cm4gZGlzZWFzZU1vZGVsICE9IG51bGw7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5JTkZFQ1RPUl9fVEFSR0VUX1VSSToKKwkJCQlyZXR1cm4gVEFSR0VUX1VSSV9FREVGQVVMVCA9PSBudWxsID8gdGFyZ2V0VVJJICE9IG51bGwgOiAhVEFSR0VUX1VSSV9FREVGQVVMVC5lcXVhbHModGFyZ2V0VVJJKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX19ESVNFQVNFX05BTUU6CisJCQkJcmV0dXJuIERJU0VBU0VfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZGlzZWFzZU5hbWUgIT0gbnVsbCA6ICFESVNFQVNFX05BTUVfRURFRkFVTFQuZXF1YWxzKGRpc2Vhc2VOYW1lKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX19UQVJHRVRfSVNPX0tFWToKKwkJCQlyZXR1cm4gVEFSR0VUX0lTT19LRVlfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldElTT0tleSAhPSBudWxsIDogIVRBUkdFVF9JU09fS0VZX0VERUZBVUxULmVxdWFscyh0YXJnZXRJU09LZXkpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfX0xBQkVMU19UT19JTkZFQ1Q6CisJCQkJcmV0dXJuIGxhYmVsc1RvSW5mZWN0ICE9IG51bGwgJiYgIWxhYmVsc1RvSW5mZWN0LmlzRW1wdHkoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX19QT1BVTEFUSU9OX0lERU5USUZJRVI6CisJCQkJcmV0dXJuIFBPUFVMQVRJT05fSURFTlRJRklFUl9FREVGQVVMVCA9PSBudWxsID8gcG9wdWxhdGlvbklkZW50aWZpZXIgIT0gbnVsbCA6ICFQT1BVTEFUSU9OX0lERU5USUZJRVJfRURFRkFVTFQuZXF1YWxzKHBvcHVsYXRpb25JZGVudGlmaWVyKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX19JTkZFQ1RfUEVSQ0VOVEFHRToKKwkJCQlyZXR1cm4gaW5mZWN0UGVyY2VudGFnZSAhPSBJTkZFQ1RfUEVSQ0VOVEFHRV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkKKwkJCXJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCXJlc3VsdC5hcHBlbmQoIiAocG9wdWxhdGlvbklkZW50aWZpZXI6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQocG9wdWxhdGlvbklkZW50aWZpZXIgIT0gbnVsbCA/IHBvcHVsYXRpb25JZGVudGlmaWVyIDogIlwiXCIiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB0YXJnZXRVUkk6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQodGFyZ2V0VVJJICE9IG51bGwgPyB0YXJnZXRVUkkgOiAiXCJcIiIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGRpc2Vhc2VOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGRpc2Vhc2VOYW1lICE9IG51bGwgPyBkaXNlYXNlTmFtZSA6ICJcIlwiIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgdGFyZ2V0SVNPS2V5OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHRhcmdldElTT0tleSAhPSBudWxsID8gdGFyZ2V0SVNPS2V5IDogIlwiXCIiKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfSAvLyB0b1N0cmluZworCisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2FuZSgpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHN1cGVyLnNhbmUoKTsKKwkJY2hlY2tJbmZlY3RvclVSSXMoKTsvLyBpc3N1ZXMgd2FybmluZyBpZiBpbmZlY3RvciB1cmkgaXMgbm90IGluIHRoZSBncmFwaAorCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmICEodGFyZ2V0SVNPS2V5ID09IG51bGwgJiYgdGFyZ2V0VVJJID09IG51bGwpOworCQlhc3NlcnQgcmV0VmFsdWU7CisJCQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBzYW5lCisJCisKKwkvKioKKwkgKiBJbml0aWFsaXplIHRoZSBkaXNlYXNlIG1vZGVsIGxhYmVsIHZhbHVlCisJICogCisJICogQHBhcmFtIGRpc2Vhc2VNb2RlbExhYmVsCisJICogICAgICAgICAgICB0aGUgZGlzZWFzZSBtb2RlbCBsYWJlbCB0byBiZSBpbml0aWFsaXplZAorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvSW5pdGlhbGl6YXRpb24oCisJCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTW9kZWxMYWJlbCk7CisKK30gLy8gSW5mZWN0b3JJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL0luZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25JbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL0luZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkMjkwMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbkltcGwuamF2YQpAQCAtMCwwICsxLDI0NyBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTm9kZURlY29yYXRvckltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluZmVjdG9yIElub2N1bGF0b3IgQ29sbGVjdGlvbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbkltcGwjZ2V0TGlzdCA8ZW0+TGlzdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbkltcGwjZ2V0SW1wb3J0Rm9sZGVyIDxlbT5JbXBvcnQgRm9sZGVyPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbkltcGwgZXh0ZW5kcyBOb2RlRGVjb3JhdG9ySW1wbCBpbXBsZW1lbnRzIEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24geworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpc3QoKSA8ZW0+TGlzdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMaXN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8SW5mZWN0b3I+IGxpc3Q7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wb3J0Rm9sZGVyKCkgPGVtPkltcG9ydCBGb2xkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEltcG9ydEZvbGRlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0ZPTERFUl9FREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wb3J0Rm9sZGVyKCkgPGVtPkltcG9ydCBGb2xkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEltcG9ydEZvbGRlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBpbXBvcnRGb2xkZXIgPSBJTVBPUlRfRk9MREVSX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25JbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLklORkVDVE9SX0lOT0NVTEFUT1JfQ09MTEVDVElPTjsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkRlY29yYXRvckltcGwjZGVjb3JhdGVHcmFwaChvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZGVjb3JhdGVHcmFwaChTVEVNVGltZSB0aW1lKSB7CisJCWlmKHRoaXMuaXNHcmFwaERlY29yYXRlZCgpKSByZXR1cm4gdHJ1ZTsKKwkJYm9vbGVhbiBzdWNjZXNzID0gdHJ1ZTsKKwkJaWYodGhpcy5nZXRMaXN0KCkgIT0gbnVsbCkKKwkJCWZvcihJbmZlY3RvciBpOnRoaXMuZ2V0TGlzdCgpKQorCQkJCWlmKCFpLmRlY29yYXRlR3JhcGgodGltZSkpIHN1Y2Nlc3MgPSBmYWxzZTsKKwkJcmV0dXJuIHN1Y2Nlc3M7CisJfQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbCNyZXNldExhYmVscyhvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVzZXRMYWJlbHMoKSB7CisJCWlmKHRoaXMuZ2V0TGlzdCgpICE9IG51bGwpCisJCQlmb3IoSW5mZWN0b3IgaTp0aGlzLmdldExpc3QoKSkgaS5yZXNldExhYmVscygpOworCX0KKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8SW5mZWN0b3I+IGdldExpc3QoKSB7CisJCWlmIChsaXN0ID09IG51bGwpIHsKKwkJCWxpc3QgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SW5mZWN0b3I+KEluZmVjdG9yLmNsYXNzLCB0aGlzLCBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfSU5PQ1VMQVRPUl9DT0xMRUNUSU9OX19MSVNUKTsKKwkJfQorCQlyZXR1cm4gbGlzdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEltcG9ydEZvbGRlcigpIHsKKwkJcmV0dXJuIGltcG9ydEZvbGRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbXBvcnRGb2xkZXIoU3RyaW5nIG5ld0ltcG9ydEZvbGRlcikgeworCQlTdHJpbmcgb2xkSW1wb3J0Rm9sZGVyID0gaW1wb3J0Rm9sZGVyOworCQlpbXBvcnRGb2xkZXIgPSBuZXdJbXBvcnRGb2xkZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5JTkZFQ1RPUl9JTk9DVUxBVE9SX0NPTExFQ1RJT05fX0lNUE9SVF9GT0xERVIsIG9sZEltcG9ydEZvbGRlciwgaW1wb3J0Rm9sZGVyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfSU5PQ1VMQVRPUl9DT0xMRUNUSU9OX19MSVNUOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TGlzdCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX0lOT0NVTEFUT1JfQ09MTEVDVElPTl9fTElTVDoKKwkJCQlyZXR1cm4gZ2V0TGlzdCgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfSU5PQ1VMQVRPUl9DT0xMRUNUSU9OX19JTVBPUlRfRk9MREVSOgorCQkJCXJldHVybiBnZXRJbXBvcnRGb2xkZXIoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfSU5PQ1VMQVRPUl9DT0xMRUNUSU9OX19MSVNUOgorCQkJCWdldExpc3QoKS5jbGVhcigpOworCQkJCWdldExpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEluZmVjdG9yPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfSU5PQ1VMQVRPUl9DT0xMRUNUSU9OX19JTVBPUlRfRk9MREVSOgorCQkJCXNldEltcG9ydEZvbGRlcigoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfSU5PQ1VMQVRPUl9DT0xMRUNUSU9OX19MSVNUOgorCQkJCWdldExpc3QoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX0lOT0NVTEFUT1JfQ09MTEVDVElPTl9fSU1QT1JUX0ZPTERFUjoKKwkJCQlzZXRJbXBvcnRGb2xkZXIoSU1QT1JUX0ZPTERFUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5JTkZFQ1RPUl9JTk9DVUxBVE9SX0NPTExFQ1RJT05fX0xJU1Q6CisJCQkJcmV0dXJuIGxpc3QgIT0gbnVsbCAmJiAhbGlzdC5pc0VtcHR5KCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5JTkZFQ1RPUl9JTk9DVUxBVE9SX0NPTExFQ1RJT05fX0lNUE9SVF9GT0xERVI6CisJCQkJcmV0dXJuIElNUE9SVF9GT0xERVJfRURFRkFVTFQgPT0gbnVsbCA/IGltcG9ydEZvbGRlciAhPSBudWxsIDogIUlNUE9SVF9GT0xERVJfRURFRkFVTFQuZXF1YWxzKGltcG9ydEZvbGRlcik7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChpbXBvcnRGb2xkZXI6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaW1wb3J0Rm9sZGVyKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbkltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU0VJUkltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU0VJUkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I1YTAyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TRUlSSW1wbC5qYXZhCkBAIC0wLDAgKzEsNDE3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlNpbXBsZURhdGFFeGNoYW5nZUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuaW1wbC5NaWdyYXRpb25FZGdlTGFiZWxJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWxWYWx1ZTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TRUlSPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TRUlSSW1wbCNnZXRJbmN1YmF0aW9uUmF0ZSA8ZW0+SW5jdWJhdGlvbiBSYXRlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU0VJUkltcGwgZXh0ZW5kcyBTSVJJbXBsIGltcGxlbWVudHMgU0VJUiB7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5jdWJhdGlvblJhdGUoKSA8ZW0+SW5jdWJhdGlvbiBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW5jdWJhdGlvblJhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIElOQ1VCQVRJT05fUkFURV9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY3ViYXRpb25SYXRlKCkgPGVtPkluY3ViYXRpb24gUmF0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEluY3ViYXRpb25SYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIGluY3ViYXRpb25SYXRlID0gSU5DVUJBVElPTl9SQVRFX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTRUlSSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2VpckRpc2Vhc2VNb2RlbAorCSAqICAgICAgICAgICAgdGhlIFNFSVIgZGlzZWFzZSBtb2RlbCB0byBiZSBpbml0aWFsaXplZAorCSAqIEBwYXJhbSBkaXNlYXNlTW9kZWxOYW1lCisJICogQHBhcmFtIGJhY2tncm91bmRNb3J0YWxpdHlSYXRlCisJICogQHBhcmFtIGluZmVjdGlvdXNNb3J0YWxpdHkKKwkgKiBAcGFyYW0gaW5mZWN0aW91c01vcnRhbGl0eVJhdGUKKwkgKiAgICAgICAgICAgIHRoZSByYXRlIGF0IHdoaWNoIGZhdGFsbHkgaW5mZWN0aW91cyBwb3B1bGF0aW9uIG1lbWJlcnMgZGllCisJICogQHBhcmFtIHRyYW5zbWlzc2lvblJhdGUKKwkgKiBAcGFyYW0gcmVjb3ZlcnlSYXRlCisJICogQHBhcmFtIGltbXVuaXR5TG9zc1JhdGUKKwkgKiBAcGFyYW0gaW5jdWJhdGlvblJhdGUKKwkgKiBAcGFyYW0gbm9uTGluZWFyaXR5Q29lZmZpY2llbnQKKwkgKiBAcGFyYW0gdGltZVBlcmlvZAorCSAqIEBwYXJhbSBwb3B1bGF0aW9uSWRlbnRpZmllcgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgU0VJUiBpbml0aWFsaXplU0VJUkRpc2Vhc2VNb2RlbCgKKwkJCWZpbmFsIFNFSVIgc2VpckRpc2Vhc2VNb2RlbCwgZmluYWwgU3RyaW5nIGRpc2Vhc2VNb2RlbE5hbWUsCisJCQlmaW5hbCBkb3VibGUgYmFja2dyb3VuZE1vcnRhbGl0eVJhdGUsCisJCQlmaW5hbCBkb3VibGUgaW5mZWN0aW91c01vcnRhbGl0eVJhdGUsCisJCQlmaW5hbCBkb3VibGUgdHJhbnNtaXNzaW9uUmF0ZSwgZmluYWwgZG91YmxlIHJlY292ZXJ5UmF0ZSwKKwkJCWZpbmFsIGRvdWJsZSBpbW11bml0eUxvc3NSYXRlLCBmaW5hbCBkb3VibGUgaW5jdWJhdGlvblJhdGUsCisJCQlmaW5hbCBkb3VibGUgbm9uTGluZWFyaXR5Q29lZmZpY2llbnQsIGZpbmFsIGxvbmcgdGltZVBlcmlvZCwKKwkJCWZpbmFsIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllcikgeworCQlTSVJJbXBsLmluaXRpYWxpemVTSVJEaXNlYXNlTW9kZWwoc2VpckRpc2Vhc2VNb2RlbCwgZGlzZWFzZU1vZGVsTmFtZSwKKwkJCQliYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSwKKwkJCQlpbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSwgdHJhbnNtaXNzaW9uUmF0ZSwgcmVjb3ZlcnlSYXRlLAorCQkJCWltbXVuaXR5TG9zc1JhdGUsIG5vbkxpbmVhcml0eUNvZWZmaWNpZW50LCB0aW1lUGVyaW9kLAorCQkJCXBvcHVsYXRpb25JZGVudGlmaWVyKTsKKwkJc2VpckRpc2Vhc2VNb2RlbC5zZXRJbmN1YmF0aW9uUmF0ZShpbmN1YmF0aW9uUmF0ZSk7CisJCXJldHVybiBzZWlyRGlzZWFzZU1vZGVsOworCX0gLy8gaW5pdGlhbGl6ZVN0YW5kYXJkRGlzZWFzZU1vZGVsCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJSW1wbCNjb21wdXRlQmlydGhzRGVhdGhzRGVsdGFzKG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUsCisJICogICAgICBsb25nKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTRUlSTGFiZWxWYWx1ZSBjb21wdXRlRGlzZWFzZURlYXRoc0RlbHRhcygKKwkJCWZpbmFsIFNURU1UaW1lIHRpbWUsIGZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZUxhYmVsLCBmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY3VycmVudExhYmVsVmFsdWUsIGZpbmFsIGxvbmcgdGltZURlbHRhLCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHJldHVyblZhbHVlKSB7CisKKwkJZmluYWwgU0VJUkxhYmVsVmFsdWUgY3VycmVudFNFSVIgPSAoU0VJUkxhYmVsVmFsdWUpIGN1cnJlbnRMYWJlbFZhbHVlOworCQkKKwkJZmluYWwgZG91YmxlIGFkanVzdGVkSW5mZWN0aW91c01vcnRhbGl0eVJhdGUgPSBnZXRBZGp1c3RlZEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKHRpbWVEZWx0YSk7CisJCWZpbmFsIGRvdWJsZSBkaXNlYXNlRGVhdGhzID0gYWRqdXN0ZWRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZQorCQkJCSogY3VycmVudFNFSVIuZ2V0SSgpOworCisJCVNFSVJMYWJlbFZhbHVlSW1wbCByZXQgPSAoU0VJUkxhYmVsVmFsdWVJbXBsKXJldHVyblZhbHVlOworCQlyZXQuc2V0UygwLjApOworCQlyZXQuc2V0RSgwLjApOworCQlyZXQuc2V0SSgtZGlzZWFzZURlYXRocyk7CisJCXJldC5zZXRJbmNpZGVuY2UoMCk7CisJCXJldC5zZXRSKDAuMCk7CisJCXJldC5zZXREaXNlYXNlRGVhdGhzKGRpc2Vhc2VEZWF0aHMpOworCQlyZXR1cm4gcmV0OworCX0gLy8gY29tcHV0ZUJpcnRoc0RlYXRocworCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJSW1wbCNjb21wdXRlRGlzZWFzZURlbHRhcyhTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUsCisJICogICAgICBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsLCBsb25nKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY29tcHV0ZURpc2Vhc2VEZWx0YXMoCisJCQlmaW5hbCBTVEVNVGltZSB0aW1lLCAKKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjdXJyZW50U3RhdGUsCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VMYWJlbCwgZmluYWwgbG9uZyB0aW1lRGVsdGEsIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgcmV0dXJuVmFsdWUpIHsKKwkJZmluYWwgU0VJUkxhYmVsVmFsdWUgY3VycmVudFNFSVIgPSAoU0VJUkxhYmVsVmFsdWUpIGN1cnJlbnRTdGF0ZTsKKwkKKwkJLy8gVGhpcyBpcyBiZXRhKgorCQlkb3VibGUgdHJhbnNtaXNzaW9uUmF0ZSA9IGdldEFkanVzdGVkVHJhbnNtaXNzaW9uUmF0ZSh0aW1lRGVsdGEpOworCQkKKwkJaWYoIXRoaXMuaXNGcmVxdWVuY3lEZXBlbmRlbnQoKSkgdHJhbnNtaXNzaW9uUmF0ZSAqPSBnZXRUcmFuc21pc3Npb25SYXRlU2NhbGVGYWN0b3IoZGlzZWFzZUxhYmVsKTsKKwkJCisJCQkKKwkJLy8gVGhlIGVmZmVjdGl2ZSBJbmZlY3Rpb3VzIHBvcHVsYXRpb24gIGlzIGEgZGltZW5zaW9ubGVzIG51bWJlciBub3JtYWxpemUgYnkgdG90YWwKKwkJLy8gcG9wdWxhdGlvbiB1c2VkIGluIHRlaCBjb21wdXRhdGlvbiBvZiBiZXRzKlMqaSB3aGVyZSBpID0gSWVmZmVjdGl2ZS9Qb3AuCisJCS8vIFRoaXMgaW5jbHVkZXMgYSBjb3JyZWN0aW9uIHRvIHRoZSBjdXJyZW50CisJCS8vIGluZmVjdGlvdXMgcG9wdWxhdGlvbiAoSWVmZmVjdGl2ZSkgYmFzZWQgb24gdGhlIGNvbnNlcnZlZCBleGNoYW5nZSBvZiBwZW9wbGUgKGNpcmN1bGF0aW9uKQorCQkvLyBiZXR3ZWVuIHJlZ2lvbnMuIE5vdGUgdGhhdCB0aGlzIGlzIG5vIHRoZSAiYXJyaXZhbHMiIGFuZCAiZGVwYXJ0dXJlcyIgd2hpY2ggYXJlCisJCS8vIGEgZGlmZmVyZW50IHByb2Nlc3MuCisJCWZpbmFsIGRvdWJsZSBlZmZlY3RpdmVJbmZlY3Rpb3VzID0gZ2V0Tm9ybWFsaXplZEVmZmVjdGl2ZUluZmVjdGlvdXMoZGlzZWFzZUxhYmVsLmdldE5vZGUoKSwgZGlzZWFzZUxhYmVsLCBjdXJyZW50U0VJUi5nZXRJKCkpOworCisJCS8qCisJCSAqIENvbXB1dGUgc3RhdGUgdHJhbnNpdGlvbnMKKwkJICogCisJCSAqIFJlZ2FyZGluZyBjb21wdXRpbmcgdGhlIG51bWJlciBvZiB0cmFuc2l0aW9ucyBmcm9tIFN1c2NlcHRpYmxlIHRvIEV4cG9zZWQ6CisJCSAqIEluIGEgbGluZWFyIG1vZGVsIHRoZSAiZWZmZWN0aXZlIiBudW1iZXIgb2YgaW5mZWN0aW91cyBwZW9wbGUgaXMganVzdAorCQkgKiB0aGUgbnVtYmVyIG9mIGluZmVjdGlvdXMgcGVvcGxlIEluIGEgbm9ubGluZWFyIG1vZGVsIHdlIGhhdmUgYQorCQkgKiBub25MaW5lYXJpdHkgZXhwb25lbnQgdGhhdCBpcyA+IDEgdGhpcyBtb2RlbHMgdGhlIGVmZmVjdCBvZiBpbW11bmUKKwkJICogc3lzdGVtIHNhdHVyYXRpb24gd2hlbiBTdXNjZXB0aWJsZSBwZW9wbGUgYXJlIGV4cG9zZWQgdG8gbGFyZ2UKKwkJICogbnVtYmVycyBvZiBpbmZlY3Rpb3VzIHBlb3BsZS4gdGhlbiB0aGUgImVmZmVjdGl2ZSIgbnVtYmVyIG9mCisJCSAqIGluZmVjdGlvdXMgcGVvcGxlIGlzIElebm9uTGluZWFyaXR5IGV4cG9uZW50IHRvIGFsbG93IGZvciBlaXRoZXIKKwkJICogbGluZWFyIG9yIG5vbmxpbmVhciBtb2RlbHMgd2UgYWx3YXlzIGNhbGN1bGF0ZSBJXm5vbkxpbmVhcml0eQorCQkgKiBleHBvbmVudCBhbmQgYWxsb3cgbm9uTGluZWFyaXR5IGV4cG9uZW50ID49IDEuMAorCQkgKi8KKwkJZG91YmxlIG51bWJlck9mSW5mZWN0ZWRUb1JlY292ZXJlZCA9IGdldEFkanVzdGVkUmVjb3ZlcnlSYXRlKHRpbWVEZWx0YSkKKwkJKiBjdXJyZW50U0VJUi5nZXRJKCk7CisJCWRvdWJsZSBudW1iZXJPZlJlY292ZXJlZFRvU3VzY2VwdGlibGUgPSBnZXRBZGp1c3RlZEltbXVuaXR5TG9zc1JhdGUodGltZURlbHRhKQorCQkqIGN1cnJlbnRTRUlSLmdldFIoKTsKKwkJLy8gTmVlZCB0byBjaGVja2VkIHdoYXQgZG8gZG8gaGVyZS4gSWYgbm9uIGxpbmVhciBjb2VmZmljaWVudCBpcyBub3QgMSBhbmQKKwkJLy8gdGhlIGVmZmVjdGl2ZSBpbmZlY3Rpb3VzIGlzIG5lZ2F0aXZlICh3aGljaCBpcyBwb3NzaWJsZSksIHdoYXQgZG8gZG8/IAorCQkvLyBMZXQncyBmYWxsIGJhY2sgb24gdGhlIGxpbmVhciBtZXRob2QgZm9yIG5vdy4KKwkJZG91YmxlIG51bWJlck9mU3VzY2VwdGlibGVUb0V4cG9zZWQgPSAwLjA7CisJCWlmKGdldE5vbkxpbmVhcml0eUNvZWZmaWNpZW50KCkgIT0gMS4wICYmIGVmZmVjdGl2ZUluZmVjdGlvdXMgPj0wLjApCisJCQludW1iZXJPZlN1c2NlcHRpYmxlVG9FeHBvc2VkID0gdHJhbnNtaXNzaW9uUmF0ZQorCQkJKiBjdXJyZW50U0VJUi5nZXRTKCkqIE1hdGgucG93KGVmZmVjdGl2ZUluZmVjdGlvdXMsIGdldE5vbkxpbmVhcml0eUNvZWZmaWNpZW50KCkpOworCQllbHNlIAorCQkJbnVtYmVyT2ZTdXNjZXB0aWJsZVRvRXhwb3NlZCA9IHRyYW5zbWlzc2lvblJhdGUKKwkJCSogY3VycmVudFNFSVIuZ2V0UygpKiBlZmZlY3RpdmVJbmZlY3Rpb3VzOworCQlkb3VibGUgbnVtYmVyT2ZFeHBvc2VkVG9JbmZlY3Rpb3VzID0gZ2V0QWRqdXN0ZWRJbmN1YmF0aW9uUmF0ZSh0aW1lRGVsdGEpCisJCSogY3VycmVudFNFSVIuZ2V0RSgpOworCQkJCisJCQorCQkvLyBEZXRlcm1pbmUgZGVsdGEgUworCQlmaW5hbCBkb3VibGUgZGVsdGFTID0gbnVtYmVyT2ZSZWNvdmVyZWRUb1N1c2NlcHRpYmxlIC0gbnVtYmVyT2ZTdXNjZXB0aWJsZVRvRXhwb3NlZDsKKwkJLy8gRGV0ZXJtaW5lIGRlbHRhIEUKKwkJZmluYWwgZG91YmxlIGRlbHRhRSA9IG51bWJlck9mU3VzY2VwdGlibGVUb0V4cG9zZWQgLSBudW1iZXJPZkV4cG9zZWRUb0luZmVjdGlvdXM7CQkKKwkJLy8gRGV0ZXJtaW5lIGRlbHRhIEkKKwkJZmluYWwgZG91YmxlIGRlbHRhSSA9IG51bWJlck9mRXhwb3NlZFRvSW5mZWN0aW91cyAtIG51bWJlck9mSW5mZWN0ZWRUb1JlY292ZXJlZDsKKwkJLy8gRGV0ZXJtaW5lIGRlbHRhIFIKKwkJZmluYWwgZG91YmxlIGRlbHRhUiA9IG51bWJlck9mSW5mZWN0ZWRUb1JlY292ZXJlZCAtIG51bWJlck9mUmVjb3ZlcmVkVG9TdXNjZXB0aWJsZTsKKwkJCisJCVNFSVJMYWJlbFZhbHVlSW1wbCByZXQgPSAoU0VJUkxhYmVsVmFsdWVJbXBsKXJldHVyblZhbHVlOworCQlyZXQuc2V0UyhkZWx0YVMpOworCQlyZXQuc2V0RShkZWx0YUUpOworCQlyZXQuc2V0SShkZWx0YUkpOworCQlyZXQuc2V0SW5jaWRlbmNlKG51bWJlck9mU3VzY2VwdGlibGVUb0V4cG9zZWQpOworCQlyZXQuc2V0UihkZWx0YVIpOworCQlyZXQuc2V0RGlzZWFzZURlYXRocygwKTsKKwkJcmV0dXJuIHJldDsKKwkKKwl9IC8vIGNvbXB1dGVEaXNlYXNlRGVsdGFzCisJCisKKwkvKioKKwkgKiBAcGFyYW0gZnJhY3Rpb25Ub0RlcGFydAorCSAqIEBwYXJhbSBuZXh0U3RhdGUKKwkgKiBAcmV0dXJuCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjb21wdXRlRGVwYXJ0dXJlcygKKwkJCWZpbmFsIGRvdWJsZSBmcmFjdGlvblRvRGVwYXJ0LAorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIG5leHRTdGF0ZSkgeworCQlmaW5hbCBTRUlSTGFiZWxWYWx1ZSBkZXBhcnRlZXMgPSBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZVNFSVJMYWJlbFZhbHVlKCk7CisJCWZpbmFsIFNFSVJMYWJlbFZhbHVlIHNpU3RhdGUgPSAoU0VJUkxhYmVsVmFsdWUpIG5leHRTdGF0ZTsKKwkJZGVwYXJ0ZWVzLnNldFMoZnJhY3Rpb25Ub0RlcGFydCAqIHNpU3RhdGUuZ2V0UygpKTsKKwkJZGVwYXJ0ZWVzLnNldEUoZnJhY3Rpb25Ub0RlcGFydCAqIHNpU3RhdGUuZ2V0RSgpKTsKKwkJZGVwYXJ0ZWVzLnNldEkoZnJhY3Rpb25Ub0RlcGFydCAqIHNpU3RhdGUuZ2V0SSgpKTsKKwkJZGVwYXJ0ZWVzLnNldFIoZnJhY3Rpb25Ub0RlcGFydCAqIHNpU3RhdGUuZ2V0UigpKTsKKwkJcmV0dXJuIGRlcGFydGVlczsKKwl9IC8vIGNvbXB1dGVEZXBhcnR1cmVzCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbEltcGwjY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWwoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbCBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbCgpIHsKKwkJcmV0dXJuIFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0VJUkxhYmVsKCk7CisJfSAvLyBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbAorCQorCUBPdmVycmlkZQorCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKSB7CisJCXJldHVybiBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNFSVJMYWJlbFZhbHVlKCk7CisJfSAvLyBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbFZhbHVlCisJCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU0VJUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRJbmN1YmF0aW9uUmF0ZSgpIHsKKwkJcmV0dXJuIGluY3ViYXRpb25SYXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5ld0luY3ViYXRpb25SYXRlCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluY3ViYXRpb25SYXRlKGRvdWJsZSBuZXdJbmN1YmF0aW9uUmF0ZSkgeworCQlkb3VibGUgb2xkSW5jdWJhdGlvblJhdGUgPSBpbmN1YmF0aW9uUmF0ZTsKKwkJaW5jdWJhdGlvblJhdGUgPSBuZXdJbmN1YmF0aW9uUmF0ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNFSVJfX0lOQ1VCQVRJT05fUkFURSwgb2xkSW5jdWJhdGlvblJhdGUsIGluY3ViYXRpb25SYXRlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdGltZURlbHRhCisJICogICAgICAgICAgICB0aGUgdGltZSBwZXJpb2QgdG8gYWRqdXN0IHRoZSByYXRlIHRvCisJICogQHJldHVybiB0aGUgYWRqdXN0ZWQgcmF0ZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIGRvdWJsZSBnZXRBZGp1c3RlZEluY3ViYXRpb25SYXRlKGxvbmcgdGltZURlbHRhKSB7CisJCXJldHVybiBnZXRJbmN1YmF0aW9uUmF0ZSgpCisJCQkJKiAoKGRvdWJsZSkgdGltZURlbHRhIC8gKGRvdWJsZSkgZ2V0VGltZVBlcmlvZCgpKTsKKwl9IC8vIGdldEFkanVzdGVkSW5jdWJhdGlvblJhdGUKKworCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSByZXNvbHZlCisJICogQHBhcmFtIGNvcmVUeXBlCisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUlSX19JTkNVQkFUSU9OX1JBVEU6CisJCQkJcmV0dXJuIGdldEluY3ViYXRpb25SYXRlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogQHBhcmFtIG5ld1ZhbHVlCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUlSX19JTkNVQkFUSU9OX1JBVEU6CisJCQkJc2V0SW5jdWJhdGlvblJhdGUoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUlSX19JTkNVQkFUSU9OX1JBVEU6CisJCQkJc2V0SW5jdWJhdGlvblJhdGUoSU5DVUJBVElPTl9SQVRFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VJUl9fSU5DVUJBVElPTl9SQVRFOgorCQkJCXJldHVybiBpbmN1YmF0aW9uUmF0ZSAhPSBJTkNVQkFUSU9OX1JBVEVfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoaW5jdWJhdGlvblJhdGU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaW5jdWJhdGlvblJhdGUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLk5vZGVEZWNvcmF0b3JJbXBsI3NhbmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5zYW5lKCk7CisKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBpbmN1YmF0aW9uUmF0ZSA+PSBJTkNVQkFUSU9OX1JBVEVfRURFRkFVTFQ7CisJCWFzc2VydCByZXRWYWx1ZTsKKworCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmICFEb3VibGUuaXNJbmZpbml0ZShpbmN1YmF0aW9uUmF0ZSk7CisJCWFzc2VydCByZXRWYWx1ZTsKKwkJCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgIURvdWJsZS5pc05hTihpbmN1YmF0aW9uUmF0ZSk7CisJCWFzc2VydCByZXRWYWx1ZTsKKwkJCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHNhbmUKKworfSAvLyBTRUlSSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TRUlSTGFiZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1NFSVJMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjMxYjA3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TRUlSTGFiZWxJbXBsLmphdmEKQEAgLTAsMCArMSw1NzggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TaW1wbGVEYXRhRXhjaGFuZ2VMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U0VJUiBMYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0VJUkxhYmVsSW1wbCNnZXREZWx0YVZhbHVlIDxlbT5EZWx0YSBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0VJUkxhYmVsSW1wbCNnZXRQcm9iZVZhbHVlIDxlbT5Qcm9iZSBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0VJUkxhYmVsSW1wbCNnZXRUZW1wVmFsdWUgPGVtPlRlbXAgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNFSVJMYWJlbEltcGwjZ2V0T3JpZ2luYWxWYWx1ZSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNFSVJMYWJlbEltcGwjZ2V0RXJyb3JTY2FsZSA8ZW0+RXJyb3IgU2NhbGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTRUlSTGFiZWxJbXBsIGV4dGVuZHMgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbEltcGwgaW1wbGVtZW50cyBTRUlSTGFiZWwgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlbHRhVmFsdWUoKSA8ZW0+RGVsdGEgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlbHRhVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTRUlSTGFiZWxWYWx1ZSBkZWx0YVZhbHVlOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2JlVmFsdWUoKSA8ZW0+UHJvYmUgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFByb2JlVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTRUlSTGFiZWxWYWx1ZSBwcm9iZVZhbHVlOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRlbXBWYWx1ZSgpIDxlbT5UZW1wIFZhbHVlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUZW1wVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTRUlSTGFiZWxWYWx1ZSB0ZW1wVmFsdWU7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JpZ2luYWxWYWx1ZSgpIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3JpZ2luYWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFNFSVJMYWJlbFZhbHVlIG9yaWdpbmFsVmFsdWU7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXJyb3JTY2FsZSgpIDxlbT5FcnJvciBTY2FsZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RXJyb3JTY2FsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFNFSVJMYWJlbFZhbHVlIGVycm9yU2NhbGU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBTRUlSTGFiZWxJbXBsKCkgeworCQlzdXBlcigpOworCQlzZXRUeXBlVVJJKFVSSV9UWVBFX1NFSVJfTEFCRUwpOworCQlzZXRDdXJyZW50VmFsdWUoU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTRUlSTGFiZWxWYWx1ZSgpKTsKKwkJc2V0TmV4dFZhbHVlKFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0VJUkxhYmVsVmFsdWUoKSk7CisJCXNldE9yaWdpbmFsVmFsdWUoU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTRUlSTGFiZWxWYWx1ZSgpKTsKKwkJc2V0VGVtcFZhbHVlKFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0VJUkxhYmVsVmFsdWUoKSk7CisJCXNldFByb2JlVmFsdWUoU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTRUlSTGFiZWxWYWx1ZSgpKTsKKwkJc2V0RXJyb3JTY2FsZShTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNFSVJMYWJlbFZhbHVlKCkpOworCQlzZXREZWx0YVZhbHVlKFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0VJUkxhYmVsVmFsdWUoKSk7CisJfSAvLyBTRUlSTGFiZWxJbXBsCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU0VJUl9MQUJFTDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU0VJUkxhYmVsVmFsdWUgZ2V0RGVsdGFWYWx1ZSgpIHsKKwkJaWYgKGRlbHRhVmFsdWUgIT0gbnVsbCAmJiBkZWx0YVZhbHVlLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGREZWx0YVZhbHVlID0gKEludGVybmFsRU9iamVjdClkZWx0YVZhbHVlOworCQkJZGVsdGFWYWx1ZSA9IChTRUlSTGFiZWxWYWx1ZSllUmVzb2x2ZVByb3h5KG9sZERlbHRhVmFsdWUpOworCQkJaWYgKGRlbHRhVmFsdWUgIT0gb2xkRGVsdGFWYWx1ZSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFN0YW5kYXJkUGFja2FnZS5TRUlSX0xBQkVMX19ERUxUQV9WQUxVRSwgb2xkRGVsdGFWYWx1ZSwgZGVsdGFWYWx1ZSkpOworCQkJfQorCQl9CisJCXJldHVybiBkZWx0YVZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTRUlSTGFiZWxWYWx1ZSBiYXNpY0dldERlbHRhVmFsdWUoKSB7CisJCXJldHVybiBkZWx0YVZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlbHRhVmFsdWUoU0VJUkxhYmVsVmFsdWUgbmV3RGVsdGFWYWx1ZSkgeworCQlTRUlSTGFiZWxWYWx1ZSBvbGREZWx0YVZhbHVlID0gZGVsdGFWYWx1ZTsKKwkJZGVsdGFWYWx1ZSA9IG5ld0RlbHRhVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5TRUlSX0xBQkVMX19ERUxUQV9WQUxVRSwgb2xkRGVsdGFWYWx1ZSwgZGVsdGFWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTRUlSTGFiZWxWYWx1ZSBnZXRQcm9iZVZhbHVlKCkgeworCQlpZiAocHJvYmVWYWx1ZSAhPSBudWxsICYmIHByb2JlVmFsdWUuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByb2JlVmFsdWUgPSAoSW50ZXJuYWxFT2JqZWN0KXByb2JlVmFsdWU7CisJCQlwcm9iZVZhbHVlID0gKFNFSVJMYWJlbFZhbHVlKWVSZXNvbHZlUHJveHkob2xkUHJvYmVWYWx1ZSk7CisJCQlpZiAocHJvYmVWYWx1ZSAhPSBvbGRQcm9iZVZhbHVlKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgU3RhbmRhcmRQYWNrYWdlLlNFSVJfTEFCRUxfX1BST0JFX1ZBTFVFLCBvbGRQcm9iZVZhbHVlLCBwcm9iZVZhbHVlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHByb2JlVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNFSVJMYWJlbFZhbHVlIGJhc2ljR2V0UHJvYmVWYWx1ZSgpIHsKKwkJcmV0dXJuIHByb2JlVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UHJvYmVWYWx1ZShTRUlSTGFiZWxWYWx1ZSBuZXdQcm9iZVZhbHVlKSB7CisJCVNFSVJMYWJlbFZhbHVlIG9sZFByb2JlVmFsdWUgPSBwcm9iZVZhbHVlOworCQlwcm9iZVZhbHVlID0gbmV3UHJvYmVWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNFSVJfTEFCRUxfX1BST0JFX1ZBTFVFLCBvbGRQcm9iZVZhbHVlLCBwcm9iZVZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNFSVJMYWJlbFZhbHVlIGdldFRlbXBWYWx1ZSgpIHsKKwkJaWYgKHRlbXBWYWx1ZSAhPSBudWxsICYmIHRlbXBWYWx1ZS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkVGVtcFZhbHVlID0gKEludGVybmFsRU9iamVjdCl0ZW1wVmFsdWU7CisJCQl0ZW1wVmFsdWUgPSAoU0VJUkxhYmVsVmFsdWUpZVJlc29sdmVQcm94eShvbGRUZW1wVmFsdWUpOworCQkJaWYgKHRlbXBWYWx1ZSAhPSBvbGRUZW1wVmFsdWUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTdGFuZGFyZFBhY2thZ2UuU0VJUl9MQUJFTF9fVEVNUF9WQUxVRSwgb2xkVGVtcFZhbHVlLCB0ZW1wVmFsdWUpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGVtcFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTRUlSTGFiZWxWYWx1ZSBiYXNpY0dldFRlbXBWYWx1ZSgpIHsKKwkJcmV0dXJuIHRlbXBWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUZW1wVmFsdWUoU0VJUkxhYmVsVmFsdWUgbmV3VGVtcFZhbHVlKSB7CisJCVNFSVJMYWJlbFZhbHVlIG9sZFRlbXBWYWx1ZSA9IHRlbXBWYWx1ZTsKKwkJdGVtcFZhbHVlID0gbmV3VGVtcFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU0VJUl9MQUJFTF9fVEVNUF9WQUxVRSwgb2xkVGVtcFZhbHVlLCB0ZW1wVmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU0VJUkxhYmVsVmFsdWUgZ2V0T3JpZ2luYWxWYWx1ZSgpIHsKKwkJaWYgKG9yaWdpbmFsVmFsdWUgIT0gbnVsbCAmJiBvcmlnaW5hbFZhbHVlLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRPcmlnaW5hbFZhbHVlID0gKEludGVybmFsRU9iamVjdClvcmlnaW5hbFZhbHVlOworCQkJb3JpZ2luYWxWYWx1ZSA9IChTRUlSTGFiZWxWYWx1ZSllUmVzb2x2ZVByb3h5KG9sZE9yaWdpbmFsVmFsdWUpOworCQkJaWYgKG9yaWdpbmFsVmFsdWUgIT0gb2xkT3JpZ2luYWxWYWx1ZSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFN0YW5kYXJkUGFja2FnZS5TRUlSX0xBQkVMX19PUklHSU5BTF9WQUxVRSwgb2xkT3JpZ2luYWxWYWx1ZSwgb3JpZ2luYWxWYWx1ZSkpOworCQkJfQorCQl9CisJCXJldHVybiBvcmlnaW5hbFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTRUlSTGFiZWxWYWx1ZSBiYXNpY0dldE9yaWdpbmFsVmFsdWUoKSB7CisJCXJldHVybiBvcmlnaW5hbFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE9yaWdpbmFsVmFsdWUoU0VJUkxhYmVsVmFsdWUgbmV3T3JpZ2luYWxWYWx1ZSkgeworCQlTRUlSTGFiZWxWYWx1ZSBvbGRPcmlnaW5hbFZhbHVlID0gb3JpZ2luYWxWYWx1ZTsKKwkJb3JpZ2luYWxWYWx1ZSA9IG5ld09yaWdpbmFsVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5TRUlSX0xBQkVMX19PUklHSU5BTF9WQUxVRSwgb2xkT3JpZ2luYWxWYWx1ZSwgb3JpZ2luYWxWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTRUlSTGFiZWxWYWx1ZSBnZXRFcnJvclNjYWxlKCkgeworCQlpZiAoZXJyb3JTY2FsZSAhPSBudWxsICYmIGVycm9yU2NhbGUuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEVycm9yU2NhbGUgPSAoSW50ZXJuYWxFT2JqZWN0KWVycm9yU2NhbGU7CisJCQllcnJvclNjYWxlID0gKFNFSVJMYWJlbFZhbHVlKWVSZXNvbHZlUHJveHkob2xkRXJyb3JTY2FsZSk7CisJCQlpZiAoZXJyb3JTY2FsZSAhPSBvbGRFcnJvclNjYWxlKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgU3RhbmRhcmRQYWNrYWdlLlNFSVJfTEFCRUxfX0VSUk9SX1NDQUxFLCBvbGRFcnJvclNjYWxlLCBlcnJvclNjYWxlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGVycm9yU2NhbGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNFSVJMYWJlbFZhbHVlIGJhc2ljR2V0RXJyb3JTY2FsZSgpIHsKKwkJcmV0dXJuIGVycm9yU2NhbGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RXJyb3JTY2FsZShTRUlSTGFiZWxWYWx1ZSBuZXdFcnJvclNjYWxlKSB7CisJCVNFSVJMYWJlbFZhbHVlIG9sZEVycm9yU2NhbGUgPSBlcnJvclNjYWxlOworCQllcnJvclNjYWxlID0gbmV3RXJyb3JTY2FsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNFSVJfTEFCRUxfX0VSUk9SX1NDQUxFLCBvbGRFcnJvclNjYWxlLCBlcnJvclNjYWxlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgU0VJUkxhYmVsVmFsdWUgZ2V0Q3VycmVudFNFSVJWYWx1ZSgpIHsKKwkJcmV0dXJuIChTRUlSTGFiZWxWYWx1ZSkgZ2V0Q3VycmVudFZhbHVlKCk7CisJfSAvLyBnZXRDdXJyZW50U0VJUlZhbHVlCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBTRUlSTGFiZWxWYWx1ZSBnZXROZXh0U0VJUlZhbHVlKCkgeworCQlyZXR1cm4gKFNFSVJMYWJlbFZhbHVlKSBnZXROZXh0VmFsdWUoKTsKKwl9IC8vIGdldE5leHRTRUlSVmFsdWUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbCNzZXRFKGRvdWJsZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFKGRvdWJsZSBlKSB7CisJCWdldEN1cnJlbnRTRUlSVmFsdWUoKS5zZXRFKGUpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbCNnZXRFKCkKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldEUoKSB7CisJCXJldHVybiBnZXRDdXJyZW50U0VJUlZhbHVlKCkuZ2V0RSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbCNnZXROZXh0RSgpCisJICovCisJcHVibGljIGRvdWJsZSBnZXROZXh0RSgpIHsKKwkJcmV0dXJuIGdldE5leHRTRUlSVmFsdWUoKS5nZXRFKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsI3NldE5leHRFKGRvdWJsZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROZXh0RShkb3VibGUgZSkgeworCQlnZXROZXh0U0VJUlZhbHVlKCkuc2V0RShlKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbCNnZXRSKCkKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFIoKSB7CisJCXJldHVybiBnZXRDdXJyZW50U0VJUlZhbHVlKCkuZ2V0UigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsI3NldFIoZG91YmxlKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFIoZG91YmxlIHIpIHsKKwkJZ2V0Q3VycmVudFNFSVJWYWx1ZSgpLnNldFIocik7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWwjZ2V0TmV4dFIoKQorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0TmV4dFIoKSB7CisJCXJldHVybiBnZXROZXh0U0VJUlZhbHVlKCkuZ2V0UigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsI3NldE5leHRSKGRvdWJsZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROZXh0Uihkb3VibGUgcikgeworCQlnZXROZXh0U0VJUlZhbHVlKCkuc2V0UihyKTsKKwl9IC8vIHNldE5leHRSCisKKwkvKioKKwkgKiBAcmV0dXJuIHNldCB0aGUgbnVtYmVyIG51bWJlciBvZiBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gbWVtYmVycworCSAqLworCXB1YmxpYyB2b2lkIHNldE5leHRJKGRvdWJsZSBpKSB7CisJCSgoU0lMYWJlbFZhbHVlKWdldE5leHRWYWx1ZSgpKS5zZXRJKGkpOworCX0KKworCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWwjZ2V0SSgpCisJICovCisJcHVibGljIGRvdWJsZSBnZXRJKCkgeworCQlyZXR1cm4gZ2V0Q3VycmVudFNFSVJWYWx1ZSgpLmdldEkoKTsKKwl9IC8vIGdldEkKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWwjc2V0SSgpCisJICovCisJcHVibGljIHZvaWQgc2V0SShkb3VibGUgaSkgeworCQlnZXRDdXJyZW50U0VJUlZhbHVlKCkuc2V0SShpKTsKKwl9IC8vIGdldEkKKworCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWwjZ2V0TmV4dEkoKQorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0TmV4dEkoKSB7CisJCXJldHVybiBnZXROZXh0U0VJUlZhbHVlKCkuZ2V0SSgpOworCX0gLy8gZ2V0TmV4dEkKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcGFyYW0gcmVzb2x2ZQorCSAqIEBwYXJhbSBjb3JlVHlwZQorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VJUl9MQUJFTF9fREVMVEFfVkFMVUU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXREZWx0YVZhbHVlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0RGVsdGFWYWx1ZSgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VJUl9MQUJFTF9fUFJPQkVfVkFMVUU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRQcm9iZVZhbHVlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0UHJvYmVWYWx1ZSgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VJUl9MQUJFTF9fVEVNUF9WQUxVRToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFRlbXBWYWx1ZSgpOworCQkJCXJldHVybiBiYXNpY0dldFRlbXBWYWx1ZSgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VJUl9MQUJFTF9fT1JJR0lOQUxfVkFMVUU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRPcmlnaW5hbFZhbHVlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0T3JpZ2luYWxWYWx1ZSgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VJUl9MQUJFTF9fRVJST1JfU0NBTEU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFcnJvclNjYWxlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0RXJyb3JTY2FsZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUlSX0xBQkVMX19ERUxUQV9WQUxVRToKKwkJCQlzZXREZWx0YVZhbHVlKChTRUlSTGFiZWxWYWx1ZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VJUl9MQUJFTF9fUFJPQkVfVkFMVUU6CisJCQkJc2V0UHJvYmVWYWx1ZSgoU0VJUkxhYmVsVmFsdWUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNFSVJfTEFCRUxfX1RFTVBfVkFMVUU6CisJCQkJc2V0VGVtcFZhbHVlKChTRUlSTGFiZWxWYWx1ZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VJUl9MQUJFTF9fT1JJR0lOQUxfVkFMVUU6CisJCQkJc2V0T3JpZ2luYWxWYWx1ZSgoU0VJUkxhYmVsVmFsdWUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNFSVJfTEFCRUxfX0VSUk9SX1NDQUxFOgorCQkJCXNldEVycm9yU2NhbGUoKFNFSVJMYWJlbFZhbHVlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VJUl9MQUJFTF9fREVMVEFfVkFMVUU6CisJCQkJc2V0RGVsdGFWYWx1ZSgoU0VJUkxhYmVsVmFsdWUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VJUl9MQUJFTF9fUFJPQkVfVkFMVUU6CisJCQkJc2V0UHJvYmVWYWx1ZSgoU0VJUkxhYmVsVmFsdWUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VJUl9MQUJFTF9fVEVNUF9WQUxVRToKKwkJCQlzZXRUZW1wVmFsdWUoKFNFSVJMYWJlbFZhbHVlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNFSVJfTEFCRUxfX09SSUdJTkFMX1ZBTFVFOgorCQkJCXNldE9yaWdpbmFsVmFsdWUoKFNFSVJMYWJlbFZhbHVlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNFSVJfTEFCRUxfX0VSUk9SX1NDQUxFOgorCQkJCXNldEVycm9yU2NhbGUoKFNFSVJMYWJlbFZhbHVlKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUlSX0xBQkVMX19ERUxUQV9WQUxVRToKKwkJCQlyZXR1cm4gZGVsdGFWYWx1ZSAhPSBudWxsOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VJUl9MQUJFTF9fUFJPQkVfVkFMVUU6CisJCQkJcmV0dXJuIHByb2JlVmFsdWUgIT0gbnVsbDsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNFSVJfTEFCRUxfX1RFTVBfVkFMVUU6CisJCQkJcmV0dXJuIHRlbXBWYWx1ZSAhPSBudWxsOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VJUl9MQUJFTF9fT1JJR0lOQUxfVkFMVUU6CisJCQkJcmV0dXJuIG9yaWdpbmFsVmFsdWUgIT0gbnVsbDsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNFSVJfTEFCRUxfX0VSUk9SX1NDQUxFOgorCQkJCXJldHVybiBlcnJvclNjYWxlICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCXB1YmxpYyB2b2lkIHJlc2V0KFNURU1UaW1lIHRpbWUpIHsKKwkJLy8gQWRqdXN0IGN1cnJlbnQgdmFsdWUgYnkgYWRkaW5nL3N1YnN0cmFjdGluZyBkZWx0YXMgYnkgb3RoZXIgbW9kZWxzIChwb3B1bGF0aW9uIG1vZGVscykuCisJCS8vIFdlIGRvIHRoaXMgdG8gc2V0IHRoZSByaWdodCBjb3VudHMgdG8gbWF0Y2ggdGhlIHBvcHVsYXRpb24gbnVtYmVycyBhdCB0aGUgYmVnaW5uaW5nCisJCS8vIG9mIHRoZSBzaW11bGF0aW9uLgorCQkKKwkJZm9yKExhYmVsIGw6dGhpcy5nZXROb2RlKCkuZ2V0TGFiZWxzKCkpIHsKKwkJCWlmKGwgaW5zdGFuY2VvZiBJbnRlZ3JhdGlvbkxhYmVsKSB7CisJCQkJSW50ZWdyYXRpb25MYWJlbCBpbCA9IChJbnRlZ3JhdGlvbkxhYmVsKWw7CisJCQkJaWYobCA9PSB0aGlzKSBjb250aW51ZTsKKwkJCQlTaW1wbGVEYXRhRXhjaGFuZ2VMYWJlbFZhbHVlIGRlbHRhID0gKFNpbXBsZURhdGFFeGNoYW5nZUxhYmVsVmFsdWUpaWwuZ2V0RGVsdGFWYWx1ZSgpOworCQkJCQorCQkJCU1hcDxOb2RlLCBEb3VibGU+IGFycml2YWxzID0gZGVsdGEuZ2V0QXJyaXZhbHMoKTsKKwkJCQlNYXA8Tm9kZSwgRG91YmxlPiBkZXBhcnR1cmVzID0gZGVsdGEuZ2V0RGVwYXJ0dXJlcygpOworCQkJCQorCQkJCS8vIFdlIHNjYWxlIHRoZSBsYWJlbCB2YWx1ZXMgYmFjayBzaW5jZSBhdCB0aGlzIHBvaW50IHRoZSBpbm5vY3VsYXRvcnMvaW5mZWN0b3JzCisJCQkJLy8gaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCBhbmQgd2UgbmVlZCB0byBtb2RpZnkgYWxsIHN0YXRlcyBvZiB0aGUgZGlzZWFzZQorCQkJCQorCQkJCWRvdWJsZSBwb3BDb3VudCA9ICgoU0lMYWJlbFZhbHVlKXRoaXMuZ2V0Q3VycmVudFZhbHVlKCkpLmdldFBvcHVsYXRpb25Db3VudCgpOworCQkJCWlmKGFycml2YWxzICE9IG51bGwgJiYgYXJyaXZhbHMuc2l6ZSgpID09IDEpIHsKKwkJCQkJTm9kZSBuID0gYXJyaXZhbHMua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7CisJCQkJCWFzc2VydChuLmVxdWFscyhnZXROb2RlKCkpKTsKKwkJCQkJZG91YmxlIGZhY3RvciA9IGFycml2YWxzLmdldChuKSAvIHBvcENvdW50OworCQkJCQlpZihEb3VibGUuaXNOYU4oZmFjdG9yKSB8fCBEb3VibGUuaXNJbmZpbml0ZShmYWN0b3IpKSBmYWN0b3IgPSAwLjA7Ly8gZG8gbm90aGluZworCQkJCQlTSUxhYmVsVmFsdWUgYWRkViA9IChTSUxhYmVsVmFsdWUpRWNvcmVVdGlsLmNvcHkodGhpcy5nZXRDdXJyZW50VmFsdWUoKSk7CisJCQkJCWFkZFYuc2NhbGUoZmFjdG9yKTsKKwkJCQkJKChTSUxhYmVsVmFsdWUpdGhpcy5nZXRDdXJyZW50VmFsdWUoKSkuYWRkKChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpYWRkVik7CisJCQkJfQorCQkJCWlmKGRlcGFydHVyZXMgIT0gbnVsbCAmJiBkZXBhcnR1cmVzLnNpemUoKSA9PSAxKSB7CisJCQkJCU5vZGUgbiA9IGRlcGFydHVyZXMua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7CisJCQkJCWFzc2VydChuLmVxdWFscyhnZXROb2RlKCkpKTsKKwkJCQkJZG91YmxlIGZhY3RvciA9IGRlcGFydHVyZXMuZ2V0KG4pIC8gcG9wQ291bnQ7CisJCQkJCWlmKERvdWJsZS5pc05hTihmYWN0b3IpIHx8IERvdWJsZS5pc0luZmluaXRlKGZhY3RvcikpIGZhY3RvciA9IDAuMDsvLyBkbyBub3RoaW5nCisJCQkJCVNJTGFiZWxWYWx1ZSBzdWJWID0gKFNJTGFiZWxWYWx1ZSlFY29yZVV0aWwuY29weSh0aGlzLmdldEN1cnJlbnRWYWx1ZSgpKTsKKwkJCQkJc3ViVi5zY2FsZShmYWN0b3IpOworCQkJCQkoKFNJTGFiZWxWYWx1ZSl0aGlzLmdldEN1cnJlbnRWYWx1ZSgpKS5zdWIoKEludGVncmF0aW9uTGFiZWxWYWx1ZSlzdWJWKTsKKwkJCQl9CisJCQkJCisJCQkJCQorCQkJfQorCQl9CisJfQorCisJCit9IC8vIFNFSVJMYWJlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU0VJUkxhYmVsVmFsdWVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1NFSVJMYWJlbFZhbHVlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZDJiYmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1NFSVJMYWJlbFZhbHVlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNDU5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbFZhbHVlOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TRUlSIExhYmVsIFZhbHVlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TRUlSTGFiZWxWYWx1ZUltcGwjZ2V0RSA8ZW0+RTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNFSVJMYWJlbFZhbHVlSW1wbCBleHRlbmRzIFNJUkxhYmVsVmFsdWVJbXBsIGltcGxlbWVudHMKKwkJU0VJUkxhYmVsVmFsdWUgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFKCkgPGVtPkU8L2VtPn0nIGF0dHJpYnV0ZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNnZXRFKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBFX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RSgpIDxlbT5FPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjZ2V0RSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBlID0gRV9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU0VJUkxhYmVsVmFsdWVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZXMgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisJICogCisJICogQHBhcmFtIHMKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc3VzY2VwdGlibGUgcG9wdWxhdGlvbiBtZW1iZXJzCisJICogQHBhcmFtIGUKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZXhwb3NlZCBwb3B1bGF0aW9uIG1lbWJlcnMKKwkgKiBAcGFyYW0gaVIKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcmVjb3ZlcmluZyBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gbWVtYmVycworCSAqIEBwYXJhbSBpRgorCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBmYXRhbGx5IGluZmVjdGlvdXMgcG9wdWxhdGlvbiBtZW1iZXJzCisJICogICAgICAgIAorCSAqIEBwYXJhbSBpbmNpZGVuY2UKKwkgKiAgICAgICAgICAgIHRoZSBuZXcgaW5jaWRlbmNlIGZyb20gdGhlIGludGVyYWN0aW9uIHRlcm0gaW4gdGhlIGNvbXBhcnRtZW50IG1vZGVsCisJICogCisJICogQHBhcmFtIHIKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcmVjb3ZlcmVkIHBvcHVsYXRpb24gbWVtYmVycworCSAqIEBwYXJhbSBiaXJ0aHMKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYmlydGhzIHRoYXQgaGF2ZSBvY2N1cnJlZCBpbiB0aGUgcG9wdWxhdGlvbgorCSAqIEBwYXJhbSBkZWF0aHMKKwkgKiAgICAgICAgICAgIHRoZSB0b3RhbCBudW1iZXIgb2YgZGVhdGhzIHRoYXQgaGF2ZSBvY2N1cnJlZCBpbiB0aGUgcG9wdWxhdGlvbgorCSAqIEBwYXJhbSBkaXNlYXNlRGVhdGhzCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGRlYXRocyBkdWUgdG8gdGhlIGRpc2Vhc2UgdGhhdCBoYXZlIG9jY3VycmVkIGluCisJICogICAgICAgICAgICB0aGUgcG9wdWxhdGlvbgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqLworCXB1YmxpYyBTRUlSTGFiZWxWYWx1ZUltcGwoZmluYWwgZG91YmxlIHMsIGZpbmFsIGRvdWJsZSBlLCBmaW5hbCBkb3VibGUgaSwgZG91YmxlIGluY2lkZW5jZSwKKwkJCWZpbmFsIGRvdWJsZSByLCAKKwkJCWZpbmFsIGRvdWJsZSBkaXNlYXNlRGVhdGhzKSB7CisJCXN1cGVyKHMsIGksIGluY2lkZW5jZSwgciwgZGlzZWFzZURlYXRocyk7CisJCXRoaXMuZSA9IGU7CisJfSAvLyBTRUlSTGFiZWxWYWx1ZUltcGwKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2VzIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorCSAqIAorCSAqIEBwYXJhbSBzCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHN1c2NlcHRpYmxlIHBvcHVsYXRpb24gbWVtYmVycworCSAqIEBwYXJhbSBlCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGV4cG9zZWQgcG9wdWxhdGlvbiBtZW1iZXJzCisJICogQHBhcmFtIGlSCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHJlY292ZXJpbmcgaW5mZWN0aW91cyBwb3B1bGF0aW9uIG1lbWJlcnMKKwkgKiBAcGFyYW0gaUYKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZmF0YWxseSBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gbWVtYmVycworCSAqCisJICogQHBhcmFtIHIKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcmVjb3ZlcmVkIHBvcHVsYXRpb24gbWVtYmVycworCSAqIEBwYXJhbSBiaXJ0aHMKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYmlydGhzIHRoYXQgaGF2ZSBvY2N1cnJlZCBpbiB0aGUgcG9wdWxhdGlvbgorCSAqIEBwYXJhbSBkZWF0aHMKKwkgKiAgICAgICAgICAgIHRoZSB0b3RhbCBudW1iZXIgb2YgZGVhdGhzIHRoYXQgaGF2ZSBvY2N1cnJlZCBpbiB0aGUgcG9wdWxhdGlvbgorCSAqIEBwYXJhbSBkaXNlYXNlRGVhdGhzCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGRlYXRocyBkdWUgdG8gdGhlIGRpc2Vhc2UgdGhhdCBoYXZlIG9jY3VycmVkIGluCisJICogICAgICAgICAgICB0aGUgcG9wdWxhdGlvbgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqLworCXB1YmxpYyBTRUlSTGFiZWxWYWx1ZUltcGwoZmluYWwgZG91YmxlIHMsIGZpbmFsIGRvdWJsZSBlLCBmaW5hbCBkb3VibGUgaSwgCisJCQlmaW5hbCBkb3VibGUgciwgCisJCQlmaW5hbCBkb3VibGUgZGlzZWFzZURlYXRocykgeworCQlzdXBlcihzLCBpLCAwLjAsIHIsIGRpc2Vhc2VEZWF0aHMpOworCQl0aGlzLmUgPSBlOworCX0gLy8gU0VJUkxhYmVsVmFsdWVJbXBsCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU0VJUl9MQUJFTF9WQUxVRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRFKCkgeworCQlyZXR1cm4gZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuZXdFCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEUoZG91YmxlIG5ld0UpIHsKKwkJZG91YmxlIG9sZEUgPSBlOworCQllID0gbmV3RTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNFSVJfTEFCRUxfVkFMVUVfX0UsIG9sZEUsIGUpKTsKKwl9CisKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lSTGFiZWxWYWx1ZUltcGwjZ2V0UG9wdWxhdGlvbkNvdW50KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgZG91YmxlIGdldFBvcHVsYXRpb25Db3VudCgpIHsKKwkJcmV0dXJuIGUgKyBzdXBlci5nZXRQb3B1bGF0aW9uQ291bnQoKTsKKwl9IC8vIGdldFBvcHVsYXRpb25Db3VudAorCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgemVyb091dFBvcHVsYXRpb25Db3VudCgpIHsKKwkJc3VwZXIuemVyb091dFBvcHVsYXRpb25Db3VudCgpOworCQlzZXRFKEVfRURFRkFVTFQpOworCX0gLy8gemVyb091dFBvcHVsYXRpb25Db3VudAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJMYWJlbFZhbHVlSW1wbCNzZXQob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgc2V0KEludGVncmF0aW9uTGFiZWxWYWx1ZSB2YWx1ZSkgeworCQlzdXBlci5zZXQodmFsdWUpOworCQlzZXRFKCgoU0VJUkxhYmVsVmFsdWUpIHZhbHVlKS5nZXRFKCkpOworCQlyZXR1cm4gdGhpczsKKwl9IC8vIHNldAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJMYWJlbFZhbHVlSW1wbCNhZGQob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgYWRkKEludGVncmF0aW9uTGFiZWxWYWx1ZSB2YWx1ZSkgeworCQlzdXBlci5hZGQodmFsdWUpOworCQlzZXRFKGdldEUoKSArICgoU0VJUkxhYmVsVmFsdWUpIHZhbHVlKS5nZXRFKCkpOworCQlyZXR1cm4gdGhpczsKKwl9IC8vIGFkZAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJMYWJlbFZhbHVlSW1wbCNzdWIob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgc3ViKEludGVncmF0aW9uTGFiZWxWYWx1ZSB2YWx1ZSkgeworCQlzdXBlci5zdWIodmFsdWUpOworCQlzZXRFKGdldEUoKSAtICgoU0VJUkxhYmVsVmFsdWUpIHZhbHVlKS5nZXRFKCkpOworCQlyZXR1cm4gdGhpczsKKwl9IC8vIHN1YgorCQorCUBPdmVycmlkZQorCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHNjYWxlKGRvdWJsZSBzY2FsZUZhY3RvcikgeworCQlzdXBlci5zY2FsZShzY2FsZUZhY3Rvcik7CisJCXNldEUoZ2V0RSgpICpzY2FsZUZhY3Rvcik7CisJCXJldHVybiB0aGlzOworCX0gLy8gc2NhbGUKKwkKKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBhZGQoZG91YmxlIGFkZGl0aW9uKSB7CisJCXN1cGVyLmFkZChhZGRpdGlvbik7CisJCXNldEUoZ2V0RSgpICthZGRpdGlvbik7CisJCXJldHVybiB0aGlzOworCX0gLy8gc2NhbGUKKworCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGFicygpIHsKKwkJc3VwZXIuYWJzKCk7CisJCXNldEUoTWF0aC5hYnMoZ2V0RSgpKSk7CisJCXJldHVybiB0aGlzOworCX0gLy8gc2NhbGUKKwkKKwkKKwlwdWJsaWMgSW50ZWdyYXRpb25MYWJlbFZhbHVlIGRpdmlkZShJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgZCkgeworCQlTRUlSTGFiZWxWYWx1ZSBfc2NhbGUgPSAoU0VJUkxhYmVsVmFsdWUpZDsKKwkJZG91YmxlIHNTY2FsZWQgPSBNYXRoLmFicyhzKSAvIE1hdGguYWJzKF9zY2FsZS5nZXRTKCkpOworCQlkb3VibGUgaVNjYWxlZCA9IE1hdGguYWJzKGkpIC8gTWF0aC5hYnMoX3NjYWxlLmdldEkoKSk7CisJCWRvdWJsZSByU2NhbGVkID0gTWF0aC5hYnMocikgLyBNYXRoLmFicyhfc2NhbGUuZ2V0UigpKTsKKwkJZG91YmxlIGVTY2FsZWQgPSBNYXRoLmFicyhlKSAvIE1hdGguYWJzKF9zY2FsZS5nZXRFKCkpOworCQlkb3VibGUgZGRTY2FsZWQgPSBNYXRoLmFicyhkaXNlYXNlRGVhdGhzKSAvIE1hdGguYWJzKF9zY2FsZS5nZXREaXNlYXNlRGVhdGhzKCkpOworCQlzZXRTKHNTY2FsZWQpOworCQlzZXRJKGlTY2FsZWQpOworCQlzZXRSKHJTY2FsZWQpOworCQlzZXRFKGVTY2FsZWQpOworCQlzZXREaXNlYXNlRGVhdGhzKGRkU2NhbGVkKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCQorCXB1YmxpYyBkb3VibGUgbWF4KCkgeworCQlkb3VibGUgbWF4OworCQlpZihzID4gaSAmJiBzID4gciAmJiBzID4gZSAmJiBzID4gZGlzZWFzZURlYXRocykKKwkJCW1heCA9IHM7CisJCWVsc2UgaWYoaSA+IHIgJiYgaSA+IGUgJiYgIGkgPiBkaXNlYXNlRGVhdGhzKSBtYXggPSBpOworCQllbHNlIGlmKHIgPiBlICYmIHIgPiAgZGlzZWFzZURlYXRocykgbWF4ID0gcjsKKwkJZWxzZSBpZihlICA+IGRpc2Vhc2VEZWF0aHMpIG1heCA9IGU7CisJCWVsc2UgbWF4ID0gZGlzZWFzZURlYXRoczsKKwkJcmV0dXJuIG1heDsgIAorCX0KKwkKKwkvKioKKwkgKiBBZGp1c3Qgd2hlbiBhIGRlbHRhIHZhbHVlIGlzIGJhZCwgZS5nLiBmb3JjZXMgdGhlIAorCSAqIHRhcmdldCB0byBnbyBuZWdhdGl2ZSBpbiBhbnkgc3RhdGUuCisJICogCisJICogQHJldHVybiBib29sZWFuCisJICogQG92ZXJyaWRlCisJICovCisJcHVibGljIGJvb2xlYW4gYWRqdXN0RGVsdGEoSW50ZWdyYXRpb25MYWJlbFZhbHVlIHRhcmdldCkgeworCQlTRUlSTGFiZWxWYWx1ZSBzZWlyVmFsdWUgPSAoU0VJUkxhYmVsVmFsdWUpdGFyZ2V0OworCQkKKwkJYm9vbGVhbiBhZGp1c3RlZCA9IGZhbHNlOworCQlkb3VibGUgbmV3UyA9IHRoaXMuZ2V0UygpICsgc2VpclZhbHVlLmdldFMoKTsKKwkJZG91YmxlIG5ld0UgPSB0aGlzLmdldEUoKSArIHNlaXJWYWx1ZS5nZXRFKCk7CisJCWRvdWJsZSBuZXdJID0gdGhpcy5nZXRJKCkgKyBzZWlyVmFsdWUuZ2V0SSgpOworCQlkb3VibGUgbmV3UiA9IHRoaXMuZ2V0UigpICsgc2VpclZhbHVlLmdldFIoKTsKKwkJZG91YmxlIG5ld0REID0gdGhpcy5nZXREaXNlYXNlRGVhdGhzKCkgK3NlaXJWYWx1ZS5nZXREaXNlYXNlRGVhdGhzKCk7CisJCQorCQlkb3VibGUgZmFjdG9yID0gMS4wOworCQlpZihuZXdTIDwgbmV3RSAmJiBuZXdTIDwgbmV3SSAmJiBuZXdTIDwgbmV3UiAmJiBuZXdTIDwgbmV3REQgJiYgbmV3UyA8IDAuMCkgeworCQkJLy8gU2NhbGUgdXNpbmcgUworCQkJYWRqdXN0ZWQgPSB0cnVlOworCQkJZmFjdG9yID0gLXNlaXJWYWx1ZS5nZXRTKCkvdGhpcy5nZXRTKCk7CisJCX0gZWxzZSBpZihuZXdFIDwgbmV3SSAmJiBuZXdFIDwgbmV3UiAmJiBuZXdFIDwgbmV3REQgJiYgbmV3RSA8IDAuMCkgeworCQkJLy8gU2NhbGUgdXNpbmcgRQorCQkJYWRqdXN0ZWQgPSB0cnVlOworCQkJZmFjdG9yID0gLXNlaXJWYWx1ZS5nZXRFKCkvdGhpcy5nZXRFKCk7CisJCX0gZWxzZSBpZihuZXdJIDwgbmV3UiAmJiBuZXdJIDwgbmV3REQgJiYgbmV3SSA8IDAuMCkgeworCQkJLy8gU2NhbGUgdXNpbmcgSQorCQkJYWRqdXN0ZWQgPSB0cnVlOworCQkJZmFjdG9yID0gLXNlaXJWYWx1ZS5nZXRJKCkvdGhpcy5nZXRJKCk7CisJCX0gZWxzZSBpZihuZXdSIDwgbmV3REQgJiYgbmV3UiA8IDAuMCkgeworCQkJLy8gU2NhbGUgdXNpbmcgUgorCQkJYWRqdXN0ZWQgPSB0cnVlOworCQkJZmFjdG9yID0gLXNlaXJWYWx1ZS5nZXRSKCkvdGhpcy5nZXRSKCk7CisJCX0gZWxzZSBpZihuZXdERCA8IDApIHsKKwkJCS8vIFNjYWxlIHVzaW5nIFIKKwkJCWFkanVzdGVkID0gdHJ1ZTsKKwkJCWZhY3RvciA9IC1zZWlyVmFsdWUuZ2V0RGlzZWFzZURlYXRocygpL3RoaXMuZ2V0RGlzZWFzZURlYXRocygpOwkJCQorCQl9CisJCWlmKGFkanVzdGVkKSB0aGlzLnNjYWxlKGZhY3Rvcik7CisJCQorCQkvLyBEdWUgdG8gcHJlY2lzaW9uIGxpbWl0YXRpb25zIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRoZSBudW1iZXIgaWYgdGlueSBuZWdhdGl2ZS4gQWRqdXN0IGlmIG5lY2Vzc2FyeQorCQluZXdTID0gdGhpcy5nZXRTKCkgKyBzZWlyVmFsdWUuZ2V0UygpOworCQluZXdFID0gdGhpcy5nZXRFKCkgKyBzZWlyVmFsdWUuZ2V0RSgpOworCQluZXdJID0gdGhpcy5nZXRJKCkgKyBzZWlyVmFsdWUuZ2V0SSgpOworCQluZXdSID0gdGhpcy5nZXRSKCkgKyBzZWlyVmFsdWUuZ2V0UigpOworCQluZXdERCA9IHRoaXMuZ2V0RGlzZWFzZURlYXRocygpICsgc2VpclZhbHVlLmdldERpc2Vhc2VEZWF0aHMoKTsKKwkJaWYobmV3UzwwKQorCQkJdGhpcy5zZXRTKC1zZWlyVmFsdWUuZ2V0UygpKTsKKwkJaWYobmV3RTwwKQorCQkJdGhpcy5zZXRFKC1zZWlyVmFsdWUuZ2V0RSgpKTsKKwkJaWYobmV3STwwKQorCQkJdGhpcy5zZXRJKC1zZWlyVmFsdWUuZ2V0SSgpKTsKKwkJaWYobmV3UjwwKQorCQkJdGhpcy5zZXRSKC1zZWlyVmFsdWUuZ2V0UigpKTsKKwkJaWYobmV3REQgPCAwKQorCQkJdGhpcy5zZXREaXNlYXNlRGVhdGhzKC1zZWlyVmFsdWUuZ2V0RGlzZWFzZURlYXRocygpKTsKKwkJcmV0dXJuIGFkanVzdGVkOworCX0KKworCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lSTGFiZWxWYWx1ZUltcGwjcmVzZXQoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlzdXBlci5yZXNldCgpOworCQlzZXRFKEVfRURFRkFVTFQpOworCX0gLy8gcmVzZXQKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJUkxhYmVsVmFsdWVJbXBsI3NhbmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5zYW5lKCk7CisKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBnZXRFKCkgPj0gRV9FREVGQVVMVDsKKwkJYXNzZXJ0IHJldFZhbHVlOworCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgZ2V0RSgpIDw9IE1BWF9QT1BVTEFUSU9OX1ZBTFVFOworCQlhc3NlcnQgcmV0VmFsdWU7CQkKKwkJCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgIURvdWJsZS5pc0luZmluaXRlKGdldEUoKSk7CisJCWFzc2VydCByZXRWYWx1ZTsKKwkJCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgIURvdWJsZS5pc05hTihnZXRFKCkpOworCQlhc3NlcnQgcmV0VmFsdWU7CisJCQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBzYW5lCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcGFyYW0gcmVzb2x2ZQorCSAqIEBwYXJhbSBjb3JlVHlwZQorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VJUl9MQUJFTF9WQUxVRV9fRToKKwkJCQlyZXR1cm4gZ2V0RSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSBuZXdWYWx1ZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VJUl9MQUJFTF9WQUxVRV9fRToKKwkJCQlzZXRFKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VJUl9MQUJFTF9WQUxVRV9fRToKKwkJCQlzZXRFKEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUlSX0xBQkVMX1ZBTFVFX19FOgorCQkJCXJldHVybiBlICE9IEVfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpCisJCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlyZXN1bHQuYXBwZW5kKCJzOiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZ2V0Rm9ybWF0dGVyKCkuZm9ybWF0KHMpKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBlOiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZ2V0Rm9ybWF0dGVyKCkuZm9ybWF0KGUpKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBpOiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZ2V0Rm9ybWF0dGVyKCkuZm9ybWF0KGkpKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCByOiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZ2V0Rm9ybWF0dGVyKCkuZm9ybWF0KHIpKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBERDoiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGdldEZvcm1hdHRlcigpLmZvcm1hdChnZXREaXNlYXNlRGVhdGhzKCkpKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0gLy8gdG9TdHJpbmcKKworfSAvLyBTRUlSTGFiZWxWYWx1ZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU0lEaXNlYXNlTW9kZWxTdGF0ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU0lEaXNlYXNlTW9kZWxTdGF0ZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODM4YjE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TSURpc2Vhc2VNb2RlbFN0YXRlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lEaXNlYXNlTW9kZWxTdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TSSBEaXNlYXNlIE1vZGVsIFN0YXRlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU0lEaXNlYXNlTW9kZWxTdGF0ZUltcGwgZXh0ZW5kcyBTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlSW1wbAorCQlpbXBsZW1lbnRzIFNJRGlzZWFzZU1vZGVsU3RhdGUgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU0lEaXNlYXNlTW9kZWxTdGF0ZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlSW1wbCNzYW5lKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzYW5lKCkgeworCQlib29sZWFuIHJldFZhbHVlID0gc3VwZXIuc2FuZSgpOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHNhbmUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TSV9ESVNFQVNFX01PREVMX1NUQVRFOworCX0KKworfSAvLyBTSURpc2Vhc2VNb2RlbFN0YXRlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TSUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU0lJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIwNjYxOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU0lJbXBsLmphdmEKQEAgLTAsMCArMSwxMTExIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU2ltcGxlRGF0YUV4Y2hhbmdlTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLk1pZ3JhdGlvbkVkZ2VMYWJlbEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5SZWdpb247CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbFN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0k7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJSW5mZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbDsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TSTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lJbXBsI2dldFRyYW5zbWlzc2lvblJhdGUgPGVtPlRyYW5zbWlzc2lvbiBSYXRlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSUltcGwjZ2V0Tm9uTGluZWFyaXR5Q29lZmZpY2llbnQgPGVtPk5vbiBMaW5lYXJpdHkgQ29lZmZpY2llbnQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJSW1wbCNnZXRSZWNvdmVyeVJhdGUgPGVtPlJlY292ZXJ5IFJhdGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJSW1wbCNnZXRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSA8ZW0+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lJbXBsI2dldFBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uIDxlbT5QaHlzaWNhbGx5IEFkamFjZW50IEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lJbXBsI2dldFJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24gPGVtPlJvYWQgTmV0d29yayBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJSW1wbCNnZXRJbmZlY3Rpb3VzTW9ydGFsaXR5IDxlbT5JbmZlY3Rpb3VzIE1vcnRhbGl0eTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lJbXBsI2dldENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UgPGVtPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNJSW1wbCBleHRlbmRzIFN0YW5kYXJkRGlzZWFzZU1vZGVsSW1wbCBpbXBsZW1lbnRzIFNJIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNtaXNzaW9uUmF0ZSgpIDxlbT5UcmFuc21pc3Npb24gUmF0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRyYW5zbWlzc2lvblJhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFRSQU5TTUlTU0lPTl9SQVRFX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNtaXNzaW9uUmF0ZSgpIDxlbT5UcmFuc21pc3Npb24gUmF0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRyYW5zbWlzc2lvblJhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgdHJhbnNtaXNzaW9uUmF0ZSA9IFRSQU5TTUlTU0lPTl9SQVRFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vbkxpbmVhcml0eUNvZWZmaWNpZW50KCkgPGVtPk5vbiBMaW5lYXJpdHkgQ29lZmZpY2llbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROb25MaW5lYXJpdHlDb2VmZmljaWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVF9FREVGQVVMVCA9IDEuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vbkxpbmVhcml0eUNvZWZmaWNpZW50KCkgPGVtPk5vbiBMaW5lYXJpdHkgQ29lZmZpY2llbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROb25MaW5lYXJpdHlDb2VmZmljaWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBub25MaW5lYXJpdHlDb2VmZmljaWVudCA9IE5PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVjb3ZlcnlSYXRlKCkgPGVtPlJlY292ZXJ5IFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWNvdmVyeVJhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFJFQ09WRVJZX1JBVEVfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWNvdmVyeVJhdGUoKSA8ZW0+UmVjb3ZlcnkgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlY292ZXJ5UmF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSByZWNvdmVyeVJhdGUgPSBSRUNPVkVSWV9SQVRFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKCkgPGVtPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURV9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKCkgPGVtPkluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBpbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSA9IElORkVDVElPVVNfTU9SVEFMSVRZX1JBVEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb24oKSA8ZW0+UGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBQSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTl9FREVGQVVMVCA9IDAuMDU7CisJCisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbigpIDxlbT5QaHlzaWNhbGx5IEFkamFjZW50IEluZmVjdGlvdXMgUHJvcG9ydGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgcGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb24gPSBQSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uKCkgPGVtPlJvYWQgTmV0d29yayBJbmZlY3Rpb3VzIFByb3BvcnRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFJPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT05fRURFRkFVTFQgPSAwLjAxOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbigpIDxlbT5Sb2FkIE5ldHdvcmsgSW5mZWN0aW91cyBQcm9wb3J0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIHJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24gPSBST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZmVjdGlvdXNNb3J0YWxpdHkoKSA8ZW0+SW5mZWN0aW91cyBNb3J0YWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEluZmVjdGlvdXNNb3J0YWxpdHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIElORkVDVElPVVNfTU9SVEFMSVRZX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5mZWN0aW91c01vcnRhbGl0eSgpIDxlbT5JbmZlY3Rpb3VzIE1vcnRhbGl0eTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW5mZWN0aW91c01vcnRhbGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBpbmZlY3Rpb3VzTW9ydGFsaXR5ID0gSU5GRUNUSU9VU19NT1JUQUxJVFlfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSgpIDxlbT5DaGFyYWN0ZXJpc3RpYyBNaXhpbmcgRGlzdGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIENIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRV9FREVGQVVMVCA9IDIuMjU7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlKCkgPGVtPkNoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBjaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlID0gQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTSUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHNpRGlzZWFzZU1vZGVsCisJICogICAgICAgICAgICB0aGUgU0kgZGlzZWFzZSBtb2RlbCB0byBiZSBpbml0aWFsaXplZAorCSAqIEBwYXJhbSBkaXNlYXNlTW9kZWxOYW1lCisJICogQHBhcmFtIGJhY2tncm91bmRNb3J0YWxpdHlSYXRlCisJICogQHBhcmFtIGluZmVjdGlvdXNNb3J0YWxpdHkKKwkgKiBAcGFyYW0gaW5mZWN0aW91c01vcnRhbGl0eVJhdGUKKwkgKiAgICAgICAgICAgIHRoZSByYXRlIGF0IHdoaWNoIGZhdGFsbHkgaW5mZWN0aW91cyBwb3B1bGF0aW9uIG1lbWJlcnMgZGllCisJICogQHBhcmFtIHRyYW5zbWlzc2lvblJhdGUKKwkgKiBAcGFyYW0gcmVjb3ZlcnlSYXRlCisJICogQHBhcmFtIGltbXVuaXR5TG9zc1JhdGUKKwkgKiBAcGFyYW0gaW5jdWJhdGlvblJhdGUKKwkgKiBAcGFyYW0gbm9uTGluZWFyaXR5Q29lZmZpY2llbnQKKwkgKiBAcGFyYW0gdGltZVBlcmlvZAorCSAqIEBwYXJhbSBwb3B1bGF0aW9uSWRlbnRpZmllcgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgU0kgaW5pdGlhbGl6ZVNJRGlzZWFzZU1vZGVsKGZpbmFsIFNJIHNpRGlzZWFzZU1vZGVsLAorCQkJZmluYWwgU3RyaW5nIGRpc2Vhc2VNb2RlbE5hbWUsCisJCQlmaW5hbCBkb3VibGUgYmFja2dyb3VuZE1vcnRhbGl0eVJhdGUsCisJCQlmaW5hbCBkb3VibGUgaW5mZWN0aW91c01vcnRhbGl0eVJhdGUsCisJCQlmaW5hbCBkb3VibGUgdHJhbnNtaXNzaW9uUmF0ZSwgZmluYWwgZG91YmxlIHJlY292ZXJ5UmF0ZSwKKwkJCWZpbmFsIGRvdWJsZSBub25MaW5lYXJpdHlDb2VmZmljaWVudCwgZmluYWwgbG9uZyB0aW1lUGVyaW9kLAorCQkJZmluYWwgU3RyaW5nIHBvcHVsYXRpb25JZGVudGlmaWVyKSB7CisJCVN0YW5kYXJkRGlzZWFzZU1vZGVsSW1wbC5pbml0aWFsaXplU3RhbmRhcmREaXNlYXNlTW9kZWwoc2lEaXNlYXNlTW9kZWwsCisJCQkJZGlzZWFzZU1vZGVsTmFtZSwgYmFja2dyb3VuZE1vcnRhbGl0eVJhdGUsIHRpbWVQZXJpb2QsCisJCQkJcG9wdWxhdGlvbklkZW50aWZpZXIpOworCQlzaURpc2Vhc2VNb2RlbC5zZXRUcmFuc21pc3Npb25SYXRlKHRyYW5zbWlzc2lvblJhdGUpOworCQlzaURpc2Vhc2VNb2RlbC5zZXRSZWNvdmVyeVJhdGUocmVjb3ZlcnlSYXRlKTsKKwkJc2lEaXNlYXNlTW9kZWwuc2V0SW5mZWN0aW91c01vcnRhbGl0eVJhdGUoaW5mZWN0aW91c01vcnRhbGl0eVJhdGUpOworCQlzaURpc2Vhc2VNb2RlbC5zZXROb25MaW5lYXJpdHlDb2VmZmljaWVudChub25MaW5lYXJpdHlDb2VmZmljaWVudCk7CisJCXJldHVybiBzaURpc2Vhc2VNb2RlbDsKKwl9IC8vIGluaXRpYWxpemVTSVJEaXNlYXNlTW9kZWwKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmREaXNlYXNlTW9kZWxJbXBsI2NvbXB1dGVEZWF0aHMob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSwKKwkgKiAgICAgIGxvbmcpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjb21wdXRlRGlzZWFzZURlYXRoc0RlbHRhcygKKwkJCWZpbmFsIFNURU1UaW1lIHRpbWUsIGZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZUxhYmVsLCBmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY3VycmVudExhYmVsVmFsdWUsIGZpbmFsIGxvbmcgdGltZURlbHRhLCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHJldHVyblZhbHVlKSB7CisKKwkJZmluYWwgU0lMYWJlbFZhbHVlIGN1cnJlbnRTRUlSID0gKFNJTGFiZWxWYWx1ZSkgY3VycmVudExhYmVsVmFsdWU7CisJCQorCQlmaW5hbCBkb3VibGUgYWRqdXN0ZWRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSA9IGdldEFkanVzdGVkSW5mZWN0aW91c01vcnRhbGl0eVJhdGUodGltZURlbHRhKTsKKwkJCisJCWZpbmFsIGRvdWJsZSBkaXNlYXNlRGVhdGhzID0gYWRqdXN0ZWRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZQorCQkJCSogY3VycmVudFNFSVIuZ2V0SSgpOworCisJCVNJTGFiZWxWYWx1ZUltcGwgcmV0ID0gKFNJTGFiZWxWYWx1ZUltcGwpcmV0dXJuVmFsdWU7CisJCXJldC5zZXRTKDAuMCk7CisJCXJldC5zZXRJKC1kaXNlYXNlRGVhdGhzKTsKKwkJcmV0LnNldEluY2lkZW5jZSgwLjApOworCQlyZXQuc2V0RGlzZWFzZURlYXRocyhkaXNlYXNlRGVhdGhzKTsKKwkJCisJCXJldHVybiByZXQ7CisJfSAvLyBjb21wdXRlQmlydGhEZWF0aHNEZWx0YXMKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmREaXNlYXNlTW9kZWxJbXBsI2NvbXB1dGVUcmFuc2l0aW9ucyhvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlLAorCSAqICAgICAgbG9uZywgZG91YmxlLCBsb25nKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY29tcHV0ZURpc2Vhc2VEZWx0YXMoCisJCQlmaW5hbCBTVEVNVGltZSB0aW1lLAorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGN1cnJlbnRTdGF0ZSwKKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZUxhYmVsLCBmaW5hbCBsb25nIHRpbWVEZWx0YSwgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSByZXR1cm5WYWx1ZSkgeworCQkKKwkJZmluYWwgU0lMYWJlbFZhbHVlIGN1cnJlbnRTSSA9IChTSUxhYmVsVmFsdWUpIGN1cnJlbnRTdGF0ZTsKKwkJCisJCS8vIFRoaXMgaXMgYmV0YSoKKwkJZG91YmxlIHRyYW5zbWlzc2lvblJhdGUgPSBnZXRBZGp1c3RlZFRyYW5zbWlzc2lvblJhdGUodGltZURlbHRhKTsKKwkJCQkKKwkJaWYoIXRoaXMuaXNGcmVxdWVuY3lEZXBlbmRlbnQoKSkgdHJhbnNtaXNzaW9uUmF0ZSAqPSBnZXRUcmFuc21pc3Npb25SYXRlU2NhbGVGYWN0b3IoZGlzZWFzZUxhYmVsKTsKKworCQkvLyBUaGUgZWZmZWN0aXZlIEluZmVjdGlvdXMgcG9wdWxhdGlvbiAgaXMgYSBkaW1lbnNpb25sZXMgbnVtYmVyIG5vcm1hbGl6ZSBieSB0b3RhbAorCQkvLyBwb3B1bGF0aW9uIHVzZWQgaW4gdGVoIGNvbXB1dGF0aW9uIG9mIGJldHMqUyppIHdoZXJlIGkgPSBJZWZmZWN0aXZlL1BvcC4KKwkJLy8gVGhpcyBpbmNsdWRlcyBhIGNvcnJlY3Rpb24gdG8gdGhlIGN1cnJlbnQKKwkJLy8gaW5mZWN0aW91cyBwb3B1bGF0aW9uIChJZWZmZWN0aXZlKSBiYXNlZCBvbiB0aGUgY29uc2VydmVkIGV4Y2hhbmdlIG9mIHBlb3BsZSAoY2lyY3VsYXRpb24pCisJCS8vIGJldHdlZW4gcmVnaW9ucy4gTm90ZSB0aGF0IHRoaXMgaXMgbm8gdGhlICJhcnJpdmFscyIgYW5kICJkZXBhcnR1cmVzIiB3aGljaCBhcmUKKwkJLy8gYSBkaWZmZXJlbnQgcHJvY2Vzcy4KKwkJZmluYWwgZG91YmxlIGVmZmVjdGl2ZUluZmVjdGlvdXMgPSBnZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cyhkaXNlYXNlTGFiZWwuZ2V0Tm9kZSgpLCBkaXNlYXNlTGFiZWwsIGN1cnJlbnRTSS5nZXRJKCkpOworCisJCS8qCisJCSAqIENvbXB1dGUgc3RhdGUgdHJhbnNpdGlvbnMKKwkJICogCisJCSAqIFJlZ2FyZGluZyBjb21wdXRpbmcgdGhlIG51bWJlciBvZiB0cmFuc2l0aW9ucyBmcm9tIFN1c2NlcHRpYmxlIHRvIEV4cG9zZWQ6CisJCSAqIEluIGEgbGluZWFyIG1vZGVsIHRoZSAiZWZmZWN0aXZlIiBudW1iZXIgb2YgaW5mZWN0aW91cyBwZW9wbGUgaXMganVzdAorCQkgKiB0aGUgbnVtYmVyIG9mIGluZmVjdGlvdXMgcGVvcGxlIEluIGEgbm9ubGluZWFyIG1vZGVsIHdlIGhhdmUgYQorCQkgKiBub25MaW5lYXJpdHkgZXhwb25lbnQgdGhhdCBpcyA+IDEgdGhpcyBtb2RlbHMgdGhlIGVmZmVjdCBvZiBpbW11bmUKKwkJICogc3lzdGVtIHNhdHVyYXRpb24gd2hlbiBTdXNjZXB0aWJsZSBwZW9wbGUgYXJlIGV4cG9zZWQgdG8gbGFyZ2UKKwkJICogbnVtYmVycyBvZiBpbmZlY3Rpb3VzIHBlb3BsZS4gdGhlbiB0aGUgImVmZmVjdGl2ZSIgbnVtYmVyIG9mCisJCSAqIGluZmVjdGlvdXMgcGVvcGxlIGlzIElebm9uTGluZWFyaXR5IGV4cG9uZW50IHRvIGFsbG93IGZvciBlaXRoZXIKKwkJICogbGluZWFyIG9yIG5vbmxpbmVhciBtb2RlbHMgd2UgYWx3YXlzIGNhbGN1bGF0ZSBJXm5vbkxpbmVhcml0eQorCQkgKiBleHBvbmVudCBhbmQgYWxsb3cgbm9uTGluZWFyaXR5IGV4cG9uZW50ID49IDEuMAorCQkgKi8KKwkJCisJCS8vIE5lZWQgdG8gY2hlY2tlZCB3aGF0IGRvIGRvIGhlcmUuIElmIG5vbiBsaW5lYXIgY29lZmZpY2llbnQgaXMgbm90IDEgYW5kCisJCS8vIHRoZSBlZmZlY3RpdmUgaW5mZWN0aW91cyBpcyBuZWdhdGl2ZSAod2hpY2ggaXMgcG9zc2libGUpLCB3aGF0IGRvIGRvPyAKKwkJLy8gTGV0J3MgZmFsbCBiYWNrIG9uIHRoZSBsaW5lYXIgbWV0aG9kIGZvciBub3cuCisJCWRvdWJsZSBudW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZCA9IDAuMDsKKwkJaWYoZ2V0Tm9uTGluZWFyaXR5Q29lZmZpY2llbnQoKSAhPSAxLjAgJiYgZWZmZWN0aXZlSW5mZWN0aW91cyA+PSAwLjApCisJCQludW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZCA9IHRyYW5zbWlzc2lvblJhdGUKKwkJCSogY3VycmVudFNJLmdldFMoKSogTWF0aC5wb3coZWZmZWN0aXZlSW5mZWN0aW91cywgZ2V0Tm9uTGluZWFyaXR5Q29lZmZpY2llbnQoKSk7CisJCWVsc2UKKwkJCW51bWJlck9mU3VzY2VwdGlibGVUb0luZmVjdGVkID0gdHJhbnNtaXNzaW9uUmF0ZQorCQkJKiBjdXJyZW50U0kuZ2V0UygpKiBlZmZlY3RpdmVJbmZlY3Rpb3VzOworCQkKKwkJZG91YmxlIG51bWJlck9mSW5mZWN0ZWRUb1N1c2NlcHRpYmxlID0gZ2V0QWRqdXN0ZWRSZWNvdmVyeVJhdGUodGltZURlbHRhKQorCQkJCSogY3VycmVudFNJLmdldEkoKTsKKwkJCisJCisJCS8vIERldGVybWluZSBkZWx0YSBTCisJCWZpbmFsIGRvdWJsZSBkZWx0YVMgPSAtIG51bWJlck9mU3VzY2VwdGlibGVUb0luZmVjdGVkICsgbnVtYmVyT2ZJbmZlY3RlZFRvU3VzY2VwdGlibGU7CisJCS8vIERldGVybWluZSBkZWx0YSBJCisJCWZpbmFsIGRvdWJsZSBkZWx0YUkgPSBudW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZCAtIG51bWJlck9mSW5mZWN0ZWRUb1N1c2NlcHRpYmxlOwkKKwkKKwkJU0lMYWJlbFZhbHVlSW1wbCByZXQgPSAoU0lMYWJlbFZhbHVlSW1wbClyZXR1cm5WYWx1ZTsKKwkJcmV0LnNldFMoZGVsdGFTKTsKKwkJcmV0LnNldEkoZGVsdGFJKTsKKwkJcmV0LnNldEluY2lkZW5jZShudW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZCk7CisJCXJldC5zZXREaXNlYXNlRGVhdGhzKDAuMCk7CisJCXJldHVybiByZXQ7CisJfSAvLyBjb21wdXRlRGlzZWFzZURlbHRhcworCQorCisJLyoqCisJICogQHBhcmFtIGZyYWN0aW9uVG9EZXBhcnQKKwkgKiBAcGFyYW0gbmV4dFN0YXRlCisJICogQHJldHVybgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY29tcHV0ZURlcGFydHVyZXMoCisJCQlmaW5hbCBkb3VibGUgZnJhY3Rpb25Ub0RlcGFydCwKKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBuZXh0U3RhdGUpIHsKKwkJZmluYWwgU0lMYWJlbFZhbHVlIGRlcGFydGVlcyA9IFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlU0VJUkxhYmVsVmFsdWUoKTsKKwkJZmluYWwgU0lMYWJlbFZhbHVlIHNpU3RhdGUgPSAoU0lMYWJlbFZhbHVlKSBuZXh0U3RhdGU7CisJCWRlcGFydGVlcy5zZXRTKGZyYWN0aW9uVG9EZXBhcnQgKiBzaVN0YXRlLmdldFMoKSk7CisJCWRlcGFydGVlcy5zZXRJKGZyYWN0aW9uVG9EZXBhcnQgKiBzaVN0YXRlLmdldEkoKSk7CisJCXJldHVybiBkZXBhcnRlZXM7CisJfSAvLyBjb21wdXRlRGVwYXJ0dXJlcworCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzY2FsZSB0aGUgdHJhbnNtaXNzaW9uIHJhdGUuCisgCSAqIGl0IHJldHVybnMgdGhlIGxvY2FsIGRlbnNpdHkgZGl2aWRlZCBieSBhICJyZWZlcmVuY2UiIGRlbnNpdHkKKwkgKiBAcGFyYW0gZGlzZWFzZUxhYmVsIHRoZSBsYWJlbCBiZWluZyBwcm9jZXNzZWQKKwkgKiBAcmV0dXJuIHRoZSB0cmFuc21pc3Npb24gcmF0ZSBzY2FsZSBmYWN0b3IgZm9yIHRoZSBsYWJlbCBiZWluZyBwcm9jZXNzZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFRyYW5zbWlzc2lvblJhdGVTY2FsZUZhY3RvcigKKwkJCVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZUxhYmVsKSB7CisJCS8vZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZSBzZG1zID0gKFN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUpIGRpc2Vhc2VMYWJlbAorCQkvLwkJLmdldERpc2Vhc2VNb2RlbFN0YXRlKCk7CisJCQorCQlkb3VibGUgcmVmZXJlbmNlRGVuc2l0eSA9IGdldFJlZmVyZW5jZVBvcHVsYXRpb25EZW5zaXR5KCk7CisJCS8vIGFzc2VydChyZWZlcmVuY2VEZW5zaXR5ID4gMCk7CisJCS8vIG5lZWQgZWRpdG9yIGNoZWNrIHNvIHJlZiBkZW5zaXR5IGFsd2F5cyA+MS4gRGVmYXVsdCBpcyAxMDAuCisJCWFzc2VydCBnZXRBcmVhKGRpc2Vhc2VMYWJlbC5nZXRQb3B1bGF0aW9uTGFiZWwoKSkgPiAwLjA7CisJCWRvdWJsZSBsb2NhbERlbnNpdHkgPSAoKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuZ2V0VGVtcFZhbHVlKCkpLmdldFBvcHVsYXRpb25Db3VudCgpL2dldEFyZWEoZGlzZWFzZUxhYmVsLmdldFBvcHVsYXRpb25MYWJlbCgpKTsKKwkJcmV0dXJuIGxvY2FsRGVuc2l0eS9yZWZlcmVuY2VEZW5zaXR5OworCX0gLy8gZ2V0VHJhbnNtaXNzaW9uUmF0ZVNjYWxlRmFjdG9yCisKKwkKKwkvKioKKwkgKiBUaGUgPGVtPmluZmVjdGlvdXMgbW9ydGFsaXR5IHJhdGU8L2VtPiBpcyB0aGUgcmF0ZSBhdCB3aGljaAorCSAqIDxlbT5JbmZlY3Rpb3VzPC9lbT4gcG9wdWxhdGlvbiBtZW1iZXJzIGRpZS4gQmFzaWNhbGx5LCB0aGF0IHJhdGUgaXMKKwkgKiBzaW1wbHkgdGhlIHByb3BvcnRpb25hbCBmcmFjdGlvbiBvZiB0aGUgZmxvdyBpbnRvIHRoZSA8ZW0+SW5mZWN0aW91czwvZW0+CisJICogc3RhdGUuCisJICogCisJICogQHBhcmFtIGluZmVjdGlvdXNJbnB1dFJhdGUKKwkgKiAgICAgICAgICAgIHRoZSByYXRlIGF0IHdoaWNoIHBvcHVsYXRpb24gbWVtYmVycyBlbnRlciB0aGUgaW5mZWN0aW91cworCSAqICAgICAgICAgICAgc3RhdGUgKCZiZXRhOykKKwkgKiBAcGFyYW0gaW5mZWN0aW91c01vcnRhbGl0eQorCSAqICAgICAgICAgICAgdGhlIHByb3BvcnRpb24gb2YgcG9wdWxhdGlvbiBtZW1iZXJzIHRoYXQgZGllIGZyb20gdGhlIGRpc2Vhc2UKKwkgKiAgICAgICAgICAgICh4KQorCSAqIEByZXR1cm4gdGhlIHJhdGUgYXQgd2hpY2ggcG9wdWxhdGlvbiBtZW1iZXJzIGRpZSBmcm9tIHRoZSBkaXNlYXNlCisJICovCisvLwlwdWJsaWMgZG91YmxlIGNvbXB1dGVJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSgKKy8vCQkJZmluYWwgZG91YmxlIGluZmVjdGlvdXNJbnB1dFJhdGUsIGZpbmFsIGRvdWJsZSBpbmZlY3Rpb3VzTW9ydGFsaXR5KSB7CisvLwkJcmV0dXJuIGluZmVjdGlvdXNNb3J0YWxpdHkgKiBpbmZlY3Rpb3VzSW5wdXRSYXRlOworLy8JfSAvLyBjb21wdXRlSW5mZWN0aW91c01vcnRhbGl0eVJhdGUKKworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxJbXBsI2NyZWF0ZURpc2Vhc2VNb2RlbExhYmVsKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWwgY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWwoKSB7CisJCXJldHVybiBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNJTGFiZWwoKTsKKwl9IC8vIGNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCkgeworCQlyZXR1cm4gU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTSUxhYmVsVmFsdWUoKTsKKwl9IC8vIGNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUKKwkKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuRGlzZWFzZU1vZGVsSW1wbCNjcmVhdGVEaXNlYXNlTW9kZWxTdGF0ZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIERpc2Vhc2VNb2RlbFN0YXRlIGNyZWF0ZURpc2Vhc2VNb2RlbFN0YXRlKCkgeworCQlyZXR1cm4gU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTSURpc2Vhc2VNb2RlbFN0YXRlKCk7CisJfSAvLyBjcmVhdGVEaXNlYXNlTW9kZWxTdGF0ZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxJbXBsI2NyZWF0ZUluZmVjdG9yKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSW5mZWN0b3IgY3JlYXRlSW5mZWN0b3IoKSB7CisJCVNJSW5mZWN0b3IgcmV0VmFsdWUgPSBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNJSW5mZWN0b3IoKTsKKwkJcmV0VmFsdWUuc2V0RGlzZWFzZU5hbWUodGhpcy5nZXREaXNlYXNlTmFtZSgpKTsKKwkJcmV0VmFsdWUuc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUluZmVjdG9yCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU0k7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0VHJhbnNtaXNzaW9uUmF0ZSgpIHsKKwkJcmV0dXJuIHRyYW5zbWlzc2lvblJhdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmV3VHJhbnNtaXNzaW9uUmF0ZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUcmFuc21pc3Npb25SYXRlKGRvdWJsZSBuZXdUcmFuc21pc3Npb25SYXRlKSB7CisJCWRvdWJsZSBvbGRUcmFuc21pc3Npb25SYXRlID0gdHJhbnNtaXNzaW9uUmF0ZTsKKwkJdHJhbnNtaXNzaW9uUmF0ZSA9IG5ld1RyYW5zbWlzc2lvblJhdGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5TSV9fVFJBTlNNSVNTSU9OX1JBVEUsIG9sZFRyYW5zbWlzc2lvblJhdGUsIHRyYW5zbWlzc2lvblJhdGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRSZWNvdmVyeVJhdGUoKSB7CisJCXJldHVybiByZWNvdmVyeVJhdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmV3UmVjb3ZlcnlSYXRlCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlY292ZXJ5UmF0ZShkb3VibGUgbmV3UmVjb3ZlcnlSYXRlKSB7CisJCWRvdWJsZSBvbGRSZWNvdmVyeVJhdGUgPSByZWNvdmVyeVJhdGU7CisJCXJlY292ZXJ5UmF0ZSA9IG5ld1JlY292ZXJ5UmF0ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNJX19SRUNPVkVSWV9SQVRFLCBvbGRSZWNvdmVyeVJhdGUsIHJlY292ZXJ5UmF0ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKCkgeworCQlyZXR1cm4gaW5mZWN0aW91c01vcnRhbGl0eVJhdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKGRvdWJsZSBuZXdJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSkgeworCQlkb3VibGUgb2xkSW5mZWN0aW91c01vcnRhbGl0eVJhdGUgPSBpbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZTsKKwkJaW5mZWN0aW91c01vcnRhbGl0eVJhdGUgPSBuZXdJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNJX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFLCBvbGRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSwgaW5mZWN0aW91c01vcnRhbGl0eVJhdGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKCkgeworCQlyZXR1cm4gcGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb24oZG91YmxlIG5ld1BoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKSB7CisJCWRvdWJsZSBvbGRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbiA9IHBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uOworCQlwaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbiA9IG5ld1BoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU0lfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OLCBvbGRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbiwgcGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb24pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24oKSB7CisJCXJldHVybiByb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24oZG91YmxlIG5ld1JvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24pIHsKKwkJZG91YmxlIG9sZFJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24gPSByb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uOworCQlyb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uID0gbmV3Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNJX19ST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OLCBvbGRSb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uLCByb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRJbmZlY3Rpb3VzTW9ydGFsaXR5KCkgeworCQlyZXR1cm4gaW5mZWN0aW91c01vcnRhbGl0eTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbmZlY3Rpb3VzTW9ydGFsaXR5KGRvdWJsZSBuZXdJbmZlY3Rpb3VzTW9ydGFsaXR5KSB7CisJCWRvdWJsZSBvbGRJbmZlY3Rpb3VzTW9ydGFsaXR5ID0gaW5mZWN0aW91c01vcnRhbGl0eTsKKwkJaW5mZWN0aW91c01vcnRhbGl0eSA9IG5ld0luZmVjdGlvdXNNb3J0YWxpdHk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5TSV9fSU5GRUNUSU9VU19NT1JUQUxJVFksIG9sZEluZmVjdGlvdXNNb3J0YWxpdHksIGluZmVjdGlvdXNNb3J0YWxpdHkpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UoKSB7CisJCXJldHVybiBjaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UoZG91YmxlIG5ld0NoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UpIHsKKwkJZG91YmxlIG9sZENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UgPSBjaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlOworCQljaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlID0gbmV3Q2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNJX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0UsIG9sZENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UsIGNoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIGRvdWJsZSBnZXRBZGp1c3RlZEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKGxvbmcgdGltZURlbHRhKSB7CisJCS8vIFRPRE8gdGhpcyBkaXZpc2lvbiBjYW4gYmUgZWxpbWluYXRlZCBpZiB0aW1lRGVsdGE9PWdldFRpbWVQZXJpb2QKKwkJcmV0dXJuIGdldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKCkKKwkJKiAoKGRvdWJsZSkgdGltZURlbHRhIC8gKGRvdWJsZSkgZ2V0VGltZVBlcmlvZCgpKTsKKwl9IC8vIGdldEFkanVzdGVkSW5mZWN0aW91c01vcnRhbGl0eVJhdGUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE5vbkxpbmVhcml0eUNvZWZmaWNpZW50KCkgeworCQlyZXR1cm4gbm9uTGluZWFyaXR5Q29lZmZpY2llbnQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmV3Tm9uTGluZWFyaXR5Q29lZmZpY2llbnQKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Tm9uTGluZWFyaXR5Q29lZmZpY2llbnQoZG91YmxlIG5ld05vbkxpbmVhcml0eUNvZWZmaWNpZW50KSB7CisJCWRvdWJsZSBvbGROb25MaW5lYXJpdHlDb2VmZmljaWVudCA9IG5vbkxpbmVhcml0eUNvZWZmaWNpZW50OworCQlub25MaW5lYXJpdHlDb2VmZmljaWVudCA9IG5ld05vbkxpbmVhcml0eUNvZWZmaWNpZW50OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU0lfX05PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQsIG9sZE5vbkxpbmVhcml0eUNvZWZmaWNpZW50LCBub25MaW5lYXJpdHlDb2VmZmljaWVudCkpOworCX0KKworCS8qKgorCSAqIE1vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyBmb3IgYSBTdG9jaGFzdGljIG1vZGVsIGFkZHMgbm9pc2UgdG8gb3IgYWRqdXN0cyAKKwkgKiB0aGUgZGlzZWFzZSBzdGF0ZSB0cmFuc2l0aW9uIHZhbHVlcyBieSBtdWx0aXBseWluZworCSAqIHRoZSBhZGRpdGlvbnMgYnkgYSByYW5kb20gdmFyaWFibGUgciB+ICgxKy8teCkgd2l0aCB4IHNtYWxsLgorCSAqIFRoZSByZXF1aXJlbWVudHMgdGhhdCBubyBtb3JlIGluZGl2aWR1YWxzIGNhbiBiZSBtb3ZlZCBmcm9tIGEgc3RhdGUgdGhhbiBhcmUKKwkgKiBhbHJlYWR5IGluIHRoYXQgc3RhdGUgaXMgc3RpbGwgZW5mb3JjZWQuCisJICogCisJICovCisJcHVibGljIHZvaWQgZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHZhbCkgeworCX0gLy8gZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFJldHVybnMgdGhlIHRpbWUgaW50ZXJ2YWwgZGVsdGFUIGRpdmlkZWQgYnkgdGhlIGluaXRpYWwgdGltZSBwZXJpb2QKKwkgKiBAcGFyYW0gdGltZURlbHRhCisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIGRvdWJsZSBnZXRBZGp1c3RlZFRyYW5zbWlzc2lvblJhdGUobG9uZyB0aW1lRGVsdGEpIHsKKwkJcmV0dXJuIGdldFRyYW5zbWlzc2lvblJhdGUoKQorCQkJCSogKChkb3VibGUpIHRpbWVEZWx0YSAvIChkb3VibGUpIGdldFRpbWVQZXJpb2QoKSk7CisJfSAvLyBnZXRBZGp1c3RlZFRyYW5zbWlzc2lvblJhdGUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHRpbWVEZWx0YQorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0QWRqdXN0ZWRSZWNvdmVyeVJhdGUobG9uZyB0aW1lRGVsdGEpIHsKKwkJcmV0dXJuIGdldFJlY292ZXJ5UmF0ZSgpCisJCQkJKiAoKGRvdWJsZSkgdGltZURlbHRhIC8gKGRvdWJsZSkgZ2V0VGltZVBlcmlvZCgpKTsKKwl9IC8vIGdldEFkanVzdGVkUmVjb3ZlcnlSYXRlCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRFZmZlY3RpdmVJbmZlY3Rpb3VzKE5vZGUgbm9kZSwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTGFiZWwsIGRvdWJsZSBvbnNpdGVJbmZlY3Rpb3VzKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCByZXBsYWNlcyB0aGUgb25zaXRlSW5mZWN0aW91cyB2YWx1ZSB3aXRoIGFuIGVmZmVjdGl2ZUluZmVjdGlvdXMgcG9wdWxhdGlvbgorCSAqIHNpemUgYmFzZWQgb24gbWl4aW5nIHdpdGggbmVpZ2hib3Jpbmcgc2l0ZXMuIEluIHRoaXMgaW1wbGVtZW50YXRpb24gdGhlIGVkZ2VzIGFyZSBiaWRpcmVjdGlvbmFsCisJICogYW5kIGhhdmUgYSBmaXhlZCB3ZWlnaHQgYmFzZWQgb24gZ2V0UGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb24oKSAoY2FsbGVkIGluIHRoZSBoZWxwZXIgbWV0aG9kCisJICogZ2V0SW5mZWN0aW91c0NoYW5nZUZyb21NaXhpbmcoKS4gQnV0IHRoZSBtaXhpbmcgaXMgYWxzbyB3ZWlnaHRlZCBieSB0aGUgYXJlYXMgYW5kIHBvcHVsYXRpb25zIG9mIGEgc2l0ZSByZWxhdGl2ZQorCSAqIHRvIHRoZSBhcmVhIGFuZCBwb3B1bGF0aW9uIG9mIGl0J3MgbmVpZ2hib3JzLiBOb3RlIHRoYXQgdGhlIHZhbHVlIHJldHVybmVkIG11c3QgYmUgTk9STUFMSVpFRCBieSB0aGUgdG90YWwKKwkgKiBwb3B1bGF0aW9uIGJlY2F1c2UgdGhlIHByb2R1Y3QgYmV0YSAqIFMgKiBJZWZmZWN0aXZlIG11c3QgaGF2ZSB1bml0cyBvZiBwZXJzb25zLiBTaW5jZSBTIGhhcyB1bml0cyBvZiBwZXJzb25zCisJICogdGhlIEllZmZlY3RpdmUgbXVzdCBiZSBkaW1lbnNpb25sZXNzIChub3JtYWxpemVkIHRvIHRoZSBwb3B1bGF0aW9uKS4gYmV0YSBpcyB0aGUgaW5mZWN0aW9uIHJhdGUgYW5kIGhhcyB1bml0cworCSAqIG9mIGludmVyc2UgdGltZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSS5nZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cworCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHdlIGFyZSBjdXJyZW50bHkgbG9va2luZyBhdCB0byBjb21wdXRlIHRoZSBuZXh0IGRpc2Vhc2Ugc3RhdGUKKwkgKiBAcGFyYW0gZGlzZWFzZUxhYmVsIHRoZSBsYWJlbCBmb3IgdGhlIGN1cnJlbnQgZGlzZWFzZSBjb21wdXRhdGlvbgorCSAqIEBwYXJhbSBvbnNpdGVJbmZlY3Rpb3VzIHRoZSBudW1iZXIgb2YgaW5mZWN0aW91cyBwZW9wbGUgb24gc2l0ZSAoYXQgdGhlIG5vZGUgYWJvdmUpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE5vcm1hbGl6ZWRFZmZlY3RpdmVJbmZlY3Rpb3VzKGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTGFiZWwsIGZpbmFsIGRvdWJsZSBvbnNpdGVJbmZlY3Rpb3VzKSB7CisgICAgICAgIC8vIHJ1bm5pbmcgdGFsbHkgb2YgY2hhbmdlcyBmcm9tIG1peGluZyB3aXRoIG90aGVyIG5vZGVzCisJCWRvdWJsZSBpbmZlY3Rpb3VzQ2hhbmdlRnJvbU1peGluZyA9IDAuMDsKKwkJZG91YmxlIGJvcmRlckRpdmlzb3IgPSAwLjA7CisJCWRvdWJsZSByb2FkRGl2aXNvciA9IDAuMDsKKwkJCisJCWZvciAoZmluYWwgSXRlcmF0b3I8RWRnZT4gY29tbW9uQm9yZGVyRWRnZUl0ZXIgPSBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbEltcGwKKwkJCQkuZ2V0Q29tbW9uQm9yZGVyRWRnZXNGcm9tTm9kZShub2RlKS5pdGVyYXRvcigpOyBjb21tb25Cb3JkZXJFZGdlSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBFZGdlIGJvcmRlckVkZ2UgPSBjb21tb25Cb3JkZXJFZGdlSXRlci5uZXh0KCk7CisJCQkvLyBJZiBpdCBleGlzdHMsIHdlJ3JlIGxvb2tpbmcgZm9yIHRoZSBsYWJlbCB0aGlzIGRpc2Vhc2UgbW9kZWwKKwkJCS8vIHVwZGF0ZXMgb24gdGhlIG5vZGUgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgYm9yZGVyIGVkZ2UuCisJCQlmaW5hbCBOb2RlIG90aGVyTm9kZSA9IGJvcmRlckVkZ2UuZ2V0T3RoZXJOb2RlKG5vZGUpOworCQkJU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBuZWlnaGJvckxhYmVsID0gbnVsbDsKKwkJCS8vIHN1bSB1cCB0aGUgY2hhbmdlcyBmcm9tIGVhY2ggY29ubmVjdGVkIG5vZGUuCisJCQkvLyBOT1RFOiBzb21lIG9mIHRoZXNlIGNoYW5nZXMgY291bGQgYmUgbmVnYXRpdmUKKwkJCQorCQkJZG91YmxlIGNoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UgPSBnZXRDaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlKCk7CisJCQkKKwkJCWRvdWJsZSBtaXhpbmdGYWN0b3IgPSAwLjA7IAorCQkJaWYgKG90aGVyTm9kZSBpbnN0YW5jZW9mIFJlZ2lvbikgeworCQkJCWRvdWJsZSBvdGhlckF2Z0V4dGVudCA9IC0xLjA7CisJCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxOb2RlTGFiZWw+IGxhYmVsSXRlciA9IG90aGVyTm9kZS5nZXRMYWJlbHMoKS5pdGVyYXRvcigpOyBsYWJlbEl0ZXIuaGFzTmV4dCgpOykgeworCQkJCQlmaW5hbCBOb2RlTGFiZWwgbm9kZUxhYmVsID0gbGFiZWxJdGVyLm5leHQoKTsKKwkJCQkJLy8gSXMgdGhpcyBhbiBhcmVhIGxhYmVsPworCQkJCQlpZiAobm9kZUxhYmVsIGluc3RhbmNlb2YgQXJlYUxhYmVsKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCWZpbmFsIEFyZWFMYWJlbCBhcmVhTGFiZWwgPSAoQXJlYUxhYmVsKSBub2RlTGFiZWw7CisJCQkJCQlvdGhlckF2Z0V4dGVudCA9IGFyZWFMYWJlbC5nZXRDdXJyZW50QXJlYVZhbHVlKCkuZ2V0QXZlcmFnZUV4dGVudCgpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9IC8vIGZvcgorCQkJCS8vIElGIHdlIGhhdmUgYSB2YWxpZCBhcmVhIAorCQkJCWlmKG90aGVyQXZnRXh0ZW50ID49IDAuMCkgeworCQkJCQltaXhpbmdGYWN0b3IgPSAoY2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZS9vdGhlckF2Z0V4dGVudCkgOworCQkJCQlpZihtaXhpbmdGYWN0b3IgPiAxLjApIG1peGluZ0ZhY3RvciA9IDEuMDsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWluZmVjdGlvdXNDaGFuZ2VGcm9tTWl4aW5nICs9IGdldEluZmVjdGlvdXNDaGFuZ2VGcm9tTWl4aW5nKHRoaXMsIG90aGVyTm9kZSwgZGlzZWFzZUxhYmVsLCBvbnNpdGVJbmZlY3Rpb3VzLCBtaXhpbmdGYWN0b3IpOworCQkJYm9yZGVyRGl2aXNvciArPSBtaXhpbmdGYWN0b3IqdGhpcy5nZXRMb2NhbFBvcHVsYXRpb24odGhpcywgb3RoZXJOb2RlKTsKKwkJfSAvLyBmb3IgZWFjaCBib3JkZXIgZWRnZQorCQkKKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxFZGdlPiByb2FkRWRnZUl0ZXIgPSBSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsLmdldFJvYWRFZGdlc0Zyb21Ob2RlKG5vZGUpLml0ZXJhdG9yKCk7IAlyb2FkRWRnZUl0ZXIuaGFzTmV4dCgpOykgeworCQkJZmluYWwgRWRnZSByb2FkRWRnZSA9IHJvYWRFZGdlSXRlci5uZXh0KCk7CisJCQkKKwkJCS8vIGZpbmQgdGhlIG51bWJlciBvZiBlZGdlcyBmcm9tIHRoZSByb2FkIGVkZ2UgLSBjb3VsZCBiZSBtb3JlIHRoYW4gb25lCisJCQkvLyBhbHNvLCByb2FkcyBoYXZlIGRpZmZlcmVuY3QgY2FwYWNpdGllcworCQkJZmluYWwgRWRnZUxhYmVsIGVkZ2VMYWJlbCA9IHJvYWRFZGdlLmdldExhYmVsKCk7CisJCQkvLyBpbml0IHRoZSBudW1iZXIgb2YgY3Jvc3NpbmdzIG9yIHRvdGFsIHJvYWQgY29ubmVjdGlvbnMgYWNyb3NzIHRoZSBib3JkZXIKKwkJCWRvdWJsZSBudW1Dcm9zc2luZ3MgPSAxLjA7CisJCQorCQkJaWYgKGVkZ2VMYWJlbCBpbnN0YW5jZW9mIFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbEltcGwpIHsKKwkJCQlSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZUltcGwgcm9hZExhYmVsVmFsdWUgPSAoUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVJbXBsKShlZGdlTGFiZWwuZ2V0Q3VycmVudFZhbHVlKCkpOworCQkJCW51bUNyb3NzaW5ncyA9IHJvYWRMYWJlbFZhbHVlLmdldE51bWJlckNyb3NzaW5ncygpOworCQkJfQorCQkJZG91YmxlIGluZmVjdGlvdXNQcm9wb3J0aW9uID0gZ2V0Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbigpICogbnVtQ3Jvc3NpbmdzOworCQkJCisJCQkvLyBtdXN0IG5ldmVyIGJlIGdyZWF0ZXIgdGhhbiAxCisJCQlpZihpbmZlY3Rpb3VzUHJvcG9ydGlvbiA+IDEuMCkgaW5mZWN0aW91c1Byb3BvcnRpb24gPSAxLjA7CisJCQkKKwkJCS8vIElmIGl0IGV4aXN0cywgd2UncmUgbG9va2luZyBmb3IgdGhlIGxhYmVsIHRoaXMgZGlzZWFzZSBtb2RlbAorCQkJLy8gdXBkYXRlcyBvbiB0aGUgbm9kZSBhdCB0aGUgb3RoZXIgZW5kIG9mIHRoZSBib3JkZXIgZWRnZS4KKwkJCWZpbmFsIE5vZGUgb3RoZXJOb2RlID0gcm9hZEVkZ2UuZ2V0T3RoZXJOb2RlKG5vZGUpOworCQkJU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBuZWlnaGJvckxhYmVsID0gbnVsbDsKKwkJCS8vIHN1bSB1cCB0aGUgY2hhbmdlcyBmcm9tIGVhY2ggY29ubmVjdGVkIG5vZGUuCisJCQkvLyBOT1RFOiBzb21lIG9mIHRoZXNlIGNoYW5nZXMgY291bGQgYmUgbmVnYXRpdmUKKwkJCWluZmVjdGlvdXNDaGFuZ2VGcm9tTWl4aW5nICs9IGdldEluZmVjdGlvdXNDaGFuZ2VGcm9tTWl4aW5nKHRoaXMsIG90aGVyTm9kZSwgZGlzZWFzZUxhYmVsLCBvbnNpdGVJbmZlY3Rpb3VzLCBpbmZlY3Rpb3VzUHJvcG9ydGlvbik7CisJCQkKKwkJCXJvYWREaXZpc29yICs9IGluZmVjdGlvdXNQcm9wb3J0aW9uKnRoaXMuZ2V0TG9jYWxQb3B1bGF0aW9uKHRoaXMsIG90aGVyTm9kZSk7CisJCX0gLy8gZm9yIGVhY2ggcm9hZCBlZGdlCisJCQorCQorCQkvLyByZXR1cm4gdGhlIHN1bSBub3JtYWxpemVkIHRvIHRoZSB0b3RhbCBwb3B1bGF0aW9uCisJCWRvdWJsZSBkZW5vbSA9ICgoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKWRpc2Vhc2VMYWJlbC5nZXRUZW1wVmFsdWUoKSkuZ2V0UG9wdWxhdGlvbkNvdW50KCkgKyBib3JkZXJEaXZpc29yICsgcm9hZERpdmlzb3I7CisJCWRvdWJsZSByZXRWYWwgPSAwLjA7CisJCWlmIChkZW5vbSA+IDAuMCkgeworCQkJcmV0VmFsID0gKCBvbnNpdGVJbmZlY3Rpb3VzICsgaW5mZWN0aW91c0NoYW5nZUZyb21NaXhpbmcgKSAvIGRlbm9tOworCQl9CisJCQkKKwkJcmV0dXJuIHJldFZhbDsKKworCX0gLy8gZ2V0Tm9ybWFsaXplZEVmZmVjdGl2ZUluZmVjdGlvdXMKKworCisJCisJLyoqCisJICogVGhpcyBtZXRob2QgY29ycmVjdGx5IGNvbXB1dGVzIHRoZSBtaXhpbmcgb2YgdGhlIGluZmVjdGlvdXMgcG9wdWxhdGlvbiAob25zaXRlKSB3aXRoIHRoZSBpbmZlY3Rpb3VzIHBvcHVsYXRpb24KKwkgKiBhdCBuZWlnaGJvcmluZyBub2RlcworCSAqIEBwYXJhbSBkaXNlYXNlTW9kZWwKKwkgKiBAcGFyYW0gdGhlIG5vZGUKKwkgKiBAcGFyYW0gZGlzZWFzZUxhYmVsCisJICogQHBhcmFtIG9uc2l0ZUluZmVjdGlvdXMKKwkgKiBAcGFyYW0gY29ubmVjdGVkSW5mZWN0aW91c1Byb3BvcnRpb24gKHRoaXMgaXMgdGhlIHdlaWdodCBnaXZlbiB0byB0aGUgZWRnZSBjb25uZWN0aW9uKQorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgYXQgYSBub2RlIGluZmVjdGVkIGJ5IHRoZSBkaXNlYXNlIG1vZGVsZWQgYnkgZGlzZWFzZU1vZGVsCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBnZXRJbmZlY3Rpb3VzQ2hhbmdlRnJvbU1peGluZyhmaW5hbCBTSSBkaXNlYXNlTW9kZWwsCisJCQlmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZUxhYmVsLCBmaW5hbCBkb3VibGUgb25zaXRlSW5mZWN0aW91cywgZG91YmxlIGNvbm5lY3RlZEluZmVjdGlvdXNQcm9wb3J0aW9uKSB7CisJCWRvdWJsZSByZXRWYWx1ZSA9IDAuMDsKKworCQkvLyB0aGUgbG9jYWwgYXJlYQorCQkvL2RvdWJsZSBhMCA9IGdldEFyZWEoZGlzZWFzZUxhYmVsLmdldFBvcHVsYXRpb25MYWJlbCgpKTsKKwkJLy8gdGhlIGxvY2FsIHBvcHVsYXRpb24KKworCQkvL2RvdWJsZSBwMCA9ICgoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKWRpc2Vhc2VMYWJlbC5nZXRUZW1wVmFsdWUoKSkuZ2V0UG9wdWxhdGlvbkNvdW50KCk7CisJCQorCQkvLyBpbmZlY3Rpb3VzIGZyb20gb3RoZXIgc2l0ZXMgbWl4aW5nIGhlcmUgYXQgc2l0ZSAwCisJCWRvdWJsZSBtaXhpbmcgPSAwLjA7CisJCQkKKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxOb2RlTGFiZWw+IGxhYmVsSXRlciA9IG5vZGUuZ2V0TGFiZWxzKCkuaXRlcmF0b3IoKTsgbGFiZWxJdGVyCisJCQkJLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIE5vZGVMYWJlbCBub2RlTGFiZWwgPSBsYWJlbEl0ZXIubmV4dCgpOworCQkJLy8gSXMgdGhpcyBhIGRpc2Vhc2UgbGFiZWw/CisJCQlpZiAobm9kZUxhYmVsIGluc3RhbmNlb2YgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCkgeworCQkJCWZpbmFsIEludGVncmF0aW9uTGFiZWwgb3RoZXJTSUxhYmVsID0gKEludGVncmF0aW9uTGFiZWwpIG5vZGVMYWJlbDsKKwkJCQkvLyBZZXMKKwkJCQkvLyBJcyBpdCB1cGRhdGVkIGJ5IHRoaXMgZGlzZWFzZSBtb2RlbD8KKwkJCQlpZiAoZGlzZWFzZU1vZGVsID09IG90aGVyU0lMYWJlbC5nZXREZWNvcmF0b3IoKSkgeworCQkJCQlpZih0aGlzLmlzRnJlcXVlbmN5RGVwZW5kZW50KCkpIHsKKwkJCQkJCWRvdWJsZSBJb3RoZXIgPSAoKChTSUxhYmVsVmFsdWUpb3RoZXJTSUxhYmVsLmdldFRlbXBWYWx1ZSgpKSkuZ2V0SSgpOworCQkJCQkJLy9kb3VibGUgSW90aGVyID0gb3RoZXJTSUxhYmVsLmdldEN1cnJlbnRTSVZhbHVlKCkuZ2V0SSgpOworCQkJCQkJZG91YmxlIG1peGluZ0ZhY3RvciA9IGNvbm5lY3RlZEluZmVjdGlvdXNQcm9wb3J0aW9uOwkJCQkJCisJCQkJCQltaXhpbmcgPSBJb3RoZXIgKiBtaXhpbmdGYWN0b3I7CisJCQkJCX0gZWxzZSB7CisvLwkJCQkJCWRvdWJsZSBhMSA9IGdldEFyZWEob3RoZXJTSUxhYmVsLmdldFBvcHVsYXRpb25MYWJlbCgpKTsKKy8vCQkJCQkJZG91YmxlIHAxID0gKChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpb3RoZXJTSUxhYmVsLmdldFRlbXBWYWx1ZSgpKS5nZXRQb3B1bGF0aW9uQ291bnQoKTsKKy8vCQkJCQkJZG91YmxlIElvdGhlciA9IChvdGhlclNJTGFiZWwuZ2V0VGVtcFZhbHVlKCkpLmdldEkoKTsKKy8vCQkJCQkJZG91YmxlIG1peGluZ0ZhY3RvciA9IChhMCpwMSArIGExKnAwKSogY29ubmVjdGVkSW5mZWN0aW91c1Byb3BvcnRpb24gLyhhMSogKHAxK3AwKSkgOworCQkJCQkKKy8vCQkJCQkJbWl4aW5nID0gSW90aGVyICogbWl4aW5nRmFjdG9yOworCQkJCQl9CisJCQkJCQorCQkJCQlicmVhazsKKwkJCQl9IC8vIGlmCisJCQl9CisJCX0gLy8gZm9yCisKKwkJcmV0dXJuIG1peGluZzsKKwl9IC8vIGdldEluZmVjdGlvdXNDaGFuZ2VGcm9tTWl4aW5nCisJCisJCisJLyoqCisJICogCisJICogQHBhcmFtIGRpc2Vhc2VNb2RlbAorCSAqIEBwYXJhbSBub2RlCisJICogQHJldHVybgorCSAqLworICAgIHByaXZhdGUgZG91YmxlIGdldExvY2FsUG9wdWxhdGlvbihmaW5hbCBTSSBkaXNlYXNlTW9kZWwsIE5vZGUgbm9kZSkgeworICAgIAlmb3IgKGZpbmFsIEl0ZXJhdG9yPE5vZGVMYWJlbD4gbGFiZWxJdGVyID0gbm9kZS5nZXRMYWJlbHMoKS5pdGVyYXRvcigpOyBsYWJlbEl0ZXIuaGFzTmV4dCgpOykgeworICAgIAkJZmluYWwgTm9kZUxhYmVsIG5vZGVMYWJlbCA9IGxhYmVsSXRlci5uZXh0KCk7CisgICAgCQkvLyBJcyB0aGlzIGEgZGlzZWFzZSBsYWJlbD8KKyAgICAJCWlmIChub2RlTGFiZWwgaW5zdGFuY2VvZiBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKSB7CisgICAgCQkJZmluYWwgSW50ZWdyYXRpb25MYWJlbCBvdGhlclNJTGFiZWwgPSAoSW50ZWdyYXRpb25MYWJlbCkgbm9kZUxhYmVsOworICAgIAkJCS8vIFllcworICAgIAkJCS8vIElzIGl0IHVwZGF0ZWQgYnkgdGhpcyBkaXNlYXNlIG1vZGVsPworICAgIAkJCWlmIChkaXNlYXNlTW9kZWwgPT0gb3RoZXJTSUxhYmVsLmdldERlY29yYXRvcigpKSAKKyAgICAJCSAgICAgcmV0dXJuICgoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKW90aGVyU0lMYWJlbC5nZXRUZW1wVmFsdWUoKSkuZ2V0UG9wdWxhdGlvbkNvdW50KCk7CisgICAgCQl9CisgICAgCX0KKyAgICAJcmV0dXJuIDAuMDsKKyAgICB9CisgICAgCisgICAgCisKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcGFyYW0gcmVzb2x2ZQorCSAqIEBwYXJhbSBjb3JlVHlwZQorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX1RSQU5TTUlTU0lPTl9SQVRFOgorCQkJCXJldHVybiBnZXRUcmFuc21pc3Npb25SYXRlKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVDoKKwkJCQlyZXR1cm4gZ2V0Tm9uTGluZWFyaXR5Q29lZmZpY2llbnQoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX19SRUNPVkVSWV9SQVRFOgorCQkJCXJldHVybiBnZXRSZWNvdmVyeVJhdGUoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFOgorCQkJCXJldHVybiBnZXRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OOgorCQkJCXJldHVybiBnZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbigpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT046CisJCQkJcmV0dXJuIGdldFJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24oKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX19JTkZFQ1RJT1VTX01PUlRBTElUWToKKwkJCQlyZXR1cm4gZ2V0SW5mZWN0aW91c01vcnRhbGl0eSgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRToKKwkJCQlyZXR1cm4gZ2V0Q2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSBuZXdWYWx1ZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX1RSQU5TTUlTU0lPTl9SQVRFOgorCQkJCXNldFRyYW5zbWlzc2lvblJhdGUoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX05PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQ6CisJCQkJc2V0Tm9uTGluZWFyaXR5Q29lZmZpY2llbnQoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX1JFQ09WRVJZX1JBVEU6CisJCQkJc2V0UmVjb3ZlcnlSYXRlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFOgorCQkJCXNldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTjoKKwkJCQlzZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbigoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTjoKKwkJCQlzZXRSb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX19JTkZFQ1RJT1VTX01PUlRBTElUWToKKwkJCQlzZXRJbmZlY3Rpb3VzTW9ydGFsaXR5KChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX19DSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0U6CisJCQkJc2V0Q2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX19UUkFOU01JU1NJT05fUkFURToKKwkJCQlzZXRUcmFuc21pc3Npb25SYXRlKFRSQU5TTUlTU0lPTl9SQVRFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVDoKKwkJCQlzZXROb25MaW5lYXJpdHlDb2VmZmljaWVudChOT05fTElORUFSSVRZX0NPRUZGSUNJRU5UX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9fUkVDT1ZFUllfUkFURToKKwkJCQlzZXRSZWNvdmVyeVJhdGUoUkVDT1ZFUllfUkFURV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEU6CisJCQkJc2V0SW5mZWN0aW91c01vcnRhbGl0eVJhdGUoSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OOgorCQkJCXNldFBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKFBIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTjoKKwkJCQlzZXRSb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uKFJPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT05fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX19JTkZFQ1RJT1VTX01PUlRBTElUWToKKwkJCQlzZXRJbmZlY3Rpb3VzTW9ydGFsaXR5KElORkVDVElPVVNfTU9SVEFMSVRZX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9fQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFOgorCQkJCXNldENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UoQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX1RSQU5TTUlTU0lPTl9SQVRFOgorCQkJCXJldHVybiB0cmFuc21pc3Npb25SYXRlICE9IFRSQU5TTUlTU0lPTl9SQVRFX0VERUZBVUxUOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX05PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQ6CisJCQkJcmV0dXJuIG5vbkxpbmVhcml0eUNvZWZmaWNpZW50ICE9IE5PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlRfRURFRkFVTFQ7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9fUkVDT1ZFUllfUkFURToKKwkJCQlyZXR1cm4gcmVjb3ZlcnlSYXRlICE9IFJFQ09WRVJZX1JBVEVfRURFRkFVTFQ7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURToKKwkJCQlyZXR1cm4gaW5mZWN0aW91c01vcnRhbGl0eVJhdGUgIT0gSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURV9FREVGQVVMVDsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX19QSFlTSUNBTExZX0FESkFDRU5UX0lORkVDVElPVVNfUFJPUE9SVElPTjoKKwkJCQlyZXR1cm4gcGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb24gIT0gUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT05fRURFRkFVTFQ7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTjoKKwkJCQlyZXR1cm4gcm9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbiAhPSBST0FEX05FVFdPUktfSU5GRUNUSU9VU19QUk9QT1JUSU9OX0VERUZBVUxUOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX0lORkVDVElPVVNfTU9SVEFMSVRZOgorCQkJCXJldHVybiBpbmZlY3Rpb3VzTW9ydGFsaXR5ICE9IElORkVDVElPVVNfTU9SVEFMSVRZX0VERUZBVUxUOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRToKKwkJCQlyZXR1cm4gY2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSAhPSBDSEFSQUNURVJJU1RJQ19NSVhJTkdfRElTVEFOQ0VfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAodHJhbnNtaXNzaW9uUmF0ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCh0cmFuc21pc3Npb25SYXRlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBub25MaW5lYXJpdHlDb2VmZmljaWVudDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChub25MaW5lYXJpdHlDb2VmZmljaWVudCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgcmVjb3ZlcnlSYXRlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHJlY292ZXJ5UmF0ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgaW5mZWN0aW91c01vcnRhbGl0eVJhdGU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaW5mZWN0aW91c01vcnRhbGl0eVJhdGUpOworCQlyZXN1bHQuYXBwZW5kKCIsIHBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCByb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24pOworCQlyZXN1bHQuYXBwZW5kKCIsIGluZmVjdGlvdXNNb3J0YWxpdHk6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaW5mZWN0aW91c01vcnRhbGl0eSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgY2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChjaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZERpc2Vhc2VNb2RlbEltcGwjc2FuZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2FuZSgpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHN1cGVyLnNhbmUoKTsKKwkJCisJCS8vIHRyYW5zbWlzc2lvblJhdGUKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiB0cmFuc21pc3Npb25SYXRlID49IFRSQU5TTUlTU0lPTl9SQVRFX0VERUZBVUxUOworCQlhc3NlcnQgcmV0VmFsdWU7CisKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiAhRG91YmxlLmlzSW5maW5pdGUodHJhbnNtaXNzaW9uUmF0ZSk7CisJCWFzc2VydCByZXRWYWx1ZTsKKwkJCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgIURvdWJsZS5pc05hTih0cmFuc21pc3Npb25SYXRlKTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJLy8gcmVjb3ZlcnlSYXRlCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgcmVjb3ZlcnlSYXRlID49IFJFQ09WRVJZX1JBVEVfRURFRkFVTFQ7CisJCWFzc2VydCByZXRWYWx1ZTsKKworCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmICFEb3VibGUuaXNJbmZpbml0ZShyZWNvdmVyeVJhdGUpOworCQlhc3NlcnQgcmV0VmFsdWU7CisJCQorCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmICFEb3VibGUuaXNOYU4ocmVjb3ZlcnlSYXRlKTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJLy8gbm9uTGluZWFyaXR5Q29lZmZpY2llbnQKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZQorCQkJCSYmIG5vbkxpbmVhcml0eUNvZWZmaWNpZW50ID49IDAuMDsKKwkJYXNzZXJ0IHJldFZhbHVlOworCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgIURvdWJsZS5pc0luZmluaXRlKG5vbkxpbmVhcml0eUNvZWZmaWNpZW50KTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiAhRG91YmxlLmlzTmFOKG5vbkxpbmVhcml0eUNvZWZmaWNpZW50KTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gc2FuZQorCit9IC8vIFNJSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TSUluZmVjdG9ySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TSUluZmVjdG9ySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MmQ5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1NJSW5mZWN0b3JJbXBsLmphdmEKQEAgLTAsMCArMSwyMjcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUluZmVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U0kgSW5mZWN0b3I8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJSW5mZWN0b3JJbXBsI2dldEluZmVjdGlvdXNDb3VudCA8ZW0+SW5mZWN0aW91cyBDb3VudDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNJSW5mZWN0b3JJbXBsIGV4dGVuZHMgU3RhbmRhcmRJbmZlY3RvckltcGwgaW1wbGVtZW50cyBTSUluZmVjdG9yIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5mZWN0aW91c0NvdW50KCkgPGVtPkluZmVjdGlvdXMgQ291bnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEluZmVjdGlvdXNDb3VudCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgSU5GRUNUSU9VU19DT1VOVF9FREVGQVVMVCA9IDEuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZmVjdGlvdXNDb3VudCgpIDxlbT5JbmZlY3Rpb3VzIENvdW50PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbmZlY3Rpb3VzQ291bnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgaW5mZWN0aW91c0NvdW50ID0gSU5GRUNUSU9VU19DT1VOVF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU0lJbmZlY3RvckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNJX0lORkVDVE9SOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0SW5mZWN0aW91c0NvdW50KCkgeworCQlyZXR1cm4gaW5mZWN0aW91c0NvdW50OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluZmVjdGlvdXNDb3VudChkb3VibGUgbmV3SW5mZWN0aW91c0NvdW50KSB7CisJCWRvdWJsZSBvbGRJbmZlY3Rpb3VzQ291bnQgPSBpbmZlY3Rpb3VzQ291bnQ7CisJCWluZmVjdGlvdXNDb3VudCA9IG5ld0luZmVjdGlvdXNDb3VudDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNJX0lORkVDVE9SX19JTkZFQ1RJT1VTX0NPVU5ULCBvbGRJbmZlY3Rpb3VzQ291bnQsIGluZmVjdGlvdXNDb3VudCkpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBkaXNlYXNlTW9kZWxMYWJlbAorCSAqICAgICAgICAgICAgdGhlIGRpc2Vhc2UgbW9kZWwgbGFiZWwgdG8gaGF2ZSBpdHMgaW5mZWN0aW91cyB2YWx1ZQorCSAqICAgICAgICAgICAgaW5pdGlhbGl6ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBkb0luaXRpYWxpemF0aW9uKGZpbmFsIERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VNb2RlbExhYmVsKSB7CisJCWZpbmFsIEludGVncmF0aW9uTGFiZWwgc2lMYWJlbCA9IChJbnRlZ3JhdGlvbkxhYmVsKSBkaXNlYXNlTW9kZWxMYWJlbDsKKwkJZmluYWwgU0lMYWJlbFZhbHVlIHNpVmFsdWUgPSAoU0lMYWJlbFZhbHVlKXNpTGFiZWwuZ2V0Q3VycmVudFZhbHVlKCk7CisJCWRvdWJsZSBuZXdTVmFsdWUgPSAwLjA7CisJCWRvdWJsZSBjdXJyZW50UG9wID0gc2lWYWx1ZS5nZXRQb3B1bGF0aW9uQ291bnQoKTsKKworCQkKKwkJZG91YmxlIGFkZGl0aW9uYWxJbmZlY3Rpb3VzID0gMC4wOworCQlpZih0aGlzLmlzSW5mZWN0UGVyY2VudGFnZSgpKQorCQkJYWRkaXRpb25hbEluZmVjdGlvdXMgPSBjdXJyZW50UG9wICogKGdldEluZmVjdGlvdXNDb3VudCgpIC8gMTAwLjApOworCQllbHNlCisJCQlhZGRpdGlvbmFsSW5mZWN0aW91cyA9IGdldEluZmVjdGlvdXNDb3VudCgpOworCisJCWlmKGFkZGl0aW9uYWxJbmZlY3Rpb3VzID4gc2lWYWx1ZS5nZXRTKCkpIGFkZGl0aW9uYWxJbmZlY3Rpb3VzID0gc2lWYWx1ZS5nZXRTKCk7CisJCQorCQluZXdTVmFsdWUgPSBzaVZhbHVlLmdldFMoKSAtIGFkZGl0aW9uYWxJbmZlY3Rpb3VzOworCQkKKwkJZmluYWwgZG91YmxlIG5ld0lWYWx1ZSA9IHNpVmFsdWUuZ2V0SSgpICsgYWRkaXRpb25hbEluZmVjdGlvdXM7CisJCQorCQluZXdTVmFsdWUgPSBuZXdTVmFsdWUgPCAwID8gMCA6IG5ld1NWYWx1ZTsKKwkJKChTSUxhYmVsVmFsdWUpc2lMYWJlbC5nZXRDdXJyZW50VmFsdWUoKSkuc2V0UyhuZXdTVmFsdWUpOworCQkoKFNJTGFiZWxWYWx1ZSlzaUxhYmVsLmdldE5leHRWYWx1ZSgpKS5zZXRTKG5ld1NWYWx1ZSk7CisJCSgoKFNJTGFiZWxWYWx1ZSlzaUxhYmVsLmdldFByb2JlVmFsdWUoKSkpLnNldFMobmV3U1ZhbHVlKTsKKwkJLy8gV2UgY291bGQgZGl2aWRlIHRoZW0gYmV0d2VlbiB0aGUgdHdvIGluZmVjdGlvdXMgc3RhdGVzLCAKKwkJLy8gYnV0IHRoaXMgc2hvdWxkIGJlIG9rYXkKKwkJKChTSUxhYmVsVmFsdWUpc2lMYWJlbC5nZXRDdXJyZW50VmFsdWUoKSkuc2V0SShuZXdJVmFsdWUpOworCQkoKFNJTGFiZWxWYWx1ZSlzaUxhYmVsLmdldE5leHRWYWx1ZSgpKS5zZXRJKG5ld0lWYWx1ZSk7CisJCSgoU0lMYWJlbFZhbHVlKXNpTGFiZWwuZ2V0UHJvYmVWYWx1ZSgpKS5zZXRJKG5ld0lWYWx1ZSk7CisJfSAvLyBkb0luaXRpYWxpemF0aW9uCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcGFyYW0gcmVzb2x2ZQorCSAqIEBwYXJhbSBjb3JlVHlwZQorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfSU5GRUNUT1JfX0lORkVDVElPVVNfQ09VTlQ6CisJCQkJcmV0dXJuIGdldEluZmVjdGlvdXNDb3VudCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSBuZXdWYWx1ZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfSU5GRUNUT1JfX0lORkVDVElPVVNfQ09VTlQ6CisJCQkJc2V0SW5mZWN0aW91c0NvdW50KChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfSU5GRUNUT1JfX0lORkVDVElPVVNfQ09VTlQ6CisJCQkJc2V0SW5mZWN0aW91c0NvdW50KElORkVDVElPVVNfQ09VTlRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9JTkZFQ1RPUl9fSU5GRUNUSU9VU19DT1VOVDoKKwkJCQlyZXR1cm4gaW5mZWN0aW91c0NvdW50ICE9IElORkVDVElPVVNfQ09VTlRfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoaW5mZWN0aW91c0NvdW50OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGluZmVjdGlvdXNDb3VudCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvLyBTSUluZmVjdG9ySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TSUxhYmVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TSUxhYmVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OWMyNzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1NJTGFiZWxJbXBsLmphdmEKQEAgLTAsMCArMSw1MzcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TaW1wbGVEYXRhRXhjaGFuZ2VMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U0kgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJTGFiZWxJbXBsI2dldERlbHRhVmFsdWUgPGVtPkRlbHRhIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSUxhYmVsSW1wbCNnZXRQcm9iZVZhbHVlIDxlbT5Qcm9iZSBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lMYWJlbEltcGwjZ2V0VGVtcFZhbHVlIDxlbT5UZW1wIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSUxhYmVsSW1wbCNnZXRPcmlnaW5hbFZhbHVlIDxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lMYWJlbEltcGwjZ2V0RXJyb3JTY2FsZSA8ZW0+RXJyb3IgU2NhbGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTSUxhYmVsSW1wbCBleHRlbmRzIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxJbXBsIGltcGxlbWVudHMKKwkJU0lMYWJlbCB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsdGFWYWx1ZSgpIDxlbT5EZWx0YSBWYWx1ZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGVsdGFWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFNJTGFiZWxWYWx1ZSBkZWx0YVZhbHVlOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2JlVmFsdWUoKSA8ZW0+UHJvYmUgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFByb2JlVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTSUxhYmVsVmFsdWUgcHJvYmVWYWx1ZTsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZW1wVmFsdWUoKSA8ZW0+VGVtcCBWYWx1ZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGVtcFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU0lMYWJlbFZhbHVlIHRlbXBWYWx1ZTsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmlnaW5hbFZhbHVlKCkgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPcmlnaW5hbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU0lMYWJlbFZhbHVlIG9yaWdpbmFsVmFsdWU7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXJyb3JTY2FsZSgpIDxlbT5FcnJvciBTY2FsZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RXJyb3JTY2FsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFNJTGFiZWxWYWx1ZSBlcnJvclNjYWxlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgU0lMYWJlbEltcGwoKSB7CisJCXNldEN1cnJlbnRWYWx1ZShTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNJTGFiZWxWYWx1ZSgpKTsKKwkJc2V0TmV4dFZhbHVlKFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0lMYWJlbFZhbHVlKCkpOworCQlzZXRPcmlnaW5hbFZhbHVlKFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0lMYWJlbFZhbHVlKCkpOworCQlzZXRUZW1wVmFsdWUoU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTSUxhYmVsVmFsdWUoKSk7CisJCXNldFByb2JlVmFsdWUoU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTSUxhYmVsVmFsdWUoKSk7CisJCXNldEVycm9yU2NhbGUoU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTSUxhYmVsVmFsdWUoKSk7CisJCXNldERlbHRhVmFsdWUoU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTSUxhYmVsVmFsdWUoKSk7CisJfSAvLyBTSUxhYmVsSW1wbAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNJX0xBQkVMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTSUxhYmVsVmFsdWUgZ2V0RGVsdGFWYWx1ZSgpIHsKKwkJaWYgKGRlbHRhVmFsdWUgIT0gbnVsbCAmJiBkZWx0YVZhbHVlLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGREZWx0YVZhbHVlID0gKEludGVybmFsRU9iamVjdClkZWx0YVZhbHVlOworCQkJZGVsdGFWYWx1ZSA9IChTSUxhYmVsVmFsdWUpZVJlc29sdmVQcm94eShvbGREZWx0YVZhbHVlKTsKKwkJCWlmIChkZWx0YVZhbHVlICE9IG9sZERlbHRhVmFsdWUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTdGFuZGFyZFBhY2thZ2UuU0lfTEFCRUxfX0RFTFRBX1ZBTFVFLCBvbGREZWx0YVZhbHVlLCBkZWx0YVZhbHVlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGRlbHRhVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJTGFiZWxWYWx1ZSBiYXNpY0dldERlbHRhVmFsdWUoKSB7CisJCXJldHVybiBkZWx0YVZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlbHRhVmFsdWUoU0lMYWJlbFZhbHVlIG5ld0RlbHRhVmFsdWUpIHsKKwkJU0lMYWJlbFZhbHVlIG9sZERlbHRhVmFsdWUgPSBkZWx0YVZhbHVlOworCQlkZWx0YVZhbHVlID0gbmV3RGVsdGFWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNJX0xBQkVMX19ERUxUQV9WQUxVRSwgb2xkRGVsdGFWYWx1ZSwgZGVsdGFWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTSUxhYmVsVmFsdWUgZ2V0UHJvYmVWYWx1ZSgpIHsKKwkJaWYgKHByb2JlVmFsdWUgIT0gbnVsbCAmJiBwcm9iZVZhbHVlLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRQcm9iZVZhbHVlID0gKEludGVybmFsRU9iamVjdClwcm9iZVZhbHVlOworCQkJcHJvYmVWYWx1ZSA9IChTSUxhYmVsVmFsdWUpZVJlc29sdmVQcm94eShvbGRQcm9iZVZhbHVlKTsKKwkJCWlmIChwcm9iZVZhbHVlICE9IG9sZFByb2JlVmFsdWUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTdGFuZGFyZFBhY2thZ2UuU0lfTEFCRUxfX1BST0JFX1ZBTFVFLCBvbGRQcm9iZVZhbHVlLCBwcm9iZVZhbHVlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHByb2JlVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJTGFiZWxWYWx1ZSBiYXNpY0dldFByb2JlVmFsdWUoKSB7CisJCXJldHVybiBwcm9iZVZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFByb2JlVmFsdWUoU0lMYWJlbFZhbHVlIG5ld1Byb2JlVmFsdWUpIHsKKwkJU0lMYWJlbFZhbHVlIG9sZFByb2JlVmFsdWUgPSBwcm9iZVZhbHVlOworCQlwcm9iZVZhbHVlID0gbmV3UHJvYmVWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNJX0xBQkVMX19QUk9CRV9WQUxVRSwgb2xkUHJvYmVWYWx1ZSwgcHJvYmVWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTSUxhYmVsVmFsdWUgZ2V0VGVtcFZhbHVlKCkgeworCQlpZiAodGVtcFZhbHVlICE9IG51bGwgJiYgdGVtcFZhbHVlLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRUZW1wVmFsdWUgPSAoSW50ZXJuYWxFT2JqZWN0KXRlbXBWYWx1ZTsKKwkJCXRlbXBWYWx1ZSA9IChTSUxhYmVsVmFsdWUpZVJlc29sdmVQcm94eShvbGRUZW1wVmFsdWUpOworCQkJaWYgKHRlbXBWYWx1ZSAhPSBvbGRUZW1wVmFsdWUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTdGFuZGFyZFBhY2thZ2UuU0lfTEFCRUxfX1RFTVBfVkFMVUUsIG9sZFRlbXBWYWx1ZSwgdGVtcFZhbHVlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRlbXBWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU0lMYWJlbFZhbHVlIGJhc2ljR2V0VGVtcFZhbHVlKCkgeworCQlyZXR1cm4gdGVtcFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRlbXBWYWx1ZShTSUxhYmVsVmFsdWUgbmV3VGVtcFZhbHVlKSB7CisJCVNJTGFiZWxWYWx1ZSBvbGRUZW1wVmFsdWUgPSB0ZW1wVmFsdWU7CisJCXRlbXBWYWx1ZSA9IG5ld1RlbXBWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNJX0xBQkVMX19URU1QX1ZBTFVFLCBvbGRUZW1wVmFsdWUsIHRlbXBWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTSUxhYmVsVmFsdWUgZ2V0T3JpZ2luYWxWYWx1ZSgpIHsKKwkJaWYgKG9yaWdpbmFsVmFsdWUgIT0gbnVsbCAmJiBvcmlnaW5hbFZhbHVlLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRPcmlnaW5hbFZhbHVlID0gKEludGVybmFsRU9iamVjdClvcmlnaW5hbFZhbHVlOworCQkJb3JpZ2luYWxWYWx1ZSA9IChTSUxhYmVsVmFsdWUpZVJlc29sdmVQcm94eShvbGRPcmlnaW5hbFZhbHVlKTsKKwkJCWlmIChvcmlnaW5hbFZhbHVlICE9IG9sZE9yaWdpbmFsVmFsdWUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTdGFuZGFyZFBhY2thZ2UuU0lfTEFCRUxfX09SSUdJTkFMX1ZBTFVFLCBvbGRPcmlnaW5hbFZhbHVlLCBvcmlnaW5hbFZhbHVlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG9yaWdpbmFsVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJTGFiZWxWYWx1ZSBiYXNpY0dldE9yaWdpbmFsVmFsdWUoKSB7CisJCXJldHVybiBvcmlnaW5hbFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE9yaWdpbmFsVmFsdWUoU0lMYWJlbFZhbHVlIG5ld09yaWdpbmFsVmFsdWUpIHsKKwkJU0lMYWJlbFZhbHVlIG9sZE9yaWdpbmFsVmFsdWUgPSBvcmlnaW5hbFZhbHVlOworCQlvcmlnaW5hbFZhbHVlID0gbmV3T3JpZ2luYWxWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNJX0xBQkVMX19PUklHSU5BTF9WQUxVRSwgb2xkT3JpZ2luYWxWYWx1ZSwgb3JpZ2luYWxWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTSUxhYmVsVmFsdWUgZ2V0RXJyb3JTY2FsZSgpIHsKKwkJaWYgKGVycm9yU2NhbGUgIT0gbnVsbCAmJiBlcnJvclNjYWxlLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRFcnJvclNjYWxlID0gKEludGVybmFsRU9iamVjdCllcnJvclNjYWxlOworCQkJZXJyb3JTY2FsZSA9IChTSUxhYmVsVmFsdWUpZVJlc29sdmVQcm94eShvbGRFcnJvclNjYWxlKTsKKwkJCWlmIChlcnJvclNjYWxlICE9IG9sZEVycm9yU2NhbGUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTdGFuZGFyZFBhY2thZ2UuU0lfTEFCRUxfX0VSUk9SX1NDQUxFLCBvbGRFcnJvclNjYWxlLCBlcnJvclNjYWxlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGVycm9yU2NhbGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJTGFiZWxWYWx1ZSBiYXNpY0dldEVycm9yU2NhbGUoKSB7CisJCXJldHVybiBlcnJvclNjYWxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVycm9yU2NhbGUoU0lMYWJlbFZhbHVlIG5ld0Vycm9yU2NhbGUpIHsKKwkJU0lMYWJlbFZhbHVlIG9sZEVycm9yU2NhbGUgPSBlcnJvclNjYWxlOworCQllcnJvclNjYWxlID0gbmV3RXJyb3JTY2FsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNJX0xBQkVMX19FUlJPUl9TQ0FMRSwgb2xkRXJyb3JTY2FsZSwgZXJyb3JTY2FsZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFNJTGFiZWxWYWx1ZSBnZXRDdXJyZW50U0lWYWx1ZSgpIHsKKwkJcmV0dXJuIChTSUxhYmVsVmFsdWUpIGdldEN1cnJlbnRWYWx1ZSgpOworCX0gLy8gZ2V0Q3VycmVudFNJVmFsdWUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFNJTGFiZWxWYWx1ZSBnZXROZXh0U0lWYWx1ZSgpIHsKKwkJcmV0dXJuIChTSUxhYmVsVmFsdWUpIGdldE5leHRWYWx1ZSgpOworCX0gLy8gZ2V0TmV4dFNJVmFsdWUKKworCS8qKgorCSAqIEByZXR1cm4gc2V0IHRoZSBudW1iZXIgbnVtYmVyIG9mIGluZmVjdGlvdXMgcG9wdWxhdGlvbiBtZW1iZXJzCisJICovCisJcHVibGljIHZvaWQgc2V0TmV4dEkoZG91YmxlIGkpIHsKKwkJKChTSUxhYmVsVmFsdWUpZ2V0TmV4dFZhbHVlKCkpLnNldEkoaSk7CisJfQorCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbCNnZXRJKCkKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldEkoKSB7CisJCXJldHVybiBnZXRDdXJyZW50U0lWYWx1ZSgpLmdldEkoKTsKKwl9IC8vIGdldEkKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWwjc2V0SSgpCisJICovCisJcHVibGljIHZvaWQgc2V0SShkb3VibGUgaSkgeworCQlnZXRDdXJyZW50U0lWYWx1ZSgpLnNldEkoaSk7CisJfSAvLyBnZXRJCisKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsI2dldE5leHRJKCkKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE5leHRJKCkgeworCQlyZXR1cm4gZ2V0TmV4dFNJVmFsdWUoKS5nZXRJKCk7CisJfSAvLyBnZXROZXh0SQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogQHBhcmFtIHJlc29sdmUKKwkgKiBAcGFyYW0gY29yZVR5cGUKKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX0xBQkVMX19ERUxUQV9WQUxVRToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldERlbHRhVmFsdWUoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXREZWx0YVZhbHVlKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9MQUJFTF9fUFJPQkVfVkFMVUU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRQcm9iZVZhbHVlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0UHJvYmVWYWx1ZSgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfTEFCRUxfX1RFTVBfVkFMVUU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRUZW1wVmFsdWUoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRUZW1wVmFsdWUoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX0xBQkVMX19PUklHSU5BTF9WQUxVRToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE9yaWdpbmFsVmFsdWUoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRPcmlnaW5hbFZhbHVlKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9MQUJFTF9fRVJST1JfU0NBTEU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFcnJvclNjYWxlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0RXJyb3JTY2FsZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9MQUJFTF9fREVMVEFfVkFMVUU6CisJCQkJc2V0RGVsdGFWYWx1ZSgoU0lMYWJlbFZhbHVlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9MQUJFTF9fUFJPQkVfVkFMVUU6CisJCQkJc2V0UHJvYmVWYWx1ZSgoU0lMYWJlbFZhbHVlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9MQUJFTF9fVEVNUF9WQUxVRToKKwkJCQlzZXRUZW1wVmFsdWUoKFNJTGFiZWxWYWx1ZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfTEFCRUxfX09SSUdJTkFMX1ZBTFVFOgorCQkJCXNldE9yaWdpbmFsVmFsdWUoKFNJTGFiZWxWYWx1ZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfTEFCRUxfX0VSUk9SX1NDQUxFOgorCQkJCXNldEVycm9yU2NhbGUoKFNJTGFiZWxWYWx1ZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX0xBQkVMX19ERUxUQV9WQUxVRToKKwkJCQlzZXREZWx0YVZhbHVlKChTSUxhYmVsVmFsdWUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfTEFCRUxfX1BST0JFX1ZBTFVFOgorCQkJCXNldFByb2JlVmFsdWUoKFNJTGFiZWxWYWx1ZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9MQUJFTF9fVEVNUF9WQUxVRToKKwkJCQlzZXRUZW1wVmFsdWUoKFNJTGFiZWxWYWx1ZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9MQUJFTF9fT1JJR0lOQUxfVkFMVUU6CisJCQkJc2V0T3JpZ2luYWxWYWx1ZSgoU0lMYWJlbFZhbHVlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX0xBQkVMX19FUlJPUl9TQ0FMRToKKwkJCQlzZXRFcnJvclNjYWxlKChTSUxhYmVsVmFsdWUpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX0xBQkVMX19ERUxUQV9WQUxVRToKKwkJCQlyZXR1cm4gZGVsdGFWYWx1ZSAhPSBudWxsOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfTEFCRUxfX1BST0JFX1ZBTFVFOgorCQkJCXJldHVybiBwcm9iZVZhbHVlICE9IG51bGw7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9MQUJFTF9fVEVNUF9WQUxVRToKKwkJCQlyZXR1cm4gdGVtcFZhbHVlICE9IG51bGw7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9MQUJFTF9fT1JJR0lOQUxfVkFMVUU6CisJCQkJcmV0dXJuIG9yaWdpbmFsVmFsdWUgIT0gbnVsbDsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX0xBQkVMX19FUlJPUl9TQ0FMRToKKwkJCQlyZXR1cm4gZXJyb3JTY2FsZSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsI2dldEluY2lkZW5jZSgpCisJICovCisJcHVibGljIGRvdWJsZSBnZXRJbmNpZGVuY2UoKSB7CisJCXJldHVybiB0aGlzLmdldEN1cnJlbnRTSVZhbHVlKCkuZ2V0SW5jaWRlbmNlKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbCNzZXRJbmNpZGVuY2UoZG91YmxlKQorCSAqLworCXB1YmxpYyB2b2lkIHNldEluY2lkZW5jZShkb3VibGUgaW5jaWRlbmNlKSB7CisJCXRoaXMuZ2V0Q3VycmVudFNJVmFsdWUoKS5zZXRJbmNpZGVuY2UoaW5jaWRlbmNlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZXNldChTVEVNVGltZSB0aW1lKSB7CisJCS8vIEFkanVzdCBjdXJyZW50IHZhbHVlIGJ5IGFkZGluZy9zdWJzdHJhY3RpbmcgZGVsdGFzIGJ5IG90aGVyIG1vZGVscyAocG9wdWxhdGlvbiBtb2RlbHMpLgorCQkvLyBXZSBkbyB0aGlzIHRvIHNldCB0aGUgcmlnaHQgY291bnRzIHRvIG1hdGNoIHRoZSBwb3B1bGF0aW9uIG51bWJlcnMgYXQgdGhlIGJlZ2lubmluZworCQkvLyBvZiB0aGUgc2ltdWxhdGlvbi4KKwkJCisJCWZvcihMYWJlbCBsOnRoaXMuZ2V0Tm9kZSgpLmdldExhYmVscygpKSB7CisJCQlpZihsIGluc3RhbmNlb2YgSW50ZWdyYXRpb25MYWJlbCkgeworCQkJCWlmKCEoKEludGVncmF0aW9uTGFiZWwpbCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyh0aGlzLmdldFBvcHVsYXRpb25Nb2RlbExhYmVsKCkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSkpCisJCQkJCWNvbnRpbnVlOworCQkJCUludGVncmF0aW9uTGFiZWwgaWwgPSAoSW50ZWdyYXRpb25MYWJlbClsOworCQkJCWlmKGwgPT0gdGhpcykgY29udGludWU7CisJCQkJU2ltcGxlRGF0YUV4Y2hhbmdlTGFiZWxWYWx1ZSBkZWx0YSA9IChTaW1wbGVEYXRhRXhjaGFuZ2VMYWJlbFZhbHVlKWlsLmdldERlbHRhVmFsdWUoKTsKKwkJCQkKKwkJCQlNYXA8Tm9kZSwgRG91YmxlPiBhcnJpdmFscyA9IGRlbHRhLmdldEFycml2YWxzKCk7CisJCQkJTWFwPE5vZGUsIERvdWJsZT4gZGVwYXJ0dXJlcyA9IGRlbHRhLmdldERlcGFydHVyZXMoKTsKKwkJCQkKKwkJCQkvLyBXZSBzY2FsZSB0aGUgbGFiZWwgdmFsdWVzIGJhY2sgc2luY2UgYXQgdGhpcyBwb2ludCB0aGUgaW5ub2N1bGF0b3JzL2luZmVjdG9ycworCQkJCS8vIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgYW5kIHdlIG5lZWQgdG8gbW9kaWZ5IGFsbCBzdGF0ZXMgb2YgdGhlIGRpc2Vhc2UKKwkJCQkKKwkJCQlkb3VibGUgcG9wQ291bnQgPSAoKFNJTGFiZWxWYWx1ZSl0aGlzLmdldEN1cnJlbnRWYWx1ZSgpKS5nZXRQb3B1bGF0aW9uQ291bnQoKTsKKwkJCQlpZihhcnJpdmFscyAhPSBudWxsICYmIGFycml2YWxzLnNpemUoKSA9PSAxKSB7CisJCQkJCU5vZGUgbiA9IGFycml2YWxzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOworCQkJCQlhc3NlcnQobi5lcXVhbHMoZ2V0Tm9kZSgpKSk7CisJCQkJCWRvdWJsZSBmYWN0b3IgPSBhcnJpdmFscy5nZXQobikgLyBwb3BDb3VudDsKKwkJCQkJaWYoRG91YmxlLmlzTmFOKGZhY3RvcikgfHwgRG91YmxlLmlzSW5maW5pdGUoZmFjdG9yKSkgZmFjdG9yID0gMC4wOy8vIGRvIG5vdGhpbmcKKwkJCQkJU0lMYWJlbFZhbHVlIGFkZFYgPSAoU0lMYWJlbFZhbHVlKUVjb3JlVXRpbC5jb3B5KHRoaXMuZ2V0Q3VycmVudFZhbHVlKCkpOworCQkJCQlhZGRWLnNjYWxlKGZhY3Rvcik7CisJCQkJCSgoU0lMYWJlbFZhbHVlKXRoaXMuZ2V0Q3VycmVudFZhbHVlKCkpLmFkZCgoSW50ZWdyYXRpb25MYWJlbFZhbHVlKWFkZFYpOworCQkJCX0KKwkJCQlpZihkZXBhcnR1cmVzICE9IG51bGwgJiYgZGVwYXJ0dXJlcy5zaXplKCkgPT0gMSkgeworCQkJCQlOb2RlIG4gPSBkZXBhcnR1cmVzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOworCQkJCQlhc3NlcnQobi5lcXVhbHMoZ2V0Tm9kZSgpKSk7CisJCQkJCWRvdWJsZSBmYWN0b3IgPSBkZXBhcnR1cmVzLmdldChuKSAvIHBvcENvdW50OworCQkJCQlpZihEb3VibGUuaXNOYU4oZmFjdG9yKSB8fCBEb3VibGUuaXNJbmZpbml0ZShmYWN0b3IpKSBmYWN0b3IgPSAwLjA7Ly8gZG8gbm90aGluZworCQkJCQlTSUxhYmVsVmFsdWUgc3ViViA9IChTSUxhYmVsVmFsdWUpRWNvcmVVdGlsLmNvcHkodGhpcy5nZXRDdXJyZW50VmFsdWUoKSk7CisJCQkJCXN1YlYuc2NhbGUoZmFjdG9yKTsKKwkJCQkJKChTSUxhYmVsVmFsdWUpdGhpcy5nZXRDdXJyZW50VmFsdWUoKSkuc3ViKChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpc3ViVik7CisJCQkJfQorCQkJCQorCQkJCQkKKwkJCX0KKwkJfQorCX0KKworfSAvLyBTSUxhYmVsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TSUxhYmVsVmFsdWVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1NJTGFiZWxWYWx1ZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2FmMjYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TSUxhYmVsVmFsdWVJbXBsLmphdmEKQEAgLTAsMCArMSw0MzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNJIExhYmVsIFZhbHVlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSUxhYmVsVmFsdWVJbXBsI2dldEkgPGVtPkk8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTSUxhYmVsVmFsdWVJbXBsIGV4dGVuZHMgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbAorCQlpbXBsZW1lbnRzIFNJTGFiZWxWYWx1ZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEkoKSA8ZW0+STwvZW0+fScgYXR0cmlidXRlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI2dldEkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIElfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJKCkgPGVtPkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgaSA9IElfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNJTGFiZWxWYWx1ZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGluc3RhbmNlcyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKwkgKiAKKwkgKiBAcGFyYW0gcworCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBzdXNjZXB0aWJsZSBwb3B1bGF0aW9uIG1lbWJlcnMKKwkgKiAKKwkgKiBAcGFyYW0gaVIKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcmVjb3ZlcmluZyBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gbWVtYmVycworCSAqIAorCSAqIEBwYXJhbSBpRgorCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBmYXRhbGx5IGluZmVjdGlvdXMgcG9wdWxhdGlvbiBtZW1iZXJzCisJICogCisJICogQHBhcmFtIGluY2lkZW5jZQorCSAqICAgICAgICAgICAgdGhlIG5ldyBpbmNpZGVuY2UgZnJvbSB0aGUgaW50ZXJhY3Rpb24gdGVybSBpbiB0aGUgY29tcGFydG1lbnQgbW9kZWwKKwkgKiAKKwkgKiBAcGFyYW0gYmlydGhzCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJpcnRocyB0aGF0IGhhdmUgb2NjdXJyZWQgaW4gdGhlIHBvcHVsYXRpb24KKwkgKiBAcGFyYW0gZGVhdGhzCisJICogICAgICAgICAgICB0aGUgdG90YWwgbnVtYmVyIG9mIGRlYXRocyB0aGF0IGhhdmUgb2NjdXJyZWQgaW4gdGhlIHBvcHVsYXRpb24KKwkgKiBAcGFyYW0gZGlzZWFzZURlYXRocworCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBkZWF0aHMgZHVlIHRvIHRoZSBkaXNlYXNlIHRoYXQgaGF2ZSBvY2N1cnJlZCBpbgorCSAqICAgICAgICAgICAgdGhlIHBvcHVsYXRpb24KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKi8KKwlwdWJsaWMgU0lMYWJlbFZhbHVlSW1wbChmaW5hbCBkb3VibGUgcywgZmluYWwgZG91YmxlIGksIGZpbmFsIGRvdWJsZSBpbmNpZGVuY2UsCisJCQlmaW5hbCBkb3VibGUgZGlzZWFzZURlYXRocykgeworCQlzdXBlcihzLCBkaXNlYXNlRGVhdGhzKTsKKwkJdGhpcy5pID0gaTsKKwkJdGhpcy5pbmNpZGVuY2UgPSBpbmNpZGVuY2U7CisJfSAvLyBTSUxhYmVsVmFsdWVJbXBsCisKKwkKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZXMgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisJICogCisJICogQHBhcmFtIHMKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc3VzY2VwdGlibGUgcG9wdWxhdGlvbiBtZW1iZXJzCisJICogCisJICogQHBhcmFtIGlSCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHJlY292ZXJpbmcgaW5mZWN0aW91cyBwb3B1bGF0aW9uIG1lbWJlcnMKKwkgKiAKKwkgKiBAcGFyYW0gaUYKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZmF0YWxseSBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gbWVtYmVycworCSAqICAgICAgICAgICAgCisJICogQHBhcmFtIGJpcnRocworCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBiaXJ0aHMgdGhhdCBoYXZlIG9jY3VycmVkIGluIHRoZSBwb3B1bGF0aW9uCisJICogQHBhcmFtIGRlYXRocworCSAqICAgICAgICAgICAgdGhlIHRvdGFsIG51bWJlciBvZiBkZWF0aHMgdGhhdCBoYXZlIG9jY3VycmVkIGluIHRoZSBwb3B1bGF0aW9uCisJICogQHBhcmFtIGRpc2Vhc2VEZWF0aHMKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGVhdGhzIGR1ZSB0byB0aGUgZGlzZWFzZSB0aGF0IGhhdmUgb2NjdXJyZWQgaW4KKwkgKiAgICAgICAgICAgIHRoZSBwb3B1bGF0aW9uCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICovCisJcHVibGljIFNJTGFiZWxWYWx1ZUltcGwoZmluYWwgZG91YmxlIHMsIGZpbmFsIGRvdWJsZSBpLCAKKwkJCWZpbmFsIGRvdWJsZSBkaXNlYXNlRGVhdGhzKSB7CisJCXN1cGVyKHMsIGRpc2Vhc2VEZWF0aHMpOworCQl0aGlzLmluY2lkZW5jZSA9IDAuMDsKKwkJdGhpcy5pID0gaTsKKwl9IC8vIFNJTGFiZWxWYWx1ZUltcGwKKworCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TSV9MQUJFTF9WQUxVRTsKKwl9CisKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldEkoKSB7CisJCXJldHVybiBpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEkoZG91YmxlIG5ld0kpIHsKKwkJZG91YmxlIG9sZEkgPSBpOworCQlpID0gbmV3STsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNJX0xBQkVMX1ZBTFVFX19JLCBvbGRJLCBpKSk7CisJfQorCisJLy8JLyoqCisvLwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorLy8JICogCisvLwkgKiBAcmV0dXJuCisvLwkgKiAKKy8vCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorLy8JICogQGdlbmVyYXRlZCBOT1QKKy8vCSAqLworLy8JcHVibGljIFNJTGFiZWxWYWx1ZSByb3RhdGVMZWZ0KCkgeworLy8JCWZpbmFsIGRvdWJsZSB0ZW1wUyA9IGdldFMoKTsKKy8vCQlzZXRTKGdldEkoKSk7CisvLwkJc2V0SSh0ZW1wUyk7CisvLwkJcmV0dXJuIHRoaXM7CisvLwl9IC8vIHJvdGF0ZUxlZnQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbCNnZXRQb3B1bGF0aW9uQ291bnQoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBkb3VibGUgZ2V0UG9wdWxhdGlvbkNvdW50KCkgeworCQlyZXR1cm4gc3VwZXIuZ2V0UG9wdWxhdGlvbkNvdW50KCkgKyBpOworCX0gLy8gZ2V0UG9wdWxhdGlvbkNvdW50CisKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB6ZXJvT3V0UG9wdWxhdGlvbkNvdW50KCkgeworCQlzdXBlci56ZXJvT3V0UG9wdWxhdGlvbkNvdW50KCk7CisJCXNldEkoSV9FREVGQVVMVCk7CisJfSAvLyB6ZXJvT3V0UG9wdWxhdGlvbkNvdW50CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbCNzZXQob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUpCisJICovCisKKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBzZXQoSW50ZWdyYXRpb25MYWJlbFZhbHVlIHZhbHVlKSB7CisJCXN1cGVyLnNldCh2YWx1ZSk7CisJCXNldEkoKChTSUxhYmVsVmFsdWUpIHZhbHVlKS5nZXRJKCkpOworCQlyZXR1cm4gdGhpczsKKwl9IC8vIHNldAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbCNhZGQob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUpCisJICovCisKKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBhZGQoSW50ZWdyYXRpb25MYWJlbFZhbHVlIHZhbHVlKSB7CisJCXN1cGVyLmFkZCh2YWx1ZSk7CisJCXNldEkoZ2V0SSgpICsgKChTSUxhYmVsVmFsdWUpIHZhbHVlKS5nZXRJKCkpOworCQlyZXR1cm4gdGhpczsKKwl9IC8vIGFkZAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbCNzdWIob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUpCisJICovCisKKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBzdWIoSW50ZWdyYXRpb25MYWJlbFZhbHVlIHZhbHVlKSB7CisJCXN1cGVyLnN1Yih2YWx1ZSk7CisJCXNldEkoZ2V0SSgpIC0gKChTSUxhYmVsVmFsdWUpIHZhbHVlKS5nZXRJKCkpOworCQlyZXR1cm4gdGhpczsKKwl9IC8vIHN1YgorCisJCisKKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBzY2FsZShkb3VibGUgc2NhbGVGYWN0b3IpIHsKKwkJc3VwZXIuc2NhbGUoc2NhbGVGYWN0b3IpOworCQlzZXRJKGdldEkoKSAqc2NhbGVGYWN0b3IpOworCQlyZXR1cm4gdGhpczsKKwl9IC8vIHNjYWxlCisJCisJcHVibGljIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgYWRkKGRvdWJsZSBhZGRpdGlvbikgeworCQlzZXRJKGdldEkoKSArYWRkaXRpb24pOworCQlzZXRTKGdldFMoKSArYWRkaXRpb24pOworCQlzZXREaXNlYXNlRGVhdGhzKGdldERpc2Vhc2VEZWF0aHMoKSArIGFkZGl0aW9uKTsKKwkJcmV0dXJuIHRoaXM7CisJfSAvLyBzY2FsZQorCisJcHVibGljIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgYWJzKCkgeworCQlzZXRJKE1hdGguYWJzKGdldEkoKSkpOworCQlzZXRTKE1hdGguYWJzKGdldFMoKSkpOworCQlzZXREaXNlYXNlRGVhdGhzKE1hdGguYWJzKGdldERpc2Vhc2VEZWF0aHMoKSkpOworCQlyZXR1cm4gdGhpczsKKwl9IC8vIHNjYWxlCisKKwlwdWJsaWMgSW50ZWdyYXRpb25MYWJlbFZhbHVlIGRpdmlkZShJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgZCkgeworCQlTSUxhYmVsVmFsdWUgX3NjYWxlID0gKFNJTGFiZWxWYWx1ZSlkOworCQlkb3VibGUgc1NjYWxlZCA9IE1hdGguYWJzKHMpIC8gTWF0aC5hYnMoX3NjYWxlLmdldFMoKSk7CisJCWRvdWJsZSBpU2NhbGVkID0gTWF0aC5hYnMoaSkgLyBNYXRoLmFicyhfc2NhbGUuZ2V0SSgpKTsKKwkJZG91YmxlIGRkU2NhbGVkID0gTWF0aC5hYnMoZGlzZWFzZURlYXRocykgLyBNYXRoLmFicyhfc2NhbGUuZ2V0RGlzZWFzZURlYXRocygpKTsKKworCQlzZXRTKHNTY2FsZWQpOworCQlzZXRJKGlTY2FsZWQpOworCQlzZXREaXNlYXNlRGVhdGhzKGRkU2NhbGVkKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCQorCXB1YmxpYyBkb3VibGUgbWF4KCkgeworCQlpZiAocyA+IGkgJiYgcyA+IGRpc2Vhc2VEZWF0aHMpIHJldHVybiBzOworCQllbHNlIGlmKGk+IGRpc2Vhc2VEZWF0aHMpIHJldHVybiBpOworCQllbHNlIHJldHVybiBkaXNlYXNlRGVhdGhzOworCX0KKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUltcGwjcmVzZXQoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlzdXBlci5yZXNldCgpOworCQlzZXRJKElfRURFRkFVTFQpOworCX0gLy8gcmVzZXQKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSByZXNvbHZlCisJICogQHBhcmFtIGNvcmVUeXBlCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9MQUJFTF9WQUxVRV9fSToKKwkJCQlyZXR1cm4gZ2V0SSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9MQUJFTF9WQUxVRV9fSToKKwkJCQlzZXRJKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9MQUJFTF9WQUxVRV9fSToKKwkJCQlzZXRJKElfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9MQUJFTF9WQUxVRV9fSToKKwkJCQlyZXR1cm4gaSAhPSBJX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKQorCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJcmVzdWx0LmFwcGVuZCgiczoiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGdldEZvcm1hdHRlcigpLmZvcm1hdChzKSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgaToiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGdldEZvcm1hdHRlcigpLmZvcm1hdChpKSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgREQ6Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChnZXRGb3JtYXR0ZXIoKS5mb3JtYXQoZ2V0RGlzZWFzZURlYXRocygpKSk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9IC8vIHRvU3RyaW5nCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUltcGwjc2FuZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2FuZSgpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHN1cGVyLnNhbmUoKTsKKwkKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBnZXRJKCkgPj0gSV9FREVGQVVMVDsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQorCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIGdldEkoKSA8PSBNQVhfUE9QVUxBVElPTl9WQUxVRTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQorCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmICFEb3VibGUuaXNJbmZpbml0ZShnZXRJKCkpOworCQlhc3NlcnQgcmV0VmFsdWU7CisJCQorCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmICFEb3VibGUuaXNOYU4oZ2V0SSgpKTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gc2FuZQorCisJLyoqCisJICogQWRqdXN0IHdoZW4gYSBkZWx0YSB2YWx1ZSBpcyBiYWQsIGUuZy4gZm9yY2VzIHRoZSAKKwkgKiB0YXJnZXQgdG8gZ28gbmVnYXRpdmUgaW4gYW55IHN0YXRlLgorCSAqIAorCSAqIEByZXR1cm4gYm9vbGVhbiAKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBhZGp1c3REZWx0YShJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgdGFyZ2V0KSB7CisJCVNJTGFiZWxWYWx1ZSBzaVZhbHVlID0gKFNJTGFiZWxWYWx1ZSl0YXJnZXQ7CisJCWJvb2xlYW4gYWRqdXN0ZWQgPSBmYWxzZTsKKwkJZG91YmxlIG5ld1MgPSB0aGlzLmdldFMoKSArIHNpVmFsdWUuZ2V0UygpOworCQlkb3VibGUgbmV3SSA9IHRoaXMuZ2V0SSgpICsgc2lWYWx1ZS5nZXRJKCk7CisJCWRvdWJsZSBuZXdERCA9IHRoaXMuZ2V0RGlzZWFzZURlYXRocygpICsgc2lWYWx1ZS5nZXREaXNlYXNlRGVhdGhzKCk7CisJCQorCQlkb3VibGUgZmFjdG9yID0gMS4wOworCQlpZihuZXdTIDwgbmV3SSAmJiBuZXdTIDwgbmV3REQgJiYgbmV3UyA8IDAuMCkgeworCQkJLy8gU2NhbGUgdXNpbmcgUworCQkJYWRqdXN0ZWQgPSB0cnVlOworCQkJZmFjdG9yID0gLXNpVmFsdWUuZ2V0UygpL3RoaXMuZ2V0UygpOworCQl9IGVsc2UgaWYobmV3SSA8IG5ld0REICYmIG5ld0kgPCAwLjApIHsKKwkJCS8vIFNjYWxlIHVzaW5nIFIKKwkJCWFkanVzdGVkID0gdHJ1ZTsKKwkJCWZhY3RvciA9IC1zaVZhbHVlLmdldEkoKS90aGlzLmdldEkoKTsKKwkJfSBlbHNlIGlmIChuZXdERCA8IDApIHsKKwkJCS8vIFNjYWxlIHVzaW5nIFIKKwkJCWFkanVzdGVkID0gdHJ1ZTsKKwkJCWZhY3RvciA9IC1zaVZhbHVlLmdldERpc2Vhc2VEZWF0aHMoKS90aGlzLmdldERpc2Vhc2VEZWF0aHMoKTsKKwkJfQorCQlpZihhZGp1c3RlZCkgdGhpcy5zY2FsZShmYWN0b3IpOworCQkvLyBEdWUgdG8gcHJlY2lzaW9uIGxpbWl0YXRpb25zIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRoZSBudW1iZXIgaWYgdGlueSBuZWdhdGl2ZS4gQWRqdXN0IGlmIG5lY2Vzc2FyeQorCQluZXdTID0gdGhpcy5nZXRTKCkgKyBzaVZhbHVlLmdldFMoKTsKKwkJbmV3SSA9IHRoaXMuZ2V0SSgpICsgc2lWYWx1ZS5nZXRJKCk7CisJCW5ld0REID0gdGhpcy5nZXREaXNlYXNlRGVhdGhzKCkgKyBzaVZhbHVlLmdldERpc2Vhc2VEZWF0aHMoKTsKKwkJCisJCWlmKG5ld1M8MCkKKwkJCXRoaXMuc2V0Uygtc2lWYWx1ZS5nZXRTKCkpOworCQlpZihuZXdJPDApCisJCQl0aGlzLnNldEkoLXNpVmFsdWUuZ2V0SSgpKTsKKwkJaWYobmV3REQ8MCkKKwkJCXRoaXMuc2V0RGlzZWFzZURlYXRocygtc2lWYWx1ZS5nZXREaXNlYXNlRGVhdGhzKCkpOworCQkKKwkJcmV0dXJuIGFkanVzdGVkOworCX0KKworfSAvLyBTSUxhYmVsVmFsdWVJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1NJUkltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU0lSSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMTc0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1NJUkltcGwuamF2YQpAQCAtMCwwICsxLDQwNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TaW1wbGVEYXRhRXhjaGFuZ2VMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuTWlncmF0aW9uRWRnZUxhYmVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsVmFsdWU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNJUjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lSSW1wbCNnZXRJbW11bml0eUxvc3NSYXRlIDxlbT5JbW11bml0eSBMb3NzIFJhdGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTSVJJbXBsIGV4dGVuZHMgU0lJbXBsIGltcGxlbWVudHMgU0lSIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1tdW5pdHlMb3NzUmF0ZSgpIDxlbT5JbW11bml0eSBMb3NzIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbW11bml0eUxvc3NSYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBJTU1VTklUWV9MT1NTX1JBVEVfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbW11bml0eUxvc3NSYXRlKCkgPGVtPkltbXVuaXR5IExvc3MgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEltbXVuaXR5TG9zc1JhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgaW1tdW5pdHlMb3NzUmF0ZSA9IElNTVVOSVRZX0xPU1NfUkFURV9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU0lSSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2lyRGlzZWFzZU1vZGVsCisJICogICAgICAgICAgICB0aGUgU0lSIGRpc2Vhc2UgbW9kZWwgdG8gYmUgaW5pdGlhbGl6ZWQKKwkgKiBAcGFyYW0gZGlzZWFzZU1vZGVsTmFtZQorCSAqIEBwYXJhbSBiYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZQorCSAqIEBwYXJhbSBpbmZlY3Rpb3VzTW9ydGFsaXR5CisJICogQHBhcmFtIGluZmVjdGlvdXNNb3J0YWxpdHlSYXRlCisJICogICAgICAgICAgICB0aGUgcmF0ZSBhdCB3aGljaCBmYXRhbGx5IGluZmVjdGlvdXMgcG9wdWxhdGlvbiBtZW1iZXJzIGRpZQorCSAqIEBwYXJhbSB0cmFuc21pc3Npb25SYXRlCisJICogQHBhcmFtIHJlY292ZXJ5UmF0ZQorCSAqIEBwYXJhbSBpbW11bml0eUxvc3NSYXRlCisJICogQHBhcmFtIGluY3ViYXRpb25SYXRlCisJICogQHBhcmFtIG5vbkxpbmVhcml0eUNvZWZmaWNpZW50CisJICogQHBhcmFtIHRpbWVQZXJpb2QKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbklkZW50aWZpZXIKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFNJUiBpbml0aWFsaXplU0lSRGlzZWFzZU1vZGVsKGZpbmFsIFNJUiBzaXJEaXNlYXNlTW9kZWwsCisJCQlmaW5hbCBTdHJpbmcgZGlzZWFzZU1vZGVsTmFtZSwKKwkJCWZpbmFsIGRvdWJsZSBiYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSwKKwkJCWZpbmFsIGRvdWJsZSBpbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSwKKwkJCWZpbmFsIGRvdWJsZSB0cmFuc21pc3Npb25SYXRlLCBmaW5hbCBkb3VibGUgcmVjb3ZlcnlSYXRlLAorCQkJZmluYWwgZG91YmxlIGltbXVuaXR5TG9zc1JhdGUsCisJCQlmaW5hbCBkb3VibGUgbm9uTGluZWFyaXR5Q29lZmZpY2llbnQsIGZpbmFsIGxvbmcgdGltZVBlcmlvZCwKKwkJCWZpbmFsIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllcikgeworCQlTSUltcGwuaW5pdGlhbGl6ZVNJRGlzZWFzZU1vZGVsKHNpckRpc2Vhc2VNb2RlbCwgZGlzZWFzZU1vZGVsTmFtZSwKKwkJCQliYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSwKKwkJCQlpbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSwgdHJhbnNtaXNzaW9uUmF0ZSwgcmVjb3ZlcnlSYXRlLAorCQkJCW5vbkxpbmVhcml0eUNvZWZmaWNpZW50LCB0aW1lUGVyaW9kLCBwb3B1bGF0aW9uSWRlbnRpZmllcik7CisJCXNpckRpc2Vhc2VNb2RlbC5zZXRJbW11bml0eUxvc3NSYXRlKGltbXVuaXR5TG9zc1JhdGUpOworCQlyZXR1cm4gc2lyRGlzZWFzZU1vZGVsOworCX0gLy8gaW5pdGlhbGl6ZVNJUkRpc2Vhc2VNb2RlbAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxJbXBsI2NyZWF0ZURpc2Vhc2VNb2RlbExhYmVsKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWwgY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWwoKSB7CisJCXJldHVybiBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNJUkxhYmVsKCk7CisJfSAvLyBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbAorCQorCUBPdmVycmlkZQorCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKSB7CisJCXJldHVybiBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNJUkxhYmVsVmFsdWUoKTsKKwl9IC8vIGNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUKKwkKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lJbXBsI2NvbXB1dGVEZWF0aHMob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSwKKwkgKiAgICAgIGxvbmcpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjb21wdXRlRGlzZWFzZURlYXRoc0RlbHRhcygKKwkJCWZpbmFsIFNURU1UaW1lIHRpbWUsIGZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZUxhYmVsLCBmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY3VycmVudExhYmVsVmFsdWUsIGZpbmFsIGxvbmcgdGltZURlbHRhLCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHJldHVyblZhbHVlKSB7CisJCQorCQlmaW5hbCBTSVJMYWJlbFZhbHVlIGN1cnJlbnRTSVIgPSAoU0lSTGFiZWxWYWx1ZSkgY3VycmVudExhYmVsVmFsdWU7CisJCQorCQlmaW5hbCBkb3VibGUgYWRqdXN0ZWRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSA9IGdldEFkanVzdGVkSW5mZWN0aW91c01vcnRhbGl0eVJhdGUodGltZURlbHRhKTsKKwkJZmluYWwgZG91YmxlIGRpc2Vhc2VEZWF0aHMgPSBhZGp1c3RlZEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlCisJCQkJKiBjdXJyZW50U0lSLmdldEkoKTsKKworCQlTSVJMYWJlbFZhbHVlSW1wbCByZXQgPSAoU0lSTGFiZWxWYWx1ZUltcGwpcmV0dXJuVmFsdWU7CisJCXJldC5zZXRTKDAuMCk7CisJCXJldC5zZXRJKC1kaXNlYXNlRGVhdGhzKTsKKwkJcmV0LnNldEluY2lkZW5jZSgwLjApOworCQlyZXQuc2V0UigwLjApOworCQlyZXQuc2V0RGlzZWFzZURlYXRocyhkaXNlYXNlRGVhdGhzKTsKKwkJcmV0dXJuIHJldDsKKwl9IC8vIGNvbXB1dGVEZWF0aHMKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lJbXBsI2NvbXB1dGVUcmFuc2l0aW9ucyhTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUsCisJICogICAgICBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsLCBsb25nKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY29tcHV0ZURpc2Vhc2VEZWx0YXMoCisJCQlmaW5hbCBTVEVNVGltZSB0aW1lLCAKKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjdXJyZW50U3RhdGUsCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VMYWJlbCwgZmluYWwgbG9uZyB0aW1lRGVsdGEsIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgcmV0dXJuVmFsdWUpIHsKKwkJZmluYWwgU0lSTGFiZWxWYWx1ZSBjdXJyZW50U0lSID0gKFNJUkxhYmVsVmFsdWUpIGN1cnJlbnRTdGF0ZTsKKwkJCisJCS8vIFRoaXMgaXMgYmV0YSoKKwkJZG91YmxlIHRyYW5zbWlzc2lvblJhdGUgPSBnZXRBZGp1c3RlZFRyYW5zbWlzc2lvblJhdGUodGltZURlbHRhKTsKKwkJCQkKKwkJaWYoIXRoaXMuaXNGcmVxdWVuY3lEZXBlbmRlbnQoKSkgdHJhbnNtaXNzaW9uUmF0ZSAqPSBnZXRUcmFuc21pc3Npb25SYXRlU2NhbGVGYWN0b3IoZGlzZWFzZUxhYmVsKTsKKworCQkvLyBUaGUgZWZmZWN0aXZlIEluZmVjdGlvdXMgcG9wdWxhdGlvbiAgaXMgYSBkaW1lbnNpb25sZXMgbnVtYmVyIG5vcm1hbGl6ZSBieSB0b3RhbAorCQkvLyBwb3B1bGF0aW9uIHVzZWQgaW4gdGVoIGNvbXB1dGF0aW9uIG9mIGJldHMqUyppIHdoZXJlIGkgPSBJZWZmZWN0aXZlL1BvcC4KKwkJLy8gVGhpcyBpbmNsdWRlcyBhIGNvcnJlY3Rpb24gdG8gdGhlIGN1cnJlbnQKKwkJLy8gaW5mZWN0aW91cyBwb3B1bGF0aW9uIChJZWZmZWN0aXZlKSBiYXNlZCBvbiB0aGUgY29uc2VydmVkIGV4Y2hhbmdlIG9mIHBlb3BsZSAoY2lyY3VsYXRpb24pCisJCS8vIGJldHdlZW4gcmVnaW9ucy4gTm90ZSB0aGF0IHRoaXMgaXMgbm8gdGhlICJhcnJpdmFscyIgYW5kICJkZXBhcnR1cmVzIiB3aGljaCBhcmUKKwkJLy8gYSBkaWZmZXJlbnQgcHJvY2Vzcy4KKwkJZmluYWwgZG91YmxlIGVmZmVjdGl2ZUluZmVjdGlvdXMgPSBnZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cyhkaXNlYXNlTGFiZWwuZ2V0Tm9kZSgpLCBkaXNlYXNlTGFiZWwsIGN1cnJlbnRTSVIuZ2V0SSgpKTsKKworCQkvKgorCQkgKiBDb21wdXRlIHN0YXRlIHRyYW5zaXRpb25zCisJCSAqIAorCQkgKiBSZWdhcmRpbmcgY29tcHV0aW5nIHRoZSBudW1iZXIgb2YgdHJhbnNpdGlvbnMgZnJvbSBTdXNjZXB0aWJsZSB0byBFeHBvc2VkOgorCQkgKiBJbiBhIGxpbmVhciBtb2RlbCB0aGUgImVmZmVjdGl2ZSIgbnVtYmVyIG9mIGluZmVjdGlvdXMgcGVvcGxlIGlzIGp1c3QKKwkJICogdGhlIG51bWJlciBvZiBpbmZlY3Rpb3VzIHBlb3BsZSBJbiBhIG5vbmxpbmVhciBtb2RlbCB3ZSBoYXZlIGEKKwkJICogbm9uTGluZWFyaXR5IGV4cG9uZW50IHRoYXQgaXMgPiAxIHRoaXMgbW9kZWxzIHRoZSBlZmZlY3Qgb2YgaW1tdW5lCisJCSAqIHN5c3RlbSBzYXR1cmF0aW9uIHdoZW4gU3VzY2VwdGlibGUgcGVvcGxlIGFyZSBleHBvc2VkIHRvIGxhcmdlCisJCSAqIG51bWJlcnMgb2YgaW5mZWN0aW91cyBwZW9wbGUuIHRoZW4gdGhlICJlZmZlY3RpdmUiIG51bWJlciBvZgorCQkgKiBpbmZlY3Rpb3VzIHBlb3BsZSBpcyBJXm5vbkxpbmVhcml0eSBleHBvbmVudCB0byBhbGxvdyBmb3IgZWl0aGVyCisJCSAqIGxpbmVhciBvciBub25saW5lYXIgbW9kZWxzIHdlIGFsd2F5cyBjYWxjdWxhdGUgSV5ub25MaW5lYXJpdHkKKwkJICogZXhwb25lbnQgYW5kIGFsbG93IG5vbkxpbmVhcml0eSBleHBvbmVudCA+PSAxLjAKKwkJICovCisJCWRvdWJsZSBudW1iZXJPZkluZmVjdGVkVG9SZWNvdmVyZWQgPSBnZXRBZGp1c3RlZFJlY292ZXJ5UmF0ZSh0aW1lRGVsdGEpCisJCSogY3VycmVudFNJUi5nZXRJKCk7CisJCWRvdWJsZSBudW1iZXJPZlJlY292ZXJlZFRvU3VzY2VwdGlibGUgPSBnZXRBZGp1c3RlZEltbXVuaXR5TG9zc1JhdGUodGltZURlbHRhKQorCQkqIGN1cnJlbnRTSVIuZ2V0UigpOworCQkvLyBOZWVkIHRvIGNoZWNrZWQgd2hhdCBkbyBkbyBoZXJlLiBJZiBub24gbGluZWFyIGNvZWZmaWNpZW50IGlzIG5vdCAxIGFuZAorCQkvLyB0aGUgZWZmZWN0aXZlIGluZmVjdGlvdXMgaXMgbmVnYXRpdmUgKHdoaWNoIGlzIHBvc3NpYmxlKSwgd2hhdCBkbyBkbz8gCisJCS8vIExldCdzIGZhbGwgYmFjayBvbiB0aGUgbGluZWFyIG1ldGhvZCBmb3Igbm93LgorCQlkb3VibGUgbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgPSAwLjA7CisJCWlmKGdldE5vbkxpbmVhcml0eUNvZWZmaWNpZW50KCkgIT0gMS4wICYmIGVmZmVjdGl2ZUluZmVjdGlvdXMgPj0gMC4wKQorCQkJbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgPSB0cmFuc21pc3Npb25SYXRlCisJCQkqIGN1cnJlbnRTSVIuZ2V0UygpKiBNYXRoLnBvdyhlZmZlY3RpdmVJbmZlY3Rpb3VzLCBnZXROb25MaW5lYXJpdHlDb2VmZmljaWVudCgpKTsKKwkJZWxzZQorCQkJbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgPSB0cmFuc21pc3Npb25SYXRlCisJCQkqIGN1cnJlbnRTSVIuZ2V0UygpKiBlZmZlY3RpdmVJbmZlY3Rpb3VzOworCQkKKwkJCisJCS8vIERldGVybWluZSBkZWx0YSBTCisJCWZpbmFsIGRvdWJsZSBkZWx0YVMgPSBudW1iZXJPZlJlY292ZXJlZFRvU3VzY2VwdGlibGUgLSBudW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZDsKKwkJCS8vIERldGVybWluZSBkZWx0YSBJCisJCWZpbmFsIGRvdWJsZSBkZWx0YUkgPSBudW1iZXJPZlN1c2NlcHRpYmxlVG9JbmZlY3RlZC0gbnVtYmVyT2ZJbmZlY3RlZFRvUmVjb3ZlcmVkOworCQkvLyBEZXRlcm1pbmUgZGVsdGEgUgorCQlmaW5hbCBkb3VibGUgZGVsdGFSID0gbnVtYmVyT2ZJbmZlY3RlZFRvUmVjb3ZlcmVkIC0gbnVtYmVyT2ZSZWNvdmVyZWRUb1N1c2NlcHRpYmxlOworCQkKKwkJU0lSTGFiZWxWYWx1ZUltcGwgcmV0ID0gKFNJUkxhYmVsVmFsdWVJbXBsKXJldHVyblZhbHVlOworCQlyZXQuc2V0UyhkZWx0YVMpOworCQlyZXQuc2V0SShkZWx0YUkpOworCQlyZXQuc2V0SW5jaWRlbmNlKG51bWJlck9mSW5mZWN0ZWRUb1JlY292ZXJlZCk7CisJCXJldC5zZXRSKGRlbHRhUik7CisJCXJldC5zZXREaXNlYXNlRGVhdGhzKDApOworCQlyZXR1cm4gcmV0OworCQkKKwl9IC8vIGNvbXB1dGVUcmFuc2l0aW9ucworCisJCQorCS8qKgorCSAqIEBwYXJhbSBmcmFjdGlvblRvRGVwYXJ0CisJICogQHBhcmFtIG5leHRTdGF0ZQorCSAqIEByZXR1cm4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGNvbXB1dGVEZXBhcnR1cmVzKAorCQkJZmluYWwgCWRvdWJsZSBmcmFjdGlvblRvRGVwYXJ0LGZpbmFsICBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgbmV4dFN0YXRlKSB7CisJCWZpbmFsIFNJUkxhYmVsVmFsdWUgZGVwYXJ0ZWVzID0gU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVTSVJMYWJlbFZhbHVlKCk7CisJCWZpbmFsIFNJUkxhYmVsVmFsdWUgc2lTdGF0ZSA9IChTSVJMYWJlbFZhbHVlKSBuZXh0U3RhdGU7CisJCWRlcGFydGVlcy5zZXRTKGZyYWN0aW9uVG9EZXBhcnQgKiBzaVN0YXRlLmdldFMoKSk7CisJCWRlcGFydGVlcy5zZXRJKGZyYWN0aW9uVG9EZXBhcnQgKiBzaVN0YXRlLmdldEkoKSk7CisJCWRlcGFydGVlcy5zZXRSKGZyYWN0aW9uVG9EZXBhcnQgKiBzaVN0YXRlLmdldFIoKSk7CisJCXJldHVybiBkZXBhcnRlZXM7CisJfSAvLyBjb21wdXRlRGVwYXJ0dXJlcworCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNJUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRJbW11bml0eUxvc3NSYXRlKCkgeworCQlyZXR1cm4gaW1tdW5pdHlMb3NzUmF0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuZXdJbW11bml0eUxvc3NSYXRlCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEltbXVuaXR5TG9zc1JhdGUoZG91YmxlIG5ld0ltbXVuaXR5TG9zc1JhdGUpIHsKKwkJZG91YmxlIG9sZEltbXVuaXR5TG9zc1JhdGUgPSBpbW11bml0eUxvc3NSYXRlOworCQlpbW11bml0eUxvc3NSYXRlID0gbmV3SW1tdW5pdHlMb3NzUmF0ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNJUl9fSU1NVU5JVFlfTE9TU19SQVRFLCBvbGRJbW11bml0eUxvc3NSYXRlLCBpbW11bml0eUxvc3NSYXRlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdGltZURlbHRhCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIGRvdWJsZSBnZXRBZGp1c3RlZEltbXVuaXR5TG9zc1JhdGUobG9uZyB0aW1lRGVsdGEpIHsKKwkJcmV0dXJuIGdldEltbXVuaXR5TG9zc1JhdGUoKQorCQkJCSogKChkb3VibGUpIHRpbWVEZWx0YSAvIChkb3VibGUpIGdldFRpbWVQZXJpb2QoKSk7CisJfSAvLyBnZXRBZGp1c3RlZEltbXVuaXR5UmF0ZQorCisJCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogQHBhcmFtIHJlc29sdmUKKwkgKiBAcGFyYW0gY29yZVR5cGUKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJUl9fSU1NVU5JVFlfTE9TU19SQVRFOgorCQkJCXJldHVybiBnZXRJbW11bml0eUxvc3NSYXRlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogQHBhcmFtIG5ld1ZhbHVlCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSVJfX0lNTVVOSVRZX0xPU1NfUkFURToKKwkJCQlzZXRJbW11bml0eUxvc3NSYXRlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lSX19JTU1VTklUWV9MT1NTX1JBVEU6CisJCQkJc2V0SW1tdW5pdHlMb3NzUmF0ZShJTU1VTklUWV9MT1NTX1JBVEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSVJfX0lNTVVOSVRZX0xPU1NfUkFURToKKwkJCQlyZXR1cm4gaW1tdW5pdHlMb3NzUmF0ZSAhPSBJTU1VTklUWV9MT1NTX1JBVEVfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoaW1tdW5pdHlMb3NzUmF0ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpbW11bml0eUxvc3NSYXRlKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSUltcGwjc2FuZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2FuZSgpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHN1cGVyLnNhbmUoKTsKKworCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIGltbXVuaXR5TG9zc1JhdGUgPj0gSU1NVU5JVFlfTE9TU19SQVRFX0VERUZBVUxUOworCQlhc3NlcnQgcmV0VmFsdWU7CisKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiAhRG91YmxlLmlzSW5maW5pdGUoaW1tdW5pdHlMb3NzUmF0ZSk7CisJCWFzc2VydCByZXRWYWx1ZTsKKwkJCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgIURvdWJsZS5pc05hTihpbW11bml0eUxvc3NSYXRlKTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gc2FuZQorCit9IC8vIFNJUkltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU0lSSW5vY3VsYXRvckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU0lSSW5vY3VsYXRvckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2M5MDlkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TSVJJbm9jdWxhdG9ySW1wbC5qYXZhCkBAIC0wLDAgKzEsNDE1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJJbm9jdWxhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNJUiBJbm9jdWxhdG9yPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJJbm9jdWxhdG9ySW1wbCNnZXRJbm9jdWxhdGVkUGVyY2VudGFnZSA8ZW0+SW5vY3VsYXRlZCBQZXJjZW50YWdlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJJbm9jdWxhdG9ySW1wbCNpc0lub2N1bGF0ZVBlcmNlbnRhZ2UgPGVtPklub2N1bGF0ZSBQZXJjZW50YWdlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU0lSSW5vY3VsYXRvckltcGwgZXh0ZW5kcyBTSUluZmVjdG9ySW1wbCBpbXBsZW1lbnRzIFNJUklub2N1bGF0b3IgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbm9jdWxhdGVkUGVyY2VudGFnZSgpIDxlbT5Jbm9jdWxhdGVkIFBlcmNlbnRhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElub2N1bGF0ZWRQZXJjZW50YWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBJTk9DVUxBVEVEX1BFUkNFTlRBR0VfRURFRkFVTFQgPSAxLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbm9jdWxhdGVkUGVyY2VudGFnZSgpIDxlbT5Jbm9jdWxhdGVkIFBlcmNlbnRhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElub2N1bGF0ZWRQZXJjZW50YWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIGlub2N1bGF0ZWRQZXJjZW50YWdlID0gSU5PQ1VMQVRFRF9QRVJDRU5UQUdFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW5vY3VsYXRlUGVyY2VudGFnZSgpIDxlbT5Jbm9jdWxhdGUgUGVyY2VudGFnZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNJbm9jdWxhdGVQZXJjZW50YWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU5PQ1VMQVRFX1BFUkNFTlRBR0VfRURFRkFVTFQgPSB0cnVlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbm9jdWxhdGVQZXJjZW50YWdlKCkgPGVtPklub2N1bGF0ZSBQZXJjZW50YWdlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0lub2N1bGF0ZVBlcmNlbnRhZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlub2N1bGF0ZVBlcmNlbnRhZ2UgPSBJTk9DVUxBVEVfUEVSQ0VOVEFHRV9FREVGQVVMVDsKKworCS8qKgorCSAqIE92ZXJyaWRlVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZmVjdGlvdXNDb3VudCgpIDxlbT5JbmZlY3Rpb3VzIENvdW50PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW5mZWN0aW91c0NvdW50KCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgSU5GRUNUSU9VU19DT1VOVF9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTSVJJbm9jdWxhdG9ySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJLyoqCisJICogRm9yIHRoZSBpbm5vY3VsYXRvciwgd2Ugbm90IG9ubHkgaW5ub2N1bGF0ZSB0aGUgcHJlc2VudCBub2RlIGJ1dCBldmVyeSBjaGlsZCB1bmRlcm5lYXRoIGl0CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5EZWNvcmF0b3JJbXBsI2RlY29yYXRlR3JhcGgob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGRlY29yYXRlR3JhcGgoU1RFTVRpbWUgdGltZSkgeworCQlpZih0aGlzLmlzR3JhcGhEZWNvcmF0ZWQoKSkgcmV0dXJuIHRydWU7CisJCUdyYXBoIGdyYXBoID0gZ2V0R3JhcGgoKTsKKwkJaWYoZ3JhcGggPT0gbnVsbCAmJiB0aGlzLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24pIC8vIE1pZ2h0IGJlIHBhcnQgb2YgYSBjb2xsZWN0aW9uCisJCQlncmFwaCA9ICgoTm9kZURlY29yYXRvcillQ29udGFpbmVyKCkpLmdldEdyYXBoKCk7CisJCisJCS8vIERvIHdlIG5lZWQgdG8gbG9vayB1cCB0aGUgZGlzZWFzZSBtb2RlbCBmcm9tIGl0cyBuYW1lPworCQlpZiAoZGlzZWFzZU1vZGVsID09IG51bGwpIHsKKwkJCS8vIFllcworCQkJLy8gVGhlcmUncyBhIGRpc2Vhc2UgbW9kZWwgb3V0IHRoZXJlIHdpdGggb3VyIG5hbWUgb24gaXQKKwkJCS8vIChtYXliZSkuLi5sZXQncyBmaW5kIGl0CisJCQlmb3IgKEl0ZXJhdG9yPERlY29yYXRvcj4gZGVjb3JhdG9ySXRlciA9IGdyYXBoLmdldERlY29yYXRvcnMoKS5pdGVyYXRvcigpOyBkZWNvcmF0b3JJdGVyCisJCQkJCS5oYXNOZXh0KCk7KSB7CisJCQkJZmluYWwgRGVjb3JhdG9yIGRlY29yYXRvciA9IGRlY29yYXRvckl0ZXIubmV4dCgpOworCQkJCS8vIERpc2Vhc2UgTW9kZWw/CisJCQkJaWYgKGRlY29yYXRvciBpbnN0YW5jZW9mIFN0YW5kYXJkRGlzZWFzZU1vZGVsKSB7CisJCQkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsIGRpc2Vhc2VNb2RlbCA9IChTdGFuZGFyZERpc2Vhc2VNb2RlbCkgZGVjb3JhdG9yOworCQkJCQkvLyBJcyB0aGlzIHRoZSBvbmUgd2UncmUgbG9va2luZyBmb3I/CisJCQkJCWlmIChkaXNlYXNlTW9kZWwuZ2V0RGlzZWFzZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKAorCQkJCQkJCWdldERpc2Vhc2VOYW1lKCkpKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXRoaXMuZGlzZWFzZU1vZGVsID0gZGlzZWFzZU1vZGVsOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9IC8vIGZvciBlYWNoIGRlY29yYXRvcgorCQl9IC8vIGlmIGxvb2sgdXAgZGlzZWFzZSBtb2RlbAorCisJCS8vIERpZCB3ZSBmaW5kIHRoZSBkaXNlYXNlIG1vZGVsIHdlJ3JlIHN1cHBvc2UgdG8gd29yayBmb3I/CisJCWlmIChkaXNlYXNlTW9kZWwgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQkvLyBOb3cgdHJ5IHRvIGZpbmQgdGhlIG5vZGUgdG8gYmUgaW5mZWN0ZWQKKwkJCWZpbmFsIE5vZGUgcGFyZW50ID0gZ3JhcGguZ2V0Tm9kZShnZXRUYXJnZXRVUkkoKSk7CisJCQlTZXQ8Tm9kZT4gYWxsTm9kZXMgPSBudWxsOworCQkJCisJCQlpZih0aGlzLmlzSW5vY3VsYXRlUGVyY2VudGFnZSgpKSB7CisJCQkJYWxsTm9kZXMgPSBnZXRBbGxDaGlsZHJlbihwYXJlbnQpOwkKKwkJCQlhbGxOb2Rlcy5hZGQocGFyZW50KTsKKwkJCX0gZWxzZSB7CisJCQkJYWxsTm9kZXMgPSBuZXcgSGFzaFNldDxOb2RlPigpOworCQkJCWFsbE5vZGVzLmFkZChwYXJlbnQpOworCQkJfQkJCQorCisJCQlJdGVyYXRvcjxOb2RlPiBpdGVyID0gYWxsTm9kZXMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlKGl0ZXIhPW51bGwgJiYgaXRlci5oYXNOZXh0KCkpIHsKKwkJCQlOb2RlIG5vZGUgPSBpdGVyLm5leHQoKTsKKwkJCQkvLyBEaWQgd2UgZmluZCB0aGUgTm9kZT8KKwkJCQlpZiAobm9kZSAhPSBudWxsKSB7CisJCQkJCS8vIFllcworCQkJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPE5vZGVMYWJlbD4gbGFiZWxJdGVyID0gbm9kZS5nZXRMYWJlbHMoKS5pdGVyYXRvcigpOyBsYWJlbEl0ZXIKKwkJCQkJLmhhc05leHQoKTspIHsKKwkJCQkJCWZpbmFsIE5vZGVMYWJlbCBub2RlTGFiZWwgPSBsYWJlbEl0ZXIubmV4dCgpOworCQkJCQkJLy8gSXMgdGhpcyBhIGRpc2Vhc2UgbGFiZWw/CisJCQkJCQlpZiAobm9kZUxhYmVsIGluc3RhbmNlb2YgRGlzZWFzZU1vZGVsTGFiZWwpIHsKKwkJCQkJCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTW9kZWxMYWJlbCA9IChEaXNlYXNlTW9kZWxMYWJlbCkgbm9kZUxhYmVsOworCQkJCQkJCS8vIFllcworCQkJCQkJCS8vIElzIGl0IHVwZGF0ZWQgYnkgdGhpcyBkaXNlYXNlIG1vZGVsPworCQkJCQkJCWlmIChkaXNlYXNlTW9kZWxMYWJlbC5nZXREZWNvcmF0b3IoKSA9PSBkaXNlYXNlTW9kZWwgJiYKKwkJCQkJCQkJCWRpc2Vhc2VNb2RlbExhYmVsLmdldFBvcHVsYXRpb25Nb2RlbExhYmVsKCkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKS5lcXVhbHMoZGlzZWFzZU1vZGVsLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkpKSB7CisJCQkJCQkJCS8vIFllcworCQkJCQkJCQlkb0luaXRpYWxpemF0aW9uKGRpc2Vhc2VNb2RlbExhYmVsKTsKKwkJCQkJCQkJZ2V0TGFiZWxzVG9JbmZlY3QoKS5hZGQoZGlzZWFzZU1vZGVsTGFiZWwpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9IC8vIGlmCisJCQkJCQl9CisJCQkJCX0gLy8gZm9yCisJCQkJfSAvLyBpZiBub2RlIHRvIGluZmVjdCB3YXMgZm91bmTvv70KKwkJCQllbHNlIHsKKwkJCQkJLy8gTm8KKwkJCQkJLy8gVGhlIHRhcmdldCBVUkkgd2FzIHByb2JhYmx5IGJhZAorCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlRoZSBub2RlIHRvIGluZmVjdCBzcGVjaWZpZWQgYnkgdGhlIFVSSSBcIiIKKwkJCQkJCQkrIGdldFRhcmdldFVSSSgpCisJCQkJCQkJKyAiXCIgd2FzIG5vdCBmb3VuZC4gIFRoZSBVUkkgaXMgbGlrZWx5IGluY29ycmVjdC4iLAorCQkJCQkJCW51bGwpOworCQkJCX0gLy8gZWxzZSBub2RlIG5vdCBmb3VuZAorCQkJfS8vIGFsbCBOT0RFUworCQkJCisJCX0gLy8gaWYgZGlzZWFzZSBtb2RlbCBmb3VuZAorCQllbHNlIHsKKwkJCS8vIE5vCisJCQkvLyBUaGUgZGlzZWFzZSBuYW1lIHdhcyBwcm9iYWJseSB3cm9uZworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJUaGUgZGlzZWFzZSBuYW1lZCBcIiIgKyBkaXNlYXNlTmFtZQorCQkJCQkrICJcIiB3YXMgbm90IGZvdW5kLiIsIG51bGwpOworCQl9IC8vIGVsc2Ugbm9kZSBub3QgZm91bmQKKworCQl0aGlzLnNldFByb2dyZXNzKDEuMCk7IC8vIHdlJ3JlIGRvbmUKKwkJcmV0dXJuIHRydWU7CisJfSAvLyBkZWNvcmF0ZUdyYXBoCisKKwkvKioKKwkgKiBAcGFyYW0gZGlzZWFzZU1vZGVsTGFiZWwKKwkgKiAgICAgICAgICAgIHRoZSBkaXNlYXNlIG1vZGVsIGxhYmVsIHRvIGhhdmUgaXRzIGluZmVjdGlvdXMgdmFsdWUKKwkgKiAgICAgICAgICAgIGluaXRpYWxpemVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZG9Jbml0aWFsaXphdGlvbihmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTW9kZWxMYWJlbCkgeworCQkvLyBUaGUgZGlzZWFzZSBtb2RlbCBpbiBxdWVzdGlvbiBtdXN0IGhhdmUgYW4gUiBzdGF0ZQorCQkvLyBpZiBpdCBpcyBub3Qgc29tZSB0eXBlIG9mIFNJUiBtb2RlbCB0aGVuIHdlIGNhbiBub3QgaW5vY3VsYXRlCisJCWlmKGRpc2Vhc2VNb2RlbExhYmVsIGluc3RhbmNlb2YgU0lSTGFiZWwgfHwKKwkJCQlkaXNlYXNlTW9kZWxMYWJlbCBpbnN0YW5jZW9mIFNFSVJMYWJlbCkgeworLy8JCQlkb3VibGUgY3VycmVudFBvcHVsYXRpb24gPSBkaXNlYXNlTW9kZWxMYWJlbC5nZXRQb3B1bGF0aW9uTGFiZWwoKS5nZXRDdXJyZW50UG9wdWxhdGlvblZhbHVlKCkuZ2V0Q291bnQoKTsKKwkJCVNJUkxhYmVsVmFsdWUgc2lyVmFsdWUgPSBudWxsOworCQkJSW50ZWdyYXRpb25MYWJlbCBpTGFiZWwgPSBudWxsOworCQkJaWYoZGlzZWFzZU1vZGVsTGFiZWwgaW5zdGFuY2VvZiBTSVJMYWJlbCkgeworCQkJCWlMYWJlbCA9IChTSVJMYWJlbCkgZGlzZWFzZU1vZGVsTGFiZWw7CisJCQkJc2lyVmFsdWUgPSAoU0lSTGFiZWxWYWx1ZSlpTGFiZWwuZ2V0Q3VycmVudFZhbHVlKCk7CisJCQl9IGVsc2UgaWYoZGlzZWFzZU1vZGVsTGFiZWwgaW5zdGFuY2VvZiBTRUlSTGFiZWwpIHsKKwkJCQlpTGFiZWwgPSAoU0VJUkxhYmVsKSBkaXNlYXNlTW9kZWxMYWJlbDsKKwkJCQlzaXJWYWx1ZSA9IChTSVJMYWJlbFZhbHVlKWlMYWJlbC5nZXRDdXJyZW50VmFsdWUoKTsKKwkJCX0gZWxzZSB7CisJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJTSVJJbm9jdWxhdG9ySW1wbDogVW5rbm93biBvciBpbnZhbGlkIGRpc2Vhc2UgbW9kZWwgY2xhc3MgZm9yIGlubm9jdWxhdGlvbi4gQ2xhc3NOYW1lPSAiK2Rpc2Vhc2VNb2RlbExhYmVsLmdldENsYXNzKCkuZ2V0TmFtZSgpLG51bGwpOworCQkJfQorCQkKKwkJCWRvdWJsZSBjdXJyZW50U1ZhbHVlID0gc2lyVmFsdWUuZ2V0UygpOworCQkJZG91YmxlIGN1cnJlbnRQb3AgPSBzaXJWYWx1ZS5nZXRQb3B1bGF0aW9uQ291bnQoKTsKKwkJCQorCQkJZG91YmxlIHRyZWF0ZWQgPSBnZXRJbm9jdWxhdGVkUGVyY2VudGFnZSgpOworCQkKKwkJCWlmKGlzSW5vY3VsYXRlUGVyY2VudGFnZSgpICYmIHRyZWF0ZWQgPiAxMDAuMCkgeworCQkJCUFjdGl2YXRvci5sb2dFcnJvcigiSW5vY3VsYXRlZCBQZXJjZW50YWdlIG11c3QgYmUgPD0gMTAwJS4gV2FzICIrdHJlYXRlZCsiIE5vdyByZXNldHRpbmcgdG8gMTAwJSIsbnVsbCk7CisJCQkJdHJlYXRlZCA9IDEwMC4wOworCQkJfQorCQkJCisJCQlkb3VibGUgaW5vY3VsYXRlZE51bWJlciA9IDA7CisJCQlpZihpc0lub2N1bGF0ZVBlcmNlbnRhZ2UoKSkKKwkJCQlpbm9jdWxhdGVkTnVtYmVyID0gY3VycmVudFBvcCoodHJlYXRlZC8xMDAuMCk7CisJCQllbHNlIGlub2N1bGF0ZWROdW1iZXIgPSB0cmVhdGVkOworCQkJaWYoaW5vY3VsYXRlZE51bWJlciA+IGN1cnJlbnRTVmFsdWUpIGlub2N1bGF0ZWROdW1iZXIgPSBjdXJyZW50U1ZhbHVlOworCQkJCisJCQlkb3VibGUgbmV3U1ZhbHVlID0gY3VycmVudFNWYWx1ZSAtIGlub2N1bGF0ZWROdW1iZXI7CisJCQkvLyBjaGVjayBmb3Igcm91bmQgb2ZmIGVycm9ycworCQkJbmV3U1ZhbHVlID0gbmV3U1ZhbHVlIDwgMCA/IDAgOiBuZXdTVmFsdWU7CisJCQlpbm9jdWxhdGVkTnVtYmVyID0gaW5vY3VsYXRlZE51bWJlciA8IDAgPyAwIDogaW5vY3VsYXRlZE51bWJlcjsKKwkJCQorCQkJZmluYWwgZG91YmxlIG5ld1JWYWx1ZSA9IHNpclZhbHVlLmdldFIoKSArIGlub2N1bGF0ZWROdW1iZXI7CisJCQkKKwkJICAgICgoU0lSTGFiZWxWYWx1ZSlpTGFiZWwuZ2V0Q3VycmVudFZhbHVlKCkpLnNldFMobmV3U1ZhbHVlKTsKKwkJCSgoU0lSTGFiZWxWYWx1ZSlpTGFiZWwuZ2V0TmV4dFZhbHVlKCkpLnNldFMobmV3U1ZhbHVlKTsKKwkJCQorCQkJKChTSVJMYWJlbFZhbHVlKWlMYWJlbC5nZXRDdXJyZW50VmFsdWUoKSkuc2V0UihuZXdSVmFsdWUpOworCQkJKChTSVJMYWJlbFZhbHVlKWlMYWJlbC5nZXROZXh0VmFsdWUoKSkuc2V0UihuZXdSVmFsdWUpOworCQkJCisJCX1lbHNlIHsKKwkJCS8vIGxvZyBlcnJvcgorCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJDYW4gbm90IElub2N1bGF0ZWQgYW4gU0kgZGllc2FzZSBtb2RlbC4gRGlzZWFzZSBNb2RlbCBtdXN0IGJlIFNJUi4gQ2hlY2sgY29tcGF0aWJpbGl0eSBvZiBJbm5vY3VsYW9yIGZvciBEaXNlYXNlIE1vZGVsIEluIHNjZW5hcmlvICIsbnVsbCk7CisJCX0KKwkKKwl9IC8vIGRvSW5pdGlhbGl6YXRpb24KKwkKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TSVJfSU5PQ1VMQVRPUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldElub2N1bGF0ZWRQZXJjZW50YWdlKCkgeworCQlyZXR1cm4gaW5vY3VsYXRlZFBlcmNlbnRhZ2U7CisJfQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbm9jdWxhdGVkUGVyY2VudGFnZShkb3VibGUgbmV3SW5vY3VsYXRlZFBlcmNlbnRhZ2UpIHsKKwkJZG91YmxlIG9sZElub2N1bGF0ZWRQZXJjZW50YWdlID0gaW5vY3VsYXRlZFBlcmNlbnRhZ2U7CisJCWlub2N1bGF0ZWRQZXJjZW50YWdlID0gbmV3SW5vY3VsYXRlZFBlcmNlbnRhZ2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5TSVJfSU5PQ1VMQVRPUl9fSU5PQ1VMQVRFRF9QRVJDRU5UQUdFLCBvbGRJbm9jdWxhdGVkUGVyY2VudGFnZSwgaW5vY3VsYXRlZFBlcmNlbnRhZ2UpKTsKKwl9CisKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzSW5vY3VsYXRlUGVyY2VudGFnZSgpIHsKKwkJcmV0dXJuIGlub2N1bGF0ZVBlcmNlbnRhZ2U7CisJfQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbm9jdWxhdGVQZXJjZW50YWdlKGJvb2xlYW4gbmV3SW5vY3VsYXRlUGVyY2VudGFnZSkgeworCQlib29sZWFuIG9sZElub2N1bGF0ZVBlcmNlbnRhZ2UgPSBpbm9jdWxhdGVQZXJjZW50YWdlOworCQlpbm9jdWxhdGVQZXJjZW50YWdlID0gbmV3SW5vY3VsYXRlUGVyY2VudGFnZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNJUl9JTk9DVUxBVE9SX19JTk9DVUxBVEVfUEVSQ0VOVEFHRSwgb2xkSW5vY3VsYXRlUGVyY2VudGFnZSwgaW5vY3VsYXRlUGVyY2VudGFnZSkpOworCX0KKworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lSX0lOT0NVTEFUT1JfX0lOT0NVTEFURURfUEVSQ0VOVEFHRToKKwkJCQlyZXR1cm4gZ2V0SW5vY3VsYXRlZFBlcmNlbnRhZ2UoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJUl9JTk9DVUxBVE9SX19JTk9DVUxBVEVfUEVSQ0VOVEFHRToKKwkJCQlyZXR1cm4gaXNJbm9jdWxhdGVQZXJjZW50YWdlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJUl9JTk9DVUxBVE9SX19JTk9DVUxBVEVEX1BFUkNFTlRBR0U6CisJCQkJc2V0SW5vY3VsYXRlZFBlcmNlbnRhZ2UoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lSX0lOT0NVTEFUT1JfX0lOT0NVTEFURV9QRVJDRU5UQUdFOgorCQkJCXNldElub2N1bGF0ZVBlcmNlbnRhZ2UoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSVJfSU5PQ1VMQVRPUl9fSU5PQ1VMQVRFRF9QRVJDRU5UQUdFOgorCQkJCXNldElub2N1bGF0ZWRQZXJjZW50YWdlKElOT0NVTEFURURfUEVSQ0VOVEFHRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lSX0lOT0NVTEFUT1JfX0lOT0NVTEFURV9QRVJDRU5UQUdFOgorCQkJCXNldElub2N1bGF0ZVBlcmNlbnRhZ2UoSU5PQ1VMQVRFX1BFUkNFTlRBR0VfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lSX0lOT0NVTEFUT1JfX0lOT0NVTEFURURfUEVSQ0VOVEFHRToKKwkJCQlyZXR1cm4gaW5vY3VsYXRlZFBlcmNlbnRhZ2UgIT0gSU5PQ1VMQVRFRF9QRVJDRU5UQUdFX0VERUZBVUxUOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lSX0lOT0NVTEFUT1JfX0lOT0NVTEFURV9QRVJDRU5UQUdFOgorCQkJCXJldHVybiBpbm9jdWxhdGVQZXJjZW50YWdlICE9IElOT0NVTEFURV9QRVJDRU5UQUdFX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoaW5vY3VsYXRlZFBlcmNlbnRhZ2U6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaW5vY3VsYXRlZFBlcmNlbnRhZ2UpOworCQlyZXN1bHQuYXBwZW5kKCIsIGlub2N1bGF0ZVBlcmNlbnRhZ2U6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaW5vY3VsYXRlUGVyY2VudGFnZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1NJUklub2N1bGF0b3JJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1NJUkxhYmVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TSVJMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDFjMmYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TSVJMYWJlbEltcGwuamF2YQpAQCAtMCwwICsxLDU0OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlNpbXBsZURhdGFFeGNoYW5nZUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U0lSIExhYmVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJMYWJlbEltcGwjZ2V0RGVsdGFWYWx1ZSA8ZW0+RGVsdGEgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJUkxhYmVsSW1wbCNnZXRQcm9iZVZhbHVlIDxlbT5Qcm9iZSBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lSTGFiZWxJbXBsI2dldFRlbXBWYWx1ZSA8ZW0+VGVtcCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lSTGFiZWxJbXBsI2dldE9yaWdpbmFsVmFsdWUgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJMYWJlbEltcGwjZ2V0RXJyb3JTY2FsZSA8ZW0+RXJyb3IgU2NhbGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTSVJMYWJlbEltcGwgZXh0ZW5kcyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsSW1wbCBpbXBsZW1lbnRzIFNJUkxhYmVsIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWx0YVZhbHVlKCkgPGVtPkRlbHRhIFZhbHVlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZWx0YVZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU0lSTGFiZWxWYWx1ZSBkZWx0YVZhbHVlOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2JlVmFsdWUoKSA8ZW0+UHJvYmUgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFByb2JlVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTSVJMYWJlbFZhbHVlIHByb2JlVmFsdWU7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGVtcFZhbHVlKCkgPGVtPlRlbXAgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRlbXBWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFNJUkxhYmVsVmFsdWUgdGVtcFZhbHVlOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yaWdpbmFsVmFsdWUoKSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9yaWdpbmFsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTSVJMYWJlbFZhbHVlIG9yaWdpbmFsVmFsdWU7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXJyb3JTY2FsZSgpIDxlbT5FcnJvciBTY2FsZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RXJyb3JTY2FsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFNJUkxhYmVsVmFsdWUgZXJyb3JTY2FsZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIFNJUkxhYmVsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwkJc2V0Q3VycmVudFZhbHVlKFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0lSTGFiZWxWYWx1ZSgpKTsKKwkJc2V0TmV4dFZhbHVlKFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0lSTGFiZWxWYWx1ZSgpKTsKKwkJc2V0T3JpZ2luYWxWYWx1ZShTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNJUkxhYmVsVmFsdWUoKSk7CisJCXNldFRlbXBWYWx1ZShTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNJUkxhYmVsVmFsdWUoKSk7CisJCXNldFByb2JlVmFsdWUoU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTSVJMYWJlbFZhbHVlKCkpOworCQlzZXRFcnJvclNjYWxlKFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0lSTGFiZWxWYWx1ZSgpKTsKKwkJc2V0RGVsdGFWYWx1ZShTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNJUkxhYmVsVmFsdWUoKSk7CisJfSAvLyBTSVJMYWJlbEltcGwKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TSVJfTEFCRUw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJUkxhYmVsVmFsdWUgZ2V0RGVsdGFWYWx1ZSgpIHsKKwkJaWYgKGRlbHRhVmFsdWUgIT0gbnVsbCAmJiBkZWx0YVZhbHVlLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGREZWx0YVZhbHVlID0gKEludGVybmFsRU9iamVjdClkZWx0YVZhbHVlOworCQkJZGVsdGFWYWx1ZSA9IChTSVJMYWJlbFZhbHVlKWVSZXNvbHZlUHJveHkob2xkRGVsdGFWYWx1ZSk7CisJCQlpZiAoZGVsdGFWYWx1ZSAhPSBvbGREZWx0YVZhbHVlKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgU3RhbmRhcmRQYWNrYWdlLlNJUl9MQUJFTF9fREVMVEFfVkFMVUUsIG9sZERlbHRhVmFsdWUsIGRlbHRhVmFsdWUpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZGVsdGFWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU0lSTGFiZWxWYWx1ZSBiYXNpY0dldERlbHRhVmFsdWUoKSB7CisJCXJldHVybiBkZWx0YVZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlbHRhVmFsdWUoU0lSTGFiZWxWYWx1ZSBuZXdEZWx0YVZhbHVlKSB7CisJCVNJUkxhYmVsVmFsdWUgb2xkRGVsdGFWYWx1ZSA9IGRlbHRhVmFsdWU7CisJCWRlbHRhVmFsdWUgPSBuZXdEZWx0YVZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU0lSX0xBQkVMX19ERUxUQV9WQUxVRSwgb2xkRGVsdGFWYWx1ZSwgZGVsdGFWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTSVJMYWJlbFZhbHVlIGdldFByb2JlVmFsdWUoKSB7CisJCWlmIChwcm9iZVZhbHVlICE9IG51bGwgJiYgcHJvYmVWYWx1ZS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJvYmVWYWx1ZSA9IChJbnRlcm5hbEVPYmplY3QpcHJvYmVWYWx1ZTsKKwkJCXByb2JlVmFsdWUgPSAoU0lSTGFiZWxWYWx1ZSllUmVzb2x2ZVByb3h5KG9sZFByb2JlVmFsdWUpOworCQkJaWYgKHByb2JlVmFsdWUgIT0gb2xkUHJvYmVWYWx1ZSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFN0YW5kYXJkUGFja2FnZS5TSVJfTEFCRUxfX1BST0JFX1ZBTFVFLCBvbGRQcm9iZVZhbHVlLCBwcm9iZVZhbHVlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHByb2JlVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJUkxhYmVsVmFsdWUgYmFzaWNHZXRQcm9iZVZhbHVlKCkgeworCQlyZXR1cm4gcHJvYmVWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcm9iZVZhbHVlKFNJUkxhYmVsVmFsdWUgbmV3UHJvYmVWYWx1ZSkgeworCQlTSVJMYWJlbFZhbHVlIG9sZFByb2JlVmFsdWUgPSBwcm9iZVZhbHVlOworCQlwcm9iZVZhbHVlID0gbmV3UHJvYmVWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNJUl9MQUJFTF9fUFJPQkVfVkFMVUUsIG9sZFByb2JlVmFsdWUsIHByb2JlVmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU0lSTGFiZWxWYWx1ZSBnZXRUZW1wVmFsdWUoKSB7CisJCWlmICh0ZW1wVmFsdWUgIT0gbnVsbCAmJiB0ZW1wVmFsdWUuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFRlbXBWYWx1ZSA9IChJbnRlcm5hbEVPYmplY3QpdGVtcFZhbHVlOworCQkJdGVtcFZhbHVlID0gKFNJUkxhYmVsVmFsdWUpZVJlc29sdmVQcm94eShvbGRUZW1wVmFsdWUpOworCQkJaWYgKHRlbXBWYWx1ZSAhPSBvbGRUZW1wVmFsdWUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTdGFuZGFyZFBhY2thZ2UuU0lSX0xBQkVMX19URU1QX1ZBTFVFLCBvbGRUZW1wVmFsdWUsIHRlbXBWYWx1ZSkpOworCQkJfQorCQl9CisJCXJldHVybiB0ZW1wVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJUkxhYmVsVmFsdWUgYmFzaWNHZXRUZW1wVmFsdWUoKSB7CisJCXJldHVybiB0ZW1wVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VGVtcFZhbHVlKFNJUkxhYmVsVmFsdWUgbmV3VGVtcFZhbHVlKSB7CisJCVNJUkxhYmVsVmFsdWUgb2xkVGVtcFZhbHVlID0gdGVtcFZhbHVlOworCQl0ZW1wVmFsdWUgPSBuZXdUZW1wVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5TSVJfTEFCRUxfX1RFTVBfVkFMVUUsIG9sZFRlbXBWYWx1ZSwgdGVtcFZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJUkxhYmVsVmFsdWUgZ2V0T3JpZ2luYWxWYWx1ZSgpIHsKKwkJaWYgKG9yaWdpbmFsVmFsdWUgIT0gbnVsbCAmJiBvcmlnaW5hbFZhbHVlLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRPcmlnaW5hbFZhbHVlID0gKEludGVybmFsRU9iamVjdClvcmlnaW5hbFZhbHVlOworCQkJb3JpZ2luYWxWYWx1ZSA9IChTSVJMYWJlbFZhbHVlKWVSZXNvbHZlUHJveHkob2xkT3JpZ2luYWxWYWx1ZSk7CisJCQlpZiAob3JpZ2luYWxWYWx1ZSAhPSBvbGRPcmlnaW5hbFZhbHVlKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgU3RhbmRhcmRQYWNrYWdlLlNJUl9MQUJFTF9fT1JJR0lOQUxfVkFMVUUsIG9sZE9yaWdpbmFsVmFsdWUsIG9yaWdpbmFsVmFsdWUpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gb3JpZ2luYWxWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU0lSTGFiZWxWYWx1ZSBiYXNpY0dldE9yaWdpbmFsVmFsdWUoKSB7CisJCXJldHVybiBvcmlnaW5hbFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE9yaWdpbmFsVmFsdWUoU0lSTGFiZWxWYWx1ZSBuZXdPcmlnaW5hbFZhbHVlKSB7CisJCVNJUkxhYmVsVmFsdWUgb2xkT3JpZ2luYWxWYWx1ZSA9IG9yaWdpbmFsVmFsdWU7CisJCW9yaWdpbmFsVmFsdWUgPSBuZXdPcmlnaW5hbFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU0lSX0xBQkVMX19PUklHSU5BTF9WQUxVRSwgb2xkT3JpZ2luYWxWYWx1ZSwgb3JpZ2luYWxWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTSVJMYWJlbFZhbHVlIGdldEVycm9yU2NhbGUoKSB7CisJCWlmIChlcnJvclNjYWxlICE9IG51bGwgJiYgZXJyb3JTY2FsZS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkRXJyb3JTY2FsZSA9IChJbnRlcm5hbEVPYmplY3QpZXJyb3JTY2FsZTsKKwkJCWVycm9yU2NhbGUgPSAoU0lSTGFiZWxWYWx1ZSllUmVzb2x2ZVByb3h5KG9sZEVycm9yU2NhbGUpOworCQkJaWYgKGVycm9yU2NhbGUgIT0gb2xkRXJyb3JTY2FsZSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFN0YW5kYXJkUGFja2FnZS5TSVJfTEFCRUxfX0VSUk9SX1NDQUxFLCBvbGRFcnJvclNjYWxlLCBlcnJvclNjYWxlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGVycm9yU2NhbGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJUkxhYmVsVmFsdWUgYmFzaWNHZXRFcnJvclNjYWxlKCkgeworCQlyZXR1cm4gZXJyb3JTY2FsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFcnJvclNjYWxlKFNJUkxhYmVsVmFsdWUgbmV3RXJyb3JTY2FsZSkgeworCQlTSVJMYWJlbFZhbHVlIG9sZEVycm9yU2NhbGUgPSBlcnJvclNjYWxlOworCQllcnJvclNjYWxlID0gbmV3RXJyb3JTY2FsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNJUl9MQUJFTF9fRVJST1JfU0NBTEUsIG9sZEVycm9yU2NhbGUsIGVycm9yU2NhbGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBTSVJMYWJlbFZhbHVlIGdldE5leHRTSVJWYWx1ZSgpIHsKKwkJcmV0dXJuIChTSVJMYWJlbFZhbHVlKSBnZXROZXh0VmFsdWUoKTsKKwl9IC8vIGdldE5leHRTSVJWYWx1ZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgU0lSTGFiZWxWYWx1ZSBnZXRDdXJyZW50U0lSVmFsdWUoKSB7CisJCXJldHVybiAoU0lSTGFiZWxWYWx1ZSkgZ2V0Q3VycmVudFZhbHVlKCk7CisJfSAvLyBnZXRDdXJyZW50U0lSVmFsdWUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsI2dldFIoKQorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0UigpIHsKKwkJcmV0dXJuIGdldEN1cnJlbnRTSVJWYWx1ZSgpLmdldFIoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbCNzZXRSKGRvdWJsZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSKGRvdWJsZSByKSB7CisJCWdldEN1cnJlbnRTSVJWYWx1ZSgpLnNldFIocik7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWwjZ2V0TmV4dFIoKQorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0TmV4dFIoKSB7CisJCXJldHVybiBnZXROZXh0U0lSVmFsdWUoKS5nZXRSKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWwjc2V0TmV4dFIoZG91YmxlKQorCSAqLworCXB1YmxpYyB2b2lkIHNldE5leHRSKGRvdWJsZSByKSB7CisJCWdldE5leHRTSVJWYWx1ZSgpLnNldFIocik7CisJfSAvLyBzZXROZXh0UgorCisJLyoqCisJICogQHJldHVybiBzZXQgdGhlIG51bWJlciBudW1iZXIgb2YgaW5mZWN0aW91cyBwb3B1bGF0aW9uIG1lbWJlcnMKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROZXh0SShkb3VibGUgaSkgeworCQkoKFNJTGFiZWxWYWx1ZSlnZXROZXh0VmFsdWUoKSkuc2V0SShpKTsKKwl9CisKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsI2dldEkoKQorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0SSgpIHsKKwkJcmV0dXJuIGdldEN1cnJlbnRTSVJWYWx1ZSgpLmdldEkoKTsKKwl9IC8vIGdldEkKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWwjc2V0SSgpCisJICovCisJcHVibGljIHZvaWQgc2V0SShkb3VibGUgaSkgeworCQlnZXRDdXJyZW50U0lSVmFsdWUoKS5zZXRJKGkpOworCX0gLy8gZ2V0SQorCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbCNnZXROZXh0SSgpCisJICovCisJcHVibGljIGRvdWJsZSBnZXROZXh0SSgpIHsKKwkJcmV0dXJuIGdldE5leHRTSVJWYWx1ZSgpLmdldEkoKTsKKwl9IC8vIGdldE5leHRJCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogQHBhcmFtIHJlc29sdmUKKwkgKiBAcGFyYW0gY29yZVR5cGUKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJUl9MQUJFTF9fREVMVEFfVkFMVUU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXREZWx0YVZhbHVlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0RGVsdGFWYWx1ZSgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lSX0xBQkVMX19QUk9CRV9WQUxVRToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFByb2JlVmFsdWUoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRQcm9iZVZhbHVlKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSVJfTEFCRUxfX1RFTVBfVkFMVUU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRUZW1wVmFsdWUoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRUZW1wVmFsdWUoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJUl9MQUJFTF9fT1JJR0lOQUxfVkFMVUU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRPcmlnaW5hbFZhbHVlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0T3JpZ2luYWxWYWx1ZSgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lSX0xBQkVMX19FUlJPUl9TQ0FMRToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVycm9yU2NhbGUoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRFcnJvclNjYWxlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJUl9MQUJFTF9fREVMVEFfVkFMVUU6CisJCQkJc2V0RGVsdGFWYWx1ZSgoU0lSTGFiZWxWYWx1ZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lSX0xBQkVMX19QUk9CRV9WQUxVRToKKwkJCQlzZXRQcm9iZVZhbHVlKChTSVJMYWJlbFZhbHVlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSVJfTEFCRUxfX1RFTVBfVkFMVUU6CisJCQkJc2V0VGVtcFZhbHVlKChTSVJMYWJlbFZhbHVlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSVJfTEFCRUxfX09SSUdJTkFMX1ZBTFVFOgorCQkJCXNldE9yaWdpbmFsVmFsdWUoKFNJUkxhYmVsVmFsdWUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJUl9MQUJFTF9fRVJST1JfU0NBTEU6CisJCQkJc2V0RXJyb3JTY2FsZSgoU0lSTGFiZWxWYWx1ZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJUl9MQUJFTF9fREVMVEFfVkFMVUU6CisJCQkJc2V0RGVsdGFWYWx1ZSgoU0lSTGFiZWxWYWx1ZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSVJfTEFCRUxfX1BST0JFX1ZBTFVFOgorCQkJCXNldFByb2JlVmFsdWUoKFNJUkxhYmVsVmFsdWUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lSX0xBQkVMX19URU1QX1ZBTFVFOgorCQkJCXNldFRlbXBWYWx1ZSgoU0lSTGFiZWxWYWx1ZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSVJfTEFCRUxfX09SSUdJTkFMX1ZBTFVFOgorCQkJCXNldE9yaWdpbmFsVmFsdWUoKFNJUkxhYmVsVmFsdWUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lSX0xBQkVMX19FUlJPUl9TQ0FMRToKKwkJCQlzZXRFcnJvclNjYWxlKChTSVJMYWJlbFZhbHVlKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSVJfTEFCRUxfX0RFTFRBX1ZBTFVFOgorCQkJCXJldHVybiBkZWx0YVZhbHVlICE9IG51bGw7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSVJfTEFCRUxfX1BST0JFX1ZBTFVFOgorCQkJCXJldHVybiBwcm9iZVZhbHVlICE9IG51bGw7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSVJfTEFCRUxfX1RFTVBfVkFMVUU6CisJCQkJcmV0dXJuIHRlbXBWYWx1ZSAhPSBudWxsOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lSX0xBQkVMX19PUklHSU5BTF9WQUxVRToKKwkJCQlyZXR1cm4gb3JpZ2luYWxWYWx1ZSAhPSBudWxsOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lSX0xBQkVMX19FUlJPUl9TQ0FMRToKKwkJCQlyZXR1cm4gZXJyb3JTY2FsZSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZXNldChTVEVNVGltZSB0aW1lKSB7CisJCS8vIEFkanVzdCBjdXJyZW50IHZhbHVlIGJ5IGFkZGluZy9zdWJzdHJhY3RpbmcgZGVsdGFzIGJ5IG90aGVyIG1vZGVscyAocG9wdWxhdGlvbiBtb2RlbHMpLgorCQkvLyBXZSBkbyB0aGlzIHRvIHNldCB0aGUgcmlnaHQgY291bnRzIHRvIG1hdGNoIHRoZSBwb3B1bGF0aW9uIG51bWJlcnMgYXQgdGhlIGJlZ2lubmluZworCQkvLyBvZiB0aGUgc2ltdWxhdGlvbi4KKwkJCisJCWZvcihMYWJlbCBsOnRoaXMuZ2V0Tm9kZSgpLmdldExhYmVscygpKSB7CisJCQlpZihsIGluc3RhbmNlb2YgSW50ZWdyYXRpb25MYWJlbCkgeworCQkJCUludGVncmF0aW9uTGFiZWwgaWwgPSAoSW50ZWdyYXRpb25MYWJlbClsOworCQkJCWlmKGwgPT0gdGhpcykgY29udGludWU7CisJCQkJU2ltcGxlRGF0YUV4Y2hhbmdlTGFiZWxWYWx1ZSBkZWx0YSA9IChTaW1wbGVEYXRhRXhjaGFuZ2VMYWJlbFZhbHVlKWlsLmdldERlbHRhVmFsdWUoKTsKKwkJCQkKKwkJCQlNYXA8Tm9kZSwgRG91YmxlPiBhcnJpdmFscyA9IGRlbHRhLmdldEFycml2YWxzKCk7CisJCQkJTWFwPE5vZGUsIERvdWJsZT4gZGVwYXJ0dXJlcyA9IGRlbHRhLmdldERlcGFydHVyZXMoKTsKKwkJCQkKKwkJCQkvLyBXZSBzY2FsZSB0aGUgbGFiZWwgdmFsdWVzIGJhY2sgc2luY2UgYXQgdGhpcyBwb2ludCB0aGUgaW5ub2N1bGF0b3JzL2luZmVjdG9ycworCQkJCS8vIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgYW5kIHdlIG5lZWQgdG8gbW9kaWZ5IGFsbCBzdGF0ZXMgb2YgdGhlIGRpc2Vhc2UKKwkJCQkKKwkJCQlkb3VibGUgcG9wQ291bnQgPSAoKFNJTGFiZWxWYWx1ZSl0aGlzLmdldEN1cnJlbnRWYWx1ZSgpKS5nZXRQb3B1bGF0aW9uQ291bnQoKTsKKwkJCQlpZihhcnJpdmFscyAhPSBudWxsICYmIGFycml2YWxzLnNpemUoKSA9PSAxKSB7CisJCQkJCU5vZGUgbiA9IGFycml2YWxzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOworCQkJCQlhc3NlcnQobi5lcXVhbHMoZ2V0Tm9kZSgpKSk7CisJCQkJCWRvdWJsZSBmYWN0b3IgPSBhcnJpdmFscy5nZXQobikgLyBwb3BDb3VudDsKKwkJCQkJaWYoRG91YmxlLmlzTmFOKGZhY3RvcikgfHwgRG91YmxlLmlzSW5maW5pdGUoZmFjdG9yKSkgZmFjdG9yID0gMC4wOy8vIGRvIG5vdGhpbmcKKwkJCQkJU0lMYWJlbFZhbHVlIGFkZFYgPSAoU0lMYWJlbFZhbHVlKUVjb3JlVXRpbC5jb3B5KHRoaXMuZ2V0Q3VycmVudFZhbHVlKCkpOworCQkJCQlhZGRWLnNjYWxlKGZhY3Rvcik7CisJCQkJCSgoU0lMYWJlbFZhbHVlKXRoaXMuZ2V0Q3VycmVudFZhbHVlKCkpLmFkZCgoSW50ZWdyYXRpb25MYWJlbFZhbHVlKWFkZFYpOworCQkJCX0KKwkJCQlpZihkZXBhcnR1cmVzICE9IG51bGwgJiYgZGVwYXJ0dXJlcy5zaXplKCkgPT0gMSkgeworCQkJCQlOb2RlIG4gPSBkZXBhcnR1cmVzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOworCQkJCQlhc3NlcnQobi5lcXVhbHMoZ2V0Tm9kZSgpKSk7CisJCQkJCWRvdWJsZSBmYWN0b3IgPSBkZXBhcnR1cmVzLmdldChuKSAvIHBvcENvdW50OworCQkJCQlpZihEb3VibGUuaXNOYU4oZmFjdG9yKSB8fCBEb3VibGUuaXNJbmZpbml0ZShmYWN0b3IpKSBmYWN0b3IgPSAwLjA7Ly8gZG8gbm90aGluZworCQkJCQlTSUxhYmVsVmFsdWUgc3ViViA9IChTSUxhYmVsVmFsdWUpRWNvcmVVdGlsLmNvcHkodGhpcy5nZXRDdXJyZW50VmFsdWUoKSk7CisJCQkJCXN1YlYuc2NhbGUoZmFjdG9yKTsKKwkJCQkJKChTSUxhYmVsVmFsdWUpdGhpcy5nZXRDdXJyZW50VmFsdWUoKSkuc3ViKChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpc3ViVik7CisJCQkJfQorCQkJCQorCQkJCQkKKwkJCX0KKwkJfQorCX0KKworCQorfSAvLyBTSVJMYWJlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU0lSTGFiZWxWYWx1ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU0lSTGFiZWxWYWx1ZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGM1ODJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TSVJMYWJlbFZhbHVlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNDYxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TSVIgTGFiZWwgVmFsdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJUkxhYmVsVmFsdWVJbXBsI2dldFIgPGVtPlI8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTSVJMYWJlbFZhbHVlSW1wbCBleHRlbmRzIFNJTGFiZWxWYWx1ZUltcGwgaW1wbGVtZW50cworCQlTSVJMYWJlbFZhbHVlIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UigpIDxlbT5SPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjZ2V0UigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgUl9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFIoKSA8ZW0+UjwvZW0+fScgYXR0cmlidXRlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI2dldFIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgciA9IFJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNJUkxhYmVsVmFsdWVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZXMgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisJICogCisJICogQHBhcmFtIHMKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc3VzY2VwdGlibGUgcG9wdWxhdGlvbiBtZW1iZXJzCisJICogCisJICogQHBhcmFtIGlSCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHJlY292ZXJpbmcgaW5mZWN0aW91cyBwb3B1bGF0aW9uIG1lbWJlcnMKKwkgKiAKKwkgKiBAcGFyYW0gaUYKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZmF0YWxseSBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gbWVtYmVycworCSAqICAgICAgICAgICAgCisJICogQHBhcmFtIGluY2lkZW5jZQorCSAqICAgICAgICAgICAgdGhlIG5ldyBpbmNpZGVuY2UgZnJvbSB0aGUgaW50ZXJhY3Rpb24gdGVybSBpbiB0aGUgY29tcGFydG1lbnQgbW9kZWwKKwkgKiAKKwkgKiBAcGFyYW0gcgorCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiByZWNvdmVyZWQgcG9wdWxhdGlvbiBtZW1iZXJzCisJICogQHBhcmFtIGJpcnRocworCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBiaXJ0aHMgdGhhdCBoYXZlIG9jY3VyZWQgaW4gdGhlIHBvcHVsYXRpb24KKwkgKiBAcGFyYW0gZGVhdGhzCisJICogICAgICAgICAgICB0aGUgdG90YWwgbnVtYmVyIG9mIGRlYXRocyB0aGF0IGhhdmUgb2NjdXJlZCBpbiB0aGUgcG9wdWxhdGlvbgorCSAqIEBwYXJhbSBkaXNlYXNlRGVhdGhzCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGRlYXRocyBkdWUgdG8gdGhlIGRpc2Vhc2UgdGhhdCBoYXZlIG9jY3VyZWQgaW4KKwkgKiAgICAgICAgICAgIHRoZSBwb3B1bGF0aW9uCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICovCisJcHVibGljIFNJUkxhYmVsVmFsdWVJbXBsKGZpbmFsIGRvdWJsZSBzLCBmaW5hbCBkb3VibGUgaSwgCisJCQlmaW5hbCBkb3VibGUgaW5jaWRlbmNlLCBmaW5hbCBkb3VibGUgciwKKwkJCWZpbmFsIGRvdWJsZSBkaXNlYXNlRGVhdGhzKSB7CisJCXN1cGVyKHMsIGksIGluY2lkZW5jZSwgZGlzZWFzZURlYXRocyk7CisJCXRoaXMuciA9IHI7CisJfSAvLyBTSVJMYWJlbFZhbHVlSW1wbAorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2VzIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorCSAqIAorCSAqIEBwYXJhbSBzCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHN1c2NlcHRpYmxlIHBvcHVsYXRpb24gbWVtYmVycworCSAqIAorCSAqIEBwYXJhbSBpUgorCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiByZWNvdmVyaW5nIGluZmVjdGlvdXMgcG9wdWxhdGlvbiBtZW1iZXJzCisJICogCisJICogQHBhcmFtIGlGCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGZhdGFsbHkgaW5mZWN0aW91cyBwb3B1bGF0aW9uIG1lbWJlcnMKKwkgKiAgICAgICAgICAgIAorCSAqIEBwYXJhbSByCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHJlY292ZXJlZCBwb3B1bGF0aW9uIG1lbWJlcnMKKwkgKiBAcGFyYW0gYmlydGhzCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJpcnRocyB0aGF0IGhhdmUgb2NjdXJlZCBpbiB0aGUgcG9wdWxhdGlvbgorCSAqIEBwYXJhbSBkZWF0aHMKKwkgKiAgICAgICAgICAgIHRoZSB0b3RhbCBudW1iZXIgb2YgZGVhdGhzIHRoYXQgaGF2ZSBvY2N1cmVkIGluIHRoZSBwb3B1bGF0aW9uCisJICogQHBhcmFtIGRpc2Vhc2VEZWF0aHMKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGVhdGhzIGR1ZSB0byB0aGUgZGlzZWFzZSB0aGF0IGhhdmUgb2NjdXJlZCBpbgorCSAqICAgICAgICAgICAgdGhlIHBvcHVsYXRpb24KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKi8KKwlwdWJsaWMgU0lSTGFiZWxWYWx1ZUltcGwoZmluYWwgZG91YmxlIHMsIGZpbmFsIGRvdWJsZSBpLCAKKwkJCWZpbmFsIGRvdWJsZSByLCAgZmluYWwgZG91YmxlIGRpc2Vhc2VEZWF0aHMpIHsKKwkJc3VwZXIocywgaSwgMC4wLCBkaXNlYXNlRGVhdGhzKTsKKwkJdGhpcy5yID0gcjsKKwl9IC8vIFNJUkxhYmVsVmFsdWVJbXBsCisKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU0lSX0xBQkVMX1ZBTFVFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIEluZmVjdGlvdXMgcG9wdWxhdGlvbiBtZW1iZXJzLgorCSAqIAorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFIoKSB7CisJCXJldHVybiByOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5ld1IKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Uihkb3VibGUgbmV3UikgeworCQlkb3VibGUgb2xkUiA9IHI7CisJCXIgPSBuZXdSOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU0lSX0xBQkVMX1ZBTFVFX19SLCBvbGRSLCByKSk7CisJfQorCisvLwkvKioKKy8vCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisvLwkgKiAKKy8vCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIHdpdGggdGhlIHZhbHVlcyByb3RhdGVkIFMtPlItPkktPlMKKy8vCSAqIAorLy8JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisvLwkgKiBAZ2VuZXJhdGVkIE5PVAorLy8JICovCisvLwlwdWJsaWMgU0lSTGFiZWxWYWx1ZSByb3RhdGVMZWZ0KCkgeworLy8JCWZpbmFsIGRvdWJsZSB0ZW1wUyA9IGdldFMoKTsKKy8vCQlzZXRTKGdldEkoKSk7CisvLwkJc2V0SShnZXRSKCkpOworLy8JCXNldFIodGVtcFMpOworLy8JCXJldHVybiB0aGlzOworLy8JfSAvLyByb3RhdGVMZWZ0CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWVJbXBsI2dldFBvcHVsYXRpb25Db3VudCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGRvdWJsZSBnZXRQb3B1bGF0aW9uQ291bnQoKSB7CisJCXJldHVybiBzdXBlci5nZXRQb3B1bGF0aW9uQ291bnQoKSArIHI7CisJfSAvLyBnZXRQb3B1bGF0aW9uQ291bnQKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHplcm9PdXRQb3B1bGF0aW9uQ291bnQoKSB7CisJCXN1cGVyLnplcm9PdXRQb3B1bGF0aW9uQ291bnQoKTsKKwkJc2V0UihSX0VERUZBVUxUKTsKKwl9IC8vIHplcm9PdXRQb3B1bGF0aW9uQ291bnQKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWVJbXBsI3NldChvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBzZXQoSW50ZWdyYXRpb25MYWJlbFZhbHVlIHZhbHVlKSB7CisJCXN1cGVyLnNldCh2YWx1ZSk7CisJCXNldFIoKChTSVJMYWJlbFZhbHVlKSB2YWx1ZSkuZ2V0UigpKTsKKwkJcmV0dXJuIHRoaXM7CisJfSAvLyBzZXQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUltcGwjYWRkKG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGFkZChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgdmFsdWUpIHsKKwkJc3VwZXIuYWRkKHZhbHVlKTsKKwkJc2V0UihnZXRSKCkgKyAoKFNJUkxhYmVsVmFsdWUpIHZhbHVlKS5nZXRSKCkpOworCQlyZXR1cm4gdGhpczsKKwl9IC8vIGFkZAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbCNzdWIob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgc3ViKEludGVncmF0aW9uTGFiZWxWYWx1ZSB2YWx1ZSkgeworCQlzdXBlci5zdWIodmFsdWUpOworCQlzZXRSKGdldFIoKSAtICgoU0lSTGFiZWxWYWx1ZSkgdmFsdWUpLmdldFIoKSk7CisJCXJldHVybiB0aGlzOworCX0gLy8gc3ViCisJCisJQE92ZXJyaWRlCisJcHVibGljIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgc2NhbGUoZG91YmxlIHNjYWxlRmFjdG9yKSB7CisJCXN1cGVyLnNjYWxlKHNjYWxlRmFjdG9yKTsKKwkJc2V0UihnZXRSKCkgKnNjYWxlRmFjdG9yKTsKKwkJcmV0dXJuIHRoaXM7CisJfSAvLyBzY2FsZQorCQorCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGFkZChkb3VibGUgYWRkaXRpb24pIHsKKwkJc3VwZXIuYWRkKGFkZGl0aW9uKTsKKwkJc2V0UihnZXRSKCkgK2FkZGl0aW9uKTsKKwkJcmV0dXJuIHRoaXM7CisJfSAvLyBzY2FsZQorCisJcHVibGljIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgYWJzKCkgeworCQlzdXBlci5hYnMoKTsKKwkJc2V0UihNYXRoLmFicyhnZXRSKCkpKTsKKwkJcmV0dXJuIHRoaXM7CisJfSAvLyBzY2FsZQorCisKKwkKKwlwdWJsaWMgSW50ZWdyYXRpb25MYWJlbFZhbHVlIGRpdmlkZShJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgZCkgeworCQlTSVJMYWJlbFZhbHVlIF9zY2FsZSA9IChTSVJMYWJlbFZhbHVlKWQ7CisJCWRvdWJsZSBzU2NhbGVkID0gTWF0aC5hYnMocykgLyBNYXRoLmFicyhfc2NhbGUuZ2V0UygpKTsKKwkJZG91YmxlIGlTY2FsZWQgPSBNYXRoLmFicyhpKSAvIE1hdGguYWJzKF9zY2FsZS5nZXRJKCkpOworCQlkb3VibGUgclNjYWxlZCA9IE1hdGguYWJzKHIpIC8gTWF0aC5hYnMoX3NjYWxlLmdldFIoKSk7CisJCWRvdWJsZSBkZFNjYWxlZCA9IE1hdGguYWJzKGRpc2Vhc2VEZWF0aHMpIC8gTWF0aC5hYnMoX3NjYWxlLmdldERpc2Vhc2VEZWF0aHMoKSk7CisJCXNldFMoc1NjYWxlZCk7CisJCXNldEkoaVNjYWxlZCk7CisJCXNldFIoclNjYWxlZCk7CisJCXNldERpc2Vhc2VEZWF0aHMoZGRTY2FsZWQpOworCQlyZXR1cm4gdGhpczsKKwl9CisJCisJcHVibGljIGRvdWJsZSBtYXgoKSB7CisJCWRvdWJsZSBtYXg7CisJCWlmKHMgPiBpICYmIHMgPiByICYmIHMgPiBkaXNlYXNlRGVhdGhzKQorCQkJbWF4ID0gczsKKwkJZWxzZSBpZihpID4gciAmJiBpID4gZGlzZWFzZURlYXRocykgbWF4ID0gaTsKKwkJZWxzZSBpZihyID4gZGlzZWFzZURlYXRocykgbWF4ID0gcjsKKwkJZWxzZSBtYXggPSBkaXNlYXNlRGVhdGhzOworCQlyZXR1cm4gbWF4OyAgCisJfQorCS8qKgorCSAqIEFkanVzdCB3aGVuIGEgZGVsdGEgdmFsdWUgaXMgYmFkLCBlLmcuIGZvcmNlcyB0aGUgCisJICogdGFyZ2V0IHRvIGdvIG5lZ2F0aXZlIGluIGFueSBzdGF0ZS4KKwkgKiAKKwkgKiBAcmV0dXJuIGJvb2xlYW4KKwkgKiBAb3ZlcnJpZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBhZGp1c3REZWx0YShJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgdGFyZ2V0KSB7CisJCVNJUkxhYmVsVmFsdWUgc2lyVmFsdWUgPSAoU0lSTGFiZWxWYWx1ZSl0YXJnZXQ7CisJCWJvb2xlYW4gYWRqdXN0ZWQgPSBmYWxzZTsKKwkJZG91YmxlIG5ld1MgPSB0aGlzLmdldFMoKSArIHNpclZhbHVlLmdldFMoKTsKKwkJZG91YmxlIG5ld0kgPSB0aGlzLmdldEkoKSArIHNpclZhbHVlLmdldEkoKTsKKwkJZG91YmxlIG5ld1IgPSB0aGlzLmdldFIoKSArIHNpclZhbHVlLmdldFIoKTsKKwkJZG91YmxlIG5ld0REID0gdGhpcy5nZXREaXNlYXNlRGVhdGhzKCkgKyBzaXJWYWx1ZS5nZXREaXNlYXNlRGVhdGhzKCk7CisJCQorCQlkb3VibGUgZmFjdG9yID0gMS4wOworCQlpZihuZXdTIDwgbmV3SSAmJiBuZXdTIDwgbmV3UiAmJiBuZXdTIDwgbmV3REQgJiYgbmV3UyA8IDAuMCkgeworCQkJLy8gU2NhbGUgdXNpbmcgUworCQkJYWRqdXN0ZWQgPSB0cnVlOworCQkJZmFjdG9yID0gLXNpclZhbHVlLmdldFMoKS90aGlzLmdldFMoKTsKKwkJfSBlbHNlIGlmKG5ld0kgPCBuZXdSICYmIG5ld0kgPCBuZXdERCAmJiBuZXdJIDwgMC4wKSB7CisJCQkvLyBTY2FsZSB1c2luZyBJCisJCQlhZGp1c3RlZCA9IHRydWU7CisJCQlmYWN0b3IgPSAtc2lyVmFsdWUuZ2V0SSgpL3RoaXMuZ2V0SSgpOworCQl9IGVsc2UgaWYobmV3UiA8IG5ld0REICYmIG5ld1IgPCAwLjApIHsKKwkJCS8vIFNjYWxlIHVzaW5nIFIKKwkJCWFkanVzdGVkID0gdHJ1ZTsKKwkJCWZhY3RvciA9IC1zaXJWYWx1ZS5nZXRSKCkvdGhpcy5nZXRSKCk7CisJCX0gZWxzZSBpZihuZXdERCA8IDAuMCkgeworCQkJLy8gU2NhbGUgdXNpbmcgREQKKwkJCWFkanVzdGVkID0gdHJ1ZTsKKwkJCWZhY3RvciA9IC1zaXJWYWx1ZS5nZXREaXNlYXNlRGVhdGhzKCkvdGhpcy5nZXREaXNlYXNlRGVhdGhzKCk7CisJCX0KKwkJaWYoYWRqdXN0ZWQpIHRoaXMuc2NhbGUoZmFjdG9yKTsKKwkJCisJCQorCQkvLyBEdWUgdG8gcHJlY2lzaW9uIGxpbWl0YXRpb25zIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRoZSBudW1iZXIgaWYgdGlueSBuZWdhdGl2ZS4gQWRqdXN0IGlmIG5lY2Vzc2FyeQorCQluZXdTID0gdGhpcy5nZXRTKCkgKyBzaXJWYWx1ZS5nZXRTKCk7CisJCW5ld0kgPSB0aGlzLmdldEkoKSArIHNpclZhbHVlLmdldEkoKTsKKwkJbmV3UiA9IHRoaXMuZ2V0UigpICsgc2lyVmFsdWUuZ2V0UigpOworCQluZXdERCA9IHRoaXMuZ2V0RGlzZWFzZURlYXRocygpICsgc2lyVmFsdWUuZ2V0RGlzZWFzZURlYXRocygpOworCQkKKwkJaWYobmV3UzwwKQorCQkJdGhpcy5zZXRTKC1zaXJWYWx1ZS5nZXRTKCkpOworCQlpZihuZXdJPDApCisJCQl0aGlzLnNldEkoLXNpclZhbHVlLmdldEkoKSk7CisJCWlmKG5ld1I8MCkKKwkJCXRoaXMuc2V0Uigtc2lyVmFsdWUuZ2V0UigpKTsKKwkJaWYobmV3REQgPCAwKQorCQkJdGhpcy5zZXREaXNlYXNlRGVhdGhzKC1zaXJWYWx1ZS5nZXREaXNlYXNlRGVhdGhzKCkpOworCQlyZXR1cm4gYWRqdXN0ZWQ7CisJfQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxWYWx1ZUltcGwjcmVzZXQoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlzdXBlci5yZXNldCgpOworCQlzZXRSKFJfRURFRkFVTFQpOworCX0gLy8gcmVzZXQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyI3NhbmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5zYW5lKCk7CisKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBnZXRSKCkgPj0gUl9FREVGQVVMVDsKKwkJYXNzZXJ0IHJldFZhbHVlOworCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgZ2V0UigpIDw9IE1BWF9QT1BVTEFUSU9OX1ZBTFVFOworCQlhc3NlcnQgcmV0VmFsdWU7CisJCQorCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmICFEb3VibGUuaXNJbmZpbml0ZShnZXRSKCkpOworCQlhc3NlcnQgcmV0VmFsdWU7CisJCQorCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmICFEb3VibGUuaXNOYU4oZ2V0UigpKTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gc2FuZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogQHBhcmFtIHJlc29sdmUKKwkgKiBAcGFyYW0gY29yZVR5cGUKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJUl9MQUJFTF9WQUxVRV9fUjoKKwkJCQlyZXR1cm4gZ2V0UigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSBuZXdWYWx1ZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lSX0xBQkVMX1ZBTFVFX19SOgorCQkJCXNldFIoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSVJfTEFCRUxfVkFMVUVfX1I6CisJCQkJc2V0UihSX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lSX0xBQkVMX1ZBTFVFX19SOgorCQkJCXJldHVybiByICE9IFJfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpCisJCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlyZXN1bHQuYXBwZW5kKCJzOiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZ2V0Rm9ybWF0dGVyKCkuZm9ybWF0KHMpKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBpOiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZ2V0Rm9ybWF0dGVyKCkuZm9ybWF0KGkpKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCByOiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZ2V0Rm9ybWF0dGVyKCkuZm9ybWF0KHIpKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBERDoiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGdldEZvcm1hdHRlcigpLmZvcm1hdChnZXREaXNlYXNlRGVhdGhzKCkpKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0gLy8gdG9TdHJpbmcKKworfSAvLyBTSVJMYWJlbFZhbHVlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TdGFuZGFyZERpc2Vhc2VNb2RlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RhbmRhcmREaXNlYXNlTW9kZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0ZTFiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RhbmRhcmREaXNlYXNlTW9kZWxJbXBsLmphdmEKQEAgLTAsMCArMSw3OTcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlNpbXBsZURhdGFFeGNoYW5nZUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkFyZWFMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbFN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkRGlzZWFzZU1vZGVsSW1wbCNnZXRUb3RhbFBvcHVsYXRpb25Db3VudCA8ZW0+VG90YWwgUG9wdWxhdGlvbiBDb3VudDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmREaXNlYXNlTW9kZWxJbXBsI2dldFRvdGFsUG9wdWxhdGlvbkNvdW50UmVjaXByb2NhbCA8ZW0+VG90YWwgUG9wdWxhdGlvbiBDb3VudCBSZWNpcHJvY2FsPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZERpc2Vhc2VNb2RlbEltcGwjZ2V0VG90YWxBcmVhIDxlbT5Ub3RhbCBBcmVhPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZERpc2Vhc2VNb2RlbEltcGwjZ2V0UmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHkgPGVtPlJlZmVyZW5jZSBQb3B1bGF0aW9uIERlbnNpdHk8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGFuZGFyZERpc2Vhc2VNb2RlbEltcGwgZXh0ZW5kcyBEaXNlYXNlTW9kZWxJbXBsCisJCWltcGxlbWVudHMgU3RhbmRhcmREaXNlYXNlTW9kZWwgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb3RhbFBvcHVsYXRpb25Db3VudCgpIDxlbT5Ub3RhbCBQb3B1bGF0aW9uIENvdW50PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VG90YWxQb3B1bGF0aW9uQ291bnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFRPVEFMX1BPUFVMQVRJT05fQ09VTlRfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb3RhbFBvcHVsYXRpb25Db3VudCgpIDxlbT5Ub3RhbCBQb3B1bGF0aW9uIENvdW50PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VG90YWxQb3B1bGF0aW9uQ291bnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgdG90YWxQb3B1bGF0aW9uQ291bnQgPSBUT1RBTF9QT1BVTEFUSU9OX0NPVU5UX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvdGFsUG9wdWxhdGlvbkNvdW50UmVjaXByb2NhbCgpIDxlbT5Ub3RhbCBQb3B1bGF0aW9uIENvdW50IFJlY2lwcm9jYWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUb3RhbFBvcHVsYXRpb25Db3VudFJlY2lwcm9jYWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFRPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTF9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvdGFsUG9wdWxhdGlvbkNvdW50UmVjaXByb2NhbCgpIDxlbT5Ub3RhbCBQb3B1bGF0aW9uIENvdW50IFJlY2lwcm9jYWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUb3RhbFBvcHVsYXRpb25Db3VudFJlY2lwcm9jYWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgdG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsID0gVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvdGFsQXJlYSgpIDxlbT5Ub3RhbCBBcmVhPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VG90YWxBcmVhKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBUT1RBTF9BUkVBX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG90YWxBcmVhKCkgPGVtPlRvdGFsIEFyZWE8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUb3RhbEFyZWEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgdG90YWxBcmVhID0gVE9UQUxfQVJFQV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2VQb3B1bGF0aW9uRGVuc2l0eSgpIDxlbT5SZWZlcmVuY2UgUG9wdWxhdGlvbiBEZW5zaXR5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWZlcmVuY2VQb3B1bGF0aW9uRGVuc2l0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWV9FREVGQVVMVCA9IDEwMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHkoKSA8ZW0+UmVmZXJlbmNlIFBvcHVsYXRpb24gRGVuc2l0eTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgcmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHkgPSBSRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZX0VERUZBVUxUOworCisJCisJCQorCS8qKgorCSAqIFdlIG9ubHkgbmVlZCBvbmUgb2YgdGhlc2UuCisJICogCisJICogQHNlZSAjdXBkYXRlTGFiZWxzKFNURU1UaW1lLCBsb25nKQorCSAqLworCXByb3RlY3RlZCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZGVwYXJ0dXJlcyA9IChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpIGNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKTsKKworCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RhbmRhcmREaXNlYXNlTW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBzdGFuZGFyZERpc2Vhc2VNb2RlbAorCSAqICAgICAgICAgICAgdGhlIFN0YW5kYXJkRGlzZWFzZU1vZGVsIGRpc2Vhc2UgbW9kZWwgdG8gYmUgaW5pdGlhbGl6ZWQKKwkgKiBAcGFyYW0gZGlzZWFzZU1vZGVsTmFtZQorCSAqIEBwYXJhbSBiYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZQorCSAqIEBwYXJhbSBpbW11bml0eUxvc3NSYXRlCisJICogQHBhcmFtIGluY3ViYXRpb25SYXRlCisJICogQHBhcmFtIG5vbkxpbmVhcml0eUNvZWZmaWNpZW50CisJICogQHBhcmFtIHRpbWVQZXJpb2QKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbklkZW50aWZpZXIKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFN0YW5kYXJkRGlzZWFzZU1vZGVsIGluaXRpYWxpemVTdGFuZGFyZERpc2Vhc2VNb2RlbCgKKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsIHN0YW5kYXJkRGlzZWFzZU1vZGVsLAorCQkJZmluYWwgU3RyaW5nIGRpc2Vhc2VNb2RlbE5hbWUsCisJCQlmaW5hbCBkb3VibGUgYmFja2dyb3VuZE1vcnRhbGl0eVJhdGUsIGZpbmFsIGxvbmcgdGltZVBlcmlvZCwKKwkJCWZpbmFsIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllcikgeworCQlEaXNlYXNlTW9kZWxJbXBsLmluaXRpYWxpemVEaXNlYXNlTW9kZWwoc3RhbmRhcmREaXNlYXNlTW9kZWwsCisJCQkJZGlzZWFzZU1vZGVsTmFtZSwgYmFja2dyb3VuZE1vcnRhbGl0eVJhdGUsIHRpbWVQZXJpb2QsCisJCQkJcG9wdWxhdGlvbklkZW50aWZpZXIpOworCisJCXJldHVybiBzdGFuZGFyZERpc2Vhc2VNb2RlbDsKKwl9IC8vIGluaXRpYWxpemVTdGFuZGFyZERpc2Vhc2VNb2RlbAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0VG90YWxQb3B1bGF0aW9uQ291bnQoKSB7CisJCXJldHVybiB0b3RhbFBvcHVsYXRpb25Db3VudDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VG90YWxQb3B1bGF0aW9uQ291bnQoZG91YmxlIG5ld1RvdGFsUG9wdWxhdGlvbkNvdW50KSB7CisJCWRvdWJsZSBvbGRUb3RhbFBvcHVsYXRpb25Db3VudCA9IHRvdGFsUG9wdWxhdGlvbkNvdW50OworCQl0b3RhbFBvcHVsYXRpb25Db3VudCA9IG5ld1RvdGFsUG9wdWxhdGlvbkNvdW50OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVCwgb2xkVG90YWxQb3B1bGF0aW9uQ291bnQsIHRvdGFsUG9wdWxhdGlvbkNvdW50KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0VG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsKCkgeworCQlyZXR1cm4gdG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFRvdGFsQXJlYSgpIHsKKwkJcmV0dXJuIHRvdGFsQXJlYTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VG90YWxBcmVhKGRvdWJsZSBuZXdUb3RhbEFyZWEpIHsKKwkJZG91YmxlIG9sZFRvdGFsQXJlYSA9IHRvdGFsQXJlYTsKKwkJdG90YWxBcmVhID0gbmV3VG90YWxBcmVhOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fVE9UQUxfQVJFQSwgb2xkVG90YWxBcmVhLCB0b3RhbEFyZWEpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFJlZmVyZW5jZVBvcHVsYXRpb25EZW5zaXR5KCkgeworCQlyZXR1cm4gcmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHkoZG91YmxlIG5ld1JlZmVyZW5jZVBvcHVsYXRpb25EZW5zaXR5KSB7CisJCWRvdWJsZSBvbGRSZWZlcmVuY2VQb3B1bGF0aW9uRGVuc2l0eSA9IHJlZmVyZW5jZVBvcHVsYXRpb25EZW5zaXR5OworCQlyZWZlcmVuY2VQb3B1bGF0aW9uRGVuc2l0eSA9IG5ld1JlZmVyZW5jZVBvcHVsYXRpb25EZW5zaXR5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWSwgb2xkUmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHksIHJlZmVyZW5jZVBvcHVsYXRpb25EZW5zaXR5KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRUb1RvdGFsUG9wdWxhdGlvbkNvdW50KGRvdWJsZSBwb3B1bGF0aW9uQ291bnQpIHsKKwkJc2V0VG90YWxQb3B1bGF0aW9uQ291bnQodG90YWxQb3B1bGF0aW9uQ291bnQgKyBwb3B1bGF0aW9uQ291bnQpOworCX0gLy8gYWRkVG9Ub3RhbFBvcHVsYXRpb25Db3VudAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGNvbXB1dGVUb3RhbFBvcHVsYXRpb25Db3VudFJlY2lwcm9jYWwoKSB7CisJCXJldHVybiB0b3RhbFBvcHVsYXRpb25Db3VudFJlY2lwcm9jYWwgPSAxLjAgLyB0b3RhbFBvcHVsYXRpb25Db3VudDsKKwl9IC8vIGNvbXB1dGVUb3RhbFBvcHVsYXRpb25Db3VudFJlY2lwcm9jYWwKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgYWRkVG9Ub3RhbEFyZWEoZG91YmxlIGFyZWEpIHsKKwkJc2V0VG90YWxBcmVhKHRvdGFsQXJlYSArIGFyZWEpOworCX0gLy8gYWRkVG9Ub3RhbEFyZWEKKworCS8qKgorCSAqIGNhbGN1bGF0ZURlbHRhIHdpbGwgdXNlIHRoZSBjdXJyZW50IGxhYmVsIHZhbHVlcyB1cGRhdGVkIGJ5IAorCSAqIHRoZSBkaXNlYXNlIG1vZGVsIGFuZCB1cG9uIHJldHVybiB0aGUgZGVsdGEgbGFiZWwgdmFsdWVzCisJICogYXJlIHNldCB3aXRoIGFuIGVzdGltYXRlIG9mIHRoZSBkZXJpdmF0aXZlcyB0byBhZHZhbmNlIHRvIHRoZQorCSAqIG5leHQgc3RlcCAgCisJICogCisJICogQHBhcmFtIHRpbWUgY3VycmVudCB0aW1lCisJICogQHBhcmFtIHRpbWVEZWx0YSBkZWx0YSB0aW1lICBzdGVwCisJICogQHBhcmFtIGxhYmVscyBUaGUgbGFiZWxzIHRvIHVwZGF0ZQorCSAqLworCisJcHVibGljIHZvaWQgY2FsY3VsYXRlRGVsdGEoU1RFTVRpbWUgdGltZSwgbG9uZyB0aW1lRGVsdGEsIEVMaXN0PER5bmFtaWNMYWJlbD4gbGFiZWxzKSB7CisJCS8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIG9mIHRoZSBsYWJlbHMgd2UgbmVlZCB0byB1cGRhdGUuCQkKKwkJLy8gUGxhY2UgaG9sZGVycyB0byBrZWVwIGRlbHRhIHZhbHVlcy4gCisJCQorCQlEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGJpcnRoRGVhdGhzRGVsdGEgPSB0aGlzLmNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKTsKKwkJRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBkaXNlYXNlRGVsdGEgPSB0aGlzLmNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKTsKKwkKKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxEeW5hbWljTGFiZWw+IGN1cnJlbnRTdGF0ZUxhYmVsSXRlciA9IGxhYmVscworCQkJCS5pdGVyYXRvcigpOyBjdXJyZW50U3RhdGVMYWJlbEl0ZXIuaGFzTmV4dCgpOykgeworCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTGFiZWwgPSAoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCkgY3VycmVudFN0YXRlTGFiZWxJdGVyCisJCQkJCS5uZXh0KCk7CisKKwkJCQorCQkJYXNzZXJ0IGRpc2Vhc2VMYWJlbC5nZXRQb3B1bGF0aW9uTGFiZWwoKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpCisJCQkJCS5lcXVhbHMoZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSk7CisJCQkKKwkJCS8vIFRoaXMgY3VycmVudCBzdGF0ZSBvZiB0aGUgZGlzZWFzZSBmb3IgdGhpcyBsYWJlbCBwcm9iZWQgZm9yIHRoZSAKKwkJCS8vIG5leHQgZGVsdGEKKwkJCQorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGN1cnJlbnRQcm9iZVN0YXRlID0gKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwKKwkJCQkJLmdldFByb2JlVmFsdWUoKTsKKworCisJCQkvLyAxKSBDb21wdXRlIEJpcnRoIGFuZCBEZWF0aHMgc3RhdGUgZGVsdGEgY2hhbmdlcworCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGRpc2Vhc2VEZWF0aERlbHRhcyA9IGNvbXB1dGVEaXNlYXNlRGVhdGhzRGVsdGFzKHRpbWUsIGRpc2Vhc2VMYWJlbCwgY3VycmVudFByb2JlU3RhdGUsIHRpbWVEZWx0YSwgYmlydGhEZWF0aHNEZWx0YSk7CisJCQkJCisJCQkJCisJCQkvLyAyKSBDb21wdXRlIHRoZSBkZWx0YSBjaGFuZ2VzIGNhdXNlZCAgYnkgdGhlIERpc2Vhc2UgaXRzZWxmCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZGlzZWFzZURlbHRhcyA9IGNvbXB1dGVEaXNlYXNlRGVsdGFzKHRpbWUsIGN1cnJlbnRQcm9iZVN0YXRlLCBkaXNlYXNlTGFiZWwsIHRpbWVEZWx0YSwgZGlzZWFzZURlbHRhKTsKKwkJCQorCQkJIC8vICBKdXN0IGNhcHR1cmUgdGhlIGluY2lkZW5jZSB0aGF0IHdhcyBwYXNzZWQgb24gZnJvbSBjb21wdXRlVHJhbnNpc3Rpb25zCisJCQlmaW5hbCBkb3VibGUgaW5jaWRlbmNlID0gZGlzZWFzZURlbHRhcy5nZXRJbmNpZGVuY2UoKTsKKworCQkJLyoKKwkJCSAqIDUpIFJlY29yZCB0aGUgbmV3IHN0YXRlIHZhcmlhYmxlIHZhbHVlcy4KKwkJCSAqIAorCQkJICogVGhlc2Ugd2lsbCBiZWNvbWUgdGhlIGN1cnJlbnQgc3RhdGUgdmFyaWFibGUgdmFsdWVzIGF0IHRoZSBlbmQgb2YKKwkJCSAqIHRoZSBjdXJyZW50IHNpbXVsYXRpb24gY3ljbGUgYW5kIGJlZm9yZSB0aGUgbmV4dC4KKwkJCSAqLworCisJCQkvLyBUaGlzIGlzIHRoZSBkZWx0YSBkaXNlYXNlIGxhYmVsCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZGVsdGFTdGF0ZSA9IChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpZGlzZWFzZUxhYmVsCisJCQkJCS5nZXREZWx0YVZhbHVlKCk7CisKKwkJCQorCQkJLy8gUmVzZXQgdGhlIHN0YXRlCisJCQlkZWx0YVN0YXRlLnJlc2V0KCk7CisJCQkKKwkJCQorCQkJLy8gMSkgQWRkIGJpcnRoL2RlYXRoIGRlbHRhcyBhbmQgc2V0IHRoZSBkZXBhcnR1cmVzCisJCQlkZWx0YVN0YXRlLmFkZCgoSW50ZWdyYXRpb25MYWJlbFZhbHVlKWRpc2Vhc2VEZWF0aERlbHRhcyk7CisJCQlpZihkaXNlYXNlRGVhdGhEZWx0YXMuZ2V0RGlzZWFzZURlYXRocygpID4gMC4wKSAKKwkJCQlkZWx0YVN0YXRlLmdldERlcGFydHVyZXMoKS5wdXQoZGlzZWFzZUxhYmVsLmdldE5vZGUoKSwgZGlzZWFzZURlYXRoRGVsdGFzLmdldERpc2Vhc2VEZWF0aHMoKSk7CisJCQkJCisJCQkvLyAyKSBEaXNlYXNlIGRlbHRhcworCQkJZGVsdGFTdGF0ZS5hZGQoKEludGVncmF0aW9uTGFiZWxWYWx1ZSlkaXNlYXNlRGVsdGFzKTsKKwkJCisJCQkvLyBhbmQgcGFzcyBvbiB0aGUgaW5jaWRlbmNlCisJCQlkZWx0YVN0YXRlLnNldEluY2lkZW5jZShpbmNpZGVuY2UpOworCQkJCisJCQliaXJ0aERlYXRoc0RlbHRhLnJlc2V0KCk7CisJCQlkaXNlYXNlRGVsdGEucmVzZXQoKTsKKwkJCQkKKwkJfSAvLyBmb3IKKwl9CisKKwkKKwlwdWJsaWMgdm9pZCBhcHBseUV4dGVybmFsRGVsdGFzKFNURU1UaW1lIHRpbWUsIGxvbmcgdGltZURlbHRhLCBFTGlzdDxEeW5hbWljTGFiZWw+IGxhYmVscykgeworIAkJZm9yIChmaW5hbCBJdGVyYXRvcjxEeW5hbWljTGFiZWw+IGN1cnJlbnRTdGF0ZUxhYmVsSXRlciA9IGxhYmVscworCQkJCS5pdGVyYXRvcigpOyBjdXJyZW50U3RhdGVMYWJlbEl0ZXIuaGFzTmV4dCgpOykgeworCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTGFiZWwgPSAoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCkgY3VycmVudFN0YXRlTGFiZWxJdGVyCisJCQkJCS5uZXh0KCk7CisJCQkKKwkJCVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBteURlbHRhID0gKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuZ2V0RGVsdGFWYWx1ZSgpOworCQkJTm9kZSBuID0gZGlzZWFzZUxhYmVsLmdldE5vZGUoKTsKKwkJCQorCQkJCisJCQkvLyBGaW5kIG90aGVyIGxhYmVscyBvbiB0aGUgbm9kZSB0aGF0IHdhbnRzIHRvIGV4Y2hhbmdlIGRhdGEKKwkJCQorCQkJRUxpc3Q8Tm9kZUxhYmVsPiBsYWJzID0gbi5nZXRMYWJlbHMoKTsKKwkJCWZvcihOb2RlTGFiZWwgbDpsYWJzKSB7CisJCQkJaWYobCBpbnN0YW5jZW9mIEludGVncmF0aW9uTGFiZWwgJiYgIWwuZXF1YWxzKGRpc2Vhc2VMYWJlbCkKKwkJCQkJCSYmICgoSW50ZWdyYXRpb25MYWJlbClsKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKGRpc2Vhc2VMYWJlbC5nZXRJZGVudGlmaWVyKCkpKSB7CisJCQkJCVNpbXBsZURhdGFFeGNoYW5nZUxhYmVsVmFsdWUgc2RlTGFiZWxWYWx1ZSA9IChTaW1wbGVEYXRhRXhjaGFuZ2VMYWJlbFZhbHVlKSgoSW50ZWdyYXRpb25MYWJlbClsKS5nZXREZWx0YVZhbHVlKCk7CisJCQkJCU1hcDxOb2RlLCBEb3VibGU+YXJyaXZhbHMgPSBzZGVMYWJlbFZhbHVlLmdldEFycml2YWxzKCk7CisJCQkJCU1hcDxOb2RlLCBEb3VibGU+ZGVwYXJ0dXJlcyA9IHNkZUxhYmVsVmFsdWUuZ2V0RGVwYXJ0dXJlcygpOworCQkJCQlpZihhcnJpdmFscyA9PSBudWxsIHx8IGRlcGFydHVyZXMgPT0gbnVsbCkgeworCQkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJFcnJvciwgbnVsbCBhcnJpdmFscyBvciBkZXBhcnR1cmVzIGZvciBsYWJlbCAiK2wsIG5ldyBFeGNlcHRpb24oKSk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQkvLyBBcnJpdmFscworCQkJCQlmb3IgKEVudHJ5PE5vZGUsRG91YmxlPiBlbnRyeSA6IGFycml2YWxzLmVudHJ5U2V0KCkpIHsKKwkJCQkJLy9mb3IoTm9kZSBuMjphcnJpdmFscy5rZXlTZXQoKSkgeworCQkJCQkJLy8gQXJyaXZhbHMgYXJlIGJpcnRocyBhbmQgZ29lcyBpbnRvIHRoZSBTIHN0YXRlIGlmIHRoZSBub2RlIGlzIHRoZSBsb2NhbCBub2RlLgorCQkJCQkJaWYoZW50cnkuZ2V0S2V5KCkuZXF1YWxzKG4pKQorCQkJCQkJCW15RGVsdGEuc2V0UyhteURlbHRhLmdldFMoKSArIGVudHJ5LmdldFZhbHVlKCkuZG91YmxlVmFsdWUoKSk7CisJCQkJCQllbHNlIHsgLy8gRm9yIG90aGVyIG5vZGVzLCBpdCdzIG1pZ3JhdGlvbiBvZiBwb3B1bGF0aW9uCisJCQkJCQkJZG91YmxlIGluZmxvdyA9IGVudHJ5LmdldFZhbHVlKCkuZG91YmxlVmFsdWUoKTsKKwkJCQkJCQkvLyBGaW5kIHRoZSBjb3JyZXNwb25kaW5nIGRpc2Vhc2UgbGFiZWwgb24gdGhlIG90aGVyIG5vZGUKKwkJCQkJCQlmb3IoTm9kZUxhYmVsIG5sOmVudHJ5LmdldEtleSgpLmdldExhYmVscygpKQorCQkJCQkJCQlpZihubCBpbnN0YW5jZW9mIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgJiYgKChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKW5sKS5nZXREZWNvcmF0b3IoKS5lcXVhbHModGhpcykpIHsKKwkJCQkJCQkJCVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSB2YWx1ZSA9IChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpRWNvcmVVdGlsLmNvcHkoKChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKW5sKS5nZXRUZW1wVmFsdWUoKSk7IAorCQkJCQkJCQkJCisJCQkJCQkJCQlpZih2YWx1ZS5nZXRQb3B1bGF0aW9uQ291bnQoKSA+IDAuMCkKKwkJCQkJCQkJCQl2YWx1ZS5zY2FsZShpbmZsb3cvdmFsdWUuZ2V0UG9wdWxhdGlvbkNvdW50KCkpOworCQkJCQkJCQkJCisJCQkJCQkJCQlteURlbHRhLmFkZCgoSW50ZWdyYXRpb25MYWJlbFZhbHVlKXZhbHVlKTsKKwkJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCQorCQkJCQkvLyBEZXBhcnR1cmVzCisJCQkJCWZvcihFbnRyeTxOb2RlLERvdWJsZT4gZW50cnkgOiBkZXBhcnR1cmVzLmVudHJ5U2V0KCkpIHsKKwkJCQkJCS8vIERlcGFydHVyZXMgYXJlIGVpdGhlciBkZWF0aHMgb3IgcG9wdWxhdGlvbiBtb3ZpbmcgdG8gb3RoZXIgbm9kZXMsIGhlbmNlIHdlIHN1YnN0cmFjdCBmcm9tIHRoZSBsb2NhbCBub2RlLgorCQkJCQkJCisJCQkJCQlTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY3VycmVudFN0YXRlID0gbnVsbDsKKwkJCQkJCWlmKGVudHJ5LmdldEtleSgpLmVxdWFscyhuKSkgCisJCQkJCQkJY3VycmVudFN0YXRlID0gKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSlFY29yZVV0aWwuY29weSgoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKWRpc2Vhc2VMYWJlbC5nZXRQcm9iZVZhbHVlKCkpOyAvLyBTaG91bGQgYmUgc2FmZSB0byB1c2UgcHJvYmUgdmFsdWUgZm9yIGRlYXRocworCQkJCQkJZWxzZQorCQkJCQkJCWN1cnJlbnRTdGF0ZSA9IChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpRWNvcmVVdGlsLmNvcHkoKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuZ2V0VGVtcFZhbHVlKCkpOyAvLyBOZWVkIHRvIHVzZSB0ZW1wIHZhbHVlIGZvciBtaWdyYXRpb24gb3IgYW4gaW5iYWxhbmNlIHdpbGwgb2NjeXIKKwkJCQkJCisJCQkJCQlkb3VibGUgcG9wdWxhdGlvbkNvdW50ID0gY3VycmVudFN0YXRlLmdldFBvcHVsYXRpb25Db3VudCgpOworCQkJCQkJZG91YmxlIG91dGZsb3cgPSBlbnRyeS5nZXRWYWx1ZSgpLmRvdWJsZVZhbHVlKCk7CisJCQkJCQlkb3VibGUgZmFjdG9yID0gb3V0Zmxvdy9wb3B1bGF0aW9uQ291bnQ7CisJCQkJCQlpZihEb3VibGUuaXNOYU4oZmFjdG9yKSB8fCBEb3VibGUuaXNJbmZpbml0ZShmYWN0b3IpKSBmYWN0b3IgPSAwLjA7IC8vc2FmZQkJCQkJCisJCQkJCQljdXJyZW50U3RhdGUuc2NhbGUoZmFjdG9yKTsKKwkJCQkJCQkvLyBSZW1lbWJlciBkaXNlYXNlIGRlYXRocyBzaW5jZSB0aGV5IHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgc3ViCisJCQkJCQlteURlbHRhLnN1YigoSW50ZWdyYXRpb25MYWJlbFZhbHVlKWN1cnJlbnRTdGF0ZSk7CisJCQkJCX0JCisJCQkJfQorCQkJfQorCisJCX0KKyAJCQorCX0KKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVDoKKwkJCQlyZXR1cm4gZ2V0VG90YWxQb3B1bGF0aW9uQ291bnQoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTDoKKwkJCQlyZXR1cm4gZ2V0VG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX19UT1RBTF9BUkVBOgorCQkJCXJldHVybiBnZXRUb3RhbEFyZWEoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFk6CisJCQkJcmV0dXJuIGdldFJlZmVyZW5jZVBvcHVsYXRpb25EZW5zaXR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UOgorCQkJCXNldFRvdGFsUG9wdWxhdGlvbkNvdW50KChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1RPVEFMX0FSRUE6CisJCQkJc2V0VG90YWxBcmVhKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFk6CisJCQkJc2V0UmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHkoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UOgorCQkJCXNldFRvdGFsUG9wdWxhdGlvbkNvdW50KFRPVEFMX1BPUFVMQVRJT05fQ09VTlRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1RPVEFMX0FSRUE6CisJCQkJc2V0VG90YWxBcmVhKFRPVEFMX0FSRUFfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFk6CisJCQkJc2V0UmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHkoUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVDoKKwkJCQlyZXR1cm4gdG90YWxQb3B1bGF0aW9uQ291bnQgIT0gVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9FREVGQVVMVDsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTDoKKwkJCQlyZXR1cm4gdG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsICE9IFRPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTF9FREVGQVVMVDsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1RPVEFMX0FSRUE6CisJCQkJcmV0dXJuIHRvdGFsQXJlYSAhPSBUT1RBTF9BUkVBX0VERUZBVUxUOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWToKKwkJCQlyZXR1cm4gcmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHkgIT0gUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCQorCS8qKgorCSAqIFN0YW5kYXJkIGRpc2Vhc2UgbW9kZWxzIGRvIG5vdCB1cGRhdGUgdGhlIGxhYmVscywgaXQncyB0aGUKKwkgKiB0YXNrIG9mIHRoZSBTb2x2ZXIgdG8gZG8gdGhhdC4KKwkgKiAKKwkgKiBTdGFuZGFyZCBEaXNlYXNlIE1vZGVscyAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkRlY29yYXRvckltcGwjdXBkYXRlTGFiZWxzKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCwKKwkgKiAgICAgIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGVMYWJlbHMoZmluYWwgU1RFTVRpbWUgdGltZSwgZmluYWwgbG9uZyB0aW1lRGVsdGEsIGludCBjeWNsZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogUG9wdWxhdGUgdGhlIHBpcGUgc3lzdGVtIG5vZGVzIGluaXRpYWxseQorCSAqLworCQorCQorCQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuRGlzZWFzZU1vZGVsSW1wbCNpbml0aWFsaXplRGlzZWFzZVN0YXRlKG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxTdGF0ZSwKKwkgKiAgICAgIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRGlzZWFzZU1vZGVsU3RhdGUgaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZSgKKwkJCWZpbmFsIERpc2Vhc2VNb2RlbFN0YXRlIGRpc2Vhc2VNb2RlbFN0YXRlLAorCQkJZmluYWwgRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZU1vZGVsTGFiZWwpIHsKKworCQlmaW5hbCBQb3B1bGF0aW9uTGFiZWwgcG9wdWxhdGlvbkxhYmVsID0gZGlzZWFzZU1vZGVsTGFiZWwKKwkJCQkuZ2V0UG9wdWxhdGlvbkxhYmVsKCk7CisJCWZpbmFsIGRvdWJsZSBwb3B1bGF0aW9uQ291bnQgPSBwb3B1bGF0aW9uTGFiZWwKKwkJCQkuZ2V0Q3VycmVudFBvcHVsYXRpb25WYWx1ZSgpLmdldENvdW50KCk7CisKKwkJLy8gQWNjdW11bGF0ZSB0aGUgcG9wdWxhdGlvbiBjb3VudCBpbiB0aGUgZGlzZWFzZSBtb2RlbAorCQlhZGRUb1RvdGFsUG9wdWxhdGlvbkNvdW50KHBvcHVsYXRpb25Db3VudCk7CisKKwkJZG91YmxlIGFyZWEgPSBnZXRBcmVhKHBvcHVsYXRpb25MYWJlbCk7CisJCS8vIElmIHdlIGhhdmUgYSBiYWQgZGF0YSBzZXQgaXQgY291bGQgYmUgdGhhdCB0aGUgYXJlYSB3b3VsZCBiZQorCQkvLyB1bnNwZWNpZmllZCBvciB6ZXJvLgorCQkvLyBEbyB3ZSBoYXZlIGEgYmFkIGFyZWEgdmFsdWU/CisJCWlmIChhcmVhIDw9IDAuMCkgeworCQkJLy8gWWVzCisJCQlyZXBvcnRCYWRBcmVhVmFsdWUocG9wdWxhdGlvbkxhYmVsLCBhcmVhKTsKKwkJCWFyZWEgPSAxLjA7CisJCX0gLy8gaWYgYmFkIGFyZWEgdmFsdWUKKworCQkvLyBBY2N1bXVsYXRlIHRoZSBhcmVhIGluIHRoZSBkaXNlYXNlIG1vZGVsIHNvIHdlJ2xsIGtub3cgdGhlIHRvdGFsIHdoZW4KKwkJLy8gd2UgZG8gb3VyIG5leHQgcGFzcyBhbmQgY29tcHV0ZSB0aGUgYXJlYSByYXRpbworCQlhZGRUb1RvdGFsQXJlYShhcmVhKTsKKwkKKwkJcmV0dXJuIGRpc2Vhc2VNb2RlbFN0YXRlOworCX0gLy8gaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZQorCisJLyoqCisJICogSGVyZSB3ZSBjb21wdXRlIGFuZCBzZXQgdGhlIHJhdGlvIGJldHdlZW4gdGhlIHRvdGFsIGFyZWEgYW5kIHRoZSBhcmVhCisJICogdXNlZCBmb3IgdGhpcyB7QGxpbmsgRGlzZWFzZU1vZGVsTGFiZWx9LiBUaGlzIHZhbHVlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCisJICogdGhlIDxlbT50cmFuc21pc3Npb24gc2NhbGUgZmFjdG9yPC9lbT4uCisJICogCisJICogQHNlZSAjY29tcHV0ZVRyYW5zaXRpb25zKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSwKKwkgKiAgICAgIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwsIGxvbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxJbXBsI2luaXRpYWxpemVEaXNlYXNlU3RhdGUob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEaXNlYXNlU3RhdGUoZmluYWwgRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZU1vZGVsTGFiZWwpIHsKKwkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZSBzZG1zID0gKFN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUpIGRpc2Vhc2VNb2RlbExhYmVsCisJCQkJLmdldERpc2Vhc2VNb2RlbFN0YXRlKCk7CisJCS8vIElzIHRoZXJlIGEgcG9wdWxhdGlvbiA/CisJCWlmICh0b3RhbFBvcHVsYXRpb25Db3VudCA+IDAuMCkgeworCQkJLy8gWWVzCisJCQlkb3VibGUgYXJlYSA9IGdldEFyZWEoZGlzZWFzZU1vZGVsTGFiZWwuZ2V0UG9wdWxhdGlvbkxhYmVsKCkpOworCQkJLy8gRG8gd2UgaGF2ZSBhIGJhZCBhcmVhIHZhbHVlPworCQkJaWYgKGFyZWEgPD0gMC4wKSB7CisJCQkJLy8gWWVzCisJCQkJcmVwb3J0QmFkQXJlYVZhbHVlKGRpc2Vhc2VNb2RlbExhYmVsLmdldFBvcHVsYXRpb25MYWJlbCgpLCBhcmVhKTsKKwkJCQlhcmVhID0gMS4wOworCQkJfSAvLyBpZiBiYWQgYXJlYSB2YWx1ZQorCisJCQlmaW5hbCBkb3VibGUgcmF0aW8gPSBnZXRUb3RhbEFyZWEoKSAvIGFyZWE7CisJCQlzZG1zLnNldEFyZWFSYXRpbyhyYXRpbyk7CisJCX0KKwl9IC8vIGluaXRpYWxpemVEaXNlYXNlU3RhdGUKKworCS8qKgorCSAqIEBwYXJhbSBwb3B1bGF0aW9uTGFiZWwKKwkgKiAgICAgICAgICAgIHRoZSBwb3B1bGF0aW9uIGxhYmVsIHRoYXQgbGFiZWxzIHRoZSBub2RlCisJICogQHJldHVybiB0aGUgYXJlYSBvZiB0aGUgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxhYmVsCisJICovCisJcHVibGljIGRvdWJsZSBnZXRBcmVhKGZpbmFsIFBvcHVsYXRpb25MYWJlbCBwb3B1bGF0aW9uTGFiZWwpIHsKKwkJZG91YmxlIHJldFZhbHVlID0gMC4wOworCisJCS8vIFRoZSBwb3B1bGF0aW9uIGxhYmVsIGNvdWxkIGhhdmUgYW4gYXJlYSBzcGVjaWZpZWQgZm9yIHRoZSBwb3B1bGF0aW9uCisJCS8vIHRoYXQgd2Ugc2hvdWxkIHVzZSBpbnN0ZWFkIG9mIHRoZSBhcmVhIG9mIHRoZSByZWdpb24gbGFiZWxlZCBieSB0aGUKKwkJLy8gcG9wdWxhdGlvbiBsYWJlbC4gVGhpcyB2YWx1ZSB3b3VsZCBiZSBzcGVjaWZpZWQgaWYgdGhlIHBvcHVsYXRpb24gd2FzCisJCS8vIGRlbnNlbHkgcGFja2VkIGludG8gYSBzbWFsbCBhcmVhIG9mIHRoZSBsYXJnZXIgcmVnaW9uLCBmb3IgaW5zdGFuY2UKKwkJLy8gbGlrZSBhIGNpdHkgaW4gYW4gb3RoZXJ3aXNlIGxhcmdlIGRlc2VydC4KKworCQlyZXRWYWx1ZSA9IHBvcHVsYXRpb25MYWJlbC5nZXRQb3B1bGF0ZWRBcmVhKCk7CisKKwkJLy8gSXMgdGhlcmUgYW4gYXJlYSBzcGVjaWZpZWQgZm9yIHRoZSBwb3B1bGF0aW9uPworCQlpZiAocmV0VmFsdWUgPT0gMC4wKSB7CisJCQkvLyBObworCQkJLy8gT2ssIGdvIGZpbmQgdGhlIGFyZWEgbGFiZWwgYW5kIHJldHVybiB0aGUgYXJlYSBvZiB0aGUgcmVnaW9uCisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPE5vZGVMYWJlbD4gbGFiZWxJdGVyID0gcG9wdWxhdGlvbkxhYmVsLmdldE5vZGUoKQorCQkJCQkuZ2V0TGFiZWxzKCkuaXRlcmF0b3IoKTsgbGFiZWxJdGVyLmhhc05leHQoKTspIHsKKwkJCQlmaW5hbCBOb2RlTGFiZWwgbm9kZUxhYmVsID0gbGFiZWxJdGVyLm5leHQoKTsKKwkJCQkvLyBJcyB0aGlzIGFuIGFyZWEgbGFiZWw/CisJCQkJaWYgKG5vZGVMYWJlbCBpbnN0YW5jZW9mIEFyZWFMYWJlbCkgeworCQkJCQkvLyBZZXMKKwkJCQkJZmluYWwgQXJlYUxhYmVsIGFyZWFMYWJlbCA9IChBcmVhTGFiZWwpIG5vZGVMYWJlbDsKKwkJCQkJcmV0VmFsdWUgPSBhcmVhTGFiZWwuZ2V0Q3VycmVudEFyZWFWYWx1ZSgpLmdldEFyZWEoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSAvLyBmb3IKKwkJfSAvLyBJZiBubyBwb3B1bGF0aW9uIGFyZWEgc3BlY2lmaWVkCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0QXJlYQorCisJLyoqCisJICogQHBhcmFtIHBvcHVsYXRpb25MYWJlbAorCSAqIEBwYXJhbSBhcmVhCisJICovCisJcHJpdmF0ZSB2b2lkIHJlcG9ydEJhZEFyZWFWYWx1ZShmaW5hbCBQb3B1bGF0aW9uTGFiZWwgcG9wdWxhdGlvbkxhYmVsLAorCQkJZG91YmxlIGFyZWEpIHsKKwkJLy8gVGhlIGJhZCB2YWx1ZSBjb3VsZCBiZSBzcGVjaWZpZWQgZm9yIHRoZSBub2RlIG9yIGJlIGFuIG92ZXJyaWRlCisJCS8vIHZhbHVlIHNwZWNpZmllZCBmb3IgdGhlIHBvcHVsYXRpb24uCisJCS8vIElzIHRoZSBiYWQgdmFsdWUgZnJvbSB0aGUgbm9kZT8KKwkJaWYgKHBvcHVsYXRpb25MYWJlbC5nZXRQb3B1bGF0ZWRBcmVhKCkgPT0gMC4wKSB7CisJCQkvLyBZZXMKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiVGhlIGFyZWEgdmFsdWUgb2YgXCIiICsgYXJlYQorCQkJCQkrICJcIiBzcGVjaWZpZWQgZm9yIFwiIgorCQkJCQkrIHBvcHVsYXRpb25MYWJlbC5nZXROb2RlKCkudG9TdHJpbmcoKQorCQkJCQkrICJcIiBpcyBub3QgZ3JlYXRlciB0aGFuIHplcm8gKDAuMCkiLCBudWxsKTsKKwkJfSAvLyBpZiBiYWQgdmFsdWUgZm9yIG5vZGUgYXJlYQorCQllbHNlIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiVGhlIGFyZWEgdmFsdWUgb2YgXCIiICsgYXJlYQorCQkJCQkrICJcIiBzcGVjaWZpZWQgZm9yIHRoZSBwb3B1bGF0aW9uIFwiIgorCQkJCQkrIHBvcHVsYXRpb25MYWJlbC5nZXROYW1lKCkgKyAiXCIgZm9yIHRoZSByZWdpb24gXCIiCisJCQkJCSsgcG9wdWxhdGlvbkxhYmVsLmdldE5vZGUoKS50b1N0cmluZygpCisJCQkJCSsgIlwiIGlzIG5vdCBncmVhdGVyIHRoYW4gemVybyAoMC4wKSIsIG51bGwpOworCQl9CisJfSAvLyByZXBvcnRCYWRBcmVhVmFsdWUKKworCS8qKgorCSAqIFBlcmZvcm0gZGlzZWFzZSBtb2RlbCBzcGVjaWZpYyBjaGFuZ2VzIHRvIHRoZSBhZGRpdGlvbnMgdG8gZWFjaCBzdGF0ZSBhbmQKKwkgKiB0byB0aGUgZGVhdGhzIGZyb20gZWFjaCBzdGF0ZS4gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBwZXJmb3JtIHN0b2NoYXN0aWMKKwkgKiBtb2RpZmljYXRpb25zIHRvIHRoZSBuZXh0IGRpc2Vhc2Ugc3RhdGUuCisJICogCisJICogQHBhcmFtIGN1cnJlbnRTdGF0ZQorCSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZGlzZWFzZSBzdGF0ZQorCSAqLworCXB1YmxpYyB2b2lkIGRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKAorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGN1cnJlbnRTdGF0ZSkgeworCQkvLyBEbyBub3RoaW5nIGhlcmUuIFN1Yi1jbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIG1ha2UgY2hhbmdlcworCX0gLy8gZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGV0ZXJtaW5pc3RpYygpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8qKgorCSAqIGNvbXB1dGVEaXNlYXNlRGVsdGFzLiBUaGlzIG1ldGhvZCBjYWxjdWxhdGVzIHRoZSBkZWx0YSBjaGFuZ2VzIGZvciBlYWNoIGRpc2Vhc2Ugc3RhdGUgZGVwZW5kaW5nIAorCSAqIG9uIGRpc2Vhc2UgcGFyYW1ldGVycyBhbmQgbWl4aW5nIGZhY3RvcnMKKwkgKiAKKwkgKiBAcGFyYW0gdGltZSAKKwkgKiAJCSAgCSAgU1RFTSB0aW1lCisJICogQHBhcmFtIGN1cnJlbnRTdGF0ZQorCSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvcHVsYXRpb24KKwkgKiBAcGFyYW0gZGlzZWFzZUxhYmVsCisJICogICAgICAgICAgICB0aGUgZGlzZWFzZSBsYWJlbCBmb3Igd2hpY2ggdGhlIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBiZWluZworCSAqICAgICAgICAgICAgY29tcHV0ZWQuCisJICogQHBhcmFtIHRpbWVEZWx0YQorCSAqICAgICAgICAgICAgdGhlIHRpbWUgcGVyaW9kIChtaWxsaXNlY29uZHMpIG92ZXIgd2hpY2ggdGhlIHBvcHVsYXRpb24KKwkgKiAgICAgICAgICAgIG1lbWJlcnMgdHJhbnNpdGlvbiB0byBuZXcgc3RhdGVzCisJICogQHBhcmFtIGN5Y2xlCisJICogCQkJICB0aGUgc2ltdWxhdGlvbiBjeWNsZSB3ZSdyZSBpbgorCSAqIEByZXR1cm4gYSBkaXNlYXNlIHN0YXRlIGxhYmVsIHZhbHVlIHRoYXQgY29udGFpbnMgdGhlIGRlbHRhIGNoYW5nZXMgaW4KKwkgKiAJCSAgIHBvcHVsYXRpb24gbWVtYmVycyBmb3IgZWFjaCBzdGF0ZS4KKwkgKi8KKwkKKwlwdWJsaWMgYWJzdHJhY3QgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGNvbXB1dGVEaXNlYXNlRGVsdGFzKAorCQkJZmluYWwgU1RFTVRpbWUgdGltZSwKKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjdXJyZW50U3RhdGUsCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VMYWJlbCwgCisJCQlmaW5hbCBsb25nIHRpbWVEZWx0YSwgCisJCQlEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHJldHVyblZhbHVlKTsKKworCS8qKgorCSAqIGNvbXB1dGVEaXNlYXNlRGVhdGhzRGVsdGFzIENvbXB1dGUgdGhlIGRlbHRhIHZlY3RvciByZXN1bHRpbmcgZnJvbSBkaXNlYXNlIGRlYXRocworCSAqIAorCSAqIEBwYXJhbSB0aW1lIAorCSAqIAkJCSAgU1RFTSB0aW1lCisJICogQHBhcmFtIGRpc2Vhc2VMYWJlbAorCSAqIEBwYXJhbSBjdXJyZW50TGFiZWxWYWx1ZQorCSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgbGFiZWwgdmFsdWUgb2YgdGhlIGRpc2Vhc2UgbW9kZWwKKwkgKiBAcGFyYW0gdGltZURlbHRhCisJICogICAgICAgICAgICB0aGUgdGltZSBwZXJpb2Qgb3ZlciB3aGljaCB0aGUgcG9wdWxhdGlvbiBtZW1iZXJzIGRpZQorCSAqIEByZXR1cm4gdGhlIGRpc2Vhc2Ugc3RhdGUgbGFiZWwgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YKKwkgKiAgICAgICAgIGRlYXRocyBpbiBlYWNoIHN0YXRlLgorCSAqLworCQorCXB1YmxpYyBhYnN0cmFjdCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY29tcHV0ZURpc2Vhc2VEZWF0aHNEZWx0YXMoCisJCQlmaW5hbCBTVEVNVGltZSB0aW1lLAorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTGFiZWwsCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY3VycmVudExhYmVsVmFsdWUsIAorCQkJZmluYWwgbG9uZyB0aW1lRGVsdGEsIAorCQkJRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSByZXR1cm5WYWx1ZSk7CisKKworCS8qKgorCSAqIEBwYXJhbSBmcmFjdGlvblRvRGVwYXJ0CisJICogQHBhcmFtIG5leHRTdGF0ZQorCSAqIEByZXR1cm4KKwkgKi8KKwlhYnN0cmFjdCBwcm90ZWN0ZWQgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGNvbXB1dGVEZXBhcnR1cmVzKAorCQkJZG91YmxlIGZyYWN0aW9uVG9EZXBhcnQsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBuZXh0U3RhdGUpOworCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVzZXRMYWJlbHMoKSB7CisJCXN1cGVyLnJlc2V0TGFiZWxzKCk7CisKKwkJCisJCQorCQkKKwl9IC8vIHJlc2V0TGFiZWxzCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHRvdGFsUG9wdWxhdGlvbkNvdW50OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHRvdGFsUG9wdWxhdGlvbkNvdW50KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB0b3RhbFBvcHVsYXRpb25Db3VudFJlY2lwcm9jYWw6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQodG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB0b3RhbEFyZWE6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQodG90YWxBcmVhKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCByZWZlcmVuY2VQb3B1bGF0aW9uRGVuc2l0eTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChyZWZlcmVuY2VQb3B1bGF0aW9uRGVuc2l0eSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbEltcGwjc2FuZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2FuZSgpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHN1cGVyLnNhbmUoKTsKKworCQlyZXRWYWx1ZSA9IHJldFZhbHVlCisJCQkJJiYgdG90YWxQb3B1bGF0aW9uQ291bnQgPj0gVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9FREVGQVVMVDsKKwkJYXNzZXJ0IHJldFZhbHVlOworCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgIURvdWJsZS5pc0luZmluaXRlKHRvdGFsUG9wdWxhdGlvbkNvdW50KTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiAhRG91YmxlLmlzTmFOKHRvdGFsUG9wdWxhdGlvbkNvdW50KTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZQorCQkJCSYmIHRvdGFsUG9wdWxhdGlvbkNvdW50UmVjaXByb2NhbCA+PSBUT1RBTF9QT1BVTEFUSU9OX0NPVU5UX1JFQ0lQUk9DQUxfRURFRkFVTFQ7CisJCWFzc2VydCByZXRWYWx1ZTsKKworCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmICFEb3VibGUuaXNJbmZpbml0ZSh0b3RhbFBvcHVsYXRpb25Db3VudFJlY2lwcm9jYWwpOworCQlhc3NlcnQgcmV0VmFsdWU7CisJCQorCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmICFEb3VibGUuaXNOYU4odG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsKTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiB0b3RhbEFyZWEgPj0gVE9UQUxfQVJFQV9FREVGQVVMVDsKKwkJYXNzZXJ0IHJldFZhbHVlOworCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgIURvdWJsZS5pc0luZmluaXRlKHRvdGFsQXJlYSk7CisJCWFzc2VydCByZXRWYWx1ZTsKKwkJCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgIURvdWJsZS5pc05hTih0b3RhbEFyZWEpOworCQlhc3NlcnQgcmV0VmFsdWU7CisJCQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBzYW5lCisKK30gLy8gU3RhbmRhcmREaXNlYXNlTW9kZWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1N0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1N0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM4YTVmMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbEltcGwuamF2YQpAQCAtMCwwICsxLDExNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNlYXNlIE1vZGVsIExhYmVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbEltcGwgZXh0ZW5kcworCQlEaXNlYXNlTW9kZWxMYWJlbEltcGwgaW1wbGVtZW50cyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuRHluYW1pY0xhYmVsSW1wbCNyZXNldCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCS8vIFRoZSBjYWxsIHRvIHN1cGVyLnJlc2V0IHdpbGwgcmVzZXQgdGhlIGxhYmVsIHZhbHVlIG9mIHRoaXMgbGFiZWwKKwkJLy8gd2hpY2ggd2lsbCB6ZXJvIG91dCBhbGwgb2YgdGhlIGRpc2Vhc2Ugc3RhdGUgdmFsdWVzLgorCQlzdXBlci5yZXNldCgpOworCQlnZXRUZW1wVmFsdWUoKS5yZXNldCgpOworCQlnZXREZWx0YVZhbHVlKCkucmVzZXQoKTsKKwkJZ2V0RXJyb3JTY2FsZSgpLnJlc2V0KCk7CisJCWdldFByb2JlVmFsdWUoKS5yZXNldCgpOworCQkvLyBJcyB0aGVyZSBhIHBvcHVsYXRpb24gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2U/CisJCWlmIChnZXRQb3B1bGF0aW9uTW9kZWxMYWJlbCgpICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJLy8gT2ssIHNldCB0aGUgc3VzY2VwdGlibGUgcG9wdWxhdGlvbiB0byB0aGUgY291bnQgb2YgdGhlIG51bWJlciBvZgorCQkJLy8gcG9wdWxhdGlvbiBtZW1iZXJzCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgc1ZhbHVlID0gKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSlnZXRDdXJyZW50VmFsdWUoKTsKKworCQkJc1ZhbHVlLnNldFMoKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKS5nZXRDdXJyZW50VmFsdWUoKSkKKwkJCQkJLmdldENvdW50KCkpOworCQl9IC8vIGlmCisKKwl9IC8vIHJlc2V0CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBsYWJlbCwgaS5lLiB0aGUgcG9wdWxhdGlvbiBpZGVudGlmaWVyCisJICogCisJICogQHJldHVybiBTdHJpbmcgVGhlIGlkZW50aWZpZXIKKwkgKi8KKwkKKwlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7CisJCXJldHVybiB0aGlzLmdldFBvcHVsYXRpb25Nb2RlbExhYmVsKCkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKwl9CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUw7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCNnZXRTKCkKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFMoKSB7CisJCXJldHVybiAoKChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpZ2V0Q3VycmVudFZhbHVlKCkpKS5nZXRTKCk7CisJfSAvLyBnZXRTCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsI3NldFMoZG91YmxlKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFMoZG91YmxlIHMpIHsKKwkJKCgoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKWdldEN1cnJlbnRWYWx1ZSgpKSkuc2V0UyhzKTsKKwl9IC8vIHNldFMKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwjZ2V0TmV4dFMoKQorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0TmV4dFMoKSB7CisJCXJldHVybiAoKChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpZ2V0TmV4dFZhbHVlKCkpKS5nZXRTKCk7CisJfSAvLyBnZXROZXh0UworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCNzZXROZXh0Uyhkb3VibGUpCisJICovCisJcHVibGljIHZvaWQgc2V0TmV4dFMoZG91YmxlIHMpIHsKKwkJKCgoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKWdldE5leHRWYWx1ZSgpKSkuc2V0UyhzKTsKKwl9IC8vIHNldE5leHRTCisKK30gLy8gU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJjZDcwMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzI4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzZWFzZSBNb2RlbCBMYWJlbCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbCNnZXRTIDxlbT5TPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbCBleHRlbmRzCisJCURpc2Vhc2VNb2RlbExhYmVsVmFsdWVJbXBsIGltcGxlbWVudHMgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNQkVSX09GX0ZSQUNUSU9OQUxfRElHSVRTID0gMjsKKworCXByaXZhdGUgc3RhdGljIE51bWJlckZvcm1hdCBmb3JtYXR0ZXIgPSBudWxsOworCisJLyoqCisJICogQHJldHVybiBhIG51bWJlciBmb3JtYXR0ZXIKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIE51bWJlckZvcm1hdCBnZXRGb3JtYXR0ZXIoKSB7CisJCS8vIElzIHRoZXJlIGFscmVhZHkgYSBmb3JtYXR0ZXI/CisJCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgeworCQkJLy8gTm8KKwkJCWZvcm1hdHRlciA9IE51bWJlckZvcm1hdC5nZXROdW1iZXJJbnN0YW5jZSgpOworCQkJZm9ybWF0dGVyLnNldE1heGltdW1GcmFjdGlvbkRpZ2l0cyhOVU1CRVJfT0ZfRlJBQ1RJT05BTF9ESUdJVFMpOworCQkJZm9ybWF0dGVyLnNldE1pbmltdW1GcmFjdGlvbkRpZ2l0cyhOVU1CRVJfT0ZfRlJBQ1RJT05BTF9ESUdJVFMpOworCQl9CisJCXJldHVybiBmb3JtYXR0ZXI7CisJfSAvLyBnZXRGb3JtYXR0ZXIKKwkKKwkKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UygpIDxlbT5TPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSAjZ2V0UygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgU19FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFMoKSA8ZW0+UzwvZW0+fScgYXR0cmlidXRlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI2dldFMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgcyA9IFNfRURFRkFVTFQ7CisKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGluc3RhbmNlcyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKwkgKiAKKwkgKiBAcGFyYW0gcworCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBzdXNjZXB0aWJsZSBwb3B1bGF0aW9uIG1lbWJlcnMKKwkgKiAKKwkgKiBAcGFyYW0gYmlydGhzCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJpcnRocyB0aGF0IGhhdmUgb2NjdXJlZCBpbiB0aGUgcG9wdWxhdGlvbgorCSAqIEBwYXJhbSBkZWF0aHMKKwkgKiAgICAgICAgICAgIHRoZSB0b3RhbCBudW1iZXIgb2YgZGVhdGhzIHRoYXQgaGF2ZSBvY2N1cmVkIGluIHRoZSBwb3B1bGF0aW9uCisJICogQHBhcmFtIGRpc2Vhc2VEZWF0aHMKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGVhdGhzIGR1ZSB0byB0aGUgZGlzZWFzZSB0aGF0IGhhdmUgb2NjdXJlZCBpbgorCSAqICAgICAgICAgICAgdGhlIHBvcHVsYXRpb24KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKi8KKwlwdWJsaWMgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbChmaW5hbCBkb3VibGUgcywKKwkJCWZpbmFsIGRvdWJsZSBkaXNlYXNlRGVhdGhzKSB7CisJCXN1cGVyKGRpc2Vhc2VEZWF0aHMpOworCQl0aGlzLnMgPSBzOworCX0gLy8gU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0UygpIHsKKwkJcmV0dXJuIHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmV3UworCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTKGRvdWJsZSBuZXdTKSB7CisJCWRvdWJsZSBvbGRTID0gczsKKwkJcyA9IG5ld1M7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19TLCBvbGRTLCBzKSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbCNnZXRQb3B1bGF0aW9uQ291bnQoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBkb3VibGUgZ2V0UG9wdWxhdGlvbkNvdW50KCkgeworCQlyZXR1cm4gczsKKwl9IC8vIGdldFBvcHVsYXRpb25Db3VudAorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgemVyb091dFBvcHVsYXRpb25Db3VudCgpIHsKKwkJc2V0UyhTX0VERUZBVUxUKTsKKwl9IC8vIHplcm9PdXRQb3B1bGF0aW9uQ291bnQKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWVJbXBsI3NldChvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSkKKwkgKi8KKworCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHNldChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgdmFsdWUpIHsKKwkJc3VwZXIuc2V0KChEaXNlYXNlTW9kZWxMYWJlbFZhbHVlKXZhbHVlKTsKKwkJc2V0UygoKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSkgdmFsdWUpLmdldFMoKSk7CisJCXJldHVybiB0aGlzOworCX0gLy8gc2V0CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWVJbXBsI2FkZChvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSkKKwkgKi8KKworCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGFkZChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgdmFsdWUpIHsKKwkKKwkJc3VwZXIuYWRkKChEaXNlYXNlTW9kZWxMYWJlbFZhbHVlKXZhbHVlKTsKKwkJc2V0UyhnZXRTKCkgKyAoKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSkgdmFsdWUpLmdldFMoKSk7CisJCXNldERpc2Vhc2VEZWF0aHMoZ2V0RGlzZWFzZURlYXRocygpICsgKChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpIHZhbHVlKS5nZXREaXNlYXNlRGVhdGhzKCkpOworCQlyZXR1cm4gdGhpczsKKwl9IC8vIGFkZAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlSW1wbCNzdWIob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUpCisJICovCisKKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBzdWIoSW50ZWdyYXRpb25MYWJlbFZhbHVlIHZhbHVlKSB7CisJCXN1cGVyLnN1YigoRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSl2YWx1ZSk7CisJCXNldFMoZ2V0UygpIC0gKChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpIHZhbHVlKS5nZXRTKCkpOworCQlzZXREaXNlYXNlRGVhdGhzKGdldERpc2Vhc2VEZWF0aHMoKSAtICgoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKSB2YWx1ZSkuZ2V0RGlzZWFzZURlYXRocygpKTsKKwkJcmV0dXJuIHRoaXM7CisJfSAvLyBzdWIKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBzY2FsZShkb3VibGUgc2NhbGVGYWN0b3IpIHsKKwkJc3VwZXIuc2NhbGUoc2NhbGVGYWN0b3IpOworCQlzZXRTKGdldFMoKSAqc2NhbGVGYWN0b3IpOworCQlzZXREaXNlYXNlRGVhdGhzKGdldERpc2Vhc2VEZWF0aHMoKSpzY2FsZUZhY3Rvcik7CisJCXJldHVybiB0aGlzOworCX0gLy8gc2NhbGUKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWVJbXBsI3Jlc2V0KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJc3VwZXIucmVzZXQoKTsKKwkJc2V0UyhTX0VERUZBVUxUKTsKKwl9IC8vIHJlc2V0CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWVJbXBsI3NhbmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5zYW5lKCk7CisKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiBzID49IFNfRURFRkFVTFQ7CisJCWFzc2VydCByZXRWYWx1ZTsKKworCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIHMgPD0gTUFYX1BPUFVMQVRJT05fVkFMVUU7CisJCWFzc2VydCByZXRWYWx1ZTsJCQorCQkKKwkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiAhRG91YmxlLmlzSW5maW5pdGUocyk7CisJCWFzc2VydCByZXRWYWx1ZTsKKwkJCisJCXJldFZhbHVlID0gcmV0VmFsdWUgJiYgIURvdWJsZS5pc05hTihzKTsKKwkJYXNzZXJ0IHJldFZhbHVlOworCQkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gc2FuZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogQHBhcmFtIHJlc29sdmUKKwkgKiBAcGFyYW0gY29yZVR5cGUKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfX1M6CisJCQkJcmV0dXJuIGdldFMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiBAcGFyYW0gbmV3VmFsdWUKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfX1M6CisJCQkJc2V0UygoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBmZWF0dXJlSUQKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfX1M6CisJCQkJc2V0UyhTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fUzoKKwkJCQlyZXR1cm4gcyAhPSBTX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKQorCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChzOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGdldEZvcm1hdHRlcigpLmZvcm1hdChzKSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0gLy8gdG9TdHJpbmcKKworfSAvLyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1N0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1N0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlYmI2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZUltcGwuamF2YQpAQCAtMCwwICsxLDE5NiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNlYXNlIE1vZGVsIFN0YXRlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlSW1wbCNnZXRBcmVhUmF0aW8gPGVtPkFyZWEgUmF0aW88L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlSW1wbCBleHRlbmRzCisJCURpc2Vhc2VNb2RlbFN0YXRlSW1wbCBpbXBsZW1lbnRzIFN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcmVhUmF0aW8oKSA8ZW0+QXJlYSBSYXRpbzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QXJlYVJhdGlvKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBBUkVBX1JBVElPX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJlYVJhdGlvKCkgPGVtPkFyZWEgUmF0aW88L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFyZWFSYXRpbygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBhcmVhUmF0aW8gPSBBUkVBX1JBVElPX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLkRpc2Vhc2VNb2RlbFN0YXRlSW1wbCNzYW5lKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzYW5lKCkgeworCQlib29sZWFuIHJldFZhbHVlID0gc3VwZXIuc2FuZSgpOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHNhbmUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVEFOREFSRF9ESVNFQVNFX01PREVMX1NUQVRFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0QXJlYVJhdGlvKCkgeworCQlyZXR1cm4gYXJlYVJhdGlvOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEFyZWFSYXRpbyhkb3VibGUgbmV3QXJlYVJhdGlvKSB7CisJCWRvdWJsZSBvbGRBcmVhUmF0aW8gPSBhcmVhUmF0aW87CisJCWFyZWFSYXRpbyA9IG5ld0FyZWFSYXRpbzsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfU1RBVEVfX0FSRUFfUkFUSU8sIG9sZEFyZWFSYXRpbywgYXJlYVJhdGlvKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogQHBhcmFtIHJlc29sdmUKKwkgKiBAcGFyYW0gY29yZVR5cGUKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfU1RBVEVfX0FSRUFfUkFUSU86CisJCQkJcmV0dXJuIGdldEFyZWFSYXRpbygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGZlYXR1cmVJRAorCSAqIEBwYXJhbSBuZXdWYWx1ZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9TVEFURV9fQVJFQV9SQVRJTzoKKwkJCQlzZXRBcmVhUmF0aW8oKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX1NUQVRFX19BUkVBX1JBVElPOgorCQkJCXNldEFyZWFSYXRpbyhBUkVBX1JBVElPX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlECisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9TVEFURV9fQVJFQV9SQVRJTzoKKwkJCQlyZXR1cm4gYXJlYVJhdGlvICE9IEFSRUFfUkFUSU9fRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoYXJlYVJhdGlvOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGFyZWFSYXRpbyk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvLyBTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TdGFuZGFyZEZhY3RvcnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1N0YW5kYXJkRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjM1M2MzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TdGFuZGFyZEZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSw0NTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKy8vaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJRGlzZWFzZU1vZGVsU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJSW5mZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBTdGFuZGFyZEZhY3RvcnkgeworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0YW5kYXJkRmFjdG9yeSBpbml0KCkgeworCQl0cnkgeworCQkJU3RhbmRhcmRGYWN0b3J5IHRoZVN0YW5kYXJkRmFjdG9yeSA9IChTdGFuZGFyZEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkLmVjb3JlIik7IC8vJE5PTi1OTFMtMSQgCisJCQlpZiAodGhlU3RhbmRhcmRGYWN0b3J5ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdGhlU3RhbmRhcmRGYWN0b3J5OworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IFN0YW5kYXJkRmFjdG9yeUltcGwoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdGFuZGFyZEZhY3RvcnlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7CisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ERVRFUk1JTklTVElDX1NFSVJfRElTRUFTRV9NT0RFTDogcmV0dXJuIGNyZWF0ZURldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ERVRFUk1JTklTVElDX1NJX0RJU0VBU0VfTU9ERUw6IHJldHVybiBjcmVhdGVEZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWwoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRFVEVSTUlOSVNUSUNfU0lSX0RJU0VBU0VfTU9ERUw6IHJldHVybiBjcmVhdGVEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUlSX0xBQkVMOiByZXR1cm4gY3JlYXRlU0VJUkxhYmVsKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUlSX0xBQkVMX1ZBTFVFOiByZXR1cm4gY3JlYXRlU0VJUkxhYmVsVmFsdWUoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX0RJU0VBU0VfTU9ERUxfU1RBVEU6IHJldHVybiBjcmVhdGVTSURpc2Vhc2VNb2RlbFN0YXRlKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9JTkZFQ1RPUjogcmV0dXJuIGNyZWF0ZVNJSW5mZWN0b3IoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX0xBQkVMOiByZXR1cm4gY3JlYXRlU0lMYWJlbCgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfTEFCRUxfVkFMVUU6IHJldHVybiBjcmVhdGVTSUxhYmVsVmFsdWUoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJUl9MQUJFTDogcmV0dXJuIGNyZWF0ZVNJUkxhYmVsKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSVJfTEFCRUxfVkFMVUU6IHJldHVybiBjcmVhdGVTSVJMYWJlbFZhbHVlKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTDogcmV0dXJuIGNyZWF0ZVN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJX0RJU0VBU0VfTU9ERUw6IHJldHVybiBjcmVhdGVTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUw6IHJldHVybiBjcmVhdGVTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5BR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMOiByZXR1cm4gY3JlYXRlQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbCgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuQUdHUkVHQVRJTkdfRElTRUFTRV9NT0RFTF9TVEFURTogcmV0dXJuIGNyZWF0ZUFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkFHR1JFR0FUSU5HX1NFSVJfRElTRUFTRV9NT0RFTDogcmV0dXJuIGNyZWF0ZUFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbCgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuQUdHUkVHQVRJTkdfU0lSX0RJU0VBU0VfTU9ERUw6IHJldHVybiBjcmVhdGVBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lSX0lOT0NVTEFUT1I6IHJldHVybiBjcmVhdGVTSVJJbm9jdWxhdG9yKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1BPSVNTT05fU0lfRElTRUFTRV9NT0RFTDogcmV0dXJuIGNyZWF0ZVN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfUE9JU1NPTl9TSVJfRElTRUFTRV9NT0RFTDogcmV0dXJuIGNyZWF0ZVN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMOiByZXR1cm4gY3JlYXRlU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5JTkZFQ1RPUl9JTk9DVUxBVE9SX0NPTExFQ1RJT046IHJldHVybiBjcmVhdGVJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uKCk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlVSSToKKwkJCQlyZXR1cm4gY3JlYXRlVVJJRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5FTElTVDoKKwkJCQlyZXR1cm4gY3JlYXRlRUxpc3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlJBTkRPTToKKwkJCQlyZXR1cm4gY3JlYXRlUmFuZG9tRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlVSSToKKwkJCQlyZXR1cm4gY29udmVydFVSSVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5FTElTVDoKKwkJCQlyZXR1cm4gY29udmVydEVMaXN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlJBTkRPTToKKwkJCQlyZXR1cm4gY29udmVydFJhbmRvbVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsIGNyZWF0ZURldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsKCkgeworCQlEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbEltcGwgZGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwgPSBuZXcgRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWxJbXBsKCk7CisJCXJldHVybiBkZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsIGNyZWF0ZURldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbCgpIHsKKwkJRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsSW1wbCBkZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWwgPSBuZXcgRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsSW1wbCgpOworCQlyZXR1cm4gZGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsIGNyZWF0ZURldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwoKSB7CisJCURldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWxJbXBsIGRldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwgPSBuZXcgRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwoKTsKKwkJcmV0dXJuIGRldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNFSVJMYWJlbCBjcmVhdGVTRUlSTGFiZWwoKSB7CisJCVNFSVJMYWJlbEltcGwgc2VpckxhYmVsID0gbmV3IFNFSVJMYWJlbEltcGwoKTsKKwkJcmV0dXJuIHNlaXJMYWJlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU0VJUkxhYmVsVmFsdWUgY3JlYXRlU0VJUkxhYmVsVmFsdWUoKSB7CisJCVNFSVJMYWJlbFZhbHVlSW1wbCBzZWlyTGFiZWxWYWx1ZSA9IG5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoKTsKKwkJcmV0dXJuIHNlaXJMYWJlbFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTSURpc2Vhc2VNb2RlbFN0YXRlIGNyZWF0ZVNJRGlzZWFzZU1vZGVsU3RhdGUoKSB7CisJCVNJRGlzZWFzZU1vZGVsU3RhdGVJbXBsIHNpRGlzZWFzZU1vZGVsU3RhdGUgPSBuZXcgU0lEaXNlYXNlTW9kZWxTdGF0ZUltcGwoKTsKKwkJcmV0dXJuIHNpRGlzZWFzZU1vZGVsU3RhdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJSW5mZWN0b3IgY3JlYXRlU0lJbmZlY3RvcigpIHsKKwkJU0lJbmZlY3RvckltcGwgc2lJbmZlY3RvciA9IG5ldyBTSUluZmVjdG9ySW1wbCgpOworCQlyZXR1cm4gc2lJbmZlY3RvcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU0lMYWJlbCBjcmVhdGVTSUxhYmVsKCkgeworCQlTSUxhYmVsSW1wbCBzaUxhYmVsID0gbmV3IFNJTGFiZWxJbXBsKCk7CisJCXJldHVybiBzaUxhYmVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTSUxhYmVsVmFsdWUgY3JlYXRlU0lMYWJlbFZhbHVlKCkgeworCQlTSUxhYmVsVmFsdWVJbXBsIHNpTGFiZWxWYWx1ZSA9IG5ldyBTSUxhYmVsVmFsdWVJbXBsKCk7CisJCXJldHVybiBzaUxhYmVsVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJUkxhYmVsIGNyZWF0ZVNJUkxhYmVsKCkgeworCQlTSVJMYWJlbEltcGwgc2lyTGFiZWwgPSBuZXcgU0lSTGFiZWxJbXBsKCk7CisJCXJldHVybiBzaXJMYWJlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU0lSTGFiZWxWYWx1ZSBjcmVhdGVTSVJMYWJlbFZhbHVlKCkgeworCQlTSVJMYWJlbFZhbHVlSW1wbCBzaXJMYWJlbFZhbHVlID0gbmV3IFNJUkxhYmVsVmFsdWVJbXBsKCk7CisJCXJldHVybiBzaXJMYWJlbFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCBjcmVhdGVTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCgpIHsKKwkJU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxJbXBsIHN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsID0gbmV3IFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsSW1wbCgpOworCQlyZXR1cm4gc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbCBjcmVhdGVTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwoKSB7CisJCVN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbEltcGwgc3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsID0gbmV3IFN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbEltcGwoKTsKKwkJcmV0dXJuIHN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCBjcmVhdGVTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsKCkgeworCQlTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSW1wbCBzdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsID0gbmV3IFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxJbXBsKCk7CisJCXJldHVybiBzdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsIGNyZWF0ZUFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwoKSB7CisJCUFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxJbXBsIGFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwgPSBuZXcgQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbEltcGwoKTsKKwkJcmV0dXJuIGFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUgY3JlYXRlQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZSgpIHsKKwkJQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZUltcGwgYWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZSA9IG5ldyBBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlSW1wbCgpOworCQlyZXR1cm4gYWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsIGNyZWF0ZUFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbCgpIHsKKwkJQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsSW1wbCBhZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwgPSBuZXcgQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsSW1wbCgpOworCQlyZXR1cm4gYWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCBjcmVhdGVBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCgpIHsKKwkJQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxJbXBsIGFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsID0gbmV3IEFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsSW1wbCgpOworCQlyZXR1cm4gYWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJUklub2N1bGF0b3IgY3JlYXRlU0lSSW5vY3VsYXRvcigpIHsKKwkJU0lSSW5vY3VsYXRvckltcGwgc2lySW5vY3VsYXRvciA9IG5ldyBTSVJJbm9jdWxhdG9ySW1wbCgpOworCQlyZXR1cm4gc2lySW5vY3VsYXRvcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbCBjcmVhdGVTdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsKCkgeworCQlTdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsSW1wbCBzdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsID0gbmV3IFN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWxJbXBsKCk7CisJCXJldHVybiBzdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbCBjcmVhdGVTdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbCgpIHsKKwkJU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxJbXBsIHN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsID0gbmV3IFN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsSW1wbCgpOworCQlyZXR1cm4gc3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbCBjcmVhdGVTdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwoKSB7CisJCVN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbEltcGwgc3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsID0gbmV3IFN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbEltcGwoKTsKKwkJcmV0dXJuIHN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbiBjcmVhdGVJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uKCkgeworCQlJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uSW1wbCBpbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uID0gbmV3IEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25JbXBsKCk7CisJCXJldHVybiBpbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFVSSSBjcmVhdGVVUklGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoaW5pdGlhbFZhbHVlKTsKKwl9IC8vIGNyZWF0ZVVSSUZyb21TdHJpbmcKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0VVJJVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKwl9IC8vIGNvbnZlcnRVUklUb1N0cmluZworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0IGNyZWF0ZUVMaXN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCXJldHVybiAoRUxpc3Qpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0RUxpc3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBSYW5kb20gY3JlYXRlUmFuZG9tRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCXJldHVybiBuZXcgUmFuZG9tKExvbmcucGFyc2VMb25nKGluaXRpYWxWYWx1ZSkpOworCX0gLy8gY3JlYXRlUmFuZG9tRnJvbVN0cmluZworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0UmFuZG9tVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdGFuZGFyZFBhY2thZ2UgZ2V0U3RhbmRhcmRQYWNrYWdlKCkgeworCQlyZXR1cm4gKFN0YW5kYXJkUGFja2FnZSlnZXRFUGFja2FnZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGRlcHJlY2F0ZWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQERlcHJlY2F0ZWQKKwlwdWJsaWMgc3RhdGljIFN0YW5kYXJkUGFja2FnZSBnZXRQYWNrYWdlKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRTsKKwl9CisKK30gLy9TdGFuZGFyZEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1N0YW5kYXJkSW5mZWN0b3JJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1N0YW5kYXJkSW5mZWN0b3JJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiNjQ0MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RhbmRhcmRJbmZlY3RvckltcGwuamF2YQpAQCAtMCwwICsxLDUyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkSW5mZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5mZWN0b3I8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGFuZGFyZEluZmVjdG9ySW1wbCBleHRlbmRzIEluZmVjdG9ySW1wbCBpbXBsZW1lbnRzCisJCVN0YW5kYXJkSW5mZWN0b3IgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RhbmRhcmRJbmZlY3RvckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUQU5EQVJEX0lORkVDVE9SOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTm9kZURlY29yYXRvckltcGwjc2FuZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2FuZSgpIHsKKwkJcmV0dXJuIHN1cGVyLnNhbmUoKTsKKwl9Cit9IC8vIFN0YW5kYXJkSW5mZWN0b3JJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1N0YW5kYXJkUGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RhbmRhcmRQYWNrYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzlhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1N0YW5kYXJkUGFja2FnZUltcGwuamF2YQpAQCAtMCwwICsxLDE5NjMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKy8vaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVHZW5lcmljVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSURpc2Vhc2VNb2RlbFN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUluZmVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUklub2N1bGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkSW5mZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBTdGFuZGFyZFBhY2thZ2UgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBkZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGRpc2Vhc2VNb2RlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBkaXNlYXNlTW9kZWxMYWJlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBkaXNlYXNlTW9kZWxMYWJlbFZhbHVlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGRpc2Vhc2VNb2RlbFN0YXRlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGluZmVjdG9yRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHNlaXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc2VpckxhYmVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHNlaXJMYWJlbFZhbHVlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHNpRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHNpRGlzZWFzZU1vZGVsU3RhdGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc2lJbmZlY3RvckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzaUxhYmVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHNpTGFiZWxWYWx1ZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzaXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc2lyTGFiZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc2lyTGFiZWxWYWx1ZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzdGFuZGFyZERpc2Vhc2VNb2RlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHN0YW5kYXJkSW5mZWN0b3JFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc2FuaXR5Q2hlY2tlckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBpbnRlZ3JhdGlvbkxhYmVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGludGVncmF0aW9uTGFiZWxWYWx1ZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBpbnRlZ3JhdGlvbkRlY29yYXRvckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBhZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgYWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHN0b2NoYXN0aWNEaXNlYXNlTW9kZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHNpcklub2N1bGF0b3JFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgaW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbkVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVEYXRhVHlwZSB1cmlFRGF0YVR5cGUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRGF0YVR5cGUgZUxpc3RFRGF0YVR5cGUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRGF0YVR5cGUgcmFuZG9tRURhdGFUeXBlID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQorCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgorCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKKwkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcworCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCisJICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZU5TX1VSSQorCSAqIEBzZWUgI2luaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIFN0YW5kYXJkUGFja2FnZUltcGwoKSB7CisJCXN1cGVyKGVOU19VUkksIFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIFN0YW5kYXJkUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KKwkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZU5TX1VSSQorCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCisJICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RhbmRhcmRQYWNrYWdlIGluaXQoKSB7CisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChTdGFuZGFyZFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU3RhbmRhcmRQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKwkJU3RhbmRhcmRQYWNrYWdlSW1wbCB0aGVTdGFuZGFyZFBhY2thZ2UgPSAoU3RhbmRhcmRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgU3RhbmRhcmRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBTdGFuZGFyZFBhY2thZ2VJbXBsKCkpOworCisJCWlzSW5pdGVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKKwkJb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisKKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKKwkJdGhlU3RhbmRhcmRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKwkJdGhlU3RhbmRhcmRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCisJCXRoZVN0YW5kYXJkUGFja2FnZS5mcmVlemUoKTsKKworICAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChTdGFuZGFyZFBhY2thZ2UuZU5TX1VSSSwgdGhlU3RhbmRhcmRQYWNrYWdlKTsKKwkJcmV0dXJuIHRoZVN0YW5kYXJkUGFja2FnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldERldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsKCkgeworCQlyZXR1cm4gZGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXREZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWwoKSB7CisJCXJldHVybiBkZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXREZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsKCkgeworCQlyZXR1cm4gZGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldERpc2Vhc2VNb2RlbCgpIHsKKwkJcmV0dXJuIGRpc2Vhc2VNb2RlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaXNlYXNlTW9kZWxfQmFja2dyb3VuZE1vcnRhbGl0eVJhdGUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaXNlYXNlTW9kZWxfUG9wdWxhdGlvbklkZW50aWZpZXIoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaXNlYXNlTW9kZWxfVGltZVBlcmlvZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERpc2Vhc2VNb2RlbF9EaXNlYXNlTmFtZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERpc2Vhc2VNb2RlbF9SZWxhdGl2ZVRvbGVyYW5jZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERpc2Vhc2VNb2RlbF9GaW5pdGVEaWZmZXJlbmNlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlzZWFzZU1vZGVsX0ZyZXF1ZW5jeURlcGVuZGVudCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERpc2Vhc2VNb2RlbF9CYWNrZ3JvdW5kQmlydGhSYXRlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXREaXNlYXNlTW9kZWxMYWJlbCgpIHsKKwkJcmV0dXJuIGRpc2Vhc2VNb2RlbExhYmVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldERpc2Vhc2VNb2RlbExhYmVsX1BvcHVsYXRpb25MYWJlbCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWRpc2Vhc2VNb2RlbExhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzZWFzZU1vZGVsTGFiZWxfRGlzZWFzZU1vZGVsU3RhdGUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlkaXNlYXNlTW9kZWxMYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldERpc2Vhc2VNb2RlbExhYmVsX1BvcHVsYXRpb25Nb2RlbExhYmVsKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpZGlzZWFzZU1vZGVsTGFiZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldERpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKSB7CisJCXJldHVybiBkaXNlYXNlTW9kZWxMYWJlbFZhbHVlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERpc2Vhc2VNb2RlbExhYmVsVmFsdWVfRGlzZWFzZURlYXRocygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2Vhc2VNb2RlbExhYmVsVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaXNlYXNlTW9kZWxMYWJlbFZhbHVlX1BvcHVsYXRpb25Db3VudCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2Vhc2VNb2RlbExhYmVsVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaXNlYXNlTW9kZWxMYWJlbFZhbHVlX0luY2lkZW5jZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2Vhc2VNb2RlbExhYmVsVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldERpc2Vhc2VNb2RlbFN0YXRlKCkgeworCQlyZXR1cm4gZGlzZWFzZU1vZGVsU3RhdGVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzZWFzZU1vZGVsU3RhdGVfTGFiZWwoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlkaXNlYXNlTW9kZWxTdGF0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SW5mZWN0b3IoKSB7CisJCXJldHVybiBpbmZlY3RvckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbmZlY3Rvcl9EaXNlYXNlTW9kZWwoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlpbmZlY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEluZmVjdG9yX1RhcmdldFVSSSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWluZmVjdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW5mZWN0b3JfRGlzZWFzZU5hbWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlpbmZlY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEluZmVjdG9yX1RhcmdldElTT0tleSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWluZmVjdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0SW5mZWN0b3JfTGFiZWxzVG9JbmZlY3QoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlpbmZlY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEluZmVjdG9yX1BvcHVsYXRpb25JZGVudGlmaWVyKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW5mZWN0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbmZlY3Rvcl9JbmZlY3RQZXJjZW50YWdlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW5mZWN0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNFSVIoKSB7CisJCXJldHVybiBzZWlyRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNFSVJfSW5jdWJhdGlvblJhdGUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzZWlyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTRUlSTGFiZWwoKSB7CisJCXJldHVybiBzZWlyTGFiZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0VJUkxhYmVsX0RlbHRhVmFsdWUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzZWlyTGFiZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRUlSTGFiZWxfUHJvYmVWYWx1ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNlaXJMYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNFSVJMYWJlbF9UZW1wVmFsdWUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzZWlyTGFiZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTRUlSTGFiZWxfT3JpZ2luYWxWYWx1ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNlaXJMYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNFSVJMYWJlbF9FcnJvclNjYWxlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VpckxhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTRUlSTGFiZWxWYWx1ZSgpIHsKKwkJcmV0dXJuIHNlaXJMYWJlbFZhbHVlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNFSVJMYWJlbFZhbHVlX0UoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzZWlyTGFiZWxWYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U0koKSB7CisJCXJldHVybiBzaUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTSV9UcmFuc21pc3Npb25SYXRlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2lFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTSV9Ob25MaW5lYXJpdHlDb2VmZmljaWVudCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNpRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U0lfUmVjb3ZlcnlSYXRlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2lFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTSV9JbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNpRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U0lfUGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb24oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzaUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNJX1JvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzaUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNJX0luZmVjdGlvdXNNb3J0YWxpdHkoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzaUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNJX0NoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2UoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzaUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U0lEaXNlYXNlTW9kZWxTdGF0ZSgpIHsKKwkJcmV0dXJuIHNpRGlzZWFzZU1vZGVsU3RhdGVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTSUluZmVjdG9yKCkgeworCQlyZXR1cm4gc2lJbmZlY3RvckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTSUluZmVjdG9yX0luZmVjdGlvdXNDb3VudCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNpSW5mZWN0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNJTGFiZWwoKSB7CisJCXJldHVybiBzaUxhYmVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNJTGFiZWxfRGVsdGFWYWx1ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNpTGFiZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTSUxhYmVsX1Byb2JlVmFsdWUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzaUxhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0lMYWJlbF9UZW1wVmFsdWUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzaUxhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0lMYWJlbF9PcmlnaW5hbFZhbHVlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2lMYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNJTGFiZWxfRXJyb3JTY2FsZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNpTGFiZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNJTGFiZWxWYWx1ZSgpIHsKKwkJcmV0dXJuIHNpTGFiZWxWYWx1ZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTSUxhYmVsVmFsdWVfSSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNpTGFiZWxWYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U0lSKCkgeworCQlyZXR1cm4gc2lyRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNJUl9JbW11bml0eUxvc3NSYXRlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2lyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTSVJMYWJlbCgpIHsKKwkJcmV0dXJuIHNpckxhYmVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNJUkxhYmVsX0RlbHRhVmFsdWUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzaXJMYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNJUkxhYmVsX1Byb2JlVmFsdWUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzaXJMYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNJUkxhYmVsX1RlbXBWYWx1ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNpckxhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0lSTGFiZWxfT3JpZ2luYWxWYWx1ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNpckxhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U0lSTGFiZWxfRXJyb3JTY2FsZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNpckxhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTSVJMYWJlbFZhbHVlKCkgeworCQlyZXR1cm4gc2lyTGFiZWxWYWx1ZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTSVJMYWJlbFZhbHVlX1IoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzaXJMYWJlbFZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTdGFuZGFyZERpc2Vhc2VNb2RlbCgpIHsKKwkJcmV0dXJuIHN0YW5kYXJkRGlzZWFzZU1vZGVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFN0YW5kYXJkRGlzZWFzZU1vZGVsX1RvdGFsUG9wdWxhdGlvbkNvdW50KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc3RhbmRhcmREaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTdGFuZGFyZERpc2Vhc2VNb2RlbF9Ub3RhbFBvcHVsYXRpb25Db3VudFJlY2lwcm9jYWwoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzdGFuZGFyZERpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFN0YW5kYXJkRGlzZWFzZU1vZGVsX1RvdGFsQXJlYSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXN0YW5kYXJkRGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxfUmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHkoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzdGFuZGFyZERpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCgpIHsKKwkJcmV0dXJuIHN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKSB7CisJCXJldHVybiBzdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlX1MoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUoKSB7CisJCXJldHVybiBzdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGVfQXJlYVJhdGlvKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U3RhbmRhcmRJbmZlY3RvcigpIHsKKwkJcmV0dXJuIHN0YW5kYXJkSW5mZWN0b3JFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCgpIHsKKwkJcmV0dXJuIHN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsKCkgeworCQlyZXR1cm4gc3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCgpIHsKKwkJcmV0dXJuIHN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTYW5pdHlDaGVja2VyKCkgeworCQlyZXR1cm4gc2FuaXR5Q2hlY2tlckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEludGVncmF0aW9uTGFiZWwoKSB7CisJCXJldHVybiBpbnRlZ3JhdGlvbkxhYmVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SW50ZWdyYXRpb25MYWJlbFZhbHVlKCkgeworCQlyZXR1cm4gaW50ZWdyYXRpb25MYWJlbFZhbHVlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SW50ZWdyYXRpb25EZWNvcmF0b3IoKSB7CisJCXJldHVybiBpbnRlZ3JhdGlvbkRlY29yYXRvckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwoKSB7CisJCXJldHVybiBhZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0QWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZSgpIHsKKwkJcmV0dXJuIGFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZV9DaGlsZHJlbnNMYWJlbHMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlhZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwoKSB7CisJCXJldHVybiBhZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCgpIHsKKwkJcmV0dXJuIGFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCgpIHsKKwkJcmV0dXJuIHN0b2NoYXN0aWNEaXNlYXNlTW9kZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbF9TZWVkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxfUmFuZG9tR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKCkgeworCQlyZXR1cm4gc3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbF9HYWluKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTSVJJbm9jdWxhdG9yKCkgeworCQlyZXR1cm4gc2lySW5vY3VsYXRvckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTSVJJbm9jdWxhdG9yX0lub2N1bGF0ZWRQZXJjZW50YWdlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2lySW5vY3VsYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNJUklub2N1bGF0b3JfSW5vY3VsYXRlUGVyY2VudGFnZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNpcklub2N1bGF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwoKSB7CisJCXJldHVybiBzdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwoKSB7CisJCXJldHVybiBzdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbCgpIHsKKwkJcmV0dXJuIHN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24oKSB7CisJCXJldHVybiBpbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25fTGlzdCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uX0ltcG9ydEZvbGRlcigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRURhdGFUeXBlIGdldFVSSSgpIHsKKwkJcmV0dXJuIHVyaUVEYXRhVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRURhdGFUeXBlIGdldEVMaXN0KCkgeworCQlyZXR1cm4gZUxpc3RFRGF0YVR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVEYXRhVHlwZSBnZXRSYW5kb20oKSB7CisJCXJldHVybiByYW5kb21FRGF0YVR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0YW5kYXJkRmFjdG9yeSBnZXRTdGFuZGFyZEZhY3RvcnkoKSB7CisJCXJldHVybiAoU3RhbmRhcmRGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKKwkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47CisJCWlzQ3JlYXRlZCA9IHRydWU7CisKKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCisJCWRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFVEVSTUlOSVNUSUNfU0VJUl9ESVNFQVNFX01PREVMKTsKKworCQlkZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMKTsKKworCQlkZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFVEVSTUlOSVNUSUNfU0lSX0RJU0VBU0VfTU9ERUwpOworCisJCWRpc2Vhc2VNb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhESVNFQVNFX01PREVMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkaXNlYXNlTW9kZWxFQ2xhc3MsIERJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEUpOworCQljcmVhdGVFQXR0cmlidXRlKGRpc2Vhc2VNb2RlbEVDbGFzcywgRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkaXNlYXNlTW9kZWxFQ2xhc3MsIERJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkaXNlYXNlTW9kZWxFQ2xhc3MsIERJU0VBU0VfTU9ERUxfX0RJU0VBU0VfTkFNRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGlzZWFzZU1vZGVsRUNsYXNzLCBESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0UpOworCQljcmVhdGVFQXR0cmlidXRlKGRpc2Vhc2VNb2RlbEVDbGFzcywgRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0UpOworCQljcmVhdGVFQXR0cmlidXRlKGRpc2Vhc2VNb2RlbEVDbGFzcywgRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGlzZWFzZU1vZGVsRUNsYXNzLCBESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEUpOworCisJCWRpc2Vhc2VNb2RlbExhYmVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJU0VBU0VfTU9ERUxfTEFCRUwpOworCQljcmVhdGVFUmVmZXJlbmNlKGRpc2Vhc2VNb2RlbExhYmVsRUNsYXNzLCBESVNFQVNFX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX0xBQkVMKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShkaXNlYXNlTW9kZWxMYWJlbEVDbGFzcywgRElTRUFTRV9NT0RFTF9MQUJFTF9fRElTRUFTRV9NT0RFTF9TVEFURSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZGlzZWFzZU1vZGVsTGFiZWxFQ2xhc3MsIERJU0VBU0VfTU9ERUxfTEFCRUxfX1BPUFVMQVRJT05fTU9ERUxfTEFCRUwpOworCisJCWRpc2Vhc2VNb2RlbExhYmVsVmFsdWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUVDbGFzcywgRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fRElTRUFTRV9ERUFUSFMpOworCQljcmVhdGVFQXR0cmlidXRlKGRpc2Vhc2VNb2RlbExhYmVsVmFsdWVFQ2xhc3MsIERJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfX1BPUFVMQVRJT05fQ09VTlQpOworCQljcmVhdGVFQXR0cmlidXRlKGRpc2Vhc2VNb2RlbExhYmVsVmFsdWVFQ2xhc3MsIERJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfX0lOQ0lERU5DRSk7CisKKwkJZGlzZWFzZU1vZGVsU3RhdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElTRUFTRV9NT0RFTF9TVEFURSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZGlzZWFzZU1vZGVsU3RhdGVFQ2xhc3MsIERJU0VBU0VfTU9ERUxfU1RBVEVfX0xBQkVMKTsKKworCQlpbmZlY3RvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTkZFQ1RPUik7CisJCWNyZWF0ZUVSZWZlcmVuY2UoaW5mZWN0b3JFQ2xhc3MsIElORkVDVE9SX19ESVNFQVNFX01PREVMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShpbmZlY3RvckVDbGFzcywgSU5GRUNUT1JfX1RBUkdFVF9VUkkpOworCQljcmVhdGVFQXR0cmlidXRlKGluZmVjdG9yRUNsYXNzLCBJTkZFQ1RPUl9fRElTRUFTRV9OQU1FKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShpbmZlY3RvckVDbGFzcywgSU5GRUNUT1JfX1RBUkdFVF9JU09fS0VZKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShpbmZlY3RvckVDbGFzcywgSU5GRUNUT1JfX0xBQkVMU19UT19JTkZFQ1QpOworCQljcmVhdGVFQXR0cmlidXRlKGluZmVjdG9yRUNsYXNzLCBJTkZFQ1RPUl9fUE9QVUxBVElPTl9JREVOVElGSUVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShpbmZlY3RvckVDbGFzcywgSU5GRUNUT1JfX0lORkVDVF9QRVJDRU5UQUdFKTsKKworCQlzZWlyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFSVIpOworCQljcmVhdGVFQXR0cmlidXRlKHNlaXJFQ2xhc3MsIFNFSVJfX0lOQ1VCQVRJT05fUkFURSk7CisKKwkJc2VpckxhYmVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFSVJfTEFCRUwpOworCQljcmVhdGVFUmVmZXJlbmNlKHNlaXJMYWJlbEVDbGFzcywgU0VJUl9MQUJFTF9fREVMVEFfVkFMVUUpOworCQljcmVhdGVFUmVmZXJlbmNlKHNlaXJMYWJlbEVDbGFzcywgU0VJUl9MQUJFTF9fUFJPQkVfVkFMVUUpOworCQljcmVhdGVFUmVmZXJlbmNlKHNlaXJMYWJlbEVDbGFzcywgU0VJUl9MQUJFTF9fVEVNUF9WQUxVRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2VpckxhYmVsRUNsYXNzLCBTRUlSX0xBQkVMX19PUklHSU5BTF9WQUxVRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2VpckxhYmVsRUNsYXNzLCBTRUlSX0xBQkVMX19FUlJPUl9TQ0FMRSk7CisKKwkJc2VpckxhYmVsVmFsdWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VJUl9MQUJFTF9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc2VpckxhYmVsVmFsdWVFQ2xhc3MsIFNFSVJfTEFCRUxfVkFMVUVfX0UpOworCisJCXNpRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNJKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzaUVDbGFzcywgU0lfX1RSQU5TTUlTU0lPTl9SQVRFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzaUVDbGFzcywgU0lfX05PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQpOworCQljcmVhdGVFQXR0cmlidXRlKHNpRUNsYXNzLCBTSV9fUkVDT1ZFUllfUkFURSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc2lFQ2xhc3MsIFNJX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzaUVDbGFzcywgU0lfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzaUVDbGFzcywgU0lfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT04pOworCQljcmVhdGVFQXR0cmlidXRlKHNpRUNsYXNzLCBTSV9fSU5GRUNUSU9VU19NT1JUQUxJVFkpOworCQljcmVhdGVFQXR0cmlidXRlKHNpRUNsYXNzLCBTSV9fQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFKTsKKworCQlzaURpc2Vhc2VNb2RlbFN0YXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNJX0RJU0VBU0VfTU9ERUxfU1RBVEUpOworCisJCXNpSW5mZWN0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0lfSU5GRUNUT1IpOworCQljcmVhdGVFQXR0cmlidXRlKHNpSW5mZWN0b3JFQ2xhc3MsIFNJX0lORkVDVE9SX19JTkZFQ1RJT1VTX0NPVU5UKTsKKworCQlzaUxhYmVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNJX0xBQkVMKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzaUxhYmVsRUNsYXNzLCBTSV9MQUJFTF9fREVMVEFfVkFMVUUpOworCQljcmVhdGVFUmVmZXJlbmNlKHNpTGFiZWxFQ2xhc3MsIFNJX0xBQkVMX19QUk9CRV9WQUxVRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2lMYWJlbEVDbGFzcywgU0lfTEFCRUxfX1RFTVBfVkFMVUUpOworCQljcmVhdGVFUmVmZXJlbmNlKHNpTGFiZWxFQ2xhc3MsIFNJX0xBQkVMX19PUklHSU5BTF9WQUxVRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2lMYWJlbEVDbGFzcywgU0lfTEFCRUxfX0VSUk9SX1NDQUxFKTsKKworCQlzaUxhYmVsVmFsdWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0lfTEFCRUxfVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKHNpTGFiZWxWYWx1ZUVDbGFzcywgU0lfTEFCRUxfVkFMVUVfX0kpOworCisJCXNpckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTSVIpOworCQljcmVhdGVFQXR0cmlidXRlKHNpckVDbGFzcywgU0lSX19JTU1VTklUWV9MT1NTX1JBVEUpOworCisJCXNpckxhYmVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNJUl9MQUJFTCk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2lyTGFiZWxFQ2xhc3MsIFNJUl9MQUJFTF9fREVMVEFfVkFMVUUpOworCQljcmVhdGVFUmVmZXJlbmNlKHNpckxhYmVsRUNsYXNzLCBTSVJfTEFCRUxfX1BST0JFX1ZBTFVFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzaXJMYWJlbEVDbGFzcywgU0lSX0xBQkVMX19URU1QX1ZBTFVFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzaXJMYWJlbEVDbGFzcywgU0lSX0xBQkVMX19PUklHSU5BTF9WQUxVRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2lyTGFiZWxFQ2xhc3MsIFNJUl9MQUJFTF9fRVJST1JfU0NBTEUpOworCisJCXNpckxhYmVsVmFsdWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0lSX0xBQkVMX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzaXJMYWJlbFZhbHVlRUNsYXNzLCBTSVJfTEFCRUxfVkFMVUVfX1IpOworCisJCXN0YW5kYXJkRGlzZWFzZU1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNUQU5EQVJEX0RJU0VBU0VfTU9ERUwpOworCQljcmVhdGVFQXR0cmlidXRlKHN0YW5kYXJkRGlzZWFzZU1vZGVsRUNsYXNzLCBTVEFOREFSRF9ESVNFQVNFX01PREVMX19UT1RBTF9QT1BVTEFUSU9OX0NPVU5UKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzdGFuZGFyZERpc2Vhc2VNb2RlbEVDbGFzcywgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzdGFuZGFyZERpc2Vhc2VNb2RlbEVDbGFzcywgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fVE9UQUxfQVJFQSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc3RhbmRhcmREaXNlYXNlTW9kZWxFQ2xhc3MsIFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1JFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFkpOworCisJCXN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTCk7CisKKwkJc3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKHN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUVDbGFzcywgU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fUyk7CisKKwkJc3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVEFOREFSRF9ESVNFQVNFX01PREVMX1NUQVRFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlRUNsYXNzLCBTVEFOREFSRF9ESVNFQVNFX01PREVMX1NUQVRFX19BUkVBX1JBVElPKTsKKworCQlzdGFuZGFyZEluZmVjdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNUQU5EQVJEX0lORkVDVE9SKTsKKworCQlzdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTCk7CisKKwkJc3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTCk7CisKKwkJc3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMKTsKKworCQlzYW5pdHlDaGVja2VyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNBTklUWV9DSEVDS0VSKTsKKworCQlpbnRlZ3JhdGlvbkxhYmVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOVEVHUkFUSU9OX0xBQkVMKTsKKworCQlpbnRlZ3JhdGlvbkxhYmVsVmFsdWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU5URUdSQVRJT05fTEFCRUxfVkFMVUUpOworCisJCWludGVncmF0aW9uRGVjb3JhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOVEVHUkFUSU9OX0RFQ09SQVRPUik7CisKKwkJYWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBR0dSRUdBVElOR19TSV9ESVNFQVNFX01PREVMKTsKKworCQlhZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFHR1JFR0FUSU5HX0RJU0VBU0VfTU9ERUxfU1RBVEUpOworCQljcmVhdGVFUmVmZXJlbmNlKGFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGVFQ2xhc3MsIEFHR1JFR0FUSU5HX0RJU0VBU0VfTU9ERUxfU1RBVEVfX0NISUxEUkVOU19MQUJFTFMpOworCisJCWFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBR0dSRUdBVElOR19TRUlSX0RJU0VBU0VfTU9ERUwpOworCisJCWFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMKTsKKworCQlzdG9jaGFzdGljRGlzZWFzZU1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEVDbGFzcywgU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19TRUVEKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzdG9jaGFzdGljRGlzZWFzZU1vZGVsRUNsYXNzLCBTVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1IpOworCisJCXN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVEFOREFSRF9TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUwpOworCQljcmVhdGVFQXR0cmlidXRlKHN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEVDbGFzcywgU1RBTkRBUkRfU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19HQUlOKTsKKworCQlzaXJJbm9jdWxhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNJUl9JTk9DVUxBVE9SKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzaXJJbm9jdWxhdG9yRUNsYXNzLCBTSVJfSU5PQ1VMQVRPUl9fSU5PQ1VMQVRFRF9QRVJDRU5UQUdFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzaXJJbm9jdWxhdG9yRUNsYXNzLCBTSVJfSU5PQ1VMQVRPUl9fSU5PQ1VMQVRFX1BFUkNFTlRBR0UpOworCisJCXN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1RPQ0hBU1RJQ19QT0lTU09OX1NJX0RJU0VBU0VfTU9ERUwpOworCisJCXN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNUT0NIQVNUSUNfUE9JU1NPTl9TSVJfRElTRUFTRV9NT0RFTCk7CisKKwkJc3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNUT0NIQVNUSUNfUE9JU1NPTl9TRUlSX0RJU0VBU0VfTU9ERUwpOworCisJCWluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU5GRUNUT1JfSU5PQ1VMQVRPUl9DT0xMRUNUSU9OKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShpbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uRUNsYXNzLCBJTkZFQ1RPUl9JTk9DVUxBVE9SX0NPTExFQ1RJT05fX0xJU1QpOworCQljcmVhdGVFQXR0cmlidXRlKGluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25FQ2xhc3MsIElORkVDVE9SX0lOT0NVTEFUT1JfQ09MTEVDVElPTl9fSU1QT1JUX0ZPTERFUik7CisKKwkJLy8gQ3JlYXRlIGRhdGEgdHlwZXMKKwkJdXJpRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFVSSSk7CisJCWVMaXN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEVMSVNUKTsKKwkJcmFuZG9tRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFJBTkRPTSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOworCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKKwkJc2V0TmFtZShlTkFNRSk7CisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOworCQlzZXROc1VSSShlTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCisJCU1vZGVsUGFja2FnZSB0aGVNb2RlbFBhY2thZ2UgPSAoTW9kZWxQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGVsUGFja2FnZS5lTlNfVVJJKTsKKwkJTW9kaWZpZXJQYWNrYWdlIHRoZU1vZGlmaWVyUGFja2FnZSA9IChNb2RpZmllclBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kaWZpZXJQYWNrYWdlLmVOU19VUkkpOworCQlFY29yZVBhY2thZ2UgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7CisJCUdyYXBoUGFja2FnZSB0aGVHcmFwaFBhY2thZ2UgPSAoR3JhcGhQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEdyYXBoUGFja2FnZS5lTlNfVVJJKTsKKwkJTGFiZWxzUGFja2FnZSB0aGVMYWJlbHNQYWNrYWdlID0gKExhYmVsc1BhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTGFiZWxzUGFja2FnZS5lTlNfVVJJKTsKKwkJb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSB0aGVTdGFuZGFyZFBhY2thZ2VfMSA9IChvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycworCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycworCisJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJZGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTRUlSKCkpOworCQlkZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTSSgpKTsKKwkJZGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNJUigpKTsKKwkJZGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU1vZGVsUGFja2FnZS5nZXROb2RlRGVjb3JhdG9yKCkpOworCQlkaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTYW5pdHlDaGVja2VyKCkpOworCQlkaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlTW9kaWZpZXJQYWNrYWdlLmdldE1vZGlmaWFibGUoKSk7CisJCWRpc2Vhc2VNb2RlbExhYmVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUdyYXBoUGFja2FnZS5nZXREeW5hbWljTm9kZUxhYmVsKCkpOworCQlkaXNlYXNlTW9kZWxMYWJlbFZhbHVlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUdyYXBoUGFja2FnZS5nZXRMYWJlbFZhbHVlKCkpOworCQlkaXNlYXNlTW9kZWxMYWJlbFZhbHVlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SW50ZWdyYXRpb25MYWJlbFZhbHVlKCkpOworCQlpbmZlY3RvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RlbFBhY2thZ2UuZ2V0Tm9kZURlY29yYXRvcigpKTsKKwkJaW5mZWN0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlTW9kaWZpZXJQYWNrYWdlLmdldE1vZGlmaWFibGUoKSk7CisJCXNlaXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTSVIoKSk7CisJCXNlaXJMYWJlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwoKSk7CisJCXNlaXJMYWJlbFZhbHVlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U0lSTGFiZWxWYWx1ZSgpKTsKKwkJc2lFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTdGFuZGFyZERpc2Vhc2VNb2RlbCgpKTsKKwkJc2lEaXNlYXNlTW9kZWxTdGF0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUoKSk7CisJCXNpSW5mZWN0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTdGFuZGFyZEluZmVjdG9yKCkpOworCQlzaUxhYmVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCgpKTsKKwkJc2lMYWJlbFZhbHVlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCkpOworCQlzaXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTSSgpKTsKKwkJc2lyTGFiZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKCkpOworCQlzaXJMYWJlbFZhbHVlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U0lMYWJlbFZhbHVlKCkpOworCQlzdGFuZGFyZERpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERpc2Vhc2VNb2RlbCgpKTsKKwkJc3RhbmRhcmREaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJbnRlZ3JhdGlvbkRlY29yYXRvcigpKTsKKwkJc3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERpc2Vhc2VNb2RlbExhYmVsKCkpOworCQlzdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SW50ZWdyYXRpb25MYWJlbCgpKTsKKwkJc3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpKTsKKwkJc3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERpc2Vhc2VNb2RlbFN0YXRlKCkpOworCQlzdGFuZGFyZEluZmVjdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SW5mZWN0b3IoKSk7CisJCXN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U0VJUigpKTsKKwkJc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoKSk7CisJCXN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNJKCkpOworCQlzdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoKSk7CisJCXN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTSVIoKSk7CisJCXN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoKSk7CisJCWFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTSSgpKTsKKwkJYWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERpc2Vhc2VNb2RlbFN0YXRlKCkpOworCQlhZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCgpKTsKKwkJYWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsKCkpOworCQlzdG9jaGFzdGljRGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGlzZWFzZU1vZGVsKCkpOworCQlzdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKCkpOworCQlzaXJJbm9jdWxhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U0lJbmZlY3RvcigpKTsKKwkJc3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNJKCkpOworCQlzdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNJUigpKTsKKwkJc3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U0VJUigpKTsKKwkJaW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RlbFBhY2thZ2UuZ2V0Tm9kZURlY29yYXRvcigpKTsKKwkJaW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RpZmllclBhY2thZ2UuZ2V0TW9kaWZpYWJsZSgpKTsKKworCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycworCQlpbml0RUNsYXNzKGRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsRUNsYXNzLCBEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbC5jbGFzcywgIkRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhkZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWxFQ2xhc3MsIERldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbC5jbGFzcywgIkRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MoZGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbEVDbGFzcywgRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbC5jbGFzcywgIkRldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGRpc2Vhc2VNb2RlbEVDbGFzcywgRGlzZWFzZU1vZGVsLmNsYXNzLCAiRGlzZWFzZU1vZGVsIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGlzZWFzZU1vZGVsX0JhY2tncm91bmRNb3J0YWxpdHlSYXRlKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJiYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSIsICI1LjVFLTUiLCAwLCAxLCBEaXNlYXNlTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RUF0dHJpYnV0ZShnZXREaXNlYXNlTW9kZWxfUG9wdWxhdGlvbklkZW50aWZpZXIoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcHVsYXRpb25JZGVudGlmaWVyIiwgImh1bWFuIiwgMCwgMSwgRGlzZWFzZU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGlzZWFzZU1vZGVsX1RpbWVQZXJpb2QoKSwgZWNvcmVQYWNrYWdlLmdldEVMb25nKCksICJ0aW1lUGVyaW9kIiwgIjg2NDAwMDAwIiwgMCwgMSwgRGlzZWFzZU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGlzZWFzZU1vZGVsX0Rpc2Vhc2VOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkaXNlYXNlTmFtZSIsIG51bGwsIDAsIDEsIERpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXREaXNlYXNlTW9kZWxfUmVsYXRpdmVUb2xlcmFuY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInJlbGF0aXZlVG9sZXJhbmNlIiwgIjFFLTkiLCAwLCAxLCBEaXNlYXNlTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RUF0dHJpYnV0ZShnZXREaXNlYXNlTW9kZWxfRmluaXRlRGlmZmVyZW5jZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImZpbml0ZURpZmZlcmVuY2UiLCAidHJ1ZSIsIDAsIDEsIERpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldERpc2Vhc2VNb2RlbF9GcmVxdWVuY3lEZXBlbmRlbnQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJmcmVxdWVuY3lEZXBlbmRlbnQiLCAidHJ1ZSIsIDAsIDEsIERpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldERpc2Vhc2VNb2RlbF9CYWNrZ3JvdW5kQmlydGhSYXRlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJiYWNrZ3JvdW5kQmlydGhSYXRlIiwgIjUuNUUtNSIsIDAsIDEsIERpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJRU9wZXJhdGlvbiBvcCA9IGFkZEVPcGVyYXRpb24oZGlzZWFzZU1vZGVsRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiZ2V0QWRqdXN0ZWRCYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVMb25nKCksICJ0aW1lRGVsdGEiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJYWRkRU9wZXJhdGlvbihkaXNlYXNlTW9kZWxFQ2xhc3MsIHRoaXMuZ2V0RGlzZWFzZU1vZGVsTGFiZWwoKSwgImNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWFkZEVPcGVyYXRpb24oZGlzZWFzZU1vZGVsRUNsYXNzLCB0aGlzLmdldERpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKSwgImNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJYWRkRU9wZXJhdGlvbihkaXNlYXNlTW9kZWxFQ2xhc3MsIHRoaXMuZ2V0RGlzZWFzZU1vZGVsU3RhdGUoKSwgImNyZWF0ZURpc2Vhc2VNb2RlbFN0YXRlIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCW9wID0gYWRkRU9wZXJhdGlvbihkaXNlYXNlTW9kZWxFQ2xhc3MsIHRoaXMuZ2V0RGlzZWFzZU1vZGVsU3RhdGUoKSwgImluaXRpYWxpemVEaXNlYXNlU3RhdGUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0RGlzZWFzZU1vZGVsU3RhdGUoKSwgImRpc2Vhc2VNb2RlbFN0YXRlIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldERpc2Vhc2VNb2RlbExhYmVsKCksICJkaXNlYXNlTW9kZWxMYWJlbCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlvcCA9IGFkZEVPcGVyYXRpb24oZGlzZWFzZU1vZGVsRUNsYXNzLCBudWxsLCAiaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXREaXNlYXNlTW9kZWxMYWJlbCgpLCAiZGlzZWFzZU1vZGVsTGFiZWwiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJYWRkRU9wZXJhdGlvbihkaXNlYXNlTW9kZWxFQ2xhc3MsIHRoaXMuZ2V0SW5mZWN0b3IoKSwgImNyZWF0ZUluZmVjdG9yIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCW9wID0gYWRkRU9wZXJhdGlvbihkaXNlYXNlTW9kZWxFQ2xhc3MsIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJnZXRBZGp1c3RlZEJhY2tncm91bmRCaXJ0aFJhdGUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIHRoZUVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAidGltZURlbHRhIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MoZGlzZWFzZU1vZGVsTGFiZWxFQ2xhc3MsIERpc2Vhc2VNb2RlbExhYmVsLmNsYXNzLCAiRGlzZWFzZU1vZGVsTGFiZWwiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXREaXNlYXNlTW9kZWxMYWJlbF9Qb3B1bGF0aW9uTGFiZWwoKSwgdGhlTGFiZWxzUGFja2FnZS5nZXRQb3B1bGF0aW9uTGFiZWwoKSwgbnVsbCwgInBvcHVsYXRpb25MYWJlbCIsIG51bGwsIDAsIDEsIERpc2Vhc2VNb2RlbExhYmVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldERpc2Vhc2VNb2RlbExhYmVsX0Rpc2Vhc2VNb2RlbFN0YXRlKCksIHRoaXMuZ2V0RGlzZWFzZU1vZGVsU3RhdGUoKSwgdGhpcy5nZXREaXNlYXNlTW9kZWxTdGF0ZV9MYWJlbCgpLCAiZGlzZWFzZU1vZGVsU3RhdGUiLCBudWxsLCAwLCAxLCBEaXNlYXNlTW9kZWxMYWJlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXREaXNlYXNlTW9kZWxMYWJlbF9Qb3B1bGF0aW9uTW9kZWxMYWJlbCgpLCB0aGVTdGFuZGFyZFBhY2thZ2VfMS5nZXRQb3B1bGF0aW9uTW9kZWxMYWJlbCgpLCBudWxsLCAicG9wdWxhdGlvbk1vZGVsTGFiZWwiLCBudWxsLCAwLCAxLCBEaXNlYXNlTW9kZWxMYWJlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MoZGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUVDbGFzcywgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZS5jbGFzcywgIkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXREaXNlYXNlTW9kZWxMYWJlbFZhbHVlX0Rpc2Vhc2VEZWF0aHMoKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImRpc2Vhc2VEZWF0aHMiLCAiMCIsIDAsIDEsIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RUF0dHJpYnV0ZShnZXREaXNlYXNlTW9kZWxMYWJlbFZhbHVlX1BvcHVsYXRpb25Db3VudCgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAicG9wdWxhdGlvbkNvdW50IiwgbnVsbCwgMCwgMSwgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldERpc2Vhc2VNb2RlbExhYmVsVmFsdWVfSW5jaWRlbmNlKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJpbmNpZGVuY2UiLCBudWxsLCAwLCAxLCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJb3AgPSBhZGRFT3BlcmF0aW9uKGRpc2Vhc2VNb2RlbExhYmVsVmFsdWVFQ2xhc3MsIHRoaXMuZ2V0RGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpLCAic2V0IiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldERpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKSwgInZhbHVlIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCW9wID0gYWRkRU9wZXJhdGlvbihkaXNlYXNlTW9kZWxMYWJlbFZhbHVlRUNsYXNzLCB0aGlzLmdldERpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKSwgImFkZCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCksICJ2YWx1ZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlvcCA9IGFkZEVPcGVyYXRpb24oZGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUVDbGFzcywgdGhpcy5nZXREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCksICJzdWIiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0RGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpLCAidmFsdWUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJb3AgPSBhZGRFT3BlcmF0aW9uKGRpc2Vhc2VNb2RlbExhYmVsVmFsdWVFQ2xhc3MsIHRoaXMuZ2V0RGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpLCAic2NhbGUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJzY2FsZUZhY3RvciIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlhZGRFT3BlcmF0aW9uKGRpc2Vhc2VNb2RlbExhYmVsVmFsdWVFQ2xhc3MsIG51bGwsICJ6ZXJvT3V0UG9wdWxhdGlvbkNvdW50IiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MoZGlzZWFzZU1vZGVsU3RhdGVFQ2xhc3MsIERpc2Vhc2VNb2RlbFN0YXRlLmNsYXNzLCAiRGlzZWFzZU1vZGVsU3RhdGUiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXREaXNlYXNlTW9kZWxTdGF0ZV9MYWJlbCgpLCB0aGlzLmdldERpc2Vhc2VNb2RlbExhYmVsKCksIHRoaXMuZ2V0RGlzZWFzZU1vZGVsTGFiZWxfRGlzZWFzZU1vZGVsU3RhdGUoKSwgImxhYmVsIiwgbnVsbCwgMCwgMSwgRGlzZWFzZU1vZGVsU3RhdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhpbmZlY3RvckVDbGFzcywgSW5mZWN0b3IuY2xhc3MsICJJbmZlY3RvciIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldEluZmVjdG9yX0Rpc2Vhc2VNb2RlbCgpLCB0aGlzLmdldFN0YW5kYXJkRGlzZWFzZU1vZGVsKCksIG51bGwsICJkaXNlYXNlTW9kZWwiLCBudWxsLCAwLCAxLCBJbmZlY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRJbmZlY3Rvcl9UYXJnZXRVUkkoKSwgdGhpcy5nZXRVUkkoKSwgInRhcmdldFVSSSIsIG51bGwsIDAsIDEsIEluZmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEluZmVjdG9yX0Rpc2Vhc2VOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkaXNlYXNlTmFtZSIsIG51bGwsIDAsIDEsIEluZmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEluZmVjdG9yX1RhcmdldElTT0tleSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFyZ2V0SVNPS2V5IiwgbnVsbCwgMCwgMSwgSW5mZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5mZWN0b3JfTGFiZWxzVG9JbmZlY3QoKSwgdGhpcy5nZXREaXNlYXNlTW9kZWxMYWJlbCgpLCBudWxsLCAibGFiZWxzVG9JbmZlY3QiLCBudWxsLCAwLCAtMSwgSW5mZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5mZWN0b3JfUG9wdWxhdGlvbklkZW50aWZpZXIoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcHVsYXRpb25JZGVudGlmaWVyIiwgbnVsbCwgMCwgMSwgSW5mZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5mZWN0b3JfSW5mZWN0UGVyY2VudGFnZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImluZmVjdFBlcmNlbnRhZ2UiLCAiZmFsc2UiLCAwLCAxLCBJbmZlY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJaW5pdEVDbGFzcyhzZWlyRUNsYXNzLCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUi5jbGFzcywgIlNFSVIiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTRUlSX0luY3ViYXRpb25SYXRlKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJpbmN1YmF0aW9uUmF0ZSIsICIwLjAiLCAwLCAxLCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJb3AgPSBhZGRFT3BlcmF0aW9uKHNlaXJFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJnZXRBZGp1c3RlZEluY3ViYXRpb25SYXRlIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RUxvbmcoKSwgInRpbWVEZWx0YSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHNlaXJMYWJlbEVDbGFzcywgU0VJUkxhYmVsLmNsYXNzLCAiU0VJUkxhYmVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFNFSVJMYWJlbF9EZWx0YVZhbHVlKCksIHRoaXMuZ2V0U0VJUkxhYmVsVmFsdWUoKSwgbnVsbCwgImRlbHRhVmFsdWUiLCBudWxsLCAwLCAxLCBTRUlSTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U0VJUkxhYmVsX1Byb2JlVmFsdWUoKSwgdGhpcy5nZXRTRUlSTGFiZWxWYWx1ZSgpLCBudWxsLCAicHJvYmVWYWx1ZSIsIG51bGwsIDAsIDEsIFNFSVJMYWJlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRTRUlSTGFiZWxfVGVtcFZhbHVlKCksIHRoaXMuZ2V0U0VJUkxhYmVsVmFsdWUoKSwgbnVsbCwgInRlbXBWYWx1ZSIsIG51bGwsIDAsIDEsIFNFSVJMYWJlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRTRUlSTGFiZWxfT3JpZ2luYWxWYWx1ZSgpLCB0aGlzLmdldFNFSVJMYWJlbFZhbHVlKCksIG51bGwsICJvcmlnaW5hbFZhbHVlIiwgbnVsbCwgMCwgMSwgU0VJUkxhYmVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFNFSVJMYWJlbF9FcnJvclNjYWxlKCksIHRoaXMuZ2V0U0VJUkxhYmVsVmFsdWUoKSwgbnVsbCwgImVycm9yU2NhbGUiLCBudWxsLCAwLCAxLCBTRUlSTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHNlaXJMYWJlbFZhbHVlRUNsYXNzLCBTRUlSTGFiZWxWYWx1ZS5jbGFzcywgIlNFSVJMYWJlbFZhbHVlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFNFSVJMYWJlbFZhbHVlX0UoKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImUiLCBudWxsLCAwLCAxLCBTRUlSTGFiZWxWYWx1ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3Moc2lFQ2xhc3MsIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSS5jbGFzcywgIlNJIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U0lfVHJhbnNtaXNzaW9uUmF0ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAidHJhbnNtaXNzaW9uUmF0ZSIsICIwLjAiLCAwLCAxLCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTSV9Ob25MaW5lYXJpdHlDb2VmZmljaWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAibm9uTGluZWFyaXR5Q29lZmZpY2llbnQiLCAiMS4wIiwgMCwgMSwgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U0lfUmVjb3ZlcnlSYXRlKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJyZWNvdmVyeVJhdGUiLCAiMC4wIiwgMCwgMSwgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U0lfSW5mZWN0aW91c01vcnRhbGl0eVJhdGUoKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImluZmVjdGlvdXNNb3J0YWxpdHlSYXRlIiwgIjAuMCIsIDAsIDEsIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldFNJX1BoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJwaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbiIsICIwLjA1IiwgMCwgMSwgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U0lfUm9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAicm9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbiIsICIwLjAxIiwgMCwgMSwgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U0lfSW5mZWN0aW91c01vcnRhbGl0eSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiaW5mZWN0aW91c01vcnRhbGl0eSIsIG51bGwsIDAsIDEsIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTSV9DaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJjaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlIiwgIjIuMjUiLCAwLCAxLCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCW9wID0gYWRkRU9wZXJhdGlvbihzaUVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImdldEFkanVzdGVkSW5mZWN0aW91c01vcnRhbGl0eVJhdGUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAidGltZURlbHRhIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCW9wID0gYWRkRU9wZXJhdGlvbihzaUVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImdldEFkanVzdGVkVHJhbnNtaXNzaW9uUmF0ZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVMb25nKCksICJ0aW1lRGVsdGEiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJb3AgPSBhZGRFT3BlcmF0aW9uKHNpRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiZ2V0QWRqdXN0ZWRSZWNvdmVyeVJhdGUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAidGltZURlbHRhIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCW9wID0gYWRkRU9wZXJhdGlvbihzaUVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImdldEVmZmVjdGl2ZUluZmVjdGlvdXMiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIHRoZUdyYXBoUGFja2FnZS5nZXROb2RlKCksICJub2RlIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwoKSwgImRpc2Vhc2VMYWJlbCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgIm9uc2l0ZUluZmVjdGlvdXMiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJb3AgPSBhZGRFT3BlcmF0aW9uKHNpRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiZ2V0Tm9ybWFsaXplZEVmZmVjdGl2ZUluZmVjdGlvdXMiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIHRoZUdyYXBoUGFja2FnZS5nZXROb2RlKCksICJub2RlIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwoKSwgImRpc2Vhc2VMYWJlbCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgIm9uc2l0ZUluZmVjdGlvdXMiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzaURpc2Vhc2VNb2RlbFN0YXRlRUNsYXNzLCBTSURpc2Vhc2VNb2RlbFN0YXRlLmNsYXNzLCAiU0lEaXNlYXNlTW9kZWxTdGF0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3Moc2lJbmZlY3RvckVDbGFzcywgU0lJbmZlY3Rvci5jbGFzcywgIlNJSW5mZWN0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U0lJbmZlY3Rvcl9JbmZlY3Rpb3VzQ291bnQoKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImluZmVjdGlvdXNDb3VudCIsICIxIiwgMCwgMSwgU0lJbmZlY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJaW5pdEVDbGFzcyhzaUxhYmVsRUNsYXNzLCBTSUxhYmVsLmNsYXNzLCAiU0lMYWJlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRTSUxhYmVsX0RlbHRhVmFsdWUoKSwgdGhpcy5nZXRTSUxhYmVsVmFsdWUoKSwgbnVsbCwgImRlbHRhVmFsdWUiLCBudWxsLCAwLCAxLCBTSUxhYmVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFNJTGFiZWxfUHJvYmVWYWx1ZSgpLCB0aGlzLmdldFNJTGFiZWxWYWx1ZSgpLCBudWxsLCAicHJvYmVWYWx1ZSIsIG51bGwsIDAsIDEsIFNJTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U0lMYWJlbF9UZW1wVmFsdWUoKSwgdGhpcy5nZXRTSUxhYmVsVmFsdWUoKSwgbnVsbCwgInRlbXBWYWx1ZSIsIG51bGwsIDAsIDEsIFNJTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U0lMYWJlbF9PcmlnaW5hbFZhbHVlKCksIHRoaXMuZ2V0U0lMYWJlbFZhbHVlKCksIG51bGwsICJvcmlnaW5hbFZhbHVlIiwgbnVsbCwgMCwgMSwgU0lMYWJlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRTSUxhYmVsX0Vycm9yU2NhbGUoKSwgdGhpcy5nZXRTSUxhYmVsVmFsdWUoKSwgbnVsbCwgImVycm9yU2NhbGUiLCBudWxsLCAwLCAxLCBTSUxhYmVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzaUxhYmVsVmFsdWVFQ2xhc3MsIFNJTGFiZWxWYWx1ZS5jbGFzcywgIlNJTGFiZWxWYWx1ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTSUxhYmVsVmFsdWVfSSgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiaSIsIG51bGwsIDAsIDEsIFNJTGFiZWxWYWx1ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3Moc2lyRUNsYXNzLCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSLmNsYXNzLCAiU0lSIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U0lSX0ltbXVuaXR5TG9zc1JhdGUoKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImltbXVuaXR5TG9zc1JhdGUiLCAiMC4wIiwgMCwgMSwgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJb3AgPSBhZGRFT3BlcmF0aW9uKHNpckVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImdldEFkanVzdGVkSW1tdW5pdHlMb3NzUmF0ZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVMb25nKCksICJ0aW1lRGVsdGEiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzaXJMYWJlbEVDbGFzcywgU0lSTGFiZWwuY2xhc3MsICJTSVJMYWJlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRTSVJMYWJlbF9EZWx0YVZhbHVlKCksIHRoaXMuZ2V0U0lSTGFiZWxWYWx1ZSgpLCBudWxsLCAiZGVsdGFWYWx1ZSIsIG51bGwsIDAsIDEsIFNJUkxhYmVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFNJUkxhYmVsX1Byb2JlVmFsdWUoKSwgdGhpcy5nZXRTSVJMYWJlbFZhbHVlKCksIG51bGwsICJwcm9iZVZhbHVlIiwgbnVsbCwgMCwgMSwgU0lSTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U0lSTGFiZWxfVGVtcFZhbHVlKCksIHRoaXMuZ2V0U0lSTGFiZWxWYWx1ZSgpLCBudWxsLCAidGVtcFZhbHVlIiwgbnVsbCwgMCwgMSwgU0lSTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U0lSTGFiZWxfT3JpZ2luYWxWYWx1ZSgpLCB0aGlzLmdldFNJUkxhYmVsVmFsdWUoKSwgbnVsbCwgIm9yaWdpbmFsVmFsdWUiLCBudWxsLCAwLCAxLCBTSVJMYWJlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRTSVJMYWJlbF9FcnJvclNjYWxlKCksIHRoaXMuZ2V0U0lSTGFiZWxWYWx1ZSgpLCBudWxsLCAiZXJyb3JTY2FsZSIsIG51bGwsIDAsIDEsIFNJUkxhYmVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzaXJMYWJlbFZhbHVlRUNsYXNzLCBTSVJMYWJlbFZhbHVlLmNsYXNzLCAiU0lSTGFiZWxWYWx1ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTSVJMYWJlbFZhbHVlX1IoKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInIiLCBudWxsLCAwLCAxLCBTSVJMYWJlbFZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzdGFuZGFyZERpc2Vhc2VNb2RlbEVDbGFzcywgU3RhbmRhcmREaXNlYXNlTW9kZWwuY2xhc3MsICJTdGFuZGFyZERpc2Vhc2VNb2RlbCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFN0YW5kYXJkRGlzZWFzZU1vZGVsX1RvdGFsUG9wdWxhdGlvbkNvdW50KCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJ0b3RhbFBvcHVsYXRpb25Db3VudCIsICIwIiwgMCwgMSwgU3RhbmRhcmREaXNlYXNlTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTdGFuZGFyZERpc2Vhc2VNb2RlbF9Ub3RhbFBvcHVsYXRpb25Db3VudFJlY2lwcm9jYWwoKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInRvdGFsUG9wdWxhdGlvbkNvdW50UmVjaXByb2NhbCIsIG51bGwsIDAsIDEsIFN0YW5kYXJkRGlzZWFzZU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTdGFuZGFyZERpc2Vhc2VNb2RlbF9Ub3RhbEFyZWEoKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInRvdGFsQXJlYSIsICIwIiwgMCwgMSwgU3RhbmRhcmREaXNlYXNlTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTdGFuZGFyZERpc2Vhc2VNb2RlbF9SZWZlcmVuY2VQb3B1bGF0aW9uRGVuc2l0eSgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAicmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHkiLCAiMTAwIiwgMCwgMSwgU3RhbmRhcmREaXNlYXNlTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCW9wID0gYWRkRU9wZXJhdGlvbihzdGFuZGFyZERpc2Vhc2VNb2RlbEVDbGFzcywgbnVsbCwgImFkZFRvVG90YWxQb3B1bGF0aW9uQ291bnQiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJwb3B1bGF0aW9uQ291bnQiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJYWRkRU9wZXJhdGlvbihzdGFuZGFyZERpc2Vhc2VNb2RlbEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImNvbXB1dGVUb3RhbFBvcHVsYXRpb25Db3VudFJlY2lwcm9jYWwiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJb3AgPSBhZGRFT3BlcmF0aW9uKHN0YW5kYXJkRGlzZWFzZU1vZGVsRUNsYXNzLCBudWxsLCAiYWRkVG9Ub3RhbEFyZWEiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJhcmVhIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCisJCW9wID0gYWRkRU9wZXJhdGlvbihzdGFuZGFyZERpc2Vhc2VNb2RlbEVDbGFzcywgbnVsbCwgImNhbGN1bGF0ZURlbHRhIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGVNb2RlbFBhY2thZ2UuZ2V0U1RFTVRpbWUoKSwgInRpbWUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIHRoZUVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAidGltZURlbHRhIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlFR2VuZXJpY1R5cGUgZzEgPSBjcmVhdGVFR2VuZXJpY1R5cGUodGhlRWNvcmVQYWNrYWdlLmdldEVFTGlzdCgpKTsKKwkJRUdlbmVyaWNUeXBlIGcyID0gY3JlYXRlRUdlbmVyaWNUeXBlKHRoZUdyYXBoUGFja2FnZS5nZXREeW5hbWljTGFiZWwoKSk7CisJCWcxLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGcyKTsKKwkJYWRkRVBhcmFtZXRlcihvcCwgZzEsICJsYWJlbHMiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJb3AgPSBhZGRFT3BlcmF0aW9uKHN0YW5kYXJkRGlzZWFzZU1vZGVsRUNsYXNzLCBudWxsLCAiZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCksICJsYWJlbCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxFQ2xhc3MsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwuY2xhc3MsICJTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUVDbGFzcywgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlLmNsYXNzLCAiU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlX1MoKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInMiLCBudWxsLCAwLCAxLCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGVFQ2xhc3MsIFN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUuY2xhc3MsICJTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZV9BcmVhUmF0aW8oKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImFyZWFSYXRpbyIsIG51bGwsIDAsIDEsIFN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHN0YW5kYXJkSW5mZWN0b3JFQ2xhc3MsIFN0YW5kYXJkSW5mZWN0b3IuY2xhc3MsICJTdGFuZGFyZEluZmVjdG9yIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsRUNsYXNzLCBTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbC5jbGFzcywgIlN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxFQ2xhc3MsIFN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbC5jbGFzcywgIlN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3Moc3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEVDbGFzcywgU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbC5jbGFzcywgIlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHNhbml0eUNoZWNrZXJFQ2xhc3MsIFNhbml0eUNoZWNrZXIuY2xhc3MsICJTYW5pdHlDaGVja2VyIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGludGVncmF0aW9uTGFiZWxFQ2xhc3MsIEludGVncmF0aW9uTGFiZWwuY2xhc3MsICJJbnRlZ3JhdGlvbkxhYmVsIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGludGVncmF0aW9uTGFiZWxWYWx1ZUVDbGFzcywgSW50ZWdyYXRpb25MYWJlbFZhbHVlLmNsYXNzLCAiSW50ZWdyYXRpb25MYWJlbFZhbHVlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGludGVncmF0aW9uRGVjb3JhdG9yRUNsYXNzLCBJbnRlZ3JhdGlvbkRlY29yYXRvci5jbGFzcywgIkludGVncmF0aW9uRGVjb3JhdG9yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlhZGRFT3BlcmF0aW9uKGludGVncmF0aW9uRGVjb3JhdG9yRUNsYXNzLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzRGV0ZXJtaW5pc3RpYyIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxFQ2xhc3MsIEFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwuY2xhc3MsICJBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhhZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlRUNsYXNzLCBBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlLmNsYXNzLCAiQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlX0NoaWxkcmVuc0xhYmVscygpLCB0aGlzLmdldFNJTGFiZWwoKSwgbnVsbCwgImNoaWxkcmVuc0xhYmVscyIsIG51bGwsIDAsIC0xLCBBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhhZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWxFQ2xhc3MsIEFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbC5jbGFzcywgIkFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MoYWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxFQ2xhc3MsIEFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsLmNsYXNzLCAiQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHN0b2NoYXN0aWNEaXNlYXNlTW9kZWxFQ2xhc3MsIFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwuY2xhc3MsICJTdG9jaGFzdGljRGlzZWFzZU1vZGVsIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbF9TZWVkKCksIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAic2VlZCIsICIwIiwgMCwgMSwgU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxfUmFuZG9tR2VuZXJhdG9yKCksIHRoaXMuZ2V0UmFuZG9tKCksICJyYW5kb21HZW5lcmF0b3IiLCAiMCIsIDAsIDEsIFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQlpbml0RUNsYXNzKHN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEVDbGFzcywgU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsLmNsYXNzLCAiU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsX0dhaW4oKSwgZWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImdhaW4iLCAiMC4wMSIsIDAsIDEsIFN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJYWRkRU9wZXJhdGlvbihzdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJjb21wdXRlTm9pc2UiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzaXJJbm9jdWxhdG9yRUNsYXNzLCBTSVJJbm9jdWxhdG9yLmNsYXNzLCAiU0lSSW5vY3VsYXRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTSVJJbm9jdWxhdG9yX0lub2N1bGF0ZWRQZXJjZW50YWdlKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJpbm9jdWxhdGVkUGVyY2VudGFnZSIsICIxIiwgMCwgMSwgU0lSSW5vY3VsYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWluaXRFQXR0cmlidXRlKGdldFNJUklub2N1bGF0b3JfSW5vY3VsYXRlUGVyY2VudGFnZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlub2N1bGF0ZVBlcmNlbnRhZ2UiLCAidHJ1ZSIsIDAsIDEsIFNJUklub2N1bGF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCWluaXRFQ2xhc3Moc3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbEVDbGFzcywgU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbC5jbGFzcywgIlN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsRUNsYXNzLCBTdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbC5jbGFzcywgIlN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyhzdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWxFQ2xhc3MsIFN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbC5jbGFzcywgIlN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3MoaW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbkVDbGFzcywgSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbi5jbGFzcywgIkluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbl9MaXN0KCksIHRoaXMuZ2V0SW5mZWN0b3IoKSwgbnVsbCwgImxpc3QiLCBudWxsLCAwLCAtMSwgSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uX0ltcG9ydEZvbGRlcigpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW1wb3J0Rm9sZGVyIiwgIiIsIDAsIDEsIEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcworCQlpbml0RURhdGFUeXBlKHVyaUVEYXRhVHlwZSwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSS5jbGFzcywgIlVSSSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVEYXRhVHlwZShlTGlzdEVEYXRhVHlwZSwgRUxpc3QuY2xhc3MsICJFTGlzdCIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVEYXRhVHlwZShyYW5kb21FRGF0YVR5cGUsIFJhbmRvbS5jbGFzcywgIlJhbmRvbSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBDcmVhdGUgcmVzb3VyY2UKKwkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJfQorCit9IC8vU3RhbmRhcmRQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1N0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzhkMTJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJbXBsLmphdmEKQEAgLTAsMCArMSwyMDEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbCNnZXRHYWluIDxlbT5HYWluPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbCBleHRlbmRzIFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJbXBsIGltcGxlbWVudHMgU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R2FpbigpIDxlbT5HYWluPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRHYWluKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgR0FJTl9FREVGQVVMVCA9IDAuMDE7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHYWluKCkgPGVtPkdhaW48L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEdhaW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgZ2FpbiA9IEdBSU5fRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVEFOREFSRF9TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRHYWluKCkgeworCQlyZXR1cm4gZ2FpbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRHYWluKGRvdWJsZSBuZXdHYWluKSB7CisJCWRvdWJsZSBvbGRHYWluID0gZ2FpbjsKKwkJZ2FpbiA9IG5ld0dhaW47CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0dBSU4sIG9sZEdhaW4sIGdhaW4pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIEJ5IGRlZmF1bHQgdGhpcyBjYWxscyB0aGUgc3RhdGljIG1ldGhvZCBTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJbXBsLmNvbXB1dGVOb2lzZShnYWluLCByYW5kKQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIGRvdWJsZSBjb21wdXRlTm9pc2UoKSB7CisJCXJldHVybiBjb21wdXRlTm9pc2UoZ2FpbiwgcmFuZG9tR2VuZXJhdG9yKTsKKwl9CisJCisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgZG91YmxlIHByZWNpc2lvbiByYW5kb20gbm9pc2UgdmFyaWFibGUKKwkgKiByIGJldHdlZW4gKDEuMCt4KSBhbmQgKDEuMC14KQorCSAqIHdoZXJlIHggaXMgYSBwcm9kdWN0IEcqIE1hdGgucmFuZCgpLCBhbmQgRyBpcyBhIGdhaW4gZmFjdG9yIDA8RzxtYXggbm9pc2UKKwkgKiAKKwkgKiBAcGFyYW0gZ2FpbgorCSAqIEBwYXJhbSByYW5kCisJICogQHJldHVybiBub2lzZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZG91YmxlIGNvbXB1dGVOb2lzZShmaW5hbCBkb3VibGUgZ2FpbiwgZmluYWwgUmFuZG9tIHJhbmQpIHsKKyAgICAgCisJICAgIGFzc2VydCAoZ2FpbiA8PSBTdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbC5nZXRNQVhfR0FJTigpKToiU1RPQ0hBU1RJQyBOT0lTRSBtdXN0IGJlICdzbWFsbCcsIHRoZXJlZm9yZSBnYWluIHBhcmFtZXRlciBtdXN0IGJlIDwgTUFYX0dBSU49IitNQVhfR0FJTjsgLy8gbWF4aW11bSBub2lzZSBzaG91bGQgYmUgMSUKKwkJZG91YmxlIHggPSAoMi4wKnJhbmQubmV4dERvdWJsZSgpKS0xLjA7IC8vICsvLSAxCisJCXggKj0gZ2FpbjsKKwkJeCArPSAxLjA7CisJCWFzc2VydCAoKHg+MC4wKSYmKHg8Mi4wKSkgOiAicmFuZG9tIG5vaXNlIHNob3VsZCBiZSBhIHNtYWxsIHBlcnR1cmJhdGlvbiBHYWluIGZhY3RvciwgZywgIG11c3QgMC4wIDwgZyA8PCAxLjAgIjsKKwkJcmV0dXJuIHg7CisJCQorCX0gLy8gZ2V0Tm9pc2UKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1NUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fR0FJTjoKKwkJCQlyZXR1cm4gZ2V0R2FpbigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0dBSU46CisJCQkJc2V0R2FpbigoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19HQUlOOgorCQkJCXNldEdhaW4oR0FJTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0dBSU46CisJCQkJcmV0dXJuIGdhaW4gIT0gR0FJTl9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGdhaW46ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZ2Fpbik7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1N0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTJlMDZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjI2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RvY2hhc3RpYyBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbCNnZXRTZWVkIDxlbT5TZWVkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbCNnZXRSYW5kb21HZW5lcmF0b3IgPGVtPlJhbmRvbSBHZW5lcmF0b3I8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbCBleHRlbmRzIERpc2Vhc2VNb2RlbEltcGwgaW1wbGVtZW50cyBTdG9jaGFzdGljRGlzZWFzZU1vZGVsIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VlZCgpIDxlbT5TZWVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTZWVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgU0VFRF9FREVGQVVMVCA9IDBMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VlZCgpIDxlbT5TZWVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTZWVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgbG9uZyBzZWVkID0gU0VFRF9FREVGQVVMVDsKKwkKKwkvKioKKwkgKiBUaGlzIGlzIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBhbGxvd2VkIG5vaXNlLiAKKwkgKiBJbiBhbnkgc3RvY2hhc3RpYyBtb2RlbCB0aGUgbm9pc2Ugc2hvdWxkIGNhdXNlIG9ubHkgYSBzbWFsbCBwdXJ0dXJiYXRpb24KKwkgKiBvZiB0aGUgZGV0ZXJtaW5pc3RpYyBtb2RlbCAocGVyaGFwcyBvZiB0aGUgb3JkZXIgb2YgdGhlIGJhY2tncm91bmQgZGVhdGggcmF0ZSBvciBhYm91dCAxLzUwKS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBzZXQgaGVyZSBtYXkgYmUgb3ZlcnJpZGRlbiBieSBzZXR0ZXIgYSBzZXR0ZXIgbWV0aG9kLgorCSAqKi8KKwlzdGF0aWMgZG91YmxlIE1BWF9HQUlOID0gMC4wMjsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYW5kb21HZW5lcmF0b3IoKSA8ZW0+UmFuZG9tIEdlbmVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmFuZG9tR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJhbmRvbSBSQU5ET01fR0VORVJBVE9SX0VERUZBVUxUID0gKFJhbmRvbSlTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRS5nZXRSYW5kb20oKSwgIjAiKTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmRvbUdlbmVyYXRvcigpIDxlbT5SYW5kb20gR2VuZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSYW5kb21HZW5lcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBSYW5kb20gcmFuZG9tR2VuZXJhdG9yID0gUkFORE9NX0dFTkVSQVRPUl9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGxvbmcgZ2V0U2VlZCgpIHsKKwkJcmV0dXJuIHNlZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlZWQobG9uZyBuZXdTZWVkKSB7CisJCWxvbmcgb2xkU2VlZCA9IHNlZWQ7CisJCXNlZWQgPSBuZXdTZWVkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19TRUVELCBvbGRTZWVkLCBzZWVkKSk7CisJCXJhbmRvbUdlbmVyYXRvci5zZXRTZWVkKG5ld1NlZWQpOworCX0gLy8gc2V0U2VlZAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJhbmRvbSBnZXRSYW5kb21HZW5lcmF0b3IoKSB7CisJCXJldHVybiByYW5kb21HZW5lcmF0b3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19TRUVEOgorCQkJCXJldHVybiBnZXRTZWVkKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1I6CisJCQkJcmV0dXJuIGdldFJhbmRvbUdlbmVyYXRvcigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1NFRUQ6CisJCQkJc2V0U2VlZCgoTG9uZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fU0VFRDoKKwkJCQlzZXRTZWVkKFNFRURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19TRUVEOgorCQkJCXJldHVybiBzZWVkICE9IFNFRURfRURFRkFVTFQ7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1I6CisJCQkJcmV0dXJuIFJBTkRPTV9HRU5FUkFUT1JfRURFRkFVTFQgPT0gbnVsbCA/IHJhbmRvbUdlbmVyYXRvciAhPSBudWxsIDogIVJBTkRPTV9HRU5FUkFUT1JfRURFRkFVTFQuZXF1YWxzKHJhbmRvbUdlbmVyYXRvcik7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChzZWVkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHNlZWQpOworCQlyZXN1bHQuYXBwZW5kKCIsIHJhbmRvbUdlbmVyYXRvcjogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChyYW5kb21HZW5lcmF0b3IpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRNQVhfR0FJTigpIHsKKwkJcmV0dXJuIE1BWF9HQUlOOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNQVhfR0FJTihkb3VibGUgbWF4X2dhaW4pIHsKKwkJTUFYX0dBSU4gPSBtYXhfZ2FpbjsKKwl9CisKK30gLy9TdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1N0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTAxZWVhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWxJbXBsLmphdmEKQEAgLTAsMCArMSwxNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubWF0aC5CaW5vbWlhbERpc3RyaWJ1dGlvblV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdG9jaGFzdGljIFBvaXNzb24gU0VJUiBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsSW1wbCBleHRlbmRzIFNFSVJJbXBsIGltcGxlbWVudHMgU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsIHsKKworCXByaXZhdGUgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKCk7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBTdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lJbXBsI2NvbXB1dGVEaXNlYXNlRGVsdGFzKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSwKKwkgKiAgICAgIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwsIGxvbmcpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjb21wdXRlRGlzZWFzZURlbHRhcygKKwkJCWZpbmFsIFNURU1UaW1lIHRpbWUsIAorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGN1cnJlbnRTdGF0ZSwKKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgZGlzZWFzZUxhYmVsLCBmaW5hbCBsb25nIHRpbWVEZWx0YSwgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSByZXR1cm5WYWx1ZSkgeworCQlmaW5hbCBTRUlSTGFiZWxWYWx1ZSBjdXJyZW50U0VJUiA9IChTRUlSTGFiZWxWYWx1ZSkgY3VycmVudFN0YXRlOworCQorCQkvLyBUaGlzIGlzIGJldGEqCisJCWRvdWJsZSB0cmFuc21pc3Npb25SYXRlID0gZ2V0QWRqdXN0ZWRUcmFuc21pc3Npb25SYXRlKHRpbWVEZWx0YSk7CisJCQorCQlpZighdGhpcy5pc0ZyZXF1ZW5jeURlcGVuZGVudCgpKSB0cmFuc21pc3Npb25SYXRlICo9IGdldFRyYW5zbWlzc2lvblJhdGVTY2FsZUZhY3RvcihkaXNlYXNlTGFiZWwpOworCQkKKwkJCQorCQkvLyBUaGUgZWZmZWN0aXZlIEluZmVjdGlvdXMgcG9wdWxhdGlvbiAgaXMgYSBkaW1lbnNpb25sZXMgbnVtYmVyIG5vcm1hbGl6ZSBieSB0b3RhbAorCQkvLyBwb3B1bGF0aW9uIHVzZWQgaW4gdGVoIGNvbXB1dGF0aW9uIG9mIGJldHMqUyppIHdoZXJlIGkgPSBJZWZmZWN0aXZlL1BvcC4KKwkJLy8gVGhpcyBpbmNsdWRlcyBhIGNvcnJlY3Rpb24gdG8gdGhlIGN1cnJlbnQKKwkJLy8gaW5mZWN0aW91cyBwb3B1bGF0aW9uIChJZWZmZWN0aXZlKSBiYXNlZCBvbiB0aGUgY29uc2VydmVkIGV4Y2hhbmdlIG9mIHBlb3BsZSAoY2lyY3VsYXRpb24pCisJCS8vIGJldHdlZW4gcmVnaW9ucy4gTm90ZSB0aGF0IHRoaXMgaXMgbm8gdGhlICJhcnJpdmFscyIgYW5kICJkZXBhcnR1cmVzIiB3aGljaCBhcmUKKwkJLy8gYSBkaWZmZXJlbnQgcHJvY2Vzcy4KKwkJZmluYWwgZG91YmxlIGVmZmVjdGl2ZUluZmVjdGlvdXMgPSBnZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cyhkaXNlYXNlTGFiZWwuZ2V0Tm9kZSgpLCBkaXNlYXNlTGFiZWwsIGN1cnJlbnRTRUlSLmdldEkoKSk7CisKKwkJLyoKKwkJICogQ29tcHV0ZSBzdGF0ZSB0cmFuc2l0aW9ucworCQkgKiAKKwkJICogUmVnYXJkaW5nIGNvbXB1dGluZyB0aGUgbnVtYmVyIG9mIHRyYW5zaXRpb25zIGZyb20gU3VzY2VwdGlibGUgdG8gRXhwb3NlZDoKKwkJICogSW4gYSBsaW5lYXIgbW9kZWwgdGhlICJlZmZlY3RpdmUiIG51bWJlciBvZiBpbmZlY3Rpb3VzIHBlb3BsZSBpcyBqdXN0CisJCSAqIHRoZSBudW1iZXIgb2YgaW5mZWN0aW91cyBwZW9wbGUgSW4gYSBub25saW5lYXIgbW9kZWwgd2UgaGF2ZSBhCisJCSAqIG5vbkxpbmVhcml0eSBleHBvbmVudCB0aGF0IGlzID4gMSB0aGlzIG1vZGVscyB0aGUgZWZmZWN0IG9mIGltbXVuZQorCQkgKiBzeXN0ZW0gc2F0dXJhdGlvbiB3aGVuIFN1c2NlcHRpYmxlIHBlb3BsZSBhcmUgZXhwb3NlZCB0byBsYXJnZQorCQkgKiBudW1iZXJzIG9mIGluZmVjdGlvdXMgcGVvcGxlLiB0aGVuIHRoZSAiZWZmZWN0aXZlIiBudW1iZXIgb2YKKwkJICogaW5mZWN0aW91cyBwZW9wbGUgaXMgSV5ub25MaW5lYXJpdHkgZXhwb25lbnQgdG8gYWxsb3cgZm9yIGVpdGhlcgorCQkgKiBsaW5lYXIgb3Igbm9ubGluZWFyIG1vZGVscyB3ZSBhbHdheXMgY2FsY3VsYXRlIElebm9uTGluZWFyaXR5CisJCSAqIGV4cG9uZW50IGFuZCBhbGxvdyBub25MaW5lYXJpdHkgZXhwb25lbnQgPj0gMS4wCisJCSAqLworCQlkb3VibGUgbnVtYmVyT2ZJbmZlY3RlZFRvUmVjb3ZlcmVkID0gZ2V0QWRqdXN0ZWRSZWNvdmVyeVJhdGUodGltZURlbHRhKQorCQkqIGN1cnJlbnRTRUlSLmdldEkoKTsKKwkJZG91YmxlIG51bWJlck9mUmVjb3ZlcmVkVG9TdXNjZXB0aWJsZSA9IGdldEFkanVzdGVkSW1tdW5pdHlMb3NzUmF0ZSh0aW1lRGVsdGEpCisJCSogY3VycmVudFNFSVIuZ2V0UigpOworCQkKKwkJaW50IFMgPSAoaW50KWN1cnJlbnRTRUlSLmdldFMoKTsKKwkJZG91YmxlIHByb2IgPSAwLjA7CisJCWlmKGdldE5vbkxpbmVhcml0eUNvZWZmaWNpZW50KCkgIT0gMS4wICYmIGVmZmVjdGl2ZUluZmVjdGlvdXMgPj0gMC4wKQorCQkJcHJvYiA9IHRyYW5zbWlzc2lvblJhdGUgKiBNYXRoLnBvdyhlZmZlY3RpdmVJbmZlY3Rpb3VzLCBnZXROb25MaW5lYXJpdHlDb2VmZmljaWVudCgpKTsKKwkJZWxzZQorCQkJcHJvYiA9IHRyYW5zbWlzc2lvblJhdGUgKiBlZmZlY3RpdmVJbmZlY3Rpb3VzOworCSAgICBkb3VibGUgcm5kVmFyID0gcmFuZC5uZXh0RG91YmxlKCk7CisJICAgIGludCBwaWNrTiA9IDA7CisJICAgIHBpY2tOID0gQmlub21pYWxEaXN0cmlidXRpb25VdGlsLmZhc3RQaWNrRnJvbUJpbm9taWFsRGlzdChwcm9iLCBTLCBybmRWYXIpOworCSAgICAJICAKKwkJLy8gTW92ZSBwaWNrSyBmcm9tIFMgdG8gSTsKKwkJCisJCWRvdWJsZSBudW1iZXJPZlN1c2NlcHRpYmxlVG9FeHBvc2VkID0gcGlja047CisJCQorCQkKKwkJCisJCWRvdWJsZSBudW1iZXJPZkV4cG9zZWRUb0luZmVjdGlvdXMgPSBnZXRBZGp1c3RlZEluY3ViYXRpb25SYXRlKHRpbWVEZWx0YSkKKwkJKiBjdXJyZW50U0VJUi5nZXRFKCk7CisJCQkKKwkJCisJCS8vIERldGVybWluZSBkZWx0YSBTCisJCWZpbmFsIGRvdWJsZSBkZWx0YVMgPSBudW1iZXJPZlJlY292ZXJlZFRvU3VzY2VwdGlibGUgLSBudW1iZXJPZlN1c2NlcHRpYmxlVG9FeHBvc2VkOworCQkvLyBEZXRlcm1pbmUgZGVsdGEgRQorCQlmaW5hbCBkb3VibGUgZGVsdGFFID0gbnVtYmVyT2ZTdXNjZXB0aWJsZVRvRXhwb3NlZCAtIG51bWJlck9mRXhwb3NlZFRvSW5mZWN0aW91czsJCQorCQkvLyBEZXRlcm1pbmUgZGVsdGEgSQorCQlmaW5hbCBkb3VibGUgZGVsdGFJID0gbnVtYmVyT2ZFeHBvc2VkVG9JbmZlY3Rpb3VzIC0gbnVtYmVyT2ZJbmZlY3RlZFRvUmVjb3ZlcmVkOworCQkvLyBEZXRlcm1pbmUgZGVsdGEgUgorCQlmaW5hbCBkb3VibGUgZGVsdGFSID0gbnVtYmVyT2ZJbmZlY3RlZFRvUmVjb3ZlcmVkIC0gbnVtYmVyT2ZSZWNvdmVyZWRUb1N1c2NlcHRpYmxlOworCQkKKwkJU0VJUkxhYmVsVmFsdWVJbXBsIHJldCA9IChTRUlSTGFiZWxWYWx1ZUltcGwpcmV0dXJuVmFsdWU7CisJCXJldC5zZXRTKGRlbHRhUyk7CisJCXJldC5zZXRFKGRlbHRhRSk7CisJCXJldC5zZXRJKGRlbHRhSSk7CisJCXJldC5zZXRJbmNpZGVuY2UobnVtYmVyT2ZTdXNjZXB0aWJsZVRvRXhwb3NlZCk7CisJCXJldC5zZXRSKGRlbHRhUik7CisJCXJldC5zZXREaXNlYXNlRGVhdGhzKDApOworCQlyZXR1cm4gcmV0OworCQorCX0gLy8gY29tcHV0ZURpc2Vhc2VEZWx0YXMKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0RldGVybWluaXN0aWMoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RPQ0hBU1RJQ19QT0lTU09OX1NFSVJfRElTRUFTRV9NT0RFTDsKKwl9CisKKwlwdWJsaWMgdm9pZCBkb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyhMYWJlbFZhbHVlIGxhYmVsKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCisJfQorCisJCit9IC8vU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOWZiODAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1N0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWxJbXBsLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1hdGguQmlub21pYWxEaXN0cmlidXRpb25VdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0b2NoYXN0aWMgUG9pc3NvbiBTSSBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbEltcGwgZXh0ZW5kcyBTSUltcGwgaW1wbGVtZW50cyBTdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCXByaXZhdGUgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKCk7CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZERpc2Vhc2VNb2RlbEltcGwjY29tcHV0ZVRyYW5zaXRpb25zKG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUsCisJICogICAgICBsb25nLCBkb3VibGUsIGxvbmcpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjb21wdXRlRGlzZWFzZURlbHRhcygKKwkJCWZpbmFsIFNURU1UaW1lIHRpbWUsCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY3VycmVudFN0YXRlLAorCQkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBkaXNlYXNlTGFiZWwsIGZpbmFsIGxvbmcgdGltZURlbHRhLCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHJldHVyblZhbHVlKSB7CisJCSAKKwkJZmluYWwgU0lMYWJlbFZhbHVlIGN1cnJlbnRTSSA9IChTSUxhYmVsVmFsdWUpIGN1cnJlbnRTdGF0ZTsKKwkJCisJCS8vIFRoaXMgaXMgYmV0YSoKKwkJZG91YmxlIHRyYW5zbWlzc2lvblJhdGUgPSBnZXRBZGp1c3RlZFRyYW5zbWlzc2lvblJhdGUodGltZURlbHRhKTsKKwkJCQkKKwkJaWYoIXRoaXMuaXNGcmVxdWVuY3lEZXBlbmRlbnQoKSkgdHJhbnNtaXNzaW9uUmF0ZSAqPSBnZXRUcmFuc21pc3Npb25SYXRlU2NhbGVGYWN0b3IoZGlzZWFzZUxhYmVsKTsKKworCQkvLyBUaGUgZWZmZWN0aXZlIEluZmVjdGlvdXMgcG9wdWxhdGlvbiAgaXMgYSBkaW1lbnNpb25sZXMgbnVtYmVyIG5vcm1hbGl6ZSBieSB0b3RhbAorCQkvLyBwb3B1bGF0aW9uIHVzZWQgaW4gdGVoIGNvbXB1dGF0aW9uIG9mIGJldHMqUyppIHdoZXJlIGkgPSBJZWZmZWN0aXZlL1BvcC4KKwkJLy8gVGhpcyBpbmNsdWRlcyBhIGNvcnJlY3Rpb24gdG8gdGhlIGN1cnJlbnQKKwkJLy8gaW5mZWN0aW91cyBwb3B1bGF0aW9uIChJZWZmZWN0aXZlKSBiYXNlZCBvbiB0aGUgY29uc2VydmVkIGV4Y2hhbmdlIG9mIHBlb3BsZSAoY2lyY3VsYXRpb24pCisJCS8vIGJldHdlZW4gcmVnaW9ucy4gTm90ZSB0aGF0IHRoaXMgaXMgbm8gdGhlICJhcnJpdmFscyIgYW5kICJkZXBhcnR1cmVzIiB3aGljaCBhcmUKKwkJLy8gYSBkaWZmZXJlbnQgcHJvY2Vzcy4KKwkJZmluYWwgZG91YmxlIGVmZmVjdGl2ZUluZmVjdGlvdXMgPSBnZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cyhkaXNlYXNlTGFiZWwuZ2V0Tm9kZSgpLCBkaXNlYXNlTGFiZWwsIGN1cnJlbnRTSS5nZXRJKCkpOworCisJCWludCBTID0gKGludCljdXJyZW50U0kuZ2V0UygpOworCQlkb3VibGUgcHJvYiA9IDAuMDsKKwkJaWYoZ2V0Tm9uTGluZWFyaXR5Q29lZmZpY2llbnQoKSAhPSAxLjAgJiYgZWZmZWN0aXZlSW5mZWN0aW91cyA+PSAwLjApCisJCQlwcm9iID0gdHJhbnNtaXNzaW9uUmF0ZSAqIE1hdGgucG93KGVmZmVjdGl2ZUluZmVjdGlvdXMsIGdldE5vbkxpbmVhcml0eUNvZWZmaWNpZW50KCkpOworCQllbHNlCisJCQlwcm9iID0gdHJhbnNtaXNzaW9uUmF0ZSAqIGVmZmVjdGl2ZUluZmVjdGlvdXM7CisJICAgIGRvdWJsZSBybmRWYXIgPSByYW5kLm5leHREb3VibGUoKTsKKwkgICAgaW50IHBpY2tOID0gMDsKKwkgICAgcGlja04gPSBCaW5vbWlhbERpc3RyaWJ1dGlvblV0aWwuZmFzdFBpY2tGcm9tQmlub21pYWxEaXN0KHByb2IsIFMsIHJuZFZhcik7CisJICAgIAkgIAorCQkvLyBNb3ZlIHBpY2tLIGZyb20gUyB0byBJOworCQkKKwkJZG91YmxlIG51bWJlck9mU3VzY2VwdGlibGVUb0luZmVjdGVkID0gcGlja047CisJCQorCQlkb3VibGUgbnVtYmVyT2ZJbmZlY3RlZFRvU3VzY2VwdGlibGUgPSBnZXRBZGp1c3RlZFJlY292ZXJ5UmF0ZSh0aW1lRGVsdGEpCisJCQkJKiBjdXJyZW50U0kuZ2V0SSgpOworCQkKKwkKKwkJLy8gRGV0ZXJtaW5lIGRlbHRhIFMKKwkJZmluYWwgZG91YmxlIGRlbHRhUyA9IC0gbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQgKyBudW1iZXJPZkluZmVjdGVkVG9TdXNjZXB0aWJsZTsKKwkJLy8gRGV0ZXJtaW5lIGRlbHRhIEkKKwkJZmluYWwgZG91YmxlIGRlbHRhSSA9IG51bWJlck9mU3VzY2VwdGlibGVUb0luZmVjdGVkIC0gbnVtYmVyT2ZJbmZlY3RlZFRvU3VzY2VwdGlibGU7CQorCQorCQlTSUxhYmVsVmFsdWVJbXBsIHJldCA9IChTSUxhYmVsVmFsdWVJbXBsKXJldHVyblZhbHVlOworCQlyZXQuc2V0UyhkZWx0YVMpOworCQlyZXQuc2V0SShkZWx0YUkpOworCQlyZXQuc2V0SW5jaWRlbmNlKG51bWJlck9mU3VzY2VwdGlibGVUb0luZmVjdGVkKTsKKwkJcmV0LnNldERpc2Vhc2VEZWF0aHMoMC4wKTsKKwkJcmV0dXJuIHJldDsKKwl9IC8vIGNvbXB1dGVEaXNlYXNlRGVsdGFzCisJCisJCSAKKwkJIHB1YmxpYyB2b2lkIGRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKExhYmVsVmFsdWUgbGFiZWwpIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJCisJCQl9CisJCSAKKwkgQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGlzRGV0ZXJtaW5pc3RpYygpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCSAKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVE9DSEFTVElDX1BPSVNTT05fU0lfRElTRUFTRV9NT0RFTDsKKwl9CisKK30gLy9TdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ4MjllMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxJbXBsLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1hdGguQmlub21pYWxEaXN0cmlidXRpb25VdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RvY2hhc3RpYyBQb2lzc29uIFNJUiBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxJbXBsIGV4dGVuZHMgU0lSSW1wbCBpbXBsZW1lbnRzIFN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsIHsKKwlwcml2YXRlIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgpOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lJbXBsI2NvbXB1dGVUcmFuc2l0aW9ucyhTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUsCisJICogICAgICBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsLCBsb25nKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY29tcHV0ZURpc2Vhc2VEZWx0YXMoCisJCQlmaW5hbCBTVEVNVGltZSB0aW1lLCAKKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjdXJyZW50U3RhdGUsCisJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VMYWJlbCwgZmluYWwgbG9uZyB0aW1lRGVsdGEsIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgcmV0dXJuVmFsdWUpIHsKKwkJZmluYWwgU0lSTGFiZWxWYWx1ZSBjdXJyZW50U0lSID0gKFNJUkxhYmVsVmFsdWUpIGN1cnJlbnRTdGF0ZTsKKwkJCisJCS8vIFRoaXMgaXMgYmV0YSoKKwkJZG91YmxlIHRyYW5zbWlzc2lvblJhdGUgPSBnZXRBZGp1c3RlZFRyYW5zbWlzc2lvblJhdGUodGltZURlbHRhKTsKKwkJCQkKKwkJaWYoIXRoaXMuaXNGcmVxdWVuY3lEZXBlbmRlbnQoKSkgdHJhbnNtaXNzaW9uUmF0ZSAqPSBnZXRUcmFuc21pc3Npb25SYXRlU2NhbGVGYWN0b3IoZGlzZWFzZUxhYmVsKTsKKworCQkvLyBUaGUgZWZmZWN0aXZlIEluZmVjdGlvdXMgcG9wdWxhdGlvbiAgaXMgYSBkaW1lbnNpb25sZXMgbnVtYmVyIG5vcm1hbGl6ZSBieSB0b3RhbAorCQkvLyBwb3B1bGF0aW9uIHVzZWQgaW4gdGVoIGNvbXB1dGF0aW9uIG9mIGJldHMqUyppIHdoZXJlIGkgPSBJZWZmZWN0aXZlL1BvcC4KKwkJLy8gVGhpcyBpbmNsdWRlcyBhIGNvcnJlY3Rpb24gdG8gdGhlIGN1cnJlbnQKKwkJLy8gaW5mZWN0aW91cyBwb3B1bGF0aW9uIChJZWZmZWN0aXZlKSBiYXNlZCBvbiB0aGUgY29uc2VydmVkIGV4Y2hhbmdlIG9mIHBlb3BsZSAoY2lyY3VsYXRpb24pCisJCS8vIGJldHdlZW4gcmVnaW9ucy4gTm90ZSB0aGF0IHRoaXMgaXMgbm8gdGhlICJhcnJpdmFscyIgYW5kICJkZXBhcnR1cmVzIiB3aGljaCBhcmUKKwkJLy8gYSBkaWZmZXJlbnQgcHJvY2Vzcy4KKwkJZmluYWwgZG91YmxlIGVmZmVjdGl2ZUluZmVjdGlvdXMgPSBnZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cyhkaXNlYXNlTGFiZWwuZ2V0Tm9kZSgpLCBkaXNlYXNlTGFiZWwsIGN1cnJlbnRTSVIuZ2V0SSgpKTsKKworCQkvKgorCQkgKiBDb21wdXRlIHN0YXRlIHRyYW5zaXRpb25zCisJCSAqIAorCQkgKiBSZWdhcmRpbmcgY29tcHV0aW5nIHRoZSBudW1iZXIgb2YgdHJhbnNpdGlvbnMgZnJvbSBTdXNjZXB0aWJsZSB0byBFeHBvc2VkOgorCQkgKiBJbiBhIGxpbmVhciBtb2RlbCB0aGUgImVmZmVjdGl2ZSIgbnVtYmVyIG9mIGluZmVjdGlvdXMgcGVvcGxlIGlzIGp1c3QKKwkJICogdGhlIG51bWJlciBvZiBpbmZlY3Rpb3VzIHBlb3BsZSBJbiBhIG5vbmxpbmVhciBtb2RlbCB3ZSBoYXZlIGEKKwkJICogbm9uTGluZWFyaXR5IGV4cG9uZW50IHRoYXQgaXMgPiAxIHRoaXMgbW9kZWxzIHRoZSBlZmZlY3Qgb2YgaW1tdW5lCisJCSAqIHN5c3RlbSBzYXR1cmF0aW9uIHdoZW4gU3VzY2VwdGlibGUgcGVvcGxlIGFyZSBleHBvc2VkIHRvIGxhcmdlCisJCSAqIG51bWJlcnMgb2YgaW5mZWN0aW91cyBwZW9wbGUuIHRoZW4gdGhlICJlZmZlY3RpdmUiIG51bWJlciBvZgorCQkgKiBpbmZlY3Rpb3VzIHBlb3BsZSBpcyBJXm5vbkxpbmVhcml0eSBleHBvbmVudCB0byBhbGxvdyBmb3IgZWl0aGVyCisJCSAqIGxpbmVhciBvciBub25saW5lYXIgbW9kZWxzIHdlIGFsd2F5cyBjYWxjdWxhdGUgSV5ub25MaW5lYXJpdHkKKwkJICogZXhwb25lbnQgYW5kIGFsbG93IG5vbkxpbmVhcml0eSBleHBvbmVudCA+PSAxLjAKKwkJICovCisJCWRvdWJsZSBudW1iZXJPZkluZmVjdGVkVG9SZWNvdmVyZWQgPSBnZXRBZGp1c3RlZFJlY292ZXJ5UmF0ZSh0aW1lRGVsdGEpCisJCSogY3VycmVudFNJUi5nZXRJKCk7CisJCWRvdWJsZSBudW1iZXJPZlJlY292ZXJlZFRvU3VzY2VwdGlibGUgPSBnZXRBZGp1c3RlZEltbXVuaXR5TG9zc1JhdGUodGltZURlbHRhKQorCQkqIGN1cnJlbnRTSVIuZ2V0UigpOworCQkKKwkJaW50IFMgPSAoaW50KWN1cnJlbnRTSVIuZ2V0UygpOworCQlkb3VibGUgcHJvYiA9IDAuMDsKKwkJaWYoZ2V0Tm9uTGluZWFyaXR5Q29lZmZpY2llbnQoKSAhPSAxLjAgJiYgZWZmZWN0aXZlSW5mZWN0aW91cyA+PSAwLjApCisJCQlwcm9iID0gdHJhbnNtaXNzaW9uUmF0ZSAqIE1hdGgucG93KGVmZmVjdGl2ZUluZmVjdGlvdXMsIGdldE5vbkxpbmVhcml0eUNvZWZmaWNpZW50KCkpOworCQllbHNlCisJCQlwcm9iID0gdHJhbnNtaXNzaW9uUmF0ZSAqIGVmZmVjdGl2ZUluZmVjdGlvdXM7CisJICAgIGRvdWJsZSBybmRWYXIgPSByYW5kLm5leHREb3VibGUoKTsKKwkgICAgaW50IHBpY2tOID0gMDsKKwkgICAgcGlja04gPSBCaW5vbWlhbERpc3RyaWJ1dGlvblV0aWwuZmFzdFBpY2tGcm9tQmlub21pYWxEaXN0KHByb2IsIFMsIHJuZFZhcik7CisJICAgIAkgIAorCQkvLyBNb3ZlIHBpY2tLIGZyb20gUyB0byBJOworCQkKKwkJZG91YmxlIG51bWJlck9mU3VzY2VwdGlibGVUb0luZmVjdGVkID0gcGlja047CisJCQorCQkvLyBEZXRlcm1pbmUgZGVsdGEgUworCQlmaW5hbCBkb3VibGUgZGVsdGFTID0gbnVtYmVyT2ZSZWNvdmVyZWRUb1N1c2NlcHRpYmxlIC0gbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQ7CisJCQkvLyBEZXRlcm1pbmUgZGVsdGEgSQorCQlmaW5hbCBkb3VibGUgZGVsdGFJID0gbnVtYmVyT2ZTdXNjZXB0aWJsZVRvSW5mZWN0ZWQtIG51bWJlck9mSW5mZWN0ZWRUb1JlY292ZXJlZDsKKwkJLy8gRGV0ZXJtaW5lIGRlbHRhIFIKKwkJZmluYWwgZG91YmxlIGRlbHRhUiA9IG51bWJlck9mSW5mZWN0ZWRUb1JlY292ZXJlZCAtIG51bWJlck9mUmVjb3ZlcmVkVG9TdXNjZXB0aWJsZTsKKwkJCisJCVNJUkxhYmVsVmFsdWVJbXBsIHJldCA9IChTSVJMYWJlbFZhbHVlSW1wbClyZXR1cm5WYWx1ZTsKKwkJcmV0LnNldFMoZGVsdGFTKTsKKwkJcmV0LnNldEkoZGVsdGFJKTsKKwkJcmV0LnNldEluY2lkZW5jZShudW1iZXJPZkluZmVjdGVkVG9SZWNvdmVyZWQpOworCQlyZXQuc2V0UihkZWx0YVIpOworCQlyZXQuc2V0RGlzZWFzZURlYXRocygwKTsKKwkJcmV0dXJuIHJldDsKKwkJCisJfSAvLyBjb21wdXRlVHJhbnNpdGlvbnMKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVE9DSEFTVElDX1BPSVNTT05fU0lSX0RJU0VBU0VfTU9ERUw7CisJfQorCisJcHVibGljIHZvaWQgZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoTGFiZWxWYWx1ZSBsYWJlbCkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRGV0ZXJtaW5pc3RpYygpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKK30gLy9TdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1N0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YzhkNWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9pbXBsL1N0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsNDEzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RvY2hhc3RpYyBTRUlSIERpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsSW1wbCNnZXRTZWVkIDxlbT5TZWVkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbEltcGwjZ2V0UmFuZG9tR2VuZXJhdG9yIDxlbT5SYW5kb20gR2VuZXJhdG9yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbEltcGwjZ2V0R2FpbiA8ZW0+R2FpbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsSW1wbCBleHRlbmRzIFNFSVJJbXBsIGltcGxlbWVudHMKKwkJU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwgeworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlZWQoKSA8ZW0+U2VlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2VlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIFNFRURfRURFRkFVTFQgPSAwTDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWVkKCkgPGVtPlNlZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNlZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBsb25nIHNlZWQgPSBTRUVEX0VERUZBVUxUOworCQorCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYW5kb21HZW5lcmF0b3IoKSA8ZW0+UmFuZG9tIEdlbmVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmFuZG9tR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJhbmRvbSBSQU5ET01fR0VORVJBVE9SX0VERUZBVUxUID0gKFJhbmRvbSlTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRS5nZXRSYW5kb20oKSwgIjAiKTsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYW5kb21HZW5lcmF0b3IoKSA8ZW0+UmFuZG9tIEdlbmVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmFuZG9tR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUmFuZG9tIHJhbmRvbUdlbmVyYXRvciA9IFJBTkRPTV9HRU5FUkFUT1JfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdhaW4oKSA8ZW0+R2FpbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0R2FpbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgR0FJTl9FREVGQVVMVCA9IDAuMDE7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R2FpbigpIDxlbT5HYWluPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRHYWluKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIGdhaW4gPSBHQUlOX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBUaGUgY29uc3RydWN0b3IgbmVlZHMgdG8gYmUgcHVibGljIHNvIHRoYXQgdGhlIG5ldyBkaXNlYXNlIHdpemFyZCBjYW4KKwkgKiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHdpdGhvdXQgdXNpbmcgdGhlIGZhY3RvcnkuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBkaXNlYXNlTW9kZWxOYW1lCisJICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZGlzZWFzZSBtb2RlbAorCSAqIEBwYXJhbSBiYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZQorCSAqIEBwYXJhbSBpbmZlY3Rpb3VzTW9ydGFsaXR5CisJICogQHBhcmFtIHRyYW5zbWlzc2lvblJhdGUKKwkgKiBAcGFyYW0gcmVjb3ZlcnlSYXRlCisJICogQHBhcmFtIGltbXVuaXR5TG9zc1JhdGUKKwkgKiBAcGFyYW0gaW5jdWJhdGlvblJhdGUKKwkgKiBAcGFyYW0gbm9uTGluZWFyaXR5Q29lZmZpY2llbnQKKwkgKiBAcGFyYW0gdGltZVBlcmlvZAorCSAqICAgICAgICAgICAgdGhlIHRpbWUgcGVyaW9kIGZvciB0aGUgcmF0ZXMgKG1pbGxpc2Vjb25kcykKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbklkZW50aWZpZXIKKwkgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwb3B1bGF0aW9uIGFmZmVjdGVkIGJ5IHRoZSBkaXNlYXNlCisJICogQHBhcmFtIGdhaW4gCisJICogQHJldHVybiBhbiBpbml0aWFsaXplZCBpbnN0YW5jZSBvZiBTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwgY3JlYXRlU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwoCisJCQlmaW5hbCBTdHJpbmcgZGlzZWFzZU1vZGVsTmFtZSwKKwkJCWZpbmFsIGRvdWJsZSBiYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSwKKwkJCWZpbmFsIGRvdWJsZSBpbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSwKKwkJCWZpbmFsIGRvdWJsZSB0cmFuc21pc3Npb25SYXRlLCBmaW5hbCBkb3VibGUgcmVjb3ZlcnlSYXRlLAorCQkJZmluYWwgZG91YmxlIGltbXVuaXR5TG9zc1JhdGUsIGZpbmFsIGRvdWJsZSBpbmN1YmF0aW9uUmF0ZSwKKwkJCWZpbmFsIGRvdWJsZSBub25MaW5lYXJpdHlDb2VmZmljaWVudCwgZmluYWwgbG9uZyB0aW1lUGVyaW9kLAorCQkJZmluYWwgU3RyaW5nIHBvcHVsYXRpb25JZGVudGlmaWVyLCBkb3VibGUgZ2FpbikgeworCQkKKwkJZmluYWwgU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwgc2VpckRpc2Vhc2VNb2RlbCA9IFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwoKTsKKwkJCisJCWluaXRpYWxpemVTRUlSRGlzZWFzZU1vZGVsKHNlaXJEaXNlYXNlTW9kZWwsIGRpc2Vhc2VNb2RlbE5hbWUsCisJCQkJYmFja2dyb3VuZE1vcnRhbGl0eVJhdGUsCisJCQkJaW5mZWN0aW91c01vcnRhbGl0eVJhdGUsIHRyYW5zbWlzc2lvblJhdGUsIHJlY292ZXJ5UmF0ZSwKKwkJCQlpbW11bml0eUxvc3NSYXRlLCBpbmN1YmF0aW9uUmF0ZSwgbm9uTGluZWFyaXR5Q29lZmZpY2llbnQsCisJCQkJdGltZVBlcmlvZCwgcG9wdWxhdGlvbklkZW50aWZpZXIpOworCQkKKwkJc2VpckRpc2Vhc2VNb2RlbC5zZXRHYWluKGdhaW4pOworCQkKKwkJcmV0dXJuIHNlaXJEaXNlYXNlTW9kZWw7CisJfSAvLyBjcmVhdGVTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbAorCisKKwkvKioKKwkgKiBNb2RlbFNwZWNpZmljQWRqdXN0bWVudHMgZm9yIGEgU3RvY2hhc3RpYyBtb2RlbCBhZGRzIG5vaXNlIHRvCisJICogdGhlIEkgc3RhdGUuIEl0IHdpbGwgYmUgcHJvcGFnYXRlZCB0byBvdGhlciBzdGF0ZXMgYXV0b21hdGljYWxseQorCSAqIAorCSAqLworCQorCXB1YmxpYyB2b2lkIGRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKAorCQkJZmluYWwgTGFiZWxWYWx1ZSBzdGF0ZSkgeworCQlmaW5hbCBTSUxhYmVsVmFsdWUgY3VycmVudFNJID0gKFNJTGFiZWxWYWx1ZSkgc3RhdGU7CisJCS8vZG91YmxlIG9sZEkgPSBjdXJyZW50U0kuZ2V0SSgpOworCQlkb3VibGUgaW5jaWRlbmNlID0gY3VycmVudFNJLmdldEluY2lkZW5jZSgpOworCQlkb3VibGUgbmV3SW5jaWRlbmNlID0gaW5jaWRlbmNlKmNvbXB1dGVOb2lzZSgpOworCQlkb3VibGUgZGlmZiA9IG5ld0luY2lkZW5jZSAtIGluY2lkZW5jZTsgCisJCQorCQlkb3VibGUgbmV3SSA9IGN1cnJlbnRTSS5nZXRJKCkgKyBkaWZmOworCQlkb3VibGUgbmV3UyA9IGN1cnJlbnRTSS5nZXRTKCkgLSBkaWZmOworCQlpZihuZXdJIDwgMC4wKSB7CisJCQlkb3VibGUgc2NhbGUgPSAoLW5ld0kpIC8gY3VycmVudFNJLmdldEkoKTsKKwkJCWlmKERvdWJsZS5pc0luZmluaXRlKHNjYWxlKSkKKwkJCQlzY2FsZSA9IDAuMDsgLy8gY2FuY2VsIG5vaXNlIGlmIDAKKwkJCWRpZmYgPSBkaWZmICogc2NhbGU7CisJCQluZXdJID0gY3VycmVudFNJLmdldEkoKSArIGRpZmY7IC8vIDAKKwkJCW5ld1MgPSBjdXJyZW50U0kuZ2V0UygpIC0gZGlmZjsKKwkJfQorCQlpZihuZXdTIDwgMC4wKSB7CisJCQlkb3VibGUgc2NhbGUgPSAoLW5ld1MpIC8gY3VycmVudFNJLmdldFMoKTsKKwkJCWlmKERvdWJsZS5pc0luZmluaXRlKHNjYWxlKSkKKwkJCQlzY2FsZSA9IDAuMDsgLy8gY2FuY2VsIG5vaXNlIGlmIDAKKwkJCWRpZmYgPSBkaWZmICogc2NhbGU7CisJCQluZXdJID0gY3VycmVudFNJLmdldEkoKSArIGRpZmY7CisJCQluZXdTID0gY3VycmVudFNJLmdldFMoKSAtIGRpZmY7IC8vIDAKKwkJfQorCQluZXdJbmNpZGVuY2UgPSBpbmNpZGVuY2UgKyBkaWZmOworCQljdXJyZW50U0kuc2V0UyhuZXdTKTsKKwkJY3VycmVudFNJLnNldEkobmV3SSk7CisJCWN1cnJlbnRTSS5zZXRJbmNpZGVuY2UobmV3SW5jaWRlbmNlKTsgCisJCXJldHVybjsKKwl9IC8vIGRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzCisJCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBsb25nIGdldFNlZWQoKSB7CisJCXJldHVybiBzZWVkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWVkKGxvbmcgbmV3U2VlZCkgeworCQlsb25nIG9sZFNlZWQgPSBzZWVkOworCQlzZWVkID0gbmV3U2VlZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19TRUVELCBvbGRTZWVkLCBzZWVkKSk7CisJCXJhbmRvbUdlbmVyYXRvci5zZXRTZWVkKG5ld1NlZWQpOworCX0gLy8gc2V0U2VlZAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJhbmRvbSBnZXRSYW5kb21HZW5lcmF0b3IoKSB7CisJCXJldHVybiByYW5kb21HZW5lcmF0b3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRHYWluKCkgeworCQlyZXR1cm4gZ2FpbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRHYWluKGRvdWJsZSBuZXdHYWluKSB7CisJCWRvdWJsZSBvbGRHYWluID0gZ2FpbjsKKwkJZ2FpbiA9IG5ld0dhaW47CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fR0FJTiwgb2xkR2FpbiwgZ2FpbikpOworCX0KKworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBCeSBkZWZhdWx0IHRoaXMgY2FsbHMgdGhlIHN0YXRpYyBtZXRob2QgU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbC5jb21wdXRlTm9pc2UoZ2FpbiwgcmFuZCkKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBkb3VibGUgY29tcHV0ZU5vaXNlKCkgeworCQlyZXR1cm4gU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbC5jb21wdXRlTm9pc2UoZ2FpbiwgcmFuZG9tR2VuZXJhdG9yKTsKKwl9CisJCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fU0VFRDoKKwkJCQlyZXR1cm4gZ2V0U2VlZCgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1I6CisJCQkJcmV0dXJuIGdldFJhbmRvbUdlbmVyYXRvcigpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0dBSU46CisJCQkJcmV0dXJuIGdldEdhaW4oKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1NFRUQ6CisJCQkJc2V0U2VlZCgoTG9uZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0dBSU46CisJCQkJc2V0R2FpbigoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1NFRUQ6CisJCQkJc2V0U2VlZChTRUVEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fR0FJTjoKKwkJCQlzZXRHYWluKEdBSU5fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1NFRUQ6CisJCQkJcmV0dXJuIHNlZWQgIT0gU0VFRF9FREVGQVVMVDsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19SQU5ET01fR0VORVJBVE9SOgorCQkJCXJldHVybiBSQU5ET01fR0VORVJBVE9SX0VERUZBVUxUID09IG51bGwgPyByYW5kb21HZW5lcmF0b3IgIT0gbnVsbCA6ICFSQU5ET01fR0VORVJBVE9SX0VERUZBVUxULmVxdWFscyhyYW5kb21HZW5lcmF0b3IpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX0dBSU46CisJCQkJcmV0dXJuIGdhaW4gIT0gR0FJTl9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgeworCQlpZiAoYmFzZUNsYXNzID09IFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwuY2xhc3MpIHsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgeworCQkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19TRUVEOiByZXR1cm4gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fU0VFRDsKKwkJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUjogcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1I7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKKwkJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fR0FJTjogcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0dBSU47CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0RldGVybWluaXN0aWMoKSB7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7CisJCWlmIChiYXNlQ2xhc3MgPT0gU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbC5jbGFzcykgeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7CisJCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19TRUVEOiByZXR1cm4gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19TRUVEOworCQkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUjogcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwuY2xhc3MpIHsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgeworCQkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1NUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fR0FJTjogcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fR0FJTjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChzZWVkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHNlZWQpOworCQlyZXN1bHQuYXBwZW5kKCIsIHJhbmRvbUdlbmVyYXRvcjogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChyYW5kb21HZW5lcmF0b3IpOworCQlyZXN1bHQuYXBwZW5kKCIsIGdhaW46ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZ2Fpbik7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvLyBTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4NTk4OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsNDEwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbFZhbHVlOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0lEaXNlYXNlTW9kZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0b2NoYXN0aWMgU0kgRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsSW1wbCNnZXRTZWVkIDxlbT5TZWVkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxJbXBsI2dldFJhbmRvbUdlbmVyYXRvciA8ZW0+UmFuZG9tIEdlbmVyYXRvcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsSW1wbCNnZXRHYWluIDxlbT5HYWluPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsSW1wbCBleHRlbmRzIFNJSW1wbCBpbXBsZW1lbnRzCisJCVN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbCB7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VlZCgpIDxlbT5TZWVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTZWVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgU0VFRF9FREVGQVVMVCA9IDBMOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlZWQoKSA8ZW0+U2VlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2VlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGxvbmcgc2VlZCA9IFNFRURfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmRvbUdlbmVyYXRvcigpIDxlbT5SYW5kb20gR2VuZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSYW5kb21HZW5lcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUmFuZG9tIFJBTkRPTV9HRU5FUkFUT1JfRURFRkFVTFQgPSAoUmFuZG9tKVN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFLmdldFJhbmRvbSgpLCAiMCIpOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmRvbUdlbmVyYXRvcigpIDxlbT5SYW5kb20gR2VuZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSYW5kb21HZW5lcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBSYW5kb20gcmFuZG9tR2VuZXJhdG9yID0gUkFORE9NX0dFTkVSQVRPUl9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R2FpbigpIDxlbT5HYWluPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRHYWluKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBHQUlOX0VERUZBVUxUID0gMC4wMTsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHYWluKCkgPGVtPkdhaW48L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEdhaW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgZ2FpbiA9IEdBSU5fRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIFRoZSBjb25zdHJ1Y3RvciBuZWVkcyB0byBiZSBwdWJsaWMgc28gdGhhdCB0aGUgbmV3IGRpc2Vhc2Ugd2l6YXJkIGNhbgorCSAqIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgd2l0aG91dCB1c2luZyB0aGUgZmFjdG9yeS4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0gLy8gU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsSW1wbAorCisJLyoqCisJICogQHBhcmFtIGRpc2Vhc2VNb2RlbE5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBkaXNlYXNlIG1vZGVsCisJICogQHBhcmFtIGJhY2tncm91bmRNb3J0YWxpdHlSYXRlCisJICogQHBhcmFtIGluZmVjdGlvdXNNb3J0YWxpdHkKKwkgKiBAcGFyYW0gaW5mZWN0aW91c01vcnRhbGl0eVJhdGUKKwkgKiAgICAgICAgICAgIHRoZSByYXRlIGF0IHdoaWNoIGZhdGFsbHkgaW5mZWN0aW91cyBwb3B1bGF0aW9uIG1lbWJlcnMgZGllCisJICogQHBhcmFtIHRyYW5zbWlzc2lvblJhdGUKKwkgKiBAcGFyYW0gcmVjb3ZlcnlSYXRlIHJhdGUgYXQgd2hpY2ggZ29lcyBiYWNrIHRvIHN1c2NlcHRpYmxlCisJICogQHBhcmFtIG5vbkxpbmVhcml0eUNvZWZmaWNpZW50CisJICogQHBhcmFtIHRpbWVQZXJpb2QKKwkgKiAgICAgICAgICAgIHRoZSB0aW1lIHBlcmlvZCBmb3IgdGhlIHJhdGVzIChtaWxsaXNlY29uZHMpCisJICogQHBhcmFtIHBvcHVsYXRpb25JZGVudGlmaWVyCisJICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBvZiB0aGUgcG9wdWxhdGlvbiBhZmZlY3RlZCBieSB0aGUgZGlzZWFzZQorCSAqIEBwYXJhbSBnYWluIAorCSAqIEByZXR1cm4gYW4gaW5pdGlhbGl6ZWQgaW5zdGFuY2Ugb2YgRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwgY3JlYXRlU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsKAorCQkJZmluYWwgU3RyaW5nIGRpc2Vhc2VNb2RlbE5hbWUsCisJCQlmaW5hbCBkb3VibGUgYmFja2dyb3VuZE1vcnRhbGl0eVJhdGUsCisJCQlmaW5hbCBkb3VibGUgaW5mZWN0aW91c01vcnRhbGl0eVJhdGUsCisJCQlmaW5hbCBkb3VibGUgdHJhbnNtaXNzaW9uUmF0ZSwgCisJCQlmaW5hbCBkb3VibGUgcmVjb3ZlcnlSYXRlLAorCQkJZmluYWwgZG91YmxlIG5vbkxpbmVhcml0eUNvZWZmaWNpZW50LCBmaW5hbCBsb25nIHRpbWVQZXJpb2QsCisJCQlmaW5hbCBTdHJpbmcgcG9wdWxhdGlvbklkZW50aWZpZXIsIGRvdWJsZSBnYWluKSB7CisJCQorCQlmaW5hbCBTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwgc2lyRGlzZWFzZU1vZGVsID0gU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwoKTsKKwkJCisJCWluaXRpYWxpemVTSURpc2Vhc2VNb2RlbChzaXJEaXNlYXNlTW9kZWwsIGRpc2Vhc2VNb2RlbE5hbWUsCisJCQkJYmFja2dyb3VuZE1vcnRhbGl0eVJhdGUsCisJCQkJaW5mZWN0aW91c01vcnRhbGl0eVJhdGUsIHRyYW5zbWlzc2lvblJhdGUsIHJlY292ZXJ5UmF0ZSwKKwkJCQlub25MaW5lYXJpdHlDb2VmZmljaWVudCwgdGltZVBlcmlvZCwKKwkJCQlwb3B1bGF0aW9uSWRlbnRpZmllcik7CisJCQorCQlzaXJEaXNlYXNlTW9kZWwuc2V0R2FpbihnYWluKTsKKwkJCisJCXJldHVybiBzaXJEaXNlYXNlTW9kZWw7CisJfSAvLyBjcmVhdGVTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwKKworCS8qKgorCSAqIE1vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyBmb3IgYSBTdG9jaGFzdGljIG1vZGVsIGFkZHMgbm9pc2UgdG8KKwkgKiB0aGUgSSBzdGF0ZS4gSXQgd2lsbCBiZSBwcm9wYWdhdGVkIHRvIG90aGVyIHN0YXRlcyBhdXRvbWF0aWNhbGx5CisJICogCisJICovCisJCisJcHVibGljIHZvaWQgZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoCisJCQlmaW5hbCBMYWJlbFZhbHVlIHN0YXRlKSB7CisJCWZpbmFsIFNJTGFiZWxWYWx1ZSBjdXJyZW50U0kgPSAoU0lMYWJlbFZhbHVlKSBzdGF0ZTsKKwkJLy9kb3VibGUgb2xkSSA9IGN1cnJlbnRTSS5nZXRJKCk7CisJCWRvdWJsZSBpbmNpZGVuY2UgPSBjdXJyZW50U0kuZ2V0SW5jaWRlbmNlKCk7CisJCWRvdWJsZSBuZXdJbmNpZGVuY2UgPSBpbmNpZGVuY2UqY29tcHV0ZU5vaXNlKCk7CisJCWRvdWJsZSBkaWZmID0gbmV3SW5jaWRlbmNlIC0gaW5jaWRlbmNlOyAKKwkJCisJCWRvdWJsZSBuZXdJID0gY3VycmVudFNJLmdldEkoKSArIGRpZmY7CisJCWRvdWJsZSBuZXdTID0gY3VycmVudFNJLmdldFMoKSAtIGRpZmY7CisJCWlmKG5ld0kgPCAwLjApIHsKKwkJCWRvdWJsZSBzY2FsZSA9ICgtbmV3SSkgLyBjdXJyZW50U0kuZ2V0SSgpOworCQkJaWYoRG91YmxlLmlzSW5maW5pdGUoc2NhbGUpKQorCQkJCXNjYWxlID0gMC4wOyAvLyBjYW5jZWwgbm9pc2UgaWYgMAorCQkJZGlmZiA9IGRpZmYgKiBzY2FsZTsKKwkJCW5ld0kgPSBjdXJyZW50U0kuZ2V0SSgpICsgZGlmZjsgLy8gMAorCQkJbmV3UyA9IGN1cnJlbnRTSS5nZXRTKCkgLSBkaWZmOworCQl9CisJCWlmKG5ld1MgPCAwLjApIHsKKwkJCWRvdWJsZSBzY2FsZSA9ICgtbmV3UykgLyBjdXJyZW50U0kuZ2V0UygpOworCQkJaWYoRG91YmxlLmlzSW5maW5pdGUoc2NhbGUpKQorCQkJCXNjYWxlID0gMC4wOyAvLyBjYW5jZWwgbm9pc2UgaWYgMAorCQkJZGlmZiA9IGRpZmYgKiBzY2FsZTsKKwkJCW5ld0kgPSBjdXJyZW50U0kuZ2V0SSgpICsgZGlmZjsKKwkJCW5ld1MgPSBjdXJyZW50U0kuZ2V0UygpIC0gZGlmZjsgLy8gMAorCQl9CisJCW5ld0luY2lkZW5jZSA9IGluY2lkZW5jZSArIGRpZmY7CisJCWN1cnJlbnRTSS5zZXRTKG5ld1MpOworCQljdXJyZW50U0kuc2V0SShuZXdJKTsKKwkJY3VycmVudFNJLnNldEluY2lkZW5jZShuZXdJbmNpZGVuY2UpOyAKKwkJcmV0dXJuOworCX0gLy8gZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0RldGVybWluaXN0aWMoKSB7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBsb25nIGdldFNlZWQoKSB7CisJCXJldHVybiBzZWVkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWVkKGxvbmcgbmV3U2VlZCkgeworCQlsb25nIG9sZFNlZWQgPSBzZWVkOworCQlzZWVkID0gbmV3U2VlZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fU0VFRCwgb2xkU2VlZCwgc2VlZCkpOworCQlyYW5kb21HZW5lcmF0b3Iuc2V0U2VlZChuZXdTZWVkKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUmFuZG9tIGdldFJhbmRvbUdlbmVyYXRvcigpIHsKKwkJcmV0dXJuIHJhbmRvbUdlbmVyYXRvcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldEdhaW4oKSB7CisJCXJldHVybiBnYWluOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEdhaW4oZG91YmxlIG5ld0dhaW4pIHsKKwkJZG91YmxlIG9sZEdhaW4gPSBnYWluOworCQlnYWluID0gbmV3R2FpbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fR0FJTiwgb2xkR2FpbiwgZ2FpbikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogQnkgZGVmYXVsdCB0aGlzIGNhbGxzIHRoZSBzdGF0aWMgbWV0aG9kIFN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGwuY29tcHV0ZU5vaXNlKGdhaW4sIHJhbmQpCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGNvbXB1dGVOb2lzZSgpIHsKKwkJcmV0dXJuIFN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGwuY29tcHV0ZU5vaXNlKGdhaW4sIHJhbmRvbUdlbmVyYXRvcik7CisJfQorCQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19TRUVEOgorCQkJCXJldHVybiBnZXRTZWVkKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1I6CisJCQkJcmV0dXJuIGdldFJhbmRvbUdlbmVyYXRvcigpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19HQUlOOgorCQkJCXJldHVybiBnZXRHYWluKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fU0VFRDoKKwkJCQlzZXRTZWVkKChMb25nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJX0RJU0VBU0VfTU9ERUxfX0dBSU46CisJCQkJc2V0R2FpbigoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19TRUVEOgorCQkJCXNldFNlZWQoU0VFRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19HQUlOOgorCQkJCXNldEdhaW4oR0FJTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJX0RJU0VBU0VfTU9ERUxfX1NFRUQ6CisJCQkJcmV0dXJuIHNlZWQgIT0gU0VFRF9FREVGQVVMVDsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUjoKKwkJCQlyZXR1cm4gUkFORE9NX0dFTkVSQVRPUl9FREVGQVVMVCA9PSBudWxsID8gcmFuZG9tR2VuZXJhdG9yICE9IG51bGwgOiAhUkFORE9NX0dFTkVSQVRPUl9FREVGQVVMVC5lcXVhbHMocmFuZG9tR2VuZXJhdG9yKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lfRElTRUFTRV9NT0RFTF9fR0FJTjoKKwkJCQlyZXR1cm4gZ2FpbiAhPSBHQUlOX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7CisJCWlmIChiYXNlQ2xhc3MgPT0gU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbC5jbGFzcykgeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7CisJCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19TRUVEOiByZXR1cm4gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fU0VFRDsKKwkJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1I6IHJldHVybiBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19SQU5ET01fR0VORVJBVE9SOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbC5jbGFzcykgeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7CisJCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19HQUlOOiByZXR1cm4gU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1NUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fR0FJTjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBTdG9jaGFzdGljRGlzZWFzZU1vZGVsLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKKwkJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1NFRUQ6IHJldHVybiBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19TRUVEOworCQkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUjogcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1I7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKKwkJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0dBSU46IHJldHVybiBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19HQUlOOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHNlZWQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoc2VlZCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgcmFuZG9tR2VuZXJhdG9yOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHJhbmRvbUdlbmVyYXRvcik7CisJCXJlc3VsdC5hcHBlbmQoIiwgZ2FpbjogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChnYWluKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vIFN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjI5ZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvaW1wbC9TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsNDEyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWxWYWx1ZTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RvY2hhc3RpYyBTSVIgRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwjZ2V0U2VlZCA8ZW0+U2VlZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwjZ2V0UmFuZG9tR2VuZXJhdG9yIDxlbT5SYW5kb20gR2VuZXJhdG9yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSW1wbCNnZXRHYWluIDxlbT5HYWluPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwgZXh0ZW5kcyBTSVJJbXBsIGltcGxlbWVudHMKKwkJU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCB7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VlZCgpIDxlbT5TZWVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTZWVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgU0VFRF9FREVGQVVMVCA9IDBMOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlZWQoKSA8ZW0+U2VlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2VlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGxvbmcgc2VlZCA9IFNFRURfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmRvbUdlbmVyYXRvcigpIDxlbT5SYW5kb20gR2VuZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSYW5kb21HZW5lcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUmFuZG9tIFJBTkRPTV9HRU5FUkFUT1JfRURFRkFVTFQgPSAoUmFuZG9tKVN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFLmdldFJhbmRvbSgpLCAiMCIpOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmRvbUdlbmVyYXRvcigpIDxlbT5SYW5kb20gR2VuZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSYW5kb21HZW5lcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBSYW5kb20gcmFuZG9tR2VuZXJhdG9yID0gUkFORE9NX0dFTkVSQVRPUl9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R2FpbigpIDxlbT5HYWluPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRHYWluKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBHQUlOX0VERUZBVUxUID0gMC4wMTsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHYWluKCkgPGVtPkdhaW48L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEdhaW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgZ2FpbiA9IEdBSU5fRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIFRoZSBjb25zdHJ1Y3RvciBuZWVkcyB0byBiZSBwdWJsaWMgc28gdGhhdCB0aGUgbmV3IGRpc2Vhc2Ugd2l6YXJkIGNhbgorCSAqIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgd2l0aG91dCB1c2luZyB0aGUgZmFjdG9yeS4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9IC8vIFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxJbXBsCisKKwkvKioKKwkgKiBAcGFyYW0gZGlzZWFzZU1vZGVsTmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGRpc2Vhc2UgbW9kZWwKKwkgKiBAcGFyYW0gYmFja2dyb3VuZE1vcnRhbGl0eVJhdGUKKwkgKiBAcGFyYW0gaW5mZWN0aW91c01vcnRhbGl0eQorCSAqIEBwYXJhbSBpbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZQorCSAqICAgICAgICAgICAgdGhlIHJhdGUgYXQgd2hpY2ggZmF0YWxseSBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gbWVtYmVycyBkaWUKKwkgKiBAcGFyYW0gdHJhbnNtaXNzaW9uUmF0ZQorCSAqIEBwYXJhbSByZWNvdmVyeVJhdGUKKwkgKiBAcGFyYW0gaW1tdW5pdHlMb3NzUmF0ZQorCSAqIEBwYXJhbSBub25MaW5lYXJpdHlDb2VmZmljaWVudAorCSAqIEBwYXJhbSB0aW1lUGVyaW9kCisJICogICAgICAgICAgICB0aGUgdGltZSBwZXJpb2QgZm9yIHRoZSByYXRlcyAobWlsbGlzZWNvbmRzKQorCSAqIEBwYXJhbSBwb3B1bGF0aW9uSWRlbnRpZmllcgorCSAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHBvcHVsYXRpb24gYWZmZWN0ZWQgYnkgdGhlIGRpc2Vhc2UKKwkgKiBAcGFyYW0gZ2FpbiAKKwkgKiBAcmV0dXJuIGFuIGluaXRpYWxpemVkIGluc3RhbmNlIG9mIERldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwgY3JlYXRlU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCgKKwkJCWZpbmFsIFN0cmluZyBkaXNlYXNlTW9kZWxOYW1lLAorCQkJZmluYWwgZG91YmxlIGJhY2tncm91bmRNb3J0YWxpdHlSYXRlLAorCQkJZmluYWwgZG91YmxlIGluZmVjdGlvdXNNb3J0YWxpdHlSYXRlLAorCQkJZmluYWwgZG91YmxlIHRyYW5zbWlzc2lvblJhdGUsIGZpbmFsIGRvdWJsZSByZWNvdmVyeVJhdGUsCisJCQlmaW5hbCBkb3VibGUgaW1tdW5pdHlMb3NzUmF0ZSwKKwkJCWZpbmFsIGRvdWJsZSBub25MaW5lYXJpdHlDb2VmZmljaWVudCwgZmluYWwgbG9uZyB0aW1lUGVyaW9kLAorCQkJZmluYWwgU3RyaW5nIHBvcHVsYXRpb25JZGVudGlmaWVyLCBkb3VibGUgZ2FpbikgeworCQkKKwkJZmluYWwgU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCBzaXJEaXNlYXNlTW9kZWwgPSBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZVN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwoKTsKKwkJCisJCWluaXRpYWxpemVTSVJEaXNlYXNlTW9kZWwoc2lyRGlzZWFzZU1vZGVsLCBkaXNlYXNlTW9kZWxOYW1lLAorCQkJCWJhY2tncm91bmRNb3J0YWxpdHlSYXRlLAorCQkJCWluZmVjdGlvdXNNb3J0YWxpdHlSYXRlLCB0cmFuc21pc3Npb25SYXRlLCByZWNvdmVyeVJhdGUsCisJCQkJaW1tdW5pdHlMb3NzUmF0ZSwgbm9uTGluZWFyaXR5Q29lZmZpY2llbnQsIHRpbWVQZXJpb2QsCisJCQkJcG9wdWxhdGlvbklkZW50aWZpZXIpOworCQkKKwkJc2lyRGlzZWFzZU1vZGVsLnNldEdhaW4oZ2Fpbik7CisJCQorCQlyZXR1cm4gc2lyRGlzZWFzZU1vZGVsOworCX0gLy8gY3JlYXRlU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbAorCQorCS8qKgorCSAqIE1vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyBmb3IgYSBTdG9jaGFzdGljIG1vZGVsIGFkZHMgbm9pc2UgdG8KKwkgKiB0aGUgSSBzdGF0ZS4gSXQgd2lsbCBiZSBwcm9wYWdhdGVkIHRvIG90aGVyIHN0YXRlcyBhdXRvbWF0aWNhbGx5CisJICogCisJICovCisJCisJcHVibGljIHZvaWQgZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoCisJCQlmaW5hbCBMYWJlbFZhbHVlIHN0YXRlKSB7CisJCQlmaW5hbCBTSUxhYmVsVmFsdWUgY3VycmVudFNJID0gKFNJTGFiZWxWYWx1ZSkgc3RhdGU7CisJCQkvL2RvdWJsZSBvbGRJID0gY3VycmVudFNJLmdldEkoKTsKKwkJCWRvdWJsZSBpbmNpZGVuY2UgPSBjdXJyZW50U0kuZ2V0SW5jaWRlbmNlKCk7CisJCQlkb3VibGUgbmV3SW5jaWRlbmNlID0gaW5jaWRlbmNlKmNvbXB1dGVOb2lzZSgpOworCQkJZG91YmxlIGRpZmYgPSBuZXdJbmNpZGVuY2UgLSBpbmNpZGVuY2U7IAorCQkJCisJCQlkb3VibGUgbmV3SSA9IGN1cnJlbnRTSS5nZXRJKCkgKyBkaWZmOworCQkJZG91YmxlIG5ld1MgPSBjdXJyZW50U0kuZ2V0UygpIC0gZGlmZjsKKwkJCWlmKG5ld0kgPCAwLjApIHsKKwkJCQlkb3VibGUgc2NhbGUgPSAoLW5ld0kpIC8gY3VycmVudFNJLmdldEkoKTsKKwkJCQlpZihEb3VibGUuaXNJbmZpbml0ZShzY2FsZSkpCisJCQkJCXNjYWxlID0gMC4wOyAvLyBjYW5jZWwgbm9pc2UgaWYgMAorCQkJCWRpZmYgPSBkaWZmICogc2NhbGU7CisJCQkJbmV3SSA9IGN1cnJlbnRTSS5nZXRJKCkgKyBkaWZmOyAvLyAwCisJCQkJbmV3UyA9IGN1cnJlbnRTSS5nZXRTKCkgLSBkaWZmOworCQkJfQorCQkJaWYobmV3UyA8IDAuMCkgeworCQkJCWRvdWJsZSBzY2FsZSA9ICgtbmV3UykgLyBjdXJyZW50U0kuZ2V0UygpOworCQkJCWlmKERvdWJsZS5pc0luZmluaXRlKHNjYWxlKSkKKwkJCQkJc2NhbGUgPSAwLjA7IC8vIGNhbmNlbCBub2lzZSBpZiAwCisJCQkJZGlmZiA9IGRpZmYgKiBzY2FsZTsKKwkJCQluZXdJID0gY3VycmVudFNJLmdldEkoKSArIGRpZmY7CisJCQkJbmV3UyA9IGN1cnJlbnRTSS5nZXRTKCkgLSBkaWZmOyAvLyAwCisJCQl9CisJCQluZXdJbmNpZGVuY2UgPSBpbmNpZGVuY2UgKyBkaWZmOworCQkJY3VycmVudFNJLnNldFMobmV3Uyk7CisJCQljdXJyZW50U0kuc2V0SShuZXdJKTsKKwkJCWN1cnJlbnRTSS5zZXRJbmNpZGVuY2UobmV3SW5jaWRlbmNlKTsgCisJCQlyZXR1cm47CisJCQkKKwl9IC8vIGRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzCisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNEZXRlcm1pbmlzdGljKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGxvbmcgZ2V0U2VlZCgpIHsKKwkJcmV0dXJuIHNlZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlZWQobG9uZyBuZXdTZWVkKSB7CisJCWxvbmcgb2xkU2VlZCA9IHNlZWQ7CisJCXNlZWQgPSBuZXdTZWVkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fU0VFRCwgb2xkU2VlZCwgc2VlZCkpOworCQlyYW5kb21HZW5lcmF0b3Iuc2V0U2VlZChuZXdTZWVkKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUmFuZG9tIGdldFJhbmRvbUdlbmVyYXRvcigpIHsKKwkJcmV0dXJuIHJhbmRvbUdlbmVyYXRvcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldEdhaW4oKSB7CisJCXJldHVybiBnYWluOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEdhaW4oZG91YmxlIG5ld0dhaW4pIHsKKwkJZG91YmxlIG9sZEdhaW4gPSBnYWluOworCQlnYWluID0gbmV3R2FpbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0dBSU4sIG9sZEdhaW4sIGdhaW4pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIEJ5IGRlZmF1bHQgdGhpcyBjYWxscyB0aGUgc3RhdGljIG1ldGhvZCBTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJbXBsLmNvbXB1dGVOb2lzZShnYWluLCByYW5kKQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIGRvdWJsZSBjb21wdXRlTm9pc2UoKSB7CisJCXJldHVybiBTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJbXBsLmNvbXB1dGVOb2lzZShnYWluLCByYW5kb21HZW5lcmF0b3IpOworCX0KKwkKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1NFRUQ6CisJCQkJcmV0dXJuIGdldFNlZWQoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1I6CisJCQkJcmV0dXJuIGdldFJhbmRvbUdlbmVyYXRvcigpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fR0FJTjoKKwkJCQlyZXR1cm4gZ2V0R2FpbigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19TRUVEOgorCQkJCXNldFNlZWQoKExvbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0dBSU46CisJCQkJc2V0R2FpbigoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fU0VFRDoKKwkJCQlzZXRTZWVkKFNFRURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0dBSU46CisJCQkJc2V0R2FpbihHQUlOX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1NFRUQ6CisJCQkJcmV0dXJuIHNlZWQgIT0gU0VFRF9FREVGQVVMVDsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1I6CisJCQkJcmV0dXJuIFJBTkRPTV9HRU5FUkFUT1JfRURFRkFVTFQgPT0gbnVsbCA/IHJhbmRvbUdlbmVyYXRvciAhPSBudWxsIDogIVJBTkRPTV9HRU5FUkFUT1JfRURFRkFVTFQuZXF1YWxzKHJhbmRvbUdlbmVyYXRvcik7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19HQUlOOgorCQkJCXJldHVybiBnYWluICE9IEdBSU5fRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBTdG9jaGFzdGljRGlzZWFzZU1vZGVsLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKKwkJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19TRUVEOiByZXR1cm4gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fU0VFRDsKKwkJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19SQU5ET01fR0VORVJBVE9SOiByZXR1cm4gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwuY2xhc3MpIHsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgeworCQkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0dBSU46IHJldHVybiBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19HQUlOOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgeworCQlpZiAoYmFzZUNsYXNzID09IFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwuY2xhc3MpIHsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgeworCQkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fU0VFRDogcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19TRUVEOworCQkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUjogcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19SQU5ET01fR0VORVJBVE9SOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbC5jbGFzcykgeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7CisJCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19HQUlOOiByZXR1cm4gU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX0dBSU47CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoc2VlZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChzZWVkKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCByYW5kb21HZW5lcmF0b3I6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQocmFuZG9tR2VuZXJhdG9yKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBnYWluOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGdhaW4pOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy8gU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL0FnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGVJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL0FnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGVJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODE3MDI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGV9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGVJdGVtUHJvdmlkZXIKKwlleHRlbmRzIERpc2Vhc2VNb2RlbFN0YXRlSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cwkKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkQ2hpbGRyZW5zTGFiZWxzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDaGlsZHJlbnMgTGFiZWxzIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRyZW5zTGFiZWxzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZV9jaGlsZHJlbnNMYWJlbHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZV9jaGlsZHJlbnNMYWJlbHNfZmVhdHVyZSIsICJfVUlfQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5BR0dSRUdBVElOR19ESVNFQVNFX01PREVMX1NUQVRFX19DSElMRFJFTlNfTEFCRUxTLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgdHJ1ZSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIGdldFN0cmluZygiX1VJX0FnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGVfdHlwZSIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9BZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL0FnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmOWQ1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9BZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWw7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIKKwlleHRlbmRzIEFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cwkKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwpb2JqZWN0KS5nZXREaXNlYXNlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0FnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9BZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNTJlOTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9BZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBTSUl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsKW9iamVjdCkuZ2V0VVJJKCkubGFzdFNlZ21lbnQoKS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0FnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsKW9iamVjdCkuZ2V0RGlzZWFzZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9BZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX0FnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL0FnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9BZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYjAzYjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9BZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbClvYmplY3QpLmdldERpc2Vhc2VOYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL0RldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZhNDJkNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL0RldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIERldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyIGV4dGVuZHMgU0VJUkl0ZW1Qcm92aWRlcgorCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyKAorCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbClvYmplY3QpLmdldFVSSSgpLmxhc3RTZWdtZW50KCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbClvYmplY3QpLmdldERpc2Vhc2VOYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30gLy8gRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL0RldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE5NjFmMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL0RldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWw7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIERldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciBleHRlbmRzIFNJSXRlbVByb3ZpZGVyCisJCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChEZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWwpb2JqZWN0KS5nZXRVUkkoKS5sYXN0U2VnbWVudCgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0RldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCQorCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsKW9iamVjdCkuZ2V0RGlzZWFzZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9EZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5vdGlmaWNhdGlvbgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9EZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9EZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2YWRkNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL0RldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIERldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgZXh0ZW5kcyBTSVJJdGVtUHJvdmlkZXIKKwkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5CisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyKAorCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKERldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwpb2JqZWN0KS5nZXRVUkkoKS5sYXN0U2VnbWVudCgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0RldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCQorCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbClvYmplY3QpLmdldERpc2Vhc2VOYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9EZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisJCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBub3RpZmljYXRpb24KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9EaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDhkYmViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzMzIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTm9kZURlY29yYXRvckl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsfSBvYmplY3QuIDwhLS0KKyAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyIGV4dGVuZHMgTm9kZURlY29yYXRvckl0ZW1Qcm92aWRlcgorCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCS8vIE1vZGlmaWVkIHRvIHJlb3JkZXIgaG93IHRoZSBwcm9wZXJ0aWVzIGFwcGVhci4gIFRoaXMKKwkJCS8vIGhlbHBzIGluIHRoZSBuZXcgZGlzZWFzZSB3aXphcmQuCisJCQlhZGREaXNlYXNlTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkUG9wdWxhdGlvbklkZW50aWZpZXJQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFRpbWVQZXJpb2RQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCQorCQkJYWRkRnJlcXVlbmN5RGVwZW5kZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQkKKwkJCQorCQkJLy8gT2xkIG9yZGVyCisJCQkvLwkJCWFkZEJhY2tncm91bmRNb3J0YWxpdHlSYXRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQkvLwkJCWFkZFBvcHVsYXRpb25JZGVudGlmaWVyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQkvLwkJCWFkZFRpbWVQZXJpb2RQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCS8vCQkJYWRkRGlzZWFzZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnNHZW4oT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRCYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkUG9wdWxhdGlvbklkZW50aWZpZXJQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFRpbWVQZXJpb2RQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZERpc2Vhc2VOYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRGcmVxdWVuY3lEZXBlbmRlbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZEJhY2tncm91bmRCaXJ0aFJhdGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCQorCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCYWNrZ3JvdW5kIE1vcnRhbGl0eSBSYXRlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQmFja2dyb3VuZE1vcnRhbGl0eVJhdGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9EaXNlYXNlTW9kZWxfYmFja2dyb3VuZE1vcnRhbGl0eVJhdGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlzZWFzZU1vZGVsX2JhY2tncm91bmRNb3J0YWxpdHlSYXRlX2ZlYXR1cmUiLCAiX1VJX0Rpc2Vhc2VNb2RlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX01PUlRBTElUWV9SQVRFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUaW1lIFBlcmlvZCBmZWF0dXJlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUaW1lUGVyaW9kUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRGlzZWFzZU1vZGVsX3RpbWVQZXJpb2RfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlzZWFzZU1vZGVsX3RpbWVQZXJpb2RfZmVhdHVyZSIsICJfVUlfRGlzZWFzZU1vZGVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLkRJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9ELAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuSU5URUdSQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUG9wdWxhdGlvbiBJZGVudGlmaWVyIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFBvcHVsYXRpb25JZGVudGlmaWVyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRGlzZWFzZU1vZGVsX3BvcHVsYXRpb25JZGVudGlmaWVyX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rpc2Vhc2VNb2RlbF9wb3B1bGF0aW9uSWRlbnRpZmllcl9mZWF0dXJlIiwgIl9VSV9EaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuRElTRUFTRV9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEaXNlYXNlIE5hbWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGREaXNlYXNlTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0Rpc2Vhc2VNb2RlbF9kaXNlYXNlTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaXNlYXNlTW9kZWxfZGlzZWFzZU5hbWVfZmVhdHVyZSIsICJfVUlfRGlzZWFzZU1vZGVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLkRJU0VBU0VfTU9ERUxfX0RJU0VBU0VfTkFNRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRnJlcXVlbmN5IERlcGVuZGVudCBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEZyZXF1ZW5jeURlcGVuZGVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0Rpc2Vhc2VNb2RlbF9mcmVxdWVuY3lEZXBlbmRlbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlzZWFzZU1vZGVsX2ZyZXF1ZW5jeURlcGVuZGVudF9mZWF0dXJlIiwgIl9VSV9EaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuRElTRUFTRV9NT0RFTF9fRlJFUVVFTkNZX0RFUEVOREVOVCwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQmFja2dyb3VuZCBCaXJ0aCBSYXRlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQmFja2dyb3VuZEJpcnRoUmF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0Rpc2Vhc2VNb2RlbF9iYWNrZ3JvdW5kQmlydGhSYXRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rpc2Vhc2VNb2RlbF9iYWNrZ3JvdW5kQmlydGhSYXRlX2ZlYXR1cmUiLCAiX1VJX0Rpc2Vhc2VNb2RlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5ESVNFQVNFX01PREVMX19CQUNLR1JPVU5EX0JJUlRIX1JBVEUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIGRpc2Vhc2UuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbTE2L2Rpc2Vhc2UiKSk7CisJfQorCQorCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoRGlzZWFzZU1vZGVsKW9iamVjdCkuZ2V0RGlzZWFzZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9EaXNlYXNlTW9kZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfRGlzZWFzZU1vZGVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5vdGlmaWNhdGlvbgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlzZWFzZU1vZGVsLmNsYXNzKSkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURToKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUjoKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EOgorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FOgorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fUkVMQVRJVkVfVE9MRVJBTkNFOgorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fRklOSVRFX0RJRkZFUkVOQ0U6CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19GUkVRVUVOQ1lfREVQRU5ERU5UOgorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9CSVJUSF9SQVRFOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gRGlzZWFzZW1vZGVsc0VkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9EaXNlYXNlTW9kZWxMYWJlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvRGlzZWFzZU1vZGVsTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWI5M2ZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvRGlzZWFzZU1vZGVsTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIzNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlci5EeW5hbWljTm9kZUxhYmVsSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIERpc2Vhc2VNb2RlbExhYmVsSXRlbVByb3ZpZGVyIGV4dGVuZHMgRHluYW1pY05vZGVMYWJlbEl0ZW1Qcm92aWRlcgorCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERpc2Vhc2VNb2RlbExhYmVsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkUG9wdWxhdGlvbkxhYmVsUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRQb3B1bGF0aW9uTW9kZWxMYWJlbFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUG9wdWxhdGlvbiBMYWJlbCBmZWF0dXJlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRQb3B1bGF0aW9uTGFiZWxQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9EaXNlYXNlTW9kZWxMYWJlbF9wb3B1bGF0aW9uTGFiZWxfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlzZWFzZU1vZGVsTGFiZWxfcG9wdWxhdGlvbkxhYmVsX2ZlYXR1cmUiLCAiX1VJX0Rpc2Vhc2VNb2RlbExhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLkRJU0VBU0VfTU9ERUxfTEFCRUxfX1BPUFVMQVRJT05fTEFCRUwsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSB0cnVlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBvcHVsYXRpb24gTW9kZWwgTGFiZWwgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRQb3B1bGF0aW9uTW9kZWxMYWJlbFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0Rpc2Vhc2VNb2RlbExhYmVsX3BvcHVsYXRpb25Nb2RlbExhYmVsX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rpc2Vhc2VNb2RlbExhYmVsX3BvcHVsYXRpb25Nb2RlbExhYmVsX2ZlYXR1cmUiLCAiX1VJX0Rpc2Vhc2VNb2RlbExhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLkRJU0VBU0VfTU9ERUxfTEFCRUxfX1BPUFVMQVRJT05fTU9ERUxfTEFCRUwsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSB0cnVlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7CisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuRElTRUFTRV9NT0RFTF9MQUJFTF9fRElTRUFTRV9NT0RFTF9TVEFURSk7CisJCX0KKwkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7CisJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKKwkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgorCisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKERpc2Vhc2VNb2RlbExhYmVsKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfRGlzZWFzZU1vZGVsTGFiZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfRGlzZWFzZU1vZGVsTGFiZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaXNlYXNlTW9kZWxMYWJlbC5jbGFzcykpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfTEFCRUxfX0RJU0VBU0VfTU9ERUxfU1RBVEU6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKworCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCisJCQkJKFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5ESVNFQVNFX01PREVMX0xBQkVMX19ESVNFQVNFX01PREVMX1NUQVRFLAorCQkJCSBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNJRGlzZWFzZU1vZGVsU3RhdGUoKSkpOworCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKKwkJCQkoU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLkRJU0VBU0VfTU9ERUxfTEFCRUxfX0RJU0VBU0VfTU9ERUxfU1RBVEUsCisJCQkJIFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZSgpKSk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gRGlzZWFzZW1vZGVsc0VkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyMjI0MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL0Rpc2Vhc2VNb2RlbExhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIxMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLkxhYmVsVmFsdWVJdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWV9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciBleHRlbmRzIExhYmVsVmFsdWVJdGVtUHJvdmlkZXIKKwkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5CisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkRGlzZWFzZURlYXRoc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkUG9wdWxhdGlvbkNvdW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRJbmNpZGVuY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBvcHVsYXRpb24gQ291bnQgZmVhdHVyZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkUG9wdWxhdGlvbkNvdW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZV9wb3B1bGF0aW9uQ291bnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZV9wb3B1bGF0aW9uQ291bnRfZmVhdHVyZSIsICJfVUlfRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19QT1BVTEFUSU9OX0NPVU5ULAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSW5jaWRlbmNlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkSW5jaWRlbmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZV9pbmNpZGVuY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZV9pbmNpZGVuY2VfZmVhdHVyZSIsICJfVUlfRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19JTkNJREVOQ0UsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERpc2Vhc2UgRGVhdGhzIGZlYXR1cmUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZERpc2Vhc2VEZWF0aHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlX2Rpc2Vhc2VEZWF0aHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZV9kaXNlYXNlRGVhdGhzX2ZlYXR1cmUiLCAiX1VJX0Rpc2Vhc2VNb2RlbExhYmVsVmFsdWVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fRElTRUFTRV9ERUFUSFMsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBkaXNlYXNlTW9kZWxMYWJlbFZhbHVlID0gKERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpb2JqZWN0OworCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZV90eXBlIikgKyAiICIgKyBkaXNlYXNlTW9kZWxMYWJlbFZhbHVlLmdldERpc2Vhc2VEZWF0aHMoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBub3RpZmljYXRpb24KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpc2Vhc2VNb2RlbExhYmVsVmFsdWUuY2xhc3MpKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19ESVNFQVNFX0RFQVRIUzoKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfX1BPUFVMQVRJT05fQ09VTlQ6CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19JTkNJREVOQ0U6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBEaXNlYXNlbW9kZWxzRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL0Rpc2Vhc2VNb2RlbFN0YXRlSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9EaXNlYXNlTW9kZWxTdGF0ZUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MjczMmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9EaXNlYXNlTW9kZWxTdGF0ZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbFN0YXRlOworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbFN0YXRlfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIERpc2Vhc2VNb2RlbFN0YXRlSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcgorCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERpc2Vhc2VNb2RlbFN0YXRlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfRGlzZWFzZU1vZGVsU3RhdGVfdHlwZSIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBub3RpZmljYXRpb24KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIERpc2Vhc2Vtb2RlbHNFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvRGlzZWFzZW1vZGVsc0VkaXRQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL0Rpc2Vhc2Vtb2RlbHNFZGl0UGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxYjcwMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL0Rpc2Vhc2Vtb2RlbHNFZGl0UGx1Z2luLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRWNvcmVFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29tbW9uRWRpdFBsdWdpbjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlci5HcmFwaEVkaXRQbHVnaW47CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTW9kZWxFZGl0UGx1Z2luOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcm92aWRlci5EZWZpbml0aW9uc0VkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0YW5kYXJkRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlci5EZWZpbml0aW9uc0VkaXRQbHVnaW47CisKKy8qKgorICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBEaXNlYXNlbW9kZWxzIGVkaXQgcGx1Z2luLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGlzZWFzZW1vZGVsc0VkaXRQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4geworCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIERpc2Vhc2Vtb2RlbHNFZGl0UGx1Z2luIElOU1RBTkNFID0gbmV3IERpc2Vhc2Vtb2RlbHNFZGl0UGx1Z2luKCk7CisKKwkvKioKKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gcGx1Z2luOworCisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIERpc2Vhc2Vtb2RlbHNFZGl0UGx1Z2luKCkgeworCQlzdXBlcgorCQkgIChuZXcgUmVzb3VyY2VMb2NhdG9yIFtdIHsKKwkJICAgICBDb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJICAgICAvKkVjb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwqLworCQkgICAgIERlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJICAgfSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOworCisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgorCQkJLy8KKwkJCXBsdWdpbiA9IHRoaXM7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL0luZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25JdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL0luZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25JdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODJmMmY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbkl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjMzIEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByb3ZpZGVyLk5vZGVEZWNvcmF0b3JJdGVtUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb259IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25JdGVtUHJvdmlkZXIKKwlleHRlbmRzIE5vZGVEZWNvcmF0b3JJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkTGlzdFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkSW1wb3J0Rm9sZGVyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMaXN0IGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkTGlzdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0luZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25fbGlzdF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uX2xpc3RfZmVhdHVyZSIsICJfVUlfSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5JTkZFQ1RPUl9JTk9DVUxBVE9SX0NPTExFQ1RJT05fX0xJU1QsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSB0cnVlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEltcG9ydCBGb2xkZXIgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRJbXBvcnRGb2xkZXJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9JbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uX2ltcG9ydEZvbGRlcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uX2ltcG9ydEZvbGRlcl9mZWF0dXJlIiwgIl9VSV9JbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLklORkVDVE9SX0lOT0NVTEFUT1JfQ09MTEVDVElPTl9fSU1QT1JUX0ZPTERFUiwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7CisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuSU5GRUNUT1JfSU5PQ1VMQVRPUl9DT0xMRUNUSU9OX19MSVNUKTsKKwkJfQorCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKKwkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgorCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCisKKwkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbi5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvY3VzdG9tMTYvaW5mZWN0b3Jjb2xsZWN0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbilvYmplY3QpLmdldFVSSSgpLmxhc3RTZWdtZW50KCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9JbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisJCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbi5jbGFzcykpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX0lOT0NVTEFUT1JfQ09MTEVDVElPTl9fSU1QT1JUX0ZPTERFUjoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gRGlzZWFzZW1vZGVsc0VkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9JbmZlY3Rvckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvSW5mZWN0b3JJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjc4NzU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvSW5mZWN0b3JJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDMxOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcm92aWRlci5Ob2RlRGVjb3JhdG9ySXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9yfSBvYmplY3QuIDwhLS0KKyAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgSW5mZWN0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBOb2RlRGVjb3JhdG9ySXRlbVByb3ZpZGVyIGltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSW5mZWN0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGREaXNlYXNlTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFRhcmdldFVSSVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkRGlzZWFzZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFRhcmdldElTT0tleVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkTGFiZWxzVG9JbmZlY3RQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFBvcHVsYXRpb25JZGVudGlmaWVyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRJbmZlY3RQZXJjZW50YWdlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEaXNlYXNlIE1vZGVsIGZlYXR1cmUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZERpc2Vhc2VNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0luZmVjdG9yX2Rpc2Vhc2VNb2RlbF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbmZlY3Rvcl9kaXNlYXNlTW9kZWxfZmVhdHVyZSIsICJfVUlfSW5mZWN0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuSU5GRUNUT1JfX0RJU0VBU0VfTU9ERUwsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSB0cnVlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRhcmdldCBVUkkgZmVhdHVyZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkVGFyZ2V0VVJJUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfSW5mZWN0b3JfdGFyZ2V0VVJJX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0luZmVjdG9yX3RhcmdldFVSSV9mZWF0dXJlIiwgIl9VSV9JbmZlY3Rvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5JTkZFQ1RPUl9fVEFSR0VUX1VSSSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGlzZWFzZSBOYW1lIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkRGlzZWFzZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9JbmZlY3Rvcl9kaXNlYXNlTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbmZlY3Rvcl9kaXNlYXNlTmFtZV9mZWF0dXJlIiwgIl9VSV9JbmZlY3Rvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5JTkZFQ1RPUl9fRElTRUFTRV9OQU1FLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUYXJnZXQgSVNPIEtleSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFRhcmdldElTT0tleVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX0luZmVjdG9yX3RhcmdldElTT0tleV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbmZlY3Rvcl90YXJnZXRJU09LZXlfZmVhdHVyZSIsICJfVUlfSW5mZWN0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuSU5GRUNUT1JfX1RBUkdFVF9JU09fS0VZLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMYWJlbHMgVG8gSW5mZWN0IGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkTGFiZWxzVG9JbmZlY3RQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9JbmZlY3Rvcl9sYWJlbHNUb0luZmVjdF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbmZlY3Rvcl9sYWJlbHNUb0luZmVjdF9mZWF0dXJlIiwgIl9VSV9JbmZlY3Rvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5JTkZFQ1RPUl9fTEFCRUxTX1RPX0lORkVDVCwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIHRydWUsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUG9wdWxhdGlvbiBJZGVudGlmaWVyIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkUG9wdWxhdGlvbklkZW50aWZpZXJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9JbmZlY3Rvcl9wb3B1bGF0aW9uSWRlbnRpZmllcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbmZlY3Rvcl9wb3B1bGF0aW9uSWRlbnRpZmllcl9mZWF0dXJlIiwgIl9VSV9JbmZlY3Rvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5JTkZFQ1RPUl9fUE9QVUxBVElPTl9JREVOVElGSUVSLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbmZlY3QgUGVyY2VudGFnZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEluZmVjdFBlcmNlbnRhZ2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9JbmZlY3Rvcl9pbmZlY3RQZXJjZW50YWdlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0luZmVjdG9yX2luZmVjdFBlcmNlbnRhZ2VfZmVhdHVyZSIsICJfVUlfSW5mZWN0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuSU5GRUNUT1JfX0lORkVDVF9QRVJDRU5UQUdFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBpbmZlY3Rvci5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvY3VzdG9tMTYvaW5mZWN0b3IiKSk7CisJfQorCQorCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKEluZmVjdG9yKW9iamVjdCkuZ2V0RGlzZWFzZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9JbmZlY3Rvcl90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9JbmZlY3Rvcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBub3RpZmljYXRpb24KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEluZmVjdG9yLmNsYXNzKSkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfX1RBUkdFVF9VUkk6CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5JTkZFQ1RPUl9fRElTRUFTRV9OQU1FOgorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfX1RBUkdFVF9JU09fS0VZOgorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuSU5GRUNUT1JfX1BPUFVMQVRJT05fSURFTlRJRklFUjoKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SX19JTkZFQ1RfUEVSQ0VOVEFHRToKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIERpc2Vhc2Vtb2RlbHNFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU0VJUkl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU0VJUkl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlN2U1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TRUlSSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUn0gb2JqZWN0LiA8IS0tCisgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiAKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNFSVJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBTSVJJdGVtUHJvdmlkZXIgaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5CisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTRUlSSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkSW5jdWJhdGlvblJhdGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEluY3ViYXRpb24gUmF0ZSBmZWF0dXJlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRJbmN1YmF0aW9uUmF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NFSVJfaW5jdWJhdGlvblJhdGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU0VJUl9pbmN1YmF0aW9uUmF0ZV9mZWF0dXJlIiwgIl9VSV9TRUlSX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNFSVJfX0lOQ1VCQVRJT05fUkFURSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKFNFSVIpb2JqZWN0KS5nZXREaXNlYXNlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1NFSVJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfU0VJUl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCisJICogICAgICAgICAgICA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBub3RpZmljYXRpb24KKwkgKiAgICAgICAgICAgIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKy8vCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWRHZW4oTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTRUlSLmNsYXNzKSkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VJUl9fSU5DVUJBVElPTl9SQVRFOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU0VJUkxhYmVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TRUlSTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Nzc5OWRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU0VJUkxhYmVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMzggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsfSBvYmplY3QuIDwhLS0KKyAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU0VJUkxhYmVsSXRlbVByb3ZpZGVyIGV4dGVuZHMgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbEl0ZW1Qcm92aWRlcgorCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNFSVJMYWJlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZERlbHRhVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFByb2JlVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFRlbXBWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkT3JpZ2luYWxWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkRXJyb3JTY2FsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVsdGEgVmFsdWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGREZWx0YVZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU0VJUkxhYmVsX2RlbHRhVmFsdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU0VJUkxhYmVsX2RlbHRhVmFsdWVfZmVhdHVyZSIsICJfVUlfU0VJUkxhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNFSVJfTEFCRUxfX0RFTFRBX1ZBTFVFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgdHJ1ZSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcm9iZSBWYWx1ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFByb2JlVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TRUlSTGFiZWxfcHJvYmVWYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TRUlSTGFiZWxfcHJvYmVWYWx1ZV9mZWF0dXJlIiwgIl9VSV9TRUlSTGFiZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU0VJUl9MQUJFTF9fUFJPQkVfVkFMVUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSB0cnVlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRlbXAgVmFsdWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUZW1wVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TRUlSTGFiZWxfdGVtcFZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NFSVJMYWJlbF90ZW1wVmFsdWVfZmVhdHVyZSIsICJfVUlfU0VJUkxhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNFSVJfTEFCRUxfX1RFTVBfVkFMVUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSB0cnVlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE9yaWdpbmFsIFZhbHVlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkT3JpZ2luYWxWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NFSVJMYWJlbF9vcmlnaW5hbFZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NFSVJMYWJlbF9vcmlnaW5hbFZhbHVlX2ZlYXR1cmUiLCAiX1VJX1NFSVJMYWJlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TRUlSX0xBQkVMX19PUklHSU5BTF9WQUxVRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIHRydWUsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXJyb3IgU2NhbGUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRFcnJvclNjYWxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU0VJUkxhYmVsX2Vycm9yU2NhbGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU0VJUkxhYmVsX2Vycm9yU2NhbGVfZmVhdHVyZSIsICJfVUlfU0VJUkxhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNFSVJfTEFCRUxfX0VSUk9SX1NDQUxFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgdHJ1ZSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChTRUlSTGFiZWwpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9TRUlSTGFiZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfU0VJUkxhYmVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5vdGlmaWNhdGlvbgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TRUlSTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU0VJUkxhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODZiYjg1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU0VJUkxhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbFZhbHVlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWxWYWx1ZX0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTRUlSTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciBleHRlbmRzIFNJUkxhYmVsVmFsdWVJdGVtUHJvdmlkZXIKKwkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5CisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTRUlSTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZEVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRFUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU0VJUkxhYmVsVmFsdWVfZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TRUlSTGFiZWxWYWx1ZV9lX2ZlYXR1cmUiLCAiX1VJX1NFSVJMYWJlbFZhbHVlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNFSVJfTEFCRUxfVkFMVUVfX0UsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU0VJUkxhYmVsVmFsdWUgc2VpckxhYmVsVmFsdWUgPSAoU0VJUkxhYmVsVmFsdWUpb2JqZWN0OworCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfU0VJUkxhYmVsVmFsdWVfdHlwZSIpICsgIiAiICsgc2VpckxhYmVsVmFsdWUuZ2V0RGlzZWFzZURlYXRocygpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5vdGlmaWNhdGlvbgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU0VJUkxhYmVsVmFsdWUuY2xhc3MpKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUlSX0xBQkVMX1ZBTFVFX19FOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TSURpc2Vhc2VNb2RlbFN0YXRlSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TSURpc2Vhc2VNb2RlbFN0YXRlSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZlZTk4ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1NJRGlzZWFzZU1vZGVsU3RhdGVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSURpc2Vhc2VNb2RlbFN0YXRlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJRGlzZWFzZU1vZGVsU3RhdGV9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU0lEaXNlYXNlTW9kZWxTdGF0ZUl0ZW1Qcm92aWRlciBleHRlbmRzCisJCVN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5CisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTSURpc2Vhc2VNb2RlbFN0YXRlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiAKKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTSURpc2Vhc2VNb2RlbFN0YXRlIHNpRGlzZWFzZU1vZGVsU3RhdGUgPSAoU0lEaXNlYXNlTW9kZWxTdGF0ZSlvYmplY3Q7CisJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9TSURpc2Vhc2VNb2RlbFN0YXRlX3R5cGUiKSArICIgIiArIHNpRGlzZWFzZU1vZGVsU3RhdGUuZ2V0QXJlYVJhdGlvKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1NJSW5mZWN0b3JJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1NJSW5mZWN0b3JJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTc3NzRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU0lJbmZlY3Rvckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJSW5mZWN0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYQorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUluZmVjdG9yfSBvYmplY3QuIDwhLS0KKyAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU0lJbmZlY3Rvckl0ZW1Qcm92aWRlciBleHRlbmRzIFN0YW5kYXJkSW5mZWN0b3JJdGVtUHJvdmlkZXIKKwkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5CisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTSUluZmVjdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkSW5mZWN0aW91c0NvdW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbmZlY3Rpb3VzIENvdW50IGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkSW5mZWN0aW91c0NvdW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU0lJbmZlY3Rvcl9pbmZlY3Rpb3VzQ291bnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU0lJbmZlY3Rvcl9pbmZlY3Rpb3VzQ291bnRfZmVhdHVyZSIsICJfVUlfU0lJbmZlY3Rvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TSV9JTkZFQ1RPUl9fSU5GRUNUSU9VU19DT1VOVCwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChTSUluZmVjdG9yKW9iamVjdCkuZ2V0VVJJKCkubGFzdFNlZ21lbnQoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9TSUluZmVjdG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKFNJSW5mZWN0b3Ipb2JqZWN0KS5nZXREaXNlYXNlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1NJSW5mZWN0b3JfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfU0lJbmZlY3Rvcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCQorCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTSUluZmVjdG9yLmNsYXNzKSkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfSU5GRUNUT1JfX0lORkVDVElPVVNfQ09VTlQ6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1NJSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TSUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDZlNzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TSUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjk5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0l9IG9iamVjdC4gPCEtLQorICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTSUl0ZW1Qcm92aWRlciBleHRlbmRzIFN0YW5kYXJkRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU0lJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCQkJCisJCQlhZGRUcmFuc21pc3Npb25SYXRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGROb25MaW5lYXJpdHlDb2VmZmljaWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkUmVjb3ZlcnlSYXRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJLy8gYWRkUGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c1Byb3BvcnRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsgRGVwcmVjYXRlZCEKKwkJCWFkZENoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFJvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9yc0dlbihPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZFRyYW5zbWlzc2lvblJhdGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZE5vbkxpbmVhcml0eUNvZWZmaWNpZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRSZWNvdmVyeVJhdGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRSb2FkTmV0d29ya0luZmVjdGlvdXNQcm9wb3J0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRDaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVHJhbnNtaXNzaW9uIFJhdGUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUcmFuc21pc3Npb25SYXRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU0lfdHJhbnNtaXNzaW9uUmF0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TSV90cmFuc21pc3Npb25SYXRlX2ZlYXR1cmUiLCAiX1VJX1NJX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNJX19UUkFOU01JU1NJT05fUkFURSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVjb3ZlcnkgUmF0ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFJlY292ZXJ5UmF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NJX3JlY292ZXJ5UmF0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TSV9yZWNvdmVyeVJhdGVfZmVhdHVyZSIsICJfVUlfU0lfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU0lfX1JFQ09WRVJZX1JBVEUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NJX2luZmVjdGlvdXNNb3J0YWxpdHlSYXRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NJX2luZmVjdGlvdXNNb3J0YWxpdHlSYXRlX2ZlYXR1cmUiLCAiX1VJX1NJX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNJX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSb2FkIE5ldHdvcmsgSW5mZWN0aW91cyBQcm9wb3J0aW9uIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkUm9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NJX3JvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU0lfcm9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbl9mZWF0dXJlIiwgIl9VSV9TSV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TSV9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTiwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2hhcmFjdGVyaXN0aWMgTWl4aW5nIERpc3RhbmNlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NJX2NoYXJhY3RlcmlzdGljTWl4aW5nRGlzdGFuY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU0lfY2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZV9mZWF0dXJlIiwgIl9VSV9TSV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TSV9fQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOb24gTGluZWFyaXR5IENvZWZmaWNpZW50IGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkTm9uTGluZWFyaXR5Q29lZmZpY2llbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TSV9ub25MaW5lYXJpdHlDb2VmZmljaWVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TSV9ub25MaW5lYXJpdHlDb2VmZmljaWVudF9mZWF0dXJlIiwgIl9VSV9TSV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TSV9fTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVCwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKFNJKW9iamVjdCkuZ2V0RGlzZWFzZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9TSV90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9TSV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBub3RpZmljYXRpb24KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNJLmNsYXNzKSkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX1RSQU5TTUlTU0lPTl9SQVRFOgorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX05PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQ6CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9fUkVDT1ZFUllfUkFURToKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFOgorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX1BIWVNJQ0FMTFlfQURKQUNFTlRfSU5GRUNUSU9VU19QUk9QT1JUSU9OOgorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX1JPQURfTkVUV09SS19JTkZFQ1RJT1VTX1BST1BPUlRJT046CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9fSU5GRUNUSU9VU19NT1JUQUxJVFk6CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9fQ0hBUkFDVEVSSVNUSUNfTUlYSU5HX0RJU1RBTkNFOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TSUxhYmVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TSUxhYmVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiMDhjNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1NJTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIzNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbH0gb2JqZWN0LiA8IS0tCisgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiAKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNJTGFiZWxJdGVtUHJvdmlkZXIgZXh0ZW5kcyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsSXRlbVByb3ZpZGVyCisJCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU0lMYWJlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZERlbHRhVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFByb2JlVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFRlbXBWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkT3JpZ2luYWxWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkRXJyb3JTY2FsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVsdGEgVmFsdWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGREZWx0YVZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU0lMYWJlbF9kZWx0YVZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NJTGFiZWxfZGVsdGFWYWx1ZV9mZWF0dXJlIiwgIl9VSV9TSUxhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNJX0xBQkVMX19ERUxUQV9WQUxVRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIHRydWUsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJvYmUgVmFsdWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9iZVZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU0lMYWJlbF9wcm9iZVZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NJTGFiZWxfcHJvYmVWYWx1ZV9mZWF0dXJlIiwgIl9VSV9TSUxhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNJX0xBQkVMX19QUk9CRV9WQUxVRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIHRydWUsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGVtcCBWYWx1ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFRlbXBWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NJTGFiZWxfdGVtcFZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NJTGFiZWxfdGVtcFZhbHVlX2ZlYXR1cmUiLCAiX1VJX1NJTGFiZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU0lfTEFCRUxfX1RFTVBfVkFMVUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSB0cnVlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE9yaWdpbmFsIFZhbHVlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkT3JpZ2luYWxWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NJTGFiZWxfb3JpZ2luYWxWYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TSUxhYmVsX29yaWdpbmFsVmFsdWVfZmVhdHVyZSIsICJfVUlfU0lMYWJlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TSV9MQUJFTF9fT1JJR0lOQUxfVkFMVUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSB0cnVlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVycm9yIFNjYWxlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkRXJyb3JTY2FsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NJTGFiZWxfZXJyb3JTY2FsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TSUxhYmVsX2Vycm9yU2NhbGVfZmVhdHVyZSIsICJfVUlfU0lMYWJlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TSV9MQUJFTF9fRVJST1JfU0NBTEUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSB0cnVlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChTSUxhYmVsKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfU0lMYWJlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9TSUxhYmVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5vdGlmaWNhdGlvbgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TSUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1NJTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YmQ4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TSUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE1MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZX0gb2JqZWN0LiA8IS0tCisgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiAKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNJTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciBleHRlbmRzCisJCVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZElQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEkgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRJUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU0lMYWJlbFZhbHVlX2lfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU0lMYWJlbFZhbHVlX2lfZmVhdHVyZSIsICJfVUlfU0lMYWJlbFZhbHVlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNJX0xBQkVMX1ZBTFVFX19JLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVNJTGFiZWxWYWx1ZSBzaUxhYmVsVmFsdWUgPSAoU0lMYWJlbFZhbHVlKW9iamVjdDsKKwkJcmV0dXJuIGdldFN0cmluZygiX1VJX1NJTGFiZWxWYWx1ZV90eXBlIikgKyAiICIgKyBzaUxhYmVsVmFsdWUuZ2V0RGlzZWFzZURlYXRocygpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5vdGlmaWNhdGlvbgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU0lMYWJlbFZhbHVlLmNsYXNzKSkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfTEFCRUxfVkFMVUVfX0k6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1NJUklub2N1bGF0b3JJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1NJUklub2N1bGF0b3JJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDYwZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU0lSSW5vY3VsYXRvckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTkwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUklub2N1bGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJJbm9jdWxhdG9yfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTSVJJbm9jdWxhdG9ySXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBTSUluZmVjdG9ySXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTSVJJbm9jdWxhdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZElub2N1bGF0ZWRQZXJjZW50YWdlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRJbm9jdWxhdGVQZXJjZW50YWdlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbm9jdWxhdGVkIFBlcmNlbnRhZ2UgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRJbm9jdWxhdGVkUGVyY2VudGFnZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NJUklub2N1bGF0b3JfaW5vY3VsYXRlZFBlcmNlbnRhZ2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU0lSSW5vY3VsYXRvcl9pbm9jdWxhdGVkUGVyY2VudGFnZV9mZWF0dXJlIiwgIl9VSV9TSVJJbm9jdWxhdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNJUl9JTk9DVUxBVE9SX19JTk9DVUxBVEVEX1BFUkNFTlRBR0UsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElub2N1bGF0ZSBQZXJjZW50YWdlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkSW5vY3VsYXRlUGVyY2VudGFnZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NJUklub2N1bGF0b3JfaW5vY3VsYXRlUGVyY2VudGFnZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TSVJJbm9jdWxhdG9yX2lub2N1bGF0ZVBlcmNlbnRhZ2VfZmVhdHVyZSIsICJfVUlfU0lSSW5vY3VsYXRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TSVJfSU5PQ1VMQVRPUl9fSU5PQ1VMQVRFX1BFUkNFTlRBR0UsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFNJUklub2N1bGF0b3IuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbTE2L2lub2N1bGF0b3IiKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChTSVJJbm9jdWxhdG9yKW9iamVjdCkuZ2V0VVJJKCkubGFzdFNlZ21lbnQoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9TSVJJbm9jdWxhdG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoU0lSSW5vY3VsYXRvcilvYmplY3QpLmdldERpc2Vhc2VOYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfU0lSSW5vY3VsYXRvcl90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9TSVJJbm9jdWxhdG9yX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisJCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU0lSSW5vY3VsYXRvci5jbGFzcykpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJUl9JTk9DVUxBVE9SX19JTk9DVUxBVEVEX1BFUkNFTlRBR0U6CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSVJfSU5PQ1VMQVRPUl9fSU5PQ1VMQVRFX1BFUkNFTlRBR0U6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1NJUkl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU0lSSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViZWY4ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1NJUkl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUn0gb2JqZWN0LiA8IS0tCisgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiAKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNJUkl0ZW1Qcm92aWRlciBleHRlbmRzIFNJSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU0lSSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkSW1tdW5pdHlMb3NzUmF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSW1tdW5pdHkgTG9zcyBSYXRlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkSW1tdW5pdHlMb3NzUmF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NJUl9pbW11bml0eUxvc3NSYXRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NJUl9pbW11bml0eUxvc3NSYXRlX2ZlYXR1cmUiLCAiX1VJX1NJUl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TSVJfX0lNTVVOSVRZX0xPU1NfUkFURSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoU0lSKW9iamVjdCkuZ2V0VVJJKCkubGFzdFNlZ21lbnQoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9TSVJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChTSVIpb2JqZWN0KS5nZXREaXNlYXNlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1NJUl90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9TSVJfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTSVIuY2xhc3MpKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSVJfX0lNTVVOSVRZX0xPU1NfUkFURToKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU0lSTGFiZWxJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1NJUkxhYmVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhiYjcxYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1NJUkxhYmVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMzggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYQorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbH0gb2JqZWN0LiA8IS0tCisgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiAKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNJUkxhYmVsSXRlbVByb3ZpZGVyIGV4dGVuZHMgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbEl0ZW1Qcm92aWRlcgorCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJUkxhYmVsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkRGVsdGFWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkUHJvYmVWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkVGVtcFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRPcmlnaW5hbFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRFcnJvclNjYWxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZWx0YSBWYWx1ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZERlbHRhVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TSVJMYWJlbF9kZWx0YVZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NJUkxhYmVsX2RlbHRhVmFsdWVfZmVhdHVyZSIsICJfVUlfU0lSTGFiZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU0lSX0xBQkVMX19ERUxUQV9WQUxVRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIHRydWUsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJvYmUgVmFsdWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9iZVZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU0lSTGFiZWxfcHJvYmVWYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TSVJMYWJlbF9wcm9iZVZhbHVlX2ZlYXR1cmUiLCAiX1VJX1NJUkxhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNJUl9MQUJFTF9fUFJPQkVfVkFMVUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSB0cnVlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRlbXAgVmFsdWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUZW1wVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TSVJMYWJlbF90ZW1wVmFsdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU0lSTGFiZWxfdGVtcFZhbHVlX2ZlYXR1cmUiLCAiX1VJX1NJUkxhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNJUl9MQUJFTF9fVEVNUF9WQUxVRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIHRydWUsCisJCQkJIG51bGwsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgT3JpZ2luYWwgVmFsdWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRPcmlnaW5hbFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU0lSTGFiZWxfb3JpZ2luYWxWYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TSVJMYWJlbF9vcmlnaW5hbFZhbHVlX2ZlYXR1cmUiLCAiX1VJX1NJUkxhYmVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNJUl9MQUJFTF9fT1JJR0lOQUxfVkFMVUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSB0cnVlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVycm9yIFNjYWxlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkRXJyb3JTY2FsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NJUkxhYmVsX2Vycm9yU2NhbGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU0lSTGFiZWxfZXJyb3JTY2FsZV9mZWF0dXJlIiwgIl9VSV9TSVJMYWJlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TSVJfTEFCRUxfX0VSUk9SX1NDQUxFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgdHJ1ZSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChTSVJMYWJlbClvYmplY3QpLmdldFVSSSgpOworCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1NJUkxhYmVsX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX1NJUkxhYmVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5vdGlmaWNhdGlvbgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TSVJMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TSVJMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAyNTc3NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1NJUkxhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsVmFsdWU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsVmFsdWV9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU0lSTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciBleHRlbmRzIFNJTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcgorCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJUkxhYmVsVmFsdWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRSUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkUlByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NJUkxhYmVsVmFsdWVfcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TSVJMYWJlbFZhbHVlX3JfZmVhdHVyZSIsICJfVUlfU0lSTGFiZWxWYWx1ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TSVJfTEFCRUxfVkFMVUVfX1IsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU0lSTGFiZWxWYWx1ZSBzaXJMYWJlbFZhbHVlID0gKFNJUkxhYmVsVmFsdWUpb2JqZWN0OworCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfU0lSTGFiZWxWYWx1ZV90eXBlIikgKyAiICIgKyBzaXJMYWJlbFZhbHVlLmdldERpc2Vhc2VEZWF0aHMoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBub3RpZmljYXRpb24KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNJUkxhYmVsVmFsdWUuY2xhc3MpKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSVJfTEFCRUxfVkFMVUVfX1I6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1N0YW5kYXJkRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZERpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZjA0ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZERpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjQ0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyIGV4dGVuZHMgRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyCisJCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RhbmRhcmREaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCQkJYWRkUmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCS8vYWRkVG90YWxQb3B1bGF0aW9uQ291bnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCS8vYWRkVG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQkvL2FkZFRvdGFsQXJlYVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzR2VuKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkVG90YWxQb3B1bGF0aW9uQ291bnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFRvdGFsUG9wdWxhdGlvbkNvdW50UmVjaXByb2NhbFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkVG90YWxBcmVhUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRSZWZlcmVuY2VQb3B1bGF0aW9uRGVuc2l0eVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisJCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRvdGFsIFBvcHVsYXRpb24gQ291bnQgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUb3RhbFBvcHVsYXRpb25Db3VudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1N0YW5kYXJkRGlzZWFzZU1vZGVsX3RvdGFsUG9wdWxhdGlvbkNvdW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1N0YW5kYXJkRGlzZWFzZU1vZGVsX3RvdGFsUG9wdWxhdGlvbkNvdW50X2ZlYXR1cmUiLCAiX1VJX1N0YW5kYXJkRGlzZWFzZU1vZGVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlQsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRvdGFsIFBvcHVsYXRpb24gQ291bnQgUmVjaXByb2NhbCBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFRvdGFsUG9wdWxhdGlvbkNvdW50UmVjaXByb2NhbFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1N0YW5kYXJkRGlzZWFzZU1vZGVsX3RvdGFsUG9wdWxhdGlvbkNvdW50UmVjaXByb2NhbF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TdGFuZGFyZERpc2Vhc2VNb2RlbF90b3RhbFBvcHVsYXRpb25Db3VudFJlY2lwcm9jYWxfZmVhdHVyZSIsICJfVUlfU3RhbmRhcmREaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVF9SRUNJUFJPQ0FMLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVG90YWwgQXJlYSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFRvdGFsQXJlYVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1N0YW5kYXJkRGlzZWFzZU1vZGVsX3RvdGFsQXJlYV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TdGFuZGFyZERpc2Vhc2VNb2RlbF90b3RhbEFyZWFfZmVhdHVyZSIsICJfVUlfU3RhbmRhcmREaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fVE9UQUxfQVJFQSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVmZXJlbmNlIFBvcHVsYXRpb24gRGVuc2l0eSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFJlZmVyZW5jZVBvcHVsYXRpb25EZW5zaXR5UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmREaXNlYXNlTW9kZWxfcmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU3RhbmRhcmREaXNlYXNlTW9kZWxfcmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHlfZmVhdHVyZSIsICJfVUlfU3RhbmRhcmREaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKFN0YW5kYXJkRGlzZWFzZU1vZGVsKW9iamVjdCkuZ2V0RGlzZWFzZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZERpc2Vhc2VNb2RlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZERpc2Vhc2VNb2RlbF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBub3RpZmljYXRpb24KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFN0YW5kYXJkRGlzZWFzZU1vZGVsLmNsYXNzKSkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9fVE9UQUxfUE9QVUxBVElPTl9DT1VOVDoKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1RPVEFMX1BPUFVMQVRJT05fQ09VTlRfUkVDSVBST0NBTDoKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfX1RPVEFMX0FSRUE6CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE5YWIzMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1N0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxJdGVtUHJvdmlkZXIgZXh0ZW5kcworCQlEaXNlYXNlTW9kZWxMYWJlbEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5vdGlmaWNhdGlvbgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1N0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YTFhZTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE0OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciBleHRlbmRzCisJCURpc2Vhc2VNb2RlbExhYmVsVmFsdWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5CisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVJdGVtUHJvdmlkZXIoCisJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZFNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFMgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlX3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlX3NfZmVhdHVyZSIsICJfVUlfU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfX1MsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSA9IChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpb2JqZWN0OworCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlX3R5cGUiKSArICIgIiArIHN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZS5nZXREaXNlYXNlRGVhdGhzKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUuY2xhc3MpKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19TOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QxMmVlNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1N0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGV9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZUl0ZW1Qcm92aWRlciBleHRlbmRzCisJCURpc2Vhc2VNb2RlbFN0YXRlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZEFyZWFSYXRpb1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXJlYSBSYXRpbyBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEFyZWFSYXRpb1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1N0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGVfYXJlYVJhdGlvX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1N0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGVfYXJlYVJhdGlvX2ZlYXR1cmUiLCAiX1VJX1N0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9TVEFURV9fQVJFQV9SQVRJTywKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlIHN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUgPSAoU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZSlvYmplY3Q7CisJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlX3R5cGUiKSArICIgIiArIHN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUuZ2V0QXJlYVJhdGlvKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlLmNsYXNzKSkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9TVEFURV9fQVJFQV9SQVRJTzoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZTM2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZEhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyOTEgQEAKKy8vIFN0YW5kYXJkSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMuaGlzdG9yeS5IaXN0b3J5UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5oaXN0b3J5Lkhpc3RvcnlQcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5oaXN0b3J5Lkhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudXRpbC5TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5OworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cworICovCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCVN0YW5kYXJkQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzCisJICogYWRhcHRlciBmYWN0b3J5LgorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LgorCSAqLworCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKKworCS8qKgorCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgU3RhbmRhcmRIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRkQWRhcHRlckZhY3RvcnkodGhpcyk7CisJfSAvLyBTdGFuZGFyZEhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC51dGlsLlN0YW5kYXJkQWRhcHRlckZhY3RvcnkjY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWxBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgRGlzZWFzZU1vZGVsTGFiZWxIaXN0b3J5UHJvdmlkZXIoKTsKKwl9IC8vIGNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsQWRhcHRlcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihmaW5hbCBJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyI2ZpcmVOb3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7CisJCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCQl9CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcigKKwkJCWZpbmFsIElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5I2dldFJvb3RBZGFwdGVyRmFjdG9yeSgpCisJICovCisJcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeQorCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnkjc2V0UGFyZW50QWRhcHRlckZhY3Rvcnkob3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeSgKKwkJCWZpbmFsIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKKwkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnV0aWwuU3RhbmRhcmRBZGFwdGVyRmFjdG9yeSNpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShmaW5hbCBPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gdHlwZSA9PSBIaXN0b3J5UHJvdmlkZXIuY2xhc3MgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9IC8vIGlzRmFjdG9yeUZvclR5cGUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGUjZGlzcG9zZSgpCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJLy8gTm90aGluZworCX0KKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYSBIaXN0b3J5IFByb3ZpZGVyIGZvciBEaXNlYXNlTW9kZWxMYWJlbCBpbnN0YW5jZXMuIEl0CisJICogcHJvdmlkZXMgYSBjb2xsZWN0aW9uIG9mIGhpc3RvcmljIHZhbHVlcyBvZiBhIERpc2Vhc2VNb2RlbExhYmVsCisJICovCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGlzZWFzZU1vZGVsTGFiZWxIaXN0b3J5UHJvdmlkZXIgZXh0ZW5kcworCQkJSGlzdG9yeVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIEhpc3RvcnlQcm92aWRlciB7CisKKwkJbG9uZyBjeWNsZSA9IDBMOworCQlmaW5hbCBTVEVNVGltZSBzdGFydFRpbWUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNURU1UaW1lKCk7CisKKwkJZmluYWwgTWFwPFNURU1UaW1lLCBEaXNlYXNlTW9kZWxMYWJlbD4gaGlzdG9yeSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgVHJlZU1hcDxTVEVNVGltZSwgRGlzZWFzZU1vZGVsTGFiZWw+KCkpOworCisJCQorCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoZmluYWwgTm90aWZpY2F0aW9uIG1zZykgeworCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKKwkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKKwkJCQkvLyBJcyBpdCBzZXR0aW5nIHRoZSBuZXh0VmFsdWU/CisJCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKExhYmVsVmFsdWUuY2xhc3MpKSB7CisJCQkJY2FzZSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19MQUJFTF9fTkVYVF9WQUxVRToKKwkJCQkJLy8gSWYgdGhlIG5leHQgdmFsdWUgbnVsbD8KKwkJCQkJCisJCQkJCWlmIChtc2cuZ2V0TmV3VmFsdWUoKSAhPSBudWxsKSB7CisJCQkJCQkvLyBObworCQkJCQkJU1RFTVRpbWUgdGltZUtleSA9IGdlbmVyYXRlTmV4dFNURU1UaW1lKGN5Y2xlKyspOworCQkJCQkJc3luY2hyb25pemVkIChoaXN0b3J5KSB7CisJCQkJCQkJLy8gTWFrZSBvZiBjb3B5IG9mIHRoZSBkaXNlYXNlIG1vZGVsIGxhYmVsCisJCQkJCQkJZmluYWwgRGlzZWFzZU1vZGVsTGFiZWwgZG1sID0gKERpc2Vhc2VNb2RlbExhYmVsKUVjb3JlVXRpbAorCQkJCQkJCQkJLmNvcHkoKERpc2Vhc2VNb2RlbExhYmVsKSBnZXRUYXJnZXQoKSk7CisJCQkJCQkJLy8gV2hlbiB5b3UgY29weSBhbiBFT2JqZWN0LCB0aGUgcmVmZXJlbmNlcyBhcmUKKwkJCQkJCQkvLyBjb3BpZWQgYXMgd2VsbCB0aGlzIG1lYW5zIHRoYXQgdGhlIE5vZGUgdGhhdAorCQkJCQkJCS8vIHJlZmVyZW5jZWQgdGhlIG9yaWdpbmFsIERpc2Vhc2VNb2RlbExhYmVsIHdpbGwKKwkJCQkJCQkvLyBhbHNvIHJlZmVyZW5jZSB0aGUgY29weS4gVGhpcyBhZGRzIHRoZSBjb3B5IHRvCisJCQkJCQkJLy8gdGhlIGxpc3Qgb2YgTGFiZWxzIG1haW50YWluZWQgYnkgdGhlIE5vZGUuIFdlCisJCQkJCQkJLy8gbmVlZCB0byByZW1vdmUgaXQgZnJvbSB0aGUgbGlzdCBzbyB0aGF0IHdlIGRvbid0CisJCQkJCQkJLy8gZ2V0IGV4dHJhbmVvdXMgTGFiZWxzIGhhbmdpbmcgYXJvdW5kLgorCQkJCQkJCWRtbC5nZXROb2RlKCkuZ2V0TGFiZWxzKCkucmVtb3ZlKGRtbCk7CisJCQkJCQkJaGlzdG9yeS5wdXQodGltZUtleSwgZG1sKTsKKwkJCQkJCX0vLyBzeW5jaHJvbml6ZWQKKwkJCQkJCWZpcmVIaXN0b3J5RXh0ZW5kZWQoKTsKKwkJCQkJfSAvLyBpZiBub3QgbnVsbAorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0gLy8gc3dpdGNoIExhYmVsVmFsdWUgZmVhdHVyZSBJZAorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfSAvLyBzd2l0Y2gKKworCQl9IC8vIG5vdGlmeUNoYW5nZWQKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLmhpc3RvcnkuSGlzdG9yeVByb3ZpZGVyQWRhcHRlciNnZXRBbGxIaXN0b3JpY1RpbWVWYWx1ZXMoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTVEVNVGltZVtdIGdldEFsbEhpc3RvcmljVGltZVZhbHVlcygpIHsKKwkJCVNURU1UaW1lW10gdGltZSA9IG51bGw7CisJCQlzeW5jaHJvbml6ZWQoaGlzdG9yeSkgeworCQkJCXRpbWU9aGlzdG9yeS5rZXlTZXQoKS50b0FycmF5KG5ldyBTVEVNVGltZVswXSk7CisJCQl9CisJCQlyZXR1cm4gdGltZTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMuaGlzdG9yeS5IaXN0b3J5UHJvdmlkZXJBZGFwdGVyI2dldEFsbEhpc3RvcmljSW5zdGFuY2VzKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgSWRlbnRpZmlhYmxlW10gZ2V0QWxsSGlzdG9yaWNJbnN0YW5jZXMoKSB7CisJCQlJZGVudGlmaWFibGVbXSBhbGxJbnN0YW5jZXMgPSBudWxsOworCQkJc3luY2hyb25pemVkKGhpc3RvcnkpIHsKKwkJCQlhbGxJbnN0YW5jZXM9aGlzdG9yeS52YWx1ZXMoKS50b0FycmF5KG5ldyBJZGVudGlmaWFibGVbMF0pOworCQkJfQorCQkJcmV0dXJuIGFsbEluc3RhbmNlczsKKwkJfQorCisJCQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMuaGlzdG9yeS5IaXN0b3J5UHJvdmlkZXJBZGFwdGVyI2dldEhpc3RvcmljSW5zdGFuY2VzKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgSWRlbnRpZmlhYmxlW10gZ2V0SGlzdG9yaWNJbnN0YW5jZXMoU1RFTVRpbWVbXSB0aW1lUmFuZ2UpIHsKKwkJCUlkZW50aWZpYWJsZVtdIGFsbFZhbHVlcyA9IGdldEFsbEhpc3RvcmljSW5zdGFuY2VzKCk7CisJCQlJZGVudGlmaWFibGVbXSByZXRWYWwgPSBuZXcgSWRlbnRpZmlhYmxlW3RpbWVSYW5nZS5sZW5ndGhdOworCQkJU3lzdGVtLmFycmF5Y29weShhbGxWYWx1ZXMsIDAsIHJldFZhbCwgMCwgdGltZVJhbmdlLmxlbmd0aCk7CisJCQlyZXR1cm4gcmV0VmFsOworCQl9CisJCQorCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLmhpc3RvcnkuSGlzdG9yeVByb3ZpZGVyQWRhcHRlciNnZXRFYXJsaWVzdEN5Y2xlTnVtYmVyKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGdldEVhcmxpZXN0Q3ljbGVOdW1iZXIoKSB7CisJCQlsb25nIHJldFZhbHVlID0gMDsKKwkJCXN5bmNocm9uaXplZChoaXN0b3J5KSB7CisJCQkJdHJ5IHsKKwkJCQkJcmV0VmFsdWUgPSBoaXN0b3J5LmtleVNldCgpLnRvQXJyYXkobmV3IExvbmdbMF0pWzBdLmxvbmdWYWx1ZSgpOworCQkJCX0gY2F0Y2ggKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gZSkgeworCQkJCQkvLyBJZ25vcmUsIHJldHVybiAwCisJCQkJfQorCQkJfQorCQkJcmV0dXJuIChpbnQpIHJldFZhbHVlOworCQl9IC8vIGdldEVhcmxpZXN0Q3ljbGVOdW1iZXIKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLmhpc3RvcnkuSGlzdG9yeVByb3ZpZGVyQWRhcHRlciNnZXRFYXJsaWVzdFRpbWVWYWx1ZSgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFNURU1UaW1lIGdldEVhcmxpZXN0VGltZVZhbHVlKCkgeworCQkJcmV0dXJuIGdlbmVyYXRlSGlzdG9yaWNTVEVNVGltZShnZXRFYXJsaWVzdEN5Y2xlTnVtYmVyKCkpOworCQl9CisKKwkJLyoqCisJCSAqIEByZXR1cm4KKwkJICovCisJCXByaXZhdGUgU1RFTVRpbWUgZ2VuZXJhdGVIaXN0b3JpY1NURU1UaW1lKGZpbmFsIGludCBkYXlzSW5QYXN0KSB7CisJCQlmaW5hbCBTVEVNVGltZSByZXRWYWx1ZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU1RFTVRpbWUoKTsKKwkJCWZpbmFsIGxvbmcgZGF5c0FnbyA9IHJldFZhbHVlLmdldFRpbWUoKS5nZXRUaW1lKCkgLSBkYXlzSW5QYXN0CisJCQkJCSogU1RFTVRpbWUuVW5pdHMuREFZLmdldE1pbGxpc2Vjb25kcygpOworCQkJcmV0VmFsdWUuc2V0VGltZShuZXcgRGF0ZShkYXlzQWdvKSk7CisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gZ2VuZXJhdGVIaXN0b3JpY1NURU1UaW1lCisJCQorCisJCS8qKgorCQkgKiBAcmV0dXJuCisJCSAqLworCQlwcml2YXRlIFNURU1UaW1lIGdlbmVyYXRlTmV4dFNURU1UaW1lKGZpbmFsIGxvbmcgZGF5c0luRnV0dXJlKSB7CisJCQlmaW5hbCBTVEVNVGltZSByZXRWYWx1ZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU1RFTVRpbWUoKTsKKwkJCWZpbmFsIGxvbmcgZGF5ID0gc3RhcnRUaW1lLmdldFRpbWUoKS5nZXRUaW1lKCkgKyBkYXlzSW5GdXR1cmUKKwkJCQkJKiBTVEVNVGltZS5Vbml0cy5EQVkuZ2V0TWlsbGlzZWNvbmRzKCk7CisJCQlyZXRWYWx1ZS5zZXRUaW1lKG5ldyBEYXRlKGRheSkpOworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGdlbmVyYXRlSGlzdG9yaWNTVEVNVGltZQorCQkKKwkJCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5oaXN0b3J5Lkhpc3RvcnlQcm92aWRlckFkYXB0ZXIjcmVzZXQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCisJCQljeWNsZSA9IDA7CisJCQlzeW5jaHJvbml6ZWQoaGlzdG9yeSkgeworCQkJCWhpc3RvcnkuY2xlYXIoKTsKKwkJCX0KKwkJCQorCQkJLy8gVGhlIHN1cGVyIGNsYXNzIHdpbGwgdGVsbCB0aGUgbGlzdGVuZXJzIHRoYXQgdGhlIGhpc3RvcnkgaGFzCisJCQkvLyBjaGFuZ2VkLgorCQkJc3VwZXIucmVzZXQoKTsKKwkJfQorCisJfSAvLyBEaXNlYXNlTW9kZWxMYWJlbEhpc3RvcnlQcm92aWRlcgorCit9IC8vIFN0YW5kYXJkSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1N0YW5kYXJkSW5mZWN0b3JJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1N0YW5kYXJkSW5mZWN0b3JJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2YyYTVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRJbmZlY3Rvckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEluZmVjdG9yOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkSW5mZWN0b3J9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRJbmZlY3Rvckl0ZW1Qcm92aWRlciBleHRlbmRzIEluZmVjdG9ySXRlbVByb3ZpZGVyCisJCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RhbmRhcmRJbmZlY3Rvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChTdGFuZGFyZEluZmVjdG9yKW9iamVjdCkuZ2V0RGlzZWFzZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZEluZmVjdG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX1N0YW5kYXJkSW5mZWN0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1N0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1N0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTUyYThmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsODA1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRJbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsRmFjdG9yeTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2U7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudXRpbC5TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5OworCisvKioKKyAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4KKyAqIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LgorICogVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4KKyAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKyAqIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBTdGFuZGFyZEFkYXB0ZXJGYWN0b3J5CisJCWltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNFSVJMYWJlbEl0ZW1Qcm92aWRlciBzZWlyTGFiZWxJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsfS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU0VJUkxhYmVsQWRhcHRlcigpIHsKKwkJaWYgKHNlaXJMYWJlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlzZWlyTGFiZWxJdGVtUHJvdmlkZXIgPSBuZXcgU0VJUkxhYmVsSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHNlaXJMYWJlbEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWxWYWx1ZX0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU0VJUkxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgc2VpckxhYmVsVmFsdWVJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsVmFsdWV9LiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTRUlSTGFiZWxWYWx1ZUFkYXB0ZXIoKSB7CisJCWlmIChzZWlyTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlzZWlyTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciA9IG5ldyBTRUlSTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBzZWlyTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbH0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU0lSTGFiZWxJdGVtUHJvdmlkZXIgc2lyTGFiZWxJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWx9LiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTSVJMYWJlbEFkYXB0ZXIoKSB7CisJCWlmIChzaXJMYWJlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlzaXJMYWJlbEl0ZW1Qcm92aWRlciA9IG5ldyBTSVJMYWJlbEl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBzaXJMYWJlbEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbFZhbHVlfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTSVJMYWJlbFZhbHVlSXRlbVByb3ZpZGVyIHNpckxhYmVsVmFsdWVJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWxWYWx1ZX0uIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNJUkxhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlpZiAoc2lyTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlzaXJMYWJlbFZhbHVlSXRlbVByb3ZpZGVyID0gbmV3IFNJUkxhYmVsVmFsdWVJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gc2lyTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbH0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlpZiAoc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPSBuZXcgU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIERldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyIGRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJaWYgKGRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCWRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyID0gbmV3IERldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNJTGFiZWxJdGVtUHJvdmlkZXIgc2lMYWJlbEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsfS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU0lMYWJlbEFkYXB0ZXIoKSB7CisJCWlmIChzaUxhYmVsSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXNpTGFiZWxJdGVtUHJvdmlkZXIgPSBuZXcgU0lMYWJlbEl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBzaUxhYmVsSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZX0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU0lMYWJlbFZhbHVlSXRlbVByb3ZpZGVyIHNpTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWV9LiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTSUxhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlpZiAoc2lMYWJlbFZhbHVlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXNpTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciA9IG5ldyBTSUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gc2lMYWJlbFZhbHVlSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJSW5mZWN0b3J9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNJSW5mZWN0b3JJdGVtUHJvdmlkZXIgc2lJbmZlY3Rvckl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUluZmVjdG9yfS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU0lJbmZlY3RvckFkYXB0ZXIoKSB7CisJCWlmIChzaUluZmVjdG9ySXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXNpSW5mZWN0b3JJdGVtUHJvdmlkZXIgPSBuZXcgU0lJbmZlY3Rvckl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBzaUluZmVjdG9ySXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIERldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgZGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlpZiAoZGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlkZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyID0gbmV3IERldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gZGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIERldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciBkZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCWlmIChkZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJZGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyID0gbmV3IERldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBkZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbH0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciBzdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCWlmIChzdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPSBuZXcgU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBzdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciBhZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJaWYgKGFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJYWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciA9IG5ldyBBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIGFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZX0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlSXRlbVByb3ZpZGVyIGFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGVJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGVBZGFwdGVyKCkgeworCQlpZiAoYWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlhZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlSXRlbVByb3ZpZGVyID0gbmV3IEFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGVJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gYWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZUl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyIGFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlpZiAoYWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCWFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciA9IG5ldyBBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gYWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyIGFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlpZiAoYWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJYWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPSBuZXcgQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gYWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSSW5vY3VsYXRvcn0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTSVJJbm9jdWxhdG9ySXRlbVByb3ZpZGVyIHNpcklub2N1bGF0b3JJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUklub2N1bGF0b3J9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNJUklub2N1bGF0b3JBZGFwdGVyKCkgeworCQlpZiAoc2lySW5vY3VsYXRvckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlzaXJJbm9jdWxhdG9ySXRlbVByb3ZpZGVyID0gbmV3IFNJUklub2N1bGF0b3JJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gc2lySW5vY3VsYXRvckl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgc3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCWlmIChzdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPSBuZXcgU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBzdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyIHN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlpZiAoc3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJc3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPSBuZXcgU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gc3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciBzdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJaWYgKHN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlzdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPSBuZXcgU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9ufSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25JdGVtUHJvdmlkZXIgaW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbkl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbkFkYXB0ZXIoKSB7CisJCWlmIChpbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCWluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25JdGVtUHJvdmlkZXIgPSBuZXcgSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiBpbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbH0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyIHN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJaWYgKHN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlzdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgPSBuZXcgU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSURpc2Vhc2VNb2RlbFN0YXRlfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTSURpc2Vhc2VNb2RlbFN0YXRlSXRlbVByb3ZpZGVyIHNpRGlzZWFzZU1vZGVsU3RhdGVJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJRGlzZWFzZU1vZGVsU3RhdGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTSURpc2Vhc2VNb2RlbFN0YXRlQWRhcHRlcigpIHsKKwkJaWYgKHNpRGlzZWFzZU1vZGVsU3RhdGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJc2lEaXNlYXNlTW9kZWxTdGF0ZUl0ZW1Qcm92aWRlciA9IG5ldyBTSURpc2Vhc2VNb2RlbFN0YXRlSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHNpRGlzZWFzZU1vZGVsU3RhdGVJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnRBZGFwdGVyRmFjdG9yeQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeSgKKwkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKKwkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIHR5cGUKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbm90aWZpZXIKKwkgKiBAcGFyYW0gdHlwZQorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7CisJCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHBhcmFtIHR5cGUKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKKwkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKKwkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKKwkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzczw/PikgfHwgKCgoQ2xhc3M8Pz4pdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKKwkJCQlyZXR1cm4gYWRhcHRlcjsKKwkJCX0KKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9IGFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBub3RpZmljYXRpb24KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCisJCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7CisJCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlpZiAoZGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgIT0gbnVsbCkgZGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoZGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyICE9IG51bGwpIGRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChkZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyICE9IG51bGwpIGRldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoc2VpckxhYmVsSXRlbVByb3ZpZGVyICE9IG51bGwpIHNlaXJMYWJlbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChzZWlyTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciAhPSBudWxsKSBzZWlyTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChzaURpc2Vhc2VNb2RlbFN0YXRlSXRlbVByb3ZpZGVyICE9IG51bGwpIHNpRGlzZWFzZU1vZGVsU3RhdGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoc2lJbmZlY3Rvckl0ZW1Qcm92aWRlciAhPSBudWxsKSBzaUluZmVjdG9ySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKHNpTGFiZWxJdGVtUHJvdmlkZXIgIT0gbnVsbCkgc2lMYWJlbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChzaUxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgc2lMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKHNpckxhYmVsSXRlbVByb3ZpZGVyICE9IG51bGwpIHNpckxhYmVsSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKHNpckxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgc2lyTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChzdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciAhPSBudWxsKSBzdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChzdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgIT0gbnVsbCkgc3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKHN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgIT0gbnVsbCkgc3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChhZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyICE9IG51bGwpIGFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoYWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZUl0ZW1Qcm92aWRlciAhPSBudWxsKSBhZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKGFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciAhPSBudWxsKSBhZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoYWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgIT0gbnVsbCkgYWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAoc2lySW5vY3VsYXRvckl0ZW1Qcm92aWRlciAhPSBudWxsKSBzaXJJbm9jdWxhdG9ySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKHN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgIT0gbnVsbCkgc3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChzdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlciAhPSBudWxsKSBzdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChzdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIgIT0gbnVsbCkgc3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKGluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkgaW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDFlMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDMzMyBAQAorLy8gU3RhbmRhcmRSZWxhdGl2ZUhpc3RvcnlWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMuaGlzdG9yeS5IaXN0b3J5UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5oaXN0b3J5Lkhpc3RvcnlQcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5oaXN0b3J5Lkhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeS5SZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5oaXN0b3J5LlJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5oaXN0b3J5LlJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudXRpbC5TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBmYWN0b3J5IGZvciB0aGlzIG1vZGVsIHRoYXQgY3JlYXRlcworICoge0BsaW5rIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJ9J3MgZm9yIGNsYXNzZXMgaW4gdGhlIG1vZGVsLgorICovCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcworCQlTdGFuZGFyZEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMKKwkJUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMKKwkgKiBhZGFwdGVyIGZhY3RvcnkuCisJICovCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50CisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uCisJICovCisJcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOworCisJLyoqCisJICogVGhpcyBmYWN0b3J5IGlzIHVzZWQgdG8gY3JlYXRlIGl0ZW0gcHJvdmlkZXJzIGZvciB0aGUgYWRhcHRlZCBjbGFzc2VzLgorCSAqIFRoZSBpdGVtIHByb3ZpZGVycyBhcmUgdXNlZCBhcyBwcm9wZXJ0eSBzb3VyY2VzIHRvIGdldCB0aGUgcHJvcGVydGllcworCSAqIHRoYXQgY2FuIGhhdmUgcmVsYXRpdmUgdmFsdWVzLgorCSAqLworCS8vcHJpdmF0ZSBzdGF0aWMgU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBpdGVtUHJvdmlkZXJGYWN0b3J5OworCisJcHJpdmF0ZSBIaXN0b3J5UHJvdmlkZXJBZGFwdGVyIGhpc3RvcnlQcm92aWRlckFkYXB0ZXIgPSBudWxsOworCisJLyoqCisJICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBTdGFuZGFyZFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJLmFkZEFkYXB0ZXJGYWN0b3J5KHRoaXMpOworCX0gLy8gU3RhbmRhcmRSZWxhdGl2ZUhpc3RvcnlWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnV0aWwuU3RhbmRhcmRBZGFwdGVyRmFjdG9yeSNjcmVhdGVBZGFwdGVyKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7CisJCUFkYXB0ZXIgcmV0VmFsdWUgPSBudWxsOworCisJCS8vIEJlZm9yZSB3ZSBjcmVhdGUgb3VyIGFkYXB0ZXIsIHdlIHRyeSB0byBhZGFwdCB0aGUgdGFyZ2V0IHRvIGEKKwkJLy8gSGlzdG9yeVByb3ZpZGVyLiBJZiB3ZSBjYW4ndCB0aGVuIHdlJ3JlIGRvbmUgYW5kIHJldHVybiBudWxsIHRvCisJCS8vIGluZGljYXRlIHRoYXQgdGhpcyBmYWN0b3J5IGNhbid0IGNyZWF0ZSB0aGUgYWRhcHRlci4gSWYgbm90LCB0aGVuIHdlCisJCS8vIHJlbWVtYmVyIHRoZSBoaXN0b3J5IHByb3ZpZGVyIGFuZCBsZXQgdGhlIHN1cGVyIGNsYXNzJ3MgbWV0aG9kIGRvIHRoZQorCQkvLyBzd2l0Y2ggb24gdGhlIHR5cGUuCisJCWhpc3RvcnlQcm92aWRlckFkYXB0ZXIgPSAoSGlzdG9yeVByb3ZpZGVyQWRhcHRlcikgSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkuYWRhcHQodGFyZ2V0LCBIaXN0b3J5UHJvdmlkZXIuY2xhc3MpOworCisJCS8vIERpZCB3ZSBzdWNjZWVkPworCQlpZiAoaGlzdG9yeVByb3ZpZGVyQWRhcHRlciAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXJldFZhbHVlID0gc3VwZXIuY3JlYXRlQWRhcHRlcih0YXJnZXQpOworCQl9IC8vIGlmCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlQWRhcHRlcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudXRpbC5TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURpc2Vhc2VNb2RlbExhYmVsQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IERpc2Vhc2VNb2RlbExhYmVsUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlcigKKwkJCQloaXN0b3J5UHJvdmlkZXJBZGFwdGVyKTsKKwl9IC8vIGNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsQWRhcHRlcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihmaW5hbCBJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0gLy8gYWRkTGlzdGVuZXIKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyI2ZpcmVOb3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7CisJCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCQl9CisJfSAvLyBmaXJlTm90aWZ5Q2hhbmdlZAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcigKKwkJCWZpbmFsIElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfSAvLyByZW1vdmVMaXN0ZW5lcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5I2dldFJvb3RBZGFwdGVyRmFjdG9yeSgpCisJICovCisJcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeQorCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKKwl9IC8vIGdldFJvb3RBZGFwdGVyRmFjdG9yeQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5I3NldFBhcmVudEFkYXB0ZXJGYWN0b3J5KG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3RvcnkpCisJICovCisJcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoCisJCQlmaW5hbCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7CisJCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKKwl9IC8vIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKGZpbmFsIE9iamVjdCB0eXBlKSB7CisJCXJldHVybiB0eXBlID09IFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIuY2xhc3MKKwkJCQl8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOworCX0KKworCS8qKgorCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlI2Rpc3Bvc2UoKQorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCS8vIE5vdGhpbmcKKwl9IC8vIGRpc3Bvc2UKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoZSBSZWxhdGl2ZSBWYWx1ZSBQcm92aWRlciBBZGFwdGVyIEZhY3RvcnkKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBnZXRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFOworCX0gLy8gZ2V0UmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYSBSZWxhdGl2ZSBWYWx1ZSBIaXN0b3J5IFByb3ZpZGVyIGZvciBEaXNlYXNlTW9kZWxMYWJlbAorCSAqIGluc3RhbmNlcy4gSXQgcHJvdmlkZXMgYSBjb2xsZWN0aW9uIG9mIHRoZSBwcm9wZXJ0aWVzIHRoYXQgY2FuIGhhdmUKKwkgKiByZWxhdGl2ZSB2YWx1ZXMgYW5kIHdpbGwgY29tcHV0ZSB0aGUgdmFsdWUgYmV0d2VlbiAwLjAgYW5kIDEuMCBmb3IgYW55IG9mCisJICogdGhvc2UgcHJvcGVydGllcy4gSXQgd2lsbCBhbHNvIHByb3ZpZGUgaGlzdG9yaWMgcmVsYXRpdmUgdmFsdWVzLgorCSAqIAorCSAqIEBzZWUgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZVJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIERpc2Vhc2VNb2RlbExhYmVsUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlciBleHRlbmRzCisJCQlSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCisJCQlSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyIHsKKworCQlwcml2YXRlIEhpc3RvcnlQcm92aWRlckFkYXB0ZXIgaGlzdG9yeVByb3ZpZGVyQWRhcHRlciA9IG51bGw7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBoaXN0b3J5UHJvdmlkZXJBZGFwdGVyCisJCSAqLworCQlwdWJsaWMgRGlzZWFzZU1vZGVsTGFiZWxSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyKAorCQkJCWZpbmFsIEhpc3RvcnlQcm92aWRlckFkYXB0ZXIgaGlzdG9yeVByb3ZpZGVyQWRhcHRlcikgeworCQkJdGhpcy5oaXN0b3J5UHJvdmlkZXJBZGFwdGVyID0gaGlzdG9yeVByb3ZpZGVyQWRhcHRlcjsKKwkJCWhpc3RvcnlQcm92aWRlckFkYXB0ZXIuYWRkRXh0ZW5zaW9uTGlzdGVuZXIodGhpcyk7CisJCX0gLy8gRGlzZWFzZU1vZGVsTGFiZWxSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXIjZ2V0UHJvcGVydGllcygpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnRpZXMoKSB7CisJCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbCBkbWwgPSAoRGlzZWFzZU1vZGVsTGFiZWwpIGdldFRhcmdldCgpOworCQkJZmluYWwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyIHJ2cCA9IChSZWxhdGl2ZVZhbHVlUHJvdmlkZXIpIGdldFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkKKwkJCQkJLmFkYXB0KGRtbC5nZXRDdXJyZW50VmFsdWUoKSwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyLmNsYXNzKTsKKwkJCXJldHVybiBydnAuZ2V0UHJvcGVydGllcygpOworCQl9IC8vIGdldFByb3BlcnRpZXMKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciNnZXRSZWxhdGl2ZVZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGRvdWJsZSBnZXRSZWxhdGl2ZVZhbHVlKGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbCBkbWwgPSAoRGlzZWFzZU1vZGVsTGFiZWwpIGdldFRhcmdldCgpOworCQkJZmluYWwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyIHJ2cCA9IChSZWxhdGl2ZVZhbHVlUHJvdmlkZXIpIGdldFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkKKwkJCQkJLmFkYXB0KGRtbC5nZXRDdXJyZW50VmFsdWUoKSwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyLmNsYXNzKTsKKwkJCXJldHVybiBydnAuZ2V0UmVsYXRpdmVWYWx1ZShmZWF0dXJlKTsKKwkJfSAvLyBnZXRSZWxhdGl2ZVZhbHVlCisKKwkJLyoqCisJCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGRlbm9taW5hdG9yIG9yIHNjYWxlIHVzZWQgdG8gY29udmVydCB0byByZWxhdGl2ZQorCQkgKiB2YWx1ZXMgaW4gdGhlIHJhbmdlIDAtMS4gRm9yIGV4YW1wbGUsIGluIGFuIEVwaWRlbWljIENvbXBhcnRtZW50IG1vZGVsCisJCSAqIHRoZSBzdGF0ZSB2YWx1ZXMgYXJlIG5vcm1hbGl6ZWQgYnkgcG9wdWxhdGlvbi4KKwkJICogSXQgaXMgcmVxdWlyZWQgd2hlbmV2ZXIgd2UgbmVlZCB0byBzd2l0Y2ggYmV0d2VlbiByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgdmFsdWVzCisJCSAqIG9yIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGxhYmVsIHNob3dpbmcgdGhlIG1heGltdW0gc2NhbGUgZm9yIGFueSByZWxhdGl2ZSB2YWx1ZS4KKwkJICogQHJldHVybiB0aGUgZGVub21pbmF0b3Igb3Igc2NhbGUgdXNlZCB0byBub3JtYWxpemUgdGhlIHJlbGF0aXZlIHZhbHVlCisJCSAqLworCQlwdWJsaWMgZG91YmxlIGdldERlbm9taW5hdG9yKGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbCBkbWwgPSAoRGlzZWFzZU1vZGVsTGFiZWwpIGdldFRhcmdldCgpOworCQkJRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBkbWx2ID0gKERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpZG1sLmdldEN1cnJlbnRWYWx1ZSgpOworCQkJLy9maW5hbCBkb3VibGUgcG9wdWxhdGlvbkNvdW50ID0gZG1sdi5nZXRQb3B1bGF0aW9uQ291bnQoKTsKKwkJCXJldHVybiBkbWx2LmdldFBvcHVsYXRpb25Db3VudCgpOworCQl9CisJCQorCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeS5SZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyI2dldFJlbGF0aXZlVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvciwKKwkJICogICAgICBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGRvdWJsZSBnZXRSZWxhdGl2ZVZhbHVlKGZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHksCisJCQkJZmluYWwgU1RFTVRpbWUgdGltZSkgeworCQkJcmV0dXJuIGdldFJlbGF0aXZlVmFsdWUoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydHkKKwkJCQkJLmdldEZlYXR1cmUobnVsbCksIHRpbWUpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLmhpc3RvcnkuUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXIjZ2V0UmVsYXRpdmVWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLAorCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgZG91YmxlIGdldFJlbGF0aXZlVmFsdWUoZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCisJCQkJZmluYWwgU1RFTVRpbWUgdGltZSkgeworCQkJaGlzdG9yeVByb3ZpZGVyQWRhcHRlci5zZXRUYXJnZXQoZ2V0VGFyZ2V0KCkpOworCQkJZmluYWwgRGlzZWFzZU1vZGVsTGFiZWwgZG1sID0gKERpc2Vhc2VNb2RlbExhYmVsKSBoaXN0b3J5UHJvdmlkZXJBZGFwdGVyCisJCQkJCS5nZXRJbnN0YW5jZSh0aW1lKTsKKwkJCWZpbmFsIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXIgcnZwID0gKFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXIpIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJCS5hZGFwdChkbWwsIFJlbGF0aXZlVmFsdWVQcm92aWRlci5jbGFzcyk7CisJCQlyZXR1cm4gcnZwLmdldFJlbGF0aXZlVmFsdWUoZmVhdHVyZSk7CisJCX0gLy8gZ2V0UmVsYXRpdmVWYWx1ZQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5oaXN0b3J5LlJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIjZ2V0QWxsSGlzdG9yaWNSZWxhdGl2ZVZhbHVlcyhvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBkb3VibGVbXSBnZXRBbGxIaXN0b3JpY1JlbGF0aXZlVmFsdWVzKAorCQkJCWZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpIHsKKwkJCXJldHVybiBnZXRBbGxIaXN0b3JpY1JlbGF0aXZlVmFsdWVzKChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BlcnR5CisJCQkJCS5nZXRGZWF0dXJlKG51bGwpKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5oaXN0b3J5LlJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyI2dldEFsbEhpc3RvcmljUmVsYXRpdmVWYWx1ZXMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgZG91YmxlW10gZ2V0QWxsSGlzdG9yaWNSZWxhdGl2ZVZhbHVlcygKKwkJCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQkJaGlzdG9yeVByb3ZpZGVyQWRhcHRlci5zZXRUYXJnZXQoZ2V0VGFyZ2V0KCkpOworCQkJZmluYWwgSWRlbnRpZmlhYmxlW10gaGlzdG9yaWNWYWx1ZXMgPSBoaXN0b3J5UHJvdmlkZXJBZGFwdGVyCisJCQkJCS5nZXRBbGxIaXN0b3JpY0luc3RhbmNlcygpOworCQkJZmluYWwgZG91YmxlW10gcmV0VmFsdWUgPSBuZXcgZG91YmxlW2hpc3RvcmljVmFsdWVzLmxlbmd0aF07CisKKwkJCWludCBpID0gMDsKKwkJCWZvciAoSWRlbnRpZmlhYmxlIGlkZW50aWZpYWJsZSA6IGhpc3RvcmljVmFsdWVzKSB7CisJCQkJZmluYWwgRGlzZWFzZU1vZGVsTGFiZWwgZG1sID0gKERpc2Vhc2VNb2RlbExhYmVsKSBpZGVudGlmaWFibGU7CisJCQkJZmluYWwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciBydnAgPSAoUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcikgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkJCS5hZGFwdChkbWwsIFJlbGF0aXZlVmFsdWVQcm92aWRlci5jbGFzcyk7CisJCQkJcmV0VmFsdWVbaSsrXSA9IHJ2cC5nZXRSZWxhdGl2ZVZhbHVlKGZlYXR1cmUpOworCQkJfSAvLyBmb3IgZWFjaCBJZGVudGlmaWFibGUKKworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGdldEFsbEhpc3RvcmljUmVsYXRpdmVWYWx1ZXMKKwkJCisKKwkJLyoqCisJCSAqIAorCQkgKiBAcGFyYW0gcHJvcGVydHkKKwkJICogQHBhcmFtIHRpbWVSYW5nZQorCQkgKiBAcmV0dXJuCisJCSAqLworCQlwdWJsaWMgZG91YmxlW10gZ2V0SGlzdG9yaWNJbnN0YW5jZXMoZmluYWwgSXRlbVByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSwgU1RFTVRpbWVbXSB0aW1lUmFuZ2UpIHsKKwkJCWRvdWJsZVtdIGFsbFZhbHVlcyA9IGdldEFsbEhpc3RvcmljUmVsYXRpdmVWYWx1ZXMocHJvcGVydHkpOworCQkJZG91YmxlW10gcmV0VmFsID0gbmV3IGRvdWJsZVt0aW1lUmFuZ2UubGVuZ3RoXTsKKwkJCVN5c3RlbS5hcnJheWNvcHkoYWxsVmFsdWVzLCAwLCByZXRWYWwsIDAsIHRpbWVSYW5nZS5sZW5ndGgpOworCQkJcmV0dXJuIHJldFZhbDsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5oaXN0b3J5LlJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyI2dldEVhcmxpZXN0VGltZVZhbHVlKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU1RFTVRpbWUgZ2V0RWFybGllc3RUaW1lVmFsdWUoKSB7CisJCQloaXN0b3J5UHJvdmlkZXJBZGFwdGVyLnNldFRhcmdldChnZXRUYXJnZXQoKSk7CisJCQlyZXR1cm4gaGlzdG9yeVByb3ZpZGVyQWRhcHRlci5nZXRFYXJsaWVzdFRpbWVWYWx1ZSgpOworCQl9IC8vIGdldEVhcmxpZXN0VGltZVZhbHVlCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLmhpc3RvcnkuUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXIjZ2V0QWxsSGlzdG9yaWNUaW1lVmFsdWVzKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU1RFTVRpbWVbXSBnZXRBbGxIaXN0b3JpY1RpbWVWYWx1ZXMoKSB7CisJCQloaXN0b3J5UHJvdmlkZXJBZGFwdGVyLnNldFRhcmdldChnZXRUYXJnZXQoKSk7CisJCQlyZXR1cm4gaGlzdG9yeVByb3ZpZGVyQWRhcHRlci5nZXRBbGxIaXN0b3JpY1RpbWVWYWx1ZXMoKTsKKwkJfSAvLyBnZXRBbGxIaXN0b3JpY1RpbWVWYWx1ZXMKKworCX0gLy8gRGlzZWFzZU1vZGVsTGFiZWxSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyCisKK30gLy8gU3RhbmRhcmRSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1N0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1N0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTFmYTMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzMyIEBACisvLyBTdGFuZGFyZFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLlByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnV0aWwuU3RhbmRhcmRBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgZmFjdG9yeSBmb3IgdGhpcyBtb2RlbCB0aGF0IGNyZWF0ZXMKKyAqIHtAbGluayBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJ9J3MgZm9yIGNsYXNzZXMgaW4gdGhlIG1vZGVsLgorICovCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCVN0YW5kYXJkQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzCisJICogYWRhcHRlciBmYWN0b3J5LgorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LgorCSAqLworCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKKworCS8qKgorCSAqIFRoaXMgZmFjdG9yeSBpcyB1c2VkIHRvIGNyZWF0ZSBpdGVtIHByb3ZpZGVycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3Nlcy4KKwkgKiBUaGUgaXRlbSBwcm92aWRlcnMgYXJlIHVzZWQgYXMgcHJvcGVydHkgc291cmNlcyB0byBnZXQgdGhlIHByb3BlcnRpZXMKKwkgKiB0aGF0IGNhbiBoYXZlIHJlbGF0aXZlIHZhbHVlcy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdGFuZGFyZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGl0ZW1Qcm92aWRlckZhY3Rvcnk7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBTdGFuZGFyZFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgeworCQlzdXBlcigpOworCQlSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGRBZGFwdGVyRmFjdG9yeSh0aGlzKTsKKwl9IC8vIFN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUge0BsaW5rIFN0YW5kYXJkU3dpdGNofSBpbnN0YW5jZSBpbiB0aGUKKwkgKiBwYXJlbnQge0BsaW5rIFN0YW5kYXJkQWRhcHRlckZhY3Rvcnl9IGZvciBhbGwgY2FzZXMgZm9yIGNsYXNzZXMgZGVyaXZlZAorCSAqIGZyb20ge0BsaW5rIERpc2Vhc2VNb2RlbExhYmVsfSAoZS5nLiwge0BsaW5rIFNJTGFiZWx9LCB7QGxpbmsgU0lSTGFiZWx9LAorCSAqIHtAbGluayBTRUlSTGFiZWx9KS4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC51dGlsLlN0YW5kYXJkQWRhcHRlckZhY3RvcnkjY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWxBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbEFkYXB0ZXIoKSB7CisJCS8vIEl0IHNlZW1zIHRoYXQgeW91IGNhbid0IGhhdmUgc2luZ2xldG9uIGFkYXB0ZXJzIHRoYXQgcHJvdmlkZQorCQkvLyBiZWhhdmlvcmFsIGV4dGVuc2lvbnMgd2l0aG91dCBleHBsaWNpdGx5IHNldHRpbmcgdGhlIHRhcmdldAorCQkvLyBlYWNoIHRpbWUgaXQgaXMgYWRhcHRlZAorCQlyZXR1cm4gbmV3IERpc2Vhc2VNb2RlbExhYmVsUmVsYXRpdmVWYWx1ZVByb3ZpZGVyKCk7CisJfSAvLyBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbEFkYXB0ZXIKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUge0BsaW5rIFN0YW5kYXJkU3dpdGNofSBpbnN0YW5jZSBpbiB0aGUKKwkgKiBwYXJlbnQge0BsaW5rIFN0YW5kYXJkQWRhcHRlckZhY3Rvcnl9IGZvciBhbGwgY2FzZXMgZm9yIGNsYXNzZXMgZGVyaXZlZAorCSAqIGZyb20ge0BsaW5rIERpc2Vhc2VNb2RlbExhYmVsVmFsdWV9IChlLmcuLCB7QGxpbmsgU0lMYWJlbFZhbHVlfSwKKwkgKiB7QGxpbmsgU0lSTGFiZWxWYWx1ZX0sIHtAbGluayBTRUlSTGFiZWxWYWx1ZX0pLgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnV0aWwuU3RhbmRhcmRBZGFwdGVyRmFjdG9yeSNjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbFZhbHVlQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUFkYXB0ZXIoKSB7CisJCS8vIEl0IHNlZW1zIHRoYXQgeW91IGNhbid0IGhhdmUgc2luZ2xldG9uIGFkYXB0ZXJzIHRoYXQgcHJvdmlkZQorCQkvLyBiZWhhdmlvcmFsIGV4dGVuc2lvbnMgd2l0aG91dCBleHBsaWNpdGx5IHNldHRpbmcgdGhlIHRhcmdldAorCQkvLyBlYWNoIHRpbWUgaXQgaXMgYWRhcHRlZAorCQlyZXR1cm4gbmV3IERpc2Vhc2VNb2RlbExhYmVsVmFsdWVSZWxhdGl2ZVZhbHVlUHJvdmlkZXIoKTsKKwl9IC8vIGNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWVBZGFwdGVyCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfSAvLyBhZGRMaXN0ZW5lcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXIjZmlyZU5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKKwkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCX0KKwl9IC8vIGZpcmVOb3RpZnlDaGFuZ2VkCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfSAvLyByZW1vdmVMaXN0ZW5lcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5I2dldFJvb3RBZGFwdGVyRmFjdG9yeSgpCisJICovCisJcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeQorCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKKwl9IC8vIGdldFJvb3RBZGFwdGVyRmFjdG9yeQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5I3NldFBhcmVudEFkYXB0ZXJGYWN0b3J5KG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3RvcnkpCisJICovCisJcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoCisJCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7CisJCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKKwl9IC8vIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC51dGlsLlN0YW5kYXJkQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gUmVsYXRpdmVWYWx1ZVByb3ZpZGVyLmNsYXNzCisJCQkJfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9IC8vIGlzRmFjdG9yeUZvclR5cGUKKworCS8qKgorCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlI2Rpc3Bvc2UoKQorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCS8vIE5vdGhpbmcKKwl9IC8vIGRpc3Bvc2UKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoZSBSZWxhdGl2ZSBWYWx1ZSBQcm92aWRlciBBZGFwdGVyIEZhY3RvcnkKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBnZXRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFOworCX0gLy8gZ2V0UmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoZSBTdGFuZGFyZCBJdGVtIFByb3ZpZGVyIGZhY3RvcnkuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBnZXRJdGVtUHJvdmlkZXJGYWN0b3J5KCkgeworCQlpZiAoaXRlbVByb3ZpZGVyRmFjdG9yeSA9PSBudWxsKSB7CisJCQlpdGVtUHJvdmlkZXJGYWN0b3J5ID0gbmV3IFN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3ZpZGVyRmFjdG9yeTsKKwl9IC8vIGdldEl0ZW1Qcm92aWRlckZhY3RvcnkKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYSBSZWxhdGl2ZSBWYWx1ZSBQcm92aWRlciBmb3IgRGlzZWFzZU1vZGVsTGFiZWwgaW5zdGFuY2VzLgorCSAqIEl0IHByb3ZpZGVzIGEgY29sbGVjdGlvbiBvZiB0aGUgcHJvcGVydGllcyB0aGF0IGNhbiBoYXZlIHJlbGF0aXZlIHZhbHVlcworCSAqIGFuZCB3aWxsIGNvbXB1dGUgdGhlIHZhbHVlIGJldHdlZW4gMC4wIGFuZCAxLjAgZm9yIGFueSBvZiB0aG9zZQorCSAqIHByb3BlcnRpZXMuCisJICogCisJICogQHNlZSBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlUmVsYXRpdmVWYWx1ZVByb3ZpZGVyCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBEaXNlYXNlTW9kZWxMYWJlbFJlbGF0aXZlVmFsdWVQcm92aWRlciBleHRlbmRzCisJCQlSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciNnZXRQcm9wZXJ0aWVzKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydGllcygpIHsKKwkJCWZpbmFsIERpc2Vhc2VNb2RlbExhYmVsIGRtbCA9IChEaXNlYXNlTW9kZWxMYWJlbCkgZ2V0VGFyZ2V0KCk7CisJCQlmaW5hbCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIgcnZwID0gKFJlbGF0aXZlVmFsdWVQcm92aWRlcikgZ2V0UmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKQorCQkJCQkuYWRhcHQoZG1sLmdldEN1cnJlbnRWYWx1ZSgpLCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIuY2xhc3MpOworCQkJcmV0dXJuIHJ2cC5nZXRQcm9wZXJ0aWVzKCk7CisJCX0gLy8gZ2V0UHJvcGVydGllcworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyI2dldFJlbGF0aXZlVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgZG91YmxlIGdldFJlbGF0aXZlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJCWZpbmFsIERpc2Vhc2VNb2RlbExhYmVsIGRtbCA9IChEaXNlYXNlTW9kZWxMYWJlbCkgZ2V0VGFyZ2V0KCk7CisJCQlmaW5hbCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIgcnZwID0gKFJlbGF0aXZlVmFsdWVQcm92aWRlcikgZ2V0UmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKQorCQkJCQkuYWRhcHQoZG1sLmdldEN1cnJlbnRWYWx1ZSgpLCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIuY2xhc3MpOworCQkJcmV0dXJuIHJ2cC5nZXRSZWxhdGl2ZVZhbHVlKGZlYXR1cmUpOworCQl9IC8vIGdldFJlbGF0aXZlVmFsdWUKKwkJCisJCS8qKgorCQkgKiB0aGlzIGhlbHBlciBtZXRob2QgcmV0dXJucyB0aGUgYWJzb2x1dGUgdG90YWwgcG9wdWxhdGlvbi4KKwkJICogSXQgaXMgcmVxdWlyZWQgd2hlbmV2ZXIgd2UgbmVlZCB0byBzd2l0Y2ggYmV0d2VlbiByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgdmFsdWVzCisJCSAqIEByZXR1cm4gdGhlIHRvdGFsIGN1cnJlbnQgcG9wdWxhdGlvbiBjb3VudCAoYWJzb2x1dGUpCisJCSAqLworCQlwdWJsaWMgZG91YmxlIGdldERlbm9taW5hdG9yKGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbCBkbWwgPSAoRGlzZWFzZU1vZGVsTGFiZWwpIGdldFRhcmdldCgpOworCQkJRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBkbWx2ID0gKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSlkbWwuZ2V0Q3VycmVudFZhbHVlKCk7CisJCQkvL2ZpbmFsIGRvdWJsZSBwb3B1bGF0aW9uQ291bnQgPSBkbWx2LmdldFBvcHVsYXRpb25Db3VudCgpOworCQkJcmV0dXJuIGRtbHYuZ2V0UG9wdWxhdGlvbkNvdW50KCk7CisJCX0KKwkJCisJCQorCQkKKworCX0gLy8gRGlzZWFzZU1vZGVsTGFiZWxSZWxhdGl2ZVZhbHVlUHJvdmlkZXIKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYSBSZWxhdGl2ZSBWYWx1ZSBQcm92aWRlciBmb3IgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZQorCSAqIGluc3RhbmNlcy4gSXQgcHJvdmlkZXMgYSBjb2xsZWN0aW9uIG9mIHRoZSBwcm9wZXJ0aWVzIHRoYXQgY2FuIGhhdmUKKwkgKiByZWxhdGl2ZSB2YWx1ZXMgYW5kIHdpbGwgY29tcHV0ZSB0aGUgdmFsdWUgYmV0d2VlbiAwLjAgYW5kIDEuMCBmb3IgYW55IG9mCisJICogdGhvc2UgcHJvcGVydGllcy4KKwkgKiA8cD4KKwkgKiBUaGUge0BsaW5rIERpc2Vhc2VNb2RlbExhYmVsVmFsdWVSZWxhdGl2ZVZhbHVlUHJvdmlkZXJ9IGluc3RhbmNlIHRoYXQgd2UKKwkgKiBjcmVhdGUgaGVyZSBmaWx0ZXJzIG91dCB0aGUgcHJvcGVydGllcyB0aGF0IGFyZSBub3QgcmVsYXRpdmUgYW5kIGNhbgorCSAqIHJlZmxlY3RpdmVseSBjb21wdXRlIHRoZSByZWxhdGl2ZSB2YWx1ZSwgd2l0aCByZXNwZWN0IHRvIHRoZSBwb3B1bGF0aW9uCisJICogY291bnQgZm9yIHRoZSBkaXNlYXNlIG1vZGVsIGxhYmVsIHZhbHVlLCBmb3IgdGhlIHJlbWFpbmluZyBwcm9wZXJ0aWVzLiBJZgorCSAqIGEgbmV3IHN1Yi1jbGFzcyBvZiB7QGxpbmsgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZX0gaXMgaW50cm9kdWNlZCB0aGF0IGhhcworCSAqIG90aGVyIG5vbi1yZWxhdGl2ZSBwcm9wZXJ0aWVzLCB0aGV5IHdvdWxkIG5vdCBiZSBmaWx0ZXJlZCBvdXQgYnkgdGhpcworCSAqIHtAbGluayBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJ9IHNvIGEgY29ycmVzcG9uZGluZyBzdWItY2xhc3Mgb2YKKwkgKiB7QGxpbmsgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZVJlbGF0aXZlVmFsdWVQcm92aWRlcn0gd291bGQgbmVlZCB0byBiZQorCSAqIGRlZmluZWQgdGhhdCBpbXBsZW1lbnRlZCB7QGxpbmsgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyI2dldFByb3BlcnRpZXMoKX0KKwkgKiBzdWNoIHRoYXQgaXQgZmlyc3QgY2FsbGVkIGl0cyBzdXBlci1jbGFzcworCSAqIDxjb2RlPnN1cGVyLmdldFByb3BlcnRpZXM8L2NvZGU+IChpLmUuLAorCSAqIHtAbGluayBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlUmVsYXRpdmVWYWx1ZVByb3ZpZGVyI2dldFByb3BlcnRpZXMoKX0pIHRvCisJICogZ2V0IHRoZSBsaXN0IG9mIGZpbHRlcmVkIHByb3BlcnRpZXMuIFRoZW4sIGl0IHdvdWxkIG5lZWQgdG8gcmVtb3ZlIGFueQorCSAqIG5vbi1yZWxhdGl2ZSBwcm9wZXJ0aWVzIHRoYXQgaXQga25vd3MgYWJvdXQgZnJvbSB0aGF0IGxpc3QuCisJICogPHA+CisJICogVGhlcmUgd291bGQgcHJvYmFibHkgYmUgbm8gbmVlZCBmb3IgdGhlIG5ldyBjbGFzcyB0byBvdmVycmlkZQorCSAqIHtAbGluayBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlUmVsYXRpdmVWYWx1ZVByb3ZpZGVyI2dldFJlbGF0aXZlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlKX0KKwkgKiBhcyB0aGUgcmVsYXRpdmUgdmFsdWVzIGFyZSBjb21wdXRlZCBzdWNoIHRoYXQgdGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZXMgYXJlCisJICogb2J0YWluZWQgcmVmbGV4aXZlbHksIHNvIHRoZXkgc2hvdWxkIGJlIGZvdW5kLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgbmV3CisJICogdmFsdWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgcG9wdWxhdGlvbiBjb3VudCAoaS5lLiwKKwkgKiB7QGxpbmsgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSNnZXRQb3B1bGF0aW9uQ291bnQoKX0pLiBJZiB0aGV5J3JlCisJICogcmVsYXRpdmUgdG8gc29tZSBvdGhlciB2YWx1ZSB0aGVuIGFuIG92ZXJyaWRlIHdvdWxkIGJlIG5lY2Vzc2FyeS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIERpc2Vhc2VNb2RlbExhYmVsVmFsdWVSZWxhdGl2ZVZhbHVlUHJvdmlkZXIgZXh0ZW5kcworCQkJUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIFJlbGF0aXZlVmFsdWVQcm92aWRlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXIjZ2V0UHJvcGVydGllcygpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnRpZXMoKSB7CisJCQlmaW5hbCBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+KCk7CisJCQlmaW5hbCBTdGFuZGFyZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGl0ZW1Qcm92aWRlckZhY3RvcnkgPSBnZXRJdGVtUHJvdmlkZXJGYWN0b3J5KCk7CisJCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGRtbHYgPSAoRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSkgZ2V0VGFyZ2V0KCk7CisJCQlmaW5hbCBJSXRlbVByb3BlcnR5U291cmNlIHByb3BlcnR5U291cmNlID0gKElJdGVtUHJvcGVydHlTb3VyY2UpIGl0ZW1Qcm92aWRlckZhY3RvcnkKKwkJCQkJLmFkYXB0KGRtbHYsIFByb3BlcnR5U291cmNlLmNsYXNzKTsKKwkJCWZpbmFsIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BlcnRpZXMgPSBwcm9wZXJ0eVNvdXJjZQorCQkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhudWxsKTsKKwkJCS8vIFRoZSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIGluY2x1ZGVzIG9uZXMgdGhhdCBkbyBub3QgaGF2ZQorCQkJLy8gcmVsYXRpdmUgdmFsdWVzLiBXZSBmaWx0ZXIgdGhvc2Ugb3V0IGhlcmUgYW5kIHJldHVybiB0aGUgcmVzdC4KKwkJCWZvciAoSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA6IHByb3BlcnRpZXMpIHsKKwkJCQkvLyBEb2VzIHRoaXMgcHJvcGVydHkgaGF2ZSBhIHJlbGF0aXZlIHZhbHVlPworCQkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZGVzY3JpcHRvcgorCQkJCQkJLmdldEZlYXR1cmUobnVsbCk7CisJCQkJZmluYWwgaW50IGZlYXR1cmVJZCA9IGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCk7CisJCQkJCisJCQkJCisJCQkJLy8gbmV3CisJCQkJaWYgKCEoZmVhdHVyZUlkID09IFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19ESVNFQVNFX0RFQVRIUyAKKwkJCQkJCXx8IGZlYXR1cmVJZCA9PSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fUE9QVUxBVElPTl9DT1VOVCkpIHsKKwkJCQkJLy8gWWVzCisJCQkJCXJldFZhbHVlLmFkZChkZXNjcmlwdG9yKTsKKwkJCQl9IC8vIGlmIGhhcyByZWxhdGl2ZSB2YWx1ZQorCQkJCS8vIE9sZAorCQkJCS8qCisJCQkJaWYgKCEoZmVhdHVyZUlkID09IFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19CSVJUSFMKKwkJCQkJCXx8IGZlYXR1cmVJZCA9PSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fREVBVEhTCisJCQkJCQl8fCBmZWF0dXJlSWQgPT0gU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfX0RJU0VBU0VfREVBVEhTIHx8IGZlYXR1cmVJZCA9PSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fUE9QVUxBVElPTl9DT1VOVCkpIHsKKwkJCQkJLy8gWWVzCisJCQkJCXJldFZhbHVlLmFkZChkZXNjcmlwdG9yKTsKKwkJCQl9IC8vIGlmIGhhcyByZWxhdGl2ZSB2YWx1ZQorCQkJCSovCisJCQkJCisJCQl9IC8vIGZvcgorCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGdldFByb3BlcnRpZXMKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyI2dldFJlbGF0aXZlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlKQorCQkgKi8KKwkJcHVibGljIGRvdWJsZSBnZXRSZWxhdGl2ZVZhbHVlKGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGRtbHYgPSAoRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSkgZ2V0VGFyZ2V0KCk7CisJCQlmaW5hbCBkb3VibGUgc3RhdGVDb3VudCA9ICgoRG91YmxlKSBkbWx2LmVHZXQoZmVhdHVyZSkpCisJCQkJCS5kb3VibGVWYWx1ZSgpOworCQkJZmluYWwgZG91YmxlIHBvcHVsYXRpb25Db3VudCA9IGRtbHYuZ2V0UG9wdWxhdGlvbkNvdW50KCk7CisJCQkvLyBTRUQgRml4IDcvNi8xMC4gU2V0IHRvIDAgaWYgcG9wdWxhdGlvbiBpcyBsZXNzIHRoYW4gMSB0byBhdm9pZCBkaXNwbGF5aW5nIGludGVuc2UgY29sb3JzIHdoZW4gCisJCQkvLyB0aGVyZSdzIGEgdGlueSBwb3B1bGF0aW9uIG9uIGEgbm9kZS4KKwkJCWZpbmFsIGRvdWJsZSByZXRWYWx1ZSA9IHBvcHVsYXRpb25Db3VudCA8IDEuMCA/IDAuMAorCQkJCQk6IChzdGF0ZUNvdW50IC8gcG9wdWxhdGlvbkNvdW50KTsKKwkJCXJldHVybiByZXRWYWx1ZTsKKwkJfSAvLyBnZXRSZWxhdGl2ZVZhbHVlCisJCQorCQkvKioKKwkJICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZGVub21pbmF0b3Igb3Igc2NhbGUgdXNlZCB0byBjb252ZXJ0IHRvIHJlbGF0aXZlCisJCSAqIHZhbHVlcyBpbiB0aGUgcmFuZ2UgMC0xLiBGb3IgZXhhbXBsZSwgaW4gYW4gRXBpZGVtaWMgQ29tcGFydG1lbnQgbW9kZWwKKwkJICogdGhlIHN0YXRlIHZhbHVlcyBhcmUgbm9ybWFsaXplZCBieSBwb3B1bGF0aW9uLgorCQkgKiBJdCBpcyByZXF1aXJlZCB3aGVuZXZlciB3ZSBuZWVkIHRvIHN3aXRjaCBiZXR3ZWVuIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSB2YWx1ZXMKKwkJICogb3IgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgbGFiZWwgc2hvd2luZyB0aGUgbWF4aW11bSBzY2FsZSBmb3IgYW55IHJlbGF0aXZlIHZhbHVlLgorCQkgKiBAcmV0dXJuIHRoZSBkZW5vbWluYXRvciBvciBzY2FsZSB1c2VkIHRvIG5vcm1hbGl6ZSB0aGUgcmVsYXRpdmUgdmFsdWUKKwkJICovCisJCXB1YmxpYyBkb3VibGUgZ2V0RGVub21pbmF0b3IoZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJCWZpbmFsIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZG1sdiA9IChEaXNlYXNlTW9kZWxMYWJlbFZhbHVlKSBnZXRUYXJnZXQoKTsKKwkJCS8vZmluYWwgZG91YmxlIHBvcHVsYXRpb25Db3VudCA9IGRtbHYuZ2V0UG9wdWxhdGlvbkNvdW50KCk7CisJCQlyZXR1cm4gZG1sdi5nZXRQb3B1bGF0aW9uQ291bnQoKTsKKwkJfQorCQkKKwl9IC8vIERpc2Vhc2VNb2RlbExhYmVsVmFsdWVSZWxhdGl2ZVZhbHVlUHJvdmlkZXIKK30gLy8gU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWU4MTA3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNTYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWx9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkR2FpblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgR2FpbiBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEdhaW5Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxfZ2Fpbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxfZ2Fpbl9mZWF0dXJlIiwgIl9VSV9TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RBTkRBUkRfU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19HQUlOLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwpb2JqZWN0KS5nZXREaXNlYXNlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1N0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwpb2JqZWN0KS5nZXREaXNlYXNlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1N0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwuY2xhc3MpKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0dBSU46CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1N0b2NoYXN0aWNEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1N0b2NoYXN0aWNEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2ExNTJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTg2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNEaXNlYXNlTW9kZWx9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIKKwlleHRlbmRzIERpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdG9jaGFzdGljRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRTZWVkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQkvLyBhZGRSYW5kb21HZW5lcmF0b3JQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9yc0dlbihPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZFNlZWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFJhbmRvbUdlbmVyYXRvclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisJCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlZWQgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZWVkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbF9zZWVkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1N0b2NoYXN0aWNEaXNlYXNlTW9kZWxfc2VlZF9mZWF0dXJlIiwgIl9VSV9TdG9jaGFzdGljRGlzZWFzZU1vZGVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fU0VFRCwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJhbmRvbSBHZW5lcmF0b3IgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRSYW5kb21HZW5lcmF0b3JQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TdG9jaGFzdGljRGlzZWFzZU1vZGVsX3JhbmRvbUdlbmVyYXRvcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TdG9jaGFzdGljRGlzZWFzZU1vZGVsX3JhbmRvbUdlbmVyYXRvcl9mZWF0dXJlIiwgIl9VSV9TdG9jaGFzdGljRGlzZWFzZU1vZGVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUiwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwpb2JqZWN0KS5nZXREaXNlYXNlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1N0b2NoYXN0aWNEaXNlYXNlTW9kZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbC5jbGFzcykpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fU0VFRDoKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUjoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODcyOTdjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbH0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBTRUlSSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgVGhpcyByZXR1cm5zIGRpc2Vhc2UuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbTE2L2Rpc2Vhc2UiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKFN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbClvYmplY3QpLmdldFVSSSgpLmxhc3RTZWdtZW50KCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsKW9iamVjdCkuZ2V0RGlzZWFzZU5hbWUoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9TdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisJCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1NWM2NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1N0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlcjsKKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWw7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbH0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgU0lJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFRoaXMgcmV0dXJucyBkaXNlYXNlLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9jdXN0b20xNi9kaXNlYXNlIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChTdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsKW9iamVjdCkuZ2V0VVJJKCkubGFzdFNlZ21lbnQoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9TdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisJCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKFN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwpb2JqZWN0KS5nZXREaXNlYXNlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1N0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGY1NDVlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlcjsKKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgU0lSSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBUaGlzIHJldHVybnMgZGlzZWFzZS5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvY3VzdG9tMTYvZGlzZWFzZSIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChTdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbClvYmplY3QpLmdldERpc2Vhc2VOYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwpb2JqZWN0KS5nZXREaXNlYXNlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1N0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX1N0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisJCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDJlYmY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIxOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyIGV4dGVuZHMgU0VJUkl0ZW1Qcm92aWRlcgorCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZFNlZWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCS8vYWRkUmFuZG9tR2VuZXJhdG9yUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRHYWluUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnNHZW4oT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRTZWVkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRSYW5kb21HZW5lcmF0b3JQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZEdhaW5Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCQorCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZWVkIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VlZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1N0b2NoYXN0aWNEaXNlYXNlTW9kZWxfc2VlZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TdG9jaGFzdGljRGlzZWFzZU1vZGVsX3NlZWRfZmVhdHVyZSIsICJfVUlfU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1NFRUQsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSYW5kb20gR2VuZXJhdG9yIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkUmFuZG9tR2VuZXJhdG9yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbF9yYW5kb21HZW5lcmF0b3JfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbF9yYW5kb21HZW5lcmF0b3JfZmVhdHVyZSIsICJfVUlfU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1IsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBHYWluIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkR2FpblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1N0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbF9nYWluX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1N0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbF9nYWluX2ZlYXR1cmUiLCAiX1VJX1N0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVEFOREFSRF9TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX0dBSU4sCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwpb2JqZWN0KS5nZXRVUkkoKS5sYXN0U2VnbWVudCgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1N0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCSBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBub3RpZmljYXRpb24KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsLmNsYXNzKSkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TRUlSX0RJU0VBU0VfTU9ERUxfX1NFRUQ6CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NFSVJfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUjoKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMX19HQUlOOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1N0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZjZlNTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIzNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0lEaXNlYXNlTW9kZWx9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyIGV4dGVuZHMgU0lJdGVtUHJvdmlkZXIKKwkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5CisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkU2VlZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJLy9hZGRSYW5kb21HZW5lcmF0b3JQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZEdhaW5Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9yc0dlbihPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZFNlZWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFJhbmRvbUdlbmVyYXRvclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkR2FpblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisJCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlZWQgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZWVkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbF9zZWVkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1N0b2NoYXN0aWNEaXNlYXNlTW9kZWxfc2VlZF9mZWF0dXJlIiwgIl9VSV9TdG9jaGFzdGljRGlzZWFzZU1vZGVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fU0VFRCwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJhbmRvbSBHZW5lcmF0b3IgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRSYW5kb21HZW5lcmF0b3JQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TdG9jaGFzdGljRGlzZWFzZU1vZGVsX3JhbmRvbUdlbmVyYXRvcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TdG9jaGFzdGljRGlzZWFzZU1vZGVsX3JhbmRvbUdlbmVyYXRvcl9mZWF0dXJlIiwgIl9VSV9TdG9jaGFzdGljRGlzZWFzZU1vZGVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fUkFORE9NX0dFTkVSQVRPUiwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEdhaW4gZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRHYWluUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsX2dhaW5fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsX2dhaW5fZmVhdHVyZSIsICJfVUlfU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUQU5EQVJEX1NUT0NIQVNUSUNfRElTRUFTRV9NT0RFTF9fR0FJTiwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwpb2JqZWN0KS5nZXRVUkkoKS5sYXN0U2VnbWVudCgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1N0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0R2VuKE9iamVjdCBvYmplY3QpIHsKKwkJU3RyaW5nIGxhYmVsID0gKChTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwpb2JqZWN0KS5nZXREaXNlYXNlTmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1N0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9TdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5vdGlmaWNhdGlvbgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsLmNsYXNzKSkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19TRUVEOgorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19SQU5ET01fR0VORVJBVE9SOgorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSV9ESVNFQVNFX01PREVMX19HQUlOOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I2MjVlZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1N0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIxOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWw7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbH0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSXRlbVByb3ZpZGVyIGV4dGVuZHMgU0lSSXRlbVByb3ZpZGVyCisJCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRTZWVkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQkvL2FkZFJhbmRvbUdlbmVyYXRvclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkR2FpblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzR2VuKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkU2VlZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkUmFuZG9tR2VuZXJhdG9yUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRHYWluUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VlZCBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFNlZWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TdG9jaGFzdGljRGlzZWFzZU1vZGVsX3NlZWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbF9zZWVkX2ZlYXR1cmUiLCAiX1VJX1N0b2NoYXN0aWNEaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19TRUVELAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuSU5URUdSQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmFuZG9tIEdlbmVyYXRvciBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFJhbmRvbUdlbmVyYXRvclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1N0b2NoYXN0aWNEaXNlYXNlTW9kZWxfcmFuZG9tR2VuZXJhdG9yX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1N0b2NoYXN0aWNEaXNlYXNlTW9kZWxfcmFuZG9tR2VuZXJhdG9yX2ZlYXR1cmUiLCAiX1VJX1N0b2NoYXN0aWNEaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19SQU5ET01fR0VORVJBVE9SLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgR2FpbiBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEdhaW5Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxfZ2Fpbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxfZ2Fpbl9mZWF0dXJlIiwgIl9VSV9TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RBTkRBUkRfU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19HQUlOLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwpb2JqZWN0KS5nZXRVUkkoKS5sYXN0U2VnbWVudCgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1N0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsLmNsYXNzKSkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TSVJfRElTRUFTRV9NT0RFTF9fU0VFRDoKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUxfX1JBTkRPTV9HRU5FUkFUT1I6CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJUl9ESVNFQVNFX01PREVMX19HQUlOOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC91dGlsL1N0YW5kYXJkQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3V0aWwvU3RhbmRhcmRBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMjdlYWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC91dGlsL1N0YW5kYXJkQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEwNzYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnV0aWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvL2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY05vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbFN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0k7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJRGlzZWFzZU1vZGVsU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJSW5mZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRJbmZlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLiBJdAorICogcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUKKyAqIG1vZGVsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFN0YW5kYXJkUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0YW5kYXJkQWRhcHRlckZhY3RvcnkoKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4KKwkgKiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZgorCSAqIHRoZSBtb2RlbC4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7CisJCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RhbmRhcmRTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgU3RhbmRhcmRTd2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbChEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWwoRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVEZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsKERldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZURldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEaXNlYXNlTW9kZWwoRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEaXNlYXNlTW9kZWxMYWJlbChEaXNlYXNlTW9kZWxMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEaXNlYXNlTW9kZWxMYWJlbFZhbHVlKERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEaXNlYXNlTW9kZWxTdGF0ZShEaXNlYXNlTW9kZWxTdGF0ZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGlzZWFzZU1vZGVsU3RhdGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJbmZlY3RvcihJbmZlY3RvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlSW5mZWN0b3JBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTRUlSKFNFSVIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNFSVJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTRUlSTGFiZWwoU0VJUkxhYmVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTRUlSTGFiZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTRUlSTGFiZWxWYWx1ZShTRUlSTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU0VJUkxhYmVsVmFsdWVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTSShTSSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU0lBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTSURpc2Vhc2VNb2RlbFN0YXRlKFNJRGlzZWFzZU1vZGVsU3RhdGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNJRGlzZWFzZU1vZGVsU3RhdGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTSUluZmVjdG9yKFNJSW5mZWN0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNJSW5mZWN0b3JBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTSUxhYmVsKFNJTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNJTGFiZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTSUxhYmVsVmFsdWUoU0lMYWJlbFZhbHVlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTSUxhYmVsVmFsdWVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTSVIoU0lSIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTSVJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTSVJMYWJlbChTSVJMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU0lSTGFiZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTSVJMYWJlbFZhbHVlKFNJUkxhYmVsVmFsdWUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNJUkxhYmVsVmFsdWVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbChTdGFuZGFyZERpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU3RhbmRhcmREaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlKFN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdGFuZGFyZEluZmVjdG9yKFN0YW5kYXJkSW5mZWN0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0YW5kYXJkSW5mZWN0b3JBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbChTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwoU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsKFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTYW5pdHlDaGVja2VyKFNhbml0eUNoZWNrZXIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNhbml0eUNoZWNrZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJbnRlZ3JhdGlvbkxhYmVsKEludGVncmF0aW9uTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUludGVncmF0aW9uTGFiZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJbnRlZ3JhdGlvbkxhYmVsVmFsdWUoSW50ZWdyYXRpb25MYWJlbFZhbHVlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVJbnRlZ3JhdGlvbkxhYmVsVmFsdWVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJbnRlZ3JhdGlvbkRlY29yYXRvcihJbnRlZ3JhdGlvbkRlY29yYXRvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlSW50ZWdyYXRpb25EZWNvcmF0b3JBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsKEFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlKEFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwoQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbChBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdG9jaGFzdGljRGlzZWFzZU1vZGVsKFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0b2NoYXN0aWNEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTSVJJbm9jdWxhdG9yKFNJUklub2N1bGF0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNJUklub2N1bGF0b3JBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsKFN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbChTdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwoU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uKEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24gb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25BZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyA8VD4gQWRhcHRlciBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGVjb3JhdG9yKERlY29yYXRvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGVjb3JhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTm9kZURlY29yYXRvcihOb2RlRGVjb3JhdG9yIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVOb2RlRGVjb3JhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTW9kaWZpYWJsZShNb2RpZmlhYmxlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVNb2RpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTGFiZWwoTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRHluYW1pY0xhYmVsKER5bmFtaWNMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRHluYW1pY0xhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTm9kZUxhYmVsKE5vZGVMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTm9kZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRHluYW1pY05vZGVMYWJlbChEeW5hbWljTm9kZUxhYmVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVEeW5hbWljTm9kZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlR3JhcGhfU2FuaXR5Q2hlY2tlcihTYW5pdHlDaGVja2VyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVHcmFwaF9TYW5pdHlDaGVja2VyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTGFiZWxWYWx1ZShMYWJlbFZhbHVlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVMYWJlbFZhbHVlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworCQkJfQorCQl9OworCisJLyoqCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSIDxlbT5TRUlSPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTRUlSQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsIDxlbT5TRUlSIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNFSVJMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbFZhbHVlIDxlbT5TRUlSIExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsVmFsdWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU0VJUkxhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVIgPGVtPlNJUjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0CisJICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQorCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTSVJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbCA8ZW0+U0lSIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU0lSTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbFZhbHVlIDxlbT5TSVIgTGFiZWwgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdAorCSAqIHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2UKKwkgKiB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbFZhbHVlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNJUkxhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbCA8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0CisJICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQorCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0YW5kYXJkRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsIDxlbT5EaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsIDxlbT5EaXNlYXNlIE1vZGVsIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCA8ZW0+U3RvY2hhc3RpYyBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdAorCSAqIHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2UKKwkgKiB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkSW5mZWN0b3IgPGVtPkluZmVjdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRJbmZlY3RvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGFuZGFyZEluZmVjdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwgPGVtPkRldGVybWluaXN0aWMgU0VJUiBEaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlIDxlbT5EaXNlYXNlIE1vZGVsIExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbFZhbHVlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIDxlbT5EaXNlYXNlIE1vZGVsIExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgPGVtPkRpc2Vhc2UgTW9kZWwgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdAorCSAqIHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2UKKwkgKiB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSA8ZW0+U0k8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdAorCSAqIHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2UKKwkgKiB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTSUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWwgPGVtPlNJIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTSUxhYmVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbFZhbHVlIDxlbT5TSSBMYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0CisJICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQorCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTSUxhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvciA8ZW0+SW5mZWN0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdAorCSAqIHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2UKKwkgKiB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbmZlY3RvckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJSW5mZWN0b3IgPGVtPlNJIEluZmVjdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lJbmZlY3RvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTSUluZmVjdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbCA8ZW0+RGV0ZXJtaW5pc3RpYyBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0CisJICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQorCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbCA8ZW0+RGV0ZXJtaW5pc3RpYyBTSSBEaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwgPGVtPlN0b2NoYXN0aWMgU0lSIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdAorCSAqIHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2UKKwkgKiB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwgPGVtPlN0b2NoYXN0aWMgU0kgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbFN0YXRlIDxlbT5EaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxTdGF0ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNlYXNlTW9kZWxTdGF0ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJRGlzZWFzZU1vZGVsU3RhdGUgPGVtPlNJIERpc2Vhc2UgTW9kZWwgU3RhdGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJRGlzZWFzZU1vZGVsU3RhdGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU0lEaXNlYXNlTW9kZWxTdGF0ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUgPGVtPkRpc2Vhc2UgTW9kZWwgU3RhdGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyIDxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2FuaXR5Q2hlY2tlckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWwgPGVtPkludGVncmF0aW9uIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUludGVncmF0aW9uTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsVmFsdWUgPGVtPkludGVncmF0aW9uIExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsVmFsdWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSW50ZWdyYXRpb25MYWJlbFZhbHVlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3IgPGVtPkludGVncmF0aW9uIERlY29yYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSW50ZWdyYXRpb25EZWNvcmF0b3JBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsIDxlbT5BZ2dyZWdhdGluZyBTSSBEaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlIDxlbT5BZ2dyZWdhdGluZyBEaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwgPGVtPkFnZ3JlZ2F0aW5nIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsIDxlbT5BZ2dyZWdhdGluZyBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsIDxlbT5TdG9jaGFzdGljIERpc2Vhc2UgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCA8ZW0+U3RvY2hhc3RpYyBEaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSSW5vY3VsYXRvciA8ZW0+U0lSIElub2N1bGF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUklub2N1bGF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU0lSSW5vY3VsYXRvckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwgPGVtPlN0b2NoYXN0aWMgUG9pc3NvbiBTSSBEaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbCA8ZW0+U3RvY2hhc3RpYyBQb2lzc29uIFNJUiBEaXNlYXNlIE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbCA8ZW0+U3RvY2hhc3RpYyBQb2lzc29uIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24gPGVtPkluZmVjdG9yIElub2N1bGF0b3IgQ29sbGVjdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLmxhbmcuQ29tcGFyYWJsZSA8ZW0+Q29tcGFyYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJZGVudGlmaWFibGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IgPGVtPkRlY29yYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0CisJICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQorCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWNvcmF0b3JBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yIDxlbT5Ob2RlIERlY29yYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0CisJICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQorCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTm9kZURlY29yYXRvckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUgPGVtPk1vZGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kaWZpYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsIDxlbT5MYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0CisJICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQorCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxhYmVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsIDxlbT5EeW5hbWljIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCisJICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUR5bmFtaWNMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbCA8ZW0+Tm9kZSBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0CisJICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQorCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVOb2RlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTm9kZUxhYmVsIDxlbT5EeW5hbWljIE5vZGUgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdAorCSAqIHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2UKKwkgKiB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTm9kZUxhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUR5bmFtaWNOb2RlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlciA8ZW0+U2FuaXR5IENoZWNrZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoX1Nhbml0eUNoZWNrZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlIDxlbT5MYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0CisJICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQorCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTGFiZWxWYWx1ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzCisJICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9IC8vIFN0YW5kYXJkQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3V0aWwvU3RhbmRhcmRTd2l0Y2guamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3V0aWwvU3RhbmRhcmRTd2l0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmQ4NWY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdXRpbC9TdGFuZGFyZFN3aXRjaC5qYXZhCkBAIC0wLDAgKzEsMTQxOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy9pbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNOb2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxTdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSURpc2Vhc2VNb2RlbFN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUluZmVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkSW5mZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0lEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlCisgKiBoaWVyYXJjaHkuIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KKyAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKKyAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0IGFuZCBwcm9jZWVkaW5nIHVwIHRoZQorICogaW5oZXJpdGFuY2UgaGllcmFyY2h5IHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLCB3aGljaCBpcyB0aGUKKyAqIHJlc3VsdCBvZiB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRTd2l0Y2g8VDE+IHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBTdGFuZGFyZFBhY2thZ2UgbW9kZWxQYWNrYWdlOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdGFuZGFyZFN3aXRjaCgpIHsKKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7CisJCQltb2RlbFBhY2thZ2UgPSBTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gdGhlRU9iamVjdAorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOworCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQxIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOworCQl9CisJCWVsc2UgeworCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7CisJCQlyZXR1cm4KKwkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPworCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6CisJCQkJCWRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUMSBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRFVEVSTUlOSVNUSUNfU0VJUl9ESVNFQVNFX01PREVMOiB7CisJCQkJRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwgZGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwgPSAoRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwoZGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNFSVIoZGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNJUihkZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU0koZGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0YW5kYXJkRGlzZWFzZU1vZGVsKGRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEaXNlYXNlTW9kZWwoZGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKGRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlRGVjb3JhdG9yKGRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTYW5pdHlDaGVja2VyKGRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKGRldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZWNvcmF0b3IoZGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShkZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShkZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX01PREVMOiB7CisJCQkJRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsIGRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbCA9IChEZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsKGRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU0koZGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbChkZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpc2Vhc2VNb2RlbChkZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKGRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZURlY29yYXRvcihkZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNhbml0eUNoZWNrZXIoZGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKGRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKGRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKGRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShkZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRFVEVSTUlOSVNUSUNfU0lSX0RJU0VBU0VfTU9ERUw6IHsKKwkJCQlEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsIGRldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwgPSAoRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsKGRldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNJUihkZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTSShkZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbChkZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEaXNlYXNlTW9kZWwoZGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSW50ZWdyYXRpb25EZWNvcmF0b3IoZGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZURlY29yYXRvcihkZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTYW5pdHlDaGVja2VyKGRldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUoZGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKGRldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShkZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKGRldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUw6IHsKKwkJCQlEaXNlYXNlTW9kZWwgZGlzZWFzZU1vZGVsID0gKERpc2Vhc2VNb2RlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VEaXNlYXNlTW9kZWwoZGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlRGVjb3JhdG9yKGRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcihkaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUoZGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZWNvcmF0b3IoZGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoZGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKGRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9MQUJFTDogeworCQkJCURpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VNb2RlbExhYmVsID0gKERpc2Vhc2VNb2RlbExhYmVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZURpc2Vhc2VNb2RlbExhYmVsKGRpc2Vhc2VNb2RlbExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEeW5hbWljTm9kZUxhYmVsKGRpc2Vhc2VNb2RlbExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEeW5hbWljTGFiZWwoZGlzZWFzZU1vZGVsTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVMYWJlbChkaXNlYXNlTW9kZWxMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGFiZWwoZGlzZWFzZU1vZGVsTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShkaXNlYXNlTW9kZWxMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShkaXNlYXNlTW9kZWxMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRTogeworCQkJCURpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSA9IChEaXNlYXNlTW9kZWxMYWJlbFZhbHVlKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUoZGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGFiZWxWYWx1ZShkaXNlYXNlTW9kZWxMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJbnRlZ3JhdGlvbkxhYmVsVmFsdWUoZGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3JhcGhfU2FuaXR5Q2hlY2tlcihkaXNlYXNlTW9kZWxMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX1NUQVRFOiB7CisJCQkJRGlzZWFzZU1vZGVsU3RhdGUgZGlzZWFzZU1vZGVsU3RhdGUgPSAoRGlzZWFzZU1vZGVsU3RhdGUpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlRGlzZWFzZU1vZGVsU3RhdGUoZGlzZWFzZU1vZGVsU3RhdGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLklORkVDVE9SOiB7CisJCQkJSW5mZWN0b3IgaW5mZWN0b3IgPSAoSW5mZWN0b3IpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlSW5mZWN0b3IoaW5mZWN0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3IoaW5mZWN0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUoaW5mZWN0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcihpbmZlY3Rvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKGluZmVjdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKGluZmVjdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUlSOiB7CisJCQkJU0VJUiBzZWlyID0gKFNFSVIpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU0VJUihzZWlyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTSVIoc2Vpcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU0koc2Vpcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmREaXNlYXNlTW9kZWwoc2Vpcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlzZWFzZU1vZGVsKHNlaXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKHNlaXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3Ioc2Vpcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcihzZWlyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKHNlaXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcihzZWlyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoc2Vpcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShzZWlyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUlSX0xBQkVMOiB7CisJCQkJU0VJUkxhYmVsIHNlaXJMYWJlbCA9IChTRUlSTGFiZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU0VJUkxhYmVsKHNlaXJMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbChzZWlyTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpc2Vhc2VNb2RlbExhYmVsKHNlaXJMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSW50ZWdyYXRpb25MYWJlbChzZWlyTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUR5bmFtaWNOb2RlTGFiZWwoc2VpckxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEeW5hbWljTGFiZWwoc2VpckxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlTGFiZWwoc2VpckxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbChzZWlyTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShzZWlyTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUoc2VpckxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUlSX0xBQkVMX1ZBTFVFOiB7CisJCQkJU0VJUkxhYmVsVmFsdWUgc2VpckxhYmVsVmFsdWUgPSAoU0VJUkxhYmVsVmFsdWUpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU0VJUkxhYmVsVmFsdWUoc2VpckxhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNJUkxhYmVsVmFsdWUoc2VpckxhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNJTGFiZWxWYWx1ZShzZWlyTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKHNlaXJMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEaXNlYXNlTW9kZWxMYWJlbFZhbHVlKHNlaXJMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbFZhbHVlKHNlaXJMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJbnRlZ3JhdGlvbkxhYmVsVmFsdWUoc2VpckxhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUdyYXBoX1Nhbml0eUNoZWNrZXIoc2VpckxhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJOiB7CisJCQkJU0kgc2kgPSAoU0kpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU0koc2kpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0YW5kYXJkRGlzZWFzZU1vZGVsKHNpKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEaXNlYXNlTW9kZWwoc2kpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKHNpKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlRGVjb3JhdG9yKHNpKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTYW5pdHlDaGVja2VyKHNpKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKHNpKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZWNvcmF0b3Ioc2kpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShzaSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShzaSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfRElTRUFTRV9NT0RFTF9TVEFURTogeworCQkJCVNJRGlzZWFzZU1vZGVsU3RhdGUgc2lEaXNlYXNlTW9kZWxTdGF0ZSA9IChTSURpc2Vhc2VNb2RlbFN0YXRlKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVNJRGlzZWFzZU1vZGVsU3RhdGUoc2lEaXNlYXNlTW9kZWxTdGF0ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZShzaURpc2Vhc2VNb2RlbFN0YXRlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEaXNlYXNlTW9kZWxTdGF0ZShzaURpc2Vhc2VNb2RlbFN0YXRlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9JTkZFQ1RPUjogeworCQkJCVNJSW5mZWN0b3Igc2lJbmZlY3RvciA9IChTSUluZmVjdG9yKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVNJSW5mZWN0b3Ioc2lJbmZlY3Rvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmRJbmZlY3RvcihzaUluZmVjdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJbmZlY3RvcihzaUluZmVjdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlRGVjb3JhdG9yKHNpSW5mZWN0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUoc2lJbmZlY3Rvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKHNpSW5mZWN0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShzaUluZmVjdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHNpSW5mZWN0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX0xBQkVMOiB7CisJCQkJU0lMYWJlbCBzaUxhYmVsID0gKFNJTGFiZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU0lMYWJlbChzaUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKHNpTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpc2Vhc2VNb2RlbExhYmVsKHNpTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uTGFiZWwoc2lMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRHluYW1pY05vZGVMYWJlbChzaUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEeW5hbWljTGFiZWwoc2lMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZUxhYmVsKHNpTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsKHNpTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShzaUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHNpTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX0xBQkVMX1ZBTFVFOiB7CisJCQkJU0lMYWJlbFZhbHVlIHNpTGFiZWxWYWx1ZSA9IChTSUxhYmVsVmFsdWUpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU0lMYWJlbFZhbHVlKHNpTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKHNpTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZShzaUxhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsVmFsdWUoc2lMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJbnRlZ3JhdGlvbkxhYmVsVmFsdWUoc2lMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHcmFwaF9TYW5pdHlDaGVja2VyKHNpTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lSOiB7CisJCQkJU0lSIHNpciA9IChTSVIpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU0lSKHNpcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU0koc2lyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbChzaXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpc2Vhc2VNb2RlbChzaXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKHNpcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZURlY29yYXRvcihzaXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNhbml0eUNoZWNrZXIoc2lyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKHNpcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKHNpcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHNpcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShzaXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJUl9MQUJFTDogeworCQkJCVNJUkxhYmVsIHNpckxhYmVsID0gKFNJUkxhYmVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVNJUkxhYmVsKHNpckxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKHNpckxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEaXNlYXNlTW9kZWxMYWJlbChzaXJMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSW50ZWdyYXRpb25MYWJlbChzaXJMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRHluYW1pY05vZGVMYWJlbChzaXJMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRHluYW1pY0xhYmVsKHNpckxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlTGFiZWwoc2lyTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsKHNpckxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoc2lyTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUoc2lyTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJUl9MQUJFTF9WQUxVRTogeworCQkJCVNJUkxhYmVsVmFsdWUgc2lyTGFiZWxWYWx1ZSA9IChTSVJMYWJlbFZhbHVlKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVNJUkxhYmVsVmFsdWUoc2lyTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU0lMYWJlbFZhbHVlKHNpckxhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZShzaXJMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEaXNlYXNlTW9kZWxMYWJlbFZhbHVlKHNpckxhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsVmFsdWUoc2lyTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSW50ZWdyYXRpb25MYWJlbFZhbHVlKHNpckxhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUdyYXBoX1Nhbml0eUNoZWNrZXIoc2lyTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTDogeworCQkJCVN0YW5kYXJkRGlzZWFzZU1vZGVsIHN0YW5kYXJkRGlzZWFzZU1vZGVsID0gKFN0YW5kYXJkRGlzZWFzZU1vZGVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVN0YW5kYXJkRGlzZWFzZU1vZGVsKHN0YW5kYXJkRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEaXNlYXNlTW9kZWwoc3RhbmRhcmREaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKHN0YW5kYXJkRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlRGVjb3JhdG9yKHN0YW5kYXJkRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTYW5pdHlDaGVja2VyKHN0YW5kYXJkRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKHN0YW5kYXJkRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZWNvcmF0b3Ioc3RhbmRhcmREaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShzdGFuZGFyZERpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShzdGFuZGFyZERpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTDogeworCQkJCVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgc3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCA9IChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwoc3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlzZWFzZU1vZGVsTGFiZWwoc3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSW50ZWdyYXRpb25MYWJlbChzdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEeW5hbWljTm9kZUxhYmVsKHN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUR5bmFtaWNMYWJlbChzdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlTGFiZWwoc3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGFiZWwoc3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUoc3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRTogeworCQkJCVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBzdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgPSAoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZShzdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUoc3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbFZhbHVlKHN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSW50ZWdyYXRpb25MYWJlbFZhbHVlKHN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3JhcGhfU2FuaXR5Q2hlY2tlcihzdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0RJU0VBU0VfTU9ERUxfU1RBVEU6IHsKKwkJCQlTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlIHN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUgPSAoU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZSl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlKHN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpc2Vhc2VNb2RlbFN0YXRlKHN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX0lORkVDVE9SOiB7CisJCQkJU3RhbmRhcmRJbmZlY3RvciBzdGFuZGFyZEluZmVjdG9yID0gKFN0YW5kYXJkSW5mZWN0b3IpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU3RhbmRhcmRJbmZlY3RvcihzdGFuZGFyZEluZmVjdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJbmZlY3RvcihzdGFuZGFyZEluZmVjdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlRGVjb3JhdG9yKHN0YW5kYXJkSW5mZWN0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUoc3RhbmRhcmRJbmZlY3Rvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKHN0YW5kYXJkSW5mZWN0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShzdGFuZGFyZEluZmVjdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHN0YW5kYXJkSW5mZWN0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0VJUl9ESVNFQVNFX01PREVMOiB7CisJCQkJU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwgc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwgPSAoU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwoc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNFSVIoc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbChzdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU0lSKHN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdG9jaGFzdGljRGlzZWFzZU1vZGVsKHN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTSShzdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmREaXNlYXNlTW9kZWwoc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpc2Vhc2VNb2RlbChzdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSW50ZWdyYXRpb25EZWNvcmF0b3Ioc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3Ioc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNhbml0eUNoZWNrZXIoc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUoc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcihzdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NJX0RJU0VBU0VfTU9ERUw6IHsKKwkJCQlTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwgc3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsID0gKFN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwoc3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTSShzdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbChzdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0YW5kYXJkRGlzZWFzZU1vZGVsKHN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbChzdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpc2Vhc2VNb2RlbChzdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKHN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZURlY29yYXRvcihzdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNhbml0eUNoZWNrZXIoc3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKHN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKHN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShzdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU0lSX0RJU0VBU0VfTU9ERUw6IHsKKwkJCQlTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsIHN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwgPSAoU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsKHN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNJUihzdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoc3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU0koc3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbChzdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbChzdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEaXNlYXNlTW9kZWwoc3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSW50ZWdyYXRpb25EZWNvcmF0b3Ioc3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZURlY29yYXRvcihzdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTYW5pdHlDaGVja2VyKHN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUoc3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKHN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShzdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkFHR1JFR0FUSU5HX1NJX0RJU0VBU0VfTU9ERUw6IHsKKwkJCQlBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsIGFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwgPSAoQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsKGFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNJKGFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0YW5kYXJkRGlzZWFzZU1vZGVsKGFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpc2Vhc2VNb2RlbChhZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJbnRlZ3JhdGlvbkRlY29yYXRvcihhZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlRGVjb3JhdG9yKGFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNhbml0eUNoZWNrZXIoYWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kaWZpYWJsZShhZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZWNvcmF0b3IoYWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKGFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUoYWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuQUdHUkVHQVRJTkdfRElTRUFTRV9NT0RFTF9TVEFURTogeworCQkJCUFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUgYWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZSA9IChBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZUFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUoYWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlzZWFzZU1vZGVsU3RhdGUoYWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuQUdHUkVHQVRJTkdfU0VJUl9ESVNFQVNFX01PREVMOiB7CisJCQkJQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsIGFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbCA9IChBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsKGFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwoYWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsKGFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU0koYWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbChhZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpc2Vhc2VNb2RlbChhZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKGFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZURlY29yYXRvcihhZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNhbml0eUNoZWNrZXIoYWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKGFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKGFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKGFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShhZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkFHR1JFR0FUSU5HX1NJUl9ESVNFQVNFX01PREVMOiB7CisJCQkJQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwgYWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwgPSAoQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwoYWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwoYWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNJKGFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbChhZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlzZWFzZU1vZGVsKGFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJbnRlZ3JhdGlvbkRlY29yYXRvcihhZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZURlY29yYXRvcihhZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcihhZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kaWZpYWJsZShhZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKGFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoYWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUoYWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfRElTRUFTRV9NT0RFTDogeworCQkJCVN0b2NoYXN0aWNEaXNlYXNlTW9kZWwgc3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCA9IChTdG9jaGFzdGljRGlzZWFzZU1vZGVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoc3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlzZWFzZU1vZGVsKHN0b2NoYXN0aWNEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3Ioc3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcihzdG9jaGFzdGljRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKHN0b2NoYXN0aWNEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcihzdG9jaGFzdGljRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoc3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShzdG9jaGFzdGljRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUw6IHsKKwkJCQlTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwgc3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsID0gKFN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwoc3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdG9jaGFzdGljRGlzZWFzZU1vZGVsKHN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlzZWFzZU1vZGVsKHN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZURlY29yYXRvcihzdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNhbml0eUNoZWNrZXIoc3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKHN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKHN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShzdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJUl9JTk9DVUxBVE9SOiB7CisJCQkJU0lSSW5vY3VsYXRvciBzaXJJbm9jdWxhdG9yID0gKFNJUklub2N1bGF0b3IpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU0lSSW5vY3VsYXRvcihzaXJJbm9jdWxhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTSUluZmVjdG9yKHNpcklub2N1bGF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0YW5kYXJkSW5mZWN0b3Ioc2lySW5vY3VsYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSW5mZWN0b3Ioc2lySW5vY3VsYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZURlY29yYXRvcihzaXJJbm9jdWxhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKHNpcklub2N1bGF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcihzaXJJbm9jdWxhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoc2lySW5vY3VsYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShzaXJJbm9jdWxhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1BPSVNTT05fU0lfRElTRUFTRV9NT0RFTDogeworCQkJCVN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwgc3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbCA9IChTdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwoc3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU0koc3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmREaXNlYXNlTW9kZWwoc3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlzZWFzZU1vZGVsKHN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKHN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3Ioc3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcihzdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKHN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcihzdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoc3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShzdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1BPSVNTT05fU0lSX0RJU0VBU0VfTU9ERUw6IHsKKwkJCQlTdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbCBzdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbCA9IChTdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VTdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbChzdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU0lSKHN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTSShzdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmREaXNlYXNlTW9kZWwoc3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpc2Vhc2VNb2RlbChzdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSW50ZWdyYXRpb25EZWNvcmF0b3Ioc3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3Ioc3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNhbml0eUNoZWNrZXIoc3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUoc3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcihzdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHN0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1BPSVNTT05fU0VJUl9ESVNFQVNFX01PREVMOiB7CisJCQkJU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsIHN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbCA9IChTdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsKHN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU0VJUihzdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNJUihzdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNJKHN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmREaXNlYXNlTW9kZWwoc3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEaXNlYXNlTW9kZWwoc3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJbnRlZ3JhdGlvbkRlY29yYXRvcihzdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3Ioc3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTYW5pdHlDaGVja2VyKHN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kaWZpYWJsZShzdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcihzdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShzdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUoc3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5JTkZFQ1RPUl9JTk9DVUxBVE9SX0NPTExFQ1RJT046IHsKKwkJCQlJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uIGluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24gPSAoSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uKGluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3IoaW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kaWZpYWJsZShpbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZWNvcmF0b3IoaW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKGluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUoaW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0VJUjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKKwkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0VJUjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTRUlSKFNFSVIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNFSVIgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNFSVIgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlU0VJUkxhYmVsKFNFSVJMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0VJUiBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKKwkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0VJUiBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTRUlSTGFiZWxWYWx1ZShTRUlSTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0lSPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQorCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TSVI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlU0lSKFNJUiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0lSIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQorCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TSVIgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlU0lSTGFiZWwoU0lSTGFiZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNJUiBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKKwkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0lSIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVNJUkxhYmVsVmFsdWUoU0lSTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKKwkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbChTdGFuZGFyZERpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKKwkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VEaXNlYXNlTW9kZWwoRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNlYXNlIE1vZGVsIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQorCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNlYXNlIE1vZGVsIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZURpc2Vhc2VNb2RlbExhYmVsKERpc2Vhc2VNb2RlbExhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdG9jaGFzdGljIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKKwkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RvY2hhc3RpYyBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwoCisJCQlTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5mZWN0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluZmVjdG9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVN0YW5kYXJkSW5mZWN0b3IoU3RhbmRhcmRJbmZlY3RvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGV0ZXJtaW5pc3RpYyBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRldGVybWluaXN0aWMgU0VJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZURldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsKAorCQkJRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2Vhc2UgTW9kZWwgTGFiZWwgVmFsdWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2Vhc2UgTW9kZWwgTGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZShEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNlYXNlIE1vZGVsIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQorCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNlYXNlIE1vZGVsIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgKKwkJCVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzZWFzZSBNb2RlbCBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKKwkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzZWFzZSBNb2RlbCBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNJPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQorCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TSTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTSShTSSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0kgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNJIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVNJTGFiZWwoU0lMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0kgTGFiZWwgVmFsdWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNJIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVNJTGFiZWxWYWx1ZShTSUxhYmVsVmFsdWUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluZmVjdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQorCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbmZlY3RvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VJbmZlY3RvcihJbmZlY3RvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0kgSW5mZWN0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNJIEluZmVjdG9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVNJSW5mZWN0b3IoU0lJbmZlY3RvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGV0ZXJtaW5pc3RpYyBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKKwkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGV0ZXJtaW5pc3RpYyBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsKAorCQkJRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGV0ZXJtaW5pc3RpYyBTSSBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQorCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXRlcm1pbmlzdGljIFNJIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsKAorCQkJRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdG9jaGFzdGljIFNJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQorCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdG9jaGFzdGljIFNJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwoU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RvY2hhc3RpYyBTSSBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RvY2hhc3RpYyBTSSBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbChTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2Vhc2UgTW9kZWwgU3RhdGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZURpc2Vhc2VNb2RlbFN0YXRlKERpc2Vhc2VNb2RlbFN0YXRlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TSSBEaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0kgRGlzZWFzZSBNb2RlbCBTdGF0ZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTSURpc2Vhc2VNb2RlbFN0YXRlKFNJRGlzZWFzZU1vZGVsU3RhdGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2Vhc2UgTW9kZWwgU3RhdGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUoU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2FuaXR5IENoZWNrZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTYW5pdHlDaGVja2VyKFNhbml0eUNoZWNrZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVncmF0aW9uIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZWdyYXRpb24gTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlSW50ZWdyYXRpb25MYWJlbChJbnRlZ3JhdGlvbkxhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlZ3JhdGlvbiBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVncmF0aW9uIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUludGVncmF0aW9uTGFiZWxWYWx1ZShJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVncmF0aW9uIERlY29yYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVncmF0aW9uIERlY29yYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VJbnRlZ3JhdGlvbkRlY29yYXRvcihJbnRlZ3JhdGlvbkRlY29yYXRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWdncmVnYXRpbmcgU0kgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFnZ3JlZ2F0aW5nIFNJIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbChBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BZ2dyZWdhdGluZyBEaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWdncmVnYXRpbmcgRGlzZWFzZSBNb2RlbCBTdGF0ZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlKEFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFnZ3JlZ2F0aW5nIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFnZ3JlZ2F0aW5nIFNFSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwoQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BZ2dyZWdhdGluZyBTSVIgRGlzZWFzZSBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFnZ3JlZ2F0aW5nIFNJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsKEFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdG9jaGFzdGljIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdG9jaGFzdGljIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbChTdG9jaGFzdGljRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdG9jaGFzdGljIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdG9jaGFzdGljIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKFN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U0lSIElub2N1bGF0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TSVIgSW5vY3VsYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTSVJJbm9jdWxhdG9yKFNJUklub2N1bGF0b3Igb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0b2NoYXN0aWMgUG9pc3NvbiBTSSBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RvY2hhc3RpYyBQb2lzc29uIFNJIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbChTdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdG9jaGFzdGljIFBvaXNzb24gU0lSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdG9jaGFzdGljIFBvaXNzb24gU0lSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwoU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0b2NoYXN0aWMgUG9pc3NvbiBTRUlSIERpc2Vhc2UgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdG9jaGFzdGljIFBvaXNzb24gU0VJUiBEaXNlYXNlIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbChTdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluZmVjdG9yIElub2N1bGF0b3IgQ29sbGVjdGlvbjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluZmVjdG9yIElub2N1bGF0b3IgQ29sbGVjdGlvbjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uKEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgPFQ+IFQxIGNhc2VDb21wYXJhYmxlKENvbXBhcmFibGU8VD4gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKKwkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlY29yYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKKwkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVjb3JhdG9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZURlY29yYXRvcihEZWNvcmF0b3Igb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgRGVjb3JhdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQorCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlIERlY29yYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VOb2RlRGVjb3JhdG9yKE5vZGVEZWNvcmF0b3Igb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZGlmaWFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2RpZmlhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZU1vZGlmaWFibGUoTW9kaWZpYWJsZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUxhYmVsKExhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EeW5hbWljIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQorCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EeW5hbWljIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUR5bmFtaWNMYWJlbChEeW5hbWljTGFiZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTm9kZUxhYmVsKE5vZGVMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RHluYW1pYyBOb2RlIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQorCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EeW5hbWljIE5vZGUgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRHluYW1pY05vZGVMYWJlbChEeW5hbWljTm9kZUxhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNhbml0eSBDaGVja2VyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUdyYXBoX1Nhbml0eUNoZWNrZXIoU2FuaXR5Q2hlY2tlciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGFiZWwgVmFsdWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCisJICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUxhYmVsVmFsdWUoTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKKwkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZQorCSAqIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvLyBTdGFuZGFyZFN3aXRjaApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcy8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcy8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGU4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXMvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZGVkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXM8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTFmN2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw3IEBACisjTW9uIEphbiAyMSAxMjo0MDozOSBFU1QgMjAwOAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWQ2YTA1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDEyIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcztzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXMuQWN0aXZhdG9yCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVjMjcxOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDkgQEAKK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCitiaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIHJlc291cmNlcy8sXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKKyAgICAgICAgICAgICAgIG5vdGljZS5odG1sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXMvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNGIxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoreG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKK3htbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPGxpbmsgcmVsPUZpbGUtTGlzdAoraHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOkRvY3VtZW50UHJvcGVydGllcz4KKyAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KKyAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgorICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+CisgIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+CisgIDxvOlBhZ2VzPjQ8L286UGFnZXM+CisgIDxvOldvcmRzPjE2MjY8L286V29yZHM+CisgIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgorICAgPG86TGluZXM+Nzc8L286TGluZXM+CisgIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KKyAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+CisgIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+CisgPC9vOkRvY3VtZW50UHJvcGVydGllcz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OldvcmREb2N1bWVudD4KKyAgPHc6VHJhY2tSZXZpc2lvbnMvPgorIDwvdzpXb3JkRG9jdW1lbnQ+Cis8L3htbD48IVtlbmRpZl0tLT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlRhaG9tYTsKKwlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKKwltc28tZm9udC1jaGFyc2V0OjA7CisJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7CisJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7CisJbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KK3AuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bXNvLXN0eWxlLXBhcmVudDoiIjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwCisJe21hcmdpbi1yaWdodDowaW47CisJbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CisJbWFyZ2luLWxlZnQ6MGluOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKKwl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZTo4LjBwdDsKKwlmb250LWZhbWlseTpUYWhvbWE7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorQHBhZ2UgU2VjdGlvbjEKKwl7c2l6ZTo4LjVpbiAxMS4waW47CisJbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47CisJbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKKwltc28tZm9vdGVyLW1hcmdpbjouNWluOworCW1zby1wYXBlci1zb3VyY2U6MDt9CitkaXYuU2VjdGlvbjEKKwl7cGFnZTpTZWN0aW9uMTt9CistLT4KKzwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgorPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCitUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAorUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCitPRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCithZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKK3N1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKK2J5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgoraWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KK3N1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCit3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKK2VudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKK2NsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCitvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucworZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KK3JlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50CithIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KK3N0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5CitkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCitSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAorYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCitjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgorb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKK2J5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCit0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCithbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCitSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCitDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgordGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Citmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQordG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKK2lmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKK3RoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQorRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKK3JpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KK3RoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Cis8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK2l0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAorY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQorYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKK2FuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCitlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAoraW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAorYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCitzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0CitDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCitzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCitpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCitjb2RlIGZvcm06PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQorY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQorY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCitvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQorYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycworYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKK29mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAorbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCitDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKK2Nvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCit0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCitjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKK3RvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK3RvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCithbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQoraW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCit3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcworc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCitvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCitjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKK1dJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKK01FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQorUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcworQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKK2VxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgorVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgorVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKK29yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKK2Z1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgorYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAorb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCitzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCitwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQorY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKK3RoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKK0FncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCitzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAorZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCitTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCitBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKK0FncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKK2l0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcy9ub3RpY2UuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXMvbm90aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhZjk2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXMvbm90aWNlLmh0bWwKQEAgLTAsMCArMSw3OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5NYXJjaCAxNywgMjAwNTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisgICAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKKyAgIAorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCisgICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKyAgIAorPHVsPgorCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucworICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPiAgIAorIAorPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisJCQorPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisJPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQorCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisgICAKKzxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcy9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXMvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjMmU0ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXMvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0MiBAQAorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjIERpc2Vhc2UgQ2F0ZWdvcmllcworcGx1Z2luTmFtZSA9IFNURU0gRGlzZWFzZXMgTW9kZWwKK3Byb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCisKK19VSV9TVEVNID0gU1RFTQorX1VJX0J1aWx0aW4gPSBCdWlsdC1pbgorCisjIER1YmxpbiBDb3JlCitkY19jcmVhdG9yX2RhZm9yZCA9IGRhZm9yZAorZGNfY3JlYXRvcl9rYXVmbWFuID0ga2F1Zm1hbgorZGNfY3JlYXRvcl9lZGx1bmQgPSBlZGx1bmQKK2RjX2NyZWF0b3JfZGF2aXMgPSBkYXZpcworZGNfcHViID0gRWNsaXBzZS5vcmcKKyNkY19jcmVhdG9yX2thdWZtYW4gPSBrYXVmbWFuCitkY19zZmx1X2Rfc2Vpcl9kZXNjID0gUGFuZGVtaWMgRGVtbyAoU0VJUikKK2RjX3NmbHVfZF9zZWlyX3RpdGxlID0gUGFuZGVtaWMgRGVtbworCitkY19hZ2dfc2Vpcl9kZXNjID0gVGhpcyAmcXVvdDtEaXNlYXNlIE1vZGVsJnF1b3Q7IGFnZ3JlZ2F0ZXMgdGhlIHZhbHVlcyBwcm9kdWNlZCBieSBvdGhlciBTRUlSIGRpc2Vhc2UgbW9kZWxzIGFjdGluZyBvbiBIdW1hbiBwb3B1bGF0aW9ucy4KK2RjX2FnZ19zZWlyX3RpdGxlID0gQWdncmVnYXRpbmcgU0VJUiBIdW1hbgorCitkY19pbmZfbXNleF9kZXNjID0gVGhpcyBpcyBhbiAmcXVvdDtJbmZlY3RvciZxdW90OyB0aGF0IGluZmVjdHMgdGVuICgxMCkgSHVtYW5zIHdpdGggYSBQYW5kZW1pYyBEZW1vIERpc2Vhc2UsIGluIE1pZGRsZXNleCwgTUEgCitkY19pbmZfbXNleF90aXRsZSA9IFRlbiAoMTApIEh1bWFucyBJbmZlY3RlZCB3aXRoIGEgUGFuZGVtaWMgRGVtbyBEaXNlYXNlLCBpbiBNaWRkbGVzZXgsIE1BCisKK2RjX2ZsdV9kX3NlaXJfZGVzYyA9IEluZmx1ZW56YSAoU0VJUikKK2RjX2ZsdV9kX3NlaXJfdGl0bGUgPSBJbmZsdWVuemEKKworZGNfc2FtX2Rfc2Vpcl9kZXNjID0gU2FsbW9uZWxsYSAoU0VJUikKK2RjX3NhbV9kX3NlaXJfdGl0bGUgPSBTYWxtb25lbGxhCisKK2RjX3NoaWdfZF9zZWlyX2Rlc2MgPSBTaGlnZWxsYSAoU0VJUikKK2RjX3NoaWdfZF9zZWlyX3RpdGxlID0gU2hpZ2VsbGEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhYTE2MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXMvcGx1Z2luLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgorPHBsdWdpbj4KKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZGlzZWFzZSI+CisgICAgICA8c3RlbV9jYXRlZ29yeQorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXMuc3RlbSIKKyAgICAgICAgICAgIG5hbWU9IiVfVUlfU1RFTSIKKyAgICAgICAgICAgIHBhcmVudF9pZD0iLyIvPgorICAgICAgPHN0ZW1fY2F0ZWdvcnkKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzLnN0ZW0uYnVpbHRpbiIKKyAgICAgICAgICAgIG5hbWU9IiVfVUlfQnVpbHRpbiIKKyAgICAgICAgICAgIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcy5zdGVtIi8+CisgICAgICA8ZHVibGluX2NvcmUKKyAgICAgICAgICAgIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzLnN0ZW0uYnVpbHRpbiIKKyAgICAgICAgICAgIGNyZWF0ZWQ9IjIwMDctMDItMTUiCisgICAgICAgICAgICBjcmVhdG9yPSIlZGNfY3JlYXRvcl9kYWZvcmQiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWRjX2ZsdV9kX3NlaXJfZGVzYyIKKyAgICAgICAgICAgIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQuZWNvcmUiCisgICAgICAgICAgICBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXMvcmVzb3VyY2VzL2Rpc2Vhc2VzL2luZmx1ZW56YV9kZXRlcm1pbmlzdGljX3NlaXIuc3RhbmRhcmQiCisgICAgICAgICAgICBwdWJsaXNoZXI9IiVkY19wdWIiCisgICAgICAgICAgICB0aXRsZT0iJWRjX2ZsdV9kX3NlaXJfdGl0bGUiLz4KKyAgIDwvZXh0ZW5zaW9uPgorCisKKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcy9yZXNvdXJjZXMvZGlzZWFzZXMvaW5mbHVlbnphX2RldGVybWluaXN0aWNfc2Vpci5zdGFuZGFyZCBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXMvcmVzb3VyY2VzL2Rpc2Vhc2VzL2luZmx1ZW56YV9kZXRlcm1pbmlzdGljX3NlaXIuc3RhbmRhcmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlN2ZjYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXMvcmVzb3VyY2VzL2Rpc2Vhc2VzL2luZmx1ZW56YV9kZXRlcm1pbmlzdGljX3NlaXIuc3RhbmRhcmQKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgorPG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZDpEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQuZWNvcmUiIHVSST0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzL3Jlc291cmNlcy9kaXNlYXNlcy9pbmZsdWVuemFfZGV0ZXJtaW5pc3RpY19zZWlyLnN0YW5kYXJkIiB0eXBlVVJJPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vaWRlbnRpZmlhYmxlMSIgZGlzZWFzZU5hbWU9IkluZmx1ZW56YSIgdHJhbnNtaXNzaW9uUmF0ZT0iMS4wIiBub25MaW5lYXJpdHlDb2VmZmljaWVudD0iMS4wIiByZWNvdmVyeVJhdGU9IjAuMTc1IiBpbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZT0iMC4wIiBjaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlPSIyLjI1IiBpbmN1YmF0aW9uUmF0ZT0iMC42NyI+CisgIDxkdWJsaW5Db3JlIHRpdGxlPSJEZW1vIERldGVybWluaXN0aWMgU0VJUiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzL3Jlc291cmNlcy9kaXNlYXNlcy9pbmZsdWVuemFfZGV0ZXJtaW5pc3RpY19zZWlyLnN0YW5kYXJkIiBkZXNjcmlwdGlvbj0iMSBNb2RlbCBEZWNvcmF0b3IiIGNyZWF0b3I9ImRhZm9yZCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC5lY29yZSIvPgorPC9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQ6RGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2VzL0FjdGl2YXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlcy9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjNmMDJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlcy9BY3RpdmF0b3IuamF2YQpAQCAtMCwwICsxLDYzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworLyoqCisgKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKKyAqLworcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIFBsdWdpbiB7CisKKwkvKioKKwkgKiBUaGUgcGx1Zy1pbiBJRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzIjsgLy8kTk9OLU5MUy0xJAorCisJLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQorCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47CisJCisJLyoqCisJICogVGhlIGNvbnN0cnVjdG9yCisJICovCisJcHVibGljIEFjdGl2YXRvcigpIHsKKwkJcGx1Z2luID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc3RhcnQoY29udGV4dCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlwbHVnaW4gPSBudWxsOworCQlzdXBlci5zdG9wKGNvbnRleHQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQorCSAqCisJICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKK30gLy8gQWN0aXZhdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy8ucHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YWM1YzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy8ucHJvamVjdApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLmRvYzwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4ZTI2ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsOCBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnN0ZW0uZG9jO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuaGVscApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJjN2U1MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNSBAQAorYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgdG9jLnhtbCxcCisgICAgICAgICAgICAgICB0b2Njb25jZXB0cy54bWwsXAorICAgICAgICAgICAgICAgdG9jZXBpZGVtaW9sb2dpY2FsbW9kZWxpbmcueG1sLFwKKyAgICAgICAgICAgICAgIHRvY2dldHRpbmdzdGFydGVkLnhtbCxcCisgICAgICAgICAgICAgICB0b2NpbnRlcmZhY2UueG1sLFwKKyAgICAgICAgICAgICAgIHRvY3JlZmVyZW5jZS54bWwsXAorICAgICAgICAgICAgICAgdG9jdHV0b3JpYWxzLnhtbCxcCisgICAgICAgICAgICAgICBoZWxwLyxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICBub3RpY2UuaHRtbCxcCisgICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAorICAgICAgICAgICAgICAgdG9jZGlzY2xhaW1lci54bWwKK3NyYy5pbmNsdWRlcyA9IGhlbHAvLFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCisgICAgICAgICAgICAgICBub3RpY2UuaHRtbCxcCisgICAgICAgICAgICAgICB0b2N0dXRvcmlhbHMueG1sLFwKKyAgICAgICAgICAgICAgIHRvY3JlZmVyZW5jZS54bWwsXAorICAgICAgICAgICAgICAgdG9jaW50ZXJmYWNlLnhtbCxcCisgICAgICAgICAgICAgICB0b2NnZXR0aW5nc3RhcnRlZC54bWwsXAorICAgICAgICAgICAgICAgdG9jZXBpZGVtaW9sb2dpY2FsbW9kZWxpbmcueG1sLFwKKyAgICAgICAgICAgICAgIHRvY2Rpc2NsYWltZXIueG1sLFwKKyAgICAgICAgICAgICAgIHRvY2NvbmNlcHRzLnhtbCxcCisgICAgICAgICAgICAgICB0b2MueG1sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9jb250ZXh0c2Vuc2l0aXZlaGVscC54bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9jb250ZXh0c2Vuc2l0aXZlaGVscC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZiMDZlZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2NvbnRleHRzZW5zaXRpdmVoZWxwLnhtbApAQCAtMCwwICsxLDgwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKw0KKzxjb250ZXh0cz4NCisJPGNvbnRleHQgaWQ9Im5ld2Rpc2Vhc2VfY29udGV4dGlkIiB0aXRsZT0iQWJvdXQgTmV3IERpc2Vhc2UgV2l6YXJkIj4NCisJCTxkZXNjcmlwdGlvbj5UaGlzIFdpemFyZCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBhbmQgZGVmaW5lIHByb3BlcnRpZXMgb2YgYSBuZXcgRGlzZWFzZS48L2Rlc2NyaXB0aW9uPg0KKwkJPHRvcGljIGhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9kaXNlYXNld2l6YXJkLmh0bWwiIGxhYmVsPSJEaXNlYXNlIFdpemFyZCIvPg0KKwk8L2NvbnRleHQ+DQorCQ0KKwk8Y29udGV4dCBpZD0ibmV3ZXhwZXJpbWVudF9jb250ZXh0aWQiIHRpdGxlPSJBYm91dCBOZXcgRXhwZXJpbWVudCBXaXphcmQiPg0KKwkJPGRlc2NyaXB0aW9uPlRoaXMgV2l6YXJkIGFsbG93cyB5b3UgdG8gY3JlYXRlIGFuZCBkZWZpbmUgdGhlIHByb3BlcnRpZXMgb2YgYSBuZXcgRXhwZXJpbWVudC48L2Rlc2NyaXB0aW9uPg0KKwkJPHRvcGljIGhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9leHBlcmltZW50d2l6YXJkLmh0bWwiIGxhYmVsPSJFeHBlcmltZW50IFdpemFyZCIvPg0KKwk8L2NvbnRleHQ+DQorCQ0KKwk8Y29udGV4dCBpZD0ibmV3Z3JhcGhfY29udGV4dGlkIiB0aXRsZT0iQWJvdXQgTmV3IEdyYXBoIFdpemFyZCI+DQorCQk8ZGVzY3JpcHRpb24+VGhpcyBXaXphcmQgYWxsb3dzIHlvdSB0byBjcmVhdGUgYW5kIGRlZmluZSB0aGUgcHJvcGVydGllcyBvZiBhIG5ldyBHcmFwaC48L2Rlc2NyaXB0aW9uPg0KKwkJPHRvcGljIGhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9ncmFwaHdpemFyZC5odG1sIiBsYWJlbD0iR3JhcGggV2l6YXJkIi8+DQorCTwvY29udGV4dD4NCisJDQorCTxjb250ZXh0IGlkPSJuZXdpbmZlY3Rvcmlub2N1bGF0b3JfY29udGV4dGlkIiB0aXRsZT0iQWJvdXQgTmV3IEluZmVjdGlvbi9Jbm9jdWxhdGlvbiBQb2ludCBXaXphcmQiPg0KKwkJPGRlc2NyaXB0aW9uPlRoaXMgV2l6YXJkIGFsbG93cyB5b3UgdG8gY3JlYXRlIGFuZCBkZWZpbmUgdGhlIHByb3BlcnRpZXMgb2YgYSBuZXcgSW5mZWN0b3Igb3IgSW5vY3VsYXRvci48L2Rlc2NyaXB0aW9uPg0KKwkJPHRvcGljIGhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbmZlY3RvcndpemFyZC5odG1sIiBsYWJlbD0iSW5mZWN0b3IvSW5vY3VsYXRvciBXaXphcmQiLz4NCisJPC9jb250ZXh0Pg0KKwkNCisJPGNvbnRleHQgaWQ9Im5ld21vZGVsX2NvbnRleHRpZCIgdGl0bGU9IkFib3V0IE5ldyBNb2RlbCBXaXphcmQiPg0KKwkJPGRlc2NyaXB0aW9uPlRoaXMgV2l6YXJkIGFsbG93cyB5b3UgdG8gY3JlYXRlIGFuZCBkZWZpbmUgdGhlIHByb3BlcnRpZXMgb2YgYSBuZXcgTW9kZWwuPC9kZXNjcmlwdGlvbj4NCisJCTx0b3BpYyBocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvbW9kZWx3aXphcmQuaHRtbCIgbGFiZWw9Ik1vZGVsIFdpemFyZCIvPg0KKwk8L2NvbnRleHQ+DQorCQ0KKwk8Y29udGV4dCBpZD0ibmV3bW9kaWZpZXJfY29udGV4dGlkIiB0aXRsZT0iQWJvdXQgTmV3IE1vZGlmaWVyIFdpemFyZCI+DQorCQk8ZGVzY3JpcHRpb24+VGhpcyBXaXphcmQgYWxsb3dzIHlvdSB0byBjcmVhdGUgYW5kIGRlZmluZSB0aGUgcHJvcGVydGllcyBvZiBhIG5ldyBNb2RpZmllci48L2Rlc2NyaXB0aW9uPg0KKwkJPHRvcGljIGhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9tb2RpZmllcndpemFyZC5odG1sIiBsYWJlbD0iTW9kaWZpZXIgV2l6YXJkIi8+DQorCTwvY29udGV4dD4NCisJDQorCTxjb250ZXh0IGlkPSJuZXdwb3B1bGF0aW9uX2NvbnRleHRpZCIgdGl0bGU9IkFib3V0IE5ldyBQb3B1bGF0aW9uIE1vZGVsIFdpemFyZCI+DQorCQk8ZGVzY3JpcHRpb24+VGhpcyBXaXphcmQgYWxsb3dzIHlvdSB0byBkZWZpbmUgdGhlIHByb3BlcnRpZXMgb2YgYSBuZXcgUG9wdWxhdGlvbiBNb2RlbC48L2Rlc2NyaXB0aW9uPg0KKwkJPHRvcGljIGhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9wb3B1bGF0aW9ud2l6YXJkLmh0bWwiIGxhYmVsPSJQb3B1bGF0aW9uIE1vZGVsIFdpemFyZCIvPg0KKwk8L2NvbnRleHQ+DQorCQ0KKwk8Y29udGV4dCBpZD0ibmV3cG9wdWxhdGlvbmluaXRpYWxpemVyX2NvbnRleHRpZCIgdGl0bGU9IkFib3V0IE5ldyBQb3B1bGF0aW9uIEluaXRpYWxpemVyIFdpemFyZCI+DQorCQk8ZGVzY3JpcHRpb24+VGhpcyBXaXphcmQgYWxsb3dzIHlvdSB0byBkZWZpbmUgdGhlIGluaXRpYWwgc3RhdGUgb2YgYSBQb3B1bGF0aW9uLjwvZGVzY3JpcHRpb24+DQorCQk8dG9waWMgaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL3BvcHVsYXRpb25pbml0aWFsaXplcndpemFyZC5odG1sIiBsYWJlbD0iUG9wdWxhdGlvbiBJbml0aWFsaXplciBXaXphcmQiLz4NCisJPC9jb250ZXh0Pg0KKwkNCisJPGNvbnRleHQgaWQ9Im5ld3ByZWRpY2F0ZV9jb250ZXh0aWQiIHRpdGxlPSJBYm91dCBOZXcgUHJlZGljYXRlIFdpemFyZCI+DQorCQk8ZGVzY3JpcHRpb24+VGhpcyBXaXphcmQgYWxsb3dzIHlvdSB0byBjcmVhdGUgYW5kIGRlZmluZSB0aGUgcHJvcGVydGllcyBvZiBhIG5ldyBQcmVkaWNhdGUuPC9kZXNjcmlwdGlvbj4NCisJCTx0b3BpYyBocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvcHJlZGljYXRld2l6YXJkLmh0bWwiIGxhYmVsPSJQcmVkaWNhdGUgV2l6YXJkIi8+DQorCTwvY29udGV4dD4NCisJDQorCTxjb250ZXh0IGlkPSJuZXdyZWFsdGltZXNlcXVlbmNlcl9jb250ZXh0aWQiIHRpdGxlPSJBYm91dCBOZXcgUmVhbCBUaW1lIFNlcXVlbmNlciBXaXphcmQiPg0KKwkJPGRlc2NyaXB0aW9uPlRoaXMgV2l6YXJkIGFsbG93cyB5b3UgdG8gY3JlYXRlIGFuZCBkZWZpbmUgdGhlIHByb3BlcnRpZXMgb2YgYSBuZXcgUmVhbC1UaW1lIFNlcXVlbmNlci48L2Rlc2NyaXB0aW9uPg0KKwkJPHRvcGljIGhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9yZWFsdGltZXNlcXVlbmNlcndpemFyZC5odG1sIiBsYWJlbD0iUmVhbCBUaW1lIFNlcXVlbmNlciBXaXphcmQiLz4NCisJPC9jb250ZXh0Pg0KKwkNCisJPGNvbnRleHQgaWQ9Im5ld3NjZW5hcmlvX2NvbnRleHRpZCIgdGl0bGU9IkFib3V0IE5ldyBTY2VuYXJpbyBXaXphcmQiPg0KKwkJPGRlc2NyaXB0aW9uPlRoaXMgV2l6YXJkIGFsbG93cyB5b3UgdG8gY3JlYXRlIGFuZCBkZWZpbmUgdGhlIHByb3BlcnRpZXMgb2YgYSBuZXcgU2NlbmFyaW8uPC9kZXNjcmlwdGlvbj4NCisJCTx0b3BpYyBocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvc2NlbmFyaW93aXphcmQuaHRtbCIgbGFiZWw9IlNjZW5hcmlvIFdpemFyZCIvPg0KKwk8L2NvbnRleHQ+DQorDQorCTxjb250ZXh0IGlkPSJuZXdzZXF1ZW50aWFsc2VxdWVuY2VyX2NvbnRleHRpZCIgdGl0bGU9IkFib3V0IE5ldyBTZXF1ZW50aWFsIFNlcXVlbmNlciBXaXphcmQiPg0KKwkJPGRlc2NyaXB0aW9uPlRoaXMgV2l6YXJkIGFsbG93cyB5b3UgdG8gY3JlYXRlIGFuZCBkZWZpbmUgdGhlIHByb3BlcnRpZXMgb2YgYSBuZXcgU2VxdWVudGlhbCBTZXF1ZW5jZXIuPC9kZXNjcmlwdGlvbj4NCisJCTx0b3BpYyBocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvc2VxdWVudGlhbHNlcXVlbmNlcndpemFyZC5odG1sIiBsYWJlbD0iU2VxdWVudGlhbCBTZXF1ZW5jZXIgV2l6YXJkIi8+DQorCTwvY29udGV4dD4NCisJDQorCTxjb250ZXh0IGlkPSJuZXdzdGVtcHJvamVjdF9jb250ZXh0aWQiIHRpdGxlPSJBYm91dCBOZXcgU1RFTSBQcm9qZWN0IFdpemFyZCI+DQorCQk8ZGVzY3JpcHRpb24+VGhpcyBXaXphcmQgYWxsb3dzIHlvdSB0byBjcmVhdGUgYW5kIGRlZmluZSB0aGUgcHJvcGVydGllcyBvZiBhIG5ldyBTVEVNIFByb2plY3QuPC9kZXNjcmlwdGlvbj4NCisJCTx0b3BpYyBocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvc3RlbXByb2plY3R3aXphcmQuaHRtbCIgbGFiZWw9IlNURU0gUHJvamVjdCBXaXphcmQiLz4NCisJPC9jb250ZXh0Pg0KKw0KKwk8Y29udGV4dCBpZD0ibmV3dHJpZ2dlcl9jb250ZXh0aWQiIHRpdGxlPSJBYm91dCBOZXcgVHJpZ2dlciBXaXphcmQiPg0KKwkJPGRlc2NyaXB0aW9uPlRoaXMgV2l6YXJkIGFsbG93cyB5b3UgdG8gY3JlYXRlIGFuZCBkZWZpbmUgdGhlIHByb3BlcnRpZXMgb2YgYSBuZXcgVHJpZ2dlci48L2Rlc2NyaXB0aW9uPg0KKwkJPHRvcGljIGhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy90cmlnZ2Vyd2l6YXJkLmh0bWwiIGxhYmVsPSJUcmlnZ2VyIFdpemFyZCIvPg0KKwk8L2NvbnRleHQ+DQorCQ0KKwk8Y29udGV4dCBpZD0iaW52YWxpZG5lc3RpbmdfY29udGV4dGlkIiB0aXRsZT0iTW9kZWwgbmVzdGluZyI+DQorCQk8ZGVzY3JpcHRpb24+UG9zc2libGUgbW9kZWwgbmVzdGluZyBwcm9ibGVtLjwvZGVzY3JpcHRpb24+DQorCQk8dG9waWMgaHJlZj0iaGVscC9odG1sL3R1dG9yaWFscy9tb2RlbG5lc3RpbmcuaHRtbCIgbGFiZWw9IlNjZW5hcmlvIGluaXRpYWxpemF0aW9uIi8+DQorCTwvY29udGV4dD4NCisJDQorPC9jb250ZXh0cz4NCisNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9jb3B5aGVscC54bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9jb3B5aGVscC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4YTkxNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2NvcHloZWxwLnhtbApAQCAtMCwwICsxLDQzIEBACis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Cis8IS0tIEFudCBidWlsZCBzY3JpcHQgdG8gY29weSB0aGUgaGVscCBmaWxlcyAgICAgICAtLT4KKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKzxwcm9qZWN0IG5hbWU9ImNvcHlIZWxwIiBkZWZhdWx0PSJjb3B5aGVscCIgPgorCisJCisJPCEtLSBDb25maWd1cmUgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSB3ZWIgYXBwbGljYXRpb24gaXMgYnVpbHQgLS0+CisJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgICAgdmFsdWU9IiR7YmFzZWRpcn0iLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InppcC5uYW1lIiAgICB2YWx1ZT0iaGVscC56aXAiLz4KKyAgICAgICAgCisJCisKKyAJCisJPCEtLSBFeGVjdXRhYmxlIFRhcmdldHMgLS0+CisJCQorCTx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJyZW1vdmVzIHByZXZpb3VzIGJ1aWxkIj4JCQorCQk8ZGVsZXRlIGRpcj0iJCh6aXAubmFtZSkiIC8+CQorCTwvdGFyZ2V0PgorCisJCisJCisJPCEtLSAKKwkJKiBCdWlsZCB0aGUgemlwIGZpbGUgIAorCQkqICAgY29udGFpbnMKKwkJKiAgICAgCisJCSogICAgIGhlbHAvaHRtbC8KKwkJKiAgICAgICBpbmRleC5odG1sCisJCSogICAgICAgdG9jLmh0bWwKKwkJKiAgICAgICAqLmh0bWwgIGFsbCB0aGUgcmNwIGhlbHAgZmlsZXMKKwkJKiAKKwkJLS0+CisJPHRhcmdldCBuYW1lPSJjb3B5aGVscCIgZGVwZW5kcz0iY2xlYW4iIAorCQlkZXNjcmlwdGlvbj0iY3JlYXRlcyB0aGUgemlwIGZpbGUiPgkKKwkJCQkKKwkJPHppcCAKKwkJCWRlc3RmaWxlPSIke3ppcC5uYW1lfSI+CisJCQk8emlwZmlsZXNldCBkaXI9ImhlbHAvaHRtbCIgcHJlZml4PSJoZWxwL2h0bWwiLz4gCSAgICAgIAorCQkJIAorCQk8L3ppcD4KKwk8L3RhcmdldD4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YjE5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoreG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKK3htbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPGxpbmsgcmVsPUZpbGUtTGlzdAoraHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOkRvY3VtZW50UHJvcGVydGllcz4KKyAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KKyAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgorICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+CisgIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+CisgIDxvOlBhZ2VzPjQ8L286UGFnZXM+CisgIDxvOldvcmRzPjE2MjY8L286V29yZHM+CisgIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgorICAgPG86TGluZXM+Nzc8L286TGluZXM+CisgIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KKyAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+CisgIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+CisgPC9vOkRvY3VtZW50UHJvcGVydGllcz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OldvcmREb2N1bWVudD4KKyAgPHc6VHJhY2tSZXZpc2lvbnMvPgorIDwvdzpXb3JkRG9jdW1lbnQ+Cis8L3htbD48IVtlbmRpZl0tLT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlRhaG9tYTsKKwlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKKwltc28tZm9udC1jaGFyc2V0OjA7CisJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7CisJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7CisJbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KK3AuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bXNvLXN0eWxlLXBhcmVudDoiIjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwCisJe21hcmdpbi1yaWdodDowaW47CisJbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CisJbWFyZ2luLWxlZnQ6MGluOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKKwl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZTo4LjBwdDsKKwlmb250LWZhbWlseTpUYWhvbWE7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorQHBhZ2UgU2VjdGlvbjEKKwl7c2l6ZTo4LjVpbiAxMS4waW47CisJbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47CisJbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKKwltc28tZm9vdGVyLW1hcmdpbjouNWluOworCW1zby1wYXBlci1zb3VyY2U6MDt9CitkaXYuU2VjdGlvbjEKKwl7cGFnZTpTZWN0aW9uMTt9CistLT4KKzwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgorPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCitUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAorUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCitPRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCithZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKK3N1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKK2J5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgoraWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KK3N1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCit3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKK2VudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKK2NsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCitvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucworZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KK3JlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50CithIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KK3N0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5CitkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCitSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAorYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCitjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgorb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKK2J5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCit0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCithbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCitSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCitDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgordGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Citmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQordG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKK2lmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKK3RoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQorRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKK3JpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KK3RoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Cis8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK2l0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAorY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQorYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKK2FuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCitlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAoraW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAorYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCitzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0CitDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCitzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCitpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCitjb2RlIGZvcm06PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQorY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQorY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCitvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQorYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycworYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKK29mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAorbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCitDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKK2Nvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCit0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCitjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKK3RvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK3RvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCithbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQoraW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCit3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcworc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCitvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCitjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKK1dJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKK01FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQorUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcworQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKK2VxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgorVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgorVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKK29yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKK2Z1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgorYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAorb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCitzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCitwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQorY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKK3RoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKK0FncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCitzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAorZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCitTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCitBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKK0FncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKK2l0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2NvbmNlcHRzL2V4dGVuc2liaWxpdHkuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9jb25jZXB0cy9leHRlbnNpYmlsaXR5Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZiYzFjOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9jb25jZXB0cy9leHRlbnNpYmlsaXR5Lmh0bWwKQEAgLTAsMCArMSwyMCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+Cis8aGVhZD4KKwk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKwk8dGl0bGU+U1RFTSBDb25jZXB0czwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGgyPkV4dGVuc2liaWxpdHk8L2gyPgorPHA+CitTVEVNIHdhcyBkZXNpZ25lZCBmcm9tIHRoZSB2ZXJ5IGJlZ2lubmluZyB0byBiZSBlYXNpbHkgZXh0ZW5kZWQuICBUaGlzIG1lYW5zCit0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGFkZCBuZXcgZGF0YSBhbmQgY29tcHVhdGF0aW9uYWwgY29tcG9uZW50cyB0byBTVEVNCithbmQgdXNlIHRoZW0gaW4gbmV3IG1vZGVsaW5nIGFwcHJvYWNoZXMgbm90IGV4cGxpY2l0bHkgcHJvdmlkZWQgaW4gdGhlIAorYmFzZSBjb25maWd1cmF0aW9uIG9mIHRoZSBzeXN0ZW0uICBUaGUgY2hvaWNlIG9mIEVjbGlwc2UgYXMgdGhlIGltcGxlbWVudGF0aW9uIAorZnJhbWV3b3JrIGFsbG93cyBTVEVNIHRvIGxldmVyYWdlIHRoZSBmcmFtZXdvcmsncyBzb2Z0d2FyZSBjb21wb25lbnQgYXJjaGl0ZWN0dXJlIHRvCitmYWNpbGxpdGF0ZSB0aGlzLiAgCis8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2NvbmNlcHRzL2ltZy9TY2VuYXJpb0NvbXBvc2l0aW9uLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9jb25jZXB0cy9pbWcvU2NlbmFyaW9Db21wb3NpdGlvbi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlMzgwMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9jb25jZXB0cy9pbWcvU2NlbmFyaW9Db21wb3NpdGlvbi5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTg5NWJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwKQEAgLTAsMCArMSw0MTggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+CisKKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5TVEVNIENvbmNlcHRzPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj5UaGUgU1RFTSBNb2RlbGluZyBGcmFtZXdvcms8L2gyPgorPHA+QXQgaXRzIGNvcmUgU1RFTSBpcyBhIGRpc2NyZXRlIGV2ZW50IHNpbXVsYXRpb24gc3lzdGVtLiBJdAorYmVnaW5zIHdpdGggYW4gaW5pdGlhbCAic2ltdWxhdGlvbiBzdGF0ZSIgYW5kIHRoZW4gcHJvY2VlZHMgaW4gc3RlcC13aXNlCitmYXNoaW9uIHRvIGRldGVybWluZSB0aGUgbmV4dCBzdGF0ZSBvZiB0aGUgU2ltdWxhdGlvbiBhcyBhIGZ1bmN0aW9uIG9mCit0aGUgY3VycmVudCBzdGF0ZSBhbmQgYSBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgdGhlIGN1cnJlbnQgInRpbWUiLiBJdAordXNlcyBhICJncmFwaCIgdG8gcmVwcmVzZW50IHRoZSBzdGF0ZSBvZiB0aGUgU2ltdWxhdGlvbiBhdCBlYWNoIG9mIGl0cworc3RlcHMuPC9wPgorPHA+QSBncmFwaCBpcyBhIHNpbXBsZSwgYnV0IHBvd2VyZnVsLCBtYXRoZW1hdGljYWwgYWJzdHJhY3Rpb24gZm9yCityZXByZXNlbnRpbmcgImVudGl0aWVzIiAoaS5lLiwgdGhpbmdzIGluIHRoZSB3b3JsZCkgYW5kIHRoZWlyCityZWxhdGlvbnNoaXBzLiBNb3JlIGZvcm1hbGx5LCBhIGdyYXBoIGlzIGEgc2V0IG9mICJub2RlcyIsICJlZGdlcyIgYW5kCisibGFiZWxzIiwgd2hlcmUgTm9kZXMgZ2VuZXJhbGx5IGNvcnJlc3BvbmQgdG8gZW50aXRpZXMgYW5kIGVkZ2VzIGxpbmsKK3R3byBub2RlcyBhbmQgcmVwcmVzZW50IHNvbWUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlbS4gTGFiZWxzIGFyZQorYXR0YWNoZWQgdG8gZWl0aGVyIGEgbm9kZSBvciBhbiBlZGdlIGFuZCByZXByZXNlbnQgc29tZSBhc3BlY3Qgb2YgdGhlaXIKK2hvc3QgKGxpa2UgdGhlIG5hbWUgb2YgdGhlIGVudGl0eSwgb3IgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCkuCitFYWNoIG5vZGUgbWF5IGhhdmUgbW9yZSB0aGFuIG9uZSBsYWJlbCwgYnV0IGVhY2ggZWRnZSB3aWxsIG9ubHkgaGF2ZQorb25lLjwvcD4KKworPGg0IGlkPWNhbm9uaWNhbGdyYXBoPlRoZSBDYW5vbmljYWwgR3JhcGg8L2g0PgorPHA+CitJbiBTVEVNLCBub2RlcyB0eXBpY2FsbHkgcmVwcmVzZW50IGdlb2dyYXBoaWMgcmVnaW9ucyB3aGlsZSBlZGdlcyAKK3JlcHJlc2VudCByZWxhdGlvbnNoaXBzIGJldHdlZW4gZ2VvZ3JhcGhpYyByZWdpb25zLiBUaGVyZSBtYXkgYmUgCithbnkgbnVtYmVyIG9mIGVkZ2VzIGJldHdlZW4gYW55IHR3byBub2RlcywgYXMgdGhlcmUgbWF5IGJlIGFueSBudW1iZXIgCitvZiByZWxhdGlvbnNoaXBzIGJldHdlZW4gYW55IHR3byBnZW9ncmFwaGljIGxvY2F0aW9ucy4gQSBsYWJlbCBvbiBhIG5vZGUgCittaWdodCByZXByZXNlbnQgdGhlIHBoeXNpY2FsIGFyZWEgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZ2VvZ3JhcGhpYyBsb2NhdGlvbiwgCit0aGUgbnVtYmVyIG9mIHBvcHVsYXRpb24gbWVtYmVycyBvZiBhIHBhcnRpY3VsYXIgdHlwZSB0aGF0IGxpdmUgdGhlcmUsIAorb3IgYSBtYXRoZW1hdGljYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0YXRlIG9mIGEgcGFydGljdWxhciBkaXNlYXNlIGF0IAordGhhdCBsb2NhdGlvbi4gQW4gZWRnZSBiZXR3ZWVuIHR3byBub2RlcyBtaWdodCByZXByZXNlbnQgYSByZWxhdGlvbnNoaXAgCitzdWNoIGFzIHRoZSBzaGFyaW5nIG9mIGEgY29tbW9uIGJvcmRlciAoaS5lLiwgdHdvIHJlZ2lvbnMgYXJlIHBoeXNpY2FsbHkgCithZGphY2VudCBhbmQgY291bGQgZWFzaWx5IGV4Y2hhbmdlIHBvcHVsYXRpb24gbWVtYmVycyk7IGEgZGlmZmVyZW50IGVkZ2UgCitiZXR3ZWVuIHRoZSBzYW1lIHR3byBub2RlcyBtaWdodCByZXByZXNlbnQgYSByb2FkIHRoYXQgY29ubmVjdHMgdGhlIHR3byAKK2xvY2F0aW9ucy4gIEluIHRoZSBmaXJzdCBjYXNlLCB0aGUgbGFiZWwgZm9yIGEgYm9yZGVyIGVkZ2UgbWlnaHQgcmVjb3JkIAordGhlIGxlbmd0aCBvZiB0aGUgYm9yZGVyIGJldHdlZW4gdGhlIHR3byBsb2NhdGlvbnM7IGluIHRoZSBsYXRlciBjYXNlLCAKK3RoZSBsYWJlbCBtaWdodCBpbmRpY2F0ZSB0aGUgdHlwZSBvZiByb2FkIGFuZCBob3cgbXVjaCB0cmFmZmljIGl0IGNhcnJpZXMuIAorQ29tcGxldGVseSBkaWZmZXJlbnQgZWRnZXMgY291bGQgYWxzbyBleGlzdCwgZm9yIGluc3RhbmNlIG9uZXMgdGhhdCByZXByZXNlbnQgCit0aGUgZmxpZ2h0IHBhdGggb2YgbWlncmF0b3J5IGJpcmRzLiBUaGUgZ3JhcGggdGhhdCBpbmNsdWRlcyBhbGwgb2YgdGhlIG5vZGVzLCAKK2VkZ2VzIGFuZCBsYWJlbHMgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCB0aGUgc3RhdGUgb2YgdGhlIHNpbXVsYXRpb24gaXMgY2FsbGVkIAordGhlIDxlbT5jYW5vbmljYWwgZ3JhcGg8L2VtPi4KKzwvcD4KKzxoNCBpZD1zaW11bGF0aW9uPlNpbXVsYXRpb248L2g0PgorPHA+CitBIDxlbT5TaW11bGF0aW9uPC9lbT4gaW4gU1RFTSBpcyBjcmVhdGVkIGZyb20gYSAKKzxhIGhyZWY9IiNjYW5vbmljYWxncmFwaCI+Y2Fub25pY2FsIGdyYXBoPC9hPi4gIFRoZSBzcGVjaWZpY2F0aW9uIG9mIGhvdwordG8gY3JlYXRlIHRoZSBncmFwaCBpcyByZXByZXNlbnRlZCBieSBhIDxhIGhyZWY9IiNzY2VuYXJpbyI+U2NlbmFyaW88L2E+CisoZGVmaW5lZCBiZWxvdykuICAKKzxwPgorPC9wPgorVGhlIGV4ZWN1dGlvbiBvZiBhIFNpbXVsYXRpb24gYmVnaW5zIHdpdGggYW4gPGVtPmluaXRpYWxpemVkPC9lbT4KK2Nhbm9uaWNhbCBncmFwaCBhbmQgYSBzdGFydGluZyA8ZW0+dGltZTwvZW0+LiBUaGUgZmlyc3Qgc3RlcCBpbiBhCitTaW11bGF0aW9uIGlzIHRvIGRldGVybWluZSB0aGUgbmV4dCBwb2ludCBpbiB0aW1lIHRoYXQgd2lsbCBiZSB1c2VkIHRvCit1cGRhdGUgdGhlIHN0YXRlIG9mIHRoZSA8YSBocmVmPSIjY2Fub25pY2FsZ3JhcGgiPmNhbm9uaWNhbCBncmFwaDwvYT4uIAorV2l0aCB0aGlzIHZhbHVlIGRldGVybWluZWQgdGhlIGludGVybmFsIFNURU0gU2ltdWxhdGlvbiAiZW5naW5lIiBpbnZva2VzLAoraW4gYSB2ZXJ5IHNwZWNpZmljIG9yZGVyLCBhIHNldCBvZiBjb21wdXRhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSAKKzxhIGhyZWY9IiNjYW5vbmljYWxncmFwaCI+Y2Fub25pY2FsIGdyYXBoPC9hPi4gIFRoZXNlCitjb21wdXRhdGlvbnMgdGFrZSB0aGUgdGltZSBwb2ludCBhcyBpbnB1dCBhbmQgY29tcHV0ZSB0aGUgIm5leHQiIHN0YXRlCitvZiB0aGUgZ3JhcGggYXMgaXQgd2lsbCBiZSBhdCB0aGF0IHRpbWUuIFdoZW4gdGhlc2UgY29tcHV0YXRpb25zIGFyZQorY29tcGxldGUsIHRoZSBzdGF0ZSBvZiB0aGUgZW50aXJlIGdyYXBoIGlzIGNoYW5nZWQgdG8gdGhlICJuZXh0IiB2YWx1ZQoranVzdCBjb21wdXRlZC4gVGhpcyBwcm9jZXNzIGNvbnRpbnVlcyB1bnRpbCBzdG9wcGVkIGJ5IHRoZSB1c2VyLCBvciwgaWYKK3NwZWNpZmllZCwgYSBwcmVkZXRlcm1pbmVkIGVuZC10aW1lIGlzIHJlYWNoZWQuPC9wPgorCisKKzxoMz5UaGUgU1RFTSBDb21wb3NpdGlvbmFsIE1vZGVsaW5nIEZyYW1ld29yazwvaDM+Cis8cD5PbmUgb2YgdGhlIG1haW4gZmVhdHVyZXMgb2YgU1RFTSwgYW5kIHRoZSBvbmUgdGhhdCBtYWtlcyBpdCBzdWNoCithIHBvd2VyZnVsIG1vZGVsaW5nIHN5c3RlbSwgaXMgaXRzIGZyYW1ld29yayBmb3Igc3BlY2lmeWluZyB0aGUgZmVhdHVyZXMKK29mIGEgPGEgaHJlZj0iI3NpbXVsYXRpb24iPlNpbXVsYXRpb248L2E+LiBUaGlzIGZyYW1ld29yayBhbGxvd3MgYSAKKzxhIGhyZWY9IiNzaW11bGF0aW9uIj5TaW11bGF0aW9uPC9hPiB0byBiZSBjb21wb3NlZCBmcm9tCittYW55IGRpZmZlcmVudCByZXVzYWJsZSBjb21wb25lbnRzIHRoYXQgYXJlIGNvbWJpbmVkIHRvIGZvcm0gdGhlIAorPGEgaHJlZj0iI3NpbXVsYXRpb24iPlNpbXVsYXRpb24nczwvYT4KKzxhIGhyZWY9IiNjYW5vbmljYWxncmFwaCI+Y2Fub25pY2FsIGdyYXBoPC9hPiwgY29tcHV0YXRpb25hbCBlbGVtZW50cworYW5kIHNlcXVlbmNlIG9mIHRpbWUgcG9pbnRzLgorPC9wPgorPHA+VGhpcyBhcHByb2FjaCBpcyBleHRyZW1lbHkgZmxleGlibGUgYW5kIHBvd2VyZnVsLiBUaGUgY29tcG9uZW50cworY2FuIGJlIGZyb20gbWFueSBkaWZmZXJlbnQgc291cmNlcyBhbmQgY2FuIGJlIGV4Y2hhbmdlZCBhbW9uZyB1c2Vycy4gVGhlCitjb21wb25lbnRzIGNhbiBhbHNvIGJlIGNvbWJpbmVkIHRvIGNyZWF0ZSBsYXJnZXIgc3RydWN0dXJlcyB3aGljaCB0aGVuCitjYW4gYmVjb21lIHJldXNhYmxlIGNvbXBvbmVudHMgdGhlbXNlbHZlcy4gRm9yIGluc3RhbmNlLCBpdCBpcyBwb3NzaWJsZQordG8gY3JlYXRlIGEgZGV0YWlsZWQgbW9kZWwgb2YgYSBjb3VudHJ5IGFuZCB0aGVuIHJldXNlIHRoYXQgbW9kZWwgYXMgYQorY29tcG9uZW50IGluIG1hbnkgZGlmZmVyZW50IDxhIGhyZWY9IiNzaW11bGF0aW9uIj5TaW11bGF0aW9uczwvYT4uIFNpbWlsYXJseSwgY29tcHV0YXRpb25hbAorYXNwZWN0cyBvZiBhIDxhIGhyZWY9IiNzaW11bGF0aW9uIj5TaW11bGF0aW9uPC9hPiBzdWNoIGFzIGEgc3BlY2lhbGl6ZWQgZGlzZWFzZSBtb2RlbCBjYW4gYmUKK2RldmVsb3BlZCBieSBhbiBpbmRpdmlkdWFsIHJlc2VhcmNoZXIgYW5kIHRoZW4gdXNlZCBieSBtYW55IG90aGVycyBpbgordGhlaXIgbW9kZWxzLiBUaGUgYWJpbGl0eSBvZiBTVEVNIHRvIGNvbWJpbmUgY29tcG9uZW50cyBmcm9tIGRpZmZlcmVudAorc291cmNlcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBsZXZlcmFnZSB0aGUgdmFyaWVkIGV4cGVydGlzZSBvZiBkaWZmZXJlbnQKK21vZGVsIGJ1aWxkZXJzIGluIGEgd2F5IHRoYXQgaGFzIG5ldmVyIGJlZm9yZSBiZWVuIHBvc3NpYmxlLjwvcD4KKzxwPlRvIGZvc3RlciByZXVzZSBhbmQgY29sbGFib3JhdGlvbiwgZWFjaCBjb21wb25lbnQgaW4gdGhlCitmcmFtZXdvcmsgaGFzIGEgc2V0IG9mIDxhIGhyZWY9Imh0dHA6Ly9kdWJsaW5jb3JlLm9yZy8iPkR1YmxpbiBDb3JlPC9hPgorbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGl0LiBUaGlzIG1ldGFkYXRhIHJlY29yZHMgaW1wb3J0YW50IGF0dHJpYnV0ZXMKK29mIHRoZSBjb21wb25lbnQgc3VjaCBhcyBpdHMgdGl0bGUsIGRlc2NyaXB0aXZlIHRleHQsIHRoZSBuYW1lIG9mIHRoZQorb3JpZ2luYWwgY3JlYXRvciwgYW55IGxpdGVyYXR1cmUgY2l0YXRpb25zIGFzc29jaWF0ZWQgd2l0aCBpdCAoZS5nLiwgYQorcGFwZXIgZGVzY3JpYmluZyBhIHBhcnRpY3VsYXIgZGlzZWFzZSBtb2RlbCkgYW5kIG1hbnkgb3RoZXJzIHN1Y2ggYXMKK2ltcG9ydGFudCBkYXRlcywgc3BhdGlhbCBjaGFyYWN0ZXJpc3RpY3MuIFRoaXMgaW5mb3JtYXRpb24gYWxsb3dzCittb2RlbGVycyB0byBrbm93IGV4YWN0bHkgd2hhdCB0aGV5IGFyZSB1c2luZyBpbiB0aGVpciBtb2RlbHMuPC9wPgorCisKKzxoMz5TVEVNIENvbXBvbmVudHM8L2gzPgorPHA+VGhlIFNURU0gY29tcG9zaXRpb25hbCBtb2RlbGluZyBmcmFtZXdvcmsgY29uc2lzdHMgb2YgZWlnaHQKK2NvbXBvbmVudHMgdGhhdCBjb25zdGl0dXRlIHRoZSAiYnVpbGRpbmcgYmxvY2tzIiBvZiBhbnkgPGEgaHJlZj0iI3NpbXVsYXRpb24iPlNpbXVsYXRpb248L2E+LgorVGhlc2UgYXJlOiA8ZW0+PGEgaHJlZj0iI3NjZW5hcmlvIj5TY2VuYXJpb3M8L2E+PC9lbT4sIAorPGVtPjxhIGhyZWY9IiNzZXF1ZW5jZXIiPlNlcXVlbmNlcnM8L2E+PC9lbT4sIDxlbT48YSBocmVmPSIjZGVjb3JhdG9yIj5EZWNvcmF0b3JzPC9hPjwvZW0+LCAKKzxlbT48YSBocmVmPSIjbW9kZWwiPk1vZGVsczwvYT48L2VtPiwgPGVtPjxhIGhyZWY9IiNncmFwaCI+IEdyYXBoczwvYT48L2VtPiwKKzxlbT48YSBocmVmPSIjbW9kaWZpZXIiPiBNb2RpZmllcnM8L2E+PC9lbT4sIDxlbT48YSBocmVmPSIjdHJpZ2dlciI+IFRyaWdnZXJzPC9hPjwvZW0+LCBhbmQKKzxlbT48YSBocmVmPSIjcHJlZGljYXRlIj4gUHJlZGljYXRlczwvYT48L2VtPi4gIEluIGFkZGl0aW9uLCAKK2Egc2VxdWVuY2Ugb2YgcmVsYXRlZCA8YSBocmVmPSIjc2ltdWxhdGlvbiI+U2ltdWxhdGlvbnM8L2E+IGNhbGxlZCBhIDxhIGhyZWY9IiNiYXRjaCI+QmF0Y2g8L2E+LCAKK2NhbiBiZSBkZWZpbmVkIHVzaW5nIGNvbXBvbmVudHMgY2FsbGVkIGFuIDxlbT48YSBocmVmPSIjZXhwZXJpbWVudCI+RXhwZXJpbWVudDwvYT48L2VtPiBhbmQgCis8ZW0+PGEgaHJlZj0iI21vZGlmaWVyIj5Nb2RpZmllcjwvYT48L2VtPi4gPC9wPgorCis8aDQgaWQ9c2NlbmFyaW8+U2NlbmFyaW88L2g0PgorPHA+VGhlIG1haW4gY29tcG9uZW50IG9mIGEgPGEgaHJlZj0iI3NpbXVsYXRpb24iPlNpbXVsYXRpb248L2E+IGlzIGEgU2NlbmFyaW8uIFdoZW4gYQorPGEgaHJlZj0iI3NpbXVsYXRpb24iPlNpbXVsYXRpb248L2E+IGlzIHJ1biBpbiBTVEVNLCBpdCBpcyBhbHdheXMgY3JlYXRlZCBmcm9tIGEgU2NlbmFyaW8uIEEKK1NjZW5hcmlvIGxvZ2ljYWxseSBjb2xsZWN0cyB0b2dldGhlciB0aHJlZSBvdGhlciB0eXBlcyBvZiBjb21wb25lbnRzLCBhCitzaW5nbGUgPGEgaHJlZj0iI3NlcXVlbmNlciI+U2VxdWVuY2VyPC9hPiwgYSBzZXQgb2YgPGEgaHJlZj0iI2RlY29yYXRvciI+CitEZWNvcmF0b3JzPC9hPiwgYW5kIGEgc2luZ2xlIDxhIGhyZWY9IiNtb2RlbCI+IE1vZGVsPC9hPi4gVG9nZXRoZXIsIHRoZXNlCitjb21wb25lbnRzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIDxhIGhyZWY9IiNzaW11bGF0aW9uIj5TaW11bGF0aW9uPC9hPi48L3A+Cis8L3A+Cis8cD4KK0EgU2NlbmFyaW8gY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIAorPGEgaHJlZj0iLi4vaW50ZXJmYWNlL3dpemFyZHMvc2NlbmFyaW93aXphcmQuaHRtbCI+U2NlbmFyaW8gV2l6YXJkPC9hPiBhbmQgCitlZGl0ZWQgdXNpbmcgdGhlIDxhIGhyZWY9Ii4uL2ludGVyZmFjZS9lZGl0b3JzL3NjZW5hcmlvZWRpdG9yLmh0bWwiPlNjZW5hcmlvIEVkaXRvcjwvYT4uCis8L3A+Cis8aDQgaWQ9c2VxdWVuY2VyPlNlcXVlbmNlcjwvaDQ+Cis8cD5BIFNlcXVlbmNlciBpcyB0aGUgY29tcG9uZW50IG9mIGEgPGEgaHJlZj0iI3NpbXVsYXRpb24iPlNpbXVsYXRpb248L2E+IHRoYXQgZGV0ZXJtaW5lcyB0aGUKK3NlcXVlbmNlIG9mIHRpbWUgdmFsdWVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIG5leHQgc3RhdGUgb2YKK3RoZSA8YSBocmVmPSIjY2Fub25pY2FsZ3JhcGgiPmNhbm9uaWNhbCBncmFwaDwvYT4uIEl0IG1heSBwcm9kdWNlIHZhbHVlcwordGhhdCBhcmUgYXQgZml4ZWQgaW50ZXJ2YWxzIG9mIHRpbWUsIG9yIGl0IG1heSB2YXJ5IHRoZSBkdXJhdGlvbiBvZiB0aGUKK2ludGVydmFscyBiZXR3ZWVuIHBvaW50cy4gVGhlIHZhbHVlcyBpdCBjcmVhdGVzIGFyZSBpbiBzaW11bGF0ZWQgIlNURU0KK1RpbWUiLCBidXQgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gcHJldmVudGluZyB0aGUgdmFsdWVzIGZyb20gcmVmbGVjdGluZworIndhbGwgY2xvY2siIHRpbWUuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgIlNpbXVsYXRpb25zIiB0aGF0IGluY29ycG9yYXRlCitleHRlcm5hbCAicmVhbC10aW1lIiBkYXRhIHZhbHVlcyBmcm9tIGRhdGFiYXNlcyBvciBvdGhlciBzb3VyY2VzIHN1Y2ggYXMKK3dlYXRoZXIgb2JzZXJ2YXRpb25zLjwvcD4KKzwvcD4KKzxwPgorQSBTZXF1ZW5jZXIgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIAorPGEgaHJlZj0iLi4vaW50ZXJmYWNlL3dpemFyZHMvc2VxdWVudGlhbHNlcXVlbmNlcndpemFyZC5odG1sIj5TZXF1ZW50aWFsIFNlcXVlbmNlciBXaXphcmQ8L2E+IG9yIHRoZQorPGEgaHJlZj0iLi4vaW50ZXJmYWNlL3dpemFyZHMvcmVhbHRpbWVzZXF1ZW5jZXJ3aXphcmQuaHRtbCI+UmVhbC10aW1lIFNlcXVlbmNlciBXaXphcmQ8L2E+CithbmQgZWRpdGVkIHVzaW5nIHRoZSA8YSBocmVmPSIuLi9pbnRlcmZhY2UvZWRpdG9ycy9zZXF1ZW5jZXJlZGl0b3IuaHRtbCI+U2VxdWVuY2VyIEVkaXRvcjwvYT4uCis8L3A+Cis8aDQgaWQ9ZGVjb3JhdG9yPkRlY29yYXRvcjwvaDQ+Cis8cD5BIERlY29yYXRvciBpcyB0aGUgZnJhbWV3b3JrJ3MgY29tcHV0YXRpb25hbCBjb21wb25lbnQuIEV2ZXJ5CitEZWNvcmF0b3IgY2FuIHBhcnRpY2lwYXRlIGluIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgCis8YSBocmVmPSIjY2Fub25pY2FsZ3JhcGgiPmNhbm9uaWNhbCBncmFwaDwvYT4sIGZvciBpbnN0YW5jZSBieSBzZXR0aW5nIHRoZQordmFsdWVzIG9mIGV4aXN0aW5nIGxhYmVscyBvciBhZGRpbmcgYWRkaXRpb25hbCBvbmVzIChpLmUuLCB0aGV5CisiZGVjb3JhdGUiIHRoZSBncmFwaCkuIEFsc28sIGF0IGVhY2ggc2ltdWxhdGlvbiBjeWNsZSwgdGhleSBhcmUKK3Jlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgbmV4dCBzdGF0ZSBvZiB0aGUgCis8YSBocmVmPSIjY2Fub25pY2FsZ3JhcGgiPmNhbm9uaWNhbCBncmFwaDwvYT4gYnkgY29tcHV0aW5nIHRoZSB2YWx1ZXMgb2YKK2xhYmVscyBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBjdXJyZW50IDxhIGhyZWY9IiNzaW11bGF0aW9uIj5TaW11bGF0aW9uPC9hPiAKK3RpbWUuIEluIGFuIGVwaWRlbWlvbG9naWNhbCA8YSBocmVmPSIjc2ltdWxhdGlvbiI+U2ltdWxhdGlvbjwvYT4sIGEgCitkaXNlYXNlIG1vZGVsIHdvdWxkIGJlIGltcGxlbWVudGVkIGFzIGEgRGVjb3JhdG9yLiBUaGVyZSBpcyBubyByZXN0cmljdGlvbiAKK29uIHdoYXQgYSBEZWNvcmF0b3IgY2FuIGRvLCBpdCBjYW4sIGZvciBpbnN0YW5jZSwgaXNzdWUgYSBxdWVyeSB0byBhIAorZGF0YWJhc2Ugb3IgaW52b2tlIGEgd2ViIHNlcnZpY2UuPC9wPgorCis8aDQgaWQ9bW9kZWw+TW9kZWw8L2g0PgorPHA+QSBNb2RlbCBpcyB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciByZXByZXNlbnRpbmcgdGhlCitjb250ZW50cyBvZiB0aGUgPGEgaHJlZj0iI2Nhbm9uaWNhbGdyYXBoIj5jYW5vbmljYWwgZ3JhcGg8L2E+IGFuZCBmb3IKK2NyZWF0aW5nIGFuIGluc3RhbmNlIG9mIGl0IHdoZW4gYSA8YSBocmVmPSIjc2ltdWxhdGlvbiI+U2ltdWxhdGlvbjwvYT4gCitpcyBzdGFydGVkIGZyb20gYSA8YSBocmVmPSIjc2NlbmFyaW8iPlNjZW5hcmlvPC9hPi4gSXQgY29tYmluZXMgd2l0aCAKK3RoZSBmaW5hbCBjb21wb25lbnQgb2YgdGhlIGZyYW1ld29yayBjYWxsZWQgYSA8YSBocmVmPSIjZ3JhcGgiPkdyYXBoPC9hPiAKK3RvIGZvcm0gYSB0cmVlLiBUaGlzIHRyZWUgaXMgYSBoaWVyYXJjaGljYWwgb3JnYW5pemF0aW9uIG9mIHRoZSBkaWZmZXJlbnQKK2NvbnRyaWJ1dGlvbnMgdG8gdGhlIDxhIGhyZWY9IiNjYW5vbmljYWxncmFwaCI+Y2Fub25pY2FsIGdyYXBoPC9hPi4KK01vZGVsIGluc3RhbmNlcyBmb3JtIHRoZSByb290IGFuZCBpbnRlcmlvciBub2RlcyBvZiB0aGUgdHJlZSB3aGlsZSAKKzxhIGhyZWY9IiNncmFwaCI+IEdyYXBoPC9hPiBpbnN0YW5jZXMgZm9ybSB0aGUgbGVhdmVzLiBUaGUgTW9kZWwKK3JlZmVyZW5jZWQgYnkgYSA8YSBocmVmPSIjc2NlbmFyaW8iPlNjZW5hcmlvPC9hPiBpcyB0aGUgcm9vdCBvZiBzdWNoIGEKK3RyZWUuPC9wPgorPHA+RWFjaCBNb2RlbCBjb250YWlucyB0aHJlZSBkaWZmZXJlbnQgY29sbGVjdGlvbnMuIFRoZSBmaXJzdCBpcyBhCitjb2xsZWN0aW9uIG9mICJzdWItTW9kZWwiIGluc3RhbmNlcywgZWFjaCBvZiB3aGljaCBpcyBlc3NlbnRpYWxseSB0aGUKK3Jvb3Qgb2YgYSBzdWItdHJlZS4gVGhlIHNlY29uZCBpcyBhIGNvbGxlY3Rpb24gb2YgCis8YSBocmVmPSIjZ3JhcGgiPiBHcmFwaDwvYT4gaW5zdGFuY2VzLCBhbmQgdGhlIHRoaXJkIGlzIGFub3RoZXIgY29sbGVjdGlvbgorb2YgPGEgaHJlZj0iI2RlY29yYXRvciI+IERlY29yYXRvcnM8L2E+LjwvcD4KKzwvcD4KKzxwPgorQSBNb2RlbCBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUgCis8YSBocmVmPSIuLi9pbnRlcmZhY2Uvd2l6YXJkcy9tb2RlbHdpemFyZC5odG1sIj5Nb2RlbCBXaXphcmQ8L2E+IGFuZCAKK2VkaXRlZCB1c2luZyB0aGUgPGEgaHJlZj0iLi4vaW50ZXJmYWNlL2VkaXRvcnMvbW9kZWxlZGl0b3IuaHRtbCI+TW9kZWwgRWRpdG9yPC9hPi4KKzwvcD4KKzxoNCBpZD1ncmFwaD5HcmFwaDwvaDQ+Cis8cD5HcmFwaCBpbnN0YW5jZXMgY29udGFpbiB0aGUgYWN0dWFsIGNvbXBvbmVudHMsIE5vZGVzLCBFZGdlcywgYW5kCitMYWJlbHMsIHRoYXQgZXZlbnR1YWxseSB3aWxsIGJlIGNvbnRyaWJ1dGVkIHRvIGEgCis8YSBocmVmPSIjY2Fub25pY2FsZ3JhcGgiPmNhbm9uaWNhbCBncmFwaDwvYT4uIEluIHRoZSBjb21wb3NpdGlvbmFsCitmcmFtZXdvcmssIEdyYXBoIGluc3RhbmNlcyBhcmUgbm90IHRydWUgbWF0aGVtYXRpY2FsICJncmFwaHMiLCB0aGV5IGFyZQorYmV0dGVyIGRlc2NyaWJlZCBhcyAiZ3JhcGggZnJhZ21lbnRzIiBhcyB0aGV5IG1heSBjb250YWluIHVucmVzb2x2ZWQKK3NldHMgb2YgRWRnZXMgb3IgTGFiZWxzIChhbmQgbm8gTm9kZXMpLiBXaGVuIHRoZSAKKzxhIGhyZWY9IiNjYW5vbmljYWxncmFwaCI+Y2Fub25pY2FsIGdyYXBoPC9hPiBpcyBjcmVhdGVkLCB0aGVzZSBmcmFnbWVudHMKK2FyZSBjb21iaW5lZCBhbmQgdGhlaXIgY29udGVudCdzIGNvbm5lY3Rpb25zIGV2ZW50dWFsbHkgcmVzb2x2ZWQgKGkuZS4sCitFZGdlcyBhbmQgTGFiZWxzIHdpbGwgYmUgbWF0ZWQgd2l0aCB0aGVpciBhcHByb3ByaWF0ZSAibWlzc2luZyIgTm9kZXMpLgorVGhlIHJlc3VsdGluZyA8YSBocmVmPSIjY2Fub25pY2FsZ3JhcGgiPmNhbm9uaWNhbCBncmFwaDwvYT4gaXMgYSB0cnVlCittYXRoZW1hdGljYWwgZ3JhcGguPC9wPgorPC9wPgorPHA+CitBIEdyYXBoIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSAKKzxhIGhyZWY9Ii4uL2ludGVyZmFjZS93aXphcmRzL2dyYXBod2l6YXJkLmh0bWwiPkdyYXBoIFdpemFyZDwvYT4gYW5kIAorZWRpdGVkIHVzaW5nIHRoZSA8YSBocmVmPSIuLi9pbnRlcmZhY2UvZWRpdG9ycy9ncmFwaGVkaXRvci5odG1sIj5HcmFwaCBFZGl0b3I8L2E+LgorPC9wPgorPGg0IGlkPWxhYmVsPkxhYmVsPC9oND4KKzxwPkxhYmVscyBwbGF5IGEgc3BlY2lhbCByb2xlIGluIHRoZSBmcmFtZXdvcmsgaW4gdGhhdCB0aGV5IGNhbgorc3RvcmUgdHdvIHN0YXRlIHZhbHVlcyBzaW11bHRhbmVvdXNseS4gVGhleSBoYXZlIGEgImN1cnJlbnQiIHZhbHVlCit3aGljaCwgY29sbGVjdGl2ZWx5LCByZWNvcmRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBncmFwaC4gVGhleSBjYW4KK2Fsc28gaGF2ZSBhICJuZXh0IiB2YWx1ZSB3aGljaCBpcyB1c2VkLCBjb2xsZWN0aXZlbHksIHRvIHN0b3JlIHRoZSBuZXh0CitzdGF0ZSBvZiB0aGUgZ3JhcGguPC9wPgorCis8aDQgaWQ9bW9kZWxkZWNvcmF0b3JzPk1vZGVsIERlY29yYXRvcnM8L2g0PgorPHA+VGhlIGNvbGxlY3Rpb24gb2YgPGEgaHJlZj0iI2RlY29yYXRvciI+IERlY29yYXRvcnM8L2E+IHRoYXQgbWF5CitleGlzdCBpbiBlYWNoIDxhIGhyZWY9IiNtb2RlbCI+IE1vZGVsPC9hPiBpcyBzaW1pbGFyIHRvIHRoYXQgY29udGFpbmVkCitpbiBhIDxhIGhyZWY9IiNzY2VuYXJpbyI+U2NlbmFyaW88L2E+IGluc3RhbmNlLiBJdHMgY29udGVudHMgcmVwcmVzZW50cwordGhlIGNvbXB1dGF0aW9uYWwgY29tcG9uZW50IG9mIHRoZSA8YSBocmVmPSIjbW9kZWwiPiBNb2RlbDwvYT4uIFRoZQorZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSA8YSBocmVmPSIjbW9kZWxkZWNvcmF0b3JzIj4gTW9kZWwgRGVjb3JhdG9yczwvYT4KK2FyZSBvbmx5IGFibGUgdG8gbW9kaWZ5IHRoZSBwYXJ0cyBvZiB0aGUgPGEgaHJlZj0iI2Nhbm9uaWNhbGdyYXBoIj5jYW5vbmljYWwKK2dyYXBoPC9hPiB0aGF0IGFyZSBjb250cmlidXRlZCBieSB0aGUgdHJlZSByb290ZWQgYXQgdGhlIDxhIGhyZWY9IiNtb2RlbCI+CitNb2RlbDwvYT4uIFRoZSA8YSBocmVmPSIjZGVjb3JhdG9yIj4gRGVjb3JhdG9yczwvYT4gaW4gdGhlIDxhCisJaHJlZj0iI3NjZW5hcmlvIj5TY2VuYXJpbzwvYT4sIGJlaW5nIGFib3ZlIHRoZSByb290IG9mIHRoZSB0cmVlLCBhcmUKK2FibGUgdG8gYWNjZXNzIHRoZSBlbnRpcmUgPGEgaHJlZj0iI2Nhbm9uaWNhbGdyYXBoIj5jYW5vbmljYWwgZ3JhcGg8L2E+LgorVGhlcmUgaXMgYWxzbyBhIHN0cmljdCBleGVjdXRpb24gb3JkZXIgb2YgPGEgaHJlZj0iI21vZGVsZGVjb3JhdG9ycyI+CitNb2RlbCBEZWNvcmF0b3JzPC9hPi4gVGhlIG9uZXMgdGhhdCBhcmUgY29udHJpYnV0ZWQgbG93ZXIgaW4gdGhlIHRyZWUgYXJlCitpbnZva2VkIGJlZm9yZSBvbmVzIGNvbnRyaWJ1dGVkIGFib3ZlIHRoZW0uIDxhIGhyZWY9IiNzY2VuYXJpbyI+U2NlbmFyaW88L2E+Cis8YSBocmVmPSIjZGVjb3JhdG9yIj4gRGVjb3JhdG9yczwvYT4gYXJlIGludm9rZWQgbGFzdC4gVGhlIG9yZGVyIG9mCitpbnZvY2F0aW9uIGZvciA8YSBocmVmPSIjZGVjb3JhdG9yIj4gRGVjb3JhdG9yczwvYT4gYXQgdGhlIHNhbWUgImxldmVsIgoraXMgYXJiaXRyYXJ5LjwvcD4KKworPHA+QSA8YSBocmVmPSIjbW9kZWxkZWNvcmF0b3JzIj4gTW9kZWwgRGVjb3JhdG9yPC9hPiB3b3VsZCB0eXBpY2FsbHkKK2JlIHNvbWUgY29tcHV0YXRpb24gdGhhdCBuZWVkcyB0byBiZSBleGVjdXRlZCBmb3IgZWFjaCBjeWNsZSBvZiB0aGUKKzxhIGhyZWY9IiNzaW11bGF0aW9uIj5TaW11bGF0aW9uPC9hPiwgd2hpbGUgYSA8YSBocmVmPSIjc2NlbmFyaW8iPlNjZW5hcmlvPC9hPiA8YQorCWhyZWY9IiNkZWNvcmF0b3IiPiBEZWNvcmF0b3I8L2E+IHdvdWxkIHR5cGljYWxseSBiZSB1c2VkIHRvIG1vZGlmeSB0aGUKK2luaXRpYWwgc3RhdGUgb2YgdGhlIDxhIGhyZWY9IiNjYW5vbmljYWxncmFwaCI+Y2Fub25pY2FsIGdyYXBoPC9hPiB0bworY3VzdG9taXplIGl0IGZvciBhIHBhcnRpY3VsYXIgIiNzY2VuYXJpbyIuIEZvciBleGFtcGxlLCBpbiBhbgorZXBpZGVtaW9sb2dpY2FsIDxhIGhyZWY9IiNzaW11bGF0aW9uIj5TaW11bGF0aW9uPC9hPiwgYSBkaXNlYXNlIG1vZGVsIAord291bGQgYmUgYWRkZWQgdG8gYQorPGEgaHJlZj0iI3NpbXVsYXRpb24iPlNpbXVsYXRpb248L2E+IGFzIGEgPGEgaHJlZj0iI21vZGVsZGVjb3JhdG9ycyI+IAorTW9kZWwgRGVjb3JhdG9yPC9hPiB3aGlsZQordGhlIGV4YWN0IGxvY2F0aW9uIG9mIGFuIG91dGJyZWFrIG9mIGEgZGlzZWFzZSB3b3VsZCBiZSBhZGRlZCB0byB0aGUKKzxhIGhyZWY9IiNzaW11bGF0aW9uIj5TaW11bGF0aW9uPC9hPiBieSBhIDxhIGhyZWY9IiNzY2VuYXJpbyI+U2NlbmFyaW88L2E+IAorPGEgaHJlZj0iI2RlY29yYXRvciI+CitEZWNvcmF0b3I8L2E+LiBNYW55IGRpZmZlcmVudCA8YSBocmVmPSIjc2NlbmFyaW8iPlNjZW5hcmlvPC9hPiBpbnN0YW5jZXMKK2NvdWxkIHJlZmVyIHRvIHRoZSBzYW1lIDxhIGhyZWY9IiNtb2RlbCI+IE1vZGVsPC9hPiAod2l0aCBpdHMgZGlzZWFzZQorbW9kZWwpLCBidXQgcHJvdmlkZSBkaWZmZXJlbnQgPGEgaHJlZj0iI2RlY29yYXRvciI+IERlY29yYXRvcnM8L2E+IHRvCitzcGVjaWZ5IGRpZmZlcmVudCBzdGFydGluZyBsb2NhdGlvbnMuPC9wPgorPHA+PGEgaHJlZj0iI2RlY29yYXRvciI+IERlY29yYXRvcnM8L2E+IHR5cGljYWxseSBjb21wdXRlIHRoZSBuZXh0Cit2YWx1ZSBmb3IgTGFiZWxzIGluIHRoZSA8YSBocmVmPSIjY2Fub25pY2FsZ3JhcGgiPmNhbm9uaWNhbCBncmFwaDwvYT4gYXMKK2EgZnVuY3Rpb24gb2YgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGdyYXBoIGFuZCB0aGUgdGltZS48L3A+Cis8cD5UaGUgRmlndXJlIGJlbG93IGlsbHVzdHJhdGVzIGhvdyB0aGVzZSBjb21wb25lbnRzIGFyZSBjb21iaW5lZCB0bworY3JlYXRlIGEgPGEgaHJlZj0iI21vZGVsIj4gTW9kZWw8L2E+IHRoYXQgaXMgdXNlZCBieSB0d28gZGlmZmVyZW50IDxhCitocmVmPSIjc2NlbmFyaW8iPiBTY2VuYXJpb3M8L2E+LjwvcD4KKzxwPjxpbWcgc3JjPSJpbWcvU2NlbmFyaW9Db21wb3NpdGlvbi5qcGciIC8+PC9wPgorCis8aDQgaWQ9ZXhwZXJpbWVudD5FeHBlcmltZW50PC9oND4KKzxwPgorQW4gRXhwZXJpbWVudCBpcyBhIHNwZWNpZmljYXRpb24gb2YgaG93IHRvIHRha2UgYSA8ZW0+YmFzZTwvZW0+IAorPGEgaHJlZj0iI3NjZW5hcmlvIj5TY2VuYXJpbzwvYT4gYW5kIHN5c3RlbWF0aWNhbGx5IG1vZGlmeSBpdCB0byBjcmVhdGUgCithbmQgcnVuIGEgc2VxdWVuY2Ugb2YgcmVsYXRlZCA8YSBocmVmPSIjc2ltdWxhdGlvbiI+U2ltdWxhdGlvbnM8L2E+LiAgCitGb3IgaW5zdGFuY2UsIG9uZSBtaWdodCB3YW50Cit0byBleHBsb3JlIHRoZSBlZmZlY3Qgb2YgZGlmZmVyZW50IHRyYW5zbWlzc2lvbiByYXRlcyBmb3IgYSBkaXNlYXNlIGluIGEgCitwYXJ0aWN1bGFyIDxhIGhyZWY9IiNzY2VuYXJpbyI+U2NlbmFyaW88L2E+LiAgQW4gRXhwZXJpbWVudCBhbGxvd3Mgb25lIAordG8gc3BlY2lmeSB0aGUgKGJhc2UpIDxhIGhyZWY9IiNzY2VuYXJpbyI+U2NlbmFyaW88L2E+IGFuZCBhIGNvbGxlY3Rpb24gCitvZiAgPGEgaHJlZj0iI21vZGlmaWVyIj5Nb2RpZmllcnM8L2E+IHRoYXQga25vdyBob3cgdG8gbW9kaWZ5IGl0IGluIAorc3BlY2lmaWMgd2F5cy4gIFRoZSBtb2RpZmllZCA8YSBocmVmPSIjc2NlbmFyaW8iPlNjZW5hcmlvPC9hPiBpbnN0YW5jZXMgCitjYW4gdGhlbiBiZSB1c2VkIHRvIGNyZWF0ZSA8YSBocmVmPSIjc2ltdWxhdGlvbiI+U2ltdWxhdGlvbnM8L2E+LiAKKzwvcD4KKzxwPgorVG8gaW5pdGlhdGUgdGhlIGNyZWF0aW9uIG9mIHRoZSBkZXJpdmF0aXZlIDxhIGhyZWY9IiNzY2VuYXJpbyI+U2NlbmFyaW9zPC9hPgorYW5kIHN1YnNlcXVlbnQgPGEgaHJlZj0iI3NpbXVsYXRpb24iPlNpbXVsYXRpb25zPC9hPiwgYW4gRXhwZXJpbWVudCBjYW4gCitiZSBydW4ganVzdCBsaWtlIGEgPGEgaHJlZj0iI3NjZW5hcmlvIj5TY2VuYXJpbzwvYT4gdG8gY3JlYXRlIGEgdHlwZSBvZiAKK2V4ZWN1dGlvbiB1bml0IGNhbGxlZCBhIDxhIGhyZWY9IiNiYXRjaCI+QmF0Y2g8L2E+LiAgCis8L3A+Cis8cD4KK0FuIEV4cGVyaW1lbnQgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIAorPGEgaHJlZj0iLi4vaW50ZXJmYWNlL3dpemFyZHMvZXhwZXJpbWVudHdpemFyZC5odG1sIj5FeHBlcmltZW50IFdpemFyZDwvYT4gYW5kIAorZWRpdGVkIHVzaW5nIHRoZSA8YSBocmVmPSIuLi9pbnRlcmZhY2UvZWRpdG9ycy9leHBlcmltZW50ZWRpdG9yLmh0bWwiPkV4cGVyaW1lbnQgRWRpdG9yPC9hPi4KKzwvcD4KKzxoNCBpZD1tb2RpZmllcj5Nb2RpZmllcjwvaDQ+Cis8cD4KK0EgTW9kaWZpZXIgaXMgYSBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0byBzeXN0ZW1hdGljYWxseSBjaGFuZ2UgdGhlIHZhbHVlcworb2Ygb25lIG9yIG1vcmUgZmVhdHVyZXMgb2YgYSA8YSBocmVmPSIjc2NlbmFyaW8iPlNjZW5hcmlvPC9hPi4gIFRoZXJlIGFyZSAKK3R3byB0eXBlcyBvZiBNb2RpZmllcnMuIEEgPGEgaHJlZj0iI3JhbmdlbW9kaWZpZXIiPlJhbmdlIE1vZGlmaWVyPC9hPiAgCittb2RpZmllcyBudW1lcmljIGZlYXR1cmVzIGJ5IGFzc2lnbmluZyB0aGVtIHZhbHVlcyBmcm9tIGEgc3BlY2lmaWVkICJyYW5nZSIgCitvZiB2YWx1ZXMsIHdoaWxlIGEgPGEgaHJlZj0iI3NlcXVlbmNlbW9kaWZpZXIiPlNlcXVlbmNlIE1vZGlmaWVyPC9hPiAKK21vZGlmaWVzIGZlYXR1cmVzIGJ5IGFzc2lnbmluZyB0aGVtIHN1Y2Nlc3NpdmUgdmFsdWVzIGZyb20gYSBwcmVzcGVjaWZpZWQgCitvcmRlcmVkIGNvbGxlY3Rpb24uCis8L3A+Cis8cD4KK0EgTW9kaWZpZXIgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIAorPGEgaHJlZj0iLi4vaW50ZXJmYWNlL3dpemFyZHMvbW9kaWZpZXJ3aXphcmQuaHRtbCI+TW9kaWZpZXIgV2l6YXJkPC9hPiBhbmQgCitlZGl0ZWQgdXNpbmcgdGhlIDxhIGhyZWY9Ii4uL2ludGVyZmFjZS9lZGl0b3JzL21vZGlmZXJlZGl0b3IuaHRtbCI+TW9kaWZpZXIgRWRpdG9yPC9hPi4KKzwvcD4KKzxoNCBpZD1yYW5nZW1vZGlmaWVyPlJhbmdlIE1vZGlmaWVyPC9oND4KKzxwPgorQSBSYW5nZSBNb2RpZmllciBzcGVjaWZpZXMgYSByYW5nZSBvZiB2YWx1ZXMgZm9yIGEgbnVtZXJpYyBmZWF0dXJlIGFuZCBhbgoraW5jcmVtZW50IHZhbHVlLiAgSXQgbW9kaWZpZXMgYSBudW1lcmljIGZlYXR1cmUgYnkgZmlyc3QgYXNzaWduaW5nIGl0IGEKK3N0YXJ0aW5nIHZhbHVlIGFuZCB0aGVuIGl0IHN1YnNlcXVlbnRseSBhc3NpZ25zIHZhbHVlcyBnZW5lcmF0ZWQgYnkgYWRkaW5nCithbiBpbmNyZW1lbnQgdmFsdWUgdG8gdGhlIHByZXZpb3VzbHkgYXNzaWduZWQgdmFsdWUgdW50aWwgdGhlIHJlc3VsdCBleGNlZWRzCithIHNwZWNpZmllZCBlbmQgdmFsdWUuICBJZiB0aGUgc3RhcnQgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBlbmQgdmFsdWUsIAordGhlbiB0aGUgaW5jcmVtZW50IG11c3QgYmUgbmVnYXRpdmUuCis8L3A+Cis8aDQgaWQ9c2VxdWVuY2Vtb2RpZmllcj5TZXF1ZW5jZSBNb2RpZmllcjwvaDQ+Cis8cD4KK0EgU2VxdWVuY2UgTW9kaWZpZXIgc3BlY2lmaWVzIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIGZvciBhbiBhcmJpdHJhcnkgZmVhdHVyZS4KK0l0IG1vZGlmaWVzIHRoZSBmZWF0dXJlIGJ5IGFzc2lnbmluZyBpdCwgaW4gc2VxdWVudGlhbCBvcmRlciwgdGhlIHZhbHVlcyAKK2luIHRoZSBzZXF1ZW5jZS4KKzwvcD4KKzxoNCBpZD10cmlnZ2VyPlRyaWdnZXI8L2g0PgorPHA+CitBIFRyaWdnZXIgaXMgYSBzcGVjaWFsIGtpbmQgb2YgPGEgaHJlZj0iI2RlY29yYXRvciI+RGVjb3JhdG9yPC9hPiB0aGF0IGNvbWJpbmVzIAorYSA8YSBocmVmPSIjcHJlZGljYXRlIj5QcmVkaWNhdGU8L2E+IHdpdGggYSByZWZlcmVuY2UgdG8gYW5vdGhlciAKKzxhIGhyZWY9IiNkZWNvcmF0b3IiPkRlY29yYXRvcjwvYT4uICBJdHMgcm9sZSBpcyB0byBjb25kaXRpb25hbGx5IGV4ZWN1dGUgdGhlCis8YSBocmVmPSIjZGVjb3JhdG9yIj5EZWNvcmF0b3I8L2E+IGl0IHJlZmVyZW5jZXMgaWYgY2VydGFpbiBjb25kaXRpb25zIGV4aXN0IAoraW4gdGhlIDxhIGhyZWY9IiNzaW11bGF0aW9uIj5TaW11bGF0aW9uPC9hPi4gIFR5cGljYWxseSwgdGhlIAorPGEgaHJlZj0iI2RlY29yYXRvciI+RGVjb3JhdG9yPC9hPiByZWZlcmVuY2VkIGJ5IHRoZSBUcmlnZ2VyIHdpbGwgYmUgYSAKKzxhIGhyZWY9IiNtb2RpZmllciI+TW9kaWZpZXI8L2E+IHdoaWNoIHdpbGwgYmUgY29uZmlndXJlZCB0byBhbHRlciBzb21lIGFzcGVjdCBvZiB0aGUKK3J1bm5pbmcgPGEgaHJlZj0iI3NpbXVsYXRpb24iPlNpbXVsYXRpb248L2E+LiAgRm9yIGluc3RhbmNlLCBhIAorPGEgaHJlZj0iI21vZGlmaWVyIj5Nb2RpZmllcjwvYT4gY291bGQgY2hhbmdlIHRoZSB2YWx1ZXMgb24gPGEgaHJlZj0iI2xhYmVsIj5MYWJlbHM8L2E+CitvbiBhbiA8YSBocmVmPSIjZWRnZSI+RWRnZTwvYT4gb3IgPGEgaHJlZj0iI25vZGUiPk5vZGU8L2E+IGluIHRoZSAKKzxhIGhyZWY9IiNjYW5vbmljYWxncmFwaCI+Y2Fub25pY2FsIGdyYXBoPC9hPi4gIFRob3NlIHZhbHVlcyBjb3VsZCByZXByZXNlbnQgc3VjaAordGhpbmdzIGFzIHRoZSBvcGVyYXRpb25hbCBzdGF0dXMgb2YgYW4gYWlycG9ydCwgb3IgdGhlIHN0YXR1cyAob3BlbiBvciBjbG9zZWQpIG9mCithIHJvYWQgYmV0d2VlbiB0d28gcmVnaW9ucy4gIEEgbW9kaWZpZXIgY2FuIGFsc28gbW9kaWZ5IGFub3RoZXIgCis8YSBocmVmPSIjZGVjb3JhdG9yIj5EZWNvcmF0b3I8L2E+IGFjdGl2ZSBpbiBhIDxhIGhyZWY9IiNzaW11bGF0aW9uIj5TaW11bGF0aW9uPC9hPi4KK0FuIGV4YW1wbGUgd291bGQgYmUgY2hhbmdpbmcgdGhlIGNvbmZpZ3VyYXRpb24gdmFsdWVzIG9mIGEgRGlzZWFzZSBNb2RlbC4KKzwvcD4KKzxwPgorVGhlIG9wZXJhdGlvbiBvZiBhIFRyaWdnZXIgaXMgY29uY2VwdHVhbGx5IHNpbXBsZSwgb24gZWFjaCBzaW11bGF0aW9uIGN5Y2xlLCAKK3RoZSBUcmlnZ2VycyBjb250YWluZWQgYnkgYSAgPGEgaHJlZj0iI3NjZW5hcmlvIj5TY2VuYXJpbzwvYT4KK2FyZSBleGVjdXRlZCwganVzdCBsaWtlIHRoZSBvdGhlciA8YSBocmVmPSIjZGVjb3JhdG9yIj5EZWNvcmF0b3JzPC9hPiwgdG8gdXBkYXRlIAordGhlIDxhIGhyZWY9IiNjYW5vbmljYWxncmFwaCI+Y2Fub25pY2FsIGdyYXBoPC9hPi4gIFRoZSBmaXJzdCB0aGluZyB0aGUgVHJpZ2dlciAKK2RvZXMgaXMgZXZhbHVhdGUgdGhlIDxhIGhyZWY9IiNwcmVkaWNhdGUiPlByZWRpY2F0ZTwvYT4gaXQgcmVmZXJlbmNlcy4gIElmIHRoZSAKKzxhIGhyZWY9IiNwcmVkaWNhdGUiPlByZWRpY2F0ZTwvYT4gZXZhbHVhdGVzIHRvIDxlbT5GYWxzZTwvZW0+LCB0aGVuIHRoZSBUcmlnZ2VyIAorc2ltcGx5IHJldHVybnMgd2l0aG91dCBwZXJmb3JtaW5nIGFueSBvdGhlciBhY3Rpb25zLiAgSWYsIGhvd2V2ZXIsIHRoZSAKKzxhIGhyZWY9IiNwcmVkaWNhdGUiPlByZWRpY2F0ZTwvYT4gZXZhbHVhdGVzIHRvIDxlbT5UcnVlPC9lbT4sIHRoZW4gdGhlIFRyaWdnZXIKK2FsbG93cyB0aGUgPGEgaHJlZj0iI2RlY29yYXRvciI+RGVjb3JhdG9yPC9hPiBpdCByZWZlcmVuY2VzIHRvIHVwZGF0ZSB0aGUgIAorPGEgaHJlZj0iI2Nhbm9uaWNhbGdyYXBoIj5jYW5vbmljYWwgZ3JhcGg8L2E+LiAgU28gbG9uZyBhcyB0aGUgCis8YSBocmVmPSIjcHJlZGljYXRlIj5QcmVkaWNhdGU8L2E+IHJldHVybnMgPGVtPlRydWU8L2VtPiB0aGUgcmVmZXJlbmNlZCAKKzxhIGhyZWY9IiNkZWNvcmF0b3IiPkRlY29yYXRvcjwvYT4gd2lsbCBiZSBleGVjdXRlZC4gIElmIHRoZSAKKzxhIGhyZWY9IiNkZWNvcmF0b3IiPkRlY29yYXRvcjwvYT4gaXMgYSAgPGEgaHJlZj0iI21vZGlmaWVyIj5Nb2RpZmllcjwvYT4gdGhlbiBpdAord2lsbCBzdGVwIHRocm91Z2ggZWFjaCBvZiBpdHMgY29uZmlndXJlZCBtb2RpZmljYXRpb25zIGVhY2ggdGltZSBpdCBpcyAKK2FjdGl2YXRlZCB1bnRpbCBhbGwgbW9kaWZpY2F0aW9ucyBoYXZlIGJlZW4gY29tcGxldGVkLgorPC9wPgorPHA+CitBIFRyaWdnZXIgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIAorPGEgaHJlZj0iLi4vaW50ZXJmYWNlL3dpemFyZHMvdHJpZ2dlcndpemFyZC5odG1sIj5UcmlnZ2VyIFdpemFyZDwvYT4gYW5kIAorZWRpdGVkIHVzaW5nIHRoZSA8YSBocmVmPSIuLi9pbnRlcmZhY2UvZWRpdG9ycy90cmlnZ2VyZWRpdG9yLmh0bWwiPlRyaWdnZXIgRWRpdG9yPC9hPi4KKzwvcD4KKzxoNCBpZD1wcmVkaWNhdGU+UHJlZGljYXRlPC9oND4KKzxwPgorQSBQcmVkaWNhdGUgaXMgYSBib29sZWFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIDxlbT5UcnVlPC9lbT4gb3IgPGVtPkZhbHNlPC9lbT4KK2RlcGVuZGluZyBvbiB0ZXN0YWJsZSBjb25kaXRpb25zIGluIGEgcnVubmluZyA8YSBocmVmPSIjc2ltdWxhdGlvbiI+U2ltdWxhdGlvbjwvYT4KK2FuZCB0aGUgZXhwcmVzc2lvbiBpdHNlbGYuICBJbnN0YW5jZXMgb2YgIFByZWRpY2F0ZXMgYXJlIHJlZmVyZW5jZWQgYnkgIAorPGEgaHJlZj0iI3RyaWdnZXIiPlRyaWdnZXJzPC9hPiBhbmQgdGhlaXIgbG9naWNhbCB2YWx1ZXMgYXJlIHVzZWQgdG8gY29udHJvbAordGhlIGV4ZWN1dGlvbiBvZiBhIDxhIGhyZWY9IiNkZWNvcmF0b3IiPkRlY29yYXRvcjwvYT4gcmVmZXJlbmNlZCBieSBlYWNoIAorPGEgaHJlZj0iI3RyaWdnZXIiPlRyaWdnZXI8L2E+LgorPC9wPgorPHA+CitBcmJpdHJhcnkgbG9naWNhbCBleHByZXNzaW9ucyBjYW4gYmUgZXhwcmVzc2VkIGluIGEgUHJlZGljYXRlLCBidXQgY3VycmVudGx5LAorZHVlIHRvIGltcGxlbWVudGF0aW9uIGxpbWl0YXRpb25zLCB0aGUgb25seSB0ZXN0YWJsZSBjb25kaXRpb25zIGFyZSB0aGUKK2N1cnJlbnQgYW5kIGVsYXBzZWQgdGltZXMgaW4gYSBydW5uaW5nIDxhIGhyZWY9IiNzaW11bGF0aW9uIj5TaW11bGF0aW9uPC9hPi4KK0luIGZ1dHVyZSB2ZXJzaW9ucyBvZiBTVEVNLCBhIHJpY2hlciBzZXQgb2YgY29uZGl0aW9ucyB3aWxsIGJlIGF2YWlsYWJsZS4gIAorVGhlIHRlc3Rpbmcgb2YgdGltZSBpcyBzdGlsbCBhbiBleHRyZW1lbHkgdXNlZnVsIGNvbmRpdGlvbiBhcyBpdCBhbGxvd3MgZm9yCitzcGVjaWZpYyBtb2RpZmljYXRpb25zIHRvIGJlIG1hZGUgdG8gYSA8YSBocmVmPSIjc2ltdWxhdGlvbiI+U2ltdWxhdGlvbjwvYT4KK2F0IHByZWNpc2UgcG9pbnRzIGluIHRpbWUuCis8L3A+Cis8cD4KK0EgUHJlZGljYXRlIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSAKKzxhIGhyZWY9Ii4uL2ludGVyZmFjZS93aXphcmRzL3ByZWRpY2F0ZXdpemFyZC5odG1sIj5QcmVkaWNhdGUgV2l6YXJkPC9hPiBhbmQgCitlZGl0ZWQgdXNpbmcgdGhlIDxhIGhyZWY9Ii4uL2ludGVyZmFjZS9lZGl0b3JzL3ByZWRpY2F0ZWVkaXRvci5odG1sIj5QcmVkaWNhdGUgRWRpdG9yPC9hPi4KKzwvcD4KKzxoMz5TaW11bGF0aW9uIEV4ZWN1dGlvbjwvaDM+Cis8cD5XaGVuIGlzIFNpbXVsYXRpb24gaXMgc3RhcnRlZCwgdGhlIGZpcnN0IG9wZXJhdGlvbiBpcyB0byBjcmVhdGUKK3RoZSA8YSBocmVmPSIjY2Fub25pY2FsZ3JhcGgiPmNhbm9uaWNhbCBncmFwaDwvYT4uIFRoaXMgaXMgYWNjb21wbGlzaGVkCitieSByZWN1cnNpdmVseSBkZXNjZW5kaW5nIHRoZSB0cmVlIHJvb3RlZCBieSB0aGUgPGEgaHJlZj0iI21vZGVsIj4KK01vZGVsPC9hPiByZWZlcmVuY2VkIGJ5IHRoZSA8YSBocmVmPSIjc2NlbmFyaW8iPlNjZW5hcmlvPC9hPi4gQXMgdGhlIDxhCisJaHJlZj0iI2Nhbm9uaWNhbGdyYXBoIj5jYW5vbmljYWwgZ3JhcGg8L2E+IGlzIGNvbnN0cnVjdGVkLCBjb25uZWN0aW9ucworYmV0d2VlbiBMYWJlbHMgYW5kIEVkZ2VzIGluIHRoZSBncmFwaCBmcmFnbWVudHMgYXJlIHJlc29sdmVkIGFuZCB0aGVuCitlYWNoIDxhIGhyZWY9IiNtb2RlbCI+IE1vZGVsPC9hPiA8YSBocmVmPSIjZGVjb3JhdG9yIj4gRGVjb3JhdG9yPC9hPiBpcworaW52b2tlZCBhbmQgZ2l2ZW4gdGhlIG9wcG9ydHVuaXR5IHRvICJkZWNvcmF0ZSIgdGhlIDxhCisJaHJlZj0iI2Nhbm9uaWNhbGdyYXBoIj5jYW5vbmljYWwgZ3JhcGg8L2E+IGFzIHBhcnQgb2YgaXRzCitpbml0aWFsaXphdGlvbi4gV2hlbiB0aGlzIGlzIGNvbXBsZXRlLCB0aGUgPGEgaHJlZj0iI3NjZW5hcmlvIj5TY2VuYXJpbzwvYT4KKzxhIGhyZWY9IiNkZWNvcmF0b3IiPiBEZWNvcmF0b3JzPC9hPiBhcmUgaW52b2tlZCB0byBnaXZlIHRoZW0gdGhlCitvcHBvcnR1bml0eSB0byBkZWNvcmF0ZSB0aGUgPGEgaHJlZj0iI2Nhbm9uaWNhbGdyYXBoIj5jYW5vbmljYWwKK2dyYXBoPC9hPi48L3A+Cis8cD5XaGVuIHRoZSA8YSBocmVmPSIjY2Fub25pY2FsZ3JhcGgiPmNhbm9uaWNhbCBncmFwaDwvYT4gaGFzIGJlZW4KK2NvbnN0cnVjdGVkIGFuZCBpbml0aWFsaXplZCBieSB0aGUgPGEgaHJlZj0iI21vZGVsIj4gTW9kZWw8L2E+IGFuZCA8YQorCWhyZWY9IiNzY2VuYXJpbyI+U2NlbmFyaW88L2E+IDxhIGhyZWY9IiNkZWNvcmF0b3IiPiBEZWNvcmF0b3JzPC9hPiwgdGhlCitTaW11bGF0aW9uIGNhbiBiZWdpbiBpdHMgZmlyc3QgY3ljbGUuIFRoZSBmaXJzdCBzdGVwIG9mIHRoZSBTaW11bGF0aW9uCitpcyB0byBkZXRlcm1pbmUgaWYgdGhlIFNpbXVsYXRpb24gaGFzIGNvbXBsZXRlZCBpdHMgc2VxdWVuY2Ugb2YgY3ljbGVzLgorVGhlIGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIGlzIHByb3ZpZGVkIGJ5IHRoZSA8YSBocmVmPSIjc2VxdWVuY2VyIj5TZXF1ZW5jZXI8L2E+Cit0aGF0IGlzIHJlZmVyZW5jZWQgYnkgdGhlIDxhIGhyZWY9IiNzY2VuYXJpbyI+U2NlbmFyaW88L2E+IGZyb20gd2hpY2gKK3RoZSBTaW11bGF0aW9uIHdhcyBzdGFydGVkLiBJZiB0aGUgYW5zd2VyIGlzICJObywiIGFuZCB0aGUgU2ltdWxhdGlvbgorc2hvdWxkIGNvbnRpbnVlLCB0aGUgPGEgaHJlZj0iI3NlcXVlbmNlciI+U2VxdWVuY2VyPC9hPiB3aWxsIHByb3ZpZGUgYQordmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSAidGltZSIgb2YgdGhlIG5leHQgY3ljbGUuIFRoZSBTVEVNIFNpbXVsYXRpb24KK2VuZ2luZSB0aGVuIHRha2VzIHRoYXQgdmFsdWUgYW5kIGludm9rZXMgZWFjaCBvZiB0aGUgPGEgaHJlZj0iI21vZGVsIj4KK01vZGVsPC9hPiA8YSBocmVmPSIjZGVjb3JhdG9yIj4gRGVjb3JhdG9yczwvYT4gKGluIHByb3BlciBvcmRlcikgcGFzc2luZwordGhlbSB0aGUgdGltZSB2YWx1ZS4gVGhleSBwZXJmb3JtIHRoZWlyIGNvbXB1dGF0aW9ucyBhbmQgdGhlbiB0aGUgPGEKKwlocmVmPSIjc2NlbmFyaW8iPlNjZW5hcmlvPC9hPiA8YSBocmVmPSIjZGVjb3JhdG9yIj4gRGVjb3JhdG9yczwvYT4gYXJlCitpbnZva2VkIGluIHRoZSBzYW1lIG1hbm5lci4gRnJlcXVlbnRseSwgdGhlIDxhIGhyZWY9IiNzY2VuYXJpbyI+U2NlbmFyaW88L2E+Cis8YSBocmVmPSIjZGVjb3JhdG9yIj4gRGVjb3JhdG9yczwvYT4gd2lsbCBub3QgaGF2ZSBhbnkgY29tcHV0YXRpb25zIHRvCitwZXJmb3JtIGFmdGVyIHRoZXkgaGF2ZSBkb25lIHRoZWlyIGluaXRpYWxpemF0aW9uLCBidXQgdGhlcmUgaXMgbm8KK3Jlc3RyaWN0aW9uIHRoYXQgZW5mb3JjZXMgdGhpcy48L3A+Cis8cD5XaGVuIHRoZSA8YSBocmVmPSIjZGVjb3JhdG9yIj4gRGVjb3JhdG9yczwvYT4gYXJlIGZpbmlzaGVkLCB0aGUKK1NpbXVsYXRpb24gZW5naW5lIHRlbGxzIHRoZSA8YSBocmVmPSIjY2Fub25pY2FsZ3JhcGgiPmNhbm9uaWNhbAorZ3JhcGg8L2E+IHRvIHN3aXRjaCB0byBpdHMgIm5leHQiIHN0YXRlLiBUaGlzIG1lYW5zIHRoYXQgYWxsIG9mIHRoZSBMYWJlbHMKK2V4Y2hhbmdlIHRoZWlyICJjdXJyZW50IiBhbmQgIm5leHQiIHZhbHVlcy4gVGhpcyBjb21wbGV0ZXMgdGhlIGZpcnN0CitjeWNsZS4gVGhlIHByb2Nlc3MgYmVnaW5zIHRoZSBuZXh0IGN5Y2xlIHdpdGggdGhlIDxhIGhyZWY9IiNzZXF1ZW5jZXIiPlNlcXVlbmNlcjwvYT4KK2RldGVybWluaW5nIGlmIHRoZSBzZXF1ZW5jZSBvZiBzaW11bGF0aW9uIGN5Y2xlcyBpcyBjb21wbGV0ZS48L3A+CisKKzxoNCBpZD1iYXRjaD5CYXRjaCBFeGVjdXRpb248L2g0PgorPHA+CitBIEJhdGNoIGlzIGNyZWF0ZWQgd2hlbiBhbiA8YSBocmVmPSIjZXhwZXJpbWVudCI+RXhwZXJpbWVudDwvYT4gaXMgZXhlY3V0ZWQuICAKK1doZW4gYSBCYXRjaCBydW5zLCBpdCBmaXJzdCB0YWtlcyB0aGUgYmFzZSA8YSBocmVmPSIjc2NlbmFyaW8iPlNjZW5hcmlvPC9hPiAKK29mIHRoZSA8YSBocmVmPSIjZXhwZXJpbWVudCI+RXhwZXJpbWVudDwvYT4sIGFwcGxpZXMgdGhlIE1vZGlmaWVycyByZWZlcmVuY2VkIAorYnkgdGhlIDxhIGhyZWY9IiNleHBlcmltZW50Ij5FeHBlcmltZW50PC9hPiBhbmQgY3JlYXRlcyBhIG5ldyBkZXJpdmF0aXZlIAorPGEgaHJlZj0iI3NjZW5hcmlvIj5TY2VuYXJpbzwvYT4uICBJdCB0aGVuIGluaXRpYXRlcyB0aGUgZXhlY3V0aW9uIG9mIGEgCis8YSBocmVmPSIjc2ltdWxhdGlvbiI+U2ltdWxhdGlvbjwvYT4gZnJvbSB0aGUgZGVyaXZlZCA8YSBocmVmPSIjc2NlbmFyaW8iPlNjZW5hcmlvPC9hPi4gIAorV2hlbiB0aGF0IDxhIGhyZWY9IiNzaW11bGF0aW9uIj5TaW11bGF0aW9uPC9hPiBjb21wbGV0ZXMsIHRoZSBCYXRjaCByZXBlYXRzIHRoZQorcHJvY2VzcyB1bnRpbCB0aGUgTW9kaWZpZXJzIGluZGljYXRlIHRoYXQgdGhlcmUgYXJlIG5vIGFkZGl0aW9uYWwgbW9kaWZpY2F0aW9ucyB0byAKK21ha2UsIGF0IHdoaWNoIHBvaW50IHRoZSBleGVjdXRpb24gb2YgdGhlIEJhdGNoIGlzIGNvbXBsZXRlIGFuZCBpdCBleGl0cy4KKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvY29uY2VwdHMvb3ZlcnZpZXcuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9jb25jZXB0cy9vdmVydmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZTMwMjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvY29uY2VwdHMvb3ZlcnZpZXcuaHRtbApAQCAtMCwwICsxLDM1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorCis8aHRtbD4KKzxoZWFkPgorCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorCTx0aXRsZT5TVEVNIENvbmNlcHRzPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj4KK1doYXQgaXMgdGhlIFNwYXRpb3RlbXBvcmFsIEVwaWRlbWlvbG9naWNhbCBNb2RlbGVyIChTVEVNKT8KKzwvaDI+Cis8cD4KK1RoZSBTcGF0aW90ZW1wb3JhbCBFcGlkZW1pb2xvZ2ljYWwgTW9kZWxlciAoU1RFTSkgdG9vbCBpcyBkZXNpZ25lZCAKK3RvIGhlbHAgc2NpZW50aXN0cyBhbmQgcHVibGljIGhlYWx0aCBvZmZpY2lhbHMgY3JlYXRlIGFuZCB1c2Ugc3BhdGlhbCAKK2FuZCB0ZW1wb3JhbCBtb2RlbHMgb2YgZW1lcmdpbmcgaW5mZWN0aW91cyBkaXNlYXNlcy4gCitUaGVzZSBtb2RlbHMgY291bGQgYWlkIGluIHVuZGVyc3RhbmRpbmcsIGFuZCBwb3RlbnRpYWxseSBwcmV2ZW50aW5nLCAKK3RoZSBzcHJlYWQgc3VjaCBkaXNlYXNlcy4KKzwvcD4KKzxwPgorUG9saWN5bWFrZXJzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBzdHJhdGVnaWVzIHRvIGNvbnRhaW4gZGlzZWFzZXMgCithbmQgcHJldmVudCBlcGlkZW1pY3MgbmVlZCBhbiBhY2N1cmF0ZSB1bmRlcnN0YW5kaW5nIG9mIGRpc2Vhc2UgCitkeW5hbWljcyBhbmQgdGhlIGxpa2VseSBvdXRjb21lcyBvZiBwcmV2ZW50aXZlIGFjdGlvbnMuIAorSW4gYW4gaW5jcmVhc2luZ2x5IGNvbm5lY3RlZCB3b3JsZCB3aXRoIGV4dHJlbWVseSBlZmZpY2llbnQgCitnbG9iYWwgdHJhbnNwb3J0YXRpb24gbGlua3MsIHRoZSB2ZWN0b3JzIG9mIGluZmVjdGlvbiBjYW4gCitiZSBxdWl0ZSBjb21wbGV4LiBTVEVNIGZhY2lsaXRhdGVzIHRoZSBkZXZlbG9wbWVudCBvZiBhZHZhbmNlZCAKK21hdGhlbWF0aWNhbCBtb2RlbHMgdGhhdCBpbmNvcnBvcmF0ZSBtYW55IGZhY3RvcnMgdGhhdCBpbXBhY3QgCit0aGUgc3ByZWFkIG9mIGRpc2Vhc2UuICBUaGVzZSBpbmNsdWRlIHBvcHVsYXRpb24gdHlwZXMgYW5kIHRoZWlyIAorZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBhbmQgZGVuc2l0eSwgdHJhbnNwb3J0YXRpb24gcm91dGVzIGFuZCAKK3RoZWlyIGNhcGFjaXRpZXMsIGFuZCB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIGEgZGlzZWFzZS4KKzwvcD4KKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9lcGlkZW1pb2xvZ2ljYWxtb2RlbGluZy9pbWFnZXMvU0VJUlMuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2VwaWRlbWlvbG9naWNhbG1vZGVsaW5nL2ltYWdlcy9TRUlSUy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkZmYwMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9lcGlkZW1pb2xvZ2ljYWxtb2RlbGluZy9pbWFnZXMvU0VJUlMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9lcGlkZW1pb2xvZ2ljYWxtb2RlbGluZy9pbWFnZXMvU0lSUy5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvZXBpZGVtaW9sb2dpY2FsbW9kZWxpbmcvaW1hZ2VzL1NJUlMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYmI4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvZXBpZGVtaW9sb2dpY2FsbW9kZWxpbmcvaW1hZ2VzL1NJUlMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9lcGlkZW1pb2xvZ2ljYWxtb2RlbGluZy9pbWFnZXMvU0lTLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9lcGlkZW1pb2xvZ2ljYWxtb2RlbGluZy9pbWFnZXMvU0lTLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzkwYzc1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2VwaWRlbWlvbG9naWNhbG1vZGVsaW5nL2ltYWdlcy9TSVMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9lcGlkZW1pb2xvZ2ljYWxtb2RlbGluZy9vdmVydmlldy5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2VwaWRlbWlvbG9naWNhbG1vZGVsaW5nL292ZXJ2aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyZjM0MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9lcGlkZW1pb2xvZ2ljYWxtb2RlbGluZy9vdmVydmlldy5odG1sCkBAIC0wLDAgKzEsMTI2IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorCis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+RXBpZGVtaW9sb2dpY2FsIE1vZGVsaW5nIE92ZXJ2aWV3PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8aDE+RXBpZGVtaW9sb2dpY2FsIE1vZGVsaW5nPC9oMT4KKworPGltZyBzcmM9ImltYWdlcy9zaXMuZ2lmIiBhbGlnbj1SSUdIVCBIU1BBQ0U9MTAgVlNQQUNFPTEwIHdpZHRoPTI1JT4KKzxwPiBDb21wYXJ0bWVudGFsIGRpc2Vhc2UgbW9kZWxzIGFyZSBzb21lIG9mIHRoZSBtb3N0IHdpZGVseSB1c2VkCittb2RlbHMgb2YgaW5mZWN0aW91cyBkaXNlYXNlLiBJbiB0aGVzZSBtb2RlbHMgaW5kaXZpZHVhbHMgKG9yIHBvcnRpb25zIG9mCithbiBpbmRpdmlkdWFsKSBhcmUgY29uc2lkZXJlZCB0byBiZSBpbiBhIGNvbXBhcnRtZW50cyBiYXNlZCBvbiB0aGVpcgorZGlzZWFzZSBzdGF0dXMuIEJ5IGNvbnZlbnRpb24sIGNvbW1vbmx5IHVzZWQgY29tcGFydG1lbnRhbCBtb2RlbHMgYXJlCitkZXNpZ25hdGVkIGJ5IHRoZSBmaXJzdCBsZXR0ZXJzIG9mIHRoZSBjb21wYXJ0bWVudHMgYW5kIHRoZSBvcmRlciAKK3Blb3BsZSBtb3ZlIGJldHdlZW4gdGhlbS4gU28sIHRoZSBtb2RlbCBmb3IgYSBkaXNlYXNlIHdoZXJlIHBlb3BsZSAKK3N0YXJ0IG91dCBTdXNjZXB0aWJsZSwgYmVjb21lIEluZmVjdGlvdXMgYWZ0ZXIgY2F0Y2hpbmcgdGhlIGRpc2Vhc2UsIAorYW5kIHRoZW4gYWZ0ZXIgc29tZSB0aW1lIGNsZWFyIHRoZSBkaXNlYXNlIGFuZCBiZWNvbWUgU3VzY2VwdGlibGUgYWdhaW4KK3dvdWxkIGJlIGFuIFNJUyBtb2RlbC4gVGhlIGZvdXIgbW9zdCBjb21tb25seSB1c2VkIGNvbXBhcnRtZW50cworYXJlIDx1PlM8L3U+dXNjZXB0aWJsZSwgPHU+RTwvdT54cG9zZWQsIDx1Pkk8L3U+bmZlY3Rpb3VzLCBhbmQKKzx1PlI8L3U+ZW1vdmVkLiA8dT5TPC91PnVzY2VwdGlibGUgY29udGFpbnMgdGhvc2UgaW5kaXZpZHVhbHMgCit3aG8gY2FuIHN0aWxsIGJlIGluZmVjdGVkIHdpdGggZGlzZWFzZS4gPHU+RTwvdT54cG9zZWQgY29udGFpbnMgaW5kaXZpZHVhbHMKK3dobyBoYXZlIGJlZW4gaW5mZWN0ZWQgd2l0aCB0aGUgZGlzZWFzZSwgYnV0IGhhdmUgbm90IHlldCBiZWNvbWUKK2luZmVjdGlvdXMgdGhlbXNlbHZlcy4gPHU+STwvdT5uZmVjdGlvdXMgY29udGFpbnMgdGhvc2UgaW5kaXZpZHVhbHMgd2hvCithcmUgaW5mZWN0ZWQgYW5kIGluZmVjdGlvdXMuIDx1PlI8L3U+ZW1vdmVkIChzb21ldGltZXMgY2FsbGVkIDx1PlI8L3U+ZWNvdmVyZWQpCitjb250YWlucyB0aG9zZSBpbmRpdmlkdWFscyB3aG8gaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtCitlaXRoZXIgdGhyb3VnaCBkZWF0aCBvciBpbW11bml0eS4gVGhlIGRpc2Vhc2Ugc3RhdGUgb2YgYSBwb3B1bGF0aW9uIAoraXMgc3BlY2NpZmllZCBieSBrbm93aW5nIHRoZSBudWJlciBvZiBpbmRpdmlkdWFscyAob3IgcHJvcG9ydGlvbiBvZgordGhlIHBvcHVsYXRpb24pIHRoYXQgaXMgaW4gZWFjaCBjb21wYXJ0bWVudC4KKyAgCQorIDxwPiBUaGVyZSBhcmUgdHdvIG1haW4gdHlwZXMgb2YgY29tcGFydG1lbnRhbCBtb2RlbHM6IGRldGVybWluaXN0aWMKKyBhbmQgc3RvY2hhc3RpYy4gSW4gZGV0ZXJtaW5pc3RpYyBtb2RlbCwgcmF0ZXMgb2YgbW92ZW1lbnRzIGJldHdlZW4KKyBjb21wYXJ0bWVudHMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwcm9jZXNzZXMgYnkgd2hpY2ggaW5kaXZpZHVhbHMKKyBhcmUgaW5mZWN0ZWQsIGJlY29tZSBpbGwgYW5kIGV2ZW50dWFsbHkgcmVjb3ZlciBmcm9tIGRpc2Vhc2UuIFRoZXNlIAorIHJhdGVzIHNwZWNpZnkgYSBzZXQgb2YgZGlmZmVyZW50aWFsIG9yIGRpZmZlcmVuY2UgZXF1YXRpb25zLCB3aGljaAorIGNhbiBiZSBldmFsdWF0ZWQgdG8gZ2l2ZSB0aGF0IHN0YXRlIG9mIHRoZSBtb2RlbCBhdCBhIGZ1dHVyZSB0aW1lIAorIHBvaW50LiBJbiBkZXRlcm1pbmlzdGljIG1vZGVscyBjb21wYXJ0bWVudHMgbmVlZCBub3QgY29udGFpbiBhbgorIGludGVnZXIgbnVtYmVyIG9mIGluZGl2aWR1YWxzLgorIAorIDxwPkRldGVybWluaXN0aWMgbW9kZWxzIG9ubHkgZ2l2ZSB0aGUgPGk+ZXhwZWN0ZWQ8L2k+IGJlaGF2aW9yIG9mCisgdGhlIGRpc2Vhc2UgaW4gYSBwb3B1bGF0aW9uIHVuZGVyIGEgc2V0IG9mIGFzc3VtcHRpb25zIGFib3V0IAorIHRoZSBuYXR1cmFsIGhpc3RvcnkgYW5kIGVwaWRlbWlvbG9neSBvZiB0aGUgZGlzZWFzZS4gT2Z0ZW4KKyB3ZSB3b3VsZCBhbHNvIGxpa2UgdG8ga25vdyBob3cgdGhlIGRpc2Vhc2UgYmVoYXZlcyBpbiBtb3JlCisgZXh0cmVtZSBjYXNlcywgYW5kIHdoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGJlaGF2aW9yIAorIGlzLiBTdG9jaGFzdGljIG1vZGVscyBwcm92aWRlIGEgbWV0aG9kIGZvciBhZGRyZXNzaW5nIHRoaXMKKyBpc3N1ZS4gSW4gYSBzdG9jaGFzdGljIG1vZGVsLCB3aG9sZSBpbmRpdmlkdWFscyBhcmUgbW92ZWQgCisgYmV0d2VlbiBjb21wYXJ0bWVudHMgYmFzZWQgb24gYSByYW5kb20gZHJhdyBmcm9tIHNvbWUgc3BlY2lmaWVkCisgZGlzdHJpYnV0aW9uLiBUbyBnZXQgaW5mb3JtYXRpdmUgcmVzdWx0cyBmcm9tIGEgc3RvY2hhc3RpYyAKKyBjb21wYXJ0bWVudGFsIG1vZGVsIGl0IGlzIG5lY2Vzc2FyeSB0byBkbyBodW5kcmVkcywgb3IgZXZlbgorIHRob3VzYW5kcyBvZiBleHBlcmltZW50cy4gCisKKzxwPkNvbXBhcnRhbWVudGFsIG1vZGVscyBhbHNvIG1heSBoYXZlICJjbG9zZWQiIG9yICJvcGVuIiBwb3B1bGF0aW9ucy4KK0luIGNsb3NlZCBwb3B1bGF0aW9ucyB0aGUgc2V0IG9mIGluZGl2aWR1YWxzIHJlcHJlc2VudGVkIGJ5IHRoZSBtb2RlbAoraXMgc3RhdGljLCBubyBvbmUgY29tZXMgaW4gYW5kIG5vIG9uZSBjb21lcyBvdXQuIEl0IGlzIG9mIG5vdGUgdGhhdAoraW4gc3VjaCBwb3B1bGF0aW9ucyBhbnkgZGlzZWFzZSB0aGF0IGNvbmZlcnMgcGVybWFuZW50IGltbXVuaXR5CithZnRlciBpbmZlY3Rpb24gd2lsbCBldmVudHVhbGx5IGJlY29tZSBleHRpbmN0LiBJbiBhbiBvcGVuIAorcG9wdWxhdGlvbiB0aGVyZSBpcyBjb250aW51b3VzIGltbWlncmF0aW9uIGFuZCBlbWlncmF0aW9uIGZyb20KK3RoZSBwb3B1bGF0aW9uLCB1c3VhbGx5IHZpYSBiaXJ0aCBhbmQgZGVhdGguIAorICAKKzxwPlNURU0gY29tZXMgd2l0aCBkZXRlcm1pbmlzdGljIGltcGxlbWVudGF0aW9ucyBmb3IgdGhyZWUgY29tbW9ubHkgdXNlZAorY29tcGFydG1lbnRhbCBtb2RlbHM6IFNJKFMpLCBTSVIoUyksIGFuZCBTSUVSKFMpLiBUaGVzZSBtb2RlbHMgYXJlCitpbXBsZW1lbnRlZCBhcyBoYXZpbmcgb3BlbiBwb3B1bGF0aW9ucywgYnV0IGNsb3NlZCBwb3B1bGF0aW9ucyBjYW4KK2JlIGVhc2lseSBzaW11bGF0ZWQgYnkgc2V0dGluZyB0aGUgaW1taWdyYXRpb24vZW1pZ3JhdGlvbiByYXRlIHRvCit6ZXJvLiBXaGljaCBtb2RlbCBpcyBhcHByb3ByaWF0ZSBmb3IgYSBtb2RlbGluZyBwcm9qZWN0IGRlcGVuZHMKK29uIGJvdGggdGhlIGRpc2Vhc2Ugb2YgaW50ZXJlc3QgYW5kIHRoZSB0aW1lc2NhbGUgdGhhdCB3ZSBhcmUgCitpbnRlcmVzdGVkIGluIG1vZGVsaW5nIG91ciByZXN1bHRzLiAKKworPGgyPlRoZSBTSShTKSBNb2RlbDwvaDI+Cis8YSBocmVmPSJzaW1hdGguaHRtbCI+Cis8aW1nIHNyYz0iaW1hZ2VzL3Npcy5naWYiIGFsaWduPUNFTlRFUiBIU1BBQ0U9MTAgVlNQQUNFPTEwIHdpZHRoPTI0JSBib3JkZXI9MD4KKzwvYT4KKworPHA+U0koUykgYXJlIHVzZWZ1bCBmb3IgbW9kZWxpbmcgZGlzZWFzZXMgd2l0aCBhIHNob3J0IGxhdGVudCBwZXJpb2QgKHRoZSB0aW1lIAorYmV0d2VlbiBiZWluZyBpbmZlY3RlZCBhbmQgYmVjb21pbmcgaW5mZWN0aW91cykgdGhhdCBlaXRoZXIgY29uZmVyIG5vIGxvbmcgdGVybSAKK2ltbXVuaXR5IChpbiB0aGUgY2FzZSBvZiBTSVMgbW9kZWxzKSBvciByZXN1bHQgaW4gcGVybWFuZW50IGluZmVjdGlvbiAoaW4gdGhlIGNhc2UKK29mIFNJIG1vZGVscykuIERpc2Vhc2VzIG9mIHRoaXMgdHlwZSBpbmNsdWRlIHRoZSBjb21tb24gY29sZCBhbmQgbWFueSAKK21hY3JvLXBhcmFzaXRlIGluZmVjdGlvbnMuIFN1c2NlcHRpYmxlIGluZGl2aWR1YWxzIGFyZSBpbmZlY3RlZCBhdCB0aGUgCityYXRlIG9mIDxlbT4mYmV0YTtJPC9lbT4sIGF0IHdoaWNoIHRpbWUgdGhleSBsb3NlIGluZmVjdGlvdXNuZXNzCithdCB0aGUgcmF0ZSBvZiA8ZW0+JmdhbW1hOzwvZW0+LiBNYXRoZW1hdGljYWwgZGV0YWlscyBvZiB0aGlzIG1vZGVsCitjYW4gYmUgdmlld2VkIDxhIGhyZWY9InNpbWF0aC5odG1sIj5oZXJlPC9hPi4KKworCis8aDI+VGhlIFNJUihTKSBNb2RlbDwvaDI+Cis8YSBocmVmPSJzaXJtYXRoLmh0bWwiPgorPGltZyBzcmM9ImltYWdlcy9zaXJzLmdpZiIgYWxpZ249Q0VOVEVSIEhTUEFDRT0xMCBWU1BBQ0U9MTAgd2lkdGg9MzYlIGJvcmRlcj0wPgorPC9hPgorCis8cD4gU0lSKFMpIG1vZGVscyBhcmUgdXNlZnVsIGZvciBtb2RlbGluZyBkaXNlYXNlcyB3aXRoIGEgc2hvcnQgbGF0ZW50IAorcGVyaW9kIHRoYXQgY29uZmVyIGltbXVuaXR5IGFmdGVyIGluZmVjdGlvbiwgd2hldGhlciBwZXJtYW5lbnRseSAoYW4gU0lSCittb2RlbCksIG9yIHRlbXBvcmFyaWx5IChhbiBTSVJTIG1vZGVsKS4gU3VjaCBhIG1vZGVsIG1pZ2h0IGJlIHVzZWZ1bCBmb3IKK21vZGVsaW5nIGRpc2Vhc2VzIHN1Y2ggYXMgaW5mbHVlbnphIG9yIGNoaWNrZW4tcG94LiBTdXNjZXB0aWJsZSBpbmRpdmlkdWFscyBhcmUgaW5mZWN0ZWQgCithdCB0aGUgcmF0ZSBvZiA8ZW0+JmJldGE7STwvZW0+LiBUaGV5IHRoZW4gbG9vc2UgaW5mZWN0aW91c25lc3MgYXQgdGhlIHJhdGUgb2YKKzxlbT4mZ2FtbWE7PC9lbT4gYW5kIHRoZW4gYmVjb21lIGltbXVuZSB0byBmdXJ0aGVyIGluZmVjdGlvbi4gSW1tdW5pdHkgaXMgbG9zdAorYXQgdGhlIHJhdGUgb2YgPGVtPiZzaWdtYTs8L2VtPi4gIE1hdGhlbWF0aWNhbCBkZXRhaWxzIG9mIHRoaXMgbW9kZWwgY2FuIGJlCit2aWV3ZWQgPGEgaHJlZj0ic2lybWF0aC5odG1sIj5oZXJlPC9hPi4KKworPGgyPlRoZSBTRUlSKFMpIE1vZGVsPC9oMj4KKzxhIGhyZWY9InNlaXJtYXRoLmh0bWwiPgorPGltZyBzcmM9ImltYWdlcy9zZWlycy5naWYiIGFsaWduPUNFTlRFUiBIU1BBQ0U9MTAgVlNQQUNFPTEwIHdpZHRoPTQ4JSBib3JkZXI9MD4KKzwvYT4KKworPHA+IFNFSVIoUykgbW9kZWxzIGFyZSB1c2VmdWwgZm9yIG1vZGVsaW5nIGRpc2Vhc2VzIHRoYXQgaGF2ZSBhIGxvbmcgbGF0ZW50CitwZXJpb2QgaW4gd2hpY2ggaW5mZWN0ZWQgaW5kaXZpZHVhbHMgYXJlIG5vdCB0aGVtc2VsdmVzIGluZmVjdGlvdXMuICBNZWFzbGVzLAoraW5mbHVlbnphIGFuZCBzbWFsbHBveCBhcmUgYWxsIGRpc2Vhc2VzIHRoYXQgbWlnaHQgYmUgYXBwcm9wcmlhdGVseSBjaGFyYWN0ZXJpemVkCitieSB0aGlzIG1vZGVsLiBTdXNjZXB0aWJsZSBpbmRpdmlkdWFscyBhcmUgaW5mZWN0ZWQgIGF0IHRoZSByYXRlIG9mIDxlbT4mYmV0YTtJPC9lbT4uCitUaGVzZSBpbmRpdmlkdWFscyBiZWNvbWUgaW5mZWN0aW91cyBhdCB0aGUgcmF0ZSBvZiA8ZW0+JmVwc2lsb247PC9lbT4sIGFuZCAgCit0aGVuIGxvb3NlIGluZmVjdGlvdXNuZXNzIGF0IHRoZSByYXRlIG9mCis8ZW0+JmdhbW1hOzwvZW0+LCBiZWNvbWluZyBpbW11bmUgdG8gZnVydGhlciBpbmZlY3Rpb24uIEltbXVuaXR5IGlzIGxvc3QKK2F0IHRoZSByYXRlIG9mIDxlbT4mc2lnbWE7PC9lbT4uIE1hdGhlbWF0aWNhbCBkZXRhaWxzIG9mIHRoaXMgbW9kZWwgY2FuIGJlCit2aWV3ZWQgPGEgaHJlZj0ic3dpcm1hdGguaHRtbCI+aGVyZTwvYT4uCisKKworPGgyPkZ1cnRoZXIgUmVhZGluZzwvaDI+Cis8b2w+CisJPGxpPiBIZXRoY290ZSwgSC4gVy4gMjAwMC4gVGhlIE1hdGhlbWF0aWNzIG9mIEluZmVjdGlvdXMgRGlzZWFzZXMuIAorCVNJQU0gUmV2LiA0MiwgNCAoRGVjLiAyMDAwKSwgNTk5LTY1My4gRE9JPSBodHRwOi8vZHguZG9pLm9yZy8xMC4xMTM3L1MwMDM2MTQ0NTAwMzcxOTA3CisJPGxpPiAgRm9yZCwgRC4gQS4sIEthdWZtYW4sIEouIEguLCBFaXJvbiwgSS4sMjAwNi4gQW4gZXh0ZW5zaWJsZSBzcGF0aWFsCisJCWFuZCB0ZW1wb3JhbCBlcGlkZW1pb2xvZ2ljYWwgbW9kZWxpbmcgc3lzdGVtLiAKKwkJSW50IEogSGVhbHRoIEdlb2dyLiA1LCA0IChKYW4uIDIwMDYpLiBET0k9aHR0cDovL2R4LmRvaS5vcmcvMTAuMTE4Ni8xNDc2LTA3MlgtNS00CisJCSAKKzwvb2w+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvZXBpZGVtaW9sb2dpY2FsbW9kZWxpbmcvc2Vpcm1hdGguaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9lcGlkZW1pb2xvZ2ljYWxtb2RlbGluZy9zZWlybWF0aC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMjZiNDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvZXBpZGVtaW9sb2dpY2FsbW9kZWxpbmcvc2Vpcm1hdGguaHRtbApAQCAtMCwwICsxLDE3NSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+U0VJUihTKSBEaXNlYXNlIE1vZGVsIE1hdGhlbWF0aWNzPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPlNFSVIgRGlzZWFzZSBNb2RlbCBNYXRoZW1hdGljczwvaDE+Cis8aW1nIHNyYz0iaW1hZ2VzL3NlaXJzLmdpZiIgYWxpZ249Q0VOVEVSIEhTUEFDRT0xMCBWU1BBQ0U9MTAgYm9yZGVyPTAgd2lkdGg9MTAwJT4KKzxwPlRoZSBiYXNpYyA8ZW0+U0VJUjwvZW0+IChTdXNjZXB0aWJsZSwgRXhwb3NlZCwgSW5mZWN0aW91cywgUmVtb3ZlZCkKK2FuZCA8ZW0+U0VJUlM8L2VtPiAoU3VzY2VwdGlibGUsIEV4cG9zZWQsIEluZmVjdGlvdXMsIFJlbW92ZWQsIAorU3VzY2VwdGlibGUpIGRpc2Vhc2UgbW9kZWxzIGFzc3VtZSBhIHVuaWZvcm0KK3BvcHVsYXRpb24gYXQgYSBzaW5nbGUgbG9jYXRpb24gYW5kIHRoYXQgdGhlIHBvcHVsYXRpb24gbWVtYmVycyBhcmUgd2VsbAorIm1peGVkIiwgbWVhbmluZyB0aGF0IHRoZXkgYXJlIGVxdWFsbHkgbGlrZWx5IHRvIG1lZXQgYW5kIGluZmVjdCBlYWNoCitvdGhlci4gVGhpcyBtb2RlbCwgZm9yIGEgbm9ybWFsaXplZCBwb3B1bGF0aW9uLCBpcyBkZWZpbmVkIGJ5IHRoZSB0aHJlZQorZXF1YXRpb25zIGJlbG93OgorPHVsPgorCTxsaT48ZW0+JkRlbHRhO3MgPSAmbXU7ICZtaW51czsgJmJldGE7cyBpICsgJnNpZ21hO3IgJm1pbnVzOworCSZtdTtzPC9lbT48L2xpPgorCTxsaT48ZW0+JkRlbHRhO2UgPSAmYmV0YTtzIGkgJm1pbnVzOyAmZXBzaWxvbjtlICZtaW51czsgJm11O2U8L2VtPjwvbGk+CisJPGxpPjxlbT4mRGVsdGE7aSA9ICZlcHNpbG9uO2UgJm1pbnVzOyAmZ2FtbWE7aSAmbWludXM7ICZtdTtpPC9lbT48L2xpPgorCTxsaT48ZW0+JkRlbHRhO3IgPSAmZ2FtbWE7aSAmbWludXM7ICZzaWdtYTtyICZtaW51czsgJm11O3I8L2VtPjwvbGk+Cis8L3VsPgorCisKKzxwPldoZXJlOgorPHVsPgorCTxsaT48ZW0+czwvZW0+IGlzIHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBwb3B1bGF0aW9uIHRoYXQgaXMKKwkJPGVtPlN1c2NlcHRpYmxlPC9lbT48L2xpPgorCTxsaT48ZW0+ZTwvZW0+IGlzIHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBwb3B1bGF0aW9uIHRoYXQgaXMgPGVtPkV4cG9zZWQ8L2VtPiB0bworCQl0aGUgZGlzZWFzZSwgYnV0IG5vdCB5ZXQgaW5mZWN0aW91cy48L2xpPgkKKwk8bGk+PGVtPmk8L2VtPiBpcyB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgcG9wdWxhdGlvbgorCQl0aGF0IGlzIDxlbT5JbmZlY3Rpb3VzPC9lbT48L2xpPgorCTxsaT48ZW0+cjwvZW0+IGlzIHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBwb3B1bGF0aW9uCisJCXRoYXQgaXMgPGVtPlJlbW92ZWQ8L2VtPiBmcm9tIHRoZSBpbmZlY3Rpb3VzIGFuZCBzdXNjZXB0aWJsZSBwb3B1bGF0aW9ucywgCisJCWFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGluZmVjdGVkLjwvbGk+CisJPGxpPjxlbT4mbXU7PC9lbT4gYm90aCB0aGUgcmF0ZSBvZiBpbW1pZ3JhdGlvbiAoZS5nLiwgYnkgYmlydGgpIGFuZCBlbWlncmF0aW9uCisJCShlLmcuLCBieSBkZWF0aCkgZnJvbSB0aGUgcG9wdWxhdGlvbi4gVGhlc2UgcmF0ZXMgYXJlIGFzc3VtZWQgdG8gYmUgZXF1YWwKKwkJb3ZlciB0aGUgdGltZSBwZXJpb2Qgb2YgaW50ZXJlc3QgKHRoaXMgc2ltcGxpZmllcyB0aGUgbWF0aGVtYXRpY3MpLjwvbGk+CisgCTxsaT48ZW0+JmJldGE7PC9lbT4gaXMgdGhlIGRpc2Vhc2UgdHJhbnNtaXNzaW9uIChpbmZlY3Rpb24pIHJhdGUuCisJCSBUaGUgcmF0ZSBhdCB3aGljaCBpbmZlY3Rpb3VzIGluZGl2aWR1YWxzIGluZmVjdCBzdXNjZXB0aWJsZSBpbmRpdmlkdWFscy4gT25jZQorCSAJaW5mZWN0ZWQsIHN1c2NlcHRpYmxlIGVudGVyIHRoZSBleHBvc2VkIGNvbXBhcnRtZW50LjwvbGk+CisJPGxpPjxlbT4mZXBzaWxvbjs8L2VtPiBpcyB0aGUgcmF0ZSBhdCB3aGljaCA8ZW0+RXhwb3NlZDwvZW0+IHBvcHVsYXRpb24KKwkJbWVtYmVycyBiZWNvbWUgPGVtPkluZmVjdGlvdXM8L2VtPi48L2xpPgorCTxsaT4mZ2FtbWE7IGlzIHRoZSByYXRlIGF0IHdoaWNoIGluZGl2aWR1YWxzIGNsZWFyIGluZmVjdGlvbi4gSW4gdGhpcyBtb2RlbCB0aGVzZQorCQlpbmRpdmlkdWFscyBjYW5ub3QgYmUgcmUtaW5mZWN0ZWQgZm9yIHNvbWUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgaW5mZWN0aW9uICh3aGV0aGVyIHRocm91Z2gKKwkJaW1tdW5pdHkgb3IgcmVtb3ZhbCBmcm9tIHRoZSBwb3B1bGF0aW9uKS48L2xpPgorCTxsaT48ZW0+JnNpZ21hOzwvZW0+IGlzIHRoZSBpbW11bml0eSBsb3NzIHJhdGUuIFRoaXMgY29lZmZpY2llbnQKKwkJZGV0ZXJtaW5lcyB0aGUgcmF0ZSBhdCB3aGljaCA8ZW0+UmVtb3ZlZDwvZW0+IHBvcHVsYXRpb24gbWVtYmVycyBsb3NlCisJCXRoZWlyIGltbXVuaXR5IHRvIHRoZSBkaXNlYXNlIGFuZCBiZWNvbWUgPGVtPlN1c2NlcHRpYmxlPC9lbT4gYWdhaW4uIEZvciBhbiBTRUlSCisJCW1vZGVsLCB0aGlzIHJhdGUgaXMgMC4KKwk8L2xpPgkKKzwvdWw+Cis8L3A+CitGb2xsb3dpbmcgYmFzaWNhbGx5IHRoZSBzYW1lIGRlcml2YXRpb24gYXMgb3V0bGluZWQgZm9yIHRoZQorPGEgaHJlZj0ic2ltYXRoLmh0bWwiPlNJPC9hPgorYW5kCis8YSBocmVmPSJzaXJtYXRoLmh0bWwiPlNJUjwvYT4KK21vZGVscywgdGhlc2UgYmVjb21lOgorCis8cD5MZXQKKzx1bD4KKwk8bGk+PGVtPiZtdTs8c3ViPmk8L3N1Yj48L2VtPiBiZSB0aGUgPGVtPkluZmVjdGlvdXMgTW9ydGFsaXR5CisJUmF0ZTwvZW0+LiBUaGlzIGlzIHRoZSByYXRlIGF0IHdoaWNoIGluZmVjdGVkIHBvcHVsYXRpb24gbWVtYmVycyBkaWUKKwlzcGVjaWZpY2FsbHkgZHVlIHRvIHRoZSBkaXNlYXNlLjwvbGk+Cis8L3VsPgorCis8cD5XZSBtb2RpZnkgb3VyIG1vZGVsIHRvIGluY2x1ZGUgdGhpcyBhZGRpdGlvbmFsIHJhdGUKKworPHVsPgorCTxsaT48ZW0+JkRlbHRhO3MgPSAmbXU7ICZtaW51czsgJmJldGE7cyBpICsgJnNpZ21hO3IgJm1pbnVzOworCSZtdTsgczwvZW0+PC9saT4KKwk8bGk+PGVtPiZEZWx0YTtlID0gJmJldGE7cyBpICZtaW51czsgJmVwc2lsb247ZSAmbWludXM7ICZtdTtlPC9lbT48L2xpPgorCTxsaT48ZW0+JkRlbHRhO2kgPSAmZXBzaWxvbjtlICZtaW51czsgJmdhbW1hO2kKKwkmbWludXM7ICgmbXU7KyZtdTs8c3ViPmk8L3N1Yj4paTwvZW0+PC9saT4KKwk8bGk+PGVtPiZEZWx0YTtyID0gJmdhbW1hO2kgJm1pbnVzOyAmc2lnbWE7cgorCSZtaW51czsgJm11O3I8L2VtPjwvbGk+Cis8L3VsPgorPC9wPgorPGgzPlNwYXRpYWwgQWRhcHRhdGlvbjwvaDM+Cis8cD4KKzx1bD4KKwk8bGk+PGVtPiZEZWx0YTtzIFA8c3ViPmw8L3N1Yj49ICZtdTtQPHN1Yj5sPC9zdWI+ICZtaW51czsKKwkmYmV0YTs8c3ViPmw8L3N1Yj4gcyBpIFA8c3ViPmw8L3N1Yj4gKyAmc2lnbWE7IHIgUDxzdWI+bDwvc3ViPiAmbWludXM7CisJJm11OyBzIFA8c3ViPmw8L3N1Yj48L2VtPjwvbGk+CisJPGxpPjxlbT4mRGVsdGE7ZSBQPHN1Yj5sPC9zdWI+PSAmYmV0YTtzaVA8c3ViPmw8L3N1Yj4gJm1pbnVzOworCSZlcHNpbG9uO2VQPHN1Yj5sPC9zdWI+ICZtaW51czsgJm11O2VQPHN1Yj5sPC9zdWI+PC9lbT48L2xpPgorCTxsaT48ZW0+JkRlbHRhO2lQPHN1Yj5sPC9zdWI+ID0gJmVwc2lsb247ZSBQPHN1Yj5sPC9zdWI+CisJJm1pbnVzOyAmZ2FtbWE7IGkgUDxzdWI+bDwvc3ViPiAmbWludXM7ICgmbXU7KyZtdTs8c3ViPmk8L3N1Yj4paSAKKwlQPHN1Yj5sPC9zdWI+PC9lbT48L2xpPgorCTxsaT48ZW0+JkRlbHRhO3IgUDxzdWI+bDwvc3ViPj0gJmdhbW1hO2lQPHN1Yj5sPC9zdWI+CisJJm1pbnVzOyAmc2lnbWE7ciBQPHN1Yj5sPC9zdWI+Jm1pbnVzOyAmbXU7ciBQPHN1Yj5sPC9zdWI+PC9lbT48L2xpPgorPC91bD4KKzxwPkxldCA8ZW0+UzxzdWI+bDwvc3ViPiA9IHMgUDxzdWI+bDwvc3ViPjwvZW0+IGJlIHRoZSBudW1iZXIgb2YgPGVtPlN1c2NlcHRpYmxlPC9lbT4KK3BvcHVsYXRpb24gbWVtYmVycyBhdCBsb2NhdGlvbiA8ZW0+bDwvZW0+LiBTaW1pbGFybHksIGxldCA8ZW0+STxzdWI+bDwvc3ViPgorPSBpIFA8c3ViPmw8L3N1Yj48L2VtPiBiZSB0aGUgbnVtYmVyIG9mIHBvcHVsYXRpb24gbWVtYmVycyBhdCBsb2NhdGlvbiA8ZW0+bDwvZW0+Cit0aGF0IGFyZSA8ZW0+SW5mZWN0aW91czwvZW0+LCBhbmQgbGV0IDxlbT5yCitQPHN1Yj5sPC9zdWI+IDwvZW0+YmUgdGhlIDxlbT5SZWNvdmVyZWQ8L2VtPiBwb3B1bGF0aW9uLiBGb3IgcmVhZGFiaWxpdHksIHdlCitkcm9wIHRoZSA8ZW0+bDwvZW0+IHN1YnNjcmlwdCBhbmQgc3Vic3RpdHV0ZS4gPC9wPgorU3Vic3RpdHV0aW5nCisKKzwvcD4KKzx1bD4KKwk8bGk+PGVtPiZEZWx0YTtTID0gJm11O1A8c3ViPmw8L3N1Yj4gJm1pbnVzOyAmYmV0YTs8c3ViPmw8L3N1Yj4KKwlTIGkgKyAmc2lnbWE7UiAmbWludXM7ICZtdTsgUzwvZW0+PC9saT4KKwk8bGk+PGVtPiZEZWx0YTtFID0gJmJldGE7UyBpICZtaW51czsgJmVwc2lsb247RSAmbWludXM7ICZtdTtFPC9lbT48L2xpPgorCTxsaT48ZW0+JkRlbHRhO0kgPSAmZXBzaWxvbjtFICZtaW51czsgJmdhbW1hO0kKKwkmbWludXM7ICgmbXU7KyZtdTs8c3ViPmk8L3N1Yj4pSSA8L2VtPjwvbGk+CisJPGxpPjxlbT4mRGVsdGE7Uj0gJmdhbW1hO0kmbWludXM7ICZzaWdtYTtSCisJJm1pbnVzOyAmbXU7UjwvZW0+PC9saT4KKzwvdWw+CisKK0NvbnRpbnVpbmcgd2l0aAorPGVtPiBpID0gSS9QPHN1Yj5sPC9zdWI+PC9lbT4KKywgd2UgaGF2ZToKKzx1bD4KKwk8bGk+PGVtPiZEZWx0YTtTID0gJm11O1A8c3ViPmw8L3N1Yj4gJm1pbnVzOyAoJmJldGE7PHN1Yj5sPC9zdWI+L1A8c3ViPmw8L3N1Yj4pU0kKKwkrICZzaWdtYTtSICZtaW51czsgJm11OyBTPC9lbT48L2xpPgorCTxsaT48ZW0+JkRlbHRhO0UgPSAoJmJldGE7PHN1Yj5sPC9zdWI+L1A8c3ViPmw8L3N1Yj4pU0kKKwkmbWludXM7ICZlcHNpbG9uO0UgJm1pbnVzOyAmbXU7RTwvZW0+PC9saT4KKwk8bGk+PGVtPiZEZWx0YTtJID0gJmVwc2lsb247RSAmbWludXM7ICZnYW1tYTtJCisJJm1pbnVzOyAoJm11OysmbXU7PHN1Yj5pPC9zdWI+KUkgPC9lbT48L2xpPgorCTxsaT48ZW0+JkRlbHRhO1I9ICZnYW1tYTtJICZtaW51czsgJnNpZ21hO1IKKwkmbWludXM7ICZtdTtSPC9lbT48L2xpPgorPC91bD4KKworTGV0dGluZworPGVtPiZiZXRhOzxzdXA+Kjwvc3VwPiA9ICZiZXRhOzxzdWI+bDwvc3ViPi9QPHN1Yj5sPC9zdWI+ID0gJmJldGE7CisoZDxzdWI+bDwvc3ViPi8oQVBEUDxzdWI+bDwvc3ViPikpIDwvZW0+CitnaXZlczoKKworPHVsPgorCTxsaT48ZW0+JkRlbHRhO1MgPSAmbXU7UDxzdWI+bDwvc3ViPiAmbWludXM7ICZiZXRhOzxzdXA+Kjwvc3VwPgorCVMgSSArICZzaWdtYTtSICZtaW51czsgJm11OyBTPC9lbT48L2xpPgorCTxsaT48ZW0+JkRlbHRhO0UgPSAmYmV0YTs8c3VwPio8L3N1cD4gUyBJICZtaW51czsgJmVwc2lsb247RQorCSZtaW51czsgJm11O0U8L2VtPjwvbGk+CisJPGxpPjxlbT4mRGVsdGE7SSA9ICZlcHNpbG9uO0UgJm1pbnVzOyAmZ2FtbWE7SQorCSZtaW51czsgKCZtdTsrJm11OzxzdWI+aTwvc3ViPilJIDwvZW0+PC9saT4KKwk8bGk+PGVtPiZEZWx0YTtSPSAmZ2FtbWE7SSAmbWludXM7ICZzaWdtYTtSCisJJm1pbnVzOyAmbXU7UjwvZW0+PC9saT4KKzwvdWw+CitUU0YKKzx1bD4KKwk8bGk+PGVtPlRTRjxzdWI+bDwvc3ViPiA9ICgoUytFK0krUikvQXJlYTxzdWI+bDwvc3ViPikgLworCShQL0FyZWEoUytFK0krUikpPC9lbT48L2xpPgorCTxsaT48ZW0+VFNGPHN1Yj5sPC9zdWI+ID0gKDEvQXJlYTxzdWI+bDwvc3ViPikgLyAoUC9BcmVhICk8L2VtPjwvbGk+CisJPGxpPjxlbT5UU0Y8c3ViPmw8L3N1Yj4gPSBBcmVhIC8gKFAgKkFyZWE8c3ViPmw8L3N1Yj4gKTwvZW0+PC9saT4KKwk8bGk+PGVtPlRTRjxzdWI+bDwvc3ViPiA9ICgxIC8gUCkqIChBcmVhL0FyZWE8c3ViPmw8L3N1Yj4gKTwvZW0+PC9saT4KKzwvdWw+Cis8aDM+TmVpZ2hib3JpbmcgSW5mZWN0aW91cyBQb3B1bGF0aW9uczwvaDM+Cis8L3A+Cis8dWw+CisJPGxpPjxlbT4mRGVsdGE7UyA9ICZtdTtQPHN1Yj5sPC9zdWI+ICZtaW51czsgJmJldGE7PHN1cD4qPC9zdXA+CisJUyAoSSArIEk8c3ViPm5laWdoYm9yPC9zdWI+KCkgKSArICZzaWdtYTtSICZtaW51czsgJm11OyBTPC9lbT48L2xpPgorCTxsaT48ZW0+JkRlbHRhO0UgPSAmYmV0YTs8c3VwPio8L3N1cD4gUyAoSSArIEk8c3ViPm5laWdoYm9yPC9zdWI+KCkKKwkpICZtaW51czsgJmVwc2lsb247RSAmbWludXM7ICZtdTtFPC9lbT48L2xpPgorCTxsaT48ZW0+JkRlbHRhO0kgPSAmZXBzaWxvbjtFICZtaW51czsgJmdhbW1hO0kKKwkmbWludXM7ICgmbXU7KyZtdTs8c3ViPmk8L3N1Yj4pSSA8L2VtPjwvbGk+CisJPGxpPjxlbT4mRGVsdGE7Uj0gJmdhbW1hO0kgJm1pbnVzOyAmc2lnbWE7UgorCSZtaW51czsgJm11O1I8L2VtPjwvbGk+Cis8L3VsPgorCitTcGVjaWZpYyBzdGF0aXN0aWNzIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgYmlydGhzLCBkZWF0aHMgYW5kIGRlYXRocyBkdWUKK3RvIHRoZSBkaXNlYXNlIGNhbiBiZSBjb21wdXRlZCBieSBhZGRpbmcgdGhlIGFwcHJvcHJpYXRlIHRlcm1zIG9mIHRoZQorZXF1YXRpb25zIGFib3ZlLgorPHVsPgorCTxsaT48ZW0+Qj0gJm11OyhTICsgRSArIEkgKyBSKTwvZW0+LCBpcyB0aGUgbnVtYmVyIG9mIDxlbT5CaXJ0aHM8L2VtPgorCTwvbGk+CisJPGxpPjxlbT5EID0gJm11O1MgKyAmbXU7RSArICgmbXU7ICsgJm11OzxzdWI+aTwvc3ViPilJCisJKyAmbXU7UjwvZW0+LGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgPGVtPkRlYXRoczwvZW0+PC9saT4KKwk8bGk+PGVtPkREPSAmbXU7PHN1Yj5pPC9zdWI+IEk8L2VtPiwgaXMgdGhlIG51bWJlciBvZgorCTxlbT5EaXNlYXNlIERlYXRoczwvZW0+PC9saT4KKzwvdWw+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2VwaWRlbWlvbG9naWNhbG1vZGVsaW5nL3NpbWF0aC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2VwaWRlbWlvbG9naWNhbG1vZGVsaW5nL3NpbWF0aC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZTBhNTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvZXBpZGVtaW9sb2dpY2FsbW9kZWxpbmcvc2ltYXRoLmh0bWwKQEAgLTAsMCArMSwyNTcgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPlNJIERpc2Vhc2UgTW9kZWwgTWF0aGVtYXRpY3M8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+U0koUykgRGlzZWFzZSBNb2RlbCBNYXRoZW1hdGljczwvaDE+Cis8aW1nIHNyYz0iaW1hZ2VzL3Npcy5naWYiIGFsaWduPUNFTlRFUiBIU1BBQ0U9MTAgVlNQQUNFPTEwIGJvcmRlcj0wPgorPHA+VGhlIGJhc2ljIDxlbT5TSTwvZW0+IChTdXNjZXB0aWJsZSwgSW5mZWN0aW91cykKK2FuZCA8ZW0+U0lTPC9lbT4gKFN1c2NlcHRpYmxlLCBJbmZlY3Rpb3VzIFN1c2NlcHRpYmxlKSAKK2Rpc2Vhc2UgbW9kZWxzIGFzc3VtZSBhIHVuaWZvcm0gcG9wdWxhdGlvbiAKK2F0IGEgc2luZ2xlIGxvY2F0aW9uIGFuZCB0aGF0IHRoZQorcG9wdWxhdGlvbiBtZW1iZXJzIGFyZSB3ZWxsICJtaXhlZCIsIG1lYW5pbmcgdGhhdCB0aGV5IGFyZSBlcXVhbGx5CitsaWtlbHkgdG8gbWVldCBhbmQgaW5mZWN0IGVhY2ggb3RoZXIuIFRoaXMgbW9kZWwsIGZvciBhIG5vcm1hbGl6ZWQKK3BvcHVsYXRpb24sIGNhbiBiZSBkZWZpbmVkIGJ5IHRoZSB0d28gZGlmZmVyZW5jZSBlcXVhdGlvbnMgYmVsb3c6Cis8dWw+CisJPGxpPjxlbT4mRGVsdGE7cyA9ICZtdTsgJm1pbnVzOyAmYmV0YTtzIGkgKyAmZ2FtbWE7aSAmbWludXM7CisJJm11O3M8L2VtPjwvbGk+CisJPGxpPjxlbT4mRGVsdGE7aSA9ICZiZXRhO3MgaSAmbWludXM7ICZnYW1tYTtpICZtaW51czsgJm11O2k8L2VtPjwvbGk+Cis8L3VsPgorPHA+V2hlcmU6Cis8dWw+CisJPGxpPjxlbT5zPC9lbT4gaXMgdGhlIHByb3BvcnRpb24gb2YgdGhlIHBvcHVsYXRpb24gPGVtPlN1c2NlcHRpYmxlPC9lbT4gdG8gdGhlIGRpc2Vhc2UuIDwvbGk+CisJPGxpPjxlbT5pPC9lbT4gaXMgdGhlIHByb3BvcnRpb24gb2YgdGhlIHBvcHVsYXRpb24gdGhhdCBpcyA8ZW0+SW5mZWN0aW91czwvZW0+PC9saT4KKwk8bGk+PGVtPiZtdTs8L2VtPiBib3RoIHRoZSByYXRlIG9mIGltbWlncmF0aW9uIChlLmcuLCBieSBiaXJ0aCkgYW5kIGVtaWdyYXRpb24KKwkJKGUuZy4sIGJ5IGRlYXRoKSBmcm9tIHRoZSBwb3B1bGF0aW9uLiBUaGVzZSByYXRlcyBhcmUgYXNzdW1lZCB0byBiZSBlcXVhbAorCQlvdmVyIHRoZSB0aW1lIHBlcmlvZCBvZiBpbnRlcmVzdCAodGhpcyBzaW1wbGlmaWVzIHRoZSBtYXRoZW1hdGljcykuPC9saT4KKwk8bGk+PGVtPiZiZXRhOzwvZW0+IGlzIHRoZSBkaXNlYXNlIHRyYW5zbWlzc2lvbiAoaW5mZWN0aW9uKSByYXRlLgorCVRoZSByYXRlIGF0IHdoaWNoIGluZmVjdGlvdXMgaW5kaXZpZHVhbHMgaW5mZWN0IHN1c2NlcHRpYmxlIGluZGl2aWR1YWxzLiBPbmNlCisJaW5mZWN0ZWQsIHN1c2NlcHRpYmxlIGluZGl2aWR1YWxzIGluc3RhbnRseSBiZWNvbWUgaW5mZWN0aW91cyB0aGVtc2VsdmVzLiBJbiB0aGUgU1RFTSAKKwluZXcgZGlzZWFzZSB3aXphcmQsIDxlbT4mYmV0YTs8L2VtPiBpcyBzcGVjaWZpZWQgdXNpbmcgIHRoZSAiVHJhbnNtaXNzaW9uIFJhdGUiIHByb3BlcnR5LjwvbGk+CisJPGxpPiZnYW1tYTsgaXMgdGhlIHJhdGUgYXQgd2hpY2ggaW5kaXZpZHVhbHMgY2xlYXIgaW5mZWN0aW9uLiBJbiB0aGlzIG1vZGVsIHRoZXNlCisJCWluZGl2aWR1YWxzIGJlY29tZSBzdXNjZXB0aWJsZSBhZ2FpbiBhZnRlciBjbGVhcmluZyBpbmZlY3Rpb24uIEluIGEgcHVyZSA8ZW0+U0k8L2VtPiBtb2RlbCwKKwkJdGhpcyByYXRlIGlzIDAuIEluIHRoZSBTVEVNICBuZXcgZGlzZWFzZSB3aXphcmQsIDxlbT4mZ2FtbWE7PC9lbT4gaXMgc3BlY2lmaWVkIHVzaW5nIAorCQl0aGUgIkluZmVjdGlvdXMgUmVjb3ZlcnkgUmF0ZSIgcHJvcGVydHkuPC9saT4KKzwvdWw+Cis8L3A+Cis8cD5JbiB0aGUgZmlyc3QgZXF1YXRpb24sIHRoZSA8ZW0+U3VzY2VwdGlibGU8L2VtPiBwb3B1bGF0aW9uCitpbmNyZWFzZXMgd2hlbiBuZXcgbWVtYmVycyBhcmUgYm9ybi4gVGhpcyB2YWx1ZSBpcyB0aGUgYmlydGggcmF0ZSAmbXU7CittdWx0aXBsaWVkIGJ5IHRoZSB0b3RhbCBwb3B1bGF0aW9uIHdoaWNoLCBzaW5jZSB0aGUgdmFsdWVzIGFyZSBub3JtYWxpemVkLCBpcyAxLiBJdCBhbHNvIGluY3JlYXNlcyAKK2R1ZSB0byA8ZW0+SW5mZWN0aW91czwvZW0+IHBvcHVsYXRpb24gbWVtYmVycyByZWNvdmVyaW5nLiBUaGUgPGVtPlN1c2NlcHRpYmxlPC9lbT4gcG9wdWxhdGlvbgorZGVjcmVhc2VzIGJ5IG1lbWJlcnMgd2hvIGRpZS4gVGhhdCB2YWx1ZSBpcyAmbXU7LCB0aGUgbW9ydGFsaXR5IHJhdGUsCittdWx0aXBsaWVkIGJ5IHRoZSA8ZW0+U3VzY2VwdGlibGU8L2VtPiBwb3B1bGF0aW9uLCA8ZW0+czwvZW0+LiBUaGUgPGVtPlN1c2NlcHRpYmxlPC9lbT4KK3BvcHVsYXRpb24gYWxzbyBkZWNyZWFzZXMgYnkgaGF2aW5nIG1lbWJlcnMgYmVjb21lIDxlbT5pbmZlY3RlZDwvZW0+LgorVGhlIHByb2R1Y3Qgb2YgPGVtPiZiZXRhOzwvZW0+IGFuZCA8ZW0+aTwvZW0+IGdpdmVzIHRoZSBub3JtYWxpemVkCitudW1iZXIgb2YgPGVtPlN1c2NlcHRpYmxlPC9lbT4gcG9wdWxhdGlvbiBtZW1iZXJzIHRoYXQgd291bGQgYmVjb21lCitpbmZlY3RlZCBmb3IgZWFjaCA8ZW0+SW5mZWN0aW91czwvZW0+IHBvcHVsYXRpb24gbWVtYmVyIGFzc3VtaW5nIGFsbAorcG9wdWxhdGlvbiBtZW1iZXJzIGFyZSBpbiB0aGUgPGVtPlN1c2NlcHRpYmxlPC9lbT4gc3RhdGUuIE11bHRpcGx5aW5nCit0aGF0IGJ5IDxlbT5zPC9lbT4sIHRoZSBmcmFjdGlvbiB0aGF0IGFjdHVhbGx5IGFyZSA8ZW0+U3VzY2VwdGlibGU8L2VtPiwKK2dpdmVzIHRoZSBub3JtYWxpemVkIGFtb3VudCB0aGF0IGJlY29tZSA8ZW0+SW5mZWN0aW91czwvZW0+LjwvcD4KKzxwPkluIHRoZSBzZWNvbmQgZXF1YXRpb24sIHRoZSA8ZW0+SW5mZWN0aW91czwvZW0+IHBvcHVsYXRpb24KK2luY3JlYXNlcyBieSB0aGUgbnVtYmVyIG9mIDxlbT5TdXNjZXB0aWJsZTwvZW0+IHBvcHVsYXRpb24gbWVtYmVycyB0aGF0CitiZWNvbWUgPGVtPkluZmVjdGlvdXM8L2VtPiAodGhlIGZpcnN0IHRlcm0pLiBJdCBhbHNvIGRlY3JlYXNlcyBieSB0aGUKK3Byb3BvcnRpb24gdGhhdCA8ZW0+UmVjb3ZlcjwvZW0+IGZyb20gdGhlIGRpc2Vhc2UgKG1pZGRsZSB0ZXJtKSBhbmQgYnkKK3RoZSBwcm9wb3J0aW9uIHRoYXQgZGllIChsYXN0IHRlcm0pLjwvcD4KKzxwPkZyZXF1ZW50bHksIGJlaW5nIGluZmVjdGVkIGJ5IGEgZGlzZWFzZSB3aWxsIGluY3JlYXNlIHRoZQorbGlrZWxpaG9vZCB0aGF0IGEgcG9wdWxhdGlvbiBtZW1iZXIgd2lsbCBkaWUuIFRoZSBtb2RlbCBhYm92ZSBuZWVkcyB0bworYmUgZW5oYW5jZWQgdG8gaW5jbHVkZSB0aGUgbGlrZWxpaG9vZCBvZiBhIGZhdGFsIGluZmVjdGlvbiBhbmQgYQorcG90ZW50aWFsbHkgZGlmZmVyZW50IHJhdGUgYXQgd2hpY2ggaW5mZWN0ZWQgbWVtYmVycyBkaWUuPC9wPgorPHA+TGV0Cis8dWw+CisJPGxpPjxlbT4mbXU7PHN1Yj5pPC9zdWI+PC9lbT4gYmUgdGhlIDxlbT5JbmZlY3Rpb3VzIE1vcnRhbGl0eQorCVJhdGU8L2VtPi4gVGhpcyBpcyB0aGUgaW5jcmVhc2VkIHJhdGUgYXQgd2hpY2ggaW5mZWN0ZWQgcG9wdWxhdGlvbiBtZW1iZXJzIGRpZQorCXNwZWNpZmljYWxseSBkdWUgdG8gdGhlIGRpc2Vhc2UuIFRoZSBhY3R1YWwgbW9ydGFsaXR5IHJhdGUgYXQgd2hpY2ggaW5mZWN0ZWQgcG9wdWxhdGlvbgorCW1lbWJlcnMgZGllIGlzIDxlbT4mbXU7KyZtdTs8c3ViPmk8L3N1Yj48L2VtPiAodGhlIGJhY2tncm91bmQgbW9ydGFsaXR5IHJhdGUgcGx1cyAKKwl0aGUgaW5mZWN0aW91cyBtb3J0YWxpdHkgcmF0ZSkgPC9saT4KKzwvdWw+Cis8L3A+CisKKzxwPldlIG1vZGlmeSBvdXIgbW9kZWwgdG8gaW5jbHVkZSB0aGlzIGFkZGl0aW9uYWwgcmF0ZQorCis8dWw+CisJPGxpPjxlbT4mRGVsdGE7cyA9ICZtdTtQICZtaW51czsgJmJldGE7cyBpICsgJmdhbW1hO2kKKwkmbWludXM7ICZtdTsgczwvZW0+PC9saT4KKwk8bGk+PGVtPiZEZWx0YTtpID0gJmJldGE7cyBpICZtaW51czsKKwkmZ2FtbWE7aSAmbWludXM7ICgmbXU7KyZtdTs8c3ViPmk8L3N1Yj4paTwvZW0+PC9saT4KKzwvdWw+Cis8L3A+Cis8aDM+U3BhdGlhbCBBZGFwdGF0aW9uPC9oMz4KKzxwPlRoZSAiU0kiIGRpc2Vhc2UgbW9kZWwgY29tcHV0YXRpb25zIGluIFNURU0gZW5oYW5jZSB0aGVzZQorZXF1YXRpb25zIGJ5IGFkYXB0aW5nIHRoZW0gdG8gcG9wdWxhdGlvbnMgdGhhdCBhcmUgc3BhdGlhbGx5CitkaXN0cmlidXRlZC4gVGhpcyByZWxheGVzIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHBvcHVsYXRpb25zIGFyZSBhdCBhCitzaW5nbGUgbG9jYXRpb24gYW5kIG9wZW5zIHVwIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGRpZmZlcmVudCBsb2NhdGlvbnMKK2NvdWxkIGhhdmUgZGlmZmVyZW50IGFyZWFzIGFuZCBudW1iZXJzIG9mIHBvcHVsYXRpb24gbWVtYmVycyAoaS5lLiwKK2RpZmZlcmVudCBwb3B1bGF0aW9uIGRlbnNpdGllcykuIFRvIGFjY29tbW9kYXRlIHRoaXMgc2l0dWF0aW9uIFNURU0KK21haW50YWlucyBzZXBhcmF0ZSBkaXNlYXNlIHN0YXRlIHZhbHVlcyBmb3IgZWFjaCBsb2NhdGlvbiBhbmQgdXNlcwordW5ub3JtYWxpemVkIHZlcnNpb25zIG9mIHRoZSBlcXVhdGlvbnMgcHJlc2VudGVkIGFib3ZlLiBXZSBkZXZlbG9wIHRob3NlCitiZWxvdy4KKzxwPlRvIGFjY291bnQgZm9yIHBvcHVsYXRpb24gZGlmZmVyZW5jZXMgYXQgZGlmZmVyZW50IGxvY2F0aW9ucywgd2UKK2RlZmluZSBhIG5ldyBwYXJhbWV0ZXIgPGVtPlA8c3ViPmw8L3N1Yj48L2VtPiB3aGljaCBpcyB0aGUgbnVtYmVyIG9mCitwb3B1bGF0aW9uIG1lbWJlcnMgYXQgbG9jYXRpb24gPGVtPmw8L2VtPiAoTm90ZTogPGVtPlA8c3ViPmw8L3N1Yj4KKz0gUzxzdWI+bDwvc3ViPiArIEk8c3ViPmw8L3N1Yj48L2VtPikuIFdlIGFsc28gbmVlZCB0byBhY2NvdW50IGZvciB2YXJpYWJpbGl0eSBpbiB0aGUgZGlzZWFzZQordHJhbnNtaXNzaW9uIChpbmZlY3Rpb24pIHJhdGUsICZiZXRhOywgZHVlIHRvIHBvdGVudGlhbGx5IGRpZmZlcmVudAorcG9wdWxhdGlvbiBkZW5zaXRpZXMuIFRoaXMgbW9kaWZpY2F0aW9uIGlzIGJhc2VkIHVwb24gdGhlIGFzc3VtcHRpb24KK3RoYXQgbG9jYXRpb25zIHdpdGggZ3JlYXRlciBwb3B1bGF0aW9uIGRlbnNpdGllcyB3aWxsIGhhdmUgYSBoaWdoZXIKK2VmZmVjdGl2ZSB0cmFuc21pc3Npb24gcmF0ZXMgdGhhbiBsb2NhdGlvbnMgd2l0aCBsb3dlciBkZW5zaXRpZXMgKGkuZS4sCitvbmUgdmFsdWUgY2FuJ3QgYmUgdXNlZCBmb3IgYWxsIGxvY2F0aW9ucykuIFRodXMsIHdlIG5lZWQgdG8gcmVwbGFjZSB0aGUKKzxlbT4mYmV0YTs8L2VtPiBpbiB0aGUgbm9uLXNwYXRpYWwgdmVyc2lvbnMgb2YgdGhlIGVxdWF0aW9ucyB3aXRoIGEgPGVtPiZiZXRhOworPHN1Yj5sPC9zdWI+PC9lbT4gdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgbG9jYXRpb24uPC9wPgorTWFraW5nIHRoZSBzdWJzdGl0dXRpb24gZm9yCis8ZW0+JmJldGE7PC9lbT4KK2FuZCBtdWx0aXBseSBib3RoIHNpZGVzIG9mIHRoZSBlcXVhdGlvbnMgYnkKKzxlbT5QPHN1Yj5sPC9zdWI+PC9lbT4KKywgd2Ugb2J0YWluOgorPC9wPgorCis8dWw+CisJPGxpPjxlbT4mRGVsdGE7cyBQPHN1Yj5sPC9zdWI+PSAmbXU7UDxzdWI+bDwvc3ViPiAmbWludXM7CisJJmJldGE7PHN1Yj5sPC9zdWI+IHMgaSBQPHN1Yj5sPC9zdWI+ICsgJmdhbW1hOyBpIFA8c3ViPmw8L3N1Yj4KKwkmbWludXM7ICZtdTsgcyBQPHN1Yj5sPC9zdWI+PC9lbT48L2xpPgorCTxsaT48ZW0+JkRlbHRhO2kgUDxzdWI+bDwvc3ViPiA9ICZiZXRhOzxzdWI+bDwvc3ViPgorCXMgaSBQPHN1Yj5sPC9zdWI+ICZtaW51czsgJmdhbW1hOyBpIFA8c3ViPmw8L3N1Yj4gJm1pbnVzOworCSgmbXU7KyZtdTs8c3ViPmk8L3N1Yj5pIFA8c3ViPmw8L3N1Yj48L2VtPjwvbGk+CisJPC9saT4KKzwvdWw+CisKK1dlIGNob29zZSB0aGUgdmFsdWUgZm9yCis8ZW0+JmJldGE7PHN1Yj5sPC9zdWI+PC9lbT4KK3RvIGJlIG9yaWdpbmFsCis8ZW0+JmJldGE7PC9lbT4KK3NjYWxlZCBieSB0aGUgcmF0aW8gYmV0d2VlbiB0aGUgcG9wdWxhdGlvbiBkZW5zaXR5IGF0IHRoZSBsb2NhdGlvbiBhbmQKK3RoZSBhdmVyYWdlIHBvcHVsYXRpb24gZGVuc2l0eSBvZiBhbGwgbG9jYXRpb25zLgorPHVsPgorCTxsaT48ZW0+ICZiZXRhOzxzdWI+bDwvc3ViPiA9ICZiZXRhOyBkPHN1Yj5sPC9zdWI+L0FQRDwvZW0+PC9saT4KKzwvdWw+CitXaGVyZQorPGVtPmQ8c3ViPmw8L3N1Yj48L2VtPgoraXMgdGhlIHBvcHVsYXRpb24gZGVuc2l0eSBhdCBsb2NhdGlvbgorPGVtPmw8L2VtPgorLCBhbmQKKzxlbT5BUEQ8L2VtPgoraXMgdGhlIGF2ZXJhZ2UgcG9wdWxhdGlvbiBkZW5zaXR5IGZvciBhbGwgbG9jYXRpb25zLgorCis8cD5MZXQgPGVtPlM8c3ViPmw8L3N1Yj4gPSBzIFA8c3ViPmw8L3N1Yj48L2VtPiBiZSB0aGUgbnVtYmVyIG9mIDxlbT5TdXNjZXB0aWJsZTwvZW0+Citwb3B1bGF0aW9uIG1lbWJlcnMgYXQgbG9jYXRpb24gPGVtPmw8L2VtPi4gLCBsZXQgPGVtPkk8c3ViPmw8L3N1Yj4KKz0gaSBQPHN1Yj5sPC9zdWI+PC9lbT4gYmUgdGhlIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgYXQgbG9jYXRpb24gPGVtPmw8L2VtPgordGhhdCBhcmUgPGVtPkluZmVjdGlvdXM8L2VtPiAoYm90aCBzdGF0ZXMgY29tYmluZWQpLiBGb3IgcmVhZGFiaWxpdHksIHdlCitkcm9wIHRoZSA8ZW0+bDwvZW0+IHN1YnNjcmlwdCBhbmQgc3Vic3RpdHV0ZS48L3A+CisKKzx1bD4KKwk8bGk+PGVtPiZEZWx0YTtTID0gJm11O1A8c3ViPmw8L3N1Yj4gJm1pbnVzOyAmYmV0YTs8c3ViPmw8L3N1Yj4KKwlTIGkgKyAmZ2FtbWE7SSAgJm1pbnVzOyAmbXU7IFM8L2VtPjwvbGk+CisJPGxpPjxlbT4mRGVsdGE7SSA9ICZiZXRhOzxzdWI+bDwvc3ViPiBTIGkKKwkmbWludXM7ICZnYW1tYTtJICZtaW51czsgKCZtdTsrJm11OzxzdWI+aTwvc3ViPilJICA8L2VtPjwvbGk+Cis8L3VsPgorCitDb250aW51aW5nIHdpdGgKKzxlbT4gaSA9IEkvUDxzdWI+bDwvc3ViPjwvZW0+CissIHdlIGhhdmU6Cis8dWw+CisJPGxpPjxlbT4mRGVsdGE7UyA9ICZtdTtQPHN1Yj5sPC9zdWI+ICZtaW51czsgKCZiZXRhOzxzdWI+bDwvc3ViPi9QPHN1Yj5sPC9zdWI+KQorCVMgSSArICZnYW1tYTtJICZtaW51czsgJm11OyBTPC9lbT48L2xpPgorCTxsaT48ZW0+JkRlbHRhO0kgPSAoJmJldGE7PHN1Yj5sPC9zdWI+L1A8c3ViPmw8L3N1Yj4pCisJUyBJICZtaW51czsgJmdhbW1hO0kgJm1pbnVzOyAoJm11OysmbXU7PHN1Yj5pPC9zdWI+KUkgPC9lbT48L2xpPgorPC91bD4KKworTGV0dGluZworPGVtPiZiZXRhOzxzdXA+Kjwvc3VwPiA9ICZiZXRhOzxzdWI+bDwvc3ViPi9QPHN1Yj5sPC9zdWI+ID0gJmJldGE7CisoZDxzdWI+bDwvc3ViPi8oQVBEUDxzdWI+bDwvc3ViPikpIDwvZW0+CitnaXZlczoKKworPHVsPgorCTxsaT48ZW0+JkRlbHRhO1MgPSAmbXU7UDxzdWI+bDwvc3ViPiAmbWludXM7ICZiZXRhOzxzdXA+Kjwvc3VwPgorCVMgSSArICZnYW1tYTtJICZtaW51czsgJm11OyBTPC9lbT48L2xpPgorCTxsaT48ZW0+JkRlbHRhO0kgPSAmYmV0YTs8c3VwPio8L3N1cD4gUyBJCisJJm1pbnVzOyAmZ2FtbWE7SSAmbWludXM7ICgmbXU7KyZtdTs8c3ViPmk8L3N1Yj4pSSA8L2VtPjwvbGk+Cis8L3VsPgorCis8cD5Db21wdXRpbmcgPGVtPiZiZXRhOzxzdXA+Kjwvc3VwPjwvZW0+IGlzIHN0cmFpZ2h0Zm9yd2FyZC4gTGV0IDxlbT5UU0Y8c3ViPmw8L3N1Yj4KKz0gKGQ8c3ViPmw8L3N1Yj4vKEFQRFA8c3ViPmw8L3N1Yj4pPC9lbT4gYmUgdGhlIDxlbT50cmFuc21pc3Npb24gc2NhbGUKK2ZhY3RvcjwvZW0+IGF0IGxvY2F0aW9uIDxlbT5sPC9lbT4uPC9wPgorPHA+VGh1cworPHVsPgorCTxsaT48ZW0+JmJldGE7PHN1cD4qPC9zdXA+ID0gJmJldGE7IFRTRjxzdWI+bDwvc3ViPjwvZW0+PC9saT4KKzwvdWw+Cis8L3A+Cis8cD5TdWJzdGl0dXRpbmcgPGVtPlA8c3ViPmw8L3N1Yj4gPSBTICsgSTwvZW0+LCA8ZW0+QVBEID0KK1AvQXJlYTwvZW0+IGFuZCA8ZW0+ZDxzdWI+bDwvc3ViPiA9IChTK0kpL0FyZWE8c3ViPmw8L3N1Yj48L2VtPiwgd2hlcmUgPGVtPlA8L2VtPgoraXMgdGhlIHRvdGFsIHBvcHVsYXRpb24gZm9yIGFsbCBsb2NhdGlvbnMsIDxlbT5BcmVhPHN1Yj5sPC9zdWI+PC9lbT4gaXMKK3RoZSBhcmVhIG9mIGxvY2F0aW9uIDxlbT5sPC9lbT4sIGFuZCA8ZW0+QXJlYTwvZW0+IGlzIHRoZSB0b3RhbCBhcmVhIG9mCithbGwgbG9jYXRpb25zLCB3ZSBnZXQ6Cis8dWw+CisJPGxpPjxlbT5UU0Y8c3ViPmw8L3N1Yj4gPSAoKFMrSSkvQXJlYTxzdWI+bDwvc3ViPikgLyAoUC9BcmVhCisJKFMrSSkpPC9lbT48L2xpPgorCTxsaT48ZW0+VFNGPHN1Yj5sPC9zdWI+ID0gKDEvQXJlYTxzdWI+bDwvc3ViPikgLyAoUC9BcmVhICk8L2VtPjwvbGk+CisJPGxpPjxlbT5UU0Y8c3ViPmw8L3N1Yj4gPSBBcmVhIC8gKFAgKkFyZWE8c3ViPmw8L3N1Yj4gKTwvZW0+PC9saT4KKwk8bGk+PGVtPlRTRjxzdWI+bDwvc3ViPiA9ICgxIC8gUCkqIChBcmVhL0FyZWE8c3ViPmw8L3N1Yj4gKTwvZW0+PC9saT4KKzwvdWw+CitTbyB0aGUKKzxlbT5UU0Y8c3ViPmw8L3N1Yj48L2VtPgoraXMgdGhlIHByb2R1Y3Qgb2YgdGhlIHJlY2lwcm9jYWwgb2YgdGhlIHRvdGFsIHBvcHVsYXRpb24gb2YgYWxsCitsb2NhdGlvbnMgYW5kIHRoZSBjb25zdGFudCByYXRpbyBiZXR3ZWVuIHRoZSBhcmVhIG9mIHRoZSBsb2NhdGlvbiBhbmQKK3RoZSB0b3RhbCBhcmVhIG9mIGFsbCBsb2NhdGlvbnMuIFRoZSBmb3JtZXIgY2FuIGJlIGNvbXB1dGVkIGJ5CithY2N1bXVsYXRpbmcgdGhlIHBvcHVsYXRpb24gb2YgYWxsIGxvY2F0aW9ucyBhcyB0aGV5IGFyZSBnZW5lcmF0ZWQgYW5kCit0aGUgbGF0ZXIgcmF0aW8gY2FuIGJlIGNvbXB1dGVkIG9uY2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzaW11bGF0aW9uLgorPC9wPgorCis8aDM+TmVpZ2hib3JpbmcgSW5mZWN0aW91cyBQb3B1bGF0aW9uczwvaDM+Cis8cD5UaGUgZXh0ZW5zaW9uIG9mIHRoZSBub24tc3BhdGlhbCBtb2RlbCBpbnRvIGEgc3BhdGlhbCBvbmUgaW4gU1RFTQorYWxzbyBuZWVkcyB0byBhY2NvdW50IGZvciBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gbWVtYmVycyB0aGF0IHJlc2lkZSBpbiBhCitsb2NhdGlvbidzICJuZWlnaGJvcnMiLiBDb25zaWRlciBhIGxvY2F0aW9uIHdpdGggbm8gaW5mZWN0aW9ucyB0aGF0IGlzCitwaHlzaWNhbGx5IGFkamFjZW50IHRvIHNldmVyYWwgbG9jYXRpb25zIHRoYXQgaGF2ZSBsYXJnZSBpbmZlY3Rpb3VzCitwb3B1bGF0aW9ucy4gVGhpcyBwaHlzaWNhbCBhZGphY2VuY3kgd291bGQgbmF0dXJhbGx5IGxlYWQgdG8KK3BvcHVsYXRpb24tdG8tcG9wdWxhdGlvbiBjb250YWN0IGFuZCBldmVudHVhbGx5IHRvIGRpc2Vhc2UgdHJhbnNtaXNzaW9uLgorV2UgbmVlZCB0byBmdXJ0aGVyIGV4dGVuZCB0aGUgZXF1YXRpb25zIHdlIGFyZSBoZXJlIHRvIGluY29ycG9yYXRlIHRoaXMKK2FzcGVjdCBvZiBhIHNwYXRpYWxseSBkaXN0cmlidXRlZCBwb3B1bGF0aW9uLjwvcD4KKzxwPkluIFNURU0sIGEgbG9jYXRpb24gaGFzIGFub3RoZXIgbG9jYXRpb24gYXMgYSBuZWlnaGJvciA8ZW0+UmVsYXRpb25zaGlwPC9lbT4KK3RoYXQgbGlua3MgaXQgdG8gdGhhdCBsb2NhdGlvbi4gSWYgdGhlIDxlbT5SZWxhdGlvbnNoaXA8L2VtPiByZXByZXNlbnRzCit0aGUgZXhjaGFuZ2Ugb2Ygb2YgcG9wdWxhdGlvbiBtZW1iZXJzIChpLmUuLCBzb21lIGtpbmQgb2YgdHJhbnNwb3J0YXRpb24KK3JlbGF0aW9uc2hpcCBsaWtlIHBhdGh3YXlzLCByb2FkcyBvciBhaXIgdHJhdmVsKSB0aGVuIGl0IHdvdWxkIGJlCitwb3NzaWJsZSBmb3IgPGVtPkluZmVjdGlvdXM8L2VtPiBwb3B1bGF0aW9uIG1lbWJlcnMgZnJvbSBhIG5laWdoYm9yIHRvCisidmlzaXQiIGEgbG9jYXRpb24uIFdlIG5lZWQgdG8gYWNjb3VudCBmb3IgdGhpcyBwb3RlbnRpYWwgYnkgaW5jcmVhc2luZwordGhlICJlZmZlY3RpdmUiIDxlbT5JbmZlY3Rpb3VzPC9lbT4gcG9wdWxhdGlvbiBhdCBhIGxvY2F0aW9uIHdoZW4gZG9pbmcKK291ciBjb21wdXRhdGlvbnMuIEVhY2ggUmVsYXRpb25zaGlwIGhhcyBhIHJhdGUgYXQgd2hpY2ggcG9wdWxhdGlvbgorbWVtYmVycyB0cmF2ZWwgZnJvbSBvbmUgbG9jYXRpb24gdG8gYW5vdGhlci4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZQordmlzaXRvcnMgd291bGQgaGF2ZSB0aGUgc2FtZSBsZXZlbCBvZiAiaW5mZWN0aW91cyBjb250YWN0IiBhcyBhbgoraW5mZWN0aW91cyBtZW1iZXIgb2YgdGhlIHBvcHVsYXRpb24gYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gKGkuZS4sIHRoYXQKK3RoZXkgY291bGQgY291bGQgYmUgY291bnRlZCBhcyBhbiBpbmZlY3Rpb3VzIG1lbWJlciBvZiB0aGUgcG9wdWxhdGlvbiBhdAordGhlIGN1cnJlbnQgbG9jYXRpb24pLjwvcD4KKzxwPlRoZSBlcXVhdGlvbnMgYmVjb21lOjwvcD4KKzx1bD4KKwk8bGk+PGVtPiZEZWx0YTtTID0gJm11O1A8c3ViPmw8L3N1Yj4gJm1pbnVzOyAmYmV0YTs8c3VwPio8L3N1cD4KKwlTIChJICsgSTxzdWI+bmVpZ2hib3I8L3N1Yj4oKSApICsgJmdhbW1hO0kgJm1pbnVzOyAmbXU7IFM8L2VtPgorCTwvbGk+CisJPGxpPjxlbT4mRGVsdGE7SSA9ICZiZXRhOzxzdXA+Kjwvc3VwPiBTIChJCisJKyBJPHN1Yj5uZWlnaGJvcjwvc3ViPigpICkgJm1pbnVzOyAmZ2FtbWE7SSAmbWludXM7ICgmbXU7KyZtdTs8c3ViPmk8L3N1Yj4pSQorCTwvZW0+PC9saT4KKzwvdWw+Cis8L3A+Cis8cD5XaGVyZQorPHVsPgorCTxsaT48ZW0+STxzdWI+bmVpZ2hib3I8L3N1Yj4oKSA9ICgmc3VtOyA8c3ViPm08L3N1Yj4gSSA8c3ViPm08L3N1Yj5taXhpbmdmYWN0b3IpLygmc3VtOzxzdWI+bTwvc3ViPlA8c3ViPm08L3N1Yj5taXhpbmdmYWN0b3IpPC9lbT4KKwlpcyB0aGUgbnVtYmVyIG9mIDxlbT5JbmZlY3Rpb3VzPC9lbT4gdmlzaXRvcnMgZnJvbSBuZWlnaGJvciA8ZW0+bTwvZW0+LjwvbGk+CisJPGxpPjxlbT5taXhpbmdmYWN0b3I8L2VtPiBpcyBhIGNvbnN0YW50IHRoYXQgdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiByZWxhdGlvbnNoaXAuIEZvciBuZWlnaGJvcmluZyBsb2NhdGlvbnMKKwkoaS5lLiBwZW9wbGUgbWlncmF0aW5nIGFjcm9zcyBib3JkZXIpIFNURU0gdXNlcyB0aGUgIlBoeXMuQWRqLkluZi5Qcm9wb3J0aW9uIiBwcm9wZXJ0eSBvbiB0aGUgbmV3IGRpc2Vhc2UgCisJd2l6YXJkIHRvIHNwZWNpZnkgdGhlIG1peGluZyBmYWN0b3IuIEZvciByb2FkIHRyYW5zcG9ydGF0aW9uLCBTVEVNIHVzZXMgIlJvYWQuTmV0LkluZi5Qcm9wb3J0aW9uIiB0byAKKwlzcGVjaWZ5IHRoZSBtaXhpbmcgZmFjdG9yIGZvciByb2FkcyBiZXR3ZWVuIGxvY2F0aW9ucy48L2xpPgorCTxsaT5QPHN1Yj5tPC9zdWI+IGlzIHRoZSBudW1iZXIgb2YgcG9wdWxhdGlvbiBtZW1iZXJzIGF0IG5laWdoYm9yCisJPGVtPm08L2VtPjwvbGk+CisJPGxpPkk8c3ViPm08L3N1Yj4gaXMgdGhlIG51bWJlciBvZiA8ZW0+SW5mZWN0aW91czwvZW0+IHBvcHVsYXRpb24KKwltZW1iZXJzIGF0IG5laWdoYm9yIDxlbT5tPC9lbT48L2xpPgorPC91bD4KKzwvcD4KKzxwPlNwZWNpZmljIHN0YXRpc3RpY3Mgb24gdGhlIHRvdGFsIG51bWJlciBvZiBiaXJ0aHMsIGRlYXRocyBhbmQKK2RlYXRocyBkdWUgdG8gdGhlIGRpc2Vhc2UgY2FuIGJlIGNvbXB1dGVkIGJ5IGFkZGluZyB0aGUgYXBwcm9wcmlhdGUKK3Rlcm1zIG9mIHRoZSBlcXVhdGlvbnMgYWJvdmUuCis8dWw+CisJPGxpPjxlbT5CPSAmbXU7IChTICsgSSk8L2VtPiwgaXMgdGhlIG51bWJlciBvZiA8ZW0+QmlydGhzPC9lbT48L2xpPgorCTxsaT48ZW0+RCA9ICZtdTsgUyArICgmbXU7ICsgJm11OzxzdWI+aTwvc3ViPiApPC9lbT4saXMgdGhlIHRvdGFsIG51bWJlciBvZiA8ZW0+RGVhdGhzPC9lbT48L2xpPgorCTxsaT48ZW0+REQ9ICZtdTs8c3ViPmk8L3N1Yj4gSTwvZW0+LCBpcyB0aGUgbnVtYmVyIG9mCisJPGVtPkRpc2Vhc2UgRGVhdGhzPC9lbT48L2xpPgorPC91bD4KKzwvcD4KKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9lcGlkZW1pb2xvZ2ljYWxtb2RlbGluZy9zaXJtYXRoLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvZXBpZGVtaW9sb2dpY2FsbW9kZWxpbmcvc2lybWF0aC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMTdmMzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvZXBpZGVtaW9sb2dpY2FsbW9kZWxpbmcvc2lybWF0aC5odG1sCkBAIC0wLDAgKzEsMTU4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5TSVIgRGlzZWFzZSBNb2RlbCBNYXRoZW1hdGljczwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5TSVIoUykgRGlzZWFzZSBNb2RlbCBNYXRoZW1hdGljczwvaDE+Cis8aW1nIHNyYz0iaW1hZ2VzL3NpcnMuZ2lmIiBhbGlnbj1DRU5URVIgSFNQQUNFPTEwIFZTUEFDRT0xMCBib3JkZXI9MCB3aWR0aD04MCU+CisKKzxwPlRoZSBiYXNpYyA8ZW0+U0lSPC9lbT4gKFN1c2NlcHRpYmxlLCBJbmZlY3Rpb3VzLCBSZW1vdmVkKQorYW5kICA8ZW0+U0lSUzwvZW0+IChTdXNjZXB0aWJsZSwgSW5mZWN0aW91cywgUmVjb3ZlcmVkLCBTdXNjZXB0aWJsZSkKK2Rpc2Vhc2UgbW9kZWxzIGFzc3VtZSBhIHVuaWZvcm0gcG9wdWxhdGlvbiBhdCBhIHNpbmdsZSBsb2NhdGlvbiBhbmQgdGhhdAordGhlIHBvcHVsYXRpb24gbWVtYmVycyBhcmUgd2VsbCAibWl4ZWQiLCBtZWFuaW5nIHRoYXQgdGhleSBhcmUgZXF1YWxseQorbGlrZWx5IHRvIG1lZXQgYW5kIGluZmVjdCBlYWNoIG90aGVyLiBUaGlzIG1vZGVsLCBmb3IgYSBub3JtYWxpemVkCitwb3B1bGF0aW9uLCBpcyBkZWZpbmVkIGJ5IHRoZSB0aHJlZSBlcXVhdGlvbnMgYmVsb3c6Cis8dWw+CisJPGxpPjxlbT4mRGVsdGE7cyA9ICZtdTsgJm1pbnVzOyAmYmV0YTtzIGkgKyAmc2lnbWE7ciAmbWludXM7CisJJm11O3M8L2VtPjwvbGk+CisJPGxpPjxlbT4mRGVsdGE7aSA9ICZiZXRhO3MgaSAmbWludXM7ICZnYW1tYTtpICZtaW51czsgJm11O2k8L2VtPjwvbGk+CisJPGxpPjxlbT4mRGVsdGE7ciA9ICZnYW1tYTtpICZtaW51czsgJnNpZ21hO3IgJm1pbnVzOyAmbXU7cjwvZW0+PC9saT4KKzwvdWw+CisKKzxwPldoZXJlOgorPHVsPgorCTxsaT48ZW0+czwvZW0+IGlzIHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBwb3B1bGF0aW9uIHRoYXQgaXMKKwkJPGVtPlN1c2NlcHRpYmxlPC9lbT48L2xpPgorCTxsaT48ZW0+aTwvZW0+IGlzIHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBwb3B1bGF0aW9uCisJCXRoYXQgaXMgPGVtPkluZmVjdGlvdXM8L2VtPjwvbGk+CisJPGxpPjxlbT5yPC9lbT4gaXMgdGhlIHByb3BvcnRpb24gb2YgdGhlIHBvcHVsYXRpb24KKwkJdGhhdCBpcyA8ZW0+UmVtb3ZlZDwvZW0+IGZyb20gdGhlIGluZmVjdGlvdXMgYW5kIHN1c2NlcHRpYmxlIHBvcHVsYXRpb25zLCAKKwkJYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgaW5mZWN0ZWQuPC9saT4KKwk8bGk+PGVtPiZtdTs8L2VtPiBib3RoIHRoZSByYXRlIG9mIGltbWlncmF0aW9uIChlLmcuLCBieSBiaXJ0aCkgYW5kIGVtaWdyYXRpb24KKwkJKGUuZy4sIGJ5IGRlYXRoKSBmcm9tIHRoZSBwb3B1bGF0aW9uLiBUaGVzZSByYXRlcyBhcmUgYXNzdW1lZCB0byBiZSBlcXVhbAorCQlvdmVyIHRoZSB0aW1lIHBlcmlvZCBvZiBpbnRlcmVzdCAodGhpcyBzaW1wbGlmaWVzIHRoZSBtYXRoZW1hdGljcykuPC9saT4KKwk8bGk+PGVtPiZiZXRhOzwvZW0+IGlzIHRoZSBkaXNlYXNlIHRyYW5zbWlzc2lvbiAoaW5mZWN0aW9uKSByYXRlLgorCSBUaGUgcmF0ZSBhdCB3aGljaCBpbmZlY3Rpb3VzIGluZGl2aWR1YWxzIGluZmVjdCBzdXNjZXB0aWJsZSBpbmRpdmlkdWFscy4gT25jZQorCSBpbmZlY3RlZCwgc3VzY2VwdGlibGUgaW5kaXZpZHVhbHMgaW5zdGFudGx5IGJlY29tZSBpbmZlY3Rpb3VzIHRoZW1zZWx2ZXMuPC9saT4KKwk8bGk+JmdhbW1hOyBpcyB0aGUgcmF0ZSBhdCB3aGljaCBpbmRpdmlkdWFscyBjbGVhciBpbmZlY3Rpb24uIEluIHRoaXMgbW9kZWwgdGhlc2UKKwkJaW5kaXZpZHVhbHMgY2Fubm90IGJlIHJlLWluZmVjdGVkIGZvciBzb21lIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGluZmVjdGlvbiAod2hldGhlciB0aHJvdWdoCisJCWltbXVuaXR5IG9yIHJlbW92YWwgZnJvbSB0aGUgcG9wdWxhdGlvbikuPC9saT4KKwk8bGk+PGVtPiZzaWdtYTs8L2VtPiBpcyB0aGUgaW1tdW5pdHkgbG9zcyByYXRlLiBUaGlzIGNvZWZmaWNpZW50CisJCWRldGVybWluZXMgdGhlIHJhdGUgYXQgd2hpY2ggPGVtPlJlbW92ZWQ8L2VtPiBwb3B1bGF0aW9uIG1lbWJlcnMgbG9zZQorCQl0aGVpciBpbW11bml0eSB0byB0aGUgZGlzZWFzZSBhbmQgYmVjb21lIDxlbT5TdXNjZXB0aWJsZTwvZW0+IGFnYWluLiBGb3IgYW4gU0lSCisJCW1vZGVsLCB0aGlzIHJhdGUgaXMgMC4KKwk8L2xpPgorPC91bD4KKzwvcD4KK0ZvbGxvd2luZyBiYXNpY2FsbHkgdGhlIHNhbWUgZGVyaXZhdGlvbiBhcyBvdXRsaW5lZCBmb3IgdGhlCis8YSBocmVmPSJzaW1hdGguaHRtbCI+U0k8L2E+Cittb2RlbCwgdGhlc2UgYmVjb21lOgorCis8cD5MZXQKKzx1bD4KKwk8bGk+PGVtPiZtdTs8c3ViPmk8L3N1Yj48L2VtPiBiZSB0aGUgPGVtPkluZmVjdGlvdXMgTW9ydGFsaXR5CisJUmF0ZTwvZW0+LiBUaGlzIGlzIHRoZSBpbmNyZWFzZWQgcmF0ZSBhdCB3aGljaCBpbmZlY3RlZCBwb3B1bGF0aW9uIG1lbWJlcnMgZGllCisJc3BlY2lmaWNhbGx5IGR1ZSB0byB0aGUgZGlzZWFzZS48L2xpPgorPC91bD4KKzwvcD4KKzxwPldlIG1vZGlmeSBvdXIgbW9kZWwgdG8gaW5jbHVkZSB0aGlzIGFkZGl0aW9uYWwgcmF0ZS4KKworPHVsPgorCTxsaT48ZW0+JkRlbHRhO3MgPSAmbXU7ICZtaW51czsgJmJldGE7cyBpICsgJnNpZ21hO3IgJm1pbnVzOworCSZtdTsgczwvZW0+PC9saT4KKwk8bGk+PGVtPiZEZWx0YTtpID0gJmJldGE7cyBpICZtaW51czsKKwkmZ2FtbWE7aSAmbWludXM7ICgmbXU7KyZtdTs8c3ViPmk8L3N1Yj4paTwvZW0+PC9saT4KKwk8bGk+PGVtPiZEZWx0YTtyID0gJmdhbW1hO2kgJm1pbnVzOyAmc2lnbWE7cgorCSZtaW51czsgJm11O3I8L2VtPjwvbGk+Cis8L3VsPgorPC9wPgorPGgzPlNwYXRpYWwgQWRhcHRhdGlvbjwvaDM+Cis8cD4KKzx1bD4KKwk8bGk+PGVtPiZEZWx0YTtzIFA8c3ViPmw8L3N1Yj49ICZtdTtQPHN1Yj5sPC9zdWI+ICZtaW51czsKKwkmYmV0YTs8c3ViPmw8L3N1Yj4gcyBpIFA8c3ViPmw8L3N1Yj4gKyAmc2lnbWE7IHIgUDxzdWI+bDwvc3ViPiAmbWludXM7CisJJm11OyBzIFA8c3ViPmw8L3N1Yj48L2VtPjwvbGk+CisJPGxpPjxlbT4mRGVsdGE7aSBQPHN1Yj5sPC9zdWI+ID0gJmJldGE7PHN1Yj5sPC9zdWI+CisJcyBpIFA8c3ViPmw8L3N1Yj4gJm1pbnVzOyAmZ2FtbWE7IGkgUDxzdWI+bDwvc3ViPiAmbWludXM7CisJKCZtdTsrJm11OzxzdWI+aTwvc3ViPilpIFA8c3ViPmw8L3N1Yj48L2VtPjwvbGk+CisJPGxpPjxlbT4mRGVsdGE7ciBQPHN1Yj5sPC9zdWI+PSAmZ2FtbWE7aVA8c3ViPmw8L3N1Yj4KKwkmbWludXM7ICZzaWdtYTtyIFA8c3ViPmw8L3N1Yj4mbWludXM7ICZtdTtyIFA8c3ViPmw8L3N1Yj48L2VtPjwvbGk+Cis8L3VsPgorCis8cD5MZXQgPGVtPlM8c3ViPmw8L3N1Yj4gPSBzIFA8c3ViPmw8L3N1Yj48L2VtPiBiZSB0aGUgbnVtYmVyIG9mIDxlbT5TdXNjZXB0aWJsZTwvZW0+Citwb3B1bGF0aW9uIG1lbWJlcnMgYXQgbG9jYXRpb24gPGVtPmw8L2VtPi4gU2ltaWxhcmx5LCBsZXQgPGVtPkk8c3ViPmw8L3N1Yj4KKz0gaSBQPHN1Yj5sPC9zdWI+PC9lbT4gYmUgdGhlIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgYXQgbG9jYXRpb24gPGVtPmw8L2VtPgordGhhdCBhcmUgPGVtPkluZmVjdGlvdXM8L2VtPiwgYW5kIGxldCA8ZW0+cgorUDxzdWI+bDwvc3ViPjwvZW0+IGJlIHRoZSA8ZW0+UmVjb3ZlcmVkPC9lbT4gcG9wdWxhdGlvbi4gRm9yIHJlYWRhYmlsaXR5LCB3ZQorZHJvcCB0aGUgPGVtPmw8L2VtPiBzdWJzY3JpcHQgYW5kIHN1YnN0aXR1dGUuIDwvcD4KK1N1YnN0aXR1dGluZworCis8L3A+Cis8dWw+CisJPGxpPjxlbT4mRGVsdGE7UyA9ICZtdTtQPHN1Yj5sPC9zdWI+ICZtaW51czsgJmJldGE7PHN1Yj5sPC9zdWI+CisJUyBpICsgJnNpZ21hO1IgJm1pbnVzOyAmbXU7IFM8L2VtPjwvbGk+CisJPGxpPjxlbT4mRGVsdGE7SSA9ICZiZXRhOzxzdWI+bDwvc3ViPiBTIGkKKwkmbWludXM7ICZnYW1tYTtJICZtaW51czsgKCZtdTsrJm11OzxzdWI+aTwvc3ViPilJIDwvZW0+PC9saT4KKwk8bGk+PGVtPiZEZWx0YTtSPSAmZ2FtbWE7SSAmbWludXM7ICZzaWdtYTtSCisJJm1pbnVzOyAmbXU7UjwvZW0+PC9saT4KKzwvdWw+CisKK0NvbnRpbnVpbmcgd2l0aAorPGVtPiBpID0gSS9QPHN1Yj5sPC9zdWI+PC9lbT4KKywgd2UgaGF2ZToKKzx1bD4KKwk8bGk+PGVtPiZEZWx0YTtTID0gJm11O1A8c3ViPmw8L3N1Yj4gJm1pbnVzOyAoJmJldGE7PHN1Yj5sPC9zdWI+L1A8c3ViPmw8L3N1Yj4pCisJUyBJICsgJnNpZ21hO1IgJm1pbnVzOyAmbXU7IFM8L2VtPjwvbGk+CisJPGxpPjxlbT4mRGVsdGE7SSA9ICgmYmV0YTs8c3ViPmw8L3N1Yj4vUDxzdWI+bDwvc3ViPikKKwlTIEkgJm1pbnVzOyAmZ2FtbWE7SSAmbWludXM7ICgmbXU7KyZtdTs8c3ViPmk8L3N1Yj4pSSA8L2VtPjwvbGk+CisJPGxpPjxlbT4mRGVsdGE7Uj0gJmdhbW1hO0kgJm1pbnVzOyAmc2lnbWE7UgorCSZtaW51czsgJm11O1I8L2VtPjwvbGk+Cis8L3VsPgorCitMZXR0aW5nCis8ZW0+JmJldGE7PHN1cD4qPC9zdXA+ID0gJmJldGE7PHN1Yj5sPC9zdWI+L1A8c3ViPmw8L3N1Yj4gPSAmYmV0YTsKKyhkPHN1Yj5sPC9zdWI+LyhBUERQPHN1Yj5sPC9zdWI+KSkgPC9lbT4KK2dpdmVzOgorCis8dWw+CisJPGxpPjxlbT4mRGVsdGE7UyA9ICZtdTtQPHN1Yj5sPC9zdWI+ICZtaW51czsgJmJldGE7PHN1cD4qPC9zdXA+CisJUyBJICsgJnNpZ21hO1IgJm1pbnVzOyAmbXU7IFM8L2VtPjwvbGk+CisJPGxpPjxlbT4mRGVsdGE7SSA9ICZiZXRhOzxzdXA+Kjwvc3VwPiBTIEkKKwkmbWludXM7ICZnYW1tYTtJICZtaW51czsgKCZtdTsrJm11OzxzdWI+aTwvc3ViPilJIDwvZW0+PC9saT4KKwk8bGk+PGVtPiZEZWx0YTtSPSAmZ2FtbWE7SSAmbWludXM7ICZzaWdtYTtSCisJJm1pbnVzOyAmbXU7UjwvZW0+PC9saT4KKzwvdWw+CitUU0YKKzx1bD4KKwk8bGk+PGVtPlRTRjxzdWI+bDwvc3ViPiA9ICgoUytJK1IpL0FyZWE8c3ViPmw8L3N1Yj4pIC8KKwkoUC9BcmVhKFMrSStSKSk8L2VtPjwvbGk+CisJPGxpPjxlbT5UU0Y8c3ViPmw8L3N1Yj4gPSAoMS9BcmVhPHN1Yj5sPC9zdWI+KSAvIChQL0FyZWEgKTwvZW0+PC9saT4KKwk8bGk+PGVtPlRTRjxzdWI+bDwvc3ViPiA9IEFyZWEgLyAoUCAqQXJlYTxzdWI+bDwvc3ViPiApPC9lbT48L2xpPgorCTxsaT48ZW0+VFNGPHN1Yj5sPC9zdWI+ID0gKDEgLyBQKSogKEFyZWEvQXJlYTxzdWI+bDwvc3ViPiApPC9lbT48L2xpPgorPC91bD4KKzxoMz5OZWlnaGJvcmluZyBJbmZlY3Rpb3VzIFBvcHVsYXRpb25zPC9oMz4KKzwvcD4KKzx1bD4KKwk8bGk+PGVtPiZEZWx0YTtTID0gJm11O1A8c3ViPmw8L3N1Yj4gJm1pbnVzOyAmYmV0YTs8c3VwPio8L3N1cD4KKwlTIChJICsgSTxzdWI+bmVpZ2hib3I8L3N1Yj4oKSApICsgJnNpZ21hO1IgJm1pbnVzOyAmbXU7IFM8L2VtPjwvbGk+CisJPGxpPjxlbT4mRGVsdGE7SSA9ICZiZXRhOzxzdXA+Kjwvc3VwPiBTIChJCisJKyBJPHN1Yj5uZWlnaGJvcjwvc3ViPigpICkgJm1pbnVzOyAmZ2FtbWE7SSAmbWludXM7ICgmbXU7KyZtdTs8c3ViPmk8L3N1Yj4pSQorCTwvZW0+PC9saT4KKwk8bGk+PGVtPiZEZWx0YTtSID0gJmdhbW1hO0kgJm1pbnVzOyAmc2lnbWE7UgorCSZtaW51czsgJm11O1I8L2VtPjwvbGk+Cis8L3VsPgorCitTcGVjaWZpYyBzdGF0aXN0aWNzIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgYmlydGhzLCBkZWF0aHMgYW5kIGRlYXRocyBkdWUKK3RvIHRoZSBkaXNlYXNlIGNhbiBiZSBjb21wdXRlZCBieSBhZGRpbmcgdGhlIGFwcHJvcHJpYXRlIHRlcm1zIG9mIHRoZQorZXF1YXRpb25zIGFib3ZlLgorPHVsPgorCTxsaT48ZW0+Qj0gJm11OyAoUyArIEkgKyBSKTwvZW0+LCBpcyB0aGUgbnVtYmVyIG9mIDxlbT5CaXJ0aHM8L2VtPgorCTwvbGk+CisJPGxpPjxlbT5EID0gJm11OyBTICsgKCZtdTsgKyAmbXU7PHN1Yj5pPC9zdWI+IClJICsgJm11O1I8L2VtPixpcyB0aGUgdG90YWwgbnVtYmVyIG9mIDxlbT5EZWF0aHM8L2VtPjwvbGk+CisJPGxpPjxlbT5ERD0gJm11OzxzdWI+aTwvc3ViPiBJPC9lbT4sIGlzIHRoZSBudW1iZXIgb2YKKwk8ZW0+RGlzZWFzZSBEZWF0aHM8L2VtPjwvbGk+Cis8L3VsPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC8uY3ZzaWdub3JlIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2dldHRpbmdzdGFydGVkL2ltZy9xdWlja3N0YXJ0Ly5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlNmVmNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC8uY3ZzaWdub3JlCkBAIC0wLDAgKzEgQEAKKyouZGIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC9GaWcxLnBuZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC9GaWcxLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjNjZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2dldHRpbmdzdGFydGVkL2ltZy9xdWlja3N0YXJ0L0ZpZzEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC9GaWcxX2Nyb3BwZWQucG5nIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2dldHRpbmdzdGFydGVkL2ltZy9xdWlja3N0YXJ0L0ZpZzFfY3JvcHBlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0NzQ3YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC9GaWcxX2Nyb3BwZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC9GaWcyLnBuZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC9GaWcyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmQ1NTVlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2dldHRpbmdzdGFydGVkL2ltZy9xdWlja3N0YXJ0L0ZpZzIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC9maWcxLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC9maWcxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTgwYWM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2dldHRpbmdzdGFydGVkL2ltZy9xdWlja3N0YXJ0L2ZpZzEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC9maWcyLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC9maWcyLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjkyOWRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2dldHRpbmdzdGFydGVkL2ltZy9xdWlja3N0YXJ0L2ZpZzIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC9maWczLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC9maWczLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTk0NDBjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2dldHRpbmdzdGFydGVkL2ltZy9xdWlja3N0YXJ0L2ZpZzMuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC9maWc0LmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC9maWc0LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGQyNGVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2dldHRpbmdzdGFydGVkL2ltZy9xdWlja3N0YXJ0L2ZpZzQuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC9maWc1LmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9pbWcvcXVpY2tzdGFydC9maWc1LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjRjMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2dldHRpbmdzdGFydGVkL2ltZy9xdWlja3N0YXJ0L2ZpZzUuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9nZXR0aW5nc3RhcnRlZC9xdWlja3N0YXJ0Lmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvcXVpY2tzdGFydC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNjljNzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvcXVpY2tzdGFydC5odG1sCkBAIC0wLDAgKzEsNTYgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+CisKKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5TVEVNIFF1aWNrIFN0YXJ0PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8aDE+U1RFTSBRdWljayBTdGFydDwvaDE+Cis8cD5XaGVuIHlvdSBmaXJzdCBzdGFydCBTVEVNIGl0IHdpbGwgZGlzcGxheSB0aGUgPGEgaHJlZj0iLi4vaW50ZXJmYWNlL3BlcnNwZWN0aXZlcy9zaW11bGF0aW9uLmh0bWwiPlNpbXVsYXRpb24KK3BlcnNwZWN0aXZlPC9hPiBjb250YWluaW5nIGEgPGEJaHJlZj0iLi4vaW50ZXJmYWNlL3ZpZXdzL3NjZW5hcmlvc3ZpZXcuaHRtbCI+U2NlbmFyaW9zIHZpZXc8L2E+LiBUaGlzCit2aWV3IGNvbnRhaW5zIGEgaGllcmFyY2hpY2FsIGRpc3BsYXkgb2YgdGhlIDxhCisJaHJlZj0iLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNzY2VuYXJpbyI+IFNjZW5hcmlvczwvYT4gdGhhdAorYXJlIGJ1aWx0IGluIHRvIFNURU0gYW5kIGFyZSByZWFkeSB0byBzdGFydCBhIFNpbXVsYXRpb24uIFNlZQorRmlndXJlcyZuYnNwOzEgYW5kIDIgYmVsb3cuCis8cD4KKzxhCisJaHJlZj0iLi4vaW50ZXJmYWNlL3BlcnNwZWN0aXZlcy9pbWcvc2ltdWxhdGlvbnBlcnNwZWN0aXZlLnBuZyI+PGltZworCXNyYz0iLi4vaW50ZXJmYWNlL3BlcnNwZWN0aXZlcy9pbWcvc2ltdWxhdGlvbnBlcnNwZWN0aXZlLnBuZyIgc3R5bGU9IndpZHRoOjgwMHB4Ij48L2E+Cis8cD5GaWd1cmUgMS4KKzxwPkV4cGFuZCB0aGUgdHJlZSBkaXNwbGF5ZWQgaW4gdGhlIDxhCisJaHJlZj0iLi4vaW50ZXJmYWNlL3ZpZXdzL3NjZW5hcmlvc3ZpZXcuaHRtbCI+U2NlbmFyaW9zIHZpZXc8L2E+IHRvCitkaXNwbGF5IHRoZSBhdmFpbGFibGUgPGEKKwlocmVmPSIuLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI3NjZW5hcmlvIj4gU2NlbmFyaW9zPC9hPi4KK1NlbGVjdCBvbmUgb2YgdGhlIGRpc3BsYXllZCA8YQorCWhyZWY9Ii4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjc2NlbmFyaW8iPiBTY2VuYXJpb3M8L2E+IGJ5CisiZG91YmxlLWNsaWNraW5nIiBvbiBpdHMgdGl0bGUsIEZpZ3VyZSZuYnNwOzIuIDwvcD4KKzxhIGhyZWY9ImltZy9xdWlja3N0YXJ0L0ZpZzFfY3JvcHBlZC5wbmciPjxpbWcKKwlzcmM9ImltZy9xdWlja3N0YXJ0L0ZpZzFfY3JvcHBlZC5wbmciPjwvYT4KKzxwPkZpZ3VyZSAyCis8cD5TVEVNIHdpbGwgaW1tZWRpYXRlbHkgYmVnaW4gcmVhZGluZyBpbgordGhlIGRhdGEgdGhhdCBkZWZpbmVzIHRoZSBTaW11bGF0aW9uLiBJdCdzIHByb2dyZXNzIGlzIGRpc3BsYXllZCBhdCB0aGUKK2JvdHRvbSBvZiB0aGUgd2luZG93LiBUaGUgYW1vdW50IG9mIHRpbWUgaXQgdGFrZXMgdG8gcmVhZCBpbiB0aGUgZGF0YQorZm9yIHRoZSBTaW11bGF0aW9uIHdpbGwgZGVwZW5kIHVwb24gdGhlIHNpemUgb2YgdGhlIG1vZGVsIGFuZCB0aGUKK2NoYXJhY3RlcmlzdGljcyBvZiB0aGUgaG9zdCBjb21wdXRlci4gT24gYSBmYXN0IGNvbXB1dGVyIHdpdGggbW9yZSB0aGFuCisyIGdpZ2FieXRlcyBvZiBSQU0gYW5kIGZhc3QgZGlza3MgdGhlIDxhCisJaHJlZj0iLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNzY2VuYXJpbyI+IFNjZW5hcmlvPC9hPgoraWxsdXN0cmF0ZWQgaW4gRmlndXJlJm5ic3A7MywgYmVsb3csIHdpbGwgbG9hZCBhbmQgYmVnYW4gZXhlY3V0aW9uIGluCitsZXNzIHRoYW4gNSBzZWNvbmRzLiBPbiBhIHNtYWxsZXIgc2xvd2VyIG1hY2hpbmUgKGUuZy4sIGEgc21hbGwgbGFwdG9wCit3aXRoIHNsb3cgZGlza3MpLCB0aGlzIGNvdWxkIHRha2UgMzAgc2Vjb25kcyBvciBsb25nZXIpLjwvcD4KKworPGEgaHJlZj0iaW1nL3F1aWNrc3RhcnQvRmlnMi5wbmciPjxpbWcKKwlzcmM9ImltZy9xdWlja3N0YXJ0L0ZpZzIucG5nIiBzdHlsZT0id2lkdGg6ODAwcHgiPjwvYT48L2NlbnRlcj4KKzwvcD4KKzxwPkZpZ3VyZSAzCis8cD5JbiBGaWd1cmUmbmJzcDszLCB3ZSBzZWUgdGhlIHN0YXRlIG9mIHRoZSBzaW11bGF0aW9uIGFmdGVyIGFib3V0IDU1IGl0ZXJhdGlvbnMuIEluIHRoaXMgY2FzZSwKK3RoZSBkaXNlYXNlIGlzIHNwcmVhZGluZyBhY3Jvc3MgY29tbW9uIGJvcmRlcnMgZnJvbSBzdGFydGluZyBpbiB0aGUgbm9ydGgKK2FuZCBtb3Zpbmcgc291dGguCis8cD4KK1RoZSAiU2ltdWxhdGlvbiBjb250cm9sIiBhcmVhIGluIHRoZSBsb3dlciBsZWZ0IGlzIHVzZWQgdG8gIlN0YXJ0IiwgIlBhdXNlIiwgIlJlc2V0IiwKKyJTdGVwIiBhbmQgIlN0b3AiIGFsbCB0aGUgYWN0aXZlIFNpbXVsYXRpb25zLiAKKzxwPgorPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2luZGV4Lmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWY3NjAzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPEhUTUw+Cis8SEVBRD4gCis8dGl0bGU+U1RFTSBVc2VyIEhlbHA8L3RpdGxlPgorPC9IRUFEPiAKKworICA8RlJBTUVTRVQgY29scz0iMjUlLDc1JSI+CisgICAgICA8RlJBTUUgc3JjPSJ0b2MuaHRtbCI+CisgICAgICA8RlJBTUUgbmFtZT0ibWFpbiI+CisgIDwvRlJBTUVTRVQ+CisKKzxCT0RZPgorPGgyPlRoaXMgcmVxdWlyZXMgYSB3ZWIgY2xpZW50IHdpdGggRlJBTUUgc3VwcG9ydDwvaDI+Cis8L0JPRFk+CisKKzwvSFRNTD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9lZGl0b3Jzb3ZlcnZpZXcuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9lZGl0b3Jzb3ZlcnZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGNiNWJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL2VkaXRvcnNvdmVydmlldy5odG1sCkBAIC0wLDAgKzEsMjUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+CisKKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5PdmVydmlldzwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGgxPkVkaXRvcnM8L2gxPgorPHA+VGhlIFNURU0gaW50ZXJmYWNlIGluY2x1ZGVzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCAiRWRpdG9ycyIuIEVhY2gKK2VkaXRvciBmYWNpbGl0YXRlcyB0aGUgbW9kaWZpY2F0aW9uIG9mIGEgY29tcG9uZW50IG9mIGEgU1RFTSA8YQorCWhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjc2NlbmFyaW8iPiBTY2VuYXJpbzwvYT4uCis8dWw+CisgICAgPGxpPjxhIGhyZWY9ImV4cGVyaW1lbnRlZGl0b3IuaHRtbCI+RXhwZXJpbWVudCBFZGl0b3I8L2E+PC9saT4KKwk8bGk+PGEgaHJlZj0iZ3JhcGhlZGl0b3IuaHRtbCI+R3JhcGggRWRpdG9yPC9hPjwvbGk+CisJPGxpPjxhIGhyZWY9Im1vZGVsZWRpdG9yLmh0bWwiPk1vZGVsIEVkaXRvcjwvYT48L2xpPgorCTxsaT48YSBocmVmPSJtb2RpZmllcmVkaXRvci5odG1sIj5Nb2RpZmllciBFZGl0b3I8L2E+PC9saT4KKwk8bGk+PGEgaHJlZj0icHJlZGljYXRlZWRpdG9yLmh0bWwiPlByZWRpY2F0ZSBFZGl0b3I8L2E+PC9saT4KKwk8bGk+PGEgaHJlZj0ic2NlbmFyaW9lZGl0b3IuaHRtbCI+IFNjZW5hcmlvIEVkaXRvcjwvYT48L2xpPgorCTxsaT48YSBocmVmPSJzZXF1ZW5jZXJlZGl0b3IuaHRtbCI+IFNlcXVlbmNlciBFZGl0b3I8L2E+PC9saT4KKwk8bGk+PGEgaHJlZj0idHJpZ2dlcmVkaXRvci5odG1sIj4gVHJpZ2dlciBFZGl0b3I8L2E+PC9saT4KKzwvdWw+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL2V4cGVyaW1lbnRlZGl0b3IuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9leHBlcmltZW50ZWRpdG9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkNWI4MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9leHBlcmltZW50ZWRpdG9yLmh0bWwKQEAgLTAsMCArMSwyMSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+RXhwZXJpbWVudCBFZGl0b3I8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+RXhwZXJpbWVudCBFZGl0b3I8L2gxPgorPHA+VGhlIDxlbT5FeHBlcmltZW50IEVkaXRvcjwvZW0+IGlzIHVzZWQgdG8gZWRpdCA8YSBocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI2V4cGVyaW1lbnQiPiBFeHBlcmltZW50czwvYT4uIEl0CitzdXBwb3J0cyBkcmFnIGFuZCBkcm9wLCBhbmQgdW5kby48L3A+Cis8cD5BIDxhIGhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjZXhwZXJpbWVudCI+CitFeHBlcmltZW50PC9hPiBjYW4gYmUgZHJhZ2dlZCBmcm9tIGEgcHJvamVjdCdzIGNvbGxlY3Rpb24gb3IgZnJvbSB0aGUgPGEKKwlocmVmPSIuLi92aWV3cy9leHBlcmltZW50c3ZpZXcuaHRtbCI+IEV4cGVyaW1lbnRzIFZpZXc8L2E+LiBTaW1pbGFybHksIGEgPGEKKwlocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI3NjZW5hcmlvIj4gU2NlbmFyaW88L2E+IGNhbiBiZQorZHJhZ2dlZCBmcm9tIGEgcHJvamVjdHMgY29sbGVjdGlvbiBvciBmcm9tIHRoZSA8YQorCWhyZWY9Ii4uL3ZpZXdzL3NjZW5hcmlvc3ZpZXcuaHRtbCI+IFNjZW5hcmlvcyBWaWV3PC9hPiwgYW5kIAorCWEgPGEgaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNtb2RpZmllciI+IE1vZGlmaWVyPC9hPiBjYW4gYmUKK2RyYWdnZWQgZnJvbSBhIHByb2plY3RzIGNvbGxlY3Rpb24uPC9wPgorPGltZyBzcmM9ImltZy9leHBlcmltZW50ZWRpdG9yMS5qcGciIC8+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL2dyYXBoZWRpdG9yLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL2VkaXRvcnMvZ3JhcGhlZGl0b3IuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTJmZjFiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL2dyYXBoZWRpdG9yLmh0bWwKQEAgLTAsMCArMSwxMyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+R3JhcGggRWRpdG9yPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPkdyYXBoIEVkaXRvcjwvaDE+Cis8cD5UaGUgPGVtPkdyYXBoIEVkaXRvcjwvZW0+IGlzIHVzZWQgdG8gbW9kaWZ5IDxhIGhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjZ3JhcGgiPiBHcmFwaHM8L2E+LiBJdAorc3VwcG9ydHMgZHJhZyBhbmQgZHJvcCwgYW5kIHVuZG8uPC9wPgorPGltZyBzcmM9ImltZy9ncmFwaGVkaXRvcjEuanBnIiAvPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9pbWcvZXhwZXJpbWVudGVkaXRvcjEuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL2ltZy9leHBlcmltZW50ZWRpdG9yMS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ5Mjk1NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9pbWcvZXhwZXJpbWVudGVkaXRvcjEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9pbWcvZ3JhcGhlZGl0b3IxLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9pbWcvZ3JhcGhlZGl0b3IxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWFmNjE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL2ltZy9ncmFwaGVkaXRvcjEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9pbWcvbW9kZWxlZGl0b3IxLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9pbWcvbW9kZWxlZGl0b3IxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDM0NDg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL2ltZy9tb2RlbGVkaXRvcjEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9pbWcvbW9kaWZpZXJlZGl0b3IxLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9pbWcvbW9kaWZpZXJlZGl0b3IxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjNiNjI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL2ltZy9tb2RpZmllcmVkaXRvcjEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9pbWcvcHJlZGljYXRlZWRpdG9yMS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL2VkaXRvcnMvaW1nL3ByZWRpY2F0ZWVkaXRvcjEuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNThkMWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL2VkaXRvcnMvaW1nL3ByZWRpY2F0ZWVkaXRvcjEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9pbWcvc2NlbmFyaW9lZGl0b3IxLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9pbWcvc2NlbmFyaW9lZGl0b3IxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjM5MTgzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL2ltZy9zY2VuYXJpb2VkaXRvcjEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9pbWcvc2VxdWVuY2VyZWRpdG9yMS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL2VkaXRvcnMvaW1nL3NlcXVlbmNlcmVkaXRvcjEuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYWFkMTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL2VkaXRvcnMvaW1nL3NlcXVlbmNlcmVkaXRvcjEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9pbWcvdHJpZ2dlcmVkaXRvcjEuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL2ltZy90cmlnZ2VyZWRpdG9yMS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3NDZlMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9pbWcvdHJpZ2dlcmVkaXRvcjEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9tb2RlbGVkaXRvci5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL21vZGVsZWRpdG9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4MGZjNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9tb2RlbGVkaXRvci5odG1sCkBAIC0wLDAgKzEsMTkgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPk1vZGVsIEVkaXRvcjwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5Nb2RlbCBFZGl0b3I8L2gxPgorPHA+VGhlIDxlbT5Nb2RlbCBFZGl0b3I8L2VtPiBpcyB1c2VkIHRvIGVkaXQgPGEgaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNtb2RlbCI+IE1vZGVsczwvYT4uIEl0CitzdXBwb3J0cyBkcmFnIGFuZCBkcm9wLCBhbmQgdW5kby48L3A+Cis8cD5BIDxhIGhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjbW9kZWwiPgorTW9kZWw8L2E+IGNhbiBiZSBkcmFnZ2VkIGZyb20gYSBwcm9qZWN0J3MgY29sbGVjdGlvbiBvciBmcm9tIHRoZSA8YQorCWhyZWY9Ii4uL3ZpZXdzL21vZGVsc3ZpZXcuaHRtbCI+IE1vZGVscyBWaWV3PC9hPi4gU2ltaWxhcmx5LCBhIDxhCisJaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNncmFwaCI+IEdyYXBoPC9hPiBjYW4gYmUKK2RyYWdnZWQgZnJvbSBhIHByb2plY3RzIGNvbGxlY3Rpb24gb3IgZnJvbSB0aGUgPGEKKwlocmVmPSIuLi92aWV3cy9ncmFwaHN2aWV3Lmh0bWwiPiBHcmFwaHMgVmlldzwvYT4uPC9wPgorPGltZyBzcmM9ImltZy9tb2RlbGVkaXRvcjEuanBnIiAvPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9tb2RpZmllcmVkaXRvci5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL21vZGlmaWVyZWRpdG9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczZDE5YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9tb2RpZmllcmVkaXRvci5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPk1vZGlmaWVyIEVkaXRvcjwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5Nb2RpZmllciBFZGl0b3I8L2gxPgorPHA+VGhlIDxlbT5Nb2RpZmllciBFZGl0b3I8L2VtPiBpcyB1c2VkIHRvIGVkaXQgPGEgaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNtb2RpZmllciI+IE1vZGlmaWVyczwvYT4uIAorPC9wPgorPHA+Cis8aW1nIHNyYz0iaW1nL21vZGlmaWVyZWRpdG9yMS5qcGciIC8+Cis8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL3ByZWRpY2F0ZWVkaXRvci5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL3ByZWRpY2F0ZWVkaXRvci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMTQ1N2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL2VkaXRvcnMvcHJlZGljYXRlZWRpdG9yLmh0bWwKQEAgLTAsMCArMSwxMyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+UHJlZGljYXRlIEVkaXRvcjwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5QcmVkaWNhdGUgRWRpdG9yPC9oMT4KKzxwPlRoZSA8ZW0+UHJlZGljYXRlIEVkaXRvcjwvZW0+IGlzIHVzZWQgdG8gZWRpdCA8YSBocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI3ByZWRpY2F0ZSI+IFByZWRpY2F0ZXM8L2E+LiAKKzwvcD4KKzxpbWcgc3JjPSJpbWcvcHJlZGljYXRlZWRpdG9yMS5qcGciIC8+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL3NjZW5hcmlvZWRpdG9yLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL2VkaXRvcnMvc2NlbmFyaW9lZGl0b3IuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGQ0MjMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL3NjZW5hcmlvZWRpdG9yLmh0bWwKQEAgLTAsMCArMSwzMSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+U2NlbmFyaW8gRWRpdG9yPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPlNjZW5hcmlvIEVkaXRvcjwvaDE+Cis8cD5UaGUgPGVtPlNjZW5hcmlvIEVkaXRvcjwvZW0+IGlzIHVzZWQgdG8gZWRpdCA8YQorCWhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjc2NlbmFyaW8iPiBTY2VuYXJpb3M8L2E+LgorSXQgc3VwcG9ydHMgZHJhZyBhbmQgZHJvcCwgYW5kIHVuZG8uPC9wPgorPHA+QSA8YSBocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI21vZGVsIj4KK01vZGVsPC9hPiBjYW4gYmUgYWRkZWQgdG8gYSA8YQorCWhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjc2NlbmFyaW8iPiBTY2VuYXJpbzwvYT4gYnkKK2RyYWdnaW5nIGl0IGZyb20gZWl0aGVyIGEgcHJvamVjdCdzIGNvbGxlY3Rpb24gb2YgPGEKKwlocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI21vZGVsIj4gTW9kZWxzPC9hPiwgb3IgZnJvbQordGhlIHNldCBpbiB0aGUgPGEgaHJlZj0iLi4vdmlld3MvbW9kZWxzdmlldy5odG1sIj4gTW9kZWxzIFZpZXc8L2E+LgorU2ltaWxhcmx5LCBhbnkgbnVtYmVyIG9mIDxhCisJaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNkZWNvcmF0b3IiPiBEZWNvcmF0b3JzPC9hPgorY2FuIGJlIGRyYWdnZWQgZnJvbSBhIHByb2plY3QncyBjb2xsZWN0aW9uIG9yIGZyb20gdGhlIHNldCBvZiBCdWlsdC1pbiA8YQorCWhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjZGVjb3JhdG9yIj4gRGVjb3JhdG9yczwvYT4KK2Zyb20gdGhlIDxhIGhyZWY9Ii4uL3ZpZXdzL2RlY29yYXRvcnN2aWV3Lmh0bWwiPkRlY29yYXRvcnMgVmlldzwvYT4gb3IKK2Zyb20gdGhlIDxhIGhyZWY9Ii4uL3ZpZXdzL2Rpc2Vhc2Vzdmlldy5odG1sIj5EaXNlYXNlcyBWaWV3PC9hPi4gQXMKK3dlbGwsIGEgPGEgaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNzZXF1ZW5jZXIiPgorU2VxdWVuY2VyPC9hPiBjYW4gYmUgYWRkZWQgdG8gYSA8YQorCWhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjc2NlbmFyaW8iPiBTY2VuYXJpbzwvYT4gYnkKK2RyYWdnaW5nIGl0IGZyb20gYSBwcm9qZWN0J3MgY29sbGVjdGlvbiBvciBmcm9tIHRoZSA8YQorCWhyZWY9Ii4uL3ZpZXdzL3NlcXVlbmNlcnN2aWV3Lmh0bWwiPlNlcXVlbmNlcnMgdmlldzwvYT4uPC9wPgorPGltZyBzcmM9ImltZy9zY2VuYXJpb2VkaXRvcjEuanBnIiAvPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9zZXF1ZW5jZXJlZGl0b3IuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9zZXF1ZW5jZXJlZGl0b3IuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzhkYTliCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL3NlcXVlbmNlcmVkaXRvci5odG1sCkBAIC0wLDAgKzEsMTQgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPlNlcXVlbmNlciBFZGl0b3I8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+U2VxdWVuY2VyIEVkaXRvcjwvaDE+Cis8cD5UaGUgPGVtPlNlcXVlbmNlciBFZGl0b3I8L2VtPiBpcyB1c2VkIHRvIGVkaXQgPGEgaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNzZXF1ZW5jZXIiPiBTZXF1ZW5jZXJzPC9hPi4gTW9kaWZpY2F0aW9ucyB0byB0aGUKK1NlcXVlbmNlciBhcmUgZG9uZSB0aHJvdWdoIHRoZSAgPGEKKyAgICBocmVmPSIuLi92aWV3cy9wcm9wZXJ0aWVzdmlldy5odG1sIj4gUHJvcGVydGllcyBWaWV3PC9hPjwvcD4KKzxpbWcgc3JjPSJpbWcvc2VxdWVuY2VyZWRpdG9yMS5qcGciIC8+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL3RyaWdnZXJlZGl0b3IuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy90cmlnZ2VyZWRpdG9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhiMjViZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy90cmlnZ2VyZWRpdG9yLmh0bWwKQEAgLTAsMCArMSwxNyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+RXhwZXJpbWVudCBFZGl0b3I8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+VHJpZ2dlciBFZGl0b3I8L2gxPgorPHA+VGhlIDxlbT5UcmlnZ2VyIEVkaXRvcjwvZW0+IGlzIHVzZWQgdG8gZWRpdCA8YSBocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI3RyaWdnZXIiPiBUcmlnZ2VyPC9hPi4gSXQKK3N1cHBvcnRzIGRyYWcgYW5kIGRyb3AsIGFuZCB1bmRvLjwvcD4KKzxwPkEgPGEgaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNwcmVkaWNhdGUiPgorUHJlZGljYXRlPC9hPiBjYW4gYmUgZHJhZ2dlZCBmcm9tIGEgcHJvamVjdCdzIGNvbGxlY3Rpb24uIFNpbWlsYXJseSwgCisJYSA8YSBocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI21vZGlmaWVyIj4gTW9kaWZpZXI8L2E+IGNhbiBiZQorZHJhZ2dlZCBmcm9tIGEgcHJvamVjdHMgY29sbGVjdGlvbi48L3A+Cis8aW1nIHNyYz0iaW1nL3RyaWdnZXJlZGl0b3IxLmpwZyIgLz4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL2ltZy9maWcxYS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL2ltZy9maWcxYS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwMDQzOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvaW1nL2ZpZzFhLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL2ltZy9maWcyYS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL2ltZy9maWcyYS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmMjFmMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvaW1nL2ZpZzJhLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL2ludGVyZmFjZW92ZXJ2aWV3Lmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL2ludGVyZmFjZW92ZXJ2aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjMWYxNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbApAQCAtMCwwICsxLDQyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorCis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+SW50ZXJmYWNlIE92ZXJ2aWV3PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8Y2VudGVyPgorPGgxPlNURU0gSW50ZXJmYWNlIE92ZXJ2aWV3PC9oMT4KKzwvY2VudGVyPgorPHA+VGhlIFNURU0gdXNlciBpbnRlcmZhY2UgaXMgb3JnYW5pemVkIGludG8gdGhyZWUgInBlcnNwZWN0aXZlcyIsCis8YSBocmVmPSJwZXJzcGVjdGl2ZXMvZGVzaWduZXIuaHRtbCI+RGVzaWduZXIgcGVyc3BlY3RpdmUgPC9hPiwKK2EgPGEgaHJlZj0icGVyc3BlY3RpdmVzL3NpbXVsYXRpb24uaHRtbCI+U2ltdWxhdGlvbiBwZXJzcGVjdGl2ZTwvYT4KK2FuZCBhbiA8YSBocmVmPSJwZXJzcGVjdGl2ZXMvYW5hbHlzaXMuaHRtbCI+QW5hbHlzaXMgcGVyc3BlY3RpdmU8L2E+LiBBCitwZXJzcGVjdGl2ZSBpcyBhIGNvbGxlY3Rpb24gb2YgImVkaXRvcnMiLCAidmlld3MiLCAibWVudSBiYXIiLCAidG9vbAorYmFyIiBhbmQgYSAicGVyc3BlY3RpdmUgYmFyIi4gQW4gZWRpdG9yIGlzIGEgc3ViLXdpbmRvdyB1c2VkIHRvCitpbnRlcmFjdGl2ZWx5IG1vZGlmeSBvbmUgb2YgU1RFTSdzIGNvbXBvbmVudHMgd2hpbGUgYSB2aWV3IGlzIGEKK3N1Yi13aW5kb3cgdXNlZCB0byBkaXNwbGF5IGluZm9ybWF0aW9uIHRvIGEgdXNlci4gVGhlIG1lbnUgYmFyIGNvbnRhaW5zCitoaWdoLWxldmVsIG1lbnVzIGZvciBvcHRpb25zIGFuZCBvcGVyYXRpb25zIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGJ5IGEKK3VzZXIsIHdoaWxlIHRoZSB0b29sIGJhciBjb250YWlucyBpY29ucyB0aGF0IGlmIHNlbGVjdGVkIChjbGlja2VkIG9uKQorY2F1c2UgU1RFTSB0byBwZXJmb3JtIGFjdGlvbnMuIFRoZSBwZXJzcGVjdGl2ZSBiYXIgaXMgdXNlZCB0byBzd2l0Y2gKK2JldHdlZW4gU1RFTSdzIHBlcnNwZWN0aXZlcy4gVGhlc2UgYXJlIGlsbHVzdHJhdGVkIGluIHRoZSBpbWFnZSBpbgorRmlndXJlIDEgYmVsb3cuCis8cD4KKzxjZW50ZXI+PGEgaHJlZj0iaW1nL2ZpZzFhLmpwZyIgd2lkdGg9IjEyMDAiIGhlaWdodD0iNTAwIj48aW1nIHNyYz0iaW1nL2ZpZzFhLmpwZyIgd2lkdGg9IjEwNTAiIGhlaWdodD0iODAwIj48L2E+PC9jZW50ZXI+Cis8cD5TaW1pbGFybHkgaW4gdGhlIGltYWdlIGluIEZpZ3VyZSAyIGJlbG93LCBpcyBTVEVNJ3MgPGEKKwlocmVmPSJwZXJzcGVjdGl2ZXMvc2ltdWxhdGlvbi5odG1sIj5TaW11bGF0aW9uIHBlcnNwZWN0aXZlPC9hPi4gTm90ZQordGhhdCBpdCBkb2VzIG5vdCBoYXZlIGFuIGVkaXRvciBhcmVhLgorPGNlbnRlcj48YSBocmVmPSJpbWcvZmlnMmEuanBnIiB3aWR0aD0iMTAwMCIgaGVpZ2h0PSI4MDAiPjxpbWcgc3JjPSJpbWcvZmlnMmEuanBnIiB3aWR0aD0iMTAwMCIgaGVpZ2h0PSI4MDAiPjwvYT48L2NlbnRlcj4KK0EgdXNlciBjYW4gc3dpdGNoIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIHR3byBwZXJzcGVjdGl2ZXMgYnkKK2NsaWNraW5nIG9uIHRoZW0gaW4gdGhlIHBlcnNwZWN0aXZlIGJhci4gVGhlIHZpZXdzIGFyZSBncm91cGVkIHRvZ2V0aGVyCitpbiBkaWZmZXJlbnQgYXJlYXMgb2YgdGhlIHBlcnNwZWN0aXZlLiBDbGlja2luZyBvbiB0aGUgdGl0bGUgb2YgYSB2aWV3CitkaXNwbGF5ZWQgb24gaXRzIHRhYiB3aWxsIGJyaW5nIHRoYXQgdmlldyB0byB0aGUgZm9yZWdyb3VuZC4gVmlld3MgY2FuCitiZSBjbG9zZWQgYnkgY2xpY2tpbmcgb24gdGhlICJYIiBuZXh0IHRvIHRoZWlyIG5hbWUsIG9yIG9wZW5lZCBmcm9tIHRoZQorIldpbmRvdyIgbWVudSBpbiB0aGUgbWVudSBiYXIuIEFueSB2aWV3IGNhbiBiZSBkaXNwbGF5ZWQgaW4gYW55CitwZXJzcGVjdGl2ZSwgdGhvdWdoIGVhY2ggcGVyc3BlY3RpdmUgaGFzIGEgZGVmYXVsdCBzZXQgaXQgZGlzcGxheXMgd2hlbgorZmlyc3QgY3JlYXRlZC4KKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL2FuYWx5c2lzLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3BlcnNwZWN0aXZlcy9hbmFseXNpcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YjljZjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3BlcnNwZWN0aXZlcy9hbmFseXNpcy5odG1sCkBAIC0wLDAgKzEsMzkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+CisKKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5EZXNpZ25lcjwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGgxPkFuYWx5c2lzIFBlcnNwZWN0aXZlPC9oMT4KKzxwPlRoZSA8ZW0+QW5hbHlzaXMgYW5kIFZhbGlkYXRpb24gCitQZXJzcGVjdGl2ZTwvZW0+IGFsbG93cyB1c2VycyB0byBwZXJmb3JtIGFuYWx5c2lzLCBmaXR0aW5nLCBtb2RlbCBjb21wYXJpc29uLCBhbmQgCit2YWxpZGF0aW9uIGFjcm9zcyBtdWx0aXBsZSBzaW11bGF0aW9ucyBhbmQgZGF0YSBzZXRzLiBUaGUgQW5hbHlzaXMgcGVyc3BlY3RpdmUgCit1c2VzIGRhdGEgZnJvbSBlaXRoZXIgY29tcGxldGUgc2ltdWxhdGlvbiBydW5zIG9yIGRhdGEgaW1wb3J0ZWQgaW50byBTVEVNLiBUaGUgbGF0dGVyIAorY291bGQgYmUgcmVhbCBiaW8tc3VydmVpbGxhbmNlIGRhdGEgaW4gdGhlIGFwcHJvcHJpYXRlIENTViBmb3JtYXQgb3IgZGF0YSBmcm9tIGEgCitjb21wbGV0ZWQgc2ltdWxhdGlvbi4gPC9zcGFuPgorPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBwZXJzcGVjdGl2ZSBpcyB0byBob2xkIHRoZSB3aW5kb3dzIChhbmQgYXNzb2NpYXRlZCB0b29scykgdGhhdCAKK3N1cHBvcnQgdmFyaW91cyBhbmFseXNpcyBvcGVyYXRpb25zIG9uIGV4aXN0aW5nIGRhdGEuIElmIHRoZSBwZXJzcGVjdGl2ZSBpcyBub3QgCit2aXNpYmxlIG9uY2UgeW91IHN0YXJ0IFNURU0sIGp1c3QgZ28gdG8gdGhlIG1lbnUgYmFyIGFuZCBjbGljazo8YnI+Cis8YnI+CismZ3Q7V2luZG93Jmd0O09wZW4gUGVyc3BlY3RpdmUmZ3Q7QW5hbHlzaXM8cD4KK0J5IGRlZmF1bHQsIHRoZSBBbmFseXNpcyBwZXJzcGVjdGl2ZSBjb250YWlucyB0aHJlZSB2aWV3cy4gPC9zcGFuPiZuYnNwO0hvd2V2ZXIgeW91IGNhbiBjbG9zZSBhbnkgb2YgdGhlc2Ugdmlld3MgYW5kIG9wZW4gb3RoZXJzLgorPGgzPkRlZmF1bHQgVmlld3M8L2gzPgorPHVsPgorCTxsaT48Yj5UYWJiZWQgVmlld3M8L2I+OiBUaGUgdGFiYmVkIHZpZXcgaG9sZHMgdGhlIGZvbGxvd2luZyB2aWV3cy48L2xpPgorCTx1bD4KKwkJPGxpPjxhIGhyZWY9Ii4uL3ZpZXdzL0VzdGltYXRvcnZpZXcuaHRtbCI+RXN0aW1hdG9yIFZpZXc8L2E+OiBVc2VkIHRvIAorCQllc3RpbWF0ZSBtb2RlbCBwYXJhbWV0ZXJzIGZyb20gYW4gZXhpc3RpbmcgZGF0YSBzZXQgKHNpbXVsYXRlZCBvciByZWFsKS48bGk+CisJCTxhIGhyZWY9Ii4uL3ZpZXdzL1NjZW5hcmlvQ29tcGFyaXNvbnZpZXcuaHRtbCI+U2NlbmFyaW8gQ29tcGFyaXNvbiBWaWV3PC9hPjogCisJCU1lYXN1cmVzIHRoZSBSTVMgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBleGlzdGluZyBkYXRhIHNldHMgKHNpbXVsYXRlZCBvciAKKwkJcmVhbCkuPGxpPjxhIGhyZWY9Ii4uL3ZpZXdzL0x5YXB1bm92dmlldy5odG1sIj5MeWFwdW5vdiBWaWV3PC9hPjogCisJCUNvbXBhcmVzIHR3byBleGlzdGluZyBzY2VuYXJpb3MgYmFzZWQgb24gdGhlaXIgdHJhamVjdG9yaWVzIGluIGEgCisJCUx5YXB1bm92IFBoYXNlIFNwYWNlLjxsaT48YSBocmVmPSIuLi92aWV3cy9FcGlkZW1pY3ZpZXcuaHRtbCI+CisJCUVwaWRlbWljIFZpZXc8L2E+OiBBZ2dyZWdhdGVzIGRhdGEgYWNyb3NzIGxvY2F0aW9ucyBmb3IgYSBnaXZlbiBlcGlkZW1pYyAKKwkJc2NlbmFyaW8gYW5kIHBsb3RzIHRoZSBhZ2dyZWdhdGVkIGRhdGEgYW5kIGRpc2Vhc2UgaW5jaWRlbmNlLjwvdWw+Cis8L3VsPgorPGltZyBib3JkZXI9IjAiIHNyYz0iaW1nL2FuYWx5c2lzcGVyc3BlY3RpdmUuanBnIiB3aWR0aD0iMTAwMCIgaGVpZ2h0PSI4MDAiPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wZXJzcGVjdGl2ZXMvZGVzaWduZXIuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL2Rlc2lnbmVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkYzdkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL2Rlc2lnbmVyLmh0bWwKQEAgLTAsMCArMSw0OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPkRlc2lnbmVyPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8aDE+RGVzaWduZXIgUGVyc3BlY3RpdmU8L2gxPgorPHA+VGhlIDxlbT5EZXNpZ25lciBQZXJzcGVjdGl2ZTwvZW0+IGlzIGxvYWRlZCB0aGUgZmlyc3QgdGltZSB0aGF0IHlvdSBsb2FkCitTVEVNIHdpdGggYSBzZXQgb2YgZGVmYXVsdCBWaWV3cy4gU3Vic2VxdWVudCB1c2VzIG9mIFNURU0gd2lsbCBsb2FkIHRoZQorcGVyc3BlY3RpdmVzIGFuZCB2aWV3cyB0aGF0IHlvdSBsYXN0IHVzZWQuIDxicj4KKzxpbWcgc3JjPSJpbWcvZGVzaWduZXJwZXJzcGVjdGl2ZS5wbmciIHdpZHRoPSIxMDAwIiBoZWlnaHQ9IjgwMCI+Cis8cD5UaGUgcHVycG9zZSBvZiB0aGlzIHBlcnNwZWN0aXZlIGlzIHRvIGhvbGQgdGhlIHdpbmRvd3MgdGhhdCBhcmUKK3VzZWQgaW4gYnVpbGRpbmcgYSA8YQorCWhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjc2NlbmFyaW8iPiBTY2VuYXJpbzwvYT4KK3RoYXQgeW91IHdpbGwgdGhlbiBydW4uIFlvdSBjYW4gYWxzbyB1c2UgaXQgdG8gc3RhcnQgYW4gZXhpc3RpbmcKK3NpbXVsYXRpb24uCis8cD5UbyBzdGFydCBhbiBleGlzdGluZyBzaW11bGF0aW9uLCBzZWxlY3QgdGhlIDxhCisJaHJlZj0iLi4vdmlld3Mvc2NlbmFyaW92aWV3Lmh0bWwiPlNjZW5hcmlvIFZpZXc8L2E+LiBJdCB3aWxsIHNob3cgYW4KK2V4aXN0aW5nIHByb2plY3RzIGFuZCBpZiB5b3Ugc2VsZWN0IGEgcHJvamVjdCwgaXQgd2lsbCBkaXNwbGF5IHRoZSA8YQorCWhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjc2NlbmFyaW8iPiBTY2VuYXJpbzwvYT4gZm9yCit0aGF0IHByb2plY3QuIERvdWJsZSBjbGljayB0aGUgPGEKKwlocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI3NjZW5hcmlvIj4gU2NlbmFyaW88L2E+IHRvCitzZWxlY3QgaXQgYW5kIHN0YXJ0IHRoZSBzaW11bGF0aW9uIHJ1bm5pbmcuIFNURU0gd2lsbCBhdXRvbWF0aWNhbGx5Citzd2l0Y2ggdG8gdGhlIDxhIGhyZWY9InNpbXVsYXRpb24uaHRtbCI+U2ltdWxhdGlvbiBQZXJzcGVjdGl2ZTwvYT4uCis8cD5UaGUgZm9sbG93aW5nIHZpZXdzIGFyZSBkaXNwbGF5ZWQgZm9yIHRoZSBEZXNpZ25lciBQZXJzcGVjdGl2ZSBieQorZGVmYXVsdC4gSG93ZXZlciB5b3UgY2FuIGNsb3NlIGFueSBvZiB0aGVzZSB2aWV3cyBhbmQgb3BlbiBvdGhlcnMuCis8aDM+RGVmYXVsdCBWaWV3czwvaDM+Cis8dWw+PGxpPjxhIGhyZWY9Ii4uL3ZpZXdzL3Byb2plY3R2aWV3Lmh0bWwiPlNURU0gUHJvamVjdCBFeHBsb3JlcjwvYT48L2xpPgorCVRoaXMgdmlldyBpcyB1c2VkIHRvIGJ1aWxkIG5ldyBTVEVNIHByb2plY3RzLgorCTxsaT48Yj5UYWJiZWQgVmlld3M8L2I+OiBUaGUgdGFiYmVkIHZpZXcgaG9sZHMgdGhlIGZvbGxvd2luZyB2aWV3cy48L2xpPgorCTx1bD4KKwkJPGxpPjxhIGhyZWY9Ii4uL3ZpZXdzL3NjZW5hcmlvdmlldy5odG1sIj5TY2VuYXJpbyBWaWV3PC9hPjwvbGk+OgorCQlXaGVuIHNlbGVjdGVkIHRoaXMgdmlldyB3aWxsIGRpc3BsYXkgYSBsaXN0IG9mIGV4aXN0aW5nIHByb2plY3RzIHdpdGgKKwkJdGhlaXIKKwkJPGEgaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNzY2VuYXJpbyI+CisJCVNjZW5hcmlvczwvYT4uCisJCTxsaT48YSBocmVmPSIuLi92aWV3cy9tb2RlbHN2aWV3Lmh0bWwiPk1vZGVscyBWaWV3PC9hPjwvbGk+CisJCTxsaT48YSBocmVmPSIuLi92aWV3cy9ncmFwaHN2aWV3Lmh0bWwiPkdyYXBocyBWaWV3PC9hPjwvbGk+CisJCTxsaT48YSBocmVmPSIuLi92aWV3cy9zZXF1ZW5jZXJ2aWV3Lmh0bWwiPlNlcXVlbmNlciBWaWV3PC9hPjwvbGk+CisJCTxsaT48YSBocmVmPSIuLi92aWV3cy9kZWNvcmF0b3Jzdmlldy5odG1sIj5EZWNvcmF0b3JzIFZpZXc8L2E+PC9saT4KKwkJPGxpPjxhIGhyZWY9Ii4uL3ZpZXdzL3Byb3BlcnRpZXN2aWV3Lmh0bWwiPlByb3BlcnRpZXMgVmlldzwvYT48L2xpPgorCQk8bGk+PGEgaHJlZj0iLi4vdmlld3MvdGFza3N2aWV3Lmh0bWwiPlRhc2tzIFZpZXc8L2E+PC9saT4KKwkJPGxpPjxhIGhyZWY9Ii4uL3ZpZXdzL2Vycm9yX2xvZy5odG1sIj5FcnJvciBMb2cgVmlldzwvYT48L2xpPgorCTwvdWw+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3BlcnNwZWN0aXZlcy9pbWcvLmN2c2lnbm9yZSBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL2ltZy8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NWU4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3BlcnNwZWN0aXZlcy9pbWcvLmN2c2lnbm9yZQpAQCAtMCwwICsxIEBACitUaHVtYnMuZGIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL2ltZy9hbmFseXNpc3BlcnNwZWN0aXZlLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL2ltZy9hbmFseXNpc3BlcnNwZWN0aXZlLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzJkNzA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wZXJzcGVjdGl2ZXMvaW1nL2FuYWx5c2lzcGVyc3BlY3RpdmUuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL2ltZy9kZXNpZ25lcnBlcnNwZWN0aXZlLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL2ltZy9kZXNpZ25lcnBlcnNwZWN0aXZlLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODNlYTAyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wZXJzcGVjdGl2ZXMvaW1nL2Rlc2lnbmVycGVyc3BlY3RpdmUuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL2ltZy9kZXNpZ25lcnBlcnNwZWN0aXZlLnBuZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL2ltZy9kZXNpZ25lcnBlcnNwZWN0aXZlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2IxOTk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wZXJzcGVjdGl2ZXMvaW1nL2Rlc2lnbmVycGVyc3BlY3RpdmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL2ltZy9zaW11bGF0aW9ucGVyc3BlY3RpdmUucG5nIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wZXJzcGVjdGl2ZXMvaW1nL3NpbXVsYXRpb25wZXJzcGVjdGl2ZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkYjkxZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL2ltZy9zaW11bGF0aW9ucGVyc3BlY3RpdmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL3BlcnNwZWN0aXZlc292ZXJ2aWV3Lmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3BlcnNwZWN0aXZlcy9wZXJzcGVjdGl2ZXNvdmVydmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxODFkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3BlcnNwZWN0aXZlcy9wZXJzcGVjdGl2ZXNvdmVydmlldy5odG1sCkBAIC0wLDAgKzEsMzIgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+CisKKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5PdmVydmlldzwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGgxPlBlcnNwZWN0aXZlczwvaDE+Cis8cD4KK1NURU0gaXMgYW4gRWNsaXBzZSBSaWNoIENsaWVudCBhcHBsaWNhdGlvbi4gQXMgc3VjaCBpdCBpcyBvcmdhbml6ZWQgaW50bworJnF1b3Q7cGVyc3BlY3RpdmVzJnF1b3Q7IGVhY2ggb2Ygd2hpY2ggY29udGFpbnMgb25lIG9yIG1vcmUKKzxhIGhyZWY9Ii4uL3ZpZXdzL3ZpZXdzb3ZlcnZpZXcuaHRtbCI+dmlld3M8L2E+LiA8YnI+CitUaGUgY29udGVudHMgb2YgYSBwZXJzcGVjdGl2ZSBjYW4gYmUgY3VzdG9taXplZCBieSB0aGUgdXNlciBidXQgdGhlIGRlZmF1bHQKK3BlcnNwZWN0aXZlcyBhcmUgZGVzaWduZWQgdG8gc3VwcG9ydCBkaWZmZXJlbnQgdXNlcyBvZiB0aGUgU1RFTSBhcHBsaWNhdGlvbi48cD4KK1RoZSBTVEVNIHN5c3RlbSBjb250YWlucyB0aHJlZSAicGVyc3BlY3RpdmVzIjoKKzx1bD4KKwk8bGk+VGhlIDxhIGhyZWY9ImFuYWx5c2lzLmh0bWwiPkFuYWx5c2lzPC9hPiBwZXJzcGVjdGl2ZSBpcyB1c2UgdG8gYW5hbHl6ZQorCWVwaWRlbWljIGRhdGEmbmJzcDsgZ2F0aGVyZWQgZnJvbSBjb21wbGV0ZWQgc2ltdWxhdGlvbnMgb3IgZnJvbSBpbXBvcnQKKwlwdWJsaWMgaGVhbHRoIHJlcG9ydHMuIEl0IGFsc28gc3VwcG9ydHMgY29tcGFyaXNvbiBhbmQgdmFsaWRhdGlvbiBvZgorCW11bHRpcGxlIGRhdGEgc2V0cy48L2xpPgorCQorCTxsaT5UaGUgPGEgaHJlZj0iZGVzaWduZXIuaHRtbCI+IERlc2lnbmVyPC9hPiBwZXJzcGVjdGl2ZSBpcyB1c2VkCisJdG8gZGVzaWduIGFuZCBjcmVhdGUgbmV3IFNURU0gU2ltdWxhdGlvbnMuPC9saT4KKwkKKwk8bGk+VGhlIDxhIGhyZWY9InNpbXVsYXRpb24uaHRtbCI+IFNpbXVsYXRpb248L2E+IHBlcnNwZWN0aXZlIGlzCisJdXNlZCB0byBzdGFydCwmbmJzcDsgdmlldywgYW5kIGNvbnRyb2wgcnVubmluZyBTVEVNIFNpbXVsYXRpb25zLjwvbGk+CisKKzwvdWw+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3BlcnNwZWN0aXZlcy9zaW11bGF0aW9uLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3BlcnNwZWN0aXZlcy9zaW11bGF0aW9uLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyZjhjMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL3NpbXVsYXRpb24uaHRtbApAQCAtMCwwICsxLDUxIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorCis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+U2ltdWxhdGlvbiBQZXJzcGVjdGl2ZTwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGgxPlNpbXVsYXRpb24gUGVyc3BlY3RpdmU8L2gxPgorPHA+VGhlIDxlbT5TaW11bGF0aW9uIFBlcnNwZWN0aXZlPC9lbT4gaXMgbG9hZGVkIHdoZW4gYSBzaW11bGF0aW9uIGlzCithY3RpdmF0ZWQgZnJvbSB0aGUgPGEgaHJlZj0iZGVzaWduZXIuaHRtbCI+RGVzaWduZXIgcGVyc3BlY3RpdmU8L2E+IG9yCitpZiB0aGUgdXNlciBzZWxlY3RzIGl0LiBJdCBpcyBzdGFydGVkIHdpdGggYSBzZXQgb2YgZGVmYXVsdCBWaWV3cy4KK1N1YnNlcXVlbnQgdXNlcyBvZiBTVEVNIHdpbGwgbG9hZCB0aGUgcGVyc3BlY3RpdmVzIGFuZCB2aWV3cyB0aGF0IHlvdQorbGFzdCB1c2VkLiA8YnI+Cis8aW1nIHNyYz0iaW1nL3NpbXVsYXRpb25wZXJzcGVjdGl2ZS5wbmciIHdpZHRoPSIxMDAwIiBoZWlnaHQ9IjgwMCI+Cis8cD5UaGUgcHVycG9zZSBvZiB0aGlzIHBlcnNwZWN0aXZlIGlzIHRvIGhvbGQgdGhlIHdpbmRvd3MgdGhhdCBhcmUKK3VzZWQgdG8gZGlzcGxheSB0aGUgcHJvZ3Jlc3Mgb2YgYSBzaW11bGF0aW9uIGFzIGl0IHJ1bnMuIFRoZSBmb2xsb3dpbmcKK1ZpZXdzIGFyZSBkaXNwbGF5ZWQgYnkgZGVmYXVsdC4gSG93ZXZlciB5b3UgY2FuIGNsb3NlIGFueSBvZiB0aGVzZSB2aWV3cworYW5kIG9wZW4gb3RoZXJzLgorPGgzPkRlZmF1bHQgVmlld3M8L2gzPgorPHVsPgorCTxsaT48YSBocmVmPSIuLi92aWV3cy9tYXB2aWV3Lmh0bWwiPk1hcCBWaWV3PC9hPjwvbGk+CisJVGhpcyB2aWV3IGlzIHVzZWQgdG8gZ3JhcGhpY2FsbHkgZGlzcGxheSB0aGUgc3RhdGUgb2YgdGhlIHNpbXVsYXRpb24uCisJPGxpPjxiPlRhYmJlZCBWaWV3czwvYj46IFRoZSB0YWJiZWQgdmlldyBob2xkcyB0aGUgZm9sbG93aW5nIHZpZXdzLjwvbGk+CisJPHVsPgorCQk8bGk+PGEgaHJlZj0iLi4vdmlld3Mvc2NlbmFyaW92aWV3Lmh0bWwiPlNjZW5hcmlvIFZpZXc8L2E+OiBXaGVuCisJCXNlbGVjdGVkIHRoaXMgdmlldyB3aWxsIGRpc3BsYXkgYSBsaXN0IG9mIGV4aXN0aW5nIHByb2plY3RzLiBTZWxlY3RpbmcKKwkJdGhlIHByb2plY3Qgd2lsbCBkaXNwbGF5IHRoZSA8YQorCQkJaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNzY2VuYXJpbyI+IFNjZW5hcmlvPC9hPgorCQl3aGljaCBjYW4gYmUgc2VsZWN0ZWQgdG8gcnVuIHRoZSBzaW11bGF0aW9uLjwvbGk+CisJCTxsaT48YSBocmVmPSIuLi92aWV3cy9jb250cm9sdmlldy5odG1sIj5TaW11bGF0aW9uIENvbnRyb2wKKwkJVmlldzwvYT48L2xpPgorCQk8bGk+PGEgaHJlZj0iLi4vdmlld3MvbW9kZWxzdmlldy5odG1sIj5Nb2RlbHMgVmlldzwvYT48L2xpPgorCQk8bGk+PGEgaHJlZj0iLi4vdmlld3MvZ3JhcGhzdmlldy5odG1sIj5HcmFwaHMgVmlldzwvYT48L2xpPgorCQk8bGk+PGEgaHJlZj0iLi4vdmlld3Mvc2VxdWVuY2Vydmlldy5odG1sIj5TZXF1ZW5jZXIgVmlldzwvYT48L2xpPgorCQk8bGk+PGEgaHJlZj0iLi4vdmlld3MvZGVjb3JhdG9yc3ZpZXcuaHRtbCI+RGVjb3JhdG9ycyBWaWV3PC9hPjwvbGk+CisJCTxsaT48YSBocmVmPSIuLi92aWV3cy9wcm9wZXJ0aWVzdmlldy5odG1sIj5Qcm9wZXJ0aWVzIFZpZXc8L2E+PC9saT4KKwkJPGxpPjxhIGhyZWY9Ii4uL3ZpZXdzL3Rhc2tzdmlldy5odG1sIj5UYXNrcyBWaWV3PC9hPjwvbGk+CisJCTxsaT48YSBocmVmPSIuLi92aWV3cy9lcnJvcl9sb2cuaHRtbCI+RXJyb3IgTG9nIFZpZXc8L2E+PC9saT4KKwk8L3VsPgorCTxoMz5PcHRpb25hbCBWaWV3czwvaDM+CisJPHA+VGhlIGZvbGxvd2luZyB2aWV3cyBjYW4gYmUgc2VsZWN0ZWQgZnJvbSB0aGUgPGI+V2luZG93LT5PdGhlcjwvYj4KKwltZW51LgorCTx1bD4KKwkJPGxpPjxhIGhyZWY9Ii4uL3ZpZXdzL2dlLmh0bWwiPkdvb2dsZSBFYXJ0aCBJbnRlcmZhY2U8L2E+PC9saT4KKwkJVGhpcyB2aWV3IGlzIHVzZWQgdG8gcHJvamVjdCB0aGUgc3ByZWFkIG9mIGRpc2Vhc2Ugb24gdGhlIDNECisJCUdvb2dsZUVhcnRoIGltYWdlLgorCTwvdWw+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9sb2dnaW5ncHJlZmVyZW5jZXMucG5nIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9pbWcvbG9nZ2luZ3ByZWZlcmVuY2VzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTA4MmUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9pbWcvbG9nZ2luZ3ByZWZlcmVuY2VzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wb3B1bGF0aW9ubW9kZWxpbmcuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9pbWcvcG9wdWxhdGlvbm1vZGVsaW5nLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZmRhYTM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9pbWcvcG9wdWxhdGlvbm1vZGVsaW5nLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wcmVmZXJlbmNlc2dlYWR2YW5jZWQuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9pbWcvcHJlZmVyZW5jZXNnZWFkdmFuY2VkLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTJhNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9pbWcvcHJlZmVyZW5jZXNnZWFkdmFuY2VkLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wcmVmZXJlbmNlc2dldG9wbGV2ZWwuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9pbWcvcHJlZmVyZW5jZXNnZXRvcGxldmVsLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGFlNzAyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9pbWcvcHJlZmVyZW5jZXNnZXRvcGxldmVsLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wcmVmZXJlbmNlc21hcGRhdGFtZ250LmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvaW1nL3ByZWZlcmVuY2VzbWFwZGF0YW1nbnQuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNjI2NDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wcmVmZXJlbmNlc21hcGRhdGFtZ250LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wcmVmZXJlbmNlc21hcHZpZXcuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9pbWcvcHJlZmVyZW5jZXNtYXB2aWV3LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTRiNzg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9pbWcvcHJlZmVyZW5jZXNtYXB2aWV3LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wcmVmZXJlbmNlc29wZW5tZW51LmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvaW1nL3ByZWZlcmVuY2Vzb3Blbm1lbnUuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1M2QxNmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wcmVmZXJlbmNlc29wZW5tZW51LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wcmVmZXJlbmNlc29wZW5tZW51LnBuZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvaW1nL3ByZWZlcmVuY2Vzb3Blbm1lbnUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmY2NkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wcmVmZXJlbmNlc29wZW5tZW51LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wcmVmZXJlbmNlc3NpbW1hbmFnZW1lbnQuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9pbWcvcHJlZmVyZW5jZXNzaW1tYW5hZ2VtZW50LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDU2ZTlhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9pbWcvcHJlZmVyZW5jZXNzaW1tYW5hZ2VtZW50LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wcmVmZXJlbmNlc3NpbW1hbmFnZW1lbnQucG5nIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9pbWcvcHJlZmVyZW5jZXNzaW1tYW5hZ2VtZW50LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTA4YzAyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9pbWcvcHJlZmVyZW5jZXNzaW1tYW5hZ2VtZW50LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wcmVmZXJlbmNlc3RvcGxldmVsLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvaW1nL3ByZWZlcmVuY2VzdG9wbGV2ZWwuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYjY4OWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wcmVmZXJlbmNlc3RvcGxldmVsLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wcmVmZXJlbmNlc3RvcGxldmVsLnBuZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvaW1nL3ByZWZlcmVuY2VzdG9wbGV2ZWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OGExYTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wcmVmZXJlbmNlc3RvcGxldmVsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wcmVmZXJlbmNlc3Zpc3VhbGl6YXRpb250b3BsZXZlbC5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9wcmVmZXJlbmNlc3Zpc3VhbGl6YXRpb250b3BsZXZlbC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzNTgzMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvaW1nL3ByZWZlcmVuY2VzdmlzdWFsaXphdGlvbnRvcGxldmVsLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9zb2x2ZXJwcmVmZXJlbmNlcy5wbmcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL2ltZy9zb2x2ZXJwcmVmZXJlbmNlcy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkZTdlMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvaW1nL3NvbHZlcnByZWZlcmVuY2VzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL3BvcHVsYXRpb25tb2RlbGluZy5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9wb3B1bGF0aW9ubW9kZWxpbmcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzVhOWI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9wb3B1bGF0aW9ubW9kZWxpbmcuaHRtbApAQCAtMCwwICsxLDEzIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4NCis8aHRtbD4NCis8aGVhZD4NCis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4NCis8dGl0bGU+UG9wdWxhdGlvbiBNb2RlbGluZzwvdGl0bGU+DQorPC9oZWFkPg0KKzxib2R5Pg0KKzxoMT5Qb3B1bGF0aW9uIE1vZGVsaW5nPC9oMT4NCis8cD5Qb3B1bGF0aW9uIE1vZGVsaW5nPC9wPg0KKzxpbWcgc3JjPSJpbWcvcG9wdWxhdGlvbm1vZGVsaW5nLmpwZyIgLz4NCisNCis8L2JvZHk+DQorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvcHJlZmVyZW5jZXNnZWFkdmFuY2VkLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL3ByZWZlcmVuY2VzZ2VhZHZhbmNlZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmN2VlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL3ByZWZlcmVuY2VzZ2VhZHZhbmNlZC5odG1sCkBAIC0wLDAgKzEsMzEgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkdvb2dsZSBFYXJ0aCBBZHZhbmNlZDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5Hb29nbGUgRWFydGggQWR2YW5jZWQ8L2gxPgorPHVsPgorCTxsaT48ZW0+IkFsbG93IGRlYnVnIG91dHB1dCBvbiBDb25zb2xlIjwvZW0+IAorCSAgICA8YnI+VGhpcyBpcyB1c2VkIGZvciBwcm9ibGVtIGRldGVybWluYXRpb24uCisuICAgICAgIChEZWZhdWx0OiZuYnNwO0ZhbHNlKTwvbGk+CisJPGxpPjxlbT4iVXNlIEdvb2dsZUVhcnRoIEJvdW5kaW5nIEJveCB0byBmaWx0ZXIgb3V0cHV0IjwvZW0+CisJICAgIDxicj5UaGlzIHdpbGwgaW1wcm92ZSBwZXJmb3JtYW5jZSBiZWNhdXNlIG9ubHkgZGF0YSBpcyBzZW50IHRvIEdvb2dsZUVhcnRoCisJICAgIGZvciB0aGUgYXJlYXMgc2hvd24gaW4gdGhlIEdvb2dsZUVhcnRoIHdpbmRvdy4gIAorCSAgICBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBhcmUgdXN1YWxseSAgem9vbWVkIGluIG9uIEdvb2dsZUVhcnRoIHRvIGV4YW1pbmUgYSAKKwkgICAgc21hbGwgYXJlYS4gIFRoaXMgaXMgb25seSBhdmFpbGFibGUgd2hlbiB1c2luZyBvbmUgdGhlIHNlcnZsZXQgcmVsYXRlZCAKKwkgICAgZGlzcGxheSBtZXRob2RzLgorCSAgICAoRGVmYXVsdDombmJzcDtGYWxzZSk8L2xpPgorCTxsaT48ZW0+IlNob3cgQWRtaW4gQXJlYSBCb3JkZXJzIjwvZW0+CisJICAgICA8YnI+SWYgc2VsZWN0ZWQgdGhlbiB0aGUgYm9yZGVycyBvZiB0aGUgU1RFTSBBZG1pbmlzdHJhdGlvbiBhcmVhcyBhcmUgc2hvd24uCisJICAgICBUaGlzIGlzIHVzdWFsbHkgbm90IG5lZWRlZCBiZWNhdXNlIEdvb2dsZUVhcnRoIGFsc28gaGFzIGFuIG9wdGlvbiB0byAKKwkgICAgIHNob3cgYm9yZGVyIGFyZWFzLgorCSAgICAgKERlZmF1bHQ6Jm5ic3A7RmFsc2UpPC9saT4KKwk8bGk+PGVtPiJFeHBlcmltZW50YWwgT3B0aW9uIjwvZW0+CisJICAgICAgPGJyPlVzZWQgdG8gdHVybiBvbiB2YXJpb3VzIGV4cGlybWVudGFsIG9wdGlvbnMuIE5vdCBub3JtYWxseSB1c2VkIQorCSAgICAgIChEZWZhdWx0OiZuYnNwO0ZhbHNlKTwvbGk+Cis8L3VsPgorPGltZyBzcmM9ImltZy9wcmVmZXJlbmNlc2dlYWR2YW5jZWQuanBnIiAvPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvcHJlZmVyZW5jZXNnZXRvcGxldmVsLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL3ByZWZlcmVuY2VzZ2V0b3BsZXZlbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NjhlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL3ByZWZlcmVuY2VzZ2V0b3BsZXZlbC5odG1sCkBAIC0wLDAgKzEsNjUgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkdvb2dsZSBFYXJ0aCBQcmVmZXJlbmNlczwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5Hb29nbGUgRWFydGggUHJlZmVyZW5jZXM8L2gxPgorPHA+CitTcGVjaWZpZXMgdGhlIHByZWZlcmVuY2VzIHVzZWQgYnkgdGhlIFNURU0gdG8gR29vZ2xlRWFydGggaW50ZXJmYWNlLgorPHA+Cis8dWw+CisgIDxsaT48ZW0+Q2hvb3NlIHRoZSBNZXRob2QgdXNlZCB0byBkaXNwbGF5IFNURU0gUmVzdWx0czwvZW0+PC9saT4KKyAgPHVsPgorCTxsaT48ZW0+TG9nT25seTwvZW0+PGJyPldpdGggdGhpcyBvcHRpb24sIHRoZSBLTUwgZmlsZXMgCisJYXJlIHdyaXR0ZW4gYnV0IG5vdCBkaXNwbGF5ZWQgYnkgR29vZ2xlRWFydGguIAorCVRoaXMgd291bGQgYmUgdXNlZCB3aGVuIHlvdSBhcmUgZWl0aGVyIGdvaW5nIHRvIGRpc3BsYXkgCisJdGhlIEdvb2dsZUVhcnRoIHZpc3VhbGl6YXRpb24gYXQgYSBsYXRlciB0aW1lIG9yIGlmIHlvdSBhcmUgCisJZ29pbmcgdG8gcnVuIEdvb2dsZUVhcnRoIGZyb20gYW5vdGhlciBzeXN0ZW0gd2l0aCB0aGUgS01MIAorCWZpbGVzIG9uIGEgc2hhcmVkIGRpc2suPC9saT4KKwk8bGk+PGVtPiJMb2crU2VydmxldCI8L2VtPjxicj5XaXRoIHRoaXMgb3B0aW9uLCAKKwl0aGUgS01MIGZpbGVzIGFyZSB3cml0dGVuIGFuZCB0aGVuIGRpc3BsYXllZCBieSBHb29nbGVFYXJ0aC4gCisJR29vZ2xlRWFydGggYWN0dWFsbHkgcmVxdWVzdHMgdGhlIGZpbGUgZnJvbSBhIHdlYnNlcnZlciAKKwlTZXJ2bGV0IHdoaWNoIHJlYWRzIHRoZSBmaWxlIGFuZCBzZW5kcyBpdCB0byBHb29nbGVFYXJ0aC48L2xpPgorCTxsaT48ZW0+IkFzeW5jU2VydmxldCI8L2VtPjxicj5UaGUgS01MIGlzIHdyaXR0ZW4gb24gZXZlcnkgY3ljbGUsIAorCW92ZXJsYXlpbmcgdGhlIGZpbGUgd3JpdHRlbiBmb3IgdGhlIHByZXZpb3VzIGN5Y2xlLiBHb29nbGVFYXJ0aCAKKwlhc2tzIGZvciBuZXcgZGF0YSBvbiBhIHByZWRldGVybWluZWQgaW50ZXJ2YWwgYW5kIGlzIHNlbnQgdGhlIAorCWN1cnJlbnQgS01MLiAgVGhlIGFkdmFudGFnZSBvdmVyIHRoZSBwcmV2aW91cyBtZXRob2QgaXMgdGhhdCAKKwlpdCBoZWxwcyBrZWVwIEdvb2dsZUVhcnRoIGZyb20gZmFsbGluZyB0b28gZmFyIGJlaGluZCB0aGUgU1RFTSBwcm9jZXNzaW5nLjwvbGk+CisJPGxpPjxlbT4iRGlyZWN0TGF1bmNoIjwvZW0+PGJyPldpdGggdGhpcyBvcHRpb24sIHRoZSBLTUwgZmlsZXMgCisJYXJlIGRpcmVjdGx5IHNlbnQgdG8gR29vZ2xlRWFydGggd2l0aG91dCB1c2luZyBhbiBpbnRlcm1lZGlhdGUgCisJd2ViIHNlcnZlci4gVGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgYmVjYXVzZSBHb29nbGVFYXJ0aCBtYXkgZ2V0IAorCWZpbGVzIGZhc3RlciB0aGFuIGl0IGNhbiBwcm9jZXNzIHRoZW0gYnV0IGl0IGlzIG1vcmUgZWZmaWNpZW50LjwvbGk+CisJPGxpPjxlbT4iTWFudWFsRGlzcGxheSI8L2VtPjxicj4gVGhlIG1hcCBpcyBnZW5lcmF0ZWQgYnkgdXNlciAKKwljbGlja2luZyB0aGUgPGI+RGlzcGxheTwvYj4gYnV0dG9uLiBUaGlzIGlzIHRoZSBkZWZhdWx0IG9wdGlvbi48L2xpPgorICA8L3VsPgorICA8bGk+PGVtPiJGb2xkZXIgZm9yIEtNTCBsb2dnaW5nOiI8L2VtPlRoaXMgaXMgdGhlIGZvbGRlciB3aGVyZSAKKwlTVEVNIHdpbGwgd3JpdGUgdGhlIEtNTCBmaWxlcyB0aGF0IEdvb2dsZUVhcnRoIHdpbGwgcmVhZC4gIAorCUlmIGl0IGFscmVhZHkgY29udGFpbnMgS01MIGZpbGVzLCB0aGUgdXNlciB3aWxsIGJlIGdpdmVuIAorCXRoZSBvcG9ydHVuaXR5IHRvIGRlbGV0ZSB0aGVtLCBrZWVwIHRoZW0gb3IgY2hvb3NlIGEgbmV3IGZvbGRlci48L2xpPgorICA8bGk+PGVtPiJVc2UgaW50ZXJuYWwgd2Vic2VydmVyIjwvZW0+PGJyPlRoaXMgaXMgdXNlZCB0byBjYXVzZSB0aGUgCisgICAgd2Vic2VydmVyIGJ1aWx0IGludG8gRWNsaXBzZSB0byBiZSB1c2VkLjwvbGk+CisgIDxsaT48ZW0+Ikhvc3RuYW1lOnBvcnQgZm9yIGV4dGVybmFsIHdlYnNlcnZlciI8L2VtPgorICAgIDxicj5UaGlzIGlzIHRoZSByZXF1aXJlZCBob3N0bmFtZSBhbmQgcG9ydCBmb3IgYW4gZXh0ZXJuYWwgd2Vic2VydmVyLiAKKyAgICBOb3JtYWxseSB0aGUgaW50ZXJuYWwgd2Vic2VydmVyIHdvdWxkIGJlIHVzZWQgc28gdGhpcyBpcyBub3QgbmVlZGVkIAorICAgIGJ1dCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgb25lIG1pZ2h0IHdhbnQgdG8gdXNlIGFuIGV4aXN0aW5nIHdlYiBzZXJ2ZXIuIDwvbGk+CisgIDxsaT48ZW0+IkF1dG9tYXRpY2FsbHkgc3RhcnR1cCBHb29nbGVFYXJ0aCI8L2VtPgorICAgIDxicj5JZiBzcGVjaWZpZWQgdGhlbiB3aGVuIHRoZSBTVEVNLUdvb2dsZUVhcnRoIHZpZXcgaXMgc3RhcnRlZCwKKyAgICAgdGhlbiB0aGUgR29vZ2xlRWFydGggYXBwbGljYXRpb24gaXMgYWxzbyBsYXVuY2hlZC48L2xpPgorICA8bGk+PGVtPiJBdXRvbWF0aWNhbGx5IHByb2Nlc3MgZXZlcnkgc2ltdWxhdGlvbiI8L2VtPgorICAgIDxicj5pZiBzcGVjaWZpZWQsIHRoZW4gd2hlbiB5b3Ugc3RhcnQgYW55IHNpbXVsYXRpb24gcnVubmluZywgCisgICAgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGhhdmUgaXRzIHByb2Nlc3NpbmcgYmUgbWFwcGVkIHRvIEdvb2dsZUVhcnRoLiAgCisgICAgT25seSBvbmUgc2ltdWxhdGlvbiB3aWxsIGJlIGRpc3BsYXllZCBieSBHRSBzaW5jZSBpdCB3b3VsZCAKKyAgICBiZSBjb3VudGVycHJvZHVjdGl2ZSB0byBzaG93IDIgZGlmZmVyZW50IHZpZXdzIGF0IHRoZSBzYW1lIHRpbWUuIDwvbGk+CisgIDxsaT48ZW0+IldyaXRlIEtNTCBmaWxlcyBvbmx5IGV2ZXJ5IE4gdGggY3ljbGUiPC9lbT4KKyAgICA8YnI+SWYgdGhlIHNpbXVsYXRpb24gZG9lcyBub3QgY2hhbmdlIHJhcGlkbHkgZnJvbSBjeWNsZSB0byBjeWNsZSwgCisgICAgc2lnbmlmaWNhbnQgb3ZlcmhlYWQgY2FuIGJlIHNhdmVkIGJ5IG9ubHkgc2VuZGluZyBkYXRhIHRvIAorICAgIEdvb2dsZUVhcnRoIGV2ZXJ5IE50aCBjeWNsZS48L2xpPgorICA8bGk+PGVtPiJDaG9zZSBBc3BlY3QgdG8gYmUgTG9nZ2VkLmN5Y2xlIjwvZW0+CisgICAgPGJyPlNlbGVjdCB0aGUgZGlzZWFzZSBhc3BlY3QgdG8gYmUgZGlzcGxheWVkIGFzIGNvbG9yZWQgcG9seWdvbnMKKyAgICBvbiB0aGUgR29vZ2xlRWFydGggbWFwLjwvbGk+Cis8L3VsPgorPGltZyBzcmM9ImltZy9wcmVmZXJlbmNlc2dldG9wbGV2ZWwuanBnIiAvPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvcHJlZmVyZW5jZXNsb2dnaW5nLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL3ByZWZlcmVuY2VzbG9nZ2luZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZjJiZjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL3ByZWZlcmVuY2VzbG9nZ2luZy5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPlNpbXVsYXRpb24gTWFuYWdlbWVudDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5Mb2dnaW5nPC9oMT4KKzxwPgorT24gdGhlIGxvZ2dpbmcgcHJlZmVyZW5jZSBwYWdlLCB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB0byBsb2cgaW50ZWdlcnMgb3IgcmVhbCBudW1iZXJzIGluIGxvZyBmaWxlcy4gCitUaGUgZGVmYXVsdCBpcyB0byBsb2cgcmVhbCBudW1iZXJzLgorIDwvcD4KKyA8YnIvPgorIDxpbWcgc3JjPSJpbWcvbG9nZ2luZ3ByZWZlcmVuY2VzLnBuZyI+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9wcmVmZXJlbmNlc21hcGRhdGFtZ250Lmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL3ByZWZlcmVuY2VzbWFwZGF0YW1nbnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDYwYTVhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9wcmVmZXJlbmNlc21hcGRhdGFtZ250Lmh0bWwKQEAgLTAsMCArMSwzNCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+TWFwIERhdGEgTWFuYWdlbWVudDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5NYXAgRGF0YSBNYW5hZ2VtZW50PC9oMT4KKzxwPlRoZSBNYXAgRGF0YSBNYW5hZ2VtZW50IHByZWZlcmVuY2VzIHBhZ2Ugc2V0cyBwcmVmZXJlbmNlcyBmb3IKK21hbmFnaW5nIHRoZSBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YSB0aGF0IGRlZmluZXMgdGhlIGJvcmRlcnMgb2YKK2dlb2dyYXBoaWMgcG9seWdvbnMuPC9wPgorPHVsPgorCTxsaT48ZW0+ICJEb3duIHNhbXBsZSBsYXRpdHVkZS9sb25naXR1ZGUgcG9seWdvbnMuIjwvZW0+IElmIFRydWUsCisJdGhlbiB0aGUgZnVsbCByZXNvbHV0aW9uIHBvbHlnb24gZGF0YSB3aWxsIGJlICJzYW1wbGVkIiBieSBza2lwcGluZworCW92ZXIgZGF0YSBwb2ludHMgaW4gdGhlIHBvbHlnb25zIChhcyBzcGVjaWZpZWQgaW4gdGhlIHNhbXBsZSBmcmVxdWVuY3kpCisJKERlZmF1bHQ6Jm5ic3A7RmFsc2UpPC9saT4KKwk8bGk+PGVtPiAibGF0aXR1ZGUvbG9uZ2l0dWRlIGRhdGEgc2FtcGxlIGZyZXF1ZW5jeS4iPC9lbT5UaGUKKwludW1iZXIgb2YgbGF0L2xvbmcgZGF0YSBwb2ludHMgdG8gc2tpcCB3aGVuIHNhbXBsaW5nIHRoZSBmdWxsCisJcmVzb2x1dGlvbiBkYXRhLiAoRGVmYXVsdDombmJzcDsxKTwvbGk+CisJPGxpPjxlbT4gIlJlcG9ydCBJL08gRXhjZXB0aW9ucy4iPC9lbT4gSWYgVHJ1ZSwgdGhlbiBhbiBlcnJvciBpbgorCXJlYWRpbmcgaW4gdGhlIGxhdC9sb25nIGRhdGEgZm9yIGEgY291bnRyeSB3aWxsIGJlIHJlcG9ydGVkLiBUeXBpY2FsbHksCisJdGhpcyBpcyBGYWxzZSBhcyB0aGVyZSBhcmUgYSBmZXcgY291bnRyaWVzIHdoZXJlIHRoZSBsYXQvbG9uZyBkYXRhIGlzCisJbWlzc2luZyBhbmQgdGhpcyBjYW4gYmUgaWdub3JlZC4gKERlZmF1bHQ6Jm5ic3A7RmFsc2UpPC9saT4KKwk8bGk+PGVtPiAiVXNlIGxvd2VyIHJlc29sdXRpb24gbGF0L2xvbmcgZGF0YSBpZiBhdmFpbGFibGUiIDwvZW0+SWYKKwlUcnVlLCB0aGVuIHRoZSBnZW9ncmFwaGljIHZpc3VhbGl6YXRpb25zIHdpbGwgZmF2b3IgdGhlIHVzZSBvZgorCXByZS1jb21wdXRlZCBsb3dlciByZXNvbHV0aW9uIGRhdGEgc2V0cyBpbnN0ZWFkIG9mIG1vcmUgZGV0YWlsZWQKKwlyZXNvbHV0aW9uIGRhdGEuIFRoaXMgY2FuIHJlc3VsdCBpbiBmYXN0ZXIgdmlzdWFsaXphdGlvbiBwZXJmb3JtYW5jZQorCXdpdGggdGhlIHBvdGVudGlhbCBmb3Igc2xpZ2h0IHZpc3VhbCBkZWZlY3RzLiBJbiBwcmFjdGljZSwgdGhlIHZpc3VhbAorCWltcGFjdCBpcyB1bmRldGVjdGFibGUgd2hpbGUgdGhlIGluY3JlYXNlIGluIHBlcmZvcm1hbmNlIGlzIGRyYW1hdGljLgorCShEZWZhdWx0OiZuYnNwO1RydWUpPC9saT4KKzwvdWw+Cis8aW1nIHNyYz0iaW1nL3ByZWZlcmVuY2VzbWFwZGF0YW1nbnQuanBnIiAvPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvcHJlZmVyZW5jZXNtYXB2aWV3Lmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL3ByZWZlcmVuY2VzbWFwdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMjE0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL3ByZWZlcmVuY2VzbWFwdmlldy5odG1sCkBAIC0wLDAgKzEsMzMgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPk1hcCBWaWV3PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPk1hcCBWaWV3PC9oMT4KKzxwPk1hcCBWaWV3PC9wPgorPHVsPgorCTxsaT48ZW0+QmFja2dyb3VuZCBDb2xvcjwvZW0+VGhlIGNvbG9yIG9mIHRoZSBkaXNwbGF5IG91dHNpZGUgb2YgYQorCXBvbHlnb24uPC9saT4KKwk8bGk+PGVtPkZvcmVncm91bmQgQ29sb3I8L2VtPlRoZSBjb2xvciBvZiBwb2x5Z29ucyB0aGF0IGNvcnJlc3BvbmQKKwl0byBhIHByb3BlcnR5IHdpdGggYSByZWxhdGl2ZSB2YWx1ZSBncmVhdGVyIHRoYW4gemVybyAoMC4wKTwvbGk+CisJPGxpPjxlbT5aZXJvIFJlbGF0aXZlIFZhbHVlIENvbG9yPC9lbT4gVGhlIGNvbG9yIG9mIHBvbHlnb25zIHRoYXQKKwljb3JyZXNwb25kIHRvIGEgcHJvcGVydHkgd2l0aCBhIHJlbGF0aXZlIHZhbHVlIGVxdWFsIHRvIHplcm8gKDAuMCkuPC9saT4KKwk8bGk+PGVtPkJvcmRlcnMgQ29sb3I8L2VtPlRoZSBjb2xvciBvZiBwb2x5Z29uIGJvcmRlcnMuPC9saT4KKwk8bGk+PGVtPkRyYXcgUG9seWdvbiBCb3JkZXJzPC9lbT5JZiBUcnVlLCB0aGVuIGRyYXcgdGhlIHBvbHlnb24KKwlib3JkZXJzIChEZWZhdWx0OiZuYnNwO1RydWUpPC9saT4KKwk8bGk+PGVtPlVzZSBMb2dhcml0aG1pYyBTY2FsZTwvZW0+SWYgVHJ1ZSwgdGhlbiB0aGUgaW50ZW5zaXR5IG9mCisJdGhlIGNvbG9yIGRpc3BsYXllZCBpbiBhIHBvbHlnb24gdGhhdCBjb3JyZXNwb25kcyB0byBhIHByb3BlcnR5IHdpdGggYQorCW5vbi16ZXJvIHJlbGF0aXZlIHZhbHVlIHdpbGwgYmUgZGV0ZXJtaW5lZCB1c2luZyBhIGxvZ2FyaXRobWljIHNjYWxlLgorCShEZWZhdWx0OiZuYnNwO0ZhbHNlKTwvbGk+CisJPGxpPjxlbT5HYWluIEZhY3RvcjwvZW0+KERlZmF1bHQ6Jm5ic3A7MS4wRTcpPC9saT4KKwk8bGk+PGVtPkdVSSBTY2FsaW5nIEZhY3RvcjwvZW0+KERlZmF1bHQ6Jm5ic3A7OC4wKTwvbGk+CisJPGxpPjxlbT5Jbml0aWFsIFggVHJhbnNsYXRpb248L2VtPihEZWZhdWx0OiZuYnNwOzApPC9saT4KKwk8bGk+PGVtPkluaXRpYWwgWSBUcmFuc2xhdGlvbjwvZW0+KERlZmF1bHQ6Jm5ic3A7MCk8L2xpPgorCTxsaT48ZW0+Wm9vbSBSdWxlciBTY2FsaW5nIEZhY3RvcjwvZW0+PC9saT4KKwk8bGk+PGVtPkluaXRpYWwgU2NhbGUgU2VsZWN0aW9uICgwLTEwMCk8L2VtPihEZWZhdWx0OiZuYnNwOzUwKTwvbGk+Cis8L3VsPgorPGltZyBzcmM9ImltZy9wcmVmZXJlbmNlc21hcHZpZXcuanBnIiAvPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvcHJlZmVyZW5jZXNvdmVydmlldy5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9wcmVmZXJlbmNlc292ZXJ2aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYzYTg0NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvcHJlZmVyZW5jZXNvdmVydmlldy5odG1sCkBAIC0wLDAgKzEsMjYgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+CisKKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5TVEVNIFByZWZlcmVuY2VzIE92ZXJ2aWV3PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8aDE+U1RFTSBQcmVmZXJlbmNlcyBPdmVydmlldzwvaDE+Cis8cD5TVEVNIGhhcyBhIG51bWJlciBvZiA8ZW0+cHJlZmVyZW5jZXM8L2VtPiB0aGF0IGNhbiBiZSBzcGVjaWZpZWQKK3RoYXQgc3BlY2lmeSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIG9yIGNvbnRyb2wgaG93IFNpbXVsYXRpb25zCitleGVjdXRlIG9yIGFyZSBkaXNwbGF5ZWQuIFByZWZlcmVuY2VzIGFyZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZQorIldpbmRvd3MtJmd0O1ByZWZlcmVuY2VzLi4uIiBtZW51LiA8L3A+Cis8cD4KKzxpbWcKKwlzcmM9ImltZy9wcmVmZXJlbmNlc29wZW5tZW51LnBuZyIgLz48L3A+Cis8cD5UaGlzIG9wZW5zIHRoZSBwcmVmZXJlbmNlcyBkaWFsb2cuIFNlbGVjdGluZyB2YXJpb3VzIGVsZW1lbnRzCit1bmRlciAiU1RFTSIgaW4gdGhlIHRyZWUgZGlzcGxheSBvbiB0aGUgbGVmdCwgZGlzcGxheXMgdGhlIGNvcnJlc3BvbmRpbmcKK2ludGVyZmFjZSBmb3Igc2V0dGluZyBwcmVmZXJlbmNlcyBvbiB0aGUgcmlnaHQuPC9wPgorCisKKzxpbWcKKwlzcmM9ImltZy9wcmVmZXJlbmNlc3RvcGxldmVsLnBuZyIgLz4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL3ByZWZlcmVuY2Vzc2ltbWFuYWdlbWVudC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9wcmVmZXJlbmNlc3NpbW1hbmFnZW1lbnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWEyMWY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9wcmVmZXJlbmNlc3NpbW1hbmFnZW1lbnQuaHRtbApAQCAtMCwwICsxLDQ4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5TaW11bGF0aW9uIE1hbmFnZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+U2ltdWxhdGlvbiBNYW5hZ2VtZW50PC9oMT4KKzxwPlRoZSA8ZW0+U2ltdWxhdGlvbiBNYW5hZ2VtZW50PC9lbT4gcHJlZmVyZW5jZSBwYWdlIGFsbG93cyBjb250cm9sCitvdmVyIHRoZSBleGVjdXRpb24gb2YgU2ltdWxhdGlvbnMgYW5kIHRoZSByZXBvcnRpbmcgb2Ygd2FybmluZyBtZXNzYWdlcworZ2VuZXJhdGVkIHdoZW4gYSBTaW11bGF0aW9uIGlzIGNyZWF0ZWQgZnJvbSBhIDxhCisJaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNzY2VuYXJpbyI+IFNjZW5hcmlvPC9hPi4KKzx1bD4KKwk8bGk+PGVtPiJQYXVzZSBzaW11bGF0aW9uIGFmdGVyIGVhY2ggY3ljbGUiPC9lbT4gSWYgdGhpcyBib3ggaXMKKwljaGVja2VkLCB0aGUgU2ltdWxhdGlvbiB3aWxsIHBhdXNlIGV4ZWN1dGlvbiBmb3IgdGhlIG51bWJlciBvZiBzZWNvbmRzCisJc3BlY2lmaWVkIGluIHRoZSBib3ggYmVsb3cgaXQuIFRoaXMgaXMgdXNlZnVsIHRvIG1hdGNoIHRoZSBzcGVlZCBvZgorCWV4ZWN1dGlvbiBvZiB0aGUgbWFjaGluZSBydW5uaW5nIHRoZSBTaW11bGF0aW9uIHdpdGggaXRzIHZpc3VhbGl6YXRpb24uCisJVGhpcyBwcmVmZXJlbmNlIHByb3ZpZGVzIHRoZSBvcHRpb24gdG8gZ2l2ZSB2aXN1YWxpemF0aW9ucyBtb3JlIHRpbWUgdG8KKwlyZW5kZXIsIHRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgdGhlIDxhIGhyZWY9Ii4uL3ZpZXdzL2dlLmh0bWwiPgorCUdvb2dsZSBFYXJ0aCB2aWV3PC9hPiwgZm9yIGluc3RhbmNlLgorCShEZWZhdWx0OiZuYnNwO1RydWUsJm5ic3A7MiZuYnNwO1NlY29uZHMpPC9saT4KKwk8bGk+PGVtPiJSZXBvcnQgYWxsIHVucmVzb2x2ZWQgbGlua3MiPC9lbT4gSWYgdGhpcyBib3ggaXMgY2hlY2tlZCwKKwl0aGVuIGFueSBFZGdlcyBvciBMYWJlbHMgdGhhdCBzcGVjaWZ5IGEgTm9kZSBpbiBhIGdyYXBoIHRoYXQgY2FuIG5vdCBiZQorCSJyZXNvbHZlZCIgKGkuZS4sIHRoZSBOb2RlIGNhbm5vdCBiZSBmb3VuZCkgd2lsbCBiZSByZXBvcnRlZCB3aXRoIGFuCisJaW5mb3JtYXRpb25hbCBtZXNzYWdlLiBJdCBpcyB1c2VmdWwgdG8gaGF2ZSB0aGUgb3B0aW9uIHRvIHN1cHByZXNzCisJdGhlc2UgbWVzc2FnZXMgYXMgbWFueSBvZiB0aGUgYnVpbHQtaW4gPGEKKwkJaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNzY2VuYXJpbyI+IFNjZW5hcmlvczwvYT4KKwloYXZlIHVucmVzb2x2ZWQgbGlua3MuIFRoaXMgaXMgbm90IGFuIGVycm9yLCB0aGUgdW5yZXNvbHZlZCBsaW5rcyBhcmUKKwlpZ25vcmVkIGFuZCByZXN1bHQgZnJvbSB1c2luZyA8YQorCQlocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI2dyYXBoIj4gR3JhcGhzPC9hPiB0aGF0CisJcHJvdmlkZSBnZW5lcmFsIGNvbm5lY3Rpdml0eS4gRm9yIGluc3RhbmNlLCBiZXR3ZWVuIHRoZSBFYXJ0aCAoWlpaKSBhbmQKKwlhbGwgb2YgdGhlIHBvc3NpYmxlIGNvdW50cmllcyBpbiB0aGUgd29ybGQuIE5vdCBhbGwgPGEKKwkJaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNzY2VuYXJpbyI+IFNjZW5hcmlvczwvYT4KKwl3aWxsIGludm9sdmUgZXZlcnkgY291bnRyeSBzb21lIGxpbmtzIGFyZSB1bnJlc29sdmVkLgorCShEZWZhdWx0OiZuYnNwO0ZhbHNlKTwvbGk+CisJPGxpPjxlbT4iUmVwb3J0IHVucmVzb2x2ZWQgYWlyIHRyYW5zcG9ydCBsaW5rcyI8L2VtPiBJZiB0aGlzIGJveAorCWlzIGNoZWNrZWQgdGhlbiB1bnJlc29sdmVkIGxpbmtzIGZyb20gYWlyIHRyYW5zcG9ydGF0aW9uIHdpbGwgYmUgCisJc2hvd2VkLihEZWZhdWx0OiZuYnNwO0ZhbHNlKTwvbGk+CisJPGxpPjxlbT4iUmVwb3J0IHRoZSBudW1iZXIgb2YgdW5yZXNvbHZlZCBsaW5rcyI8L2VtPiBJZiB0aGlzIGJveAorCWlzIGNoZWNrZWQgdGhlbiB0aGUgbnVtYmVyIG9mIGxpbmtzIHRoYXQgY2Fubm90IGJlIHJlc29sdmVkIHdpbGwgYmUKKwlyZXBvcnRlZCBhcyBhbiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UuKERlZmF1bHQ6Jm5ic3A7RmFsc2UpPC9saT4KKwk8bGk+PGVtPiJVc2VyIHNjZW5hcmlvIGNhY2hpbmciPC9lbT5JZiB0aGlzIGJveCBpcyBjaGVja2VkIHNjZW5hcmlvcworCXdpbGwgYmUgY2FjaGVkIGluIG1lbW9yeSBhbGxvd2luZyB0aGVtIHRvIHN0YXJ0IHVwIG1vcmUgcXVpY2tseS4gKERlZmF1bHQ6Jm5ic3A7RmFsc2UsIHVuY2hlY2tlZCk8L2xpPgorPC91bD4KKzwvcD4KKzxpbWcgc3JjPSJpbWcvcHJlZmVyZW5jZXNzaW1tYW5hZ2VtZW50LnBuZyIgLz4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL3ByZWZlcmVuY2Vzc29sdmVyLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL3ByZWZlcmVuY2Vzc29sdmVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhkZDliNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvcHJlZmVyZW5jZXNzb2x2ZXIuaHRtbApAQCAtMCwwICsxLDIwIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5TaW11bGF0aW9uIE1hbmFnZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+U29sdmVyPC9oMT4KKzxwPgorT24gdGhlIHNvbHZlciBwcmVmZXJlbmNlIHBhZ2UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgd29ya2VyIHRocmVhZHMgeW91IHdhbnQgdG8gCitydW4gZHVyaW5nIGEgc2ltdWxhdGlvbi4gVGhlIG51bWJlciBpcyB0eXBpY2FsbHkgdGhlIG5hbWUgYXMgdGhlIG51bWJlciBvZiBDUFUgY29yZXMgYXZhaWxhYmxlIAorb24geW91ciBoYXJkd2FyZSwgcHV0IHlvdSBjYW4gZXhwZXJpbWVudCB3aXRoIHRoZSBudW1iZXIgdG8gZGV0ZXJtaW5lIHdoYXQgcGVyZm9ybXMgYmVzdCBvbiB5b3VyIG1hY2hpbmUuCisgPC9wPgorIDxwPiBZb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgZGVmYXVsdCBzb2x2ZXIgdG8gdXNlIHdoZW4gcnVubmlnbiBhIHNpbXVsYXRpb24uIFdoZW4gYSBuZXcgc2NlbmFyaW8gaXMgY3JlYXRlZCwKKyB0aGUgZGVmYXVsdCBzb2x2ZXIgd2lsbCBiZSBwcmUtc2VsZWN0ZWQgZm9yIHRoZSBzY2VuYXJpby4KKyA8L3A+CisgPGJyLz4KKyA8aW1nIHNyYz0iaW1nL3NvbHZlcnByZWZlcmVuY2VzLnBuZyI+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9wcmVmZXJlbmNlc3Zpc3VhbGl6YXRpb250b3BsZXZlbC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9wcmVmZXJlbmNlc3Zpc3VhbGl6YXRpb250b3BsZXZlbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMjE3NGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ByZWZlcmVuY2VzL3ByZWZlcmVuY2VzdmlzdWFsaXphdGlvbnRvcGxldmVsLmh0bWwKQEAgLTAsMCArMSwyNiBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+VmlzdWFsaXphdGlvbiBQcmVmZXJlbmNlczwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5WaXN1YWxpemF0aW9uPC9oMT4KKzxwPlRoZSBWaXN1YWxpemF0aW9uIHByZWZlcmVuY2VzIHNwZWNpZnkgdGhlIGNvbmZpZ3VyYXRpb24gdmFsdWVzCit0aGF0IHNwZWNpZnkgcGFyYW1ldGVycyB0aGF0IGNvbnRyb2wgdGhlIGdlbmVyYXRpb24gb2YgdmlzdWFsCityZXByZXNlbnRhdGlvbnMgb2YgYSBTaW11bGF0aW9uLjwvcD4KKzxwPgorPHVsPgorCTxsaT48ZW0+Ik5hbWUgb2YgdGhlIGluaXRpYWwgYXR0cmlidXRlIHRvIGRpc3BsYXk6IjwvZW0+IFRoaXMgaXMKKwl0aGUgdGV4dCBzdHJpbmcgdGhhdCBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdXBkYXRlZCBieSBhIDxhCisJCWhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjZGVjb3JhdG9yIj4gRGVjb3JhdG9yPC9hPgorCXRvIGRpc3BsYXkgYnkgZGVmYXVsdC4gVGhpcyBtZWFucyB0aGF0IGlmIGEgPGEKKwkJaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNkZWNvcmF0b3IiPiBEZWNvcmF0b3I8L2E+CisJdXBkYXRlcyBhIHByb3BlcnR5IHRoYXQgaGFzIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHN0cmluZyBhcyBpdHMgbmFtZSwKKwl0aGVuIGl0IHdpbGwgc2VsZWN0IGl0IGFzIHRoZSBkZWZhdWx0IHRvIGRpc3BsYXkgZmlyc3QuIElmIHRoZSB2YWx1ZSBpcworCSJJIiwgZm9yIGluc3RhbmNlLCB0aGVuIGl0IHdpbGwgZGlzcGxheSB0aGUgImluZmVjdGlvdXMiIHZhbHVlCisJKERlZmF1bHQ6Jm5ic3A7IkkiKTwvbGk+Cis8L3VsPgorPGltZyBzcmM9ImltZy9wcmVmZXJlbmNlc3Zpc3VhbGl6YXRpb250b3BsZXZlbC5qcGciIC8+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9hY3RpdmVzaW11bGF0aW9uc3ZpZXcuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvYWN0aXZlc2ltdWxhdGlvbnN2aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkNTA4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvYWN0aXZlc2ltdWxhdGlvbnN2aWV3Lmh0bWwKQEAgLTAsMCArMSwxNyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+QWN0aXZlIFNpbXVsYXRpb25zIFZpZXc8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+QWN0aXZlIFNpbXVsYXRpb25zIFZpZXc8L2gxPgorPHA+CitUaGUgPGVtPkFjdGl2ZSBTaW11bGF0aW9ucyBWaWV3PC9lbT4gc2ltcGx5IGxpc3RzIHRoZSBTaW11bGF0aW9ucyAocnVubmluZyBvciBub3QpIHRoYXQgYXJlICJhY3RpdmUiIGluIFNURU0uICAKKzwvcD4KKzxwPgorQ2xpY2tpbmcgb24gdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBTaW11bGF0aW9ucyB3aWxsIHNldCB0aGUgZm9jdXMgb24gdGhhdCBTaW11bGF0aW9uLgorPC9wPgorPGltZyBzcmM9ImltZy9hY3RpdmVzaW11bGF0aW9uc3ZpZXcuanBnIi8+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9jb250cm9sdmlldy5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9jb250cm9sdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4N2MwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2NvbnRyb2x2aWV3Lmh0bWwKQEAgLTAsMCArMSwzMSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPmhlbHA8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKzxoMT5Db250cm9sIFZpZXc8L2gxPgorPHA+VGhlIDxlbT5Db250cm9sIFZpZXc8L2VtPiBkaXNwbGF5cyBhIGR5bmFtaWMgY29sbGVjdGlvbiBvZgorInNpbXVsYXRpb24gY29udHJvbHMiIHRoYXQgbWF0Y2ggdGhlIHNldCBvZiAiYWN0aXZlIiBTaW11bGF0aW9ucy4gRWFjaAorY29udHJvbCBzaG93cyB0aGUgbmFtZSBvZiB0aGUgU2NlbmFyaW8gYW5kIHRoYXQgc3RhdHVzIG9mIHRoZQorU2ltdWxhdGlvbiwgaW5jbHVkaW5nIGl0cyAic3RhdGUiIChlaXRoZXIgIlJ1bm5pbmciIG9yICJQYXVzZWQiKSwgdGhlCitjdXJyZW50ICJ0aW1lIiBpbiB0aGUgc2ltdWxhdGlvbiwgYSBwcm9ncmVzcyBiYXIuIEVhY2ggY29udHJvbCBhbHNvIGhhcworZml2ZSBidXR0b25zIHRoYXQgY29udHJvbCB0aGUgY29ycmVzcG9uZGluZyBTaW11bGF0aW9uOgorPG9sPgorCTxsaT4iUnVuIiBCZWdpbiBydW5uaW5nIHRoZSBTaW11bGF0aW9uLjwvbGk+CisJPGxpPiJQYXVzZSIgUGF1c2UgdGhlIHJ1bm5pbmcgb2YgdGhlIFNpbXVsYXRpb24uIFRoaXMgbWFpbnRhaW5zCisJdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNpbXVsYXRpb24uPC9saT4KKwk8bGk+IlJlc2V0IiBSZXNldCBhbGwgc3RhdGUgaW5mb3JtYXRpb24gaW4gdGhlIFNpbXVsYXRpb24gYmFjayB0bworCWluaXRpYWwgdmFsdWVzIGFuZCBzZXQgdGhlIHN0YXRlIG9mIHRoZSBTaW11bGF0aW9uIHRvICJQYXVzZWQiPC9saT4KKwk8bGk+IlN0ZXAiIFJ1biB0aGUgc2ltdWxhdGlvbiBmb3IgYSBzaW5nbGUgY3ljbGUgYW5kIHRoZW4gc2V0IHRoZQorCXN0YXRlIG9mIHRoZSBTaW11bGF0aW9uIHRvICJQYXVzZWQiPC9saT4KKwk8bGk+IlN0b3AiIFN0b3AgYWxsIGV4ZWN1dGlvbiBvZiB0aGUgU2ltdWxhdGlvbiBhbmQgZGVzdHJveSBhbGwKKwlzdGF0ZSBpbmZvcm1hdGlvbi4gVGhlIFNpbXVsYXRpb24gd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS48L2xpPgorPC9vbD4KKzwvcD4KKzxpbWcgc3JjPSJpbWcvY29udHJvbHZpZXcucG5nIi8+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2NzdmxvZ2dlcnZpZXcuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvY3N2bG9nZ2Vydmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNjlkYWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2NzdmxvZ2dlcnZpZXcuaHRtbApAQCAtMCwwICsxLDIxNCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPmhlbHA8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKzxoMSBhbGlnbj0ibGVmdCI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIiBzaXplPSI1Ij5DU1YgTG9nZ2VyIFZpZXc8L2ZvbnQ+PC9oMT4KKzxwIGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPlRoZSBjdXJyZW50IGRpc3RyaWJ1dGlvbiBvZiBTVEVNIHByb3ZpZGVzIHVzZXJzIHdpdGgKK3RoZSBhYmlsaXR5IHRvIG91dHB1dCBEaXNlYXNlIFN0YXRlIERhdGEgdG8gYSBjb21tYSBzZXBhcmF0ZWQgdmFyaWFibGUgKENTVikgCitmaWxlLiBUaGlzIGZ1bmN0aW9uIGlzIGVuYWJsZXMgdGhyb3VnaCBhIHZpZXcgY2FsbGVkIHRoZSBDU1YgTG9nZ2VyIFZpZXcuPGJyPgorJm5ic3A7PC9mb250PjxwIGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iIHNpemU9IjQiPjxiPjEpIExvYWRpbmcgdGhlIAorQ1NWIExvZ2dlciBWaWV3PC9iPjwvZm9udD48L3A+CisJPGZvbnQgRkFDRT0iSGVsdiI+CisJPHAgYWxpZ249ImxlZnQiPjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+VG8gbG9hZCBvciBhY3RpdmF0ZSB0aGUgQ1NWIAorCUxvZ2dlciBWaWV3LCZuYnNwOyBmaXJzdCBsYXVuY2gKKwkoYW5kIHJ1bikgc3RlbS4gT24gdGhlIHRvcCBtZW51IChTZWUgZmlndXJlIDEpIGJhciBjbGljayBvbiA8L2ZvbnQ+PC9wPgorCTxwIERJUj0iTFRSIiBhbGlnbj0ibGVmdCI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKwk8Yj4mbmJzcDsmZ3Q7d2luZG93Jmd0O290aGVyLi4uJmd0O0NTViBMb2dnZXI8L2I+PC9mb250PjwvcD4KKwk8L2ZvbnQ+CisJPHAgRElSPSJMVFIiIGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPlRoaXMgd2lsbCBvcGVuIGEgQ1NWIAorCUxvZ2dlciBUYWIgYXQgdGhlIGJvdHRvbSBvZiB5b3VyIFNpbXVsYXRpb24gUGVyc3BlY3RpdmUgKFNlZSBmaWd1cmUgMikuIDxicj4KKwlJbml0aWFsbHkgdGhlIHZpZXcgd2lsbCBiZSBibGFuayBiZWNhdXNlIHRoZXJlIGFyZSBubyBzY2VuYXJpb3MgYmVpbmcgCisJbG9nZ2VkLjwvZm9udD48L3A+CisJPGZvbnQgRkFDRT0iSGVsdiI+CisJPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHNwYWNpbmc9IjMiIHdpZHRoPSIyMSUiIGlkPSJ0YWJsZTUiIGJnY29sb3I9IiNDMEMwQzAiIGNlbGxwYWRkaW5nPSIzIj4KKwkJPHRyPgorCQkJPHRkPgorCQkJPHAgYWxpZ249ImxlZnQiPjxmb250IEZBQ0U9IlRpbWVzIE5ldyBSb21hbiI+CisJCQk8aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWcvY3N2MS5qcGciIHdpZHRoPSIyODAiIGhlaWdodD0iNDQ2Ij48L2ZvbnQ+PC90ZD4KKwkJCTx0ZD4KKwkJCTxwIGFsaWduPSJsZWZ0Ij4KKwk8Zm9udCBGQUNFPSJUaW1lcyBOZXcgUm9tYW4iPgorCQkJPGltZyBib3JkZXI9IjAiIHNyYz0iaW1nL2NzdjIuanBnIiB3aWR0aD0iNTEwIiBoZWlnaHQ9IjI1MCI+PC9mb250PjwvdGQ+CisJCTwvdHI+CisJCTx0cj4KKwkJCTx0ZCBiZ2NvbG9yPSIjRkZGRkZGIj48Zm9udCBGQUNFPSJUaW1lcyBOZXcgUm9tYW4iPgorCQkJPHAgYWxpZ249ImxlZnQiPjxiPkZpZ3VyZSAxOiBPcGVuaW5nIHRoZSBDU1YgTG9nZ2VyIFZpZXc8L2I+PC9mb250PjwvdGQ+CisJCQk8dGQgYmdjb2xvcj0iI0ZGRkZGRiI+CisJPGZvbnQgRkFDRT0iVGltZXMgTmV3IFJvbWFuIj4KKwkJCTxwIGFsaWduPSJsZWZ0Ij48Yj5GaWd1cmUgMjogU3RhcnRpbmcgYSBTY2VuYXJpbzwvYj48L2ZvbnQ+PC90ZD4KKwkJPC90cj4KKzwvdGFibGU+Cis8cCBESVI9IkxUUiIgYWxpZ249ImxlZnQiPiZuYnNwOzwvcD4KKwk8Zm9udCBGQUNFPSJUaW1lcyBOZXcgUm9tYW4iPgorCTxwIERJUj0iTFRSIiBhbGlnbj0ibGVmdCI+PGI+PGZvbnQgc2l6ZT0iNCI+MikgVGVzdGluZyB0aGUgTG9nZ2VyPC9mb250PjwvYj48L3A+CisJPHAgRElSPSJMVFIiIGFsaWduPSJsZWZ0Ij5UbyB1c2UgdGhlIGxvZ2dlciwgeW91IGZpcnN0IGhhdmUgdG8gYWN0aXZhdGUgbG9nZ2luZyBmcm9tIHRoZSBDU1YgTG9nZ2VyIHRhYi4gCisJQ2xpY2sgdGhlICdPbicgYnV0dG9uIGFuZCB0aGUgbmV4dCB0aW1lIGEgc2NlbmFyaW8gaXMgc3RhcnRlZCBkYXRhIHdpbGwgYmUgbG9nZ2VkLCBzZWUgZmlndXJlIDMuIDwvcD4KKwk8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMSIgd2lkdGg9IjQ5JSIgaWQ9InRhYmxlMiI+CisJCTx0cj4KKwkJCTx0ZD4KKwkJCTxwIGFsaWduPSJsZWZ0Ij4KKwkJCTxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9jc3YyXzUuanBnIiB3aWR0aD0iMTAwMCIgaGVpZ2h0PSI4MDAiPj48L3RkPgorCQk8L3RyPgorCQk8dHI+CisJCQk8dGQ+CisJCQk8cCBhbGlnbj0ibGVmdCI+PGI+RmlndXJlIDMuIEVuYWJsaW5nIExvZ2dpbmcgZnJvbSB0aGUgQ1NWIExvZ2dlciB0YWI8L2I+PC90ZD4KKwkJPC90cj4KKwk8L3RhYmxlPgorCTxwIERJUj0iTFRSIiBhbGlnbj0ibGVmdCI+TmV4dCB5b3UgcGljayB0aGUgc2NlbmFyaW8geW91IHdhbnQgdG8gbG9nLiAKKwlZb3UgY2FuIHBpY2sgZWl0aGVyIHlvdXIgb3duIHNjZW5hcmlvIG9yIGEgYnVpbHQgaW4gb25lLiAKKwlJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgd2UgdXNlIHRoZSBidWlsdCBpbiBzY2VuYXJpbyBmb3IgdGhlIAorCVBhbmRlbWljIERlbW8gaW4gVG9reW8sIEphcGFuLiA8L3A+Cis8cCBESVI9IkxUUiIgYWxpZ249ImxlZnQiPkdvIHRvIHRoZSBTY2VuYXJpb3MgVGFiIGluIGVpdGhlciB0aGUgU2ltdWxhdGlvbiBvciAKK0Rlc2lnbmVyIFBlcnNwZWN0aXZlIGFuZCBleHBhbmQgdGhlIFRhYnM8L3A+CisJPC9mb250PgorCTwvZm9udD4KKwk8cCBESVI9IkxUUiIgYWxpZ249ImxlZnQiPjxiPjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+LSZndDtTVEVNLSZndDtHZW9ncmFwaHktJmd0O1BvbGl0aWNhbC0mZ3Q7Q291bnRyeS0mZ3Q7SmFwYW48L2ZvbnQ+PC9iPjwvcD4KKwk8cCBESVI9IkxUUiIgYWxpZ249ImxlZnQiPjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+ZG91YmxlIGNsaWNrIG9uIHRoZSBidWlsdCBpbiBzY2VuYXJpbzxpPjxicj4KKwlQYW5kZW1pYyBEZW1vLCBUb2t5bywgSmFwYW4sIDIwMDA8YnI+CisJPC9pPnRvIHN0YXJ0IGl0LiAoU2VlIEZpZ3VyZSAyKS48L2ZvbnQ+PC9wPgorCTxmb250IEZBQ0U9IkhlbHYiPgorCTxwIGFsaWduPSJsZWZ0Ij4mbmJzcDs8L3A+CisJPC9mb250PgorCTxmb250IEZBQ0U9IlRpbWVzIE5ldyBSb21hbiI+CisJPHAgYWxpZ249ImxlZnQiPk9uY2UgeW91IGhhdmUgc3RhcnRlZCB0aGUgc2NlbmFyaW8sIGNsaWNrIG9uIHRoZSBDU1YgTG9nZ2VyIFRhYi4KKwlZb3Ugd2lsbCBub3RpY2UgdGhhdCB0aGUgdmlldyBub3cgZGlzcGxheXMgdGhlIHNjZW5hcmlvIGFuZCBkaXNlYXNlIGJlaW5nIGxvZ2dlZC4gCisJWW91IGNhbiBzdG9wIGxvZ2dpbmcgYXQgYW55IHRpbWUgYnkgc2VsZWN0aW5nIHRoZSAnT2ZmJyBidXR0b24gaW4gdGhlIENTViAKKwk8cCBkaXI9Imx0ciIgYWxpZ249ImxlZnQiPjxiPjxmb250IHNpemU9IjQiPjMpIFJlbWVtYmVyaW5nIFVzZXIgcHJlZmVyZW5jZXM8L2ZvbnQ+PC9iPjwvcD4KKzxwIGRpcj0ibHRyIiBhbGlnbj0ibGVmdCI+WW91ciBzZWxlY3Rpb25zLCBieSBzY2VuYXJpbywgd2lsbCBiZSByZW1lbWJlcmVkIAordGhlIHN5c3RlbSBwcmVmZXJlbmNlcyBmb3IgdGhlIENTViBMb2dnZXIgVmlldy4gVGhlIFNURU0gQ1NWIExvZ2dlciBWaWV3IAordXNlcyBFY2xpcHNlIERpYWxvZ1NldHRpbmdzIHRvIGF1dG9tYXRpY2FsbHkgcmVtZW1iZXIgdXNlciBwcmVmZXJlbmNlcy4gCitUaGlzIGZlYXR1cmUgaXMgYWx3YXlzIGVuYWJsZWQgYW5kIGJlZ2lucyBhcyBzb29uIGFzIHlvdSBlbmFibGUgYW55IHJlcG9ydCB2aWV3LiAKK1RoZSBwcmVmZXJlbmNlcyB0aGF0IGFyZSAicmVtZW1iZXJlZCIgYXJlIHRoZSBsb2dnZXIgc2V0dGluZyBmb3IgZWFjaCBzY2VuYXJpby4gCis8cCBkaXI9Imx0ciIgYWxpZ249ImxlZnQiPjxiPi4uLiBydW50aW1lLXN0ZW0ucHJvZHVjdFwubWV0YWRhdGFcLnBsdWdpbnNcb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnM8L2I+PC9wPgorPHAgZGlyPSJsdHIiIGFsaWduPSJsZWZ0Ij53aGVyZSB0aGUgZGlyZWN0b3J5IDxiPlxydW50aW1lLXN0ZW0ucHJvZHVjdDwvYj4gaXMgCitsb2NhdGVkIGluIHRoZSBzYW1lIHBhcmVudCBkaXJlY3RvcnkgYXMgdGhlIHVzZXJzIFNURU0gZWNsaXBzZSB3b3Jrc3BhY2UgKGZvciAKK2V4YW1wbGUgYzpccnVudGltZS1zdGVtLnByb2R1Y3QpLjwvcD4KKzxwIGRpcj0ibHRyIiBhbGlnbj0ibGVmdCI+UHJlZmVyZW5jZXMgZm9yIHRoZSBUaW1lIFNlcmllcyB2aWV3cyBhcmUgc3RvcmVkIGluIGEgCitmaWxlOjxicj4KKzxicj4KKzxiPkNTVkxvZ2dlcl9QcmVmZXJlbmNlcy50eHQ8L2I+PC9wPgorPHAgZGlyPSJsdHIiIGFsaWduPSJsZWZ0Ij5Zb3UgbmV2ZXIgbmVlZCB0byBlZGl0IHRoaXMgZmlsZSBkaXJlY3RseS4gT25jZSB5b3UgCitoYXZlIGRlc2lnbmF0ZWQgYSBzZXQgb2YgbG9jYXRpb25zIHRvIG1vbml0b3IgZm9yIHRoZSBsb2dnZXIsIHRoZXNlIHdpbGwgYWx3YXlzIAorYmUgdXNlZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgc2NlbmFyaW8uPGJyPgorSW4gPGI+RmlndXJlIDQ8L2I+IHdlIHNob3cgdGhlIGRpc2Vhc2UgdGhhdCBoYXMgYmVlbiBkZXNpZ25hdGVkIGZvciBsb2dnaW5nIGZvciB0aGUgCitKYXBhbiBzY2VuYXJpby48L3A+CisJPC9mb250PgorCTxwIGRpcj0ibHRyIiBhbGlnbj0ibGVmdCI+Jm5ic3A7PC9wPgorCTxmb250IEZBQ0U9IlRpbWVzIE5ldyBSb21hbiI+CisJPC9mb250PgorCTxwIGFsaWduPSJsZWZ0Ij4mbmJzcDs8L3A+CisJPGZvbnQgRkFDRT0iVGltZXMgTmV3IFJvbWFuIj4KKwk8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMSIgd2lkdGg9IjQ5JSIgaWQ9InRhYmxlMiI+CisJCTx0cj4KKwkJCTx0ZD4KKwkJCTxwIGFsaWduPSJsZWZ0Ij4KKwkJCTxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9jc3YzLmpwZyIgd2lkdGg9IjEwMDAiIGhlaWdodD0iODAwIj48L3RkPgorCQk8L3RyPgorCQk8dHI+CisJCQk8dGQ+CisJCQk8cCBhbGlnbj0ibGVmdCI+PGI+RmlndXJlIDQ6IExvZ2dpbmcgRGF0YSBmb3IgYSBTY2VuYXJpbzwvYj48L3RkPgorCQk8L3RyPgorCTwvdGFibGU+CisJPC9mb250PgorCTxwIGFsaWduPSJsZWZ0Ij4mbmJzcDs8L3A+CisJPC9mb250PgorCTxmb250IEZBQ0U9IlRpbWVzIE5ldyBSb21hbiIgc2l6ZT0iNCI+CisJPHAgYWxpZ249ImxlZnQiPjxiPjQpIERpcmVjdG9yeSBMb2NhdGlvbiBvZiBMb2dnZWQgRGF0YTwvYj48L3A+CisJPC9mb250PgorCTxmb250IEZBQ0U9IlRpbWVzIE5ldyBSb21hbiI+CisJPHAgYWxpZ249ImxlZnQiPlRoZSBEaXNlYXNlIFN0YXRlIGRhdGEgZm9yIGV2ZXJ5IGxvY2F0aW9uIG1vbml0b3JlZCBpcyBzdG9yZWQgCisJaW4gYSBzZXBhcmF0ZSBDb21tYSBTZXBhcmF0ZWQgVmFyaWFibGUgZmlsZS4gVGhlIGRhdGEgZGlyZWN0b3J5IChGaWd1cmUgNSkgCisJbWF5IGJlIGZvdW5kIHVuZGVyIHlvdXIgU1RFTSB3b3Jrc3BhY2UgZm9sZGVyIGFzIHN1YmZvbGRlciBvZiAKKwkiUmVjb3JkZWQgU2ltdWxhdGlvbnMiIGluIHlvdXIgcHJvamVjdCBmb2xkZXIuIEZvciBpbnN0YW5jZSwgaWYgeW91IGFyZSAKKwlsb2dnaW5nIGEgc2NlbmFyaW8gaW4gYSBwcm9qZWN0IGNhbGxlZCAiVmVybW9udCIsIHRoZSBsb2cgZmlsZXMgd2lsbCBiZSAKKwlmb3VuZCBpbiBhIHN1YmZvbGRlciB1bmRlciB0aGlzIGRpcmVjdG9yeTogPC9wPgorPHAgYWxpZ249ImxlZnQiPjxiPiZuYnNwOy4uLnJ1bnRpbWUtc3RlbS5wcm9kdWN0XFZlcm1vbnRcUmVjb3JkZWQgU2ltdWxhdGlvbnNcPC9iPjxicj4KKzxicj4KKzxwIGFsaWduPSJsZWZ0Ij5Gb3IgYnVpbHQtaW4gc2NlbmFyaW9zIHRoZSBsb2cgZmlsZXMgYXJlIGxvY2F0ZWQgdW5kZXIgdGhpcyAKK2ZvbGRlcjogIDwvcD4KKzxwIGFsaWduPSJsZWZ0Ij48Yj4mbmJzcDsuLi5ydW50aW1lLXN0ZW0ucHJvZHVjdFxCdWlsdEluU2NlbmFyaW9zXFJlY29yZGVkIFNpbXVsYXRpb25zXDwvYj48YnI+Cis8YnI+CitJdCBpcyBwb3NzaWJsZSB0byBydW4gbXVsdGlwbGUgc2NlbmFyaW9zIGluIFNURU0sIG9yIHRvIHNpbXVsdGFuZW91c2x5IHJ1biAKK21vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YgYSBnaXZlbiBzY2VuYXJpby4gTG9nZ2VkIGRhdGEgaXMgc3RvcmVkIGluIGEgZm9sZGVyIAord2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBzY2VuYXJpbyBqdXN0IHJ1biwgYnV0IHRoaXMgZm9sZGVyIGlzIHBsYWNlIGluIHR1cm4gCitpbiBhIHBhcmVudCBmb2xkZXIgbmFtZWQgYnkgdGhlIHN0YXJ0IHRpbWUgb2YgdGhlIHBhcnRpY3VsYXIgc2NlbmFyaW8gaW5zdGFuY2UuIAorVGhpcyB3YXksIGlmIHlvdSBydW4gdGhlIHNjZW5hcmlvIG1vcmUgdGhhbiBvbmNlIChmb3IgZXhhbXBsZSBhcyBhIGJhdGNoIHByb2Nlc3MgCit3aXRoIHNvbWUgcGFyYW1ldGVyIGNoYW5nZWQgZnJvbSBydW4gdG8gcnVuKSBubyBkYXRhIHdpbGwgYmUgYWNjaWRlbnRhbGx5IAorb3ZlcndyaXR0ZW4gYXMgZWFjaCBzY2VuYXJpbyB3aWxsIGhhdmUgYSB1bmlxdWUgdGltZSBzdGFtcC4gCitFYWNoIHNjZW5hcmlvIGZvbGRlciBpcyBmdXJ0aGVyIHN1YmRpdmlkZWQgaW50byBzdWJmb2xkZXJzLCBvbmUgZm9sZGVyIGZvciBlYWNoIAorZGlzZWFzZSAodGhlIGZvbGRlciBuYW1lIGlzIHRoZSBkaXNlYXNlIG5hbWUpIHRoYXQgaXMgcGFydCBvZiB0aGUgc2NlbmFyaW8gCisoU2VlIEZpZ3VyZSA1KS4gIDwvcD4KKwk8L2ZvbnQ+PGZvbnQgRkFDRT0iSGVsdiI+CisJPGZvbnQgRkFDRT0iVGltZXMgTmV3IFJvbWFuIj4KKwk8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMSIgd2lkdGg9IjI2JSIgaWQ9InRhYmxlMyI+CisJCTx0cj4KKwkJCTx0ZCBoZWlnaHQ9IjIyMyI+CisJCQk8cCBhbGlnbj0ibGVmdCI+CisJCQk8aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWcvY3N2NC5qcGciPjwvdGQ+CisJCTwvdHI+CisJCTx0cj4KKwkJCTx0ZD4KKwkJCTxwIGFsaWduPSJsZWZ0Ij48Yj5GaWd1cmUgNTogVGhlIGxvY2F0aW9uIChkaXJlY3RvcnkpIHdoZXJlIGZpbGVzIAorCQkJYXJlIHN0b3JlZC48L2I+PC90ZD4KKwkJPC90cj4KKwk8L3RhYmxlPgorCTwvZm9udD4KKwk8cCBhbGlnbj0ibGVmdCI+CisJPGZvbnQgRkFDRT0iVGltZXMgTmV3IFJvbWFuIiBzaXplPSI0Ij4KKwk8Yj41KSBDU1YgTG9nZ2VkIERhdGEgRmlsZXM8L2I+PC9mb250PjwvcD4KKwk8L2ZvbnQ+CisJPGZvbnQgRkFDRT0iVGltZXMgTmV3IFJvbWFuIj4KKwk8cCBhbGlnbj0ibGVmdCI+SW4gRmlndXJlIDYgd2Ugc2hvdyB0aGUgcGFydGljdWxhciBkYXRhIGZpbGVzIHdyaXR0ZW4gYnkgdGhlIAorCWxvZ2dlciBmb3IgdGhlIFBhbmRlbWljIERlbW8gZGlzZWFzZS4gU2VwYXJhdGUgQ1NWIGZpbGVzICh3aXRoIGV4dGVuc2lvbiAuY3N2KSAKKwlhcmUgY3JlYXRlZCBmb3IgZWFjaCBkaXNlYXNlIHN0YXRlIG1vZGVsZWQgYnkgdGhlIGRpc2Vhc2UuIFRoZXNlIGFyZSBuYW1lZCAKKwl1c2luZyB0aGUgSUQgb2YgdGhlIHN0YXRlIChlLmcuIFMsIEUsIEkgb3IgUikgZm9sbG93ZWQgYnkgYW4gdW5kZXJzY29yZSAKKwkoXykgZm9sbG93ZWQgYnkgYSBudW1iZXIuIFRoZSBudW1iZXIgaW5kaWNhdGVzIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBsb2NhdGlvbnMgCisJc3RvcmVkIGluIHRoZSBmaWxlLiBGb3IgaW5zdGFuY2UsIDMgbWVhbnMgZ2VvZ3JhcGhpY2FsIGFkbWluaXN0cmF0aW9uIAorCWxldmVsIDMsIGkuZS4gVVMgY2l0aWVzLiBBIHNlY29uZCBmaWxlIChydW5wYXJhbWV0ZXJzLmNzdikgaXMgYWxzbyBnZW5lcmF0ZWQuIAorCVRoaXMgd2lsbCBjb250YWluIGRhdGEgYWJvdXQgdGhlIHJ1biBwYXJhbWV0ZXJzIGZvciBlYWNoIGRpc2Vhc2UuPC9wPgorCTwvZm9udD4KKwk8Zm9udCBGQUNFPSJIZWx2Ij4KKwk8Zm9udCBGQUNFPSJUaW1lcyBOZXcgUm9tYW4iPgorCTx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIxIiB3aWR0aD0iNDklIiBpZD0idGFibGU0Ij4KKwkJPHRyPgorCQkJPHRkPgorCQkJPHAgYWxpZ249ImxlZnQiPgorCQkJPGltZyBib3JkZXI9IjAiIHNyYz0iaW1nL2NzdjUuanBnIj48L3RkPgorCQk8L3RyPgorCQk8dHI+CisJCQk8dGQ+CisJCQk8cCBhbGlnbj0ibGVmdCI+PGI+RmlndXJlIDY6ICBJbmRpdmlkdWFsIExvZyBGaWxlcy4gVGhlc2UgYXJlIGNyZWF0ZWQgCisJCQlmb3IgZWFjaCBsb2NhdGlvbiBvciBub2RlIG1vbml0b3JlZC4gQW5vdGhlciBmaWxlIGNvbnRhaW5zIHRoZSAKKwkJCXBhcmFtZXRlcnMgcnVuIGZvciB0aGUgc2NlbmFyaW8gaW4gcXVlc3Rpb24uPC9iPjwvdGQ+CisJCTwvdHI+CisJPC90YWJsZT4KKwk8L2ZvbnQ+CisJPC9mb250PgorPHAgYWxpZ249ImxlZnQiPkVhY2ggb2YgdGhlIGRhdGEgZmlsZXMgZm9yIG1vbml0b3JlZCBub2RlcyBjb250YWlucyBjb21tYSAKK3NlcGFyYXRlZCBkYXRhLiBUaGUgc3BlY2lmaWMgY29sdW1ucyBpbiB0aGUgZmlsZSByZXByZXNlbnRzIHRoZSBsb2NhdGlvbnMgCitiZWluZyBsb2dnZWQuIEZvciBleGFtcGxlLCBmb3IgdGhlIEphcGFuIHNjZW5hcmlvIHRoZSBmaWxlIFNfMS5jc3YgaGFzIHRoZSAKK2NvbHVtbnM6IDwvcD4KKzxwIGFsaWduPSJsZWZ0Ij48Yj4mbmJzcDtpdGVyYXRpb24sdGltZSxKUC1LWVUsSlAtS05ULEpQLTAsSlAtQ0hCLEpQLVRBSSxKUC1DSEcsSlAtU0tPLEpQLUhSSSxKUC1UT0gsSlAtS0lOLEpQLVJZVQorPC9iPjwvcD4KKzxwIGFsaWduPSJsZWZ0Ij5BIGRhdGEgc2FtcGxlIGlzIHNob3duIGluIEZpZ3VyZSA3LjwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSI2NCUiIGlkPSJ0YWJsZTYiPgorCTx0cj4KKwkJPHRkPjEsRnJpJm5ic3A7MTAmbmJzcDtPY3QmbmJzcDswOCw1NjAwNDIuMCwyNDUyNDAuNDU0NjYyMDc3NjIsNTYyNzQyNC4wLDc5NTY0Ljg2NjY0NTM2MzEzLDc5MzMyLjAsMTEwMTQwLjA8YnIvPgorMixTdW4mbmJzcDsxMiZuYnNwO09jdCZuYnNwOzA4LDU2MDA0Mi4wLDIzMjQyNy41NzUyMzUxNDk0Miw1NjI3NDI0LjAsNzk1MTkuMTE5OTg1NDQ2NzcsNzkzMzEuOTM0OTUwNjg3NzIsMTEwMTQwLjA8YnIvPgorMyxUdWUmbmJzcDsxNCZuYnNwO09jdCZuYnNwOzA4LDU2MDA0Mi4wLDE5ODMxOC42MzQ0NjYwNjk3NSw1NjI3NDI0LjAsNzcxNjYuNDk0NTk5MzgzMzIsNzkzMjYuNDQ1NzYwMDc1MDgsMTEwMTQwLjAsMTE1Mjg0LjA8YnIvPgorNCxUaHUmbmJzcDsxNiZuYnNwO09jdCZuYnNwOzA4LDU2MDA0Mi4wLDEwNDA0Ni45Nzk4ODc3NzM4LDU2Mjc0MjQuMCw2MDA0OS45NTcwNDQwNjQ4MjQsNzg3NjEuMjQzMTYxOTY1MjgsMTEwMTQwLjAsMTE1Mjg0LjAgPGJyLz48L3RkPgorCTwvdHI+CisJPHRyPgorCQk8dGQ+PGI+PGZvbnQgc2l6ZT0iNCI+RmlndXJlIDc6IFNhbXBsZSBkYXRhIGZyb20gYSBDU1YgTG9nIEZpbGU8L2ZvbnQ+PC9iPjwvdGQ+CisJPC90cj4KKzwvdGFibGU+Cis8cCBhbGlnbj0ibGVmdCI+Jm5ic3A7PC9wPgorPHAgYWxpZ249ImxlZnQiPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9kZWNvcmF0b3Jzdmlldy5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9kZWNvcmF0b3Jzdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMjJiMTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2RlY29yYXRvcnN2aWV3Lmh0bWwKQEAgLTAsMCArMSwyNCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPkRlY29yYXRvcnMgVmlldzwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGgxPkRlY29yYXRvcnMgVmlldzwvaDE+Cis8cD5UaGUgPGVtPkRlY29yYXRvcnMgVmlldzwvZW0+IGRpc3BsYXlzIHRoZSA8YQorCWhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjZGVjb3JhdG9yIj4gRGVjb3JhdG9yczwvYT4KK3RoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdXNlIGluIDxhCisJaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNzY2VuYXJpbyI+IFNjZW5hcmlvczwvYT4uCitUaGUgYXZhaWxhYmxlIDxhIGhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjZGVjb3JhdG9yIj4KK0RlY29yYXRvcnM8L2E+IGFyZSBvcmdhbml6ZWQgaW4gYSB0cmVlLiBUaG9zZSBsaXN0ZWQgdW5kZXIgIlNURU0iIGFyZQorYnVpbHQtaW4gdG8gU1RFTS48L3A+Cis8cD5UaGUgdmlldyBzdXBwb3J0cyAiZHJhZyIgc3VjaCB0aGF0IGEgPGEKKwlocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI2RlY29yYXRvciI+IERlY29yYXRvcjwvYT4KK2NhbiBiZSBkcmFnZ2VkIGZyb20gdGhpcyB2aWV3IGFuZCAiZHJvcHBlZCIgaW50byBhbiBvcGVuIDxhCisJaHJlZj0iLi4vZWRpdG9ycy9tb2RlbGVkaXRvci5odG1sIj5Nb2RlbCBlZGl0b3I8L2E+LiA8L3A+Cis8aW1nIHNyYz0iaW1nL2RlY29yYXRvcnN2aWV3LmpwZyIgLz4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvZGlzZWFzZXN2aWV3Lmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2Rpc2Vhc2Vzdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllM2EyZjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2Rpc2Vhc2Vzdmlldy5odG1sCkBAIC0wLDAgKzEsMTIgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkRpc2Vhc2VzIFZpZXc8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+RGlzZWFzZXMgVmlldzwvaDE+Cis8cD5UaGUgPGVtPkRpc2Vhc2VzIFZpZXc8L2VtPiBsaXN0cyB0aGUgRGlzZWFzZXMgdGhhdCBhcmUgYnVpbHQtaW4gdG8gU1RFTS48L3A+Cis8aW1nIHNyYz0iaW1nL2Rpc2Vhc2Vzdmlldy5qcGciIC8+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9kdWJsaW5jb3JlcG9wdXAuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvZHVibGluY29yZXBvcHVwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3MDliMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvZHVibGluY29yZXBvcHVwLmh0bWwKQEAgLTAsMCArMSwzNiBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+RHVibGluIENvcmUgUG9wLXVwPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPkR1YmxpbiBDb3JlIFBvcC11cDwvaDE+Cis8cD5UaGUgdmlld3MgdGhhdCBsaXN0IFNpbXVsYXRpb24gY29tcG9uZW50cyAoPGEKKwlocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI2RlY29yYXRvciI+IERlY29yYXRvcnM8L2E+LAorPGEgaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNncmFwaCI+IEdyYXBoczwvYT4sIDxhCisJaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNtb2RlbCI+IE1vZGVsczwvYT4sIDxhCisJaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNzY2VuYXJpbyI+IFNjZW5hcmlvczwvYT4KK2FuZCA8YSBocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI3NlcXVlbmNlciI+CitTZXF1ZW5jZXJzPC9hPikgc3VwcG9ydCBhbiBpbnN0YW50ICJwb3AtdXAiIGRpc3BsYXkgb2YgdGhlIDxhCisJaHJlZj0iaHR0cDovL2R1YmxpbmNvcmUub3JnLyI+RHVibGluIENvcmU8L2E+IG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aAordGhlIGNvbXBvbmVudHMgZGlzcGxheWVkIGluIHRoZSB2aWV3LiBUaGlzIHRha2VzIHRoZSBmb3JtIG9mIGEgc21hbGwKK3dpbmRvdyB0aGF0IGlzIGFjdGl2YXRlZCB3aGVuIHRoZSBtb3VzZSBzdG9wcyBhbmQgImhvdmVycyIgb3ZlciBvbmUgb2YKK3RoZSBjb21wb25lbnRzLiBUaGUgd2luZG93IHByZXNlbnRzIGEgc2hvcnQgc3VtbWFyeSBvZiB0aGUgbWV0YWRhdGEgYXMKK2lsbHVzdHJhdGVkIGluIHRoZSBpbWFnZXMgYmVsb3cuPC9wPgorCis8cD5UaGUgbWV0YWRhdGEgcG9wLXVwIGluIHRoZSA8YSBocmVmPSJzY2VuYXJpb3ZpZXcuaHRtbCI+U2NlbmFyaW9zCit2aWV3PC9hPi4gVGhlIGZpcnN0IGxpbmUgaXMgdGhlIHRpdGxlIG9mIHRoZSA8YQorCWhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjc2NlbmFyaW8iPiBTY2VuYXJpbzwvYT4sCit0aGUgc2Vjb25kIGxpbmUgKCJkYWZvcmQiKSBpcyB0aGUgbmFtZSBvZiB0aGUgImNyZWF0b3IiIG9mIHRoZSA8YQorCWhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjc2NlbmFyaW8iPiBTY2VuYXJpbzwvYT4uCitUaGUgdGhpcmQgbGluZSBpcyB0aGUgZGF0ZSByYW5nZSBzcGVjaWZpZWQgZm9yIHRoZSA8YQorCWhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjc2NlbmFyaW8iPiBTY2VuYXJpbzwvYT4uCitUaGUgbGFzdCBsaW5lICgiSUJNIikgaXMgdGhlIG5hbWUgb2YgdGhlICJwdWJsaXNoZXIiLiA8aW1nCisJc3JjPSJpbWcvZGNzY2VuYXJpb3Nwb3B1cC5qcGciIC8+PC9wPgorCis8cD5UaGUgbWV0YWRhdGEgcG9wLXVwIGluIHRoZSA8YSBocmVmPSJtb2RlbHN2aWV3Lmh0bWwiPk1vZGVscwordmlldzwvYT48L3A+Cis8aW1nIHNyYz0iaW1nL2RjbW9kZWxzcG9wdXAuanBnIiAvPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvZXBpZGVtaWN2aWV3Lmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2VwaWRlbWljdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0Y2ZmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2VwaWRlbWljdmlldy5odG1sCkBAIC0wLDAgKzEsNjEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+CisKKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5oZWxwPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8aDE+RXBpZGVtaWMgVmlldzwvaDE+Cis8cD5UaGUgPGVtPkVwaWRlbWljIFZpZXc8L2VtPiBkaXNwbGF5cyBhIGR5bmFtaWMgY29sbGVjdGlvbiBvZgorInNpbXVsYXRpb24gY29udHJvbHMiIHRoYXQgbWF0Y2ggdGhlIHNldCBvZiAiYWN0aXZlIiBTaW11bGF0aW9ucy4gRWFjaAorY29udHJvbCBzaG93cyB0aGUgbmFtZSBvZiB0aGUgU2NlbmFyaW8gYW5kIHRoYXQgc3RhdHVzIG9mIHRoZQorU2ltdWxhdGlvbiwgaW5jbHVkaW5nIGl0cyAic3RhdGUiIChlaXRoZXIgIlJ1bm5pbmciIG9yICJQYXVzZWQiKSwgdGhlCitjdXJyZW50ICJ0aW1lIiBpbiB0aGUgc2ltdWxhdGlvbiwgYSBwcm9ncmVzcyBiYXIuIEVhY2ggY29udHJvbCBhbHNvIGhhcworZml2ZSBidXR0b25zIHRoYXQgY29udHJvbCB0aGUgY29ycmVzcG9uZGluZyBTaW11bGF0aW9uOgorPG9sPgorCTxsaT4iUnVuIiBCZWdpbiBydW5uaW5nIHRoZSBTaW11bGF0aW9uLjwvbGk+CisJPGxpPiJQYXVzZSIgUGF1c2UgdGhlIHJ1bm5pbmcgb2YgdGhlIFNpbXVsYXRpb24uIFRoaXMgbWFpbnRhaW5zCisJdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNpbXVsYXRpb24uPC9saT4KKwk8bGk+IlJlc2V0IiBSZXNldCBhbGwgc3RhdGUgaW5mb3JtYXRpb24gaW4gdGhlIFNpbXVsYXRpb24gYmFjayB0bworCWluaXRpYWwgdmFsdWVzIGFuZCBzZXQgdGhlIHN0YXRlIG9mIHRoZSBTaW11bGF0aW9uIHRvICJQYXVzZWQiPC9saT4KKwk8bGk+IlN0ZXAiIFJ1biB0aGUgc2ltdWxhdGlvbiBmb3IgYSBzaW5nbGUgY3ljbGUgYW5kIHRoZW4gc2V0IHRoZQorCXN0YXRlIG9mIHRoZSBTaW11bGF0aW9uIHRvICJQYXVzZWQiPC9saT4KKwk8bGk+IlN0b3AiIFN0b3AgYWxsIGV4ZWN1dGlvbiBvZiB0aGUgU2ltdWxhdGlvbiBhbmQgZGVzdHJveSBhbGwKKwlzdGF0ZSBpbmZvcm1hdGlvbi4gVGhlIFNpbXVsYXRpb24gd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS48L2xpPgorPC9vbD4KKzwvcD4KKyZuYnNwOzxwPlRvIHVzZSB0aGUgRXBpZGVtaWMgdmlldzo8b2w+CisJPGxpPkVudGVyIHRoZSA8YSBocmVmPSIuLi9wZXJzcGVjdGl2ZXMvYW5hbHlzaXMuaHRtbCI+QW5hbHlzaXMgUGVyc3BlY3RpdmU8L2E+PC9saT4KKwk8bGk+Q2xpY2sgb24gdGhlIEVwaWRlbWljIFRhYjwvbGk+CisJPGxpPlVzZSB0aGUgU2VsZWN0IEZvbGRlciBidXR0b24gdG8gY2hvc2UgdGhlIGZvbGRlciBjb250YWluaW5nIHRoZSBlcGlkZW1pYyBkYXRhIAorCXlvdSB3aXNoIHRvIHN0dWR5LiBUaGUgZmlsZXMgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZworCTxhIGhyZWY9ImNzdmxvZ2dlcnZpZXcuaHRtbCI+Jm5ic3A7Zm9ybWF0LjwvYT48L2xpPgorCTxsaT5DbGljayBBZ2dyZWdhdGUgRGF0YS4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIHR3byBhZ2dyZWdhdGVkIGRhdGEgCisJZmlsZXMgYmFzZWQgb24gdGhlIGRhdGEgaW4gdGhlIG9yaWdpbmFsIHNjZW5hcmlvIGZvbGRlci4gVGhlc2UgZmlsZSBuYW1lcyAKKwl3aWxsIGFwcGVhciBpbiB0aGU8YnI+CisJdGV4dCBmaWVsZHMgZm9yIFNjZW5hcmlvIEFnZ3JlZ2F0ZSBGaWxlIGFuZCBTY2VuYXJpbyBJbmNpZGVuY2UgZmlsZS4mbmJzcDsgCisJVGhlIGFnZ3JlZ2F0ZWQgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlICdhZ2dyZWdhdGUnIGFuZCAnaW5jaWRlbmNlJyAKKwlzdWJmb2xkZXJzIHJlc3BlY3RpdmVseSA8YnI+CisJKHRoZXNlIHdpbGwgYmUgY3JlYXRlZCBpZiB0aGV5IGRvIG5vdCBleGlzdCkuIFRoZSBmaWxlcyB3aWxsIGJlIG5hbWVkIGJhc2VkIAorCW9uIHRoZSBpbnB1dCBzY2VuYXJpbyBmb2xkZXIuIFRoZSBhZ2dyZWdhdGUgZGF0YSBpcyB0aGUgcnVubmluZyBpbnRlZ3JhbCBvciAKKwlzdW0gb3ZlciB0aW1lIDxicj4KKwlvZiBhbGwgY29tcGFydG1lbnQgZGF0YSAoUyxFLEksUikgb3ZlciBhbGwgbG9jYXRpb25zIGluIHRoZSBpbnB1dCBzY2VuYXJpbyAKKwlmb2xkZXIuIFRoZSBpbmNpZGVuY2UgZGF0YSBjb250YWlucyBkaWZmZXJlbnRpYWwgZGF0YSBpbmNsdWRpbmcgaW5jaWRlbmNlIAorCShuZXcgY2FzZXMgYXQgdGltZSB0KSwgPGJyPgorCW5ldyBiaXJ0aHMsIGRlYXRocywgZXRjLiBJbmNpZGVuY2UgZGF0YSB3aWxsIGJlIGVzdGltYXRlZCBpZiBpdCBkb2VzIG5vdCAKKwlleGlzdCBpbiB0aGUgb3JpZ2luYWwgc2NlbmFyaW8gZGF0YSBmaWxlcy4gTm90ZSwgaWYgeW91IGFscmVhZHkgaGF2ZSAKKwlhZ2dyZWdhdGUgZGF0YSB5b3UgY2FuIGFsc28gaW5wdXQ8YnI+CisJdGhlc2UgZmlsZXMgbWFudWFsbHkuPC9saT4KKwk8bGk+T24gdGhlIGxlZnQgaGFuZCBzaWRlIHRoZSBFcGlkZW1pYyB2aWV3IHdpbGwgc2hvdyB0aGUgaW50ZWdyYXRlZCBzdGF0ZSAKKwlkYXRhIChTLEUsSSxSLCBldGMpLiBEaWZmZXJlbnRpYWwgZGF0YSB3aWxsIGFwcGVhciBvbiB0aGUgcmlnaHQgaGFuZCBjaGFydC4gCisJVG8gdG9nZ2xlIGJldHdlZW4gbGluZWFyPGJyPgorCWFuZCBsb2dhcml0aG1pYyBzY2FsZXMgb3IgdG8gY2hhbmdlIHdoYXQgdmFyaWFibGVzIGFyZSBwbG90dGVkIGp1c3QgcmlnaHQgCisJY2xpY2sgYW5kIHVzZSB0aGUgY3VzdG9tIGRpYWxvZyB0aGF0IHdpbGwgYXBwZWFyLiA8L2xpPgorPC9vbD4KKzxwPiZuYnNwOzwvcD4KKzxwPiZuYnNwOzwvcD4KKzxwPjxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9FcGlkZW1pYy5qcGciIHdpZHRoPSIxMDAwIiBoZWlnaHQ9IjgwMCI+IDwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvZXJyb3JfbG9nLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2Vycm9yX2xvZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNGI1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2Vycm9yX2xvZy5odG1sCkBAIC0wLDAgKzEsODEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCisiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FcnJvciBMb2c8L3RpdGxlPgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IgorCXNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvbGl2ZWhlbHAuanMiPjwvc2NyaXB0PgorPGxpbmsgaHJlZj0iLi4vLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKzwhLS0KKy5zdHlsZTEgeworCWZvbnQtc2l6ZTogMThweDsKKwlmb250LXdlaWdodDogYm9sZDsKK30KKy5zdHlsZTIgeworCWZvbnQtc2l6ZTogMTJwdDsKKwlmb250LXdlaWdodDogYm9sZDsKK30KKy0tPgorPC9zdHlsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8cCBjbGFzcz0ic3R5bGUxIj5FcnJvciBMb2cgVmlldzwvcD4KKzxwPlRoZSA8ZW0+RXJyb3IgTG9nIFZpZXc8L2VtPiBjYXB0dXJlcyBhbGwgdGhlIHdhcm5pbmdzIGFuZAorZXJyb3JzIGxvZ2dlZCBieSBwbHVnLWlucy4gVGhlIHVuZGVybHlpbmcgbG9nIGZpbGUgaXMgYSA8ZW0+LmxvZzwvZW0+CitmaWxlIHN0b3JlZCBpbiB0aGUgPGVtPi5tZXRhZGF0YTwvZW0+IHN1YmRpcmVjdG9yeSBvZiB0aGUgd29ya3NwYWNlLiBUaGU8c3Ryb25nPgorPC9zdHJvbmc+dmlldyBpcyBhdmFpbGFibGUgdW5kZXIgPGEgY2xhc3M9ImNvbW1hbmQtbGluayIKKwlocmVmPSdqYXZhc2NyaXB0OmV4ZWN1dGVDb21tYW5kKCJvcmcuZWNsaXBzZS51aS52aWV3cy5zaG93VmlldyhvcmcuZWNsaXBzZS51aS52aWV3cy5zaG93Vmlldy52aWV3SWQ9b3JnLmVjbGlwc2UucGRlLnJ1bnRpbWUuTG9nVmlldykiKSc+Cis8aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyI+IDxzdHJvbmc+V2luZG93CismZ3Q7IFNob3cgVmlldyAmZ3Q7IEVycm9yIExvZzwvc3Ryb25nPiA8L2E+LjwvcD4KKzxwPjxpbWcgc3JjPSJpbWcvZXJyb3JfbG9nLnBuZyIgYWx0PSJFcnJvciBMb2ciCisJaHNwYWNlPSIzMCI+PC9wPgorPHA+Jm5ic3A7PC9wPgorPHAgY2xhc3M9InN0eWxlMiI+RXZlbnQgU29ydGluZzwvcD4KKzxwPkV2ZW50cyBpbiB0aGUgbG9nIHZpZXcgY2FuIGJlIHNvcnRlZCBieSA8c3Ryb25nPk1lc3NhZ2U8L3N0cm9uZz4sCis8c3Ryb25nPlBsdWctaW4gSUQ8L3N0cm9uZz4gb3IgPHN0cm9uZz5EYXRlPC9zdHJvbmc+IGluIGFzY2VuZGluZyBvcgorZGVzY2VuZGluZyBvcmRlci4gU2ltcGx5IGNsaWNrIG9uIHRoZSBjb2x1bW4gaGVhZGVyIHRoYXQgeW91IHdhbnQgdGhlCitzb3J0aW5nIHRvIGJlIGJhc2VkIG9uLiBUaGUgZG93biBhcnJvdyBpbiB0aGUgY29sdW1uIGhlYWRlciBpbmRpY2F0ZXMKK2Rlc2NlbmRpbmcgb3JkZXI7IHdoaWxlLCB0aGUgdXAgYXJyb3cgaW5kaWNhdGVzIGFuIGFzY2VuZGluZyBvcmRlci48L3A+Cis8cD4mbmJzcDs8L3A+Cis8cCBjbGFzcz0ic3R5bGUyIj5FdmVudCBGaWx0ZXJpbmc8L3A+Cis8cD5Zb3UgY2FuIGZpbHRlciB0aGUgdmlldyB0byBzaG93IGV2ZW50cyBvZiBhIHBhcnRpY3VsYXIgdHlwZSBvcgorc2Vzc2lvbi4gQWxzbywgeW91IGNhbiBsaW1pdCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHZpZXcuCitGaWx0ZXJpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHVuZGVyIDxzdHJvbmc+RmlsdGVycy4uLjwvc3Ryb25nPiBmcm9tCit0aGUgdmlldydzIHRvb2xiYXIgZHJvcCBkb3duIG1lbnUuPC9wPgorPHA+Jm5ic3A7PC9wPgorPHAgY2xhc3M9InN0eWxlMiI+SW1wb3J0IGFuZCBFeHBvcnQgTG9nczwvcD4KKzxwPlRvIDxzdHJvbmc+aW1wb3J0PC9zdHJvbmc+IGFuIGFyYml0cmFyeSA8ZW0+LmxvZzwvZW0+IGZpbGUgaW50bwordGhlIHZpZXcsIHByZXNzIHRoZSA8c3Ryb25nPkltcG9ydCBMb2c8L3N0cm9uZz4gdG9vbGJhciBidXR0b24gb3Igc2VsZWN0Cis8c3Ryb25nPkltcG9ydCBMb2cuLi48L3N0cm9uZz4gZnJvbSB0aGUgY29udGV4dCBtZW51LiBUaGVuLCBjaG9vc2UgYSA8ZW0+LmxvZzwvZW0+CitmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtLjwvcD4KKzxwPlRvIDxzdHJvbmc+ZXhwb3J0PC9zdHJvbmc+IHRoZSBjdXJyZW50IGxvZyB2aWV3IGNvbnRlbnQgaW50byBhCitmaWxlLCBwcmVzcyB0aGUgPHN0cm9uZz5FeHBvcnQgTG9nPC9zdHJvbmc+IHRvb2xiYXIgYnV0dG9uIG9yIHNlbGVjdCA8c3Ryb25nPkV4cG9ydAorTG9nLi4uPC9zdHJvbmc+IGZyb20gdGhlIGNvbnRleHQgbWVudS4gVGhlbiwgZW50ZXIgYSBmaWxlIG5hbWUuPC9wPgorPHA+Jm5ic3A7PC9wPgorPHAgY2xhc3M9InN0eWxlMiI+Q2xlYXIgYW5kIERlbGV0ZSBMb2dzPC9wPgorPHA+VG8gPHN0cm9uZz5jbGVhcjwvc3Ryb25nPiB0aGUgdmlldyBsb2cgY29udGVudCB3aXRob3V0IGRlbGV0aW5nCit0aGUgdW5kZXJseWluZyA8ZW0+LmxvZzwvZW0+IGZpbGUsIHByZXNzIHRoZSA8c3Ryb25nPkNsZWFyIExvZzwvc3Ryb25nPgordG9vbGJhciBidXR0b24gb3Igc2VsZWN0IDxzdHJvbmc+Q2xlYXIgTG9nIFZpZXdlcjwvc3Ryb25nPiBmcm9tIHRoZQorY29udGV4dCBtZW51LjwvcD4KKzxwPlRvIHBlcm1hbmVudGx5IDxzdHJvbmc+ZGVsZXRlPC9zdHJvbmc+IHRoZSB1bmRlcmx5aW5nIDxlbT4ubG9nPC9lbT4KK2ZpbGUsIHByZXNzIHRoZSA8c3Ryb25nPkRlbGV0ZSBMb2c8L3N0cm9uZz4gdG9vbGJhciBidXR0b24gb3Igc2VsZWN0IDxzdHJvbmc+RGVsZXRlCitMb2c8L3N0cm9uZz4gZnJvbSB0aGUgY29udGV4dCBtZW51LjwvcD4KKzxwPiZuYnNwOzwvcD4KKzxwIGNsYXNzPSJzdHlsZTIiPkV2ZW50IERldGFpbHM8L3A+Cis8cD5GdWxsIGRldGFpbHMgYWJvdXQgYSBwYXJ0aWN1bGFyIGV2ZW50IGNhbiBiZSB2aWV3ZWQgaW4gdGhlIDxzdHJvbmc+RXZlbnQKK0RldGFpbHM8L3N0cm9uZz4gZGlhbG9nIGJ5IGRvdWJsZS1jbGlja2luZyBvbiBhIHBhcnRpY3VsYXIgZW50cnkgb3Igc2VsZWN0aW5nIDxzdHJvbmc+RXZlbnQKK0RldGFpbHM8L3N0cm9uZz4gZnJvbSB0aGUgY29udGV4dCBtZW51IG9mIHRoYXQgZW50cnkuIFlvdSBjYW4gdmlldyB0aGUgPHN0cm9uZz5EYXRlPC9zdHJvbmc+LAorPHN0cm9uZz5TZXZlcml0eTwvc3Ryb25nPiwgPHN0cm9uZz5NZXNzYWdlPC9zdHJvbmc+LCA8c3Ryb25nPkV4Y2VwdGlvbgorU3RhY2sgVHJhY2U8L3N0cm9uZz4gKGlmIGF2YWlsYWJsZSkgYW5kIDxzdHJvbmc+U2Vzc2lvbiBEYXRhPC9zdHJvbmc+IG9mIGVhY2gKK2V2ZW50LjwvcD4KKzxwPllvdSBjYW4gbmF2aWdhdGUgZnJvbSBvbmUgZW50cnkgdG8gdGhlIG5leHQgdmlhIHRoZSA8c3Ryb25nPlVwPC9zdHJvbmc+CithbmQgPHN0cm9uZz5Eb3duPC9zdHJvbmc+IGFycm93IGJ1dHRvbnMuPC9wPgorPHA+VG8gY29weSB0aGUgZXJyb3IgdG8gdGhlIGNsaXBib2FyZCwgcHJlc3MgdGhlIGJ1dHRvbiB3aXRoIHRoZQorY2xpcGJvYXJkIGltYWdlLjwvcD4KKzxwPiZuYnNwOzwvcD4KKzxwPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvZXN0aW1hdG9ydmlldy5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9lc3RpbWF0b3J2aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3OTI5OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvZXN0aW1hdG9ydmlldy5odG1sCkBAIC0wLDAgKzEsNDYgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+CisKKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5oZWxwPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8aDE+RXN0aW1hdG9yIFZpZXc8L2gxPgorPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9InBhZ2UtYnJlYWstYWZ0ZXI6IGF2b2lkOyB0ZXh0LWF1dG9zcGFjZTogbm9uZTsgbWFyZ2luLWxlZnQ6IC43NXB0Ij4KKzxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2NvbG9yOmJsYWNrIj5Nb2RlbCBQYXJhbWV0ZXIgRXN0aW1hdGlvbjwvc3Bhbj4KKzwvYj48L3A+Cis8cD5UaGUgPGVtPkVzdGltYXRvciBWaWV3PC9lbT4gYWxsb3dzIGEgdXNlciB0byBlc3RpbWF0ZSBwYXJhbWV0ZXIgZm9yIGEgKG5ldykgbW9kZWwgYmFzZWQgb24gZXhpc3RpbmcgCitkYXRhLiZuYnNwOyBBbGdvcml0aG1zIGFyZSBub3cgY29tcGxldGUgZm9yIHBhcmFtZXRlciBFc3RpbWF0aW9uIHVzaW5nIFNJLCBTSVIsIAorYW5kIFNFSVIgbW9kZWxzLiA8L3NwYW4+Cis8b2w+CisJPGxpPkVudGVyIHRoZSA8YSBocmVmPSIuLi9wZXJzcGVjdGl2ZXMvYW5hbHlzaXMuaHRtbCI+QW5hbHlzaXMgUGVyc3BlY3RpdmU8L2E+PC9saT4KKwk8bGk+Q2xpY2sgb24gdGhlIEVzdGltYXRvciBUYWI8L2xpPgorCTxsaT5DbGljayBvbiB0aGUgJnF1b3Q7U2VsZWN0JnF1b3Q7IGJ1dHRvbiB0byBjaG9zZSB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIAorCWRhdGEgZmlsZXMgeW91IHdpc2ggdG8gYW5hbHl6ZS4gVGhlc2UgZmlsZXMgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZworCTxhIGhyZWY9ImNzdmxvZ2dlcnZpZXcuaHRtbCI+Jm5ic3A7Zm9ybWF0LjwvYT48L2xpPgorCTxsaT5BIGRpYWxvZyB3aWxsIGxhdW5jaCBhbGxvd2luZyB5b3UgdG8gY2hvc2UgdGhlIGZvbGRlci4gU2VsZWN0IHRoZSBmb2xkZXIgCisJYnkgY2xpY2tpbmcgJnF1b3Q7U2VsZWN0IFNjZW5hcmlvIEZvbGRlciZxdW90OyBhbmQgdGhlbiBjbGljayAmcXVvdDtOZXh0JnF1b3Q7PC9saT4KKzwvb2w+Cis8L3A+CismbmJzcDs8cD48aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWcvRXN0aW1hdG9yMWEuanBnIiB3aWR0aD0iMTAwMCIgaGVpZ2h0PSI4MDAiPjwvcD4KKzxwPjUuIEEgc2Vjb25kIGRpYWxvZyB3aWxsIGxhdW5jaCBhbGxvd2luZyB5b3UgdG8gY2hvc2UgZnJvbSB2YWxpZCBtb2RlbHMgCithcHByb3ByaWF0ZSB0byB0aGUgZGF0YSBzZXQgeW91IGNob3NlLiBJZiwgZm9yIGV4YW1wbGUsIHRoZSBkYXRhPGJyPgorY29udGFpbnMgY29sdW1ucyBmb3IgYWxsIFMsRSxJLFIgc3RhdGVzLCB0aGVuIGFueSBTRUlSIHBhcmFtZXRlciBlc3RpbWF0b3Igd2lsbCAKK2FwcGVhciBvbiB0aGUgbGlzdC4gU2VsZWN0IGFuZCBFc3RpbWF0b3IgYW5kIGNsaWNrICZxdW90O0ZpbmlzaCZxdW90OzwvcD4KKzxwPiZuYnNwOzwvcD4KKzxwPjxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9Fc3RpbWF0b3IxYi5qcGciIHdpZHRoPSIxMDAwIiBoZWlnaHQ9IjgwMCI+PC9wPgorPHA+Ni4gVGhlIEZvbGRlciB5b3UgY2hvc2Ugd2lsbCBub3cgc2hvdyB1cCBvbiB0aGUgJnF1b3Q7U2NlbmFyaW8gRm9sZGVyJnF1b3Q7IHRleHQgZmllbGQuIAorQ2xpY2sgJnF1b3Q7RXN0aW1hdGUgUGFyYW1ldGVycyZxdW90Oy48L3A+Cis8cD48aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWcvRXN0aW1hdG9yMi5qcGciIHdpZHRoPSIxMDAwIiBoZWlnaHQ9IjgwMCI+PC9wPgorPHA+Ny4gQSBiYXIgY2hhcnQgZ3JhcGggd2lsbCBhcHBlYXIgc2hvd2luZyB5b3UgZXN0aW1hdGVzIGZvciB0aGUgYXBwcm9wcmlhdGUgCittb2RlbCBwYXJhbWV0ZXJzLiBJbiBzb21lIGNhc2UgdHdvIGJhcnMgd2lsbCBhcHBlYXIgZm9yIGVhY2ggcGFyYW1ldGVyIGFzIHRoZSAKK2VzdGltYXRvciBtYXk8YnI+CitkZXRlcm1pbmUgdGhlIGJlc3QgZXN0aW1hdGUgZml0cyB3aXRoaW4gYSByYW5nZSBvZiB2YWx1ZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uIAorb24gdGhlIGVzdGltYXRpb24gYWxnb3JpdGhtcyBwbGVhc2Ugc2VlIHRoZQorPGEgaHJlZj0iaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXN0aW1hdGluZ19Nb2RlbF9QYXJhbWV0ZXJzX2Zyb21fRXh0ZXJuYWxfRGF0YSI+CitFY2xpcHNlIFNURU0gd2lraS48L2E+PC9wPgorPHA+PGltZyBib3JkZXI9IjAiIHNyYz0iaW1nL0VzdGltYXRvcjMuanBnIiB3aWR0aD0iMTAwMCIgaGVpZ2h0PSI4MDAiPjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvZ2UuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDAzMjk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9nZS5odG1sCkBAIC0wLDAgKzEsMTI4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorCis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+R29vZ2xlRWFydGggVmlldzwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGgxPlNURU0gdG8gR29vZ2xlRWFydGggVmlldzwvaDE+Cis8cD5UaGUgU1RFTSB0byBHb29nbGVFYXJ0aCB2aWV3IHByb2plY3RzIHRoZSByZXN1bHRzIG9mIHRoZSBTVEVNCitzaW11bGF0aW9uIG9udG8gR29vZ2xlRWFydGhzIDNEIGRpc3BsYXkgb2YgdGhlIFdvcmxkLiBGb3IgZXhhbXBsZSwgaW4KK3RoZSBmb2xsb3dpbmcgZGlzcGxheSwgdGhlIHByb2dyZXNzIG9mIGEgZGlzZWFzZSBpcyBzaG93biBpbiByZWQKK3N1cGVyaW1wb3NlZCBvbiB0aGUgR29vZ2xlRWFydGggZGlzcGxheS48L3A+Cis8cD4KKzx1bD4KKwlDb2xvciBLZXkKKwk8bGk+Qmx1ZSAtIFN1c2NlcHRpYmxlPC9saT4KKwk8bGk+WWVsbG93IC0gRXhwb3NlZDwvbGk+CisJPGxpPlJlZCAtIEluZmVjdGlvdXM8L2xpPgorCTxsaT5HcmVlbiAtIFJlY292ZXJlZDwvbGk+Cis8L3VsPgorPHA+PGltZyBzcmM9ImltZy9nZW1hcDEuanBnIiB3aWR0aD02MDA+Cis8cD4KKzxoMj5QcmVyZXF1aXNpdGVzPC9oMj4KKzxwPllvdSBtdXN0IGhhdmUgaW5zdGFsbGVkIHRoZSBHb29nbGVFYXJ0aCBhcHBsaWNhdGlvbiB3aGljaCBpcworYXZhaWxhYmxlIGZvciBwZXJzb25hbCB1c2UgZnJvbSB0aGUgPGEKKwlocmVmPSJodHRwOi8vZWFydGguZ29vZ2xlLmNvbS9lYXJ0aDQuaHRtbCI+R29vZ2xlRWFydGggZG93bmxvYWQKK3NpdGU8L2E+LiBZb3Ugc2hvdWxkIHZlcmlmeSB0aGF0IEdvb2dsZUVhcnRoIHdvcmtzIGNvcnJlY3RseSBvbiB5b3VyIG1hY2hpbmUKK2J5IHN0YXJ0aW5nIGl0IGFuZCB2ZXJpZmluZyB0aGF0IHlvdSBjYW4gYnJvd3NlIHRoZSAzRCBpbWFnZS4gCitQbHVzIGl0IGlzIGEgZnVuIGFwcGxpY2F0aW9uIHRvIHBsYXkgd2l0aC4gTm90ZSB0aGF0IHNvbWUgb2xkZXIKK2NvbXB1dGVycyBkbyBub3QgaGF2ZSB0aGUgM0QgZ3JhcGhpY3MgY2FwYWJpbGl0aWVzIHJlcXVpcmVkIGJ5CitHb29nbGVFYXJ0aCBhbmQgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gcnVuIEdvb2dsZUVhcnRoLiAgIAorPGgyPlN0YXJ0aW5nIHRoZSBTVEVNIHRvIEdvb2dsZUVhcnRoIGludGVyZmFjZS48L2gyPgorPHA+WW91IGNhbiBsZWF2ZSBHb29nbGVFYXJ0aCBydW5uaW5nIG9yIG5vdC4gU1RFTSB3aWxsIHN0YXJ0IGl0IGlmCituZWVkZWQuIAorPHA+CitJZiB5b3UgYXJlIHJ1bm5pbmcgU1RFTSBmcm9tIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uLCAgeW91IG5lZWQgYnVpbGQgdGhlIAorU2VydmxldHMgYXMgZGVzY3JpYmVkIGxhdGVyLiAgCis8dWw+CisgICAgPGxpPlN0YXJ0dXAgdGhlIFNURU0gYXBwbGljYXRpb24gYXMgZGVzY3JpYmVkIGVhcmxpZXIuCisJPGxpPkxvYWQgR29vZ2xlRWFydGggVmlldyA8Yj5XaW5kb3dzLT5Hb29nbGVFYXJ0aCBWaWV3PC9iPgorCTxsaT5TZWxlY3QgdGhlIEdvb2dsZUVhcnRoIFZpZXcgZnJvbSB0aGUgVGFiYmVkIFdpbmRvdy4gPGJyPgorCVRoaXMgc2hvdWxkIHN0YXJ0IHRoZSBHb29nbGVFYXJ0aCBhcHBsaWNhdGlvbiBpZiBpdCB3YXMgbm90CisJYWxyZWFkeSBzdGFydGVkLiBUaGUgU1RFTS1Hb29nbGVFYXJ0aCBpbnRlcmZhY2UgaGFzIG1hbnkgb3B0aW9ucyB0aGF0CisJY2FuIGJlIHNldCBmcm9tIAorCTxiPldpbmRvd3MtPnByZWZlcmVuY2VzLT5TVEVNLT5WaXN1YWxpemF0aW9uLT5HZW9ncmFwaGljLT5Hb29nbGVFYXJ0aDwvYj4gCisJSG93ZXZlciwgd2UgY2FuIHVzZSB0aGUgZGVmYXVsdHMgZm9yIG91ciBmaXJzdCBydW4uIAorCTxsaT5TdGFydCBhIG5ldyBzaW11bGF0aW9uIGJ5IHNlbGVjdGluZyB0aGUgU2NlbmFyaW8gd2luZG93LiAKKwk8bGk+U2VsZWN0IHRoZSBVU0Egc2NlbmFyaW8uIFNURU0tPkdlb2dyYXBoeS0+UG9saXRpY2FsLT5Db3VudHJ5LT5VU0EKKwk8bGk+ZG91YmxlIGNsaWNraW5nIHRoZSAiUGFuZGVtaWMgRGVtbyIgPGEgaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNzY2VuYXJpbyI+IFNjZW5hcmlvPC9hPi4KKwk8bGk+QWZ0ZXIgdGhlIGRpc3BsYXkgaGFzIHJ1biBmb3IgYXQgbGFlYXN0IDcgY3ljbGVzLCAKKwkgICAgcHJlc3MgdGhlIDxiPnBhdXNlPC9iPiBjb250cm9sLgorCTxsaT5TZWxlY3QgdGhlIEdvb2dsZUVhcnRoIFZpZXcgYW5kIHByZXNzIHRoZSA8Yj5EaXNwbGF5PC9iPiBidXR0b24uCisJPGxpPllvdSBzaG91bGQgc2VlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBQYW5kZW1pYyBEZW1vIGluZmVjdGlvbiBzdXBlcmltcG9zZWQgb24gCisJICAgIHRoZSBHb29nbGVFYXJ0aCBtYXAuCis8L3VsPgorCis8cD4KKzxoMj5NYW51YWwgbW9kZSB2ZXJzdXMgQXV0b21hdGljIE1vZGUuPC9oMj4KKyAgVGhlIFNURU0gdG8gR29vZ2xlRWFydGggaXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGUgZGVmYXVsdCB0byBydW4gaW4gTWFudWFsIG1vZGUuCisgIEluIG9yZGVyIHRvIHNlZSB0aGUgc3RhdGUgb2YgdGhlIGRpc2Vhc2Ugc3VwZXJpbXBvc2VkIG9uIHRoZSAKKyAgR29vZ2xlRWFydGggM0QgaW1hZ2UsIHlvdSBoYXZlIHRvIG1hbnVhbGx5IHByZXNzIHRoZSBkaXNwbGF5IGJ1dHRvbi4KKyAgVGhlIG1vcmUgaW50ZXJlc3Rpbmcgd2F5IHRvIHJ1biBpdCBpcyB3aXRoIHRoZSBHb29nbGVFYXJ0aCBkaXNwbGF5IAorICBiZWluZyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgb24gZWFjaCBjeWNsZSB3aXRoIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZGlzZWFzZS4KKyAgQnV0IGJlY2F1c2UgYm90aCBTVEVNIGFuZCBHb29nbGVFYXJ0aCB1c2UgYSBsb3Qgb2YgQ1BVIHJlc291cmNlcyBhbmQgCisgIHN5c3RlbSBtZW1vcnksIHRoZXkgd2lsbCBvbmx5IHJ1biB3ZWxsIHNpbXVsdGFuZW91c2x5IGlmIHlvdSBoYXZlIGF0IGxlYXN0IAorICB0d28gR2lnYWJ5dGVzIG9mIG1lbW9yeSBhbmQgYSBmYXN0IHByb2Nlc3Nvci4gIEl0IHdpbGwgcnVuIHdpdGggb25lIGdpZ2FieXRlIAorICBvZiBtZW1vcnkgYnV0IHZlcnkgc2xvd2x5LgorICA8cD4KKyAgSWYgeW91IGFyZSBsdWNreSBlbm91Z2ggdG8gaGF2ZSAyIEdpZ2FieXRlcyBtZW1vcnksIGdvIHRvIHRoZSAKKyAgPGEgaHJlZj0iLi4vcHJlZmVyZW5jZXMvcHJlZmVyZW5jZXNnZXRvcGxldmVsLmh0bWwiPkdvb2dsZUVhcnRoIFByZWZlcmVuY2VzPC9hPgorICBhbmQgc2V0IHRoZSAibWV0aG9kIiBwcmVmZXJlbmNlIHRvICJBc3luY2ggU2VydmxldCIgb3IgIkRpcmVjdCBMYXVuY2giLgorICA8cD4KKyAgVGhlIG5leHQgdGltZSB5b3Ugc3RhcnQgYSBzaW11bGF0aW9uLCB5b3Ugc2hvdWxkIHRoZW4gc2VlIHRoZSBkaXNlYXNlIHNwcmVhZCAKKyAgaW4gdGhlIEdvb2dsZUVhcnRoIHdpbmRvdyBhcyBTVEVNIHJ1bnMuCisgIDxwPgorICBZb3UgY2FuIGFsc28gPGI+cmlnaHQgY2xpY2s8L2I+IGluIHRoZSBTVEVNLUdvb2dsZUVhcnRoIHdpbmRvdyB0byBicmluZyB1cCAKKyAgYSBjb250ZXh0IG1lbnUgd2l0aCBhZGRpdGlvbmFsIGNvbW1hbmRzLgorICAKKyAgPGgyPkJ1aWxkaW5nIFNlcnZsZXRzPC9oMj4KKyAgSWYgeW91IGFyZSBydW5uaW5nIGZyb20gdGhlIFNURU0gc291cmNlIGRpc3RyaWJ1dGlvbjoKKyAgPHVsPgorICAgIDxsaT5VcGRhdGUgU1RFTSB0byB0aGUgbGF0ZXN0IGNvZGUgbGV2ZWwgYW5kIGVuc3VyZSBpdCBpcyByZWZyZXNoZWQgYW5kIHJlYnVpbHQuCisgICAgPGxpPkZyb20gcHJvamVjdCA8Yj5vcmcuZWNsaXBzZS5zdGVtLnVpLmdlPC9iPiBzZWxlY3QgPGI+c2VydmxldC54bWw8L2I+CisgICAgPGxpPlNlbGVjdCA8Yj5SdW5Bcy0+QW50QnVpbGQ8L2I+CisgICAgPGxpPkZyb20gRWNsaXBzZSwgUnVuIFN0ZW0gdXNpbmcgc3RlbS5wcm9kdWN0IGluIG9yZy5lY2xpcHNlLnN0ZW0udWkgCisgICAgICAgIGFzIGRlc2NyaWJlZCBlYXJsaWVyIAorICAgPC91bD4KKyAgSWYgeW91IGFyZSBydW5uaW5nIHRoZSBTVEVNIHN0YW5kYWxvbmUgZXhlY3V0YWJsZSwgdGhlIGFib3ZlIHN0ZXBzIHdlcmUgCisgIGFscmVhZHkgZG9uZSBmb3IgeW91IGFuZCB5b3UganVzdCBuZWVkIHRvIHN0YXJ0IFNURU0uZXhlLgorICAKKyAgPGgyPkNvbnRleHQgTWVudTwvaDI+CisgIElmIHlvdSBicmluZyB1cCB0aGUgY29udGV4dCBtZW51IChSaWdodCBjbGljayBpbiBXaW5kb3dzKSB0aGVuIHlvdSB3aWxsIAorICBnZXQgYSBtZW51IHdoZXJlIHlvdSBjYW4gaXNzdWUgc29tZSBjb250cm9sIGNvbW1hbmRzIG9yIG9wdGlvbnMgZm9yIHRoZSAKKyAgU1RFTS9Hb29nbGVFYXJ0aCBpbnRlcmZhY2UuICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjb250ZXh0IG1lbnUgYW5kIAorICB0aGUgPGI+UHJlZmVyZWNlczwvYj4gaXMgdGhhdCB0aGUgY29udGV4dCBtZW51IG9ubHkgYWZmZWN0cyB0aGUgY3VycmVudCAKKyAgaW52b2NhdGlvbi4gIAorICA8dWw+CisgICA8bGk+PGVtPkRpc3BsYXkgQWRtaW4gQXJlYTwvZW0+PGJyPgorICAgICBUaGlzIHdpbGwgYnJpbmcgdXAgYSBtZW51IHdoZXJlIHlvdSBjYW4gc3BlY2lmeSBhbiBhZG1pbiBhcmVhIGFuZCAKKyAgICAgaGF2ZSBpZiBkaXNwbGF5ZWQgb24gdGhlIEdvb2dsZUVhcnRoIG1hcC4gIFRoaXMgaGFzIG5vdGhpbmcgdG8gZG8gCisgICAgIHdpdGggU1RFTSBidXQgaXQgd2FzIHVzZWZ1bCBkdXJpbmcgb3VyIGRldmVscG1lbnQgb2YgdGhlIFNURU0gCisgICAgIGdlb2dyYXBoeSBmaWxlcyBhbmQgaGFzIGJlZW4gbGVmdCBpbi4KKyAgIDxsaT48ZW0+RGlzcGxheSBTdGF0dXM8L2VtPjxicj4KKyAgICAgVGhpcyB3aWxsIGRpc3BsYXkgb24gdGhlIGNvbnNvbGUgdGhlIHN0YXR1cyBvZiB0aGUgU1RFTS9Hb29nbGVFYXJ0aCAKKyAgICAgaW50ZXJuYWwgaW50ZXJmYWNlLiAgSXQgaXMgYSB1c2VmdWwgZGVidWcgdG9vbC4KKyAgIDxsaT48ZW0+RGVidWcgT24vT2ZmPC9lbT48YnI+CisgICAgIFR1cm5zIG9uICBvciBvZmYgdGhlIGRlYnVnIG91dHB1dC4KKyAgIDxsaT48ZW0+R29vZ2xlRWFydGggU3RhcnQ8L2VtPjxicj4KKyAgICAgU3RhcnR1cCBHb29nbGVFYXJ0aCBhcHBsaWNhdGlvbiBpZiBpdCBpcyBub3QgYWxyZWFkeSBzdGFydGVkLgorICAgPGxpPjxlbT5Hb29nbGVFYXJ0aCBSZXN0YXJ0PC9lbT48YnI+CisgICAgIElmIEdvb2dsZUVhcnRoIHdhcyBmb3IgYW55IHJlYXNvbiBzdG9wcGVkIG9yIGNyYXNoZWQsIAorICAgICB0aGlzIHdpbGwgYXR0ZW1wdCB0byBnZXQgaXQgcnVubmluZyBhZ2FpbiB3aXRoIHRoZSBjdXJyZW50IAorICAgICBTVEVNIHN0YXR1cy4gSXQgbWF5IG5vdCB3b3JrLgorICAgPGxpPjxlbT5Hb29nbGVFYXJ0aCBSdW48L2VtPjxicj4KKyAgICAgVGhpcyBpcyB1c2VkIGlmIHlvdSBoYXZlIGFscmVhZHkgY2FwdHVyZWQgdGhlIEtNTCBsb2cgZmlsZXMgYW5kIAorICAgICB5b3Ugd2FudCB0byBydW4gdGhlbSBhZnRlciB0aGUgc2ltdWxhdGlvbiBpcyBjb21wbGV0ZS4KKyAgICAgSXQgd2lsbCBsZXQgeW91IHNwZWNpZnkgdGhlIGZvbGRlciBjb250YWluaW5nIHRoZSBLTUwgZmlsZXMgYW5kIAorICAgICB3aWxsIHNlbmQgdGhlbSBvbmUgYnkgb25lIHRvIEdvb2dsZUVhcnRoLgorICAgPGxpPjxlbT5Hb29nbGVFYXJ0aCBTdG9wPC9lbT48YnI+CisgICAgIFRoaXMgd2lsbCBzdG9wIHRoZSBzZW5kaW5nIG9mIGZpbGVzIHRvIEdvb2dsZUVhcnRoIGFuZCAKKyAgICAgY2xlYXIgdGhlIHBvbHlnb25zIGFscmVhZHkgZGlzcGxheWVkLiAKKyAgIAorICA8L3VsPgorICAgIAorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9ncmFwaHN2aWV3Lmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2dyYXBoc3ZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTQwMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9ncmFwaHN2aWV3Lmh0bWwKQEAgLTAsMCArMSwyNSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPmhlbHA8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKzxoMT5HcmFwaHMgVmlldzwvaDE+Cis8cD5UaGUgPGVtPkdyYXBocyBWaWV3PC9lbT4gZGlzcGxheXMgdGhlIDxhCisJaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNncmFwaCI+IEdyYXBoczwvYT4gdGhhdCBhcmUKK2F2YWlsYWJsZSBmb3IgdXNlIGluIDxhCisJaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNzY2VuYXJpbyI+IFNjZW5hcmlvczwvYT4uIEl0IGNvbnRhaW5zIGdyYXBocyByZXByZXNlbnRpbmcKKwlpbmZyYXN0dWN0dXJlIHN1Y2ggYXMgYWlycG9ydHMgYW5kIHJvYWRzLCBhcyB3ZWxsIGFzIGNvbW1vbiBib3JkZXIgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHJlZ2lvbnMuCitUaGUgYXZhaWxhYmxlIDxhIGhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjZ3JhcGgiPgorR3JhcGhzPC9hPiBhcmUgb3JnYW5pemVkIGluIGEgdHJlZS4gVGhvc2UgbGlzdGVkIHVuZGVyICJTVEVNIiBhcmUgYnVpbHQtaW4KK3RvIFNURU0uPC9wPgorPHA+VGhlIHZpZXcgc3VwcG9ydHMgImRyYWciIHN1Y2ggdGhhdCBhIDxhCisJaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNncmFwaCI+IEdyYXBoczwvYT4gY2FuIGJlCitkcmFnZ2VkIGZyb20gdGhpcyB2aWV3IGFuZCAiZHJvcHBlZCIgaW50byBhbiBvcGVuIDxhCisJaHJlZj0iLi4vZWRpdG9ycy9tb2RlbGVkaXRvci5odG1sIj5Nb2RlbCBlZGl0b3I8L2E+LjwvcD4KKzxpbWcgc3JjPSJpbWcvZ3JhcGhzdmlldy5wbmciIC8+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy8uY3ZzaWdub3JlIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODVlOGJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvLmN2c2lnbm9yZQpAQCAtMCwwICsxIEBACitUaHVtYnMuZGIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL0NzdjJfNS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9Dc3YyXzUuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZjdiNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9Dc3YyXzUuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL0NzdjYuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvQ3N2Ni5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4MzY0OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL0NzdjYuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL0VwaWRlbWljLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL0VwaWRlbWljLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWNiM2UxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvRXBpZGVtaWMuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL0VzdGltYXRvcjFhLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL0VzdGltYXRvcjFhLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGJjM2RlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvRXN0aW1hdG9yMWEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL0VzdGltYXRvcjFiLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL0VzdGltYXRvcjFiLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjhhOWEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvRXN0aW1hdG9yMWIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL0VzdGltYXRvcjIuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvRXN0aW1hdG9yMi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRjY2IxZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL0VzdGltYXRvcjIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL0VzdGltYXRvcjMuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvRXN0aW1hdG9yMy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzNDI2YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL0VzdGltYXRvcjMuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL0x5YXB1bm92LmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL0x5YXB1bm92LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTI3MzgwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvTHlhcHVub3YuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL1BoYXNlU3BhY2VWaWV3LmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL1BoYXNlU3BhY2VWaWV3LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGQ1YTBmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvUGhhc2VTcGFjZVZpZXcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL1NjZW5hcmlvQ29tcGFyaXNvbi5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9TY2VuYXJpb0NvbXBhcmlzb24uanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MzczZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9TY2VuYXJpb0NvbXBhcmlzb24uanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL1NjZW5hcmlvQ29tcGFyaXNvbkIuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvU2NlbmFyaW9Db21wYXJpc29uQi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1YjViZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL1NjZW5hcmlvQ29tcGFyaXNvbkIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2FjdGl2ZXNpbXVsYXRpb25zdmlldy5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9hY3RpdmVzaW11bGF0aW9uc3ZpZXcuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZjM5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9hY3RpdmVzaW11bGF0aW9uc3ZpZXcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2NvbXBhcnNvbkVxdWF0aW9uLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2NvbXBhcnNvbkVxdWF0aW9uLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWI2ZDllCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvY29tcGFyc29uRXF1YXRpb24uanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2NvbnRyb2x2aWV3LmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2NvbnRyb2x2aWV3LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjNlNjg1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvY29udHJvbHZpZXcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2NvbnRyb2x2aWV3LnBuZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2NvbnRyb2x2aWV3LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzEwYzRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvY29udHJvbHZpZXcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2NzdjEuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvY3N2MS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzZWMwYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2NzdjEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2NzdjIuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvY3N2Mi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2YzMyMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2NzdjIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2NzdjMuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvY3N2My5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyZmEzMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2NzdjMuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2NzdjQuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvY3N2NC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRjZDk4ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2NzdjQuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2NzdjUuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvY3N2NS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFhZGU4YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2NzdjUuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2RjbW9kZWxzcG9wdXAuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvZGNtb2RlbHNwb3B1cC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5YzdjYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2RjbW9kZWxzcG9wdXAuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2Rjc2NlbmFyaW9zcG9wdXAuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvZGNzY2VuYXJpb3Nwb3B1cC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYyMmFlZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2Rjc2NlbmFyaW9zcG9wdXAuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2RlY29yYXRvcnN2aWV3LmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2RlY29yYXRvcnN2aWV3LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTYxZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvZGVjb3JhdG9yc3ZpZXcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2Rpc2Vhc2Vzdmlldy5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9kaXNlYXNlc3ZpZXcuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTdkYWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9kaXNlYXNlc3ZpZXcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2Vycm9yX2xvZy5wbmcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9lcnJvcl9sb2cucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMmYwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9lcnJvcl9sb2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2Vycm9ybG9ndmlldy5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9lcnJvcmxvZ3ZpZXcuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOTc2NDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9lcnJvcmxvZ3ZpZXcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2dlbWFwMS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9nZW1hcDEuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMThlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9nZW1hcDEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2dyYXBoc3ZpZXcuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvZ3JhcGhzdmlldy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4YmQ2MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2dyYXBoc3ZpZXcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2dyYXBoc3ZpZXcucG5nIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvZ3JhcGhzdmlldy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3ODdhNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2dyYXBoc3ZpZXcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2x5YXBFcTEuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvbHlhcEVxMS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0MWZjYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2x5YXBFcTEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2x5YXBFcTIuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvbHlhcEVxMi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYyZDI5NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2x5YXBFcTIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2x5YXBFcTMuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvbHlhcEVxMy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxMjU2YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL2x5YXBFcTMuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL21hcHZpZXcuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvbWFwdmlldy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIxZDA3OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL21hcHZpZXcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL21hcHZpZXcucG5nIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvbWFwdmlldy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5MDEzZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL21hcHZpZXcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL21hcHZpZXdjb21iby5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9tYXB2aWV3Y29tYm8uanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYzQ2ODQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9tYXB2aWV3Y29tYm8uanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL21hcHZpZXdwb3B1cC5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9tYXB2aWV3cG9wdXAuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyODZiNTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9tYXB2aWV3cG9wdXAuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL21hcHZpZXdwb3B1cGdhaW4uanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvbWFwdmlld3BvcHVwZ2Fpbi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE2YTBhOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL21hcHZpZXdwb3B1cGdhaW4uanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL21hcHZpZXdwb3B1cHByb2plY3Rpb24uanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvbWFwdmlld3BvcHVwcHJvamVjdGlvbi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNmOGNkZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL21hcHZpZXdwb3B1cHByb2plY3Rpb24uanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL21hcHZpZXdzY2FsZS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9tYXB2aWV3c2NhbGUuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZWNlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2ltZy9tYXB2aWV3c2NhbGUuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL21vZGVsc3ZpZXcuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvbW9kZWxzdmlldy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwZDdlYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL21vZGVsc3ZpZXcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL21vZGVsc3ZpZXcucG5nIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvbW9kZWxzdmlldy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE3N2FiMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL21vZGVsc3ZpZXcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3Byb2plY3R2aWV3LmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3Byb2plY3R2aWV3LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjEyMTljCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvcHJvamVjdHZpZXcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3Byb2plY3R2aWV3LnBuZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3Byb2plY3R2aWV3LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmZjYWFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvcHJvamVjdHZpZXcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3Byb3BlcnRpZXN2aWV3LmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3Byb3BlcnRpZXN2aWV3LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzJmNDQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvcHJvcGVydGllc3ZpZXcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3Byb3BlcnRpZXN2aWV3LnBuZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3Byb3BlcnRpZXN2aWV3LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2JmNDA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvcHJvcGVydGllc3ZpZXcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3JlcG9ydFByZWZlcmVuY2VzLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3JlcG9ydFByZWZlcmVuY2VzLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmU0M2MwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvcmVwb3J0UHJlZmVyZW5jZXMuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3NjZW5hcmlvc3ZpZXcuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvc2NlbmFyaW9zdmlldy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxNTk1ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3NjZW5hcmlvc3ZpZXcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3NjZW5hcmlvc3ZpZXcucG5nIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvc2NlbmFyaW9zdmlldy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc4MzA4ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3NjZW5hcmlvc3ZpZXcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3NlbGVjdHJlcG9ydHMuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvc2VsZWN0cmVwb3J0cy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjMDUwYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3NlbGVjdHJlcG9ydHMuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3NlcXVlbmNlcnN2aWV3LmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3NlcXVlbmNlcnN2aWV3LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2M1MmE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvc2VxdWVuY2Vyc3ZpZXcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3RpbWVzZXJpZXN2aWV3LmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvaW1nL3RpbWVzZXJpZXN2aWV3LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2U2YjcwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9pbWcvdGltZXNlcmllc3ZpZXcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvbHlhcHVub3Z2aWV3Lmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2x5YXB1bm92dmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNWY0MjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2x5YXB1bm92dmlldy5odG1sCkBAIC0wLDAgKzEsNzggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+CisKKzxodG1sIHhtbG5zOnY9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sIiB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisKKzx0aXRsZT5oZWxwPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8aDE+THlhcHVub3YgVmlldzwvaDE+Cis8cD5UaGUgPGVtPkx5YXB1bm92IFZpZXc8L2VtPiBhbGxvd3MgYSB1c2VyIHRvIGFwcGx5IHRvb2xzIGRldmVsb3BlZCB0byBhbmFseXplCitkeW5hbWljYWwgc3lzdGVtcy4gVGhlIFJNUyBjb21wYXJpc29uIHZpZXcgaXMgYSB1c2VmdWwgbWVhc3VyZSBvZiB0aGUgYXZlcmFnZQorZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBzY2VuYXJpb3MuIEhvd2V2ZXIsIGlmIGEgbW9kZWwgYW5kIHJlZmVyZW5jZSBzY2VuYXJpbworZWFjaCBkZXNjcmliZSBhbiBlcGlkZW1pYyB0aGF0IGJlZ2lucyBhbmQgZW5kIGluIHRoZSBzYW1lIHN0YXRlICh6ZXJvCitpbmZlY3Rpb3VzKSwgdGhlIFJNUyBlcnJvciB3aWxsIGV2ZW50dWFsbHkgZmFsbCZuYnNwOyB0byB6ZXJvIGFzIGEgZnVuY3Rpb24gb2YKK3RpbWUsIGV2ZW4gaW4gY2FzZSBvZiBhICYjODIyMDtiYWQmIzgyMjE7IG1vZGVsLiBJbiBhZGRpdGlvbiB0byBtZWFzdXJpbmcgdGhlIGF2ZXJhZ2UgZXJyb3IsCitpdCBpcyB1c2VmdWwgdG8gbG9vayBmb3Igb3RoZXIgbWVhc3VyZXMgdGhhdCBtaWdodCBwcm92aWRlIGEgJiM4MjIwO2ZpbmdlcnByaW50JiM4MjIxOyBmb3IKK3RoZSBzcGF0aW90ZW1wb3JhbCBkeW5hbWljcyBvZiBhbiBpbmZlY3Rpb3VzIGRpc2Vhc2UuIExpa2UgbWFueSBkeW5hbWljYWwKK3N5c3RlbXMsIGluZmVjdGlvdXMgZGlzZWFzZSBpcyBhIHByb2Nlc3Mgb2YgbWFueSB2YXJpYWJsZXMuIEhvd2V2ZXIsIGl0IGlzIG9mdGVuCitwb3NzaWJsZSB0byBjYXB0dXJlIHRoZSBlc3NlbnRpYWwgZHluYW1pY3MgYnkgbG9va2luZyBhdCBqdXN0IGEgZmV3IHN5c3RlbQordmFyaWFibGVzIGluIGFuIGFwcHJvcHJpYXRlIHBoYXNlIHNwYWNlLiZuYnNwOyBJbiBpdHMgbW9zdCBnZW5lcmFsIGZvcm1hbGlzbSwgYW55CitkeW5hbWljYWwgc3lzdGVtIGlzIGRlZmluZWQgYnkgYSBmaXhlZCBzZXQgb2YgZXF1YXRpb25zIHRoYXQgZ292ZXJuIHRoZSB0aW1lCitkZXBlbmRlbmNlIG9mIHRoZSBzeXN0ZW0mIzgyMTc7cyBzdGF0ZSB2YXJpYWJsZXMuIFRoZSBzdGF0ZSB2YXJpYWJsZXMgYXQgc29tZSBpbnN0YW50CitpbiB0aW1lIGRlZmluZSBhIHBvaW50IGluIHBoYXNlIHNwYWNlLiBBIFNFSVIgbW9kZWwgZGVmaW5lcyBhIGZvdXIgZGltZW5zaW9uYWwKK3BoYXNlIHNwYWNlLiBBbiBTSSBtb2RlbCBkZWZpbmVzIGEgdHdvIGRpbWVuc2lvbmFsIHNwYWNlLiBFeGFtaW5pbmcgYSByZWR1Y2VkCitzZXQgb2YgZGltZW5zaW9uIG1heSBiZSB0aG91Z2h0IG9mIGFzIHRha2luZyBzbGljZSB0aHJvdWdoIHBoYXNlIHNwYWNlIChmb3IKK2V4YW1wbGUgaW4gdGhlIFNJIHBsYW5lKS4KKzxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJ0ZXh0LWluZGVudDoxMS41cHQiPkF0IHRoZSBzdGF0ZSBvZiB0aGUgc3lzdGVtCitjaGFuZ2VzIHdpdGggdGltZSwgdGhlIHBvaW50IChTKHQpLCBJKHQpKSBpbiBwaGFzZSBzcGFjZSBkZWZpbmVzIGEgPGk+dHJhamVjdG9yeTwvaT4KK2luIHRoZSBTSSBwbGFuZS4gQ29uc2lkZXIgYW4gZXBpZGVtaWMgdGhhdCBiZWdpbnMgd2l0aCBvbmUgaW5mZWN0aW91cyBwZXJzb24gYW5kCit2aXJ0dWFsbHkgdGhlIGVudGlyZSBwb3B1bGF0aW9uIHN1c2NlcHRpYmxlIGF0IHQ9MCwmbmJzcDsgUygwKSB+IDEuIFRoZSB0cmFqZWN0b3J5Cit3aWxsIGJlZ2luIGF0IHRpbWUgemVybyBhbG9uZyB0aGUgUyBheGlzIG5lYXIgMS4gQXMgdGhlIGRpc2Vhc2Ugc3ByZWFkcywgdGhlCitzdXNjZXB0aWJsZSBwb3B1bGF0aW9uIChTKSB3aWxsIGRlY3JlYXNlIGFuZCB0aGUgaW5mZWN0aW91cyBwb3B1bGF0aW9uIChJKSB3aWxsCitpbmNyZWFzZS4gVGhlIGRldGFpbGVkIHNoYXBlIG9mIHRoZSB0aGlzIHRyYWplY3Rvcnkgd2lsbCBkZXBlbmQgb24gdGhlIHRpbWUgaXQKK3Rha2VzIGZvciB0aGUgZGlzZWFzZSB0byBzcHJlYWQgdG8gZGlmZmVyZW50IHBvcHVsYXRpb24gY2VudGVycywgYXMgd2VsbCBhcyB0aGUKKyhzdXNjZXB0aWJsZSkgcG9wdWxhdGlvbiBkZW5zaXR5IGZ1bmN0aW9uLiBUaGUgcGVha3MgYW5kIHZhbGxleXMgYWxvbmcgdGhlCit0cmFqZWN0b3J5IGluIFNJIHBoYXNlIHNwYWNlIHByb3ZlZCBhIHNpZ25hdHVyZSBvciBmaW5nZXJwcmludCBmb3IgYW4gZXBpZGVtaWMKK3RoZSBzaGFwZSBvZiB3aGljaCBkZXBlbmRzIG9uIHRoZSBkaXNlYXNlLCB0aGUgZGlzZWFzZSB2ZWN0b3JzLCB0aGUgcG9wdWxhdGlvbgorZGlzdHJpYnV0aW9uLCBldGMuIFRoZSBtYXRoZW1hdGljcyBvZiBkeW5hbWljYWwgc3lzdGVtcyBwcm92aWRlIHVzIHdpdGggYQorZm9ybWFsaXNtIHRvIGNvbXBhcmUgdHJhamVjdG9yaWVzIGluIGEgcGhhc2Ugc3BhY2UuIEdpdmVuIGEgc2luZ2xlIHNldCBvZiBydWxlcworKGUuZy4sIGEgZGlzZWFzZSBtb2RlbCksIHR3byBzaW11bGF0aW9ucyB0aGF0IGJlZ2luIGluZmluaXRlc2ltYWxseSBjbG9zZQordG9nZXRoZXIgaW4gcGhhc2Ugc3BhY2UgbWF5IGV2b2x2ZSBkaWZmZXJlbnQgaW4gdGltZSBhbmQgc3BhY2UuIFRoaXMgc2VwYXJhdGlvbgoraW4gcGhhc2Ugc3BhY2UgY2FuIGJlIG1lYXN1cmUgcXVhbnRpdGF0aXZlbHkuIDwvcD4KKzxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJ0ZXh0LWluZGVudDoxMS41cHQiPlRoZSBWZWN0b3I8L3A+Cis8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0idGV4dC1pbmRlbnQ6MTEuNXB0IiBhbGlnbj0iY2VudGVyIj4mbmJzcDs8c3BhbiBzdHlsZT0iZm9udC1zaXplOgorOS4wcHQiPjxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9seWFwRXEyLmpwZyIgd2lkdGg9IjE0NyIgaGVpZ2h0PSIzOSI+PC9zcGFuPiA8L3A+Cis8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0idGV4dC1pbmRlbnQ6MTEuNXB0Ij5kZWZpbmVzIGEgdHJhamVjdG9yeSBpbiBTSSBzcGFjZS4gVGhlIGluaXRpYWwgc2VwYXJhdGlvbiBhdAordGltZSB6ZXJvIGJlIGRlZmluZWQgYXMgPC9wPgorPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9InRleHQtaW5kZW50OjExLjVwdCIgYWxpZ249ImNlbnRlciI+Cis8aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWcvbHlhcEVxMy5qcGciIHdpZHRoPSI2NiIgaGVpZ2h0PSIzOCI+LgorPC9wPgorPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9InRleHQtaW5kZW50OjExLjVwdCI+VGhlIHJhdGUgb2Ygc2VwYXJhdGlvbiBvZiB0d28gdHJhamVjdG9yaWVzIGluIHBoYXNlIHNwYWNlIHdpbGwgb2Z0ZW4gb2JleSB0aGUKK2VxdWF0aW9uPC9wPgorPHAgY2xhc3M9Ik1zb05vcm1hbCIgYWxpZ249ImNlbnRlciIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3RleHQtaW5kZW50OjExLjVwdCI+Cis8aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWcvbHlhcEVxMS5qcGciIHdpZHRoPSIyMzQiIGhlaWdodD0iNDgiPjwvcD4KKzxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJ0ZXh0LWluZGVudDowaW4iPiZuYnNwO3doZXJlCis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6U3ltYm9sIj5sIDwvc3Bhbj5pcyB0aGUgTHlhcHVub3YgRXhwb25lbnQuIFRoaXMKK2V4cG9uZW50IGlzIGEgY2hhcmFjdGVyaXN0aWMgb2YgdGhlIGR5bmFtaWNhbCBzeXN0ZW0gdGhhdCBkZWZpbmVzIHRoZSByYXRlIG9mCitzZXBhcmF0aW9uIG9mIGluZmluaXRlc2ltYWxseSBjbG9zZSB0cmFqZWN0b3JpZXMgaW4gcGhhc2Ugc3BhY2UuIDwvcD4KKzxwPlRvIHVzZSB0aGUgTHlhcHVub3Ygdmlldzo8b2w+CisJPGxpPkVudGVyIHRoZSA8YSBocmVmPSIuLi9wZXJzcGVjdGl2ZXMvYW5hbHlzaXMuaHRtbCI+QW5hbHlzaXMgUGVyc3BlY3RpdmU8L2E+PC9saT4KKwk8bGk+Q2xpY2sgb24gdGhlIEx5YXB1bm92IFRhYjwvbGk+CisJPGxpPlVzZSB0aGUgU2VsZWN0IEZvbGRlciBidXR0b25zIHRvIGNob3NlIHRoZSBmb2xkZXJzIGNvbnRhaW5pbmcgdGhlIGRhdGEKKwl5b3Ugd2lzaCB0byBjb21wYXJlLiBUaGUgZmlsZXMgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZworCTxhIGhyZWY9ImNzdmxvZ2dlcnZpZXcuaHRtbCI+Jm5ic3A7Zm9ybWF0LjwvYT48L2xpPgorCTxsaT5DbGljayAmcXVvdDtDb21wdXRlIEx5YXB1bm92IEV4cG9uZW50JnF1b3Q7PC9saT4KKwk8bGk+VHdvIGNoYXJ0cyB3aWxsIGFwcGVhciwgdGhlIGxlZnQgaGFuZCBjaGFydCB3aWxsIHNob3cgdGhlIHRyYWplY3RvcmllcworCWluIHBoYXNlIHNwYWNlIChJIHZzLiBTKSBmb3IgdGhlIHR3byBkYXRhIHNldHMuIFRoZSByaWdodCBoYW5kIGNoYXJ0IHdpbGwKKwlzaG93IHRoZSBMb2cgb2YgdGhlIGludGVncmF0ZWQ8YnI+CisJZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gdHJhamVjdG9yaWVzIGFzIGEgZnVuY3Rpb24gb2YgdGltZS4gVGhlIGV4cG9uZW50CisJaXMgdGhlIGluaXRpYWwgc2xvcGUgb2YgdGhpcyB0aW1lIHZhcnlpbmcgZGlmZmVyZW5jZSBwbG90dGVkIG9uIGEgc2VtaS1sb2cKKwlwbG90LjwvbGk+Cis8L29sPgorPC9wPgorJm5ic3A7PHA+PGltZyBib3JkZXI9IjAiIHNyYz0iaW1nL0x5YXB1bm92LmpwZyIgd2lkdGg9IjEwMDAiIGhlaWdodD0iNjA4Ij4gPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9tYXB2aWV3Lmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL21hcHZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjAwODM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9tYXB2aWV3Lmh0bWwKQEAgLTAsMCArMSwzOSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPmhlbHA8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKzxoMT5NYXAgVmlldzwvaDE+Cis8cD5UaGUgPGVtPk1hcCBWaWV3PC9lbT4gZGlzcGxheXMgZ2VvZ3JhcGhpYyBpbWFnZXMgdGhhdCByZWZsZWN0IHRoZSBzdGF0ZSBvZgorYW4gYWN0aXZlIFNpbXVsYXRpb24uIDxpbWcgc3JjPSJpbWcvbWFwdmlldy5wbmciIC8+Cis8cD5UaGUgc3RhdGUgaW5mb3JtYXRpb24gZGlzcGxheWVkIGluIHRoZSBtYXAgdmlldyBkaXJlY3RseQorY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlcyB1cGRhdGVkIGJ5IG9uZSBvZiB0aGUgPGEKKwlocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI2RlY29yYXRvciI+IERlY29yYXRvcnM8L2E+CitpbiB0aGUgU2ltdWxhdGlvbi4gVGhlIHBhcnRpY3VsYXIgPGEKKwlocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI2RlY29yYXRvciI+IERlY29yYXRvcjwvYT4KK2lzIHNlbGVjdGVkIGJ5IGEgImNvbWJvIGJveCIgaW4gdGhlIGxvd2VyIGxlZnQgb2YgdGhlIHZpZXcuIEVhY2ggPGEKKwlocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI2RlY29yYXRvciI+IERlY29yYXRvcjwvYT4KK3VwZGF0ZXMgYSBudW1iZXIgb2YgcHJvcGVydGllcyAoaS5lLiwgdmFsdWVzIHRoYXQgZGVmaW5lIHRoZSBzdGF0ZSBvZgordGhlIFNpbXVsYXRpb24pLiBUaGUgTWFwIHZpZXcgY2FuIGRpc3BsYXkgdGhlICJyZWxhdGl2ZSIgdmFsdWVzIG9mIHRoZXNlCitwcm9wZXJ0aWVzIHdpdGggZGlmZmVyZW50IGludGVuc2l0aWVzL2NvbG9ycy4gVGhlIHNwZWNpZmljIHByb3BlcnR5IGlzCitzZWxlY3RlZCBieSB0aGUgY29tYm8gYm94IGJlbmVhdGggdGhlIG9uZSB0aGF0IHNlbGVjdHMgdGhlIDxhCisJaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNkZWNvcmF0b3IiPiBEZWNvcmF0b3I8L2E+LjwvcD4KKzxwPjxpbWcgc3JjPSJpbWcvbWFwdmlld2NvbWJvLmpwZyIgLz4KKzxwPlRoZSBpbWFnZSBjYW4gYmUgcGFubmVkIGJ5IGhvbGRpbmcgdGhlIGxlZnQgbW91c2UgYnV0dG9uIGRvd24gYW5kCitkcmFnZ2luZyB0aGUgY3Vyc29yLjwvcD4KKzxoMj5Db250ZXh0IE1lbnU8L2gyPgorPHA+QSBwb3AtdXAgY29udGV4dCBtZW51IGlzIGF2YWlsYWJsZSBieSByaWdodC1jbGlja2luZyBvbiB0aGUKK2ltYWdlLjwvcD4KKzxwPgorPGltZyBzcmM9ImltZy9tYXB2aWV3cG9wdXAuanBnIiAvPgorPC9wPgorPHA+VGhlcmUgaXMgYSBzdWItbWVudSBmb3Igc3BlY2lmeWluZyB0aGUgImdhaW4gZmFjdG9yIiB0byB1c2UKK3doZW4gZGlzcGxheWluZyB2YWx1ZXMuIFRoZSBnYWluIGZhY3RvciBzY2FsZXMgdGhlIHZhbHVlcyBvZiB0aGUgcHJvcGVydGllcyBzbyB0aGF0IHNtYWxsCit2YWx1ZXMgY2FuIGJlIHZpc3VhbGl6ZWQuIDxici8+Cis8aW1nIHNyYz0iaW1nL21hcHZpZXdwb3B1cGdhaW4uanBnIiAvPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9tb2RlbHN2aWV3Lmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL21vZGVsc3ZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODFlZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9tb2RlbHN2aWV3Lmh0bWwKQEAgLTAsMCArMSwyNiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPmhlbHA8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKzxoMT5Nb2RlbHMgVmlldzwvaDE+Cis8cD5UaGUgPGVtPk1vZGVscyBWaWV3PC9lbT4gZGlzcGxheXMgdGhlIDxhCisJaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNtb2RlbCI+IE1vZGVsczwvYT4gdGhhdCBhcmUKK2F2YWlsYWJsZSBmb3IgdXNlIGluIHVzZXIgZGVmaW5lZCA8YQorCWhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjc2NlbmFyaW8iPiBTY2VuYXJpb3M8L2E+LgorVGhlIGF2YWlsYWJsZSA8YSBocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI21vZGVsIj4KK01vZGVsczwvYT4gYXJlIG9yZ2FuaXplZCBpbiBhIHRyZWUuIFRob3NlIGxpc3RlZCB1bmRlciAiU1RFTSIgYXJlIGJ1aWx0LWluCit0byBTVEVNLiBUaGVyZSBtYXkgYmUgb3RoZXJzIHByb3ZpZGVkIGJ5IHRoaXJkLXBhcnRpZXMuIFRoZXNlIHByZWRlZmluZWQKK21vZGVscyBwcm92aWRlIGFuIGludmFsdWFibGUgImp1bXAtc3RhcnQiIGluIHRoZSBwcm9jZXNzIG9mIGRlZmluaW5nCitvdGhlciA8YSBocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI21vZGVsIj4gTW9kZWxzPC9hPi48L3A+Cis8cD5UaGUgdmlldyBzdXBwb3J0cyAiZHJhZyIgc3VjaCB0aGF0IGEgPGEKKwlocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI21vZGVsIj4gTW9kZWw8L2E+IGNhbiBiZQorZHJhZ2dlZCBmcm9tIHRoaXMgdmlldyBhbmQgImRyb3BwZWQiIGludG8gYW4gb3BlbiBNb2RlbCBvciA8YQorCWhyZWY9Ii4uL2VkaXRvcnMvc2NlbmFyaW9lZGl0b3IuaHRtbCI+U2NlbmFyaW8gZWRpdG9yPC9hPi48L3A+Cis8aW1nIHNyYz0iaW1nL21vZGVsc3ZpZXcucG5nIiAvPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9wcm9qZWN0dmlldy5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9wcm9qZWN0dmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OTE4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL3Byb2plY3R2aWV3Lmh0bWwKQEAgLTAsMCArMSwyMyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPmhlbHA8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKzxoMT5TVEVNIFByb2plY3QgRXhwbG9yZXIgVmlldzwvaDE+Cis8cD5UaGUgPGVtPlNURU0gUHJvamVjdCBFeHBsb3JlciBWaWV3PC9lbT4gZGlzcGxheXMgdGhlIFNURU0KK3Byb2plY3RzIGFuZCB0aGVpciBjb250ZW50cy4gQSBwcm9qZWN0IGlzIGEgY29sbGVjdGlvbiBvZiA8YQorCWhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjZGVjb3JhdG9yIj4gRGVjb3JhdG9yczwvYT4sCis8YSBocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI2dyYXBoIj4gR3JhcGhzPC9hPiwgPGEKKwlocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI21vZGVsIj4gTW9kZWxzPC9hPiwgPGEKKwlocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI3NjZW5hcmlvIj4gU2NlbmFyaW9zPC9hPgorYW5kIFNlcXVlbmNlcnMgdGhhdCBhcmUgdHlwaWNhbGx5IGZvY3VzZWQgb24gb25lIHBhcnRpY3VsYXIgc2ltdWxhdGlvbgorYXJlYSwgZm9yIGluc3RhbmNlLCB0aGUgc3ByZWFkIG9mIGEgcGFydGljdWxhciBkaXNlYXNlLjwvcD4KKzxwPlJpZ2h0LWNsaWNraW5nIG9uIGl0ZW1zIGluIHRoZSB2aWV3IHdpbGwgYnJpbmcgdXAgYSBwb3AtdXAKK2NvbnRleHQgbWVudS48L3A+Cis8aW1nIHNyYz0iaW1nL3Byb2plY3R2aWV3LnBuZyIgLz4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvcHJvcGVydGllc3ZpZXcuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvcHJvcGVydGllc3ZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGQwYzljCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9wcm9wZXJ0aWVzdmlldy5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+CisKKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5oZWxwPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8aDE+UHJvcGVydGllcyBWaWV3PC9oMT4KKzxwPlRoZSA8ZW0+UHJvcGVydGllcyBWaWV3PC9lbT4gYWxsb3dzIHlvdSB0byBlZGl0IHRoZSBwcm9wZXJ0aWVzIG9mIGNvbXBvbmVudHMgaW4geW91ciBzY2VuYXJpbywgc3VjaCBhcyBkaXNlYXNlCittb2RlbHMsIGluZmVjdG9ycyBhbmQgc2VxdWVuY2Vycy4gQXMgc2hvd24gaW4gdGhlIGZpZ3VyZSBiZWxvdywgYWZ0ZXIgc2VsZWN0aW5nIGEgZGlzZWFzZSBtb2RlbCB3aXRoIHRoZSAKK3Byb3BlcnRpZXMgdmlldyBvcGVuLCB0aGUgcHJvcGVydGllcyBvZiB0aGUgbW9kZWwgaXMgc2hvd24uIEl0IGlzIHBvc3NpYmxlIHRvIGNoYW5nZSBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgCitpbiB0aGUgZGlzZWFzZSBtb2RlbCBieSBsZWZ0LWNsaWNraW5nIG9uIGl0cyB2YWx1ZS4gQWZ0ZXIgY2hhbmdpbmcgb25lIG9yIG1vcmUgcGFyYW1ldGVycywgcmVtZW1iZXIgdG8gc2F2ZQordGhlIGRpc2Vhc2UgbW9kZWwgKEN0cmwrUykgdG8gcGljayB1cCB0aGUgY2hhbmdlcyB0aGUgbmV4dCB0aW1lIHlvdSBydW4gYSBzaW11bGF0aW9uLiAgCis8aW1nIHNyYz0iaW1nL3Byb3BlcnRpZXN2aWV3LnBuZyIgLz4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvcmVwb3J0dmlldy5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9yZXBvcnR2aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzZjkwMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvcmVwb3J0dmlldy5odG1sCkBAIC0wLDAgKzEsMTg0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorCis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+aGVscDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGgxPlJlcG9ydCBWaWV3PC9oMT4KKzxwPjxmb250IHNpemU9IjIiPlRoZSBjdXJyZW50IGRpc3RyaWJ1dGlvbiBvZiBTVEVNIHByb3ZpZGVzIHVzZXJzIHdpdGgKK2NvbmZpZ3VyYWJsZSBydW4gdGltZSBSZXBvcnQgVmlld3Mgd2l0aCB3aGljaCB0byBzdHVkeSBydW5uaW5nIHNpbXVsYXRpb25zLiBJbgordGhlIGN1cnJlbnQgZGlzdHJpYnV0aW9uIHRoZSBhdmFpbGFibGUgcmVwb3J0cyBhcmU6PC9mb250Pjx1bD4KKwk8bGk+PGZvbnQgc2l6ZT0iMiI+VGhlIFRpbWUgU2VyaWVzIFZpZXc8L2ZvbnQ+PC9saT4KKwk8bGk+PGZvbnQgc2l6ZT0iMiI+VGhlIFBoYXNlIFNwYWNlIFZpZXc8L2ZvbnQ+PC9saT4KKwk8L3VsPgorCTxwPjxmb250IHNpemU9IjIiPkFsbCBTVEVNIHZpZXdzIGFyZSBjcmVhdGUgdXNpbmcgdGhlCisJPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9iaXJ0LyI+RWNsaXBzZSBCdXNpbmVzcyBJbnRlbGxpZ2VuY2UKKwlSZXBvcnRpbmcgVG9vbCAoQklSVCkuPC9hPiZuYnNwOyA8L2ZvbnQ+PC9wPgorCTxwPjxmb250IHNpemU9IjIiIGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+VGhlIFJlcG9ydCBWaWV3cyBjb21wbGVtZW50IHRoZSB2YXJpb3VzIE1hcCB2aXN1YWxpemF0aW9uCisJdmlld3MuIFdoaWxlIHRoZSBNYXAgZ2l2ZXMgYSBxdWFsaXRhdGl2ZSB2aXN1YWxpemF0aW9uIG9mIGEgcnVubmluZworCXNpbXVsYXRpb24gKGUuZy4gYSBzcHJlYWRpbmcgaW5mZWN0aW91cyBkaXNlYXNlKSwgdGhlIFJlcG9ydCBWaWV3cyBwcm92aWRlCisJbW9yZSBxdWFudGl0YXRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNpbXVsYXRpb24gc3RhdGUgZWl0aGVyIGF0IHNwZWNpZmljCisJbG9jYXRpb25zIG9yIGFnZ3JlZ2F0ZWQgYSBkaWZmZXJlbnQgbGV2ZWxzLjwvZm9udD48L3A+CisJPHA+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj48Yj4xKSBMb2FkaW5nIHRoZSBSZXBvcnQgVmlld3M8L2I+PC9mb250PjwvcD4KKwk8cCBESVI9IkxUUiI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj5UbyBsb2FkIG9yIGFjdGl2YXRlIHRoZSByZXBvcnRzLCBmaXJzdCBsYXVuY2gKKwkoYW5kIHJ1bikgc3RlbS4gVGhlbiwgb24gdGhlIHRvcCBtZW51IGJhciBjbGljayBvbiA8L2ZvbnQ+PC9wPgorCTxwIERJUj0iTFRSIj48Zm9udCBzaXplPSIyIiBmYWNlPSJBcmlhbCI+Jmd0O3dpbmRvdyZndDtvdGhlci4uLiZndDtUaW1lIFNlcmllczwvZm9udD48L3A+CisJPGZvbnQgRkFDRT0iSGVsdiI+CisJPHAgRElSPSJMVFIiPjxmb250IHNpemU9IjIiPlNlbGVjdCBpdC4gR28gYmFjayB0byB0aGUgdG9wIG1lbnUgYmFyIGFuZCBjbGljaworCW9uIDwvZm9udD48L3A+CisJPC9mb250PgorCTxwIERJUj0iTFRSIj48Zm9udCBzaXplPSIyIiBmYWNlPSJBcmlhbCI+Jmd0O3dpbmRvdyZndDtvdGhlci4uLiZndDtQaGFzZSBTcGFjZTwvZm9udD48L3A+CisJPGZvbnQgRkFDRT0iSGVsdiI+CisJPHAgRElSPSJMVFIiPjxmb250IHNpemU9IjIiPlRoaXMgd2lsbCBvcGVuIHR3byBkaWZmZXJlbnQgQklSVCBSZXBvcnQgVmlld3MuCisJT3RoZXIgdmlld3Mgd291bGQgYmUgYWN0aXZhdGVkIGluIHRoZSBzYW1lIHdheS48L2ZvbnQ+PC9wPgorCTxwIERJUj0iTFRSIj48Yj4yKSBTdGFydGluZyB0aGUgUmVwb3J0IFZpZXdzPC9iPjwvcD4KKwk8cCBESVI9IkxUUiI+PGZvbnQgc2l6ZT0iMiI+TmV4dCBnbyB0byB0aGUgc2NlbmFyaW9zIHRhYiBhbmQgZXhwYW5kIDwvZm9udD4KKwk8L3A+CisJPC9mb250PgorCTxwIERJUj0iTFRSIj48Zm9udCBzaXplPSIyIiBmYWNlPSJBcmlhbCI+LSZndDtTVEVNLSZndDtHZW9ncmFwaHktJmd0O1BvbGl0aWNhbC0mZ3Q7Q291bnRyeS0mZ3Q7SmFwYW48L2ZvbnQ+PC9wPgorCTxmb250IEZBQ0U9IkhlbHYiPgorCTxwIERJUj0iTFRSIj48Zm9udCBzaXplPSIyIj5kb3VibGUgY2xpY2sgb24gdGhlIGJ1aWx0IGluIHNjZW5hcmlvPGk+PGJyPgorCVBhbmRlbWljIERlbW8sIFRva3lvLCBKYXBhbiwgMjAwMDxicj4KKwk8L2k+dG8gc3RhcnQgaXQuPC9mb250PjwvcD4KKwk8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMSIgd2lkdGg9IjYwJSI+CisJCTx0cj4KKwkJCTx0ZD4KKwkJCTxwIGFsaWduPSJjZW50ZXIiPjxmb250IEZBQ0U9IkhlbHYiPgorCQkJPGltZyBib3JkZXI9IjAiIHNyYz0iaW1nL3RpbWVzZXJpZXN2aWV3LmpwZyIgd2lkdGg9IjEwMDAiIGhlaWdodD0iODAwIj48L2ZvbnQ+PC90ZD4KKwkJPC90cj4KKwkJPHRyPgorCQkJPHRkPgorCQkJPHAgYWxpZ249ImNlbnRlciI+PGI+RmlndXJlIDE6IFJ1bm5pbmcgdGhlIGJ1aWx0IGluIEphcGFuIFNjZW5hcmlvCisJCQl3aXRoIHRoZSBUaW1lU2VyaWVzIHZpZXcgZGlzcGxheWVkIGJlbG93IHRoZSBtYXAuPC9iPjwvdGQ+CisJCTwvdHI+CisJPC90YWJsZT4KKwk8cCBESVI9IkxUUiI+PGI+MykgQWRkaW5nIGFuZCByZW1vdmluZyBsb2NhdGlvbnMgdG8gTW9uaXRvcjwvYj48L3A+CisJPHAgRElSPSJMVFIiPjxmb250IHNpemU9IjIiPkxvb2sgYXQgdGhlIHRpbWUgc2VyaWVzIGFuZCBwaGFzZSBzcGFjZSB2aWV3cy4KKwlZb3Ugd2lsbCBwcm9iYWJseSBzZWUgYSBzaW5nbGUgY2hhcnQgd2hpY2ggc2hvdWxkIHNob3cgdGhlIGRhdGEgZm9yIGFsbCBvZgorCUphcGFuLiBJZiB5b3UgY2xpY2sgb24gYW55IGxvY2F0aW9uIG9uIHRoZSBtYXAsIGEgbmV3IHJlcG9ydCB3aWxsIGJlIGFkZGVkCisJZm9yIHRoYXQgbmV3IGxvY2F0aW9uLiBJbiB0aGlzIHJlbGVhc2UgY2xpY2tpbmcgb24gdGhlIG1hcCB3aWxsIGdlbmVyYXRlIGEKKwluZXcgcmVwb3J0IG9mIGV2ZXJ5IHR5cGUgdGhhdCBpcyBjdXJyZW50bHkgbG9hZGVkIChlLmcuLCBib3RoIFRpbWUgU2VyaWVzCisJYW5kIFBoYXNlIFNwYWNlIHJlcG9ydHMgd2lsbCBiZSBhZGRlZCBmb3IgdGhhdCBsb2NhdGlvbiBpZiB0aGV5IGFyZSBib3RoCisJYWN0aXZlKS4gSW4gdGhlIGZ1dHVyZSB3ZSB3aWxsIGFkZCBhIHNlbGVjdG9yIHNvIG1hcCBjbGlja2luZyB3aWxsIGdlbmVyYXRlCisJdXNlciBzcGVjaWZpZWQgdHlwZXMgb2YgbmV3IHJlcG9ydHMuPGJyPgorCTxicj4KKwlLZWVwIGNsaWNraW5nIG9uIHRoZSBtYXAgdG8gZ2V0IG5ldyByZXBvcnRzLiBUPGJyPgorCVRvIHJlbW92ZSBhIHJlcG9ydCBzaW1wbHkgY2xpY2sgdGhlIHJlbW92ZQorCWJ1dHRvbiBpbiB0aGUgcmVwb3J0IHdpbmRvdy48L2ZvbnQ+PC9wPgorCQorCTxwIERJUj0iTFRSIj48Yj40KSBSZW1lbWJlcmluZyBVc2VyIHByZWZlcmVuY2VzPC9iPjwvcD4KKwk8cCBESVI9IkxUUiI+PGZvbnQgc2l6ZT0iMiI+VGhlIFNURU0gcmVwb3J0IHZpZXdzIHVzZSBFY2xpcHNlIERpYWxvZ1NldHRpbmdzIHRvCisJYXV0b21hdGljYWxseSByZW1lbWJlciB1c2VyIHByZWZlcmVuY2VzLiBUaGlzIGZlYXR1cmUgaXMgYWx3YXlzIGVuYWJsZWQgYW5kCisJYmVnaW5zIGFzIHNvb24gYXMgeW91IGVuYWJsZSBhbnkgcmVwb3J0IHZpZXcuIFRoZSBwcmVmZXJlbmNlcyB0aGF0IGFyZQorCSZxdW90O3JlbWVtYmVyZWQmcXVvdDsgYXJlIHRoZSBtYXAgbG9jYXRpb25zIHRoZSB1c2VyIHdhcyBtb3N0IHJlY2VudGx5IG1vbml0b3JpbmcKKwl3aXRoIG9uZSBvciBtb3JlIHJlcG9ydCB2aWV3cy4gUHJlZmVyZW5jZXMgYXJlIHN0b3JlZCBpbmRlcGVuZGVudGx5IGZvciBlYWNoCisJdHlwZSBvZiByZXBvcnQgc28gdGhlIHN5c3RlbSB3aWxsIGFsbG93IChhbmQgcmVtZW1iZXIpIHRoYXQgdGhlIHVzZXIgd2lzaGVzCisJdG8gbW9uaXRvciwgZm9yIGV4YW1wbGUsIG9uZSBzZXQgb2YgbG9jYXRpb25zIHdpdGggVGltZSBTZXJpZXMgcmVwb3J0cyBhbmQKKwlhbm90aGVyIHNldCBvZiBsb2NhdGlvbnMgd2l0aCBQaGFzZSBTcGFjZSByZXBvcnRzLiBUaGUgdXNlcnMgcHJlZmVyZW5jZXMgYXJlCisJc3RvcmVkIG9uIGRpc2sgaW4gYSBkaXJlY3Rvcnk6PC9mb250PjwvcD4KKwk8L2ZvbnQ+CisJPGZvbnQgRkFDRT0iQXJpYWwiPgorCTxwIERJUj0iTFRSIj4uLi5ccnVudGltZS1zdGVtLnByb2R1Y3RcLm1ldGFkYXRhXC5wbHVnaW5zXG9yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0czwvcD4KKwk8L2ZvbnQ+CisJPGZvbnQgRkFDRT0iSGVsdiI+CisJPHAgRElSPSJMVFIiPjxmb250IHNpemU9IjIiPndoZXJlIHRoZSBkaXJlY3RvcnkgXHJ1bnRpbWUtc3RlbS5wcm9kdWN0IGlzIGxvY2F0ZWQgaW4gdGhlCisJc2FtZSBwYXJlbnQgZGlyZWN0b3J5IGFzIHRoZSB1c2VycyBTVEVNIGVjbGlwc2Ugd29ya3NwYWNlIChmb3IgZXhhbXBsZQorCWM6XHJ1bnRpbWUtc3RlbS5wcm9kdWN0KS48L2ZvbnQ+PC9wPgorCTxwIERJUj0iTFRSIj48Zm9udCBzaXplPSIyIj5QcmVmZXJlbmNlcyBmb3IgdGhlIFRpbWUgU2VyaWVzIHZpZXdzIGFyZSBzdG9yZWQgaW4gYSBmaWxlOjxicj4KKwlUaW1lU2VyaWVzX1ByZWZlcmVuY2VzLnR4dDxicj4KKwlQcmVmZXJlbmNlcyBmb3IgdGhlIFBoYXNlIFNwYWNlIHZpZXdzIGFyZSBzdG9yZWQgaW4gYSBmaWxlOjxicj4KKwlQaGFzZVNwYWNlX1ByZWZlcmVuY2VzLnR4dDwvZm9udD48L3A+CisJPHAgRElSPSJMVFIiPjxiPjUpIENvbmZpZ3VyaW5nIHRoZSBUaW1lU2VyaWVzIFJlcG9ydDwvYj48L3A+CisJPHAgRElSPSJMVFIiPjxmb250IHNpemU9IjIiPk9uIHRoZSBsb3dlciBsZWZ0IGhhbmQgc2lkZSBvZiBldmVyeSBUaW1lU2VyaWVzIFJlcG9ydCB2aWV3CisJd2luZG93IGFyZSB0d28gY29tYm8gYm94ZXMgb25lIGF0b3AgdGhlIG90aGVyLiBJZiBhIHNpbXVsYXRpb24gaXMgcnVubmluZywKKwl0aGUgdG9wIGNvbWJvIGJveCBhbGxvd3MgYSB1c2VyIHRvIHRha2UgZGF0YSBmcm9tIGRpZmZlcmVudCAmcXVvdDtkZWNvcmF0b3JzJnF1b3Q7CisJdGhhdCBleGlzdCBhdCBzZWxlY3RlZCBsb2NhdGlvbnMuIEluIG1vc3QgY2FzZXMgdGhlIHVzZXIgd2lsbCBiZSBydW5uaW5nCisJb25seSBvbmUgZGlzZWFzZSBhdCBhIHRpbWUgYW5kIHRoZXJlIHdpbGwgYmUgb25seSBvbmUgbG9jYXRpb24gZGVjb3JhdG9yIHRvCisJY2hvc2UgZnJvbSAodGhlIHJ1bm5pbmcgZGlzZWFzZSkuIEluIGdlbmVyYWwgb25lIGNhbiBjb25maWd1cmUgc2NlbmFyaW9zIGluCisJU1RFTSB0byBzaW11bHRhbmVvdXMgcnVuIG11bHRpcGxlIGRpc2Vhc2VzIGluIHdoaWNoIGNhc2Ugb25lIGNhbiBleGFtaW5lIHRoZQorCXN0YXRlIG9mIGVhY2ggZGlzZWFzZSBpbiB0dXJuIHZpYSB0aGlzIHRvIGNvbWJvIGJveC4gPC9mb250PiA8L3A+CisJPHAgRElSPSJMVFIiPjxmb250IHNpemU9IjIiPlRoZSBib3R0b20gY29tYm8gYm94IGlzIG5vdCB1c2VkIGJ5IHRoZSBUaW1lU2VyaWVzIFJlcG9ydC4gVGhlCisJYm90dG9tIGNvbWJvIGJveCBzaG93cyB0aGUgZGlmZmVyZW50ICZxdW90O2xhYmVscyZxdW90OyBwcm9jZXNzZWQgYnkgdGhlIHNlbGVjdGVkCisJZGVjb3JhdG9yLiBGb3IgYSBwYXJ0aWN1bGFyIGRpc2Vhc2UgbW9kZWwgdGhlc2UgbGFiZWxzIG1pZ2h0IDxpPmluY2x1ZGU8L2k+LAorCWZvciBleGFtcGxlLDwvZm9udD48L3A+CisJPHAgRElSPSJMVFIiPlMgLSB0aGUgcG9wdWxhdGlvbiBmcmFjdGlvbiZuYnNwOyBTdXNjZXB0aWJsZSAoMC4wICZsdDs9IFMgJmx0Oz0gMS4wKTwvcD4KKwk8cCBESVI9IkxUUiI+RSAtIHRoZSBwb3B1bGF0aW9uIGZyYWN0aW9uJm5ic3A7IEV4cG9zZWQgKDAuMCAmbHQ7PSBFICZsdDs9IDEuMCk8L3A+CisJPHAgRElSPSJMVFIiPkkgLSB0aGUgcG9wdWxhdGlvbiBmcmFjdGlvbiBJbmZlY3Rpb3VzICgwLjAgJmx0Oz0gSSAmbHQ7PSAxLjApPC9wPgorCTxwIERJUj0iTFRSIj5SIC0gdGhlIHBvcHVsYXRpb24gZnJhY3Rpb24gUmVjb3ZlcmVkICgwLjAgJmx0Oz0gUiAmbHQ7PSAxLjApIDwvcD4KKwk8cCBESVI9IkxUUiI+PGk+PGZvbnQgc2l6ZT0iMiI+UmF0aGVyIHRoYW4gZGlzcGxheSBvbmx5IGEgc2luZ2xlIHZhcmlhYmxlIG9yIGxhYmVsIFMsIEUsIEksCisJb3IgUiwgdGhlIFRpbWUgU2VyaWVzIHZpZXdlciBzaW11bHRhbmVvdXNseSBkaXNwbGF5cyBtdWx0aXBsZSBsYWJlbHMgZm9yIHRoZQorCXNlbGVjdGVkIGRlY29yYXRvciBpbiBjb25maWd1cmFibGUgY29sb3JzLiA8L2ZvbnQ+IDwvaT48Zm9udCBzaXplPSIyIj5TZWUgdGhlIGNvbG9yZWQgbGluZXMgaW4KKwlGaWd1cmUgMS4gQnkgZGVmYXVsdCB0aGUgbGFiZWxzIGRpc3BsYXllZCBpbiB0aGUgVGltZSBTZXJpZXMgdmlldyBhcmUgUywgRSwKKwlJLCBhbmQgUiBpbiBCbHVlLCBZZWxsb3csIFJlZCwgYW5kIEdyZWVuIHJlc3BlY3RpdmVseS4gSWYgdGhlc2UgbGFiZWxzIGRvCisJbm90IGV4aXN0IGluIHRoZSBzZWxlY3RlZCBkZWNvcmF0b3IgdGhlbiB0aGUgU1RFTSByZXBvcnQgdmlldyB3aWxsIGF0dGVtcHQKKwl0byByZW5kZXIgZXZlcnkgbGFiZWwgZm9yIHdoaWNoIHJlbGF0aXZlIHZhbHVlcyAoMC0mZ3Q7MSkgYXJlIGRlZmluZWQuIFRoZQorCWRlZmF1bHQgY29sb3IgKGJsdWUpIHdvdWxkIGJlIHVzZWQuPC9mb250PjwvcD4KKwk8cCBESVI9IkxUUiI+PGI+NikgQ29uZmlndXJpbmcgdGhlIExhYmVscyBhbmQgQ29sb3JzPC9iPjwvcD4KKwk8cCBESVI9IkxUUiI+PGZvbnQgc2l6ZT0iMiI+VG8gY29uZmlndXJlIG9yIGNoYW5nZSB0aGUgZGVmYXVsdCBsYWJlbHMgYW5kIGNvbG9ycyBkaXNwbGF5ZWQKKwlpbiB0aGUgVGltZSBTZXJpZXMgdmlldywgZ28gdG8gdGhlIHRvcCBtZW51IGJhciBhbmQgc2VsZWN0PC9mb250PjwvcD4KKwk8cCBESVI9IkxUUiI+PGZvbnQgc2l6ZT0iMiI+Jmd0O1dpbmRvdyZndDtwcmVmZXJlbmNlczwvZm9udD48L3A+CisJPHAgRElSPSJMVFIiPjxmb250IHNpemU9IjIiPmEgZGlhbG9nIHdpbGwgb3Blbi4gT24gdGhlIGxlZnQgaGFuZCBzaWRlIGV4cGFuZCAtJmd0O1NURU0gLSZndDsKKwlWaXN1YWxpemF0aW9uPC9mb250PjwvcD4KKwk8cCBESVI9IkxUUiI+PGZvbnQgc2l6ZT0iMiI+YW5kIGNsaWNrIG9uIHZpc3VhbGl6YXRpb24uIFRoZSBkaXNwbGF5ZWQgbGFiZWxzIGFuZCB0aGVpcgorCWFzc29jaWF0ZWQgY29sb3JzIG1heSBiZSBjaGFuZ2VkIGluIHRoaXMgZGlhbG9nLiBTZWUgRmlndXJlIDIgYmVsb3cuPC9mb250PjwvcD4KKwk8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMSIgd2lkdGg9IjYwJSI+CisJCTx0cj4KKwkJCTx0ZD4KKwkJCTxwIGFsaWduPSJjZW50ZXIiPgorCQkJPGltZyBib3JkZXI9IjAiIHNyYz0iaW1nL3JlcG9ydFByZWZlcmVuY2VzLmpwZyIgd2lkdGg9IjYwMCIgPjwvdGQ+CisJCTwvdHI+CisJCTx0cj4KKwkJCTx0ZD48Yj5GaWd1cmUgMzogVGhlIERlZmF1bHQgTGFiZWxzIGFuZCBDb2xvcnMgbWF5IGJlIGNvbmZpZ3VyZWQgaW4KKwkJCXRoZSB2aWV3IHByZWZlcmVuY2VzIDxpPihzZWUgdGV4dCkuPC9pPjwvYj48L3RkPgorCQk8L3RyPgorCTwvdGFibGU+CisJPHAgRElSPSJMVFIiPjxpPjxmb250IHNpemU9IjIiPlBsZWFzZSBub3RlLCB5b3UgbXVzdCBzcGVjaWZ5IG9ubHkgdmFsaWQgbGFiZWwgdmFsdWVzIGZvciBhCisJcnVubmluZyBtb2RlbC4gSWYgeW91IHR5cGUgYSBsYWJlbCBuYW1lIHRoYXQgZG9lcyBub3QgZXhpc3QgKGUuZy4sIFgpIHRoZQorCVJlcG9ydCBWaWV3ZXIgd2lsbCBub3QgZmluZCB0aGF0IGxhYmVsIG9yIGFzc29jaWF0ZWQgdmFsdWVzIHRvIHBsb3QuIElmIHlvdQorCWFyZSB1c2luZyBvbmUgb2YgU1RFTXMgYnVpbHQgaW4gTW9kZWxzIGl0IHdpbGwgbm90IGJlIG5lY2Vzc2FyeSB0byBjaGFuZ2UKKwl0aGVzZSBkZWZhdWx0IHZhbHVlcy48L2ZvbnQ+PC9pPjwvcD4KKwk8cCBESVI9IkxUUiI+PGI+NykgQ29uZmlndXJpbmcgdGhlIFBoYXNlU3BhY2UgUmVwb3J0PC9iPjwvcD4KKwk8cCBESVI9IkxUUiI+PGZvbnQgc2l6ZT0iMiI+T24gdGhlIGxvd2VyIGxlZnQgaGFuZCBzaWRlIG9mIGV2ZXJ5IFBoYXNlU3BhY2UKKwlSZXBvcnQgdmlldyB3aW5kb3cgYXJlIGZvdXIgY29tYm8gYm94ZXMuIFRoZSBsZWZ0IGhhbmQgcGFpciAob25lIGF0b3AgdGhlCisJb3RoZXIpIGRldGVybWluZSB0aGUgeS1heGlzIHZhbHVlIGRpc3BsYXllZC4gVGhlIHJpZ2h0IGhhbmQgcGFpciAob25lIGF0b3AKKwl0aGUgb3RoZXIpIGRldGVybWluZSB0aGUgeC1heGlzIHZhbHVlIGRpc3BsYXllZC4uIElmIGEgc2ltdWxhdGlvbiBpcworCXJ1bm5pbmcsIGJvdGggdG9wIGNvbWJvIGJveGVzIGFsbG93cyBhIHVzZXIgdG8gdGFrZSBkYXRhIGZyb20gZGlmZmVyZW50CisJJnF1b3Q7ZGVjb3JhdG9ycyZxdW90OyB0aGF0IGV4aXN0IGF0IHNlbGVjdGVkIGxvY2F0aW9ucy4gSW4gbW9zdCBjYXNlcyB0aGUgdXNlciB3aWxsCisJYmUgcnVubmluZyBvbmx5IG9uZSBkaXNlYXNlIGF0IGEgdGltZSBhbmQgdGhlcmUgd2lsbCBiZSBvbmx5IG9uZSBsb2NhdGlvbgorCWRlY29yYXRvciB0byBjaG9zZSBmcm9tICh0aGUgcnVubmluZyBkaXNlYXNlKS4gVGhlIHR3byBib3R0b20gY29tYm8gYm94ZXMKKwlhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgYW1vbmcgdGhlIGRpZmZlcmVudCAmcXVvdDtsYWJlbHMmcXVvdDsgcHJvY2Vzc2VkIGJ5IHRoZQorCXNlbGVjdGVkIGRlY29yYXRvci4gQXMgZGlzY3Vzc2VkIGFib3ZlLCBmb3IgYSBwYXJ0aWN1bGFyIGRpc2Vhc2UgbW9kZWwgdGhlc2UKKwlsYWJlbHMgbWlnaHQgPGk+CisJaW5jbHVkZTwvaT4sIGZvciBleGFtcGxlLCBTLCBFLCBJLCBhbmQgUi4mbmJzcDsgVGhlIFBoYXNlU3BhY2UgdmlldyBhbGxvd3MKKwlvbmUgdG8gdmlldyB0aGUgJnF1b3Q7dHJhamVjdG9yeSZxdW90OyBvZiBvbmUgc3lzdGVtIHZhcmlhYmxlIHBsb3R0ZWQgYWdhaW5zdCBhbm90aGVyCisJaW4gYSBwaGFzZSBzcGFjZSBvZiB0d28gdmFyaWFibGVzLiBUeXBpY2FsbHkgZXBpZGVtaW9sb2dpc3Qgd2lsbCBwbG90IEkodCkKKwl2cyBTKHQpLiBOb3QgdGhhdCB0aW1lIGlzIG5vdCBhbiBleHBsaWNpdCBheGlzIGxhYmVsIGluIHRoaXMgdmlldy4gUmF0aGVyCisJdGhlIHJlc3VsdGluZyBjdXJ2ZSByZXByZXNlbnRzIHRoZSB0cmFqZWN0b3J5IG9mIEkgdnMgUyBpbiB0aW1lLjwvZm9udD48L3A+CisJPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHNwYWNpbmc9IjEiIHdpZHRoPSI2MCUiPgorCQk8dHI+CisJCQk8dGQ+CisJCQk8cCBhbGlnbj0iY2VudGVyIj48Zm9udCBGQUNFPSJIZWx2Ij4KKwkJCTxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9QaGFzZVNwYWNlVmlldy5qcGciIHdpZHRoPSIxMDAwIiBoZWlnaHQ9IjgwMCIgPjwvZm9udD48L3RkPgorCQk8L3RyPgorCQk8dHI+CisJCQk8dGQ+CisJCQk8cCBhbGlnbj0iY2VudGVyIj48Yj5GaWd1cmUgNDogPGZvbnQgRkFDRT0iSGVsdiI+UnVubmluZyB0aGUgYnVpbHQKKwkJCWluIEphcGFuIFNjZW5hcmlvIHdpdGggdGhlIFBoYXNlU3BhY2UgdmlldyA8YnI+CisJCQlkaXNwbGF5ZWQgYmVsb3cgdGhlIG1hcC48L2ZvbnQ+PC9iPjwvdGQ+CisJCTwvdHI+CisJPC90YWJsZT4KKwk8cCBESVI9IkxUUiI+Jm5ic3A7IDwvcD4KKwk8cCBESVI9IkxUUiI+PGI+OCkgRm9yIENvZGUgRGV2ZWxvcGVyczwvYj48L3A+CisJPHAgRElSPSJMVFIiPjxmb250IHNpemU9IjIiPkFsbCBvZiB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBSZXBvcnQgVmlld2VycworCW1heSBiZSBmb3VuZCBpbiB0aGUgU1RFTSBwYWNrYWdlOjwvZm9udD48L3A+CisJPC9mb250Pjxmb250IEZBQ0U9IkNvdXJpZXIgTmV3IiBzaXplPSIyIj4KKwk8cCBESVI9IkxUUiI+b3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzPC9wPgorCTwvZm9udD4KKwk8cD4mbmJzcDs8L3A+CisJPHA+Jm5ic3A7PC9wPgorPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL3NjZW5hcmlvY29tcGFyaXNvbnZpZXcuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3Mvc2NlbmFyaW9jb21wYXJpc29udmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDJiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL3NjZW5hcmlvY29tcGFyaXNvbnZpZXcuaHRtbApAQCAtMCwwICsxLDY0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorCis8aHRtbCB4bWxuczp2PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCIgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorCis8dGl0bGU+aGVscDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGgxPlNjZW5hcmlvIENvbXBhcmlzb24gVmlldzwvaDE+Cis8cCBkaXI9Imx0ciI+VGhlIDxlbT5TY2VuYXJpbyBDb21wYXJpc29uIFZpZXc8L2VtPiBhbGxvd3MgYSB1c2VyIHRvIGNvbXBhcmUgdHdvIGRhdGEgc2V0cworYW5kIHRvIG1lYXN1cmUgdGhlIHRpbWUgdmFyeWluZyBSb290IE1lYW4gU3F1YXJlIChSTVMpIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKK2FnZ3JlZ2F0ZSBlcGlkZW1pYyBkYXRhLiA8YnI+CitUaGUgZGF0YSBtYXkgYmUgcmVhbCBkYXRhIG9yIHRoZSByZXN1bHRzIGZyb20gb25lIG9yIG1vcmUgY29tcGxldGVkIHNpbXVsYXRpb25zLgorVGhlIGFsZ29yaXRobSB1c2VkIHRvIG1lYXN1cmUgdGhlIFJNUyBkaWZmZXJlbmNlCis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6U3ltYm9sIj5kPC9zcGFuPjxzdWI+YSxiPC9zdWI+KHQpIGJldHdlZW4gdHdvIHNjZW5hcmlvcworJiM4MjE2O2EmIzgyMTc7IGFuZCAmIzgyMTY7YiYjODIxNzsgPGJyPgorYXQgdGltZSB0IGF2ZXJhZ2VkIG92ZXIgYWxsIGxvY2F0aW9ucyAoaSkgaXM6PHAgY2xhc3M9Ik1zb05vcm1hbCI+Cis8aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWcvY29tcGFyc29uRXF1YXRpb24uanBnIiB3aWR0aD0iNTk3IiBoZWlnaHQ9IjE0OSI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzwvcD4KKzxwIGNsYXNzPSJNc29Ob3JtYWwiPk5vdGUgdGhhdCBlYWNoIGxvY2F0aW9uICYjODIxNjs8aT5pPC9pPiYjODIxNzsgaXMgd2VpZ2h0ZWQgYnkgdGhlIGxvY2FsCitwb3B1bGF0aW9uIFA8c3ViPmk8L3N1Yj4gc28gbW9yZSBwb3B1bG91cyBsb2NhdGlvbnMgY29udHJpYnV0ZSBtb3JlIHRvIHRoZQorbWVhc3VyZW1lbnQuIFRoZSBtZXRob2QgYXNzdW1lcyB0aGUgc2NlbmFyaW9zIGEsYiBlYWNoIGNvdmVyIHRoZSBzYW1lIHNldCBvZgorbG9jYXRpb24ge2l9IHdoaWNoIGlzIHRydWUgaW4gdGhpcyBjYXNlLiBUaGUgUk1TIGRpZmZlcmVuY2UgaXMgZXZhbHVhdGVkIG9ubHkgYXQKK2xvY2F0aW9ucyB0aGF0IGhhdmUgYSBub24temVybyByYXRlIG9mIGluZmVjdGlvbiBhdCBzb21lIHRpbWUgdC4gSWYsIGZvcgorZXhhbXBsZSwgYSBjb21wYXJpc29uIGlzIG1hZGUgb2YgdHdvIHNjZW5hcmlvcyBpbnZvbHZpbmcgdGhlIGVudGlyZSBwbGFuZXQgYnV0Cit0aGUgZXBpZGVtaWMgaW4gcXVlc3Rpb24gaXMgbG9jYWxpemVkIHRvIGEgc21hbGwgcmVnaW9uIChlLmcuLCB0aGUgc3RhdGUgb2YKK1Zlcm1vbnQpLCBvbmUgb25seSB3YW50cyB0byBjb21wYXJlIHRoZSBtb2RlbCB0byB0aGUgcmVmZXJlbmNlIG92ZXIgdGhvc2UKK2xvY2F0aW9ucyB3aGVyZSB0aGUgZXBpZGVtaWMgYWN0dWFsbHkgdG9vayBwbGFjZS4gSW5jbHVkaW5nIGxvY2F0aW9ucyB3aXRoIEkgPSAwPGZvbnQgZmFjZT0iU3ltYm9sIj4mcXVvdDs8L2ZvbnQ+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj50PC9mb250Pgord291bGQKK2FydGlmaWNpYWxseSByZWR1Y2UgdGhlIGVzdGltYXRlZCBSTVMgZXJyb3IuPC9wPgorPHAgY2xhc3M9Ik1zb05vcm1hbCI+RmluYWxseSB3ZSBub3RlIHRoYXQgdGhlIGNvbXBhcmlzb24gaXMgbWFkZSBpbmNsdWRpbmcgb25seQordGhlIFMgYW5kIEkgc3RhdGVzLiBUaGUgYWxnb3JpdGhtIGNvbXBhcmVzIHRoZXNlIHR3byBkaXNlYXNlIHN0YXRlIHZhcmlhYmxlcyB0bworYWxsb3cgZm9yIGNvbXBhcmlzb25zIGJldHdlZW4gZGlmZmVyZW50IHR5cGVzIG9mIG1vZGVscy4gSW4gYSByZWFsIGVwaWRlbWljCitzY2VuYXJpbywgb25lIG1heSB3aXNoIHRvIGV2YWx1YXRlIChmb3IgZXhhbXBsZSkgU0ksIFNJUiBhbmQgU0VJUiBtb2RlbHMgZm9yIHRoZQorc2FtZSBpbmZlY3Rpb3VzIGRpc2Vhc2UuIFNpbmNlIHRoZSBTIGFuZCBJIHN0YXRlcyBhcmUgY29tbW9uIHRvIGFsbCwgbWVhc3VyaW5nCit0aGUgUk1TIGRpZmZlcmVuY2UgaW4gdGhpcyB3YXkgYWxsb3dzIGZvciBjb21wYXJpc29uIGFjcm9zcyBkaWZmZXJlbnQgdHlwZXMgb2YKK21vZGVscy4gSW4gY2FzZXMgd2hlcmUgb25seSB0aGUgaW5mZWN0aW91cyBvciBwZXJoYXBzIGNoYW5nZSBpbiBpbmZlY3Rpb3VzPHNwYW4gc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZTsgdG9wOiAyLjBwdCI+Cis8Zm9udCBmYWNlPSJTeW1ib2wiPkQ8L2ZvbnQ+SSA8L3NwYW4+PCEtLVtpZiBndGUgbXNvIDldPjwhW2VuZGlmXS0tPmlzCitrbm93biwgUk1TIGNvbXBhcmlzb24gbWF5IGFsc28gYmUgbWFkZSBiYXNlZCBvbmx5IG9uIHRoZSBJIHN0YXRlLjwvcD4KKzxwPiZuYnNwOzxwPlRvIHVzZSB0aGUgU2NlbmFyaW8gQ29tcGFyaXNvbiB2aWV3OjxvbD4KKwk8bGk+RW50ZXIgdGhlIDxhIGhyZWY9Ii4uL3BlcnNwZWN0aXZlcy9hbmFseXNpcy5odG1sIj5BbmFseXNpcyBQZXJzcGVjdGl2ZTwvYT48L2xpPgorCTxsaT5DbGljayBvbiB0aGUgU2NlbmFyaW8gQ29tcGFyaXNvbiBUYWI8L2xpPgorCTxsaT5Vc2UgdGhlIFNlbGVjdCBGb2xkZXIgYnV0dG9ucyB0byBjaG9zZSB0aGUgZm9sZGVycyBjb250YWluaW5nIHRoZSBkYXRhCisJeW91IHdpc2ggdG8gY29tcGFyZS4gVGhlIGZpbGVzIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcKKwk8YSBocmVmPSJjc3Zsb2dnZXJ2aWV3Lmh0bWwiPiZuYnNwO2Zvcm1hdC48L2E+PC9saT4KKwk8bGk+Q2xpY2sgQW5hbHl6ZTwvbGk+CisJPGxpPlRoZSB0aW1lIHZhcnlpbmcgUk1TIGRpZmZlcmVuY2Ugd2lsbCBhcHBlYXIgaW4gdGhlIGNoYXJ0IGFuZCB0aGUKKwlpbnRlZ3JhdGVkIFJNUyBkaWZmZXJlbmNlIHdpbGwgYXBwZWFyIGluIHRoZSBjb25zb2xlIGF0IHRoZSBib3R0b20gb2YgdGhlCisJdmlldy48L2xpPgorPC9vbD4KKzwvcD4KKzxwPiZuYnNwOzwvcD4KKzxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9TY2VuYXJpb0NvbXBhcmlzb24uanBnIiB3aWR0aD0iMTAwMCIgaGVpZ2h0PSI4MDAiPjxwPjYuCitJbiB0aGlzIChvciBpbiBhbnkgU1RFTSBjaGFydCkgdmlldywgdG8gdG9nZ2xlIGJldHdlZW4gYSBMaW5lYXIgYW5kIExvZyBzY2FsZQorc2ltcGx5IHJpZ2h0IGNsaWNrIG9uIHRoZSBjaGFydCBhbmQgc3BlY2lmeSB5b3UgcGxvdCBwcmVmZXJlbmNlcyBpbiB0aGUgZGlhbG9nCit0aGF0PGJyPgorYXBwZWFycyAoc2VlIGJlbG93KS48L3A+Cis8cD48aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWcvU2NlbmFyaW9Db21wYXJpc29uQi5qcGciIHdpZHRoPSIxMDAwIiBoZWlnaHQ9IjgwMCI+Cis8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL3NjZW5hcmlvc3ZpZXcuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3Mvc2NlbmFyaW9zdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyN2NjNWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL3NjZW5hcmlvc3ZpZXcuaHRtbApAQCAtMCwwICsxLDIxIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorCis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+aGVscDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGgxPlNjZW5hcmlvcyBWaWV3PC9oMT4KKzxwPlRoZSA8ZW0+U2NlbmFyaW9zIFZpZXc8L2VtPiBkaXNwbGF5cyB0aGUgPGEKKwlocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI3NjZW5hcmlvIj4gU2NlbmFyaW9zPC9hPgordGhhdCBhcmUgYXZhaWxhYmxlIHRvIHN0YXJ0IGEgU2ltdWxhdGlvbi4gVGhlIGF2YWlsYWJsZSA8YQorCWhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjc2NlbmFyaW8iPiBTY2VuYXJpb3M8L2E+CithcmUgb3JnYW5pemVkIGluIGEgdHJlZS4gVGhvc2UgbGlzdGVkIHVuZGVyICJTVEVNIiBhcmUgYnVpbHQtaW4gdG8gU1RFTS48L3A+Cis8cD5BIFNpbXVsYXRpb24gY2FuIGJlIHN0YXJ0ZWQgYnkgZG91YmxlLWNsaWNraW5nIG9uIG9uZSBvZiB0aGUKK2xpc3RlZCA8YSBocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI3NjZW5hcmlvIj4KK1NjZW5hcmlvczwvYT4sIG9yIGJ5IGNsaWNraW5nIG9uIHRoZSBncmVlbiB0cmlhbmdsZSBpbiB0aGUgbWVudSBiYXIuIDxpbWcKKwlzcmM9ImltZy9zY2VuYXJpb3N2aWV3LnBuZyIgLz4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3Mvc2VxdWVuY2Vyc3ZpZXcuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3Mvc2VxdWVuY2Vyc3ZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDkzNWUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9zZXF1ZW5jZXJzdmlldy5odG1sCkBAIC0wLDAgKzEsMjQgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+CisKKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5oZWxwPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8aDE+U2VxdWVuY2VycyBWaWV3PC9oMT4KKzxwPlRoZSA8ZW0+U2VxdWVuY2VycyBWaWV3PC9lbT4gZGlzcGxheXMgdGhlIDxhCisJaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNzZXF1ZW5jZXIiPiBTZXF1ZW5jZXJzPC9hPgordGhhdCBhcmUgYXZhaWxhYmxlIGZvciB1c2UgaW4gPGEKKwlocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI3NjZW5hcmlvIj4gU2NlbmFyaW9zPC9hPi4KK1RoZSBhdmFpbGFibGUgPGEgaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNzZXF1ZW5jZXIiPgorU2VxdWVuY2VyczwvYT4gYXJlIG9yZ2FuaXplZCBpbiBhIHRyZWUuIFRob3NlIGxpc3RlZCB1bmRlciAiU1RFTSIgYXJlCitidWlsdC1pbiB0byBTVEVNLjwvcD4KKzxwPlRoZSB2aWV3IHN1cHBvcnRzICJkcmFnIiBzdWNoIHRoYXQgYSA8YQorCWhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjc2VxdWVuY2VyIj4gU2VxdWVuY2VyPC9hPgorY2FuIGJlIGRyYWdnZWQgZnJvbSB0aGlzIHZpZXcgYW5kICJkcm9wcGVkIiBpbnRvIGFuIG9wZW4gU2NlbmFyaW8KK2VkaXRvci48L3A+Cis8aW1nIHNyYz0iaW1nL3NlcXVlbmNlcnN2aWV3LmpwZyIgLz4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvdGFza3N2aWV3Lmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL3Rhc2tzdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OTQwNTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL3Rhc2tzdmlldy5odG1sCkBAIC0wLDAgKzEsMTMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+CisKKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5oZWxwPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8aDE+VGFza3MgVmlldzwvaDE+Cis8cD5UaGlzIGhlbHAgdGV4dCBoYXMgbm90IHlldCBiZWVuIHdyaXR0ZW4uIFZvbHVudGVlcnMgbmVlZGVkIQorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy92aWV3c292ZXJ2aWV3Lmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL3ZpZXdzb3ZlcnZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTZjNjExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy92aWV3c292ZXJ2aWV3Lmh0bWwKQEAgLTAsMCArMSw0NyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPk92ZXJ2aWV3PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8aDE+Vmlld3M8L2gxPgorPHA+VGhlIFNURU0gaW50ZXJmYWNlIGluY2x1ZGVzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCAiVmlld3MiLiBFYWNoCit2aWV3IGRpc3BsYXlzIGEgcGFydGljdWxhciBhc3BlY3Qgb2YgdGhlIHN0YXRlIG9mIFNURU0sIGl0cyBjb21wb25lbnRzLAorb3Igb2YgYW4gYWN0aXZlIFNpbXVsYXRpb24uIFNvbWUgdmlld3MgaGF2ZSBmdW5jdGlvbnMgdGhhdCBhbGxvdworU2ltdWxhdGlvbnMgdG8gYmUgY3JlYXRlZCBhbmQgY29udHJvbGxlZC4KKzx1bD4KKyAgICA8bGk+PGEgaHJlZj0iYWN0aXZlc2ltdWxhdGlvbnN2aWV3Lmh0bWwiPkFjdGl2ZSBTaW11bGF0aW9uczwvYT48L2xpPgorCTxsaT48YSBocmVmPSJjb250cm9sdmlldy5odG1sIj5Db250cm9sPC9hPjwvbGk+CisJPGxpPjxhIGhyZWY9ImNzdmxvZ2dlcnZpZXcuaHRtbCI+Q1NWIExvZ2dlciBWaWV3PC9hPjwvbGk+CisJPGxpPjxhIGhyZWY9ImRlY29yYXRvcnN2aWV3Lmh0bWwiPkRlY29yYXRvcnM8L2E+PC9saT4KKwk8bGk+PGEgaHJlZj0iZGlzZWFzZXNzdmlldy5odG1sIj5EaXNlYXNlczwvYT48L2xpPgorCTxsaT48YSBocmVmPSJkdWJsaW5jb3JlcG9wdXAuaHRtbCI+RHVibGluIENvcmUgUG9wLXVwPC9hPjwvbGk+CisJPGxpPjxhIGhyZWY9ImVwaWRlbWljdmlldy5odG1sIj5FcGlkZW1pYzwvYT48L2xpPgorCTxsaT48YSBocmVmPSJlcnJvcl9sb2cuaHRtbCI+RXJyb3IgTG9nPC9hPjwvbGk+CisJPGxpPjxhIGhyZWY9ImVzdGltYXRvcnZpZXcuaHRtbCI+RXN0aW1hdG9yPC9hPjwvbGk+CisJPGxpPjxhIGhyZWY9ImdlLmh0bWwiPkdvb2dsZSBFYXJ0aDwvYT48L2xpPgorCTxsaT48YSBocmVmPSJncmFwaHN2aWV3Lmh0bWwiPkdyYXBoczwvYT48L2xpPgorCTxsaT48YSBocmVmPSJseWFwdW5vdnZpZXcuaHRtbCI+THlhcHVub3Y8L2E+PC9saT4KKwk8bGk+PGEgaHJlZj0ibWFwdmlldy5odG1sIj5NYXA8L2E+PC9saT4KKwk8bGk+PGEgaHJlZj0ibW9kZWxzdmlldy5odG1sIj5Nb2RlbHM8L2E+PC9saT4KKwk8bGk+PGEgaHJlZj0icHJvamVjdHZpZXcuaHRtbCI+UHJvamVjdDwvYT48L2xpPgorCTxsaT48YSBocmVmPSJwcm9wZXJ0aWVzdmlldy5odG1sIj5Qcm9wZXJ0aWVzPC9hPjwvbGk+CisJPGxpPjxhIGhyZWY9InJlcG9ydHZpZXcuaHRtbCI+UmVwb3J0PC9hPjwvbGk+CisJPGxpPjxhIGhyZWY9InNjZW5hcmlvY29tcGFyaXNvbnZpZXcuaHRtbCI+U2NlbmFyaW8gQ29tcGFyaXNvbjwvYT48L2xpPgorCTxsaT48YSBocmVmPSJzY2VuYXJpb3N2aWV3Lmh0bWwiPlNjZW5hcmlvczwvYT48L2xpPgorCTxsaT48YSBocmVmPSJzZXF1ZW5jZXJ2aWV3Lmh0bWwiPlNlcXVlbmNlcnM8L2E+PC9saT4KKwk8bGk+PGEgaHJlZj0idGFza3N2aWV3Lmh0bWwiPlRhc2tzPC9hPjwvbGk+CisKKzwvdWw+Cis8cD5JbiBhZGRpdGlvbiwgdmlld3MgdGhhdCBsaXN0IFNpbXVsYXRpb24gY29tcG9uZW50cyAoPGEKKwlocmVmPSJkZWNvcmF0b3Jzdmlldy5odG1sIj5EZWNvcmF0b3JzPC9hPiwgPGEgaHJlZj0iZ3JhcGhzdmlldy5odG1sIj5HcmFwaHM8L2E+LAorPGEgaHJlZj0ibW9kZWxzdmlldy5odG1sIj5Nb2RlbHM8L2E+LCA8YSBocmVmPSJzY2VuYXJpb3N2aWV3Lmh0bWwiPlNjZW5hcmlvczwvYT4KK2FuZCA8YSBocmVmPSJzZXF1ZW5jZXJ2aWV3Lmh0bWwiPlNlcXVlbmNlcnM8L2E+KSBhbHNvIHN1cHBvcnQgYW4gaW5zdGFudAorInBvcC11cCIgZGlzcGxheSBvZiB0aGUgPGEgaHJlZj0iaHR0cDovL2R1YmxpbmNvcmUub3JnLyI+RHVibGluIENvcmU8L2E+CittZXRhZGF0YSBvZiB0aGUgY29tcG9uZW50IGRpc3BsYXllZCBpbiB0aGUgdmlldy4gU2VlIDxhCisJaHJlZj0iZHVibGluY29yZXBvcHVwLmh0bWwiPkR1YmxpbiBDb3JlIFBvcC11cDwvYT4gZm9yIG1vcmUgZGV0YWlscy48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvZGlzZWFzZXdpemFyZC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL2Rpc2Vhc2V3aXphcmQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTc2ODUwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL2Rpc2Vhc2V3aXphcmQuaHRtbApAQCAtMCwwICsxLDMxIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5OZXcgRGlzZWFzZSBXaXphcmQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8cD5UaGUgPGVtPk5ldyBEaXNlYXNlIFdpemFyZDwvZW0+IGlzIHVzZWQgdG8gY3JlYXRlIGFuZCBkZWZpbmUgdGhlCitwcm9wZXJ0aWVzIG9mIGEgbmV3IERpc2Vhc2UuIEEgZmlsZSBuYW1lIGZvciB0aGUgbmV3IGluc3RhbmNlIGFsb25nIHdpdGggdGhlIERpc2Vhc2UgTmFtZSBtdXN0IGJlIHByb3ZpZGVkIGluIG9yZGVyIHRvIGJlCithYmxlIHRvIGNsaWNrICJOZXh0IiBvciAiRmluaXNoIi48L3A+Cis8cD5QYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNwZWNpZmllZCBkZXBlbmRzIHVwb24gdGhlIHBhcnRpY3VsYXIgZGlzZWFzZSBtb2RlbCBzZWxlY3RlZCBpbiB0aGUgRGlzZWFzZSBNb2RlbCBkcm9wLWRvd24uIAorRm9yIGV4YW1wbGUsIGZvciBhbiBTSSBtb2RlbCwgdGhlIHBhcmFtZXRlcnMgYXJlOgorPHVsPgorCTxsaT5EaXNlYXNlIE5hbWU8L2xpPgorCTxsaT5Qb3B1bGF0aW9uOiBpLmUuLCBodW1hbjwvbGk+CisJPGxpPlRpbWUgUGVyaW9kIChUUCk6IEluIG1pbGxpc2Vjb25kczwvbGk+CisJPGxpPkZyZXF1ZW5jeSBEZXBlbmRlbnQ6IFllcyBvciBObzwvbGk+CisJPGxpPlJlZmVyZW5jZSBQb3AgRGVuc2l0eTogUE0vU1EgS008L2xpPgorCTxsaT5UcmFuc21pc3Npb24gUmF0ZSAoJkJldGE7KTwvbGk+IAorCTxsaT5Ob24tTGluZWFyaXR5IENvZWZmaWNpZW50OiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLjAgPC9saT4KKwk8bGk+SW5mZWN0aW91cyBSZWNvdmVyeSBSYXRlICgmZ2FtbWE7KTogUE0vVFAqPC9saT4KKwk8bGk+SW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZSAoJm11OyAmaW90YTspOiBQTS9UUCo8L2xpPgorCTxsaT5DaGFyYWN0ZXJpc3RpYyBNaXhpbmcgRGlzdGFuY2U6IEluIGtpbG9tZXRlcnM8L2xpPgorCTxsaT5Sb2FkLk5ldC5JbmYuUHJvcG9ydGlvbjogRnJhY3Rpb24gcGVyIFJvYWQ8L2xpPgorPC91bD48L3A+CisKKzxpbWcgc3JjPSJpbWcvZGlzZWFzZXdpemFyZDEuanBnIiAvPgorPGltZyBzcmM9ImltZy9kaXNlYXNld2l6YXJkMi5qcGciIC8+Cis8aW1nIHNyYz0iaW1nL2Rpc2Vhc2Vwcm9wZXJ0aWVzLmpwZyIgLz4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvZXhwZXJpbWVudHdpemFyZC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL2V4cGVyaW1lbnR3aXphcmQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTJiMjY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL2V4cGVyaW1lbnR3aXphcmQuaHRtbApAQCAtMCwwICsxLDEzIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5OZXcgRXhwZXJpbWVudDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPlRoZSA8ZW0+TmV3IEV4cGVyaW1lbnQgV2l6YXJkPC9lbT4gaXMgdXNlZCB0byBjcmVhdGUgYW5kIGRlZmluZSB0aGUKK3Byb3BlcnRpZXMgb2YgYSBuZXcgPGEgaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNleHBlcmltZW50Ij4gRXhwZXJpbWVudDwvYT4uCitBIG5hbWUgZm9yIHRoZSBFeHBlcmltZW50IG11c3QgYmUgcHJvdmlkZWQgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBjbGljayAiTmV4dCIgb3IgIkZpbmlzaCIuPC9wPgorPGltZyBzcmM9ImltZy9leHBlcmltZW50d2l6YXJkMS5qcGciIC8+Cis8aW1nIHNyYz0iaW1nL2V4cGVyaW1lbnR3aXphcmQyLmpwZyIgLz4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvZ3JhcGh3aXphcmQuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9ncmFwaHdpemFyZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NmFiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvZ3JhcGh3aXphcmQuaHRtbApAQCAtMCwwICsxLDIyIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5OZXcgR3JhcGg8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8cD5UaGUgPGVtPk5ldyBHcmFwaCBXaXphcmQ8L2VtPiBpcyB1c2VkIHRvIGNyZWF0ZSBhbmQgZGVmaW5lIHRoZQorcHJvcGVydGllcyBvZiBhIG5ldyA8YSBocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI2dyYXBoIj4gR3JhcGg8L2E+LgorQSBuYW1lIGZvciB0aGUgR3JhcGggbXVzdCBiZSBwcm92aWRlZCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGNsaWNrICJOZXh0IiBvciAiRmluaXNoIi48L3A+Cis8cD5Qcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHNwZWNpZmllZCBkZXBlbmRzIHVwb24gdGhlIHNvdXJjZSBzZWxlY3RlZCBpbiB0aGUgZHJvcC1kb3duLiBGb3IgYSBzcXVhcmUgbGF0dGljZSBncmFwaCwKK3RoZSBwcm9wZXJ0aWVzIGFyZToKKzx1bD48bGk+U291cmNlOiBEcm9wLWRvd24gbWVudSBzZWxlY3Rpb248L2xpPgorCTxsaT5YIFNpemUgKFVuaXRzKTwvbGk+CisJPGxpPlkgU2l6ZSAoVW5pdHMpPC9saT4KKwk8bGk+TmVhcmVzdCBOZWlnaGJvcnM6IFllcyBvciBObzwvbGk+CisJPGxpPk5leHQgTmVhcmVzdCBOZWlnaGJvcnM6IFllcyBvciBObzwvbGk+CisJPGxpPlBlcmlvZGljIEJvdW5kYXJpZXM6IFllcyBvciBObzwvbGk+Cis8L3VsPjwvcD4KKzxpbWcgc3JjPSJpbWcvZ3JhcGh3aXphcmQxLmpwZyIgLz4KKzxpbWcgc3JjPSJpbWcvZ3JhcGh3aXphcmQyLmpwZyIgLz4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2Rpc2Vhc2Vwcm9wZXJ0aWVzLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvZGlzZWFzZXByb3BlcnRpZXMuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZTVhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2Rpc2Vhc2Vwcm9wZXJ0aWVzLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2Rpc2Vhc2V3aXphcmQxLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvZGlzZWFzZXdpemFyZDEuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZWNmODgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2Rpc2Vhc2V3aXphcmQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2Rpc2Vhc2V3aXphcmQyLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvZGlzZWFzZXdpemFyZDIuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNWI4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2Rpc2Vhc2V3aXphcmQyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2V4cGVyaW1lbnR3aXphcmQxLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvZXhwZXJpbWVudHdpemFyZDEuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOGUyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2V4cGVyaW1lbnR3aXphcmQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2V4cGVyaW1lbnR3aXphcmQyLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvZXhwZXJpbWVudHdpemFyZDIuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyM2E1NWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2V4cGVyaW1lbnR3aXphcmQyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2dyYXBod2l6YXJkMS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2dyYXBod2l6YXJkMS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI4MDlkMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvZ3JhcGh3aXphcmQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2dyYXBod2l6YXJkMi5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2dyYXBod2l6YXJkMi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjYTM1MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvZ3JhcGh3aXphcmQyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2luZmVjdG9ycHJvcGVydGllcy5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2luZmVjdG9ycHJvcGVydGllcy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkMTZmZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvaW5mZWN0b3Jwcm9wZXJ0aWVzLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2luZmVjdG9yd2l6YXJkMS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2luZmVjdG9yd2l6YXJkMS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyYjliOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvaW5mZWN0b3J3aXphcmQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2luZmVjdG9yd2l6YXJkMi5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL2luZmVjdG9yd2l6YXJkMi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3YTU1NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvaW5mZWN0b3J3aXphcmQyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL21vZGVsd2l6YXJkMS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL21vZGVsd2l6YXJkMS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0ODYzMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvbW9kZWx3aXphcmQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL21vZGVsd2l6YXJkMi5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL21vZGVsd2l6YXJkMi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVkYjJiOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvbW9kZWx3aXphcmQyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL21vZGlmaWVyd2l6YXJkMS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL21vZGlmaWVyd2l6YXJkMS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0YjcxMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvbW9kaWZpZXJ3aXphcmQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL21vZGlmaWVyd2l6YXJkMi5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL21vZGlmaWVyd2l6YXJkMi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2ZTEyZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvbW9kaWZpZXJ3aXphcmQyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL21vZGlmaWVyd2l6YXJkMy5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL21vZGlmaWVyd2l6YXJkMy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwNzI1ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvbW9kaWZpZXJ3aXphcmQzLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL21vZGlmaWVyd2l6YXJkNC5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL21vZGlmaWVyd2l6YXJkNC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlhNjE3YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvbW9kaWZpZXJ3aXphcmQ0LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL21vZGlmaWVyd2l6YXJkNS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL21vZGlmaWVyd2l6YXJkNS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwYjM5NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvbW9kaWZpZXJ3aXphcmQ1LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL21vZGlmaWVyd2l6YXJkNi5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL21vZGlmaWVyd2l6YXJkNi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlhYmNkNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvbW9kaWZpZXJ3aXphcmQ2LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3BvcHVsYXRpb25pbml0aWFsaXplcndpemFyZDEuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL2ltZy9wb3B1bGF0aW9uaW5pdGlhbGl6ZXJ3aXphcmQxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZWY2YjJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL2ltZy9wb3B1bGF0aW9uaW5pdGlhbGl6ZXJ3aXphcmQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3BvcHVsYXRpb25pbml0aWFsaXplcndpemFyZDIuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL2ltZy9wb3B1bGF0aW9uaW5pdGlhbGl6ZXJ3aXphcmQyLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iM2Q1N2MyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL2ltZy9wb3B1bGF0aW9uaW5pdGlhbGl6ZXJ3aXphcmQyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3BvcHVsYXRpb253aXphcmQxLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvcG9wdWxhdGlvbndpemFyZDEuanBnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRjMTBjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3BvcHVsYXRpb253aXphcmQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3BvcHVsYXRpb253aXphcmQyLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvcG9wdWxhdGlvbndpemFyZDIuanBnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIyODI3YWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3BvcHVsYXRpb253aXphcmQyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3ByZWRpY2F0ZXdpemFyZDEuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL2ltZy9wcmVkaWNhdGV3aXphcmQxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTEwMmQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL2ltZy9wcmVkaWNhdGV3aXphcmQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3ByZWRpY2F0ZXdpemFyZDIuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL2ltZy9wcmVkaWNhdGV3aXphcmQyLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQzOGMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL2ltZy9wcmVkaWNhdGV3aXphcmQyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3JlYWx0aW1lc2VxdWVuY2Vyd2l6YXJkMS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3JlYWx0aW1lc2VxdWVuY2Vyd2l6YXJkMS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhY2Q4ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvcmVhbHRpbWVzZXF1ZW5jZXJ3aXphcmQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3JlYWx0aW1lc2VxdWVuY2Vyd2l6YXJkMi5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3JlYWx0aW1lc2VxdWVuY2Vyd2l6YXJkMi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4NGM5NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvcmVhbHRpbWVzZXF1ZW5jZXJ3aXphcmQyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3NjZW5hcmlvd2l6YXJkMS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3NjZW5hcmlvd2l6YXJkMS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1OWJhYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvc2NlbmFyaW93aXphcmQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3NjZW5hcmlvd2l6YXJkMi5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3NjZW5hcmlvd2l6YXJkMi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc4NGE4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvc2NlbmFyaW93aXphcmQyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3NlcXVlbnRpYWxzZXF1ZW5jZXJ3aXphcmQxLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvc2VxdWVudGlhbHNlcXVlbmNlcndpemFyZDEuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NmFiMWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3NlcXVlbnRpYWxzZXF1ZW5jZXJ3aXphcmQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3NlcXVlbnRpYWxzZXF1ZW5jZXJ3aXphcmQyLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvc2VxdWVudGlhbHNlcXVlbmNlcndpemFyZDIuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMWYxYWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3NlcXVlbnRpYWxzZXF1ZW5jZXJ3aXphcmQyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3N0ZW1wcm9qZWN0d2l6YXJkMS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3N0ZW1wcm9qZWN0d2l6YXJkMS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ1MzAyZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvc3RlbXByb2plY3R3aXphcmQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3RyaWdnZXJ3aXphcmQxLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvdHJpZ2dlcndpemFyZDEuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNjY4YTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3RyaWdnZXJ3aXphcmQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3RyaWdnZXJ3aXphcmQyLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbWcvdHJpZ2dlcndpemFyZDIuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDQ5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW1nL3RyaWdnZXJ3aXphcmQyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW5mZWN0b3J3aXphcmQuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9pbmZlY3RvcndpemFyZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzJmOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvaW5mZWN0b3J3aXphcmQuaHRtbApAQCAtMCwwICsxLDMxIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5OZXcgSW5mZWN0b3IgV2l6YXJkPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+VGhlIDxlbT5OZXcgSW5mZWN0b3IvSW5vY3VsYXRvciBXaXphcmQ8L2VtPiBpcyB1c2VkIHRvIGNyZWF0ZSBhbmQgZGVmaW5lIHRoZQorcHJvcGVydGllcyBvZiBhIG5ldyBJbmZlY3RvciBvciBJbm9jdWxhdG9yLiBBIE5hbWUgYW5kIERpc2Vhc2UgTmFtZSBtdXN0IGJlIHByb3ZpZGVkIGluIG9yZGVyIHRvIGJlIAorYWJsZSB0byBjbGljayAiTmV4dCIgb3IgIkZpbmlzaCIuPC9wPgorPHA+UHJvcGVydGllcyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgd2l0aGluIHRoZSBOZXcgSW5mZWN0b3IvSW5vY3VsYXRvciBXaXphcmQgYXJlOiAKKworPHVsPjxsaT5XaGV0aGVyIHRvIGNyZWF0ZSBhIE5ldyBJbmZlY3RvciBvciBhIE5ldyBJbm9jdWxhdG9yPC9saT4KKwk8bGk+RGlzZWFzZSBOYW1lPC9saT4KKwk8bGk+UG9wdWxhdGlvbjogaS5lLiwgaHVtYW48L2xpPgorPC91bD4KK0lmIHRoZSBkYXRhIGlzIHRvIGJlIGVudGVyZWQgbWFudWFsbHkgKHNwZWNpZmllZCBieSBjbGlja2luZyAiRW50ZXIgTWFudWFsbHkiKSwgeW91IG5lZWQgdG8gcHJvdmlkZToKKzx1bD48bGk+V2hldGhlciB0byBpbmZlY3QvaW5vY3VsYXRlIGFuIGFic29sdXRlIG51bWJlciBvciBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHBvcHVsYXRpb248L2xpPgorCTxsaT5UaGUgbnVtYmVyIChvciBwZXJjZW50KSB0byBpbmZlY3QvaW5vY3VsYXRlPC9saT4KKwk8bGk+VGhlIGxvY2F0aW9uIHRvIGluZmVjdC9pbm9jdWxhdGUgYXQuPC9saT4KKzwvdWw+CitJZiBkYXRhIGlzIHRvIGJlIGltcG9ydGVkIGZyb20gYSBmaWxlIChzcGVjaWZpZWQgYnkgY2xpY2tpbmcgIkltcG9ydCBmcm9tIFNURU0gbG9nIGZpbGVzKSwgeW91IG5lZWQgdG8gcHJvdmlkZToKKzx1bD48bGk+V2hldGhlciB0byBpbmZlY3QvaW5vY3VsYXRlIGFuIGFic29sdXRlIG51bWJlciBvciBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHBvcHVsYXRpb248L2xpPgorCTxsaT5UaGUgbG9jYXRpb24gb2YgYSBTVEVNIGxvZyBmb2xkZXI8L2xpPgorCTxsaT5UaGUgcm93IHRvIHVzZSB0byBpbmZlY3Qgb3IgaW5vY3VsYXRlIGZyb208L2xpPgorPC91bD4KKwkKKzxpbWcgc3JjPSJpbWcvaW5mZWN0b3J3aXphcmQxLmpwZyIgLz4KKzxpbWcgc3JjPSJpbWcvaW5mZWN0b3J3aXphcmQyLmpwZyIgLz4KKzxpbWcgc3JjPSJpbWcvaW5mZWN0b3Jwcm9wZXJ0aWVzLmpwZyIgLz4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvbW9kZWx3aXphcmQuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9tb2RlbHdpemFyZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMzdjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvbW9kZWx3aXphcmQuaHRtbApAQCAtMCwwICsxLDEzIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5OZXcgTW9kZWw8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8cD5UaGUgPGVtPk5ldyBNb2RlbCBXaXphcmQ8L2VtPiBpcyB1c2VkIHRvIGNyZWF0ZSBhbmQgZGVmaW5lIHRoZQorcHJvcGVydGllcyBvZiBhIG5ldyA8YSBocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI21vZGVsIj4gTW9kZWw8L2E+LgorQSBuYW1lIG11c3QgYmUgcHJvdmlkZWQgZm9yIHRoZSBNb2RlbCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGNsaWNrICJOZXh0IiBvciAiRmluaXNoIi48L3A+Cis8aW1nIHNyYz0iaW1nL21vZGVsd2l6YXJkMS5qcGciIC8+Cis8aW1nIHNyYz0iaW1nL21vZGVsd2l6YXJkMi5qcGciIC8+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL21vZGlmaWVyd2l6YXJkLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvbW9kaWZpZXJ3aXphcmQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjQxNjlkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL21vZGlmaWVyd2l6YXJkLmh0bWwKQEAgLTAsMCArMSwzMSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+TmV3IE1vZGlmaWVyPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+VGhlIDxlbT5OZXcgTW9kaWZpZXIgV2l6YXJkPC9lbT4gaXMgdXNlZCB0byBjcmVhdGUgYW5kIGRlZmluZSB0aGUKK3Byb3BlcnRpZXMgb2YgYSBuZXcgPGEgaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNtb2RpZmllciI+IE1vZGlmaWVyPC9hPi4gIEl0IGlzIGEgCitiaXQgZGlmZmVyZW50IGZyb20gdGhlIG90aGVyIHdpemFyZHMgaW4gdGhhdCBpdCBpcyBpbnZva2VkIGZyb20gdGhlIGNvbnRleHQgbWVudQorb2Ygc2VsZWN0ZWQgU1RFTSBjb21wb25lbnRzIHRoYXQgY2FuIGJlIG1vZGlmaWVkLiAgSW4gdGhlIGltYWdlIGJlbG93LCB0aGUgYnVpbHQtaW4KK2Rpc2Vhc2UgbW9kZWwgZm9yIHRoZSBNZXhpY28gVVNBIFBhbmRlbWljIEZsdSBTY2VuYXJpbyBEZW1vIGlzIHNlbGVjdGVkIGFuZCB0aGUgY29udGV4dCBtZW51IGRpc3BsYXllZC4KKzwvcD4gCis8aW1nIHNyYz0iaW1nL21vZGlmaWVyd2l6YXJkMS5qcGciIC8+Cis8cD4KK1RoZSByZXN1bHRpbmcgd2l6YXJkIGlzIGluIHRoZSBuZXh0IGltYWdlLiAgSXQgc2hvd3MgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGRpc2Vhc2UgbW9kZWwgdGhhdAorY2FuIGJlIG1vZGlmaWVkLiAgSW4gdGhlIGV4YW1wbGUsIGEgPGEgaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNyYW5nZW1vZGlmaWVyIj4gCitSYW5nZSBNb2RpZmllcjwvYT4gZm9yIHRoZSA8ZW0+VHJhbnNtaXNzaW9uIFJhdGU8L2VtPiBoYXMgYmVlbiAKK2NyZWF0ZWQgdGhhdCBzZXRzIHRoZSBpbml0aWFsIHZhbHVlIHRvIDIuMCBhbmQgdGhlbiBpbmNyZW1lbnRzIGl0IGJ5IDAuMSB1bnRpbCAyLjUgKGluY2x1c2l2ZSkuCitJbiB0aGUgZXhhbXBsZSwgdGhlIDxlbT5EaXNlYXNlIE5hbWU8L2VtPiBhbmQgPGVtPlBvcHVsYXRpb248L2VtPiBhcmUgZ3JheWVkIG91dCwgaW5kaWNhdGluZwordGhhdCBubyBtb2RpZmllciBjYW4gYmUgc3BlY2lmaWVkIGZvciB0aG9zZSBhdHRyaWJ1dGVzLgorPC9wPgorPHA+CitUaGUgY3JlYXRpb24gb2YgPGEgaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNzZXF1ZW5jZW1vZGlmaWVyIj4gCitTZXF1ZW5jZSBNb2RpZmllcnM8L2E+IGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCis8L3A+CisKKzxpbWcgc3JjPSJpbWcvbW9kaWZpZXJ3aXphcmQyLmpwZyIgLz4KKzxpbWcgc3JjPSJpbWcvbW9kaWZpZXJ3aXphcmQzLmpwZyIgLz4KKworPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9wb3B1bGF0aW9uaW5pdGlhbGl6ZXJ3aXphcmQuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9wb3B1bGF0aW9uaW5pdGlhbGl6ZXJ3aXphcmQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzFmZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL3BvcHVsYXRpb25pbml0aWFsaXplcndpemFyZC5odG1sCkBAIC0wLDAgKzEsMjIgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KKzxodG1sPg0KKzxoZWFkPg0KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPg0KKzx0aXRsZT5OZXcgUG9wdWxhdGlvbiBJbml0aWFsaXplciBXaXphcmQ8L3RpdGxlPg0KKzwvaGVhZD4NCis8Ym9keT4NCis8cD5UaGUgPGVtPk5ldyBQb3B1bGF0aW9uIEluaXRpYWxpemVyIFdpemFyZDwvZW0+IGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIG9mIGEgcG9wdWxhdGlvbi4gDQorQSBuYW1lIG11c3QgYmUgcHJvdmlkZWQgZm9yIHRoZSBQb3B1bGF0aW9uIEluaXRpYWxpemVyIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gY2xpY2sgIk5leHQiIG9yICJGaW5pc2giLjwvcD4NCis8cD5Qcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIG1hbmlwdWxhdGVkIHdpdGhpbiB0aGUgTmV3IFBvcHVsYXRpb24gSW5pdGlhbGl6ZXIgV2l6YXJkIGRlcGVuZHMgb24gdGhlIFBvcHVsYXRpb24gSW5pdGlhbGl6ZXINCitzZWxlY3RlZCBmcm9tIHRoZSBkcm9wLWRvd24uIEZvciBhIHN0YW5kYXJkIHBvcHVsYXRpb24gaW5pdGlhbGl6ZXIsIHRoZXkgYXJlOg0KKzx1bD4NCisJPGxpPkluZGl2aWR1YWxzOiBDb3VudCBvciBDb3VudC9TcXVhcmUgS2lsb21ldGVyczwvbGk+DQorCTxsaT5Vc2UgRGVuc2l0eTogSW5pdGlhbGl6ZSB1c2luZyBkZW5zaXR5IGluc3RlYWQgb2YgYW4gYWJzb2x1dGUgbnVtYmVyPC9saT4NCisJPGxpPlBvcHVsYXRpb246IGkuZS4sIGh1bWFuPC9saT4NCisJPGxpPkxvY2F0aW9uIElTTyBLZXk8L2xpPg0KKzwvdWw+PC9wPg0KKw0KKzxpbWcgc3JjPSJpbWcvcG9wdWxhdGlvbmluaXRpYWxpemVyd2l6YXJkMS5qcGciIC8+DQorPGltZyBzcmM9ImltZy9wb3B1bGF0aW9uaW5pdGlhbGl6ZXJ3aXphcmQyLmpwZyIgLz4NCis8L2JvZHk+DQorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9wb3B1bGF0aW9ud2l6YXJkLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvcG9wdWxhdGlvbndpemFyZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MTVkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvcG9wdWxhdGlvbndpemFyZC5odG1sCkBAIC0wLDAgKzEsMjMgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KKzxodG1sPg0KKzxoZWFkPg0KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPg0KKzx0aXRsZT5OZXcgUG9wdWxhdGlvbiBXaXphcmQ8L3RpdGxlPg0KKzwvaGVhZD4NCis8Ym9keT4NCis8cD5UaGUgPGVtPk5ldyBQb3B1bGF0aW9uIE1vZGVsIFdpemFyZDwvZW0+IGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBwcm9wZXJ0aWVzIG9mIGEgbmV3IHBvcHVsYXRpb24gbW9kZWwuIEEgZmlsZSBuYW1lIG11c3QgYmUgcHJvdmlkZWQgZm9yIHRoZSBQb3B1bGF0aW9uIG1vZGVsIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gY2xpY2sgIk5leHQiIG9yICJGaW5pc2giLjwvcD4NCis8cD5Qcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIG1hbmlwdWxhdGVkIHdpdGhpbiB0aGUgTmV3IFBvcHVsYXRpb24gTW9kZWwgV2l6YXJkIGRlcGVuZHMgb24gdGhlIG1vZGVsIHNlbGVjdGVkIGZyb20gdGhlIGRyb3AtZG93bi4NCitGb3IgYSBzdGFuZGFyZCBwb3B1bGF0aW9uIG1vZGVsIHRoZXkgYXJlOg0KKzx1bD4NCisJPGxpPlBvcHVsYXRpb246IGkuZS4sIGh1bWFuPC9saT4NCisJPGxpPk1vZGVsIE5hbWU8L2xpPg0KKwk8bGk+QmFja2dyb3VuZCBCaXJ0aCBSYXRlOiBQTS9UUCo8L2xpPg0KKwk8bGk+QmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZSAoJm11Oyk6IFBNL1RQKjwvbGk+DQorCTxsaT5UaW1lIFBlcmlvZCAoVFApOiBJbiBtaWxsaXNlY29uZHM8L2xpPiANCisJPGxpPkxvY2F0aW9uIElTTyBLZXk8L2xpPg0KKzwvdWw+PC9wPg0KKw0KKzxpbWcgc3JjPSJpbWcvcG9wdWxhdGlvbndpemFyZDEuanBnIiAvPg0KKzxpbWcgc3JjPSJpbWcvcG9wdWxhdGlvbndpemFyZDIuanBnIiAvPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL3ByZWRpY2F0ZXdpemFyZC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL3ByZWRpY2F0ZXdpemFyZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MTU5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvcHJlZGljYXRld2l6YXJkLmh0bWwKQEAgLTAsMCArMSwxMyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+TmV3IFByZWRpY2F0ZTwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPlRoZSA8ZW0+TmV3IFByZWRpY2F0ZSBXaXphcmQ8L2VtPiBpcyB1c2VkIHRvIGNyZWF0ZSBhbmQgZGVmaW5lIHRoZQorcHJvcGVydGllcyBvZiBhIG5ldyA8YSBocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI3ByZWRpY2F0ZSI+IFByZWRpY2F0ZTwvYT4uCitBIG5hbWUgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhlIFByZWRpY2F0ZSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGNsaWNrICJOZXh0IiBvciAiRmluaXNoIi48L3A+Cis8aW1nIHNyYz0iaW1nL3ByZWRpY2F0ZXdpemFyZDEuanBnIiAvPgorPGltZyBzcmM9ImltZy9wcmVkaWNhdGV3aXphcmQyLmpwZyIgLz4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvcmVhbHRpbWVzZXF1ZW5jZXJ3aXphcmQuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9yZWFsdGltZXNlcXVlbmNlcndpemFyZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ODdmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvcmVhbHRpbWVzZXF1ZW5jZXJ3aXphcmQuaHRtbApAQCAtMCwwICsxLDE2IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5OZXcgUmVhbC1UaW1lIFNlcXVlbmNlciBXaXphcmQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8cD5UaGUgPGVtPk5ldyBSZWFsLVRpbWUgU2VxdWVuY2VyIFdpemFyZDwvZW0+IGlzIHVzZWQgdG8gY3JlYXRlIGFuZAorZGVmaW5lIHRoZSBwcm9wZXJ0aWVzIG9mIGEgbmV3IFJlYWwtVGltZSA8YQorCWhyZWY9Ii4uLy4uL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwjc2VxdWVuY2VyIj4gU2VxdWVuY2VyPC9hPi4gQSBuYW1lIG11c3QgYmUgCisJcHJvdmlkZWQgZm9yIHRoZSBSZWFsLVRpbWUgU2VxdWVuY2VyIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gY2xpY2sgIk5leHQiIG9yICJGaW5pc2giLiBUaGUgQ3ljbGUgUGVyaW9kIGNhbiAKKwliZSBhbHRlcmVkIGJ5IGNoYW5naW5nIHRoZSBsZW5ndGggb2YgdGhlIHBlcmlvZCBpbiBhYnNvbHV0ZSBudW1iZXJzIG9yIHRoZSB1bml0cyBvZiBtZWFzdXJlbWVudC48L3A+Cis8aW1nIHNyYz0iaW1nL3JlYWx0aW1lc2VxdWVuY2Vyd2l6YXJkMS5qcGciIC8+Cis8aW1nIHNyYz0iaW1nL3JlYWx0aW1lc2VxdWVuY2Vyd2l6YXJkMi5qcGciIC8+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL3NjZW5hcmlvd2l6YXJkLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvc2NlbmFyaW93aXphcmQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjdkYTIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL3NjZW5hcmlvd2l6YXJkLmh0bWwKQEAgLTAsMCArMSwxNCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+TmV3IFNjZW5hcmlvPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+VGhlIDxlbT5OZXcgU2NlbmFyaW8gV2l6YXJkPC9lbT4gaXMgdXNlZCB0byBjcmVhdGUgYW5kIGRlZmluZSB0aGUKK3Byb3BlcnRpZXMgb2YgYSBuZXcgPGEKKwlocmVmPSIuLi8uLi9jb25jZXB0cy9tb2RlbGluZ2ZyYW1ld29yay5odG1sI3NjZW5hcmlvIj4gU2NlbmFyaW88L2E+LiBBIG5hbWUgbXVzdCBiZSBwcm92aWRlZCBmb3IKKwl0aGUgU2NlbmFyaW8gaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBjbGljayAiTmV4dCIgb3IgIkZpbmlzaCIuIFRoZSBTb2x2ZXIgY2FuIGJlIGNoYW5nZWQgdXNpbmcgYSBkcm9wLWRvd24gbWVudSB1bmRlciAiUGljayBhIFNvbHZlciIuPC9wPgorPGltZyBzcmM9ImltZy9zY2VuYXJpb3dpemFyZDEuanBnIiAvPgorPGltZyBzcmM9ImltZy9zY2VuYXJpb3dpemFyZDIuanBnIiAvPgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9zZXF1ZW50aWFsc2VxdWVuY2Vyd2l6YXJkLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvc2VxdWVudGlhbHNlcXVlbmNlcndpemFyZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YzcxNWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvc2VxdWVudGlhbHNlcXVlbmNlcndpemFyZC5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPk5ldyBTZXF1ZW50aWFsIFNlcXVlbmNlciBXaXphcmQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8cD5UaGUgPGVtPk5ldyBTZXF1ZW50aWFsIFNlcXVlbmNlciBXaXphcmQ8L2VtPiBpcyB1c2VkIHRvIGNyZWF0ZQorYW5kIGRlZmluZSB0aGUgcHJvcGVydGllcyBvZiBhIG5ldyBTZXF1ZW50aWFsIDxhCisJaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCNzZXF1ZW5jZXIiPiBTZXF1ZW5jZXI8L2E+LiBBIG5hbWUgbXVzdCBiZSBwcm92aWRlZCBmb3IgCisJdGhlIFNlcXVlbnRpYWwgU2VxdWVuY2VyIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gY2xpY2sgIk5leHQiIG9yICJGaW5pc2giLiBUaGUgbGVuZ3RoIG9mIHRoZSBDeWNsZSBQZXJpb2QgY2FuCisJYmUgc3BlY2lmaWVkLCBhbmQgdGhlIHVuaXQgb2YgdGltZSAobWlsbGlzZWNvbmRzLCBzZWNvbmRzLCBtaW51dGVzLCBob3VycywgZGF5cykuIFRoZSBTdGFydCBEYXRlIGNhbiBiZSBjaG9zZW4sIGFzIHdlbGwgYXMgdGhlIGhhdmluZyB0aGUKKwlvcHRpb24gb2Ygc3BlY2lmeWluZyBhbiBFbmQgRGF0ZS48L3A+Cis8aW1nIHNyYz0iaW1nL3NlcXVlbnRpYWxzZXF1ZW5jZXJ3aXphcmQxLmpwZyIgLz4KKzxpbWcgc3JjPSJpbWcvc2VxdWVudGlhbHNlcXVlbmNlcndpemFyZDIuanBnIiAvPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9zdGVtcHJvamVjdHdpemFyZC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL3N0ZW1wcm9qZWN0d2l6YXJkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlNTA3ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9zdGVtcHJvamVjdHdpemFyZC5odG1sCkBAIC0wLDAgKzEsMTQgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPk5ldyBTVEVNIFByb2plY3QgV2l6YXJkPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+VGhlIDxlbT5OZXcgU1RFTSBQcm9qZWN0IFdpemFyZDwvZW0+IGlzIHVzZWQgdG8gY3JlYXRlIGFuZAorZGVmaW5lIHRoZSBwcm9wZXJ0aWVzIG9mIGEgbmV3IFNURU0gUHJvamVjdC4gQSBQcm9qZWN0IE5hbWUgbXVzdCBiZSBwcm92aWRlZCAKK2luIG9yZGVyIHRvIGJlIGFibGUgdG8gY2xpY2sgIkZpbmlzaCIuIFRoZSBMb2NhdGlvbiBvZiB0aGUgU1RFTSBQcm9qZWN0IGNhbiBiZQorY2hhbmdlZCBvciBjYW4gcmVtYWluIGF0IHRoZSBkZWZhdWx0IGxvY2F0aW9uLjwvcD4KKzxpbWcgc3JjPSJpbWcvc3RlbXByb2plY3R3aXphcmQxLmpwZyIgLz4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvdHJpZ2dlcndpemFyZC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL3RyaWdnZXJ3aXphcmQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmY5NTZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL3RyaWdnZXJ3aXphcmQuaHRtbApAQCAtMCwwICsxLDEzIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5OZXcgVHJpZ2dlcjwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPlRoZSA8ZW0+TmV3IFRyaWdnZXIgV2l6YXJkPC9lbT4gaXMgdXNlZCB0byBjcmVhdGUgYW5kIGRlZmluZSB0aGUKK3Byb3BlcnRpZXMgb2YgYSBuZXcgPGEgaHJlZj0iLi4vLi4vY29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCN0cmlnZ2VyIj4gVHJpZ2dlcjwvYT4uIAorQSBuYW1lIGZvciB0aGUgTmV3IFRyaWdnZXIgbXVzdCBiZSBwcm92aWRlZCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGNsaWNrICJOZXh0IiBvciAiRmluaXNoIi48L3A+Cis8aW1nIHNyYz0iaW1nL3RyaWdnZXJ3aXphcmQxLmpwZyIgLz4KKzxpbWcgc3JjPSJpbWcvdHJpZ2dlcndpemFyZDIuanBnIiAvPgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy93aXphcmRzb3ZlcnZpZXcuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy93aXphcmRzb3ZlcnZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWY5OGMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL3dpemFyZHNvdmVydmlldy5odG1sCkBAIC0wLDAgKzEsNDEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+CisKKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5PdmVydmlldzwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGgxPldpemFyZHM8L2gxPgorPHA+QSA8ZW0+V2l6YXJkPC9lbT4gaXMgYW4gYWlkIHRoYXQgaGVscHMgYSBTVEVNIHVzZXIgY29tcGxldGUgYQorY29tbW9uIHRhc2suIEEgV2l6YXJkICJ3YWxrcyIgYSB1c2VyIHN0ZXAtYnktc3RlcCB0aHJvdWdoIGVhY2ggc3RhZ2Ugb2YKK3RoZSBwcm9jZXNzIG9mIGNvbXBsZXRpbmcgdGhlIHRhc2suIFdoZW4gYSBXaXphcmQgaXMgc3RhcnRlZCBpdCBjcmVhdGVzCithIHNlcmllcyBvZiBzbWFsbCB3aW5kb3dzIHRoYXQgY29udGFpbiAiZm9ybXMiIHRoYXQgYSB1c2VyIGZpbGxzIG91dCB0bworcHJvdmlkZSB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGNvbXBsZXRlIHRoZSB0YXNrLiBJbmZvcm1hdGl2ZQorbWVzc2FnZXMgcHJvbXB0IHRoZSB1c2VyIGZvciBtaXNzaW5nIGluZm9ybWF0aW9uIGFuZCBwcm92aWRlIGZlZWRiYWNrCisoaS5lLiBlcnJvciBtZXNzYWdlcykgb24gdGhlIHZhbGlkaXR5IG9mIHRoZSB1c2VyJ3MgZW50cmllcy48L3A+Cis8cD5XaGVuIHRoZSB1c2VyIGhhcyBwcm92aWRlZCBzdWZmaWNpZW50IGluZm9ybWF0aW9uIHRvIGNvbXBsZXRlIHRoZQordGFzayB0aGV5IHNlbGVjdCB0aGUgIkZpbmlzaCIgYnV0dG9uIGFuZCB0aGUgV2l6YXJkIHdpbGwgY29tcGxldGUgaXRzCitqb2IgYnkgcGVyZm9ybWluZyB0aGUgdGFzayBmb3IgdGhlIHVzZXIuPC9wPgorPHA+QXQgYW55IHBvaW50IGEgdXNlciBjYW4gYWJhbmRvbiB0aGUgV2l6YXJkIGJ5IGNhbmNlbGluZyB0aGUKK29wZXJhdGlvbiBhbmQgbm90aGluZyB3aWxsIGhhdmUgY2hhbmdlZCBpbiB0aGVpciBzeXN0ZW0uPC9wPgorPHA+U1RFTSBjb250YWlucyB0aGUgZm9sbG93aW5nIFdpemFyZHM6PC9wPgorPHVsPgorCTxsaT48YSBocmVmPSJkaXNlYXNld2l6YXJkLmh0bWwiPkRlZmluZSBhIG5ldyBEaXNlYXNlPC9hPjwvbGk+CisJPGxpPjxhIGhyZWY9ImV4cGVyaW1lbnR3aXphcmQuaHRtbCI+TmV3IEV4cGVyaW1lbnQ8L2E+PC9saT4KKwk8bGk+PGEgaHJlZj0iaW5mZWN0b3J3aXphcmQuaHRtbCI+RGVmaW5lIGEgbmV3IEluZmVjdG9yL0lub2N1bGF0b3I8L2E+PC9saT4KKwk8bGk+PGEgaHJlZj0iZ3JhcGh3aXphcmQuaHRtbCI+TmV3IEdyYXBoPC9hPjwvbGk+CisJPGxpPjxhIGhyZWY9Im1vZGVsd2l6YXJkLmh0bWwiPk5ldyBNb2RlbDwvYT48L2xpPgorCTxsaT48YSBocmVmPSJtb2RpZmllcndpemFyZC5odG1sIj5OZXcgTW9kaWZpZXI8L2E+PC9saT4KKwk8bGk+PGEgaHJlZj0icG9wdWxhdGlvbndpemFyZC5odG1sIj5OZXcgUG9wdWxhdGlvbiBNb2RlbDwvYT48L2xpPiAKKwk8bGk+PGEgaHJlZj0icG9wdWxhdGlvbmluaXRpYWxpemVyd2l6YXJkLmh0bWwiPk5ldyBQb3B1bGF0aW9uIEluaXRpYWxpemVyPC9hPjwvbGk+CisJPGxpPjxhIGhyZWY9InByZWRpY2F0ZXdpemFyZC5odG1sIj5OZXcgUHJlZGljYXRlPC9hPjwvbGk+CisJPGxpPjxhIGhyZWY9InJlYWx0aW1lc2VxdWVuY2Vyd2l6YXJkLmh0bWwiPk5ldyBSZWFsLVRpbWUgU2VxdWVuY2VyPC9hPjwvbGk+CisJPGxpPjxhIGhyZWY9InNjZW5hcmlvd2l6YXJkLmh0bWwiPk5ldyBTY2VuYXJpbzwvYT48L2xpPgorCTxsaT48YSBocmVmPSJzZXF1ZW50aWFsc2VxdWVuY2Vyd2l6YXJkLmh0bWwiPk5ldyBTZXF1ZW50aWFsIFNlcXVlbmNlcjwvYT48L2xpPgorCTxsaT48YSBocmVmPSJzdGVtcHJvamVjdHdpemFyZC5odG1sIj5OZXcgU1RFTSBQcm9qZWN0PC9hPjwvbGk+CisJPGxpPjxhIGhyZWY9InRyaWdnZXJ3aXphcmQuaHRtbCI+TmV3IFRyaWdnZXI8L2E+PC9saT4KKzwvdWw+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3JlZmVyZW5jZS9kaXNjbGFpbWVyLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvcmVmZXJlbmNlL2Rpc2NsYWltZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODRkNzYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3JlZmVyZW5jZS9kaXNjbGFpbWVyLmh0bWwKQEAgLTAsMCArMSw1MiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+Cis8aGVhZD4KKwk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKwk8dGl0bGU+RGlzY2xhaW1lcjwvdGl0bGU+Cis8L2hlYWQ+CisKKworPGJvZHk+Cis8aDI+RGlzY2xhaW1lcjwvaDI+Cis8cD4mbmJzcDs8L3A+Cis8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNjAlIiBpZD0idGFibGUxIj4KKwk8dHI+CisJCTx0ZD48Zm9udCBGQUNFPSJIZWx2Ij4KK1RoZSB2YXJpb3VzIG1vZGVscyBhbmQgcmVmZXJlbmNlIGRhdGEgaW5jbHVkZWQgaW4gU1RFTSBhcmUgcHJvdmlkZWQgCithcyBleGFtcGxlcyBvZiBob3cgdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVmaW5lIHRoZWlyIG93biBtb2RlbHMgYW5kIGRhdGEuIFdoaWxlIGVmZm9ydCB3YXMvaXMgCittYWRlIHRvIGVuc3VyZSB0aGUgZGF0YSByZWZsZWN0cyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG9kYXkgaW4gdGhlIHB1YmxpYyBkb21haW4sIHdlIGRvIG5vdCByZXByZXNlbnQgb3IgZ3VhcmFudGVlIHRoZSBhY2N1cmFjeSAKK29mIGRhdGEgb3Igb2YgdGhlIG9yaWdpbmFsIHNvdXJjZXMgaW5jbHVkaW5nIHBvcHVsYXRpb25zLCBhcmVhLCBwb3B1bGF0aW9uIGRlbnNpdGllcywgZ2VvZ3JhcGhpYyBpbmZvcm1hdGlvbiAocHJlY2lzZSBsYXRpdHVkZXMgYW5kIGxvbmdpdHVkZXMsIGV0YykuIEluIAorc29tZSBjYXNlcyBlc3RpbWF0aW9ucyB3ZXJlIHVzZWQgdG8gcHJvdmlkZSBhcHByb3hpbWF0aW9ucyBmb3IgcG9wdWxhdGlvbiBkZW5zaXRpZXMgd2hlcmUgbm8gcHVibGljIGRhdGEgY291bGQgYmUgZm91bmQuIFRoZSBtYXRoZW1hdGljYWwgCittb2RlbHMgaW5jbHVkZWQgaW4gU1RFTSBhcmUgYmFzZWQgb24gc3RhbmRhcmQgdGV4dGJvb2sgbW9kZWxzIGxpa2UsIGZvciBleGFtcGxlLCB0aGUgU0lSIG9yIFNFSVIgbW9kZWxzLgorVXNlcnMgYXJlIGZyZWUgdG8gYWRqdXN0IHRoZSByYXRlIGNvbnN0YW50cyBpbiB0aGVzZSBtYXRoZW1hdGljYWwgCittb2RlbHMgdG8gY3JlYXRlIHRoZWlyIG93biBhcHByb3hpbWF0aW9ucyBvciBtb2RlbHMgb2YgaW5mZWN0aW91cyBkaXNlYXNlLiBJbiAKK2FkZGl0aW9uIHRvIGNoYW5naW5nIHJhdGUgY29uc3RhbnRzLAorYWR2YW5jZWQgdXNlcnMgd2lsbCB3YW50IHRvIGNvZGUgdGhlaXIgb3duIG1hdGhlbWF0aWNzIGV4dGVuZGluZyAKK3RoZSBzaW1wbGUgYmFzZSBtb2RlbHMuIFdlIGRvIG5vdCByZXByZXNlbnRlZCBvciBndWFyYW50ZWUgdGhhdCB0aGUgc2ltcGxlIGJhc2UgCittb2RlbHMgaW5jbHVkZWQgaW4gU1RFTSBhcmUKKyZxdW90O29wdGltYWwmcXVvdDsgZm9yIGFueSBwYXJ0aWN1bGFyIGluZmVjdGlvdXMgZGlzZWFzZSBhbmQgY3JlYXRpb24gb2YgYSAKKyZxdW90O2dvb2QmcXVvdDsgbW9kZWwgZm9yIHJlYWwgZGlzZWFzZSBpcyBwYXJ0IG9mIG1vZGVybiBzdGF0ZSBvZiB0aGUgYXJ0IGVwaWRlbWlvbG9naWNhbCAKK3Jlc2VhcmNoLiBTVEVNIGlzIHByb3ZpZGVkIGFzIAorYSBGcmFtZXdvcmsgdG8gc3VwcG9ydCB0aGlzIHJlc2VhcmNoIGluIHdoaWNoIHVzZXJzIG1heSBjcmVhdGUgYW5kIAorZXhjaGFuZ2UgdGhlaXIgb3duIG1vZGVscyBiYXNlZCBvbiB0aGVpciBvd24gcmVmZXJlbmNlIGRhdGEuIFdlIGRvIGNsYWltIHRvIGltcGxlbWVudGVkICZxdW90O2Jlc3QmcXVvdDsgb3IgZXZlbiAmcXVvdDthY2N1cmF0ZSZxdW90OyAKK21vZGVscyBmb3IgYW55IHBhcnRpY3VsYXIgZGlzZWFzZS4KK092ZXIgdGltZSB3ZSB3aWxsIGJ1aWxkIGludG8gU1RFTSB0b29scyB0aGF0IHdpbGwgYWxsb3cgdXNlcnMgdG8gZG8gCit0aGVpciBvd24gdmFsaWRhdGlvbiBzdHVkaWVzIG9mIHZhcmlvdXMgbW9kZWxzLgorPC9mb250PgorCQk8L3RkPgorCTwvdHI+Cis8L3RhYmxlPgorPGZvbnQgRkFDRT0iSGVsdiIgU0laRT0iMiI+Cis8cCBESVI9IkxUUiI+Jm5ic3A7PC9wPgorPC9mb250Pjxmb250IEZBQ0U9IkhlbHYiPgorPHA+CismbmJzcDs8L3A+Cis8L2ZvbnQ+Cis8cD4KKworJm5ic3A7CisKKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9yZWZlcmVuY2UvcmVmZXJlbmNlcy5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3JlZmVyZW5jZS9yZWZlcmVuY2VzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlYWJkZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC9yZWZlcmVuY2UvcmVmZXJlbmNlcy5odG1sCkBAIC0wLDAgKzEsNDYgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+CisKKzxodG1sPgorPGhlYWQ+CisJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisJPHRpdGxlPlJlZmVyZW5jZTwvdGl0bGU+Cis8L2hlYWQ+CisKKworPGJvZHk+Cis8aDI+U3BhdGlvdGVtcG9yYWwgRXBpZGVtaW9sb2dpY2FsIE1vZGVsbGVyIChTVEVNKSBSZWZlcmVuY2VzPC9oMj4KKzxwPgorCitUaGUgZm9sbG93aW5nIGxpbmtzIHdpbGwgZ2l2ZSB5b3UgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBTVEVNLgorPHA+CitUaGVzZSB3ZWIgcGFnZXMgZG8gbm90IGZvcm1hdCB3ZWxsIGluIHRoZSBFY2xpcHNlIGVudmlyb25tZW50LCBzbyAKK3dlIHJlY29tbWVuZCB1c2luZyB5b3VyIG5vcm1hbCBicm93c2VyIChGaXJlZm94LCBldGMpLiAKKzxwPgorVG8gZG8gdGhpcywgZ28gdG86IAorPGk+PHByZT4KKyBXaW5kb3cgLT4gUHJlZmVyZWNlcyAtPiBIZWxwIAorICAgc2VsZWN0IDxiPlVzZSBleHRlcm5hbCBicm93c2VyPC9iPgorIFRlcm1pbmF0ZSB0aGUgY3VycmVudCBoZWxwIHdpbmRvdywgCisgYW5kIHJlc2VsZWN0IDxiPkhlbHAgLT4gSGVscCBDb250ZW50czwvYj4KKzwvcHJlPjwvaT4KKworPGgyPlJlZmVyZW5jZXM8L2gyPiAKKyAgPHVsPgorICA8bGk+ICAKKyAgPGEgaHJlZj0iaHR0cDovL3d3dy5pai1oZWFsdGhnZW9ncmFwaGljcy5jb20vY29udGVudC81LzEvNCI+CisgICAgaHR0cDovL3d3dy5pai1oZWFsdGhnZW9ncmFwaGljcy5jb20vY29udGVudC81LzEvNDwvYT4KKyAgIDxicj5BIHJlY2VudCBwYXBlciBkZXNjcmliaW5nIHRoZSBTVEVNIGNvbmNlcHRzCisgICAKKyAgIAorICAgPGxpPgorICAgIDxhIGhyZWY9Imh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL2luZGV4LnBocC9TVEVNIj4KKyAgICBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9pbmRleC5waHAvU1RFTTwvYT4KKyAgICA8YnI+RWNsaXBzZSBTVEVNIFdpa2kKKyAgIDxsaT4KKyAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zdGVtIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N0ZW08L2E+CisgICAgICA8YnI+RWNsaXBzZSBTVEVNIHdlYiBwYWdlCisgIDwvdWw+CisgIAorICAKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdG9jLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdG9jLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJlZDY2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90b2MuaHRtbApAQCAtMCwwICsxLDkzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorCis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+U1RFTSBUYWJsZSBvZiBDb250ZW50czwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGNlbnRlcj4KKzxoMT5TVEVNIFVzZXIgSGVscDwvaDE+Cis8L2NlbnRlcj4KKzxoMj5TVEVNIFRhYmxlIG9mIENvbnRlbnRzPC9oMj4KKzxwPlRoZSBTcGF0aW90ZW1wb3JhbCBFcGlkZW1pb2xvZ2ljYWwgTW9kZWxlciAoU1RFTSkgaXMgYW4KK2V4dGVuc2libGUgc29mdHdhcmUgc3lzdGVtIGFuZCBmcmFtZXdvcmsgZm9yIGRldmVsb3BpbmcgYW5kIHJ1bm5pbmcKK2Rpc2NyZXRlIGV2ZW50IHNpbXVsYXRpb24gbW9kZWxzLiBJdCB3YXMgcHJpbWFyaWx5IGRldmVsb3BlZCBmb3IKK21vZGVsaW5nIHRoZSBzcHJlYWQgb2YgaW5mZWN0aW91cyBkaXNlYXNlcywgYnV0IGl0IGlzIGdlbmVyYWwgZW5vdWdoIHRvCitiZSBhcHBsaWVkIHRvIHZpcnR1YWxseSBhbnkgb3RoZXIgbW9kZWxpbmcgYXBwbGljYXRpb24gaW52b2x2aW5nIHNwYWNlCithbmQgdGltZS48L3A+Cis8UD4KKzx1bD4KKyAgPGxpPjxhIGhyZWY9Z2V0dGluZ3N0YXJ0ZWQvcXVpY2tzdGFydC5odG1sIHRhcmdldD0ibWFpbiIgPkdldHRpbmcgU3RhcnRlZDwvYT4KKyAgPGxpPlNURU0gY29uY2VwdHMKKyAgICA8dWw+CisgICAgICA8bGk+PGEgaHJlZj1jb25jZXB0cy9vdmVydmlldy5odG1sIHRhcmdldD0ibWFpbiIgPk92ZXJ2aWV3PC9hPgorICAgICAgPGxpPjxhIGhyZWY9Y29uY2VwdHMvbW9kZWxpbmdmcmFtZXdvcmsuaHRtbCB0YXJnZXQ9Im1haW4iID5GcmFtZXdvcms8L2E+CisgICAgICA8bGk+PGEgaHJlZj1jb25jZXB0cy9leHRlbnNpYmlsaXR5Lmh0bWwgdGFyZ2V0PSJtYWluIiA+RXh0ZW5zaWJpbGl0eTwvYT4KKyAgICA8L3VsPgorIDxsaT5JbnRlcmZhY2UgPC9hPgorICAgIDx1bD4KKyAgICAgIDxsaT48YSBocmVmPWludGVyZmFjZS9pbnRlcmZhY2VvdmVydmlldy5odG1sIHRhcmdldD0ibWFpbiIgPk92ZXJ2aWV3PC9hPgorICAgICAgPGxpPjxhIGhyZWY9aW50ZXJmYWNlL3BlcnNwZWN0aXZlcy9wZXJzcGVjdGl2ZXNvdmVydmlldy5odG1sIHRhcmdldD0ibWFpbiIgPlBlcnNwZWN0aXZlczwvYT4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxhIGhyZWY9aW50ZXJmYWNlL3BlcnNwZWN0aXZlcy9hbmFseXNpcy5odG1sIHRhcmdldD0ibWFpbiIgPkFuYWx5c2lzPC9hPgorICAgICAgICA8bGk+PGEgaHJlZj1pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL2Rlc2lnbmVyLmh0bWwgdGFyZ2V0PSJtYWluIiA+RGVzaWduZXI8L2E+CisgICAgICAgIDxsaT48YSBocmVmPWludGVyZmFjZS9wZXJzcGVjdGl2ZXMvc2ltdWxhdGlvbi5odG1sIHRhcmdldD0ibWFpbiIgPlNpbXVsYXRpb248L2E+CisgICAgICA8L3VsPgorICAgICAgPGxpPjxhIGhyZWY9aW50ZXJmYWNlL3ZpZXdzL3ZpZXdzb3ZlcnZpZXcuaHRtbCB0YXJnZXQ9Im1haW4iID5WaWV3czwvYT4KKyAgICAgIDx1bD4KKworCisJCQk8bGk+PGEgaHJlZj1pbnRlcmZhY2Uvdmlld3MvYWN0aXZlc2ltdWxhdGlvbnN2aWV3Lmh0bWwgdGFyZ2V0PSJtYWluIiA+QWN0aXZlIFNpbXVsYXRpb25zIFZpZXc8L2E+CisKKwkJCTxsaT48YSBocmVmPWludGVyZmFjZS92aWV3cy9jb250cm9sdmlldy5odG1sIHRhcmdldD0ibWFpbiIgPkNvbnRyb2wgVmlldzwvYT4KKworCQkJPGxpPjxhIGhyZWY9aW50ZXJmYWNlL3ZpZXdzL2NzdmxvZ2dlcnZpZXcuaHRtbCB0YXJnZXQ9Im1haW4iID5DU1YgTG9nZ2VyIFZpZXc8L2E+CisKKwkJCTxsaT48YSBocmVmPWludGVyZmFjZS92aWV3cy9kZWNvcmF0b3Jzdmlldy5odG1sIHRhcmdldD0ibWFpbiIgPkRlY29yYXRvcnMgVmlldzwvYT4KKworCQkJPGxpPjxhIGhyZWY9aW50ZXJmYWNlL3ZpZXdzL2Rpc2Vhc2Vzdmlldy5odG1sIHRhcmdldD0ibWFpbiIgPkRpc2Vhc2VzIFZpZXc8L2E+CisKKwkJCTxsaT48YSBocmVmPWludGVyZmFjZS92aWV3cy9lcGlkZW1pY3ZpZXcuaHRtbCB0YXJnZXQ9Im1haW4iID5FcGlkZW1pYyBWaWV3PC9hPgorCisJCQk8bGk+PGEgaHJlZj1pbnRlcmZhY2Uvdmlld3MvZXJyb3JfbG9nLmh0bWwgdGFyZ2V0PSJtYWluIiA+RXJyb3IgTG9nIFZpZXc8L2E+CisKKwkJCTxsaT48YSBocmVmPWludGVyZmFjZS92aWV3cy9lc3RpbWF0b3IuaHRtbCB0YXJnZXQ9Im1haW4iID5Fc3RpbWF0b3IgVmlldzwvYT4KKworCQkJPGxpPjxhIGhyZWY9aW50ZXJmYWNlL3ZpZXdzL2dlLmh0bWwgdGFyZ2V0PSJtYWluIiA+R29vZ2xlIEVhcnRoIFZpZXc8L2E+CisKKwkJCTxsaT48YSBocmVmPWludGVyZmFjZS92aWV3cy9ncmFwaHN2aWV3Lmh0bWwgdGFyZ2V0PSJtYWluIiA+R3JhcGhzIFZpZXc8L2E+CisKKwkJCTxsaT48YSBocmVmPWludGVyZmFjZS92aWV3cy9seWFwdW5vdnZpZXcuaHRtbCB0YXJnZXQ9Im1haW4iID5MeWFwdW5vdiBWaWV3PC9hPgorCisJCQk8bGk+PGEgaHJlZj1pbnRlcmZhY2Uvdmlld3MvbWFwdmlldy5odG1sIHRhcmdldD0ibWFpbiIgPk1hcCBWaWV3PC9hPgorCisJCQk8bGk+PGEgaHJlZj1pbnRlcmZhY2Uvdmlld3MvbW9kZWxzdmlldy5odG1sIHRhcmdldD0ibWFpbiIgPk1vZGVscyBWaWV3PC9hPgorCisJCQk8bGk+PGEgaHJlZj1pbnRlcmZhY2Uvdmlld3MvcHJvamVjdHZpZXcuaHRtbCB0YXJnZXQ9Im1haW4iID5Qcm9qZWN0IEV4cGxvcmVyIFZpZXc8L2E+CisKKwkJCTxsaT48YSBocmVmPWludGVyZmFjZS92aWV3cy9wcm9wZXJ0aWVzdmlldy5odG1sIHRhcmdldD0ibWFpbiIgPlByb3BlcnRpZXMgVmlldzwvYT4KKworCQkJPGxpPjxhIGhyZWY9aW50ZXJmYWNlL3ZpZXdzL3JlcG9ydHZpZXcuaHRtbCB0YXJnZXQ9Im1haW4iID5SZXBvcnQgVmlldzwvYT4KKworCQkJPGxpPjxhIGhyZWY9aW50ZXJmYWNlL3ZpZXdzL3NjZW5hcmlvc3ZpZXcuaHRtbCB0YXJnZXQ9Im1haW4iID5TY2VuYXJpb3MgVmlldzwvYT4KKworCQkJPGxpPjxhIGhyZWY9aW50ZXJmYWNlL3ZpZXdzL3NjZW5hcmlvY29tcGFyaXNvbnZpZXcuaHRtbCB0YXJnZXQ9Im1haW4iID5TY2VuYXJpbyBDb21wYXJpc29uIFZpZXc8L2E+CisKKwkJCTxsaT48YSBocmVmPWludGVyZmFjZS92aWV3cy9zZXF1ZW5jZXJzdmlldy5odG1sIHRhcmdldD0ibWFpbiIgPlNlcXVlbmNlcnMgVmlldzwvYT4KKworCQkJPGxpPjxhIGhyZWY9aW50ZXJmYWNlL3ZpZXdzL2R1YmxpbmNvcmVwb3B1cC5odG1sIHRhcmdldD0ibWFpbiIgPkR1YmxpbiBDb3JlIFBvcHVwPC9hPgorICAgICAgPC91bD4KKyAgICA8L3VsPgorCisKKworCisgIDxsaT48YSBocmVmPWVwaWRlbWlvbG9naWNhbG1vZGVsaW5nL292ZXJ2aWV3Lmh0bWwgdGFyZ2V0PSJtYWluIiA+IEVwaWRlbWlvbG9naWNhbCBNb2RlbGluZyA8L2E+CisgIDxsaT48YSBocmVmPXR1dG9yaWFscy90dXRvcmlhbHNvdmVydmlldy5odG1sIHRhcmdldD0ibWFpbiIgPlR1dG9yaWFsczwvYT4KKyAgPGxpPjxhIGhyZWY9cmVmZXJlbmNlL3JlZmVyZW5jZXMuaHRtbCB0YXJnZXQ9Im1haW4iID5SZWZlcmVuY2VzIDwvYT4KKyAgPGxpPjxhIGhyZWY9InJlZmVyZW5jZS9kaXNjbGFpbWVyLmh0bWwiPkRpc2NsYWltZXI8L2E+PC91bD4KKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvY3N2aW1wb3J0dHV0b3JpYWwuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvY3N2aW1wb3J0dHV0b3JpYWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTJmMWY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9jc3ZpbXBvcnR0dXRvcmlhbC5odG1sCkBAIC0wLDAgKzEsMTM4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5DcmVhdGluZyBhIG5ldyBTY2VuYXJpbyBUdXRvcmlhbDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5JbXBvcnRpbmcgRGF0YSBGcm9tIEV4dGVybmFsIEZpbGVzPC9oMT4KKzxwPjxiPk92ZXJ2aWV3OjwvYj48L3A+Cis8cD5TVEVNIGFsc28gYWxsb3dzIHVzZXJzIHRvIGltcG9ydCBkYXRhIGZyb20gb25lIG9yIG1vcmUgZXh0ZXJuYWwgZmlsZXMgYW5kIHRvIAorcGxheSB0aGVtIGJhY2suIFRvZGF5LCBpbXBvcnQgaXMgc3VwcG9ydGVkIGZvciBDb21tYSBTZXBhcmF0ZWQgVmFyaWFibGUgKENTVikgCitmaWxlcy48YnI+CismbmJzcDs8L3A+Cis8cD48Yj5Pcmdhbml6aW5nIHRoZSBEYXRhIEZpbGVzOjwvYj48L3A+Cis8cD5UaGUgaW5kaXZpZHVhbCBmaWxlcyBvciBjb2xsZWN0aW9ucyBvZiBmaWxlcyBmb3IgYSBwYXJ0aWN1bGFyIHNjZW5hcmlvIAorc2hvdWxkIGJlIGdyb3VwZWQgaW4gYSBzaW5nbGUgZm9sZGVyLiBJbiBmaWd1cmUgMWEgd2Ugc2hvdyBhIGNvbGxlY3Rpb24gb2YgCitmaWxlcywgYWxsIGNvbnRhaW5pbmcgU2hpZ2VsbGEgZGF0YSwgZ3JvdXBlZCBpbiBhIGZvbGRlciBjYWxsZWQgIlNjZW5hcmlvU2hpZ2VsbGEiLiAKK1RoaXMgZm9sZGVyIGNhbiBoYXZlIGFueSBuYW1lIGFuZCBiZSBwbGFjZWQgaW4gYW55IGxvY2F0aW9uLiBJbiB0aGUgZXhhbXBsZSAKK2JlbG93IHdlIHBsYWNlIHRoZSBmb2xkZXIgaW4gdGhlIHNhbWUgbG9jYXRpb24gdGhhdCBTVEVNIHR5cGljYWxseSBleHBvcnRzIAorZGF0YSB0bywgbmFtZWx5OjwvcD4KKzxwPiZuYnNwOyZuYnNwOyAuLi4gPGI+IHJ1bnRpbWUtc3RlbS5wcm9kdWN0XCZsdDtwcm9qZWN0Jmd0O1xSZWNvcmRlZCBTaW11bGF0aW9uc1wKKzwvYj48L3A+Cis8cD5XaGVyZSB5b3VyIHJ1bnRpbWUtc3RlbS5wcm9kdWN0XCBpcyB0eXBpY2FsbHkgbG9jYXRlZCBuJm5ic3A7Cis8YSBocmVmPSJmaWxlOi8vL0M6L3J1bnRpbWUtc3RlbS5wcm9kdWN0LyI+QzpccnVudGltZS1zdGVtLnByb2R1Y3RcPC9hPiBpbiBhIAorZGVmYXVsdCBFY2xpcHNlIGluc3RhbGxhdGlvbi48L3A+Cis8cD5UbyBpbXBvcnQgZGF0YSwgaXQgaXMgbmVjZXNzYXJ5IHRoYXQgYSBDU1YgZmlsZSBiZSBjcmVhdGVkIGZvciBlYWNoIHN0YXRlIAorbW9kZWxlZCBieSB0aGUgZGlzZWFzZS4gRWFjaCBmaWxlIG5hbWUgc2hvdWxkIGJlIHRoZSBkaXNlYXNlIHN0YXRlIGlkZW50aWZpZXIgCisoZS5nLiBTLCBFLCBJIG9yIFIpIGZvbGxvd2VkIGJ5IGFuIHVuZGVyc2NvcmUgY2hhcmFjdGVyIChfKSBmb2xsb3dlZCBieSBhIG51bWJlci4gCitUaGUgbnVtYmVyIGluZGljYXRlcyB0aGUgZ2VvZ3JhcGhpY2FsIHJlc29sdXRpb24gZm9yIGxvY2F0aW9ucyBjb250YWluZWQgaW4gdGhlIAorZmlsZS4gRm9yIGluc3RhbmNlLCAzIHJlcHJlc2VudHMgbG9jYXRpb25zIGF0IGFkbWluaXN0cmF0aW9uIGxldmVsIDMgKFVTIGNpdGllcykuIAorSW4gRmlndXJlIDFhIHdlIHNob3cgc2V2ZXJhbCBmaWxlcyBjb250YWluaW5nIGRhdGEgZm9yIHRoZSBTLCBFLCBJIGFuZCBSIHN0YXRlcyAKK2F0IGFkbWluaXN0cmF0aW9uIGxldmVsIDMuIFRoZSBmaWxlIGV4dGVuc2lvbiBzaG91bGQgYmUgLmNzdi4gPC9wPgorPHA+Rm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBleHBvcnQgZGF0YSwgcGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiB0aGUKKzxhIGhyZWY9Ii4uL2ludGVyZmFjZS92aWV3cy9jc3Zsb2dnZXJ2aWV3Lmh0bWwiPkNTViBMb2dnZXIgVmlldzwvYT4uPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjU1JSIgaWQ9InRhYmxlMyI+CisJPHRyPgorCQk8dGQ+CisJCTxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9pbXBvcnRzY2VuYXJpbzFhLmpwZyI+PC90ZD4KKwk8L3RyPgorCTx0cj4KKwkJPHRkPjxiPkZpZ3VyZSAxYTogT3JnYW5pemluZyB5b3VyIGRhdGEgdG8gcHJlcGFyZSB0byBpbXBvcnQgaW50byBTVEVNLjwvYj48L3RkPgorCTwvdHI+Cis8L3RhYmxlPgorPHA+RWFjaCBDU1YgZmlsZSBzaG91bGQgY29udGFpbiBhIGhlYWRlciBpbmRpY2F0aW5nIHRoZSBkb21haW4gb2YgZGF0YSBpbiAKK2VhY2ggY29sdW1uLiBUaGUgZmlyc3QgY29sdW1uIHNob3VsZCBjb250YWluIGEgc2VxdWVudGlhbCBpdGVyYXRpb24gb3Igcm93IAorbnVtYmVyIGFuZCB0aGUgaGVhZGVyIGxhYmVsIG11c3QgYmUgJ2l0ZXJhdGlvbicuIFRoZSBzZWNvbmQgY29sdW1uIHNob3VsZCAKK2NvbnRhaW4gdGhlIHRpbWUgdGhlIGRhdGEgYXBwbGllcyB0byAoZWFjaCByb3cgc2hvdWxkIGJlIHNlcXVlbnRpYWwgaW4gdGltZSkgCit3aXRoIGhlYWRlciBsYWJlbCAndGltZScuIFRoZSBmb2xsb3dpbmcgY29sdW1ucyBoZWFkZXJzIHNob3VsZCBpbmRpY2F0ZSB0aGUgCit1bmlxdWUgU1RFTSBsb2NhdGlvbiBJRCBmb3Igd2hpY2ggZGF0YSBpbiB0aGF0IGNvbHVtbiBiZWxvbmdzIHRvLCBhbmQgdGhlIAordmFsdWVzIGluIGVhY2ggcm93IGlzIHRoZSBjb3VudCAoaW5kaXZpZHVhbHMpIGF0IHRoZSBsb2NhdGlvbiBpbiB0aGUgc3RhdGUgCityZXByZXNlbnRlZCBieSB0aGUgZmlsZS4gSWYgdGhlIGRhdGEgaXMgZnJvbSBzeW5kcm9taWMgc3VydmVpbGxhbmNlIHVzZXJzIAord2lsbCBsaWtlbHkgbm90IGhhdmUgaW5mb3JtYXRpb24gb24gZXZlcnkgcG9zc2libGUgc3RhdGUgYnV0IHdoZW4gaW1wb3J0aW5nIAoreW91IG11c3QgaGF2ZSBmaWxlcyBhbmQgZmlsZSBoZWFkZXJzIGZvciBlYWNoIHN0YXRlIHRoYXQgeW91IHdhbnQgdG8gZGlzcGxheS4gCitTVEVNIGRldGVybWluZXMgdGhlIHR5cGUgb2YgdGhlIGRpc2Vhc2UgYnkgY2hlY2tpbmcgd2hpY2ggZmlsZXMgYXJlIGF2YWlsYWJsZSAKK3doZW4gaW1wb3J0aW5nIGRhdGEsIHNvIGlmIGZvciBleGFtcGxlIFNURU0gZmluZHMgYW4gU18zLmNzdiBhbmQgSV8zLmNzdiBmaWxlIAorYnV0IG5vIEVfMy5jc3Ygb3IgUl8zLmNzdiBmaWxlIGl0IHdpbGwgYXNzdW1lZCB0aGUgZGlzZWFzZSBpcyBvZiB0eXBlIFNJLiAKK05vdGUgdGhhdCB0aGUgZGF0YSBpbiBlYWNoIGNvbHVtbiBtdXN0IGJlIHRvdGFsIGNvdW50IChpbmRpdmlkdWFscykgYW5kIG5vdCAKK2ZyYWN0aW9uIGluIGVhY2ggc3RhdGUuIFRoZSBudW1iZXJzIG1heSBiZSBmbG9hdGluZyBwb2ludCAoYWxsb3dpbmcgZnJhY3Rpb25hbCAKK3Blb3BsZSBpbmZlY3RlZCBmb3IgZXhhbXBsZSkuIDwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGlkPSJ0YWJsZTUiPgorCTx0cj4KKwkJPHRkPgorCQk8cCBhbGlnbj0ibGVmdCI+PGI+aXRlcmF0aW9uLCZuYnNwO3RpbWUsJm5ic3A7VVMtVlQtNTAwMTMtNjcwMDAsJm5ic3A7VVMtVlQtNTAwMjctNzc1MDAsJm5ic3A7VVMtVlQtNTAwMjEtMTY4MjUsJm5ic3A7VVMtVlQtNTAwMjEtNzU5MjU8YnIvPgorCQkwLFRodSZuYnNwO0RlYyZuYnNwOzEzJm5ic3A7MTg6MzI6NTgmbmJzcDtQU1QmbmJzcDsyMDA3LCZuYnNwOzI1MzE3NSwmbmJzcDsxLjQ1LCZuYnNwOzEuNDUsJm5ic3A7MC4wLCZuYnNwOzAuMCwmbmJzcDsyMi45OTxici8+CisJCTEsVGh1Jm5ic3A7RGVjJm5ic3A7MTMmbmJzcDsxODozMjo1OSZuYnNwO1BTVCZuYnNwOzIwMDcsJm5ic3A7MjUzMTEwLCZuYnNwOzMuMzQsJm5ic3A7My4zNCwmbmJzcDswLjAsJm5ic3A7MC40MywmbmJzcDs4Ni4yMjxici8+CisJCS4uLjwvYj48L3RkPgorCTwvdHI+CisJPHRyPgorCQk8dGQ+CisJCTxwIGFsaWduPSJjZW50ZXIiPjxiPlRhYmxlIDE6IFRoZSBDU1YgZmlsZSBtdXN0IGxhYmVsIHRoZSBsb2NhdGlvbnMgeW91IHBsYW4gdG8gaW1wb3J0IAorCQlpbnRvIFNURU0gKHNlZSB0ZXh0KTxicj4KKwkJPC9iPjxpPkZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZXhwb3J0IGRhdGEsIHBsZWFzZSBzZWUgdGhlIAorCQlkb2N1bWVudGF0aW9uIG9uIHRoZSA8YSBocmVmPSIuLi9pbnRlcmZhY2Uvdmlld3MvY3N2bG9nZ2Vydmlldy5odG1sIj5DU1YgCisJCUxvZ2dlciBWaWV3PC9hPi48L2k+PC90ZD4KKwk8L3RyPgorPC90YWJsZT4KKzxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KKzxwIGFsaWduPSJsZWZ0Ij5JbiBvcmRlciB0byBhY3R1YWxseSBpbXBvcnQgdGhlIGRhdGEgaW50byBTVEVNIHlvdSBtdXN0IGNyZWF0ZSBhIAorc2NlbmFyaW8uIFRoZSBleHRlcm5hbCBkYXRhIHdpbGwgYmUgcmVhZCBieSBhZGRpbmcgYSBzcGVjaWFsIGRpc2Vhc2UgbW9kZWw8YnI+CitjYWxsZWQgYSA8Yj4mcXVvdDtFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwmcXVvdDs8L2I+IHRvIHlvdXIgc2NlbmFyaW8uIEZvbGxvdyB0aGUgCitpbnN0cnVjdGlvbnMgZm9yIDxhIGhyZWY9InNjZW5hcmlvdHV0b3JpYWwuaHRtbCI+Y3JlYXRpbmcgYSBzY2VuYXJpby48L2E+IFlvdXIgCitzY2VuYXJpbyBtdXN0IGNvbnRhaW48YnI+CithJm5ic3A7IDxhIGhyZWY9Im1vZGVsdHV0b3JpYWwuaHRtbCI+bW9kZWw8L2E+IGFuZCA8YSBocmVmPSJncmFwaHR1dG9yaWFsLmh0bWwiPgorZ3JhcGg8L2E+IHRoYXQgY29udGFpbnMgdGhlIHNhbWUgc2V0IG9mIHRoZSByZWdpb25zIG5hbWVkIGluIHlvdXIgY29sbGVjdGlvbiBvZiAKK2RhdGEgZmlsZXMuIFNvIGlmIHlvdSB3YW50IHRvIHBsYXkgYmFjayBkYXRhIG9uIFVTIGNvdW50aWVzLCA8YnI+Cit5b3UgbXVzdCBhZGQgYWxsIHRoZSBVUyBjb3VudGllcyB0byB5b3VyIG1vZGVsLjwvcD4KKzxwIGFsaWduPSJsZWZ0Ij5XaGVuIHlvdSBhcmUgcmVhZHkgdG8gYWRkIHRoZSA8Yj5FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwKKzwvYj50byB5b3VyIHNjZW5hcmlvICh1bmRlciB0aGUgbW9kZWwgbm9kZSksIGNsaWNrIG9uIHRoZSBpY29uIGZvcgorPGEgaHJlZj0iZGlzZWFzZXR1dG9yaWFsLmh0bWwiPmFkZGluZyBhIG5ldyBkaXNlYXNlPC9hPi48YnI+CitzcGVjaWZ5IHlvdXIgcHJvamVjdCBhbmQgZ2l2ZSB0aGUgZGlzZWFzZSBhIG5hbWUuIFNlbGVjdCZuYnNwOyA8Yj4KK0V4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCA8L2I+YXMgdGhlIGRpc2Vhc2UgbW9kZWwuIFlvdSBtdXN0IHRoZW4gdGVsbCB0aGUmbmJzcDsKKzxiPkV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCA8YnI+Cis8L2I+dGhlIGxvY2F0aW9uIG9mIHlvdXIgZGF0YSBmaWxlKHMpLiBZb3UgbWF5IHVzZSB0aGUgc2VsZWN0b3IgYnV0dG9ucyB0byB0aGUgCityaWdodCBvZiBEYXRhIFBhdGguIEEgJnF1b3Q7U2VsZWN0IERpcmVjdG9yeSZxdW90OyBkaWFsb2cgKGZpZ3VyZSAxYykgd2lsbCBhcHBlYXIgYWxsb3dpbmcgCit5b3UgdG8gc2VsZWN0IGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIGRhdGEgZmlsZXMgeW91IHdpc2ggdG8gcGxheSBiYWNrLiA8YnI+Cis8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMzglIiBpZD0idGFibGU0Ij4KKwk8dHI+CisJCTx0ZD4KKwkJPGltZyBib3JkZXI9IjAiIHNyYz0iaW1nL2ltcG9ydHNjZW5hcmlvMWIuanBnIj48L3RkPgorCQk8dGQ+CisJCTxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9pbXBvcnRzY2VuYXJpbzFjLmpwZyI+PC90ZD4KKwk8L3RyPgorCTx0cj4KKwkJPHRkPjxiPkZpZ3VyZSAxYjogQ3JlYXRpbmcgYW4mbmJzcDsgRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsIDwvYj4KKwkJPC90ZD4KKwkJPHRkPjxiPkZpZ3VyZSAxYzogU2VsZWN0IHRoZSBEaXJlY3RvcnkgdGhhdCBDb250YWlucyB5b3VyIGRhdGE8L2I+PC90ZD4KKwk8L3RyPgorPC90YWJsZT4KKzxwPk9uY2UgeW91IGhhdmUgY3JlYXRlZCBhIHNjZW5hcmlvIHNldCB1cCB0byBSZXBsYXkgYSBkaXNlYXNlIGZyb20gYW4gZXh0ZXJuYWwgCitmaWxlIHlvdSBjYW4gYWxzbyBlZGl0IHRoZSBkYXRhIHBhdGggdXNpbmcgdGhlIFByb3BlcnRpZXMgRWRpdG9yLiZuYnNwOyBKdXN0IGdvIAordG8geW91ciBwcm9qZWN0LCBmaW5kIHRoZSZuYnNwOyA8Yj5FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwgPC9iPnlvdSAKK2NyZWF0ZWQ8YnI+Cit1bmRlciB0aGUgJnF1b3Q7ZGVjb3JhdG9ycyZxdW90OyBmb2xkZXIsIGFuZCZuYnNwOyBkb3VibGUgY2xpY2sgb24gaXQgaW4gdGhlIFJlc291cmNlIFNldCAKK3dpbmRvdyAoU2VlIGZpZ3VyZSAyKS4gVGhlIEVkaXRvciB3aWxsIHNob3cgdXAgYWxsb3dpbmcgeW91IHRvIGNoYW5nZSB0aGlzIHBhdGggCit1c2VkIHRvIHJlYWQgaW4gZGF0YS48L3A+Cis8cD4mbmJzcDs8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iNDMlIiBpZD0idGFibGUyIj4KKwk8dHI+CisJCTx0ZD4KKwkJPGI+CisJCTxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9pbXBvcnRzY2VuYXJpbzIuanBnIiA+PC9iPjwvdGQ+CisJPC90cj4KKwk8dHI+CisJCTx0ZD48Yj5GaWd1cmUgMjogQ2hhbmdpbmcgdGhlIERhdGEgUGF0aCBpbiB0aGUgUHJvcGVydGllcyBFZGl0b3I8L2I+PC90ZD4KKwk8L3RyPgorPC90YWJsZT4KKzxwPiZuYnNwOzwvcD4KKzxwPiBPbmNlIHlvdSBoYXZlIGNvbXBsZXRlZCBzZXR0aW5nIHVwIHlvdXIgc2NlbmFyaW8sCis8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IDQwMCI+PGk+U2F2ZSB5b3VyIHdvcmsgYXQgdGhpcyBwb2ludCBieSBoaXR0aW5nIDxiPmN0cmwtczwvYj48L2k+PC9zcGFuPjwvcD4KKzxwPiBUbyByZXBsYXkgeW91ciBkYXRhLCBzaW1wbHkgc2VsZWN0IHRoZSBzY2VuYXJpbyB5b3UgY3JlYXRlZCBpbiB0aGUgU1RFTSAKK3Byb2plY3QgZXhwbG9yZXIsIHJpZ2h0IGNsaWNrLCBhbmQgc2VsZWN0IHJ1bi4gU1RFTSB3aWxsIGxhdW5jaCwgbG9hZCB0aGUgCitsb2NhdGlvbnMgeW91IHNwZWNpZmllZDxicj4KK2FuZCBwbGF5IGJhY2sgeW91ciBkYXRhLjwvcD4KKworCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9kaXNlYXNldHV0b3JpYWwuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvZGlzZWFzZXR1dG9yaWFsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE4Y2QxNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvZGlzZWFzZXR1dG9yaWFsLmh0bWwKQEAgLTAsMCArMSw1OCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+Q3JlYXRpbmcgYSBuZXcgRGlzZWFzZSBUdXRvcmlhbDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5DcmVhdGluZyBhIG5ldyBEaXNlYXNlPC9oMT4KKworPHA+MSkgT24gdGhlIG1lbnUgYmFyIGNsaWNrIC0mZ3Q7bmV3LSZndDtuZXcgZGlzZWFzZSA8L3A+Cis8cD4yKSBUaGlzIHdpbGwgbGF1bmNoIHRoZSBEaWFsb2cgc2hvd24gaW4gRmlndXJlIDEuIEZpbGwgaW4gdGhlIE5hbWU6IChFeHBlcmltZW50YWxEaXNlYXNlKQorPC9wPgorPHA+MykgRmlsbCBpbiB0aGUgRGlzZWFzZSBOYW1lOiBZb3UgY2FuIHVzZSB0aGUgc2FtZSBuYW1lIHlvdSB1c2VkIGluICgyKSAoRXhwZXJpbWVudGFsRGlzZWFzZSkKKzwvcD4KKzxwPjQpIFNlbGVjdCB0aGUgRGlzZWFzZU1vZGVsIGluIHRoZSBDb21ib0JveDogZS5nLiwgc2VsZWN0ICZxdW90O0V4cGVyaW1lbnRhbERpc2Vhc2VNb2RlbEltcGwmcXVvdDsKKzwvcD4KKzxwPkF0IHRoaXMgcG9pbnQgeW91IHNob3VsZCBhbHNvIGVkaXQgb3Igc2V0IGFueSBvZiB0aGUgZGlzZWFzZSBwYXJhbWV0ZXJzIChpLmUuIAorVHJhbnNtaXNzaW9uIFJhdGUsIFJlY292ZXJ5IFJhdGUsIGV0YykuPGJyPgorSWYgeW91IGRvbid0IHdhbnQgdG8gZG8gaXQgbm93IGl0IHdpbGwgYWxzbyBiZSBlZGl0YWJsZSBhbnkgdGltZSBhZnRlciB0aGUgCitzY2VuYXJpbyBpcyBjcmVhdGVkLiA8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMSIgd2lkdGg9IjQ5JSI+CisJPHRyPgorCQk8dGQ+CisJCTxwIGFsaWduPSJjZW50ZXIiPgorCQk8aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWcvZGlzZWFzZURpYWxvZy5qcGciIHdpZHRoPSI1MjUiIGhlaWdodD0iNTMxIj48L3RkPgorCTwvdHI+CisJPHRyPgorCQk8dGQ+CisJCTxwIGFsaWduPSJjZW50ZXIiPjxiPkZpZ3VyZSAxOiBUaGUgbmV3IERpc2Vhc2UgRGlhbG9nLjwvYj48L3RkPgorCTwvdHI+Cis8L3RhYmxlPgorPHA+Jm5ic3A7PC9wPgorPHA+NSkgRmlsbCBpbiBhbnkgRHVibGluIGNvcmUgZGF0YSB5b3Ugd2FudCB0byBhZGQgPC9wPgorPHA+NikgQ2xpY2sgZmluaXNoIDwvcD4KKzxwPjcpIFVuZGVyIGRlY29yYXRvcnMgeW91IHNob3VsZCBzZWUgRXhwZXJpbWVudGFsRGlzZWFzZS5zdGFuZGFyZCA8L3A+Cis8cD44KSBEb3VibGUgY2xpY2sgb24gTU9ERUxTIGluIHRoZSBwcm9qZWN0IGV4cGxvcmVyLiBZb3Ugc2hvdWxkIHNlZSAmcXVvdDtDdWJhRXhwZXJpbWVudGFsRGlzZWFzZSZxdW90OyAKK2luIHRoZSBSZXNvdXJjZSBTZXQuIDwvcD4KKzxwPjkpIERSQUcgeW91ciBuZXcgZGlzZWFzZSAoZS5nLiwgQ3ViYUV4cGVyaW1lbnRhbERpc2Vhc2UuU3RhbmRhcmQpIGZyb20gCitkZWNvcmF0b3JzIChpbiB0aGUgcHJvamVjdCBleHBsb3JlciB3aW5kb3cpIGludG8gdGhlIG1vZGVsICZxdW90O0N1YmFFeHBlcmltZW50YWxEaXNlYXNlJnF1b3Q7IAoraW4gdGhlIFJlc291cmNlIFNldCB3aW5kb3cuIEV4cGFuZCB0aGUgJnF1b3Q7Q3ViYUV4cGVyaW1lbnRhbERpc2Vhc2UmcXVvdDsgaW4gdGhlIAorUmVzb3VyY2UgU2V0IHdpbmRvdyB0byBzZWUgdGhhdCBpdCB3b3JrZWQuIFNlZSBGaWd1cmUgMi48L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMSIgd2lkdGg9IjQ5JSI+CisJPHRyPgorCQk8dGQ+CisJCTxwIGFsaWduPSJjZW50ZXIiPgorCQk8aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWcvZHJhZ2Rpc2Vhc2V0b21vZGVsLmpwZyIgd2lkdGg9IjU3MyIgaGVpZ2h0PSI0MzEiPjwvdGQ+CisJPC90cj4KKwk8dHI+CisJCTx0ZD4KKwkJPHAgYWxpZ249ImNlbnRlciI+PGI+RmlndXJlIDIuIERyYWcgdGhlIERpc2Vhc2UgTW9kZWwgKGRlY29yYXRvcikgaW50byAKKwkJdGhlIE1vZGVsIGluIHRoZSBSZXNvdXJjZSBTZXQuPC9iPjwvdGQ+CisJPC90cj4KKzwvdGFibGU+CisKKzxoMz48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IDQwMCI+PGk+U2F2ZSB5b3VyIHdvcmsgYXQgdGhpcyBwb2ludCBieSBoaXR0aW5nIDxiPmN0cmwtczwvYj48L2k+PC9zcGFuPjwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2V4cGVyaW1lbnR0dXRvcmlhbC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9leHBlcmltZW50dHV0b3JpYWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjcxYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9leHBlcmltZW50dHV0b3JpYWwuaHRtbApAQCAtMCwwICsxLDY4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5DcmVhdGluZyBhIG5ldyBFeHBlcmltZW50IFR1dG9yaWFsPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPkNyZWF0ZSBhIG5ldyBFeHBlcmltZW50PC9oMT4KKzxwPjxiPk92ZXJ2aWV3OjwvYj48L3A+Cis8cD5BbiBFeHBlcmltZW50IGlzIGEgY29sbGVjdGlvbiBvZiA8aT5tb2RpZmllcnMgPC9pPndpdGggYSBsaW5rIHRvIGEgPGI+CitTY2VuYXJpbzwvYj48YnI+CitBbiBleHBlcmltZW50IGNhbiBydW4ganVzdCBsaWtlIGEgc2NlbmFyaW8gY2FuIHJ1bi4gV2hlbiB5b3UgcnVuIGFuIGV4cGVyaW1lbnQKK2l0IGNyZWF0ZXMgYSA8Yj5CYXRjaDwvYj48YnI+CitBIEJhdGNoIGlzIGFuIGV4ZWN1dGFibGUgdGhhdCBzcGF3bnMgb2ZmIChhIHNlcXVlbmNlIG9mKSBzaW11bGF0aW9ucy4gVGhlCitFeHBlcmltZW50IHVzZXMgbW9kaWZpZXJzIHRvIG1ha2UgY2hhbmdlcyB0byB0aGUgc2NlbmFyaW8gdGhlbiBydW4gYSBzaW11bGF0aW9uCitmcm9tIGVhY2guPGJyPgorJm5ic3A7PC9wPgorPHA+TmV3IFZpZXc6IEFjdGl2ZSBCYXRjaGVzIChhbmFsb2dvdXMgdG8gQWN0aXZlIFNpbXVsYXRpb25zKTxicj4KKzxicj4KKzEpIGNyZWF0ZSB5b3VyIHNjZW5hcmlvPGJyPgorPGJyPgorMikgaW4gdGhlIGVkaXRvciB5b3UgY2FuIGNyZWF0ZSBtb2RpZmllcnMgZm9yIG1vZGVscywgZGVjb3JhdG9ycyAoYSBkaXNlYXNlCittb2RlbCksIG9yIGdyYXBocy48YnI+CitUbyBjcmVhdGUgYSBtb2RpZmllciBmb3IgYSBkaXNlYXNlLCBmb3IgZXhhbXBsZSwgZmluZCB5b3VyIGRpc2Vhc2UgaW4gdGhlIFNURU0KK1Byb2plY3QgZXhwbG9yZXIuIFNlbGVjdCBpdCwgcmlnaHQgY2xpY2sgb24geW91ciBkaXNlYXNlLCBhbmQgY2hvc2UgY3JlYXRlIGEgbW9kaWZpZXIKK2FzIHNob3duIGluIGZpZ3VyZSAxLiA8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMzAlIiBpZD0idGFibGUxIj4KKwk8dHI+CisJCTx0ZD4KKwkJPHAgYWxpZ249ImNlbnRlciI+CisJCTxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9leHBlcjFhLmpwZyIgd2lkdGg9IjQ0OCIgaGVpZ2h0PSI2NTMiPjwvdGQ+CisJCTx0ZD48aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWcvZXhwZXIxYi5qcGciIHdpZHRoPSI0NDkiIGhlaWdodD0iNjQ5Ij48L3RkPgorCTwvdHI+CisJPHRyPgorCQk8dGQ+PGI+RmlndXJlIDFhOiBDcmVhdGluZyBhIG5ldyBtb2RpZmllciBmb3IgYSBwYXJ0aWN1bGFyIGRpc2Vhc2UgaW4gYW4KKwkJZXhpc3Rpbmcgc2NlbmFyaW88L2I+PC90ZD4KKwkJPHRkPjxiPkZpZ3VyZSAxYjogRGVmaW5pbmcgdGhlIG5ldyBtb2RpZmllciBmb3IgYW4gZXhwZXJpbWVudDwvYj48L3RkPgorCTwvdHI+Cis8L3RhYmxlPgorPHA+IDxicj4KK1RoaXMgd2lsbCBsYXVuY2ggYSBuZXcgZGlhbG9nIHRvIGhlbHAgeW91IGNyZWF0ZSBhIG1vZGlmaWVyIHRoYXQgY2FuIGJlIGFkZGVkIHRvCithbiBleHBlcmltZW50IChzZWUgZmlndXJlIDIpLiBJbiB0aGUgbmV3IG1vZGlmaWVyIGRpYWxvZywgZm9yIGV4YW1wbGUsIHVuZGVyIFRyYW5zbWlzc2lvbiByYXRlIHNlbGVjdCAmcXVvdDtyYW5nZSZxdW90OyA8YnI+Cis8aT4oc2VxdWVuY2Ugbm90IHlldCBlbmFibGVkKTwvaT4gYW5kIHNwZWNpZnkgdGhlIHJhbmdlIGFzIHNob3duIGluIGZpZ3VyZSAyLjwvcD4KKzxwPjxicj4KKzxicj4KKzMpIE9uIHRvcCwgc2VsZWN0ICZxdW90O0V4cGVyaW1lbnQgTW9kZWwmcXVvdDsgdG8gbGF1bmNoIHRoZSBleHBlcmltZW50IHdpemFyZCAoRmlndXJlIDIpPGJyPgorZHJhZyB0aGUgc2NlbmFyaW8gaW50byB0aGUgZXhwZXJpbWVudDxicj4KK2RyYWcgYW55IG51bWJlciBvZiBtb2RpZmllcnMgaW50byB0aGUgZXhwZXJpbWVudDwvcD4KKzxwPmNsaWNrIG9uIHRoZSBleHBlcmltZW50LCByaWdodCBjbGljaywgYW5kIHJ1biBpdC48L3A+Cis8Zm9udCBzaXplPSI0Ij4KKzwvZm9udD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIxIiB3aWR0aD0iNDUlIj4KKwk8dHI+CisJCTx0ZD4KKwkJPHAgYWxpZ249ImNlbnRlciI+CisJCTxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9leHBlcjIuanBnIiB3aWR0aD0iNzU2IiBoZWlnaHQ9IjQ5MCI+PC90ZD4KKwk8L3RyPgorCTx0cj4KKwkJPHRkPgorCQk8cCBhbGlnbj0iY2VudGVyIj48Yj5GaWd1cmUgMjogVGhlIE5ldyBFeHBlcmltZW50IFdpemFyZC48L2I+PC90ZD4KKwk8L3RyPgorPC90YWJsZT4KKworPGgzPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogNDAwIj48aT5TYXZlIHlvdXIgd29yayBhdCB0aGlzIHBvaW50IGJ5IGhpdHRpbmcgPGI+Y3RybC1zPC9iPjwvaT48L3NwYW4+PC9oMz4KKworCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9ncmFwaHR1dG9yaWFsLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2dyYXBodHV0b3JpYWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDhhMWY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9ncmFwaHR1dG9yaWFsLmh0bWwKQEAgLTAsMCArMSwxMTMgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkNyZWF0aW5nIGEgbmV3IEdyYXBoIFR1dG9yaWFsPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPkNyZWF0aW5nIGEgbmV3IEdyYXBoIFR1dG9yaWFsPC9oMT4KK0NyZWF0aW5nIGEgZ3JhcGggaW4gc3RlbSBpbnZvbHZlcyBidWlsZGluZyBhIG1vZGVsIGFuZCBhZGRpbmcgdG8gaXQgYSBzZXQgb2YgCitsb2NhdGlvbnMgKE5vZGVzKSBhbmQgY29ubmVjdGlvbnMgYmV0d2VlbiB0aG9zZSBsb2NhdGlvbnMgKEVkZ2VzKS48cD5TdGVtIGNvbWVzIAord2l0aCBhIG51bWJlciBvZiBidWlsZCBpbiBNb2RlbCBlYWNoIGNvbnRhaW5pbmcgcHJlY29uZmlndXJlZCBncmFwaHMuIEl0IGFsc28gCitjb21lcyB3aXRoIHByZWNvbmZpZ3VyZWQgTW9kZWxzIGZvciBldmVyeSBjb3VudHJ5IGFuZCBmb3IgZXZlcnkgY29udGluZW50LiBUaGVzZSAKK21heSBiZSBmb3VuZCBpbiB0aGUgRGVzaWduZXIgUGVyc3BlY3RpdmUgdW5kZXIgdGhlIE1vZGVscyB0YWIuIFNlZTogCitNb2RlbHMmZ3Q7R2VvZ3JhcGh5PC9wPgorPHA+QWRkaW5nIGEgbmV3IGRpc2Vhc2UgdmVjdG9yIG9yIHRyYW5zbWlzc2lvbiBwYXRoIGJldHdlZW4gdHdvIGxvY2F0aW9ucyAKK3JlcXVpcmVkIGFkZGluZyBhIG5ldyBFZGdlIGJldHdlZW4gYmV0d2VlbiB0aGUgdHdvIHJlc3BlY3RpdmUgbm9kZXMuIEJlZm9yZSB3ZSAKK2Rpc2N1c3MgaG93IHRvIGRlZmluZSBhbiBlbnRpcmVseSBuZXcgdHlwZSBvZiBlZGdlLCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhcm4gaG93IAordG8gY29tcG9zZSBhIGdyYXBoIHRha2luZyBhZHZhbnRhZ2Ugb2YgYnVpbGQgaW4gZWRnZSBjb2xsZWN0aW9ucyB0aGF0IGFyZSAKK2FscmVhZHkgaW5jbHVkZWQgaW4gU1RFTS48L3A+Cis8cD4mbmJzcDs8L3A+Cis8cCBhbGlnbj0iY2VudGVyIj48Yj48Zm9udCBzaXplPSI1Ij5Db21wb3NpbmcgYSBHcmFwaDwvZm9udD48L2I+PC9wPgorPHAgYWxpZ249ImxlZnQiPlN1cHBvc2UgeW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IHNpbXVsYXRpb24gc2NlbmFyaW8gZm9yIHNvbWUgCitkaXNlYXNlIGludm9sdmluZyB0aHJlZSBjb3VudHJpZXM7IEZyYW5jZSwgSXRhbHksIGFuZCBTcGFpbi4gU3RlbSBjb21lcyB3aXRoIAorbW9kZWxzIGZvciBlYWNoIGNvdW50cnkgYnV0IGRvZXMgbm90IGNvbWUgd2l0aCBhIGdyYXBoIGZvciB0aGF0IGdyb3VwIG9mIHRocmVlLiAKK1dlIG11c3QgY29tcG9zZSBpdC48L3A+Cis8cCBhbGlnbj0ibGVmdCI+MSkgRm9sbG93IHRoZSBleGFtcGxlIGluIHRoZSBzZWN0aW9uIG9uIDxhIGhyZWY9InByb2plY3R0dXRvcmlhbC5odG1sIj5DcmVhdGluZyBhIG5ldyBQcm9qZWN0PC9hPiAKK3RvIGNyZWF0ZSBhIHByb2plY3QgZm9sZGVyIGZvciB0aGlzIG5ldyBzY2VuYXJpby48L3A+Cis8cCBhbGlnbj0ibGVmdCI+MikgRm9sbG93IHRoZSBleGFtcGxlIGluIHRoZSBzZWN0aW9uIG9uIDxhIGhyZWY9Im1vZGVsdHV0b3JpYWwuaHRtbCI+Q3JlYXRpbmcgYSBuZXcgTW9kZWw8L2E+IAordG8gY3JlYXRlIGEgcGFyZW50IG1vZGVsLiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgd2Ugd2lsbCBhc3N1bWUgdGhhdCB5b3UgdXNlZCAKK3RoZSBuYW1lICZxdW90O0V4YW1wbGUmcXVvdDsgZm9yIHRoaXMgcGFyZW50IG1vZGVsLjwvcD4KKzxwIGFsaWduPSJsZWZ0Ij4zKSBDbGljayBvbiB5b3VyICZxdW90O0V4YW1wbGUmcXVvdDsgbW9kZWwgdG8gb3BlbiBpdCBpbiB0aGUgUmVzb3VyY2UgU2V0IAord2luZG93LjwvcD4KKzxwIGFsaWduPSJsZWZ0Ij40KSBDbGljayBvbiB0aGUgbW9kZWxzIGZvbGRlciBhbmQgb3BlbiB0aGUgRm9sZGVyczwvcD4KKzxwIGFsaWduPSJsZWZ0Ij4mZ3Q7U1RFTSZndDtHZW9ncmFwaHkmZ3Q7UG9saXRpY2FsJmd0O0NvdW50cnkmZ3Q7RVNQPC9wPgorPHAgYWxpZ249ImxlZnQiPkRyYWcgdGhlIG1vZGVsIGVudGl0bGVkJm5ic3A7ICZxdW90O0VTUCgwLCAxKSBGdWxsIEluZnJhc3RydWN0dXJlJnF1b3Q7IAoraW50byB5b3VyIHBhcmVudCAmcXVvdDtFeGFtcGxlJnF1b3Q7IG1vZGVsLiA8L3A+Cis8cCBhbGlnbj0ibGVmdCI+Jm5ic3A7JnF1b3Q7RVNQKDAsIDEpIEZ1bGwgSW5mcmFzdHJ1Y3R1cmUmcXVvdDsgaXMgdGhlIGZ1bGwgaW5mcmFzdHJ1Y3R1cmUgCitmb3IgU3BhaW4gd2l0aCBhZG1pbiAwIGFuZCBhZG1pbiAxIHJlc29sdXRpb24uIEl0IGlzIGl0c2VsZiBhIGdyYXBoIHdpdGggCitjb250YWlubWVudCByZWxhdGlvbnNoaXBzIGFuZCA8YnI+CithZGphY2VuY3kgcmVsYXRpb25zaGlwcyBmb3IgU3BhaW4uPC9wPgorPHAgYWxpZ249ImxlZnQiPjUpIFJlcGVhdCBTdGVwIDQgZm9yIEZyYW5jZSBhbmQgSXRhbHk8L3A+Cis8cCBhbGlnbj0ibGVmdCI+Jmd0O1NURU0mZ3Q7R2VvZ3JhcGh5Jmd0O1BvbGl0aWNhbCZndDtDb3VudHJ5Jmd0O0ZSQTwvcD4KKzxwIGFsaWduPSJsZWZ0Ij4mZ3Q7U1RFTSZndDtHZW9ncmFwaHkmZ3Q7UG9saXRpY2FsJmd0O0NvdW50cnkmZ3Q7SVRBPC9wPgorPHAgYWxpZ249ImxlZnQiPjYpIFlvdXIgcGFyZW50IG1vZGVsICZxdW90O0V4YW1wbGUmcXVvdDsgd2lsbCBhcHBlYXIgbmV4dCB0byBhIGJsdWUgCit0cmlhbmdsZS4gSWYgeW91IGV4cGFuZCB0aGlzIG5vZGUgYnkgY2xpY2tpbmcgb24gKCspIG5leHQgdG8gdGhlIG1vZGVsIHlvdSB3aWxsIAorc2VlIHRocmVlIG5ldyBibHVlIHRyaWFuZ2xlcyByZXByZXNlbnRpbmcgdGhlIHRocmVlIGNvdW50cnkgbGV2ZWwgZ3JhcGhzIHlvdSAKK2FkZGVkIHRvIHlvdXIgbW9kZWwgKFNlZSBGaWd1cmUgMSkuIEhvd2V2ZXIsIGF0IHRoaXMgcG9pbnQgdGhlcmUgYXJlIG5vIAorY29ubmVjdGlvbnMgYmV0d2VlbiB0aGUgdGhyZWUgY291bnRyaWVzIHlvdSBhZGRlZC4gVGhlc2UgY29ubmVjdGlvbnMgb3IgJnF1b3Q7Q29tbW9uIAorQm9yZGVyJnF1b3Q7IHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBhbnkgdHdvIGNvdW50cmllcyBtdXN0IGJlIGFkZGVkIG9uY2UgcGVyIHBhaXIgb2YgCitjb3VudHJpZXMuIFRoZXkgbWF5IGJlIGZvdW5kIHVuZGVyIHRoZSBHcmFwaHMgdGFiLiBBbnkgdHdvIHdheSBlZGdlIGlzIHBsYWNlIGluIAordGhlIGZvbGRlciBvZiB0aGUgY291bnRyaWVzIHdobydzIHRocmVlIGxldHRlciBjb3VudHJ5IGNvZGUgYXBwZWFycyBmaXJzdCAKK2FscGhhYmV0aWNhbGx5LiA8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMSIgd2lkdGg9IjEwMCUiPgorCTx0cj4KKwkJPHRkPjxiPgorCis8aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWcvZ3JhcGgxLmpwZyIgd2lkdGg9IjgwMCIgaGVpZ2h0PSI2MjMiPjwvYj48L3RkPgorCTwvdHI+CisJPHRyPgorCQk8dGQ+PGI+RmlndXJlIDE6IENvbXBvc2luZyBhIEdyYXBoPC9iPjwvdGQ+CisJPC90cj4KKzwvdGFibGU+Cis8cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Cis8cCBhbGlnbj0ibGVmdCI+NykgVG8gYWRkIHRoZSBib3JkZXIgYmV0d2VlbiBGcmFuY2UgYW5kIFNwYWluIHNlbGVjdCB0aGUgR1JBUEhTIAordGFiIGFuZCBjbGljayBvbjo8L3A+Cis8cCBhbGlnbj0ibGVmdCI+Jmd0O1NURU0mZ3Q7R2VvZ3JhcGh5Jmd0O1BvbGl0aWNhbCZndDtDb3VudHJ5Jmd0O0VTUDwvcD4KKzxwIGFsaWduPSJsZWZ0Ij5kcmFnIHRoZSBpY29uIGZvciAmcXVvdDtDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgCitFU1AgYW5kIEZSQSZxdW90OyBpbnRvIHlvdXIgJnF1b3Q7RXhhbXBsZSZxdW90OyBtb2RlbC4gSXQgd2lsbCBhcHBlYXIgYXQgdGhlIHNhbWUgbGV2ZWwgaW4gdGhlIAordHJlZSBhcyB0aGUgY291bnRyaWVzIFNwYWluIGFuZCBGcmFuY2UuIE5vdGUgdGhhdCB0aGUgRWRnZXMgY29ubmVjdGluZyBTcGFpbiBhbmQgCitGcmFuY2UgbWF5IGJlIGZvdW5kIGluIHRoZSBFU1AgZm9sZGVyIGJlY2F1c2UgRVNQIGNvbWVzIGJlZm9yZSBGUkEgCithbHBoYWJldGljYWxseS48L3A+Cis8cCBhbGlnbj0ibGVmdCI+OCkgVG8gYWRkIHRoZSBib3JkZXIgYmV0d2VlbiBGcmFuY2UgYW5kIEl0YWx5IHNlbGVjdCB0aGUgR1JBUEhTIAordGFiIGFuZCBjbGljayBvbjo8L3A+Cis8cCBhbGlnbj0ibGVmdCI+Jmd0O1NURU0mZ3Q7R2VvZ3JhcGh5Jmd0O1BvbGl0aWNhbCZndDtDb3VudHJ5Jmd0O0ZSQTwvcD4KKzxwIGFsaWduPSJsZWZ0Ij5kcmFnIHRoZSBpY29uIGZvciAmcXVvdDtDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgCitGUkEgYW5kIElUQTwvcD4KKzxwIGFsaWduPSJsZWZ0Ij45KSBGb2xsb3cgdGhlIGluc3RydWN0aW9ucyBmb3IgPGEgaHJlZj0iZGlzZWFzZXR1dG9yaWFsLmh0bWwiPkNyZWF0aW5nIGEgbmV3IERpc2Vhc2U8L2E+IAorYW5kIGRyYWcgeW91ciBuZXcgRGlzZWFzZSBpbnRvIHlvdXIgJnF1b3Q7RXhwZXJpbWVudGFsJnF1b3Q7IE1vZGVsLiBOb3RlIHRoYXQgYW55IGRpc2Vhc2UgCisob3IgYWxsIGRpc2Vhc2VzKSBhcHBlYXIgdW5kZXIgdGhlIHRvcCBsZXZlbCBNT0RFTCBub2RlLiBTZWUgZmlndXJlIDIuPC9wPgorPHAgYWxpZ249ImxlZnQiPiZuYnNwOzwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIxIiB3aWR0aD0iMTAwJSI+CisJPHRyPgorCQk8dGQ+PGI+PGltZyBib3JkZXI9IjAiIHNyYz0iaW1nL2dyYXBoMi5qcGciIHdpZHRoPSI4MDAiIGhlaWdodD0iNjIzIj48L2I+PC90ZD4KKwk8L3RyPgorCTx0cj4KKwkJPHRkPjxiPkZpZ3VyZSAyOiBBIERpc2Vhc2UgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIE1vZGVsPC9iPjwvdGQ+CisJPC90cj4KKzwvdGFibGU+Cis8cCBhbGlnbj0ibGVmdCI+MTApIEZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIDxhIGhyZWY9InNjZW5hcmlvdHV0b3JpYWwuaHRtbCI+Q3JlYXRpbmcgYSBuZXcgU2NlbmFyaW88L2E+LiAKK0FkZCB5b3VyIG1vZGVsIHRvIHRoZSBTY2VuYXJpby4gVGhlbiBmb2xsb3cgaW5zdHJ1Y3Rpb25zIGZvciZuYnNwOyA8YSBocmVmPSJzZXF1ZW5jZXJ0dXRvcmlhbC5odG1sIj5DcmVhdGluZyBhIG5ldyBTZXF1ZW5jZXI8L2E+IAorYW5kIDxhIGhyZWY9ImluZmVjdG9ydHV0b3JpYWwuaHRtbCI+Q3JlYXRpbmcgYSBuZXcgSW5mZWN0b3I8L2E+LiBTZWUgRmlndXJlIDMgCitiZWxvdy4gVGhlIFNlcXVlbmNlciwgdGhlIEluZmVjdG9yLCBhbmQgeW91ciBuZXcgJnF1b3Q7RXhhbXBsZSZxdW90OyBNb2RlbCBhcmUgYWxsIHBhcnQgb2YgCithIFNjZW5hcmlvIG5vZGUuIEV4cGFuZCB5b3VyIG1vZGVsIHRvIHNlZSB0aGUgZ3JhcGggb2Ygbm9kZXMgYW5kIGVkZ2VzLCBhcyB3ZWxsIAorYXMgdGhlIGRpc2Vhc2Ugb3IgZGlzZWFzZSB5b3UgaGF2ZSBkZWZpbmVkLiA8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMSIgd2lkdGg9IjEwMCUiPgorCTx0cj4KKwkJPHRkPgorPGltZyBib3JkZXI9IjAiIHNyYz0iaW1nL2dyYXBoMy5qcGciIHdpZHRoPSI4MDAiIGhlaWdodD0iNjIzIj48L3RkPgorCTwvdHI+CisJPHRyPgorCQk8dGQ+PGI+RmlndXJlIDM6IFRoZSBFeGFtcGxlIFNjZW5hcmlvIGlzIHJlYWR5IHRvIHJ1bi4gU2VlIHRoZSBwcm9wZXIgCisJCWhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmUgb2YgdGhpcyBzY2VuYXJpbyBpbiB0aGUgUmVzb3VyY2UgU2V0IHdpbmRvdy48L2I+PC90ZD4KKwk8L3RyPgorPC90YWJsZT4KKzxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOyZuYnNwOworPGI+RGVmaW5pbmcgYSBOZXcgR3JhcGggRWRnZTwvYj48L3A+Cis8cCBhbGlnbj0ibGVmdCI+SW4gdGhlIGV4YW1wbGUgYWJvdmUgd2UgY29tcG9zZWQgYSBncmFwaCBmcm9tIGV4aXN0aW5nIAorY29tcG9uZW50cy4gU3VwcG9zZSB5b3Ugd2FudGVkIHRvIGFkZCBhIG5ldyByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gcGxhY2VzLiAKK1Rha2UgZm9yIGV4YW1wbGUgdGhlIFN0YXRlbiBJc2xhbmQgRmVycnkgYmV0d2VlbiBTdGF0ZW4gSXNsYW5kIGFuZCBNYW5oYXR0YW4gCitJc2xhbmQgaW4gTlkuPC9wPgorPHAgYWxpZ249ImxlZnQiPjxpPnRoaXMgbmVlZHMgdG8gYmUgd3JpdHRlbi48L2k+PC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nLy5jdnNpZ25vcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NWU4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy8uY3ZzaWdub3JlCkBAIC0wLDAgKzEgQEAKK1RodW1icy5kYgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvSW5mZWN0b3JEaWFsb2cuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvSW5mZWN0b3JEaWFsb2cuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjYwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy9JbmZlY3RvckRpYWxvZy5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvSW5mZWN0b3JJY29uLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL0luZmVjdG9ySWNvbi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhkMTQyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL0luZmVjdG9ySWNvbi5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvTmV3TW9kZWwuanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvTmV3TW9kZWwuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZGU2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy9OZXdNb2RlbC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvTmV3UG9wdWxhdGlvbk1vZGVsLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL05ld1BvcHVsYXRpb25Nb2RlbC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmN2IyMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL05ld1BvcHVsYXRpb25Nb2RlbC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvZGlzZWFzZURpYWxvZy5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy9kaXNlYXNlRGlhbG9nLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGU4MDRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvZGlzZWFzZURpYWxvZy5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvZHJhZ2Rpc2Vhc2V0b21vZGVsLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL2RyYWdkaXNlYXNldG9tb2RlbC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxNGViZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL2RyYWdkaXNlYXNldG9tb2RlbC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvZXhwZXIxYS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy9leHBlcjFhLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzk1NzI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvZXhwZXIxYS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvZXhwZXIxYi5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy9leHBlcjFiLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTJhY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvZXhwZXIxYi5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvZXhwZXIyLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL2V4cGVyMi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyMmVkZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL2V4cGVyMi5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvZ3JhcGgxLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL2dyYXBoMS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5ZTFiNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL2dyYXBoMS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvZ3JhcGgyLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL2dyYXBoMi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5MTNkOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL2dyYXBoMi5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvZ3JhcGgzLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL2dyYXBoMy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJiYjVmMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL2dyYXBoMy5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvaW1wb3J0c2NlbmFyaW8xYS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy9pbXBvcnRzY2VuYXJpbzFhLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDlkNDRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvaW1wb3J0c2NlbmFyaW8xYS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvaW1wb3J0c2NlbmFyaW8xYi5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy9pbXBvcnRzY2VuYXJpbzFiLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjVhZjFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvaW1wb3J0c2NlbmFyaW8xYi5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvaW1wb3J0c2NlbmFyaW8xYy5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy9pbXBvcnRzY2VuYXJpbzFjLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTYxYjlkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvaW1wb3J0c2NlbmFyaW8xYy5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvaW1wb3J0c2NlbmFyaW8yLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL2ltcG9ydHNjZW5hcmlvMi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2YTgxMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL2ltcG9ydHNjZW5hcmlvMi5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvbW9kZWxJY29uLmpwZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL21vZGVsSWNvbi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFiNjU0NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL21vZGVsSWNvbi5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvbW9kZWxuZXN0aW5nLnBuZyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL21vZGVsbmVzdGluZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1NmJhOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL21vZGVsbmVzdGluZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvbmV3cHJvamVjdC5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy9uZXdwcm9qZWN0LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTk4NDM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvbmV3cHJvamVjdC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvbmV3cHJvamVjdEljb24uanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvbmV3cHJvamVjdEljb24uanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZDA2ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy9uZXdwcm9qZWN0SWNvbi5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvcG9wdWxhdGlvbm1vZGVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL3BvcHVsYXRpb25tb2RlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ2ZjkzMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvaW1nL3BvcHVsYXRpb25tb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvcHJvamVjdERpYWxvZy5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy9wcm9qZWN0RGlhbG9nLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmY2ODAxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvcHJvamVjdERpYWxvZy5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvcHJvcEVkaXRvci5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy9wcm9wRWRpdG9yLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODBiZGUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvcHJvcEVkaXRvci5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvc2NlbmFyaW8uanBnIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvc2NlbmFyaW8uanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmODNiOTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy9zY2VuYXJpby5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvc2VxdWVuY2VyMS5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy9zZXF1ZW5jZXIxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzAxYmZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvc2VxdWVuY2VyMS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvc2VxdWVuY2VyMi5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy9zZXF1ZW5jZXIyLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzVhYTJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvc2VxdWVuY2VyMi5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvc2VxdWVuY2VyMy5qcGcgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2ltZy9zZXF1ZW5jZXIzLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjMzMjYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbWcvc2VxdWVuY2VyMy5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbmZlY3RvcnR1dG9yaWFsLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL2luZmVjdG9ydHV0b3JpYWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTAwZTViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9pbmZlY3RvcnR1dG9yaWFsLmh0bWwKQEAgLTAsMCArMSw3MCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+Q3JlYXRpbmcgYSBuZXcgSW5mZWN0b3IgVHV0b3JpYWw8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+Q3JlYXRlIGEgbmV3IEluZmVjdG9yPC9oMT4KKworCisKKyZuYnNwOzx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIxIiB3aWR0aD0iNDUlIj4KKwk8dHI+CisJCTx0ZD4KKwkJPHAgYWxpZ249ImNlbnRlciI+CisJCTxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9JbmZlY3Rvckljb24uanBnIiB3aWR0aD0iODYiIGhlaWdodD0iOTgiPjwvdGQ+CisJPC90cj4KKwk8dHI+CisJCTx0ZD4KKwkJPHAgYWxpZ249ImNlbnRlciI+PGI+RmlndXJlIDE6IFRoZSBJbmZlY3RvciBJY29uIGxvb2tzIHNpbWlsYXIgdG8gdGhlIAorCQlOZXcgRGlzZWFzZSBJY29uIGJ1dCBjb250YWlucyBhIGNhcGl0YWwgbGV0dGVyICdJJyBpbiB0aGUgbG93ZXIgcmlnaHQgCisJCWhhbmQgY29ybmVyLjwvYj48L3RkPgorCTwvdHI+Cis8L3RhYmxlPgorPHA+Q2xpY2sgb24gdGhlIG5ldyBpbmZlY3RvciBpY29uIChibGFjayBzcXVhcmUgd2l0aCB0aGUgaGVhbHRoIHN5bWJvbCBhbmQgCit0aGUgbGV0dGVyIEkpIDwvcD4KKzxvbD4KKwk8bGk+TmFtZSBpdCAoZS5nLiwgJnF1b3Q7Q3ViYUluZmVjdG9yJnF1b3Q7KSwgdW5kZXIgRGlzZWFzZU5hbWU6ICZxdW90O0V4cGVyaW1lbnRhbERpc2Vhc2UmcXVvdDsKKwk8YnI+CismbmJzcDs8L2xpPgorCTxsaT5VbmRlciBjb3VudHJ5IHNlbGVjdCB0aGUgbG9jYXRpb24geW91IHdhbnQgdG8gaW5mZWN0IChlLmcuLCZuYnNwOyBDdWJhKS4gCisJWW91IGNhbiBpbmZlY3QgYXQgdGhlIGNvdW50cnkgbGV2ZWwsIHN0YXRlIG9yIHByb3ZpbmNlIGxldmVsIG9yIGV2ZW4gYXQgdGhlIAorCWNvdW50eSBsZXZlbCBkZXBlbmRpbmcgb24gdGhlIHJlc29sdXRpb24gb2YgdGhlIGdyYXBoIHlvdSBhcmUgdXNpbmcuIEluIHRoZSAKKwljYXNlIG9mIEN1YmEsIG9ubHkgY291bnRyeSBsZXZlbCBpcyBzZWxlY3RlZCAoc2VlIEZpZ3VyZSAyLik8YnI+CismbmJzcDs8L2xpPgorCTxsaT5DbGljayBvbiB0aGUgU2NlbmFyaW8gdG8gb3BlbiBpdCBpbiB0aGUgUmVzb3VyY2Ugc2V0IDxicj4KKyZuYnNwOzwvbGk+CisJPGxpPmRyYWcgdGhlIEN1YmFJbmZlY3RvciBmcm9tIERlY29yYXRvcnMgaW50byB0aGUgPGI+U2NlbmFyaW88L2I+IChvcGVuIGl0IHRvIHNlZSAKK2l0KSA8YnI+CismbmJzcDs8L2xpPgorCTxsaT5JbiB0aGUgcmVzb3VyY2Ugc2V0IGNsaWNrIG9uIHRoZSBpbmZlY3RvciBTSSBJbmZlY3RvciBFeHBlcmltZW50YWxEaXNlYXNlIHRvIGVkaXQgCitpdC4gWW91ciBkaXNlYXNlIG1vZGVsIG1heSBiZSBTSSwgU0lSLCBTSUVSLCBldGMgYnV0IGluIGFsbCBjYXNlcyB5b3Ugb25seSBuZWVkIAorYW4gU0kgaW5mZWN0b3IgKGFzIHRoaXMgYmFzZSBjbGFzcyB3aWxsIGFkZCBpbmZlY3Rpb3VzIHBlb3BsZSB0byBzZWVkIGFueSBtb2RlbC48YnI+CismbmJzcDs8L2xpPgorCTxsaT5DbGljayBvbiBQcm9wZXJ0aWVzIHRvIG9wZW4gdGhlIFByb3BlcnRpZXMgRWRpdG9yIGFuZCBkb3VibGUgY2xpY2sgb24gCisJdGhlIEluZmVjdG9yIGluIHRoZSBSZXNvdXJjZSBTZXQgdW5kZXIgeW91ciBzY2VuYXJpby4gVGhpcyB3aWxsIG9wZW4gYW4gCisJZWRpdG9yIHdoZXJlIHlvdSBjYW4gY29uZmlybSB0aGUgbG9jYXRpb24gdG8gYmUgaW5mZWN0ZWQgYW5kIHRoZSBudW1iZXIgb2YgCisJaW5mZWN0aW91cyBwZW9wbGUgdG8gc3RhcnQgd2l0aC48YnI+CismbmJzcDs8L2xpPgorCTxsaT5BZGQgYWRkaXRpb25hbCBpbmZlY3RvcnMgZm9yIG90aGVyIGxvY2F0aW9ucyBhcyBkZXNpcmVkIGZvbGxvd2luZyB0aGUgCisJcHJvY2VkdXJlIGFib3ZlLjxicj4KKyZuYnNwOzwvbGk+Cis8L29sPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMSIgd2lkdGg9IjcwJSI+CisJPHRyPgorCQk8dGQ+CisJCTxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9JbmZlY3RvckRpYWxvZy5qcGciIHdpZHRoPSI1MjUiIGhlaWdodD0iNjY5Ij48L3RkPgorCTwvdHI+CisJPHRyPgorCQk8dGQ+RmlndXJlIDI6IENyZWF0aW5nIGFuIEluZmVjdG9yIGZvciBDdWJhLiBIZXJlIHdlIGFyZSBzZWxlY3RpbmcgYSAKKwkJY291bnRyeSBsZXZlbCBub2RlLiBOb3RlIHRoZSBsb2NhdGlvbiBJRCAoQ1VCKS48L3RkPgorCTwvdHI+Cis8L3RhYmxlPgorPHA+PGk+c2F2ZSB5b3VyIHdvcmsgYXQgdGhpcyBwb2ludCBieSBoaXR0aW5nICZsdDtjdHJsJmd0O1M8L2k+IDwvcD4KKzxwPgorPHA+CismbmJzcDsmbmJzcDsKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL21vZGVsbmVzdGluZy5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9tb2RlbG5lc3RpbmcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzQ1OTBjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9tb2RlbG5lc3RpbmcuaHRtbApAQCAtMCwwICsxLDMwIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5OZXN0aW5nIG1vZGVsczwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5Db250cm9sbGluZyBzY2VuYXJpbyBpbml0aWFsaXphdGlvbiBieSBuZXN0aW5nIG1vZGVsczwvaDE+Cis8cD5BdCB0aGUgYmVnaW5uaW5nIG9mIGEgc2ltdWxhdGlvbiwgU1RFTSBhbGxvd3MgZGVjb3JhdG9ycyBzdWNoIGFzIHBvcHVsYXRpb24gbW9kZWxzLCBwb3B1bGF0aW9uIGluaXRpYWxpemVycworYW5kIGRpc2Vhc2UgbW9kZWxzIHRvIGluaXRpYWxpemUgdGhlbXNlbHZlcy4gRm9yIGluc3RhbmNlLCB3aGVuIGEgZGlzZWFzZSBtb2RlbCBpcyBpbml0aWFsaXplZCwgaXQgY3JlYXRlcyB0aGUgCitkaXNlYXNlIG1vZGVsIGxhYmVscyBuZWNlc3NhcnkgdG8gdHJhY2sgdGhlIHN0YXRlIG9mIHRoZSBkaXNlc2UgaW4gYSBwb3B1bGF0aW9uLiBBIGRpc2Vhc2UgbW9kZWwgZGVwZW5kcworb24gdGhlIHBvcHVsYXRpb24gbW9kZWwgbGFiZWxzIGNyZWF0ZWQgYnkgYSBwb3B1bGF0aW9uIG1vZGVsIHRvIGJlIGFibGUgdG8gY3JlYXRlIHRoZSBkaXNlYXNlIG1vZGVsIGxhYmVscy4gRnVydGhlcm1vcmUsIAorYSBwb3B1bGF0aW9uIG1vZGVsIGRlcGVuZHMgb24gdGhlIGV4aXN0YW5jZSBvZiBzdGF0aWMgcG9wdWxhdGlvbiBsYWJlbHMsIGNyZWF0ZWQgZWl0aGVyIGJ5IGEgcG9wdWxhdGlvbiBpbml0aWFsaXplcnMgCitvciBieSBkcmFnZ2luZyBwb3B1bGF0aW9uIGRhdGEgaW50byB5b3VyIG1vZGVsIGZyb20gdGhlIFNURU0gbGlicmFyeS4KKzwvcD4KKzxwPgorQ29uc2VxdWVudGx5LCB0aGUgb3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gYmVjb21lcyBpbXBvcnRhbnQsIGFuZCB0aGUgb3JkZXIgaXMgY29udHJvbGxlZCBieQorbmVzdGluZyBtb2RlbHMgaW5zaWRlIG1vZGVscy4gRGVjb3JhdG9ycyB0aGF0IGFyZSBkZWVwZXIgaW4gdGhlIG1vZGVsIHRyZWUgYXJlIGluaXRpYWxpemVkIGJlZm9yZSBkZWNvcmF0b3JzIGhpZ2hlciB1cAoraW4gdGhlIHRyZWUuIFNlZSB0aGUgZmlndXJlIGJlbG93IGZvciBhbiBleGFtcGxlLiBEZWVwZXN0IGluIHRoZSB0cmVlIGlzIGEgcG9wdWxhdGlvbiBpbml0aWFsaXplciB0aGF0IGNyZWF0ZXMgdGhlCitzdGF0aWMgcG9wdWxhdGlvbiBsYWJlbHMgbmVlZGVkIGJ5IHRoZSBkZW1vZ3JhcGhpYyBwb3B1bGF0aW9uIG1vZGVsIG9uZSBsZXZlbCB1cC4gVGhlIGRlbW9ncmFwaGljIHBvcHVsYXRpb24gbW9kZWwKK3N1YmRpdmlkZXMgdGhlIHBvcHVsYXRpb24gaW50byBzdWJncm91cHMgbmVlZGVkIGJ5IHRoZSBkaXNlYXNlIG1vZGVsIGluIHRoZSBsZXZlbCBhYm92ZS4gCis8L3A+Cis8cD4KK0luIHN1bW1hcnksIHRoZSBvcmRlciBpcyBwb3B1bGF0aW9uIGluaXRpYWxpemVycyBiZWZvcmUgcG9wdWxhdGlvbiBtb2RlbHMsIHBvcHVsYXRpb24gbW9kZWxzIGJlZm9yZSBkaXNlYXNlIG1vZGVscywKK2FuZCBkaXNlYXNlIG1vZGVscyBiZWZvcmUgaW5mZWN0b3JzL2lub2N1bGF0b3JzLgorPC9wPgorPGJyLz4KKzxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9tb2RlbG5lc3RpbmcucG5nIiI+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9tb2RlbHR1dG9yaWFsLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9oZWxwL2h0bWwvdHV0b3JpYWxzL21vZGVsdHV0b3JpYWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTNkNDc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9tb2RlbHR1dG9yaWFsLmh0bWwKQEAgLTAsMCArMSw1NyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+Q3JlYXRpbmcgYSBuZXcgTW9kZWwgVHV0b3JpYWw8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+Q3JlYXRlIGEgbmV3IE1vZGVsPC9oMT4KKworPGJyPgorQSBtb2RlbCB3aWxsIGNvbnRhaW4gc2V2ZXJhbCB0aGluZ3MgaW5jbHVkaW5nIGEgZGlzZWFzZSwgYSBsb2NhdGlvbnMgb3IgZ3JhcGhzIAorb2YgbG9jYXRpb25zLCBwb3B1bGF0aW9ucywgZXRjLjxicj4KKyZuYnNwOzx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIxIiB3aWR0aD0iMjIlIj4KKwk8dHI+CisJCTx0ZD4KKwkJPHAgYWxpZ249ImNlbnRlciI+CisJCTxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9tb2RlbEljb24uanBnIiB3aWR0aD0iMTA4IiBoZWlnaHQ9IjEwOCI+PC90ZD4KKwk8L3RyPgorCTx0cj4KKwkJPHRkPgorCQk8cCBhbGlnbj0iY2VudGVyIj48Yj5GaWcuIDE6IFRoZSBuZXcgbW9kZWwgSWNvbjwvYj48L3RkPgorCTwvdHI+Cis8L3RhYmxlPgorPHA+CitUbyBjcmVhdGUgYSBuZXcgbW9kZWwsIGdvIHRvIHRoZSBTVEVNIERlc2lnbmVyIFBlcnNwZWN0aXZlLiAKKzx1bD4KKwk8bGk+Q2xpY2sgb24gYmx1ZSB0cmlhbmdsZSB0byBjcmVhdGUgbmV3IG1vZGVsIChmb3IgZXhhbXBsZSwgY29uY2F0ZW5hdGU6IAorCUN1YmFFeHBlcmltZW50YWxEaXNlYXNlKSA8L2xpPgorCTxsaT5UaGlzIHdpbGwgbGF1bmNoIGEgZGlhbG9nIHdoZXJlIHlvdSBjYW4gZ2l2ZSB5b3VyIG1vZGVsIGEgbmFtZS48L2xpPgorCTxsaT5DbGljayBOZXh0PC9saT4KKwk8bGk+RmlsbCBpbiBhbnkgRHVibGluIGNvcmUgZGF0YSB5b3Ugd2FudCB0byBhZGQ8L2xpPgorCTxsaT5DbGljayBGaW5pc2hlZDwvbGk+Cis8L3VsPgorPHA+SW4gdGhlIFNURU0gRXhwbG9yZXIgdW5kZXIgeW91ciBuZXcgUHJvamVjdCB5b3Ugc2hvdWxkIHNlZSBhIG1vZGVscyBmb2xkZXIgCitjb250YWluaW5nIHlvdXIgbW9kZWwuIERvdWJsZTxicj4KK2NsaWNrIG9uIHlvdXIgbW9kZWwgYW5kIHlvdSBzaG91bGQgc2VlIGFsc28gc2VlIGl0IGluIHRoZSBSZXNvdXJjZSBTZXQgV2luZG93LjwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIxIiB3aWR0aD0iNTYlIj4KKwk8dHI+CisJCTx0ZD4KKwkJPHAgYWxpZ249ImNlbnRlciI+CisJCTxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9OZXdNb2RlbC5qcGciIHdpZHRoPSI2MjciIGhlaWdodD0iNDYyIj48L3RkPgorCTwvdHI+CisJPHRyPgorCQk8dGQ+CisJCTxwIGFsaWduPSJjZW50ZXIiPjxiPkZpZ3VyZSAyOiBUaGUgZGVzaWduZXIgcGVyc3BlY3RpdmUgc2hvd2luZyB0aGUgbmV3IAorCQltb2RlbCBuYW1lcyAmcXVvdDtDdWJhRXhwZXJpbWVudGFsRGlzZWFzZSZxdW90OyBpbiBib3RoIHRoZSBTVEVNIHByb2plY3QgRXhwbG9yZXIKKwkJPGJyPgorCQl1bmRlciBhIHByb2plY3QgZW50aXRsZWQgJnF1b3Q7RXhwZXJpbWVudGFsIERpc2Vhc2UmcXVvdDsgYW5kIGFsc28gaW48YnI+CisJCXRoZSAmcXVvdDtSZXNvdXJjZSBTZXQmcXVvdDsgV2luZG93LiA8L2I+PC90ZD4KKwk8L3RyPgorPC90YWJsZT4KKzxwIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvcD4KKworPGgzPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogNDAwIj48aT5TYXZlIHlvdXIgd29yayBhdCB0aGlzIHBvaW50IGJ5IGhpdHRpbmcgPGI+Y3RybC1zPC9iPjwvaT48L3NwYW4+PC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvcG9wdWxhdGlvbm1vZGVsdHV0b3JpYWwuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvcG9wdWxhdGlvbm1vZGVsdHV0b3JpYWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTQ2OGJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9wb3B1bGF0aW9ubW9kZWx0dXRvcmlhbC5odG1sCkBAIC0wLDAgKzEsNDQgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkNyZWF0aW5nIGEgbmV3IERpc2Vhc2UgVHV0b3JpYWw8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+Q3JlYXRpbmcgYSBuZXcgUG9wdWxhdGlvbiBNb2RlbDwvaDE+CisKKzxwPjEpIE9uIHRoZSBtZW51IGJhciBjbGljayAtJmd0O25ldy0mZ3Q7UG9wdWxhdGlvbiBNb2RlbCBvciBhbHRlcm5hdGl2ZWx5IHNlbGVjdCB0aGUgCitOZXcgUG9wdWxhdGlvbiBJY29uIDxpbWcgc3JjPSJpbWcvcG9wdWxhdGlvbm1vZGVsLmdpZiIvPiBmcm9tIHRoZSB0b29sYmFyIDwvcD4KKworPHA+MikgVGhpcyB3aWxsIGxhdW5jaCB0aGUgRGlhbG9nIHNob3duIGluIEZpZ3VyZSAxLiBGaWxsIGluIHRoZSBOYW1lOiAoZS5nLiBFeHBlcmltZW50YWxQb3B1bGF0aW9uTW9kZWwpCis8L3A+Cis8cD4zKSBTZWxlY3QgdGhlIFBvcHVsYXRpb24gTW9kZWwgaW4gdGhlIENvbWJvQm94OiBlLmcuLCBzZWxlY3QgJnF1b3Q7U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJbXBsJnF1b3Q7Cis8L3A+Cis8cD5TZXQgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHBvcHVsYXRpb24gbW9kZWwsIHN1Y2ggYXMgYmFja2dyb3VuZCBiaXJ0aCByYXRlLCBiYWNrZ3JvdW5kIG1vcnRhbGl0eSByYXRlIGFuZAordGltZSBwZXJpb2QgPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHNwYWNpbmc9IjEiIHdpZHRoPSI0OSUiPgorCTx0cj4KKwkJPHRkPgorCQk8cCBhbGlnbj0iY2VudGVyIj4KKwkJPGltZyBib3JkZXI9IjAiIHNyYz0iaW1nL05ld1BvcHVsYXRpb25Nb2RlbC5qcGciPjwvdGQ+CisJPC90cj4KKwk8dHI+CisJCTx0ZD4KKwkJPHAgYWxpZ249ImNlbnRlciI+PGI+RmlndXJlIDE6IFRoZSBuZXcgUG9wdWxhdGlvbiBNb2RlbC48L2I+PC90ZD4KKwk8L3RyPgorPC90YWJsZT4KKzxwPiZuYnNwOzwvcD4KKzxwPjUpIEZpbGwgaW4gYW55IER1YmxpbiBjb3JlIGRhdGEgeW91IHdhbnQgdG8gYWRkIDwvcD4KKzxwPjYpIENsaWNrIGZpbmlzaCA8L3A+Cis8cD43KSBVbmRlciBkZWNvcmF0b3JzIHlvdSBzaG91bGQgc2VlIEV4cGVyaW1lbnRhbFBvcHVsYXRpb25Nb2RlbC5zdGFuZGFyZCA8L3A+Cis8cD44KSBEb3VibGUgY2xpY2sgb24gTU9ERUxTIGluIHRoZSBwcm9qZWN0IGV4cGxvcmVyLiBZb3Ugc2hvdWxkIHNlZSAmcXVvdDtDdWJhRXhwZXJpbWVudGFsRGlzZWFzZSZxdW90OyAKK2luIHRoZSBSZXNvdXJjZSBTZXQuIDwvcD4KKzxwPjkpIERSQUcgeW91ciBuZXcgcG9wdWxhdGlvbiBtb2RlbCAoZS5nLiwgRXhwZXJpbWVudGFsUG9wdWxhdGlvbk1vZGVsLnN0YW5kYXJkKSBmcm9tIAorZGVjb3JhdG9ycyAoaW4gdGhlIHByb2plY3QgZXhwbG9yZXIgd2luZG93KSBpbnRvIHRoZSBtb2RlbCAmcXVvdDtDdWJhRXhwZXJpbWVudGFsRGlzZWFzZSZxdW90OyAKK2luIHRoZSBSZXNvdXJjZSBTZXQgd2luZG93LiBFeHBhbmQgdGhlICZxdW90O0N1YmFFeHBlcmltZW50YWxEaXNlYXNlJnF1b3Q7IGluIHRoZSAKK1Jlc291cmNlIFNldCB3aW5kb3cgdG8gc2VlIHRoYXQgaXQgd29ya2VkLgorCis8aDM+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiA0MDAiPjxpPlNhdmUgeW91ciB3b3JrIGF0IHRoaXMgcG9pbnQgYnkgaGl0dGluZyA8Yj5jdHJsLXM8L2I+PC9pPjwvc3Bhbj48L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9wcm9qZWN0dHV0b3JpYWwuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvcHJvamVjdHR1dG9yaWFsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2YTViMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvcHJvamVjdHR1dG9yaWFsLmh0bWwKQEAgLTAsMCArMSw3MSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+Q3JlYXRpbmcgYSBuZXcgUHJvamVjdCBUdXRvcmlhbDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5DcmVhdGUgYSBuZXcgUHJvamVjdDwvaDE+CisKKzxwPgorCis8Yj5TdGVwIDE6IENyZWF0aW9uIG9mIGEgbmV3IFByb2plY3QuPC9iPjxicj4KK1RoaXMgdHV0b3JpYWwgdGVsbHMgeW91IGhvdyB0byBjcmVhdGUgYSBwcm9qZWN0IGluIHRoZSBTVEVNIERlc2lnbmVyIAorcGVyc3BlY3RpdmUuIEEgcHJvamVjdCBpcyByZWFsbHkgYSBuZXcgRm9sZGVyIGluIHlvdTxicj4KK3lvdXIgU1RFTSB3b3Jrc3BhY2UuIFlvdSBuZXZlciBuZWVkIHRvIGFjY2VzcyB0aGVzZSBmb2xkZXJzIG9yIFNURU0gZGVzaWduIGZpbGVzIAorb3V0c2lkZSBvZiB0aGUgU1RFTSBlbnZpcm9ubWVudCBidXQgdGhleQorYXJlIGFsbCBzdG9yZWQgaW4gdGhlIGZvbGRlciA8YnI+CisuLi5ccnVudGltZS1zdGVtLnByb2R1Y3QgPGJyPgord2hpY2ggaXMgbG9jYXRlZCBpbiB0aGUgCitzYW1lIGZvbGRlciBhcyB5b3VyIFNURU0gd29ya3NwYWNlIChlLmcuIGM6XHJ1bnRpbWUtc3RlbS5wcm9kdWN0KS48cD4KK1RoZSBuYW1lcyB1c2VkIHRvIGNyZWF0ZSBhIFRlc3QgcHJvamVjdCBpbiB0aGlzIGV4YW1wbGUgYXJlIGluIHBhcmVudGhlc2VzLiAKKzxicj4KK1N1YnN0aXR1dGUgeW91ciBuYW1lcyBhcyBhcHByb3ByaWF0ZS4gCitJbiB0aGlzIGV4YW1wbGUsIHRoZSBzY2VuYXJpbyB3aWxsIGJlIGZvciBKYXBhbi4KKzxwPgorPGI+Tm90ZTo8L2I+IFRoZXJlIGFyZSBpY29ucyBmb3IgbWFueSBvZiB0aGUgYWN0aW9ucyBidXQgZm9yIGNsYXJpdHkgaGVyZSAKK3RoZSBtZW51YmFyIGl0ZW1zIGFyZSB1c2VkLjxicj4KK1RoZSBuZXcgcHJvamVjdCBJY29uIGlzIHNob3duIGluIEZpZ3VyZSAxLjxicj4KKyZuYnNwOzx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIxIiB3aWR0aD0iMTklIj4KKwk8dHI+CisJCTx0ZD4KKwkJPHAgYWxpZ249ImNlbnRlciI+CisJCTxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9uZXdwcm9qZWN0LmpwZyIgd2lkdGg9IjY1MSIgaGVpZ2h0PSI2MjYiPjwvdGQ+CisJPC90cj4KKwk8dHI+CisJCTx0ZD48Yj5GaWd1cmUgMTogdGhlIG5ldyBwcm9qZWN0IEljb248L2I+PC90ZD4KKwk8L3RyPgorPC90YWJsZT4KKworPGgzPkNyZWF0aW5nIHRoZSBQcm9qZWN0PC9oMz4KKzx1bD4KKzxsaT5SdW4gU1RFTS4gWW91IHNob3VsZCBzZWUgYSBUQUIgd2l0aCB0aGUgbGFiZWwgJnF1b3Q7RGVzaWduZXImcXVvdDsgb24gaXQuIFRoaXMgaXMgdGhlIAorRGVzaWduZXIgUGVyc3BlY3RpdmUgdXNlZCB0byBkZXNpZ24gcHJvamVjdHMsIFNjZW5hcmlvcywgZXRjLiBBbm90aGVyIAorcGVyc3BlY3RpdmUgaXMgdGhlIFNURU0gUGVyc3BlY3RpdmUgdXNlZCB3aGVuIHlvdSBhY3R1YWxseSBydW4gYSBtb2RlLiBJZiBmb3IgCitzb21lIHJlYXNvbiB0aGUgRGVzaWduZXIgUGVyc3BlY3RpdmUgaGFzIGJlZW4gY2xvc2VkIG9yIGlzIG5vdCB2aXNpYmxlLiBHbyB0byAKK3RoZSBtZW51IGJhciBhbmQgY2xpY2s6PGJyPgorJmd0O3dpbmRvdyZndDtvcGVuIHBlcnNwZWN0aXZlLi4uJmd0O0Rlc2lnbmVyPGJyPgordG8gb3BlbiBpdC4gR28gdG8gdGhlIFNURU0gRGVzaWduZXIgUGVyc3BlY3RpdmUuIDxicj4KKyZuYnNwOzxsaT5DbGljayBvbiBOZXctPlNURU0gcHJvamVjdCBhbmQgY3JlYXRlIG5ldyBTVEVNIHByb2plY3QgKFRlc3QpCis8bGk+Q2xpY2sgIk5leHQiIGlmIHlvdSB3YW50IHRvIHVwZGF0ZSB0aGUgRHVibGluQ29yZSBkYXRhLgorPGxpPkNsaWNrICJGaW5pc2giCis8bGk+IE9wZW4gdGhlIG5ldyBwcm9qZWN0LiBZb3Ugc2hvdWxkIHNlZSBzZXZlcmFsIGZvbGRlcnMgaW5jbHVkaW5nOiBkZWNvcmF0b3JzLCBncmFwaHMsIGV0Yy4KKzwvdWw+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIxIiB3aWR0aD0iNTklIj4KKwk8dHI+CisJCTx0ZD4KKwkJPHAgYWxpZ249ImNlbnRlciI+PGI+CisJCTxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9wcm9qZWN0RGlhbG9nLmpwZyIgd2lkdGg9IjUyNSIgaGVpZ2h0PSI0MzQiPjwvYj48L3RkPgorCTwvdHI+CisJPHRyPgorCQk8dGQ+CisJCTxwIGFsaWduPSJjZW50ZXIiPjxiPkZpZ3VyZSAyOiBUaGUgbmV3IHByb2plY3QgZGlhbG9nPC9iPjwvdGQ+CisJPC90cj4KKzwvdGFibGU+CisKKzxoMz48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IDQwMCI+PGk+U2F2ZSB5b3VyIHdvcmsgYXQgdGhpcyBwb2ludCBieSBoaXR0aW5nIDxiPmN0cmwtczwvYj48L2k+PC9zcGFuPjwvaDM+CisKKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvc2NlbmFyaW90dXRvcmlhbC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9zY2VuYXJpb3R1dG9yaWFsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyZjI0NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvc2NlbmFyaW90dXRvcmlhbC5odG1sCkBAIC0wLDAgKzEsOTkgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkNyZWF0aW5nIGEgbmV3IFNjZW5hcmlvIFR1dG9yaWFsPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPkNyZWF0ZSBhIG5ldyBTY2VuYXJpbzwvaDE+Cis8Zm9udCBzaXplPSI0Ij4KKzwvZm9udD4gCis8cD5jbGljayBvbiB0aGUgcHVycGxlIGRpYW1vbmQgaWNvbiB0byBjcmVhdGUgbmV3IHNjZW5hcmlvIDwvcD4KKzxwPmdpdmUgaXQgYSBuYW1lICh5b3UgbWlnaHQgd2FudCBtb3JlIHRoYW4gb25lIHNvIGluZGV4IGl0LCBmb3IgZXhhbXBsZSwgYXMgCismcXVvdDtFeHBlcmltZW50YWxEaXNlYXNlMSZxdW90OykgPC9wPgorPHA+RmlsbCBpbiBhbnkgRHVibGluIGNvcmUgZGF0YSB5b3Ugd2FudCB0byBhZGQgPC9wPgorPHA+Y2xpY2sgZmluaXNoIDwvcD4KKzxwPkZyb20gdGhlIFByb2plY3QgRXhwbG9yZXIgd2luZG93LCB1bmRlciBNb2RlbHMsIERyYWcgdGhlIG5ldyBtb2RlbCAKKygmcXVvdDtjdWJhLm1vZGVsJnF1b3Q7KSBpbnRvIHRoZSBuZXcgU2NlbmFyaW8gaW4gdGhlIFJlc291cmNlIFNldC4gRXhwYW5kIHRoZSBzY2VuYXJpbyBzbyAKK3lvdSBjYW4gc2VlIHRoYXQgaXQgd29ya2VkLiA8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMSIgd2lkdGg9IjU2JSI+CisJPHRyPgorCQk8dGQ+CisJCTxwIGFsaWduPSJjZW50ZXIiPgorCQk8aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWcvc2NlbmFyaW8uanBnIiB3aWR0aD0iODUyIiBoZWlnaHQ9IjQ5OCI+PC90ZD4KKwk8L3RyPgorCTx0cj4KKwkJPHRkPgorCQk8cCBhbGlnbj0iY2VudGVyIj48Yj5GaWd1cmUgMTogQSBuZXcgU2NlbmFyaW8gaW4gdGhlIFJlc291cmNlIFNldC4gVGhlIAorCQltb2RlbCBoYXMgYWxyZWFkeSBiZWVuIGRyYWdnZWQgaW50byBpdC48L2I+PC90ZD4KKwk8L3RyPgorPC90YWJsZT4KKworPHAgYWxpZ249ImxlZnQiPiZuYnNwOzwvcD4KKzxwIGFsaWduPSJsZWZ0Ij5Zb3VyIG1vZGVsIGlzIG5vdyBwYXJ0IG9mIHlvdXIgc2NlbmFyaW8gYnV0IHlvdSBhcmUgbm90IGZpbmlzaGVkIAoreWV0LiBFdmVyeSBzY2VuYXJpbyBtdXN0IGFsc28gaW5jbHVkZSBhICZxdW90O3NlcXVlbmNlciZxdW90OyB3aGljaCBiYXNpY2FsbHkgaXMgYSBjbG9jayAKK3RoYXQ8YnI+CityZWd1bGF0ZXMgdGltZSwgYW5kIGFuICZxdW90O2luZmVjdG9yJnF1b3Q7IHdoaWNoIHNldHMgdGhlIGluaXRpYWwgaW5mZWN0aW91cyBwb3B1bGF0aW9uLiAKK0lmIHlvdSByYW4gYSBtb2RlbCBmb3IgYW4gaW5mZWN0aW91cyBkaXNlYXNlIHdoZXJlIG5vYm9keSB3YXMgaW5mZWN0ZWQgYW55d2hlcmUgCit0aGVuPGJyPgorbm90aGluZyB3b3VsZCBoYXBwZW4uIFBsZWFzZSBmb2xsb3cgdGhlIHNlcGFyYXRlIHR1dG9yaWFscyBvbiAmcXVvdDs8YSBocmVmPSJzZXF1ZW5jZXJ0dXRvcmlhbC5odG1sIj5jcmVhdGluZyAKK2Egc2VxdWVuY2VyPC9hPiZxdW90OyBhbmQgJnF1b3Q7PGEgaHJlZj0iaW5mZWN0b3J0dXRvcmlhbC5odG1sIj5jcmVhdGluZyBhbmQgaW5mZWN0b3I8L2E+JnF1b3Q7IAordG8gbGVhcm4gbW9yZSBhYm91dCBob3cgdG8gY3JlYXRlIGFuZCBjdXN0b21pemU8YnI+CitlYWNoIG9mIHRoZW0uIEluIHRoZSBleGFtcGxlIGJlbG93IHdlIHdpbGwgZGVzY3JpYmUgY3JlYXRpb24gb2YgYSBzY2VuYXJpbyB1c2luZyAKK2EgZGVmYXVsdCBzZXF1ZW5jZXIgYnV0IHlvdSBjYW4gZWFzaWx5IHVzZSB5b3VyIG93biBjdXN0b20gc2VxdWVuY2Ugc2ltcGx5PGJyPgorYnkgZHJhZ2dpbmcgdGhhdCBmcm9tJm5ic3A7IHlvdXIgcHJvamVjdHMgJnF1b3Q7c2VxdWVuY2VycyZxdW90OyBmb2xkZXIuPC9wPgorPHAgYWxpZ249ImxlZnQiPjxicj4KKzxiPkFkZCBhIHNlcXVlbmNlciB0byB0aGUgU2NlbmFyaW88L2I+PGJyPgorPGJyPgorVG8gYWRkIHRoZSBzeXN0ZW0gZGVmYXVsdCBzZXF1ZW5jZXIgdG8geW91ciBtb2RlbCwgZ28gdG8gU2VxdWVuY2VycyBvbiB0aGUgCitib3R0b20gd2luZG93IC0gZXhwYW5kIGZ1bGx5PGJyPgorPGJyPgorZHJhZyAmcXVvdDtTZXF1ZW50aWFsIFNlcXVlbmNlciAyMDA2JnF1b3Q7IGludG8gdGhlIFNjZW5hcmlvIGluIHRoZSBSZXNvdXJjZSBTZXQuIE1ha2UgCitzdXJlIHlvdSBoYXZlIGEgcHJvcGVydGllcyBFZGl0b3IgV2luZG93IG9wZW48YnI+Cis8YnI+CitjbGljayBvbiAmZ3Q7V2luZG93Jmd0O290aGVyJmd0O0dlbmVyYWwmZ3Q7UHJvcGVydGllcyB0byBvcGVuIHRoZSBwcm9wZXJ0aWVzIHZpZXcuIE9wZW4gdGhlIAorRGlzZWFzZSBpbiB0aGUgUHJvcGVydGllcyBFZGl0b3IgJiM4MjExOyBnZXQgcmVhZHkgdG8gQ3JlYXRlIGFuIEluZmVjdG9yPGJyPgorJm5ic3A7PC9wPgorPHAgYWxpZ249ImxlZnQiPjxiPkFkZGluZyBhbiBJbmZlY3Rvcjxicj4KKzwvYj48aT5TZWUgYWxzbyB0aGUgaW5zdHJ1Y3Rpb25zIGZvciA8YSBocmVmPSJpbmZlY3RvcnR1dG9yaWFsLmh0bWwiPmNyZWF0aW5nIGFuIAoraW5mZWN0b3IuPC9hPjwvaT48YnI+CitUbyBjcmVhdGUgYW4gaW5mZWN0b3IgeW91IGZpcnN0IG5lZWQgdG8gbWFrZSBzdXJlIHlvdSBrbm93IHRoZSBleGFjdCAmIzgyMTY7RGlzZWFzZSAKK05hbWUmIzgyMTc7IHVzZWQgd2hlbiB5b3UgY3JlYXRlZCB5b3VyIGRpc2Vhc2UuIDxicj4KK1RvIGJlIHN1cmUgY2hlY2sgaXQgYXMgZm9sbG93cy4gSW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIFVuZGVyIERlY29yYXRvcnMsIAorZG91YmxlIGNsaWNrIG9uIEV4cGVyaW1lbnRhbERpc2Vhc2Uuc3RhbmRhcmQgPGJyPgorVGhlIG5ldyBkaXNlYXNlIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgcmVzb3VyY2Ugc2V0LiBFeHBhbmQgdGhlIGZpbGUgbm9kZSBhbiB5b3UgCitzaG91bGQgc2VlICYjODIyMDtFeHBlcmltZW50YWxEaXNlYXNlIG1vZGVsIGh1bWFuJiM4MjIxOy4gPGJyPgorQ2xpY2sgb24gJiM4MjIwO0V4cGVyaW1lbnRhbERpc2Vhc2UgRGlzZWFzZSBtb2RlbCBodW1hbiYjODIyMTsgSW4gdGhlIGJvdHRvbSB3aW5kb3cgY2xpY2sgb24gCit0aGUgcHJvcGVydGllcyB0YWIgdG8gc2hvdyB0aGUgZGlzZWFzZSBpbiB0aGUgcHJvcGVydGllcyBlZGl0b3Igdmlldy4gPGJyPgorPGJyPgorQ2xpY2sgb24gdGhlIG5ldyBpbmZlY3RvciBpY29uIChibGFjayBzcXVhcmUgd2l0aCB0aGUgaGVhbHRoIHN5bWJvbCBhbmQgdGhlIAorbGV0dGVyIEkpPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjEwJSIgaWQ9InRhYmxlMSI+CisJPHRyPgorCQk8dGQ+CisJCTxwIGFsaWduPSJjZW50ZXIiPjxiPgorCQk8aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWcvSW5mZWN0b3JJY29uLmpwZyIgd2lkdGg9Ijg2IiBoZWlnaHQ9Ijk4Ij48L2I+PC90ZD4KKwk8L3RyPgorCTx0cj4KKwkJPHRkIGhlaWdodD0iMjciPgorCQk8cCBhbGlnbj0iY2VudGVyIj48Yj5UaGUgTmV3IEluZmVjdG9yIEljb248L2I+PC90ZD4KKwk8L3RyPgorPC90YWJsZT4KKzxwIGFsaWduPSJsZWZ0Ij48YnI+Cis8YnI+CitOYW1lIGl0IChlLmcuLCAmcXVvdDtDdWJhSW5mZWN0b3ImcXVvdDspLCB1bmRlciBEaXNlYXNlTmFtZTogJnF1b3Q7RXhwZXJpbWVudGFsRGlzZWFzZSZxdW90Ozxicj4KK1VuZGVyIGNvdW50cnkgc2VsZWN0IEN1YmE8YnI+CitDbGljayBvbiB0aGUgU2NlbmFyaW8gdG8gb3BlbiBpdCBpbiB0aGUgUmVzb3VyY2Ugc2V0PGJyPgorZHJhZyB0aGUgQ3ViYUluZmVjdG9yIGZyb20gRGVjb3JhdG9ycyBpbnRvIHRoZSBzY2VuYXJpbyAob3BlbiBpdCB0byBzZWUgaXQpPGJyPgorPGJyPgorSW4gdGhlIHJlc291cmNlIHNldCBjbGljayBvbiB0aGUgaW5mZWN0b3IgU0kgSW5mZWN0b3IgRXhwZXJpbWVudGFsRGlzZWFzZSB0byAKK2VkaXQgaXQuIFlvdXIgZGlzZWFzZSBtb2RlbCBtYXkgYmUgU0ksIFNJUiwgU0lFUiwgZXRjIGJ1dCBpbiBhbGwgY2FzZXMgeW91IG9ubHkgCituZWVkIGFuIFNJIGluZmVjdG9yIChhcyB0aGlzIGJhc2UgY2xhc3Mgd2lsbCBhZGQgaW5mZWN0aW91cyBwZW9wbGUgdG8gc2VlZCBhbnkgCittb2RlbC48YnI+Cis8YnI+CitjbGljayBvbiB0aGUgc2NlbmFyaW8sIHJpZ2h0IGNsaWNrIGFuZCBydW4gPC9wPgorPGgzIGFsaWduPSJsZWZ0Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IDQwMCI+PGk+U2F2ZSB5b3VyIHdvcmsgYXQgdGhpcyBwb2ludCBieSBoaXR0aW5nIDxiPmN0cmwtczwvYj48L2k+PC9zcGFuPjwvaDM+CisKKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvc2VxdWVuY2VydHV0b3JpYWwuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC90dXRvcmlhbHMvc2VxdWVuY2VydHV0b3JpYWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjI3NzIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3R1dG9yaWFscy9zZXF1ZW5jZXJ0dXRvcmlhbC5odG1sCkBAIC0wLDAgKzEsNzEgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkNyZWF0aW5nIGEgbmV3IFNlcXVlbmNlciBUdXRvcmlhbDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5DcmVhdGluZyBhIG5ldyBTZXF1ZW5jZXIgVHV0b3JpYWw8L2gxPgorPHA+RXZlcnkgc2NlbmFyaW8gbXVzdCBhbHNvIGluY2x1ZGUgYSAmcXVvdDtzZXF1ZW5jZXImcXVvdDsgd2hpY2ggYmFzaWNhbGx5IGlzIGEgY2xvY2sgCit0aGF0PGJyPgorcmVndWxhdGVzIHRpbWUsIGFuZCBhbiAmcXVvdDtpbmZlY3RvciZxdW90OyB3aGljaCBzZXRzIHRoZSBpbml0aWFsIGluZmVjdGlvdXMgcG9wdWxhdGlvbi4gCitTdGVtIGhhcyBhIGJ1aWxkIGluIGRlZmF1bHQ8YnI+CitzZXF1ZW5jZXIgY2FsbGVkIHRoZSAmcXVvdDtTZXF1ZW50aWFsIFNlcXVlbmNlciZxdW90OyBidXQgeW91IHdpbGwgbm8gZG91YnQgd2FudCB0byBjcmVhdGUgCit5b3VyIG93biB0byBzcGVjaWZ5PGJyPgorc3RhcnQgdGltZSwgc3RlcCBzaXplLCBlbmQgdGltZSwgZXRjLjwvcD4KKzxwPlRvIGNyZWF0ZSBhIG5ldyBzZXF1ZW5jZXIgY2xpY2sgb24gdGhlIE5ldyBTZXF1ZW5jZXIgSWNvbiB3aGljaCBhcHBlYXJzIGFzIGEgCitsaXR0bGUgY2xvY2suPGJyPgorQWx0ZXJuYXRpdmVseSwgb24gdGhlIG1lbnUgYmFyIHlvdSBjYW4gc2VsZWN0ICZndDtORVcmZ3Q7U0VRVUVOQ0VSPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjE2JSIgaWQ9InRhYmxlMSI+CisJPHRyPgorCQk8dGQgYWxpZ249ImNlbnRlciI+CisJCTxpbWcgYm9yZGVyPSIwIiBzcmM9ImltZy9zZXF1ZW5jZXIzLmpwZyIgd2lkdGg9IjU4IiBoZWlnaHQ9IjU2Ij48L3RkPgorCTwvdHI+CisJPHRyPgorCQk8dGQgYWxpZ249ImNlbnRlciI+PGI+RmlndXJlIDE6IFRoZSBOZXcgU2VxdWVuY2VyIEljb248L2I+PC90ZD4KKwk8L3RyPgorPC90YWJsZT4KKzxwPiZuYnNwOzwvcD4KKzxwPlRoZSAmcXVvdDtOZXcgU2VxdWVudGlhbCBTZXF1ZW5jZXImcXVvdDsgRGlhbG9nIHdpbGwgb3BlbiBhcyBzaG93biBpbiBmaWd1cmUgMiBiZWxvdy48YnI+CitTcGVjaWZ5IGluIHdoaWNoIFByb2plY3QgdG8gcHV0IHRoZSBTZXF1ZW5jZXIgKGl0IHdpbGwgYWx3YXlzIGdvIGluIHlvdXIgCitTZXF1ZW5jZXJzIGZvbGRlcikuPGJyPgorR2l2ZSBpdCBhIG5hbWUsIGFuZCBzZWxlY3QgdGhlIGN5Y2xlIHBlcmlvZCBhbmQgdW5pdC4gQXQgdGhpcyBwb2ludCBpbiB0aW1lIFNURU0gCitvbmx5IHN1cHBvcnRzPGJyPgorY29uc3RhbnQgdGltZSBzdGVwcy4gSW4gdGhlIGZ1dHVyZSBuZXcgU2VxdWVuY2VycyB3aWxsIGJlIGNyZWF0ZWQgdGhhdCBhbGxvdyAKK3ZhcmlhYmxlIHRpbWUgc3RlcHMuPC9wPgorPHA+U2VsZWN0IHRoZSBzdGFydGluZyBkYXRlLjwvcD4KKzxwPklmIHlvdSB3aXNoIHRvIHNwZWNpZnkgYW5kIEVuZCBEYXRlIGJlIHN1cmUgdG8gY2hlY2sgdGhlIDxiPiZxdW90O1NwZWNpZnkgRW5kIAorRGF0ZSZxdW90OyA8L2I+Y2hlY2tib3guPGJyPgorVGhpcyBjaGVjayBib3ggTVVTVCBiZSBzZXQgZm9yIHRoZSBlbmQgZGF0ZSB0byBiZSBlZGl0YWJsZSBsYXRlci48L3A+Cis8cD5Zb3Ugd2lsbCB0aGVuIGJlIGFsbG93ZWQgdG8gc2V0IHRoZSBFbmQgRGF0ZSBpbiB0aGUgc2Vjb25kIGNhbGVuZGFyLiA8YnI+CismbmJzcDs8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMzQlIiBpZD0idGFibGUyIj4KKwk8dHI+CisJCTx0ZCBhbGlnbj0iY2VudGVyIj48Yj4KKwkJPGltZyBib3JkZXI9IjAiIHNyYz0iaW1nL3NlcXVlbmNlcjEuanBnIiB3aWR0aD0iNDU1IiBoZWlnaHQ9IjYzNiI+PC9iPjwvdGQ+CisJPC90cj4KKwk8dHI+CisJCTx0ZCBhbGlnbj0iY2VudGVyIj48Yj5GaWd1cmUgMjogVGhlIE5ldyBTZXF1ZW50aWFsIFNlcXVlbmNlciBEaWFsb2cgCisJCWhlbHBzIHlvdSBjb25maWd1cmUgYSBTZXF1ZW5jZXIuPC9iPjwvdGQ+CisJPC90cj4KKzwvdGFibGU+Cis8cD4mbmJzcDs8L3A+Cis8cD5PbmNlIHlvdSBoYXZlIGNyZWF0ZWQgeW91ciBzZXF1ZW5jZXIgaXQgbXVzdCBiZSBkcmFnZ2VkIGludG8geW91ciBzY2VuYXJpbyAKK2ZvbGRlci4gRm9sbG93IHRoZSBpbnN0cnVjdGlvbnM8YnI+Cit1bmRlciA8YSBocmVmPSJzY2VuYXJpb3R1dG9yaWFsLmh0bWwiPiZxdW90O0NyZWF0aW5nIGEgU2NlbmFyaW8mcXVvdDsuIDwvYT4mbmJzcDtUaGUgCitzZXF1ZW5jZXIgY2FuIGJlIGVkaXRlZCBhZnRlciBjcmVhdGlvbiBieSBvcGVuaW5nIHRoZSBzY2VuYXJpbywgc2VsZWN0aW5nIHRoZQorPGJyPgorc2VxdWVuY2VyLCBhbmQgZG91YmxlIGNsaWNraW5nIHRvIG9wZW4gaXQgaW4gdGhlICZxdW90O3Byb3BlcnR5IGVkaXRvciZxdW90OyBhdCB0aGUgYm90dG9tIAorb2YgdGhlIHNjcmVlbiAoU2VlIGZpZ3VyZSAzKS48L3A+Cis8cD4mbmJzcDs8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTQlIiBpZD0idGFibGUzIj4KKwk8dHI+CisJCTx0ZD48aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWcvc2VxdWVuY2VyMi5qcGciIHdpZHRoPSI2NTkiIGhlaWdodD0iNTg2Ij48L3RkPgorCTwvdHI+CisJPHRyPgorCQk8dGQ+RmlndXJlIDM6IENoYW5naW5nIHRoZSBzZXF1ZW5jZXIgaW4gdGhlIHByb3BlcnR5IGVkaXRvciBhZnRlciBpdCBoYXMgCisJCWJlZW4gYWRkZWQgdG8gYSBzY2VuYXJpby48L3RkPgorCTwvdHI+Cis8L3RhYmxlPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC93aGF0c25ldy92MC4yLjIuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2hlbHAvaHRtbC93aGF0c25ldy92MC4yLjIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2Q2N2VhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvaGVscC9odG1sL3doYXRzbmV3L3YwLjIuMi5odG1sCkBAIC0wLDAgKzEsMjMgQEAKKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+V2hhdCdzIG5ldyBpbiBWMC4yLjIgb2YgU1RFTTwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5XaGF0J3MgbmV3IGluIFYwLjIuMiBvZiBTVEVNPC9oMT4KKzxvbD4KKworCTxsaT5UaW1lIGRlbGF5IGNoYW5nZWQgZnJvbSBzZWNvbmRzIHRvIG1pbGxpc2Vjb25kcyA8YQorCQlocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA0NDgzIj5CdWcKKwkyMDQ0ODM8L2E+PC9saT4KKwkKKwk8bGk+VGltZSBTZXJpZXMgdmlldyBub3cgc2hvd3MgdGltZSB1bml0cyA8YQorCQlocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjExODM2Ij5CdWcKKwkyMTE4MzY8L2E+PC9saT4KKwkKKwkJPGxpPk5lZWQgdXNlciB0dXRvcmlhbCBmb3IgY29tcG9zaW5nIGEgbmV3IGdyYXBoIDxhCisJCWhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTM2NTYiPkJ1ZworCTIxMzY1NjwvYT48L2xpPgorPC9vbD4KKzwvYm9keT4KKworPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2phdmFkb2MueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvamF2YWRvYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxNWU5ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL2phdmFkb2MueG1sCkBAIC0wLDAgKzEsNjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCBkZWZhdWx0PSJqYXZhZG9jIj4KKwk8ZGVzY3JpcHRpb24+CisJICAgIEdlbmVyYXRlIEphdmFEb2MgZm9yIHRoZSBTVEVNIHByb2plY3RzCisJCQorCQkgIFRoZSBvdXRwdXQgd2lsbCBnbyB0bzoKKwkJICAgIG9yZy5lY2xpcHNlLnN0ZW0uZG9jL2phdmFkb2MKKwkJCisJCSAgVGhpcyBnZW5lcmF0ZXMgdGhvdXNhbmRzIG9mIHdybmluZyBtZXNzYWdlcyBidXQgCisJCSAgdGhlcmUgYXBwZWFycyB0byBiZSBubyBlYXN5IHdheSB0byBhdm9pZCB0aGlzLgorCQkKKwkgICAgPC9kZXNjcmlwdGlvbj4KKworCQkKKworCQk8IS0tIFAgciBvIGogZSBjIHQgIFMgcCBlIGMgaSBmIGkgYyBhIHQgaSBvIG4gcyAtLT4KKworCisJCTwhLS0gVGhlIHByZWZpeCBmb3IgZnVsbHkgcXVhbGlmaWVkIG5hbWVzIC0tPgorCQk8cHJvcGVydHkgbmFtZT0iSURfUk9PVCIgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0iIC8+CisKKwkKKwk8IS0tIAorCSAgICBUaGUgc291cmNlIGZpbGUgdG8gZ2VuZXJhdGUgSmF2YURvYyBmb3IgIAorCS0tPgorCTxwYXRoIGlkPSJzb3VyY2VwYXRoIj4JCQorCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLyR7SURfUk9PVH0uY29yZS9zcmMiIC8+CQkKKwkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8ke0lEX1JPT1R9LmRlZmluaXRpb25zL3NyYyIgLz4KKwkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8ke0lEX1JPT1R9LnRlc3RzLnV0aWwvc3JjIiAvPgorCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLyR7SURfUk9PVH0uZGlzZWFzZW1vZGVscy9zcmMiIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vJHtJRF9ST09UfS5kaXNlYXNlcy9zcmMiIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vJHtJRF9ST09UfS5nZW9ncmFwaHkvc3JjIiAvPgorCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLyR7SURfUk9PVH0uaW50ZXJuYWwuZGF0YS9zcmMiIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vJHtJRF9ST09UfS5qb2JzL3NyYyIgLz4KKwkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8ke0lEX1JPT1R9LnNlcXVlbmNlcnMvc3JjIiAvPgorCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLyR7SURfUk9PVH0udWkvc3JjIiAvPgorCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLyR7SURfUk9PVH0udWkuZGlzZWFzZW1vZGVscy9zcmMiIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vJHtJRF9ST09UfS51aS5nZS9zcmMiIC8+CisJPC9wYXRoPgorCQorCQorPHRhcmdldCBuYW1lPSJqYXZhZG9jIj4KKyAgCisgIDxqYXZhZG9jIGFjY2Vzcz0icHVibGljIiBhdXRob3I9ImZhbHNlIiAJCQorCWRlc3RkaXI9ImphdmFkb2MiIGRvY3RpdGxlPSJTVEVNIEphdmFkb2MiIG5vZGVwcmVjYXRlZD0iZmFsc2UiIG5vZGVwcmVjYXRlZGxpc3Q9ImZhbHNlIiBub2luZGV4PSJmYWxzZSIgbm9uYXZiYXI9ImZhbHNlIiBub3RyZWU9ImZhbHNlIiAKKwlzb3VyY2VwYXRocmVmPSJzb3VyY2VwYXRoIgkKKwlzb3VyY2U9IjEuNSIgIHNwbGl0aW5kZXg9InRydWUiIHVzZT0idHJ1ZSIgdmVyc2lvbj0iZmFsc2UiCisgIAkgIC8+IAorPC90YXJnZXQ+CisKKzwhLS0gCisJCSogQnVpbGQgdGhlIHppcCBmaWxlICAKKwkJKiAgIAorCQkqIAorCQktLT4KKwk8dGFyZ2V0IG5hbWU9InppcCIgCisJCWRlc2NyaXB0aW9uPSJjcmVhdGVzIHRoZSB6aXAgZmlsZSI+CQorCQkJCQorCQk8emlwIAorCQkJZGVzdGZpbGU9ImphdmFkb2MuemlwIj4KKwkJCTx6aXBmaWxlc2V0IGRpcj0iamF2YWRvYyIgcHJlZml4PSJqYXZhZG9jIi8+IAkgICAgICAKKwkJCSAKKwkJPC96aXA+CisJPC90YXJnZXQ+CisJCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9ub3RpY2UuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL25vdGljZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YWY5NjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9ub3RpY2UuaHRtbApAQCAtMCwwICsxLDc5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Cis8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPk1hcmNoIDE3LCAyMDA1PC9wPgorCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisKKzxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKyAgIAorPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAorICAgCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKKyAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorICAgCis8dWw+CisJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKzwvdWw+ICAgCisgCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKworPHVsPgorCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKwkJCis8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCitpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KK3RoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KKwk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCisJPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKwk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCis8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKworPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKyAgIAorPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YjUzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDEzIEBACisjLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BsdWdpbk5hbWUgPSBTVEVNIERvY3VtZW50YXRpb24KK3Byb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkZjUxOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL3BsdWdpbi54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjQiPz4KKzxwbHVnaW4+CisKKyAgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KKyAgICAgPHRvYworICAgICAgICAgICBmaWxlPSJ0b2MueG1sIgorICAgICAgICAgICBwcmltYXJ5PSJ0cnVlIi8+CisgICAgIAorICA8L2V4dGVuc2lvbj4KKyAgCisgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+CisgICAgIDx0b2MKKyAgICAgICAgICAgZmlsZT0idG9jY29uY2VwdHMueG1sIj4KKyAgICAgPC90b2M+CisgICAgIDx0b2MgZmlsZT0idG9jZ2V0dGluZ3N0YXJ0ZWQueG1sIi8+CisgICAgIDx0b2MgZmlsZT0idG9jcmVmZXJlbmNlLnhtbCIvPgorICAgICA8dG9jCisgICAgICAgICAgIGZpbGU9InRvY2VwaWRlbWlvbG9naWNhbG1vZGVsaW5nLnhtbCIKKyAgICAgICAgICAgPgorICAgICA8L3RvYz4KKyAgICAgPHRvYworICAgICAgICAgICBmaWxlPSJ0b2NpbnRlcmZhY2UueG1sIj4KKyAgICAgPC90b2M+CisgICAgIDx0b2MKKyAgICAgICAgICAgZmlsZT0idG9jdHV0b3JpYWxzLnhtbCI+CisgICAgIDwvdG9jPgorICAgPC9leHRlbnNpb24+CisKKyA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KKyAgICA8Y29udGV4dHMgZmlsZT0iY29udGV4dHNlbnNpdGl2ZWhlbHAueG1sIi8+CisgICAgPC9leHRlbnNpb24+CisKKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy90b2MueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvdG9jLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODFhN2I1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvdG9jLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KKworPHRvYyBsYWJlbD0iU1RFTSBVc2VyIEhlbHAiIHRvcGljPSJoZWxwL2h0bWwvdG9jLmh0bWwiPgorCTx0b3BpYyBsYWJlbD0iR2V0dGluZyBTdGFydGVkIj4KKwkJPGFuY2hvciBpZD0iZ2V0dGluZ3N0YXJ0ZWQiIC8+CisJPC90b3BpYz4KKwk8dG9waWMgbGFiZWw9IkNvbmNlcHRzIj4KKwkJPGFuY2hvciBpZD0iY29uY2VwdHMiIC8+CisJPC90b3BpYz4KKwk8dG9waWMgbGFiZWw9IkludGVyZmFjZSI+CisJCTxhbmNob3IgaWQ9ImludGVyZmFjZSIgLz4KKwk8L3RvcGljPgorCTx0b3BpYyBsYWJlbD0iRXBpZGVtaW9sb2dpY2FsIE1vZGVsaW5nIj4KKwkJPGFuY2hvciBpZD0iZXBpZGVtaW9sb2dpY2FsbW9kZWxpbmciIC8+CisJPC90b3BpYz4KKwk8dG9waWMgbGFiZWw9IlR1dG9yaWFscyAoaW50ZXJuZXQgYWNjZXNzIHJlcXVpcmVkKSI+CisJCTxhbmNob3IgaWQ9InR1dG9yaWFscyIgLz4KKwk8L3RvcGljPgorCTx0b3BpYyBsYWJlbD0iUmVmZXJlbmNlIj4KKwkJPGFuY2hvciBpZD0icmVmZXJlbmNlIiAvPgorCTwvdG9waWM+CisJPHRvcGljIGhyZWY9ImhlbHAvaHRtbC9yZWZlcmVuY2UvZGlzY2xhaW1lci5odG1sIiBsYWJlbD0iRGlzY2xhaW1lciI+CisJCTxhbmNob3IgaWQ9ImRpc2NsYWltZXIiIC8+CisJPC90b3BpYz4KKzwvdG9jPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvdG9jY29uY2VwdHMueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvdG9jY29uY2VwdHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNjRkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy90b2Njb25jZXB0cy54bWwKQEAgLTAsMCArMSwxMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+CisKKzx0b2MgbGFiZWw9IkNvbmNlcHRzIiBsaW5rX3RvPSJ0b2MueG1sI2NvbmNlcHRzIj4KKwk8dG9waWMgbGFiZWw9Ik92ZXJ2aWV3IiBocmVmPSJoZWxwL2h0bWwvY29uY2VwdHMvb3ZlcnZpZXcuaHRtbCI+CisJPC90b3BpYz4KKwk8dG9waWMgbGFiZWw9Ik1vZGVsaW5nIEZyYW1ld29yayIKKwkJaHJlZj0iaGVscC9odG1sL2NvbmNlcHRzL21vZGVsaW5nZnJhbWV3b3JrLmh0bWwiPgorCTwvdG9waWM+CisJPHRvcGljIGxhYmVsPSJFeHRlbnNpYmlsaXR5IgorCQlocmVmPSJoZWxwL2h0bWwvY29uY2VwdHMvZXh0ZW5zaWJpbGl0eS5odG1sIj4KKwk8L3RvcGljPgorPC90b2M+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy90b2NkaXNjbGFpbWVyLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZG9jL3RvY2Rpc2NsYWltZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZWI5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy90b2NkaXNjbGFpbWVyLnhtbApAQCAtMCwwICsxLDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgorCis8dG9jIGxhYmVsPSJEaXNjbGFpbWVyIiBsaW5rX3RvPSJ0b2MueG1sI2Rpc2NsYWltZXIiIHRvcGljPSJoZWxwL2h0bWwvcmVmZXJlbmNlL2Rpc2NsYWltZXIuaHRtbCI+CisJPHRvcGljIGxhYmVsPSJEaXNjbGFpbWVyIgorCQlocmVmPSJoZWxwL2h0bWwvcmVmZXJlbmNlL2Rpc2NsYWltZXIuaHRtbCI+CisJPC90b3BpYz4KKzwvdG9jPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvdG9jZXBpZGVtaW9sb2dpY2FsbW9kZWxpbmcueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvdG9jZXBpZGVtaW9sb2dpY2FsbW9kZWxpbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYThhMDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy90b2NlcGlkZW1pb2xvZ2ljYWxtb2RlbGluZy54bWwKQEAgLTAsMCArMSwxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+CisKKzx0b2MgbGFiZWw9IkVwaWRlbWlvbG9naWNhbCBNb2RlbGluZyIKKwlsaW5rX3RvPSJ0b2MueG1sI2VwaWRlbWlvbG9naWNhbG1vZGVsaW5nIj4KKwk8dG9waWMgbGFiZWw9IkVwaWRlbWlvbG9naWNhbCBNb2RlbGluZyBPdmVydmlldyIKKwkJaHJlZj0iaGVscC9odG1sL2VwaWRlbWlvbG9naWNhbG1vZGVsaW5nL292ZXJ2aWV3Lmh0bWwiIC8+CisJPHRvcGljIGxhYmVsPSJTSSBEaXNlYXNlIE1vZGVsIE1hdGhlbWF0aWNzIgorCQlocmVmPSJoZWxwL2h0bWwvZXBpZGVtaW9sb2dpY2FsbW9kZWxpbmcvc2ltYXRoLmh0bWwiIC8+CisJPHRvcGljIGxhYmVsPSJTSVIgRGlzZWFzZSBNb2RlbCBNYXRoZW1hdGljcyIKKwkJaHJlZj0iaGVscC9odG1sL2VwaWRlbWlvbG9naWNhbG1vZGVsaW5nL3Npcm1hdGguaHRtbCIgLz4KKwk8dG9waWMgbGFiZWw9IlNFSVIgRGlzZWFzZSBNb2RlbCBNYXRoZW1hdGljcyIKKwkJaHJlZj0iaGVscC9odG1sL2VwaWRlbWlvbG9naWNhbG1vZGVsaW5nL3NlaXJtYXRoLmh0bWwiIC8+CisKKzwvdG9jPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvdG9jZ2V0dGluZ3N0YXJ0ZWQueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvdG9jZ2V0dGluZ3N0YXJ0ZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMDZlOGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy90b2NnZXR0aW5nc3RhcnRlZC54bWwKQEAgLTAsMCArMSw4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KKworPHRvYyBsYWJlbD0iR2V0dGluZyBTdGFydGVkIiBsaW5rX3RvPSJ0b2MueG1sI2dldHRpbmdzdGFydGVkIj4KKwk8dG9waWMgbGFiZWw9IlF1aWNrIFN0YXJ0IgorCQlocmVmPSJoZWxwL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvcXVpY2tzdGFydC5odG1sIj4KKwk8L3RvcGljPgorPC90b2M+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy90b2NpbnRlcmZhY2UueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvdG9jaW50ZXJmYWNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWVhMjcyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvdG9jaW50ZXJmYWNlLnhtbApAQCAtMCwwICsxLDEzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+CisKKzx0b2MgbGFiZWw9IkludGVyZmFjZSIgbGlua190bz0idG9jLnhtbCNpbnRlcmZhY2UiPgorCisJPHRvcGljIGxhYmVsPSJPdmVydmlldyIKKwkJaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS9pbnRlcmZhY2VvdmVydmlldy5odG1sIiAvPgorCisJPHRvcGljIGxhYmVsPSJQZXJzcGVjdGl2ZXMiCisJCWhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL3BlcnNwZWN0aXZlc292ZXJ2aWV3Lmh0bWwiPgorCQk8dG9waWMgbGFiZWw9IkFuYWx5c2lzIgorCQkJaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS9wZXJzcGVjdGl2ZXMvYW5hbHlzaXMuaHRtbCIgLz4KKwkJPHRvcGljIGxhYmVsPSJEZXNpZ25lciIKKwkJCWhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL2Rlc2lnbmVyLmh0bWwiIC8+CisJCTx0b3BpYyBsYWJlbD0iU2ltdWxhdGlvbiIKKwkJCWhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2UvcGVyc3BlY3RpdmVzL3NpbXVsYXRpb24uaHRtbCIgLz4KKwk8L3RvcGljPgorCisJPHRvcGljIGxhYmVsPSJWaWV3cyIKKwkJaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy92aWV3c292ZXJ2aWV3Lmh0bWwiPgorCQk8dG9waWMgbGFiZWw9IkFjdGl2ZSBTaW11bGF0aW9ucyBWaWV3IgorCQkJaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9hY3RpdmVzaW11bGF0aW9uc3ZpZXcuaHRtbCIgLz4KKwkJPHRvcGljIGxhYmVsPSJDb250cm9sIFZpZXciCisJCQlocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2NvbnRyb2x2aWV3Lmh0bWwiIC8+CisgIAkJPHRvcGljIGxhYmVsPSJDU1YgTG9nZ2VyIFZpZXciIAorICAJCQlocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2NzdmxvZ2dlcnZpZXcuaHRtbCIgLz4KKwkJPHRvcGljIGxhYmVsPSJEZWNvcmF0b3JzIFZpZXciCisJCQlocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2RlY29yYXRvcnN2aWV3Lmh0bWwiIC8+CisJCTx0b3BpYyBsYWJlbD0iRGlzZWFzZXMgVmlldyIKKwkJCWhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvZGlzZWFzZXN2aWV3Lmh0bWwiIC8+CisJCQk8dG9waWMgbGFiZWw9IkVwaWRlbWljIFZpZXciCisJCQlocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2VwaWRlbWljdmlldy5odG1sIiAvPgorCQk8dG9waWMgbGFiZWw9IkVycm9yIExvZyBWaWV3IgorCQkJaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9lcnJvcl9sb2cuaHRtbCIgLz4KKwkJCTx0b3BpYyBsYWJlbD0iRXN0aW1hdG9yIFZpZXciCisJCQlocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL2VzdGltYXRvcnZpZXcuaHRtbCIgLz4KKwkJPHRvcGljIGxhYmVsPSJHb29nbGUgRWFydGggVmlldyIKKwkJCWhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvZ2UuaHRtbCIgLz4KKwkJPHRvcGljIGxhYmVsPSJHcmFwaHMgVmlldyIKKwkJCWhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvZ3JhcGhzdmlldy5odG1sIiAvPgorCQkJPHRvcGljIGxhYmVsPSJMeWFwdW5vdiBWaWV3IgorCQkJaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9seWFwdW5vdnZpZXcuaHRtbCIgLz4KKwkJPHRvcGljIGxhYmVsPSJNYXAgVmlldyIKKwkJCWhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvbWFwdmlldy5odG1sIiAvPgorCQk8dG9waWMgbGFiZWw9Ik1vZGVscyBWaWV3IgorCQkJaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9tb2RlbHN2aWV3Lmh0bWwiIC8+CisgIDx0b3BpYyBocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL3Byb2plY3R2aWV3Lmh0bWwiIGxhYmVsPSJQcm9qZWN0IEV4cGxvcmVyIj4KKyAgPC90b3BpYz4KKyAgPHRvcGljIGhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2Uvdmlld3MvcHJvcGVydGllc3ZpZXcuaHRtbCIgbGFiZWw9IlByb3BlcnRpZXMgVmlldyI+CisgIDwvdG9waWM+CisgIDx0b3BpYyBocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL3JlcG9ydHZpZXcuaHRtbCIgbGFiZWw9IlJlcG9ydCBWaWV3Ij4KKyAgPC90b3BpYz4KKwkJCTx0b3BpYyBocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3ZpZXdzL3NjZW5hcmlvY29tcGFyaXNvbnZpZXcuaHRtbCIgbGFiZWw9IlNjZW5hcmlvIENvbXBhcmlzb24gVmlldyI+CisgICA8L3RvcGljPgorCQk8dG9waWMgbGFiZWw9IlNjZW5hcmlvcyBWaWV3IgorCQkJaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9zY2VuYXJpb3N2aWV3Lmh0bWwiIC8+CisJCTx0b3BpYyBsYWJlbD0iU2VxdWVuY2VycyBWaWV3IgorCQkJaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy9zZXF1ZW5jZXJzdmlldy5odG1sIiAvPgorICA8dG9waWMgaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS92aWV3cy90YXNrc3ZpZXcuaHRtbCIgbGFiZWw9IlRhc2tzIFZpZXciPgorICA8L3RvcGljPgorCTwvdG9waWM+CisKKwk8dG9waWMgbGFiZWw9IkVkaXRvcnMiCisJCWhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9lZGl0b3Jzb3ZlcnZpZXcuaHRtbCI+CisgIDx0b3BpYyBocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL2VkaXRvcnMvZXhwZXJpbWVudGVkaXRvci5odG1sIiBsYWJlbD0iRXhwZXJpbWVudCBFZGl0b3IiPgorICA8L3RvcGljPgorCQk8dG9waWMgbGFiZWw9IkdyYXBoIEVkaXRvciIKKwkJCWhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9ncmFwaGVkaXRvci5odG1sIiAvPgorCQk8dG9waWMgbGFiZWw9Ik1vZGVsIEVkaXRvciIKKwkJCWhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy9tb2RlbGVkaXRvci5odG1sIiAvPgorICA8dG9waWMgaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL21vZGlmaWVyZWRpdG9yLmh0bWwiIGxhYmVsPSJNb2RpZmllciBFZGl0b3IiPgorICA8L3RvcGljPgorICA8dG9waWMgaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL3ByZWRpY2F0ZWVkaXRvci5odG1sIiBsYWJlbD0iUHJlZGljYXRlIEVkaXRvciI+CisgIDwvdG9waWM+CisJCTx0b3BpYyBsYWJlbD0iU2NlbmFyaW8gRWRpdG9yIgorCQkJaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS9lZGl0b3JzL3NjZW5hcmlvZWRpdG9yLmh0bWwiIC8+CisgIDx0b3BpYyBocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL2VkaXRvcnMvc2VxdWVuY2VyZWRpdG9yLmh0bWwiIGxhYmVsPSJTZXF1ZW5jZXIgRWRpdG9yIj4KKyAgPC90b3BpYz4KKyAgPHRvcGljIGhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2UvZWRpdG9ycy90cmlnZ2VyZWRpdG9yLmh0bWwiIGxhYmVsPSJUcmlnZ2VyIEVkaXRvciI+CisgIDwvdG9waWM+CisJPC90b3BpYz4KKworCTx0b3BpYyBsYWJlbD0iV2l6YXJkcyIKKwkJaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL3dpemFyZHNvdmVydmlldy5odG1sIj4KKwkJPHRvcGljIGxhYmVsPSJOZXcgRGlzZWFzZSBXaXphcmQiCisJCQlocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvZGlzZWFzZXdpemFyZC5odG1sIiAvPgorICA8dG9waWMgaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL2V4cGVyaW1lbnR3aXphcmQuaHRtbCIgbGFiZWw9Ik5ldyBFeHBlcmltZW50IFdpemFyZCI+CisgIDwvdG9waWM+CisJCTx0b3BpYyBocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvZ3JhcGh3aXphcmQuaHRtbCIgbGFiZWw9Ik5ldyBHcmFwaCBXaXphcmQiPgorICA8L3RvcGljPgorICA8dG9waWMgaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL2luZmVjdG9yd2l6YXJkLmh0bWwiIGxhYmVsPSJOZXcgSW5mZWN0b3IvSW5vY3VsYXRvciBXaXphcmQiPgorICA8L3RvcGljPgorCQk8dG9waWMgaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL21vZGVsd2l6YXJkLmh0bWwiIGxhYmVsPSJOZXcgTW9kZWwgV2l6YXJkIj4KKyAgPC90b3BpYz4KKyAgPHRvcGljIGhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9tb2RpZmllcndpemFyZC5odG1sIiBsYWJlbD0iTmV3IE1vZGlmaWVyIFdpemFyZCI+CisgIDwvdG9waWM+CisgIDx0b3BpYyBocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvcG9wdWxhdGlvbndpemFyZC5odG1sIiBsYWJlbD0iTmV3IFBvcHVsYXRpb24gV2l6YXJkIj4KKyAgPC90b3BpYz4KKyAgPHRvcGljIGhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9wb3B1bGF0aW9uaW5pdGlhbGl6ZXJ3aXphcmQuaHRtbCIgbGFiZWw9Ik5ldyBQb3B1bGF0aW9uIEluaXRpYWxpemVyIFdpemFyZCI+CisgIDwvdG9waWM+CisgIDx0b3BpYyBocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvcHJlZGljYXRld2l6YXJkLmh0bWwiIGxhYmVsPSJOZXcgUHJlZGljYXRlIFdpemFyZCI+CisgIDwvdG9waWM+CisJCTx0b3BpYyBsYWJlbD0iTmV3IFJlYWwtVGltZSBTZXF1ZW5jZXIgV2l6YXJkIgorCQkJaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL3JlYWx0aW1lc2VxdWVuY2Vyd2l6YXJkLmh0bWwiIC8+CisJCTx0b3BpYyBsYWJlbD0iTmV3IFNjZW5hcmlvIFdpemFyZCIKKwkJCWhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2Uvd2l6YXJkcy9zY2VuYXJpb3dpemFyZC5odG1sIiAvPgorCQk8dG9waWMgbGFiZWw9Ik5ldyBTZXF1ZW50aWFsIFNlcXVlbmNlciBXaXphcmQiCisJCQlocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvc2VxdWVudGlhbHNlcXVlbmNlcndpemFyZC5odG1sIiAvPgorCQk8dG9waWMgbGFiZWw9Ik5ldyBTVEVNIFByb2plY3QgV2l6YXJkIgorCQkJaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS93aXphcmRzL3N0ZW1wcm9qZWN0d2l6YXJkLmh0bWwiIC8+CisgIDx0b3BpYyBocmVmPSJoZWxwL2h0bWwvaW50ZXJmYWNlL3dpemFyZHMvdHJpZ2dlcndpemFyZC5odG1sIiBsYWJlbD0iTmV3IFRyaWdnZXIgV2l6YXJkIj4KKyAgPC90b3BpYz4KKwk8L3RvcGljPgorCisJPHRvcGljIGxhYmVsPSJQcmVmZXJlbmNlcyIKKwkJaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9wcmVmZXJlbmNlc292ZXJ2aWV3Lmh0bWwiPgorICA8dG9waWMgaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9wcmVmZXJlbmNlc2xvZ2dpbmcuaHRtbCIgbGFiZWw9IkxvZ2dpbmciPgorICA8L3RvcGljPgorCisJCTx0b3BpYyBsYWJlbD0iU2ltdWxhdGlvbiBNYW5hZ2VtZW50IgorCQkJaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9wcmVmZXJlbmNlc3NpbW1hbmFnZW1lbnQuaHRtbCIgLz4KKyAgPHRvcGljIGhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvcHJlZmVyZW5jZXNzb2x2ZXIuaHRtbCIgbGFiZWw9IlNvbHZlciI+CisgIDwvdG9waWM+CisKKwkJPHRvcGljIGxhYmVsPSJWaXN1YWxpemF0aW9uIgorCQkJaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9wcmVmZXJlbmNlc3Zpc3VhbGl6YXRpb250b3BsZXZlbC5odG1sIj4KKwkJCTx0b3BpYyBsYWJlbD0iR29vZ2xlIEVhcnRoIgorCQkJCWhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvcHJlZmVyZW5jZXNnZXRvcGxldmVsLmh0bWwiPgorCQkJCTx0b3BpYyBsYWJlbD0iQWR2YW5jZWQiCisJCQkJCWhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvcHJlZmVyZW5jZXNnZWFkdmFuY2VkLmh0bWwiIC8+CisJCQk8L3RvcGljPgorCQkJPHRvcGljIGxhYmVsPSJNYXAgQ29sb3JzIgorCQkJCWhyZWY9ImhlbHAvaHRtbC9pbnRlcmZhY2UvcHJlZmVyZW5jZXMvcHJlZmVyZW5jZXNtYXB2aWV3Lmh0bWwiIC8+CisgICA8dG9waWMgaHJlZj0iaGVscC9odG1sL2ludGVyZmFjZS9wcmVmZXJlbmNlcy9wb3B1bGF0aW9ubW9kZWxpbmcuaHRtbCIgbGFiZWw9IlBvcHVsYXRpb24gTW9kZWxpbmciPgorICAgPC90b3BpYz4KKwkJPC90b3BpYz4KKworCTwvdG9waWM+Cis8L3RvYz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZG9jL3RvY3JlZmVyZW5jZS54bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy90b2NyZWZlcmVuY2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YWM5NWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmRvYy90b2NyZWZlcmVuY2UueG1sCkBAIC0wLDAgKzEsOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+CisKKzx0b2MgbGFiZWw9IlJlZmVyZW5jZSBNYXRlcmlhbCIgbGlua190bz0idG9jLnhtbCNyZWZlcmVuY2UiPgorCTx0b3BpYyBsYWJlbD0iU1RFTSByZWZlcmVuY2UgaW5mb3JtYXRpb24iCisJCWhyZWY9ImhlbHAvaHRtbC9yZWZlcmVuY2UvcmVmZXJlbmNlcy5odG1sIj4KKwk8L3RvcGljPgorPC90b2M+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmRvYy90b2N0dXRvcmlhbHMueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvdG9jdHV0b3JpYWxzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWRmNzRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5kb2MvdG9jdHV0b3JpYWxzLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KKworPHRvYyBsYWJlbD0iVHV0b3JpYWxzIChpbnRlcm5ldCBhY2Nlc3MgcmVxdWlyZWQpIiBsaW5rX3RvPSJ0b2MueG1sI3R1dG9yaWFscyI+CisJPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIFNjZW5hcmlvIgorCQlocmVmPSJodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9DcmVhdGluZ19hX1NURU1fU2NlbmFyaW8iIC8+CisgICA8dG9waWMgaHJlZj0iaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvQmF0Y2hfTW9kZV8lMjhSdW5uaW5nX0V4cGVyaW1lbnRzJTI5IiBsYWJlbD0iQ3JlYXRpbmcgYW5kIHJ1bm5pbmcgRXhwZXJpbWVudHMiPgorICAgPC90b3BpYz4KKyAgIDx0b3BpYyBocmVmPSJodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9JbnZva2luZ19tb2RpZmllcnNfdXNpbmdfdHJpZ2dlcnNfYW5kX3ByZWRpY2F0ZXMuIiBsYWJlbD0iTW9kaWZ5aW5nIHNjZW5hcmlvcyB1c2luZyB0cmlnZ2VycyI+CisgICA8L3RvcGljPgorCTx0b3BpYyBsYWJlbD0iQW5hbHlzaXMiPgorCQk8dG9waWMgbGFiZWw9IkFuYWx5c2lzIG92ZXJ2aWV3IgorCQlocmVmPSJodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9BbmFseXNpcyIgLz4KKwkJPHRvcGljIGxhYmVsPSJBbmFseXppbmcgYW4gRXBpZGVtaWMiCisJCWhyZWY9Imh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VwaWRlbWljX1ZpZXciIC8+CisJCTx0b3BpYyBsYWJlbD0iRXN0aW1hdGluZyBNb2RlbCBQYXJhbWV0ZXJzIgorCQlocmVmPSJodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9Fc3RpbWF0aW5nX01vZGVsX1BhcmFtZXRlcnNfZnJvbV9FeHRlcm5hbF9EYXRhIiAvPgorCQk8dG9waWMgbGFiZWw9Ikx5YXB1bm92IChQaGFzZSBTcGFjZSkgQW5hbHlzaXMiCisJCWhyZWY9Imh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0x5YXB1bm92X0FuYWx5c2lzIiAvPgorCQk8dG9waWMgbGFiZWw9IkNvbXBhcmluZyBTY2VuYXJpb3MgYW5kIEVwaWRlbWljcyIKKwkJaHJlZj0iaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvUk1TX0NvbXBhcmlzb25fYmV0d2Vlbl9kYXRhX3NldHMiIC8+CisgCTwvdG9waWM+Cis8L3RvYz4KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLmNvcmUvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLmZlYXR1cmUuY29yZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWUzZmZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLmNvcmUvLnByb2plY3QKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLmNvcmU8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmZlYXR1cmUuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLmNvcmUvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjY5MDQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLmNvcmUvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDMgQEAKK2Jpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCisgICAgICAgICAgICAgICBub3RpY2UuaHRtbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLmNvcmUvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLmNvcmUvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNGIxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmZlYXR1cmUuY29yZS9lcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwzMjggQEAKKzxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKK3htbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCit4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Cis8bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Cis8bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxsaW5rIHJlbD1GaWxlLUxpc3QKK2hyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgorPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Cis8IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8bzpEb2N1bWVudFByb3BlcnRpZXM+CisgIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+CisgIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KKyAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgorICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgorICA8bzpQYWdlcz40PC9vOlBhZ2VzPgorICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgorICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KKyAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgorICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+CisgIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgorICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgorIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Cis8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8dzpXb3JkRG9jdW1lbnQ+CisgIDx3OlRyYWNrUmV2aXNpb25zLz4KKyA8L3c6V29yZERvY3VtZW50PgorPC94bWw+PCFbZW5kaWZdLS0+Cis8c3R5bGU+Cis8IS0tCisgLyogRm9udCBEZWZpbml0aW9ucyAqLworQGZvbnQtZmFjZQorCXtmb250LWZhbWlseTpUYWhvbWE7CisJcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7CisJbXNvLWZvbnQtY2hhcnNldDowOworCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOworCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOworCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQorIC8qIFN0eWxlIERlZmluaXRpb25zICovCitwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCisJe21zby1zdHlsZS1wYXJlbnQ6IiI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorcAorCXttYXJnaW4tcmlnaHQ6MGluOworCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOworCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOworCW1hcmdpbi1sZWZ0OjBpbjsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0CisJe21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOworCW1hcmdpbjowaW47CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6OC4wcHQ7CisJZm9udC1mYW1pbHk6VGFob21hOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK0BwYWdlIFNlY3Rpb24xCisJe3NpemU6OC41aW4gMTEuMGluOworCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOworCW1zby1oZWFkZXItbWFyZ2luOi41aW47CisJbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKKwltc28tcGFwZXItc291cmNlOjA7fQorZGl2LlNlY3Rpb24xCisJe3BhZ2U6U2VjdGlvbjE7fQorLS0+Cis8L3N0eWxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+CisKKzxkaXYgY2xhc3M9U2VjdGlvbjE+CisKKzxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KKzwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgorVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKK1JFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQorT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2luIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCitkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+CitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2NoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCitzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCitieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKK2lmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCitzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKK1Byb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgord2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQord29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCitlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50CitjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQorb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKK2Rpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCityZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAorYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCitzdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQorZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQorU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cworUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKK3BhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKK2FuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQorY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KK29mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCitieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgordG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bworYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQorUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cworQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKK3RoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAorZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAorbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKK3RvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCitpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCit0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCitkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKK0VhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0CityaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCit0aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgorPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2VmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKK2NvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKK2FuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5CithbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKK2luY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKK2FzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQorc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAorQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQorc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAoraW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQorY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKK2NvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKK2NvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQorb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKK3N1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKK2FjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKK2FuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCitvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKK2xpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCitDb250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgorQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCitjb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCitsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwordGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgorY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKK29mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcworcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCit0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCit0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAorYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKK2luIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAord2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKK3NlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQorb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQorY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKK0FHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCitXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCitNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQorcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKK1Byb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKK0FncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKK2NvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCitlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCitPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKK1RIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKK1RIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCitvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0CitmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQorbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KK2FnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKK290aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQorc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAorc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQorcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKK3JpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKK2NvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50CitTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKK3RoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCit0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCitBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bworc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KKyhpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKK2V4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKK2V4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQorU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgorQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCitBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCitpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KKworPC9kaXY+CisKKzwvYm9keT4KKworPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS5jb3JlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLmNvcmUvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyYzAxYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS5jb3JlL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsMTMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGZlYXR1cmUKKyAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmZlYXR1cmUuY29yZSIKKyAgICAgIGxhYmVsPSJTVEVNIENvcmUiCisgICAgICB2ZXJzaW9uPSIxLjAuMS5xdWFsaWZpZXIiPgorCisgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2Rlc2NyaXB0aW9uIj4KKyAgICAgIFtFbnRlciBGZWF0dXJlIERlc2NyaXB0aW9uIGhlcmUuXQorICAgPC9kZXNjcmlwdGlvbj4KKworICAgPGNvcHlyaWdodCB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY29weXJpZ2h0Ij4KKyAgICAgIFtFbnRlciBDb3B5cmlnaHQgRGVzY3JpcHRpb24gaGVyZS5dCisgICA8L2NvcHlyaWdodD4KKworICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xpY2Vuc2UiPgorICAgICAgW0VudGVyIExpY2Vuc2UgRGVzY3JpcHRpb24gaGVyZS5dCisgICA8L2xpY2Vuc2U+CisKKyAgIDxyZXF1aXJlcz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pIi8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVkaXQudWkiLz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnBkZS5ydW50aW1lIi8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuaGVscC5hcHBzZXJ2ZXIiLz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmVuZ2luZSIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmJpcnQuY29yZS51aSIvPgorICAgPC9yZXF1aXJlcz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5kb2MiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLm5sMSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscyIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkubmwxIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgZnJhZ21lbnQ9InRydWUiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2VycyIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLmNvcmUvbm90aWNlLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmZlYXR1cmUuY29yZS9ub3RpY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFmOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLmNvcmUvbm90aWNlLmh0bWwKQEAgLTAsMCArMSw3OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5NYXJjaCAxNywgMjAwNTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisgICAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKKyAgIAorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCisgICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKyAgIAorPHVsPgorCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucworICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPiAgIAorIAorPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisJCQorPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisJPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQorCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisgICAKKzxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLnByZXJlcS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS5wcmVyZXEvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5OWU5ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS5wcmVyZXEvLnByb2plY3QKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLnByZXJlcTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS5wcmVyZXEvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS5wcmVyZXEvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTdmNjRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLnByZXJlcS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNCBAQAorYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAorICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAorICAgICAgICAgICAgICAgbm90aWNlLmh0bWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS5wcmVyZXEvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLnByZXJlcS9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YjE5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS5wcmVyZXEvZXBsLXYxMC5odG1sCkBAIC0wLDAgKzEsMzI4IEBACis8aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCit4bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoreG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgorPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgorPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Cis8bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Cis8bGluayByZWw9RmlsZS1MaXN0CitocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KKzx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgorPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+CisgPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgorICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgorICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+CisgIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KKyAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KKyAgPG86UGFnZXM+NDwvbzpQYWdlcz4KKyAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KKyAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+CisgICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KKyAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgorICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KKyAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KKyA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgorPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+CisgPHc6V29yZERvY3VtZW50PgorICA8dzpUcmFja1JldmlzaW9ucy8+CisgPC93OldvcmREb2N1bWVudD4KKzwveG1sPjwhW2VuZGlmXS0tPgorPHN0eWxlPgorPCEtLQorIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KK0Bmb250LWZhY2UKKwl7Zm9udC1mYW1pbHk6VGFob21hOworCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OworCW1zby1mb250LWNoYXJzZXQ6MDsKKwltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKKwltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKKwltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KKyAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLworcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAorCXttc28tc3R5bGUtcGFyZW50OiIiOworCW1hcmdpbjowaW47CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AKKwl7bWFyZ2luLXJpZ2h0OjBpbjsKKwltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKKwltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKKwltYXJnaW4tbGVmdDowaW47CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAorCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjguMHB0OworCWZvbnQtZmFtaWx5OlRhaG9tYTsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitAcGFnZSBTZWN0aW9uMQorCXtzaXplOjguNWluIDExLjBpbjsKKwltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKKwltc28taGVhZGVyLW1hcmdpbjouNWluOworCW1zby1mb290ZXItbWFyZ2luOi41aW47CisJbXNvLXBhcGVyLXNvdXJjZTowO30KK2Rpdi5TZWN0aW9uMQorCXtwYWdlOlNlY3Rpb24xO30KKy0tPgorPC9zdHlsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgorCis8ZGl2IGNsYXNzPVNlY3Rpb24xPgorCis8cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Cis8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKK1RIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCitSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKK09GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgorZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgorYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCitjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKK2FkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQorc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAorYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCitpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgorc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCitQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KK3dpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKK3dvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgorZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAorY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKK29yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCitkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobworcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQorU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKK2Egbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgorc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKK2Rpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCitDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKK2Zvcm0uPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKK1JlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCitwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0CithbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKK2NvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCitvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAorYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KK3RvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KK2FueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKK2xpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKK1JlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKK0NvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCit0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5CityaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKK2ZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKK2xpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Cit0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAoraWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQordGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQorZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCitFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAorcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgordGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KKzwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2l0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQoraXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCitlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCitjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCithbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQorYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKK2VmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCitpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCithcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKK3N0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKK0NvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKK3N0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKK2luZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKK2NvZGUgZm9ybTo8L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2l0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCitjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Citjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKK29yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCitzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5CithY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCithbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQorb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCitsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQorUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAorQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKK0NvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAorY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgorbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KK3RoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KK2Nvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0CitvZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKK3JlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgordG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgordG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKK2FueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCitpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQorUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQorQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKK2NsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKK3dhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCitzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKK290aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKK2NvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAorV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKK3Jlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCitQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCitBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCitjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgorZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKK0FHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKK05FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCitUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCitUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAorb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKK2VuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAorZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKK21pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCithZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCithbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCitvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKK1JlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKK3N1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKK3NoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCitjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKK3BlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCityaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCitSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKK1JlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCitjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKK2NvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAorU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCit0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwordGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAorQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KK3NlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgorb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KKyhpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKK2luIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KK3RoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCitleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90CitleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKK1N0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKK0FtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcworQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcworaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+CisKKzwvZGl2PgorCis8L2JvZHk+CisKKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmZlYXR1cmUucHJlcmVxL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLnByZXJlcS9mZWF0dXJlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmYyNjFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLnByZXJlcS9mZWF0dXJlLnhtbApAQCAtMCwwICsxLDM2MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxmZWF0dXJlCisgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLnByZXJlcSIKKyAgICAgIGxhYmVsPSJQcmVyZXEgRmVhdHVyZXMiCisgICAgICB2ZXJzaW9uPSIxLjAuMS5xdWFsaWZpZXIiCisgICAgICBwcm92aWRlci1uYW1lPSJFY2xpcHNlIj4KKworICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9kZXNjcmlwdGlvbiI+CisgICAgICBFY2xpcHNlIFByZXJlcXMgZm9yIFNURU0KKyAgIDwvZGVzY3JpcHRpb24+CisKKyAgIDxjb3B5cmlnaHQgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NvcHlyaWdodCI+CisgICAgICBbRW50ZXIgQ29weXJpZ2h0IERlc2NyaXB0aW9uIGhlcmUuXQorICAgPC9jb3B5cmlnaHQ+CisKKyAgIDxsaWNlbnNlIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9saWNlbnNlIj4KKyAgICAgIFtFbnRlciBMaWNlbnNlIERlc2NyaXB0aW9uIGhlcmUuXQorICAgPC9saWNlbnNlPgorCisgICA8dXJsPgorICAgICAgPHVwZGF0ZSBsYWJlbD0iU1RFTSBsb2NhbCB1cGRhdGUgc2l0ZSIgdXJsPSJmaWxlOi9DOi9lY2xpcHNlL3VwZGF0ZSIvPgorICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iU1RFTSB1cGRhdGUgc2l0ZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdGVjaG5vbG9neS9zdGVtL3VwZGF0ZS1zaXRlLyIvPgorICAgPC91cmw+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJjb20uaWJtLmljdSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmJpcnQuY2hhcnQuZW5naW5lIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYmlydC5jb3JlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYmlydC5jb3JlLnVpIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucyIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuam9icyIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUubmV0IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5jb21wYXRpYmlsaXR5IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkuYXV0aCIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LnJlZ2lzdHJ5IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guYXBwIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24iCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZmFjZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGV4dCIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZm9ybXMiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cyIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLmxvZyIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5tb3ppbGxhLnJoaW5vIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+CisKKzwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS5wcmVyZXEvbm90aWNlLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmZlYXR1cmUucHJlcmVxL25vdGljZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YWY5NjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmZlYXR1cmUucHJlcmVxL25vdGljZS5odG1sCkBAIC0wLDAgKzEsNzkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+TWFyY2ggMTcsIDIwMDU8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorICAgCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCisgICAKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUworICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisgICAKKzx1bD4KKwk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4gICAKKyAKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKwk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCQkKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKwk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKKwk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorICAgCis8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTA5ODA4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlL2VwbC12MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDRiMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoreG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKK3htbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPGxpbmsgcmVsPUZpbGUtTGlzdAoraHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOkRvY3VtZW50UHJvcGVydGllcz4KKyAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KKyAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgorICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+CisgIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+CisgIDxvOlBhZ2VzPjQ8L286UGFnZXM+CisgIDxvOldvcmRzPjE2MjY8L286V29yZHM+CisgIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgorICAgPG86TGluZXM+Nzc8L286TGluZXM+CisgIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KKyAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+CisgIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+CisgPC9vOkRvY3VtZW50UHJvcGVydGllcz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OldvcmREb2N1bWVudD4KKyAgPHc6VHJhY2tSZXZpc2lvbnMvPgorIDwvdzpXb3JkRG9jdW1lbnQ+Cis8L3htbD48IVtlbmRpZl0tLT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlRhaG9tYTsKKwlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKKwltc28tZm9udC1jaGFyc2V0OjA7CisJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7CisJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7CisJbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KK3AuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bXNvLXN0eWxlLXBhcmVudDoiIjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwCisJe21hcmdpbi1yaWdodDowaW47CisJbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CisJbWFyZ2luLWxlZnQ6MGluOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKKwl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZTo4LjBwdDsKKwlmb250LWZhbWlseTpUYWhvbWE7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorQHBhZ2UgU2VjdGlvbjEKKwl7c2l6ZTo4LjVpbiAxMS4waW47CisJbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47CisJbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKKwltc28tZm9vdGVyLW1hcmdpbjouNWluOworCW1zby1wYXBlci1zb3VyY2U6MDt9CitkaXYuU2VjdGlvbjEKKwl7cGFnZTpTZWN0aW9uMTt9CistLT4KKzwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgorPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCitUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAorUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCitPRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCithZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKK3N1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKK2J5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgoraWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KK3N1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCit3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKK2VudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKK2NsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCitvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucworZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KK3JlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50CithIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KK3N0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5CitkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCitSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAorYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCitjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgorb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKK2J5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCit0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCithbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCitSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCitDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgordGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Citmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQordG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKK2lmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKK3RoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQorRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKK3JpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KK3RoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Cis8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK2l0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAorY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQorYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKK2FuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCitlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAoraW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAorYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCitzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0CitDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCitzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCitpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCitjb2RlIGZvcm06PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQorY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQorY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCitvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQorYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycworYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKK29mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAorbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCitDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKK2Nvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCit0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCitjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKK3RvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK3RvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCithbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQoraW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCit3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcworc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCitvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCitjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKK1dJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKK01FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQorUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcworQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKK2VxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgorVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgorVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKK29yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKK2Z1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgorYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAorb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCitzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCitwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQorY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKK3RoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKK0FncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCitzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAorZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCitTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCitBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKK0FncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKK2l0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlL2ZlYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NmQ3MzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxmZWF0dXJlCisgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlIgorICAgICAgbGFiZWw9IlNURU0gZmVhdHVyZSIKKyAgICAgIHZlcnNpb249IjEuMC4xIgorICAgICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZSIKKyAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3RlbS51aSI+CisKKyAgIDxkZXNjcmlwdGlvbj4KKyAgICAgIFNURU0gLSBTcGF0aW90ZW1wb3JhbCBFcGlkZW1pb2xvZ2ljYWwgTW9kZWxlciAKK1RoZSBTVEVNIHRvb2wgaXMgZGVzaWduZWQgdG8gaGVscCBzY2llbnRpc3RzIGFuZCBwdWJsaWMgaGVhbHRoCitvZmZpY2lhbHMgY3JlYXRlIGFuZCB1c2Ugc3BhdGlhbCBhbmQgdGVtcG9yYWwgbW9kZWxzIG9mIGVtZXJnaW5nCitpbmZlY3Rpb3VzIGRpc2Vhc2VzLgorICAgPC9kZXNjcmlwdGlvbj4KKworICAgPGNvcHlyaWdodD4KKyAgICAgIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisgICA8L2NvcHlyaWdodD4KKworICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+CisgICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICAgPC9saWNlbnNlPgorCisgICA8dXJsPgorICAgICAgPHVwZGF0ZSBsYWJlbD0iU1RFTSBsb2NhbCB1cGRhdGUgc2l0ZSIgdXJsPSJmaWxlOi9DOi9lY2xpcHNlL3VwZGF0ZS8iLz4KKyAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IlNURU0gdXBkYXRlIHNpdGUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3RlY2hub2xvZ3kvc3RlbS91cGRhdGUtc2l0ZS8iLz4KKyAgIDwvdXJsPgorCisgICA8aW5jbHVkZXMKKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmZlYXR1cmUuY29yZSIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+CisKKyAgIDxpbmNsdWRlcworICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS5wcmVyZXEiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgorCisgICA8aW5jbHVkZXMKKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5yY3AiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgorCisgICA8aW5jbHVkZXMKKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgorCisgICA8aW5jbHVkZXMKKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+CisKKzwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS9ub3RpY2UuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS9ub3RpY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFmOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlL25vdGljZS5odG1sCkBAIC0wLDAgKzEsNzkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+TWFyY2ggMTcsIDIwMDU8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorICAgCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCisgICAKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUworICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisgICAKKzx1bD4KKwk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4gICAKKyAKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKwk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCQkKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKwk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKKwk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorICAgCis8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS91cGRhdGUudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlL3VwZGF0ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU0MzJlZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS91cGRhdGUudHh0CkBAIC0wLDAgKzEsODcgQEAKK1NURU0gQ3JlYXRpbmcgVXBkYXRlcyBiYXNlZCBvbiBmZWF0dXJlcy4KKworQXNzdW1lIHRoYXQgeW91IGhhdmUgU1RFTSB2ZXJzaW9uIDAuMi4xTTEgIGRpc3RyaWJ1dGVkIG9uIHRoZSBkb3dubG9hZCAKK3NpdGUgYXMgemlwIGZpbGVzIGZvciBlYWNoIHN1cHBvcnRlZCBwbGF0Zm9ybSAoV2luLExpbnV4LE1hYykgCithbmQgeW91IGxhdGVyIHdhbnQgdG8gcHVibGlzaCBhbiB1cGRhdGUgZm9yIDAuMi4xTTIuIAorCitUaGUgdXNlcnMgaGFkIG9yaWdpbmFsbHkgaW5zdGFsbGVkIFNURU0gYnkgZG93bmxvYWRpbmcgdGhlIAorYXBwcm9wcmlhdGUgMC4yLjFNMSB6aXAgZmlsZSBhbmQgdW56aXBpbmcgaXQgYW5kIHJ1bm5pbmcgdGhlIFNURU0gcmNwLiAgCitUaGV5IHdpbGwgdXNlIHRoZSBIZWxwLT51cGRhdGUgZmVhdHVyZSB0byBpbnN0YWxsIHRoZSB1cGRhdGVzIGZvciAwLjIuMU0yLiAgCitGb3Igc2ltcGxpY2l0eSwgdGhlIDAuMi4xTTIgdXBkYXRlcyBjb25zaXN0IG9mIGNvZGUgZm9yIGFsbCB0aGUgCitvcmcuZWNsaXBzZS5zdGVtIHByb2plY3RzIGJ1dCBub25lIG9mIHRoZSBwbHVnaW4gZGVwZW5kZW5jaWVzIAorb3IgcGxhdGZvcm0gZGVwZW5kZW5jaWVzLiAgIAorQWJpbGl0eSB0byB1cGRhdGUgb25seSBwYXJ0cyBvZiB0aGUgU1RFTSBjb2RlIGlzIGxlZnQgYXMgYSBmdXR1cmUgZmVhdHVyZS4gICAKKworSWYgeW91IGFyZSBnb2luZyB0byBnZW5lcmF0ZSBhIFNURU0gYXBwbGljYXRpb24gZm9yIHBsYXRmb3JtcyBvdGhlcgordGhhbiB0aGUgcGxhdGZvcm0gdGhhdCB5b3UgYXJlIHJ1bm5pbmcgRWNsaXBzZSBvbiwgdGhlbiB5b3UgbmVlZCB0byAKK2Rvd25sb2FkIGFuZCBpbnN0YWxsIHRoZSAzLjMgZGVsdGEtcGFjaworCitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2Fkcy9kb3dubG9hZC5waHA/ZmlsZT0vZWNsaXBzZS9kb3dubG9hZHMvZHJvcHMvUi0zLjMtMjAwNzA2MjUxNTAwL2VjbGlwc2UtUkNQLTMuMy1kZWx0YS1wYWNrLnppcAorCitTVEVNIHByb2plY3RzLgorICBvcmcuZWNsaXBzZS5zdGVtLmZlYXR1cmUKKyAgIGZlYXR1cmUueG1sIAorICAgICBDb250YWlucyB0aGUgc3RlbSBwbHVnaW5zCisgICAgICAtIFVwZGF0ZSBhcyByZXF1aXJlZDoKKyAgICAgIC0gVmVyc2lvbiBzaG91bGQgYmUgMC4yLjFNMQorICAgICAgLSBVcGRhdGUgU2l0ZSBVUkwgc2hvdWxkIGJlIHNwZWNpZmllZAorICAgICAgICBQb2ludCB0byBvcmcuZWNsaXBzZSBkb3dubG9hZCBzaXRlIHdoZXJlIHRoZSAKKyAgICAgICAgdXBkYXRlIGZlYXR1cmUgd2lsbCBiZSBwbGFjZWQuICA/Pz8/PworICAgICAgICAoRm9yIHRlc3RpbmcgeW91IGNhbiBwb2ludCB0byBhIGxvY2FsIGZpbGUgc3lzdGVtCisgICAgICAgICBsaWtlIGZpbGU6L2M6ZWNsaXBzZS91cGRhdGVzaXRlICkKKyAgb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLnByZXJlcQorICAgZmVhdHVyZS54bWwKKyAgICAgIENvbnRhaW5zIGEgbGlzdCBvZiBhbGwgdGhlIHByZXJlcSBwbHVnaW5zLgorICAgICAgVGhlIGxpc3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHN0ZW0ucHJvZHVjdCB3aGljaCB3YXMgdXNlZCB0byAKKyAgICAgIGdlbmVyYXRlIHRoZSBpbml0aWFsIFNURU0gcmNwLiAKKyAgICAgIAorICAgICAgIFVwZGF0ZSBTaXRlIFVSTCBzaG91bGQgYmUgc3BlY2lmaWVkIHNhbWUgYXMgYWJvdmUuCisgIG9yZy5lY2xpcHNlLnN0ZW0udWkKKyAgICBzdGVtLnByb2R1Y3QKKyAgICAgIFRoaXMgaXMgdGhlIG9yaWdpbmFsIHByb2R1Y3QgZmlsZSBhbmQgY2FuIHN0aWxsIGJlIHVzZWQgCisgICAgICB0byBydW4gdGhlIGFwcGxpY2F0aW9uIHdpdGhpbiBlY2xpcHNlIHdpdGggZGVidWcuIAorCisgICAgZmVhdHVyZS5wcm9kdWN0IAorICAgICAgTm93IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIFNURU0gcmNwIGZyb20gdGhlIGFib3ZlIDIgZmVhdHVyZXMuCisgICAgICBJdCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzLiAKKyAgICAgICAgIG9yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZQorICAgICAgICAgb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLnByZXJlcQorICAgICAgICAgb3JnLmVjbGlwc2UucmNwCisgICAgICAgICBvcmcuZWNsaXBzZS5wbGF0Zm9ybQorICAgICAgICAgCisgIGNyZWF0ZSB0aGUgZGlzdHJpYnV0YWJsZSByY3AgYnkgdXNpbmcgdGhlIGV4cG9ydCBzZWxlY3Rpb24gaW4gCisgICAgIGZlYXR1cmUucHJvZHVjdCAtPiBvdmVydmlldworICAgICBJdCB3aWxsIHByb21wdCB5b3UgZm9yIHRoZSBwbGF0Zm9ybXMgdG8gZ2VuZXJhdGUgZm9yLgorICAgICAgICBJdCB3aWxsIHJ1biBhYm91dCBhbiBob3VyIGZvciBlYWNoIG9uZS4KKyAgICAgWW91IHdpbGwgbm93IGhhdmUgb25lIG9yIG1vcmUgemlwIGZpbGVzIGNvbnRhaW5pbmcgdGhlIFNURU0gYXBwbGljYXRpb24uCisgICAgIFBsYWNlIHRoZW0gb24gdGhlIGRvd25sb2FkIHNpdGUuIAorICAgICAKKyAgIFBsYXRmb3JtIGRlcGVuZGVudCBnZW5lcmF0aW9uLgorICAgICBUaGUgZmVhdHVyZS5wcmVyZXEgemlwIGZpbGUgY29udGFpbnMgdGhlIHBsYXRmb3JtIGluZGVwZW5kZW50IAorICAgICBmaWxlcyBhbmQgc2hvdWxkIG5vdCBuZWVkIHRvIGJlIHJlZ2VuZXJhdGVkLiBJdCBpcyBnZW5lcmF0ZWQgCisgICAgIHNpbWlsYXIgdG8gdGhlIGZlYXR1cmUuemlwIGJ1dCB1c2luZyB0aGUgZmVhdHVyZS54bWwgZmlsZSBmcm9tCisgICAgIHRoZSBmZWF0dXJlLnByZXJlcSBmaWxlLiAgVGhpcyBjb250YWlucyBhbGwgb2YgdGhlIHByZXJlcSBwbHVnaW5zIAorICAgICBhbmQgc2hvdWxkIG5vdCBuZWVkIHRvIGJlIHVwZGF0ZWQgZXhjZXB0IHdoZW4gRWNscHNlIHBsYXRmb3JtIAorICAgICBjaGFuZ2VzLiAgCisgICAgIAorCitUbyBjcmVhdGUgYW4gdXBkYXRlIAorICAgICAgCisgICAgLSBJbXBvcnQgdGhlIG9yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZSBwcm9qZWN0IGlmIG5vdCBhbHJlYWR5IAorICAgICAgYXZhaWxhYmxlLgorICAgIC0gU2VsZWN0IHRoZSBmZWF0dXJlLnhtbCBmaWxlCisgICAgLSBTZWxlY3QgdGhlIG92ZXJ2aWV3IHRhYi4gCisgICAgLSBVcGRhdGUgYXMgcmVxdWlyZWQ6CisgICAgICAtIFZlcnNpb24gc2hvdWxkIGJlIDAuMi4xTTIKKyAgICAgIC0gVXBkYXRlIFNpdGUgVVJMIHNob3VsZCBiZSBzcGVjaWZpZWQKKyAgICAgICAgUG9pbnQgdG8gb3JnLmVjbGlwc2UgZG93bmxvYWQgc2l0ZSB3aGVyZSB0aGUgCisgICAgICAgIHVwZGF0ZSBmZWF0dXJlIHdpbGwgYmUgcGxhY2VkLiAgCisgICAgLSBTZWxlY3QgImV4cG9ydCIgb24gdGhlICJvdmVydmlldyIgdGFiIGZvciBmZWF0dXJlLnhtbC4KKyAgICAtIFRoZSBnZW5lcmF0ZWQgemlwIGZpbGUgc2hvdWxkIGJlIHVuemlwcGVkIGludG8gdGhlIAorICAgICAgdXBkYXRlIHNpdGUuICAKKyAgICAtIEEgbmV3IGRpc3RyaWJ1dGlvbiB6aXAgZmlsZSBmb3IgdGhlIDAuMi4yTTIgU1RFTSBSQ1Agc2hvdWxkIGFsc28gCisgICAgICBiZSBjcmVhdGVkIGFzIGFib3ZlIGFuZCB1cGxvYWRlZCB0byB0aGUgZG93bmxvYWQgc2l0ZSBmb3IgCisgICAgICBuZXcgdXNlcnMuICAKKyAgICAgIAorICAgICAgCisgICAgICAgIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5Ly5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZTg2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5Ly5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5Ly5jdnNpZ25vcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeS8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZTE4NTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeS8uY3ZzaWdub3JlCkBAIC0wLDAgKzEsMiBAQAorcGx1Z2luLnByb3BlcnRpZXMKK3BsdWdpbi54bWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5Ly5mYnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvLmZicHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM0MjM2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5Ly5mYnByZWZzCkBAIC0wLDAgKzEsMTI5IEBACisjRmluZEJ1Z3MgVXNlciBQcmVmZXJlbmNlcworI0ZyaSBNYXIgMTYgMTU6MTk6MTMgRURUIDIwMDcKK2RlZmF1bHRfZGlyZWN0b3J5PUNcOlxcUHJvZ3JhbSBGaWxlc1xcZWNsaXBzZVxcZWNsaXBzZTMuMi4yCitkZXRlY3RvckJDUE1ldGhvZFJldHVybkNoZWNrPUJDUE1ldGhvZFJldHVybkNoZWNrfGZhbHNlCitkZXRlY3RvckJhZEFwcGxldENvbnN0cnVjdG9yPUJhZEFwcGxldENvbnN0cnVjdG9yfGZhbHNlCitkZXRlY3RvckJhZFJlc3VsdFNldEFjY2Vzcz1CYWRSZXN1bHRTZXRBY2Nlc3N8dHJ1ZQorZGV0ZWN0b3JCYWRTeW50YXhGb3JSZWd1bGFyRXhwcmVzc2lvbj1CYWRTeW50YXhGb3JSZWd1bGFyRXhwcmVzc2lvbnx0cnVlCitkZXRlY3RvckJhZFVzZU9mUmV0dXJuVmFsdWU9QmFkVXNlT2ZSZXR1cm5WYWx1ZXx0cnVlCitkZXRlY3RvckJhZGx5T3ZlcnJpZGRlbkFkYXB0ZXI9QmFkbHlPdmVycmlkZGVuQWRhcHRlcnx0cnVlCitkZXRlY3RvckNhbGxlZE1ldGhvZHM9Q2FsbGVkTWV0aG9kc3x0cnVlCitkZXRlY3RvckNoZWNrQ2FsbHM9Q2hlY2tDYWxsc3xmYWxzZQorZGV0ZWN0b3JDaGVja0ltbXV0YWJsZUFubm90YXRpb249Q2hlY2tJbW11dGFibGVBbm5vdGF0aW9ufHRydWUKK2RldGVjdG9yQ2xvbmVJZGlvbT1DbG9uZUlkaW9tfHRydWUKK2RldGVjdG9yQ29tcGFyYXRvcklkaW9tPUNvbXBhcmF0b3JJZGlvbXx0cnVlCitkZXRlY3RvckNvbmZ1c2VkSW5oZXJpdGFuY2U9Q29uZnVzZWRJbmhlcml0YW5jZXx0cnVlCitkZXRlY3RvckNvbmZ1c2lvbkJldHdlZW5Jbmhlcml0ZWRBbmRPdXRlck1ldGhvZD1Db25mdXNpb25CZXR3ZWVuSW5oZXJpdGVkQW5kT3V0ZXJNZXRob2R8dHJ1ZQorZGV0ZWN0b3JEb0luc2lkZURvUHJpdmlsZWdlZD1Eb0luc2lkZURvUHJpdmlsZWdlZHx0cnVlCitkZXRlY3RvckRvbnRDYXRjaElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb249RG9udENhdGNoSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbnx0cnVlCitkZXRlY3RvckRyb3BwZWRFeGNlcHRpb249RHJvcHBlZEV4Y2VwdGlvbnx0cnVlCitkZXRlY3RvckR1bWJNZXRob2RJbnZvY2F0aW9ucz1EdW1iTWV0aG9kSW52b2NhdGlvbnN8dHJ1ZQorZGV0ZWN0b3JEdW1iTWV0aG9kcz1EdW1iTWV0aG9kc3x0cnVlCitkZXRlY3RvckR1cGxpY2F0ZUJyYW5jaGVzPUR1cGxpY2F0ZUJyYW5jaGVzfHRydWUKK2RldGVjdG9yRW1wdHlaaXBGaWxlRW50cnk9RW1wdHlaaXBGaWxlRW50cnl8dHJ1ZQorZGV0ZWN0b3JFcVN0cmluZ1Rlc3Q9RXFTdHJpbmdUZXN0fGZhbHNlCitkZXRlY3RvckZpbmRCYWRDYXN0PUZpbmRCYWRDYXN0fGZhbHNlCitkZXRlY3RvckZpbmRCYWRDYXN0Mj1GaW5kQmFkQ2FzdDJ8dHJ1ZQorZGV0ZWN0b3JGaW5kQmFkRXF1YWxzSW1wbGVtZW50YXRpb249RmluZEJhZEVxdWFsc0ltcGxlbWVudGF0aW9ufGZhbHNlCitkZXRlY3RvckZpbmRCYWRGb3JMb29wPUZpbmRCYWRGb3JMb29wfHRydWUKK2RldGVjdG9yRmluZEJ1Z3NTdW1tYXJ5U3RhdHM9RmluZEJ1Z3NTdW1tYXJ5U3RhdHN8dHJ1ZQorZGV0ZWN0b3JGaW5kQ2lyY3VsYXJEZXBlbmRlbmNpZXM9RmluZENpcmN1bGFyRGVwZW5kZW5jaWVzfGZhbHNlCitkZXRlY3RvckZpbmREZWFkTG9jYWxTdG9yZXM9RmluZERlYWRMb2NhbFN0b3Jlc3x0cnVlCitkZXRlY3RvckZpbmREb3VibGVDaGVjaz1GaW5kRG91YmxlQ2hlY2t8dHJ1ZQorZGV0ZWN0b3JGaW5kRW1wdHlTeW5jaHJvbml6ZWRCbG9jaz1GaW5kRW1wdHlTeW5jaHJvbml6ZWRCbG9ja3x0cnVlCitkZXRlY3RvckZpbmRGaWVsZFNlbGZBc3NpZ25tZW50PUZpbmRGaWVsZFNlbGZBc3NpZ25tZW50fHRydWUKK2RldGVjdG9yRmluZEZpbmFsaXplSW52b2NhdGlvbnM9RmluZEZpbmFsaXplSW52b2NhdGlvbnN8dHJ1ZQorZGV0ZWN0b3JGaW5kRmxvYXRFcXVhbGl0eT1GaW5kRmxvYXRFcXVhbGl0eXx0cnVlCitkZXRlY3RvckZpbmRGbG9hdE1hdGg9RmluZEZsb2F0TWF0aHxmYWxzZQorZGV0ZWN0b3JGaW5kSEVtaXNtYXRjaD1GaW5kSEVtaXNtYXRjaHx0cnVlCitkZXRlY3RvckZpbmRJbmNvbnNpc3RlbnRTeW5jMj1GaW5kSW5jb25zaXN0ZW50U3luYzJ8dHJ1ZQorZGV0ZWN0b3JGaW5kSlNSMTY2TG9ja01vbml0b3JlbnRlcj1GaW5kSlNSMTY2TG9ja01vbml0b3JlbnRlcnx0cnVlCitkZXRlY3RvckZpbmRMb2NhbFNlbGZBc3NpZ25tZW50Mj1GaW5kTG9jYWxTZWxmQXNzaWdubWVudDJ8dHJ1ZQorZGV0ZWN0b3JGaW5kTWFza2VkRmllbGRzPUZpbmRNYXNrZWRGaWVsZHN8dHJ1ZQorZGV0ZWN0b3JGaW5kTWlzbWF0Y2hlZFdhaXRPck5vdGlmeT1GaW5kTWlzbWF0Y2hlZFdhaXRPck5vdGlmeXx0cnVlCitkZXRlY3RvckZpbmROYWtlZE5vdGlmeT1GaW5kTmFrZWROb3RpZnl8dHJ1ZQorZGV0ZWN0b3JGaW5kTm9uU2VyaWFsaXphYmxlU3RvcmVJbnRvU2Vzc2lvbj1GaW5kTm9uU2VyaWFsaXphYmxlU3RvcmVJbnRvU2Vzc2lvbnx0cnVlCitkZXRlY3RvckZpbmROb25TZXJpYWxpemFibGVWYWx1ZVBhc3NlZFRvV3JpdGVPYmplY3Q9RmluZE5vblNlcmlhbGl6YWJsZVZhbHVlUGFzc2VkVG9Xcml0ZU9iamVjdHx0cnVlCitkZXRlY3RvckZpbmROb25TaG9ydENpcmN1aXQ9RmluZE5vblNob3J0Q2lyY3VpdHx0cnVlCitkZXRlY3RvckZpbmROdWxsRGVyZWY9RmluZE51bGxEZXJlZnx0cnVlCitkZXRlY3RvckZpbmRPcGVuU3RyZWFtPUZpbmRPcGVuU3RyZWFtfHRydWUKK2RldGVjdG9yRmluZFB1enpsZXJzPUZpbmRQdXp6bGVyc3x0cnVlCitkZXRlY3RvckZpbmRSZWZDb21wYXJpc29uPUZpbmRSZWZDb21wYXJpc29ufHRydWUKK2RldGVjdG9yRmluZFJldHVyblJlZj1GaW5kUmV0dXJuUmVmfHRydWUKK2RldGVjdG9yRmluZFJ1bkludm9jYXRpb25zPUZpbmRSdW5JbnZvY2F0aW9uc3x0cnVlCitkZXRlY3RvckZpbmRTZWxmQ29tcGFyaXNvbj1GaW5kU2VsZkNvbXBhcmlzb258dHJ1ZQorZGV0ZWN0b3JGaW5kU2VsZkNvbXBhcmlzb24yPUZpbmRTZWxmQ29tcGFyaXNvbjJ8dHJ1ZQorZGV0ZWN0b3JGaW5kU2xlZXBXaXRoTG9ja0hlbGQ9RmluZFNsZWVwV2l0aExvY2tIZWxkfHRydWUKK2RldGVjdG9yRmluZFNwaW5Mb29wPUZpbmRTcGluTG9vcHx0cnVlCitkZXRlY3RvckZpbmRTcWxJbmplY3Rpb249RmluZFNxbEluamVjdGlvbnx0cnVlCitkZXRlY3RvckZpbmRUd29Mb2NrV2FpdD1GaW5kVHdvTG9ja1dhaXR8dHJ1ZQorZGV0ZWN0b3JGaW5kVW5jYWxsZWRQcml2YXRlTWV0aG9kcz1GaW5kVW5jYWxsZWRQcml2YXRlTWV0aG9kc3x0cnVlCitkZXRlY3RvckZpbmRVbmNvbmRpdGlvbmFsV2FpdD1GaW5kVW5jb25kaXRpb25hbFdhaXR8dHJ1ZQorZGV0ZWN0b3JGaW5kVW5pbml0aWFsaXplZEdldD1GaW5kVW5pbml0aWFsaXplZEdldHx0cnVlCitkZXRlY3RvckZpbmRVbnJlbGF0ZWRUeXBlc0luR2VuZXJpY0NvbnRhaW5lcj1GaW5kVW5yZWxhdGVkVHlwZXNJbkdlbmVyaWNDb250YWluZXJ8dHJ1ZQorZGV0ZWN0b3JGaW5kVW5yZWxlYXNlZExvY2s9RmluZFVucmVsZWFzZWRMb2NrfHRydWUKK2RldGVjdG9yRmluZFVuc2F0aXNmaWVkT2JsaWdhdGlvbj1GaW5kVW5zYXRpc2ZpZWRPYmxpZ2F0aW9ufGZhbHNlCitkZXRlY3RvckZpbmRVbnN5bmNHZXQ9RmluZFVuc3luY0dldHx0cnVlCitkZXRlY3RvckZpbmRVc2VsZXNzQ29udHJvbEZsb3c9RmluZFVzZWxlc3NDb250cm9sRmxvd3x0cnVlCitkZXRlY3Rvckh1Z2VTaGFyZWRTdHJpbmdDb25zdGFudHM9SHVnZVNoYXJlZFN0cmluZ0NvbnN0YW50c3x0cnVlCitkZXRlY3RvcklEaXZSZXN1bHRDYXN0VG9Eb3VibGU9SURpdlJlc3VsdENhc3RUb0RvdWJsZXx0cnVlCitkZXRlY3RvckluY29tcGF0TWFzaz1JbmNvbXBhdE1hc2t8dHJ1ZQorZGV0ZWN0b3JJbmVmZmljaWVudE1lbWJlckFjY2Vzcz1JbmVmZmljaWVudE1lbWJlckFjY2Vzc3xmYWxzZQorZGV0ZWN0b3JJbmVmZmljaWVudFRvQXJyYXk9SW5lZmZpY2llbnRUb0FycmF5fHRydWUKK2RldGVjdG9ySW5maW5pdGVMb29wPUluZmluaXRlTG9vcHx0cnVlCitkZXRlY3RvckluZmluaXRlUmVjdXJzaXZlTG9vcD1JbmZpbml0ZVJlY3Vyc2l2ZUxvb3B8dHJ1ZQorZGV0ZWN0b3JJbmZpbml0ZVJlY3Vyc2l2ZUxvb3AyPUluZmluaXRlUmVjdXJzaXZlTG9vcDJ8ZmFsc2UKK2RldGVjdG9ySW5oZXJpdGFuY2VVbnNhZmVHZXRSZXNvdXJjZT1Jbmhlcml0YW5jZVVuc2FmZUdldFJlc291cmNlfHRydWUKK2RldGVjdG9ySW5pdGlhbGl6YXRpb25DaGFpbj1Jbml0aWFsaXphdGlvbkNoYWlufGZhbHNlCitkZXRlY3Rvckluc3RhbnRpYXRlU3RhdGljQ2xhc3M9SW5zdGFudGlhdGVTdGF0aWNDbGFzc3x0cnVlCitkZXRlY3RvckludmFsaWRKVW5pdFRlc3Q9SW52YWxpZEpVbml0VGVzdHx0cnVlCitkZXRlY3Rvckl0ZXJhdG9ySWRpb21zPUl0ZXJhdG9ySWRpb21zfHRydWUKK2RldGVjdG9yTGF6eUluaXQ9TGF6eUluaXR8dHJ1ZQorZGV0ZWN0b3JMb2FkT2ZLbm93bk51bGxWYWx1ZT1Mb2FkT2ZLbm93bk51bGxWYWx1ZXx0cnVlCitkZXRlY3RvckxvY2tlZEZpZWxkcz1Mb2NrZWRGaWVsZHN8ZmFsc2UKK2RldGVjdG9yTWV0aG9kUmV0dXJuQ2hlY2s9TWV0aG9kUmV0dXJuQ2hlY2t8dHJ1ZQorZGV0ZWN0b3JNZXRob2RzPU1ldGhvZHN8dHJ1ZQorZGV0ZWN0b3JNdWx0aXRocmVhZGVkSW5zdGFuY2VBY2Nlc3M9TXVsdGl0aHJlYWRlZEluc3RhbmNlQWNjZXNzfHRydWUKK2RldGVjdG9yTXV0YWJsZUxvY2s9TXV0YWJsZUxvY2t8dHJ1ZQorZGV0ZWN0b3JNdXRhYmxlU3RhdGljRmllbGRzPU11dGFibGVTdGF0aWNGaWVsZHN8dHJ1ZQorZGV0ZWN0b3JOYW1pbmc9TmFtaW5nfHRydWUKK2RldGVjdG9yTm90ZUFubm90YXRpb25SZXRlbnRpb249Tm90ZUFubm90YXRpb25SZXRlbnRpb258dHJ1ZQorZGV0ZWN0b3JOb3RlQ2hlY2tSZXR1cm5WYWx1ZT1Ob3RlQ2hlY2tSZXR1cm5WYWx1ZXx0cnVlCitkZXRlY3Rvck5vdGVDaGVja1JldHVyblZhbHVlQW5ub3RhdGlvbnM9Tm90ZUNoZWNrUmV0dXJuVmFsdWVBbm5vdGF0aW9uc3x0cnVlCitkZXRlY3Rvck5vdGVKQ0lQQW5ub3RhdGlvbj1Ob3RlSkNJUEFubm90YXRpb258dHJ1ZQorZGV0ZWN0b3JOb3RlTm9uTnVsbEFubm90YXRpb25zPU5vdGVOb25OdWxsQW5ub3RhdGlvbnN8dHJ1ZQorZGV0ZWN0b3JOb3RlU3VwcHJlc3NlZFdhcm5pbmdzPU5vdGVTdXBwcmVzc2VkV2FybmluZ3N8dHJ1ZQorZGV0ZWN0b3JOb3RlVW5jb25kaXRpb25hbFBhcmFtRGVyZWZzPU5vdGVVbmNvbmRpdGlvbmFsUGFyYW1EZXJlZnN8dHJ1ZQorZGV0ZWN0b3JOdW1iZXJDb25zdHJ1Y3Rvcj1OdW1iZXJDb25zdHJ1Y3Rvcnx0cnVlCitkZXRlY3RvclByZWZlclplcm9MZW5ndGhBcnJheXM9UHJlZmVyWmVyb0xlbmd0aEFycmF5c3x0cnVlCitkZXRlY3RvclB1YmxpY1NlbWFwaG9yZXM9UHVibGljU2VtYXBob3Jlc3xmYWxzZQorZGV0ZWN0b3JRdWVzdGlvbmFibGVCb29sZWFuQXNzaWdubWVudD1RdWVzdGlvbmFibGVCb29sZWFuQXNzaWdubWVudHx0cnVlCitkZXRlY3RvclJlYWRSZXR1cm5TaG91bGRCZUNoZWNrZWQ9UmVhZFJldHVyblNob3VsZEJlQ2hlY2tlZHx0cnVlCitkZXRlY3RvclJlZHVuZGFudEludGVyZmFjZXM9UmVkdW5kYW50SW50ZXJmYWNlc3x0cnVlCitkZXRlY3RvclJlc29sdmVBbGxSZWZlcmVuY2VzPVJlc29sdmVBbGxSZWZlcmVuY2VzfGZhbHNlCitkZXRlY3RvclJ1bnRpbWVFeGNlcHRpb25DYXB0dXJlPVJ1bnRpbWVFeGNlcHRpb25DYXB0dXJlfHRydWUKK2RldGVjdG9yU2VyaWFsaXphYmxlSWRpb209U2VyaWFsaXphYmxlSWRpb218dHJ1ZQorZGV0ZWN0b3JTdGFydEluQ29uc3RydWN0b3I9U3RhcnRJbkNvbnN0cnVjdG9yfHRydWUKK2RldGVjdG9yU3RyaW5nQ29uY2F0ZW5hdGlvbj1TdHJpbmdDb25jYXRlbmF0aW9ufHRydWUKK2RldGVjdG9yU3VwZXJmbHVvdXNJbnN0YW5jZU9mPVN1cGVyZmx1b3VzSW5zdGFuY2VPZnx0cnVlCitkZXRlY3RvclN1c3BpY2lvdXNUaHJlYWRJbnRlcnJ1cHRlZD1TdXNwaWNpb3VzVGhyZWFkSW50ZXJydXB0ZWR8dHJ1ZQorZGV0ZWN0b3JTd2l0Y2hGYWxsdGhyb3VnaD1Td2l0Y2hGYWxsdGhyb3VnaHx0cnVlCitkZXRlY3RvclRlc3RBU009VGVzdEFTTXxmYWxzZQorZGV0ZWN0b3JUZXN0aW5nR3JvdW5kPVRlc3RpbmdHcm91bmR8ZmFsc2UKK2RldGVjdG9yVHJhaW5GaWVsZFN0b3JlVHlwZXM9VHJhaW5GaWVsZFN0b3JlVHlwZXN8dHJ1ZQorZGV0ZWN0b3JUcmFpbk5vbk51bGxBbm5vdGF0aW9ucz1UcmFpbk5vbk51bGxBbm5vdGF0aW9uc3x0cnVlCitkZXRlY3RvclRyYWluVW5jb25kaXRpb25hbERlcmVmUGFyYW1zPVRyYWluVW5jb25kaXRpb25hbERlcmVmUGFyYW1zfHRydWUKK2RldGVjdG9yVVJMUHJvYmxlbXM9VVJMUHJvYmxlbXN8dHJ1ZQorZGV0ZWN0b3JVbmNhbGxhYmxlTWV0aG9kT2ZBbm9ueW1vdXNDbGFzcz1VbmNhbGxhYmxlTWV0aG9kT2ZBbm9ueW1vdXNDbGFzc3x0cnVlCitkZXRlY3RvclVubmVjZXNzYXJ5TWF0aD1Vbm5lY2Vzc2FyeU1hdGh8dHJ1ZQorZGV0ZWN0b3JVbnJlYWRGaWVsZHM9VW5yZWFkRmllbGRzfHRydWUKK2RldGVjdG9yVXNlT2JqZWN0RXF1YWxzPVVzZU9iamVjdEVxdWFsc3xmYWxzZQorZGV0ZWN0b3JVc2VsZXNzU3ViY2xhc3NNZXRob2Q9VXNlbGVzc1N1YmNsYXNzTWV0aG9kfGZhbHNlCitkZXRlY3RvclZhckFyZ3NQcm9ibGVtcz1WYXJBcmdzUHJvYmxlbXN8dHJ1ZQorZGV0ZWN0b3JWb2xhdGlsZVVzYWdlPVZvbGF0aWxlVXNhZ2V8dHJ1ZQorZGV0ZWN0b3JXYWl0SW5Mb29wPVdhaXRJbkxvb3B8dHJ1ZQorZGV0ZWN0b3JXcm9uZ01hcEl0ZXJhdG9yPVdyb25nTWFwSXRlcmF0b3J8dHJ1ZQorZGV0ZWN0b3JYTUxGYWN0b3J5QnlwYXNzPVhNTEZhY3RvcnlCeXBhc3N8dHJ1ZQorZGV0ZWN0b3JfdGhyZXNob2xkPTIKK2ZpbHRlcl9zZXR0aW5ncz1NZWRpdW18STE4TixNVF9DT1JSRUNUTkVTUyxNQUxJQ0lPVVNfQ09ERSxCQURfUFJBQ1RJQ0UsU1RZTEUsQ09SUkVDVE5FU1MsUEVSRk9STUFOQ0V8ZmFsc2UKK2ZpbHRlcl9zZXR0aW5nc19uZWc9fApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWFkOThiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHk8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZTlkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw3IEBACisjTW9uIEphbiAyMSAxMjo0MTo1OCBFU1QgMjAwOAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDgwYTA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMCwwICsxLDUwIEBACisjV2VkIE9jdCAxNyAxNzo1MjozMyBFRFQgMjAwNworY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitjbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPXRydWUKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQorY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCitjbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK2NsZWFudXAudXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQorY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitjbGVhbnVwX3Byb2ZpbGU9X2NsZWFudXAKK2NsZWFudXBfc2V0dGluZ3NfdmVyc2lvbj0yCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeS9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzVmMWNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwxMyBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogU1RFTSBHZW9ncmFwaHkKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5O3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkuQWN0aXZhdG9yCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZQorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK0J1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHksCisgb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkuY2VudGVycworQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjdjYWUwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDcgQEAKK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCitiaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICBiaW4vLFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCisgICAgICAgICAgICAgICBub3RpY2UuaHRtbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNGIxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeS9lcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwzMjggQEAKKzxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKK3htbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCit4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Cis8bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Cis8bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxsaW5rIHJlbD1GaWxlLUxpc3QKK2hyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgorPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Cis8IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8bzpEb2N1bWVudFByb3BlcnRpZXM+CisgIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+CisgIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KKyAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgorICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgorICA8bzpQYWdlcz40PC9vOlBhZ2VzPgorICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgorICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KKyAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgorICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+CisgIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgorICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgorIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Cis8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8dzpXb3JkRG9jdW1lbnQ+CisgIDx3OlRyYWNrUmV2aXNpb25zLz4KKyA8L3c6V29yZERvY3VtZW50PgorPC94bWw+PCFbZW5kaWZdLS0+Cis8c3R5bGU+Cis8IS0tCisgLyogRm9udCBEZWZpbml0aW9ucyAqLworQGZvbnQtZmFjZQorCXtmb250LWZhbWlseTpUYWhvbWE7CisJcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7CisJbXNvLWZvbnQtY2hhcnNldDowOworCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOworCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOworCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQorIC8qIFN0eWxlIERlZmluaXRpb25zICovCitwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCisJe21zby1zdHlsZS1wYXJlbnQ6IiI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorcAorCXttYXJnaW4tcmlnaHQ6MGluOworCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOworCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOworCW1hcmdpbi1sZWZ0OjBpbjsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0CisJe21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOworCW1hcmdpbjowaW47CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6OC4wcHQ7CisJZm9udC1mYW1pbHk6VGFob21hOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK0BwYWdlIFNlY3Rpb24xCisJe3NpemU6OC41aW4gMTEuMGluOworCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOworCW1zby1oZWFkZXItbWFyZ2luOi41aW47CisJbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKKwltc28tcGFwZXItc291cmNlOjA7fQorZGl2LlNlY3Rpb24xCisJe3BhZ2U6U2VjdGlvbjE7fQorLS0+Cis8L3N0eWxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+CisKKzxkaXYgY2xhc3M9U2VjdGlvbjE+CisKKzxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KKzwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgorVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKK1JFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQorT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2luIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCitkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+CitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2NoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCitzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCitieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKK2lmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCitzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKK1Byb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgord2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQord29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCitlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50CitjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQorb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKK2Rpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCityZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAorYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCitzdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQorZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQorU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cworUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKK3BhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKK2FuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQorY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KK29mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCitieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgordG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bworYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQorUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cworQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKK3RoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAorZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAorbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKK3RvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCitpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCit0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCitkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKK0VhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0CityaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCit0aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgorPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2VmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKK2NvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKK2FuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5CithbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKK2luY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKK2FzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQorc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAorQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQorc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAoraW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQorY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKK2NvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKK2NvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQorb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKK3N1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKK2FjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKK2FuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCitvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKK2xpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCitDb250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgorQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCitjb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCitsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwordGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgorY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKK29mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcworcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCit0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCit0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAorYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKK2luIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAord2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKK3NlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQorb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQorY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKK0FHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCitXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCitNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQorcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKK1Byb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKK0FncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKK2NvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCitlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCitPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKK1RIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKK1RIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCitvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0CitmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQorbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KK2FnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKK290aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQorc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAorc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQorcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKK3JpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKK2NvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50CitTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKK3RoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCit0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCitBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bworc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KKyhpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKK2V4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKK2V4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQorU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgorQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCitBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCitpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KKworPC9kaXY+CisKKzwvYm9keT4KKworPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5L25vdGljZS5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvbm90aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhZjk2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5L25vdGljZS5odG1sCkBAIC0wLDAgKzEsNzkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+TWFyY2ggMTcsIDIwMDU8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorICAgCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCisgICAKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUworICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisgICAKKzx1bD4KKwk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4gICAKKyAKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKwk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCQkKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKwk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKKwk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorICAgCis8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dlb2dyYXBoeS8uY3ZzaWdub3JlIGIvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ2VvZ3JhcGh5Ly5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU2N2UyMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dlb2dyYXBoeS8uY3ZzaWdub3JlCkBAIC0wLDAgKzEgQEAKKyoucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ2VvZ3JhcGh5L0FjdGl2YXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ2VvZ3JhcGh5L0FjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDFjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9nZW9ncmFwaHkvQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworLyoqCisgKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKKyAqLworcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIFBsdWdpbiB7CisKKwkvKioKKwkgKiBUaGUgcGx1Zy1pbiBJRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHByZWZpeCBvZiB0aGUgcGxhdGZvcm0ge0BsaW5rIFVSSX0gZm9yIGdlb2dyYXBoeSB7QGxpbmsgR3JhcGh9cyBhbmQge0BsaW5rIE1vZGVsfXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU9HUkFQSFlfRklMRV9VUklfUFJFRklYID0gInBsYXRmb3JtOi9wbHVnaW4vIiAvLyROT04tTkxTLTEkCisJCQkrIG9yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5LkFjdGl2YXRvci5QTFVHSU5fSUQKKwkJCSsgIi9yZXNvdXJjZXMvZGF0YSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCisJcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsKKwkKKwkvKioKKwkgKiBUaGUgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgQWN0aXZhdG9yKCkgeworCQlwbHVnaW4gPSB0aGlzOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBjb250ZXh0IAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uIAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcGx1Z2luID0gbnVsbDsKKwkJc3VwZXIuc3RvcChjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKKwkgKgorCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogTG9nIGFuIGVycm9yIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgdGV4dAorCSAqIEBwYXJhbSBleGNlcHRpb24KKwkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQlwbHVnaW4uZ2V0TG9nKCkubG9nKAorCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAorCQkJCQkJMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7CisJfSAvLyBsb2dFcnJvcgorCisJLyoqCisJICogTG9nIGluZm9ybWF0aW9uIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIGluZm9ybWF0aW9uIG1lc3NhZ2UgdGV4dAorCSAqIEBwYXJhbSBleGNlcHRpb24KKwkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dJbmZvcm1hdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQlwbHVnaW4uZ2V0TG9nKCkubG9nKAorCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCisJCQkJCQkwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKKwl9IC8vIGxvZ0luZm9ybWF0aW9uCisKKworfSAvLyBBY3RpdmF0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dlb2dyYXBoeS9HZW9ncmFwaGljTWFwcGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9nZW9ncmFwaHkvR2VvZ3JhcGhpY01hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MzVlNDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9nZW9ncmFwaHkvR2VvZ3JhcGhpY01hcHBlci5qYXZhCkBAIC0wLDAgKzEsMjgwIEBACisvLyBHZW9ncmFwaGljTWFwcGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CisKKy8qKgorICogVGhpcyBjbGFzcyBtYXBzIGdlb2dyYXBoaWMgbG9jYXRpb25zIHRvIHNwZWNpZmljIGRhdGEvaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgKiBsb2NhdGlvbi4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgR2VvZ3JhcGhpY01hcHBlciB7CisKKwkvKioKKwkgKiBUaGUgU3RyaW5nIHRoYXQgaXMgdXNlZCBpbnRlcm5hbGx5IGxpa2UgYW4gSVNPLTMxNjYgYWxwaGEzIGtleSB0bworCSAqIHJlcHJlc2VudCB0aGUgRWFydGggYXMgaWYgaXQgd2FzIGEgY291bnRyeS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJUSF9BTFBIQTNfSVNPX0tFWSA9ICJaWloiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBtYXBzIElTTy0zMTY2IGFscGhhMiBrZXlzIHRvIElTTy0zMTY2IGFscGhhMworCSAqIGtleXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxQSEEyX1RPX0FMUEhBM19OQU1FID0gImxldmVsMElTT0tleXMucHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgTEVWRUxfMF9JU09fTUFQUElOR19GSUxFX1VSSSA9IFVSSQorCQkJLmNyZWF0ZVVSSSgicGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvWlpaLyIgLy8kTk9OLU5MUy0xJAorCQkJCQkrIEFMUEhBMl9UT19BTFBIQTNfTkFNRSk7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkJfUFJFRklYID0gQ29uc3RhbnRzLklEX1JPT1QgKyAiLmdlb2dyYXBoeSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBQcm9wZXJ0aWVzIGFscGhhMlRvQWxwaGEzTWFwID0gbnVsbDsKKwlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIGFscGhhM1RvQWxwaGEyTWFwID0gbnVsbDsKKworCS8qKgorCSAqIEBwYXJhbSBwcm9wZXJ0eUZpbGUKKwkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0aWVzIHJlYWQgZnJvbSB0aGUgZmlsZQorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgUHJvcGVydGllcyByZWFkUHJvcGVydHlGaWxlcyhmaW5hbCBVUkkgcHJvcGVydHlGaWxlVVJJKSB7CisJCWZpbmFsIFVSSUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgVVJJQ29udmVydGVySW1wbCgpOworCisJCWZpbmFsIFByb3BlcnRpZXMgcmV0VmFsdWUgPSBuZXcgUHJvcGVydGllcygpOworCQlCdWZmZXJlZElucHV0U3RyZWFtIHByb3BlcnRpZXNJbnB1dFN0cmVhbSA9IG51bGw7CisJCXRyeSB7CisJCQlwcm9wZXJ0aWVzSW5wdXRTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShjb252ZXJ0ZXIKKwkJCQkJLmNyZWF0ZUlucHV0U3RyZWFtKHByb3BlcnR5RmlsZVVSSSkpOworCQkJcmV0VmFsdWUubG9hZChwcm9wZXJ0aWVzSW5wdXRTdHJlYW0pOworCQkJcHJvcGVydGllc0lucHV0U3RyZWFtLmNsb3NlKCk7CisJCX0gY2F0Y2ggKGZpbmFsIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoRUFSVEhfQUxQSEEzX0lTT19LRVksIGUpOworCQl9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoRUFSVEhfQUxQSEEzX0lTT19LRVksIGUpOworCQl9CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHJlYWRQcm9wZXJ0eUZpbGVzCisKKwkvKioKKwkgKiBAcGFyYW0ga2V5CisJICogQHJldHVybiB0aGUgbGV2ZWwgb2YgdGhlIGtleQorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgaW50IGtleUxldmVsKGZpbmFsIFN0cmluZyBrZXkpIHsKKwkJaW50IGxldmVsID0gMDsKKwkJaW50IHN0YXJ0ID0gMDsKKwkJZm9yIChpbnQgdGVtcCA9IGtleS5pbmRleE9mKCItIik7IHRlbXAgPiAwOykgeyAvLyROT04tTkxTLTEkCisJCQlsZXZlbCsrOworCQkJc3RhcnQgKz0gdGVtcCArIDE7CisJCQl0ZW1wID0ga2V5LnN1YnN0cmluZyhzdGFydCkuaW5kZXhPZigiLSIpOyAvLyROT04tTkxTLTEkCisJCX0gLy8gZm9yCisJCXJldHVybiBsZXZlbDsKKwl9IC8vIGtleUxldmVsCisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFByb3BlcnRpZXMgZ2V0QWxwaGEyVG9BbHBoYTNNYXAoKSB7CisJCS8vIEdvdCB0aGUgYWxwaGEyLT5hbHBoYTMgbWFwPworCQlpZiAoYWxwaGEyVG9BbHBoYTNNYXAgPT0gbnVsbCkgeworCQkJLy8gTm8KKwkJCXN5bmNocm9uaXplZCAoR2VvZ3JhcGhpY01hcHBlci5jbGFzcykgeworCQkJCWlmIChhbHBoYTJUb0FscGhhM01hcCA9PSBudWxsKSB7CisJCQkJCWFscGhhMlRvQWxwaGEzTWFwID0gcmVhZFByb3BlcnR5RmlsZXMoTEVWRUxfMF9JU09fTUFQUElOR19GSUxFX1VSSSk7CisJCQkJfQorCQkJfQorCQl9IC8vIGlmCisJCS8vIEdvdCBpdCBub3c/CisJCWlmIChhbHBoYTJUb0FscGhhM01hcCA9PSBudWxsKSB7CisJCQkvLyBObworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKAorCQkJCQkiQ2FuJ3QgcmVhZCB0aGUgYWxwaGEyIHRvIGFscGhhMyBtYXBwaW5nIGZpbGUgXCIiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkrIEFMUEhBMl9UT19BTFBIQTNfTkFNRSArICJcIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCisJCX0gLy8gaWYKKwkJcmV0dXJuIGFscGhhMlRvQWxwaGEzTWFwOworCX0gLy8gZ2V0QWxwaGEyVG9BbHBoYTNNYXAKKworCS8qKgorCSAqIEBwYXJhbSBhbHBoYTJJU09LZXkKKwkgKiBAcmV0dXJuIHRoZSBhbHBoYSAzIElTTyBrZXkgb2YgdGhlIGFscGhhMiBrZXksIG9yIHRoZSBhbHBoYSAyIGtleSBpZgorCSAqICAgICAgICAgdGhlcmUgaXMgYW4gZXJyb3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBbHBoYTMoZmluYWwgU3RyaW5nIGFscGhhMklTT0tleSkgeworCQlTdHJpbmcgcmV0VmFsdWUgPSBhbHBoYTJJU09LZXk7CisJCWZpbmFsIFByb3BlcnRpZXMgYWxwaGEyVG9BbHBoYTNNYXAgPSBnZXRBbHBoYTJUb0FscGhhM01hcCgpOworCQkvLyBEbyB3ZSBoYXZlIHRoZSBtYXA/CisJCWlmIChhbHBoYTJUb0FscGhhM01hcCAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXJldFZhbHVlID0gYWxwaGEyVG9BbHBoYTNNYXAuZ2V0UHJvcGVydHkoYWxwaGEySVNPS2V5KTsKKwkJfSAvLyBpZgorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRBbHBoYTMKKworCS8qKgorCSAqIEBwYXJhbSBhbHBoYTNJU09LZXkKKwkgKiBAcmV0dXJuIHRoZSBhbHBoYSAyIElTTyBrZXkgb2YgdGhlIGFscGhhMiBrZXksIG9yIHRoZSBhbHBoYSAyIGtleSBpZgorCSAqICAgICAgICAgdGhlcmUgaXMgYW4gZXJyb3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBbHBoYTIoZmluYWwgU3RyaW5nIGFscGhhM0lTT0tleSkgeworCQlTdHJpbmcgcmV0VmFsdWUgPSBhbHBoYTNJU09LZXk7CisKKwkJZmluYWwgUHJvcGVydGllcyBhbHBoYTN0b0FscGhhMk1hcCA9IGdldEFscGhhM3RvQWxwaGEyTWFwKCk7CisJCS8vIERvIHdlIGhhdmUgdGhlIG1hcD8KKwkJaWYgKGFscGhhM3RvQWxwaGEyTWFwICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJcmV0VmFsdWUgPSBhbHBoYTN0b0FscGhhMk1hcC5nZXRQcm9wZXJ0eShhbHBoYTNJU09LZXkpOworCQl9IC8vIGlmCisJCXJldHVybiByZXRWYWx1ZTsKKwl9CisKKwlwcml2YXRlIHN5bmNocm9uaXplZCBzdGF0aWMgUHJvcGVydGllcyBnZXRBbHBoYTN0b0FscGhhMk1hcCgpIHsKKwkJLy8gQWxyZWFkeSBjcmVhdGVkIHRoZSBtYXA/CisJCWlmIChhbHBoYTNUb0FscGhhMk1hcCA9PSBudWxsKSB7CisJCQkvLyBObworCQkJZmluYWwgUHJvcGVydGllcyBhbHBoYTJUb0FscGhhM01hcCA9IGdldEFscGhhMlRvQWxwaGEzTWFwKCk7CisJCQkvLyBEbyB3ZSBoYXZlIHRoZSByZXZlcnNlIG1hcD8KKwkJCWlmIChhbHBoYTJUb0FscGhhM01hcCAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJYWxwaGEzVG9BbHBoYTJNYXAgPSBuZXcgUHJvcGVydGllcygpOworCQkJCS8vZm9yIChmaW5hbCBPYmplY3QgaXNvMktleSA6IGFscGhhMlRvQWxwaGEzTWFwLmtleVNldCgpKSB7CisJCQkJZm9yIChFbnRyeTxPYmplY3QsT2JqZWN0PiBlbnRyeSA6IGFscGhhMlRvQWxwaGEzTWFwLmVudHJ5U2V0KCkpIHsKKwkJCQkJYWxwaGEzVG9BbHBoYTJNYXAucHV0KGVudHJ5LmdldFZhbHVlKCksCisJCQkJCQkJZW50cnkuZ2V0S2V5KCkpOworCQkJCX0gLy8gZm9yIGVhY2ggU3RyaW5nCisJCQl9IC8vIGlmCisJCX0gLy8gaWYKKworCQlyZXR1cm4gYWxwaGEzVG9BbHBoYTJNYXA7CisJfQorCisJLyoqCisJICogQHBhcmFtIGFscGhhM0lTT0tleQorCSAqICAgICAgICAgICAgdGhlIElTTy0zMTY2IGFscGhhLTMga2V5CisJICogQHBhcmFtIGJ1bmRsZVByZWZpeAorCSAqICAgICAgICAgICAgVE9ETworCSAqIEBwYXJhbSBidW5kbGVUeXBlCisJICogICAgICAgICAgICBhIHtAbGluayBTdHJpbmd9IHRoYXQgaWRlbnRpZmllcyB0aGUgdHlwZSBvZiBidW5kbGUKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBidW5kbGUgdGhhdCBjb250YWlucyB0aGUgbmFtZXMgZm9yIHRoZSBpc28ga2V5J3MKKwkgKiAgICAgICAgIGNvdW50cnkuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbWFrZUJ1bmRsZU5hbWUoZmluYWwgU3RyaW5nIGFscGhhM0lTT0tleSwKKwkJCWZpbmFsIFN0cmluZyBidW5kbGVQcmVmaXgsIGZpbmFsIFN0cmluZyBidW5kbGVUeXBlKSB7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihidW5kbGVQcmVmaXgpOworCQlzYi5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAorCQlzYi5hcHBlbmQoYWxwaGEzSVNPS2V5KTsKKwkJc2IuYXBwZW5kKCJfIik7IC8vJE5PTi1OTFMtMSQKKwkJc2IuYXBwZW5kKGJ1bmRsZVR5cGUpOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9IC8vIG1ha2VCdW5kbGVOYW1lCisKKwkvKioKKwkgKiBAcGFyYW0gYWxwaGEySVNPS2V5CisJICogICAgICAgICAgICB0aGUgSVNPLTMxNjYgYWxwaGEtMyBrZXkKKwkgKiBAcGFyYW0gYnVuZGxlUHJlZml4CisJICogICAgICAgICAgICBUT0RPCisJICogQHBhcmFtIGJ1bmRsZVR5cGUKKwkgKiAgICAgICAgICAgIGEge0BsaW5rIFN0cmluZ30gdGhhdCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGJ1bmRsZQorCSAqIEByZXR1cm4gdGhlIHtAbGluayBSZXNvdXJjZUJ1bmRsZX0gZm9yIHRoZSBjb3VudHJ5IGlkZW50aWZpZWQgYnkgdGhlCisJICogICAgICAgICBJU08tMzE2NiBhbHBoYTIga2V5CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZWFkUmVzb3VyY2VCdW5kbGUoCisJCQlmaW5hbCBTdHJpbmcgYWxwaGEySVNPS2V5LCBmaW5hbCBTdHJpbmcgYnVuZGxlUHJlZml4LAorCQkJZmluYWwgU3RyaW5nIGJ1bmRsZVR5cGUpIHsKKwkJUmVzb3VyY2VCdW5kbGUgcmV0VmFsdWUgPSBudWxsOworCQlmaW5hbCBQcm9wZXJ0aWVzIGFscGhhMlRvQWxwaGEzTWFwID0gZ2V0QWxwaGEyVG9BbHBoYTNNYXAoKTsKKwkJLy8gR290IGl0PworCQlpZiAoYWxwaGEyVG9BbHBoYTNNYXAgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBTdHJpbmcgYWxwaGEzSVNPS2V5ID0gYWxwaGEyVG9BbHBoYTNNYXAKKwkJCQkJLmdldFByb3BlcnR5KGFscGhhMklTT0tleSk7CisJCQlyZXRWYWx1ZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShtYWtlQnVuZGxlTmFtZShhbHBoYTNJU09LZXksCisJCQkJCWJ1bmRsZVByZWZpeCwgYnVuZGxlVHlwZSkpOworCQl9IC8vIGlmCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gcmVhZFJlc291cmNlQnVuZGxlCisKKwkvKioKKwkgKiBAcGFyYW0gaXNvS2V5CisJICogQHBhcmFtIGJ1bmRsZVByZWZpeAorCSAqICAgICAgICAgICAgVE9ETworCSAqIEBwYXJhbSBidW5kbGVUeXBlCisJICogICAgICAgICAgICBhIHtAbGluayBTdHJpbmd9IHRoYXQgaWRlbnRpZmllcyB0aGUgdHlwZSBvZiBidW5kbGUKKwkgKiBAcGFyYW0gbGV2ZWwwUkJOYW1lCisJICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUge0BsaW5rIFJlc291cmNlQnVuZGxlfSBmaWxlIHRoYXQgY29udGFpbnMgdGhlCisJICogICAgICAgICAgICBsZXZlbCAwIHJlc291cmNlcworCSAqIEBwYXJhbSBsZXZlbDBSQgorCSAqICAgICAgICAgICAgdGhlIHJlZmVyZW5jZSBvZiB0aGUgbGV2ZWwgMCB7QGxpbmsgUmVzb3VyY2VCdW5kbGV9CisJICogQHBhcmFtIHJiTWFwCisJICogICAgICAgICAgICBhIHtAbGluayBNYXB9IGJldHdlZW4gYWxwaGEtMiBpc28ga2V5IGFuZAorCSAqICAgICAgICAgICAge0BsaW5rIFJlc291cmNlQnVuZGxlfXMKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgUmVzb3VyY2VCdW5kbGV9IHRoYXQgY29udGFpbnMgdGhlIG1hcHBpbmcKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKGZpbmFsIFN0cmluZyBpc29LZXksCisJCQlmaW5hbCBpbnQgbGV2ZWwsIGZpbmFsIFN0cmluZyBidW5kbGVQcmVmaXgsCisJCQlmaW5hbCBTdHJpbmcgYnVuZGxlVHlwZSwgZmluYWwgU3RyaW5nIGxldmVsMFJCTmFtZSwKKwkJCVJlc291cmNlQnVuZGxlIGxldmVsMFJCLCBNYXA8U3RyaW5nLCBSZXNvdXJjZUJ1bmRsZT4gcmJNYXApIHsKKwkJUmVzb3VyY2VCdW5kbGUgcmV0VmFsdWUgPSBudWxsOworCQkvLyBJZiB0aGUgbGV2ZWwgaXMgMCwgd2UgaGFuZGxlIHRoaW5ncyBzcGVjaWFsbHkuIFRoZXJlIGlzIGEgc2luZ2xlCisJCS8vIHJlc291cmNlIGJ1bmRsZSB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgbGV2ZWwgMCBtYXBwaW5ncyAoaS5lLiwgdGhlCisJCS8vIG5hbWVzIG9mIGFsbCBjb3VudHJpZXMpIFRoaXMgYWxsb3dzIHVzIHRvIGF2b2lkIHJlYWRpbmcgaW4gYWxsIG9mIHRoZQorCQkvLyBvdGhlciAoMjQ1ISkgcmVzb3VyY2UgYnVuZGxlcyBqdXN0IHRvIG9idGFpbiB0aGUgbmFtZXMgb2YgdGhlCisJCS8vIGNvdW50cmllcy4gRm9yIHRoZSBvdGhlciBsZXZlbHMgd2UgcmV0cmlldmUgdGhlIGJ1bmRsZSBzcGVjaWZpYyB0bworCQkvLyB0aGUgY291bnRyeSBiZWNhdXNlIGl0IGhhcyB0aGUgbmFtZXMgZm9yIGFsbCBsZXZlbHMgKGkuZS4sIGFsbCBJU08KKwkJLy8ga2V5cykuCisKKwkJLy8gTGV2ZWwgMD8KKwkJaWYgKGxldmVsID09IC0xIHx8IGxldmVsID09IDApIHsKKwkJCS8vIFllcworCQkJLy8gSGF2ZSB3ZSByZXRyaWV2ZWQgdGhlIGxldmVsIDAgcmVzb3VyY2UgYnVuZGxlIHlldD8KKwkJCWlmIChsZXZlbDBSQiA9PSBudWxsKSB7CisJCQkJLy8gTm8KKwkJCQlsZXZlbDBSQiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShsZXZlbDBSQk5hbWUpOworCQkJfSAvLyBpZgorCQkJcmV0VmFsdWUgPSBsZXZlbDBSQjsKKwkJfSAvLyBpZiBsZXZlbCAwCisJCWVsc2UgeworCQkJLy8gTm8KKwkJCWZpbmFsIFN0cmluZyBhbHBoYTJJU09LZXkgPSBpc29LZXkuc3Vic3RyaW5nKDAsIDIpOworCisJCQkvLyBXZSB1c2UgdGhhdCB2YWx1ZSBhcyB0aGUga2V5IHRvICJjYWNoZSIgdGhlIHJlc291cmNlIGJ1bmRsZQorCQkJcmV0VmFsdWUgPSByYk1hcC5nZXQoYWxwaGEySVNPS2V5KTsKKworCQkJLy8gSGF2ZSB3ZSByZXRyaWV2ZWQgdGhpcyBSZXNvdXJjZUJ1bmRsZSBiZWZvcmU/CisJCQlpZiAocmV0VmFsdWUgPT0gbnVsbCkgeworCQkJCS8vIE5vCisJCQkJcmV0VmFsdWUgPSByZWFkUmVzb3VyY2VCdW5kbGUoYWxwaGEySVNPS2V5LCBidW5kbGVQcmVmaXgsCisJCQkJCQlidW5kbGVUeXBlKTsKKwkJCQkvLyBXZXJlIHdlIHN1Y2Nlc3NmdWw/CisJCQkJaWYgKHJldFZhbHVlID09IG51bGwpIHsKKwkJCQkJLy8gTm8KKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKAorCQkJCQkJCSJDb3VsZCBub3QgcmVhZCBSZXNvdXJjZSBCdW5kbGUgb2YgdHlwZSAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCSsgYnVuZGxlVHlwZSArICIgZm9yIFwiIiArIGFscGhhMklTT0tleSAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkrICJcIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCisJCQkJfSAvLyBpZgorCQkJCWVsc2UgeworCQkJCQkvLyBObworCQkJCQlyYk1hcC5wdXQoYWxwaGEySVNPS2V5LCByZXRWYWx1ZSk7CisJCQkJfSAvLyBlbHNlCisJCQl9IC8vIGlmCisJCX0gLy8gZWxzZQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRSZXNvdXJjZUJ1bmRsZQorCit9IC8vIEdlb2dyYXBoaWNNYXBwZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dlb2dyYXBoeS9HZW9ncmFwaGljTmFtZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dlb2dyYXBoeS9HZW9ncmFwaGljTmFtZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDc1NjRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ2VvZ3JhcGh5L0dlb2dyYXBoaWNOYW1lcy5qYXZhCkBAIC0wLDAgKzEsMjI2IEBACisvLyBHZW9ncmFwaGljTmFtZXMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgTkxTJ2QgbmFtZXMgZm9yIGdlb2dyYXBoaWMgbG9jYXRpb25zLgorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBHZW9ncmFwaGljTmFtZXMgZXh0ZW5kcyBHZW9ncmFwaGljTWFwcGVyIHsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgYnVuZGxlIGZvciBnZW9ncmFwaGljCisJICogbmFtZXMuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTX0JVTkRMRV9UWVBFID0gIm5hbWVzIjsKKworCS8qKgorCSAqIFRoZSByb290IG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbGV2ZWwgMCBuYW1lcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRVZFTF8wX0lTT19OQU1FU19ST09UX05BTUUgPSAibGV2ZWwwSVNPTmFtZXMiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUxfMF9SQl9OQU1FID0gUkJfUFJFRklYICsgIi4iIC8vJE5PTi1OTFMtMSQKKwkJCSsgTEVWRUxfMF9JU09fTkFNRVNfUk9PVF9OQU1FOworCisJcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgbGV2ZWwwUkIgPSBudWxsOworCisJcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgUmVzb3VyY2VCdW5kbGU+IHJiTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZXNvdXJjZUJ1bmRsZT4oKTsKKworCS8qKgorCSAqIEBwYXJhbSBpc29LZXkKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBnZW9ncmFwaGljIGxvY2F0aW9uIHRoYXQgbWF0Y2hlcyBpc29LZXkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lKGZpbmFsIFN0cmluZyBpc29LZXkpIHsKKwkJcmV0dXJuIGdldE5hbWUoaXNvS2V5LCBrZXlMZXZlbChpc29LZXkpKTsKKwl9IC8vIGdldE5hbWUKKworCS8qKgorCSAqIEBwYXJhbSBpc29LZXkKKwkgKiBAcGFyYW0gbGV2ZWwKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBnZW9ncmFwaGljIGxvY2F0aW9uIHRoYXQgbWF0Y2hlcyBpc29LZXkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lKGZpbmFsIFN0cmluZyBpc29LZXksIGZpbmFsIGludCBsZXZlbCkgeworCQl0cnkgeworCQkJU3RyaW5nIGlzb0tleTIgPSBpc29LZXk7CisJCQkvLyBhbHBoYTMga2V5PworCQkJaWYgKGlzb0tleS5sZW5ndGgoKSA9PSAzKSB7CisJCQkJLy8gWWVzCisJCQkJaXNvS2V5MiA9IGdldEFscGhhMihpc29LZXkpOworCQkJfSAvLyBpZgorCisJCQlmaW5hbCBSZXNvdXJjZUJ1bmRsZSByYiA9IGdldFJlc291cmNlQnVuZGxlKGlzb0tleTIsIGxldmVsLAorCQkJCQlSQl9QUkVGSVgsIE5BTUVTX0JVTkRMRV9UWVBFLCBMRVZFTF8wX1JCX05BTUUsIGxldmVsMFJCLCByYk1hcCk7CisJCQlyZXR1cm4gcmIuZ2V0U3RyaW5nKGlzb0tleTIpLnRyaW0oKTsKKwkJfSBjYXRjaCAoZmluYWwgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBpc29LZXkgKyAnISc7CisJCX0gY2F0Y2ggKGZpbmFsIE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBpc29LZXkgKyAnISc7CisJCX0gLy8gY2F0Y2ggTnVsbFBvaW50ZXJFeGNlcHRpb24KKwl9IC8vIGdldE5hbWUKKworCS8qKgorCSAqIEBwYXJhbSB1cmkgdGhlIHtAbGluayBVUkl9IG9mIGEgZ2VvZ3JhcGhpYyBsb2NhdGlvbgorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGdlb2dyYXBoaWMgbG9jYXRpb24gdGhhdCBtYXRjaGVzIHtAbGluayBVUkl9CisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShVUkkgdXJpKSB7CisJCXJldHVybiBnZXROYW1lKHVyaS5sYXN0U2VnbWVudCgpLnRvU3RyaW5nKCkpOworCX0gLy8gZ2V0TmFtZQorCisJLyoqCisJICogQHBhcmFtIGlzb0tleQorCSAqICAgICAgICAgICAgdGhlIElTTy0zMTY2IGFscGhhMiBvciBhbHBoYTMga2V5IG9mIGEgZ2VvZ3JhcGhpYyBsb2NhdGlvbgorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSB0aGUgaXNvS2V5IGluIHJldmVyc2UKKwkgKiAgICAgICAgIGhpZXJhcmNoeSwgZS5nLiwgIlNhbnRhIENsYXJhIENvdW50cnksIENhbGlmb3JuaWEsIFVTQSIgZm9yIHRoZQorCSAqICAgICAgICAgSVNPIEtleSAiVVMtQ0EtMDYwODUiCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmV2ZXJzZUhpZXJhcmNoeU5hbWUoZmluYWwgU3RyaW5nIGlzb0tleSkgeworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0TmFtZShpc29LZXkpKTsKKworCQlTdHJpbmcgdGVtcCA9IGlzb0tleTsKKwkJaW50IGkgPSB0ZW1wLmxhc3RJbmRleE9mKCItIik7IC8vJE5PTi1OTFMtMSQKKwkJd2hpbGUoIGkgPiAwKSB7CisJCQkvLyBTdHJpcCBvZmYgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUga2V5CisJCQl0ZW1wID0gaXNvS2V5LnN1YnN0cmluZygwLGkpOworCQkJc2IuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCisJCQlzYi5hcHBlbmQoZ2V0TmFtZSh0ZW1wKSk7CisJCQlpID0gdGVtcC5sYXN0SW5kZXhPZigiLSIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfSAvLyBnZXRSZXZlcnNlSGllcmFyY2h5TmFtZQorCisJLyoqCisJICogQHBhcmFtIGlzb0tleQorCSAqICAgICAgICAgICAgdGhlIGlzb0tleSBmb3Igd2hpY2ggYW55ICJzdWIiIGtleXMgYXQgdGhlIGxldmVsIHNob3VsZCBiZQorCSAqICAgICAgICAgICAgcmV0dXJuZWQuCisJICogQHBhcmFtIGxldmVsCisJICogICAgICAgICAgICB0aGUgYWRtaW5pc3RyYXRpdmUgbGV2ZWwgb2YgdGhlIGtleQorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIElTTyBrZXlzIHRoYXQgaGF2ZSB0aGUgcGFzc2VkIGtleSBhcyBhIHByZWZpeC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGdldFN1YklTT0tleXMoZmluYWwgU3RyaW5nIGlzb0tleSwgZmluYWwgaW50IGxldmVsKSB7CisJCU9iamVjdFtdIHJldFZhbHVlID0gbmV3IE9iamVjdFtdIHt9OworCisJCS8vIEVhcnRoIChaWlopPworCQlpZiAoaXNvS2V5LmVxdWFscyhFQVJUSF9BTFBIQTNfSVNPX0tFWSkpIHsKKwkJCS8vIFllcworCQkJZmluYWwgUHJvcGVydGllcyBhbHBoYTJUb0FscGhhM01hcCA9IGdldEFscGhhMlRvQWxwaGEzTWFwKCk7CisJCQkvLyBEbyB3ZSBoYXZlIHRoZSBtYXA/CisJCQlpZiAoYWxwaGEyVG9BbHBoYTNNYXAgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCS8vIHJldFZhbHVlID0gYWxwaGEyVG9BbHBoYTNNYXAua2V5U2V0KCkudG9BcnJheSgpOworCQkJCXJldFZhbHVlID0gYWxwaGEyVG9BbHBoYTNNYXAudmFsdWVzKCkudG9BcnJheSgpOworCQkJfSAvLyBpZgorCQl9IC8vIGlmIEVhcnRoCisJCWVsc2UgeworCQkJLy8gTm8KKwkJCXRyeSB7CisJCQkJZmluYWwgUmVzb3VyY2VCdW5kbGUgcmIgPSBnZXRSZXNvdXJjZUJ1bmRsZShpc29LZXksIGxldmVsLAorCQkJCQkJUkJfUFJFRklYLCBOQU1FU19CVU5ETEVfVFlQRSwgTEVWRUxfMF9SQl9OQU1FLCBsZXZlbDBSQiwgcmJNYXApOworCQkJCWZpbmFsIExpc3Q8U3RyaW5nPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQkJZm9yIChmaW5hbCBFbnVtZXJhdGlvbjxTdHJpbmc+IGtleXMgPSByYi5nZXRLZXlzKCk7IGtleXMKKwkJCQkJCS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKwkJCQkJZmluYWwgU3RyaW5nIHRlbXBLZXkgPSBrZXlzLm5leHRFbGVtZW50KCk7CisJCQkJCS8vIElzIHRoaXMga2V5IGF0IHRoZSBuZXh0IGxldmVsPworCQkJCQlpZiAodGVtcEtleS5zdGFydHNXaXRoKGlzb0tleSkKKwkJCQkJCQkmJiBrZXlMZXZlbCh0ZW1wS2V5KSA9PSBsZXZlbCAvKiArIDEgKi8pIHsKKwkJCQkJCS8vIFllcworCQkJCQkJdGVtcC5hZGQodGVtcEtleSk7CisJCQkJCX0gLy8gaWYKKwkJCQl9IC8vIGZvciBlYWNoIGtleQorCQkJCXJldFZhbHVlID0gdGVtcC50b0FycmF5KG5ldyBTdHJpbmdbXSB7fSk7CisJCQl9IGNhdGNoIChmaW5hbCBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7CisJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKG1yZS5nZXRNZXNzYWdlKCksIG1yZSk7CisJCQl9CisJCX0gLy8gZWxzZQorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldFN1YklTT0tleXMKKwkKKwkvKioKKwkgKiBAcGFyYW0gaXNvS2V5CisJICogQHBhcmFtIGJ1bmRsZVByZWZpeAorCSAqICAgICAgICAgICAgVE9ETworCSAqIEBwYXJhbSBidW5kbGVUeXBlCisJICogICAgICAgICAgICBhIHtAbGluayBTdHJpbmd9IHRoYXQgaWRlbnRpZmllcyB0aGUgdHlwZSBvZiBidW5kbGUKKwkgKiBAcGFyYW0gbGV2ZWwwUkJOYW1lCisJICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUge0BsaW5rIFJlc291cmNlQnVuZGxlfSBmaWxlIHRoYXQgY29udGFpbnMgdGhlCisJICogICAgICAgICAgICBsZXZlbCAwIHJlc291cmNlcworCSAqIEBwYXJhbSBsZXZlbDBSQgorCSAqICAgICAgICAgICAgdGhlIHJlZmVyZW5jZSBvZiB0aGUgbGV2ZWwgMCB7QGxpbmsgUmVzb3VyY2VCdW5kbGV9CisJICogQHBhcmFtIHJiTWFwCisJICogICAgICAgICAgICBhIHtAbGluayBNYXB9IGJldHdlZW4gYWxwaGEtMiBpc28ga2V5IGFuZAorCSAqICAgICAgICAgICAge0BsaW5rIFJlc291cmNlQnVuZGxlfXMKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgUmVzb3VyY2VCdW5kbGV9IHRoYXQgY29udGFpbnMgdGhlIG1hcHBpbmcKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKGZpbmFsIFN0cmluZyBpc29LZXksCisJCQlmaW5hbCBpbnQgbGV2ZWwsIGZpbmFsIFN0cmluZyBidW5kbGVQcmVmaXgsCisJCQlmaW5hbCBTdHJpbmcgYnVuZGxlVHlwZSwgZmluYWwgU3RyaW5nIGxldmVsMFJCTmFtZSwKKwkJCVJlc291cmNlQnVuZGxlIGxldmVsMFJCLCBNYXA8U3RyaW5nLCBSZXNvdXJjZUJ1bmRsZT4gcmJNYXApIHsKKwkJUmVzb3VyY2VCdW5kbGUgcmV0VmFsdWUgPSBudWxsOworCQkvLyBJZiB0aGUgbGV2ZWwgaXMgMCwgd2UgaGFuZGxlIHRoaW5ncyBzcGVjaWFsbHkuIFRoZXJlIGlzIGEgc2luZ2xlCisJCS8vIHJlc291cmNlIGJ1bmRsZSB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgbGV2ZWwgMCBtYXBwaW5ncyAoaS5lLiwgdGhlCisJCS8vIG5hbWVzIG9mIGFsbCBjb3VudHJpZXMpIFRoaXMgYWxsb3dzIHVzIHRvIGF2b2lkIHJlYWRpbmcgaW4gYWxsIG9mIHRoZQorCQkvLyBvdGhlciAoMjQ1ISkgcmVzb3VyY2UgYnVuZGxlcyBqdXN0IHRvIG9idGFpbiB0aGUgbmFtZXMgb2YgdGhlCisJCS8vIGNvdW50cmllcy4gRm9yIHRoZSBvdGhlciBsZXZlbHMgd2UgcmV0cmlldmUgdGhlIGJ1bmRsZSBzcGVjaWZpYyB0bworCQkvLyB0aGUgY291bnRyeSBiZWNhdXNlIGl0IGhhcyB0aGUgbmFtZXMgZm9yIGFsbCBsZXZlbHMgKGkuZS4sIGFsbCBJU08KKwkJLy8ga2V5cykuCisKKwkJLy8gTGV2ZWwgMD8KKwkJaWYgKGxldmVsID09IC0xIHx8IGxldmVsID09IDApIHsKKwkJCS8vIFllcworCQkJLy8gSGF2ZSB3ZSByZXRyaWV2ZWQgdGhlIGxldmVsIDAgcmVzb3VyY2UgYnVuZGxlIHlldD8KKwkJCWlmIChsZXZlbDBSQiA9PSBudWxsKSB7CisJCQkJLy8gTm8KKwkJCQlsZXZlbDBSQiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShsZXZlbDBSQk5hbWUpOworCQkJfSAvLyBpZgorCQkJcmV0VmFsdWUgPSBsZXZlbDBSQjsKKwkJfSAvLyBpZiBsZXZlbCAwCisJCWVsc2UgeworCQkJLy8gTm8KKwkJCWZpbmFsIFN0cmluZyBhbHBoYTJJU09LZXkgPSBpc29LZXkuc3Vic3RyaW5nKDAsIDIpOworCisJCQkvLyBXZSB1c2UgdGhhdCB2YWx1ZSBhcyB0aGUga2V5IHRvICJjYWNoZSIgdGhlIHJlc291cmNlIGJ1bmRsZQorCQkJcmV0VmFsdWUgPSByYk1hcC5nZXQoYWxwaGEySVNPS2V5KTsKKworCQkJLy8gSGF2ZSB3ZSByZXRyaWV2ZWQgdGhpcyBSZXNvdXJjZUJ1bmRsZSBiZWZvcmU/CisJCQlpZiAocmV0VmFsdWUgPT0gbnVsbCkgeworCQkJCS8vIE5vCisJCQkJcmV0VmFsdWUgPSByZWFkUmVzb3VyY2VCdW5kbGUoYWxwaGEySVNPS2V5LCBidW5kbGVQcmVmaXgsCisJCQkJCQlidW5kbGVUeXBlKTsKKwkJCQkvLyBXZXJlIHdlIHN1Y2Nlc3NmdWw/CisJCQkJaWYgKHJldFZhbHVlID09IG51bGwpIHsKKwkJCQkJLy8gTm8KKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKAorCQkJCQkJCSJDb3VsZCBub3QgcmVhZCBSZXNvdXJjZSBCdW5kbGUgb2YgdHlwZSAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCSsgYnVuZGxlVHlwZSArICIgZm9yIFwiIiArIGFscGhhMklTT0tleSAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkrICJcIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCisJCQkJfSAvLyBpZgorCQkJCWVsc2UgeworCQkJCQkvLyBObworCQkJCQlyYk1hcC5wdXQoYWxwaGEySVNPS2V5LCByZXRWYWx1ZSk7CisJCQkJfSAvLyBlbHNlCisJCQl9IC8vIGlmCisJCX0gLy8gZWxzZQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRSZXNvdXJjZUJ1bmRsZQorfSAvLyBHZW9ncmFwaGljTmFtZXMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dlb2dyYXBoeS9JU09LZXkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dlb2dyYXBoeS9JU09LZXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODc1ODNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ2VvZ3JhcGh5L0lTT0tleS5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8vIElTT0tleS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gSVNPLTMxNjYtMSBhbHBoYTMgb3IgYWxwaGEyIGNvdW50cnkga2V5IChvcgorICogY29tYmluYXRpb24pLgorICovCitwdWJsaWMgY2xhc3MgSVNPS2V5IGltcGxlbWVudHMgQ29tcGFyYWJsZTxJU09LZXk+IHsKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBJU08ga2V5IHVzZWQgdG8gcmVwcmVzZW50IFRoZSBFYXJ0aAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSVNPS2V5IEVBUlRIID0gbmV3IElTT0tleSgiWlpaIik7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgU3RyaW5nIGtleSA9IG51bGw7CisKKwkvKioKKwkgKiBAcGFyYW0ga2V5CisJICogICAgICAgICAgICB0aGUga2V5CisJICovCisJcHVibGljIElTT0tleShmaW5hbCBTdHJpbmcga2V5KSB7CisJCXRoaXMua2V5ID0ga2V5LnRyaW0oKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBrZXkKKwkgKi8KKwlwdWJsaWMgZmluYWwgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIGtleTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBrZXkuaGFzaENvZGUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKwkJaWYgKHRoaXMgPT0gb2JqKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWZpbmFsIElTT0tleSBvdGhlciA9IChJU09LZXkpIG9iajsKKwkJaWYgKGtleSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIua2V5ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0gZWxzZSBpZiAoIWtleS5lcXVhbHMob3RoZXIua2V5KSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGtleTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaXNvS2V5CisJICogICAgICAgICAgICB0aGUga2V5IHRvIGNvbXBhcmUgdG8KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiBzdHJpbmcgY29tcGFyZVRvCisJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZSNjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgaW50IGNvbXBhcmVUbyhmaW5hbCBJU09LZXkgaXNvS2V5KSB7CisJCXJldHVybiB0aGlzLmtleS5jb21wYXJlVG8oaXNvS2V5LmtleSk7CisJfQorCit9IC8vIElTT0tleQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ2VvZ3JhcGh5L2NlbnRlcnMvLmN2c2lnbm9yZSBiL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dlb2dyYXBoeS9jZW50ZXJzLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU2N2UyMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dlb2dyYXBoeS9jZW50ZXJzLy5jdnNpZ25vcmUKQEAgLTAsMCArMSBAQAorKi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9nZW9ncmFwaHkvY2VudGVycy9HZW9ncmFwaGljQ2VudGVycy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ2VvZ3JhcGh5L2NlbnRlcnMvR2VvZ3JhcGhpY0NlbnRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjU1YTNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ2VvZ3JhcGh5L2NlbnRlcnMvR2VvZ3JhcGhpY0NlbnRlcnMuamF2YQpAQCAtMCwwICsxLDE2MiBAQAorLy8gR2VvZ3JhcGhpY0NlbnRlcnMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeS5jZW50ZXJzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5LkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeS5HZW9ncmFwaGljTWFwcGVyOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBwcmUtY29tcHV0ZWQgZ2VvZ3JhcGhpYyBMYXRpdHVkZSBhbmQKKyAqIExvbmdpdHVkZSBmb3IgdGhlIGNlbnRlciBvZiBnZW9ncmFwaGljIGxvY2F0aW9ucy4KKyAqLworcHVibGljIGNsYXNzIEdlb2dyYXBoaWNDZW50ZXJzIGV4dGVuZHMgR2VvZ3JhcGhpY01hcHBlciB7CisJLyoqCisJICogVGhpcyBpcyB0aGUgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUgdHlwZSBvZiBidW5kbGUgZm9yIGdlb2dyYXBoaWMKKwkgKiBjZW50ZXJzLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRU5URVJTX0JVTkRMRV9UWVBFID0gImNlbnRlcnMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgcm9vdCBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGxldmVsIDAgbmFtZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUxfMF9JU09fTkFNRVNfUk9PVF9OQU1FID0gImxldmVsMElTT05hbWVzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExFVkVMXzBfUkJfTkFNRSA9IFJCX1BSRUZJWCArICIuIiAvLyROT04tTkxTLTEkCisJCQkrIExFVkVMXzBfSVNPX05BTUVTX1JPT1RfTkFNRTsKKworCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGxldmVsMFJCID0gbnVsbDsKKworCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFJlc291cmNlQnVuZGxlPiByYk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUmVzb3VyY2VCdW5kbGU+KCk7CisKKwkvKioKKwkgKiBAcGFyYW0gaXNvS2V5CisJICogICAgICAgICAgICB0aGUgSVNPLTMxNjYgYWxwaGEyIG9yIGFscGhhMyBrZXkgb2YgYSBnZW9ncmFwaGljIGxvY2F0aW9uCisJICogQHJldHVybiB0aGUgY2VudGVyIG9mIHRoZSBnZW9ncmFwaGljIGxvY2F0aW9uIHRoYXQgbWF0Y2hlcyBpc29LZXksIHRoZQorCSAqICAgICAgICAgZmlyc3QgaW5kZXggKDApIG9mIHRoZSBhcnJheSBpcyB0aGUgbGF0aXR1ZGUsIHRoZSBzZWNvbmQgKDEpIGlzCisJICogICAgICAgICB0aGUgbG9uZ2l0dWRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY2VudGVyIGNvdWxkIG5vdCBiZQorCSAqICAgICAgICAgZm91bmQgZm9yIHRoZSBrZXkuCisJICovCisJcHVibGljIHN0YXRpYyBkb3VibGVbXSBnZXRDZW50ZXIoZmluYWwgU3RyaW5nIGlzb0tleSkgeworCQlyZXR1cm4gZ2V0Q2VudGVyKGlzb0tleSwga2V5TGV2ZWwoaXNvS2V5KSk7CisJfSAvLyBnZXRDZW50ZXIKKworCS8qKgorCSAqIEBwYXJhbSBpc29LZXkKKwkgKiAgICAgICAgICAgIHRoZSBJU08tMzE2NiBhbHBoYTIgb3IgYWxwaGEzIGtleSBvZiBhIGdlb2dyYXBoaWMgbG9jYXRpb24KKwkgKiBAcGFyYW0gbGV2ZWwKKwkgKiAgICAgICAgICAgIHRoZSBsZXZlbCBvZiB0aGUga2V5CisJICogQHJldHVybiB0aGUgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBnZW9ncmFwaGljIHJlZ2lvbgorCSAqICAgICAgICAgdGhhdCBtYXRjaGVzIGlzb0tleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZG91YmxlW10gZ2V0Q2VudGVyKGZpbmFsIFN0cmluZyBpc29LZXksIGZpbmFsIGludCBsZXZlbCkgeworCQlkb3VibGVbXSByZXRWYWx1ZSA9IG51bGw7CisJCVN0cmluZyBsYXRMb25nU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKKworCQl0cnkgeworCQkJU3RyaW5nIGlzb0tleTIgPSBpc29LZXk7CisJCQkvLyBhbHBoYTMga2V5PworCQkJaWYgKGlzb0tleS5sZW5ndGgoKSA9PSAzKSB7CisJCQkJLy8gWWVzCisJCQkJaXNvS2V5MiA9IGdldEFscGhhMihpc29LZXkpOworCQkJfSAvLyBpZgorCisJCQlmaW5hbCBSZXNvdXJjZUJ1bmRsZSByYiA9IGdldFJlc291cmNlQnVuZGxlKGlzb0tleTIsIGxldmVsLAorCQkJCQlSQl9QUkVGSVggKyAiLmNlbnRlcnMiLCBDRU5URVJTX0JVTkRMRV9UWVBFLCAvLyROT04tTkxTLTEkCisJCQkJCUxFVkVMXzBfUkJfTkFNRSwgbGV2ZWwwUkIsIHJiTWFwKTsKKwkJCWxhdExvbmdTdHJpbmcgPSByYi5nZXRTdHJpbmcoaXNvS2V5MikudHJpbSgpOworCQkJLy8gRGlkIHdlIGdldCBhbnl0aGluZz8KKwkJCWlmIChsYXRMb25nU3RyaW5nICE9IG51bGwgJiYgIWxhdExvbmdTdHJpbmcuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJLy8gWWVzCisJCQkJZmluYWwgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihsYXRMb25nU3RyaW5nLAorCQkJCQkJIiwiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWZpbmFsIFN0cmluZyBsYXRpdHVkZVN0cmluZyA9IHN0Lm5leHRUb2tlbigpOworCQkJCWZpbmFsIFN0cmluZyBsb25naXR1ZGVTdHJpbmcgPSBzdC5uZXh0VG9rZW4oKTsKKworCQkJCXJldFZhbHVlID0gbmV3IGRvdWJsZVsyXTsKKwkJCQlyZXRWYWx1ZVswXSA9IERvdWJsZS5wYXJzZURvdWJsZShsYXRpdHVkZVN0cmluZyk7CisJCQkJcmV0VmFsdWVbMV0gPSBEb3VibGUucGFyc2VEb3VibGUobG9uZ2l0dWRlU3RyaW5nKTsKKwkJCX0gLy8gaWYKKworCQl9IGNhdGNoIChmaW5hbCBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCQkJcmV0VmFsdWUgPSBudWxsOworCQl9IGNhdGNoIChmaW5hbCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisJCQlyZXRWYWx1ZSA9IG51bGw7CisJCX0gLy8gY2F0Y2ggTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiRXJyb3IgcGFyc2luZyBcIiIgKyBsYXRMb25nU3RyaW5nIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyAiXCIgZm9yIHRoZSBsYXQvbG9uZyBjZW50ZXIgb2YgXCIiICsgaXNvS2V5IC8vJE5PTi1OTFMtMSQKKwkJCQkJKyAiXCIgTnVtYmVyIGZvcm1hdD8iLCBuZmUpOyAvLyROT04tTkxTLTEkCisJCX0gLy8gY2F0Y2ggTnVtYmVyRm9ybWF0RXhjZXB0aW9uCisJCWNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5zZWUpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiRXJyb3IgcGFyc2luZyBcIiIgKyBsYXRMb25nU3RyaW5nIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyAiXCIgZm9yIHRoZSBsYXQvbG9uZyBjZW50ZXIgb2YgXCIiICsgaXNvS2V5IC8vJE5PTi1OTFMtMSQKKwkJCQkJKyAiXCIgTWlzc2luZyB2YWx1ZT8iLCBuc2VlKTsgLy8kTk9OLU5MUy0xJAorCQl9IC8vIGNhdGNoIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRDZW50ZXIKKworCS8qKgorCSAqIEBwYXJhbSBpc29LZXkKKwkgKiBAcGFyYW0gYnVuZGxlUHJlZml4CisJICogICAgICAgICAgICBUT0RPCisJICogQHBhcmFtIGJ1bmRsZVR5cGUKKwkgKiAgICAgICAgICAgIGEge0BsaW5rIFN0cmluZ30gdGhhdCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGJ1bmRsZQorCSAqIEBwYXJhbSBsZXZlbDBSQk5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB7QGxpbmsgUmVzb3VyY2VCdW5kbGV9IGZpbGUgdGhhdCBjb250YWlucyB0aGUKKwkgKiAgICAgICAgICAgIGxldmVsIDAgcmVzb3VyY2VzCisJICogQHBhcmFtIGxldmVsMFJCCisJICogICAgICAgICAgICB0aGUgcmVmZXJlbmNlIG9mIHRoZSBsZXZlbCAwIHtAbGluayBSZXNvdXJjZUJ1bmRsZX0KKwkgKiBAcGFyYW0gcmJNYXAKKwkgKiAgICAgICAgICAgIGEge0BsaW5rIE1hcH0gYmV0d2VlbiBhbHBoYS0yIGlzbyBrZXkgYW5kCisJICogICAgICAgICAgICB7QGxpbmsgUmVzb3VyY2VCdW5kbGV9cworCSAqIEByZXR1cm4gdGhlIHtAbGluayBSZXNvdXJjZUJ1bmRsZX0gdGhhdCBjb250YWlucyB0aGUgbWFwcGluZworCSAqLworCXByb3RlY3RlZCBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoZmluYWwgU3RyaW5nIGlzb0tleSwKKwkJCWZpbmFsIGludCBsZXZlbCwKKwkJCWZpbmFsIFN0cmluZyBidW5kbGVQcmVmaXgsIGZpbmFsIFN0cmluZyBidW5kbGVUeXBlLAorCQkJZmluYWwgU3RyaW5nIGxldmVsMFJCTmFtZSwgUmVzb3VyY2VCdW5kbGUgbGV2ZWwwUkIsCisJCQlNYXA8U3RyaW5nLCBSZXNvdXJjZUJ1bmRsZT4gcmJNYXApIHsKKwkJUmVzb3VyY2VCdW5kbGUgcmV0VmFsdWUgPSBudWxsOworCisJCWZpbmFsIFN0cmluZyBhbHBoYTJJU09LZXkgPSBpc29LZXkuc3Vic3RyaW5nKDAsIDIpOworCisJCS8vIFdlIHVzZSB0aGF0IHZhbHVlIGFzIHRoZSBrZXkgdG8gImNhY2hlIiB0aGUgcmVzb3VyY2UgYnVuZGxlCisJCXJldFZhbHVlID0gcmJNYXAuZ2V0KGFscGhhMklTT0tleSk7CisKKwkJLy8gSGF2ZSB3ZSByZXRyaWV2ZWQgdGhpcyBSZXNvdXJjZUJ1bmRsZSBiZWZvcmU/CisJCWlmIChyZXRWYWx1ZSA9PSBudWxsKSB7CisJCQkvLyBObworCQkJcmV0VmFsdWUgPSByZWFkUmVzb3VyY2VCdW5kbGUoYWxwaGEySVNPS2V5LCBidW5kbGVQcmVmaXgsCisJCQkJCWJ1bmRsZVR5cGUpOworCQkJLy8gV2VyZSB3ZSBzdWNjZXNzZnVsPworCQkJaWYgKHJldFZhbHVlID09IG51bGwpIHsKKwkJCQkvLyBObworCQkJCUFjdGl2YXRvci5sb2dFcnJvcigiQ291bGQgbm90IHJlYWQgUmVzb3VyY2UgQnVuZGxlIG9mIHR5cGUgIiAvLyROT04tTkxTLTEkCisJCQkJCQkrIGJ1bmRsZVR5cGUgKyAiIGZvciBcIiIgKyBhbHBoYTJJU09LZXkgKyAiXCIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQl9IC8vIGlmCisJCQllbHNlIHsKKwkJCQkvLyBObworCQkJCXJiTWFwLnB1dChhbHBoYTJJU09LZXksIHJldFZhbHVlKTsKKwkJCX0gLy8gZWxzZQorCQl9IC8vIGlmCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldFJlc291cmNlQnVuZGxlCit9IC8vIEdlb2dyYXBoaWNDZW50ZXJzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRlODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2E3Y2I3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnM8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjQ0NDEzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyMSBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDEuMC4xCitCdW5kbGUtQ2xhc3NQYXRoOiAuCitCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5wcm92aWRlci5HcmFwaGdlbmVyYXRvckVkaXRQbHVnaW4kSW1wbGVtZW50YXRpb24KK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMsCisgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbCwKKyBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5wcm92aWRlciwKKyBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy51dGlsCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLmVtZi5lY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UuZW1mLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucztidW5kbGUtdmVyc2lvbj0iMS4wLjEiCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhM2IyYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNCBAQAorCisjIDxjb3B5cmlnaHQ+CisjIDwvY29weXJpZ2h0PgorIworIyAkSWQkCisKK2Jpbi5pbmNsdWRlcyA9IC4sXAorICAgICAgICAgICAgICAgaWNvbnMvLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuCitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaEdlbmVyYXRvci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9pY29ucy9mdWxsL29iajE2L0dyYXBoR2VuZXJhdG9yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjc0MTRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaEdlbmVyYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvaWNvbnMvZnVsbC9vYmoxNi9NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvaWNvbnMvZnVsbC9vYmoxNi9NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiN2M0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9pY29ucy9mdWxsL29iajE2L01pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvaWNvbnMvZnVsbC9vYmoxNi9QYWpla05ldEdyYXBoR2VuZXJhdG9yLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL2ljb25zL2Z1bGwvb2JqMTYvUGFqZWtOZXRHcmFwaEdlbmVyYXRvci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0NTUxYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL2ljb25zL2Z1bGwvb2JqMTYvUGFqZWtOZXRHcmFwaEdlbmVyYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvaWNvbnMvZnVsbC9vYmoxNi9QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvaWNvbnMvZnVsbC9vYmoxNi9QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZDIyMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9pY29ucy9mdWxsL29iajE2L1BsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvaWNvbnMvZnVsbC9vYmoxNi9TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvaWNvbnMvZnVsbC9vYmoxNi9TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOWViYmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9pY29ucy9mdWxsL29iajE2L1NxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvbW9kZWwvZ3JhcGhnZW5lcmF0b3IuZ2VubW9kZWwgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9tb2RlbC9ncmFwaGdlbmVyYXRvci5nZW5tb2RlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODk5Y2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvbW9kZWwvZ3JhcGhnZW5lcmF0b3IuZ2VubW9kZWwKQEAgLTAsMCArMSwzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCisgICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjIgorICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYyIKKyAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycyIgbW9kZWxOYW1lPSJHcmFwaGdlbmVyYXRvciIgZWRpdG9yUGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzLnByZXNlbnRhdGlvbi5HcmFwaGdlbmVyYXRvckVkaXRvclBsdWdpbiIKKyAgICB0ZXN0c0RpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0udGVzdC5ncmFwaGdlbmVyYXRvcnMvc3JjIiB0ZXN0U3VpdGVDbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS50ZXN0LmdyYXBoZ2VuZXJhdG9ycy50ZXN0cy5HcmFwaGdlbmVyYXRvckFsbFRlc3RzIgorICAgIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5lY29yZSIgY29tcGxpYW5jZUxldmVsPSI1LjAiIGNvcHlyaWdodEZpZWxkcz0iZmFsc2UiCisgICAgZWRpdG9yUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzIiB1c2VkR2VuUGFja2FnZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vY29tbW9uIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9ncmFwaCAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL21vZGVsIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vbW9kaWZpZXIgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9zY2VuYXJpbyAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL3NlcXVlbmNlciAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL3NvbHZlciI+CisgIDxmb3JlaWduTW9kZWw+Z3JhcGhnZW5lcmF0b3JzLmVjb3JlPC9mb3JlaWduTW9kZWw+CisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkdyYXBoZ2VuZXJhdG9ycyIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLnN0ZW0iIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCisgICAgICBlY29yZVBhY2thZ2U9ImdyYXBoZ2VuZXJhdG9ycy5lY29yZSMvIj4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJncmFwaGdlbmVyYXRvcnMuZWNvcmUjLy9HcmFwaEdlbmVyYXRvciI+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iZ3JhcGhnZW5lcmF0b3JzLmVjb3JlIy8vR3JhcGhHZW5lcmF0b3IvZ2V0R3JhcGgiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJncmFwaGdlbmVyYXRvcnMuZWNvcmUjLy9MYXR0aWNlR3JhcGhHZW5lcmF0b3IiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGdyYXBoZ2VuZXJhdG9ycy5lY29yZSMvL0xhdHRpY2VHcmFwaEdlbmVyYXRvci91c2VOZWFyZXN0TmVpZ2hib3JzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZ3JhcGhnZW5lcmF0b3JzLmVjb3JlIy8vTGF0dGljZUdyYXBoR2VuZXJhdG9yL3VzZU5leHROZWFyZXN0TmVpZ2hib3JzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZ3JhcGhnZW5lcmF0b3JzLmVjb3JlIy8vTGF0dGljZUdyYXBoR2VuZXJhdG9yL3BlcmlvZGljQm91bmRhcmllcyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJncmFwaGdlbmVyYXRvcnMuZWNvcmUjLy9TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGdyYXBoZ2VuZXJhdG9ycy5lY29yZSMvL1NxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvci94U2l6ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGdyYXBoZ2VuZXJhdG9ycy5lY29yZSMvL1NxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvci95U2l6ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGdyYXBoZ2VuZXJhdG9ycy5lY29yZSMvL1NxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvci9hcmVhIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImdyYXBoZ2VuZXJhdG9ycy5lY29yZSMvL01pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvciI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZ3JhcGhnZW5lcmF0b3JzLmVjb3JlIy8vTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yL2xvY2F0aW9uIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZ3JhcGhnZW5lcmF0b3JzLmVjb3JlIy8vTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yL21pZ3JhdGlvblJhdGUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBncmFwaGdlbmVyYXRvcnMuZWNvcmUjLy9NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IvcG9wdWxhdGlvbiIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJncmFwaGdlbmVyYXRvcnMuZWNvcmUjLy9QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGdyYXBoZ2VuZXJhdG9ycy5lY29yZSMvL1BsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvci9hbmd1bGFyU3RlcCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGdyYXBoZ2VuZXJhdG9ycy5lY29yZSMvL1BsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvci9yYWRpdXMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgIDwvZ2VuUGFja2FnZXM+Cis8L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvbW9kZWwvZ3JhcGhnZW5lcmF0b3JzLmVjb3JlIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvbW9kZWwvZ3JhcGhnZW5lcmF0b3JzLmVjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyN2IxM2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9tb2RlbC9ncmFwaGdlbmVyYXRvcnMuZWNvcmUKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iZ3JhcGhnZW5lcmF0b3JzIgorICAgIG5zVVJJPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL2dyYXBoZ2VuZXJhdG9ycy5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzIj4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEdlbmVyYXRvciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29tbW9uLmVjb3JlIy8vSWRlbnRpZmlhYmxlIj4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0R3JhcGgiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2dyYXBoLmVjb3JlIy8vR3JhcGgiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTGF0dGljZUdyYXBoR2VuZXJhdG9yIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgIGVTdXBlclR5cGVzPSIjLy9HcmFwaEdlbmVyYXRvciI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZU5lYXJlc3ROZWlnaGJvcnMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQm9vbGVhbiIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2VOZXh0TmVhcmVzdE5laWdoYm9ycyIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VCb29sZWFuIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJpb2RpY0JvdW5kYXJpZXMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQm9vbGVhbiIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IiIGVTdXBlclR5cGVzPSIjLy9MYXR0aWNlR3JhcGhHZW5lcmF0b3IiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4U2l6ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VJbnQiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjEwIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InlTaXplIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUludCIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMTAiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXJlYSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VEb3VibGUiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjIwMjUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhHZW5lcmF0b3IiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUjLy9VUkkiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWlncmF0aW9uUmF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VEb3VibGUiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjAuMSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3B1bGF0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iaHVtYW4iLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yIiBlU3VwZXJUeXBlcz0iIy8vTGF0dGljZUdyYXBoR2VuZXJhdG9yIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYW5ndWxhclN0ZXAiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FSW50IgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIxMCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXMiIGxvd2VyQm91bmQ9IjEiCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSI2MzcxLjAiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFqZWtOZXRHcmFwaEdlbmVyYXRvciIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoR2VuZXJhdG9yIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF0YUZpbGVfbmV0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFyZWEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIxMDAiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbUZhY3RvciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VJbnQiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjEwMDAiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29sQXJlYSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VJbnQiLz4KKyAgPC9lQ2xhc3NpZmllcnM+Cis8L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I1YjFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0NSBAQAorCisjIDxjb3B5cmlnaHQ+CisjIDwvY29weXJpZ2h0PgorIworIyAkSWQkCisKK3BsdWdpbk5hbWUgPSBHcmFwaGdlbmVyYXRvciBNb2RlbAorcHJvdmlkZXJOYW1lID0gd3d3LmV4YW1wbGUub3JnCitfVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQorX1VJX0NyZWF0ZUNoaWxkX3RleHQyID0gezF9IHswfQorX1VJX0NyZWF0ZUNoaWxkX3RleHQzID0gezF9CitfVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IENyZWF0ZSBOZXcgezB9IFVuZGVyIHsxfSBGZWF0dXJlCitfVUlfQ3JlYXRlQ2hpbGRfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgY2hpbGQgb2YgdHlwZSB7MH0gZm9yIHRoZSB7MX0gZmVhdHVyZSBvZiB0aGUgc2VsZWN0ZWQgezJ9LgorX1VJX0NyZWF0ZVNpYmxpbmdfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgc2libGluZyBvZiB0eXBlIHswfSBmb3IgdGhlIHNlbGVjdGVkIHsyfSwgdW5kZXIgdGhlIHsxfSBmZWF0dXJlIG9mIHRoZWlyIHBhcmVudC4KK19VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24gPSBUaGUgezB9IG9mIHRoZSB7MX0KK19VSV9HcmFwaEdlbmVyYXRvcl90eXBlID0gR3JhcGggR2VuZXJhdG9yCitfVUlfTGF0dGljZUdyYXBoR2VuZXJhdG9yX3R5cGUgPSBMYXR0aWNlIEdyYXBoIEdlbmVyYXRvcgorX1VJX1NxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcl90eXBlID0gU3F1YXJlIExhdHRpY2UgR3JhcGggR2VuZXJhdG9yCitfVUlfVW5rbm93bl90eXBlID0gT2JqZWN0CitfVUlfVW5rbm93bl9kYXRhdHlwZT0gVmFsdWUKK19VSV9MYXR0aWNlR3JhcGhHZW5lcmF0b3JfeFNpemVfZmVhdHVyZSA9IFhTaXplCitfVUlfTGF0dGljZUdyYXBoR2VuZXJhdG9yX3lTaXplX2ZlYXR1cmUgPSBZU2l6ZQorX1VJX0xhdHRpY2VHcmFwaEdlbmVyYXRvcl91c2VOZWFyZXN0TmVpZ2hib3JzX2ZlYXR1cmUgPSBVc2UgTmVhcmVzdCBOZWlnaGJvcnMKK19VSV9MYXR0aWNlR3JhcGhHZW5lcmF0b3JfdXNlTmV4dE5lYXJlc3ROZWlnaGJvcnNfZmVhdHVyZSA9IFVzZSBOZXh0IE5lYXJlc3QgTmVpZ2hib3JzCitfVUlfTGF0dGljZUdyYXBoR2VuZXJhdG9yX3BlcmlvZGljQm91bmRhcmllc19mZWF0dXJlID0gUGVyaW9kaWMgQm91bmRhcmllcworX1VJX1Vua25vd25fZmVhdHVyZSA9IFVuc3BlY2lmaWVkCitfVUlfU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yX2FyZWFfZmVhdHVyZSA9IEFyZWEKK19VSV9NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JfdHlwZSA9IE1pZ3JhdGlvbiBFZGdlIEdyYXBoIEdlbmVyYXRvcgorX1VJX01pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcl9sb2NhdGlvbl9mZWF0dXJlID0gTG9jYXRpb24KK19VSV9NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JfbWlncmF0aW9uUmF0ZV9mZWF0dXJlID0gTWlncmF0aW9uIFJhdGUKK19VSV9NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JfcG9wdWxhdGlvbl9mZWF0dXJlID0gUG9wdWxhdGlvbgorX1VJX1BsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcl90eXBlID0gUGxhdGUgQ2FycmVlIEdsb2JlIEdyYXBoIEdlbmVyYXRvcgorX1VJX1BsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcl9hbmd1bGFyU3RlcF9mZWF0dXJlID0gQW5ndWxhciBTdGVwCitfVUlfUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yX3VzZU5lYXJlc3ROZWlnaGJvcnNfZmVhdHVyZSA9IFVzZSBOZWFyZXN0IE5laWdoYm9ycworX1VJX1BsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcl91c2VOZXh0TmVhcmVzdE5laWdoYm9yc19mZWF0dXJlID0gVXNlIE5leHQgTmVhcmVzdCBOZWlnaGJvcnMKK19VSV9TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JfeFNpemVfZmVhdHVyZSA9IFhTaXplCitfVUlfU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yX3lTaXplX2ZlYXR1cmUgPSBZU2l6ZQorX1VJX1BsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcl9hcmVhX2ZlYXR1cmUgPSBBcmVhCitfVUlfTGF0dGljZUdyYXBoR2VuZXJhdG9yX2FyZWFfZmVhdHVyZSA9IEFyZWEKK19VSV9QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JfcmFkaXVzX2ZlYXR1cmUgPSBSYWRpdXMKK19VSV9QYWpla05ldEdyYXBoR2VuZXJhdG9yX3R5cGUgPSBQYWplayBOZXQgR3JhcGggR2VuZXJhdG9yCitfVUlfUGFqZWtOZXRHcmFwaEdlbmVyYXRvcl9kYXRhRmlsZV9uZXRfZmVhdHVyZSA9IERhdGEgRmlsZSBuZXQKK19VSV9QYWpla05ldEdyYXBoR2VuZXJhdG9yX2FyZWFfZmVhdHVyZSA9IEFyZWEKK19VSV9QYWpla05ldEdyYXBoR2VuZXJhdG9yX3pvb21GYWN0b3JfZmVhdHVyZSA9IFpvb20gRmFjdG9yCitfVUlfUGFqZWtOZXRHcmFwaEdlbmVyYXRvcl9jb2xBcmVhX2ZlYXR1cmUgPSBDb2wgQXJlYQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhZWRlNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3BsdWdpbi54bWwKQEAgLTAsMCArMSw2OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjQiPz4KKzxwbHVnaW4+CisJICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJncmFwaGdlbmVyYXRvciIgbmFtZT0iJUVQX0Rpc2Vhc2VfTW9kZWwiIHNjaGVtYT0ic2NoZW1hL2dyYXBoZ2VuZXJhdG9yLmV4c2QiLz4KKyAKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Lml0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3JpZXMiPgorICAgIDxmYWN0b3J5IAorICAgICAgIHVyaSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL2dyYXBoZ2VuZXJhdG9ycy5lY29yZSIgCisgICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMucHJvdmlkZXIuR3JhcGhnZW5lcmF0b3JzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiIAorICAgICAgIHN1cHBvcnRlZFR5cGVzID0gCisgICAgICAgICAib3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIKKyAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIKKyAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIKKyAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIKKyAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlIiAvPgorICA8L2V4dGVuc2lvbj4KKyAKKyAJIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmdyYXBoZ2VuZXJhdG9yIj4KKyAgICAgPGNsYXNzZGVmCisgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLlNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvckltcGwiPgorICAgICA8L2NsYXNzZGVmPgorICAgICA8ZHVibGluX2NvcmUKKyAgICAgICAgICAgY3JlYXRvcj0iJWRjX2NyZWF0b3JfZWRsdW5kIgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWRjX2Rlc2NfTGF0dGljZSIKKyAgICAgICAgICAgaWRlbnRpZmllcj0ic3F1YXJlIgorICAgICAgICAgICB0aXRsZT0iJWRjX2Rlc2NfTGF0dGljZSI+CisgICAgIDwvZHVibGluX2NvcmU+CisgIDwvZXh0ZW5zaW9uPgorICAKKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuZ3JhcGhnZW5lcmF0b3IiPgorICAgICA8Y2xhc3NkZWYKKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9ySW1wbCI+CisgICAgIDwvY2xhc3NkZWY+CisgICAgIDxkdWJsaW5fY29yZQorICAgICAgICAgICBjcmVhdG9yPSIlZGNfY3JlYXRvcl9rYXVmbWFuIgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWRjX2Rlc2NfR2xvYmUiCisgICAgICAgICAgIGlkZW50aWZpZXI9Imdsb2JlIgorICAgICAgICAgICB0aXRsZT0iJWRjX2Rlc2NfTGF0dGljZSI+CisgICAgIDwvZHVibGluX2NvcmU+CisgIDwvZXh0ZW5zaW9uPgorICAKKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuZ3JhcGhnZW5lcmF0b3IiPgorICAgICA8Y2xhc3NkZWYKKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9ySW1wbCI+CisgICAgIDwvY2xhc3NkZWY+CisgICAgIDxkdWJsaW5fY29yZQorICAgICAgICAgICBjcmVhdG9yPSIlZGNfY3JlYXRvcl9lZGx1bmQiCisgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlZGNfZGVzY19NaWdyYXRpb24iCisgICAgICAgICAgIGlkZW50aWZpZXI9Im1pZ3JhdGlvbiIKKyAgICAgICAgICAgdGl0bGU9IiVkY19kZXNjX01pZ3JhdGlvbiI+CisgICAgIDwvZHVibGluX2NvcmU+CisgIDwvZXh0ZW5zaW9uPgorICAKKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5ncmFwaGdlbmVyYXRvciI+CisgICAgICAgIDxjbGFzc2RlZgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuUGFqZWtOZXRHcmFwaEdlbmVyYXRvckltcGwiPgorICAgICAgICA8L2NsYXNzZGVmPgorICAgICAgICA8ZHVibGluX2NvcmUKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlZGNfZGVzY19QYWplayIKKyAgICAgICAgICAgIGlkZW50aWZpZXI9InBhamVrIgorICAgICAgICAgICAgdGl0bGU9IiVkY19kZXNjX1BhamVrIj4KKyAgICAgICAgPC9kdWJsaW5fY29yZT4KKyAgICA8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zY2hlbWEvZ3JhcGhnZW5lcmF0b3IuZXhzZCBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NjaGVtYS9ncmFwaGdlbmVyYXRvci5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YjNjYTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zY2hlbWEvZ3JhcGhnZW5lcmF0b3IuZXhzZApAQCAtMCwwICsxLDEwNSBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Cis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzIiBpZD0iZ3JhcGhnZW5lcmF0b3IiIG5hbWU9IlNURU0gR3JhcGggR2VuZXJhdG9yIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIG5ldyB3YXlzIG9mIGltcG9ydGluZyBncmFwaHMgaW50byBTVEVNCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc2NoZW1hL2R1Ymxpbl9jb3JlLmV4c2QiLz4KKworICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KKyAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+CisgICAgICAgICA8L2FwcGluZm8+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNsYXNzZGVmIi8+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImR1Ymxpbl9jb3JlIi8+CisgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcGluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9ImNsYXNzZGVmIj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLkdyYXBoR2VuZXJhdG9ySW1wbDpvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaEdlbmVyYXRvciIvPgorICAgICAgICAgICAgICAgPC9hcHBpbmZvPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAxLjAxCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIG5ldyB3YXlzIG9mIGltcG9ydGluZyBncmFwaHMgaW50byBTVEVNCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9Db25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTQ3MGUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnM7CisKKworcHVibGljIGludGVyZmFjZSBDb25zdGFudHMgeworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGV4dGVuc2lvbiBwb2ludCBpZCBmb3IgdGhlICJncmFwaCBnZW5lcmF0b3IiIGV4dGVuc2lvbiBwb2ludC4gCisJICoge0B2YWx1ZX0KKwkgKi8KKwlTdHJpbmcgSURfR1JBUEhfR0VORVJBVE9SX0VYVEVOU0lPTl9QT0lOVCA9IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHMuSURfUk9PVAorCSsgIi5ncmFwaGdlbmVyYXRvcnMuZ3JhcGhnZW5lcmF0b3IiOworCisJU3RyaW5nIEdSQVBIX0dFTkVSQVRPUl9FTEVNRU5UID0gImNsYXNzZGVmIjsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9HcmFwaEdlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL0dyYXBoR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3MjMyYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9HcmFwaEdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CisKKy8qKgorCisqIFRoaXMgaW50ZXJmYWNlIGlzIGFuIEVNRiBNb2RlbC4KKworKgorCisqIEBtb2RlbAorCisqLworcHVibGljIGludGVyZmFjZSBHcmFwaEdlbmVyYXRvciBleHRlbmRzIElkZW50aWZpYWJsZSB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBtb2RlbCBraW5kPSJvcGVyYXRpb24iCisJICogQGdlbmVyYXRlZAorCSAqLworCUdyYXBoIGdldEdyYXBoKCk7CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9HcmFwaGdlbmVyYXRvcnNGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvR3JhcGhnZW5lcmF0b3JzRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNTJhNTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvR3JhcGhnZW5lcmF0b3JzRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZCQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9yczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgR3JhcGhnZW5lcmF0b3JzRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUdyYXBoZ2VuZXJhdG9yc0ZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5HcmFwaGdlbmVyYXRvcnNGYWN0b3J5SW1wbC5pbml0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNxdWFyZSBMYXR0aWNlIEdyYXBoIEdlbmVyYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3F1YXJlIExhdHRpY2UgR3JhcGggR2VuZXJhdG9yPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IgY3JlYXRlU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1pZ3JhdGlvbiBFZGdlIEdyYXBoIEdlbmVyYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWlncmF0aW9uIEVkZ2UgR3JhcGggR2VuZXJhdG9yPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IgY3JlYXRlTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBsYXRlIENhcnJlZSBHbG9iZSBHcmFwaCBHZW5lcmF0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBsYXRlIENhcnJlZSBHbG9iZSBHcmFwaCBHZW5lcmF0b3I8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvciBjcmVhdGVQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFqZWsgTmV0IEdyYXBoIEdlbmVyYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFqZWsgTmV0IEdyYXBoIEdlbmVyYXRvcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGFqZWtOZXRHcmFwaEdlbmVyYXRvciBjcmVhdGVQYWpla05ldEdyYXBoR2VuZXJhdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogQGdlbmVyYXRlZAorCSAqLworCUdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UgZ2V0R3JhcGhnZW5lcmF0b3JzUGFja2FnZSgpOworCit9IC8vR3JhcGhnZW5lcmF0b3JzRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL0dyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9HcmFwaGdlbmVyYXRvcnNQYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0ZjQxNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9HcmFwaGdlbmVyYXRvcnNQYWNrYWdlLmphdmEKQEAgLTAsMCArMSw5NTQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnM7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50CisgKiA8dWw+CisgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorICogPC91bD4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNGYWN0b3J5CisgKiBAbW9kZWwga2luZD0icGFja2FnZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgeworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOQU1FID0gImdyYXBoZ2VuZXJhdG9ycyI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvZ3JhcGhnZW5lcmF0b3JzLmVjb3JlIjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzIjsKKworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJR3JhcGhnZW5lcmF0b3JzUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2VJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5HcmFwaEdlbmVyYXRvckltcGwgPGVtPkdyYXBoIEdlbmVyYXRvcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuR3JhcGhHZW5lcmF0b3JJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2VJbXBsI2dldEdyYXBoR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEdSQVBIX0dFTkVSQVRPUiA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR1JBUEhfR0VORVJBVE9SX19VUkkgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR1JBUEhfR0VORVJBVE9SX19UWVBFX1VSSSA9IENvbW1vblBhY2thZ2UuSURFTlRJRklBQkxFX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdSQVBIX0dFTkVSQVRPUl9fRFVCTElOX0NPUkUgPSBDb21tb25QYWNrYWdlLklERU5USUZJQUJMRV9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3JhcGggR2VuZXJhdG9yPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdSQVBIX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5JREVOVElGSUFCTEVfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuTGF0dGljZUdyYXBoR2VuZXJhdG9ySW1wbCA8ZW0+TGF0dGljZSBHcmFwaCBHZW5lcmF0b3I8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLkxhdHRpY2VHcmFwaEdlbmVyYXRvckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuR3JhcGhnZW5lcmF0b3JzUGFja2FnZUltcGwjZ2V0TGF0dGljZUdyYXBoR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IExBVFRJQ0VfR1JBUEhfR0VORVJBVE9SID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fVVJJID0gR1JBUEhfR0VORVJBVE9SX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fVFlQRV9VUkkgPSBHUkFQSF9HRU5FUkFUT1JfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX0RVQkxJTl9DT1JFID0gR1JBUEhfR0VORVJBVE9SX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2UgTmVhcmVzdCBOZWlnaGJvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fVVNFX05FQVJFU1RfTkVJR0hCT1JTID0gR1JBUEhfR0VORVJBVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZSBOZXh0IE5lYXJlc3QgTmVpZ2hib3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1VTRV9ORVhUX05FQVJFU1RfTkVJR0hCT1JTID0gR1JBUEhfR0VORVJBVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmlvZGljIEJvdW5kYXJpZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fUEVSSU9ESUNfQk9VTkRBUklFUyA9IEdSQVBIX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5MYXR0aWNlIEdyYXBoIEdlbmVyYXRvcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UID0gR1JBUEhfR0VORVJBVE9SX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLlNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvckltcGwgPGVtPlNxdWFyZSBMYXR0aWNlIEdyYXBoIEdlbmVyYXRvcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9ySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5HcmFwaGdlbmVyYXRvcnNQYWNrYWdlSW1wbCNnZXRTcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1VSSSA9IExBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1RZUEVfVVJJID0gTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19EVUJMSU5fQ09SRSA9IExBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2UgTmVhcmVzdCBOZWlnaGJvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1VTRV9ORUFSRVNUX05FSUdIQk9SUyA9IExBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19VU0VfTkVBUkVTVF9ORUlHSEJPUlM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlIE5leHQgTmVhcmVzdCBOZWlnaGJvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1VTRV9ORVhUX05FQVJFU1RfTkVJR0hCT1JTID0gTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1VTRV9ORVhUX05FQVJFU1RfTkVJR0hCT1JTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmlvZGljIEJvdW5kYXJpZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1BFUklPRElDX0JPVU5EQVJJRVMgPSBMQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fUEVSSU9ESUNfQk9VTkRBUklFUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNRVUFSRV9MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fWFNJWkUgPSBMQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5ZU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNRVUFSRV9MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fWVNJWkUgPSBMQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcmVhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19BUkVBID0gTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U3F1YXJlIExhdHRpY2UgR3JhcGggR2VuZXJhdG9yPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNRVUFSRV9MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UID0gTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9ySW1wbCA8ZW0+TWlncmF0aW9uIEVkZ2UgR3JhcGggR2VuZXJhdG9yPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2VJbXBsI2dldE1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBNSUdSQVRJT05fRURHRV9HUkFQSF9HRU5FUkFUT1IgPSAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1JR1JBVElPTl9FREdFX0dSQVBIX0dFTkVSQVRPUl9fVVJJID0gR1JBUEhfR0VORVJBVE9SX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNSUdSQVRJT05fRURHRV9HUkFQSF9HRU5FUkFUT1JfX1RZUEVfVVJJID0gR1JBUEhfR0VORVJBVE9SX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1JR1JBVElPTl9FREdFX0dSQVBIX0dFTkVSQVRPUl9fRFVCTElOX0NPUkUgPSBHUkFQSF9HRU5FUkFUT1JfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUlHUkFUSU9OX0VER0VfR1JBUEhfR0VORVJBVE9SX19MT0NBVElPTiA9IEdSQVBIX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaWdyYXRpb24gUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1JR1JBVElPTl9FREdFX0dSQVBIX0dFTkVSQVRPUl9fTUlHUkFUSU9OX1JBVEUgPSBHUkFQSF9HRU5FUkFUT1JfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1JR1JBVElPTl9FREdFX0dSQVBIX0dFTkVSQVRPUl9fUE9QVUxBVElPTiA9IEdSQVBIX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NaWdyYXRpb24gRWRnZSBHcmFwaCBHZW5lcmF0b3I8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUlHUkFUSU9OX0VER0VfR1JBUEhfR0VORVJBVE9SX0ZFQVRVUkVfQ09VTlQgPSBHUkFQSF9HRU5FUkFUT1JfRkVBVFVSRV9DT1VOVCArIDM7CisKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JJbXBsIDxlbT5QbGF0ZSBDYXJyZWUgR2xvYmUgR3JhcGggR2VuZXJhdG9yPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2VJbXBsI2dldFBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBQTEFURV9DQVJSRUVfR0xPQkVfR1JBUEhfR0VORVJBVE9SID0gNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQTEFURV9DQVJSRUVfR0xPQkVfR1JBUEhfR0VORVJBVE9SX19VUkkgPSBMQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUExBVEVfQ0FSUkVFX0dMT0JFX0dSQVBIX0dFTkVSQVRPUl9fVFlQRV9VUkkgPSBMQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQTEFURV9DQVJSRUVfR0xPQkVfR1JBUEhfR0VORVJBVE9SX19EVUJMSU5fQ09SRSA9IExBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2UgTmVhcmVzdCBOZWlnaGJvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQTEFURV9DQVJSRUVfR0xPQkVfR1JBUEhfR0VORVJBVE9SX19VU0VfTkVBUkVTVF9ORUlHSEJPUlMgPSBMQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fVVNFX05FQVJFU1RfTkVJR0hCT1JTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZSBOZXh0IE5lYXJlc3QgTmVpZ2hib3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUExBVEVfQ0FSUkVFX0dMT0JFX0dSQVBIX0dFTkVSQVRPUl9fVVNFX05FWFRfTkVBUkVTVF9ORUlHSEJPUlMgPSBMQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fVVNFX05FWFRfTkVBUkVTVF9ORUlHSEJPUlM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyaW9kaWMgQm91bmRhcmllczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBMQVRFX0NBUlJFRV9HTE9CRV9HUkFQSF9HRU5FUkFUT1JfX1BFUklPRElDX0JPVU5EQVJJRVMgPSBMQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fUEVSSU9ESUNfQk9VTkRBUklFUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bbmd1bGFyIFN0ZXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQTEFURV9DQVJSRUVfR0xPQkVfR1JBUEhfR0VORVJBVE9SX19BTkdVTEFSX1NURVAgPSBMQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYWRpdXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQTEFURV9DQVJSRUVfR0xPQkVfR1JBUEhfR0VORVJBVE9SX19SQURJVVMgPSBMQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QbGF0ZSBDYXJyZWUgR2xvYmUgR3JhcGggR2VuZXJhdG9yPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBMQVRFX0NBUlJFRV9HTE9CRV9HUkFQSF9HRU5FUkFUT1JfRkVBVFVSRV9DT1VOVCA9IExBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX0ZFQVRVUkVfQ09VTlQgKyAyOworCisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuUGFqZWtOZXRHcmFwaEdlbmVyYXRvckltcGwgPGVtPlBhamVrIE5ldCBHcmFwaCBHZW5lcmF0b3I8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLlBhamVrTmV0R3JhcGhHZW5lcmF0b3JJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2VJbXBsI2dldFBhamVrTmV0R3JhcGhHZW5lcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUEFKRUtfTkVUX0dSQVBIX0dFTkVSQVRPUiA9IDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFKRUtfTkVUX0dSQVBIX0dFTkVSQVRPUl9fVVJJID0gR1JBUEhfR0VORVJBVE9SX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SX19UWVBFX1VSSSA9IEdSQVBIX0dFTkVSQVRPUl9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SX19EVUJMSU5fQ09SRSA9IEdSQVBIX0dFTkVSQVRPUl9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YSBGaWxlIG5ldDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX0RBVEFfRklMRV9ORVQgPSBHUkFQSF9HRU5FUkFUT1JfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXJlYTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX0FSRUEgPSBHUkFQSF9HRU5FUkFUT1JfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Wm9vbSBGYWN0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SX19aT09NX0ZBQ1RPUiA9IEdSQVBIX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2wgQXJlYTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX0NPTF9BUkVBID0gR1JBUEhfR0VORVJBVE9SX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhamVrIE5ldCBHcmFwaCBHZW5lcmF0b3I8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFKRUtfTkVUX0dSQVBIX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UID0gR1JBUEhfR0VORVJBVE9SX0ZFQVRVUkVfQ09VTlQgKyA0OworCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaEdlbmVyYXRvciA8ZW0+R3JhcGggR2VuZXJhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkdyYXBoIEdlbmVyYXRvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkdyYXBoR2VuZXJhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRHcmFwaEdlbmVyYXRvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuTGF0dGljZUdyYXBoR2VuZXJhdG9yIDxlbT5MYXR0aWNlIEdyYXBoIEdlbmVyYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5MYXR0aWNlIEdyYXBoIEdlbmVyYXRvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkxhdHRpY2VHcmFwaEdlbmVyYXRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0TGF0dGljZUdyYXBoR2VuZXJhdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkxhdHRpY2VHcmFwaEdlbmVyYXRvciNpc1VzZU5lYXJlc3ROZWlnaGJvcnMgPGVtPlVzZSBOZWFyZXN0IE5laWdoYm9yczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzZSBOZWFyZXN0IE5laWdoYm9yczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkxhdHRpY2VHcmFwaEdlbmVyYXRvciNpc1VzZU5lYXJlc3ROZWlnaGJvcnMoKQorCSAqIEBzZWUgI2dldExhdHRpY2VHcmFwaEdlbmVyYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0TGF0dGljZUdyYXBoR2VuZXJhdG9yX1VzZU5lYXJlc3ROZWlnaGJvcnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuTGF0dGljZUdyYXBoR2VuZXJhdG9yI2lzVXNlTmV4dE5lYXJlc3ROZWlnaGJvcnMgPGVtPlVzZSBOZXh0IE5lYXJlc3QgTmVpZ2hib3JzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlIE5leHQgTmVhcmVzdCBOZWlnaGJvcnM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5MYXR0aWNlR3JhcGhHZW5lcmF0b3IjaXNVc2VOZXh0TmVhcmVzdE5laWdoYm9ycygpCisJICogQHNlZSAjZ2V0TGF0dGljZUdyYXBoR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRMYXR0aWNlR3JhcGhHZW5lcmF0b3JfVXNlTmV4dE5lYXJlc3ROZWlnaGJvcnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuTGF0dGljZUdyYXBoR2VuZXJhdG9yI2lzUGVyaW9kaWNCb3VuZGFyaWVzIDxlbT5QZXJpb2RpYyBCb3VuZGFyaWVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVyaW9kaWMgQm91bmRhcmllczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkxhdHRpY2VHcmFwaEdlbmVyYXRvciNpc1BlcmlvZGljQm91bmRhcmllcygpCisJICogQHNlZSAjZ2V0TGF0dGljZUdyYXBoR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRMYXR0aWNlR3JhcGhHZW5lcmF0b3JfUGVyaW9kaWNCb3VuZGFyaWVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IgPGVtPlNxdWFyZSBMYXR0aWNlIEdyYXBoIEdlbmVyYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TcXVhcmUgTGF0dGljZSBHcmFwaCBHZW5lcmF0b3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IjZ2V0WFNpemUgPGVtPlhTaXplPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WFNpemU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IjZ2V0WFNpemUoKQorCSAqIEBzZWUgI2dldFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yX1hTaXplKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvciNnZXRZU2l6ZSA8ZW0+WVNpemU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5ZU2l6ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvciNnZXRZU2l6ZSgpCisJICogQHNlZSAjZ2V0U3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JfWVNpemUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yI2dldEFyZWEgPGVtPkFyZWE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BcmVhPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yI2dldEFyZWEoKQorCSAqIEBzZWUgI2dldFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yX0FyZWEoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLk1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvciA8ZW0+TWlncmF0aW9uIEVkZ2UgR3JhcGggR2VuZXJhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1pZ3JhdGlvbiBFZGdlIEdyYXBoIEdlbmVyYXRvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLk1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0TWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLk1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvciNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLk1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvciNnZXRMb2NhdGlvbigpCisJICogQHNlZSAjZ2V0TWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JfTG9jYXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yI2dldE1pZ3JhdGlvblJhdGUgPGVtPk1pZ3JhdGlvbiBSYXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWlncmF0aW9uIFJhdGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IjZ2V0TWlncmF0aW9uUmF0ZSgpCisJICogQHNlZSAjZ2V0TWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JfTWlncmF0aW9uUmF0ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IjZ2V0UG9wdWxhdGlvbiA8ZW0+UG9wdWxhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvcHVsYXRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IjZ2V0UG9wdWxhdGlvbigpCisJICogQHNlZSAjZ2V0TWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JfUG9wdWxhdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yIDxlbT5QbGF0ZSBDYXJyZWUgR2xvYmUgR3JhcGggR2VuZXJhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBsYXRlIENhcnJlZSBHbG9iZSBHcmFwaCBHZW5lcmF0b3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IjZ2V0QW5ndWxhclN0ZXAgPGVtPkFuZ3VsYXIgU3RlcDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFuZ3VsYXIgU3RlcDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvciNnZXRBbmd1bGFyU3RlcCgpCisJICogQHNlZSAjZ2V0UGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JfQW5ndWxhclN0ZXAoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yI2dldFJhZGl1cyA8ZW0+UmFkaXVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmFkaXVzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yI2dldFJhZGl1cygpCisJICogQHNlZSAjZ2V0UGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JfUmFkaXVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5QYWpla05ldEdyYXBoR2VuZXJhdG9yIDxlbT5QYWplayBOZXQgR3JhcGggR2VuZXJhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhamVrIE5ldCBHcmFwaCBHZW5lcmF0b3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5QYWpla05ldEdyYXBoR2VuZXJhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRQYWpla05ldEdyYXBoR2VuZXJhdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlBhamVrTmV0R3JhcGhHZW5lcmF0b3IjZ2V0RGF0YUZpbGVfbmV0IDxlbT5EYXRhIEZpbGUgbmV0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF0YSBGaWxlIG5ldDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlBhamVrTmV0R3JhcGhHZW5lcmF0b3IjZ2V0RGF0YUZpbGVfbmV0KCkKKwkgKiBAc2VlICNnZXRQYWpla05ldEdyYXBoR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRQYWpla05ldEdyYXBoR2VuZXJhdG9yX0RhdGFGaWxlX25ldCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5QYWpla05ldEdyYXBoR2VuZXJhdG9yI2dldEFyZWEgPGVtPkFyZWE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BcmVhPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuUGFqZWtOZXRHcmFwaEdlbmVyYXRvciNnZXRBcmVhKCkKKwkgKiBAc2VlICNnZXRQYWpla05ldEdyYXBoR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRQYWpla05ldEdyYXBoR2VuZXJhdG9yX0FyZWEoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuUGFqZWtOZXRHcmFwaEdlbmVyYXRvciNnZXRab29tRmFjdG9yIDxlbT5ab29tIEZhY3RvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlpvb20gRmFjdG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuUGFqZWtOZXRHcmFwaEdlbmVyYXRvciNnZXRab29tRmFjdG9yKCkKKwkgKiBAc2VlICNnZXRQYWpla05ldEdyYXBoR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRQYWpla05ldEdyYXBoR2VuZXJhdG9yX1pvb21GYWN0b3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuUGFqZWtOZXRHcmFwaEdlbmVyYXRvciNnZXRDb2xBcmVhIDxlbT5Db2wgQXJlYTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbCBBcmVhPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuUGFqZWtOZXRHcmFwaEdlbmVyYXRvciNnZXRDb2xBcmVhKCkKKwkgKiBAc2VlICNnZXRQYWpla05ldEdyYXBoR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRQYWpla05ldEdyYXBoR2VuZXJhdG9yX0NvbEFyZWEoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogQGdlbmVyYXRlZAorCSAqLworCUdyYXBoZ2VuZXJhdG9yc0ZhY3RvcnkgZ2V0R3JhcGhnZW5lcmF0b3JzRmFjdG9yeSgpOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50CisJICogPHVsPgorCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisJICogPC91bD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50ZXJmYWNlIExpdGVyYWxzIHsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLkdyYXBoR2VuZXJhdG9ySW1wbCA8ZW0+R3JhcGggR2VuZXJhdG9yPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5HcmFwaEdlbmVyYXRvckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2VJbXBsI2dldEdyYXBoR2VuZXJhdG9yKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIEdSQVBIX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRHcmFwaEdlbmVyYXRvcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5MYXR0aWNlR3JhcGhHZW5lcmF0b3JJbXBsIDxlbT5MYXR0aWNlIEdyYXBoIEdlbmVyYXRvcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuTGF0dGljZUdyYXBoR2VuZXJhdG9ySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuR3JhcGhnZW5lcmF0b3JzUGFja2FnZUltcGwjZ2V0TGF0dGljZUdyYXBoR2VuZXJhdG9yKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIExBVFRJQ0VfR1JBUEhfR0VORVJBVE9SID0gZUlOU1RBTkNFLmdldExhdHRpY2VHcmFwaEdlbmVyYXRvcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNlIE5lYXJlc3QgTmVpZ2hib3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1VTRV9ORUFSRVNUX05FSUdIQk9SUyA9IGVJTlNUQU5DRS5nZXRMYXR0aWNlR3JhcGhHZW5lcmF0b3JfVXNlTmVhcmVzdE5laWdoYm9ycygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNlIE5leHQgTmVhcmVzdCBOZWlnaGJvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBMQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fVVNFX05FWFRfTkVBUkVTVF9ORUlHSEJPUlMgPSBlSU5TVEFOQ0UuZ2V0TGF0dGljZUdyYXBoR2VuZXJhdG9yX1VzZU5leHROZWFyZXN0TmVpZ2hib3JzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJpb2RpYyBCb3VuZGFyaWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1BFUklPRElDX0JPVU5EQVJJRVMgPSBlSU5TVEFOQ0UuZ2V0TGF0dGljZUdyYXBoR2VuZXJhdG9yX1BlcmlvZGljQm91bmRhcmllcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JJbXBsIDxlbT5TcXVhcmUgTGF0dGljZSBHcmFwaCBHZW5lcmF0b3I8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLlNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2VJbXBsI2dldFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1IgPSBlSU5TVEFOQ0UuZ2V0U3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNRVUFSRV9MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fWFNJWkUgPSBlSU5TVEFOQ0UuZ2V0U3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yX1hTaXplKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5ZU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNRVUFSRV9MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fWVNJWkUgPSBlSU5TVEFOQ0UuZ2V0U3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yX1lTaXplKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BcmVhPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19BUkVBID0gZUlOU1RBTkNFLmdldFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcl9BcmVhKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLk1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvckltcGwgPGVtPk1pZ3JhdGlvbiBFZGdlIEdyYXBoIEdlbmVyYXRvcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9ySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuR3JhcGhnZW5lcmF0b3JzUGFja2FnZUltcGwjZ2V0TWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIE1JR1JBVElPTl9FREdFX0dSQVBIX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgTUlHUkFUSU9OX0VER0VfR1JBUEhfR0VORVJBVE9SX19MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXRNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JfTG9jYXRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1pZ3JhdGlvbiBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgTUlHUkFUSU9OX0VER0VfR1JBUEhfR0VORVJBVE9SX19NSUdSQVRJT05fUkFURSA9IGVJTlNUQU5DRS5nZXRNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JfTWlncmF0aW9uUmF0ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIE1JR1JBVElPTl9FREdFX0dSQVBIX0dFTkVSQVRPUl9fUE9QVUxBVElPTiA9IGVJTlNUQU5DRS5nZXRNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JfUG9wdWxhdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JJbXBsIDxlbT5QbGF0ZSBDYXJyZWUgR2xvYmUgR3JhcGggR2VuZXJhdG9yPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5HcmFwaGdlbmVyYXRvcnNQYWNrYWdlSW1wbCNnZXRQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUExBVEVfQ0FSUkVFX0dMT0JFX0dSQVBIX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFuZ3VsYXIgU3RlcDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBMQVRFX0NBUlJFRV9HTE9CRV9HUkFQSF9HRU5FUkFUT1JfX0FOR1VMQVJfU1RFUCA9IGVJTlNUQU5DRS5nZXRQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JfQW5ndWxhclN0ZXAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJhZGl1czwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBMQVRFX0NBUlJFRV9HTE9CRV9HUkFQSF9HRU5FUkFUT1JfX1JBRElVUyA9IGVJTlNUQU5DRS5nZXRQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JfUmFkaXVzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLlBhamVrTmV0R3JhcGhHZW5lcmF0b3JJbXBsIDxlbT5QYWplayBOZXQgR3JhcGggR2VuZXJhdG9yPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5QYWpla05ldEdyYXBoR2VuZXJhdG9ySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuR3JhcGhnZW5lcmF0b3JzUGFja2FnZUltcGwjZ2V0UGFqZWtOZXRHcmFwaEdlbmVyYXRvcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBQQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SID0gZUlOU1RBTkNFLmdldFBhamVrTmV0R3JhcGhHZW5lcmF0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRhdGEgRmlsZSBuZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBQQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SX19EQVRBX0ZJTEVfTkVUID0gZUlOU1RBTkNFLmdldFBhamVrTmV0R3JhcGhHZW5lcmF0b3JfRGF0YUZpbGVfbmV0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BcmVhPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUEFKRUtfTkVUX0dSQVBIX0dFTkVSQVRPUl9fQVJFQSA9IGVJTlNUQU5DRS5nZXRQYWpla05ldEdyYXBoR2VuZXJhdG9yX0FyZWEoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlpvb20gRmFjdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUEFKRUtfTkVUX0dSQVBIX0dFTkVSQVRPUl9fWk9PTV9GQUNUT1IgPSBlSU5TVEFOQ0UuZ2V0UGFqZWtOZXRHcmFwaEdlbmVyYXRvcl9ab29tRmFjdG9yKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db2wgQXJlYTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX0NPTF9BUkVBID0gZUlOU1RBTkNFLmdldFBhamVrTmV0R3JhcGhHZW5lcmF0b3JfQ29sQXJlYSgpOworCisJfQorCit9IC8vR3JhcGhnZW5lcmF0b3JzUGFja2FnZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9MYXR0aWNlR3JhcGhHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9MYXR0aWNlR3JhcGhHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDg5MzBhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL0xhdHRpY2VHcmFwaEdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnM7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGF0dGljZSBHcmFwaCBHZW5lcmF0b3I8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuTGF0dGljZUdyYXBoR2VuZXJhdG9yI2lzVXNlTmVhcmVzdE5laWdoYm9ycyA8ZW0+VXNlIE5lYXJlc3QgTmVpZ2hib3JzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5MYXR0aWNlR3JhcGhHZW5lcmF0b3IjaXNVc2VOZXh0TmVhcmVzdE5laWdoYm9ycyA8ZW0+VXNlIE5leHQgTmVhcmVzdCBOZWlnaGJvcnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkxhdHRpY2VHcmFwaEdlbmVyYXRvciNpc1BlcmlvZGljQm91bmRhcmllcyA8ZW0+UGVyaW9kaWMgQm91bmRhcmllczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuR3JhcGhnZW5lcmF0b3JzUGFja2FnZSNnZXRMYXR0aWNlR3JhcGhHZW5lcmF0b3IoKQorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIExhdHRpY2VHcmFwaEdlbmVyYXRvciBleHRlbmRzIEdyYXBoR2VuZXJhdG9yIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2UgTmVhcmVzdCBOZWlnaGJvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXNlIE5lYXJlc3QgTmVpZ2hib3JzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzZSBOZWFyZXN0IE5laWdoYm9yczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VXNlTmVhcmVzdE5laWdoYm9ycyhib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuR3JhcGhnZW5lcmF0b3JzUGFja2FnZSNnZXRMYXR0aWNlR3JhcGhHZW5lcmF0b3JfVXNlTmVhcmVzdE5laWdoYm9ycygpCisJICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNVc2VOZWFyZXN0TmVpZ2hib3JzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5MYXR0aWNlR3JhcGhHZW5lcmF0b3IjaXNVc2VOZWFyZXN0TmVpZ2hib3JzIDxlbT5Vc2UgTmVhcmVzdCBOZWlnaGJvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVzZSBOZWFyZXN0IE5laWdoYm9yczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNVc2VOZWFyZXN0TmVpZ2hib3JzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRVc2VOZWFyZXN0TmVpZ2hib3JzKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXNlIE5leHQgTmVhcmVzdCBOZWlnaGJvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVzZSBOZXh0IE5lYXJlc3QgTmVpZ2hib3JzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzZSBOZXh0IE5lYXJlc3QgTmVpZ2hib3JzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRVc2VOZXh0TmVhcmVzdE5laWdoYm9ycyhib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuR3JhcGhnZW5lcmF0b3JzUGFja2FnZSNnZXRMYXR0aWNlR3JhcGhHZW5lcmF0b3JfVXNlTmV4dE5lYXJlc3ROZWlnaGJvcnMoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1VzZU5leHROZWFyZXN0TmVpZ2hib3JzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5MYXR0aWNlR3JhcGhHZW5lcmF0b3IjaXNVc2VOZXh0TmVhcmVzdE5laWdoYm9ycyA8ZW0+VXNlIE5leHQgTmVhcmVzdCBOZWlnaGJvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVzZSBOZXh0IE5lYXJlc3QgTmVpZ2hib3JzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1VzZU5leHROZWFyZXN0TmVpZ2hib3JzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRVc2VOZXh0TmVhcmVzdE5laWdoYm9ycyhib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmlvZGljIEJvdW5kYXJpZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyaW9kaWMgQm91bmRhcmllczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJpb2RpYyBCb3VuZGFyaWVzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRQZXJpb2RpY0JvdW5kYXJpZXMoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UjZ2V0TGF0dGljZUdyYXBoR2VuZXJhdG9yX1BlcmlvZGljQm91bmRhcmllcygpCisJICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNQZXJpb2RpY0JvdW5kYXJpZXMoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkxhdHRpY2VHcmFwaEdlbmVyYXRvciNpc1BlcmlvZGljQm91bmRhcmllcyA8ZW0+UGVyaW9kaWMgQm91bmRhcmllczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyaW9kaWMgQm91bmRhcmllczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNQZXJpb2RpY0JvdW5kYXJpZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFBlcmlvZGljQm91bmRhcmllcyhib29sZWFuIHZhbHVlKTsKKworfSAvLyBMYXR0aWNlR3JhcGhHZW5lcmF0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmM2YjJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL01pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NaWdyYXRpb24gRWRnZSBHcmFwaCBHZW5lcmF0b3I8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yI2dldE1pZ3JhdGlvblJhdGUgPGVtPk1pZ3JhdGlvbiBSYXRlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IjZ2V0UG9wdWxhdGlvbiA8ZW0+UG9wdWxhdGlvbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuR3JhcGhnZW5lcmF0b3JzUGFja2FnZSNnZXRNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yIGV4dGVuZHMgR3JhcGhHZW5lcmF0b3IgeworCQorCS8qKiAKKwkgKiBNaWdyYXRpb24gRWRnZSBUeXBlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlHUkFUSU9OX0VER0VfVFlQRT0iTWlncmF0aW9uIEVkZ2VzIjsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9jYXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldExvY2F0aW9uKFVSSSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UjZ2V0TWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yX0xvY2F0aW9uKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5VUkkiCisJICogQGdlbmVyYXRlZAorCSAqLworCVVSSSBnZXRMb2NhdGlvbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRMb2NhdGlvbihVUkkgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWlncmF0aW9uIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMC4xIjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NaWdyYXRpb24gUmF0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaWdyYXRpb24gUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TWlncmF0aW9uUmF0ZShkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNQYWNrYWdlI2dldE1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcl9NaWdyYXRpb25SYXRlKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMC4xIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0TWlncmF0aW9uUmF0ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yI2dldE1pZ3JhdGlvblJhdGUgPGVtPk1pZ3JhdGlvbiBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NaWdyYXRpb24gUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TWlncmF0aW9uUmF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TWlncmF0aW9uUmF0ZShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJodW1hbiI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3B1bGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRQb3B1bGF0aW9uKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UjZ2V0TWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yX1BvcHVsYXRpb24oKQorCSAqIEBtb2RlbCBkZWZhdWx0PSJodW1hbiIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldFBvcHVsYXRpb24oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLk1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvciNnZXRQb3B1bGF0aW9uIDxlbT5Qb3B1bGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3B1bGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRQb3B1bGF0aW9uKFN0cmluZyB2YWx1ZSk7CisKKwlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpOworCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcCk7CisJCit9IC8vIE1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL1BhamVrTmV0R3JhcGhHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9QYWpla05ldEdyYXBoR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcwZmE2MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9QYWpla05ldEdyYXBoR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnM7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorKg0KKyogQ29udHJpYnV0b3JzOg0KKyogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhamVrIE5ldCBHcmFwaCBHZW5lcmF0b3I8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuUGFqZWtOZXRHcmFwaEdlbmVyYXRvciNnZXREYXRhRmlsZV9uZXQgPGVtPkRhdGEgRmlsZSBuZXQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5QYWpla05ldEdyYXBoR2VuZXJhdG9yI2dldEFyZWEgPGVtPkFyZWE8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5QYWpla05ldEdyYXBoR2VuZXJhdG9yI2dldFpvb21GYWN0b3IgPGVtPlpvb20gRmFjdG9yPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuUGFqZWtOZXRHcmFwaEdlbmVyYXRvciNnZXRDb2xBcmVhIDxlbT5Db2wgQXJlYTwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UjZ2V0UGFqZWtOZXRHcmFwaEdlbmVyYXRvcigpDQorICogQG1vZGVsDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgUGFqZWtOZXRHcmFwaEdlbmVyYXRvciBleHRlbmRzIEdyYXBoR2VuZXJhdG9yIHsNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRhdGEgRmlsZSBuZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YSBGaWxlIG5ldDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YSBGaWxlIG5ldDwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldERhdGFGaWxlX25ldChTdHJpbmcpDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuR3JhcGhnZW5lcmF0b3JzUGFja2FnZSNnZXRQYWpla05ldEdyYXBoR2VuZXJhdG9yX0RhdGFGaWxlX25ldCgpDQorCSAqIEBtb2RlbCBkZWZhdWx0PSIiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBnZXREYXRhRmlsZV9uZXQoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlBhamVrTmV0R3JhcGhHZW5lcmF0b3IjZ2V0RGF0YUZpbGVfbmV0IDxlbT5EYXRhIEZpbGUgbmV0PC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhIEZpbGUgbmV0PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0RGF0YUZpbGVfbmV0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXREYXRhRmlsZV9uZXQoU3RyaW5nIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFyZWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjEwMCI8L2NvZGU+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXJlYTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXJlYTwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldEFyZWEoZG91YmxlKQ0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UjZ2V0UGFqZWtOZXRHcmFwaEdlbmVyYXRvcl9BcmVhKCkNCisJICogQG1vZGVsIGRlZmF1bHQ9IjEwMCINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJZG91YmxlIGdldEFyZWEoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlBhamVrTmV0R3JhcGhHZW5lcmF0b3IjZ2V0QXJlYSA8ZW0+QXJlYTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXJlYTwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2dldEFyZWEoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldEFyZWEoZG91YmxlIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlpvb20gRmFjdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIxMDAwIjwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5ab29tIEZhY3RvcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Wm9vbSBGYWN0b3I8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXRab29tRmFjdG9yKGludCkNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNQYWNrYWdlI2dldFBhamVrTmV0R3JhcGhHZW5lcmF0b3JfWm9vbUZhY3RvcigpDQorCSAqIEBtb2RlbCBkZWZhdWx0PSIxMDAwIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgZ2V0Wm9vbUZhY3RvcigpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuUGFqZWtOZXRHcmFwaEdlbmVyYXRvciNnZXRab29tRmFjdG9yIDxlbT5ab29tIEZhY3RvcjwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Wm9vbSBGYWN0b3I8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXRab29tRmFjdG9yKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRab29tRmFjdG9yKGludCB2YWx1ZSk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2wgQXJlYTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sIEFyZWE8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbCBBcmVhPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjc2V0Q29sQXJlYShpbnQpDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuR3JhcGhnZW5lcmF0b3JzUGFja2FnZSNnZXRQYWpla05ldEdyYXBoR2VuZXJhdG9yX0NvbEFyZWEoKQ0KKwkgKiBAbW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IGdldENvbEFyZWEoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlBhamVrTmV0R3JhcGhHZW5lcmF0b3IjZ2V0Q29sQXJlYSA8ZW0+Q29sIEFyZWE8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbCBBcmVhPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0Q29sQXJlYSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0Q29sQXJlYShpbnQgdmFsdWUpOw0KKw0KK30gLy8gUGFqZWtOZXRHcmFwaEdlbmVyYXRvcg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWM5ZTNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL1BsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZCQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9yczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QbGF0ZSBDYXJyZWUgR2xvYmUgR3JhcGggR2VuZXJhdG9yPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvciNnZXRBbmd1bGFyU3RlcCA8ZW0+QW5ndWxhciBTdGVwPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IjZ2V0UmFkaXVzIDxlbT5SYWRpdXM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UjZ2V0UGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvciBleHRlbmRzIExhdHRpY2VHcmFwaEdlbmVyYXRvciB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QW5ndWxhciBTdGVwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjEwIjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Bbmd1bGFyIFN0ZXA8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QW5ndWxhciBTdGVwPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRBbmd1bGFyU3RlcChpbnQpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNQYWNrYWdlI2dldFBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcl9Bbmd1bGFyU3RlcCgpCisJICogQG1vZGVsIGRlZmF1bHQ9IjEwIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgZ2V0QW5ndWxhclN0ZXAoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvciNnZXRBbmd1bGFyU3RlcCA8ZW0+QW5ndWxhciBTdGVwPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Bbmd1bGFyIFN0ZXA8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEFuZ3VsYXJTdGVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRBbmd1bGFyU3RlcChpbnQgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFkaXVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjYzNzEuMCI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmFkaXVzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhZGl1czwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0UmFkaXVzKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UjZ2V0UGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yX1JhZGl1cygpCisJICogQG1vZGVsIGRlZmF1bHQ9IjYzNzEuMCIgcmVxdWlyZWQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRSYWRpdXMoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvciNnZXRSYWRpdXMgPGVtPlJhZGl1czwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFkaXVzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRSYWRpdXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFJhZGl1cyhkb3VibGUgdmFsdWUpOworCit9IC8vIFBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL1NxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL1NxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOWY4YzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZCQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9yczsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TcXVhcmUgTGF0dGljZSBHcmFwaCBHZW5lcmF0b3I8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yI2dldFhTaXplIDxlbT5YU2l6ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yI2dldFlTaXplIDxlbT5ZU2l6ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yI2dldEFyZWEgPGVtPkFyZWE8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UjZ2V0U3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvciBleHRlbmRzIExhdHRpY2VHcmFwaEdlbmVyYXRvciB7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIxMCI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WFNpemU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WFNpemU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFhTaXplKGludCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UjZ2V0U3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yX1hTaXplKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMTAiCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBnZXRYU2l6ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yI2dldFhTaXplIDxlbT5YU2l6ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WFNpemU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFhTaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRYU2l6ZShpbnQgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WVNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMTAiPC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPllTaXplPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPllTaXplPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRZU2l6ZShpbnQpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNQYWNrYWdlI2dldFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcl9ZU2l6ZSgpCisJICogQG1vZGVsIGRlZmF1bHQ9IjEwIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgZ2V0WVNpemUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvciNnZXRZU2l6ZSA8ZW0+WVNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPllTaXplPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRZU2l6ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0WVNpemUoaW50IHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFyZWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMjAyNSI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXJlYTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcmVhPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRBcmVhKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UjZ2V0U3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yX0FyZWEoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSIyMDI1IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0QXJlYSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yI2dldEFyZWEgPGVtPkFyZWE8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFyZWE8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEFyZWEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEFyZWEoZG91YmxlIHZhbHVlKTsKK30gLy8gU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvaW1wbC9HcmFwaEdlbmVyYXRvckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9pbXBsL0dyYXBoR2VuZXJhdG9ySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNWI2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvaW1wbC9HcmFwaEdlbmVyYXRvckltcGwuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLklkZW50aWZpYWJsZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkdyYXBoR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaCBHZW5lcmF0b3I8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmFwaEdlbmVyYXRvckltcGwgZXh0ZW5kcyBJZGVudGlmaWFibGVJbXBsIGltcGxlbWVudHMgR3JhcGhHZW5lcmF0b3IgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBHcmFwaEdlbmVyYXRvckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0dFTkVSQVRPUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR3JhcGggZ2V0R3JhcGgoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30gLy9HcmFwaEdlbmVyYXRvckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9pbXBsL0dyYXBoZ2VuZXJhdG9yc0ZhY3RvcnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvaW1wbC9HcmFwaGdlbmVyYXRvcnNGYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZjE5MDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvaW1wbC9HcmFwaGdlbmVyYXRvcnNGYWN0b3J5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuR3JhcGhnZW5lcmF0b3JzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLk1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR3JhcGhnZW5lcmF0b3JzRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBHcmFwaGdlbmVyYXRvcnNGYWN0b3J5IHsKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBHcmFwaGdlbmVyYXRvcnNGYWN0b3J5IGluaXQoKSB7CisJCXRyeSB7CisJCQlHcmFwaGdlbmVyYXRvcnNGYWN0b3J5IHRoZUdyYXBoZ2VuZXJhdG9yc0ZhY3RvcnkgPSAoR3JhcGhnZW5lcmF0b3JzRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9ncmFwaGdlbmVyYXRvcnMuZWNvcmUiKTsgCisJCQlpZiAodGhlR3JhcGhnZW5lcmF0b3JzRmFjdG9yeSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoZUdyYXBoZ2VuZXJhdG9yc0ZhY3Rvcnk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXJldHVybiBuZXcgR3JhcGhnZW5lcmF0b3JzRmFjdG9yeUltcGwoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHcmFwaGdlbmVyYXRvcnNGYWN0b3J5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgeworCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlNRVUFSRV9MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUjogcmV0dXJuIGNyZWF0ZVNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcigpOworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLk1JR1JBVElPTl9FREdFX0dSQVBIX0dFTkVSQVRPUjogcmV0dXJuIGNyZWF0ZU1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcigpOworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlBMQVRFX0NBUlJFRV9HTE9CRV9HUkFQSF9HRU5FUkFUT1I6IHJldHVybiBjcmVhdGVQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IoKTsKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5QQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SOiByZXR1cm4gY3JlYXRlUGFqZWtOZXRHcmFwaEdlbmVyYXRvcigpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvciBjcmVhdGVTcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IoKSB7CisJCVNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvckltcGwgc3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yID0gbmV3IFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvckltcGwoKTsKKwkJcmV0dXJuIHNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yIGNyZWF0ZU1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcigpIHsKKwkJTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9ySW1wbCBtaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IgPSBuZXcgTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9ySW1wbCgpOworCQlyZXR1cm4gbWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IgY3JlYXRlUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yKCkgeworCQlQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JJbXBsIHBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvciA9IG5ldyBQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JJbXBsKCk7CisJCXJldHVybiBwbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBhamVrTmV0R3JhcGhHZW5lcmF0b3IgY3JlYXRlUGFqZWtOZXRHcmFwaEdlbmVyYXRvcigpIHsKKwkJUGFqZWtOZXRHcmFwaEdlbmVyYXRvckltcGwgcGFqZWtOZXRHcmFwaEdlbmVyYXRvciA9IG5ldyBQYWpla05ldEdyYXBoR2VuZXJhdG9ySW1wbCgpOworCQlyZXR1cm4gcGFqZWtOZXRHcmFwaEdlbmVyYXRvcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR3JhcGhnZW5lcmF0b3JzUGFja2FnZSBnZXRHcmFwaGdlbmVyYXRvcnNQYWNrYWdlKCkgeworCQlyZXR1cm4gKEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBkZXByZWNhdGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlIGdldFBhY2thZ2UoKSB7CisJCXJldHVybiBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLmVJTlNUQU5DRTsKKwl9CisKK30gLy9HcmFwaGdlbmVyYXRvcnNGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL2ltcGwvR3JhcGhnZW5lcmF0b3JzUGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9pbXBsL0dyYXBoZ2VuZXJhdG9yc1BhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyYTlhMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9pbXBsL0dyYXBoZ2VuZXJhdG9yc1BhY2thZ2VJbXBsLmphdmEKQEAgLTAsMCArMSw0NjggQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZCQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuTGF0dGljZUdyYXBoR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLk1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5QYWpla05ldEdyYXBoR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR3JhcGhnZW5lcmF0b3JzUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBncmFwaEdlbmVyYXRvckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBsYXR0aWNlR3JhcGhHZW5lcmF0b3JFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIG1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBwbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcGFqZWtOZXRHcmFwaEdlbmVyYXRvckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKKwkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KKwkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCisJICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKKwkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlSW1wbCgpIHsKKwkJc3VwZXIoZU5TX1VSSSwgR3JhcGhnZW5lcmF0b3JzRmFjdG9yeS5lSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UgaW5pdCgpIHsKKwkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCisJCUdyYXBoZ2VuZXJhdG9yc1BhY2thZ2VJbXBsIHRoZUdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UgPSAoR3JhcGhnZW5lcmF0b3JzUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2VJbXBsKCkpOworCisJCWlzSW5pdGVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKKwkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCUdyYXBoUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCU1vZGlmaWVyUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCVNjZW5hcmlvUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCVNlcXVlbmNlclBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCQlTb2x2ZXJQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKworCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cworCQl0aGVHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKwkJdGhlR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAorCQl0aGVHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLmZyZWV6ZSgpOworCisgIAorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuZU5TX1VSSSwgdGhlR3JhcGhnZW5lcmF0b3JzUGFja2FnZSk7CisJCXJldHVybiB0aGVHcmFwaGdlbmVyYXRvcnNQYWNrYWdlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0R3JhcGhHZW5lcmF0b3IoKSB7CisJCXJldHVybiBncmFwaEdlbmVyYXRvckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldExhdHRpY2VHcmFwaEdlbmVyYXRvcigpIHsKKwkJcmV0dXJuIGxhdHRpY2VHcmFwaEdlbmVyYXRvckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMYXR0aWNlR3JhcGhHZW5lcmF0b3JfVXNlTmVhcmVzdE5laWdoYm9ycygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWxhdHRpY2VHcmFwaEdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldExhdHRpY2VHcmFwaEdlbmVyYXRvcl9Vc2VOZXh0TmVhcmVzdE5laWdoYm9ycygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWxhdHRpY2VHcmFwaEdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldExhdHRpY2VHcmFwaEdlbmVyYXRvcl9QZXJpb2RpY0JvdW5kYXJpZXMoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlsYXR0aWNlR3JhcGhHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcigpIHsKKwkJcmV0dXJuIHNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JfWFNpemUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JfWVNpemUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JfQXJlYSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0TWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gbWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldE1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcl9Mb2NhdGlvbigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKW1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldE1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcl9NaWdyYXRpb25SYXRlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yX1BvcHVsYXRpb24oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSltaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcigpIHsKKwkJcmV0dXJuIHBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JfQW5ndWxhclN0ZXAoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JfUmFkaXVzKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQYWpla05ldEdyYXBoR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gcGFqZWtOZXRHcmFwaEdlbmVyYXRvckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQYWpla05ldEdyYXBoR2VuZXJhdG9yX0RhdGFGaWxlX25ldCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXBhamVrTmV0R3JhcGhHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQYWpla05ldEdyYXBoR2VuZXJhdG9yX0FyZWEoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwYWpla05ldEdyYXBoR2VuZXJhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFqZWtOZXRHcmFwaEdlbmVyYXRvcl9ab29tRmFjdG9yKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFqZWtOZXRHcmFwaEdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBhamVrTmV0R3JhcGhHZW5lcmF0b3JfQ29sQXJlYSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXBhamVrTmV0R3JhcGhHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR3JhcGhnZW5lcmF0b3JzRmFjdG9yeSBnZXRHcmFwaGdlbmVyYXRvcnNGYWN0b3J5KCkgeworCQlyZXR1cm4gKEdyYXBoZ2VuZXJhdG9yc0ZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcworCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKKwkJaXNDcmVhdGVkID0gdHJ1ZTsKKworCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJZ3JhcGhHZW5lcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1JBUEhfR0VORVJBVE9SKTsKKworCQlsYXR0aWNlR3JhcGhHZW5lcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTEFUVElDRV9HUkFQSF9HRU5FUkFUT1IpOworCQljcmVhdGVFQXR0cmlidXRlKGxhdHRpY2VHcmFwaEdlbmVyYXRvckVDbGFzcywgTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1VTRV9ORUFSRVNUX05FSUdIQk9SUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUobGF0dGljZUdyYXBoR2VuZXJhdG9yRUNsYXNzLCBMQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fVVNFX05FWFRfTkVBUkVTVF9ORUlHSEJPUlMpOworCQljcmVhdGVFQXR0cmlidXRlKGxhdHRpY2VHcmFwaEdlbmVyYXRvckVDbGFzcywgTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1BFUklPRElDX0JPVU5EQVJJRVMpOworCisJCXNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1IpOworCQljcmVhdGVFQXR0cmlidXRlKHNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvckVDbGFzcywgU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19YU0laRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yRUNsYXNzLCBTUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1lTSVpFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JFQ2xhc3MsIFNRVUFSRV9MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fQVJFQSk7CisKKwkJbWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1JR1JBVElPTl9FREdFX0dSQVBIX0dFTkVSQVRPUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUobWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yRUNsYXNzLCBNSUdSQVRJT05fRURHRV9HUkFQSF9HRU5FUkFUT1JfX0xPQ0FUSU9OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShtaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JFQ2xhc3MsIE1JR1JBVElPTl9FREdFX0dSQVBIX0dFTkVSQVRPUl9fTUlHUkFUSU9OX1JBVEUpOworCQljcmVhdGVFQXR0cmlidXRlKG1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvckVDbGFzcywgTUlHUkFUSU9OX0VER0VfR1JBUEhfR0VORVJBVE9SX19QT1BVTEFUSU9OKTsKKworCQlwbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUExBVEVfQ0FSUkVFX0dMT0JFX0dSQVBIX0dFTkVSQVRPUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yRUNsYXNzLCBQTEFURV9DQVJSRUVfR0xPQkVfR1JBUEhfR0VORVJBVE9SX19BTkdVTEFSX1NURVApOworCQljcmVhdGVFQXR0cmlidXRlKHBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvckVDbGFzcywgUExBVEVfQ0FSUkVFX0dMT0JFX0dSQVBIX0dFTkVSQVRPUl9fUkFESVVTKTsKKworCQlwYWpla05ldEdyYXBoR2VuZXJhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1IpOworCQljcmVhdGVFQXR0cmlidXRlKHBhamVrTmV0R3JhcGhHZW5lcmF0b3JFQ2xhc3MsIFBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX0RBVEFfRklMRV9ORVQpOworCQljcmVhdGVFQXR0cmlidXRlKHBhamVrTmV0R3JhcGhHZW5lcmF0b3JFQ2xhc3MsIFBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX0FSRUEpOworCQljcmVhdGVFQXR0cmlidXRlKHBhamVrTmV0R3JhcGhHZW5lcmF0b3JFQ2xhc3MsIFBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX1pPT01fRkFDVE9SKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwYWpla05ldEdyYXBoR2VuZXJhdG9yRUNsYXNzLCBQQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SX19DT0xfQVJFQSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOworCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKKwkJc2V0TmFtZShlTkFNRSk7CisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOworCQlzZXROc1VSSShlTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCisJCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7CisJCUdyYXBoUGFja2FnZSB0aGVHcmFwaFBhY2thZ2UgPSAoR3JhcGhQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEdyYXBoUGFja2FnZS5lTlNfVVJJKTsKKwkJRWNvcmVQYWNrYWdlIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCWdyYXBoR2VuZXJhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SWRlbnRpZmlhYmxlKCkpOworCQlsYXR0aWNlR3JhcGhHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHcmFwaEdlbmVyYXRvcigpKTsKKwkJc3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TGF0dGljZUdyYXBoR2VuZXJhdG9yKCkpOworCQltaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHcmFwaEdlbmVyYXRvcigpKTsKKwkJcGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TGF0dGljZUdyYXBoR2VuZXJhdG9yKCkpOworCQlwYWpla05ldEdyYXBoR2VuZXJhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3JhcGhHZW5lcmF0b3IoKSk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKwkJaW5pdEVDbGFzcyhncmFwaEdlbmVyYXRvckVDbGFzcywgR3JhcGhHZW5lcmF0b3IuY2xhc3MsICJHcmFwaEdlbmVyYXRvciIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWFkZEVPcGVyYXRpb24oZ3JhcGhHZW5lcmF0b3JFQ2xhc3MsIHRoZUdyYXBoUGFja2FnZS5nZXRHcmFwaCgpLCAiZ2V0R3JhcGgiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MobGF0dGljZUdyYXBoR2VuZXJhdG9yRUNsYXNzLCBMYXR0aWNlR3JhcGhHZW5lcmF0b3IuY2xhc3MsICJMYXR0aWNlR3JhcGhHZW5lcmF0b3IiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGF0dGljZUdyYXBoR2VuZXJhdG9yX1VzZU5lYXJlc3ROZWlnaGJvcnMoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ1c2VOZWFyZXN0TmVpZ2hib3JzIiwgInRydWUiLCAwLCAxLCBMYXR0aWNlR3JhcGhHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldExhdHRpY2VHcmFwaEdlbmVyYXRvcl9Vc2VOZXh0TmVhcmVzdE5laWdoYm9ycygpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVzZU5leHROZWFyZXN0TmVpZ2hib3JzIiwgImZhbHNlIiwgMCwgMSwgTGF0dGljZUdyYXBoR2VuZXJhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRMYXR0aWNlR3JhcGhHZW5lcmF0b3JfUGVyaW9kaWNCb3VuZGFyaWVzKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicGVyaW9kaWNCb3VuZGFyaWVzIiwgInRydWUiLCAwLCAxLCBMYXR0aWNlR3JhcGhHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhzcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JFQ2xhc3MsIFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvci5jbGFzcywgIlNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yX1hTaXplKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFSW50KCksICJ4U2l6ZSIsICIxMCIsIDAsIDEsIFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yX1lTaXplKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFSW50KCksICJ5U2l6ZSIsICIxMCIsIDAsIDEsIFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yX0FyZWEoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImFyZWEiLCAiMjAyNSIsIDAsIDEsIFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKG1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvckVDbGFzcywgTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yLmNsYXNzLCAiTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JfTG9jYXRpb24oKSwgdGhlR3JhcGhQYWNrYWdlLmdldFVSSSgpLCAibG9jYXRpb24iLCBudWxsLCAwLCAxLCBNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldE1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcl9NaWdyYXRpb25SYXRlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJtaWdyYXRpb25SYXRlIiwgIjAuMSIsIDAsIDEsIE1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yX1BvcHVsYXRpb24oKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcHVsYXRpb24iLCAiaHVtYW4iLCAwLCAxLCBNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhwbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JFQ2xhc3MsIFBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvci5jbGFzcywgIlBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yX0FuZ3VsYXJTdGVwKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFSW50KCksICJhbmd1bGFyU3RlcCIsICIxMCIsIDAsIDEsIFBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yX1JhZGl1cygpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAicmFkaXVzIiwgIjYzNzEuMCIsIDEsIDEsIFBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHBhamVrTmV0R3JhcGhHZW5lcmF0b3JFQ2xhc3MsIFBhamVrTmV0R3JhcGhHZW5lcmF0b3IuY2xhc3MsICJQYWpla05ldEdyYXBoR2VuZXJhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQYWpla05ldEdyYXBoR2VuZXJhdG9yX0RhdGFGaWxlX25ldCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGF0YUZpbGVfbmV0IiwgIiIsIDAsIDEsIFBhamVrTmV0R3JhcGhHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFBhamVrTmV0R3JhcGhHZW5lcmF0b3JfQXJlYSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiYXJlYSIsICIxMDAiLCAwLCAxLCBQYWpla05ldEdyYXBoR2VuZXJhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQYWpla05ldEdyYXBoR2VuZXJhdG9yX1pvb21GYWN0b3IoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgInpvb21GYWN0b3IiLCAiMTAwMCIsIDAsIDEsIFBhamVrTmV0R3JhcGhHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFBhamVrTmV0R3JhcGhHZW5lcmF0b3JfQ29sQXJlYSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUludCgpLCAiY29sQXJlYSIsIG51bGwsIDAsIDEsIFBhamVrTmV0R3JhcGhHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJLy8gQ3JlYXRlIHJlc291cmNlCisJCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCX0KKworfSAvL0dyYXBoZ2VuZXJhdG9yc1BhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvaW1wbC9MYXR0aWNlR3JhcGhHZW5lcmF0b3JJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvaW1wbC9MYXR0aWNlR3JhcGhHZW5lcmF0b3JJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1YWYzZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9pbXBsL0xhdHRpY2VHcmFwaEdlbmVyYXRvckltcGwuamF2YQpAQCAtMCwwICsxLDI3MSBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkxhdHRpY2VHcmFwaEdlbmVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxhdHRpY2UgR3JhcGggR2VuZXJhdG9yPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLkxhdHRpY2VHcmFwaEdlbmVyYXRvckltcGwjaXNVc2VOZWFyZXN0TmVpZ2hib3JzIDxlbT5Vc2UgTmVhcmVzdCBOZWlnaGJvcnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuTGF0dGljZUdyYXBoR2VuZXJhdG9ySW1wbCNpc1VzZU5leHROZWFyZXN0TmVpZ2hib3JzIDxlbT5Vc2UgTmV4dCBOZWFyZXN0IE5laWdoYm9yczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5MYXR0aWNlR3JhcGhHZW5lcmF0b3JJbXBsI2lzUGVyaW9kaWNCb3VuZGFyaWVzIDxlbT5QZXJpb2RpYyBCb3VuZGFyaWVzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGF0dGljZUdyYXBoR2VuZXJhdG9ySW1wbCBleHRlbmRzIEdyYXBoR2VuZXJhdG9ySW1wbCBpbXBsZW1lbnRzIExhdHRpY2VHcmFwaEdlbmVyYXRvciB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXNlTmVhcmVzdE5laWdoYm9ycygpIDxlbT5Vc2UgTmVhcmVzdCBOZWlnaGJvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzVXNlTmVhcmVzdE5laWdoYm9ycygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9ORUFSRVNUX05FSUdIQk9SU19FREVGQVVMVCA9IHRydWU7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VzZU5lYXJlc3ROZWlnaGJvcnMoKSA8ZW0+VXNlIE5lYXJlc3QgTmVpZ2hib3JzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1VzZU5lYXJlc3ROZWlnaGJvcnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHVzZU5lYXJlc3ROZWlnaGJvcnMgPSBVU0VfTkVBUkVTVF9ORUlHSEJPUlNfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVc2VOZXh0TmVhcmVzdE5laWdoYm9ycygpIDxlbT5Vc2UgTmV4dCBOZWFyZXN0IE5laWdoYm9yczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNVc2VOZXh0TmVhcmVzdE5laWdoYm9ycygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9ORVhUX05FQVJFU1RfTkVJR0hCT1JTX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VzZU5leHROZWFyZXN0TmVpZ2hib3JzKCkgPGVtPlVzZSBOZXh0IE5lYXJlc3QgTmVpZ2hib3JzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1VzZU5leHROZWFyZXN0TmVpZ2hib3JzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VOZXh0TmVhcmVzdE5laWdoYm9ycyA9IFVTRV9ORVhUX05FQVJFU1RfTkVJR0hCT1JTX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUGVyaW9kaWNCb3VuZGFyaWVzKCkgPGVtPlBlcmlvZGljIEJvdW5kYXJpZXM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzUGVyaW9kaWNCb3VuZGFyaWVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUEVSSU9ESUNfQk9VTkRBUklFU19FREVGQVVMVCA9IHRydWU7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1BlcmlvZGljQm91bmRhcmllcygpIDxlbT5QZXJpb2RpYyBCb3VuZGFyaWVzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1BlcmlvZGljQm91bmRhcmllcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcGVyaW9kaWNCb3VuZGFyaWVzID0gUEVSSU9ESUNfQk9VTkRBUklFU19FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBMYXR0aWNlR3JhcGhHZW5lcmF0b3JJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MaXRlcmFscy5MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1VzZU5lYXJlc3ROZWlnaGJvcnMoKSB7CisJCXJldHVybiB1c2VOZWFyZXN0TmVpZ2hib3JzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFVzZU5lYXJlc3ROZWlnaGJvcnMoYm9vbGVhbiBuZXdVc2VOZWFyZXN0TmVpZ2hib3JzKSB7CisJCWJvb2xlYW4gb2xkVXNlTmVhcmVzdE5laWdoYm9ycyA9IHVzZU5lYXJlc3ROZWlnaGJvcnM7CisJCXVzZU5lYXJlc3ROZWlnaGJvcnMgPSBuZXdVc2VOZWFyZXN0TmVpZ2hib3JzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19VU0VfTkVBUkVTVF9ORUlHSEJPUlMsIG9sZFVzZU5lYXJlc3ROZWlnaGJvcnMsIHVzZU5lYXJlc3ROZWlnaGJvcnMpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1VzZU5leHROZWFyZXN0TmVpZ2hib3JzKCkgeworCQlyZXR1cm4gdXNlTmV4dE5lYXJlc3ROZWlnaGJvcnM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VXNlTmV4dE5lYXJlc3ROZWlnaGJvcnMoYm9vbGVhbiBuZXdVc2VOZXh0TmVhcmVzdE5laWdoYm9ycykgeworCQlib29sZWFuIG9sZFVzZU5leHROZWFyZXN0TmVpZ2hib3JzID0gdXNlTmV4dE5lYXJlc3ROZWlnaGJvcnM7CisJCXVzZU5leHROZWFyZXN0TmVpZ2hib3JzID0gbmV3VXNlTmV4dE5lYXJlc3ROZWlnaGJvcnM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1VTRV9ORVhUX05FQVJFU1RfTkVJR0hCT1JTLCBvbGRVc2VOZXh0TmVhcmVzdE5laWdoYm9ycywgdXNlTmV4dE5lYXJlc3ROZWlnaGJvcnMpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1BlcmlvZGljQm91bmRhcmllcygpIHsKKwkJcmV0dXJuIHBlcmlvZGljQm91bmRhcmllczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQZXJpb2RpY0JvdW5kYXJpZXMoYm9vbGVhbiBuZXdQZXJpb2RpY0JvdW5kYXJpZXMpIHsKKwkJYm9vbGVhbiBvbGRQZXJpb2RpY0JvdW5kYXJpZXMgPSBwZXJpb2RpY0JvdW5kYXJpZXM7CisJCXBlcmlvZGljQm91bmRhcmllcyA9IG5ld1BlcmlvZGljQm91bmRhcmllczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fUEVSSU9ESUNfQk9VTkRBUklFUywgb2xkUGVyaW9kaWNCb3VuZGFyaWVzLCBwZXJpb2RpY0JvdW5kYXJpZXMpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1VTRV9ORUFSRVNUX05FSUdIQk9SUzoKKwkJCQlyZXR1cm4gaXNVc2VOZWFyZXN0TmVpZ2hib3JzKCk7CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1VTRV9ORVhUX05FQVJFU1RfTkVJR0hCT1JTOgorCQkJCXJldHVybiBpc1VzZU5leHROZWFyZXN0TmVpZ2hib3JzKCk7CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1BFUklPRElDX0JPVU5EQVJJRVM6CisJCQkJcmV0dXJuIGlzUGVyaW9kaWNCb3VuZGFyaWVzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fVVNFX05FQVJFU1RfTkVJR0hCT1JTOgorCQkJCXNldFVzZU5lYXJlc3ROZWlnaGJvcnMoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fVVNFX05FWFRfTkVBUkVTVF9ORUlHSEJPUlM6CisJCQkJc2V0VXNlTmV4dE5lYXJlc3ROZWlnaGJvcnMoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fUEVSSU9ESUNfQk9VTkRBUklFUzoKKwkJCQlzZXRQZXJpb2RpY0JvdW5kYXJpZXMoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1VTRV9ORUFSRVNUX05FSUdIQk9SUzoKKwkJCQlzZXRVc2VOZWFyZXN0TmVpZ2hib3JzKFVTRV9ORUFSRVNUX05FSUdIQk9SU19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19VU0VfTkVYVF9ORUFSRVNUX05FSUdIQk9SUzoKKwkJCQlzZXRVc2VOZXh0TmVhcmVzdE5laWdoYm9ycyhVU0VfTkVYVF9ORUFSRVNUX05FSUdIQk9SU19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19QRVJJT0RJQ19CT1VOREFSSUVTOgorCQkJCXNldFBlcmlvZGljQm91bmRhcmllcyhQRVJJT0RJQ19CT1VOREFSSUVTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fVVNFX05FQVJFU1RfTkVJR0hCT1JTOgorCQkJCXJldHVybiB1c2VOZWFyZXN0TmVpZ2hib3JzICE9IFVTRV9ORUFSRVNUX05FSUdIQk9SU19FREVGQVVMVDsKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fVVNFX05FWFRfTkVBUkVTVF9ORUlHSEJPUlM6CisJCQkJcmV0dXJuIHVzZU5leHROZWFyZXN0TmVpZ2hib3JzICE9IFVTRV9ORVhUX05FQVJFU1RfTkVJR0hCT1JTX0VERUZBVUxUOworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19QRVJJT0RJQ19CT1VOREFSSUVTOgorCQkJCXJldHVybiBwZXJpb2RpY0JvdW5kYXJpZXMgIT0gUEVSSU9ESUNfQk9VTkRBUklFU19FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHVzZU5lYXJlc3ROZWlnaGJvcnM6ICIpOworCQlyZXN1bHQuYXBwZW5kKHVzZU5lYXJlc3ROZWlnaGJvcnMpOworCQlyZXN1bHQuYXBwZW5kKCIsIHVzZU5leHROZWFyZXN0TmVpZ2hib3JzOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCh1c2VOZXh0TmVhcmVzdE5laWdoYm9ycyk7CisJCXJlc3VsdC5hcHBlbmQoIiwgcGVyaW9kaWNCb3VuZGFyaWVzOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChwZXJpb2RpY0JvdW5kYXJpZXMpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9MYXR0aWNlR3JhcGhHZW5lcmF0b3JJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvaW1wbC9NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvaW1wbC9NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5NTllMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9pbXBsL01pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvckltcGwuamF2YQpAQCAtMCwwICsxLDQ0NSBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGw7CisKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5VdGlsaXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLkxvY2F0aW9uVXRpbGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLkVkZ2VzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuRWRnZXNGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLk1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1pZ3JhdGlvbiBFZGdlIEdyYXBoIEdlbmVyYXRvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JJbXBsI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JJbXBsI2dldE1pZ3JhdGlvblJhdGUgPGVtPk1pZ3JhdGlvbiBSYXRlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLk1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvckltcGwjZ2V0UG9wdWxhdGlvbiA8ZW0+UG9wdWxhdGlvbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvckltcGwgZXh0ZW5kcyBHcmFwaEdlbmVyYXRvckltcGwgaW1wbGVtZW50cyBNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvbigpIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TG9jYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVVJJIExPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uKCkgPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMb2NhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFVSSSBsb2NhdGlvbiA9IExPQ0FUSU9OX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pZ3JhdGlvblJhdGUoKSA8ZW0+TWlncmF0aW9uIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1pZ3JhdGlvblJhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIE1JR1JBVElPTl9SQVRFX0VERUZBVUxUID0gMC4xOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWlncmF0aW9uUmF0ZSgpIDxlbT5NaWdyYXRpb24gUmF0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWlncmF0aW9uUmF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBtaWdyYXRpb25SYXRlID0gTUlHUkFUSU9OX1JBVEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9wdWxhdGlvbigpIDxlbT5Qb3B1bGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1BVTEFUSU9OX0VERUZBVUxUID0gImh1bWFuIjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcHVsYXRpb24oKSA8ZW0+UG9wdWxhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBwb3B1bGF0aW9uID0gUE9QVUxBVElPTl9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9ySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBHZW5lcmF0ZSBtaWdyYXRpb24gZWRnZXMgCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEdyYXBoIGdldEdyYXBoKCkgeworCQlmaW5hbCBHcmFwaCBncmFwaCA9IEdyYXBoRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGgoKTsKKwkJZmluYWwgRHVibGluQ29yZSBkYyA9IGdyYXBoLmdldER1YmxpbkNvcmUoKTsKKwkJZGMucG9wdWxhdGUoKTsKKwkJZGMuc2V0VGl0bGUoTUlHUkFUSU9OX0VER0VfVFlQRSk7CisJCWRjLnNldFNvdXJjZSh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKwkJQ2FsZW5kYXIgYyA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIkUgeXl5eS5NTS5kZCAnYXQnIGhoOm1tOnNzIGEgenp6Iik7CisgICAgICAgIFN0cmluZyB2YWxpZCA9IGZvcm1hdHRlci5mb3JtYXQoYy5nZXRUaW1lKCkpOworICAgICAgIAlkYy5zZXRWYWxpZCh2YWxpZCk7CisgICAgICAgCS8vIFRPRE8gZm9yIG5vdywganVzdCBmb3IgdGVzdGluZworICAgICAgIAkvLyBnZXRzIEFMTCBjb21tb24gYm9yZGVyIGVkZ2VzCisgICAgICAgCVNldDxFZGdlPiBjb21tb25Cb3JkZXJFZGdlcyA9IExvY2F0aW9uVXRpbGl0eS5nZXRDb21tb25Cb3JkZXJFZGdlcyhwcm9qZWN0LCB0aGlzLmdldExvY2F0aW9uKCkpOworCQkKKwkJSXRlcmF0b3I8RWRnZT4gaXRlciA9IGNvbW1vbkJvcmRlckVkZ2VzLml0ZXJhdG9yKCk7CisJCXdoaWxlKChpdGVyIT1udWxsKSYmKGl0ZXIuaGFzTmV4dCgpKSl7CisgICAgICAgCSAJCUVkZ2UgZSA9IGl0ZXIubmV4dCgpOworCQkJCWludCBzb3VyY2VMZXZlbCA9IFV0aWxpdHkua2V5TGV2ZWwoZS5nZXROb2RlQVVSSSgpLmxhc3RTZWdtZW50KCkpOworCQkJCWludCB0YXJnZXRMZXZlbCA9IFV0aWxpdHkua2V5TGV2ZWwoZS5nZXROb2RlQlVSSSgpLmxhc3RTZWdtZW50KCkpOworCQkJCVVSSSBzb3VyY2VVUkkgPSBlLmdldE5vZGVBVVJJKCk7CisJCQkJVVJJIHRhcmdldFVSSSA9IGUuZ2V0Tm9kZUJVUkkoKTsKKwkJCQkKKwkJCQlFZGdlc0ZhY3RvcnkgZWYgPSBFZGdlc0ZhY3RvcnlJbXBsLmluaXQoKTsKKwkJCQlNaWdyYXRpb25FZGdlIG1FZGdlMSA9IGVmLmNyZWF0ZU1pZ3JhdGlvbkVkZ2UoKTsKKwkJCQlNaWdyYXRpb25FZGdlIG1FZGdlMiA9IGVmLmNyZWF0ZU1pZ3JhdGlvbkVkZ2UoKTsKKwkJCQkKKwkJCQkvLyBUaGUgVVJJIG9mIHRoZSBlZGdlIDEgCisJCQkJVVJJIGVkZ2VVUkkxID0gbUVkZ2UxLmdldFVSSSgpOworCQkJCS8vIHRoZSBhdXRvZ2VuZXJhdGVkIGVkZ2UgdXJpIGlzIG5vdCBjb3JyZWN0LiBOZWVkIHRvIHJlcGxhY2UgaXQKKwkJCQlTdHJpbmcgczEgPSBlZGdlVVJJMS50b1N0cmluZygpOworCQkJCWludCBsYXN0ID0gczEubGFzdEluZGV4T2YoIi8iKTsKKwkJCQlTdHJpbmcgc0VkZ2UxID0gczEuc3Vic3RyaW5nKDAsbGFzdCk7CisJCQkJU3RyaW5nIHNFZGdlMiA9IHMxLnN1YnN0cmluZyhsYXN0LHMxLmxlbmd0aCgpKTsKKwkJCQlzMSA9IHNFZGdlMSsiL3JlbGF0aW9uc2hpcC9taWdyYXRpb24iK3NFZGdlMjsKKwkJCQlVUkkgbmV3VVJJID0gVVJJLmNyZWF0ZVVSSShzMSk7CisJCQkJbUVkZ2UxLnNldFVSSShuZXdVUkkpOworCQkJCQorCQkJCQorCQkJCS8vIFRoZSBVUkkgb2YgdGhlIGVkZ2UgMgorCQkJCVVSSSBlZGdlVVJJMiA9IG1FZGdlMi5nZXRVUkkoKTsKKwkJCQkvLyB0aGUgYXV0b2dlbmVyYXRlZCBlZGdlIHVyaSBpcyBub3QgY29ycmVjdC4gTmVlZCB0byByZXBsYWNlIGl0CisJCQkJU3RyaW5nIHMyID0gZWRnZVVSSTIudG9TdHJpbmcoKTsKKwkJCQlpbnQgbGFzdDIgPSBzMi5sYXN0SW5kZXhPZigiLyIpOworCQkJCXNFZGdlMSA9IHMyLnN1YnN0cmluZygwLGxhc3QyKTsKKwkJCQlzRWRnZTIgPSBzMi5zdWJzdHJpbmcobGFzdCxzMi5sZW5ndGgoKSk7CisJCQkJczIgPSBzRWRnZTErIi9yZWxhdGlvbnNoaXAvbWlncmF0aW9uIitzRWRnZTI7CisJCQkJVVJJIG5ld1VSSTIgPSBVUkkuY3JlYXRlVVJJKHMyKTsKKwkJCQltRWRnZTIuc2V0VVJJKG5ld1VSSTIpOworCQkJCQorCQkJCS8vIEFERCBUaGUgVVJJcyBvZiB0aGUgbm9kZXMgY29ubmVjdGVkIGJ5IHRoZXNlIHR3byBkaXJlY3RlZCBlZGdlcworCQkJCS8vIEEgPT4gQgorCQkJCW1FZGdlMS5zZXROb2RlQVVSSShzb3VyY2VVUkkpOworCQkJCW1FZGdlMS5zZXROb2RlQlVSSSh0YXJnZXRVUkkpOworCQkJCS8vIEIgPT4gQQorCQkJCW1FZGdlMi5zZXROb2RlQlVSSShzb3VyY2VVUkkpOworCQkJCW1FZGdlMi5zZXROb2RlQVVSSSh0YXJnZXRVUkkpOworCQkJCQkJCQkJCQorCQkJCS8vIG5vdyB3ZSBuZWVkIHRvIHNldCB0aGUgdXJpIGZvciB0aGUgbGFiZWwKKwkJCQlNaWdyYXRpb25FZGdlTGFiZWwgbGFiZWwxID0gbUVkZ2UxLmdldExhYmVsKCk7CisJCQkJTWlncmF0aW9uRWRnZUxhYmVsIGxhYmVsMiA9IG1FZGdlMi5nZXRMYWJlbCgpOworCQkJCQorCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJCRUZPUkU6IG1FZGdlTGFiZWwxIFVSSSB3YXMgIitsYWJlbDEuZ2V0VVJJKCkudG9TdHJpbmcoKSk7CisJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkJFRk9SRTogbUVkZ2VMYWJlbDIgVVJJIHdhcyAiK2xhYmVsMi5nZXRVUkkoKS50b1N0cmluZygpKTsKKwkJCQkKKwkJCQlsYWJlbDEuc2V0VVJJKGNyZWF0ZUVkZ2VMYWJlbFVSSShzb3VyY2VVUkksIHRhcmdldFVSSSkpOworCQkJCWxhYmVsMi5zZXRVUkkoY3JlYXRlRWRnZUxhYmVsVVJJKHRhcmdldFVSSSwgc291cmNlVVJJKSk7CisJCQkJCisJCQkJTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUgbWVsdjEgPSBsYWJlbDEuZ2V0Q3VycmVudFZhbHVlKCk7CisJCQkJbWVsdjEuc2V0TWlncmF0aW9uUmF0ZSh0aGlzLmdldE1pZ3JhdGlvblJhdGUoKSk7CisJCQkJTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUgbWVsdjIgPSBsYWJlbDIuZ2V0Q3VycmVudFZhbHVlKCk7CisJCQkJbWVsdjIuc2V0TWlncmF0aW9uUmF0ZSh0aGlzLmdldE1pZ3JhdGlvblJhdGUoKSk7CisJCQkJCisJCQkJZmluYWwgRHVibGluQ29yZSBkYzEgPSBtRWRnZTEuZ2V0RHVibGluQ29yZSgpOworCQkJCWRjMS5zZXRUaXRsZShjcmVhdGVFZGdlVGl0bGUoc291cmNlVVJJLCB0YXJnZXRVUkkpKTsKKwkJCQkKKwkJCQlmaW5hbCBEdWJsaW5Db3JlIGRjMiA9IG1FZGdlMi5nZXREdWJsaW5Db3JlKCk7CisJCQkJZGMyLnNldFRpdGxlKGNyZWF0ZUVkZ2VUaXRsZSh0YXJnZXRVUkksIHNvdXJjZVVSSSkpOworCQkJCQorCQkJCW1FZGdlMS5zZXRQb3B1bGF0aW9uSWRlbnRpZmllcih0aGlzLmdldFBvcHVsYXRpb24oKSk7CisJCQkJbUVkZ2UyLnNldFBvcHVsYXRpb25JZGVudGlmaWVyKHRoaXMuZ2V0UG9wdWxhdGlvbigpKTsKKwkJCQkKKwkJCQlncmFwaC5wdXRFZGdlKG1FZGdlMSk7CisJCQkJZ3JhcGgucHV0RWRnZShtRWRnZTIpOworCQl9CisKKwkJYXNzZXJ0IGdyYXBoLnNhbmUoKTsKKworCQlyZXR1cm4gZ3JhcGg7CisJCX0vLyBnZXRHcmFwaAorCQorCS8qKgorCSAqIElQcm9qZWN0IHRvIGNyZWF0ZSBlZGdlcyBpbgorCSAqLworCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKKwlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKKwkJcmV0dXJuIHByb2plY3Q7IAorCX0KKwlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHApIHsKKwkJdGhpcy5wcm9qZWN0ID0gcDsKKwl9CisJCisJLyoqCisJICogCisJICogQHBhcmFtIHVyaUEKKwkgKiBAcGFyYW0gdXJpQgorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBVUkkgY3JlYXRlRWRnZUxhYmVsVVJJKFVSSSB1cmlBLCBVUkkgdXJpQikgeworCQkKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZUVkZ2VMYWJlbFVSSSgpIDogaW5pdGlhbGx5LCB1cmlBID0gIit1cmlBLnRvU3RyaW5nKCkpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlRWRnZUxhYmVsVVJJKCkgOiBpbml0aWFsbHksIHVyaUIgPSAiK3VyaUIudG9TdHJpbmcoKSk7CisJCQorCQlTdHJpbmcgc0EgPSB1cmlBLmxhc3RTZWdtZW50KCk7CisJCVN0cmluZyBzQiA9IHVyaUIubGFzdFNlZ21lbnQoKTsKKwkJCisJCS8vIFRPRE8gaXMgdGhpcyBzdGlsbCB0cnVlPz8KKwkJLy8gTWlncmF0aW9uRWRnZUxhYmVsSXRlbVByb3ZpZGVyCisJCS8vIHVzZXMgXyBhcyBhIHNwZWNpYWwgY2hhcmFjdGVyIHRvIHNlcGFyYXRlIHRoZSB0d28gbm9kZXMKKwkJLy8gc28gd2UgbmVlZCB0byByZXBsYWNlIGl0LgorCQlzQT1zQS5yZXBsYWNlKCdfJywnLicpOworCQlzQj1zQi5yZXBsYWNlKCdfJywnLicpOworCQlTdHJpbmcgdXJpU3RyaW5nID0gc0ErIl8iK3NCOworCQkKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZUVkZ2VMYWJlbFVSSSgpIDogRklOQUxMWSwgdXJpID0gIit1cmlTdHJpbmcpOworCQkKKyAgICAgICAgVVJJIHVyaSA9IFNURU1VUkkuY3JlYXRlVVJJKHVyaVN0cmluZyk7CisJCXJldHVybiB1cmk7CisJfSAvLyBjcmVhdGVSZWdpb25Ob2RlVVJJCisJCisJLyoqCisJICogQHBhcmFtIHgKKwkgKiAgICAgICAgICAgIHRoZSB4IG9mIHRoZSBub2RlIGluIHRoZSBsYXR0aWNlCisJICogQHBhcmFtIHkKKwkgKiAgICAgICAgICAgIHRoZSB5IG9mIHRoZSBub2RlIGluIHRoZSBsYXR0aWNlCisJICogQHJldHVybiBhIHRpdGxlIGZvciBhIG5vZGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVFZGdlVGl0bGUoVVJJIHVyaUEsIFVSSSB1cmlCKSB7CisJCVN0cmluZyBzQSA9IHVyaUEubGFzdFNlZ21lbnQoKTsKKwkJU3RyaW5nIHNCID0gdXJpQi5sYXN0U2VnbWVudCgpOworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIk1pZ3JhdGlvbkVkZ2VbKCIpOworCQlzYi5hcHBlbmQoc0EpOworCQlzYi5hcHBlbmQoIik8LS0+KCIpOworCQlzYi5hcHBlbmQoc0IpOworCQlzYi5hcHBlbmQoIildIik7CisJCQorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9IC8vIGNyZWF0ZUVkZ2VUaXRsZQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MaXRlcmFscy5NSUdSQVRJT05fRURHRV9HUkFQSF9HRU5FUkFUT1I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVSSSBnZXRMb2NhdGlvbigpIHsKKwkJcmV0dXJuIGxvY2F0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFVSSSBuZXdMb2NhdGlvbikgeworCQlVUkkgb2xkTG9jYXRpb24gPSBsb2NhdGlvbjsKKwkJbG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5NSUdSQVRJT05fRURHRV9HUkFQSF9HRU5FUkFUT1JfX0xPQ0FUSU9OLCBvbGRMb2NhdGlvbiwgbG9jYXRpb24pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE1pZ3JhdGlvblJhdGUoKSB7CisJCXJldHVybiBtaWdyYXRpb25SYXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1pZ3JhdGlvblJhdGUoZG91YmxlIG5ld01pZ3JhdGlvblJhdGUpIHsKKwkJZG91YmxlIG9sZE1pZ3JhdGlvblJhdGUgPSBtaWdyYXRpb25SYXRlOworCQltaWdyYXRpb25SYXRlID0gbmV3TWlncmF0aW9uUmF0ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5NSUdSQVRJT05fRURHRV9HUkFQSF9HRU5FUkFUT1JfX01JR1JBVElPTl9SQVRFLCBvbGRNaWdyYXRpb25SYXRlLCBtaWdyYXRpb25SYXRlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRQb3B1bGF0aW9uKCkgeworCQlyZXR1cm4gcG9wdWxhdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQb3B1bGF0aW9uKFN0cmluZyBuZXdQb3B1bGF0aW9uKSB7CisJCVN0cmluZyBvbGRQb3B1bGF0aW9uID0gcG9wdWxhdGlvbjsKKwkJcG9wdWxhdGlvbiA9IG5ld1BvcHVsYXRpb247CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfR1JBUEhfR0VORVJBVE9SX19QT1BVTEFUSU9OLCBvbGRQb3B1bGF0aW9uLCBwb3B1bGF0aW9uKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLk1JR1JBVElPTl9FREdFX0dSQVBIX0dFTkVSQVRPUl9fTE9DQVRJT046CisJCQkJcmV0dXJuIGdldExvY2F0aW9uKCk7CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfR1JBUEhfR0VORVJBVE9SX19NSUdSQVRJT05fUkFURToKKwkJCQlyZXR1cm4gZ2V0TWlncmF0aW9uUmF0ZSgpOworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLk1JR1JBVElPTl9FREdFX0dSQVBIX0dFTkVSQVRPUl9fUE9QVUxBVElPTjoKKwkJCQlyZXR1cm4gZ2V0UG9wdWxhdGlvbigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfR1JBUEhfR0VORVJBVE9SX19MT0NBVElPTjoKKwkJCQlzZXRMb2NhdGlvbigoVVJJKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfR1JBUEhfR0VORVJBVE9SX19NSUdSQVRJT05fUkFURToKKwkJCQlzZXRNaWdyYXRpb25SYXRlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5NSUdSQVRJT05fRURHRV9HUkFQSF9HRU5FUkFUT1JfX1BPUFVMQVRJT046CisJCQkJc2V0UG9wdWxhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLk1JR1JBVElPTl9FREdFX0dSQVBIX0dFTkVSQVRPUl9fTE9DQVRJT046CisJCQkJc2V0TG9jYXRpb24oTE9DQVRJT05fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5NSUdSQVRJT05fRURHRV9HUkFQSF9HRU5FUkFUT1JfX01JR1JBVElPTl9SQVRFOgorCQkJCXNldE1pZ3JhdGlvblJhdGUoTUlHUkFUSU9OX1JBVEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5NSUdSQVRJT05fRURHRV9HUkFQSF9HRU5FUkFUT1JfX1BPUFVMQVRJT046CisJCQkJc2V0UG9wdWxhdGlvbihQT1BVTEFUSU9OX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5NSUdSQVRJT05fRURHRV9HUkFQSF9HRU5FUkFUT1JfX0xPQ0FUSU9OOgorCQkJCXJldHVybiBMT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb24gIT0gbnVsbCA6ICFMT0NBVElPTl9FREVGQVVMVC5lcXVhbHMobG9jYXRpb24pOworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLk1JR1JBVElPTl9FREdFX0dSQVBIX0dFTkVSQVRPUl9fTUlHUkFUSU9OX1JBVEU6CisJCQkJcmV0dXJuIG1pZ3JhdGlvblJhdGUgIT0gTUlHUkFUSU9OX1JBVEVfRURFRkFVTFQ7CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfR1JBUEhfR0VORVJBVE9SX19QT1BVTEFUSU9OOgorCQkJCXJldHVybiBQT1BVTEFUSU9OX0VERUZBVUxUID09IG51bGwgPyBwb3B1bGF0aW9uICE9IG51bGwgOiAhUE9QVUxBVElPTl9FREVGQVVMVC5lcXVhbHMocG9wdWxhdGlvbik7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChsb2NhdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQobG9jYXRpb24pOworCQlyZXN1bHQuYXBwZW5kKCIsIG1pZ3JhdGlvblJhdGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKG1pZ3JhdGlvblJhdGUpOworCQlyZXN1bHQuYXBwZW5kKCIsIHBvcHVsYXRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKHBvcHVsYXRpb24pOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvaW1wbC9QYWpla05ldEdyYXBoR2VuZXJhdG9ySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL2ltcGwvUGFqZWtOZXRHcmFwaEdlbmVyYXRvckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGYwZGZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL2ltcGwvUGFqZWtOZXRHcmFwaEdlbmVyYXRvckltcGwuamF2YQpAQCAtMCwwICsxLDcwMSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyoNCisqIENvbnRyaWJ1dG9yczoNCisqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGphdmEuaW8uRmlsZTsNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXI7DQoraW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOw0KK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsNCitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOw0KK2ltcG9ydCBqYXZhLnV0aWwuU2Nhbm5lcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuQWN0aXZhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLklubGluZUxhdExvbmdEYXRhUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nLlNlZ21lbnRCdWlsZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsSW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5Ob2Rlc0ZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuUmVnaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5QYWpla05ldEdyYXBoR2VuZXJhdG9yOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhamVrIE5ldCBHcmFwaCBHZW5lcmF0b3I8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5QYWpla05ldEdyYXBoR2VuZXJhdG9ySW1wbCNnZXREYXRhRmlsZV9uZXQgPGVtPkRhdGEgRmlsZSBuZXQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLlBhamVrTmV0R3JhcGhHZW5lcmF0b3JJbXBsI2dldEFyZWEgPGVtPkFyZWE8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLlBhamVrTmV0R3JhcGhHZW5lcmF0b3JJbXBsI2dldFpvb21GYWN0b3IgPGVtPlpvb20gRmFjdG9yPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbC5QYWpla05ldEdyYXBoR2VuZXJhdG9ySW1wbCNnZXRDb2xBcmVhIDxlbT5Db2wgQXJlYTwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhamVrTmV0R3JhcGhHZW5lcmF0b3JJbXBsIGV4dGVuZHMgR3JhcGhHZW5lcmF0b3JJbXBsIGltcGxlbWVudHMgUGFqZWtOZXRHcmFwaEdlbmVyYXRvciB7DQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YUZpbGVfbmV0KCkgPGVtPkRhdGEgRmlsZSBuZXQ8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldERhdGFGaWxlX25ldCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfRklMRV9ORVRfRURFRkFVTFQgPSAiIjsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGFGaWxlX25ldCgpIDxlbT5EYXRhIEZpbGUgbmV0PC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXREYXRhRmlsZV9uZXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFGaWxlX25ldCA9IERBVEFfRklMRV9ORVRfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJlYSgpIDxlbT5BcmVhPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRBcmVhKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgQVJFQV9FREVGQVVMVCA9IDEwMC4wOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJlYSgpIDxlbT5BcmVhPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRBcmVhKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGRvdWJsZSBhcmVhID0gQVJFQV9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRab29tRmFjdG9yKCkgPGVtPlpvb20gRmFjdG9yPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRab29tRmFjdG9yKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgWk9PTV9GQUNUT1JfRURFRkFVTFQgPSAxMDAwOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Wm9vbUZhY3RvcigpIDxlbT5ab29tIEZhY3RvcjwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0Wm9vbUZhY3RvcigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBpbnQgem9vbUZhY3RvciA9IFpPT01fRkFDVE9SX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbEFyZWEoKSA8ZW0+Q29sIEFyZWE8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldENvbEFyZWEoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT0xfQVJFQV9FREVGQVVMVCA9IDA7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2xBcmVhKCkgPGVtPkNvbCBBcmVhPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRDb2xBcmVhKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGludCBjb2xBcmVhID0gQ09MX0FSRUFfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXB1YmxpYyBQYWpla05ldEdyYXBoR2VuZXJhdG9ySW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQorCQlyZXR1cm4gR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MaXRlcmFscy5QQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXREYXRhRmlsZV9uZXQoKSB7DQorCQlyZXR1cm4gZGF0YUZpbGVfbmV0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0RGF0YUZpbGVfbmV0KFN0cmluZyBuZXdEYXRhRmlsZV9uZXQpIHsNCisJCVN0cmluZyBvbGREYXRhRmlsZV9uZXQgPSBkYXRhRmlsZV9uZXQ7DQorCQlkYXRhRmlsZV9uZXQgPSBuZXdEYXRhRmlsZV9uZXQ7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5QQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SX19EQVRBX0ZJTEVfTkVULCBvbGREYXRhRmlsZV9uZXQsIGRhdGFGaWxlX25ldCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGRvdWJsZSBnZXRBcmVhKCkgew0KKwkJcmV0dXJuIGFyZWE7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRBcmVhKGRvdWJsZSBuZXdBcmVhKSB7DQorCQlkb3VibGUgb2xkQXJlYSA9IGFyZWE7DQorCQlhcmVhID0gbmV3QXJlYTsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX0FSRUEsIG9sZEFyZWEsIGFyZWEpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBpbnQgZ2V0Wm9vbUZhY3RvcigpIHsNCisJCXJldHVybiB6b29tRmFjdG9yOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0Wm9vbUZhY3RvcihpbnQgbmV3Wm9vbUZhY3Rvcikgew0KKwkJaW50IG9sZFpvb21GYWN0b3IgPSB6b29tRmFjdG9yOw0KKwkJem9vbUZhY3RvciA9IG5ld1pvb21GYWN0b3I7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5QQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SX19aT09NX0ZBQ1RPUiwgb2xkWm9vbUZhY3Rvciwgem9vbUZhY3RvcikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGludCBnZXRDb2xBcmVhKCkgew0KKwkJcmV0dXJuIGNvbEFyZWE7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRDb2xBcmVhKGludCBuZXdDb2xBcmVhKSB7DQorCQlpbnQgb2xkQ29sQXJlYSA9IGNvbEFyZWE7DQorCQljb2xBcmVhID0gbmV3Q29sQXJlYTsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX0NPTF9BUkVBLCBvbGRDb2xBcmVhLCBjb2xBcmVhKSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuUEFKRUtfTkVUX0dSQVBIX0dFTkVSQVRPUl9fREFUQV9GSUxFX05FVDoNCisJCQkJcmV0dXJuIGdldERhdGFGaWxlX25ldCgpOw0KKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5QQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SX19BUkVBOg0KKwkJCQlyZXR1cm4gZ2V0QXJlYSgpOw0KKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5QQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SX19aT09NX0ZBQ1RPUjoNCisJCQkJcmV0dXJuIGdldFpvb21GYWN0b3IoKTsNCisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuUEFKRUtfTkVUX0dSQVBIX0dFTkVSQVRPUl9fQ09MX0FSRUE6DQorCQkJCXJldHVybiBnZXRDb2xBcmVhKCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuUEFKRUtfTkVUX0dSQVBIX0dFTkVSQVRPUl9fREFUQV9GSUxFX05FVDoNCisJCQkJc2V0RGF0YUZpbGVfbmV0KChTdHJpbmcpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX0FSRUE6DQorCQkJCXNldEFyZWEoKERvdWJsZSluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuUEFKRUtfTkVUX0dSQVBIX0dFTkVSQVRPUl9fWk9PTV9GQUNUT1I6DQorCQkJCXNldFpvb21GYWN0b3IoKEludGVnZXIpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX0NPTF9BUkVBOg0KKwkJCQlzZXRDb2xBcmVhKChJbnRlZ2VyKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuUEFKRUtfTkVUX0dSQVBIX0dFTkVSQVRPUl9fREFUQV9GSUxFX05FVDoNCisJCQkJc2V0RGF0YUZpbGVfbmV0KERBVEFfRklMRV9ORVRfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX0FSRUE6DQorCQkJCXNldEFyZWEoQVJFQV9FREVGQVVMVCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuUEFKRUtfTkVUX0dSQVBIX0dFTkVSQVRPUl9fWk9PTV9GQUNUT1I6DQorCQkJCXNldFpvb21GYWN0b3IoWk9PTV9GQUNUT1JfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX0NPTF9BUkVBOg0KKwkJCQlzZXRDb2xBcmVhKENPTF9BUkVBX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX0RBVEFfRklMRV9ORVQ6DQorCQkJCXJldHVybiBEQVRBX0ZJTEVfTkVUX0VERUZBVUxUID09IG51bGwgPyBkYXRhRmlsZV9uZXQgIT0gbnVsbCA6ICFEQVRBX0ZJTEVfTkVUX0VERUZBVUxULmVxdWFscyhkYXRhRmlsZV9uZXQpOw0KKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5QQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SX19BUkVBOg0KKwkJCQlyZXR1cm4gYXJlYSAhPSBBUkVBX0VERUZBVUxUOw0KKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5QQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SX19aT09NX0ZBQ1RPUjoNCisJCQkJcmV0dXJuIHpvb21GYWN0b3IgIT0gWk9PTV9GQUNUT1JfRURFRkFVTFQ7DQorCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX0NPTF9BUkVBOg0KKwkJCQlyZXR1cm4gY29sQXJlYSAhPSBDT0xfQVJFQV9FREVGQVVMVDsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOw0KKw0KKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7DQorCQlyZXN1bHQuYXBwZW5kKCIgKGRhdGFGaWxlX25ldDogIik7DQorCQlyZXN1bHQuYXBwZW5kKGRhdGFGaWxlX25ldCk7DQorCQlyZXN1bHQuYXBwZW5kKCIsIGFyZWE6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChhcmVhKTsNCisJCXJlc3VsdC5hcHBlbmQoIiwgem9vbUZhY3RvcjogIik7DQorCQlyZXN1bHQuYXBwZW5kKHpvb21GYWN0b3IpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCBjb2xBcmVhOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQoY29sQXJlYSk7DQorCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEltcG9ydCBQYWpla05ldHMgaW50byBHcmFwaHMNCisJICogZm9yIFBhamVrIGZvcm1hdCBzZWU6IGh0dHA6Ly92bGFkby5mbWYudW5pLWxqLnNpL3B1Yi9uZXR3b3Jrcy9wYWplay9kb2MvcGFqZWttYW4ucGRmDQorCSAqIA0KKwkgKiB3ZSB1c2UgY29tcGF0aWJsZSBkZWZpbml0aW9ucyBvZiB0aGUgcGFqZWsgZm9ybWF0IG9ubHksIHdoaWNoIGlzOg0KKwkgKiBWZXJ0aWNlczogdmVydGV4TnVtYmVyIGxhYmVsIHggeSAtIHRoZSBmaXJzdCA0IHBhcmFtZXRlcnMgYXJlIG1hbmRhdG9yeQ0KKwkgKiBBcmNzOiB2MSB2MiB2YWx1ZSAtIGFsbCB0aHJlZSBwYXJhbWV0ZXJzIGFyZSBtYW5kYXRvcnkNCisJICogDQorCSAqIERhdGEgRmlsZTogUGFqZWsgZmlsZSB0byBpbXBvcnQNCisJICogQXJlYTogRGVmYXVsdCBBcmVhIG9mIGVhY2ggbm9kZSBpZiB1bmRlZmluZWQNCisJICogWm9vbWZhY3RvcjogRmFjdG9yaXppbmcgdGhlIGluaXRpYWwgY29vcmRpbmF0ZXMgb2YgdGhlIFBhamVrIE5FVA0KKwkgKiBjb2xBcmVhOiBGaWVsZCB0aGF0IGRlZmluZXMgdGhlIGluZGl2aWR1YWwgYXJlYSBmb3IgZWFjaCBub2RlLiBJZiBtaXNzaW5nIHRoZSBkZWZhdWx0IGFyZWEgaXMgdXNlZC4gVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gNCBhcyB0aGUgZmlyc3QgZm91ciBjb2x1bW5zIGFyZSBwcmVkZWZpbmVkLg0KKwkgKiANCisJICovDQorCUBPdmVycmlkZQkJDQorCXB1YmxpYyBHcmFwaCBnZXRHcmFwaCgpIHsNCisJCUdyYXBoIGcgPSBudWxsOw0KKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZ2V0RGF0YUZpbGVfbmV0KCkpOw0KKyAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiAhZmlsZS5pc0RpcmVjdG9yeSgpICYmIGZpbGUuZXhpc3RzKCkpIGcgPSBnZXRHcmFwaChmaWxlKTsJDQorICAgICAgICBlbHNlIEFjdGl2YXRvci5sb2dFcnJvcigiUGFqZWsgaW1wb3J0aW5nOiBGaWxlIGNhbm5vdCBiZSBmb3VuZCIsIG51bGwpOw0KKwkJcmV0dXJuIGc7DQorCX0NCisNCisJcHJpdmF0ZSBHcmFwaCBnZXRHcmFwaChGaWxlIHBhamVrTkVURmlsZVVSSSkgew0KKyAgICAgICAJZmluYWwgR3JhcGggZ3JhcGggPSBHcmFwaEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoKCk7DQorCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gZ3JhcGguZ2V0RHVibGluQ29yZSgpOw0KKwkJZGMucG9wdWxhdGUoKTsNCisJCWRjLnNldFRpdGxlKCJQYWplayBJbXBvcnQiKTsNCisJCWRjLnNldFNvdXJjZSh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsNCisJCUNhbGVuZGFyIGMgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOw0KKyAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRSB5eXl5Lk1NLmRkICdhdCcgaGg6bW06c3MgYSB6enoiKTsNCisgICAgICAgIFN0cmluZyB2YWxpZCA9IGZvcm1hdHRlci5mb3JtYXQoYy5nZXRUaW1lKCkpOw0KKyAgICAgICAJZGMuc2V0VmFsaWQodmFsaWQpOw0KKyAgICAgICAJDQorICAgICAgIAlOb2RlIG5vZGVIb2xkZXJbXSA9IG5ldyBOb2RlWzBdOw0KKw0KKwkJU2Nhbm5lciBpbnB1dDsNCisJCXRyeSB7DQorCQkJaW5wdXQgPSBuZXcgU2Nhbm5lcihwYWpla05FVEZpbGVVUkkpOw0KKw0KKwkJCWJvb2xlYW4gZG9Ob2RlcyA9IGZhbHNlLCBkb0VkZ2VzID0gZmFsc2U7DQorCQkJaW50IG51bU5vZGVzID0gMDsNCisJCQlTdHJpbmcgbm9kZU5hbWVbXSA9IG5ldyBTdHJpbmdbMF07DQorCQkJd2hpbGUoaW5wdXQuaGFzTmV4dCgpKSB7DQorCQkJICAgIFN0cmluZyBuZXh0TGluZSA9IGlucHV0Lm5leHRMaW5lKCk7DQorCQkJICAgIFN0cmVhbVRva2VuaXplciB0b2sgPSBuZXcgU3RyZWFtVG9rZW5pemVyKG5ldyBTdHJpbmdSZWFkZXIobmV4dExpbmUudHJpbSgpKSk7DQorCQkJICAgIHRvay5wYXJzZU51bWJlcnMoKTsNCisJCSAgICAJaW50IHR0eXBlID0gZ2V0TmV4dFRva2VuKHRvayk7DQorCQkgICAgCWlmICh0dHlwZSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfV09SRCkgew0KKwkJICAgIAkJLy8gZS5nLiBWZXJ0aWNlcyAgICAgMjYNCisJCSAgICAJCWlmICh0b2suc3ZhbC5lcXVhbHNJZ25vcmVDYXNlKCJ2ZXJ0aWNlcyIpKSB7DQorCQkJCSAgICAJZG9Ob2RlcyA9IHRydWU7DQorCQkJCSAgICAJZG9FZGdlcyA9IGZhbHNlOw0KKwkJCQkgICAgCXR0eXBlID0gZ2V0TmV4dFRva2VuKHRvayk7DQorCQkJCSAgICAJaWYgKHR0eXBlID09IFN0cmVhbVRva2VuaXplci5UVF9OVU1CRVIpIHsNCisJCQkJICAgIAkJbnVtTm9kZXMgPSAoaW50KSB0b2subnZhbDsNCisJCQkJICAgIAkJbm9kZUhvbGRlciA9IG5ldyBOb2RlW251bU5vZGVzXTsNCisJCQkJICAgIAkJbm9kZU5hbWUgPSBuZXcgU3RyaW5nW251bU5vZGVzXTsNCisJCQkJCSAgICAJbnVtTm9kZXMgPSAwOwkJICAgIAkJCQ0KKwkJCQkgICAgCX0NCisJCQkJICAgIAllbHNlIHsNCisJCQkJICAgIAkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJQYWplayBpbXBvcnRpbmcgIiArIHBhamVrTkVURmlsZVVSSS5nZXROYW1lKCkgKyAiOiB2ZXJ0aWNlcyBrZXl3b3JkIHdpdGhvdXQgdmFsaWQgbnVtYmVyIG9mIG5vZGVzLi4uIE5vdCBwcm9jZXNzYWJsZSEiLCBudWxsKTsNCisJCQkJCSAgICAJaW5wdXQuY2xvc2UoKTsNCisJCQkJCSAgICAJcmV0dXJuIG51bGw7DQorCQkJCSAgICAJfQ0KKwkJICAgIAkJfQ0KKwkJICAgIAkJZWxzZSBpZiAodG9rLnN2YWwuZXF1YWxzSWdub3JlQ2FzZSgiYXJjcyIpIHx8IHRvay5zdmFsLmVxdWFsc0lnbm9yZUNhc2UoImFyY3NsaXN0IikgfHwgdG9rLnN2YWwuZXF1YWxzSWdub3JlQ2FzZSgiZWRnZXMiKSkgew0KKwkJCQkgICAgCWRvTm9kZXMgPSBmYWxzZTsNCisJCQkJICAgIAlkb0VkZ2VzID0gdHJ1ZTsNCisJCSAgICAJCX0NCisJCSAgICAJCWVsc2Ugew0KKwkJICAgIAkJCWRvTm9kZXMgPSBmYWxzZTsNCisJCSAgICAJCQlkb0VkZ2VzID0gZmFsc2U7DQorCQkgICAgCQl9DQorCQkJICAgIH0NCisJCQkgICAgZWxzZSBpZiAoZG9Ob2RlcyAmJiB0dHlwZSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfTlVNQkVSKSB7IC8vIE5vZGVzID0gVmVydGljZXMNCisJCQkgICAgCWRvdWJsZSB4ID0gMCwgeSA9IDA7DQorCQkJICAgIAlkb3VibGUgbm9kZUFyZWEgPSAwOw0KKwkJCSAgICAJDQorCQkJICAgIAkvLyB2ZXJ0ZXgvbm9kZSBudW1iZXINCisJCQkgICAgCWlmICh0b2subnZhbCAhPSBudW1Ob2RlcysxKSB7DQorCQkJICAgIAkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJQYWplayBpbXBvcnRpbmc6ICIgKyBwYWpla05FVEZpbGVVUkkuZ2V0TmFtZSgpICsgIjogdXN1YWxseSBzdWNjZXNzaXZlIG51bWJlcmluZyBvZiB2ZXJ0aWNlcy9ub2Rlcy4uLiBQbGVhc2UgY2hlY2shIEV4aXRpbmchIiwgbnVsbCk7DQorCQkJCSAgICAJaW5wdXQuY2xvc2UoKTsNCisJCQkgICAgCQlyZXR1cm4gbnVsbDsNCisJCQkgICAgCX0NCisJCQkgICAgCWVsc2Ugbm9kZU5hbWVbbnVtTm9kZXNdID0gIiIrKGludCl0b2subnZhbDsNCisJCQkgICAgCQ0KKwkJCSAgICAJLy8gbGFiZWwNCisJCQkgICAgCXR0eXBlID0gZ2V0TmV4dFRva2VuKHRvayk7IA0KKwkJCSAgICAJaWYgKHR0eXBlID09IFN0cmVhbVRva2VuaXplci5UVF9XT1JEIHx8IHR0eXBlID09ICciJykgbm9kZU5hbWVbbnVtTm9kZXNdID0gdG9rLnN2YWw7DQorCQkJICAgIAllbHNlIGlmICh0dHlwZSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfTlVNQkVSKSBub2RlTmFtZVtudW1Ob2Rlc10gPSAiIisoaW50KXRvay5udmFsOw0KKwkJCSAgICAJZWxzZSB7DQorCQkJICAgIAkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJQYWplayBpbXBvcnRpbmc6ICIgKyBwYWpla05FVEZpbGVVUkkuZ2V0TmFtZSgpICsgIjogYSBsYWJlbCBmb3IgdGhlIG5vZGUvdmVydGV4IGlzIG9ibGlnYXRvcnkuLi4gRXhpdGluZyEiLCBudWxsKTsNCisJCQkJICAgIAlpbnB1dC5jbG9zZSgpOw0KKwkJCSAgICAJCXJldHVybiBudWxsOw0KKwkJCSAgICAJfQ0KKwkJCSAgICAJDQorCQkJICAgIAkvLyBjb29yZGluYXRlcyBvZiB2ZXJ0ZXgvbm9kZSwgYXQgbGVhc3QgeCBhbmQgeSwgeiBpcyBub3QgdXNlZCBhdCB0aGUgbW9tZW50DQorCQkJICAgIAl0dHlwZSA9IGdldE5leHRUb2tlbih0b2spOw0KKwkJCSAgICAJaWYgKHR0eXBlID09IFN0cmVhbVRva2VuaXplci5UVF9OVU1CRVIpCXggPSB0b2subnZhbDsNCisJCQkgICAgCWVsc2Ugew0KKwkJCSAgICAJCUFjdGl2YXRvci5sb2dFcnJvcigiUGFqZWsgaW1wb3J0aW5nOiAiICsgcGFqZWtORVRGaWxlVVJJLmdldE5hbWUoKSArICI6IGNvb3JkaW5hdGVzIGZvciB0aGUgbm9kZS92ZXJ0ZXggYXJlIG5lY2Vzc2FyeS4uLiBFeGl0aW5nISIsIG51bGwpOw0KKwkJCSAgICAJCWlucHV0LmNsb3NlKCk7DQorCQkJICAgIAkJcmV0dXJuIG51bGw7DQorCQkJICAgIAl9IAkgICAgCQ0KKwkJCSAgICAJdHR5cGUgPSBnZXROZXh0VG9rZW4odG9rKTsNCisJCQkgICAgCWlmICh0dHlwZSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfTlVNQkVSKQl5ID0gdG9rLm52YWw7DQorCQkJICAgIAllbHNlIHsNCisJCQkgICAgCQlBY3RpdmF0b3IubG9nRXJyb3IoIlBhamVrIGltcG9ydGluZzogIiArIHBhamVrTkVURmlsZVVSSS5nZXROYW1lKCkgKyAiOiBjb29yZGluYXRlcyBmb3IgdGhlIG5vZGUvdmVydGV4IGFyZSBuZWNlc3NhcnkuLi4gRXhpdGluZyEiLCBudWxsKTsNCisJCQkgICAgCQlpbnB1dC5jbG9zZSgpOw0KKwkJCSAgICAJCXJldHVybiBudWxsOw0KKwkJCSAgICAJfSANCisJCQkgICAgCQ0KKwkJCSAgICAJaWYgKGdldENvbEFyZWEoKSA+IDQpIHsNCisJCQkgICAgCQlmb3IgKGludCBhY3R1YWxDb2wgPSA1OyB0dHlwZSAhPSBTdHJlYW1Ub2tlbml6ZXIuVFRfRU9GOyBhY3R1YWxDb2wrKykgew0KKwkJCSAgICAJCQl0dHlwZSA9IGdldE5leHRUb2tlbih0b2spOw0KKwkJCSAgICAJCQlpZiAoZ2V0Q29sQXJlYSgpID09IGFjdHVhbENvbCAmJiB0dHlwZSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfTlVNQkVSKSBub2RlQXJlYSA9IHRvay5udmFsOw0KKwkJCSAgICAJCX0NCisJCQkgICAgCX0NCisJCQkJCQ0KKwkJCSAgICAJLy8gVGhhdHMgaXQuIEF0IHRoZSBtb21lbnQgd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIG1vcmUgcGFyYW1ldGVycywgbWF5YmUgbGF0ZXIuLi4NCisJCQkgICAgCS8vIENyZWF0aW5nIG5vZGU6DQorCQkJICAgIAl4PXgqZ2V0Wm9vbUZhY3RvcigpOw0KKwkJCSAgICAJeT15KmdldFpvb21GYWN0b3IoKTsNCisJCQkgICAgCWZpbmFsIFJlZ2lvbiByZWdpb25Ob2RlID0gY3JlYXRlUmVnaW9uTm9kZSgiUEFKX05FVF8iICsgbm9kZU5hbWVbbnVtTm9kZXNdICsgIl8iLCB4LCB5LCBncmFwaCk7DQorCQkJCQkNCisJCQkgICAgCWRvdWJsZSBhcmVhID0gKG5vZGVBcmVhID4gMCA/IG5vZGVBcmVhIDogZ2V0QXJlYSgpKTsNCisJCQkJCWZpbmFsIEFyZWFMYWJlbCBhcmVhTGFiZWwgPSBMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcmVhTGFiZWwoKTsNCisJCQkJCWFyZWFMYWJlbC5nZXRDdXJyZW50QXJlYVZhbHVlKCkuc2V0QXJlYShhcmVhKTsNCisJCQkJCXJlZ2lvbk5vZGUuZ2V0TGFiZWxzKCkuYWRkKGFyZWFMYWJlbCk7DQorCQkJCQkJCQkJCQ0KKwkJCQkJZmluYWwgTGF0TG9uZyBub2RlU2VnbWVudHMgPSBjcmVhdGVOb2RlUG9seWdvbih4LHksYXJlYSk7DQorCQkJCQlmaW5hbCBTdHJpbmcgc3BhdGlhbFVSSVN0cmluZyA9IElubGluZUxhdExvbmdEYXRhUHJvdmlkZXIuY3JlYXRlU3BhdGlhbElubGluZVVSSVN0cmluZyhub2RlU2VnbWVudHMpOw0KKwkJCQkJcmVnaW9uTm9kZS5nZXREdWJsaW5Db3JlKCkuc2V0U3BhdGlhbChzcGF0aWFsVVJJU3RyaW5nKTsNCisJCQkJCQ0KKwkJCQkJbm9kZUhvbGRlcltudW1Ob2Rlc10gPSByZWdpb25Ob2RlOw0KKwkJCQkJZ3JhcGgucHV0Tm9kZShyZWdpb25Ob2RlKTsNCisJCQkgICAgCW51bU5vZGVzKys7DQorCQkJICAgIH0NCisJCQkgICAgZWxzZSBpZiAoZG9FZGdlcyAmJiB0dHlwZSA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfTlVNQkVSKSB7IC8vIEVkZ2VzID0gQXJjcw0KKwkJCSAgICAJaW50IGEsIGIgPSAwOw0KKwkJCSAgICAJaW50IGJvcmRlckxlbmd0aCA9IDA7DQorCQkJICAgIAkNCisJCQkgICAgCS8vIGluaXRpYWwgdmVydGV4IG51bWJlcg0KKwkJCSAgICAJYSA9IChpbnQpIHRvay5udmFsOw0KKwkJCSAgICAJDQorCQkJICAgIAkvLyB0ZXJtaW5hbCB2ZXJ0ZXggbnVtYmVyDQorCQkJICAgIAl0dHlwZSA9IGdldE5leHRUb2tlbih0b2spOw0KKwkJCSAgICAJaWYgKHR0eXBlID09IFN0cmVhbVRva2VuaXplci5UVF9OVU1CRVIpCWIgPSAoaW50KSB0b2subnZhbDsNCisJCQkgICAgCWVsc2Ugew0KKwkJCSAgICAJCUFjdGl2YXRvci5sb2dFcnJvcigiUGFqZWsgaW1wb3J0aW5nOiAiICsgcGFqZWtORVRGaWxlVVJJLmdldE5hbWUoKSArICI6IHdyb25nIGFyY3MgZm9ybWF0LiBDYW5ub3QgaWRlbnRpZnkgdGVybWluYWwgbm9kZSB3aXRoIGluaXRpYWwgbm9kZSAiICsgYSArICIgLi4uIEV4aXRpbmchIiwgbnVsbCk7DQorCQkJICAgIAkJaW5wdXQuY2xvc2UoKTsNCisJCQkgICAgCQlyZXR1cm4gbnVsbDsNCisJCQkgICAgCX0NCisJCQkgICAgCQ0KKwkJCSAgICAJLy8gdmFsdWUgb2YgYXJjIGZyb20gYSB0byBiLCB3ZSBpbnRlcnByZXQgaXQgYXMgYm9yZGVyTGVuZ3RoLCB1c3VhbGx5IGluIFBhamVrIGZvcm1hdCBpdCBpcyB0aGlja25lc3Mgb2YgYXJjDQorCQkJICAgIAl0dHlwZSA9IGdldE5leHRUb2tlbih0b2spOw0KKwkJCSAgICAJaWYgKHR0eXBlID09IFN0cmVhbVRva2VuaXplci5UVF9OVU1CRVIpCWJvcmRlckxlbmd0aCA9IChpbnQpIHRvay5udmFsOw0KKwkJCSAgICAJZWxzZSB7DQorCQkJICAgIAkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJQYWplayBpbXBvcnRpbmc6ICIgKyBwYWpla05FVEZpbGVVUkkuZ2V0TmFtZSgpICsgIjogd3JvbmcgYXJjcyBmb3JtYXQuIENhbm5vdCBpZGVudGlmeSB2YWx1ZSBvZiBhcmMgYmV0d2VlbiBub2RlICIgKyBhICsgIiBhbmQgbm9kZSAiICsgYiArICIgLi4uIEV4aXRpbmchIiwgbnVsbCk7DQorCQkJICAgIAkJaW5wdXQuY2xvc2UoKTsNCisJCQkgICAgCQlyZXR1cm4gbnVsbDsNCisJCQkgICAgCX0NCisJCQkgICAgCQ0KKwkJCSAgICAJaWYgKGJvcmRlckxlbmd0aCA8IDApIGJvcmRlckxlbmd0aCAqPSAtMTsNCisJCQkgICAgCWNyZWF0ZUVkZ2UoZ3JhcGgsbm9kZUhvbGRlclthLTFdLG5vZGVIb2xkZXJbYi0xXSwgYm9yZGVyTGVuZ3RoKTsNCisJCQkgICAgfQ0KKwkJCSAgICBlbHNlIHsNCisJCQkgICAgCUFjdGl2YXRvci5sb2dFcnJvcigiUGFqZWsgaW1wb3J0aW5nOiAiICsgcGFqZWtORVRGaWxlVVJJLmdldE5hbWUoKSArICI6IHZlcnkgc3BlY2lhbCBQYWplayBmb3JtYXQ/IT8gTm90IHByb2Nlc3NhYmxlISIsIG51bGwpOw0KKwkJCSAgICAJaW5wdXQuY2xvc2UoKTsNCisJCQkgICAgCXJldHVybiBudWxsOw0KKwkJCSAgICB9DQorCQkJfQ0KKw0KKwkJCWlucHV0LmNsb3NlKCk7CQkNCisJCX0NCisJCWNhdGNoIChFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorDQorCQlhc3NlcnQgZ3JhcGguc2FuZSgpOw0KKw0KKwkJcmV0dXJuIGdyYXBoOw0KKwl9DQorCXByaXZhdGUgaW50IGdldE5leHRUb2tlbihTdHJlYW1Ub2tlbml6ZXIgdG9rKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKwkJaW50IHR0eXBlID0gMDsgDQorCQl3aGlsZSgodHR5cGUgPSB0b2submV4dFRva2VuKCkpICE9IFN0cmVhbVRva2VuaXplci5UVF9XT1JEICYmIHR0eXBlICE9IFN0cmVhbVRva2VuaXplci5UVF9OVU1CRVIgJiYgdHR5cGUgIT0gU3RyZWFtVG9rZW5pemVyLlRUX0VPRiAmJiB0dHlwZSAhPSAnIicpOw0KKwkJcmV0dXJuIHR0eXBlOw0KKwl9CQkNCisJDQorCQ0KKw0KKw0KKwkNCisJLyoqDQorCSAqIA0KKwkgKiBAcGFyYW0geA0KKwkgKiBAcGFyYW0geQ0KKwkgKiBAcGFyYW0gYXJlYQ0KKwkgKiBAcmV0dXJuDQorCSAqLw0KKwlwcml2YXRlIExhdExvbmcgY3JlYXRlTm9kZVBvbHlnb24oZmluYWwgZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgYXJlYSkgew0KKwkJZmluYWwgTGF0TG9uZyByZXRWYWx1ZSA9IG5ldyBMYXRMb25nKCk7DQorCQkNCisJCWZpbmFsIFNlZ21lbnRCdWlsZGVyIHNiID0gbmV3IFNlZ21lbnRCdWlsZGVyKCk7DQorCQkvLyBXZSBqdXN0IG1ha2UgYSBzcXVhcmUuLi4NCisJCWRvdWJsZSBhcmVhMiA9IE1hdGguc3FydChhcmVhKSAvIDI7DQorCQlzYi5hZGQoeC1hcmVhMiwgeS1hcmVhMik7DQorCQlzYi5hZGQoeC1hcmVhMiwgeSthcmVhMik7DQorCQlzYi5hZGQoeCthcmVhMiwgeSthcmVhMik7DQorCQlzYi5hZGQoeCthcmVhMiwgeS1hcmVhMik7DQorCQlzYi5hZGQoeC1hcmVhMiwgeS1hcmVhMik7DQorCQlyZXRWYWx1ZS5hZGQoc2IudG9TZWdtZW50KCkpOw0KKw0KKwkJcmV0dXJuIHJldFZhbHVlOw0KKwl9IC8vIGNyZWF0ZU5vZGVQb2x5Z29uDQorDQorDQorCS8qKg0KKwkgKiBAcGFyYW0geA0KKwkgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkIG9mIHRoZSBub2RlIGluIHRoZSBsYXR0aWNlDQorCSAqIEBwYXJhbSB5DQorCSAqICAgICAgICAgICAgdGhlIHkgY29vcmQgb2YgdGhlIG5vZGUgaW4gdGhlIGxhdHRpY2UNCisJICogQHJldHVybiBhIG5vZGUNCisJICovDQorCXByaXZhdGUgUmVnaW9uIGNyZWF0ZVJlZ2lvbk5vZGUoU3RyaW5nIHVyaVByZWZpeCwgZG91YmxlIHgsIGRvdWJsZSB5LCBHcmFwaCBncmFwaCkgew0KKwkJZmluYWwgUmVnaW9uIG5vZGUgPSBOb2Rlc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlZ2lvbigpOw0KKwkJZmluYWwgRHVibGluQ29yZSBkYyA9IG5vZGUuZ2V0RHVibGluQ29yZSgpOw0KKwkJZGMuc2V0VGl0bGUoY3JlYXRlTm9kZVRpdGxlKHgsIHkpKTsNCisJCW5vZGUuc2V0VVJJKGNyZWF0ZVJlZ2lvbk5vZGVVUkkodXJpUHJlZml4LCB4LCB5LCBncmFwaCkpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0gLy8gY3JlYXRlUmVnaW9uTm9kZQ0KKwkNCisJDQorCS8qKg0KKwkgKiBAcGFyYW0geA0KKwkgKiAgICAgICAgICAgIHRoZSB4IG9mIHRoZSBub2RlIGluIHRoZSBsYXR0aWNlDQorCSAqIEBwYXJhbSB5DQorCSAqICAgICAgICAgICAgdGhlIHkgb2YgdGhlIG5vZGUgaW4gdGhlIGxhdHRpY2UNCisJICogQHJldHVybiBhIHRpdGxlIGZvciBhIG5vZGUNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGNyZWF0ZU5vZGVUaXRsZShkb3VibGUgeCwgZG91YmxlIHkpIHsNCisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiTm9kZVsiKTsNCisJCXNiLmFwcGVuZChEb3VibGUudG9TdHJpbmcoeCkpOw0KKwkJc2IuYXBwZW5kKCIsICIpOw0KKwkJc2IuYXBwZW5kKERvdWJsZS50b1N0cmluZyh5KSk7DQorCQlzYi5hcHBlbmQoIl0iKTsNCisJCXJldHVybiBzYi50b1N0cmluZygpOw0KKwl9IC8vIGNyZWF0ZU5vZGVUaXRsZQ0KKwkNCisJDQorCS8qKg0KKwkgKiBAcGFyYW0geA0KKwkgKiAgICAgICAgICAgIHRoZSB4IG9mIHRoZSByZWdpb24gaW4gdGhlIGxhdHRpY2UNCisJICogQHBhcmFtIHkNCisJICogICAgICAgICAgICB0aGUgeSBvZiB0aGUgcmVnaW9uIGluIHRoZSBsYXR0aWNlDQorCSAqIEByZXR1cm4gYSBVUkkgZm9yIHRoZSByZWdpb24gbm9kZQ0KKwkgKi8NCisJcHJpdmF0ZSBVUkkgY3JlYXRlUmVnaW9uTm9kZVVSSShTdHJpbmcgdXJpUHJlZml4LCBkb3VibGUgeCwgZG91YmxlIHksIEdyYXBoIGdyYXBoKSB7DQorCQlTdHJpbmcgbm9kZVVyaVN1ZmZpeCA9IHVyaVByZWZpeCt4KyJfIit5Ow0KKwkJU3RyaW5nIG5vZGVVcmlTdHJpbmcgPSBOb2RlLlVSSV9UWVBFX05PREVfU0VHTUVOVCArICIvIg0KKwkJCQkJCQkJKyBncmFwaC5nZXRVUkkoKS5sYXN0U2VnbWVudCgpKyIvIg0KKwkJCQkJCQkJKyBub2RlVXJpU3VmZml4Ow0KKwkJDQorICAgICAgICBVUkkgdXJpID0gU1RFTVVSSS5jcmVhdGVVUkkobm9kZVVyaVN0cmluZyk7DQorCQlyZXR1cm4gdXJpOw0KKwl9IC8vIGNyZWF0ZVJlZ2lvbk5vZGVVUkkNCisJDQorCQ0KKwkvKioNCisJICogQHBhcmFtIHgNCisJICogICAgICAgICAgICB0aGUgeCBvZiB0aGUgcmVnaW9uIGluIHRoZSBsYXR0aWNlDQorCSAqIEBwYXJhbSB5DQorCSAqICAgICAgICAgICAgdGhlIHkgb2YgdGhlIHJlZ2lvbiBpbiB0aGUgbGF0dGljZQ0KKwkgKiBAcmV0dXJuIGEgVVJJIGZvciB0aGUgcmVnaW9uIG5vZGUNCisJICovDQorCXByaXZhdGUgVVJJIGNyZWF0ZUVkZ2VMYWJlbFVSSShOb2RlIG5vZGVBLCBOb2RlIG5vZGVCKSB7DQorCQlVUkkgdXJpQSA9IG5vZGVBLmdldFVSSSgpOw0KKwkJVVJJIHVyaUIgPSBub2RlQi5nZXRVUkkoKTsNCisJCVN0cmluZyBzQSA9IHVyaUEubGFzdFNlZ21lbnQoKTsNCisJCVN0cmluZyBzQiA9IHVyaUIubGFzdFNlZ21lbnQoKTsNCisJCS8vIENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsSXRlbVByb3ZpZGVyDQorCQkvLyB1c2VzIF8gYXMgYSBzcGVjaWFsIGNoYXJhY3RlciB0byBzZXBhcmF0ZSB0aGUgdHdvIG5vZGVzDQorCQkvLyBzbyB3ZSBuZWVkIHRvIHJlcGxhY2UgaXQuDQorCQlzQT1zQS5yZXBsYWNlKCdfJywnLicpOw0KKwkJc0I9c0IucmVwbGFjZSgnXycsJy4nKTsNCisJCVN0cmluZyB1cmlTdHJpbmcgPSBzQSsiXyIrc0I7DQorICAgICAgICBVUkkgdXJpID0gU1RFTVVSSS5jcmVhdGVVUkkodXJpU3RyaW5nKTsNCisJCXJldHVybiB1cmk7DQorCX0gLy8gY3JlYXRlUmVnaW9uTm9kZVVSSQ0KKwkNCisJDQorDQorCS8qKg0KKwkgKiANCisJICogQHBhcmFtIGdyYXBoDQorCSAqIEBwYXJhbSBub2RlQQ0KKwkgKiBAcGFyYW0gbm9kZUINCisJICogQHBhcmFtIGJvcmRlckxlbmd0aA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUVkZ2UoZmluYWwgR3JhcGggZ3JhcGgsIGZpbmFsIE5vZGUgbm9kZUEsIGZpbmFsIE5vZGUgbm9kZUIsIGludCBib3JkZXJMZW5ndGgpIHsNCisNCisJCS8vIGNyZWF0ZSB0aGUgZWRnZQ0KKwkJZmluYWwgRWRnZSBlZGdlID0gQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxJbXBsLmNyZWF0ZUNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcChub2RlQSwgbm9kZUIsIGJvcmRlckxlbmd0aCk7DQorCQkNCisJCVVSSSBlZGdlVVJJID0gZWRnZS5nZXRVUkkoKTsNCisJCS8vIHRoZSBhdXRvZ2VuZXJhdGVkIGVkZ2UgdXJpIGlzIG5vdCBjb3JyZWN0LiBOZWVkIHRvIHJlcGxhY2UgaXQNCisJCVN0cmluZyBzRWRnZSA9IGVkZ2VVUkkudG9TdHJpbmcoKTsNCisJCWludCBsYXN0ID0gc0VkZ2UubGFzdEluZGV4T2YoIi8iKTsNCisJCVN0cmluZyBzRWRnZTEgPSBzRWRnZS5zdWJzdHJpbmcoMCxsYXN0KTsNCisJCVN0cmluZyBzRWRnZTIgPSBzRWRnZS5zdWJzdHJpbmcobGFzdCxzRWRnZS5sZW5ndGgoKSk7DQorCQlzRWRnZSA9IHNFZGdlMSsiL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIiK3NFZGdlMjsNCisJCVVSSSBuZXdVUkkgPSBVUkkuY3JlYXRlVVJJKHNFZGdlKTsNCisJCWVkZ2Uuc2V0VVJJKG5ld1VSSSk7DQorCQkNCisJCS8vIG5vdyB3ZSBuZWVkIHRvIHNldCB0aGUgdXJpIGZvciB0aGUgbGFiZWwNCisJCUNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsIGxhYmVsID0gKENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsKWVkZ2UuZ2V0TGFiZWwoKTsNCisJCWxhYmVsLnNldFVSSShjcmVhdGVFZGdlTGFiZWxVUkkobm9kZUEsIG5vZGVCKSk7DQorDQorCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gZWRnZS5nZXREdWJsaW5Db3JlKCk7DQorCQlkYy5zZXRUaXRsZShjcmVhdGVFZGdlVGl0bGUobm9kZUEsIG5vZGVCKSk7DQorCQkNCisJCWdyYXBoLnB1dEVkZ2UoZWRnZSk7DQorCX0gLy8gY3JlYXRlRWRnZUxpc3QNCisJDQorCS8qKg0KKwkgKiBAcGFyYW0geA0KKwkgKiAgICAgICAgICAgIHRoZSB4IG9mIHRoZSBub2RlIGluIHRoZSBsYXR0aWNlDQorCSAqIEBwYXJhbSB5DQorCSAqICAgICAgICAgICAgdGhlIHkgb2YgdGhlIG5vZGUgaW4gdGhlIGxhdHRpY2UNCisJICogQHJldHVybiBhIHRpdGxlIGZvciBhIG5vZGUNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGNyZWF0ZUVkZ2VUaXRsZShOb2RlIG5vZGVBLCBOb2RlIG5vZGVCKSB7DQorCQlTdHJpbmcgbkEgPSBub2RlQS5nZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKTsNCisJCVN0cmluZyBuQiA9IG5vZGVCLmdldER1YmxpbkNvcmUoKS5nZXRUaXRsZSgpOw0KKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJFZGdlWygiKTsNCisJCXNiLmFwcGVuZChuQSk7DQorCQlzYi5hcHBlbmQoIik8LS0+KCIpOw0KKwkJc2IuYXBwZW5kKG5CKTsNCisJCXNiLmFwcGVuZCgiKV0iKTsNCisJCXJldHVybiBzYi50b1N0cmluZygpOw0KKwl9IC8vIGNyZWF0ZUVkZ2VUaXRsZQ0KKw0KK30gLy9QYWpla05ldEdyYXBoR2VuZXJhdG9ySW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9pbXBsL1BsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9pbXBsL1BsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzg5MzBlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL2ltcGwvUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9ySW1wbC5qYXZhCkBAIC0wLDAgKzEsMjM3IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhdHRpY2UuR3JhcGhMYXR0aWNlR2VuZXJhdG9ySW50ZXJmYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGF0dGljZS5pbXBsLkxhdHRpY2VHZW5lcmF0b3JVdGlsaXR5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBsYXRlIENhcnJlZSBHbG9iZSBHcmFwaCBHZW5lcmF0b3I8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9ySW1wbCNnZXRBbmd1bGFyU3RlcCA8ZW0+QW5ndWxhciBTdGVwPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5pbXBsLlBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvckltcGwjZ2V0UmFkaXVzIDxlbT5SYWRpdXM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JJbXBsIGV4dGVuZHMgTGF0dGljZUdyYXBoR2VuZXJhdG9ySW1wbCBpbXBsZW1lbnRzIFBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvciB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFuZ3VsYXJTdGVwKCkgPGVtPkFuZ3VsYXIgU3RlcDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QW5ndWxhclN0ZXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEFOR1VMQVJfU1RFUF9FREVGQVVMVCA9IDEwOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QW5ndWxhclN0ZXAoKSA8ZW0+QW5ndWxhciBTdGVwPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBbmd1bGFyU3RlcCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGludCBhbmd1bGFyU3RlcCA9IEFOR1VMQVJfU1RFUF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYWRpdXMoKSA8ZW0+UmFkaXVzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSYWRpdXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFJBRElVU19FREVGQVVMVCA9IDYzNzEuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhZGl1cygpIDxlbT5SYWRpdXM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJhZGl1cygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSByYWRpdXMgPSBSQURJVVNfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxpdGVyYWxzLlBMQVRFX0NBUlJFRV9HTE9CRV9HUkFQSF9HRU5FUkFUT1I7CisJfQorCisJLyoqCisJICogQHNlZSBMYXR0aWNlR2VuZXJhdG9yVXRpbGl0eUltcGwKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgR3JhcGggZ2V0R3JhcGgoKSB7CisJCUxhdHRpY2VHZW5lcmF0b3JVdGlsaXR5SW1wbCBzbGdpID0gbmV3IExhdHRpY2VHZW5lcmF0b3JVdGlsaXR5SW1wbChHcmFwaExhdHRpY2VHZW5lcmF0b3JJbnRlcmZhY2UuR0xPQkVfTEFUVElDRV9UWVBFKTsKKwkJR3JhcGggZyA9IHNsZ2kuZ2V0UGxhdGVDYXJlZUdyYXBoKHRoaXMuZ2V0QW5ndWxhclN0ZXAoKSwgdGhpcy5yYWRpdXMsIHRoaXMuaXNVc2VOZWFyZXN0TmVpZ2hib3JzKCksIHRoaXMuaXNVc2VOZXh0TmVhcmVzdE5laWdoYm9ycygpLCB0aGlzLmlzUGVyaW9kaWNCb3VuZGFyaWVzKCkpOworCQkKKwkJcmV0dXJuIGc7CisJCQorCisJfQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0QW5ndWxhclN0ZXAoKSB7CisJCXJldHVybiBhbmd1bGFyU3RlcDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBbmd1bGFyU3RlcChpbnQgbmV3QW5ndWxhclN0ZXApIHsKKwkJaW50IG9sZEFuZ3VsYXJTdGVwID0gYW5ndWxhclN0ZXA7CisJCWFuZ3VsYXJTdGVwID0gbmV3QW5ndWxhclN0ZXA7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuUExBVEVfQ0FSUkVFX0dMT0JFX0dSQVBIX0dFTkVSQVRPUl9fQU5HVUxBUl9TVEVQLCBvbGRBbmd1bGFyU3RlcCwgYW5ndWxhclN0ZXApKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFJhZGl1cygpIHsKKwkJcmV0dXJuIHJhZGl1czsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSYWRpdXMoZG91YmxlIG5ld1JhZGl1cykgeworCQlkb3VibGUgb2xkUmFkaXVzID0gcmFkaXVzOworCQlyYWRpdXMgPSBuZXdSYWRpdXM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuUExBVEVfQ0FSUkVFX0dMT0JFX0dSQVBIX0dFTkVSQVRPUl9fUkFESVVTLCBvbGRSYWRpdXMsIHJhZGl1cykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5QTEFURV9DQVJSRUVfR0xPQkVfR1JBUEhfR0VORVJBVE9SX19BTkdVTEFSX1NURVA6CisJCQkJcmV0dXJuIGdldEFuZ3VsYXJTdGVwKCk7CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuUExBVEVfQ0FSUkVFX0dMT0JFX0dSQVBIX0dFTkVSQVRPUl9fUkFESVVTOgorCQkJCXJldHVybiBnZXRSYWRpdXMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlBMQVRFX0NBUlJFRV9HTE9CRV9HUkFQSF9HRU5FUkFUT1JfX0FOR1VMQVJfU1RFUDoKKwkJCQlzZXRBbmd1bGFyU3RlcCgoSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlBMQVRFX0NBUlJFRV9HTE9CRV9HUkFQSF9HRU5FUkFUT1JfX1JBRElVUzoKKwkJCQlzZXRSYWRpdXMoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5QTEFURV9DQVJSRUVfR0xPQkVfR1JBUEhfR0VORVJBVE9SX19BTkdVTEFSX1NURVA6CisJCQkJc2V0QW5ndWxhclN0ZXAoQU5HVUxBUl9TVEVQX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuUExBVEVfQ0FSUkVFX0dMT0JFX0dSQVBIX0dFTkVSQVRPUl9fUkFESVVTOgorCQkJCXNldFJhZGl1cyhSQURJVVNfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlBMQVRFX0NBUlJFRV9HTE9CRV9HUkFQSF9HRU5FUkFUT1JfX0FOR1VMQVJfU1RFUDoKKwkJCQlyZXR1cm4gYW5ndWxhclN0ZXAgIT0gQU5HVUxBUl9TVEVQX0VERUZBVUxUOworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlBMQVRFX0NBUlJFRV9HTE9CRV9HUkFQSF9HRU5FUkFUT1JfX1JBRElVUzoKKwkJCQlyZXR1cm4gcmFkaXVzICE9IFJBRElVU19FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGFuZ3VsYXJTdGVwOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChhbmd1bGFyU3RlcCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgcmFkaXVzOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChyYWRpdXMpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvaW1wbC9TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvaW1wbC9TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmViZjVjNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9pbXBsL1NxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvckltcGwuamF2YQpAQCAtMCwwICsxLDI4MCBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYXR0aWNlLkdyYXBoTGF0dGljZUdlbmVyYXRvckludGVyZmFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhdHRpY2UuaW1wbC5MYXR0aWNlR2VuZXJhdG9yVXRpbGl0eUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuR3JhcGhnZW5lcmF0b3JzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TcXVhcmUgTGF0dGljZSBHcmFwaCBHZW5lcmF0b3I8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9ySW1wbCNnZXRYU2l6ZSA8ZW0+WFNpemU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9ySW1wbCNnZXRZU2l6ZSA8ZW0+WVNpemU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLmltcGwuU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9ySW1wbCNnZXRBcmVhIDxlbT5BcmVhPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9ySW1wbCBleHRlbmRzIExhdHRpY2VHcmFwaEdlbmVyYXRvckltcGwgaW1wbGVtZW50cyBTcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYU2l6ZSgpIDxlbT5YU2l6ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0WFNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFhTSVpFX0VERUZBVUxUID0gMTA7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WFNpemUoKSA8ZW0+WFNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFhTaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IHhTaXplID0gWFNJWkVfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFlTaXplKCkgPGVtPllTaXplPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRZU2l6ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgWVNJWkVfRURFRkFVTFQgPSAxMDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRZU2l6ZSgpIDxlbT5ZU2l6ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0WVNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBpbnQgeVNpemUgPSBZU0laRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcmVhKCkgPGVtPkFyZWE8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFyZWEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIEFSRUFfRURFRkFVTFQgPSAyMDI1LjA7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJlYSgpIDxlbT5BcmVhPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBcmVhKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIGFyZWEgPSBBUkVBX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBTcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MaXRlcmFscy5TUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1I7CisJfQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0WFNpemUoKSB7CisJCXJldHVybiB4U2l6ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRYU2l6ZShpbnQgbmV3WFNpemUpIHsKKwkJaW50IG9sZFhTaXplID0geFNpemU7CisJCXhTaXplID0gbmV3WFNpemU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19YU0laRSwgb2xkWFNpemUsIHhTaXplKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRZU2l6ZSgpIHsKKwkJcmV0dXJuIHlTaXplOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFlTaXplKGludCBuZXdZU2l6ZSkgeworCQlpbnQgb2xkWVNpemUgPSB5U2l6ZTsKKwkJeVNpemUgPSBuZXdZU2l6ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5TUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1lTSVpFLCBvbGRZU2l6ZSwgeVNpemUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldEFyZWEoKSB7CisJCXJldHVybiBhcmVhOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEFyZWEoZG91YmxlIG5ld0FyZWEpIHsKKwkJZG91YmxlIG9sZEFyZWEgPSBhcmVhOworCQlhcmVhID0gbmV3QXJlYTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5TUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX0FSRUEsIG9sZEFyZWEsIGFyZWEpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19YU0laRToKKwkJCQlyZXR1cm4gZ2V0WFNpemUoKTsKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5TUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1lTSVpFOgorCQkJCXJldHVybiBnZXRZU2l6ZSgpOworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlNRVUFSRV9MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fQVJFQToKKwkJCQlyZXR1cm4gZ2V0QXJlYSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19YU0laRToKKwkJCQlzZXRYU2l6ZSgoSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlNRVUFSRV9MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fWVNJWkU6CisJCQkJc2V0WVNpemUoKEludGVnZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5TUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX0FSRUE6CisJCQkJc2V0QXJlYSgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlNRVUFSRV9MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fWFNJWkU6CisJCQkJc2V0WFNpemUoWFNJWkVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5TUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1lTSVpFOgorCQkJCXNldFlTaXplKFlTSVpFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19BUkVBOgorCQkJCXNldEFyZWEoQVJFQV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19YU0laRToKKwkJCQlyZXR1cm4geFNpemUgIT0gWFNJWkVfRURFRkFVTFQ7CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19ZU0laRToKKwkJCQlyZXR1cm4geVNpemUgIT0gWVNJWkVfRURFRkFVTFQ7CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19BUkVBOgorCQkJCXJldHVybiBhcmVhICE9IEFSRUFfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiICh4U2l6ZTogIik7CisJCXJlc3VsdC5hcHBlbmQoeFNpemUpOworCQlyZXN1bHQuYXBwZW5kKCIsIHlTaXplOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCh5U2l6ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgYXJlYTogIik7CisJCXJlc3VsdC5hcHBlbmQoYXJlYSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIEBzZWUgTGF0dGljZUdlbmVyYXRvclV0aWxpdHlJbXBsCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEdyYXBoIGdldEdyYXBoKCkgeworCQlMYXR0aWNlR2VuZXJhdG9yVXRpbGl0eUltcGwgc2xnaSA9IG5ldyBMYXR0aWNlR2VuZXJhdG9yVXRpbGl0eUltcGwoR3JhcGhMYXR0aWNlR2VuZXJhdG9ySW50ZXJmYWNlLlNRUl9MQVRUSUNFX1RZUEUpOworCQkvLyBHZXQgdGhlIGdyYXBoCisJCUdyYXBoIGcgPSBzbGdpLmdldEdyYXBoKHRoaXMuZ2V0WFNpemUoKSwgdGhpcy5nZXRZU2l6ZSgpLCB0aGlzLmFyZWEsIHRoaXMuaXNVc2VOZWFyZXN0TmVpZ2hib3JzKCksIHRoaXMuaXNVc2VOZXh0TmVhcmVzdE5laWdoYm9ycygpLCB0aGlzLmlzUGVyaW9kaWNCb3VuZGFyaWVzKCkpOworCQlyZXR1cm4gZzsKKwl9Cit9IC8vU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9ySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL3Byb3ZpZGVyL0dyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvcHJvdmlkZXIvR3JhcGhHZW5lcmF0b3JJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGVmY2QxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL3Byb3ZpZGVyL0dyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZCQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5wcm92aWRlcjsKKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5JZGVudGlmaWFibGVJdGVtUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaEdlbmVyYXRvcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkdyYXBoR2VuZXJhdG9yfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgSWRlbnRpZmlhYmxlSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBHcmFwaEdlbmVyYXRvci5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9HcmFwaEdlbmVyYXRvciIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChHcmFwaEdlbmVyYXRvcilvYmplY3QpLmdldFVSSSgpOworCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0dyYXBoR2VuZXJhdG9yX3R5cGUiKSA6CisJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaEdlbmVyYXRvcl90eXBlIikgKyAiICIgKyBsYWJlbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIEdyYXBoZ2VuZXJhdG9yRWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9wcm92aWRlci9HcmFwaGdlbmVyYXRvckVkaXRQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9wcm92aWRlci9HcmFwaGdlbmVyYXRvckVkaXRQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODZhNThlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL3Byb3ZpZGVyL0dyYXBoZ2VuZXJhdG9yRWRpdFBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZCQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5wcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUVkaXRQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgR3JhcGhnZW5lcmF0b3IgZWRpdCBwbHVnaW4uCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBHcmFwaGdlbmVyYXRvckVkaXRQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4geworCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEdyYXBoZ2VuZXJhdG9yRWRpdFBsdWdpbiBJTlNUQU5DRSA9IG5ldyBHcmFwaGdlbmVyYXRvckVkaXRQbHVnaW4oKTsKKworCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHcmFwaGdlbmVyYXRvckVkaXRQbHVnaW4oKSB7CisJCXN1cGVyCisJCSAgKG5ldyBSZXNvdXJjZUxvY2F0b3IgW10geworCQkgICAgIENvcmVFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkgICAgIEVjb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJICAgfSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOworCisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgorCQkJLy8KKwkJCXBsdWdpbiA9IHRoaXM7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9wcm92aWRlci9HcmFwaGdlbmVyYXRvcnNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL3Byb3ZpZGVyL0dyYXBoZ2VuZXJhdG9yc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzOTEwNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9wcm92aWRlci9HcmFwaGdlbmVyYXRvcnNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjc1IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMucHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLnV0aWwuR3JhcGhnZW5lcmF0b3JzQWRhcHRlckZhY3Rvcnk7CisKKy8qKgorICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLgorICogVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uCisgKiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgorICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR3JhcGhnZW5lcmF0b3JzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBHcmFwaGdlbmVyYXRvcnNBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR3JhcGhnZW5lcmF0b3JzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcn0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JJdGVtUHJvdmlkZXIgc3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yQWRhcHRlcigpIHsKKwkJaWYgKHNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlzcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JJdGVtUHJvdmlkZXIgPSBuZXcgU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLk1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcn0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JJdGVtUHJvdmlkZXIgbWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLk1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yQWRhcHRlcigpIHsKKwkJaWYgKG1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQltaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JJdGVtUHJvdmlkZXIgPSBuZXcgTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIG1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcn0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JJdGVtUHJvdmlkZXIgcGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yQWRhcHRlcigpIHsKKwkJaWYgKHBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlwbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JJdGVtUHJvdmlkZXIgPSBuZXcgUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlBhamVrTmV0R3JhcGhHZW5lcmF0b3J9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGFqZWtOZXRHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlciBwYWpla05ldEdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlBhamVrTmV0R3JhcGhHZW5lcmF0b3J9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhamVrTmV0R3JhcGhHZW5lcmF0b3JBZGFwdGVyKCkgeworCQlpZiAocGFqZWtOZXRHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQlwYWpla05ldEdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyID0gbmV3IFBhamVrTmV0R3JhcGhHZW5lcmF0b3JJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gcGFqZWtOZXRHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgeworCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7CisJCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7CisJCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7CisJCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3M8Pz4pIHx8ICgoKENsYXNzPD8+KXR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7CisJCQkJcmV0dXJuIGFkYXB0ZXI7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn0gYW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKworCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgeworCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJaWYgKHNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlciAhPSBudWxsKSBzcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAobWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyICE9IG51bGwpIG1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmIChwbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JJdGVtUHJvdmlkZXIgIT0gbnVsbCkgcGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKHBhamVrTmV0R3JhcGhHZW5lcmF0b3JJdGVtUHJvdmlkZXIgIT0gbnVsbCkgcGFqZWtOZXRHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvcHJvdmlkZXIvTGF0dGljZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvcHJvdmlkZXIvTGF0dGljZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ5M2IzYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9wcm92aWRlci9MYXR0aWNlR3JhcGhHZW5lcmF0b3JJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE4NyBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLnByb3ZpZGVyOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkxhdHRpY2VHcmFwaEdlbmVyYXRvcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkxhdHRpY2VHcmFwaEdlbmVyYXRvcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTGF0dGljZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGF0dGljZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZFVzZU5lYXJlc3ROZWlnaGJvcnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFVzZU5leHROZWFyZXN0TmVpZ2hib3JzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRQZXJpb2RpY0JvdW5kYXJpZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFVzZSBOZWFyZXN0IE5laWdoYm9ycyBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFVzZU5lYXJlc3ROZWlnaGJvcnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9MYXR0aWNlR3JhcGhHZW5lcmF0b3JfdXNlTmVhcmVzdE5laWdoYm9yc19mZWF0dXJlIiksCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTGF0dGljZUdyYXBoR2VuZXJhdG9yX3VzZU5lYXJlc3ROZWlnaGJvcnNfZmVhdHVyZSIsICJfVUlfTGF0dGljZUdyYXBoR2VuZXJhdG9yX3R5cGUiKSwKKwkJCQkgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MaXRlcmFscy5MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fVVNFX05FQVJFU1RfTkVJR0hCT1JTLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBVc2UgTmV4dCBOZWFyZXN0IE5laWdoYm9ycyBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFVzZU5leHROZWFyZXN0TmVpZ2hib3JzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTGF0dGljZUdyYXBoR2VuZXJhdG9yX3VzZU5leHROZWFyZXN0TmVpZ2hib3JzX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9MYXR0aWNlR3JhcGhHZW5lcmF0b3JfdXNlTmV4dE5lYXJlc3ROZWlnaGJvcnNfZmVhdHVyZSIsICJfVUlfTGF0dGljZUdyYXBoR2VuZXJhdG9yX3R5cGUiKSwKKwkJCQkgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MaXRlcmFscy5MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fVVNFX05FWFRfTkVBUkVTVF9ORUlHSEJPUlMsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBlcmlvZGljIEJvdW5kYXJpZXMgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRQZXJpb2RpY0JvdW5kYXJpZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9MYXR0aWNlR3JhcGhHZW5lcmF0b3JfcGVyaW9kaWNCb3VuZGFyaWVzX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9MYXR0aWNlR3JhcGhHZW5lcmF0b3JfcGVyaW9kaWNCb3VuZGFyaWVzX2ZlYXR1cmUiLCAiX1VJX0xhdHRpY2VHcmFwaEdlbmVyYXRvcl90eXBlIiksCisJCQkJIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTGl0ZXJhbHMuTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1BFUklPRElDX0JPVU5EQVJJRVMsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlVUkkgbGFiZWxWYWx1ZSA9ICgoTGF0dGljZUdyYXBoR2VuZXJhdG9yKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfTGF0dGljZUdyYXBoR2VuZXJhdG9yX3R5cGUiKSA6CisJCQlnZXRTdHJpbmcoIl9VSV9MYXR0aWNlR3JhcGhHZW5lcmF0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7CisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTGF0dGljZUdyYXBoR2VuZXJhdG9yLmNsYXNzKSkgeworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19VU0VfTkVBUkVTVF9ORUlHSEJPUlM6CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1VTRV9ORVhUX05FQVJFU1RfTkVJR0hCT1JTOgorCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19QRVJJT0RJQ19CT1VOREFSSUVTOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvcHJvdmlkZXIvTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvcHJvdmlkZXIvTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUzZWU2NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9wcm92aWRlci9NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLnByb3ZpZGVyOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLk1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLk1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZExvY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRNaWdyYXRpb25SYXRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRQb3B1bGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMb2NhdGlvbiBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZExvY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yX2xvY2F0aW9uX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JfbG9jYXRpb25fZmVhdHVyZSIsICJfVUlfTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yX3R5cGUiKSwKKwkJCQkgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MaXRlcmFscy5NSUdSQVRJT05fRURHRV9HUkFQSF9HRU5FUkFUT1JfX0xPQ0FUSU9OLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNaWdyYXRpb24gUmF0ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZE1pZ3JhdGlvblJhdGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JfbWlncmF0aW9uUmF0ZV9mZWF0dXJlIiksCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yX21pZ3JhdGlvblJhdGVfZmVhdHVyZSIsICJfVUlfTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yX3R5cGUiKSwKKwkJCQkgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MaXRlcmFscy5NSUdSQVRJT05fRURHRV9HUkFQSF9HRU5FUkFUT1JfX01JR1JBVElPTl9SQVRFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQb3B1bGF0aW9uIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkUG9wdWxhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX01pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcl9wb3B1bGF0aW9uX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JfcG9wdWxhdGlvbl9mZWF0dXJlIiwgIl9VSV9NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JfdHlwZSIpLAorCQkJCSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxpdGVyYWxzLk1JR1JBVElPTl9FREdFX0dSQVBIX0dFTkVSQVRPUl9fUE9QVUxBVElPTiwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L01pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvciIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3Ipb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3JfdHlwZSIpIDoKKwkJCWdldFN0cmluZygiX1VJX01pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcl90eXBlIikgKyAiICIgKyBsYWJlbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IuY2xhc3MpKSB7CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfR1JBUEhfR0VORVJBVE9SX19MT0NBVElPTjoKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5NSUdSQVRJT05fRURHRV9HUkFQSF9HRU5FUkFUT1JfX01JR1JBVElPTl9SQVRFOgorCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLk1JR1JBVElPTl9FREdFX0dSQVBIX0dFTkVSQVRPUl9fUE9QVUxBVElPTjoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL3Byb3ZpZGVyL1BhamVrTmV0R3JhcGhHZW5lcmF0b3JJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9wcm92aWRlci9QYWpla05ldEdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0MzU1MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9wcm92aWRlci9QYWpla05ldEdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMjYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMucHJvdmlkZXI7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorKg0KKyogQ29udHJpYnV0b3JzOg0KKyogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuR3JhcGhnZW5lcmF0b3JzUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuUGFqZWtOZXRHcmFwaEdlbmVyYXRvcjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlBhamVrTmV0R3JhcGhHZW5lcmF0b3J9IG9iamVjdC4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFqZWtOZXRHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIEdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFqZWtOZXRHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCQlhZGREYXRhRmlsZV9uZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGRBcmVhUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkWm9vbUZhY3RvclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJCWFkZENvbEFyZWFQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERhdGEgRmlsZSBuZXQgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZERhdGFGaWxlX25ldFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUGFqZWtOZXRHcmFwaEdlbmVyYXRvcl9kYXRhRmlsZV9uZXRfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QYWpla05ldEdyYXBoR2VuZXJhdG9yX2RhdGFGaWxlX25ldF9mZWF0dXJlIiwgIl9VSV9QYWpla05ldEdyYXBoR2VuZXJhdG9yX3R5cGUiKSwNCisJCQkJIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTGl0ZXJhbHMuUEFKRUtfTkVUX0dSQVBIX0dFTkVSQVRPUl9fREFUQV9GSUxFX05FVCwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFyZWEgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZEFyZWFQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1BhamVrTmV0R3JhcGhHZW5lcmF0b3JfYXJlYV9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BhamVrTmV0R3JhcGhHZW5lcmF0b3JfYXJlYV9mZWF0dXJlIiwgIl9VSV9QYWpla05ldEdyYXBoR2VuZXJhdG9yX3R5cGUiKSwNCisJCQkJIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTGl0ZXJhbHMuUEFKRUtfTkVUX0dSQVBIX0dFTkVSQVRPUl9fQVJFQSwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFpvb20gRmFjdG9yIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRab29tRmFjdG9yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9QYWpla05ldEdyYXBoR2VuZXJhdG9yX3pvb21GYWN0b3JfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QYWpla05ldEdyYXBoR2VuZXJhdG9yX3pvb21GYWN0b3JfZmVhdHVyZSIsICJfVUlfUGFqZWtOZXRHcmFwaEdlbmVyYXRvcl90eXBlIiksDQorCQkJCSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxpdGVyYWxzLlBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX1pPT01fRkFDVE9SLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbCBBcmVhIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDb2xBcmVhUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9QYWpla05ldEdyYXBoR2VuZXJhdG9yX2NvbEFyZWFfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QYWpla05ldEdyYXBoR2VuZXJhdG9yX2NvbEFyZWFfZmVhdHVyZSIsICJfVUlfUGFqZWtOZXRHcmFwaEdlbmVyYXRvcl90eXBlIiksDQorCQkJCSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxpdGVyYWxzLlBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX0NPTF9BUkVBLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIFBhamVrTmV0R3JhcGhHZW5lcmF0b3IuZ2lmLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgew0KKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1BhamVrTmV0R3JhcGhHZW5lcmF0b3IiKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCisJCVVSSSBsYWJlbFZhbHVlID0gKChQYWpla05ldEdyYXBoR2VuZXJhdG9yKW9iamVjdCkuZ2V0VVJJKCk7DQorCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOw0KKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQorCQkJZ2V0U3RyaW5nKCJfVUlfUGFqZWtOZXRHcmFwaEdlbmVyYXRvcl90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX1BhamVrTmV0R3JhcGhHZW5lcmF0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisNCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQYWpla05ldEdyYXBoR2VuZXJhdG9yLmNsYXNzKSkgew0KKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5QQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SX19EQVRBX0ZJTEVfTkVUOg0KKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5QQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SX19BUkVBOg0KKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5QQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SX19aT09NX0ZBQ1RPUjoNCisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuUEFKRUtfTkVUX0dSQVBIX0dFTkVSQVRPUl9fQ09MX0FSRUE6DQorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL3Byb3ZpZGVyL1BsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL3Byb3ZpZGVyL1BsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYzA0NzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvcHJvdmlkZXIvUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNzYgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZCQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5wcm92aWRlcjsKKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JJdGVtUHJvdmlkZXIKKwlleHRlbmRzIExhdHRpY2VHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZEFuZ3VsYXJTdGVwUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRSYWRpdXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFuZ3VsYXIgU3RlcCBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEFuZ3VsYXJTdGVwUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yX2FuZ3VsYXJTdGVwX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JfYW5ndWxhclN0ZXBfZmVhdHVyZSIsICJfVUlfUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yX3R5cGUiKSwKKwkJCQkgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MaXRlcmFscy5QTEFURV9DQVJSRUVfR0xPQkVfR1JBUEhfR0VORVJBVE9SX19BTkdVTEFSX1NURVAsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSYWRpdXMgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRSYWRpdXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JfcmFkaXVzX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3JfcmFkaXVzX2ZlYXR1cmUiLCAiX1VJX1BsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcl90eXBlIiksCisJCQkJIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTGl0ZXJhbHMuUExBVEVfQ0FSUkVFX0dMT0JFX0dSQVBIX0dFTkVSQVRPUl9fUkFESVVTLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yIikpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKFBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcilvYmplY3QpLmdldFVSSSgpOworCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1BsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcl90eXBlIikgOgorCQkJZ2V0U3RyaW5nKCJfVUlfUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yX3R5cGUiKSArICIgIiArIGxhYmVsOworCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvci5jbGFzcykpIHsKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5QTEFURV9DQVJSRUVfR0xPQkVfR1JBUEhfR0VORVJBVE9SX19BTkdVTEFSX1NURVA6CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuUExBVEVfQ0FSUkVFX0dMT0JFX0dSQVBIX0dFTkVSQVRPUl9fUkFESVVTOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvcHJvdmlkZXIvU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvcHJvdmlkZXIvU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4MmE4OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9wcm92aWRlci9TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLnByb3ZpZGVyOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLlNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9ySXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBMYXR0aWNlR3JhcGhHZW5lcmF0b3JJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRYU2l6ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkWVNpemVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZEFyZWFQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFhTaXplIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkWFNpemVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JfeFNpemVfZmVhdHVyZSIpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcl94U2l6ZV9mZWF0dXJlIiwgIl9VSV9TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JfdHlwZSIpLAorCQkJCSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxpdGVyYWxzLlNRVUFSRV9MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fWFNJWkUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBZU2l6ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFlTaXplUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yX3lTaXplX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JfeVNpemVfZmVhdHVyZSIsICJfVUlfU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yX3R5cGUiKSwKKwkJCQkgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MaXRlcmFscy5TUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1lTSVpFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuSU5URUdSQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXJlYSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEFyZWFQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JfYXJlYV9mZWF0dXJlIiksCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yX2FyZWFfZmVhdHVyZSIsICJfVUlfU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yX3R5cGUiKSwKKwkJCQkgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MaXRlcmFscy5TUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX0FSRUEsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvci5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IiKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlVUkkgbGFiZWxWYWx1ZSA9ICgoU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yX3R5cGUiKSA6CisJCQlnZXRTdHJpbmcoIl9VSV9TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7CisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yLmNsYXNzKSkgeworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlNRVUFSRV9MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fWFNJWkU6CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19ZU0laRToKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5TUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX0FSRUE6CisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy91dGlsL0dyYXBoZ2VuZXJhdG9yc0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvdXRpbC9HcmFwaGdlbmVyYXRvcnNBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNmU2OWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvdXRpbC9HcmFwaGdlbmVyYXRvcnNBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjUyIEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy4qOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuR3JhcGhnZW5lcmF0b3JzUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR3JhcGhnZW5lcmF0b3JzQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UgbW9kZWxQYWNrYWdlOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHcmFwaGdlbmVyYXRvcnNBZGFwdGVyRmFjdG9yeSgpIHsKKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7CisJCQltb2RlbFBhY2thZ2UgPSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7CisJCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgR3JhcGhnZW5lcmF0b3JzU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0KKwkJbmV3IEdyYXBoZ2VuZXJhdG9yc1N3aXRjaDxBZGFwdGVyPigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUdyYXBoR2VuZXJhdG9yKEdyYXBoR2VuZXJhdG9yIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVHcmFwaEdlbmVyYXRvckFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUxhdHRpY2VHcmFwaEdlbmVyYXRvcihMYXR0aWNlR3JhcGhHZW5lcmF0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUxhdHRpY2VHcmFwaEdlbmVyYXRvckFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcihTcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvckFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcihNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZU1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvckFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcihQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvckFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVBhamVrTmV0R3JhcGhHZW5lcmF0b3IoUGFqZWtOZXRHcmFwaEdlbmVyYXRvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUGFqZWtOZXRHcmFwaEdlbmVyYXRvckFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIDxUPiBBZGFwdGVyIGNhc2VDb21wYXJhYmxlKENvbXBhcmFibGU8VD4gb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUNvbXBhcmFibGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVJZGVudGlmaWFibGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgorCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgeworCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKKwl9CisKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuR3JhcGhHZW5lcmF0b3IgPGVtPkdyYXBoIEdlbmVyYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaEdlbmVyYXRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaEdlbmVyYXRvckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuTGF0dGljZUdyYXBoR2VuZXJhdG9yIDxlbT5MYXR0aWNlIEdyYXBoIEdlbmVyYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5MYXR0aWNlR3JhcGhHZW5lcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTGF0dGljZUdyYXBoR2VuZXJhdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IgPGVtPlNxdWFyZSBMYXR0aWNlIEdyYXBoIEdlbmVyYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5TcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IgPGVtPk1pZ3JhdGlvbiBFZGdlIEdyYXBoIEdlbmVyYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IgPGVtPlBsYXRlIENhcnJlZSBHbG9iZSBHcmFwaCBHZW5lcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuUGFqZWtOZXRHcmFwaEdlbmVyYXRvciA8ZW0+UGFqZWsgTmV0IEdyYXBoIEdlbmVyYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5QYWpla05ldEdyYXBoR2VuZXJhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhamVrTmV0R3JhcGhHZW5lcmF0b3JBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmEubGFuZy5Db21wYXJhYmxlIDxlbT5Db21wYXJhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhcmFibGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlIDxlbT5JZGVudGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL0dyYXBoZ2VuZXJhdG9yc0FkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvdXRpbC9HcmFwaGdlbmVyYXRvcnNTd2l0Y2guamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy91dGlsL0dyYXBoZ2VuZXJhdG9yc1N3aXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZjRmMTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvdXRpbC9HcmFwaGdlbmVyYXRvcnNTd2l0Y2guamF2YQpAQCAtMCwwICsxLDI4NiBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLio7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCisgKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9CisgKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCisgKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAorICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQorICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCisgKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuR3JhcGhnZW5lcmF0b3JzUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR3JhcGhnZW5lcmF0b3JzU3dpdGNoPFQxPiB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR3JhcGhnZW5lcmF0b3JzU3dpdGNoKCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUMSBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKKwkJfQorCQllbHNlIHsKKwkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOworCQkJcmV0dXJuCisJCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KKwkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgorCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuR1JBUEhfR0VORVJBVE9SOiB7CisJCQkJR3JhcGhHZW5lcmF0b3IgZ3JhcGhHZW5lcmF0b3IgPSAoR3JhcGhHZW5lcmF0b3IpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlR3JhcGhHZW5lcmF0b3IoZ3JhcGhHZW5lcmF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShncmFwaEdlbmVyYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShncmFwaEdlbmVyYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxBVFRJQ0VfR1JBUEhfR0VORVJBVE9SOiB7CisJCQkJTGF0dGljZUdyYXBoR2VuZXJhdG9yIGxhdHRpY2VHcmFwaEdlbmVyYXRvciA9IChMYXR0aWNlR3JhcGhHZW5lcmF0b3IpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlTGF0dGljZUdyYXBoR2VuZXJhdG9yKGxhdHRpY2VHcmFwaEdlbmVyYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3JhcGhHZW5lcmF0b3IobGF0dGljZUdyYXBoR2VuZXJhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUobGF0dGljZUdyYXBoR2VuZXJhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKGxhdHRpY2VHcmFwaEdlbmVyYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlNRVUFSRV9MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUjogeworCQkJCVNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvciBzcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IgPSAoU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcihzcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhdHRpY2VHcmFwaEdlbmVyYXRvcihzcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUdyYXBoR2VuZXJhdG9yKHNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShzcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5NSUdSQVRJT05fRURHRV9HUkFQSF9HRU5FUkFUT1I6IHsKKwkJCQlNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IgbWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yID0gKE1pZ3JhdGlvbkVkZ2VHcmFwaEdlbmVyYXRvcil0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IobWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHcmFwaEdlbmVyYXRvcihtaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShtaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUobWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuUExBVEVfQ0FSUkVFX0dMT0JFX0dSQVBIX0dFTkVSQVRPUjogeworCQkJCVBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvciBwbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IgPSAoUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcihwbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhdHRpY2VHcmFwaEdlbmVyYXRvcihwbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUdyYXBoR2VuZXJhdG9yKHBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHBsYXRlQ2FycmVlR2xvYmVHcmFwaEdlbmVyYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShwbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5QQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SOiB7CisJCQkJUGFqZWtOZXRHcmFwaEdlbmVyYXRvciBwYWpla05ldEdyYXBoR2VuZXJhdG9yID0gKFBhamVrTmV0R3JhcGhHZW5lcmF0b3IpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlUGFqZWtOZXRHcmFwaEdlbmVyYXRvcihwYWpla05ldEdyYXBoR2VuZXJhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHcmFwaEdlbmVyYXRvcihwYWpla05ldEdyYXBoR2VuZXJhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUocGFqZWtOZXRHcmFwaEdlbmVyYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShwYWpla05ldEdyYXBoR2VuZXJhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBHZW5lcmF0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBHZW5lcmF0b3I8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlR3JhcGhHZW5lcmF0b3IoR3JhcGhHZW5lcmF0b3Igb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxhdHRpY2UgR3JhcGggR2VuZXJhdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGF0dGljZSBHcmFwaCBHZW5lcmF0b3I8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTGF0dGljZUdyYXBoR2VuZXJhdG9yKExhdHRpY2VHcmFwaEdlbmVyYXRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3F1YXJlIExhdHRpY2UgR3JhcGggR2VuZXJhdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3F1YXJlIExhdHRpY2UgR3JhcGggR2VuZXJhdG9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcihTcXVhcmVMYXR0aWNlR3JhcGhHZW5lcmF0b3Igb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pZ3JhdGlvbiBFZGdlIEdyYXBoIEdlbmVyYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pZ3JhdGlvbiBFZGdlIEdyYXBoIEdlbmVyYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IoTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QbGF0ZSBDYXJyZWUgR2xvYmUgR3JhcGggR2VuZXJhdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGxhdGUgQ2FycmVlIEdsb2JlIEdyYXBoIEdlbmVyYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IoUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWplayBOZXQgR3JhcGggR2VuZXJhdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFqZWsgTmV0IEdyYXBoIEdlbmVyYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VQYWpla05ldEdyYXBoR2VuZXJhdG9yKFBhamVrTmV0R3JhcGhHZW5lcmF0b3Igb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgPFQ+IFQxIGNhc2VDb21wYXJhYmxlKENvbXBhcmFibGU8VD4gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9HcmFwaGdlbmVyYXRvcnNTd2l0Y2gKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5tb2RlbHMvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5tb2RlbHMvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRlODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLm1vZGVscy8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMubW9kZWxzLy5jdnNpZ25vcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMubW9kZWxzLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1OTVhNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5tb2RlbHMvLmN2c2lnbm9yZQpAQCAtMCwwICsxIEBACit0ZW1wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMubW9kZWxzLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLm1vZGVscy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjQ2MTdlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLm1vZGVscy8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMubW9kZWxzPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5tb2RlbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLm1vZGVscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiNjJjYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5tb2RlbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsMjEgQEAKKyNUdWUgU2VwIDAxIDE2OjU5OjUwIEVEVCAyMDA5CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb249cmV0dXJuX3RhZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5tb2RlbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMubW9kZWxzL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODA5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMubW9kZWxzL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMTkgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6IFNURU0gSW50ZXJuYWwgRGlzZWFzZSBNb2RlbHMKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5tb2RlbHMKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHksCisgb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmRpc2Vhc2Vtb2RlbHMubW9kZWxzLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscywKKyBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMsCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcywKKyBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEsCisgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlb2dyYXBoeSwKKyBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VvZ3JhcGh5Lm1vZGVscywKKyBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LnBvcHVsYXRpb24uaHVtYW4ubW9kZWxzCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLm1vZGVscy9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLm1vZGVscy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZDJlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMubW9kZWxzL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0IEBACitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLworYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vaW50ZXJuYWwvZGF0YS9zcGVjaWZpY2F0aW9ucy9EaXNlYXNlTW9kZWxNb2RlbFNwZWNpZmljYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vaW50ZXJuYWwvZGF0YS9zcGVjaWZpY2F0aW9ucy9EaXNlYXNlTW9kZWxNb2RlbFNwZWNpZmljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTIzZDlhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9pbnRlcm5hbC9kYXRhL3NwZWNpZmljYXRpb25zL0Rpc2Vhc2VNb2RlbE1vZGVsU3BlY2lmaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjExIEBACisvLyBEaXNlYXNlTW9kZWxNb2RlbFNwZWNpZmljYXRpb24uamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuc3BlY2lmaWNhdGlvbnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlV0aWxpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5JU09LZXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW5lcmF0ZWRwbHVnaW4uRHVibGluQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VvZ3JhcGh5LnNwZWNpZmljYXRpb25zLkFkbWluTGV2ZWxTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlb2dyYXBoeS5zcGVjaWZpY2F0aW9ucy5Db3VudHJ5R3JhcGhQcm9wZXJ0eUZpbGVTcGVjaWZpY2F0aW9uOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHtAbGluayBNb2RlbFNwZWNpZmljYXRpb259IGZvciBhIERpc2Vhc2UgbW9kZWwuCisgKi8KK3B1YmxpYyBjbGFzcyBEaXNlYXNlTW9kZWxNb2RlbFNwZWNpZmljYXRpb24gZXh0ZW5kcyBNb2RlbFNwZWNpZmljYXRpb24KKwkJaW1wbGVtZW50cyBDb21wYXJhYmxlPERpc2Vhc2VNb2RlbE1vZGVsU3BlY2lmaWNhdGlvbj4geworCisJLyoqCisJICogVGhpcyBpcyByZWZlcmVuY2VkIHRvIGNhdXNlIHRoZSB7QGxpbmsgTW9kZWxQYWNrYWdlfSB0byByZWdpc3RlciBpdHNlbGYKKwkgKiBhcyBhIHBhY2thZ2UuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHJpdmF0ZSBmaW5hbCBNb2RlbFBhY2thZ2UgbW9kZWxQYWNrYWdlID0gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKKwlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwlwcml2YXRlIGZpbmFsIFN0YW5kYXJkUGFja2FnZSBzdGFuZGFyZFBhY2thZ2UgPSBTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFOworCisJcHJpdmF0ZSBmaW5hbCBEdWJsaW5Db3JlIHBvcHVsYXRpb25Nb2RlbERDOworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXByaXZhdGUgZmluYWwgRHVibGluQ29yZSBkaXNlYXNlTW9kZWxEQzsKKworCXByaXZhdGUgZmluYWwgRGlzZWFzZU1vZGVsIGRpc2Vhc2VNb2RlbDsKKwkKKwlwcml2YXRlIGZpbmFsIElTT0tleSBpc29LZXk7CisJcHJpdmF0ZSBmaW5hbCBBZG1pbkxldmVsU2V0IGFkbWluTGV2ZWxTZXQ7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGlzZWFzZU5hbWU7CisKKwlzdGF0aWMgeworCQkvLyBUaGlzIHNldHMgdXAgdGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgInBsYXRmb3JtIiBVUkkncyBhbmQgdGhlCisJCS8vIHByb2plY3RzIGluIHRoZSBmaWxlIHN5c3RlbS4KKworCQkvLyBDV0QgaXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKKwkJZmluYWwgU3RyaW5nIENXRCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBXT1JLU1BBQ0UgaXMgdGhlIGRpcmVjdG9yeSBvZiB0aGUgcGFyZW50IHdvcmtzcGFjZQorCQlmaW5hbCBTdHJpbmcgV09SS1NQQUNFID0gQ1dELnN1YnN0cmluZygwLCBDV0QKKwkJCQkubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpKTsKKworCQkvLyBUaGUgcGF0aCB0byB0aGUgZ2VuZXJhdGVkIHBvcHVsYXRpb24gZGF0YSBwcm9qZWN0CisJCWZpbmFsIFN0cmluZyBIVU1BTl9QT1BVTEFUSU9OX01PREVMU19QUk9KRUNUX1JPT1QgPSBXT1JLU1BBQ0UKKwkJCQkrIEZpbGUuc2VwYXJhdG9yCisJCQkJKyBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LnBvcHVsYXRpb24uaHVtYW4ubW9kZWxzLkFjdGl2YXRvci5QTFVHSU5fSUQKKwkJCQkrIEZpbGUuc2VwYXJhdG9yOworCisJCS8vIFRoZSBwYXRoIHRvIHRoZSBkaXNlYXNlcyBwcm9qZWN0CisJCWZpbmFsIFN0cmluZyBESVNFQVNFU19QUk9KRUNUX1JPT1QgPSBXT1JLU1BBQ0UgKyBGaWxlLnNlcGFyYXRvcgorCQkJCSsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcy5BY3RpdmF0b3IuUExVR0lOX0lECisJCQkJKyBGaWxlLnNlcGFyYXRvcjsKKworCQlmaW5hbCBNYXA8U3RyaW5nLCBVUkk+IHBsYXRmb3JtUmVzb3VyY2VNYXAgPSBFY29yZVBsdWdpbgorCQkJCS5nZXRQbGF0Zm9ybVJlc291cmNlTWFwKCk7CisKKwkJLy8gUmVnaXN0ZXIgdGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgcHJvamVjdCBpZCBhbmQgdGhlIGFic29sdXRlIHBhdGggdG8KKwkJLy8gdGhlIHByb2plY3QgaW4gdGhlIGZpbGUgc3lzdGVtLiBUaGlzIHdpbGwgYmUgZm91bmQgbGF0ZXIgd2hlbgorCQkvLyBkZXNlcmlhbGl6aW5nIHdoZW4gdGhlIHBsYXRmb3JtIFVSSSBpcyBtYXBwZWQuCisKKwkJcGxhdGZvcm1SZXNvdXJjZU1hcAorCQkJCS5wdXQoCisJCQkJCQlvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LnBvcHVsYXRpb24uaHVtYW4ubW9kZWxzLkFjdGl2YXRvci5QTFVHSU5fSUQsCisJCQkJCQlVUkkuY3JlYXRlRmlsZVVSSShIVU1BTl9QT1BVTEFUSU9OX01PREVMU19QUk9KRUNUX1JPT1QpKTsKKworCQlwbGF0Zm9ybVJlc291cmNlTWFwLnB1dCgKKwkJCQlvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzLkFjdGl2YXRvci5QTFVHSU5fSUQsIFVSSQorCQkJCQkJLmNyZWF0ZUZpbGVVUkkoRElTRUFTRVNfUFJPSkVDVF9ST09UKSk7CisJfSAvLyBzdGF0aWMKKworCS8qKgorCSAqIEBwYXJhbSBpc29LZXkKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgSVNPS2V5fSBmb3IgYSBzaW5nbGUgcmVnaW9uCisJICogQHBhcmFtIGxldmVsU2V0CisJICogICAgICAgICAgICB0aGUge0BsaW5rIEFkbWluTGV2ZWxTZXR9IGNvdmVyZWQKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbk1vZGVsREMKKwkgKiAgICAgICAgICAgIHtAbGluayBEdWJsaW5Db3JlfSBpbnN0YW5jZSB0aGF0IGRlc2NyaWJlcyB0aGUgcG9wdWxhdGlvbgorCSAqICAgICAgICAgICAgbW9kZWwKKwkgKiBAcGFyYW0gZGlzZWFzZU1vZGVsREMKKwkgKiAgICAgICAgICAgIHtAbGluayBEdWJsaW5Db3JlfSBpbnN0YW5jZSB0aGF0IGRlc2NyaWJlcyBhIGRpc2Vhc2UgbW9kZWwKKwkgKiBAcGFyYW0gZGlzZWFzZU1vZGVsIAorCSAqLworCXB1YmxpYyBEaXNlYXNlTW9kZWxNb2RlbFNwZWNpZmljYXRpb24oSVNPS2V5IGlzb0tleSwKKwkJCUFkbWluTGV2ZWxTZXQgbGV2ZWxTZXQsIER1YmxpbkNvcmUgcG9wdWxhdGlvbk1vZGVsREMsCisJCQlEdWJsaW5Db3JlIGRpc2Vhc2VNb2RlbERDLCBmaW5hbCBEaXNlYXNlTW9kZWwgZGlzZWFzZU1vZGVsKSB7CisJCXRoaXMuaXNvS2V5ID0gaXNvS2V5OworCQl0aGlzLmFkbWluTGV2ZWxTZXQgPSBsZXZlbFNldDsKKwkJdGhpcy5wb3B1bGF0aW9uTW9kZWxEQyA9IHBvcHVsYXRpb25Nb2RlbERDOworCQl0aGlzLmRpc2Vhc2VNb2RlbERDID0gZGlzZWFzZU1vZGVsREM7CisJCXRoaXMuZGlzZWFzZU1vZGVsID0gZGlzZWFzZU1vZGVsOworCQl0aGlzLmRpc2Vhc2VOYW1lID0gZGlzZWFzZU1vZGVsLmdldERpc2Vhc2VOYW1lKCk7CisJfSAvLyBEaXNlYXNlTW9kZWxNb2RlbFNwZWNpZmljYXRpb24KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLnNwZWNpZmljYXRpb25zLk1vZGVsU3BlY2lmaWNhdGlvbiNjcmVhdGVJZGVudGlmaWFibGVJbnN0YW5jZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE1vZGVsIGNyZWF0ZUlkZW50aWZpYWJsZUluc3RhbmNlKCkgeworCQlmaW5hbCBNb2RlbCByZXRWYWx1ZSA9IHN1cGVyLmNyZWF0ZUlkZW50aWZpYWJsZUluc3RhbmNlKCk7CisJCS8vIFRoZSBnZW5lcmF0ZWQgR3JhcGhzIGV0Yy4sIGFsbCBoYXZlIGR1YmxpbiBjb3JlIHRoYXQgcmVmZXJlbmNlcworCQkvLyB0aGVtIGFzIHBsdWdpbnMuIFRoaXMgaXMgYXMgaXQgc2hvdWxkIGJlIHdoZW4gU1RFTSBpcyBydW5uaW5nLAorCQkvLyBidXQgcmlnaHQgbm93IHdlJ3JlIHJ1bm5pbmcgc3RhbmQtYWxvbmUgYW5kIHdhbnQgdG8gYWNjZXNzIHRoZQorCQkvLyBwbHVnaW5zIGFzIHByb2plY3RzICh0aGV5IGFyZW4ndCBwbHVnZ2VkIGludG8gb3VyIHJ1bm5pbmcgdmVyc2lvbgorCQkvLyBvZiBFY2xpcHNlKS4gU3Vic3RpdHV0ZSAicmVzb3VyY2UiIGZvciAicGx1Z2luIiBpbiB0aGUgVVJJJ3Mgd2UKKwkJLy8gdXNlIGFuZCBhbGwgd2lsbCBiZSB3ZWxsLgorCisJCXJldFZhbHVlCisJCQkJLmdldE1vZGVscygpCisJCQkJLmFkZCgKKwkJCQkJCShNb2RlbCkgVXRpbGl0eQorCQkJCQkJCQkuZ2V0SWRlbnRpZmlhYmxlKGdldElkZW50aWZpYWJsZVByb2plY3RVUkkocG9wdWxhdGlvbk1vZGVsREMpKSk7CisJCQorCQlyZXRWYWx1ZS5nZXROb2RlRGVjb3JhdG9ycygpLmFkZChkaXNlYXNlTW9kZWwpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVJZGVudGlmaWFibGVJbnN0YW5jZQorCisJcHVibGljIGludCBjb21wYXJlVG8oRGlzZWFzZU1vZGVsTW9kZWxTcGVjaWZpY2F0aW9uIHBtcykgeworCQlyZXR1cm4gYWRtaW5MZXZlbFNldC5nZXROdW1BZG1pbkxldmVscygpID4gcG1zLmFkbWluTGV2ZWxTZXQKKwkJCQkuZ2V0TnVtQWRtaW5MZXZlbHMoKSA/IDEgOiAtMTsKKwl9IC8vIGNvbXBhcmVUbworCisJLyoqCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJc2IuYXBwZW5kKGlzb0tleSk7CisJCXNiLmFwcGVuZCgiOiIpOyAvLyROT04tTkxTLTEkCisJCXNiLmFwcGVuZChkaXNlYXNlTmFtZSk7CisJCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCisJCXNiLmFwcGVuZChhZG1pbkxldmVsU2V0LnRvU3RyaW5nKCkpOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9IC8vIHRvU3RyaW5nCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbGF0aXZlU2VyaWFsaXphdGlvblBhdGgoKSB7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlzYi5hcHBlbmQoQ291bnRyeUdyYXBoUHJvcGVydHlGaWxlU3BlY2lmaWNhdGlvbi5DT1VOVFJZX0RJUik7CisJCXNiLmFwcGVuZChGaWxlLnNlcGFyYXRvckNoYXIpOworCQlzYi5hcHBlbmQoaXNvS2V5LnRvU3RyaW5nKCkpOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25GaWxlTmFtZVJvb3QoKSB7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihpc29LZXkudG9TdHJpbmcoKSk7CisJCXNiLmFwcGVuZCgiXyIpOyAvLyROT04tTkxTLTEkCisJCXNiLmFwcGVuZChhZG1pbkxldmVsU2V0LnRvU3RyaW5nKCkpOworCQlzYi5hcHBlbmQoIl9kaXNlYXNlXyIpOyAvLyROT04tTkxTLTEkCisJCXNiLmFwcGVuZChkaXNlYXNlTmFtZS5yZXBsYWNlKCIgIiwgIl8iKSk7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldFBsdWdpbklkKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmRpc2Vhc2Vtb2RlbHMubW9kZWxzLkFjdGl2YXRvci5QTFVHSU5fSUQ7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZURlc2NyaXB0b3IoKSB7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihpc29LZXkudG9TdHJpbmcoKSk7CisJCXNiLmFwcGVuZCgiIERpc2Vhc2UgIik7IC8vJE5PTi1OTFMtMSQKKwkJc2IuYXBwZW5kKGRpc2Vhc2VOYW1lKTsKKwkJc2IKKwkJCQkuYXBwZW5kKGFkbWluTGV2ZWxTZXQuZ2V0TnVtQWRtaW5MZXZlbHMoKSA+IDEgPyAiIChMZXZlbHM6ICIgOiAiIChMZXZlbDogIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlzYi5hcHBlbmQoYWRtaW5MZXZlbFNldC50b1N0cmluZygiLCIpKTsgLy8kTk9OLU5MUy0xJAorCQlzYi5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5zcGVjaWZpY2F0aW9ucy5JZGVudGlmaWFibGVTcGVjaWZpY2F0aW9uI2NyZWF0ZUR1YmluQ29yZUNvdmVyYWdlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUR1YmluQ29yZUNvdmVyYWdlKCkgeworCQlyZXR1cm4gcG9wdWxhdGlvbk1vZGVsREMuZ2V0Q292ZXJhZ2UoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5zcGVjaWZpY2F0aW9ucy5JZGVudGlmaWFibGVTcGVjaWZpY2F0aW9uI2NyZWF0ZUR1YmluQ29yZVN1YmplY3QoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgY3JlYXRlRHViaW5Db3JlU3ViamVjdCgpIHsKKwkJcmV0dXJuIEdyYXBoUHJvcGVydHlGaWxlU3BlY2lmaWNhdGlvbi5jcmVhdGVEdWJsaW5Db3JlU3ViamVjdFN0cmluZygKKwkJCQlNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTU9ERUwuZ2V0TmFtZSgpLCAiZGlzZWFzZSIpOyAvLyROT04tTkxTLTEkCisJfQorCit9IC8vIERpc2Vhc2VNb2RlbE1vZGVsU3BlY2lmaWNhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vaW50ZXJuYWwvZGlzZWFzZW1vZGVscy9tb2RlbHMvRGlzZWFzZU1vZGVsTW9kZWxHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vaW50ZXJuYWwvZGlzZWFzZW1vZGVscy9tb2RlbHMvRGlzZWFzZU1vZGVsTW9kZWxHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzhmMWNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9pbnRlcm5hbC9kaXNlYXNlbW9kZWxzL21vZGVscy9EaXNlYXNlTW9kZWxNb2RlbEdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjY5IEBACisvLyBEaXNlYXNlTW9kZWxNb2RlbEdlbmVyYXRvci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5tb2RlbHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlV0aWxpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LklTT0tleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLk1vZGVsR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5QbHVnaW5GaWxlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW5lcmF0ZWRwbHVnaW4uRHVibGluQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VuZXJhdGVkcGx1Z2luLkV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VuZXJhdGVkcGx1Z2luLkdlbmVyYXRlZHBsdWdpbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlbmVyYXRlZHBsdWdpbi5QbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlbmVyYXRlZHBsdWdpbi5TdGVtQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlb2dyYXBoeS5tb2RlbHMuR2VvZ3JhcGh5TW9kZWxHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlb2dyYXBoeS5zcGVjaWZpY2F0aW9ucy5BZG1pbkxldmVsU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW9ncmFwaHkuc3BlY2lmaWNhdGlvbnMuQ291bnRyeUdyYXBoUHJvcGVydHlGaWxlU3BlY2lmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuc3BlY2lmaWNhdGlvbnMuRGlzZWFzZU1vZGVsTW9kZWxTcGVjaWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5zcGVjaWZpY2F0aW9ucy5JZGVudGlmaWFibGVTcGVjaWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5zcGVjaWZpY2F0aW9ucy5Nb2RlbFNwZWNpZmljYXRpb247CisKKy8qKgorICogVGhpcyBjbGFzcyBwcm9jZXNzZXMgdGhlIGdlbmVyYXRlZCBwb3B1bGF0aW9uIG1vZGVsIGZpbGVzIHRvIGNyZWF0ZSBEaXNlYXNlCisgKiBtb2RlbCBtb2RlbHMuCisgKi8KK3B1YmxpYyBjbGFzcyBEaXNlYXNlTW9kZWxNb2RlbEdlbmVyYXRvciBleHRlbmRzIEdlb2dyYXBoeU1vZGVsR2VuZXJhdG9yIHsKKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXByaXZhdGUgZmluYWwgU3RhbmRhcmRQYWNrYWdlIHN0YW5kYXJkUGFja2FnZSA9IFN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0U7CisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHJpdmF0ZSBmaW5hbCBNb2RlbFBhY2thZ2UgbW9kZWxQYWNrYWdlID0gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKKworCXN0YXRpYyB7CisJCS8vIFRoaXMgc2V0cyB1cCB0aGUgbWFwcGluZyBiZXR3ZWVuIHRoZSAicGxhdGZvcm0iIFVSSSdzIGFuZCB0aGUKKwkJLy8gcHJvamVjdHMgaW4gdGhlIGZpbGUgc3lzdGVtLgorCisJCS8vIENXRCBpcyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQorCQlmaW5hbCBTdHJpbmcgQ1dEID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOyAvLyROT04tTkxTLTEkCisJCS8vIFdPUktTUEFDRSBpcyB0aGUgZGlyZWN0b3J5IG9mIHRoZSBwYXJlbnQgd29ya3NwYWNlCisJCWZpbmFsIFN0cmluZyBXT1JLU1BBQ0UgPSBDV0Quc3Vic3RyaW5nKDAsIENXRAorCQkJCS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcikpOworCisJCS8vIFRoZSBwYXRoIHRvIHRoZSBnZW5lcmF0ZWQgcG9wdWxhdGlvbiBkYXRhIHByb2plY3QKKwkJZmluYWwgU3RyaW5nIEhVTUFOX1BPUFVMQVRJT05fTU9ERUxTX1BST0pFQ1RfUk9PVCA9IFdPUktTUEFDRQorCQkJCSsgRmlsZS5zZXBhcmF0b3IKKwkJCQkrIG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkucG9wdWxhdGlvbi5odW1hbi5tb2RlbHMuQWN0aXZhdG9yLlBMVUdJTl9JRAorCQkJCSsgRmlsZS5zZXBhcmF0b3I7CisKKwkJLy8gVGhlIHBhdGggdG8gdGhlIGRpc2Vhc2VzIHByb2plY3QKKwkJZmluYWwgU3RyaW5nIERJU0VBU0VTX1BST0pFQ1RfUk9PVCA9IFdPUktTUEFDRSArIEZpbGUuc2VwYXJhdG9yCisJCQkJKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzLkFjdGl2YXRvci5QTFVHSU5fSUQKKwkJCQkrIEZpbGUuc2VwYXJhdG9yOworCisJCWZpbmFsIE1hcDxTdHJpbmcsIFVSST4gcGxhdGZvcm1SZXNvdXJjZU1hcCA9IEVjb3JlUGx1Z2luCisJCQkJLmdldFBsYXRmb3JtUmVzb3VyY2VNYXAoKTsKKworCQkvLyBSZWdpc3RlciB0aGUgbWFwcGluZyBiZXR3ZWVuIHRoZSBwcm9qZWN0IGlkIGFuZCB0aGUgYWJzb2x1dGUgcGF0aCB0bworCQkvLyB0aGUgcHJvamVjdCBpbiB0aGUgZmlsZSBzeXN0ZW0uIFRoaXMgd2lsbCBiZSBmb3VuZCBsYXRlciB3aGVuCisJCS8vIGRlc2VyaWFsaXppbmcgd2hlbiB0aGUgcGxhdGZvcm0gVVJJIGlzIG1hcHBlZC4KKworCQlwbGF0Zm9ybVJlc291cmNlTWFwCisJCQkJLnB1dCgKKwkJCQkJCW9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkucG9wdWxhdGlvbi5odW1hbi5tb2RlbHMuQWN0aXZhdG9yLlBMVUdJTl9JRCwKKwkJCQkJCVVSSS5jcmVhdGVGaWxlVVJJKEhVTUFOX1BPUFVMQVRJT05fTU9ERUxTX1BST0pFQ1RfUk9PVCkpOworCisJCXBsYXRmb3JtUmVzb3VyY2VNYXAucHV0KAorCQkJCW9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXMuQWN0aXZhdG9yLlBMVUdJTl9JRCwgVVJJCisJCQkJCQkuY3JlYXRlRmlsZVVSSShESVNFQVNFU19QUk9KRUNUX1JPT1QpKTsKKwl9IC8vIHN0YXRpYworCisJLyoqCisJICogVGhlIGlkIG9mIHRoZSBEaXNlYXNlIE1vZGVsIGNhdGVnb3J5CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfTU9ERUxfRElTRUFTRV9DQVRFR09SWSA9IFBsdWdpbkZpbGVHZW5lcmF0b3IuSURfTU9ERUxfQ0FURUdPUlkKKwkJCSsgIi5kaXNlYXNlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQHBhcmFtIGFyZ3MKKwkgKiAgICAgICAgICAgIFswXSB0aGUgVVJJIG9mIHRoZSBnZW5lcmF0ZWQgcG9wdWxhdGlvbiBtb2RlbCBwbHVnaW4ueG1sIGZpbGUKKwkgKiAgICAgICAgICAgIFsxXSB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB3aXRoIHRoZSBwb3B1bGF0aW9uIG1vZGVscyBbMl0gdGhlCisJICogICAgICAgICAgICBuYW1lIG9mIHRoZSBwcm9qZWN0IHdpdGggdGhlIGRpc2Vhc2UgbW9kZWxzCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJncykgeworCQkvLyBJcyB0aGUgcGx1Z2luIGZpbGUgc3BlY2lmaWVkPworCQlpZiAoYXJncy5sZW5ndGggPT0gMCkgeworCQkJLy8gWWVzCisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIk1pc3Npbmcgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcGx1Z2luIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQl9IC8vIGlmCisJCWVsc2UgeworCisJCQlmaW5hbCBTdHJpbmcgR0VORVJBVEVEX0ZJTEVTX1BBVEggPSBhcmdzWzBdOworCisJCQlmaW5hbCBTdHJpbmcgcG9wdWxhdGlvbk1vZGVsUHJvamVjdE5hbWUgPSBhcmdzWzFdOworCQkJZmluYWwgU3RyaW5nIGRpc2Vhc2VNb2RlbFByb2plY3ROYW1lID0gYXJnc1syXTsKKworCQkJZmluYWwgU3RyaW5nIEdFTkVSQVRFRF9NT0RFTFNfUEFUSCA9IEdFTkVSQVRFRF9GSUxFU19QQVRICisJCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyAicmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICsgImRhdGEiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJZmluYWwgRmlsZSBwb3B1bGF0aW9uTW9kZWxQbHVnaW5GaWxlID0gbmV3IEZpbGUoCisJCQkJCSIuLiIJKyBGaWxlLnNlcGFyYXRvciArIHBvcHVsYXRpb25Nb2RlbFByb2plY3ROYW1lICsgRmlsZS5zZXBhcmF0b3IgKyBQbHVnaW5GaWxlR2VuZXJhdG9yLlBMVUdJTl9YTUxfRklMRV9OQU1FKTsgLy8kTk9OLU5MUy0xJAorCQkJZmluYWwgVVJJIHBvcHVsYXRpb25Nb2RlbFBsdWdpbkZpbGVVUkkgPSBVUkkKKwkJCQkJLmNyZWF0ZUZpbGVVUkkocG9wdWxhdGlvbk1vZGVsUGx1Z2luRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKwkJCWZpbmFsIEZpbGUgZGlzZWFzZU1vZGVsUGx1Z2luRmlsZSA9IG5ldyBGaWxlKAorCQkJCQkiLi4iCSsgRmlsZS5zZXBhcmF0b3IgKyBkaXNlYXNlTW9kZWxQcm9qZWN0TmFtZSArIEZpbGUuc2VwYXJhdG9yICsgUGx1Z2luRmlsZUdlbmVyYXRvci5QTFVHSU5fWE1MX0ZJTEVfTkFNRSk7IC8vJE5PTi1OTFMtMSQKKwkJCWZpbmFsIFVSSSBkaXNlYXNlTW9kZWxQbHVnaW5GaWxlVVJJID0gVVJJCisJCQkJCS5jcmVhdGVGaWxlVVJJKGRpc2Vhc2VNb2RlbFBsdWdpbkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisJCQlmaW5hbCBEaXNlYXNlTW9kZWxNb2RlbEdlbmVyYXRvciBkbW1nID0gbmV3IERpc2Vhc2VNb2RlbE1vZGVsR2VuZXJhdG9yKCk7CisJCQlmaW5hbCBNYXA8SVNPS2V5LCBMaXN0PERpc2Vhc2VNb2RlbE1vZGVsU3BlY2lmaWNhdGlvbj4+IG1vZGVsU3BlY2lmaWNhdGlvbnMgPSBkbW1nCisJCQkJCS5wcm9jZXNzRmlsZXMyKHBvcHVsYXRpb25Nb2RlbFBsdWdpbkZpbGVVUkksCisJCQkJCQkJZGlzZWFzZU1vZGVsUGx1Z2luRmlsZVVSSSk7CisKKwkJCWZvciAoZmluYWwgSVNPS2V5IGlzb0tleSA6IHNvcnRJU09LZXlzKG1vZGVsU3BlY2lmaWNhdGlvbnMpKSB7CisJCQkJLy8gTm93IHNlcmlhbGl6ZSB0aGUgSWRlbnRpZmlhYmxlcworCQkJCWZvciAoZmluYWwgTW9kZWxTcGVjaWZpY2F0aW9uIGdtcyA6IG1vZGVsU3BlY2lmaWNhdGlvbnMKKwkJCQkJCS5nZXQoaXNvS2V5KSkgeworCQkJCQl0cnkgeworCQkJCQkJZ21zLnNlcmlhbGl6ZShHRU5FUkFURURfTU9ERUxTX1BBVEgpOworCQkJCQl9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQl9CisJCQkJfSAvLyBmb3IgZ21zCisJCQl9IC8vIGZvciBpc29LZXkKKworCQkJLy8gQ3JlYXRlIHRoZSBpbnN0YW5jZSBvZiBwbHVnaW4ueG1sIHRoYXQgd2UnbGwgc2VyaWFsaXplIGxhdGVyCisJCQlmaW5hbCBQbHVnaW4gcGx1Z2lueG1sID0gR2VuZXJhdGVkcGx1Z2luRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJLmNyZWF0ZVBsdWdpbigpOworCQkJZmluYWwgRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IEdlbmVyYXRlZHBsdWdpbkZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCS5jcmVhdGVFeHRlbnNpb24oKTsKKworCQkJLy8gQWRkIHRoZSAibW9kZWwiIGV4dGVuc2lvbiBwb2ludAorCQkJZXh0ZW5zaW9uLnNldFBvaW50KENvbnN0YW50cy5JRF9NT0RFTF9FWFRFTlNJT05fUE9JTlQpOworCisJCQlwbHVnaW54bWwuZ2V0RXh0ZW5zaW9uZWxlbWVudCgpLmFkZChleHRlbnNpb24pOworCisJCQkvLyBOb3cgYWRkIHRoZSBkdWJsaW4gY29yZSBlbnRyaWVzIHRvIHRoZSBwbHVnaW4ueG1sIGZpbGUgZm9yCisJCQkvLyBlYWNoIG9mIHRoZSBtb2RlbHMKKwkJCWZvciAoZmluYWwgSVNPS2V5IGlzb0tleSA6IHNvcnRJU09LZXlzKG1vZGVsU3BlY2lmaWNhdGlvbnMpKSB7CisJCQkJZmluYWwgU3RlbUNhdGVnb3J5IGNvdW50cnlDYXRlZ29yeSA9IEdlbmVyYXRlZHBsdWdpbkZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCQkuY3JlYXRlU3RlbUNhdGVnb3J5KCk7CisJCQkJZmluYWwgU3RyaW5nIENPVU5UUllfQ0FUQUdPUllfU1RSSU5HID0gSURfTU9ERUxfR0VPR1JBUEhZX1BPTElUSUNBTF9DT1VOVFJJRVNfQ0FURUdPUlkKKwkJCQkJCSsgIi4iICsgaXNvS2V5LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTsgLy8kTk9OLU5MUy0xJAorCQkJCWNvdW50cnlDYXRlZ29yeS5zZXRJZChDT1VOVFJZX0NBVEFHT1JZX1NUUklORyk7CisJCQkJY291bnRyeUNhdGVnb3J5LnNldE5hbWUoaXNvS2V5LnRvU3RyaW5nKCkpOworCQkJCWNvdW50cnlDYXRlZ29yeQorCQkJCQkJLnNldFBhcmVudElkKElEX01PREVMX0dFT0dSQVBIWV9QT0xJVElDQUxfQ09VTlRSSUVTX0NBVEVHT1JZKTsKKwkJCQlmb3IgKGZpbmFsIE1vZGVsU3BlY2lmaWNhdGlvbiBnbXMgOiBtb2RlbFNwZWNpZmljYXRpb25zCisJCQkJCQkuZ2V0KGlzb0tleSkpIHsKKwkJCQkJZmluYWwgRHVibGluQ29yZSBkYyA9IEdlbmVyYXRlZHBsdWdpbkZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCQkJLmNyZWF0ZUR1YmxpbkNvcmUoKTsKKwkJCQkJZGMuc2V0Q2F0ZWdvcnlJZChDT1VOVFJZX0NBVEFHT1JZX1NUUklORyk7CisJCQkJCWV4dGVuc2lvbi5nZXREdWJsaW5Db3JlcygpLmFkZCgKKwkJCQkJCQlwb3B1bGF0ZUdlbmVyYXRlZERDKGRjLCBnbXMuZ2V0RHVibGluQ29yZSgpKSk7CisJCQkJfSAvLyBmb3IgZ21zCisJCQl9IC8vIGZvciBpc29LZXkKKworCQkJZmluYWwgVVJJIFRFTVBfUExVR0lOWE1MX1VSSSA9IFVSSQorCQkJCQkuY3JlYXRlRmlsZVVSSShHRU5FUkFURURfRklMRVNfUEFUSCArIEZpbGUuc2VwYXJhdG9yCisJCQkJCQkJKyBQbHVnaW5GaWxlR2VuZXJhdG9yLlBMVUdJTl9YTUxfRklMRV9OQU1FKTsKKworCQkJLy8gU2VyaWFsaXplIHRoZSBwbHVnaW4ueG1sIGZpbGUuCisJCQlNb2RlbEdlbmVyYXRvci53cml0ZVBsdWdpbnhtbChwbHVnaW54bWwsIFRFTVBfUExVR0lOWE1MX1VSSSk7CisKKwkJCS8vIENyZWF0ZSB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZQorCQkJY3JlYXRlUGx1Z2luUHJvcGVydHRpZXMoR0VORVJBVEVEX0ZJTEVTX1BBVEgpOworCQl9IC8vIGVsc2UKKworCX0gLy8gbWFpbgorCisJcHJvdGVjdGVkIE1hcDxJU09LZXksIExpc3Q8RGlzZWFzZU1vZGVsTW9kZWxTcGVjaWZpY2F0aW9uPj4gcHJvY2Vzc0ZpbGVzMigKKwkJCWZpbmFsIFVSSSBwb3B1bGF0aW9uTW9kZWxQbHVnaW5GaWxlVVJJLAorCQkJZmluYWwgVVJJIGRpc2Vhc2VNb2RlbFBsdWdpbkZpbGVVUkkpIHsKKwkJZmluYWwgSGFzaE1hcDxJU09LZXksIExpc3Q8RGlzZWFzZU1vZGVsTW9kZWxTcGVjaWZpY2F0aW9uPj4gcmV0VmFsdWUgPSBuZXcgSGFzaE1hcDxJU09LZXksIExpc3Q8RGlzZWFzZU1vZGVsTW9kZWxTcGVjaWZpY2F0aW9uPj4oKTsKKworCQkvLyBHZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBwb3B1bGF0aW9uIHBsdWcueG1sIGZpbGUKKwkJZmluYWwgUGx1Z2luIHBvcHVsYXRpb25QbHVnaW5YTUwgPSBnZXRQbHVnaW54bWwocG9wdWxhdGlvbk1vZGVsUGx1Z2luRmlsZVVSSSk7CisJCWZpbmFsIFBsdWdpbiBkaXNlYXNlTW9kZWxQbHVnaW5YTUwgPSBnZXRQbHVnaW54bWwoZGlzZWFzZU1vZGVsUGx1Z2luRmlsZVVSSSk7CisKKwkJLy8gUG9wdWxhdGUgdGhlIG1hcCBvZiBwb3B1bGF0aW9uIG1vZGVscyBieSBJU09LZXkgYW5kIEFkbWluaXN0cmF0aW9uCisJCS8vIGxldmVsCisJCWZpbmFsIE1hcDxJU09LZXksIE1hcDxBZG1pbkxldmVsU2V0LCBEdWJsaW5Db3JlPj4gcG9wdWxhdGlvbk1vZGVsTWFwID0gbmV3IEhhc2hNYXA8SVNPS2V5LCBNYXA8QWRtaW5MZXZlbFNldCwgRHVibGluQ29yZT4+KCk7CisKKwkJZm9yIChFeHRlbnNpb24gZXh0ZW5zaW9uIDogcG9wdWxhdGlvblBsdWdpblhNTC5nZXRFeHRlbnNpb25lbGVtZW50KCkpIHsKKwkJCWZvciAoRHVibGluQ29yZSBkYyA6IGV4dGVuc2lvbi5nZXREdWJsaW5Db3JlcygpKSB7CisJCQkJZmluYWwgTWFwPElTT0tleSwgQWRtaW5MZXZlbFNldD4gaXNvS2V5QWRtaW5MZXZlbFNldE1hcCA9IENvdW50cnlHcmFwaFByb3BlcnR5RmlsZVNwZWNpZmljYXRpb24KKwkJCQkJCS5wYXJzZUR1YmxpbkNvcmVDb3ZlcmFnZVN0cmluZyhkYy5nZXRDb3ZlcmFnZSgpKTsKKwkJCQlmaW5hbCBBZG1pbkxldmVsU2V0IGFkbWluTGV2ZWxTZXQgPSAoQWRtaW5MZXZlbFNldCkgaXNvS2V5QWRtaW5MZXZlbFNldE1hcAorCQkJCQkJLnZhbHVlcygpLnRvQXJyYXkoKVswXTsKKwkJCQlmaW5hbCBJU09LZXkgaXNvS2V5ID0gKElTT0tleSkgaXNvS2V5QWRtaW5MZXZlbFNldE1hcC5rZXlTZXQoKQorCQkJCQkJLnRvQXJyYXkoKVswXTsKKworCQkJCU1hcDxBZG1pbkxldmVsU2V0LCBEdWJsaW5Db3JlPiB0ZW1wID0gcG9wdWxhdGlvbk1vZGVsTWFwCisJCQkJCQkuZ2V0KGlzb0tleSk7CisJCQkJaWYgKHRlbXAgPT0gbnVsbCkgeworCQkJCQl0ZW1wID0gbmV3IEhhc2hNYXA8QWRtaW5MZXZlbFNldCwgRHVibGluQ29yZT4oKTsKKwkJCQkJcG9wdWxhdGlvbk1vZGVsTWFwLnB1dChpc29LZXksIHRlbXApOworCQkJCX0KKwkJCQl0ZW1wLnB1dChhZG1pbkxldmVsU2V0LCBkYyk7CisJCQl9IC8vIGZvciBkYworCQl9IC8vIGZvciBleHRlbnNpb24KKworCQlmaW5hbCBNYXA8RHVibGluQ29yZSwgRGlzZWFzZU1vZGVsPiBkY0Rpc2Vhc2VNb2RlbE1hcCA9IG5ldyBIYXNoTWFwPER1YmxpbkNvcmUsIERpc2Vhc2VNb2RlbD4oKTsKKwkJLy8gUG9wdWxhdGUgdGhlIGNvbGxlY3Rpb24gb2YgZGlzZWFzZSBtb2RlbHMKKwkJZm9yIChFeHRlbnNpb24gZXh0ZW5zaW9uIDogZGlzZWFzZU1vZGVsUGx1Z2luWE1MLmdldEV4dGVuc2lvbmVsZW1lbnQoKSkgeworCQkJZm9yIChEdWJsaW5Db3JlIGRpc2Vhc2VNb2RlbERDIDogZXh0ZW5zaW9uLmdldER1YmxpbkNvcmVzKCkpIHsKKwkJCQlmaW5hbCBJZGVudGlmaWFibGUgZG0gPSBVdGlsaXR5CisJCQkJCQkuZ2V0SWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZVNwZWNpZmljYXRpb24KKwkJCQkJCQkJLmdldElkZW50aWZpYWJsZVByb2plY3RVUkkoZGlzZWFzZU1vZGVsREMpKTsKKwkJCQkvLyBJcyB0aGlzIGEgc3RhbmRhcmQsIG5vbi1hZ2dyZWdhdGluZyBkaXNlYXNlIG1vZGVsPworCQkJCWlmICgoZG0gaW5zdGFuY2VvZiBEaXNlYXNlTW9kZWwpCisJCQkJCQkmJiAhKGRtIGluc3RhbmNlb2YgQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbCkpIHsKKwkJCQkJZGNEaXNlYXNlTW9kZWxNYXAucHV0KGRpc2Vhc2VNb2RlbERDLCAoRGlzZWFzZU1vZGVsKSBkbSk7CisJCQkJfQorCisJCQl9IC8vIGZvciBkYworCQl9IC8vIGZvciBleHRlbnNpb24KKworCQkvLyBDcmVhdGUgdGhlIGRpc2Vhc2UgbW9kZWwgbW9kZWxzCisJCWZvciAoSVNPS2V5IGlzb0tleSA6IHNvcnRJU09LZXlzKHBvcHVsYXRpb25Nb2RlbE1hcCkpIHsKKwkJCWZpbmFsIExpc3Q8RGlzZWFzZU1vZGVsTW9kZWxTcGVjaWZpY2F0aW9uPiBnbXNMaXN0ID0gbmV3IEFycmF5TGlzdDxEaXNlYXNlTW9kZWxNb2RlbFNwZWNpZmljYXRpb24+KCk7CisKKwkJCWZpbmFsIE1hcDxBZG1pbkxldmVsU2V0LCBEdWJsaW5Db3JlPiBhZG1pblNldERDTWFwID0gcG9wdWxhdGlvbk1vZGVsTWFwCisJCQkJCS5nZXQoaXNvS2V5KTsKKwkJCWZvciAoQWRtaW5MZXZlbFNldCBhZG1pbkxldmVsU2V0IDogYWRtaW5TZXREQ01hcC5rZXlTZXQoKSkgeworCQkJCWZpbmFsIER1YmxpbkNvcmUgcG9wdWxhdGlvbk1vZGVsREMgPSBhZG1pblNldERDTWFwCisJCQkJCQkuZ2V0KGFkbWluTGV2ZWxTZXQpOworCisJCQkJLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggb2YgdGhlIGRpc2Vhc2UgbW9kZWxzIGFuZCBjcmVhdGUgb25lCisJCQkJLy8gbW9kZWwgZm9yIGVhY2ggZm9yIHRoZSBjdXJyZW50IElTT0tleQorCQkJCWZvciAoRHVibGluQ29yZSBkaXNlYXNlTW9kZWxEQyA6IGRjRGlzZWFzZU1vZGVsTWFwLmtleVNldCgpKSB7CisJCQkJCWZpbmFsIERpc2Vhc2VNb2RlbE1vZGVsU3BlY2lmaWNhdGlvbiB0ZW1wID0gbmV3IERpc2Vhc2VNb2RlbE1vZGVsU3BlY2lmaWNhdGlvbigKKwkJCQkJCQlpc29LZXksIGFkbWluTGV2ZWxTZXQsIHBvcHVsYXRpb25Nb2RlbERDLAorCQkJCQkJCWRpc2Vhc2VNb2RlbERDLCBkY0Rpc2Vhc2VNb2RlbE1hcAorCQkJCQkJCQkJLmdldChkaXNlYXNlTW9kZWxEQykpOworCisJCQkJCWdtc0xpc3QuYWRkKHRlbXApOworCQkJCX0gLy8gZm9yIGRpc2Vhc2VEQ3MKKwkJCX0gLy8gZm9yIGFkbWluTGV2ZWwKKwkJCXJldFZhbHVlLnB1dChpc29LZXksIGdtc0xpc3QpOworCQl9IC8vIGZvciBlYWNoIGlzb0tleQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBwcm9jZXNzRmlsZXMKKworfSAvLyBEaXNlYXNlTW9kZWxNb2RlbEdlbmVyYXRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5tb2RlbHMvdXBkYXRlLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5tb2RlbHMvdXBkYXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjc0NDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLm1vZGVscy91cGRhdGUueG1sCkBAIC0wLDAgKzEsMTYwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAgICAgQU5UIHNjcmlwdCB0byBidWlsZCBvcmcuZWNsaXNwZS5vaGYuc3RlbS5nZW9ncmFwaHkgcHJvamVjdCAKKyAgICAgYW5kIHRoZSBpbml0aWFsIHNldCBvZiBTVEVNIHNjZW5hcmlvcy4gIAorICAgICBUaGlzIG11c3QgYmUgcnVuIGFmdGVyIGluc3RhbGxpbmcgdGhlIFNURU0gd29ya3NwYWNlIGFuZCBhZnRlciBjaGFuZ2VzCisgICAgIHRvIGNvZGUgZ2VuZXJhdGVkIGJ5IEVNRiBtb2RlbHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPHByb2plY3QgbmFtZT0iU1RFTSBJbnRlcm5hbCBEaXNlYXNlIE1vZGVscyIgZGVmYXVsdD0idXBkYXRlX2FsbCI+CisJPGRlc2NyaXB0aW9uPgorICAgICBVc2UgdGhlIHByb3BlcnRpZXMgZmlsZXMgdG8gcG9wdWxhdGUgdGhlIG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5kaXNlYXNlbW9kZWxzLm1vZGVscyBwbHVnaW4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisJPCEtLSBQIHIgbyBqIGUgYyB0ICBTIHAgZSBjIGkgZiBpIGMgYSB0IGkgbyBuIHMgLS0+CisKKwk8IS0tIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IC0tPgorCTxwcm9wZXJ0eSBuYW1lPSJwcm9qZWN0Lm5hbWUiIHZhbHVlPSJzdGVtIiAvPgorCisJCisJPCEtLSBBcmUgd2UgcnVubmluZyBoZWFkbGVzcz8gLS0+CisJPGNvbmRpdGlvbiBwcm9wZXJ0eT0icnVubmluZ0hlYWRsZXNzIiA+CisJCTxpc3NldCBwcm9wZXJ0eT0iYnVpbGREaXJlY3RvcnkiIC8+CisJPC9jb25kaXRpb24+CisJCisJPCEtLSBUaGUgYnVpbGREaXJlY3RvcnkgcHJvcGVydHkgaXMgc2V0IGluIGEgaGVhZGxlc3MgYnVpbGQgLS0+CisJPGNvbmRpdGlvbiBwcm9wZXJ0eT0icGx1Z2luUm9vdERpcmVjdG9yeSIgdmFsdWU9IiR7YnVpbGREaXJlY3Rvcnl9L3BsdWdpbnMiIGVsc2U9Ii4uIj4KKwkJPGlzc2V0IHByb3BlcnR5PSJydW5uaW5nSGVhZGxlc3MiIC8+CisJPC9jb25kaXRpb24+CisKKwk8IS0tIFRoZSBiYXNlTG9jYXRpb24gcHJvcGVydHkgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBlY2xpcHNlIGhvbWUgaW5zdGFsbGF0aW9uIC0tPgorCTwhLS0gSXQgaXMgdXNlZCB0byBmaW5kIGVjbGlwc2UgcGx1Z2lucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisJPCEtLSBJdCBpcyBzZXQgaW4gYSBoZWFkbGVzcyBidWlsZCwgYnV0IG5vdCBvbmUgc3RhcnRlZCBtYW51YWxseSBmcm9tIEVjbGlwc2UgICAtLT4KKwk8Y29uZGl0aW9uIHByb3BlcnR5PSJiYXNlTG9jYXRpb24iIHZhbHVlPSIke2VjbGlwc2UucGRlYnVpbGQuaG9tZX0uLi8uLiI+CisJCTxub3Q+CisJCQk8aXNzZXQgcHJvcGVydHk9InJ1bm5pbmdIZWFkbGVzcyIgLz4KKwkJPC9ub3Q+CisJPC9jb25kaXRpb24+CisKKwk8IS0tIFRoaXMgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjbGFzcyBmaWxlcyBvZiB0aGUgYnVpbHQgcGx1Zy1pbnMgICAgIC0tPgorCTwhLS0gSWYgdGhpcyBpcyBhIG1hbnVhbCBidWlsZCBzdGFydGVkIGZyb20gRWNsaXBzZSB0aGVuIHRoZSBkaXJlY3RvcnkgLS0+CisJPCEtLSBpcyAiYmluIiwgaWYgaXRzIGEgaGVhZGxlc3MgYnVpbGQgdGhlbiB0aGUgZGlyZWN0b3J5IGlzICJAZG90IiAgICAtLT4KKwk8IS0tIFRoZSBwcm9wZXJ0eSBiYXNlTG9jYXRpb24gaXMgc2V0IGluIGEgaGVhZGxlc3MgYnVpbGQgICAgICAgICAgICAgIC0tPgorCTxjb25kaXRpb24gcHJvcGVydHk9InRhcmdldEJpbiIgdmFsdWU9IkBkb3QiIGVsc2U9ImJpbiI+CisJCTxpc3NldCBwcm9wZXJ0eT0icnVubmluZ0hlYWRsZXNzIiAvPgorCTwvY29uZGl0aW9uPgorCQorCQorCTwhLS0gVGhlIHByZWZpeCBmb3IgZnVsbHkgcXVhbGlmaWVkIG5hbWVzIC0tPgorCTxwcm9wZXJ0eSBuYW1lPSJJRF9ST09UIiB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3RlbSIgLz4KKworCTwhLS0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbiB0aGF0IGNvbnRhaW5zIHRoZSBwbHVnaW4ueG1sIGZpbGUgdG8gc2NhbiAtLT4KKwk8cHJvcGVydHkgbmFtZT0ic2Nhbi5wbHVnaW4iIHZhbHVlPSIke0lEX1JPT1R9LmRhdGEuZ2VvZ3JhcGh5LnBvcHVsYXRpb24uaHVtYW4ubW9kZWxzIiAvPgorCQorCTwhLS0gVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBwbHVnaW4gKGkuZS4sIHRoZSBvbmUgdGhhdCBjb250YWlucyB0aGlzIGZpbGUgLS0+CisJPHByb3BlcnR5IG5hbWU9InNvdXJjZS5wbHVnaW4iIHZhbHVlPSIke0lEX1JPT1R9LmludGVybmFsLmRpc2Vhc2Vtb2RlbHMubW9kZWxzIiAvPgorCisJPCEtLSBUaGUgbmFtZSBvZiB0aGUgcGx1Z2luIHdpdGggdGhlIGRpc2Vhc2VzIC0tPgorCTxwcm9wZXJ0eSBuYW1lPSJkaXNlYXNlLnBsdWdpbiIgIHZhbHVlPSIke0lEX1JPT1R9LmRpc2Vhc2VzIiAvPgorCQorCTwhLS0gVGhlIG5hbWUgb2YgdGhlIHRhcmdldCBwbHVnaW4gLS0+CisJPHByb3BlcnR5IG5hbWU9InRhcmdldC5wbHVnaW4iIHZhbHVlPSIke0lEX1JPT1R9LmRhdGEuZGlzZWFzZW1vZGVscy5tb2RlbHMiIC8+CisKKwk8IS0tIFRoZSBwYXRoIHRvIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgc291cmNlIHBsdWdpbiAtLT4KKwk8cHJvcGVydHkgbmFtZT0icGF0aC5zb3VyY2VwbHVnaW4iIGxvY2F0aW9uPSIke3BsdWdpblJvb3REaXJlY3Rvcnl9LyR7c291cmNlLnBsdWdpbn0iIC8+CisKKwk8IS0tIFRoZSBwYXRoIHRvIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgcGx1Z2luIHRoYXQgd2lsbCBiZSBhdWdtZW50ZWQgd2l0aCBnZW5lcmF0ZWQgY29udGVudCAtLT4KKwk8cHJvcGVydHkgbmFtZT0icGF0aC50YXJnZXRwbHVnaW4iIGxvY2F0aW9uPSIke3BsdWdpblJvb3REaXJlY3Rvcnl9LyR7dGFyZ2V0LnBsdWdpbn0iIC8+CisKKwk8IS0tIFRoZSBwYXRoIHRvIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgcmVzb3VyY2UgZmlsZXMgLS0+CisJPHByb3BlcnR5IG5hbWU9InBhdGgucmVzb3VyY2UuZmlsZXMiIHZhbHVlPSIke3BhdGguc291cmNlcGx1Z2lufS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5IiAvPgorCisJPCEtLSBUaGUgcGF0aCB0byB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIHBsdWdpbiB0aGF0IHdpbGwgYmUgYXVnbWVudGVkIHdpdGggZ2VuZXJhdGVkIGNvbnRlbnQtLT4KKwk8cHJvcGVydHkgbmFtZT0icGF0aC5nZW5lcmF0ZWQuZmlsZXMiIHZhbHVlPSIke3BhdGguc291cmNlcGx1Z2lufS90ZW1wIiAvPgorCisJPCEtLSBUaGUgcGF0aCB0byB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgZ2VvZ3JhcGh5IHNvdXJjZSBjb2RlIC0tPgorCTxwcm9wZXJ0eSBuYW1lPSJwYXRoLmdlb2dyYXBoeS5zcmMiIHZhbHVlPSIke3BhdGgudGFyZ2V0cGx1Z2lufS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kYXRhL2dlb2dyYXBoeS9wb3B1bGF0aW9uL2h1bWFuL21vZGVscyIgLz4KKworCTwhLS0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbi54bWwgZmlsZSB0aGF0IHdpbGwgYmUgYXVnbWVudGVkIHdpdGggZ2VuZXJhdGVkIGNvbnRlbnQtLT4KKwk8cHJvcGVydHkgbmFtZT0iZmlsZS50YXJnZXQucGx1Z2lueG1sIiB2YWx1ZT0iJHtwYXRoLnRhcmdldHBsdWdpbn0vcGx1Z2luLnhtbCIgLz4KKworCTwhLS0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgdGhhdCB3aWxsIGJlIGF1Z21lbnRlZCB3aXRoIGdlbmVyYXRlZCBjb250ZW50LS0+CisJPHByb3BlcnR5IG5hbWU9ImZpbGUudGFyZ2V0LnBsdWdpbnByb3BlcnRpZXMiIHZhbHVlPSIke3BhdGgudGFyZ2V0cGx1Z2lufS9wbHVnaW4ucHJvcGVydGllcyIgLz4KKworCTwhLS0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbi54bWwgZmlsZSB0aGF0IHRoYXQgaXMgdGhlIGFnZ3JlZ2F0aW9uIG9mIHRoZSBnZW5lcmF0ZWQgY29udGVudC0tPgorCTxwcm9wZXJ0eSBuYW1lPSJmaWxlLnV0aWwucGx1Z2lueG1sIiB2YWx1ZT0iJHtwYXRoLmdlbmVyYXRlZC5maWxlc30vcGx1Z2luLnhtbCIgLz4KKworCTwhLS0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgdGhhdCB0aGF0IGlzIHRoZSBhZ2dyZWdhdGlvbiBvZiB0aGUgZ2VuZXJhdGVkIGNvbnRlbnQtLT4KKwk8cHJvcGVydHkgbmFtZT0iZmlsZS51dGlsLnBsdWdpbnByb3BlcnRpZXMiIHZhbHVlPSIke3BhdGguZ2VuZXJhdGVkLmZpbGVzfS9wbHVnaW4ucHJvcGVydGllcyIgLz4KKworICAgIDwhLS0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbi54bWwgZmlsZSB0aGF0IHRoYXQgaXMgdGhlIGFnZ3JlZ2F0aW9uIG9mIHRoZSBnZW5lcmF0ZWQgY29udGVudC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJmaWxlLnRhcmdldC5wbHVnaW5wcm9wZXJ0aWVzIiB2YWx1ZT0iJHtwYXRoLmdlbmVyYXRlZC5maWxlc30vcGx1Z2luLnByb3BlcnRpZXMiIC8+CisKKwk8IS0tIFRoZSBjbGFzcyBwYXRoIHRvIHVzZSAtLT4KKwk8cGF0aCBpZD0iY2xhc3NwYXRoLnJ1bnRpbWUiPiAKKwkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3BhdGguc291cmNlcGx1Z2lufS8ke3RhcmdldEJpbn0iIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtwbHVnaW5Sb290RGlyZWN0b3J5fS8ke0lEX1JPT1R9LmNvcmUvJHt0YXJnZXRCaW59IiAvPgorCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7cGx1Z2luUm9vdERpcmVjdG9yeX0vJHtJRF9ST09UfS5kZWZpbml0aW9ucy8ke3RhcmdldEJpbn0iIC8+CisJICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtwbHVnaW5Sb290RGlyZWN0b3J5fS8ke0lEX1JPT1R9LmludGVybmFsLmRhdGEvJHt0YXJnZXRCaW59IiAvPgorCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7cGx1Z2luUm9vdERpcmVjdG9yeX0vJHtJRF9ST09UfS5pbnRlcm5hbC5kYXRhLmdlb2dyYXBoeS8ke3RhcmdldEJpbn0iIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtwbHVnaW5Sb290RGlyZWN0b3J5fS8ke0lEX1JPT1R9LmludGVybmFsLmRhdGEuZ2VvZ3JhcGh5Lm1vZGVscy8ke3RhcmdldEJpbn0iIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtwbHVnaW5Sb290RGlyZWN0b3J5fS8ke0lEX1JPT1R9LmRhdGEuZ2VvZ3JhcGh5LyR7dGFyZ2V0QmlufSIgLz4KKwkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3BsdWdpblJvb3REaXJlY3Rvcnl9LyR7SURfUk9PVH0uZGlzZWFzZW1vZGVscy8ke3RhcmdldEJpbn0iIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtwbHVnaW5Sb290RGlyZWN0b3J5fS8ke0lEX1JPT1R9LnBvcHVsYXRpb25tb2RlbHMvJHt0YXJnZXRCaW59IiAvPgorCQk8ZmlsZXNldCBkaXI9IiR7YmFzZUxvY2F0aW9ufS9wbHVnaW5zLyI+CisJCQk8aW5jbHVkZSBuYW1lPSIqZW1mKi5qYXIiIC8+CisJCTwvZmlsZXNldD4KKwk8L3BhdGg+CisKKwk8dGFyZ2V0IG5hbWU9InVwZGF0ZV9hbGwiIGRlcGVuZHM9InVwZGF0ZSIgLz4KKworCTwhLS0gVXBkYXRlIHRoZSBnZW9ncmFwaHkgcGx1Z2luIHdpdGggdGhlIGxhdGVzdCBkZWZpbml0aW9ucyAtLT4KKwk8dGFyZ2V0IG5hbWU9InVwZGF0ZSIgZGVwZW5kcz0idXBkYXRlX2Rpc2Vhc2VfbW9kZWxzLCB1cGRhdGVfZGlzZWFzZW1vZGVsc19tb2RlbHNfcGx1Z2luX3htbCwgdXBkYXRlX2Rpc2Vhc2Vtb2RlbHNfbW9kZWxzX3BsdWdpbl9wcm9wZXJ0aWVzIiAvPgorCisJPHRhcmdldCBuYW1lPSJ1cGRhdGVfZGlzZWFzZW1vZGVsc19tb2RlbHNfcGx1Z2luX3htbCIgZGVwZW5kcz0iY3JlYXRlX2NhbmRpZGF0ZXMiPgorCQk8Y29weSB0b2ZpbGU9IiR7ZmlsZS50YXJnZXQucGx1Z2lueG1sfSIgZmlsZT0iJHtmaWxlLnV0aWwucGx1Z2lueG1sfSIgb3ZlcndyaXRlPSJ0cnVlIiAvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJ1cGRhdGVfZGlzZWFzZW1vZGVsc19tb2RlbHNfcGx1Z2luX3Byb3BlcnRpZXMiIGRlcGVuZHM9ImNyZWF0ZV9jYW5kaWRhdGVzIj4KKwkJPGNvcHkgdG9maWxlPSIke2ZpbGUudGFyZ2V0LnBsdWdpbnByb3BlcnRpZXN9IiBmaWxlPSIke2ZpbGUudXRpbC5wbHVnaW5wcm9wZXJ0aWVzfSIgb3ZlcndyaXRlPSJ0cnVlIiAvPgorCTwvdGFyZ2V0PgorCisJPCEtLSBVcGRhdGUgdGhlIGdyYXBoIGZpbGVzIGluIHRoZSBnZW9ncmFwaHkgcGx1Z2luIC0tPgorCTx0YXJnZXQgbmFtZT0idXBkYXRlX2Rpc2Vhc2VfbW9kZWxzIiBkZXBlbmRzPSJjcmVhdGVfY2FuZGlkYXRlcyI+CisJCTxjb3B5IHRvZGlyPSIke3BhdGgudGFyZ2V0cGx1Z2lufS9yZXNvdXJjZXMvZGF0YS8iIG92ZXJ3cml0ZT0idHJ1ZSI+CisJCQk8ZmlsZXNldCBkaXI9IiR7cGF0aC5nZW5lcmF0ZWQuZmlsZXN9L3Jlc291cmNlcy9kYXRhIj4KKwkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLm1vZGVsIiAvPgorCQkJPC9maWxlc2V0PgorCQk8L2NvcHk+CisJPC90YXJnZXQ+CisJCisJPCEtLSBDcmVhdGUgdGhlIG1vZGVsIGZpbGVzIGZvciBjb3VudHJpZXMgYW5kIHRoZSBwbHVnaW4ueG1sIGFuZCBwbHVnaW4ucHJvcGVydGllcyBmcmFnbWVudHMgLS0+CisJPHRhcmdldCBuYW1lPSJjcmVhdGVfY2FuZGlkYXRlcyIgZGVwZW5kcz0iY2xlYW4iPgorCQk8IS0tIFRoZXJlIGlzIGEgcHJvYmxlbSBoZXJlIHdpdGggc3BlY2lmeWluZyBmb3JrPSJ0cnVlIiAgbWF4bWVtb3J5PSI3NjhtIi4gIEl0IGNhdXNlcyBhbiBJT0V4Y2VwdGlvbiBvbiBzb21lIG1hY2hpbmVzIC0tPgorCQk8amF2YSBjbGFzc25hbWU9IiR7SURfUk9PVH0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5tb2RlbHMuRGlzZWFzZU1vZGVsTW9kZWxHZW5lcmF0b3IiIGZvcms9InRydWUiIG1heG1lbW9yeT0iMTAyNG0iPgorCQkJPGNsYXNzcGF0aCByZWZpZD0iY2xhc3NwYXRoLnJ1bnRpbWUiIC8+CisJCQk8YXJnIHZhbHVlPSIke3BhdGguZ2VuZXJhdGVkLmZpbGVzfSIgLz4KKwkJCTxhcmcgdmFsdWU9IiR7c2Nhbi5wbHVnaW59IiAvPgorCQkJPGFyZyB2YWx1ZT0iJHtkaXNlYXNlLnBsdWdpbn0iIC8+CisJCQk8anZtYXJnIHZhbHVlPSItWG1zMTAyNG0iLz4KKwkJCTxqdm1hcmcgdmFsdWU9Ii1YbXgxMDI0bSIvPgorCQk8L2phdmE+CisJPC90YXJnZXQ+CisKKwk8IS0tIGNsZWFuIG91dCB0aGUgLi4uL3RlbXAvZGF0YSBkaXJlY3RvcmllcyAtLT4KKwk8IS0tIGNsZWFuIG91dCB0aGUgdGFyZ2V0IGRpcmVjdG9yaWVzIC0tPgorCTx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImNyZWF0ZV9nZW5lcmF0ZWRfZmlsZXNfZGlyIj4KKwkJPGRlbGV0ZSBpbmNsdWRlRW1wdHlEaXJzPSJ0cnVlIiBxdWlldD0idHJ1ZSI+CisJCQk8ZmlsZXNldCBkaXI9IiR7cGF0aC5nZW5lcmF0ZWQuZmlsZXN9LyI+CisJCQkJPGluY2x1ZGUgbmFtZT0iKiovKiIgLz4KKwkJCTwvZmlsZXNldD4KKwkJCTxmaWxlc2V0IGRpcj0iJHtwYXRoLnRhcmdldHBsdWdpbn0vcmVzb3VyY2VzL2RhdGEvIj4KKwkJCQk8aW5jbHVkZSBuYW1lPSJjb3VudHJ5LyoqLyoiIC8+CisJCQk8L2ZpbGVzZXQ+CisJCTwvZGVsZXRlPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJjcmVhdGVfZ2VuZXJhdGVkX2ZpbGVzX2RpciI+CisJCTxta2RpciBkaXI9IiR7cGF0aC5nZW5lcmF0ZWQuZmlsZXN9L3Jlc291cmNlcy9kYXRhIi8+CQkKKwk8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5zY2VuYXJpb3MvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5zY2VuYXJpb3MvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRlODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLnNjZW5hcmlvcy8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zLy5jdnNpZ25vcmUgYi9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1OTVhNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5zY2VuYXJpb3MvLmN2c2lnbm9yZQpAQCAtMCwwICsxIEBACit0ZW1wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLnNjZW5hcmlvcy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWExYzY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLnNjZW5hcmlvcy8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5zY2VuYXJpb3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLnNjZW5hcmlvcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiNzA1ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5zY2VuYXJpb3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsMjEgQEAKKyNUdWUgU2VwIDAxIDE2OjU5OjMyIEVEVCAyMDA5CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb249cmV0dXJuX3RhZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5zY2VuYXJpb3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OTY1ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMjAgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6IFNURU0gSW50ZXJuYWwgRGlzZWFzZSBTY2VuYXJpb3MKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5zY2VuYXJpb3MKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCisgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbiwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUsCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXMsCisgb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeSwKKyBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LnBvcHVsYXRpb24uaHVtYW4sCisgb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5wb3B1bGF0aW9uLmh1bWFuLm1vZGVscywKKyBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZGlzZWFzZW1vZGVscy5tb2RlbHMsCisgb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zLAorIG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YSwKKyBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VvZ3JhcGh5LAorIG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW9ncmFwaHkubW9kZWxzCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKK0J1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRkMmU0ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5zY2VuYXJpb3MvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDQgQEAKK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCitiaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLnNjZW5hcmlvcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9pbnRlcm5hbC9kYXRhL3NwZWNpZmljYXRpb25zL0Rpc2Vhc2VNb2RlbFNjZW5hcmlvU3BlY2lmaWNhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLnNjZW5hcmlvcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9pbnRlcm5hbC9kYXRhL3NwZWNpZmljYXRpb25zL0Rpc2Vhc2VNb2RlbFNjZW5hcmlvU3BlY2lmaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhY2QxNDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2ludGVybmFsL2RhdGEvc3BlY2lmaWNhdGlvbnMvRGlzZWFzZU1vZGVsU2NlbmFyaW9TcGVjaWZpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzMzggQEAKKy8vIERpc2Vhc2VNb2RlbFNjZW5hcmlvU3BlY2lmaWNhdGlvbi5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5zcGVjaWZpY2F0aW9uczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5VdGlsaXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW9GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuSVNPS2V5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJSW5mZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW5lcmF0ZWRwbHVnaW4uRHVibGluQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VvZ3JhcGh5LnNwZWNpZmljYXRpb25zLkFkbWluTGV2ZWxTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlb2dyYXBoeS5zcGVjaWZpY2F0aW9ucy5Db3VudHJ5R3JhcGhQcm9wZXJ0eUZpbGVTcGVjaWZpY2F0aW9uOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cworICovCitwdWJsaWMgY2xhc3MgRGlzZWFzZU1vZGVsU2NlbmFyaW9TcGVjaWZpY2F0aW9uIGV4dGVuZHMKKwkJSWRlbnRpZmlhYmxlU3BlY2lmaWNhdGlvbiBpbXBsZW1lbnRzCisJCUNvbXBhcmFibGU8RGlzZWFzZU1vZGVsU2NlbmFyaW9TcGVjaWZpY2F0aW9uPiB7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHBlb3BsZSB0aGF0IHdpbGwgYmUgaW5mZWN0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5GRUNUSU9VU19DT1VOVCA9IDEwMDAwOworCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHJpdmF0ZSBmaW5hbCBNb2RlbFBhY2thZ2UgbW9kZWxQYWNrYWdlID0gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKKwlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwlwcml2YXRlIGZpbmFsIFN0YW5kYXJkUGFja2FnZSBzdGFuZGFyZFBhY2thZ2UgPSBTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFOworCisJcHJpdmF0ZSBmaW5hbCBEdWJsaW5Db3JlIGRpc2Vhc2VNb2RlbE1vZGVsREM7CisKKwlwcml2YXRlIGZpbmFsIElTT0tleSBpc29LZXk7CisJcHJpdmF0ZSBmaW5hbCBBZG1pbkxldmVsU2V0IGFkbWluTGV2ZWxTZXQ7CisJcHJpdmF0ZSBNb2RlbCBkaXNlYXNlTW9kZWxNb2RlbDsKKwlwcml2YXRlIERpc2Vhc2VNb2RlbCBkaXNlYXNlTW9kZWw7CisJcHJpdmF0ZSBTZXF1ZW5jZXIgc2VxdWVuY2VyOworCXByaXZhdGUgU0lJbmZlY3RvciBpbmZlY3RvcjsKKwlwcml2YXRlIFN0cmluZyBpbmZlY3RlZFJlZ2lvbk5hbWU7CisKKwlzdGF0aWMgeworCQkvLyBUaGlzIHNldHMgdXAgdGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgInBsYXRmb3JtIiBVUkkncyBhbmQgdGhlCisJCS8vIHByb2plY3RzIGluIHRoZSBmaWxlIHN5c3RlbS4KKworCQkvLyBDV0QgaXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKKwkJZmluYWwgU3RyaW5nIENXRCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBXT1JLU1BBQ0UgaXMgdGhlIGRpcmVjdG9yeSBvZiB0aGUgcGFyZW50IHdvcmtzcGFjZQorCQlmaW5hbCBTdHJpbmcgV09SS1NQQUNFID0gQ1dELnN1YnN0cmluZygwLCBDV0QKKwkJCQkubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpKTsKKworCQkvLyBUaGUgcGF0aCB0byB0aGUgZGlzZWFzZSBtb2RlbHMgcHJvamVjdAorCQlmaW5hbCBTdHJpbmcgRElTRUFTRVNfTU9ERUxTX01PREVMU19QUk9KRUNUX1JPT1QgPSBXT1JLU1BBQ0UKKwkJCQkrIEZpbGUuc2VwYXJhdG9yCisJCQkJKyBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZGlzZWFzZW1vZGVscy5tb2RlbHMuQWN0aXZhdG9yLlBMVUdJTl9JRAorCQkJCSsgRmlsZS5zZXBhcmF0b3I7CisKKwkJLy8gVGhlIHBhdGggdG8gdGhlIGRpc2Vhc2VzIHByb2plY3QKKwkJZmluYWwgU3RyaW5nIERJU0VBU0VTX1BST0pFQ1RfUk9PVCA9IFdPUktTUEFDRSArIEZpbGUuc2VwYXJhdG9yCisJCQkJKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzLkFjdGl2YXRvci5QTFVHSU5fSUQKKwkJCQkrIEZpbGUuc2VwYXJhdG9yOworCisJCS8vIFRoZSBwYXRoIHRvIHRoZSBwb3B1bGF0aW9uIG1vZGVsIHByb2plY3QKKwkJZmluYWwgU3RyaW5nIFBPUFVMQVRJT05fREFUQV9QUk9KRUNUX1JPT1QgPSBXT1JLU1BBQ0UKKwkJCQkrIEZpbGUuc2VwYXJhdG9yCisJCQkJKyBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LnBvcHVsYXRpb24uaHVtYW4uQWN0aXZhdG9yLlBMVUdJTl9JRAorCQkJCSsgRmlsZS5zZXBhcmF0b3I7CisKKwkJLy8gVGhlIHBhdGggdG8gdGhlIHBvcHVsYXRpb24gbW9kZWwgcHJvamVjdAorCQlmaW5hbCBTdHJpbmcgUE9QVUxBVElPTl9NT0RFTF9QUk9KRUNUX1JPT1QgPSBXT1JLU1BBQ0UKKwkJCQkrIEZpbGUuc2VwYXJhdG9yCisJCQkJKyBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LnBvcHVsYXRpb24uaHVtYW4ubW9kZWxzLkFjdGl2YXRvci5QTFVHSU5fSUQKKwkJCQkrIEZpbGUuc2VwYXJhdG9yOworCisJCWZpbmFsIE1hcDxTdHJpbmcsIFVSST4gcGxhdGZvcm1SZXNvdXJjZU1hcCA9IEVjb3JlUGx1Z2luCisJCQkJLmdldFBsYXRmb3JtUmVzb3VyY2VNYXAoKTsKKworCQkvLyBSZWdpc3RlciB0aGUgbWFwcGluZyBiZXR3ZWVuIHRoZSBwcm9qZWN0IGlkIGFuZCB0aGUgYWJzb2x1dGUgcGF0aCB0bworCQkvLyB0aGUgcHJvamVjdCBpbiB0aGUgZmlsZSBzeXN0ZW0uIFRoaXMgd2lsbCBiZSBmb3VuZCBsYXRlciB3aGVuCisJCS8vIGRlc2VyaWFsaXppbmcgd2hlbiB0aGUgcGxhdGZvcm0gVVJJIGlzIG1hcHBlZC4KKworCQlwbGF0Zm9ybVJlc291cmNlTWFwCisJCQkJLnB1dCgKKwkJCQkJCW9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5kaXNlYXNlbW9kZWxzLm1vZGVscy5BY3RpdmF0b3IuUExVR0lOX0lELAorCQkJCQkJVVJJLmNyZWF0ZUZpbGVVUkkoRElTRUFTRVNfTU9ERUxTX01PREVMU19QUk9KRUNUX1JPT1QpKTsKKworCQlwbGF0Zm9ybVJlc291cmNlTWFwLnB1dCgKKwkJCQlvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzLkFjdGl2YXRvci5QTFVHSU5fSUQsIFVSSQorCQkJCQkJLmNyZWF0ZUZpbGVVUkkoRElTRUFTRVNfUFJPSkVDVF9ST09UKSk7CisKKwkJcGxhdGZvcm1SZXNvdXJjZU1hcAorCQkJCS5wdXQoCisJCQkJCQlvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LnBvcHVsYXRpb24uaHVtYW4uQWN0aXZhdG9yLlBMVUdJTl9JRCwKKwkJCQkJCVVSSS5jcmVhdGVGaWxlVVJJKFBPUFVMQVRJT05fREFUQV9QUk9KRUNUX1JPT1QpKTsKKworCQlwbGF0Zm9ybVJlc291cmNlTWFwCisJCQkJLnB1dCgKKwkJCQkJCW9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkucG9wdWxhdGlvbi5odW1hbi5tb2RlbHMuQWN0aXZhdG9yLlBMVUdJTl9JRCwKKwkJCQkJCVVSSS5jcmVhdGVGaWxlVVJJKFBPUFVMQVRJT05fTU9ERUxfUFJPSkVDVF9ST09UKSk7CisJfSAvLyBzdGF0aWMKKworCS8qKgorCSAqIEBwYXJhbSBpc29LZXkKKwkgKiBAcGFyYW0gYWRtaW5MZXZlbFNldAorCSAqIEBwYXJhbSBkaXNlYXNlTW9kZWxNb2RlbERDCisJICovCisJcHVibGljIERpc2Vhc2VNb2RlbFNjZW5hcmlvU3BlY2lmaWNhdGlvbihmaW5hbCBJU09LZXkgaXNvS2V5LAorCQkJZmluYWwgQWRtaW5MZXZlbFNldCBhZG1pbkxldmVsU2V0LCBEdWJsaW5Db3JlIGRpc2Vhc2VNb2RlbE1vZGVsREMpIHsKKwkJdGhpcy5kaXNlYXNlTW9kZWxNb2RlbERDID0gZGlzZWFzZU1vZGVsTW9kZWxEQzsKKworCQl0aGlzLmlzb0tleSA9IGlzb0tleTsKKwkJdGhpcy5hZG1pbkxldmVsU2V0ID0gYWRtaW5MZXZlbFNldDsKKwkJZ2V0RHVibGluQ29yZSgpLnNldEZvcm1hdChTY2VuYXJpb1BhY2thZ2UuZU5TX1VSSSk7CisJfSAvLyBEaXNlYXNlTW9kZWxTY2VuYXJpb1NwZWNpZmljYXRpb24KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLnNwZWNpZmljYXRpb25zLk1vZGVsU3BlY2lmaWNhdGlvbiNjcmVhdGVJZGVudGlmaWFibGVJbnN0YW5jZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFNjZW5hcmlvIGNyZWF0ZUlkZW50aWZpYWJsZUluc3RhbmNlKCkgeworCQlmaW5hbCBTY2VuYXJpbyByZXRWYWx1ZSA9IFNjZW5hcmlvRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2NlbmFyaW8oKTsKKwkJLy8gVGhlIGdlbmVyYXRlZCBHcmFwaHMgZXRjLiwgYWxsIGhhdmUgZHVibGluIGNvcmUgdGhhdCByZWZlcmVuY2VzCisJCS8vIHRoZW0gYXMgcGx1Z2lucy4gVGhpcyBpcyBhcyBpdCBzaG91bGQgYmUgd2hlbiBTVEVNIGlzIHJ1bm5pbmcsCisJCS8vIGJ1dCByaWdodCBub3cgd2UncmUgcnVubmluZyBzdGFuZC1hbG9uZSBhbmQgd2FudCB0byBhY2Nlc3MgdGhlCisJCS8vIHBsdWdpbnMgYXMgcHJvamVjdHMgKHRoZXkgYXJlbid0IHBsdWdnZWQgaW50byBvdXIgcnVubmluZyB2ZXJzaW9uCisJCS8vIG9mIEVjbGlwc2UpLiBTdWJzdGl0dXRlICJyZXNvdXJjZSIgZm9yICJwbHVnaW4iIGluIHRoZSBVUkkncyB3ZQorCQkvLyB1c2UgYW5kIGFsbCB3aWxsIGJlIHdlbGwuCisKKwkJZGlzZWFzZU1vZGVsTW9kZWwgPSAoTW9kZWwpIFV0aWxpdHkKKwkJCQkuZ2V0SWRlbnRpZmlhYmxlKGdldElkZW50aWZpYWJsZVByb2plY3RVUkkoZGlzZWFzZU1vZGVsTW9kZWxEQykpOworCQlyZXRWYWx1ZS5zZXRNb2RlbChkaXNlYXNlTW9kZWxNb2RlbCk7CisKKwkJZGlzZWFzZU1vZGVsID0gZXh0cmFjdERpc2Vhc2VNb2RlbChkaXNlYXNlTW9kZWxNb2RlbCk7CisJCXNlcXVlbmNlciA9IGNyZWF0ZVNlcXVlbmNlcigpOworCQlyZXRWYWx1ZS5zZXRTZXF1ZW5jZXIoc2VxdWVuY2VyKTsKKwkJaW5mZWN0b3IgPSBjcmVhdGVJbmZlY3RvcihkaXNlYXNlTW9kZWxNb2RlbCk7CisJCXJldFZhbHVlLmdldFNjZW5hcmlvRGVjb3JhdG9ycygpLmFkZChpbmZlY3Rvcik7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUlkZW50aWZpYWJsZUluc3RhbmNlCisKKwlwcml2YXRlIERpc2Vhc2VNb2RlbCBleHRyYWN0RGlzZWFzZU1vZGVsKE1vZGVsIGRpc2Vhc2VNb2RlbE1vZGVsKSB7CisJCURpc2Vhc2VNb2RlbCByZXRWYWx1ZSA9IG51bGw7CisKKwkJaW50IHBvcyA9IC0xOworCQlmb3IgKE5vZGVEZWNvcmF0b3Igbm9kZURlY29yYXRvciA6IGRpc2Vhc2VNb2RlbE1vZGVsCisJCQkJLmdldE5vZGVEZWNvcmF0b3JzKCkpIHsKKwkJCWlmIChub2RlRGVjb3JhdG9yLmVJc1Byb3h5KCkpIHsKKwkJCQlyZXRWYWx1ZSA9IChEaXNlYXNlTW9kZWwpIFV0aWxpdHkKKwkJCQkJCS5nZXRJZGVudGlmaWFibGUoVVJJCisJCQkJCQkJCS5jcmVhdGVVUkkoSWRlbnRpZmlhYmxlU3BlY2lmaWNhdGlvbgorCQkJCQkJCQkJCS5jb252ZXJ0VG9Qcm9qZWN0VVJJKCgoSW50ZXJuYWxFT2JqZWN0KSBub2RlRGVjb3JhdG9yKQorCQkJCQkJCQkJCQkJLmVQcm94eVVSSSgpLnRvU3RyaW5nKCkpKSk7CisJCQkJKytwb3M7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gLy8gZm9yIGVhY2ggbm9kZURlY29yYXRvcgorCQkvLyBSZXBsYWNlIHdpdGggdGhlIGFjdHVhbCBkaXNlYXNlIG1vZGVsCisJCWlmKHBvcyA+PTApIGRpc2Vhc2VNb2RlbE1vZGVsLmdldE5vZGVEZWNvcmF0b3JzKCkuc2V0KHBvcywgcmV0VmFsdWUpOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGV4dHJhY3REaXNlYXNlTW9kZWwKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVsYXRpdmVTZXJpYWxpemF0aW9uUGF0aCgpIHsKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCXNiLmFwcGVuZChDb3VudHJ5R3JhcGhQcm9wZXJ0eUZpbGVTcGVjaWZpY2F0aW9uLkNPVU5UUllfRElSKTsKKwkJc2IuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcik7CisJCXNiLmFwcGVuZChpc29LZXkudG9TdHJpbmcoKSk7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lUm9vdCgpIHsKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGlzb0tleS50b1N0cmluZygpKTsKKwkJc2IuYXBwZW5kKCJfIik7IC8vJE5PTi1OTFMtMSQKKwkJc2IuYXBwZW5kKGFkbWluTGV2ZWxTZXQudG9TdHJpbmcoKSk7CisJCXNiLmFwcGVuZCgiX2Rpc2Vhc2VfIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGRpc2Vhc2VNb2RlbCAhPSBudWxsKSB7CisJCQlzYi5hcHBlbmQoZGlzZWFzZU1vZGVsLmdldERpc2Vhc2VOYW1lKCkudHJpbSgpLnJlcGxhY2UoIiAiLCAiXyIpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJfQorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldFBsdWdpbklkKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zLkFjdGl2YXRvci5QTFVHSU5fSUQ7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZURlc2NyaXB0b3IoKSB7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihpc29LZXkudG9TdHJpbmcoKSk7CisJCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCisJCXNiCisJCQkJLmFwcGVuZChhZG1pbkxldmVsU2V0LmdldE51bUFkbWluTGV2ZWxzKCkgPiAxID8gIiAoTGV2ZWxzOiAiIDogIiAoTGV2ZWw6ICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJc2IuYXBwZW5kKGFkbWluTGV2ZWxTZXQudG9TdHJpbmcoIiwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc2IuYXBwZW5kKCIpICIpOyAvLyROT04tTkxTLTEkCisJCXNiLmFwcGVuZChkaXNlYXNlTW9kZWwuZ2V0RGlzZWFzZU5hbWUoKSk7CisJCXNiLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQlzYi5hcHBlbmQoaW5mZWN0b3IuZ2V0SW5mZWN0aW91c0NvdW50KCkpOworCQlzYi5hcHBlbmQoIiBpbmZlY3Rpb25zIGluICIpOyAvLyROT04tTkxTLTEkCisJCXNiLmFwcGVuZChpbmZlY3RlZFJlZ2lvbk5hbWUpOworCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0gLy8gZ2V0VGl0bGVEZXNjcmlwdG9yCisKKwlwcml2YXRlIFNlcXVlbmNlciBjcmVhdGVTZXF1ZW5jZXIoKSB7CisJCWZpbmFsIFNlcXVlbmNlciByZXRWYWx1ZSA9IFNlcXVlbmNlckZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZVNlcXVlbnRpYWxTZXF1ZW5jZXIoKTsKKworCQlmaW5hbCBTVEVNVGltZSBzdGFydFRpbWUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNURU1UaW1lKCk7CisJCXN0YXJ0VGltZS5zZXRUaW1lKERhdGUudmFsdWVPZigiMjAwMC0wMS0wMSIpKTsgLy8kTk9OLU5MUy0xJAorCQlyZXRWYWx1ZS5zZXRTdGFydFRpbWUoc3RhcnRUaW1lKTsKKworCQlyZXRWYWx1ZS5zZXRDeWNsZSgoaW50KSBTVEVNVGltZS5Vbml0cy5EQVkuZ2V0TWlsbGlzZWNvbmRzKCkpOworCQlyZXRWYWx1ZS5zZXRVUkkoU1RFTVVSSS5jcmVhdGVVUkkoInNlcXVlbmNlci8iK1NURU1VUkkuZ2VuZXJhdGVVbmlxdWVQYXJ0KCkpKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlU2VxdWVuY2VyCisKKwlwcml2YXRlIFNJSW5mZWN0b3IgY3JlYXRlSW5mZWN0b3IoTW9kZWwgZGlzZWFzZU1vZGVsTW9kZWwpIHsKKwkJU0lJbmZlY3RvciByZXRWYWx1ZSA9IG51bGw7CisJCS8vIFdlIG5lZWQgdG8gZGVzY2VuZCBpbnRvIHRoZSBtb2RlbCBhbmQgZmluZCBvbmUgbG9jYXRpb24gdGhhdCBjYW4gYmUKKwkJLy8gcGxhY2Ugd2hlcmUgdGhlIGluZmVjdGlvbiBzdGFydHMuCisKKwkJZm9yIChNb2RlbCBtb2RlbCA6IGRpc2Vhc2VNb2RlbE1vZGVsLmdldE1vZGVscygpKSB7CisJCQlpZiAobW9kZWwuZUlzUHJveHkoKSkgeworCQkJCWZpbmFsIE1vZGVsIHBvcHVsYXRpb25Nb2RlbCA9IChNb2RlbCkgVXRpbGl0eQorCQkJCQkJLmdldElkZW50aWZpYWJsZShVUkkKKwkJCQkJCQkJLmNyZWF0ZVVSSShJZGVudGlmaWFibGVTcGVjaWZpY2F0aW9uCisJCQkJCQkJCQkJLmNvbnZlcnRUb1Byb2plY3RVUkkoKChJbnRlcm5hbEVPYmplY3QpIG1vZGVsKQorCQkJCQkJCQkJCQkJLmVQcm94eVVSSSgpLnRvU3RyaW5nKCkpKSk7CisJCQkJLy8gVGhlIHBvcHVsYXRpb24gbW9kZWw/CisJCQkJaWYgKHBvcHVsYXRpb25Nb2RlbC5nZXRVUkkoKS50b1N0cmluZygpLmNvbnRhaW5zKCJwb3B1bGF0aW9uIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkvLyBZZXMKKwkJCQkJZmluYWwgR3JhcGggcG9wdWxhdGlvbkdyYXBoID0gcG9wdWxhdGlvbk1vZGVsLmdldEdyYXBocygpCisJCQkJCQkJLmdldCgwKTsKKworCQkJCQlmaW5hbCBHcmFwaCBwb3VsYXRpb25EYXRhID0gKEdyYXBoKSBVdGlsaXR5CisJCQkJCQkJLmdldElkZW50aWZpYWJsZShVUkkKKwkJCQkJCQkJCS5jcmVhdGVVUkkoSWRlbnRpZmlhYmxlU3BlY2lmaWNhdGlvbgorCQkJCQkJCQkJCQkuY29udmVydFRvUHJvamVjdFVSSSgoKEludGVybmFsRU9iamVjdCkgcG9wdWxhdGlvbkdyYXBoKQorCQkJCQkJCQkJCQkJCS5lUHJveHlVUkkoKS50b1N0cmluZygpKSkpOworCisJCQkJCWZpbmFsIEVNYXA8VVJJLCBOb2RlTGFiZWw+IGRhdGEgPSBwb3VsYXRpb25EYXRhCisJCQkJCQkJLmdldE5vZGVMYWJlbHMoKTsKKwkJCQkJZmluYWwgTm9kZUxhYmVsIG5vZGVMYWJlbCA9IChOb2RlTGFiZWwpIGRhdGEudmFsdWVzKCkKKwkJCQkJCQkudG9BcnJheSgpWzBdOworCQkJCQlmaW5hbCBVUkkgdGFyZ2V0VVJJID0gbm9kZUxhYmVsCisJCQkJCQkJLmdldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQoKTsKKworCQkJCQlmaW5hbCBTdHJpbmcgdGFyZ2V0SVNPS2V5U3RyaW5nID0gdGFyZ2V0VVJJLmxhc3RTZWdtZW50KCk7CisKKwkJCQkJLy8gaW5mZWN0ZWRSZWdpb25OYW1lID0gR2VvZ3JhcGhpY05hbWVzCisJCQkJCS8vIC5nZXROYW1lKHRhcmdldElTT0tleVN0cmluZyk7CisJCQkJCWluZmVjdGVkUmVnaW9uTmFtZSA9IHRhcmdldElTT0tleVN0cmluZzsKKworCQkJCQlyZXRWYWx1ZSA9IFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0lJbmZlY3RvcigpOworCQkJCQlyZXRWYWx1ZS5zZXRVUkkoU1RFTVVSSS5jcmVhdGVVUkkoIkluZmVjdG9yLyIrU1RFTVVSSS5nZW5lcmF0ZVVuaXF1ZVBhcnQoKSkpOworCQkJCQlyZXRWYWx1ZS5zZXRUYXJnZXRVUkkodGFyZ2V0VVJJKTsKKwkJCQkJcmV0VmFsdWUuc2V0RGlzZWFzZU5hbWUoZGlzZWFzZU1vZGVsLmdldERpc2Vhc2VOYW1lKCkpOworCQkJCQlyZXRWYWx1ZS5zZXRQb3B1bGF0aW9uSWRlbnRpZmllcihkaXNlYXNlTW9kZWwKKwkJCQkJCQkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSk7CisJCQkJCXJldFZhbHVlLnNldEluZmVjdGlvdXNDb3VudChJTkZFQ1RJT1VTX0NPVU5UKTsKKwkJCQkJcmV0VmFsdWUuc2V0SW5mZWN0UGVyY2VudGFnZShmYWxzZSk7CisJCQkJCXJldFZhbHVlLmdldER1YmxpbkNvcmUoKS5zZXRUaXRsZSgKKwkJCQkJCQkiSW5mZWN0ICIgKyBJTkZFQ1RJT1VTX0NPVU5UICsgIiAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCQkJKyBkaXNlYXNlTW9kZWwuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQorCQkJCQkJCQkJKyAiIGluICIgKyBpbmZlY3RlZFJlZ2lvbk5hbWUpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSAvLyBmb3IgZWFjaCBub2RlRGVjb3JhdG9yCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlSW5mZWN0b3IKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLnNwZWNpZmljYXRpb25zLklkZW50aWZpYWJsZVNwZWNpZmljYXRpb24jc2VyaWFsaXplKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2VyaWFsaXplKFN0cmluZyBkaXJlY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWZpbmFsIExpc3Q8SWRlbnRpZmlhYmxlPiBzZXQgPSBuZXcgQXJyYXlMaXN0PElkZW50aWZpYWJsZT4oKTsKKwkJc2V0LmFkZChnZXRJZGVudGlmaWFibGUoKSk7CisJCXNldC5hZGQoc2VxdWVuY2VyKTsKKwkJaWYgKGluZmVjdG9yICE9IG51bGwpIHsKKwkJCXNldC5hZGQoaW5mZWN0b3IpOworCQl9CisKKwkJVXRpbGl0eS5zZXJpYWxpemVJZGVudGlmaWFibGVzKHNldCwgY29udmVydGVyLm5vcm1hbGl6ZShVUkkKKwkJCQkuY3JlYXRlRmlsZVVSSShkaXJlY3RvcnkgKyBGaWxlLnNlcGFyYXRvcgorCQkJCQkJKyBnZXRSZWxhdGl2ZVNlcmlhbGl6YXRpb25QYXRoQW5kRmlsZU5hbWUoKSkpKTsKKwl9IC8vIHNlcmlhbGl6ZQorCisJcHVibGljIGludCBjb21wYXJlVG8oRGlzZWFzZU1vZGVsU2NlbmFyaW9TcGVjaWZpY2F0aW9uIG8pIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gMDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25GaWxlTmFtZUV4dGVuc2lvbigpIHsKKwkJcmV0dXJuIFNjZW5hcmlvUGFja2FnZS5lTkFNRTsKKwl9CisKK30gLy8gRGlzZWFzZU1vZGVsU2NlbmFyaW9TcGVjaWZpY2F0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLnNjZW5hcmlvcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9pbnRlcm5hbC9kaXNlYXNlbW9kZWxzL3NjZW5hcmlvcy9EaXNlYXNlTW9kZWxTY2VuYXJpb0dlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLnNjZW5hcmlvcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9pbnRlcm5hbC9kaXNlYXNlbW9kZWxzL3NjZW5hcmlvcy9EaXNlYXNlTW9kZWxTY2VuYXJpb0dlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZjJlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2ludGVybmFsL2Rpc2Vhc2Vtb2RlbHMvc2NlbmFyaW9zL0Rpc2Vhc2VNb2RlbFNjZW5hcmlvR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwyNjQgQEAKKy8vIERpc2Vhc2VTY2VuYXJpb0dlbmVyYXRvci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5zY2VuYXJpb3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LklTT0tleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5Nb2RlbEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuUGx1Z2luRmlsZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VuZXJhdGVkcGx1Z2luLkR1YmxpbkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlbmVyYXRlZHBsdWdpbi5FeHRlbnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlbmVyYXRlZHBsdWdpbi5HZW5lcmF0ZWRwbHVnaW5GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW5lcmF0ZWRwbHVnaW4uUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW5lcmF0ZWRwbHVnaW4uU3RlbUNhdGVnb3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW9ncmFwaHkuR2VvZ3JhcGh5UGx1Z2luRmlsZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VvZ3JhcGh5Lm1vZGVscy5HZW9ncmFwaHlNb2RlbEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VvZ3JhcGh5LnNwZWNpZmljYXRpb25zLkFkbWluTGV2ZWxTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlb2dyYXBoeS5zcGVjaWZpY2F0aW9ucy5Db3VudHJ5R3JhcGhQcm9wZXJ0eUZpbGVTcGVjaWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5zcGVjaWZpY2F0aW9ucy5EaXNlYXNlTW9kZWxTY2VuYXJpb1NwZWNpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLnNwZWNpZmljYXRpb25zLklkZW50aWZpYWJsZVNwZWNpZmljYXRpb247CisKKy8qKgorICogVGhpcyBjbGFzcyBwcm9jZXNzZXMgdGhlIGdlbmVyYXRlZCBkaXNlYXNlIG1vZGVsIG1vZGVsIGZpbGVzIHRvIGNyZWF0ZQorICogRGlzZWFzZSBtb2RlbCBzY2VuYXJpb3MuCisgKi8KK3B1YmxpYyBjbGFzcyBEaXNlYXNlTW9kZWxTY2VuYXJpb0dlbmVyYXRvciBleHRlbmRzIEdlb2dyYXBoeU1vZGVsR2VuZXJhdG9yIHsKKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXByaXZhdGUgZmluYWwgTW9kZWxQYWNrYWdlIG1vZGVsUGFja2FnZSA9IE1vZGVsUGFja2FnZS5lSU5TVEFOQ0U7CisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHJpdmF0ZSBmaW5hbCBTdGFuZGFyZFBhY2thZ2Ugc3RhbmRhcmRQYWNrYWdlID0gU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRTsKKworCS8qKgorCSAqIFRoZSBpZCBvZiB0aGUgR2VvZ3JhcGh5IGNhdGVnb3J5CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfU0NFTkFSSU9fR0VPR1JBUEhZX0NBVEVHT1JZID0gUGx1Z2luRmlsZUdlbmVyYXRvci5JRF9TQ0VOQVJJT19DQVRFR09SWQorCQkJKyAiLmdlb2dyYXBoeSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBpZCBvZiB0aGUgUG9saXRpY2FsIGNhdGVnb3J5CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfU0NFTkFSSU9fR0VPR1JBUEhZX1BPTElUSUNBTF9DQVRFR09SWSA9IElEX1NDRU5BUklPX0dFT0dSQVBIWV9DQVRFR09SWQorCQkJKyAiLnBvbGl0aWNhbCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBpZCBvZiB0aGUgQ291bnRyaWVzIGNhdGVnb3J5CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfU0NFTkFSSU9fR0VPR1JBUEhZX1BPTElUSUNBTF9DT1VOVFJJRVNfQ0FURUdPUlkgPSBJRF9TQ0VOQVJJT19HRU9HUkFQSFlfUE9MSVRJQ0FMX0NBVEVHT1JZCisJCQkrICIuY291bnRyaWVzIjsgLy8kTk9OLU5MUy0xJAorCisJCisJc3RhdGljIHsKKwkJLy8gVGhpcyBzZXRzIHVwIHRoZSBtYXBwaW5nIGJldHdlZW4gdGhlICJwbGF0Zm9ybSIgVVJJJ3MgYW5kIHRoZQorCQkvLyBwcm9qZWN0cyBpbiB0aGUgZmlsZSBzeXN0ZW0uCisKKwkJLy8gQ1dEIGlzIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5CisJCWZpbmFsIFN0cmluZyBDV0QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gV09SS1NQQUNFIGlzIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIHBhcmVudCB3b3Jrc3BhY2UKKwkJZmluYWwgU3RyaW5nIFdPUktTUEFDRSA9IENXRC5zdWJzdHJpbmcoMCwgQ1dECisJCQkJLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSk7CisKKwkJLy8gVGhlIHBhdGggdG8gdGhlIGRpc2Vhc2VzIHByb2plY3QKKwkJZmluYWwgU3RyaW5nIERJU0VBU0VTX01PREVMU19NT0RFTFNfUFJPSkVDVF9ST09UID0gV09SS1NQQUNFCisJCQkJKyBGaWxlLnNlcGFyYXRvcgorCQkJCSsgb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmRpc2Vhc2Vtb2RlbHMubW9kZWxzLkFjdGl2YXRvci5QTFVHSU5fSUQKKwkJCQkrIEZpbGUuc2VwYXJhdG9yOworCisJCS8vIFRoZSBwYXRoIHRvIHRoZSBkaXNlYXNlcyBwcm9qZWN0CisJCWZpbmFsIFN0cmluZyBESVNFQVNFU19QUk9KRUNUX1JPT1QgPSBXT1JLU1BBQ0UgKyBGaWxlLnNlcGFyYXRvcgorCQkJCSsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcy5BY3RpdmF0b3IuUExVR0lOX0lECisJCQkJKyBGaWxlLnNlcGFyYXRvcjsKKworCQlmaW5hbCBNYXA8U3RyaW5nLCBVUkk+IHBsYXRmb3JtUmVzb3VyY2VNYXAgPSBFY29yZVBsdWdpbgorCQkJCS5nZXRQbGF0Zm9ybVJlc291cmNlTWFwKCk7CisKKwkJLy8gUmVnaXN0ZXIgdGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgcHJvamVjdCBpZCBhbmQgdGhlIGFic29sdXRlIHBhdGggdG8KKwkJLy8gdGhlIHByb2plY3QgaW4gdGhlIGZpbGUgc3lzdGVtLiBUaGlzIHdpbGwgYmUgZm91bmQgbGF0ZXIgd2hlbgorCQkvLyBkZXNlcmlhbGl6aW5nIHdoZW4gdGhlIHBsYXRmb3JtIFVSSSBpcyBtYXBwZWQuCisKKwkJcGxhdGZvcm1SZXNvdXJjZU1hcAorCQkJCS5wdXQoCisJCQkJCQlvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZGlzZWFzZW1vZGVscy5tb2RlbHMuQWN0aXZhdG9yLlBMVUdJTl9JRCwKKwkJCQkJCVVSSS5jcmVhdGVGaWxlVVJJKERJU0VBU0VTX01PREVMU19NT0RFTFNfUFJPSkVDVF9ST09UKSk7CisKKwkJcGxhdGZvcm1SZXNvdXJjZU1hcC5wdXQoCisJCQkJb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcy5BY3RpdmF0b3IuUExVR0lOX0lELCBVUkkKKwkJCQkJCS5jcmVhdGVGaWxlVVJJKERJU0VBU0VTX1BST0pFQ1RfUk9PVCkpOworCX0gLy8gc3RhdGljCisKKwkvKioKKwkgKiBAcGFyYW0gYXJncworCSAqICAgICAgICAgICAgdGhlIFVSSSBvZiB0aGUgZ2VuZXJhdGVkIGdlb2dyYXBoeSBwbHVnaW4ueG1sIGZpbGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihmaW5hbCBTdHJpbmdbXSBhcmdzKSB7CisJCS8vIElzIHRoZSBwbHVnaW4gZmlsZSBzcGVjaWZpZWQ/CisJCWlmIChhcmdzLmxlbmd0aCA9PSAwKSB7CisJCQkvLyBZZXMKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiTWlzc2luZyBzcGVjaWZpY2F0aW9uIG9mIHRoZSBwbHVnaW4gZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCX0gLy8gaWYKKwkJZWxzZSB7CisKKwkJCWZpbmFsIFN0cmluZyBHRU5FUkFURURfRklMRVNfUEFUSCA9IGFyZ3NbMF07CisJCQlmaW5hbCBTdHJpbmcgZGlzZWFzZU1vZGVsTW9kZWxQcm9qZWNOYW1lID0gYXJnc1sxXTsKKworCQkJZmluYWwgU3RyaW5nIEdFTkVSQVRFRF9TQ0VOQVJJT1NfUEFUSCA9IEdFTkVSQVRFRF9GSUxFU19QQVRICisJCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyAicmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICsgImRhdGEiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJZmluYWwgRmlsZSBkaXNlYXNlTW9kZWxNb2RlbFBsdWdpbkZpbGUgPSBuZXcgRmlsZSgKKwkJCQkJIi4uIgkrIEZpbGUuc2VwYXJhdG9yICsgZGlzZWFzZU1vZGVsTW9kZWxQcm9qZWNOYW1lICsgRmlsZS5zZXBhcmF0b3IgKyBQbHVnaW5GaWxlR2VuZXJhdG9yLlBMVUdJTl9YTUxfRklMRV9OQU1FKTsgLy8kTk9OLU5MUy0xJAorCQkJZmluYWwgVVJJIGRpc2Vhc2VNb2RlbE1vZGVsUGx1Z2luRmlsZVVSSSA9IFVSSQorCQkJCQkuY3JlYXRlRmlsZVVSSShkaXNlYXNlTW9kZWxNb2RlbFBsdWdpbkZpbGUKKwkJCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisJCQlEaXNlYXNlTW9kZWxTY2VuYXJpb0dlbmVyYXRvciBkbXNnID0gbmV3IERpc2Vhc2VNb2RlbFNjZW5hcmlvR2VuZXJhdG9yKCk7CisKKwkJCWZpbmFsIE1hcDxJU09LZXksIExpc3Q8RGlzZWFzZU1vZGVsU2NlbmFyaW9TcGVjaWZpY2F0aW9uPj4gc2NlbmFyaW9TcGVjaWZpY2F0aW9ucyA9IGRtc2cKKwkJCQkJLnByb2Nlc3NGaWxlczIoZGlzZWFzZU1vZGVsTW9kZWxQbHVnaW5GaWxlVVJJKTsKKworCQkJZm9yIChmaW5hbCBJU09LZXkgaXNvS2V5IDogc29ydElTT0tleXMoc2NlbmFyaW9TcGVjaWZpY2F0aW9ucykpIHsKKwkJCQkvLyBOb3cgc2VyaWFsaXplIHRoZSBJZGVudGlmaWFibGVzCisJCQkJZm9yIChmaW5hbCBJZGVudGlmaWFibGVTcGVjaWZpY2F0aW9uIGdtcyA6IHNjZW5hcmlvU3BlY2lmaWNhdGlvbnMKKwkJCQkJCS5nZXQoaXNvS2V5KSkgeworCQkJCQl0cnkgeworCQkJCQkJZ21zLnNlcmlhbGl6ZShHRU5FUkFURURfU0NFTkFSSU9TX1BBVEgpOworCQkJCQl9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQl9CisJCQkJfSAvLyBmb3IgZ21zCisJCQl9IC8vIGZvciBpc29LZXkKKworCQkJLy8gQ3JlYXRlIHRoZSBpbnN0YW5jZSBvZiBwbHVnaW4ueG1sIHRoYXQgd2UnbGwgc2VyaWFsaXplIGxhdGVyCisJCQlmaW5hbCBQbHVnaW4gcGx1Z2lueG1sID0gR2VuZXJhdGVkcGx1Z2luRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJLmNyZWF0ZVBsdWdpbigpOworCQkJZmluYWwgRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IEdlbmVyYXRlZHBsdWdpbkZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCS5jcmVhdGVFeHRlbnNpb24oKTsKKworCQkJLy8gQWRkIHRoZSAic2NlbmFyaW8iIGV4dGVuc2lvbiBwb2ludAorCQkJZXh0ZW5zaW9uLnNldFBvaW50KENvbnN0YW50cy5JRF9TQ0VOQVJJT19FWFRFTlNJT05fUE9JTlQpOworCisJCQkvLyBBZGQgdGhlIGNhdGVnb3JpZXMgdG8gdGhlIGV4dGVuc2lvbgorCQkJYWRkQ2F0YWdvcmllc1RvRXh0ZW5zaW9uKGV4dGVuc2lvbik7CisJCQkKKwkJCXBsdWdpbnhtbC5nZXRFeHRlbnNpb25lbGVtZW50KCkuYWRkKGV4dGVuc2lvbik7CisKKwkJCS8vIE5vdyBhZGQgdGhlIGR1YmxpbiBjb3JlIGVudHJpZXMgdG8gdGhlIHBsdWdpbi54bWwgZmlsZSBmb3IKKwkJCS8vIGVhY2ggb2YgdGhlIG1vZGVscworCQkJZm9yIChmaW5hbCBJU09LZXkgaXNvS2V5IDogc29ydElTT0tleXMoc2NlbmFyaW9TcGVjaWZpY2F0aW9ucykpIHsKKwkJCQlmaW5hbCBTdGVtQ2F0ZWdvcnkgY291bnRyeUNhdGVnb3J5ID0gR2VuZXJhdGVkcGx1Z2luRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCS5jcmVhdGVTdGVtQ2F0ZWdvcnkoKTsKKwkJCQlmaW5hbCBTdHJpbmcgQ09VTlRSWV9DQVRBR09SWV9TVFJJTkcgPSBJRF9TQ0VOQVJJT19HRU9HUkFQSFlfUE9MSVRJQ0FMX0NPVU5UUklFU19DQVRFR09SWQorCQkJCQkJKyAiLiIgKyBpc29LZXkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpOyAvLyROT04tTkxTLTEkCisJCQkJY291bnRyeUNhdGVnb3J5LnNldElkKENPVU5UUllfQ0FUQUdPUllfU1RSSU5HKTsKKwkJCQljb3VudHJ5Q2F0ZWdvcnkuc2V0TmFtZShpc29LZXkudG9TdHJpbmcoKSk7CisJCQkJY291bnRyeUNhdGVnb3J5CisJCQkJCQkuc2V0UGFyZW50SWQoSURfU0NFTkFSSU9fR0VPR1JBUEhZX1BPTElUSUNBTF9DT1VOVFJJRVNfQ0FURUdPUlkpOworCQkJCWV4dGVuc2lvbi5nZXRDYXRlZ29yaWVzKCkuYWRkKGNvdW50cnlDYXRlZ29yeSk7CisJCQkJZm9yIChmaW5hbCBJZGVudGlmaWFibGVTcGVjaWZpY2F0aW9uIGdtcyA6IHNjZW5hcmlvU3BlY2lmaWNhdGlvbnMKKwkJCQkJCS5nZXQoaXNvS2V5KSkgeworCQkJCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gR2VuZXJhdGVkcGx1Z2luRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCQkuY3JlYXRlRHVibGluQ29yZSgpOworCQkJCQlkYy5zZXRDYXRlZ29yeUlkKENPVU5UUllfQ0FUQUdPUllfU1RSSU5HKTsKKwkJCQkJZXh0ZW5zaW9uLmdldER1YmxpbkNvcmVzKCkuYWRkKAorCQkJCQkJCXBvcHVsYXRlR2VuZXJhdGVkREMoZGMsIGdtcy5nZXREdWJsaW5Db3JlKCkpKTsKKwkJCQl9IC8vIGZvciBnbXMKKwkJCX0gLy8gZm9yIGlzb0tleQorCisJCQlmaW5hbCBVUkkgVEVNUF9QTFVHSU5YTUxfVVJJID0gVVJJCisJCQkJCS5jcmVhdGVGaWxlVVJJKEdFTkVSQVRFRF9GSUxFU19QQVRIICsgRmlsZS5zZXBhcmF0b3IKKwkJCQkJCQkrIFBsdWdpbkZpbGVHZW5lcmF0b3IuUExVR0lOX1hNTF9GSUxFX05BTUUpOworCisJCQkvLyBTZXJpYWxpemUgdGhlIHBsdWdpbi54bWwgZmlsZS4KKwkJCU1vZGVsR2VuZXJhdG9yLndyaXRlUGx1Z2lueG1sKHBsdWdpbnhtbCwgVEVNUF9QTFVHSU5YTUxfVVJJKTsKKworCQkJLy8gQ3JlYXRlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlCisJCQljcmVhdGVQbHVnaW5Qcm9wZXJ0dGllcyhHRU5FUkFURURfRklMRVNfUEFUSCk7CisJCX0gLy8gZWxzZQorCX0gLy8gbWFpbgorCisJcHJpdmF0ZSBNYXA8SVNPS2V5LCBMaXN0PERpc2Vhc2VNb2RlbFNjZW5hcmlvU3BlY2lmaWNhdGlvbj4+IHByb2Nlc3NGaWxlczIoCisJCQlVUkkgZGlzZWFzZU1vZGVsTW9kZWxQbHVnaW5GaWxlVVJJKSB7CisKKwkJZmluYWwgTWFwPElTT0tleSwgTGlzdDxEaXNlYXNlTW9kZWxTY2VuYXJpb1NwZWNpZmljYXRpb24+PiByZXRWYWx1ZSA9IG5ldyBIYXNoTWFwPElTT0tleSwgTGlzdDxEaXNlYXNlTW9kZWxTY2VuYXJpb1NwZWNpZmljYXRpb24+PigpOworCisJCS8vIEdldCB0aGUgY29udGVudHMgb2YgdGhlIGRpc2Vhc2UgbW9kZWwgbW9kZWwgcGx1Zy54bWwgZmlsZQorCQlmaW5hbCBQbHVnaW4gZGlzZWFzZU1vZGVsUGx1Z2luWE1MID0gZ2V0UGx1Z2lueG1sKGRpc2Vhc2VNb2RlbE1vZGVsUGx1Z2luRmlsZVVSSSk7CisKKwkJZm9yIChFeHRlbnNpb24gZXh0ZW5zaW9uIDogZGlzZWFzZU1vZGVsUGx1Z2luWE1MLmdldEV4dGVuc2lvbmVsZW1lbnQoKSkgeworCQkJZm9yIChEdWJsaW5Db3JlIGRjIDogZXh0ZW5zaW9uLmdldER1YmxpbkNvcmVzKCkpIHsKKwkJCQlmaW5hbCBNYXA8SVNPS2V5LCBBZG1pbkxldmVsU2V0PiBpc29LZXlBZG1pbkxldmVsU2V0TWFwID0gQ291bnRyeUdyYXBoUHJvcGVydHlGaWxlU3BlY2lmaWNhdGlvbgorCQkJCQkJLnBhcnNlRHVibGluQ29yZUNvdmVyYWdlU3RyaW5nKGRjLmdldENvdmVyYWdlKCkpOworCQkJCWZpbmFsIEFkbWluTGV2ZWxTZXQgYWRtaW5MZXZlbFNldCA9IChBZG1pbkxldmVsU2V0KSBpc29LZXlBZG1pbkxldmVsU2V0TWFwCisJCQkJCQkudmFsdWVzKCkudG9BcnJheSgpWzBdOworCQkJCWZpbmFsIElTT0tleSBpc29LZXkgPSAoSVNPS2V5KSBpc29LZXlBZG1pbkxldmVsU2V0TWFwLmtleVNldCgpCisJCQkJCQkudG9BcnJheSgpWzBdOworCisJCQkJTGlzdDxEaXNlYXNlTW9kZWxTY2VuYXJpb1NwZWNpZmljYXRpb24+IHRlbXAgPSByZXRWYWx1ZQorCQkJCQkJLmdldChpc29LZXkpOworCQkJCWlmICh0ZW1wID09IG51bGwpIHsKKwkJCQkJdGVtcCA9IG5ldyBBcnJheUxpc3Q8RGlzZWFzZU1vZGVsU2NlbmFyaW9TcGVjaWZpY2F0aW9uPigpOworCQkJCQlyZXRWYWx1ZS5wdXQoaXNvS2V5LCB0ZW1wKTsKKwkJCQl9CisJCQkJdGVtcC5hZGQobmV3IERpc2Vhc2VNb2RlbFNjZW5hcmlvU3BlY2lmaWNhdGlvbihpc29LZXksCisJCQkJCQlhZG1pbkxldmVsU2V0LCBkYykpOworCQkJfSAvLyBmb3IgZGMKKwkJfSAvLyBmb3IgRGlzZWFzZSBNb2RlbHMKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBwcm9jZXNzRmlsZXMyCisJCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRDYXRhZ29yaWVzVG9FeHRlbnNpb24oZmluYWwgRXh0ZW5zaW9uIGV4dGVuc2lvbikgeworCisJCWZpbmFsIFN0ZW1DYXRlZ29yeSBzY2VuYXJpb0NhdGFnb3J5ID0gR2VuZXJhdGVkcGx1Z2luRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlU3RlbUNhdGVnb3J5KCk7CisJCXNjZW5hcmlvQ2F0YWdvcnkuc2V0SWQoUGx1Z2luRmlsZUdlbmVyYXRvci5JRF9TQ0VOQVJJT19DQVRFR09SWSk7CisJCXNjZW5hcmlvQ2F0YWdvcnkuc2V0TmFtZSgiJSIgKyBQbHVnaW5GaWxlR2VuZXJhdG9yLlVJX1NURU1fQ0FURUdPUllfTkFNRSk7IC8vJE5PTi1OTFMtMSQKKwkJc2NlbmFyaW9DYXRhZ29yeS5zZXRQYXJlbnRJZCgiLyIpOyAvLyROT04tTkxTLTEkCisJCWV4dGVuc2lvbi5nZXRDYXRlZ29yaWVzKCkuYWRkKHNjZW5hcmlvQ2F0YWdvcnkpOworCisJCWZpbmFsIFN0ZW1DYXRlZ29yeSBnZW9ncmFwaHlDYXRhZ29yeSA9IEdlbmVyYXRlZHBsdWdpbkZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZVN0ZW1DYXRlZ29yeSgpOworCQlnZW9ncmFwaHlDYXRhZ29yeS5zZXRJZChJRF9TQ0VOQVJJT19HRU9HUkFQSFlfQ0FURUdPUlkpOworCQlnZW9ncmFwaHlDYXRhZ29yeQorCQkJCS5zZXROYW1lKCIlIiArIEdlb2dyYXBoeVBsdWdpbkZpbGVHZW5lcmF0b3IuVUlfR0VPR1JBUEhZX0NBVEVHT1JZX05BTUUpOyAvLyROT04tTkxTLTEkCisJCWdlb2dyYXBoeUNhdGFnb3J5LnNldFBhcmVudElkKFBsdWdpbkZpbGVHZW5lcmF0b3IuSURfU0NFTkFSSU9fQ0FURUdPUlkpOworCQlleHRlbnNpb24uZ2V0Q2F0ZWdvcmllcygpLmFkZChnZW9ncmFwaHlDYXRhZ29yeSk7CisKKwkJZmluYWwgU3RlbUNhdGVnb3J5IHBvbGl0aWNhbENhdGFnb3J5ID0gR2VuZXJhdGVkcGx1Z2luRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlU3RlbUNhdGVnb3J5KCk7CisJCXBvbGl0aWNhbENhdGFnb3J5LnNldElkKElEX1NDRU5BUklPX0dFT0dSQVBIWV9QT0xJVElDQUxfQ0FURUdPUlkpOworCQlwb2xpdGljYWxDYXRhZ29yeQorCQkJCS5zZXROYW1lKCIlIiArIEdlb2dyYXBoeVBsdWdpbkZpbGVHZW5lcmF0b3IuVUlfUE9MSVRJQ0FMX0NBVEVHT1JZX05BTUUpOyAvLyROT04tTkxTLTEkCisJCXBvbGl0aWNhbENhdGFnb3J5LnNldFBhcmVudElkKElEX1NDRU5BUklPX0dFT0dSQVBIWV9DQVRFR09SWSk7CisJCWV4dGVuc2lvbi5nZXRDYXRlZ29yaWVzKCkuYWRkKHBvbGl0aWNhbENhdGFnb3J5KTsKKworCQlmaW5hbCBTdGVtQ2F0ZWdvcnkgY291bnRyaWVzQ2F0YWdvcnkgPSBHZW5lcmF0ZWRwbHVnaW5GYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVTdGVtQ2F0ZWdvcnkoKTsKKwkJY291bnRyaWVzQ2F0YWdvcnkKKwkJCQkuc2V0SWQoSURfU0NFTkFSSU9fR0VPR1JBUEhZX1BPTElUSUNBTF9DT1VOVFJJRVNfQ0FURUdPUlkpOworCQljb3VudHJpZXNDYXRhZ29yeQorCQkJCS5zZXROYW1lKCIlIiArIEdlb2dyYXBoeVBsdWdpbkZpbGVHZW5lcmF0b3IuVUlfQ09VTlRSSUVTX0NBVEVHT1JZX05BTUUpOyAvLyROT04tTkxTLTEkCisJCWNvdW50cmllc0NhdGFnb3J5LnNldFBhcmVudElkKElEX1NDRU5BUklPX0dFT0dSQVBIWV9QT0xJVElDQUxfQ0FURUdPUlkpOworCQlleHRlbnNpb24uZ2V0Q2F0ZWdvcmllcygpLmFkZChjb3VudHJpZXNDYXRhZ29yeSk7CisJfSAvLyBhZGRDYXRhZ29yaWVzVG9FeHRlbnNpb24KK30gLy8gRGlzZWFzZU1vZGVsU2NlbmFyaW9HZW5lcmF0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zL3VwZGF0ZS54bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zL3VwZGF0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1NGQwNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5zY2VuYXJpb3MvdXBkYXRlLnhtbApAQCAtMCwwICsxLDE1OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgICAgIEFOVCBzY3JpcHQgdG8gYnVpbGQgb3JnLmVjbGlzcGUub2hmLnN0ZW0uZ2VvZ3JhcGh5IHByb2plY3QgCisgICAgIGFuZCB0aGUgaW5pdGlhbCBzZXQgb2YgU1RFTSBzY2VuYXJpb3MuICAKKyAgICAgVGhpcyBtdXN0IGJlIHJ1biBhZnRlciBpbnN0YWxsaW5nIHRoZSBTVEVNIHdvcmtzcGFjZSBhbmQgYWZ0ZXIgY2hhbmdlcworICAgICB0byBjb2RlIGdlbmVyYXRlZCBieSBFTUYgbW9kZWxzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzxwcm9qZWN0IG5hbWU9IlNURU0gSW50ZXJuYWwgRGlzZWFzZSBNb2RlbCBTY2VuYXJpb3MiIGRlZmF1bHQ9InVwZGF0ZV9hbGwiPgorCTxkZXNjcmlwdGlvbj4KKyAgICAgVXNlIHRoZSBwcm9wZXJ0aWVzIGZpbGVzIHRvIHBvcHVsYXRlIHRoZSBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZGlzZWFzZW1vZGVscy5tb2RlbHMgcGx1Z2luCisgICAgPC9kZXNjcmlwdGlvbj4KKworCTwhLS0gUCByIG8gaiBlIGMgdCAgUyBwIGUgYyBpIGYgaSBjIGEgdCBpIG8gbiBzIC0tPgorCisJPCEtLSBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCAtLT4KKwk8cHJvcGVydHkgbmFtZT0icHJvamVjdC5uYW1lIiB2YWx1ZT0ic3RlbSIgLz4KKworCQorCTwhLS0gQXJlIHdlIHJ1bm5pbmcgaGVhZGxlc3M/IC0tPgorCTxjb25kaXRpb24gcHJvcGVydHk9InJ1bm5pbmdIZWFkbGVzcyIgPgorCQk8aXNzZXQgcHJvcGVydHk9ImJ1aWxkRGlyZWN0b3J5IiAvPgorCTwvY29uZGl0aW9uPgorCQorCTwhLS0gVGhlIGJ1aWxkRGlyZWN0b3J5IHByb3BlcnR5IGlzIHNldCBpbiBhIGhlYWRsZXNzIGJ1aWxkIC0tPgorCTxjb25kaXRpb24gcHJvcGVydHk9InBsdWdpblJvb3REaXJlY3RvcnkiIHZhbHVlPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zIiBlbHNlPSIuLiI+CisJCTxpc3NldCBwcm9wZXJ0eT0icnVubmluZ0hlYWRsZXNzIiAvPgorCTwvY29uZGl0aW9uPgorCisJPCEtLSBUaGUgYmFzZUxvY2F0aW9uIHByb3BlcnR5IGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZWNsaXBzZSBob21lIGluc3RhbGxhdGlvbiAtLT4KKwk8IS0tIEl0IGlzIHVzZWQgdG8gZmluZCBlY2xpcHNlIHBsdWdpbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorCTwhLS0gSXQgaXMgc2V0IGluIGEgaGVhZGxlc3MgYnVpbGQsIGJ1dCBub3Qgb25lIHN0YXJ0ZWQgbWFudWFsbHkgZnJvbSBFY2xpcHNlICAgLS0+CisJPGNvbmRpdGlvbiBwcm9wZXJ0eT0iYmFzZUxvY2F0aW9uIiB2YWx1ZT0iJHtlY2xpcHNlLnBkZWJ1aWxkLmhvbWV9Li4vLi4iPgorCQk8bm90PgorCQkJPGlzc2V0IHByb3BlcnR5PSJydW5uaW5nSGVhZGxlc3MiIC8+CisJCTwvbm90PgorCTwvY29uZGl0aW9uPgorCisJPCEtLSBUaGlzIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgY2xhc3MgZmlsZXMgb2YgdGhlIGJ1aWx0IHBsdWctaW5zICAgICAtLT4KKwk8IS0tIElmIHRoaXMgaXMgYSBtYW51YWwgYnVpbGQgc3RhcnRlZCBmcm9tIEVjbGlwc2UgdGhlbiB0aGUgZGlyZWN0b3J5IC0tPgorCTwhLS0gaXMgImJpbiIsIGlmIGl0cyBhIGhlYWRsZXNzIGJ1aWxkIHRoZW4gdGhlIGRpcmVjdG9yeSBpcyAiQGRvdCIgICAgLS0+CisJPCEtLSBUaGUgcHJvcGVydHkgYmFzZUxvY2F0aW9uIGlzIHNldCBpbiBhIGhlYWRsZXNzIGJ1aWxkICAgICAgICAgICAgICAtLT4KKwk8Y29uZGl0aW9uIHByb3BlcnR5PSJ0YXJnZXRCaW4iIHZhbHVlPSJAZG90IiBlbHNlPSJiaW4iPgorCQk8aXNzZXQgcHJvcGVydHk9InJ1bm5pbmdIZWFkbGVzcyIgLz4KKwk8L2NvbmRpdGlvbj4KKwkKKwkKKwk8IS0tIFRoZSBwcmVmaXggZm9yIGZ1bGx5IHF1YWxpZmllZCBuYW1lcyAtLT4KKwk8cHJvcGVydHkgbmFtZT0iSURfUk9PVCIgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0iIC8+CisKKwk8IS0tIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gdGhhdCBjb250YWlucyB0aGUgcGx1Z2luLnhtbCBmaWxlIHRvIHNjYW4gLS0+CisJPHByb3BlcnR5IG5hbWU9InNjYW4ucGx1Z2luIiB2YWx1ZT0iJHtJRF9ST09UfS5kYXRhLmRpc2Vhc2Vtb2RlbHMubW9kZWxzIiAvPgorCQorCTwhLS0gVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBwbHVnaW4gKGkuZS4sIHRoZSBvbmUgdGhhdCBjb250YWlucyB0aGlzIGZpbGUgLS0+CisJPHByb3BlcnR5IG5hbWU9InNvdXJjZS5wbHVnaW4iIHZhbHVlPSIke0lEX1JPT1R9LmludGVybmFsLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zIiAvPgorCisJPCEtLSBUaGUgbmFtZSBvZiB0aGUgcGx1Z2luIHdpdGggdGhlIGRpc2Vhc2VzIC0tPgorCTxwcm9wZXJ0eSBuYW1lPSJkaXNlYXNlLnBsdWdpbiIgIHZhbHVlPSIke0lEX1JPT1R9LmRpc2Vhc2VzIiAvPgorCQorCTwhLS0gVGhlIG5hbWUgb2YgdGhlIHRhcmdldCBwbHVnaW4gLS0+CisJPHByb3BlcnR5IG5hbWU9InRhcmdldC5wbHVnaW4iIHZhbHVlPSIke0lEX1JPT1R9LmRhdGEuZGlzZWFzZW1vZGVscy5zY2VuYXJpb3MiIC8+CisKKwk8IS0tIFRoZSBwYXRoIHRvIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgc291cmNlIHBsdWdpbiAtLT4KKwk8cHJvcGVydHkgbmFtZT0icGF0aC5zb3VyY2VwbHVnaW4iIGxvY2F0aW9uPSIke3BsdWdpblJvb3REaXJlY3Rvcnl9LyR7c291cmNlLnBsdWdpbn0iIC8+CisKKwk8IS0tIFRoZSBwYXRoIHRvIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgcGx1Z2luIHRoYXQgd2lsbCBiZSBhdWdtZW50ZWQgd2l0aCBnZW5lcmF0ZWQgY29udGVudCAtLT4KKwk8cHJvcGVydHkgbmFtZT0icGF0aC50YXJnZXRwbHVnaW4iIGxvY2F0aW9uPSIke3BsdWdpblJvb3REaXJlY3Rvcnl9LyR7dGFyZ2V0LnBsdWdpbn0iIC8+CisKKwk8IS0tIFRoZSBwYXRoIHRvIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgcmVzb3VyY2UgZmlsZXMgLS0+CisJPHByb3BlcnR5IG5hbWU9InBhdGgucmVzb3VyY2UuZmlsZXMiIHZhbHVlPSIke3BhdGguc291cmNlcGx1Z2lufS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5IiAvPgorCisJPCEtLSBUaGUgcGF0aCB0byB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIHBsdWdpbiB0aGF0IHdpbGwgYmUgYXVnbWVudGVkIHdpdGggZ2VuZXJhdGVkIGNvbnRlbnQtLT4KKwk8cHJvcGVydHkgbmFtZT0icGF0aC5nZW5lcmF0ZWQuZmlsZXMiIHZhbHVlPSIke3BhdGguc291cmNlcGx1Z2lufS90ZW1wIiAvPgorCisJPCEtLSBUaGUgcGF0aCB0byB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgZ2VvZ3JhcGh5IHNvdXJjZSBjb2RlIC0tPgorCTxwcm9wZXJ0eSBuYW1lPSJwYXRoLmdlb2dyYXBoeS5zcmMiIHZhbHVlPSIke3BhdGgudGFyZ2V0cGx1Z2lufS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kYXRhL2dlb2dyYXBoeS9wb3B1bGF0aW9uL2h1bWFuL21vZGVscyIgLz4KKworCTwhLS0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbi54bWwgZmlsZSB0aGF0IHdpbGwgYmUgYXVnbWVudGVkIHdpdGggZ2VuZXJhdGVkIGNvbnRlbnQtLT4KKwk8cHJvcGVydHkgbmFtZT0iZmlsZS50YXJnZXQucGx1Z2lueG1sIiB2YWx1ZT0iJHtwYXRoLnRhcmdldHBsdWdpbn0vcGx1Z2luLnhtbCIgLz4KKworCTwhLS0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgdGhhdCB3aWxsIGJlIGF1Z21lbnRlZCB3aXRoIGdlbmVyYXRlZCBjb250ZW50LS0+CisJPHByb3BlcnR5IG5hbWU9ImZpbGUudGFyZ2V0LnBsdWdpbnByb3BlcnRpZXMiIHZhbHVlPSIke3BhdGgudGFyZ2V0cGx1Z2lufS9wbHVnaW4ucHJvcGVydGllcyIgLz4KKworCTwhLS0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbi54bWwgZmlsZSB0aGF0IHRoYXQgaXMgdGhlIGFnZ3JlZ2F0aW9uIG9mIHRoZSBnZW5lcmF0ZWQgY29udGVudC0tPgorCTxwcm9wZXJ0eSBuYW1lPSJmaWxlLnV0aWwucGx1Z2lueG1sIiB2YWx1ZT0iJHtwYXRoLmdlbmVyYXRlZC5maWxlc30vcGx1Z2luLnhtbCIgLz4KKworCTwhLS0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgdGhhdCB0aGF0IGlzIHRoZSBhZ2dyZWdhdGlvbiBvZiB0aGUgZ2VuZXJhdGVkIGNvbnRlbnQtLT4KKwk8cHJvcGVydHkgbmFtZT0iZmlsZS51dGlsLnBsdWdpbnByb3BlcnRpZXMiIHZhbHVlPSIke3BhdGguZ2VuZXJhdGVkLmZpbGVzfS9wbHVnaW4ucHJvcGVydGllcyIgLz4KKworICAgIDwhLS0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbi54bWwgZmlsZSB0aGF0IHRoYXQgaXMgdGhlIGFnZ3JlZ2F0aW9uIG9mIHRoZSBnZW5lcmF0ZWQgY29udGVudC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJmaWxlLnRhcmdldC5wbHVnaW5wcm9wZXJ0aWVzIiB2YWx1ZT0iJHtwYXRoLmdlbmVyYXRlZC5maWxlc30vcGx1Z2luLnByb3BlcnRpZXMiIC8+CisKKwk8IS0tIFRoZSBjbGFzcyBwYXRoIHRvIHVzZSAtLT4KKwk8cGF0aCBpZD0iY2xhc3NwYXRoLnJ1bnRpbWUiPiAKKwkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3BhdGguc291cmNlcGx1Z2lufS8ke3RhcmdldEJpbn0iIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtwbHVnaW5Sb290RGlyZWN0b3J5fS8ke0lEX1JPT1R9LmNvcmUvJHt0YXJnZXRCaW59IiAvPgorCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7cGx1Z2luUm9vdERpcmVjdG9yeX0vJHtJRF9ST09UfS5kZWZpbml0aW9ucy8ke3RhcmdldEJpbn0iIC8+CisJICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtwbHVnaW5Sb290RGlyZWN0b3J5fS8ke0lEX1JPT1R9LmludGVybmFsLmRhdGEvJHt0YXJnZXRCaW59IiAvPgorCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7cGx1Z2luUm9vdERpcmVjdG9yeX0vJHtJRF9ST09UfS5pbnRlcm5hbC5kYXRhLmdlb2dyYXBoeS8ke3RhcmdldEJpbn0iIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtwbHVnaW5Sb290RGlyZWN0b3J5fS8ke0lEX1JPT1R9LmludGVybmFsLmRhdGEuZ2VvZ3JhcGh5Lm1vZGVscy8ke3RhcmdldEJpbn0iIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtwbHVnaW5Sb290RGlyZWN0b3J5fS8ke0lEX1JPT1R9LmRhdGEuZ2VvZ3JhcGh5LyR7dGFyZ2V0QmlufSIgLz4KKwkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3BsdWdpblJvb3REaXJlY3Rvcnl9LyR7SURfUk9PVH0uZGlzZWFzZW1vZGVscy8ke3RhcmdldEJpbn0iIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtwbHVnaW5Sb290RGlyZWN0b3J5fS8ke0lEX1JPT1R9LnBvcHVsYXRpb25tb2RlbHMvJHt0YXJnZXRCaW59IiAvPgorCQk8ZmlsZXNldCBkaXI9IiR7YmFzZUxvY2F0aW9ufS9wbHVnaW5zLyI+CisJCQk8aW5jbHVkZSBuYW1lPSIqZW1mKi5qYXIiIC8+CisJCTwvZmlsZXNldD4KKwk8L3BhdGg+CisKKwk8dGFyZ2V0IG5hbWU9InVwZGF0ZV9hbGwiIGRlcGVuZHM9InVwZGF0ZSIgLz4KKworCTwhLS0gVXBkYXRlIHRoZSBnZW9ncmFwaHkgcGx1Z2luIHdpdGggdGhlIGxhdGVzdCBkZWZpbml0aW9ucyAtLT4KKwk8dGFyZ2V0IG5hbWU9InVwZGF0ZSIgZGVwZW5kcz0idXBkYXRlX2Rpc2Vhc2Vfc2NlbmFyaW9zLCB1cGRhdGVfZGlzZWFzZW1vZGVsc19zY2VuYXJpb3NfcGx1Z2luX3htbCwgdXBkYXRlX2Rpc2Vhc2Vtb2RlbHNfc2NlbmFyaW9zX3BsdWdpbl9wcm9wZXJ0aWVzIiAvPgorCisJPHRhcmdldCBuYW1lPSJ1cGRhdGVfZGlzZWFzZW1vZGVsc19zY2VuYXJpb3NfcGx1Z2luX3htbCIgZGVwZW5kcz0iY3JlYXRlX2NhbmRpZGF0ZXMiPgorCQk8Y29weSB0b2ZpbGU9IiR7ZmlsZS50YXJnZXQucGx1Z2lueG1sfSIgZmlsZT0iJHtmaWxlLnV0aWwucGx1Z2lueG1sfSIgb3ZlcndyaXRlPSJ0cnVlIiAvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJ1cGRhdGVfZGlzZWFzZW1vZGVsc19zY2VuYXJpb3NfcGx1Z2luX3Byb3BlcnRpZXMiIGRlcGVuZHM9ImNyZWF0ZV9jYW5kaWRhdGVzIj4KKwkJPGNvcHkgdG9maWxlPSIke2ZpbGUudGFyZ2V0LnBsdWdpbnByb3BlcnRpZXN9IiBmaWxlPSIke2ZpbGUudXRpbC5wbHVnaW5wcm9wZXJ0aWVzfSIgb3ZlcndyaXRlPSJ0cnVlIiAvPgorCTwvdGFyZ2V0PgorCisJPCEtLSBVcGRhdGUgdGhlIGdyYXBoIGZpbGVzIGluIHRoZSBnZW9ncmFwaHkgcGx1Z2luIC0tPgorCTx0YXJnZXQgbmFtZT0idXBkYXRlX2Rpc2Vhc2Vfc2NlbmFyaW9zIiBkZXBlbmRzPSJjcmVhdGVfY2FuZGlkYXRlcyI+CisJCTxjb3B5IHRvZGlyPSIke3BhdGgudGFyZ2V0cGx1Z2lufS9yZXNvdXJjZXMvZGF0YS8iIG92ZXJ3cml0ZT0idHJ1ZSI+CisJCQk8ZmlsZXNldCBkaXI9IiR7cGF0aC5nZW5lcmF0ZWQuZmlsZXN9L3Jlc291cmNlcy9kYXRhIj4KKwkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLnNjZW5hcmlvIiAvPgorCQkJPC9maWxlc2V0PgorCQk8L2NvcHk+CisJPC90YXJnZXQ+CisJCisJPCEtLSBDcmVhdGUgdGhlIG1vZGVsIGZpbGVzIGZvciBjb3VudHJpZXMgYW5kIHRoZSBwbHVnaW4ueG1sIGFuZCBwbHVnaW4ucHJvcGVydGllcyBmcmFnbWVudHMgLS0+CisJPHRhcmdldCBuYW1lPSJjcmVhdGVfY2FuZGlkYXRlcyIgZGVwZW5kcz0iY2xlYW4iPgorCQk8IS0tIFRoZXJlIGlzIGEgcHJvYmxlbSBoZXJlIHdpdGggc3BlY2lmeWluZyBmb3JrPSJ0cnVlIiAgbWF4bWVtb3J5PSI3NjhtIi4gIEl0IGNhdXNlcyBhbiBJT0V4Y2VwdGlvbiBvbiBzb21lIG1hY2hpbmVzIC0tPgorCQk8amF2YSBjbGFzc25hbWU9IiR7SURfUk9PVH0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5zY2VuYXJpb3MuRGlzZWFzZU1vZGVsU2NlbmFyaW9HZW5lcmF0b3IiIGZvcms9InRydWUiIG1heG1lbW9yeT0iMTAyNG0iPgorCQkJPGNsYXNzcGF0aCByZWZpZD0iY2xhc3NwYXRoLnJ1bnRpbWUiIC8+CisJCQk8YXJnIHZhbHVlPSIke3BhdGguZ2VuZXJhdGVkLmZpbGVzfSIgLz4KKwkJCTxhcmcgdmFsdWU9IiR7c2Nhbi5wbHVnaW59IiAvPgorCQkJPGp2bWFyZyB2YWx1ZT0iLVhtczEwMjRtIi8+CisJCQk8anZtYXJnIHZhbHVlPSItWG14MTAyNG0iLz4KKwkJPC9qYXZhPgorCTwvdGFyZ2V0PgorCisJPCEtLSBjbGVhbiBvdXQgdGhlIC4uLi90ZW1wL2RhdGEgZGlyZWN0b3JpZXMgLS0+CisJPCEtLSBjbGVhbiBvdXQgdGhlIHRhcmdldCBkaXJlY3RvcmllcyAtLT4KKwk8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJjcmVhdGVfZ2VuZXJhdGVkX2ZpbGVzX2RpciI+CisJCTxkZWxldGUgaW5jbHVkZUVtcHR5RGlycz0idHJ1ZSIgcXVpZXQ9InRydWUiPgorCQkJPGZpbGVzZXQgZGlyPSIke3BhdGguZ2VuZXJhdGVkLmZpbGVzfS8iPgorCQkJCTxpbmNsdWRlIG5hbWU9IioqLyoiIC8+CisJCQk8L2ZpbGVzZXQ+CisJCQk8ZmlsZXNldCBkaXI9IiR7cGF0aC50YXJnZXRwbHVnaW59L3Jlc291cmNlcy9kYXRhLyI+CisJCQkJPGluY2x1ZGUgbmFtZT0iY291bnRyeS8qKi8qIiAvPgorCQkJPC9maWxlc2V0PgorCQk8L2RlbGV0ZT4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iY3JlYXRlX2dlbmVyYXRlZF9maWxlc19kaXIiPgorCQk8bWtkaXIgZGlyPSIke3BhdGguZ2VuZXJhdGVkLmZpbGVzfS9yZXNvdXJjZXMvZGF0YSIvPgkJCisJPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMubmwxLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMubmwxLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZTg2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDEvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLm5sMS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDEvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4NzZjMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDEvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uuc3RlbS5qb2JzLm5sMTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMubmwxLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDEvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMzU2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMubmwxLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDcgQEAKKyNNb24gSmFuIDIxIDEyOjQzOjE0IEVTVCAyMDA4CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMubmwxL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MTRjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMubmwxL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMTEgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLmpvYnMubmwxCitCdW5kbGUtVmVyc2lvbjogMS4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitGcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5zdGVtLmpvYnMKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorQnVuZGxlLUNsYXNzUGF0aDogYmluLywKKyAuCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDEvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDEvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzAyMDZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLm5sMS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsOCBAQAorc291cmNlLi4gPSBzcmMvCitvdXRwdXQuLiA9IGJpbi8KK2Jpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICAuLFwKKyAgICAgICAgICAgICAgIGJpbi8sXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgbm90aWNlLmh0bWwsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMubmwxL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDEvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNGIxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMubmwxL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoreG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKK3htbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPGxpbmsgcmVsPUZpbGUtTGlzdAoraHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOkRvY3VtZW50UHJvcGVydGllcz4KKyAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KKyAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgorICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+CisgIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+CisgIDxvOlBhZ2VzPjQ8L286UGFnZXM+CisgIDxvOldvcmRzPjE2MjY8L286V29yZHM+CisgIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgorICAgPG86TGluZXM+Nzc8L286TGluZXM+CisgIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KKyAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+CisgIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+CisgPC9vOkRvY3VtZW50UHJvcGVydGllcz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OldvcmREb2N1bWVudD4KKyAgPHc6VHJhY2tSZXZpc2lvbnMvPgorIDwvdzpXb3JkRG9jdW1lbnQ+Cis8L3htbD48IVtlbmRpZl0tLT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlRhaG9tYTsKKwlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKKwltc28tZm9udC1jaGFyc2V0OjA7CisJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7CisJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7CisJbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KK3AuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bXNvLXN0eWxlLXBhcmVudDoiIjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwCisJe21hcmdpbi1yaWdodDowaW47CisJbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CisJbWFyZ2luLWxlZnQ6MGluOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKKwl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZTo4LjBwdDsKKwlmb250LWZhbWlseTpUYWhvbWE7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorQHBhZ2UgU2VjdGlvbjEKKwl7c2l6ZTo4LjVpbiAxMS4waW47CisJbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47CisJbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKKwltc28tZm9vdGVyLW1hcmdpbjouNWluOworCW1zby1wYXBlci1zb3VyY2U6MDt9CitkaXYuU2VjdGlvbjEKKwl7cGFnZTpTZWN0aW9uMTt9CistLT4KKzwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgorPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCitUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAorUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCitPRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCithZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKK3N1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKK2J5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgoraWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KK3N1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCit3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKK2VudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKK2NsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCitvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucworZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KK3JlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50CithIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KK3N0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5CitkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCitSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAorYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCitjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgorb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKK2J5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCit0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCithbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCitSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCitDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgordGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Citmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQordG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKK2lmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKK3RoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQorRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKK3JpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KK3RoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Cis8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK2l0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAorY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQorYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKK2FuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCitlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAoraW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAorYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCitzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0CitDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCitzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCitpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCitjb2RlIGZvcm06PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQorY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQorY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCitvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQorYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycworYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKK29mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAorbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCitDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKK2Nvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCit0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCitjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKK3RvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK3RvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCithbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQoraW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCit3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcworc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCitvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCitjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKK1dJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKK01FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQorUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcworQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKK2VxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgorVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgorVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKK29yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKK2Z1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgorYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAorb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCitzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCitwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQorY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKK3RoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKK0FncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCitzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAorZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCitTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCitBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKK0FncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKK2l0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLm5sMS9ub3RpY2UuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDEvbm90aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhZjk2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDEvbm90aWNlLmh0bWwKQEAgLTAsMCArMSw3OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5NYXJjaCAxNywgMjAwNTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisgICAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKKyAgIAorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCisgICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKyAgIAorPHVsPgorCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucworICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPiAgIAorIAorPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisJCQorPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisJPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQorCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisgICAKKzxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLm5sMS9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDEvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxNmNkNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDEvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNyBAQAorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgVG8gY29kZSBkZXZlbG9wZXI6CisjICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCisjICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KKyMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKKyMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworcGx1Z2luTmFtZSA9IFNURU0gSm9icyBObDEgRnJhZ21lbnQKK3Byb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9zaW11bGF0aW9uL21lc3NhZ2VzX2VuX1VTX0NBLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9tZXNzYWdlc19lbl9VU19DQS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNGY4OTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9tZXNzYWdlc19lbl9VU19DQS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTkgQEAKKyMgbWVzc2FnZXNfZW5fVVNfQ0EucHJvcGVydGllcworIyBDYWxpZm9ybmlhbgorIyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqCisjICogQ29udHJpYnV0b3JzOgorIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIyBTaW11bGF0aW9uTWFuYWdlcgorU2ltTWdyLkRlc2VyaWFsaXphdGlvbl9FcnJvcj1Qcm9ibGVtIHJlYWRpbmcgaW4gYSBzZXJpYWxpemVkIFNjZW5hcmlvIGZyb20gVVJJIFwiezB9XCIKK1NpbU1nci5TdGFydF9TaW09U3RhcnRpbmcgc2ltdWxhdGlvbgorCisjIFNpbXVsYXRpb24KK1NpbS5UaW1lX0Vycm9yPVRpbWUgdG8gc3RvcCBiZWZvcmUgc3RhcnRpbmcuICBDdXJyZW50IHRpbWUgaXM6IHswfSwgU3RvcHBpbmcgdGltZSBpczogezF9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vbWVzc2FnZXNfZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODhmMTIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vbWVzc2FnZXNfZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDE5IEBACisjIG1lc3NhZ2VzX2VzLnByb3BlcnRpZXMKKyMgU3BhbmlzaAorIyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqCisjICogQ29udHJpYnV0b3JzOgorIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIyBTaW11bGF0aW9uTWFuYWdlcgorU2ltTWdyLkRlc2VyaWFsaXphdGlvbl9FcnJvcj1Qcm9ibGVtIHJlYWRpbmcgaW4gYSBzZXJpYWxpemVkIFNjZW5hcmlvIGZyb20gVVJJIFwiezB9XCIKK1NpbU1nci5TdGFydF9TaW09U3RhcnRpbmcgc2ltdWxhdGlvbgorCisjIFNpbXVsYXRpb24KK1NpbS5UaW1lX0Vycm9yPVRpbWUgdG8gc3RvcCBiZWZvcmUgc3RhcnRpbmcuICBDdXJyZW50IHRpbWUgaXM6IHswfSwgU3RvcHBpbmcgdGltZSBpczogezF9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9tZXNzYWdlc19oZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vbWVzc2FnZXNfaGUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmFiY2ZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vbWVzc2FnZXNfaGUucHJvcGVydGllcwpAQCAtMCwwICsxLDE5IEBACisjIG1lc3NhZ2VzLnByb3BlcnRpZXMKKyMgSGVicmV3CisjIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjIFNpbXVsYXRpb25NYW5hZ2VyCitTaW1NZ3IuRGVzZXJpYWxpemF0aW9uX0Vycm9yPVByb2JsZW0gcmVhZGluZyBpbiBhIHNlcmlhbGl6ZWQgU2NlbmFyaW8gZnJvbSBVUkkgXCJ7MH1cIgorU2ltTWdyLlN0YXJ0X1NpbT1TdGFydGluZyBzaW11bGF0aW9uCisKKyMgU2ltdWxhdGlvbgorU2ltLlRpbWVfRXJyb3I9VGltZSB0byBzdG9wIGJlZm9yZSBzdGFydGluZy4gIEN1cnJlbnQgdGltZSBpczogezB9LCBTdG9wcGluZyB0aW1lIGlzOiB7MX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9zaW11bGF0aW9uL21lc3NhZ2VzX3RhLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9tZXNzYWdlc190YS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0Yjc3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9tZXNzYWdlc190YS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTkgQEAKKyMgbWVzc2FnZXMucHJvcGVydGllcworIyBUYW1pbAorIyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqCisjICogQ29udHJpYnV0b3JzOgorIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIyBTaW11bGF0aW9uTWFuYWdlcgorU2ltTWdyLkRlc2VyaWFsaXphdGlvbl9FcnJvcj1Qcm9ibGVtIHJlYWRpbmcgaW4gYSBzZXJpYWxpemVkIFNjZW5hcmlvIGZyb20gVVJJIFwiezB9XCIKK1NpbU1nci5TdGFydF9TaW09U3RhcnRpbmcgc2ltdWxhdGlvbgorCisjIFNpbXVsYXRpb24KK1NpbS5UaW1lX0Vycm9yPVRpbWUgdG8gc3RvcCBiZWZvcmUgc3RhcnRpbmcuICBDdXJyZW50IHRpbWUgaXM6IHswfSwgU3RvcHBpbmcgdGltZSBpczogezF9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9tZXNzYWdlc196aC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vbWVzc2FnZXNfemgucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjA1YzViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vbWVzc2FnZXNfemgucHJvcGVydGllcwpAQCAtMCwwICsxLDE5IEBACisjIG1lc3NhZ2VzLnByb3BlcnRpZXMKKyMgQ2hpbmVzZQorIyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqCisjICogQ29udHJpYnV0b3JzOgorIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIyBTaW11bGF0aW9uTWFuYWdlcgorU2ltTWdyLkRlc2VyaWFsaXphdGlvbl9FcnJvcj1Qcm9ibGVtIHJlYWRpbmcgaW4gYSBzZXJpYWxpemVkIFNjZW5hcmlvIGZyb20gVVJJIFwiezB9XCIKK1NpbU1nci5TdGFydF9TaW09U3RhcnRpbmcgc2ltdWxhdGlvbgorCisjIFNpbXVsYXRpb24KK1NpbS5UaW1lX0Vycm9yPVRpbWUgdG8gc3RvcCBiZWZvcmUgc3RhcnRpbmcuICBDdXJyZW50IHRpbWUgaXM6IHswfSwgU3RvcHBpbmcgdGltZSBpczogezF9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGU4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MzlkNzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uuc3RlbS5qb2JzPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODY4NzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCkBAIC0wLDAgKzEsMyBAQAorI0ZyaSBOb3YgMTcgMTc6NDc6MDMgRVNUIDIwMDYKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitlbmNvZGluZy8vc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9zaW11bGF0aW9uL21lc3NhZ2VzLnByb3BlcnRpZXM9ODg1OV8xCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTNhNDYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDcwIEBACisjVHVlIFNlcCAwMSAxNjo1NzowNyBFRFQgMjAwOQorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdEZXNjcmlwdGlvbj1yZXR1cm5fdGFnCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNTc4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMCwwICsxLDUwIEBACisjV2VkIFNlcCAxMiAyMjoxNDo1MCBFRFQgMjAwNworY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitjbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPXRydWUKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQorY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCitjbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK2NsZWFudXAudXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQorY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitjbGVhbnVwX3Byb2ZpbGU9X2NsZWFudXAKK2NsZWFudXBfc2V0dGluZ3NfdmVyc2lvbj0yCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OWNlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyMSBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnN0ZW0uam9icztzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5BY3RpdmF0b3IKK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLAorIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5hZGFwdGVycy5leGVjdXRhYmxlLAorIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5hZGFwdGVycy5leGVjdXRhYmxlLmVtZiwKKyBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuaWRlbnRpZmlhYmxlLAorIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaCwKKyBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLAorIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5wcmVmZXJlbmNlcywKKyBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbgorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyN2NlMTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDkgQEAKK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCitiaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIGJpbi8sXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgbm90aWNlLmh0bWwsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL2VwbC12MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDRiMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoreG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKK3htbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPGxpbmsgcmVsPUZpbGUtTGlzdAoraHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOkRvY3VtZW50UHJvcGVydGllcz4KKyAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KKyAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgorICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+CisgIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+CisgIDxvOlBhZ2VzPjQ8L286UGFnZXM+CisgIDxvOldvcmRzPjE2MjY8L286V29yZHM+CisgIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgorICAgPG86TGluZXM+Nzc8L286TGluZXM+CisgIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KKyAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+CisgIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+CisgPC9vOkRvY3VtZW50UHJvcGVydGllcz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OldvcmREb2N1bWVudD4KKyAgPHc6VHJhY2tSZXZpc2lvbnMvPgorIDwvdzpXb3JkRG9jdW1lbnQ+Cis8L3htbD48IVtlbmRpZl0tLT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlRhaG9tYTsKKwlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKKwltc28tZm9udC1jaGFyc2V0OjA7CisJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7CisJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7CisJbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KK3AuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bXNvLXN0eWxlLXBhcmVudDoiIjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwCisJe21hcmdpbi1yaWdodDowaW47CisJbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CisJbWFyZ2luLWxlZnQ6MGluOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKKwl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZTo4LjBwdDsKKwlmb250LWZhbWlseTpUYWhvbWE7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorQHBhZ2UgU2VjdGlvbjEKKwl7c2l6ZTo4LjVpbiAxMS4waW47CisJbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47CisJbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKKwltc28tZm9vdGVyLW1hcmdpbjouNWluOworCW1zby1wYXBlci1zb3VyY2U6MDt9CitkaXYuU2VjdGlvbjEKKwl7cGFnZTpTZWN0aW9uMTt9CistLT4KKzwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgorPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCitUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAorUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCitPRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCithZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKK3N1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKK2J5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgoraWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KK3N1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCit3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKK2VudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKK2NsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCitvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucworZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KK3JlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50CithIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KK3N0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5CitkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCitSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAorYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCitjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgorb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKK2J5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCit0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCithbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCitSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCitDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgordGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Citmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQordG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKK2lmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKK3RoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQorRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKK3JpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KK3RoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Cis8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK2l0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAorY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQorYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKK2FuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCitlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAoraW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAorYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCitzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0CitDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCitzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCitpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCitjb2RlIGZvcm06PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQorY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQorY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCitvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQorYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycworYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKK29mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAorbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCitDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKK2Nvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCit0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCitjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKK3RvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK3RvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCithbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQoraW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCit3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcworc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCitvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCitjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKK1dJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKK01FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQorUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcworQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKK2VxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgorVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgorVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKK29yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKK2Z1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgorYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAorb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCitzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCitwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQorY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKK3RoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKK0FncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCitzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAorZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCitTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCitBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKK0FncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKK2l0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL25vdGljZS5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL25vdGljZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YWY5NjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvbm90aWNlLmh0bWwKQEAgLTAsMCArMSw3OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5NYXJjaCAxNywgMjAwNTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisgICAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKKyAgIAorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCisgICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKyAgIAorPHVsPgorCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucworICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPiAgIAorIAorPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisJCQorPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisJPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQorCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisgICAKKzxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YTQ2ODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNSBAQAorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwbHVnaW5OYW1lPSBTVEVNIEpvYiBhbmQgU2ltdWxhdGlvbiBNYW5hZ2VyCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZworCitfVUlfU2ltTWdtdFBQYWdlID0gU2ltdWxhdGlvbiBNYW5hZ2VtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWZiYzNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3BsdWdpbi54bWwKQEAgLTAsMCArMSwxMDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Cis8cGx1Z2luPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+CisgICAgICA8cGFnZQorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuU1RFTVByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5wcmVmZXJlbmNlcy5TaW11bGF0aW9uTWFuYWdlbWVudFByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5wcmVmZXJlbmNlcy5TaW11bGF0aW9uTWFuYWdlbWVudFByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgbmFtZT0iJV9VSV9TaW1NZ210UFBhZ2UiLz4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+CisgICAgICA8aW5pdGlhbGl6ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiLz4KKyAgICAgIDxpbml0aWFsaXplciBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnByZWZlcmVuY2VzLlByZWZlcmVuY2VJbml0aWFsaXplciIvPgorICAgPC9leHRlbnNpb24+CisgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KKyAgICAgICAgIDxmYWN0b3J5IAorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5hZGFwdGVycy5leGVjdXRhYmxlLkZpbGVFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkiIAorICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgorICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZSIvPgorICAgICAgICAgPC9mYWN0b3J5PgorICAgICAgICAgIDxmYWN0b3J5IAorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5hZGFwdGVycy5leGVjdXRhYmxlLkNvbmZpZ3VyYXRpb25FbGVtZW50RXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5IiAKKyAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQiPgorICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZSIvPgorICAgICAgICAgPC9mYWN0b3J5PgorICAgICAgICAgIDxmYWN0b3J5IAorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5hZGFwdGVycy5leGVjdXRhYmxlLklkZW50aWZpYWJsZUV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeSIgCisgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuRXhwZXJpbWVudCI+CisgICAgICAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlIi8+CisgICAgICAgICA8L2ZhY3Rvcnk+CisgICAgICAgICAgPGZhY3RvcnkKKyAgICAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5pbXBsLkV4cGVyaW1lbnRJbXBsIgorICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuZXhlY3V0YWJsZS5JZGVudGlmaWFibGVFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkiPgorICAgICAgICAgICAgIDxhZGFwdGVyCisgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZSI+CisgICAgICAgICAgICAgPC9hZGFwdGVyPgorICAgICAgICAgIDwvZmFjdG9yeT4KKyAgICAgICAgICA8ZmFjdG9yeSAKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuZXhlY3V0YWJsZS5JZGVudGlmaWFibGVFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkiIAorICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNjZW5hcmlvIj4KKyAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUiLz4KKyAgICAgICAgIDwvZmFjdG9yeT4KKyAgICAgICAgICA8ZmFjdG9yeQorICAgICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5pbXBsLlNjZW5hcmlvSW1wbCIKKyAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmFkYXB0ZXJzLmV4ZWN1dGFibGUuSWRlbnRpZmlhYmxlRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5Ij4KKyAgICAgICAgICAgICA8YWRhcHRlcgorICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUiPgorICAgICAgICAgICAgIDwvYWRhcHRlcj4KKyAgICAgICAgICA8L2ZhY3Rvcnk+CisgICAgICAgICAgPGZhY3RvcnkKKyAgICAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbiIKKyAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmFkYXB0ZXJzLmV4ZWN1dGFibGUuU2ltdWxhdGlvbkV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeSI+CisgICAgICAgICAgICAgPGFkYXB0ZXIKKyAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlIj4KKyAgICAgICAgICAgICA8L2FkYXB0ZXI+CisgICAgICAgICAgPC9mYWN0b3J5PgorICAgICAgICAgICA8ZmFjdG9yeSAKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuZXhlY3V0YWJsZS5TaW11bGF0aW9uRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5IiAKKyAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb24iPgorICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZSIvPgorICAgICAgICAgPC9mYWN0b3J5PgorICAgICAgICAgIDxmYWN0b3J5IAorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5hZGFwdGVycy5leGVjdXRhYmxlLkJhdGNoRXhlY3V0aW9uQWRhcHRlckZhY3RvcnkiIAorICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLkJhdGNoIj4KKyAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUiLz4KKyAgICAgICAgIDwvZmFjdG9yeT4KKyAgICAgICAgICA8ZmFjdG9yeQorICAgICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5JQmF0Y2giCisgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5hZGFwdGVycy5leGVjdXRhYmxlLkJhdGNoRXhlY3V0aW9uQWRhcHRlckZhY3RvcnkiPgorICAgICAgICAgICAgIDxhZGFwdGVyCisgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZSI+CisgICAgICAgICAgICAgPC9hZGFwdGVyPgorICAgICAgICAgIDwvZmFjdG9yeT4KKyAgPC9leHRlbnNpb24+CisgPGV4dGVuc2lvbgorICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgorICAgIDxmYWN0b3J5CisgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCIKKyAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmFkYXB0ZXJzLmlkZW50aWZpYWJsZS5Db25maWd1cmF0aW9uRWxlbWVudElkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5Ij4KKyAgICAgICA8YWRhcHRlcgorICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlIj4KKyAgICAgICA8L2FkYXB0ZXI+CisgICAgPC9mYWN0b3J5PgorICAgIDxmYWN0b3J5CisgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCisgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5hZGFwdGVycy5pZGVudGlmaWFibGUuRmlsZUlkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5Ij4KKyAgICAgICA8YWRhcHRlcgorICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlIj4KKyAgICAgICA8L2FkYXB0ZXI+CisgICAgPC9mYWN0b3J5PgorPCEtLSAgICA8ZmFjdG9yeQorICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkiCisgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5hZGFwdGVycy5pZGVudGlmaWFibGUuVVJJSWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkiPgorICAgICAgIDxhZGFwdGVyCisgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUiPgorICAgICAgIDwvYWRhcHRlcj4KKyAgICA8L2ZhY3Rvcnk+CistLT4KKyA8L2V4dGVuc2lvbj4KKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvQWN0aXZhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmM3ZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSw5NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuZXhlY3V0YWJsZS5lbWYuRXhwZXJpbWVudEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuZXhlY3V0YWJsZS5lbWYuU2NlbmFyaW9FeGVjdXRhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CisKKy8qKgorICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKKworCS8qKgorCSAqIFRoZSBwbHVnLWluIElECisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnN0ZW0uam9icyI7IC8vJE5PTi1OTFMtMSQKKworCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKKwlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOworCisJLyoqCisJICogVGhlIGNvbnN0cnVjdG9yCisJICovCisJcHVibGljIEFjdGl2YXRvcigpIHsKKwkJcGx1Z2luID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gY29udGV4dAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc3RhcnQoY29udGV4dCk7CisJCW5ldyBTY2VuYXJpb0V4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeSgpOworCQluZXcgRXhwZXJpbWVudEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeSgpOworCX0gLy8gc3RhcnQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcGx1Z2luID0gbnVsbDsKKwkJc3VwZXIuc3RvcChjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKworCS8qKgorCSAqIExvZyBhbiBlcnJvciB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4KKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqICAgICAgICAgICAgdGhlIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIHRleHQKKwkgKiBAcGFyYW0gZXhjZXB0aW9uCisJICogICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJcGx1Z2luLmdldExvZygpLmxvZygKKwkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKKwkJCQkJCTAsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOworCX0gLy8gbG9nRXJyb3IKKworCS8qKgorCSAqIExvZyBpbmZvcm1hdGlvbiB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4KKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqICAgICAgICAgICAgdGhlIGxvY2FsaXplZCBpbmZvcm1hdGlvbiBtZXNzYWdlIHRleHQKKwkgKiBAcGFyYW0gZXhjZXB0aW9uCisJICogICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW5mb3JtYXRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJcGx1Z2luLmdldExvZygpLmxvZygKKwkJCQluZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAorCQkJCQkJMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7CisJfSAvLyBsb2dJbmZvcm1hdGlvbgorfSAvLyBBY3RpdmF0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2FkYXB0ZXJzL2V4ZWN1dGFibGUvQmF0Y2hFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2FkYXB0ZXJzL2V4ZWN1dGFibGUvQmF0Y2hFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODY0MDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvZXhlY3V0YWJsZS9CYXRjaEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8vIEJhdGNoRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmFkYXB0ZXJzLmV4ZWN1dGFibGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLklCYXRjaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4ge0BsaW5rIEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeX0gdGhhdCBhZGFwdHMge0BsaW5rIElCYXRjaH1zCisgKiB0byB7QGxpbmsgSUV4ZWN1dGFibGV9cy4KKyAqLworcHVibGljIGNsYXNzIEJhdGNoRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5IHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsCisJICogICAgICBqYXZhLmxhbmcuQ2xhc3MpCisJICovCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKGZpbmFsIE9iamVjdCBhZGFwdGFibGVPYmplY3QsCisJCQlmaW5hbCBDbGFzcyBhZGFwdGVyVHlwZSkgeworCQlJQmF0Y2ggcmV0VmFsdWUgPSBudWxsOworCQkvLyBBIEJhdGNoPworCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSUJhdGNoCisJCQkJJiYgYWRhcHRlclR5cGUuZXF1YWxzKElFeGVjdXRhYmxlLmNsYXNzKSkgeworCQkJLy8gWWVzCisJCQlyZXRWYWx1ZSA9IChJQmF0Y2gpIGFkYXB0YWJsZU9iamVjdDsKKwkJfSAvLyBpZgorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRBZGFwdGVyCisKK30gLy8gQmF0Y2hFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2FkYXB0ZXJzL2V4ZWN1dGFibGUvQ29uZmlndXJhdGlvbkVsZW1lbnRFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2FkYXB0ZXJzL2V4ZWN1dGFibGUvQ29uZmlndXJhdGlvbkVsZW1lbnRFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWE1YTUwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvZXhlY3V0YWJsZS9Db25maWd1cmF0aW9uRWxlbWVudEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8vIENvbmZpZ3VyYXRpb25FbGVtZW50RXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmFkYXB0ZXJzLmV4ZWN1dGFibGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGFuIHtAbGluayBFeGVjdXRhYmxlQWRhcHRlckZhY3Rvcnl9IHRoYXQgYWRhcHRzCisgKiB7QGxpbmsgSUNvbmZpZ3VyYXRpb25FbGVtZW50fXMgdG8ge0BsaW5rIElFeGVjdXRhYmxlfXMuCisgKi8KK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRWxlbWVudEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCUV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeSB7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LAorCSAqICAgICAgamF2YS5sYW5nLkNsYXNzKQorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihmaW5hbCBPYmplY3QgYWRhcHRhYmxlT2JqZWN0LAorCQkJZmluYWwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKKwkJSUV4ZWN1dGFibGUgcmV0VmFsdWUgPSBudWxsOworCQkvLyBBIElDb25maWd1cmF0aW9uRWxlbWVudD8KKwkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElDb25maWd1cmF0aW9uRWxlbWVudAorCQkJCSYmIGFkYXB0ZXJUeXBlLmVxdWFscyhJRXhlY3V0YWJsZS5jbGFzcykpIHsKKwkJCS8vIFllcworCQkJcmV0VmFsdWUgPSAoSUV4ZWN1dGFibGUpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcigKKwkJCQkJUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKGFkYXB0YWJsZU9iamVjdCwKKwkJCQkJCQlJZGVudGlmaWFibGUuY2xhc3MpLCBJRXhlY3V0YWJsZS5jbGFzcyk7CisJCX0gLy8gaWYKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0QWRhcHRlcgorCit9IC8vIENvbmZpZ3VyYXRpb25FbGVtZW50RXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9hZGFwdGVycy9leGVjdXRhYmxlL0V4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvZXhlY3V0YWJsZS9FeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWJmNDdkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvZXhlY3V0YWJsZS9FeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDMxIEBACisvLyBFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuZXhlY3V0YWJsZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhbiB7QGxpbmsgSUFkYXB0ZXJGYWN0b3J5fSB0aGF0IGlzIGV4dGVuZGVkIGJ5IGNsYXNzZXMgdGhhdAorICogYWRhcHQge0BsaW5rIE9iamVjdH1zIHRvIHtAbGluayBJRXhlY3V0YWJsZX1zLgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyTGlzdCgpCisJICovCisJcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7CisJCXJldHVybiBuZXcgQ2xhc3NbXSB7IElFeGVjdXRhYmxlLmNsYXNzIH07CisJfQorCit9IC8vIEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvZXhlY3V0YWJsZS9GaWxlRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9hZGFwdGVycy9leGVjdXRhYmxlL0ZpbGVFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGZkZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvZXhlY3V0YWJsZS9GaWxlRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLy8gRmlsZUV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5hZGFwdGVycy5leGVjdXRhYmxlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4ge0BsaW5rIEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeX0gdGhhdCBhZGFwdHMge0BsaW5rIElGaWxlfXMKKyAqIHRvIHtAbGluayBJRXhlY3V0YWJsZX1zLgorICovCitwdWJsaWMgY2xhc3MgRmlsZUV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeSB7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LAorCSAqICAgICAgamF2YS5sYW5nLkNsYXNzKQorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihmaW5hbCBPYmplY3QgYWRhcHRhYmxlT2JqZWN0LAorCQkJZmluYWwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKKwkJSUV4ZWN1dGFibGUgcmV0VmFsdWUgPSBudWxsOworCQkvLyBBIEZpbGU/CisJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJRmlsZQorCQkJCSYmIGFkYXB0ZXJUeXBlLmVxdWFscyhJRXhlY3V0YWJsZS5jbGFzcykpIHsKKwkJCS8vIFllcworCQkJcmV0VmFsdWUgPSAoSUV4ZWN1dGFibGUpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcigKKwkJCQkJUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKGFkYXB0YWJsZU9iamVjdCwKKwkJCQkJCQlJZGVudGlmaWFibGUuY2xhc3MpLCBJRXhlY3V0YWJsZS5jbGFzcyk7CisJCX0gLy8gaWYKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0QWRhcHRlcgorfSAvLyBGaWxlRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9hZGFwdGVycy9leGVjdXRhYmxlL0lkZW50aWZpYWJsZUV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvZXhlY3V0YWJsZS9JZGVudGlmaWFibGVFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWM4ZjYzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvZXhlY3V0YWJsZS9JZGVudGlmaWFibGVFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUyIEBACisvLyBJZGVudGlmaWFibGVFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuZXhlY3V0YWJsZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4ge0BsaW5rIEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeX0gdGhhdCBhZGFwdHMKKyAqIHtAbGluayBJZGVudGlmaWFibGV9cyB0byB7QGxpbmsgSUV4ZWN1dGFibGV9cy4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBzZXJ2ZXMgYXMgYSAiYnJpZGdlIiBiZXR3ZWVuIHRoZSBFY2xpcHNlIHtAbGluayBJQWRhcHRlck1hbmFnZXJ9CisgKiBhbmQKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuZXhlY3V0YWJsZS5lbWYuRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5fQorICogd2hpY2ggaXMgdGhlIEVNRiB7QGxpbmsgQWRhcHRlcn0gaW1wbGVtZW50YXRpb24gdGhhdCBhZGFwdHMKKyAqIHtAbGluayBJZGVudGlmaWFibGV9cyB0byB7QGxpbmsgSUV4ZWN1dGFibGV9cy4KKyAqIAorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuZXhlY3V0YWJsZS5lbWYuRXhlY3V0YWJsZUFkYXB0ZXIKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmFkYXB0ZXJzLmV4ZWN1dGFibGUuZW1mLlNjZW5hcmlvRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5hZGFwdGVycy5leGVjdXRhYmxlLmVtZi5FeHBlcmltZW50RXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5CisgKi8KK3B1YmxpYyBjbGFzcyBJZGVudGlmaWFibGVFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcworCQlFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkgeworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwKKwkgKiAgICAgIGphdmEubGFuZy5DbGFzcykKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoZmluYWwgT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwKKwkJCWZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlKSB7CisJCUlFeGVjdXRhYmxlIHJldFZhbHVlID0gbnVsbDsKKwkJLy8gSXQgaXQgd2hhdCB3ZSdyZSBsb29raW5nIGZvcj8KKwkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElkZW50aWZpYWJsZQorCQkJCSYmIGFkYXB0ZXJUeXBlLmVxdWFscyhJRXhlY3V0YWJsZS5jbGFzcykpIHsKKwkJCS8vIFllcworCQkJcmV0VmFsdWUgPSAoSUV4ZWN1dGFibGUpIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5hZGFwdGVycy5leGVjdXRhYmxlLmVtZi5FeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkJLmFkYXB0KGFkYXB0YWJsZU9iamVjdCwgSUV4ZWN1dGFibGUuY2xhc3MpOworCQl9IC8vIGlmCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldEFkYXB0ZXIKKworfSAvLyBJZGVudGlmaWFibGVFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2FkYXB0ZXJzL2V4ZWN1dGFibGUvU2ltdWxhdGlvbkV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvZXhlY3V0YWJsZS9TaW11bGF0aW9uRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY2NDYxNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2FkYXB0ZXJzL2V4ZWN1dGFibGUvU2ltdWxhdGlvbkV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8vIFNpbXVsYXRpb25FeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuZXhlY3V0YWJsZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4ge0BsaW5rIEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeX0gdGhhdCBhZGFwdHMKKyAqIHtAbGluayBJU2ltdWxhdGlvbn1zIHRvIHtAbGluayBJRXhlY3V0YWJsZX1zLgorICovCitwdWJsaWMgY2xhc3MgU2ltdWxhdGlvbkV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCUV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeSB7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LAorCSAqICAgICAgamF2YS5sYW5nLkNsYXNzKQorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihmaW5hbCBPYmplY3QgYWRhcHRhYmxlT2JqZWN0LAorCQkJZmluYWwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKKwkJSVNpbXVsYXRpb24gcmV0VmFsdWUgPSBudWxsOworCQkvLyBBIFNpbXVsYXRpb24/CisJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJU2ltdWxhdGlvbgorCQkJCSYmIGFkYXB0ZXJUeXBlLmVxdWFscyhJRXhlY3V0YWJsZS5jbGFzcykpIHsKKwkJCS8vIFllcworCQkJcmV0VmFsdWUgPSAoSVNpbXVsYXRpb24pIGFkYXB0YWJsZU9iamVjdDsKKwkJfSAvLyBpZgorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRBZGFwdGVyCisKK30gLy8gU2ltdWxhdGlvbkV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvZXhlY3V0YWJsZS9lbWYvRXhlY3V0YWJsZUFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2FkYXB0ZXJzL2V4ZWN1dGFibGUvZW1mL0V4ZWN1dGFibGVBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllNDJjNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2FkYXB0ZXJzL2V4ZWN1dGFibGUvZW1mL0V4ZWN1dGFibGVBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8vIEV4ZWN1dGFibGVBZGFwdGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmFkYXB0ZXJzLmV4ZWN1dGFibGUuZW1mOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgZXh0ZW5kZWQgYnkgY2xhc3NlcyB0aGF0IGFkYXB0IHtAbGluayBPYmplY3R9cyB0bworICoge0BsaW5rIElFeGVjdXRhYmxlfXMuCisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBFeGVjdXRhYmxlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMKKwkJSUV4ZWN1dGFibGUgeworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlI2dldFNlcXVlbmNlTnVtYmVyKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldFNlcXVlbmNlTnVtYmVyKCkgeworCQlyZXR1cm4gKChJRXhlY3V0YWJsZSkgZ2V0VGFyZ2V0KCkpLmdldFNlcXVlbmNlTnVtYmVyKCk7CisJfSAvLyBnZXRTZXF1ZW5jZU51bWJlcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlI2dldE5hbWUoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuICgoSUV4ZWN1dGFibGUpIGdldFRhcmdldCgpKS5nZXROYW1lKCk7CisJfSAvLyBnZXROYW1lCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUjZ2V0TmFtZVdpdGhTZXF1ZW5jZU51bWJlcigpCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lV2l0aFNlcXVlbmNlTnVtYmVyKCkgeworCQlyZXR1cm4gKChJRXhlY3V0YWJsZSkgZ2V0VGFyZ2V0KCkpLmdldE5hbWVXaXRoU2VxdWVuY2VOdW1iZXIoKTsKKwl9IC8vIGdldE5hbWVXaXRoU2VxdWVuY2VOdW1iZXIKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZSNnZXRDcmVhdGlvblRpbWUoKQorCSAqLworCXB1YmxpYyBEYXRlIGdldENyZWF0aW9uVGltZSgpIHsKKwkJcmV0dXJuICgoSUV4ZWN1dGFibGUpIGdldFRhcmdldCgpKS5nZXRDcmVhdGlvblRpbWUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUjZ2V0VW5pcXVlSURTdHJpbmcoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSURTdHJpbmcoKSB7CisJCXJldHVybiAoKElFeGVjdXRhYmxlKSBnZXRUYXJnZXQoKSkuZ2V0VW5pcXVlSURTdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUjcnVuKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCWxvZ1VuaW1wbGVtZW50ZWRFcnJvcigicnVuIik7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuZXhlY3V0YWJsZS5lbWYuRXhlY3V0YWJsZUFkYXB0ZXIjcGF1c2UoKQorCSAqLworCXB1YmxpYyB2b2lkIHBhdXNlKCkgeworCQlsb2dVbmltcGxlbWVudGVkRXJyb3IoInBhdXNlIik7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlI3N0ZXAoKQorCSAqLworCXB1YmxpYyB2b2lkIHN0ZXAoKSB7CisJCWxvZ1VuaW1wbGVtZW50ZWRFcnJvcigic3RlcCIpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmFkYXB0ZXJzLmV4ZWN1dGFibGUuZW1mLkV4ZWN1dGFibGVBZGFwdGVyI3Jlc2V0KCkKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJbG9nVW5pbXBsZW1lbnRlZEVycm9yKCJyZXNldCIpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmFkYXB0ZXJzLmV4ZWN1dGFibGUuZW1mLkV4ZWN1dGFibGVBZGFwdGVyI3N0b3AoKQorCSAqLworCXB1YmxpYyB2b2lkIHN0b3AoKSB7CisJCWxvZ1VuaW1wbGVtZW50ZWRFcnJvcigic3RvcCIpOworCX0KKworCXByaXZhdGUgdm9pZCBsb2dVbmltcGxlbWVudGVkRXJyb3IoZmluYWwgU3RyaW5nIGFjdGlvbikgeworCQlBY3RpdmF0b3IKKwkJCQkubG9nRXJyb3IoIkludGVybmFsIGVycm9yOiAiICsgYWN0aW9uICsgIiB1bmltcGxlbWVudGVkIiwgbnVsbCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlI2lzUnVubmluZygpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlI2lzU3RvcHBhYmxlKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1N0b3BwYWJsZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShmaW5hbCBPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gdHlwZSA9PSBJRXhlY3V0YWJsZS5jbGFzczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZCgKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKK30gLy8gRXhlY3V0YWJsZUFkYXB0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2FkYXB0ZXJzL2V4ZWN1dGFibGUvZW1mL0V4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvZXhlY3V0YWJsZS9lbWYvRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmOWI0MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2FkYXB0ZXJzL2V4ZWN1dGFibGUvZW1mL0V4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8vIEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5hZGFwdGVycy5leGVjdXRhYmxlLmVtZjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGU7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IGNyZWF0ZSBhZGFwdGVycyB0aGF0IGFkYXB0CisgKiB7QGxpbmsgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0fXMgdG8ge0BsaW5rIElFeGVjdXRhYmxlfXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5IHsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMKKwkgKiB7QGxpbmsgRXhlY3V0YWJsZUFkYXB0ZXJ9IGluc3RhbmNlcy4KKwkgKiA8cD4KKwkgKiAKKwkgKiBCYXNpY2FsbHksIGlmIHlvdSBjcmVhdGUgYW4gRU1GIG1vZGVsIGFuZCBkZWZpbmUgYQorCSAqIHtAbGluayBFeGVjdXRhYmxlQWRhcHRlckZhY3Rvcnl9IGZvciBpdCBzbyB0aGF0IHRoZSBjbGFzc2VzIGluIHRoYXQgbW9kZWwKKwkgKiBjYW4gYmUgYWRhcHRlZCwgeW91IG5lZWQgdG8gaG9vayB0aGF0IGZhY3RvcnkgaW50byB0aGlzIG9uZSBzbyB0aGF0IGxhdGVyCisJICogd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYWRhcHQgYSBjbGFzcyBmcm9tIHRoYXQgbW9kZWwgaXMgbWFkZSB0aGUKKwkgKiBhc3NvY2lhdGVkIGZhY3Rvcnkgd2lsbCBiZSBmb3VuZC4gWW91IGNhbiBkbyB0aGF0IGJ5IGFkZGluZyB0aGUgbGluZToKKwkgKiA8Y29kZT4KKwkgKiBFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRkQWRhcHRlckZhY3RvcnkodGhpcyk7CisJICogPC9jb2RlPgorCSAqIHRvIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIG9mIHRoZSBuZXcgZmFjdG9yeSBhZnRlciB0aGUgc3VwZXIgY2FsbC4KKwkgKiBZb3UncmUgbm90IGRvbmUgaG93ZXZlciwgeW91IGFsc28gaGF2ZSB0byAiZm9yY2UiIGFuIGluc3RhbmNlIG9mIHRoZQorCSAqIGNsYXNzIHRvIGJlIGNyZWF0ZWQgc28gdGhhdCB0aGUgY29uc3RydWN0b3IgaXMgcnVuLiBUaGlzIGlzIHR5cGljYWxseQorCSAqIGFjaGlldmVkIGJ5IGFsbG9jYXRpbmcgYW4gaW5zdGFuY2UgaW4gdGhlIG1ldGhvZAorCSAqIHtAbGluayBBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpfW9mIHRoZSBwbHVnLWluCisJICogdGhhdCBkZWZpbmVzIHRoZSBmYWN0b3J5LgorCSAqLworCUV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeUltcGwgSU5TVEFOQ0UgPSBuZXcgRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5SW1wbCgpOworCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBleHRlbmRlZCBieSBjbGFzc2VzIHRoYXQgd3JhcCB7QGxpbmsgRU9iamVjdH1zIGFuZAorCSAqIHtAbGluayBPYmplY3R9cyB0byBiZSB7QGxpbmsgSUV4ZWN1dGFibGV9cworCSAqIDxwPgorCSAqIFRoaXMgaW5zdGFuY2UgaXMgYSB7QGxpbmsgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeX0gd2hpY2ggbWVhbnMgdGhhdCBpdAorCSAqIGNvbGxlY3RzIHRvZ2V0aGVyIG90aGVyIHtAbGluayBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5fSBhZGFwdGVyCisJICogZmFjdG9yaWVzLiBFYWNoIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB7QGxpbmsgRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5fQorCSAqIG5lZWRzIHRvIGFkZCBpdHNlbGYgdG8gdGhpcyBpbnN0YW5jZSB3aXRoIGEgY2FsbCB0bworCSAqIHtAbGluayBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2FkZEFkYXB0ZXJGYWN0b3J5KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KX0uCisJICogVGhpcyB3aWxsIHRoZW4gYWxsb3cgYWRhcHRlcnMgY3JlYXRlZCBieSB0aGF0IGZhY3RvcnkgdG8gYmUgZm91bmQgd2hlbgorCSAqIGFkYXB0aW5nIGNsYXNzIGluc3RhbmNlcyBoYW5kbGVkIGJ5IHRoZSBuZXcgZmFjdG9yeS4KKwkgKi8KKwljbGFzcyBFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnlJbXBsIGV4dGVuZHMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzCisJCQlFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoZmluYWwgT2JqZWN0IHR5cGUpIHsKKwkJCXJldHVybiB0eXBlID09IElFeGVjdXRhYmxlLmNsYXNzOworCQl9IC8vIGlzRmFjdG9yeUZvclR5cGUKKworCX0gLy8gRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5SW1wbAorfSAvLyBFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2FkYXB0ZXJzL2V4ZWN1dGFibGUvZW1mL0V4cGVyaW1lbnRFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2FkYXB0ZXJzL2V4ZWN1dGFibGUvZW1mL0V4cGVyaW1lbnRFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTk2ZjU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvZXhlY3V0YWJsZS9lbWYvRXhwZXJpbWVudEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8vIEV4cGVyaW1lbnRFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuZXhlY3V0YWJsZS5lbWY7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LnV0aWwuRXhwZXJpbWVudEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5CYXRjaE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGFuIHtAbGluayBFeGVjdXRhYmxlQWRhcHRlckZhY3Rvcnl9IHRoYXQgY3JlYXRlcyBhZGFwdGVycyB0aGF0CisgKiBhZGFwdCB7QGxpbmsgRXhwZXJpbWVudH1zIHRvIHtAbGluayBJRXhlY3V0YWJsZX1zLgorICovCitwdWJsaWMgY2xhc3MgRXhwZXJpbWVudEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCUV4cGVyaW1lbnRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeSB7CisKKwkvKioKKwkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisJICovCisJcHVibGljIEV4cGVyaW1lbnRFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJCUV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGRBZGFwdGVyRmFjdG9yeSh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LnV0aWwuRXhwZXJpbWVudEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUV4cGVyaW1lbnRBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHBlcmltZW50QWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBFeHBlcmltZW50RXhlY3V0YWJsZUFkYXB0ZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby51dGlsLlNjZW5hcmlvQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoZmluYWwgT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gSUV4ZWN1dGFibGUuY2xhc3MgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGFkYXB0cyBhbiB7QGxpbmsgRXhwZXJpbWVudH0gdG8gYW4ge0BsaW5rIElFeGVjdXRhYmxlfS4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEV4cGVyaW1lbnRFeGVjdXRhYmxlQWRhcHRlciBleHRlbmRzCisJCQlFeGVjdXRhYmxlQWRhcHRlciBpbXBsZW1lbnRzIEFkYXB0ZXIgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5hZGFwdGVycy5leGVjdXRhYmxlLmVtZi5FeGVjdXRhYmxlQWRhcHRlciNydW4oKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCUJhdGNoTWFuYWdlci5JTlNUQU5DRS5jcmVhdGVBbmRSdW5CYXRjaCgoRXhwZXJpbWVudCkgZ2V0VGFyZ2V0KCkpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmFkYXB0ZXJzLmV4ZWN1dGFibGUuZW1mLkV4ZWN1dGFibGVBZGFwdGVyI3N0ZXAoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHN0ZXAoKSB7CisJCQlzdXBlci5zdGVwKCk7CisJCQkvLyBUT0RPIGltcGxlbWVudCBFeHBlcmltZW50RXhlY3V0YWJsZUFkYXB0ZXIuc3RlcCgpCisJCQkvLyBCYXRjaE1hbmFnZXIuSU5TVEFOQ0UuY3JlYXRlQW5kU3RlcEJhdGNoKChFeHBlcmltZW50KQorCQkJLy8gZ2V0VGFyZ2V0KCkpOworCQl9CisJfSAvLyBFeHBlcmltZW50RXhlY3V0YWJsZUFkYXB0ZXIKK30gLy8gRXhwZXJpbWVudEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvZXhlY3V0YWJsZS9lbWYvU2NlbmFyaW9FeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2FkYXB0ZXJzL2V4ZWN1dGFibGUvZW1mL1NjZW5hcmlvRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1Yjg1YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2FkYXB0ZXJzL2V4ZWN1dGFibGUvZW1mL1NjZW5hcmlvRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3NiBAQAorLy8gU2NlbmFyaW9FeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuZXhlY3V0YWJsZS5lbWY7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLnV0aWwuU2NlbmFyaW9BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4ge0BsaW5rIEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeX0gdGhhdCBjcmVhdGVzIGFkYXB0ZXJzIHRoYXQKKyAqIGFkYXB0IHtAbGluayBTY2VuYXJpb31zIHRvIHtAbGluayBJRXhlY3V0YWJsZX1zLgorICovCitwdWJsaWMgY2xhc3MgU2NlbmFyaW9FeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBTY2VuYXJpb0FkYXB0ZXJGYWN0b3J5CisJCWltcGxlbWVudHMgRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5IHsKKworCS8qKgorCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgU2NlbmFyaW9FeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJCUV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGRBZGFwdGVyRmFjdG9yeSh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby51dGlsLlNjZW5hcmlvQWRhcHRlckZhY3RvcnkjY3JlYXRlU2NlbmFyaW9BZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTY2VuYXJpb0FkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgU2NlbmFyaW9FeGVjdXRhYmxlQWRhcHRlcigpOworCX0gLy8gY3JlYXRlU2NlbmFyaW9BZGFwdGVyCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby51dGlsLlNjZW5hcmlvQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoZmluYWwgT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gSUV4ZWN1dGFibGUuY2xhc3MgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGFkYXB0cyBhIHtAbGluayBTY2VuYXJpb30gdG8gYW4ge0BsaW5rIElFeGVjdXRhYmxlfS4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFNjZW5hcmlvRXhlY3V0YWJsZUFkYXB0ZXIgZXh0ZW5kcyBFeGVjdXRhYmxlQWRhcHRlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmFkYXB0ZXJzLmV4ZWN1dGFibGUuZW1mLkV4ZWN1dGFibGVBZGFwdGVyI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJU2ltdWxhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmNyZWF0ZUFuZFJ1blNpbXVsYXRpb24oCisJCQkJCShTY2VuYXJpbykgZ2V0VGFyZ2V0KCkpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmFkYXB0ZXJzLmV4ZWN1dGFibGUuZW1mLkV4ZWN1dGFibGVBZGFwdGVyI3N0ZXAoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHN0ZXAoKSB7CisJCQlTaW11bGF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuY3JlYXRlQW5kU3RlcFNpbXVsYXRpb24oCisJCQkJCShTY2VuYXJpbykgZ2V0VGFyZ2V0KCkpOworCQl9CisJfSAvLyBTY2VuYXJpb0V4ZWN1dGFibGVBZGFwdGVyCisKK30gLy8gU2NlbmFyaW9FeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2FkYXB0ZXJzL2lkZW50aWZpYWJsZS9Db25maWd1cmF0aW9uRWxlbWVudElkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9hZGFwdGVycy9pZGVudGlmaWFibGUvQ29uZmlndXJhdGlvbkVsZW1lbnRJZGVudGlmaWFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MWY4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9hZGFwdGVycy9pZGVudGlmaWFibGUvQ29uZmlndXJhdGlvbkVsZW1lbnRJZGVudGlmaWFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvbmZpZ3VyYXRpb25FbGVtZW50SWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuaWRlbnRpZmlhYmxlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4ge0BsaW5rIElBZGFwdGVyRmFjdG9yeX0gdGhhdCBhZGFwdHMKKyAqIHtAbGluayBJQ29uZmlndXJhdGlvbkVsZW1lbnR9cyB0byB7QGxpbmsgSWRlbnRpZmlhYmxlfXMuCisgKi8KK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRWxlbWVudElkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKKwkJSWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkgeworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwKKwkgKiAgICAgIGphdmEubGFuZy5DbGFzcykKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoZmluYWwgT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwKKwkJCWZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlKSB7CisJCUlkZW50aWZpYWJsZSByZXRWYWx1ZSA9IG51bGw7CisJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQKKwkJCQkmJiBhZGFwdGVyVHlwZS5lcXVhbHMoSWRlbnRpZmlhYmxlLmNsYXNzKSkgeworCQkJLy8gWWVzCisJCQlyZXRWYWx1ZSA9IChJZGVudGlmaWFibGUpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcigKKwkJCQkJVVJJLmNyZWF0ZVVSSSgoKElDb25maWd1cmF0aW9uRWxlbWVudCkgYWRhcHRhYmxlT2JqZWN0KQorCQkJCQkJCS5nZXRBdHRyaWJ1dGUoRHVibGluQ29yZS5JREVOVElGSUVSKSksCisJCQkJCUlkZW50aWZpYWJsZS5jbGFzcyk7CisJCX0gLy8gaWYKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRBZGFwdGVyCit9IC8vIENvbmZpZ3VyYXRpb25FbGVtZW50SWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2FkYXB0ZXJzL2lkZW50aWZpYWJsZS9GaWxlSWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2FkYXB0ZXJzL2lkZW50aWZpYWJsZS9GaWxlSWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzgwYmE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvaWRlbnRpZmlhYmxlL0ZpbGVJZGVudGlmaWFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8vIEZpbGVJZGVudGlmaWFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5hZGFwdGVycy5pZGVudGlmaWFibGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhbiB7QGxpbmsgSUFkYXB0ZXJGYWN0b3J5fSB0aGF0IGFkYXB0cyB7QGxpbmsgSUZpbGV9cyB0bworICoge0BsaW5rIElkZW50aWZpYWJsZX1zLgorICovCitwdWJsaWMgY2xhc3MgRmlsZUlkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkgeworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwKKwkgKiAgICAgIGphdmEubGFuZy5DbGFzcykKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoZmluYWwgT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwKKwkJCWZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlKSB7CisJCUlkZW50aWZpYWJsZSByZXRWYWx1ZSA9IG51bGw7CisJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJRmlsZQorCQkJCSYmIGFkYXB0ZXJUeXBlLmVxdWFscyhJZGVudGlmaWFibGUuY2xhc3MpKSB7CisJCQkvLyBZZXMKKwkJCXJldFZhbHVlID0gKElkZW50aWZpYWJsZSkgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKAorCQkJCQlVUkkuY3JlYXRlRmlsZVVSSSgoKElGaWxlKSBhZGFwdGFibGVPYmplY3QpLmdldExvY2F0aW9uKCkKKwkJCQkJCQkudG9TdHJpbmcoKSksIElkZW50aWZpYWJsZS5jbGFzcyk7CisJCX0gLy8gaWYKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0QWRhcHRlcgorCit9IC8vIEZpbGVJZGVudGlmaWFibGVBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvaWRlbnRpZmlhYmxlL0lkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9hZGFwdGVycy9pZGVudGlmaWFibGUvSWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjlhODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvaWRlbnRpZmlhYmxlL0lkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLy8gSWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuaWRlbnRpZmlhYmxlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhbiB7QGxpbmsgSUFkYXB0ZXJGYWN0b3J5fSB0aGF0IGFkYXB0cyB7QGxpbmsgT2JqZWN0fXMgdG8KKyAqIHtAbGluayBJZGVudGlmaWFibGV9cy4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIElkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyTGlzdCgpCisJICovCisJcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7CisJCXJldHVybiBuZXcgQ2xhc3NbXSB7IElkZW50aWZpYWJsZS5jbGFzcyB9OworCX0KKworfSAvLyBJZGVudGlmaWFibGVBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvaWRlbnRpZmlhYmxlL1VSSUlkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9hZGFwdGVycy9pZGVudGlmaWFibGUvVVJJSWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGJhMGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYWRhcHRlcnMvaWRlbnRpZmlhYmxlL1VSSUlkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLy8gVVJJSWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuaWRlbnRpZmlhYmxlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLkFjdGl2YXRvcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGFuIHtAbGluayBJQWRhcHRlckZhY3Rvcnl9IHRoYXQgYWRhcHRzCisgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSX1zIHRvIHtAbGluayBJZGVudGlmaWFibGV9cy4KKyAqLworcHVibGljIGNsYXNzIFVSSUlkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkgeworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwKKwkgKiAgICAgIGphdmEubGFuZy5DbGFzcykKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoZmluYWwgT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwKKwkJCWZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlKSB7CisJCUlkZW50aWZpYWJsZSByZXRWYWx1ZSA9IG51bGw7CisJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBVUkkKKwkJCQkmJiBhZGFwdGVyVHlwZS5lcXVhbHMoSWRlbnRpZmlhYmxlLmNsYXNzKSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBVUkkgaWRlbnRpZmFibGVVUkkgPSAoVVJJKSBhZGFwdGFibGVPYmplY3Q7CisJCQl0cnkgeworCQkJCWZpbmFsIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOworCQkJCWZpbmFsIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoCisJCQkJCQlpZGVudGlmYWJsZVVSSSwgdHJ1ZSk7CisJCQkJcmV0VmFsdWUgPSAoSWRlbnRpZmlhYmxlKSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKKwkJCX0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJUaGUgcmVzb3VyY2UgXCIiCisJCQkJCQkrIGlkZW50aWZhYmxlVVJJLnRvU3RyaW5nKCkKKwkJCQkJCSsgIlwiIHdhcyBub3QgZm91bmQgb3Igd2FzIG9mIHRoZSB3cm9uZyBmb3JtYXQiLCBlKTsKKwkJCQlyZXRWYWx1ZSA9IG51bGw7CisJCQl9CisJCX0gLy8gaWYgVVJJCisJCXJldHVybiByZXRWYWx1ZTsKKwl9CisKK30gLy8gVVJJSWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2JhdGNoL0JhdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9iYXRjaC9CYXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNTY1NmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9iYXRjaC9CYXRjaC5qYXZhCkBAIC0wLDAgKzEsNTQ2IEBACisvLyBCYXRjaC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLkV4ZWN1dGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvblN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIHJ1bnRpbWUgaGFuZGxlIGZvciB0aGUgZXhlY3V0aW9uIG9mIGFuIHtAbGluayBFeHBlcmltZW50fS4KKyAqIEVhY2gge0BsaW5rIEV4cGVyaW1lbnR9IGhhcyBhIHtAbGluayBTY2VuYXJpb30gYW5kIGEgY29sbGVjdGlvbiBvZgorICoge0BsaW5rIE1vZGlmaWVyfXMuIFRoZSB7QGxpbmsgU2NlbmFyaW99IGZvcm1zIHRoZSBiYXNpcyBmb3IgdGhlIGNyZWF0aW9uIG9mIGEKKyAqIHNldCBvZiBkZXJpdmVkIHtAbGluayBTY2VuYXJpb31zIHRoYXQgYXJlIGNyZWF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZQorICoge0BsaW5rIEV4cGVyaW1lbnR9J3Mge0BsaW5rIE1vZGlmaWVyfXMuIEVhY2ggb2YgdGhlIGRlcml2ZWQge0BsaW5rIFNjZW5hcmlvfXMKKyAqIGlzIGV4ZWN1dGVkIGFzIGEge0BsaW5rIFNpbXVsYXRpb259LiBBIHtAbGluayBCYXRjaH0gbWFpbnRhaW5zIHRoZSBsaW5rCisgKiBiZXR3ZWVuIGFuIHtAbGluayBFeHBlcmltZW50fSBhbmQgdGhlIHJlc3VsdGluZyB7QGxpbmsgU2ltdWxhdGlvbn1zLgorICogPHA+CisgKiBFYWNoIHtAbGluayBCYXRjaH0gaGFzIGEgdW5pcXVlIHNlcXVlbmNlIG51bWJlciBhbmQgaXRzIHtAbGluayBTaW11bGF0aW9ufXMKKyAqIGNhbiBiZSBydW4gc2VxdWVudGlhbGx5IG9yIGluIHBhcmFsbGVsIGFuZCBpbiB0aGUgImZvcmVncm91bmQiIChpLmUuLCBhcHBlYXIKKyAqIGluIHRoZSBHVUkpIG9yIGluIHRoZSAiYmFja2dyb3VuZCIgKGkuZS4sIG5vdCBhcHBlYXIgaW4gdGhlIEdVSSkuCisgKi8KK3B1YmxpYyBjbGFzcyBCYXRjaCBleHRlbmRzIEV4ZWN1dGFibGUgaW1wbGVtZW50cyBJQmF0Y2gsIElTaW11bGF0aW9uTGlzdGVuZXIgeworCisJLyoqCisJICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHtAbGluayBCYXRjaH0KKwkgKi8KKwlwcml2YXRlIEJhdGNoU3RhdGUgYmF0Y2hTdGF0ZSA9IEJhdGNoU3RhdGUuUEFVU0VEOworCisJLyoqCisJICogVGhlIHtAbGluayBFeHBlcmltZW50fSB0aGF0IGlzIGJlaW5nIGV4ZWN1dGVkIGJ5IHRoZSB7QGxpbmsgQmF0Y2h9LgorCSAqLworCXByaXZhdGUgRXhwZXJpbWVudCBleHBlcmltZW50ID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBTZXQgb2Yge0BsaW5rIElTaW11bGF0aW9ufXMgdGhhdCBhcmUgYWN0aXZlbHkgcnVubmluZyBhcyBwYXJ0IG9mIHRoZQorCSAqIHtAbGluayBCYXRjaH07CisJICovCisJcHJpdmF0ZSBmaW5hbCBMaXN0PElTaW11bGF0aW9uPiBhY3RpdmVTaW11bGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SVNpbXVsYXRpb24+KCk7CisKKwkvLyBUT0RPIHRoZXNlIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgZnJvbSBwcmVmZXJlbmNlcworCS8vIElmIHRoaXMgaXMgZXZlciBmYWxzZSwgeW91IG5lZWQgdG8gcmUtaW1wbGVtZW50IHJ1bihJUHJvZ3Jlc3NNb25pdG9yKSB0bworCS8vIGhhbmRsZSBwYXJhbGxlbCBTaW11bGF0aW9ucworCXByaXZhdGUgYm9vbGVhbiBydW5uaW5nU2ltdWxhdGlvbnNTZXF1ZW50aWFsbHkgPSB0cnVlOworCisJcHJpdmF0ZSBib29sZWFuIHJ1bm5pbmdJbkJhY2tncm91bmQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoaXMgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0aGUge0BsaW5rIEJhdGNofSBzaG91bGQgY29udGludWUgZXhlY3V0aW5nCisJICogb3Igbm90LiBJZiBpdCBiZWNvbWVzIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlbiB0aGUge0BsaW5rIEJhdGNofSB3aWxsCisJICoga2lsbCBhbGwgb2YgaXRzIHtAbGluayBJU2ltdWxhdGlvbn1zLgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBrZWVwUnVubmluZyA9IHRydWU7CisKKwkvKioKKwkgKiBUaGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgSUJhdGNoTGlzdGVuZXJ9IHdhaXRpbmcgdG8gYmUgdG9sZCBhYm91dAorCSAqIHtAbGluayBCYXRjaEV2ZW50fSdzCisJICovCisJcHJpdmF0ZSBmaW5hbCBMaXN0PElCYXRjaExpc3RlbmVyPiBsaXN0ZW5lcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8SUJhdGNoTGlzdGVuZXI+KCk7CisKKwkvKioKKwkgKiBUaGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgSUJhdGNoTGlzdGVuZXJTeW5jfSB3YWl0aW5nIHRvIGJlIHRvbGQgYWJvdXQKKwkgKiB7QGxpbmsgQmF0Y2hFdmVudH0ncworCSAqLworCXByaXZhdGUgZmluYWwgTGlzdDxJQmF0Y2hMaXN0ZW5lclN5bmM+IGxpc3RlbmVyc1N5bmMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8SUJhdGNoTGlzdGVuZXJTeW5jPigpOworCisJcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7CisKKwlwcml2YXRlIGJvb2xlYW4gY2FuY2VsUmVxdWVzdGVkOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gZXhwZXJpbWVudAorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBFeHBlcmltZW50fSB0aGF0IGZvcm1zIHRoZSBiYXNpcyBvZiB0aGlzCisJICogICAgICAgICAgICB7QGxpbmsgQmF0Y2h9CisJICogCisJICogQHBhcmFtIHNlcXVlbmNlTnVtYmVyCisJICogICAgICAgICAgICB0aGUgdW5pcXVlIHNlcXVlbmNlIG51bWJlciBvZiB0aGlzIHtAbGluayBCYXRjaH0uIFRoaXMgaXMKKwkgKiAgICAgICAgICAgIHR5cGljYWxseSBwcm92aWRlZCBieSB0aGUge0BsaW5rIEJhdGNoTWFuYWdlcn0uCisJICovCisJQmF0Y2goZmluYWwgRXhwZXJpbWVudCBleHBlcmltZW50LCBmaW5hbCBpbnQgc2VxdWVuY2VOdW1iZXIpIHsKKwkJc3VwZXIoIkJhdGNoOiAiICsgc2VxdWVuY2VOdW1iZXIsIHNlcXVlbmNlTnVtYmVyKTsKKwkJdGhpcy5leHBlcmltZW50ID0gZXhwZXJpbWVudDsKKwl9IC8vIEJhdGNoCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElTdGF0dXMgcnVuKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlJU3RhdHVzIHJldFZhbHVlID0gU3RhdHVzLk9LX1NUQVRVUzsKKwkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKKwkJdHJ5IHsKKwkJCXNldEJhdGNoU3RhdGUoQmF0Y2hTdGF0ZS5SVU5OSU5HKTsKKwkJCW1vbml0b3IuYmVnaW5UYXNrKCJCYXRjaDogIiArIGdldFNlcXVlbmNlTnVtYmVyKCksIGdldFRvdGFsV29yaygpKTsKKworCQkJLy8gSW5pdGlhbGl6ZSB0aGUgc2NlbmFyaW8gdGhhdCBpcyBwYXJ0IG9mIHRoZSBleHBlcmltZW50CisJCQlnZXRFeHBlcmltZW50KCkuaW5pdFNjZW5hcmlvKCk7CisJCQkKKwkJCS8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIG9mIHRoZSBTaW11bGF0aW9ucyB0byBydW4gYW5kIGJlZ2luIHRoZWlyCisJCQkvLyBleGVjdXRpb24uCisJCQlmb3IgKElTaW11bGF0aW9uIHNpbXVsYXRpb24gPSBnZXROZXh0U2ltdWxhdGlvblRvUnVuKCk7IGtlZXBSdW5uaW5nCisJCQkJCSYmIHNpbXVsYXRpb24gIT0gbnVsbDsgc2ltdWxhdGlvbiA9IGdldE5leHRTaW11bGF0aW9uVG9SdW4oKSkgeworCQkJCXNldEJhdGNoU3RhdGUoQmF0Y2hTdGF0ZS5SVU5OSU5HKTsKKworCQkJCXN0YXJ0U2ltdWxhdGlvblJ1bm5pbmcoc2ltdWxhdGlvbik7CisKKwkJCQkvLyBBcmUgd2UgcnVubmluZyB0aGUgc2ltdWxhdGlvbnMgc2VxdWVudGlhbGx5PworCQkJCWlmIChpc1J1bm5pbmdTaW11bGF0aW9uc1NlcXVlbnRpYWxseSgpKSB7CisJCQkJCS8vIFllcworCQkJCQkvLyBUaGVuIHdlIG9ubHkgc3RhcnQgb25lIGhlcmUgYW5kIHRoZW4gaGFuZGxlIHRoZSByZXN0IGluCisJCQkJCS8vIHNpbXVsYXRpb25DaGFuZ2VkKCkKKwkJCQkJYnJlYWs7CisJCQkJfSAvLyBpZgorCQkJCS8vIENhbmNlbGVkPworCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworCQkJCQkvLyBZZXMKKwkJCQkJY2FuY2VsUmVxdWVzdGVkID0gdHJ1ZTsKKwkJCQkJc3RvcEFsbFNpbXVsYXRpb25zKCk7CisJCQkJCXJldFZhbHVlID0gU3RhdHVzLkNBTkNFTF9TVEFUVVM7CisJCQkJfQorCQkJfSAvLyBmb3IgZWFjaCBTaW11bGF0aW9uCisKKwkJCS8vIElmIHdlJ3JlIHJ1bm5pbmcgdGhlIFNpbXVsYXRpb25zIGluIHBhcmFsbGVsIHRoZW4gd2UgbmVlZCB0bworCQkJLy8gcGF1c2UgaGVyZSBhbmQgd2FpdCBmb3IgdGhlbSBhbGwgdG8gZW5kLgorCQl9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworCQkJaGFuZGxlRXhjZXB0aW9uKGUpOworCQkJa2VlcFJ1bm5pbmcgPSBmYWxzZTsKKworCQkJLy8gQXJlIHRoZXJlIGFueSBTaW11bGF0aW9ucyBydW5uaW5nPworCQkJaWYgKGFjdGl2ZVNpbXVsYXRpb25zLnNpemUoKSA+IDApIHsKKwkJCQkvLyBZZXMKKwkJCQkvLyBTdG9wJ2VtCisJCQkJY2FuY2VsUmVxdWVzdGVkID0gdHJ1ZTsKKwkJCQlzdG9wQWxsU2ltdWxhdGlvbnMoKTsKKwkJCX0gLy8gaWYKKwkJCW1vbml0b3IuZG9uZSgpOworCQkJc2V0QmF0Y2hTdGF0ZShCYXRjaFN0YXRlLlNUT1BQRUQpOworCQl9IC8vIGNhdGNoIEV4Y2VwdGlvbgorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHJ1bgorCisJLyoqCisJICogRG8gdGhlIHByb2Nlc3NpbmcgcmVxdWlyZWQgdG8gaGFuZGxlIGEge0BsaW5rIFJ1bnRpbWVFeGNlcHRpb259CisJICogCisJICogQHBhcmFtIGUKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgRXhjZXB0aW9ufSB0aGF0IHdhcyBjYXVnaHQgaW4gdGhlIHtAbGluayAjcnVuKCl9CisJICogICAgICAgICAgICBtZXRob2QuCisJICovCisJcHJpdmF0ZSB2b2lkIGhhbmRsZUV4Y2VwdGlvbihmaW5hbCBFeGNlcHRpb24gZSkgeworCisJCS8vIFdlIGNhbiBnZXQgYSBSdW50aW1lIGV4Y2VwdGlvbiBpZiB0aGUgdXNlciB0cmllcyB0byBydW4gYW4gRXhwZXJpbWVudAorCQkvLyB0aGF0IGRvZXNuJ3QgaGF2ZSBhIFNjZW5hcmlvLiBPciwgd2UgY2FuIGdldCBvbmUgYmVjYXVzZSBvZiBzb21lIHJlYWwKKwkJLy8gaW50ZXJuYWwgZXJyb3IuCisKKwkJU3RyaW5nIHRlbXBFcnJvck1lc3NhZ2UgPSAiIjsKKwkJYm9vbGVhbiBsb2dJdCA9IGZhbHNlOworCisJCS8vIENvdWxkIHdlIGJlIG1pc3NpbmcgYSBTY2VuYXJpbyBvciBzb21ldGhpbmcgaW4gdGhlIFNjZW5hcmlvPworCQlpZiAoZSBpbnN0YW5jZW9mIE51bGxQb2ludGVyRXhjZXB0aW9uKSB7CisJCQkvLyBZZXMKKwkJCS8vIERvZXMgdGhlIEV4cGVyaW1lbnQgaGF2ZSBhIFNjZW5hcmlvPworCQkJaWYgKGV4cGVyaW1lbnQuZ2V0U2NlbmFyaW8oKSA9PSBudWxsKSB7CisJCQkJLy8gTm8KKwkJCQl0ZW1wRXJyb3JNZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTWVzc2FnZXMKKwkJCQkJCS5nZXRTdHJpbmcoIkV4cC5NaXNzaW5nU2NlbmFyaW8iKSwKKwkJCQkJCW5ldyBPYmplY3RbXSB7IGdldE5hbWUoKSB9KTsKKwkJCX0gLy8gaWYgbWlzc2luZyBhIHNlcXVlbmNlcgorCQkJZWxzZSB7CisJCQkJLy8gWWVzCisJCQkJLy8gRG9lcyB0aGUgU2NlbmFyaW8gaGF2ZSBhIFNlcXVlbmNlcj8KKwkJCQlpZiAoZXhwZXJpbWVudC5nZXRTY2VuYXJpbygpLmdldFNlcXVlbmNlcigpID09IG51bGwpIHsKKwkJCQkJLy8gTm8KKwkJCQkJdGVtcEVycm9yTWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1lc3NhZ2VzCisJCQkJCQkJLmdldFN0cmluZygiRXhwLk1pc3NpbmdTZXEiKSwKKwkJCQkJCQluZXcgT2JqZWN0W10geyBnZXROYW1lKCkgfSk7CisJCQkJfSAvLyBpZiBtaXNzaW5nIGEgc2VxdWVuY2VyCisJCQkJLy8gSG93IGFib3V0IGEgbW9kZWw/CisJCQkJZWxzZSBpZiAoZXhwZXJpbWVudC5nZXRTY2VuYXJpbygpLmdldE1vZGVsKCkgPT0gbnVsbCkgeworCQkJCQkvLyBObworCQkJCQl0ZW1wRXJyb3JNZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTWVzc2FnZXMKKwkJCQkJCQkuZ2V0U3RyaW5nKCJFeHAuTWlzc2luZ01vZGVsIiksCisJCQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0TmFtZSgpIH0pOworCQkJCX0gLy8gaWYgbWlzc2luZyBtb2RlbAorCQkJCWVsc2UgeworCQkJCQkvLyBZZXMKKwkJCQkJLy8gSnVzdCBzb21lIG90aGVyIE5QRQorCQkJCQlsb2dJdCA9IHRydWU7CisJCQkJCXRlbXBFcnJvck1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChNZXNzYWdlcworCQkJCQkJCS5nZXRTdHJpbmcoIkV4cC5JRXJyIiksIG5ldyBPYmplY3RbXSB7IGdldE5hbWUoKSB9KTsKKwkJCQl9IC8vIGVsc2UKKwkJCX0gLy8gZWxzZSBoYXMgYSBTY2VuYXJpbworCisJCX0gLy8gaWYgTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJZWxzZSB7CisJCQkvLyBObworCQkJbG9nSXQgPSB0cnVlOworCQkJdGVtcEVycm9yTWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1lc3NhZ2VzCisJCQkJCS5nZXRTdHJpbmcoIkV4cC5JRXJyIiksIG5ldyBPYmplY3RbXSB7IGdldE5hbWUoKSB9KTsKKwkJfSAvLyBlbHNlCisKKwkJZmluYWwgU3RyaW5nIGVycm9yTWVzc2FnZSA9IHRlbXBFcnJvck1lc3NhZ2U7CisKKwkJLy8gTG9nIGl0PworCQlpZiAobG9nSXQpIHsKKwkJCS8vIFllcworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKGVycm9yTWVzc2FnZSwgZSk7CisJCX0gLy8gaWYKKworCQl0cnkgeworCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCisJCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOworCQkJCQlmaW5hbCBJU3RhdHVzIHdhcm5pbmcgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywKKwkJCQkJCQlBY3RpdmF0b3IuUExVR0lOX0lELCAxLCBlcnJvck1lc3NhZ2UsIG51bGwpOworCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Iod2luZG93LmdldFNoZWxsKCksIG51bGwsIG51bGwsCisJCQkJCQkJd2FybmluZyk7CisJCQkJfSAvLyBydW4KKwkJCX0pOworCQl9IGNhdGNoIChmaW5hbCBFcnJvciBuY2RmZSkgeworCQkJLy8gSWYgd2UgZ2V0IHRoaXMgZXhjZXB0aW9uLCBpdCBpcyBiZWNhdXNlIHdlJ3JlIG5vdCBydW5uaW5nIGluCisJCQkvLyBlY2xpcHNlLgorCQl9IC8vIGNhdGNoCisKKwl9IC8vIGhhbmRsZUV4Y2VwdGlvbgorCisJLyoqCisJICogSXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgYWN0aXZlIHtAbGluayBTaW11bGF0aW9ufXMgYW5kIHN0b3AvY2FuY2VsCisJICogdGhlbS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgc3RvcEFsbFNpbXVsYXRpb25zKCkgeworCQlmb3IgKGZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb24gOiBhY3RpdmVTaW11bGF0aW9ucykgeworCQkJc2ltdWxhdGlvbi5zdG9wKCk7CisJCQlzaW11bGF0aW9uLmNhbmNlbCgpOworCQl9IC8vIGZvciBlYWNoIElTaW11bGF0aW9uCisJfSAvLyBzdG9wQWxsU2ltdWxhdGlvbnMKKworCS8qKgorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogICAgICAgICAgICBhIHtAbGluayBTaW11bGF0aW9ufSB0aGF0IGlzIHRvIGJlIHN0YXJ0ZWQuCisJICovCisJcHJpdmF0ZSB2b2lkIHN0YXJ0U2ltdWxhdGlvblJ1bm5pbmcoZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbikgeworCQlhY3RpdmVTaW11bGF0aW9ucy5hZGQoc2ltdWxhdGlvbik7CisJCXNpbXVsYXRpb24uYWRkU2ltdWxhdGlvbkxpc3RlbmVyKHRoaXMpOworCQlzaW11bGF0aW9uLnJ1bigpOworCX0gLy8gc3RhcnRTaW11bGF0aW9uUnVubmluZworCisJLyoqCisJICogQHJldHVybiB0aGUgdmFsdWUgdG8gYmUgcGFzc2VkIHRvIHRoZSB7QGxpbmsgQmF0Y2h9J3MKKwkgKiAgICAgICAgIHtAbGluayBJUHJvZ3Jlc3NNb25pdG9yfSB3aGVuIGJlZ2lubmluZyB0aGUgdGFzay4gVGhpcyB2YWx1ZQorCSAqICAgICAgICAgY291bGQgYmUge0BsaW5rIElQcm9ncmVzc01vbml0b3IjVU5LTk9XTn0gaWYgdGhlIG51bWJlciBvZgorCSAqICAgICAgICAge0BsaW5rIElTaW11bGF0aW9ufXMgdG8gYmUgcnVuIGlzIG5vdCBrbm93biBiZWZvcmUgaGFuZC4KKwkgKiAgICAgICAgIE90aGVyd2lzZSwgaXQgc2hvdWxkIGJlIHRoZSBudW1iZXIgb2Yge0BsaW5rIElTaW11bGF0aW9ufSdzIHRoYXQKKwkgKiAgICAgICAgIHdpbGwgYmUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXROZXh0U2ltdWxhdGlvblRvUnVuKCl9LgorCSAqLworCXByb3RlY3RlZCBpbnQgZ2V0VG90YWxXb3JrKCkgeworCQlyZXR1cm4gMTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuZXh0IHtAbGluayBJU2ltdWxhdGlvbn0gdG8gcnVuIGFzIHBhcnQgb2YgdGhlIHtAbGluayBCYXRjaH0sCisJICogICAgICAgICBvciA8Y29kZT5udWxsPC9jb2RlPiwgaWYgdGhlcmUgYXJlIG5vIG1vcmUuCisJICovCisJcHJvdGVjdGVkIElTaW11bGF0aW9uIGdldE5leHRTaW11bGF0aW9uVG9SdW4oKSB7CisJCUlTaW11bGF0aW9uIHJldFZhbHVlID0gbnVsbDsKKwkJLy8gSXMgdGhlIGV4cGVyaW1lbnQgY29tcGxldGU/CisJCWlmICghZXhwZXJpbWVudC5pc0NvbXBsZXRlKCkpIHsKKwkJCS8vIE5vCisJCQlyZXRWYWx1ZSA9IFNpbXVsYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5jcmVhdGVTaW11bGF0aW9uKAorCQkJCQlleHBlcmltZW50LnVwZGF0ZVNjZW5hcmlvKCksIG51bGwpOworCQl9CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0TmV4dFNpbXVsYXRpb25Ub1J1bgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guSUJhdGNoI3J1bigpCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQlzY2hlZHVsZSgpOworCX0gLy8gcnVuCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUjcGF1c2UoKQorCSAqLworCXB1YmxpYyB2b2lkIHBhdXNlKCkgeworCQkvLyBUT0RPIGltcGxlbWVudCBCYXRjaC5wYXVzZSgpCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZSNzdGVwKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGVwKCkgeworCQkvLyBUT0RPIGltcGxlbWVudCBCYXRjaC5zdGVwKCkKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlI3Jlc2V0KCkKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJLy8gVE9ETyBpbXBsZW1lbnQgQmF0Y2gucmVzZXQoKQorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5JQmF0Y2gjc3RvcCgpCisJICovCisJcHVibGljIHZvaWQgc3RvcCgpIHsKKwkJa2VlcFJ1bm5pbmcgPSBmYWxzZTsKKwl9IC8vIHN0b3AKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZSNpc1J1bm5pbmcoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKKwkJcmV0dXJuICFiYXRjaFN0YXRlLmVxdWFscyhCYXRjaFN0YXRlLlBBVVNFRCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbkxpc3RlbmVyI3NpbXVsYXRpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25FdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzaW11bGF0aW9uQ2hhbmdlZChmaW5hbCBTaW11bGF0aW9uRXZlbnQgZXZlbnQpIHsKKworCQkvLyBGb3IgdGhlIGNhc2Ugd2hlbiB3ZSdyZSBydW5uaW5nIHtAbGluayBTaW11bGF0aW9ufXMgc2VxdWVudGlhbGx5LAorCQkvLyB0aGlzIG1ldGhvZCBjb250YWlucyBtb3N0IG9mIHRoZSBjb250cm9sIGxvZ2ljIGZvciB0aGUgZXhlY3V0aW9uIG9mCisJCS8vIHRoZSB7QGxpbmsgQmF0Y2h9LiBCYXNpY2FsbHksIGFzIGVhY2ggb2YgdGhlIHtAbGluayBCYXRjaH0ncworCQkvLyB7QGxpbmsgU2ltdWxhdGlvbn1zIGNoYW5nZXMgc3RhdGUsIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4gSW4gaXQgd2UKKwkJLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSB7QGxpbmsgQmF0Y2h9IGhhcyBiZWVuIGNhbmNlbGVkLCBvciBoYXMgYmVlbgorCQkvLyByZXF1ZXN0ZWQgdG8gc3RvcC4KKworCQkvLyBEaWQgdGhlIFNpbXVsYXRpb24gY29tcGxldGU/CisJCWlmIChldmVudC5nZXRTaW11bGF0aW9uU3RhdGUoKSA9PSBTaW11bGF0aW9uU3RhdGUuQ09NUExFVEVEX1NFUVVFTkNFKSB7CisJCQkvLyBZZXMKKworCQkJbW9uaXRvci53b3JrZWQoMSk7CisJCQlldmVudC5nZXRTaW11bGF0aW9uKCkuc3RvcCgpOworLy8JCQlldmVudC5nZXRTaW11bGF0aW9uKCkuc3RlcCgpOworCisJCQkvLyBBcmUgd2Ugd2FpdGluZyBmb3IgU2ltdWxhdGlvbnMgdG8gZW5kPworCQkJaWYgKGtlZXBSdW5uaW5nKSB7CisJCQkJLy8gTm8KKwkJCQkvLyBTaG91bGQgd2UgdHJ5IHRvIHN0YXJ0IGFub3RoZXIgb25lPworCQkJCWlmICghbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgcnVubmluZ1NpbXVsYXRpb25zU2VxdWVudGlhbGx5KSB7CisJCQkJCS8vIFllcworCQkJCQlmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uID0gZ2V0TmV4dFNpbXVsYXRpb25Ub1J1bigpOworCQkJCQkvLyBJcyB0aGVyZSBhbm90aGVyIHNpbXVsYXRpb24gdG8gcnVuPworCQkJCQlpZiAoc2ltdWxhdGlvbiAhPSBudWxsKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXN0YXJ0U2ltdWxhdGlvblJ1bm5pbmcoc2ltdWxhdGlvbik7CisJCQkJCX0gLy8gaWYKKwkJCQkJLy8gSGF2ZSBhbGwgdGhlIFNpbXVsYXRpb25zIGVuZGVkPworCQkJCQllbHNlIGlmIChhY3RpdmVTaW11bGF0aW9ucy5zaXplKCkgPT0gMCkgeworCQkJCQkJLy8gWWVzCisJCQkJCQltb25pdG9yLmRvbmUoKTsKKwkJCQkJCXNldEJhdGNoU3RhdGUoQmF0Y2hTdGF0ZS5TVE9QUEVEKTsKKwkJCQkJfSAvLyBlbHNlIGFsbCB0aGUgU2ltdWxhdGlvbnMgZW5kZWQKKwkJCQl9IC8vIGlmCisJCQl9IC8vIGlmIHdhaXRpbmcgZm9yIFNpbXVsYXRpb25zIHRvIGVuZAorCQkJZWxzZSB7CisJCQkJLy8gWWVzCisJCQkJLy8gSGF2ZSBhbGwgdGhlIFNpbXVsYXRpb25zIGVuZGVkPworCQkJCWlmIChhY3RpdmVTaW11bGF0aW9ucy5zaXplKCkgPT0gMCkgeworCQkJCQkvLyBZZXMKKwkJCQkJbW9uaXRvci5kb25lKCk7CisJCQkJCXNldEJhdGNoU3RhdGUoQmF0Y2hTdGF0ZS5TVE9QUEVEKTsKKwkJCQl9IC8vIGlmCisJCQl9IC8vIGVsc2Ugd2FpdGluZyBmb3IgU2ltdWxhdGlvbnMgdG8gZW5kCisJCX0gLy8gaWYgYSBzaW11bGF0aW9uIGNvbXBsZXRlZCBjeWNsZQorCQllbHNlIGlmIChldmVudC5nZXRTaW11bGF0aW9uU3RhdGUoKSA9PSBTaW11bGF0aW9uU3RhdGUuU1RPUFBFRCkgeworCQkJYWN0aXZlU2ltdWxhdGlvbnMucmVtb3ZlKGV2ZW50LmdldFNpbXVsYXRpb24oKSk7CisJCQlldmVudC5nZXRTaW11bGF0aW9uKCkucmVtb3ZlU2ltdWxhdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJaWYgKGFjdGl2ZVNpbXVsYXRpb25zLnNpemUoKSA9PSAwKSB7CisJCQkJLy8gWWVzCisJCQkJbW9uaXRvci5kb25lKCk7CisJCQkJc2V0QmF0Y2hTdGF0ZShCYXRjaFN0YXRlLlNUT1BQRUQpOworCQkJfSAvLyBlbHNlIGFsbCB0aGUgU2ltdWxhdGlvbnMgZW5kZWQKKwkJfSAvLyBpZiBzdG9wcGVkCisKKwkJLy8gU2hvdWxkIHdlIGNhbmNlbCBhbGwgdGhlIFNpbXVsYXRpb25zPworCQlpZiAoIWNhbmNlbFJlcXVlc3RlZCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworCQkJLy8gWWVzCisJCQlrZWVwUnVubmluZyA9IGZhbHNlOworCQkJY2FuY2VsUmVxdWVzdGVkID0gdHJ1ZTsKKwkJCXN0b3BBbGxTaW11bGF0aW9ucygpOworCQl9IC8vIGlmIGNhbmNlbGVkCisKKwkJLy8gSGF2ZSB3ZSBiZWVuIGFza2VkIHRvIHN0b3A/CisJCWlmICgha2VlcFJ1bm5pbmcgJiYgIWNhbmNlbFJlcXVlc3RlZCkgeworCQkJLy8gWWVzCisJCQljYW5jZWxSZXF1ZXN0ZWQgPSB0cnVlOworCQkJc3RvcEFsbFNpbXVsYXRpb25zKCk7CisJCX0gLy8gaWYKKwl9Ly8gc2ltdWxhdGlvbkNoYW5nZWQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLklCYXRjaCNnZXRFeHBlcmltZW50KCkKKwkgKi8KKwlwdWJsaWMgRXhwZXJpbWVudCBnZXRFeHBlcmltZW50KCkgeworCQlyZXR1cm4gZXhwZXJpbWVudDsKKwl9IC8vIGdldEV4cGVyaW1lbnQKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHtAbGluayBCYXRjaH0KKwkgKi8KKwlwdWJsaWMgZmluYWwgQmF0Y2hTdGF0ZSBnZXRCYXRjaFN0YXRlKCkgeworCQlyZXR1cm4gYmF0Y2hTdGF0ZTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYmF0Y2hTdGF0ZQorCSAqICAgICAgICAgICAgdGhlIG5ldyBzdGF0ZSBvZiB0aGUge0BsaW5rIEJhdGNofQorCSAqLworCXByaXZhdGUgdm9pZCBzZXRCYXRjaFN0YXRlKGZpbmFsIEJhdGNoU3RhdGUgYmF0Y2hTdGF0ZSkgeworCQkvLyBJcyB0aGUgc3RhdGUgY2hhbmdpbmc/CisJCWlmIChnZXRCYXRjaFN0YXRlKCkgIT0gYmF0Y2hTdGF0ZSkgeworCQkJLy8gWWVzCisJCQl0aGlzLmJhdGNoU3RhdGUgPSBiYXRjaFN0YXRlOworCQkJZmlyZUJhdGNoQ2hhbmdlZChiYXRjaFN0YXRlKTsKKwkJfSAvLyBpZgorCisJfSAvLyBzZXRCYXRjaFN0YXRlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5JQmF0Y2gjaXNSdW5uaW5nU2ltdWxhdGlvbnNTZXF1ZW50aWFsbHkoKQorCSAqLworCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzUnVubmluZ1NpbXVsYXRpb25zU2VxdWVudGlhbGx5KCkgeworCQlyZXR1cm4gcnVubmluZ1NpbXVsYXRpb25zU2VxdWVudGlhbGx5OworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLklCYXRjaCNzZXRSdW5uaW5nU2ltdWxhdGlvbnNTZXF1ZW50aWFsbHkoYm9vbGVhbikKKwkgKi8KKwlwdWJsaWMgZmluYWwgdm9pZCBzZXRSdW5uaW5nU2ltdWxhdGlvbnNTZXF1ZW50aWFsbHkoCisJCQlmaW5hbCBib29sZWFuIHJ1bm5pbmdTaW11bGF0aW9uc1NlcXVlbnRpYWxseSkgeworCQl0aGlzLnJ1bm5pbmdTaW11bGF0aW9uc1NlcXVlbnRpYWxseSA9IHJ1bm5pbmdTaW11bGF0aW9uc1NlcXVlbnRpYWxseTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5JQmF0Y2gjaXNSdW5uaW5nSW5CYWNrZ3JvdW5kKCkKKwkgKi8KKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1J1bm5pbmdJbkJhY2tncm91bmQoKSB7CisJCXJldHVybiBydW5uaW5nSW5CYWNrZ3JvdW5kOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLklCYXRjaCNzZXRSdW5uaW5nSW5CYWNrZ3JvdW5kKGJvb2xlYW4pCisJICovCisJcHVibGljIGZpbmFsIHZvaWQgc2V0UnVubmluZ0luQmFja2dyb3VuZChmaW5hbCBib29sZWFuIHJ1bm5pbmdJbkJhY2tncm91bmQpIHsKKwkJdGhpcy5ydW5uaW5nSW5CYWNrZ3JvdW5kID0gcnVubmluZ0luQmFja2dyb3VuZDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5JQmF0Y2gjYWRkQmF0Y2hMaXN0ZW5lcihvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guSUJhdGNoTGlzdGVuZXIpCisJICovCisJZmluYWwgcHVibGljIHZvaWQgYWRkQmF0Y2hMaXN0ZW5lcihmaW5hbCBJQmF0Y2hMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKKwkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCQl9CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guSUJhdGNoI3JlbW92ZUJhdGNoTGlzdGVuZXIob3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLklCYXRjaExpc3RlbmVyKQorCSAqLworCWZpbmFsIHB1YmxpYyB2b2lkIHJlbW92ZUJhdGNoTGlzdGVuZXIoZmluYWwgSUJhdGNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guSUJhdGNoI2FkZEJhdGNoTGlzdGVuZXJTeW5jKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5JQmF0Y2hMaXN0ZW5lclN5bmMpCisJICovCisJcHVibGljIHZvaWQgYWRkQmF0Y2hMaXN0ZW5lclN5bmMoSUJhdGNoTGlzdGVuZXJTeW5jIGxpc3RlbmVyKSB7CisJCWlmICghbGlzdGVuZXJzU3luYy5jb250YWlucyhsaXN0ZW5lcikpIHsKKwkJCWxpc3RlbmVyc1N5bmMuYWRkKGxpc3RlbmVyKTsKKwkJfQorCX0gLy8gYWRkQmF0Y2hMaXN0ZW5lclN5bmMKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLklCYXRjaCNyZW1vdmVCYXRjaExpc3RlbmVyU3luYyhvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guSUJhdGNoTGlzdGVuZXJTeW5jKQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUJhdGNoTGlzdGVuZXJTeW5jKElCYXRjaExpc3RlbmVyU3luYyBsaXN0ZW5lcikgeworCQlsaXN0ZW5lcnNTeW5jLnJlbW92ZShsaXN0ZW5lcik7CisJfSAvLyByZW1vdmVCYXRjaExpc3RlbmVyU3luYworCisJLyoqCisJICogVGVsbCB0aGUgbGlzdGVuZXJzIGFib3V0IHRoZSBjaGFuZ2UgaW4gdGhlIHtAbGluayBCYXRjaH0ncyBzdGF0ZQorCSAqIAorCSAqIEBwYXJhbSBiYXRjaFN0YXRlCisJICogICAgICAgICAgICB0aGUgbmV3IHN0YXRlIG9mIHRoZSB7QGxpbmsgQmF0Y2h9CisJICovCisJcHJpdmF0ZSB2b2lkIGZpcmVCYXRjaENoYW5nZWQoZmluYWwgQmF0Y2hTdGF0ZSBiYXRjaFN0YXRlKSB7CisJCWZpbmFsIEJhdGNoRXZlbnQgZXZlbnQgPSBuZXcgQmF0Y2hFdmVudCh0aGlzLCBiYXRjaFN0YXRlKTsKKwkJZm9yIChmaW5hbCBJQmF0Y2hMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgeworCQkJbGlzdGVuZXIuYmF0Y2hDaGFuZ2VkKGV2ZW50KTsKKwkJfSAvLyBmb3IKKworCQlmb3IgKGZpbmFsIElCYXRjaExpc3RlbmVyU3luYyBsaXN0ZW5lciA6IGxpc3RlbmVyc1N5bmMpIHsKKwkJCWxpc3RlbmVyLmJhdGNoQ2hhbmdlZFN5bmMoZXZlbnQpOworCQl9IC8vIGZvcgorCX0gLy8gZmlyZUJhdGNoQ2hhbmdlZAorCisJLyoqCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIlsiKTsKKwkJc2IuYXBwZW5kKGdldFNlcXVlbmNlTnVtYmVyKCkpOworCQlzYi5hcHBlbmQoIl0gIik7CisJCXNiLmFwcGVuZChpc1J1bm5pbmdTaW11bGF0aW9uc1NlcXVlbnRpYWxseSgpID8gIlMvIiA6ICJQLyIpOworCQlzYi5hcHBlbmQoaXNSdW5uaW5nSW5CYWNrZ3JvdW5kKCkgPyAiQiAiIDogIkYgIik7CisJCXNiLmFwcGVuZChnZXRCYXRjaFN0YXRlKCkudG9TdHJpbmcoKSk7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0gLy8gdG9TdHJpbmcKKworfSAvLyBCYXRjaApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYmF0Y2gvQmF0Y2hFdmVudC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYmF0Y2gvQmF0Y2hFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YzZhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9iYXRjaC9CYXRjaEV2ZW50LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLy8gQmF0Y2hFdmVudC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvY2N1cnJlbmNlIG9mIGFuIGV2ZW50IGluIGEge0BsaW5rIEJhdGNofS4KKyAqLworcHVibGljIGNsYXNzIEJhdGNoRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7CisKKwkvKioKKwkgKiBEZWZhdWx0IHNlcmlhbCBpZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCXByaXZhdGUgQmF0Y2hTdGF0ZSBiYXRjaFN0YXRlOworCisJLyoqCisJICogQHBhcmFtIGJhdGNoU3RhdGUKKwkgKiAgICAgICAgICAgIHRoZSBuZXcgc3RhdGUgb2YgYSB7QGxpbmsgSUJhdGNofS4KKwkgKiBAcGFyYW0gYmF0Y2gKKwkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50LgorCSAqLworCXB1YmxpYyBCYXRjaEV2ZW50KGZpbmFsIElCYXRjaCBiYXRjaCwgZmluYWwgQmF0Y2hTdGF0ZSBiYXRjaFN0YXRlKSB7CisJCXN1cGVyKGJhdGNoKTsKKwkJdGhpcy5iYXRjaFN0YXRlID0gYmF0Y2hTdGF0ZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBiYXRjaFN0YXRlCisJICovCisJcHVibGljIGZpbmFsIEJhdGNoU3RhdGUgZ2V0QmF0Y2hTdGF0ZSgpIHsKKwkJcmV0dXJuIGJhdGNoU3RhdGU7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUge0BsaW5rIElCYXRjaH0gdGhhdCBpcyB0aGUgc291cmNlIG9mIHRoZSBldmVudC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgSUJhdGNoIGdldEJhdGNoKCkgeworCQlyZXR1cm4gKElCYXRjaCkgZ2V0U291cmNlKCk7CisJfQorCisJLyoqCisJICogQHNlZSBqYXZhLnV0aWwuRXZlbnRPYmplY3QjdG9TdHJpbmcoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBiYXRjaFN0YXRlLnRvU3RyaW5nKCk7CisJfQorCit9IC8vIEJhdGNoRXZlbnQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2JhdGNoL0JhdGNoTWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYmF0Y2gvQmF0Y2hNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1NDgxZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2JhdGNoL0JhdGNoTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNjc3IEBACisvLyBCYXRjaE1hbmFnZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2g7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uRXhlY3V0YWJsZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBjZW50cmFsaXplZCBtYW5hZ2VyIGZvciBydW5uaW5nIHtAbGluayBFeHBlcmltZW50fXMKKyAqIGluICJiYXRjaCBtb2RlIi4gVGhlIGlkZWEgb2YgYmF0Y2ggbW9kZSBpcyB0aGF0IGEge0BsaW5rIFNjZW5hcmlvfSByZWZlcmVuY2VkCisgKiBieSBhbiB7QGxpbmsgRXhwZXJpbWVudH0gY2FuIGJlIHVzZWQgYXMgYSBiYXNlIGZyb20gd2hpY2ggYSBjb2xsZWN0aW9uIG9mCisgKiBvdGhlciB7QGxpbmsgU2NlbmFyaW99cyBjYW4gYmUgZGVyaXZlZC4gVGhlc2UgZGVyaXZlZCB7QGxpbmsgU2NlbmFyaW99cworICogZGlmZmVyIGZyb20gdGhlIGJhc2UgaW4gc29tZSAodXN1YWxseSkgbWlub3IgdmFyaWF0aW9uIG9mIG9uZSBvciBtb3JlIG9mIHRoZQorICogYmFzZSdzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKyAqIDxwPgorICogVGhlIG1hbmFnZXIgY29udHJvbHMgdGhlIGNyZWF0aW9uIG9mIHRoZSBkZXJpdmVkIHtAbGluayBTY2VuYXJpb31zIGZyb20KKyAqIHNwZWNpZmljYXRpb25zIHByb3ZpZGVkIGJ5IGEgdXNlciwgYW5kIHRoZW4sIHRoZWlyIHN1YnNlcXVlbnQgZXhlY3V0aW9uIGFzCisgKiB7QGxpbmsgU2ltdWxhdGlvbn1zLgorICogCisgKiBAc2VlIEJhdGNoCisgKiBAc2VlIEV4cGVyaW1lbnQKKyAqIEBzZWUgTW9kaWZpZXIKKyAqLworcHVibGljIGNsYXNzIEJhdGNoTWFuYWdlciBleHRlbmRzIEV4ZWN1dGFibGVNYW5hZ2VyIGltcGxlbWVudHMgSUJhdGNoTGlzdGVuZXIgeworCisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUge0BsaW5rIEJhdGNoTWFuYWdlcn0uCisJICovCisJcHVibGljIHN0YXRpYyBCYXRjaE1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgQmF0Y2hNYW5hZ2VyKCk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzZXF1ZW5jZSBudW1iZXIgYXNzaWduZWQgdG8gZWFjaCBzdWNjZXNzaXZlIHtAbGluayBCYXRjaH0KKwkgKiBpbnN0YW5jZSB0aGUgbWFuYWdlciBjcmVhdGVzLgorCSAqLworCXN0YXRpYyBwcml2YXRlIGludCBzZXF1ZW5jZU51bWJlciA9IDA7CisKKwkvKioKKwkgKiBDb25zdGFudCBlbXB0eSBhcnJheSBvZiB7QGxpbmsgQmF0Y2h9cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElCYXRjaFtdIE5PTkUgPSBuZXcgQmF0Y2hbXSB7fTsKKworCS8qKgorCSAqIFRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBJQmF0Y2hNYW5hZ2VyTGlzdGVuZXJ9J3Mgd2FpdGluZyB0byBiZSB0b2xkCisJICogYWJvdXQge0BsaW5rIEJhdGNoTWFuYWdlckV2ZW50fSdzCisJICovCisJcHJpdmF0ZSBmaW5hbCBMaXN0PElCYXRjaE1hbmFnZXJMaXN0ZW5lcj4gbGlzdGVuZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PElCYXRjaE1hbmFnZXJMaXN0ZW5lcj4oKTsKKworCS8qKgorCSAqIFRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBJQmF0Y2hNYW5hZ2VyTGlzdGVuZXJTeW5jfSdzIHdhaXRpbmcgdG8gYmUgdG9sZAorCSAqIGFib3V0IHtAbGluayBCYXRjaE1hbmFnZXJFdmVudH0ncworCSAqLworCXByaXZhdGUgZmluYWwgTGlzdDxJQmF0Y2hNYW5hZ2VyTGlzdGVuZXJTeW5jPiBsaXN0ZW5lcnNTeW5jID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PElCYXRjaE1hbmFnZXJMaXN0ZW5lclN5bmM+KCk7CisKKwkvKioKKwkgKiBUaGUge0BsaW5rIFNldH0gb2Yge0BsaW5rIEJhdGNofXMgYmVpbmcgbWFuYWdlZC4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIExpc3Q8SUJhdGNoPiBiYXRjaGVzID0gbmV3IEFycmF5TGlzdDxJQmF0Y2g+KCk7CisKKwkvKioKKwkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHNvIHRoYXQgaW5zdGFuY2VzIG9mIHRoZSB7QGxpbmsgQmF0Y2hNYW5hZ2VyfSBjYW5ub3QKKwkgKiBiZSBjcmVhdGVkIGV4dGVybmFsbHkuCisJICovCisJcHJpdmF0ZSBCYXRjaE1hbmFnZXIoKSB7CisJCS8vIG5vdGhpbmcKKwl9IC8vIEJhdGNoTWFuYWdlcgorCisJLyoqCisJICogQHJldHVybiB0aGUgbmV4dCB7QGxpbmsgQmF0Y2h9IHNlcXVlbmNlIG51bWJlciBhbmQgaW5jcmVtZW50IHRoZSB2YWx1ZS4KKwkgKi8KKwlzeW5jaHJvbml6ZWQgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGdldEFuZEluY3JlbWVudEJhdGNoU2VxdWVuY2VOdW1iZXIoKSB7CisJCXJldHVybiBzZXF1ZW5jZU51bWJlcisrOworCX0gLy8gZ2V0QW5kSW5jcmVtZW50QmF0Y2hTZXF1ZW5jZU51bWJlcgorCisJLyoqCisJICogQHJldHVybiB0aGUge0BsaW5rIExpc3R9IG9mIHtAbGluayBCYXRjaH1zIGJlaW5nIG1hbmFnZWQuCisJICovCisJcHVibGljIExpc3Q8SUJhdGNoPiBnZXRBY3RpdmVCYXRjaGVzKCkgeworCQlyZXR1cm4gYmF0Y2hlczsKKwl9IC8vIGdldEFjdGl2ZUJhdGNoZXMKKworCS8qKgorCSAqIEFkZCBhIG5ldyB7QGxpbmsgQmF0Y2h9IHRvIHRoZSBtYW5hZ2VyJ3MgY29sbGVjdGlvbiBhbmQgbm90aWZ5IGFueQorCSAqIGxpc3RlbmVycyBvZiB0aGUgYWRkaXRpb24uCisJICovCisJcHJpdmF0ZSB2b2lkIGFkZEFjdGl2ZUJhdGNoKGZpbmFsIElCYXRjaCBiYXRjaCkgeworCQliYXRjaGVzLmFkZChiYXRjaCk7CisJCWJhdGNoLmFkZEJhdGNoTGlzdGVuZXIodGhpcyk7CisJCWZpcmVCYXRjaE1hbmFnZXJDaGFuZ2VkKG5ldyBJQmF0Y2hbXSB7IGJhdGNoIH0sIE5PTkUpOworCX0gLy8gYWRkQWN0aXZlQmF0Y2gKKworCS8qKgorCSAqIFJlbW92ZSBhbiB7QGxpbmsgSUJhdGNofSBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGFjdGl2ZSB7QGxpbmsgSUJhdGNofXMuCisJICogCisJICogQHBhcmFtIHNpbXVsYXRpb24KKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgSUJhdGNofSB0byByZW1vdmUKKwkgKi8KKwlwcml2YXRlIGZpbmFsIHZvaWQgcmVtb3ZlQWN0aXZlQmF0Y2goZmluYWwgSUJhdGNoIGJhdGNoKSB7CisJCWJhdGNoZXMucmVtb3ZlKGJhdGNoKTsKKwkJLy8gV2UncmUgbm8gbG9uZ2VyIGEgbGlzdGVuZXIKKwkJYmF0Y2gucmVtb3ZlQmF0Y2hMaXN0ZW5lcih0aGlzKTsKKwkJZmlyZUJhdGNoTWFuYWdlckNoYW5nZWQoTk9ORSwgbmV3IElCYXRjaFtdIHsgYmF0Y2ggfSk7CisJfSAvLyByZW1vdmVBY3RpdmVCYXRjaAorCisJLyoqCisJICogQ3JlYXRlIGEge0BsaW5rIElCYXRjaH0gdGhhdCdzIHJlYWR5IHRvIHJ1bgorCSAqIAorCSAqIEBwYXJhbSBleHBlcmltZW50CisJICogICAgICAgICAgICB0aGUge0BsaW5rIEV4cGVyaW1lbnR9IHRoYXQgaXMgdGhlIGJhc2lzIGZvciB0aGUge0BsaW5rIEJhdGNofQorCSAqIEByZXR1cm4gYW4ge0BsaW5rIElCYXRjaH0gZnJvbSB0aGUge0BsaW5rIEV4cGVyaW1lbnR9CisJICovCisJcHVibGljIElCYXRjaCBjcmVhdGVCYXRjaChmaW5hbCBFeHBlcmltZW50IGV4cGVyaW1lbnQpIHsKKwkJZmluYWwgQmF0Y2ggYmF0Y2ggPSBuZXcgQmF0Y2goZXhwZXJpbWVudCwKKwkJCQlnZXRBbmRJbmNyZW1lbnRCYXRjaFNlcXVlbmNlTnVtYmVyKCkpOworCQliYXRjaC5zZXRQcmlvcml0eShKb2IuTE9ORyk7CisJCWZpbmFsIElCYXRjaCByZXRWYWx1ZSA9IG5ldyBCYXRjaEFkYXB0ZXIoYmF0Y2gpOworCQlhZGRBY3RpdmVCYXRjaChyZXRWYWx1ZSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUJhdGNoCisKKwkvKioKKwkgKiBAcGFyYW0gY29uZmlndXJhdGlvbkVsZW1lbnQKKwkgKiBAcGFyYW0gbW9uaXRvcgorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgSUJhdGNoIGNyZWF0ZUJhdGNoKAorCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50LAorCQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCUlCYXRjaCByZXRWYWx1ZSA9IG51bGw7CisKKwkJZmluYWwgU3RyaW5nIGV4cGVyaW1lbnRVUklTdHJpbmcgPSBjb25maWd1cmF0aW9uRWxlbWVudAorCQkJCS5nZXRBdHRyaWJ1dGUoRHVibGluQ29yZS5JREVOVElGSUVSKTsKKwkJdHJ5IHsKKwkJCXJldFZhbHVlID0gY3JlYXRlQmF0Y2goVVJJLmNyZWF0ZVVSSShleHBlcmltZW50VVJJU3RyaW5nKSwgbW9uaXRvcik7CisJCX0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisJCQlBY3RpdmF0b3IKKwkJCQkJLmxvZ0Vycm9yKAorCQkJCQkJCU1lc3NhZ2VGb3JtYXQKKwkJCQkJCQkJCS5mb3JtYXQoCisJCQkJCQkJCQkJCU1lc3NhZ2VzCisJCQkJCQkJCQkJCQkJLmdldFN0cmluZygiQmF0Y2hNZ3IuRGVzZXJpYWxpemF0aW9uX0Vycm9yIiksIGV4cGVyaW1lbnRVUklTdHJpbmcpLCBlKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0VmFsdWUgPSBudWxsOworCQl9CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUJhdGNoCisKKwkvKioKKwkgKiBAcGFyYW0gZXhwZXJpbWVudFVSSQorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBVUkl9IG9mIGEgc2VyaWFsaXplZCB7QGxpbmsgRXhwZXJpbWVudH0KKwkgKiBAcGFyYW0gbW9uaXRvcgorCSAqICAgICAgICAgICAgYSB7QGxpbmsgUHJvZ3Jlc3NNb25pdG9yfQorCSAqIEByZXR1cm4gYW4ge0BsaW5rIElCYXRjaH0gZGVzZXJpYWxpemVkIGZyb20gdGhlIHNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoZQorCSAqICAgICAgICAgZXhwZXJpbWVudFVSSSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbS4KKwkgKi8KKwlwcml2YXRlIElCYXRjaCBjcmVhdGVCYXRjaChmaW5hbCBVUkkgZXhwZXJpbWVudFVSSSwKKwkJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlJQmF0Y2ggcmV0VmFsdWUgPSBudWxsOworCQl0cnkgeworCQkJZmluYWwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7CisJCQlmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKGV4cGVyaW1lbnRVUkksCisJCQkJCXRydWUpOworCQkJbW9uaXRvci5zdWJUYXNrKCJSZWFkaW5nIEV4cGVyaW1lbnQgZnJvbSBmaWxlIik7CisJCQlyZXNvdXJjZS5sb2FkKG51bGwpOworCQkJbW9uaXRvci5zdWJUYXNrKCJDcmVhdGluZyBCYXRjaCBmcm9tIEV4cGVyaW1lbnQiKTsKKwkJCXJldFZhbHVlID0gY3JlYXRlQmF0Y2goKEV4cGVyaW1lbnQpIHJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApKTsKKwkJfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKwkJCUFjdGl2YXRvcgorCQkJCQkubG9nRXJyb3IoCisJCQkJCQkJTWVzc2FnZUZvcm1hdAorCQkJCQkJCQkJLmZvcm1hdCgKKwkJCQkJCQkJCQkJTWVzc2FnZXMKKwkJCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJCYXRjaE1nci5EZXNlcmlhbGl6YXRpb25fRXJyb3IiKSwgZXhwZXJpbWVudFVSSS50b1N0cmluZygpKSwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldFZhbHVlID0gbnVsbDsKKwkJfQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVCYXRjaAorCisJLyoqCisJICogQ3JlYXRlIGEge0BsaW5rIElCYXRjaH0gZnJvbSBhbiB7QGxpbmsgRXhwZXJpbWVudH0gaW5zdGFuY2UgYW5kIHRoZW4KKwkgKiBzdGFydCBpdCBydW5uaW5nLgorCSAqIAorCSAqIEBwYXJhbSBleHBlcmltZW50CisJICogICAgICAgICAgICB0aGUge0BsaW5rIEV4cGVyaW1lbnR9IHRvIGJlIHJ1bgorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUFuZFJ1bkJhdGNoKGZpbmFsIEV4cGVyaW1lbnQgZXhwZXJpbWVudCkgeworCQluZXcgSm9iKE1lc3NhZ2VzLmdldFN0cmluZygiQmF0Y2hNZ3IuU3RhcnRCYXRjaCIpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQl0cnkgeworCQkJCQlmaW5hbCBJQmF0Y2ggYmF0Y2ggPSBjcmVhdGVCYXRjaChleHBlcmltZW50KTsKKwkJCQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLmdldFN0cmluZygiQmF0Y2hNZ3IuUnVuIikpOworCQkJCQliYXRjaC5ydW4oKTsKKwkJCQl9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworCQkJCQkvLyBUaGUgZXJyb3Igd2FzIGxvZ2dlZCBpbiBjcmVhdGVCYXRjaAorCQkJCQltb25pdG9yLmRvbmUoKTsKKwkJCQl9IC8vIGNhdGNoIEV4Y2VwdGlvbgorCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQkJfSAvLyBydW4KKwkJfS5zY2hlZHVsZSgpOworCX0gLy8gY3JlYXRlQW5kUnVuQmF0Y2gKKworCS8qKgorCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uRWxlbWVudAorCSAqICAgICAgICAgICAgYSB7QGxpbmsgSUNvbmZpZ3VyYXRpb25FbGVtZW50fSB0aGF0IHNwZWNpZmllcyB0aGUgZGV0YWlscyBhbmQKKwkgKiAgICAgICAgICAgIHNlcmlhbGl6ZWQgbG9jYXRpb24gb2YgYW4ge0BsaW5rIEV4cGVyaW1lbnR9IHRvIHNpbXVsYXRlLgorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUFuZFJ1bkJhdGNoKAorCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50KSB7CisJCW5ldyBKb2IoTWVzc2FnZXMuZ2V0U3RyaW5nKCJCYXRjaE1nci5TdGFydEJhdGNoIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuZ2V0U3RyaW5nKCJCYXRjaE1nci5DcnRTaW0iKSwKKwkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7CisJCQkJdHJ5IHsKKwkJCQkJZmluYWwgSUJhdGNoIGJhdGNoID0gY3JlYXRlQmF0Y2goY29uZmlndXJhdGlvbkVsZW1lbnQsCisJCQkJCQkJbW9uaXRvcik7CisJCQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5nZXRTdHJpbmcoIkJhdGNoTWdyLlJ1biIpKTsKKwkJCQkJYmF0Y2gucnVuKCk7CisJCQkJfSAvLyB0cnkKKwkJCQljYXRjaCAoZmluYWwgTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworCQkJCQkvLyBUaGUgZXJyb3Igd2FzIGxvZ2dlZCBpbiBjcmVhdGVCYXRjaAorCQkJCQltb25pdG9yLmRvbmUoKTsKKwkJCQl9CisJCQkJbW9uaXRvci5kb25lKCk7CisJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCQl9IC8vIHJ1bgorCQl9LnNjaGVkdWxlKCk7CisJfSAvLyBjcmVhdGVBbmRSdW5CYXRjaAorCisJLyoqCisJICogQHJldHVybiB0aGUgY3VycmVudCBiYXRjaCBzZXF1ZW5jZSBudW1iZXIKKwkgKi8KKwlwdWJsaWMgZmluYWwgaW50IGdldFNlcXVlbmNlTnVtYmVyKCkgeworCQlyZXR1cm4gc2VxdWVuY2VOdW1iZXI7CisJfSAvLyBnZXRTZXF1ZW5jZU51bWJlcgorCisJLyoqCisJICogQHBhcmFtIGxpc3RlbmVyCisJICogICAgICAgICAgICBhIGxpc3RlbmVyIHdhbnRpbmcgdG8gYmUgdG9sZCBhYm91dCBjaGFuZ2VzIHRvIHRoZSBtYW5hZ2VyLgorCSAqLworCXB1YmxpYyB2b2lkIGFkZEJhdGNoTWFuYWdlckxpc3RlbmVyKGZpbmFsIElCYXRjaE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKKwkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCQl9CisJfSAvLyBhZGRCYXRjaE1hbmFnZXJMaXN0ZW5lcgorCisJLyoqCisJICogQHBhcmFtIGxpc3RlbmVyU3luYworCSAqICAgICAgICAgICAgYSBsaXN0ZW5lciB3YW50aW5nIHRvIGJlIHRvbGQgYWJvdXQgY2hhbmdlcyB0byB0aGUgbWFuYWdlci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRCYXRjaE1hbmFnZXJMaXN0ZW5lclN5bmMoCisJCQlmaW5hbCBJQmF0Y2hNYW5hZ2VyTGlzdGVuZXJTeW5jIGxpc3RlbmVyU3luYykgeworCQlpZiAoIWxpc3RlbmVyc1N5bmMuY29udGFpbnMobGlzdGVuZXJTeW5jKSkgeworCQkJbGlzdGVuZXJzU3luYy5hZGQobGlzdGVuZXJTeW5jKTsKKwkJfQorCX0gLy8gYWRkQmF0Y2hNYW5hZ2VyTGlzdGVuZXJTeW5jCisKKwkvKioKKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKiAgICAgICAgICAgIGEgbGlzdGVuZXIgTk9UIHdhbnRpbmcgdG8gYmUgdG9sZCBhYm91dCBjaGFuZ2VzIHRvIHRoZQorCSAqICAgICAgICAgICAgbWFuYWdlci4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihmaW5hbCBJQmF0Y2hNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfSAvLyByZW1vdmVMaXN0ZW5lcgorCisJLyoqCisJICogQHBhcmFtIGxpc3RlbmVyU3luYworCSAqICAgICAgICAgICAgYSBsaXN0ZW5lciBOT1Qgd2FudGluZyB0byBiZSB0b2xkIGFib3V0IGNoYW5nZXMgdG8gdGhlCisJICogICAgICAgICAgICBtYW5hZ2VyLgorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyU3luYyhmaW5hbCBJQmF0Y2hNYW5hZ2VyTGlzdGVuZXJTeW5jIGxpc3RlbmVyU3luYykgeworCQlsaXN0ZW5lcnNTeW5jLnJlbW92ZShsaXN0ZW5lclN5bmMpOworCX0gLy8gcmVtb3ZlTGlzdGVuZXJTeW5jCisKKwkvKioKKwkgKiBUZWxsIHRoZSBsaXN0ZW5lcnMgYWJvdXQgdGhlIGNoYW5nZS4KKwkgKiAKKwkgKiBAcGFyYW0gYmF0Y2hlc0FkZGVkCisJICogICAgICAgICAgICB0aGUge0BsaW5rIEJhdGNofXMgYWRkZWQKKwkgKiBAcGFyYW0gYmF0Y2hlc1JlbW92ZWQKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgQmF0Y2h9cyByZW1vdmVkCisJICovCisJcHJpdmF0ZSB2b2lkIGZpcmVCYXRjaE1hbmFnZXJDaGFuZ2VkKGZpbmFsIElCYXRjaFtdIGJhdGNoZXNBZGRlZCwKKwkJCWZpbmFsIElCYXRjaFtdIGJhdGNoZXNSZW1vdmVkKSB7CisJCWZpbmFsIEJhdGNoTWFuYWdlckV2ZW50IGV2ZW50ID0gbmV3IEJhdGNoTWFuYWdlckV2ZW50KHRoaXMsCisJCQkJYmF0Y2hlc0FkZGVkLCBiYXRjaGVzUmVtb3ZlZCk7CisKKwkJLy8gSW5mb3JtIHRoZSBhc3luY2hyb25vdXMgbGlzdGVuZXJzCisJCWZvciAoZmluYWwgSUJhdGNoTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7CisJCQl0cnkgeworCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCWxpc3RlbmVyLmJhdGNoZXNDaGFuZ2VkKGV2ZW50KTsKKwkJCQkJfQorCQkJCX0pOworCQkJfSBjYXRjaCAoZmluYWwgRXJyb3IgbmNkZmUpIHsKKwkJCQkvLyBJZiB3ZSBnZXQgdGhpcyBleGNlcHRpb24sIGl0IGlzIGJlY2F1c2Ugd2UncmUgbm90IHJ1bm5pbmcgaW4KKwkJCQkvLyBlY2xpcHNlLiBKdXN0IGZpcmUgdGhlIGV2ZW50LgorCQkJCWxpc3RlbmVyLmJhdGNoZXNDaGFuZ2VkKGV2ZW50KTsKKwkJCX0gLy8gY2F0Y2gKKwkJfSAvLyBmb3IKKworCQkvLyBOb3cgaW5mb3JtIHRoZSBzeW5jaHJvbml6ZWQgbGlzdGVuZXJzCisJCWZvciAoZmluYWwgSUJhdGNoTWFuYWdlckxpc3RlbmVyU3luYyBsaXN0ZW5lclN5bmMgOiBsaXN0ZW5lcnNTeW5jKSB7CisJCQl0cnkgeworCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJbGlzdGVuZXJTeW5jLmJhdGNoZXNDaGFuZ2VkU3luYyhldmVudCk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0gY2F0Y2ggKGZpbmFsIEVycm9yIG5jZGZlKSB7CisJCQkJLy8gSWYgd2UgZ2V0IHRoaXMgZXhjZXB0aW9uLCBpdCBpcyBiZWNhdXNlIHdlJ3JlIG5vdCBydW5uaW5nIGluCisJCQkJLy8gZWNsaXBzZS4gSnVzdCBmaXJlIHRoZSBldmVudC4KKwkJCQlsaXN0ZW5lclN5bmMuYmF0Y2hlc0NoYW5nZWRTeW5jKGV2ZW50KTsKKwkJCX0gLy8gY2F0Y2gKKwkJfSAvLyBmb3IKKworCX0gLy8gZmlyZUJhdGNoTWFuYWdlckNoYW5nZWQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLklCYXRjaExpc3RlbmVyI2JhdGNoQ2hhbmdlZChvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guQmF0Y2hFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBiYXRjaENoYW5nZWQoZmluYWwgQmF0Y2hFdmVudCBldmVudCkgeworCQkvLyBIYXMgYSBiYXRjaCBzdG9wcGVkPworCQlpZiAoZXZlbnQuZ2V0QmF0Y2hTdGF0ZSgpLmVxdWFscyhCYXRjaFN0YXRlLlNUT1BQRUQpKSB7CisJCQkvLyBZZXMKKwkJCXJlbW92ZUFjdGl2ZUJhdGNoKGV2ZW50LmdldEJhdGNoKCkpOworCQl9CisJfSAvLyBiYXRjaENoYW5nZWQKKworCS8qKgorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWZvciAoZmluYWwgSUJhdGNoIGJhdGNoIDogYmF0Y2hlcykgeworCQkJc2IuYXBwZW5kKGJhdGNoLnRvU3RyaW5nKCkpOworCQkJc2IuYXBwZW5kKCJcbiIpOworCQl9IC8vIGZvciBlYWNoIEJhdGNoCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0gLy8gdG9TdHJpbmcKKworCS8qKgorCSAqIERpc2NhcmQgdGhlIGN1cnJlbnQge0BsaW5rIEJhdGNoTWFuYWdlcn0gYW5kIHJlcGxhY2UgaXQgd2l0aCBhIG5ld2x5CisJICogYWxsb2NhdGVkIG9uZS4gVGhpcyBtZXRob2QgaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgSlVuaXQgdGVzdAorCSAqIGNhc2VzIHRoYXQgbmVlZCBhIHtAbGluayBCYXRjaE1hbmFnZXJ9IHdpdGggYSBrbm93biBpbml0aWFsIHN0YXRlLgorCSAqLworCXN0YXRpYyB2b2lkIHJlc2V0QmF0Y2hNYW5hZ2VyKCkgeworCQlJTlNUQU5DRSA9IG5ldyBCYXRjaE1hbmFnZXIoKTsKKwl9IC8vIHJlc2V0QmF0Y2hNYW5hZ2VyCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGFkYXB0cyBhIHtAbGluayBCYXRjaH0gaW5zdGFuY2UgdGhhdCBydW5zIGFzIGFuIGFzeW5jaHJvbm91cworCSAqIEVjbGlwc2Uge0BsaW5rIEpvYn0gdG8gYmUgYW4ge0BsaW5rIElCYXRjaH0gaW5zdGFuY2UuIFRoZSBhZGFwdGVyIG1hbmFnZXMKKwkgKiB0aHJlYWQgc2FmZXR5IGlzc3VlcyBzbyB0aGF0IHRoZSBVSSB0aHJlYWQgY2FuIGFjY2VzcyB0aGUge0BsaW5rIElCYXRjaH0KKwkgKiBpbnN0YW5jZSBkaXJlY3RseS4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEJhdGNoQWRhcHRlciBpbXBsZW1lbnRzIElCYXRjaCwgSUJhdGNoTGlzdGVuZXIsCisJCQlJQmF0Y2hMaXN0ZW5lclN5bmMgeworCisJCS8qKgorCQkgKiBUaGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgSUJhdGNoTGlzdGVuZXJ9J3Mgd2FpdGluZyB0byBiZSB0b2xkIGFib3V0CisJCSAqIHtAbGluayBCYXRjaEV2ZW50fXMuCisJCSAqLworCQlwcml2YXRlIGZpbmFsIExpc3Q8SUJhdGNoTGlzdGVuZXI+IGxpc3RlbmVycyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxJQmF0Y2hMaXN0ZW5lcj4oKTsKKworCQkvKioKKwkJICogVGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIElCYXRjaExpc3RlbmVyU3luY30ncyB3YWl0aW5nIHRvIGJlIHRvbGQKKwkJICogYWJvdXQge0BsaW5rIEJhdGNoRXZlbnR9cy4KKwkJICovCisJCXByaXZhdGUgZmluYWwgTGlzdDxJQmF0Y2hMaXN0ZW5lclN5bmM+IGxpc3RlbmVyc1N5bmMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8SUJhdGNoTGlzdGVuZXJTeW5jPigpOworCisJCS8qKgorCQkgKiBUaGUge0BsaW5rIEJhdGNofSBpbnN0YW5jZSB0byBhZGFwdC4gVGhpcyB3aWxsIGJlIGFuIGluc3RhbmNlIG9mCisJCSAqIHtAbGluayBCYXRjaH0gd2hpY2ggaXMgYWxzbyBhbiBlY2xpcHNlIHtAbGluayBKb2J9IGFuZCBydW5zCisJCSAqIGFzeW5jaHJvbm91c2x5IGZyb20gdGhlIFVJIHRocmVhZCBvZiBlY2xpcHNlLiBUaGlzIGFkYXB0ZXIgcmVnaXN0ZXJzCisJCSAqIGFzIGEgbGlzdGVuZXIgb2YgYWRhcHRlZCB7QGxpbmsgQmF0Y2h9IGFuZCBzYWZlbHkgcGFzc2VzCisJCSAqIHtAbGluayBCYXRjaEV2ZW50fSdzIG9uIHRvIGxpc3RlbmVycyBpbiB0aGUgVUkgb3Igb3RoZXIgdGhyZWFkcy4KKwkJICovCisJCXByaXZhdGUgZmluYWwgSUJhdGNoIGJhdGNoOworCisJCS8qKgorCQkgKiBDb25zdHJ1Y3RvcgorCQkgKiAKKwkJICogQHBhcmFtIGJhdGNoCisJCSAqICAgICAgICAgICAgdGhlIHtAbGluayBCYXRjaH0gdG8gYWRhcHQKKwkJICovCisJCXByb3RlY3RlZCBCYXRjaEFkYXB0ZXIoZmluYWwgSUJhdGNoIGJhdGNoKSB7CisJCQl0aGlzLmJhdGNoID0gYmF0Y2g7CisJCQliYXRjaC5hZGRCYXRjaExpc3RlbmVyKHRoaXMpOworCQkJYmF0Y2guYWRkQmF0Y2hMaXN0ZW5lclN5bmModGhpcyk7CisJCX0gLy8gQmF0Y2hBZGFwdGVyCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLklCYXRjaCNnZXROYW1lKCkKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCXJldHVybiBiYXRjaC5nZXROYW1lKCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guSUJhdGNoI2dldE5hbWVXaXRoU2VxdWVuY2VOdW1iZXIoKQorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXROYW1lV2l0aFNlcXVlbmNlTnVtYmVyKCkgeworCQkJcmV0dXJuIGJhdGNoLmdldE5hbWVXaXRoU2VxdWVuY2VOdW1iZXIoKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5JQmF0Y2gjZ2V0RXhwZXJpbWVudCgpCisJCSAqLworCQlwdWJsaWMgRXhwZXJpbWVudCBnZXRFeHBlcmltZW50KCkgeworCQkJcmV0dXJuIGJhdGNoLmdldEV4cGVyaW1lbnQoKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUjZ2V0Q3JlYXRpb25UaW1lKCkKKwkJICovCisJCXB1YmxpYyBEYXRlIGdldENyZWF0aW9uVGltZSgpIHsKKwkJCXJldHVybiBiYXRjaC5nZXRDcmVhdGlvblRpbWUoKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUjZ2V0VW5pcXVlSURTdHJpbmcoKQorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJRFN0cmluZygpIHsKKwkJCXJldHVybiBiYXRjaC5nZXRVbmlxdWVJRFN0cmluZygpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLklCYXRjaCNnZXRCYXRjaFN0YXRlKCkKKwkJICovCisJCXB1YmxpYyBCYXRjaFN0YXRlIGdldEJhdGNoU3RhdGUoKSB7CisJCQlyZXR1cm4gYmF0Y2guZ2V0QmF0Y2hTdGF0ZSgpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLklCYXRjaCNnZXRTZXF1ZW5jZU51bWJlcigpCisJCSAqLworCQlwdWJsaWMgaW50IGdldFNlcXVlbmNlTnVtYmVyKCkgeworCQkJcmV0dXJuIGJhdGNoLmdldFNlcXVlbmNlTnVtYmVyKCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guSUJhdGNoI2lzUnVubmluZ0luQmFja2dyb3VuZCgpCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmdJbkJhY2tncm91bmQoKSB7CisJCQlyZXR1cm4gYmF0Y2guaXNSdW5uaW5nSW5CYWNrZ3JvdW5kKCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guSUJhdGNoI2lzUnVubmluZ1NpbXVsYXRpb25zU2VxdWVudGlhbGx5KCkKKwkJICovCisJCXB1YmxpYyBib29sZWFuIGlzUnVubmluZ1NpbXVsYXRpb25zU2VxdWVudGlhbGx5KCkgeworCQkJcmV0dXJuIGJhdGNoLmlzUnVubmluZ1NpbXVsYXRpb25zU2VxdWVudGlhbGx5KCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guSUJhdGNoI3NldFJ1bm5pbmdJbkJhY2tncm91bmQoYm9vbGVhbikKKwkJICovCisJCXB1YmxpYyB2b2lkIHNldFJ1bm5pbmdJbkJhY2tncm91bmQoZmluYWwgYm9vbGVhbiBydW5uaW5nSW5CYWNrZ3JvdW5kKSB7CisJCQliYXRjaC5zZXRSdW5uaW5nSW5CYWNrZ3JvdW5kKHJ1bm5pbmdJbkJhY2tncm91bmQpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLklCYXRjaCNzZXRSdW5uaW5nU2ltdWxhdGlvbnNTZXF1ZW50aWFsbHkoYm9vbGVhbikKKwkJICovCisJCXB1YmxpYyB2b2lkIHNldFJ1bm5pbmdTaW11bGF0aW9uc1NlcXVlbnRpYWxseSgKKwkJCQlmaW5hbCBib29sZWFuIHJ1bm5pbmdTaW11bGF0aW9uc1NlcXVlbnRpYWxseSkgeworCQkJYmF0Y2gKKwkJCQkJLnNldFJ1bm5pbmdTaW11bGF0aW9uc1NlcXVlbnRpYWxseShydW5uaW5nU2ltdWxhdGlvbnNTZXF1ZW50aWFsbHkpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLklCYXRjaCNydW4oKQorCQkgKi8KKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJYmF0Y2gucnVuKCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlI3BhdXNlKCkKKwkJICovCisJCXB1YmxpYyB2b2lkIHBhdXNlKCkgeworCQkJYmF0Y2gucGF1c2UoKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUjc3RlcCgpCisJCSAqLworCQlwdWJsaWMgdm9pZCBzdGVwKCkgeworCQkJYmF0Y2guc3RlcCgpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZSNyZXNldCgpCisJCSAqLworCQlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJCWJhdGNoLnJlc2V0KCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guSUJhdGNoI3N0b3AoKQorCQkgKi8KKwkJcHVibGljIHZvaWQgc3RvcCgpIHsKKwkJCWJhdGNoLnN0b3AoKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUjaXNSdW5uaW5nKCkKKwkJICovCisJCXB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKKwkJCXJldHVybiBiYXRjaC5pc1J1bm5pbmcoKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUjaXNTdG9wcGFibGUoKQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaXNTdG9wcGFibGUoKSB7CisJCQlyZXR1cm4gYmF0Y2guaXNTdG9wcGFibGUoKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5JQmF0Y2gjY2FuY2VsKCkKKwkJICovCisJCXB1YmxpYyBib29sZWFuIGNhbmNlbCgpIHsKKwkJCXJldHVybiBiYXRjaC5jYW5jZWwoKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5JQmF0Y2gjYWRkQmF0Y2hMaXN0ZW5lcihvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guSUJhdGNoTGlzdGVuZXIpCisJCSAqLworCQlwdWJsaWMgdm9pZCBhZGRCYXRjaExpc3RlbmVyKGZpbmFsIElCYXRjaExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKKwkJCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwkJCX0KKwkJfSAvLyBhZGRCYXRjaExpc3RlbmVyCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLklCYXRjaCNyZW1vdmVCYXRjaExpc3RlbmVyKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5JQmF0Y2hMaXN0ZW5lcikKKwkJICovCisJCXB1YmxpYyB2b2lkIHJlbW92ZUJhdGNoTGlzdGVuZXIoZmluYWwgSUJhdGNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCQl9IC8vIHJlbW92ZUJhdGNoTGlzdGVuZXIKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guSUJhdGNoI2FkZEJhdGNoTGlzdGVuZXJTeW5jKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5JQmF0Y2hMaXN0ZW5lclN5bmMpCisJCSAqLworCQlwdWJsaWMgdm9pZCBhZGRCYXRjaExpc3RlbmVyU3luYyhmaW5hbCBJQmF0Y2hMaXN0ZW5lclN5bmMgbGlzdGVuZXIpIHsKKwkJCWlmICghbGlzdGVuZXJzU3luYy5jb250YWlucyhsaXN0ZW5lcikpIHsKKwkJCQlsaXN0ZW5lcnNTeW5jLmFkZChsaXN0ZW5lcik7CisJCQl9CisJCX0gLy8gYWRkQmF0Y2hMaXN0ZW5lclN5bmMKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guSUJhdGNoI3JlbW92ZUJhdGNoTGlzdGVuZXJTeW5jKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5JQmF0Y2hMaXN0ZW5lclN5bmMpCisJCSAqLworCQlwdWJsaWMgdm9pZCByZW1vdmVCYXRjaExpc3RlbmVyU3luYyhmaW5hbCBJQmF0Y2hMaXN0ZW5lclN5bmMgbGlzdGVuZXIpIHsKKwkJCWxpc3RlbmVyc1N5bmMucmVtb3ZlKGxpc3RlbmVyKTsKKwkJfSAvLyByZW1vdmVCYXRjaExpc3RlbmVyU3luYworCisJCS8qKgorCQkgKiBUZWxsIHRoZSBsaXN0ZW5lcnMgYWJvdXQgdGhlIGNoYW5nZSBpbiB0aGUge0BsaW5rIEJhdGNofSdzIHN0YXRlCisJCSAqIAorCQkgKiBAcGFyYW0gYmF0Y2hTdGF0ZQorCQkgKiAgICAgICAgICAgIHRoZSBuZXcgc3RhdGUgb2YgdGhlIHtAbGluayBCYXRjaH0KKwkJICovCisJCXByb3RlY3RlZCB2b2lkIGZpcmVCYXRjaENoYW5nZWQoZmluYWwgQmF0Y2hTdGF0ZSBiYXRjaFN0YXRlKSB7CisJCQlmaW5hbCBCYXRjaEV2ZW50IGV2ZW50ID0gbmV3IEJhdGNoRXZlbnQodGhpcywgYmF0Y2hTdGF0ZSk7CisJCQlmb3IgKGZpbmFsIElCYXRjaExpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7CisJCQkJbGlzdGVuZXIuYmF0Y2hDaGFuZ2VkKGV2ZW50KTsKKwkJCX0gLy8gZm9yCisJCX0gLy8gZmlyZUJhdGNoTWFuYWdlckNoYW5nZWQKKworCQkvKioKKwkJICogVGVsbCB0aGUgbGlzdGVuZXJzIGFib3V0IHRoZSBjaGFuZ2UgaW4gdGhlIHtAbGluayBCYXRjaH0ncyBzdGF0ZQorCQkgKiAKKwkJICogQHBhcmFtIGJhdGNoU3RhdGUKKwkJICogICAgICAgICAgICB0aGUgbmV3IHN0YXRlIG9mIHRoZSB7QGxpbmsgQmF0Y2h9CisJCSAqLworCQlwcm90ZWN0ZWQgdm9pZCBmaXJlQmF0Y2hDaGFuZ2VkU3luYyhmaW5hbCBCYXRjaFN0YXRlIGJhdGNoU3RhdGUpIHsKKwkJCWZpbmFsIEJhdGNoRXZlbnQgZXZlbnQgPSBuZXcgQmF0Y2hFdmVudCh0aGlzLCBiYXRjaFN0YXRlKTsKKwkJCWZvciAoZmluYWwgSUJhdGNoTGlzdGVuZXJTeW5jIGxpc3RlbmVyIDogbGlzdGVuZXJzU3luYykgeworCQkJCWxpc3RlbmVyLmJhdGNoQ2hhbmdlZFN5bmMoZXZlbnQpOworCQkJfSAvLyBmb3IKKwkJfSAvLyBmaXJlQmF0Y2hDaGFuZ2VkU3luYworCisJCS8qKgorCQkgKiBUaGlzIGlzIHdoZXJlIHRoZSBhZGFwdGVkIHtAbGluayBCYXRjaH0gdGVsbHMgdXMgb2YgaXRzIHN0YXRlIGNoYW5nZXMKKwkJICogYW5kIHdlIG5lZWQgdG8gYWRhcHQgdGhlbSB0byB0aGUgVUkgdGhyZWFkLgorCQkgKiAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guSUJhdGNoTGlzdGVuZXIjYmF0Y2hDaGFuZ2VkKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5CYXRjaEV2ZW50KQorCQkgKi8KKwkJcHVibGljIHZvaWQgYmF0Y2hDaGFuZ2VkKGZpbmFsIEJhdGNoRXZlbnQgZXZlbnQpIHsKKwkJCXRyeSB7CisJCQkJaWYgKCFEaXNwbGF5LmdldERlZmF1bHQoKS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQkJLy8gWWVzCisJCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJZmlyZUJhdGNoQ2hhbmdlZChldmVudC5nZXRCYXRjaFN0YXRlKCkpOworCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9IC8vIGlmCisJCQl9IC8vIHRyeQorCQkJY2F0Y2ggKGZpbmFsIE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBOb3RoaW5nIHRvIGRvLCBzaHV0dGluZyBkb3duLi4uCisJCQl9IC8vIGNhdGNoIE51bGxQb2ludGVyRXhjZXB0aW9uCisJCQljYXRjaCAoZmluYWwgRXJyb3IgbmNkZmUpIHsKKwkJCQkvLyBJZiB3ZSBnZXQgdGhpcyBleGNlcHRpb24sIGl0IGlzIGJlY2F1c2Ugd2UncmUgbm90IHJ1bm5pbmcgaW4KKwkJCQkvLyBlY2xpcHNlLiBKdXN0IGZpcmUgdGhlIGV2ZW50LgorCQkJCWZpcmVCYXRjaENoYW5nZWQoZXZlbnQuZ2V0QmF0Y2hTdGF0ZSgpKTsKKwkJCX0gLy8gY2F0Y2gKKworCQl9IC8vIGJhdGNoQ2hhbmdlZAorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5JQmF0Y2hMaXN0ZW5lclN5bmMjYmF0Y2hDaGFuZ2VkU3luYyhvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guQmF0Y2hFdmVudCkKKwkJICovCisJCXB1YmxpYyB2b2lkIGJhdGNoQ2hhbmdlZFN5bmMoZmluYWwgQmF0Y2hFdmVudCBldmVudCkgeworCQkJdHJ5IHsKKwkJCQlpZiAoIURpc3BsYXkuZ2V0RGVmYXVsdCgpLmlzRGlzcG9zZWQoKSkgeworCQkJCQkvLyBZZXMKKwkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQlmaXJlQmF0Y2hDaGFuZ2VkU3luYyhldmVudC5nZXRCYXRjaFN0YXRlKCkpOworCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9IC8vIGlmCisJCQl9IC8vIHRyeQorCQkJY2F0Y2ggKGZpbmFsIE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBOb3RoaW5nIHRvIGRvLCBzaHV0dGluZyBkb3duLi4uCisJCQl9IC8vIGNhdGNoIE51bGxQb2ludGVyRXhjZXB0aW9uCisJCQljYXRjaCAoZmluYWwgRXJyb3IgbmNkZmUpIHsKKwkJCQkvLyBJZiB3ZSBnZXQgdGhpcyBleGNlcHRpb24sIGl0IGlzIGJlY2F1c2Ugd2UncmUgbm90IHJ1bm5pbmcgaW4KKwkJCQkvLyBlY2xpcHNlLiBKdXN0IGZpcmUgdGhlIGV2ZW50LgorCQkJCWZpcmVCYXRjaENoYW5nZWQoZXZlbnQuZ2V0QmF0Y2hTdGF0ZSgpKTsKKwkJCX0gLy8gY2F0Y2gKKworCQl9IC8vIGJhdGNoQ2hhbmdlZFN5bmMKKworCQkvKioKKwkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuIGJhdGNoLnRvU3RyaW5nKCk7CisJCX0gLy8gdG9TdHJpbmcKKwl9IC8vIEJhdGNoQWRhcHRlcgorfSAvLyBCYXRjaE1hbmFnZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2JhdGNoL0JhdGNoTWFuYWdlckV2ZW50LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9iYXRjaC9CYXRjaE1hbmFnZXJFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZjAzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9iYXRjaC9CYXRjaE1hbmFnZXJFdmVudC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8vIEJhdGNoTWFuYWdlckV2ZW50LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQgaW4gdGhlIG9wZXJhdGlvbiBvZiB0aGUKKyAqIHtAbGluayBCYXRjaE1hbmFnZXJ9LgorICovCitwdWJsaWMgY2xhc3MgQmF0Y2hNYW5hZ2VyRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7CisKKwkvKioKKwkgKiBEZWZhdWx0IHNlcmlhbCBpZC4KKwkgKi8KKwl0cmFuc2llbnQgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJdHJhbnNpZW50IElCYXRjaFtdIGJhdGNoZXNBZGRlZCA9IG51bGw7CisKKwl0cmFuc2llbnQgSUJhdGNoW10gYmF0Y2hlc1JlbW92ZWQgPSBudWxsOworCisJLyoqCisJICogQHBhcmFtIGJhdGNoTWFuYWdlcgorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBCYXRjaE1hbmFnZXJ9IHRoYXQgY3JlYXRlZCB0aGUgZXZlbnQuCisJICogQHBhcmFtIGJhdGNoc1JlbW92ZWQKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgQmF0Y2h9cyByZW1vdmVkIGZyb20gbWFuYWdlbWVudCBieSB0aGUKKwkgKiAgICAgICAgICAgIHtAbGluayBCYXRjaE1hbmFnZXJ9LgorCSAqIEBwYXJhbSBiYXRjaHNBZGRlZAorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBCYXRjaH1zIGFkZGVkIHRvIHRoZSBtYW5hZ2VtZW50IG9mIHRoZQorCSAqICAgICAgICAgICAge0BsaW5rIEJhdGNoTWFuYWdlcn0uCisJICovCisJcHVibGljIEJhdGNoTWFuYWdlckV2ZW50KGZpbmFsIEJhdGNoTWFuYWdlciBiYXRjaE1hbmFnZXIsCisJCQlmaW5hbCBJQmF0Y2hbXSBiYXRjaHNBZGRlZCwgZmluYWwgSUJhdGNoW10gYmF0Y2hzUmVtb3ZlZCkgeworCQlzdXBlcihiYXRjaE1hbmFnZXIpOworCQl0aGlzLmJhdGNoZXNBZGRlZCA9IGJhdGNoc0FkZGVkLmNsb25lKCk7CisJCXRoaXMuYmF0Y2hlc1JlbW92ZWQgPSBiYXRjaHNSZW1vdmVkLmNsb25lKCk7CisJfSAvLyBCYXRjaE1hbmFnZXJFdmVudAorCisJLyoqCisJICogQHJldHVybiB0aGUgYmF0Y2hlc0FkZGVkCisJICovCisJcHVibGljIGZpbmFsIElCYXRjaFtdIGdldEJhdGNoZXNBZGRlZCgpIHsKKwkJcmV0dXJuIGJhdGNoZXNBZGRlZDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBiYXRjaGVzUmVtb3ZlZAorCSAqLworCXB1YmxpYyBmaW5hbCBJQmF0Y2hbXSBnZXRCYXRjaGVzUmVtb3ZlZCgpIHsKKwkJcmV0dXJuIGJhdGNoZXNSZW1vdmVkOworCX0KKworfSAvLyBCYXRjaE1hbmFnZXJFdmVudApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYmF0Y2gvQmF0Y2hTdGF0ZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYmF0Y2gvQmF0Y2hTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNmQ0NDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9iYXRjaC9CYXRjaFN0YXRlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLy8gQmF0Y2hTdGF0ZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqCisgKiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHN0YXRlcyB0aGF0IGEge0BsaW5rIEJhdGNofSBjYW4gYmUgaW4uCisgKiAKKyAqIEBzZWUgU2ltdWxhdGlvblN0YXRlCisgKi8KK3B1YmxpYyBlbnVtIEJhdGNoU3RhdGUgeworCS8qKgorCSAqIFdoZW4gdGhlIHtAbGluayBCYXRjaH0gaGFzIGJlZW4gc2NoZWR1bGVkIGZvciBleGVjdXRpb24gYW5kIGlzIHJ1bm5pbmcuCisJICogVGhpcyBpcyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiBhbGwgbmV3bHkgY3JlYXRlZCB7QGxpbmsgQmF0Y2h9cy4KKwkgKiA8cD4KKwkgKiBUaGUgbmV4dCBzdGF0ZSBpczoge0BsaW5rICNQQVVTRUR9CisJICovCisJUlVOTklORywKKworCS8qKgorCSAqIFdoZW4gYWxsIG9mIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn1zIGluIGEge0BsaW5rIEJhdGNofSBhcmUgbm90IHNjaGVkdWxlZAorCSAqIGZvciBleGVjdXRpb24uCisJICogPHA+CisJICogVGhlIG5leHQgc3RhdGVzIGFyZSB7QGxpbmsgI1JVTk5JTkd9LCB7QGxpbmsgI1NUT1BQRUR9CisJICogCisJICogQHNlZSAjUlVOTklORworCSAqIEBzZWUgI1NUT1BQRUQKKwkgKi8KKwlQQVVTRUQsCisKKwkvKioKKwkgKiBUaGUgc2ltdWxhdGlvbiBpcyBiZWluZyByZW1vdmVkIGZyb20gdGhlIHtAbGluayBTaW11bGF0aW9uTWFuYWdlcn0gYW5kIGl0cyBzdGF0ZQorCSAqIGluZm9ybWF0aW9uIGRlc3Ryb3llZC4KKwkgKi8KKwlTVE9QUEVECit9IC8vIEJhdGNoU3RhdGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2JhdGNoL0lCYXRjaC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYmF0Y2gvSUJhdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2MzY1NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2JhdGNoL0lCYXRjaC5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvLyBJQmF0Y2guamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2g7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCByZXByZXNlbnQge0BsaW5rIEJhdGNofQorICogc2ltdWxhdGlvbnMuCisgKiAKKyAqIEBzZWUgQmF0Y2hNYW5hZ2VyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUJhdGNoIGV4dGVuZHMgSUV4ZWN1dGFibGUgeworCisJLyoqCisJICogQHJldHVybiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUge0BsaW5rIElCYXRjaH0KKwkgKi8KKwlCYXRjaFN0YXRlIGdldEJhdGNoU3RhdGUoKTsKKworCS8qKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRlcml2ZWQgc2ltdWxhdGlvbnMgYXJlIHRvIGJlIHJ1bgorCSAqICAgICAgICAgc2VxdWVudGlhbGx5LCA8Y29kZT5mYWxzZTwvY29kZT4sIG90aGVyd2lzZS4KKwkgKi8KKwlib29sZWFuIGlzUnVubmluZ1NpbXVsYXRpb25zU2VxdWVudGlhbGx5KCk7CisKKwkvKioKKwkgKiBAcGFyYW0gcnVubmluZ1NpbXVsYXRpb25zU2VxdWVudGlhbGx5CisJICogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgY29udHJvbGxpbmcgdGhlIGNob2ljZSBvZiBzZXF1ZW50aWFsIG9yCisJICogICAgICAgICAgICBwYXJhbGxlbCBleGVjdXRpb24gb2YgdGhlIGRlcml2ZWQge0BsaW5rIFNpbXVsYXRpb259cy4KKwkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkZXJpdmVkIHtAbGluayBTaW11bGF0aW9ufXMgYXJlIHRvIGJlCisJICogICAgICAgICAgICBydW4gc2VxdWVudGlhbGx5LCA8Y29kZT5mYWxzZTwvY29kZT4sIG90aGVyd2lzZS4KKwkgKi8KKwl2b2lkIHNldFJ1bm5pbmdTaW11bGF0aW9uc1NlcXVlbnRpYWxseSgKKwkJCWJvb2xlYW4gcnVubmluZ1NpbXVsYXRpb25zU2VxdWVudGlhbGx5KTsKKworCS8qKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4sIGlmIHRoZSBkZXJpdmVkIHtAbGluayBTaW11bGF0aW9ufXMgd2lsbCBiZSBydW4KKwkgKiAgICAgICAgIGluIHRoZSBiYWNrZ3JvdW5kIChpLmUuLCBubyBHVUkpLCA8Y29kZT5mYWxzZTwvY29kZT4sIG90aGVyd2lzZS4KKwkgKi8KKwlib29sZWFuIGlzUnVubmluZ0luQmFja2dyb3VuZCgpOworCisJLyoqCisJICogQHBhcmFtIHJ1bm5pbmdJbkJhY2tncm91bmQKKwkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBjb250cm9sbGluZyB0aGUgY2hvaWNlIG9mIGJhY2tncm91bmQgb3IKKwkgKiAgICAgICAgICAgIGZvcmVncm91bmQgZXhlY3V0aW9uIG9mIHRoZSBkZXJpdmVkIHtAbGluayBTaW11bGF0aW9ufXMuCisJICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGVyaXZlZCB7QGxpbmsgU2ltdWxhdGlvbn1zIGFyZSB0byBiZQorCSAqICAgICAgICAgICAgcnVuIGluIHRoZSBiYWNrZ3JvdW5kLCA8Y29kZT5mYWxzZTwvY29kZT4sIGlmIGluIHRoZQorCSAqICAgICAgICAgICAgZm9yZWdyb3VuZC4KKwkgKi8KKwl2b2lkIHNldFJ1bm5pbmdJbkJhY2tncm91bmQoYm9vbGVhbiBydW5uaW5nSW5CYWNrZ3JvdW5kKTsKKworCS8qKgorCSAqIFN0YXJ0IHJ1bm5pbmcgdGhlIHtAbGluayBJQmF0Y2h9LgorCSAqLworCXZvaWQgcnVuKCk7CisKKwkvKioKKwkgKiBTdG9wIHRoZSB7QGxpbmsgSUJhdGNofSBhbmQgYWxsIG9mIHRoZSBkZXJpdmVkIHtAbGluayBJU2ltdWxhdGlvbn1zLgorCSAqLworCXZvaWQgc3RvcCgpOworCisJLyoqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB7QGxpbmsgSUJhdGNofSBoYXMgYmVlbgorCSAqICAgICAgICAgY2FuY2VsZWQuCisJICovCisJYm9vbGVhbiBjYW5jZWwoKTsKKworCS8qKgorCSAqIEFkZCBhIGxpc3RlbmVyIHRvIHRoZSB7QGxpbmsgSUJhdGNofS4KKwkgKiAKKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKiAgICAgICAgICAgIGFuIHtAbGluayBJQmF0Y2hMaXN0ZW5lcn0gd2hvIHdhbnRzIHRvIGJlIGtlcHQgaW5mb3JtZWQgb2YgdGhlCisJICogICAgICAgICAgICBzdGF0ZSBvZiB0aGUge0BsaW5rIElCYXRjaH0uCisJICovCisJdm9pZCBhZGRCYXRjaExpc3RlbmVyKGZpbmFsIElCYXRjaExpc3RlbmVyIGxpc3RlbmVyKTsKKworCS8qKgorCSAqIFJlbW92ZSBhIGxpc3RlbmVyIGZyb20gdGhlIHtAbGluayBJQmF0Y2h9LgorCSAqIAorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZS4KKwkgKi8KKwl2b2lkIHJlbW92ZUJhdGNoTGlzdGVuZXIoZmluYWwgSUJhdGNoTGlzdGVuZXIgbGlzdGVuZXIpOworCisJLyoqCisJICogQWRkIGEgbGlzdGVuZXIgdG8gdGhlIHtAbGluayBJQmF0Y2h9LgorCSAqIAorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqICAgICAgICAgICAgYW4ge0BsaW5rIElCYXRjaExpc3RlbmVyfSB3aG8gd2FudHMgdG8gYmUga2VwdCBpbmZvcm1lZCBvZiB0aGUKKwkgKiAgICAgICAgICAgIHN0YXRlIG9mIHRoZSB7QGxpbmsgSUJhdGNofS4KKwkgKi8KKwl2b2lkIGFkZEJhdGNoTGlzdGVuZXJTeW5jKGZpbmFsIElCYXRjaExpc3RlbmVyU3luYyBsaXN0ZW5lcik7CisKKwkvKioKKwkgKiBSZW1vdmUgYSBsaXN0ZW5lciBmcm9tIHRoZSB7QGxpbmsgSUJhdGNofS4KKwkgKiAKKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byByZW1vdmUuCisJICovCisJdm9pZCByZW1vdmVCYXRjaExpc3RlbmVyU3luYyhmaW5hbCBJQmF0Y2hMaXN0ZW5lclN5bmMgbGlzdGVuZXIpOworCisJLyoqCisJICogQHJldHVybiB0aGUge0BsaW5rIEV4cGVyaW1lbnR9IHRoYXQgaXMgdXNlZCB0byBjcmVhdGVkIHRoZQorCSAqICAgICAgICAge0BsaW5rIFNpbXVsYXRpb259cy4KKwkgKi8KKwlFeHBlcmltZW50IGdldEV4cGVyaW1lbnQoKTsKKworfSAvLyBJQmF0Y2gKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2JhdGNoL0lCYXRjaExpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9iYXRjaC9JQmF0Y2hMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNWYwYWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9iYXRjaC9JQmF0Y2hMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8vIElCYXRjaExpc3RlbmVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGVMaXN0ZW5lcjsKKworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCB3YW50IHRvIGxpc3RlbiB0byBldmVudHMKKyAqIGdlbmVyYXRlZCBieSBhIHtAbGluayBJQmF0Y2h9LgorICogCisgKiBAc2VlIElCYXRjaAorICovCitwdWJsaWMgaW50ZXJmYWNlIElCYXRjaExpc3RlbmVyIGV4dGVuZHMgSUV4ZWN1dGFibGVMaXN0ZW5lciB7CisKKwkvKioKKwkgKiBAcGFyYW0gZXZlbnQKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgQmF0Y2hFdmVudH0gdGhlIHNwZWNpZmllcyB3aGF0IGNoYW5nZWQgaW4gdGhlCisJICogICAgICAgICAgICB7QGxpbmsgSUJhdGNofS4KKwkgKi8KKwl2b2lkIGJhdGNoQ2hhbmdlZChCYXRjaEV2ZW50IGV2ZW50KTsKKworfSAvLyBJQmF0Y2hMaXN0ZW5lcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYmF0Y2gvSUJhdGNoTGlzdGVuZXJTeW5jLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9iYXRjaC9JQmF0Y2hMaXN0ZW5lclN5bmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2NjZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYmF0Y2gvSUJhdGNoTGlzdGVuZXJTeW5jLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLy8gSUJhdGNoTGlzdGVuZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2g7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZUxpc3RlbmVyU3luYzsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgd2FudCB0byBsaXN0ZW4gdG8gZXZlbnRzCisgKiBnZW5lcmF0ZWQgYnkgYSB7QGxpbmsgSUJhdGNofS4gVGhlIHRocmVhZCBydW5uaW5nIHRoZSB7QGxpbmsgQmF0Y2h9IHdpbGwgd2FpdAorICogdW50aWwgdGhlIHtAbGluayAjYmF0Y2hDaGFuZ2VkU3luYyhCYXRjaEV2ZW50KX0gbWV0aG9kIHJldHVybnMgYmVmb3JlIGl0CisgKiBjb250aW51ZXMgZXhlY3V0aW9uLgorICogCisgKiBAc2VlIElCYXRjaAorICovCitwdWJsaWMgaW50ZXJmYWNlIElCYXRjaExpc3RlbmVyU3luYyBleHRlbmRzIElFeGVjdXRhYmxlTGlzdGVuZXJTeW5jIHsKKworCS8qKgorCSAqIEBwYXJhbSBldmVudAorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBCYXRjaEV2ZW50fSB0aGUgc3BlY2lmaWVzIHdoYXQgY2hhbmdlZCBpbiB0aGUKKwkgKiAgICAgICAgICAgIHtAbGluayBJQmF0Y2h9LgorCSAqLworCXZvaWQgYmF0Y2hDaGFuZ2VkU3luYyhCYXRjaEV2ZW50IGV2ZW50KTsKKworfSAvLyBJQmF0Y2hMaXN0ZW5lclN5bmMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2JhdGNoL0lCYXRjaE1hbmFnZXJMaXN0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYmF0Y2gvSUJhdGNoTWFuYWdlckxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjNWZmNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2JhdGNoL0lCYXRjaE1hbmFnZXJMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8vIElCYXRjaE1hbmFnZXJMaXN0ZW5lci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlTWFuYWdlckxpc3RlbmVyOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCBsaXN0ZW4gZm9yCisgKiB7QGxpbmsgQmF0Y2hNYW5hZ2VyRXZlbnR9cy4KKyAqIAorICogQHNlZSBCYXRjaE1hbmFnZXIKKyAqIEBzZWUgQmF0Y2gKKyAqLworcHVibGljIGludGVyZmFjZSBJQmF0Y2hNYW5hZ2VyTGlzdGVuZXIgZXh0ZW5kcyBJRXhlY3V0YWJsZU1hbmFnZXJMaXN0ZW5lciB7CisKKwkvKioKKwkgKiBAcGFyYW0gZXZlbnQKKwkgKi8KKwl2b2lkIGJhdGNoZXNDaGFuZ2VkKEJhdGNoTWFuYWdlckV2ZW50IGV2ZW50KTsKKworfSAvLyBJQmF0Y2hNYW5hZ2VyTGlzdGVuZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9iYXRjaC9JQmF0Y2hNYW5hZ2VyTGlzdGVuZXJTeW5jLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9iYXRjaC9JQmF0Y2hNYW5hZ2VyTGlzdGVuZXJTeW5jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5MThlMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2JhdGNoL0lCYXRjaE1hbmFnZXJMaXN0ZW5lclN5bmMuamF2YQpAQCAtMCwwICsxLDMzIEBACisvLyBJQmF0Y2hNYW5hZ2VyTGlzdGVuZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2g7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZU1hbmFnZXJMaXN0ZW5lclN5bmM7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IGxpc3RlbiBmb3IKKyAqIHtAbGluayBCYXRjaE1hbmFnZXJFdmVudH1zLiBUaGUgdGhyZWFkIHJ1bm5pbmcgdGhlIHtAbGluayBCYXRjaE1hbmFnZXJ9IHdpbGwKKyAqIHdhaXQgdW50aWwgdGhlIHtAbGluayAjYmF0Y2hlc0NoYW5nZWRTeW5jKEJhdGNoTWFuYWdlckV2ZW50KX0gbWV0aG9kIHJldHVybnMKKyAqIGJlZm9yZSBpdCBjb250aW51ZXMgZXhlY3V0aW9uLgorICogCisgKiBAc2VlIElCYXRjaE1hbmFnZXJMaXN0ZW5lcgorICovCitwdWJsaWMgaW50ZXJmYWNlIElCYXRjaE1hbmFnZXJMaXN0ZW5lclN5bmMgZXh0ZW5kcworCQlJRXhlY3V0YWJsZU1hbmFnZXJMaXN0ZW5lclN5bmMgeworCisJLyoqCisJICogQHBhcmFtIGV2ZW50CisJICovCisJdm9pZCBiYXRjaGVzQ2hhbmdlZFN5bmMoQmF0Y2hNYW5hZ2VyRXZlbnQgZXZlbnQpOworCit9IC8vIElCYXRjaE1hbmFnZXJMaXN0ZW5lclN5bmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9iYXRjaC9NZXNzYWdlcy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYmF0Y2gvTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTdhNTVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYmF0Y2gvTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDQxIEBACisvLyBNZXNzYWdlcy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMKKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCisJCQkuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKKworCXByaXZhdGUgTWVzc2FnZXMoKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0ga2V5CisJICogQHJldHVybiB0aGUgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUga2V5CisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7CisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOworCQl9CisJfQorfSAvLyBNZXNzYWdlcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvYmF0Y2gvbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2JhdGNoL21lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMyZTQ4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2JhdGNoL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNSBAQAorIyBtZXNzYWdlcy5wcm9wZXJ0aWVzCisjCisjIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjIEJhdGNoTWFuYWdlcgorQmF0Y2hNZ3IuRGVzZXJpYWxpemF0aW9uX0Vycm9yID0gUHJvYmxlbSByZWFkaW5nIGluIGEgc2VyaWFsaXplZCBFeHBlcmltZW50IGZyb20gVVJJIFwiezB9XCIKK0JhdGNoTWdyLlN0YXJ0QmF0Y2ggPSBTdGFydGluZyBiYXRjaAorQmF0Y2hNZ3IuQ3J0U2ltID0gQ3JlYXRpbmcgYmF0Y2gKK0JhdGNoTWdyLlJ1biA9IFJ1bm5pbmcgYmF0Y2gKKworCisjIEV4cGVyaW1lbnQKK0V4cC5JRXJyID0gQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgcnVubmluZyBFeHBlcmltZW50ICJ7MH0iLgorRXhwLk1pc3NpbmdTY2VuYXJpbyA9IFRoZSBFeHBlcmltZW50ICJ7MH0iIGNhbm5vdCBydW4gYmVjYXVzZSBpdCBkb2VzIG5vdCBoYXZlIGEgYmFzZSBTY2VuYXJpby4KK0V4cC5NaXNzaW5nU2VxID0gVGhlIEV4cGVyaW1lbnQgInswfSIgY2Fubm90IHJ1biBiZWNhdXNlIGl0cyBiYXNlIFNjZW5hcmlvIGRvZXMgbm90IGhhdmUgYSBTZXF1ZW5jZXIuCitFeHAuTWlzc2luZ01vZGVsPSBUaGUgRXhwZXJpbWVudCAiezB9IiBjYW5ub3QgcnVuIGJlY2F1c2UgaXRzIGJhc2UgU2NlbmFyaW8gZG9lcyBub3QgaGF2ZSBhIE1vZGVsLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2V4ZWN1dGlvbi9FeGVjdXRhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9leGVjdXRpb24vRXhlY3V0YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYmNlODgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9leGVjdXRpb24vRXhlY3V0YWJsZS5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvLyBFeGVjdXRhYmxlLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuRHVibGluQ29yZUltcGw7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhbiAiYWRhcHRlciIgY2xhc3MgZm9yIHRoZSBpbnRlcmZhY2Uge0BsaW5rIElFeGVjdXRhYmxlfS4gSXQKKyAqIGltcGxlbWVudHMgY29tbW9uIGZlYXR1cmVzIG9mIHRoYXQgaW50ZXJmYWNlIGZvciBleHRlbmRpbmcgc3ViY2xhc3Nlcy4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIEV4ZWN1dGFibGUgZXh0ZW5kcyBKb2IgaW1wbGVtZW50cyBJRXhlY3V0YWJsZSB7CisKKwkvKioKKwkgKiBUaGUge0BsaW5rIEV4ZWN1dGFibGV9J3Mgc2VxdWVuY2UgbnVtYmVyLiBUaGlzIHZhbHVlIGlzIHR5cGljYWxseQorCSAqIGFzc2lnbmVkIGJ5IHRoZSB7QGxpbmsgRXhlY3V0YWJsZU1hbmFnZXJ9IHdoZW4gaXQgZmlyc3QgY3JlYXRlcyBhCisJICoge0BsaW5rIEV4ZWN1dGFibGV9LgorCSAqLworCXByaXZhdGUgaW50IHNlcXVlbmNlTnVtYmVyID0gMDsKKworCS8qKgorCSAqIFRoZSB0aW1lICh3YWxsIGNsb2NrKSB3aGVuIHRoaXMge0BsaW5rIEV4ZWN1dGFibGV9IHdhcyBjcmVhdGVkLgorCSAqLworCXByaXZhdGUgZmluYWwgRGF0ZSBjcmVhdGlvblRpbWU7CisKKwkvKioKKwkgKiBAcGFyYW0gbmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHtAbGluayBFeGVjdXRhYmxlfQorCSAqIEBwYXJhbSBzZXF1ZW5jZU51bWJlcgorCSAqICAgICAgICAgICAgdGhlIHVuaXF1ZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIHtAbGluayBFeGVjdXRhYmxlfQorCSAqLworCXB1YmxpYyBFeGVjdXRhYmxlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBpbnQgc2VxdWVuY2VOdW1iZXIpIHsKKwkJc3VwZXIobmFtZSk7CisJCXRoaXMuc2VxdWVuY2VOdW1iZXIgPSBzZXF1ZW5jZU51bWJlcjsKKwkJdGhpcy5jcmVhdGlvblRpbWUgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWUoKTsKKwl9IC8vIEV4ZWN1dGFibGUKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHVuaXF1ZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIHtAbGluayBFeGVjdXRhYmxlfQorCSAqLworCXB1YmxpYyBpbnQgZ2V0U2VxdWVuY2VOdW1iZXIoKSB7CisJCXJldHVybiBzZXF1ZW5jZU51bWJlcjsKKwl9IC8vIGdldFNlcXVlbmNlTnVtYmVyCisKKwkvKioKKwkgKiBAcGFyYW0gc2VxdWVuY2VOdW1iZXIKKwkgKiAgICAgICAgICAgIHRoZSB1bmlxdWUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSB7QGxpbmsgRXhlY3V0YWJsZX0KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZU51bWJlcihmaW5hbCBpbnQgc2VxdWVuY2VOdW1iZXIpIHsKKwkJdGhpcy5zZXF1ZW5jZU51bWJlciA9IHNlcXVlbmNlTnVtYmVyOworCX0gLy8gc2V0U2VxdWVuY2VOdW1iZXIKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIEV4ZWN1dGFibGUgd2l0aCBpdHMgc2VxdWVuY2UgbnVtYmVyIGFzIGEgcHJlZml4CisJICogICAgICAgICAoZS5nLiwgIlsyXSBGb29CYXIiKS4KKwkgKiBAc2VlICNnZXRTZXF1ZW5jZU51bWJlcigpCisJICogQHNlZSAjZ2V0TmFtZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lV2l0aFNlcXVlbmNlTnVtYmVyKCkgeworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHJldFZhbHVlID0gbmV3IFN0cmluZ0J1aWxkZXIoIlsiKTsKKwkJcmV0VmFsdWUuYXBwZW5kKGdldFNlcXVlbmNlTnVtYmVyKCkpOworCQlyZXRWYWx1ZS5hcHBlbmQoIl0gIik7CisJCXJldFZhbHVlLmFwcGVuZChnZXROYW1lKCkpOworCQlyZXR1cm4gcmV0VmFsdWUudG9TdHJpbmcoKTsKKwl9IC8vIGdldE5hbWVXaXRoU2VxdWVuY2VOdW1iZXIKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZSNnZXRDcmVhdGlvblRpbWUoKQorCSAqLworCXB1YmxpYyBEYXRlIGdldENyZWF0aW9uVGltZSgpIHsKKwkJcmV0dXJuIGNyZWF0aW9uVGltZTsKKwl9IC8vIGdldENyZWF0aW9uVGltZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlI2dldFVuaXF1ZUlEU3RyaW5nKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlEU3RyaW5nKCkgeworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoVVJJLmVuY29kZVNlZ21lbnQoZ2V0TmFtZSgpLAorCQkJCWZhbHNlKS5yZXBsYWNlKCIlIiwgIi0iKSk7CisJCXNiLmFwcGVuZCgiLSIpOworCQlzYi5hcHBlbmQoZ2V0U2VxdWVuY2VOdW1iZXIoKSk7CisJCXNiLmFwcGVuZCgiLSIpOworCQlzYi5hcHBlbmQoRHVibGluQ29yZUltcGwuY3JlYXRlSVNPODYwMURhdGVTdHJpbmcoZ2V0Q3JlYXRpb25UaW1lKCkpKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfSAvLyBnZXRVbmlxdWVJRFN0cmluZworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlI2lzU3RvcHBhYmxlKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1N0b3BwYWJsZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCit9IC8vIEV4ZWN1dGFibGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2V4ZWN1dGlvbi9FeGVjdXRhYmxlTWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvZXhlY3V0aW9uL0V4ZWN1dGFibGVNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1YTk5MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2V4ZWN1dGlvbi9FeGVjdXRhYmxlTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8vIEV4ZWN1dGFibGVNYW5hZ2VyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBleHRlbmRlZCBieSBjbGFzc2VzIHRoZSBtYW5hZ2UgdGhlIGxpZmUtY3ljbGUgb2YKKyAqIHtAbGluayBJRXhlY3V0YWJsZX1zLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhlY3V0YWJsZU1hbmFnZXIgeworCS8vIE5vdGhpbmcKK30gLy8gRXhlY3V0YWJsZU1hbmFnZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2V4ZWN1dGlvbi9FeGVjdXRhYmxlU3RhdGUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2V4ZWN1dGlvbi9FeGVjdXRhYmxlU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDE4YWE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvZXhlY3V0aW9uL0V4ZWN1dGFibGVTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8vIEV4ZWN1dGFibGVTdGF0ZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgZW51bWVyYXRpb24gcmVwcmVzZW50cyB0aGUgZGlmZmVyZW50IHN0YXRlcyBhbiB7QGxpbmsgRXhlY3V0YWJsZX0gY2FuIGJlCisgKiBpbi4KKyAqLworcHVibGljIGVudW0gRXhlY3V0YWJsZVN0YXRlIHsKKwkvLyBOb3RoaW5nCit9IC8vIEV4ZWN1dGFibGVTdGF0ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvZXhlY3V0aW9uL0lFeGVjdXRhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9leGVjdXRpb24vSUV4ZWN1dGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzhlMGYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvZXhlY3V0aW9uL0lFeGVjdXRhYmxlLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLy8gSUV4ZWN1dGFibGUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCBjYW4gYXJlIGV4ZWN1dGFibGUuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUV4ZWN1dGFibGUgeworCisJLyoqCisJICogVGhlIHVuaXRzIG9mIHdvcmsgKDEwMCkgdGhhdCByZXByZXNlbnRzIGNvbXBsZXRlIGV4ZWN1dGlvbi4KKwkgKi8KKwlpbnQgVE9UQUxfV09SSyA9IDEwMDsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHVuaXF1ZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIHtAbGluayBJRXhlY3V0YWJsZX0uCisJICogQHNlZSAjZ2V0TmFtZVdpdGhTZXF1ZW5jZU51bWJlcigpCisJICovCisJaW50IGdldFNlcXVlbmNlTnVtYmVyKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB7QGxpbmsgSUV4ZWN1dGFibGV9LgorCSAqLworCVN0cmluZyBnZXROYW1lKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIGEge0BsaW5rIFN0cmluZ30gdGhhdCBjb250YWlucyB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZQorCSAqICAgICAgICAge0BsaW5rIElFeGVjdXRhYmxlfSBhbmQgaXQncyBuYW1lLgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqLworCVN0cmluZyBnZXROYW1lV2l0aFNlcXVlbmNlTnVtYmVyKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIGEge0BsaW5rIFN0cmluZ30gd2l0aG91dCBzcGFjZXMgdGhhdCBpcyB1bmlxdWUgdG8gdGhpcworCSAqICAgICAgICAge0BsaW5rIEV4ZWN1dGFibGV9IGluc3RhbmNlLgorCSAqLworCVN0cmluZyBnZXRVbmlxdWVJRFN0cmluZygpOworCisJLyoqCisJICogQHJldHVybiB0aGUgdGltZSAod2FsbCBjbG9jaykgdGhhdCB0aGUge0BsaW5rIEV4ZWN1dGFibGV9IHdhcyBjcmVhdGVkLgorCSAqLworCURhdGUgZ2V0Q3JlYXRpb25UaW1lKCk7CisKKwkvKioKKwkgKiBTdGFydCBydW5uaW5nIHRoZSB7QGxpbmsgSUV4ZWN1dGFibGV9LgorCSAqLworCXZvaWQgcnVuKCk7CisKKwkvKioKKwkgKiBQYXVzZSB0aGUge0BsaW5rIElFeGVjdXRhYmxlfS4KKwkgKi8KKwl2b2lkIHBhdXNlKCk7CisKKwkvKioKKwkgKiBSZXNldCB0aGUge0BsaW5rIElFeGVjdXRhYmxlfS4KKwkgKi8KKwl2b2lkIHJlc2V0KCk7CisKKwkvKioKKwkgKiBTdGVwIHRoZSB7QGxpbmsgSUV4ZWN1dGFibGV9IG9uZSBzdGVwL2N5Y2xlIGlmIGl0IGhhc24ndCBhbHJlYWR5IGVuZGVkLgorCSAqLworCXZvaWQgc3RlcCgpOworCisJLyoqCisJICogU3RvcCB0aGUge0BsaW5rIElFeGVjdXRhYmxlfS4KKwkgKi8KKwl2b2lkIHN0b3AoKTsKKworCS8qKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHtAbGluayBJRXhlY3V0YWJsZX0gaXMgcnVubmluZy4KKwkgKi8KKwlib29sZWFuIGlzUnVubmluZygpOworCisJLyoqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUge0BsaW5rIElFeGVjdXRhYmxlfSBjYW4gYmUgc3RvcHBlZC4KKwkgKiAgICAgICAgIFRoaXMgaXMgb25seSA8Y29kZT50cnVlPC9jb2RlPiBmb3Ige0BsaW5rIElFeGVjdXRhYmxlfXMgZm9yCisJICogICAgICAgICB3aGljaCB7QGxpbmsgI2lzUnVubmluZygpfSBjYW4gYmUgPGNvZGU+dHJ1ZTwvY29kZT4uCisJICovCisJYm9vbGVhbiBpc1N0b3BwYWJsZSgpOworfSAvLyBJRXhlY3V0YWJsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvZXhlY3V0aW9uL0lFeGVjdXRhYmxlTGlzdGVuZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2V4ZWN1dGlvbi9JRXhlY3V0YWJsZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkMjJhMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2V4ZWN1dGlvbi9JRXhlY3V0YWJsZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLy8gSUV4ZWN1dGFibGVMaXN0ZW5lci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGV4dGVuZGVkIGJ5IGNsYXNzZXMgdGhhdCB3aXNoIHRvIGJlIGluZm9ybWVkIG9mIGNoYW5nZXMgdG8KKyAqIHRoZSBzdGF0ZSBvZiBhbiB7QGxpbmsgRXhlY3V0YWJsZX1zLgorICovCitwdWJsaWMgaW50ZXJmYWNlIElFeGVjdXRhYmxlTGlzdGVuZXIgeworCS8vIEJhdGNoU3RhdGUgYW5kIFNpbXVsYXRpb24gc3RhdGUgc2hvdWxkIGJlIG1lcmdlZCBpbnRvIHRoaXMgZW51bSBhbmQgcmVtb3ZlZC4KK30gLy8gSUV4ZWN1dGFibGVMaXN0ZW5lcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvZXhlY3V0aW9uL0lFeGVjdXRhYmxlTGlzdGVuZXJTeW5jLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9leGVjdXRpb24vSUV4ZWN1dGFibGVMaXN0ZW5lclN5bmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGY4ODJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvZXhlY3V0aW9uL0lFeGVjdXRhYmxlTGlzdGVuZXJTeW5jLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLy8gSUV4ZWN1dGFibGVMaXN0ZW5lci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGV4dGVuZGVkIGJ5IGNsYXNzZXMgdGhhdCB3aXNoIHRvIGJlIGluZm9ybWVkIG9mIGNoYW5nZXMgdG8KKyAqIHRoZSBzdGF0ZSBvZiBhbiB7QGxpbmsgRXhlY3V0YWJsZX1zLiBXaGVyZSB0aGUge0BsaW5rIEV4ZWN1dGFibGV9IGlzCisgKiBzdXNwZW5kZWQgd2hpbGUgdGhlIGxpc3RlbmVyIHJlY2VpdmVzIHRoZSBtZXNzYWdlLgorICovCitwdWJsaWMgaW50ZXJmYWNlIElFeGVjdXRhYmxlTGlzdGVuZXJTeW5jIHsKKwkvLyBOb3RoaW5nCit9IC8vIElFeGVjdXRhYmxlTGlzdGVuZXJTeW5jCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9leGVjdXRpb24vSUV4ZWN1dGFibGVNYW5hZ2VyTGlzdGVuZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2V4ZWN1dGlvbi9JRXhlY3V0YWJsZU1hbmFnZXJMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ODEzOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9leGVjdXRpb24vSUV4ZWN1dGFibGVNYW5hZ2VyTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDIxIEBACisvLyBJRXhlY3V0YWJsZU1hbmFnZXJMaXN0ZW5lci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGV4dGVuZGVkIGJ5IGNsYXNzZXMgdGhhdCB3aXNoIHRvIGJlIGluZm9ybWVkIG9mIGNoYW5nZXMgdG8KKyAqIHRoZSBzdGF0ZSBvZiBhbiB7QGxpbmsgRXhlY3V0YWJsZU1hbmFnZXJ9cy4KKyAqLworcHVibGljIGludGVyZmFjZSBJRXhlY3V0YWJsZU1hbmFnZXJMaXN0ZW5lciB7CisJLy8gTm90aGluZworfSAvLyBJRXhlY3V0YWJsZU1hbmFnZXJMaXN0ZW5lcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2V4ZWN1dGlvbi9JRXhlY3V0YWJsZU1hbmFnZXJMaXN0ZW5lclN5bmMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2V4ZWN1dGlvbi9JRXhlY3V0YWJsZU1hbmFnZXJMaXN0ZW5lclN5bmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGQwZTdmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvZXhlY3V0aW9uL0lFeGVjdXRhYmxlTWFuYWdlckxpc3RlbmVyU3luYy5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8vIElFeGVjdXRhYmxlTWFuYWdlckxpc3RlbmVyU3luYy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGV4dGVuZGVkIGJ5IGNsYXNzZXMgdGhhdCB3aXNoIHRvIGJlIGluZm9ybWVkIG9mIGNoYW5nZXMgdG8KKyAqIHRoZSBzdGF0ZSBvZiBhbiB7QGxpbmsgRXhlY3V0YWJsZU1hbmFnZXJ9cy4gV2hlcmUgdGhlCisgKiB7QGxpbmsgRXhlY3V0YWJsZU1hbmFnZXJ9IGlzIHN1c3BlbmRlZCB3aGlsZSB0aGUgbGlzdGVuZXIgcmVjZWl2ZXMgdGhlCisgKiBtZXNzYWdlLgorICovCitwdWJsaWMgaW50ZXJmYWNlIElFeGVjdXRhYmxlTWFuYWdlckxpc3RlbmVyU3luYyB7CisJLy8gTm90aGluZworfSAvLyBJRXhlY3V0YWJsZU1hbmFnZXJMaXN0ZW5lclN5bmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9wcmVmZXJlbmNlcy9NZXNzYWdlcy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvcHJlZmVyZW5jZXMvTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGJiNTc3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvcHJlZmVyZW5jZXMvTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDQyIEBACisvLyBNZXNzYWdlcy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5wcmVmZXJlbmNlczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJldHJpZXZlcyBtZXNzYWdlcyBmb3IgU1RFTSBzaW11bGF0aW9uIG1hbmFnZW1lbnQgcHJlZmVyZW5jZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlcyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnN0ZW0uam9icy5wcmVmZXJlbmNlcy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCisJCQkuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKKworCXByaXZhdGUgTWVzc2FnZXMoKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0ga2V5CisJICogQHJldHVybiB0aGUgc3RyaW5nIG1hdGNoaW5nIHRoZSBrZXkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9Cit9IC8vIE1lc3NhZ2VzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY3ZDI2OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDYwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5wcmVmZXJlbmNlczsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBDb25zdGFudCBkZWZpbml0aW9ucyBmb3IgcGx1Zy1pbiBwcmVmZXJlbmNlcworICovCitwdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUNvbnN0YW50cyB7CisKKwkvKioKKwkgKiBUaGUgcHJlZmVyZW5jZSBmb3IgcGF1c2luZyBhZnRlciBlYWNoIHNpbXVsYXRpb24gY3ljbGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSU1VTEFUSU9OX1NMRUVQX0JPT0xFQU4gPSAiY3ljbGVQYXVzZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHByZWZlcmVuY2UgdGhhdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHBhdXNlIHRoZQorCSAqIHNpbXVsYXRpb24gYXQgdGhlIGVuZCBvZiBlYWNoIGN5Y2xlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTVVMQVRJT05fU0xFRVBfTUlMTElTRUNPTkRTX0lOVEVHRVIgPSAiY3ljbGVQYXVzZU1pbGxpU2Vjb25kcyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHByZWZlcmVuY2UgdGhhdCBzcGVjaWZpZXMgdGhhdCB3aGVuIHRoZSBjYW5vbmljYWwgZ3JhcGggaXMKKwkgKiBjcmVhdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSA8Y29kZT5TaW11bGF0aW9uPC9jb2RlPiB0aGF0IGVhY2gKKwkgKiB1bnJlc29sdmVkIDxjb2RlPklkZW50aWZpYWJsZTwvY29kZT4gc2hvdWxkIGJlIHJlcG9ydGVkIGluIHRoZSBlcnJvcgorCSAqIGxvZy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRfRUFDSF9VTlJFU09MVkVEX0lERU5USUZJQUJMRV9CT09MRUFOID0gInJlcG9ydEVhY2hVbnJlc29sdmVkSWRlbnRpZmlhYmxlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyBpcyB0aGUgcHJlZmVyZW5jZSB0byByZXBvcnQgZGFuZ2xpbmcgYWlyIHRyYW5zcG9ydCBlZGdlcworCSAqLworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1JUX0RBTkdMSU5HX0FJUl9UUkFOUE9SVF9FREdFU19CT09MRUFOID0gInJlcG9ydERhbmdsaW5nQWlyVHJhbnNwb3J0RWRnZXMiOworCQorCS8qKgorCSAqIFRoaXMgaXMgdGhlIHByZWZlcmVuY2UgdGhhdCBzcGVjaWZpZXMgdGhhdCB3aGVuIHRoZSBjYW5vbmljYWwgZ3JhcGggaXMKKwkgKiBjcmVhdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSA8Y29kZT5TaW11bGF0aW9uPC9jb2RlPiB0aGF0IGlmIHRoZXJlIGFyZQorCSAqIHVucmVzb2x2ZWQgPGNvZGU+SWRlbnRpZmlhYmxlPC9jb2RlPnMgdGhlbiB0aGUgbnVtYmVyIHNob3VsZCBiZQorCSAqIHJlcG9ydGVkIGluIHRoZSBlcnJvciBsb2cuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1JUX05VTUJFUl9PRl9VTlJFU09MVkVEX0lERU5USUZJQUJMRVNfQk9PTEVBTiA9ICJyZXBvcnROdW1iZXJPZlVucmVzb2x2ZWRJZGVudGlmaWFibGUiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogVGhpcyBpcyB0aGUgcHJlZmVyZW5jZSBlbmFibGVzIG9yIGRpc2FibGVzIHRoZSB1c2Ugb2YgY2FjaGluZyBpbiBTVEVNLgorCSAqIENhY2hpbmcgc3lzdGVtIGNhbiBjYWNoZSBpbml0aWFsaXplZCB7QGxpbmsgU2NlbmFyaW99cyB0byBzYXZlIHRoZSB0aW1lCisJICogaXQgdGFrZXMgdG8gaW5pdGlhbGl6ZSB0aGUge0BsaW5rIFNjZW5hcmlvfSB3aGVuIHJ1bm5pbmcgdGhlIHNhbWUgc2NlbmFyaW8KKwkgKiBtb3JlIHRoYW4gb25jZS4gCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX1NDRU5BUklPU19DQUNISU5HX0JPT0xFQU4gPSAidXNlU2NlbmFyaW9zQ2FjaGluZyI7IC8vJE5PTi1OTFMtMSQKK30gLy8gUHJlZmVyZW5jZUNvbnN0YW50cwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzdhMGFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKQEAgLTAsMCArMSw1NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMucHJlZmVyZW5jZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuQWN0aXZhdG9yOworCisvKioKKyAqIENsYXNzIHVzZWQgdG8gaW5pdGlhbGl6ZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgorICovCitwdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgeworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKKwkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CisJCXN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5TSU1VTEFUSU9OX1NMRUVQX0JPT0xFQU4sCisJCQkJU2ltdWxhdGlvbk1hbmFnZW1lbnRQcmVmZXJlbmNlUGFnZS5ERUZBVUxUX1NJTVVMQVRJT05fU0xFRVApOworCQlzdG9yZQorCQkJCS5zZXREZWZhdWx0KAorCQkJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5TSU1VTEFUSU9OX1NMRUVQX01JTExJU0VDT05EU19JTlRFR0VSLAorCQkJCQkJU2ltdWxhdGlvbk1hbmFnZW1lbnRQcmVmZXJlbmNlUGFnZS5ERUZBVUxUX1NJTVVMQVRJT05fU0xFRVBfTUlMTElTRUNPTkRTKTsKKwkJc3RvcmUKKwkJCQkuc2V0RGVmYXVsdCgKKwkJCQkJCVByZWZlcmVuY2VDb25zdGFudHMuUkVQT1JUX0VBQ0hfVU5SRVNPTFZFRF9JREVOVElGSUFCTEVfQk9PTEVBTiwKKwkJCQkJCVNpbXVsYXRpb25NYW5hZ2VtZW50UHJlZmVyZW5jZVBhZ2UuREVGQVVMVF9TSU1VTEFUSU9OX1JFUE9SVF9FQUNIX1VOUkVTT0xWRURfSURFTlRJRklBQkxFKTsKKworCQlzdG9yZQorCQkuc2V0RGVmYXVsdCgKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlJFUE9SVF9EQU5HTElOR19BSVJfVFJBTlBPUlRfRURHRVNfQk9PTEVBTiwKKwkJCQlTaW11bGF0aW9uTWFuYWdlbWVudFByZWZlcmVuY2VQYWdlLkRFRkFVTFRfU0lNVUxBVElPTl9SRVBPUlRfREFOR0xJTkdfQUlSX1RSQU5QT1JUX0VER0VTKTsKKworCQlzdG9yZQorCQkJCS5zZXREZWZhdWx0KAorCQkJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5SRVBPUlRfTlVNQkVSX09GX1VOUkVTT0xWRURfSURFTlRJRklBQkxFU19CT09MRUFOLAorCQkJCQkJU2ltdWxhdGlvbk1hbmFnZW1lbnRQcmVmZXJlbmNlUGFnZS5ERUZBVUxUX1NJTVVMQVRJT05fUkVQT1JUX05VTUJFUl9VTlJFU09MVkVEX0lERU5USUZJQUJMRSk7CisJCXN0b3JlCisJCQkJLnNldERlZmF1bHQoCisJCQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlVTRV9TQ0VOQVJJT1NfQ0FDSElOR19CT09MRUFOLAorCQkJCQkJU2ltdWxhdGlvbk1hbmFnZW1lbnRQcmVmZXJlbmNlUGFnZS5ERUZBVUxUX1VTRV9TQ0VOQVJJT1NfQ0FDSElORyk7CisKKwl9IC8vIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMKKworfSAvLyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3ByZWZlcmVuY2VzL1NpbXVsYXRpb25NYW5hZ2VtZW50UHJlZmVyZW5jZVBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3ByZWZlcmVuY2VzL1NpbXVsYXRpb25NYW5hZ2VtZW50UHJlZmVyZW5jZVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmU2YzEzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvcHJlZmVyZW5jZXMvU2ltdWxhdGlvbk1hbmFnZW1lbnRQcmVmZXJlbmNlUGFnZS5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5wcmVmZXJlbmNlczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkJvb2xlYW5GaWVsZEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JbnRlZ2VyRmllbGRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwcmVmZXJlbmNlIHBhZ2UgdGhhdCBpcyBjb250cmlidXRlZCB0byB0aGUKKyAqIFByZWZlcmVuY2VzIGRpYWxvZy4gQnkgc3ViLWNsYXNzaW5nIDxzYW1wPkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U8L3NhbXA+LAorICogd2UgY2FuIHVzZSB0aGUgZmllbGQgc3VwcG9ydCBidWlsdCBpbnRvIEpGYWNlIHRoYXQgYWxsb3dzIHVzIHRvIGNyZWF0ZSBhIHBhZ2UKKyAqIHRoYXQgaXMgc21hbGwgYW5kIGtub3dzIGhvdyB0byBzYXZlLCByZXN0b3JlIGFuZCBhcHBseSBpdHNlbGYuCisgKiA8cD4KKyAqIFRoaXMgcGFnZSBpcyB1c2VkIHRvIG1vZGlmeSBwcmVmZXJlbmNlcyBvbmx5LiBUaGV5IGFyZSBzdG9yZWQgaW4gdGhlCisgKiBwcmVmZXJlbmNlIHN0b3JlIHRoYXQgYmVsb25ncyB0byB0aGUgbWFpbiBwbHVnLWluIGNsYXNzLiBUaGF0IHdheSwKKyAqIHByZWZlcmVuY2VzIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSB2aWEgdGhlIHByZWZlcmVuY2Ugc3RvcmUuCisgKi8KKworcHVibGljIGNsYXNzIFNpbXVsYXRpb25NYW5hZ2VtZW50UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcworCQlGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKKworCS8qKgorCSAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIHRvIHBhdXNlIGVhY2gKKwkgKiBzaW11bGF0aW9uIGN5Y2xlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1NJTVVMQVRJT05fU0xFRVBfTUlMTElTRUNPTkRTID0gMDsKKworCS8qKgorCSAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIHRvIHBhdXNlIGVhY2gKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfU0lNVUxBVElPTl9TTEVFUF9NSUxMSVNFQ09ORFMgPSAzNjAwMDAwOworCisJLyoqCisJICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRpZ2l0cyBhbGxvd2VkIGluIGN5Y2xlIHBhdXNlIG1pbGxpc2Vjb25kcworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9TSU1VTEFUSU9OX1NMRUVQX1NFQ09ORFNfTlVNX0RJR0lUUyA9IEludGVnZXIKKwkJCS50b1N0cmluZyhNQVhfU0lNVUxBVElPTl9TTEVFUF9NSUxMSVNFQ09ORFMpLmxlbmd0aCgpOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzaW11bGF0aW9uIHNsZWVwIHByZWZlcmVuY2UuCisJICogCisJICogQHNlZSAjREVGQVVMVF9TSU1VTEFUSU9OX1NMRUVQCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfU0lNVUxBVElPTl9TTEVFUCA9IHRydWU7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gcGF1c2UgdGhlCisJICogc2ltdWxhdGlvbiBvbiBlYWNoIGN5Y2xlLgorCSAqIAorCSAqIEBzZWUgI0RFRkFVTFRfU0lNVUxBVElPTl9TTEVFUAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfU0lNVUxBVElPTl9TTEVFUF9NSUxMSVNFQ09ORFMgPSAxMDAwOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgcmVwb3J0aW5nIGFsbCB1bnJlc29sdmVkCisJICogPGNvZGU+SWRlbnRpZmlhYmxlczwvY29kZT4uIFZhbHVlOiA8Y29kZT5mYWxzZTwvY29kZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVGQVVMVF9TSU1VTEFUSU9OX1JFUE9SVF9FQUNIX1VOUkVTT0xWRURfSURFTlRJRklBQkxFID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciByZXBvcnRpbmcgYWxsIHVucmVzb2x2ZWQKKwkgKiBBaXIgdHJhbnNwb3J0IGVkZ2VzIFZhbHVlOiA8Y29kZT5mYWxzZTwvY29kZT4KKwkgKi8KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX1NJTVVMQVRJT05fUkVQT1JUX0RBTkdMSU5HX0FJUl9UUkFOUE9SVF9FREdFUyA9IGZhbHNlOworCQorCS8qKgorCSAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHJlcG9ydGluZyB0aGUgbnVtYmVyIG9mIHVucmVzb2x2ZWQKKwkgKiA8Y29kZT5JZGVudGlmaWFibGVzPC9jb2RlPi4gVmFsdWU6IDxjb2RlPnRydWU8L2NvZGU+CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfU0lNVUxBVElPTl9SRVBPUlRfTlVNQkVSX1VOUkVTT0xWRURfSURFTlRJRklBQkxFID0gZmFsc2U7CisJCisJLyoqCisJICogVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgY2FjaGluZy4gVmFsdWU6IDxjb2RlPnRydWU8L2NvZGU+CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfVVNFX1NDRU5BUklPU19DQUNISU5HID0gdHJ1ZTsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJcHVibGljIFNpbXVsYXRpb25NYW5hZ2VtZW50UHJlZmVyZW5jZVBhZ2UoKSB7CisJCXN1cGVyKEdSSUQpOworCQlzZXRQcmVmZXJlbmNlU3RvcmUoQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7CisJCXNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiU01QUGFnZVRJVExFIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgZmllbGQgZWRpdG9ycy4gRmllbGQgZWRpdG9ycyBhcmUgYWJzdHJhY3Rpb25zIG9mIHRoZSBjb21tb24KKwkgKiBHVUkgYmxvY2tzIG5lZWRlZCB0byBtYW5pcHVsYXRlIHZhcmlvdXMgdHlwZXMgb2YgcHJlZmVyZW5jZXMuIEVhY2ggZmllbGQKKwkgKiBlZGl0b3Iga25vd3MgaG93IHRvIHNhdmUgYW5kIHJlc3RvcmUgaXRzZWxmLgorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKKworCQlmaW5hbCBCb29sZWFuRmllbGRFZGl0b3IgY3ljbGVQYXVzZUZpZWxkRWRpdG9yID0gbmV3IEJvb2xlYW5GaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlNJTVVMQVRJT05fU0xFRVBfQk9PTEVBTiwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIlNNUFBhZ2VQYXVzZSIpLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsgLy8kTk9OLU5MUy0xJAorCisJCWZpbmFsIEludGVnZXJGaWVsZEVkaXRvciBjeWNsZVBhdXNlU2Vjb25kc0ZpZWxkRWRpdG9yID0gbmV3IEludGVnZXJGaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlNJTVVMQVRJT05fU0xFRVBfTUlMTElTRUNPTkRTX0lOVEVHRVIsCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJTTVBQYWdlTVNUb1BhdXNlIiksIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOyAvLyROT04tTkxTLTEkCisJCWN5Y2xlUGF1c2VTZWNvbmRzRmllbGRFZGl0b3Iuc2V0VmFsaWRSYW5nZSgKKwkJCQlNSU5fU0lNVUxBVElPTl9TTEVFUF9NSUxMSVNFQ09ORFMsIE1BWF9TSU1VTEFUSU9OX1NMRUVQX01JTExJU0VDT05EUyk7CisJCWN5Y2xlUGF1c2VTZWNvbmRzRmllbGRFZGl0b3IKKwkJCQkuc2V0VGV4dExpbWl0KE1BWF9TSU1VTEFUSU9OX1NMRUVQX1NFQ09ORFNfTlVNX0RJR0lUUyk7CisJCWN5Y2xlUGF1c2VTZWNvbmRzRmllbGRFZGl0b3Iuc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmdldFN0cmluZygiU01QUGFnZTAiKSAvLyROT04tTkxTLTEkCisJCQkJKyBNSU5fU0lNVUxBVElPTl9TTEVFUF9NSUxMSVNFQ09ORFMgKyBNZXNzYWdlcy5nZXRTdHJpbmcoIlNNUFBhZ2VUTyIpIC8vJE5PTi1OTFMtMSQKKwkJCQkrIE1BWF9TSU1VTEFUSU9OX1NMRUVQX01JTExJU0VDT05EUyArIE1lc3NhZ2VzLmdldFN0cmluZygiU01QUGFnZVNFQ09ORFMiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlmaW5hbCBCb29sZWFuRmllbGRFZGl0b3IgcmVwb3J0RWFjaFVucmVzb2x2ZWRJZGVudGlmaWFibGVGaWVsZEVkaXRvciA9IG5ldyBCb29sZWFuRmllbGRFZGl0b3IoCisJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5SRVBPUlRfRUFDSF9VTlJFU09MVkVEX0lERU5USUZJQUJMRV9CT09MRUFOLAorCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiU01QUGFnZVJlcG9ydFVucmVzb2x2ZWQiKSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7IC8vJE5PTi1OTFMtMSQKKworCQlmaW5hbCBCb29sZWFuRmllbGRFZGl0b3IgcmVwb3J0RGFuZ2xpbmdBaXJUcmFuc3BvcnRFZGdlc0ZpZWxkRWRpdG9yID0gbmV3IEJvb2xlYW5GaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlJFUE9SVF9EQU5HTElOR19BSVJfVFJBTlBPUlRfRURHRVNfQk9PTEVBTiwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIlNNUFBhZ2VSZXBvcnRBaXJUcmFuc3BvcnQiKSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7IC8vJE5PTi1OTFMtMSQKKworCQlmaW5hbCBCb29sZWFuRmllbGRFZGl0b3IgcmVwb3J0TnVtYmVyT2ZVbnJlc29sdmVkSWRlbnRpZmlhYmxlc0ZpZWxkRWRpdG9yID0gbmV3IEJvb2xlYW5GaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlJFUE9SVF9OVU1CRVJfT0ZfVU5SRVNPTFZFRF9JREVOVElGSUFCTEVTX0JPT0xFQU4sCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJTTVBQYWdlUmVwb3J0TnVtVW5yZXNvbHZlZCIpLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJZmluYWwgQm9vbGVhbkZpZWxkRWRpdG9yIHVzZVNjZW5hcmlvc0NhY2hpbmcgPSBuZXcgQm9vbGVhbkZpZWxkRWRpdG9yKAorCQkJCVByZWZlcmVuY2VDb25zdGFudHMuVVNFX1NDRU5BUklPU19DQUNISU5HX0JPT0xFQU4sCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJTTVBQYWdlQ2FjaGVTY2VuYXJpb3MiKSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCisJCWFkZEZpZWxkKGN5Y2xlUGF1c2VGaWVsZEVkaXRvcik7CisJCWFkZEZpZWxkKGN5Y2xlUGF1c2VTZWNvbmRzRmllbGRFZGl0b3IpOworCQlhZGRGaWVsZChyZXBvcnRFYWNoVW5yZXNvbHZlZElkZW50aWZpYWJsZUZpZWxkRWRpdG9yKTsKKwkJYWRkRmllbGQocmVwb3J0RGFuZ2xpbmdBaXJUcmFuc3BvcnRFZGdlc0ZpZWxkRWRpdG9yKTsKKwkJYWRkRmllbGQocmVwb3J0TnVtYmVyT2ZVbnJlc29sdmVkSWRlbnRpZmlhYmxlc0ZpZWxkRWRpdG9yKTsKKwkJYWRkRmllbGQodXNlU2NlbmFyaW9zQ2FjaGluZyk7CisJfSAvLyBjcmVhdGVGaWVsZEVkaXRvcnMKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKS8vJE5PTi1OTFMtMSQKKwkJCUlXb3JrYmVuY2ggd29ya2JlbmNoKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKK30gLy8gU2ltdWxhdGlvbk1hbmFnZW1lbnRQcmVmZXJlbmNlUGFnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvcHJlZmVyZW5jZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3ByZWZlcmVuY2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0YWI0MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3ByZWZlcmVuY2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMiBAQAorIyBQcmVmZXJlbmNlTWVzc2FnZXMucHJvcGVydGllcworIworIyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqCisjICogQ29udHJpYnV0b3JzOgorIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NNUFBhZ2UwPUVycm9yOiBWYWxpZCByYW5nZSBpczogCitTTVBQYWdlQ2FjaGVTY2VuYXJpb3M9JlVzZSBzY2VuYXJpb3MgY2FjaGluZworU01QUGFnZU1TVG9QYXVzZT0mTWlsbGlTZWNvbmRzIHRvIHBhdXNlIGVhY2ggY3ljbGUKK1NNUFBhZ2VQYXVzZT0mUGF1c2Ugc2ltdWxhdGlvbiBhZnRlciBlYWNoIGN5Y2xlCitTTVBQYWdlUmVwb3J0TnVtVW5yZXNvbHZlZD0mUmVwb3J0IHRoZSBudW1iZXIgb2YgdW5yZXNvbHZlZCBsaW5rcworU01QUGFnZVJlcG9ydFVucmVzb2x2ZWQ9JlJlcG9ydCBhbGwgdW5yZXNvbHZlZCBsaW5rcworU01QUGFnZVJlcG9ydEFpclRyYW5zcG9ydD0mUmVwb3J0IHVucmVzb2x2ZWQgYWlyIHRyYW5zcG9ydCBsaW5rcworU01QUGFnZVNFQ09ORFM9XCBzZWNvbmRzCitTTVBQYWdlVElUTEU9U2ltdWxhdGlvbiBNYW5hZ2VtZW50IFByZWZlcmVuY2VzCitTTVBQYWdlVE89XCB0byAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vSVNpbXVsYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vSVNpbXVsYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWM3MDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9JU2ltdWxhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvLyBJU2ltdWxhdGlvbi5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCByZXByZXNlbnQge0BsaW5rIFNpbXVsYXRpb259cworICogb2Yge0BsaW5rIFNjZW5hcmlvfXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVNpbXVsYXRpb24gZXh0ZW5kcyBJRXhlY3V0YWJsZSB7CisKKwkvKioKKwkgKiBAcGFyYW0gc2VxdWVuY2VOdW1iZXIKKwkgKiAgICAgICAgICAgIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIHtAbGluayBTaW11bGF0aW9ufQorCSAqLworCXZvaWQgc2V0U2VxdWVuY2VOdW1iZXIoaW50IHNlcXVlbmNlTnVtYmVyKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0KKwkgKi8KKwlTaW11bGF0aW9uU3RhdGUgZ2V0U2ltdWxhdGlvblN0YXRlKCk7CisKKwkvKioKKwkgKiBTdGFydCBydW5uaW5nIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0uCisJICovCisJdm9pZCBydW4oKTsKKworCS8qKgorCSAqIFBhdXNlIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0KKwkgKi8KKwl2b2lkIHBhdXNlKCk7CisKKwkvKioKKwkgKiBSZXNldCB0aGUge0BsaW5rIFNpbXVsYXRpb259LgorCSAqLworCXZvaWQgcmVzZXQoKTsKKworCS8qKgorCSAqIFN0ZXAgdGhlIHtAbGluayBTaW11bGF0aW9ufSBvbmUgc3RlcC9jeWNsZSBpZiBpdCBoYXNuJ3QgYWxyZWFkeSBlbmRlZAorCSAqLworCXZvaWQgc3RlcCgpOworCisJLyoqCisJICogU3RvcCB0aGUge0BsaW5rIFNpbXVsYXRpb259CisJICovCisJdm9pZCBzdG9wKCk7CisKKwkvKioKKwkgKiBXYWl0IGZvciBleGVjdXRpb24gdG8gY29tcGxldGUuCisJICogCisJICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBqb2IgaXMgaW50ZXJydXB0ZWQKKwkgKi8KKwl2b2lkIGpvaW4oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247CisKKwkvKioKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGV4ZWN1dGlvbiBoYXMgYmVlbiBjYW5jZWxlZC4KKwkgKi8KKwlib29sZWFuIGNhbmNlbCgpOworCisJLyoqCisJICogQHJldHVybiB0aGUge0BsaW5rIFNjZW5hcmlvfSBiZWluZyBzaW11bGF0ZWQKKwkgKi8KKwlTY2VuYXJpbyBnZXRTY2VuYXJpbygpOworCisJLyoqCisJICogQWRkIGEge0BsaW5rIElTaW11bGF0aW9uTGlzdGVuZXJ9IHRvIHRob3NlIHRoYXQgd2lsbCBiZSBub3RpZmllZCBvZgorCSAqIGNoYW5nZXMuCisJICogCisJICogQHBhcmFtIHNpbXVsYXRpb25MaXN0ZW5lcgorCSAqLworCXZvaWQgYWRkU2ltdWxhdGlvbkxpc3RlbmVyKElTaW11bGF0aW9uTGlzdGVuZXIgc2ltdWxhdGlvbkxpc3RlbmVyKTsKKworCS8qKgorCSAqIFJlbW92ZSB7QGxpbmsgSVNpbXVsYXRpb25MaXN0ZW5lcn0gdG8gdGhvc2UgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIG9mCisJICogY2hhbmdlcy4KKwkgKiAKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbkxpc3RlbmVyCisJICovCisJdm9pZCByZW1vdmVTaW11bGF0aW9uTGlzdGVuZXIoSVNpbXVsYXRpb25MaXN0ZW5lciBzaW11bGF0aW9uTGlzdGVuZXIpOworCisJLyoqCisJICogQWRkIGEge0BsaW5rIElTaW11bGF0aW9uTGlzdGVuZXJ9IHRvIHRob3NlIHRoYXQgd2lsbCBiZSBub3RpZmllZCBvZgorCSAqIGNoYW5nZXMuCisJICogCisJICogQHBhcmFtIHNpbXVsYXRpb25MaXN0ZW5lcgorCSAqLworCXZvaWQgYWRkU2ltdWxhdGlvbkxpc3RlbmVyU3luYyhJU2ltdWxhdGlvbkxpc3RlbmVyU3luYyBzaW11bGF0aW9uTGlzdGVuZXIpOworCisJLyoqCisJICogUmVtb3ZlIHtAbGluayBJU2ltdWxhdGlvbkxpc3RlbmVyfSB0byB0aG9zZSB0aGF0IHdpbGwgYmUgbm90aWZpZWQgb2YKKwkgKiBjaGFuZ2VzLgorCSAqIAorCSAqIEBwYXJhbSBzaW11bGF0aW9uTGlzdGVuZXIKKwkgKi8KKwl2b2lkIHJlbW92ZVNpbXVsYXRpb25MaXN0ZW5lclN5bmMoSVNpbXVsYXRpb25MaXN0ZW5lclN5bmMgc2ltdWxhdGlvbkxpc3RlbmVyKTsKKworfSAvLyBJU2ltdWxhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9JU2ltdWxhdGlvbkxpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9zaW11bGF0aW9uL0lTaW11bGF0aW9uTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWY3MDMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9JU2ltdWxhdGlvbkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLy8gSVNpbXVsYXRpb25MaXN0ZW5lci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGVMaXN0ZW5lcjsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgd2FudCB0byBsaXN0ZW4gdG8gZXZlbnRzCisgKiBnZW5lcmF0ZWQgYnkgYSB7QGxpbmsgU2ltdWxhdGlvbn0uCisgKiAKKyAqIEBzZWUgSVNpbXVsYXRpb24KKyAqLworcHVibGljIGludGVyZmFjZSBJU2ltdWxhdGlvbkxpc3RlbmVyIGV4dGVuZHMgSUV4ZWN1dGFibGVMaXN0ZW5lciB7CisJLyoqCisJICogQHBhcmFtIGV2ZW50CisJICogICAgICAgICAgICB0aGUgZXZlbnQgdGhhdCByZWNvcmRzIHdoYXQgaGFwcGVuZWQgdG8gdGhlIHtAbGluayBTaW11bGF0aW9ufQorCSAqICAgICAgICAgICAgLgorCSAqLworCXZvaWQgc2ltdWxhdGlvbkNoYW5nZWQoU2ltdWxhdGlvbkV2ZW50IGV2ZW50KTsKK30gLy8gSVNpbXVsYXRpb25MaXN0ZW5lcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9JU2ltdWxhdGlvbkxpc3RlbmVyU3luYy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9JU2ltdWxhdGlvbkxpc3RlbmVyU3luYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MTI0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9zaW11bGF0aW9uL0lTaW11bGF0aW9uTGlzdGVuZXJTeW5jLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLy8gSVNpbXVsYXRpb25MaXN0ZW5lci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGVMaXN0ZW5lclN5bmM7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHdhbnQgdG8gbGlzdGVuIHRvIGV2ZW50cworICogZ2VuZXJhdGVkIGJ5IGEge0BsaW5rIFNpbXVsYXRpb259LiBUaGUgdGhyZWFkIHJ1bm5pbmcgdGhlIHtAbGluayBTaW11bGF0aW9ufQorICogd2lsbCB3YWl0IHVudGlsIHRoZSB7QGxpbmsgI3NpbXVsYXRpb25DaGFuZ2VkU3luYyhTaW11bGF0aW9uRXZlbnQpfSBtZXRob2QKKyAqIHJldHVybnMgYmVmb3JlIGl0IGNvbnRpbnVlcyBleGVjdXRpb24uCisgKiAKKyAqIEBzZWUgSVNpbXVsYXRpb24KKyAqLworcHVibGljIGludGVyZmFjZSBJU2ltdWxhdGlvbkxpc3RlbmVyU3luYyBleHRlbmRzIElFeGVjdXRhYmxlTGlzdGVuZXJTeW5jIHsKKwkvKioKKwkgKiBAcGFyYW0gZXZlbnQKKwkgKiAgICAgICAgICAgIHRoZSBldmVudCB0aGF0IHJlY29yZHMgd2hhdCBoYXBwZW5lZCB0byB0aGUge0BsaW5rIFNpbXVsYXRpb259LgorCSAqLworCXZvaWQgc2ltdWxhdGlvbkNoYW5nZWRTeW5jKFNpbXVsYXRpb25FdmVudCBldmVudCk7Cit9IC8vIElTaW11bGF0aW9uTGlzdGVuZXJTeW5jCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9zaW11bGF0aW9uL0lTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9zaW11bGF0aW9uL0lTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3YjcyYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vSVNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDMxIEBACisvLyBJU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGVNYW5hZ2VyTGlzdGVuZXI7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHdhbnQgdG8gYmUgaW5mb3JtZWQgb2YgZXZlbnRzCisgKiBnZW5lcmF0ZWQgYnkgYSB7QGxpbmsgU2ltdWxhdGlvbk1hbmFnZXJ9LgorICogCisgKiBAc2VlIFNpbXVsYXRpb25NYW5hZ2VyCisgKiBAc2VlIFNpbXVsYXRpb24KKyAqLworcHVibGljIGludGVyZmFjZSBJU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lciBleHRlbmRzIElFeGVjdXRhYmxlTWFuYWdlckxpc3RlbmVyIHsKKwkvKioKKwkgKiBAcGFyYW0gZXZlbnQKKwkgKiAgICAgICAgICAgIHRoZSBldmVudCB0aGF0IHJlY29yZHMgd2hhdCBoYXBwZW5lZCB0byB0aGUgbWFuYWdlci4KKwkgKi8KKwl2b2lkIHNpbXVsYXRpb25zQ2hhbmdlZChTaW11bGF0aW9uTWFuYWdlckV2ZW50IGV2ZW50KTsKKworfSAvLyBJU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9JU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lclN5bmMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vSVNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXJTeW5jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxZjZhMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vSVNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXJTeW5jLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLy8gSVNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlTWFuYWdlckxpc3RlbmVyU3luYzsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgd2FudCB0byBiZSBpbmZvcm1lZCBvZiBldmVudHMKKyAqIGdlbmVyYXRlZCBieSBhIHtAbGluayBTaW11bGF0aW9uTWFuYWdlcn0uIFRoZSB0aHJlYWQgcnVubmluZyB0aGUKKyAqIHtAbGluayBTaW11bGF0aW9uTWFuYWdlcn0gd2lsbCB3YWl0IHVudGlsIHRoZQorICoge0BsaW5rICNzaW11bGF0aW9uc0NoYW5nZWRTeW5jKFNpbXVsYXRpb25NYW5hZ2VyRXZlbnQpfSBtZXRob2QgcmV0dXJucyBiZWZvcmUKKyAqIGl0IGNvbnRpbnVlcyBleGVjdXRpb24uCisgKiAKKyAqIEBzZWUgU2ltdWxhdGlvbk1hbmFnZXIKKyAqIEBzZWUgU2ltdWxhdGlvbgorICovCitwdWJsaWMgaW50ZXJmYWNlIElTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyU3luYyBleHRlbmRzCisJCUlFeGVjdXRhYmxlTWFuYWdlckxpc3RlbmVyU3luYyB7CisJLyoqCisJICogQHBhcmFtIGV2ZW50CisJICogICAgICAgICAgICB0aGUgZXZlbnQgdGhhdCByZWNvcmRzIHdoYXQgaGFwcGVuZWQgdG8gdGhlIG1hbmFnZXIuCisJICovCisJdm9pZCBzaW11bGF0aW9uc0NoYW5nZWRTeW5jKFNpbXVsYXRpb25NYW5hZ2VyRXZlbnQgZXZlbnQpOworfSAvLyBJU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lclN5bmMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vTWVzc2FnZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzUyMzc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9NZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8vIE1lc3NhZ2VzLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlcyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKKwkJCS5nZXRCdW5kbGUoQlVORExFX05BTUUpOworCisJcHJpdmF0ZSBNZXNzYWdlcygpIHsKKwkJLy8gTm90aGluZworCX0KKworCS8qKgorCSAqIEBwYXJhbSBrZXkKKwkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSBrZXkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9Cit9IC8vIE1lc3NhZ2VzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9zaW11bGF0aW9uL1NpbXVsYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vU2ltdWxhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYzkzMTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9zaW11bGF0aW9uL1NpbXVsYXRpb24uamF2YQpAQCAtMCwwICsxLDY0OSBAQAorLy8gU2ltdWxhdGlvbi5qYXZhDQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbjsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5Qcm9wZXJ0eUNoYW5nZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db3JlUGx1Z2luOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLmltcGwuU2NlbmFyaW9JbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJvdmlkZXIuU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuQWN0aXZhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLkV4ZWN1dGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMucHJlZmVyZW5jZXMuU2ltdWxhdGlvbk1hbmFnZW1lbnRQcmVmZXJlbmNlUGFnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsNCisNCisvKioNCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIG1haW4gc2ltdWxhdGlvbiBsb2dpYyBvZiB0aGUgU1RFTSBzeXN0ZW0uIEl0IHJ1bnMNCisgKiBpbiB0aGUgYmFja2dyb3VuZCBhcyBhIHNlcGFyYXRlIHtAbGluayBKb2J9IGluIGVjbGlwc2UuDQorICovDQorcHVibGljIGNsYXNzIFNpbXVsYXRpb24gZXh0ZW5kcyBFeGVjdXRhYmxlIGltcGxlbWVudHMgSVNpbXVsYXRpb24sIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsNCisJLyoqDQorCSAqIFRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBJU2ltdWxhdGlvbkxpc3RlbmVyfSdzIHdhaXRpbmcgdG8gYmUgdG9sZCBhYm91dA0KKwkgKiB7QGxpbmsgU2ltdWxhdGlvbn0ncyBldmVudHMuDQorCSAqLw0KKwkvLyBJIHRoaW5rIHRoaXMgc2hvdWxkIHJlYWxseSBiZSBhIHtAbGluayBDb3B5T25Xcml0ZUFycmF5TGlzdH0gbGlrZSB7QGxpbmsNCisJLy8gI2xpc3RlbmVyc1N5bmN9DQorCXByaXZhdGUgZmluYWwgTGlzdDxJU2ltdWxhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMgPSBDb2xsZWN0aW9ucw0KKwkuc3luY2hyb25pemVkTGlzdChuZXcgQXJyYXlMaXN0PElTaW11bGF0aW9uTGlzdGVuZXI+KCkpOw0KKw0KKwkvKioNCisJICogVGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIElCYXRjaE1hbmFnZXJMaXN0ZW5lclN5bmN9J3Mgd2FpdGluZyB0byBiZSB0b2xkDQorCSAqIGFib3V0IHtAbGluayBCYXRjaE1hbmFnZXJFdmVudH0ncw0KKwkgKi8NCisJcHJpdmF0ZSBmaW5hbCBMaXN0PElTaW11bGF0aW9uTGlzdGVuZXJTeW5jPiBsaXN0ZW5lcnNTeW5jID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PElTaW11bGF0aW9uTGlzdGVuZXJTeW5jPigpOw0KKw0KKwkvKioNCisJICogSWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiB0aGUge0BsaW5rIFNpbXVsYXRpb259IHdpbGwgc2xlZXAgZm9yIGENCisJICogc3BlY2lmaWVkIHRpbWUgcGVyaW9kIGF0IHRoZSBlbmQgb2YgZWFjaCBzaW11bGF0aW9uIGN5Y2xlLg0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gc2ltdWxhdGlvblNsZWVwID0gU2ltdWxhdGlvbk1hbmFnZW1lbnRQcmVmZXJlbmNlUGFnZS5ERUZBVUxUX1NJTVVMQVRJT05fU0xFRVA7DQorDQorCS8qKg0KKwkgKiBJZiB7QGxpbmsgc2ltdWxhdGlvblNsZWVwfSBpcyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGlzIGlzIHRoZSBudW1iZXINCisJICogb2YgbWlsbGlzZWNvbmRzIGF0IHRoZSBlbmQgb2YgZWFjaCBjeWNsZSB0aGF0IHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0NCisJICogc2hvdWxkIHNsZWVwLg0KKwkgKi8NCisJcHJpdmF0ZSBpbnQgc2xlZXBNaWxsaXNlY29uZHMgPSBTaW11bGF0aW9uTWFuYWdlbWVudFByZWZlcmVuY2VQYWdlLk1JTl9TSU1VTEFUSU9OX1NMRUVQX01JTExJU0VDT05EUzsNCisNCisJLyoqDQorCSAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0uDQorCSAqLw0KKwlwcml2YXRlIFNpbXVsYXRpb25TdGF0ZSBzaW11bGF0aW9uU3RhdGU7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSB7QGxpbmsgU2NlbmFyaW99IGJlaW5nIHNpbXVsYXRlZC4gSXQgY29udGFpbnMgYWxsIG9mIHRoZQ0KKwkgKiB7QGxpbmsgU2ltdWxhdGlvblN0YXRlfSBpbmZvcm1hdGlvbi4NCisJICovDQorCXByaXZhdGUgU2NlbmFyaW8gc2NlbmFyaW8gPSBudWxsOw0KKw0KKwlwcml2YXRlIEFkYXB0ZXIgYWRhcHRlciA9IG51bGw7IA0KKw0KKwkvKioNCisJICogVGhpcyBmbGFnIGNvbnRyb2xzIHRoZSBleGVjdXRpb24gb2YgdGhlIHtAbGluayBTaW11bGF0aW9ufS4gSWYgaXQgaXMNCisJICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0gc3RvcHMgcnVubmluZyAoc2xlZXBzKSBvbiB0aGUNCisJICogbmV4dCBjeWNsZS4NCisJICogDQorCSAqIEBzZWUgI3BhdXNlKCkNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBrZWVwUnVubmluZyA9IHRydWU7DQorDQorCS8qKg0KKwkgKiBUaGlzIGZsYWcgY29udHJvbHMgdGhlIHN0YXRlIG9mIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0uIElmDQorCSAqIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gdGhlIHtAbGluayBTaW11bGF0aW9ufSBpcyBzdG9wcGVkIGlmIGl0IGlzIHJ1bm5pbmcNCisJICogYW5kIHRoZSB7QGxpbmsgU2NlbmFyaW99IGlzIHJlc2V0IHRvIGl0cyBpbml0aWFsIHN0YXRlLiBUaGUNCisJICoge0BsaW5rIFNpbXVsYXRpb259IGRvZXMgTk9UIHJlc3VtZSBydW5uaW5nIGFmdGVyIHRoZSByZXNldC4NCisJICogDQorCSAqIEBzZWUgI3Jlc2V0U2ltdWxhdGlvbigpDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gcmVzZXQgPSBmYWxzZTsNCisNCisJLyoqDQorCSAqIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUge0BsaW5rIFNpbXVsYXRpb259IHNob3VsZCBjb21wbGV0ZSBhIHNpbmdsZQ0KKwkgKiBzdGVwIChjeWNsZSkgYW5kIHRoZW4gcGF1c2UuDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gc3RlcHBpbmcgPSBmYWxzZTsNCisNCisJLyoqDQorCSAqIElmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gdGhlIHtAbGluayBTaW11bGF0aW9ufSBpcyBzdG9wcGluZw0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIHN0b3BwaW5nID0gZmFsc2U7DQorDQorCVNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnkgc2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSA9IG5ldyBTY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7DQorCS8qKg0KKwkgKiBDb25zdHJ1Y3Rvcg0KKwkgKiANCisJICogQHBhcmFtIHRpdGxlDQorCSAqICAgICAgICAgICAgdGhlIHRpdGxlIG9mIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0uDQorCSAqIEBwYXJhbSBzZXF1ZW5jZU51bWJlcg0KKwkgKiAgICAgICAgICAgIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIHtAbGluayBTaW11bGF0aW9ufQ0KKwkgKi8NCisJcHVibGljIFNpbXVsYXRpb24oZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBpbnQgc2VxdWVuY2VOdW1iZXIpIHsNCisJCXN1cGVyKHRpdGxlID09IG51bGwgPyAiIiA6IHRpdGxlLCBzZXF1ZW5jZU51bWJlcik7IC8vJE5PTi1OTFMtMSQNCisJCXNpbXVsYXRpb25TdGF0ZSA9IFNpbXVsYXRpb25TdGF0ZS5QQVVTRUQ7DQorCX0gLy8gU2ltdWxhdGlvbg0KKw0KKwkvKioNCisJICogQ29uc3RydWN0b3INCisJICogDQorCSAqIEBwYXJhbSBzY2VuYXJpbw0KKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgU2NlbmFyaW99IHRvIHNpbXVsYXRlDQorCSAqIEBwYXJhbSBzZXF1ZW5jZU51bWJlcg0KKwkgKiAgICAgICAgICAgIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIHtAbGluayBTaW11bGF0aW9ufQ0KKwkgKi8NCisJcHVibGljIFNpbXVsYXRpb24oZmluYWwgU2NlbmFyaW8gc2NlbmFyaW8sIGZpbmFsIGludCBzZXF1ZW5jZU51bWJlcikgew0KKwkJdGhpcyhzY2VuYXJpby5wcm9kdWNlVGl0bGUoKSwgc2VxdWVuY2VOdW1iZXIpOw0KKwkJdGhpcy5zY2VuYXJpbyA9IHNjZW5hcmlvOw0KKwkJc2V0UHJlZmVyZW5jZXMoKTsNCisNCisJCUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOw0KKwl9IC8vIFNpbXVsYXRpb24NCisNCisJLyoqDQorCSAqIFNldCB0aGUgcHJlZmVyZW5jZXMuDQorCSAqIA0KKwkgKiBAc2VlICNzaW11bGF0aW9uU2xlZXANCisJICogQHNlZSAjc2xlZXBNaWxsaXNlY29uZHMNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFByZWZlcmVuY2VzKCkgew0KKwkJZmluYWwgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpDQorCQkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsNCisJCXNpbXVsYXRpb25TbGVlcCA9IHByZWZlcmVuY2VzDQorCQkuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlNJTVVMQVRJT05fU0xFRVBfQk9PTEVBTik7DQorCQlzbGVlcE1pbGxpc2Vjb25kcyA9IHByZWZlcmVuY2VzDQorCQkuZ2V0SW50KFByZWZlcmVuY2VDb25zdGFudHMuU0lNVUxBVElPTl9TTEVFUF9NSUxMSVNFQ09ORFNfSU5URUdFUik7DQorCQlTY2VuYXJpb0ltcGwucmVwb3J0RWFjaFVucmVzb2x2ZWRJZGVudGlmaWFibGUgPSBwcmVmZXJlbmNlcw0KKwkJLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5SRVBPUlRfRUFDSF9VTlJFU09MVkVEX0lERU5USUZJQUJMRV9CT09MRUFOKTsNCisJCVNjZW5hcmlvSW1wbC5yZXBvcnREYW5nbGluZ0FpclRyYW5zcG9ydEVkZ2VzID0gcHJlZmVyZW5jZXMNCisJCS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUkVQT1JUX0RBTkdMSU5HX0FJUl9UUkFOUE9SVF9FREdFU19CT09MRUFOKTsNCisNCisJCVNjZW5hcmlvSW1wbC5yZXBvcnROdW1iZXJvZlVucmVzb2x2ZWRJZGVudGlmaWFibGVzID0gcHJlZmVyZW5jZXMNCisJCS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUkVQT1JUX05VTUJFUl9PRl9VTlJFU09MVkVEX0lERU5USUZJQUJMRVNfQk9PTEVBTik7DQorDQorCX0gLy8gc2V0UGVyZmVyZW5jZXMNCisNCisJLyoqDQorCSAqIEByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0NCisJICovDQorCXB1YmxpYyBmaW5hbCBTaW11bGF0aW9uU3RhdGUgZ2V0U2ltdWxhdGlvblN0YXRlKCkgew0KKwkJcmV0dXJuIHNpbXVsYXRpb25TdGF0ZTsNCisJfSAvLyBnZXRTaW11bGF0aW9uU3RhdGUNCisNCisJLyoqDQorCSAqIEBwYXJhbSBzaW11bGF0aW9uU3RhdGUNCisJICogICAgICAgICAgICB0aGUge0BsaW5rIFNpbXVsYXRpb25TdGF0ZX0gdG8gc2V0DQorCSAqLw0KKwlwcml2YXRlIGZpbmFsIHZvaWQgc2V0U2ltdWxhdGlvblN0YXRlKGZpbmFsIFNpbXVsYXRpb25TdGF0ZSBzaW11bGF0aW9uU3RhdGUpIHsNCisJCXRoaXMuc2ltdWxhdGlvblN0YXRlID0gc2ltdWxhdGlvblN0YXRlOw0KKwkJZmlyZVNpbXVsYXRpb25DaGFuZ2VkKHNpbXVsYXRpb25TdGF0ZSk7DQorCX0gLy8gc2V0U2ltdWxhdGlvblN0YXRlDQorDQorCS8qKg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIElTdGF0dXMgcnVuKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KKwkJSVN0YXR1cyByZXRWYWx1ZSA9IFN0YXR1cy5PS19TVEFUVVM7DQorDQorCQl0cnkgew0KKwkJCXNldFNpbXVsYXRpb25TdGF0ZShTaW11bGF0aW9uU3RhdGUuUlVOTklORyk7DQorDQorCQkJa2VlcFJ1bm5pbmcgPSB0cnVlOw0KKw0KKwkJCS8vIERpZCB3ZSBnZXQgYSByZXF1ZXN0IHRvIHJlc2V0Pw0KKwkJCWlmIChyZXNldCkgew0KKwkJCQkvLyBZZXMNCisJCQkJc2NlbmFyaW8ucmVzZXQoKTsNCisJCQkJcmVzZXQgPSBmYWxzZTsNCisJCQl9DQorDQorCQkJYXNzZXJ0IHNjZW5hcmlvLnNhbmUoKTsNCisNCisJCQltb25pdG9yLmJlZ2luVGFzayhzY2VuYXJpby5wcm9kdWNlVGl0bGUoKSwgVE9UQUxfV09SSyk7DQorCQkJZmluYWwgU2VxdWVuY2VyIHNlcXVlbmNlciA9IHNjZW5hcmlvLmdldFNlcXVlbmNlcigpOw0KKw0KKwkJCS8vIEZpZ3VyZSBvdXQgaG93IG11Y2ggd29yayBoYXMgYmVlbiBwZXJmb3JtZWQgZm9yIHRoaXMgc2NlbmFyaW8NCisJCQkvLyBhbHJlYWR5Lg0KKwkJCS8vICRBTkFMWVNJUy1JR05PUkUNCisJCQltb25pdG9yLndvcmtlZCgoaW50KSBzZXF1ZW5jZXIuZ2V0V29ya0NvbXBsZXRlKCkpOw0KKwkJCWZpbmFsIFNpbXVsYXRpb24gc2VsZiA9IHRoaXM7DQorCQkJYWRhcHRlciA9IG5ldyBBZGFwdGVySW1wbCgpIHsNCisJCQkJLyoqDQorCQkJCSAqIEBvdmVycmlkZQ0KKwkJCQkgKi8NCisJCQkJQE92ZXJyaWRlDQorCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykNCisJCQkJew0KKwkJCQkJU2NlbmFyaW8gc2NlbmFyaW8gPSAoU2NlbmFyaW8pbXNnLmdldE5vdGlmaWVyKCk7DQorCQkJCQlzd2l0Y2gobXNnLmdldEZlYXR1cmVJRChTY2VuYXJpby5jbGFzcykpIHsNCisJCQkJCWNhc2UgU2NlbmFyaW9QYWNrYWdlLlNDRU5BUklPX19QUk9HUkVTUzoNCisJCQkJCQlTaW11bGF0aW9uRXZlbnQgZXZlbnQgPSBuZXcgU2ltdWxhdGlvbkV2ZW50KHNlbGYsIFNpbXVsYXRpb25TdGF0ZS5SVU5OSU5HLCBzY2VuYXJpby5nZXRQcm9ncmVzcygpKTsNCisJCQkJCQlzZWxmLmZpcmVTaW11bGF0aW9uQ2hhbmdlZEV2ZW50KGV2ZW50KTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisNCisJCQkJfQ0KKwkJCX07IA0KKwkJCXNjZW5hcmlvLmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsNCisJCQkvL1NjZW5hcmlvSXRlbVByb3ZpZGVyIHNpcCA9IChTY2VuYXJpb0l0ZW1Qcm92aWRlcilzY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmFkYXB0KHRoaXMsIFNjZW5hcmlvSXRlbVByb3ZpZGVyLmNsYXNzKTsNCisNCisJCQkvL3NjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuYWRkTGlzdGVuZXIodGhpcyk7IC8vIHVnaA0KKw0KKwkJCS8vIERvZXMgdGhlIHNlcXVlbmNlciBzYXkgd2UndmUgZmluaXNoZWQgYmVmb3JlIHdlJ3ZlIHN0YXJ0ZWQ/DQorCQkJaWYgKCFzZXF1ZW5jZXIuaXNUaW1lVG9TdG9wKCkpIHsNCisJCQkJLy8gTm8NCisJCQkJd2hpbGUgKGtlZXBSdW5uaW5nICYmICFyZXNldCkgew0KKwkJCQkJZmluYWwgU1RFTVRpbWUgY3VycmVudFRpbWUgPSBzZXF1ZW5jZXIuZ2V0Q3VycmVudFRpbWUoKTsNCisJCQkJCW1vbml0b3Iuc3ViVGFzayhjdXJyZW50VGltZS50b1N0cmluZygpKTsNCisNCisJCQkJCS8vIEF0dGVtcHQgb25lIHN0ZXAgKGN5Y2xlKSBpbiB0aGUgc2ltdWxhdGlvbg0KKwkJCQkJdHJ5IHsNCisJCQkJCQlpZihzY2VuYXJpby5nZXRDYW5vbmljYWxHcmFwaCgpID09IG51bGwpDQorCQkJCQkJCXNjZW5hcmlvLmluaXRpYWxpemUoKTsNCisNCisJCQkJCQlpZihzY2VuYXJpby5nZXRTb2x2ZXIoKSA9PSBudWxsKSB7DQorCQkJCQkJCVNvbHZlciBbXSBzb2x2ZXJzID0gdGhpcy5nZXRTb2x2ZXJzKCk7DQorCQkJCQkJCS8vIFVzZSB0aGUgZGVmYXVsdCBmaW5pdGUgZGlmZmVyZW5jZSB3aGVuIG5vdCBhdmFpbGFibGUNCisJCQkJCQkJZm9yKFNvbHZlciBzOnNvbHZlcnMpDQorCQkJCQkJCQlpZihzLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygib3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLmltcGwuRmluaXRlRGlmZmVyZW5jZUltcGwiKSkNCisJCQkJCQkJCXtzY2VuYXJpby5zZXRTb2x2ZXIocyk7YnJlYWs7fQ0KKw0KKwkJCQkJCX0NCisJCQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlY29yYXRvcnMgYXJlIHNldCBvbiB0aGUgc29sdmVyDQorCQkJCQkJaWYoc2NlbmFyaW8uZ2V0U29sdmVyKCkuZ2V0RGVjb3JhdG9ycygpID09IG51bGwpIHNjZW5hcmlvLmdldFNvbHZlcigpLnNldERlY29yYXRvcnMoc2NlbmFyaW8uZ2V0Q2Fub25pY2FsR3JhcGgoKS5nZXREZWNvcmF0b3JzKCkpOw0KKw0KKwkJCQkJCWlmKCFzY2VuYXJpby5nZXRTb2x2ZXIoKS5pc0luaXRpYWxpemVkKCkpIHsNCisJCQkJCQkJc2NlbmFyaW8uZ2V0U29sdmVyKCkuaW5pdGlhbGl6ZShzY2VuYXJpby5nZXRTZXF1ZW5jZXIoKS5nZXROZXh0VGltZSgpKTsNCisJCQkJCQkJc2V0U2ltdWxhdGlvblN0YXRlKFNpbXVsYXRpb25TdGF0ZS5DT01QTEVURURfQ1lDTEUpOyAvLyBTbyB0aGF0IGxvZyBpcyB3cml0dGVuIHdpdGggaW5pdGlhbCB2YWx1ZXMNCisJCQkJCQl9DQorDQorCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gc2NlbmFyaW8uc3RlcCgpOw0KKwkJCQkJCWlmKCFzdWNjZXNzKSB7a2VlcFJ1bm5pbmcgPSBmYWxzZTtyZXRWYWx1ZSA9IFN0YXR1cy5DQU5DRUxfU1RBVFVTO30NCisJCQkJCQlhc3NlcnQgc2NlbmFyaW8uc2FuZSgpOw0KKw0KKwkJCQkJCS8vIFRvIHNsZWVwLCBwZXIgY2hhbmNlIHRvIGRyZWFtPw0KKwkJCQkJCWlmIChzaW11bGF0aW9uU2xlZXApIHsNCisJCQkJCQkJLy8gWWVzDQorCQkJCQkJCVRocmVhZC5zbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7DQorCQkJCQkJfQ0KKw0KKwkJCQkJCW1vbml0b3Iud29ya2VkKHNlcXVlbmNlci5nZXRXb3JrSW5jcmVtZW50KCkpOw0KKw0KKwkJCQkJCS8vIFdlIHN0b3Agd2hlbiB0aGUgc2VxdWVuY2VyIHRlbGxzIHVzIGl0IGlzIHRpbWUNCisJCQkJCQlpZiAoc2VxdWVuY2VyLmlzVGltZVRvU3RvcCgpKSB7DQorCQkJCQkJCWtlZXBSdW5uaW5nID0gZmFsc2U7DQorCQkJCQkJCXJldFZhbHVlID0gU3RhdHVzLk9LX1NUQVRVUzsNCisJCQkJCQl9DQorCQkJCQkJLy8gT3IsIGlmIHRoaW5ncyBhcmUgY2FuY2VsZWQNCisJCQkJCQllbHNlIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgew0KKwkJCQkJCQlrZWVwUnVubmluZyA9IGZhbHNlOw0KKwkJCQkJCQlyZXRWYWx1ZSA9IFN0YXR1cy5DQU5DRUxfU1RBVFVTOw0KKwkJCQkJCX0NCisJCQkJCQkvLyBPciwgaWYgd2UncmUgc3RlcHBpbmcNCisJCQkJCQllbHNlIGlmIChzdGVwcGluZykgew0KKwkJCQkJCQlrZWVwUnVubmluZyA9IGZhbHNlOw0KKwkJCQkJCX0NCisNCisJCQkJCX0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7DQorCQkJCQkJLy8gUHJvYmxlbS4gV2UncmUgb3V0IG9mIGhlcmUuDQorCQkJCQkJaGFuZGxlRXhjZXB0aW9uKHNjZW5hcmlvLCBnZXROYW1lKCksIHRydWUsIGUpOw0KKwkJCQkJCWtlZXBSdW5uaW5nID0gZmFsc2U7DQorCQkJCQkJc3RvcHBpbmcgPSB0cnVlOw0KKwkJCQkJCXJldFZhbHVlID0gU3RhdHVzLkNBTkNFTF9TVEFUVVM7DQorCQkJCQl9DQorCQkJCQlzZXRTaW11bGF0aW9uU3RhdGUoU2ltdWxhdGlvblN0YXRlLkNPTVBMRVRFRF9DWUNMRSk7DQorCQkJCX0gLy8gd2hpbGUga2VlcFJ1bm5pbmcNCisNCisJCQkJLy8gV2FzIGl0IHRpbWUgdG8gc3RvcD8NCisJCQkJaWYgKHNlcXVlbmNlci5pc1RpbWVUb1N0b3AoKSAmJiByZXRWYWx1ZSA9PSBTdGF0dXMuT0tfU1RBVFVTKSB7DQorCQkJCQkvLyBZZXMNCisJCQkJCXNldFNpbXVsYXRpb25TdGF0ZShTaW11bGF0aW9uU3RhdGUuQ09NUExFVEVEX1NFUVVFTkNFKTsNCisJCQkJfQ0KKwkJCX0gLy8gaWYgTk9UIHRpbWUgdG8gc3RvcCBiZWZvcmUgd2Ugc3RhcnQNCisJCQllbHNlIHsNCisJCQkJLy8gWWVzDQorCQkJCS8vIFRoZSBzZXF1ZW5jZXIgc2F5cyB3ZSd2ZSBmaW5pc2hlZCBiZWZvcmUgd2Ugc3RhcnRlZA0KKwkJCQlBY3RpdmF0b3IubG9nSW5mb3JtYXRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoTWVzc2FnZXMNCisJCQkJCQkuZ2V0U3RyaW5nKCJTaW0uVGltZV9FcnJvciIpLCBzZXF1ZW5jZXINCisJCQkJCQkuZ2V0Q3VycmVudFRpbWUoKS50b1N0cmluZygpLCBzZXF1ZW5jZXIuZ2V0RW5kVGltZSgpDQorCQkJCQkJLnRvU3RyaW5nKCkpLCBudWxsKTsNCisJCQl9IC8vIGVsc2UNCisNCisJCQkvLyBEaWQgd2UgZ2V0IGEgcmVxdWVzdCB0byByZXNldD8NCisJCQlpZiAocmVzZXQpIHsNCisJCQkJLy8gWWVzDQorCQkJCXNjZW5hcmlvLnJlc2V0KCk7DQorCQkJCXJlc2V0ID0gZmFsc2U7DQorCQkJCXNldFNpbXVsYXRpb25TdGF0ZShTaW11bGF0aW9uU3RhdGUuUkVTRVQpOw0KKwkJCX0NCisNCisJCQltb25pdG9yLmRvbmUoKTsNCisNCisJCX0gY2F0Y2ggKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gZSkgew0KKwkJCWhhbmRsZUV4Y2VwdGlvbihzY2VuYXJpbywgZ2V0TmFtZSgpLCB0cnVlLCBlKTsNCisJCQlzdG9wcGluZyA9IHRydWU7DQorCQl9IC8vIGNhdGNoIFJ1bnRpbWVFeGNlcHRpb24NCisNCisJCS8vIEFyZSB3ZSBzdG9wcGluZyBvciBqdXN0IHBhdXNpbmc/DQorCQlzZXRTaW11bGF0aW9uU3RhdGUoc3RvcHBpbmcgPyBTaW11bGF0aW9uU3RhdGUuU1RPUFBFRA0KKwkJCQk6IFNpbXVsYXRpb25TdGF0ZS5QQVVTRUQpOw0KKw0KKwkJcmV0dXJuIHJldFZhbHVlOw0KKw0KKwl9IC8vIHJ1bg0KKw0KKwkvKioNCisJICogRG8gdGhlIHByb2Nlc3NpbmcgcmVxdWlyZWQgdG8gaGFuZGxlIGEge0BsaW5rIEV4Y2VwdGlvbn0NCisJICogDQorCSAqIEBwYXJhbSBzY2VuYXJpbw0KKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgU2NlbmFyaW99IHRoYXQgY2F1c2VkIHRoZSB7QGxpbmsgRXhjZXB0aW9ufQ0KKwkgKiBAcGFyYW0gbmFtZQ0KKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIHRvIHVzZSBpbiBlcnJvciBtZXNzYWdlcyB0aGF0IGlkZW50aWZpZXMgdGhlIHNvdXJjZQ0KKwkgKiAgICAgICAgICAgIG9mIHRoZSB7QGxpbmsgU2NlbmFyaW99DQorCSAqIEBwYXJhbSBwcm9tcHRVc2VyDQorCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBwcmVzZW50IHRoZSB1c2VyIHdpdGggYSBkaWFsb2cgYm94DQorCSAqICAgICAgICAgICAgZXhwbGFpbmluZyB0aGUgbWVzc2FnZS4NCisJICogQHBhcmFtIGUNCisJICogICAgICAgICAgICB0aGUge0BsaW5rIEV4Y2VwdGlvbn0NCisJICovDQorCXN0YXRpYyBwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oZmluYWwgU2NlbmFyaW8gc2NlbmFyaW8sDQorCQkJZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIGJvb2xlYW4gcHJvbXB0VXNlciwgZmluYWwgRXhjZXB0aW9uIGUpIHsNCisNCisJCS8vIFdlIGNhbiBnZXQgYSBleGNlcHRpb24gaWYgdGhlIHVzZXIgdHJpZXMgdG8gcnVuIGEgU2NlbmFyaW8NCisJCS8vIHRoYXQgZG9lc24ndCBoYXZlIGEgU2VxdWVuY2VyIG9yIE1vZGVsIHNwZWNpZmllZC4gT3IsIHdlIGNhbiBnZXQgb25lDQorCQkvLyBiZWNhdXNlIG9mIHNvbWUgb3RoZXIgaW50ZXJuYWwgZXJyb3IuDQorDQorCQlTdHJpbmcgdGVtcEVycm9yTWVzc2FnZSA9ICIiOw0KKw0KKwkJYm9vbGVhbiBsb2dJdCA9IGZhbHNlOw0KKw0KKwkJLy8gUG90ZW50aWFsIG1pc3NpbmcgU2VxdWVuY2VyIG9yIE1vZGVsPw0KKwkJaWYgKGUgaW5zdGFuY2VvZiBOdWxsUG9pbnRlckV4Y2VwdGlvbikgew0KKwkJCS8vIFllcw0KKwkJCS8vIERvZXMgdGhlIFNjZW5hcmlvIGhhdmUgYSBTZXF1ZW5jZXI/DQorCQkJaWYgKHNjZW5hcmlvLmdldFNlcXVlbmNlcigpID09IG51bGwpIHsNCisJCQkJLy8gTm8NCisJCQkJdGVtcEVycm9yTWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1lc3NhZ2VzDQorCQkJCQkJLmdldFN0cmluZygiU2ltLk1pc3NpbmdTZXEiKSwgbmV3IE9iamVjdFtdIHsgbmFtZSB9KTsNCisJCQl9IC8vIGlmIG1pc3NpbmcgYSBzZXF1ZW5jZXINCisJCQkvLyBIb3cgYWJvdXQgYSBtb2RlbD8NCisJCQllbHNlIGlmIChzY2VuYXJpby5nZXRNb2RlbCgpID09IG51bGwpIHsNCisJCQkJLy8gTm8NCisJCQkJdGVtcEVycm9yTWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1lc3NhZ2VzDQorCQkJCQkJLmdldFN0cmluZygiU2ltLk1pc3NpbmdNb2RlbCIpLCBuZXcgT2JqZWN0W10geyBuYW1lIH0pOw0KKwkJCX0gLy8gaWYgbWlzc2luZyBtb2RlbA0KKwkJCWVsc2Ugew0KKwkJCQkvLyBObw0KKwkJCQkvLyBKdXN0IHNvbWUgb3RoZXIgTlBFDQorCQkJCWxvZ0l0ID0gdHJ1ZTsNCisJCQkJdGVtcEVycm9yTWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1lc3NhZ2VzDQorCQkJCQkJLmdldFN0cmluZygiU2ltLklFcnIiKSwgbmV3IE9iamVjdFtdIHsgbmFtZSB9KTsNCisJCQl9IC8vIGVsc2UNCisJCX0gLy8gaWYgTnVsbFBvaW50ZXJFeGNlcHRpb24NCisJCWVsc2Ugew0KKwkJCS8vIE5vDQorCQkJbG9nSXQgPSB0cnVlOw0KKwkJCXRlbXBFcnJvck1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChNZXNzYWdlcw0KKwkJCQkJLmdldFN0cmluZygiU2ltLklFcnIiKSwgbmV3IE9iamVjdFtdIHsgbmFtZSB9KTsNCisJCX0gLy8gZWxzZQ0KKw0KKwkJZmluYWwgU3RyaW5nIGVycm9yTWVzc2FnZSA9IHRlbXBFcnJvck1lc3NhZ2U7DQorDQorCQkvLyBMb2cgaXQ/DQorCQlpZiAobG9nSXQgfHwgIXByb21wdFVzZXIpIHsNCisJCQkvLyBZZXMNCisJCQlBY3RpdmF0b3IubG9nRXJyb3IoZXJyb3JNZXNzYWdlLCBlKTsNCisJCX0gLy8gaWYNCisNCisJCS8vIFByb21wdCB0aGUgdXNlcj8NCisJCWlmIChwcm9tcHRVc2VyKSB7DQorCQkJLy8gWWVzDQorCQkJdHJ5IHsNCisJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCXRyeSB7DQorCQkJCQkJCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSQ0KKwkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7DQorCQkJCQkJCWZpbmFsIElTdGF0dXMgd2FybmluZyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLA0KKwkJCQkJCQkJCUFjdGl2YXRvci5QTFVHSU5fSUQsIDEsIGVycm9yTWVzc2FnZSwgbnVsbCk7DQorCQkJCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcih3aW5kb3cuZ2V0U2hlbGwoKSwgbnVsbCwgbnVsbCwNCisJCQkJCQkJCQl3YXJuaW5nKTsNCisJCQkJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7DQorCQkJCQkJCS8vIElmIHdlIGdldCB0aGlzIGV4Y2VwdGlvbiwgaXQgaXMgYmVjYXVzZSB3ZSdyZSBub3QgcnVubmluZyBpbg0KKwkJCQkJCQkvLyBlY2xpcHNlLg0KKwkJCQkJCX0NCisJCQkJCX0gLy8gcnVuDQorCQkJCX0pOw0KKwkJCX0gY2F0Y2ggKGZpbmFsIEVycm9yIG5jZGZlKSB7DQorCQkJCS8vIEVtcHR5DQorCQkJfSAvLyBjYXRjaA0KKwkJfSAvLyBpZg0KKwl9IC8vIGhhbmRsZVJ1bnRpbWVFeGNlcHRpb24NCisNCisJLyoqDQorCSAqIFN0YXJ0IHJ1bm5pbmcgdGhlIHtAbGluayBTaW11bGF0aW9ufS4NCisJICovDQorCXB1YmxpYyBmaW5hbCB2b2lkIHJ1bigpIHsNCisJCXN0ZXBwaW5nID0gZmFsc2U7DQorCQlzY2hlZHVsZSgpOw0KKwl9IC8vIHJ1bg0KKw0KKwkvKioNCisJICogUGF1c2UgdGhlIHtAbGluayBTaW11bGF0aW9ufQ0KKwkgKi8NCisJcHVibGljIGZpbmFsIHZvaWQgcGF1c2UoKSB7DQorCQlrZWVwUnVubmluZyA9IGZhbHNlOw0KKwl9IC8vIHBhdXNlDQorDQorCS8qKg0KKwkgKiBSZXNldCB0aGUge0BsaW5rIFNpbXVsYXRpb259Lg0KKwkgKi8NCisJcHVibGljIGZpbmFsIHZvaWQgcmVzZXQoKSB7DQorCQlyZXNldCA9IHRydWU7DQorCQlzdGVwcGluZyA9IGZhbHNlOw0KKwkJLy8gSXMgdGhlIHNpbXVsYXRpb24gY3VycmVudGx5IHBhdXNlZD8NCisJCWlmIChnZXRTaW11bGF0aW9uU3RhdGUoKS5lcXVhbHMoU2ltdWxhdGlvblN0YXRlLlBBVVNFRCkpIHsNCisJCQkvLyBZZXMNCisJCQlzY2VuYXJpby5yZXNldCgpOw0KKwkJCXJlc2V0ID0gZmFsc2U7DQorCQkJc2V0U2ltdWxhdGlvblN0YXRlKFNpbXVsYXRpb25TdGF0ZS5SRVNFVCk7DQorCQkJc2V0U2ltdWxhdGlvblN0YXRlKFNpbXVsYXRpb25TdGF0ZS5QQVVTRUQpOw0KKwkJfSAvLyBpZg0KKwl9IC8vIHJlc2V0DQorDQorCS8qKg0KKwkgKiBTdGVwIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0gb25lIHN0ZXAvY3ljbGUgaWYgaXQgaGFzbid0IGFscmVhZHkgZW5kZWQNCisJICovDQorCXB1YmxpYyBmaW5hbCB2b2lkIHN0ZXAoKSB7DQorCQlzdGVwcGluZyA9IHRydWU7DQorCQlzY2hlZHVsZSgpOw0KKwl9IC8vIHN0ZXBTaW11bGF0aW9uDQorDQorCS8qKg0KKwkgKiBTdG9wIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0uDQorCSAqLw0KKwlwdWJsaWMgZmluYWwgdm9pZCBzdG9wKCkgew0KKwkJc3RvcHBpbmcgPSB0cnVlOw0KKwkJa2VlcFJ1bm5pbmcgPSBmYWxzZTsNCisJCS8vIFdlIG5lZWQgdG8gc2V0IG91ciBzdGF0ZSBoZXJlLCB3aGljaCB3aWxsIG5vdGlmeSBvdXIgbGlzdGVuZXJzLA0KKwkJLy8gYmVjYXVzZSB3ZSBtYXkgbm90IGJlIHNjaGVkdWxlZCBhbmQgc28gdGhlIHJ1bihJUHJvZ3Jlc3NNb25pdG9yKQ0KKwkJLy8gbWV0aG9kIG1heSBub3QgYmUgZXhlY3V0aW5nIGFuZCBzbyB3b3VsZCBub3Qgc2V0IHRoZSBzdGF0ZSB0byBTVE9QUEVEDQorCQkvLyAoYW5kIHRodXMgbm90aWZ5IGxpc3RlbmVycykNCisJCXNldFNpbXVsYXRpb25TdGF0ZShTaW11bGF0aW9uU3RhdGUuU1RPUFBFRCk7DQorCX0gLy8gc3RlcFNpbXVsYXRpb24NCisNCisJLyoqDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZSNpc1J1bm5pbmcoKQ0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkgew0KKwkJcmV0dXJuICFzaW11bGF0aW9uU3RhdGUuZXF1YWxzKFNpbXVsYXRpb25TdGF0ZS5QQVVTRUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgU2NlbmFyaW99DQorCSAqLw0KKwlwdWJsaWMgZmluYWwgU2NlbmFyaW8gZ2V0U2NlbmFyaW8oKSB7DQorCQlyZXR1cm4gdGhpcy5zY2VuYXJpbzsNCisJfQ0KKw0KKwkvKioNCisJICogQHBhcmFtIHNjZW5hcmlvDQorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBTY2VuYXJpb30gdG8gc2V0DQorCSAqLw0KKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRTY2VuYXJpbyhmaW5hbCBTY2VuYXJpbyBzY2VuYXJpbykgew0KKwkJdGhpcy5zY2VuYXJpbyA9IHNjZW5hcmlvOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uI2FkZFNpbXVsYXRpb25MaXN0ZW5lcihvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbkxpc3RlbmVyKQ0KKwkgKi8NCisJcHVibGljIHZvaWQgYWRkU2ltdWxhdGlvbkxpc3RlbmVyKGZpbmFsIElTaW11bGF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsNCisJCWlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgew0KKwkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOw0KKwkJfQ0KKwl9IC8vIGFkZFNpbXVsYXRpb25MaXN0ZW5lcg0KKw0KKwkvKioNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbiNhZGRTaW11bGF0aW9uTGlzdGVuZXJTeW5jKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uTGlzdGVuZXJTeW5jKQ0KKwkgKi8NCisJcHVibGljIHZvaWQgYWRkU2ltdWxhdGlvbkxpc3RlbmVyU3luYyhmaW5hbCBJU2ltdWxhdGlvbkxpc3RlbmVyU3luYyBsaXN0ZW5lcikgew0KKwkJaWYgKCFsaXN0ZW5lcnNTeW5jLmNvbnRhaW5zKGxpc3RlbmVyKSkgew0KKwkJCWxpc3RlbmVyc1N5bmMuYWRkKGxpc3RlbmVyKTsNCisJCX0NCisJfSAvLyBhZGRTaW11bGF0aW9uTGlzdGVuZXJTeW5jDQorDQorCS8qKg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uI3JlbW92ZVNpbXVsYXRpb25MaXN0ZW5lcihvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbkxpc3RlbmVyKQ0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVtb3ZlU2ltdWxhdGlvbkxpc3RlbmVyKGZpbmFsIElTaW11bGF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsNCisJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOw0KKwl9IC8vIHJlbW92ZVNpbXVsYXRpb25MaXN0ZW5lcg0KKw0KKwkvKioNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbiNyZW1vdmVTaW11bGF0aW9uTGlzdGVuZXJTeW5jKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uTGlzdGVuZXJTeW5jKQ0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVtb3ZlU2ltdWxhdGlvbkxpc3RlbmVyU3luYygNCisJCQlmaW5hbCBJU2ltdWxhdGlvbkxpc3RlbmVyU3luYyBsaXN0ZW5lcikgew0KKwkJbGlzdGVuZXJzU3luYy5yZW1vdmUobGlzdGVuZXIpOw0KKwl9IC8vIHJlbW92ZVNpbXVsYXRpb25MaXN0ZW5lclN5bmMNCisNCisJLyoqDQorCSAqIFRlbGwgdGhlIGxpc3RlbmVycyBhYm91dCB0aGUgY2hhbmdlIGluIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0ncyBzdGF0ZQ0KKwkgKiANCisJICogQHBhcmFtIHNpbXVsYXRpb25TdGF0ZQ0KKwkgKiAgICAgICAgICAgIHRoZSBuZXcge0BsaW5rIFNpbXVsYXRpb25TdGF0ZX0gb2YgdGhlIHtAbGluayBTaW11bGF0aW9ufQ0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGZpcmVTaW11bGF0aW9uQ2hhbmdlZChmaW5hbCBTaW11bGF0aW9uU3RhdGUgc2ltdWxhdGlvblN0YXRlKSB7DQorCQlmaW5hbCBTaW11bGF0aW9uRXZlbnQgZXZlbnQgPSBuZXcgU2ltdWxhdGlvbkV2ZW50KHRoaXMsIHNpbXVsYXRpb25TdGF0ZSk7DQorCQlmaXJlU2ltdWxhdGlvbkNoYW5nZWRFdmVudChldmVudCk7DQorCX0gLy8gZmlyZVNpbXVsYXRpb25NYW5hZ2VyQ2hhbmdlZA0KKw0KKwkvKioNCisJICogVGVsbCB0aGUgbGlzdGVuZXJzIGFib3V0IHRoZSBjaGFuZ2UgaW4gdGhlIHtAbGluayBTaW11bGF0aW9ufSdzIHN0YXRlDQorCSAqIA0KKwkgKiBAcGFyYW0gc2ltdWxhdGlvblN0YXRlDQorCSAqICAgICAgICAgICAgdGhlIG5ldyB7QGxpbmsgU2ltdWxhdGlvblN0YXRlfSBvZiB0aGUge0BsaW5rIFNpbXVsYXRpb259DQorCSAqLw0KKwl2b2lkIGZpcmVTaW11bGF0aW9uQ2hhbmdlZEV2ZW50KGZpbmFsIFNpbXVsYXRpb25FdmVudCBldmVudCkgew0KKw0KKwkJZm9yIChmaW5hbCBJU2ltdWxhdGlvbkxpc3RlbmVyU3luYyBsaXN0ZW5lciA6IGxpc3RlbmVyc1N5bmMpIHsNCisJCQlsaXN0ZW5lci5zaW11bGF0aW9uQ2hhbmdlZFN5bmMoZXZlbnQpOw0KKwkJfSAvLyBmb3INCisNCisJCWZvciAoZmluYWwgSVNpbXVsYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgew0KKwkJCWxpc3RlbmVyLnNpbXVsYXRpb25DaGFuZ2VkKGV2ZW50KTsNCisJCX0gLy8gZm9yDQorCX0gLy8gZmlyZVNpbXVsYXRpb25NYW5hZ2VyQ2hhbmdlZA0KKw0KKwkvKioNCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLlByb3BlcnR5Q2hhbmdlRXZlbnQpDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgew0KKwkJc2V0UHJlZmVyZW5jZXMoKTsNCisJfSAvLyBwcm9wZXJ0eUNoYW5nZQ0KKw0KKwkvKioNCisJICogQHJldHVybiB0aGUgdGl0bGUgb2YgdGhlIHtAbGluayBTY2VuYXJpb30NCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKwkJcmV0dXJuIHNjZW5hcmlvLnByb2R1Y2VUaXRsZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBpbnRlcnJ1cHRSZXF1ZXN0ZWQuIFJldHVybiB0cnVlIGlmIHRoaXMgbGlzdGVuZXIgcmVxdWVzdHMgDQorCSAqIHRoYXQgYSBkZWNvcmF0b3Igc3RvcHMgdXBkYXRpbmcgbGFiZWxzDQorCSAqIA0KKwkgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiBzdG9wDQorCSAqLw0KKw0KKwlwdWJsaWMgYm9vbGVhbiBpbnRlcnJ1cHRSZXF1ZXN0ZWQoKSB7DQorCQlyZXR1cm4gKCF0aGlzLmtlZXBSdW5uaW5nICYmIHN0b3BwaW5nKTsNCisJfQ0KKw0KKwlwdWJsaWMgdm9pZCBkZXN0cm95KCkgew0KKwkJTGlzdDxJU2ltdWxhdGlvbkxpc3RlbmVyPiB0ZW1wTGlzdCA9IG5ldyBBcnJheUxpc3Q8SVNpbXVsYXRpb25MaXN0ZW5lcj4oKTsNCisJCXRlbXBMaXN0LmFkZEFsbChsaXN0ZW5lcnMpOw0KKwkJZm9yIChJU2ltdWxhdGlvbkxpc3RlbmVyIGxpc3RlbmVyOnRlbXBMaXN0KSB7DQorCQkJdGhpcy5yZW1vdmVTaW11bGF0aW9uTGlzdGVuZXIobGlzdGVuZXIpOw0KKwkJfQ0KKwkJbGlzdGVuZXJzLmNsZWFyKCk7DQorCQlMaXN0PElTaW11bGF0aW9uTGlzdGVuZXJTeW5jPiB0ZW1wTGlzdFN5bmMgPSBuZXcgQXJyYXlMaXN0PElTaW11bGF0aW9uTGlzdGVuZXJTeW5jPigpOw0KKwkJdGVtcExpc3RTeW5jLmFkZEFsbChsaXN0ZW5lcnNTeW5jKTsNCisJCWZvciAoSVNpbXVsYXRpb25MaXN0ZW5lclN5bmMgbGlzdGVuZXI6dGVtcExpc3RTeW5jKSB7DQorCQkJdGhpcy5yZW1vdmVTaW11bGF0aW9uTGlzdGVuZXJTeW5jKGxpc3RlbmVyKTsNCisJCX0NCisJCWxpc3RlbmVyc1N5bmMuY2xlYXIoKTsNCisJCXRlbXBMaXN0LmNsZWFyKCk7DQorCQl0ZW1wTGlzdFN5bmMuY2xlYXIoKTsNCisNCisJCXNjZW5hcmlvLmVBZGFwdGVycygpLnJlbW92ZShhZGFwdGVyKTsNCisNCisJCUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOw0KKwl9DQorDQorCXByaXZhdGUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXIgW10gZ2V0U29sdmVycygpIHsNCisJCVNvbHZlciBbXSBzb2x2ZXJzOw0KKwkJZmluYWwgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsNCisJCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudFtdIHNvbHZlckNvbmZpZ0VsZW1lbnRzID0gcmVnaXN0cnkNCisJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3Iob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50cy5JRF9TT0xWRVJfRVhURU5TSU9OX1BPSU5UKTsNCisNCisJCWZpbmFsIExpc3Q8U29sdmVyPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxTb2x2ZXI+KCk7DQorDQorCQkvL3NvbHZlcnMgPSBuZXcgU29sdmVyW3NvbHZlckNvbmZpZ0VsZW1lbnRzLmxlbmd0aF07DQorDQorCQlmb3IgKGludCBpID0gMDsgaSA8IHNvbHZlckNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQorCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBzb2x2ZXJDb25maWdFbGVtZW50c1tpXTsNCisJCQkvLyBEb2VzIHRoZSBlbGVtZW50IHNwZWNpZnkgdGhlIGNsYXNzIG9mIHRoZSBkaXNlYXNlIG1vZGVsPw0KKwkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoQ29uc3RhbnRzLlNPTFZFUl9FTEVNRU5UKSkgew0KKwkJCQkvLyBZZXMNCisJCQkJdHJ5IHsNCisJCQkJCXRlbXAuYWRkKChTb2x2ZXIpIGVsZW1lbnQNCisJCQkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIikpOyAvLyROT04tTkxTLTEkDQorCQkJCX0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7DQorCQkJCQlDb3JlUGx1Z2luLmxvZ0Vycm9yKA0KKwkJCQkJCQkiQ2FuJ3QgY3JlYXRlIHNvbHZlciIsIGUpOyAvLyROT04tTkxTLTEkDQorCQkJCX0NCisJCQl9IC8vIGlmDQorCQl9IC8vIGZvciBlYWNoIGNvbmZpZ3VyYXRpb24gZWxlbWVudA0KKw0KKwkJc29sdmVycyA9IHRlbXAudG9BcnJheShuZXcgU29sdmVyW10ge30pOw0KKw0KKwkJcmV0dXJuIHNvbHZlcnM7DQorCX0NCit9IC8vIFNpbXVsYXRpb24NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9zaW11bGF0aW9uL1NpbXVsYXRpb25DYWNoaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9zaW11bGF0aW9uL1NpbXVsYXRpb25DYWNoaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4ZmZmMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vU2ltdWxhdGlvbkNhY2hpbmcuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50czsKKworLyoqCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgY2FjaGluZyBvZiB7QGxpbmsgU2NlbmFyaW99cy4KKyAqIAorICogVE9ETyBXaHkgaXNuJ3QgdGhpcyBjYWxsZWQgU2NlbmFyaW9DYWNoaW5nPworICovCitwdWJsaWMgY2xhc3MgU2ltdWxhdGlvbkNhY2hpbmcgeworCisJLyoqCisJICogU2luZ2xldG9uIGluc3RhbmNlIG9mIGNhY2hpbmcgbWFuYWdlcgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU2ltdWxhdGlvbkNhY2hpbmcgSU5TVEFOQ0UgPSBuZXcgU2ltdWxhdGlvbkNhY2hpbmcoKTsKKworCS8qKgorCSAqIENhY2hpbmcgdXNlcyBhIHtAbGluayBXZWFrSGFzaE1hcH0gb2JqZWN0IHRvIHN0b3JlIFNjZW5hcmlvcy4gSW4gdGhlCisJICogZnV0dXJlIHRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBzbWFydGVyIGNhY2hpbmcgbWVjaGFuaXNtLgorCSAqLworCXByaXZhdGUgZmluYWwgTWFwPFVSSSwgU2NlbmFyaW8+IGNhY2hlZFNjZW5hcmlvcyA9IG5ldyBXZWFrSGFzaE1hcDxVUkksIFNjZW5hcmlvPigpOworCisJcHJpdmF0ZSBib29sZWFuIHRvVXNlQ2FjaGluZyA9IGZhbHNlOworCisJLyoqCisJICogUHJpdmF0ZSBjb25zdHJ1Y3RvciBhcyB0aGlzIGlzIGEgU2luZ2xldG9uIG9iamVjdC4KKwkgKi8KKwlwcml2YXRlIFNpbXVsYXRpb25DYWNoaW5nKCkgeworCQlzZXRQcmVmZXJlbmNlcygpOworCisJCUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKQorCQkJCS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoCisJCQkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQkJCXNldFByZWZlcmVuY2VzKCk7CisJCQkJCX0gLy8gcHJvcGVydHlDaGFuZ2UKKwkJCQl9IC8vIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCisJCQkJKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2NlbmFyaW9VUkkKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB7QGxpbmsgU2NlbmFyaW99IGlzIGluIHRoZSBjYWNoZQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2NlbmFyaW9JbkNhY2hlKFVSSSBzY2VuYXJpb1VSSSkgeworCQlyZXR1cm4gY2FjaGVkU2NlbmFyaW9zLmNvbnRhaW5zS2V5KHNjZW5hcmlvVVJJKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2NlbmFyaW9VUkkKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgU2NlbmFyaW99IGlkZW50aWZpZWQgYnkgdGhlIHtAbGluayBVUkl9IGZyb20gdGhlCisJICogICAgICAgICBjYWNoZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLgorCSAqLworCXB1YmxpYyBTY2VuYXJpbyBnZXRDYWNoZWRTY2VuYXJpbyhVUkkgc2NlbmFyaW9VUkkpIHsKKwkJcmV0dXJuIGNhY2hlZFNjZW5hcmlvcy5nZXQoc2NlbmFyaW9VUkkpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBzY2VuYXJpbworCSAqLworCXB1YmxpYyB2b2lkIGFkZFNjZW5hcmlvVG9DYWNoZShTY2VuYXJpbyBzY2VuYXJpbykgeworCQlpZiAoc2NlbmFyaW8uZ2V0VVJJKCkgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJY2FjaGVkU2NlbmFyaW9zLnB1dChzY2VuYXJpby5nZXRVUkkoKSwgc2NlbmFyaW8pOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY2FjaGluZyBpcyBlbmFibGVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHRvVXNlQ2FjaGluZygpIHsKKwkJcmV0dXJuIHRvVXNlQ2FjaGluZzsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQcmVmZXJlbmNlcygpIHsKKwkJZmluYWwgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpCisJCQkJLmdldFBsdWdpblByZWZlcmVuY2VzKCk7CisJCXRvVXNlQ2FjaGluZyA9IHByZWZlcmVuY2VzCisJCQkJLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5VU0VfU0NFTkFSSU9TX0NBQ0hJTkdfQk9PTEVBTik7CisJfSAvLyBzZXRQZXJmZXJlbmNlcworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9TaW11bGF0aW9uRXZlbnQuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vU2ltdWxhdGlvbkV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzZDhhMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vU2ltdWxhdGlvbkV2ZW50LmphdmEKQEAgLTAsMCArMSw5MSBAQAorLy8gU2ltdWxhdGlvbkV2ZW50LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworCisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkIGluIHRoZSBvcGVyYXRpb24gb2YgdGhlCisgKiBTaW11bGF0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBTaW11bGF0aW9uRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7CisKKwlwcml2YXRlIFNpbXVsYXRpb25TdGF0ZSBzaW11bGF0aW9uU3RhdGU7CisJcHJpdmF0ZSBkb3VibGUgaXRlcmF0aW9uUHJvZ3Jlc3MgPSAwLjA7CisJCisJLyoqCisJICogQHBhcmFtIHNvdXJjZQorCSAqICAgICAgICAgICAgdGhlIFNpbXVsYXRpb24gdGhlIGdlbmVyYXRlZCB0aGUgZXZlbnQKKwkgKiBAcGFyYW0gc2ltdWxhdGlvblN0YXRlCisJICogICAgICAgICAgICB0aGUgbmV3IHN0YXRlIG9mIHRoZSBzaW11bGF0aW9uCisJICovCisJcHVibGljIFNpbXVsYXRpb25FdmVudChJU2ltdWxhdGlvbiBzb3VyY2UsCisJCQlmaW5hbCBTaW11bGF0aW9uU3RhdGUgc2ltdWxhdGlvblN0YXRlKSB7CisJCXN1cGVyKHNvdXJjZSk7CisJCXRoaXMuc2ltdWxhdGlvblN0YXRlID0gc2ltdWxhdGlvblN0YXRlOworCQl0aGlzLml0ZXJhdGlvblByb2dyZXNzID0gMC4wOworCX0gLy8gU2ltdWxhdGlvbkV2ZW50CisKKwkvKioKKwkgKiBAcGFyYW0gc291cmNlCisJICogICAgICAgICAgICB0aGUgU2ltdWxhdGlvbiB0aGUgZ2VuZXJhdGVkIHRoZSBldmVudAorCSAqIEBwYXJhbSBzaW11bGF0aW9uU3RhdGUKKwkgKiAgICAgICAgICAgIHRoZSBuZXcgc3RhdGUgb2YgdGhlIHNpbXVsYXRpb24KKwkgKiBAcGFyYW0gaXByb2dyZXNzIEl0ZXJhdGlvbiBwcm9ncmVzcworCSAqLworCXB1YmxpYyBTaW11bGF0aW9uRXZlbnQoSVNpbXVsYXRpb24gc291cmNlLAorCQkJZmluYWwgU2ltdWxhdGlvblN0YXRlIHNpbXVsYXRpb25TdGF0ZSwgCisJCQlkb3VibGUgaXByb2dyZXNzKSB7CisJCXN1cGVyKHNvdXJjZSk7CisJCXRoaXMuc2ltdWxhdGlvblN0YXRlID0gc2ltdWxhdGlvblN0YXRlOworCQl0aGlzLml0ZXJhdGlvblByb2dyZXNzID0gaXByb2dyZXNzOworCX0gLy8gU2ltdWxhdGlvbkV2ZW50CisJCisJLyoqCisJICogR2VuZXJhdGVkIHNlcmlhbGl6YXRpb24gSUQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3NTEyODY4OTU1ODQxOTYyMzMxTDsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG5ldyBzdGF0ZSBvZiB0aGUgc2ltdWxhdGlvbgorCSAqLworCXB1YmxpYyBmaW5hbCBTaW11bGF0aW9uU3RhdGUgZ2V0U2ltdWxhdGlvblN0YXRlKCkgeworCQlyZXR1cm4gc2ltdWxhdGlvblN0YXRlOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHNpbXVsYXRpb24gdGhhdCBpcyB0aGUgc291cmNlIG9mIHRoZSBldmVudAorCSAqLworCXB1YmxpYyBJU2ltdWxhdGlvbiBnZXRTaW11bGF0aW9uKCkgeworCQlyZXR1cm4gKElTaW11bGF0aW9uKSBnZXRTb3VyY2UoKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIGRvdWJsZSBUaGUgcHJvZ3Jlc3Mgb2YgdGhlIGN1cnJlbnQgaXRlcmF0aW9uICgwLTEpCisJICovCisJcHVibGljIGRvdWJsZSBnZXRJdGVyYXRpb25Qcm9ncmVzcygpIHsKKwkJcmV0dXJuIGl0ZXJhdGlvblByb2dyZXNzOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIGphdmEudXRpbC5FdmVudE9iamVjdCN0b1N0cmluZygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIHNpbXVsYXRpb25TdGF0ZS50b1N0cmluZygpOworCX0KKwkKKwkKKworfSAvLyBTaW11bGF0aW9uRXZlbnQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vU2ltdWxhdGlvbk1hbmFnZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vU2ltdWxhdGlvbk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDMyNzUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9TaW11bGF0aW9uTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsODQzIEBACisvLyBTaW11bGF0aW9uTWFuYWdlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlV0aWxpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLkV4ZWN1dGFibGVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CisKKy8qKgorICogVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSBsaWZlLWN5Y2xlIG9mIGFjdGl2ZSB7QGxpbmsgU2ltdWxhdGlvbn1zLiBUaGVyZSBpcyBhCisgKiBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIG1hbmFnZXIgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIHBhcnRzIG9mIHRoZQorICogc3lzdGVtIHRvIG1hbmFnZSB7QGxpbmsgU2ltdWxhdGlvbn0uIEl0IGNyZWF0ZXMge0BsaW5rIFNpbXVsYXRpb259IGluc3RhbmNlcworICogZnJvbSB7QGxpbmsgU2NlbmFyaW99IGluc3RhbmNlcyBhbmQgY2FuIG9idGFpbiB7QGxpbmsgU2NlbmFyaW99IGluc3RhbmNlcworICogZnJvbSBmaWxlIFVSSSdzIG9yIGZyb20ge0BsaW5rIElDb25maWd1cmF0aW9uRWxlbWVudH0ncy4gSXQgbWFpbnRhaW5zIGEKKyAqIGNvbGxlY3Rpb24gb2YgYWxsIG9mIHRoZSBhY3RpdmUge0BsaW5rIFNpbXVsYXRpb259cyBpbiB0aGUgc3lzdGVtIGFuZAorICogZ2VuZXJhdGVzIHtAbGluayBTaW11bGF0aW9uRXZlbnR9J3Mgd2hlbmV2ZXIgYSB7QGxpbmsgU2ltdWxhdGlvbn0gaXMgYWRkZWQgdG8KKyAqIHRoYXQgY29sbGVjdGlvbiBvciByZW1vdmVkLgorICogPHA+CisgKiBUaGUge0BsaW5rIFNpbXVsYXRpb25NYW5hZ2VyfSBtYWludGFpbnMgYSBzZXF1ZW5jZSBudW1iZXIgYW5kIGFzc2lnbnMKKyAqIHN1Y2Nlc3NpdmUgdmFsdWVzIG9mIHRoYXQgbnVtYmVyIHRvIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0gaW5zdGFuY2VzIGl0CisgKiBjcmVhdGVzLgorICovCitwdWJsaWMgY2xhc3MgU2ltdWxhdGlvbk1hbmFnZXIgZXh0ZW5kcyBFeGVjdXRhYmxlTWFuYWdlciBpbXBsZW1lbnRzCisJCUlTaW11bGF0aW9uTGlzdGVuZXIgeworCisJLyoqCisJICogU2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBtYW5hZ2VyCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgU2ltdWxhdGlvbk1hbmFnZXIgSU5TVEFOQ0UgPSBudWxsOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VxdWVuY2UgbnVtYmVyIGFzc2lnbmVkIHRvIGVhY2ggc3VjY2Vzc2l2ZQorCSAqIHtAbGluayBTaW11bGF0aW9ufSBpbnN0YW5jZSB0aGUgbWFuYWdlciBjcmVhdGVzLgorCSAqLworCXByaXZhdGUgc3RhdGljIGludCBzZXF1ZW5jZU51bWJlciA9IDA7CisKKwkvKioKKwkgKiBUaGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgSVNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXJ9J3Mgd2FpdGluZyB0byBiZSB0b2xkCisJICogYWJvdXQge0BsaW5rIFNpbXVsYXRpb25NYW5hZ2VyRXZlbnR9cworCSAqLworCXByaXZhdGUgZmluYWwgTGlzdDxJU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lcj4gbGlzdGVuZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PElTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyPigpOworCisJLyoqCisJICogVGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIElTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyU3luY30ncyB3YWl0aW5nIHRvIGJlCisJICogdG9sZCBhYm91dCB7QGxpbmsgU2ltdWxhdGlvbk1hbmFnZXJFdmVudH1zCisJICovCisJcHJpdmF0ZSBmaW5hbCBMaXN0PElTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyU3luYz4gbGlzdGVuZXJzU3luYyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxJU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lclN5bmM+KCk7CisKKwkvKioKKwkgKiBDb25zdGFudCBlbXB0eSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElTaW11bGF0aW9uW10gTk9ORSA9IG5ldyBTaW11bGF0aW9uW10ge307CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb2xsZWN0aW9uIG9mIGFjdGl2ZSB7QGxpbmsgU2ltdWxhdGlvbn0gam9icworCSAqLworCXByaXZhdGUgTGlzdDxJU2ltdWxhdGlvbj4gYWN0aXZlU2ltdWxhdGlvbnMgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKi8KKwlwcml2YXRlIFNpbXVsYXRpb25NYW5hZ2VyKCkgeworCQlhY3RpdmVTaW11bGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SVNpbXVsYXRpb24+KCk7CisKKwkJUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoCisJCQkJU2NlbmFyaW9QYWNrYWdlLmVOQU1FLCBuZXcgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKKwl9IC8vIFNpbXVsYXRpb25NYW5hZ2VyCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTaW11bGF0aW9uTWFuYWdlciBnZXRNYW5hZ2VyKCkgeworCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgeworCQkJc3luY2hyb25pemVkIChTaW11bGF0aW9uTWFuYWdlci5jbGFzcykgeworCQkJCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7CisJCQkJCUlOU1RBTkNFID0gbmV3IFNpbXVsYXRpb25NYW5hZ2VyKCk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBJTlNUQU5DRTsKKwl9IC8vIGdldE1vZGVsCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG5leHQgc2ltdWxhdGlvbiBzZXF1ZW5jZSBudW1iZXIgYW5kIGluY3JlbWVudCB0aGUgdmFsdWUuCisJICogCisJICogQHJldHVybiB0aGUgbmV4dCBzaW11bGF0aW9uIHNlcXVlbmNlIG51bWJlcgorCSAqLworCXN5bmNocm9uaXplZCBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZ2V0QW5kSW5jcmVtZW50U2ltdWxhdGlvblNlcXVlbmNlTnVtYmVyKCkgeworCQlyZXR1cm4gc2VxdWVuY2VOdW1iZXIrKzsKKwl9IC8vIGdldEFuZEluY3JlbWVudFNpbXVsYXRpb25TZXF1ZW5jZU51bWJlcgorCisJLyoqCisJICogVGhpcyBpcyB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIHRvIHJlc2V0IHRoZSBzdGF0ZSBvZiB0aGUgbW9kZWwuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHJlc2V0U2ltdWxhdGlvbk1hbmFnZXIoKSB7CisJCUlOU1RBTkNFID0gbnVsbDsKKwkJc2VxdWVuY2VOdW1iZXIgPSAwOworCX0gLy8gcmVzZXRTaW11bGF0aW9uTWFuYWdlcgorCisJLyoqCisJICogQHJldHVybiB0aGUgYWN0aXZlIHtAbGluayBTaW11bGF0aW9ufXMKKwkgKi8KKwlwdWJsaWMgZmluYWwgTGlzdDxJU2ltdWxhdGlvbj4gZ2V0QWN0aXZlU2ltdWxhdGlvbnMoKSB7CisJCXJldHVybiBhY3RpdmVTaW11bGF0aW9uczsKKwl9IC8vIGdldEFjdGl2ZVNpbXVsYXRpb25zCisKKwkvKioKKwkgKiBBZGQgYSB7QGxpbmsgU2ltdWxhdGlvbn0gdG8gdGhlIGNvbGxlY3Rpb24gb2YgYWN0aXZlIHtAbGluayBTaW11bGF0aW9ufXMuCisJICogCisJICogQHBhcmFtIHNpbXVsYXRpb24KKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgSVNpbXVsYXRpb259IHRvIGFkZAorCSAqLworCXByaXZhdGUgZmluYWwgdm9pZCBhZGRBY3RpdmVTaW11bGF0aW9uKGZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb24pIHsKKwkJYWN0aXZlU2ltdWxhdGlvbnMuYWRkKHNpbXVsYXRpb24pOworCQlzaW11bGF0aW9uLmFkZFNpbXVsYXRpb25MaXN0ZW5lcih0aGlzKTsKKwkJZmlyZVNpbXVsYXRpb25NYW5hZ2VyQ2hhbmdlZChuZXcgSVNpbXVsYXRpb25bXSB7IHNpbXVsYXRpb24gfSwgTk9ORSk7CisJfSAvLyBhZGRBY3RpdmVTaW11bGF0aW9uCisKKwkvKioKKwkgKiBSZW1vdmUgYW4ge0BsaW5rIElTaW11bGF0aW9ufSBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGFjdGl2ZQorCSAqIHtAbGluayBJU2ltdWxhdGlvbn1zLgorCSAqIAorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogICAgICAgICAgICB0aGUge0BsaW5rIElTaW11bGF0aW9ufSB0byByZW1vdmUKKwkgKi8KKwlwcml2YXRlIGZpbmFsIHZvaWQgcmVtb3ZlQWN0aXZlU2ltdWxhdGlvbihmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uKSB7CisJCWFjdGl2ZVNpbXVsYXRpb25zLnJlbW92ZShzaW11bGF0aW9uKTsKKwkJLy8gV2UncmUgbm8gbG9uZ2VyIGEgbGlzdGVuZXIKKwkJc2ltdWxhdGlvbi5yZW1vdmVTaW11bGF0aW9uTGlzdGVuZXIodGhpcyk7CisJCWZpcmVTaW11bGF0aW9uTWFuYWdlckNoYW5nZWQoTk9ORSwgbmV3IElTaW11bGF0aW9uW10geyBzaW11bGF0aW9uIH0pOworCX0gLy8gcmVtb3ZlQWN0aXZlU2ltdWxhdGlvbgorCisJLyoqCisJICogQ3JlYXRlIGEge0BsaW5rIElTaW11bGF0aW9ufSB0aGF0J3MgcmVhZHkgdG8gcnVuLgorCSAqIAorCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uRWxlbWVudAorCSAqICAgICAgICAgICAgYSB7QGxpbmsgSUNvbmZpZ3VyYXRpb25FbGVtZW50fSB0aGF0IHNwZWNpZmllcyB0aGUgZGV0YWlscyBvZgorCSAqICAgICAgICAgICAgYSBzZXJpYWxpemVkIHtAbGluayBTY2VuYXJpb30gdGhhdCBpcyBpbiBhIHBsdWctaW4KKwkgKiBAcGFyYW0gbW9uaXRvcgorCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCisJICogQHJldHVybiBhbiB7QGxpbmsgSVNpbXVsYXRpb259IGNvbnN0cnVjdGVkIGZyb20gdGhlCisJICogICAgICAgICB7QGxpbmsgSUNvbmZpZ3VyYXRpb25FbGVtZW50fSwgb3IgbnVsbCBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtLgorCSAqIAorCSAqIEBEZXByZWNhdGVkCisJICovCisJcHVibGljIElTaW11bGF0aW9uIGNyZWF0ZVNpbXVsYXRpb24oCisJCQlmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQsCisJCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJSVNpbXVsYXRpb24gcmV0VmFsdWUgPSBudWxsOworCisJCWZpbmFsIFN0cmluZyBzY2VuYXJpb1VSSVN0cmluZyA9IGNvbmZpZ3VyYXRpb25FbGVtZW50CisJCQkJLmdldEF0dHJpYnV0ZShEdWJsaW5Db3JlLklERU5USUZJRVIpOworCisJCXRyeSB7CisJCQlyZXRWYWx1ZSA9IGNyZWF0ZVNpbXVsYXRpb24oVVJJLmNyZWF0ZVVSSShzY2VuYXJpb1VSSVN0cmluZyksCisJCQkJCW1vbml0b3IpOworCQl9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworCQkJQWN0aXZhdG9yCisJCQkJCS5sb2dFcnJvcigKKwkJCQkJCQlNZXNzYWdlRm9ybWF0CisJCQkJCQkJCQkuZm9ybWF0KAorCQkJCQkJCQkJCQlNZXNzYWdlcworCQkJCQkJCQkJCQkJCS5nZXRTdHJpbmcoIlNpbU1nci5EZXNlcmlhbGl6YXRpb25fRXJyb3IiKSwgc2NlbmFyaW9VUklTdHJpbmcpLCBlKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0VmFsdWUgPSBudWxsOworCQl9CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZVNpbXVsYXRpb24KKworCS8qKgorCSAqIENyZWF0ZSBhbiB7QGxpbmsgSVNpbXVsYXRpb259IHRoYXQncyByZWFkeSB0byBydW4uCisJICogCisJICogQHBhcmFtIHNjZW5hcmlvVVJJCisJICogICAgICAgICAgICB0aGUgVVJJIG9mIGEgc2VyaWFsaXplZCB7QGxpbmsgU2NlbmFyaW99CisJICogQHBhcmFtIG1vbml0b3IKKwkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgorCSAqIEByZXR1cm4gYW4ge0BsaW5rIElTaW11bGF0aW9ufSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBVUkksIG9yCisJICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtLgorCSAqICAgICAgICAgCisJICogQERlcHJlY2F0ZWQKKwkgKi8KKwlwdWJsaWMgSVNpbXVsYXRpb24gY3JlYXRlU2ltdWxhdGlvbihmaW5hbCBVUkkgc2NlbmFyaW9VUkksCisJCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJSVNpbXVsYXRpb24gcmV0VmFsdWUgPSBudWxsOworCisJCQl0cnkgeworCQkJCQorCQkJCQkvLyBSZWFkIHNjZW5hcmlvCisJCQkJbW9uaXRvci5zdWJUYXNrKCJSZWFkaW5nIFNjZW5hcmlvIGZyb20gZmlsZSIpOworCQkJCVNjZW5hcmlvIHNpbXVsYXRpb25TY2VuYXJpbyA9IChTY2VuYXJpbylVdGlsaXR5LmdldElkZW50aWZpYWJsZShzY2VuYXJpb1VSSSk7CisJCQkJCisJCQkJbW9uaXRvci5zdWJUYXNrKCJDcmVhdGluZyBTaW11bGF0aW9uIGZyb20gU2NlbmFyaW8iKTsKKwkJCQlyZXRWYWx1ZSA9IGNyZWF0ZVNpbXVsYXRpb24oc2ltdWxhdGlvblNjZW5hcmlvLCBtb25pdG9yKTsKKwkJCX0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisJCQkJQWN0aXZhdG9yCisJCQkJCQkubG9nRXJyb3IoCisJCQkJCQkJCU1lc3NhZ2VGb3JtYXQKKwkJCQkJCQkJCQkuZm9ybWF0KAorCQkJCQkJCQkJCQkJTWVzc2FnZXMKKwkJCQkJCQkJCQkJCQkJLmdldFN0cmluZygiU2ltTWdyLkRlc2VyaWFsaXphdGlvbl9FcnJvciIpLCBzY2VuYXJpb1VSSS50b1N0cmluZygpKSwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldFZhbHVlID0gbnVsbDsKKwkJfQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVTaW11bGF0aW9uCisKKwkvKioKKwkgKiBDcmVhdGUgYSB7QGxpbmsgSVNpbXVsYXRpb259IGZyb20gYSB7QGxpbmsgU2NlbmFyaW99IGluc3RhbmNlLgorCSAqIAorCSAqIEBwYXJhbSBzY2VuYXJpbworCSAqICAgICAgICAgICAgdGhlIHtAbGluayBTY2VuYXJpb30gdG8gc2ltdWxhdGUKKwkgKiBAcGFyYW0gbW9uaXRvciAKKwkgKiAJCQkgIFByb2dyZXNzIG1vbml0b3IKKwkgKiBAcmV0dXJuIGEge0BsaW5rIElTaW11bGF0aW9ufSB0aGF0J3MgcmVhZHkgdG8gcnVuLgorCSAqLworCXB1YmxpYyBJU2ltdWxhdGlvbiBjcmVhdGVTaW11bGF0aW9uKGZpbmFsIFNjZW5hcmlvIHNjZW5hcmlvLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJSVNpbXVsYXRpb24gcmV0VmFsdWUgPSBudWxsOworCQl0cnkgeworCQkJZmluYWwgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSAKKwkJCQlvcmcuZWNsaXBzZS5zdGVtLmpvYnMuQWN0aXZhdG9yLmdldERlZmF1bHQoKQorCQkJCQkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJCS8vYm9vbGVhbiB1c2VDYWNoZSA9IHByZWZlcmVuY2VzCisJCQkvLwkJLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5VU0VfU0NFTkFSSU9TX0NBQ0hJTkdfQk9PTEVBTik7CisKKwkJCVNjZW5hcmlvIHNpbXVsYXRpb25TY2VuYXJpbyA9IG51bGw7CisJCQkKKy8qCVNFRCBDb21tZW50ZWQgb3V0IDcvOC8xMCwgY2FjaGluZyBkb2Vzbid0IHdvcmsJCQorICAgICBpZiAodXNlQ2FjaGUpIHsKKwkJCQlpZiAoU2ltdWxhdGlvbkNhY2hpbmcuSU5TVEFOQ0UuaXNTY2VuYXJpb0luQ2FjaGUoc2NlbmFyaW8uZ2V0VVJJKCkpKSB7CisJCQkJCXNpbXVsYXRpb25TY2VuYXJpbyA9IFNpbXVsYXRpb25DYWNoaW5nLklOU1RBTkNFLmdldENhY2hlZFNjZW5hcmlvKHNjZW5hcmlvLmdldFVSSSgpKTsKKwkJCQkJYm9vbGVhbiBydW5uaW5nID0gZmFsc2U7CisJCQkJCWZvcihJU2ltdWxhdGlvbiBzaW0gOiBnZXRBY3RpdmVTaW11bGF0aW9ucygpKSB7CisJCQkJCQlpZihzaW0uZ2V0U2NlbmFyaW8oKS5lcXVhbHMoc2ltdWxhdGlvblNjZW5hcmlvKSkgeworCQkJCQkJCS8vIFRoZSBzY2VuYXJpbyBpcyBhbHJlYWR5IHJ1bm5pbmcuIENvcHkgdGhlIHdob2xlIHNjZW5hcmlvIGJlZm9yZSByZXNldHRpbmcKKwkJCQkJCQlTY2VuYXJpbyBuZXdTaW11bGF0aW9uID0gbnVsbDsKKwkJCQkJCQluZXdTaW11bGF0aW9uID0gKFNjZW5hcmlvKUVjb3JlVXRpbC5jb3B5KHNpbXVsYXRpb25TY2VuYXJpbyk7CisJCQkJCQkJaWYoc2ltdWxhdGlvblNjZW5hcmlvLmdldE1vZGVsKCkgIT0gbnVsbCkgbmV3U2ltdWxhdGlvbi5zZXRNb2RlbCgoTW9kZWwpRWNvcmVVdGlsLmNvcHkoc2ltdWxhdGlvblNjZW5hcmlvLmdldE1vZGVsKCkpKTsKKwkJCQkJCQlpZihzaW11bGF0aW9uU2NlbmFyaW8uZ2V0U2VxdWVuY2VyKCkgIT0gbnVsbCkgbmV3U2ltdWxhdGlvbi5zZXRTZXF1ZW5jZXIoKFNlcXVlbmNlcilFY29yZVV0aWwuY29weShzaW11bGF0aW9uU2NlbmFyaW8uZ2V0U2VxdWVuY2VyKCkpKTsKKwkJCQkJCQlydW5uaW5nID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZighcnVubmluZylzaW11bGF0aW9uU2NlbmFyaW8ucmVzZXQoKTsgLy8gc2FmZSBzaW5jZSBjYW5vbmljYWwgZ3JhcGggaXMgc2V0IAorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJLy8gUmVhZCBzY2VuYXJpbworCQkJCQkvLyBBZGQgdG8gY2FjaGUKKwkJCQkJU2ltdWxhdGlvbkNhY2hpbmcuSU5TVEFOQ0UuYWRkU2NlbmFyaW9Ub0NhY2hlKHNjZW5hcmlvKTsKKwkJCQl9CisJCQkJCisJCQl9CisqLworCQkJCisJCQlmaW5hbCBTaW11bGF0aW9uIHNpbXVsYXRpb24gPSBuZXcgU2ltdWxhdGlvbihzY2VuYXJpbywKKwkJCQkJZ2V0QW5kSW5jcmVtZW50U2ltdWxhdGlvblNlcXVlbmNlTnVtYmVyKCkpOworCQkJCisJCQlpZihzY2VuYXJpby5nZXRDYW5vbmljYWxHcmFwaCgpID09IG51bGwpIAorCQkJCXNjZW5hcmlvLmluaXRpYWxpemUoKTsgLy8gbmVlZGVkIGZvciBwcmVmZXJlbmNlcyAuLi4KKwkJCWVsc2Ugc2NlbmFyaW8ucmVzZXQoKTsKKwkKKwkJCXNpbXVsYXRpb24uc2V0UHJpb3JpdHkoSm9iLkxPTkcpOworCQkJcmV0VmFsdWUgPSBuZXcgU2ltdWxhdGlvbkFkYXB0ZXIoc2ltdWxhdGlvbik7CisKKwkJCWFkZEFjdGl2ZVNpbXVsYXRpb24ocmV0VmFsdWUpOworCQl9IGNhdGNoIChmaW5hbCBSdW50aW1lRXhjZXB0aW9uIGUpIHsKKwkJCS8vIFdlIGNvdWxkIGdldCBhbiBleGNlcHRpb24gaGVyZSBpZiB0aGUgU2NlbmFyaW8gZG9lc24ndCBoYXZlCisJCQkvLyBhIFNlcXVlbmNlciBvciBNb2RlbCB3aGljaCB3b3VsZCBjYXVzZSBwcm9ibGVtcyB3aGVuIHRyeWluZyB0bworCQkJLy8gaW5pdGlhbGl6ZQorCQkJU2ltdWxhdGlvbi5oYW5kbGVFeGNlcHRpb24oc2NlbmFyaW8sIHNjZW5hcmlvLmdldER1YmxpbkNvcmUoKQorCQkJCQkuZ2V0VGl0bGUoKSwgdHJ1ZSwgZSk7CisJCQlyZXRWYWx1ZSA9IG51bGw7CisJCX0KKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlU2ltdWxhdGlvbgorCisJLyoqCisJICogQ3JlYXRlIGEge0BsaW5rIElTaW11bGF0aW9ufSBmcm9tIGEge0BsaW5rIElDb25maWd1cmF0aW9uRWxlbWVudH0gYW5kCisJICogdGhlbiBzdGFydCBpdCBydW5uaW5nLgorCSAqIAorCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uRWxlbWVudAorCSAqICAgICAgICAgICAgYSB7QGxpbmsgSUNvbmZpZ3VyYXRpb25FbGVtZW50fSB0aGF0IHNwZWNpZmllcyB0aGUgZGV0YWlscyBvZgorCSAqICAgICAgICAgICAgYSBzZXJpYWxpemVkIHtAbGluayBTY2VuYXJpb30gdGhhdCBpcyBpbiBhIHBsdWctaW4KKwkgKiAKKwkgKkBEZXByZWNhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlQW5kUnVuU2ltdWxhdGlvbigKKwkJCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCkgeworCQluZXcgSm9iKE1lc3NhZ2VzLmdldFN0cmluZygiU2ltTWdyLlN0YXJ0X1NpbSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmdldFN0cmluZygiU2ltTWdyLkNydFNpbSIpLAorCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKKwkJCQl0cnkgeworCQkJCQlmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uID0gY3JlYXRlU2ltdWxhdGlvbigKKwkJCQkJCQljb25maWd1cmF0aW9uRWxlbWVudCwgbW9uaXRvcik7CisJCQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5nZXRTdHJpbmcoIlNpbU1nci5SdW4iKSk7CisJCQkJCXNpbXVsYXRpb24ucnVuKCk7CisJCQkJfSAvLyB0cnkKKwkJCQljYXRjaCAoZmluYWwgTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworCQkJCQkvLyBUaGUgZXJyb3Igd2FzIGxvZ2dlZCBpbiBjcmVhdGVTaW11bGF0aW9uCisJCQkJCW1vbml0b3IuZG9uZSgpOworCQkJCX0KKwkJCQltb25pdG9yLmRvbmUoKTsKKwkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCX0gLy8gcnVuCisJCX0uc2NoZWR1bGUoKTsKKwl9IC8vIGNyZWF0ZUFuZFJ1blNpbXVsYXRpb24KKworCS8qKgorCSAqIENyZWF0ZSBhIHtAbGluayBJU2ltdWxhdGlvbn0gZnJvbSBhIHtAbGluayBTY2VuYXJpb30gaW5zdGFuY2UgYW5kIHRoZW4KKwkgKiBzdGFydCBpdCBydW5uaW5nLgorCSAqIAorCSAqIEBwYXJhbSBzY2VuYXJpbworCSAqICAgICAgICAgICAgdGhlIHtAbGluayBTY2VuYXJpb30gdG8gYmUgc2ltdWxhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlQW5kUnVuU2ltdWxhdGlvbihmaW5hbCBTY2VuYXJpbyBzY2VuYXJpbykgeworCQluZXcgSm9iKE1lc3NhZ2VzLmdldFN0cmluZygiU2ltTWdyLlN0YXJ0X1NpbSIpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQl0cnkgeworCQkJCQlmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uID0gY3JlYXRlU2ltdWxhdGlvbihzY2VuYXJpbywgbW9uaXRvcik7CisJCQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5nZXRTdHJpbmcoIlNpbU1nci5SdW4iKSk7CisJCQkJCXNpbXVsYXRpb24ucnVuKCk7CisJCQkJfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gVGhlIGVycm9yIHdhcyBsb2dnZWQgaW4gY3JlYXRlU2ltdWxhdGlvbgorCQkJCQltb25pdG9yLmRvbmUoKTsKKwkJCQl9IC8vIGNhdGNoIEV4Y2VwdGlvbgorCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQkJfSAvLyBydW4KKwkJfS5zY2hlZHVsZSgpOworCX0gLy8gY3JlYXRlQW5kUnVuU2ltdWxhdGlvbgorCisJCisJLyoqCisJICogQ3JlYXRlIGFuIHtAbGluayBJU2ltdWxhdGlvbn0gZnJvbSBhIHtAbGluayBJQ29uZmlndXJhdGlvbkVsZW1lbnR9IGFuZAorCSAqIHRoZW4gc3RhcnQgaXQgcnVubmluZy4KKwkgKiAKKwkgKiBAcGFyYW0gY29uZmlndXJhdGlvbkVsZW1lbnQKKwkgKiAgICAgICAgICAgIGFuIHtAbGluayBJQ29uZmlndXJhdGlvbkVsZW1lbnR9IHRoYXQgc3BlY2lmaWVzIHRoZSBkZXRhaWxzIG9mCisJICogICAgICAgICAgICBhIHNlcmlhbGl6ZWQge0BsaW5rIFNjZW5hcmlvfSB0aGF0IGlzIGluIGEgcGx1Zy1pbgorCSAqIAorCSAqIEBEZXByZWNhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlQW5kU3RlcFNpbXVsYXRpb24oCisJCQlmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQpIHsKKwkJbmV3IEpvYihNZXNzYWdlcy5nZXRTdHJpbmcoIlNpbU1nci5TdGFydF9TaW0iKSkgeyAvLyROT04tTkxTLTEkCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQl0cnkgeworCQkJCQlmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uID0gY3JlYXRlU2ltdWxhdGlvbigKKwkJCQkJCQljb25maWd1cmF0aW9uRWxlbWVudCwgbW9uaXRvcik7CisJCQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5nZXRTdHJpbmcoIlNpbU1nci5SdW4iKSk7CisJCQkJCXNpbXVsYXRpb24uc3RlcCgpOworCQkJCX0gLy8gdHJ5CisJCQkJY2F0Y2ggKGZpbmFsIE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gVGhlIGVycm9yIHdhcyBsb2dnZWQgaW4gY3JlYXRlU2ltdWxhdGlvbgorCQkJCQltb25pdG9yLmRvbmUoKTsKKwkJCQl9CisJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCQl9IC8vIHJ1bgorCQl9LnNjaGVkdWxlKCk7CisJfSAvLyBjcmVhdGVBbmRTdGVwU2ltdWxhdGlvbgorCQorCS8qKgorCSAqIENyZWF0ZSBhbiB7QGxpbmsgSVNpbXVsYXRpb259IGZyb20gYSB7QGxpbmsgU2NlbmFyaW99IGluc3RhbmNlIGFuZCB0aGVuCisJICogc3RhcnQgaXQgcnVubmluZy4KKwkgKiAKKwkgKiBAcGFyYW0gc2NlbmFyaW8KKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgU2NlbmFyaW99IHRvIGJlIHNpbXVsYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUFuZFN0ZXBTaW11bGF0aW9uKGZpbmFsIFNjZW5hcmlvIHNjZW5hcmlvKSB7CisJCW5ldyBKb2IoTWVzc2FnZXMuZ2V0U3RyaW5nKCJTaW1NZ3IuU3RhcnRfU2ltIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJdHJ5IHsKKwkJCQkJZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IGNyZWF0ZVNpbXVsYXRpb24oc2NlbmFyaW8sIG1vbml0b3IpOworCQkJCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuZ2V0U3RyaW5nKCJTaW1NZ3IuUnVuIikpOworCQkJCQlzaW11bGF0aW9uLnN0ZXAoKTsKKwkJCQl9IC8vIHRyeQorCQkJCWNhdGNoIChmaW5hbCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIFRoZSBlcnJvciB3YXMgbG9nZ2VkIGluIGNyZWF0ZVNpbXVsYXRpb24KKwkJCQkJbW9uaXRvci5kb25lKCk7CisJCQkJfQorCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQkJfSAvLyBydW4KKwkJfS5zY2hlZHVsZSgpOworCX0gLy8gY3JlYXRlQW5kU3RlcFNpbXVsYXRpb24KKworCQorCS8qKgorCSAqIEdpdmVuIGEge0BsaW5rIEdyYXBofSBmaW5kIHRoZSB7QGxpbmsgSVNpbXVsYXRpb259IHRoYXQgY3JlYXRlZCBpdC4KKwkgKiAKKwkgKiBAcGFyYW0gZ3JhcGgKKwkgKiAgICAgICAgICAgIGFuIGluc3RhbmNlIG9mIGEge0BsaW5rIEdyYXBofQorCSAqIEByZXR1cm4gdGhlIHtAbGluayBJU2ltdWxhdGlvbn0gaW5zdGFuY2UgdGhhdCBjcmVhdGVkIHRoZSB7QGxpbmsgR3JhcGh9LAorCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4sIGlmIG5vIG1hdGNoIGNvdWxkIGJlIGZvdW5kLgorCSAqLworCXB1YmxpYyBJU2ltdWxhdGlvbiBtYXBHcmFwaFRvU2ltdWxhdGlvbihmaW5hbCBHcmFwaCBncmFwaCkgeworCQlJU2ltdWxhdGlvbiByZXRWYWx1ZSA9IG51bGw7CisJCWZvciAoZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA6IGFjdGl2ZVNpbXVsYXRpb25zKSB7CisJCQlmaW5hbCBHcmFwaCBzaW11bGF0aW9uR3JhcGggPSBzaW11bGF0aW9uLmdldFNjZW5hcmlvKCkKKwkJCQkJLmdldENhbm9uaWNhbEdyYXBoKCk7CisJCQkvLyBJcyB0aGlzIHRoZSBvbmUgd2UncmUgbG9va2luZyBmb3I/CisJCQlpZiAoZ3JhcGggPT0gc2ltdWxhdGlvbkdyYXBoKSB7CisJCQkJLy8gWWVzCisJCQkJcmV0VmFsdWUgPSBzaW11bGF0aW9uOworCQkJCWJyZWFrOworCQkJfSAvLyBpZgorCQl9IC8vIGZvciBlYWNoIElTaW11bGF0aW9uCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIG1hcEdyYXBoVG9TaW11bGF0aW9uCisKKwkvKioKKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKiAgICAgICAgICAgIGEgbGlzdGVuZXIgd2FudGluZyB0byBiZSB0b2xkIGFib3V0IGNoYW5nZXMgdG8gdGhlIG1hbmFnZXIuCisJICovCisJcHVibGljIHZvaWQgYWRkU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lcigKKwkJCWZpbmFsIElTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgeworCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJCX0KKwl9IC8vIGFkZFNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXIKKworCS8qKgorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqICAgICAgICAgICAgYSBsaXN0ZW5lciB3YW50aW5nIHRvIGJlIHRvbGQgYWJvdXQgY2hhbmdlcyB0byB0aGUgbWFuYWdlci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyU3luYygKKwkJCWZpbmFsIElTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyU3luYyBsaXN0ZW5lcikgeworCQlpZiAoIWxpc3RlbmVyc1N5bmMuY29udGFpbnMobGlzdGVuZXIpKSB7CisJCQlsaXN0ZW5lcnNTeW5jLmFkZChsaXN0ZW5lcik7CisJCX0KKwl9IC8vIGFkZFNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXJTeW5jCisKKwkvKioKKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKiAgICAgICAgICAgIGEgbGlzdGVuZXIgd2FudGluZyBOT1QgdG8gYmUgdG9sZCBhYm91dCBjaGFuZ2VzIHRvIHRoZQorCSAqICAgICAgICAgICAgbWFuYWdlci4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihmaW5hbCBJU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9IC8vIHJlbW92ZUxpc3RlbmVyCisKKwkvKioKKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKiAgICAgICAgICAgIGEgbGlzdGVuZXIgTk9UIHdhbnRpbmcgdG8gYmUgdG9sZCBhYm91dCBjaGFuZ2VzIHRvIHRoZQorCSAqICAgICAgICAgICAgbWFuYWdlci4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lclN5bmMoZmluYWwgSVNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXJTeW5jIGxpc3RlbmVyKSB7CisJCWxpc3RlbmVyc1N5bmMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9IC8vIHJlbW92ZUxpc3RlbmVyCisKKwkvKioKKwkgKiBUZWxsIHRoZSBsaXN0ZW5lcnMgYWJvdXQgdGhlIGNoYW5nZS4KKwkgKiAKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbnNBZGRlZAorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBJU2ltdWxhdGlvbn1zIGFkZGVkCisJICogQHBhcmFtIHNpbXVsYXRpb25zUmVtb3ZlZAorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBJU2ltdWxhdGlvbn1zIHJlbW92ZWQKKwkgKi8KKwlwcml2YXRlIHZvaWQgZmlyZVNpbXVsYXRpb25NYW5hZ2VyQ2hhbmdlZCgKKwkJCWZpbmFsIElTaW11bGF0aW9uW10gc2ltdWxhdGlvbnNBZGRlZCwKKwkJCWZpbmFsIElTaW11bGF0aW9uW10gc2ltdWxhdGlvbnNSZW1vdmVkKSB7CisJCWZpbmFsIFNpbXVsYXRpb25NYW5hZ2VyRXZlbnQgZXZlbnQgPSBuZXcgU2ltdWxhdGlvbk1hbmFnZXJFdmVudCh0aGlzLAorCQkJCXNpbXVsYXRpb25zQWRkZWQsIHNpbXVsYXRpb25zUmVtb3ZlZCk7CisKKwkJZm9yIChmaW5hbCBJU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgeworCQkJdHJ5IHsKKwkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQlsaXN0ZW5lci5zaW11bGF0aW9uc0NoYW5nZWQoZXZlbnQpOworCQkJCQl9CisJCQkJfSk7CisJCQl9IGNhdGNoIChmaW5hbCBFcnJvciBuY2RmZSkgeworCQkJCS8vIElmIHdlIGdldCB0aGlzIGV4Y2VwdGlvbiwgaXQgaXMgYmVjYXVzZSB3ZSdyZSBub3QgcnVubmluZyBpbgorCQkJCS8vIGVjbGlwc2UuIEp1c3QgZmlyZSB0aGUgZXZlbnQuCisJCQkJbGlzdGVuZXIuc2ltdWxhdGlvbnNDaGFuZ2VkKGV2ZW50KTsKKwkJCX0gLy8gY2F0Y2gKKwkJfSAvLyBmb3IKKworCQlmb3IgKGZpbmFsIElTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyU3luYyBsaXN0ZW5lciA6IGxpc3RlbmVyc1N5bmMpIHsKKwkJCXRyeSB7CisJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQlsaXN0ZW5lci5zaW11bGF0aW9uc0NoYW5nZWRTeW5jKGV2ZW50KTsKKwkJCQkJfQorCQkJCX0pOworCQkJfSBjYXRjaCAoZmluYWwgRXJyb3IgbmNkZmUpIHsKKwkJCQkvLyBJZiB3ZSBnZXQgdGhpcyBleGNlcHRpb24sIGl0IGlzIGJlY2F1c2Ugd2UncmUgbm90IHJ1bm5pbmcgaW4KKwkJCQkvLyBlY2xpcHNlLiBKdXN0IGZpcmUgdGhlIGV2ZW50LgorCQkJCWxpc3RlbmVyLnNpbXVsYXRpb25zQ2hhbmdlZFN5bmMoZXZlbnQpOworCQkJfSAvLyBjYXRjaAorCQl9IC8vIGZvcgorCX0gLy8gZmlyZVNpbXVsYXRpb25NYW5hZ2VyQ2hhbmdlZAorCisJLyoqCisJICogVGhpcyBpcyB3aGVyZSB0aGUgbWFuYWdlciBoZWFycyBhYm91dCBjaGFuZ2VzIGluIHRoZSB7QGxpbmsgSVNpbXVsYXRpb259cworCSAqIGl0IGlzIG1hbmFnaW5nLiBJdCBpcyByZWFsbHkgb25seSBpbnRlcmVzdGVkIGluIHRob3NlIHRoYXQgInN0b3AiIHNvIGl0CisJICogY2FuIHJlbW92ZSB0aGVtIGZyb20gaXRzIGNvbGxlY3Rpb24gb2YgYWN0aXZlIHtAbGluayBJU2ltdWxhdGlvbn1zLgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25MaXN0ZW5lciNzaW11bGF0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgc2ltdWxhdGlvbkNoYW5nZWQoZmluYWwgU2ltdWxhdGlvbkV2ZW50IGV2ZW50KSB7CisJCS8vIEhhcyBhIHNpbXVsYXRpb24gc3RvcHBlZD8KKwkJaWYgKGV2ZW50LmdldFNpbXVsYXRpb25TdGF0ZSgpLmVxdWFscyhTaW11bGF0aW9uU3RhdGUuU1RPUFBFRCkpIHsKKwkJCS8vIFllcworCQkJaWYgKGV2ZW50LmdldFNpbXVsYXRpb24oKSBpbnN0YW5jZW9mIFNpbXVsYXRpb25BZGFwdGVyKSB7CisJCQkJU2ltdWxhdGlvbkFkYXB0ZXIgc3RvcHBlZFNpbXVsYXRpb25BZGFwdGVyID0gKFNpbXVsYXRpb25BZGFwdGVyKWV2ZW50LmdldFNpbXVsYXRpb24oKTsKKwkJCQlTaW11bGF0aW9uIHN0b3BwZWRTaW11bGF0aW9uID0gKFNpbXVsYXRpb24pc3RvcHBlZFNpbXVsYXRpb25BZGFwdGVyLmdldFNpbXVsYXRpb24oKTsKKwkJCQlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihzdG9wcGVkU2ltdWxhdGlvbik7CisJCQl9CisJCQlyZW1vdmVBY3RpdmVTaW11bGF0aW9uKGV2ZW50LmdldFNpbXVsYXRpb24oKSk7CisJCX0KKwl9IC8vIHNpbXVsYXRpb25DaGFuZ2VkCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGFkYXB0cyBhIHtAbGluayBTaW11bGF0aW9ufSBpbnN0YW5jZSB0aGF0IHJ1bnMgYXMgYW4KKwkgKiBhc3luY2hyb25vdXMgRWNsaXBzZSB7QGxpbmsgSm9ifSB0byBiZSBhbiB7QGxpbmsgSVNpbXVsYXRpb259IGluc3RhbmNlLgorCSAqIFRoZSBhZGFwdGVyIG1hbmFnZXMgdGhyZWFkIHNhZmV0eSBpc3N1ZXMgc28gdGhhdCB0aGUgVUkgdGhyZWFkIGNhbiBhY2Nlc3MKKwkgKiB0aGUge0BsaW5rIElTaW11bGF0aW9ufSBpbnN0YW5jZSBkaXJlY3RseS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXVsYXRpb25BZGFwdGVyIGltcGxlbWVudHMgSVNpbXVsYXRpb24sCisJCQlJU2ltdWxhdGlvbkxpc3RlbmVyLCBJU2ltdWxhdGlvbkxpc3RlbmVyU3luYyB7CisKKwkJLyoqCisJCSAqIFRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBJU2ltdWxhdGlvbkxpc3RlbmVyfSdzIHdhaXRpbmcgdG8gYmUgdG9sZAorCQkgKiBhYm91dCB7QGxpbmsgU2ltdWxhdGlvbkV2ZW50fXMuCisJCSAqLworCQlwcml2YXRlIGZpbmFsIExpc3Q8SVNpbXVsYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PElTaW11bGF0aW9uTGlzdGVuZXI+KCk7CisKKwkJLyoqCisJCSAqIFRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBJU2ltdWxhdGlvbkxpc3RlbmVyU3luY30ncyB3YWl0aW5nIHRvIGJlCisJCSAqIHRvbGQgYWJvdXQge0BsaW5rIFNpbXVsYXRpb25FdmVudH1zLgorCQkgKi8KKwkJcHJpdmF0ZSBmaW5hbCBMaXN0PElTaW11bGF0aW9uTGlzdGVuZXJTeW5jPiBsaXN0ZW5lcnNTeW5jID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PElTaW11bGF0aW9uTGlzdGVuZXJTeW5jPigpOworCisJCS8qKgorCQkgKiBUaGUge0BsaW5rIFNpbXVsYXRpb259IGluc3RhbmNlIHRvIGFkYXB0LiBUaGlzIHdpbGwgYmUgYW4gaW5zdGFuY2Ugb2YKKwkJICoge0BsaW5rIFNpbXVsYXRpb259IHdoaWNoIGlzIGFsc28gYW4gZWNsaXBzZSB7QGxpbmsgSm9ifSBhbmQgcnVucworCQkgKiBhc3luY2hyb25vdXNseSBmcm9tIHRoZSBVSSB0aHJlYWQgb2YgZWNsaXBzZS4gVGhpcyBhZGFwdGVyIHJlZ2lzdGVycworCQkgKiBhcyBhIGxpc3RlbmVyIG9mIGFkYXB0ZWQge0BsaW5rIFNpbXVsYXRpb259IGFuZCBzYWZlbHkgcGFzc2VzCisJCSAqIHtAbGluayBTaW11bGF0aW9uRXZlbnR9J3Mgb24gdG8gbGlzdGVuZXJzIGluIHRoZSBVSSBvciBvdGhlciB0aHJlYWRzLgorCQkgKi8KKwkJcHJpdmF0ZSBmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uOworCisJCS8qKgorCQkgKiBDb25zdHJ1Y3RvcgorCQkgKiAKKwkJICogQHBhcmFtIHNpbXVsYXRpb24KKwkJICogICAgICAgICAgICB0aGUge0BsaW5rIFNpbXVsYXRpb259IHRvIGFkYXB0CisJCSAqLworCQlwcm90ZWN0ZWQgU2ltdWxhdGlvbkFkYXB0ZXIoZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbikgeworCQkJdGhpcy5zaW11bGF0aW9uID0gc2ltdWxhdGlvbjsKKwkJCXNpbXVsYXRpb24uYWRkU2ltdWxhdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJc2ltdWxhdGlvbi5hZGRTaW11bGF0aW9uTGlzdGVuZXJTeW5jKHRoaXMpOworCQl9IC8vIFNpbXVsYXRpb25BZGFwdGVyCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb24jZ2V0TmFtZSgpCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCQlyZXR1cm4gc2ltdWxhdGlvbi5nZXROYW1lKCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbiNnZXROYW1lV2l0aFNlcXVlbmNlTnVtYmVyKCkKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVdpdGhTZXF1ZW5jZU51bWJlcigpIHsKKwkJCXJldHVybiBzaW11bGF0aW9uLmdldE5hbWVXaXRoU2VxdWVuY2VOdW1iZXIoKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUjZ2V0Q3JlYXRpb25UaW1lKCkKKwkJICovCisJCXB1YmxpYyBEYXRlIGdldENyZWF0aW9uVGltZSgpIHsKKwkJCXJldHVybiBzaW11bGF0aW9uLmdldENyZWF0aW9uVGltZSgpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZSNnZXRVbmlxdWVJRFN0cmluZygpCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlEU3RyaW5nKCkgeworCQkJcmV0dXJuIHNpbXVsYXRpb24uZ2V0VW5pcXVlSURTdHJpbmcoKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uI2dldFNjZW5hcmlvKCkKKwkJICovCisJCXB1YmxpYyBTY2VuYXJpbyBnZXRTY2VuYXJpbygpIHsKKwkJCXJldHVybiBzaW11bGF0aW9uLmdldFNjZW5hcmlvKCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbiNnZXRTaW11bGF0aW9uU3RhdGUoKQorCQkgKi8KKwkJcHVibGljIFNpbXVsYXRpb25TdGF0ZSBnZXRTaW11bGF0aW9uU3RhdGUoKSB7CisJCQlyZXR1cm4gc2ltdWxhdGlvbi5nZXRTaW11bGF0aW9uU3RhdGUoKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uI2dldFNlcXVlbmNlTnVtYmVyKCkKKwkJICovCisJCXB1YmxpYyBpbnQgZ2V0U2VxdWVuY2VOdW1iZXIoKSB7CisJCQlyZXR1cm4gc2ltdWxhdGlvbi5nZXRTZXF1ZW5jZU51bWJlcigpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb24jc2V0U2VxdWVuY2VOdW1iZXIoaW50KQorCQkgKi8KKwkJcHVibGljIHZvaWQgc2V0U2VxdWVuY2VOdW1iZXIoZmluYWwgaW50IHNlcXVlbmNlTnVtYmVyKSB7CisJCQlzaW11bGF0aW9uLnNldFNlcXVlbmNlTnVtYmVyKHNlcXVlbmNlTnVtYmVyKTsKKwkJfSAvLyBzZXRTZXF1ZW5jZU51bWJlcgorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uI3BhdXNlKCkKKwkJICovCisJCXB1YmxpYyB2b2lkIHBhdXNlKCkgeworCQkJc2ltdWxhdGlvbi5wYXVzZSgpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb24jcmVzZXQoKQorCQkgKi8KKwkJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCQlzaW11bGF0aW9uLnJlc2V0KCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbiNydW4oKQorCQkgKi8KKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJc2ltdWxhdGlvbi5ydW4oKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uI3N0ZXAoKQorCQkgKi8KKwkJcHVibGljIHZvaWQgc3RlcCgpIHsKKwkJCXNpbXVsYXRpb24uc3RlcCgpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb24jc3RvcCgpCisJCSAqLworCQlwdWJsaWMgdm9pZCBzdG9wKCkgeworCQkJc2ltdWxhdGlvbi5zdG9wKCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlI2lzUnVubmluZygpCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7CisJCQlyZXR1cm4gc2ltdWxhdGlvbi5pc1J1bm5pbmcoKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUjaXNTdG9wcGFibGUoKQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaXNTdG9wcGFibGUoKSB7CisJCQlyZXR1cm4gc2ltdWxhdGlvbi5pc1N0b3BwYWJsZSgpOworCQl9CisKKwkJLyoqCisJCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbiNqb2luKCkKKwkJICovCisJCXB1YmxpYyB2b2lkIGpvaW4oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQkJc2ltdWxhdGlvbi5qb2luKCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbiNjYW5jZWwoKQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gY2FuY2VsKCkgeworCQkJcmV0dXJuIHNpbXVsYXRpb24uY2FuY2VsKCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbiNhZGRTaW11bGF0aW9uTGlzdGVuZXIob3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25MaXN0ZW5lcikKKwkJICovCisJCXB1YmxpYyB2b2lkIGFkZFNpbXVsYXRpb25MaXN0ZW5lcihmaW5hbCBJU2ltdWxhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKKwkJCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwkJCX0KKwkJfSAvLyBhZGRTaW11bGF0aW9uTGlzdGVuZXIKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbiNyZW1vdmVTaW11bGF0aW9uTGlzdGVuZXIob3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25MaXN0ZW5lcikKKwkJICovCisJCXB1YmxpYyB2b2lkIHJlbW92ZVNpbXVsYXRpb25MaXN0ZW5lcihmaW5hbCBJU2ltdWxhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwkJfSAvLyByZW1vdmVTaW11bGF0aW9uTGlzdGVuZXIKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbiNhZGRTaW11bGF0aW9uTGlzdGVuZXJTeW5jKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uTGlzdGVuZXJTeW5jKQorCQkgKi8KKwkJcHVibGljIHZvaWQgYWRkU2ltdWxhdGlvbkxpc3RlbmVyU3luYygKKwkJCQlmaW5hbCBJU2ltdWxhdGlvbkxpc3RlbmVyU3luYyBsaXN0ZW5lcikgeworCQkJaWYgKCFsaXN0ZW5lcnNTeW5jLmNvbnRhaW5zKGxpc3RlbmVyKSkgeworCQkJCWxpc3RlbmVyc1N5bmMuYWRkKGxpc3RlbmVyKTsKKwkJCX0KKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uI3JlbW92ZVNpbXVsYXRpb25MaXN0ZW5lclN5bmMob3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25MaXN0ZW5lclN5bmMpCisJCSAqLworCQlwdWJsaWMgdm9pZCByZW1vdmVTaW11bGF0aW9uTGlzdGVuZXJTeW5jKAorCQkJCWZpbmFsIElTaW11bGF0aW9uTGlzdGVuZXJTeW5jIGxpc3RlbmVyKSB7CisJCQlsaXN0ZW5lcnNTeW5jLnJlbW92ZShsaXN0ZW5lcik7CisJCX0KKworCQkvKioKKwkJICogVGVsbCB0aGUgbGlzdGVuZXJzIGFib3V0IHRoZSBjaGFuZ2UgaW4gdGhlIHtAbGluayBTaW11bGF0aW9ufXMgc3RhdGUKKwkJICogCisJCSAqIEBwYXJhbSBzaW11bGF0aW9uU3RhdGUKKwkJICogICAgICAgICAgICB0aGUgbmV3IHN0YXRlIG9mIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0KKwkJICovCisJCXByb3RlY3RlZCB2b2lkIGZpcmVTaW11bGF0aW9uQ2hhbmdlZCgKKwkJCQlmaW5hbCBTaW11bGF0aW9uRXZlbnQgZXZlbnQpIHsKKwkJCWZpbmFsIFNpbXVsYXRpb25FdmVudCBldiA9IG5ldyBTaW11bGF0aW9uRXZlbnQodGhpcywKKwkJCQkJZXZlbnQuZ2V0U2ltdWxhdGlvblN0YXRlKCksIGV2ZW50LmdldEl0ZXJhdGlvblByb2dyZXNzKCkpOworCQkJZm9yIChmaW5hbCBJU2ltdWxhdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7CisJCQkJbGlzdGVuZXIuc2ltdWxhdGlvbkNoYW5nZWQoZXYpOworCQkJfSAvLyBmb3IKKwkJfSAvLyBmaXJlU2ltdWxhdGlvbk1hbmFnZXJDaGFuZ2VkCisKKwkJLyoqCisJCSAqIFRlbGwgdGhlIGxpc3RlbmVycyBhYm91dCB0aGUgY2hhbmdlIGluIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn1zIHN0YXRlCisJCSAqIAorCQkgKiBAcGFyYW0gc2ltdWxhdGlvblN0YXRlCisJCSAqICAgICAgICAgICAgdGhlIG5ldyBzdGF0ZSBvZiB0aGUge0BsaW5rIFNpbXVsYXRpb259CisJCSAqLworCQlwcm90ZWN0ZWQgdm9pZCBmaXJlU2ltdWxhdGlvbkNoYW5nZWRTeW5jKAorCQkJCWZpbmFsIFNpbXVsYXRpb25FdmVudCBldmVudCkgeworCQkJZmluYWwgU2ltdWxhdGlvbkV2ZW50IGV2ID0gbmV3IFNpbXVsYXRpb25FdmVudCh0aGlzLAorCQkJCQlldmVudC5nZXRTaW11bGF0aW9uU3RhdGUoKSwgZXZlbnQuZ2V0SXRlcmF0aW9uUHJvZ3Jlc3MoKSk7CisJCQlmb3IgKGZpbmFsIElTaW11bGF0aW9uTGlzdGVuZXJTeW5jIGxpc3RlbmVyIDogbGlzdGVuZXJzU3luYykgeworCQkJCWxpc3RlbmVyLnNpbXVsYXRpb25DaGFuZ2VkU3luYyhldik7CisJCQl9IC8vIGZvcgorCQl9IC8vIGZpcmVTaW11bGF0aW9uQ2hhbmdlZFN5bmMKKworCQkvKioKKwkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuIHNpbXVsYXRpb24udG9TdHJpbmcoKTsKKwkJfSAvLyB0b1N0cmluZworCisJCS8qKgorCQkgKiBUaGlzIGlzIHdoZXJlIHRoZSBhZGFwdGVkIHtAbGluayBTaW11bGF0aW9ufSB0ZWxscyB1cyBvZiBpdHMgc3RhdGUKKwkJICogY2hhbmdlcyBhbmQgd2UgbmVlZCB0byBhZGFwdCB0aGVtIHRvIHRoZSBVSSB0aHJlYWQuCisJCSAqIAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uTGlzdGVuZXIjc2ltdWxhdGlvbkNoYW5nZWQob3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbkV2ZW50KQorCQkgKi8KKwkJcHVibGljIHZvaWQgc2ltdWxhdGlvbkNoYW5nZWQoZmluYWwgU2ltdWxhdGlvbkV2ZW50IGV2ZW50KSB7CisJCQl0cnkgeworCQkJCWlmICghRGlzcGxheS5nZXREZWZhdWx0KCkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCS8vIFllcworCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCWZpcmVTaW11bGF0aW9uQ2hhbmdlZChldmVudCk7CisJCQkJCQl9CisJCQkJCX0pOworCQkJCX0gLy8gaWYKKwkJCX0gLy8gdHJ5CisJCQljYXRjaCAoZmluYWwgTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworCQkJCS8vIE5vdGhpbmcgdG8gZG8sIHNodXR0aW5nIGRvd24uLi4KKwkJCX0gLy8gY2F0Y2ggTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJCWNhdGNoIChmaW5hbCBFcnJvciBuY2RmZSkgeworCQkJCS8vIElmIHdlIGdldCB0aGlzIGV4Y2VwdGlvbiwgaXQgaXMgYmVjYXVzZSB3ZSdyZSBub3QgcnVubmluZyBpbgorCQkJCS8vIGVjbGlwc2UuIEp1c3QgZmlyZSB0aGUgZXZlbnQuCisJCQkJZmlyZVNpbXVsYXRpb25DaGFuZ2VkKGV2ZW50KTsKKwkJCX0gLy8gY2F0Y2gKKworCQl9IC8vIHNpbXVsYXRpb25DaGFuZ2VkCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25MaXN0ZW5lclN5bmMjc2ltdWxhdGlvbkNoYW5nZWRTeW5jKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25FdmVudCkKKwkJICovCisJCXB1YmxpYyB2b2lkIHNpbXVsYXRpb25DaGFuZ2VkU3luYyhmaW5hbCBTaW11bGF0aW9uRXZlbnQgZXZlbnQpIHsKKwkJCXRyeSB7CisJCQkJaWYgKCFEaXNwbGF5LmdldERlZmF1bHQoKS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQkJLy8gWWVzCisJCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQlmaXJlU2ltdWxhdGlvbkNoYW5nZWRTeW5jKGV2ZW50KTsKKwkJCQkJCX0KKwkJCQkJfSk7CisJCQkJfSAvLyBpZgorCQkJfSAvLyB0cnkKKwkJCWNhdGNoIChmaW5hbCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gTm90aGluZyB0byBkbywgc2h1dHRpbmcgZG93bi4uLgorCQkJfSAvLyBjYXRjaCBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCQkJY2F0Y2ggKGZpbmFsIEVycm9yIG5jZGZlKSB7CisJCQkJLy8gSWYgd2UgZ2V0IHRoaXMgZXhjZXB0aW9uLCBpdCBpcyBiZWNhdXNlIHdlJ3JlIG5vdCBydW5uaW5nIGluCisJCQkJLy8gZWNsaXBzZS4gSnVzdCBmaXJlIHRoZSBldmVudC4KKwkJCQlmaXJlU2ltdWxhdGlvbkNoYW5nZWRTeW5jKGV2ZW50KTsKKwkJCX0gLy8gY2F0Y2gKKworCQl9IC8vIHNpbXVsYXRpb25DaGFuZ2VkU3luYworCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBzaW11bGF0aW9uCisJCSAqLworCQlwdWJsaWMgSVNpbXVsYXRpb24gZ2V0U2ltdWxhdGlvbigpIHsKKwkJCXJldHVybiBzaW11bGF0aW9uOworCQl9CisKKwl9IC8vIFNpbXVsYXRpb25BZGFwdGVyCit9IC8vIFNpbXVsYXRpb25NYW5hZ2VyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9zaW11bGF0aW9uL1NpbXVsYXRpb25NYW5hZ2VyRXZlbnQuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vU2ltdWxhdGlvbk1hbmFnZXJFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyM2ZlM2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9zaW11bGF0aW9uL1NpbXVsYXRpb25NYW5hZ2VyRXZlbnQuamF2YQpAQCAtMCwwICsxLDk5IEBACisvLyBTaW11bGF0aW9uTWFuYWdlckV2ZW50LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBldmVudCB0aGF0IGhhcyBvY2N1cnJlZCBpbiB0aGUgb3BlcmF0aW9uIG9mIHRoZQorICogU2ltdWxhdGlvbk1hbmFnZXIKKyAqIAorICogQHNlZSBTaW11bGF0aW9uTWFuYWdlcgorICogQHNlZSBJU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lcgorICovCitwdWJsaWMgY2xhc3MgU2ltdWxhdGlvbk1hbmFnZXJFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKKworCS8qKgorCSAqIEdlbmVyYXRlZCBzZXJpYWxpemF0aW9uIElECisJICovCisJdHJhbnNpZW50IHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY1MzM2ODI4NDI1NDcyMzU4MDlMOworCisJLyoqCisJICogVGhpcyBpcyBhIGNvbGxlY3Rpb24gb2YgdGhlIFNpbXVsYXRpb25zIGFkZGVkIHRvIHRoZSBtYW5hZ2VyLgorCSAqLworCXRyYW5zaWVudCBwcml2YXRlIGZpbmFsIElTaW11bGF0aW9uW10gc2ltdWxhdGlvbnNBZGRlZDsKKworCS8qKgorCSAqIFRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIHRoZSBTaW11bGF0aW9ucyByZW1vdmVkIGZyb20gdGhlCisJICogU2ltdWxhdGlvbk1hbmFnZXIuCisJICovCisJdHJhbnNpZW50IHByaXZhdGUgZmluYWwgSVNpbXVsYXRpb25bXSBzaW11bGF0aW9uc1JlbW92ZWQ7CisKKwkvKioKKwkgKiBAcGFyYW0gc291cmNlCisJICogICAgICAgICAgICB0aGUgc291cmNlIG9mIHRoZSBldmVudAorCSAqIEBwYXJhbSBzaW11bGF0aW9uc0FkZGVkCisJICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiBvZiBTaW11bGF0aW9ucyBhZGRlZCB0byB0aGUgbWFuYWdlcgorCSAqIEBwYXJhbSBzaW11bGF0aW9uc1JlbW92ZWQKKwkgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIFNpbXVsYXRpb25zIHJlbW92ZWQgZnJvbSB0aGUgbWFuYWdlcgorCSAqLworCXB1YmxpYyBTaW11bGF0aW9uTWFuYWdlckV2ZW50KFNpbXVsYXRpb25NYW5hZ2VyIHNvdXJjZSwKKwkJCUlTaW11bGF0aW9uW10gc2ltdWxhdGlvbnNBZGRlZCwgSVNpbXVsYXRpb25bXSBzaW11bGF0aW9uc1JlbW92ZWQpIHsKKwkJc3VwZXIoc291cmNlKTsKKwkJdGhpcy5zaW11bGF0aW9uc0FkZGVkID0gc2ltdWxhdGlvbnNBZGRlZC5jbG9uZSgpOworCQl0aGlzLnNpbXVsYXRpb25zUmVtb3ZlZCA9IHNpbXVsYXRpb25zUmVtb3ZlZC5jbG9uZSgpOworCX0gLy8gU2ltdWxhdGlvbk1hbmFnZXJFdmVudAorCisJLyoqCisJICogQHJldHVybiB0aGUgc2ltdWxhdGlvbnNBZGRlZAorCSAqLworCXB1YmxpYyBmaW5hbCBJU2ltdWxhdGlvbltdIGdldFNpbXVsYXRpb25zQWRkZWQoKSB7CisJCXJldHVybiBzaW11bGF0aW9uc0FkZGVkLmNsb25lKCk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgc2ltdWxhdGlvbnNSZW1vdmVkCisJICovCisJcHVibGljIGZpbmFsIElTaW11bGF0aW9uW10gZ2V0U2ltdWxhdGlvbnNSZW1vdmVkKCkgeworCQlyZXR1cm4gc2ltdWxhdGlvbnNSZW1vdmVkLmNsb25lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBqYXZhLnV0aWwuRXZlbnRPYmplY3QjdG9TdHJpbmcoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiQWRkZWQ6WyIpOyAvLyROT04tTkxTLTEkCisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2ltdWxhdGlvbnNBZGRlZC5sZW5ndGg7IGkrKykgeworCQkJc2IuYXBwZW5kKCJcIiIpOyAvLyROT04tTkxTLTEkCisJCQlzYi5hcHBlbmQoc2ltdWxhdGlvbnNBZGRlZFtpXS50b1N0cmluZygpKTsKKwkJCXNiLmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGkgKyAxIDwgc2ltdWxhdGlvbnNBZGRlZC5sZW5ndGgpIHsKKwkJCQlzYi5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlzYi5hcHBlbmQoIl0sIFJlbW92ZWQ6WyIpOyAvLyROT04tTkxTLTEkCisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2ltdWxhdGlvbnNSZW1vdmVkLmxlbmd0aDsgaSsrKSB7CisJCQlzYi5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQKKwkJCXNiLmFwcGVuZChzaW11bGF0aW9uc1JlbW92ZWRbaV0udG9TdHJpbmcoKSk7CisJCQlzYi5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChpICsgMSA8IHNpbXVsYXRpb25zUmVtb3ZlZC5sZW5ndGgpIHsKKwkJCQlzYi5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlzYi5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJAorCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0gLy8gdG9TdHJpbmcKKworfSAvLyBTaW11bGF0aW9uTWFuYWdlckV2ZW50CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9zaW11bGF0aW9uL1NpbXVsYXRpb25TdGF0ZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9TaW11bGF0aW9uU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTBlMzk3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9TaW11bGF0aW9uU3RhdGUuamF2YQpAQCAtMCwwICsxLDkzIEBACisvLyBTaW11bGF0aW9uU3RhdGUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqCisgKiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHN0YXRlcyB0aGF0IGEgU2ltdWxhdGlvbiBjYW4gYmUgaW4uCisgKiAKKyAqIEBzZWUgU2ltdWxhdGlvbkV2ZW50CisgKiBAc2VlIElTaW11bGF0aW9uTGlzdGVuZXIKKyAqIEBzZWUgSVNpbXVsYXRpb24KKyAqLworcHVibGljIGVudW0gU2ltdWxhdGlvblN0YXRlIHsKKwkvKioKKwkgKiBXaGVuIHRoZSBzaW11bGF0aW9uIGhhcyBiZWVuIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uIGFuZCBpcyBydW5uaW5nLiBUaGlzCisJICogaXMgdGhlIGluaXRpYWwgc3RhdGUgb2YgYWxsIG5ld2x5IGNyZWF0ZWQgU2ltdWxhdGlvbnMuCisJICogPHA+CisJICogVGhlIG5leHQgc3RhdGUgaXMge0BsaW5rICNDT01QTEVURURfQ1lDTEV9LgorCSAqIAorCSAqIEBzZWUgI0NPTVBMRVRFRF9DWUNMRQorCSAqLworCVJVTk5JTkcsCisKKwkvKioKKwkgKiBXaGVuIHRoZSBzaW11bGF0aW9uIGhhcyBjb21wbGV0ZWQgb25lIGN5Y2xlIG9mIGEgc2ltdWxhdGlvbiBzZXF1ZW5jZS4KKwkgKiA8cD4KKwkgKiBUaGUgbmV4dCBzdGF0ZXMgYXJlIHtAbGluayAjQ09NUExFVEVEX0NZQ0xFfSwKKwkgKiB7QGxpbmsgI0NPTVBMRVRFRF9TRVFVRU5DRX0sIHtAbGluayAjUEFVU0VEfSwge0BsaW5rICNSRVNFVH0sCisJICoge0BsaW5rICNTVE9QUEVEfS4KKwkgKiAKKwkgKiBAc2VlICNDT01QTEVURURfQ1lDTEUKKwkgKiBAc2VlICNDT01QTEVURURfU0VRVUVOQ0UKKwkgKiBAc2VlICNQQVVTRUQKKwkgKiBAc2VlICNSRVNFVAorCSAqIEBzZWUgI1NUT1BQRUQKKwkgKi8KKwlDT01QTEVURURfQ1lDTEUsCisKKwkvKioKKwkgKiBXaGVuIHRoZSBzaW11bGF0aW9uIGhhcyBjb21wbGV0ZWQgYWxsIG9mIHRoZSBzZXF1ZW5jZXMgaW4gdGhlIHNpbXVsYXRpb24uCisJICogPHA+CisJICogVGhlIG5leHQgc3RhdGVzIGFyZSB7QGxpbmsgI0NPTVBMRVRFRF9DWUNMRX0sIHtAbGluayAjUEFVU0VEfSwKKwkgKiB7QGxpbmsgI1JFU0VUfSwge0BsaW5rICNTVE9QUEVEfS4KKwkgKiAKKwkgKiBAc2VlICNQQVVTRUQKKwkgKiBAc2VlICNSRVNFVAorCSAqIEBzZWUgI1NUT1BQRUQKKwkgKi8KKwlDT01QTEVURURfU0VRVUVOQ0UsCisJLyoqCisJICogV2hlbiB0aGUgc2ltdWxhdGlvbiBpcyBub3Qgc2NoZWR1bGVkIGZvciBleGVjdXRpb24sIGJ1dCBpdCBzdGlsbCByZXRhaW5zCisJICogaXRzIHNjZW5hcmlvIHdoaWNoIG1haW50YWlucyBpdHMgc3RhdGUgaW5mb3JtYXRpb24uIFRoZSBTaW11bGF0aW9uIGNhbiBiZQorCSAqIHNjaGVkdWxlZCBhZ2FpbiBmb3IgZXhlY3V0aW9uLgorCSAqIDxwPgorCSAqIFRoZSBuZXh0IHN0YXRlcyBhcmUge0BsaW5rICNSVU5OSU5HfSwge0BsaW5rICNSRVNFVH0sIHtAbGluayAjU1RPUFBFRH0KKwkgKiAKKwkgKiBAc2VlICNSVU5OSU5HCisJICogQHNlZSAjUkVTRVQKKwkgKiBAc2VlICNTVE9QUEVECisJICovCisJUEFVU0VELAorCisJLyoqCisJICogVGhlIFNpbXVsYXRpb24ncyBTY2VuYXJpbyBpcyBiZWluZyByZXNldCB0byBpdHMgaW5pdGlhbCBzdGF0ZS4gVGhlCisJICogU2ltdWxhdGlvbiBjYW4gYmUgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uCisJICogPHA+CisJICogVGhlIG5leHQgc3RhdGVzIGFyZSB7QGxpbmsgI1BBVVNFRH0sIHtAbGluayAjU1RPUFBFRH0KKwkgKiAKKwkgKiBAc2VlICNQQVVTRUQKKwkgKiBAc2VlICNTVE9QUEVECisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8jcmVzZXQoKQorCSAqLworCVJFU0VULAorCisJLyoqCisJICogVGhlIHNpbXVsYXRpb24gaXMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBzaW11bGF0aW9uIG1hbmFnZXIgYW5kIGl0cyBzdGF0ZQorCSAqIGluZm9ybWF0aW9uIGRlc3Ryb3llZC4KKwkgKiAKKwkgKiBAc2VlIFNpbXVsYXRpb25NYW5hZ2VyCisJICovCisJU1RPUFBFRAorfSAvLyBTaW11bGF0aW9uU3RhdGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQyY2E4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjQgQEAKKyMgbWVzc2FnZXMucHJvcGVydGllcworIworIyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqCisjICogQ29udHJpYnV0b3JzOgorIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIyBTaW11bGF0aW9uTWFuYWdlcgorU2ltTWdyLkRlc2VyaWFsaXphdGlvbl9FcnJvcj1Qcm9ibGVtIHJlYWRpbmcgaW4gYSBzZXJpYWxpemVkIFNjZW5hcmlvIGZyb20gVVJJIFwiezB9XCIKK1NpbU1nci5TdGFydF9TaW09U3RhcnRpbmcgc2ltdWxhdGlvbgorU2ltTWdyLkNydFNpbSA9IENyZWF0aW5nIFNpbXVsYXRpb24KK1NpbU1nci5SdW4gPSBSdW5uaW5nIFNpbXVsYXRpb24KKworIyBTaW11bGF0aW9uCitTaW0uVGltZV9FcnJvcj1UaW1lIHRvIHN0b3AgYmVmb3JlIHN0YXJ0aW5nLiAgQ3VycmVudCB0aW1lIGlzOiB7MH0sIFN0b3BwaW5nIHRpbWUgaXM6IHsxfQorU2ltLklFcnIgPSBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZCBydW5uaW5nICJ7MH0iLgorU2ltLk1pc3NpbmdTZXEgPSBUaGUgU2NlbmFyaW8gInswfSIgY2Fubm90IHJ1biBiZWNhdXNlIGl0IGRvZXMgbm90IGhhdmUgYSBTZXF1ZW5jZXIuCitTaW0uTWlzc2luZ01vZGVsID0gVGhlIFNjZW5hcmlvICJ7MH0iIGNhbm5vdCBydW4gYmVjYXVzZSBpdCBkb2VzIG5vdCBoYXZlIGEgTW9kZWwuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRlODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy8ucHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGExZDVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHByb2plY3REZXNjcmlwdGlvbj4NCisJPG5hbWU+b3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzPC9uYW1lPg0KKwk8Y29tbWVudD48L2NvbW1lbnQ+DQorCTxwcm9qZWN0cz4NCisJPC9wcm9qZWN0cz4NCisJPGJ1aWxkU3BlYz4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwk8L2J1aWxkU3BlYz4NCisJPG5hdHVyZXM+DQorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KKwk8L25hdHVyZXM+DQorPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4N2UzNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSwxNSBAQAorI1R1ZSBTZXAgMDEgMTY6NTQ6MTMgRURUIDIwMDkKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdEZXNjcmlwdGlvbj1yZXR1cm5fdGFnCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MjM3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyMyBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wDQorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQ0KK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscztzaW5nbGV0b246PXRydWUNCitCdW5kbGUtVmVyc2lvbjogMS4wLjEucXVhbGlmaWVyDQorQnVuZGxlLUNsYXNzUGF0aDogLg0KK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUNCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4NCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUNCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsDQorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQ7YnVuZGxlLXZlcnNpb249IjIuNC4xIiwNCisgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucywNCisgb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQsDQorIG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHk7YnVuZGxlLXZlcnNpb249IjEuMC4xIg0KK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5DQorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscywNCisgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLA0KKyBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbCwNCisgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLA0KKyBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQudXRpbA0KK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5BY3RpdmF0b3INCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YWU3ODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE2IEBACisNCisjIDxjb3B5cmlnaHQ+DQorIyA8L2NvcHlyaWdodD4NCisjDQorIyAkSWQkDQorDQorYmluLmluY2x1ZGVzID0gLixcDQorICAgICAgICAgICAgICAgbW9kZWwvLFwNCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXA0KKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwNCisgICAgICAgICAgICAgICBpY29ucy8sXA0KKyAgICAgICAgICAgICAgIGJpbi8NCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuDQorc291cmNlLi4gPSBzcmMvDQorb3V0cHV0Li4gPSBiaW4vDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbF9wb3B1bGF0aW9uR3JvdXBzX1BvcHVsYXRpb25Hcm91cC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsX3BvcHVsYXRpb25Hcm91cHNfUG9wdWxhdGlvbkdyb3VwLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzQ4Njk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbF9wb3B1bGF0aW9uR3JvdXBzX1BvcHVsYXRpb25Hcm91cC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYmFmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9jdXN0b20xNi9EZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvUG9wdWxhdGlvbk1vZGVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L1BvcHVsYXRpb25Nb2RlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxNmY1OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L1BvcHVsYXRpb25Nb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZkNjg4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9jdXN0b20xNi9TZWFzb25hbFBvcHVsYXRpb25Nb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNDY0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9jdXN0b20xNi9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L1N0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5ZTQ5NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L1N0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvVGh1bWJzLmRiIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvVGh1bWJzLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMDU3NmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9jdXN0b20xNi9UaHVtYnMuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvcG9wdWxhdGlvbmluaXRpYWxpemVyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L3BvcHVsYXRpb25pbml0aWFsaXplci5naWYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzliZjhjMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L3BvcHVsYXRpb25pbml0aWFsaXplci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZjI4MDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9EZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL29iajE2L0VhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwZWVlMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL29iajE2L0VhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvUG9wdWxhdGlvbkdyb3VwLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL29iajE2L1BvcHVsYXRpb25Hcm91cC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2OTI1NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL29iajE2L1BvcHVsYXRpb25Hcm91cC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvUG9wdWxhdGlvbkluaXRpYWxpemVyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL29iajE2L1BvcHVsYXRpb25Jbml0aWFsaXplci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhZDVkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL29iajE2L1BvcHVsYXRpb25Jbml0aWFsaXplci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvUG9wdWxhdGlvbkxhYmVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL29iajE2L1BvcHVsYXRpb25MYWJlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyMjQ2MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL29iajE2L1BvcHVsYXRpb25MYWJlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvUG9wdWxhdGlvbkxhYmVsVmFsdWUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvUG9wdWxhdGlvbkxhYmVsVmFsdWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOWViYmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9Qb3B1bGF0aW9uTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvUG9wdWxhdGlvbk1vZGVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL29iajE2L1BvcHVsYXRpb25Nb2RlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwZWVlMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL29iajE2L1BvcHVsYXRpb25Nb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvUG9wdWxhdGlvbk1vZGVsTGFiZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvUG9wdWxhdGlvbk1vZGVsTGFiZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYWZiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9Qb3B1bGF0aW9uTW9kZWxMYWJlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9Qb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGQyMjI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvUG9wdWxhdGlvbk1vZGVsVmFsdWUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvUG9wdWxhdGlvbk1vZGVsVmFsdWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMjI0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9Qb3B1bGF0aW9uTW9kZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNmUzYjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9TZWFzb25hbFBvcHVsYXRpb25Nb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExN2RjN2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZjBjNDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzllYmJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL29iajE2L1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1MDBkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL29iajE2L1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL29iajE2L1N0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0MTU5OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL29iajE2L1N0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9ZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzY0M2RhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL21vZGVsL3N0YW5kYXJkLmVjb3JlIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL21vZGVsL3N0YW5kYXJkLmVjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNjg3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvbW9kZWwvc3RhbmRhcmQuZWNvcmUKQEAgLTAsMCArMSw4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ic3RhbmRhcmQiCisgICAgbnNVUkk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkIj4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3B1bGF0aW9uTW9kZWwiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL21vZGVsLmVjb3JlIy8vTm9kZURlY29yYXRvciAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvbW9kaWZpZXIuZWNvcmUjLy9Nb2RpZmlhYmxlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icG9wdWxhdGlvbklkZW50aWZpZXIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RyaW5nIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJodW1hbiIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iSHVtYW5Qb3B1bGF0aW9uTW9kZWwiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFyZ2V0SVNPS2V5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsIiBlU3VwZXJUeXBlcz0iIy8vUG9wdWxhdGlvbk1vZGVsICMvL0ludGVncmF0aW9uRGVjb3JhdG9yIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmlydGhSYXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMC4wIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlYXRoUmF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VEb3VibGUiCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjAuMCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0aW1lUGVyaW9kIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTG9uZyIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iODY0MDAwMDAiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9wdWxhdGlvbk1vZGVsTGFiZWwiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUjLy9EeW5hbWljTm9kZUxhYmVsIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9wdWxhdGlvbkxhYmVsIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvbW9kZWwvbGFiZWxzLmVjb3JlIy8vUG9wdWxhdGlvbkxhYmVsIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvcHVsYXRpb25JZGVudGlmaWVyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsIiBlU3VwZXJUeXBlcz0iIy8vUG9wdWxhdGlvbk1vZGVsTGFiZWwgIy8vSW50ZWdyYXRpb25MYWJlbCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbHRhVmFsdWUiIGVUeXBlPSIjLy9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvYmVWYWx1ZSIgZVR5cGU9IiMvL1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZW1wVmFsdWUiIGVUeXBlPSIjLy9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3JpZ2luYWxWYWx1ZSIgZVR5cGU9IiMvL1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlcnJvclNjYWxlIiBlVHlwZT0iIy8vU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkludGVncmF0aW9uTGFiZWwiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbCIKKyAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbnRlZ3JhdGlvbkxhYmVsVmFsdWUiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbFZhbHVlIgorICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkludGVncmF0aW9uRGVjb3JhdG9yIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yIgorICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUjLy9MYWJlbFZhbHVlIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIiBlU3VwZXJUeXBlcz0iIy8vUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSAjLy9JbnRlZ3JhdGlvbkxhYmVsVmFsdWUiPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGp1c3REZWx0YSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VCb29sZWFuIj4KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJ2YWx1ZSIgZVR5cGU9IiMvL0ludGVncmF0aW9uTGFiZWxWYWx1ZSIvPgorICAgIDwvZU9wZXJhdGlvbnM+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvdW50IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbmNpZGVuY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FRG91YmxlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJpcnRocyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VEb3VibGUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVhdGhzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZW5zaXR5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIwLjAiIHVuc2V0dGFibGU9InRydWUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsIiBlU3VwZXJUeXBlcz0iIy8vU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnYWluIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMC4wMSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbCIgZVN1cGVyVHlwZXM9IiMvL1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9wdWxhdGlvbkdyb3VwcyIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb3B1bGF0aW9uR3JvdXAiIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvcHVsYXRpb25Hcm91cCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkZW50aWZpZXIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZyYWN0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMC41Ii8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvcHVsYXRpb25Jbml0aWFsaXplciIgYWJzdHJhY3Q9InRydWUiCisgICAgICBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL21vZGVsLmVjb3JlIy8vTm9kZURlY29yYXRvciAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvbW9kaWZpZXIuZWNvcmUjLy9Nb2RpZmlhYmxlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFyZ2V0SVNPS2V5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3B1bGF0aW9uSWRlbnRpZmllciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Imh1bWFuIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyIiBlU3VwZXJUeXBlcz0iIy8vUG9wdWxhdGlvbkluaXRpYWxpemVyIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5kaXZpZHVhbHMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIxIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZURlbnNpdHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQm9vbGVhbiIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwiIGVTdXBlclR5cGVzPSIjLy9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBoYXNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMC4wIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vZHVsYXRpb25BbXBsaXR1ZGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FRG91YmxlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIxLjAiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyaW9kIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSIKKyAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjM2NS4yNSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2VMYXRpdHVkZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VCb29sZWFuIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplciIgYWJzdHJhY3Q9InRydWUiCisgICAgICBlU3VwZXJUeXBlcz0iIy8vUG9wdWxhdGlvbkluaXRpYWxpemVyIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplciIgZVN1cGVyVHlwZXM9IiMvL0VhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplciIvPgorPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9tb2RlbC9zdGFuZGFyZC5nZW5tb2RlbCBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9tb2RlbC9zdGFuZGFyZC5nZW5tb2RlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2E2NjY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL21vZGVsL3N0YW5kYXJkLmdlbm1vZGVsCkBAIC0wLDAgKzEsNzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgorICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMiCisgICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMiCisgICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzIiBtb2RlbE5hbWU9IlN0YW5kYXJkIiB0ZXN0c0RpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMucG9wdWxhdGlvbm1vZGVscy9zcmMiCisgICAgdGVzdFN1aXRlQ2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC50ZXN0cy5EaXNlYXNlbW9kZWxzQWxsVGVzdHMiCisgICAgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLmVjb3JlIiBjb21wbGlhbmNlTGV2ZWw9IjYuMCIgY29weXJpZ2h0RmllbGRzPSJmYWxzZSIKKyAgICBlZGl0b3JQbHVnaW5JRD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzIiB0ZXN0c1BsdWdpbklEPSJvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnBvcHVsYXRpb25tb2RlbHMiCisgICAgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL2NvbW1vbiAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL2dyYXBoIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vbW9kZWwgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9tb2RpZmllciAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL3NjZW5hcmlvIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vc2VxdWVuY2VyIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vc29sdmVyIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvbW9kZWwvZGVmaW5pdGlvbnMuZ2VubW9kZWwjLy9sYWJlbHMgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZSI+CisgIDxmb3JlaWduTW9kZWw+c3RhbmRhcmQuZWNvcmU8L2ZvcmVpZ25Nb2RlbD4KKyAgPGdlblBhY2thZ2VzIHByZWZpeD0iU3RhbmRhcmQiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCisgICAgICBlY29yZVBhY2thZ2U9InN0YW5kYXJkLmVjb3JlIy8iPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vUG9wdWxhdGlvbk1vZGVsIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzdGFuZGFyZC5lY29yZSMvL1BvcHVsYXRpb25Nb2RlbC9wb3B1bGF0aW9uSWRlbnRpZmllciIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vUG9wdWxhdGlvbk1vZGVsL25hbWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzdGFuZGFyZC5lY29yZSMvL1BvcHVsYXRpb25Nb2RlbC90YXJnZXRJU09LZXkiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbC9iaXJ0aFJhdGUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzdGFuZGFyZC5lY29yZSMvL1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsL2RlYXRoUmF0ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwvdGltZVBlcmlvZCIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzdGFuZGFyZC5lY29yZSMvL1BvcHVsYXRpb25Nb2RlbExhYmVsIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzdGFuZGFyZC5lY29yZSMvL1BvcHVsYXRpb25Nb2RlbExhYmVsL3BvcHVsYXRpb25MYWJlbCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vUG9wdWxhdGlvbk1vZGVsTGFiZWwvcG9wdWxhdGlvbklkZW50aWZpZXIiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzdGFuZGFyZC5lY29yZSMvL1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwvZGVsdGFWYWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHN0YW5kYXJkLmVjb3JlIy8vU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbC9wcm9iZVZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsL3RlbXBWYWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHN0YW5kYXJkLmVjb3JlIy8vU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbC9vcmlnaW5hbFZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsL2Vycm9yU2NhbGUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJzdGFuZGFyZC5lY29yZSMvL0ludGVncmF0aW9uTGFiZWwiLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vSW50ZWdyYXRpb25MYWJlbFZhbHVlIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJzdGFuZGFyZC5lY29yZSMvL0ludGVncmF0aW9uRGVjb3JhdG9yIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9Qb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlL2NvdW50Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUvaW5jaWRlbmNlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUvYmlydGhzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUvZGVhdGhzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzdGFuZGFyZC5lY29yZSMvL1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZS9kZW5zaXR5Ii8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ic3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUvYWRqdXN0RGVsdGEiPgorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ic3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUvYWRqdXN0RGVsdGEvdmFsdWUiLz4KKyAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9TdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsL2dhaW4iLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9EZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbCI+CisgICAgICA8Z2VuRmVhdHVyZXMgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHN0YW5kYXJkLmVjb3JlIy8vRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwvcG9wdWxhdGlvbkdyb3VwcyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzdGFuZGFyZC5lY29yZSMvL1BvcHVsYXRpb25Hcm91cCI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9Qb3B1bGF0aW9uR3JvdXAvaWRlbnRpZmllciIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vUG9wdWxhdGlvbkdyb3VwL2ZyYWN0aW9uIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InN0YW5kYXJkLmVjb3JlIy8vUG9wdWxhdGlvbkluaXRpYWxpemVyIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzdGFuZGFyZC5lY29yZSMvL1BvcHVsYXRpb25Jbml0aWFsaXplci90YXJnZXRJU09LZXkiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplciI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplci9pbmRpdmlkdWFscyIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIvdXNlRGVuc2l0eSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIvcG9wdWxhdGlvbklkZW50aWZpZXIiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic3RhbmRhcmQuZWNvcmUjLy9TZWFzb25hbFBvcHVsYXRpb25Nb2RlbCI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TZWFzb25hbFBvcHVsYXRpb25Nb2RlbC9waGFzZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHN0YW5kYXJkLmVjb3JlIy8vU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwvbW9kdWxhdGlvbkFtcGxpdHVkZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc3RhbmRhcmQuZWNvcmUjLy9TZWFzb25hbFBvcHVsYXRpb25Nb2RlbC9wZXJpb2QiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzdGFuZGFyZC5lY29yZSMvL1NlYXNvbmFsUG9wdWxhdGlvbk1vZGVsL3VzZUxhdGl0dWRlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICA8L2dlblBhY2thZ2VzPgorPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjRkNTMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3BsdWdpbi5wcm9wZXJ0aWVzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3ZmM3YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsMTAwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4NCisNCis8IS0tDQorIDxjb3B5cmlnaHQ+DQorIDwvY29weXJpZ2h0Pg0KKw0KKyAkSWQkDQorLS0+DQorDQorPHBsdWdpbj4NCisgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJwb3B1bGF0aW9ubW9kZWwiIG5hbWU9IiVFUF9Qb3B1bGF0aW9ubW9kZWwiIHNjaGVtYT0ic2NoZW1hL3BvcHVsYXRpb25tb2RlbC5leHNkIi8+DQorICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icG9wdWxhdGlvbmluaXRpYWxpemVyIiBuYW1lPSIlRVBfUG9wdWxhdGlvbmluaXRpYWxpemVyIiBzY2hlbWE9InNjaGVtYS9wb3B1bGF0aW9uaW5pdGlhbGl6ZXIuZXhzZCIvPg0KKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+DQorICAgICAgPHBhY2thZ2UNCisgICAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkIg0KKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlIg0KKyAgICAgICAgICAgIGdlbk1vZGVsPSJtb2RlbC9zdGFuZGFyZC5nZW5tb2RlbCIvPg0KKyAgIDwvZXh0ZW5zaW9uPg0KKyAgIDxleHRlbnNpb24NCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQuaXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcmllcyI+DQorICAgICAgPGZhY3RvcnkNCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiDQorICAgICAgICAgICAgdXJpPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZCINCisgICAgICAgICAgICBzdXBwb3J0ZWRUeXBlcz0NCisgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcg0KKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcg0KKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcg0KKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcg0KKyAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UiPg0KKyAgICAgIDwvZmFjdG9yeT4NCisgICA8L2V4dGVuc2lvbj4NCisgICA8ZXh0ZW5zaW9uDQorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5wb3B1bGF0aW9ubW9kZWwiPg0KKyAgICAgIDxjbGFzc2RlZg0KKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGwiPg0KKyAgICAgIDwvY2xhc3NkZWY+DQorICAgICAgPGR1Ymxpbl9jb3JlDQorICAgICAgICAgICAgY2F0ZWdvcnlfaWQ9Ii8iDQorICAgICAgICAgICAgaWRlbnRpZmllcj0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLmR1Ymxpbl9jb3JlMSINCisgICAgICAgICAgICB0aXRsZT0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLmR1Ymxpbl9jb3JlMSI+DQorICAgICAgPC9kdWJsaW5fY29yZT4NCisgICA8L2V4dGVuc2lvbj4NCisgICA8ZXh0ZW5zaW9uDQorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5wb3B1bGF0aW9ubW9kZWwiPg0KKyAgICAgIDxjbGFzc2RlZg0KKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJbXBsIj4NCisgICAgICA8L2NsYXNzZGVmPg0KKyAgICAgIDxkdWJsaW5fY29yZQ0KKyAgICAgICAgICAgIGNhdGVnb3J5X2lkPSIvIg0KKyAgICAgICAgICAgIGlkZW50aWZpZXI9Im9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5kdWJsaW5fY29yZTEiDQorICAgICAgICAgICAgdGl0bGU9Im9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5kdWJsaW5fY29yZTEiPg0KKyAgICAgIDwvZHVibGluX2NvcmU+DQorICAgPC9leHRlbnNpb24+DQorICAgIDxleHRlbnNpb24NCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnBvcHVsYXRpb25tb2RlbCI+DQorICAgICAgPGNsYXNzZGVmDQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsSW1wbCI+DQorICAgICAgPC9jbGFzc2RlZj4NCisgICAgICA8ZHVibGluX2NvcmUNCisgICAgICAgICAgICBjYXRlZ29yeV9pZD0iLyINCisgICAgICAgICAgICBpZGVudGlmaWVyPSJvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuZHVibGluX2NvcmUxIg0KKyAgICAgICAgICAgIHRpdGxlPSJvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuZHVibGluX2NvcmUxIj4NCisgICAgICA8L2R1Ymxpbl9jb3JlPg0KKyAgIDwvZXh0ZW5zaW9uPg0KKyAgIDxleHRlbnNpb24NCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnBvcHVsYXRpb25tb2RlbCI+DQorICAgICAgPGNsYXNzZGVmDQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLkRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsSW1wbCI+DQorICAgICAgPC9jbGFzc2RlZj4NCisgICAgICA8ZHVibGluX2NvcmUNCisgICAgICAgICAgICBjYXRlZ29yeV9pZD0iLyINCisgICAgICAgICAgICBpZGVudGlmaWVyPSJvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuZHVibGluX2NvcmUxIg0KKyAgICAgICAgICAgIHRpdGxlPSJvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuZHVibGluX2NvcmUxIj4NCisgICAgICA8L2R1Ymxpbl9jb3JlPg0KKyAgIDwvZXh0ZW5zaW9uPg0KKyAgIDxleHRlbnNpb24NCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnBvcHVsYXRpb25pbml0aWFsaXplciI+DQorICAgICAgPGNsYXNzZGVmDQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbCI+DQorICAgICAgPC9jbGFzc2RlZj4NCisgICAgICA8ZHVibGluX2NvcmUNCisgICAgICAgICAgICBjYXRlZ29yeV9pZD0iLyINCisgICAgICAgICAgICBpZGVudGlmaWVyPSJvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuZHVibGluX2NvcmUxIg0KKyAgICAgICAgICAgIHRpdGxlPSJvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuZHVibGluX2NvcmUxIj4NCisgICAgICA8L2R1Ymxpbl9jb3JlPg0KKyAgIDwvZXh0ZW5zaW9uPg0KKyAgDQorICAgPGV4dGVuc2lvbg0KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMucG9wdWxhdGlvbmluaXRpYWxpemVyIj4NCisgICAgICA8Y2xhc3NkZWYNCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplckltcGwiPg0KKyAgICAgIDwvY2xhc3NkZWY+DQorICAgICAgPGR1Ymxpbl9jb3JlDQorICAgICAgICAgICAgY2F0ZWdvcnlfaWQ9Ii8iDQorICAgICAgICAgICAgaWRlbnRpZmllcj0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLmR1Ymxpbl9jb3JlMSINCisgICAgICAgICAgICB0aXRsZT0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLmR1Ymxpbl9jb3JlMSI+DQorICAgICAgPC9kdWJsaW5fY29yZT4NCisgICA8L2V4dGVuc2lvbj4NCis8L3BsdWdpbj4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc2NoZW1hL3BvcHVsYXRpb25pbml0aWFsaXplci5leHNkIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NjaGVtYS9wb3B1bGF0aW9uaW5pdGlhbGl6ZXIuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjAwN2QxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NjaGVtYS9wb3B1bGF0aW9uaW5pdGlhbGl6ZXIuZXhzZApAQCAtMCwwICsxLDEwNSBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Cis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscyIgaWQ9InBvcHVsYXRpb25pbml0aWFsaXplciIgbmFtZT0iJUVQX1BvcHVsYXRpb25pbml0aWFsaXplciIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBVc2VkIHRvIHJlZ2lzdGVyIG5ldyBtZXRob2RzIG9mIGluaXRpYWxpemluZyBwb3B1bGF0aW9ucyBpbiBTVEVNCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc2NoZW1hL2R1Ymxpbl9jb3JlLmV4c2QiLz4KKworICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KKyAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgPGFwcEluZm8+CisgICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+CisgICAgICAgICA8L2FwcEluZm8+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNsYXNzZGVmIi8+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImR1Ymxpbl9jb3JlIi8+CisgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcEluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcEluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9ImNsYXNzZGVmIj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5Qb3B1bGF0aW9uSW5pdGlhbGl6ZXJJbXBsOm9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlBvcHVsYXRpb25Jbml0aWFsaXplciIvPgorICAgICAgICAgICAgICAgPC9hcHBJbmZvPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAxLjAuMQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zY2hlbWEvcG9wdWxhdGlvbm1vZGVsLmV4c2QgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc2NoZW1hL3BvcHVsYXRpb25tb2RlbC5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NDhjODEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc2NoZW1hL3BvcHVsYXRpb25tb2RlbC5leHNkCkBAIC0wLDAgKzEsMTA1IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCis8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwaW5mbz4NCisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJjb20uaWJtLmFsbWFkZW4uc3RlbS5wb3B1bGF0aW9ubW9kZWxzIiBpZD0icG9wdWxhdGlvbm1vZGVsIiBuYW1lPSIlRVBfUG9wdWxhdGlvbm1vZGVsIi8+DQorICAgICAgPC9hcHBpbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIFVzZSB0byByZWdpc3RlciBpbnN0YW5jZXMgb2YgcG9wdWxhdGlvbiBtb2RlbHMNCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvc2NoZW1hL2R1Ymxpbl9jb3JlLmV4c2QiLz4NCisNCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KKyAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgIDxhcHBpbmZvPg0KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4NCisgICAgICAgICA8L2FwcGluZm8+DQorICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgIDxjb21wbGV4VHlwZT4NCisgICAgICAgICA8c2VxdWVuY2U+DQorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjbGFzc2RlZiIvPg0KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZHVibGluX2NvcmUiLz4NCisgICAgICAgICA8L3NlcXVlbmNlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICA8YXBwaW5mbz4NCisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQorICAgICAgICAgICAgICAgPC9hcHBpbmZvPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICA8L2NvbXBsZXhUeXBlPg0KKyAgIDwvZWxlbWVudD4NCisNCisgICA8ZWxlbWVudCBuYW1lPSJjbGFzc2RlZiI+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxhcHBpbmZvPg0KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGw6b3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbCIvPg0KKyAgICAgICAgICAgICAgIDwvYXBwaW5mbz4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcGluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KKyAgICAgIDwvYXBwaW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwaW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQorICAgICAgPC9hcHBpbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBpbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpaW5mbyIvPg0KKyAgICAgIDwvYXBwaW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQ0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcGluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KKyAgICAgIDwvYXBwaW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQ0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorDQorPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvQWN0aXZhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGM2NDk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworLyoqCisgKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKKyAqLworcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4geworCisJLyoqCisJICogVGhlIHBsdWctaW4gSUQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBDb25zdGFudHMuSURfUk9PVCArICIucG9wdWxhdGlvbm1vZGVscyI7IC8vJE5PTi1OTFMtMSQKKworCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKKwlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOworCisJLyoqCisJICogVGhlIGNvbnN0cnVjdG9yCisJICovCisJcHVibGljIEFjdGl2YXRvcigpIHsKKwkJcGx1Z2luID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gY29udGV4dAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc3RhcnQoY29udGV4dCk7CisJCS8vIFdlIGNyZWF0ZSB0aGVzZSBpbnN0YW5jZXMgc28gdGhhdCB0aGVpciBjb25zdHJ1Y3RvcnMgcnVuIGFuZCB0aGV5CisJCS8vIHRoZW4gYWRkIHRoZW1zZWx2ZXMgdG8gYSBjb2xsZWN0aW9uIG9mIGZhY3RvcmllcyBtYWludGFpbmVkIGJ5IHRoZQorCQkvLyBmYWN0b3J5IGludGVyZmFjZXMgdGhleSBpbXBsZW1lbnQgcmVzcGVjdGl2ZWx5LgorCQkKKwkKKwkJCisJfSAvLyBzdGFydAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlwbHVnaW4gPSBudWxsOworCQlzdXBlci5zdG9wKGNvbnRleHQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQorCSAqIAorCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogTG9nIGFuIGVycm9yIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgdGV4dAorCSAqIEBwYXJhbSBleGNlcHRpb24KKwkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQkvLyBSdW5uaW5nIGFzIGEgcGx1Z2luPworCQlpZiAocGx1Z2luICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJcGx1Z2luLmdldExvZygpLmxvZygKKwkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBwbHVnaW4uZ2V0QnVuZGxlKCkKKwkJCQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOworCQl9IGVsc2UgeworCQkJU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UpOworCQkJLy8gRXhjZXB0aW9uPworCQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJU3lzdGVtLmVyci5wcmludGxuKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisJCQl9CisJCX0KKworCX0gLy8gbG9nRXJyb3IKKworCS8qKgorCSAqIExvZyBpbmZvcm1hdGlvbiB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4KKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqICAgICAgICAgICAgdGhlIGxvY2FsaXplZCBpbmZvcm1hdGlvbiBtZXNzYWdlIHRleHQKKwkgKiBAcGFyYW0gZXhjZXB0aW9uCisJICogICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW5mb3JtYXRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJLy8gUnVubmluZyBhcyBhIHBsdWdpbj8KKwkJaWYgKHBsdWdpbiAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXBsdWdpbi5nZXRMb2coKS5sb2coCisJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBwbHVnaW4uZ2V0QnVuZGxlKCkKKwkJCQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOworCQl9IGVsc2UgeworCQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOworCQkJLy8gRXhjZXB0aW9uPworCQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJU3lzdGVtLm91dC5wcmludGxuKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisJCQl9CisJCX0KKworCX0gLy8gbG9nSW5mb3JtYXRpb24KK30gLy8gQWN0aXZhdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9Db25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZjcyZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDU2IEBACisvLyBDb25zdGFudHMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyB0aGF0IGFyZSBzaWduaWZpY2FudCB0byB0aGUgU1RFTSBkaXNlYXNlCisgKiBtb2RlbCBkZWZpbml0aW9ucy4KKyAqLworcHVibGljIGludGVyZmFjZSBDb25zdGFudHMgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgZXh0ZW5zaW9uIHBvaW50IGlkIGZvciB0aGUgInBvcHVsYXRpb24gbW9kZWwiIGV4dGVuc2lvbiBwb2ludC4gQQorCSAqIHtAbGluayBEaXNlYXNlTW9kZWx9IGRlZmluZXMgdGhlIHVuZGVybHlpbmcgY29tcHV0YXRpb25hbCBtb2RlbCBmb3IgaG93IGEKKwkgKiBwb3B1bGF0aW9uIGNoYW5nZXMKKwkgKiB7QHZhbHVlfQorCSAqLworCVN0cmluZyBJRF9QT1BVTEFUSU9OX01PREVMX0VYVEVOU0lPTl9QT0lOVCA9IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHMuSURfUk9PVAorCSsgIi5wb3B1bGF0aW9ubW9kZWxzLnBvcHVsYXRpb25tb2RlbCI7IC8vJE5PTi1OTFMtMSQgCisKKwkKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBlbGVtZW50IGluIGEKKwkgKiA8Y29kZT5Db25maWd1cmF0aW9uRWxlbWVudDwvY29kZT4gdGhhdCBzcGVjaWZpZXMgdGhlIG5hbWUgYW5kCisJICogaW1wbGVtZW50aW5nIGNsYXNzIGZvciBTVEVNICJwb3B1bGF0aW9uIG1vZGVscyIuCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29uc3RhbnRzI0VYRUNVVEFCTEVfTkFNRV9BVFRSSUJVVEUKKwkgKi8KKwlTdHJpbmcgUE9QVUxBVElPTl9NT0RFTF9FTEVNRU5UID0gImNsYXNzZGVmIjsgLy8kTk9OLU5MUy0xJCAKKworCQorCS8qKgorCSAqIFRoaXMgaXMgdGhlIGV4dGVuc2lvbiBwb2ludCBpZCBmb3IgdGhlICJwb3B1bGF0aW9uIGluaXRpYWxpemVyIiBleHRlbnNpb24gcG9pbnQuCisJICovCisJU3RyaW5nIElEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfRVhURU5TSU9OX1BPSU5UID0gb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50cy5JRF9ST09UCisJKyAiLnBvcHVsYXRpb25tb2RlbHMucG9wdWxhdGlvbmluaXRpYWxpemVyIjsgLy8kTk9OLU5MUy0xJCAKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGVsZW1lbnQgaW4gYQorCSAqIDxjb2RlPkNvbmZpZ3VyYXRpb25FbGVtZW50PC9jb2RlPiB0aGF0IHNwZWNpZmllcyB0aGUgbmFtZSBhbmQKKwkgKiBpbXBsZW1lbnRpbmcgY2xhc3MgZm9yIFNURU0gInBvcHVsYXRpb24gaW5pdGlhbGl6ZXIiLgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50cyNFWEVDVVRBQkxFX05BTUVfQVRUUklCVVRFCisJICovCisJU3RyaW5nIFBPUFVMQVRJT05fSU5JVElBTElaRVJfRUxFTUVOVCA9ICJjbGFzc2RlZiI7IC8vJE5PTi1OTFMtMSQgCisKK30gLy8gQ29uc3RhbnRzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9EZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTZhZjYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwuamF2YQpAQCAtMCwwICsxLDUwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbW9ncmFwaGljIFBvcHVsYXRpb24gTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLkRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsI2dldFBvcHVsYXRpb25Hcm91cHMgPGVtPlBvcHVsYXRpb24gR3JvdXBzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsIGV4dGVuZHMgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Hcm91cH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3B1bGF0aW9uIEdyb3VwczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvcHVsYXRpb24gR3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXREZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbF9Qb3B1bGF0aW9uR3JvdXBzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxQb3B1bGF0aW9uR3JvdXA+IGdldFBvcHVsYXRpb25Hcm91cHMoKTsKKworfSAvLyBEZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9FYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzJiODkyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FYXJ0aCBTY2llbmNlIFBvcHVsYXRpb24gSW5pdGlhbGl6ZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRFYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKQorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplciBleHRlbmRzIFBvcHVsYXRpb25Jbml0aWFsaXplciB7Cit9IC8vIEVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvUG9wdWxhdGlvbkdyb3VwLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9Qb3B1bGF0aW9uR3JvdXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzkwMzI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvUG9wdWxhdGlvbkdyb3VwLmphdmEKQEAgLTAsMCArMSw4NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcHVsYXRpb24gR3JvdXA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Hcm91cCNnZXRJZGVudGlmaWVyIDxlbT5JZGVudGlmaWVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkdyb3VwI2dldEZyYWN0aW9uIDxlbT5GcmFjdGlvbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRQb3B1bGF0aW9uR3JvdXAoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUG9wdWxhdGlvbkdyb3VwIGV4dGVuZHMgRU9iamVjdCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWRlbnRpZmllcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZGVudGlmaWVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJZGVudGlmaWVyKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0UG9wdWxhdGlvbkdyb3VwX0lkZW50aWZpZXIoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0SWRlbnRpZmllcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Hcm91cCNnZXRJZGVudGlmaWVyIDxlbT5JZGVudGlmaWVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZGVudGlmaWVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJZGVudGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJZGVudGlmaWVyKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GcmFjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIwLjUiPC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZyYWN0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZyYWN0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRGcmFjdGlvbihkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFBvcHVsYXRpb25Hcm91cF9GcmFjdGlvbigpCisJICogQG1vZGVsIGRlZmF1bHQ9IjAuNSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldEZyYWN0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkdyb3VwI2dldEZyYWN0aW9uIDxlbT5GcmFjdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RnJhY3Rpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEZyYWN0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRGcmFjdGlvbihkb3VibGUgdmFsdWUpOworCit9IC8vIFBvcHVsYXRpb25Hcm91cApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvUG9wdWxhdGlvbkluaXRpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9Qb3B1bGF0aW9uSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTg1ODk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvUG9wdWxhdGlvbkluaXRpYWxpemVyLmphdmEKQEAgLTAsMCArMSw4OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcHVsYXRpb24gSW5pdGlhbGl6ZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Jbml0aWFsaXplciNnZXRUYXJnZXRJU09LZXkgPGVtPlRhcmdldCBJU08gS2V5PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkluaXRpYWxpemVyI2dldFBvcHVsYXRpb25JZGVudGlmaWVyIDxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0UG9wdWxhdGlvbkluaXRpYWxpemVyKCkKKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBQb3B1bGF0aW9uSW5pdGlhbGl6ZXIgZXh0ZW5kcyBOb2RlRGVjb3JhdG9yLCBNb2RpZmlhYmxlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXJnZXQgSVNPIEtleTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFyZ2V0IElTTyBLZXk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IElTTyBLZXk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFRhcmdldElTT0tleShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFBvcHVsYXRpb25Jbml0aWFsaXplcl9UYXJnZXRJU09LZXkoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0VGFyZ2V0SVNPS2V5KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkluaXRpYWxpemVyI2dldFRhcmdldElTT0tleSA8ZW0+VGFyZ2V0IElTTyBLZXk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBJU08gS2V5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRUYXJnZXRJU09LZXkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRhcmdldElTT0tleShTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Imh1bWFuIjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRQb3B1bGF0aW9uSWRlbnRpZmllcihTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFBvcHVsYXRpb25Jbml0aWFsaXplcl9Qb3B1bGF0aW9uSWRlbnRpZmllcigpCisJICogQG1vZGVsIGRlZmF1bHQ9Imh1bWFuIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uSW5pdGlhbGl6ZXIjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIgPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBQb3B1bGF0aW9uSW5pdGlhbGl6ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL1BvcHVsYXRpb25Nb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvUG9wdWxhdGlvbk1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhZDZhYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL1BvcHVsYXRpb25Nb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZDsNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9wdWxhdGlvbiBNb2RlbDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsI2dldFBvcHVsYXRpb25JZGVudGlmaWVyIDxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsI2dldFRhcmdldElTT0tleSA8ZW0+VGFyZ2V0IElTTyBLZXk8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFBvcHVsYXRpb25Nb2RlbCgpDQorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIFBvcHVsYXRpb25Nb2RlbCBleHRlbmRzIE5vZGVEZWNvcmF0b3IsIE1vZGlmaWFibGUgew0KKwkNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIHNlZ21lbnQgb2YgdGhlIHR5cGUgVVJJIHRoYXQgcHJlZml4ZXMgYWxsIG90aGVyIHNlZ21lbnRzIGluIGENCisJICogcG9wdWxhdGlvbiBtb2RlbCB0eXBlIFVSSS4NCisJICovDQorCVN0cmluZyBVUklfVFlQRV9QT1BVTEFUSU9OTU9ERUxfU0VHTUVOVCA9ICJwb3B1bGF0aW9uIjsNCisNCisJDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Imh1bWFuIjwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldFBvcHVsYXRpb25JZGVudGlmaWVyKFN0cmluZykNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFBvcHVsYXRpb25Nb2RlbF9Qb3B1bGF0aW9uSWRlbnRpZmllcigpDQorCSAqIEBtb2RlbCBkZWZhdWx0PSJodW1hbiINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGdldFBvcHVsYXRpb25JZGVudGlmaWVyKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsI2dldFBvcHVsYXRpb25JZGVudGlmaWVyIDxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRQb3B1bGF0aW9uSWRlbnRpZmllcihTdHJpbmcgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iSHVtYW5Qb3B1bGF0aW9uTW9kZWwiPC9jb2RlPi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXROYW1lKFN0cmluZykNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFBvcHVsYXRpb25Nb2RlbF9OYW1lKCkNCisJICogQG1vZGVsIGRlZmF1bHQ9Ikh1bWFuUG9wdWxhdGlvbk1vZGVsIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZ2V0TmFtZSgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0TmFtZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFyZ2V0IElTTyBLZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFyZ2V0IElTTyBLZXk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBJU08gS2V5PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjc2V0VGFyZ2V0SVNPS2V5KFN0cmluZykNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFBvcHVsYXRpb25Nb2RlbF9UYXJnZXRJU09LZXkoKQ0KKwkgKiBAbW9kZWwgZGVmYXVsdD0iIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZ2V0VGFyZ2V0SVNPS2V5KCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsI2dldFRhcmdldElTT0tleSA8ZW0+VGFyZ2V0IElTTyBLZXk8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBJU08gS2V5PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0VGFyZ2V0SVNPS2V5KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRUYXJnZXRJU09LZXkoU3RyaW5nIHZhbHVlKTsNCisNCit9IC8vIFBvcHVsYXRpb25Nb2RlbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL1BvcHVsYXRpb25Nb2RlbExhYmVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9Qb3B1bGF0aW9uTW9kZWxMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MzJlOGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9Qb3B1bGF0aW9uTW9kZWxMYWJlbC5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTm9kZUxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWw7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsPC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWxMYWJlbCNnZXRQb3B1bGF0aW9uTGFiZWwgPGVtPlBvcHVsYXRpb24gTGFiZWw8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWwjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIgPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKQ0KKyAqIEBtb2RlbA0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIFBvcHVsYXRpb25Nb2RlbExhYmVsIGV4dGVuZHMgRHluYW1pY05vZGVMYWJlbCB7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBzZWdtZW50IG9mIHRoZSB0eXBlIFVSSSB0aGF0IHByZWZpeGVzIGFsbCBvdGhlciBzZWdtZW50cyBpbiBhDQorCSAqIGR5bmFtaWMgcG9wdWxhdGlvbiBsYWJlbCB0eXBlIFVSSS4NCisJICovDQorCVN0cmluZyBVUklfVFlQRV9EWU5BTUlDX1BPUFVMQVRJT05fTEFCRUxfU0VHTUVOVCA9IFVSSV9UWVBFX0xBQkVMX1NFR01FTlQNCisJCQkrICIvZHlucG9wdWxhdGlvbiI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSB0eXBlIFVSSSBmb3IgZHluYW1pYyBwb3B1bGF0aW9uIGxhYmVscw0KKwkgKi8NCisJVVJJIFVSSV9UWVBFX0RZTkFNSUNfUE9QVUxBVElPTl9MQUJFTCA9IFNURU1VUkkNCisJCQkuY3JlYXRlVHlwZVVSSShVUklfVFlQRV9EWU5BTUlDX1BPUFVMQVRJT05fTEFCRUxfU0VHTUVOVCk7DQorCQ0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBMYWJlbDwvYj48L2VtPicgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbiBMYWJlbDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbiBMYWJlbDwvZW0+JyByZWZlcmVuY2UuDQorCSAqIEBzZWUgI3NldFBvcHVsYXRpb25MYWJlbChQb3B1bGF0aW9uTGFiZWwpDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRQb3B1bGF0aW9uTW9kZWxMYWJlbF9Qb3B1bGF0aW9uTGFiZWwoKQ0KKwkgKiBAbW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJUG9wdWxhdGlvbkxhYmVsIGdldFBvcHVsYXRpb25MYWJlbCgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsI2dldFBvcHVsYXRpb25MYWJlbCA8ZW0+UG9wdWxhdGlvbiBMYWJlbDwvZW0+fScgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbiBMYWJlbDwvZW0+JyByZWZlcmVuY2UuDQorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25MYWJlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0UG9wdWxhdGlvbkxhYmVsKFBvcHVsYXRpb25MYWJlbCB2YWx1ZSk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoU3RyaW5nKQ0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWxfUG9wdWxhdGlvbklkZW50aWZpZXIoKQ0KKwkgKiBAbW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGdldFBvcHVsYXRpb25JZGVudGlmaWVyKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWwjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIgPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldFBvcHVsYXRpb25JZGVudGlmaWVyKFN0cmluZyB2YWx1ZSk7DQorfSAvLyBQb3B1bGF0aW9uTW9kZWxMYWJlbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL1BvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL1BvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTJjMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcHVsYXRpb24gTW9kZWwgTGFiZWwgVmFsdWU8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICoNCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSgpDQorICogQG1vZGVsDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQ0KK3B1YmxpYyBpbnRlcmZhY2UgUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBleHRlbmRzIExhYmVsVmFsdWUgew0KK30gLy8gUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL1NlYXNvbmFsUG9wdWxhdGlvbk1vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9TZWFzb25hbFBvcHVsYXRpb25Nb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ODU4MGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9TZWFzb25hbFBvcHVsYXRpb25Nb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlYXNvbmFsIFBvcHVsYXRpb24gTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsI2dldFBoYXNlIDxlbT5QaGFzZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsI2dldE1vZHVsYXRpb25BbXBsaXR1ZGUgPGVtPk1vZHVsYXRpb24gQW1wbGl0dWRlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwjZ2V0UGVyaW9kIDxlbT5QZXJpb2Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TZWFzb25hbFBvcHVsYXRpb25Nb2RlbCNpc1VzZUxhdGl0dWRlIDxlbT5Vc2UgTGF0aXR1ZGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwgZXh0ZW5kcyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGhhc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMC4wIjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QaGFzZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaGFzZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0UGhhc2UoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRTZWFzb25hbFBvcHVsYXRpb25Nb2RlbF9QaGFzZSgpCisJICogQG1vZGVsIGRlZmF1bHQ9IjAuMCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldFBoYXNlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwjZ2V0UGhhc2UgPGVtPlBoYXNlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QaGFzZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0UGhhc2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFBoYXNlKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb2R1bGF0aW9uIEFtcGxpdHVkZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIxLjAiPC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1vZHVsYXRpb24gQW1wbGl0dWRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsYXRpb24gQW1wbGl0dWRlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNb2R1bGF0aW9uQW1wbGl0dWRlKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxfTW9kdWxhdGlvbkFtcGxpdHVkZSgpCisJICogQG1vZGVsIGRlZmF1bHQ9IjEuMCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldE1vZHVsYXRpb25BbXBsaXR1ZGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TZWFzb25hbFBvcHVsYXRpb25Nb2RlbCNnZXRNb2R1bGF0aW9uQW1wbGl0dWRlIDxlbT5Nb2R1bGF0aW9uIEFtcGxpdHVkZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TW9kdWxhdGlvbiBBbXBsaXR1ZGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25BbXBsaXR1ZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1vZHVsYXRpb25BbXBsaXR1ZGUoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIzNjUuMjUiPC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBlcmlvZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJpb2Q8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRTZWFzb25hbFBvcHVsYXRpb25Nb2RlbF9QZXJpb2QoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSIzNjUuMjUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0UGVyaW9kKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2UgTGF0aXR1ZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXNlIExhdGl0dWRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzZSBMYXRpdHVkZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VXNlTGF0aXR1ZGUoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxfVXNlTGF0aXR1ZGUoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzVXNlTGF0aXR1ZGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TZWFzb25hbFBvcHVsYXRpb25Nb2RlbCNpc1VzZUxhdGl0dWRlIDxlbT5Vc2UgTGF0aXR1ZGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVzZSBMYXRpdHVkZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNVc2VMYXRpdHVkZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VXNlTGF0aXR1ZGUoYm9vbGVhbiB2YWx1ZSk7CisKK30gLy8gU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvU3RhbmRhcmRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0ZGRlNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTQyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5Ow0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuDQorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgU3RhbmRhcmRGYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnkgew0KKwkvKioNCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0YW5kYXJkRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZEZhY3RvcnlJbXBsLmluaXQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9wdWxhdGlvbiBNb2RlbDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9wdWxhdGlvbiBNb2RlbDwvZW0+Jy4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwgY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbDwvZW0+Jy4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJUG9wdWxhdGlvbk1vZGVsTGFiZWwgY3JlYXRlUG9wdWxhdGlvbk1vZGVsTGFiZWwoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbDwvZW0+Jy4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCBjcmVhdGVTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcHVsYXRpb24gTW9kZWwgTGFiZWwgVmFsdWU8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcHVsYXRpb24gTW9kZWwgTGFiZWwgVmFsdWU8L2VtPicuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgY3JlYXRlUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsIFZhbHVlPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsIFZhbHVlPC9lbT4nLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN0b2NoYXN0aWMgU3RhbmRhcmQgUG9wdWxhdGlvbiBNb2RlbDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3RvY2hhc3RpYyBTdGFuZGFyZCBQb3B1bGF0aW9uIE1vZGVsPC9lbT4nLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwgY3JlYXRlU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbW9ncmFwaGljIFBvcHVsYXRpb24gTW9kZWw8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbW9ncmFwaGljIFBvcHVsYXRpb24gTW9kZWw8L2VtPicuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCURlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsIGNyZWF0ZURlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcHVsYXRpb24gR3JvdXA8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcHVsYXRpb24gR3JvdXA8L2VtPicuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVBvcHVsYXRpb25Hcm91cCBjcmVhdGVQb3B1bGF0aW9uR3JvdXAoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9wdWxhdGlvbiBJbml0aWFsaXplcjwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9wdWxhdGlvbiBJbml0aWFsaXplcjwvZW0+Jy4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIgY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2Vhc29uYWwgUG9wdWxhdGlvbiBNb2RlbDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2Vhc29uYWwgUG9wdWxhdGlvbiBNb2RlbDwvZW0+Jy4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwgY3JlYXRlU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+WWV0aSBQb3B1bGF0aW9uIEluaXRpYWxpemVyPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5ZZXRpIFBvcHVsYXRpb24gSW5pdGlhbGl6ZXI8L2VtPicuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXIgY3JlYXRlWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplcigpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5Lg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdGFuZGFyZFBhY2thZ2UgZ2V0U3RhbmRhcmRQYWNrYWdlKCk7DQorDQorfSAvL1N0YW5kYXJkRmFjdG9yeQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvU3RhbmRhcmRQYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY3NGI5NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsMjY5OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQ7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuDQorICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudA0KKyAqIDx1bD4NCisgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+DQorICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4NCisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4NCisgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPg0KKyAqIDwvdWw+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5DQorICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgU3RhbmRhcmRQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2Ugew0KKwkvKioNCisJICogVGhlIHBhY2thZ2UgbmFtZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBlTkFNRSA9ICJzdGFuZGFyZCI7DQorDQorCS8qKg0KKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQiOw0KKw0KKwkvKioNCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQiOw0KKw0KKwkvKioNCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0YW5kYXJkUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsLmluaXQoKTsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuUG9wdWxhdGlvbk1vZGVsSW1wbCA8ZW0+UG9wdWxhdGlvbiBNb2RlbDwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlBvcHVsYXRpb25Nb2RlbEltcGwNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFBvcHVsYXRpb25Nb2RlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX01PREVMID0gMDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX01PREVMX19VUkkgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfX1VSSTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBPUFVMQVRJT05fTU9ERUxfX1RZUEVfVVJJID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19UWVBFX1VSSTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBPUFVMQVRJT05fTU9ERUxfX0RVQkxJTl9DT1JFID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19EVUJMSU5fQ09SRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX01PREVMX19MQUJFTFNfVE9fVVBEQVRFID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19MQUJFTFNfVE9fVVBEQVRFOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBPUFVMQVRJT05fTU9ERUxfX0dSQVBIID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19HUkFQSDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUE9QVUxBVElPTl9NT0RFTF9fRU5BQkxFRCA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9fRU5BQkxFRDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX01PREVMX19HUkFQSF9ERUNPUkFURUQgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfX0dSQVBIX0RFQ09SQVRFRDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBPUFVMQVRJT05fTU9ERUxfX1BST0dSRVNTID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19QUk9HUkVTUzsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBPUFVMQVRJT05fTU9ERUxfX05BTUUgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDE7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IElTTyBLZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX01PREVMX19UQVJHRVRfSVNPX0tFWSA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMjsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qb3B1bGF0aW9uIE1vZGVsPC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBPUFVMQVRJT05fTU9ERUxfRkVBVFVSRV9DT1VOVCA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMzsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJbXBsIDxlbT5Qb3B1bGF0aW9uIE1vZGVsPC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJbXBsDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMID0gMTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19VUkkgPSBQT1BVTEFUSU9OX01PREVMX19VUkk7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19UWVBFX1VSSSA9IFBPUFVMQVRJT05fTU9ERUxfX1RZUEVfVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fRFVCTElOX0NPUkUgPSBQT1BVTEFUSU9OX01PREVMX19EVUJMSU5fQ09SRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19MQUJFTFNfVE9fVVBEQVRFID0gUE9QVUxBVElPTl9NT0RFTF9fTEFCRUxTX1RPX1VQREFURTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19HUkFQSCA9IFBPUFVMQVRJT05fTU9ERUxfX0dSQVBIOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19FTkFCTEVEID0gUE9QVUxBVElPTl9NT0RFTF9fRU5BQkxFRDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19HUkFQSF9ERUNPUkFURUQgPSBQT1BVTEFUSU9OX01PREVMX19HUkFQSF9ERUNPUkFURUQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19QUk9HUkVTUyA9IFBPUFVMQVRJT05fTU9ERUxfX1BST0dSRVNTOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IFBPUFVMQVRJT05fTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fTkFNRSA9IFBPUFVMQVRJT05fTU9ERUxfX05BTUU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IElTTyBLZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19UQVJHRVRfSVNPX0tFWSA9IFBPUFVMQVRJT05fTU9ERUxfX1RBUkdFVF9JU09fS0VZOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJpcnRoIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19CSVJUSF9SQVRFID0gUE9QVUxBVElPTl9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWF0aCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fREVBVEhfUkFURSA9IFBPUFVMQVRJT05fTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19USU1FX1BFUklPRCA9IFBPUFVMQVRJT05fTU9ERUxfRkVBVFVSRV9DT1VOVCArIDI7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbiBNb2RlbDwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0ZFQVRVUkVfQ09VTlQgPSBQT1BVTEFUSU9OX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAzOw0KKw0KKw0KKwkvKioNCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5Qb3B1bGF0aW9uTW9kZWxMYWJlbEltcGwgPGVtPlBvcHVsYXRpb24gTW9kZWwgTGFiZWw8L2VtPn0nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5Qb3B1bGF0aW9uTW9kZWxMYWJlbEltcGwNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFBvcHVsYXRpb25Nb2RlbExhYmVsKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IFBPUFVMQVRJT05fTU9ERUxfTEFCRUwgPSAyOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBPUFVMQVRJT05fTU9ERUxfTEFCRUxfX1VSSSA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfX1VSSTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBPUFVMQVRJT05fTU9ERUxfTEFCRUxfX1RZUEVfVVJJID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTk9ERV9MQUJFTF9fVFlQRV9VUkk7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX01PREVMX0xBQkVMX19EVUJMSU5fQ09SRSA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfX0RVQkxJTl9DT1JFOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSSBPZiBJZGVudGlmaWFibGUgVG8gQmUgTGFiZWxlZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBPUFVMQVRJT05fTU9ERUxfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fQ1VSUkVOVF9WQUxVRSA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfX0NVUlJFTlRfVkFMVUU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRlbnRpZmlhYmxlPC9iPjwvZW0+JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fSURFTlRJRklBQkxFID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTk9ERV9MQUJFTF9fSURFTlRJRklBQkxFOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5leHQgVmFsdWUgVmFsaWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX01PREVMX0xBQkVMX19ORVhUX1ZBTFVFX1ZBTElEID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTk9ERV9MQUJFTF9fTkVYVF9WQUxVRV9WQUxJRDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fTkVYVF9WQUxVRSA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfX05FWFRfVkFMVUU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVjb3JhdG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fREVDT1JBVE9SID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTk9ERV9MQUJFTF9fREVDT1JBVE9SOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX01PREVMX0xBQkVMX19OT0RFID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTk9ERV9MQUJFTF9fTk9ERTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIExhYmVsPC9iPjwvZW0+JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9MQUJFTCA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTk9ERV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMTsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsPC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBPUFVMQVRJT05fTU9ERUxfTEFCRUxfRkVBVFVSRV9DT1VOVCA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDI7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxJbXBsIDxlbT5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsPC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEltcGwNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTCA9IDM7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fVVJJID0gUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fVFlQRV9VUkkgPSBQT1BVTEFUSU9OX01PREVMX0xBQkVMX19UWVBFX1VSSTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfX0RVQkxJTl9DT1JFID0gUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fRFVCTElOX0NPUkU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEID0gUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19DVVJSRU5UX1ZBTFVFID0gUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fQ1VSUkVOVF9WQUxVRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZGVudGlmaWFibGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19JREVOVElGSUFCTEUgPSBQT1BVTEFUSU9OX01PREVMX0xBQkVMX19JREVOVElGSUFCTEU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBWYWx1ZSBWYWxpZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQgPSBQT1BVTEFUSU9OX01PREVMX0xBQkVMX19ORVhUX1ZBTFVFX1ZBTElEOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5leHQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19ORVhUX1ZBTFVFID0gUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fTkVYVF9WQUxVRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWNvcmF0b3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19ERUNPUkFUT1IgPSBQT1BVTEFUSU9OX01PREVMX0xBQkVMX19ERUNPUkFUT1I7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZTwvYj48L2VtPicgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfX05PREUgPSBQT1BVTEFUSU9OX01PREVMX0xBQkVMX19OT0RFOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gTGFiZWw8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX0xBQkVMID0gUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9MQUJFTDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBQT1BVTEFUSU9OX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX0lERU5USUZJRVI7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVsdGEgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19ERUxUQV9WQUxVRSA9IFBPUFVMQVRJT05fTU9ERUxfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvYmUgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19QUk9CRV9WQUxVRSA9IFBPUFVMQVRJT05fTU9ERUxfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDE7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcCBWYWx1ZTwvYj48L2VtPicgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfX1RFTVBfVkFMVUUgPSBQT1BVTEFUSU9OX01PREVMX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAyOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fT1JJR0lOQUxfVkFMVUUgPSBQT1BVTEFUSU9OX01PREVMX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAzOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVycm9yIFNjYWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fRVJST1JfU0NBTEUgPSBQT1BVTEFUSU9OX01PREVMX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvcHVsYXRpb24gTW9kZWwgTGFiZWw8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9GRUFUVVJFX0NPVU5UID0gUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9GRUFUVVJFX0NPVU5UICsgNTsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWwgPGVtPkludGVncmF0aW9uIExhYmVsPC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWwNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldEludGVncmF0aW9uTGFiZWwoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgSU5URUdSQVRJT05fTEFCRUwgPSA0Ow0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkludGVncmF0aW9uIExhYmVsPC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IElOVEVHUkFUSU9OX0xBQkVMX0ZFQVRVUkVfQ09VTlQgPSAwOw0KKw0KKwkvKioNCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbFZhbHVlIDxlbT5JbnRlZ3JhdGlvbiBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsVmFsdWUNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldEludGVncmF0aW9uTGFiZWxWYWx1ZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBJTlRFR1JBVElPTl9MQUJFTF9WQUxVRSA9IDU7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SW50ZWdyYXRpb24gTGFiZWwgVmFsdWU8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgSU5URUdSQVRJT05fTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCA9IDA7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvciA8ZW0+SW50ZWdyYXRpb24gRGVjb3JhdG9yPC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRJbnRlZ3JhdGlvbkRlY29yYXRvcigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBJTlRFR1JBVElPTl9ERUNPUkFUT1IgPSA2Ow0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkludGVncmF0aW9uIERlY29yYXRvcjwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBJTlRFR1JBVElPTl9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCA9IDA7DQorDQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJbXBsIDxlbT5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsIFZhbHVlPC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUltcGwNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRSA9IDc7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbCBWYWx1ZTwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgPSBHcmFwaFBhY2thZ2UuTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUltcGwgPGVtPlBvcHVsYXRpb24gTW9kZWwgTGFiZWwgVmFsdWU8L2VtPn0nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJbXBsDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRSA9IDg7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19DT1VOVCA9IFBPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jaWRlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRV9fSU5DSURFTkNFID0gUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UICsgMTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CaXJ0aHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19CSVJUSFMgPSBQT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAyOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlYXRoczwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0RFQVRIUyA9IFBPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCArIDM7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVuc2l0eTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0RFTlNJVFkgPSBQT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvcHVsYXRpb24gTW9kZWwgTGFiZWwgVmFsdWU8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UID0gUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UICsgNTsNCisNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsSW1wbCA8ZW0+U3RvY2hhc3RpYyBTdGFuZGFyZCBQb3B1bGF0aW9uIE1vZGVsPC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsSW1wbA0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IFNUT0NIQVNUSUNfU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTCA9IDk7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU1RPQ0hBU1RJQ19TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19VUkkgPSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19VUkk7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVE9DSEFTVElDX1NUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX1RZUEVfVVJJID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fVFlQRV9VUkk7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVE9DSEFTVElDX1NUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX0RVQkxJTl9DT1JFID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fRFVCTElOX0NPUkU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWxzIFRvIFVwZGF0ZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU1RPQ0hBU1RJQ19TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19MQUJFTFNfVE9fVVBEQVRFID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fTEFCRUxTX1RPX1VQREFURTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVE9DSEFTVElDX1NUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX0dSQVBIID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fR1JBUEg7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUT0NIQVNUSUNfU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fRU5BQkxFRCA9IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX0VOQUJMRUQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRGVjb3JhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU1RPQ0hBU1RJQ19TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19HUkFQSF9ERUNPUkFURUQgPSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19HUkFQSF9ERUNPUkFURUQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVE9DSEFTVElDX1NUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX1BST0dSRVNTID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fUFJPR1JFU1M7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU1RPQ0hBU1RJQ19TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVI7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUT0NIQVNUSUNfU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fTkFNRSA9IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX05BTUU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IElTTyBLZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVE9DSEFTVElDX1NUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX1RBUkdFVF9JU09fS0VZID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fVEFSR0VUX0lTT19LRVk7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmlydGggUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUT0NIQVNUSUNfU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fQklSVEhfUkFURSA9IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX0JJUlRIX1JBVEU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVhdGggUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUT0NIQVNUSUNfU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fREVBVEhfUkFURSA9IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX0RFQVRIX1JBVEU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVE9DSEFTVElDX1NUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX1RJTUVfUEVSSU9EID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fVElNRV9QRVJJT0Q7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2FpbjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUT0NIQVNUSUNfU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fR0FJTiA9IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U3RvY2hhc3RpYyBTdGFuZGFyZCBQb3B1bGF0aW9uIE1vZGVsPC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUT0NIQVNUSUNfU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9GRUFUVVJFX0NPVU5UID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTsNCisNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxJbXBsIDxlbT5EZW1vZ3JhcGhpYyBQb3B1bGF0aW9uIE1vZGVsPC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxJbXBsDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXREZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBERU1PR1JBUEhJQ19QT1BVTEFUSU9OX01PREVMID0gMTA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgREVNT0dSQVBISUNfUE9QVUxBVElPTl9NT0RFTF9fVVJJID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgREVNT0dSQVBISUNfUE9QVUxBVElPTl9NT0RFTF9fVFlQRV9VUkkgPSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19UWVBFX1VSSTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IERFTU9HUkFQSElDX1BPUFVMQVRJT05fTU9ERUxfX0RVQkxJTl9DT1JFID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fRFVCTElOX0NPUkU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWxzIFRvIFVwZGF0ZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgREVNT0dSQVBISUNfUE9QVUxBVElPTl9NT0RFTF9fTEFCRUxTX1RPX1VQREFURSA9IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX0xBQkVMU19UT19VUERBVEU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGg8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgREVNT0dSQVBISUNfUE9QVUxBVElPTl9NT0RFTF9fR1JBUEggPSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19HUkFQSDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgREVNT0dSQVBISUNfUE9QVUxBVElPTl9NT0RFTF9fRU5BQkxFRCA9IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX0VOQUJMRUQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRGVjb3JhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgREVNT0dSQVBISUNfUE9QVUxBVElPTl9NT0RFTF9fR1JBUEhfREVDT1JBVEVEID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fR1JBUEhfREVDT1JBVEVEOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2dyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgREVNT0dSQVBISUNfUE9QVUxBVElPTl9NT0RFTF9fUFJPR1JFU1MgPSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19QUk9HUkVTUzsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBERU1PR1JBUEhJQ19QT1BVTEFUSU9OX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVI7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IERFTU9HUkFQSElDX1BPUFVMQVRJT05fTU9ERUxfX05BTUUgPSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBJU08gS2V5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgREVNT0dSQVBISUNfUE9QVUxBVElPTl9NT0RFTF9fVEFSR0VUX0lTT19LRVkgPSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19UQVJHRVRfSVNPX0tFWTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CaXJ0aCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgREVNT0dSQVBISUNfUE9QVUxBVElPTl9NT0RFTF9fQklSVEhfUkFURSA9IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX0JJUlRIX1JBVEU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVhdGggUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IERFTU9HUkFQSElDX1BPUFVMQVRJT05fTU9ERUxfX0RFQVRIX1JBVEUgPSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19ERUFUSF9SQVRFOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgREVNT0dSQVBISUNfUE9QVUxBVElPTl9NT0RFTF9fVElNRV9QRVJJT0QgPSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19USU1FX1BFUklPRDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIEdyb3VwczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgREVNT0dSQVBISUNfUE9QVUxBVElPTl9NT0RFTF9fUE9QVUxBVElPTl9HUk9VUFMgPSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAwOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbW9ncmFwaGljIFBvcHVsYXRpb24gTW9kZWw8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgREVNT0dSQVBISUNfUE9QVUxBVElPTl9NT0RFTF9GRUFUVVJFX0NPVU5UID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTsNCisNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuUG9wdWxhdGlvbkdyb3VwSW1wbCA8ZW0+UG9wdWxhdGlvbiBHcm91cDwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlBvcHVsYXRpb25Hcm91cEltcGwNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFBvcHVsYXRpb25Hcm91cCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX0dST1VQID0gMTE7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBPUFVMQVRJT05fR1JPVVBfX0lERU5USUZJRVIgPSAwOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyYWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUE9QVUxBVElPTl9HUk9VUF9fRlJBQ1RJT04gPSAxOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvcHVsYXRpb24gR3JvdXA8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUE9QVUxBVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UID0gMjsNCisNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbCA8ZW0+UG9wdWxhdGlvbiBJbml0aWFsaXplcjwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlBvcHVsYXRpb25Jbml0aWFsaXplckltcGwNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFBvcHVsYXRpb25Jbml0aWFsaXplcigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX0lOSVRJQUxJWkVSID0gMTI7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fVVJJID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19VUkk7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19UWVBFX1VSSSA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9fVFlQRV9VUkk7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19EVUJMSU5fQ09SRSA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9fRFVCTElOX0NPUkU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWxzIFRvIFVwZGF0ZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fTEFCRUxTX1RPX1VQREFURSA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9fTEFCRUxTX1RPX1VQREFURTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19HUkFQSCA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9fR1JBUEg7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBPUFVMQVRJT05fSU5JVElBTElaRVJfX0VOQUJMRUQgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfX0VOQUJMRUQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRGVjb3JhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fR1JBUEhfREVDT1JBVEVEID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19HUkFQSF9ERUNPUkFURUQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19QUk9HUkVTUyA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9fUFJPR1JFU1M7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IElTTyBLZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19UQVJHRVRfSVNPX0tFWSA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDE7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UG9wdWxhdGlvbiBJbml0aWFsaXplcjwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQT1BVTEFUSU9OX0lOSVRJQUxJWkVSX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDI7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbCA8ZW0+UG9wdWxhdGlvbiBJbml0aWFsaXplcjwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbA0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgU1RBTkRBUkRfUE9QVUxBVElPTl9JTklUSUFMSVpFUiA9IDEzOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX1VSSSA9IFBPUFVMQVRJT05fSU5JVElBTElaRVJfX1VSSTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX1RZUEVfVVJJID0gUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fVFlQRV9VUkk7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19EVUJMSU5fQ09SRSA9IFBPUFVMQVRJT05fSU5JVElBTElaRVJfX0RVQkxJTl9DT1JFOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX0xBQkVMU19UT19VUERBVEUgPSBQT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19MQUJFTFNfVE9fVVBEQVRFOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX0dSQVBIID0gUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fR1JBUEg7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX0VOQUJMRUQgPSBQT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19FTkFCTEVEOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX0dSQVBIX0RFQ09SQVRFRCA9IFBPUFVMQVRJT05fSU5JVElBTElaRVJfX0dSQVBIX0RFQ09SQVRFRDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX1BST0dSRVNTID0gUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fUFJPR1JFU1M7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IElTTyBLZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTVEFOREFSRF9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19UQVJHRVRfSVNPX0tFWSA9IFBPUFVMQVRJT05fSU5JVElBTElaRVJfX1RBUkdFVF9JU09fS0VZOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IFBPUFVMQVRJT05fSU5JVElBTElaRVJfX1BPUFVMQVRJT05fSURFTlRJRklFUjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmRpdmlkdWFsczwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX0lORElWSURVQUxTID0gUE9QVUxBVElPTl9JTklUSUFMSVpFUl9GRUFUVVJFX0NPVU5UICsgMDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2UgRGVuc2l0eTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX1VTRV9ERU5TSVRZID0gUE9QVUxBVElPTl9JTklUSUFMSVpFUl9GRUFUVVJFX0NPVU5UICsgMTsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qb3B1bGF0aW9uIEluaXRpYWxpemVyPC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfRkVBVFVSRV9DT1VOVCA9IFBPUFVMQVRJT05fSU5JVElBTElaRVJfRkVBVFVSRV9DT1VOVCArIDI7DQorDQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsSW1wbCA8ZW0+U2Vhc29uYWwgUG9wdWxhdGlvbiBNb2RlbDwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsSW1wbA0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTCA9IDE0Ow0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX1VSSSA9IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX1VSSTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX1RZUEVfVVJJID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fVFlQRV9VUkk7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTRUFTT05BTF9QT1BVTEFUSU9OX01PREVMX19EVUJMSU5fQ09SRSA9IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX0RVQkxJTl9DT1JFOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX0xBQkVMU19UT19VUERBVEUgPSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19MQUJFTFNfVE9fVVBEQVRFOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX0dSQVBIID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fR1JBUEg7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX0VOQUJMRUQgPSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19FTkFCTEVEOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX0dSQVBIX0RFQ09SQVRFRCA9IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX0dSQVBIX0RFQ09SQVRFRDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9ncmVzczwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX1BST0dSRVNTID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fUFJPR1JFU1M7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTRUFTT05BTF9QT1BVTEFUSU9OX01PREVMX19OQU1FID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fTkFNRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgSVNPIEtleTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX1RBUkdFVF9JU09fS0VZID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fVEFSR0VUX0lTT19LRVk7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmlydGggUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX0JJUlRIX1JBVEUgPSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19CSVJUSF9SQVRFOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlYXRoIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTRUFTT05BTF9QT1BVTEFUSU9OX01PREVMX19ERUFUSF9SQVRFID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fREVBVEhfUkFURTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX1RJTUVfUEVSSU9EID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fVElNRV9QRVJJT0Q7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGhhc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTRUFTT05BTF9QT1BVTEFUSU9OX01PREVMX19QSEFTRSA9IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxhdGlvbiBBbXBsaXR1ZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTRUFTT05BTF9QT1BVTEFUSU9OX01PREVMX19NT0RVTEFUSU9OX0FNUExJVFVERSA9IFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyaW9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTF9fUEVSSU9EID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2UgTGF0aXR1ZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTRUFTT05BTF9QT1BVTEFUSU9OX01PREVMX19VU0VfTEFUSVRVREUgPSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAzOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlYXNvbmFsIFBvcHVsYXRpb24gTW9kZWw8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTF9GRUFUVVJFX0NPVU5UID0gU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9GRUFUVVJFX0NPVU5UICsgNDsNCisNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbCA8ZW0+RWFydGggU2NpZW5jZSBQb3B1bGF0aW9uIEluaXRpYWxpemVyPC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbA0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0RWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IEVBUlRIX1NDSUVOQ0VfUE9QVUxBVElPTl9JTklUSUFMSVpFUiA9IDE1Ow0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEVBUlRIX1NDSUVOQ0VfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fVVJJID0gUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgRUFSVEhfU0NJRU5DRV9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19UWVBFX1VSSSA9IFBPUFVMQVRJT05fSU5JVElBTElaRVJfX1RZUEVfVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgRUFSVEhfU0NJRU5DRV9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19EVUJMSU5fQ09SRSA9IFBPUFVMQVRJT05fSU5JVElBTElaRVJfX0RVQkxJTl9DT1JFOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEVBUlRIX1NDSUVOQ0VfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fTEFCRUxTX1RPX1VQREFURSA9IFBPUFVMQVRJT05fSU5JVElBTElaRVJfX0xBQkVMU19UT19VUERBVEU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGg8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgRUFSVEhfU0NJRU5DRV9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19HUkFQSCA9IFBPUFVMQVRJT05fSU5JVElBTElaRVJfX0dSQVBIOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBFQVJUSF9TQ0lFTkNFX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX0VOQUJMRUQgPSBQT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19FTkFCTEVEOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEVBUlRIX1NDSUVOQ0VfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fR1JBUEhfREVDT1JBVEVEID0gUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fR1JBUEhfREVDT1JBVEVEOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2dyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgRUFSVEhfU0NJRU5DRV9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19QUk9HUkVTUyA9IFBPUFVMQVRJT05fSU5JVElBTElaRVJfX1BST0dSRVNTOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBJU08gS2V5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgRUFSVEhfU0NJRU5DRV9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19UQVJHRVRfSVNPX0tFWSA9IFBPUFVMQVRJT05fSU5JVElBTElaRVJfX1RBUkdFVF9JU09fS0VZOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEVBUlRIX1NDSUVOQ0VfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fUE9QVUxBVElPTl9JREVOVElGSUVSID0gUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fUE9QVUxBVElPTl9JREVOVElGSUVSOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVhcnRoIFNjaWVuY2UgUG9wdWxhdGlvbiBJbml0aWFsaXplcjwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBFQVJUSF9TQ0lFTkNFX1BPUFVMQVRJT05fSU5JVElBTElaRVJfRkVBVFVSRV9DT1VOVCA9IFBPUFVMQVRJT05fSU5JVElBTElaRVJfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLllldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJbXBsIDxlbT5ZZXRpIFBvcHVsYXRpb24gSW5pdGlhbGl6ZXI8L2VtPn0nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5ZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbA0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0WWV0aVBvcHVsYXRpb25Jbml0aWFsaXplcigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBZRVRJX1BPUFVMQVRJT05fSU5JVElBTElaRVIgPSAxNjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBZRVRJX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX1VSSSA9IEVBUlRIX1NDSUVOQ0VfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgWUVUSV9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19UWVBFX1VSSSA9IEVBUlRIX1NDSUVOQ0VfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fVFlQRV9VUkk7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBZRVRJX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX0RVQkxJTl9DT1JFID0gRUFSVEhfU0NJRU5DRV9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19EVUJMSU5fQ09SRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBZRVRJX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX0xBQkVMU19UT19VUERBVEUgPSBFQVJUSF9TQ0lFTkNFX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX0xBQkVMU19UT19VUERBVEU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGg8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgWUVUSV9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19HUkFQSCA9IEVBUlRIX1NDSUVOQ0VfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fR1JBUEg7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFlFVElfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fRU5BQkxFRCA9IEVBUlRIX1NDSUVOQ0VfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fRU5BQkxFRDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBZRVRJX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX0dSQVBIX0RFQ09SQVRFRCA9IEVBUlRIX1NDSUVOQ0VfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fR1JBUEhfREVDT1JBVEVEOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2dyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgWUVUSV9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19QUk9HUkVTUyA9IEVBUlRIX1NDSUVOQ0VfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fUFJPR1JFU1M7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IElTTyBLZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBZRVRJX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX1RBUkdFVF9JU09fS0VZID0gRUFSVEhfU0NJRU5DRV9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19UQVJHRVRfSVNPX0tFWTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBZRVRJX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX1BPUFVMQVRJT05fSURFTlRJRklFUiA9IEVBUlRIX1NDSUVOQ0VfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fUE9QVUxBVElPTl9JREVOVElGSUVSOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPllldGkgUG9wdWxhdGlvbiBJbml0aWFsaXplcjwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBZRVRJX1BPUFVMQVRJT05fSU5JVElBTElaRVJfRkVBVFVSRV9DT1VOVCA9IEVBUlRIX1NDSUVOQ0VfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9GRUFUVVJFX0NPVU5UICsgMDsNCisNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWwgPGVtPlBvcHVsYXRpb24gTW9kZWw8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9wdWxhdGlvbiBNb2RlbDwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRQb3B1bGF0aW9uTW9kZWwoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbCNnZXRQb3B1bGF0aW9uSWRlbnRpZmllciA8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT4nLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWwjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQ0KKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uTW9kZWwoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldFBvcHVsYXRpb25Nb2RlbF9Qb3B1bGF0aW9uSWRlbnRpZmllcigpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWwjZ2V0TmFtZSgpDQorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25Nb2RlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0UG9wdWxhdGlvbk1vZGVsX05hbWUoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbCNnZXRUYXJnZXRJU09LZXkgPGVtPlRhcmdldCBJU08gS2V5PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IElTTyBLZXk8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbCNnZXRUYXJnZXRJU09LZXkoKQ0KKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uTW9kZWwoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldFBvcHVsYXRpb25Nb2RlbF9UYXJnZXRJU09LZXkoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCA8ZW0+UG9wdWxhdGlvbiBNb2RlbDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qb3B1bGF0aW9uIE1vZGVsPC9lbT4nLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsI2dldEJpcnRoUmF0ZSA8ZW0+QmlydGggUmF0ZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJpcnRoIFJhdGU8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsI2dldEJpcnRoUmF0ZSgpDQorCSAqIEBzZWUgI2dldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbF9CaXJ0aFJhdGUoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsI2dldERlYXRoUmF0ZSA8ZW0+RGVhdGggUmF0ZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlYXRoIFJhdGU8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsI2dldERlYXRoUmF0ZSgpDQorCSAqIEBzZWUgI2dldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbF9EZWF0aFJhdGUoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsI2dldFRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsI2dldFRpbWVQZXJpb2QoKQ0KKwkgKiBAc2VlICNnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxfVGltZVBlcmlvZCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsIDxlbT5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvcHVsYXRpb24gTW9kZWwgTGFiZWw8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRQb3B1bGF0aW9uTW9kZWxMYWJlbCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWwjZ2V0UG9wdWxhdGlvbkxhYmVsIDxlbT5Qb3B1bGF0aW9uIExhYmVsPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UG9wdWxhdGlvbiBMYWJlbDwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWwjZ2V0UG9wdWxhdGlvbkxhYmVsKCkNCisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldFBvcHVsYXRpb25Nb2RlbExhYmVsX1BvcHVsYXRpb25MYWJlbCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWwjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIgPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWwjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQ0KKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uTW9kZWxMYWJlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWxfUG9wdWxhdGlvbklkZW50aWZpZXIoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsIDxlbT5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvcHVsYXRpb24gTW9kZWwgTGFiZWw8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwjZ2V0RGVsdGFWYWx1ZSA8ZW0+RGVsdGEgVmFsdWU8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5EZWx0YSBWYWx1ZTwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCNnZXREZWx0YVZhbHVlKCkNCisJICogQHNlZSAjZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVSZWZlcmVuY2UgZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbF9EZWx0YVZhbHVlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsI2dldFByb2JlVmFsdWUgPGVtPlByb2JlIFZhbHVlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UHJvYmUgVmFsdWU8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwjZ2V0UHJvYmVWYWx1ZSgpDQorCSAqIEBzZWUgI2dldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxfUHJvYmVWYWx1ZSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCNnZXRUZW1wVmFsdWUgPGVtPlRlbXAgVmFsdWU8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5UZW1wIFZhbHVlPC9lbT4nLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsI2dldFRlbXBWYWx1ZSgpDQorCSAqIEBzZWUgI2dldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxfVGVtcFZhbHVlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsI2dldE9yaWdpbmFsVmFsdWUgPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwjZ2V0T3JpZ2luYWxWYWx1ZSgpDQorCSAqIEBzZWUgI2dldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxfT3JpZ2luYWxWYWx1ZSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCNnZXRFcnJvclNjYWxlIDxlbT5FcnJvciBTY2FsZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVycm9yIFNjYWxlPC9lbT4nLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsI2dldEVycm9yU2NhbGUoKQ0KKwkgKiBAc2VlICNnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsX0Vycm9yU2NhbGUoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsIDxlbT5JbnRlZ3JhdGlvbiBMYWJlbDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbnRlZ3JhdGlvbiBMYWJlbDwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbA0KKwkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWwiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRJbnRlZ3JhdGlvbkxhYmVsKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbFZhbHVlIDxlbT5JbnRlZ3JhdGlvbiBMYWJlbCBWYWx1ZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbnRlZ3JhdGlvbiBMYWJlbCBWYWx1ZTwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbFZhbHVlDQorCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbFZhbHVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0SW50ZWdyYXRpb25MYWJlbFZhbHVlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3IgPGVtPkludGVncmF0aW9uIERlY29yYXRvcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbnRlZ3JhdGlvbiBEZWNvcmF0b3I8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yDQorCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3IiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRJbnRlZ3JhdGlvbkRlY29yYXRvcigpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgPGVtPlBvcHVsYXRpb24gTW9kZWwgTGFiZWwgVmFsdWU8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbCBWYWx1ZTwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSA8ZW0+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbCBWYWx1ZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsIFZhbHVlPC9lbT4nLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlI2dldENvdW50IDxlbT5Db3VudDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvdW50PC9lbT4nLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUjZ2V0Q291bnQoKQ0KKwkgKiBAc2VlICNnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZV9Db3VudCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlI2dldEluY2lkZW5jZSA8ZW0+SW5jaWRlbmNlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5jaWRlbmNlPC9lbT4nLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUjZ2V0SW5jaWRlbmNlKCkNCisJICogQHNlZSAjZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfSW5jaWRlbmNlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUjZ2V0QmlydGhzIDxlbT5CaXJ0aHM8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CaXJ0aHM8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSNnZXRCaXJ0aHMoKQ0KKwkgKiBAc2VlICNnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZV9CaXJ0aHMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSNnZXREZWF0aHMgPGVtPkRlYXRoczwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlYXRoczwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlI2dldERlYXRocygpDQorCSAqIEBzZWUgI2dldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlX0RlYXRocygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlI2dldERlbnNpdHkgPGVtPkRlbnNpdHk8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZW5zaXR5PC9lbT4nLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUjZ2V0RGVuc2l0eSgpDQorCSAqIEBzZWUgI2dldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlX0RlbnNpdHkoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwgPGVtPlN0b2NoYXN0aWMgU3RhbmRhcmQgUG9wdWxhdGlvbiBNb2RlbDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TdG9jaGFzdGljIFN0YW5kYXJkIFBvcHVsYXRpb24gTW9kZWw8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0U3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwjZ2V0R2FpbiA8ZW0+R2FpbjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdhaW48L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCNnZXRHYWluKCkNCisJICogQHNlZSAjZ2V0U3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRTdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxfR2FpbigpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLkRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsIDxlbT5EZW1vZ3JhcGhpYyBQb3B1bGF0aW9uIE1vZGVsPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbW9ncmFwaGljIFBvcHVsYXRpb24gTW9kZWw8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLkRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXREZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5EZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbCNnZXRQb3B1bGF0aW9uR3JvdXBzIDxlbT5Qb3B1bGF0aW9uIEdyb3VwczwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UG9wdWxhdGlvbiBHcm91cHM8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLkRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsI2dldFBvcHVsYXRpb25Hcm91cHMoKQ0KKwkgKiBAc2VlICNnZXREZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVSZWZlcmVuY2UgZ2V0RGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxfUG9wdWxhdGlvbkdyb3VwcygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Hcm91cCA8ZW0+UG9wdWxhdGlvbiBHcm91cDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qb3B1bGF0aW9uIEdyb3VwPC9lbT4nLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uR3JvdXANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldFBvcHVsYXRpb25Hcm91cCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkdyb3VwI2dldElkZW50aWZpZXIgPGVtPklkZW50aWZpZXI8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZGVudGlmaWVyPC9lbT4nLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uR3JvdXAjZ2V0SWRlbnRpZmllcigpDQorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25Hcm91cCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0UG9wdWxhdGlvbkdyb3VwX0lkZW50aWZpZXIoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Hcm91cCNnZXRGcmFjdGlvbiA8ZW0+RnJhY3Rpb248L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GcmFjdGlvbjwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkdyb3VwI2dldEZyYWN0aW9uKCkNCisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbkdyb3VwKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRQb3B1bGF0aW9uR3JvdXBfRnJhY3Rpb24oKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uSW5pdGlhbGl6ZXIgPGVtPlBvcHVsYXRpb24gSW5pdGlhbGl6ZXI8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9wdWxhdGlvbiBJbml0aWFsaXplcjwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkluaXRpYWxpemVyDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Jbml0aWFsaXplciNnZXRUYXJnZXRJU09LZXkgPGVtPlRhcmdldCBJU08gS2V5PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IElTTyBLZXk8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Jbml0aWFsaXplciNnZXRUYXJnZXRJU09LZXkoKQ0KKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldFBvcHVsYXRpb25Jbml0aWFsaXplcl9UYXJnZXRJU09LZXkoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Jbml0aWFsaXplciNnZXRQb3B1bGF0aW9uSWRlbnRpZmllciA8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT4nLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uSW5pdGlhbGl6ZXIjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQ0KKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldFBvcHVsYXRpb25Jbml0aWFsaXplcl9Qb3B1bGF0aW9uSWRlbnRpZmllcigpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyIDxlbT5Qb3B1bGF0aW9uIEluaXRpYWxpemVyPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvcHVsYXRpb24gSW5pdGlhbGl6ZXI8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcigpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIjZ2V0SW5kaXZpZHVhbHMgPGVtPkluZGl2aWR1YWxzPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5kaXZpZHVhbHM8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyI2dldEluZGl2aWR1YWxzKCkNCisJICogQHNlZSAjZ2V0U3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldFN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyX0luZGl2aWR1YWxzKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplciNpc1VzZURlbnNpdHkgPGVtPlVzZSBEZW5zaXR5PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlIERlbnNpdHk8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyI2lzVXNlRGVuc2l0eSgpDQorCSAqIEBzZWUgI2dldFN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcl9Vc2VEZW5zaXR5KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwgPGVtPlNlYXNvbmFsIFBvcHVsYXRpb24gTW9kZWw8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2Vhc29uYWwgUG9wdWxhdGlvbiBNb2RlbDwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldFNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TZWFzb25hbFBvcHVsYXRpb25Nb2RlbCNnZXRQaGFzZSA8ZW0+UGhhc2U8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QaGFzZTwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwjZ2V0UGhhc2UoKQ0KKwkgKiBAc2VlICNnZXRTZWFzb25hbFBvcHVsYXRpb25Nb2RlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0U2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxfUGhhc2UoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsI2dldE1vZHVsYXRpb25BbXBsaXR1ZGUgPGVtPk1vZHVsYXRpb24gQW1wbGl0dWRlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW9kdWxhdGlvbiBBbXBsaXR1ZGU8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsI2dldE1vZHVsYXRpb25BbXBsaXR1ZGUoKQ0KKwkgKiBAc2VlICNnZXRTZWFzb25hbFBvcHVsYXRpb25Nb2RlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0U2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxfTW9kdWxhdGlvbkFtcGxpdHVkZSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwjZ2V0UGVyaW9kIDxlbT5QZXJpb2Q8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJpb2Q8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsI2dldFBlcmlvZCgpDQorCSAqIEBzZWUgI2dldFNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRTZWFzb25hbFBvcHVsYXRpb25Nb2RlbF9QZXJpb2QoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsI2lzVXNlTGF0aXR1ZGUgPGVtPlVzZSBMYXRpdHVkZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzZSBMYXRpdHVkZTwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwjaXNVc2VMYXRpdHVkZSgpDQorCSAqIEBzZWUgI2dldFNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRTZWFzb25hbFBvcHVsYXRpb25Nb2RlbF9Vc2VMYXRpdHVkZSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLkVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplciA8ZW0+RWFydGggU2NpZW5jZSBQb3B1bGF0aW9uIEluaXRpYWxpemVyPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVhcnRoIFNjaWVuY2UgUG9wdWxhdGlvbiBJbml0aWFsaXplcjwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRFYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5ZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVyIDxlbT5ZZXRpIFBvcHVsYXRpb24gSW5pdGlhbGl6ZXI8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WWV0aSBQb3B1bGF0aW9uIEluaXRpYWxpemVyPC9lbT4nLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5ZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVyDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVyKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdGFuZGFyZEZhY3RvcnkgZ2V0U3RhbmRhcmRGYWN0b3J5KCk7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50DQorCSAqIDx1bD4NCisJICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPg0KKwkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPg0KKwkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4NCisJICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4NCisJICogPC91bD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludGVyZmFjZSBMaXRlcmFscyB7DQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5Qb3B1bGF0aW9uTW9kZWxJbXBsIDxlbT5Qb3B1bGF0aW9uIE1vZGVsPC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuUG9wdWxhdGlvbk1vZGVsSW1wbA0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFBvcHVsYXRpb25Nb2RlbCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBQT1BVTEFUSU9OX01PREVMID0gZUlOU1RBTkNFLmdldFBvcHVsYXRpb25Nb2RlbCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBQT1BVTEFUSU9OX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBlSU5TVEFOQ0UuZ2V0UG9wdWxhdGlvbk1vZGVsX1BvcHVsYXRpb25JZGVudGlmaWVyKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBQT1BVTEFUSU9OX01PREVMX19OQU1FID0gZUlOU1RBTkNFLmdldFBvcHVsYXRpb25Nb2RlbF9OYW1lKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgSVNPIEtleTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgUE9QVUxBVElPTl9NT0RFTF9fVEFSR0VUX0lTT19LRVkgPSBlSU5TVEFOQ0UuZ2V0UG9wdWxhdGlvbk1vZGVsX1RhcmdldElTT0tleSgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJbXBsIDxlbT5Qb3B1bGF0aW9uIE1vZGVsPC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJbXBsDQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwoKQ0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQ2xhc3MgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTCA9IGVJTlNUQU5DRS5nZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmlydGggUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fQklSVEhfUkFURSA9IGVJTlNUQU5DRS5nZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbF9CaXJ0aFJhdGUoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlYXRoIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX0RFQVRIX1JBVEUgPSBlSU5TVEFOQ0UuZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxfRGVhdGhSYXRlKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fVElNRV9QRVJJT0QgPSBlSU5TVEFOQ0UuZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxfVGltZVBlcmlvZCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuUG9wdWxhdGlvbk1vZGVsTGFiZWxJbXBsIDxlbT5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsPC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuUG9wdWxhdGlvbk1vZGVsTGFiZWxJbXBsDQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKQ0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQ2xhc3MgUE9QVUxBVElPTl9NT0RFTF9MQUJFTCA9IGVJTlNUQU5DRS5nZXRQb3B1bGF0aW9uTW9kZWxMYWJlbCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBMYWJlbDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVSZWZlcmVuY2UgUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9MQUJFTCA9IGVJTlNUQU5DRS5nZXRQb3B1bGF0aW9uTW9kZWxMYWJlbF9Qb3B1bGF0aW9uTGFiZWwoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSID0gZUlOU1RBTkNFLmdldFBvcHVsYXRpb25Nb2RlbExhYmVsX1BvcHVsYXRpb25JZGVudGlmaWVyKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsSW1wbCA8ZW0+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbDwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxJbXBsDQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMID0gZUlOU1RBTkNFLmdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbHRhIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19ERUxUQV9WQUxVRSA9IGVJTlNUQU5DRS5nZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsX0RlbHRhVmFsdWUoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2JlIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19QUk9CRV9WQUxVRSA9IGVJTlNUQU5DRS5nZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsX1Byb2JlVmFsdWUoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRlbXAgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFUmVmZXJlbmNlIFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfX1RFTVBfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbF9UZW1wVmFsdWUoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19PUklHSU5BTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsX09yaWdpbmFsVmFsdWUoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVycm9yIFNjYWxlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19FUlJPUl9TQ0FMRSA9IGVJTlNUQU5DRS5nZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsX0Vycm9yU2NhbGUoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsIDxlbT5JbnRlZ3JhdGlvbiBMYWJlbDwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsDQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0SW50ZWdyYXRpb25MYWJlbCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBJTlRFR1JBVElPTl9MQUJFTCA9IGVJTlNUQU5DRS5nZXRJbnRlZ3JhdGlvbkxhYmVsKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbFZhbHVlIDxlbT5JbnRlZ3JhdGlvbiBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsVmFsdWUNCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRJbnRlZ3JhdGlvbkxhYmVsVmFsdWUoKQ0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQ2xhc3MgSU5URUdSQVRJT05fTEFCRUxfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0SW50ZWdyYXRpb25MYWJlbFZhbHVlKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3IgPGVtPkludGVncmF0aW9uIERlY29yYXRvcjwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvcg0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldEludGVncmF0aW9uRGVjb3JhdG9yKCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIElOVEVHUkFUSU9OX0RFQ09SQVRPUiA9IGVJTlNUQU5DRS5nZXRJbnRlZ3JhdGlvbkRlY29yYXRvcigpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUltcGwgPGVtPlBvcHVsYXRpb24gTW9kZWwgTGFiZWwgVmFsdWU8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5Qb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSW1wbA0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUoKQ0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQ2xhc3MgUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJbXBsIDxlbT5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsIFZhbHVlPC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSW1wbA0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFID0gZUlOU1RBTkNFLmdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0NPVU5UID0gZUlOU1RBTkNFLmdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZV9Db3VudCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5jaWRlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19JTkNJREVOQ0UgPSBlSU5TVEFOQ0UuZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlX0luY2lkZW5jZSgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmlydGhzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19CSVJUSFMgPSBlSU5TVEFOQ0UuZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlX0JpcnRocygpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVhdGhzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19ERUFUSFMgPSBlSU5TVEFOQ0UuZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlX0RlYXRocygpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVuc2l0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRV9fREVOU0lUWSA9IGVJTlNUQU5DRS5nZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfRGVuc2l0eSgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsSW1wbCA8ZW0+U3RvY2hhc3RpYyBTdGFuZGFyZCBQb3B1bGF0aW9uIE1vZGVsPC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsSW1wbA0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBTVE9DSEFTVElDX1NUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUwgPSBlSU5TVEFOQ0UuZ2V0U3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HYWluPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBTVE9DSEFTVElDX1NUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX0dBSU4gPSBlSU5TVEFOQ0UuZ2V0U3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsX0dhaW4oKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLkRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsSW1wbCA8ZW0+RGVtb2dyYXBoaWMgUG9wdWxhdGlvbiBNb2RlbDwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLkRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsSW1wbA0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsKCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIERFTU9HUkFQSElDX1BPUFVMQVRJT05fTU9ERUwgPSBlSU5TVEFOQ0UuZ2V0RGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFUmVmZXJlbmNlIERFTU9HUkFQSElDX1BPUFVMQVRJT05fTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTID0gZUlOU1RBTkNFLmdldERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsX1BvcHVsYXRpb25Hcm91cHMoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlBvcHVsYXRpb25Hcm91cEltcGwgPGVtPlBvcHVsYXRpb24gR3JvdXA8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5Qb3B1bGF0aW9uR3JvdXBJbXBsDQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0UG9wdWxhdGlvbkdyb3VwKCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIFBPUFVMQVRJT05fR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0UG9wdWxhdGlvbkdyb3VwKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBQT1BVTEFUSU9OX0dST1VQX19JREVOVElGSUVSID0gZUlOU1RBTkNFLmdldFBvcHVsYXRpb25Hcm91cF9JZGVudGlmaWVyKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GcmFjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgUE9QVUxBVElPTl9HUk9VUF9fRlJBQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0UG9wdWxhdGlvbkdyb3VwX0ZyYWN0aW9uKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5Qb3B1bGF0aW9uSW5pdGlhbGl6ZXJJbXBsIDxlbT5Qb3B1bGF0aW9uIEluaXRpYWxpemVyPC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbA0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldFBvcHVsYXRpb25Jbml0aWFsaXplcigpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBQT1BVTEFUSU9OX0lOSVRJQUxJWkVSID0gZUlOU1RBTkNFLmdldFBvcHVsYXRpb25Jbml0aWFsaXplcigpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IElTTyBLZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIFBPUFVMQVRJT05fSU5JVElBTElaRVJfX1RBUkdFVF9JU09fS0VZID0gZUlOU1RBTkNFLmdldFBvcHVsYXRpb25Jbml0aWFsaXplcl9UYXJnZXRJU09LZXkoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fUE9QVUxBVElPTl9JREVOVElGSUVSID0gZUlOU1RBTkNFLmdldFBvcHVsYXRpb25Jbml0aWFsaXplcl9Qb3B1bGF0aW9uSWRlbnRpZmllcigpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJbXBsIDxlbT5Qb3B1bGF0aW9uIEluaXRpYWxpemVyPC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJbXBsDQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKQ0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQ2xhc3MgU1RBTkRBUkRfUE9QVUxBVElPTl9JTklUSUFMSVpFUiA9IGVJTlNUQU5DRS5nZXRTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcigpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5kaXZpZHVhbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIFNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX0lORElWSURVQUxTID0gZUlOU1RBTkNFLmdldFN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyX0luZGl2aWR1YWxzKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2UgRGVuc2l0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgU1RBTkRBUkRfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fVVNFX0RFTlNJVFkgPSBlSU5TVEFOQ0UuZ2V0U3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJfVXNlRGVuc2l0eSgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxJbXBsIDxlbT5TZWFzb25hbCBQb3B1bGF0aW9uIE1vZGVsPC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxJbXBsDQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUGFja2FnZUltcGwjZ2V0U2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwoKQ0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQ2xhc3MgU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTCA9IGVJTlNUQU5DRS5nZXRTZWFzb25hbFBvcHVsYXRpb25Nb2RlbCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGhhc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIFNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX1BIQVNFID0gZUlOU1RBTkNFLmdldFNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsX1BoYXNlKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGF0aW9uIEFtcGxpdHVkZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTF9fTU9EVUxBVElPTl9BTVBMSVRVREUgPSBlSU5TVEFOQ0UuZ2V0U2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxfTW9kdWxhdGlvbkFtcGxpdHVkZSgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyaW9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBTRUFTT05BTF9QT1BVTEFUSU9OX01PREVMX19QRVJJT0QgPSBlSU5TVEFOQ0UuZ2V0U2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxfUGVyaW9kKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2UgTGF0aXR1ZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIFNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX1VTRV9MQVRJVFVERSA9IGVJTlNUQU5DRS5nZXRTZWFzb25hbFBvcHVsYXRpb25Nb2RlbF9Vc2VMYXRpdHVkZSgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbCA8ZW0+RWFydGggU2NpZW5jZSBQb3B1bGF0aW9uIEluaXRpYWxpemVyPC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbA0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBhY2thZ2VJbXBsI2dldEVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplcigpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBFQVJUSF9TQ0lFTkNFX1BPUFVMQVRJT05fSU5JVElBTElaRVIgPSBlSU5TVEFOQ0UuZ2V0RWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5ZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbCA8ZW0+WWV0aSBQb3B1bGF0aW9uIEluaXRpYWxpemVyPC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplckltcGwNCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQYWNrYWdlSW1wbCNnZXRZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVyKCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIFlFVElfUE9QVUxBVElPTl9JTklUSUFMSVpFUiA9IGVJTlNUQU5DRS5nZXRZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVyKCk7DQorDQorCX0NCisNCit9IC8vU3RhbmRhcmRQYWNrYWdlDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwZDI0OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyLmphdmEKQEAgLTAsMCArMSw4NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcHVsYXRpb24gSW5pdGlhbGl6ZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyI2dldEluZGl2aWR1YWxzIDxlbT5JbmRpdmlkdWFsczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyI2lzVXNlRGVuc2l0eSA8ZW0+VXNlIERlbnNpdHk8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIgZXh0ZW5kcyBQb3B1bGF0aW9uSW5pdGlhbGl6ZXIgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluZGl2aWR1YWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjEiPC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluZGl2aWR1YWxzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluZGl2aWR1YWxzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJbmRpdmlkdWFscyhkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyX0luZGl2aWR1YWxzKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iMSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldEluZGl2aWR1YWxzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIjZ2V0SW5kaXZpZHVhbHMgPGVtPkluZGl2aWR1YWxzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRpdmlkdWFsczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SW5kaXZpZHVhbHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEluZGl2aWR1YWxzKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2UgRGVuc2l0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXNlIERlbnNpdHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXNlIERlbnNpdHk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFVzZURlbnNpdHkoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJfVXNlRGVuc2l0eSgpCisJICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzVXNlRGVuc2l0eSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyI2lzVXNlRGVuc2l0eSA8ZW0+VXNlIERlbnNpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVzZSBEZW5zaXR5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1VzZURlbnNpdHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFVzZURlbnNpdHkoYm9vbGVhbiB2YWx1ZSk7CisKK30gLy8gU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MDBiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZDsNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yOw0KKw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9wdWxhdGlvbiBNb2RlbDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwjZ2V0QmlydGhSYXRlIDxlbT5CaXJ0aCBSYXRlPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsI2dldERlYXRoUmF0ZSA8ZW0+RGVhdGggUmF0ZTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCNnZXRUaW1lUGVyaW9kIDxlbT5UaW1lIFBlcmlvZDwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwoKQ0KKyAqIEBtb2RlbCBzdXBlclR5cGVzPSJvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5JbnRlZ3JhdGlvbkRlY29yYXRvciINCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCBleHRlbmRzIFBvcHVsYXRpb25Nb2RlbCwgSW50ZWdyYXRpb25EZWNvcmF0b3Igew0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmlydGggUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMC4wIjwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CaXJ0aCBSYXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CaXJ0aCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjc2V0QmlydGhSYXRlKGRvdWJsZSkNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsX0JpcnRoUmF0ZSgpDQorCSAqIEBtb2RlbCBkZWZhdWx0PSIwLjAiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWRvdWJsZSBnZXRCaXJ0aFJhdGUoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCNnZXRCaXJ0aFJhdGUgPGVtPkJpcnRoIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJpcnRoIFJhdGU8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXRCaXJ0aFJhdGUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldEJpcnRoUmF0ZShkb3VibGUgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVhdGggUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMC4wIjwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWF0aCBSYXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWF0aCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjc2V0RGVhdGhSYXRlKGRvdWJsZSkNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsX0RlYXRoUmF0ZSgpDQorCSAqIEBtb2RlbCBkZWZhdWx0PSIwLjAiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWRvdWJsZSBnZXREZWF0aFJhdGUoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCNnZXREZWF0aFJhdGUgPGVtPkRlYXRoIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlYXRoIFJhdGU8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXREZWF0aFJhdGUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldERlYXRoUmF0ZShkb3VibGUgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Ijg2NDAwMDAwIjwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UaW1lIFBlcmlvZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXRUaW1lUGVyaW9kKGxvbmcpDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbF9UaW1lUGVyaW9kKCkNCisJICogQG1vZGVsIGRlZmF1bHQ9Ijg2NDAwMDAwIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlsb25nIGdldFRpbWVQZXJpb2QoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCNnZXRUaW1lUGVyaW9kIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXRUaW1lUGVyaW9kKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRUaW1lUGVyaW9kKGxvbmcgdmFsdWUpOw0KKw0KK30gLy8gU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkMGIyNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwuamF2YQpAQCAtMCwwICsxLDE2NiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQ7DQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCNnZXREZWx0YVZhbHVlIDxlbT5EZWx0YSBWYWx1ZTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsI2dldFByb2JlVmFsdWUgPGVtPlByb2JlIFZhbHVlPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwjZ2V0VGVtcFZhbHVlIDxlbT5UZW1wIFZhbHVlPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwjZ2V0T3JpZ2luYWxWYWx1ZSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCNnZXRFcnJvclNjYWxlIDxlbT5FcnJvciBTY2FsZTwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCgpDQorICogQG1vZGVsIHN1cGVyVHlwZXM9Im9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWxMYWJlbCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuSW50ZWdyYXRpb25MYWJlbCINCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsIGV4dGVuZHMgUG9wdWxhdGlvbk1vZGVsTGFiZWwsIEludGVncmF0aW9uTGFiZWwgew0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsdGEgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbHRhIFZhbHVlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWx0YSBWYWx1ZTwvZW0+JyByZWZlcmVuY2UuDQorCSAqIEBzZWUgI3NldERlbHRhVmFsdWUoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKQ0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbF9EZWx0YVZhbHVlKCkNCisJICogQG1vZGVsDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBnZXREZWx0YVZhbHVlKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCNnZXREZWx0YVZhbHVlIDxlbT5EZWx0YSBWYWx1ZTwvZW0+fScgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVsdGEgVmFsdWU8L2VtPicgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNnZXREZWx0YVZhbHVlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXREZWx0YVZhbHVlKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSB2YWx1ZSk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9iZSBWYWx1ZTwvYj48L2VtPicgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvYmUgVmFsdWU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2JlIFZhbHVlPC9lbT4nIHJlZmVyZW5jZS4NCisJICogQHNlZSAjc2V0UHJvYmVWYWx1ZShTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsX1Byb2JlVmFsdWUoKQ0KKwkgKiBAbW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIGdldFByb2JlVmFsdWUoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsI2dldFByb2JlVmFsdWUgPGVtPlByb2JlIFZhbHVlPC9lbT59JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9iZSBWYWx1ZTwvZW0+JyByZWZlcmVuY2UuDQorCSAqIEBzZWUgI2dldFByb2JlVmFsdWUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldFByb2JlVmFsdWUoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlbXAgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRlbXAgVmFsdWU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbXAgVmFsdWU8L2VtPicgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNzZXRUZW1wVmFsdWUoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKQ0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbF9UZW1wVmFsdWUoKQ0KKwkgKiBAbW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIGdldFRlbXBWYWx1ZSgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwjZ2V0VGVtcFZhbHVlIDxlbT5UZW1wIFZhbHVlPC9lbT59JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wIFZhbHVlPC9lbT4nIHJlZmVyZW5jZS4NCisJICogQHNlZSAjZ2V0VGVtcFZhbHVlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRUZW1wVmFsdWUoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9yaWdpbmFsIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcmlnaW5hbCBWYWx1ZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPicgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNzZXRPcmlnaW5hbFZhbHVlKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSkNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxfT3JpZ2luYWxWYWx1ZSgpDQorCSAqIEBtb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgZ2V0T3JpZ2luYWxWYWx1ZSgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwjZ2V0T3JpZ2luYWxWYWx1ZSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9yaWdpbmFsIFZhbHVlPC9lbT4nIHJlZmVyZW5jZS4NCisJICogQHNlZSAjZ2V0T3JpZ2luYWxWYWx1ZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0T3JpZ2luYWxWYWx1ZShTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXJyb3IgU2NhbGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVycm9yIFNjYWxlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FcnJvciBTY2FsZTwvZW0+JyByZWZlcmVuY2UuDQorCSAqIEBzZWUgI3NldEVycm9yU2NhbGUoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKQ0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbF9FcnJvclNjYWxlKCkNCisJICogQG1vZGVsDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBnZXRFcnJvclNjYWxlKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCNnZXRFcnJvclNjYWxlIDxlbT5FcnJvciBTY2FsZTwvZW0+fScgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXJyb3IgU2NhbGU8L2VtPicgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNnZXRFcnJvclNjYWxlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRFcnJvclNjYWxlKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSB2YWx1ZSk7DQorfSAvLyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWJiNTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlLmphdmEKQEAgLTAsMCArMSwxNzggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbFZhbHVlOw0KKw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbCBWYWx1ZTwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlI2dldENvdW50IDxlbT5Db3VudDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUjZ2V0SW5jaWRlbmNlIDxlbT5JbmNpZGVuY2U8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlI2dldEJpcnRocyA8ZW0+QmlydGhzPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSNnZXREZWF0aHMgPGVtPkRlYXRoczwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUjZ2V0RGVuc2l0eSA8ZW0+RGVuc2l0eTwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKCkNCisgKiBAbW9kZWwgc3VwZXJUeXBlcz0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLkludGVncmF0aW9uTGFiZWxWYWx1ZSINCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgZXh0ZW5kcyBQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlLCBJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgew0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvdW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3VudDwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldENvdW50KGRvdWJsZSkNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZV9Db3VudCgpDQorCSAqIEBtb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlkb3VibGUgZ2V0Q291bnQoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUjZ2V0Q291bnQgPGVtPkNvdW50PC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3VudDwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2dldENvdW50KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRDb3VudChkb3VibGUgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5jaWRlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmNpZGVuY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluY2lkZW5jZTwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldEluY2lkZW5jZShkb3VibGUpDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfSW5jaWRlbmNlKCkNCisJICogQG1vZGVsDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWRvdWJsZSBnZXRJbmNpZGVuY2UoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUjZ2V0SW5jaWRlbmNlIDxlbT5JbmNpZGVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluY2lkZW5jZTwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2dldEluY2lkZW5jZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0SW5jaWRlbmNlKGRvdWJsZSB2YWx1ZSk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CaXJ0aHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJpcnRoczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmlydGhzPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjc2V0QmlydGhzKGRvdWJsZSkNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZV9CaXJ0aHMoKQ0KKwkgKiBAbW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJZG91YmxlIGdldEJpcnRocygpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSNnZXRCaXJ0aHMgPGVtPkJpcnRoczwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmlydGhzPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0QmlydGhzKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRCaXJ0aHMoZG91YmxlIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlYXRoczwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVhdGhzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWF0aHM8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXREZWF0aHMoZG91YmxlKQ0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlX0RlYXRocygpDQorCSAqIEBtb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlkb3VibGUgZ2V0RGVhdGhzKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlI2dldERlYXRocyA8ZW0+RGVhdGhzPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWF0aHM8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXREZWF0aHMoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldERlYXRocyhkb3VibGUgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVuc2l0eTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMC4wIjwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZW5zaXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZW5zaXR5PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjaXNTZXREZW5zaXR5KCkNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZV9EZW5zaXR5KCkNCisJICogQG1vZGVsIGRlZmF1bHQ9IjAuMCIgdW5zZXR0YWJsZT0idHJ1ZSIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlkb3VibGUgZ2V0RGVuc2l0eSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlI2dldERlbnNpdHkgPGVtPkRlbnNpdHk8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbnNpdHk8L2VtPicgYXR0cmlidXRlIGlzIHNldC4NCisJICogQHNlZSAjZ2V0RGVuc2l0eSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWJvb2xlYW4gaXNTZXREZW5zaXR5KCk7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQG1vZGVsIHZhbHVlVHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLkludGVncmF0aW9uTGFiZWxWYWx1ZSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJYm9vbGVhbiBhZGp1c3REZWx0YShJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgdmFsdWUpOw0KK30gLy8gU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9TdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjUwMDBiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsLmphdmEKQEAgLTAsMCArMSw1OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQ7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdG9jaGFzdGljIFN0YW5kYXJkIFBvcHVsYXRpb24gTW9kZWw8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCNnZXRHYWluIDxlbT5HYWluPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZSNnZXRTdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwoKQ0KKyAqIEBtb2RlbA0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIFN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCBleHRlbmRzIFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsIHsNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdhaW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjAuMDEiPC9jb2RlPi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdhaW48L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdhaW48L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXRHYWluKGRvdWJsZSkNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbF9HYWluKCkNCisJICogQG1vZGVsIGRlZmF1bHQ9IjAuMDEiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWRvdWJsZSBnZXRHYWluKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsI2dldEdhaW4gPGVtPkdhaW48L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdhaW48L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXRHYWluKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRHYWluKGRvdWJsZSB2YWx1ZSk7DQorDQorfSAvLyBTdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9ZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9ZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM5ODQ5OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL1lldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPllldGkgUG9wdWxhdGlvbiBJbml0aWFsaXplcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlI2dldFlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplciBleHRlbmRzIEVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplciB7Cit9IC8vIFlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL2ltcGwvRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL0RlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZjgyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL0RlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjc0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuVXRpbGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5EZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbW9ncmFwaGljIFBvcHVsYXRpb24gTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLkRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsSW1wbCNnZXRQb3B1bGF0aW9uR3JvdXBzIDxlbT5Qb3B1bGF0aW9uIEdyb3VwczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsSW1wbCBleHRlbmRzIFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsSW1wbCBpbXBsZW1lbnRzIERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3B1bGF0aW9uR3JvdXBzKCkgPGVtPlBvcHVsYXRpb24gR3JvdXBzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25Hcm91cHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxQb3B1bGF0aW9uR3JvdXA+IHBvcHVsYXRpb25Hcm91cHM7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5ERU1PR1JBUEhJQ19QT1BVTEFUSU9OX01PREVMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxQb3B1bGF0aW9uR3JvdXA+IGdldFBvcHVsYXRpb25Hcm91cHMoKSB7CisJCWlmIChwb3B1bGF0aW9uR3JvdXBzID09IG51bGwpIHsKKwkJCXBvcHVsYXRpb25Hcm91cHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8UG9wdWxhdGlvbkdyb3VwPihQb3B1bGF0aW9uR3JvdXAuY2xhc3MsIHRoaXMsIFN0YW5kYXJkUGFja2FnZS5ERU1PR1JBUEhJQ19QT1BVTEFUSU9OX01PREVMX19QT1BVTEFUSU9OX0dST1VQUyk7CisJCX0KKwkJcmV0dXJuIHBvcHVsYXRpb25Hcm91cHM7CisJfQorCisJCisJLyoqCisJICogRGVjb3JhdGUgdGhlIGdyYXBoIGZvciBhIGRlbW9ncmFwaGljIHBvcHVsYXRpb24gbW9kZWwKKwkgKiAKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBkZWNvcmF0ZUdyYXBoKFNURU1UaW1lIHRpbWUpIHsKKwkJaWYodGhpcy5pc0dyYXBoRGVjb3JhdGVkKCkpIHJldHVybiB0cnVlOworCQlzdXBlci5kZWNvcmF0ZUdyYXBoKHRpbWUpOworCQkKKwkJCisJCWZvciAoZmluYWwgSXRlcmF0b3I8UG9wdWxhdGlvbkxhYmVsPiBwb3B1bGF0aW9uTGFiZWxJdGVyID0gZ2V0UG9wdWxhdGlvbkxhYmVscygKKwkJCQlnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpLCBnZXRHcmFwaCgpKS5pdGVyYXRvcigpOyBwb3B1bGF0aW9uTGFiZWxJdGVyCisJCQkJLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIFBvcHVsYXRpb25MYWJlbCBwb3B1bGF0aW9uTGFiZWwgPSBwb3B1bGF0aW9uTGFiZWxJdGVyLm5leHQoKTsKKworCQkJaWYodGhpcy5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpLmVxdWFscyhwb3B1bGF0aW9uTGFiZWwuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSkpIHsKKwkJCQkKKwkJCQkvLyBNYWtlIHN1cmUgdGhlIG5vZGUgZG9lcyBub3QgYWxyZWFkeSBoYXZlIHBvcHVsYXRpb24gbW9kZWwgbGFiZWxzIGZvciB0aGUgc3ViIHBvcHVsYXRpb25zLgorCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKwkJCQlmb3IoTm9kZUxhYmVsIGw6cG9wdWxhdGlvbkxhYmVsLmdldE5vZGUoKS5nZXRMYWJlbHMoKSkgeworCQkJCQlpZihsIGluc3RhbmNlb2YgUG9wdWxhdGlvbk1vZGVsTGFiZWwpCisJCQkJCQlmb3IoUG9wdWxhdGlvbkdyb3VwIGdyb3VwOnRoaXMuZ2V0UG9wdWxhdGlvbkdyb3VwcygpKQorCQkJCQkJCWlmKGdyb3VwLmdldElkZW50aWZpZXIoKS5lcXVhbHMoKChQb3B1bGF0aW9uTW9kZWxMYWJlbClsKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpKSkKKwkJCQkJCQkJCXtmb3VuZCA9IHRydWU7YnJlYWs7fQorCQkJCQlpZihmb3VuZClicmVhazsKKwkJCQl9CisJCQkJaWYoZm91bmQpY29udGludWU7CisJCQkJCisJCQkJCisJCQkJLy8gT2theSwgYW5vdGhlciBkZW1vZ3JhcGhpYyBwb3B1bGF0aW9uIG1vZGVsIGhhcyBub3QgeWV0IGFkZGVkIHBvcHVsYXRpb24gbW9kZWwgbGFiZWxzCisJCQkJLy8gZm9yIHRoZSBzYW1lIHBvcHVsYXRpb24gZ3JvdXAgaWRlbnRpZmllcnMsIGJ1dCBpdCBtaWdodCBkbyBzbyBpbiB0aGUgZnV0dXJlIGRlcGVuZGluZworCQkJCS8vIHVwb24gdGhlIG9yZGVyIGRlY29yYXRlR3JhcGgoKSBpcyBjYWxsZWQgb24gdGhlIGRlY29yYXRvcnMuIENoZWNrIGlmIHRoZXJlCisJCQkJLy8gaXMgYW5vdGhlciBkZW1vZ3JhcGhpYyBwb3B1bGF0aW9uIG1vZGVsIHdpdGggYSBoaWdoZXIgaXNvIGxldmVsIHRhcmdldCBub2RlIFVSSSB0aGF0IHRoZQorCQkJCS8vIG5vZGUgaXMgY29udGFpbmVkIHdpdGhpbi4KKwkJCQkKKwkJCQlmb3VuZCA9IGZhbHNlOworCQkJCWZvcihEZWNvcmF0b3IgZDp0aGlzLmdldEdyYXBoKCkuZ2V0RGVjb3JhdG9ycygpKSB7CisJCQkJCSBpZighZC5lcXVhbHModGhpcykgJiYgIAorCQkJCQkJCSBkIGluc3RhbmNlb2YgRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwpCisJCQkJCQkgZm9yKFBvcHVsYXRpb25Hcm91cCBncm91cDp0aGlzLmdldFBvcHVsYXRpb25Hcm91cHMoKSkgeworCQkJCQkJCSBmb3IoUG9wdWxhdGlvbkdyb3VwIGdyb3VwMjooKERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsKWQpLmdldFBvcHVsYXRpb25Hcm91cHMoKSkKKwkJCQkJCQkJIGlmKGdyb3VwLmdldElkZW50aWZpZXIoKS5lcXVhbHMoZ3JvdXAyLmdldElkZW50aWZpZXIoKSkgJiYKKwkJCQkJCQkJICAgIFV0aWxpdHkua2V5TGV2ZWwoKChQb3B1bGF0aW9uTW9kZWwpZCkuZ2V0VGFyZ2V0SVNPS2V5KCkpID4gVXRpbGl0eS5rZXlMZXZlbCh0aGlzLmdldFRhcmdldElTT0tleSgpKSAmJgorCQkJCQkJCSBpc0NvbnRhaW5lZChwb3B1bGF0aW9uTGFiZWwuZ2V0Tm9kZSgpLCAoKChQb3B1bGF0aW9uTW9kZWwpZCkuZ2V0VGFyZ2V0SVNPS2V5KCkpKSkKKwkJCQkJCQkJIHtmb3VuZCA9IHRydWU7YnJlYWs7fQorCQkJCQkJCSBpZihmb3VuZClicmVhazsKKwkJCQkJCSB9CisJCQkJCSBpZihmb3VuZClicmVhazsKKwkJCQl9CisJCQkJaWYoZm91bmQpIGNvbnRpbnVlOworCQkJCQorCQkJCS8vIEl0ZXJhdGUgdGhlIGdyb3VwcyBpbiB0aGUgZGVtb2dyYXBoaWMgbW9kZWwgYW5kIGRpdmlkZSB0aGUgbnVtYmVycworCQkJCWZvcihQb3B1bGF0aW9uR3JvdXAgZ3JvdXA6dGhpcy5nZXRQb3B1bGF0aW9uR3JvdXBzKCkpIHsKKwkJCQkJZmluYWwgUG9wdWxhdGlvbk1vZGVsTGFiZWwgcGwgPSBjcmVhdGVQb3B1bGF0aW9uTGFiZWwoKTsKKwkJCQkJCisJCQkJCXBsLnNldFBvcHVsYXRpb25MYWJlbChwb3B1bGF0aW9uTGFiZWwpOworCQkJCQlnZXRMYWJlbHNUb1VwZGF0ZSgpLmFkZChwbCk7CisJCQkJCXBvcHVsYXRpb25MYWJlbC5nZXROb2RlKCkuZ2V0TGFiZWxzKCkuYWRkKHBsKTsKKwkJCQkJcGwuc2V0Tm9kZShwb3B1bGF0aW9uTGFiZWwuZ2V0Tm9kZSgpKTsKKwkJCQkJZ2V0R3JhcGgoKS5wdXROb2RlTGFiZWwocGwpOworCQkJCQkKKwkJCQkJcGwuc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoZ3JvdXAuZ2V0SWRlbnRpZmllcigpKTsKKwkJCQkJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSW1wbCBjdXJyZW50VmFsdWUgPSAoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSW1wbClwbC5nZXRDdXJyZW50VmFsdWUoKTsKKwkJCQkJY3VycmVudFZhbHVlLnNldENvdW50KHBvcHVsYXRpb25MYWJlbC5nZXRDdXJyZW50UG9wdWxhdGlvblZhbHVlKCkuZ2V0Q291bnQoKSAqIGdyb3VwLmdldEZyYWN0aW9uKCkpOworCQkJCX0KKwkJCX0KKwkJfSAvLyBmb3IgZWFjaCBwb3B1bGF0aW9uIGxhYmVsCisJCXJldHVybiB0cnVlOworCX0gLy8gZGVjb3JhdGVHcmFwaAorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRFTU9HUkFQSElDX1BPUFVMQVRJT05fTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UG9wdWxhdGlvbkdyb3VwcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRFTU9HUkFQSElDX1BPUFVMQVRJT05fTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTOgorCQkJCXJldHVybiBnZXRQb3B1bGF0aW9uR3JvdXBzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRFTU9HUkFQSElDX1BPUFVMQVRJT05fTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTOgorCQkJCWdldFBvcHVsYXRpb25Hcm91cHMoKS5jbGVhcigpOworCQkJCWdldFBvcHVsYXRpb25Hcm91cHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFBvcHVsYXRpb25Hcm91cD4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ERU1PR1JBUEhJQ19QT1BVTEFUSU9OX01PREVMX19QT1BVTEFUSU9OX0dST1VQUzoKKwkJCQlnZXRQb3B1bGF0aW9uR3JvdXBzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRFTU9HUkFQSElDX1BPUFVMQVRJT05fTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTOgorCQkJCXJldHVybiBwb3B1bGF0aW9uR3JvdXBzICE9IG51bGwgJiYgIXBvcHVsYXRpb25Hcm91cHMuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiBXZSBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgb25lIHRvIGNvcnJlY3RseSByZXNldCB0aGUgc3VicG9wdWxhdGlvbnMKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNldExhYmVscygpIHsKKwkJc2V0RW5hYmxlZChFTkFCTEVEX0VERUZBVUxUKTsKKwkJc2V0R3JhcGhEZWNvcmF0ZWQoR1JBUEhfREVDT1JBVEVEX0VERUZBVUxUKTsKKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxEeW5hbWljTGFiZWw+IGxhYmVsSXRlciA9IGdldExhYmVsc1RvVXBkYXRlKCkKKwkJCQkuaXRlcmF0b3IoKTsgbGFiZWxJdGVyLmhhc05leHQoKTspIHsKKwkJCVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwgcGxtID0gKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwpbGFiZWxJdGVyLm5leHQoKTsKKwkJCQorCQkJCisJCQlwbG0uZ2V0Q3VycmVudFZhbHVlKCkucmVzZXQoKTsKKwkJCXBsbS5nZXROZXh0VmFsdWUoKS5yZXNldCgpOworCQkJcGxtLmdldERlbHRhVmFsdWUoKS5yZXNldCgpOworCQkJcGxtLmdldFRlbXBWYWx1ZSgpLnJlc2V0KCk7CisJCQlwbG0uZ2V0UHJvYmVWYWx1ZSgpLnJlc2V0KCk7CisJCQlwbG0uZ2V0RXJyb3JTY2FsZSgpLnJlc2V0KCk7CisJCQkKKwkJCWlmKHBsbS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpLmVxdWFscyh0aGlzLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkpKSB7CisJCQkJZG91YmxlIG9yaWdpbmFsQ291bnQgPSBwbG0uZ2V0UG9wdWxhdGlvbkxhYmVsKCkuZ2V0Q3VycmVudFBvcHVsYXRpb25WYWx1ZSgpLmdldENvdW50KCk7CisJCQkJKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpcGxtLmdldEN1cnJlbnRWYWx1ZSgpKS5zZXRDb3VudChvcmlnaW5hbENvdW50KTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gVGhlIGxhYmVsIGlzIGZyb20gb25lIG9mIHRoZSBzdWJncm91cHMuIEZpZ3VyZSBvdXQgdGhlIGZyYWN0aW9uCisJCQkJZm9yKFBvcHVsYXRpb25Hcm91cCBnOnRoaXMuZ2V0UG9wdWxhdGlvbkdyb3VwcygpKSB7CisJCQkJCWlmKGcuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhwbG0uZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSkpIHsKKwkJCQkJCWRvdWJsZSBvcmlnaW5hbENvdW50ID0gcGxtLmdldFBvcHVsYXRpb25MYWJlbCgpLmdldEN1cnJlbnRQb3B1bGF0aW9uVmFsdWUoKS5nZXRDb3VudCgpOworCQkJCQkJKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpcGxtLmdldEN1cnJlbnRWYWx1ZSgpKS5zZXRDb3VudChvcmlnaW5hbENvdW50KmcuZ2V0RnJhY3Rpb24oKSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJLy8gUG9wdWxhdGUgdGhlIHBpcGUgdHJhbnNwb3J0YXRpb24gc3lzdGVtcworCQlzdXBlci5wb3B1bGF0ZVBpcGVTeXN0ZW1Ob2RlcygpOworCX0gLy8gcmVzZXRMYWJlbHMKK30gLy9EZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL2ltcGwvRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvaW1wbC9FYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljOWI1MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL2ltcGwvRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZCQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5FYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVhcnRoIFNjaWVuY2UgUG9wdWxhdGlvbiBJbml0aWFsaXplcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplckltcGwgZXh0ZW5kcyBQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJbXBsIGltcGxlbWVudHMgRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5FQVJUSF9TQ0lFTkNFX1BPUFVMQVRJT05fSU5JVElBTElaRVI7CisJfQorCit9IC8vRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvaW1wbC9Qb3B1bGF0aW9uR3JvdXBJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL1BvcHVsYXRpb25Hcm91cEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTg0ZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvaW1wbC9Qb3B1bGF0aW9uR3JvdXBJbXBsLmphdmEKQEAgLTAsMCArMSwyMjMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Hcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9wdWxhdGlvbiBHcm91cDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuUG9wdWxhdGlvbkdyb3VwSW1wbCNnZXRJZGVudGlmaWVyIDxlbT5JZGVudGlmaWVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5Qb3B1bGF0aW9uR3JvdXBJbXBsI2dldEZyYWN0aW9uIDxlbT5GcmFjdGlvbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBvcHVsYXRpb25Hcm91cEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFBvcHVsYXRpb25Hcm91cCB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkZW50aWZpZXIoKSA8ZW0+SWRlbnRpZmllcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWRlbnRpZmllcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlRJRklFUl9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZGVudGlmaWVyKCkgPGVtPklkZW50aWZpZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkZW50aWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgaWRlbnRpZmllciA9IElERU5USUZJRVJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnJhY3Rpb24oKSA8ZW0+RnJhY3Rpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZyYWN0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBGUkFDVElPTl9FREVGQVVMVCA9IDAuNTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZyYWN0aW9uKCkgPGVtPkZyYWN0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRGcmFjdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBmcmFjdGlvbiA9IEZSQUNUSU9OX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBvcHVsYXRpb25Hcm91cEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuUE9QVUxBVElPTl9HUk9VUDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7CisJCXJldHVybiBpZGVudGlmaWVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldElkZW50aWZpZXIoU3RyaW5nIG5ld0lkZW50aWZpZXIpIHsKKwkJU3RyaW5nIG9sZElkZW50aWZpZXIgPSBpZGVudGlmaWVyOworCQlpZGVudGlmaWVyID0gbmV3SWRlbnRpZmllcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fR1JPVVBfX0lERU5USUZJRVIsIG9sZElkZW50aWZpZXIsIGlkZW50aWZpZXIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldEZyYWN0aW9uKCkgeworCQlyZXR1cm4gZnJhY3Rpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RnJhY3Rpb24oZG91YmxlIG5ld0ZyYWN0aW9uKSB7CisJCWRvdWJsZSBvbGRGcmFjdGlvbiA9IGZyYWN0aW9uOworCQlmcmFjdGlvbiA9IG5ld0ZyYWN0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9HUk9VUF9fRlJBQ1RJT04sIG9sZEZyYWN0aW9uLCBmcmFjdGlvbikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fR1JPVVBfX0lERU5USUZJRVI6CisJCQkJcmV0dXJuIGdldElkZW50aWZpZXIoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fR1JPVVBfX0ZSQUNUSU9OOgorCQkJCXJldHVybiBnZXRGcmFjdGlvbigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX0dST1VQX19JREVOVElGSUVSOgorCQkJCXNldElkZW50aWZpZXIoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9HUk9VUF9fRlJBQ1RJT046CisJCQkJc2V0RnJhY3Rpb24oKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fR1JPVVBfX0lERU5USUZJRVI6CisJCQkJc2V0SWRlbnRpZmllcihJREVOVElGSUVSX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX0dST1VQX19GUkFDVElPTjoKKwkJCQlzZXRGcmFjdGlvbihGUkFDVElPTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX0dST1VQX19JREVOVElGSUVSOgorCQkJCXJldHVybiBJREVOVElGSUVSX0VERUZBVUxUID09IG51bGwgPyBpZGVudGlmaWVyICE9IG51bGwgOiAhSURFTlRJRklFUl9FREVGQVVMVC5lcXVhbHMoaWRlbnRpZmllcik7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX0dST1VQX19GUkFDVElPTjoKKwkJCQlyZXR1cm4gZnJhY3Rpb24gIT0gRlJBQ1RJT05fRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChpZGVudGlmaWVyOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChpZGVudGlmaWVyKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBmcmFjdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoZnJhY3Rpb24pOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Qb3B1bGF0aW9uR3JvdXBJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL1BvcHVsYXRpb25Jbml0aWFsaXplckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL2ltcGwvUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMTJhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL1BvcHVsYXRpb25Jbml0aWFsaXplckltcGwuamF2YQpAQCAtMCwwICsxLDQwOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlV0aWxpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTm9kZURlY29yYXRvckltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuUG9wdWxhdGlvbkxhYmVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uSW5pdGlhbGl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcHVsYXRpb24gSW5pdGlhbGl6ZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlBvcHVsYXRpb25Jbml0aWFsaXplckltcGwjZ2V0VGFyZ2V0SVNPS2V5IDxlbT5UYXJnZXQgSVNPIEtleTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbCNnZXRQb3B1bGF0aW9uSWRlbnRpZmllciA8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbCBleHRlbmRzIE5vZGVEZWNvcmF0b3JJbXBsIGltcGxlbWVudHMgUG9wdWxhdGlvbkluaXRpYWxpemVyIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0SVNPS2V5KCkgPGVtPlRhcmdldCBJU08gS2V5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUYXJnZXRJU09LZXkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9JU09fS0VZX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldElTT0tleSgpIDxlbT5UYXJnZXQgSVNPIEtleTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGFyZ2V0SVNPS2V5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldElTT0tleSA9IFRBUkdFVF9JU09fS0VZX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkgPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUFVMQVRJT05fSURFTlRJRklFUl9FREVGQVVMVCA9ICJodW1hbiI7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpIDxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHBvcHVsYXRpb25JZGVudGlmaWVyID0gUE9QVUxBVElPTl9JREVOVElGSUVSX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBvcHVsYXRpb25Jbml0aWFsaXplckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuUE9QVUxBVElPTl9JTklUSUFMSVpFUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRhcmdldElTT0tleSgpIHsKKwkJcmV0dXJuIHRhcmdldElTT0tleTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUYXJnZXRJU09LZXkoU3RyaW5nIG5ld1RhcmdldElTT0tleSkgeworCQlTdHJpbmcgb2xkVGFyZ2V0SVNPS2V5ID0gdGFyZ2V0SVNPS2V5OworCQl0YXJnZXRJU09LZXkgPSBuZXdUYXJnZXRJU09LZXk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19UQVJHRVRfSVNPX0tFWSwgb2xkVGFyZ2V0SVNPS2V5LCB0YXJnZXRJU09LZXkpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkgeworCQlyZXR1cm4gcG9wdWxhdGlvbklkZW50aWZpZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoU3RyaW5nIG5ld1BvcHVsYXRpb25JZGVudGlmaWVyKSB7CisJCVN0cmluZyBvbGRQb3B1bGF0aW9uSWRlbnRpZmllciA9IHBvcHVsYXRpb25JZGVudGlmaWVyOworCQlwb3B1bGF0aW9uSWRlbnRpZmllciA9IG5ld1BvcHVsYXRpb25JZGVudGlmaWVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fUE9QVUxBVElPTl9JREVOVElGSUVSLCBvbGRQb3B1bGF0aW9uSWRlbnRpZmllciwgcG9wdWxhdGlvbklkZW50aWZpZXIpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBkZWNvcmF0ZUdyYXBoKFNURU1UaW1lIHRpbWUpIHsKKwkJaWYodGhpcy5pc0dyYXBoRGVjb3JhdGVkKCkpIHJldHVybiB0cnVlOworCQljaGVja1BvcHVsYXRpb25Nb2RlbHMoKTsKKwkJQXJyYXlMaXN0PE5vZGU+bm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisJCUFycmF5TGlzdDxOb2RlPm5lZ2F0aXZlTm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisJCQorCQl0aGlzLmdldE5vZGVzKHRoaXMuZ2V0R3JhcGgoKSwgdGhpcy5nZXRUYXJnZXRJU09LZXkoKSwgbm9kZXMsIG5lZ2F0aXZlTm9kZXMpOworCQkKKwkJaWYobm9kZXMuc2l6ZSgpID09IDApCisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkVycm9yIGluIHBvcHVsYXRpb24gaW5pdGlhbGl6ZXIgIit0aGlzLmdldFVSSSgpKyIsIHVuYWJsZSB0byBmaW5kIG5vZGUgIit0aGlzLmdldFRhcmdldElTT0tleSgpLCBuZXcgRXhjZXB0aW9uKCkpOworCQorCQlmb3IoTm9kZSBuOm5vZGVzKSB7CisJCQkvLyBDaGVjayBmb3IgZXhpc3RpbmcgbGFiZWwKKwkJCVBvcHVsYXRpb25MYWJlbCBleGlzdGluZ0xhYmVsID0gbnVsbDsKKwkJCWZvcihOb2RlTGFiZWwgbGFiOm4uZ2V0TGFiZWxzKCkpIHsKKwkJCQlpZihsYWIgaW5zdGFuY2VvZiBQb3B1bGF0aW9uTGFiZWwgCisJCQkJCQkmJiAoKFBvcHVsYXRpb25MYWJlbClsYWIpLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkuZXF1YWxzKHRoaXMuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSkpIHsKKwkJCQkJZXhpc3RpbmdMYWJlbCA9IChQb3B1bGF0aW9uTGFiZWwpbGFiOworCQkJCX0KKwkJCX0KKwkJCWlmKGV4aXN0aW5nTGFiZWwgIT0gbnVsbCkgewkJCQkKKwkJCQkJLy8gSW5pdGlhbGl6ZSB3aXRoIG5ldyB2YWx1ZQorCQkJCQlpbml0aWFsaXplTGFiZWwoKFBvcHVsYXRpb25MYWJlbClleGlzdGluZ0xhYmVsLCB0aW1lLCBmYWxzZSk7CisJCQl9IGVsc2UgeworCQkJCS8vIENyZWF0ZSBhIG5ldyBsYWJlbAorCQkJCVBvcHVsYXRpb25MYWJlbCBuZXdMYWJlbCA9IExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvcHVsYXRpb25MYWJlbCgpOworCQkJCW5ld0xhYmVsLnNldFBvcHVsYXRpb25JZGVudGlmaWVyKHRoaXMuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSk7CisJCQkJbmV3TGFiZWwuc2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZChuLmdldFVSSSgpKTsKKwkJCQluZXdMYWJlbC5zZXROb2RlKG4pOworCQkJCUdyYXBoIGcgPSB0aGlzLmdldEdyYXBoKCk7CisJCQkJVVJJIG5ld1VSSSA9IGNyZWF0ZVBvcHVsYXRpb25MYWJlbFVSSShuLCB0aW1lKTsKKwkJCQlnLmdldE5vZGVMYWJlbHMoKS5wdXQobmV3VVJJLCBuZXdMYWJlbCk7CisJCQkJaW5pdGlhbGl6ZUxhYmVsKChQb3B1bGF0aW9uTGFiZWwpbmV3TGFiZWwsIHRpbWUsIGZhbHNlKTsJCQkJCisJCQl9CisJCX0KKwkJCisJCS8vIE5vdyBkbyB0aGUgcmVzdCBvZiB0aGUgbm9kZXMgaW4gdGhlIGdyYXBoCisJCQorCQlmb3IoTm9kZSBuOm5lZ2F0aXZlTm9kZXMpIHsKKwkJCS8vIENoZWNrIGZvciBleGlzdGluZyBsYWJlbAorCQkJUG9wdWxhdGlvbkxhYmVsIGV4aXN0aW5nTGFiZWwgPSBudWxsOworCQkJZm9yKE5vZGVMYWJlbCBsYWI6bi5nZXRMYWJlbHMoKSkgeworCQkJCWlmKGxhYiBpbnN0YW5jZW9mIFBvcHVsYXRpb25MYWJlbCAKKwkJCQkJCSYmICgoUG9wdWxhdGlvbkxhYmVsKWxhYikuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKS5lcXVhbHModGhpcy5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpKSkgeworCQkJCQlleGlzdGluZ0xhYmVsID0gKFBvcHVsYXRpb25MYWJlbClsYWI7CisJCQkJfQorCQkJfQorCQkJaWYoZXhpc3RpbmdMYWJlbCA9PSBudWxsKSB7CisJCQkJLy8gQ3JlYXRlIGEgbmV3IGxhYmVsLiBXZSBkb24ndCBvdmVycmlkZSB0aGUgZXhpc3RpbmcgbGFiZWwKKwkJCQlQb3B1bGF0aW9uTGFiZWwgbmV3TGFiZWwgPSBMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3B1bGF0aW9uTGFiZWwoKTsKKwkJCQluZXdMYWJlbC5zZXRQb3B1bGF0aW9uSWRlbnRpZmllcih0aGlzLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkpOworCQkJCW5ld0xhYmVsLnNldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQobi5nZXRVUkkoKSk7CisJCQkJbmV3TGFiZWwuc2V0Tm9kZShuKTsKKwkJCQlHcmFwaCBnID0gdGhpcy5nZXRHcmFwaCgpOworCQkJCVVSSSBuZXdVUkkgPSBjcmVhdGVQb3B1bGF0aW9uTGFiZWxVUkkobiwgdGltZSk7CisJCQkJZy5nZXROb2RlTGFiZWxzKCkucHV0KG5ld1VSSSwgbmV3TGFiZWwpOworCQkJCWluaXRpYWxpemVMYWJlbCgoUG9wdWxhdGlvbkxhYmVsKW5ld0xhYmVsLCB0aW1lLCB0cnVlKTsJCQkJCisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVMYWJlbChQb3B1bGF0aW9uTGFiZWwgbGFiLCBTVEVNVGltZSB0aW1lLCBib29sZWFuIHplcm9WYWx1ZSk7CisJCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tQb3B1bGF0aW9uTW9kZWxzKCkgeworCQkvLyBMZXQncyB2YWxpZGF0ZSB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gcG9wdWxhdGlvbiBtb2RlbAorCQkvLyBhdCB0aGUgc2FtZSBvciBsb3dlciBsZXZlbCB0aGF0IGFscmVhZHkncyBiZWVuIGludm9rZWQgCisJCS8vIGFuZCB0aGF0J3MgdXNpbmcgdGhlIHNhbWUgcG9wdWxhdGlvbi4gSWYgc28sIHdlIHNob3VsZCBicmluZworCQkvLyB1cCBhIHdhcm5pbmcgYW5kIHBvc3NpYmx5IGEgaGVscCBsaW5rCisJCQorCQlmb3IoRGVjb3JhdG9yIGQ6dGhpcy5nZXRHcmFwaCgpLmdldERlY29yYXRvcnMoKSkgeworCQkJaWYgKGQgaW5zdGFuY2VvZiBQb3B1bGF0aW9uTW9kZWwgJiYgKChQb3B1bGF0aW9uTW9kZWwpZCkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKS5lcXVhbHModGhpcy5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpKSkgeworCQkJCWlmKCgoUG9wdWxhdGlvbk1vZGVsKWQpLmlzR3JhcGhEZWNvcmF0ZWQoKSkKKwkJCQkJVXRpbGl0eS5kaXNwbGF5U2NlbmFyaW9Db21wb3NpdGlvbldhcm5pbmcoVXRpbGl0eS5ORVNUSU5HX1dBUk5JTkcpOworCQkJfQorCQl9CQorCX0KKwkKKwlwcm90ZWN0ZWQgaW50IGdldFllYXIoU1RFTVRpbWUgdGltZSkgeworCQlDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworCQlpZih0aW1lICE9IG51bGwpCisJCQljYWwuc2V0VGltZSh0aW1lLmdldFRpbWUoKSk7CisJCWVsc2UgY2FsLnNldFRpbWUobmV3IERhdGUoKSk7CisJCWludCB5ZWFyID0gY2FsLmdldChDYWxlbmRhci5ZRUFSKTsKKwkJcmV0dXJuIHllYXI7CisJfQorCQorCQorCXByb3RlY3RlZCB2b2lkIGdldE5vZGVzKEdyYXBoIGcsIFN0cmluZyBrZXksIEFycmF5TGlzdDxOb2RlPmxpc3QsIEFycmF5TGlzdDxOb2RlPm5lZ0xpc3QpIHsKKworCQkvLyBGaXJzdCBmaW5kIG90aGVyIHBvcHVsYXRpb24gaW5pdGlhbGl6ZXJzIGluIHRoZSBncmFwaCB0aGF0IGhhcyB0aGUgc2FtZQorCQkvLyBwb3B1bGF0aW9uIGlkZW50aWZpZXIgYnV0IGEgbG93ZXIgbGV2ZWwga2V5LiBBbnkgbm9kZSBpbiB0aGUgc3Vic3RyZWUgCisJCS8vIG9mIHRoYXQgbG93ZXIgbGV2ZWwga2V5IHNob3VsZCBub3QgYmUgdG91Y2hlZC4KKwkJCisJCUFycmF5TGlzdDxTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcj5sb3dlckxldmVsSW5pdGlhbGl6ZXJzID0gbmV3IEFycmF5TGlzdDxTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcj4oKTsKKwkJCisJCWZvcihEZWNvcmF0b3IgZDpnLmdldERlY29yYXRvcnMoKSkgeworCQkJaWYoZCBpbnN0YW5jZW9mIFN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyICYmCisJCQkJCSgoU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIpZCkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKS5lcXVhbHModGhpcy5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpKSAmJgorCQkJCQlVdGlsaXR5LmtleUxldmVsKCgoU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIpZCkuZ2V0VGFyZ2V0SVNPS2V5KCkpID4gVXRpbGl0eS5rZXlMZXZlbCh0aGlzLmdldFRhcmdldElTT0tleSgpKSkKKwkJCQlsb3dlckxldmVsSW5pdGlhbGl6ZXJzLmFkZCgoU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIpZCk7CisJCX0KKwkJCisJCWZvcihOb2RlIG46Zy5nZXROb2RlcygpLnZhbHVlcygpKSB7CisJCQlib29sZWFuIGZvdW5kU3ViSW5pdGlhbGl6ZXIgPSBmYWxzZTsKKwkJCWZvcihTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplciBzcGk6bG93ZXJMZXZlbEluaXRpYWxpemVycykgCisJCQkJaWYoaXNTZWxmT3JIYXNQYXJlbnQobiwgc3BpLmdldFRhcmdldElTT0tleSgpKSkgCisJCQkJCXtmb3VuZFN1YkluaXRpYWxpemVyID0gdHJ1ZTticmVhazt9CisJCQlpZihmb3VuZFN1YkluaXRpYWxpemVyKSBjb250aW51ZTsKKwkJCQorCQkJaWYoKGtleSA9PSBudWxsIHx8IGtleS50cmltKCkuZXF1YWxzKCIiKSkgJiYgaXNMZWFmKG4pKSBsaXN0LmFkZChuKTsKKwkJCWVsc2UgaWYobi5nZXRVUkkoKS5sYXN0U2VnbWVudCgpLmVxdWFscyhrZXkpICYmIGlzTGVhZihuKSkgbGlzdC5hZGQobik7CisJCQkvLyBDaGVjayBpZiBhbnkgb2YgdGhlIHBhcmVudHMgaXMgdGhlIGtleQorCQkJZWxzZSBpZihoYXNQYXJlbnQobiwga2V5KSAmJiBpc0xlYWYobikpIGxpc3QuYWRkKG4pOworCQkJZWxzZSBpZihpc0xlYWYobikpIG5lZ0xpc3QuYWRkKG4pOworCQl9CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzTGVhZihOb2RlIG4pIHsKKwkJZm9yKEVkZ2UgZTpuLmdldEVkZ2VzKCkpCisJCQlpZihlLmdldExhYmVsKCkgaW5zdGFuY2VvZiBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwgJiYKKwkJCQkJZS5nZXRBKCkuZXF1YWxzKG4pKSAKKwkJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBoYXNQYXJlbnQoTm9kZSBuLCBTdHJpbmcga2V5KSB7CisJCWZvcihFZGdlIGU6bi5nZXRFZGdlcygpKSB7CisJCQkvLyBNYWtlIHN1cmUgaXQncyBhIHBoeXNpY2FsIGNvbnRhaW5tZW50IGVkZ2UKKwkJCWJvb2xlYW4gcGh5cyA9IGUuZ2V0TGFiZWwoKSBpbnN0YW5jZW9mIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbDsKKwkJCWlmKCFwaHlzKSAKKwkJCQljb250aW51ZTsKKwkJCWlmKGUuZ2V0QSgpLmdldFVSSSgpLmxhc3RTZWdtZW50KCkuZXF1YWxzKGtleSkpIHJldHVybiB0cnVlOworCQkJZWxzZSBpZihVdGlsaXR5LmtleUxldmVsKGUuZ2V0QSgpLmdldFVSSSgpLmxhc3RTZWdtZW50KCkpIDwgVXRpbGl0eS5rZXlMZXZlbChuLmdldFVSSSgpLmxhc3RTZWdtZW50KCkpKQorCQkJCXJldHVybiBoYXNQYXJlbnQoZS5nZXRBKCksIGtleSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1NlbGZPckhhc1BhcmVudChOb2RlIG4sIFN0cmluZyBrZXkpIHsKKwkJaWYobi5nZXRVUkkoKS5sYXN0U2VnbWVudCgpLmVxdWFscyhrZXkpKSByZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIGhhc1BhcmVudChuLCBrZXkpOworCX0KKwkKKwlwcm90ZWN0ZWQgVVJJIGNyZWF0ZVBvcHVsYXRpb25MYWJlbFVSSShOb2RlIG4sIFNURU1UaW1lIHRpbWUpIHsKKwkJaW50IGFkbWluTGV2ZWwgPSBVdGlsaXR5LmtleUxldmVsKG4uZ2V0VVJJKCkubGFzdFNlZ21lbnQoKSk7CisJCVN0cmluZyBjb3VudHJ5Q29kZSA9IHRoaXMuZ2V0Q291bnRyeUNvZGUobik7CisJCVN0cmluZyBwb3B1bGF0aW9uID0gdGhpcy5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpOworCQlpbnQgeWVhciA9IG5ldyBEYXRlKCkuZ2V0WWVhcigpKzE5MDA7CisJCWlmKHRpbWUgIT0gbnVsbCkgeWVhciA9IGdldFllYXIodGltZSk7CisJCVN0cmluZyBjb2RlID0gbi5nZXRVUkkoKS5sYXN0U2VnbWVudCgpOworCQkKKwkJcmV0dXJuIFBvcHVsYXRpb25MYWJlbEltcGwuY3JlYXRlUG9wdWxhdGlvbkxhYmVsVVJJKGFkbWluTGV2ZWwsIGNvdW50cnlDb2RlLCBwb3B1bGF0aW9uLCB5ZWFyKyIiLCBjb2RlKTsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRDb3VudHJ5Q29kZShOb2RlIG4pIHsKKwkJaWYoVXRpbGl0eS5rZXlMZXZlbChuLmdldFVSSSgpLmxhc3RTZWdtZW50KCkpID09IDApIHJldHVybiBuLmdldFVSSSgpLmxhc3RTZWdtZW50KCk7CisJCWVsc2UgZm9yKEVkZ2UgZTpuLmdldEVkZ2VzKCkpIAorCQkJaWYoVXRpbGl0eS5rZXlMZXZlbChlLmdldEEoKS5nZXRVUkkoKS5sYXN0U2VnbWVudCgpKSA8IFV0aWxpdHkua2V5TGV2ZWwobi5nZXRVUkkoKS5sYXN0U2VnbWVudCgpKSkKKwkJCXJldHVybiBnZXRDb3VudHJ5Q29kZShlLmdldEEoKSk7CisJCQorCQlyZXR1cm4gIlpaWiI7IC8vIE5vdCBmb3VuZCwgYnV0IFpaWiBpcyB0aGUgcGFyZW50IG9mIGV2ZXJ5dGhpbmcKKwl9CisJCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fVEFSR0VUX0lTT19LRVk6CisJCQkJcmV0dXJuIGdldFRhcmdldElTT0tleSgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fUE9QVUxBVElPTl9JREVOVElGSUVSOgorCQkJCXJldHVybiBnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19UQVJHRVRfSVNPX0tFWToKKwkJCQlzZXRUYXJnZXRJU09LZXkoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fUE9QVUxBVElPTl9JREVOVElGSUVSOgorCQkJCXNldFBvcHVsYXRpb25JZGVudGlmaWVyKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19UQVJHRVRfSVNPX0tFWToKKwkJCQlzZXRUYXJnZXRJU09LZXkoVEFSR0VUX0lTT19LRVlfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fSU5JVElBTElaRVJfX1BPUFVMQVRJT05fSURFTlRJRklFUjoKKwkJCQlzZXRQb3B1bGF0aW9uSWRlbnRpZmllcihQT1BVTEFUSU9OX0lERU5USUZJRVJfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fVEFSR0VUX0lTT19LRVk6CisJCQkJcmV0dXJuIFRBUkdFVF9JU09fS0VZX0VERUZBVUxUID09IG51bGwgPyB0YXJnZXRJU09LZXkgIT0gbnVsbCA6ICFUQVJHRVRfSVNPX0tFWV9FREVGQVVMVC5lcXVhbHModGFyZ2V0SVNPS2V5KTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fSU5JVElBTElaRVJfX1BPUFVMQVRJT05fSURFTlRJRklFUjoKKwkJCQlyZXR1cm4gUE9QVUxBVElPTl9JREVOVElGSUVSX0VERUZBVUxUID09IG51bGwgPyBwb3B1bGF0aW9uSWRlbnRpZmllciAhPSBudWxsIDogIVBPUFVMQVRJT05fSURFTlRJRklFUl9FREVGQVVMVC5lcXVhbHMocG9wdWxhdGlvbklkZW50aWZpZXIpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAodGFyZ2V0SVNPS2V5OiAiKTsKKwkJcmVzdWx0LmFwcGVuZCh0YXJnZXRJU09LZXkpOworCQlyZXN1bHQuYXBwZW5kKCIsIHBvcHVsYXRpb25JZGVudGlmaWVyOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChwb3B1bGF0aW9uSWRlbnRpZmllcik7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1BvcHVsYXRpb25Jbml0aWFsaXplckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL2ltcGwvUG9wdWxhdGlvbk1vZGVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvaW1wbC9Qb3B1bGF0aW9uTW9kZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhY2U0OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL2ltcGwvUG9wdWxhdGlvbk1vZGVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsNDY2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuVXRpbGl0eTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuTm9kZURlY29yYXRvckltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QaXBlVHJhbnNwb3J0RWRnZUxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcHVsYXRpb24gTW9kZWw8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuUG9wdWxhdGlvbk1vZGVsSW1wbCNnZXRQb3B1bGF0aW9uSWRlbnRpZmllciA8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuUG9wdWxhdGlvbk1vZGVsSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuUG9wdWxhdGlvbk1vZGVsSW1wbCNnZXRUYXJnZXRJU09LZXkgPGVtPlRhcmdldCBJU08gS2V5PC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUG9wdWxhdGlvbk1vZGVsSW1wbCBleHRlbmRzIE5vZGVEZWNvcmF0b3JJbXBsIGltcGxlbWVudHMgUG9wdWxhdGlvbk1vZGVsIHsNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpIDxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9QVUxBVElPTl9JREVOVElGSUVSX0VERUZBVUxUID0gImh1bWFuIjsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkgPGVtPlBvcHVsYXRpb24gSWRlbnRpZmllcjwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIHBvcHVsYXRpb25JZGVudGlmaWVyID0gUE9QVUxBVElPTl9JREVOVElGSUVSX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0TmFtZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSAiSHVtYW5Qb3B1bGF0aW9uTW9kZWwiOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXROYW1lKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRJU09LZXkoKSA8ZW0+VGFyZ2V0IElTTyBLZXk8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFRhcmdldElTT0tleSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9JU09fS0VZX0VERUZBVUxUID0gIiI7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRJU09LZXkoKSA8ZW0+VGFyZ2V0IElTTyBLZXk8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFRhcmdldElTT0tleSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0SVNPS2V5ID0gVEFSR0VUX0lTT19LRVlfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXB1YmxpYyBQb3B1bGF0aW9uTW9kZWxJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuUE9QVUxBVElPTl9NT0RFTDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSB7DQorCQlyZXR1cm4gcG9wdWxhdGlvbklkZW50aWZpZXI7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRQb3B1bGF0aW9uSWRlbnRpZmllcihTdHJpbmcgbmV3UG9wdWxhdGlvbklkZW50aWZpZXIpIHsNCisJCVN0cmluZyBvbGRQb3B1bGF0aW9uSWRlbnRpZmllciA9IHBvcHVsYXRpb25JZGVudGlmaWVyOw0KKwkJcG9wdWxhdGlvbklkZW50aWZpZXIgPSBuZXdQb3B1bGF0aW9uSWRlbnRpZmllcjsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSLCBvbGRQb3B1bGF0aW9uSWRlbnRpZmllciwgcG9wdWxhdGlvbklkZW50aWZpZXIpKTsNCisJfQ0KKw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCisJCXJldHVybiBuYW1lOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgew0KKwkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOw0KKwkJbmFtZSA9IG5ld05hbWU7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fTU9ERUxfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0SVNPS2V5KCkgew0KKwkJcmV0dXJuIHRhcmdldElTT0tleTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFRhcmdldElTT0tleShTdHJpbmcgbmV3VGFyZ2V0SVNPS2V5KSB7DQorCQlTdHJpbmcgb2xkVGFyZ2V0SVNPS2V5ID0gdGFyZ2V0SVNPS2V5Ow0KKwkJdGFyZ2V0SVNPS2V5ID0gbmV3VGFyZ2V0SVNPS2V5Ow0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX01PREVMX19UQVJHRVRfSVNPX0tFWSwgb2xkVGFyZ2V0SVNPS2V5LCB0YXJnZXRJU09LZXkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVjb3JhdGUgdGhlIGdyYXBoIGZvciBhIHN0YW5kYXJkIHBvcHVsYXRpb24gbW9kZWwNCisJICogDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gZGVjb3JhdGVHcmFwaChTVEVNVGltZSB0aW1lKSB7DQorCQlpZih0aGlzLmlzR3JhcGhEZWNvcmF0ZWQoKSkgcmV0dXJuIHRydWU7DQorCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPFBvcHVsYXRpb25MYWJlbD4gcG9wdWxhdGlvbkxhYmVsSXRlciA9IGdldFBvcHVsYXRpb25MYWJlbHMoDQorCQkJCWdldFBvcHVsYXRpb25JZGVudGlmaWVyKCksIGdldEdyYXBoKCkpLml0ZXJhdG9yKCk7IHBvcHVsYXRpb25MYWJlbEl0ZXINCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlmaW5hbCBQb3B1bGF0aW9uTGFiZWwgcG9wdWxhdGlvbkxhYmVsID0gcG9wdWxhdGlvbkxhYmVsSXRlci5uZXh0KCk7DQorDQorCQkJaWYodGhpcy5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpLmVxdWFscyhwb3B1bGF0aW9uTGFiZWwuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSkpIHsNCisJCQkJLy8gTWFrZSBzdXJlIHRoZSBub2RlIGRvZXMgbm90IGFscmVhZHkgaGF2ZSBhIHBvcHVsYXRpb24gbW9kZWwgbGFiZWwgZm9yIHRoaXMgcG9wdWxhdGlvbg0KKwkJCQkvLyBpZGVudGlmaWVyLiANCisJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOw0KKwkJCQlmb3IoTm9kZUxhYmVsIGw6cG9wdWxhdGlvbkxhYmVsLmdldE5vZGUoKS5nZXRMYWJlbHMoKSkgew0KKwkJCQkJaWYobCBpbnN0YW5jZW9mIFBvcHVsYXRpb25Nb2RlbExhYmVsICYmIA0KKwkJCQkJCQkoKFBvcHVsYXRpb25Nb2RlbExhYmVsKWwpLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkuZXF1YWxzKHRoaXMuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSkpDQorCQkJCQkJe2ZvdW5kID0gdHJ1ZTticmVhazt9DQorCQkJCX0NCisJCQkJaWYoZm91bmQpY29udGludWU7DQorCQkJCQ0KKwkJCQkvLyBPa2F5LCBhbm90aGVyIHBvcHVsYXRpb24gbW9kZWwgaGFzIG5vdCB5ZXQgYWRkZWQgcG9wdWxhdGlvbiBtb2RlbCBsYWJlbHMNCisJCQkJLy8gZm9yIHRoZSBzYW1lIHBvcHVsYXRpb24gaWRlbnRpZmllciwgYnV0IGl0IG1pZ2h0IGRvIHNvIGluIHRoZSBmdXR1cmUgZGVwZW5kaW5nDQorCQkJCS8vIHVwb24gdGhlIG9yZGVyIGRlY29yYXRlR3JhcGgoKSBpcyBjYWxsZWQgb24gdGhlIGRlY29yYXRvcnMuIENoZWNrIGlmIHRoZXJlDQorCQkJCS8vIGlzIGFub3RoZXIgcG9wdWxhdGlvbiBtb2RlbCB3aXRoIGEgaGlnaGVyIGlzbyBsZXZlbCB0YXJnZXQgbm9kZSBVUkkgdGhhdCB0aGUNCisJCQkJLy8gbm9kZSBpcyBjb250YWluZWQgd2l0aGluLg0KKwkJCQkNCisJCQkJZm91bmQgPSBmYWxzZTsNCisJCQkJZm9yKERlY29yYXRvciBkOnRoaXMuZ2V0R3JhcGgoKS5nZXREZWNvcmF0b3JzKCkpIHsNCisJCQkJCSBpZighZC5lcXVhbHModGhpcykgJiYgIA0KKwkJCQkJCQkgZCBpbnN0YW5jZW9mIFBvcHVsYXRpb25Nb2RlbCAmJiANCisJCQkJCQkJICgoUG9wdWxhdGlvbk1vZGVsKWQpLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkuZXF1YWxzKHRoaXMuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSkgJiYNCisJCQkJCQkJIFV0aWxpdHkua2V5TGV2ZWwoKChQb3B1bGF0aW9uTW9kZWwpZCkuZ2V0VGFyZ2V0SVNPS2V5KCkpID4gVXRpbGl0eS5rZXlMZXZlbCh0aGlzLmdldFRhcmdldElTT0tleSgpKSAmJg0KKwkJCQkJCQkgaXNDb250YWluZWQocG9wdWxhdGlvbkxhYmVsLmdldE5vZGUoKSwgKCgoUG9wdWxhdGlvbk1vZGVsKWQpLmdldFRhcmdldElTT0tleSgpKSkpDQorCQkJCQkge2ZvdW5kID0gdHJ1ZTticmVhazt9DQorCQkJCX0NCisJCQkJaWYoZm91bmQpIGNvbnRpbnVlOw0KKwkJCQkNCisJCQkJZmluYWwgUG9wdWxhdGlvbk1vZGVsTGFiZWwgcGwgPSBjcmVhdGVQb3B1bGF0aW9uTGFiZWwoKTsNCisJCQkJcGwuc2V0UG9wdWxhdGlvbkxhYmVsKHBvcHVsYXRpb25MYWJlbCk7IC8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgcG9wdWxhdGlvbiBsYWJlbA0KKwkJCQlwbC5zZXRQb3B1bGF0aW9uSWRlbnRpZmllcihwb3B1bGF0aW9uTGFiZWwuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSk7DQorCQkJCWdldExhYmVsc1RvVXBkYXRlKCkuYWRkKHBsKTsNCisJCQkJcG9wdWxhdGlvbkxhYmVsLmdldE5vZGUoKS5nZXRMYWJlbHMoKS5hZGQocGwpOw0KKwkJCQlwbC5zZXROb2RlKHBvcHVsYXRpb25MYWJlbC5nZXROb2RlKCkpOw0KKwkJCQlnZXRHcmFwaCgpLnB1dE5vZGVMYWJlbChwbCk7DQorCQkJfQ0KKwkJfSAvLyBmb3IgZWFjaCBwb3B1bGF0aW9uIGxhYmVsDQorDQorCQkNCisJCXJlc2V0TGFiZWxzKCk7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfSAvLyBkZWNvcmF0ZUdyYXBoDQorCQ0KKwkvKioNCisJICogU2VhcmNoIHRocm91Z2ggdGhlIGdyYXBoIGFuZCBmaW5kIGFsbCBvZiB0aGUgcG9wdWxhdGlvbiBsYWJlbHMgdGhhdCBoYXZlDQorCSAqIHRoZSBzYW1lIGlkZW50aWZpZXIuDQorCSAqIA0KKwkgKiBAcGFyYW0gcG9wdWxhdGlvbklkZW50aWZpZXINCisJICogICAgICAgICAgICB0aGUgcG9wdWxhdGlvbiBiZWluZyBsYWJlbGVkDQorCSAqIEBwYXJhbSBncmFwaA0KKwkgKiAgICAgICAgICAgIHRoZSBncmFwaCB0byBzZWFyY2gNCisJICogQHJldHVybiB0aGUgUG9wdWxhdGlvbkxhYmVsIGluc3RhbmNlcyBvZiB0aGUgZ3JhcGggdGhhdCBtYXRjaCB0aGUNCisJICogICAgICAgICBpZGVudGlmaWVyLg0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UG9wdWxhdGlvbkxhYmVsPiBnZXRQb3B1bGF0aW9uTGFiZWxzKA0KKwkJCWZpbmFsIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllciwgZmluYWwgR3JhcGggZ3JhcGgpIHsNCisJCWZpbmFsIExpc3Q8UG9wdWxhdGlvbkxhYmVsPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8UG9wdWxhdGlvbkxhYmVsPigpOw0KKw0KKwkJLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgcG9wdWxhdGlvbiBsYWJlbHMgaW4gdGhlIGdyYXBoDQorCQlFTGlzdDxOb2RlTGFiZWw+IGxhYmVscyA9IGdyYXBoLmdldE5vZGVMYWJlbHNCeVR5cGVVUkkoDQorCQkJCVBvcHVsYXRpb25MYWJlbC5VUklfVFlQRV9QT1BVTEFUSU9OX0xBQkVMKTsNCisJCWZvciAoTm9kZUxhYmVsIHBsOmxhYmVscykgew0KKwkJCWlmKGdldFRhcmdldElTT0tleSgpICE9IG51bGwgJiYgIWdldFRhcmdldElTT0tleSgpLnRyaW0oKS5lcXVhbHMoIiIpICYmIHBsLmdldE5vZGUoKSAhPSBudWxsICYmIA0KKwkJCQkJIWlzQ29udGFpbmVkKHBsLmdldE5vZGUoKSwgZ2V0VGFyZ2V0SVNPS2V5KCkpICYmDQorCQkJCQkhcGwuZ2V0Tm9kZSgpLmdldFVSSSgpLmxhc3RTZWdtZW50KCkuZXF1YWxzKCJaWloiKSkNCisJCQkJY29udGludWU7DQorCQkJDQorCQkJZmluYWwgUG9wdWxhdGlvbkxhYmVsIHBvcHVsYXRpb25MYWJlbCA9IChQb3B1bGF0aW9uTGFiZWwpIHBsOw0KKwkJCS8vIElzIHRoaXMgbGFiZWwgZm9yIHRoZSBwb3B1bGF0aW9uIHdlJ3JlIGxvb2tpbmcgZm9yPw0KKwkJCWlmIChwb3B1bGF0aW9uTGFiZWwuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKS5lcXVhbHMoDQorCQkJCQlwb3B1bGF0aW9uSWRlbnRpZmllcikpIHsNCisJCQkJLy8gWWVzDQorCQkJCS8vIElmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSAibm9kZSB1cmkiIG9mIHRoZSBwb3B1bGF0aW9uDQorCQkJCS8vIGxhYmVsIHRoZW4gaXQgd291bGQgbm90IGhhdmUgYmVlbiBhc3NvY2lhdGVkIHdpdGggYSBub2RlDQorCQkJCS8vIGluc3RhbmNlIGluIHRoZSBncmFwaCBhdCB0aGlzIHBvaW50LiBUaGlzIGlzIGEgcHJvYmxlbSBmb3INCisJCQkJLy8gZGlzZWFzZSBtb2RlbHMgdGhhdCBhcmUgdHJ5aW5nIHRvIGxhYmVsIHRoZSBub2RlICh0aGVyZSBpc24ndA0KKwkJCQkvLyBvbmUhKS4gU28gZmlsdGVyIG91dCB0aG9zZSBtaXN0YWtlcyBoZXJlLg0KKw0KKwkJCQkvLyBEb2VzIHRoZSBwb3B1bGF0aW9uIGxhYmVsIGhhdmUgYW4gYXNzb2NpYXRlZCBub2RlPw0KKwkJCQlpZiAocG9wdWxhdGlvbkxhYmVsLmdldE5vZGUoKSAhPSBudWxsKSB7DQorCQkJCQkvLyBZZXMNCisJCQkJCXJldFZhbHVlLmFkZChwb3B1bGF0aW9uTGFiZWwpOw0KKwkJCQl9IC8vIGlmIHRoZSBwb3B1bGF0aW9uIGxhYmVsIGhhcyBhIG5vZGUNCisJCQl9IC8vIGlmIHRoZSBwb3B1bGF0aW9uIHdlJ3JlIGxvb2tpbmcgZm9yDQorCQl9IC8vIGZvciBlYWNoIHBvcHVsYXRpb24gbGFiZWwNCisNCisJCXJldHVybiByZXRWYWx1ZTsNCisJfSAvLyBnZXRQb3B1bGF0aW9uTGFiZWxzDQorCQ0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbnRhaW5lZChOb2RlIG5vZGUsIFN0cmluZyB0YXJnZXRJU09LZXkpIHsNCisJCWlmKG5vZGUuZ2V0VVJJKCkubGFzdFNlZ21lbnQoKS5lcXVhbHModGFyZ2V0SVNPS2V5KSkgDQorCQkJcmV0dXJuIHRydWU7DQorCQkvLyBDaGVjayBwYXJlbnRzDQorCQlFTGlzdDxFZGdlPmVkZ2VzID0gbm9kZS5nZXRFZGdlcygpOw0KKwkJDQorCQlmb3IoRWRnZSBlOmVkZ2VzKSB7DQorCQkJaWYoZS5nZXRMYWJlbCgpIGluc3RhbmNlb2YgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsIHx8DQorCQkJCQllLmdldExhYmVsKCkgaW5zdGFuY2VvZiBQaXBlVHJhbnNwb3J0RWRnZUxhYmVsKSANCisJCQkJaWYoZS5nZXRBKCkuZXF1YWxzKG5vZGUpKSBjb250aW51ZTsNCisJCQkJZWxzZSBpZihVdGlsaXR5LmtleUxldmVsKGUuZ2V0QSgpLmdldFVSSSgpLmxhc3RTZWdtZW50KCkpIA0KKwkJCQkJCT4gVXRpbGl0eS5rZXlMZXZlbChub2RlLmdldFVSSSgpLmxhc3RTZWdtZW50KCkpKSBjb250aW51ZTsgLy8gc2tpcCBhaXIgdHJhbnNwb3J0IGVkZ2VzIHRoYXQgZ29lcyAiZG93biINCisJCQkJZWxzZSByZXR1cm4gaXNDb250YWluZWQoZS5nZXRBKCksIHRhcmdldElTT0tleSk7DQorCQl9DQorCQkNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogU2VhcmNoIHRocm91Z2ggdGhlIGdyYXBoIGFuZCBmaW5kIGFsbCBvZiB0aGUgcG9wdWxhdGlvbiBtb2RlbCBsYWJlbHMgKGkuZS4gZHluYW1pYyBvbmVzLCBub3Qgc3RhdGljKSB0aGF0IGhhdmUNCisJICogdGhlIHNhbWUgaWRlbnRpZmllci4NCisJICogDQorCSAqIEBwYXJhbSBwb3B1bGF0aW9uSWRlbnRpZmllcg0KKwkgKiAgICAgICAgICAgIHRoZSBwb3B1bGF0aW9uIGJlaW5nIGxhYmVsZWQNCisJICogQHBhcmFtIGdyYXBoDQorCSAqICAgICAgICAgICAgdGhlIGdyYXBoIHRvIHNlYXJjaA0KKwkgKiBAcmV0dXJuIHRoZSBQb3B1bGF0aW9uTGFiZWwgaW5zdGFuY2VzIG9mIHRoZSBncmFwaCB0aGF0IG1hdGNoIHRoZQ0KKwkgKiAgICAgICAgIGlkZW50aWZpZXIuDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxQb3B1bGF0aW9uTW9kZWxMYWJlbD4gZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWxzKA0KKwkJCWZpbmFsIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllciwgZmluYWwgR3JhcGggZ3JhcGgpIHsNCisJCWZpbmFsIExpc3Q8UG9wdWxhdGlvbk1vZGVsTGFiZWw+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxQb3B1bGF0aW9uTW9kZWxMYWJlbD4oKTsNCisNCisJCS8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHBvcHVsYXRpb24gbGFiZWxzIGluIHRoZSBncmFwaA0KKwkJRUxpc3Q8Tm9kZUxhYmVsPiBsYWJlbHMgPSBncmFwaC5nZXROb2RlTGFiZWxzQnlUeXBlVVJJKA0KKwkJCQlQb3B1bGF0aW9uTW9kZWxMYWJlbC5VUklfVFlQRV9EWU5BTUlDX1BPUFVMQVRJT05fTEFCRUwpOw0KKwkJZm9yIChOb2RlTGFiZWwgcGw6bGFiZWxzKSB7DQorCQkJZmluYWwgUG9wdWxhdGlvbk1vZGVsTGFiZWwgcG9wdWxhdGlvbk1vZGVsTGFiZWwgPSAoUG9wdWxhdGlvbk1vZGVsTGFiZWwpIHBsOw0KKwkJCS8vIElzIHRoaXMgbGFiZWwgZm9yIHRoZSBwb3B1bGF0aW9uIHdlJ3JlIGxvb2tpbmcgZm9yPw0KKwkJCWlmIChwb3B1bGF0aW9uTW9kZWxMYWJlbC5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpLmVxdWFscygNCisJCQkJCXBvcHVsYXRpb25JZGVudGlmaWVyKSkgew0KKwkJCSAJaWYgKHBvcHVsYXRpb25Nb2RlbExhYmVsLmdldE5vZGUoKSAhPSBudWxsKSB7DQorCQkJCQkvLyBZZXMNCisJCQkJCXJldFZhbHVlLmFkZChwb3B1bGF0aW9uTW9kZWxMYWJlbCk7DQorCQkJCX0gLy8gaWYgdGhlIHBvcHVsYXRpb24gbGFiZWwgaGFzIGEgbm9kZQ0KKwkJCX0gLy8gaWYgdGhlIHBvcHVsYXRpb24gd2UncmUgbG9va2luZyBmb3INCisJCX0gLy8gZm9yIGVhY2ggcG9wdWxhdGlvbiBsYWJlbA0KKw0KKwkJcmV0dXJuIHJldFZhbHVlOw0KKwl9IC8vIGdldFBvcHVsYXRpb25MYWJlbHMNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIA0KKwkgKiBAcmV0dXJuDQorCSAqIA0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXB1YmxpYyBhYnN0cmFjdCBQb3B1bGF0aW9uTW9kZWxMYWJlbCBjcmVhdGVQb3B1bGF0aW9uTGFiZWwoKTsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIGFic3RyYWN0IFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgY3JlYXRlUG9wdWxhdGlvbkxhYmVsVmFsdWUoKTsNCisJDQorCQ0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUjoNCisJCQkJcmV0dXJuIGdldFBvcHVsYXRpb25JZGVudGlmaWVyKCk7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9NT0RFTF9fTkFNRToNCisJCQkJcmV0dXJuIGdldE5hbWUoKTsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX01PREVMX19UQVJHRVRfSVNPX0tFWToNCisJCQkJcmV0dXJuIGdldFRhcmdldElTT0tleSgpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSOg0KKwkJCQlzZXRQb3B1bGF0aW9uSWRlbnRpZmllcigoU3RyaW5nKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fTU9ERUxfX05BTUU6DQorCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX01PREVMX19UQVJHRVRfSVNPX0tFWToNCisJCQkJc2V0VGFyZ2V0SVNPS2V5KChTdHJpbmcpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUjoNCisJCQkJc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoUE9QVUxBVElPTl9JREVOVElGSUVSX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fTU9ERUxfX05BTUU6DQorCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX01PREVMX19UQVJHRVRfSVNPX0tFWToNCisJCQkJc2V0VGFyZ2V0SVNPS2V5KFRBUkdFVF9JU09fS0VZX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSOg0KKwkJCQlyZXR1cm4gUE9QVUxBVElPTl9JREVOVElGSUVSX0VERUZBVUxUID09IG51bGwgPyBwb3B1bGF0aW9uSWRlbnRpZmllciAhPSBudWxsIDogIVBPUFVMQVRJT05fSURFTlRJRklFUl9FREVGQVVMVC5lcXVhbHMocG9wdWxhdGlvbklkZW50aWZpZXIpOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fTU9ERUxfX05BTUU6DQorCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9NT0RFTF9fVEFSR0VUX0lTT19LRVk6DQorCQkJCXJldHVybiBUQVJHRVRfSVNPX0tFWV9FREVGQVVMVCA9PSBudWxsID8gdGFyZ2V0SVNPS2V5ICE9IG51bGwgOiAhVEFSR0VUX0lTT19LRVlfRURFRkFVTFQuZXF1YWxzKHRhcmdldElTT0tleSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCisNCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KKwkJcmVzdWx0LmFwcGVuZCgiIChwb3B1bGF0aW9uSWRlbnRpZmllcjogIik7DQorCQlyZXN1bHQuYXBwZW5kKHBvcHVsYXRpb25JZGVudGlmaWVyKTsNCisJCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7DQorCQlyZXN1bHQuYXBwZW5kKG5hbWUpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCB0YXJnZXRJU09LZXk6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZCh0YXJnZXRJU09LZXkpOw0KKwkJcmVzdWx0LmFwcGVuZCgnKScpOw0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKwl9DQorDQorfSAvL1BvcHVsYXRpb25Nb2RlbEltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL1BvcHVsYXRpb25Nb2RlbExhYmVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvaW1wbC9Qb3B1bGF0aW9uTW9kZWxMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjBlNDdjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvaW1wbC9Qb3B1bGF0aW9uTW9kZWxMYWJlbEltcGwuamF2YQpAQCAtMCwwICsxLDIzMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuRHluYW1pY05vZGVMYWJlbEltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcHVsYXRpb24gTW9kZWwgTGFiZWw8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuUG9wdWxhdGlvbk1vZGVsTGFiZWxJbXBsI2dldFBvcHVsYXRpb25MYWJlbCA8ZW0+UG9wdWxhdGlvbiBMYWJlbDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlBvcHVsYXRpb25Nb2RlbExhYmVsSW1wbCNnZXRQb3B1bGF0aW9uSWRlbnRpZmllciA8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUG9wdWxhdGlvbk1vZGVsTGFiZWxJbXBsIGV4dGVuZHMgRHluYW1pY05vZGVMYWJlbEltcGwgaW1wbGVtZW50cyBQb3B1bGF0aW9uTW9kZWxMYWJlbCB7DQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3B1bGF0aW9uTGFiZWwoKSA8ZW0+UG9wdWxhdGlvbiBMYWJlbDwvZW0+fScgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0UG9wdWxhdGlvbkxhYmVsKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFBvcHVsYXRpb25MYWJlbCBwb3B1bGF0aW9uTGFiZWw7DQorDQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSA8ZW0+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUFVMQVRJT05fSURFTlRJRklFUl9FREVGQVVMVCA9IG51bGw7DQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpIDxlbT5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFBvcHVsYXRpb25JZGVudGlmaWVyKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllciA9IFBPUFVMQVRJT05fSURFTlRJRklFUl9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgUG9wdWxhdGlvbk1vZGVsTGFiZWxJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuUE9QVUxBVElPTl9NT0RFTF9MQUJFTDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQb3B1bGF0aW9uTGFiZWwgZ2V0UG9wdWxhdGlvbkxhYmVsKCkgew0KKwkJaWYgKHBvcHVsYXRpb25MYWJlbCAhPSBudWxsICYmIHBvcHVsYXRpb25MYWJlbC5lSXNQcm94eSgpKSB7DQorCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFBvcHVsYXRpb25MYWJlbCA9IChJbnRlcm5hbEVPYmplY3QpcG9wdWxhdGlvbkxhYmVsOw0KKwkJCXBvcHVsYXRpb25MYWJlbCA9IChQb3B1bGF0aW9uTGFiZWwpZVJlc29sdmVQcm94eShvbGRQb3B1bGF0aW9uTGFiZWwpOw0KKwkJCWlmIChwb3B1bGF0aW9uTGFiZWwgIT0gb2xkUG9wdWxhdGlvbkxhYmVsKSB7DQorCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9MQUJFTCwgb2xkUG9wdWxhdGlvbkxhYmVsLCBwb3B1bGF0aW9uTGFiZWwpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcG9wdWxhdGlvbkxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBvcHVsYXRpb25MYWJlbCBiYXNpY0dldFBvcHVsYXRpb25MYWJlbCgpIHsNCisJCXJldHVybiBwb3B1bGF0aW9uTGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRQb3B1bGF0aW9uTGFiZWwoUG9wdWxhdGlvbkxhYmVsIG5ld1BvcHVsYXRpb25MYWJlbCkgew0KKwkJUG9wdWxhdGlvbkxhYmVsIG9sZFBvcHVsYXRpb25MYWJlbCA9IHBvcHVsYXRpb25MYWJlbDsNCisJCXBvcHVsYXRpb25MYWJlbCA9IG5ld1BvcHVsYXRpb25MYWJlbDsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9MQUJFTCwgb2xkUG9wdWxhdGlvbkxhYmVsLCBwb3B1bGF0aW9uTGFiZWwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSB7DQorCQlyZXR1cm4gcG9wdWxhdGlvbklkZW50aWZpZXI7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRQb3B1bGF0aW9uSWRlbnRpZmllcihTdHJpbmcgbmV3UG9wdWxhdGlvbklkZW50aWZpZXIpIHsNCisJCVN0cmluZyBvbGRQb3B1bGF0aW9uSWRlbnRpZmllciA9IHBvcHVsYXRpb25JZGVudGlmaWVyOw0KKwkJcG9wdWxhdGlvbklkZW50aWZpZXIgPSBuZXdQb3B1bGF0aW9uSWRlbnRpZmllcjsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSLCBvbGRQb3B1bGF0aW9uSWRlbnRpZmllciwgcG9wdWxhdGlvbklkZW50aWZpZXIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fTU9ERUxfTEFCRUxfX1BPUFVMQVRJT05fTEFCRUw6DQorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UG9wdWxhdGlvbkxhYmVsKCk7DQorCQkJCXJldHVybiBiYXNpY0dldFBvcHVsYXRpb25MYWJlbCgpOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fTU9ERUxfTEFCRUxfX1BPUFVMQVRJT05fSURFTlRJRklFUjoNCisJCQkJcmV0dXJuIGdldFBvcHVsYXRpb25JZGVudGlmaWVyKCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX0xBQkVMOg0KKwkJCQlzZXRQb3B1bGF0aW9uTGFiZWwoKFBvcHVsYXRpb25MYWJlbCluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX0lERU5USUZJRVI6DQorCQkJCXNldFBvcHVsYXRpb25JZGVudGlmaWVyKChTdHJpbmcpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fTU9ERUxfTEFCRUxfX1BPUFVMQVRJT05fTEFCRUw6DQorCQkJCXNldFBvcHVsYXRpb25MYWJlbCgoUG9wdWxhdGlvbkxhYmVsKW51bGwpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSOg0KKwkJCQlzZXRQb3B1bGF0aW9uSWRlbnRpZmllcihQT1BVTEFUSU9OX0lERU5USUZJRVJfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX0xBQkVMOg0KKwkJCQlyZXR1cm4gcG9wdWxhdGlvbkxhYmVsICE9IG51bGw7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSOg0KKwkJCQlyZXR1cm4gUE9QVUxBVElPTl9JREVOVElGSUVSX0VERUZBVUxUID09IG51bGwgPyBwb3B1bGF0aW9uSWRlbnRpZmllciAhPSBudWxsIDogIVBPUFVMQVRJT05fSURFTlRJRklFUl9FREVGQVVMVC5lcXVhbHMocG9wdWxhdGlvbklkZW50aWZpZXIpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOw0KKw0KKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoDQorCQkJCXBvcHVsYXRpb25JZGVudGlmaWVyID09IG51bGwgPyAibnVsbCIgOiBwb3B1bGF0aW9uSWRlbnRpZmllcik7DQorCQlyZXN1bHQuYXBwZW5kKCIgWyIpOw0KKwkJcmVzdWx0LmFwcGVuZChNYXRoLmZsb29yKCgoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKWdldEN1cnJlbnRWYWx1ZSgpKS5nZXRDb3VudCgpKSk7DQorCQlyZXN1bHQuYXBwZW5kKCJdIik7DQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQorCX0NCisNCit9IC8vUG9wdWxhdGlvbk1vZGVsTGFiZWxJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvaW1wbC9Qb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvaW1wbC9Qb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZDI2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL1BvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJbXBsLmphdmEKQEAgLTAsMCArMSw0OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxWYWx1ZUltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcHVsYXRpb24gTW9kZWwgTGFiZWwgVmFsdWU8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUltcGwgZXh0ZW5kcyBMYWJlbFZhbHVlSW1wbCBpbXBsZW1lbnRzIFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgew0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQorCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlBPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUU7DQorCX0NCisNCit9IC8vUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL1NlYXNvbmFsUG9wdWxhdGlvbk1vZGVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvaW1wbC9TZWFzb25hbFBvcHVsYXRpb25Nb2RlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTFmZTA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvaW1wbC9TZWFzb25hbFBvcHVsYXRpb25Nb2RlbEltcGwuamF2YQpAQCAtMCwwICsxLDQ5MSBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsOworCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LmNlbnRlcnMuR2VvZ3JhcGhpY0NlbnRlcnM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5pbXBsLlJlZ2lvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2Vhc29uYWwgUG9wdWxhdGlvbiBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxJbXBsI2dldFBoYXNlIDxlbT5QaGFzZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxJbXBsI2dldE1vZHVsYXRpb25BbXBsaXR1ZGUgPGVtPk1vZHVsYXRpb24gQW1wbGl0dWRlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TZWFzb25hbFBvcHVsYXRpb25Nb2RlbEltcGwjZ2V0UGVyaW9kIDxlbT5QZXJpb2Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsSW1wbCNpc1VzZUxhdGl0dWRlIDxlbT5Vc2UgTGF0aXR1ZGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTZWFzb25hbFBvcHVsYXRpb25Nb2RlbEltcGwgZXh0ZW5kcyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGwgaW1wbGVtZW50cyBTZWFzb25hbFBvcHVsYXRpb25Nb2RlbCB7CisJCisJCisJCisJLyoqCisJICogY29uc3RhbnQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgTUlMTElTX1BFUl9EQVkgPSAxMDAwLjAqNjAuMCo2MC4wKjI0LjA7CisJCisJLyoqCisJICogdG9kbyBtb2RlbCB0aGlzIGluIGVtZgorCSAqLworCXByb3RlY3RlZCBkb3VibGUgc2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQgPSAyLjA7CisJCisJLyoqCisJICogdGhlIGVxdWF0b3IKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgRVFVQVRPUl9MQVRJVFVERSA9IDAuMDsKKwkKKwkvKioKKwkgKiBUT0RPIG1vZGVsIHRoaXMgaW4gRU1GCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBUUk9QSUNBTF9PTkxZID0gdHJ1ZTsKKwkKKwkvKioKKwkgKiBMYXRpdHVkZSBvZiB0aGUgVHJvcGljIG9mIENhbmNlciBpbiBEZWdyZWVzIChUcm9waWMgb2YgQ2Fwcmljb3JuIGlzIC12ZSBvZiB0aGlzKS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBUUk9QSUNfT0ZfQ0FOQ0VSX0xBVElUVURFID0gMjMuNDM5NDQ0OworCisKKwkvKioKKwkgKiBUT0RPIG1vZGVsIHRoaXMgaW4gRU1GCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIExBVElUVURFX1NJR01PSURfV0lEVEggPSA0LjU7CisJCisJCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBoYXNlKCkgPGVtPlBoYXNlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQaGFzZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgUEhBU0VfRURFRkFVTFQgPSAwLjA7IC8vIFRPRE8gVGhlIGRlZmF1bHQgdmFsdWUgbGl0ZXJhbCAiIiBpcyBub3QgdmFsaWQuCisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaGFzZSgpIDxlbT5QaGFzZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGhhc2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgcGhhc2UgPSBQSEFTRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNb2R1bGF0aW9uQW1wbGl0dWRlKCkgPGVtPk1vZHVsYXRpb24gQW1wbGl0dWRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNb2R1bGF0aW9uQW1wbGl0dWRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBNT0RVTEFUSU9OX0FNUExJVFVERV9FREVGQVVMVCA9IDEuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vZHVsYXRpb25BbXBsaXR1ZGUoKSA8ZW0+TW9kdWxhdGlvbiBBbXBsaXR1ZGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vZHVsYXRpb25BbXBsaXR1ZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgbW9kdWxhdGlvbkFtcGxpdHVkZSA9IE1PRFVMQVRJT05fQU1QTElUVURFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmlvZCgpIDxlbT5QZXJpb2Q8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBlcmlvZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgUEVSSU9EX0VERUZBVUxUID0gMzY1LjI1OworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmlvZCgpIDxlbT5QZXJpb2Q8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBlcmlvZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBwZXJpb2QgPSBQRVJJT0RfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXNlTGF0aXR1ZGUoKSA8ZW0+VXNlIExhdGl0dWRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1VzZUxhdGl0dWRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFX0xBVElUVURFX0VERUZBVUxUID0gdHJ1ZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXNlTGF0aXR1ZGUoKSA8ZW0+VXNlIExhdGl0dWRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1VzZUxhdGl0dWRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMYXRpdHVkZSA9IFVTRV9MQVRJVFVERV9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb21wdXRlIHRoZSBjaGFuZ2VzIGluIHRoZSBwb3B1bGF0aW9uIAorCSAqIFRoZSBiaXJ0aCByYXRlIGFuZCBkZWF0aCByYXRlcyBhcmUgbW9kaWZpZWQgaW4gZWFjaCB0aW1lIHN0ZXAgYnkgYSBzZWFzb25hbCBtb2R1bGF0aW9uIGZ1bmN0aW9uCisJICogVGhlIGJpcnRoL2RlYXRoIHJhdGVzIGFyZSBOT1QgY29uc3RhbnQKKwkgKiBAcGFyYW0gdGltZQorCSAqIEBwYXJhbSB0aW1lRGVsdGEKKwkgKiBAcGFyYW0gbGFiZWxzCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjYWxjdWxhdGVEZWx0YShTVEVNVGltZSB0aW1lLCBsb25nIHRpbWVEZWx0YSwKKwkJCUVMaXN0PER5bmFtaWNMYWJlbD4gbGFiZWxzKSB7CisJCS8vIFdlIHNpbXBseSBjYWxjdWxhdGUgdGhlIGNoYW5nZSBmcm9tIHRoZSBiaXJ0aC9kZWF0aCByYXRlCisJCS8vIGFkanVzdGVkIGZvciB0aGUgdGltZSBwZXJpb2QgdXNlZCBpbiB0aGUgc2ltdWxhdGlvbgorCQkKKwkJCisJCWZpbmFsIGRvdWJsZSBhZGp1c3RlZEJpcnRoUmF0ZSA9IGFkanVzdFJhdGUodGhpcy5nZXRCaXJ0aFJhdGUoKSwgdGhpcy5nZXRUaW1lUGVyaW9kKCksIHRpbWVEZWx0YSk7CisJCWZpbmFsIGRvdWJsZSBhZGp1c3RlZERlYXRoUmF0ZSA9IGFkanVzdFJhdGUodGhpcy5nZXREZWF0aFJhdGUoKSwgdGhpcy5nZXRUaW1lUGVyaW9kKCksIHRpbWVEZWx0YSk7CisJCWRvdWJsZSBsb2NhbFBoYXNlID0gcGhhc2U7CisJCWZvcihEeW5hbWljTGFiZWwgbGFiZWw6bGFiZWxzKSB7CisJCQkKKwkJCVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxJbXBsIHNsYWJlbCA9IChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsSW1wbClsYWJlbDsKKwkJCVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUltcGwgZGVsdGEgPSAoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSW1wbClzbGFiZWwuZ2V0RGVsdGFWYWx1ZSgpOworCQkJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIGN1cnJlbnQgPSBzbGFiZWwuZ2V0UHJvYmVWYWx1ZSgpOworCQkJZG91YmxlIHNlYXNvbmFsQmlydGhGYWN0b3IgID0gMC4wOworCQkJZG91YmxlIGN1cnJlbnRQb3B1bGF0aW9uID0gY3VycmVudC5nZXRDb3VudCgpOworCQkJLy8gbmVlZCB0byBmaW5kIHRoZSBsYXRpdHVkZSBvZiB0aGlzIG5vZGUKKwkJCS8vIGRlZmF1bHQKKwkJCWRvdWJsZSBsYXRpdHVkZSA9IEVRVUFUT1JfTEFUSVRVREU7CisJCQlkb3VibGUgY3VycmVudE1pbGxpcyA9IHRpbWUuZ2V0VGltZSgpLmdldFRpbWUoKTsKKwkJCWRvdWJsZSBsYXRGYWN0b3IgPSAxLjA7IC8vIGRlZmF1bHQgPSBubyBkZXBlbmRlbmNlCisJCQlsb2NhbFBoYXNlID0gcGhhc2U7CisJCQlpZih1c2VMYXRpdHVkZSkgeworCQkJCS8vIGNlbnRlciBjb29yZHMKKwkJCQlkb3VibGVbXSBsYXRfbG9uZyA9IG51bGw7CisJCQkJCisJCQkJLy8gR2V0IFRISVMgbm9kZQorCQkJCU5vZGUgbm9kZSA9IHNsYWJlbC5nZXROb2RlKCk7CisJCQkJaWYobm9kZSBpbnN0YW5jZW9mIFJlZ2lvbkltcGwpIHsKKwkJCQkJU3RyaW5nIG5vZGVVUkkgPSBub2RlLmdldFVSSSgpLmxhc3RTZWdtZW50KCk7CisJCQkJCWxhdF9sb25nID0gR2VvZ3JhcGhpY0NlbnRlcnMuZ2V0Q2VudGVyKG5vZGVVUkkpOworCQkJCQkvLyBzdGlsbCBudWxsPyBDb21wdXRlIGl0CisJCQkJCWlmKGxhdF9sb25nPT1udWxsKSB7CisJCQkJCQkvLyBHZXQgdGhlIGxhdC9sb25nIG9mIHRoZSBjZW50ZXIgb2YgdGhlIG5vZGUKKwkJCQkJCWZpbmFsIExhdExvbmdQcm92aWRlckFkYXB0ZXIgbGF0TG9uZ1Byb3ZpZGVyQiA9IChMYXRMb25nUHJvdmlkZXJBZGFwdGVyKSBMYXRMb25nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkJCQkuYWRhcHQobm9kZSwgTGF0TG9uZ1Byb3ZpZGVyLmNsYXNzKTsKKwkJCQkJCWxhdExvbmdQcm92aWRlckIuc2V0VGFyZ2V0KG5vZGUpOworCQkJCQkJbGF0X2xvbmcgPSBsYXRMb25nUHJvdmlkZXJCLmdldENlbnRlcigpOworCQkJCQl9CisJCQkJCWlmIChsYXRfbG9uZyA9PSBudWxsKSB7CisJCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkNhbm5vdCBmaW5kIGxhdGl0dWRlIGZvciAiKyBub2RlVVJJLCBudWxsKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWxhdF9sb25nID0gbmV3IGRvdWJsZVsyXTsKKwkJCQkJbGF0X2xvbmdbMF0gPSBFUVVBVE9SX0xBVElUVURFOworCQkJCQlsYXRfbG9uZ1sxXSA9IEVRVUFUT1JfTEFUSVRVREU7IC8vIG5vdCB1c2VkLiBzZXRzIGl0IHRvIDAsMAorCQkJCX0KKworCQkJCS8vIGdldCB0aGUgbGF0aXR1ZGUKKwkJCQlpZihsYXRfbG9uZyAhPSBudWxsKSB7CisJCQkJCWxhdGl0dWRlID0gbGF0X2xvbmdbMF0gOworCQkJCX0gCisJCQkJLy8gaW4gYSBsYXRpdHVkZSBkZXBlbmRlbnQgbW9kZWwsIHRoZXJlIGlzIG5vIG1vZHVsYXRpb24gaW4gdGhlIHRvcGljcy4KKwkJCQkvLyBBcyB3ZSBtb3ZlIGF3YXkgZnJvbSB0aGUgZXF1YXRvciwgdGhlIG1vZHVsYXRpb24gYW1wbGl0dWRlIGluY3JlYXNlcyB0byBpdCdzIG1heGltYWwgdmFsdWUKKwkJCQkvLyBhbmQgdGhlIGNvbnN0YW50IGZsb29yIGRlY3JlYXNlcyB0byBpdCdzIG1pbmltdW0gdmFsdWUKKwkJCQkvLyBiYXNlZCBvbiBhIGxvZ2lzdGljIChzaWdtb2lkYWwpIGZ1bmN0aW9uCisJCQkJbGF0RmFjdG9yICA9IDEuMC8oMS4wICsgTWF0aC5leHAoKFRST1BJQ19PRl9DQU5DRVJfTEFUSVRVREUgLSBNYXRoLmFicyhsYXRpdHVkZSkpL0xBVElUVURFX1NJR01PSURfV0lEVEgpICk7CisJCQkJLy8gc2Vhc29ucyByZXZlcnNlIGluIHRoZSBzb3V0aGVybiBoZW1pc3BoZXJlCisJCQkJaWYobGF0aXR1ZGUgPD0gMC4wKSBsb2NhbFBoYXNlID0gcGhhc2UrTWF0aC5QSTsKKwkJCX0gLy9pZiB1c2VMYXRpdHVkZQorCQkJCisJCQlkb3VibGUgbW9kdWxhdGlvbiA9IG1vZHVsYXRpb25BbXBsaXR1ZGUqbGF0RmFjdG9yOworCQkJZG91YmxlIGZsb29yID0gKDEuMC1tb2R1bGF0aW9uKTsKKwkJCQkKKwkJCWRvdWJsZSBtb2R1bGF0aW9uUGVyaW9kID0gcGVyaW9kOyAKKwkJCWRvdWJsZSBvc2NDb3MgPSBNYXRoLmNvcyhsb2NhbFBoYXNlICsgMi4wKk1hdGguUEkqY3VycmVudE1pbGxpcy8obW9kdWxhdGlvblBlcmlvZCpNSUxMSVNfUEVSX0RBWSkgKTsgLy8gMT09Pi0xIGNvc2luZQorCQkJLy8gIGluaXQgZGVmYXVsdCAocGhhc2UgMCkgIHNlYXNvbmFsQmlydGhGYWN0b3IgIGlzIDAuMCBpbiB3aW50ZXIuIHJhbmdlIGlzIDAtPjEuMAorCQkJc2Vhc29uYWxCaXJ0aEZhY3RvciA9ICAoMS4wKygtMS4wKm9zY0NvcykpLzIuMDsKKwkJCS8vIG5vdyBzY2FsZSBpdAorCQkJc2Vhc29uYWxCaXJ0aEZhY3RvciAgKj0gbW9kdWxhdGlvbiA7CisJCQlkb3VibGUgb3NjQmlydGhSYXRlID0gYWRqdXN0ZWRCaXJ0aFJhdGUgKiBNYXRoLmFicyhzZWFzb25hbEJpcnRoRmFjdG9yKTsKKwkJCS8vIGFkZCB0aGUgYmFzZSByYXRlcworCQkJb3NjQmlydGhSYXRlICs9IChmbG9vciphZGp1c3RlZEJpcnRoUmF0ZSk7CisJCQkKKwkJCWlmKFRST1BJQ0FMX09OTFkpIHsKKwkJCQlvc2NCaXJ0aFJhdGUgKj0gZ2V0VHJvcGljYWxFbnZlbG9wZShsYXRpdHVkZSwgKDIqVFJPUElDX09GX0NBTkNFUl9MQVRJVFVERSkpOworCQkJfQorCQkJLy8gb25seSBtb2R1bGF0ZSB0aGUgYmlydGggcmF0ZS4KKwkJCWRvdWJsZSBiaXJ0aHMgPSBjdXJyZW50UG9wdWxhdGlvbiAqIG9zY0JpcnRoUmF0ZTsKKwkJCS8vIHdlIGRvbid0IG1vZHVsYXRlIHRoZSBkZWF0aCByYXRlIChpbnNlY3QgbGlmZSBleHBlY3RhbmN5CisJCQlkb3VibGUgZGVhdGhzID0gY3VycmVudFBvcHVsYXRpb24gKiBhZGp1c3RlZERlYXRoUmF0ZTsKKwkJCWN1cnJlbnRQb3B1bGF0aW9uICs9IGJpcnRoczsKKwkJCWN1cnJlbnRQb3B1bGF0aW9uIC09IGRlYXRoczsKKwkJCQorCQkJZGVsdGEuc2V0SW5jaWRlbmNlKGJpcnRocy1kZWF0aHMpOworCQkJZGVsdGEuc2V0Q291bnQoYmlydGhzLWRlYXRocyk7CisJCQlkZWx0YS5zZXRCaXJ0aHMoYmlydGhzKTsKKwkJCWRlbHRhLnNldERlYXRocyhkZWF0aHMpOworCQkJCisJCQlpZihkZWx0YS5nZXRBcnJpdmFscygpID09IG51bGwpIGRlbHRhLnNldEFycml2YWxzKG5ldyBIYXNoTWFwPE5vZGUsRG91YmxlPigpKTsKKwkJCWlmKGRlbHRhLmdldERlcGFydHVyZXMoKSA9PSBudWxsKSBkZWx0YS5zZXREZXBhcnR1cmVzKG5ldyBIYXNoTWFwPE5vZGUsRG91YmxlPigpKTsKKwkJCQorCQkJZGVsdGEuZ2V0QXJyaXZhbHMoKS5wdXQoKE5vZGUpbGFiZWwuZ2V0SWRlbnRpZmlhYmxlKCksIGJpcnRocyk7CisJCQlkZWx0YS5nZXREZXBhcnR1cmVzKCkucHV0KChOb2RlKWxhYmVsLmdldElkZW50aWZpYWJsZSgpLCBkZWF0aHMpOworCQkJCisJCQloYW5kbGVNaWdyYXRpb24oc2xhYmVsLCBkZWx0YS5nZXRBcnJpdmFscygpLGRlbHRhLmdldERlcGFydHVyZXMoKSwgdGhpcy5nZXRUaW1lUGVyaW9kKCksIHRpbWVEZWx0YSwgZGVsdGEpOworCQkJaGFuZGxlUGlwZVRyYW5zcG9ydChzbGFiZWwsIGRlbHRhLmdldEFycml2YWxzKCksZGVsdGEuZ2V0RGVwYXJ0dXJlcygpLCB0aW1lRGVsdGEsIGRlbHRhKTsKKwkJfQorCX0vLyBjYWxjdWxhdGVEZWx0YQorCQorCS8qKgorCSAqIEVudmVsb3BlIGZ1bmN0aW9uIHRoYXQgYm91bmRzIG1vc3F1aXRvIHBvcHVsYXRpb24gdG8gdHJvcGljYWwgYmFuZAorCSAqIEZ1bmN0aW9uIGlzID09MS4wIGF0IGVxdWF0b3IgKGNlbnRlcmVkIGFib3V0IGVxdWF0b3IpCisJICogQHBhcmFtIGxhdAorCSAqIEBwYXJhbSBzZ2ltYSBpcyB0aGUgd2lkdGgKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBkb3VibGUgZ2V0VHJvcGljYWxFbnZlbG9wZShkb3VibGUgbGF0LCBkb3VibGUgc2lnbWEpIHsKKwkJZG91YmxlIGV4cCA9IC0oKGxhdCpsYXQpLygyLjAqc2lnbWEqc2lnbWEpKTsKKwkJcmV0dXJuIE1hdGguZXhwKGV4cCk7CisJfQorCQorCS8qKgorCSAqIFV0aWxpdHkgZnVuY3Rpb24KKwkgKiBAcGFyYW0geAorCSAqIEBwYXJhbSBtdSBtZWFuCisJICogQHBhcmFtIHNpZ21hIHdpZHRoCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgZG91YmxlIGdldEdhdXNpYW5Vbm5vcm1hbGl6ZShkb3VibGUgeCwgZG91YmxlIG11LCBkb3VibGUgc2lnbWEpIHsKKwkJZG91YmxlIGV4cCA9IC0oKCh4LW11KSooeC1tdSkpLygyLjAqc2lnbWEqc2lnbWEpKTsKKwkJcmV0dXJuIE1hdGguZXhwKGV4cCk7CisJfQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TRUFTT05BTF9QT1BVTEFUSU9OX01PREVMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0UGhhc2UoKSB7CisJCXJldHVybiBwaGFzZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQaGFzZShkb3VibGUgbmV3UGhhc2UpIHsKKwkJZG91YmxlIG9sZFBoYXNlID0gcGhhc2U7CisJCXBoYXNlID0gbmV3UGhhc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5TRUFTT05BTF9QT1BVTEFUSU9OX01PREVMX19QSEFTRSwgb2xkUGhhc2UsIHBoYXNlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRNb2R1bGF0aW9uQW1wbGl0dWRlKCkgeworCQlyZXR1cm4gbW9kdWxhdGlvbkFtcGxpdHVkZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNb2R1bGF0aW9uQW1wbGl0dWRlKGRvdWJsZSBuZXdNb2R1bGF0aW9uQW1wbGl0dWRlKSB7CisJCWRvdWJsZSBvbGRNb2R1bGF0aW9uQW1wbGl0dWRlID0gbW9kdWxhdGlvbkFtcGxpdHVkZTsKKwkJbW9kdWxhdGlvbkFtcGxpdHVkZSA9IG5ld01vZHVsYXRpb25BbXBsaXR1ZGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5TRUFTT05BTF9QT1BVTEFUSU9OX01PREVMX19NT0RVTEFUSU9OX0FNUExJVFVERSwgb2xkTW9kdWxhdGlvbkFtcGxpdHVkZSwgbW9kdWxhdGlvbkFtcGxpdHVkZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0UGVyaW9kKCkgeworCQlyZXR1cm4gcGVyaW9kOworCX0KKworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNVc2VMYXRpdHVkZSgpIHsKKwkJcmV0dXJuIHVzZUxhdGl0dWRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFVzZUxhdGl0dWRlKGJvb2xlYW4gbmV3VXNlTGF0aXR1ZGUpIHsKKwkJYm9vbGVhbiBvbGRVc2VMYXRpdHVkZSA9IHVzZUxhdGl0dWRlOworCQl1c2VMYXRpdHVkZSA9IG5ld1VzZUxhdGl0dWRlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTF9fVVNFX0xBVElUVURFLCBvbGRVc2VMYXRpdHVkZSwgdXNlTGF0aXR1ZGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUFTT05BTF9QT1BVTEFUSU9OX01PREVMX19QSEFTRToKKwkJCQlyZXR1cm4gZ2V0UGhhc2UoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX01PRFVMQVRJT05fQU1QTElUVURFOgorCQkJCXJldHVybiBnZXRNb2R1bGF0aW9uQW1wbGl0dWRlKCk7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUFTT05BTF9QT1BVTEFUSU9OX01PREVMX19QRVJJT0Q6CisJCQkJcmV0dXJuIGdldFBlcmlvZCgpOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTF9fVVNFX0xBVElUVURFOgorCQkJCXJldHVybiBpc1VzZUxhdGl0dWRlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX1BIQVNFOgorCQkJCXNldFBoYXNlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX01PRFVMQVRJT05fQU1QTElUVURFOgorCQkJCXNldE1vZHVsYXRpb25BbXBsaXR1ZGUoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTF9fVVNFX0xBVElUVURFOgorCQkJCXNldFVzZUxhdGl0dWRlKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTF9fUEhBU0U6CisJCQkJc2V0UGhhc2UoUEhBU0VfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX01PRFVMQVRJT05fQU1QTElUVURFOgorCQkJCXNldE1vZHVsYXRpb25BbXBsaXR1ZGUoTU9EVUxBVElPTl9BTVBMSVRVREVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX1VTRV9MQVRJVFVERToKKwkJCQlzZXRVc2VMYXRpdHVkZShVU0VfTEFUSVRVREVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTF9fUEhBU0U6CisJCQkJcmV0dXJuIHBoYXNlICE9IFBIQVNFX0VERUZBVUxUOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTF9fTU9EVUxBVElPTl9BTVBMSVRVREU6CisJCQkJcmV0dXJuIG1vZHVsYXRpb25BbXBsaXR1ZGUgIT0gTU9EVUxBVElPTl9BTVBMSVRVREVfRURFRkFVTFQ7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUFTT05BTF9QT1BVTEFUSU9OX01PREVMX19QRVJJT0Q6CisJCQkJcmV0dXJuIHBlcmlvZCAhPSBQRVJJT0RfRURFRkFVTFQ7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUFTT05BTF9QT1BVTEFUSU9OX01PREVMX19VU0VfTEFUSVRVREU6CisJCQkJcmV0dXJuIHVzZUxhdGl0dWRlICE9IFVTRV9MQVRJVFVERV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHBoYXNlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChwaGFzZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbW9kdWxhdGlvbkFtcGxpdHVkZTogIik7CisJCXJlc3VsdC5hcHBlbmQobW9kdWxhdGlvbkFtcGxpdHVkZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgcGVyaW9kOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChwZXJpb2QpOworCQlyZXN1bHQuYXBwZW5kKCIsIHVzZUxhdGl0dWRlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCh1c2VMYXRpdHVkZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1NlYXNvbmFsUG9wdWxhdGlvbk1vZGVsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvaW1wbC9TdGFuZGFyZEZhY3RvcnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL1N0YW5kYXJkRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGFjZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvaW1wbC9TdGFuZGFyZEZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSwyMjQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGw7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLio7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5EZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Hcm91cDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Jbml0aWFsaXplcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWw7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTdGFuZGFyZEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgU3RhbmRhcmRGYWN0b3J5IHsNCisJLyoqDQorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RhbmRhcmRGYWN0b3J5IGluaXQoKSB7DQorCQl0cnkgew0KKwkJCVN0YW5kYXJkRmFjdG9yeSB0aGVTdGFuZGFyZEZhY3RvcnkgPSAoU3RhbmRhcmRGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZCIpOyANCisJCQlpZiAodGhlU3RhbmRhcmRGYWN0b3J5ICE9IG51bGwpIHsNCisJCQkJcmV0dXJuIHRoZVN0YW5kYXJkRmFjdG9yeTsNCisJCQl9DQorCQl9DQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJfQ0KKwkJcmV0dXJuIG5ldyBTdGFuZGFyZEZhY3RvcnlJbXBsKCk7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RhbmRhcmRGYWN0b3J5SW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsNCisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTDogcmV0dXJuIGNyZWF0ZVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKCk7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9NT0RFTF9MQUJFTDogcmV0dXJuIGNyZWF0ZVBvcHVsYXRpb25Nb2RlbExhYmVsKCk7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTDogcmV0dXJuIGNyZWF0ZVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwoKTsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFOiByZXR1cm4gY3JlYXRlUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSgpOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUU6IHJldHVybiBjcmVhdGVTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUoKTsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX1NUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUw6IHJldHVybiBjcmVhdGVTdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwoKTsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ERU1PR1JBUEhJQ19QT1BVTEFUSU9OX01PREVMOiByZXR1cm4gY3JlYXRlRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwoKTsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX0dST1VQOiByZXR1cm4gY3JlYXRlUG9wdWxhdGlvbkdyb3VwKCk7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9JTklUSUFMSVpFUjogcmV0dXJuIGNyZWF0ZVN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyKCk7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTDogcmV0dXJuIGNyZWF0ZVNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsKCk7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuWUVUSV9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSOiByZXR1cm4gY3JlYXRlWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplcigpOw0KKwkJCWRlZmF1bHQ6DQorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwgY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwoKSB7DQorCQlTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGwgc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwgPSBuZXcgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJbXBsKCk7DQorCQlyZXR1cm4gc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWw7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUG9wdWxhdGlvbk1vZGVsTGFiZWwgY3JlYXRlUG9wdWxhdGlvbk1vZGVsTGFiZWwoKSB7DQorCQlQb3B1bGF0aW9uTW9kZWxMYWJlbEltcGwgcG9wdWxhdGlvbk1vZGVsTGFiZWwgPSBuZXcgUG9wdWxhdGlvbk1vZGVsTGFiZWxJbXBsKCk7DQorCQlyZXR1cm4gcG9wdWxhdGlvbk1vZGVsTGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCBjcmVhdGVTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsKCkgew0KKwkJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEltcGwgc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCA9IG5ldyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsSW1wbCgpOw0KKwkJcmV0dXJuIHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBjcmVhdGVQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKCkgew0KKwkJUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUltcGwgcG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSA9IG5ldyBQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSW1wbCgpOw0KKwkJcmV0dXJuIHBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWU7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIGNyZWF0ZVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSgpIHsNCisJCVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUltcGwgc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlID0gbmV3IFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUltcGwoKTsNCisJCXJldHVybiBzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWU7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsIGNyZWF0ZVN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCgpIHsNCisJCVN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGwgc3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsID0gbmV3IFN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGwoKTsNCisJCXJldHVybiBzdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWw7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwgY3JlYXRlRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwoKSB7DQorCQlEZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbEltcGwgZGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwgPSBuZXcgRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxJbXBsKCk7DQorCQlyZXR1cm4gZGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWw7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUG9wdWxhdGlvbkdyb3VwIGNyZWF0ZVBvcHVsYXRpb25Hcm91cCgpIHsNCisJCVBvcHVsYXRpb25Hcm91cEltcGwgcG9wdWxhdGlvbkdyb3VwID0gbmV3IFBvcHVsYXRpb25Hcm91cEltcGwoKTsNCisJCXJldHVybiBwb3B1bGF0aW9uR3JvdXA7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIgY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKSB7DQorCQlTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplckltcGwgc3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIgPSBuZXcgU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJbXBsKCk7DQorCQlyZXR1cm4gc3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXI7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwgY3JlYXRlU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwoKSB7DQorCQlTZWFzb25hbFBvcHVsYXRpb25Nb2RlbEltcGwgc2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwgPSBuZXcgU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxJbXBsKCk7DQorCQlyZXR1cm4gc2Vhc29uYWxQb3B1bGF0aW9uTW9kZWw7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplciBjcmVhdGVZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVyKCkgew0KKwkJWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplckltcGwgeWV0aVBvcHVsYXRpb25Jbml0aWFsaXplciA9IG5ldyBZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbCgpOw0KKwkJcmV0dXJuIHlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXI7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RhbmRhcmRQYWNrYWdlIGdldFN0YW5kYXJkUGFja2FnZSgpIHsNCisJCXJldHVybiAoU3RhbmRhcmRQYWNrYWdlKWdldEVQYWNrYWdlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZGVwcmVjYXRlZA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlARGVwcmVjYXRlZA0KKwlwdWJsaWMgc3RhdGljIFN0YW5kYXJkUGFja2FnZSBnZXRQYWNrYWdlKCkgew0KKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0U7DQorCX0NCisNCit9IC8vU3RhbmRhcmRGYWN0b3J5SW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RhbmRhcmRQYWNrYWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvaW1wbC9TdGFuZGFyZFBhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyNTE3MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RhbmRhcmRQYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsODc4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsVmFsdWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLkRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkdyb3VwOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkluaXRpYWxpemVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLllldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXI7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgU3RhbmRhcmRQYWNrYWdlIHsNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBwb3B1bGF0aW9uTW9kZWxFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsRUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBwb3B1bGF0aW9uTW9kZWxMYWJlbEVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3Mgc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3MgaW50ZWdyYXRpb25MYWJlbEVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3MgaW50ZWdyYXRpb25MYWJlbFZhbHVlRUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBpbnRlZ3JhdGlvbkRlY29yYXRvckVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3MgcG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3Mgc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlRUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBzdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIGRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsRUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBwb3B1bGF0aW9uR3JvdXBFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIHBvcHVsYXRpb25Jbml0aWFsaXplckVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3Mgc3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIHNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsRUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBlYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXJFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIHlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aA0KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQ0KKwkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4NCisJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYw0KKwkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3Jtcw0KKwkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLA0KKwkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQ0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2UjZU5TX1VSSQ0KKwkgKiBAc2VlICNpbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdGFuZGFyZFBhY2thZ2VJbXBsKCkgew0KKwkJc3VwZXIoZU5TX1VSSSwgU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuDQorCSAqIA0KKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIFN0YW5kYXJkUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4NCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2VOU19VUkkNCisJICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkNCisJICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RhbmRhcmRQYWNrYWdlIGluaXQoKSB7DQorCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoU3RhbmRhcmRQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFN0YW5kYXJkUGFja2FnZS5lTlNfVVJJKTsNCisNCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UNCisJCVN0YW5kYXJkUGFja2FnZUltcGwgdGhlU3RhbmRhcmRQYWNrYWdlID0gKFN0YW5kYXJkUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIFN0YW5kYXJkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgU3RhbmRhcmRQYWNrYWdlSW1wbCgpKTsNCisNCisJCWlzSW5pdGVkID0gdHJ1ZTsNCisNCisJCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcw0KKwkJTGFiZWxzUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7DQorDQorCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cw0KKwkJdGhlU3RhbmRhcmRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOw0KKw0KKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQ0KKwkJdGhlU3RhbmRhcmRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsNCisNCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQNCisJCXRoZVN0YW5kYXJkUGFja2FnZS5mcmVlemUoKTsNCisNCisgIA0KKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlDQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoU3RhbmRhcmRQYWNrYWdlLmVOU19VUkksIHRoZVN0YW5kYXJkUGFja2FnZSk7DQorCQlyZXR1cm4gdGhlU3RhbmRhcmRQYWNrYWdlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRQb3B1bGF0aW9uTW9kZWwoKSB7DQorCQlyZXR1cm4gcG9wdWxhdGlvbk1vZGVsRUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9wdWxhdGlvbk1vZGVsX1BvcHVsYXRpb25JZGVudGlmaWVyKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKXBvcHVsYXRpb25Nb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9wdWxhdGlvbk1vZGVsX05hbWUoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9wdWxhdGlvbk1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3B1bGF0aW9uTW9kZWxfVGFyZ2V0SVNPS2V5KCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKXBvcHVsYXRpb25Nb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCgpIHsNCisJCXJldHVybiBzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsX0JpcnRoUmF0ZSgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSlzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxfRGVhdGhSYXRlKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKXN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbF9UaW1lUGVyaW9kKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKXN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldFBvcHVsYXRpb25Nb2RlbExhYmVsKCkgew0KKwkJcmV0dXJuIHBvcHVsYXRpb25Nb2RlbExhYmVsRUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWxfUG9wdWxhdGlvbkxhYmVsKCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBvcHVsYXRpb25Nb2RlbExhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3B1bGF0aW9uTW9kZWxMYWJlbF9Qb3B1bGF0aW9uSWRlbnRpZmllcigpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSlwb3B1bGF0aW9uTW9kZWxMYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsKCkgew0KKwkJcmV0dXJuIHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsX0RlbHRhVmFsdWUoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2Upc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbF9Qcm9iZVZhbHVlKCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKXN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxfVGVtcFZhbHVlKCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKXN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxfT3JpZ2luYWxWYWx1ZSgpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSlzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsX0Vycm9yU2NhbGUoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2Upc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRJbnRlZ3JhdGlvbkxhYmVsKCkgew0KKwkJcmV0dXJuIGludGVncmF0aW9uTGFiZWxFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldEludGVncmF0aW9uTGFiZWxWYWx1ZSgpIHsNCisJCXJldHVybiBpbnRlZ3JhdGlvbkxhYmVsVmFsdWVFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldEludGVncmF0aW9uRGVjb3JhdG9yKCkgew0KKwkJcmV0dXJuIGludGVncmF0aW9uRGVjb3JhdG9yRUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKCkgew0KKwkJcmV0dXJuIHBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSgpIHsNCisJCXJldHVybiBzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfQ291bnQoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfSW5jaWRlbmNlKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKXN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlX0JpcnRocygpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSlzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZV9EZWF0aHMoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfRGVuc2l0eSgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSlzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQ2xhc3MgZ2V0U3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKCkgew0KKwkJcmV0dXJuIHN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldFN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbF9HYWluKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKXN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXREZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbCgpIHsNCisJCXJldHVybiBkZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbEVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsX1BvcHVsYXRpb25Hcm91cHMoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2UpZGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQ2xhc3MgZ2V0UG9wdWxhdGlvbkdyb3VwKCkgew0KKwkJcmV0dXJuIHBvcHVsYXRpb25Hcm91cEVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvcHVsYXRpb25Hcm91cF9JZGVudGlmaWVyKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKXBvcHVsYXRpb25Hcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9wdWxhdGlvbkdyb3VwX0ZyYWN0aW9uKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKXBvcHVsYXRpb25Hcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKSB7DQorCQlyZXR1cm4gcG9wdWxhdGlvbkluaXRpYWxpemVyRUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9wdWxhdGlvbkluaXRpYWxpemVyX1RhcmdldElTT0tleSgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSlwb3B1bGF0aW9uSW5pdGlhbGl6ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvcHVsYXRpb25Jbml0aWFsaXplcl9Qb3B1bGF0aW9uSWRlbnRpZmllcigpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSlwb3B1bGF0aW9uSW5pdGlhbGl6ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQ2xhc3MgZ2V0U3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKSB7DQorCQlyZXR1cm4gc3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcl9JbmRpdmlkdWFscygpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSlzdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJfVXNlRGVuc2l0eSgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSlzdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRTZWFzb25hbFBvcHVsYXRpb25Nb2RlbCgpIHsNCisJCXJldHVybiBzZWFzb25hbFBvcHVsYXRpb25Nb2RlbEVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsX1BoYXNlKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKXNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWFzb25hbFBvcHVsYXRpb25Nb2RlbF9Nb2R1bGF0aW9uQW1wbGl0dWRlKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKXNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWFzb25hbFBvcHVsYXRpb25Nb2RlbF9QZXJpb2QoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsX1VzZUxhdGl0dWRlKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKXNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldEVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplcigpIHsNCisJCXJldHVybiBlYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXJFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldFlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKSB7DQorCQlyZXR1cm4geWV0aVBvcHVsYXRpb25Jbml0aWFsaXplckVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdGFuZGFyZEZhY3RvcnkgZ2V0U3RhbmRhcmRGYWN0b3J5KCkgew0KKwkJcmV0dXJuIChTdGFuZGFyZEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOw0KKw0KKwkvKioNCisJICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzDQorCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsNCisJCWlmIChpc0NyZWF0ZWQpIHJldHVybjsNCisJCWlzQ3JlYXRlZCA9IHRydWU7DQorDQorCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMNCisJCXBvcHVsYXRpb25Nb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1BVTEFUSU9OX01PREVMKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUocG9wdWxhdGlvbk1vZGVsRUNsYXNzLCBQT1BVTEFUSU9OX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShwb3B1bGF0aW9uTW9kZWxFQ2xhc3MsIFBPUFVMQVRJT05fTU9ERUxfX05BTUUpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShwb3B1bGF0aW9uTW9kZWxFQ2xhc3MsIFBPUFVMQVRJT05fTU9ERUxfX1RBUkdFVF9JU09fS0VZKTsNCisNCisJCXN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUwpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEVDbGFzcywgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fQklSVEhfUkFURSk7DQorCQljcmVhdGVFQXR0cmlidXRlKHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsRUNsYXNzLCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19ERUFUSF9SQVRFKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxFQ2xhc3MsIFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX1RJTUVfUEVSSU9EKTsNCisNCisJCXBvcHVsYXRpb25Nb2RlbExhYmVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBPUFVMQVRJT05fTU9ERUxfTEFCRUwpOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShwb3B1bGF0aW9uTW9kZWxMYWJlbEVDbGFzcywgUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fUE9QVUxBVElPTl9MQUJFTCk7DQorCQljcmVhdGVFQXR0cmlidXRlKHBvcHVsYXRpb25Nb2RlbExhYmVsRUNsYXNzLCBQT1BVTEFUSU9OX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIpOw0KKw0KKwkJc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2Uoc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEVDbGFzcywgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fREVMVEFfVkFMVUUpOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsRUNsYXNzLCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19QUk9CRV9WQUxVRSk7DQorCQljcmVhdGVFUmVmZXJlbmNlKHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxFQ2xhc3MsIFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfX1RFTVBfVkFMVUUpOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsRUNsYXNzLCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19PUklHSU5BTF9WQUxVRSk7DQorCQljcmVhdGVFUmVmZXJlbmNlKHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxFQ2xhc3MsIFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfX0VSUk9SX1NDQUxFKTsNCisNCisJCWludGVncmF0aW9uTGFiZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU5URUdSQVRJT05fTEFCRUwpOw0KKw0KKwkJaW50ZWdyYXRpb25MYWJlbFZhbHVlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOVEVHUkFUSU9OX0xBQkVMX1ZBTFVFKTsNCisNCisJCWludGVncmF0aW9uRGVjb3JhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOVEVHUkFUSU9OX0RFQ09SQVRPUik7DQorDQorCQlwb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUUpOw0KKw0KKwkJc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUUpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVFQ2xhc3MsIFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0NPVU5UKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlRUNsYXNzLCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19JTkNJREVOQ0UpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVFQ2xhc3MsIFNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0JJUlRIUyk7DQorCQljcmVhdGVFQXR0cmlidXRlKHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUVDbGFzcywgU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRV9fREVBVEhTKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlRUNsYXNzLCBTVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19ERU5TSVRZKTsNCisNCisJCXN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVE9DSEFTVElDX1NUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUwpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShzdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxFQ2xhc3MsIFNUT0NIQVNUSUNfU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fR0FJTik7DQorDQorCQlkZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERU1PR1JBUEhJQ19QT1BVTEFUSU9OX01PREVMKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UoZGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxFQ2xhc3MsIERFTU9HUkFQSElDX1BPUFVMQVRJT05fTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTKTsNCisNCisJCXBvcHVsYXRpb25Hcm91cEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1BVTEFUSU9OX0dST1VQKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUocG9wdWxhdGlvbkdyb3VwRUNsYXNzLCBQT1BVTEFUSU9OX0dST1VQX19JREVOVElGSUVSKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUocG9wdWxhdGlvbkdyb3VwRUNsYXNzLCBQT1BVTEFUSU9OX0dST1VQX19GUkFDVElPTik7DQorDQorCQlwb3B1bGF0aW9uSW5pdGlhbGl6ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUE9QVUxBVElPTl9JTklUSUFMSVpFUik7DQorCQljcmVhdGVFQXR0cmlidXRlKHBvcHVsYXRpb25Jbml0aWFsaXplckVDbGFzcywgUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fVEFSR0VUX0lTT19LRVkpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShwb3B1bGF0aW9uSW5pdGlhbGl6ZXJFQ2xhc3MsIFBPUFVMQVRJT05fSU5JVElBTElaRVJfX1BPUFVMQVRJT05fSURFTlRJRklFUik7DQorDQorCQlzdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVEFOREFSRF9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoc3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJFQ2xhc3MsIFNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX0lORElWSURVQUxTKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoc3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJFQ2xhc3MsIFNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX1VTRV9ERU5TSVRZKTsNCisNCisJCXNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUwpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShzZWFzb25hbFBvcHVsYXRpb25Nb2RlbEVDbGFzcywgU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTF9fUEhBU0UpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShzZWFzb25hbFBvcHVsYXRpb25Nb2RlbEVDbGFzcywgU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTF9fTU9EVUxBVElPTl9BTVBMSVRVREUpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShzZWFzb25hbFBvcHVsYXRpb25Nb2RlbEVDbGFzcywgU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTF9fUEVSSU9EKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoc2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxFQ2xhc3MsIFNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX1VTRV9MQVRJVFVERSk7DQorDQorCQllYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUFSVEhfU0NJRU5DRV9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSKTsNCisNCisJCXlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWUVUSV9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7DQorDQorCS8qKg0KKwkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcw0KKwkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsNCisJCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47DQorCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsNCisNCisJCS8vIEluaXRpYWxpemUgcGFja2FnZQ0KKwkJc2V0TmFtZShlTkFNRSk7DQorCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsNCisJCXNldE5zVVJJKGVOU19VUkkpOw0KKw0KKwkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcw0KKwkJTW9kZWxQYWNrYWdlIHRoZU1vZGVsUGFja2FnZSA9IChNb2RlbFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kZWxQYWNrYWdlLmVOU19VUkkpOw0KKwkJTW9kaWZpZXJQYWNrYWdlIHRoZU1vZGlmaWVyUGFja2FnZSA9IChNb2RpZmllclBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kaWZpZXJQYWNrYWdlLmVOU19VUkkpOw0KKwkJRWNvcmVQYWNrYWdlIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOw0KKwkJR3JhcGhQYWNrYWdlIHRoZUdyYXBoUGFja2FnZSA9IChHcmFwaFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoR3JhcGhQYWNrYWdlLmVOU19VUkkpOw0KKwkJTGFiZWxzUGFja2FnZSB0aGVMYWJlbHNQYWNrYWdlID0gKExhYmVsc1BhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTGFiZWxzUGFja2FnZS5lTlNfVVJJKTsNCisNCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMNCisNCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycw0KKw0KKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3Nlcw0KKwkJcG9wdWxhdGlvbk1vZGVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU1vZGVsUGFja2FnZS5nZXROb2RlRGVjb3JhdG9yKCkpOw0KKwkJcG9wdWxhdGlvbk1vZGVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU1vZGlmaWVyUGFja2FnZS5nZXRNb2RpZmlhYmxlKCkpOw0KKwkJc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQb3B1bGF0aW9uTW9kZWwoKSk7DQorCQlzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEludGVncmF0aW9uRGVjb3JhdG9yKCkpOw0KKwkJcG9wdWxhdGlvbk1vZGVsTGFiZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlR3JhcGhQYWNrYWdlLmdldER5bmFtaWNOb2RlTGFiZWwoKSk7DQorCQlzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKSk7DQorCQlzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SW50ZWdyYXRpb25MYWJlbCgpKTsNCisJCXBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlR3JhcGhQYWNrYWdlLmdldExhYmVsVmFsdWUoKSk7DQorCQlzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKCkpOw0KKwkJc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SW50ZWdyYXRpb25MYWJlbFZhbHVlKCkpOw0KKwkJc3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwoKSk7DQorCQlkZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKCkpOw0KKwkJcG9wdWxhdGlvbkluaXRpYWxpemVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU1vZGVsUGFja2FnZS5nZXROb2RlRGVjb3JhdG9yKCkpOw0KKwkJcG9wdWxhdGlvbkluaXRpYWxpemVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU1vZGlmaWVyUGFja2FnZS5nZXRNb2RpZmlhYmxlKCkpOw0KKwkJc3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKSk7DQorCQlzZWFzb25hbFBvcHVsYXRpb25Nb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKCkpOw0KKwkJZWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UG9wdWxhdGlvbkluaXRpYWxpemVyKCkpOw0KKwkJeWV0aVBvcHVsYXRpb25Jbml0aWFsaXplckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplcigpKTsNCisNCisJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzDQorCQlpbml0RUNsYXNzKHBvcHVsYXRpb25Nb2RlbEVDbGFzcywgUG9wdWxhdGlvbk1vZGVsLmNsYXNzLCAiUG9wdWxhdGlvbk1vZGVsIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRQb3B1bGF0aW9uTW9kZWxfUG9wdWxhdGlvbklkZW50aWZpZXIoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcHVsYXRpb25JZGVudGlmaWVyIiwgImh1bWFuIiwgMCwgMSwgUG9wdWxhdGlvbk1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9wdWxhdGlvbk1vZGVsX05hbWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCAiSHVtYW5Qb3B1bGF0aW9uTW9kZWwiLCAwLCAxLCBQb3B1bGF0aW9uTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRQb3B1bGF0aW9uTW9kZWxfVGFyZ2V0SVNPS2V5KCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YXJnZXRJU09LZXkiLCAiIiwgMCwgMSwgUG9wdWxhdGlvbk1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKwkJaW5pdEVDbGFzcyhzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEVDbGFzcywgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwuY2xhc3MsICJTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFQXR0cmlidXRlKGdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsX0JpcnRoUmF0ZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiYmlydGhSYXRlIiwgIjAuMCIsIDAsIDEsIFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxfRGVhdGhSYXRlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJkZWF0aFJhdGUiLCAiMC4wIiwgMCwgMSwgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbF9UaW1lUGVyaW9kKCksIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAidGltZVBlcmlvZCIsICI4NjQwMDAwMCIsIDAsIDEsIFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKwkJaW5pdEVDbGFzcyhwb3B1bGF0aW9uTW9kZWxMYWJlbEVDbGFzcywgUG9wdWxhdGlvbk1vZGVsTGFiZWwuY2xhc3MsICJQb3B1bGF0aW9uTW9kZWxMYWJlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldFBvcHVsYXRpb25Nb2RlbExhYmVsX1BvcHVsYXRpb25MYWJlbCgpLCB0aGVMYWJlbHNQYWNrYWdlLmdldFBvcHVsYXRpb25MYWJlbCgpLCBudWxsLCAicG9wdWxhdGlvbkxhYmVsIiwgbnVsbCwgMCwgMSwgUG9wdWxhdGlvbk1vZGVsTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRQb3B1bGF0aW9uTW9kZWxMYWJlbF9Qb3B1bGF0aW9uSWRlbnRpZmllcigpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicG9wdWxhdGlvbklkZW50aWZpZXIiLCBudWxsLCAwLCAxLCBQb3B1bGF0aW9uTW9kZWxMYWJlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisNCisJCWluaXRFQ2xhc3Moc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEVDbGFzcywgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbC5jbGFzcywgIlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsX0RlbHRhVmFsdWUoKSwgdGhpcy5nZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUoKSwgbnVsbCwgImRlbHRhVmFsdWUiLCBudWxsLCAwLCAxLCBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbF9Qcm9iZVZhbHVlKCksIHRoaXMuZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKCksIG51bGwsICJwcm9iZVZhbHVlIiwgbnVsbCwgMCwgMSwgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxfVGVtcFZhbHVlKCksIHRoaXMuZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKCksIG51bGwsICJ0ZW1wVmFsdWUiLCBudWxsLCAwLCAxLCBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbF9PcmlnaW5hbFZhbHVlKCksIHRoaXMuZ2V0U3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKCksIG51bGwsICJvcmlnaW5hbFZhbHVlIiwgbnVsbCwgMCwgMSwgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxfRXJyb3JTY2FsZSgpLCB0aGlzLmdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSgpLCBudWxsLCAiZXJyb3JTY2FsZSIsIG51bGwsIDAsIDEsIFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorDQorCQlpbml0RUNsYXNzKGludGVncmF0aW9uTGFiZWxFQ2xhc3MsIEludGVncmF0aW9uTGFiZWwuY2xhc3MsICJJbnRlZ3JhdGlvbkxhYmVsIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorDQorCQlpbml0RUNsYXNzKGludGVncmF0aW9uTGFiZWxWYWx1ZUVDbGFzcywgSW50ZWdyYXRpb25MYWJlbFZhbHVlLmNsYXNzLCAiSW50ZWdyYXRpb25MYWJlbFZhbHVlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorDQorCQlpbml0RUNsYXNzKGludGVncmF0aW9uRGVjb3JhdG9yRUNsYXNzLCBJbnRlZ3JhdGlvbkRlY29yYXRvci5jbGFzcywgIkludGVncmF0aW9uRGVjb3JhdG9yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorDQorCQlpbml0RUNsYXNzKHBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVFQ2xhc3MsIFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUuY2xhc3MsICJQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKw0KKwkJaW5pdEVDbGFzcyhzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVFQ2xhc3MsIFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZS5jbGFzcywgIlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFQXR0cmlidXRlKGdldFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZV9Db3VudCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiY291bnQiLCBudWxsLCAwLCAxLCBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfSW5jaWRlbmNlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJpbmNpZGVuY2UiLCBudWxsLCAwLCAxLCBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfQmlydGhzKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJiaXJ0aHMiLCBudWxsLCAwLCAxLCBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfRGVhdGhzKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJkZWF0aHMiLCBudWxsLCAwLCAxLCBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfRGVuc2l0eSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiZGVuc2l0eSIsICIwLjAiLCAwLCAxLCBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisNCisJCUVPcGVyYXRpb24gb3AgPSBhZGRFT3BlcmF0aW9uKHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUVDbGFzcywgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJhZGp1c3REZWx0YSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7DQorCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEludGVncmF0aW9uTGFiZWxWYWx1ZSgpLCAidmFsdWUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOw0KKw0KKwkJaW5pdEVDbGFzcyhzdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxFQ2xhc3MsIFN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbC5jbGFzcywgIlN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFQXR0cmlidXRlKGdldFN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbF9HYWluKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJnYWluIiwgIjAuMDEiLCAwLCAxLCBTdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorDQorCQlpbml0RUNsYXNzKGRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsRUNsYXNzLCBEZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbC5jbGFzcywgIkRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxfUG9wdWxhdGlvbkdyb3VwcygpLCB0aGlzLmdldFBvcHVsYXRpb25Hcm91cCgpLCBudWxsLCAicG9wdWxhdGlvbkdyb3VwcyIsIG51bGwsIDEsIC0xLCBEZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisNCisJCWluaXRFQ2xhc3MocG9wdWxhdGlvbkdyb3VwRUNsYXNzLCBQb3B1bGF0aW9uR3JvdXAuY2xhc3MsICJQb3B1bGF0aW9uR3JvdXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRQb3B1bGF0aW9uR3JvdXBfSWRlbnRpZmllcigpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWRlbnRpZmllciIsIG51bGwsIDAsIDEsIFBvcHVsYXRpb25Hcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFQXR0cmlidXRlKGdldFBvcHVsYXRpb25Hcm91cF9GcmFjdGlvbigpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiZnJhY3Rpb24iLCAiMC41IiwgMCwgMSwgUG9wdWxhdGlvbkdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKwkJaW5pdEVDbGFzcyhwb3B1bGF0aW9uSW5pdGlhbGl6ZXJFQ2xhc3MsIFBvcHVsYXRpb25Jbml0aWFsaXplci5jbGFzcywgIlBvcHVsYXRpb25Jbml0aWFsaXplciIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9wdWxhdGlvbkluaXRpYWxpemVyX1RhcmdldElTT0tleSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFyZ2V0SVNPS2V5IiwgbnVsbCwgMCwgMSwgUG9wdWxhdGlvbkluaXRpYWxpemVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9wdWxhdGlvbkluaXRpYWxpemVyX1BvcHVsYXRpb25JZGVudGlmaWVyKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwb3B1bGF0aW9uSWRlbnRpZmllciIsICJodW1hbiIsIDAsIDEsIFBvcHVsYXRpb25Jbml0aWFsaXplci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisNCisJCWluaXRFQ2xhc3Moc3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJFQ2xhc3MsIFN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyLmNsYXNzLCAiU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcl9JbmRpdmlkdWFscygpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiaW5kaXZpZHVhbHMiLCAiMSIsIDAsIDEsIFN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJfVXNlRGVuc2l0eSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVzZURlbnNpdHkiLCAiZmFsc2UiLCAwLCAxLCBTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisNCisJCWluaXRFQ2xhc3Moc2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxFQ2xhc3MsIFNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsLmNsYXNzLCAiU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRTZWFzb25hbFBvcHVsYXRpb25Nb2RlbF9QaGFzZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAicGhhc2UiLCAiMC4wIiwgMCwgMSwgU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRTZWFzb25hbFBvcHVsYXRpb25Nb2RlbF9Nb2R1bGF0aW9uQW1wbGl0dWRlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJtb2R1bGF0aW9uQW1wbGl0dWRlIiwgIjEuMCIsIDAsIDEsIFNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxfUGVyaW9kKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJwZXJpb2QiLCAiMzY1LjI1IiwgMCwgMSwgU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxfVXNlTGF0aXR1ZGUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ1c2VMYXRpdHVkZSIsICJ0cnVlIiwgMCwgMSwgU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorDQorCQlpbml0RUNsYXNzKGVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplckVDbGFzcywgRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyLmNsYXNzLCAiRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorDQorCQlpbml0RUNsYXNzKHlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJFQ2xhc3MsIFlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXIuY2xhc3MsICJZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKw0KKwkJLy8gQ3JlYXRlIHJlc291cmNlDQorCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsNCisJfQ0KKw0KK30gLy9TdGFuZGFyZFBhY2thZ2VJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvaW1wbC9TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplckltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk3OWU2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJbXBsLmphdmEKQEAgLTAsMCArMSwyOTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5VdGlsaXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuUG9wdWxhdGlvbkxhYmVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3B1bGF0aW9uIEluaXRpYWxpemVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplckltcGwjZ2V0SW5kaXZpZHVhbHMgPGVtPkluZGl2aWR1YWxzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplckltcGwjaXNVc2VEZW5zaXR5IDxlbT5Vc2UgRGVuc2l0eTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbCBleHRlbmRzIFBvcHVsYXRpb25Jbml0aWFsaXplckltcGwgaW1wbGVtZW50cyBTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplciB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZGl2aWR1YWxzKCkgPGVtPkluZGl2aWR1YWxzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbmRpdmlkdWFscygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgSU5ESVZJRFVBTFNfRURFRkFVTFQgPSAxLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmRpdmlkdWFscygpIDxlbT5JbmRpdmlkdWFsczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW5kaXZpZHVhbHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgaW5kaXZpZHVhbHMgPSBJTkRJVklEVUFMU19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VzZURlbnNpdHkoKSA8ZW0+VXNlIERlbnNpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzVXNlRGVuc2l0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9ERU5TSVRZX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VzZURlbnNpdHkoKSA8ZW0+VXNlIERlbnNpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzVXNlRGVuc2l0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdXNlRGVuc2l0eSA9IFVTRV9ERU5TSVRZX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplckltcGwoKSB7CisJCXN1cGVyKCk7CisJCS8vIFBvcHVsYXRlIHRoZSBwb3B1bGF0aW9uIGxhYmVscworCQkKKwl9CisJCisJQE92ZXJyaWRlIAorCXB1YmxpYyB2b2lkIHByZXBhcmUoTW9kZWwgbW9kZWwsIFNURU1UaW1lIHRpbWUpIHsKKwkJLy8gTm90aGluZyB0byBkbworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGFiZWwoUG9wdWxhdGlvbkxhYmVsIGxhYiwgU1RFTVRpbWUgdGltZSwgYm9vbGVhbiB6ZXJvVmFsdWUpIHsKKwkJaWYodGhpcy5pc1VzZURlbnNpdHkoKSkgeworCQkJTm9kZSBuID0gbGFiLmdldE5vZGUoKTsKKwkJCWlmKG4gPT0gbnVsbCkgeworCQkJCUFjdGl2YXRvci5sb2dJbmZvcm1hdGlvbigiQ2Fubm90IGluaXRpYWxpemUgcG9wdWxhdGlvbiAiK3RoaXMuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSsiLCBubyBub2RlIGZvdW5kIGZvciIrbGFiLCBuZXcgRXhjZXB0aW9uKCkpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWRvdWJsZSBhcmVhID0gMC4wOworCQkJZm9yKE5vZGVMYWJlbCBsOm4uZ2V0TGFiZWxzKCkpCisJCQkJaWYobCBpbnN0YW5jZW9mIEFyZWFMYWJlbCkKKwkJCQkJYXJlYSA9ICgoQXJlYUxhYmVsKWwpLmdldEN1cnJlbnRBcmVhVmFsdWUoKS5nZXRBcmVhKCk7CisJCQlpZihhcmVhID09IDAuMCkgeworCQkJCSBpZighbi5nZXRVUkkoKS50b1N0cmluZygpLmNvbnRhaW5zKCIvdHJhbnNwb3J0L3BpcGUiKSkgLy8gTm8gYXJlYSBmb3IgdHJhbnNwb3J0IHN5c3RlbSBub2RlcyBpcyBleHBlY3RlZC4KKwkJCQkJCSBBY3RpdmF0b3IubG9nSW5mb3JtYXRpb24oIldhcm5pbmcsIHVuYWJsZSB0byBmaW5kIGFyZWEgaW5mb3JtYXRpb24gZm9yIG5vZGUgIituKyIgd2hlbiBpbml0aWFsaXppbmcgcG9wdWxhdGlvbiAiK3RoaXMuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSsiLCBkZW5zaXR5IG5vdCBiZWluZyB1c2VkISIsIG5ldyBFeGNlcHRpb24oKSk7CisJCQkJIFBvcHVsYXRpb25MYWJlbFZhbHVlIHBsdiA9IGxhYi5nZXRDdXJyZW50UG9wdWxhdGlvblZhbHVlKCk7CisJCQkJIGlmKCF6ZXJvVmFsdWUpIHBsdi5zZXRDb3VudCh0aGlzLmdldEluZGl2aWR1YWxzKCkpOworCQkJCSBlbHNlIHBsdi5zZXRDb3VudCgwLjApOworCQkJfSBlbHNlIHsKKwkJCQkgUG9wdWxhdGlvbkxhYmVsVmFsdWUgcGx2ID0gbGFiLmdldEN1cnJlbnRQb3B1bGF0aW9uVmFsdWUoKTsKKwkJCQkgaWYoIXplcm9WYWx1ZSkgcGx2LnNldENvdW50KHRoaXMuZ2V0SW5kaXZpZHVhbHMoKSphcmVhKTsKKwkJCQkgZWxzZSBwbHYuc2V0Q291bnQoMC4wKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSBQb3B1bGF0aW9uTGFiZWxWYWx1ZSBwbHYgPSBsYWIuZ2V0Q3VycmVudFBvcHVsYXRpb25WYWx1ZSgpOworCQkJIGlmKCF6ZXJvVmFsdWUpIHBsdi5zZXRDb3VudCh0aGlzLmdldEluZGl2aWR1YWxzKCkpOworCQkJIGVsc2UgcGx2LnNldENvdW50KDAuMCk7CisJCX0KKwkJLy8gU2V0IHRoZSB2YWxpZCB5ZWFyIHRvIHRoZSBzdGFydCB5ZWFyIG9mIHRoZSBzZXF1ZW5jZXIKKwkJCisJCWxhYi5zZXRWYWxpZFllYXIoZ2V0WWVhcih0aW1lKSk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGRlY29yYXRlR3JhcGgoU1RFTVRpbWUgdGltZSkgeworCQlpZih0aGlzLmlzR3JhcGhEZWNvcmF0ZWQoKSkgcmV0dXJuIHRydWU7CisJCXN1cGVyLmRlY29yYXRlR3JhcGgodGltZSk7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRJbmRpdmlkdWFscygpIHsKKwkJcmV0dXJuIGluZGl2aWR1YWxzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluZGl2aWR1YWxzKGRvdWJsZSBuZXdJbmRpdmlkdWFscykgeworCQlkb3VibGUgb2xkSW5kaXZpZHVhbHMgPSBpbmRpdmlkdWFsczsKKwkJaW5kaXZpZHVhbHMgPSBuZXdJbmRpdmlkdWFsczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX0lORElWSURVQUxTLCBvbGRJbmRpdmlkdWFscywgaW5kaXZpZHVhbHMpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1VzZURlbnNpdHkoKSB7CisJCXJldHVybiB1c2VEZW5zaXR5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFVzZURlbnNpdHkoYm9vbGVhbiBuZXdVc2VEZW5zaXR5KSB7CisJCWJvb2xlYW4gb2xkVXNlRGVuc2l0eSA9IHVzZURlbnNpdHk7CisJCXVzZURlbnNpdHkgPSBuZXdVc2VEZW5zaXR5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fVVNFX0RFTlNJVFksIG9sZFVzZURlbnNpdHksIHVzZURlbnNpdHkpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19JTkRJVklEVUFMUzoKKwkJCQlyZXR1cm4gZ2V0SW5kaXZpZHVhbHMoKTsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX1VTRV9ERU5TSVRZOgorCQkJCXJldHVybiBpc1VzZURlbnNpdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fSU5ESVZJRFVBTFM6CisJCQkJc2V0SW5kaXZpZHVhbHMoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fVVNFX0RFTlNJVFk6CisJCQkJc2V0VXNlRGVuc2l0eSgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX0lORElWSURVQUxTOgorCQkJCXNldEluZGl2aWR1YWxzKElORElWSURVQUxTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19VU0VfREVOU0lUWToKKwkJCQlzZXRVc2VEZW5zaXR5KFVTRV9ERU5TSVRZX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX0lORElWSURVQUxTOgorCQkJCXJldHVybiBpbmRpdmlkdWFscyAhPSBJTkRJVklEVUFMU19FREVGQVVMVDsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX1VTRV9ERU5TSVRZOgorCQkJCXJldHVybiB1c2VEZW5zaXR5ICE9IFVTRV9ERU5TSVRZX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoaW5kaXZpZHVhbHM6ICIpOworCQlyZXN1bHQuYXBwZW5kKGluZGl2aWR1YWxzKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB1c2VEZW5zaXR5OiAiKTsKKwkJcmVzdWx0LmFwcGVuZCh1c2VEZW5zaXR5KTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvaW1wbC9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWEyYjU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvaW1wbC9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGwuamF2YQpAQCAtMCwwICsxLDc1NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsNCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlV0aWxpdHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbFZhbHVlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TaW1wbGVEYXRhRXhjaGFuZ2VMYWJlbFZhbHVlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGlwZVRyYW5zcG9ydEVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5QaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW1JbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuQWN0aXZhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcHVsYXRpb24gTW9kZWw8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJbXBsI2dldEJpcnRoUmF0ZSA8ZW0+QmlydGggUmF0ZTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsSW1wbCNnZXREZWF0aFJhdGUgPGVtPkRlYXRoIFJhdGU8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGwjZ2V0VGltZVBlcmlvZCA8ZW0+VGltZSBQZXJpb2Q8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGwgZXh0ZW5kcyBQb3B1bGF0aW9uTW9kZWxJbXBsIGltcGxlbWVudHMgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwgew0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJpcnRoUmF0ZSgpIDxlbT5CaXJ0aCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRCaXJ0aFJhdGUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBCSVJUSF9SQVRFX0VERUZBVUxUID0gMC4wOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmlydGhSYXRlKCkgPGVtPkJpcnRoIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldEJpcnRoUmF0ZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBkb3VibGUgYmlydGhSYXRlID0gQklSVEhfUkFURV9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWF0aFJhdGUoKSA8ZW0+RGVhdGggUmF0ZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0RGVhdGhSYXRlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgREVBVEhfUkFURV9FREVGQVVMVCA9IDAuMDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlYXRoUmF0ZSgpIDxlbT5EZWF0aCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXREZWF0aFJhdGUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgZG91YmxlIGRlYXRoUmF0ZSA9IERFQVRIX1JBVEVfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZVBlcmlvZCgpIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VGltZVBlcmlvZCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBUSU1FX1BFUklPRF9FREVGQVVMVCA9IDg2NDAwMDAwTDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVQZXJpb2QoKSA8ZW0+VGltZSBQZXJpb2Q8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFRpbWVQZXJpb2QoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgbG9uZyB0aW1lUGVyaW9kID0gVElNRV9QRVJJT0RfRURFRkFVTFQ7DQorDQorCXByb3RlY3RlZCBNYXA8SW50ZWdlciwgTGlzdDxQaXBlVHJhbnNwb3J0RWRnZT4+IHBpcGVUcmFuc3BvcnRhdGlvblVwRWRnZXNNYXA7DQorCXByb3RlY3RlZCBNYXA8SW50ZWdlciwgTGlzdDxQaXBlVHJhbnNwb3J0RWRnZT4+IHBpcGVUcmFuc3BvcnRhdGlvbkRvd25FZGdlc01hcDsNCisJcHJvdGVjdGVkIE1hcDxOb2RlLCBMaXN0PFBpcGVUcmFuc3BvcnRFZGdlPj4gcGlwZVRyYW5zcG9ydGF0aW9uTm9kZUVkZ2VzTWFwOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwdWJsaWMgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBkb3VibGUgZ2V0QmlydGhSYXRlKCkgew0KKwkJcmV0dXJuIGJpcnRoUmF0ZTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldEJpcnRoUmF0ZShkb3VibGUgbmV3QmlydGhSYXRlKSB7DQorCQlkb3VibGUgb2xkQmlydGhSYXRlID0gYmlydGhSYXRlOw0KKwkJYmlydGhSYXRlID0gbmV3QmlydGhSYXRlOw0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19CSVJUSF9SQVRFLCBvbGRCaXJ0aFJhdGUsIGJpcnRoUmF0ZSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGRvdWJsZSBnZXREZWF0aFJhdGUoKSB7DQorCQlyZXR1cm4gZGVhdGhSYXRlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0RGVhdGhSYXRlKGRvdWJsZSBuZXdEZWF0aFJhdGUpIHsNCisJCWRvdWJsZSBvbGREZWF0aFJhdGUgPSBkZWF0aFJhdGU7DQorCQlkZWF0aFJhdGUgPSBuZXdEZWF0aFJhdGU7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX0RFQVRIX1JBVEUsIG9sZERlYXRoUmF0ZSwgZGVhdGhSYXRlKSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgbG9uZyBnZXRUaW1lUGVyaW9kKCkgew0KKwkJcmV0dXJuIHRpbWVQZXJpb2Q7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRUaW1lUGVyaW9kKGxvbmcgbmV3VGltZVBlcmlvZCkgew0KKwkJbG9uZyBvbGRUaW1lUGVyaW9kID0gdGltZVBlcmlvZDsNCisJCXRpbWVQZXJpb2QgPSBuZXdUaW1lUGVyaW9kOw0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19USU1FX1BFUklPRCwgb2xkVGltZVBlcmlvZCwgdGltZVBlcmlvZCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWNvcmF0ZSB0aGUgZ3JhcGggZm9yIGEgc3RhbmRhcmQgcG9wdWxhdGlvbiBtb2RlbA0KKwkgKiANCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBkZWNvcmF0ZUdyYXBoKFNURU1UaW1lIHRpbWUpIHsNCisJCWlmKHRoaXMuaXNHcmFwaERlY29yYXRlZCgpKSByZXR1cm4gdHJ1ZTsNCisJCXN1cGVyLmRlY29yYXRlR3JhcGgodGltZSk7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfSAvLyBkZWNvcmF0ZUdyYXBoDQorCQ0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX0JJUlRIX1JBVEU6DQorCQkJCXJldHVybiBnZXRCaXJ0aFJhdGUoKTsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19ERUFUSF9SQVRFOg0KKwkJCQlyZXR1cm4gZ2V0RGVhdGhSYXRlKCk7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fVElNRV9QRVJJT0Q6DQorCQkJCXJldHVybiBnZXRUaW1lUGVyaW9kKCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19CSVJUSF9SQVRFOg0KKwkJCQlzZXRCaXJ0aFJhdGUoKERvdWJsZSluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19ERUFUSF9SQVRFOg0KKwkJCQlzZXREZWF0aFJhdGUoKERvdWJsZSluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19USU1FX1BFUklPRDoNCisJCQkJc2V0VGltZVBlcmlvZCgoTG9uZyluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fQklSVEhfUkFURToNCisJCQkJc2V0QmlydGhSYXRlKEJJUlRIX1JBVEVfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fREVBVEhfUkFURToNCisJCQkJc2V0RGVhdGhSYXRlKERFQVRIX1JBVEVfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fVElNRV9QRVJJT0Q6DQorCQkJCXNldFRpbWVQZXJpb2QoVElNRV9QRVJJT0RfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19CSVJUSF9SQVRFOg0KKwkJCQlyZXR1cm4gYmlydGhSYXRlICE9IEJJUlRIX1JBVEVfRURFRkFVTFQ7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fREVBVEhfUkFURToNCisJCQkJcmV0dXJuIGRlYXRoUmF0ZSAhPSBERUFUSF9SQVRFX0VERUZBVUxUOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX1RJTUVfUEVSSU9EOg0KKwkJCQlyZXR1cm4gdGltZVBlcmlvZCAhPSBUSU1FX1BFUklPRF9FREVGQVVMVDsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOw0KKw0KKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7DQorCQlyZXN1bHQuYXBwZW5kKCIgKGJpcnRoUmF0ZTogIik7DQorCQlyZXN1bHQuYXBwZW5kKGJpcnRoUmF0ZSk7DQorCQlyZXN1bHQuYXBwZW5kKCIsIGRlYXRoUmF0ZTogIik7DQorCQlyZXN1bHQuYXBwZW5kKGRlYXRoUmF0ZSk7DQorCQlyZXN1bHQuYXBwZW5kKCIsIHRpbWVQZXJpb2Q6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZCh0aW1lUGVyaW9kKTsNCisJCXJlc3VsdC5hcHBlbmQoJyknKTsNCisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFBvcHVsYXRpb25Nb2RlbExhYmVsIGNyZWF0ZVBvcHVsYXRpb25MYWJlbCgpIHsNCisJCVBvcHVsYXRpb25Nb2RlbExhYmVsIHJldFZhbHVlID0gIFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCgpOw0KKwkJcmV0VmFsdWUuc2V0VHlwZVVSSShQb3B1bGF0aW9uTW9kZWxMYWJlbC5VUklfVFlQRV9EWU5BTUlDX1BPUFVMQVRJT05fTEFCRUwpOw0KKwkJcmV0dXJuIHJldFZhbHVlOw0KKwl9DQorDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBjcmVhdGVQb3B1bGF0aW9uTGFiZWxWYWx1ZSgpIHsNCisJCXJldHVybiBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDb21wdXRlIHRoZSBjaGFuZ2VzIGluIHRoZSBwb3B1bGF0aW9uIGZyb20gdGhlIGJpcnRoL2RlYXRoIHJhdGUNCisJICogYWRqdXN0ZWQgZm9yIHRoZSB0aW1lIHBlcmlvZCB1c2VkIGluIHRoZSBzaW11bGF0aW9uDQorCSAqIEBwYXJhbSB0aW1lDQorCSAqIEBwYXJhbSB0aW1lRGVsdGENCisJICogQHBhcmFtIGxhYmVscw0KKwkgKi8NCisJcHVibGljIHZvaWQgY2FsY3VsYXRlRGVsdGEoU1RFTVRpbWUgdGltZSwgbG9uZyB0aW1lRGVsdGEsDQorCQkJRUxpc3Q8RHluYW1pY0xhYmVsPiBsYWJlbHMpIHsNCisJCS8vIFdlIHNpbXBseSBjYWxjdWxhdGUgdGhlIGNoYW5nZSBmcm9tIHRoZSBiaXJ0aC9kZWF0aCByYXRlDQorCQkvLyBhZGp1c3RlZCBmb3IgdGhlIHRpbWUgcGVyaW9kIHVzZWQgaW4gdGhlIHNpbXVsYXRpb24NCisJCQ0KKwkJZG91YmxlIGFkanVzdGVkQmlydGhSYXRlID0gYWRqdXN0UmF0ZSh0aGlzLmdldEJpcnRoUmF0ZSgpLCB0aGlzLmdldFRpbWVQZXJpb2QoKSwgdGltZURlbHRhKTsNCisJCWRvdWJsZSBhZGp1c3RlZERlYXRoUmF0ZSA9IGFkanVzdFJhdGUodGhpcy5nZXREZWF0aFJhdGUoKSwgdGhpcy5nZXRUaW1lUGVyaW9kKCksIHRpbWVEZWx0YSk7DQorCQkNCisJCWZvcihEeW5hbWljTGFiZWwgbGFiZWw6bGFiZWxzKSB7DQorCQkJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEltcGwgc2xhYmVsID0gKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxJbXBsKWxhYmVsOw0KKwkJCVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUltcGwgZGVsdGEgPSAoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSW1wbClzbGFiZWwuZ2V0RGVsdGFWYWx1ZSgpOw0KKwkJCVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBjdXJyZW50ID0gc2xhYmVsLmdldFByb2JlVmFsdWUoKTsNCisJCQkNCisJCQlkb3VibGUgY3VycmVudFBvcHVsYXRpb24gPSBjdXJyZW50LmdldENvdW50KCk7DQorCQkJZG91YmxlIGJpcnRocyA9IGN1cnJlbnRQb3B1bGF0aW9uICogYWRqdXN0ZWRCaXJ0aFJhdGU7DQorCQkJZG91YmxlIGRlYXRocyA9IGN1cnJlbnRQb3B1bGF0aW9uICogYWRqdXN0ZWREZWF0aFJhdGU7DQorCQkJZGVsdGEuc2V0SW5jaWRlbmNlKGJpcnRocy1kZWF0aHMpOw0KKwkJCWRlbHRhLnNldENvdW50KGJpcnRocy1kZWF0aHMpOw0KKwkJCWRlbHRhLnNldEJpcnRocyhiaXJ0aHMpOw0KKwkJCWRlbHRhLnNldERlYXRocyhkZWF0aHMpOw0KKwkJCQ0KKwkJCWlmKGRlbHRhLmdldEFycml2YWxzKCkgPT0gbnVsbCkgZGVsdGEuc2V0QXJyaXZhbHMobmV3IEhhc2hNYXA8Tm9kZSxEb3VibGU+KCkpOw0KKwkJCWlmKGRlbHRhLmdldERlcGFydHVyZXMoKSA9PSBudWxsKSBkZWx0YS5zZXREZXBhcnR1cmVzKG5ldyBIYXNoTWFwPE5vZGUsRG91YmxlPigpKTsNCisJCQkNCisJCQlkZWx0YS5nZXRBcnJpdmFscygpLnB1dCgoTm9kZSlsYWJlbC5nZXRJZGVudGlmaWFibGUoKSwgYmlydGhzKTsNCisJCQlkZWx0YS5nZXREZXBhcnR1cmVzKCkucHV0KChOb2RlKWxhYmVsLmdldElkZW50aWZpYWJsZSgpLCBkZWF0aHMpOw0KKwkJCQ0KKwkJCWhhbmRsZU1pZ3JhdGlvbihzbGFiZWwsIGRlbHRhLmdldEFycml2YWxzKCksZGVsdGEuZ2V0RGVwYXJ0dXJlcygpLCB0aGlzLmdldFRpbWVQZXJpb2QoKSwgdGltZURlbHRhLCBkZWx0YSk7DQorCQkJaGFuZGxlUGlwZVRyYW5zcG9ydChzbGFiZWwsIGRlbHRhLmdldEFycml2YWxzKCksZGVsdGEuZ2V0RGVwYXJ0dXJlcygpLCB0aW1lRGVsdGEsIGRlbHRhKTsNCisJCX0NCisJfS8vIGNhbGN1bGF0ZURlbHRhDQorDQorCXB1YmxpYyB2b2lkIGFwcGx5RXh0ZXJuYWxEZWx0YXMoU1RFTVRpbWUgdGltZSwgbG9uZyB0aW1lRGVsdGEsDQorCQkJRUxpc3Q8RHluYW1pY0xhYmVsPiBsYWJlbHMpIHsNCisJCWZvciAoZmluYWwgSXRlcmF0b3I8RHluYW1pY0xhYmVsPiBjdXJyZW50U3RhdGVMYWJlbEl0ZXIgPSBsYWJlbHMNCisJCQkJLml0ZXJhdG9yKCk7IGN1cnJlbnRTdGF0ZUxhYmVsSXRlci5oYXNOZXh0KCk7KSB7DQorCQkJZmluYWwgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCBwbGFiZWwgPSAoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCkgY3VycmVudFN0YXRlTGFiZWxJdGVyDQorCQkJCQkubmV4dCgpOw0KKwkJCQ0KKwkJCVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBteURlbHRhID0gcGxhYmVsLmdldERlbHRhVmFsdWUoKTsNCisJCQlOb2RlIG4gPSBwbGFiZWwuZ2V0Tm9kZSgpOw0KKwkJCQ0KKwkJCS8vIEZpbmQgb3RoZXIgbGFiZWxzIG9uIHRoZSBub2RlIHRoYXQgd2FudHMgdG8gZXhjaGFuZ2UgZGF0YQ0KKwkJCQ0KKwkJCUVMaXN0PE5vZGVMYWJlbD4gbGFicyA9IG4uZ2V0TGFiZWxzKCk7DQorCQkJZm9yKE5vZGVMYWJlbCBsOmxhYnMpIHsNCisJCQkJaWYobCBpbnN0YW5jZW9mIEludGVncmF0aW9uTGFiZWwgJiYgIWwuZXF1YWxzKHBsYWJlbCkgJiYNCisJCQkJCQkoKEludGVncmF0aW9uTGFiZWwpbCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhwbGFiZWwuZ2V0SWRlbnRpZmllcigpKSkgew0KKwkJCQkJU2ltcGxlRGF0YUV4Y2hhbmdlTGFiZWxWYWx1ZSBzZGVMYWJlbFZhbHVlID0gKFNpbXBsZURhdGFFeGNoYW5nZUxhYmVsVmFsdWUpKChJbnRlZ3JhdGlvbkxhYmVsKWwpLmdldERlbHRhVmFsdWUoKTsNCisJCQkJCU1hcDxOb2RlLCBEb3VibGU+YXJyaXZhbHMgPSBzZGVMYWJlbFZhbHVlLmdldEFycml2YWxzKCk7DQorCQkJCQlNYXA8Tm9kZSwgRG91YmxlPmRlcGFydHVyZXMgPSBzZGVMYWJlbFZhbHVlLmdldERlcGFydHVyZXMoKTsNCisJCQkJCQ0KKwkJCQkJLy8gQXJyaXZhbHMgYXJlIGJpcnRocy4gT2JzZXJ2ZSB0aGF0IGFycml2YWxzIHNob3VsZCBiZSAwIHNpbmNlIA0KKwkJCQkJLy8gb3RoZXIgZGVjb3JhdG9ycyBhcmUgZGlzZWFzZSBtb2RlbHMgdGhhdCBkb24ndCBjYXVzZSBhbiAiaW5jcmVhc2UiDQorCQkJCQkvLyBpbiBiaXJ0aHMuDQorCQkJCQkNCisJCQkJCWlmKGFycml2YWxzICE9IG51bGwpIHsNCisJCQkJCQlmb3IgKEVudHJ5PE5vZGUsRG91YmxlPiBlbnRyeSA6IGFycml2YWxzLmVudHJ5U2V0KCkpIHsNCisJCQkJCQkJaWYoZW50cnkuZ2V0S2V5KCkuZXF1YWxzKG4pKSB7DQorCQkJCQkJCQkvLyBPbmx5IHRoZSBsb2NhbCBub2RlIG1ha2VzIHNlbnNlIGZvciBkaXNlYXNlIG1vZGVscw0KKwkJCQkJCQkJbXlEZWx0YS5zZXRDb3VudChteURlbHRhLmdldENvdW50KCkrZW50cnkuZ2V0VmFsdWUoKS5kb3VibGVWYWx1ZSgpKTsNCisJCQkJCQkJCW15RGVsdGEuc2V0QmlydGhzKG15RGVsdGEuZ2V0QmlydGhzKCkrZW50cnkuZ2V0VmFsdWUoKS5kb3VibGVWYWx1ZSgpKTsNCisJCQkJCQkJfQ0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJCS8vIERlcGFydHVyZXMgYXJlIGRlYXRocyANCisJCQkJCWlmKGRlcGFydHVyZXMgIT0gbnVsbCkgew0KKwkJCQkJCS8vZm9yKE5vZGUgbjI6ZGVwYXJ0dXJlcy5rZXlTZXQoKSkgew0KKwkJCQkJCWZvciAoRW50cnk8Tm9kZSxEb3VibGU+IGVudHJ5IDogZGVwYXJ0dXJlcy5lbnRyeVNldCgpKSB7DQorCQkJCQkJCU5vZGUgbjIgPSBlbnRyeS5nZXRLZXkoKTsNCisJCQkJCQkJaWYobjIuZXF1YWxzKG4pKSB7Ly8gT25seSB0aGUgbG9jYWwgbm9kZSBtYWtlcyBzZW5zZSBmb3IgZGlzZWFzZSBtb2RlbHMNCisJCQkJCQkJCW15RGVsdGEuc2V0Q291bnQobXlEZWx0YS5nZXRDb3VudCgpIC0gZW50cnkuZ2V0VmFsdWUoKSk7DQorCQkJCQkJCQlteURlbHRhLnNldERlYXRocyhteURlbHRhLmdldERlYXRocygpK2VudHJ5LmdldFZhbHVlKCkpOw0KKwkJCQkJCQl9DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJfQ0KKwl9DQorCQ0KKwkNCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTWlncmF0aW9uKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxJbXBsIGxhYmVsLCBNYXA8Tm9kZSwgRG91YmxlPmFycml2YWxzLE1hcDxOb2RlLCBEb3VibGU+ZGVwYXJ0dXJlcywgbG9uZyB0aW1lcGVyaW9kLCBsb25nIHRpbWVEZWx0YSwgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSW1wbCBkZWx0YSkgew0KKwkJTm9kZSBuID0gKE5vZGUpbGFiZWwuZ2V0SWRlbnRpZmlhYmxlKCk7DQorCQkNCisJCWZvcihFZGdlIGU6bi5nZXRFZGdlcygpKSB7DQorCQkJaWYoZSBpbnN0YW5jZW9mIE1pZ3JhdGlvbkVkZ2UpIHsNCisJCQkJTWlncmF0aW9uRWRnZSBtZSA9IChNaWdyYXRpb25FZGdlKWU7DQorCQkJCWlmKCFtZS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpLmVxdWFscyhsYWJlbC5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpKSkgY29udGludWU7DQorCQkJCQ0KKwkJCQkvLyBNaWdyYXRpb24gaXMgRlJPTSBBIFRPIEINCisJCQkJTm9kZSBzb3VyY2UgPSBtZS5nZXRBKCk7DQorCQkJCU5vZGUgZGVzdCA9IG1lLmdldEIoKTsNCisJCQkJDQorCQkJDQorCQkJCQ0KKwkJCQlib29sZWFuIGxlYXZpbmcgPSBzb3VyY2UuZXF1YWxzKG4pOw0KKwkJCQlkb3VibGUgcmF0ZSA9IG1lLmdldExhYmVsKCkuZ2V0Q3VycmVudFZhbHVlKCkuZ2V0TWlncmF0aW9uUmF0ZSgpOwkJCQkNCisJCQkJaWYobGVhdmluZykgew0KKwkJCQkJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIHZhbCA9ICgoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKSBsYWJlbC5nZXRUZW1wVmFsdWUoKSk7IC8vIFNob3VsZCBiZSBwcm9iZSB2YWx1ZQ0KKwkJCQkJZG91YmxlIGNvdW50ID0gdmFsLmdldENvdW50KCk7DQorCQkJCQlkb3VibGUgZ29vZGJ5ZSA9IGNvdW50KnJhdGUqKGRvdWJsZSl0aW1lRGVsdGEvKGRvdWJsZSl0aW1lUGVyaW9kOyAvLyByZXNjYWxlIGFuZCBhZGp1c3QNCisJCQkJCWRlbHRhLnNldENvdW50KGRlbHRhLmdldENvdW50KCktZ29vZGJ5ZSk7DQorCQkJCQlkZWx0YS5nZXREZXBhcnR1cmVzKCkucHV0KGRlc3QsIGdvb2RieWUpOw0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJLy8gRmluZCB0aGUgcG9wdWxhdGlvbiBtb2RlbCBsYWJlbCBvbiB0aGUgZGVzdCBub2RlDQorCQkJCQlTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgb3RoZXJWYWwgPSBudWxsOw0KKwkJCQkJZm9yKE5vZGVMYWJlbCBsYWI6c291cmNlLmdldExhYmVscygpKSB7DQorCQkJCQkJaWYobGFiIGluc3RhbmNlb2YgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCAmJiAoKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwpbGFiKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpLmVxdWFscyhsYWJlbC5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpKSkgew0KKwkJCQkJCQlvdGhlclZhbCA9ICgoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbClsYWIpLmdldFRlbXBWYWx1ZSgpOw0KKwkJCQkJCQlicmVhazsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCQlpZihvdGhlclZhbCA9PSBudWxsKSB7DQorCQkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJGb3VuZCBhIG1pZ3JhdGlvbiBlZGdlIGJ1dCB3YXMgbm90IGFibGUgdG8gZmluZCB0aGUgcG9wdWxhdGlvbiBtb2RlbCBsYWJlbCBmb3Igbm9kZSAiK2Rlc3QrIiBwb3B1bGF0aW9uICIrbGFiZWwuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSwgbmV3IEV4Y2VwdGlvbigpKTsNCisJCQkJCQlyZXR1cm47DQorCQkJCQl9DQorCQkJCQlkb3VibGUgY291bnQgPSBvdGhlclZhbC5nZXRDb3VudCgpOw0KKwkJCQkJZG91YmxlIHdlbGNvbWUgPSBjb3VudCpyYXRlKihkb3VibGUpdGltZURlbHRhLyhkb3VibGUpdGltZVBlcmlvZDsgLy8gcmVzY2FsZSBhbmQgYWRqdXN0DQorCQkJCQlkZWx0YS5zZXRDb3VudChkZWx0YS5nZXRDb3VudCgpK3dlbGNvbWUpOw0KKwkJCQkJZGVsdGEuZ2V0QXJyaXZhbHMoKS5wdXQoc291cmNlLCB3ZWxjb21lKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKwkNCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGlwZVRyYW5zcG9ydChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsSW1wbCBwb3B1bGF0aW9uTGFiZWwsIE1hcDxOb2RlLCBEb3VibGU+YXJyaXZhbHMsTWFwPE5vZGUsIERvdWJsZT5kZXBhcnR1cmVzLCBsb25nIHRpbWVEZWx0YSwgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSW1wbCBkZWx0YSkgew0KKwkJLy8gR2V0IHRoZSBwaXBlIHRyYW5zcG9ydCBlZGdlcyB0by9mcm9tIHRoZSBub2RlDQorCQlOb2RlIG5vZGUgPSBwb3B1bGF0aW9uTGFiZWwuZ2V0Tm9kZSgpOw0KKwkJTGlzdDxQaXBlVHJhbnNwb3J0RWRnZT5wZWRnZXMgPSBwaXBlVHJhbnNwb3J0YXRpb25Ob2RlRWRnZXNNYXAuZ2V0KG5vZGUpOw0KKwkJaWYocGVkZ2VzID09IG51bGwpIHJldHVybjsgLy8gbm8gZWRnZXMNCisJCQ0KKwkJZm9yKFBpcGVUcmFuc3BvcnRFZGdlIHBlZGdlOnBlZGdlcykgew0KKwkJCWlmKCFwZWRnZS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpLmVxdWFscyhwb3B1bGF0aW9uTGFiZWwuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSkpIGNvbnRpbnVlOyAvLyB3cm9uZyBwb3B1bGF0aW9uDQorCQkJDQorCQkJYm9vbGVhbiBpbmNvbW1pbmcgPSBwZWRnZS5nZXRCKCkuZXF1YWxzKG5vZGUpOw0KKwkJCWlmKGluY29tbWluZykgew0KKwkJCQlmb3IoTm9kZUxhYmVsIGxhYjogcGVkZ2UuZ2V0QSgpLmdldExhYmVscygpKSB7DQorCQkJCQlpZihsYWIgaW5zdGFuY2VvZiBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsICYmICgoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbClsYWIpLmdldERlY29yYXRvcigpID09IHRoaXMpIHsNCisJCQkJCQkvLyBNYWtlIHN1cmUgdGhlIHRhcmdldCBub2RlIGhhcyBhIHBvcHVsYXRpb24gbW9kZWwgbGFiZWwNCisJCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7DQorCQkJCQkJZm9yKE5vZGVMYWJlbCBvdGhlckxhYjpwZWRnZS5nZXRCKCkuZ2V0TGFiZWxzKCkpIHsNCisJCQkJCQkJaWYob3RoZXJMYWIgaW5zdGFuY2VvZiBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsICYmDQorCQkJCQkJCQkJKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsKW90aGVyTGFiKS5nZXREZWNvcmF0b3IoKS5lcXVhbHMoKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsKWxhYikuZ2V0RGVjb3JhdG9yKCkpKQ0KKwkJCQkJCQkJCXtmb3VuZD10cnVlO2JyZWFrO30NCisJCQkJCQl9DQorCQkJCQkJaWYoIWZvdW5kKSBjb250aW51ZTsgLy8gc2tpcCBlZGdlDQorCQkJCQkJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCBvdGhlckxhYmVsID0gKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwpbGFiOw0KKwkJCQkJCVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBvdGhlclZhbHVlID0gKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSlvdGhlckxhYmVsLmdldFRlbXBWYWx1ZSgpOw0KKwkJCQkJCVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBjaGFuZ2UgPSAoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKUVjb3JlVXRpbC5jb3B5KG90aGVyVmFsdWUpOw0KKwkJCQkJCVBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSBlZGdlTGFiZWxWYWx1ZSA9ICAoUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlKXBlZGdlLmdldExhYmVsKCkuZ2V0Q3VycmVudFZhbHVlKCk7DQorCQkJCQkJZG91YmxlIG1heEZsb3cgPSBlZGdlTGFiZWxWYWx1ZS5nZXRNYXhGbG93KCk7DQorCQkJCQkJZG91YmxlIGZsb3cgPSBtYXhGbG93Ow0KKwkJCQkJCWRvdWJsZSBwb3BDb3VudCA9ICgoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKW90aGVyTGFiZWwuZ2V0VGVtcFZhbHVlKCkpLmdldENvdW50KCk7DQorCQkJCQkJaWYoZmxvdyA+IHBvcENvdW50KSANCisJCQkJCQkJZmxvdyA9IHBvcENvdW50OyAvLyBkb24ndCBtb3ZlIG1vcmUgcGVvcGxlIHRoYW4gYXZhaWxhYmxlLg0KKwkJCQkJCWxvbmcgdGltZVBlcmlvZCA9IGVkZ2VMYWJlbFZhbHVlLmdldFRpbWVQZXJpb2QoKTsNCisJCQkJCQlkb3VibGUgZmFjdG9yID0gZmxvdyAvIHBvcENvdW50Ow0KKwkJCQkJCQ0KKwkJCQkJCWZhY3RvciA9IGZhY3RvciAqIHRpbWVEZWx0YSAvIHRpbWVQZXJpb2Q7DQorCQkJCQkJaWYoRG91YmxlLmlzTmFOKGZhY3RvcikgfHwgRG91YmxlLmlzSW5maW5pdGUoZmFjdG9yKSkgZmFjdG9yID0gMC4wOw0KKwkJCQkJCWNoYW5nZS5zY2FsZShmYWN0b3IpOw0KKwkJCQkJCQ0KKwkJCQkJCWRlbHRhLmFkZCgoSW50ZWdyYXRpb25MYWJlbFZhbHVlKWNoYW5nZSk7DQorCQkJCQkJZGVsdGEuZ2V0QXJyaXZhbHMoKS5wdXQocGVkZ2UuZ2V0QSgpLCBjaGFuZ2UuZ2V0Q291bnQoKSk7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9IGVsc2UgeyAvLyBvdXRnb2luZyBlZGdlDQorCQkJCWZvcihOb2RlTGFiZWwgbGFiOiBwZWRnZS5nZXRBKCkuZ2V0TGFiZWxzKCkpIHsNCisJCQkJCWlmKGxhYiBpbnN0YW5jZW9mIFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwgJiYgKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsKWxhYikuZ2V0RGVjb3JhdG9yKCkgPT0gdGhpcykgew0KKwkJCQkJCS8vIE1ha2Ugc3VyZSB0aGUgdGFyZ2V0IG5vZGUgaGFzIGEgZGlzZWFzZSBtb2RlbCBkZWNvcmF0b3INCisJCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7DQorCQkJCQkJZm9yKE5vZGVMYWJlbCBvdGhlckxhYjpwZWRnZS5nZXRCKCkuZ2V0TGFiZWxzKCkpIHsNCisJCQkJCQkJaWYob3RoZXJMYWIgaW5zdGFuY2VvZiBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsICYmDQorCQkJCQkJCQkJKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsKW90aGVyTGFiKS5nZXREZWNvcmF0b3IoKS5lcXVhbHMoKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsKWxhYikuZ2V0RGVjb3JhdG9yKCkpKQ0KKwkJCQkJCQkJCXtmb3VuZD10cnVlO2JyZWFrO30NCisJCQkJCQl9DQorCQkJCQkJaWYoIWZvdW5kKSBjb250aW51ZTsgLy8gc2tpcCBlZGdlDQorCQkJCQkJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCB0aGlzTGFiZWwgPSAoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbClsYWI7DQorCQkJCQkJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIHRoaXNWYWx1ZSA9IChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpdGhpc0xhYmVsLmdldFRlbXBWYWx1ZSgpOw0KKwkJCQkJCVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBjaGFuZ2UgPSAoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKUVjb3JlVXRpbC5jb3B5KHRoaXNWYWx1ZSk7DQorCQkJCQkJUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlIGVkZ2VMYWJlbFZhbHVlID0gIChQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUpcGVkZ2UuZ2V0TGFiZWwoKS5nZXRDdXJyZW50VmFsdWUoKTsNCisJCQkJCQlkb3VibGUgbWF4RmxvdyA9IGVkZ2VMYWJlbFZhbHVlLmdldE1heEZsb3coKTsNCisJCQkJCQlkb3VibGUgcG9wQ291bnQgPSAoKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSl0aGlzTGFiZWwuZ2V0VGVtcFZhbHVlKCkpLmdldENvdW50KCk7DQorCQkJCQkJZG91YmxlIGZsb3cgPSBtYXhGbG93Ow0KKwkJCQkJCWlmKGZsb3cgPiBwb3BDb3VudCkgDQorCQkJCQkJCWZsb3cgPSBwb3BDb3VudDsNCisJCQkJCQlsb25nIHRpbWVQZXJpb2QgPSBlZGdlTGFiZWxWYWx1ZS5nZXRUaW1lUGVyaW9kKCk7DQorCQkJCQkJZG91YmxlIGZhY3RvciA9IGZsb3cgLyBwb3BDb3VudDsNCisJCQkJCQlmYWN0b3IgPSBmYWN0b3IgKiB0aW1lRGVsdGEgLyB0aW1lUGVyaW9kOw0KKwkJCQkJCWlmKERvdWJsZS5pc05hTihmYWN0b3IpIHx8IERvdWJsZS5pc0luZmluaXRlKGZhY3RvcikpIGZhY3RvciA9IDAuMDsNCisJCQkJCQljaGFuZ2Uuc2NhbGUoZmFjdG9yKTsNCisJCQkJCQkNCisJCQkJCQlkZWx0YS5zdWIoKEludGVncmF0aW9uTGFiZWxWYWx1ZSljaGFuZ2UpOw0KKwkJCQkJCWRlbHRhLmdldERlcGFydHVyZXMoKS5wdXQocGVkZ2UuZ2V0QigpLCBjaGFuZ2UuZ2V0Q291bnQoKSk7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQl9IC8vIGZvciBlYWNoIGVkZ2UJCQ0KKwl9DQorCQ0KKwlwcm90ZWN0ZWQgZG91YmxlIGFkanVzdFJhdGUoZG91YmxlIHJhdGUsIGxvbmcgcmF0ZVBlcmlvZCwgbG9uZyBhY3R1YWxQZXJpb2QpIHsNCisJCXJldHVybiByYXRlICogKChkb3VibGUpYWN0dWFsUGVyaW9kLyhkb3VibGUpcmF0ZVBlcmlvZCk7DQorCX0NCisJDQorCXB1YmxpYyB2b2lkIGRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKExhYmVsVmFsdWUgbGFiZWwpIHsNCisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCisJCQ0KKwl9DQorDQorCQ0KKwlwdWJsaWMgYm9vbGVhbiBpc0RldGVybWluaXN0aWMoKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KKwlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikNCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQaXBlU3lzdGVtTm9kZXMoKSB7DQorCQlHcmFwaCBncmFwaCA9IHRoaXMuZ2V0R3JhcGgoKTsNCisJCQ0KKwkJaWYocGlwZVRyYW5zcG9ydGF0aW9uVXBFZGdlc01hcCA9PSBudWxsIHx8IHBpcGVUcmFuc3BvcnRhdGlvbkRvd25FZGdlc01hcCA9PSBudWxsKSB7DQorCQkJaW5pdFBpcGVUcmFuc3BvcnQoZ3JhcGgpOw0KKwkJfQ0KKwkJTWFwPEludGVnZXIsIExpc3Q8UGlwZVRyYW5zcG9ydEVkZ2U+PiBtYXAgPSBwaXBlVHJhbnNwb3J0YXRpb25VcEVkZ2VzTWFwOw0KKwkJDQorCQlJbnRlZ2VyIFtdIGxldmVscyA9IG5ldyBJbnRlZ2VyW21hcC5rZXlTZXQoKS5zaXplKCldOw0KKwkJbGV2ZWxzID0gbWFwLmtleVNldCgpLnRvQXJyYXkobGV2ZWxzKTsNCisJCUFycmF5cy5zb3J0KGxldmVscywgMCwgbGV2ZWxzLmxlbmd0aCwgDQorCQkJCW5ldyBDb21wYXJhdG9yPEludGVnZXI+KCkgew0KKwkJCQkJcHVibGljIGludCBjb21wYXJlKEludGVnZXIgbzEsIEludGVnZXIgbzIpIHsNCisJCQkJCQlpZihvMSA8IG8yKSByZXR1cm4gMTsNCisJCQkJCWVsc2UgaWYobzEgPiBvMikgcmV0dXJuIC0xOw0KKwkJCQkJCXJldHVybiAwOw0KKwkJCQkJfQ0KKwkJfSk7DQorCQkNCisJCQ0KKwkJZm9yKGludCBsZXZlbCA6IGxldmVscykgew0KKwkJCUxpc3Q8UGlwZVRyYW5zcG9ydEVkZ2U+IGVkZ2VzID0gbWFwLmdldChsZXZlbCk7DQorCQkJDQorCQkJZm9yKFBpcGVUcmFuc3BvcnRFZGdlIHB0ZWRnZTplZGdlcykgew0KKwkJCQkvLyBNb3ZlIHBlb3BsZSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiB1c2luZyB0aGUgZmxvdyBvZiB0aGUgcGlwZQ0KKwkJCQlOb2RlIHNvdXJjZSA9IHB0ZWRnZS5nZXRBKCk7DQorCQkJCU5vZGUgZGVzdCA9IHB0ZWRnZS5nZXRCKCk7DQorCQkJCWlmKHNvdXJjZSA9PSBudWxsIHx8IGRlc3QgPT0gbnVsbCkgY29udGludWU7IC8vIG9rLCB0aGUgcmVnaW9uIG9yIHRyYW5zcG9ydCBzeXN0ZW0gaXMgbm90IHBhcnQgb2YgdGhlIG1vZGVsDQorCQkJCQ0KKwkJCQlQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUgbGFiZWwgPSAoUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlKSBwdGVkZ2UuZ2V0TGFiZWwoKS5nZXRDdXJyZW50VmFsdWUoKTsNCisJCQkJZG91YmxlIG1heGZsb3cgPSBsYWJlbC5nZXRNYXhGbG93KCk7DQorCQkJCQ0KKwkJCQlQb3B1bGF0aW9uTW9kZWxMYWJlbCBzcmNMYWJlbD0gbnVsbDsNCisJCQkJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIG5leHRzcmNsYWJlbHZhbD1udWxsLCBuZXh0ZGVzdGxhYmVsdmFsPW51bGwsIGN1cnJzcmNsYWJlbHZhbD1udWxsLCBjdXJyZGVzdGxhYmVsdmFsPW51bGw7DQorCQkJCVN0cmluZyBwb3BJZFNyYz1udWxsOw0KKwkJCQlmb3IoTm9kZUxhYmVsIG5sYWJlbDpzb3VyY2UuZ2V0TGFiZWxzKCkpIHsNCisJCQkJCWlmKG5sYWJlbCBpbnN0YW5jZW9mIFBvcHVsYXRpb25Nb2RlbExhYmVsKSB7DQorCQkJCQkJY3VycnNyY2xhYmVsdmFsID0gKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSkoKFBvcHVsYXRpb25Nb2RlbExhYmVsKW5sYWJlbCkuZ2V0Q3VycmVudFZhbHVlKCk7DQorCQkJCQkJbmV4dHNyY2xhYmVsdmFsID0gKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSkoKFBvcHVsYXRpb25Nb2RlbExhYmVsKW5sYWJlbCkuZ2V0TmV4dFZhbHVlKCk7DQorCQkJCQkJcG9wSWRTcmMgPSAoKFBvcHVsYXRpb25Nb2RlbExhYmVsKW5sYWJlbCkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKTsNCisJCQkJCQlzcmNMYWJlbCA9IChQb3B1bGF0aW9uTW9kZWxMYWJlbClubGFiZWw7DQorCQkJCQl9IGVsc2UgY29udGludWU7DQorCQkJCQ0KKwkJCQkJZm9yKE5vZGVMYWJlbCBubGFiZWwyOmRlc3QuZ2V0TGFiZWxzKCkpIHsNCisJCQkJCQlpZihubGFiZWwyIGluc3RhbmNlb2YgUG9wdWxhdGlvbk1vZGVsTGFiZWwgJiYNCisJCQkJCQkJCSgoUG9wdWxhdGlvbk1vZGVsTGFiZWwpbmxhYmVsMikuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKS5lcXVhbHMocG9wSWRTcmMpKSB7DQorCQkJCQkJCWN1cnJkZXN0bGFiZWx2YWwgPSAoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKSgoUG9wdWxhdGlvbk1vZGVsTGFiZWwpbmxhYmVsMikuZ2V0Q3VycmVudFZhbHVlKCk7DQorCQkJCQkJCW5leHRkZXN0bGFiZWx2YWwgID0gIChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpKChQb3B1bGF0aW9uTW9kZWxMYWJlbClubGFiZWwyKS5nZXROZXh0VmFsdWUoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCQkNCisJCQkJCWlmKGN1cnJzcmNsYWJlbHZhbCA9PSBudWxsIHx8IGN1cnJkZXN0bGFiZWx2YWwgPT0gbnVsbCkgew0KKwkJCQkJCWNvbnRpbnVlOyAvLyBwb3NzaWJsZSBmb3IgdHJhbnNwb3J0IHBpcGVzIGNvbm5lY3RlZCB0byByZWdpb25zIGFib3ZlIHRoZSBsb3dlc3QgcmVnaW9uIHBhcnQgb2YgdGhlIG1vZGVsDQorCQkJCQl9DQorCQkJCQkNCisJCQkJCS8vIENoZWNrLCBtYWtlIHN1cmUgd2UgZG9uJ3QgbW92ZSBtb3JlIHBlb3BsZSB0aGFuIGF2YWlsYWJsZQ0KKwkJCQkJDQorCQkJCQlkb3VibGUgZmxvdyA9IG1heGZsb3c7CQ0KKwkJCQkJaWYoY3VycnNyY2xhYmVsdmFsLmdldENvdW50KCkgPCBmbG93KSBmbG93ID0gY3VycnNyY2xhYmVsdmFsLmdldENvdW50KCk7IC8vIGNoZWNrDQorCQkJCQkNCisJCQkJCWRvdWJsZSBmYWN0b3IgPSBmbG93IC8gY3VycnNyY2xhYmVsdmFsLmdldENvdW50KCk7DQorCQkJCQlpZihEb3VibGUuaXNOYU4oZmFjdG9yKSkgZmFjdG9yID0gMC4wOw0KKwkJCQkJDQorCQkJCQlTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgbW92ZSA9IG51bGw7DQorCQkJCQkNCisJCQkJCW1vdmUgPSAoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKUVjb3JlVXRpbC5jb3B5KGN1cnJzcmNsYWJlbHZhbCk7DQorCQkJCQkNCisJCQkJCW1vdmUuc2NhbGUoZmFjdG9yKTsNCisJCQkJDQorCQkJCQljdXJyZGVzdGxhYmVsdmFsLmFkZCgoSW50ZWdyYXRpb25MYWJlbFZhbHVlKW1vdmUpOw0KKwkJCQl9IC8vIGZvciBlYWNoIGxhYmVsIG9uIHRoZSBzb3VyY2Ugbm9kZQ0KKwkJCX0NCisJCX0NCisJCQ0KKwkJLy8gQ2hlY2sgZm9yIG5vZGVzIHRoYXQgaGF2ZSBubyBpbml0aWFsIHBvcHVsYXRpb24uIEdldCByaWQgb2YgdGhvc2UNCisJCUFycmF5TGlzdDxOb2RlPm5vZGVzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7DQorCQlmb3IoTm9kZSBuOnBpcGVUcmFuc3BvcnRhdGlvbk5vZGVFZGdlc01hcC5rZXlTZXQoKSkgew0KKwkJCWJvb2xlYW4gcmVtb3ZlID0gZmFsc2U7DQorCQkJaWYoIChuIGluc3RhbmNlb2YgUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtSW1wbCkpIHsNCisJCQkJUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtSW1wbCBwc3RzID0gKFBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbUltcGwpbjsNCisJCQkJZm9yKE5vZGVMYWJlbCBsOnBzdHMuZ2V0TGFiZWxzKCkpIHsNCisJCQkJCWlmKGwgaW5zdGFuY2VvZiBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsKSB7DQorCQkJCQkJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCBzbCA9IChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsKWw7DQorCQkJCQkJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIHNsdiA9IChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpc2wuZ2V0Q3VycmVudFZhbHVlKCk7DQorCQkJCQkJaWYoc2x2LmdldENvdW50KCkgPT0gMC4wKSB7DQorCQkJCQkJCXJlbW92ZSA9IHRydWU7YnJlYWs7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQkJaWYocmVtb3ZlKWJyZWFrOw0KKwkJCQl9DQorCQkJCUFycmF5TGlzdDxQaXBlVHJhbnNwb3J0RWRnZT5lZGdlc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdDxQaXBlVHJhbnNwb3J0RWRnZT4oKTsNCisJCQkJaWYocmVtb3ZlKSB7DQorCQkJCQlBY3RpdmF0b3IubG9nSW5mb3JtYXRpb24oIldhcm5pbmcsIGlnbm9yaW5nIGFpciB0cmFuc3BvcnRhdGlvbiBub2RlIHdpdGhvdXQgcG9wdWxhdGlvbiAiK24sIG5ldyBFeGNlcHRpb24oKSk7DQorCQkJCQlub2Rlc1RvUmVtb3ZlLmFkZChuKTsNCisJCQkJCS8vIFJlbW92ZSBhbGwgYWlyIHRyYW5zcG9ydCBlZGdlcyB1c2luZyB0aGUgbm9kZSBhcyB3ZWxsIGFzIHRoZSBub2RlIGl0c2VsZg0KKwkJCQkJZm9yKExpc3Q8UGlwZVRyYW5zcG9ydEVkZ2U+bCA6cGlwZVRyYW5zcG9ydGF0aW9uRG93bkVkZ2VzTWFwLnZhbHVlcygpKSB7DQorCQkJCQkJZm9yKFBpcGVUcmFuc3BvcnRFZGdlIHBzZTpsKSB7DQorCQkJCQkJCWlmKHBzZS5nZXRBKCkgPT0gbnVsbCB8fCBwc2UuZ2V0QigpID09IG51bGwpIGNvbnRpbnVlOw0KKwkJCQkJCQlpZihwc2UuZ2V0QSgpLmVxdWFscyhuKSB8fCBwc2UuZ2V0QigpLmVxdWFscyhuKSkgew0KKwkJCQkJCQkJaWYoIWVkZ2VzVG9SZW1vdmUuY29udGFpbnMocHNlKSllZGdlc1RvUmVtb3ZlLmFkZChwc2UpOw0KKwkJCQkJCQl9DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQkJZm9yKExpc3Q8UGlwZVRyYW5zcG9ydEVkZ2U+bCA6cGlwZVRyYW5zcG9ydGF0aW9uVXBFZGdlc01hcC52YWx1ZXMoKSkgew0KKwkJCQkJCWZvcihQaXBlVHJhbnNwb3J0RWRnZSBwc2U6bCkgew0KKwkJCQkJCQlpZihwc2UuZ2V0QSgpID09IG51bGwgfHwgcHNlLmdldEIoKSA9PSBudWxsKSBjb250aW51ZTsNCisJCQkJCQkJaWYocHNlLmdldEEoKS5lcXVhbHMobikgfHwgcHNlLmdldEIoKS5lcXVhbHMobikpIHsNCisJCQkJCQkJCWlmKCFlZGdlc1RvUmVtb3ZlLmNvbnRhaW5zKHBzZSkpZWRnZXNUb1JlbW92ZS5hZGQocHNlKTsNCisJCQkJCQkJfQ0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJCWZvcihQaXBlVHJhbnNwb3J0RWRnZSBwc2U6ZWRnZXNUb1JlbW92ZSkgeyANCisJCQkJCQlmb3IoTGlzdDxQaXBlVHJhbnNwb3J0RWRnZT5sIDpwaXBlVHJhbnNwb3J0YXRpb25Eb3duRWRnZXNNYXAudmFsdWVzKCkpDQorCQkJCQkJCWwucmVtb3ZlKHBzZSk7DQorCQkJCQkJZm9yKExpc3Q8UGlwZVRyYW5zcG9ydEVkZ2U+bCA6cGlwZVRyYW5zcG9ydGF0aW9uVXBFZGdlc01hcC52YWx1ZXMoKSkNCisJCQkJCQkJbC5yZW1vdmUocHNlKTsNCisJCQkJCX0NCisJCQkJCWZvcihQaXBlVHJhbnNwb3J0RWRnZSBwc2U6ZWRnZXNUb1JlbW92ZSkgeyANCisJCQkJCQlmb3IoTGlzdDxQaXBlVHJhbnNwb3J0RWRnZT5sIDpwaXBlVHJhbnNwb3J0YXRpb25Ob2RlRWRnZXNNYXAudmFsdWVzKCkpDQorCQkJCQkJCWwucmVtb3ZlKHBzZSk7DQorCQkJCQkJZm9yKExpc3Q8UGlwZVRyYW5zcG9ydEVkZ2U+bCA6cGlwZVRyYW5zcG9ydGF0aW9uTm9kZUVkZ2VzTWFwLnZhbHVlcygpKQ0KKwkJCQkJCQlsLnJlbW92ZShwc2UpOw0KKwkJCQkJfQ0KKwkJCQkJDQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlmb3IoTm9kZSBuOm5vZGVzVG9SZW1vdmUpIHBpcGVUcmFuc3BvcnRhdGlvbk5vZGVFZGdlc01hcC5yZW1vdmUobik7DQorCX0NCisJDQorCS8qKg0KKwkgKiBpbml0aWFsaXplIHBpcGUgdHJhbnNwb3J0IG1hcHMgb3JnYW5pemluZyBwaXBlcyBieSBkaXJlY3Rpb24gKHVwL2Rvd24pDQorCSAqIGFuZCBsZXZlbA0KKwkgKiBAcGFyYW0gZ3JhcGgNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQ0KKwlwcml2YXRlIHZvaWQgaW5pdFBpcGVUcmFuc3BvcnQoR3JhcGggZ3JhcGgpIHsNCisJCXBpcGVUcmFuc3BvcnRhdGlvblVwRWRnZXNNYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBMaXN0PFBpcGVUcmFuc3BvcnRFZGdlPj4oKTsNCisJCXBpcGVUcmFuc3BvcnRhdGlvbkRvd25FZGdlc01hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIExpc3Q8UGlwZVRyYW5zcG9ydEVkZ2U+PigpOw0KKwkJcGlwZVRyYW5zcG9ydGF0aW9uTm9kZUVkZ2VzTWFwID0gbmV3IEhhc2hNYXA8Tm9kZSwgTGlzdDxQaXBlVHJhbnNwb3J0RWRnZT4+KCk7DQorCQkvLyBUcmF2ZXJzZSBhbGwgcGlwZSB0cmFuc3BvcnQgZWRnZXMgYW5kIGRldGVybWluZSB3aGF0DQorCQkvLyBnZW9ncmFwaGljIGxldmVsIHRoZWlyIHNvdXJjZSAoQSkgbm9kZSBpcyBhdA0KKwkJZm9yKFVSSSBlZGdlVVJJIDogZ3JhcGguZ2V0RWRnZXMoKS5rZXlTZXQoKSkgew0KKwkJCUVkZ2UgZWRnZSA9IGdyYXBoLmdldEVkZ2VzKCkuZ2V0KGVkZ2VVUkkpOw0KKwkJCQ0KKwkJCWlmKGVkZ2UgaW5zdGFuY2VvZiBQaXBlVHJhbnNwb3J0RWRnZSkgew0KKwkJCQlQaXBlVHJhbnNwb3J0RWRnZSBwZWRnZSA9IChQaXBlVHJhbnNwb3J0RWRnZSllZGdlOw0KKwkJCQlpbnQgYmVnaW5MZXZlbCA9IFV0aWxpdHkua2V5TGV2ZWwoZWRnZS5nZXROb2RlQVVSSSgpLmxhc3RTZWdtZW50KCkpOw0KKwkJCQlpbnQgZW5kTGV2ZWwgPSBVdGlsaXR5LmtleUxldmVsKGVkZ2UuZ2V0Tm9kZUJVUkkoKS5sYXN0U2VnbWVudCgpKTsNCisJCQkJDQorCQkJCU1hcDxJbnRlZ2VyLCBMaXN0PFBpcGVUcmFuc3BvcnRFZGdlPj4gbWFwOw0KKwkJCQlpZihiZWdpbkxldmVsID4gZW5kTGV2ZWwpIG1hcCA9IHBpcGVUcmFuc3BvcnRhdGlvblVwRWRnZXNNYXA7DQorCQkJCWVsc2UgbWFwID0gcGlwZVRyYW5zcG9ydGF0aW9uRG93bkVkZ2VzTWFwOw0KKwkJCQkNCisJCQkJaWYobWFwLmNvbnRhaW5zS2V5KGJlZ2luTGV2ZWwpKSB7DQorCQkJCQltYXAuZ2V0KGJlZ2luTGV2ZWwpLmFkZChwZWRnZSk7DQorCQkJCX0gZWxzZSB7DQorCQkJCQlBcnJheUxpc3Q8UGlwZVRyYW5zcG9ydEVkZ2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFBpcGVUcmFuc3BvcnRFZGdlPigpOw0KKwkJCQkJbGlzdC5hZGQocGVkZ2UpOw0KKwkJCQkJbWFwLnB1dChiZWdpbkxldmVsLCBsaXN0KTsNCisJCQkJfQ0KKwkJCQkNCisJCQkJTm9kZSBhID0gZWRnZS5nZXRBKCk7DQorCQkJCU5vZGUgYiA9IGVkZ2UuZ2V0QigpOw0KKwkJCQkNCisJCQkJaWYoYSAhPSBudWxsKQ0KKwkJCQkJaWYocGlwZVRyYW5zcG9ydGF0aW9uTm9kZUVkZ2VzTWFwLmNvbnRhaW5zS2V5KGEpKQ0KKwkJCQkJCXBpcGVUcmFuc3BvcnRhdGlvbk5vZGVFZGdlc01hcC5nZXQoYSkuYWRkKHBlZGdlKTsNCisJCQkJCWVsc2Ugew0KKwkJCQkJCUFycmF5TGlzdDxQaXBlVHJhbnNwb3J0RWRnZT4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8UGlwZVRyYW5zcG9ydEVkZ2U+KCk7DQorCQkJCQkJbmV3TGlzdC5hZGQocGVkZ2UpOw0KKwkJCQkJCXBpcGVUcmFuc3BvcnRhdGlvbk5vZGVFZGdlc01hcC5wdXQoYSwgbmV3TGlzdCk7DQorCQkJCQl9CQ0KKwkJCQkNCisJCQkJaWYoYiAhPSBudWxsKQ0KKwkJCQkJaWYocGlwZVRyYW5zcG9ydGF0aW9uTm9kZUVkZ2VzTWFwLmNvbnRhaW5zS2V5KGIpKQ0KKwkJCQkJCXBpcGVUcmFuc3BvcnRhdGlvbk5vZGVFZGdlc01hcC5nZXQoYikuYWRkKHBlZGdlKTsNCisJCQkJCWVsc2Ugew0KKwkJCQkJCUFycmF5TGlzdDxQaXBlVHJhbnNwb3J0RWRnZT4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8UGlwZVRyYW5zcG9ydEVkZ2U+KCk7DQorCQkJCQkJbmV3TGlzdC5hZGQocGVkZ2UpOw0KKwkJCQkJCXBpcGVUcmFuc3BvcnRhdGlvbk5vZGVFZGdlc01hcC5wdXQoYiwgbmV3TGlzdCk7DQorCQkJCQl9CQ0KKwkJCX0NCisJCX0NCisJfQ0KKwkNCisJCQ0KKwkNCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIHJlc2V0TGFiZWxzKCkgew0KKwkJc3VwZXIucmVzZXRMYWJlbHMoKTsNCisJCS8vIFBvcHVsYXRlIHRoZSBwaXBlIHRyYW5zcG9ydGF0aW9uIHN5c3RlbXMNCisJCXRoaXMucG9wdWxhdGVQaXBlU3lzdGVtTm9kZXMoKTsNCisJfQ0KK30gLy9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzMDJlMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEltcGwuamF2YQpAQCAtMCwwICsxLDQ5MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU2ltcGxlRGF0YUV4Y2hhbmdlTGFiZWxWYWx1ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWU7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsSW1wbCNnZXREZWx0YVZhbHVlIDxlbT5EZWx0YSBWYWx1ZTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxJbXBsI2dldFByb2JlVmFsdWUgPGVtPlByb2JlIFZhbHVlPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEltcGwjZ2V0VGVtcFZhbHVlIDxlbT5UZW1wIFZhbHVlPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEltcGwjZ2V0T3JpZ2luYWxWYWx1ZSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsSW1wbCNnZXRFcnJvclNjYWxlIDxlbT5FcnJvciBTY2FsZTwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxJbXBsIGV4dGVuZHMgUG9wdWxhdGlvbk1vZGVsTGFiZWxJbXBsIGltcGxlbWVudHMgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCB7DQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWx0YVZhbHVlKCkgPGVtPkRlbHRhIFZhbHVlPC9lbT59JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXREZWx0YVZhbHVlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBkZWx0YVZhbHVlOw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvYmVWYWx1ZSgpIDxlbT5Qcm9iZSBWYWx1ZTwvZW0+fScgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0UHJvYmVWYWx1ZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgcHJvYmVWYWx1ZTsNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRlbXBWYWx1ZSgpIDxlbT5UZW1wIFZhbHVlPC9lbT59JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRUZW1wVmFsdWUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIHRlbXBWYWx1ZTsNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yaWdpbmFsVmFsdWUoKSA8ZW0+T3JpZ2luYWwgVmFsdWU8L2VtPn0nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldE9yaWdpbmFsVmFsdWUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIG9yaWdpbmFsVmFsdWU7DQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFcnJvclNjYWxlKCkgPGVtPkVycm9yIFNjYWxlPC9lbT59JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRFcnJvclNjYWxlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBlcnJvclNjYWxlOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEltcGwoKSB7DQorCQlzdXBlcigpOw0KKwkJc2V0Q3VycmVudFZhbHVlKFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKCkpOw0KKwkJc2V0TmV4dFZhbHVlKFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKCkpOw0KKwkJc2V0T3JpZ2luYWxWYWx1ZShTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSgpKTsNCisJCXNldFRlbXBWYWx1ZShTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSgpKTsNCisJCXNldFByb2JlVmFsdWUoU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUoKSk7DQorCQlzZXRFcnJvclNjYWxlKFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKCkpOw0KKwkJc2V0RGVsdGFWYWx1ZShTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSgpKTsNCisJfQ0KKwkNCisJLyoqDQorCSAqIFJldHVybiB0aGUgaWRlbnRpZmllciBmb3IgdGhlIGxhYmVsLCBpLmUuIHRoZSBwb3B1bGF0aW9uIGlkZW50aWZpZXINCisJICogDQorCSAqIEByZXR1cm4gU3RyaW5nIFRoZSBpZGVudGlmaWVyDQorCSAqLw0KKwkNCisJcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgew0KKwkJcmV0dXJuIHRoaXMuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgZ2V0RGVsdGFWYWx1ZSgpIHsNCisJCWlmIChkZWx0YVZhbHVlICE9IG51bGwgJiYgZGVsdGFWYWx1ZS5lSXNQcm94eSgpKSB7DQorCQkJSW50ZXJuYWxFT2JqZWN0IG9sZERlbHRhVmFsdWUgPSAoSW50ZXJuYWxFT2JqZWN0KWRlbHRhVmFsdWU7DQorCQkJZGVsdGFWYWx1ZSA9IChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpZVJlc29sdmVQcm94eShvbGREZWx0YVZhbHVlKTsNCisJCQlpZiAoZGVsdGFWYWx1ZSAhPSBvbGREZWx0YVZhbHVlKSB7DQorCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fREVMVEFfVkFMVUUsIG9sZERlbHRhVmFsdWUsIGRlbHRhVmFsdWUpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gZGVsdGFWYWx1ZTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgYmFzaWNHZXREZWx0YVZhbHVlKCkgew0KKwkJcmV0dXJuIGRlbHRhVmFsdWU7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXREZWx0YVZhbHVlKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBuZXdEZWx0YVZhbHVlKSB7DQorCQlTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgb2xkRGVsdGFWYWx1ZSA9IGRlbHRhVmFsdWU7DQorCQlkZWx0YVZhbHVlID0gbmV3RGVsdGFWYWx1ZTsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fREVMVEFfVkFMVUUsIG9sZERlbHRhVmFsdWUsIGRlbHRhVmFsdWUpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgZ2V0UHJvYmVWYWx1ZSgpIHsNCisJCWlmIChwcm9iZVZhbHVlICE9IG51bGwgJiYgcHJvYmVWYWx1ZS5lSXNQcm94eSgpKSB7DQorCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByb2JlVmFsdWUgPSAoSW50ZXJuYWxFT2JqZWN0KXByb2JlVmFsdWU7DQorCQkJcHJvYmVWYWx1ZSA9IChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpZVJlc29sdmVQcm94eShvbGRQcm9iZVZhbHVlKTsNCisJCQlpZiAocHJvYmVWYWx1ZSAhPSBvbGRQcm9iZVZhbHVlKSB7DQorCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fUFJPQkVfVkFMVUUsIG9sZFByb2JlVmFsdWUsIHByb2JlVmFsdWUpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcHJvYmVWYWx1ZTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgYmFzaWNHZXRQcm9iZVZhbHVlKCkgew0KKwkJcmV0dXJuIHByb2JlVmFsdWU7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRQcm9iZVZhbHVlKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBuZXdQcm9iZVZhbHVlKSB7DQorCQlTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgb2xkUHJvYmVWYWx1ZSA9IHByb2JlVmFsdWU7DQorCQlwcm9iZVZhbHVlID0gbmV3UHJvYmVWYWx1ZTsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fUFJPQkVfVkFMVUUsIG9sZFByb2JlVmFsdWUsIHByb2JlVmFsdWUpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgZ2V0VGVtcFZhbHVlKCkgew0KKwkJaWYgKHRlbXBWYWx1ZSAhPSBudWxsICYmIHRlbXBWYWx1ZS5lSXNQcm94eSgpKSB7DQorCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFRlbXBWYWx1ZSA9IChJbnRlcm5hbEVPYmplY3QpdGVtcFZhbHVlOw0KKwkJCXRlbXBWYWx1ZSA9IChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpZVJlc29sdmVQcm94eShvbGRUZW1wVmFsdWUpOw0KKwkJCWlmICh0ZW1wVmFsdWUgIT0gb2xkVGVtcFZhbHVlKSB7DQorCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fVEVNUF9WQUxVRSwgb2xkVGVtcFZhbHVlLCB0ZW1wVmFsdWUpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gdGVtcFZhbHVlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBiYXNpY0dldFRlbXBWYWx1ZSgpIHsNCisJCXJldHVybiB0ZW1wVmFsdWU7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRUZW1wVmFsdWUoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIG5ld1RlbXBWYWx1ZSkgew0KKwkJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIG9sZFRlbXBWYWx1ZSA9IHRlbXBWYWx1ZTsNCisJCXRlbXBWYWx1ZSA9IG5ld1RlbXBWYWx1ZTsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fVEVNUF9WQUxVRSwgb2xkVGVtcFZhbHVlLCB0ZW1wVmFsdWUpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgZ2V0T3JpZ2luYWxWYWx1ZSgpIHsNCisJCWlmIChvcmlnaW5hbFZhbHVlICE9IG51bGwgJiYgb3JpZ2luYWxWYWx1ZS5lSXNQcm94eSgpKSB7DQorCQkJSW50ZXJuYWxFT2JqZWN0IG9sZE9yaWdpbmFsVmFsdWUgPSAoSW50ZXJuYWxFT2JqZWN0KW9yaWdpbmFsVmFsdWU7DQorCQkJb3JpZ2luYWxWYWx1ZSA9IChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpZVJlc29sdmVQcm94eShvbGRPcmlnaW5hbFZhbHVlKTsNCisJCQlpZiAob3JpZ2luYWxWYWx1ZSAhPSBvbGRPcmlnaW5hbFZhbHVlKSB7DQorCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fT1JJR0lOQUxfVkFMVUUsIG9sZE9yaWdpbmFsVmFsdWUsIG9yaWdpbmFsVmFsdWUpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gb3JpZ2luYWxWYWx1ZTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgYmFzaWNHZXRPcmlnaW5hbFZhbHVlKCkgew0KKwkJcmV0dXJuIG9yaWdpbmFsVmFsdWU7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRPcmlnaW5hbFZhbHVlKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBuZXdPcmlnaW5hbFZhbHVlKSB7DQorCQlTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgb2xkT3JpZ2luYWxWYWx1ZSA9IG9yaWdpbmFsVmFsdWU7DQorCQlvcmlnaW5hbFZhbHVlID0gbmV3T3JpZ2luYWxWYWx1ZTsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fT1JJR0lOQUxfVkFMVUUsIG9sZE9yaWdpbmFsVmFsdWUsIG9yaWdpbmFsVmFsdWUpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgZ2V0RXJyb3JTY2FsZSgpIHsNCisJCWlmIChlcnJvclNjYWxlICE9IG51bGwgJiYgZXJyb3JTY2FsZS5lSXNQcm94eSgpKSB7DQorCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEVycm9yU2NhbGUgPSAoSW50ZXJuYWxFT2JqZWN0KWVycm9yU2NhbGU7DQorCQkJZXJyb3JTY2FsZSA9IChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpZVJlc29sdmVQcm94eShvbGRFcnJvclNjYWxlKTsNCisJCQlpZiAoZXJyb3JTY2FsZSAhPSBvbGRFcnJvclNjYWxlKSB7DQorCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fRVJST1JfU0NBTEUsIG9sZEVycm9yU2NhbGUsIGVycm9yU2NhbGUpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gZXJyb3JTY2FsZTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgYmFzaWNHZXRFcnJvclNjYWxlKCkgew0KKwkJcmV0dXJuIGVycm9yU2NhbGU7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRFcnJvclNjYWxlKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBuZXdFcnJvclNjYWxlKSB7DQorCQlTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgb2xkRXJyb3JTY2FsZSA9IGVycm9yU2NhbGU7DQorCQllcnJvclNjYWxlID0gbmV3RXJyb3JTY2FsZTsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fRVJST1JfU0NBTEUsIG9sZEVycm9yU2NhbGUsIGVycm9yU2NhbGUpKTsNCisJfQ0KKw0KKwkvKioNCisJICogUmVzZXQgdGhlIGR5bmFtaWMgbGFiZWwuIFRoaXMgc2V0cyB0aGUge0BsaW5rIExhYmVsVmFsdWV9cyBiYWNrIHRvIHRoZWlyDQorCSAqIGluaXRpYWwgc3RhdGVzLg0KKwkgKiANCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIg0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIHJlc2V0KCkgew0KKwkJKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpdGhpcy5nZXRDdXJyZW50VmFsdWUoKSkucmVzZXQoKTsNCisJCSgoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKXRoaXMuZ2V0TmV4dFZhbHVlKCkpLnJlc2V0KCk7DQorCQl0aGlzLmdldERlbHRhVmFsdWUoKS5yZXNldCgpOw0KKwkJdGhpcy5nZXRUZW1wVmFsdWUoKS5yZXNldCgpOw0KKwkJdGhpcy5nZXRQcm9iZVZhbHVlKCkucmVzZXQoKTsNCisJCXRoaXMuZ2V0RXJyb3JTY2FsZSgpLnJlc2V0KCk7DQorCQkNCisJCWRvdWJsZSBvcmlnaW5hbENvdW50ID0gdGhpcy5nZXRQb3B1bGF0aW9uTGFiZWwoKS5nZXRDdXJyZW50UG9wdWxhdGlvblZhbHVlKCkuZ2V0Q291bnQoKTsNCisJCSgoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKXRoaXMuZ2V0Q3VycmVudFZhbHVlKCkpLnNldENvdW50KG9yaWdpbmFsQ291bnQpOw0KKwl9DQorCQ0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfX0RFTFRBX1ZBTFVFOg0KKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldERlbHRhVmFsdWUoKTsNCisJCQkJcmV0dXJuIGJhc2ljR2V0RGVsdGFWYWx1ZSgpOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfX1BST0JFX1ZBTFVFOg0KKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFByb2JlVmFsdWUoKTsNCisJCQkJcmV0dXJuIGJhc2ljR2V0UHJvYmVWYWx1ZSgpOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfX1RFTVBfVkFMVUU6DQorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0VGVtcFZhbHVlKCk7DQorCQkJCXJldHVybiBiYXNpY0dldFRlbXBWYWx1ZSgpOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfX09SSUdJTkFMX1ZBTFVFOg0KKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE9yaWdpbmFsVmFsdWUoKTsNCisJCQkJcmV0dXJuIGJhc2ljR2V0T3JpZ2luYWxWYWx1ZSgpOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfX0VSUk9SX1NDQUxFOg0KKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVycm9yU2NhbGUoKTsNCisJCQkJcmV0dXJuIGJhc2ljR2V0RXJyb3JTY2FsZSgpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fREVMVEFfVkFMVUU6DQorCQkJCXNldERlbHRhVmFsdWUoKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19QUk9CRV9WQUxVRToNCisJCQkJc2V0UHJvYmVWYWx1ZSgoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfX1RFTVBfVkFMVUU6DQorCQkJCXNldFRlbXBWYWx1ZSgoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfX09SSUdJTkFMX1ZBTFVFOg0KKwkJCQlzZXRPcmlnaW5hbFZhbHVlKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fRVJST1JfU0NBTEU6DQorCQkJCXNldEVycm9yU2NhbGUoKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fREVMVEFfVkFMVUU6DQorCQkJCXNldERlbHRhVmFsdWUoKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSludWxsKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfX1BST0JFX1ZBTFVFOg0KKwkJCQlzZXRQcm9iZVZhbHVlKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpbnVsbCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19URU1QX1ZBTFVFOg0KKwkJCQlzZXRUZW1wVmFsdWUoKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSludWxsKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfX09SSUdJTkFMX1ZBTFVFOg0KKwkJCQlzZXRPcmlnaW5hbFZhbHVlKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpbnVsbCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19FUlJPUl9TQ0FMRToNCisJCQkJc2V0RXJyb3JTY2FsZSgoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKW51bGwpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19ERUxUQV9WQUxVRToNCisJCQkJcmV0dXJuIGRlbHRhVmFsdWUgIT0gbnVsbDsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19QUk9CRV9WQUxVRToNCisJCQkJcmV0dXJuIHByb2JlVmFsdWUgIT0gbnVsbDsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19URU1QX1ZBTFVFOg0KKwkJCQlyZXR1cm4gdGVtcFZhbHVlICE9IG51bGw7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fT1JJR0lOQUxfVkFMVUU6DQorCQkJCXJldHVybiBvcmlnaW5hbFZhbHVlICE9IG51bGw7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fRVJST1JfU0NBTEU6DQorCQkJCXJldHVybiBlcnJvclNjYWxlICE9IG51bGw7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIFJlc2V0IHRvIHRoZSBjb3JyZWN0IHBvcHVsYXRpb24gdmFsdWUgZm9yIHRoZQ0KKwkgKiBwYXNzZWQgaW4gdGltZQ0KKwkgKiANCisJICogQHBhcmFtIHRpbWUgUmVmZXJlbmNlIHRpbWUNCisJICovDQorCXB1YmxpYyB2b2lkIHJlc2V0KFNURU1UaW1lIHRpbWUpIHsNCisJCVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsIHNwbSA9IChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCl0aGlzLmdldERlY29yYXRvcigpOw0KKwkJUG9wdWxhdGlvbkxhYmVsIHBsYWJlbCA9IHRoaXMuZ2V0UG9wdWxhdGlvbkxhYmVsKCk7DQorCQlpbnQgeWVhciA9IHBsYWJlbC5nZXRWYWxpZFllYXIoKTsNCisJCUNhbGVuZGFyIGMgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOw0KKwkJYy5zZXRUaW1lKHRpbWUuZ2V0VGltZSgpKTsNCisJCWludCBzdGFydFllYXIgPSBjLmdldChDYWxlbmRhci5ZRUFSKTsNCisJCWRvdWJsZSBncm93dGggPSBzcG0uZ2V0QmlydGhSYXRlKCkgLSBzcG0uZ2V0RGVhdGhSYXRlKCk7DQorCQlkb3VibGUgZGFpbHlHcm93dGggPSAoc3BtLmdldFRpbWVQZXJpb2QoKSAvIDg2NDAwMDAwLjApKmdyb3d0aDsNCisJCWRvdWJsZSBkaWZmID0gKChkb3VibGUpc3RhcnRZZWFyIC0gKGRvdWJsZSl5ZWFyKSozNjUuMjU7IC8vIGFwcHJveA0KKwkJZG91YmxlIGN1cnJlbnRQb3B1bGF0aW9uID0gKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpdGhpcy5nZXRDdXJyZW50VmFsdWUoKSkuZ2V0Q291bnQoKTsNCisJCWRhaWx5R3Jvd3RoID0gMS4wICsgZGFpbHlHcm93dGg7DQorCQlkb3VibGUgbmV3UG9wdWxhdGlvbiA9IGN1cnJlbnRQb3B1bGF0aW9uICogTWF0aC5wb3coZGFpbHlHcm93dGgsIGRpZmYpOw0KKwkJKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpdGhpcy5nZXRDdXJyZW50VmFsdWUoKSkuc2V0Q291bnQobmV3UG9wdWxhdGlvbik7CQ0KKwkJLy8gU3RvcmUgdGhlIGFkZGl0aW9ucy9zdWJzdHJhY3Rpb25zIGluIHRoZSBkZWx0YSB2YWx1ZSBzbyB0aGF0IGRpc2Vhc2UgbW9kZWxzIGNhbg0KKwkJLy8gYWRqdXN0IHRoZWlyIGNvdW50cw0KKwkJZG91YmxlIHBvcGRpZmYgPSBuZXdQb3B1bGF0aW9uIC0gY3VycmVudFBvcHVsYXRpb247DQorCQlpZihwb3BkaWZmID4gMC4wKSB7DQorCQkJKChTaW1wbGVEYXRhRXhjaGFuZ2VMYWJlbFZhbHVlKXRoaXMuZ2V0RGVsdGFWYWx1ZSgpKS5nZXRBcnJpdmFscygpLnB1dCh0aGlzLmdldE5vZGUoKSwgcG9wZGlmZik7DQorCQkJdGhpcy5nZXREZWx0YVZhbHVlKCkuc2V0QmlydGhzKHBvcGRpZmYpOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJKChTaW1wbGVEYXRhRXhjaGFuZ2VMYWJlbFZhbHVlKXRoaXMuZ2V0RGVsdGFWYWx1ZSgpKS5nZXREZXBhcnR1cmVzKCkucHV0KHRoaXMuZ2V0Tm9kZSgpLCAtcG9wZGlmZik7DQorCQkJKHRoaXMuZ2V0RGVsdGFWYWx1ZSgpKS5zZXREZWF0aHMoLXBvcGRpZmYpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOw0KKw0KKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoDQorCQkJCXBvcHVsYXRpb25JZGVudGlmaWVyID09IG51bGwgPyAibnVsbCIgOiBwb3B1bGF0aW9uSWRlbnRpZmllcik7DQorCQlyZXN1bHQuYXBwZW5kKCIgWyIpOw0KKwkJcmVzdWx0LmFwcGVuZChNYXRoLmZsb29yKCgoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKWdldEN1cnJlbnRWYWx1ZSgpKS5nZXRDb3VudCgpKSk7DQorCQlyZXN1bHQuYXBwZW5kKCJdIik7DQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQorCX0NCit9IC8vU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZmU3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUltcGwuamF2YQpAQCAtMCwwICsxLDUyMSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsVmFsdWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcHVsYXRpb24gTW9kZWwgTGFiZWwgVmFsdWU8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSW1wbCNnZXRDb3VudCA8ZW0+Q291bnQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJbXBsI2dldEluY2lkZW5jZSA8ZW0+SW5jaWRlbmNlPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSW1wbCNnZXRCaXJ0aHMgPGVtPkJpcnRoczwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUltcGwjZ2V0RGVhdGhzIDxlbT5EZWF0aHM8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJbXBsI2dldERlbnNpdHkgPGVtPkRlbnNpdHk8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJbXBsIGV4dGVuZHMgUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUltcGwgaW1wbGVtZW50cyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgew0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvdW50KCkgPGVtPkNvdW50PC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRDb3VudCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIENPVU5UX0VERUZBVUxUID0gMC4wOw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q291bnQoKSA8ZW0+Q291bnQ8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldENvdW50KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGRvdWJsZSBjb3VudCA9IENPVU5UX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY2lkZW5jZSgpIDxlbT5JbmNpZGVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldEluY2lkZW5jZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIElOQ0lERU5DRV9FREVGQVVMVCA9IDAuMDsNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY2lkZW5jZSgpIDxlbT5JbmNpZGVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldEluY2lkZW5jZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBkb3VibGUgaW5jaWRlbmNlID0gSU5DSURFTkNFX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJpcnRocygpIDxlbT5CaXJ0aHM8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldEJpcnRocygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIEJJUlRIU19FREVGQVVMVCA9IDAuMDsNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJpcnRocygpIDxlbT5CaXJ0aHM8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldEJpcnRocygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBkb3VibGUgYmlydGhzID0gQklSVEhTX0VERUZBVUxUOw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlYXRocygpIDxlbT5EZWF0aHM8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldERlYXRocygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIERFQVRIU19FREVGQVVMVCA9IDAuMDsNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlYXRocygpIDxlbT5EZWF0aHM8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldERlYXRocygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBkb3VibGUgZGVhdGhzID0gREVBVEhTX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlbnNpdHkoKSA8ZW0+RGVuc2l0eTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0RGVuc2l0eSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIERFTlNJVFlfRURFRkFVTFQgPSAwLjA7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUltcGwoKSB7DQorCQlzdXBlcigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGRvdWJsZSBnZXRDb3VudCgpIHsNCisJCXJldHVybiBjb3VudDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldENvdW50KGRvdWJsZSBuZXdDb3VudCkgew0KKwkJZG91YmxlIG9sZENvdW50ID0gY291bnQ7DQorCQljb3VudCA9IG5ld0NvdW50Ow0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19DT1VOVCwgb2xkQ291bnQsIGNvdW50KSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgZG91YmxlIGdldEluY2lkZW5jZSgpIHsNCisJCXJldHVybiBpbmNpZGVuY2U7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRJbmNpZGVuY2UoZG91YmxlIG5ld0luY2lkZW5jZSkgew0KKwkJZG91YmxlIG9sZEluY2lkZW5jZSA9IGluY2lkZW5jZTsNCisJCWluY2lkZW5jZSA9IG5ld0luY2lkZW5jZTsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRV9fSU5DSURFTkNFLCBvbGRJbmNpZGVuY2UsIGluY2lkZW5jZSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGRvdWJsZSBnZXRCaXJ0aHMoKSB7DQorCQlyZXR1cm4gYmlydGhzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0QmlydGhzKGRvdWJsZSBuZXdCaXJ0aHMpIHsNCisJCWRvdWJsZSBvbGRCaXJ0aHMgPSBiaXJ0aHM7DQorCQliaXJ0aHMgPSBuZXdCaXJ0aHM7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0JJUlRIUywgb2xkQmlydGhzLCBiaXJ0aHMpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBkb3VibGUgZ2V0RGVhdGhzKCkgew0KKwkJcmV0dXJuIGRlYXRoczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldERlYXRocyhkb3VibGUgbmV3RGVhdGhzKSB7DQorCQlkb3VibGUgb2xkRGVhdGhzID0gZGVhdGhzOw0KKwkJZGVhdGhzID0gbmV3RGVhdGhzOw0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19ERUFUSFMsIG9sZERlYXRocywgZGVhdGhzKSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIGRvdWJsZSBnZXREZW5zaXR5KCkgew0KKwkJZG91YmxlIHBvcHVsYXRpb24gPSB0aGlzLmNvdW50Ow0KKwkJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCBsYWJlbCA9IChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsKXRoaXMuZUNvbnRhaW5lcigpOw0KKwkJTm9kZSBuPSBsYWJlbC5nZXROb2RlKCk7DQorCQlkb3VibGUgYXJlYSA9IDAuMDsNCisJCWZvcihOb2RlTGFiZWwgbm9kZUxhYiA6IG4uZ2V0TGFiZWxzKCkpIHsNCisJCQlpZihub2RlTGFiIGluc3RhbmNlb2YgQXJlYUxhYmVsKSB7DQorCQkJCWFyZWEgPSAoKEFyZWFMYWJlbClub2RlTGFiKS5nZXRDdXJyZW50QXJlYVZhbHVlKCkuZ2V0QXJlYSgpOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gKGFyZWEgPiAwLjApPyAocG9wdWxhdGlvbi9hcmVhKSA6IDAuMDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBpc1NldERlbnNpdHkoKSB7DQorCQlyZXR1cm4gdHJ1ZTsgLy8gRGVuc2l0eSBhbHdheXMgc2V0DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gYWRqdXN0RGVsdGEoSW50ZWdyYXRpb25MYWJlbFZhbHVlIHZhbHVlKSB7DQorCQlTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgc3ZhbCA9IChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpdmFsdWU7DQorCQlib29sZWFuIGFkanVzdGVkID0gZmFsc2U7DQorCQlkb3VibGUgbmV3Q291bnQgPSB0aGlzLmdldENvdW50KCkgKyBzdmFsLmdldENvdW50KCk7DQorCQlkb3VibGUgbmV3QmlydGhzID0gdGhpcy5nZXRCaXJ0aHMoKSArIHN2YWwuZ2V0QmlydGhzKCk7DQorCQlkb3VibGUgbmV3RGVhdGhzID0gdGhpcy5nZXREZWF0aHMoKSArIHN2YWwuZ2V0RGVhdGhzKCk7DQorCQkNCisJCWRvdWJsZSBmYWN0b3IgPSAxLjA7DQorCQlpZihuZXdDb3VudCA8IG5ld0JpcnRocyAmJiBuZXdDb3VudCA8IG5ld0RlYXRocyAmJiBuZXdDb3VudCA8IDAuMCkgew0KKwkJCS8vIFNjYWxlIHVzaW5nIFMNCisJCQlhZGp1c3RlZCA9IHRydWU7DQorCQkJZmFjdG9yID0gLXN2YWwuZ2V0Q291bnQoKS90aGlzLmdldENvdW50KCk7DQorCQl9IGVsc2UgaWYobmV3QmlydGhzIDwgbmV3RGVhdGhzICYmIG5ld0JpcnRocyA8IDAuMCkgew0KKwkJCS8vIFNjYWxlIHVzaW5nIFINCisJCQlhZGp1c3RlZCA9IHRydWU7DQorCQkJZmFjdG9yID0gLXN2YWwuZ2V0QmlydGhzKCkvdGhpcy5nZXRCaXJ0aHMoKTsNCisJCX0gZWxzZSBpZiAobmV3RGVhdGhzIDwgMCkgew0KKwkJCS8vIFNjYWxlIHVzaW5nIFINCisJCQlhZGp1c3RlZCA9IHRydWU7DQorCQkJZmFjdG9yID0gLXN2YWwuZ2V0RGVhdGhzKCkvdGhpcy5nZXREZWF0aHMoKTsNCisJCX0NCisJCWlmKGFkanVzdGVkKSB0aGlzLnNjYWxlKGZhY3Rvcik7DQorCQkvLyBEdWUgdG8gcHJlY2lzaW9uIGxpbWl0YXRpb25zIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRoZSBudW1iZXIgaWYgdGlueSBuZWdhdGl2ZS4gQWRqdXN0IGlmIG5lY2Vzc2FyeQ0KKwkJbmV3Q291bnQgPSB0aGlzLmdldENvdW50KCkgKyBzdmFsLmdldENvdW50KCk7DQorCQluZXdCaXJ0aHMgPSB0aGlzLmdldEJpcnRocygpICsgc3ZhbC5nZXRCaXJ0aHMoKTsNCisJCW5ld0RlYXRocyA9IHRoaXMuZ2V0RGVhdGhzKCkgKyBzdmFsLmdldERlYXRocygpOw0KKwkJDQorCQlpZihuZXdDb3VudDwwKQ0KKwkJCXRoaXMuc2V0Q291bnQoLXN2YWwuZ2V0Q291bnQoKSk7DQorCQlpZihuZXdCaXJ0aHM8MCkNCisJCQl0aGlzLnNldEJpcnRocygtc3ZhbC5nZXRCaXJ0aHMoKSk7DQorCQlpZihuZXdEZWF0aHM8MCkNCisJCQl0aGlzLnNldERlYXRocygtc3ZhbC5nZXREZWF0aHMoKSk7DQorCQkNCisJCXJldHVybiBhZGp1c3RlZDsNCisNCisJfQ0KKw0KKwlwcml2YXRlIE1hcDxOb2RlLCBEb3VibGU+YXJyaXZhbHM7DQorCXByaXZhdGUgTWFwPE5vZGUsIERvdWJsZT5kZXBhcnR1cmVzOw0KKwkNCisJLyoqDQorCSAqIEdldCBhcnJpdmFscw0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIE1hcDxOb2RlLCBEb3VibGU+IGdldEFycml2YWxzKCkgew0KKwkJaWYoYXJyaXZhbHMgPT0gbnVsbCkgYXJyaXZhbHMgPSBuZXcgSGFzaE1hcDxOb2RlLCBEb3VibGU+KCk7DQorCQlyZXR1cm4gYXJyaXZhbHM7DQorCX0NCisNCisJLyoqDQorCSAqIEdldCBkZXBhcnR1cmVzDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwdWJsaWMgTWFwPE5vZGUsIERvdWJsZT4gZ2V0RGVwYXJ0dXJlcygpIHsNCisJCWlmKGRlcGFydHVyZXMgPT0gbnVsbCkgZGVwYXJ0dXJlcyA9IG5ldyBIYXNoTWFwPE5vZGUsIERvdWJsZT4oKTsNCisJCXJldHVybiBkZXBhcnR1cmVzOw0KKwl9DQorDQorCXB1YmxpYyB2b2lkIHNldEFycml2YWxzKE1hcDxOb2RlLCBEb3VibGU+IG0pIHsNCisJCXRoaXMuYXJyaXZhbHMgPSBtOw0KKwl9DQorCXB1YmxpYyB2b2lkIHNldERlcGFydHVyZXMoTWFwPE5vZGUsIERvdWJsZT4gbSkgew0KKwkJdGhpcy5kZXBhcnR1cmVzID0gbTsNCisJfQ0KKwkNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19DT1VOVDoNCisJCQkJcmV0dXJuIGdldENvdW50KCk7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRV9fSU5DSURFTkNFOg0KKwkJCQlyZXR1cm4gZ2V0SW5jaWRlbmNlKCk7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRV9fQklSVEhTOg0KKwkJCQlyZXR1cm4gZ2V0QmlydGhzKCk7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRV9fREVBVEhTOg0KKwkJCQlyZXR1cm4gZ2V0RGVhdGhzKCk7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRV9fREVOU0lUWToNCisJCQkJcmV0dXJuIGdldERlbnNpdHkoKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0NPVU5UOg0KKwkJCQlzZXRDb3VudCgoRG91YmxlKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0lOQ0lERU5DRToNCisJCQkJc2V0SW5jaWRlbmNlKChEb3VibGUpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRV9fQklSVEhTOg0KKwkJCQlzZXRCaXJ0aHMoKERvdWJsZSluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19ERUFUSFM6DQorCQkJCXNldERlYXRocygoRG91YmxlKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19DT1VOVDoNCisJCQkJc2V0Q291bnQoQ09VTlRfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRV9fSU5DSURFTkNFOg0KKwkJCQlzZXRJbmNpZGVuY2UoSU5DSURFTkNFX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0JJUlRIUzoNCisJCQkJc2V0QmlydGhzKEJJUlRIU19FREVGQVVMVCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19ERUFUSFM6DQorCQkJCXNldERlYXRocyhERUFUSFNfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19DT1VOVDoNCisJCQkJcmV0dXJuIGNvdW50ICE9IENPVU5UX0VERUZBVUxUOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0lOQ0lERU5DRToNCisJCQkJcmV0dXJuIGluY2lkZW5jZSAhPSBJTkNJREVOQ0VfRURFRkFVTFQ7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRV9fQklSVEhTOg0KKwkJCQlyZXR1cm4gYmlydGhzICE9IEJJUlRIU19FREVGQVVMVDsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19ERUFUSFM6DQorCQkJCXJldHVybiBkZWF0aHMgIT0gREVBVEhTX0VERUZBVUxUOw0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0RFTlNJVFk6DQorCQkJCXJldHVybiBpc1NldERlbnNpdHkoKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCisNCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQorCQlyZXN1bHQuYXBwZW5kKCIgKGNvdW50OiAiKTsNCisJCXJlc3VsdC5hcHBlbmQoY291bnQpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCBpbmNpZGVuY2U6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChpbmNpZGVuY2UpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCBiaXJ0aHM6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChiaXJ0aHMpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCBkZWF0aHM6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChkZWF0aHMpOw0KKwkJcmVzdWx0LmFwcGVuZCgnKScpOw0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKwl9DQorDQorCXB1YmxpYyBJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgYWJzKCkgew0KKwkJdGhpcy5jb3VudCA9IE1hdGguYWJzKHRoaXMuY291bnQpOw0KKwkJdGhpcy5iaXJ0aHMgPSBNYXRoLmFicyh0aGlzLmJpcnRocyk7DQorCQl0aGlzLmRlYXRocyA9IE1hdGguYWJzKHRoaXMuZGVhdGhzKTsNCisJCXJldHVybiB0aGlzOw0KKwl9DQorDQorCXB1YmxpYyBJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgYWRkKEludGVncmF0aW9uTGFiZWxWYWx1ZSB2YWx1ZSkgew0KKwkJU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIHYgPSAoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKXZhbHVlOw0KKwkJdGhpcy5iaXJ0aHMgKz0gdi5nZXRCaXJ0aHMoKTsNCisJCXRoaXMuZGVhdGhzICs9IHYuZ2V0RGVhdGhzKCk7DQorCQl0aGlzLmNvdW50ICs9IHYuZ2V0Q291bnQoKTsNCisJCXJldHVybiB0aGlzOw0KKwl9DQorDQorCXB1YmxpYyBJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgYWRkKGRvdWJsZSBhZGRpdGlvbikgew0KKwkJdGhpcy5jb3VudCArPSBhZGRpdGlvbjsNCisJCXRoaXMuYmlydGhzICs9IGFkZGl0aW9uOw0KKwkJdGhpcy5kZWF0aHMgKz0gYWRkaXRpb247DQorCQlyZXR1cm4gdGhpczsNCisJfQ0KKw0KKwlwdWJsaWMgSW50ZWdyYXRpb25MYWJlbFZhbHVlIHNjYWxlKGRvdWJsZSBzY2FsZUZhY3Rvcikgew0KKwkJdGhpcy5jb3VudCAqPSBzY2FsZUZhY3RvcjsNCisJCXRoaXMuYmlydGhzICo9IHNjYWxlRmFjdG9yOw0KKwkJdGhpcy5kZWF0aHMgKj0gc2NhbGVGYWN0b3I7DQorCQlyZXR1cm4gdGhpczsNCisJfQ0KKw0KKwlwdWJsaWMgSW50ZWdyYXRpb25MYWJlbFZhbHVlIHNldChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgdmFsdWUpIHsNCisJCVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSB2ID0gKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSl2YWx1ZTsNCisJCXRoaXMuY291bnQgPSB2LmdldENvdW50KCk7DQorCQl0aGlzLmJpcnRocyA9IHYuZ2V0QmlydGhzKCk7DQorCQl0aGlzLmRlYXRocyA9IHYuZ2V0RGVhdGhzKCk7DQorCQl0aGlzLmluY2lkZW5jZSA9IHYuZ2V0SW5jaWRlbmNlKCk7DQorCQlyZXR1cm4gdGhpczsNCisJfQ0KKw0KKwlwdWJsaWMgSW50ZWdyYXRpb25MYWJlbFZhbHVlIHN1YihJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgdmFsdWUpIHsNCisJCVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSB2ID0gKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSl2YWx1ZTsNCisJCXRoaXMuYmlydGhzIC09IHYuZ2V0QmlydGhzKCk7DQorCQl0aGlzLmRlYXRocyAtPSB2LmdldERlYXRocygpOw0KKwkJdGhpcy5jb3VudCAtPSB2LmdldENvdW50KCk7DQorCQlyZXR1cm4gdGhpczsNCisJfQ0KKw0KKwlwdWJsaWMgSW50ZWdyYXRpb25MYWJlbFZhbHVlIGRpdmlkZShJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgZCkgew0KKwkJDQorCQlTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgX3NjYWxlID0gKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSlkOw0KKwkJZG91YmxlIGNTY2FsZWQgPSBNYXRoLmFicyhjb3VudCkgLyBNYXRoLmFicyhfc2NhbGUuZ2V0Q291bnQoKSk7DQorCQlkb3VibGUgYlNjYWxlZCA9IE1hdGguYWJzKGJpcnRocykgLyBNYXRoLmFicyhfc2NhbGUuZ2V0QmlydGhzKCkpOw0KKwkJZG91YmxlIGRTY2FsZWQgPSBNYXRoLmFicyhkZWF0aHMpIC8gTWF0aC5hYnMoX3NjYWxlLmdldERlYXRocygpKTsNCisJCXNldENvdW50KGNTY2FsZWQpOw0KKwkJc2V0QmlydGhzKGJTY2FsZWQpOw0KKwkJc2V0RGVhdGhzKGRTY2FsZWQpOw0KKwkJcmV0dXJuIHRoaXM7DQorCX0NCisJDQorCXB1YmxpYyBkb3VibGUgbWF4KCkgew0KKwkJaWYoY291bnQgPiBiaXJ0aHMgJiYgY291bnQgPiBkZWF0aHMpIHJldHVybiBjb3VudDsNCisJCWVsc2UgaWYoYmlydGhzID4gZGVhdGhzKSByZXR1cm4gYmlydGhzOw0KKwkJZWxzZSByZXR1cm4gZGVhdGhzOw0KKwl9DQorCQ0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgcmVzZXQoKSB7DQorCQlzdXBlci5yZXNldCgpOw0KKwkJdGhpcy5zZXRDb3VudChDT1VOVF9FREVGQVVMVCk7DQorCQl0aGlzLnNldEJpcnRocyhCSVJUSFNfRURFRkFVTFQpOw0KKwkJdGhpcy5zZXREZWF0aHMoREVBVEhTX0VERUZBVUxUKTsNCisJCWFycml2YWxzID0gbnVsbDsNCisJCWRlcGFydHVyZXMgPSBudWxsOw0KKwl9DQorfSAvL1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL1N0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL2ltcGwvU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NGMwNjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL1N0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGwuamF2YQpAQCAtMCwwICsxLDIxNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuaW1wbDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWw7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RvY2hhc3RpYyBTdGFuZGFyZCBQb3B1bGF0aW9uIE1vZGVsPC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGwjZ2V0R2FpbiA8ZW0+R2FpbjwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGwgZXh0ZW5kcyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGwgaW1wbGVtZW50cyBTdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwgew0KKwlwcm90ZWN0ZWQgc3RhdGljIGRvdWJsZSBNQVhfR0FJTiA9IDAuMDI7DQorCQ0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdhaW4oKSA8ZW0+R2FpbjwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0R2FpbigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIEdBSU5fRURFRkFVTFQgPSAwLjAxOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R2FpbigpIDxlbT5HYWluPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRHYWluKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGRvdWJsZSBnYWluID0gR0FJTl9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIFN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGwoKSB7DQorCQlzdXBlcigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVE9DSEFTVElDX1NUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUw7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgZG91YmxlIGdldEdhaW4oKSB7DQorCQlyZXR1cm4gZ2FpbjsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoTGFiZWxWYWx1ZSBsYWJlbCkgew0KKwkJZmluYWwgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIGN1cnJlbnRMYWJlbFZhbHVlID0gKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSkgbGFiZWw7DQorCQkvL2RvdWJsZSBvbGRDb3VudCA9IGN1cnJlbnRMYWJlbFZhbHVlLmdldENvdW50KCk7DQorCQlkb3VibGUgaW5jaWRlbmNlID0gY3VycmVudExhYmVsVmFsdWUuZ2V0SW5jaWRlbmNlKCk7DQorCQlkb3VibGUgbmV3SW5jaWRlbmNlID0gaW5jaWRlbmNlKmNvbXB1dGVOb2lzZSgpOw0KKwkJZG91YmxlIGRpZmYgPSBuZXdJbmNpZGVuY2UgLSBpbmNpZGVuY2U7DQorCQkNCisJCWRvdWJsZSBuZXdDb3VudCA9IGN1cnJlbnRMYWJlbFZhbHVlLmdldENvdW50KCkgKyBkaWZmOw0KKwkJZG91YmxlIG5ld0JpcnRocyA9IGN1cnJlbnRMYWJlbFZhbHVlLmdldEJpcnRocygpICsgZGlmZi8yLjA7DQorCQlkb3VibGUgbmV3RGVhdGhzID0gY3VycmVudExhYmVsVmFsdWUuZ2V0RGVhdGhzKCkgKyBkaWZmLzIuMDsNCisJCQ0KKwkJY3VycmVudExhYmVsVmFsdWUuc2V0Q291bnQobmV3Q291bnQpOw0KKwkJY3VycmVudExhYmVsVmFsdWUuc2V0QmlydGhzKG5ld0JpcnRocyk7DQorCQljdXJyZW50TGFiZWxWYWx1ZS5zZXREZWF0aHMobmV3RGVhdGhzKTsNCisJfQ0KKwkNCisJUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKCk7DQorCXByb3RlY3RlZCBkb3VibGUgY29tcHV0ZU5vaXNlKCkgew0KKwkJcmV0dXJuIHRoaXMuY29tcHV0ZU5vaXNlKHRoaXMuZ2V0R2FpbigpLCB0aGlzLnJhbmQpOw0KKwl9DQorCQ0KKwkvKioNCisJICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGRvdWJsZSBwcmVjaXNpb24gcmFuZG9tIG5vaXNlIHZhcmlhYmxlDQorCSAqIHIgYmV0d2VlbiAoMS4wK3gpIGFuZCAoMS4wLXgpDQorCSAqIHdoZXJlIHggaXMgYSBwcm9kdWN0IEcqIE1hdGgucmFuZCgpLCBhbmQgRyBpcyBhIGdhaW4gZmFjdG9yIDA8RzxtYXggbm9pc2UNCisJICogDQorCSAqIEBwYXJhbSBnYWluDQorCSAqIEBwYXJhbSByYW5kDQorCSAqIEByZXR1cm4gbm9pc2UNCisJICovDQorCXByb3RlY3RlZCBkb3VibGUgY29tcHV0ZU5vaXNlKGZpbmFsIGRvdWJsZSBnYWluLCBmaW5hbCBSYW5kb20gcmFuZCkgew0KKyAgICAgDQorCSAgICBhc3NlcnQgKGdhaW4gPD0gTUFYX0dBSU4pOiJTVE9DSEFTVElDIE5PSVNFIG11c3QgYmUgJ3NtYWxsJywgdGhlcmVmb3JlIGdhaW4gcGFyYW1ldGVyIG11c3QgYmUgPCBNQVhfR0FJTj0iK01BWF9HQUlOOyAvLyBtYXhpbXVtIG5vaXNlIHNob3VsZCBiZSAxJQ0KKwkJZG91YmxlIHggPSAoMi4wKnJhbmQubmV4dERvdWJsZSgpKS0xLjA7IC8vICsvLSAxDQorCQl4ICo9IGdhaW47DQorCQl4ICs9IDEuMDsNCisJCWFzc2VydCAoKHg+MC4wKSYmKHg8Mi4wKSkgOiAicmFuZG9tIG5vaXNlIHNob3VsZCBiZSBhIHNtYWxsIHBlcnR1cmJhdGlvbiBHYWluIGZhY3RvciwgZywgIG11c3QgMC4wIDwgZyA8PCAxLjAgIjsNCisJCXJldHVybiB4Ow0KKwkJDQorCX0gLy8gZ2V0Tm9pc2UNCisJDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0R2Fpbihkb3VibGUgbmV3R2Fpbikgew0KKwkJZG91YmxlIG9sZEdhaW4gPSBnYWluOw0KKwkJZ2FpbiA9IG5ld0dhaW47DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fR0FJTiwgb2xkR2FpbiwgZ2FpbikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19HQUlOOg0KKwkJCQlyZXR1cm4gZ2V0R2FpbigpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19HQUlOOg0KKwkJCQlzZXRHYWluKChEb3VibGUpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fR0FJTjoNCisJCQkJc2V0R2FpbihHQUlOX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19HQUlOOg0KKwkJCQlyZXR1cm4gZ2FpbiAhPSBHQUlOX0VERUZBVUxUOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQorDQorCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCisJCXJlc3VsdC5hcHBlbmQoIiAoZ2FpbjogIik7DQorCQlyZXN1bHQuYXBwZW5kKGdhaW4pOw0KKwkJcmVzdWx0LmFwcGVuZCgnKScpOw0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKwl9DQorDQorfSAvL1N0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL1lldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9pbXBsL1lldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiN2Q5NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL2ltcGwvWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplckltcGwuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuRWFydGhTY2llbmNlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLllldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5ZZXRpIFBvcHVsYXRpb24gSW5pdGlhbGl6ZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVySW1wbCBleHRlbmRzIEVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplckltcGwgaW1wbGVtZW50cyBZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVyIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYWJlbChQb3B1bGF0aW9uTGFiZWwgbGFiLCBTVEVNVGltZSB0aW1lLCBib29sZWFuIHplcm9WYWx1ZSkgeworCQkgUG9wdWxhdGlvbkxhYmVsVmFsdWUgcGx2ID0gbGFiLmdldEN1cnJlbnRQb3B1bGF0aW9uVmFsdWUoKTsKKwkJIGlmKHplcm9WYWx1ZSkgIHBsdi5zZXRDb3VudCgwLjApOworCQkgZWxzZSB7CisJCQkgLy8gR2V0IHRoZSBlbGV2YXRpb24gCisJCQkgTm9kZSBuID0gbGFiLmdldE5vZGUoKTsKKwkJCSBkb3VibGUgZWxldmF0aW9uID0gLTE7CisJCQkgZm9yKE5vZGVMYWJlbCBubDpuLmdldExhYmVscygpKSB7CisJCQkJIGlmKG5sIGluc3RhbmNlb2YgRWFydGhTY2llbmNlTGFiZWwgJiYgKChFYXJ0aFNjaWVuY2VMYWJlbClubCkuZ2V0Q3VycmVudEVhcnRoU2NpZW5jZVZhbHVlKCkuZ2V0RGF0YVR5cGUoKS5lcXVhbHMoImVsZXZhdGlvbiIpKSB7CisJCQkJCSBlbGV2YXRpb24gPSAoKEVhcnRoU2NpZW5jZUxhYmVsKW5sKS5nZXRDdXJyZW50RWFydGhTY2llbmNlVmFsdWUoKS5nZXREYXRhKCkuZ2V0KDApLmRvdWJsZVZhbHVlKCk7CisJCQkJCSBicmVhazsKKwkJCQkgfQorCQkJIH0KKwkJCWlmKGVsZXZhdGlvbiA9PSAtMSkgCisJCQkJLy8gbm8gZWxldmF0aW9uIGRhdGEsIHNvIG5vIHlldGkgCisJCQkJcGx2LnNldENvdW50KDAuMCk7CisJCQllbHNlIHsKKwkJCQkvLyBUaGVyZSdzIG9uZSBtb3JlIHlldGkgZm9yIGVhY2ggbWV0ZXIgb2YgZWxldmF0aW9uCisJCQkJcGx2LnNldENvdW50KGVsZXZhdGlvbik7CisJCQl9CisJCSB9CSAKKwl9CisJCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuWUVUSV9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSOworCX0KKworfSAvL1lldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9EZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2MwOWM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE5NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLkRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWx9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkUG9wdWxhdGlvbkdyb3Vwc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUG9wdWxhdGlvbiBHcm91cHMgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRQb3B1bGF0aW9uR3JvdXBzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxfcG9wdWxhdGlvbkdyb3Vwc19mZWF0dXJlIiksCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxfcG9wdWxhdGlvbkdyb3Vwc19mZWF0dXJlIiwgIl9VSV9EZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbF90eXBlIiksCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5ERU1PR1JBUEhJQ19QT1BVTEFUSU9OX01PREVMX19QT1BVTEFUSU9OX0dST1VQUywKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBudWxsLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOworCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLkRFTU9HUkFQSElDX1BPUFVMQVRJT05fTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTKTsKKwkJfQorCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKKwkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgorCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCisKKwkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbTE2L0RlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsIikpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwpb2JqZWN0KS5nZXRVUkkoKS5sYXN0U2VnbWVudCgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0RlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsX3R5cGUiKSA6CisJCQlsYWJlbDsKKwl9CisJCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgeworCQlTdHJpbmcgbGFiZWwgPSAoKERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsKW9iamVjdCkuZ2V0TmFtZSgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX0RlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsX3R5cGUiKSA6CisJCQlnZXRTdHJpbmcoIl9VSV9EZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbF90eXBlIikgKyAiICIgKyBsYWJlbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbC5jbGFzcykpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRFTU9HUkFQSElDX1BPUFVMQVRJT05fTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9FYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL0VhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZjY0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9FYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5wcm92aWRlcjsKKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5FYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJdGVtUHJvdmlkZXIKKwlleHRlbmRzIFBvcHVsYXRpb25Jbml0aWFsaXplckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIEVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplci5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9FYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXIiKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlVUkkgbGFiZWxWYWx1ZSA9ICgoRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyX3R5cGUiKSA6CisJCQlnZXRTdHJpbmcoIl9VSV9FYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7CisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9Qb3B1bGF0aW9uR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1BvcHVsYXRpb25Hcm91cEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1Zjg3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9Qb3B1bGF0aW9uR3JvdXBJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE4NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uR3JvdXB9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBvcHVsYXRpb25Hcm91cEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUG9wdWxhdGlvbkdyb3VwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZElkZW50aWZpZXJQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZEZyYWN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZGVudGlmaWVyIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkSWRlbnRpZmllclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1BvcHVsYXRpb25Hcm91cF9pZGVudGlmaWVyX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3B1bGF0aW9uR3JvdXBfaWRlbnRpZmllcl9mZWF0dXJlIiwgIl9VSV9Qb3B1bGF0aW9uR3JvdXBfdHlwZSIpLAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuUE9QVUxBVElPTl9HUk9VUF9fSURFTlRJRklFUiwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRnJhY3Rpb24gZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRGcmFjdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1BvcHVsYXRpb25Hcm91cF9mcmFjdGlvbl9mZWF0dXJlIiksCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9wdWxhdGlvbkdyb3VwX2ZyYWN0aW9uX2ZlYXR1cmUiLCAiX1VJX1BvcHVsYXRpb25Hcm91cF90eXBlIiksCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5QT1BVTEFUSU9OX0dST1VQX19GUkFDVElPTiwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgUG9wdWxhdGlvbkdyb3VwLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1BvcHVsYXRpb25Hcm91cCIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoUG9wdWxhdGlvbkdyb3VwKW9iamVjdCkuZ2V0SWRlbnRpZmllcigpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1BvcHVsYXRpb25Hcm91cF90eXBlIikgOgorCQkJZ2V0U3RyaW5nKCJfVUlfUG9wdWxhdGlvbkdyb3VwX3R5cGUiKSArICIgIiArIGxhYmVsOworCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBvcHVsYXRpb25Hcm91cC5jbGFzcykpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fR1JPVVBfX0lERU5USUZJRVI6CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX0dST1VQX19GUkFDVElPTjoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gU3RhbmRhcmRFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvUG9wdWxhdGlvbkluaXRpYWxpemVySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9Qb3B1bGF0aW9uSW5pdGlhbGl6ZXJJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDU0ZWI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvUG9wdWxhdGlvbkluaXRpYWxpemVySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxODkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTm9kZURlY29yYXRvckl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkluaXRpYWxpemVyfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJdGVtUHJvdmlkZXIKKwlleHRlbmRzIE5vZGVEZWNvcmF0b3JJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBvcHVsYXRpb25Jbml0aWFsaXplckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCQlhZGRUYXJnZXRJU09LZXlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFBvcHVsYXRpb25JZGVudGlmaWVyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUYXJnZXQgSVNPIEtleSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFRhcmdldElTT0tleVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1BvcHVsYXRpb25Jbml0aWFsaXplcl90YXJnZXRJU09LZXlfZmVhdHVyZSIpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcHVsYXRpb25Jbml0aWFsaXplcl90YXJnZXRJU09LZXlfZmVhdHVyZSIsICJfVUlfUG9wdWxhdGlvbkluaXRpYWxpemVyX3R5cGUiKSwKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlBPUFVMQVRJT05fSU5JVElBTElaRVJfX1RBUkdFVF9JU09fS0VZLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQb3B1bGF0aW9uIElkZW50aWZpZXIgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRQb3B1bGF0aW9uSWRlbnRpZmllclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1BvcHVsYXRpb25Jbml0aWFsaXplcl9wb3B1bGF0aW9uSWRlbnRpZmllcl9mZWF0dXJlIiksCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9wdWxhdGlvbkluaXRpYWxpemVyX3BvcHVsYXRpb25JZGVudGlmaWVyX2ZlYXR1cmUiLCAiX1VJX1BvcHVsYXRpb25Jbml0aWFsaXplcl90eXBlIiksCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19QT1BVTEFUSU9OX0lERU5USUZJRVIsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFBvcHVsYXRpb25Jbml0aWFsaXplci5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvY3VzdG9tMTYvcG9wdWxhdGlvbmluaXRpYWxpemVyLmdpZiIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChQb3B1bGF0aW9uSW5pdGlhbGl6ZXIpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9Qb3B1bGF0aW9uSW5pdGlhbGl6ZXJfdHlwZSIpIDoKKwkJCWdldFN0cmluZygiX1VJX1BvcHVsYXRpb25Jbml0aWFsaXplcl90eXBlIikgKyAiICIgKyBsYWJlbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQb3B1bGF0aW9uSW5pdGlhbGl6ZXIuY2xhc3MpKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19UQVJHRVRfSVNPX0tFWToKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fSU5JVElBTElaRVJfX1BPUFVMQVRJT05fSURFTlRJRklFUjoKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gU3RhbmRhcmRFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvUG9wdWxhdGlvbk1vZGVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9Qb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzkxYmViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvUG9wdWxhdGlvbk1vZGVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMTIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTm9kZURlY29yYXRvckl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWx9IG9iamVjdC4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgDQorcHVibGljIGNsYXNzIFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIE5vZGVEZWNvcmF0b3JJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQorDQorCQkJYWRkUG9wdWxhdGlvbklkZW50aWZpZXJQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkVGFyZ2V0SVNPS2V5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQb3B1bGF0aW9uIElkZW50aWZpZXIgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFBvcHVsYXRpb25JZGVudGlmaWVyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qb3B1bGF0aW9uTW9kZWxfcG9wdWxhdGlvbklkZW50aWZpZXJfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3B1bGF0aW9uTW9kZWxfcG9wdWxhdGlvbklkZW50aWZpZXJfZmVhdHVyZSIsICJfVUlfUG9wdWxhdGlvbk1vZGVsX3R5cGUiKSwNCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5QT1BVTEFUSU9OX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIsDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qb3B1bGF0aW9uTW9kZWxfbmFtZV9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcHVsYXRpb25Nb2RlbF9uYW1lX2ZlYXR1cmUiLCAiX1VJX1BvcHVsYXRpb25Nb2RlbF90eXBlIiksDQorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuUE9QVUxBVElPTl9NT0RFTF9fTkFNRSwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRhcmdldCBJU08gS2V5IGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUYXJnZXRJU09LZXlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1BvcHVsYXRpb25Nb2RlbF90YXJnZXRJU09LZXlfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3B1bGF0aW9uTW9kZWxfdGFyZ2V0SVNPS2V5X2ZlYXR1cmUiLCAiX1VJX1BvcHVsYXRpb25Nb2RlbF90eXBlIiksDQorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuUE9QVUxBVElPTl9NT0RFTF9fVEFSR0VUX0lTT19LRVksDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyBQb3B1bGF0aW9uTW9kZWwuZ2lmLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9jdXN0b20xNi9Qb3B1bGF0aW9uTW9kZWwiKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCisJCVN0cmluZyBsYWJlbCA9ICgoUG9wdWxhdGlvbk1vZGVsKW9iamVjdCkuZ2V0TmFtZSgpOw0KKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQorCQkJZ2V0U3RyaW5nKCJfVUlfUG9wdWxhdGlvbk1vZGVsX3R5cGUiKSA6DQorCQkJZ2V0U3RyaW5nKCJfVUlfUG9wdWxhdGlvbk1vZGVsX3R5cGUiKSArICIgIiArIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQorDQorCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUG9wdWxhdGlvbk1vZGVsLmNsYXNzKSkgew0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUjoNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX01PREVMX19OQU1FOg0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fTU9ERUxfX1RBUkdFVF9JU09fS0VZOg0KKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsNCisJCXJldHVybiBTdGFuZGFyZEVkaXRQbHVnaW4uSU5TVEFOQ0U7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvUG9wdWxhdGlvbk1vZGVsTGFiZWxJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1BvcHVsYXRpb25Nb2RlbExhYmVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE3Y2U5MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1BvcHVsYXRpb25Nb2RlbExhYmVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxODkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuRHluYW1pY05vZGVMYWJlbEl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsfSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIA0KK3B1YmxpYyBjbGFzcyBQb3B1bGF0aW9uTW9kZWxMYWJlbEl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIER5bmFtaWNOb2RlTGFiZWxJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQb3B1bGF0aW9uTW9kZWxMYWJlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCQlhZGRQb3B1bGF0aW9uTGFiZWxQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGRQb3B1bGF0aW9uSWRlbnRpZmllclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJfQ0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUG9wdWxhdGlvbiBMYWJlbCBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkUG9wdWxhdGlvbkxhYmVsUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qb3B1bGF0aW9uTW9kZWxMYWJlbF9wb3B1bGF0aW9uTGFiZWxfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3B1bGF0aW9uTW9kZWxMYWJlbF9wb3B1bGF0aW9uTGFiZWxfZmVhdHVyZSIsICJfVUlfUG9wdWxhdGlvbk1vZGVsTGFiZWxfdHlwZSIpLA0KKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlBPUFVMQVRJT05fTU9ERUxfTEFCRUxfX1BPUFVMQVRJT05fTEFCRUwsDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSB0cnVlLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQb3B1bGF0aW9uIElkZW50aWZpZXIgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFBvcHVsYXRpb25JZGVudGlmaWVyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qb3B1bGF0aW9uTW9kZWxMYWJlbF9wb3B1bGF0aW9uSWRlbnRpZmllcl9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcHVsYXRpb25Nb2RlbExhYmVsX3BvcHVsYXRpb25JZGVudGlmaWVyX2ZlYXR1cmUiLCAiX1VJX1BvcHVsYXRpb25Nb2RlbExhYmVsX3R5cGUiKSwNCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5QT1BVTEFUSU9OX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIsDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyBQb3B1bGF0aW9uTW9kZWxMYWJlbC5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUG9wdWxhdGlvbk1vZGVsTGFiZWwiKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCisJCVVSSSBsYWJlbFZhbHVlID0gKChQb3B1bGF0aW9uTW9kZWxMYWJlbClvYmplY3QpLmdldFVSSSgpOw0KKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX1BvcHVsYXRpb25Nb2RlbExhYmVsX3R5cGUiKSA6DQorCQkJZ2V0U3RyaW5nKCJfVUlfUG9wdWxhdGlvbk1vZGVsTGFiZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisNCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQb3B1bGF0aW9uTW9kZWxMYWJlbC5jbGFzcykpIHsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX01PREVMX0xBQkVMX19QT1BVTEFUSU9OX0lERU5USUZJRVI6DQorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KKwkJcmV0dXJuIFN0YW5kYXJkRWRpdFBsdWdpbi5JTlNUQU5DRTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9Qb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9Qb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkYTZiYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1BvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlfSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBMYWJlbFZhbHVlSXRlbVByb3ZpZGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUuZ2lmLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgew0KKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1BvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUiKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCisJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9Qb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlX3R5cGUiKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KKwkJcmV0dXJuIFN0YW5kYXJkRWRpdFBsdWdpbi5JTlNUQU5DRTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9Qb3B1bGF0aW9uTW9kZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvUG9wdWxhdGlvbk1vZGVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2MyZDdiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvUG9wdWxhdGlvbk1vZGVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWxWYWx1ZX0gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQb3B1bGF0aW9uTW9kZWxWYWx1ZUl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIExhYmVsVmFsdWVJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQb3B1bGF0aW9uTW9kZWxWYWx1ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIFBvcHVsYXRpb25Nb2RlbFZhbHVlLmdpZi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qb3B1bGF0aW9uTW9kZWxWYWx1ZSIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJcmV0dXJuIGdldFN0cmluZygiX1VJX1BvcHVsYXRpb25Nb2RlbFZhbHVlX3R5cGUiKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KKwkJcmV0dXJuIFN0YW5kYXJkRWRpdFBsdWdpbi5JTlNUQU5DRTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TZWFzb25hbFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGNhM2IwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIxNyBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5wcm92aWRlcjsKKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TZWFzb25hbFBvcHVsYXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTZWFzb25hbFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZFBoYXNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRNb2R1bGF0aW9uQW1wbGl0dWRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRQZXJpb2RQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFVzZUxhdGl0dWRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQaGFzZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFBoYXNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxfcGhhc2VfZmVhdHVyZSIpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlYXNvbmFsUG9wdWxhdGlvbk1vZGVsX3BoYXNlX2ZlYXR1cmUiLCAiX1VJX1NlYXNvbmFsUG9wdWxhdGlvbk1vZGVsX3R5cGUiKSwKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX1BIQVNFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNb2R1bGF0aW9uIEFtcGxpdHVkZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZE1vZHVsYXRpb25BbXBsaXR1ZGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TZWFzb25hbFBvcHVsYXRpb25Nb2RlbF9tb2R1bGF0aW9uQW1wbGl0dWRlX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZWFzb25hbFBvcHVsYXRpb25Nb2RlbF9tb2R1bGF0aW9uQW1wbGl0dWRlX2ZlYXR1cmUiLCAiX1VJX1NlYXNvbmFsUG9wdWxhdGlvbk1vZGVsX3R5cGUiKSwKKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX01PRFVMQVRJT05fQU1QTElUVURFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQZXJpb2QgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRQZXJpb2RQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TZWFzb25hbFBvcHVsYXRpb25Nb2RlbF9wZXJpb2RfZmVhdHVyZSIpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlYXNvbmFsUG9wdWxhdGlvbk1vZGVsX3BlcmlvZF9mZWF0dXJlIiwgIl9VSV9TZWFzb25hbFBvcHVsYXRpb25Nb2RlbF90eXBlIiksCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TRUFTT05BTF9QT1BVTEFUSU9OX01PREVMX19QRVJJT0QsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUkVBTF9WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBVc2UgTGF0aXR1ZGUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRVc2VMYXRpdHVkZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1NlYXNvbmFsUG9wdWxhdGlvbk1vZGVsX3VzZUxhdGl0dWRlX2ZlYXR1cmUiKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZWFzb25hbFBvcHVsYXRpb25Nb2RlbF91c2VMYXRpdHVkZV9mZWF0dXJlIiwgIl9VSV9TZWFzb25hbFBvcHVsYXRpb25Nb2RlbF90eXBlIiksCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TRUFTT05BTF9QT1BVTEFUSU9OX01PREVMX19VU0VfTEFUSVRVREUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9jdXN0b20xNi9TZWFzb25hbFBvcHVsYXRpb25Nb2RlbCIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwpb2JqZWN0KS5nZXROYW1lKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxfdHlwZSIpIDoKKwkJCWdldFN0cmluZygiX1VJX1NlYXNvbmFsUG9wdWxhdGlvbk1vZGVsX3R5cGUiKSArICIgIiArIGxhYmVsOworCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsLmNsYXNzKSkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTF9fUEhBU0U6CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUFTT05BTF9QT1BVTEFUSU9OX01PREVMX19NT0RVTEFUSU9OX0FNUExJVFVERToKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX1BFUklPRDoKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX1VTRV9MQVRJVFVERToKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRFZGl0UGx1Z2luLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZEVkaXRQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjUwMDJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRFZGl0UGx1Z2luLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlRWRpdFBsdWdpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db3JlRWRpdFBsdWdpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcm92aWRlci5EZWZpbml0aW9uc0VkaXRQbHVnaW47DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBTdGFuZGFyZCBlZGl0IHBsdWdpbi4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitAU3VwcHJlc3NXYXJuaW5ncygic3ludGhldGljLWFjY2VzcyIpDQorcHVibGljIGZpbmFsIGNsYXNzIFN0YW5kYXJkRWRpdFBsdWdpbiBleHRlbmRzIEVNRlBsdWdpbiB7DQorCS8qKg0KKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0YW5kYXJkRWRpdFBsdWdpbiBJTlNUQU5DRSA9IG5ldyBTdGFuZGFyZEVkaXRQbHVnaW4oKTsNCisNCisJLyoqDQorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsNCisNCisJLyoqDQorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RhbmRhcmRFZGl0UGx1Z2luKCkgew0KKwkJc3VwZXINCisJCSAgKG5ldyBSZXNvdXJjZUxvY2F0b3IgW10gew0KKwkJICAgICBDb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwNCisJCSAgICAgRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLA0KKwkJICAgICBFY29yZUVkaXRQbHVnaW4uSU5TVEFOQ0UsDQorCQkgICB9KTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgew0KKwkJcmV0dXJuIHBsdWdpbjsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7DQorCQlyZXR1cm4gcGx1Z2luOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlBsdWdpbjwvYj4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7DQorCQkvKioNCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCQ0KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgew0KKwkJCXN1cGVyKCk7DQorDQorCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4NCisJCQkvLw0KKwkJCXBsdWdpbiA9IHRoaXM7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYzkxYjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0NDYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQudXRpbC5TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5Ow0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4NCisgKiBUaGUgYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4NCisgKiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLg0KKyAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFN0YW5kYXJkQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOw0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5IHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCisNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdGFuZGFyZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgew0KKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsNCisJCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQorCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsNCisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWx9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlciBzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWx9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsQWRhcHRlcigpIHsNCisJCWlmIChzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQorCQkJc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIgPSBuZXcgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIodGhpcyk7DQorCQl9DQorDQorCQlyZXR1cm4gc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXI7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsfSBpbnN0YW5jZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgUG9wdWxhdGlvbk1vZGVsTGFiZWxJdGVtUHJvdmlkZXIgcG9wdWxhdGlvbk1vZGVsTGFiZWxJdGVtUHJvdmlkZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3B1bGF0aW9uTW9kZWxMYWJlbEFkYXB0ZXIoKSB7DQorCQlpZiAocG9wdWxhdGlvbk1vZGVsTGFiZWxJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KKwkJCXBvcHVsYXRpb25Nb2RlbExhYmVsSXRlbVByb3ZpZGVyID0gbmV3IFBvcHVsYXRpb25Nb2RlbExhYmVsSXRlbVByb3ZpZGVyKHRoaXMpOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIHBvcHVsYXRpb25Nb2RlbExhYmVsSXRlbVByb3ZpZGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsfSBpbnN0YW5jZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEl0ZW1Qcm92aWRlciBzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsSXRlbVByb3ZpZGVyOw0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsQWRhcHRlcigpIHsNCisJCWlmIChzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsSXRlbVByb3ZpZGVyID09IG51bGwpIHsNCisJCQlzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsSXRlbVByb3ZpZGVyID0gbmV3IFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxJdGVtUHJvdmlkZXIodGhpcyk7DQorCQl9DQorDQorCQlyZXR1cm4gc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEl0ZW1Qcm92aWRlcjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZX0gaW5zdGFuY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJdGVtUHJvdmlkZXIgcG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZX0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUFkYXB0ZXIoKSB7DQorCQlpZiAocG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQorCQkJcG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciA9IG5ldyBQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSXRlbVByb3ZpZGVyKHRoaXMpOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIHBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJdGVtUHJvdmlkZXI7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZX0gaW5zdGFuY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciBzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJdGVtUHJvdmlkZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZX0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlQWRhcHRlcigpIHsNCisJCWlmIChzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KKwkJCXN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciA9IG5ldyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJdGVtUHJvdmlkZXIodGhpcyk7DQorCQl9DQorDQorCQlyZXR1cm4gc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSXRlbVByb3ZpZGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWx9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIgc3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsSXRlbVByb3ZpZGVyOw0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWx9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEFkYXB0ZXIoKSB7DQorCQlpZiAoc3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsSXRlbVByb3ZpZGVyID09IG51bGwpIHsNCisJCQlzdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIgPSBuZXcgU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsSXRlbVByb3ZpZGVyKHRoaXMpOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIHN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlcjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWx9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlciBkZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWx9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsQWRhcHRlcigpIHsNCisJCWlmIChkZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQorCQkJZGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIgPSBuZXcgRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIodGhpcyk7DQorCQl9DQorDQorCQlyZXR1cm4gZGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXI7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Hcm91cH0gaW5zdGFuY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFBvcHVsYXRpb25Hcm91cEl0ZW1Qcm92aWRlciBwb3B1bGF0aW9uR3JvdXBJdGVtUHJvdmlkZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Hcm91cH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9wdWxhdGlvbkdyb3VwQWRhcHRlcigpIHsNCisJCWlmIChwb3B1bGF0aW9uR3JvdXBJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KKwkJCXBvcHVsYXRpb25Hcm91cEl0ZW1Qcm92aWRlciA9IG5ldyBQb3B1bGF0aW9uR3JvdXBJdGVtUHJvdmlkZXIodGhpcyk7DQorCQl9DQorDQorCQlyZXR1cm4gcG9wdWxhdGlvbkdyb3VwSXRlbVByb3ZpZGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcn0gaW5zdGFuY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVySXRlbVByb3ZpZGVyIHN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVySXRlbVByb3ZpZGVyOw0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcn0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJBZGFwdGVyKCkgew0KKwkJaWYgKHN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVySXRlbVByb3ZpZGVyID09IG51bGwpIHsNCisJCQlzdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplckl0ZW1Qcm92aWRlciA9IG5ldyBTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplckl0ZW1Qcm92aWRlcih0aGlzKTsNCisJCX0NCisNCisJCXJldHVybiBzdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplckl0ZW1Qcm92aWRlcjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWx9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTZWFzb25hbFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlciBzZWFzb25hbFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWx9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsQWRhcHRlcigpIHsNCisJCWlmIChzZWFzb25hbFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQorCQkJc2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIgPSBuZXcgU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIodGhpcyk7DQorCQl9DQorDQorCQlyZXR1cm4gc2Vhc29uYWxQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXI7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLllldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJ9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVySXRlbVByb3ZpZGVyIHlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJdGVtUHJvdmlkZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLllldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJ9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJBZGFwdGVyKCkgew0KKwkJaWYgKHlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KKwkJCXlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJdGVtUHJvdmlkZXIgPSBuZXcgWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplckl0ZW1Qcm92aWRlcih0aGlzKTsNCisJCX0NCisNCisJCXJldHVybiB5ZXRpUG9wdWxhdGlvbkluaXRpYWxpemVySXRlbVByb3ZpZGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgew0KKwkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgew0KKwkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5Ow0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCisJCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsNCisJCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgew0KKwkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsNCisJCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7DQorCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzPD8+KSB8fCAoKChDbGFzczw/Pil0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgew0KKwkJCQlyZXR1cm4gYWRhcHRlcjsNCisJCQl9DQorCQl9DQorDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgew0KKwkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgew0KKwkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn0gYW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisNCisJCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7DQorCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LiANCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQorCQlpZiAoc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIgIT0gbnVsbCkgc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KKwkJaWYgKHBvcHVsYXRpb25Nb2RlbExhYmVsSXRlbVByb3ZpZGVyICE9IG51bGwpIHBvcHVsYXRpb25Nb2RlbExhYmVsSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCisJCWlmIChzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsSXRlbVByb3ZpZGVyICE9IG51bGwpIHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KKwkJaWYgKHBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgcG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQorCQlpZiAoc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSXRlbVByb3ZpZGVyICE9IG51bGwpIHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQorCQlpZiAoc3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsSXRlbVByb3ZpZGVyICE9IG51bGwpIHN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQorCQlpZiAoZGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIgIT0gbnVsbCkgZGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KKwkJaWYgKHBvcHVsYXRpb25Hcm91cEl0ZW1Qcm92aWRlciAhPSBudWxsKSBwb3B1bGF0aW9uR3JvdXBJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KKwkJaWYgKHN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVySXRlbVByb3ZpZGVyICE9IG51bGwpIHN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCisJCWlmIChzZWFzb25hbFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlciAhPSBudWxsKSBzZWFzb25hbFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQorCQlpZiAoeWV0aVBvcHVsYXRpb25Jbml0aWFsaXplckl0ZW1Qcm92aWRlciAhPSBudWxsKSB5ZXRpUG9wdWxhdGlvbkluaXRpYWxpemVySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDJjZTZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE5MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJdGVtUHJvdmlkZXIKKwlleHRlbmRzIFBvcHVsYXRpb25Jbml0aWFsaXplckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkSW5kaXZpZHVhbHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZFVzZURlbnNpdHlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEluZGl2aWR1YWxzIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkSW5kaXZpZHVhbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcl9pbmRpdmlkdWFsc19mZWF0dXJlIiksCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJfaW5kaXZpZHVhbHNfZmVhdHVyZSIsICJfVUlfU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJfdHlwZSIpLAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RBTkRBUkRfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fSU5ESVZJRFVBTFMsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFVzZSBEZW5zaXR5IGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkVXNlRGVuc2l0eVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1N0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyX3VzZURlbnNpdHlfZmVhdHVyZSIpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1N0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyX3VzZURlbnNpdHlfZmVhdHVyZSIsICJfVUlfU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJfdHlwZSIpLAorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RBTkRBUkRfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fVVNFX0RFTlNJVFksCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9jdXN0b20xNi9wb3B1bGF0aW9uaW5pdGlhbGl6ZXIuZ2lmIikpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVN0cmluZyBsYWJlbCA9ICgoU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIpb2JqZWN0KS5nZXRVUkkoKS5sYXN0U2VnbWVudCgpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1N0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyX3R5cGUiKSA6CisJCQlsYWJlbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcilvYmplY3QpLmdldFVSSSgpOworCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1N0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyX3R5cGUiKSA6CisJCQlnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcl90eXBlIikgKyAiICIgKyBsYWJlbDsKKwl9CisJCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIuY2xhc3MpKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX19JTkRJVklEVUFMUzoKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX1VTRV9ERU5TSVRZOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjE1Y2ZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbDsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbH0gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK0BTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSANCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCQlhZGRCaXJ0aFJhdGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGREZWF0aFJhdGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGRUaW1lUGVyaW9kUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCaXJ0aCBSYXRlIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRCaXJ0aFJhdGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsX2JpcnRoUmF0ZV9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsX2JpcnRoUmF0ZV9mZWF0dXJlIiwgIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbF90eXBlIiksDQorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fQklSVEhfUkFURSwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlYXRoIFJhdGUgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZERlYXRoUmF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxfZGVhdGhSYXRlX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxfZGVhdGhSYXRlX2ZlYXR1cmUiLCAiX1VJX1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsX3R5cGUiKSwNCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19ERUFUSF9SQVRFLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGltZSBQZXJpb2QgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFRpbWVQZXJpb2RQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsX3RpbWVQZXJpb2RfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbF90aW1lUGVyaW9kX2ZlYXR1cmUiLCAiX1VJX1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsX3R5cGUiKSwNCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19USU1FX1BFUklPRCwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbC5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgew0KKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbTE2L1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsIikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbClvYmplY3QpLmdldFVSSSgpLmxhc3RTZWdtZW50KCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbF90eXBlIikgOg0KKwkJCWxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7DQorCQlTdHJpbmcgbGFiZWwgPSAoKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKW9iamVjdCkuZ2V0TmFtZSgpOw0KKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQorCQkJZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxfdHlwZSIpIDoNCisJCQlnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbF90eXBlIikgKyAiICIgKyBsYWJlbDsNCisJfQ0KKwkNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisNCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbC5jbGFzcykpIHsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19CSVJUSF9SQVRFOg0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX0RFQVRIX1JBVEU6DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fVElNRV9QRVJJT0Q6DQorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YjU1OWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMzcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWw7DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbH0gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK0BTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSANCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIFBvcHVsYXRpb25Nb2RlbExhYmVsSXRlbVByb3ZpZGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCQlhZGREZWx0YVZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkUHJvYmVWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJCWFkZFRlbXBWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJCWFkZE9yaWdpbmFsVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGRFcnJvclNjYWxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZWx0YSBWYWx1ZSBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkRGVsdGFWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbF9kZWx0YVZhbHVlX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbF9kZWx0YVZhbHVlX2ZlYXR1cmUiLCAiX1VJX1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxfdHlwZSIpLA0KKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfX0RFTFRBX1ZBTFVFLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJvYmUgVmFsdWUgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFByb2JlVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxfcHJvYmVWYWx1ZV9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxfcHJvYmVWYWx1ZV9mZWF0dXJlIiwgIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsX3R5cGUiKSwNCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19QUk9CRV9WQUxVRSwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIHRydWUsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRlbXAgVmFsdWUgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFRlbXBWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbF90ZW1wVmFsdWVfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsX3RlbXBWYWx1ZV9mZWF0dXJlIiwgIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsX3R5cGUiKSwNCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19URU1QX1ZBTFVFLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgT3JpZ2luYWwgVmFsdWUgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE9yaWdpbmFsVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxfb3JpZ2luYWxWYWx1ZV9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxfb3JpZ2luYWxWYWx1ZV9mZWF0dXJlIiwgIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsX3R5cGUiKSwNCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX19PUklHSU5BTF9WQUxVRSwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIHRydWUsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVycm9yIFNjYWxlIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRFcnJvclNjYWxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsX2Vycm9yU2NhbGVfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsX2Vycm9yU2NhbGVfZmVhdHVyZSIsICJfVUlfU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbF90eXBlIiksDQorCQkJCSBTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9fRVJST1JfU0NBTEUsDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSB0cnVlLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsLmdpZi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsIikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlVUkkgbGFiZWxWYWx1ZSA9ICgoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbClvYmplY3QpLmdldFVSSSgpOw0KKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxfdHlwZSIpIDoNCisJCQlnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsX3R5cGUiKSArICIgIiArIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYjVhMWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI0NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJvdmlkZXI7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWU7DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlfSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIA0KK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSXRlbVByb3ZpZGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KKw0KKwkJCWFkZENvdW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkSW5jaWRlbmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkQmlydGhzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkRGVhdGhzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkRGVuc2l0eVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJfQ0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ291bnQgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENvdW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfY291bnRfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfY291bnRfZmVhdHVyZSIsICJfVUlfU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlX3R5cGUiKSwNCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19DT1VOVCwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEluY2lkZW5jZSBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkSW5jaWRlbmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfaW5jaWRlbmNlX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlX2luY2lkZW5jZV9mZWF0dXJlIiwgIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfdHlwZSIpLA0KKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0lOQ0lERU5DRSwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJpcnRocyBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQmlydGhzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfYmlydGhzX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlX2JpcnRoc19mZWF0dXJlIiwgIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfdHlwZSIpLA0KKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0JJUlRIUywNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlYXRocyBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkRGVhdGhzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfZGVhdGhzX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlX2RlYXRoc19mZWF0dXJlIiwgIl9VSV9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVfdHlwZSIpLA0KKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0RFQVRIUywNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlbnNpdHkgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZERlbnNpdHlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZV9kZW5zaXR5X2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlX2RlbnNpdHlfZmVhdHVyZSIsICJfVUlfU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlX3R5cGUiKSwNCisJCQkJIFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19ERU5TSVRZLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZS5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlID0gKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSlvYmplY3Q7DQorCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlX3R5cGUiKSArICIgIiArIHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZS5nZXRDb3VudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQorDQorCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlLmNsYXNzKSkgew0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0NPVU5UOg0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0lOQ0lERU5DRToNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19CSVJUSFM6DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRV9fREVBVEhTOg0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0RFTlNJVFk6DQorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcm92aWRlci9TdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmRkYWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNjUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbH0gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK0BTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSANCitwdWJsaWMgY2xhc3MgU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsSXRlbVByb3ZpZGVyDQorCWV4dGVuZHMgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQorDQorCQkJYWRkR2FpblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJfQ0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgR2FpbiBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkR2FpblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsX2dhaW5fZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxfZ2Fpbl9mZWF0dXJlIiwgIl9VSV9TdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxfdHlwZSIpLA0KKwkJCQkgU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNUT0NIQVNUSUNfU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fR0FJTiwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIFN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbC5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgew0KKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL2N1c3RvbTE2L1N0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCisJCVN0cmluZyBsYWJlbCA9ICgoU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKW9iamVjdCkuZ2V0VVJJKCkubGFzdFNlZ21lbnQoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX1N0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbF90eXBlIikgOg0KKwkJCWxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7DQorCQlTdHJpbmcgbGFiZWwgPSAoKFN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbClvYmplY3QpLmdldE5hbWUoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX1N0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbF90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX1N0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbF90eXBlIikgKyAiICIgKyBsYWJlbDsNCisJfQ0KKwkNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisNCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwuY2xhc3MpKSB7DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RPQ0hBU1RJQ19TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19HQUlOOg0KKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1lldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL1lldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTNkYmE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLllldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplcn0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplckl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVySXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCisJCUlJdGVtTGFiZWxQcm92aWRlciwKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXIuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplciIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVyKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplcl90eXBlIikgOgorCQkJZ2V0U3RyaW5nKCJfVUlfWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplcl90eXBlIikgKyAiICIgKyBsYWJlbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3V0aWwvU3RhbmRhcmRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvdXRpbC9TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlYWQxYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3V0aWwvU3RhbmRhcmRBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNjM5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC51dGlsOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY05vZGVMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsVmFsdWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuKjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLkRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkdyb3VwOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkluaXRpYWxpemVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuDQorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTdGFuZGFyZEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgU3RhbmRhcmRQYWNrYWdlIG1vZGVsUGFja2FnZTsNCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdGFuZGFyZEFkYXB0ZXJGYWN0b3J5KCkgew0KKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7DQorCQkJbW9kZWxQYWNrYWdlID0gU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Lg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsNCisJCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSANCisJcHJvdGVjdGVkIFN0YW5kYXJkU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0NCisJCW5ldyBTdGFuZGFyZFN3aXRjaDxBZGFwdGVyPigpIHsNCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUG9wdWxhdGlvbk1vZGVsKFBvcHVsYXRpb25Nb2RlbCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZVBvcHVsYXRpb25Nb2RlbEFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQb3B1bGF0aW9uTW9kZWxMYWJlbChQb3B1bGF0aW9uTW9kZWxMYWJlbCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZVBvcHVsYXRpb25Nb2RlbExhYmVsQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbEFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUludGVncmF0aW9uTGFiZWwoSW50ZWdyYXRpb25MYWJlbCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUludGVncmF0aW9uTGFiZWxBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJbnRlZ3JhdGlvbkxhYmVsVmFsdWUoSW50ZWdyYXRpb25MYWJlbFZhbHVlIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlSW50ZWdyYXRpb25MYWJlbFZhbHVlQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSW50ZWdyYXRpb25EZWNvcmF0b3IoSW50ZWdyYXRpb25EZWNvcmF0b3Igb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVJbnRlZ3JhdGlvbkRlY29yYXRvckFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUoUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZVBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKFN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZVN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsKERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQb3B1bGF0aW9uR3JvdXAoUG9wdWxhdGlvbkdyb3VwIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlUG9wdWxhdGlvbkdyb3VwQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUG9wdWxhdGlvbkluaXRpYWxpemVyKFBvcHVsYXRpb25Jbml0aWFsaXplciBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZVBvcHVsYXRpb25Jbml0aWFsaXplckFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyKFN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTZWFzb25hbFBvcHVsYXRpb25Nb2RlbChTZWFzb25hbFBvcHVsYXRpb25Nb2RlbCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZVNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyKEVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplciBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplckFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplciBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZVlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyA8VD4gQWRhcHRlciBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlQ29tcGFyYWJsZUFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVJZGVudGlmaWFibGVBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZWNvcmF0b3IoRGVjb3JhdG9yIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlRGVjb3JhdG9yQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTm9kZURlY29yYXRvcihOb2RlRGVjb3JhdG9yIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlTm9kZURlY29yYXRvckFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1vZGlmaWFibGUoTW9kaWZpYWJsZSBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZU1vZGlmaWFibGVBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VMYWJlbChMYWJlbCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUxhYmVsQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRHluYW1pY0xhYmVsKER5bmFtaWNMYWJlbCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUR5bmFtaWNMYWJlbEFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU5vZGVMYWJlbChOb2RlTGFiZWwgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVOb2RlTGFiZWxBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEeW5hbWljTm9kZUxhYmVsKER5bmFtaWNOb2RlTGFiZWwgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVEeW5hbWljTm9kZUxhYmVsQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU2FuaXR5Q2hlY2tlcihTYW5pdHlDaGVja2VyIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlU2FuaXR5Q2hlY2tlckFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUxhYmVsVmFsdWUoTGFiZWxWYWx1ZSBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUxhYmVsVmFsdWVBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOw0KKwkJCX0NCisJCX07DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0Lg0KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7DQorCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsNCisJfQ0KKw0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsIDxlbT5Qb3B1bGF0aW9uIE1vZGVsPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9wdWxhdGlvbk1vZGVsQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCA8ZW0+UG9wdWxhdGlvbiBNb2RlbDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsIDxlbT5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWxMYWJlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3B1bGF0aW9uTW9kZWxMYWJlbEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCA8ZW0+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsIDxlbT5JbnRlZ3JhdGlvbiBMYWJlbDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbnRlZ3JhdGlvbkxhYmVsQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsVmFsdWUgPGVtPkludGVncmF0aW9uIExhYmVsIFZhbHVlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsVmFsdWUNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSW50ZWdyYXRpb25MYWJlbFZhbHVlQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvciA8ZW0+SW50ZWdyYXRpb24gRGVjb3JhdG9yPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvcg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbnRlZ3JhdGlvbkRlY29yYXRvckFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSA8ZW0+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbCBWYWx1ZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgPGVtPlBvcHVsYXRpb24gTW9kZWwgTGFiZWwgVmFsdWU8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCA8ZW0+U3RvY2hhc3RpYyBTdGFuZGFyZCBQb3B1bGF0aW9uIE1vZGVsPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5EZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbCA8ZW0+RGVtb2dyYXBoaWMgUG9wdWxhdGlvbiBNb2RlbDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWxBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Hcm91cCA8ZW0+UG9wdWxhdGlvbiBHcm91cDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkdyb3VwDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcHVsYXRpb25Hcm91cEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkluaXRpYWxpemVyIDxlbT5Qb3B1bGF0aW9uIEluaXRpYWxpemVyPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uSW5pdGlhbGl6ZXINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9wdWxhdGlvbkluaXRpYWxpemVyQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplciA8ZW0+UG9wdWxhdGlvbiBJbml0aWFsaXplcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsIDxlbT5TZWFzb25hbCBQb3B1bGF0aW9uIE1vZGVsPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TZWFzb25hbFBvcHVsYXRpb25Nb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWFzb25hbFBvcHVsYXRpb25Nb2RlbEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyIDxlbT5FYXJ0aCBTY2llbmNlIFBvcHVsYXRpb24gSW5pdGlhbGl6ZXI8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLkVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplcg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXJBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLllldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXIgPGVtPllldGkgUG9wdWxhdGlvbiBJbml0aWFsaXplcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplcg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVyQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmEubGFuZy5Db21wYXJhYmxlIDxlbT5Db21wYXJhYmxlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhcmFibGVBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUgPGVtPklkZW50aWZpYWJsZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJZGVudGlmaWFibGVBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvciA8ZW0+RGVjb3JhdG9yPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3INCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVjb3JhdG9yQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yIDxlbT5Ob2RlIERlY29yYXRvcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVOb2RlRGVjb3JhdG9yQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlIDxlbT5Nb2RpZmlhYmxlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZGlmaWFibGVBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsIDxlbT5MYWJlbDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTGFiZWxBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbCA8ZW0+RHluYW1pYyBMYWJlbDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUR5bmFtaWNMYWJlbEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsIDxlbT5Ob2RlIExhYmVsPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTm9kZUxhYmVsQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTm9kZUxhYmVsIDxlbT5EeW5hbWljIE5vZGUgTGFiZWw8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNOb2RlTGFiZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRHluYW1pY05vZGVMYWJlbEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIgPGVtPlNhbml0eSBDaGVja2VyPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTYW5pdHlDaGVja2VyQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlIDxlbT5MYWJlbCBWYWx1ZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVMYWJlbFZhbHVlQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30gLy9TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvdXRpbC9TdGFuZGFyZFN3aXRjaC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvdXRpbC9TdGFuZGFyZFN3aXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YWU3NjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC91dGlsL1N0YW5kYXJkU3dpdGNoLmphdmEKQEAgLTAsMCArMSw3MjQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnV0aWw7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNOb2RlTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbFZhbHVlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLio7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5EZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Hcm91cDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Jbml0aWFsaXplcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWw7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5Lg0KKyAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0NCisgKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsDQorICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QNCisgKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5DQorICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsDQorICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZQ0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikNCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRTd2l0Y2g8VDE+IHsNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQ0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBTdGFuZGFyZFBhY2thZ2UgbW9kZWxQYWNrYWdlOw0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0YW5kYXJkU3dpdGNoKCkgew0KKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7DQorCQkJbW9kZWxQYWNrYWdlID0gU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVDEgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7DQorCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7DQorCX0NCisNCisJLyoqDQorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFQxIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgew0KKwkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7DQorCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7DQorCQl9DQorCQllbHNlIHsNCisJCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsNCisJCQlyZXR1cm4NCisJCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8NCisJCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoNCisJCQkJCWRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFQxIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgew0KKwkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsNCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX01PREVMOiB7DQorCQkJCVBvcHVsYXRpb25Nb2RlbCBwb3B1bGF0aW9uTW9kZWwgPSAoUG9wdWxhdGlvbk1vZGVsKXRoZUVPYmplY3Q7DQorCQkJCVQxIHJlc3VsdCA9IGNhc2VQb3B1bGF0aW9uTW9kZWwocG9wdWxhdGlvbk1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZURlY29yYXRvcihwb3B1bGF0aW9uTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKHBvcHVsYXRpb25Nb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcihwb3B1bGF0aW9uTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUocG9wdWxhdGlvbk1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShwb3B1bGF0aW9uTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMOiB7DQorCQkJCVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsIHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsID0gKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKXRoZUVPYmplY3Q7DQorCQkJCVQxIHJlc3VsdCA9IGNhc2VTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbChzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBvcHVsYXRpb25Nb2RlbChzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZURlY29yYXRvcihzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUoc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZWNvcmF0b3Ioc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUoc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuUE9QVUxBVElPTl9NT0RFTF9MQUJFTDogew0KKwkJCQlQb3B1bGF0aW9uTW9kZWxMYWJlbCBwb3B1bGF0aW9uTW9kZWxMYWJlbCA9IChQb3B1bGF0aW9uTW9kZWxMYWJlbCl0aGVFT2JqZWN0Ow0KKwkJCQlUMSByZXN1bHQgPSBjYXNlUG9wdWxhdGlvbk1vZGVsTGFiZWwocG9wdWxhdGlvbk1vZGVsTGFiZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEeW5hbWljTm9kZUxhYmVsKHBvcHVsYXRpb25Nb2RlbExhYmVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRHluYW1pY0xhYmVsKHBvcHVsYXRpb25Nb2RlbExhYmVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZUxhYmVsKHBvcHVsYXRpb25Nb2RlbExhYmVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGFiZWwocG9wdWxhdGlvbk1vZGVsTGFiZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUocG9wdWxhdGlvbk1vZGVsTGFiZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHBvcHVsYXRpb25Nb2RlbExhYmVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTDogew0KKwkJCQlTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsIHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwgPSAoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCl0aGVFT2JqZWN0Ow0KKwkJCQlUMSByZXN1bHQgPSBjYXNlU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbChzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUG9wdWxhdGlvbk1vZGVsTGFiZWwoc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVncmF0aW9uTGFiZWwoc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUR5bmFtaWNOb2RlTGFiZWwoc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUR5bmFtaWNMYWJlbChzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZUxhYmVsKHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbChzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFOiB7DQorCQkJCVBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgcG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSA9IChQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKXRoZUVPYmplY3Q7DQorCQkJCVQxIHJlc3VsdCA9IGNhc2VQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKHBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbFZhbHVlKHBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTYW5pdHlDaGVja2VyKHBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFOiB7DQorCQkJCVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSBzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgPSAoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKXRoZUVPYmplY3Q7DQorCQkJCVQxIHJlc3VsdCA9IGNhc2VTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUoc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZShzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJbnRlZ3JhdGlvbkxhYmVsVmFsdWUoc3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGFiZWxWYWx1ZShzdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTYW5pdHlDaGVja2VyKHN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUT0NIQVNUSUNfU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTDogew0KKwkJCQlTdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwgc3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsID0gKFN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCl0aGVFT2JqZWN0Ow0KKwkJCQlUMSByZXN1bHQgPSBjYXNlU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKHN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKHN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBvcHVsYXRpb25Nb2RlbChzdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJbnRlZ3JhdGlvbkRlY29yYXRvcihzdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlRGVjb3JhdG9yKHN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUoc3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKHN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShzdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkRFTU9HUkFQSElDX1BPUFVMQVRJT05fTU9ERUw6IHsNCisJCQkJRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwgZGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwgPSAoRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwpdGhlRU9iamVjdDsNCisJCQkJVDEgcmVzdWx0ID0gY2FzZURlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsKGRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwoZGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQb3B1bGF0aW9uTW9kZWwoZGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJbnRlZ3JhdGlvbkRlY29yYXRvcihkZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3IoZGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKGRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKGRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKGRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShkZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fR1JPVVA6IHsNCisJCQkJUG9wdWxhdGlvbkdyb3VwIHBvcHVsYXRpb25Hcm91cCA9IChQb3B1bGF0aW9uR3JvdXApdGhlRU9iamVjdDsNCisJCQkJVDEgcmVzdWx0ID0gY2FzZVBvcHVsYXRpb25Hcm91cChwb3B1bGF0aW9uR3JvdXApOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5QT1BVTEFUSU9OX0lOSVRJQUxJWkVSOiB7DQorCQkJCVBvcHVsYXRpb25Jbml0aWFsaXplciBwb3B1bGF0aW9uSW5pdGlhbGl6ZXIgPSAoUG9wdWxhdGlvbkluaXRpYWxpemVyKXRoZUVPYmplY3Q7DQorCQkJCVQxIHJlc3VsdCA9IGNhc2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXIocG9wdWxhdGlvbkluaXRpYWxpemVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZURlY29yYXRvcihwb3B1bGF0aW9uSW5pdGlhbGl6ZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKHBvcHVsYXRpb25Jbml0aWFsaXplcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcihwb3B1bGF0aW9uSW5pdGlhbGl6ZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUocG9wdWxhdGlvbkluaXRpYWxpemVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShwb3B1bGF0aW9uSW5pdGlhbGl6ZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX0lOSVRJQUxJWkVSOiB7DQorCQkJCVN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyIHN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyID0gKFN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyKXRoZUVPYmplY3Q7DQorCQkJCVQxIHJlc3VsdCA9IGNhc2VTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcihzdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBvcHVsYXRpb25Jbml0aWFsaXplcihzdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3Ioc3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKHN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKHN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShzdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUw6IHsNCisJCQkJU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwgc2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwgPSAoU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwpdGhlRU9iamVjdDsNCisJCQkJVDEgcmVzdWx0ID0gY2FzZVNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsKHNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwoc2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQb3B1bGF0aW9uTW9kZWwoc2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJbnRlZ3JhdGlvbkRlY29yYXRvcihzZWFzb25hbFBvcHVsYXRpb25Nb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3Ioc2Vhc29uYWxQb3B1bGF0aW9uTW9kZWwpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKHNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKHNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShzZWFzb25hbFBvcHVsYXRpb25Nb2RlbCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLkVBUlRIX1NDSUVOQ0VfUE9QVUxBVElPTl9JTklUSUFMSVpFUjogew0KKwkJCQlFYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXIgZWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyID0gKEVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplcil0aGVFT2JqZWN0Ow0KKwkJCQlUMSByZXN1bHQgPSBjYXNlRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyKGVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBvcHVsYXRpb25Jbml0aWFsaXplcihlYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlRGVjb3JhdG9yKGVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUoZWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVjb3JhdG9yKGVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShlYXJ0aFNjaWVuY2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKGVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLllFVElfUE9QVUxBVElPTl9JTklUSUFMSVpFUjogew0KKwkJCQlZZXRpUG9wdWxhdGlvbkluaXRpYWxpemVyIHlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXIgPSAoWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplcil0aGVFT2JqZWN0Ow0KKwkJCQlUMSByZXN1bHQgPSBjYXNlWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplcih5ZXRpUG9wdWxhdGlvbkluaXRpYWxpemVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyKHlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoeWV0aVBvcHVsYXRpb25Jbml0aWFsaXplcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3IoeWV0aVBvcHVsYXRpb25Jbml0aWFsaXplcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGlmaWFibGUoeWV0aVBvcHVsYXRpb25Jbml0aWFsaXplcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcih5ZXRpUG9wdWxhdGlvbkluaXRpYWxpemVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcHVsYXRpb24gTW9kZWw8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3B1bGF0aW9uIE1vZGVsPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VQb3B1bGF0aW9uTW9kZWwoUG9wdWxhdGlvbk1vZGVsIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcHVsYXRpb24gTW9kZWw8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3B1bGF0aW9uIE1vZGVsPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbDwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlUG9wdWxhdGlvbk1vZGVsTGFiZWwoUG9wdWxhdGlvbk1vZGVsTGFiZWwgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcHVsYXRpb24gTW9kZWwgTGFiZWw8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVDEgY2FzZVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWwoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlZ3JhdGlvbiBMYWJlbDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVncmF0aW9uIExhYmVsPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VJbnRlZ3JhdGlvbkxhYmVsKEludGVncmF0aW9uTGFiZWwgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZWdyYXRpb24gTGFiZWwgVmFsdWU8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlZ3JhdGlvbiBMYWJlbCBWYWx1ZTwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlSW50ZWdyYXRpb25MYWJlbFZhbHVlKEludGVncmF0aW9uTGFiZWxWYWx1ZSBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlZ3JhdGlvbiBEZWNvcmF0b3I8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlZ3JhdGlvbiBEZWNvcmF0b3I8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVDEgY2FzZUludGVncmF0aW9uRGVjb3JhdG9yKEludGVncmF0aW9uRGVjb3JhdG9yIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcHVsYXRpb24gTW9kZWwgTGFiZWwgVmFsdWU8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3B1bGF0aW9uIE1vZGVsIExhYmVsIFZhbHVlPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlKFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9wdWxhdGlvbiBNb2RlbCBMYWJlbCBWYWx1ZTwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcHVsYXRpb24gTW9kZWwgTGFiZWwgVmFsdWU8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVDEgY2FzZVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZShTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RvY2hhc3RpYyBTdGFuZGFyZCBQb3B1bGF0aW9uIE1vZGVsPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RvY2hhc3RpYyBTdGFuZGFyZCBQb3B1bGF0aW9uIE1vZGVsPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VTdG9jaGFzdGljU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwoU3RvY2hhc3RpY1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbW9ncmFwaGljIFBvcHVsYXRpb24gTW9kZWw8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZW1vZ3JhcGhpYyBQb3B1bGF0aW9uIE1vZGVsPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VEZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbChEZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3B1bGF0aW9uIEdyb3VwPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9wdWxhdGlvbiBHcm91cDwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlUG9wdWxhdGlvbkdyb3VwKFBvcHVsYXRpb25Hcm91cCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3B1bGF0aW9uIEluaXRpYWxpemVyPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9wdWxhdGlvbiBJbml0aWFsaXplcjwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlUG9wdWxhdGlvbkluaXRpYWxpemVyKFBvcHVsYXRpb25Jbml0aWFsaXplciBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3B1bGF0aW9uIEluaXRpYWxpemVyPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9wdWxhdGlvbiBJbml0aWFsaXplcjwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2Vhc29uYWwgUG9wdWxhdGlvbiBNb2RlbDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlYXNvbmFsIFBvcHVsYXRpb24gTW9kZWw8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVDEgY2FzZVNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsKFNlYXNvbmFsUG9wdWxhdGlvbk1vZGVsIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVhcnRoIFNjaWVuY2UgUG9wdWxhdGlvbiBJbml0aWFsaXplcjwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVhcnRoIFNjaWVuY2UgUG9wdWxhdGlvbiBJbml0aWFsaXplcjwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlRWFydGhTY2llbmNlUG9wdWxhdGlvbkluaXRpYWxpemVyKEVhcnRoU2NpZW5jZVBvcHVsYXRpb25Jbml0aWFsaXplciBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5ZZXRpIFBvcHVsYXRpb24gSW5pdGlhbGl6ZXI8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5ZZXRpIFBvcHVsYXRpb24gSW5pdGlhbGl6ZXI8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVDEgY2FzZVlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoWWV0aVBvcHVsYXRpb25Jbml0aWFsaXplciBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyA8VD4gVDEgY2FzZUNvbXBhcmFibGUoQ29tcGFyYWJsZTxUPiBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JZGVudGlmaWFibGU8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVDEgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVjb3JhdG9yPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVjb3JhdG9yPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VEZWNvcmF0b3IoRGVjb3JhdG9yIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgRGVjb3JhdG9yPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZSBEZWNvcmF0b3I8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVDEgY2FzZU5vZGVEZWNvcmF0b3IoTm9kZURlY29yYXRvciBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2RpZmlhYmxlPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kaWZpYWJsZTwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlTW9kaWZpYWJsZShNb2RpZmlhYmxlIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxhYmVsPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGFiZWw8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVDEgY2FzZUxhYmVsKExhYmVsIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkR5bmFtaWMgTGFiZWw8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EeW5hbWljIExhYmVsPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VEeW5hbWljTGFiZWwoRHluYW1pY0xhYmVsIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgTGFiZWw8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlIExhYmVsPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VOb2RlTGFiZWwoTm9kZUxhYmVsIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkR5bmFtaWMgTm9kZSBMYWJlbDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkR5bmFtaWMgTm9kZSBMYWJlbDwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlRHluYW1pY05vZGVMYWJlbChEeW5hbWljTm9kZUxhYmVsIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNhbml0eSBDaGVja2VyPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2FuaXR5IENoZWNrZXI8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVDEgY2FzZVNhbml0eUNoZWNrZXIoU2FuaXR5Q2hlY2tlciBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MYWJlbCBWYWx1ZTwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxhYmVsIFZhbHVlPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VMYWJlbFZhbHVlKExhYmVsVmFsdWUgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30gLy9TdGFuZGFyZFN3aXRjaA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0N2M1OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nLy5wcm9qZWN0CkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvUkVBRE1FLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczZTFlMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL1JFQURNRS50eHQKQEAgLTAsMCArMSw2MSBAQAorVGhpcyBwcm9qZWN0IHNlcnZlcyBhcyB0aGUgcmVwb3NpdG9yeSBmb3IgdGhlIHJlbGVhc2UgZW5naW5lZXJpbmcgY29tcG9uZW50cyBvZiB0aGUgU1RFTSBwcm9qZWN0LiAgCisKK1RoZSBmb2xkZXJzICIzLjMiIGFuZCAiMy40IiBjb250YWluIHRoZSBzY3JpcHRzIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzIG5lZWRlZCB0byBidWlsZCBTVEVNIGZvciB0aGUgCitFY2xpcHNlIDMuMyBhbmQgMy40IHBsYXRmb3JtcywgcmVzcGVjdGl2ZWx5LiAgVGhlIGZvbGRlciAibWFwcyIgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgdGhhdAorbWFwIHRoZSBpZCdzIG9mIHRoZSBwbHVnaW5zIGFuZCBmZWF0dXJlcyB0byB0aGVpciByZXBvc2l0b3J5IGxvY2F0aW9ucy4gIFRoaXMgaW5kaXJlY3Rpb24gYWxsb3dzIHRoZQorZXhhY3QgcmVwb3NpdG9yeSB2ZXJzaW9uIG9mIGEgcGx1Z2luIHRvIGJlIGFsdGVyZWQgd2l0aG91dCBjaGFuZ2luZyB0aGUgcmVzdCBvZiB0aGUgYnVpbGQgcHJvY2Vzcy4KKworVGhlIGZpbGVzIHRoYXQgZGVmaW5lIHRoZSBidWlsZCBwcm9jZXNzIGFyZSBpbiB0aGUgIjMuMy9jb25maWciIGFuZCAiMy40L2NvbmZpZyIgZm9sZGVycy4gIFRoZSBmaWxlcworaW4gdGhlc2UgdHdvIGZvbGRlcnMgb25seSBkaWZmZXIgc2xpZ2h0bHkgaW4gdGhlIGRldGFpbHMgdGhhdCBhcmUgZGlmZmVyZW50IGJldHdlZW4gdmVyc2lvbnMgMy4zIGFuZCAzLjQKK29mIEVjbGlwc2UuICAKKworCWFsbEVsZW1lbnRzLnhtbAkJVGhpcyBoYXMgdG8gZG8gd2l0aCAiZmVhdHVyZSIgYnVpbGRzLgorCWJ1aWxkLmJhdAkJCVRoaXMgaXMgdGhlIHNjcmlwdCBmaWxlIHRoYXQgcnVucyB0aGUgYnVpbGQgcHJvY2Vzcy4KKwlidWlsZC5wcm9wZXJ0aWVzCVNwZWNpZmljYXRpb24gb2YgdGhlIGJ1aWxkIHByb2Nlc3MsIHN1Y2ggYXMgdGhlIHBsYXRmb3JtcyB0byBidWlsZCBvbiwgdGhlCisJCQkJCQl2ZXJzaW9uIG51bWJlciBlbmNvZGVkIGluIHRoZSBidWlsZC4KKwljdXN0b21UYXJnZXRzLnhtbAlUaGUgbWFpbiB0b3AtbGV2ZWwgc2V0IG9mIGFudCB0YXJnZXRzIHRoYXQgYXJlIHByb2Nlc3NlZCBkdXJpbmcgdGhlIGJ1aWxkLiAgVGhpcworCQkJCQkJCWlzIG1vZGlmaWVkIHRvIGluY29ycG9yYXRlIHNwZWNpZmljIHByb2Nlc3Npbmcgc3RlcHMuICBJbiB0aGUgY2FzZSBvZiBTVEVNLAorCQkJCQkJCXRoaXMgaW5jbHVkZXM6CisJCQkJCQkJCSJwb3N0c2V0dXAiIAkJbW9kaWZpZWQgZm9yIGludGVybmFsLmRhdGEKKwkJCQkJCQkJInBvc3RnZW5lcmF0ZSIgCW1vZGlmaWVkIHRvIGluY2x1ZGUgaW50ZXJuYWwuZGF0YQorCQkJCQkJCQkicG9zdHByb2Nlc3MiIAltb2RpZmllZCB0byBydW4gdGhlIGFudCBzY3JpcHRzIGZvciBpbnRlcm5hbC5kYXRhIGFuZCBnZS52aWV3CisKK1RoZSAicmVzb3VyY2VzIiBmb2xkZXIgY29udGFpbnMgZmlsZXMgdGhhdCBhcmUgdXNlZnVsIGZvciB0aGUgZW50aXJlIHByb2plY3QuCisKKwljb2RlY2xlYW51cGNvbmZpZ3VyYXRpb24ueG1sIGNvbnRhaW5zIHRoZSBzcGVjaWZpY2F0aW9uIG9mICJzb3VyY2UgY29kZSBjbGVhbnVwIgorCQorCitDcmVhdGluZyBhIEJ1aWxkCistLS0tLS0tLS0tLS0tLS0tCitUbyBzdGFydCBhIGJ1aWxkLCBydW4gdGhlICJidWlsZC5iYXQiIGZpbGUgaW4gZWl0aGVyIHRoZSAiMy4zL2NvbmZpZyIgb3IgIjMuNC9jb25maWciIGZpbGUuICBUaGlzIG9ubHkKK3dvcmtzIG9uIHRoZSB3aW5kb3dzIHBsYXRmb3JtLiAgSW4gdGhlIGZ1dHVyZSBhICJidWlsZC5zaCIgZmlsZSB3aWxsIGxpa2VseSBiZSBwcm92aWRlZCBmb3IgYnVpbGRzIG9uCit1bml4L2xpbnV4LiAgV2hlbiBjcmVhdGluZyBhIGJ1aWxkIGZvciBkaXN0cmlidXRpb24gdGhlIGJ1aWxkLmJhdCBmaWxlIG5lZWRzIHRvIGJlIGVkaXRlZCB0byB1cGRhdGUgdHdvCit2YXJpYWJsZXMgdGhhdCBzcGVjaWZ5IHRoZSB2ZXJzaW9uIGFuZCBxdWFsaWZpZXIuICBUaGUgdHdvIGxpbmVzIGluIHF1ZXN0aW9uIGFyZToKKworCXNldCBNQUpPUl9WRVJTSU9OPTAuMi4yCisKKwlzZXQgUVVBTElGSUVSPUkyMDA4MDExOC0xMjAwCisJCitUaGUgUVVBTElGSUVSIHZhcmlhYmxlIHNwZWNpZmllcyB0aGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgYnVpbGQsIGluIHRoZSBleGFtcGxlIGFib3ZlLCBKYW51YXJ5IDE4LCAyMDA4LCBhdCAxMjAwLiAgCitMaWtlbHkgdGhlIE1BSk9SX1ZFUlNJT04gbnVtYmVyIHdvdWxkIG5vdCBjaGFuZ2UgYXMgZnJlcXVlbnRseSBhcyB0aGUgUVVBTElGSUVSLgorCitBZGRpbmcgYSBuZXcgdmVyc2lvbiBvZiBFY2xpcHNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4geW91IGluc3RhbGwgYSBuZXcgdmVyc2lvbiBvZiBFY2xpcHNlLCB5b3UgbmVlZCB0byBhbHNvIGluc3RhbGwgdGhlICJlY2xpcHNlIFJDUCBkZWx0YSBwYWNrIiBmb3IgCithbGwgcGxhdGZvcm1zLiAgWW91J2xsIGZpbmQgdGhpcyBkaXN0cmlidXRlZCBvbiB0aGUgZG93bmxvYWQgcGFnZSBmb3IgdGhlIHZlcnNpb24gb2YgRWNsaXBzZS4gIEZvciBpbnN0YW5jZSwKK2ZvciBFY2xpcHNlIDMuNE00LCB0aGUgZG93bmxvYWQgcGFnZSBpcyBhdDoKKworaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvZG93bmxvYWRzL2Ryb3BzL1MtMy40TTQtMjAwNzEyMTMxNzAwL2luZGV4LnBocAorCithbmQgdGhlIGRlbHRhIHBhY2sgaXMgbmFtZWQ6IGVjbGlwc2UtUkNQLTMuNE00LWRlbHRhLXBhY2suemlwIGFuZCBpcyBmb3VuZCBsaXN0ZWQgdW5kZXIgdGhlICJSQ1AgU0RLIiAKK3NlY3Rpb24gb2YgdGhlIHBhZ2UuCisKK1RoZSBkZWx0YSBwYWNrIHppcCBmaWxlIGNvbnRhaW5zIGEgc2luZ2xlIHRvcC1sZXZlbCBmb2xkZXIgY2FsbGVkICJlY2xpcHNlIi4gIFRoaXMgZm9sZGVyIGlzIGEgIm1hdGNoIgorZm9yIHRoZSB0b3AtbGV2ZWwgZm9sZGVyIG9mIHRoZSBFY2xpcHNlIGluc3RhbGxhdGlvbi4gIFRvIGluY29ycG9yYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgZGVsdGEgcGFjaywKK3RoZSBmaWxlIGlzIHVuemlwcGVkICJvdmVyIiB0aGUgaW5zdGFsbCBmb2xkZXIuICBNYWtlIHN1cmUgdGhhdCB0aGUgeW91J3JlIG5vdCBydW5uaW5nIEVjbGlwc2UgZnJvbQordGhlIGluc3RhbGxhdGlvbiB5b3UgYXJlIG92ZXJ3cml0aW5nLgorIAorCisgCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL2J1aWxkLnNoIGIvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvYnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyMmU3MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL2J1aWxkLnNoCkBAIC0wLDAgKzEsNTMgQEAKKyMhL2Jpbi9iYXNoCisKKyMgcm9vdCBvZiBidWlsZCB0cmVlCitCVUlMRF9ST09UPSQoY2QgJChkaXJuYW1lICQwKTsgcHdkKQorCitCVUlMRD1gZGF0ZSAtdSArJVklbSVkYAorc2VkIC1pIC1lIHMvUVVBTElGSUVSPS4qL1FVQUxJRklFUj0kQlVJTEQvIGxvY2FsLnNoCisKK3NvdXJjZSAkQlVJTERfUk9PVC9sb2NhbC5zaAorCitRVUFMSUZJRVI9JEJVSUxEX1RZUEUkUVVBTElGSUVSCitlY2hvIFF1YWxpZmllciA9ICRRVUFMSUZJRVIKKworQlVJTERfSE9NRT0kQlVJTERfUk9PVC9idWlsZAorCitKQVZBX1ZNX0FSR1M9Ii1YbXMxMDI0TSAtWG14MTAyNE0iCisKK3JtIC1yIC1mICRCVUlMRF9IT01FCitta2RpciAtcCAkQlVJTERfSE9NRS9tYXBzCitjcCAkQlVJTERfUk9PVC9tYXBzL3N0ZW0ubWFwICRCVUlMRF9IT01FL21hcHMvCisKKworIyBGZWF0dXJlIGJ1aWxkCisjJEpBVkFfSE9NRS9iaW4vamF2YSBcCisjIC1YbXgyNTZtIFwKKyMgLWphciAkRUNMSVBTRV9IT01FL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlcl8qLmphciBcCisjIC1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRSdW5uZXIgXAorIyAtYnVpbGRmaWxlICRFQ0xJUFNFX0hPTUUvcGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuYnVpbGRfKi9zY3JpcHRzL2J1aWxkLnhtbCBcCisjIC1EYmFzZT0kQlVJTERfUk9PVCBcCisjIC1EYmFzZUxvY2F0aW9uPSRFQ0xJUFNFX0hPTUUgXAorIyAtRGJ1aWxkZXI9JEJVSUxEX1JPT1QvY29uZmlnIFwKKyMgLURmb3JjZUNvbnRleHRRdWFsaWZpZXI9JFFVQUxJRklFUiBcCisjIC1EbWFqb3JWZXJzaW9uPSRNQUpPUl9WRVJTSU9OIFwKKyMgJCoKKyAKKyMgUHJvZHVjdCBidWlsZAorJEpBVkFfSE9NRS9iaW4vamF2YSBcCisgJEpBVkFfVk1fQVJHUyBcCisgLWphciAkRUNMSVBTRV9IT01FL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlcl8qLmphciBcCisgLWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLmFudC5jb3JlLmFudFJ1bm5lciBcCisgLWJ1aWxkZmlsZSAkRUNMSVBTRV9IT01FL3BsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmJ1aWxkXyovc2NyaXB0cy9wcm9kdWN0QnVpbGQvcHJvZHVjdEJ1aWxkLnhtbCBcCisgLUR0b1B1Ymxpc2g9JFRPX1BVQkxJU0ggXAorIC1EdXNlcm5hbWU9JEVDTElQU0VfREVWRUxPUEVSX1VTRVJOQU1FIFwKKyAtRHBhc3N3b3JkPSRFQ0xJUFNFX0RFVkVMT1BFUl9QQVNTV09SRCBcCisgLURjaGVja291dERpcj0kQlVJTERfUk9PVC9jaGVja291dF9kaXIgXAorIC1EYmFzZT0kQlVJTERfUk9PVCBcCisgLURiYXNlTG9jYXRpb249JEVDTElQU0VfSE9NRSBcCisgLURidWlsZGVyPSRCVUlMRF9ST09UL2NvbmZpZyBcCisgLURmb3JjZUNvbnRleHRRdWFsaWZpZXI9JFFVQUxJRklFUiBcCisgLURtYWpvclZlcnNpb249JE1BSk9SX1ZFUlNJT04gXAorICQqCisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvY29uZmlnL2FsbEVsZW1lbnRzLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL2NvbmZpZy9hbGxFbGVtZW50cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmODA0OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL2NvbmZpZy9hbGxFbGVtZW50cy54bWwKQEAgLTAsMCArMSw0OSBAQAorPHByb2plY3QgbmFtZT0iYWxsRWxlbWVudHMgRGVsZWdhdG9yIj4KKwk8cHJvcGVydHkgbmFtZT0iZGVmYXVsdEFzc2VtYmx5RW5hYmxlZCIgdmFsdWU9InRydWUiIC8+CisJCisgCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAktLT4KKyAJPCEtLSBSdW4gYSBnaXZlbiAke3RhcmdldH0gb24gYWxsIGVsZW1lbnRzIGJlaW5nIGJ1aWx0CQkJCQkJLS0+CisJPCEtLSBSZXBsYWNlIGVsZW1lbnQuaWQgd2l0aCB0aGUgaWQgb2YgdGhlIHRvcCBsZXZlbCBlbGVtZW50IGJlaW5nIGJ1aWx0LiAgICAtLT4KKwk8IS0tIElmIGVsZW1lbnQuaWQgZG9lcyBub3QgZXhpc3QgaW4gJHtidWlsZERpcmVjdG9yeX0vZmVhdHVyZXMvZWxlbWVudC5pZCAgIC0tPgorCTwhLS0gb3IgJHtiYXNlTG9jYXRpb259L2ZlYXR1cmVzL2VsZW1lbnQuaWQsIHRoZW4geW91IG11c3QgcHJvdmlkZSB0aGUgICAgICAgLS0+CisJPCEtLSBsb2NhdGlvbiBieSBzZXR0aW5nIHRoZSBwcm9wZXJ0eSAicGx1Z2luUGF0aCIgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKwk8IS0tIEFkZCBvbiA8YW50PiB0YXNrIGZvciBlYWNoIHRvcCBsZXZlbCBlbGVtZW50IGJlaW5nIGJ1aWx0LiAgICAgICAgICAgICAtLT4KKyAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCS0tPgorIAk8dGFyZ2V0IG5hbWU9ImFsbEVsZW1lbnRzRGVsZWdhdG9yIj4KKyAJCTxhbnQgYW50ZmlsZT0iJHtnZW5lcmljVGFyZ2V0c30iIHRhcmdldD0iJHt0YXJnZXR9Ij4KKwkgCQk8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9IiR7dG9wTGV2ZWxFbGVtZW50VHlwZX0iIC8+CisJIAkJPHByb3BlcnR5IG5hbWU9ImlkIiB2YWx1ZT0iJHt0b3BMZXZlbEVsZW1lbnRJZH0iIC8+CisgCQk8L2FudD4KKyAJPC90YXJnZXQ+CisgCisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTwhLS0gIFRoZSBkZWZhdWx0IGFzc2VtYmxlIHRhcmdldCwgdGhpcyB3aWxsIGJlIGNhbGxlZCB0byBhc3NlbWJsZSBlYWNoCQktLT4JIAorCTwhLS0gIGNvbmZpZyBpZiBhIGN1c3RvbSBhc3NlbWJsZSB0YXJnZXQgaXMgbm90IGRlZmluZWQuCQkJCQktLT4KKwk8IS0tIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyB3aWxsIGJlIGRlZmluZWQ6CQkJCQkJCQktLT4KKwk8IS0tIAkJY29uZmlnIDogVGhlIGNvbmZpZ3VyYXRpb24gYmVpbmcgYXNzZW1ibGVkIGVnICJ3aW4zMi53aW4zMi54ODYiCS0tPgorCTwhLS0gCQllbGVtZW50OiBUaGUgZWxlbWVudCBiZWluZyBhc3NlbWJsZWQgZWcgIm9yZy5lY2xpcHNlLnNkayIJCS0tPgorCTwhLS0gCQlhc3NlbWJsZVNjcmlwdE5hbWU6IFRoZSBhc3NlbWJsZSBzY3JpcHQgdG8gYmUgY2FsbGVkCQkJLS0+CisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTx0YXJnZXQgbmFtZT0iZGVmYXVsdEFzc2VtYmxlIj4KKwkJPGFudCBhbnRmaWxlPSIke2Fzc2VtYmxlU2NyaXB0TmFtZX0iIGRpcj0iJHtidWlsZERpcmVjdG9yeX0iIC8+CisJPC90YXJnZXQ+CQorCQorIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQktLT4KKyAJPCEtLSBDdXN0b20gdGFyZ2V0cyB0byBhc3NlbWJsZSB0aGUgYnVpbHQgZWxlbWVudHMgZm9yIHBhcnRpY3VsYXIgCQkJLS0+CisgCTwhLS0gY29uZmlndXJhdGlvbnMuICBUaGVzZSBnZW5lcmFsbHkgY2FsbCB0aGUgZ2VuZXJhdGVkIGFzc2VtYmxlIHNjcmlwdHMgCS0tPgorIAk8IS0tIChuYW1lZCBpbiAgJHthc3NlbWJsZVNjcmlwdE5hbWV9KSBidXQgbWF5IGFsc28gYWRkIHByZSBhbmQgcG9zdAkJLS0+IAorIAk8IS0tIHByb2Nlc3NpbmcgICAgICAJCQkJCQkJCQkJCQkJCS0tPgorIAk8IS0tIEFkZCBvbmUgdGFyZ2V0IGZvciBlYWNoIHJvb3QgZWxlbWVudCBhbmQgZWFjaCBjb25maWd1cmF0aW9uIGZvciB3aGljaAktLT4gCisgCTwhLS0gY3VzdG9tIHByb2Nlc3NpbmcgaXMgZGVzaXJlZC4gUmVwbGFjZSBlbGVtZW50LmlkIHdpdGggdGhlIGlkIG9mIHRoZSAJLS0+CisgCTwhLS0gdG9wIGxldmVsIGVsZW1lbnQgYmVpbmcgYnVpbHQuICBBIHByb3BlcnR5IHdpdGggYSBtYXRjaGluZyBuYW1lIG11c3QgCS0tPgorIAk8IS0tIGJlIGRlZmluZWQgZm9yIHRoaXMgY3VzdG9tIHRhcmdldCB0byBiZSBjYWxsZWQgaW5zdGVhZCBvZiB0aGUgCQkJLS0+CisgCTwhLS0gZGVmYXVsdEFzc2VtYmxlIHRhcmdldCBhYm92ZS4JCQkJCQkJCQkJCS0tPgorCTwhLS0JRXhhbXBsZTogIG5hbWU9ImFzc2VtYmxlLm9yZy5lY2xpcHNlLnNkayIJCQkJCQkJLS0+CisJPCEtLQlFeGFtcGxlOiAgbmFtZT0iYXNzZW1ibGUub3JnLmVjbGlwc2Uuc2RrLndpbjMyLndpbjMyLng4NiIJCQktLT4KKyAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTxwcm9wZXJ0eSBuYW1lPSJhc3NlbWJsZS5vcmcuZWNsaXBzZS5zdGVtLmZlYXR1cmUud2luMzIud2luMzIueDg2IiB2YWx1ZT0idHJ1ZSIgLz4KKyAJPHRhcmdldCBuYW1lPSJhc3NlbWJsZS5vcmcuZWNsaXBzZS5zdGVtLmZlYXR1cmUud2luMzIud2luMzIueDg2Ij4KKyAJCTxhbnQgYW50ZmlsZT0iJHthc3NlbWJsZVNjcmlwdE5hbWV9IiBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9Ii8+CisgCTwvdGFyZ2V0PgorCQorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvY29uZmlnL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnJlbGVuZy9jb25maWcvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjQxMDliCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvY29uZmlnL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMzIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUGFyYW1ldGVycyBkZXNjcmliaW5nIGhvdyBhbmQgd2hlcmUgdG8gZXhlY3V0ZSB0aGUgYnVpbGQuCisjIFR5cGljYWwgdXNlcnMgbmVlZCBvbmx5IHVwZGF0ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisjICAgIGJhc2VMb2NhdGlvbiAtIHdoZXJlIHRoaW5ncyB5b3UgYXJlIGJ1aWxkaW5nIGFnYWluc3QgYXJlIGluc3RhbGxlZAorIyAgICBib290Y2xhc3NwYXRoIC0gVGhlIGJhc2UgamFycyB0byBjb21waWxlIGFnYWluc3QgKHR5cGljYWx5IHJ0LmphcikKKyMgICAgY29uZmlncyAtIHRoZSBsaXN0IG9mIHtvcywgd3MsIGFyY2h9IGNvbmZpZ3VyYXRpb25zIHRvIGJ1aWxkLiAgCisjCisjIE9mIGNvdXJzZSBhbnkgb2YgdGhlIHNldHRpbmdzIGhlcmUgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc3BlYydpbmcgCisjIHRoZW0gb24gdGhlIGNvbW1hbmQgbGluZSAoZS5nLiwgLURiYXNlTG9jYXRpb249ZDovZWNsaXBzZQorCisjVGhlIHR5cGUgb2YgdGhlIHRvcCBsZXZlbCBlbGVtZW50IHdlIGFyZSBidWlsZGluZywgIGdlbmVyYWxseSAiZmVhdHVyZSIKK3RvcExldmVsRWxlbWVudFR5cGUgPSBwcm9kdWN0CisjVGhlIGlkIG9mIHRoZSB0b3AgbGV2ZWwgZWxlbWVudCB3ZSBhcmUgYnVpbGRpbmcKK3RvcExldmVsRWxlbWVudElkID0gb3JnLmVjbGlwc2Uuc3RlbS51aS5wcm9kdWN0CisKKyMjIyMjIyMjIyMjIyMgUFJPRFVDVC9QQUNLQUdJTkcgQ09OVFJPTCAjIyMjIyMjIyMjIyMjCitwcm9kdWN0PW9yZy5lY2xpcHNlLnN0ZW0udWkvc3RlbS5wcm9kdWN0CitydW5QYWNrYWdlcj10cnVlCisKKyNTZXQgdGhlIG5hbWUgb2YgdGhlIGFyY2hpdmUgdGhhdCB3aWxsIHJlc3VsdCBmcm9tIHRoZSBwcm9kdWN0IGJ1aWxkLgorI2FyY2hpdmVOYW1lUHJlZml4PQorCisjIFRoZSBwcmVmaXggdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBhcmNoaXZlLgorYXJjaGl2ZVByZWZpeD1zdGVtCisKKyMgVGhlIGxvY2F0aW9uIHVuZGVyd2hpY2ggYWxsIG9mIHRoZSBidWlsZCBvdXRwdXQgd2lsbCBiZSBjb2xsZWN0ZWQuCitjb2xsZWN0aW5nRm9sZGVyPSR7YXJjaGl2ZVByZWZpeH0KKworIyBUaGUgbGlzdCBvZiB7b3MsIHdzLCBhcmNofSBjb25maWd1cmF0aW9ucyB0byBidWlsZC4gIFRoaXMgCisjIHZhbHVlIGlzIGEgJyYnIHNlcGFyYXRlZCBsaXN0IG9mICcsJyBzZXBhcmF0ZSB0cmlwbGVzLiAgRm9yIGV4YW1wbGUsIAorIyAgICAgY29uZmlncz13aW4zMix3aW4zMix4ODYgJiBsaW51eCxtb3RpZix4ODYKKyMgQnkgZGVmYXVsdCB0aGUgdmFsdWUgaXMgKiwqLCoKKyNjb25maWdzID0gKiwgKiwgKgorY29uZmlncz13aW4zMiwgd2luMzIsIHg4NiAmIG1hY29zeCwgY2FyYm9uLCBwcGMgJiBsaW51eCwgZ3RrLCB4ODYgJiBtYWNvc3gsIGNvY29hLCB4ODYgJiBsaW51eCwgZ3RrLCB4ODZfNjQgJiBsaW51eCwgZ3RrLCBwcGMKKyMJd2luMzIsIHdpbjMyLCB4ODYgJiBcCisjCWxpbnV4LCBndGssIHBwYyAmXAorIyBsaW51eCwgZ3RrLCB4ODYgJiBcCisjCWxpbnV4LCBndGssIHg4Nl82NCAmIFwKKyMJbGludXgsIG1vdGlmLCB4ODYgJiBcCisjCXNvbGFyaXMsIG1vdGlmLCBzcGFyYyAmIFwKKyMJc29sYXJpcywgZ3RrLCBzcGFyYyAmIFwKKyMJYWl4LCBtb3RpZiwgcHBjICYgXAorIwlocHV4LCBtb3RpZiwgUEFfUklTQyAmIFwKKyMJbWFjb3N4LCBjb2NvYSwgeDg2ICYgXAorIwltYWNvc3gsIGNhcmJvbiwgcHBjCisKKyMgQnkgZGVmYXVsdCBQREUgY3JlYXRlcyBvbmUgYXJjaGl2ZSAocmVzdWx0KSBwZXIgZW50cnkgbGlzdGVkIGluIHRoZSBjb25maWdzIHByb3BlcnR5LgorIyBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gdHJ1ZSB3aWxsIGNhdXNlIFBERSB0byBvbmx5IGNyZWF0ZSBvbmUgb3V0cHV0IGNvbnRhaW5pbmcgYWxsIAorIyBhcnRpZmFjdHMgZm9yIGFsbCB0aGUgcGxhdGZvcm1zIGxpc3RlZCBpbiB0aGUgY29uZmlncyBwcm9wZXJ0eS4KKyMgVG8gY29udHJvbCB0aGUgb3V0cHV0IGZvcm1hdCBmb3IgdGhlIGdyb3VwLCBhZGQgYSAiZ3JvdXAsIGdyb3VwLCBncm91cCAtIDxmb3JtYXQ+IiBlbnRyeSB0byB0aGUKKyMgYXJjaGl2ZXNGb3JtYXQuIAorI2dyb3VwQ29uZmlndXJhdGlvbnM9dHJ1ZQorCisjVGhlIGZvcm1hdCBvZiB0aGUgYXJjaGl2ZS4gQnkgZGVmYXVsdCBhIHppcCBpcyBjcmVhdGVkIHVzaW5nIGFudFppcC4KKyNUaGUgbGlzdCBjYW4gb25seSBjb250YWluIHRoZSBjb25maWd1cmF0aW9uIGZvciB3aGljaCB0aGUgZGVzaXJlZCBmb3JtYXQgaXMgZGlmZmVyZW50IHRoYW4gemlwLgorI2FyY2hpdmVzRm9ybWF0PXdpbjMyLCB3aW4zMiwgeDg2IC0gYW50WmlwJiBcCisjCWxpbnV4LCBndGssIHBwYyAtIGFudFppcCAmXAorIyAgICBsaW51eCwgZ3RrLCB4ODYgLSBhbnRaaXAmIFwKKyMJbGludXgsIGd0aywgeDg2XzY0IC0gYW50WmlwJiBcCisjIGxpbnV4LCBtb3RpZiwgeDg2IC0gYW50WmlwJiBcCisjCXNvbGFyaXMsIG1vdGlmLCBzcGFyYyAtIGFudFppcCYgXAorIwlzb2xhcmlzLCBndGssIHNwYXJjIC0gYW50WmlwJiBcCisjCWFpeCwgbW90aWYsIHBwYyAtIGFudFppcCYgXAorIwlocHV4LCBtb3RpZiwgUEFfUklTQyAtIGFudFppcCYgXAorIwltYWNvc3gsIGNhcmJvbiwgcHBjIC0gYW50WmlwCisJCisjU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdGhlIG91dHB1dCB0byBiZSByZWFkeSBmb3IgYW4gdXBkYXRlIGphciAobm8gc2l0ZS54bWwgZ2VuZXJhdGVkKQorI291dHB1dFVwZGF0ZUphcnMgPSBmYWxzZQorCisjU2V0IHRvIHRydWUgZm9yIEpubHAgZ2VuZXJhdGlvbgorI2NvZGViYXNlIHNob3VsZCBiZSBhIFVSTCB0aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgcm9vdCBvZiBhbGwgcmVsYXRpdmUgVVJMcyBpbiB0aGUgb3V0cHV0LgorI2dlbmVyYXRlSm5scD1mYWxzZQorI2pubHAuY29kZWJhc2U9PGNvZGViYXNlIHVybD4KKyNqbmxwLmoyc2U9PGoyc2UgdmVyc2lvbj4KKyNqbmxwLmxvY2FsZT08YSBsb2NhbGU+Cisjam5scC5nZW5lcmF0ZU9mZmxpbmVBbGxvd2VkPXRydWUgb3IgZmFsc2UgZ2VuZXJhdGUgPG9mZmxpbmVBbGxvd2VkLz4gYXR0cmlidXRlIGluIHRoZSBnZW5lcmF0ZWQgZmVhdHVyZXMKKyNqbmxwLmNvbmZpZ3M9JHtjb25maWdzfQkJCSN1bmNvbW1lbnQgdG8gZmlsdGVyIHRoZSBjb250ZW50IG9mIHRoZSBnZW5lcmF0ZWQgam5scCBmaWxlcyBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBiZWluZyBidWlsdAorCisjU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gc2lnbiBqYXJzCisjc2lnbkphcnM9ZmFsc2UKKyNzaWduLmFsaWFzPTxhbGlhcz4KKyNzaWduLmtleXN0b3JlPTxrZXlzdG9yZSBsb2NhdGlvbj4KKyNzaWduLnN0b3JlcGFzcz08a2V5c3RvcmUgcGFzc3dvcmQ+CisKKyNBcmd1bWVudHMgdG8gc2VuZCB0byB0aGUgemlwIGV4ZWN1dGFibGUKK3ppcGFyZ3M9CisKKyNBcmd1bWVudHMgdG8gc2VuZCB0byB0aGUgdGFyIGV4ZWN1dGFibGUKK3RhcmFyZ3M9CisKKyNDb250cm9sIHRoZSBjcmVhdGlvbiBvZiBhIGZpbGUgY29udGFpbmluZyB0aGUgdmVyc2lvbiBpbmNsdWRlZCBpbiBlYWNoIGNvbmZpZ3VyYXRpb24gLSBvbiBieSBkZWZhdWx0IAorI2dlbmVyYXRlVmVyc2lvbnNMaXN0cz1mYWxzZQorCisjIyMjIyMjIyMjIyMjIyBCVUlMRCBOQU1JTkcgQ09OVFJPTCAjIyMjIyMjIyMjIyMjIyMjCisjIFRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgYnVpbGQgZWxlbWVudHMgYXJlIGZldGNoZWQgYW5kIHdoZXJlCisjIHRoZSBidWlsZCB0YWtlcyBwbGFjZS4KK2J1aWxkRGlyZWN0b3J5PSR7YmFzZX0vYnVpbGQKKworIyBUeXBlIG9mIGJ1aWxkLiAgVXNlZCBpbiBuYW1pbmcgdGhlIGJ1aWxkIG91dHB1dC4gIFR5cGljYWxseSB0aGlzIHZhbHVlIGlzCisjIG9uZSBvZiBJLCBOLCBNLCBTLCAuLi4KK2J1aWxkVHlwZT1JCisKKyMgSUQgb2YgdGhlIGJ1aWxkLiAgVXNlZCBpbiBuYW1pbmcgdGhlIGJ1aWxkIG91dHB1dC4KK2J1aWxkSWQ9V2Vla2x5QnVpbGQKKworIyBMYWJlbCBmb3IgdGhlIGJ1aWxkLiAgVXNlZCBpbiBuYW1pbmcgdGhlIGJ1aWxkIG91dHB1dAorYnVpbGRMYWJlbD0ke2J1aWxkVHlwZX0uJHtidWlsZElkfQorCisjIFRpbWVzdGFtcCBmb3IgdGhlIGJ1aWxkLiAgVXNlZCBpbiBuYW1pbmcgdGhlIGJ1aWxkIG91dHB1dAordGltZXN0YW1wPSR7UVVBTElGSUVSfQorCisjVGhlIHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBxdWFsaWZpZXIgb2YgYSBwbHVnaW4gb3IgZmVhdHVyZSB3aGVuIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSB2YWx1ZSBjb21wdXRlZCBieSBwZGUuCisjVGhlIHZhbHVlIHdpbGwgb25seSBiZSBhcHBsaWVkIHRvIHBsdWdpbiBvciBmZWF0dXJlcyBpbmRpY2F0aW5nIGJ1aWxkLnByb3BlcnRpZXMsIHF1YWxpZmllciA9IGNvbnRleHQgCisjZm9yY2VDb250ZXh0UXVhbGlmaWVyPTx0aGUgdmFsdWUgZm9yIHRoZSBxdWFsaWZpZXI+CisKKyNFbmFibGUgLyBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIGEgc3VmZml4IGZvciB0aGUgZmVhdHVyZXMgdGhhdCB1c2UgLnF1YWxpZmllci4gCisjVGhlIGdlbmVyYXRlZCBzdWZmaXggaXMgY29tcHV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjb250ZW50IG9mIHRoZSBmZWF0dXJlICAgCisjZ2VuZXJhdGVGZWF0dXJlVmVyc2lvblN1ZmZpeD10cnVlCisKKyMjIyMjIyMjIyMjIyMgQkFTRSBDT05UUk9MICMjIyMjIyMjIyMjIyMKKyMgU2V0dGluZ3MgZm9yIHRoZSBiYXNlIEVjbGlwc2UgY29tcG9uZW50cyBhbmQgSmF2YSBjbGFzcyBsaWJyYXJpZXMgCisjIGFnYWluc3Qgd2hpY2ggeW91IGFyZSBidWlsZGluZy4KKyMgQmFzZSBsb2NhdGlvbiBmb3IgYW55dGhpbmcgdGhlIGJ1aWxkIG5lZWRzIHRvIGNvbXBpbGUgYWdhaW5zdC4gIEZvciBleGFtcGxlLAorIyBpbiBtb3N0IFJDUCBhcHAgb3IgYSBwbHVnLWluLCAgdGhlIGJhc2VMb2NhdGlvbiBzaG91bGQgYmUgdGhlIGxvY2F0aW9uIG9mIGEgcHJldmlvdXNseQorIyBpbnN0YWxsZWQgRWNsaXBzZSBhZ2FpbnN0IHdoaWNoIHRoZSBhcHBsaWNhdGlvbiBvciBwbHVnLWluIGNvZGUgd2lsbCBiZSBjb21waWxlZCBhbmQgdGhlIFJDUCBkZWx0YSBwYWNrLgorCisjYmFzZT08cGF0aC90by9wYXJlbnQvb2YvZWNsaXBzZT4KKyNiYXNlTG9jYXRpb249JHtiYXNlfS9lY2xpcHNlCisjT3MvV3MvQXJjaC9ubCBvZiB0aGUgZWNsaXBzZSBzcGVjaWZpZWQgYnkgYmFzZUxvY2F0aW9uCitiYXNlb3M9d2luMzIKK2Jhc2V3cz13aW4zMgorYmFzZWFyY2g9eDg2CisKKyN0aGlzIHByb3BlcnR5IGluZGljYXRlcyB3aGV0aGVyIHlvdSB3YW50IHRoZSBzZXQgb2YgcGx1Zy1pbnMgYW5kIGZlYXR1cmVzIHRvIGJlIGNvbnNpZGVyZWQgZHVyaW5nIHRoZSBidWlsZCB0byBiZSBsaW1pdGVkIHRvIHRoZSBvbmVzIHJlYWNoYWJsZSBmcm9tIHRoZSBmZWF0dXJlcyAvIHBsdWdpbnMgYmVpbmcgYnVpbHQKK2ZpbHRlcmVkRGVwZW5kZW5jeUNoZWNrPWZhbHNlCisKKyN0aGlzIHByb3BlcnR5IGluZGljYXRlcyB3aGV0aGVyIHRoZSByZXNvbHV0aW9uIHNob3VsZCBiZSBkb25lIGluIGRldmVsb3BtZW50IG1vZGUgKGkuZS4gaWdub3JlIG11bHRpcGxlIGJ1bmRsZXMgd2l0aCBzaW5nbGV0b25zKQorcmVzb2x1dGlvbi5kZXZNb2RlPWZhbHNlCisKKyNwbHVnaW5QYXRoIGlzIGEgbGlzdCBvZiBsb2NhdGlvbnMgaW4gd2hpY2ggdG8gZmluZCBwbHVnaW5zIGFuZCBmZWF0dXJlcy4gIFRoaXMgbGlzdCBpcyBzZXBhcmF0ZWQgYnkgdGhlIHBsYXRmb3JtIGZpbGUgc2VwYXJhdG9yICg7IG9yIDopCisjYSBsb2NhdGlvbiBpcyBvbmUgb2Y6ICAKKyMtIHRoZSBsb2NhdGlvbiBvZiB0aGUgamFyIG9yIGZvbGRlciB0aGF0IGlzIHRoZSBwbHVnaW4gb3IgZmVhdHVyZSA6IC9wYXRoL3RvL2Zvby5qYXIgb3IgL3BhdGgvdG8vZm9vCisjLSBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGEgL3BsdWdpbnMgb3IgL2ZlYXR1cmVzIHN1YmRpcmVjdG9yeQorIy0gdGhlIGxvY2F0aW9uIG9mIGEgZmVhdHVyZS54bWwsIG9yIGZvciAyLjEgc3R5bGUgcGx1Z2lucywgdGhlIHBsdWdpbi54bWwgb3IgZnJhZ21lbnQueG1sCisjcGx1Z2luUGF0aD0KKworc2tpcEJhc2U9dHJ1ZQorZWNsaXBzZVVSTD08dXJsIGZvciBlY2xpcHNlIGRvd25sb2FkIHNpdGU+CitlY2xpcHNlQnVpbGRJZD08SWQgb2YgRWNsaXBzZSBidWlsZCB0byBnZXQ+CitlY2xpcHNlQmFzZVVSTD0ke2VjbGlwc2VVUkx9L2VjbGlwc2UtcGxhdGZvcm0tJHtlY2xpcHNlQnVpbGRJZH0td2luMzIuemlwCisKKworIyMjIyMjIyMjIyMjIyBNQVAgRklMRSBDT05UUk9MICMjIyMjIyMjIyMjIyMjIyMKKyMgVGhpcyBzZWN0aW9uIGRlZmluZXMgQ1ZTIHRhZ3MgdG8gdXNlIHdoZW4gZmV0Y2hpbmcgdGhlIG1hcCBmaWxlcyBmcm9tIHRoZSByZXBvc2l0b3J5LgorIyBJZiB5b3Ugd2FudCB0byBmZXRjaCB0aGUgbWFwIGZpbGUgZnJvbSByZXBvc2l0b3J5IC8gbG9jYXRpb24sIGNoYW5nZSB0aGUgZ2V0TWFwRmlsZXMgdGFyZ2V0IGluIHRoZSBjdXN0b21UYXJnZXRzLnhtbAorCitza2lwTWFwcz10cnVlCittYXBzUmVwbz06cHNlcnZlcjphbm9ueW1vdXNAZXhhbXBsZS5jb20vcGF0aC90by9yZXBvCittYXBzUm9vdD1wYXRoL3RvL21hcHMKK21hcHNDaGVja291dFRhZz1IRUFECisKKyN0YWdNYXBzPXRydWUKK21hcHNUYWdUYWc9diR7YnVpbGRJZH0KKworCisjIyMjIyMjIyMjIyMgUkVQT1NJVE9SWSBDT05UUk9MICMjIyMjIyMjIyMjIyMjIworIyBUaGlzIHNlY3Rpb24gZGVmaW5lcyBwcm9wZXJ0aWVzIHBhcmFtZXRlcml6aW5nIHRoZSByZXBvc2l0b3JpZXMgd2hlcmUgcGx1Z2lucywgZnJhZ21lbnRzCisjIGJ1bmRsZXMgYW5kIGZlYXR1cmVzIGFyZSBiZWluZyBvYnRhaW5lZCBmcm9tLiAKKworIyBUaGUgdGFncyB0byB1c2Ugd2hlbiBmZXRjaGluZyBlbGVtZW50cyB0byBidWlsZC4KKyMgQnkgZGVmYXVsdCB0aGVidWlsZGVyIHdpbGwgdXNlIHdoYXRldmVyIGlzIGluIHRoZSBtYXBzLiAgCisjIFRoaXMgdmFsdWUgdGFrZXMgdGhlIGZvcm0gb2YgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiByZXBvc2l0b3J5IGlkZW50aWZpZXIgKGxpa2UgdXNlZCBpbiB0aGUgbWFwIGZpbGVzKSBhbmQgdGhlIAorIyBvdmVycmlkaW5nIHZhbHVlCisjIEZvciBleGFtcGxlIGZldGNoVGFnPUNWUz1IRUFELCBTVk49djIwMDUwMTAxCitmZXRjaFRhZz1TVk49dHJ1bmsKKyNza2lwRmV0Y2g9dHJ1ZQorCisKKyMjIyMjIyMjIyMjIyMgSkFWQSBDT01QSUxFUiBPUFRJT05TICMjIyMjIyMjIyMjIyMjCisjIFRoZSBsb2NhdGlvbiBvZiB0aGUgSmF2YSBqYXJzIHRvIGNvbXBpbGUgYWdhaW5zdC4gIFR5cGljYWxseSB0aGUgcnQuamFyIGZvciB5b3VyIEpESy9KUkUKKyNib290Y2xhc3NwYXRoPSR7amF2YS5ob21lfS9saWIvcnQuamFyCisKKyMgc3BlY2lmaWMgSlJFIGxvY2F0aW9ucyB0byBjb21waWxlIGFnYWluc3QuIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBjb21waWxlIGJ1bmRsZXMgc3BlY2lmeWluZyBhIAorIyBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudC4gVW5jb21tZW50IGFuZCBzZXQgdmFsdWVzIGZvciBlbnZpcm9ubWVudHMgdGhhdCB5b3Ugc3VwcG9ydAorI0NEQy0xLjAvRm91bmRhdGlvbi0xLjA9IC9wYXRoL3RvL3J0LmphcgorI0NEQy0xLjEvRm91bmRhdGlvbi0xLjE9CisjT1NHaS9NaW5pbXVtLTEuMD0KKyNPU0dpL01pbmltdW0tMS4xPQorI0pSRS0xLjE9CisjSjJTRS0xLjI9CisjSjJTRS0xLjM9CisjSjJTRS0xLjQ9CisjSjJTRS0xLjU9CisjSmF2YVNFLTEuNj0KKyNQZXJzb25hbEphdmEtMS4xPQorI1BlcnNvbmFsSmF2YS0xLjI9CisjQ0RDLTEuMC9QZXJzb25hbEJhc2lzLTEuMD0KKyNDREMtMS4wL1BlcnNvbmFsSmF2YS0xLjA9CisjQ0RDLTEuMS9QZXJzb25hbEJhc2lzLTEuMT0KKyNDREMtMS4xL1BlcnNvbmFsSmF2YS0xLjE9CisKKyMgU3BlY2lmeSB0aGUgb3V0cHV0IGZvcm1hdCBvZiB0aGUgY29tcGlsZXIgbG9nIHdoZW4gZWNsaXBzZSBqZHQgaXMgdXNlZAorbG9nRXh0ZW5zaW9uPS5sb2cKKworIyBXaGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIGRlYnVnIGluZm8gaW4gdGhlIG91dHB1dCBqYXJzCitqYXZhY0RlYnVnSW5mbz1mYWxzZSAKKworIyBXaGV0aGVyIG9yIG5vdCB0byBmYWlsIHRoZSBidWlsZCBpZiB0aGVyZSBhcmUgY29tcGlsZXIgZXJyb3JzCitqYXZhY0ZhaWxPbkVycm9yPXRydWUKKworIyBFbmFibGUgb3IgZGlzYWJsZSB2ZXJib3NlIG1vZGUgb2YgdGhlIGNvbXBpbGVyCitqYXZhY1ZlcmJvc2U9dHJ1ZQorCisjIEV4dHJhIGFyZ3VtZW50cyBmb3IgdGhlIGNvbXBpbGVyLiBUaGVzZSBhcmUgc3BlY2lmaWMgdG8gdGhlIGphdmEgY29tcGlsZXIgYmVpbmcgdXNlZC4KKyNjb21waWxlckFyZz0KKworIyBEZWZhdWx0IHZhbHVlIGZvciB0aGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIGNvZGUuIFRoaXMgdmFsdWUgaXMgdXNlZCB3aGVuIGNvbXBpbGluZyBwbHVnLWlucyB0aGF0IGRvIG5vdCBzZXQgdGhlIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50IG9yIHNldCBqYXZhY1NvdXJjZSBpbiBidWlsZC5wcm9wZXJ0aWVzCitqYXZhY1NvdXJjZT0xLjUKKworIyBEZWZhdWx0IHZhbHVlIGZvciB0aGUgdmVyc2lvbiBvZiB0aGUgYnl0ZSBjb2RlIHRhcmdldGVkLiBUaGlzIHZhbHVlIGlzIHVzZWQgd2hlbiBjb21waWxpbmcgcGx1Zy1pbnMgdGhhdCBkbyBub3Qgc2V0IHRoZSBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudCBvciBzZXQgamF2YWNUYXJnZXQgaW4gYnVpbGQucHJvcGVydGllcy4KK2phdmFjVGFyZ2V0PTEuNQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnJlbGVuZy9jb25maWcvY3VzdG9tVGFyZ2V0cy54bWwgYi9vcmcuZWNsaXBzZS5zdGVtLnJlbGVuZy9jb25maWcvY3VzdG9tVGFyZ2V0cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdhODg1NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL2NvbmZpZy9jdXN0b21UYXJnZXRzLnhtbApAQCAtMCwwICsxLDMzMCBAQAorPHByb2plY3QgbmFtZT0iQnVpbGQgc3BlY2lmaWMgdGFyZ2V0cyBhbmQgcHJvcGVydGllcyIgZGVmYXVsdD0ibm9EZWZhdWx0Ij4KKworCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTwhLS0gUnVuIGEgZ2l2ZW4gJHt0YXJnZXR9IG9uIGFsbCBlbGVtZW50cyBiZWluZyBidWlsdCAtLT4KKwk8IS0tIEFkZCBvbiA8YW50PiB0YXNrIGZvciBlYWNoIHRvcCBsZXZlbCBlbGVtZW50IGJlaW5nIGJ1aWx0LiAtLT4KKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4JCisJPHByb3BlcnR5IG5hbWU9ImFsbEVsZW1lbnRzRmlsZSIgdmFsdWU9IiR7YnVpbGRlcn0vYWxsRWxlbWVudHMueG1sIiAvPgorCTxpbXBvcnQgZmlsZT0iJHthbGxFbGVtZW50c0ZpbGV9IiAvPgorCTx0YXJnZXQgbmFtZT0iYWxsRWxlbWVudHMiPgorCQk8YW50Y2FsbCB0YXJnZXQ9ImFsbEVsZW1lbnRzRGVsZWdhdG9yIiAvPgkJCisJPC90YXJnZXQ+CisJCisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJPHRhcmdldCBuYW1lPSJnZXRCYXNlQ29tcG9uZW50cyIgZGVwZW5kcz0iY2hlY2tMb2NhbEJhc2UiIHVubGVzcz0ic2tpcEJhc2UiPgorCQk8Z2V0IHNyYz0iJHtlY2xpcHNlQmFzZVVSTH0iIGRlc3Q9IiR7YmFzZX0vdGVtcC1iYXNlLnppcCIgLz4KKwkJPHVuemlwIGRlc3Q9IiR7YmFzZX0iIG92ZXJ3cml0ZT0idHJ1ZSIgc3JjPSIke2Jhc2V9L3RlbXAtYmFzZS56aXAiIC8+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9ImNoZWNrTG9jYWxCYXNlIj4KKwkJPGF2YWlsYWJsZSBmaWxlPSIke2Jhc2V9IiBwcm9wZXJ0eT0ic2tpcEJhc2UiIC8+CisJPC90YXJnZXQ+CisKKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwk8IS0tIENoZWNrIG91dCBtYXAgZmlsZXMgZnJvbSBjb3JyZWN0IHJlcG9zaXRvcnkgLS0+CisJPCEtLSBSZXBsYWNlIHZhbHVlcyBmb3IgbWFwc0NoZWNrb3V0VGFnIGFzIGRlc2lyZWQuIC0tPgorCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTx0YXJnZXQgbmFtZT0iZ2V0TWFwRmlsZXMiIGRlcGVuZHM9ImNoZWNrTG9jYWxNYXBzIiB1bmxlc3M9InNraXBNYXBzIj4JCQorCQk8cHJvcGVydHkgbmFtZT0ibWFwc0NoZWNrb3V0VGFnIiB2YWx1ZT0iSEVBRCIgLz4KKwkJPGN2cyBjdnNSb290PSIke21hcHNSZXBvfSIgcGFja2FnZT0iJHttYXBzUm9vdH0iIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9L21hcHMiIHRhZz0iJHttYXBzQ2hlY2tvdXRUYWd9IiAvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJjaGVja0xvY2FsTWFwcyI+CisJCTxhdmFpbGFibGUgcHJvcGVydHk9InNraXBNYXBzIiBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9tYXBzIiAvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJ0YWdNYXBGaWxlcyIgaWY9InRhZ01hcHMiPgorCQk8Y3ZzIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9L21hcHMvJHttYXBzUm9vdH0iIGNvbW1hbmQ9InRhZyAke21hcHNUYWdUYWd9IiAvPgorCTwvdGFyZ2V0PgorCisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKwk8dGFyZ2V0IG5hbWU9ImNsZWFuIiB1bmxlc3M9Im5vY2xlYW4iPgorCQk8YW50Y2FsbCB0YXJnZXQ9ImFsbEVsZW1lbnRzIj4KKwkJCTxwYXJhbSBuYW1lPSJ0YXJnZXQiIHZhbHVlPSJjbGVhbkVsZW1lbnQiIC8+CisJCTwvYW50Y2FsbD4KKwk8L3RhcmdldD4KKworCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHNldHVwIC0tPgorCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTx0eXBlZGVmIHJlc291cmNlPSJvcmcvdGlncmlzL3N1YnZlcnNpb24vc3ZuYW50L3N2bmFudGxpYi54bWwiIGNsYXNzcGF0aD0ic3ZuYW50LmphciIgLz4gCisJPHRhcmdldCBuYW1lPSJwcmVTZXR1cCI+CisJCTxzdm4+CisJCQk8Y2hlY2tvdXQgdXJsPSJzdm46Ly9kZXYuZWNsaXBzZS5vcmcvc3Zucm9vdC90ZWNobm9sb2d5L29yZy5lY2xpcHNlLnN0ZW0vdHJ1bmsiIGRlc3RQYXRoPSIke2Jhc2V9L2NoZWNrb3V0X2RpciIgLz4KKwkJPC9zdm4+CisJPC90YXJnZXQ+CisKKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHNldHVwIGJ1dCBiZWZvcmUgc3RhcnRpbmcgdGhlIGJ1aWxkIHByb3BlciAtLT4KKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwk8dGFyZ2V0IG5hbWU9InBvc3RTZXR1cCI+CisJCTxhbnRjYWxsIHRhcmdldD0iZ2V0QmFzZUNvbXBvbmVudHMiIC8+CisJCTwhLS0gRmV0Y2ggdGhlIFVJIHBsdWdpbiBmaXJzdCBiZWNhdXNlIHRoYXQncyB3aGVyZSB0aGUgc3RlbS5wcm9kdWN0IGZpbGUgaXMgLS0+CisJCTxhbnQgYW50ZmlsZT0iJHtnZW5lcmljVGFyZ2V0c30iIHRhcmdldD0iZmV0Y2hFbGVtZW50Ij4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0icGx1Z2luIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iaWQiIHZhbHVlPSJvcmcuZWNsaXBzZS5zdGVtLnVpIi8+CisJCTwvYW50PgorCTwvdGFyZ2V0PgorCisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgZmV0Y2hpbmcgdGhlIGJ1aWxkIGVsZW1lbnRzIC0tPgorCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTx0YXJnZXQgbmFtZT0icHJlRmV0Y2giPgorCTwvdGFyZ2V0PgorCisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJPCEtLSBTdGVwcyB0byBkbyBhZnRlciBmZXRjaGluZyB0aGUgYnVpbGQgZWxlbWVudHMgLS0+CisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJPHRhcmdldCBuYW1lPSJwb3N0RmV0Y2giPgorCQk8IS0tIFRoaXMgY2FsbCB3YXMgYWRkZWQgdG8gZ2V0IHRoZSBpbnRlcm5hbCBkYXRhIHBsdWdpbiBvdXQgb2YgdGhlICAgIC0tPgorCQk8IS0tIHJlcG9zaXRvcnkgdG8gYmUgdXNlZCBsYXRlciB0byBidWlsZCB0aGUgc3RlbS5nZW9ncmFwaHkgcGx1Z2luICAgIC0tPiAgICAKKwkJPCEtLWFudCBhbnRmaWxlPSIke2dlbmVyaWNUYXJnZXRzfSIgdGFyZ2V0PSJmZXRjaEVsZW1lbnQiPgorCQkJPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJwbHVnaW4iLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YSIvPgorCQk8L2FudD4KKwkJPGFudCBhbnRmaWxlPSIke2dlbmVyaWNUYXJnZXRzfSIgdGFyZ2V0PSJmZXRjaEVsZW1lbnQiPgorCQkJPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJwbHVnaW4iLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0Ii8+CisJCTwvYW50LS0+CisJPC90YXJnZXQ+CisKKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBidWlsZCBzY3JpcHRzLiAtLT4KKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwk8dGFyZ2V0IG5hbWU9InByZUdlbmVyYXRlIj4KKwk8L3RhcmdldD4KKworCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgZ2VuZXJhdGluZyB0aGUgYnVpbGQgc2NyaXB0cy4gLS0+CisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJPHRhcmdldCBuYW1lPSJwb3N0R2VuZXJhdGUiPgorCQk8IS0tYW50IGFudGZpbGU9IiR7Z2VuZXJpY1RhcmdldHN9IiB0YXJnZXQ9ImdlbmVyYXRlU2NyaXB0Ij4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0icGx1Z2luIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iaWQiIHZhbHVlPSJvcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydCIvPgorCQk8L2FudD4KKwkJPGFudCBhbnRmaWxlPSIke2dlbmVyaWNUYXJnZXRzfSIgdGFyZ2V0PSJnZW5lcmF0ZVNjcmlwdCI+CisJCQk8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9InBsdWdpbiIvPgorCQkJPHByb3BlcnR5IG5hbWU9ImlkIiB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhIi8+CisJCTwvYW50LS0+CisJCTwhLS1hbnRjYWxsIHRhcmdldD0iY2xlYW4iIC8tLT4KKwk8L3RhcmdldD4KKworCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHJ1bm5pbmcgdGhlIGJ1aWxkLnhtbHMgZm9yIHRoZSBlbGVtZW50cyBiZWluZyBidWlsdC4gLS0+CisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJPHRhcmdldCBuYW1lPSJwcmVQcm9jZXNzIj4KKwkJPGFudCBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9L3BsdWdpbnMvb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5pbmZyYXN0cnVjdHVyZS50cmFuc3BvcnRhdGlvbiIgYW50ZmlsZT0iYnVpbGQueG1sIiB0YXJnZXQ9IkBkb3QiLz4KKwk8L3RhcmdldD4KKworCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgcnVubmluZyB0aGUgYnVpbGQueG1scyBmb3IgdGhlIGVsZW1lbnRzIGJlaW5nIGJ1aWx0LiAtLT4KKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwk8dGFyZ2V0IG5hbWU9InBvc3RQcm9jZXNzIj4KKwkJPCEtLSBSdW4gdGhlIHVwZGF0ZS54bWwgc2NyaXB0IGZyb20gdGhlIGludGVybmFsLmRhdGEgcGx1Z2luIHRvIGdlbmVyYXRlIGFsbCBpbnRlcm5hbCBkYXRhICAtLT4KKwkJPGFudCBhbnRmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zL29yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS91cGRhdGUueG1sIi8+CisJCTwhLS0gV2UgYXJlIGJ1aWxkaW5nIHRoZSBkYXRhLmdlb2dyYXBoeSBwbHVnaW4gYWdhaW4gc28gdGhhdCB0aGUgZmlsZXMgICAtLT4KKwkJPCEtLSB0aGF0IHdlcmUgZ2VuZXJhdGVkIGluIHRoZSBwcmV2aW91cyBhbnQgY2FsbCAoeHh4X25hbWVzLnByb3BlcnRpZXMpIC0tPgorCQk8IS0tIHdpbGwgYmUgY29waWVkIHRvIHRoZSBiaW5hcnkgZm9sZGVyIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCBqYXIuLS0+CisJCTxhbnQgZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkiCisJCQkgYW50ZmlsZT0iYnVpbGQueG1sIiB0YXJnZXQ9IkBkb3QiLz4KKwkJCisJCTwhLS0gV2UgYXJlIGJ1aWxkaW5nIHRoZSBwbHVnaW4gYWdhaW4gc28gdGhhdCB0aGUgZmlsZXMgdGhhdCB3ZXJlIC0tPgorCQk8IS0tIGdlbmVyYXRlZCBpbiB0aGUgcHJldmlvdXMgYW50IGNhbGwgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgamFyLi0tPgorCQk8IS0tYW50IGRpcj0iJHtidWlsZERpcmVjdG9yeX0vcGx1Z2lucy9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LmluZnJhc3RydWN0dXJlLnRyYW5zcG9ydGF0aW9uIgorCQkJIGFudGZpbGU9ImJ1aWxkLnhtbCIgdGFyZ2V0PSJAZG90Ii8tLT4KKwkJCisJCTwhLS1hbnQgZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0IgorCQkJIGFudGZpbGU9ImJ1aWxkLnhtbCIgdGFyZ2V0PSJAZG90Ii8tLT4KKwkJCSAKKwkJPCEtLSBUaGUgaW50ZXJuYWwgZGF0YSBwbHVnaW4gaXNuJ3QgY29tcGlsZWQgZXZlbiB0aG91Z2ggd2UgZ2VuZXJhdGUgaXRzIC0tPgorCQk8IS0tIGJ1aWxkLnhtbCBmaWxlIGFib3ZlIGluIHBvc3RHZW5lcmF0ZSAtLT4KKwkJPCEtLWFudCBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9L3BsdWdpbnMvb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhIgorCQkJIGFudGZpbGU9ImJ1aWxkLnhtbCIgdGFyZ2V0PSJAZG90Ii8tLT4KKwk8L3RhcmdldD4KKworCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHJ1bm5pbmcgYXNzZW1ibGUuIC0tPgorCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTx0YXJnZXQgbmFtZT0icHJlQXNzZW1ibGUiPgorCTwvdGFyZ2V0PgorCisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJPCEtLSBTdGVwcyB0byBkbyBhZnRlciAgcnVubmluZyBhc3NlbWJsZS4gLS0+CisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJPHRhcmdldCBuYW1lPSJwb3N0QXNzZW1ibGUiPgorCTwvdGFyZ2V0PgorCisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgcnVubmluZyBwYWNrYWdlLiAtLT4KKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwk8dGFyZ2V0IG5hbWU9InByZVBhY2thZ2UiPgorCTwvdGFyZ2V0PgorCisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJPCEtLSBTdGVwcyB0byBkbyBhZnRlciAgcnVubmluZyBwYWNrYWdlLiAtLT4KKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwk8dGFyZ2V0IG5hbWU9InBvc3RQYWNrYWdlIj4KKwk8L3RhcmdldD4KKworCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIGJ1aWxkIGlzIGRvbmUuIC0tPgorCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTxwcm9wZXJ0eSBuYW1lPSJwYWNrYWdlc0RpciIgdmFsdWU9IiR7YnVpbGREaXJlY3Rvcnl9LyR7YnVpbGRMYWJlbH0iIC8+CisJPHByb3BlcnR5IG5hbWU9InBhY2thZ2VQb3N0Zml4IiB2YWx1ZT0iJHttYWpvclZlcnNpb259LiR7Zm9yY2VDb250ZXh0UXVhbGlmaWVyfSIgLz4KKwk8dGFyZ2V0IG5hbWU9InBvc3RCdWlsZCI+CisJCTxhbnRjYWxsIHRhcmdldD0idXBkYXRlWmlwRmlsZSI+CisJCQk8cGFyYW0gbmFtZT0ib3NfY29uZiIgdmFsdWU9ImxpbnV4Lmd0ay54ODYiLz4KKwkJPC9hbnRjYWxsPgorCQk8YW50Y2FsbCB0YXJnZXQ9InVwZGF0ZVppcEZpbGUiPgorCQkJPHBhcmFtIG5hbWU9Im9zX2NvbmYiIHZhbHVlPSJsaW51eC5ndGsueDg2XzY0Ii8+CisJCTwvYW50Y2FsbD4KKwkJPGFudGNhbGwgdGFyZ2V0PSJ1cGRhdGVaaXBGaWxlIj4KKwkJCTxwYXJhbSBuYW1lPSJvc19jb25mIiB2YWx1ZT0id2luMzIud2luMzIueDg2Ii8+CisJCTwvYW50Y2FsbD4KKwkJPGFudGNhbGwgdGFyZ2V0PSJ1cGRhdGVaaXBGaWxlIj4KKwkJCTxwYXJhbSBuYW1lPSJvc19jb25mIiB2YWx1ZT0ibWFjb3N4LmNhcmJvbi5wcGMiLz4KKwkJPC9hbnRjYWxsPgorCQk8YW50Y2FsbCB0YXJnZXQ9InVwZGF0ZVppcEZpbGUiPgorCQkJPHBhcmFtIG5hbWU9Im9zX2NvbmYiIHZhbHVlPSJtYWNvc3guY29jb2EueDg2Ii8+CisJCTwvYW50Y2FsbD4KKwkJPGFudGNhbGwgdGFyZ2V0PSJ1cGRhdGVaaXBGaWxlIj4KKwkJCTxwYXJhbSBuYW1lPSJvc19jb25mIiB2YWx1ZT0ibGludXguZ3RrLnBwYyIvPgorCQk8L2FudGNhbGw+CisKKwkJPCEtLW1vdmUgZmlsZT0iJHtwYWNrYWdlc0Rpcn0vJHtidWlsZElkfS1saW51eC5ndGsueDg2LnppcCIgdG9maWxlPSIke3BhY2thZ2VzRGlyfS9TVEVNLWxpbnV4Lmd0ay54ODYtJHtwYWNrYWdlUG9zdGZpeH0uemlwIi8+CisJCTxtb3ZlIGZpbGU9IiR7cGFja2FnZXNEaXJ9LyR7YnVpbGRJZH0tbGludXguZ3RrLng4Nl82NC56aXAiIHRvZmlsZT0iJHtwYWNrYWdlc0Rpcn0vU1RFTS1saW51eC5ndGsueDg2XzY0LSR7cGFja2FnZVBvc3RmaXh9LnppcCIvPgorCQk8bW92ZSBmaWxlPSIke3BhY2thZ2VzRGlyfS8ke2J1aWxkSWR9LXdpbjMyLndpbjMyLng4Ni56aXAiIHRvZmlsZT0iJHtwYWNrYWdlc0Rpcn0vU1RFTS13aW4zMi0ke3BhY2thZ2VQb3N0Zml4fS56aXAiLz4KKwkJPG1vdmUgZmlsZT0iJHtwYWNrYWdlc0Rpcn0vJHtidWlsZElkfS1tYWNvc3guY2FyYm9uLnBwYy56aXAiIHRvZmlsZT0iJHtwYWNrYWdlc0Rpcn0vU1RFTS1tYWNvc3guY2FyYm9uLnBwYy0ke3BhY2thZ2VQb3N0Zml4fS56aXAiLz4KKwkJPG1vdmUgZmlsZT0iJHtwYWNrYWdlc0Rpcn0vJHtidWlsZElkfS1tYWNvc3guY29jb2EueDg2LnppcCIgdG9maWxlPSIke3BhY2thZ2VzRGlyfS9TVEVNLW1hY29zeC5jb2NvYS54ODYtJHtwYWNrYWdlUG9zdGZpeH0uemlwIi8+CisJCTxtb3ZlIGZpbGU9IiR7cGFja2FnZXNEaXJ9LyR7YnVpbGRJZH0tbGludXguZ3RrLnBwYy56aXAiIHRvZmlsZT0iJHtwYWNrYWdlc0Rpcn0vU1RFTS1saW51eC5ndGsucHBjLSR7cGFja2FnZVBvc3RmaXh9LnppcCIvLS0+CisJCQorCQk8IS0tIEFkZCB0aGUgZGVmYXVsdCB3b3Jrc3BhY2UgdG8gYWxsIHppcCBmaWxlcyAtLT4KKwkJPCEtLXVuemlwIHNyYz0iJHtwYWNrYWdlc0Rpcn0vU1RFTS1saW51eC5ndGsueDg2LSR7cGFja2FnZVBvc3RmaXh9LnppcCIgZGVzdD0iJHtwYWNrYWdlc0Rpcn0vLi4vLi4vcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb24iPgorCQkJPHBhdHRlcm5zZXQ+CisJCQkJPGluY2x1ZGUgbmFtZT0ic3RlbS9jb25maWd1cmF0aW9uL2NvbmZpZy5pbmkiLz4KKwkJCTwvcGF0dGVybnNldD4KKwkJCTxtYXBwZXIgdHlwZT0iZmxhdHRlbiIvPgorCQk8L3VuemlwPgorCQk8cHJvcGVydHlmaWxlIGZpbGU9IiR7cGFja2FnZXNEaXJ9Ly4uLy4uL3Jlc291cmNlcy9jb25maWd1cmF0aW9uL2NvbmZpZy5pbmkiPgorCQkJPGVudHJ5IGtleT0ic3RlbS5idWlsZElkIiB2YWx1ZT0iJHtwYWNrYWdlUG9zdGZpeH0iLz4KKwkJPC9wcm9wZXJ0eWZpbGU+CisJCTx6aXAgZGVzdGZpbGU9IiR7cGFja2FnZXNEaXJ9L1NURU0tbGludXguZ3RrLng4Ni0ke3BhY2thZ2VQb3N0Zml4fS56aXAiIHVwZGF0ZT0idHJ1ZSI+CisJCQk8emlwZmlsZXNldCBkaXI9IiR7cGFja2FnZXNEaXJ9Ly4uLy4uL3Jlc291cmNlcy93b3Jrc3BhY2UiIHByZWZpeD0ic3RlbS93b3Jrc3BhY2UiLz4KKwkJCTx6aXBmaWxlc2V0IGRpcj0iJHtwYWNrYWdlc0Rpcn0vLi4vLi4vcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb24iIHByZWZpeD0ic3RlbS9jb25maWd1cmF0aW9uIi8+CisJCTwvemlwPgorCQk8emlwIGRlc3RmaWxlPSIke3BhY2thZ2VzRGlyfS9TVEVNLWxpbnV4Lmd0ay54ODZfNjQtJHtwYWNrYWdlUG9zdGZpeH0uemlwIiB1cGRhdGU9InRydWUiPgorCQkJPHppcGZpbGVzZXQgZGlyPSIke3BhY2thZ2VzRGlyfS8uLi8uLi9yZXNvdXJjZXMvd29ya3NwYWNlIiBwcmVmaXg9InN0ZW0vd29ya3NwYWNlIi8+CisJCTwvemlwPgorCQk8emlwIGRlc3RmaWxlPSIke3BhY2thZ2VzRGlyfS9TVEVNLXdpbjMyLSR7cGFja2FnZVBvc3RmaXh9LnppcCIgdXBkYXRlPSJ0cnVlIj4KKwkJCTx6aXBmaWxlc2V0IGRpcj0iJHtwYWNrYWdlc0Rpcn0vLi4vLi4vcmVzb3VyY2VzL3dvcmtzcGFjZSIgcHJlZml4PSJzdGVtL3dvcmtzcGFjZSIvPgorCQk8L3ppcD4KKwkJPHppcCBkZXN0ZmlsZT0iJHtwYWNrYWdlc0Rpcn0vU1RFTS1tYWNvc3guY2FyYm9uLnBwYy0ke3BhY2thZ2VQb3N0Zml4fS56aXAiIHVwZGF0ZT0idHJ1ZSI+CisJCQk8emlwZmlsZXNldCBkaXI9IiR7cGFja2FnZXNEaXJ9Ly4uLy4uL3Jlc291cmNlcy93b3Jrc3BhY2UiIHByZWZpeD0ic3RlbS93b3Jrc3BhY2UiLz4KKwkJPC96aXA+CisJCTx6aXAgZGVzdGZpbGU9IiR7cGFja2FnZXNEaXJ9L1NURU0tbWFjb3N4LmNvY29hLng4Ni0ke3BhY2thZ2VQb3N0Zml4fS56aXAiIHVwZGF0ZT0idHJ1ZSI+CisJCQk8emlwZmlsZXNldCBkaXI9IiR7cGFja2FnZXNEaXJ9Ly4uLy4uL3Jlc291cmNlcy93b3Jrc3BhY2UiIHByZWZpeD0ic3RlbS93b3Jrc3BhY2UiLz4KKwkJPC96aXA+CisJCTx6aXAgZGVzdGZpbGU9IiR7cGFja2FnZXNEaXJ9L1NURU0tbGludXguZ3RrLnBwYy0ke3BhY2thZ2VQb3N0Zml4fS56aXAiIHVwZGF0ZT0idHJ1ZSI+CisJCQk8emlwZmlsZXNldCBkaXI9IiR7cGFja2FnZXNEaXJ9Ly4uLy4uL3Jlc291cmNlcy93b3Jrc3BhY2UiIHByZWZpeD0ic3RlbS93b3Jrc3BhY2UiLz4KKwkJPC96aXAtLT4KKwkJCisJCTwhLS0gQ2hlY2sgaWYgdGhlcmUgaXMgYSByZXF1ZXN0IHRvIHB1Ymxpc2ggdGhlIGJpbmFyaWVzIC0tPgorCQk8IS0taXN0cnVlIHZhbHVlPSIke3RvUHVibGlzaH0iPgorCQkJPGFudGNhbGwgdGFyZ2V0PSJwdWJsaXNoIiAvPgorCQkJPGFudGNhbGwgdGFyZ2V0PSJ1cGRhdGVXZWJTaXRlV2l0aFdlZWtseUJ1aWxkIiAvPgorCQk8L2lzdHJ1ZS0tPgorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0idXBkYXRlWmlwRmlsZSI+CisJCTxtb3ZlIGZpbGU9IiR7cGFja2FnZXNEaXJ9LyR7YnVpbGRJZH0tJHtvc19jb25mfS56aXAiIHRvZmlsZT0iJHtwYWNrYWdlc0Rpcn0vU1RFTS0ke29zX2NvbmZ9LSR7cGFja2FnZVBvc3RmaXh9LnppcCIvPgorCQk8dW56aXAgc3JjPSIke3BhY2thZ2VzRGlyfS9TVEVNLSR7b3NfY29uZn0tJHtwYWNrYWdlUG9zdGZpeH0uemlwIiBkZXN0PSIke3BhY2thZ2VzRGlyfS8uLi8uLi9yZXNvdXJjZXMvY29uZmlndXJhdGlvbiI+CisJCQk8cGF0dGVybnNldD4KKwkJCQk8aW5jbHVkZSBuYW1lPSJzdGVtL2NvbmZpZ3VyYXRpb24vY29uZmlnLmluaSIvPgorCQkJPC9wYXR0ZXJuc2V0PgorCQkJPG1hcHBlciB0eXBlPSJmbGF0dGVuIi8+CisJCTwvdW56aXA+CisJCTxwcm9wZXJ0eWZpbGUgZmlsZT0iJHtwYWNrYWdlc0Rpcn0vLi4vLi4vcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb24vY29uZmlnLmluaSI+CisJCQk8ZW50cnkga2V5PSJzdGVtLmJ1aWxkSWQiIHZhbHVlPSIke3BhY2thZ2VQb3N0Zml4fSIvPgorCQk8L3Byb3BlcnR5ZmlsZT4KKwkJPHppcCBkZXN0ZmlsZT0iJHtwYWNrYWdlc0Rpcn0vU1RFTS0ke29zX2NvbmZ9LSR7cGFja2FnZVBvc3RmaXh9LnppcCIgdXBkYXRlPSJ0cnVlIj4KKwkJCTx6aXBmaWxlc2V0IGRpcj0iJHtwYWNrYWdlc0Rpcn0vLi4vLi4vcmVzb3VyY2VzL3dvcmtzcGFjZSIgcHJlZml4PSJzdGVtL3dvcmtzcGFjZSIvPgorCQkJPHppcGZpbGVzZXQgZGlyPSIke3BhY2thZ2VzRGlyfS8uLi8uLi9yZXNvdXJjZXMvY29uZmlndXJhdGlvbiIgcHJlZml4PSJzdGVtL2NvbmZpZ3VyYXRpb24iLz4KKwkJPC96aXA+CisJPC90YXJnZXQ+CisKKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwk8IS0tIFN0ZXBzIHRvIGRvIHRvIHRlc3QgdGhlIGJ1aWxkIHJlc3VsdHMgLS0+CisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJPHRhcmdldCBuYW1lPSJ0ZXN0Ij4KKwk8L3RhcmdldD4KKworCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTwhLS0gU3RlcHMgdG8gZG8gdG8gcHVibGlzaCB0aGUgYnVpbGQgcmVzdWx0cyAtLT4KKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwk8cHJvcGVydHkgbmFtZT0icHVibGlzaERpciIgdmFsdWU9Ii9ob21lL2RhdGEvaHR0cGQvZG93bmxvYWQuZWNsaXBzZS5vcmcvc3RlbSIgLz4KKwk8dGFyZ2V0IG5hbWU9InB1Ymxpc2giPgorCQk8IS0tIElmIHJ1bm5pbmcgb3V0c2lkZSBvZiBidWlsZC5lY2xpcHNlLm9yZyBvciBkb3dubG9hZDEuZWNsaXBzZS5vcmcgc2VydmVycyB0aGVuIHVzZSB0aGlzIG9uZSB0byBTQ1AgdGhlIGZpbGVzIC0tPgorCQk8IS0tc2NwIHRvZGlyPSIke3VzZXJuYW1lfToke3Bhc3N3b3JkfUBkb3dubG9hZDEuZWNsaXBzZS5vcmc6fi9kb3dubG9hZHMvc3RlbSI+CisJCQk8ZmlsZXNldCBkaXI9IiR7cGFja2FnZXNEaXJ9Ij4KKwkJCQk8aW5jbHVkZSBuYW1lPSJTVEVNLSotJHtwYWNrYWdlUG9zdGZpeH0uemlwIi8+CisJCQk8L2ZpbGVzZXQ+CisJCTwvc2NwLS0+CisJCTwhLS0gSWYgcnVubmluZyBvbiBidWlsZC5lY2xpcHNlLm9yZyBvciBkb3dubG9hZDEuZWNsaXBzZS5vcmcgc2VydmVycywgdGhlbiB1c2UgdGhpcyBvbmUgdG8gY29weSB0aGUgZmlsZXMgLS0+CisJCTxjb3B5IHRvZGlyPSIke3B1Ymxpc2hEaXJ9Ij4KKwkJCTxmaWxlc2V0IGRpcj0iJHtwYWNrYWdlc0Rpcn0iPgorCQkJCTxpbmNsdWRlIG5hbWU9IlNURU0tKi0ke3BhY2thZ2VQb3N0Zml4fS56aXAiLz4KKwkJCTwvZmlsZXNldD4KKwkJPC9jb3B5PgorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0idXBkYXRlV2ViU2l0ZVdpdGhXZWVrbHlCdWlsZCI+CisJCTwhLS0gTG9hZCB0aGUgcHJvcGVydGllcyBmaWxlIHdoaWNoIGhvbGRzIHRoZSBsYXN0IHdlZWtseS9zdGFibGUgYnVpbGQgcG9zdGZpeGVzIC0tPgorCQk8bG9hZHByb3BlcnRpZXM+CisJCQk8ZmlsZSBmaWxlPSIke2Jhc2V9L215LnByb3BlcnRpZXMiLz4KKwkJPC9sb2FkcHJvcGVydGllcz4KKwkJCisJCTwhLS0gQ2hlY2tvdXQvdXBkYXRlZCB0aGUgU1RFTSB3ZWJzaXRlIGZpbGVzIGZyb20gQ1ZTIC0tPgorCQk8Y3ZzIGN2c1Jvb3Q9IiR7dXNlcm5hbWV9QGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9vcmcuZWNsaXBzZSIKKwkJCXBhY2thZ2U9Ind3dy9zdGVtIgorCQkJZGVzdD0iJHtidWlsZERpcmVjdG9yeX0iCisJCS8+CisJCQorCQk8IS0tIFVwZGF0ZSB0aGUgZG93bmxvYWRzLnBocCBmaWxlIC0tPgorCQk8cmVwbGFjZXJlZ2V4cCBieWxpbmU9InRydWUiPgorCQkJPHJlZ2V4cCBwYXR0ZXJuPSIke2xhc3RXZWVrbHlCdWlsZH0iLz4KKwkJCTxzdWJzdGl0dXRpb24gZXhwcmVzc2lvbj0iJHtwYWNrYWdlUG9zdGZpeH0iLz4KKwkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlfS93d3cvc3RlbSI+CisJCQkJPGluY2x1ZGUgbmFtZT0iZG93bmxvYWRzLnBocCIvPgorCQkJPC9maWxlc2V0PgorCQk8L3JlcGxhY2VyZWdleHA+CisJCQorCQk8IS0tIENvbW1pdCB0aGUgdXBkYXRlZCBkb3dubG9hZHMucGhwIGZpbGUgaW50byBDVlMgLS0+CisJCTxjdnMgY3ZzUm9vdD0iJHt1c2VybmFtZX1AZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L29yZy5lY2xpcHNlIgorCQkJcGFja2FnZT0id3d3L3N0ZW0iCisJCQlkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS8uLiIgCisJCQljb21tYW5kPSJjb21taXQgLW0gJ1VwZGF0ZWQgdG8gV2Vla2x5IEludGVncmF0aW9uIEJ1aWxkICR7cGFja2FnZVBvc3RmaXh9JyIvPgorCisJCTwhLS0gU2F2ZSB0aGUgdXBkYXRlZCBwb3N0Zml4IG9mIHRoZSB3ZWVrbHkgYnVpbGQgaW50byB0aGUgcHJvcGVydGllcyBmaWxlIC0tPgorCQk8cHJvcGVydHlmaWxlIGZpbGU9IiR7YmFzZX0vbXkucHJvcGVydGllcyI+CisJCQk8ZW50cnkgIGtleT0ibGFzdFdlZWtseUJ1aWxkIiB2YWx1ZT0iJHtwYWNrYWdlUG9zdGZpeH0iLz4KKwkJCTxlbnRyeSAga2V5PSJsYXN0U3RhYmxlQnVpbGQiIHZhbHVlPSIke2xhc3RTdGFibGVCdWlsZH0iLz4KKwkJPC9wcm9wZXJ0eWZpbGU+CisJCQorCQk8IS0tIERlbGV0ZSB0aGUgcHJldmlvdXMgd2Vla2x5IGJ1aWxkIGZpbGVzIGZyb20gdGhlIHB1Ymxpc2ggZGlyZWN0b3J5IC0tPgorCQk8ZGVsZXRlPgorCQkJPGZpbGVzZXQgZGlyPSIke3B1Ymxpc2hEaXJ9Ij4KKwkJCQk8aW5jbHVkZSBuYW1lPSJTVEVNLSotJHtsYXN0V2Vla2x5QnVpbGR9LnppcCIvPgorCQkJPC9maWxlc2V0PgorCQk8L2RlbGV0ZT4KKwk8L3RhcmdldD4KKworCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTwhLS0gRGVmYXVsdCB0YXJnZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTx0YXJnZXQgbmFtZT0ibm9EZWZhdWx0Ij4KKwkJPGVjaG8gbWVzc2FnZT0iWW91IG11c3Qgc3BlY2lmeSBhIHRhcmdldCB3aGVuIGludm9raW5nIHRoaXMgZmlsZSIgLz4KKwk8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvbG9jYWwuc2gtdGVtcGxhdGUgYi9vcmcuZWNsaXBzZS5zdGVtLnJlbGVuZy9sb2NhbC5zaC10ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjMzMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvbG9jYWwuc2gtdGVtcGxhdGUKQEAgLTAsMCArMSwyMiBAQAorIyBTVEVNJ3MgbWFqb3IgdmVyc2lvbgorTUFKT1JfVkVSU0lPTj0xLjAuMQorCisjIHJvb3Qgb2YgdGhlIEpESyAoSmF2YSA1LjAgb3IgaGlnaGVyKQorI0pBVkFfSE9NRT0ke0JVSUxEX1JPT1R9L2pkazEuNS4wXzE2CitKQVZBX0hPTUU9L3BhdGgvdG8vamRrCisKKyMgRWNsaXBzZSBTREsgdXNlZCBmb3IgYnVpbGRpbmcKK0VDTElQU0VfSE9NRT0vcGF0aC90by9lY2xpcHNlCisKKyNQdWJsaXNoaW5nIGluZm9ybWF0aW9uIHVzZWQgZm9yIHBsYWNpbmcgdGhlIGJpbmFyaWVzIG9uIHRoZSBFY2xpcHNlIGRvd25sb2FkcworI3NlcnZlciBhbmQgdXBkYXRpbmcgdGhlIFNURU0gZG93bmxvYWRzIHdlYnNpdGUKK1RPX1BVQkxJU0g9ZmFsc2UKK0VDTElQU0VfREVWRUxPUEVSX1VTRVJOQU1FPXVzZXJuYW1lCitFQ0xJUFNFX0RFVkVMT1BFUl9QQVNTV09SRD1wYXNzd29yZAorCisjQnVpbGQgdHlwZSAoSSBvciBNKSBsZXR0ZXIgd2lsbCBwcmVmaXggdGhlIHF1YWxpZmllcgorQlVJTERfVFlQRT1JCisKKyNEbyBub3QgZWRpdCB0aGUgZm9sbG93aW5nLCBpdCdzIGFzc2lnbmVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHNjcmlwdAorI3F1YWxpZmllciBmb3JtYXQ6IFlZWVlNTURECitRVUFMSUZJRVI9STIwMDkwODA2CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnJlbGVuZy9tYXBzL3N0ZW0ubWFwIGIvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvbWFwcy9zdGVtLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGIyN2U2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvbWFwcy9zdGVtLm1hcApAQCAtMCwwICsxLDYyIEBACishKioqKioqKioqKiBGRUFUVVJFUyAqKioqKioqKioNCitmZWF0dXJlQG9yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZT1DT1BZLCR7Y2hlY2tvdXREaXJ9LG9yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZQ0KK2ZlYXR1cmVAb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLmNvcmU9Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLmZlYXR1cmUuY29yZQ0KK2ZlYXR1cmVAb3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlLnByZXJlcT1DT1BZLCR7Y2hlY2tvdXREaXJ9LG9yZy5lY2xpcHNlLnN0ZW0uZmVhdHVyZS5wcmVyZXENCisNCishKioqKioqKioqKiBQTFVHSU5TICoqKioqKioqKioNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcz1DT1BZLCR7Y2hlY2tvdXREaXJ9LG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50PUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50DQorcGx1Z2luQG9yZy5lY2xpcHNlLnN0ZW0uY29yZT1DT1BZLCR7Y2hlY2tvdXREaXJ9LG9yZy5lY2xpcHNlLnN0ZW0uY29yZQ0KK3BsdWdpbkBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZGlzZWFzZW1vZGVscy5tb2RlbHM9Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZGlzZWFzZW1vZGVscy5tb2RlbHMNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zDQorcGx1Z2luQG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHk9Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5DQorcGx1Z2luQG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuaW5mcmFzdHJ1Y3R1cmUudHJhbnNwb3J0YXRpb249Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LmluZnJhc3RydWN0dXJlLnRyYW5zcG9ydGF0aW9uDQorcGx1Z2luQG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkubW9kZWxzPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5tb2RlbHMNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5wb3B1bGF0aW9uLmh1bWFuPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5wb3B1bGF0aW9uLmh1bWFuDQorcGx1Z2luQG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkucG9wdWxhdGlvbi5odW1hbi5tb2RlbHM9Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LnBvcHVsYXRpb24uaHVtYW4ubW9kZWxzDQorcGx1Z2luQG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5wb3B1bGF0aW9uLmh1bWFuPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLnBvcHVsYXRpb24uaHVtYW4NCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucz1DT1BZLCR7Y2hlY2tvdXREaXJ9LG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzDQorcGx1Z2luQG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbD1DT1BZLCR7Y2hlY2tvdXREaXJ9LG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZT1DT1BZLCR7Y2hlY2tvdXREaXJ9LG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmc9Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZw0KK3BsdWdpbkBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbg0KK3BsdWdpbkBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlcw0KK3BsdWdpbkBvcmcuZWNsaXBzZS5zdGVtLmRvYz1DT1BZLCR7Y2hlY2tvdXREaXJ9LG9yZy5lY2xpcHNlLnN0ZW0uZG9jDQorcGx1Z2luQG9yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5PUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnM9Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycw0KK3BsdWdpbkBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGE9Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGENCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlb2dyYXBoeT1DT1BZLCR7Y2hlY2tvdXREaXJ9LG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW9ncmFwaHkNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlb2dyYXBoeS5pbmZyYXN0cnVjdHVyZS50cmFuc3BvcnRhdGlvbj1DT1BZLCR7Y2hlY2tvdXREaXJ9LG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW9ncmFwaHkuaW5mcmFzdHJ1Y3R1cmUudHJhbnNwb3J0YXRpb24NCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlb2dyYXBoeS5tb2RlbHM9Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VvZ3JhcGh5Lm1vZGVscw0KK3BsdWdpbkBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VvZ3JhcGh5LnBvcHVsYXRpb249Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VvZ3JhcGh5LnBvcHVsYXRpb24NCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlb2dyYXBoeS5wb3B1bGF0aW9uLmh1bWFuPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlb2dyYXBoeS5wb3B1bGF0aW9uLmh1bWFuDQorcGx1Z2luQG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW9ncmFwaHkucG9wdWxhdGlvbi5odW1hbi5tb2RlbHM9Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VvZ3JhcGh5LnBvcHVsYXRpb24uaHVtYW4ubW9kZWxzDQorcGx1Z2luQG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5wb3B1bGF0aW9uLmh1bWFuPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLnBvcHVsYXRpb24uaHVtYW4NCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLm1vZGVscz1DT1BZLCR7Y2hlY2tvdXREaXJ9LG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5tb2RlbHMNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLnNjZW5hcmlvcz1DT1BZLCR7Y2hlY2tvdXREaXJ9LG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGlzZWFzZW1vZGVscy5zY2VuYXJpb3MNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5qb2JzPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS5qb2JzDQorZnJhZ21lbnRAb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLm5sMT1DT1BZLCR7Y2hlY2tvdXREaXJ9LG9yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDENCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzDQorcGx1Z2luQG9yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS5zYW1wbGUNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzDQorcGx1Z2luQG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZD1DT1BZLCR7Y2hlY2tvdXREaXJ9LG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZA0KK3BsdWdpbkBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucms9Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQ9Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydA0KK3BsdWdpbkBvcmcuZWNsaXBzZS5zdGVtLnVpPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS51aQ0KK3BsdWdpbkBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHM9Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGU9Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZQ0KK3BsdWdpbkBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZQ0KK3BsdWdpbkBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5lZGl0b3I9Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZw0KK3BsdWdpbkBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbg0KK3BsdWdpbkBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS51aS5nZQ0KK3BsdWdpbkBvcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycz1DT1BZLCR7Y2hlY2tvdXREaXJ9LG9yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzDQorZnJhZ21lbnRAb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDE9Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLnVpLm5sMQ0KK3BsdWdpbkBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHM9Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzDQorcGx1Z2luQG9yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZD1DT1BZLCR7Y2hlY2tvdXREaXJ9LG9yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZA0KK3BsdWdpbkBvcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucms9Q09QWSwke2NoZWNrb3V0RGlyfSxvcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzDQorcGx1Z2luQG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzPUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMNCitwbHVnaW5Ab3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5PUNPUFksJHtjaGVja291dERpcn0sb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvcmVzb3VyY2VzL1NURU1UUFRQU3RhdGljQW5hbHlzaXNSdWxlcy5kYXQgYi9vcmcuZWNsaXBzZS5zdGVtLnJlbGVuZy9yZXNvdXJjZXMvU1RFTVRQVFBTdGF0aWNBbmFseXNpc1J1bGVzLmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWMxZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvcmVzb3VyY2VzL1NURU1UUFRQU3RhdGljQW5hbHlzaXNSdWxlcy5kYXQKQEAgLTAsMCArMSwxNzkgQEAKK2NvZGVyZXZpZXcuamF2YS5hbmFseXNpc1Byb3ZpZGVyCitjb2RlcmV2aWV3LmphdmEuajJzZWJlc3RwcmFjdGljZXMKK2NvZGVyZXZpZXcuamF2YS5jYXRlZ29yeS5hd3QKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5hd3QuUnVsZUF3dFBlZXIKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5hd3QuUnVsZUF3dFBlZXIudmFyaWFibGUuU0VWRVJJVFksMgorY29kZXJldmlldy5qYXZhLmNhdGVnb3J5LmNhc3RpbmcKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5jYXN0aW5nLlJ1bGVDYXN0aW5nUHJpbWl0aXZlcworY29kZXJldmlldy5qYXZhLnJ1bGVzLmNhc3RpbmcuUnVsZUNhc3RpbmdQcmltaXRpdmVzLnZhcmlhYmxlLlNFVkVSSVRZLDEKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5jYXN0aW5nLlJ1bGVDYXN0aW5nT2JqZWN0RG93bmNhc3QudmFyaWFibGUuU0VWRVJJVFksMAorY29kZXJldmlldy5qYXZhLmNhdGVnb3J5LmNsb25lYWJsZQorY29kZXJldmlldy5qYXZhLnJ1bGVzLmNsb25lYWJsZS5SdWxlQ2xvbmVhYmxlU3VwZXJDbG9uZQorY29kZXJldmlldy5qYXZhLnJ1bGVzLmNsb25lYWJsZS5SdWxlQ2xvbmVhYmxlU3VwZXJDbG9uZS52YXJpYWJsZS5TRVZFUklUWSwyCitjb2RlcmV2aWV3LmphdmEucnVsZXMuY2xvbmVhYmxlLlJ1bGVDbG9uZWFibGVPdmVycmlkZUNsb25lCitjb2RlcmV2aWV3LmphdmEucnVsZXMuY2xvbmVhYmxlLlJ1bGVDbG9uZWFibGVPdmVycmlkZUNsb25lLnZhcmlhYmxlLlNFVkVSSVRZLDEKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5jbG9uZWFibGUuUnVsZUNsb25lYWJsZUltcGxlbWVudENsb25lYWJsZQorY29kZXJldmlldy5qYXZhLnJ1bGVzLmNsb25lYWJsZS5SdWxlQ2xvbmVhYmxlSW1wbGVtZW50Q2xvbmVhYmxlLnZhcmlhYmxlLlNFVkVSSVRZLDEKK2NvZGVyZXZpZXcuamF2YS5jYXRlZ29yeS5jb21wYXJpc29uCitjb2RlcmV2aWV3LmphdmEucnVsZXMuY29tcGFyaXNvbi5SdWxlQ29tcGFyaXNvbkVxdWFsc0hhc2hDb2RlCitjb2RlcmV2aWV3LmphdmEucnVsZXMuY29tcGFyaXNvbi5SdWxlQ29tcGFyaXNvbkVxdWFsc0hhc2hDb2RlLnZhcmlhYmxlLlNFVkVSSVRZLDIKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5jb21wYXJpc29uLlJ1bGVDb21wYXJpc29uUGxhY2VDb25zdGFudHMudmFyaWFibGUuU0VWRVJJVFksMAorY29kZXJldmlldy5qYXZhLnJ1bGVzLmNvbXBhcmlzb24uUnVsZUNvbXBhcmlzb25JbnN0YW5jZU9mRXF1YWxzLnZhcmlhYmxlLlNFVkVSSVRZLDEKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5jb21wYXJpc29uLlJ1bGVDb21wYXJpc29uUmVmZXJlbmNlRXF1YWxpdHkudmFyaWFibGUuU0VWRVJJVFksMQorY29kZXJldmlldy5qYXZhLnJ1bGVzLmNvbXBhcmlzb24uUnVsZUNvbXBhcmlzb25DbGFzc05hbWVDb21wYXJpc29uCitjb2RlcmV2aWV3LmphdmEucnVsZXMuY29tcGFyaXNvbi5SdWxlQ29tcGFyaXNvbkNsYXNzTmFtZUNvbXBhcmlzb24udmFyaWFibGUuU0VWRVJJVFksMgorY29kZXJldmlldy5qYXZhLmNhdGVnb3J5LmNvbmRpdGlvbmFsCitjb2RlcmV2aWV3LmphdmEucnVsZXMuY29uZGl0aW9uYWwuUnVsZUNvbmRpdGlvbmFsVGVybmFyeQorY29kZXJldmlldy5qYXZhLnJ1bGVzLmNvbmRpdGlvbmFsLlJ1bGVDb25kaXRpb25hbFRlcm5hcnkudmFyaWFibGUuU0VWRVJJVFksMAorY29kZXJldmlldy5qYXZhLnJ1bGVzLmNvbmRpdGlvbmFsLlJ1bGVDb25kaXRpb25hbE5lZ2F0aW9uSWZDb25kaXRpb24KK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5jb25kaXRpb25hbC5SdWxlQ29uZGl0aW9uYWxOZWdhdGlvbklmQ29uZGl0aW9uLnZhcmlhYmxlLlNFVkVSSVRZLDAKK2NvZGVyZXZpZXcuamF2YS5jYXRlZ29yeS5jb25zdHJ1Y3RvcnMKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5jb25zdHJ1Y3RvcnMuUnVsZUNvbnN0cnVjdG9yc0Fic3RyYWN0TWV0aG9kcworY29kZXJldmlldy5qYXZhLnJ1bGVzLmNvbnN0cnVjdG9ycy5SdWxlQ29uc3RydWN0b3JzQWJzdHJhY3RNZXRob2RzLnZhcmlhYmxlLlNFVkVSSVRZLDAKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5jb25zdHJ1Y3RvcnMuUnVsZUNvbnN0cnVjdG9yc092ZXJyaWRhYmxlTWV0aG9kcy52YXJpYWJsZS5TRVZFUklUWSwwCitjb2RlcmV2aWV3LmphdmEuY2F0ZWdvcnkuZGVjbGFyYXRpb24KK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5kZWNsYXJhdGlvbi5SdWxlRGVjbGFyYXRpb25DQXJyYXlTdHlsZQorY29kZXJldmlldy5qYXZhLnJ1bGVzLmRlY2xhcmF0aW9uLlJ1bGVEZWNsYXJhdGlvbkNBcnJheVN0eWxlLnZhcmlhYmxlLlNFVkVSSVRZLDAKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5kZWNsYXJhdGlvbi5SdWxlRGVjbGFyYXRpb25NdWx0aXBsZURlY2xhcmF0aW9uCitjb2RlcmV2aWV3LmphdmEucnVsZXMuZGVjbGFyYXRpb24uUnVsZURlY2xhcmF0aW9uTXVsdGlwbGVEZWNsYXJhdGlvbi52YXJpYWJsZS5TRVZFUklUWSwwCitjb2RlcmV2aWV3LmphdmEucnVsZXMuZGVjbGFyYXRpb24uUnVsZURlY2xhcmF0aW9uTWl4ZWREZWNsYXJhdGlvbgorY29kZXJldmlldy5qYXZhLnJ1bGVzLmRlY2xhcmF0aW9uLlJ1bGVEZWNsYXJhdGlvbk1peGVkRGVjbGFyYXRpb24udmFyaWFibGUuU0VWRVJJVFksMAorY29kZXJldmlldy5qYXZhLnJ1bGVzLmRlY2xhcmF0aW9uLlJ1bGVEZWNsYXJhdGlvbkRlY2xhcmVDb25zdGFudHMudmFyaWFibGUuU0VWRVJJVFksMAorY29kZXJldmlldy5qYXZhLnJ1bGVzLmRlY2xhcmF0aW9uLlJ1bGVEZWNsYXJhdGlvbkludGVyZmFjZUNvbnN0YW50cworY29kZXJldmlldy5qYXZhLnJ1bGVzLmRlY2xhcmF0aW9uLlJ1bGVEZWNsYXJhdGlvbkludGVyZmFjZUNvbnN0YW50cy52YXJpYWJsZS5TRVZFUklUWSwwCitjb2RlcmV2aWV3LmphdmEuY2F0ZWdvcnkuZXhjZXB0aW9ucworY29kZXJldmlldy5qYXZhLnJ1bGVzLmV4Y2VwdGlvbnMuUnVsZUV4Y2VwdGlvbnNTcGVjaWZpY0V4Y2VwdGlvbnMKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5leGNlcHRpb25zLlJ1bGVFeGNlcHRpb25zU3BlY2lmaWNFeGNlcHRpb25zLnZhcmlhYmxlLlNFVkVSSVRZLDAKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5leGNlcHRpb25zLlJ1bGVFeGNlcHRpb25zQ2F0Y2hHZW5lcmljLnZhcmlhYmxlLlNFVkVSSVRZLDAKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5leGNlcHRpb25zLlJ1bGVFeGNlcHRpb25zRXh0ZW5kRXJyb3IKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5leGNlcHRpb25zLlJ1bGVFeGNlcHRpb25zRXh0ZW5kRXJyb3IudmFyaWFibGUuU0VWRVJJVFksMAorY29kZXJldmlldy5qYXZhLnJ1bGVzLmV4Y2VwdGlvbnMuUnVsZUV4Y2VwdGlvbnNFeHRlbmRFcnJvci52YXJpYWJsZS5DTEFTUyxqYXZhLmxhbmcuRXJyb3IKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5leGNlcHRpb25zLlJ1bGVFeGNlcHRpb25zRXh0ZW5kUnVudGltZUV4Y2VwdGlvbgorY29kZXJldmlldy5qYXZhLnJ1bGVzLmV4Y2VwdGlvbnMuUnVsZUV4Y2VwdGlvbnNFeHRlbmRSdW50aW1lRXhjZXB0aW9uLnZhcmlhYmxlLlNFVkVSSVRZLDAKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5leGNlcHRpb25zLlJ1bGVFeGNlcHRpb25zRXh0ZW5kUnVudGltZUV4Y2VwdGlvbi52YXJpYWJsZS5DTEFTUyxqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgorY29kZXJldmlldy5qYXZhLnJ1bGVzLmV4Y2VwdGlvbnMuUnVsZUV4Y2VwdGlvbnNFeHRlbmRUaHJvd2FibGUKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5leGNlcHRpb25zLlJ1bGVFeGNlcHRpb25zRXh0ZW5kVGhyb3dhYmxlLnZhcmlhYmxlLlNFVkVSSVRZLDAKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5leGNlcHRpb25zLlJ1bGVFeGNlcHRpb25zRXh0ZW5kVGhyb3dhYmxlLnZhcmlhYmxlLkNMQVNTLGphdmEubGFuZy5UaHJvd2FibGUKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5leGNlcHRpb25zLlJ1bGVFeGNlcHRpb25zVGhyb3dFcnJvcgorY29kZXJldmlldy5qYXZhLnJ1bGVzLmV4Y2VwdGlvbnMuUnVsZUV4Y2VwdGlvbnNUaHJvd0Vycm9yLnZhcmlhYmxlLlNFVkVSSVRZLDAKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5leGNlcHRpb25zLlJ1bGVFeGNlcHRpb25zVGhyb3dFcnJvci52YXJpYWJsZS5DTEFTUyxqYXZhLmxhbmcuRXJyb3IKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5leGNlcHRpb25zLlJ1bGVFeGNlcHRpb25zVGhyb3dFeGNlcHRpb24KK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5leGNlcHRpb25zLlJ1bGVFeGNlcHRpb25zVGhyb3dFeGNlcHRpb24udmFyaWFibGUuU0VWRVJJVFksMAorY29kZXJldmlldy5qYXZhLnJ1bGVzLmV4Y2VwdGlvbnMuUnVsZUV4Y2VwdGlvbnNUaHJvd0V4Y2VwdGlvbi52YXJpYWJsZS5DTEFTUyxqYXZhLmxhbmcuRXhjZXB0aW9uCitjb2RlcmV2aWV3LmphdmEucnVsZXMuZXhjZXB0aW9ucy5SdWxlRXhjZXB0aW9uc1Rocm93VGhyb3dhYmxlCitjb2RlcmV2aWV3LmphdmEucnVsZXMuZXhjZXB0aW9ucy5SdWxlRXhjZXB0aW9uc1Rocm93VGhyb3dhYmxlLnZhcmlhYmxlLlNFVkVSSVRZLDAKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5leGNlcHRpb25zLlJ1bGVFeGNlcHRpb25zVGhyb3dUaHJvd2FibGUudmFyaWFibGUuQ0xBU1MsamF2YS5sYW5nLlRocm93YWJsZQorY29kZXJldmlldy5qYXZhLnJ1bGVzLmV4Y2VwdGlvbnMuUnVsZUV4Y2VwdGlvbnNJbnN0YW5jZW9mQ2F0Y2gKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5leGNlcHRpb25zLlJ1bGVFeGNlcHRpb25zSW5zdGFuY2VvZkNhdGNoLnZhcmlhYmxlLlNFVkVSSVRZLDEKK2NvZGVyZXZpZXcuamF2YS5jYXRlZ29yeS5pbml0aWFsaXphdGlvbgorY29kZXJldmlldy5qYXZhLnJ1bGVzLmluaXRpYWxpemF0aW9uLlJ1bGVJbml0aWFsaXphdGlvbkluaXRpYWxpemVTdGF0aWNGaWVsZHMudmFyaWFibGUuU0VWRVJJVFksMAorY29kZXJldmlldy5qYXZhLnJ1bGVzLmluaXRpYWxpemF0aW9uLlJ1bGVJbml0aWFsaXphdGlvbkNoYWluaW5nQXNzaWdubWVudHMKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5pbml0aWFsaXphdGlvbi5SdWxlSW5pdGlhbGl6YXRpb25DaGFpbmluZ0Fzc2lnbm1lbnRzLnZhcmlhYmxlLlNFVkVSSVRZLDAKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5pbml0aWFsaXphdGlvbi5SdWxlSW5pdGlhbGl6YXRpb25Bc3NpZ25pbmdNZXRob2RQYXJhbWV0ZXIudmFyaWFibGUuU0VWRVJJVFksMAorY29kZXJldmlldy5qYXZhLmNhdGVnb3J5Lmxvb3AKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5sb29wLlJ1bGVMb29wTm9Db25kaXRpb25Gb3JMb29wCitjb2RlcmV2aWV3LmphdmEucnVsZXMubG9vcC5SdWxlTG9vcE5vQ29uZGl0aW9uRm9yTG9vcC52YXJpYWJsZS5TRVZFUklUWSwwCitjb2RlcmV2aWV3LmphdmEucnVsZXMubG9vcC5SdWxlTG9vcE5vSW5pdEluY3JGb3JMb29wCitjb2RlcmV2aWV3LmphdmEucnVsZXMubG9vcC5SdWxlTG9vcE5vSW5pdEluY3JGb3JMb29wLnZhcmlhYmxlLlNFVkVSSVRZLDAKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5sb29wLlJ1bGVMb29wQXNzaWduTG9vcFZhcmlhYmxlCitjb2RlcmV2aWV3LmphdmEucnVsZXMubG9vcC5SdWxlTG9vcEFzc2lnbkxvb3BWYXJpYWJsZS52YXJpYWJsZS5TRVZFUklUWSwxCitjb2RlcmV2aWV3LmphdmEucnVsZXMubG9vcC5SdWxlTG9vcENvbnRpbnVlU3RhdGVtZW50LnZhcmlhYmxlLlNFVkVSSVRZLDAKK2NvZGVyZXZpZXcuamF2YS5jYXRlZ29yeS5udWxsCitjb2RlcmV2aWV3LmphdmEucnVsZXMubnVsbHMuUnVsZU51bGxFbXB0eUFycmF5Citjb2RlcmV2aWV3LmphdmEucnVsZXMubnVsbHMuUnVsZU51bGxFbXB0eUFycmF5LnZhcmlhYmxlLlNFVkVSSVRZLDIKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5udWxscy5SdWxlTnVsbEVudW1lcmF0aW9uCitjb2RlcmV2aWV3LmphdmEucnVsZXMubnVsbHMuUnVsZU51bGxFbnVtZXJhdGlvbi52YXJpYWJsZS5TRVZFUklUWSwxCitjb2RlcmV2aWV3LmphdmEucnVsZXMubnVsbHMuUnVsZU51bGxJdGVyYXRvcgorY29kZXJldmlldy5qYXZhLnJ1bGVzLm51bGxzLlJ1bGVOdWxsSXRlcmF0b3IudmFyaWFibGUuU0VWRVJJVFksMQorY29kZXJldmlldy5qYXZhLmNhdGVnb3J5LnBvcnRhYmlsaXR5Citjb2RlcmV2aWV3LmphdmEucnVsZXMucG9ydGFiaWxpdHkuUnVsZVBvcnRhYmlsaXR5U3lzdGVtR2V0ZW52Citjb2RlcmV2aWV3LmphdmEucnVsZXMucG9ydGFiaWxpdHkuUnVsZVBvcnRhYmlsaXR5U3lzdGVtR2V0ZW52LnZhcmlhYmxlLlNFVkVSSVRZLDEKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5wb3J0YWJpbGl0eS5SdWxlUG9ydGFiaWxpdHlMaW5lU2VwYXJhdG9ycworY29kZXJldmlldy5qYXZhLnJ1bGVzLnBvcnRhYmlsaXR5LlJ1bGVQb3J0YWJpbGl0eUxpbmVTZXBhcmF0b3JzLnZhcmlhYmxlLlNFVkVSSVRZLDEKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5wb3J0YWJpbGl0eS5SdWxlUG9ydGFiaWxpdHlGaWxlU2VwYXJhdG9yCitjb2RlcmV2aWV3LmphdmEucnVsZXMucG9ydGFiaWxpdHkuUnVsZVBvcnRhYmlsaXR5RmlsZVNlcGFyYXRvci52YXJpYWJsZS5TRVZFUklUWSwxCitjb2RlcmV2aWV3LmphdmEuY2F0ZWdvcnkucmVmbGVjdGlvbgorY29kZXJldmlldy5qYXZhLnJ1bGVzLnJlZmxlY3Rpb24uUnVsZVJlZmxlY3Rpb25HZXREZWNsYXJlZEZpZWxkCitjb2RlcmV2aWV3LmphdmEucnVsZXMucmVmbGVjdGlvbi5SdWxlUmVmbGVjdGlvbkdldERlY2xhcmVkRmllbGQudmFyaWFibGUuU0VWRVJJVFksMAorY29kZXJldmlldy5qYXZhLnJ1bGVzLnJlZmxlY3Rpb24uUnVsZVJlZmxlY3Rpb25HZXREZWNsYXJlZEZpZWxkLnZhcmlhYmxlLkNMQVNTLGphdmEubGFuZy5DbGFzcworY29kZXJldmlldy5qYXZhLnJ1bGVzLnJlZmxlY3Rpb24uUnVsZVJlZmxlY3Rpb25HZXREZWNsYXJlZEZpZWxkLnZhcmlhYmxlLk1FVEhPRCxnZXREZWNsYXJlZEZpZWxkCitjb2RlcmV2aWV3LmphdmEucnVsZXMucmVmbGVjdGlvbi5SdWxlUmVmbGVjdGlvbkdldERlY2xhcmVkTWV0aG9kCitjb2RlcmV2aWV3LmphdmEucnVsZXMucmVmbGVjdGlvbi5SdWxlUmVmbGVjdGlvbkdldERlY2xhcmVkTWV0aG9kLnZhcmlhYmxlLlNFVkVSSVRZLDAKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5yZWZsZWN0aW9uLlJ1bGVSZWZsZWN0aW9uR2V0RGVjbGFyZWRNZXRob2QudmFyaWFibGUuQ0xBU1MsamF2YS5sYW5nLkNsYXNzCitjb2RlcmV2aWV3LmphdmEucnVsZXMucmVmbGVjdGlvbi5SdWxlUmVmbGVjdGlvbkdldERlY2xhcmVkTWV0aG9kLnZhcmlhYmxlLk1FVEhPRCxnZXREZWNsYXJlZE1ldGhvZAorY29kZXJldmlldy5qYXZhLnJ1bGVzLnJlZmxlY3Rpb24uUnVsZVJlZmxlY3Rpb25HZXRGaWVsZAorY29kZXJldmlldy5qYXZhLnJ1bGVzLnJlZmxlY3Rpb24uUnVsZVJlZmxlY3Rpb25HZXRGaWVsZC52YXJpYWJsZS5TRVZFUklUWSwwCitjb2RlcmV2aWV3LmphdmEucnVsZXMucmVmbGVjdGlvbi5SdWxlUmVmbGVjdGlvbkdldEZpZWxkLnZhcmlhYmxlLkNMQVNTLGphdmEubGFuZy5DbGFzcworY29kZXJldmlldy5qYXZhLnJ1bGVzLnJlZmxlY3Rpb24uUnVsZVJlZmxlY3Rpb25HZXRGaWVsZC52YXJpYWJsZS5NRVRIT0QsZ2V0RmllbGQKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5yZWZsZWN0aW9uLlJ1bGVSZWZsZWN0aW9uR2V0TWV0aG9kCitjb2RlcmV2aWV3LmphdmEucnVsZXMucmVmbGVjdGlvbi5SdWxlUmVmbGVjdGlvbkdldE1ldGhvZC52YXJpYWJsZS5TRVZFUklUWSwwCitjb2RlcmV2aWV3LmphdmEucnVsZXMucmVmbGVjdGlvbi5SdWxlUmVmbGVjdGlvbkdldE1ldGhvZC52YXJpYWJsZS5DTEFTUyxqYXZhLmxhbmcuQ2xhc3MKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5yZWZsZWN0aW9uLlJ1bGVSZWZsZWN0aW9uR2V0TWV0aG9kLnZhcmlhYmxlLk1FVEhPRCxnZXRNZXRob2QKK2NvZGVyZXZpZXcuamF2YS5jYXRlZ29yeS5zZXJpYWxpemF0aW9uCitjb2RlcmV2aWV3LmphdmEucnVsZXMuc2VyaWFsaXphdGlvbi5SdWxlU2VyaWFsaXphdGlvblNlcmlhbFZlcnNpb25VSUQKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5zZXJpYWxpemF0aW9uLlJ1bGVTZXJpYWxpemF0aW9uU2VyaWFsVmVyc2lvblVJRC52YXJpYWJsZS5TRVZFUklUWSwwCitjb2RlcmV2aWV3LmphdmEucnVsZXMuc2VyaWFsaXphdGlvbi5SdWxlU2VyaWFsaXphdGlvblJlYWRXcml0ZU9iamVjdAorY29kZXJldmlldy5qYXZhLnJ1bGVzLnNlcmlhbGl6YXRpb24uUnVsZVNlcmlhbGl6YXRpb25SZWFkV3JpdGVPYmplY3QudmFyaWFibGUuU0VWRVJJVFksMgorY29kZXJldmlldy5qYXZhLnJ1bGVzLnNlcmlhbGl6YXRpb24uUnVsZVNlcmlhbGl6YXRpb25SZXNvbHZlT2JqZWN0Citjb2RlcmV2aWV3LmphdmEucnVsZXMuc2VyaWFsaXphdGlvbi5SdWxlU2VyaWFsaXphdGlvblJlc29sdmVPYmplY3QudmFyaWFibGUuU0VWRVJJVFksMgorY29kZXJldmlldy5qYXZhLnJ1bGVzLnNlcmlhbGl6YXRpb24uUnVsZVNlcmlhbGl6YXRpb25TZXJpYWxpemFibGVGaWVsZAorY29kZXJldmlldy5qYXZhLnJ1bGVzLnNlcmlhbGl6YXRpb24uUnVsZVNlcmlhbGl6YXRpb25TZXJpYWxpemFibGVGaWVsZC52YXJpYWJsZS5TRVZFUklUWSwyCitjb2RlcmV2aWV3LmphdmEucnVsZXMuc2VyaWFsaXphdGlvbi5SdWxlU2VyaWFsaXphdGlvblRyYW5zaWVudEZpZWxkCitjb2RlcmV2aWV3LmphdmEucnVsZXMuc2VyaWFsaXphdGlvbi5SdWxlU2VyaWFsaXphdGlvblRyYW5zaWVudEZpZWxkLnZhcmlhYmxlLlNFVkVSSVRZLDAKK2NvZGVyZXZpZXcuamF2YS5jYXRlZ29yeS5zdGF0ZW1lbnQKK2NvZGVyZXZpZXcuamF2YS5ydWxlcy5zdGF0ZW1lbnQuUnVsZVN0YXRlbWVudFN1cnJvdW5kV2l0aEJyYWNlcy52YXJpYWJsZS5TRVZFUklUWSwwCitjb2RlcmV2aWV3LmphdmEucnVsZXMuc3RhdGVtZW50LlJ1bGVTdGF0ZW1lbnRFbXB0eVN0YXRlbWVudAorY29kZXJldmlldy5qYXZhLnJ1bGVzLnN0YXRlbWVudC5SdWxlU3RhdGVtZW50RW1wdHlTdGF0ZW1lbnQudmFyaWFibGUuU0VWRVJJVFksMAorY29kZXJldmlldy5qYXZhLmNhdGVnb3J5LnN3aXRjaAorY29kZXJldmlldy5qYXZhLnJ1bGVzLnN3aXRjaGVzLlJ1bGVTd2l0Y2hCcmVhaworY29kZXJldmlldy5qYXZhLnJ1bGVzLnN3aXRjaGVzLlJ1bGVTd2l0Y2hCcmVhay52YXJpYWJsZS5TRVZFUklUWSwxCitjb2RlcmV2aWV3LmphdmEucnVsZXMuc3dpdGNoZXMuUnVsZVN3aXRjaERlZmF1bHRMYWJlbC52YXJpYWJsZS5TRVZFUklUWSwwCitjb2RlcmV2aWV3LmphdmEucnVsZXMuc3dpdGNoZXMuUnVsZVN3aXRjaEJyYW5jaC52YXJpYWJsZS5TRVZFUklUWSwwCitjb2RlcmV2aWV3LmphdmEuY2F0ZWdvcnkudGhyZWFkcworY29kZXJldmlldy5qYXZhLnRocmVhZHMubm9uc3luY2hyb25pemVkbm90aWZ5Citjb2RlcmV2aWV3LmphdmEudGhyZWFkcy5ub25zeW5jaHJvbml6ZWRub3RpZnkudmFyaWFibGUuU0VWRVJJVFksMgorY29kZXJldmlldy5qYXZhLnRocmVhZHMubm9uc3luY2hyb25pemVkbm90aWZ5LnZhcmlhYmxlLkNMQVNTLGphdmEubGFuZy5PYmplY3QKK2NvZGVyZXZpZXcuamF2YS50aHJlYWRzLm5vbnN5bmNocm9uaXplZG5vdGlmeS52YXJpYWJsZS5NRVRIT0Qsbm90aWZ5Citjb2RlcmV2aWV3LmphdmEudGhyZWFkcy5ub25zeW5jaHJvbml6ZWRub3RpZnlhbGwKK2NvZGVyZXZpZXcuamF2YS50aHJlYWRzLm5vbnN5bmNocm9uaXplZG5vdGlmeWFsbC52YXJpYWJsZS5TRVZFUklUWSwyCitjb2RlcmV2aWV3LmphdmEudGhyZWFkcy5ub25zeW5jaHJvbml6ZWRub3RpZnlhbGwudmFyaWFibGUuQ0xBU1MsamF2YS5sYW5nLk9iamVjdAorY29kZXJldmlldy5qYXZhLnRocmVhZHMubm9uc3luY2hyb25pemVkbm90aWZ5YWxsLnZhcmlhYmxlLk1FVEhPRCxub3RpZnlBbGwKK2NvZGVyZXZpZXcuamF2YS50aHJlYWRzLm5vbnN5bmNocm9uaXplZHdhaXQKK2NvZGVyZXZpZXcuamF2YS50aHJlYWRzLm5vbnN5bmNocm9uaXplZHdhaXQudmFyaWFibGUuU0VWRVJJVFksMgorY29kZXJldmlldy5qYXZhLnRocmVhZHMubm9uc3luY2hyb25pemVkd2FpdC52YXJpYWJsZS5DTEFTUyxqYXZhLmxhbmcuT2JqZWN0Citjb2RlcmV2aWV3LmphdmEudGhyZWFkcy5ub25zeW5jaHJvbml6ZWR3YWl0LnZhcmlhYmxlLk1FVEhPRCx3YWl0Citjb2RlcmV2aWV3LmphdmEudGhyZWFkcy5kZXN0cm95Citjb2RlcmV2aWV3LmphdmEudGhyZWFkcy5kZXN0cm95LnZhcmlhYmxlLlNFVkVSSVRZLDIKK2NvZGVyZXZpZXcuamF2YS50aHJlYWRzLmRlc3Ryb3kudmFyaWFibGUuQ0xBU1MsamF2YS5sYW5nLlRocmVhZAorY29kZXJldmlldy5qYXZhLnRocmVhZHMuZGVzdHJveS52YXJpYWJsZS5NRVRIT0QsZGVzdHJveQorY29kZXJldmlldy5qYXZhLnRocmVhZHMucmVzdW1lCitjb2RlcmV2aWV3LmphdmEudGhyZWFkcy5yZXN1bWUudmFyaWFibGUuU0VWRVJJVFksMgorY29kZXJldmlldy5qYXZhLnRocmVhZHMucmVzdW1lLnZhcmlhYmxlLkNMQVNTLGphdmEubGFuZy5UaHJlYWQKK2NvZGVyZXZpZXcuamF2YS50aHJlYWRzLnJlc3VtZS52YXJpYWJsZS5NRVRIT0QscmVzdW1lCitjb2RlcmV2aWV3LmphdmEudGhyZWFkcy5zdG9wCitjb2RlcmV2aWV3LmphdmEudGhyZWFkcy5zdG9wLnZhcmlhYmxlLlNFVkVSSVRZLDIKK2NvZGVyZXZpZXcuamF2YS50aHJlYWRzLnN0b3AudmFyaWFibGUuQ0xBU1MsamF2YS5sYW5nLlRocmVhZAorY29kZXJldmlldy5qYXZhLnRocmVhZHMuc3RvcC52YXJpYWJsZS5NRVRIT0Qsc3RvcAorY29kZXJldmlldy5qYXZhLnRocmVhZHMuc3VzcGVuZAorY29kZXJldmlldy5qYXZhLnRocmVhZHMuc3VzcGVuZC52YXJpYWJsZS5TRVZFUklUWSwyCitjb2RlcmV2aWV3LmphdmEudGhyZWFkcy5zdXNwZW5kLnZhcmlhYmxlLkNMQVNTLGphdmEubGFuZy5UaHJlYWQKK2NvZGVyZXZpZXcuamF2YS50aHJlYWRzLnN1c3BlbmQudmFyaWFibGUuTUVUSE9ELHN1c3BlbmQKK2NvZGVyZXZpZXcuamF2YS50aHJlYWRzLnlpZWxkCitjb2RlcmV2aWV3LmphdmEudGhyZWFkcy55aWVsZC52YXJpYWJsZS5TRVZFUklUWSwwCitjb2RlcmV2aWV3LmphdmEudGhyZWFkcy55aWVsZC52YXJpYWJsZS5DTEFTUyxqYXZhLmxhbmcuVGhyZWFkCitjb2RlcmV2aWV3LmphdmEudGhyZWFkcy55aWVsZC52YXJpYWJsZS5NRVRIT0QseWllbGQKK2NvZGVyZXZpZXcuamF2YS50aHJlYWRzLmV4dGVuZHRocmVhZAorY29kZXJldmlldy5qYXZhLnRocmVhZHMuZXh0ZW5kdGhyZWFkLnZhcmlhYmxlLlNFVkVSSVRZLDAKK2NvZGVyZXZpZXcuamF2YS50aHJlYWRzLmV4dGVuZHRocmVhZC52YXJpYWJsZS5DTEFTUyxqYXZhLmxhbmcuVGhyZWFkCitjb2RlcmV2aWV3LmphdmEudGhyZWFkcy5vdmVycmlkZXN5bmNocm9uaXphYmxlCitjb2RlcmV2aWV3LmphdmEudGhyZWFkcy5vdmVycmlkZXN5bmNocm9uaXphYmxlLnZhcmlhYmxlLlNFVkVSSVRZLDIKK2NvZGVyZXZpZXcuamF2YS50aHJlYWRzLnN5bmNocm9uaXplZHRoaXMKK2NvZGVyZXZpZXcuamF2YS50aHJlYWRzLnN5bmNocm9uaXplZHRoaXMudmFyaWFibGUuU0VWRVJJVFksMAorY29kZXJldmlldy5qYXZhLnRocmVhZHMubm90aWZ5YWxsCitjb2RlcmV2aWV3LmphdmEudGhyZWFkcy5ub3RpZnlhbGwudmFyaWFibGUuU0VWRVJJVFksMAorY29kZXJldmlldy5qYXZhLnRocmVhZHMud2FpdG91dHNpZGVsb29wCitjb2RlcmV2aWV3LmphdmEudGhyZWFkcy53YWl0b3V0c2lkZWxvb3AudmFyaWFibGUuU0VWRVJJVFksMAorY29kZXJldmlldy5qYXZhLnRocmVhZHMuc3luY2hyb25pemVkbWV0aG9kCitjb2RlcmV2aWV3LmphdmEudGhyZWFkcy5zeW5jaHJvbml6ZWRtZXRob2QudmFyaWFibGUuU0VWRVJJVFksMAorY29kZXJldmlldy5qYXZhLnRocmVhZHMud2hpbGVzbGVlcAorY29kZXJldmlldy5qYXZhLnRocmVhZHMud2hpbGVzbGVlcC52YXJpYWJsZS5TRVZFUklUWSwwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnJlbGVuZy9yZXNvdXJjZXMvY29kZWNsZWFudXBjb25maWd1cmF0aW9uLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL3Jlc291cmNlcy9jb2RlY2xlYW51cGNvbmZpZ3VyYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZWQ2ODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnJlbGVuZy9yZXNvdXJjZXMvY29kZWNsZWFudXBjb25maWd1cmF0aW9uLnhtbApAQCAtMCwwICsxLDUxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2ZpbGVzIHZlcnNpb249IjIiPgorPHByb2ZpbGUga2luZD0iQ2xlYW5VcFByb2ZpbGUiIG5hbWU9ImNsZWFudXAiIHZlcnNpb249IjIiPgorPHNldHRpbmcgaWQ9ImNsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9ImNsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgorPHNldHRpbmcgaWQ9ImNsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eSIgdmFsdWU9ImZhbHNlIi8+Cis8c2V0dGluZyBpZD0iY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHMiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0iY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5IiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9ImNsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucyIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9ImNsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZCIgdmFsdWU9ImZhbHNlIi8+Cis8c2V0dGluZyBpZD0iY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgorPHNldHRpbmcgaWQ9ImNsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbCIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9ImNsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbCIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcyIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZCIgdmFsdWU9ImZhbHNlIi8+Cis8c2V0dGluZyBpZD0iY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9ImNsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3MiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0iY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsIiB2YWx1ZT0iZmFsc2UiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9ImNsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93IiB2YWx1ZT0iZmFsc2UiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcyIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9ImNsZWFudXAub3JnYW5pemVfaW1wb3J0cyIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucyIgdmFsdWU9ImZhbHNlIi8+Cis8c2V0dGluZyBpZD0iY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzIiB2YWx1ZT0iZmFsc2UiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzIiB2YWx1ZT0iZmFsc2UiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgorPHNldHRpbmcgaWQ9ImNsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9ImNsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcCIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeSIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWwiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0iY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGUiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0iY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucyIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgorPHNldHRpbmcgaWQ9ImNsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcyIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9ImNsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzIiB2YWx1ZT0iZmFsc2UiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9ImNsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9ImNsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zIiB2YWx1ZT0iZmFsc2UiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLnVzZV9ibG9ja3MiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0iY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnMiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0iY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycyIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcyIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzIiB2YWx1ZT0iZmFsc2UiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcyIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJjbGVhbnVwLnNvcnRfbWVtYmVycyIgdmFsdWU9ImZhbHNlIi8+Cis8L3Byb2ZpbGU+Cis8L3Byb2ZpbGVzPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvcmVzb3VyY2VzL3dvcmtzcGFjZS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvLnJvb3QvLmluZGV4ZXMvaGlzdG9yeS52ZXJzaW9uIGIvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvcmVzb3VyY2VzL3dvcmtzcGFjZS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvLnJvb3QvLmluZGV4ZXMvaGlzdG9yeS52ZXJzaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1Y2I5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnJlbGVuZy9yZXNvdXJjZXMvd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy8ucm9vdC8uaW5kZXhlcy9oaXN0b3J5LnZlcnNpb24KQEAgLTAsMCArMSBAQAorAgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL3Jlc291cmNlcy93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLy5yb290Ly5pbmRleGVzL3Byb3BlcnRpZXMudmVyc2lvbiBiL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL3Jlc291cmNlcy93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLy5yb290Ly5pbmRleGVzL3Byb3BlcnRpZXMudmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjJhYWE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvcmVzb3VyY2VzL3dvcmtzcGFjZS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvLnJvb3QvLmluZGV4ZXMvcHJvcGVydGllcy52ZXJzaW9uCkBAIC0wLDAgKzEgQEAKKwEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnJlbGVuZy9yZXNvdXJjZXMvd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy8ucm9vdC8yLnRyZWUgYi9vcmcuZWNsaXBzZS5zdGVtLnJlbGVuZy9yZXNvdXJjZXMvd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy8ucm9vdC8yLnRyZWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNhNGRhZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL3Jlc291cmNlcy93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLy5yb290LzIudHJlZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnJlbGVuZy9yZXNvdXJjZXMvd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy8uc2FmZXRhYmxlL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIGIvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvcmVzb3VyY2VzL3dvcmtzcGFjZS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvLnNhZmV0YWJsZS9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzJmYjUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvcmVzb3VyY2VzL3dvcmtzcGFjZS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvLnNhZmV0YWJsZS9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnJlbGVuZy9yZXNvdXJjZXMvd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvQ1NWTG9nZ2VyX1ByZWZlcmVuY2VzLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL3Jlc291cmNlcy93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy9DU1ZMb2dnZXJfUHJlZmVyZW5jZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjRlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnJlbGVuZy9yZXNvdXJjZXMvd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMvQ1NWTG9nZ2VyX1ByZWZlcmVuY2VzLnR4dApAQCAtMCwwICsxLDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHNlY3Rpb24gbmFtZT0icm9vdCI+DQorPC9zZWN0aW9uPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL3Jlc291cmNlcy93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9QaGFzZVNwYWNlX1ByZWZlcmVuY2VzLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL3Jlc291cmNlcy93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9QaGFzZVNwYWNlX1ByZWZlcmVuY2VzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjkwYTc5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvcmVzb3VyY2VzL3dvcmtzcGFjZS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL1BoYXNlU3BhY2VfUHJlZmVyZW5jZXMudHh0CkBAIC0wLDAgKzEsOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8c2VjdGlvbiBuYW1lPSJyb290Ij4NCisJPHNlY3Rpb24gbmFtZT0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZGlzZWFzZW1vZGVscy5zY2VuYXJpb3MvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9VU0EvVVNBXzFfMl9kaXNlYXNlX0luZmx1ZW56YS5zY2VuYXJpbyI+DQorCQk8bGlzdCBrZXk9ImxvY2F0aW9uLmlkcyI+DQorCQkJPGl0ZW0gdmFsdWU9InN0ZW06Ly9vcmcuZWNsaXBzZS5zdGVtL25vZGUvZ2VvL3JlZ2lvbi9VUy1OWS0zNjA4MSIvPg0KKwkJPC9saXN0Pg0KKwk8L3NlY3Rpb24+DQorPC9zZWN0aW9uPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL3Jlc291cmNlcy93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9UaW1lU2VyaWVzX1ByZWZlcmVuY2VzLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL3Jlc291cmNlcy93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9UaW1lU2VyaWVzX1ByZWZlcmVuY2VzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjkwYTc5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvcmVzb3VyY2VzL3dvcmtzcGFjZS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL1RpbWVTZXJpZXNfUHJlZmVyZW5jZXMudHh0CkBAIC0wLDAgKzEsOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8c2VjdGlvbiBuYW1lPSJyb290Ij4NCisJPHNlY3Rpb24gbmFtZT0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZGlzZWFzZW1vZGVscy5zY2VuYXJpb3MvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9VU0EvVVNBXzFfMl9kaXNlYXNlX0luZmx1ZW56YS5zY2VuYXJpbyI+DQorCQk8bGlzdCBrZXk9ImxvY2F0aW9uLmlkcyI+DQorCQkJPGl0ZW0gdmFsdWU9InN0ZW06Ly9vcmcuZWNsaXBzZS5zdGVtL25vZGUvZ2VvL3JlZ2lvbi9VUy1OWS0zNjA4MSIvPg0KKwkJPC9saXN0Pg0KKwk8L3NlY3Rpb24+DQorPC9zZWN0aW9uPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL3Jlc291cmNlcy93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC9kaWFsb2dfc2V0dGluZ3MueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5yZWxlbmcvcmVzb3VyY2VzL3dvcmtzcGFjZS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoL2RpYWxvZ19zZXR0aW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0MzU1OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL3Jlc291cmNlcy93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC9kaWFsb2dfc2V0dGluZ3MueG1sCkBAIC0wLDAgKzEsMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHNlY3Rpb24gbmFtZT0iV29ya2JlbmNoIj4NCisJPHNlY3Rpb24gbmFtZT0iV29ya2JlbmNoUHJlZmVyZW5jZURpYWxvZ1NldHRpbmdzIj4NCisJCTxpdGVtIHZhbHVlPSI4MyIga2V5PSJESUFMT0dfWV9PUklHSU4iLz4NCisJCTxpdGVtIHZhbHVlPSI0ODkiIGtleT0iRElBTE9HX1hfT1JJR0lOIi8+DQorCTwvc2VjdGlvbj4NCisJPHNlY3Rpb24gbmFtZT0iU2hvd1ZpZXdEaWFsb2ciPg0KKwkJPGl0ZW0gdmFsdWU9IjQwMyIga2V5PSJESUFMT0dfV0lEVEgiLz4NCisJCTxpdGVtIHZhbHVlPSJvcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2VycyIga2V5PSJTaG93Vmlld0RpYWxvZy5TVE9SRV9TRUxFQ1RFRF9WSUVXX0lEIi8+DQorCQk8aXRlbSB2YWx1ZT0iMTU0IiBrZXk9IkRJQUxPR19ZX09SSUdJTiIvPg0KKwkJPGl0ZW0gdmFsdWU9IjYwMyIga2V5PSJESUFMT0dfWF9PUklHSU4iLz4NCisJCTxpdGVtIHZhbHVlPSI0NzAiIGtleT0iRElBTE9HX0hFSUdIVCIvPg0KKwkJPGl0ZW0gdmFsdWU9IjF8VGFob21hfDEyLjB8MHxXSU5ET1dTfDF8LTE2fDB8MHwwfDQwMHwwfDB8MHwxfDB8MHwwfDB8VGFob21hIiBrZXk9IkRJQUxPR19GT05UX05BTUUiLz4NCisJCTxsaXN0IGtleT0iU2hvd1ZpZXdEaWFsb2cuU1RPUkVfRVhQQU5ERURfQ0FURUdPUklFU19JRCI+DQorCQkJPGl0ZW0gdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MiLz4NCisJCTwvbGlzdD4NCisJPC9zZWN0aW9uPg0KKzwvc2VjdGlvbj4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnJlbGVuZy9yZXNvdXJjZXMvd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gvd29ya2JlbmNoLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0ucmVsZW5nL3Jlc291cmNlcy93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC93b3JrYmVuY2gueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MGRhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnJlbGVuZy9yZXNvdXJjZXMvd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gvd29ya2JlbmNoLnhtbApAQCAtMCwwICsxLDI5NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8d29ya2JlbmNoIHByb2dyZXNzQ291bnQ9IjExIiB2ZXJzaW9uPSIyLjAiPg0KKzx3b3JrYmVuY2hBZHZpc29yLz4NCis8d2luZG93IGhlaWdodD0iOTM0IiBtYXhpbWl6ZWQ9InRydWUiIHdpZHRoPSIxMjkyIiB4PSIyMiIgeT0iMzkiPg0KKzxmYXN0Vmlld0RhdGEgZmFzdFZpZXdMb2NhdGlvbj0iMTAyNCIvPg0KKzxwZXJzcGVjdGl2ZUJhcj4NCis8aXRlbVNpemUgeD0iMTYwIi8+DQorPC9wZXJzcGVjdGl2ZUJhcj4NCis8Y29vbGJhckxheW91dCBsb2NrZWQ9IjAiPg0KKzxjb29sSXRlbSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS50b29sYmFyLm5ld3dpemFyZHMiIGl0ZW1UeXBlPSJ0eXBlVG9vbEJhckNvbnRyaWJ1dGlvbiIgeD0iMjY5IiB5PSIyMiIvPg0KKzxjb29sSXRlbSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS50b29sYmFyIiBpdGVtVHlwZT0idHlwZVRvb2xCYXJDb250cmlidXRpb24iIHg9IjEzMSIgeT0iMjIiLz4NCis8L2Nvb2xiYXJMYXlvdXQ+DQorPHBhZ2UgZm9jdXM9InRydWUiIGxhYmVsPSJXb3Jrc3BhY2UgLSBTaW11bGF0aW9uIj4NCis8ZWRpdG9ycz4NCis8ZWRpdG9yQXJlYSBhY3RpdmVXb3JrYm9vaz0iRGVmYXVsdEVkaXRvcldvcmtib29rIj4NCis8aW5mbyBwYXJ0PSJEZWZhdWx0RWRpdG9yV29ya2Jvb2siPg0KKzxmb2xkZXIgYXBwZWFyYW5jZT0iMSIgZXhwYW5kZWQ9IjIiPg0KKzxwcmVzZW50YXRpb24gaWQ9Im9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuV29ya2JlbmNoUHJlc2VudGF0aW9uRmFjdG9yeSIvPg0KKzwvZm9sZGVyPg0KKzwvaW5mbz4NCis8L2VkaXRvckFyZWE+DQorPC9lZGl0b3JzPg0KKzx2aWV3cz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5zZXF1ZW5jZXJzIiBwYXJ0TmFtZT0iU2VxdWVuY2VycyIvPg0KKzx2aWV3IGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdyYXBocyIgcGFydE5hbWU9IkdyYXBocyIvPg0KKzx2aWV3IGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnByZWRpY2F0ZXMiIHBhcnROYW1lPSJQcmVkaWNhdGVzIi8+DQorPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5seWFwdW5vdiIgcGFydE5hbWU9Ikx5YXB1bm92Ii8+DQorPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MucmVwb3J0cy5waGFzZVNwYWNlIiBwYXJ0TmFtZT0iUGhhc2UgU3BhY2UiPg0KKzx2aWV3U3RhdGUvPg0KKzwvdmlldz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2UucGRlLnJ1bnRpbWUuTG9nVmlldyIgcGFydE5hbWU9IkVycm9yIExvZyI+DQorPHZpZXdTdGF0ZSBhY3RpdmF0ZT0idHJ1ZSIgYWxsU2Vzc2lvbnM9InRydWUiIGNvbHVtbjI9IjQ0OCIgY29sdW1uMz0iMTUwIiBjb2x1bW40PSIxNTAiIGVycm9yPSJ0cnVlIiBncm91cEJ5PSIwIiBpbmZvPSJ0cnVlIiBsaW1pdD0iNTAiIG9rPSJ0cnVlIiBvcmRlclR5cGU9IjIiIG9yZGVyVmFsdWU9Ii0xIiBzaG93X2ZpbHRlcl90ZXh0PSJ0cnVlIiB1c2VMaW1pdD0idHJ1ZSIgd2FybmluZz0idHJ1ZSIvPg0KKzwvdmlldz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MuVGFza0xpc3QiIHBhcnROYW1lPSJUYXNrcyIvPg0KKzx2aWV3IGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnNpbXVsYXRpb25jb250cm9sdmlldyIgcGFydE5hbWU9IlNpbXVsYXRpb24gQ29udHJvbCI+DQorPHZpZXdTdGF0ZS8+DQorPC92aWV3Pg0KKzx2aWV3IGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Db250ZW50T3V0bGluZSIgcGFydE5hbWU9Ik91dGxpbmUiPg0KKzx2aWV3U3RhdGUvPg0KKzwvdmlldz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciIgcGFydE5hbWU9IlByb2plY3QgRXhwbG9yZXIiPg0KKzx2aWV3U3RhdGUgQ29tbW9uTmF2aWdhdG9yLkxJTktJTkdfRU5BQkxFRD0iMCIgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy53b3JraW5nU2V0cy5zaG93VG9wTGV2ZWxXb3JraW5nU2V0cz0iMCIvPg0KKzwvdmlldz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLmFnZ3JlZ2F0ZSIgcGFydE5hbWU9IkVwaWRlbWljIi8+DQorPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MubW9kZWxzIiBwYXJ0TmFtZT0iTW9kZWxzIi8+DQorPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZGVjb3JhdG9ycyIgcGFydE5hbWU9IkRlY29yYXRvcnMiLz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIgcGFydE5hbWU9IlByb3BlcnRpZXMiLz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMiIHBhcnROYW1lPSJDU1YgTG9nZ2VyIj4NCis8dmlld1N0YXRlLz4NCis8L3ZpZXc+DQorPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZGlzZWFzZXMiIHBhcnROYW1lPSJEaXNlYXNlcyIvPg0KKzx2aWV3IGlkPSJvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MucHJvY2Vzc29yIiBwYXJ0TmFtZT0iUHJvY2Vzc29yIj4NCis8dmlld1N0YXRlLz4NCis8L3ZpZXc+DQorPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3Muc2NlbmFyaW9zIiBwYXJ0TmFtZT0iU2NlbmFyaW9zIj4NCis8dmlld1N0YXRlLz4NCis8L3ZpZXc+DQorPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5lc3RpbWF0b3IiIHBhcnROYW1lPSJFc3RpbWF0b3IiLz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLmNvbXBhcmlzb24iIHBhcnROYW1lPSJTY2VuYXJpb0NvbXBhcmlzb24iLz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy50cmlnZ2VycyIgcGFydE5hbWU9IlRyaWdnZXJzIi8+DQorPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAiIHBhcnROYW1lPSJNYXAiPg0KKzx2aWV3U3RhdGUvPg0KKzwvdmlldz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5yZXBvcnRzIiBwYXJ0TmFtZT0iVGltZSBTZXJpZXMiPg0KKzx2aWV3U3RhdGUvPg0KKzwvdmlldz4NCis8L3ZpZXdzPg0KKzxwZXJzcGVjdGl2ZXMgYWN0aXZlUGFydD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5zY2VuYXJpb3MiIGFjdGl2ZVBlcnNwZWN0aXZlPSJvcmcuZWNsaXBzZS5zdGVtLnVpLlNURU1TaW11bGF0aW9uUGVyc3BlY3RpdmUiPg0KKzxwZXJzcGVjdGl2ZSBlZGl0b3JBcmVhVHJpbVN0YXRlPSIyIiBlZGl0b3JBcmVhVmlzaWJsZT0iMCIgZml4ZWQ9IjAiIHZlcnNpb249IjAuMDE2Ij4NCis8ZGVzY3JpcHRvciBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnBlcnNwZWN0aXZlcy5BbmFseXNpcyIgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy5wZXJzcGVjdGl2ZXMuU1RFTUFuYWx5c2lzUGVyc3BlY3RpdmUiIGxhYmVsPSJBbmFseXNpcyIvPg0KKzxhbHdheXNPbkFjdGlvblNldCBpZD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0LmtleUJpbmRpbmdzIi8+DQorPGFsd2F5c09uQWN0aW9uU2V0IGlkPSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXQub3BlbkZpbGVzIi8+DQorPHNob3dfdmlld19hY3Rpb24gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5wcm9jZXNzb3IiLz4NCis8c2hvd192aWV3X2FjdGlvbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLmVzdGltYXRvciIvPg0KKzxzaG93X3ZpZXdfYWN0aW9uIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuY29tcGFyaXNvbiIvPg0KKzxzaG93X3ZpZXdfYWN0aW9uIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MubHlhcHVub3YiLz4NCis8c2hvd192aWV3X2FjdGlvbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLmFnZ3JlZ2F0ZSIvPg0KKzxwZXJzcGVjdGl2ZV9hY3Rpb24gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy5wZXJzcGVjdGl2ZXMuU1RFTUFuYWx5c2lzUGVyc3BlY3RpdmUiLz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLnByb2Nlc3NvciIvPg0KKzx2aWV3IGlkPSJvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuZXN0aW1hdG9yIi8+DQorPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5jb21wYXJpc29uIi8+DQorPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5seWFwdW5vdiIvPg0KKzx2aWV3IGlkPSJvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuYWdncmVnYXRlIi8+DQorPGZhc3RWaWV3QmFycy8+DQorPGxheW91dD4NCis8bWFpbldpbmRvdz4NCis8aW5mbyBmb2xkZXI9InRydWUiIHBhcnQ9InRvcCI+DQorPGZvbGRlciBhY3RpdmVQYWdlSUQ9Im9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5wcm9jZXNzb3IiIGFwcGVhcmFuY2U9IjIiIGV4cGFuZGVkPSIyIj4NCis8cGFnZSBjb250ZW50PSJvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MucHJvY2Vzc29yIiBsYWJlbD0iUHJvY2Vzc29yIi8+DQorPHBhZ2UgY29udGVudD0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLmVzdGltYXRvciIgbGFiZWw9IkVzdGltYXRvciIvPg0KKzxwYWdlIGNvbnRlbnQ9Im9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5jb21wYXJpc29uIiBsYWJlbD0iU2NlbmFyaW9Db21wYXJpc29uIi8+DQorPHBhZ2UgY29udGVudD0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLmx5YXB1bm92IiBsYWJlbD0iTHlhcHVub3YiLz4NCis8cGFnZSBjb250ZW50PSJvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuYWdncmVnYXRlIiBsYWJlbD0iRXBpZGVtaWMiLz4NCis8cHJlc2VudGF0aW9uIGlkPSJvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLldvcmtiZW5jaFByZXNlbnRhdGlvbkZhY3RvcnkiPg0KKzxwYXJ0IGlkPSIwIi8+DQorPHBhcnQgaWQ9IjEiLz4NCis8cGFydCBpZD0iMiIvPg0KKzxwYXJ0IGlkPSIzIi8+DQorPHBhcnQgaWQ9IjQiLz4NCis8L3ByZXNlbnRhdGlvbj4NCis8L2ZvbGRlcj4NCis8L2luZm8+DQorPGluZm8gZm9sZGVyPSJ0cnVlIiBwYXJ0PSJzdGlja3lGb2xkZXJSaWdodCIgcmF0aW89IjAuNzUiIHJhdGlvTGVmdD0iNzU2IiByYXRpb1JpZ2h0PSIyNTIiIHJlbGF0aW9uc2hpcD0iMiIgcmVsYXRpdmU9InRvcCI+DQorPGZvbGRlciBhcHBlYXJhbmNlPSIyIiBleHBhbmRlZD0iMiI+DQorPHBhZ2UgY29udGVudD0ib3JnLmVjbGlwc2UuaGVscC51aS5IZWxwVmlldyIgbGFiZWw9IkxhYmVsTm90Rm91bmQiLz4NCis8cGFnZSBjb250ZW50PSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pbnRyb3ZpZXciIGxhYmVsPSJMYWJlbE5vdEZvdW5kIi8+DQorPC9mb2xkZXI+DQorPC9pbmZvPg0KKzxpbmZvIHBhcnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnNzIiByYXRpbz0iMC45NDk4MzgxNiIgcmF0aW9MZWZ0PSI1ODciIHJhdGlvUmlnaHQ9IjMxIiByZWxhdGlvbnNoaXA9IjQiIHJlbGF0aXZlPSJ0b3AiLz4NCis8L21haW5XaW5kb3c+DQorPC9sYXlvdXQ+DQorPC9wZXJzcGVjdGl2ZT4NCis8cGVyc3BlY3RpdmUgZWRpdG9yQXJlYVRyaW1TdGF0ZT0iMiIgZWRpdG9yQXJlYVZpc2libGU9IjEiIGZpeGVkPSIwIiB2ZXJzaW9uPSIwLjAxNiI+DQorPGRlc2NyaXB0b3IgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkucGVyc3BlY3RpdmVzLkRlc2lnbmVyIiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5TVEVNRGVzaWduZXJQZXJzcGVjdGl2ZSIgbGFiZWw9IkRlc2lnbmVyIi8+DQorPGFsd2F5c09uQWN0aW9uU2V0IGlkPSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXQua2V5QmluZGluZ3MiLz4NCis8YWx3YXlzT25BY3Rpb25TZXQgaWQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldC5vcGVuRmlsZXMiLz4NCis8c2hvd192aWV3X2FjdGlvbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5zaW11bGF0aW9uY29udHJvbHZpZXciLz4NCis8c2hvd192aWV3X2FjdGlvbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5ncmFwaHMiLz4NCis8c2hvd192aWV3X2FjdGlvbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5tb2RlbHMiLz4NCis8c2hvd192aWV3X2FjdGlvbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5zY2VuYXJpb3MiLz4NCis8c2hvd192aWV3X2FjdGlvbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5zZXF1ZW5jZXJzIi8+DQorPHNob3dfdmlld19hY3Rpb24gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZGVjb3JhdG9ycyIvPg0KKzxzaG93X3ZpZXdfYWN0aW9uIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnRyaWdnZXJzIi8+DQorPHNob3dfdmlld19hY3Rpb24gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MucHJlZGljYXRlcyIvPg0KKzxzaG93X3ZpZXdfYWN0aW9uIGlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIi8+DQorPHNob3dfdmlld19hY3Rpb24gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZGlzZWFzZXMiLz4NCis8bmV3X3dpemFyZF9hY3Rpb24gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5uZXdzdGVtcHJvamVjdCIvPg0KKzxwZXJzcGVjdGl2ZV9hY3Rpb24gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuU1RFTURlc2lnbmVyUGVyc3BlY3RpdmUiLz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciIvPg0KKzx2aWV3IGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnNjZW5hcmlvcyIvPg0KKzx2aWV3IGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLm1vZGVscyIvPg0KKzx2aWV3IGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdyYXBocyIvPg0KKzx2aWV3IGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnRyaWdnZXJzIi8+DQorPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MucHJlZGljYXRlcyIvPg0KKzx2aWV3IGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnNlcXVlbmNlcnMiLz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5kZWNvcmF0b3JzIi8+DQorPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiLz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MuVGFza0xpc3QiLz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2UucGRlLnJ1bnRpbWUuTG9nVmlldyIvPg0KKzx2aWV3IGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmRpc2Vhc2VzIi8+DQorPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLkNvbnRlbnRPdXRsaW5lIi8+DQorPGZhc3RWaWV3QmFycy8+DQorPGxheW91dD4NCis8bWFpbldpbmRvdz4NCis8aW5mbyBmb2xkZXI9InRydWUiIHBhcnQ9ImxlZnQiPg0KKzxmb2xkZXIgYWN0aXZlUGFnZUlEPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIiBhcHBlYXJhbmNlPSIyIiBleHBhbmRlZD0iMiI+DQorPHBhZ2UgY29udGVudD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciIgbGFiZWw9IlByb2plY3QgRXhwbG9yZXIiLz4NCis8cHJlc2VudGF0aW9uIGlkPSJvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLldvcmtiZW5jaFByZXNlbnRhdGlvbkZhY3RvcnkiPg0KKzxwYXJ0IGlkPSIwIi8+DQorPC9wcmVzZW50YXRpb24+DQorPC9mb2xkZXI+DQorPC9pbmZvPg0KKzxpbmZvIGZvbGRlcj0idHJ1ZSIgcGFydD0ic3RpY2t5Rm9sZGVyUmlnaHQiIHJhdGlvPSIwLjc1IiByYXRpb0xlZnQ9Ijc1NiIgcmF0aW9SaWdodD0iMjUyIiByZWxhdGlvbnNoaXA9IjIiIHJlbGF0aXZlPSJsZWZ0Ij4NCis8Zm9sZGVyIGFwcGVhcmFuY2U9IjIiIGV4cGFuZGVkPSIyIj4NCis8cGFnZSBjb250ZW50PSJvcmcuZWNsaXBzZS5oZWxwLnVpLkhlbHBWaWV3IiBsYWJlbD0iTGFiZWxOb3RGb3VuZCIvPg0KKzxwYWdlIGNvbnRlbnQ9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmludHJvdmlldyIgbGFiZWw9IkxhYmVsTm90Rm91bmQiLz4NCis8L2ZvbGRlcj4NCis8L2luZm8+DQorPGluZm8gcGFydD0ib3JnLmVjbGlwc2UudWkuZWRpdG9yc3MiIHJhdGlvPSIwLjI1IiByYXRpb0xlZnQ9IjI1MiIgcmF0aW9SaWdodD0iNzU2IiByZWxhdGlvbnNoaXA9IjIiIHJlbGF0aXZlPSJsZWZ0Ii8+DQorPGluZm8gZm9sZGVyPSJ0cnVlIiBwYXJ0PSJib3R0b20iIHJhdGlvPSIwLjY1ODU3NjEiIHJhdGlvTGVmdD0iNDA3IiByYXRpb1JpZ2h0PSIyMTEiIHJlbGF0aW9uc2hpcD0iNCIgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnNzIj4NCis8Zm9sZGVyIGFjdGl2ZVBhZ2VJRD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5zY2VuYXJpb3MiIGFwcGVhcmFuY2U9IjIiIGV4cGFuZGVkPSIyIj4NCis8cGFnZSBjb250ZW50PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnNjZW5hcmlvcyIgbGFiZWw9IlNjZW5hcmlvcyIvPg0KKzxwYWdlIGNvbnRlbnQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MubW9kZWxzIiBsYWJlbD0iTW9kZWxzIi8+DQorPHBhZ2UgY29udGVudD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5ncmFwaHMiIGxhYmVsPSJHcmFwaHMiLz4NCis8cGFnZSBjb250ZW50PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnRyaWdnZXJzIiBsYWJlbD0iVHJpZ2dlcnMiLz4NCis8cGFnZSBjb250ZW50PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnByZWRpY2F0ZXMiIGxhYmVsPSJQcmVkaWNhdGVzIi8+DQorPHBhZ2UgY29udGVudD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5zZXF1ZW5jZXJzIiBsYWJlbD0iU2VxdWVuY2VycyIvPg0KKzxwYWdlIGNvbnRlbnQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZGVjb3JhdG9ycyIgbGFiZWw9IkRlY29yYXRvcnMiLz4NCis8cGFnZSBjb250ZW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0IiBsYWJlbD0iUHJvcGVydGllcyIvPg0KKzxwYWdlIGNvbnRlbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlRhc2tMaXN0IiBsYWJlbD0iVGFza3MiLz4NCis8cGFnZSBjb250ZW50PSJvcmcuZWNsaXBzZS5wZGUucnVudGltZS5Mb2dWaWV3IiBsYWJlbD0iRXJyb3IgTG9nIi8+DQorPHBhZ2UgY29udGVudD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5kaXNlYXNlcyIgbGFiZWw9IkRpc2Vhc2VzIi8+DQorPHBhZ2UgY29udGVudD0ib3JnLmVjbGlwc2UudWkudmlld3MuUHJvYmxlbVZpZXciIGxhYmVsPSJMYWJlbE5vdEZvdW5kIi8+DQorPHByZXNlbnRhdGlvbiBpZD0ib3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5Xb3JrYmVuY2hQcmVzZW50YXRpb25GYWN0b3J5Ij4NCis8cGFydCBpZD0iMCIvPg0KKzxwYXJ0IGlkPSIxIi8+DQorPHBhcnQgaWQ9IjIiLz4NCis8cGFydCBpZD0iMyIvPg0KKzxwYXJ0IGlkPSI0Ii8+DQorPHBhcnQgaWQ9IjUiLz4NCis8cGFydCBpZD0iNiIvPg0KKzxwYXJ0IGlkPSI3Ii8+DQorPHBhcnQgaWQ9IjgiLz4NCis8cGFydCBpZD0iOSIvPg0KKzxwYXJ0IGlkPSIxMCIvPg0KKzwvcHJlc2VudGF0aW9uPg0KKzwvZm9sZGVyPg0KKzwvaW5mbz4NCis8aW5mbyBmb2xkZXI9InRydWUiIHBhcnQ9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLlZpZXdTdGFja0AxMjgwYzg1IiByYXRpbz0iMC43NSIgcmF0aW9MZWZ0PSI1NjciIHJhdGlvUmlnaHQ9IjE4OSIgcmVsYXRpb25zaGlwPSIyIiByZWxhdGl2ZT0ib3JnLmVjbGlwc2UudWkuZWRpdG9yc3MiPg0KKzxmb2xkZXIgYWN0aXZlUGFnZUlEPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Db250ZW50T3V0bGluZSIgYXBwZWFyYW5jZT0iMiIgZXhwYW5kZWQ9IjIiPg0KKzxwYWdlIGNvbnRlbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLkNvbnRlbnRPdXRsaW5lIiBsYWJlbD0iT3V0bGluZSIvPg0KKzxwcmVzZW50YXRpb24gaWQ9Im9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuV29ya2JlbmNoUHJlc2VudGF0aW9uRmFjdG9yeSI+DQorPHBhcnQgaWQ9IjAiLz4NCis8L3ByZXNlbnRhdGlvbj4NCis8L2ZvbGRlcj4NCis8L2luZm8+DQorPC9tYWluV2luZG93Pg0KKzwvbGF5b3V0Pg0KKzwvcGVyc3BlY3RpdmU+DQorPHBlcnNwZWN0aXZlIGVkaXRvckFyZWFUcmltU3RhdGU9IjIiIGVkaXRvckFyZWFWaXNpYmxlPSIwIiBmaXhlZD0iMCIgdmVyc2lvbj0iMC4wMTYiPg0KKzxkZXNjcmlwdG9yIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnBlcnNwZWN0aXZlcy5TaW11bGF0aW9uIiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5TVEVNU2ltdWxhdGlvblBlcnNwZWN0aXZlIiBsYWJlbD0iU2ltdWxhdGlvbiIvPg0KKzxhbHdheXNPbkFjdGlvblNldCBpZD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0LmtleUJpbmRpbmdzIi8+DQorPGFsd2F5c09uQWN0aW9uU2V0IGlkPSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXQub3BlbkZpbGVzIi8+DQorPHNob3dfdmlld19hY3Rpb24gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3Muc2ltdWxhdGlvbmNvbnRyb2x2aWV3Ii8+DQorPHNob3dfdmlld19hY3Rpb24gaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb2dyZXNzVmlldyIvPg0KKzxzaG93X3ZpZXdfYWN0aW9uIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnNjZW5hcmlvcyIvPg0KKzxzaG93X3ZpZXdfYWN0aW9uIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmFjdGl2ZXNpbXVsYXRpb25zIi8+DQorPHNob3dfdmlld19hY3Rpb24gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuYWN0aXZlYmF0Y2hlcyIvPg0KKzxzaG93X3ZpZXdfYWN0aW9uIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwIi8+DQorPHNob3dfdmlld19hY3Rpb24gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2UiLz4NCis8c2hvd192aWV3X2FjdGlvbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5yZXBvcnRzIi8+DQorPHNob3dfdmlld19hY3Rpb24gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MucmVwb3J0cy5waGFzZVNwYWNlIi8+DQorPHBlcnNwZWN0aXZlX2FjdGlvbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5TVEVNU2ltdWxhdGlvblBlcnNwZWN0aXZlIi8+DQorPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAiLz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5zaW11bGF0aW9uY29udHJvbHZpZXciLz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2UucGRlLnJ1bnRpbWUuTG9nVmlldyIvPg0KKzx2aWV3IGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnJlcG9ydHMucGhhc2VTcGFjZSIvPg0KKzx2aWV3IGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnJlcG9ydHMiLz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMiLz4NCis8dmlldyBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciIvPg0KKzx2aWV3IGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnNjZW5hcmlvcyIvPg0KKzxmYXN0Vmlld0JhcnMvPg0KKzx2aWV3TGF5b3V0UmVjIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwIiBzaG93VGl0bGU9InRydWUiIHN0YW5kYWxvbmU9InRydWUiLz4NCis8bGF5b3V0Pg0KKzxtYWluV2luZG93Pg0KKzxpbmZvIHBhcnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnNzIi8+DQorPGluZm8gZm9sZGVyPSJ0cnVlIiBwYXJ0PSJzdGlja3lGb2xkZXJSaWdodCIgcmF0aW89IjAuNzUiIHJhdGlvTGVmdD0iNzU2IiByYXRpb1JpZ2h0PSIyNTIiIHJlbGF0aW9uc2hpcD0iMiIgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnNzIj4NCis8Zm9sZGVyIGFwcGVhcmFuY2U9IjIiIGV4cGFuZGVkPSIyIj4NCis8cGFnZSBjb250ZW50PSJvcmcuZWNsaXBzZS5oZWxwLnVpLkhlbHBWaWV3IiBsYWJlbD0iTGFiZWxOb3RGb3VuZCIvPg0KKzxwYWdlIGNvbnRlbnQ9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmludHJvdmlldyIgbGFiZWw9IkxhYmVsTm90Rm91bmQiLz4NCis8L2ZvbGRlcj4NCis8L2luZm8+DQorPGluZm8gZm9sZGVyPSJ0cnVlIiBwYXJ0PSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5WaWV3U3RhY2tANjc1MDM5IiByYXRpbz0iMC4wNDk2MDMxNzUiIHJhdGlvTGVmdD0iNTAiIHJhdGlvUmlnaHQ9Ijk1OCIgcmVsYXRpb25zaGlwPSIyIiByZWxhdGl2ZT0ib3JnLmVjbGlwc2UudWkuZWRpdG9yc3MiPg0KKzxmb2xkZXIgYWN0aXZlUGFnZUlEPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnNjZW5hcmlvcyIgYXBwZWFyYW5jZT0iMiIgZXhwYW5kZWQ9IjIiPg0KKzxwYWdlIGNvbnRlbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiIGxhYmVsPSJQcm9qZWN0IEV4cGxvcmVyIi8+DQorPHBhZ2UgY29udGVudD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5zY2VuYXJpb3MiIGxhYmVsPSJTY2VuYXJpb3MiLz4NCis8cHJlc2VudGF0aW9uIGlkPSJvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLldvcmtiZW5jaFByZXNlbnRhdGlvbkZhY3RvcnkiPg0KKzxwYXJ0IGlkPSIwIi8+DQorPHBhcnQgaWQ9IjEiLz4NCis8L3ByZXNlbnRhdGlvbj4NCis8L2ZvbGRlcj4NCis8L2luZm8+DQorPGluZm8gZm9sZGVyPSJ0cnVlIiBwYXJ0PSJsZWZ0IiByYXRpbz0iMC41OTkwMzM4MyIgcmF0aW9MZWZ0PSIzNzIiIHJhdGlvUmlnaHQ9IjI0OSIgcmVsYXRpb25zaGlwPSI0IiByZWxhdGl2ZT0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuVmlld1N0YWNrQDY3NTAzOSI+DQorPGZvbGRlciBhY3RpdmVQYWdlSUQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3Muc2ltdWxhdGlvbmNvbnRyb2x2aWV3IiBhcHBlYXJhbmNlPSIyIiBleHBhbmRlZD0iMiI+DQorPHBhZ2UgY29udGVudD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5zaW11bGF0aW9uY29udHJvbHZpZXciIGxhYmVsPSJTaW11bGF0aW9uIENvbnRyb2wiLz4NCis8cHJlc2VudGF0aW9uIGlkPSJvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLldvcmtiZW5jaFByZXNlbnRhdGlvbkZhY3RvcnkiPg0KKzxwYXJ0IGlkPSIwIi8+DQorPC9wcmVzZW50YXRpb24+DQorPC9mb2xkZXI+DQorPC9pbmZvPg0KKzxpbmZvIGZvbGRlcj0idHJ1ZSIgcGFydD0iYm90dG9tIiByYXRpbz0iMC4yOTk1ODI0NSIgcmF0aW9MZWZ0PSIyODciIHJhdGlvUmlnaHQ9IjY3MSIgcmVsYXRpb25zaGlwPSIyIiByZWxhdGl2ZT0ibGVmdCI+DQorPGZvbGRlciBhY3RpdmVQYWdlSUQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MucmVwb3J0cyIgYXBwZWFyYW5jZT0iMiIgZXhwYW5kZWQ9IjIiPg0KKzxwYWdlIGNvbnRlbnQ9Im9yZy5lY2xpcHNlLnBkZS5ydW50aW1lLkxvZ1ZpZXciIGxhYmVsPSJFcnJvciBMb2ciLz4NCis8cGFnZSBjb250ZW50PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnJlcG9ydHMucGhhc2VTcGFjZSIgbGFiZWw9IlBoYXNlIFNwYWNlIi8+DQorPHBhZ2UgY29udGVudD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5yZXBvcnRzIiBsYWJlbD0iVGltZSBTZXJpZXMiLz4NCis8cGFnZSBjb250ZW50PSJvcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2VycyIgbGFiZWw9IkNTViBMb2dnZXIiLz4NCis8cHJlc2VudGF0aW9uIGlkPSJvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLldvcmtiZW5jaFByZXNlbnRhdGlvbkZhY3RvcnkiPg0KKzxwYXJ0IGlkPSIyIi8+DQorPHBhcnQgaWQ9IjEiLz4NCis8cGFydCBpZD0iMyIvPg0KKzxwYXJ0IGlkPSIwIi8+DQorPC9wcmVzZW50YXRpb24+DQorPC9mb2xkZXI+DQorPC9pbmZvPg0KKzxpbmZvIGZvbGRlcj0idHJ1ZSIgcGFydD0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuVmlld1N0YWNrQDEzZjU4NDEiIHJhdGlvPSIwLjI5OTUwMjUiIHJhdGlvTGVmdD0iMzAxIiByYXRpb1JpZ2h0PSI3MDQiIHJlbGF0aW9uc2hpcD0iMiIgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLlZpZXdTdGFja0A2NzUwMzkiPg0KKzxmb2xkZXIgYWN0aXZlUGFnZUlEPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwIiBhcHBlYXJhbmNlPSIzIiBleHBhbmRlZD0iMiI+DQorPHBhZ2UgY29udGVudD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcCIgbGFiZWw9Ik1hcCIvPg0KKzxwcmVzZW50YXRpb24gaWQ9Im9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMuV29ya2JlbmNoUHJlc2VudGF0aW9uRmFjdG9yeSI+DQorPHBhcnQgaWQ9IjAiLz4NCis8L3ByZXNlbnRhdGlvbj4NCis8L2ZvbGRlcj4NCis8L2luZm8+DQorPC9tYWluV2luZG93Pg0KKzwvbGF5b3V0Pg0KKzwvcGVyc3BlY3RpdmU+DQorPC9wZXJzcGVjdGl2ZXM+DQorPHdvcmtpbmdTZXRzLz4NCis8bmF2aWdhdGlvbkhpc3RvcnkvPg0KKzxpbnB1dCBmYWN0b3J5SUQ9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLm1vZGVsLlJlc291cmNlRmFjdG9yeSIgcGF0aD0iLyIgdHlwZT0iOCIvPg0KKzwvcGFnZT4NCis8d29ya2JlbmNoV2luZG93QWR2aXNvci8+DQorPGFjdGlvbkJhckFkdmlzb3IvPg0KKzx0cmltTGF5b3V0Pg0KKzx0cmltQXJlYSBJTWVtZW50by5pbnRlcm5hbC5pZD0iMTI4Ij4NCis8dHJpbUl0ZW0gSU1lbWVudG8uaW50ZXJuYWwuaWQ9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFdpbmRvdy50b3BCYXIiLz4NCis8L3RyaW1BcmVhPg0KKzx0cmltQXJlYSBJTWVtZW50by5pbnRlcm5hbC5pZD0iMTAyNCI+DQorPHRyaW1JdGVtIElNZW1lbnRvLmludGVybmFsLmlkPSJvcmcuZWNsaXNlLnVpLmludGVybmFsLkZhc3RWaWV3QmFyIi8+DQorPHRyaW1JdGVtIElNZW1lbnRvLmludGVybmFsLmlkPSJvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3RhdHVzTGluZU1hbmFnZXIiLz4NCis8dHJpbUl0ZW0gSU1lbWVudG8uaW50ZXJuYWwuaWQ9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByb2dyZXNzLlByb2dyZXNzUmVnaW9uIi8+DQorPC90cmltQXJlYT4NCis8L3RyaW1MYXlvdXQ+DQorPC93aW5kb3c+DQorPG1ydUxpc3QvPg0KKzwvd29ya2JlbmNoPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGU4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzdjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLnNhbXBsZTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiYzczZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDU3IEBACisjTW9uIEphbiAyMSAxMjo0Mzo1NiBFU1QgMjAwOAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS5zYW1wbGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1NmQxMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMTUgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLnNhbXBsZTtzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlLkFjdGl2YXRvcgorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLAorIG9yZy5qdW5pdCwKKyBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uuc3RlbS5zYW1wbGUsCisgb3JnLmVjbGlwc2Uuc3RlbS5zYW1wbGUuYWRhcHRpb24KK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zYW1wbGUvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczOTcyZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSw4IEBACitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLworYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIC4sXAorICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICBub3RpY2UuaHRtbCxcCisgICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlL2VwbC12MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDRiMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zYW1wbGUvZXBsLXYxMC5odG1sCkBAIC0wLDAgKzEsMzI4IEBACis8aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCit4bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoreG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgorPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgorPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Cis8bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Cis8bGluayByZWw9RmlsZS1MaXN0CitocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KKzx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgorPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+CisgPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgorICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgorICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+CisgIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KKyAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KKyAgPG86UGFnZXM+NDwvbzpQYWdlcz4KKyAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KKyAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+CisgICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KKyAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgorICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KKyAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KKyA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgorPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+CisgPHc6V29yZERvY3VtZW50PgorICA8dzpUcmFja1JldmlzaW9ucy8+CisgPC93OldvcmREb2N1bWVudD4KKzwveG1sPjwhW2VuZGlmXS0tPgorPHN0eWxlPgorPCEtLQorIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KK0Bmb250LWZhY2UKKwl7Zm9udC1mYW1pbHk6VGFob21hOworCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OworCW1zby1mb250LWNoYXJzZXQ6MDsKKwltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKKwltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKKwltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KKyAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLworcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAorCXttc28tc3R5bGUtcGFyZW50OiIiOworCW1hcmdpbjowaW47CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AKKwl7bWFyZ2luLXJpZ2h0OjBpbjsKKwltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKKwltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKKwltYXJnaW4tbGVmdDowaW47CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAorCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjguMHB0OworCWZvbnQtZmFtaWx5OlRhaG9tYTsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitAcGFnZSBTZWN0aW9uMQorCXtzaXplOjguNWluIDExLjBpbjsKKwltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKKwltc28taGVhZGVyLW1hcmdpbjouNWluOworCW1zby1mb290ZXItbWFyZ2luOi41aW47CisJbXNvLXBhcGVyLXNvdXJjZTowO30KK2Rpdi5TZWN0aW9uMQorCXtwYWdlOlNlY3Rpb24xO30KKy0tPgorPC9zdHlsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgorCis8ZGl2IGNsYXNzPVNlY3Rpb24xPgorCis8cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Cis8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKK1RIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCitSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKK09GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgorZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgorYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCitjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKK2FkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQorc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAorYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCitpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgorc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCitQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KK3dpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKK3dvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgorZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAorY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKK29yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCitkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobworcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQorU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKK2Egbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgorc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKK2Rpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCitDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKK2Zvcm0uPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKK1JlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCitwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0CithbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKK2NvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCitvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAorYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KK3RvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KK2FueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKK2xpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKK1JlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKK0NvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCit0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5CityaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKK2ZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKK2xpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Cit0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAoraWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQordGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQorZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCitFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAorcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgordGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KKzwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2l0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQoraXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCitlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCitjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCithbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQorYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKK2VmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCitpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCithcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKK3N0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKK0NvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKK3N0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKK2luZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKK2NvZGUgZm9ybTo8L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2l0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCitjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Citjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKK29yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCitzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5CithY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCithbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQorb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCitsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQorUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAorQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKK0NvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAorY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgorbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KK3RoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KK2Nvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0CitvZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKK3JlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgordG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgordG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKK2FueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCitpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQorUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQorQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKK2NsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKK3dhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCitzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKK290aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKK2NvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAorV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKK3Jlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCitQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCitBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCitjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgorZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKK0FHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKK05FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCitUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCitUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAorb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKK2VuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAorZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKK21pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCithZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCithbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCitvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKK1JlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKK3N1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKK3NoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCitjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKK3BlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCityaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCitSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKK1JlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCitjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKK2NvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAorU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCit0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwordGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAorQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KK3NlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgorb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KKyhpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKK2luIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KK3RoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCitleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90CitleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKK1N0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKK0FtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcworQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcworaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+CisKKzwvZGl2PgorCis8L2JvZHk+CisKKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS9ub3RpY2UuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlL25vdGljZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YWY5NjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS9ub3RpY2UuaHRtbApAQCAtMCwwICsxLDc5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Cis8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPk1hcmNoIDE3LCAyMDA1PC9wPgorCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisKKzxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKyAgIAorPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAorICAgCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKKyAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorICAgCis8dWw+CisJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKzwvdWw+ICAgCisgCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKworPHVsPgorCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKwkJCis8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCitpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KK3RoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KKwk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCisJPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKwk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCis8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKworPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKyAgIAorPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMzUzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDM2IEBACisjLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgVG8gY29kZSBkZXZlbG9wZXI6CisjICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCisjICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KKyMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKKyMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworcGx1Z2luTmFtZSA9IFNURU0gU2FtcGxlIE1vZGVsCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZworCisjIFZpZXcgMQordjFOYW1lID0gVmlldyBFeGFtcGxlIDEKK3YyTmFtZSA9IFJlbGF0aXZlIFZhbHVlIFZpZXcgRXhhbXBsZQordjNOYW1lID0gVXRpbGl0eSBWaWV3CisKKworIyBDYXRlZ29yaWVzCitfVUlfU2FtcGxlX0NhdGVnb3J5ID0gU2FtcGxlCisKKyMgR3JhcGggQ2F0ZWdvcmllcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zYW1wbGUvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4NDIzYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlL3BsdWdpbi54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KKzxwbHVnaW4+CisgICAKKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+CisgICAgICA8dmlldworICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5zYW1wbGUuYWRhcHRpb24uVmlld0V4YW1wbGUxIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlLmFkYXB0ZXIudmlld2V4YW1wbGUxIgorICAgICAgICAgICAgbmFtZT0iJXYxTmFtZSIvPgorICAgICAgPHZpZXcKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlLmFkYXB0aW9uLlJlbGF0aXZlVmFsdWVWaWV3RXhhbXBsZSIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS5hZGFwdGVyLnJlbGF0aXZldmFsdWV2aWV3ZXhhbXBsZSIKKyAgICAgICAgICAgIG5hbWU9IiV2Mk5hbWUiLz4KKyAgICAgIDx2aWV3CisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS5VdGlsaXR5VmlldyIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS51dGlsaXR5dmlldyIKKyAgICAgICAgICAgIG5hbWU9IiV2M05hbWUiLz4KKyAgIDwvZXh0ZW5zaW9uPgorCis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NhbXBsZS9BY3RpdmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NhbXBsZS9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTRjODM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zYW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc2FtcGxlL0FjdGl2YXRvci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5zYW1wbGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CisKKy8qKgorICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKKworCQorCS8qKgorCSAqIFRoZSBwbHVnLWluIElECisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlIjsKKworCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKKwlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOworCQorCS8qKgorCSAqIFRoZSBjb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBBY3RpdmF0b3IoKSB7CisJCXBsdWdpbiA9IHRoaXM7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdGFydChjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICovCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlwbHVnaW4gPSBudWxsOworCQlzdXBlci5zdG9wKGNvbnRleHQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQorCSAqCisJICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKK30gLy8gQWN0aXZhdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zYW1wbGUvVXRpbGl0eVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NhbXBsZS9VdGlsaXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjFkNjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zYW1wbGUvVXRpbGl0eVRlc3QuamF2YQpAQCAtMCwwICsxLDk5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmcuU2VnbWVudDsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgVXRpbGl0eVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgTGF0TG9uZyBwb2x5Z29uMSA9bnVsbDsKKyAgICBMYXRMb25nIHBvbHlnb24yID1udWxsOworICAgIExhdExvbmcgcG9seWdvbjMgPW51bGw7CisgICAgTGF0TG9uZyBwb2x5Z29uNCA9bnVsbDsKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCQorCQlkb3VibGVbXVtdIGQxID0ge3swLjAsIDAuMH0sCisJCQkJezEwLjAsIDAuMH0sCisJCQkJezEwLjAsIDEwLjB9LAorCQkJCXswLjAsIDEwLjB9LAorCQkJCXswLjAsIDAuMH0gfTsKKwkJU2VnbWVudCBzMSA9IG5ldyBTZWdtZW50KGQxKTsKKwkJcG9seWdvbjEgPSBuZXcgTGF0TG9uZygpOworCQlwb2x5Z29uMS5hZGQoczEpOworCQkKKwkJZG91YmxlW11bXSBkMiA9IHt7MTAuMCwgMC4wfSwKKwkJCQl7MTAuMCwgMjAuMH0sCisJCQkJezIwLjAsIDAuMH0sCisJCQkJezEwLjAsIDAuMH0gfTsKKwkJU2VnbWVudCBzMiA9IG5ldyBTZWdtZW50KGQyKTsKKwkJcG9seWdvbjIgPSBuZXcgTGF0TG9uZygpOworCQlwb2x5Z29uMi5hZGQoczIpOworCQkKKwkJZG91YmxlW11bXSBkMyA9IHt7MjAuMCwgMC4wfSwKKwkJCQl7MjAuMCwgMjAuMH0sCisJCQkJezQwLjAsIDAuMH0sCisJCQkJezIwLjAsIDAuMH0gfTsKKwkJU2VnbWVudCBzMyA9IG5ldyBTZWdtZW50KGQzKTsKKwkJcG9seWdvbjMgPSBuZXcgTGF0TG9uZygpOworCQlwb2x5Z29uMy5hZGQoczMpOworCQkKKwkJZG91YmxlW11bXSBkNGEgPSB7ey0yMC4wLCAwLjB9LAorCQkJCXstMjAuMCwgLTEwLjB9LAorCQkJCXstNDAuMCwgLTEwLjB9LAorCQkJCXstMjAuMCwgLTEwLjB9LAorCQkJCXstMjAuMCwgMC4wfSB9OworCQlTZWdtZW50IHM0YSA9IG5ldyBTZWdtZW50KGQ0YSk7CisJCXBvbHlnb240ID0gbmV3IExhdExvbmcoKTsKKwkJcG9seWdvbjQuYWRkKHM0YSk7CisJCWRvdWJsZVtdW10gZDRiID0ge3swMC4wLCAwLjB9LAorCQkJCXstMjAuMCwgMC4wfSwKKwkJCQl7LTIwLjAsIC0yMC4wfSwKKwkJCQl7MC4wLCAtMjAuMH0sCisJCQkJezAuMCwgMC4wfSB9OworCQlTZWdtZW50IHM0YiA9IG5ldyBTZWdtZW50KGQ0Yik7CQkKKwkJcG9seWdvbjQuYWRkKHM0Yik7CisJCQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICovCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIudGVhckRvd24oKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IgCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlLlV0aWxpdHkjc2V0QkJveChTdHJpbmcsIExhdExvbmcpfS4KKwkgKi8KKy8vCXB1YmxpYyB2b2lkIHRlc3RHZXRCQm94TGF0TG9uZygpIHsKKy8vCQlNYXA8U3RyaW5nLFJlY3RhbmdsZVtdPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsUmVjdGFuZ2xlW10+KCk7CisvLwkJTmVpZ2hib3JVdGlsaXR5LnNldEJCb3gobWFwLCJUZXN0MyIscG9seWdvbjMpOworLy8JCU5laWdoYm9yVXRpbGl0eS5zZXRCQm94KG1hcCwiVGVzdDEiLHBvbHlnb24xKTsKKy8vCQlOZWlnaGJvclV0aWxpdHkuc2V0QkJveChtYXAsIlRlc3Q0Iixwb2x5Z29uNCk7CisvLwkJTmVpZ2hib3JVdGlsaXR5LnNldEJCb3gobWFwLCJUZXN0MiIscG9seWdvbjIpOworLy8JCUxpc3QgbGlzdCA9IE5laWdoYm9yVXRpbGl0eS5wcm9jZXNzQkJveChtYXApOworLy8JICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGxpc3QpOworLy8JICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobGlzdC5zaXplKCksMyk7CisvLwkJCisvLwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NhbXBsZS9VdGlsaXR5Vmlldy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5zYW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc2FtcGxlL1V0aWxpdHlWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY4ZTgxNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NhbXBsZS9VdGlsaXR5Vmlldy5qYXZhCkBAIC0wLDAgKzEsNDYzIEBACisvLyBVdGlsaXR5Vmlldy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZ1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nLlNlZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gcnVuIEdVSSBjb2RlIGluIEVjbGlwc2UgYW5kIG1vbml0b3IgdGhlCisgKiAic2VsZWN0ZWQiIHNpbXVsYXRpb24sIGFuZCBob3cgdG8gZXh0cmFjdCB0aGUgY2Fub25pY2FsIGdyYXBoIGZyb20gdGhlCisgKiBzZWxlY3RlZCBzaW11bGF0aW9uIGFuZCB0aGVuIGV4dHJhY3QgZGF0YSBmcm9tIGl0LgorICogPHA+CisgKiBJdCBjcmVhdHMgYW4gRWNsaXBzZSAiVmlldyIgY2FsbGVkICJWaWV3IEV4YW1wbGUxIiB0aGF0IHNpbXBseSAiZHVtcHMiIHRoZQorICogbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBkYXRhIGV4dHJhY3RlZCBmcm9tIHRoZSBjYW5vbmljYWwgZ3JhcGggdG8gdGhlIHZpZXcncworICogd2luZG93LiBUaGUgZXhhbXBsZSBpcyBzaW1wbGUsIGJ1dCBpdCBoZWxwcyB0byB1bmRlcnN0YW5kIGhvdyBhIEpGYWNlCisgKiAiVmlld2VyIiAobm90IHRoZSBzYW1lIGFzIGFuIEVjbGlwc2UgIlZpZXciKSB3b3JrcyB3aXRoIGNvbnRlbnQgYW5kIGxhYmVsCisgKiBwcm92aWRlcnMuCisgKiA8cD4KKyAqIFRoZXJlIGFyZSB0aHJlZSBjbGFzc2VzIGRlZmluZWQgaW4gdGhpcyBleGFtcGxlLiBUaGUgZmlyc3QgaXMgdGhlIHBhcmVudAorICogY2xhc3MgdGhhdCBpcyBhIDxjb2RlPlZpZXdQYXJ0PC9jb2RlPiBhbmQgaW1wbGVtZW50cyB3aGF0IGlzIHNlZW4gaW4gdGhlCisgKiB2aWV3J3Mgd2luZG93IGluIEVjbGlwc2UuIEl0IGNvbnRhaW5zIGEgSkZhY2UgPGNvZGU+TGlzdFZpZXdlcjwvY29kZT4gd2hpY2gKKyAqIGJhc2ljYWxseSBtYWludGFpbnMgYSBsaXN0IG9mIE9iamVjdHMgYW5kIGNyZWF0ZXMgYSBkaXNwbGF5IHRoYXQgcHJpbnRzIGEKKyAqIGRlc2NyaXB0aXZlIHRleHQgc3RyaW5nIGZvciBlYWNoIG9uZS4gVGhlIG1ldGhvZAorICogPGNvZGU+Y3JlYXRlUGFydENvbnRyb2w8L2NvZGU+IGlzIHRoZSBjb2RlIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIFNXVAorICogZ3JhcGhpY3MgZm9yIHRoZSBkaXNwbGF5IG9mIHRoZSB2aWV3LiBJdCBpcyBwYXNzZWQgYW4gU1dUCisgKiA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IGluc3RhbmNlIGNhbGxlZCA8Y29kZT5wYXJlbnQ8L2NvZGU+IHRoYXQgaXMgdXNlZAorICogdG8gImNvbnRhaW4iIHRoZSBTV1QvSkZhY2UgZWxlbWVudHMgb2YgdGhlIHZpZXcncyB0aGF0IG1ha2UgdXAgdGhlIGRpc3BsYXkgaW4KKyAqIHRoZSB2aWV3LiBUaGUgbWV0aG9kIGRvZXMgdGhyZWUgdGhpbmdzLCBpdCBmaXJzdCBjcmVhdGVzIHRoZQorICogPGNvZGU+TGlzdFZpZXdlcjwvY29kZT4gaW5zdGFuY2UsIGdpdmluZyB0aGUgcGFyZW50IGFzIGFuIGFyZ3VtZW50IHRvIHRoZQorICogY29uc3RydWN0ZXIgKHRoaXMgbWFrZXMgaXQgcGFydCBvZiB0aGUgZGlzcGxheSksIGl0IHRoZW4gY3JlYXRlcyBhbmQgcGFzc2VzCisgKiB0byB0aGUgPGNvZGU+TGlzdFZpZXdlcjwvY29kZT4gdGhlICJDb250ZW50IiBhbmQgIkxhYmVsIiBwcm92aWRlcnMgaXQKKyAqIG5lZWRzLiBUaGUgQ29udGVudCBhbmQgTGFiZWwgcHJvdmlkZXJzIGFyZSB0aGUgb3RoZXIgdHdvIGNsYXNzZXMgaW4gdGhpcworICogZXhhbXBsZS4KKyAqIDxwPgorICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgY2xhc3MgaXMge0BsaW5rIFV0aWxpdHlWaWV3Q29udGVudFByb3ZpZGVyfSwgd2hpbGUgbm90CisgKiBjb21wbGV4LCBpdCBtYXkgbm90IGJlIG9idmlvdXMgd2hhdCdzIGl0J3MgZG9pbmcuIEl0J3Mgam9iIGlzIHRvIG1haW50YWluIHRoZQorICogY29udGVudHMgb2YgdGhlIDxjb2RlPkxpc3RWaWV3ZXI8L2NvZGU+J3MgaW50ZXJuYWwgbGlzdCBvZiB0aGluZ3MgdG8KKyAqIGRpc3BsYXkuIEl0IHBlcmZvcm1zIHRoZSAiQ29udHJvbGVyIiBqb2IgaW4gYW4gIk1WQyIgYXJjaGl0ZWN0dXJlLiBJbiBvdXIKKyAqIGV4YW1wbGUsIHRoZSBjb250ZW50IHByb3ZpZGVyIGlzIGFuIHtAbGluayBJU2VsZWN0aW9uTGlzdGVuZXJ9IHdoaWNoIG1lYW5zIGl0CisgKiBoYXMgYSA8Y29kZT5zZWxlY3Rpb25DaGFuZ2VkPC9jb2RlPiBtZXRob2QuIFRoZSBpZGVhIGJlaGluZCB0aGUgbWV0aG9kIGlzCisgKiB0aGF0IGl0IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgdXNlciAic2VsZWN0cyIgc29tZXRoaW5nIGluIHRoZSBFY2xpcHNlCisgKiBpbnRlcmZhY2UuIFRoaXMgZG9lc24ndCBoYXBwZW4gYXV0b21hdGljYWxseSwgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIG11c3QKKyAqIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgRWNsaXBzZSAic2VsZWN0aW9uIHNlcnZpY2UiIHRoYXQgc2VydmVzIGFzIGEgY2VudHJhbAorICogZGlzcGF0Y2hlciBmb3Igc2VsZWN0aW9ucy4gVGhpcyByZWdpc3RyYXRpb24gaXMgZG9uZSBpbiB0aGUKKyAqIDxjb2RlPmNyZWF0ZVBhcnRDb250cm9sPC9jb2RlPiBtZXRob2Qgb2YgdGhlIHBhcmVudCBjbGFzcy4gV2hlbiBzb21ldGhpbmcKKyAqIGlzIHNlbGVjdGVkIGFuZCB0aGUgbWV0aG9kIGlzIGNhbGxlZCwgaXQgbXVzdCBmaWx0ZXIgb3V0IHRoZSBzZWxlY3Rpb25zIGFuZAorICogaWdub3JlIHRob3NlIHRoYXQgYXJlIG5vdCBpbnN0YW5jZXMgb2Yge0BsaW5rIElTaW11bGF0aW9ufS4gV2hlbiBpdCBkb2VzCisgKiBmaW5kIGEgc2ltdWxhdGlvbiBpbnN0YW5jZSwgaXQgcmVtb3ZlcyB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgbGlzdAorICogbWFpbnRhaW5lZCBieSB0aGUgPGNvZGU+TGlzdFZpZXdlcjwvY29kZT4gYW5kIGFkZHMgdGhlIG5ld2x5IHNlbGVjdGVkCisgKiBpbnN0YW5jZXMuIEl0IHRoZW4gdGVsbHMgdGhlIHZpZXdlciB0byByZWRyYXcgaXRzZWxmLgorICogPHA+CisgKiBUaGUgbGFiZWwgcHJvdmlkZXIgY2xhc3MgaXMge0BsaW5rIFV0aWxpdHlWaWV3TGFiZWxQcm92aWRlcn0gYW5kIGlzIHRoZQorICogZWFzaWVzdCB0byB1bmRlcnN0YW5kLCBpdHMgaXMgdXNlZCBieSB0aGUgPGNvZGU+TGlzdFZpZXdlcjwvY29kZT4gdG8KKyAqIGdlbmVyYXRlIGEgdGV4dCBzdHJpbmcgZm9yIGFueSBvZiB0aGUgPGNvZGU+T2JqZWN0czwvY29kZT4gKGkuZS4sCisgKiA8Y29kZT5JU2ltdWxhdGlvbjwvY29kZT4gaW5zdGFuY2VzKSBpdCBjb250YWlucy4gVGhlIG1ldGhvZAorICoge0BsaW5rIFV0aWxpdHlWaWV3TGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCl9IGRvZXMgdGhpcyBhbmQgaW4gdGhpcworICogZXhhbXBsZSBkb2VzIHRoZSB3b3JrIHRvIGV4dHJhY3QgdGhlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgZGF0YSBmcm9tIHRoZQorICogY2Fub25pY2FsIGdyYXBoIHVzZWQgaW4gdGhlIHNpbXVsYXRpb24uIFRoZW4gaXQganVzdCByZXR1cm5zIHRoYXQgZGF0YSBhcyBhCisgKiAobG9uZykgc3RyaW5nIHRvIGJlIGRpc3BsYXllZC4KKyAqIAorICogVG8gc2VlIHRoZSBleGFtcGxlIGluIGFjdGlvbiwgeW91IG5lZWQgdG86CisgKiA8b2w+CisgKiA8bGk+IFJ1biBTVEVNPC9saT4KKyAqIDxsaT4gT3BlbiB0aGUgIlZpZXcgRXhhbXBsZSAxIiB2aWV3LgorICogIldpbmRvdy0+U2hvdyZuYnNwO1ZpZXctPk90aGVyLT5TVEVNLT5WaWV3Jm5ic3A7RXhhbXBsZSZuYnNwOzEiPC9saT4KKyAqIDxsaT4gT3BlbiB0aGUgIkFjdGl2ZSBTaW11bGF0aW9ucyIgdmlldy4KKyAqICJXaW5kb3ctPlNob3cmbmJzcDtWaWV3LT5BY3RpdmUmbmJzcDtTaW11bGF0aW9ucyI8L2xpPi4KKyAqIAorICogPGxpPiBHbyB0byB0aGUgIlNjZW5hcmlvcyIgdmlldy4gSXQgc2hvd3MgdGhlIFNURU0gU2NlbmFyaW9zIHRoYXQgYXJlIHBsdWdnZWQKKyAqIGludG8gU1RFTS4gPC9saT4KKyAqIDxsaT4gRXhwYW5kICJUZXN0LT5EaXNlYXNlJm5ic3A7TW9kZWxzLT5TdGFuZGFyZCIgYW5kIHlvdSdsbCBzZWUgZGlzZWFzZQorICogbW9kZWxpbmcgc2NlbmFyaW9zIHRoYXQgYXJlIHBsdWdnZWQgaW50byBTVEVNLiA8L2xpPgorICogPGxpPiBEb3VibGUtY2xpY2sgb24gYSBzY2VuYXJpbyBpbiB0aGUgbGlzdCAoZS5nLiwgIlNFSVIgMSB4IDEiKSBpdCB3aWxsCisgKiBiZWdpbiBzaW11bGF0aW9uIGFuZCBhbiBlbnRyeSB3aWxsIGFwcGVhciBpbiB0aGUgIkFjdGl2ZSBTaW11bGF0aW9ucyIgdmlldy4KKyAqIDwvbGk+CisgKiA8bGk+IFNpbmdsZSBjbGljayBvbiB0aGUgZW50cnkgaW4gdGhlIEFjdGl2ZSBTaW11bGF0aW9ucyB2aWV3LiBUaGlzIHdpbGwKKyAqIHNlbGVjdCB0aGF0IHNpbXVsYXRpb24gYW5kIHRoZSBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YSBmb3IgdGhhdCBzY2VuYXJpbyB3aWxsCisgKiBhcHBlYXIgaW4gdGhlIFZpZXcgRXhhbXBsZSAxIHZpZXcgYXMgYSBzaW5nbGUgKGxvbmcpIHN0cmluZy4gPC9saT4KKyAqIDwvb2w+CisgKiBJZiB5b3UgZG91YmxlLWNsaWNrIG9uIGFub3RoZXIgcGx1Z2dlZC1pbiBTY2VuYXJpbyBzbyB0aGF0IHR3byBlbnRyaWVzIGFyZQorICogZGlzcGxheWVkIGluIHRoZSBBY3RpdmUgU2ltdWxhdGlvbnMgdmlldyBhbmQgdGhlIHlvdSBzZWxlY3QgYm90aCwgeW91J2xsIHNlZQorICogdHdvIGVudHJpZXMgaW4gdGhlIFZpZXcgRXhhbXBsZSAxIHZpZXcsIG9uZSBmb3IgZWFjaCBvZiB0aGUgc2VsZWN0ZWQKKyAqIHNpbXVsYXRpb25zLgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBVdGlsaXR5VmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKKworCS8qKgorCSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBWaWV3IEV4YW1wbGUxIFZpZXcuIE5vYm9keSB1c2VzIHRoaXMgcmlnaHQgbm93LCBidXQKKwkgKiBpdCB3b3VsZCBiZSB1c2VmdWwgaWYgd2Ugd2FudGVkIHRvIHByb2dyYW1tYXRpY2FsbHkgYWRkIHRoaXMgdmlldyB0byBhCisJICogcGVyc3BlY3RpdmUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfVklFV19FWEFNUExFMV9WSUVXID0gIm9yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlLmFkYXB0ZXJzLlV0aWxpdHlWaWV3IjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHtAbGluayBMaXN0Vmlld2VyfSB0aGF0IGNyZWF0ZXMgdGhlIGRpc3BsYXkgdGhhdCB3aWxsIHNob3cgdXAKKwkgKiBpbiB0aGUgdmlldydzIHdpbmRvdy4gSXQgY29udGFpbnMgYSBsaXN0IG9mIE9iamVjdHMsIHdoaWNoIGluIHRoaXMKKwkgKiBleGFtcGxlJ3MgY2FzZSB3aWxsIGJlIGluc3RhbmNlcyBvZiBJU2ltdWxhdGlvbi4KKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdFZpZXdlciBsdiA9IG51bGw7CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdmlldyBpcyBjcmVhdGVkIGFuZCBpdCBoYXMgdGhlCisJICogcmVzcG9uc2liaWxpdHkgZm9yIGRvaW5nIGFsbCBvZiB0aGUgaW5pdGlhbGl6YXRpb24uIEl0IGNyZWF0ZXMgdGhlCisJICoge0BsaW5rIExpc3RWaWV3ZXJ9IGFuZCBpbnN0YW5jZXMgb2YgdGhlIENvbnRlbnRQcm92aWRlciBhbmQKKwkgKiB7QGxpbmsgTGFiZWxQcm92aWRlcn0gZm9yIHRoZSB2aWV3ZXIuIEl0IGFsc28gZ2V0cyBhIHJlZmVyZW5jZSB0byB0aGUKKwkgKiBzZWxlY3Rpb24gc2VydmljZSBhbmQgcmVnaXN0ZXJzIHRoZSBjb250ZW50IHByb3ZpZGVyIHNvIGl0IHdpbGwgYmUKKwkgKiBub3RpZmllZCB3aGVuIHNvbWV0aGluZyBpcyBzZWxlY3RlZC4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQkvLyBDcmVhdGUgdGhlIGNvbnRlbnQgcHJvdmlkZXIKKwkJVXRpbGl0eVZpZXdDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IFV0aWxpdHlWaWV3Q29udGVudFByb3ZpZGVyKCk7CisJCS8vIENyZWF0ZSB0aGUgTGlzdFZpZXdlcgorCQlsdiA9IG5ldyBMaXN0Vmlld2VyKHBhcmVudCk7CisKKwkJLy8gTGV0IHRoZSBMaXN0Vmlld2VyIGtub3cgd2hvIGl0cyBjb250ZW50IGFuZCBsYWJlbCBwcm92aWRlcnMgYXJlCisJCWx2LnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOworCQlsdi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBVdGlsaXR5Vmlld0xhYmVsUHJvdmlkZXIoKSk7CisKKwkJLy8gVGhpcyBjYWxsIHRlbGxzIHRoZSB2aWV3ZXIncyBjb250ZW50IHByb3ZpZGVyIHdoZXJlIGl0IHNob3VsZCBnZXQgdGhlCisJCS8vIHNvdXJjZSBvZiBpdHMgY29udGVudC4gSW4gdGhpcyBjYXNlIGl0IGlzIHRoZSBzZWxlY3Rpb24gc2VydmljZS4KKwkJbHYuc2V0SW5wdXQoZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNlbGVjdGlvblNlcnZpY2UoKSk7CisKKwkJLy8gV2UgYWxzbyB3YW50IHRvIGJlIGFibGUgdG8gaGF2ZSBhIHVzZXIgc2VsZWN0IGEgc2ltdWxhdGlvbiBmcm9tIG91cgorCQkvLyB2aWV3IGFuZCBoYXZlIHRoYXQgYmUgc2VlbiBieSBvdGhlcnMuIFNvIHdlIHJlZ2lzdGVyIHRoZSBMaXN0Vmlld2VyCisJCS8vIGluc3RhbmNlIGFzIHRoZSB2aWV3J3Mgc2VsZWN0aW9uIHByb3ZpZGVyLiBXaGVuIHlvdSBjbGljayBvbiB0aGUgdmlldworCQkvLyBpbiB0aGUgaW50ZXJmYWNlIGl0IGZpbmRzIHRoZSB1bmRlcmx5aW5nIE9iamVjdCAoaS5lLiwgSVNpbXVsYXRpb24pCisJCS8vIHlvdSBzZWxlY3RlZCBhbmQgcGFzc2VzIGl0IHRvIHRoZSBzZWxlY3Rpb24gc2VydmljZS4KKwkJZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKGx2KTsKKworCX0gLy8gY3JlYXRlUGFydENvbnRyb2wKKworCS8qKgorCSAqIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIGludGVyZmFjZSwgYnV0IHdlJ3JlIG5vdCB1c2luZyBpdC4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCS8vIE5vdGhpbmcKKwl9IC8vIHNldEZvY3VzCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIHRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgdmlldy4gSXQgaXMgYWxzbyBhIHNlbGVjdGlvbgorCSAqIGxpc3RlbmVyIGFuZCB1c2VzIHRoZSBzZWxlY3Rpb24gc2VydmljZSBhcyB0aGUgc291cmNlIG9mIGl0cyBpbnB1dC4gSXQKKwkgKiBsb29rcyBmb3Igc2VsZWN0ZWQge0BsaW5rIElTaW11bGF0aW9ufSBpbnN0YW5jZXMgYW5kIHVwZGF0ZXMgdGhlIGxpc3QgaW4KKwkgKiB0aGUgdmlldydzIHtAbGluayBMaXN0Vmlld2VyfSBpbnN0YW5jZSB3aXRoIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KKwkgKi8KKwlwdWJsaWMgY2xhc3MgVXRpbGl0eVZpZXdDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cworCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIElTZWxlY3Rpb25MaXN0ZW5lciB7CisKKwkJLy8gV2UgcmVtZW1iZXIgdGhlIExpc3RWaWV3ZXIgdGhhdCB3ZSdyZSBwcm92aWRpbmcgY29udGVudCBmb3IgYmVjYXVzZQorCQkvLyB3ZSBuZWVkIHRvIG1hbmlwdWxhdGUgaXRzIGxpc3QgaW4gdGhlIG1ldGhvZCBzZWxlY3Rpb25DaGFuZ2VkLgorCQlwcml2YXRlIExpc3RWaWV3ZXIgdmlld2VyID0gbnVsbDsKKworCQkvLyBUaGVzZSBhcmUgdGhlIHNpbXVsYXRpb25zIHdlIGFkZGVkIHRvIHRoZSBMaXN0Vmlld2VyLCB3ZSByZW1lbWJlcgorCQkvLyB0aGVzZSBzbyB3ZSBjYW4gcmVtb3ZlIHRoZW0gd2hlbiBhIGRpZmZlcmVudCBzZXQgb2Ygc2ltdWxhdGlvbnMgaXMKKwkJLy8gc2VsZWN0ZWQuCisJCXByaXZhdGUgTGlzdDxJU2ltdWxhdGlvbj4gc2VsZWN0ZWRTaW11bGF0aW9ucyA9IG51bGw7CisKKwkJLyoqCisJCSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgTGlzdFZpZXdlciB0byBnZXQgdGhlIGluaXRpYWwgbGlzdCBvZiBJU2ltdWxhdGlvbgorCQkgKiBpbnN0YW5jZXMuCisJCSAqIAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cygKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IGlucHV0RWxlbWVudCkgeworCQkJT2JqZWN0W10gcmV0VmFsdWUgPSBuZXcgT2JqZWN0W10ge307CisKKwkJCS8vIEFueXRoaW5nIHlldD8KKwkJCWlmIChzZWxlY3RlZFNpbXVsYXRpb25zICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQlyZXRWYWx1ZSA9IHNlbGVjdGVkU2ltdWxhdGlvbnMudG9BcnJheSgpOworCQkJfQorCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGdldEVsZW1lbnRzCisKKwkJLyoqCisJCSAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHZpZXcgaXMgY2xvc2VkLCB3ZSBjb3VsZCByZW1vdmUgb3Vyc2VsdmVzIGFzCisJCSAqIGEgc2VsZWN0aW9uIHNlcnZpY2UgbGlzdGVuZXIsIGJ1dCB0aGlzIGlzIHJlYWxseSBmb3IgY2xlYW5pbmcgdXAgU1dUCisJCSAqIHRoaW5ncy4gVGhlIG1ldGhvZCBpbnB1dENoYW5nZWQgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGRpc3Bvc2Ugd2hlbgorCQkgKiB0aGUgdmlldyBpcyBjbG9zZWQsIHdlIHJlbW92ZSBvdXJzZWx2ZXMgZnJvbSB0aGUgc2VsZWN0aW9uIHNlcnZpY2UKKwkJICogdGhlcmUuCisJCSAqIAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKKwkJICovCisJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQkvLyBOb3RoaW5nIHRvIGRvCisJCX0gLy8gZGlzcG9zZQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCisJCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworCQkJLy8gV2UgcmVtZW1iZXIgdGhlIExpc3RWaWV3ZXIgd2UncmUgcHJvdmlkaW5nIGNvbnRlbnQgZm9yIGJlY2F1c2UKKwkJCS8vIHdlJ2xsIGhhdmUgdG8gY2hhbmdlIHRoZSBsaXN0IG9mIHRoaW5ncyBpdCBjb250YWlucyBpbiB0aGUKKwkJCS8vIHNlbGVjdGlvbkNoYW5nZWQgbWV0aG9kLgorCQkJdGhpcy52aWV3ZXIgPSAoTGlzdFZpZXdlcikgdmlld2VyOworCisJCQkvLyBXZXJlIHdlIHByZXZpb3VzbHkgZ2V0dGluZyBpbnB1dCBmcm9tIGEgZGlmZmVyZW50IHNlcnZpY2U/CisJCQlpZiAob2xkSW5wdXQgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCS8vIE5vdCBhbnkgbW9yZS4KKwkJCQlmaW5hbCBJU2VsZWN0aW9uU2VydmljZSBvbGRTUyA9IChJU2VsZWN0aW9uU2VydmljZSkgb2xkSW5wdXQ7CisJCQkJb2xkU1MucmVtb3ZlUG9zdFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJfQorCisJCQkvLyBJcyB0aGVyZSBzb21lIG5ldyBpbnB1dCB3ZSBzaG91bGQgcmVnaXN0ZXIgd2l0aD8KKwkJCWlmIChuZXdJbnB1dCAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJLy8gUmVnaXN0ZXIgdXMgd2l0aCB0aGUgbmV3IHNlcnZpY2UuIFNpbmNlIHRoZXJlIHNob3VsZCBvbmx5CisJCQkJLy8gcmVhbGx5IGJlIG9uZSBzZWxlY3Rpb24gc2VydmljZSBpbiBFY2xpcHNlLCB0aGlzIHdvdWxkIG9ubHkKKwkJCQkvLyBoYXBwZW4gb25jZSwgaG93ZXZlciwgdGhlIGNvZGUgY2FuIGhhbmRsZSBhIGNoYW5nZSBpZiBuZWVkZWQuCisJCQkJZmluYWwgSVNlbGVjdGlvblNlcnZpY2Ugc3MgPSAoSVNlbGVjdGlvblNlcnZpY2UpIG5ld0lucHV0OworCQkJCXNzLmFkZFBvc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCX0KKworCQl9IC8vIGlucHV0Q2hhbmdlZAorCisJCS8qKgorCQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgQU5ZVEhJTkcgaXMgc2VsZWN0ZWQgaW4gdGhlIEVjbGlwc2UKKwkJICogd29ya2JlbmNoLiBJdCdzIGpvYiBpcyB0byBmaWx0ZXIgb3V0IHNlbGVjdGlvbnMgb2YKKwkJICoge0BsaW5rIElTaW11bGF0aW9ufSBpbnN0YW5jZXMgYW5kIHVwZGF0ZSB0aGUgbGlzdCBpbiB0aGUKKwkJICoge0BsaW5rIExpc3RWaWV3ZXJ9LgorCQkgKiAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwKKwkJICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCisJCSAqLworCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKGZpbmFsIElXb3JrYmVuY2hQYXJ0IHBhcnQsCisJCQkJZmluYWwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKworCQkJLy8gSXMgdGhpcyBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCBjb21pbmcgZnJvbSBvdXIgdmlldz8KKwkJCWlmIChwYXJ0ICE9IFV0aWxpdHlWaWV3LnRoaXMpIHsKKwkJCQkvLyBObworCQkJCS8vIFRoaXMgd2lsbCBob2xkIHRoZSBuZXcgc2ltdWxhdGlvbnMgdGhhdCBoYXZlIGJlZW4gc2VsZWN0ZWQKKwkJCQlmaW5hbCBMaXN0PElTaW11bGF0aW9uPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxJU2ltdWxhdGlvbj4oKTsKKworCQkJCS8vIElzIGl0IGEgc3RydWN0dXJlZCBzZWxlY3Rpb24/CisJCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQkJCS8vIFllcworCQkJCQlmaW5hbCBMaXN0IGxpc3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCisJCQkJCQkJLnRvTGlzdCgpOworCisJCQkJCS8vIEdvIHRocm91Z2ggZXZlcnl0aGluZyBpbiB0aGUgbGlzdCBvZiB0aGluZ3MgdGhhdCB3ZXJlCisJCQkJCS8vIHNlbGVjdGVkIGFuZCBwaWNrIG91dCB0aGUgb25lcyB0aGF0IGFyZSBJU2ltdWxhdGlvbnMuCisJCQkJCWZvciAoZmluYWwgSXRlcmF0b3Igc2VsZWN0aW9uSXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgc2VsZWN0aW9uSXRlcgorCQkJCQkJCS5oYXNOZXh0KCk7KSB7CisJCQkJCQlmaW5hbCBPYmplY3Qgb2JqID0gc2VsZWN0aW9uSXRlci5uZXh0KCk7CisJCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVNpbXVsYXRpb24pIHsKKwkJCQkJCQl0ZW1wLmFkZCgoSVNpbXVsYXRpb24pIG9iaik7CisJCQkJCQl9CisJCQkJCX0gLy8gZm9yIGVhY2ggc2VsZWN0ZWQgaXRlbQorCQkJCX0gLy8gaWYgc3RydWN0dXJlZCBzZWxlY3Rpb24KKworCQkJCS8vIERpZCB3ZSBmaW5kIGFueSBuZXcgc2ltdWxhdGlvbnMgdGhhdCB3ZXJlIHNlbGVjdGVkPworCQkJCWlmICh0ZW1wLnNpemUoKSA+IDApIHsKKwkJCQkJLy8gWWVzCisJCQkJCS8vIFRlbGwgdGhlIExpc3RWaWV3ZXIgbm90IHRvIHJlZHJhdyB3aGlsZSB3ZSdyZSBjaGFuZ2luZworCQkJCQkvLyBpdHMgbGlzdC4KKwkJCQkJdmlld2VyLmdldExpc3QoKS5zZXRSZWRyYXcoZmFsc2UpOworCQkJCQl0cnkgeworCQkJCQkJLy8gRG8gd2UgaGF2ZSBhbnkgb2xkIHNlbGVjdGlvbnMgd2Ugc2hvdWxkIHJlbW92ZT8KKwkJCQkJCWlmIChzZWxlY3RlZFNpbXVsYXRpb25zICE9IG51bGwpIHsKKwkJCQkJCQkvLyBZZXMKKwkJCQkJCQl2aWV3ZXIucmVtb3ZlKHNlbGVjdGVkU2ltdWxhdGlvbnMudG9BcnJheSgpKTsKKwkJCQkJCX0KKwkJCQkJCS8vIEFkZCB0aGUgbmV3IHNlbGVjdGlvbnMgdG8gdGhlIExpc3RWaWV3ZXIncyBsaXN0LiBJdAorCQkJCQkJLy8gd2lsbCB1c2UgdGhlIGxhYmVsIHByb3ZpZGVyIHRvIGdldCBhIHRleHQgc3RyaW5nIGZvcgorCQkJCQkJLy8gZWFjaCBvbmUuCisJCQkJCQl2aWV3ZXIuYWRkKHRlbXAudG9BcnJheSgpKTsKKworCQkJCQkJLy8gUmVtZW1iZXIgd2hhdCB3ZSBhZGRlZCB0aGlzIHRpbWUgc28gd2UgY2FuIHJlbW92ZSBpdAorCQkJCQkJLy8gbmV4dCBzZWxlY3Rpb24uCisJCQkJCQlzZWxlY3RlZFNpbXVsYXRpb25zID0gdGVtcDsKKwkJCQkJfSAvLyB0cnkKKwkJCQkJZmluYWxseSB7CisJCQkJCQkvLyBUaGUgTGlzdFZpZXdlciBzaG91bGQgdXBkYXRlIGl0c2VsZiBub3cuCisJCQkJCQl2aWV3ZXIuZ2V0TGlzdCgpLnNldFJlZHJhdyh0cnVlKTsKKwkJCQkJfQorCQkJCX0gLy8gaWYgYW55IG5ldyBzaW11bGF0aW9ucyBzZWxlY3RlZAorCQkJfSAvLyBpZiBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCBjb21pbmcgZnJvbSBvdXIgdmlldz8KKwkJfSAvLyBzZWxlY3Rpb25DaGFuZ2VkCisKKwl9IC8vIFV0aWxpdHlWaWV3Q29udGVudFByb3ZpZGVyCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIHRoZSBsYWJlbCBwcm92aWRlciBmb3IgdGhlIHZpZXcuIEl0IGlzIHVzZWQgYnkgdGhlCisJICogTGlzdFZpZXdlciB0byBjb252ZXJ0IElTaW11bGF0aW9uIGluc3RhbmNlcyB0byB0ZXh0IHN0cmluZ3MuCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBVdGlsaXR5Vmlld0xhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7CisKKwkJLyoqCisJCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSB7QGxpbmsgTGlzdFZpZXdlcn0gZm9yIGVhY2gge0BsaW5rIE9iamVjdH0gaW4KKwkJICogaXRzIGxpc3QgdG8gZ2VuZXJhdGUgYSB0ZXh0IHtAbGluayBTdHJpbmd9IHRoYXQgcmVwcmVzZW50cyB0aGF0CisJCSAqIHtAbGluayBPYmplY3R9LiBUaGlzIGltcGxlbWVudGF0aW9uIGRpZ3MgaW50byB0aGUge0BsaW5rIFNpbXVsYXRpb259CisJCSAqIHRvIGdldCB0aGUge0BsaW5rIFNjZW5hcmlvfSBhbmQgdGhlbiBmcm9tIHRoYXQgaXQgb2J0YWlucyB0aGUKKwkJICogY2Fub25pY2FsIHtAbGluayBHcmFwaH0uIEl0IHRoZW4gZ29lcyB0aHJvdWdoIHRoZSB7QGxpbmsgTm9kZX1zIG9mCisJCSAqIHRoZSB7QGxpbmsgR3JhcGh9IGFuZCB1c2luZyBhIHtAbGluayBMYXRMb25nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeX0KKwkJICogY3JlYXRlcyBhIHtAbGluayBMYXRMb25nUHJvdmlkZXJ9IGZvciBlYWNoIHtAbGluayBOb2RlfSB0aGF0IGNhbgorCQkgKiByZXR1cm4gdGhlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgZGF0YSBvZiB0aGUge0BsaW5rIE5vZGV9LiBUaGF0CisJCSAqIGRhdGEgaXMganVzdCB0dXJuZWQgaW50byBhIHN0cmluZyBhbmQgcmV0dXJuZWQgYXMgdGhlIHRleHR1YWwKKwkJICogcmVwcmVzZW50YXRpb24gb2YgdGhlIHtAbGluayBTaW11bGF0aW9ufS4KKwkJICogCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisJCQkvLyBFeHRyYWN0IHRoZSBzY2VuYXJpbyBhbmQgdGhlbiB0aGUgY2Fub25pY2FsIGdyYXBoCisJCQlmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uID0gKElTaW11bGF0aW9uKSBlbGVtZW50OworCQkJZmluYWwgU2NlbmFyaW8gc2NlbmFyaW8gPSBzaW11bGF0aW9uLmdldFNjZW5hcmlvKCk7CisJCQlmaW5hbCBHcmFwaCBjYW5vbmljYWxHcmFwaCA9IHNjZW5hcmlvLmdldENhbm9uaWNhbEdyYXBoKCk7CisKKwkJCS8vIEdldCB0aGUgbm9kZXMgZnJvbSB0aGUgZ3JhcGggYW5kIGl0ZXJhdGUgdGhyb3VnaCB0aGVtLiBOb3RlIHRoYXQKKwkJCS8vIHRoZSBnZXROb2RlcyBjYWxsIHJldHVybnMgYSBNYXAgaW5zdGFuY2Ugd2hlcmUgdGhlIGtleXMgYXJlIHRoZQorCQkJLy8gVVJJJ3Mgb2YgdGhlIE5vZGUgaW5zdGFuY2VzLiBXZSBnZXQgdGhlIHZhbHVlcyBvZiB0aGUgbWFwIHRvCisJCQkvLyBpdGVyYXRlIHRocm91Z2ggdGhlIG5vZGVzLgorCQkJLy8gTWFwPFN0cmluZyxSZWN0YW5nbGVbXT4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLFJlY3RhbmdsZVtdPigpOworCQkJZm9yIChmaW5hbCBJdGVyYXRvciBub2RlSXRlciA9IGNhbm9uaWNhbEdyYXBoLmdldE5vZGVzKCkudmFsdWVzKCkKKwkJCQkJLml0ZXJhdG9yKCk7IG5vZGVJdGVyLmhhc05leHQoKTspIHsKKwkJCQlmaW5hbCBOb2RlIG5vZGUgPSAoTm9kZSkgbm9kZUl0ZXIubmV4dCgpOworCisJCQkJLy8gV2UnZCBsaWtlIHRvIGhhdmUgYWNjZXNzIHRvIGxhdC9sb25nIGRhdGEgb2YgdGhlIG5vZGUgaWYKKwkJCQkvLyB0aGVyZSBpcyBhbnksIHRvIGRvIHRoYXQgd2UgdXNlIGEgZmFjdG9yeSB0byBjcmVhdGUgYW4KKwkJCQkvLyBhZGFwdGVyIHRoYXQga25vd3MgYWJvdXQgdGhlIGlubmVyIGRldGFpbHMgb2Ygbm9kZXMgKGl0CisJCQkJLy8gcmVhbGx5IGtub3dzIGFib3V0IGFsbCBJZGVudGlmaWFibGVzKSBhbmQgaW1wbGVtZW50cyB0aGUKKwkJCQkvLyBMYXRMb25nUHJvdmlkZXIgaW50ZXJmYWNlLgorCQkJCWZpbmFsIExhdExvbmdQcm92aWRlciBsYXRMb25nUHJvdmlkZXIgPSAoTGF0TG9uZ1Byb3ZpZGVyKSBMYXRMb25nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkJLmFkYXB0KG5vZGUsIExhdExvbmdQcm92aWRlci5jbGFzcyk7CisKKwkJCQkvLyBUaGUgbm9kZSBtYXkgb3IgbWF5IG5vdCBoYXZlIGxhdC9sb25nIGRhdGEgYXNzb2NpYXRlZCB3aXRoCisJCQkJLy8gaXQsIGlmIGl0IGRvZXNuJ3QgdGhlIGxpc3QgdGhhdCdzIHJldHVybmVkIHdpbGwgYmUgZW1wdHkuCisJCQkJZmluYWwgTGF0TG9uZyBsYXRMb25nID0gbGF0TG9uZ1Byb3ZpZGVyLmdldExhdExvbmcoKTsKKworCQkJCS8vIFN0cmluZyBuYW1lID0gbm9kZS5nZXREdWJsaW5Db3JlKCkuZ2V0SWRlbnRpZmllcigpOworCQkJCS8vIE5laWdoYm9yVXRpbGl0eS5zZXRCQm94KG1hcCxuYW1lLGxhdExvbmcpOworCisJCQkJLy8gTm93IHdlIGp1c3QgZ28gdGhyb3VnaCBlYWNoIHNlZ21lbnQgYW5kIGNyZWF0ZSBhIHN0cmluZy4KKwkJCQlmb3IgKFNlZ21lbnQgc2VnbWVudCA6IGxhdExvbmcuZ2V0U2VnbWVudHMoKSkgeworCisJCQkJCXNiLmFwcGVuZChjcmVhdGVTdHJpbmdPZkxhdExvbmdEYXRhKHNlZ21lbnQpKTsKKwkJCQkJc2IuYXBwZW5kKCIvLy8iKTsKKwkJCQl9IC8vIGZvcgorCQkJfSAvLyBmb3IKKwkJCS8vIE5laWdoYm9yVXRpbGl0eS5wcm9jZXNzQkJveChtYXApOworCQkJLy8gTm93IGlmIHdlIGRpZG4ndCBmaW5kIGFueSBsYXQvbG9uZyBkYXRhLCB3ZSBqdXN0IHJldHVybiBhIHNpbXBsZQorCQkJLy8gcmVzcG9uc2UuIFRoaXMgd2lsbCBhcHBlYXIgaW4gdGhlIHZpZXcgaW5zdGVhZCBvZiB0aGUgZGF0YS4KKwkJCVN0cmluZyByZXRWYWx1ZSA9IHNiLnRvU3RyaW5nKCk7CisJCQlyZXRWYWx1ZSA9IHJldFZhbHVlLmxlbmd0aCgpID09IDAgPyAiTm8gTGF0L0xvbmcgRGF0YSIgOiByZXRWYWx1ZTsKKworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGdldFRleHQKKworCQkvKioKKwkJICogV2UgZG9uJ3QgaGF2ZSBhbnkgaW1hZ2VzIGFzc29jaWF0ZWQgd2l0aCB7QGxpbmsgU2ltdWxhdGlvbn0sIGJ1dCBpZgorCQkgKiB3ZSBkaWQgd2UnZCByZXR1cm4gdGhlbSBoZXJlLiBSZXR1cm5pbmcgbnVsbCBqdXN0IHRlbGxzIHRoZSBjYWxsZXIKKwkJICogdGhhdCB0aGVyZSBhcmUgbm8gaW1hZ2VzLgorCQkgKiAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCBlbGVtZW50KSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSAvLyBnZXRJbWFnZQorCisJCS8qKgorCQkgKiBSZXF1aXJlZCBieSB0aGUgaW50ZXJmYWNlLCBidXQgbm90IHVzZWQgYnkgdXMuCisJCSAqIAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKKwkJICovCisJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKAorCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCQkvLyBub3RoaW5nCisJCX0KKworCQkvKioKKwkJICogUmVxdWlyZWQgYnkgdGhlIGludGVyZmFjZSwgYnV0IG5vdCB1c2VkIGJ5IHVzLgorCQkgKiAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKKwkJICovCisJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQkvLyBub3RoaW5nCisJCX0KKworCQkvKioKKwkJICogUmVxdWlyZWQgYnkgdGhlIGludGVyZmFjZSwgYnV0IG5vdCB1c2VkIGJ5IHVzLgorCQkgKiAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKKwkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KAorCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgZWxlbWVudCwKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nIHByb3BlcnR5KSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvKioKKwkJICogUmVxdWlyZWQgYnkgdGhlIGludGVyZmFjZSwgYnV0IG5vdCB1c2VkIGJ5IHVzLgorCQkgKiAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCisJCSAqLworCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcigKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQkJLy8gbm90aGluZworCQl9CisJfSAvLyBVdGlsaXR5Vmlld0xhYmVsUHJvdmlkZXIKKworCS8qKgorCSAqIEBwYXJhbSBzZWdtZW50CisJICogQHJldHVybiBhIHN0cmluZyBvZiB0aGUgbGF0L2xvbmcgcG9pbnRzCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlU3RyaW5nT2ZMYXRMb25nRGF0YShmaW5hbCBTZWdtZW50IHNlZ21lbnQpIHsKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWZpbmFsIGludCBzaXplID0gc2VnbWVudC5zaXplKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlzYi5hcHBlbmQoIigiKTsKKwkJCXNiLmFwcGVuZChzZWdtZW50LmxhdGl0dWRlKGkpKTsKKwkJCXNiLmFwcGVuZCgiLCAiKTsKKwkJCXNiLmFwcGVuZChzZWdtZW50LmxvbmdpdHVkZShpKSk7CisJCQlzYi5hcHBlbmQoIikiKTsKKwkJfSAvLyBmb3IgZWFjaCBsYXQvbG9uZyBwYWlyCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0gLy8gY3JlYXRlU3RyaW5nT2ZMYXRMb25nRGF0YQorfSAvLyBVdGlsaXR5VmlldwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zYW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc2FtcGxlL2FkYXB0aW9uL0V4YW1wbGUxLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zYW1wbGUvYWRhcHRpb24vRXhhbXBsZTEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzIzODlkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zYW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc2FtcGxlL2FkYXB0aW9uL0V4YW1wbGUxLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8vIEV4YW1wbGUxLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5zYW1wbGUuYWRhcHRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmc7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmcuU2VnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHMuRGV0ZXJtaW5pc3RpY1NFSVJTY2VuYXJpb1Rlc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byBvYnRhaW4gdGhlIGNhbm9uaWNhbCBncmFwaCBmcm9tIGEKKyAqIHNjZW5hcmlvLCBhY2Nlc3MgdGhlIG5vZGVzIGluIHRoZSBncmFwaCwgYW5kIGFkYXB0IHRoZSBub2RlcyB0byBwcm9kdWNlCisgKiBsYXQvbG9uZyBkYXRhIHNldHMgZm9yIGVhY2ggbm9kZS4KKyAqLworcHVibGljIGNsYXNzIEV4YW1wbGUxIHsKKworCS8qKgorCSAqIEBwYXJhbSBhcmdzCisJICogICAgICAgICAgICBub25lCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCisJCS8vIFRoaXMgY3JlYXRlcyBhIHNjZW5hcmlvIHRoYXQncyByZWFkeSB0byBiZSAic3RlcHBlZCIgKGkuZS4sCisJCS8vIHNpbXVsYXRlZCkuIFRoZSB3b3JsZCBpcyBhIGxhdHRpY2UgKGdyaWQpIHRoYXQgMngyIHdoZXJlIGVhY2ggbm9kZQorCQkvLyBoYXMgYSBwb3B1bGF0aW9uIG9mIDEwMCBodW1hbnMgYW5kIGhhcyBhbiBhcmVhIG9mIDEwMCBzcXVhcmUKKwkJLy8ga2lsb21ldGVycy4gVGhlcmUgaXMgb25lIGRpc2Vhc2UgdGhhdCBpcyBtb2RlbGVkIHdpdGggYQorCQkvLyAiZGV0ZXJtaW5pc3RpYyBTRUlSIGRpc2Vhc2UgbW9kZWwiLiBPbmUgcGVyc29uIGluIHRoZSBub2RlIGF0CisJCS8vIHBvc2l0aW9uIFswXVswXSwgaW4gdGhlIHVwcGVyIGxlZnQgb2YgdGhlIGdyaWQsIGlzIGluZmVjdGVkLgorCQlmaW5hbCBTY2VuYXJpbyBzY2VuYXJpbyA9IERldGVybWluaXN0aWNTRUlSU2NlbmFyaW9UZXN0LmNyZWF0ZVNjZW5hcmlvKAorCQkJCTIsIDIpOworCisJCS8vIFRoaXMgd2lsbCBpbml0aWFsaXplIHRoZSBzY2VuYXJpbyBhbmQgbWFrZSBpdCByZWFkeSB0byBzdGVwIHRocm91Z2gKKwkJLy8gdGhlIHNpbXVsYXRpb24gc2VxdWVuY2UuIEluIHBhcnRpY3VsYXIsIGl0IHdpbGwgY3JlYXRlIHRoZSBjYW5vbmljYWwKKwkJLy8gZ3JhcGggZnJvbSB0aGUgc2NlbmFyaW8ncyBtb2RlbC4KKwkJc2NlbmFyaW8uaW5pdGlhbGl6ZSgpOworCisJCS8vIFdlIGdldCB0aGUgZ3JhcGguLi4KKwkJZmluYWwgR3JhcGggY2Fub25pY2FsR3JhcGggPSBzY2VuYXJpby5nZXRDYW5vbmljYWxHcmFwaCgpOworCisJCS8vIC4uLmFuZCBjYW4gbm93IGl0ZXJhdGUgdGhyb3VnaCB0aGUgbm9kZXMuIE5vdGUgdGhhdCB0aGUgbWV0aG9kCisJCS8vICJnZXROb2RlcyIgcmV0dXJucyBhIG1hcCBpbmRleGVkIGJ5IHRoZSBVUkkgb2YgZWFjaCBvZiB0aGUgbm9kZXMsCisJCS8vIHRodXMgd2UgbmVlZCB0byBnZXQgdGhlIHZhbHVlcyBvZiB0aGUgbWFwIHRvIGhhdmUgYW4gYWN0dWFsIGxpc3QgdG8KKwkJLy8gaXRlcmF0b3Igb3Zlci4KKwkJZm9yIChmaW5hbCBJdGVyYXRvciBub2RlSXRlciA9IGNhbm9uaWNhbEdyYXBoLmdldE5vZGVzKCkudmFsdWVzKCkKKwkJCQkuaXRlcmF0b3IoKTsgbm9kZUl0ZXIuaGFzTmV4dCgpOykgeworCQkJZmluYWwgTm9kZSBub2RlID0gKE5vZGUpIG5vZGVJdGVyLm5leHQoKTsKKworCQkJLy8gV2UnZCBsaWtlIHRvIGhhdmUgYWNjZXNzIHRvIGxhdC9sb25nIGRhdGEgb2YgdGhlIG5vZGUgaWYgdGhlcmUgaXMKKwkJCS8vIGFueSwgdG8gZG8gdGhhdCB3ZSB1c2UgYSBmYWN0b3J5IHRvIGNyZWF0ZSBhbiBhZGFwdGVyIHRoYXQga25vd3MKKwkJCS8vIGFib3V0IHRoZSBpbm5lciBkZXRhaWxzIG9mIG5vZGVzIChpdCByZWFsbHkga25vd3MgYWJvdXQgYWxsCisJCQkvLyBJZGVudGlmaWFibGVzKSBhbmQgaW1wbGVtZW50cyB0aGUgTGF0TG9uZ1Byb3ZpZGVyIGludGVyZmFjZS4KKwkJCWZpbmFsIExhdExvbmdQcm92aWRlciBsYXRMb25nUHJvdmlkZXIgPSAoTGF0TG9uZ1Byb3ZpZGVyKSBMYXRMb25nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkuYWRhcHQobm9kZSwgTGF0TG9uZ1Byb3ZpZGVyLmNsYXNzKTsKKworCQkJLy8gVGhlIG5vZGUgbWF5IG9yIG1heSBub3QgaGF2ZSBsYXQvbG9uZyBkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdCwgaWYKKwkJCS8vIGl0IGRvZXNuJ3QgdGhlIGxpc3QgdGhhdCdzIHJldHVybmVkIHdpbGwgYmUgZW1wdHkuCisJCQlmaW5hbCBMYXRMb25nIGxhdExvbmdEYXRhID0gbGF0TG9uZ1Byb3ZpZGVyLmdldExhdExvbmcoKTsKKworCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaGUgbGF0L2xvbmcgZGF0YSBmb3IgXCIiCisJCQkJCSsgbm9kZS5nZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKSArICJcIiBpczoiKTsKKwkJCW91dHB1dExhdExvbmdEYXRhKGxhdExvbmdEYXRhKTsKKwkJfSAvLyBmb3IgZWFjaCBub2RlCisKKwkJU3lzdGVtLm91dC5wcmludGxuKCJFZGdlcy4uLiIpOworCisJCS8vIEZvciBmdW4sIGxldCdzIGRvIHRoZSBlZGdlcywgdGhlcmUgbWlnaHQgbm90IGJlIGFueXRoaW5nIGRlZmluZWQgZm9yCisJCS8vIHRoZW0uLi55ZXQKKwkJZm9yIChmaW5hbCBJdGVyYXRvciBlZGdlSXRlciA9IGNhbm9uaWNhbEdyYXBoLmdldEVkZ2VzKCkudmFsdWVzKCkKKwkJCQkuaXRlcmF0b3IoKTsgZWRnZUl0ZXIuaGFzTmV4dCgpOykgeworCQkJZmluYWwgRWRnZSBlZGdlID0gKEVkZ2UpIGVkZ2VJdGVyLm5leHQoKTsKKwkJCWZpbmFsIExhdExvbmdQcm92aWRlciBsYXRMb25nUHJvdmlkZXIgPSAoTGF0TG9uZ1Byb3ZpZGVyKSBMYXRMb25nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkuYWRhcHQoZWRnZSwgTGF0TG9uZ1Byb3ZpZGVyLmNsYXNzKTsKKworCQkJZmluYWwgTGF0TG9uZyBsYXRMb25nRGF0YSA9IGxhdExvbmdQcm92aWRlci5nZXRMYXRMb25nKCk7CisKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlIGxhdC9sb25nIGRhdGEgZm9yIFwiIgorCQkJCQkrIGVkZ2UuZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCkgKyAiXCIgaXM6Iik7CisJCQlvdXRwdXRMYXRMb25nRGF0YShsYXRMb25nRGF0YSk7CisJCX0gLy8gZm9yIGVhY2ggZWRnZQorCX0gLy8gbWFpbgorCisJLyoqCisJICogQHBhcmFtIGxhdExvbmcKKwkgKiAgICAgICAgICAgIGEgTGF0TG9uZyBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBvdXRwdXRMYXRMb25nRGF0YShMYXRMb25nIGxhdExvbmcpIHsKKwkJZm9yIChTZWdtZW50IHNlZ21lbnQgOiBsYXRMb25nLmdldFNlZ21lbnRzKCkpIHsKKwkJCWZpbmFsIGludCBzaXplID0gc2VnbWVudC5zaXplKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbihjcmVhdGVTdHJpbmdPZkxhdExvbmdEYXRhKHNlZ21lbnQpKTsKKwkJCX0gLy8gZm9yIGVhY2ggbGF0L2xvbmcgcGFpcgorCQkJU3lzdGVtLm91dC5wcmludGxuKCk7CisJCX0gLy8gZm9yIGVhY2ggc2VnbWVudAorCX0gLy8gb3V0cHV0TGF0TG9uZ0RhdGEKKworCS8qKgorCSAqIEBwYXJhbSBzZWdtZW50CisJICogQHJldHVybiBhIHN0cmluZyBvZiB0aGUgbGF0L2xvbmcgcG9pbnRzCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlU3RyaW5nT2ZMYXRMb25nRGF0YShmaW5hbCBTZWdtZW50IHNlZ21lbnQpIHsKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWZpbmFsIGludCBzaXplID0gc2VnbWVudC5zaXplKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlzYi5hcHBlbmQoIigiKTsKKwkJCXNiLmFwcGVuZChzZWdtZW50LmxhdGl0dWRlKGkpKTsKKwkJCXNiLmFwcGVuZCgiLCAiKTsKKwkJCXNiLmFwcGVuZChzZWdtZW50LmxvbmdpdHVkZShpKSk7CisJCQlzYi5hcHBlbmQoIikiKTsKKwkJfSAvLyBmb3IgZWFjaCBsYXQvbG9uZyBwYWlyCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0gLy8gY3JlYXRlU3RyaW5nT2ZMYXRMb25nRGF0YQorfSAvLyBFeGFtcGxlMQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zYW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc2FtcGxlL2FkYXB0aW9uL1JlbGF0aXZlVmFsdWVWaWV3RXhhbXBsZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5zYW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc2FtcGxlL2FkYXB0aW9uL1JlbGF0aXZlVmFsdWVWaWV3RXhhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOWIzNWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zYW1wbGUvYWRhcHRpb24vUmVsYXRpdmVWYWx1ZVZpZXdFeGFtcGxlLmphdmEKQEAgLTAsMCArMSw2NjggQEAKKy8vIFJlbGF0aXZlVmFsdWVWaWV3RXhhbXBsZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlLmFkYXB0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlQ29sb3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvblNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHJ1biBHVUkgY29kZSBpbiBFY2xpcHNlIGFuZCBtb25pdG9yIHRoZQorICogInNlbGVjdGVkIiBzaW11bGF0aW9uLCBhbmQgaG93IHRvIGV4dHJhY3QgdGhlIGNhbm9uaWNhbCBncmFwaCBmcm9tIHRoZQorICogc2VsZWN0ZWQgc2ltdWxhdGlvbiBhbmQgdGhlbiBleHRyYWN0IGRhdGEgZnJvbSBpdC4gSW4gcGFydGljdWxhciwgdGhpcworICogZXhhbXBsZSB2aWV3IGlsbHVzdHJhdGVzIGhvdyB0byBleHBsb3JlIHRoZSBjYW5vbmljYWwgZ3JhcGggYW5kIGRpc2NvdmVyCisgKiBwcm9wZXJ0eSB2YWx1ZXMgb2YgZ3JhcGggY29tcG9uZW50cyB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIHZhbHVlCisgKiBiZXR3ZWVuIDAuMCBhbmQgMS4wIChpbmNsdXNpdmUpIHJlbGF0aXZlIHRvIG90aGVyIHBlZXIgcHJvcGVydHkgdmFsdWVzLiBGb3IKKyAqIGluc3RhbmNlLCBpbiB0aGUgY2FzZSBvZiBhIGRpc2Vhc2UgbW9kZWwsIHRoZSBkaXNlYXNlIG1vZGVsIGxhYmVsIHZhbHVlcworICogY29udGFpbiBwb3B1bGF0aW9uIG51bWJlcnMgZm9yIHBvcHVsYXRpb24gbWVtYmVycyBpbiBkaWZmZXJlbnQgZGlzZWFzZSBzdGF0ZXMKKyAqIChlLmcuLCAic3VzY2VwdGlibGUiLCAiZXhwb3NlZCIsICJpbmZlY3Rpb3VzIiwgInJlY292ZXJlZCIpLiBUaGUgbnVtYmVyIG9mCisgKiBtZW1iZXJzIGluIGVhY2ggc3RhdGUgY2FuIGJlIHJlcHJlc2VudGVkIHJlbGF0aXZlIHRvIHRoZSB0b3RhbCBwb3B1bGF0aW9uCisgKiBmaWd1cmUgKGkuZS4sIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgc3VtIG9mIGFsbCB0aGUgc3RhdGVzKS4gVGhlIHJlbGF0aXZlCisgKiB2YWx1ZXMgY2FuIGJlIGludGVycHJldGVkIGJ5IGEgZ2VuZXJpYyBncmFwaGljYWwgaW50ZXJmYWNlIHRvIGRpc3BsYXkKKyAqIGRpZmZlcmVudCBjb2xvcnMgb3IgaW50ZW5zaXRpZXMgdG8gcmVwcmVzZW50IHRoZSBwcm9wZXJ0eSB2YWx1ZS4KKyAqIDxwPgorICogVGhlIGRpc2NvdmVyeSBvZiBwcm9wZXJ0aWVzIGFuZCB0aGVpciBjb252ZXJzaW9uIHRvIHJlbGF0aXZlIHZhbHVlcyBpcworICogZmFjaWxpdGF0ZWQgYnkgYW4gaW50ZXJmYWNlIGNhbGxlZCB7QGxpbmsgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyfS4gSW5zdGFuY2VzCisgKiBvZiBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGNhbiBwcm92aWRlIGEgbGlzdCBvZiBwcm9wZXJ0aWVzIGZvcgorICogd2hpY2ggcmVsYXRpdmUgdmFsdWVzIGNhbiBiZSBnZW5lcmF0ZWQsIGFuZCwgZ2l2ZW4gb25lIG9mIHRob3NlIHByb3BlcnRpZXMsCisgKiBjYW4gZ2VuZXJhdGUgaXRzIHJlbGF0aXZlIHZhbHVlLiBUaGUgcHJvcGVydGllcyBjb250YWluIGRldGFpbHMgc3VjaCBhcyB0aGUKKyAqIG5hbWUgb2YgdGhlIHByb3BlcnR5IGFuZCBhIHRleHQgZGVzY3JpcHRpb24sIGFtb25nIG90aGVyIHRoaW5ncy4gVGhlc2UgdmFsdWVzCisgKiBjb3VsZCBiZSBwcmVzZW50ZWQgdG8gYSB1c2VyIG9mIGEgZ3JhcGhpY2FsIGludGVyZmFjZSBpbiBhIG1lbnUgdG8gc2VsZWN0IHRoZQorICogKHJlbGF0aXZlKSBwcm9wZXJ0eSB2YWx1ZXMgdG8gZGlzcGxheS4gVGhlIHRyaWNrLCBhbmQgdGhlIHBvaW50IG9mIHRoaXMKKyAqIGV4YW1wbGUsIGlzIG9idGFpbmluZyB7QGxpbmsgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyfSdzIGZvciBjb21wb25lbnRzIG9mIHRoZQorICogZ3JhcGguCisgKiA8cD4KKyAqIEluc3RhbmNlcyBvZiB7QGxpbmsgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyfSBhcmUgY3JlYXRlZCBieSBhbiBhZGFwdGVyIGZhY3RvcnkKKyAqIGNhbGxlZCB7QGxpbmsgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnl9LiBUaGlzIGFkYXB0ZXIgZmFjdG9yeSBjYW4KKyAqIGJlIGdpdmVuIGFueSBjb21wb25lbnQgaW4gYSBncmFwaCBhbmQsIGlmIHBvc3NpYmxlLCBjcmVhdGUgYQorICoge0BsaW5rIFJlbGF0aXZlVmFsdWVQcm92aWRlcn0gZm9yIGl0LiBJZiBpdCBjYW4ndCwgaXQgc2ltcGx5IHJldHVybnMKKyAqIDxjb2RlPm51bGw8L2NvZGU+IGFzIHRoZSByZXN1bHQgb2YgdGhlIGF0dGVtcHQuIFRoZSBmYWN0b3J5IGNhbiBiZQorICogZ2VuZXJpY2FsbHkgZXh0ZW5kZWQgdG8gZW5jb21wYXNzIG5ldyBncmFwaCBjb21wb25lbnRzLiBUaGlzIGFsbG93cyBjbGllbnRzCisgKiBvZiB0aGUgZmFjdG9yeSB0byBvYnRhaW4gYWRhcHRlcnMgZm9yIGZ1dHVyZSBlbmhhbmNlbWVudHMgd2l0aCBubyBjaGFuZ2UgdG8KKyAqIHRoZSBpbnRlcmZhY2UuIEFuIGV4YW1wbGUgb2YgdGhpcyBpcyB0aGUKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeX0KKyAqIHdoaWNoIHByb3ZpZGVzIHJlbGF0aXZlIHZhbHVlcyBmb3IgcHJvcGVydGllcyBvZiB0aGUgInN0YW5kYXJkIiBTVEVNIGRpc2Vhc2UKKyAqIG1vZGVsIGNvbXBvbmVudHMsIGluIHBhcnRpY3VsYXIsIGZvciB0aGUgZGlzZWFzZSBtb2RlbCBsYWJlbCB2YWx1ZXMgKGUuZy4sCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZX0sCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsVmFsdWV9LCBhbmQKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsVmFsdWV9KS4KKyAqIDxwPgorICogVGhpcyBleGFtcGxlIGlsbHVzdHJhdGVzIGhvdyB0byB0cmFjayB3aGljaCBzaW11bGF0aW9uIGlzIHNlbGVjdGVkIGFuZCB0aGVuCisgKiBob3cgdG8gZXh0cmFjdCB0aGUgc2ltdWxhdGlvbidzIHVuZGVybHlpbmcKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW99IGFuZCB0aGVuIGZyb20gdGhhdCBvYnRhaW4KKyAqIHRoZSA8ZW0+Y2Fub25pY2FsIGdyYXBoPC9lbT4uIFRoZSBjYW5vbmljYWwgZ3JhcGggaXMgdGhlIGFjdHVhbCBncmFwaCB1c2VkCisgKiB0byByZXByZXNlbnQgdGhlIHNpbXVsYXRpb24gc3RhdGUgaW5mb3JtYXRpb24uIFRoZSBzaW11bGF0aW9uIHByb2NlZWRzIGJ5CisgKiB1cGRhdGluZyB0aGUgdmFsdWVzIG9mIGxhYmVscyBvbiBlZGdlcyBhbmQgbm9kZXMgaW4gdGhlIGdyYXBoLiBUaGUgZXhhbXBsZQorICogc2hvd3MgaG93IHRvIG9idGFpbiB0aGUgZGVjb3JhdG9ycyAoZS5nLiwgZGlzZWFzZSBtb2RlbHMgc3VjaCBhcworICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbH0pCisgKiB0aGF0IHVwZGF0ZSB0aGUgc3RhdGUgb2YgdGhlIGdyYXBoIGFuZCB0aGVuIGZyb20gdGhvc2UgZGlzY292ZXIgcHJvcGVydGllcworICogdGhhdCBjYW4gaGF2ZSByZWxhdGl2ZSB2YWx1ZXMuIFRoZSBleGFtcGxlIHRoZW4gc2hvd3MgaG93IHRvIHVzZSB0aGUgYWRhcHRlcgorICogZmFjdG9yeSB0byBjcmVhdGUge0BsaW5rIFJlbGF0aXZlVmFsdWVQcm92aWRlcn0ncy4KKyAqIDxwPgorICogVG8gc2VlIHRoZSBleGFtcGxlIGluIGFjdGlvbiwgeW91IG5lZWQgdG86CisgKiA8b2w+CisgKiA8bGk+IFJ1biBTVEVNPC9saT4KKyAqIDxsaT4gT3BlbiB0aGUgIlJlbGF0aXZlIFZhbHVlIFZpZXcgRXhhbXBsZSIgdmlldy4KKyAqICJXaW5kb3ctPlNob3cmbmJzcDtWaWV3LT5PdGhlci0+U1RFTS0+UmVsYXRpdmUmbmJzcDtWYWx1ZSZuYnNwO1ZpZXcmbmJzcDtFeGFtcGxlIjwvbGk+CisgKiA8bGk+IE9wZW4gdGhlICJBY3RpdmUgU2ltdWxhdGlvbnMiIHZpZXcuCisgKiAiV2luZG93LT5TaG93Jm5ic3A7Vmlldy0+QWN0aXZlJm5ic3A7U2ltdWxhdGlvbnMiPC9saT4uCisgKiAKKyAqIDxsaT4gR28gdG8gdGhlICJTY2VuYXJpb3MiIHZpZXcuIEl0IHNob3dzIHRoZSBTVEVNIFNjZW5hcmlvcyB0aGF0IGFyZSBwbHVnZ2VkCisgKiBpbnRvIFNURU0uIDwvbGk+CisgKiA8bGk+IEV4cGFuZCAiVGVzdC0+RGlzZWFzZSZuYnNwO01vZGVscy0+U3RhbmRhcmQiIGFuZCB5b3UnbGwgc2VlIGRpc2Vhc2UKKyAqIG1vZGVsaW5nIHNjZW5hcmlvcyB0aGF0IGFyZSBwbHVnZ2VkIGludG8gU1RFTS4gPC9saT4KKyAqIDxsaT4gRG91YmxlLWNsaWNrIG9uIGEgc2NlbmFyaW8gaW4gdGhlIGxpc3QgKGUuZy4sICJTRUlSIDEgeCAxIikgaXQgd2lsbAorICogYmVnaW4gc2ltdWxhdGlvbiBhbmQgYW4gZW50cnkgd2lsbCBhcHBlYXIgaW4gdGhlICJBY3RpdmUgU2ltdWxhdGlvbnMiIHZpZXcuCisgKiA8L2xpPgorICogPGxpPiBTaW5nbGUgY2xpY2sgb24gdGhlIGVudHJ5IGluIHRoZSBBY3RpdmUgU2ltdWxhdGlvbnMgdmlldy4gVGhpcyB3aWxsCisgKiBzZWxlY3QgdGhhdCBzaW11bGF0aW9uIGFuZCB0aGUgcmVsYXRpdmUgdmFsdWVzIGZvciB0aGF0IHNjZW5hcmlvIHdpbGwgYXBwZWFyCisgKiBpbiB0aGUgUmVsYXRpdmUgVmFsdWUgVmlldyBFeGFtcGxlIHZpZXcuPC9saT4KKyAqIDwvb2w+CisgKiBJZiB5b3UgZG91YmxlLWNsaWNrIG9uIGFub3RoZXIgcGx1Z2dlZC1pbiBTY2VuYXJpbyBzbyB0aGF0IHR3byBlbnRyaWVzIGFyZQorICogZGlzcGxheWVkIGluIHRoZSBBY3RpdmUgU2ltdWxhdGlvbnMgdmlldyBhbmQgaWYgeW91IHNlbGVjdCBib3RoLCB5b3UnbGwgc2VlCisgKiBkYXRhIGZyb20gYm90aCBzaW11bGF0aW9ucy4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgUmVsYXRpdmVWYWx1ZVZpZXdFeGFtcGxlIGV4dGVuZHMgVmlld1BhcnQgeworCisJLyoqCisJICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIFJlbGF0aXZlIFZhbHVlIFZpZXcgRXhhbXBsZSBWaWV3LiBOb2JvZHkgdXNlcyB0aGlzCisJICogcmlnaHQgbm93LCBidXQgaXQgd291bGQgYmUgdXNlZnVsIGlmIHdlIHdhbnRlZCB0byBwcm9ncmFtYXRpY2FsbHkgYWRkCisJICogdGhpcyB2aWV3IHRvIGEgcGVyc3BlY3RpdmUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfVklFV19FWEFNUExFMV9WSUVXID0gIm9yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlLmFkYXB0ZXIucmVsYXRpdmV2YWx1ZXZpZXdleGFtcGxlIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1CRVJfT0ZfRlJBQ1RJT05BTF9ESUdJVFMgPSAyOworCisJVHJlZVZpZXdlciB0cmVlVmlld2VyID0gbnVsbDsKKworCXByaXZhdGUgc3RhdGljIE51bWJlckZvcm1hdCBmb3JtYXR0ZXIgPSBudWxsOworCisJLyoqCisJICogQHJldHVybiBhIG51bWJlciBmb3JtYXR0ZXIKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIE51bWJlckZvcm1hdCBnZXRGb3JtYXR0ZXIoKSB7CisJCS8vIElzIHRoZXJlIGFscmVhZHkgYSBmb3JtYXR0ZXI/CisJCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgeworCQkJLy8gTm8KKwkJCWZvcm1hdHRlciA9IE51bWJlckZvcm1hdC5nZXROdW1iZXJJbnN0YW5jZSgpOworCQkJZm9ybWF0dGVyLnNldE1heGltdW1GcmFjdGlvbkRpZ2l0cyhOVU1CRVJfT0ZfRlJBQ1RJT05BTF9ESUdJVFMpOworCQkJZm9ybWF0dGVyLnNldE1pbmltdW1GcmFjdGlvbkRpZ2l0cyhOVU1CRVJfT0ZfRlJBQ1RJT05BTF9ESUdJVFMpOworCQl9CisJCXJldHVybiBmb3JtYXR0ZXI7CisJfSAvLyBnZXRGb3JtYXR0ZXIKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB2aWV3IGlzIGNyZWF0ZWQgYW5kIGl0IGhhcyB0aGUKKwkgKiByZXNwb25zaWJpbGl0eSBmb3IgZG9pbmcgYWxsIG9mIHRoZSBpbml0aWFsaXphdGlvbi4gSXQgY3JlYXRlcyB0aGUKKwkgKiBUcmVlVmlld2VyIGFuZCBpbnN0YW5jZXMgb2YgdGhlIENvbnRlbnRQcm92aWRlciBhbmQgTGFiZWxQcm92aWRlciBmb3IgdGhlCisJICogdmlld2VyLiBJdCBhbHNvIGdldHMgYSByZWZlcmVuY2UgdG8gdGhlIHNlbGVjdGlvbiBzZXJ2aWNlIGFuZCByZWdpc3RlcnMKKwkgKiB0aGUgY29udGVudCBwcm92aWRlciBzbyBpdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gc29tZXRoaW5nIGlzIHNlbGVjdGVkLgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCS8vIENyZWF0ZSB0aGUgVHJlZVZpZXdlcgorCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSF9TQ1JPTEwKKwkJCQl8IFNXVC5WX1NDUk9MTCk7CisKKwkJZmluYWwgVHJlZSB0cmVlID0gdHJlZVZpZXdlci5nZXRUcmVlKCk7CisJCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOworCQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7CisKKwkJZmluYWwgVHJlZUNvbHVtbiBzaW11bGF0aW9uQ29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOworCQlzaW11bGF0aW9uQ29sdW1uLnNldFRleHQoIlNpbXVsYXRpb24iKTsKKwkJc2ltdWxhdGlvbkNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7CisJCXNpbXVsYXRpb25Db2x1bW4uc2V0V2lkdGgoMjAwKTsKKwkJc2ltdWxhdGlvbkNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQlTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJKChSZWxhdGl2ZVZhbHVlVmlld1NvcnRlcikgdHJlZVZpZXdlci5nZXRTb3J0ZXIoKSkuZG9Tb3J0KDApOworCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCh0cnVlKTsKKwkJCX0KKwkJfSk7CisKKwkJZmluYWwgVHJlZUNvbHVtbiBkZWNvcmF0b3JDb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7CisJCWRlY29yYXRvckNvbHVtbi5zZXRUZXh0KCJEZWNvcmF0b3IiKTsKKwkJZGVjb3JhdG9yQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKKwkJZGVjb3JhdG9yQ29sdW1uLnNldFdpZHRoKDIwMCk7CisJCWRlY29yYXRvckNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQlTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJKChSZWxhdGl2ZVZhbHVlVmlld1NvcnRlcikgdHJlZVZpZXdlci5nZXRTb3J0ZXIoKSkuZG9Tb3J0KDEpOworCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCh0cnVlKTsKKwkJCX0KKwkJfSk7CisKKwkJZmluYWwgVHJlZUNvbHVtbiBub2RlQ29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOworCQlub2RlQ29sdW1uLnNldFRleHQoIk5vZGUiKTsKKwkJbm9kZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7CisJCW5vZGVDb2x1bW4uc2V0V2lkdGgoMTAwKTsKKwkJbm9kZUNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQlTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJKChSZWxhdGl2ZVZhbHVlVmlld1NvcnRlcikgdHJlZVZpZXdlci5nZXRTb3J0ZXIoKSkuZG9Tb3J0KDIpOworCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCh0cnVlKTsKKwkJCX0KKwkJfSk7CisKKwkJZmluYWwgVHJlZUNvbHVtbiBjdXJyZW50VmFsdWVDb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7CisJCWN1cnJlbnRWYWx1ZUNvbHVtbi5zZXRUZXh0KCJDdXJyZW50IFZhbHVlcyIpOworCQljdXJyZW50VmFsdWVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOworCQljdXJyZW50VmFsdWVDb2x1bW4uc2V0V2lkdGgoMTAwKTsKKwkJY3VycmVudFZhbHVlQ29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJCVNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkoKFJlbGF0aXZlVmFsdWVWaWV3U29ydGVyKSB0cmVlVmlld2VyLmdldFNvcnRlcigpKS5kb1NvcnQoMyk7CisJCQkJdHJlZVZpZXdlci5yZWZyZXNoKHRydWUpOworCQkJfQorCQl9KTsKKworCQlmaW5hbCBUcmVlQ29sdW1uIHJlbGF0aXZlVmFsdWVDb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7CisJCXJlbGF0aXZlVmFsdWVDb2x1bW4uc2V0VGV4dCgiUmVsYXRpdmUgVmFsdWVzIik7CisJCXJlbGF0aXZlVmFsdWVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOworCQlyZWxhdGl2ZVZhbHVlQ29sdW1uLnNldFdpZHRoKDEwMCk7CisJCWN1cnJlbnRWYWx1ZUNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQlTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJKChSZWxhdGl2ZVZhbHVlVmlld1NvcnRlcikgdHJlZVZpZXdlci5nZXRTb3J0ZXIoKSkuZG9Tb3J0KDQpOworCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCh0cnVlKTsKKwkJCX0KKwkJfSk7CisKKwkJLy8gTGV0IHRoZSBMaXN0Vmlld2VyIGtub3cgd2hvIGl0cyBjb250ZW50IGFuZCBsYWJlbCBwcm92aWRlcnMgYXJlCisJCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBSZWxhdGl2ZVZhbHVlVmlld0NvbnRlbnRQcm92aWRlcigpKTsKKwkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBSZWxhdGl2ZVZhbHVlVmlld0xhYmVsUHJvdmlkZXIoKSk7CisJCXRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBSZWxhdGl2ZVZhbHVlVmlld1NvcnRlcigpKTsKKworCQkvLyBUaGlzIGNhbGwgdGVsbHMgdGhlIHZpZXdlcidzIGNvbnRlbnQgcHJvdmlkZXIgd2hlcmUgaXQgc2hvdWxkIGdldCB0aGUKKwkJLy8gc291cmNlIG9mIGl0cyBjb250ZW50LiBJbiB0aGlzIGNhc2UgaXQgaXMgdGhlIHNlbGVjdGlvbiBzZXJ2aWNlLgorCQl0cmVlVmlld2VyLnNldElucHV0KGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKQorCQkJCS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkpOworCisJCS8vIFdlIGFsc28gd2FudCB0byBiZSBhYmxlIHRvIGhhdmUgYSB1c2VyIHNlbGVjdCBhIHNpbWx1YXRpb24gZnJvbSBvdXIKKwkJLy8gdmlldyBhbmQgaGF2ZSB0aGF0IGJlIHNlZW4gYnkgb3RoZXJzLiBTbyB3ZSByZWdpc3RlciB0aGUgVHJlZVZpZXdlcgorCQkvLyBpbnN0YW5jZSBhcyB0aGUgdmlldydzIHNlbGVjdGlvbiBwcm92aWRlci4gV2hlbiB5b3UgY2xpY2sgb24gdGhlIHZpZXcKKwkJLy8gaW4gdGhlIGludGVyZmFjZSBpdCBmaW5kcyB0aGUgdW5kZXJseWluZyBPYmplY3QgKGkuZS4sIElTaW11bGF0aW9uKQorCQkvLyB5b3Ugc2VsZWN0ZWQgYW5kIHBhc3NlcyBpdCB0byB0aGUgc2VsZWN0aW9uIHNlcnZpY2UuCisJCS8vIGdldFNpdGUoKS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0cmVlVmlld2VyKTsKKworCX0gLy8gY3JlYXRlUGFydENvbnRyb2wKKworCS8qKgorCSAqIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIGludGVyZmFjZSwgYnV0IHdlJ3JlIG5vdCB1c2luZyBpdC4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCS8vIG5vdGhpbmcKKwl9IC8vIHNldEZvY3VzCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIHRoZSBjb250ZW50IHByb3ZpZGVyLgorCSAqLworCXB1YmxpYyBjbGFzcyBSZWxhdGl2ZVZhbHVlVmlld0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzCisJCQlJVHJlZUNvbnRlbnRQcm92aWRlciwgSVNlbGVjdGlvbkxpc3RlbmVyIHsKKworCQlJU2VsZWN0aW9uU2VydmljZSBzcyA9IG51bGw7CisKKwkJcHJpdmF0ZSBUcmVlVmlld2VyIHZpZXdlciA9IG51bGw7CisKKwkJcHJpdmF0ZSBMaXN0PElTaW11bGF0aW9uPiBzZWxlY3RlZFNpbXVsYXRpb25zOworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7CisJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgaW5wdXRFbGVtZW50IH07CisJCX0gLy8gZ2V0RWxlbWVudHMKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCisJCSAqLworCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKKwkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7CisJCQkvLyBXZSByZW1lbWJlciB0aGUgVHJlZVZpZXdlciB3ZSdyZSBwcm92aWRpbmcgY29udGVudCBmb3IgYmVjYXVzZQorCQkJLy8gd2UnbGwgaGF2ZSB0byBjaGFuZ2UgdGhlIGxpc3Qgb2YgdGhpbmdzIGl0IGNvbnRhaW5zIGluIHRoZQorCQkJLy8gc2VsZWN0aW9uQ2hhbmdlZCBtZXRob2QuCisJCQl0aGlzLnZpZXdlciA9IChUcmVlVmlld2VyKSB2aWV3ZXI7CisKKwkJCS8vIFdlcmUgd2UgcHJldmlvdXNseSBnZXR0aW5nIGlucHV0IGZyb20gYSBkaWZmZXJlbnQgc2VydmljZT8KKwkJCWlmIChvbGRJbnB1dCAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJLy8gTm90IGFueSBtb3JlLgorCQkJCWZpbmFsIElTZWxlY3Rpb25TZXJ2aWNlIG9sZFNTID0gKElTZWxlY3Rpb25TZXJ2aWNlKSBvbGRJbnB1dDsKKwkJCQlvbGRTUy5yZW1vdmVQb3N0U2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQl9CisKKwkJCS8vIElzIHRoZXJlIHNvbWUgbmV3IGlucHV0IHdlIHNob3VsZCByZWdpc3RlciB3aXRoPworCQkJaWYgKG5ld0lucHV0ICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQkvLyBSZWdpc3RlciB1cyB3aXRoIHRoZSBuZXcgc2VydmljZS4gU2luY2UgdGhlcmUgc2hvdWxkIG9ubHkKKwkJCQkvLyByZWFsbHkgYmUgb25lIHNlbGVjdGlvbiBzZXJ2aWNlIGluIEVjbGlwc2UsIHRoaXMgd291bGQgb25seQorCQkJCS8vIGhhcHBlbiBvbmNlLCBob3dldmVyLCB0aGUgY29kZSBjYW4gaGFuZGxlIGEgY2hhbmdlIGlmIG5lZWRlZC4KKwkJCQlzcyA9IChJU2VsZWN0aW9uU2VydmljZSkgbmV3SW5wdXQ7CisJCQkJc3MuYWRkUG9zdFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJfQorCisJCX0gLy8gaW5wdXRDaGFuZ2VkCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7CisJCQlPYmplY3RbXSByZXRWYWx1ZSA9IG51bGw7CisJCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElTZWxlY3Rpb25TZXJ2aWNlKSB7CisJCQkJcmV0VmFsdWUgPSBzZWxlY3RlZFNpbXVsYXRpb25zID09IG51bGwgPyBudWxsCisJCQkJCQk6IHNlbGVjdGVkU2ltdWxhdGlvbnMudG9BcnJheSgpOworCQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVNpbXVsYXRpb24pIHsKKwkJCQlJU2ltdWxhdGlvbiBzaW11bGF0aW9uID0gKElTaW11bGF0aW9uKSBwYXJlbnRFbGVtZW50OworCQkJCXJldFZhbHVlID0gc2ltdWxhdGlvbi5nZXRTY2VuYXJpbygpLmdldENhbm9uaWNhbEdyYXBoKCkKKwkJCQkJCS5nZXREZWNvcmF0b3JzKCkudG9BcnJheSgpOworCQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRGVjb3JhdG9yKSB7CisJCQkJRGVjb3JhdG9yIGRlY29yYXRvciA9IChEZWNvcmF0b3IpIHBhcmVudEVsZW1lbnQ7CisJCQkJcmV0VmFsdWUgPSBkZWNvcmF0b3IuZ2V0TGFiZWxzVG9VcGRhdGUoKS50b0FycmF5KCk7CisJCQl9CisKKwkJCS8vIGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBMYWJlbCkgeworCQkJLy8gTGFiZWwgbGFiZWwgPSAoTGFiZWwpIHBhcmVudEVsZW1lbnQ7CisJCQkvLyBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIgcnZwID0gKFJlbGF0aXZlVmFsdWVQcm92aWRlcikKKwkJCS8vIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkvLyAuYWRhcHQobGFiZWwsIFJlbGF0aXZlVmFsdWVQcm92aWRlci5jbGFzcyk7CisJCQkvLyByZXRWYWx1ZSA9IHJ2cC5nZXRQcm9wZXJ0aWVzKCkudG9BcnJheSgpOworCQkJLy8gfQorCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGdldENoaWxkcmVuCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJudWxsIikKKwkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCU9iamVjdCByZXRWYWx1ZSA9IG51bGw7CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZWxlY3Rpb25TZXJ2aWNlKSB7CisJCQkJcmV0VmFsdWUgPSBudWxsOworCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNpbXVsYXRpb24pIHsKKwkJCQlyZXRWYWx1ZSA9IHNzOworCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVjb3JhdG9yKSB7CisJCQkJRGVjb3JhdG9yIGRlY29yYXRvciA9IChEZWNvcmF0b3IpIGVsZW1lbnQ7CisJCQkJcmV0VmFsdWUgPSBkZWNvcmF0b3IuZUNvbnRhaW5lcigpLmVDb250YWluZXIoKTsKKwkJCX0KKwkJCS8vIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTGFiZWwpIHsKKwkJCS8vIExhYmVsIGxhYmVsID0gKExhYmVsKSBlbGVtZW50OworCQkJLy8gbGFiZWwuZworCQkJLy8gfQorCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGdldFBhcmVudAorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7CisJCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZWxlY3Rpb25TZXJ2aWNlKSB7CisJCQkJcmV0VmFsdWUgPSBzZWxlY3RlZFNpbXVsYXRpb25zICE9IG51bGwKKwkJCQkJCSYmIHNlbGVjdGVkU2ltdWxhdGlvbnMuc2l6ZSgpID4gMDsKKwkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTaW11bGF0aW9uKSB7CisJCQkJZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IChJU2ltdWxhdGlvbikgZWxlbWVudDsKKwkJCQlmaW5hbCBHcmFwaCBjYW5vbmljYWxHcmFwaCA9IHNpbXVsYXRpb24uZ2V0U2NlbmFyaW8oKQorCQkJCQkJLmdldENhbm9uaWNhbEdyYXBoKCk7CisJCQkJLy8gRG8gd2UgaGF2ZSBhIGNhbm9uaWNhbCBHcmFwaCB5ZXQ/CisJCQkJaWYgKGNhbm9uaWNhbEdyYXBoICE9IG51bGwpIHsKKwkJCQkJLy8gWWVzCisJCQkJCXJldFZhbHVlID0gY2Fub25pY2FsR3JhcGguZ2V0RGVjb3JhdG9ycygpLnNpemUoKSA+IDA7CisJCQkJfSAvLyBpZgorCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVjb3JhdG9yKSB7CisJCQkJRGVjb3JhdG9yIGRlY29yYXRvciA9IChEZWNvcmF0b3IpIGVsZW1lbnQ7CisJCQkJcmV0VmFsdWUgPSBkZWNvcmF0b3IuZ2V0TGFiZWxzVG9VcGRhdGUoKS5zaXplKCkgPiAwOworCQkJfQorCisJCQkvLyBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTGFiZWwpIHsKKwkJCS8vIExhYmVsIGxhYmVsID0gKExhYmVsKSBlbGVtZW50OworCQkJLy8gUmVsYXRpdmVWYWx1ZVByb3ZpZGVyIHJ2cCA9IChSZWxhdGl2ZVZhbHVlUHJvdmlkZXIpCisJCQkvLyBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJLy8gLmFkYXB0KGxhYmVsLCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIuY2xhc3MpOworCQkJLy8gcmV0VmFsdWUgPSBydnAgIT0gbnVsbCAmJiBydnAuZ2V0UHJvcGVydGllcygpLnNpemUoKSA+IDA7CisJCQkvLyB9CisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gaGFzQ2hpbGRyZW4KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwKKwkJICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCisJCSAqLworCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisKKwkJCS8vIElzIHRoaXMgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgY29taW5nIGZyb20gb3VyIHZpZXc/CisJCQlpZiAocGFydCAhPSBSZWxhdGl2ZVZhbHVlVmlld0V4YW1wbGUudGhpcykgeworCQkJCS8vIE5vCisJCQkJLy8gVGhpcyB3aWxsIGhvbGQgdGhlIG5ldyBzaW11bGF0aW9ucyB0aGF0IGhhdmUgYmVlbiBzZWxlY3RlZAorCQkJCWZpbmFsIExpc3Q8SVNpbXVsYXRpb24+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PElTaW11bGF0aW9uPigpOworCisJCQkJLy8gSXMgaXQgYSBzdHJ1Y3R1cmVkIHNlbGVjdGlvbj8KKwkJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCQkJLy8gWWVzCisJCQkJCWZpbmFsIExpc3QgbGlzdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKKwkJCQkJCQkudG9MaXN0KCk7CisKKwkJCQkJLy8gR28gdGhyb3VnaCBldmVyeXRoaW5nIGluIHRoZSBsaXN0IG9mIHRoaW5ncyB0aGF0IHdlcmUKKwkJCQkJLy8gc2VsZWN0ZWQgYW5kIHBpY2sgb3V0IHRoZSBvbmVzIHRoYXQgYXJlIElTaW11bGF0aW9ucy4KKwkJCQkJZm9yIChmaW5hbCBJdGVyYXRvciBzZWxlY3Rpb25JdGVyID0gbGlzdC5pdGVyYXRvcigpOyBzZWxlY3Rpb25JdGVyCisJCQkJCQkJLmhhc05leHQoKTspIHsKKwkJCQkJCWZpbmFsIE9iamVjdCBvYmogPSBzZWxlY3Rpb25JdGVyLm5leHQoKTsKKwkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU2ltdWxhdGlvbikgeworCQkJCQkJCXRlbXAuYWRkKChJU2ltdWxhdGlvbikgb2JqKTsKKwkJCQkJCX0KKwkJCQkJfSAvLyBmb3IgZWFjaCBzZWxlY3RlZCBpdGVtCisJCQkJfSAvLyBpZiBzdHJ1Y3R1cmVkIHNlbGVjdGlvbgorCisJCQkJLy8gRGlkIHdlIGZpbmQgYW55IG5ldyBzaW11bGF0aW9ucyB0aGF0IHdlcmUgc2VsZWN0ZWQ/CisJCQkJaWYgKHRlbXAuc2l6ZSgpID4gMCkgeworCQkJCQkvLyBZZXMKKwkJCQkJLy8gVGVsbCB0aGUgTGlzdFZpZXdlciBub3QgdG8gcmVkcmF3IHdoaWxlIHdlJ3JlIGNoYW5naW5nCisJCQkJCS8vIGl0cyBsaXN0LgorCQkJCQl2aWV3ZXIuZ2V0VHJlZSgpLnNldFJlZHJhdyhmYWxzZSk7CisJCQkJCXRyeSB7CisJCQkJCQkvLyBEbyB3ZSBoYXZlIGFueSBvbGQgc2VsZWN0aW9ucyB3ZSBzaG91bGQgcmVtb3ZlPworCQkJCQkJaWYgKHNlbGVjdGVkU2ltdWxhdGlvbnMgIT0gbnVsbCkgeworCQkJCQkJCS8vIFllcworCQkJCQkJCXZpZXdlci5yZW1vdmUoc2VsZWN0ZWRTaW11bGF0aW9ucy50b0FycmF5KCkpOworCQkJCQkJfQorCQkJCQkJLy8gQWRkIHRoZSBuZXcgc2VsZWN0aW9ucyB0byB0aGUgTGlzdFZpZXdlcidzIGxpc3QuIEl0CisJCQkJCQkvLyB3aWxsIHVzZSB0aGUgbGFiZWwgcHJvdmlkZXIgdG8gZ2V0IGEgdGV4dCBzdHJpbmcgZm9yCisJCQkJCQkvLyBlYWNoIG9uZS4KKwkJCQkJCXZpZXdlci5hZGQoc3MsIHRlbXAudG9BcnJheSgpKTsKKworCQkJCQkJLy8gUmVtZW1iZXIgd2hhdCB3ZSBhZGRlZCB0aGlzIHRpbWUgc28gd2UgY2FuIHJlbW92ZSBpdAorCQkJCQkJLy8gbmV4dCBzZWxlY3Rpb24uCisJCQkJCQlzZWxlY3RlZFNpbXVsYXRpb25zID0gdGVtcDsKKwkJCQkJfSAvLyB0cnkKKwkJCQkJZmluYWxseSB7CisJCQkJCQkvLyBUaGUgTGlzdFZpZXdlciBzaG91bGQgdXBkYXRlIGl0c2VsZiBub3cuCisJCQkJCQl2aWV3ZXIuZ2V0VHJlZSgpLnNldFJlZHJhdyh0cnVlKTsKKwkJCQkJfQorCQkJCX0gLy8gaWYgYW55IG5ldyBzaW11bGF0aW9ucyBzZWxlY3RlZAorCQkJfSAvLyBpZiBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCBjb21pbmcgZnJvbSBvdXIgdmlldz8KKworCQl9IC8vIHNlbGVjdGlvbkNoYW5nZWQKKworCX0gLy8gUmVsYXRpdmVWYWx1ZVZpZXdDb250ZW50UHJvdmlkZXIKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYSBMYWJlbCBwcm92aWRlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgUmVsYXRpdmVWYWx1ZVZpZXdMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIsCisJCQlJVGFibGVMYWJlbFByb3ZpZGVyLCBJVGFibGVDb2xvclByb3ZpZGVyIHsKKworCQlwcml2YXRlIGZpbmFsIExpc3Q8SUxhYmVsUHJvdmlkZXJMaXN0ZW5lcj4gbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJTGFiZWxQcm92aWRlckxpc3RlbmVyPigpOworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJT2JqZWN0IGVsZW1lbnQpIHsKKwkJCXJldHVybiBudWxsOworCQl9IC8vIGdldEltYWdlCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCVN0cmluZyByZXRWYWx1ZSA9ICIiOworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VsZWN0aW9uU2VydmljZSkgeworCQkJCXJldFZhbHVlID0gIkFjdGl2ZSBTaW11bGF0aW9ucyI7CisJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2ltdWxhdGlvbikgeworCQkJCUlTaW11bGF0aW9uIHNpbXVsYXRpb24gPSAoSVNpbXVsYXRpb24pIGVsZW1lbnQ7CisJCQkJcmV0VmFsdWUgPSBzaW11bGF0aW9uLmdldE5hbWUoKSArICIgKCIKKwkJCQkJCSsgc2ltdWxhdGlvbi5nZXRTZXF1ZW5jZU51bWJlcigpICsgIikiOworCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVjb3JhdG9yKSB7CisJCQkJRGVjb3JhdG9yIGRlY29yYXRvciA9IChEZWNvcmF0b3IpIGVsZW1lbnQ7CisJCQkJLy8gZmluYWwgU3RyaW5nIHRpdGxlID0gZGVjb3JhdG9yLmdldER1YmxpbkNvcmUoKS5nZXRUaXRsZSgpOworCQkJCS8vIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJCXJldFZhbHVlID0gZGVjb3JhdG9yLnRvU3RyaW5nKCk7CisJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlTGFiZWwpIHsKKwkJCQlOb2RlTGFiZWwgbm9kZUxhYmVsID0gKE5vZGVMYWJlbCkgZWxlbWVudDsKKwkJCQlyZXRWYWx1ZSA9IG5vZGVMYWJlbC5nZXROb2RlKCkuZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCk7CisJCQkJcmV0VmFsdWUgPSByZXRWYWx1ZSA9PSBudWxsID8gIkxhYmVsIiA6IHJldFZhbHVlOworCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgeworCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkgPSAoSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgZWxlbWVudDsKKwkJCQlyZXRWYWx1ZSA9IHByb3BlcnR5LmdldERpc3BsYXlOYW1lKG51bGwpOworCQkJfQorCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGdldFRleHQKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKKwkJICogICAgICBpbnQpCisJCSAqLworCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCU9iamVjdCBlbGVtZW50LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJaW50IGNvbHVtbkluZGV4KSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSAvLyBnZXRDb2x1bW5JbWFnZQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCisJCSAqICAgICAgaW50KQorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKKwkJCVN0cmluZyByZXRWYWx1ZSA9ICIiOworCQkJaWYgKGNvbHVtbkluZGV4ID09IDAgJiYgZWxlbWVudCBpbnN0YW5jZW9mIElTZWxlY3Rpb25TZXJ2aWNlKSB7CisJCQkJcmV0VmFsdWUgPSAiQWN0aXZlIFNpbXVsYXRpb25zIjsKKwkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMCAmJiBlbGVtZW50IGluc3RhbmNlb2YgSVNpbXVsYXRpb24pIHsKKwkJCQlJU2ltdWxhdGlvbiBzaW11bGF0aW9uID0gKElTaW11bGF0aW9uKSBlbGVtZW50OworCQkJCXJldFZhbHVlID0gc2ltdWxhdGlvbi5nZXROYW1lKCkgKyAiICgiCisJCQkJCQkrIHNpbXVsYXRpb24uZ2V0U2VxdWVuY2VOdW1iZXIoKSArICIpIjsKKwkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSAmJiBlbGVtZW50IGluc3RhbmNlb2YgRGVjb3JhdG9yKSB7CisJCQkJRGVjb3JhdG9yIGRlY29yYXRvciA9IChEZWNvcmF0b3IpIGVsZW1lbnQ7CisJCQkJLy8gZmluYWwgU3RyaW5nIHRpdGxlID0gZGVjb3JhdG9yLmdldER1YmxpbkNvcmUoKS5nZXRUaXRsZSgpOworCQkJCS8vIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJCXJldFZhbHVlID0gZGVjb3JhdG9yLnRvU3RyaW5nKCk7CisJCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIgJiYgZWxlbWVudCBpbnN0YW5jZW9mIE5vZGVMYWJlbCkgeworCQkJCU5vZGVMYWJlbCBub2RlTGFiZWwgPSAoTm9kZUxhYmVsKSBlbGVtZW50OworCQkJCXJldFZhbHVlID0gbm9kZUxhYmVsLmdldE5vZGUoKS5nZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKTsKKwkJCQlyZXRWYWx1ZSA9IHJldFZhbHVlID09IG51bGwgPyAiTm9kZSIgOiByZXRWYWx1ZTsKKwkJCX0KKworCQkJZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMyAmJiBlbGVtZW50IGluc3RhbmNlb2YgTm9kZUxhYmVsKSB7CisJCQkJTm9kZUxhYmVsIG5vZGVMYWJlbCA9IChOb2RlTGFiZWwpIGVsZW1lbnQ7CisJCQkJcmV0VmFsdWUgPSBub2RlTGFiZWwuZ2V0Q3VycmVudFZhbHVlKCkudG9TdHJpbmcoKTsKKwkJCX0gLy8gZWxzZSBpbmRleCA9IDMgJiYgTm9kZUxhYmVsCisKKwkJCWVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDQgJiYgZWxlbWVudCBpbnN0YW5jZW9mIE5vZGVMYWJlbCkgeworCQkJCQorCQkJCVJlbGF0aXZlVmFsdWVQcm92aWRlciBydnAgPSAoUmVsYXRpdmVWYWx1ZVByb3ZpZGVyKSBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkJLmFkYXB0KGVsZW1lbnQsIFJlbGF0aXZlVmFsdWVQcm92aWRlci5jbGFzcyk7CisJCQkJLy8gRG9lcyB0aGUgbGFiZWwgaGF2ZSByZWxhdGl2ZSB2YWx1ZXM/CisJCQkJaWYgKHJ2cCAhPSBudWxsKSB7CisJCQkJCS8vIFllcworCisJCQkJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJCQlmb3IgKEl0ZXJhdG9yIHByb3BlcnR5SXRlciA9IHJ2cC5nZXRQcm9wZXJ0aWVzKCkuaXRlcmF0b3IoKTsgcHJvcGVydHlJdGVyCisJCQkJCQkJLmhhc05leHQoKTspIHsKKwkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkgPSAoSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgcHJvcGVydHlJdGVyCisJCQkJCQkJCS5uZXh0KCk7CisJCQkJCQlzYi5hcHBlbmQocHJvcGVydHkuZ2V0RGlzcGxheU5hbWUocHJvcGVydHkpKTsKKwkJCQkJCXNiLmFwcGVuZCgiOiAiKTsKKworCQkJCQkJc2IuYXBwZW5kKGdldEZvcm1hdHRlcigpLmZvcm1hdCgKKwkJCQkJCQkJcnZwLmdldFJlbGF0aXZlVmFsdWUocHJvcGVydHkpKSk7CisKKwkJCQkJCWlmIChwcm9wZXJ0eUl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJCQkJc2IuYXBwZW5kKCIsICIpOworCQkJCQkJfQorCQkJCQl9IC8vIGZvciBlYWNoIHByb3BlcnR5CisJCQkJCXJldFZhbHVlID0gc2IudG9TdHJpbmcoKTsKKwkJCQl9IC8vIGlmCisJCQkJZWxzZSB7CisJCQkJCXJldFZhbHVlID0gIiI7CisJCQkJfQorCQkJfSAvLyBlbHNlIGluZGV4ID0gNCAmJiBOb2RlTGFiZWwKKworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGdldENvbHVtblRleHQKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUNvbG9yUHJvdmlkZXIjZ2V0QmFja2dyb3VuZChqYXZhLmxhbmcuT2JqZWN0LAorCQkgKiAgICAgIGludCkKKwkJICovCisJCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQlPYmplY3QgZWxlbWVudCwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCWludCBjb2x1bW5JbmRleCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUNvbG9yUHJvdmlkZXIjZ2V0Rm9yZWdyb3VuZChqYXZhLmxhbmcuT2JqZWN0LAorCQkgKiAgICAgIGludCkKKwkJICovCisJCXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQlPYmplY3QgZWxlbWVudCwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCWludCBjb2x1bW5JbmRleCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKKwkJICovCisJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKKwkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQlPYmplY3QgZWxlbWVudCwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCVN0cmluZyBwcm9wZXJ0eSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQorCQkgKi8KKwkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJCX0gLy8gYWRkTGlzdGVuZXIKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCisJCSAqLworCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwkJfSAvLyByZW1vdmVMaXN0ZW5lcgorCisJfSAvLyBSZWxhdGl2ZVZhbHVlVmlld0xhYmVsUHJvdmlkZXIKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgc29ydGluZyBvZiB0aGUgUmVsYXRpdmVWYWx1ZSBWaWV3IHZpZXdlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgUmVsYXRpdmVWYWx1ZVZpZXdTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgeworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNDRU5ESU5HID0gMDsKKworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVTQ0VORElORyA9IDE7CisKKwkJcHJpdmF0ZSBpbnQgY29sdW1uID0gLTE7CisKKwkJcHJpdmF0ZSBpbnQgZGlyZWN0aW9uID0gQVNDRU5ESU5HOworCisJCS8qKgorCQkgKiBAcGFyYW0gY29sdW1uCisJCSAqICAgICAgICAgICAgdGhlIGNvbHVtbiB0byBzb3J0CisJCSAqLworCQlwdWJsaWMgdm9pZCBkb1NvcnQoaW50IGNvbHVtbikgeworCQkJZGlyZWN0aW9uID0gdGhpcy5jb2x1bW4gPT0gY29sdW1uID8gMSAtIGRpcmVjdGlvbiA6IEFTQ0VORElORzsKKwkJCXRoaXMuY29sdW1uID0gY29sdW1uOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yI2NvbXBhcmUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCisJCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKKwkJCWludCByYyA9IHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOworCQkJaWYgKGRpcmVjdGlvbiA9PSBERVNDRU5ESU5HKSB7CisJCQkJcmMgPSAtcmM7CisJCQl9CisJCQlyZXR1cm4gcmM7CisJCX0gLy8gY29tcGFyZQorCisJfSAvLyBSZWxhdGl2ZVZhbHVlVmlld1NvcnRlcgorfSAvLyBSZWxhdGl2ZVZhbHVlVmlld0V4YW1wbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NhbXBsZS9hZGFwdGlvbi9WaWV3RXhhbXBsZTEuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uc2FtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NhbXBsZS9hZGFwdGlvbi9WaWV3RXhhbXBsZTEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmE0MTYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zYW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc2FtcGxlL2FkYXB0aW9uL1ZpZXdFeGFtcGxlMS5qYXZhCkBAIC0wLDAgKzEsNDM2IEBACisvLyBWaWV3RXhhbXBsZTEuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS5hZGFwdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZ1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nLlNlZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvblNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHJ1biBHVUkgY29kZSBpbiBFY2xpcHNlIGFuZCBtb25pdG9yIHRoZQorICogInNlbGVjdGVkIiBzaW11bGF0aW9uLCBhbmQgaG93IHRvIGV4dHJhY3QgdGhlIGNhbm9uaWNhbCBncmFwaCBmcm9tIHRoZQorICogc2VsZWN0ZWQgc2ltdWxhdGlvbiBhbmQgdGhlbiBleHRyYWN0IGRhdGEgZnJvbSBpdC4KKyAqIDxwPgorICogSXQgY3JlYXRzIGFuIEVjbGlwc2UgIlZpZXciIGNhbGxlZCAiVmlldyBFeGFtcGxlMSIgdGhhdCBzaW1wbHkgImR1bXBzIiB0aGUKKyAqIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgZGF0YSBleHRyYWN0ZWQgZnJvbSB0aGUgY2Fub25pY2FsIGdyYXBoIHRvIHRoZSB2aWV3J3MKKyAqIHdpbmRvdy4gVGhlIGV4YW1wbGUgaXMgc2ltcGxlLCBidXQgaXQgaGVscHMgdG8gdW5kZXJzdGFuZCBob3cgYSBKRmFjZQorICogIlZpZXdlciIgKG5vdCB0aGUgc2FtZSBhcyBhbiBFY2xpcHNlICJWaWV3Iikgd29ya3Mgd2l0aCBjb250ZW50IGFuZCBsYWJlbAorICogcHJvdmlkZXJzLgorICogPHA+CisgKiBUaGVyZSBhcmUgdGhyZWUgY2xhc3NlcyBkZWZpbmVkIGluIHRoaXMgZXhhbXBsZS4gVGhlIGZpcnN0IGlzIHRoZSBwYXJlbnQKKyAqIGNsYXNzIHRoYXQgaXMgYSA8Y29kZT5WaWV3UGFydDwvY29kZT4gYW5kIGltcGxlbWVudHMgd2hhdCBpcyBzZWVuIGluIHRoZQorICogdmlldydzIHdpbmRvdyBpbiBFY2xpcHNlLiBJdCBjb250YWlucyBhIEpGYWNlIDxjb2RlPkxpc3RWaWV3ZXI8L2NvZGU+IHdoaWNoCisgKiBiYXNpY2FsbHkgbWFpbnRhaW5zIGEgbGlzdCBvZiBPYmplY3RzIGFuZCBjcmVhdGVzIGEgZGlzcGxheSB0aGF0IHByaW50cyBhCisgKiBkZXNjcmlwdGl2ZSB0ZXh0IHN0cmluZyBmb3IgZWFjaCBvbmUuIFRoZSBtZXRob2QKKyAqIDxjb2RlPmNyZWF0ZVBhcnRDb250cm9sPC9jb2RlPiBpcyB0aGUgY29kZSB0aGF0IGluaXRpYWxpemVzIHRoZSBTV1QKKyAqIGdyYXBoaWNzIGZvciB0aGUgZGlzcGxheSBvZiB0aGUgdmlldy4gSXQgaXMgcGFzc2VkIGFuIFNXVAorICogPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBpbnN0YW5jZSBjYWxsZWQgPGNvZGU+cGFyZW50PC9jb2RlPiB0aGF0IGlzIHVzZWQKKyAqIHRvICJjb250YWluIiB0aGUgU1dUL0pGYWNlIGVsZW1lbnRzIG9mIHRoZSB2aWV3J3MgdGhhdCBtYWtlIHVwIHRoZSBkaXNwbGF5IGluCisgKiB0aGUgdmlldy4gVGhlIG1ldGhvZCBkb2VzIHRocmVlIHRoaW5ncywgaXQgZmlyc3QgY3JlYXRlcyB0aGUKKyAqIDxjb2RlPkxpc3RWaWV3ZXI8L2NvZGU+IGluc3RhbmNlLCBnaXZpbmcgdGhlIHBhcmVudCBhcyBhbiBhcmd1bWVudCB0byB0aGUKKyAqIGNvbnN0cnVjdGVyICh0aGlzIG1ha2VzIGl0IHBhcnQgb2YgdGhlIGRpc3BsYXkpLCBpdCB0aGVuIGNyZWF0ZXMgYW5kIHBhc3NlcworICogdG8gdGhlIDxjb2RlPkxpc3RWaWV3ZXI8L2NvZGU+IHRoZSAiQ29udGVudCIgYW5kICJMYWJlbCIgcHJvdmlkZXJzIGl0CisgKiBuZWVkcy4gVGhlIENvbnRlbnQgYW5kIExhYmVsIHByb3ZpZGVycyBhcmUgdGhlIG90aGVyIHR3byBjbGFzc2VzIGluIHRoaXMKKyAqIGV4YW1wbGUuCisgKiA8cD4KKyAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGNsYXNzIGlzIHtAbGluayBWaWV3RXhhbXBsZTFDb250ZW50UHJvdmlkZXJ9LCB3aGlsZSBub3QKKyAqIGNvbXBsZXgsIGl0IG1heSBub3QgYmUgb2J2aW91cyB3aGF0J3MgaXQncyBkb2luZy4gSXQncyBqb2IgaXMgdG8gbWFpbnRhaW4gdGhlCisgKiBjb250ZW50cyBvZiB0aGUgPGNvZGU+TGlzdFZpZXdlcjwvY29kZT4ncyBpbnRlcm5hbCBsaXN0IG9mIHRoaW5ncyB0bworICogZGlzcGxheS4gSXQgcGVyZm9ybXMgdGhlICJDb250cm9sZXIiIGpvYiBpbiBhbiAiTVZDIiBhcmNoaXRlY3R1cmUuIEluIG91cgorICogZXhhbXBsZSwgdGhlIGNvbnRlbnQgcHJvdmlkZXIgaXMgYW4ge0BsaW5rIElTZWxlY3Rpb25MaXN0ZW5lcn0gd2hpY2ggbWVhbnMgaXQKKyAqIGhhcyBhIDxjb2RlPnNlbGVjdGlvbkNoYW5nZWQ8L2NvZGU+IG1ldGhvZC4gVGhlIGlkZWEgYmVoaW5kIHRoZSBtZXRob2QgaXMKKyAqIHRoYXQgaXQgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSB1c2VyICJzZWxlY3RzIiBzb21ldGhpbmcgaW4gdGhlIEVjbGlwc2UKKyAqIGludGVyZmFjZS4gVGhpcyBkb2Vzbid0IGhhcHBlbiBhdXRvbWF0aWNhbGx5LCBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgbXVzdAorICogYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBFY2xpcHNlICJzZWxlY3Rpb24gc2VydmljZSIgdGhhdCBzZXJ2ZXMgYXMgYSBjZW50cmFsCisgKiBkaXNwYXRjaGVyIGZvciBzZWxlY3Rpb25zLiBUaGlzIHJlZ2lzdHJhdGlvbiBpcyBkb25lIGluIHRoZQorICogPGNvZGU+Y3JlYXRlUGFydENvbnRyb2w8L2NvZGU+IG1ldGhvZCBvZiB0aGUgcGFyZW50IGNsYXNzLiBXaGVuIHNvbWV0aGluZworICogaXMgc2VsZWN0ZWQgYW5kIHRoZSBtZXRob2QgaXMgY2FsbGVkLCBpdCBtdXN0IGZpbHRlciBvdXQgdGhlIHNlbGVjdGlvbnMgYW5kCisgKiBpZ25vcmUgdGhvc2UgdGhhdCBhcmUgbm90IGluc3RhbmNlcyBvZiB7QGxpbmsgSVNpbXVsYXRpb259LiBXaGVuIGl0IGRvZXMKKyAqIGZpbmQgYSBzaW11bGF0aW9uIGluc3RhbmNlLCBpdCByZW1vdmVzIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBsaXN0CisgKiBtYWludGFpbmVkIGJ5IHRoZSA8Y29kZT5MaXN0Vmlld2VyPC9jb2RlPiBhbmQgYWRkcyB0aGUgbmV3bHkgc2VsZWN0ZWQKKyAqIGluc3RhbmNlcy4gSXQgdGhlbiB0ZWxscyB0aGUgdmlld2VyIHRvIHJlZHJhdyBpdHNlbGYuCisgKiA8cD4KKyAqIFRoZSBsYWJlbCBwcm92aWRlciBjbGFzcyBpcyB7QGxpbmsgVmlld0V4YW1wbGUxTGFiZWxQcm92aWRlcn0gYW5kIGlzIHRoZQorICogZWFzaWVzdCB0byB1bmRlcnN0YW5kLCBpdHMgaXMgdXNlZCBieSB0aGUgPGNvZGU+TGlzdFZpZXdlcjwvY29kZT4gdG8KKyAqIGdlbmVyYXRlIGEgdGV4dCBzdHJpbmcgZm9yIGFueSBvZiB0aGUgPGNvZGU+T2JqZWN0czwvY29kZT4gKGkuZS4sCisgKiA8Y29kZT5JU2ltdWxhdGlvbjwvY29kZT4gaW5zdGFuY2VzKSBpdCBjb250YWlucy4gVGhlIG1ldGhvZAorICoge0BsaW5rIFZpZXdFeGFtcGxlMUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChPYmplY3QpfSBkb2VzIHRoaXMgYW5kIGluIHRoaXMKKyAqIGV4YW1wbGUgZG9lcyB0aGUgd29yayB0byBleHRyYWN0IHRoZSBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGRhdGEgZnJvbSB0aGUKKyAqIGNhbm9uaWNhbCBncmFwaCB1c2VkIGluIHRoZSBzaW11bGF0aW9uLiBUaGVuIGl0IGp1c3QgcmV0dXJucyB0aGF0IGRhdGEgYXMgYQorICogKGxvbmcpIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQuCisgKiAKKyAqIFRvIHNlZSB0aGUgZXhhbXBsZSBpbiBhY3Rpb24sIHlvdSBuZWVkIHRvOgorICogPG9sPgorICogPGxpPiBSdW4gU1RFTTwvbGk+CisgKiA8bGk+IE9wZW4gdGhlICJWaWV3IEV4YW1wbGUgMSIgdmlldy4KKyAqICJXaW5kb3ctPlNob3cmbmJzcDtWaWV3LT5PdGhlci0+U1RFTS0+VmlldyZuYnNwO0V4YW1wbGUmbmJzcDsxIjwvbGk+CisgKiA8bGk+IE9wZW4gdGhlICJBY3RpdmUgU2ltdWxhdGlvbnMiIHZpZXcuCisgKiAiV2luZG93LT5TaG93Jm5ic3A7Vmlldy0+QWN0aXZlJm5ic3A7U2ltdWxhdGlvbnMiPC9saT4uCisgKiAKKyAqIDxsaT4gR28gdG8gdGhlICJTY2VuYXJpb3MiIHZpZXcuIEl0IHNob3dzIHRoZSBTVEVNIFNjZW5hcmlvcyB0aGF0IGFyZSBwbHVnZ2VkCisgKiBpbnRvIFNURU0uIDwvbGk+CisgKiA8bGk+IEV4cGFuZCAiVGVzdC0+RGlzZWFzZSZuYnNwO01vZGVscy0+U3RhbmRhcmQiIGFuZCB5b3UnbGwgc2VlIGRpc2Vhc2UKKyAqIG1vZGVsaW5nIHNjZW5hcmlvcyB0aGF0IGFyZSBwbHVnZ2VkIGludG8gU1RFTS4gPC9saT4KKyAqIDxsaT4gRG91YmxlLWNsaWNrIG9uIGEgc2NlbmFyaW8gaW4gdGhlIGxpc3QgKGUuZy4sICJTRUlSIDEgeCAxIikgaXQgd2lsbAorICogYmVnaW4gc2ltdWxhdGlvbiBhbmQgYW4gZW50cnkgd2lsbCBhcHBlYXIgaW4gdGhlICJBY3RpdmUgU2ltdWxhdGlvbnMiIHZpZXcuCisgKiA8L2xpPgorICogPGxpPiBTaW5nbGUgY2xpY2sgb24gdGhlIGVudHJ5IGluIHRoZSBBY3RpdmUgU2ltdWxhdGlvbnMgdmlldy4gVGhpcyB3aWxsCisgKiBzZWxlY3QgdGhhdCBzaW11bGF0aW9uIGFuZCB0aGUgbGF0aXR1ZGUvbG9uZ2l0dWRlIGRhdGEgZm9yIHRoYXQgc2NlbmFyaW8gd2lsbAorICogYXBwZWFyIGluIHRoZSBWaWV3IEV4YW1wbGUgMSB2aWV3IGFzIGEgc2luZ2xlIChsb25nKSBzdHJpbmcuIDwvbGk+CisgKiA8L29sPgorICogSWYgeW91IGRvdWJsZS1jbGljayBvbiBhbm90aGVyIHBsdWdnZWQtaW4gU2NlbmFyaW8gc28gdGhhdCB0d28gZW50cmllcyBhcmUKKyAqIGRpc3BsYXllZCBpbiB0aGUgQWN0aXZlIFNpbXVsYXRpb25zIHZpZXcgYW5kIHRoZSB5b3Ugc2VsZWN0IGJvdGgsIHlvdSdsbCBzZWUKKyAqIHR3byBlbnRyaWVzIGluIHRoZSBWaWV3IEV4YW1wbGUgMSB2aWV3LCBvbmUgZm9yIGVhY2ggb2YgdGhlIHNlbGVjdGVkCisgKiBzaW11bGF0aW9ucy4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgVmlld0V4YW1wbGUxIGV4dGVuZHMgVmlld1BhcnQgeworCisJLyoqCisJICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIFZpZXcgRXhhbXBsZTEgVmlldy4gTm9ib2R5IHVzZXMgdGhpcyByaWdodCBub3csIGJ1dAorCSAqIGl0IHdvdWxkIGJlIHVzZWZ1bCBpZiB3ZSB3YW50ZWQgdG8gcHJvZ3JhbWF0aWNhbGx5IGFkZCB0aGlzIHZpZXcgdG8gYQorCSAqIHBlcnNwZWN0aXZlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1ZJRVdfRVhBTVBMRTFfVklFVyA9ICJvcmcuZWNsaXBzZS5zdGVtLnNhbXBsZS5hZGFwdGVycy52aWV3ZXhhbXBsZTEiOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgTGlzdFZpZXdlciB0aGF0IGNyZWF0ZXMgdGhlIGRpc3BsYXkgdGhhdCB3aWxsIHNob3cgdXAgaW4gdGhlCisJICogdmlldydzIHdpbmRvdy4gSXQgY29udGFpbnMgYSBsaXN0IG9mIE9iamVjdHMsIHdoaWNoIGluIHRoaXMgZXhhbXBsZSdzCisJICogY2FzZSB3aWxsIGJlIGluc3RhbmNlcyBvZiBJU2ltdWxhdGlvbi4KKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdFZpZXdlciBsdiA9IG51bGw7CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdmlldyBpcyBjcmVhdGVkIGFuZCBpdCBoYXMgdGhlCisJICogcmVzcG9uc2liaWxpdHkgZm9yIGRvaW5nIGFsbCBvZiB0aGUgaW5pdGlhbGl6YXRpb24uIEl0IGNyZWF0ZXMgdGhlCisJICogTGlzdFZpZXdlciBhbmQgaW5zdGFuY2VzIG9mIHRoZSBDb250ZW50UHJvdmlkZXIgYW5kIExhYmVsUHJvdmlkZXIgZm9yIHRoZQorCSAqIHZpZXdlci4gSXQgYWxzbyBnZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBzZWxlY3Rpb24gc2VydmljZSBhbmQgcmVnaXN0ZXJzCisJICogdGhlIGNvbnRlbnQgcHJvdmlkZXIgc28gaXQgd2lsbCBiZSBub3RpZmllZCB3aGVuIHNvbWV0aGluZyBpcyBzZWxlY3RlZC4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQkvLyBDcmVhdGUgdGhlIGNvbnRlbnQgcHJvdmlkZXIKKwkJVmlld0V4YW1wbGUxQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBWaWV3RXhhbXBsZTFDb250ZW50UHJvdmlkZXIoKTsKKwkJLy8gQ3JlYXRlIHRoZSBMaXN0Vmlld2VyCisJCWx2ID0gbmV3IExpc3RWaWV3ZXIocGFyZW50KTsKKworCQkvLyBMZXQgdGhlIExpc3RWaWV3ZXIga25vdyB3aG8gaXRzIGNvbnRlbnQgYW5kIGxhYmVsIHByb3ZpZGVycyBhcmUKKwkJbHYuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7CisJCWx2LnNldExhYmVsUHJvdmlkZXIobmV3IFZpZXdFeGFtcGxlMUxhYmVsUHJvdmlkZXIoKSk7CisKKwkJLy8gVGhpcyBjYWxsIHRlbGxzIHRoZSB2aWV3ZXIncyBjb250ZW50IHByb3ZpZGVyIHdoZXJlIGl0IHNob3VsZCBnZXQgdGhlCisJCS8vIHNvdXJjZSBvZiBpdHMgY29udGVudC4gSW4gdGhpcyBjYXNlIGl0IGlzIHRoZSBzZWxlY3Rpb24gc2VydmljZS4KKwkJbHYuc2V0SW5wdXQoZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNlbGVjdGlvblNlcnZpY2UoKSk7CisKKwkJLy8gV2UgYWxzbyB3YW50IHRvIGJlIGFibGUgdG8gaGF2ZSBhIHVzZXIgc2VsZWN0IGEgc2ltbHVhdGlvbiBmcm9tIG91cgorCQkvLyB2aWV3IGFuZCBoYXZlIHRoYXQgYmUgc2VlbiBieSBvdGhlcnMuIFNvIHdlIHJlZ2lzdGVyIHRoZSBMaXN0Vmlld2VyCisJCS8vIGluc3RhbmNlIGFzIHRoZSB2aWV3J3Mgc2VsZWN0aW9uIHByb3ZpZGVyLiBXaGVuIHlvdSBjbGljayBvbiB0aGUgdmlldworCQkvLyBpbiB0aGUgaW50ZXJmYWNlIGl0IGZpbmRzIHRoZSB1bmRlcmx5aW5nIE9iamVjdCAoaS5lLiwgSVNpbXVsYXRpb24pCisJCS8vIHlvdSBzZWxlY3RlZCBhbmQgcGFzc2VzIGl0IHRvIHRoZSBzZWxlY3Rpb24gc2VydmljZS4KKwkJZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKGx2KTsKKworCX0gLy8gY3JlYXRlUGFydENvbnRyb2wKKworCS8qKgorCSAqIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIGludGVyZmFjZSwgYnV0IHdlJ3JlIG5vdCB1c2luZyBpdC4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCS8vIE5vdGhpbmcKKwl9IC8vIHNldEZvY3VzCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIHRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgdmlldy4gSXQgaXMgYWxzbyBhIHNlbGVjdGlvbgorCSAqIGxpc3RlbmVyIGFuZCB1c2VzIHRoZSBzZWxlY3Rpb24gc2VydmljZSBhcyB0aGUgc291cmNlIG9mIGl0cyBpbnB1dC4gSXQKKwkgKiBsb29rcyBmb3Igc2VsZWN0ZWQgSVNpbXVsYXRpb24gaW5zdGFuY2VzIGFuZCB1cGRhdGVzIHRoZSBsaXN0IGluIHRoZQorCSAqIHZpZXcncyBMaXN0Vmlld2VyIGluc3RhbmNlIHdpdGggdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgorCSAqLworCXB1YmxpYyBjbGFzcyBWaWV3RXhhbXBsZTFDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cworCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIElTZWxlY3Rpb25MaXN0ZW5lciB7CisKKwkJLy8gV2UgcmVtZW1iZXIgdGhlIExpc3RWaWV3ZXIgdGhhdCB3ZSdyZSBwcm92aWRpbmcgY29udGVudCBmb3IgYmVjYXVzZQorCQkvLyB3ZSBuZWVkIHRvIG1hbmlwdWxhdGUgaXRzIGxpc3QgaW4gdGhlIG1ldGhvZCBzZWxlY3Rpb25DaGFuZ2VkLgorCQlwcml2YXRlIExpc3RWaWV3ZXIgdmlld2VyID0gbnVsbDsKKworCQkvLyBUaGVzZSBhcmUgdGhlIHNpbXVsYXRpb25zIHdlIGFkZGVkIHRvIHRoZSBMaXN0Vmlld2VyLCB3ZSByZW1lbWJlcgorCQkvLyB0aGVzZSBzbyB3ZSBjYW4gcmVtb3ZlIHRoZW0gd2hlbiBhIGRpZmZlcmVudCBzZXQgb2Ygc2ltdWxhdGlvbnMgaXMKKwkJLy8gc2VsZWN0ZWQuCisJCXByaXZhdGUgTGlzdDxJU2ltdWxhdGlvbj4gc2VsZWN0ZWRTaW11bGF0aW9ucyA9IG51bGw7CisKKwkJLyoqCisJCSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgTGlzdFZpZXdlciB0byBnZXQgdGhlIGluaXRpYWwgbGlzdCBvZiBJU2ltdWxhdGlvbgorCQkgKiBpbnN0YW5jZXMuCisJCSAqIAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJT2JqZWN0IGlucHV0RWxlbWVudCkgeworCQkJT2JqZWN0W10gcmV0VmFsdWUgPSBuZXcgT2JqZWN0W10ge307CisKKwkJCS8vIEFueXRoaW5nIHlldD8KKwkJCWlmIChzZWxlY3RlZFNpbXVsYXRpb25zICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQlyZXRWYWx1ZSA9IHNlbGVjdGVkU2ltdWxhdGlvbnMudG9BcnJheSgpOworCQkJfQorCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGdldEVsZW1lbnRzCisKKwkJLyoqCisJCSAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHZpZXcgaXMgY2xvc2VkLCB3ZSBjb3VsZCByZW1vdmUgb3Vyc2VsdmVzIGFzCisJCSAqIGEgc2VsZWN0aW9uIHNlcnZpY2UgbGlzdGVuZXIsIGJ1dCB0aGlzIGlzIHJlYWxseSBmb3IgY2xlYW5pbmcgdXAgU1dUCisJCSAqIHRoaW5ncy4gVGhlIG1ldGhvZCBpbnB1dENoYW5nZWQgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGRpc3Bvc2Ugd2hlbgorCQkgKiB0aGUgdmlldyBpcyBjbG9zZWQsIHdlIHJlbW92ZSBvdXJzZWx2ZXMgZnJvbSB0aGUgc2VsZWN0aW9uIHNlcnZpY2UKKwkJICogdGhlcmUuCisJCSAqIAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKKwkJICovCisJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQkvLyBOb3RoaW5nIHRvIGRvCisJCX0gLy8gZGlzcG9zZQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCisJCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworCQkJLy8gV2UgcmVtZW1iZXIgdGhlIExpc3RWaWV3ZXIgd2UncmUgcHJvdmlkaW5nIGNvbnRlbnQgZm9yIGJlY2F1c2UKKwkJCS8vIHdlJ2xsIGhhdmUgdG8gY2hhbmdlIHRoZSBsaXN0IG9mIHRoaW5ncyBpdCBjb250YWlucyBpbiB0aGUKKwkJCS8vIHNlbGVjdGlvbkNoYW5nZWQgbWV0aG9kLgorCQkJdGhpcy52aWV3ZXIgPSAoTGlzdFZpZXdlcikgdmlld2VyOworCisJCQkvLyBXZXJlIHdlIHByZXZpb3VzbHkgZ2V0dGluZyBpbnB1dCBmcm9tIGEgZGlmZmVyZW50IHNlcnZpY2U/CisJCQlpZiAob2xkSW5wdXQgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCS8vIE5vdCBhbnkgbW9yZS4KKwkJCQlmaW5hbCBJU2VsZWN0aW9uU2VydmljZSBvbGRTUyA9IChJU2VsZWN0aW9uU2VydmljZSkgb2xkSW5wdXQ7CisJCQkJb2xkU1MucmVtb3ZlUG9zdFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJfQorCisJCQkvLyBJcyB0aGVyZSBzb21lIG5ldyBpbnB1dCB3ZSBzaG91bGQgcmVnaXN0ZXIgd2l0aD8KKwkJCWlmIChuZXdJbnB1dCAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJLy8gUmVnaXN0ZXIgdXMgd2l0aCB0aGUgbmV3IHNlcnZpY2UuIFNpbmNlIHRoZXJlIHNob3VsZCBvbmx5CisJCQkJLy8gcmVhbGx5IGJlIG9uZSBzZWxlY3Rpb24gc2VydmljZSBpbiBFY2xpcHNlLCB0aGlzIHdvdWxkIG9ubHkKKwkJCQkvLyBoYXBwZW4gb25jZSwgaG93ZXZlciwgdGhlIGNvZGUgY2FuIGhhbmRsZSBhIGNoYW5nZSBpZiBuZWVkZWQuCisJCQkJZmluYWwgSVNlbGVjdGlvblNlcnZpY2Ugc3MgPSAoSVNlbGVjdGlvblNlcnZpY2UpIG5ld0lucHV0OworCQkJCXNzLmFkZFBvc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCX0KKworCQl9IC8vIGlucHV0Q2hhbmdlZAorCisJCS8qKgorCQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgQU5ZVEhJTkcgaXMgc2VsZWN0ZWQgaW4gdGhlIEVjbGlwc2UKKwkJICogd29ya2JlbmNoLiBJdCdzIGpvYiBpcyB0byBmaWx0ZXIgb3V0IHNlbGVjdGlvbnMgb2YgSVNpbXVsYXRpb24KKwkJICogaW5zdGFuY2VzIGFuZCB1cGRhdGUgdGhlIGxpc3QgaW4gdGhlIExpc3RWaWV3ZXIuCisJCSAqIAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LAorCQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKKwkJICovCisJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoZmluYWwgSVdvcmtiZW5jaFBhcnQgcGFydCwgZmluYWwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKworCQkJLy8gSXMgdGhpcyBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCBjb21pbmcgZnJvbSBvdXIgdmlldz8KKwkJCWlmIChwYXJ0ICE9IFZpZXdFeGFtcGxlMS50aGlzKSB7CisJCQkJLy8gTm8KKwkJCQkvLyBUaGlzIHdpbGwgaG9sZCB0aGUgbmV3IHNpbXVsYXRpb25zIHRoYXQgaGF2ZSBiZWVuIHNlbGVjdGVkCisJCQkJZmluYWwgTGlzdDxJU2ltdWxhdGlvbj4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8SVNpbXVsYXRpb24+KCk7CisKKwkJCQkvLyBJcyBpdCBhIHN0cnVjdHVyZWQgc2VsZWN0aW9uPworCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJCQkvLyBZZXMKKwkJCQkJZmluYWwgTGlzdCBsaXN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQorCQkJCQkJCS50b0xpc3QoKTsKKworCQkJCQkvLyBHbyB0aHJvdWdoIGV2ZXJ5dGhpbmcgaW4gdGhlIGxpc3Qgb2YgdGhpbmdzIHRoYXQgd2VyZQorCQkJCQkvLyBzZWxlY3RlZCBhbmQgcGljayBvdXQgdGhlIG9uZXMgdGhhdCBhcmUgSVNpbXVsYXRpb25zLgorCQkJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yIHNlbGVjdGlvbkl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IHNlbGVjdGlvbkl0ZXIKKwkJCQkJCQkuaGFzTmV4dCgpOykgeworCQkJCQkJZmluYWwgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbkl0ZXIubmV4dCgpOworCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTaW11bGF0aW9uKSB7CisJCQkJCQkJdGVtcC5hZGQoKElTaW11bGF0aW9uKSBvYmopOworCQkJCQkJfQorCQkJCQl9IC8vIGZvciBlYWNoIHNlbGVjdGVkIGl0ZW0KKwkJCQl9IC8vIGlmIHN0cnVjdHVyZWQgc2VsZWN0aW9uCisKKwkJCQkvLyBEaWQgd2UgZmluZCBhbnkgbmV3IHNpbXVsYXRpb25zIHRoYXQgd2VyZSBzZWxlY3RlZD8KKwkJCQlpZiAodGVtcC5zaXplKCkgPiAwKSB7CisJCQkJCS8vIFllcworCQkJCQkvLyBUZWxsIHRoZSBMaXN0Vmlld2VyIG5vdCB0byByZWRyYXcgd2hpbGUgd2UncmUgY2hhbmdpbmcKKwkJCQkJLy8gaXRzIGxpc3QuCisJCQkJCXZpZXdlci5nZXRMaXN0KCkuc2V0UmVkcmF3KGZhbHNlKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCS8vIERvIHdlIGhhdmUgYW55IG9sZCBzZWxlY3Rpb25zIHdlIHNob3VsZCByZW1vdmU/CisJCQkJCQlpZiAoc2VsZWN0ZWRTaW11bGF0aW9ucyAhPSBudWxsKSB7CisJCQkJCQkJLy8gWWVzCisJCQkJCQkJdmlld2VyLnJlbW92ZShzZWxlY3RlZFNpbXVsYXRpb25zLnRvQXJyYXkoKSk7CisJCQkJCQl9CisJCQkJCQkvLyBBZGQgdGhlIG5ldyBzZWxlY3Rpb25zIHRvIHRoZSBMaXN0Vmlld2VyJ3MgbGlzdC4gSXQKKwkJCQkJCS8vIHdpbGwgdXNlIHRoZSBsYWJlbCBwcm92aWRlciB0byBnZXQgYSB0ZXh0IHN0cmluZyBmb3IKKwkJCQkJCS8vIGVhY2ggb25lLgorCQkJCQkJdmlld2VyLmFkZCh0ZW1wLnRvQXJyYXkoKSk7CisKKwkJCQkJCS8vIFJlbWVtYmVyIHdoYXQgd2UgYWRkZWQgdGhpcyB0aW1lIHNvIHdlIGNhbiByZW1vdmUgaXQKKwkJCQkJCS8vIG5leHQgc2VsZWN0aW9uLgorCQkJCQkJc2VsZWN0ZWRTaW11bGF0aW9ucyA9IHRlbXA7CisJCQkJCX0gLy8gdHJ5CisJCQkJCWZpbmFsbHkgeworCQkJCQkJLy8gVGhlIExpc3RWaWV3ZXIgc2hvdWxkIHVwZGF0ZSBpdHNlbGYgbm93LgorCQkJCQkJdmlld2VyLmdldExpc3QoKS5zZXRSZWRyYXcodHJ1ZSk7CisJCQkJCX0KKwkJCQl9IC8vIGlmIGFueSBuZXcgc2ltdWxhdGlvbnMgc2VsZWN0ZWQKKwkJCX0gLy8gaWYgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgY29taW5nIGZyb20gb3VyIHZpZXc/CisJCX0gLy8gc2VsZWN0aW9uQ2hhbmdlZAorCisJfSAvLyBWaWV3RXhhbXBsZTFDb250ZW50UHJvdmlkZXIKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgdGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgdmlldy4gSXQgaXMgdXNlZCBieSB0aGUKKwkgKiBMaXN0Vmlld2VyIHRvIGNvbnZlcnQgSVNpbXVsYXRpb24gaW5zdGFuY2VzIHRvIHRleHQgc3RyaW5ncy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFZpZXdFeGFtcGxlMUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7CisKKwkJLyoqCisJCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBMaXN0Vmlld2VyIGZvciBlYWNoIE9iamVjdCBpbiBpdHMgbGlzdCB0bworCQkgKiBnZW5lcmF0ZSBhIHRleHQgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGF0IE9iamVjdC4gVGhpcworCQkgKiBpbXBsZW1lbnRhdGlvbiBkaWdzIGludG8gdGhlIHNpbXVsYXRpb24gdG8gZ2V0IHRoZSBzY2VuYXJpbyBhbmQgdGhlbgorCQkgKiBmcm9tIHRoYXQgaXQgb2J0YWlucyB0aGUgY2Fub25pY2FsIGdyYXBoLiBJdCB0aGVuIGdvZXMgdGhyb3VnaCB0aGUKKwkJICogbm9kZXMgb2YgdGhlIGdyYXBoIGFuZCB1c2luZyBhIExhdExvbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGNyZWF0ZXMKKwkJICogYSBMYXRMb25nUHJvdmlkZXIgZm9yIGVhY2ggbm9kZSB0aGF0IGNhbiByZXR1cm4gdGhlIGxhdGl0dWRlIGFuZAorCQkgKiBsb25naXR1ZGUgZGF0YSBvZiB0aGUgbm9kZS4gVGhhdCBkYXRhIGlzIGp1c3QgdHVybmVkIGludG8gYSBzdHJpbmcKKwkJICogYW5kIHJldHVybmVkIGFzIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzaW11bGF0aW9uLgorCQkgKiAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKwkJCS8vIEV4dHJhY3QgdGhlIHNjZW5hcmlvIGFuZCB0aGVuIHRoZSBjYW5vbmljYWwgZ3JhcGgKKwkJCWZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb24gPSAoSVNpbXVsYXRpb24pIGVsZW1lbnQ7CisJCQlmaW5hbCBTY2VuYXJpbyBzY2VuYXJpbyA9IHNpbXVsYXRpb24uZ2V0U2NlbmFyaW8oKTsKKwkJCWZpbmFsIEdyYXBoIGNhbm9uaWNhbEdyYXBoID0gc2NlbmFyaW8uZ2V0Q2Fub25pY2FsR3JhcGgoKTsKKworCQkJLy8gR2V0IHRoZSBub2RlcyBmcm9tIHRoZSBncmFwaCBhbmQgaXRlcmF0ZSB0aHJvdWdoIHRoZW0uIE5vdGUgdGhhdAorCQkJLy8gdGhlIGdldE5vZGVzIGNhbGwgcmV0dXJucyBhIE1hcCBpbnN0YW5jZSB3aGVyZSB0aGUga2V5cyBhcmUgdGhlCisJCQkvLyBVUkkncyBvZiB0aGUgTm9kZSBpbnN0YW5jZXMuIFdlIGdldCB0aGUgdmFsdWVzIG9mIHRoZSBtYXAgdG8KKwkJCS8vIGludGVyYXRlIHRocm91Z2ggdGhlIG5vZGVzLgorCQkJZm9yIChmaW5hbCBJdGVyYXRvciBub2RlSXRlciA9IGNhbm9uaWNhbEdyYXBoLmdldE5vZGVzKCkudmFsdWVzKCkKKwkJCQkJLml0ZXJhdG9yKCk7IG5vZGVJdGVyLmhhc05leHQoKTspIHsKKwkJCQlmaW5hbCBOb2RlIG5vZGUgPSAoTm9kZSkgbm9kZUl0ZXIubmV4dCgpOworCisJCQkJLy8gV2UnZCBsaWtlIHRvIGhhdmUgYWNjZXNzIHRvIGxhdC9sb25nIGRhdGEgb2YgdGhlIG5vZGUgaWYKKwkJCQkvLyB0aGVyZSBpcyBhbnksIHRvIGRvIHRoYXQgd2UgdXNlIGEgZmFjdG9yeSB0byBjcmVhdGUgYW4KKwkJCQkvLyBhZGFwdGVyIHRoYXQga25vd3MgYWJvdXQgdGhlIGlubmVyIGRldGFpbHMgb2Ygbm9kZXMgKGl0CisJCQkJLy8gcmVhbGx5IGtub3dzIGFib3V0IGFsbCBJZGVudGlmaWFibGVzKSBhbmQgaW1wbGVtZW50cyB0aGUKKwkJCQkvLyBMYXRMb25nUHJvdmlkZXIgaW50ZXJmYWNlLgorCQkJCWZpbmFsIExhdExvbmdQcm92aWRlciBsYXRMb25nUHJvdmlkZXIgPSAoTGF0TG9uZ1Byb3ZpZGVyKSBMYXRMb25nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkJLmFkYXB0KG5vZGUsIExhdExvbmdQcm92aWRlci5jbGFzcyk7CisKKwkJCQkvLyBUaGUgbm9kZSBtYXkgb3IgbWF5IG5vdCBoYXZlIGxhdC9sb25nIGRhdGEgYXNzb2NpYXRlZCB3aXRoCisJCQkJLy8gaXQsIGlmIGl0IGRvZXNuJ3QgdGhlIGxpc3QgdGhhdCdzIHJldHVybmVkIHdpbGwgYmUgZW1wdHkuCisJCQkJZmluYWwgTGF0TG9uZyBsYXRMb25nID0gbGF0TG9uZ1Byb3ZpZGVyLmdldExhdExvbmcoKTsKKworCQkJCS8vIE5vdyB3ZSBqdXN0IGdvIHRocm91Z2ggZWFjaCBzZWdtZW50IGFuZCBjcmVhdGUgYSBzdHJpbmcuCisJCQkJZm9yIChTZWdtZW50IHNlZ21lbnQgOiBsYXRMb25nLmdldFNlZ21lbnRzKCkpIHsKKwkJCQkJc2IuYXBwZW5kKEV4YW1wbGUxLmNyZWF0ZVN0cmluZ09mTGF0TG9uZ0RhdGEoc2VnbWVudCkpOworCQkJCQlzYi5hcHBlbmQoIi8vLyIpOworCQkJCX0gLy8gZm9yCisJCQl9IC8vIGZvcgorCisJCQkvLyBOb3cgaWYgd2UgZGlkbid0IGZpbmQgYW55IGxhdC9sb25nIGRhdGEsIHdlIGp1c3QgcmV0dXJuIGEgc2ltcGxlCisJCQkvLyByZXNwb25zZS4gVGhpcyB3aWxsIGFwcGVhciBpbiB0aGUgdmlldyBpbnN0ZWFkIG9mIHRoZSBkYXRhLgorCQkJU3RyaW5nIHJldFZhbHVlID0gc2IudG9TdHJpbmcoKTsKKwkJCXJldFZhbHVlID0gcmV0VmFsdWUubGVuZ3RoKCkgPT0gMCA/ICJObyBMYXQvTG9uZyBEYXRhIiA6IHJldFZhbHVlOworCisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gZ2V0VGV4dAorCisJCS8qKgorCQkgKiBXZSBkb24ndCBoYXZlIGFueSBpbWFnZXMgYXNzb2NpYXRlZCB3aXRoIHNpbXVsYXRpb25zLCBidXQgaWYgd2UgZGlkCisJCSAqIHdlJ2QgcmV0dXJuIHRoZW0gaGVyZS4gUmV0dXJuaW5nIG51bGwganVzdCB0ZWxscyB0aGUgY2FsbGVyIHRoYXQKKwkJICogdGhlcmUgYXJlIG5vIGltYWdlcy4KKwkJICogCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIEltYWdlIGdldEltYWdlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQlPYmplY3QgZWxlbWVudCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gLy8gZ2V0SW1hZ2UKKworCQkvKioKKwkJICogUmVxdWlyZWQgYnkgdGhlIGludGVyZmFjZSwgYnV0IG5vdCB1c2VkIGJ5IHVzLgorCQkgKiAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCisJCSAqLworCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQkJLy8gbm90aGluZworCQl9CisKKwkJLyoqCisJCSAqIFJlcXVpcmVkIGJ5IHRoZSBpbnRlcmZhY2UsIGJ1dCBub3QgdXNlZCBieSB1cy4KKwkJICogCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCisJCSAqLworCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkJLy8gbm90aGluZworCQl9CisKKwkJLyoqCisJCSAqIFJlcXVpcmVkIGJ5IHRoZSBpbnRlcmZhY2UsIGJ1dCBub3QgdXNlZCBieSB1cy4KKwkJICogCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsCisJCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKKwkJICovCisJCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJT2JqZWN0IGVsZW1lbnQsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQlTdHJpbmcgcHJvcGVydHkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8qKgorCQkgKiBSZXF1aXJlZCBieSB0aGUgaW50ZXJmYWNlLCBidXQgbm90IHVzZWQgYnkgdXMuCisJCSAqIAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKKwkJICovCisJCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQlJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCQkvLyBub3RoaW5nCisJCX0KKwl9IC8vIFZpZXdFeGFtcGxlMUxhYmVsUHJvdmlkZXIKKworfSAvLyBWaWV3RXhhbXBsZTEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy8uY2hlY2tzdHlsZSBiL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy8uY2hlY2tzdHlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTgxMzliCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzLy5jaGVja3N0eWxlCkBAIC0wLDAgKzEsNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxmaWxlc2V0LWNvbmZpZyBmaWxlLWZvcm1hdC12ZXJzaW9uPSIxLjIuMCIgc2ltcGxlLWNvbmZpZz0idHJ1ZSI+CisgICAgPGZpbGVzZXQgbmFtZT0iYWxsIiBlbmFibGVkPSJ0cnVlIiBjaGVjay1jb25maWctbmFtZT0iU3VuIENoZWNrcyIgbG9jYWw9ImZhbHNlIj4KKyAgICAgICAgPGZpbGUtbWF0Y2gtcGF0dGVybiBtYXRjaC1wYXR0ZXJuPSIuIiBpbmNsdWRlLXBhdHRlcm49InRydWUiLz4KKyAgICA8L2ZpbGVzZXQ+Cis8L2ZpbGVzZXQtY29uZmlnPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcnMvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRlODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy8ucHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzExMTIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2VyczwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDk3OTMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDY5IEBACisjTW9uIEphbiAyMSAxMjo0NDoxOSBFU1QgMjAwOAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYzBkMzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSw5IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzOyBzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcnMvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMWU2NmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcnMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE2IEBACisjIDxjb3B5cmlnaHQ+CisjIDwvY29weXJpZ2h0PgorIworIyAkSWQkCisKK2Jpbi5pbmNsdWRlcyA9IC4sXAorICAgICAgICAgICAgICAgaWNvbnMvLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIG5vdGljZS5odG1sLFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCisgICAgICAgICAgICAgICByZXNvdXJjZXMvCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuCitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YjE5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9lcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwzMjggQEAKKzxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKK3htbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCit4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Cis8bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Cis8bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxsaW5rIHJlbD1GaWxlLUxpc3QKK2hyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgorPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Cis8IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8bzpEb2N1bWVudFByb3BlcnRpZXM+CisgIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+CisgIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KKyAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgorICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgorICA8bzpQYWdlcz40PC9vOlBhZ2VzPgorICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgorICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KKyAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgorICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+CisgIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgorICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgorIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Cis8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8dzpXb3JkRG9jdW1lbnQ+CisgIDx3OlRyYWNrUmV2aXNpb25zLz4KKyA8L3c6V29yZERvY3VtZW50PgorPC94bWw+PCFbZW5kaWZdLS0+Cis8c3R5bGU+Cis8IS0tCisgLyogRm9udCBEZWZpbml0aW9ucyAqLworQGZvbnQtZmFjZQorCXtmb250LWZhbWlseTpUYWhvbWE7CisJcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7CisJbXNvLWZvbnQtY2hhcnNldDowOworCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOworCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOworCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQorIC8qIFN0eWxlIERlZmluaXRpb25zICovCitwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCisJe21zby1zdHlsZS1wYXJlbnQ6IiI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorcAorCXttYXJnaW4tcmlnaHQ6MGluOworCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOworCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOworCW1hcmdpbi1sZWZ0OjBpbjsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0CisJe21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOworCW1hcmdpbjowaW47CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6OC4wcHQ7CisJZm9udC1mYW1pbHk6VGFob21hOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK0BwYWdlIFNlY3Rpb24xCisJe3NpemU6OC41aW4gMTEuMGluOworCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOworCW1zby1oZWFkZXItbWFyZ2luOi41aW47CisJbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKKwltc28tcGFwZXItc291cmNlOjA7fQorZGl2LlNlY3Rpb24xCisJe3BhZ2U6U2VjdGlvbjE7fQorLS0+Cis8L3N0eWxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+CisKKzxkaXYgY2xhc3M9U2VjdGlvbjE+CisKKzxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KKzwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgorVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKK1JFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQorT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2luIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCitkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+CitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2NoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCitzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCitieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKK2lmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCitzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKK1Byb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgord2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQord29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCitlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50CitjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQorb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKK2Rpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCityZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAorYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCitzdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQorZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQorU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cworUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKK3BhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKK2FuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQorY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KK29mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCitieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgordG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bworYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQorUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cworQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKK3RoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAorZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAorbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKK3RvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCitpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCit0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCitkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKK0VhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0CityaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCit0aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgorPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2VmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKK2NvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKK2FuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5CithbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKK2luY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKK2FzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQorc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAorQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQorc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAoraW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQorY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKK2NvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKK2NvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQorb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKK3N1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKK2FjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKK2FuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCitvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKK2xpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCitDb250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgorQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCitjb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCitsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwordGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgorY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKK29mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcworcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCit0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCit0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAorYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKK2luIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAord2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKK3NlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQorb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQorY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKK0FHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCitXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCitNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQorcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKK1Byb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKK0FncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKK2NvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCitlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCitPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKK1RIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKK1RIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCitvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0CitmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQorbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KK2FnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKK290aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQorc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAorc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQorcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKK3JpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKK2NvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50CitTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKK3RoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCit0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCitBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bworc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KKyhpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKK2V4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKK2V4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQorU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgorQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCitBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCitpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KKworPC9kaXY+CisKKzwvYm9keT4KKworPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9pY29ucy9mdWxsL29iajE2L1NlcXVlbmNlck1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcnMvaWNvbnMvZnVsbC9vYmoxNi9TZXF1ZW5jZXJNb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOTdjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcnMvaWNvbnMvZnVsbC9vYmoxNi9TZXF1ZW5jZXJNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9pY29ucy9mdWxsL29iajE2L1NlcXVlbnRpYWxTZXF1ZW5jZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzL2ljb25zL2Z1bGwvb2JqMTYvU2VxdWVudGlhbFNlcXVlbmNlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVlZjg0ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9pY29ucy9mdWxsL29iajE2L1NlcXVlbnRpYWxTZXF1ZW5jZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9pY29ucy9mdWxsL3dpemJhbi9OZXdTZXF1ZW5jZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzL2ljb25zL2Z1bGwvd2l6YmFuL05ld1NlcXVlbmNlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllODBmMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9pY29ucy9mdWxsL3dpemJhbi9OZXdTZXF1ZW5jZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9ub3RpY2UuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9ub3RpY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFmOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzL25vdGljZS5odG1sCkBAIC0wLDAgKzEsNzkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+TWFyY2ggMTcsIDIwMDU8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorICAgCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCisgICAKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUworICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisgICAKKzx1bD4KKwk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4gICAKKyAKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKwk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCQkKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKwk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKKwk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorICAgCis8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODVhZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzL3BsdWdpbi5wcm9wZXJ0aWVzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU1ZGU4YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+CisKKzwhLS0KKyA8Y29weXJpZ2h0PgorIDwvY29weXJpZ2h0PgorCisgJElkJAorLS0+CisKKzxwbHVnaW4+CisgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlciI+CisgICAgIDxzdGVtX2NhdGVnb3J5CisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcnMuY2F0ZWdvcnkuc3RlbSIKKyAgICAgICAgICAgbmFtZT0iJV9VSV9Db21tb25fU1RFTSIKKyAgICAgICAgICAgcGFyZW50X2lkPSIvIi8+CisgICAgIDxzdGVtX2NhdGVnb3J5CisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcnMuY2F0ZWdvcnkuc2VxdWVudGlhbCIKKyAgICAgICAgICAgbmFtZT0iJV9VSV9TZXF1ZW50aWFsX1NlcXVlbmNlciIKKyAgICAgICAgICAgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcnMuY2F0ZWdvcnkuc3RlbSIvPgorICAgICA8ZHVibGluX2NvcmUKKyAgICAgICAgICAgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy5jYXRlZ29yeS5zZXF1ZW50aWFsIgorICAgICAgICAgICBjcmVhdG9yPSIlZGNfY3JlYXRvcl9kYWZvcmQiCisgICAgICAgICAgIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyLmVjb3JlIgorICAgICAgICAgICBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9yZXNvdXJjZXMvc2VxdWVuY2Vycy8yMDAwLTAxLTAxXzIwMDAtMTItMzFfc2VxdWVudGlhbHNlcXVlbmNlci5zZXF1ZW5jZXIiCisgICAgICAgICAgIHB1Ymxpc2hlcj0iJWRjX3B1YiIKKyAgICAgICAgICAgdGl0bGU9IiVkY19zZXFzZXEyMDAwX3RpdGxlIgorICAgICAgICAgICB2YWxpZD0ic3RhcnQ9MjAwMC0wMS0wMTsgZW5kPTIwMDAtMDEtMTAiLz4KKyAgPC9leHRlbnNpb24+CisgCis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9yZXNvdXJjZXMvc2VxdWVuY2Vycy8yMDAwLTAxLTAxXzIwMDAtMTItMzFfc2VxdWVudGlhbHNlcXVlbmNlci5zZXF1ZW5jZXIgYi9vcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcnMvcmVzb3VyY2VzL3NlcXVlbmNlcnMvMjAwMC0wMS0wMV8yMDAwLTEyLTMxX3NlcXVlbnRpYWxzZXF1ZW5jZXIuc2VxdWVuY2VyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNzkwN2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcnMvcmVzb3VyY2VzL3NlcXVlbmNlcnMvMjAwMC0wMS0wMV8yMDAwLTEyLTMxX3NlcXVlbnRpYWxzZXF1ZW5jZXIuc2VxdWVuY2VyCkBAIC0wLDAgKzEsNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KKzxvcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcjpTZXF1ZW50aWFsU2VxdWVuY2VyIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci5lY29yZSIgdVJJPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9yZXNvdXJjZXMvc2VxdWVuY2Vycy8yMDAwLTAxLTAxXzIwMDAtMTItMzFfc2VxdWVudGlhbHNlcXVlbmNlci5zZXF1ZW5jZXIiIHR5cGVVUkk9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9pZGVudGlmaWFibGUwIj4KKyAgPGR1YmxpbkNvcmUgdGl0bGU9IlNlcXVlbnRpYWwgU2VxdWVuY2VyIEp1bi4gMDEsIDIwMDYgdG8gSnVuLiAxMCwgMjAwNiAoQ3ljbGU6IDEgRGF5KSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcnMvcmVzb3VyY2VzL3NlcXVlbmNlcnMvMjAwMC0wMS0wMV8yMDAwLTEyLTMxX3NlcXVlbnRpYWxzZXF1ZW5jZXIuc2VxdWVuY2VyIiBkZXNjcmlwdGlvbj0iIiBjcmVhdG9yPSJkYWZvcmQiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL3NlcXVlbmNlci5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDAtMDEtMDE7IGVuZD0yMDAwLTEyLTMxIi8+CisgIDxzdGFydFRpbWUgdGltZT0iMjAwMC0wMS0wMVQwMDowMDowMC4wMC0wNTAwIi8+Cis8L29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2VyOlNlcXVlbnRpYWxTZXF1ZW5jZXI+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcnMvc3JjLy5jdnNpZ25vcmUgYi9vcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcnMvc3JjLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxMzc2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc2VxdWVuY2Vycy9zcmMvLmN2c2lnbm9yZQpAQCAtMCwwICsxIEBACitkdW1teQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWYwMjRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxjbGFzc3BhdGg+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCis8L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlN2MzMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxwcm9qZWN0RGVzY3JpcHRpb24+DQorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZDwvbmFtZT4NCisJPGNvbW1lbnQ+PC9jb21tZW50Pg0KKwk8cHJvamVjdHM+DQorCTwvcHJvamVjdHM+DQorCTxidWlsZFNwZWM+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJPC9idWlsZFNwZWM+DQorCTxuYXR1cmVzPg0KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCisJPC9uYXR1cmVzPg0KKzwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MzZmYTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsMjEgQEAKKyNUdWUgU2VwIDAxIDE2OjU2OjQxIEVEVCAyMDA5CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb249cmV0dXJuX3RhZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2NlYWJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMjAgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMA0KK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUNCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQ7c2luZ2xldG9uOj10cnVlDQorQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcg0KK0J1bmRsZS1DbGFzc1BhdGg6IC4NCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lDQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LA0KKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUsDQorIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0O2J1bmRsZS12ZXJzaW9uPSIyLjQuMSIsDQorIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscywNCisgb3JnLmVjbGlwc2Uuc3RlbS51aQ0KK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5DQorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZCwNCisgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLmltcGwsDQorIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5wcm92aWRlciwNCisgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLnV0aWwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MjJhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE1IEBACisNCisjIDxjb3B5cmlnaHQ+DQorIyA8L2NvcHlyaWdodD4NCisjDQorIyAkSWQkDQorDQorYmluLmluY2x1ZGVzID0gLixcDQorICAgICAgICAgICAgICAgbW9kZWwvLFwNCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXA0KKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwNCisgICAgICAgICAgICAgICBpY29ucy8NCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuDQorc291cmNlLi4gPSBzcmMvDQorb3V0cHV0Li4gPSBiaW4vDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkL2ljb25zL2Z1bGwvb2JqMTYvRmluaXRlRGlmZmVyZW5jZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvaWNvbnMvZnVsbC9vYmoxNi9GaW5pdGVEaWZmZXJlbmNlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjUwZmVjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkL2ljb25zL2Z1bGwvb2JqMTYvRmluaXRlRGlmZmVyZW5jZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkL21vZGVsL2ZkLmVjb3JlIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkL21vZGVsL2ZkLmVjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYWJkNjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvbW9kZWwvZmQuZWNvcmUKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIg0KKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQorICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJmZCINCisgICAgbnNVUkk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkIj4NCisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRmluaXRlRGlmZmVyZW5jZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9zb2x2ZXIuZWNvcmUjLy9Tb2x2ZXIiLz4NCis8L2Vjb3JlOkVQYWNrYWdlPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9tb2RlbC9mZC5nZW5tb2RlbCBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9tb2RlbC9mZC5nZW5tb2RlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTEwNzllCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkL21vZGVsL2ZkLmdlbm1vZGVsCkBAIC0wLDAgKzEsMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiDQorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkL3NyYyINCisgICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC9zcmMiDQorICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZCIgbW9kZWxOYW1lPSJGZCIgdGVzdHNEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnNvbHZlcnMuZmQvc3JjIg0KKyAgICBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIuZWNvcmUiIGNvbXBsaWFuY2VMZXZlbD0iNi4wIiBjb3B5cmlnaHRGaWVsZHM9ImZhbHNlIg0KKyAgICB1c2VkR2VuUGFja2FnZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vY29tbW9uIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vZ3JhcGggLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9tb2RlbCAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL21vZGlmaWVyIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vc2NlbmFyaW8gLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9zZXF1ZW5jZXIgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9zb2x2ZXIgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZSI+DQorICA8Zm9yZWlnbk1vZGVsPmZkLmVjb3JlPC9mb3JlaWduTW9kZWw+DQorICA8Z2VuUGFja2FnZXMgcHJlZml4PSJGZCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycyIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSINCisgICAgICBlY29yZVBhY2thZ2U9ImZkLmVjb3JlIy8iPg0KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJmZC5lY29yZSMvL0Zpbml0ZURpZmZlcmVuY2UiLz4NCisgIDwvZ2VuUGFja2FnZXM+DQorPC9nZW5tb2RlbDpHZW5Nb2RlbD4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiMjkxMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9wbHVnaW4ucHJvcGVydGllcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNmFhMjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvcGx1Z2luLnhtbApAQCAtMCwwICsxLDQyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4NCisNCis8IS0tDQorIDxjb3B5cmlnaHQ+DQorIDwvY29weXJpZ2h0Pg0KKw0KKyAkSWQkDQorLS0+DQorDQorPHBsdWdpbj4NCisgICAgPGV4dGVuc2lvbg0KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5pdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yaWVzIj4NCisgICAgICA8ZmFjdG9yeQ0KKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQucHJvdmlkZXIuRmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSINCisgICAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkIg0KKyAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzPQ0KKyAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyDQorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyDQorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyDQorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyDQorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSI+DQorICAgICAgPC9mYWN0b3J5Pg0KKyAgIDwvZXh0ZW5zaW9uPg0KKyAgIDxleHRlbnNpb24NCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlciI+DQorICAgICAgPGNsYXNzZGVmDQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5pbXBsLkZpbml0ZURpZmZlcmVuY2VJbXBsIj4NCisgICAgICA8L2NsYXNzZGVmPg0KKyAgICAgIDxkdWJsaW5fY29yZQ0KKyAgICAgICAgICAgIGNhdGVnb3J5X2lkPSIvIg0KKyAgICAgICAgICAgIGlkZW50aWZpZXI9Im9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5kdWJsaW5fY29yZTEiDQorICAgICAgICAgICAgdGl0bGU9Im9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5kdWJsaW5fY29yZTEiPg0KKyAgICAgIDwvZHVibGluX2NvcmU+DQorICAgPC9leHRlbnNpb24+DQorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4NCisgICAgICA8cGFja2FnZQ0KKyAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQiDQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5GZFBhY2thZ2UiDQorICAgICAgICAgICAgZ2VuTW9kZWw9Im1vZGVsL2ZkLmdlbm1vZGVsIi8+DQorICAgPC9leHRlbnNpb24+Cis8L3BsdWdpbj4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9GZEZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkL0ZkRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYmZiZmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9GZEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5Ow0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuDQorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuRmRQYWNrYWdlDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgRmRGYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnkgew0KKwkvKioNCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUZkRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuaW1wbC5GZEZhY3RvcnlJbXBsLmluaXQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RmluaXRlIERpZmZlcmVuY2U8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZpbml0ZSBEaWZmZXJlbmNlPC9lbT4nLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlGaW5pdGVEaWZmZXJlbmNlIGNyZWF0ZUZpbml0ZURpZmZlcmVuY2UoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRmRQYWNrYWdlIGdldEZkUGFja2FnZSgpOw0KKw0KK30gLy9GZEZhY3RvcnkNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9GZFBhY2thZ2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkL0ZkUGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MTYzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9GZFBhY2thZ2UuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQ7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXJQYWNrYWdlOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuDQorICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudA0KKyAqIDx1bD4NCisgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+DQorICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4NCisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4NCisgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPg0KKyAqIDwvdWw+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuRmRGYWN0b3J5DQorICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgRmRQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2Ugew0KKwkvKioNCisJICogVGhlIHBhY2thZ2UgbmFtZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBlTkFNRSA9ICJmZCI7DQorDQorCS8qKg0KKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQiOw0KKw0KKwkvKioNCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQiOw0KKw0KKwkvKioNCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUZkUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuaW1wbC5GZFBhY2thZ2VJbXBsLmluaXQoKTsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLmltcGwuRmluaXRlRGlmZmVyZW5jZUltcGwgPGVtPkZpbml0ZSBEaWZmZXJlbmNlPC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLmltcGwuRmluaXRlRGlmZmVyZW5jZUltcGwNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuaW1wbC5GZFBhY2thZ2VJbXBsI2dldEZpbml0ZURpZmZlcmVuY2UoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgRklOSVRFX0RJRkZFUkVOQ0UgPSAwOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEZJTklURV9ESUZGRVJFTkNFX19VUkkgPSBTb2x2ZXJQYWNrYWdlLlNPTFZFUl9fVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgRklOSVRFX0RJRkZFUkVOQ0VfX1RZUEVfVVJJID0gU29sdmVyUGFja2FnZS5TT0xWRVJfX1RZUEVfVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgRklOSVRFX0RJRkZFUkVOQ0VfX0RVQkxJTl9DT1JFID0gU29sdmVyUGFja2FnZS5TT0xWRVJfX0RVQkxJTl9DT1JFOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlY29yYXRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBGSU5JVEVfRElGRkVSRU5DRV9fREVDT1JBVE9SUyA9IFNvbHZlclBhY2thZ2UuU09MVkVSX19ERUNPUkFUT1JTOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkZpbml0ZSBEaWZmZXJlbmNlPC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEZJTklURV9ESUZGRVJFTkNFX0ZFQVRVUkVfQ09VTlQgPSBTb2x2ZXJQYWNrYWdlLlNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMDsNCisNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5GaW5pdGVEaWZmZXJlbmNlIDxlbT5GaW5pdGUgRGlmZmVyZW5jZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5GaW5pdGUgRGlmZmVyZW5jZTwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuRmluaXRlRGlmZmVyZW5jZQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0RmluaXRlRGlmZmVyZW5jZSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRmRGYWN0b3J5IGdldEZkRmFjdG9yeSgpOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudA0KKwkgKiA8dWw+DQorCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4NCisJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4NCisJICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+DQorCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+DQorCSAqIDwvdWw+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnRlcmZhY2UgTGl0ZXJhbHMgew0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLmltcGwuRmluaXRlRGlmZmVyZW5jZUltcGwgPGVtPkZpbml0ZSBEaWZmZXJlbmNlPC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLmltcGwuRmluaXRlRGlmZmVyZW5jZUltcGwNCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLmltcGwuRmRQYWNrYWdlSW1wbCNnZXRGaW5pdGVEaWZmZXJlbmNlKCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIEZJTklURV9ESUZGRVJFTkNFID0gZUlOU1RBTkNFLmdldEZpbml0ZURpZmZlcmVuY2UoKTsNCisNCisJfQ0KKw0KK30gLy9GZFBhY2thZ2UNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9GaW5pdGVEaWZmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9GaW5pdGVEaWZmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5NjI1ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkL0Zpbml0ZURpZmZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDMxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXI7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GaW5pdGUgRGlmZmVyZW5jZTwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKg0KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLkZkUGFja2FnZSNnZXRGaW5pdGVEaWZmZXJlbmNlKCkNCisgKiBAbW9kZWwNCisgKiBAZ2VuZXJhdGVkDQorICovDQorQFN1cHByZXNzV2FybmluZ3MoImFsbCIpDQorcHVibGljIGludGVyZmFjZSBGaW5pdGVEaWZmZXJlbmNlIGV4dGVuZHMgU29sdmVyIHsNCisJDQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVSSV9UWVBFX1NPTFZFUl9TRUdNRU5UID0gIkZpbml0ZURpZmZlcmVuY2VTb2x2ZXIiOw0KKwkNCit9IC8vIEZpbml0ZURpZmZlcmVuY2UNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9pbXBsL0ZkRmFjdG9yeUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkL2ltcGwvRmRGYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NTQ1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9pbXBsL0ZkRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuaW1wbDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuKjsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEZkRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBGZEZhY3Rvcnkgew0KKwkvKioNCisJICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBGZEZhY3RvcnkgaW5pdCgpIHsNCisJCXRyeSB7DQorCQkJRmRGYWN0b3J5IHRoZUZkRmFjdG9yeSA9IChGZEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkIik7IA0KKwkJCWlmICh0aGVGZEZhY3RvcnkgIT0gbnVsbCkgew0KKwkJCQlyZXR1cm4gdGhlRmRGYWN0b3J5Ow0KKwkJCX0NCisJCX0NCisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQl9DQorCQlyZXR1cm4gbmV3IEZkRmFjdG9yeUltcGwoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBGZEZhY3RvcnlJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgew0KKwkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsNCisJCQljYXNlIEZkUGFja2FnZS5GSU5JVEVfRElGRkVSRU5DRTogcmV0dXJuIGNyZWF0ZUZpbml0ZURpZmZlcmVuY2UoKTsNCisJCQlkZWZhdWx0Og0KKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEZpbml0ZURpZmZlcmVuY2UgY3JlYXRlRmluaXRlRGlmZmVyZW5jZSgpIHsNCisJCUZpbml0ZURpZmZlcmVuY2VJbXBsIGZpbml0ZURpZmZlcmVuY2UgPSBuZXcgRmluaXRlRGlmZmVyZW5jZUltcGwoKTsNCisJCXJldHVybiBmaW5pdGVEaWZmZXJlbmNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEZkUGFja2FnZSBnZXRGZFBhY2thZ2UoKSB7DQorCQlyZXR1cm4gKEZkUGFja2FnZSlnZXRFUGFja2FnZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGRlcHJlY2F0ZWQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQERlcHJlY2F0ZWQNCisJcHVibGljIHN0YXRpYyBGZFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsNCisJCXJldHVybiBGZFBhY2thZ2UuZUlOU1RBTkNFOw0KKwl9DQorDQorfSAvL0ZkRmFjdG9yeUltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9pbXBsL0ZkSm9iLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9pbXBsL0ZkSm9iLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VkMjQ2YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkL2ltcGwvRmRKb2IuamF2YQpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CisKKy8qKgorICogQSBqb2IgZm9yIHRoZSBmaW5pdGUgZGlmZmVyZW5jZSBzb2x2ZXIKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGZEpvYiBleHRlbmRzIEpvYiB7CisJCisJcHVibGljIEZkSm9iKFN0cmluZyBuLCBzaG9ydCB0aHJlYWQsIEZpbml0ZURpZmZlcmVuY2VJbXBsIHMpIHsKKwkJc3VwZXIobik7CisJCXRoaXMudGhyZWFkbnVtID0gdGhyZWFkOworCQl0aGlzLnNvbHZlciA9IHM7CisJfQorCisJcHJvdGVjdGVkIGRvdWJsZSBwcm9ncmVzczsKKwlwcm90ZWN0ZWQgZG91YmxlIHQ7CisJcHJvdGVjdGVkIEZpbml0ZURpZmZlcmVuY2VJbXBsIHNvbHZlcjsKKwkKKwlwcm90ZWN0ZWQgU1RFTVRpbWUgdGltZTsKKwlsb25nIHRpbWVEZWx0YTsKKwlpbnQgY3ljbGU7CisJc2hvcnQgdGhyZWFkbnVtOworCQorCXB1YmxpYyBkb3VibGUgZ2V0UHJvZ3Jlc3MoKSB7CisJCXJldHVybiB0aGlzLnByb2dyZXNzOworCX0KKwlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzcyhkb3VibGUgcCkgeworCQl0aGlzLnByb2dyZXNzID0gcDsKKwl9CisJcHJvdGVjdGVkIElTdGF0dXMgcnVuKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlzb2x2ZXIuX3N0ZXAodGltZSx0aW1lRGVsdGEsY3ljbGUsdGhyZWFkbnVtKTsKKwkJCisJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkL2ltcGwvRmRQYWNrYWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvaW1wbC9GZFBhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBhYzIyMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkL2ltcGwvRmRQYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5pbXBsOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW9QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlclBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUGFja2FnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLkZkRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLkZkUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLkZpbml0ZURpZmZlcmVuY2U7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBGZFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgRmRQYWNrYWdlIHsNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBmaW5pdGVEaWZmZXJlbmNlRUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgNCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UNCisJICogcGFja2FnZSBVUkkgdmFsdWUuDQorCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMNCisJICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMNCisJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwNCisJICogaWYgb25lIGFscmVhZHkgZXhpc3RzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuRmRQYWNrYWdlI2VOU19VUkkNCisJICogQHNlZSAjaW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRmRQYWNrYWdlSW1wbCgpIHsNCisJCXN1cGVyKGVOU19VUkksIEZkRmFjdG9yeS5lSU5TVEFOQ0UpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOw0KKw0KKwkvKioNCisJICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzDQorCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlDQorCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsDQorCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcw0KKwkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsDQorCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuDQorCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gNCisJICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkDQorCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoNCisJICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkNCisJICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8NCisJICogdGhvc2Ugb2YgYW5vdGhlci4NCisJICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQ0KKwkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNlTlNfVVJJDQorCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpDQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIEZkUGFja2FnZSBpbml0KCkgew0KKwkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEZkUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShGZFBhY2thZ2UuZU5TX1VSSSk7DQorDQorCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlDQorCQlGZFBhY2thZ2VJbXBsIHRoZUZkUGFja2FnZSA9IChGZFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEZkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBGZFBhY2thZ2VJbXBsKCkpOw0KKw0KKwkJaXNJbml0ZWQgPSB0cnVlOw0KKw0KKwkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzDQorCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsNCisJCUdyYXBoUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7DQorCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOw0KKwkJTW9kaWZpZXJQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsNCisJCVNjZW5hcmlvUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7DQorCQlTZXF1ZW5jZXJQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsNCisJCVNvbHZlclBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOw0KKw0KKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMNCisJCXRoZUZkUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsNCisNCisJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGENCisJCXRoZUZkUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7DQorDQorCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkDQorCQl0aGVGZFBhY2thZ2UuZnJlZXplKCk7DQorDQorCQlyZXR1cm4gdGhlRmRQYWNrYWdlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRGaW5pdGVEaWZmZXJlbmNlKCkgew0KKwkJcmV0dXJuIGZpbml0ZURpZmZlcmVuY2VFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRmRGYWN0b3J5IGdldEZkRmFjdG9yeSgpIHsNCisJCXJldHVybiAoRmRGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsNCisNCisJLyoqDQorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcw0KKwkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7DQorCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47DQorCQlpc0NyZWF0ZWQgPSB0cnVlOw0KKw0KKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzDQorCQlmaW5pdGVEaWZmZXJlbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEZJTklURV9ESUZGRVJFTkNFKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7DQorDQorCS8qKg0KKwkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcw0KKwkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsNCisJCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47DQorCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsNCisNCisJCS8vIEluaXRpYWxpemUgcGFja2FnZQ0KKwkJc2V0TmFtZShlTkFNRSk7DQorCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsNCisJCXNldE5zVVJJKGVOU19VUkkpOw0KKw0KKwkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcw0KKwkJU29sdmVyUGFja2FnZSB0aGVTb2x2ZXJQYWNrYWdlID0gKFNvbHZlclBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoU29sdmVyUGFja2FnZS5lTlNfVVJJKTsNCisNCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMNCisNCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycw0KKw0KKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3Nlcw0KKwkJZmluaXRlRGlmZmVyZW5jZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVTb2x2ZXJQYWNrYWdlLmdldFNvbHZlcigpKTsNCisNCisJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzDQorCQlpbml0RUNsYXNzKGZpbml0ZURpZmZlcmVuY2VFQ2xhc3MsIEZpbml0ZURpZmZlcmVuY2UuY2xhc3MsICJGaW5pdGVEaWZmZXJlbmNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKw0KKwkJLy8gQ3JlYXRlIHJlc291cmNlDQorCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsNCisJfQ0KKw0KK30gLy9GZFBhY2thZ2VJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvaW1wbC9GaW5pdGVEaWZmZXJlbmNlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvaW1wbC9GaW5pdGVEaWZmZXJlbmNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZjA4NzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9pbXBsL0Zpbml0ZURpZmZlcmVuY2VJbXBsLmphdmEKQEAgLTAsMCArMSwyNDggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLmltcGw7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWxWYWx1ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TaW1wbGVEYXRhRXhjaGFuZ2VMYWJlbFZhbHVlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5pbXBsLlNvbHZlckltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5GZFBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5GaW5pdGVEaWZmZXJlbmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GaW5pdGUgRGlmZmVyZW5jZTwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBGaW5pdGVEaWZmZXJlbmNlSW1wbCBleHRlbmRzIFNvbHZlckltcGwgaW1wbGVtZW50cyBGaW5pdGVEaWZmZXJlbmNlIHsNCisJDQorCS8vIFRoZSB3b3JrZXIgam9icw0KKwlwcml2YXRlIEZkSm9iIFtdIGpvYnM7DQorCS8vIE51bWJlciBvZiB0aHJlYWRzDQorCXByaXZhdGUgc2hvcnQgbnVtX3RocmVhZHM7DQorCQ0KKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1BST0dSRVNTX1JFUE9SVFMgPSA1Ow0KKwkNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIEZpbml0ZURpZmZlcmVuY2VJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gc3RlcChTVEVNVGltZSB0aW1lLCBsb25nIHRpbWVEZWx0YSwgaW50IGN5Y2xlKSB7DQorCQkNCisJCUFjdGl2YXRvciBhY3QgPSBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvci5nZXREZWZhdWx0KCk7DQorCQlpZihhY3QgIT0gbnVsbCkgew0KKwkJCWZpbmFsIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gYWN0LmdldFBsdWdpblByZWZlcmVuY2VzKCk7DQorCQkJbnVtX3RocmVhZHMgPSAoc2hvcnQpcHJlZmVyZW5jZXMuZ2V0SW50KG9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50cy5TSU1VTEFUSU9OX1RIUkVBRFMpOw0KKwkJfSBlbHNlIG51bV90aHJlYWRzID0gMjsgLy8gSnVzdCBzbyB3ZSBjYW4gcnVuIGluc2lkZSBqdW5pdCB0ZXN0DQorCQkNCisJCS8vIEZpbmQgdHJpZ2dlcnMgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZSBpbnZva2VkDQorCQlmb3IoRGVjb3JhdG9yIGRlY29yYXRvcjp0aGlzLmdldERlY29yYXRvcnMoKSkgew0KKwkJCWlmKGRlY29yYXRvciBpbnN0YW5jZW9mIFRyaWdnZXIpIHsNCisJCQkJZGVjb3JhdG9yLnVwZGF0ZUxhYmVscyh0aW1lLCB0aW1lRGVsdGEsIGN5Y2xlKTsNCisJCQl9DQorCQl9CQkNCisJCQ0KKwkJLy8gRmlyc3QgaW5pdGlhbGl6ZSB0aGUgWSBhbmQgdGVtcCBsYWJlbCB2YWx1ZXMgZnJvbSB0aGUgY3VycmVudA0KKwkJLy8gbGFiZWwgdmFsdWVzLg0KKwkJDQorCQlmb3IoRGVjb3JhdG9yIGRlY29yYXRvcjp0aGlzLmdldERlY29yYXRvcnMoKSkgew0KKwkJCUVMaXN0PER5bmFtaWNMYWJlbD5hbGxMYWJlbHMgPSBkZWNvcmF0b3IuZ2V0TGFiZWxzVG9VcGRhdGUoKTsNCisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPER5bmFtaWNMYWJlbD4gY3VycmVudFN0YXRlTGFiZWxJdGVyID0gYWxsTGFiZWxzDQorCQkJCQkuaXRlcmF0b3IoKTsgY3VycmVudFN0YXRlTGFiZWxJdGVyLmhhc05leHQoKTspIHsNCisJCQkJaWYoZGVjb3JhdG9yIGluc3RhbmNlb2YgSW50ZWdyYXRpb25EZWNvcmF0b3IpIHsNCisJCQkJCS8vIEl0J3MgYSBzdGFuZGFyZCBkaXNlYXNlIG1vZGVsIHdpdGggYSBzdGFuZGFyZCBkaXNlYXNlIG1vZGVsIGxhYmVsDQorCQkJCQlmaW5hbCBJbnRlZ3JhdGlvbkxhYmVsIGlMYWJlbCA9IChJbnRlZ3JhdGlvbkxhYmVsKSBjdXJyZW50U3RhdGVMYWJlbEl0ZXIubmV4dCgpOw0KKwkJCQkJKChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpaUxhYmVsLmdldFByb2JlVmFsdWUoKSkuc2V0KChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpaUxhYmVsLmdldEN1cnJlbnRWYWx1ZSgpKTsNCisJCQkJCSgoSW50ZWdyYXRpb25MYWJlbFZhbHVlKWlMYWJlbC5nZXRUZW1wVmFsdWUoKSkuc2V0KChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpaUxhYmVsLmdldEN1cnJlbnRWYWx1ZSgpKTsNCisJCQkJfSBlbHNlIGN1cnJlbnRTdGF0ZUxhYmVsSXRlci5uZXh0KCk7DQorCQkJfQ0KKwkJfQ0KKwkJCQ0KKwkJaWYoam9icyA9PSBudWxsIHx8IGpvYnMubGVuZ3RoICE9IG51bV90aHJlYWRzKSB7DQorCQkJLy8gSW5pdGlhbGl6ZSB0aGUgam9icyBpZiBub3QgZG9uZSB5ZXQgb3Igb2YgdGhlIG51bWJlciBvZiB0aHJlYWRzIGNoYW5nZXMNCisJCQlqb2JzID0gbmV3IEZkSm9iW251bV90aHJlYWRzXTsNCisJDQorCQkJZm9yKGludCBpPTA7aTxudW1fdGhyZWFkczsrK2kpIHsNCisJCQkJZmluYWwgc2hvcnQgdGhyZWFkbnVtID0gKHNob3J0KWk7DQorCQkJCWpvYnNbaV0gPSBuZXcgRmRKb2IoIkZpbml0ZSBEaWZmZXJlbmNlIFdvcmtlciAiK2ksIHRocmVhZG51bSwgdGhpcyk7DQorCQkJfSAvLyBGb3IgZWFjaCBqb2INCisJCX0gLy8gSWYgbm90IGluaXRpYWxpemVkDQorDQorCQkvLyBJbml0aWFsaXplDQorCQ0KKwkJZm9yKEZkSm9iIGo6am9icykgew0KKwkJCWouY3ljbGUgPSBjeWNsZTsNCisJCQlqLnRpbWUgPSB0aW1lOw0KKwkJCWoudGltZURlbHRhID0gdGltZURlbHRhOw0KKwkJfQ0KKwkJDQorCQkvLyBTY2hlZHVsZS4gSm9icyBjYW4gYmUgcmVzY2hlZHVsZWQgYWZ0ZXIgZmluaXNoZWQNCisJCWZvcihGZEpvYiBqOmpvYnMpIA0KKwkJCWouc2NoZWR1bGUoKTsNCisJCQ0KKwkJLy8gV2FpdCB1bnRpbCBhbGwgam9icyBjb21wbGV0ZWQNCisJCWZvcihGZEpvYiBqIDogam9icykgew0KKwkJCXRyeSB7DQorCQkJCWouam9pbigpOw0KKwkJCX0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKGllLmdldE1lc3NhZ2UoKSwgaWUpOw0KKwkJCX0NCisJCX0NCisJCQ0KKwkJLy8gU2V0IHRoZSBjb21tb24gdGltZSBhbmQgc3RlcCBzaXplIGhlcmUgYW5kIHZhbGlkYXRlIGV2ZXJ5dGhpbmcgaXMgcmlnaHQNCisJCS8vZG91YmxlIG1pblN0ZXAgPSBEb3VibGUuTUFYX1ZBTFVFOw0KKwkJLy9kb3VibGUgY3VycmVudFQgPSBqb2JzWzBdLnQ7DQorCQkvL2ZvcihTaW1Kb2IgaiA6IGpvYnMpIHsNCisJCQkvLyBUaGUgam9icyBoYXZlIGNhbGN1bGF0ZWQgbmV3IHN0ZXAgc2l6ZXMgYWZ0ZXIgdGhleSBmaW5pc2hlZC4gUGljayB0aGUNCisJCQkvLyBzbWFsbGVzdCBvbmUgZm9yIHRoZSBuZXh0IGN5Y2xlDQorCQkvLwlpZihqLmggPCBtaW5TdGVwKSBtaW5TdGVwID0gai5oOw0KKwkJLy8JaWYoai50ICE9IGN1cnJlbnRUKSBBY3RpdmF0b3IubG9nRXJyb3IoIkVycm9yLCBvbmUgdGhyZWFkIHdhcyBpbiBtaXNzdGVwIHdpdGggb3RoZXIgdGhyZWFkcywgaXRzIHRpbWUgd2FzICIrai50KyIgdmVyc3VzICIrY3VycmVudFQsIG5ldyBFeGNlcHRpb24oKSk7DQorCQkvL30NCisJCQ0KKwkJLy90aGlzLnNldEN1cnJlbnRYKGN1cnJlbnRUKTsNCisJCS8vdGhpcy5zZXRTdGVwU2l6ZShtaW5TdGVwKTsgLy8gc21hbGxlc3Qgb25lIGZyb20gYWJvdmUuDQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKwkNCisJLyoqDQorCSAqIF9zdGVwIERvIHRoZSBzdGVwIGZvciBhIHNpbmdsZSB0aHJlYWQNCisJICogDQorCSAqIEBwYXJhbSB0aW1lDQorCSAqIEBwYXJhbSB0aW1lRGVsdGENCisJICogQHBhcmFtIGN5Y2xlDQorCSAqIEBwYXJhbSB0aHJlYWRudW0NCisJICovDQorCXByb3RlY3RlZCB2b2lkIF9zdGVwKFNURU1UaW1lIHRpbWUsIGxvbmcgdGltZURlbHRhLCBpbnQgY3ljbGUsIHNob3J0IHRocmVhZG51bSkgew0KKwkJLy8gTm93IGdpdmUgZWFjaCBkZWNvcmF0b3IgYSBjaGFuY2UgdG8gdXBkYXRlIGl0cyBkeW5hbWljDQorCQkvLyBsYWJlbHMgaW4gdGhlIGNhbm9uaWNhbCBncmFwaCwgYnV0IG9ubHkgaWYgaXQgaXMgZW5hYmxlZC4gQQ0KKwkJLy8gRGVjb3JhdG9yIG1pZ2h0IG5vdCBiZSBlbmFibGVkIGlmIGl0IGlzIHRoZSBhY3Rpb24gb2YgYSBUcmlnZ2VyDQorCQkvLyBhbmQgdGhlIFByZWRpY2F0ZSBvZiB0aGUgdHJpZ2dlciBpcyBmYWxzZS4NCisJCUVMaXN0PEludGVncmF0aW9uRGVjb3JhdG9yPiBpRGVjb3JhdG9ycyA9IG5ldyBCYXNpY0VMaXN0PEludGVncmF0aW9uRGVjb3JhdG9yPigpOw0KKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxEZWNvcmF0b3I+IGRlY29yYXRvckl0ZXIgPSB0aGlzDQorCQkJCS5nZXREZWNvcmF0b3JzKCkuaXRlcmF0b3IoKTsgZGVjb3JhdG9ySXRlci5oYXNOZXh0KCk7KSB7DQorCQkJZmluYWwgRGVjb3JhdG9yIGRlY29yYXRvciA9IGRlY29yYXRvckl0ZXIubmV4dCgpOw0KKwkJCS8vIElzIHRoZSBkZWNvcmF0b3IgZW5hYmxlZD8NCisJCQlpZiAoZGVjb3JhdG9yLmlzRW5hYmxlZCgpICYmIGRlY29yYXRvciBpbnN0YW5jZW9mIEludGVncmF0aW9uRGVjb3JhdG9yKSBpRGVjb3JhdG9ycy5hZGQoKEludGVncmF0aW9uRGVjb3JhdG9yKWRlY29yYXRvcik7DQorCQl9DQorCQkNCisJCWZvcihJbnRlZ3JhdGlvbkRlY29yYXRvciBpbW9kZWw6aURlY29yYXRvcnMpDQorCQkJaW1vZGVsLmNhbGN1bGF0ZURlbHRhKHRpbWUsIHRpbWVEZWx0YSwgKChEZWNvcmF0b3IpaW1vZGVsKS5nZXRMYWJlbHNUb1VwZGF0ZSh0aHJlYWRudW0sIG51bV90aHJlYWRzKSk7DQorCQlmb3IoSW50ZWdyYXRpb25EZWNvcmF0b3IgaW1vZGVsOmlEZWNvcmF0b3JzKQ0KKwkJCWltb2RlbC5hcHBseUV4dGVybmFsRGVsdGFzKHRpbWUsIHRpbWVEZWx0YSwgKChEZWNvcmF0b3IpaW1vZGVsKS5nZXRMYWJlbHNUb1VwZGF0ZSh0aHJlYWRudW0sIG51bV90aHJlYWRzKSk7DQorCQkNCisJCWZvcihJbnRlZ3JhdGlvbkRlY29yYXRvciBpbW9kZWw6aURlY29yYXRvcnMpDQorCQkJdXBkYXRlU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbHMoKERlY29yYXRvcilpbW9kZWwsIHRpbWUsIHRpbWVEZWx0YSwgY3ljbGUsIHRocmVhZG51bSk7DQorCQkJCQ0KKwl9DQorCQ0KKwkNCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbHMoRGVjb3JhdG9yIG1vZGVsLCBTVEVNVGltZSB0aW1lLCBsb25nIHRpbWVEZWx0YSwgaW50IGN5Y2xlLCBzaG9ydCB0aHJlYWRudW0pIHsNCisJCQ0KKwkJRUxpc3Q8RHluYW1pY0xhYmVsPiBteUxhYmVscyA9IG1vZGVsLmdldExhYmVsc1RvVXBkYXRlKHRocmVhZG51bSwgbnVtX3RocmVhZHMpOw0KKwkJDQorCQlJbnRlZ3JhdGlvbkRlY29yYXRvciBpbW9kZWwgPSAoSW50ZWdyYXRpb25EZWNvcmF0b3IpbW9kZWw7DQorCQkNCisJCWludCBudW1MYWJlbHMgPSBteUxhYmVscy5zaXplKCk7DQorCQlpbnQgc2V0UHJvZ3Jlc3NFdmVyeU50aE5vZGUgPSBudW1fdGhyZWFkcyAqIG51bUxhYmVscy8oTUFYX1BST0dSRVNTX1JFUE9SVFMpOw0KKwkJaWYoc2V0UHJvZ3Jlc3NFdmVyeU50aE5vZGUgPT0gMCkgc2V0UHJvZ3Jlc3NFdmVyeU50aE5vZGUgPSAxOw0KKwkJaW50IG49MDsNCisJCS8vIEluaXRpYWxpemUgdGhlIG5leHQgdmFsdWUgZnJvbSB0aGUgY3VycmVudCB2YWx1ZSBhbmQgYWRkIHRoZSBkZWx0YQ0KKwkJZm9yIChmaW5hbCBJdGVyYXRvcjxEeW5hbWljTGFiZWw+IGN1cnJlbnRTdGF0ZUxhYmVsSXRlciA9IG15TGFiZWxzDQorCQkJCS5pdGVyYXRvcigpOyBjdXJyZW50U3RhdGVMYWJlbEl0ZXIuaGFzTmV4dCgpOykgew0KKwkJCWZpbmFsIEludGVncmF0aW9uTGFiZWwgaUxhYmVsID0gKEludGVncmF0aW9uTGFiZWwpIGN1cnJlbnRTdGF0ZUxhYmVsSXRlci5uZXh0KCk7DQorCQkJSW50ZWdyYXRpb25MYWJlbFZhbHVlIG5leHRTdGF0ZSA9IChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpaUxhYmVsLmdldE5leHRWYWx1ZSgpOw0KKwkJCQ0KKwkJCUludGVncmF0aW9uTGFiZWxWYWx1ZSBkZWx0YSA9IChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpaUxhYmVsLmdldERlbHRhVmFsdWUoKTsNCisJCQkvLyBGb3IgZmluaXRlIGRpZmZlcmVuY2UsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0DQorCQkJLy8gbW92ZSB0b28gbWFueSBwZW9wbGUgZnJvbSBvbmUgc3RhdGUgdG8gYW5vdGhlcg0KKwkJCWRlbHRhLmFkanVzdERlbHRhKChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpaUxhYmVsLmdldEN1cnJlbnRWYWx1ZSgpKTsNCisJCQkNCisJCQkvLyBTZXQgZGVsdGEgZmlyc3QuIFRoaXMgd2lsbCBjb3B5IG5vbi1hZGRpdGl2ZSB2YWx1ZXMgbGlrZSBpbmNpZGVuY2UgZXRjLg0KKwkJCW5leHRTdGF0ZS5zZXQoZGVsdGEpOw0KKwkJCQ0KKwkJCS8vIEFkZCB0aGUgb3JpZ2luYWwgdmFsdWUNCisJCQluZXh0U3RhdGUuYWRkKChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpaUxhYmVsLmdldEN1cnJlbnRWYWx1ZSgpKTsNCisNCisJCQkvLyBEbyBhbnkgbW9kZWwgc3BlY2lmaWMgd29yayBmb3IgaW5zdGFuY2UgYWRkIG5vaXNlDQorCQkJaW1vZGVsLmRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKChMYWJlbFZhbHVlKW5leHRTdGF0ZSk7DQorCQkJDQorCQkJLy8gVGhlIG5leHQgdmFsdWUgaXMgdmFsaWQgbm93Lg0KKwkJCWlMYWJlbC5zZXROZXh0VmFsdWVWYWxpZCh0cnVlKTsNCisJCQkvLyBOb3cgYWRkIGluIHRoZSBwb3B1bGF0aW9uIHNvIHdlIGNhbiBjb21wdXRlIHRoZSByZWNpcHJvY2FsDQorCQkJLy8gbmV4dCBjeWNsZS4NCisvLwkJCWFkZFRvVG90YWxQb3B1bGF0aW9uQ291bnQobmV4dFN0YXRlLmdldFBvcHVsYXRpb25Db3VudCgpKTsNCisJCQ0KKwkJCWRvdWJsZSBwcm9ncmVzcyA9IChkb3VibGUpbi8oZG91YmxlKW51bUxhYmVsczsNCisJCQlqb2JzW3RocmVhZG51bV0uc2V0UHJvZ3Jlc3MocHJvZ3Jlc3MpOw0KKwkJCWlmKG4lc2V0UHJvZ3Jlc3NFdmVyeU50aE5vZGU9PTApIHsNCisJCQkJLy8gR2V0IHRoZSBwcm9ncmVzcyBmb3IgYWxsIHRocmVhZHMNCisJCQkJZm9yKGludCBpPTA7aTxudW1fdGhyZWFkczsrK2kpIGlmKGkhPXRocmVhZG51bSAmJiBqb2JzW2ldICE9IG51bGwpIHByb2dyZXNzKz1qb2JzW2ldLmdldFByb2dyZXNzKCk7DQorCQkJCXByb2dyZXNzIC89IG51bV90aHJlYWRzOw0KKwkJCQltb2RlbC5zZXRQcm9ncmVzcyhwcm9ncmVzcyk7DQorCQkJfQ0KKwkJCSsrbjsNCisJCQkNCisJCX0NCisJCS8vIERvbmUNCisvLwkJdGhpcy5zZXRQcm9ncmVzcygxLjApOw0KKwl9DQorCQ0KKwkvKioNCisJICogUmVzZXQgdGhlIHNvbHZlcg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIHJlc2V0KCkgew0KKwkJdGhpcy5zZXRJbml0aWFsaXplZChmYWxzZSk7DQorCX0NCisJDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KKwkJcmV0dXJuIEZkUGFja2FnZS5MaXRlcmFscy5GSU5JVEVfRElGRkVSRU5DRTsNCisJfQ0KKw0KK30gLy9GaW5pdGVEaWZmZXJlbmNlSW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkL3Byb3ZpZGVyL0ZkRWRpdFBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvcHJvdmlkZXIvRmRFZGl0UGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1ODdkNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkL3Byb3ZpZGVyL0ZkRWRpdFBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5wcm92aWRlcjsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5FTUZQbHVnaW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUVkaXRQbHVnaW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47DQorDQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBGZCBlZGl0IHBsdWdpbi4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitAU3VwcHJlc3NXYXJuaW5ncygic3ludGhldGljLWFjY2VzcyIpDQorcHVibGljIGZpbmFsIGNsYXNzIEZkRWRpdFBsdWdpbiBleHRlbmRzIEVNRlBsdWdpbiB7DQorCS8qKg0KKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEZkRWRpdFBsdWdpbiBJTlNUQU5DRSA9IG5ldyBGZEVkaXRQbHVnaW4oKTsNCisNCisJLyoqDQorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsNCisNCisJLyoqDQorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRmRFZGl0UGx1Z2luKCkgew0KKwkJc3VwZXINCisJCSAgKG5ldyBSZXNvdXJjZUxvY2F0b3IgW10gew0KKwkJICAgICBDb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwNCisJCSAgICAgRWNvcmVFZGl0UGx1Z2luLklOU1RBTkNFLA0KKwkJICAgfSk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsNCisJCXJldHVybiBwbHVnaW47DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgew0KKwkJcmV0dXJuIHBsdWdpbjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbiBleHRlbmRzIEVjbGlwc2VQbHVnaW4gew0KKwkJLyoqDQorCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7DQorCQkJc3VwZXIoKTsNCisNCisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLg0KKwkJCS8vDQorCQkJcGx1Z2luID0gdGhpczsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9wcm92aWRlci9GZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9wcm92aWRlci9GZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjYzQ0NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkL3Byb3ZpZGVyL0ZkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDIwOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQucHJvdmlkZXI7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC51dGlsLkZkQWRhcHRlckZhY3Rvcnk7DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLg0KKyAqIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKyAqIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuDQorICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBGZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgRmRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgew0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248T2JqZWN0PiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KKw0KKwkvKioNCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEZkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7DQorCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOw0KKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQorCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOw0KKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5GaW5pdGVEaWZmZXJlbmNlfSBpbnN0YW5jZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRmluaXRlRGlmZmVyZW5jZUl0ZW1Qcm92aWRlciBmaW5pdGVEaWZmZXJlbmNlSXRlbVByb3ZpZGVyOw0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5GaW5pdGVEaWZmZXJlbmNlfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVGaW5pdGVEaWZmZXJlbmNlQWRhcHRlcigpIHsNCisJCWlmIChmaW5pdGVEaWZmZXJlbmNlSXRlbVByb3ZpZGVyID09IG51bGwpIHsNCisJCQlmaW5pdGVEaWZmZXJlbmNlSXRlbVByb3ZpZGVyID0gbmV3IEZpbml0ZURpZmZlcmVuY2VJdGVtUHJvdmlkZXIodGhpcyk7DQorCQl9DQorDQorCQlyZXR1cm4gZmluaXRlRGlmZmVyZW5jZUl0ZW1Qcm92aWRlcjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsNCisJCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsNCisJCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7DQorCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7DQorCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsNCisJCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7DQorCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOw0KKwkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3M8Pz4pdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsNCisJCQkJcmV0dXJuIGFkYXB0ZXI7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsNCisJCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsNCisJCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9IGFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorDQorCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgew0KKwkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4gDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KKwkJaWYgKGZpbml0ZURpZmZlcmVuY2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkgZmluaXRlRGlmZmVyZW5jZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvcHJvdmlkZXIvRmluaXRlRGlmZmVyZW5jZUl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvcHJvdmlkZXIvRmluaXRlRGlmZmVyZW5jZUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YzI1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9wcm92aWRlci9GaW5pdGVEaWZmZXJlbmNlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNDcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLnByb3ZpZGVyOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5wcm92aWRlci5Tb2x2ZXJJdGVtUHJvdmlkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5GaW5pdGVEaWZmZXJlbmNlOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLkZpbml0ZURpZmZlcmVuY2V9IG9iamVjdC4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgRmluaXRlRGlmZmVyZW5jZUl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIFNvbHZlckl0ZW1Qcm92aWRlcg0KKwlpbXBsZW1lbnRzDQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwNCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlJdGVtTGFiZWxQcm92aWRlciwNCisJCUlJdGVtUHJvcGVydHlTb3VyY2Ugew0KKwkvKioNCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEZpbml0ZURpZmZlcmVuY2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQorDQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyBGaW5pdGVEaWZmZXJlbmNlLmdpZi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9GaW5pdGVEaWZmZXJlbmNlIikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEdlbihPYmplY3Qgb2JqZWN0KSB7DQorCQlVUkkgbGFiZWxWYWx1ZSA9ICgoRmluaXRlRGlmZmVyZW5jZSlvYmplY3QpLmdldFVSSSgpOw0KKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX0Zpbml0ZURpZmZlcmVuY2VfdHlwZSIpIDoNCisJCQlnZXRTdHJpbmcoIl9VSV9GaW5pdGVEaWZmZXJlbmNlX3R5cGUiKSArICIgIiArIGxhYmVsOw0KKwl9DQorCQ0KKwkvKioNCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KKwkJcmV0dXJuIEZkRWRpdFBsdWdpbi5JTlNUQU5DRTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC91dGlsL0ZkQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkL3V0aWwvRmRBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNGJhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC91dGlsL0ZkQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE4OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQudXRpbDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuKjsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuDQorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuRmRQYWNrYWdlDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBGZEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgRmRQYWNrYWdlIG1vZGVsUGFja2FnZTsNCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBGZEFkYXB0ZXJGYWN0b3J5KCkgew0KKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7DQorCQkJbW9kZWxQYWNrYWdlID0gRmRQYWNrYWdlLmVJTlNUQU5DRTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Lg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsNCisJCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSANCisJcHJvdGVjdGVkIEZkU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0NCisJCW5ldyBGZFN3aXRjaDxBZGFwdGVyPigpIHsNCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRmluaXRlRGlmZmVyZW5jZShGaW5pdGVEaWZmZXJlbmNlIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlRmluaXRlRGlmZmVyZW5jZUFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIDxUPiBBZGFwdGVyIGNhc2VDb21wYXJhYmxlKENvbXBhcmFibGU8VD4gb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNvbHZlcihTb2x2ZXIgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVTb2x2ZXJBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOw0KKwkJCX0NCisJCX07DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0Lg0KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7DQorCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsNCisJfQ0KKw0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuRmluaXRlRGlmZmVyZW5jZSA8ZW0+RmluaXRlIERpZmZlcmVuY2U8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLkZpbml0ZURpZmZlcmVuY2UNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRmluaXRlRGlmZmVyZW5jZUFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLmxhbmcuQ29tcGFyYWJsZSA8ZW0+Q29tcGFyYWJsZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlIDxlbT5JZGVudGlmaWFibGU8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyIDxlbT5Tb2x2ZXI8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU29sdmVyQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30gLy9GZEFkYXB0ZXJGYWN0b3J5DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvdXRpbC9GZFN3aXRjaC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvdXRpbC9GZFN3aXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZWY3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC91dGlsL0ZkU3dpdGNoLmphdmEKQEAgLTAsMCArMSwxODggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLnV0aWw7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuKjsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuDQorICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQ0KKyAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwNCisgKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdA0KKyAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkNCisgKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwNCisgKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuRmRQYWNrYWdlDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQ0KK3B1YmxpYyBjbGFzcyBGZFN3aXRjaDxUMT4gew0KKwkvKioNCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIEZkUGFja2FnZSBtb2RlbFBhY2thZ2U7DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRmRTd2l0Y2goKSB7DQorCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsNCisJCQltb2RlbFBhY2thZ2UgPSBGZFBhY2thZ2UuZUlOU1RBTkNFOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsNCisJCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7DQorCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsNCisJCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsNCisJCX0NCisJCWVsc2Ugew0KKwkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOw0KKwkJCXJldHVybg0KKwkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPw0KKwkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOg0KKwkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7DQorCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgew0KKwkJCWNhc2UgRmRQYWNrYWdlLkZJTklURV9ESUZGRVJFTkNFOiB7DQorCQkJCUZpbml0ZURpZmZlcmVuY2UgZmluaXRlRGlmZmVyZW5jZSA9IChGaW5pdGVEaWZmZXJlbmNlKXRoZUVPYmplY3Q7DQorCQkJCVQxIHJlc3VsdCA9IGNhc2VGaW5pdGVEaWZmZXJlbmNlKGZpbml0ZURpZmZlcmVuY2UpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTb2x2ZXIoZmluaXRlRGlmZmVyZW5jZSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShmaW5pdGVEaWZmZXJlbmNlKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShmaW5pdGVEaWZmZXJlbmNlKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GaW5pdGUgRGlmZmVyZW5jZTwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZpbml0ZSBEaWZmZXJlbmNlPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VGaW5pdGVEaWZmZXJlbmNlKEZpbml0ZURpZmZlcmVuY2Ugb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgPFQ+IFQxIGNhc2VDb21wYXJhYmxlKENvbXBhcmFibGU8VD4gb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNvbHZlcjwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNvbHZlcjwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlU29sdmVyKFNvbHZlciBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVDEgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfSAvL0ZkU3dpdGNoDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWYwMjRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxjbGFzc3BhdGg+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCis8L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiNmZiMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxwcm9qZWN0RGVzY3JpcHRpb24+DQorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yazwvbmFtZT4NCisJPGNvbW1lbnQ+PC9jb21tZW50Pg0KKwk8cHJvamVjdHM+DQorCTwvcHJvamVjdHM+DQorCTxidWlsZFNwZWM+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJPC9idWlsZFNwZWM+DQorCTxuYXR1cmVzPg0KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCisJPC9uYXR1cmVzPg0KKzwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MTgyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsMjEgQEAKKyNUdWUgU2VwIDAxIDE2OjU1OjU0IEVEVCAyMDA5CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb249cmV0dXJuX3RhZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2U3ODhmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMjAgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMA0KK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUNCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucms7c2luZ2xldG9uOj10cnVlDQorQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcg0KK0J1bmRsZS1DbGFzc1BhdGg6IC4NCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lDQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yaywNCisgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLmltcGwsDQorIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5wcm92aWRlciwNCisgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLnV0aWwNCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsDQorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQ7YnVuZGxlLXZlcnNpb249IjIuNC4xIiwNCisgb3JnLmVjbGlwc2Uuc3RlbS51aSwNCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzDQorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MjJhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE1IEBACisNCisjIDxjb3B5cmlnaHQ+DQorIyA8L2NvcHlyaWdodD4NCisjDQorIyAkSWQkDQorDQorYmluLmluY2x1ZGVzID0gLixcDQorICAgICAgICAgICAgICAgbW9kZWwvLFwNCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXA0KKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwNCisgICAgICAgICAgICAgICBpY29ucy8NCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuDQorc291cmNlLi4gPSBzcmMvDQorb3V0cHV0Li4gPSBiaW4vDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL2ljb25zL2Z1bGwvb2JqMTYvUnVuZ2VLdXR0YS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvaWNvbnMvZnVsbC9vYmoxNi9SdW5nZUt1dHRhLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGUzY2YyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL2ljb25zL2Z1bGwvb2JqMTYvUnVuZ2VLdXR0YS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL21vZGVsL3JrLmVjb3JlIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL21vZGVsL3JrLmVjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNjgwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvbW9kZWwvcmsuZWNvcmUKQEAgLTAsMCArMSwxMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCINCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KKyAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0icmsiDQorICAgIG5zVVJJPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yayIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yayI+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJ1bmdlS3V0dGEiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvc29sdmVyLmVjb3JlIy8vU29sdmVyIj4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbGF0aXZlVG9sZXJhbmNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRURvdWJsZSINCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjFFLTkiLz4NCisgIDwvZUNsYXNzaWZpZXJzPg0KKzwvZWNvcmU6RVBhY2thZ2U+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL21vZGVsL3JrLmdlbm1vZGVsIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL21vZGVsL3JrLmdlbm1vZGVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMzBjOGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvbW9kZWwvcmsuZ2VubW9kZWwKQEAgLTAsMCArMSwxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCINCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSINCisgICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL3NyYyINCisgICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9zcmMiDQorICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yayIgbW9kZWxOYW1lPSJSayIgdGVzdHNEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnNvbHZlcnMucmsvc3JjIg0KKyAgICBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIuZWNvcmUiIGNvbXBsaWFuY2VMZXZlbD0iNi4wIiBjb3B5cmlnaHRGaWVsZHM9ImZhbHNlIg0KKyAgICB1c2VkR2VuUGFja2FnZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vY29tbW9uIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vZ3JhcGggLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9tb2RlbCAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL21vZGlmaWVyIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vc2NlbmFyaW8gLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9zZXF1ZW5jZXIgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9zb2x2ZXIgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZSI+DQorICA8Zm9yZWlnbk1vZGVsPnJrLmVjb3JlPC9mb3JlaWduTW9kZWw+DQorICA8Z2VuUGFja2FnZXMgcHJlZml4PSJSayIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycyIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSINCisgICAgICBlY29yZVBhY2thZ2U9InJrLmVjb3JlIy8iPg0KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJyay5lY29yZSMvL1J1bmdlS3V0dGEiPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSByay5lY29yZSMvL1J1bmdlS3V0dGEvcmVsYXRpdmVUb2xlcmFuY2UiLz4NCisgICAgPC9nZW5DbGFzc2VzPg0KKyAgPC9nZW5QYWNrYWdlcz4NCis8L2dlbm1vZGVsOkdlbk1vZGVsPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQ2YmM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL3BsdWdpbi5wcm9wZXJ0aWVzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3ZWUwOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsNDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/Pg0KKw0KKzwhLS0NCisgPGNvcHlyaWdodD4NCisgPC9jb3B5cmlnaHQ+DQorDQorICRJZCQNCistLT4NCisNCis8cGx1Z2luPg0KKw0KKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+DQorICAgICAgPHBhY2thZ2UNCisgICAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrIg0KKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuUmtQYWNrYWdlIg0KKyAgICAgICAgICAgIGdlbk1vZGVsPSJtb2RlbC9yay5nZW5tb2RlbCIvPg0KKyAgIDwvZXh0ZW5zaW9uPg0KKyAgIDxleHRlbnNpb24NCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlciI+DQorICAgICAgPGNsYXNzZGVmDQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5pbXBsLlJ1bmdlS3V0dGFJbXBsIj4NCisgICAgICA8L2NsYXNzZGVmPg0KKyAgICAgIDxkdWJsaW5fY29yZQ0KKyAgICAgICAgICAgIGNhdGVnb3J5X2lkPSIvIg0KKyAgICAgICAgICAgIGlkZW50aWZpZXI9Im9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5kdWJsaW5fY29yZTIiDQorICAgICAgICAgICAgdGl0bGU9Im9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5kdWJsaW5fY29yZTIiPg0KKyAgICAgIDwvZHVibGluX2NvcmU+DQorICAgPC9leHRlbnNpb24+DQorICAgPGV4dGVuc2lvbg0KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5pdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yaWVzIj4NCisgICAgICA8ZmFjdG9yeQ0KKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsucHJvdmlkZXIuUmtJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSINCisgICAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrIg0KKyAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzPQ0KKyAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyDQorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyDQorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyDQorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyDQorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSI+DQorICAgICAgPC9mYWN0b3J5Pg0KKyAgIDwvZXh0ZW5zaW9uPg0KKzwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL1JrRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvUmtGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmZmZjZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL1JrRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4NCisgKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5Sa1BhY2thZ2UNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBSa0ZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7DQorCS8qKg0KKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJUmtGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5pbXBsLlJrRmFjdG9yeUltcGwuaW5pdCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SdW5nZSBLdXR0YTwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UnVuZ2UgS3V0dGE8L2VtPicuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVJ1bmdlS3V0dGEgY3JlYXRlUnVuZ2VLdXR0YSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5Lg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlSa1BhY2thZ2UgZ2V0UmtQYWNrYWdlKCk7DQorDQorfSAvL1JrRmFjdG9yeQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL1JrUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvUmtQYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyYThhNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL1JrUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsMTk2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yazsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXJQYWNrYWdlOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuDQorICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudA0KKyAqIDx1bD4NCisgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+DQorICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4NCisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4NCisgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPg0KKyAqIDwvdWw+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuUmtGYWN0b3J5DQorICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgUmtQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2Ugew0KKwkvKioNCisJICogVGhlIHBhY2thZ2UgbmFtZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBlTkFNRSA9ICJyayI7DQorDQorCS8qKg0KKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsiOw0KKw0KKwkvKioNCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsiOw0KKw0KKwkvKioNCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVJrUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuaW1wbC5Sa1BhY2thZ2VJbXBsLmluaXQoKTsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLmltcGwuUnVuZ2VLdXR0YUltcGwgPGVtPlJ1bmdlIEt1dHRhPC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLmltcGwuUnVuZ2VLdXR0YUltcGwNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuaW1wbC5Sa1BhY2thZ2VJbXBsI2dldFJ1bmdlS3V0dGEoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgUlVOR0VfS1VUVEEgPSAwOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFJVTkdFX0tVVFRBX19VUkkgPSBTb2x2ZXJQYWNrYWdlLlNPTFZFUl9fVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUlVOR0VfS1VUVEFfX1RZUEVfVVJJID0gU29sdmVyUGFja2FnZS5TT0xWRVJfX1RZUEVfVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUlVOR0VfS1VUVEFfX0RVQkxJTl9DT1JFID0gU29sdmVyUGFja2FnZS5TT0xWRVJfX0RVQkxJTl9DT1JFOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlY29yYXRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBSVU5HRV9LVVRUQV9fREVDT1JBVE9SUyA9IFNvbHZlclBhY2thZ2UuU09MVkVSX19ERUNPUkFUT1JTOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aXZlIFRvbGVyYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFJVTkdFX0tVVFRBX19SRUxBVElWRV9UT0xFUkFOQ0UgPSBTb2x2ZXJQYWNrYWdlLlNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMDsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SdW5nZSBLdXR0YTwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBSVU5HRV9LVVRUQV9GRUFUVVJFX0NPVU5UID0gU29sdmVyUGFja2FnZS5TT0xWRVJfRkVBVFVSRV9DT1VOVCArIDE7DQorDQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuUnVuZ2VLdXR0YSA8ZW0+UnVuZ2UgS3V0dGE8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UnVuZ2UgS3V0dGE8L2VtPicuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLlJ1bmdlS3V0dGENCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldFJ1bmdlS3V0dGEoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLlJ1bmdlS3V0dGEjZ2V0UmVsYXRpdmVUb2xlcmFuY2UgPGVtPlJlbGF0aXZlIFRvbGVyYW5jZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbGF0aXZlIFRvbGVyYW5jZTwvZW0+Jy4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuUnVuZ2VLdXR0YSNnZXRSZWxhdGl2ZVRvbGVyYW5jZSgpDQorCSAqIEBzZWUgI2dldFJ1bmdlS3V0dGEoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldFJ1bmdlS3V0dGFfUmVsYXRpdmVUb2xlcmFuY2UoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVJrRmFjdG9yeSBnZXRSa0ZhY3RvcnkoKTsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQNCisJICogPHVsPg0KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+DQorCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+DQorCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPg0KKwkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPg0KKwkgKiA8L3VsPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50ZXJmYWNlIExpdGVyYWxzIHsNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5pbXBsLlJ1bmdlS3V0dGFJbXBsIDxlbT5SdW5nZSBLdXR0YTwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5pbXBsLlJ1bmdlS3V0dGFJbXBsDQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5pbXBsLlJrUGFja2FnZUltcGwjZ2V0UnVuZ2VLdXR0YSgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBSVU5HRV9LVVRUQSA9IGVJTlNUQU5DRS5nZXRSdW5nZUt1dHRhKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWxhdGl2ZSBUb2xlcmFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIFJVTkdFX0tVVFRBX19SRUxBVElWRV9UT0xFUkFOQ0UgPSBlSU5TVEFOQ0UuZ2V0UnVuZ2VLdXR0YV9SZWxhdGl2ZVRvbGVyYW5jZSgpOw0KKw0KKwl9DQorDQorfSAvL1JrUGFja2FnZQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL1J1bmdlS3V0dGEuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL1J1bmdlS3V0dGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWY2MTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvUnVuZ2VLdXR0YS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlcjsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJ1bmdlIEt1dHRhPC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5SdW5nZUt1dHRhI2dldFJlbGF0aXZlVG9sZXJhbmNlIDxlbT5SZWxhdGl2ZSBUb2xlcmFuY2U8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuUmtQYWNrYWdlI2dldFJ1bmdlS3V0dGEoKQ0KKyAqIEBtb2RlbA0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIFJ1bmdlS3V0dGEgZXh0ZW5kcyBTb2x2ZXIgew0KKwkNCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVJJX1RZUEVfU09MVkVSX1NFR01FTlQgPSAiUnVuZ2VLdXR0YVNvbHZlciI7DQorCQ0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVsYXRpdmUgVG9sZXJhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIxRS05IjwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWxhdGl2ZSBUb2xlcmFuY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbGF0aXZlIFRvbGVyYW5jZTwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldFJlbGF0aXZlVG9sZXJhbmNlKGRvdWJsZSkNCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuUmtQYWNrYWdlI2dldFJ1bmdlS3V0dGFfUmVsYXRpdmVUb2xlcmFuY2UoKQ0KKwkgKiBAbW9kZWwgZGVmYXVsdD0iMUUtOSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJZG91YmxlIGdldFJlbGF0aXZlVG9sZXJhbmNlKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuUnVuZ2VLdXR0YSNnZXRSZWxhdGl2ZVRvbGVyYW5jZSA8ZW0+UmVsYXRpdmUgVG9sZXJhbmNlPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWxhdGl2ZSBUb2xlcmFuY2U8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXRSZWxhdGl2ZVRvbGVyYW5jZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0UmVsYXRpdmVUb2xlcmFuY2UoZG91YmxlIHZhbHVlKTsNCisNCit9IC8vIFJ1bmdlS3V0dGENCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yay9pbXBsL1JrRmFjdG9yeUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL2ltcGwvUmtGYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZGUyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yay9pbXBsL1JrRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuaW1wbDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuKjsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFJrRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBSa0ZhY3Rvcnkgew0KKwkvKioNCisJICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBSa0ZhY3RvcnkgaW5pdCgpIHsNCisJCXRyeSB7DQorCQkJUmtGYWN0b3J5IHRoZVJrRmFjdG9yeSA9IChSa0ZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrIik7IA0KKwkJCWlmICh0aGVSa0ZhY3RvcnkgIT0gbnVsbCkgew0KKwkJCQlyZXR1cm4gdGhlUmtGYWN0b3J5Ow0KKwkJCX0NCisJCX0NCisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQl9DQorCQlyZXR1cm4gbmV3IFJrRmFjdG9yeUltcGwoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBSa0ZhY3RvcnlJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgew0KKwkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsNCisJCQljYXNlIFJrUGFja2FnZS5SVU5HRV9LVVRUQTogcmV0dXJuIGNyZWF0ZVJ1bmdlS3V0dGEoKTsNCisJCQlkZWZhdWx0Og0KKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFJ1bmdlS3V0dGEgY3JlYXRlUnVuZ2VLdXR0YSgpIHsNCisJCVJ1bmdlS3V0dGFJbXBsIHJ1bmdlS3V0dGEgPSBuZXcgUnVuZ2VLdXR0YUltcGwoKTsNCisJCXJldHVybiBydW5nZUt1dHRhOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFJrUGFja2FnZSBnZXRSa1BhY2thZ2UoKSB7DQorCQlyZXR1cm4gKFJrUGFja2FnZSlnZXRFUGFja2FnZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGRlcHJlY2F0ZWQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQERlcHJlY2F0ZWQNCisJcHVibGljIHN0YXRpYyBSa1BhY2thZ2UgZ2V0UGFja2FnZSgpIHsNCisJCXJldHVybiBSa1BhY2thZ2UuZUlOU1RBTkNFOw0KKwl9DQorDQorfSAvL1JrRmFjdG9yeUltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yay9pbXBsL1JrSm9iLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yay9pbXBsL1JrSm9iLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RmMDFhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL2ltcGwvUmtKb2IuamF2YQpAQCAtMCwwICsxLDU2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CisKKy8qKgorICogQSBqb2IgZm9yIHRoZSBmaW5pdGUgZGlmZmVyZW5jZSBzb2x2ZXIKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBSa0pvYiBleHRlbmRzIEpvYiB7CisJCisJcHVibGljIFJrSm9iKFN0cmluZyBuLCBzaG9ydCB0aHJlYWQsIFJ1bmdlS3V0dGFJbXBsIHMpIHsKKwkJc3VwZXIobik7CisJCXRoaXMudGhyZWFkbnVtID0gdGhyZWFkOworCQl0aGlzLnNvbHZlciA9IHM7CisJfQorCisJcHJvdGVjdGVkIGRvdWJsZSBwcm9ncmVzczsKKwlwcm90ZWN0ZWQgZG91YmxlIGg7CisJcHJvdGVjdGVkIGRvdWJsZSB0OworCXByb3RlY3RlZCBkb3VibGUgbWF4ZXJyb3I7CisJcHJvdGVjdGVkIFJ1bmdlS3V0dGFJbXBsIHNvbHZlcjsKKwkKKwlwcm90ZWN0ZWQgU1RFTVRpbWUgdGltZTsKKwlsb25nIHRpbWVEZWx0YTsKKwlpbnQgY3ljbGU7CisJc2hvcnQgdGhyZWFkbnVtOworCQorCXB1YmxpYyBkb3VibGUgZ2V0UHJvZ3Jlc3MoKSB7CisJCXJldHVybiB0aGlzLnByb2dyZXNzOworCX0KKwlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzcyhkb3VibGUgcCkgeworCQl0aGlzLnByb2dyZXNzID0gcDsKKwl9CisJcHJvdGVjdGVkIElTdGF0dXMgcnVuKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlzb2x2ZXIuX3N0ZXAodGltZSx0aW1lRGVsdGEsY3ljbGUsdGhyZWFkbnVtKTsKKwkJCisJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL2ltcGwvUmtQYWNrYWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvaW1wbC9Sa1BhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0MGM2MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL2ltcGwvUmtQYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjE2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5pbXBsOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclBhY2thZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5Sa0ZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5Sa1BhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5SdW5nZUt1dHRhOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+Lg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUmtQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFJrUGFja2FnZSB7DQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3MgcnVuZ2VLdXR0YUVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoDQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlDQorCSAqIHBhY2thZ2UgVVJJIHZhbHVlLg0KKwkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljDQorCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zDQorCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsDQorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5DQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLlJrUGFja2FnZSNlTlNfVVJJDQorCSAqIEBzZWUgI2luaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFJrUGFja2FnZUltcGwoKSB7DQorCQlzdXBlcihlTlNfVVJJLCBSa0ZhY3RvcnkuZUlOU1RBTkNFKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsNCisNCisJLyoqDQorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcw0KKwkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQ0KKwkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbA0KKwkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMNCisJICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbA0KKwkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLg0KKwkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoDQorCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZA0KKwkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6DQorCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55DQorCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvDQorCSAqIHRob3NlIG9mIGFub3RoZXIuDQorCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUNCisJICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZU5TX1VSSQ0KKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQ0KKwkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBSa1BhY2thZ2UgaW5pdCgpIHsNCisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChSa1BhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUmtQYWNrYWdlLmVOU19VUkkpOw0KKw0KKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQ0KKwkJUmtQYWNrYWdlSW1wbCB0aGVSa1BhY2thZ2UgPSAoUmtQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBSa1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgUmtQYWNrYWdlSW1wbCgpKTsNCisNCisJCWlzSW5pdGVkID0gdHJ1ZTsNCisNCisJCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcw0KKwkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7DQorCQlHcmFwaFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOw0KKwkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsNCisJCU1vZGlmaWVyUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7DQorCQlTY2VuYXJpb1BhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOw0KKwkJU2VxdWVuY2VyUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7DQorCQlTb2x2ZXJQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsNCisNCisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzDQorCQl0aGVSa1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7DQorDQorCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhDQorCQl0aGVSa1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOw0KKw0KKwkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZA0KKwkJdGhlUmtQYWNrYWdlLmZyZWV6ZSgpOw0KKw0KKwkJcmV0dXJuIHRoZVJrUGFja2FnZTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQ2xhc3MgZ2V0UnVuZ2VLdXR0YSgpIHsNCisJCXJldHVybiBydW5nZUt1dHRhRUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UnVuZ2VLdXR0YV9SZWxhdGl2ZVRvbGVyYW5jZSgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSlydW5nZUt1dHRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUmtGYWN0b3J5IGdldFJrRmFjdG9yeSgpIHsNCisJCXJldHVybiAoUmtGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsNCisNCisJLyoqDQorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcw0KKwkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7DQorCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47DQorCQlpc0NyZWF0ZWQgPSB0cnVlOw0KKw0KKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzDQorCQlydW5nZUt1dHRhRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJVTkdFX0tVVFRBKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUocnVuZ2VLdXR0YUVDbGFzcywgUlVOR0VfS1VUVEFfX1JFTEFUSVZFX1RPTEVSQU5DRSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOw0KKw0KKwkvKioNCisJICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMNCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7DQorCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOw0KKwkJaXNJbml0aWFsaXplZCA9IHRydWU7DQorDQorCQkvLyBJbml0aWFsaXplIHBhY2thZ2UNCisJCXNldE5hbWUoZU5BTUUpOw0KKwkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7DQorCQlzZXROc1VSSShlTlNfVVJJKTsNCisNCisJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMNCisJCVNvbHZlclBhY2thZ2UgdGhlU29sdmVyUGFja2FnZSA9IChTb2x2ZXJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNvbHZlclBhY2thZ2UuZU5TX1VSSSk7DQorCQlFY29yZVBhY2thZ2UgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7DQorDQorCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzDQorDQorCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMNCisNCisJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMNCisJCXJ1bmdlS3V0dGFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlU29sdmVyUGFja2FnZS5nZXRTb2x2ZXIoKSk7DQorDQorCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycw0KKwkJaW5pdEVDbGFzcyhydW5nZUt1dHRhRUNsYXNzLCBSdW5nZUt1dHRhLmNsYXNzLCAiUnVuZ2VLdXR0YSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFQXR0cmlidXRlKGdldFJ1bmdlS3V0dGFfUmVsYXRpdmVUb2xlcmFuY2UoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInJlbGF0aXZlVG9sZXJhbmNlIiwgIjFFLTkiLCAwLCAxLCBSdW5nZUt1dHRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKwkJLy8gQ3JlYXRlIHJlc291cmNlDQorCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsNCisJfQ0KKw0KK30gLy9Sa1BhY2thZ2VJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvaW1wbC9SdW5nZUt1dHRhSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvaW1wbC9SdW5nZUt1dHRhSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMjE0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yay9pbXBsL1J1bmdlS3V0dGFJbXBsLmphdmEKQEAgLTAsMCArMSwxMDQ5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5pbXBsOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Ccm9rZW5CYXJyaWVyRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DeWNsaWNCYXJyaWVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsVmFsdWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU2ltcGxlRGF0YUV4Y2hhbmdlTGFiZWxWYWx1ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuaW1wbC5Tb2x2ZXJJbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5UcmlnZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuUmtQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuUnVuZ2VLdXR0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UnVuZ2UgS3V0dGE8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLmltcGwuUnVuZ2VLdXR0YUltcGwjZ2V0UmVsYXRpdmVUb2xlcmFuY2UgPGVtPlJlbGF0aXZlIFRvbGVyYW5jZTwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAZ2VuZXJhdGVkDQorICovDQorQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQ0KK3B1YmxpYyBjbGFzcyBSdW5nZUt1dHRhSW1wbCBleHRlbmRzIFNvbHZlckltcGwgaW1wbGVtZW50cyBSdW5nZUt1dHRhIHsNCisJDQorCS8vIE51bWJlciBvZiB0aHJlYWRzDQorCXByaXZhdGUgc2hvcnQgbnVtX3RocmVhZHMgPSAyOy8vIFByZWZlcmVuY2VzIHdpbGwgb3ZlcnJpZGUNCisJDQorCS8vIEpvYnMNCisJcHJpdmF0ZSBSa0pvYiBbXSBqb2JzOw0KKwkNCisJLy8gVXNlZCB0byBzeW5jaHJvbml6ZSB3b3JrZXIgdGhyZWFkcyB0byBhZ3JlZSBvbiBzdGVwIHNpemUNCisJcHJpdmF0ZSBDeWNsaWNCYXJyaWVyIHN0ZXBTaXplQmFycmllcjsNCisNCisJLy8gVXNlZCB0byBzeW5jaHJvbml6ZSB3b3JrZXIgdGhyZWFkcyB0byBwcm9jZWVkIGFmdGVyIGFsbCB0aHJlYWRzIGhhdmUgDQorCS8vIHVwZGF0ZWQgdGhlIGN1cnJlbnQgdGVtcG9yYXJ5IHZhbHVlIHRvIHRoZSBuZXcgcG9zaXRpb24NCisJcHJpdmF0ZSBDeWNsaWNCYXJyaWVyIHVwZGF0ZURvbmVCYXJyaWVyOw0KKwkNCisJLy8gU21hbGxlc3Qgc3RlcCBzaXplIHJlcXVpcmVkIGJ5IGFueSB0aHJlYWQgdG8gYWR2YW5jZSBvbmUgc3RlcA0KKwkNCisJcHJpdmF0ZSBkb3VibGUgc21hbGxlc3RIOw0KKwlwcml2YXRlIGRvdWJsZSBtYXhpbXVtRXJyb3I7DQorCQ0KKwkvLyBUaGUgc3RlcCBzaXplIGFuZCB0aGUgY3VycmVudCBwb3NpdGlvbiAoeCkNCisJcHJpdmF0ZSBkb3VibGUgc3RlcFNpemUgPSAxLjA7DQorCXByaXZhdGUgZG91YmxlIGN1cnJlbnRYOw0KKwkNCisJLy8gQ29uc3RhbnRzIHVzZWQgaW4gUnVuZ2UgS3V0dGEgQ2FzaCBLYXJwIA0KKwkNCisJc3RhdGljIGRvdWJsZSBhMj0wLjIsIGEzPTAuMywgYTQ9MC42LCBhNT0xLjAsIGE2PTAuODc1Ow0KKwlzdGF0aWMgZG91YmxlIGIyMSA9IDAuMiwgYjMxPTMuMC80MCwgYjMyPTkuMC80MC4wLCBiNDE9MC4zLCBiNDI9LTAuOSwgYjQzPTEuMjsNCisJc3RhdGljIGRvdWJsZSBiNTE9LTExLjAvNTQuMCwgYjUyPTIuNSwgYjUzPS03MC4wLzI3LjAsIGI1ND0zNS4wLzI3LjAsIGI2MT0xNjMxLjAvNTUyOTYuMCwgYjYyPTE3NS4wLzUxMi4wLCBiNjM9NTc1LjAvMTM4MjQuMCwgYjY0PTQ0Mjc1LjAvMTEwNTkyLjAsIGI2NT0yNTMuMC80MDk2LjA7DQorCXN0YXRpYyBkb3VibGUgYzEgPSAzNy4wLzM3OC4wLCBjMz0yNTAuMC82MjEuMCwgYzQ9MTI1LjAvNTk0LjAsIGM2PTUxMi4wLzE3NzEuMDsNCisJc3RhdGljIGRvdWJsZSBkYzUgPSAtMjc3LjAvMTQzMzYuMDsNCisJc3RhdGljIGRvdWJsZSBkYzEgPSBjMS0yODI1LjAvMjc2NDguMCwgZGMzPWMzLTE4NTc1LjAvNDgzODQuMCwgZGM0PWM0LTEzNTI1LjAvNTUyOTYuMCwgZGM2PWM2LTAuMjU7DQorCQ0KKwlzdGF0aWMgZG91YmxlIFNBRkVUWT0wLjksIFBHUk9XPS0wLjIsIFBTSFJOSz0tMC4yNSwgRVJSQ09OPTEuODlFLTQ7DQorCXN0YXRpYyBkb3VibGUgVElOWSA9IDFFLTMwOw0KKw0KKwlwcml2YXRlIHN0YXRpYyBpbnQgTUFYX1BST0dSRVNTX1JFUE9SVFMgPSA1Ow0KKwkNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWxhdGl2ZVRvbGVyYW5jZSgpIDxlbT5SZWxhdGl2ZSBUb2xlcmFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFJlbGF0aXZlVG9sZXJhbmNlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgUkVMQVRJVkVfVE9MRVJBTkNFX0VERUZBVUxUID0gMS4wRS05Ow0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVsYXRpdmVUb2xlcmFuY2UoKSA8ZW0+UmVsYXRpdmUgVG9sZXJhbmNlPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRSZWxhdGl2ZVRvbGVyYW5jZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBkb3VibGUgcmVsYXRpdmVUb2xlcmFuY2UgPSBSRUxBVElWRV9UT0xFUkFOQ0VfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXB1YmxpYyBSdW5nZUt1dHRhSW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIHN0ZXAoU1RFTVRpbWUgdGltZSwgbG9uZyB0aW1lRGVsdGEsIGludCBjeWNsZSkgew0KKwkJDQorCQkvLyBWYWxpZGF0ZSBhbGwgZGVjb3JhdG9ycyB0aGF0IHJldHVybiBkZWx0YXMgdG8gbWFrZSBzdXJlDQorCQkvLyB0aGV5IGFyZSBvZiBkZXRlcm1pbmlzdGljIG5hdHVyZS4gVGhlIFJ1bmdlIEt1dHRhIGludGVncmF0aW8NCisJCS8vIGNhbiBvbmx5IGhhbmRsZSBkZXRlcm1pbmluaXN0aWMgdmFyaWFudHMNCisJCQ0KKwkJZm9yKERlY29yYXRvciBkZWNvcmF0b3I6dGhpcy5nZXREZWNvcmF0b3JzKCkpIA0KKwkJCWlmKGRlY29yYXRvciBpbnN0YW5jZW9mIEludGVncmF0aW9uRGVjb3JhdG9yKSB7DQorCQkJCUludGVncmF0aW9uRGVjb3JhdG9yIGlkZWMgPSAoSW50ZWdyYXRpb25EZWNvcmF0b3IpZGVjb3JhdG9yOw0KKwkJCQlpZighaWRlYy5pc0RldGVybWluaXN0aWMoKSkgew0KKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJFcnJvciwgZGVjb3JhdG9yOiAiK2lkZWMrIiBpcyBub3QgZGV0ZXJtaW5pc3RpYy4gVGhlIFJ1bmdlIEt1dHRhIEludGVncmF0b3IgY2FuIG9ubHkgaGFuZGxlIGRldGVybWluaXN0aWMgbW9kZWxzLiIsIG5ldyBFeGNlcHRpb24oKSk7DQorCQkJCQlyZXR1cm4gZmFsc2U7DQorCQkJCX0NCisJCQl9DQorCQkNCisJCUFjdGl2YXRvciBhY3QgPSBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvci5nZXREZWZhdWx0KCk7DQorCQlpZihhY3QgIT0gbnVsbCkgew0KKwkJCWZpbmFsIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gYWN0LmdldFBsdWdpblByZWZlcmVuY2VzKCk7DQorCQkJbnVtX3RocmVhZHMgPSAoc2hvcnQpcHJlZmVyZW5jZXMuZ2V0SW50KG9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50cy5TSU1VTEFUSU9OX1RIUkVBRFMpOw0KKwkJfSBlbHNlIG51bV90aHJlYWRzID0gMjsgLy8gSnVzdCBzbyB3ZSBjYW4gcnVuIGluc2lkZSBqdW5pdCB0ZXN0DQorCQkJDQorCQlmaW5hbCBpbnQgYyA9IGN5Y2xlOw0KKwkJDQorCQkvLyBJbml0aWFsaXplIGxhdGNoZXMNCisJCXN0ZXBTaXplQmFycmllciA9IG5ldyBDeWNsaWNCYXJyaWVyKG51bV90aHJlYWRzLCBuZXcgUnVubmFibGUoKSB7DQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeyANCisgICAgICAgICAgICAJLy8gQWxsIHRocmVhZHMgc3VjY2Vzc2Z1bGx5IGFkdmFuY2VkIHRpbWUgYnkgc29tZSBzdGVwIGguDQorCQkJCS8vIEZpbmQgdGhlIHNtYWxsZXN0IAkJCQ0KKwkJCQlzbWFsbGVzdEggPSBEb3VibGUuTUFYX1ZBTFVFOw0KKwkJCQltYXhpbXVtRXJyb3IgPSAtRG91YmxlLk1BWF9WQUxVRTsNCisJCQkJZm9yKGludCBpPTA7aTxudW1fdGhyZWFkczsrK2kpICB7DQorCQkJCQlpZihqb2JzW2ldLmggPD0gc21hbGxlc3RIKSB7DQorCQkJCQkJaWYobWF4aW11bUVycm9yIDwgam9ic1tpXS5tYXhlcnJvcikgbWF4aW11bUVycm9yID0gam9ic1tpXS5tYXhlcnJvcjsNCisJCQkJCQlzbWFsbGVzdEggPSBqb2JzW2ldLmg7IA0KKwkJCQkJfQ0KKwkJCQl9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSk7DQorCQkNCisJCXVwZGF0ZURvbmVCYXJyaWVyID0gbmV3IEN5Y2xpY0JhcnJpZXIobnVtX3RocmVhZHMpOw0KKwkJDQorCQkvLyBGaW5kIHRyaWdnZXJzIGFuZCBtYWtlIHN1cmUgdGhleSBhcmUgaW52b2tlZA0KKwkJZm9yKERlY29yYXRvciBkZWNvcmF0b3I6dGhpcy5nZXREZWNvcmF0b3JzKCkpIHsNCisJCQlpZihkZWNvcmF0b3IgaW5zdGFuY2VvZiBUcmlnZ2VyKSB7DQorCQkJCWRlY29yYXRvci51cGRhdGVMYWJlbHModGltZSwgdGltZURlbHRhLCBjeWNsZSk7DQorCQkJfQ0KKwkJfQkJDQorCQkNCisJCS8vIEZpcnN0IGluaXRpYWxpemUgdGhlIHByb2JlIGFuZCB0ZW1wIGxhYmVsIHZhbHVlcyBmcm9tIHRoZSBjdXJyZW50DQorCQkvLyBsYWJlbCB2YWx1ZXMuIA0KKwkJDQorCQlmb3IoRGVjb3JhdG9yIGRlY29yYXRvcjp0aGlzLmdldERlY29yYXRvcnMoKSkgew0KKwkJCUVMaXN0PER5bmFtaWNMYWJlbD5hbGxMYWJlbHMgPSBkZWNvcmF0b3IuZ2V0TGFiZWxzVG9VcGRhdGUoKTsNCisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPER5bmFtaWNMYWJlbD4gY3VycmVudFN0YXRlTGFiZWxJdGVyID0gYWxsTGFiZWxzDQorCQkJCQkuaXRlcmF0b3IoKTsgY3VycmVudFN0YXRlTGFiZWxJdGVyLmhhc05leHQoKTspIHsNCisJCQkJaWYoZGVjb3JhdG9yIGluc3RhbmNlb2YgSW50ZWdyYXRpb25EZWNvcmF0b3IpIHsNCisJCQkJCS8vIEl0J3MgYSBzdGFuZGFyZCBkaXNlYXNlIG1vZGVsIHdpdGggYSBzdGFuZGFyZCBkaXNlYXNlIG1vZGVsIGxhYmVsDQorCQkJCQlmaW5hbCBJbnRlZ3JhdGlvbkxhYmVsIGlMYWJlbCA9IChJbnRlZ3JhdGlvbkxhYmVsKSBjdXJyZW50U3RhdGVMYWJlbEl0ZXIubmV4dCgpOw0KKwkJCQkJKChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpaUxhYmVsLmdldFByb2JlVmFsdWUoKSkuc2V0KChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpaUxhYmVsLmdldEN1cnJlbnRWYWx1ZSgpKTsNCisJCQkJCSgoSW50ZWdyYXRpb25MYWJlbFZhbHVlKWlMYWJlbC5nZXRUZW1wVmFsdWUoKSkuc2V0KChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpaUxhYmVsLmdldEN1cnJlbnRWYWx1ZSgpKTsNCisJCQkJfSBlbHNlIGN1cnJlbnRTdGF0ZUxhYmVsSXRlci5uZXh0KCk7DQorCQkJfQ0KKwkJfQ0KKwkJDQorCQlpZihqb2JzID09IG51bGwgfHwgam9icy5sZW5ndGggIT0gbnVtX3RocmVhZHMpIHsNCisJCQkvLyBJbml0aWFsaXplIHRoZSBqb2JzIGlmIG5vdCBkb25lIHlldCBvciBvZiB0aGUgbnVtYmVyIG9mIHRocmVhZHMgY2hhbmdlcw0KKwkJCWpvYnMgPSBuZXcgUmtKb2JbbnVtX3RocmVhZHNdOw0KKwkNCisJCQlmb3Ioc2hvcnQgaT0wO2k8bnVtX3RocmVhZHM7KytpKSB7DQorCQkJCWZpbmFsIHNob3J0IHRocmVhZG51bSA9IGk7DQorCQkJCWpvYnNbaV0gPSBuZXcgUmtKb2IoIldvcmtlciAiK2ksIHRocmVhZG51bSwgdGhpcyk7DQorCQkJfSAvLyBGb3IgZWFjaCBqb2INCisJCX0gLy8gSWYgbm90IGluaXRpYWxpemVkDQorDQorCQkvLyBJbml0aWFsaXplDQorCQlpbnQgdGhyZWFkID0gMDsNCisJCWZvcihSa0pvYiBqOmpvYnMpIHsNCisJCQlqLmN5Y2xlID0gYzsNCisJCQlqLnRpbWUgPSB0aW1lOw0KKwkJCWoudGltZURlbHRhID0gdGltZURlbHRhOw0KKwkJfQ0KKwkJLy8gU2NoZWR1bGUuIEpvYnMgY2FuIGJlIHJlc2NoZWR1bGVkIGFmdGVyIGZpbmlzaGVkDQorCQlmb3IoUmtKb2Igajpqb2JzKSANCisJCQlqLnNjaGVkdWxlKCk7DQorCQkNCisJCS8vIFdhaXQgdW50aWwgYWxsIGpvYnMgY29tcGxldGVkDQorCQlmb3IoUmtKb2IgaiA6IGpvYnMpIHsNCisJCQl0cnkgew0KKwkJCQlqLmpvaW4oKTsNCisJCQl9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCUFjdGl2YXRvci5sb2dFcnJvcihpZS5nZXRNZXNzYWdlKCksIGllKTsNCisJCQl9DQorCQl9DQorCQkNCisJCS8vIFNldCB0aGUgY29tbW9uIHRpbWUgYW5kIHN0ZXAgc2l6ZSBoZXJlIGFuZCB2YWxpZGF0ZSBldmVyeXRoaW5nIGlzIHJpZ2h0DQorCQlkb3VibGUgbWluU3RlcCA9IERvdWJsZS5NQVhfVkFMVUU7DQorCQlkb3VibGUgY3VycmVudFQgPSBqb2JzWzBdLnQ7DQorCQlmb3IoUmtKb2IgaiA6IGpvYnMpIHsNCisJCQkvLyBUaGUgam9icyBoYXZlIGNhbGN1bGF0ZWQgbmV3IHN0ZXAgc2l6ZXMgYWZ0ZXIgdGhleSBmaW5pc2hlZC4gUGljayB0aGUNCisJCQkvLyBzbWFsbGVzdCBvbmUgZm9yIHRoZSBuZXh0IGN5Y2xlDQorCQkJaWYoai5oIDwgbWluU3RlcCkgbWluU3RlcCA9IGouaDsNCisJCQlpZihqLnQgIT0gY3VycmVudFQpIEFjdGl2YXRvci5sb2dFcnJvcigiRXJyb3IsIG9uZSB0aHJlYWQgd2FzIGluIG1pc3N0ZXAgd2l0aCBvdGhlciB0aHJlYWRzLCBpdHMgdGltZSB3YXMgIitqLnQrIiB2ZXJzdXMgIitjdXJyZW50VCwgbmV3IEV4Y2VwdGlvbigpKTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKwl9DQorCQ0KKwkvKioNCisJICogX3N0ZXAgRG8gdGhlIHN0ZXAgZm9yIGEgc2luZ2xlIHRocmVhZA0KKwkgKiANCisJICogQHBhcmFtIHRpbWUNCisJICogQHBhcmFtIHRpbWVEZWx0YQ0KKwkgKiBAcGFyYW0gY3ljbGUNCisJICogQHBhcmFtIHRocmVhZG51bQ0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgX3N0ZXAoU1RFTVRpbWUgdGltZSwgbG9uZyB0aW1lRGVsdGEsIGludCBjeWNsZSwgc2hvcnQgdGhyZWFkbnVtKSB7DQorLy8JCXRoaXMuc2V0UHJvZ3Jlc3MoMC4wKTsNCisJCS8vIFdlIG9ubHkgZGVhbCB3aXRoIHN0YW5kYXJkIGRpc2Vhc2UgbW9kZWwgZGVjb3JhdG9ycw0KKwkJDQorCQlBcnJheUxpc3Q8RGVjb3JhdG9yPiBpRGVjb3JhdG9ycyA9IG5ldyBBcnJheUxpc3Q8RGVjb3JhdG9yPigpOw0KKwkJDQorCQlmb3IoRGVjb3JhdG9yIGQ6Z2V0RGVjb3JhdG9ycygpKSB7DQorCQkJaWYoZCBpbnN0YW5jZW9mIEludGVncmF0aW9uRGVjb3JhdG9yKQ0KKwkJCQlpRGVjb3JhdG9ycy5hZGQoZCk7DQorCQl9DQorCQkNCisJCQ0KKwkJDQorCQkvLyBGaXJzdCB3ZSBnZXQgdGhlIHN0ZXAgc2l6ZSwgZWl0aGVyIHRoZSBkZWZhdWx0IHN0ZXAgc2l6ZQ0KKwkJLy8gKGluaXRpYWxseSAxLjApIG9yIHRoZSBsYXN0IHN0ZXAgc2l6ZSB1c2VkLiANCisJCQ0KKwkJZG91YmxlIGggPSB0aGlzLmdldFN0ZXBTaXplKCk7DQorCQkvLyB4IGlzIHRvIGtlZXAgdHJhY2sgb2YgaG93IGZhciB3ZSBoYXZlIGFkdmFuY2VkIGluIHRoZSBzb2x1dGlvbi4gSXQgaXMgZXNzZW50aWFsbHkNCisJCS8vIGEgZG91YmxlIGN5Y2xlIHJlcHJlc2VudGF0aW9uDQorCQkNCisJCWRvdWJsZSB4ID0gdGhpcy5nZXRDdXJyZW50WCgpOw0KKwkJDQorCQkvLyBTdWJzdGFudGlhbCBwZXJmb3JtYW5jZSBjYW4gYmUgZ2FpbmVkIGhlcmUuIEJhc2ljYWxseSBpZiB0aGUgY3VycmVudCBjeWNsZQ0KKwkJLy8gaXMgZ3JlYXRlciB0aGFuIHRoZSBjeWNsZSByZXF1ZXN0ZWQgYnkgdGhlIHNpbXVsYXRpb24sIHdlIGFyZSBkb25lLiBUaGlzDQorCQkvLyBtZWFucyB0aGF0IHRoZSBlcnJvciB0b2xlcmFuY2UgYmV0d2VlbiBsYXN0IHN0ZXAgYW5kIHRoaXMgc3RlcCBpcyBzbWFsbA0KKwkJLy8gZW5vdWdoIHNvIHdlIGRvbid0IG5lZWQgdG8gdXBkYXRlIHRoZSBsYWJlbHMuIFRoZSBlcnJvciB0b2xlcmFuY2UgaXMNCisJCS8vIHNwZWNpZmllZCBpbiB0aGUgZGlzZWFzZSBtb2RlbA0KKwkJDQorCQkvLyoqKiBPQlNFUlZFOiBTaW5jZSB3ZSBsaW1pdCBoIHRvIG1heCAxIGJlbG93LCB0aGlzIGNvZGUgaXMgbmV2ZXIgaW52b2tlZC4gSXQncyBrZXB0DQorCQkvLyoqKiBhcm91bmQgaW4gY2FzZSB3ZSB3YW50IHRvIGFsbG93IHRpbWUgdG8gYmUgY2FsY3VsYXRlZCBmYXIgb3V0IGluIHRoZSBmdXR1cmUgaWYNCisJCS8vKioqIHRoZSBlcnJvciBpcyBzbWFsbCBlbm91Z2gNCisJCQ0KKwkJDQorCQlpZih4ID49IGN5Y2xlKSB7DQorCQkJLy8gSnVzdCBjb3B5IHRoZSBuZXh0IHZhbHVlIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHZhbHVlIGZvciBhbGwgbGFiZWxzDQorCQkJZm9yKERlY29yYXRvciBzZG06aURlY29yYXRvcnMpIHsNCisJCQkJRUxpc3Q8RHluYW1pY0xhYmVsPm15TGFiZWxzID0gc2RtLmdldExhYmVsc1RvVXBkYXRlKHRocmVhZG51bSwgbnVtX3RocmVhZHMpOw0KKwkJCQlpbnQgbnVtTGFiZWxzID0gbXlMYWJlbHMuc2l6ZSgpOw0KKwkJCQlkb3VibGUgbiA9IDAuMDsNCisJCQkJaW50IHNldFByb2dyZXNzRXZlcnlOdGhOb2RlID0gbnVtX3RocmVhZHMgKiBudW1MYWJlbHMvKE1BWF9QUk9HUkVTU19SRVBPUlRTKTsNCisJCQkJaWYoc2V0UHJvZ3Jlc3NFdmVyeU50aE5vZGUgPT0gMCkgc2V0UHJvZ3Jlc3NFdmVyeU50aE5vZGUgPSAxOw0KKwkJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPER5bmFtaWNMYWJlbD4gY3VycmVudFN0YXRlTGFiZWxJdGVyID0gbXlMYWJlbHMNCisJCQkJCQkuaXRlcmF0b3IoKTsgY3VycmVudFN0YXRlTGFiZWxJdGVyLmhhc05leHQoKTspIHsNCisJCQkJCWZpbmFsIEludGVncmF0aW9uTGFiZWwgZGlzZWFzZUxhYmVsID0gKEludGVncmF0aW9uTGFiZWwpIGN1cnJlbnRTdGF0ZUxhYmVsSXRlcg0KKwkJCQkJLm5leHQoKTsNCisJCQkJCQ0KKwkJCQkJLy8gVGhlIGVzdGltYXRlZCBkaXNlYXNlIHZhbHVlIGNvbnRhaW5zIHRoZSB2YWx1ZSBjYWxjdWxhdGVkIGF0IHBvc2l0aW9uIHgNCisJCQkJCQ0KKwkJCQkJSW50ZWdyYXRpb25MYWJlbFZhbHVlIG5leHRWYWx1ZUF0WCA9IChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpRWNvcmVVdGlsLmNvcHkoZGlzZWFzZUxhYmVsLmdldFByb2JlVmFsdWUoKSk7DQorCQkJCQlJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgY3VycmVudFZhbHVlQXRDeWNsZSA9IChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpZGlzZWFzZUxhYmVsLmdldEN1cnJlbnRWYWx1ZSgpOw0KKwkJCQkJSW50ZWdyYXRpb25MYWJlbFZhbHVlIG5leHRTdGF0ZSA9IChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpZGlzZWFzZUxhYmVsLmdldE5leHRWYWx1ZSgpOw0KKwkJCQkJYWRqdXN0VmFsdWVzVG9DeWNsZShjdXJyZW50VmFsdWVBdEN5Y2xlLCBuZXh0VmFsdWVBdFgsIHgsIGN5Y2xlKTsNCisJCQkJCS8vIE5leHRWYWx1ZUF0WCBoYXMgYmVlbiBtb2RpZmllZCBoZXJlIHRvIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGlzIGN5Y2xlLg0KKwkJCQkJbmV4dFN0YXRlLnNldChuZXh0VmFsdWVBdFgpOw0KKwkJCQkJLy8gVGhlIG5leHQgdmFsdWUgaXMgdmFsaWQgbm93Lg0KKwkJCQkJZGlzZWFzZUxhYmVsLnNldE5leHRWYWx1ZVZhbGlkKHRydWUpOw0KKwkJCQkJZG91YmxlIHByb2dyZXNzID0gbi9udW1MYWJlbHM7DQorCQkJCQlqb2JzW3RocmVhZG51bV0uc2V0UHJvZ3Jlc3MocHJvZ3Jlc3MpOw0KKwkJCQkJaWYobiVzZXRQcm9ncmVzc0V2ZXJ5TnRoTm9kZT09MCkgew0KKwkJCQkJCS8vIEdldCB0aGUgcHJvZ3Jlc3MgZm9yIGFsbCB0aHJlYWRzDQorCQkJCQkJZm9yKGludCBpPTA7aTxudW1fdGhyZWFkczsrK2kpIGlmKGkhPXRocmVhZG51bSAmJiBqb2JzW2ldICE9IG51bGwpIHByb2dyZXNzKz1qb2JzW2ldLmdldFByb2dyZXNzKCk7DQorCQkJCQkJcHJvZ3Jlc3MgLz0gbnVtX3RocmVhZHM7DQorCQkJCQkJc2RtLnNldFByb2dyZXNzKHByb2dyZXNzKTsNCisJCQkJCX0NCisJCQkJCW4rPTEuMDsNCisJCQkJfQ0KKwkJCX0gLy8gRm9yIGVhY2ggZGVjb3JhdG9yDQorCQkJLy8gU28gdGhhdCB2YWxpZGF0aW9uIGNvZGUgYWJvdmUgaXMgaGFwcHkNCisJCQlqb2JzW3RocmVhZG51bV0uaCA9IGg7DQorCQkJam9ic1t0aHJlYWRudW1dLnQgPSB4Ow0KKwkJCQ0KKwkJCXJldHVybjsNCisJCX0NCisNCisJCS8vIFdoZW4geCAob3IgdGltZSkgaXMgdGhpcyB3ZSdyZSBkb25lDQorCQlkb3VibGUgZW5kID0gTWF0aC5mbG9vcih0aGlzLmdldEN1cnJlbnRYKCkpKzEuMDsNCisJCQ0KKwkJLy8gTWFrZSBzdXJlIHdlIGFjdHVhbGx5IGhhdmUgbGFiZWxzIHRvIHVwZGF0ZQ0KKwkJYm9vbGVhbiB3b3JrVG9Ebz1mYWxzZTsNCisJCWZvcihEZWNvcmF0b3Igc2RtOmlEZWNvcmF0b3JzKQ0KKwkJCWlmKHNkbS5nZXRMYWJlbHNUb1VwZGF0ZSh0aHJlYWRudW0sIG51bV90aHJlYWRzKS5zaXplKCkgPiAwKSB7d29ya1RvRG89dHJ1ZTticmVhazt9DQorCQkNCisJCWlmKCF3b3JrVG9Ebykgew0KKwkJCS8vIE5vdGhpbmcgdG8gZG8sIGp1c3QgYWR2YW5jZSB4IGFuZCBzZXQgaA0KKwkJCWpvYnNbdGhyZWFkbnVtXS5oID0gaDsNCisJCQlqb2JzW3RocmVhZG51bV0udCA9IHg7DQorCQkJLy8gQmUgbmljZSBhbmQgd2FsayBpbiBzdGVwIHdpdGggb3RoZXJzIHVudGlsIGRvbmUNCisJCQl3aGlsZSh4IDwgZW5kKSB7DQorCQkJCXRyeSB7DQorCQkJCQkvLyBTZXQgdG8gYSBsYXJnZSBudW1iZXIgdG8gbWFrZSBzdXJlIGl0J3MgbGFyZ2VyIHRoYW4gYW55IHN0ZXAgc2l6ZSByZXBvcnRlZA0KKwkJCQkJLy8gYnkgYW5vdGhlciB0aHJlYWQNCisJCQkJCWRvIHsNCisJCQkJCQlqb2JzW3RocmVhZG51bV0uaCA9IERvdWJsZS5NQVhfVkFMVUU7CQkJCQkJDQorCQkJCQkJc3RlcFNpemVCYXJyaWVyLmF3YWl0KCk7DQorCQkJCQl9IHdoaWxlKHRoaXMubWF4aW11bUVycm9yID4gMS4wKTsNCisJCQkJCXVwZGF0ZURvbmVCYXJyaWVyLmF3YWl0KCk7DQorCQkJCX0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCS8vIFNob3VsZCBuZXZlciBoYXBwZW4NCisJCQkJCUFjdGl2YXRvci5sb2dFcnJvcihpZS5nZXRNZXNzYWdlKCksIGllKTsNCisJCQkJfSBjYXRjaChCcm9rZW5CYXJyaWVyRXhjZXB0aW9uIGJiZSkgew0KKwkJCQkJLy8gU2hvdWxkIG5ldmVyIGhhcHBlbg0KKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKGJiZS5nZXRNZXNzYWdlKCksIGJiZSk7DQorCQkJCX0NCisJCQkJLy8gU2V0IHRvIHRoZSBzbWFsbGVzdCB2YWx1ZSByZXBvcnRlZCBieSBhbm90aGVyIHRocmVhZA0KKwkJCQloID0gdGhpcy5zbWFsbGVzdEg7DQorCQkJCXggKz0gaDsNCisJCQkJam9ic1t0aHJlYWRudW1dLmggPSBoOw0KKwkJCQlqb2JzW3RocmVhZG51bV0udCA9IHg7DQorCQkJfQkJCQkNCisJCQlyZXR1cm47IA0KKwkJfQ0KKwkJLy8gV2UgdXNlIHRoZSBSdW5nZSBLdXR0YSBLYXNoIENhcnAgbWV0aG9kIHRvIGFkdmFuY2UgdG8gdGhlIG5leHQNCisJCS8vIHN0ZXAgaW4gdGhlIHNpbXVsYXRpb24uIFR3byBlc3RpbWF0ZXMgb2YgdGhlIGRpc2Vhc2UgZGVsdGFzDQorCQkvLyBhcmUgY2FsY3VsYXRlZCBhbmQgY29tcGFyZWQgdG8gZWFjaCBvdGhlci4gSWYgdGhleSBkaWZmZXINCisJCS8vIGJ5IG1vcmUgdGhhbiBhIG1heGltdW0gZXJyb3IgKGRldGVybWluZWQgYnkgYSBwYXJhbWV0ZXIgZm9yDQorCQkvLyB0aGUgZGlzZWFzZSBtb2RlbCksIHdlIHJlZHVjZSB0aGUgc3RlcCBzaXplIHVudGlsIGFuIGFjY2VwdGFibGUNCisJCS8vIGVycm9yIGlzIHJlYWNoZWQuIA0KKwkJCQkJDQorCQkvLyBUaGVzZSBhcmUgdXNlZCBkdXJpbmcgUnVuZ2UgS3V0dGEgY2FsY3VsYXRpb25zOg0KKwkJTWFwPEludGVncmF0aW9uTGFiZWwsIEludGVncmF0aW9uTGFiZWxWYWx1ZT4gazFtYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ3JhdGlvbkxhYmVsLCBJbnRlZ3JhdGlvbkxhYmVsVmFsdWU+KCk7DQorCQlNYXA8SW50ZWdyYXRpb25MYWJlbCwgSW50ZWdyYXRpb25MYWJlbFZhbHVlPiBrMm1hcCA9IG5ldyBIYXNoTWFwPEludGVncmF0aW9uTGFiZWwsIEludGVncmF0aW9uTGFiZWxWYWx1ZT4oKTsNCisJCU1hcDxJbnRlZ3JhdGlvbkxhYmVsLCBJbnRlZ3JhdGlvbkxhYmVsVmFsdWU+IGszbWFwID0gbmV3IEhhc2hNYXA8SW50ZWdyYXRpb25MYWJlbCwgSW50ZWdyYXRpb25MYWJlbFZhbHVlPigpOw0KKwkJTWFwPEludGVncmF0aW9uTGFiZWwsIEludGVncmF0aW9uTGFiZWxWYWx1ZT4gazRtYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ3JhdGlvbkxhYmVsLCBJbnRlZ3JhdGlvbkxhYmVsVmFsdWU+KCk7DQorCQlNYXA8SW50ZWdyYXRpb25MYWJlbCwgSW50ZWdyYXRpb25MYWJlbFZhbHVlPiBrNW1hcCA9IG5ldyBIYXNoTWFwPEludGVncmF0aW9uTGFiZWwsIEludGVncmF0aW9uTGFiZWxWYWx1ZT4oKTsNCisJCU1hcDxJbnRlZ3JhdGlvbkxhYmVsLCBJbnRlZ3JhdGlvbkxhYmVsVmFsdWU+IGs2bWFwID0gbmV3IEhhc2hNYXA8SW50ZWdyYXRpb25MYWJlbCwgSW50ZWdyYXRpb25MYWJlbFZhbHVlPigpOw0KKwkJDQorCQkvLyBVc2VkIGJlbG93IGFzIHRlbXBvcmFyeSBwbGFjZSBob2xkZXIsIG9uZSBmb3IgZWFjaCBkZWNvcmF0b3INCisJCUludGVncmF0aW9uTGFiZWxWYWx1ZSBfazFbXSwgX2syW10sIF9rM1tdLCBfazRbXSwgX2s1W10sIF9rNltdOw0KKwkJaW50IG51bURlY29yYXRvcnMgPSBpRGVjb3JhdG9ycy5zaXplKCk7DQorCQlfazEgPSBuZXcgSW50ZWdyYXRpb25MYWJlbFZhbHVlW251bURlY29yYXRvcnNdOw0KKwkJX2syID0gbmV3IEludGVncmF0aW9uTGFiZWxWYWx1ZVtudW1EZWNvcmF0b3JzXTsNCisJCV9rMyA9IG5ldyBJbnRlZ3JhdGlvbkxhYmVsVmFsdWVbbnVtRGVjb3JhdG9yc107DQorCQlfazQgPSBuZXcgSW50ZWdyYXRpb25MYWJlbFZhbHVlW251bURlY29yYXRvcnNdOw0KKwkJX2s1ID0gbmV3IEludGVncmF0aW9uTGFiZWxWYWx1ZVtudW1EZWNvcmF0b3JzXTsNCisJCV9rNiA9IG5ldyBJbnRlZ3JhdGlvbkxhYmVsVmFsdWVbbnVtRGVjb3JhdG9yc107DQorCQkNCisJCS8vIFRoZSBmaW5hbCBlc3RpbWF0ZXMgZm9yIGxhYmVsIHZhbHVlcyBhcmUgc3RvcmVkIGhlcmUNCisJCU1hcDxJbnRlZ3JhdGlvbkxhYmVsLCBJbnRlZ3JhdGlvbkxhYmVsVmFsdWU+IGZpbmFsRXN0aW1hdGUgPSBuZXcgSGFzaE1hcDxJbnRlZ3JhdGlvbkxhYmVsLCBJbnRlZ3JhdGlvbkxhYmVsVmFsdWU+KCk7DQorCQkNCisJCS8vIERlbHRhIGlzIHVzZWQgdG8gc2NhbGUgdGhlIHN0ZXAgKGgpDQorCQlkb3VibGUgZGVsdGEgPSAwLjA7CQ0KKwkJCQkNCisJCWludCBuPTA7DQorCQlmb3IoRGVjb3JhdG9yIHNkbTppRGVjb3JhdG9ycykgew0KKwkJCUl0ZXJhdG9yPER5bmFtaWNMYWJlbD4gaXRlciA9IHNkbS5nZXRMYWJlbHNUb1VwZGF0ZSh0aHJlYWRudW0sIG51bV90aHJlYWRzKQ0KKwkJCQkJLml0ZXJhdG9yKCk7DQorCQkJSW50ZWdyYXRpb25MYWJlbCBmaXJzdExhYmVsID0gKEludGVncmF0aW9uTGFiZWwpaXRlci5uZXh0KCk7DQorCQkJLy8gSW5pdGlhbGl6ZSB0ZW1wb3JhcnkgcGxhY2UgaG9sZGVycyBqdXN0IGJ5IGNyZWF0aW5nIGR1cHMgb2YgdGhlIGZpcnN0IGxhYmVsIGF2YWlsYWJsZQ0KKwkJCV9rMVtuXSA9IChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpRWNvcmVVdGlsLmNvcHkoZmlyc3RMYWJlbC5nZXRDdXJyZW50VmFsdWUoKSk7DQorCQkJX2syW25dID0gKEludGVncmF0aW9uTGFiZWxWYWx1ZSlFY29yZVV0aWwuY29weShmaXJzdExhYmVsLmdldEN1cnJlbnRWYWx1ZSgpKTsNCisJCQlfazNbbl0gPSAoSW50ZWdyYXRpb25MYWJlbFZhbHVlKUVjb3JlVXRpbC5jb3B5KGZpcnN0TGFiZWwuZ2V0Q3VycmVudFZhbHVlKCkpOw0KKwkJCV9rNFtuXSA9IChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpRWNvcmVVdGlsLmNvcHkoZmlyc3RMYWJlbC5nZXRDdXJyZW50VmFsdWUoKSk7DQorCQkJX2s1W25dID0gKEludGVncmF0aW9uTGFiZWxWYWx1ZSlFY29yZVV0aWwuY29weShmaXJzdExhYmVsLmdldEN1cnJlbnRWYWx1ZSgpKTsNCisJCQlfazZbbisrXSA9IChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpRWNvcmVVdGlsLmNvcHkoZmlyc3RMYWJlbC5nZXRDdXJyZW50VmFsdWUoKSk7DQorCQl9DQorCQkNCisJCQ0KKwkJLy8gS2VlcCB0cmFjayBpZiB3aGV0aGVyIGFueW9uZSB3YW50IHRvIHN0b3ANCisJCS8vIG9yIHBhdXNlIHVwZGF0aW5nIGxhYmVscw0KKwkJYm9vbGVhbiBpbnRlcnJ1cHQ9ZmFsc2UsIHBhdXNlID0gZmFsc2U7DQorCQkNCisJCS8vIFdlIGtlZXAgdGhlc2UgYXJvdW5kIHRvIGRldGVybWluZSB3aGVuIHRvIGNhbGwgc2V0UHJvZ3Jlc3MoLi4uKSBvbiB0aGUgZGVjb3JhdG9ycy4NCisJCS8vIElmIHdlIGNhbGwgdG9vIGZyZXF1ZW50bHkgd2UgY2FuIHRvbyBtYW55IGNhbGxiYWNrcyB3aGljaCBhZmZlY3RzIHBlcmZvcm1hbmNlLg0KKwkJZG91YmxlIG5leHRQcm9ncmVzc1JlcG9ydFN0ZXAgPSBudW1fdGhyZWFkcyooZW5kLXgpL01BWF9QUk9HUkVTU19SRVBPUlRTOw0KKwkJZG91YmxlIG5leHRQcm9ncmVzc1JlcG9ydCA9IHgrbmV4dFByb2dyZXNzUmVwb3J0U3RlcDsNCisJCQ0KKy8vCQlIYXNoTWFwPFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZT4gdmFsaWRhdGUgPSBuZXcgDQorLy8JCQlIYXNoTWFwPFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZT4oKTsgDQorCQkNCisJCS8vIFRoaXMgaXMgdGhlIG1haW4gbG9vcCB3ZSBrZWVwIGl0ZXJhdGluZyBvdmVyIHVudGlsIHdlIGFyZSBkb25lIHdpdGggdGhlIHN0ZXANCisJCXdoaWxlKHggPCBlbmQpIHsNCisJCQlrMW1hcC5jbGVhcigpOw0KKwkJCWsybWFwLmNsZWFyKCk7DQorCQkJazNtYXAuY2xlYXIoKTsNCisJCQlrNG1hcC5jbGVhcigpOw0KKwkJCWs1bWFwLmNsZWFyKCk7DQorCQkJazZtYXAuY2xlYXIoKTsNCisJCQlmaW5hbEVzdGltYXRlLmNsZWFyKCk7DQorCQkJDQorCQkJLy8gVmFsaWRhdGlvbiBjb2RlIGtlcHQgaGVyZSBpZiBuZWVkZWQgaW4gdGhlIGZ1dHVyZQ0KKwkJCQ0KKwkJCS8qDQorCQkJDQorCQkJICBIYXNoTWFwPFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZT4gdmFsaWRhdGUgPSBuZXcgSGFzaE1hcDxTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsLCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWU+KCk7DQorCQkJIA0KKwkJCQ0KKwkJCWlmKCFyZWRvKSAJDQorCQkJCWZvcihTdGFuZGFyZERpc2Vhc2VNb2RlbEltcGwgc2RtOmRpc2Vhc2VNb2RlbERlY29yYXRvcnMpIHsNCisJCQkJCWZvciAoZmluYWwgSXRlcmF0b3I8RHluYW1pY0xhYmVsPiBjdXJyZW50U3RhdGVMYWJlbEl0ZXIgPSBzZG0uZ2V0TGFiZWxzVG9VcGRhdGUodGhyZWFkbnVtLCBudW1fdGhyZWFkcykNCisJCQkJCQkuaXRlcmF0b3IoKTsgY3VycmVudFN0YXRlTGFiZWxJdGVyLmhhc05leHQoKTspIHsNCisJCQkJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VMYWJlbCA9IChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKSBjdXJyZW50U3RhdGVMYWJlbEl0ZXINCisJCQkJCQkubmV4dCgpOw0KKwkJCQkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSB2YWwgPSAoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKWRpc2Vhc2VMYWJlbC5nZXRDdXJyZW50RGlzZWFzZU1vZGVsVGVtcExhYmVsVmFsdWUoKTsNCisJCQkJCQl2YWxpZGF0ZS5wdXQoZGlzZWFzZUxhYmVsLCB2YWwpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJZWxzZSB7DQorCQkJCWZvcihTdGFuZGFyZERpc2Vhc2VNb2RlbEltcGwgc2RtOmRpc2Vhc2VNb2RlbERlY29yYXRvcnMpDQorCQkJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPER5bmFtaWNMYWJlbD4gY3VycmVudFN0YXRlTGFiZWxJdGVyID0gc2RtLmdldExhYmVsc1RvVXBkYXRlKHRocmVhZG51bSwgbnVtX3RocmVhZHMpDQorCQkJCQkJCS5pdGVyYXRvcigpOyBjdXJyZW50U3RhdGVMYWJlbEl0ZXIuaGFzTmV4dCgpOykgew0KKwkJCQkJCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VMYWJlbCA9IChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKSBjdXJyZW50U3RhdGVMYWJlbEl0ZXINCisJCQkJCQkJLm5leHQoKTsNCisJCQkJCQkJZmluYWwgU0lSTGFiZWxWYWx1ZSB2YWwgPSAoU0lSTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuZ2V0Q3VycmVudERpc2Vhc2VNb2RlbFRlbXBMYWJlbFZhbHVlKCk7DQorCQkJCQkJCXZhbGlkYXRlLnB1dChkaXNlYXNlTGFiZWwsIHZhbCk7DQorCQkJCQkJCWZpbmFsIFNJUkxhYmVsVmFsdWUgb2xkVmFsID0gKFNJUkxhYmVsVmFsdWUpdmFsaWRhdGUuZ2V0KGRpc2Vhc2VMYWJlbCk7DQorCQkJCQkJCQ0KKwkJCQkJCQlpZih2YWwuZ2V0SSgpICE9IG9sZFZhbC5nZXRJKCkgfHwNCisJCQkJCQkJCQl2YWwuZ2V0UygpICE9IG9sZFZhbC5nZXRTKCkgfHwNCisJCQkJCQkJCQl2YWwuZ2V0UigpICE9IG9sZFZhbC5nZXRSKCkgfHwNCisJCQkJCQkJCQkvL3ZhbC5nZXRFKCkgIT0gb2xkVmFsLmdldEUoKSB8fA0KKwkJCQkJCQkJCXZhbC5nZXRCaXJ0aHMoKSAhPSBvbGRWYWwuZ2V0QmlydGhzKCkgfHwNCisJCQkJCQkJCQl2YWwuZ2V0RGVhdGhzKCkgIT0gb2xkVmFsLmdldERlYXRocygpIHx8DQorCQkJCQkJCQkJdmFsLmdldERpc2Vhc2VEZWF0aHMoKSAhPSBvbGRWYWwuZ2V0RGlzZWFzZURlYXRocygpIA0KKwkJCQkJCQkJCSkNCisJCQkJCQkJCUFjdGl2YXRvci5sb2dFcnJvcigiRXJyb3IsIG9sZCBhbmQgbmV3IHZhbHVlIG5vdCB0aGUgc2FtZSAgbGFiZWw6ICIrZGlzZWFzZUxhYmVsLCBuZXcgRXhjZXB0aW9uKCkpOw0KKwkJCQkJfQ0KKwkJCX0NCisJCQkqLw0KKwkJCQ0KKwkJCS8vIFRvRG86IFdlIHNob3VsZCBjaGVjayBpZiBhIG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgaGF2ZSBiZWVuDQorCQkJLy8gZXhjZWVkZWQgaGVyZSBhbmQgdGhyb3cgYW4gZXJyb3IuIA0KKwkJCQ0KKwkJCS8vIEZpcnN0LCBnZXQgdGhlIGRlbHRhIHZhbHVlcyBhdCB0aGUgY3VycmVudCBzdGF0ZQ0KKwkJCWZvcihEZWNvcmF0b3Igc2RtOmlEZWNvcmF0b3JzKSANCisJCQkJKChJbnRlZ3JhdGlvbkRlY29yYXRvcilzZG0pLmNhbGN1bGF0ZURlbHRhKHRpbWUsIHRpbWVEZWx0YSwgc2RtLmdldExhYmVsc1RvVXBkYXRlKHRocmVhZG51bSwgbnVtX3RocmVhZHMpKTsNCisJCQlmb3IoRGVjb3JhdG9yIHNkbTppRGVjb3JhdG9ycykNCisJCQkJKChJbnRlZ3JhdGlvbkRlY29yYXRvcilzZG0pLmFwcGx5RXh0ZXJuYWxEZWx0YXModGltZSwgdGltZURlbHRhLCBzZG0uZ2V0TGFiZWxzVG9VcGRhdGUodGhyZWFkbnVtLCBudW1fdGhyZWFkcykpOw0KKwkJCQ0KKwkJCS8vIFNldCB0aGUgc2NhbGluZyBmYWN0b3IgZm9yIGRpc2Vhc2UgcGFyYW1ldGVycyBmb3IgZWFjaCBkZWNvcmF0b3IgYW5kIGxvY2F0aW9uDQorCQkJZm9yKERlY29yYXRvciBzZG06aURlY29yYXRvcnMpIHsNCisJCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxEeW5hbWljTGFiZWw+IGN1cnJlbnRTdGF0ZUxhYmVsSXRlciA9IHNkbS5nZXRMYWJlbHNUb1VwZGF0ZSh0aHJlYWRudW0sIG51bV90aHJlYWRzKQ0KKwkJCQkJCS5pdGVyYXRvcigpOyBjdXJyZW50U3RhdGVMYWJlbEl0ZXIuaGFzTmV4dCgpOykgew0KKwkJCQkJZmluYWwgSW50ZWdyYXRpb25MYWJlbCBkaXNlYXNlTGFiZWwgPSAoSW50ZWdyYXRpb25MYWJlbCkgY3VycmVudFN0YXRlTGFiZWxJdGVyDQorCQkJCQkubmV4dCgpOw0KKwkJCQkJDQorCQkJCQlJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgc2NhbGUgPSAoSW50ZWdyYXRpb25MYWJlbFZhbHVlKWRpc2Vhc2VMYWJlbC5nZXRFcnJvclNjYWxlKCk7DQorCQkJCQlzY2FsZS5zZXQoKEludGVncmF0aW9uTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuZ2V0VGVtcFZhbHVlKCkpOw0KKwkJCQkJDQorCQkJCQlJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgZHQgPSAoSW50ZWdyYXRpb25MYWJlbFZhbHVlKUVjb3JlVXRpbC5jb3B5KGRpc2Vhc2VMYWJlbC5nZXREZWx0YVZhbHVlKCkpOw0KKwkJCQkJZHQuc2NhbGUoaCk7DQorCQkJCQlkdC5hYnMoKTsNCisJCQkJCWR0LmFkZChUSU5ZKTsNCisJCQkJCXNjYWxlLmFicygpOw0KKwkJCQkJc2NhbGUuYWRkKGR0KTsNCisJCQkJfQ0KKwkJCX0NCisJCQkNCisJCQkvLyBTdGVwIDEgaW4gUnVuZ2UgS3V0dGEgRmVobGJlcmcuIA0KKwkJCS8vIEdldCB0aGUgZGVsdGEgdmFsdWVzIG91dCBvZiBlYWNoIG5vZGUgbGFiZWwgYW5kDQorCQkJLy8gYnVpbGQgYSBmaXJzdCBlc3RpbWF0ZSBvZiB0aGUgbmV4dCB2YWx1ZScNCisJCQlmb3IoRGVjb3JhdG9yIHNkbTppRGVjb3JhdG9ycykgew0KKwkJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPER5bmFtaWNMYWJlbD4gY3VycmVudFN0YXRlTGFiZWxJdGVyID0gc2RtLmdldExhYmVsc1RvVXBkYXRlKHRocmVhZG51bSwgbnVtX3RocmVhZHMpDQorCQkJCQkJLml0ZXJhdG9yKCk7IGN1cnJlbnRTdGF0ZUxhYmVsSXRlci5oYXNOZXh0KCk7KSB7DQorCQkJCQlmaW5hbCBJbnRlZ3JhdGlvbkxhYmVsIGRpc2Vhc2VMYWJlbCA9IChJbnRlZ3JhdGlvbkxhYmVsKSBjdXJyZW50U3RhdGVMYWJlbEl0ZXINCisJCQkJCS5uZXh0KCk7DQorCQkJCQkNCisJCQkJCUludGVncmF0aW9uTGFiZWxWYWx1ZSBkZWx0YUxhYmVsID0gKEludGVncmF0aW9uTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuZ2V0RGVsdGFWYWx1ZSgpOw0KKwkJCQkJazFtYXAucHV0KGRpc2Vhc2VMYWJlbCwgKEludGVncmF0aW9uTGFiZWxWYWx1ZSlFY29yZVV0aWwuY29weShkZWx0YUxhYmVsKSk7DQorCQkJCQkNCisJCQkJCWRlbHRhTGFiZWwuc2NhbGUoaCk7DQorCQkJCQlkZWx0YUxhYmVsLnNjYWxlKGIyMSk7DQorCQkJCQkoKEludGVncmF0aW9uTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuZ2V0UHJvYmVWYWx1ZSgpKS5zZXQoDQorCQkJCQkJCWRlbHRhTGFiZWwuYWRkKChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpDQorCQkJCQkJCWRpc2Vhc2VMYWJlbC4NCisJCQkJCQkJZ2V0VGVtcFZhbHVlKCkpKTsJDQorCQkJCX0NCisJCQl9DQorCQkJDQorCQkJLy8gTm93IGdldCB0aGUgbmV4dCBkZWx0YSB2YWx1ZXMNCisJCQlmb3IoRGVjb3JhdG9yIHNkbTppRGVjb3JhdG9ycykgDQorCQkJCSgoSW50ZWdyYXRpb25EZWNvcmF0b3Ipc2RtKS5jYWxjdWxhdGVEZWx0YSh0aW1lLCB0aW1lRGVsdGEsIHNkbS5nZXRMYWJlbHNUb1VwZGF0ZSh0aHJlYWRudW0sIG51bV90aHJlYWRzKSk7DQorCQkJZm9yKERlY29yYXRvciBzZG06aURlY29yYXRvcnMpDQorCQkJCSgoSW50ZWdyYXRpb25EZWNvcmF0b3Ipc2RtKS5hcHBseUV4dGVybmFsRGVsdGFzKHRpbWUsIHRpbWVEZWx0YSwgc2RtLmdldExhYmVsc1RvVXBkYXRlKHRocmVhZG51bSwgbnVtX3RocmVhZHMpKTsNCisNCisJCQkNCisJCQkvLyBTdGVwIDIgaW4gUnVuZ2UgS3V0dGEgRmVobGJlcmcuIA0KKwkJCS8vIEdldCB0aGUgZGVsdGEgdmFsdWVzIG91dCBvZiBlYWNoIG5vZGUgbGFiZWwgYW5kDQorCQkJLy8gYnVpbGQgYSBzZWNvbmQgZXN0aW1hdGUgb2YgdGhlIG5leHQgdmFsdWUNCisJCQluID0gMDsNCisJCQlmb3IoRGVjb3JhdG9yIHNkbTppRGVjb3JhdG9ycykgew0KKwkJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPER5bmFtaWNMYWJlbD4gY3VycmVudFN0YXRlTGFiZWxJdGVyID0gc2RtLmdldExhYmVsc1RvVXBkYXRlKHRocmVhZG51bSwgbnVtX3RocmVhZHMpDQorCQkJCQkJLml0ZXJhdG9yKCk7IGN1cnJlbnRTdGF0ZUxhYmVsSXRlci5oYXNOZXh0KCk7KSB7DQorCQkJCQlmaW5hbCBJbnRlZ3JhdGlvbkxhYmVsIGRpc2Vhc2VMYWJlbCA9IChJbnRlZ3JhdGlvbkxhYmVsKSBjdXJyZW50U3RhdGVMYWJlbEl0ZXINCisJCQkJCS5uZXh0KCk7DQorCQkJCQkNCisJCQkJCUludGVncmF0aW9uTGFiZWxWYWx1ZSBkZWx0YUxhYmVsID0gKEludGVncmF0aW9uTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuZ2V0RGVsdGFWYWx1ZSgpOw0KKwkJCQkJazJtYXAucHV0KGRpc2Vhc2VMYWJlbCwoSW50ZWdyYXRpb25MYWJlbFZhbHVlKUVjb3JlVXRpbC5jb3B5KGRlbHRhTGFiZWwpKTsNCisJCQkJCV9rMVtuXS5zZXQoazFtYXAuZ2V0KGRpc2Vhc2VMYWJlbCkpOw0KKwkJCQkJX2syW25dLnNldChkZWx0YUxhYmVsKTsNCisJCQkJCQ0KKwkJCQkJSW50ZWdyYXRpb25MYWJlbFZhbHVlIGVzdERlbHRhID0gDQorCQkJCQkJX2sxW25dLnNjYWxlKGIzMSk7DQorCQkJCQlfazJbbl0uc2NhbGUoYjMyKTsNCisJCQkJCWVzdERlbHRhLmFkZChfazJbbl0pOw0KKwkJCQkJDQorCQkJCQllc3REZWx0YS5zY2FsZShoKTsNCisJCQkJCQ0KKwkJCQkJKChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpZGlzZWFzZUxhYmVsLmdldFByb2JlVmFsdWUoKSkuc2V0KGVzdERlbHRhLmFkZCgNCisJCQkJCQkJKEludGVncmF0aW9uTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuDQorCQkJCQkJCWdldFRlbXBWYWx1ZSgpKSk7DQorCQkJCX0NCisJCQkJKytuOw0KKwkJCX0NCisJCQkNCisJCQkvLyBOb3cgZ2V0IHRoZSBuZXh0IGRlbHRhIHZhbHVlcw0KKwkJCWZvcihEZWNvcmF0b3Igc2RtOmlEZWNvcmF0b3JzKSANCisJCQkJKChJbnRlZ3JhdGlvbkRlY29yYXRvcilzZG0pLmNhbGN1bGF0ZURlbHRhKHRpbWUsIHRpbWVEZWx0YSwgc2RtLmdldExhYmVsc1RvVXBkYXRlKHRocmVhZG51bSwgbnVtX3RocmVhZHMpKTsNCisJCQlmb3IoRGVjb3JhdG9yIHNkbTppRGVjb3JhdG9ycykNCisJCQkJKChJbnRlZ3JhdGlvbkRlY29yYXRvcilzZG0pLmFwcGx5RXh0ZXJuYWxEZWx0YXModGltZSwgdGltZURlbHRhLCBzZG0uZ2V0TGFiZWxzVG9VcGRhdGUodGhyZWFkbnVtLCBudW1fdGhyZWFkcykpOw0KKw0KKwkJCQ0KKwkJCS8vIFN0ZXAgMyBpbiBSdW5nZSBLdXR0YSBGZWhsYmVyZy4gDQorCQkJLy8gR2V0IHRoZSBkZWx0YSB2YWx1ZXMgb3V0IG9mIGVhY2ggbm9kZSBsYWJlbCBhbmQNCisJCQkvLyBidWlsZCBhIHRoaXJkIGVzdGltYXRlIG9mIHRoZSBuZXh0IHZhbHVlDQorCQkJbiA9IDA7DQorCQkJZm9yKERlY29yYXRvciBzZG06aURlY29yYXRvcnMpIHsNCisJCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxEeW5hbWljTGFiZWw+IGN1cnJlbnRTdGF0ZUxhYmVsSXRlciA9IHNkbS5nZXRMYWJlbHNUb1VwZGF0ZSh0aHJlYWRudW0sIG51bV90aHJlYWRzKQ0KKwkJCQkJCS5pdGVyYXRvcigpOyBjdXJyZW50U3RhdGVMYWJlbEl0ZXIuaGFzTmV4dCgpOykgew0KKwkJCQkJZmluYWwgSW50ZWdyYXRpb25MYWJlbCBkaXNlYXNlTGFiZWwgPSAoSW50ZWdyYXRpb25MYWJlbCkgY3VycmVudFN0YXRlTGFiZWxJdGVyDQorCQkJCQkubmV4dCgpOw0KKwkJCQkJDQorCQkJCQlJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgZGVsdGFMYWJlbCA9IChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpZGlzZWFzZUxhYmVsLmdldERlbHRhVmFsdWUoKTsNCisJCQkJCWszbWFwLnB1dChkaXNlYXNlTGFiZWwsIChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpRWNvcmVVdGlsLmNvcHkoZGVsdGFMYWJlbCkpOw0KKwkJCQkJDQorCQkJCQlfazFbbl0uc2V0KGsxbWFwLmdldChkaXNlYXNlTGFiZWwpKTsNCisJCQkJCV9rMltuXS5zZXQoazJtYXAuZ2V0KGRpc2Vhc2VMYWJlbCkpOw0KKwkJCQkJX2szW25dLnNldChkZWx0YUxhYmVsKTsNCisJCQkJCQ0KKwkJCQkJX2sxW25dLnNjYWxlKGI0MSk7DQorCQkJCQlfazJbbl0uc2NhbGUoYjQyKTsNCisJCQkJCV9rM1tuXS5zY2FsZShiNDMpOw0KKwkJCQkJSW50ZWdyYXRpb25MYWJlbFZhbHVlIGVzdERlbHRhID0gX2sxW25dOw0KKwkJCQkJZXN0RGVsdGEuYWRkKF9rMltuXSk7DQorCQkJCQllc3REZWx0YS5hZGQoX2szW25dKTsNCisJCQkJCQ0KKwkJCQkJZXN0RGVsdGEuc2NhbGUoaCk7DQorCQkJCQkNCisJCQkJCSgoSW50ZWdyYXRpb25MYWJlbFZhbHVlKWRpc2Vhc2VMYWJlbC5nZXRQcm9iZVZhbHVlKCkpLnNldChlc3REZWx0YS5hZGQoDQorCQkJCQkJCShJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpZGlzZWFzZUxhYmVsLg0KKwkJCQkJCQlnZXRUZW1wVmFsdWUoKSkpOw0KKwkJCQl9CQ0KKwkJCQkrK247DQorCQkJfQ0KKwkJCQ0KKwkJCS8vIE5vdyBnZXQgdGhlIG5leHQgZGVsdGEgdmFsdWVzDQorCQkJZm9yKERlY29yYXRvciBzZG06aURlY29yYXRvcnMpIA0KKwkJCQkoKEludGVncmF0aW9uRGVjb3JhdG9yKXNkbSkuY2FsY3VsYXRlRGVsdGEodGltZSwgdGltZURlbHRhLCBzZG0uZ2V0TGFiZWxzVG9VcGRhdGUodGhyZWFkbnVtLCBudW1fdGhyZWFkcykpOw0KKwkJCWZvcihEZWNvcmF0b3Igc2RtOmlEZWNvcmF0b3JzKQ0KKwkJCQkoKEludGVncmF0aW9uRGVjb3JhdG9yKXNkbSkuYXBwbHlFeHRlcm5hbERlbHRhcyh0aW1lLCB0aW1lRGVsdGEsIHNkbS5nZXRMYWJlbHNUb1VwZGF0ZSh0aHJlYWRudW0sIG51bV90aHJlYWRzKSk7DQorDQorCQkJDQorCQkJLy8gU3RlcCA0IGluIFJ1bmdlIEt1dHRhIEZlaGxiZXJnLiANCisJCQkvLyBHZXQgdGhlIGRlbHRhIHZhbHVlcyBvdXQgb2YgZWFjaCBub2RlIGxhYmVsIGFuZA0KKwkJCS8vIGJ1aWxkIGEgZm91cnRoIGVzdGltYXRlIG9mIHRoZSBuZXh0IHZhbHVlDQorCQkJbiA9IDA7DQorCQkJZm9yKERlY29yYXRvciBzZG06aURlY29yYXRvcnMpIHsNCisJCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxEeW5hbWljTGFiZWw+IGN1cnJlbnRTdGF0ZUxhYmVsSXRlciA9IHNkbS5nZXRMYWJlbHNUb1VwZGF0ZSh0aHJlYWRudW0sIG51bV90aHJlYWRzKQ0KKwkJCQkJCS5pdGVyYXRvcigpOyBjdXJyZW50U3RhdGVMYWJlbEl0ZXIuaGFzTmV4dCgpOykgew0KKwkJCQkJZmluYWwgSW50ZWdyYXRpb25MYWJlbCBkaXNlYXNlTGFiZWwgPSAoSW50ZWdyYXRpb25MYWJlbCkgY3VycmVudFN0YXRlTGFiZWxJdGVyDQorCQkJCQkubmV4dCgpOw0KKwkJCQkJDQorCQkJCQlJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgZGVsdGFMYWJlbCA9IChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpZGlzZWFzZUxhYmVsLmdldERlbHRhVmFsdWUoKTsNCisJCQkJCWs0bWFwLnB1dChkaXNlYXNlTGFiZWwsKEludGVncmF0aW9uTGFiZWxWYWx1ZSlFY29yZVV0aWwuY29weShkZWx0YUxhYmVsKSk7DQorCQkJCQkNCisJCQkJCV9rMVtuXS5zZXQoazFtYXAuZ2V0KGRpc2Vhc2VMYWJlbCkpOw0KKwkJCQkJX2syW25dLnNldChrMm1hcC5nZXQoZGlzZWFzZUxhYmVsKSk7DQorCQkJCQlfazNbbl0uc2V0KGszbWFwLmdldChkaXNlYXNlTGFiZWwpKTsNCisJCQkJCV9rNFtuXS5zZXQoZGVsdGFMYWJlbCk7DQorCQkJCQkNCisJCQkJCV9rMVtuXS5zY2FsZShiNTEpOw0KKwkJCQkJX2syW25dLnNjYWxlKGI1Mik7DQorCQkJCQlfazNbbl0uc2NhbGUoYjUzKTsNCisJCQkJCV9rNFtuXS5zY2FsZShiNTQpOw0KKwkJCQkJDQorCQkJCQlJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgZXN0RGVsdGEgPSBfazFbbl07DQorCQkJCQllc3REZWx0YS5hZGQoX2syW25dKTsNCisJCQkJCWVzdERlbHRhLmFkZChfazNbbl0pOw0KKwkJCQkJZXN0RGVsdGEuYWRkKF9rNFtuXSk7DQorCQkJCQkNCisJCQkJCWVzdERlbHRhLnNjYWxlKGgpOw0KKwkJCQkJKChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpZGlzZWFzZUxhYmVsLmdldFByb2JlVmFsdWUoKSkuc2V0KGVzdERlbHRhLmFkZCgNCisJCQkJCQkJKEludGVncmF0aW9uTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuDQorCQkJCQkJCWdldFRlbXBWYWx1ZSgpKSk7DQorCQkJCX0NCisJCQkJKytuOw0KKwkJCX0NCisJCQ0KKwkJCS8vIE5vdyBnZXQgdGhlIG5leHQgZGVsdGEgdmFsdWVzDQorCQkJZm9yKERlY29yYXRvciBzZG06aURlY29yYXRvcnMpIA0KKwkJCQkoKEludGVncmF0aW9uRGVjb3JhdG9yKXNkbSkuY2FsY3VsYXRlRGVsdGEodGltZSwgdGltZURlbHRhLCBzZG0uZ2V0TGFiZWxzVG9VcGRhdGUodGhyZWFkbnVtLCBudW1fdGhyZWFkcykpOw0KKwkJCWZvcihEZWNvcmF0b3Igc2RtOmlEZWNvcmF0b3JzKQ0KKwkJCQkoKEludGVncmF0aW9uRGVjb3JhdG9yKXNkbSkuYXBwbHlFeHRlcm5hbERlbHRhcyh0aW1lLCB0aW1lRGVsdGEsIHNkbS5nZXRMYWJlbHNUb1VwZGF0ZSh0aHJlYWRudW0sIG51bV90aHJlYWRzKSk7DQorDQorCQkJDQorCQkJLy8gU3RlcCA1IGluIFJ1bmdlIEt1dHRhIEZlaGxiZXJnLiANCisJCQkvLyBHZXQgdGhlIGRlbHRhIHZhbHVlcyBvdXQgb2YgZWFjaCBub2RlIGxhYmVsIGFuZA0KKwkJCS8vIGJ1aWxkIGEgZmlmdGggZXN0aW1hdGUgb2YgdGhlIG5leHQgdmFsdWUNCisJCQluID0gMDsNCisJCQlmb3IoRGVjb3JhdG9yIHNkbTppRGVjb3JhdG9ycykgew0KKwkJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPER5bmFtaWNMYWJlbD4gY3VycmVudFN0YXRlTGFiZWxJdGVyID0gc2RtLmdldExhYmVsc1RvVXBkYXRlKHRocmVhZG51bSwgbnVtX3RocmVhZHMpDQorCQkJCQkJLml0ZXJhdG9yKCk7IGN1cnJlbnRTdGF0ZUxhYmVsSXRlci5oYXNOZXh0KCk7KSB7DQorCQkJDQorCQkJCQlmaW5hbCBJbnRlZ3JhdGlvbkxhYmVsIGRpc2Vhc2VMYWJlbCA9IChJbnRlZ3JhdGlvbkxhYmVsKSBjdXJyZW50U3RhdGVMYWJlbEl0ZXINCisJCQkJCS5uZXh0KCk7DQorCQkJCQkNCisJCQkJCUludGVncmF0aW9uTGFiZWxWYWx1ZSBkZWx0YUxhYmVsID0gKEludGVncmF0aW9uTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuZ2V0RGVsdGFWYWx1ZSgpOw0KKwkJCQkJazVtYXAucHV0KGRpc2Vhc2VMYWJlbCwoSW50ZWdyYXRpb25MYWJlbFZhbHVlKUVjb3JlVXRpbC5jb3B5KGRlbHRhTGFiZWwpKTsNCisJCQkJCQ0KKwkJCQkJX2sxW25dLnNldChrMW1hcC5nZXQoZGlzZWFzZUxhYmVsKSk7DQorCQkJCQlfazJbbl0uc2V0KGsybWFwLmdldChkaXNlYXNlTGFiZWwpKTsNCisJCQkJCV9rM1tuXS5zZXQoazNtYXAuZ2V0KGRpc2Vhc2VMYWJlbCkpOw0KKwkJCQkJX2s0W25dLnNldChrNG1hcC5nZXQoZGlzZWFzZUxhYmVsKSk7DQorCQkJCQlfazVbbl0uc2V0KGRlbHRhTGFiZWwpOw0KKwkJCQkJDQorCQkJCQlfazFbbl0uc2NhbGUoYjYxKTsNCisJCQkJCV9rMltuXS5zY2FsZShiNjIpOw0KKwkJCQkJX2szW25dLnNjYWxlKGI2Myk7DQorCQkJCQlfazRbbl0uc2NhbGUoYjY0KTsNCisJCQkJCV9rNVtuXS5zY2FsZShiNjUpOw0KKwkJCQkJDQorCQkJCQlJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgZXN0RGVsdGEgPSBfazFbbl07DQorCQkJCQllc3REZWx0YS5hZGQoX2syW25dKTsNCisJCQkJCWVzdERlbHRhLmFkZChfazNbbl0pOw0KKwkJCQkJZXN0RGVsdGEuYWRkKF9rNFtuXSk7DQorCQkJCQllc3REZWx0YS5hZGQoX2s1W25dKTsNCisJCQkJCQ0KKwkJCQkJZXN0RGVsdGEuc2NhbGUoaCk7DQorCQkJCQkNCisJCQkJCSgoSW50ZWdyYXRpb25MYWJlbFZhbHVlKWRpc2Vhc2VMYWJlbC5nZXRQcm9iZVZhbHVlKCkpLnNldChlc3REZWx0YS5hZGQoDQorCQkJCQkJCShJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpZGlzZWFzZUxhYmVsLg0KKwkJCQkJCQlnZXRUZW1wVmFsdWUoKSkpOw0KKwkJCQl9CQ0KKwkJCQkrK247DQorCQkJfQ0KKwkJCQ0KKwkJCS8vIE5vdyBnZXQgdGhlIG5leHQgZGVsdGEgdmFsdWVzDQorCQkJZm9yKERlY29yYXRvciBzZG06aURlY29yYXRvcnMpIA0KKwkJCQkoKEludGVncmF0aW9uRGVjb3JhdG9yKXNkbSkuY2FsY3VsYXRlRGVsdGEodGltZSwgdGltZURlbHRhLCBzZG0uZ2V0TGFiZWxzVG9VcGRhdGUodGhyZWFkbnVtLCBudW1fdGhyZWFkcykpOw0KKwkJCWZvcihEZWNvcmF0b3Igc2RtOmlEZWNvcmF0b3JzKQ0KKwkJCQkoKEludGVncmF0aW9uRGVjb3JhdG9yKXNkbSkuYXBwbHlFeHRlcm5hbERlbHRhcyh0aW1lLCB0aW1lRGVsdGEsIHNkbS5nZXRMYWJlbHNUb1VwZGF0ZSh0aHJlYWRudW0sIG51bV90aHJlYWRzKSk7DQorDQorCQkJDQorCQkJLy8gU3RlcCA2IGluIFJ1bmdlIEt1dHRhIEZlaGxiZXJnLiANCisJCQkvLyBDYWxjdWxhdGUgazYNCisJCQluID0gMDsNCisJCQlmb3IoRGVjb3JhdG9yIHNkbTppRGVjb3JhdG9ycykgew0KKwkJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPER5bmFtaWNMYWJlbD4gY3VycmVudFN0YXRlTGFiZWxJdGVyID0gc2RtLmdldExhYmVsc1RvVXBkYXRlKHRocmVhZG51bSwgbnVtX3RocmVhZHMpDQorCQkJCQkJLml0ZXJhdG9yKCk7IGN1cnJlbnRTdGF0ZUxhYmVsSXRlci5oYXNOZXh0KCk7KSB7DQorCQkJDQorCQkJCQlmaW5hbCBJbnRlZ3JhdGlvbkxhYmVsIGRpc2Vhc2VMYWJlbCA9IChJbnRlZ3JhdGlvbkxhYmVsKSBjdXJyZW50U3RhdGVMYWJlbEl0ZXINCisJCQkJCS5uZXh0KCk7DQorCQkJCQkNCisJCQkJCUludGVncmF0aW9uTGFiZWxWYWx1ZSBkZWx0YUxhYmVsID0gKEludGVncmF0aW9uTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuZ2V0RGVsdGFWYWx1ZSgpOw0KKwkJCQkJazZtYXAucHV0KGRpc2Vhc2VMYWJlbCwoSW50ZWdyYXRpb25MYWJlbFZhbHVlKUVjb3JlVXRpbC5jb3B5KGRlbHRhTGFiZWwpKTsNCisJCQkJfQ0KKwkJCQkrK247DQorCQkJfQ0KKwkJCQ0KKwkJCS8vIFN0ZXAgNyBpbiBSdW5nZSBLdXR0YSBGZWhsYmVyZw0KKwkJCS8vIENhbGN1bGF0ZSB0aGUgdHdvIGVzdGltYXRlcyBmcm9tIGsxLCAuLiBrNiB2YWx1ZXMNCisJCQkvLyBhbmQgZGV0ZXJtaW5lIHRoZSBtYXhpbXVtIGRpZmZlcmVuY2UgKGVycm9yKSBiZXR3ZWVuIHRoZW0uDQorCQkJDQorCQkJYm9vbGVhbiBzdWNjZXNzID0gdHJ1ZTsgLy8gV2VyZSB3ZSBhYmxlIHRvIHVwZGF0ZSBhbGwgbGFiZWxzIHdpdGhvdXQgYSBsYXJnZSBlbm91Z2ggZXJyb3I/DQorCQkJZG91YmxlIG1heGVycm9yID0gMC4wOw0KKwkJCW4gPSAwOw0KKwkJCWZvcihEZWNvcmF0b3Igc2RtOmlEZWNvcmF0b3JzKSB7DQorCQkJCWZvciAoZmluYWwgSXRlcmF0b3I8RHluYW1pY0xhYmVsPiBjdXJyZW50U3RhdGVMYWJlbEl0ZXIgPSBzZG0uZ2V0TGFiZWxzVG9VcGRhdGUodGhyZWFkbnVtLCBudW1fdGhyZWFkcykNCisJCQkJCQkuaXRlcmF0b3IoKTsgY3VycmVudFN0YXRlTGFiZWxJdGVyLmhhc05leHQoKTspIHsNCisJCQkNCisJCQkJCWZpbmFsIEludGVncmF0aW9uTGFiZWwgZGlzZWFzZUxhYmVsID0gKEludGVncmF0aW9uTGFiZWwpIGN1cnJlbnRTdGF0ZUxhYmVsSXRlcg0KKwkJCQkJLm5leHQoKTsNCisJCQkNCisJCQkJCUludGVncmF0aW9uTGFiZWxWYWx1ZSBjdXJyZW50VmFsdWUgPSAoSW50ZWdyYXRpb25MYWJlbFZhbHVlKWRpc2Vhc2VMYWJlbC5nZXRUZW1wVmFsdWUoKTsNCisJCQkJCQ0KKwkJCQkJX2sxW25dLnNldChrMW1hcC5nZXQoZGlzZWFzZUxhYmVsKSk7DQorCQkJCQlfazNbbl0uc2V0KGszbWFwLmdldChkaXNlYXNlTGFiZWwpKTsNCisJCQkJCV9rNFtuXS5zZXQoazRtYXAuZ2V0KGRpc2Vhc2VMYWJlbCkpOw0KKwkJCQkJX2s1W25dLnNldChrNW1hcC5nZXQoZGlzZWFzZUxhYmVsKSk7DQorCQkJCQlfazZbbl0uc2V0KGs2bWFwLmdldChkaXNlYXNlTGFiZWwpKTsJDQorCQkJCQkNCisJCQkJCV9rMVtuXS5zY2FsZShjMSk7DQorCQkJCQlfazNbbl0uc2NhbGUoYzMpOw0KKwkJCQkJX2s0W25dLnNjYWxlKGM0KTsNCisJCQkJCV9rNltuXS5zY2FsZShjNik7DQorCQkJCQkNCisJCQkJCS8vIE5ldyBZDQorCQkJCQlJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgeW91dCA9IChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpDQorCQkJCQkJRWNvcmVVdGlsLmNvcHkoX2sxW25dLmFkZChfazNbbl0pLmFkZChfazRbbl0pLmFkZChfazZbbl0pKTsNCisJCQkJCQ0KKwkJCQkJeW91dC5zY2FsZShoKTsNCisJCQkJCXlvdXQuYWRkKGN1cnJlbnRWYWx1ZSk7DQorCQkJCQkJCQkNCisJCQkJCQ0KKwkJCQkJLy8gR2V0IHRoZSBlcnJvcg0KKwkJCQkJX2sxW25dLnNldChrMW1hcC5nZXQoZGlzZWFzZUxhYmVsKSk7DQorCQkJCQlfazNbbl0uc2V0KGszbWFwLmdldChkaXNlYXNlTGFiZWwpKTsNCisJCQkJCV9rNFtuXS5zZXQoazRtYXAuZ2V0KGRpc2Vhc2VMYWJlbCkpOw0KKwkJCQkJX2s1W25dLnNldChrNW1hcC5nZXQoZGlzZWFzZUxhYmVsKSk7DQorCQkJCQlfazZbbl0uc2V0KGs2bWFwLmdldChkaXNlYXNlTGFiZWwpKTsJDQorCQkJCQkNCisJCQkJCV9rMVtuXS5zY2FsZShkYzEpOw0KKwkJCQkJX2szW25dLnNjYWxlKGRjMyk7DQorCQkJCQlfazRbbl0uc2NhbGUoZGM0KTsNCisJCQkJCV9rNVtuXS5zY2FsZShkYzUpOw0KKwkJCQkJX2s2W25dLnNjYWxlKGRjNik7DQorCQkJCQkNCisJCQkJCUludGVncmF0aW9uTGFiZWxWYWx1ZSB5ZXJyb3IgPSAoSW50ZWdyYXRpb25MYWJlbFZhbHVlKSBFY29yZVV0aWwuY29weShfazFbbl0uYWRkKF9rM1tuXSkuYWRkKF9rNFtuXSkuYWRkKF9rNVtuXSkuYWRkKF9rNltuXSkpOw0KKwkJCQkJeWVycm9yLnNjYWxlKGgpOw0KKwkJCQkJDQorCQkJCQl5ZXJyb3IuZGl2aWRlKChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpZGlzZWFzZUxhYmVsLmdldEVycm9yU2NhbGUoKSk7DQorCQkJCQlkb3VibGUgZXJyb3IgPSB5ZXJyb3IubWF4KCk7DQorCQkJCQllcnJvciAvPSByZWxhdGl2ZVRvbGVyYW5jZTsNCisJCQkJCQ0KKwkJCQkJaWYoZXJyb3IgPiBtYXhlcnJvcikgew0KKwkJCQkJCW1heGVycm9yID0gZXJyb3I7DQorCQkJCQl9DQorCQkJCQkNCisJCQkJCWlmKGVycm9yIDw9IDEuMCkgDQorCQkJCQkJZmluYWxFc3RpbWF0ZS5wdXQoZGlzZWFzZUxhYmVsLCANCisJCQkJCQkJKEludGVncmF0aW9uTGFiZWxWYWx1ZSlFY29yZVV0aWwuY29weSh5b3V0KSk7DQorCQkJCX0NCisJCQkJKytuOw0KKwkJCX0NCisJCQkNCisJCQlqb2JzW3RocmVhZG51bV0uaCA9IGg7DQorCQkJam9ic1t0aHJlYWRudW1dLm1heGVycm9yID0gbWF4ZXJyb3I7DQorCQkJdHJ5IHsNCisJCQkJc3RlcFNpemVCYXJyaWVyLmF3YWl0KCk7DQorCQkJfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkvLyBTaG91bGQgbmV2ZXIgaGFwcGVuDQorCQkJCUFjdGl2YXRvci5sb2dFcnJvcihpZS5nZXRNZXNzYWdlKCksIGllKTsNCisJCQl9IGNhdGNoKEJyb2tlbkJhcnJpZXJFeGNlcHRpb24gYmJlKSB7DQorCQkJCS8vIFNob3VsZCBuZXZlciBoYXBwZW4NCisJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKGJiZS5nZXRNZXNzYWdlKCksIGJiZSk7DQorCQkJfQ0KKwkJCQ0KKwkJCS8vIEF0IGxlYXN0IG9uZSBvZiB0aGUgdGhyZWFkcyBoYWQgdG8gbGFyZ2Ugb2YgYW4gZXJyb3IsIGZhaWwNCisJCQlpZih0aGlzLm1heGltdW1FcnJvciA+IDEuMCkNCisJCQkJc3VjY2VzcyA9IGZhbHNlOw0KKwkJCQ0KKwkJCS8vIEFyZSB3ZSBkb25lPw0KKwkJCWlmKHN1Y2Nlc3MpIHsJCQkNCisJCQkJLy8gQ2hlY2sgdG8gbWFrZSBzdXJlDQorCQkJCWlmKHRoaXMuc21hbGxlc3RIID4gaCkNCisJCQkJCUFjdGl2YXRvci5sb2dFcnJvcigiRXJyb3IsIGggd2FzIGxlc3MgdGhhbiB0aGUgc21hbGxlc3QsIHBlcmhhcHMgYmFycmllciBwcm9jZXNzIGZhaWxlZCB0byBleGVjdXRlPyBoOiIraCsiIHZzICIrdGhpcy5zbWFsbGVzdEgsIG5ldyBFeGNlcHRpb24oKSk7DQorCQkJCQ0KKwkJCQkvLyBZZXMsIGh1cnJhaCwgYWR2YW5jZSB4IHVzaW5nIHRoZSBzdGVwIHNpemUgaA0KKwkJCQl4Kz1oOw0KKwkJCQlpZih0aGlzLm1heGltdW1FcnJvciA+IEVSUkNPTikNCisJCQkJCWggPSBTQUZFVFkqaCpNYXRoLnBvdyh0aGlzLm1heGltdW1FcnJvciwgUEdST1cpOw0KKwkJCQllbHNlDQorCQkJCQloID0gNS4wKmg7DQorDQorCQkJCQkNCisJCQkJLy8gTGltaXQgdG8gbWF4IDENCisJCQkJaWYoaCA+IDEuMCkgIGggPSAxLjA7DQorCQkJCQ0KKw0KKwkJCQkJLy8gTWFrZSBzdXJlIHdlIGRvbid0IG92ZXJzaG9vdA0KKwkJCQlpZih4IDwgZW5kICYmIHgraCA+IGVuZCkgaCA9IChlbmQteCk7DQorCQkJCQkNCisJCQkJCQ0KKwkJCQkJLy8gVXBkYXRlIHRoZSBjdXJyZW50IHZhbHVlIHRvIHRoZSBuZXcgcG9zaXRpb24NCisJCQkJZm9yKERlY29yYXRvciBzZG06aURlY29yYXRvcnMpIHsNCisJCQkJCWZvciAoZmluYWwgSXRlcmF0b3I8RHluYW1pY0xhYmVsPiBjdXJyZW50U3RhdGVMYWJlbEl0ZXIgPSBzZG0uZ2V0TGFiZWxzVG9VcGRhdGUodGhyZWFkbnVtLCBudW1fdGhyZWFkcykNCisJCQkJCQkJLml0ZXJhdG9yKCk7IGN1cnJlbnRTdGF0ZUxhYmVsSXRlci5oYXNOZXh0KCk7KSB7DQorCQkJCQkJZmluYWwgSW50ZWdyYXRpb25MYWJlbCBkaXNlYXNlTGFiZWwgPSAoSW50ZWdyYXRpb25MYWJlbCkgY3VycmVudFN0YXRlTGFiZWxJdGVyLm5leHQoKTsNCisJCQkJCQkoKEludGVncmF0aW9uTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuZ2V0VGVtcFZhbHVlKCkpLnNldChmaW5hbEVzdGltYXRlLmdldChkaXNlYXNlTGFiZWwpKTsNCisJCQkJCQkoKEludGVncmF0aW9uTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuZ2V0UHJvYmVWYWx1ZSgpKS5zZXQoZmluYWxFc3RpbWF0ZS5nZXQoZGlzZWFzZUxhYmVsKSk7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJCQ0KKwkJCQkvLyBXYWl0IHVudGlsIGFsbCBvdGhlciB0aHJlYWRzIGhhdmUgdXBkYXRlZCB0aGUgY3VycmVudCB2YWx1ZSANCisJCQkJdHJ5IHsNCisJCQkJCXVwZGF0ZURvbmVCYXJyaWVyLmF3YWl0KCk7DQorCQkJCX0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCS8vIFNob3VsZCBuZXZlciBoYXBwZW4NCisJCQkJCUFjdGl2YXRvci5sb2dFcnJvcihpZS5nZXRNZXNzYWdlKCksIGllKTsNCisJCQkJfSBjYXRjaChCcm9rZW5CYXJyaWVyRXhjZXB0aW9uIGJiZSkgew0KKwkJCQkJLy8gU2hvdWxkIG5ldmVyIGhhcHBlbg0KKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKGJiZS5nZXRNZXNzYWdlKCksIGJiZSk7DQorCQkJCX0NCisJCQkJCQ0KKwkJCQlkb3VibGUgcHJvZ3Jlc3MgPSAoZW5kLXggPCAwLjApPyAxLjA6MS4wLShlbmQteCk7DQorCQkJCWpvYnNbdGhyZWFkbnVtXS5zZXRQcm9ncmVzcyhwcm9ncmVzcyk7DQorCQkJCWlmKHggPiBuZXh0UHJvZ3Jlc3NSZXBvcnQpIHsNCisJCQkJCS8vIEdldCB0aGUgcHJvZ3Jlc3MgZm9yIGFsbCB0aHJlYWRzDQorCQkJCQlmb3IoaW50IGk9MDtpPG51bV90aHJlYWRzOysraSkgaWYoaSE9dGhyZWFkbnVtICYmIGpvYnNbaV0gIT0gbnVsbCkgcHJvZ3Jlc3MrPWpvYnNbaV0uZ2V0UHJvZ3Jlc3MoKTsNCisJCQkJCXByb2dyZXNzIC89IG51bV90aHJlYWRzOw0KKwkJCQkJZm9yKERlY29yYXRvciBzZG06aURlY29yYXRvcnMpIAkJCQkJCQ0KKwkJCQkJCXNkbS5zZXRQcm9ncmVzcyhwcm9ncmVzcyk7DQorCQkJCQluZXh0UHJvZ3Jlc3NSZXBvcnQgKz0gbmV4dFByb2dyZXNzUmVwb3J0U3RlcDsNCisJCQkJfQ0KKwkJCQkJDQorCQkJfSBlbHNlIHsNCisJCQkJLy8gQXQgbGVhc3Qgb25lIHRocmVhZCBmYWlsZWQsIGNoYW5nZSB0aGUgc3RlcCBzaXplDQorCQ0KKwkJCQkvLyBQcm9ibGVtLCBlcnJvciB0b28gYmlnLCB3ZSBuZWVkIHRvIHJlZHVjZSB0aGUgc3RlcCBzaXplDQorCQkJCWRlbHRhID0gU0FGRVRZKmgqTWF0aC5wb3codGhpcy5tYXhpbXVtRXJyb3IsUFNIUk5LKTsNCisgICAgICAgIAkJaWYoaCA+IDAuMCkNCisgICAgICAgIAkJCWggPSAoZGVsdGEgPiAwLjEqaCk/IGRlbHRhOjAuMSpoOw0KKyAgICAgICAgCQllbHNlDQorICAgICAgICAJCQloID0gKGRlbHRhID4gMC4xKmgpPyAwLjEqaDpkZWx0YTsNCisNCisJCQkJLy8gV2UgZGlkbid0IHN1Y2NlZWQuIA0KKyANCisJCQkJLy9SZXNldCB0aGUgZXN0aW1hdGVkIHZhbHVlIGJhY2sgdG8gdGhlIG9yaWdpbmFsLCB0aGUgc3RlcCBzaXplDQorCQkJCS8vIGhhcyBiZWVuIHJlZHVjZWQgc28gd2Ugd2VsbCB0cnkgYWdhaW4uDQorCQkJCS8vIFNldCB0aGUgZXN0aW1hdGVkIHZhbHVlIGJhY2sgdG8gdGhlIGN1cnJlbnQgb3JpZ2luYWwgdmFsdWUNCisgICAgCQkJZm9yKERlY29yYXRvciBzZG06aURlY29yYXRvcnMpIHsNCisgICAgCQkJCWZvciAoZmluYWwgSXRlcmF0b3I8RHluYW1pY0xhYmVsPiBjdXJyZW50U3RhdGVMYWJlbEl0ZXIgPSBzZG0uZ2V0TGFiZWxzVG9VcGRhdGUodGhyZWFkbnVtLCBudW1fdGhyZWFkcykNCisgICAgCQkJCQkJLml0ZXJhdG9yKCk7IGN1cnJlbnRTdGF0ZUxhYmVsSXRlci5oYXNOZXh0KCk7KSB7DQorICAgIAkJCQkJZmluYWwgSW50ZWdyYXRpb25MYWJlbCBkaXNlYXNlTGFiZWwgPSAoSW50ZWdyYXRpb25MYWJlbCkgY3VycmVudFN0YXRlTGFiZWxJdGVyLm5leHQoKTsNCisgICAgCQkJCQkoKEludGVncmF0aW9uTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuZ2V0UHJvYmVWYWx1ZSgpKS5zZXQoKEludGVncmF0aW9uTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuZ2V0VGVtcFZhbHVlKCkpOw0KKyAgICAJCQkJfQ0KKyAgICAJCQl9DQorCQkJfQ0KKwkJfSAvLyBXaGlsZSB4IDwgZW5kDQorCQkNCisJCWpvYnNbdGhyZWFkbnVtXS50ID0geDsNCisJCWpvYnNbdGhyZWFkbnVtXS5oID0gaDsNCisJCQ0KKwkJLy8gUmVtZW1iZXIgdGhlIHN0ZXAgc2l6ZSBhbmQgcG9zaXRpb24gaW4gdGhlIHNvbHZlcg0KKwkJdGhpcy5zZXRTdGVwU2l6ZShoKTsNCisJCXRoaXMuc2V0Q3VycmVudFgoeCk7DQorCQkNCisJCS8vIFdlJ3JlIGRvbmUNCisJCWZvcihEZWNvcmF0b3Igc2RtOmlEZWNvcmF0b3JzKSB7DQorCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxEeW5hbWljTGFiZWw+IGN1cnJlbnRTdGF0ZUxhYmVsSXRlciA9IHNkbS5nZXRMYWJlbHNUb1VwZGF0ZSh0aHJlYWRudW0sIG51bV90aHJlYWRzKQ0KKwkJCQkJLml0ZXJhdG9yKCk7IGN1cnJlbnRTdGF0ZUxhYmVsSXRlci5oYXNOZXh0KCk7KSB7DQorCQkJCWZpbmFsIEludGVncmF0aW9uTGFiZWwgZGlzZWFzZUxhYmVsID0gKEludGVncmF0aW9uTGFiZWwpIGN1cnJlbnRTdGF0ZUxhYmVsSXRlcg0KKwkJCQkubmV4dCgpOw0KKwkJDQorCQkJCS8vIFRoaXMgaXMgdGhlIG5leHQgc3RhdGUgZm9yIHRoZSBsYWJlbA0KKwkJCQlJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgbmV4dFN0YXRlID0gKEludGVncmF0aW9uTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuZ2V0TmV4dFZhbHVlKCk7DQorCQkJCS8vIFRoaXMgaXMgdGhlIG9yaWdpbmFsIGN1cnJlbnQgc3RhdGUgYXQgdGhlIHByZXZpb3VzIGN5Y2xlDQorCQkJCUludGVncmF0aW9uTGFiZWxWYWx1ZSBvcmlnaW5hbFN0YXRlID0gKEludGVncmF0aW9uTGFiZWxWYWx1ZSlkaXNlYXNlTGFiZWwuZ2V0Q3VycmVudFZhbHVlKCk7DQorCQkJCS8vIFRoaXMgaXMgdGhlIGZpbmFsIHZhbHVlIGNhbGN1bGF0ZWQgYXQgcG9zaXRpb24geC4NCisJCQkJSW50ZWdyYXRpb25MYWJlbFZhbHVlIG5ld1ZhbHVlID0gIGZpbmFsRXN0aW1hdGUuZ2V0KGRpc2Vhc2VMYWJlbCk7DQorCQkJCS8vIHggY291bGQgYmUgbGFyZ2VyIHRoYW4gdGhlIHJlcXVlc3RlZCBjeWNsZSwgc28gd2UgZG8gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbg0KKwkJCQkvLyB0byBmaXQgaXQgZXhhY3RseSB0byB0aGUgcmVxdWVzdGVkIGN5Y2xlDQorCQkJCS8vICoqKiBOb3QgbmVlZGVkIHNpbmNlIHdlIGFsd2F5cyBlbmQgZXhhY3RseSBhdCB0aGUgcmVxdWVzdGVkIGN5Y2xlDQorCQkJCS8vYWRqdXN0VmFsdWVzVG9DeWNsZShvcmlnaW5hbFN0YXRlLCBuZXdWYWx1ZSwgeCwgY3ljbGUpOw0KKwkJCQkNCisJCQkJLy8gTmV3IHZhbHVlIGhhcyBiZWVuIG1vZGlmaWVkIGhlcmUgdG8gZml0IHRoZSByZXF1ZXN0ZWQgY3ljbGUNCisJCQkJbmV4dFN0YXRlLnNldChuZXdWYWx1ZSk7DQorCQkJCS8vIERvIGFueSBtb2RlbCBzcGVjaWZpYyB3b3JrIGZvciBpbnN0YW5jZSBhZGQgbm9pc2UNCisJCQkJKChJbnRlZ3JhdGlvbkRlY29yYXRvcilzZG0pLmRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKChMYWJlbFZhbHVlKW5leHRTdGF0ZSk7DQorCQkJCS8vIFRoZSBuZXh0IHZhbHVlIGlzIHZhbGlkIG5vdy4NCisJCQkJZGlzZWFzZUxhYmVsLnNldE5leHRWYWx1ZVZhbGlkKHRydWUpOw0KKwkJCX0NCisJCX0NCisNCisJfQ0KKwkNCisJLyoqDQorCSAqIEFkanVzdCB0aGUgcmV0dXJuZWQgbGFiZWwgc28gdGhhdCBpdCBtYXRjaGVzIHRoZSBleGFjdCB2YWx1ZSBhdCB0aGUgcmVxdWVzdGVkIGN5Y2xlDQorCSAqIGluc3RlYWQgb2YgdGhlIHZhbHVlIGF0IHguIFdlIGRvIHRoaXMgYnkgdXNpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB4IGFuZCB0aGUgY3VycmVudA0KKwkgKiBjeWNsZSB0byBhZGp1c3QgdGhlIGxhYmVsLiBuZXh0VmFsdWVBdFggaXMgbW9kaWZpZWQgYnkgdGhpcyBmdW5jdGlvbg0KKwkgKiANCisJICogQHBhcmFtIGN1cnJlbnRWYWx1ZSBUaGUgY3VycmVudCB2YWx1ZQ0KKwkgKiBAcGFyYW0gbmV4dFZhbHVlQXRYIFRoZSBuZXh0IHZhbHVlIGF0IHBvc2l0aW9uIHgNCisJICogQHBhcmFtIHggQ3VycmVudCBwb3NpdGlvbg0KKwkgKiBAcGFyYW0gY3ljbGUgQ3VycmVudCBjeWNsZQ0KKwkgKi8NCisJdm9pZCBhZGp1c3RWYWx1ZXNUb0N5Y2xlKEludGVncmF0aW9uTGFiZWxWYWx1ZSBjdXJyZW50VmFsdWUsIEludGVncmF0aW9uTGFiZWxWYWx1ZSBuZXh0VmFsdWVBdFgsIGRvdWJsZSB4LCBpbnQgY3ljbGUpIHsNCisJCUludGVncmF0aW9uTGFiZWxWYWx1ZSByZXN1bHQgPSAoSW50ZWdyYXRpb25MYWJlbFZhbHVlKUVjb3JlVXRpbC5jb3B5KGN1cnJlbnRWYWx1ZSk7DQorCQluZXh0VmFsdWVBdFguc3ViKGN1cnJlbnRWYWx1ZSk7IC8vIGRpZmZlcmVuY2UgYmV0d2VlbiBuZXcgdmFsdWUgYW5kIG9sZCBub3cgaW4gbmV4dFZhbHVlQXRYDQorCQluZXh0VmFsdWVBdFguc2NhbGUoMS4wLyh4LWN5Y2xlKzEpKTsNCisJCW5leHRWYWx1ZUF0WC5zZXQocmVzdWx0LmFkZChuZXh0VmFsdWVBdFgpKTsNCisJfQ0KKwkNCisJDQorCQ0KKwkvKioNCisJICogUmVzZXQgdGhlIHNvbHZlcg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIHJlc2V0KCkgew0KKwkJdGhpcy5zZXRTdGVwU2l6ZSgxLjApOw0KKwkJdGhpcy5zZXRDdXJyZW50WCgwLjApOw0KKwkJdGhpcy5zZXRJbml0aWFsaXplZChmYWxzZSk7DQorCX0NCisJDQorCXByb3RlY3RlZCBkb3VibGUgZ2V0U3RlcFNpemUoKSB7DQorCQlyZXR1cm4gc3RlcFNpemU7DQorCX0NCisJDQorCXByb3RlY3RlZCBkb3VibGUgZ2V0Q3VycmVudFgoKSB7DQorCQlyZXR1cm4gY3VycmVudFg7DQorCX0NCisJDQorCXByb3RlY3RlZCB2b2lkIHNldFN0ZXBTaXplKGRvdWJsZSBkKSB7DQorCQlzdGVwU2l6ZSA9IGQ7DQorCX0NCisJDQorCXByb3RlY3RlZCB2b2lkIHNldEN1cnJlbnRYKGRvdWJsZSBkKSB7DQorCQljdXJyZW50WCA9IGQ7DQorCX0NCisJDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KKwkJcmV0dXJuIFJrUGFja2FnZS5MaXRlcmFscy5SVU5HRV9LVVRUQTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBkb3VibGUgZ2V0UmVsYXRpdmVUb2xlcmFuY2UoKSB7DQorCQlyZXR1cm4gcmVsYXRpdmVUb2xlcmFuY2U7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRSZWxhdGl2ZVRvbGVyYW5jZShkb3VibGUgbmV3UmVsYXRpdmVUb2xlcmFuY2UpIHsNCisJCWRvdWJsZSBvbGRSZWxhdGl2ZVRvbGVyYW5jZSA9IHJlbGF0aXZlVG9sZXJhbmNlOw0KKwkJcmVsYXRpdmVUb2xlcmFuY2UgPSBuZXdSZWxhdGl2ZVRvbGVyYW5jZTsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSa1BhY2thZ2UuUlVOR0VfS1VUVEFfX1JFTEFUSVZFX1RPTEVSQU5DRSwgb2xkUmVsYXRpdmVUb2xlcmFuY2UsIHJlbGF0aXZlVG9sZXJhbmNlKSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIFJrUGFja2FnZS5SVU5HRV9LVVRUQV9fUkVMQVRJVkVfVE9MRVJBTkNFOg0KKwkJCQlyZXR1cm4gbmV3IERvdWJsZShnZXRSZWxhdGl2ZVRvbGVyYW5jZSgpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgUmtQYWNrYWdlLlJVTkdFX0tVVFRBX19SRUxBVElWRV9UT0xFUkFOQ0U6DQorCQkJCXNldFJlbGF0aXZlVG9sZXJhbmNlKCgoRG91YmxlKW5ld1ZhbHVlKS5kb3VibGVWYWx1ZSgpKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIFJrUGFja2FnZS5SVU5HRV9LVVRUQV9fUkVMQVRJVkVfVE9MRVJBTkNFOg0KKwkJCQlzZXRSZWxhdGl2ZVRvbGVyYW5jZShSRUxBVElWRV9UT0xFUkFOQ0VfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIFJrUGFja2FnZS5SVU5HRV9LVVRUQV9fUkVMQVRJVkVfVE9MRVJBTkNFOg0KKwkJCQlyZXR1cm4gcmVsYXRpdmVUb2xlcmFuY2UgIT0gUkVMQVRJVkVfVE9MRVJBTkNFX0VERUZBVUxUOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQorDQorCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCisJCXJlc3VsdC5hcHBlbmQoIiAocmVsYXRpdmVUb2xlcmFuY2U6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChyZWxhdGl2ZVRvbGVyYW5jZSk7DQorCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQorCX0NCisNCit9IC8vUnVuZ2VLdXR0YUltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yay9wcm92aWRlci9Sa0VkaXRQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL3Byb3ZpZGVyL1JrRWRpdFBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MGUzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yay9wcm92aWRlci9Sa0VkaXRQbHVnaW4uamF2YQpAQCAtMCwwICsxLDEwNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsucHJvdmlkZXI7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRWNvcmVFZGl0UGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOw0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgUmsgZWRpdCBwbHVnaW4uDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQ0KK3B1YmxpYyBmaW5hbCBjbGFzcyBSa0VkaXRQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4gew0KKwkvKioNCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBSa0VkaXRQbHVnaW4gSU5TVEFOQ0UgPSBuZXcgUmtFZGl0UGx1Z2luKCk7DQorDQorCS8qKg0KKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47DQorDQorCS8qKg0KKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFJrRWRpdFBsdWdpbigpIHsNCisJCXN1cGVyDQorCQkgIChuZXcgUmVzb3VyY2VMb2NhdG9yIFtdIHsNCisJCSAgICAgQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0UsDQorCQkgICAgIEVjb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwNCisJCSAgIH0pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7DQorCQlyZXR1cm4gcGx1Z2luOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsNCisJCXJldHVybiBwbHVnaW47DQorCX0NCisNCisJLyoqDQorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsNCisJCS8qKg0KKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgew0KKwkJCXN1cGVyKCk7DQorDQorCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4NCisJCQkvLw0KKwkJCXBsdWdpbiA9IHRoaXM7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvcHJvdmlkZXIvUmtJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvcHJvdmlkZXIvUmtJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMmI4OGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yay9wcm92aWRlci9Sa0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMDggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLnByb3ZpZGVyOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsudXRpbC5Sa0FkYXB0ZXJGYWN0b3J5Ow0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4NCisgKiBUaGUgYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4NCisgKiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLg0KKyAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUmtJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFJrQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOw0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5IHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCisNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBSa0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgew0KKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsNCisJCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQorCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsNCisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuUnVuZ2VLdXR0YX0gaW5zdGFuY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFJ1bmdlS3V0dGFJdGVtUHJvdmlkZXIgcnVuZ2VLdXR0YUl0ZW1Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuUnVuZ2VLdXR0YX0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUnVuZ2VLdXR0YUFkYXB0ZXIoKSB7DQorCQlpZiAocnVuZ2VLdXR0YUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQorCQkJcnVuZ2VLdXR0YUl0ZW1Qcm92aWRlciA9IG5ldyBSdW5nZUt1dHRhSXRlbVByb3ZpZGVyKHRoaXMpOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIHJ1bmdlS3V0dGFJdGVtUHJvdmlkZXI7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7DQorCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7DQorCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgew0KKwkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgew0KKwkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7DQorCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgew0KKwkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsNCisJCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHx8ICgoKENsYXNzPD8+KXR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7DQorCQkJCXJldHVybiBhZGFwdGVyOw0KKwkJCX0NCisJCX0NCisNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7DQorCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7DQorCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfSBhbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKw0KKwkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsNCisJCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGRpc3Bvc2VzIGFsbCBvZiB0aGUgaXRlbSBwcm92aWRlcnMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkuIA0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCisJCWlmIChydW5nZUt1dHRhSXRlbVByb3ZpZGVyICE9IG51bGwpIHJ1bmdlS3V0dGFJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL3Byb3ZpZGVyL1J1bmdlS3V0dGFJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL3Byb3ZpZGVyL1J1bmdlS3V0dGFJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjgxYmQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvcHJvdmlkZXIvUnVuZ2VLdXR0YUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5wcm92aWRlcjsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5wcm92aWRlci5Tb2x2ZXJJdGVtUHJvdmlkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5Sa1BhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5SdW5nZUt1dHRhOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLlJ1bmdlS3V0dGF9IG9iamVjdC4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgDQorcHVibGljIGNsYXNzIFJ1bmdlS3V0dGFJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBTb2x2ZXJJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBSdW5nZUt1dHRhSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KKw0KKwkJCWFkZFJlbGF0aXZlVG9sZXJhbmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWxhdGl2ZSBUb2xlcmFuY2UgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFJlbGF0aXZlVG9sZXJhbmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9SdW5nZUt1dHRhX3JlbGF0aXZlVG9sZXJhbmNlX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUnVuZ2VLdXR0YV9yZWxhdGl2ZVRvbGVyYW5jZV9mZWF0dXJlIiwgIl9VSV9SdW5nZUt1dHRhX3R5cGUiKSwNCisJCQkJIFJrUGFja2FnZS5MaXRlcmFscy5SVU5HRV9LVVRUQV9fUkVMQVRJVkVfVE9MRVJBTkNFLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlJFQUxfVkFMVUVfSU1BR0UsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgUnVuZ2VLdXR0YS5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUnVuZ2VLdXR0YSIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHRHZW4oT2JqZWN0IG9iamVjdCkgew0KKwkJVVJJIGxhYmVsVmFsdWUgPSAoKFJ1bmdlS3V0dGEpb2JqZWN0KS5nZXRVUkkoKTsNCisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9SdW5nZUt1dHRhX3R5cGUiKSA6DQorCQkJZ2V0U3RyaW5nKCJfVUlfUnVuZ2VLdXR0YV90eXBlIikgKyAiICIgKyBsYWJlbDsNCisJfQ0KKwkNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisNCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSdW5nZUt1dHRhLmNsYXNzKSkgew0KKwkJCWNhc2UgUmtQYWNrYWdlLlJVTkdFX0tVVFRBX19SRUxBVElWRV9UT0xFUkFOQ0U6DQorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KKwkJcmV0dXJuIFJrRWRpdFBsdWdpbi5JTlNUQU5DRTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yay91dGlsL1JrQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL3V0aWwvUmtBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MzA2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yay91dGlsL1JrQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE4OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsudXRpbDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuKjsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuDQorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuUmtQYWNrYWdlDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBSa0FkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgUmtQYWNrYWdlIG1vZGVsUGFja2FnZTsNCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBSa0FkYXB0ZXJGYWN0b3J5KCkgew0KKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7DQorCQkJbW9kZWxQYWNrYWdlID0gUmtQYWNrYWdlLmVJTlNUQU5DRTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Lg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsNCisJCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSANCisJcHJvdGVjdGVkIFJrU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0NCisJCW5ldyBSa1N3aXRjaDxBZGFwdGVyPigpIHsNCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUnVuZ2VLdXR0YShSdW5nZUt1dHRhIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlUnVuZ2VLdXR0YUFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIDxUPiBBZGFwdGVyIGNhc2VDb21wYXJhYmxlKENvbXBhcmFibGU8VD4gb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNvbHZlcihTb2x2ZXIgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVTb2x2ZXJBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOw0KKwkJCX0NCisJCX07DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0Lg0KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7DQorCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsNCisJfQ0KKw0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuUnVuZ2VLdXR0YSA8ZW0+UnVuZ2UgS3V0dGE8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLlJ1bmdlS3V0dGENCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUnVuZ2VLdXR0YUFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLmxhbmcuQ29tcGFyYWJsZSA8ZW0+Q29tcGFyYWJsZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlIDxlbT5JZGVudGlmaWFibGU8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyIDxlbT5Tb2x2ZXI8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU29sdmVyQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30gLy9Sa0FkYXB0ZXJGYWN0b3J5DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvdXRpbC9Sa1N3aXRjaC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvdXRpbC9Sa1N3aXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYjg3ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yay91dGlsL1JrU3dpdGNoLmphdmEKQEAgLTAsMCArMSwxODggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLnV0aWw7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuKjsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuDQorICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQ0KKyAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwNCisgKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdA0KKyAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkNCisgKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwNCisgKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuUmtQYWNrYWdlDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQ0KK3B1YmxpYyBjbGFzcyBSa1N3aXRjaDxUMT4gew0KKwkvKioNCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIFJrUGFja2FnZSBtb2RlbFBhY2thZ2U7DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUmtTd2l0Y2goKSB7DQorCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsNCisJCQltb2RlbFBhY2thZ2UgPSBSa1BhY2thZ2UuZUlOU1RBTkNFOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsNCisJCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7DQorCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsNCisJCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsNCisJCX0NCisJCWVsc2Ugew0KKwkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOw0KKwkJCXJldHVybg0KKwkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPw0KKwkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOg0KKwkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7DQorCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgew0KKwkJCWNhc2UgUmtQYWNrYWdlLlJVTkdFX0tVVFRBOiB7DQorCQkJCVJ1bmdlS3V0dGEgcnVuZ2VLdXR0YSA9IChSdW5nZUt1dHRhKXRoZUVPYmplY3Q7DQorCQkJCVQxIHJlc3VsdCA9IGNhc2VSdW5nZUt1dHRhKHJ1bmdlS3V0dGEpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTb2x2ZXIocnVuZ2VLdXR0YSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShydW5nZUt1dHRhKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShydW5nZUt1dHRhKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SdW5nZSBLdXR0YTwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJ1bmdlIEt1dHRhPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VSdW5nZUt1dHRhKFJ1bmdlS3V0dGEgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgPFQ+IFQxIGNhc2VDb21wYXJhYmxlKENvbXBhcmFibGU8VD4gb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQxIGNhc2VJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNvbHZlcjwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNvbHZlcjwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUMSBjYXNlU29sdmVyKFNvbHZlciBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVDEgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfSAvL1JrU3dpdGNoDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5hdXRvbWF0aWNleHBlcmltZW50Ly5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmF1dG9tYXRpY2V4cGVyaW1lbnQvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDFhNDMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5hdXRvbWF0aWNleHBlcmltZW50Ly5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxjbGFzc3BhdGg+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCis8L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmF1dG9tYXRpY2V4cGVyaW1lbnQvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmF1dG9tYXRpY2V4cGVyaW1lbnQvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhZmYyZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuYXV0b21hdGljZXhwZXJpbWVudC8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxwcm9qZWN0RGVzY3JpcHRpb24+DQorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuYXV0b21hdGljZXhwZXJpbWVudDwvbmFtZT4NCisJPGNvbW1lbnQ+PC9jb21tZW50Pg0KKwk8cHJvamVjdHM+DQorCTwvcHJvamVjdHM+DQorCTxidWlsZFNwZWM+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJPC9idWlsZFNwZWM+DQorCTxuYXR1cmVzPg0KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCisJPC9uYXR1cmVzPg0KKzwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuYXV0b21hdGljZXhwZXJpbWVudC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuYXV0b21hdGljZXhwZXJpbWVudC9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDYyZTMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5hdXRvbWF0aWNleHBlcmltZW50L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMTQgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6IFNURU0gQXV0b21hdGljIEV4cGVyaW1lbnQgVGVzdCBTdWl0ZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5hdXRvbWF0aWNleHBlcmltZW50CitCdW5kbGUtVmVyc2lvbjogMS4wLjEucXVhbGlmaWVyCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCisgb3JnLmp1bml0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLAorIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZSwKKyBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMsCisgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50CitCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5hdXRvbWF0aWNleHBlcmltZW50L2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmF1dG9tYXRpY2V4cGVyaW1lbnQvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWViNmFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5hdXRvbWF0aWNleHBlcmltZW50L2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0IEBACitzb3VyY2UuLiA9IHNyYy8NCitvdXRwdXQuLiA9IGJpbi8NCitiaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KKyAgICAgICAgICAgICAgIC4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmF1dG9tYXRpY2V4cGVyaW1lbnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvYXV0b21hdGljZXhwZXJpbWVudC9BdXRvbWF0aWNFeHBlcmltZW50VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL2F1dG9tYXRpY2V4cGVyaW1lbnQvQXV0b21hdGljRXhwZXJpbWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGNkZmM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL2F1dG9tYXRpY2V4cGVyaW1lbnQvQXV0b21hdGljRXhwZXJpbWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmF1dG9tYXRpY2V4cGVyaW1lbnQ7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KKw0KK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50LkVycm9yQW5hbHlzaXNBbGdvcml0aG07DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuYXV0b21hdGljZXhwZXJpbWVudC5FcnJvckFuYWx5c2lzQWxnb3JpdGhtRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1YTUlSZXNvdXJjZUZhY3RvcnlJbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnRlc3RzLklkZW50aWZpYWJsZVRlc3Q7DQorDQoraW1wb3J0IGF1dG9tYXRpY2V4cGVyaW1lbnQuQXV0b21hdGljRXhwZXJpbWVudDsNCisNCitwdWJsaWMgY2xhc3MgQXV0b21hdGljRXhwZXJpbWVudFRlc3QgDQorCWV4dGVuZHMgSWRlbnRpZmlhYmxlVGVzdCB7DQorCQ0KKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVVUT01BVElDX0VYUEVSSU1FTlRfRklMRSA9ICJEOi9EZXZlbG9wbWVudC9Xb3Jrc3BhY2VzL1NURU0tcnVudGltZS9Jc3JTSVJmbHUvZXhwZXJpbWVudHMvc2FtcGxlLmF1dG9tYXRpY2V4cGVyaW1lbnQiOyAvLyROT04tTkxTLTEkDQorDQorCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsNCisJCVRlc3RSdW5uZXIucnVuKEF1dG9tYXRpY0V4cGVyaW1lbnRUZXN0LmNsYXNzKTsNCisJfQ0KKw0KKwlwdWJsaWMgQXV0b21hdGljRXhwZXJpbWVudFRlc3QoU3RyaW5nIG5hbWUpIHsNCisJCXN1cGVyKG5hbWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEV4cGVyaW1lbnQgdGVzdCBjYXNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jDQorCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBBdXRvbWF0aWNFeHBlcmltZW50IGdldEZpeHR1cmUoKSB7DQorCQlyZXR1cm4gKEF1dG9tYXRpY0V4cGVyaW1lbnQpZml4dHVyZTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIA0KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorCQlzZXRGaXh0dXJlKG51bGwpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50I3VwZGF0ZVNjZW5hcmlvKCkgPGVtPlVwZGF0ZSBTY2VuYXJpbzwvZW0+fScNCisJICogb3BlcmF0aW9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogDQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudCN1cGRhdGVTY2VuYXJpbygpDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwdWJsaWMgdm9pZCB0ZXN0QXV0b21hdGljRXhwZXJpbWVudCgpIA0KKwl7DQorCQlBdXRvbWF0aWNFeHBlcmltZW50IGF1dG9tYXRpY0V4cGVyaW1lbnQgPSBnZXRGaXh0dXJlKCk7DQorCQlhc3NlcnROb3ROdWxsKGF1dG9tYXRpY0V4cGVyaW1lbnQpOw0KKwkJU3RyaW5nIGFsZ29yaXRobU5hbWUgPSBhdXRvbWF0aWNFeHBlcmltZW50LmdldEVycm9yQW5hbHlzaXNBbGdvcml0aG0oKTsNCisJCUVycm9yQW5hbHlzaXNBbGdvcml0aG0gYWxnb3JpdGhtID0gDQorCQkJRXJyb3JBbmFseXNpc0FsZ29yaXRobUZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlRXJyb3JBbmFseXNpc0FsZ29yaXRobShhbGdvcml0aG1OYW1lKTsNCisJCWFzc2VydE5vdE51bGwoYWxnb3JpdGhtKTsNCisJCWFsZ29yaXRobS5pbml0KGF1dG9tYXRpY0V4cGVyaW1lbnQsIGFsZ29yaXRobSk7DQorCQlhbGdvcml0aG0uZXhlY3V0ZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAcmV0dXJuIGFuIHtAbGluayBBdXRvbWF0aWNFeHBlcmltZW50fSBmb3IgdGVzdGluZy4NCisJICovDQorCXB1YmxpYyBzdGF0aWMgQXV0b21hdGljRXhwZXJpbWVudCBjcmVhdGVGaXh0dXJlKCkgew0KKwkJcmV0dXJuIGxvYWRBdXRvbWF0aWNFeHBlcmltZW50KEFVVE9NQVRJQ19FWFBFUklNRU5UX0ZJTEUpOw0KKwl9DQorCQ0KKwlzdGF0aWMgQXV0b21hdGljRXhwZXJpbWVudCBsb2FkQXV0b21hdGljRXhwZXJpbWVudChmaW5hbCBTdHJpbmcgZmlsZW5hbWUpIHsNCisJCWZpbmFsIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOw0KKwkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIioiLCAvLyROT04tTkxTLTEkDQorCQkJCVNURU1YTUlSZXNvdXJjZUZhY3RvcnlJbXBsLklOU1RBTkNFKTsNCisJCXJlc291cmNlU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKS5wdXQoInBsYXRmb3JtIiwgLy8kTk9OLU5MUy0xJA0KKwkJCQlTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbC5JTlNUQU5DRSk7DQorCQlmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKFVSSS5jcmVhdGVGaWxlVVJJKGZpbGVuYW1lKSwgdHJ1ZSk7DQorCQl0cnkgDQorCQl7CQkJDQorCQkJcmVzb3VyY2UubG9hZChudWxsKTsNCisJCX0gDQorCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIA0KKwkJew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9IA0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIA0KKwkJew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCQlBdXRvbWF0aWNFeHBlcmltZW50IHRvUmV0dXJuID0gKEF1dG9tYXRpY0V4cGVyaW1lbnQpcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7DQorCQlyZXR1cm4gdG9SZXR1cm47DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5hdXRvbWF0aWNleHBlcmltZW50L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL2F1dG9tYXRpY2V4cGVyaW1lbnQvTmVsZGVyTWVhZEFsZ29yaXRobVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy9hdXRvbWF0aWNleHBlcmltZW50L05lbGRlck1lYWRBbGdvcml0aG1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmOGExYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuYXV0b21hdGljZXhwZXJpbWVudC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy9hdXRvbWF0aWNleHBlcmltZW50L05lbGRlck1lYWRBbGdvcml0aG1UZXN0LmphdmEKQEAgLTAsMCArMSw1OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmF1dG9tYXRpY2V4cGVyaW1lbnQ7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuQW5hbHlzaXNQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQuTmVsZGVyTWVhZEFsZ29yaXRobTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5hdXRvbWF0aWNleHBlcmltZW50LlNpbXBsZXhGdW5jdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLkVycm9yUmVzdWx0SW1wbDsNCisNCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KKw0KK3B1YmxpYyBjbGFzcyBOZWxkZXJNZWFkQWxnb3JpdGhtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCisNCisJcHVibGljIHZvaWQgdGVzdEV4ZWN1dGUoKSB7DQorCQlOZWxkZXJNZWFkQWxnb3JpdGhtIG5lbGRlciA9IG5ldyBOZWxkZXJNZWFkQWxnb3JpdGhtKCk7DQorCQlkb3VibGVbXSBpbml0U3RhcnQgPSB7IDEuOCwgMS4yIH07DQorCQlkb3VibGVbXSBzdGVwID0geyAwLjUsIDAuNSB9Ow0KKwkJbmVsZGVyLmV4ZWN1dGUobmV3IFNhbXBsZUZ1bmN0aW9uKCksIGluaXRTdGFydCwgc3RlcCwgMC4wMSwgLTEpOw0KKwkJU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHRzOiIpOw0KKwkJU3lzdGVtLm91dC5wcmludGxuKCJNaW5pbXVtIFBhcmFtZXRlcnMgLSAiICsgQXJyYXlzLnRvU3RyaW5nKG5lbGRlci5nZXRNaW5pbXVtUGFyYW1ldGVyc1ZhbHVlcygpKSk7DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1pbmltdW0gRnVuY3Rpb24gVmFsdWUgLSAiICsgbmVsZGVyLmdldE1pbmltdW1GdW5jdGlvblZhbHVlKCkpOw0KKwkJYXNzZXJ0VHJ1ZShNYXRoLnJvdW5kKG5lbGRlci5nZXRNaW5pbXVtUGFyYW1ldGVyc1ZhbHVlcygpWzBdKSA9PSAzKTsNCisJCWFzc2VydFRydWUoTWF0aC5yb3VuZChuZWxkZXIuZ2V0TWluaW11bVBhcmFtZXRlcnNWYWx1ZXMoKVsxXSkgPT0gMik7DQorCQlhc3NlcnRUcnVlKE1hdGgucm91bmQobmVsZGVyLmdldE1pbmltdW1GdW5jdGlvblZhbHVlKCkpID09IC03KTsNCisJfQ0KKwkNCisJY2xhc3MgU2FtcGxlRnVuY3Rpb24gaW1wbGVtZW50cyBTaW1wbGV4RnVuY3Rpb24gew0KKw0KKwkJcHVibGljIEVycm9yUmVzdWx0IGdldFZhbHVlKGRvdWJsZVtdIHBhcmFtZXRlcnMpIHsNCisJCQkvL2YoeCx5KSA9IC00eCArIHheMiAtIHkgLSB4eSArIHleMg0KKwkJCS8vTG9jYWwgbWluaW11bSBmb3IgdGhpcyBmdW5jdGlvbiBpcyAtNyBhdCB4PTMgYW5kIHk9Mg0KKwkJCWRvdWJsZSB4ID0gcGFyYW1ldGVyc1swXTsNCisJCQlkb3VibGUgeSA9IHBhcmFtZXRlcnNbMV07DQorCQkJZG91YmxlIHJlc3VsdCA9IC00ICogeDsNCisJCQlyZXN1bHQgKz0gTWF0aC5wb3coeCwgMik7DQorCQkJcmVzdWx0IC09IHk7DQorCQkJcmVzdWx0IC09IHggKiB5Ow0KKwkJCXJlc3VsdCArPSBNYXRoLnBvdyh5LCAyKTsNCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZ1bmN0aW9uIHZhbHVlIGZvciB4PSIgKyB4ICsgIiwgeT0iICsgeSArICIgaXM6ICIgKyByZXN1bHQpOw0KKwkJCUVycm9yUmVzdWx0IHJlcyA9IEFuYWx5c2lzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QW5hbHlzaXNGYWN0b3J5KCkuY3JlYXRlRXJyb3JSZXN1bHQoKTsNCisJCQlyZXMuc2V0RXJyb3IocmVzdWx0KTsNCisJCQlyZXR1cm4gcmVzOw0KKwkJfQ0KKwkJDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRlODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGUyOWJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGQwY2RmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDY5IEBACisjTW9uIEphbiAyMSAxMjo0NjowMSBFU1QgMjAwOAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyNGZjOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDIzIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcgorQnVuZGxlLUNsYXNzUGF0aDogLgorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi50ZXN0cywKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC50ZXN0cywKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudGVzdHMsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnRlc3RzLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby50ZXN0cywKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLnRlc3RzLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50ZXN0cywKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudGVzdHMudXRpbAorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLAorIG9yZy5qdW5pdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxMTU1OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTQgQEAKKyMgPGNvcHlyaWdodD4KKyMgPC9jb3B5cmlnaHQ+CisjCisjICRJZCQKKworYmluLmluY2x1ZGVzID0gLixcCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgdGVtcC8sXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKKyAgICAgICAgICAgICAgIG5vdGljZS5odG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuCitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YjE5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9lcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwzMjggQEAKKzxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKK3htbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCit4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Cis8bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Cis8bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxsaW5rIHJlbD1GaWxlLUxpc3QKK2hyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgorPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Cis8IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8bzpEb2N1bWVudFByb3BlcnRpZXM+CisgIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+CisgIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KKyAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgorICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgorICA8bzpQYWdlcz40PC9vOlBhZ2VzPgorICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgorICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KKyAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgorICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+CisgIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgorICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgorIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Cis8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8dzpXb3JkRG9jdW1lbnQ+CisgIDx3OlRyYWNrUmV2aXNpb25zLz4KKyA8L3c6V29yZERvY3VtZW50PgorPC94bWw+PCFbZW5kaWZdLS0+Cis8c3R5bGU+Cis8IS0tCisgLyogRm9udCBEZWZpbml0aW9ucyAqLworQGZvbnQtZmFjZQorCXtmb250LWZhbWlseTpUYWhvbWE7CisJcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7CisJbXNvLWZvbnQtY2hhcnNldDowOworCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOworCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOworCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQorIC8qIFN0eWxlIERlZmluaXRpb25zICovCitwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCisJe21zby1zdHlsZS1wYXJlbnQ6IiI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorcAorCXttYXJnaW4tcmlnaHQ6MGluOworCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOworCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOworCW1hcmdpbi1sZWZ0OjBpbjsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0CisJe21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOworCW1hcmdpbjowaW47CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6OC4wcHQ7CisJZm9udC1mYW1pbHk6VGFob21hOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK0BwYWdlIFNlY3Rpb24xCisJe3NpemU6OC41aW4gMTEuMGluOworCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOworCW1zby1oZWFkZXItbWFyZ2luOi41aW47CisJbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKKwltc28tcGFwZXItc291cmNlOjA7fQorZGl2LlNlY3Rpb24xCisJe3BhZ2U6U2VjdGlvbjE7fQorLS0+Cis8L3N0eWxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+CisKKzxkaXYgY2xhc3M9U2VjdGlvbjE+CisKKzxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KKzwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgorVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKK1JFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQorT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2luIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCitkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+CitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2NoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCitzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCitieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKK2lmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCitzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKK1Byb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgord2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQord29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCitlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50CitjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQorb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKK2Rpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCityZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAorYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCitzdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQorZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQorU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cworUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKK3BhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKK2FuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQorY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KK29mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCitieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgordG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bworYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQorUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cworQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKK3RoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAorZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAorbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKK3RvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCitpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCit0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCitkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKK0VhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0CityaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCit0aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgorPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2VmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKK2NvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKK2FuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5CithbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKK2luY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKK2FzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQorc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAorQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQorc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAoraW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQorY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKK2NvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKK2NvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQorb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKK3N1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKK2FjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKK2FuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCitvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKK2xpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCitDb250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgorQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCitjb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCitsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwordGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgorY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKK29mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcworcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCit0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCit0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAorYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKK2luIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAord2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKK3NlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQorb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQorY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKK0FHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCitXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCitNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQorcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKK1Byb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKK0FncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKK2NvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCitlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCitPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKK1RIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKK1RIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCitvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0CitmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQorbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KK2FnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKK290aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQorc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAorc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQorcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKK3JpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKK2NvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50CitTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKK3RoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCit0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCitBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bworc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KKyhpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKK2V4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKK2V4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQorU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgorQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCitBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCitpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KKworPC9kaXY+CisKKzwvYm9keT4KKworPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9ub3RpY2UuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9ub3RpY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFmOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL25vdGljZS5odG1sCkBAIC0wLDAgKzEsNzkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+TWFyY2ggMTcsIDIwMDU8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorICAgCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCisgICAKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUworICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisgICAKKzx1bD4KKwk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4gICAKKyAKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKwk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCQkKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKwk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKKwk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorICAgCis8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjIwY2I1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjYgQEAKKyMvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqCisjICogQ29udHJpYnV0b3JzOgorIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBUbyBjb2RlIGRldmVsb3BlcjoKKyMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKKyMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgorIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQorIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitwbHVnaW5OYW1lID0gU1RFTSBDb3JlIFRlc3QgU3VpdGUKK3Byb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy9oaXN0b3J5L0hpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy9oaXN0b3J5L0hpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmVjNTFiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FkYXB0ZXJzL2hpc3RvcnkvSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8vIEhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbFRlc3QuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLmhpc3Rvcnk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5oaXN0b3J5Lkhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5Lkhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0IHRlc3QgY2FzZSBmb3Ige0BsaW5rIEhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbH0uCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbFRlc3QgZXh0ZW5kcworCQlIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QgeworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgZml4dHVyZSBmb3IgdGVzdGluZworCSAqLworCXB1YmxpYyBIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBjcmVhdGVGaXh0dXJlKCkgeworCQlyZXR1cm4gbmV3IEhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5Lkhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbCgpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCB0YXJnZXQsIE9iamVjdCB0eXBlKSB7CisJCQkJcmV0dXJuIG5ldyBIaXN0b3J5UHJvdmlkZXJBZGFwdGVyKCkgeworCisJCQkJCS8qKgorCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMuaGlzdG9yeS5IaXN0b3J5UHJvdmlkZXJBZGFwdGVyI2dldEFsbEhpc3RvcmljVGltZVZhbHVlcygpCisJCQkJCSAqLworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIFNURU1UaW1lW10gZ2V0QWxsSGlzdG9yaWNUaW1lVmFsdWVzKCkgeworCQkJCQkJcmV0dXJuIHN1cGVyLmdldEFsbEhpc3RvcmljVGltZVZhbHVlcygpOworCQkJCQl9CisKKwkJCQkJLyoqCisJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5oaXN0b3J5Lkhpc3RvcnlQcm92aWRlckFkYXB0ZXIjZ2V0QWxsSGlzdG9yaWNJbnN0YW5jZXMoKQorCQkJCQkgKi8KKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBJZGVudGlmaWFibGVbXSBnZXRBbGxIaXN0b3JpY0luc3RhbmNlcygpIHsKKwkJCQkJCXJldHVybiBzdXBlci5nZXRBbGxIaXN0b3JpY0luc3RhbmNlcygpOworCQkJCQl9CisKKwkJCQkJLyoqCisJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5oaXN0b3J5Lkhpc3RvcnlQcm92aWRlckFkYXB0ZXIjZ2V0RWFybGllc3RDeWNsZU51bWJlcigpCisJCQkJCSAqLworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIGludCBnZXRFYXJsaWVzdEN5Y2xlTnVtYmVyKCkgeworCQkJCQkJcmV0dXJuIHN1cGVyLmdldEVhcmxpZXN0Q3ljbGVOdW1iZXIoKTsKKwkJCQkJfQorCisJCQkJCS8qKgorCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMuaGlzdG9yeS5IaXN0b3J5UHJvdmlkZXJBZGFwdGVyI2dldEVhcmxpZXN0VGltZVZhbHVlKCkKKwkJCQkJICovCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgU1RFTVRpbWUgZ2V0RWFybGllc3RUaW1lVmFsdWUoKSB7CisJCQkJCQlyZXR1cm4gc3VwZXIuZ2V0RWFybGllc3RUaW1lVmFsdWUoKTsKKwkJCQkJfQorCisJCQkJCS8qKgorCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMuaGlzdG9yeS5IaXN0b3J5UHJvdmlkZXJBZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkJCQkJICovCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCQkJCQlyZXR1cm4gc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKTsKKwkJCQkJfQorCQkJCX07CisJCQl9IC8vIGFkYXB0CisJCX07CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKK30gLy8gSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FkYXB0ZXJzL2hpc3RvcnkvSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYWRhcHRlcnMvaGlzdG9yeS9IaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDkzNzcyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FkYXB0ZXJzL2hpc3RvcnkvSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLy8gSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5oaXN0b3J5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgSlVuaXQgdGVzdCBjYXNlIGZvciB7QGxpbmsgSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3Rvcnl9LgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgZmFjdG9yeSB1bmRlciB0ZXN0LiBUaGUgdmFsdWUgaXMgc2V0IGluIHRoZQorCSAqIDxjb2RlPnNldFVwPC9jb2RlPiBtZXRob2Qgb2YgYSBkZXJpdmVkIGNsYXNzLgorCSAqLworCXByb3RlY3RlZCBIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBmaXh0dXJlID0gbnVsbDsKKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnF1YWxpZmllZC1maWVsZC1hY2Nlc3MiKQorCXByaXZhdGUgSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfSAvLyBTcGF0aWFsUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQorCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShmaW5hbCBIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfSAvLyBzZXRGaXh0dXJlCisKKwkvKioKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0SXNGYWN0b3J5Rm9yVHlwZU9iamVjdCgpIHsKKwkJZmluYWwgSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShmaXh0dXJlLmlzRmFjdG9yeUZvclR5cGUoSGlzdG9yeVByb3ZpZGVyLmNsYXNzKSk7CisJfSAvLyB0ZXN0SXNGYWN0b3J5Rm9yVHlwZU9iamVjdAorCit9IC8vIEhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FkYXB0ZXJzL2hpc3RvcnkvSGlzdG9yeVByb3ZpZGVyQWRhcHRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy9oaXN0b3J5L0hpc3RvcnlQcm92aWRlckFkYXB0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBmZmM1MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy9oaXN0b3J5L0hpc3RvcnlQcm92aWRlckFkYXB0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLy8gSGlzdG9yeVByb3ZpZGVyQWRhcHRlclRlc3QuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLmhpc3Rvcnk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBKVW5pdCB0ZXN0IGNhc2UgZm9yIDxjb2RlPkhpc3RvcnlQcm92aWRlckFkYXB0ZXI8L2NvZGU+J3MuIAorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgSGlzdG9yeVByb3ZpZGVyQWRhcHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJLyoqCisJICogVGhpcyBpcyB0aGUgYWRhcHRlciB1bmRlciB0ZXN0LiBUaGUgdmFsdWUgaXMgc2V0IGluIHRoZQorCSAqIDxjb2RlPnNldFVwPC9jb2RlPiBtZXRob2Qgb2YgYSBkZXJpdmVkIGNsYXNzLgorCSAqLworCXByb3RlY3RlZCBIaXN0b3J5UHJvdmlkZXJBZGFwdGVyIGZpeHR1cmUgPSBudWxsOworCisJQFN1cHByZXNzV2FybmluZ3MoInVucXVhbGlmaWVkLWZpZWxkLWFjY2VzcyIpCisJcHJpdmF0ZSBIaXN0b3J5UHJvdmlkZXJBZGFwdGVyIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0gLy8gU3BhdGlhbFByb3ZpZGVyQWRhcHRlckZhY3RvcnkKKworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoZmluYWwgSGlzdG9yeVByb3ZpZGVyQWRhcHRlciBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfSAvLyBzZXRGaXh0dXJlCisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgSGlzdG9yeVByb3ZpZGVyQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCl9CisJICovCisJcHVibGljIHZvaWQgdGVzdElzQWRhcHRlckZvclR5cGUoKSB7CisJCWZpbmFsIEhpc3RvcnlQcm92aWRlckFkYXB0ZXIgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShmaXh0dXJlLmlzQWRhcHRlckZvclR5cGUoSGlzdG9yeVByb3ZpZGVyLmNsYXNzKSk7CisJfSAvLyB0ZXN0SXNBZGFwdGVyRm9yVHlwZQorCit9IC8vIEhpc3RvcnlQcm92aWRlckFkYXB0ZXJUZXN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FkYXB0ZXJzL3RpbWUvVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FkYXB0ZXJzL3RpbWUvVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYTMzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYWRhcHRlcnMvdGltZS9UaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGxUZXN0LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLy8gVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsVGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMudGltZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLnRpbWUuVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBKVW5pdCB0ZXN0IGNhc2UgZm9yIHtAbGluayBUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGx9LgorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGxUZXN0IGV4dGVuZHMKKwkJVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0IHsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGZpeHR1cmUgZm9yIHRlc3RpbmcKKwkgKi8KKwlwdWJsaWMgVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgY3JlYXRlRml4dHVyZSgpIHsKKwkJcmV0dXJuIG5ldyBUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5UaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGwoKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIE9iamVjdCBhZGFwdChmaW5hbCBPYmplY3QgdGFyZ2V0LCBmaW5hbCBPYmplY3QgdHlwZSkgeworCQkJCXJldHVybiBuZXcgVGltZVByb3ZpZGVyQWRhcHRlcigpIHsKKworCQkJCQkvKioKKwkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLmhpc3RvcnkuCisJCQkJCSAqIAlUaW1lUHJvdmlkZXJBZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkJCQkJICovCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKGZpbmFsIE9iamVjdCB0eXBlKSB7CisJCQkJCQlyZXR1cm4gc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKTsKKwkJCQkJfQorCQkJCX07CisJCQl9IC8vIGFkYXB0CisJCX07CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKK30gLy8gVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsVGVzdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy90aW1lL1RpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2FkYXB0ZXJzL3RpbWUvVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxNGIyMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy90aW1lL1RpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8vIFRpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMudGltZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0IHRlc3QgY2FzZSBmb3Ige0BsaW5rIFRpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5fS4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIFRpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdW5kZXIgdGVzdC4gVGhlIHZhbHVlIGlzIHNldCBpbiB0aGUKKwkgKiA8Y29kZT5zZXRVcDwvY29kZT4gbWV0aG9kIG9mIGEgZGVyaXZlZCBjbGFzcy4KKwkgKi8KKwlwcm90ZWN0ZWQgVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZml4dHVyZSA9IG51bGw7CisKKwlwcml2YXRlIFRpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0gLy8gZ2V0Rml4dHVyZQorCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShmaW5hbCBUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfSAvLyBzZXRGaXh0dXJlCisKKwkvKioKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0SXNGYWN0b3J5Rm9yVHlwZU9iamVjdCgpIHsKKwkJZmluYWwgVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShmaXh0dXJlLmlzRmFjdG9yeUZvclR5cGUoVGltZVByb3ZpZGVyLmNsYXNzKSk7CisJfSAvLyB0ZXN0SXNGYWN0b3J5Rm9yVHlwZU9iamVjdAorCit9IC8vIFRpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9hZGFwdGVycy90aW1lL1RpbWVQcm92aWRlckFkYXB0ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYWRhcHRlcnMvdGltZS9UaW1lUHJvdmlkZXJBZGFwdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NjkxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vYWRhcHRlcnMvdGltZS9UaW1lUHJvdmlkZXJBZGFwdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8vIFRpbWVQcm92aWRlckFkYXB0ZXJUZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy50aW1lOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgSlVuaXQgdGVzdCBjYXNlIGZvciB7QGxpbmsgVGltZVByb3ZpZGVyQWRhcHRlcn1zLgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgVGltZVByb3ZpZGVyQWRhcHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJLyoqCisJICogVGhpcyBpcyB0aGUgYWRhcHRlciB1bmRlciB0ZXN0LiBUaGUgdmFsdWUgaXMgc2V0IGluIHRoZQorCSAqIDxjb2RlPnNldFVwPC9jb2RlPiBtZXRob2Qgb2YgYSBkZXJpdmVkIGNsYXNzLgorCSAqLworCXByb3RlY3RlZCBUaW1lUHJvdmlkZXJBZGFwdGVyIGZpeHR1cmUgPSBudWxsOworCisJQFN1cHByZXNzV2FybmluZ3MoInVucXVhbGlmaWVkLWZpZWxkLWFjY2VzcyIpCisJcHJpdmF0ZSBUaW1lUHJvdmlkZXJBZGFwdGVyIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0gLy8gU3BhdGlhbFByb3ZpZGVyQWRhcHRlckZhY3RvcnkKKworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoZmluYWwgVGltZVByb3ZpZGVyQWRhcHRlciBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfSAvLyBzZXRGaXh0dXJlCisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIFRpbWVQcm92aWRlckFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShPYmplY3QpfQorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RJc0FkYXB0ZXJGb3JUeXBlKCkgeworCQlmaW5hbCBUaW1lUHJvdmlkZXJBZGFwdGVyIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoZml4dHVyZS5pc0FkYXB0ZXJGb3JUeXBlKFRpbWVQcm92aWRlci5jbGFzcykpOworCX0gLy8gdGVzdElzQWRhcHRlckZvclR5cGUKKworfSAvLyBUaW1lUHJvdmlkZXJBZGFwdGVyVGVzdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi90ZXN0cy9Db21tb25BbGxUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Rlc3RzL0NvbW1vbkFsbFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNmMTg2YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi90ZXN0cy9Db21tb25BbGxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+Q29tbW9uPC9iPjwvZW0+JyBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQ29tbW9uQWxsVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogQHBhcmFtIGFyZ3MgCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBDb21tb25BbGxUZXN0cygiQ29tbW9uIFRlc3RzIik7CisJCXN1aXRlLmFkZFRlc3QoQ29tbW9uVGVzdHMuc3VpdGUoKSk7CisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBuYW1lIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29tbW9uQWxsVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCit9IC8vQ29tbW9uQWxsVGVzdHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi90ZXN0cy9Db21tb25UZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Rlc3RzL0NvbW1vblRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4YmZhYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi90ZXN0cy9Db21tb25UZXN0cy5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+Y29tbW9uPC9iPjwvZW0+JyBwYWNrYWdlLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDb21tb25UZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gYXJncyAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgQ29tbW9uVGVzdHMoImNvbW1vbiBUZXN0cyIpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRHVibGluQ29yZVRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSWRlbnRpZmlhYmxlSW1wbFRlc3QuY2xhc3MpOworCQlyZXR1cm4gc3VpdGU7CisJfSAvLyBzdWl0ZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gbmFtZSAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbW1vblRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworfSAvL0NvbW1vblRlc3RzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vdGVzdHMvQ29tcGFyYWJsZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi90ZXN0cy9Db21wYXJhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNDU5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vdGVzdHMvQ29tcGFyYWJsZVRlc3QuamF2YQpAQCAtMCwwICsxLDYyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24udGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbXBhcmFibGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wYXJhYmxlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIENvbXBhcmFibGUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wYXJhYmxlPD8+IGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBDb21wYXJhYmxlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb21wYXJhYmxlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIENvbXBhcmFibGUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoQ29tcGFyYWJsZTw/PiBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBDb21wYXJhYmxlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcGFyYWJsZTw/PiBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKK30gLy9Db21wYXJhYmxlVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Rlc3RzL0NvcmVBbGxUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Rlc3RzL0NvcmVBbGxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzljYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vdGVzdHMvQ29yZUFsbFRlc3RzLmphdmEKQEAgLTAsMCArMSw3NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LnRlc3RzLkV4cGVyaW1lbnRUZXN0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudGVzdHMuR3JhcGhUZXN0czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC50ZXN0cy5Nb2RlbFRlc3RzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzLk1vZGlmaWVyVGVzdHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS50ZXN0cy5QcmVkaWNhdGVUZXN0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8udGVzdHMuU2NlbmFyaW9UZXN0czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIudGVzdHMuU2VxdWVuY2VyVGVzdHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci50ZXN0cy5Tb2x2ZXJUZXN0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci50ZXN0cy5UcmlnZ2VyVGVzdHM7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+Q29yZTwvYj48L2VtPicgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENvcmVBbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBDb3JlQWxsVGVzdHMoIkNvcmUgVGVzdHMiKTsgLy8kTk9OLU5MUy0xJAorCQlzdWl0ZS5hZGRUZXN0KENvbW1vblRlc3RzLnN1aXRlKCkpOworCQlzdWl0ZS5hZGRUZXN0KEV4cGVyaW1lbnRUZXN0cy5zdWl0ZSgpKTsKKwkJc3VpdGUuYWRkVGVzdChHcmFwaFRlc3RzLnN1aXRlKCkpOworCQlzdWl0ZS5hZGRUZXN0KE1vZGVsVGVzdHMuc3VpdGUoKSk7CisJCXN1aXRlLmFkZFRlc3QoTW9kaWZpZXJUZXN0cy5zdWl0ZSgpKTsKKwkJc3VpdGUuYWRkVGVzdChQcmVkaWNhdGVUZXN0cy5zdWl0ZSgpKTsKKwkJc3VpdGUuYWRkVGVzdChTY2VuYXJpb1Rlc3RzLnN1aXRlKCkpOworCQlzdWl0ZS5hZGRUZXN0KFNlcXVlbmNlclRlc3RzLnN1aXRlKCkpOworCQlzdWl0ZS5hZGRUZXN0KFRyaWdnZXJUZXN0cy5zdWl0ZSgpKTsKKwkJc3VpdGUuYWRkVGVzdChTb2x2ZXJUZXN0cy5zdWl0ZSgpKTsKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb3JlQWxsVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCit9IC8vQ29yZUFsbFRlc3RzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vdGVzdHMvRG91YmxlVmFsdWVMaXN0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Rlc3RzL0RvdWJsZVZhbHVlTGlzdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmNlOTlmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Rlc3RzL0RvdWJsZVZhbHVlTGlzdFRlc3QuamF2YQpAQCAtMCwwICsxLDk4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24udGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Eb3VibGVWYWx1ZUxpc3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RG91YmxlIFZhbHVlIExpc3Q8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEb3VibGVWYWx1ZUxpc3RUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgRG91YmxlIFZhbHVlIExpc3QgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEb3VibGVWYWx1ZUxpc3QgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKERvdWJsZVZhbHVlTGlzdFRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgRG91YmxlIFZhbHVlIExpc3QgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERvdWJsZVZhbHVlTGlzdFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEb3VibGUgVmFsdWUgTGlzdCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShEb3VibGVWYWx1ZUxpc3QgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRG91YmxlIFZhbHVlIExpc3QgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEb3VibGVWYWx1ZUxpc3QgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG91YmxlVmFsdWVMaXN0KCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworfSAvL0RvdWJsZVZhbHVlTGlzdFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi90ZXN0cy9Eb3VibGVWYWx1ZU1hdHJpeFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi90ZXN0cy9Eb3VibGVWYWx1ZU1hdHJpeFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTQ3NjA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Rlc3RzL0RvdWJsZVZhbHVlTWF0cml4VGVzdC5qYXZhCkBAIC0wLDAgKzEsOTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlTWF0cml4OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvdWJsZSBWYWx1ZSBNYXRyaXg8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEb3VibGVWYWx1ZU1hdHJpeFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBEb3VibGUgVmFsdWUgTWF0cml4IHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRG91YmxlVmFsdWVNYXRyaXggZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKERvdWJsZVZhbHVlTWF0cml4VGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBEb3VibGUgVmFsdWUgTWF0cml4IHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEb3VibGVWYWx1ZU1hdHJpeFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEb3VibGUgVmFsdWUgTWF0cml4IHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKERvdWJsZVZhbHVlTWF0cml4IGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIERvdWJsZSBWYWx1ZSBNYXRyaXggdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEb3VibGVWYWx1ZU1hdHJpeCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEb3VibGVWYWx1ZU1hdHJpeCgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKK30gLy9Eb3VibGVWYWx1ZU1hdHJpeFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi90ZXN0cy9Eb3VibGVWYWx1ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi90ZXN0cy9Eb3VibGVWYWx1ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDBiNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Rlc3RzL0RvdWJsZVZhbHVlVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvdWJsZSBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIERvdWJsZVZhbHVlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIERvdWJsZSBWYWx1ZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIERvdWJsZVZhbHVlIGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihEb3VibGVWYWx1ZVRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgRG91YmxlIFZhbHVlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEb3VibGVWYWx1ZVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEb3VibGUgVmFsdWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoRG91YmxlVmFsdWUgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRG91YmxlIFZhbHVlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRG91YmxlVmFsdWUgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG91YmxlVmFsdWUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCit9IC8vRG91YmxlVmFsdWVUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vdGVzdHMvRHVibGluQ29yZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi90ZXN0cy9EdWJsaW5Db3JlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZTMyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vdGVzdHMvRHVibGluQ29yZVRlc3QuamF2YQpAQCAtMCwwICsxLDMxOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5EdWJsaW5Db3JlSW1wbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnCisgKiA8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSB0ZXN0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI3BvcHVsYXRlKCkgPGVtPlBvcHVsYXRlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIER1YmxpbkNvcmVUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCS8vIFVzZWQgd2hlbiBjb21wYXJpbmcgRGF0ZSBpbnN0YW5jZXMgZm9yIGVxdWFsaXR5LgorCWZpbmFsIGxvbmcgTUlMTElTRUNPTkRfVE9MRVJBTkNFID0gNjAwMDA7CisJCisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgRHVibGluIENvcmUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEdWJsaW5Db3JlIGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NUUklORyA9ICJEdWJsaW4gQ29yZSB0ZXN0IHN0cmluZyI7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBhcmdzCisJICogICAgICAgICAgICA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihEdWJsaW5Db3JlVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBEdWJsaW4gQ29yZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiBDb25zdHJ1Y3RzIGEgbmV3IER1YmxpbiBDb3JlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbgorCSAqIG5hbWUuCisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiAgICAgICAgICAgIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRHVibGluQ29yZVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEdWJsaW4gQ29yZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShEdWJsaW5Db3JlIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIER1YmxpbiBDb3JlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRHVibGluQ29yZSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRHVibGluQ29yZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI3BvcHVsYXRlKCkKKwkgKiA8ZW0+UG9wdWxhdGU8L2VtPn0nIG9wZXJhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZSNwb3B1bGF0ZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB7CisJCWZpbmFsIFN0cmluZyBjb3JyZWN0RGF0ZVN0cmluZyA9IER1YmxpbkNvcmVJbXBsCisJCQkJLmNyZWF0ZUlTTzg2MDFEYXRlU3RyaW5nKENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpKTsKKwkJZmluYWwgRHVibGluQ29yZSBkYyA9IGdldEZpeHR1cmUoKTsKKworCQlmaW5hbCBEdWJsaW5Db3JlIHRlbXBEQyA9IGRjLnBvcHVsYXRlKCk7CisJCWFzc2VydFRydWUodGVtcERDID09IGRjKTsKKworCQlhc3NlcnRUcnVlKGRjLmdldENyZWF0ZWQoKS5lcXVhbHMoY29ycmVjdERhdGVTdHJpbmcpKTsKKwkJYXNzZXJ0VHJ1ZShkYy5nZXRDcmVhdG9yKCkuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5uYW1lIikpKTsKKwl9IC8vIHRlc3RQb3B1bGF0ZQorCisJLyoqCisJICogU2ltcGxlLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRTZXRJZGVudGlmaWVyKCkgeworCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnROdWxsKGRjLmdldElkZW50aWZpZXIoKSk7CisJCWRjLnNldElkZW50aWZpZXIoVEVTVF9TVFJJTkcpOworCQlhc3NlcnRFcXVhbHMoZGMuZ2V0SWRlbnRpZmllcigpLCBURVNUX1NUUklORyk7CisJfSAvLyB0ZXN0R2V0U2V0SWRlbnRpZmllcgorCisJLyoqCisJICogVGVzdCB0aGF0IHNldHRpbmcgdGhlIHZhbGlkIHN0YXJ0IGRhdGUgd29ya3MKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsaWRTdGFydERhdGUoKSB7CisJCWZpbmFsIER1YmxpbkNvcmUgZGMgPSBnZXRGaXh0dXJlKCk7CisJCWZpbmFsIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwkJY2FsZW5kYXIuc2V0KDIwMDYsIENhbGVuZGFyLkpVTkUsIDEpOworCQlmaW5hbCBEYXRlIHN0YXJ0RGF0ZSA9IGNhbGVuZGFyLmdldFRpbWUoKTsKKwkJZGMuc2V0VmFsaWQoc3RhcnREYXRlKTsKKworCQlmaW5hbCBTdHJpbmcgdmFsaWREYXRlc1ZhbHVlID0gZGMuZ2V0VmFsaWQoKTsKKwkJYXNzZXJ0VHJ1ZSh2YWxpZERhdGVzVmFsdWUuZXF1YWxzKFZBTElEX1NUQVJUX0RBVEUpKTsKKwl9IC8vIHRlc3RTZXRWYWxpZFN0YXJ0RGF0ZQorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURfU1RBUlRfREFURV9TVFJJTkcgPSAiMjAwNi0wNi0wMSI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJRF9FTkRfREFURV9TVFJJTkcgPSAiMjAwNi0wNi0wMiI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJRF9TVEFSVF9EQVRFID0gRHVibGluQ29yZUltcGwuU1RBUlQKKwkJCSsgVkFMSURfU1RBUlRfREFURV9TVFJJTkcgKyAiOyI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJRF9TVEFSVF9BTkRfRU5EX0RBVEUgPSBWQUxJRF9TVEFSVF9EQVRFCisJCQkrICIgIiArIER1YmxpbkNvcmVJbXBsLkVORCArIFZBTElEX0VORF9EQVRFX1NUUklORyArICI7IjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEX1NUQVJUX0FORF9CQURfRU5EX0RBVEUgPSBWQUxJRF9TVEFSVF9EQVRFCisJCQkrICIgIiArIER1YmxpbkNvcmVJbXBsLkVORCArICJhZGZzZjIiICsgIjsiOworCisJLyoqCisJICogVGVzdCB0aGF0IHNldHRpbmcgdGhlIHZhbGlkIHN0YXJ0IGFuZCBlbmQgZGF0ZXMgd29ya3MKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsaWRTdGFydEVuZERhdGVzKCkgeworCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisJCWNhbGVuZGFyLnNldCgyMDA2LCBDYWxlbmRhci5KVU5FLCAxKTsKKwkJZmluYWwgRGF0ZSBzdGFydERhdGUgPSBjYWxlbmRhci5nZXRUaW1lKCk7CisJCWNhbGVuZGFyLnNldCgyMDA2LCBDYWxlbmRhci5KVU5FLCAyKTsKKwkJZmluYWwgRGF0ZSBlbmREYXRlID0gY2FsZW5kYXIuZ2V0VGltZSgpOworCQlkYy5zZXRWYWxpZChzdGFydERhdGUsIGVuZERhdGUpOworCisJCWZpbmFsIFN0cmluZyB2YWxpZERhdGVzVmFsdWUgPSBkYy5nZXRWYWxpZCgpOworCQlhc3NlcnRUcnVlKHZhbGlkRGF0ZXNWYWx1ZS5lcXVhbHMoVkFMSURfU1RBUlRfQU5EX0VORF9EQVRFKSk7CisJfSAvLyB0ZXN0U2V0VmFsaWRTdGFydEVuZERhdGVzCisKKwkvKioKKwkgKiBUZXN0IHRoYXQgYSB7QGxpbmsgRGF0ZX0gY2FuIGJlIGNyZWF0ZWQgZnJvbSB0aGUgdmFsdWVzIGluIHRoZSB2YWxpZAorCSAqIGZpZWxkLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWxpZFN0YXJ0RGF0ZSgpIHsKKwkJLy8gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdHdvIGRhdGVzIGNhbiBkaWZmZXIgYnkgYW5kIHN0aWxsIGJlCisJCS8vIGNvbnNpZGVyZWQgImVxdWFsIiBWYWx1ZTogMSBtaW51dGUKKwkJCisKKwkJZmluYWwgRHVibGluQ29yZSBkYyA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgQ2FsZW5kYXIgY2FsZW5kYXIgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworCQljYWxlbmRhci5zZXQoMjAwNiwgQ2FsZW5kYXIuSlVORSwgMSwgMCwgMCwgMCk7CisJCWZpbmFsIERhdGUgc3RhcnREYXRlID0gY2FsZW5kYXIuZ2V0VGltZSgpOworCQljYWxlbmRhci5zZXQoMjAwNiwgQ2FsZW5kYXIuSlVORSwgMiwgMCwgMCwgMCk7CisJCWZpbmFsIERhdGUgZW5kRGF0ZSA9IGNhbGVuZGFyLmdldFRpbWUoKTsKKworCQkvLyBKdXN0IGEgc3RhcnQgZGF0ZSBmb3IgdGhlIHJhbmdlCisJCWRjLnNldFZhbGlkKHN0YXJ0RGF0ZSk7CisJCURhdGUgc3RhcnQgPSBkYy5nZXRWYWxpZFN0YXJ0RGF0ZSgpOworCQlhc3NlcnRUcnVlKE1hdGguYWJzKHN0YXJ0LmdldFRpbWUoKSAtIHN0YXJ0RGF0ZS5nZXRUaW1lKCkpIDwgTUlMTElTRUNPTkRfVE9MRVJBTkNFKTsKKwkJYXNzZXJ0VHJ1ZShkYy5nZXRWYWxpZEVuZERhdGUoKSA9PSBudWxsKTsKKworCQkvLyBBIHN0YXJ0IGFuZCBhbiBlbmQgZGF0ZSBmb3IgdGhlIHJhbmdlCisJCWRjLnNldFZhbGlkKHN0YXJ0RGF0ZSwgZW5kRGF0ZSk7CisJCXN0YXJ0ID0gZGMuZ2V0VmFsaWRTdGFydERhdGUoKTsKKwkJRGF0ZSBlbmQgPSBkYy5nZXRWYWxpZEVuZERhdGUoKTsKKwkJYXNzZXJ0VHJ1ZShNYXRoLmFicyhzdGFydC5nZXRUaW1lKCkgLSBzdGFydERhdGUuZ2V0VGltZSgpKSA8IE1JTExJU0VDT05EX1RPTEVSQU5DRSk7CisJCWFzc2VydFRydWUoTWF0aC5hYnMoZW5kLmdldFRpbWUoKSAtIGVuZERhdGUuZ2V0VGltZSgpKSA8IE1JTExJU0VDT05EX1RPTEVSQU5DRSk7CisKKwkJLy8gTm8gdmFsaWQgdmFsdWUKKwkJZGMuc2V0VmFsaWQoKFN0cmluZykgbnVsbCk7CisJCWFzc2VydFRydWUoZGMuZ2V0VmFsaWRTdGFydERhdGUoKSA9PSBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShkYy5nZXRWYWxpZEVuZERhdGUoKSA9PSBudWxsKTsKKworCQkvLyBHaWJiZXJpc2gKKwkJZGMuc2V0VmFsaWQoImFzZGZhc2QyMyIpOworCQlhc3NlcnRUcnVlKGRjLmdldFZhbGlkU3RhcnREYXRlKCkgPT0gbnVsbCk7CisJCWFzc2VydFRydWUoZGMuZ2V0VmFsaWRFbmREYXRlKCkgPT0gbnVsbCk7CisKKwkJLy8gR2liYmVyaXNoCisJCWRjLnNldFZhbGlkKFZBTElEX1NUQVJUX0FORF9CQURfRU5EX0RBVEUpOworCQlzdGFydCA9IGRjLmdldFZhbGlkU3RhcnREYXRlKCk7CisJCWVuZCA9IGRjLmdldFZhbGlkRW5kRGF0ZSgpOworCQlhc3NlcnRUcnVlKE1hdGguYWJzKHN0YXJ0LmdldFRpbWUoKSAtIHN0YXJ0RGF0ZS5nZXRUaW1lKCkpIDwgTUlMTElTRUNPTkRfVE9MRVJBTkNFKTsKKwkJYXNzZXJ0VHJ1ZShkYy5nZXRWYWxpZEVuZERhdGUoKSA9PSBudWxsKTsKKwl9IC8vIHRlc3RHZXRWYWxpZFN0YXJ0RGF0ZQorCisJLyoqCisJICogVGVzdCB0aGF0IHRoZSB2YWxpZCBkYXRlIHJhbmdlcyBjYW4gYmUgY29tcGFyZWQuCisJICovCisJcHVibGljIHZvaWQgdGVzdElzVmFsaWRCZWZvcmUoKSB7CisJCWZpbmFsIER1YmxpbkNvcmUgZGNZb3VuZ2VyID0gZ2V0Rml4dHVyZSgpOworCisJCWZpbmFsIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwkJY2FsZW5kYXIuc2V0KDIwMDYsIENhbGVuZGFyLkpVTkUsIDEsIDAsIDAsIDApOyAvLyBKdW5lIDEsIDIwMDYKKwkJZmluYWwgRGF0ZSBzdGFydERhdGVZb3VuZ2VyID0gY2FsZW5kYXIuZ2V0VGltZSgpOworCQlkY1lvdW5nZXIuc2V0VmFsaWQoc3RhcnREYXRlWW91bmdlcik7CisKKwkJZmluYWwgRHVibGluQ29yZSBkY09sZGVyID0gKER1YmxpbkNvcmUpIEVjb3JlVXRpbC5jb3B5KGRjWW91bmdlcik7CisJCWNhbGVuZGFyLnNldCgyMDA2LCBDYWxlbmRhci5KVU5FLCAyLCAwLCAwLCAwKTsgLy8gSnVuZSAyLCAyMDA2CisJCWZpbmFsIERhdGUgc3RhcnREYXRlT2xkZXIgPSBjYWxlbmRhci5nZXRUaW1lKCk7CisJCWRjT2xkZXIuc2V0VmFsaWQoc3RhcnREYXRlT2xkZXIpOworCisJCWZpbmFsIER1YmxpbkNvcmUgZGNTYW1lU3RhcnQgPSAoRHVibGluQ29yZSkgRWNvcmVVdGlsLmNvcHkoZGNZb3VuZ2VyKTsKKwkJZGNTYW1lU3RhcnQuc2V0VmFsaWQoc3RhcnREYXRlWW91bmdlcik7CisKKwkJYXNzZXJ0VHJ1ZShkY1lvdW5nZXIuaXNWYWxpZEJlZm9yZShkY09sZGVyKSk7CisJCWFzc2VydEZhbHNlKGRjT2xkZXIuaXNWYWxpZEJlZm9yZShkY1lvdW5nZXIpKTsKKwkJYXNzZXJ0RmFsc2UoZGNZb3VuZ2VyLmlzVmFsaWRCZWZvcmUoZGNTYW1lU3RhcnQpKTsKKworCX0gLy8gdGVzdElzVmFsaWRCZWZvcmUKKworCS8qKgorCSAqIFRlc3QgY29tcHV0aW5nIHRoZSBvdmVybGFwIG9mIHZhbGlkIGRhdGUgcmFuZ2VzLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RDb21wdXRlVmFsaWREYXRlUmFuZ2VPdmVybGFwKCkgeworCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisJCWNhbGVuZGFyLnNldCgyMDA2LCBDYWxlbmRhci5KVU5FLCAxLCAwLCAwLCAwKTsgLy8gSnVuZSAxLCAyMDA2CisJCWZpbmFsIERhdGUganVuMDEwNiA9IGNhbGVuZGFyLmdldFRpbWUoKTsKKwkJY2FsZW5kYXIuc2V0KDIwMDYsIENhbGVuZGFyLkpVTkUsIDMwLCAwLCAwLCAwKTsgLy8gSnVuZSAzMCwgMjAwNgorCQlmaW5hbCBEYXRlIGp1bjMwMDYgPSBjYWxlbmRhci5nZXRUaW1lKCk7CisJCWRjLnNldFZhbGlkKGp1bjAxMDYsanVuMzAwNik7CisKKwkJLy8gT25seSBvdmVyIGxhcHMgc3RhcnQgZGF0ZQorCQlmaW5hbCBEdWJsaW5Db3JlIGRjT3ZlcmxhcFN0YXJ0ID0gKER1YmxpbkNvcmUpIEVjb3JlVXRpbC5jb3B5KGRjKTsKKwkJY2FsZW5kYXIuc2V0KDIwMDYsIENhbGVuZGFyLk1BWSwgMSwgMCwgMCwgMCk7IC8vIE1heSAxLCAyMDA2CisJCWZpbmFsIERhdGUgbWF5MDEwNiA9IGNhbGVuZGFyLmdldFRpbWUoKTsKKwkJY2FsZW5kYXIuc2V0KDIwMDYsIENhbGVuZGFyLkpVTkUsIDE1LCAwLCAwLCAwKTsgLy8gSnVuZSAxNSwgMjAwNgorCQlmaW5hbCBEYXRlIGp1bjE1MDYgPSBjYWxlbmRhci5nZXRUaW1lKCk7CisJCWRjT3ZlcmxhcFN0YXJ0LnNldFZhbGlkKG1heTAxMDYsanVuMTUwNik7CisKKwkJLy8gSW4gYmV0d2Vlbi4uLgorCQlmaW5hbCBEdWJsaW5Db3JlIGRjQmV0d2VlbiA9IChEdWJsaW5Db3JlKSBFY29yZVV0aWwuY29weShkYyk7CisJCWNhbGVuZGFyLnNldCgyMDA2LCBDYWxlbmRhci5KVU5FLCAyLCAwLCAwLCAwKTsgLy8gSnVuZSAyLCAyMDA2CisJCWZpbmFsIERhdGUganVuMDIwNiA9IGNhbGVuZGFyLmdldFRpbWUoKTsKKwkJZGNCZXR3ZWVuLnNldFZhbGlkKGp1bjAyMDYsanVuMTUwNik7CisKKwkJLy8gT25seSBvdmVybGFwcyBlbmQgZGF0ZQorCQlmaW5hbCBEdWJsaW5Db3JlIGRjT3ZlcmxhcEVuZCA9IChEdWJsaW5Db3JlKSBFY29yZVV0aWwuY29weShkYyk7CisJCWNhbGVuZGFyLnNldCgyMDA2LCBDYWxlbmRhci5BVUdVU1QsIDEsIDAsIDAsIDApOyAvLyBBdWd1c3QgMSwgMjAwNgorCQlmaW5hbCBEYXRlIGF1ZzAxMDYgPSBjYWxlbmRhci5nZXRUaW1lKCk7CisJCWRjT3ZlcmxhcEVuZC5zZXRWYWxpZChqdW4wMjA2LGF1ZzAxMDYpOworCisJCS8vIE5vIG92ZXJsYXAKKwkJZmluYWwgRHVibGluQ29yZSBkY05vT3ZlcmxhcCA9IChEdWJsaW5Db3JlKSBFY29yZVV0aWwuY29weShkYyk7CisJCWNhbGVuZGFyLnNldCgyMDA2LCBDYWxlbmRhci5BVUdVU1QsIDMwLCAwLCAwLCAwKTsgLy8gQXVndXN0IDMwLCAyMDA2CisJCWZpbmFsIERhdGUgYXVnMzAwNiA9IGNhbGVuZGFyLmdldFRpbWUoKTsKKwkJZGNOb092ZXJsYXAuc2V0VmFsaWQoYXVnMzAwNixhdWcwMTA2KTsKKworCQlmaW5hbCBEYXRlW10gb3ZlcmxhcFN0YXJ0ID0gZGMuY29tcHV0ZVZhbGlkRGF0ZVJhbmdlT3ZlcmxhcChkY092ZXJsYXBTdGFydCk7CisJCWFzc2VydFRydWUoTWF0aC5hYnMob3ZlcmxhcFN0YXJ0WzBdLmdldFRpbWUoKSAtIGp1bjAxMDYuZ2V0VGltZSgpKSA8IE1JTExJU0VDT05EX1RPTEVSQU5DRSk7CisJCWFzc2VydFRydWUoTWF0aC5hYnMob3ZlcmxhcFN0YXJ0WzFdLmdldFRpbWUoKSAtIGp1bjE1MDYuZ2V0VGltZSgpKSA8IE1JTExJU0VDT05EX1RPTEVSQU5DRSk7CisJCQorCQlmaW5hbCBEYXRlW10gYmV0d2VlbiA9IGRjLmNvbXB1dGVWYWxpZERhdGVSYW5nZU92ZXJsYXAoZGNCZXR3ZWVuKTsKKwkJYXNzZXJ0VHJ1ZShNYXRoLmFicyhiZXR3ZWVuWzBdLmdldFRpbWUoKSAtIGp1bjAyMDYuZ2V0VGltZSgpKSA8IE1JTExJU0VDT05EX1RPTEVSQU5DRSk7CisJCWFzc2VydFRydWUoTWF0aC5hYnMoYmV0d2VlblsxXS5nZXRUaW1lKCkgLSBqdW4xNTA2LmdldFRpbWUoKSkgPCBNSUxMSVNFQ09ORF9UT0xFUkFOQ0UpOworCQkKKwkJZmluYWwgRGF0ZVtdIG92ZXJsYXBFbmQgPSBkYy5jb21wdXRlVmFsaWREYXRlUmFuZ2VPdmVybGFwKGRjT3ZlcmxhcEVuZCk7CisJCWFzc2VydFRydWUoTWF0aC5hYnMob3ZlcmxhcEVuZFswXS5nZXRUaW1lKCkgLSBqdW4wMjA2LmdldFRpbWUoKSkgPCBNSUxMSVNFQ09ORF9UT0xFUkFOQ0UpOworCQlhc3NlcnRUcnVlKE1hdGguYWJzKG92ZXJsYXBFbmRbMV0uZ2V0VGltZSgpIC0ganVuMzAwNi5nZXRUaW1lKCkpIDwgTUlMTElTRUNPTkRfVE9MRVJBTkNFKTsKKwkJCisJCWZpbmFsIERhdGVbXSBub092ZXJsYXBFbmQgPSBkYy5jb21wdXRlVmFsaWREYXRlUmFuZ2VPdmVybGFwKGRjTm9PdmVybGFwKTsKKwkJYXNzZXJ0TnVsbChub092ZXJsYXBFbmQpOworCQkKKwl9IC8vIHRlc3RDb21wdXRlVmFsaWREYXRlUmFuZ2VPdmVybGFwCisKK30gLy8gRHVibGluQ29yZVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi90ZXN0cy9JZGVudGlmaWFibGVGaWx0ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vdGVzdHMvSWRlbnRpZmlhYmxlRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNTQwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vdGVzdHMvSWRlbnRpZmlhYmxlRmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZUZpbHRlcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JZGVudGlmaWFibGUgRmlsdGVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgSWRlbnRpZmlhYmxlRmlsdGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIElkZW50aWZpYWJsZSBGaWx0ZXIgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJZGVudGlmaWFibGVGaWx0ZXIgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKElkZW50aWZpYWJsZUZpbHRlclRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgSWRlbnRpZmlhYmxlIEZpbHRlciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSWRlbnRpZmlhYmxlRmlsdGVyVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIElkZW50aWZpYWJsZSBGaWx0ZXIgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoSWRlbnRpZmlhYmxlRmlsdGVyIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIElkZW50aWZpYWJsZSBGaWx0ZXIgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJZGVudGlmaWFibGVGaWx0ZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWRlbnRpZmlhYmxlRmlsdGVyKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworfSAvL0lkZW50aWZpYWJsZUZpbHRlclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi90ZXN0cy9JZGVudGlmaWFibGVJbXBsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Rlc3RzL0lkZW50aWZpYWJsZUltcGxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyMDNkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi90ZXN0cy9JZGVudGlmaWFibGVJbXBsVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8vIElkZW50aWZpYWJsZUltcGxUZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5JZGVudGlmaWFibGVJbXBsOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIEpVbml0IHRlc3QgZm9yIElkZW50aWZpYWJsZS4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgSWRlbnRpZmlhYmxlSW1wbFRlc3QgZXh0ZW5kcyBJZGVudGlmaWFibGVUZXN0IHsKKworCXB1YmxpYyBzdGF0aWMgVVJJIElERU5USUZJQUJMRV9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSSgiaWRlbnRpZmlhYmxlL2lkZW50aWZpYWJsZUltcGxUZXN0Iik7CisJCisJCisJLyoqCisJICogQHBhcmFtIG5hbWUKKwkgKi8KKwlwdWJsaWMgSWRlbnRpZmlhYmxlSW1wbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWZpbmFsIElkZW50aWZpYWJsZSBpZCA9IG5ldyBJZGVudGlmaWFibGVJbXBsKCkgey8qIG5vdGhpbmcgKi8KKwkJfTsKKwkJaWQuc2V0VVJJKElERU5USUZJQUJMRV9VUkkpOworCQlzZXRGaXh0dXJlKGlkKTsKKwl9IC8vIHNldFVwCisKK30gLy8gSWRlbnRpZmlhYmxlSW1wbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi90ZXN0cy9JZGVudGlmaWFibGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vdGVzdHMvSWRlbnRpZmlhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZjlkNjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vdGVzdHMvSWRlbnRpZmlhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24udGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklkZW50aWZpYWJsZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSB0ZXN0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUjc2FuZSgpIDxlbT5TYW5lPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBJZGVudGlmaWFibGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIFRFU1RfVVJJID0gVVJJLmNyZWF0ZVVSSSgiaHR0cDovL3Rlc3R1cmkiKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBURVNUX1RZUEVfVVJJID0gVVJJCisJCQkuY3JlYXRlVVJJKCJodHRwOi8vdGVzdHR5cGV1cmkiKTsKKworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIElkZW50aWZpYWJsZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElkZW50aWZpYWJsZSBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgSWRlbnRpZmlhYmxlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiAgICAgICAgICAgIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSWRlbnRpZmlhYmxlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIElkZW50aWZpYWJsZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShJZGVudGlmaWFibGUgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgSWRlbnRpZmlhYmxlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSWRlbnRpZmlhYmxlIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlI3NhbmUoKSA8ZW0+U2FuZTwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZSNzYW5lKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTYW5lKCkgeworCQlmaW5hbCBJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGlkZW50aWZpYWJsZS5zYW5lKCkpOworCX0gLy8gdGVzdFNhbmUKKworCS8qKgorCSAqIFRlc3QgdGhhdCB3aGVuIHNldFVSSSBpcyBjYWxsZWQsIGl0IGFsc28gdXBkYXRlcyB0aGUgSWRlbnRpZmllciBvZiB0aGUKKwkgKiBJZGVudGlmaWFibGUncyBEdWJsaW5Db3JlIGluc3RhbmNlLgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdFNldFVSSSgpIHsKKwkJZmluYWwgSWRlbnRpZmlhYmxlIGlkID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gaWQuZ2V0RHVibGluQ29yZSgpOworCisJCWFzc2VydFRydWUoaWQuZ2V0VVJJKCkudG9TdHJpbmcoKS5lcXVhbHMoZGMuZ2V0SWRlbnRpZmllcigpKSk7CisJCWFzc2VydEZhbHNlKFRFU1RfVVJJLnRvU3RyaW5nKCkuZXF1YWxzKGRjLmdldElkZW50aWZpZXIoKSkpOworCQlhc3NlcnRGYWxzZShpZC5nZXRVUkkoKS5lcXVhbHMoVEVTVF9VUkkpKTsKKworCQlpZC5zZXRVUkkoVEVTVF9VUkkpOworCisJCWFzc2VydFRydWUoaWQuZ2V0VVJJKCkudG9TdHJpbmcoKS5lcXVhbHMoZGMuZ2V0SWRlbnRpZmllcigpKSk7CisJCWFzc2VydFRydWUoVEVTVF9VUkkudG9TdHJpbmcoKS5lcXVhbHMoZGMuZ2V0SWRlbnRpZmllcigpKSk7CisJCWFzc2VydFRydWUoaWQuZ2V0VVJJKCkuZXF1YWxzKFRFU1RfVVJJKSk7CisJfSAvLyB0ZXN0U2V0VVJJCisKKwkvKioKKwkgKiBUZXN0IHRoYXQgd2hlbiBzZXRUeXBlVVJJIGlzIGNhbGxlZCwgaXQgYWxzbyB1cGRhdGVzIHRoZSBUeXBlIG9mIHRoZQorCSAqIElkZW50aWZpYWJsZSdzIER1YmxpbkNvcmUgaW5zdGFuY2UuCisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VHlwZVVSSSgpIHsKKwkJZmluYWwgSWRlbnRpZmlhYmxlIGlkID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gaWQuZ2V0RHVibGluQ29yZSgpOworCisJCWFzc2VydFRydWUoaWQuZ2V0VHlwZVVSSSgpLnRvU3RyaW5nKCkuZXF1YWxzKGRjLmdldFR5cGUoKSkpOworCQlhc3NlcnRGYWxzZShURVNUX1RZUEVfVVJJLnRvU3RyaW5nKCkuZXF1YWxzKGRjLmdldFR5cGUoKSkpOworCQlhc3NlcnRGYWxzZShpZC5nZXRUeXBlVVJJKCkuZXF1YWxzKFRFU1RfVFlQRV9VUkkpKTsKKworCQlpZC5zZXRUeXBlVVJJKFRFU1RfVFlQRV9VUkkpOworCisJCWFzc2VydFRydWUoaWQuZ2V0VHlwZVVSSSgpLnRvU3RyaW5nKCkuZXF1YWxzKGRjLmdldFR5cGUoKSkpOworCQlhc3NlcnRUcnVlKFRFU1RfVFlQRV9VUkkudG9TdHJpbmcoKS5lcXVhbHMoZGMuZ2V0VHlwZSgpKSk7CisJCWFzc2VydFRydWUoaWQuZ2V0VHlwZVVSSSgpLmVxdWFscyhURVNUX1RZUEVfVVJJKSk7CisJfSAvLyB0ZXN0U2V0VHlwZVVSSQorfSAvLyBJZGVudGlmaWFibGVUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vdGVzdHMvU3RyaW5nVmFsdWVMaXN0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Rlc3RzL1N0cmluZ1ZhbHVlTGlzdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWQzMzk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Rlc3RzL1N0cmluZ1ZhbHVlTGlzdFRlc3QuamF2YQpAQCAtMCwwICsxLDk4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24udGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZUxpc3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RyaW5nIFZhbHVlIExpc3Q8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpbmdWYWx1ZUxpc3RUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgU3RyaW5nIFZhbHVlIExpc3QgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmdWYWx1ZUxpc3QgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFN0cmluZ1ZhbHVlTGlzdFRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgU3RyaW5nIFZhbHVlIExpc3QgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZ1ZhbHVlTGlzdFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTdHJpbmcgVmFsdWUgTGlzdCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShTdHJpbmdWYWx1ZUxpc3QgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU3RyaW5nIFZhbHVlIExpc3QgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmdWYWx1ZUxpc3QgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3RyaW5nVmFsdWVMaXN0KCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworfSAvL1N0cmluZ1ZhbHVlTGlzdFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi90ZXN0cy9TdHJpbmdWYWx1ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi90ZXN0cy9TdHJpbmdWYWx1ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGQ5YTlkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3Rlc3RzL1N0cmluZ1ZhbHVlVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlN0cmluZ1ZhbHVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0cmluZyBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFN0cmluZ1ZhbHVlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFN0cmluZyBWYWx1ZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZ1ZhbHVlIGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihTdHJpbmdWYWx1ZVRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgU3RyaW5nIFZhbHVlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmdWYWx1ZVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTdHJpbmcgVmFsdWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoU3RyaW5nVmFsdWUgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU3RyaW5nIFZhbHVlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nVmFsdWUgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3RyaW5nVmFsdWUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCit9IC8vU3RyaW5nVmFsdWVUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9leHBlcmltZW50L3Rlc3RzL0V4cGVyaW1lbnRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9leHBlcmltZW50L3Rlc3RzL0V4cGVyaW1lbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiNTNlZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQvdGVzdHMvRXhwZXJpbWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDM4MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24udGVzdHMuSWRlbnRpZmlhYmxlVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlUmFuZ2VNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlU2VxdWVuY2VNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlclJhbmdlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJTZXF1ZW5jZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5SYW5nZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZVJhbmdlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNlcXVlbmNlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlN0cmluZ1NlcXVlbmNlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzLkRvdWJsZVJhbmdlTW9kaWZpZXJUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0cy5JbnRlZ2VyUmFuZ2VNb2RpZmllclRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzLlNURU1UaW1lUmFuZ2VNb2RpZmllclRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzLlN0cmluZ1NlcXVlbmNlTW9kaWZpZXJUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8udGVzdHMuU2NlbmFyaW9UZXN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhwZXJpbWVudDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgdGVzdGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnQjaXNDb21wbGV0ZSgpIDxlbT5Db21wbGV0ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgYXJlIHRlc3RlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50I3VwZGF0ZVNjZW5hcmlvKCkgPGVtPlVwZGF0ZSBTY2VuYXJpbzwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudCNpbml0U2NlbmFyaW8oKSA8ZW0+SW5pdCBTY2VuYXJpbzwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBFeHBlcmltZW50VGVzdCBleHRlbmRzIElkZW50aWZpYWJsZVRlc3QgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIEJTTV9TVEFSVF9WQUxVRSA9IEJvb2xlYW4uVFJVRTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gQlNNX0VORF9WQUxVRSA9IEJvb2xlYW4uRkFMU0U7CisKKwlzdGF0aWMgcHJvdGVjdGVkIFNjZW5hcmlvIGJhc2VTY2VuYXJpbzsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKEV4cGVyaW1lbnRUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IEV4cGVyaW1lbnQgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFeHBlcmltZW50VGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEV4cGVyaW1lbnQgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFeHBlcmltZW50IGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoRXhwZXJpbWVudClmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWJhc2VTY2VuYXJpbyA9IGNyZWF0ZUJhc2VTY2VuYXJpbygpOworCQlzZXRGaXh0dXJlKGNyZWF0ZUZpeHR1cmUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIFRlc3QgdGhhdCB0aGUgZml4dHVyZSBpcyAic2FuZSIKKwkgKiAKKwkgKiBAc2VlIFNhbml0eUNoZWNrZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Rml4dHVyZVNhbml0eSgpIHsKKwkJZmluYWwgU2FuaXR5Q2hlY2tlciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGZpeHR1cmUuc2FuZSgpKTsKKwl9IC8vIHRlc3RGaXh0dXJlU2FuaXR5CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50I2dldE1vZGlmaWNhdGlvblN1bW1hcnkoKSA8ZW0+TW9kaWZpY2F0aW9uIFN1bW1hcnk8L2VtPn0nCisJICogZmVhdHVyZSBnZXR0ZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudCNnZXRNb2RpZmljYXRpb25TdW1tYXJ5KCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRNb2RpZmljYXRpb25TdW1tYXJ5KCkgeworCQlmaW5hbCBFeHBlcmltZW50IGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCUxpc3Q8U3RyaW5nPiBzdW1tYXJ5ID0gZml4dHVyZS5nZXRNb2RpZmljYXRpb25TdW1tYXJ5KCk7CisJCWFzc2VydE5vdE51bGwoc3VtbWFyeSk7CisJCWFzc2VydFRydWUoc3VtbWFyeS5zaXplKCkgPiAwKTsKKwl9IC8vIHRlc3RHZXRNb2RpZmljYXRpb25TdW1tYXJ5CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50I2lzQ29tcGxldGUoKSA8ZW0+Q29tcGxldGU8L2VtPn0nCisJICogZmVhdHVyZSBnZXR0ZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudCNpc0NvbXBsZXRlKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RJc0NvbXBsZXRlKCkgeworCQkvLyBUT0RPIHRlc3RJc0NvbXBsZXRlCisJCWZpbmFsIEV4cGVyaW1lbnQgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0RmFsc2UoZml4dHVyZS5pc0NvbXBsZXRlKCkpOworCX0gLy8gdGVzdElzQ29tcGxldGUKKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnQjdXBkYXRlU2NlbmFyaW8oKSA8ZW0+VXBkYXRlIFNjZW5hcmlvPC9lbT59JworCSAqIG9wZXJhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50I3VwZGF0ZVNjZW5hcmlvKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTY2VuYXJpbygpIHsKKwkJZmluYWwgRXhwZXJpbWVudCBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQl3aGlsZSAoIWZpeHR1cmUuaXNDb21wbGV0ZSgpKSB7CisJCQlmaW5hbCBTY2VuYXJpbyB1cGRhdGVkU2NlbmFyaW8gPSBmaXh0dXJlLnVwZGF0ZVNjZW5hcmlvKCk7CisJCQlhc3NlcnRUcnVlKHVwZGF0ZWRTY2VuYXJpby5zYW5lKCkpOworCQl9IC8vIHdoaWxlICFmaXh0dXJlLmlzQ29tcGxldGUoKQorCX0KKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnQjaW5pdFNjZW5hcmlvKCkgPGVtPkluaXQgU2NlbmFyaW88L2VtPn0nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudCNpbml0U2NlbmFyaW8oKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEluaXRTY2VuYXJpbygpIHsKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIGFuIHtAbGluayBFeHBlcmltZW50fSBmb3IgdGVzdGluZy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEV4cGVyaW1lbnQgY3JlYXRlRml4dHVyZSgpIHsKKwkJZmluYWwgRXhwZXJpbWVudCByZXRWYWx1ZSA9IEV4cGVyaW1lbnRGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVFeHBlcmltZW50KCk7CisJCXJldFZhbHVlLnNldFNjZW5hcmlvKGNyZWF0ZUJhc2VTY2VuYXJpbygpKTsKKwkJcmV0VmFsdWUuZ2V0TW9kaWZpZXJzKCkuYWRkKGNyZWF0ZVJhbmdlTW9kaWZpZXIocmV0VmFsdWUuZ2V0U2NlbmFyaW8oKSkpOworCQkvLyByZXRWYWx1ZS5nZXRNb2RpZmllcnMoKS5hZGQoY3JlYXRlU2VxdWVuY2VNb2RpZmllcihiYXNlU2NlbmFyaW8pKTsKKwkJcmV0VmFsdWUuZ2V0RHVibGluQ29yZSgpLnBvcHVsYXRlKCk7CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJLyoqCisJICogQHBhcmFtIGJhc2VTY2VuYXJpbworCSAqIEByZXR1cm4gYSB7QGxpbmsgTW9kaWZpZXJ9IHRoYXQgY29udGFpbnMge0BsaW5rIFNlcXVlbmNlTW9kaWZpZXJ9cy4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncyh7ICJib3hpbmciLCAidW51c2VkIiB9KQorCXByaXZhdGUgc3RhdGljIE1vZGlmaWVyIGNyZWF0ZVNlcXVlbmNlTW9kaWZpZXIoU2NlbmFyaW8gYmFzZVNjZW5hcmlvKSB7CisJCWZpbmFsIE1vZGlmaWVyIHJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNb2RpZmllcigpOworCisJCS8vIERlc2NlbmQgaW50byB0aGUgU2NlbmFyaW8gbG9va2luZyBmb3Igc29tZXRoaW5nIHdpdGggYSBkb3VibGUgZmllbGQKKwkJZmluYWwgRUxpc3Q8RGVjb3JhdG9yPiBzY2VuYXJpb0RlY29yYXRvcnMgPSBiYXNlU2NlbmFyaW8KKwkJCQkuZ2V0U2NlbmFyaW9EZWNvcmF0b3JzKCk7CisKKwkJZm9yIChEZWNvcmF0b3IgZGVjb3JhdG9yIDogc2NlbmFyaW9EZWNvcmF0b3JzKSB7CisJCQkvLyBMb29rIHRocm91Z2ggdGhlIGF0dHJpYnV0ZXMgaW4gdGhlIGRlY29yYXRvcgorCQkJZm9yIChFQXR0cmlidXRlIGF0dHJpYnV0ZSA6IGRlY29yYXRvci5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpKSB7CisKKwkJCQkvLyBJcyB0aGlzIGEgZG91YmxlPworCQkJCWlmIChhdHRyaWJ1dGUuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5lcXVhbHMoCisJCQkJCQlFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRURPVUJMRSkpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWZpbmFsIERvdWJsZVNlcXVlbmNlTW9kaWZpZXIgZHNtID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCQkJCS5jcmVhdGVEb3VibGVTZXF1ZW5jZU1vZGlmaWVyKCk7CisJCQkJCWRzbS5nZXRTZXF1ZW5jZSgpLmFkZCgKKwkJCQkJCQlEb3VibGVSYW5nZU1vZGlmaWVyVGVzdC5EUk1fU1RBUlRfVkFMVUUpOworCQkJCQlkc20uZ2V0U2VxdWVuY2UoKQorCQkJCQkJCS5hZGQoRG91YmxlUmFuZ2VNb2RpZmllclRlc3QuRFJNX0VORF9WQUxVRSk7CisJCQkJCWRzbS5zZXRFU3RydWN0dXJhbEZlYXR1cmUoYXR0cmlidXRlKTsKKwkJCQkJcmV0VmFsdWUuc2V0VGFyZ2V0VVJJKGRlY29yYXRvci5nZXRVUkkoKSk7CisJCQkJCXJldFZhbHVlLmdldEZlYXR1cmVNb2RpZmllcnMoKS5hZGQoZHNtKTsKKwkJCQl9IC8vIGlmIGRvdWJsZQorCQkJCS8vIElzIHRoaXMgYW4gaW50ZWdlcj8KKwkJCQllbHNlIGlmIChhdHRyaWJ1dGUuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5lcXVhbHMoCisJCQkJCQlFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRUlOVCkpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWZpbmFsIEludGVnZXJTZXF1ZW5jZU1vZGlmaWVyIGlzbSA9IE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCQkuY3JlYXRlSW50ZWdlclNlcXVlbmNlTW9kaWZpZXIoKTsKKwkJCQkJaXNtLmdldFNlcXVlbmNlKCkuYWRkKAorCQkJCQkJCUludGVnZXJSYW5nZU1vZGlmaWVyVGVzdC5JUk1fU1RBUlRfVkFMVUUpOworCQkJCQlpc20uZ2V0U2VxdWVuY2UoKS5hZGQoCisJCQkJCQkJSW50ZWdlclJhbmdlTW9kaWZpZXJUZXN0LklSTV9FTkRfVkFMVUUpOworCQkJCQlpc20uc2V0RVN0cnVjdHVyYWxGZWF0dXJlKGF0dHJpYnV0ZSk7CisJCQkJCXJldFZhbHVlLnNldFRhcmdldFVSSShkZWNvcmF0b3IuZ2V0VVJJKCkpOworCQkJCQlyZXRWYWx1ZS5nZXRGZWF0dXJlTW9kaWZpZXJzKCkuYWRkKGlzbSk7CisJCQkJfSAvLyBpZiBpbnRlZ2VyCisJCQkJLy8gSXMgdGhpcyBhIGJvb2xlYW4/CisJCQkJLy8gZWxzZSBpZiAoYXR0cmlidXRlLmdldEVBdHRyaWJ1dGVUeXBlKCkuZXF1YWxzKAorCQkJCS8vIEVjb3JlUGFja2FnZS5MaXRlcmFscy5FQk9PTEVBTikpIHsKKwkJCQkvLyAvLyBZZXMKKwkJCQkvLyBmaW5hbCBTZXF1ZW5jZU1vZGlmaWVyIGJzbSA9IE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkvLyAuY3JlYXRlU2VxdWVuY2VNb2RpZmllcigpOworCQkJCS8vIGJzbS5nZXRTZXF1ZW5jZSgpLmFkZChCU01fU1RBUlRfVkFMVUUpOworCQkJCS8vIGJzbS5nZXRTZXF1ZW5jZSgpLmFkZChCU01fRU5EX1ZBTFVFKTsKKwkJCQkvLyBic20uc2V0RVN0cnVjdHVyYWxGZWF0dXJlKGF0dHJpYnV0ZSk7CisJCQkJLy8gcmV0VmFsdWUuc2V0VGFyZ2V0VVJJKGRlY29yYXRvci5nZXRVUkkoKSk7CisJCQkJLy8gcmV0VmFsdWUuZ2V0RmVhdHVyZU1vZGlmaWVycygpLmFkZChic20pOworCQkJCS8vIH0gLy8gaWYgYm9vbGVhbgorCQkJCS8vIElzIHRoaXMgYSBTdHJpbmc/CisJCQkJZWxzZSBpZiAoYXR0cmlidXRlLmdldEVBdHRyaWJ1dGVUeXBlKCkuZXF1YWxzKAorCQkJCQkJRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkcpKSB7CisJCQkJCS8vIFllcworCQkJCQlmaW5hbCBTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyIHNzbSA9IE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCQkuY3JlYXRlU3RyaW5nU2VxdWVuY2VNb2RpZmllcigpOworCQkJCQlzc20uZ2V0U2VxdWVuY2UoKS5hZGQoCisJCQkJCQkJU3RyaW5nU2VxdWVuY2VNb2RpZmllclRlc3QuU1RSSU5HX1NUQVJUX1ZBTFVFKTsKKwkJCQkJc3NtLmdldFNlcXVlbmNlKCkuYWRkKAorCQkJCQkJCVN0cmluZ1NlcXVlbmNlTW9kaWZpZXJUZXN0LlNUUklOR19FTkRfVkFMVUUpOworCQkJCQlzc20uc2V0RVN0cnVjdHVyYWxGZWF0dXJlKGF0dHJpYnV0ZSk7CisJCQkJCXJldFZhbHVlLnNldFRhcmdldFVSSShkZWNvcmF0b3IuZ2V0VVJJKCkpOworCQkJCQlyZXRWYWx1ZS5nZXRGZWF0dXJlTW9kaWZpZXJzKCkuYWRkKHNzbSk7CisJCQkJfSAvLyBpZiBTdHJpbmcKKwkJCX0gLy8gZm9yIGVhY2ggRUF0dHJpYnV0ZQorCisJCQkvLyBOb3cgbG9vayB0aHJvdWdoIHRoZSByZWZlcmVuY2VzCisJCQlmb3IgKEVSZWZlcmVuY2UgcmVmZXJlbmNlIDogZGVjb3JhdG9yLmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCkpIHsKKwkJCQlpZiAocmV0VmFsdWUuZ2V0RmVhdHVyZU1vZGlmaWVycygpLnNpemUoKSA+IDApIHsKKwkJCQkJLy8gSXMgdGhpcyBhbiBTVEVNVGltZT8KKwkJCQkJaWYgKHJlZmVyZW5jZS5nZXRFVHlwZSgpLmVxdWFscygKKwkJCQkJCQlNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuU1RFTV9USU1FKSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQlmaW5hbCBTVEVNVGltZVJhbmdlTW9kaWZpZXIgc3RybSA9IE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCQkJLmNyZWF0ZVNURU1UaW1lUmFuZ2VNb2RpZmllcigpOworCQkJCQkJc3RybQorCQkJCQkJCQkuc2V0U3RhcnRWYWx1ZShTVEVNVGltZVJhbmdlTW9kaWZpZXJUZXN0LlNURU1fVElNRV9TVEFSVF9WQUxVRSk7CisJCQkJCQlzdHJtCisJCQkJCQkJCS5zZXRFbmRWYWx1ZShTVEVNVGltZVJhbmdlTW9kaWZpZXJUZXN0LlNURU1fVElNRV9FTkRfVkFMVUUpOworCQkJCQkJc3RybQorCQkJCQkJCQkuc2V0SW5jcmVtZW50KFNURU1UaW1lUmFuZ2VNb2RpZmllclRlc3QuU1RFTV9USU1FX0lOQ1JFTUVOVF9WQUxVRSk7CisJCQkJCQlzdHJtLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShyZWZlcmVuY2UpOworCQkJCQkJcmV0VmFsdWUuZ2V0RmVhdHVyZU1vZGlmaWVycygpLmFkZChzdHJtKTsKKwkJCQkJfSAvLyBpZiBTVEVNVGltZQorCQkJCX0gLy8gZm9yIGVhY2ggRVJlZmVyZW5jZQorCQkJCS8vIERpZCB3ZSBmaW5kIG9uZT8KKwkJCQkvLyBZZXMKKwkJCQlicmVhazsKKwkJCX0gLy8gaWYKKwkJfSAvLyBmb3IgZWFjaCBEZWNvcmF0b3IKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVTZXF1ZW5jZU1vZGlmaWVyCisKKwkvKioKKwkgKiBAcGFyYW0gYmFzZVNjZW5hcmlvCisJICogQHJldHVybiBhIHtAbGluayBNb2RpZmllcn0gdGhhdCBjb250YWlucyB7QGxpbmsgUmFuZ2VNb2RpZmllcn1zLgorCSAqLworCXByaXZhdGUgc3RhdGljIE1vZGlmaWVyIGNyZWF0ZVJhbmdlTW9kaWZpZXIoZmluYWwgU2NlbmFyaW8gYmFzZVNjZW5hcmlvKSB7CisJCWZpbmFsIE1vZGlmaWVyIHJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNb2RpZmllcigpOworCisJCS8vIERlc2NlbmQgaW50byB0aGUgU2NlbmFyaW8gbG9va2luZyBmb3Igc29tZXRoaW5nIHdpdGggYSBkb3VibGUgZmllbGQKKwkJZmluYWwgRUxpc3Q8RGVjb3JhdG9yPiBzY2VuYXJpb0RlY29yYXRvcnMgPSBiYXNlU2NlbmFyaW8KKwkJCQkuZ2V0U2NlbmFyaW9EZWNvcmF0b3JzKCk7CisKKwkJZm9yIChEZWNvcmF0b3IgZGVjb3JhdG9yIDogc2NlbmFyaW9EZWNvcmF0b3JzKSB7CisJCQkvLyBMb29rIHRocm91Z2ggdGhlIGF0dHJpYnV0ZXMgaW4gdGhlIGRlY29yYXRvcgorCQkJZm9yIChFQXR0cmlidXRlIGF0dHJpYnV0ZSA6IGRlY29yYXRvci5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpKSB7CisKKwkJCQkvLyBJcyB0aGlzIGEgZG91YmxlPworCQkJCWlmIChhdHRyaWJ1dGUuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5lcXVhbHMoCisJCQkJCQlFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRURPVUJMRSkpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWZpbmFsIERvdWJsZVJhbmdlTW9kaWZpZXIgZHJtID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCQkJCS5jcmVhdGVEb3VibGVSYW5nZU1vZGlmaWVyKCk7CisJCQkJCWRybS5zZXRTdGFydFZhbHVlKERvdWJsZVJhbmdlTW9kaWZpZXJUZXN0LkRSTV9TVEFSVF9WQUxVRSk7CisJCQkJCWRybS5zZXRFbmRWYWx1ZShEb3VibGVSYW5nZU1vZGlmaWVyVGVzdC5EUk1fRU5EX1ZBTFVFKTsKKwkJCQkJZHJtCisJCQkJCQkJLnNldEluY3JlbWVudChEb3VibGVSYW5nZU1vZGlmaWVyVGVzdC5EUk1fSU5DUkVNRU5UX1ZBTFVFKTsKKwkJCQkJZHJtLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShhdHRyaWJ1dGUpOworCQkJCQlyZXRWYWx1ZS5nZXRGZWF0dXJlTW9kaWZpZXJzKCkuYWRkKGRybSk7CisJCQkJfSAvLyBpZiBkb3VibGUKKwkJCQkvLyBJcyB0aGlzIGFuIGludGVnZXI/CisJCQkJZWxzZSBpZiAoYXR0cmlidXRlLmdldEVBdHRyaWJ1dGVUeXBlKCkuZXF1YWxzKAorCQkJCQkJRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVJTlQpKSB7CisJCQkJCS8vIFllcworCQkJCQlmaW5hbCBJbnRlZ2VyUmFuZ2VNb2RpZmllciBpcm0gPSBNb2RpZmllckZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCQkJLmNyZWF0ZUludGVnZXJSYW5nZU1vZGlmaWVyKCk7CisJCQkJCWlybS5zZXRTdGFydFZhbHVlKEludGVnZXJSYW5nZU1vZGlmaWVyVGVzdC5JUk1fU1RBUlRfVkFMVUUpOworCQkJCQlpcm0uc2V0RW5kVmFsdWUoSW50ZWdlclJhbmdlTW9kaWZpZXJUZXN0LklSTV9FTkRfVkFMVUUpOworCQkJCQlpcm0KKwkJCQkJCQkuc2V0SW5jcmVtZW50KEludGVnZXJSYW5nZU1vZGlmaWVyVGVzdC5JUk1fSU5DUkVNRU5UX1ZBTFVFKTsKKwkJCQkJaXJtLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShhdHRyaWJ1dGUpOworCQkJCQlyZXRWYWx1ZS5nZXRGZWF0dXJlTW9kaWZpZXJzKCkuYWRkKGlybSk7CisJCQkJfSAvLyBpZiBpbnRlZ2VyCisKKwkJCX0gLy8gZm9yIGVhY2ggRUF0dHJpYnV0ZQorCisvLwkJCS8vIE5vdyBsb29rIHRocm91Z2ggdGhlIHJlZmVyZW5jZXMKKy8vCQkJZm9yIChFUmVmZXJlbmNlIHJlZmVyZW5jZSA6IGRlY29yYXRvci5lQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpKSB7CisvLwkJCQkvLyBJcyB0aGlzIGFuIFNURU1UaW1lPworLy8JCQkJaWYgKHJlZmVyZW5jZS5nZXRFVHlwZSgpCisvLwkJCQkJCS5lcXVhbHMoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLlNURU1fVElNRSkpIHsKKy8vCQkJCQkvLyBZZXMKKy8vCQkJCQlmaW5hbCBTVEVNVGltZVJhbmdlTW9kaWZpZXIgc3RybSA9IE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UKKy8vCQkJCQkJCS5jcmVhdGVTVEVNVGltZVJhbmdlTW9kaWZpZXIoKTsKKy8vCQkJCQlzdHJtCisvLwkJCQkJCQkuc2V0U3RhcnRWYWx1ZShTVEVNVGltZVJhbmdlTW9kaWZpZXJUZXN0LlNURU1fVElNRV9TVEFSVF9WQUxVRSk7CisvLwkJCQkJc3RybQorLy8JCQkJCQkJLnNldEVuZFZhbHVlKFNURU1UaW1lUmFuZ2VNb2RpZmllclRlc3QuU1RFTV9USU1FX0VORF9WQUxVRSk7CisvLwkJCQkJc3RybQorLy8JCQkJCQkJLnNldEluY3JlbWVudChTVEVNVGltZVJhbmdlTW9kaWZpZXJUZXN0LlNURU1fVElNRV9JTkNSRU1FTlRfVkFMVUUpOworLy8JCQkJCXN0cm0uc2V0RVN0cnVjdHVyYWxGZWF0dXJlKHJlZmVyZW5jZSk7CisvLwkJCQkJcmV0VmFsdWUuZ2V0RmVhdHVyZU1vZGlmaWVycygpLmFkZChzdHJtKTsKKy8vCQkJCX0gLy8gaWYgU1RFTVRpbWUKKy8vCQkJfSAvLyBmb3IgZWFjaCBFUmVmZXJlbmNlCisJCQkKKwkJCS8vIEFueXRoaW5nPworCQkJaWYgKHJldFZhbHVlLmdldEZlYXR1cmVNb2RpZmllcnMoKS5zaXplKCkgPiAwKSB7CisJCQkJLy8gWWVzCisJCQkJcmV0VmFsdWUuc2V0VGFyZ2V0VVJJKGRlY29yYXRvci5nZXRVUkkoKSk7CisJCQkJYnJlYWs7CisJCQl9IC8vIGlmIAorCQl9IC8vIGZvciBlYWNoIERlY29yYXRvcgorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZVJhbmdlTW9kaWZpZXIKKworCS8qKgorCSAqIEByZXR1cm4gYSBiYXNlIHtAbGluayBTY2VuYXJpb30gZm9yIHRlc3RpbmcKKwkgKi8KKwlzdGF0aWMgU2NlbmFyaW8gY3JlYXRlQmFzZVNjZW5hcmlvKCkgeworCQlyZXR1cm4gU2NlbmFyaW9UZXN0LmNyZWF0ZUZpeHR1cmUoKTsKKwl9CisKK30gLy8gRXhwZXJpbWVudFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQvdGVzdHMvRXhwZXJpbWVudFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9leHBlcmltZW50L3Rlc3RzL0V4cGVyaW1lbnRUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNmQyOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9leHBlcmltZW50L3Rlc3RzL0V4cGVyaW1lbnRUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IHN1aXRlIGZvciB0aGUgJzxlbT48Yj5leHBlcmltZW50PC9iPjwvZW0+JyBwYWNrYWdlLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFeHBlcmltZW50VGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgeworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBFeHBlcmltZW50VGVzdHMoImV4cGVyaW1lbnQgVGVzdHMiKTsgLy8kTk9OLU5MUy0xJAorCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRXhwZXJpbWVudFRlc3QuY2xhc3MpOworCQlyZXR1cm4gc3VpdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4cGVyaW1lbnRUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKK30gLy9FeHBlcmltZW50VGVzdHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL0R5bmFtaWNFZGdlTGFiZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9EeW5hbWljRWRnZUxhYmVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZmQ5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9EeW5hbWljRWRnZUxhYmVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljRWRnZUxhYmVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkR5bmFtaWMgRWRnZSBMYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIER5bmFtaWNFZGdlTGFiZWxUZXN0IGV4dGVuZHMgRHluYW1pY0xhYmVsVGVzdCB7CisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBEeW5hbWljIEVkZ2UgTGFiZWwgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIER5bmFtaWNFZGdlTGFiZWxUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRHluYW1pYyBFZGdlIExhYmVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRHluYW1pY0VkZ2VMYWJlbCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKER5bmFtaWNFZGdlTGFiZWwpZml4dHVyZTsKKwl9CisKK30gLy9EeW5hbWljRWRnZUxhYmVsVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvRHluYW1pY0xhYmVsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvRHluYW1pY0xhYmVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMjNjMDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9EeW5hbWljTGFiZWxUZXN0LmphdmEKQEAgLTAsMCArMSwxMzkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5UZXN0VXRpbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkR5bmFtaWMgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBhcmUgdGVzdGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWwjcmVzZXQoKSA8ZW0+UmVzZXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWwjc3dpdGNoVG9OZXh0VmFsdWUoKSA8ZW0+U3dpdGNoIFRvIE5leHQgVmFsdWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRHluYW1pY0xhYmVsVGVzdCBleHRlbmRzIExhYmVsVGVzdCB7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IER5bmFtaWMgTGFiZWwgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEeW5hbWljTGFiZWxUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRHluYW1pYyBMYWJlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIER5bmFtaWNMYWJlbCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKER5bmFtaWNMYWJlbClmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9IC8vIHNldFVwCisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsI3Jlc2V0KCkgPGVtPlJlc2V0PC9lbT59JworCSAqIG9wZXJhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsI3Jlc2V0KCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RSZXNldCgpIHsKKwkJZmluYWwgRHluYW1pY0xhYmVsIGR5bmFtaWNMYWJlbCA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0RmFsc2UoZHluYW1pY0xhYmVsLmlzTmV4dFZhbHVlVmFsaWQoKSk7CisJCWR5bmFtaWNMYWJlbC5zZXROZXh0VmFsdWVWYWxpZCh0cnVlKTsKKwkJZHluYW1pY0xhYmVsLnJlc2V0KCk7CisJCWFzc2VydEZhbHNlKGR5bmFtaWNMYWJlbC5pc05leHRWYWx1ZVZhbGlkKCkpOworCX0gLy8gdGVzdFJlc2V0CisKKwkvKioKKwkgKiBAcmV0dXJuIGEgRHluYW1pY0xhYmVsCisJICovCisJcHVibGljIER5bmFtaWNMYWJlbCBjcmVhdGVGaXh0dXJlKCkgeworCQlyZXR1cm4gVGVzdFV0aWwuY3JlYXRlRHluYW1pY0xhYmVsKFRlc3RVdGlsCisJCQkJLmNyZWF0ZU5leHRJZGVudGlmaWFibGVUb0xhYmVsVVJJKCkpOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJLyoqCisJICogVGVzdCB0aGUgc2FuaXR5IG9mIHRoZSBmaXh0dXJlCisJICovCisJcHVibGljIHZvaWQgdGVzdFNhbmUoKSB7CisJCWZpbmFsIER5bmFtaWNMYWJlbCBkeW5hbWljTGFiZWwgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoZHluYW1pY0xhYmVsLnNhbmUoKSk7CisJfSAvLyB0ZXN0U2FuZQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbCNzd2l0Y2hUb05leHRWYWx1ZSgpIDxlbT5Td2l0Y2ggVG8gTmV4dCBWYWx1ZTwvZW0+fScKKwkgKiBvcGVyYXRpb24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbCNzd2l0Y2hUb05leHRWYWx1ZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoVG9OZXh0VmFsdWUoKSB7CisJCWZpbmFsIER5bmFtaWNMYWJlbCBkeW5hbWljTGFiZWwgPSBnZXRGaXh0dXJlKCk7CisJCWZpbmFsIExhYmVsVmFsdWUgb2xkQ3VycmVudFZhbHVlID0gZHluYW1pY0xhYmVsLmdldEN1cnJlbnRWYWx1ZSgpOworCQlmaW5hbCBMYWJlbFZhbHVlIG9sZE5leHRWYWx1ZSA9IGR5bmFtaWNMYWJlbC5nZXROZXh0VmFsdWUoKTsKKworCQlhc3NlcnRUcnVlKG9sZEN1cnJlbnRWYWx1ZSAhPSBvbGROZXh0VmFsdWUpOworCQlhc3NlcnRUcnVlKGR5bmFtaWNMYWJlbC5nZXRDdXJyZW50VmFsdWUoKSA9PSBvbGRDdXJyZW50VmFsdWUpOworCQlhc3NlcnRUcnVlKGR5bmFtaWNMYWJlbC5nZXROZXh0VmFsdWUoKSA9PSBvbGROZXh0VmFsdWUpOworCisJCWFzc2VydEZhbHNlKGR5bmFtaWNMYWJlbC5pc05leHRWYWx1ZVZhbGlkKCkpOworCQlkeW5hbWljTGFiZWwuc2V0TmV4dFZhbHVlVmFsaWQodHJ1ZSk7CisJCWFzc2VydFRydWUoZHluYW1pY0xhYmVsLmlzTmV4dFZhbHVlVmFsaWQoKSk7CisKKwkJLy8gSGVyZSdzIHRoZSBiaWcgUyBXIEkgVCBDIEghCisJCWR5bmFtaWNMYWJlbC5zd2l0Y2hUb05leHRWYWx1ZSgpOworCisJCWFzc2VydEZhbHNlKGR5bmFtaWNMYWJlbC5pc05leHRWYWx1ZVZhbGlkKCkpOworCisJCWFzc2VydEZhbHNlKGR5bmFtaWNMYWJlbC5nZXRDdXJyZW50VmFsdWUoKSA9PSBvbGRDdXJyZW50VmFsdWUpOworCQlhc3NlcnRGYWxzZShkeW5hbWljTGFiZWwuZ2V0TmV4dFZhbHVlKCkgPT0gb2xkTmV4dFZhbHVlKTsKKwkJYXNzZXJ0VHJ1ZShkeW5hbWljTGFiZWwuZ2V0Q3VycmVudFZhbHVlKCkgPT0gb2xkTmV4dFZhbHVlKTsKKwkJYXNzZXJ0VHJ1ZShkeW5hbWljTGFiZWwuZ2V0TmV4dFZhbHVlKCkgPT0gb2xkQ3VycmVudFZhbHVlKTsKKworCX0gLy8gdGVzdFN3aXRjaFRvTmV4dFZhbHVlCisKKwkvKioKKwkgKiBUZXN0IHRoZSBEeW5hbWljIExhYmVsIGhhcyB0aGUgcmlnaHQgdHlwZSBVUkkuCisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZVVSSSgpIHsKKwkJZmluYWwgTGFiZWwgbGFiZWwgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUobGFiZWwuZ2V0VHlwZVVSSSgpLmVxdWFscygKKwkJCQlEeW5hbWljTGFiZWwuVVJJX1RZUEVfRFlOQU1JQ19MQUJFTCkpOworCX0gLy8gdGVzdEdldFR5cGVVUkkKKworfSAvLyBEeW5hbWljTGFiZWxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9EeW5hbWljTm9kZUxhYmVsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvRHluYW1pY05vZGVMYWJlbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDJhZGZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvRHluYW1pY05vZGVMYWJlbFRlc3QuamF2YQpAQCAtMCwwICsxLDQ0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY05vZGVMYWJlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EeW5hbWljIE5vZGUgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEeW5hbWljTm9kZUxhYmVsVGVzdCBleHRlbmRzIER5bmFtaWNMYWJlbFRlc3QgeworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgRHluYW1pYyBOb2RlIExhYmVsIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEeW5hbWljTm9kZUxhYmVsVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIER5bmFtaWMgTm9kZSBMYWJlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIER5bmFtaWNOb2RlTGFiZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChEeW5hbWljTm9kZUxhYmVsKWZpeHR1cmU7CisJfQorCit9IC8vRHluYW1pY05vZGVMYWJlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL0VkZ2VMYWJlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL0VkZ2VMYWJlbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTJiNjVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvRWRnZUxhYmVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlTGFiZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWRnZSBMYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEVkZ2VMYWJlbFRlc3QgZXh0ZW5kcyBMYWJlbFRlc3QgeworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgRWRnZSBMYWJlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRnZUxhYmVsVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEVkZ2UgTGFiZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFZGdlTGFiZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChFZGdlTGFiZWwpZml4dHVyZTsKKwl9CisKK30gLy9FZGdlTGFiZWxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9FZGdlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvRWRnZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjIyOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvRWRnZVRlc3QuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvL2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnRlc3RzLklkZW50aWZpYWJsZVRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLlRlc3RVdGlsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWRnZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSB0ZXN0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2UjZ2V0T3RoZXJOb2RlKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlKSA8ZW0+R2V0IE90aGVyIE5vZGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlI2lzRGlyZWN0ZWRBdChvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZSkgPGVtPklzIERpcmVjdGVkIEF0PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEVkZ2VUZXN0IGV4dGVuZHMgSWRlbnRpZmlhYmxlVGVzdCB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihFZGdlVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBFZGdlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGdlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEVkZ2UgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFZGdlIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoRWRnZSlmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9IC8vIHNldFVwCisKKwkvKioKKwkgKiBAcmV0dXJuIGEgc3RhdGljYWxseSBsYWJlbGVkIGVkZ2UKKwkgKi8KKwlwdWJsaWMgRWRnZSBjcmVhdGVGaXh0dXJlKCkgeworCQlmaW5hbCBOb2RlIG5vZGVBID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljYWxseUxhYmVsZWROb2RlKCk7CisJCWZpbmFsIE5vZGUgbm9kZUIgPSBUZXN0VXRpbC5jcmVhdGVTdGF0aWNhbGx5TGFiZWxlZE5vZGUoKTsKKwkJZmluYWwgRWRnZSBlZGdlID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljYWxseUxhYmVsZWRFZGdlKG5vZGVBLmdldFVSSSgpLAorCQkJCW5vZGVCLmdldFVSSSgpKTsKKworCQllZGdlLnNldEEobm9kZUEpOworCQllZGdlLnNldEIobm9kZUIpOworCQlub2RlQS5nZXRFZGdlcygpLmFkZChlZGdlKTsKKwkJbm9kZUIuZ2V0RWRnZXMoKS5hZGQoZWRnZSk7CisKKwkJYXNzZXJ0IGVkZ2Uuc2FuZSgpOworCisJCXJldHVybiBlZGdlOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIFRlc3QgdGhlIHNhbml0eSBvZiB0aGUgZml4dHVyZQorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTYW5lKCkgeworCQlmaW5hbCBFZGdlIGVkZ2UgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoZWRnZS5zYW5lKCkpOworCX0gLy8gdGVzdFNhbmUKKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlI2dldE90aGVyTm9kZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZSkgPGVtPkdldCBPdGhlciBOb2RlPC9lbT59JworCSAqIG9wZXJhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZSNnZXRPdGhlck5vZGUob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGUpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0T3RoZXJOb2RlX19Ob2RlKCkgeworCQlmaW5hbCBFZGdlIGVkZ2UgPSBnZXRGaXh0dXJlKCk7CisJCWZpbmFsIE5vZGUgbm9kZUEgPSBlZGdlLmdldEEoKTsKKwkJZmluYWwgTm9kZSBub2RlQiA9IGVkZ2UuZ2V0QigpOworCisJCWFzc2VydEVxdWFscyhlZGdlLmdldE90aGVyTm9kZShub2RlQiksIG5vZGVBKTsKKwkJYXNzZXJ0RXF1YWxzKGVkZ2UuZ2V0T3RoZXJOb2RlKG5vZGVBKSwgbm9kZUIpOworCX0gLy8gdGVzdEdldE90aGVyTm9kZV9fTm9kZQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2UjaXNEaXJlY3RlZEF0KG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlKSA8ZW0+SXMgRGlyZWN0ZWQgQXQ8L2VtPn0nCisJICogb3BlcmF0aW9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlI2lzRGlyZWN0ZWRBdChvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZSkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RJc0RpcmVjdGVkQXRfX05vZGUoKSB7CisJCWZpbmFsIEVkZ2UgZWRnZSA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgTm9kZSBub2RlQSA9IGVkZ2UuZ2V0QSgpOworCQlmaW5hbCBOb2RlIG5vZGVCID0gZWRnZS5nZXRCKCk7CisKKwkJZWRnZS5zZXREaXJlY3RlZChmYWxzZSk7CisJCWFzc2VydEZhbHNlKGVkZ2UuaXNEaXJlY3RlZCgpKTsKKworCQlhc3NlcnRGYWxzZShlZGdlLmlzRGlyZWN0ZWRBdChub2RlQSkpOworCQlhc3NlcnRGYWxzZShlZGdlLmlzRGlyZWN0ZWRBdChub2RlQikpOworCisJCWVkZ2Uuc2V0RGlyZWN0ZWQodHJ1ZSk7CisJCWFzc2VydFRydWUoZWRnZS5pc0RpcmVjdGVkKCkpOworCisJCWFzc2VydEZhbHNlKGVkZ2UuaXNEaXJlY3RlZEF0KG5vZGVBKSk7CisJCWFzc2VydFRydWUoZWRnZS5pc0RpcmVjdGVkQXQobm9kZUIpKTsKKworCX0gLy8gdGVzdElzRGlyZWN0ZWRBdF9fTm9kZQorCisJLyoqCisJICogVGVzdCB0aGUgRWRnZSBoYXMgdGhlIHJpZ2h0IHR5cGUgVVJJLgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldFR5cGVVUkkoKSB7CisJCWZpbmFsIEVkZ2UgZWRnZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShlZGdlLmdldFR5cGVVUkkoKS5lcXVhbHMoU1RFTVVSSS5FREdFX1RZUEVfVVJJKSk7CisJfSAvLyB0ZXN0R2V0VHlwZVVSSQorCit9IC8vIEVkZ2VUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9HcmFwaEFsbFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9HcmFwaEFsbFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwZjhmNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL0dyYXBoQWxsVGVzdHMuamF2YQpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3Qgc3VpdGUgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR3JhcGhBbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBHcmFwaEFsbFRlc3RzKCJHcmFwaCBUZXN0cyIpOworCQlzdWl0ZS5hZGRUZXN0KEdyYXBoVGVzdHMuc3VpdGUoKSk7CisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR3JhcGhBbGxUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKK30gLy9HcmFwaEFsbFRlc3RzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9HcmFwaFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL0dyYXBoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNmExMDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9HcmFwaFRlc3QuamF2YQpAQCAtMCwwICsxLDg1NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5VdGlsaXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24udGVzdHMuSWRlbnRpZmlhYmxlVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRWRnZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuR3JhcGhEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLlRlc3RVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLkRlY29yYXRvcnNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RFZGdlRGVjb3JhdG9yMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5UZXN0R3JhcGhEZWNvcmF0b3IxOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3ROb2RlRGVjb3JhdG9yMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RJbnRlZ2VyTGFiZWxWYWx1ZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnCisgKiA8ZW0+PGI+R3JhcGg8L2I+PC9lbT4nLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgdGVzdGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNnZXROdW1FZGdlcygpIDxlbT5OdW0gRWRnZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNnZXROdW1Ob2RlcygpIDxlbT5OdW0gTm9kZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNnZXROdW1HcmFwaExhYmVscygpIDxlbT5OdW0gR3JhcGggTGFiZWxzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0TnVtTm9kZUxhYmVscygpIDxlbT5OdW0gTm9kZSBMYWJlbHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNnZXROdW1EeW5hbWljTGFiZWxzKCkgPGVtPk51bSBEeW5hbWljIExhYmVsczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgYXJlIHRlc3RlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0Tm9kZUxhYmVsc0J5VHlwZVVSSShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKSA8ZW0+R2V0IE5vZGUgTGFiZWxzIEJ5IFR5cGUgVVJJPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjYWRkR3JhcGgob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoLCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZUZpbHRlcikgPGVtPkFkZCBHcmFwaDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI3B1dEVkZ2Uob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2UpIDxlbT5QdXQgRWRnZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldEVkZ2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkgPGVtPkdldCBFZGdlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjcHV0Tm9kZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZSkgPGVtPlB1dCBOb2RlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0Tm9kZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKSA8ZW0+R2V0IE5vZGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNwdXROb2RlTGFiZWwob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbCkgPGVtPlB1dCBOb2RlIExhYmVsPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0Tm9kZUxhYmVsKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpIDxlbT5HZXQgTm9kZSBMYWJlbDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI3B1dEdyYXBoTGFiZWwob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsKSA8ZW0+UHV0IEdyYXBoIExhYmVsPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0R3JhcGhMYWJlbChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKSA8ZW0+R2V0IEdyYXBoIExhYmVsPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjYWRkRHluYW1pY0xhYmVsKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWwpIDxlbT5BZGQgRHluYW1pYyBMYWJlbDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI3N3aXRjaFRvTmV4dFZhbHVlKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSkgPGVtPlN3aXRjaCBUbyBOZXh0IFZhbHVlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEdyYXBoVGVzdCBleHRlbmRzIElkZW50aWZpYWJsZVRlc3QgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU1RFTVRpbWUgU1dJVENIX1RJTUUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCisJCQkuY3JlYXRlU1RFTVRpbWUoKTsKKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVVJJIEdSQVBIMV9VUkkgPSBTVEVNVVJJCisJCQkuY3JlYXRlVVJJKCJncmFwaC90ZXN0Z3JhcGgxIik7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVSSSBHUkFQSDJfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoImdyYXBoL2cyIik7CisKKwkvLyBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGdyYXBoICgibWFpbiIpIHRvIGJlIGFkZGVkIHRvCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BSU5fTlVNX0RZTkFNSUNfRURHRV9MQUJFTFMgPSAxOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BSU5fTlVNX1NUQVRJQ19FREdFX0xBQkVMUyA9IDE7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFJTl9OVU1fRFlOQU1JQ19HUkFQSF9MQUJFTFMgPSAxOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BSU5fTlVNX1NUQVRJQ19HUkFQSF9MQUJFTFMgPSAxOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BSU5fTlVNX1NUQVRJQ19OT0RFX0xBQkVMUyA9IDI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFJTl9OVU1fRFlOQU1JQ19OT0RFX0xBQkVMUyA9IDIgKiBNQUlOX05VTV9EWU5BTUlDX0VER0VfTEFCRUxTOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BSU5fTlVNX0VER0VTID0gTUFJTl9OVU1fRFlOQU1JQ19FREdFX0xBQkVMUworCQkJKyBNQUlOX05VTV9TVEFUSUNfRURHRV9MQUJFTFM7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFJTl9OVU1fTk9ERVMgPSAyICogTUFJTl9OVU1fRURHRVM7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFJTl9OVU1fTk9ERV9MQUJFTFMgPSBNQUlOX05VTV9TVEFUSUNfTk9ERV9MQUJFTFMKKwkJCSsgTUFJTl9OVU1fRFlOQU1JQ19OT0RFX0xBQkVMUzsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQUlOX05VTV9HUkFQSF9MQUJFTFMgPSBNQUlOX05VTV9EWU5BTUlDX0dSQVBIX0xBQkVMUworCQkJKyBNQUlOX05VTV9TVEFUSUNfR1JBUEhfTEFCRUxTOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BSU5fTlVNX0RZTkFNSUNfTEFCRUxTID0gTUFJTl9OVU1fRFlOQU1JQ19HUkFQSF9MQUJFTFMKKwkJCSsgTUFJTl9OVU1fRFlOQU1JQ19FREdFX0xBQkVMUyArIE1BSU5fTlVNX0RZTkFNSUNfTk9ERV9MQUJFTFM7CisKKwkvLyBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGdyYXBoICgiYWRkIikgdG8gYmUgYWRkZWQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREX05VTV9EWU5BTUlDX0VER0VfTEFCRUxTID0gMjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERfTlVNX1NUQVRJQ19FREdFX0xBQkVMUyA9IDM7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREX05VTV9TVEFUSUNfR1JBUEhfTEFCRUxTID0gMzsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERfTlVNX0RZTkFNSUNfR1JBUEhfTEFCRUxTID0gMjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERfTlVNX1NUQVRJQ19OT0RFX0xBQkVMUyA9IDIgKiBBRERfTlVNX1NUQVRJQ19FREdFX0xBQkVMUzsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERfTlVNX0RZTkFNSUNfTk9ERV9MQUJFTFMgPSAyICogQUREX05VTV9EWU5BTUlDX0VER0VfTEFCRUxTOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERF9OVU1fRURHRVMgPSBBRERfTlVNX0RZTkFNSUNfRURHRV9MQUJFTFMKKwkJCSsgQUREX05VTV9TVEFUSUNfRURHRV9MQUJFTFM7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREX05VTV9OT0RFUyA9IDIgKiBBRERfTlVNX0VER0VTOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERF9OVU1fTk9ERV9MQUJFTFMgPSBBRERfTlVNX1NUQVRJQ19OT0RFX0xBQkVMUworCQkJKyBBRERfTlVNX0RZTkFNSUNfTk9ERV9MQUJFTFM7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREX05VTV9HUkFQSF9MQUJFTFMgPSBBRERfTlVNX0RZTkFNSUNfR1JBUEhfTEFCRUxTCisJCQkrIEFERF9OVU1fU1RBVElDX0dSQVBIX0xBQkVMUzsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERfTlVNX0RZTkFNSUNfTEFCRUxTID0gQUREX05VTV9EWU5BTUlDX0dSQVBIX0xBQkVMUworCQkJKyBBRERfTlVNX0RZTkFNSUNfRURHRV9MQUJFTFMgKyBBRERfTlVNX0RZTkFNSUNfTk9ERV9MQUJFTFM7CisKKwkvLyBSZXN1bHRzIGFmdGVyIHRoZSAiYWRkR3JhcGgiIG9wZXJhdGlvbgorCisJLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9OVU1fU1RBVElDX05PREVfTEFCRUxTID0gMDsKKworCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfTlVNX0RZTkFNSUNfTk9ERV9MQUJFTFMgPQorCS8vIE1BSU5fTlVNX0RZTkFNSUNfTk9ERV9MQUJFTFMKKwkvLyArIEFERF9OVU1fRFlOQU1JQ19OT0RFX0xBQkVMUzsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfTlVNX05PREVTID0gTUFJTl9OVU1fTk9ERVMgKyBBRERfTlVNX05PREVTOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9OVU1fRURHRVMgPSBNQUlOX05VTV9FREdFUyArIEFERF9OVU1fRURHRVM7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX05VTV9OT0RFX0xBQkVMUyA9IE1BSU5fTlVNX05PREVfTEFCRUxTCisJCQkrIEFERF9OVU1fTk9ERV9MQUJFTFM7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX05VTV9HUkFQSF9MQUJFTFMgPSBNQUlOX05VTV9HUkFQSF9MQUJFTFMKKwkJCSsgQUREX05VTV9HUkFQSF9MQUJFTFM7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX05VTV9EWU5BTUlDX0xBQkVMUyA9IE1BSU5fTlVNX0RZTkFNSUNfTEFCRUxTCisJCQkrIEFERF9OVU1fRFlOQU1JQ19MQUJFTFM7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgU0VSSUFMWkFUSU9OX1RFU1RfVVJJID0gVVJJCisJCQkuY3JlYXRlVVJJKCJ0ZW1wL3Rlc3RncmFwaDEuZ3JhcGgiKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKEdyYXBoVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBHcmFwaCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR3JhcGhUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgR3JhcGggdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBHcmFwaCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKEdyYXBoKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVGVzdFV0aWwucmVzZXRDb3VudGVycygpOworCQlzZXRGaXh0dXJlKGNyZWF0ZUZpeHR1cmUoKSk7CisJfSAvLyBzZXRVcAorCisJLyoqCisJICogQHJldHVybiBhIHRlc3QgZ3JhcGgKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEdyYXBoIGNyZWF0ZUZpeHR1cmUoKSB7CisJCWZpbmFsIEdyYXBoIHJldFZhbHVlID0gR3JhcGhGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaCgpOworCQlyZXRWYWx1ZS5zZXRVUkkoR1JBUEgxX1VSSSk7CisKKwkJcG9wdWxhdGVHcmFwaChNQUlOX05VTV9EWU5BTUlDX0VER0VfTEFCRUxTLAorCQkJCU1BSU5fTlVNX1NUQVRJQ19FREdFX0xBQkVMUywgTUFJTl9OVU1fRFlOQU1JQ19HUkFQSF9MQUJFTFMsCisJCQkJTUFJTl9OVU1fU1RBVElDX0dSQVBIX0xBQkVMUywgcmV0VmFsdWUpOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUZpeHR1cmUKKworCS8qKgorCSAqIEFkZCBlZGdlcywgbm9kZXMgYW5kIGxhYmVscyB0byBhIGdyYXBoLgorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVHcmFwaCgKKwkJCWZpbmFsIGludCBudW1iZXJPZkR5bmFtaWNhbGx5TGFiZWxlZEVkZ2VzLAorCQkJZmluYWwgaW50IG51bWJlck9mU3RhdGljYWxseUxhYmVsZWRFZGdlcywKKwkJCWZpbmFsIGludCBudW1iZXJPZkR5bmFtaWNhbGx5TGFiZWxlZEdyYXBoTGFiZWxzLAorCQkJZmluYWwgaW50IG51bWJlck9mU3RhdGljYWxseUxhYmVsZWRHcmFwaExhYmVscywgZmluYWwgR3JhcGggZ3JhcGgpIHsKKworCQlmaW5hbCBUZXN0Tm9kZURlY29yYXRvcjEgdG5kID0gRGVjb3JhdG9yc0ZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZVRlc3ROb2RlRGVjb3JhdG9yMSgpOworCQlmaW5hbCBUZXN0RWRnZURlY29yYXRvcjEgdGVkID0gRGVjb3JhdG9yc0ZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZVRlc3RFZGdlRGVjb3JhdG9yMSgpOworCQlmaW5hbCBUZXN0R3JhcGhEZWNvcmF0b3IxIHRnZCA9IERlY29yYXRvcnNGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVUZXN0R3JhcGhEZWNvcmF0b3IxKCk7CisKKwkJZ3JhcGguZ2V0RGVjb3JhdG9ycygpLmFkZCh0bmQpOworCQlncmFwaC5nZXREZWNvcmF0b3JzKCkuYWRkKHRlZCk7CisJCWdyYXBoLmdldERlY29yYXRvcnMoKS5hZGQodGdkKTsKKwkJCisJCXBvcHVsYXRlRHluYW1pY2FsbHlMYWJlbGVkRWRnZXMoZ3JhcGgsIG51bWJlck9mRHluYW1pY2FsbHlMYWJlbGVkRWRnZXMsCisJCQkJdG5kLCB0ZWQpOworCQlwb3B1bGF0ZVN0YXRpY2FsbHlMYWJlbGVkRWRnZXMoZ3JhcGgsIG51bWJlck9mU3RhdGljYWxseUxhYmVsZWRFZGdlcywKKwkJCQl0bmQsIHRlZCwgdGdkKTsKKwkJcG9wdWxhdGVEeW5hbWljR3JhcGhMYWJlbHMoZ3JhcGgsCisJCQkJbnVtYmVyT2ZEeW5hbWljYWxseUxhYmVsZWRHcmFwaExhYmVscywgdGdkKTsKKwkJcG9wdWxhdGVTdGF0aWNHcmFwaExhYmVscyhncmFwaCwgbnVtYmVyT2ZTdGF0aWNhbGx5TGFiZWxlZEdyYXBoTGFiZWxzKTsKKworCX0gLy8gcG9wdWxhdGVHcmFwaAorCisJLyoqCisJICogQHBhcmFtIGdyYXBoCisJICogQHBhcmFtIG51bWJlck9mU3RhdGljYWxseUxhYmVsZWRHcmFwaExhYmVscworCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVTdGF0aWNHcmFwaExhYmVscyhHcmFwaCBncmFwaCwKKwkJCWludCBudW1iZXJPZlN0YXRpY2FsbHlMYWJlbGVkR3JhcGhMYWJlbHMpIHsKKwkJZm9yIChpbnQgc3RhdGljR3JhcGhMYWJlbE51bWJlciA9IDA7IHN0YXRpY0dyYXBoTGFiZWxOdW1iZXIgPCBudW1iZXJPZlN0YXRpY2FsbHlMYWJlbGVkR3JhcGhMYWJlbHM7IHN0YXRpY0dyYXBoTGFiZWxOdW1iZXIrKykgeworCQkJZmluYWwgTGFiZWwgZ3JhcGhMYWJlbCA9IFRlc3RVdGlsLmNyZWF0ZVN0YXRpY0xhYmVsKGdyYXBoLmdldFVSSSgpKTsKKwkJCWdyYXBoLnB1dEdyYXBoTGFiZWwoZ3JhcGhMYWJlbCk7CisJCX0gLy8gZm9yIGxhYmVsTnVtYmVyCisJfSAvLyBwb3B1bGF0ZVN0YXRpY0dyYXBoTGFiZWxzCisKKwkvKioKKwkgKiBAcGFyYW0gZ3JhcGgKKwkgKiBAcGFyYW0gbnVtYmVyT2ZEeW5hbWljYWxseUxhYmVsZWRHcmFwaExhYmVscworCSAqIEBwYXJhbSBncmFwaERlY29yYXRvcgorCSAqICAgICAgICAgICAgVE9ETworCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVEeW5hbWljR3JhcGhMYWJlbHMoR3JhcGggZ3JhcGgsCisJCQlmaW5hbCBpbnQgbnVtYmVyT2ZEeW5hbWljYWxseUxhYmVsZWRHcmFwaExhYmVscywKKwkJZmluYWwJR3JhcGhEZWNvcmF0b3IgZ3JhcGhEZWNvcmF0b3IpIHsKKwkJZm9yIChpbnQgZHluYW1pY0dyYXBoTGFiZWxOdW1iZXIgPSAwOyBkeW5hbWljR3JhcGhMYWJlbE51bWJlciA8IG51bWJlck9mRHluYW1pY2FsbHlMYWJlbGVkR3JhcGhMYWJlbHM7IGR5bmFtaWNHcmFwaExhYmVsTnVtYmVyKyspIHsKKwkJCWZpbmFsIER5bmFtaWNMYWJlbCBkeW5hbWljTGFiZWwgPSBUZXN0VXRpbC5jcmVhdGVEeW5hbWljTGFiZWwoZ3JhcGgKKwkJCQkJLmdldFVSSSgpLCBncmFwaERlY29yYXRvcik7CisKKwkJCWFzc2VydCBkeW5hbWljTGFiZWwuc2FuZSgpOworCisJCQlncmFwaC5wdXRHcmFwaExhYmVsKGR5bmFtaWNMYWJlbCk7CisJCX0gLy8gZm9yIGxhYmVsTnVtYmVyCisJfSAvLyBwb3B1bGF0ZUR5bmFtaWNHcmFwaExhYmVscworCisJLyoqCisJICogCisJICogQHBhcmFtIGdyYXBoCisJICogQHBhcmFtIG51bWJlck9mRHluYW1pY2FsbHlMYWJlbGVkRWRnZXMKKwkgKiBAcGFyYW0gbm9kZURlY29yYXRvcgorCSAqICAgICAgICAgICAgVE9ETworCSAqIEBwYXJhbSBlZGdlRGVjb3JhdG9yCisJICogICAgICAgICAgICBUT0RPCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZUR5bmFtaWNhbGx5TGFiZWxlZEVkZ2VzKGZpbmFsIEdyYXBoIGdyYXBoLAorCQkJZmluYWwgaW50IG51bWJlck9mRHluYW1pY2FsbHlMYWJlbGVkRWRnZXMsCisJCQlOb2RlRGVjb3JhdG9yIG5vZGVEZWNvcmF0b3IsIEVkZ2VEZWNvcmF0b3IgZWRnZURlY29yYXRvcikgeworCisJCWZvciAoaW50IGVkZ2VOdW1iZXIgPSAwOyBlZGdlTnVtYmVyIDwgbnVtYmVyT2ZEeW5hbWljYWxseUxhYmVsZWRFZGdlczsgZWRnZU51bWJlcisrKSB7CisJCQkvLyBFYWNoIGVkZ2UgYWRkcyB0d28gbm9kZXMgdG8gdGhlIGdyYXBoLCBhbGwgdGhyZWUgaGF2ZSBkeW5hbWljCisJCQkvLyBsYWJlbHMKKwkJCWZpbmFsIE5vZGUgbm9kZUEgPSBUZXN0VXRpbAorCQkJCQkuY3JlYXRlRHluYW1pY2FseUxhYmVsZWROb2RlKG5vZGVEZWNvcmF0b3IpOworCQkJZmluYWwgTm9kZSBub2RlQiA9IFRlc3RVdGlsCisJCQkJCS5jcmVhdGVEeW5hbWljYWx5TGFiZWxlZE5vZGUobm9kZURlY29yYXRvcik7CisJCQlmaW5hbCBFZGdlIGVkZ2UgPSBUZXN0VXRpbC5jcmVhdGVEeW5hbWljYWxseUxhYmVsZWRFZGdlKG5vZGVBCisJCQkJCS5nZXRVUkkoKSwgbm9kZUIuZ2V0VVJJKCksIGVkZ2VEZWNvcmF0b3IpOworCisJCQllZGdlLnNldEEobm9kZUEpOworCQkJZWRnZS5zZXRCKG5vZGVCKTsKKwkJCW5vZGVBLmdldEVkZ2VzKCkuYWRkKGVkZ2UpOworCQkJbm9kZUIuZ2V0RWRnZXMoKS5hZGQoZWRnZSk7CisKKwkJCWFzc2VydCBlZGdlLnNhbmUoKTsKKwkJCWFzc2VydCBub2RlQS5zYW5lKCk7CisJCQlhc3NlcnQgbm9kZUIuc2FuZSgpOworCisJCQlncmFwaC5wdXRFZGdlKGVkZ2UpOworCQkJZ3JhcGgucHV0Tm9kZShub2RlQSk7CisJCQlncmFwaC5wdXROb2RlKG5vZGVCKTsKKworCQl9IC8vIGZvciBlZGdlTnVtYmVyCisKKwl9IC8vIHBvcHVsYXRlRHluYW1pY2FsbHlMYWJlbGVkRWRnZXMKKworCS8qKgorCSAqIEBwYXJhbSBncmFwaAorCSAqIEBwYXJhbSBudW1iZXJPZlN0YXRpY2FsbHlMYWJlbGVkRWRnZXMKKwkgKiBAcGFyYW0gbm9kZURlY29yYXRvcgorCSAqICAgICAgICAgICAgVE9ETworCSAqIEBwYXJhbSBlZGdlRGVjb3JhdG9yCisJICogICAgICAgICAgICBUT0RPCisJICogQHBhcmFtIGdyYXBoRGVjb3JhdG9yCisJICogICAgICAgICAgICBUT0RPCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZVN0YXRpY2FsbHlMYWJlbGVkRWRnZXMoZmluYWwgR3JhcGggZ3JhcGgsCisJCQlmaW5hbCBpbnQgbnVtYmVyT2ZTdGF0aWNhbGx5TGFiZWxlZEVkZ2VzLAorCQkJTm9kZURlY29yYXRvciBub2RlRGVjb3JhdG9yLCBFZGdlRGVjb3JhdG9yIGVkZ2VEZWNvcmF0b3IsCisJCQlHcmFwaERlY29yYXRvciBncmFwaERlY29yYXRvcikgeworCQlmb3IgKGludCBlZGdlTnVtYmVyID0gMDsgZWRnZU51bWJlciA8IG51bWJlck9mU3RhdGljYWxseUxhYmVsZWRFZGdlczsgZWRnZU51bWJlcisrKSB7CisJCQkvLyBFYWNoIHN0YXRpY2FsbHkgbGFiZWxlZCBlZGdlIGFkZHMgdHdvIG5vZGVzCisJCQlmaW5hbCBOb2RlIG5vZGVBID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljYWxseUxhYmVsZWROb2RlKCk7CisJCQlmaW5hbCBOb2RlIG5vZGVCID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljYWxseUxhYmVsZWROb2RlKCk7CisJCQlmaW5hbCBFZGdlIGVkZ2UgPSBUZXN0VXRpbC5jcmVhdGVTdGF0aWNhbGx5TGFiZWxlZEVkZ2Uobm9kZUEKKwkJCQkJLmdldFVSSSgpLCBub2RlQi5nZXRVUkkoKSk7CisKKwkJCWVkZ2Uuc2V0QShub2RlQSk7CisJCQllZGdlLnNldEIobm9kZUIpOworCQkJbm9kZUEuZ2V0RWRnZXMoKS5hZGQoZWRnZSk7CisJCQlub2RlQi5nZXRFZGdlcygpLmFkZChlZGdlKTsKKworCQkJYXNzZXJ0IGVkZ2Uuc2FuZSgpOworCQkJYXNzZXJ0IG5vZGVBLnNhbmUoKTsKKwkJCWFzc2VydCBub2RlQi5zYW5lKCk7CisKKwkJCWdyYXBoLnB1dEVkZ2UoZWRnZSk7CisJCQlncmFwaC5wdXROb2RlKG5vZGVBKTsKKwkJCWdyYXBoLnB1dE5vZGUobm9kZUIpOworCQkJLy8gZmluYWwgTm9kZUxhYmVsIG5vZGVBTGFiZWwgPSAoTm9kZUxhYmVsKQorCQkJLy8gbm9kZUEuZ2V0TGFiZWxzKCkuZ2V0KDApOworCQkJLy8gZmluYWwgTm9kZUxhYmVsIG5vZGVCTGFiZWwgPSAoTm9kZUxhYmVsKQorCQkJLy8gbm9kZUIuZ2V0TGFiZWxzKCkuZ2V0KDApOworCQkJLy8gZ3JhcGgucHV0Tm9kZUxhYmVsKG5vZGVBTGFiZWwpOworCQkJLy8gZ3JhcGgucHV0Tm9kZUxhYmVsKG5vZGVCTGFiZWwpOworCQl9IC8vIGZvciBlZGdlTnVtYmVyCisJfSAvLyBwb3B1bGF0ZVN0YXRpY2FsbHlMYWJlbGVkRWRnZXMKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0TnVtRWRnZXMoKQorCSAqIDxlbT4gRWRnZXM8L2VtPn0nIGZlYXR1cmUgZ2V0dGVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldE51bUVkZ2VzKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXROdW1FZGdlcygpIHsKKwkJZmluYWwgR3JhcGggZ3JhcGggPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoZ3JhcGguZ2V0TnVtRWRnZXMoKSA9PSAyKTsKKwl9IC8vIHRlc3RHZXROdW1FZGdlcworCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldE51bU5vZGVzKCkKKwkgKiA8ZW0+TnVtIE5vZGVzPC9lbT59JyBmZWF0dXJlIGdldHRlci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNnZXROdW1Ob2RlcygpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVtTm9kZXMoKSB7CisJCWZpbmFsIEdyYXBoIGdyYXBoID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGdyYXBoLmdldE51bU5vZGVzKCkgPT0gNCk7CisJfSAvLyB0ZXN0R2V0TnVtTm9kZXMKKworCS8qKgorCSAqIFRlc3RzIHRoZSAnCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNnZXROdW1HcmFwaExhYmVscygpCisJICogPGVtPk51bSBHcmFwaCBMYWJlbHM8L2VtPn0nIGZlYXR1cmUgZ2V0dGVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldE51bUdyYXBoTGFiZWxzKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXROdW1HcmFwaExhYmVscygpIHsKKwkJZmluYWwgR3JhcGggZ3JhcGggPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoZ3JhcGguZ2V0TnVtR3JhcGhMYWJlbHMoKSA9PSAyKTsKKwl9IC8vIHRlc3RHZXROdW1HcmFwaExhYmVscworCisJLyoqCisJICogVGVzdHMgdGhlICcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldE51bU5vZGVMYWJlbHMoKQorCSAqIDxlbT5OdW0gTm9kZSBMYWJlbHM8L2VtPn0nIGZlYXR1cmUgZ2V0dGVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldE51bU5vZGVMYWJlbHMoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldE51bU5vZGVMYWJlbHMoKSB7CisJCWZpbmFsIEdyYXBoIGdyYXBoID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGdyYXBoLmdldE51bU5vZGVMYWJlbHMoKSA9PSBncmFwaC5nZXROdW1Ob2RlcygpKTsKKwl9IC8vIHRlc3RHZXROdW1Ob2RlTGFiZWxzCisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJworCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0TnVtRHluYW1pY0xhYmVscygpCisJICogPGVtPk51bSBEeW5hbWljIExhYmVsczwvZW0+fScgZmVhdHVyZSBnZXR0ZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0TnVtRHluYW1pY0xhYmVscygpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVtRHluYW1pY0xhYmVscygpIHsKKwkJZmluYWwgR3JhcGggZ3JhcGggPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoZ3JhcGguZ2V0TnVtRHluYW1pY0xhYmVscygpID09IDQpOworCX0gLy8gdGVzdEdldE51bUR5bmFtaWNMYWJlbHMKKworCS8qKgorCSAqIFRlc3RzIHRoZSAnCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNnZXROb2RlTGFiZWxzQnlUeXBlVVJJKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCisJICogPGVtPkdldCBOb2RlIExhYmVscyBCeSBUeXBlIFVSSTwvZW0+fScgb3BlcmF0aW9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldE5vZGVMYWJlbHNCeVR5cGVVUkkob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXROb2RlTGFiZWxzQnlUeXBlVVJJX19VUkkoKSB7CisJCWZpbmFsIEdyYXBoIGdyYXBoID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBFTGlzdCBub2RlTGFiZWxzID0gZ3JhcGgKKwkJCQkuZ2V0Tm9kZUxhYmVsc0J5VHlwZVVSSShEeW5hbWljTGFiZWwuVVJJX1RZUEVfRFlOQU1JQ19MQUJFTCk7CisJCWFzc2VydFRydWUobm9kZUxhYmVscy5zaXplKCkgPT0gMik7CisJfSAvLyB0ZXN0R2V0Tm9kZUxhYmVsc0J5VHlwZVVSSV9fVVJJCisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjYWRkR3JhcGgob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoLCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZUZpbHRlcikgPGVtPkFkZCBHcmFwaDwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjYWRkR3JhcGgob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoLCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZUZpbHRlcikKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgdGVzdEFkZEdyYXBoX19HcmFwaF9JZGVudGlmaWFibGVGaWx0ZXIoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG9wZXJhdGlvbiB0ZXN0IG1ldGhvZAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQlmYWlsKCk7CisJfQorCisJLyoqCisJICogVGVzdCB0aGUgc2FuaXR5IG9mIHRoZSBmaXh0dXJlCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdGVzdFNhbmUoKSB7CisJCWZpbmFsIEdyYXBoIGdyYXBoID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGdyYXBoLnNhbmUoKSk7CisJfSAvLyB0ZXN0U2FuZQorCisJLyoqCisJICogVGVzdHMgdGhlICcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2FkZEdyYXBoKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCkKKwkgKiA8ZW0+QWRkIEdyYXBoPC9lbT59JyBvcGVyYXRpb24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjYWRkR3JhcGgob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEFkZEdyYXBoX19HcmFwaCgpIHsKKwkJZmluYWwgR3JhcGggbWFpbkdyYXBoID0gZ2V0Rml4dHVyZSgpOworCisJCWZpbmFsIEdyYXBoIGFkZEdyYXBoID0gR3JhcGhGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaCgpOworCisJCXBvcHVsYXRlR3JhcGgoQUREX05VTV9EWU5BTUlDX0VER0VfTEFCRUxTLCBBRERfTlVNX1NUQVRJQ19FREdFX0xBQkVMUywKKwkJCQlBRERfTlVNX0RZTkFNSUNfR1JBUEhfTEFCRUxTLCBBRERfTlVNX1NUQVRJQ19HUkFQSF9MQUJFTFMsCisJCQkJYWRkR3JhcGgpOworCisJCWFzc2VydFRydWUobWFpbkdyYXBoLmdldE51bUVkZ2VzKCkgPT0gTUFJTl9OVU1fRURHRVMpOworCQlhc3NlcnRUcnVlKG1haW5HcmFwaC5nZXROdW1Ob2RlcygpID09IE1BSU5fTlVNX05PREVTKTsKKwkJYXNzZXJ0VHJ1ZShtYWluR3JhcGguZ2V0TnVtTm9kZUxhYmVscygpID09IE1BSU5fTlVNX05PREVfTEFCRUxTKTsKKworCQlhc3NlcnRUcnVlKGFkZEdyYXBoLmdldE51bUVkZ2VzKCkgPT0gQUREX05VTV9FREdFUyk7CisJCWFzc2VydFRydWUoYWRkR3JhcGguZ2V0TnVtTm9kZXMoKSA9PSBBRERfTlVNX05PREVTKTsKKwkJYXNzZXJ0VHJ1ZShhZGRHcmFwaC5nZXROdW1Ob2RlTGFiZWxzKCkgPT0gQUREX05VTV9OT0RFX0xBQkVMUyk7CisKKwkJLy8gQWRkIHRoZSB0d28gZ3JhcGhzIHRvZ2V0aGVyCisJCW1haW5HcmFwaC5hZGRHcmFwaChhZGRHcmFwaCwgbnVsbCk7CisKKwkJYXNzZXJ0VHJ1ZShtYWluR3JhcGguZ2V0TnVtRWRnZXMoKSA9PSBSRVNVTFRfTlVNX0VER0VTKTsKKwkJYXNzZXJ0VHJ1ZShtYWluR3JhcGguZ2V0TnVtTm9kZXMoKSA9PSBSRVNVTFRfTlVNX05PREVTKTsKKwkJYXNzZXJ0VHJ1ZShtYWluR3JhcGguZ2V0TnVtTm9kZUxhYmVscygpID09IFJFU1VMVF9OVU1fTk9ERV9MQUJFTFMpOworCQlhc3NlcnRUcnVlKG1haW5HcmFwaC5nZXROdW1HcmFwaExhYmVscygpID09IFJFU1VMVF9OVU1fR1JBUEhfTEFCRUxTKTsKKwkJYXNzZXJ0VHJ1ZShtYWluR3JhcGguZ2V0TnVtRHluYW1pY0xhYmVscygpID09IFJFU1VMVF9OVU1fRFlOQU1JQ19MQUJFTFMpOworCX0gLy8gdGVzdEFkZEdyYXBoX19HcmFwaAorCisJLyoqCisJICogVGVzdHMgdGhlICcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI3B1dEVkZ2Uob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2UpCisJICogPGVtPlB1dCBFZGdlPC9lbT59JyBvcGVyYXRpb24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjcHV0RWRnZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZSkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RQdXRFZGdlX19FZGdlKCkgeworCQlmaW5hbCBHcmFwaCBncmFwaCA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgRWRnZSBlZGdlID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljYWxseUxhYmVsZWRFZGdlKFRlc3RVdGlsCisJCQkJLmNyZWF0ZU5leHRJZGVudGlmaWFibGVUb0xhYmVsVVJJKCksIFRlc3RVdGlsCisJCQkJLmNyZWF0ZU5leHRJZGVudGlmaWFibGVUb0xhYmVsVVJJKCkpOworCQlncmFwaC5wdXRFZGdlKGVkZ2UpOworCQlhc3NlcnRUcnVlKGVkZ2UuZXF1YWxzKGdyYXBoLmdldEVkZ2UoZWRnZS5nZXRVUkkoKSkpKTsKKwl9IC8vIHRlc3RQdXRFZGdlX19FZGdlCisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJworCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0RWRnZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQorCSAqIDxlbT5HZXQgRWRnZTwvZW0+fScgb3BlcmF0aW9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldEVkZ2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKKwkgKiBAc2VlICN0ZXN0UHV0RWRnZV9fRWRnZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0RWRnZV9fVVJJKCkgeworCQkvLyBJbXBsZW1lbnRlZCBpbiB0ZXN0UHV0RWRnZV9fRWRnZQorCQlhc3NlcnRUcnVlKHRydWUpOworCX0gLy8gdGVzdEdldEVkZ2VfX1VSSQorCisJLyoqCisJICogVGVzdHMgdGhlICcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI3B1dE5vZGUob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGUpCisJICogPGVtPlB1dCBOb2RlPC9lbT59JyBvcGVyYXRpb24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjcHV0Tm9kZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZSkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RQdXROb2RlX19Ob2RlKCkgeworCQlmaW5hbCBHcmFwaCBncmFwaCA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgTm9kZSBub2RlID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljYWxseUxhYmVsZWROb2RlKCk7CisJCWdyYXBoLnB1dE5vZGUobm9kZSk7CisJCWFzc2VydFRydWUobm9kZS5lcXVhbHMoZ3JhcGguZ2V0Tm9kZShub2RlLmdldFVSSSgpKSkpOworCX0gLy8gdGVzdFB1dE5vZGVfX05vZGUKKworCS8qKgorCSAqIFRlc3RzIHRoZSAnCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNnZXROb2RlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCisJICogPGVtPkdldCBOb2RlPC9lbT59JyBvcGVyYXRpb24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0Tm9kZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQorCSAqIEBzZWUgI3Rlc3RQdXROb2RlX19Ob2RlKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXROb2RlX19VUkkoKSB7CisJCS8vIEltcGxlbWVudGVkIGluIHRlc3RQdXROb2RlX19Ob2RlCisJCWFzc2VydFRydWUodHJ1ZSk7CisJfSAvLyB0ZXN0R2V0Tm9kZV9fVVJJCisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJworCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjcHV0Tm9kZUxhYmVsKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWwpCisJICogPGVtPlB1dCBOb2RlIExhYmVsPC9lbT59JyBvcGVyYXRpb24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjcHV0Tm9kZUxhYmVsKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWwpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0UHV0Tm9kZUxhYmVsX19Ob2RlTGFiZWwoKSB7CisJCWZpbmFsIEdyYXBoIGdyYXBoID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBEeW5hbWljTm9kZUxhYmVsIGxhYmVsID0gVGVzdFV0aWwuY3JlYXRlRHluYW1pY05vZGVMYWJlbCgpOworCQlncmFwaC5wdXROb2RlTGFiZWwobGFiZWwpOworCQlhc3NlcnRUcnVlKGxhYmVsLmVxdWFscyhncmFwaC5nZXROb2RlTGFiZWwobGFiZWwuZ2V0VVJJKCkpKSk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldE5vZGVMYWJlbChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQorCSAqIDxlbT5HZXQgTm9kZSBMYWJlbDwvZW0+fScgb3BlcmF0aW9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldE5vZGVMYWJlbChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQorCSAqIEBzZWUgI3Rlc3RQdXROb2RlTGFiZWxfX05vZGVMYWJlbCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Tm9kZUxhYmVsX19VUkkoKSB7CisJCS8vIEltcGxlbWVudGVkIGluIHRlc3RQdXROb2RlTGFiZWxfX05vZGVMYWJlbAorCQlhc3NlcnRUcnVlKHRydWUpOworCX0gLy8gdGVzdEdldE5vZGVMYWJlbF9fVVJJCisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJworCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjcHV0R3JhcGhMYWJlbChvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWwpCisJICogPGVtPlB1dCBHcmFwaCBMYWJlbDwvZW0+fScgb3BlcmF0aW9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI3B1dEdyYXBoTGFiZWwob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdFB1dEdyYXBoTGFiZWxfX0xhYmVsKCkgeworCQlmaW5hbCBHcmFwaCBncmFwaCA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgTGFiZWwgbGFiZWwgPSBUZXN0VXRpbC5jcmVhdGVTdGF0aWNMYWJlbCgpOworCQlncmFwaC5wdXRHcmFwaExhYmVsKGxhYmVsKTsKKwkJYXNzZXJ0VHJ1ZShsYWJlbC5lcXVhbHMoZ3JhcGguZ2V0R3JhcGhMYWJlbChsYWJlbC5nZXRVUkkoKSkpKTsKKwl9IC8vIHRlc3RQdXRHcmFwaExhYmVsX19MYWJlbAorCisJLyoqCisJICogVGVzdHMgdGhlICcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI2dldEdyYXBoTGFiZWwob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKKwkgKiA8ZW0+R2V0IEdyYXBoIExhYmVsPC9lbT59JyBvcGVyYXRpb24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgjZ2V0R3JhcGhMYWJlbChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQorCSAqIEBzZWUgI3Rlc3RQdXRHcmFwaExhYmVsX19MYWJlbCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0R3JhcGhMYWJlbF9fVVJJKCkgeworCQkvLyBJbXBsZW1lbnRlZCBpbiB0ZXN0UHV0R3JhcGhMYWJlbF9fTGFiZWwKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwl9IC8vIHRlc3RHZXRHcmFwaExhYmVsX19VUkkKKworCS8qKgorCSAqIFRlc3RzIHRoZSAnCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNhZGREeW5hbWljTGFiZWwob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbCkKKwkgKiA8ZW0+QWRkIER5bmFtaWMgTGFiZWw8L2VtPn0nIG9wZXJhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNhZGREeW5hbWljTGFiZWwob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RBZGREeW5hbWljTGFiZWxfX0R5bmFtaWNMYWJlbCgpIHsKKwkJZmluYWwgR3JhcGggZ3JhcGggPSBnZXRGaXh0dXJlKCk7CisJCWZpbmFsIER5bmFtaWNMYWJlbCBsYWJlbCA9IFRlc3RVdGlsLmNyZWF0ZUR5bmFtaWNMYWJlbChUZXN0VXRpbAorCQkJCS5jcmVhdGVOZXh0SWRlbnRpZmlhYmxlVG9MYWJlbFVSSSgpKTsKKwkJZ3JhcGguYWRkRHluYW1pY0xhYmVsKGxhYmVsKTsKKwkJYXNzZXJ0VHJ1ZShncmFwaC5nZXREeW5hbWljTGFiZWxzKCkuY29udGFpbnMobGFiZWwpKTsKKwl9IC8vIHRlc3RBZGREeW5hbWljTGFiZWxfX0R5bmFtaWNMYWJlbAorCisJLyoqCisJICogVGVzdHMgdGhlICcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoI3N3aXRjaFRvTmV4dFZhbHVlKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSkKKwkgKiA8ZW0+U3dpdGNoIFRvIE5leHQgVmFsdWU8L2VtPn0nIG9wZXJhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCNzd2l0Y2hUb05leHRWYWx1ZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoVG9OZXh0VmFsdWVfX1NURU1UaW1lKCkgeworCQlmaW5hbCBHcmFwaCBtYWluR3JhcGggPSBnZXRGaXh0dXJlKCk7CisKKwkJLy8gQWxsIG9mIHRoZSBkeW5hbWljIGxhYmVsIGN1cnJlbnQgdmFsdWVzIHNob3VsZCBiZSAwICh6ZXJvKQorCQlmb3IgKGZpbmFsIEl0ZXJhdG9yIGR5bmFtaWNMYWJlbEl0ZXIgPSBtYWluR3JhcGguZ2V0RHluYW1pY0xhYmVscygpCisJCQkJLml0ZXJhdG9yKCk7IGR5bmFtaWNMYWJlbEl0ZXIuaGFzTmV4dCgpOykgeworCQkJYXNzZXJ0RmFsc2UodmFsdWVzU3dhcHBlZCgoRHluYW1pY0xhYmVsKSBkeW5hbWljTGFiZWxJdGVyLm5leHQoKSkpOworCQl9IC8vIGZvciBlYWNoIGR5bmFtaWMgbGFiZWwKKworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yIG5vZGVJdGVyYXRvciA9IG1haW5HcmFwaC5nZXROb2RlcygpLnZhbHVlcygpCisJCQkJLml0ZXJhdG9yKCk7IG5vZGVJdGVyYXRvci5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBOb2RlIG5vZGUgPSAoTm9kZSkgbm9kZUl0ZXJhdG9yLm5leHQoKTsKKwkJCWZvciAoZmluYWwgSXRlcmF0b3IgbGFiZWxJdGVyID0gbm9kZS5nZXRMYWJlbHMoKS5pdGVyYXRvcigpOyBsYWJlbEl0ZXIKKwkJCQkJLmhhc05leHQoKTspIHsKKwkJCQlmaW5hbCBMYWJlbCBsYWJlbCA9IChMYWJlbCkgbGFiZWxJdGVyLm5leHQoKTsKKwkJCQkvLyBJcyBpdCBhIGR5bmFtaWMgbGFiZWw/CisJCQkJaWYgKGxhYmVsIGluc3RhbmNlb2YgRHluYW1pY0xhYmVsKSB7CisJCQkJCWZpbmFsIER5bmFtaWNMYWJlbCBkeW5hbWljTGFiZWwgPSAoRHluYW1pY0xhYmVsKSBsYWJlbDsKKwkJCQkJYXNzZXJ0RmFsc2UodmFsdWVzU3dhcHBlZChkeW5hbWljTGFiZWwpKTsKKwkJCQl9CisJCQl9IC8vIGZvciBub2RlJ3MgbGFiZWxzCisJCX0gLy8gZm9yIGVhY2ggbm9kZQorCisJCS8vIEF0IHRoaXMgcG9pbnQgYWxsIG9mIHRoZSBuZXh0IHZhbHVlcyBhcmUgY29uc2lkZXJlZCAiaW52YWxpZCIgdGhpcyBpcworCQkvLyB0ZXN0ZWQgaW4gc3dpdGNoVG9OZXh0VmFsdWUuCisJCWZvciAoZmluYWwgSXRlcmF0b3IgZHluYW1pY0xhYmVsSXRlciA9IG1haW5HcmFwaC5nZXREeW5hbWljTGFiZWxzKCkKKwkJCQkuaXRlcmF0b3IoKTsgZHluYW1pY0xhYmVsSXRlci5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBEeW5hbWljTGFiZWwgZHluYW1pY0xhYmVsID0gKER5bmFtaWNMYWJlbCkgZHluYW1pY0xhYmVsSXRlcgorCQkJCQkubmV4dCgpOworCQkJZHluYW1pY0xhYmVsLnNldE5leHRWYWx1ZVZhbGlkKHRydWUpOworCQl9IC8vIGZvcgorCisJCS8vIERPIElUIQorCQltYWluR3JhcGguc3dpdGNoVG9OZXh0VmFsdWUoU1dJVENIX1RJTUUpOworCisJCWFzc2VydFRydWUobWFpbkdyYXBoLmdldFRpbWUoKS5lcXVhbHMoU1dJVENIX1RJTUUpKTsKKworCQkvLyBBZnRlciB0aGUgc3dpdGNoCisJCS8vIEFsbCBvZiB0aGUgZHluYW1pYyBsYWJlbCBjdXJyZW50IHZhbHVlcyBzaG91bGQgYmUgc3dhcHBlZAorCQlmb3IgKGZpbmFsIEl0ZXJhdG9yIGR5bmFtaWNMYWJlbEl0ZXIgPSBtYWluR3JhcGguZ2V0RHluYW1pY0xhYmVscygpCisJCQkJLml0ZXJhdG9yKCk7IGR5bmFtaWNMYWJlbEl0ZXIuaGFzTmV4dCgpOykgeworCQkJZmluYWwgRHluYW1pY0xhYmVsIGR5bmFtaWNMYWJlbCA9IChEeW5hbWljTGFiZWwpIGR5bmFtaWNMYWJlbEl0ZXIKKwkJCQkJLm5leHQoKTsKKwkJCWFzc2VydFRydWUodmFsdWVzU3dhcHBlZChkeW5hbWljTGFiZWwpKTsKKwkJCWFzc2VydEZhbHNlKGR5bmFtaWNMYWJlbC5pc05leHRWYWx1ZVZhbGlkKCkpOworCQl9IC8vIGZvciBlYWNoIGR5bmFtaWMgbGFiZWwKKworCQkvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IG90aGVyIGR5bmFtaWMgbGFiZWxzIGx5aW5nIGFyb3VuZCB0aGF0IGFyZSAwCisJCWZvciAoZmluYWwgSXRlcmF0b3IgZ3JhcGhMYWJlbEl0ZXIgPSBtYWluR3JhcGguZ2V0R3JhcGhMYWJlbHMoKQorCQkJCS52YWx1ZXMoKS5pdGVyYXRvcigpOyBncmFwaExhYmVsSXRlci5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBMYWJlbCBsYWJlbCA9IChMYWJlbCkgZ3JhcGhMYWJlbEl0ZXIubmV4dCgpOworCQkJLy8gSXMgaXQgYSBkeW5hbWljIGxhYmVsPworCQkJaWYgKGxhYmVsIGluc3RhbmNlb2YgRHluYW1pY0xhYmVsKSB7CisJCQkJZmluYWwgRHluYW1pY0xhYmVsIGR5bmFtaWNMYWJlbCA9IChEeW5hbWljTGFiZWwpIGxhYmVsOworCQkJCWFzc2VydFRydWUodmFsdWVzU3dhcHBlZChkeW5hbWljTGFiZWwpKTsKKwkJCX0KKwkJfSAvLyBmb3IgZ3JhcGggbGFiZWxzCisKKwkJZm9yIChmaW5hbCBJdGVyYXRvciBub2RlSXRlcmF0b3IgPSBtYWluR3JhcGguZ2V0Tm9kZXMoKS52YWx1ZXMoKQorCQkJCS5pdGVyYXRvcigpOyBub2RlSXRlcmF0b3IuaGFzTmV4dCgpOykgeworCQkJZmluYWwgTm9kZSBub2RlID0gKE5vZGUpIG5vZGVJdGVyYXRvci5uZXh0KCk7CisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yIGxhYmVsSXRlciA9IG5vZGUuZ2V0TGFiZWxzKCkuaXRlcmF0b3IoKTsgbGFiZWxJdGVyCisJCQkJCS5oYXNOZXh0KCk7KSB7CisJCQkJZmluYWwgTGFiZWwgbGFiZWwgPSAoTGFiZWwpIGxhYmVsSXRlci5uZXh0KCk7CisJCQkJLy8gSXMgaXQgYSBkeW5hbWljIGxhYmVsPworCQkJCWlmIChsYWJlbCBpbnN0YW5jZW9mIER5bmFtaWNMYWJlbCkgeworCQkJCQlmaW5hbCBEeW5hbWljTGFiZWwgZHluYW1pY0xhYmVsID0gKER5bmFtaWNMYWJlbCkgbGFiZWw7CisJCQkJCWFzc2VydFRydWUodmFsdWVzU3dhcHBlZChkeW5hbWljTGFiZWwpKTsKKwkJCQl9CisJCQl9IC8vIGZvciBub2RlJ3MgbGFiZWxzCisJCX0gLy8gZm9yIGVhY2ggbm9kZQorCisJCWZvciAoZmluYWwgSXRlcmF0b3IgZWRnZUl0ZXJhdG9yID0gbWFpbkdyYXBoLmdldEVkZ2VzKCkudmFsdWVzKCkKKwkJCQkuaXRlcmF0b3IoKTsgZWRnZUl0ZXJhdG9yLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIEVkZ2UgZWRnZSA9IChFZGdlKSBlZGdlSXRlcmF0b3IubmV4dCgpOworCQkJZmluYWwgTGFiZWwgbGFiZWwgPSBlZGdlLmdldExhYmVsKCk7CisJCQkvLyBJcyBpdCBhIGR5bmFtaWMgbGFiZWw/CisJCQlpZiAobGFiZWwgaW5zdGFuY2VvZiBEeW5hbWljTGFiZWwpIHsKKwkJCQlmaW5hbCBEeW5hbWljTGFiZWwgZHluYW1pY0xhYmVsID0gKER5bmFtaWNMYWJlbCkgbGFiZWw7CisJCQkJYXNzZXJ0VHJ1ZSh2YWx1ZXNTd2FwcGVkKGR5bmFtaWNMYWJlbCkpOworCQkJfQorCQl9IC8vIGZvciBlYWNoIGVkZ2UKKwl9IC8vIHRlc3RTd2l0Y2hUb05leHRWYWx1ZQorCisJLyoqCisJICogVGVzdCB0aGUgR3JhcGggaGFzIHRoZSByaWdodCB0eXBlIFVSSS4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlVVJJKCkgeworCQlmaW5hbCBHcmFwaCBncmFwaCA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShncmFwaC5nZXRUeXBlVVJJKCkuZXF1YWxzKFNURU1VUkkuR1JBUEhfVFlQRV9VUkkpKTsKKwl9IC8vIHRlc3RHZXRUeXBlVVJJCisKKwkvKioKKwkgKiBUZXN0IHRoYXQgd2hlbiB0aGUgVVJJIGlzIHNldCBmb3IgdGhlIGdyYXBoLCB0aGUgdGFyZ2V0IFVSSSBvZiBhbnkKKwkgKiBHcmFwaExhYmVscyBpdCBoYXMgYWxzbyBhcmUgdXBkYXRlZCB0byB0aGUgbmV3IFVSSSB2YWx1ZS4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTZXRVUklTZXRzR3JhcGhMYWJlbHMoKSB7CisJCWZpbmFsIEdyYXBoIGdyYXBoID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBVUkkgdXJpQmVmb3JlID0gZ3JhcGguZ2V0VVJJKCk7CisKKwkJZm9yIChmaW5hbCBJdGVyYXRvciBsYWJlbEl0ZXIgPSBncmFwaC5nZXRHcmFwaExhYmVscygpLnZhbHVlcygpCisJCQkJLml0ZXJhdG9yKCk7IGxhYmVsSXRlci5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBMYWJlbCBsYWJlbCA9IChMYWJlbCkgbGFiZWxJdGVyLm5leHQoKTsKKwkJCWFzc2VydFRydWUobGFiZWwuZ2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCgpLmVxdWFscygKKwkJCQkJZ3JhcGguZ2V0VVJJKCkpKTsKKwkJCWFzc2VydEZhbHNlKGxhYmVsLmdldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQoKS5lcXVhbHMoCisJCQkJCUdSQVBIMl9VUkkpKTsKKwkJfSAvLyBmb3IKKworCQlncmFwaC5zZXRVUkkoR1JBUEgyX1VSSSk7CisKKwkJZm9yIChmaW5hbCBJdGVyYXRvciBsYWJlbEl0ZXIgPSBncmFwaC5nZXRHcmFwaExhYmVscygpLnZhbHVlcygpCisJCQkJLml0ZXJhdG9yKCk7IGxhYmVsSXRlci5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBMYWJlbCBsYWJlbCA9IChMYWJlbCkgbGFiZWxJdGVyLm5leHQoKTsKKwkJCWFzc2VydFRydWUobGFiZWwuZ2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCgpLmVxdWFscygKKwkJCQkJZ3JhcGguZ2V0VVJJKCkpKTsKKwkJCWFzc2VydEZhbHNlKGxhYmVsLmdldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQoKS5lcXVhbHMoCisJCQkJCXVyaUJlZm9yZSkpOworCQl9IC8vIGZvcgorCX0gLy8gdGVzdFNldFVSSVNldHNHcmFwaExhYmVscworCisJLyoqCisJICogVGVzdCB0aGUgYWJpbGl0eSB0byBzZXJpYWxpemUgYSBncmFwaCBhbmQgdGhlbiBkZS1zZXJpYWxpemUgaXQuCisJICovCisJcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZURlc2VyaWFsaXplKCkgeworCQlmaW5hbCBHcmFwaCBncmFwaCA9IGdldEZpeHR1cmUoKTsKKworCQlhc3NlcnQgZ3JhcGguc2FuZSgpOworCQl0cnkgeworCQkJVXRpbGl0eS5zZXJpYWxpemVJZGVudGlmaWFibGUoZ3JhcGgsIFNFUklBTFpBVElPTl9URVNUX1VSSSk7CisKKwkJCWZpbmFsIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOworCQkJZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZSgKKwkJCQkJU0VSSUFMWkFUSU9OX1RFU1RfVVJJLCB0cnVlKTsKKworCQkJcmVzb3VyY2UubG9hZChudWxsKTsKKworCQkJZmluYWwgR3JhcGggZGVzZXJpYWxpemVkR3JhcGggPSAoR3JhcGgpIHJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KAorCQkJCQkwKTsKKwkJCWFzc2VydE5vdE51bGwoZGVzZXJpYWxpemVkR3JhcGgpOworCQkJYXNzZXJ0VHJ1ZShncmFwaC5nZXROdW1FZGdlcygpID09IGRlc2VyaWFsaXplZEdyYXBoLmdldE51bUVkZ2VzKCkpOworCQkJYXNzZXJ0VHJ1ZShncmFwaC5nZXROdW1Ob2RlcygpID09IGRlc2VyaWFsaXplZEdyYXBoLmdldE51bU5vZGVzKCkpOworCQkJYXNzZXJ0VHJ1ZShncmFwaC5nZXROdW1EeW5hbWljTGFiZWxzKCkgPT0gZGVzZXJpYWxpemVkR3JhcGgKKwkJCQkJLmdldE51bUR5bmFtaWNMYWJlbHMoKSk7CisJCQlhc3NlcnRUcnVlKGdyYXBoLmdldE51bUdyYXBoTGFiZWxzKCkgPT0gZGVzZXJpYWxpemVkR3JhcGgKKwkJCQkJLmdldE51bUdyYXBoTGFiZWxzKCkpOworCQkJYXNzZXJ0VHJ1ZShncmFwaC5nZXROdW1Ob2RlTGFiZWxzKCkgPT0gZGVzZXJpYWxpemVkR3JhcGgKKwkJCQkJLmdldE51bU5vZGVMYWJlbHMoKSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOworCQl9IC8vIGNhdGNoCisJCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKwkJCWZhaWwobnBlLmdldE1lc3NhZ2UoKSk7CisJCX0gLy8gbnVsbCBwb2ludGVyIGV4Y2VwdGlvbgorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOworCQl9CisKKwl9IC8vIHRlc3RTZXJpYWxpemVEZXNlcmlhbGl6ZQorCisJLyoqCisJICogQHBhcmFtIGxhYmVsCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBsYWJlbHMgaGF2ZSBiZWVuIHN3YXBwZWQgZnJvbSB0aGVpciBvcmlnaW5hbCB2YWx1ZXMuCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gdmFsdWVzU3dhcHBlZChmaW5hbCBMYWJlbCBsYWJlbCkgeworCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisKKwkJLy8gSXMgaXQgYSBkeW5hbWljIGxhYmVsPworCQlpZiAobGFiZWwgaW5zdGFuY2VvZiBEeW5hbWljTGFiZWwpIHsKKwkJCWZpbmFsIER5bmFtaWNMYWJlbCBkeW5hbWljTGFiZWwgPSAoRHluYW1pY0xhYmVsKSBsYWJlbDsKKwkJCXJldFZhbHVlID0gKChUZXN0SW50ZWdlckxhYmVsVmFsdWUpIGxhYmVsLmdldEN1cnJlbnRWYWx1ZSgpKS5nZXRJKCkgPT0gVGVzdEludGVnZXJMYWJlbFZhbHVlLk5FWFRfTEFCRUxfSU5URUdFUl9WQUxVRTsKKwkJCXJldFZhbHVlID0gcmV0VmFsdWUKKwkJCQkJJiYgKChUZXN0SW50ZWdlckxhYmVsVmFsdWUpIGR5bmFtaWNMYWJlbC5nZXROZXh0VmFsdWUoKSkKKwkJCQkJCQkuZ2V0SSgpID09IFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZS5DVVJSRU5UX0xBQkVMX0lOVEVHRVJfVkFMVUU7CisJCX0gZWxzZSB7CisJCQlyZXRWYWx1ZSA9ICgoVGVzdEludGVnZXJMYWJlbFZhbHVlKSBsYWJlbC5nZXRDdXJyZW50VmFsdWUoKSkuZ2V0SSgpICE9IFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZS5DVVJSRU5UX0xBQkVMX0lOVEVHRVJfVkFMVUU7CisJCX0KKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gdmFsdWVzU3dhcHBlZAorCit9IC8vIEdyYXBoVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvR3JhcGhUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvR3JhcGhUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZGNjM2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9HcmFwaFRlc3RzLmphdmEKQEAgLTAsMCArMSw1NiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IHN1aXRlIGZvciB0aGUgJzxlbT48Yj5ncmFwaDwvYj48L2VtPicgcGFja2FnZS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR3JhcGhUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBHcmFwaFRlc3RzKCJncmFwaCBUZXN0cyIpOyAvLyROT04tTkxTLTEkCisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFZGdlVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShHcmFwaFRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTm9kZVRlc3QuY2xhc3MpOworCQlyZXR1cm4gc3VpdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEdyYXBoVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCit9IC8vR3JhcGhUZXN0cwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvR3JhcGhUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL0dyYXBoVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5MzBhYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL0dyYXBoVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSw2MiBAQAorLy8gR3JhcGhUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy50aW1lLlRpbWVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLnRpbWUuVGltZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy50aW1lLlRpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbFRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlci5HcmFwaFRpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBKVW5pdCB0ZXN0IG9mIHRoZSB7QGxpbmsgR3JhcGhUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeX0uCisgKi8KK3B1YmxpYyBjbGFzcyBHcmFwaFRpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdCBleHRlbmRzCisJCVRpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbFRlc3QgeworCisJcHJpdmF0ZSBmaW5hbCBTVEVNVGltZSBURVNUX1RJTUUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNURU1UaW1lKCk7CisJCisJLyoqCisJICogQHNlZQorCSAqIAlvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLnRpbWUuVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsVGVzdAorCSAqIAkjY3JlYXRlRml4dHVyZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFRpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUZpeHR1cmUoKSB7CisJCXJldHVybiBuZXcgR3JhcGhUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOworCX0KKworCXByaXZhdGUgR3JhcGhUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKEdyYXBoVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpIGZpeHR1cmU7CisJfSAvLyBnZXRGaXh0dXJlCisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRhcHRHcmFwaCgpIHsKKwkJZmluYWwgR3JhcGhUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBHcmFwaCBncmFwaCA9IEdyYXBoVGVzdC5jcmVhdGVGaXh0dXJlKCk7CisKKwkJZmluYWwgVGltZVByb3ZpZGVyIHRwID0gKFRpbWVQcm92aWRlcikgZml4dHVyZS5hZGFwdChncmFwaCwKKwkJCQlUaW1lUHJvdmlkZXIuY2xhc3MpOworCQlhc3NlcnROb3ROdWxsKHRwKTsKKworCQlTVEVNVGltZSBncmFwaFRpbWUgPSB0cC5nZXRUaW1lKCk7CisJCWFzc2VydE51bGwoZ3JhcGhUaW1lKTsKKwkJCisJCWdyYXBoLnN3aXRjaFRvTmV4dFZhbHVlKFRFU1RfVElNRSk7CisJCWdyYXBoVGltZSA9IHRwLmdldFRpbWUoKTsKKwkJCisJCWFzc2VydE5vdE51bGwoZ3JhcGhUaW1lKTsKKwkJYXNzZXJ0VHJ1ZShncmFwaFRpbWUuZXF1YWxzKFRFU1RfVElNRSkpOworCX0gLy8gdGVzdEFkYXB0R3JhcGgKK30gLy8gR3JhcGhUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9MYWJlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL0xhYmVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMGFkOTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9MYWJlbFRlc3QuamF2YQpAQCAtMCwwICsxLDExOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvL2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi50ZXN0cy5JZGVudGlmaWFibGVUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuVGVzdFV0aWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5MYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgdGVzdGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbCNnZXRJZGVudGlmaWFibGUoKSA8ZW0+SWRlbnRpZmlhYmxlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGFic3RyYWN0IGNsYXNzIExhYmVsVGVzdCBleHRlbmRzIElkZW50aWZpYWJsZVRlc3QgeworCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBMYWJlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGFiZWxUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTGFiZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBMYWJlbCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKExhYmVsKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsI2dldElkZW50aWZpYWJsZSgpIDxlbT5JZGVudGlmaWFibGU8L2VtPn0nIGZlYXR1cmUgZ2V0dGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWwjZ2V0SWRlbnRpZmlhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRJZGVudGlmaWFibGUoKSB7CisJCWZpbmFsIExhYmVsIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCWZpeHR1cmUuc2V0SWRlbnRpZmlhYmxlKG51bGwpOworCQlhc3NlcnROdWxsKGZpeHR1cmUuZ2V0SWRlbnRpZmlhYmxlKCkpOworCX0KKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbCNzZXRJZGVudGlmaWFibGUob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUpIDxlbT5JZGVudGlmaWFibGU8L2VtPn0nIGZlYXR1cmUgc2V0dGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWwjc2V0SWRlbnRpZmlhYmxlKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdFNldElkZW50aWZpYWJsZSgpIHsKKwkJZmluYWwgTGFiZWwgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJZml4dHVyZS5zZXRJZGVudGlmaWFibGUobnVsbCk7CisJCWFzc2VydE51bGwoZml4dHVyZS5nZXRJZGVudGlmaWFibGUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCX0gLy8gc2V0VXAKKworCS8qKgorCSAqIEByZXR1cm4gYSBzdGF0aWMgbGFiZWwgZm9yIHRlc3RpbmcKKwkgKi8KKwlwdWJsaWMgTGFiZWwgY3JlYXRlRml4dHVyZSgpIHsKKwkJcmV0dXJuIFRlc3RVdGlsLmNyZWF0ZVN0YXRpY0xhYmVsKFRlc3RVdGlsCisJCQkJLmNyZWF0ZU5leHRJZGVudGlmaWFibGVUb0xhYmVsVVJJKCkpOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJLyoqCisJICogVGVzdCB0aGUgc2FuaXR5IG9mIHRoZSBmaXh0dXJlCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdGVzdFNhbmUoKSB7CisJCWZpbmFsIExhYmVsIGxhYmVsID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGxhYmVsLnNhbmUoKSk7CisJfSAvLyB0ZXN0U2FuZQorCisJLyoqCisJICogVGVzdCB0aGUgTGFiZWwgaGFzIHRoZSByaWdodCB0eXBlIFVSSS4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlVVJJKCkgeworCQlmaW5hbCBMYWJlbCBsYWJlbCA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShsYWJlbC5nZXRUeXBlVVJJKCkuZXF1YWxzKExhYmVsLlVSSV9UWVBFX0xBQkVMKSk7CisJfSAvLyB0ZXN0R2V0VHlwZVVSSQorCit9IC8vIExhYmVsVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvTGFiZWxWYWx1ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL0xhYmVsVmFsdWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAzNDk5ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL0xhYmVsVmFsdWVUZXN0LmphdmEKQEAgLTAsMCArMSw4MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGFiZWwgVmFsdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBhcmUgdGVzdGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlI3Jlc2V0KCkgPGVtPlJlc2V0PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMYWJlbFZhbHVlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBMYWJlbCBWYWx1ZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIExhYmVsVmFsdWUgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IExhYmVsIFZhbHVlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMYWJlbFZhbHVlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIExhYmVsIFZhbHVlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKExhYmVsVmFsdWUgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBMYWJlbFZhbHVlIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIEFic3RyYWN0IHNpbmNlIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudAorCSAqIHRoaXMgdGVzdC4KKwkgKiAKKwkgKiAKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZSNyZXNldCgpIDxlbT5SZXNldDwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZSNyZXNldCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0ZXN0UmVzZXQoKTsKKworfSAvL0xhYmVsVmFsdWVUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9Ob2RlTGFiZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9Ob2RlTGFiZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjMzZjOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL05vZGVMYWJlbFRlc3QuamF2YQpAQCAtMCwwICsxLDQ0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5vZGUgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlTGFiZWxUZXN0IGV4dGVuZHMgTGFiZWxUZXN0IHsKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IE5vZGUgTGFiZWwgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vZGVMYWJlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBOb2RlIExhYmVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTm9kZUxhYmVsIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoTm9kZUxhYmVsKWZpeHR1cmU7CisJfQorCit9IC8vTm9kZUxhYmVsVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvTm9kZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL05vZGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2NjhkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL05vZGVUZXN0LmphdmEKQEAgLTAsMCArMSw5OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvL2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnRlc3RzLklkZW50aWZpYWJsZVRlc3Q7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5UZXN0VXRpbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5vZGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIE5vZGVUZXN0IGV4dGVuZHMgSWRlbnRpZmlhYmxlVGVzdCB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihOb2RlVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBOb2RlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb2RlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIE5vZGUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBOb2RlIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoTm9kZSlmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoVGVzdFV0aWwuY3JlYXRlU3RhdGljYWxseUxhYmVsZWROb2RlKCkpOworCX0gLy8gc2V0VXAKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IHRoZSBzYW5pdHkgb2YgdGhlIGZpeHR1cmUKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2FuZSgpIHsKKwkJZmluYWwgTm9kZSBub2RlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKG5vZGUuc2FuZSgpKTsKKwl9IC8vIHRlc3RTYW5lCisKKwkvKioKKwkgKiBUZXN0IHRoZSBOb2RlIGhhcyB0aGUgcmlnaHQgdHlwZSBVUkkuCisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZVVSSSgpIHsKKwkJZmluYWwgTm9kZSBub2RlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKG5vZGUuZ2V0VHlwZVVSSSgpLmVxdWFscyhTVEVNVVJJLk5PREVfVFlQRV9VUkkpKTsKKwl9IC8vIHRlc3RHZXRUeXBlVVJJCisKK30gLy8gTm9kZVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL1Nhbml0eUNoZWNrZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9TYW5pdHlDaGVja2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNWE3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9TYW5pdHlDaGVja2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TYW5pdHkgQ2hlY2tlcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNhbml0eUNoZWNrZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgU2FuaXR5IENoZWNrZXIgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTYW5pdHlDaGVja2VyIGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBTYW5pdHkgQ2hlY2tlciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU2FuaXR5Q2hlY2tlclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTYW5pdHkgQ2hlY2tlciB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShTYW5pdHlDaGVja2VyIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNhbml0eSBDaGVja2VyIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU2FuaXR5Q2hlY2tlciBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKK30gLy9TYW5pdHlDaGVja2VyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvU3RhdGljRWRnZUxhYmVsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvU3RhdGljRWRnZUxhYmVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMmY2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9TdGF0aWNFZGdlTGFiZWxUZXN0LmphdmEKQEAgLTAsMCArMSw0NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY0VkZ2VMYWJlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdGF0aWMgRWRnZSBMYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFN0YXRpY0VkZ2VMYWJlbFRlc3QgZXh0ZW5kcyBFZGdlTGFiZWxUZXN0IHsKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFN0YXRpYyBFZGdlIExhYmVsIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdGF0aWNFZGdlTGFiZWxUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU3RhdGljIEVkZ2UgTGFiZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdGF0aWNFZGdlTGFiZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChTdGF0aWNFZGdlTGFiZWwpZml4dHVyZTsKKwl9CisKK30gLy9TdGF0aWNFZGdlTGFiZWxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9TdGF0aWNMYWJlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL1N0YXRpY0xhYmVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlN2YzMWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9TdGF0aWNMYWJlbFRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljTGFiZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RhdGljIExhYmVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhdGljTGFiZWxUZXN0IGV4dGVuZHMgTGFiZWxUZXN0IHsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgU3RhdGljIExhYmVsIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdGF0aWNMYWJlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTdGF0aWMgTGFiZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdGF0aWNMYWJlbCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFN0YXRpY0xhYmVsKWZpeHR1cmU7CisJfQorCit9IC8vU3RhdGljTGFiZWxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9TdGF0aWNOb2RlTGFiZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9TdGF0aWNOb2RlTGFiZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNkNDRiMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL1N0YXRpY05vZGVMYWJlbFRlc3QuamF2YQpAQCAtMCwwICsxLDUyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljTm9kZUxhYmVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RhdGljIE5vZGUgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGF0aWNOb2RlTGFiZWxUZXN0IGV4dGVuZHMgTm9kZUxhYmVsVGVzdCB7CisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBTdGF0aWMgTm9kZSBMYWJlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0YXRpY05vZGVMYWJlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTdGF0aWMgTm9kZSBMYWJlbCB0ZXN0IGNhc2UuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdGF0aWNOb2RlTGFiZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChTdGF0aWNOb2RlTGFiZWwpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiB0ZXN0IGxhYmVsTm9kZQorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdExhYmVsTm9kZSgpIHsKKwkJZmFpbCgpOworCX0gLy8gdGVzdExhYmVsTm9kZQorCit9IC8vIFN0YXRpY05vZGVMYWJlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL1VSSVRvRWRnZU1hcEVudHJ5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvVVJJVG9FZGdlTWFwRW50cnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2YTY0ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL1VSSVRvRWRnZU1hcEVudHJ5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTExIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVSSSBUbyBFZGdlIE1hcCBFbnRyeTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgVVJJVG9FZGdlTWFwRW50cnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgVVJJIFRvIEVkZ2UgTWFwIEVudHJ5IHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwLkVudHJ5PFVSSSwgRWRnZT4gZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFVSSVRvRWRnZU1hcEVudHJ5VGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBVUkkgVG8gRWRnZSBNYXAgRW50cnkgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVSSVRvRWRnZU1hcEVudHJ5VGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFVSSSBUbyBFZGdlIE1hcCBFbnRyeSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShNYXAuRW50cnk8VVJJLCBFZGdlPiBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBVUkkgVG8gRWRnZSBNYXAgRW50cnkgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXAuRW50cnk8VVJJLCBFZGdlPiBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZSgoTWFwLkVudHJ5PFVSSSwgRWRnZT4pR3JhcGhGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoR3JhcGhQYWNrYWdlLkxpdGVyYWxzLlVSSV9UT19FREdFX01BUF9FTlRSWSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIEtlZXBzIEpVbml0IHF1aWV0CisJICovCisJcHVibGljIHZvaWQgdGVzdE5vdGhpbmcoKSB7CisJCWFzc2VydFRydWUodHJ1ZSk7CisJfSAvLyB0ZXN0Tm90aGluZworfSAvL1VSSVRvRWRnZU1hcEVudHJ5VGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL1VSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5ZWFiNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL1VSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnlUZXN0LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5VUkkgVG8gSWRlbnRpZmlhYmxlIE1hcCBFbnRyeTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgVVJJVG9JZGVudGlmaWFibGVNYXBFbnRyeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBVUkkgVG8gSWRlbnRpZmlhYmxlIE1hcCBFbnRyeSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1hcC5FbnRyeTxVUkksIElkZW50aWZpYWJsZT4gZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFVSSVRvSWRlbnRpZmlhYmxlTWFwRW50cnlUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFVSSSBUbyBJZGVudGlmaWFibGUgTWFwIEVudHJ5IHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVUklUb0lkZW50aWZpYWJsZU1hcEVudHJ5VGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFVSSSBUbyBJZGVudGlmaWFibGUgTWFwIEVudHJ5IHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKE1hcC5FbnRyeTxVUkksIElkZW50aWZpYWJsZT4gZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgVVJJIFRvIElkZW50aWZpYWJsZSBNYXAgRW50cnkgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXAuRW50cnk8VVJJLCBJZGVudGlmaWFibGU+IGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKChNYXAuRW50cnk8VVJJLCBJZGVudGlmaWFibGU+KUdyYXBoRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKEdyYXBoUGFja2FnZS5MaXRlcmFscy5VUklfVE9fSURFTlRJRklBQkxFX01BUF9FTlRSWSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKwkKKwkvKioKKwkgKiBLZWVwcyBKVW5pdCBxdWlldAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3ROb3RoaW5nKCkgeworCQlhc3NlcnRUcnVlKHRydWUpOworCX0gLy8gdGVzdE5vdGhpbmcKK30gLy9VUklUb0lkZW50aWZpYWJsZU1hcEVudHJ5VGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvVVJJVG9MYWJlbE1hcEVudHJ5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvVVJJVG9MYWJlbE1hcEVudHJ5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZWJmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9VUklUb0xhYmVsTWFwRW50cnlUZXN0LmphdmEKQEAgLTAsMCArMSwxMTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVSSSBUbyBMYWJlbCBNYXAgRW50cnk8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFVSSVRvTGFiZWxNYXBFbnRyeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBVUkkgVG8gTGFiZWwgTWFwIEVudHJ5IHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwLkVudHJ5PFVSSSwgTGFiZWw+IGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihVUklUb0xhYmVsTWFwRW50cnlUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFVSSSBUbyBMYWJlbCBNYXAgRW50cnkgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVSSVRvTGFiZWxNYXBFbnRyeVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBVUkkgVG8gTGFiZWwgTWFwIEVudHJ5IHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKE1hcC5FbnRyeTxVUkksIExhYmVsPiBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBVUkkgVG8gTGFiZWwgTWFwIEVudHJ5IHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwLkVudHJ5PFVSSSwgTGFiZWw+IGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKChNYXAuRW50cnk8VVJJLCBMYWJlbD4pR3JhcGhGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoR3JhcGhQYWNrYWdlLkxpdGVyYWxzLlVSSV9UT19MQUJFTF9NQVBfRU5UUlkpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBLZWVwcyBKVW5pdCBxdWlldAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3ROb3RoaW5nKCkgeworCQlhc3NlcnRUcnVlKHRydWUpOworCX0gLy8gdGVzdE5vdGhpbmcKK30gLy9VUklUb0xhYmVsTWFwRW50cnlUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC90ZXN0cy9VUklUb05vZGVMYWJlbE1hcEVudHJ5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvVVJJVG9Ob2RlTGFiZWxNYXBFbnRyeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDBkYjY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvVVJJVG9Ob2RlTGFiZWxNYXBFbnRyeVRlc3QuamF2YQpAQCAtMCwwICsxLDExMSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVSSSBUbyBOb2RlIExhYmVsIE1hcCBFbnRyeTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgVVJJVG9Ob2RlTGFiZWxNYXBFbnRyeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBVUkkgVG8gTm9kZSBMYWJlbCBNYXAgRW50cnkgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXAuRW50cnk8VVJJLCBOb2RlTGFiZWw+IGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihVUklUb05vZGVMYWJlbE1hcEVudHJ5VGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBVUkkgVG8gTm9kZSBMYWJlbCBNYXAgRW50cnkgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVSSVRvTm9kZUxhYmVsTWFwRW50cnlUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgVVJJIFRvIE5vZGUgTGFiZWwgTWFwIEVudHJ5IHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKE1hcC5FbnRyeTxVUkksIE5vZGVMYWJlbD4gZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgVVJJIFRvIE5vZGUgTGFiZWwgTWFwIEVudHJ5IHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwLkVudHJ5PFVSSSwgTm9kZUxhYmVsPiBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZSgoTWFwLkVudHJ5PFVSSSwgTm9kZUxhYmVsPilHcmFwaEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShHcmFwaFBhY2thZ2UuTGl0ZXJhbHMuVVJJX1RPX05PREVfTEFCRUxfTUFQX0VOVFJZKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogS2VlcHMgSlVuaXQgcXVpZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Tm90aGluZygpIHsKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwl9IC8vIHRlc3ROb3RoaW5nCit9IC8vVVJJVG9Ob2RlTGFiZWxNYXBFbnRyeVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL1VSSVRvTm9kZU1hcEVudHJ5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvVVJJVG9Ob2RlTWFwRW50cnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlYWMyZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL1VSSVRvTm9kZU1hcEVudHJ5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTExIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVSSSBUbyBOb2RlIE1hcCBFbnRyeTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgVVJJVG9Ob2RlTWFwRW50cnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgVVJJIFRvIE5vZGUgTWFwIEVudHJ5IHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwLkVudHJ5PFVSSSwgTm9kZT4gZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFVSSVRvTm9kZU1hcEVudHJ5VGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBVUkkgVG8gTm9kZSBNYXAgRW50cnkgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVSSVRvTm9kZU1hcEVudHJ5VGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFVSSSBUbyBOb2RlIE1hcCBFbnRyeSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShNYXAuRW50cnk8VVJJLCBOb2RlPiBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBVUkkgVG8gTm9kZSBNYXAgRW50cnkgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXAuRW50cnk8VVJJLCBOb2RlPiBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZSgoTWFwLkVudHJ5PFVSSSwgTm9kZT4pR3JhcGhGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoR3JhcGhQYWNrYWdlLkxpdGVyYWxzLlVSSV9UT19OT0RFX01BUF9FTlRSWSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIEtlZXBzIEpVbml0IHF1aWV0CisJICovCisJcHVibGljIHZvaWQgdGVzdE5vdGhpbmcoKSB7CisJCWFzc2VydFRydWUodHJ1ZSk7CisJfSAvLyB0ZXN0Tm90aGluZworfSAvL1VSSVRvTm9kZU1hcEVudHJ5VGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvdGVzdHMvVW5yZXNvbHZlZElkZW50aWZpYWJsZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL1VucmVzb2x2ZWRJZGVudGlmaWFibGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI0M2I3YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoL3Rlc3RzL1VucmVzb2x2ZWRJZGVudGlmaWFibGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMDMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlVucmVzb2x2ZWRJZGVudGlmaWFibGU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VW5yZXNvbHZlZCBJZGVudGlmaWFibGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFVucmVzb2x2ZWRJZGVudGlmaWFibGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFVucmVzb2x2ZWQgSWRlbnRpZmlhYmxlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVW5yZXNvbHZlZElkZW50aWZpYWJsZSBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oVW5yZXNvbHZlZElkZW50aWZpYWJsZVRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgVW5yZXNvbHZlZCBJZGVudGlmaWFibGUgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVucmVzb2x2ZWRJZGVudGlmaWFibGVUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgVW5yZXNvbHZlZCBJZGVudGlmaWFibGUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoVW5yZXNvbHZlZElkZW50aWZpYWJsZSBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBVbnJlc29sdmVkIElkZW50aWZpYWJsZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFVucmVzb2x2ZWRJZGVudGlmaWFibGUgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoR3JhcGhGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVbnJlc29sdmVkSWRlbnRpZmlhYmxlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIEtlZXAgSlVuaXQgcXVpZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0S2VlcEpVbml0UXVpZXQoKSB7CisJCWFzc2VydFRydWUodHJ1ZSk7CisJfQorfSAvL1VucmVzb2x2ZWRJZGVudGlmaWFibGVUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC90ZXN0cy9Db21wYXJhYmxlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvdGVzdHMvQ29tcGFyYWJsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzU1NWIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvdGVzdHMvQ29tcGFyYWJsZVRlc3QuamF2YQpAQCAtMCwwICsxLDYyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29tcGFyYWJsZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBhcmFibGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgQ29tcGFyYWJsZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbXBhcmFibGU8Pz4gZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IENvbXBhcmFibGUgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbXBhcmFibGVUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgQ29tcGFyYWJsZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShDb21wYXJhYmxlPD8+IGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIENvbXBhcmFibGUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wYXJhYmxlPD8+IGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworfSAvL0NvbXBhcmFibGVUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC90ZXN0cy9EZWNvcmF0b3JUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC90ZXN0cy9EZWNvcmF0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiZGM5ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Rlc3RzL0RlY29yYXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDE2OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvL2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi50ZXN0cy5JZGVudGlmaWFibGVUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlY29yYXRvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSB0ZXN0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvciNkZWNvcmF0ZUdyYXBoKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSkgPGVtPkRlY29yYXRlIEdyYXBoPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yI3VwZGF0ZUxhYmVscyhvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIGxvbmcsIGludCkgPGVtPlVwZGF0ZSBMYWJlbHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IjcmVzZXRMYWJlbHMoKSA8ZW0+UmVzZXQgTGFiZWxzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yI2dldExhYmVsc1RvVXBkYXRlKGludCwgaW50KSA8ZW0+R2V0IExhYmVscyBUbyBVcGRhdGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IjcHJlcGFyZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWwsIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSkgPGVtPlByZXBhcmU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgRGVjb3JhdG9yVGVzdCBleHRlbmRzIElkZW50aWZpYWJsZVRlc3QgeworCQorCXB1YmxpYyBzdGF0aWMgVVJJIERFQ09SQVRPUl9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSSgiZGVjb3JhdG9yL2RlY29yYXRvclRlc3QuZGVjb3JhdG9yIik7CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihEZWNvcmF0b3JUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IERlY29yYXRvciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERlY29yYXRvclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEZWNvcmF0b3IgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBEZWNvcmF0b3IgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChEZWNvcmF0b3IpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJZmluYWwgRGVjb3JhdG9yIGQgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlY29yYXRvcigpOworCQlkLnNldFVSSShERUNPUkFUT1JfVVJJKTsKKwkJc2V0Rml4dHVyZShkKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yI2RlY29yYXRlR3JhcGgob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lKSA8ZW0+RGVjb3JhdGUgR3JhcGg8L2VtPn0nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvciNkZWNvcmF0ZUdyYXBoKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgdGVzdERlY29yYXRlR3JhcGhfX1NURU1UaW1lKCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBvcGVyYXRpb24gdGVzdCBtZXRob2QKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJZmFpbCgpOworCX0KKworCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvciN1cGRhdGVMYWJlbHMob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lLCBsb25nLCBpbnQpIDxlbT5VcGRhdGUgTGFiZWxzPC9lbT59JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IjdXBkYXRlTGFiZWxzKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSwgbG9uZywgaW50KQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUxhYmVsc19fU1RFTVRpbWVfbG9uZ19pbnQoKSB7CisJCWFzc2VydFRydWUodHJ1ZSk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvciN1cGRhdGVMYWJlbHMob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lLCBsb25nKSA8ZW0+VXBkYXRlIExhYmVsczwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yI3VwZGF0ZUxhYmVscyhvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIGxvbmcpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTGFiZWxzX19TVEVNVGltZV9sb25nKCkgeworCQlhc3NlcnRUcnVlKHRydWUpOworCX0KKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IjcmVzZXRMYWJlbHMoKSA8ZW0+UmVzZXQgTGFiZWxzPC9lbT59JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IjcmVzZXRMYWJlbHMoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdFJlc2V0TGFiZWxzKCkgeworCQlhc3NlcnRUcnVlKHRydWUpOworCX0KKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IjZ2V0TGFiZWxzVG9VcGRhdGUoaW50LCBpbnQpIDxlbT5HZXQgTGFiZWxzIFRvIFVwZGF0ZTwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yI2dldExhYmVsc1RvVXBkYXRlKGludCwgaW50KQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldExhYmVsc1RvVXBkYXRlX19pbnRfaW50KCkgeworCQlhc3NlcnRUcnVlKHRydWUpOworCX0KKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IjcHJlcGFyZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWwsIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSkgPGVtPlByZXBhcmU8L2VtPn0nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvciNwcmVwYXJlKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbCwgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0UHJlcGFyZV9fTW9kZWxfU1RFTVRpbWUoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG9wZXJhdGlvbiB0ZXN0IG1ldGhvZAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQlmYWlsKCk7CisJfQorCit9IC8vIERlY29yYXRvclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Rlc3RzL0VkZ2VEZWNvcmF0b3JUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC90ZXN0cy9FZGdlRGVjb3JhdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YmU1N2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC90ZXN0cy9FZGdlRGVjb3JhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRWRnZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWRnZSBEZWNvcmF0b3I8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEVkZ2VEZWNvcmF0b3JUZXN0IGV4dGVuZHMgRGVjb3JhdG9yVGVzdCB7CisJCisJcHVibGljIHN0YXRpYyBVUkkgREVDT1JBVE9SX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKCJkZWNvcmF0b3IvZWRnZURlY29yYXRvclRlc3QuZGVjb3JhdG9yIik7CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oRWRnZURlY29yYXRvclRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgRWRnZSBEZWNvcmF0b3IgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGdlRGVjb3JhdG9yVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEVkZ2UgRGVjb3JhdG9yIHRlc3QgY2FzZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVkZ2VEZWNvcmF0b3IgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChFZGdlRGVjb3JhdG9yKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQkKKwkJRWRnZURlY29yYXRvciBkID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFZGdlRGVjb3JhdG9yKCk7CisJCWQuc2V0VVJJKERFQ09SQVRPUl9VUkkpOworCQkKKwkJc2V0Rml4dHVyZShkKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogVGVzdCB0aGUgc2FuaXR5IG9mIHRoZSBmaXh0dXJlCisJICovCisJcHVibGljIHZvaWQgdGVzdFNhbmUoKSB7CisJCWZpbmFsIEVkZ2VEZWNvcmF0b3IgZWRnZURlY29yYXRvciA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShlZGdlRGVjb3JhdG9yLnNhbmUoKSk7CisJfSAvLyB0ZXN0U2FuZQorCisKK30gLy8gRWRnZURlY29yYXRvclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Rlc3RzL0dyYXBoRGVjb3JhdG9yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvdGVzdHMvR3JhcGhEZWNvcmF0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAxNjFlMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Rlc3RzL0dyYXBoRGVjb3JhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuR3JhcGhEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoIERlY29yYXRvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgR3JhcGhEZWNvcmF0b3JUZXN0IGV4dGVuZHMgRGVjb3JhdG9yVGVzdCB7CisJCisJcHVibGljIHN0YXRpYyBVUkkgREVDT1JBVE9SX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKCJkZWNvcmF0b3IvZ3JhcGhEZWNvcmF0b3JUZXN0LmRlY29yYXRvciIpOworCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKEdyYXBoRGVjb3JhdG9yVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBHcmFwaCBEZWNvcmF0b3IgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHcmFwaERlY29yYXRvclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBHcmFwaCBEZWNvcmF0b3IgdGVzdCBjYXNlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgR3JhcGhEZWNvcmF0b3IgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChHcmFwaERlY29yYXRvcilmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCisJCUdyYXBoRGVjb3JhdG9yIGQgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoRGVjb3JhdG9yKCk7CisJCWQuc2V0VVJJKERFQ09SQVRPUl9VUkkpOworCQlzZXRGaXh0dXJlKGQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IHRoZSBzYW5pdHkgb2YgdGhlIGZpeHR1cmUKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2FuZSgpIHsKKwkJZmluYWwgR3JhcGhEZWNvcmF0b3IgZ3JhcGhEZWNvcmF0b3IgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoZ3JhcGhEZWNvcmF0b3Iuc2FuZSgpKTsKKwl9IC8vIHRlc3RTYW5lCisKK30gLy8gR3JhcGhEZWNvcmF0b3JUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC90ZXN0cy9Nb2RlbEFsbFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC90ZXN0cy9Nb2RlbEFsbFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxMjQxOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Rlc3RzL01vZGVsQWxsVGVzdHMuamF2YQpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3Qgc3VpdGUgZm9yIHRoZSAnPGVtPjxiPk1vZGVsPC9iPjwvZW0+JyBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTW9kZWxBbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBNb2RlbEFsbFRlc3RzKCJNb2RlbCBUZXN0cyIpOworCQlzdWl0ZS5hZGRUZXN0KE1vZGVsVGVzdHMuc3VpdGUoKSk7CisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTW9kZWxBbGxUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKK30gLy9Nb2RlbEFsbFRlc3RzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC90ZXN0cy9Nb2RlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Rlc3RzL01vZGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMzQ2MGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC90ZXN0cy9Nb2RlbFRlc3QuamF2YQpAQCAtMCwwICsxLDk5NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuSWRlbnRpZmlhYmxlRmlsdGVySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnRlc3RzLklkZW50aWZpYWJsZVRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRWRnZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuR3JhcGhEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5UZXN0VXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5EZWNvcmF0b3JzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5UZXN0RWRnZURlY29yYXRvcjE7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Nb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSB0ZXN0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsI2dldENhbm9uaWNhbEdyYXBoKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlRmlsdGVyLCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUpIDxlbT5HZXQgQ2Fub25pY2FsIEdyYXBoPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWwjcHJlcGFyZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUpIDxlbT5QcmVwYXJlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIE1vZGVsVGVzdCBleHRlbmRzIElkZW50aWZpYWJsZVRlc3QgeworCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIFNFUklBTFpBVElPTl9URVNUX1VSSSA9IFVSSQorCQkJLmNyZWF0ZVVSSSgidGVtcC90ZXN0bW9kZWwxLm1vZGVsIik7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUwgPSAibW9kZWwiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIID0gImdyYXBoIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbCI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERSA9ICJub2RlIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX0RFQ09SQVRPUiA9ICJub2RlZGVjb3JhdG9yIjsKKworCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFREdFX0RFQ09SQVRPUiA9ICJlZGdlZGVjb3JhdG9yIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFREdFID0gImVkZ2UiOworCisJLy8gTW9kZWwgVVJJJ3MKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFVSSSBNMF9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSShNT0RFTCArICIvIiArICJtMCIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIE0xX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKE1PREVMICsgIi8iICsgIm0xIik7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgTTJfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoTU9ERUwgKyAiLyIgKyAibTIiKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBNM19VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSShNT0RFTCArICIvIiArICJtMyIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIFVOUkVTT0xWRURfTU9ERUxfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoTU9ERUwKKwkJCSsgIi8iICsgInVucmVzb2x2ZWQiKTsKKworCS8vIEdyYXBoIFVSSSdzCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQ0FOT05JQ0FMX0dSQVBIMV9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSShHUkFQSAorCQkJKyAiLyIgKyAiY2Fub25pY2FsR3JhcGgxIik7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQ0FOT05JQ0FMX0dSQVBIMl9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSShHUkFQSAorCQkJKyAiLyIgKyAiY2Fub25pY2FsR3JhcGgyIik7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgRzBfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoR1JBUEggKyAiLyIgKyAiZzAiKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBHMV9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSShHUkFQSCArICIvIiArICJnMSIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEcyX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKEdSQVBIICsgIi8iICsgImcyIik7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgRzNfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoR1JBUEggKyAiLyIgKyAiZzMiKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBHNF9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSShHUkFQSCArICIvIiArICJnNCIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEc1X1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKEdSQVBIICsgIi8iICsgImc1Iik7CisKKwkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgR1JBUEhfUkVUVVJOX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKEdSQVBIICsgIi8iCisJLy8gKyAiZ3JhcGhfcmV0dXJuIik7CisKKwkvLyBHcmFwaCBMYWJlbCBVUkkncworCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBHX0wwX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKExBQkVMICsgIi8iICsgImdsMCIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEdfTDFfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoTEFCRUwgKyAiLyIgKyAiZ2wxIik7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgR19MMl9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSShMQUJFTCArICIvIiArICJnbDIiKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBHX0wzX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKExBQkVMICsgIi8iICsgImdsMyIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEdfTDRfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoTEFCRUwgKyAiLyIgKyAiZ2w0Iik7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgR19MNV9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSShMQUJFTCArICIvIiArICJnbDUiKTsKKworCS8vIFN0YXRpYyBOb2RlIExhYmVsIFVSSSdzCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIE5MMEEwX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKExBQkVMICsgIi8iCisJCQkrICJubDBhMCIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIE5MMEExX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKExBQkVMICsgIi8iCisJCQkrICJubDBhMSIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIE5MM0ExX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKExBQkVMICsgIi8iCisJCQkrICJubDNhMSIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIE5MM0IxX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKExBQkVMICsgIi8iCisJCQkrICJubDNiMSIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIE5MNEExX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKExBQkVMICsgIi8iCisJCQkrICJubDRhMSIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIE5MNEIxX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKExBQkVMICsgIi8iCisJCQkrICJubDRiMSIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIE5MNEMxX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKExBQkVMICsgIi8iCisJCQkrICJubDRjMSIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIE5MNUExX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKExBQkVMICsgIi8iCisJCQkrICJubDVhMSIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIE5MNUIxX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKExBQkVMICsgIi8iCisJCQkrICJubDViMSIpOworCisJLy8gTm9kZSBVUkkncworCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBOMEFfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoTk9ERSArICIvIiArICJuMGEiKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBONUFfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoTk9ERSArICIvIiArICJuNWEiKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBONUJfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoTk9ERSArICIvIiArICJuNWIiKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBOM0FfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoTk9ERSArICIvIiArICJuM2EiKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBOM0JfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoTk9ERSArICIvIiArICJuM2IiKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIE40QV9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSShOT0RFICsgIi8iICsgIm40YSIpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBVUkkgTjRCX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKE5PREUgKyAiLyIgKyAibjRiIik7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgTjRDX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKE5PREUgKyAiLyIgKyAibjRjIik7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgTjREX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKE5PREUgKyAiLyIgKyAibjRkIik7CisKKwkvLyBEZWNvcmF0b3IgVVJJJ3MKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgTkRFQ18wQV9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSShOT0RFX0RFQ09SQVRPUgorCQkJKyAiLyIgKyAibmRlY18wYSIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIE5ERUNfMkFfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoTk9ERV9ERUNPUkFUT1IKKwkJCSsgIi8iICsgIm5kZWNfMmEiKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBFREVDXzFBX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKE5PREVfREVDT1JBVE9SCisJCQkrICIvIiArICJlZGVjXzFhIik7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgRURFQ18zQV9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSShOT0RFX0RFQ09SQVRPUgorCQkJKyAiLyIgKyAiZWRlY18zYSIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEdERUNfMkFfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoTk9ERV9ERUNPUkFUT1IKKwkJCSsgIi8iICsgImdkZWNfMmEiKTsKKworCS8vIEVkZ2UgVVJJJ1MKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgRTFBX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKEVER0UgKyAiLyIgKyAiZTFhIik7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgRTFCX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKEVER0UgKyAiLyIgKyAiZTFiIik7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgRTJBX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKEVER0UgKyAiLyIgKyAiZTJhIik7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgRTNBX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKEVER0UgKyAiLyIgKyAiZTNhIik7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgRTRBX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKEVER0UgKyAiLyIgKyAiZTRhIik7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgRTRCX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKEVER0UgKyAiLyIgKyAiZTRiIik7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgRTVBX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKEVER0UgKyAiLyIgKyAiZTVhIik7CisKKwkvLyBEeW5hbWljIEVkZ2VzCisJcHVibGljIHN0YXRpYyBmaW5hbCBVUkkgREU0X1VSSSA9IFNURU1VUkkuY3JlYXRlVHlwZVVSSShFREdFICsgIi8iICsgImRlNCIpOworCisJLyoqCisJICogVGhpcyBmaXh0dXJlIGlzIG9mIGEgbW9kZWwgd2l0aCB1bnJlc29sdmVkIHJlZmVyZW5jZXMuCisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgTW9kZWwgdW5yZXNvbHZlZEZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oTW9kZWxUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IE1vZGVsIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNb2RlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgdW5yZXNvbHZlZEZpeHR1cmUKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBNb2RlbCBnZXRVbnJlc29sdmVkRml4dHVyZSgpIHsKKwkJcmV0dXJuIHVucmVzb2x2ZWRGaXh0dXJlOworCX0gLy8gZ2V0VW5yZXNvbHZlZEZpeHR1cmUKKworCS8qKgorCSAqIEBwYXJhbSB1bnJlc29sdmVkRml4dHVyZQorCSAqICAgICAgICAgICAgdGhlIHVucmVzb2x2ZWRGaXh0dXJlIHRvIHNldAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0VW5yZXNvbHZlZEZpeHR1cmUoZmluYWwgTW9kZWwgdW5yZXNvbHZlZEZpeHR1cmUpIHsKKwkJdGhpcy51bnJlc29sdmVkRml4dHVyZSA9IHVucmVzb2x2ZWRGaXh0dXJlOworCX0gLy8gc2V0VW5yZXNvbHZlZEZpeHR1cmUKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTW9kZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBNb2RlbCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKE1vZGVsKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiA8cHJlPgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0wCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy1OREVDXzBBCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy1HMAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICstR0wwYQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICstTjBhCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstRzEKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICArLUdMMWEKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICArLUUxYQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICstRTFiCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstTTEKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICArLUVERUNfMUEKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICArLUcyCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgKy1HTDJhCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgKy1FMmEKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICB8CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgKy1NMgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICstR0RFQ18yQQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICstTkRFQ18yQQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICstRzUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICArLUdMNWEKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICArLUU1YQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICstTjVhCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgKy1ONWIKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy1NMworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstRURFQ18zQQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstRzMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICArLUdMM2EKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICArLUUzYQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICstTjNhCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgKy1OM2IKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy1HNAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy1HTDRhCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLUdMNGIKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstRTRhCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLUU0YgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy1ONGEKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstTjRiCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLU40YworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy1ONGQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJICogPC9wcmU+CisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCQlzZXRVbnJlc29sdmVkRml4dHVyZShjcmVhdGVVbnJlc29sdmVkRml4dHVyZShVTlJFU09MVkVEX01PREVMX1VSSSkpOworCX0gLy8gc2V0VXAKKworCS8qKgorCSAqIENyZWF0ZSBhIE1vZGVsIGZvciB0ZXN0aW5nCisJICovCisJcHVibGljIHN0YXRpYyBNb2RlbCBjcmVhdGVGaXh0dXJlKCkgeworCQkvLyAqKiogTW9kZWwgTTAgKioqCisJCWZpbmFsIE1vZGVsIG0wID0gY3JlYXRlTW9kZWwoTTBfVVJJKTsKKwkJbTAuZ2V0RHVibGluQ29yZSgpLnNldFRpdGxlKCJtMCIpOworCQlmaW5hbCBOb2RlRGVjb3JhdG9yIG5vZGVEZWMwYSA9IGNyZWF0ZU5vZGVEZWNvcmF0b3IoTkRFQ18wQV9VUkkpOworCisJCS8vIEdyYXBoIEcwCisJCWZpbmFsIEdyYXBoIGcwID0gY3JlYXRlR3JhcGgoRzBfVVJJKTsKKwkJZzAuZ2V0RHVibGluQ29yZSgpLnNldFRpdGxlKCJnMCIpOworCQlmaW5hbCBOb2RlIG4wYSA9IFRlc3RVdGlsLmNyZWF0ZVN0YXRpY2FsbHlMYWJlbGVkTm9kZShOMEFfVVJJKTsKKwkJZmluYWwgTGFiZWwgZ2wwID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljTGFiZWwoR19MMF9VUkksIGcwLmdldFVSSSgpKTsKKwkJZmluYWwgTm9kZUxhYmVsIG5sMGEwID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljTm9kZUxhYmVsKE5MMEEwX1VSSSwgbjBhCisJCQkJLmdldFVSSSgpKTsKKwkJZmluYWwgTm9kZUxhYmVsIG5sMGExID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljTm9kZUxhYmVsKE5MMEExX1VSSSwgbjBhCisJCQkJLmdldFVSSSgpKTsKKwkJZmluYWwgTm9kZUxhYmVsIG5sM2ExID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljTm9kZUxhYmVsKE5MM0ExX1VSSSwKKwkJCQlOM0FfVVJJKTsKKwkJZmluYWwgTm9kZUxhYmVsIG5sM2IxID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljTm9kZUxhYmVsKE5MM0IxX1VSSSwKKwkJCQlOM0JfVVJJKTsKKwkJZmluYWwgTm9kZUxhYmVsIG5sNWExID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljTm9kZUxhYmVsKE5MNUExX1VSSSwKKwkJCQlONUFfVVJJKTsKKwkJZmluYWwgTm9kZUxhYmVsIG5sNWIxID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljTm9kZUxhYmVsKE5MNUIxX1VSSSwKKwkJCQlONUJfVVJJKTsKKworCQkvLyBHcmFwaCBHMAorCQlnMC5wdXRHcmFwaExhYmVsKGdsMCk7CisJCWcwLnB1dE5vZGUobjBhKTsKKy8vCQlnMC5wdXROb2RlTGFiZWwoKE5vZGVMYWJlbCkgbjBhLmdldExhYmVscygpLmdldCgwKSk7CisJCWcwLnB1dE5vZGVMYWJlbChubDBhMCk7CisJCWcwLnB1dE5vZGVMYWJlbChubDBhMSk7CisJCWcwLnB1dE5vZGVMYWJlbChubDNhMSk7CisJCWcwLnB1dE5vZGVMYWJlbChubDNiMSk7CisJCWcwLnB1dE5vZGVMYWJlbChubDVhMSk7CisJCWcwLnB1dE5vZGVMYWJlbChubDViMSk7CisKKwkJLy8gR3JhcGggRzEKKwkJZmluYWwgR3JhcGggZzEgPSBjcmVhdGVHcmFwaChHMV9VUkkpOworCQlnMS5nZXREdWJsaW5Db3JlKCkuc2V0VGl0bGUoImcxIik7CisJCWZpbmFsIExhYmVsIGdsMSA9IFRlc3RVdGlsLmNyZWF0ZVN0YXRpY0xhYmVsKEdfTDFfVVJJLCBnMS5nZXRVUkkoKSk7CisJCWZpbmFsIEVkZ2UgZTFhID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljYWxseUxhYmVsZWRFZGdlKEUxQV9VUkksIE41QV9VUkksCisJCQkJTjRBX1VSSSwgZmFsc2UpOworCQlmaW5hbCBFZGdlIGUxYiA9IFRlc3RVdGlsLmNyZWF0ZVN0YXRpY2FsbHlMYWJlbGVkRWRnZShFMUJfVVJJLCBONUJfVVJJLAorCQkJCU40Ql9VUkksIGZhbHNlKTsKKworCQkvLyBHcmFwaCBHMQorCQlnMS5wdXRHcmFwaExhYmVsKGdsMSk7CisJCWcxLnB1dEVkZ2UoZTFhKTsKKwkJZzEucHV0RWRnZShlMWIpOworCisJCS8vICoqKiBNb2RlbCBNMSAqKioKKwkJZmluYWwgTW9kZWwgbTEgPSBjcmVhdGVNb2RlbChNMV9VUkkpOworCQltMS5nZXREdWJsaW5Db3JlKCkuc2V0VGl0bGUoIm0xIik7CisJCWZpbmFsIEVkZ2VEZWNvcmF0b3IgZWRlYzFhID0gY3JlYXRlRWRnZURlY29yYXRvcihFREVDXzFBX1VSSSwgImVkZWMxYSIsCisJCQkJTjVBX1VSSSwgTjVCX1VSSSwgMCk7CisKKwkJLy8gR3JhcGggRzIKKwkJZmluYWwgR3JhcGggZzIgPSBjcmVhdGVHcmFwaChHMl9VUkkpOworCQlnMC5nZXREdWJsaW5Db3JlKCkuc2V0VGl0bGUoImcyIik7CisJCWZpbmFsIExhYmVsIGdsMiA9IFRlc3RVdGlsLmNyZWF0ZVN0YXRpY0xhYmVsKEdfTDJfVVJJLCBnMi5nZXRVUkkoKSk7CisJCWZpbmFsIEVkZ2UgZTJhID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljYWxseUxhYmVsZWRFZGdlKEUyQV9VUkksIE41QV9VUkksCisJCQkJTjVCX1VSSSwgdHJ1ZSk7CisKKwkJLy8gR3JhcGggRzIKKwkJZzIucHV0R3JhcGhMYWJlbChnbDIpOworCQlnMi5wdXRFZGdlKGUyYSk7CisKKwkJLy8gKioqIE1vZGVsIE0yICoqKgorCQlmaW5hbCBNb2RlbCBtMiA9IGNyZWF0ZU1vZGVsKE0yX1VSSSk7CisJCW0xLmdldER1YmxpbkNvcmUoKS5zZXRUaXRsZSgibTIiKTsKKwkJZmluYWwgR3JhcGhEZWNvcmF0b3IgZ2RlYzJhID0gY3JlYXRlR3JhcGhEZWNvcmF0b3IoR0RFQ18yQV9VUkkpOworCQlmaW5hbCBOb2RlRGVjb3JhdG9yIG5vZGVEZWMyYSA9IGNyZWF0ZU5vZGVEZWNvcmF0b3IoTkRFQ18yQV9VUkkpOworCisJCS8vIEdyYXBoIEc1CisJCWZpbmFsIEdyYXBoIGc1ID0gY3JlYXRlR3JhcGgoRzVfVVJJKTsKKwkJZzAuZ2V0RHVibGluQ29yZSgpLnNldFRpdGxlKCJnNSIpOworCQlmaW5hbCBMYWJlbCBnbDUgPSBUZXN0VXRpbC5jcmVhdGVTdGF0aWNMYWJlbChHX0w1X1VSSSwgZzUuZ2V0VVJJKCkpOworCQlmaW5hbCBOb2RlIG41YSA9IFRlc3RVdGlsLmNyZWF0ZVN0YXRpY2FsbHlMYWJlbGVkTm9kZShONUFfVVJJKTsKKwkJZmluYWwgTm9kZSBuNWIgPSBUZXN0VXRpbC5jcmVhdGVTdGF0aWNhbGx5TGFiZWxlZE5vZGUoTjVCX1VSSSk7CisJCWZpbmFsIEVkZ2UgZTVhID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljYWxseUxhYmVsZWRFZGdlKEU1QV9VUkksIE41QV9VUkksCisJCQkJTjVCX1VSSSwgZmFsc2UpOworCisJCS8vIEdyYXBoIEc1CisJCWc1LnB1dEdyYXBoTGFiZWwoZ2w1KTsKKwkJZzUucHV0Tm9kZShuNWEpOworCQlnNS5wdXROb2RlKG41Yik7CisvLwkJZzUucHV0Tm9kZUxhYmVsKChOb2RlTGFiZWwpIG41YS5nZXRMYWJlbHMoKS5nZXQoMCkpOworLy8JCWc1LnB1dE5vZGVMYWJlbCgoTm9kZUxhYmVsKSBuNWIuZ2V0TGFiZWxzKCkuZ2V0KDApKTsKKwkJZzUucHV0RWRnZShlNWEpOworCisJCS8vICoqKiBNb2RlbCBNMyAqKioKKwkJZmluYWwgTW9kZWwgbTMgPSBjcmVhdGVNb2RlbChNM19VUkkpOworCQltMS5nZXREdWJsaW5Db3JlKCkuc2V0VGl0bGUoIm0zIik7CisJCWZpbmFsIEVkZ2VEZWNvcmF0b3IgZWRlYzNhID0gY3JlYXRlRWRnZURlY29yYXRvcihFREVDXzNBX1VSSSwgImVkZWMzYSIsCisJCQkJTjRBX1VSSSwgTjRCX1VSSSwgMCk7CisKKwkJLy8gR3JhcGggRzMKKwkJZmluYWwgR3JhcGggZzMgPSBjcmVhdGVHcmFwaChHM19VUkkpOworCQlnMC5nZXREdWJsaW5Db3JlKCkuc2V0VGl0bGUoImczIik7CisJCWZpbmFsIExhYmVsIGdsMyA9IFRlc3RVdGlsLmNyZWF0ZVN0YXRpY0xhYmVsKEdfTDNfVVJJLCBnMy5nZXRVUkkoKSk7CisJCWZpbmFsIE5vZGUgbjNhID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljYWxseUxhYmVsZWROb2RlKE4zQV9VUkkpOworCQlmaW5hbCBOb2RlIG4zYiA9IFRlc3RVdGlsLmNyZWF0ZVN0YXRpY2FsbHlMYWJlbGVkTm9kZShOM0JfVVJJKTsKKwkJZmluYWwgRWRnZSBlM2EgPSBUZXN0VXRpbC5jcmVhdGVTdGF0aWNhbGx5TGFiZWxlZEVkZ2UoRTNBX1VSSSwgTjNBX1VSSSwKKwkJCQlOM0JfVVJJLCBmYWxzZSk7CisKKwkJLy8gR3JhcGggRzMKKwkJZzMucHV0R3JhcGhMYWJlbChnbDMpOworCQlnMy5wdXROb2RlKG4zYSk7CisJCWczLnB1dE5vZGUobjNiKTsKKy8vCQlnMy5wdXROb2RlTGFiZWwoKE5vZGVMYWJlbCkgbjNhLmdldExhYmVscygpLmdldCgwKSk7CisvLwkJZzMucHV0Tm9kZUxhYmVsKChOb2RlTGFiZWwpIG4zYi5nZXRMYWJlbHMoKS5nZXQoMCkpOworCQlnMy5wdXRFZGdlKGUzYSk7CisKKwkJLy8gR3JhcGggRzQKKwkJZmluYWwgR3JhcGggZzQgPSBjcmVhdGVHcmFwaChHNF9VUkkpOworCQlnMC5nZXREdWJsaW5Db3JlKCkuc2V0VGl0bGUoImc0Iik7CisJCS8vIHdlIGRlbGliZXJhdGVseSBkb24ndCBsYWJlbCBuNGQKKwkJZmluYWwgTm9kZSBuNGEgPSBUZXN0VXRpbC5jcmVhdGVTdGF0aWNhbGx5TGFiZWxlZE5vZGUoTjRBX1VSSSk7CisJCWZpbmFsIE5vZGUgbjRiID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljYWxseUxhYmVsZWROb2RlKE40Ql9VUkkpOworCQlmaW5hbCBOb2RlIG40YyA9IFRlc3RVdGlsLmNyZWF0ZVN0YXRpY2FsbHlMYWJlbGVkTm9kZShONENfVVJJKTsKKwkJZmluYWwgTm9kZSBuNGQgPSBUZXN0VXRpbC5jcmVhdGVTdGF0aWNhbGx5TGFiZWxlZE5vZGUoTjREX1VSSSk7CisJCWZpbmFsIEVkZ2UgZTRhID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljYWxseUxhYmVsZWRFZGdlKEU0QV9VUkksIE40QV9VUkksCisJCQkJTjRCX1VSSSwgZmFsc2UpOworCQlmaW5hbCBFZGdlIGU0YiA9IFRlc3RVdGlsLmNyZWF0ZVN0YXRpY2FsbHlMYWJlbGVkRWRnZShFNEJfVVJJLCBONEFfVVJJLAorCQkJCU40Q19VUkksIGZhbHNlKTsKKwkJZmluYWwgTGFiZWwgZ2w0ID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljTGFiZWwoR19MNF9VUkksIGc0LmdldFVSSSgpKTsKKwkJZmluYWwgTm9kZUxhYmVsIG5sNGExID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljTm9kZUxhYmVsKE5MNEExX1VSSSwgbjRhCisJCQkJLmdldFVSSSgpKTsKKwkJZmluYWwgTm9kZUxhYmVsIG5sNGIxID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljTm9kZUxhYmVsKE5MNEIxX1VSSSwgbjRiCisJCQkJLmdldFVSSSgpKTsKKwkJZmluYWwgTm9kZUxhYmVsIG5sNGMxID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljTm9kZUxhYmVsKE5MNEMxX1VSSSwgbjRjCisJCQkJLmdldFVSSSgpKTsKKworCQkvLyBHcmFwaCBHNAorCQlnNC5wdXRHcmFwaExhYmVsKGdsNCk7CisJCWc0LnB1dE5vZGVMYWJlbChubDRhMSk7CisJCWc0LnB1dE5vZGVMYWJlbChubDRiMSk7CisJCWc0LnB1dE5vZGVMYWJlbChubDRjMSk7CisJCS8vIHdlIGRlbGliZXJhdGVseSBkb24ndCBsYWJlbCBuNGQKKwkJZzQucHV0Tm9kZShuNGEpOworCQlnNC5wdXROb2RlKG40Yik7CisJCWc0LnB1dE5vZGUobjRjKTsKKwkJZzQucHV0Tm9kZShuNGQpOworLy8JCWc0LnB1dE5vZGVMYWJlbCgoTm9kZUxhYmVsKSBuNGEuZ2V0TGFiZWxzKCkuZ2V0KDApKTsKKy8vCQlnNC5wdXROb2RlTGFiZWwoKE5vZGVMYWJlbCkgbjRiLmdldExhYmVscygpLmdldCgwKSk7CisvLwkJZzQucHV0Tm9kZUxhYmVsKChOb2RlTGFiZWwpIG40Yy5nZXRMYWJlbHMoKS5nZXQoMCkpOworLy8JCWc0LnB1dE5vZGVMYWJlbCgoTm9kZUxhYmVsKSBuNGQuZ2V0TGFiZWxzKCkuZ2V0KDApKTsKKworCQlnNC5wdXRFZGdlKGU0YSk7CisJCWc0LnB1dEVkZ2UoZTRiKTsKKworCQkvLyAqKiogTW9kZWwgTTAgKioqCisJCW0wLmdldEdyYXBocygpLmFkZChnMCk7CisJCW0wLmdldEdyYXBocygpLmFkZChnMSk7CisJCW0wLmdldE1vZGVscygpLmFkZChtMSk7CisJCW0wLmdldE1vZGVscygpLmFkZChtMyk7CisJCW0wLmdldE5vZGVEZWNvcmF0b3JzKCkuYWRkKG5vZGVEZWMwYSk7CisKKwkJLy8gKioqIE1vZGVsIE0xICoqKgorCQltMS5nZXRHcmFwaHMoKS5hZGQoZzIpOworCQltMS5nZXRNb2RlbHMoKS5hZGQobTIpOworCQltMS5nZXRFZGdlRGVjb3JhdG9ycygpLmFkZChlZGVjMWEpOworCisJCS8vICoqKiBNb2RlbCBNMiAqKioKKwkJbTIuZ2V0R3JhcGhzKCkuYWRkKGc1KTsKKwkJbTIuZ2V0R3JhcGhEZWNvcmF0b3JzKCkuYWRkKGdkZWMyYSk7CisJCW0yLmdldE5vZGVEZWNvcmF0b3JzKCkuYWRkKG5vZGVEZWMyYSk7CisKKwkJLy8gKioqIE1vZGVsIE0zICoqKgorCQltMy5nZXRHcmFwaHMoKS5hZGQoZzMpOworCQltMy5nZXRHcmFwaHMoKS5hZGQoZzQpOworCQltMy5nZXRFZGdlRGVjb3JhdG9ycygpLmFkZChlZGVjM2EpOworCisJCWFzc2VydFRydWUobTAuc2FuZSgpKTsKKworCQlyZXR1cm4gbTA7CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKKwkvKioKKwkgKiBDcmVhdGUgYSBtb2RlbCB3aXRoIG9uZSBncmFwaCB0aGF0IGhhcyBvbmUgZWRnZSBhbmQgb25lIGxhYmVsIHRoYXQKKwkgKiByZWZlcmVuY2UgYSBub2RlIHRoYXQgZG9lc24ndCBleGlzdC4KKwkgKiAKKwkgKiBAcGFyYW0gbW9kZWxVUkkKKwkgKiBAcmV0dXJuIGEgZml4dHVyZSBmb3IgdGVzdGluZworCSAqLworCXByaXZhdGUgTW9kZWwgY3JlYXRlVW5yZXNvbHZlZEZpeHR1cmUoZmluYWwgVVJJIG1vZGVsVVJJKSB7CisJCWZpbmFsIE1vZGVsIHJldFZhbHVlID0gY3JlYXRlTW9kZWwobW9kZWxVUkkpOworCisJCWZpbmFsIFVSSSBOT0RFX09ORV9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSShOT0RFICsgIi8iICsgIm5vZGUxIik7CisJCWZpbmFsIEdyYXBoIGcxID0gY3JlYXRlR3JhcGgoU1RFTVVSSS5jcmVhdGVVUkkoR1JBUEggKyAiLyIgKyAiZzEiKSk7CisJCWZpbmFsIEVkZ2UgZTEgPSBUZXN0VXRpbC5jcmVhdGVTdGF0aWNhbGx5TGFiZWxlZEVkZ2UoU1RFTVVSSQorCQkJCS5jcmVhdGVVUkkoRURHRSArICIvIiArICJlMSIpLCBOT0RFX09ORV9VUkksIE5PREVfT05FX1VSSSwKKwkJCQlmYWxzZSk7CisJCWZpbmFsIE5vZGVMYWJlbCBsMSA9IFRlc3RVdGlsLmNyZWF0ZVN0YXRpY05vZGVMYWJlbChTVEVNVVJJCisJCQkJLmNyZWF0ZVVSSShMQUJFTCArICIvIiArICJsMSIpLCBOT0RFX09ORV9VUkkpOworCQlnMS5wdXRFZGdlKGUxKTsKKwkJZzEucHV0Tm9kZUxhYmVsKGwxKTsKKworCQlyZXRWYWx1ZS5nZXRHcmFwaHMoKS5hZGQoZzEpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVVbnJlc29sdmVkRml4dHVyZQorCisJLyoqCisJICogQHBhcmFtIHVyaQorCSAqICAgICAgICAgICAgdGhlIHVyaSB0byB1c2UgZm9yIHRoZSBuZXdseSBjcmVhdGVkIG1vZGVsCisJICogQHJldHVybiBhIG5ldyBtb2RlbCBpbnN0YW5jZQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJpdmF0ZSBzdGF0aWMgTW9kZWwgY3JlYXRlTW9kZWwoVVJJIHVyaSkgeworCQlmaW5hbCBNb2RlbCByZXRWYWx1ZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTW9kZWwoKTsKKwkJcmV0VmFsdWUuc2V0VVJJKHVyaSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZU1vZGVsCisKKwkvKioKKwkgKiBAcGFyYW0gdXJpCisJICogICAgICAgICAgICB0aGUgdXJpIHRvIHVzZSBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgZ3JhcGgKKwkgKiBAcmV0dXJuIGEgbmV3IGdyYXBoIGluc3RhbmNlCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBHcmFwaCBjcmVhdGVHcmFwaChVUkkgdXJpKSB7CisJCWZpbmFsIEdyYXBoIHJldFZhbHVlID0gR3JhcGhGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaCgpOworCQlyZXRWYWx1ZS5zZXRVUkkodXJpKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlR3JhcGgKKworCS8qKgorCSAqIEBwYXJhbSB1cmkKKwkgKiAgICAgICAgICAgIHRoZSB1cmkgdG8gdXNlIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBub2RlIGRlY29yYXRvcgorCSAqIEByZXR1cm4gdGhlIG5ldyBub2RlIGRlY29yYXRvciBpbnN0YW5jZQorCSAqLworCXByaXZhdGUgc3RhdGljIE5vZGVEZWNvcmF0b3IgY3JlYXRlTm9kZURlY29yYXRvcihmaW5hbCBVUkkgdXJpKSB7CisJCWZpbmFsIE5vZGVEZWNvcmF0b3Igbm9kZURlY29yYXRvciA9IERlY29yYXRvcnNGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVUZXN0Tm9kZURlY29yYXRvcjEoKTsKKwkJbm9kZURlY29yYXRvci5zZXRVUkkodXJpKTsKKwkJcmV0dXJuIG5vZGVEZWNvcmF0b3I7CisJfSAvLyBjcmVhdGVOb2RlRGVjb3JhdG9yCisKKwkvKioKKwkgKiBAcGFyYW0gdXJpCisJICogICAgICAgICAgICB0aGUgdXJpIHRvIHVzZSBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgZWRnZSBkZWNvcmF0b3IKKwkgKiBAcmV0dXJuIHRoZSBuZXcgZWRnZSBkZWNvcmF0b3IgaW5zdGFuY2UKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBFZGdlRGVjb3JhdG9yIGNyZWF0ZUVkZ2VEZWNvcmF0b3IoCisJCQlmaW5hbCBVUkkgZWRnZURlY29yYXRvclVSSSwgZmluYWwgU3RyaW5nIHVyaVN0cmluZywKKwkJCWZpbmFsIFVSSSBub2RlQVVSSSwgZmluYWwgVVJJIG5vZGVCVVJJLCBmaW5hbCBpbnQgZWRnZUluZGV4KSB7CisJCWZpbmFsIFRlc3RFZGdlRGVjb3JhdG9yMSBlZGdlRGVjb3JhdG9yID0gRGVjb3JhdG9yc0ZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZVRlc3RFZGdlRGVjb3JhdG9yMSgpOworCQllZGdlRGVjb3JhdG9yLnNldFVSSShlZGdlRGVjb3JhdG9yVVJJKTsKKwkJZWRnZURlY29yYXRvci5zZXROb2RlQVVSSShub2RlQVVSSSk7CisJCWVkZ2VEZWNvcmF0b3Iuc2V0Tm9kZUJVUkkobm9kZUJVUkkpOworCQllZGdlRGVjb3JhdG9yLnNldEVkZ2VVUkkoY3JlYXRlRHluYW1pY0VkZ2VVUkkodXJpU3RyaW5nLCBlZGdlSW5kZXgpKTsKKwkJcmV0dXJuIGVkZ2VEZWNvcmF0b3I7CisJfSAvLyBjcmVhdGVFZGdlRGVjb3JhdG9yCisKKwkvKioKKwkgKiBAcGFyYW0gZWRnZURlY29yYXRvclVSSQorCSAqIEByZXR1cm4gYSBkeW5hbWljIGVkZ2UgdXJpCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBVUkkgY3JlYXRlRHluYW1pY0VkZ2VVUkkoZmluYWwgU3RyaW5nIHVyaVN0cmluZywKKwkJCWZpbmFsIGludCBpbmRleCkgeworCQlmaW5hbCBVUkkgcmV0VmFsdWUgPSBTVEVNVVJJLmNyZWF0ZVVSSShFREdFICsgIi8iICsgdXJpU3RyaW5nICsgaW5kZXgpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVEeW5hbWljRWRnZVVSSQorCisJLyoqCisJICogQHBhcmFtIHVyaQorCSAqICAgICAgICAgICAgdGhlIHVyaSB0byB1c2UgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGdyYXBoIGRlY29yYXRvcgorCSAqIEByZXR1cm4gdGhlIG5ldyBncmFwaCBkZWNvcmF0b3IgaW5zdGFuY2UKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBHcmFwaERlY29yYXRvciBjcmVhdGVHcmFwaERlY29yYXRvcihVUkkgdXJpKSB7CisJCWZpbmFsIEdyYXBoRGVjb3JhdG9yIGdyYXBoRGVjb3JhdG9yID0gRGVjb3JhdG9yc0ZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZVRlc3RHcmFwaERlY29yYXRvcjEoKTsKKwkJZ3JhcGhEZWNvcmF0b3Iuc2V0VVJJKHVyaSk7CisJCXJldHVybiBncmFwaERlY29yYXRvcjsKKwl9IC8vIGNyZWF0ZUdyYXBoRGVjb3JhdG9yCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsI2dldENhbm9uaWNhbEdyYXBoKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlRmlsdGVyLCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUpIDxlbT5HZXQgQ2Fub25pY2FsIEdyYXBoPC9lbT59JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbCNnZXRDYW5vbmljYWxHcmFwaChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZUZpbHRlciwgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2Fub25pY2FsR3JhcGhfX1VSSV9JZGVudGlmaWFibGVGaWx0ZXJfU1RFTVRpbWUoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG9wZXJhdGlvbiB0ZXN0IG1ldGhvZAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQlmYWlsKCk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsI3ByZXBhcmUob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lKSA8ZW0+UHJlcGFyZTwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWwjcHJlcGFyZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RQcmVwYXJlX19TVEVNVGltZSgpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgb3BlcmF0aW9uIHRlc3QgbWV0aG9kCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCWZhaWwoKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IHRoZSBzYW5pdHkgb2YgdGhlIGZpeHR1cmUKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0ZXN0U2FuZSgpIHsKKwkJZmluYWwgTW9kZWwgbW9kZWwgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUobW9kZWwuc2FuZSgpKTsKKwl9IC8vIHRlc3RTYW5lCisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWwjZ2V0Q2Fub25pY2FsR3JhcGgoVVJJKSA8ZW0+Q2Fub25pY2FsIEdyYXBoPC9lbT59JworCSAqIGZlYXR1cmUgZ2V0dGVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbCNnZXRDYW5vbmljYWxHcmFwaChVUkkpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2Fub25pY2FsR3JhcGhfX1VSSSgpIHsKKwkJZmluYWwgaW50IE5VTV9TVEFUSUNfTk9ERVMgPSA5OworCQlmaW5hbCBpbnQgTlVNX1NUQVRJQ19FREdFUyA9IDc7CisKKwkJLy8gMSBmb3IgRURFQ18xQSwgMSBmb3IgRURFQ18zQQorCQlmaW5hbCBpbnQgTlVNX0RZTkFNSUNfRURHRVMgPSAyOworCQlmaW5hbCBpbnQgTlVNX1NUQVRJQ19OT0RFX0xBQkVMUyA9IDIgKiBOVU1fU1RBVElDX05PREVTOworCisJCS8vICsyIGZvciBOREVDXzJBIG9uIG5vZGVzIE41YSAmIE41YgorCQlmaW5hbCBpbnQgTlVNX0RZTkFNSUNfTk9ERV9MQUJFTFMgPSBOVU1fU1RBVElDX05PREVTICsgMjsKKwkJZmluYWwgaW50IE5VTV9TVEFUSUNfR1JBUEhfTEFCRUxTID0gNjsKKwkJZmluYWwgaW50IE5VTV9EWU5BTUlDX0dSQVBIX0xBQkVMUyA9IDE7CisJCWZpbmFsIGludCBOVU1fRFlOQU1JQ19FREdFX0xBQkVMUyA9IE5VTV9EWU5BTUlDX0VER0VTOworCisJCWZpbmFsIE1vZGVsIG1vZGVsID0gZ2V0Rml4dHVyZSgpOworCQlTVEVNVGltZSB0aW1lID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTVEVNVGltZSgpOworCQlmaW5hbCBHcmFwaCBjYW5vbmljYWxHcmFwaCA9IG1vZGVsCisJCQkJLmdldENhbm9uaWNhbEdyYXBoKENBTk9OSUNBTF9HUkFQSDFfVVJJLCBuZXcgSWRlbnRpZmlhYmxlRmlsdGVySW1wbChtb2RlbC5nZXREdWJsaW5Db3JlKCkuZ2V0Q292ZXJhZ2UoKSksIHRpbWUpOworCisJCWFzc2VydFRydWUoY2Fub25pY2FsR3JhcGguc2FuZSgpKTsKKworCQkvLyBUaGUgVVJJIG9mIHRoZSBncmFwaCBzaG91bGQgYmUgd2hhdCB3ZSB0aGluayBpdCBzaG91bGQgYmUKKwkJYXNzZXJ0VHJ1ZShjYW5vbmljYWxHcmFwaC5nZXRVUkkoKS5lcXVhbHMoQ0FOT05JQ0FMX0dSQVBIMV9VUkkpKTsKKworCQkvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IHVucmVzb2x2ZWQgVVJJIHJlZmVyZW5jZXMKKwkJYXNzZXJ0VHJ1ZShjYW5vbmljYWxHcmFwaC5nZXRVbnJlc29sdmVkSWRlbnRpZmlhYmxlcygpLnNpemUoKSA9PSAwKTsKKworCQkvLyBUaGUgbnVtYmVycyBzaG91bGQgYWRkIHVwCisJCWFzc2VydFRydWUoY2Fub25pY2FsR3JhcGguZ2V0TnVtTm9kZXMoKSA9PSBOVU1fU1RBVElDX05PREVTKTsKKworCQlhc3NlcnRUcnVlKGNhbm9uaWNhbEdyYXBoLmdldE51bUVkZ2VzKCkgPT0gTlVNX1NUQVRJQ19FREdFUworCQkJCSsgTlVNX0RZTkFNSUNfRURHRVMpOworCisJCWFzc2VydFRydWUoY2Fub25pY2FsR3JhcGguZ2V0TnVtR3JhcGhMYWJlbHMoKSA9PSBOVU1fU1RBVElDX0dSQVBIX0xBQkVMUworCQkJCSsgTlVNX0RZTkFNSUNfR1JBUEhfTEFCRUxTKTsKKworCQlhc3NlcnRUcnVlKGNhbm9uaWNhbEdyYXBoLmdldE51bU5vZGVMYWJlbHMoKSA9PSBOVU1fU1RBVElDX05PREVfTEFCRUxTCisJCQkJKyBOVU1fRFlOQU1JQ19OT0RFX0xBQkVMUyk7CisKKwkJYXNzZXJ0VHJ1ZShjYW5vbmljYWxHcmFwaC5nZXROdW1EeW5hbWljTGFiZWxzKCkgPT0gK05VTV9EWU5BTUlDX05PREVfTEFCRUxTCisJCQkJKyBOVU1fRFlOQU1JQ19HUkFQSF9MQUJFTFMgKyBOVU1fRFlOQU1JQ19FREdFX0xBQkVMUyk7CisKKwkJLy8gQWxsIHRoZSBFZGdlcyBzaG91bGQgYmUgaG9va2VkIHVwIHRvIHRoZWlyIG5vZGVzCisJCWZpbmFsIEVkZ2UgZTFhID0gY2Fub25pY2FsR3JhcGguZ2V0RWRnZShFMUFfVVJJKTsKKwkJYXNzZXJ0VHJ1ZShlMWEuZ2V0QSgpLmdldFVSSSgpLmVxdWFscyhONUFfVVJJKSk7CisJCWFzc2VydFRydWUoZTFhLmdldEIoKS5nZXRVUkkoKS5lcXVhbHMoTjRBX1VSSSkpOworCisJCWZpbmFsIEVkZ2UgZTFiID0gY2Fub25pY2FsR3JhcGguZ2V0RWRnZShFMUJfVVJJKTsKKwkJYXNzZXJ0VHJ1ZShlMWIuZ2V0QSgpLmdldFVSSSgpLmVxdWFscyhONUJfVVJJKSk7CisJCWFzc2VydFRydWUoZTFiLmdldEIoKS5nZXRVUkkoKS5lcXVhbHMoTjRCX1VSSSkpOworCisJCWZpbmFsIEVkZ2UgZTJhID0gY2Fub25pY2FsR3JhcGguZ2V0RWRnZShFMkFfVVJJKTsKKwkJYXNzZXJ0VHJ1ZShlMmEuZ2V0QSgpLmdldFVSSSgpLmVxdWFscyhONUFfVVJJKSk7CisJCWFzc2VydFRydWUoZTJhLmdldEIoKS5nZXRVUkkoKS5lcXVhbHMoTjVCX1VSSSkpOworCisJCWZpbmFsIEVkZ2UgZTNhID0gY2Fub25pY2FsR3JhcGguZ2V0RWRnZShFM0FfVVJJKTsKKwkJYXNzZXJ0VHJ1ZShlM2EuZ2V0QSgpLmdldFVSSSgpLmVxdWFscyhOM0FfVVJJKSk7CisJCWFzc2VydFRydWUoZTNhLmdldEIoKS5nZXRVUkkoKS5lcXVhbHMoTjNCX1VSSSkpOworCisJCWZpbmFsIEVkZ2UgZTRhID0gY2Fub25pY2FsR3JhcGguZ2V0RWRnZShFNEFfVVJJKTsKKwkJYXNzZXJ0VHJ1ZShlNGEuZ2V0QSgpLmdldFVSSSgpLmVxdWFscyhONEFfVVJJKSk7CisJCWFzc2VydFRydWUoZTRhLmdldEIoKS5nZXRVUkkoKS5lcXVhbHMoTjRCX1VSSSkpOworCisJCWZpbmFsIEVkZ2UgZTRiID0gY2Fub25pY2FsR3JhcGguZ2V0RWRnZShFNEJfVVJJKTsKKwkJYXNzZXJ0VHJ1ZShlNGIuZ2V0QSgpLmdldFVSSSgpLmVxdWFscyhONEFfVVJJKSk7CisJCWFzc2VydFRydWUoZTRiLmdldEIoKS5nZXRVUkkoKS5lcXVhbHMoTjRDX1VSSSkpOworCisJCWZpbmFsIEVkZ2UgZTVhID0gY2Fub25pY2FsR3JhcGguZ2V0RWRnZShFNUFfVVJJKTsKKwkJYXNzZXJ0VHJ1ZShlNWEuZ2V0QSgpLmdldFVSSSgpLmVxdWFscyhONUFfVVJJKSk7CisJCWFzc2VydFRydWUoZTVhLmdldEIoKS5nZXRVUkkoKS5lcXVhbHMoTjVCX1VSSSkpOworCisJCS8vIFRoZSBub2RlcyBzaG91bGQgaGF2ZSAobm9uLWNvbnRhaW5tZW50KSByZWZlcmVuY2VzIHRvIHRoZWlyIGVkZ2VzIGFuZAorCQkvLyBsYWJlbHMKKwkJZmluYWwgTm9kZSBuMGEgPSBjYW5vbmljYWxHcmFwaC5nZXROb2RlKE4wQV9VUkkpOworCQlmaW5hbCBFTGlzdCBuMGFFZGdlcyA9IG4wYS5nZXRFZGdlcygpOworCQlhc3NlcnRUcnVlKG4wYUVkZ2VzLnNpemUoKSA9PSAwKTsKKwkJZmluYWwgRUxpc3QgbjBhTGFiZWxzID0gbjBhLmdldExhYmVscygpOworCQkvLyAxICsgMiBzdGF0aWMgbGFiZWxzLCAxIGR5bmFtaWMKKwkJYXNzZXJ0VHJ1ZShuMGFMYWJlbHMuc2l6ZSgpID09IDEgKyAyICsgMSk7CisJCXZlcmlmeU5vZGVMYWJlbHNSZWZlcmVuY2VOb2RlKG4wYSk7CisKKwkJZmluYWwgTm9kZSBuM2EgPSBjYW5vbmljYWxHcmFwaC5nZXROb2RlKE4zQV9VUkkpOworCQlmaW5hbCBFTGlzdCBuM2FFZGdlcyA9IG4zYS5nZXRFZGdlcygpOworCQlhc3NlcnRUcnVlKG4zYUVkZ2VzLnNpemUoKSA9PSAxKTsKKwkJYXNzZXJ0VHJ1ZShuM2FFZGdlcy5jb250YWlucyhlM2EpKTsKKwkJZmluYWwgRUxpc3QgbjNhTGFiZWxzID0gbjNhLmdldExhYmVscygpOworCQkvLyAxICsgMSBzdGF0aWMgbGFiZWwsIDEgZHluYW1pYworCQlhc3NlcnRUcnVlKG4zYUxhYmVscy5zaXplKCkgPT0gMSArIDEgKyAxKTsKKwkJdmVyaWZ5Tm9kZUxhYmVsc1JlZmVyZW5jZU5vZGUobjNhKTsKKworCQlmaW5hbCBOb2RlIG4zYiA9IGNhbm9uaWNhbEdyYXBoLmdldE5vZGUoTjNCX1VSSSk7CisJCWZpbmFsIEVMaXN0IG4zYkVkZ2VzID0gbjNiLmdldEVkZ2VzKCk7CisJCWFzc2VydFRydWUobjNiRWRnZXMuc2l6ZSgpID09IDEpOworCQlhc3NlcnRUcnVlKG4zYkVkZ2VzLmNvbnRhaW5zKGUzYSkpOworCQlmaW5hbCBFTGlzdCBuM2JMYWJlbHMgPSBuM2IuZ2V0TGFiZWxzKCk7CisJCS8vIDErIDEgc3RhdGljIGxhYmVsLCAxIGR5bmFtaWMKKwkJYXNzZXJ0VHJ1ZShuM2JMYWJlbHMuc2l6ZSgpID09IDEgKyAxICsgMSk7CisJCXZlcmlmeU5vZGVMYWJlbHNSZWZlcmVuY2VOb2RlKG4zYik7CisKKwkJZmluYWwgTm9kZSBuNGEgPSBjYW5vbmljYWxHcmFwaC5nZXROb2RlKE40QV9VUkkpOworCQlmaW5hbCBFTGlzdCBuNGFFZGdlcyA9IG40YS5nZXRFZGdlcygpOworCQkvLyAzIHN0YXRpYyBlZGdlcywgMSBkeW5hbWljCisJCWFzc2VydFRydWUobjRhRWRnZXMuc2l6ZSgpID09IDMgKyAxKTsKKwkJYXNzZXJ0VHJ1ZShuNGFFZGdlcy5jb250YWlucyhlMWEpKTsKKwkJYXNzZXJ0VHJ1ZShuNGFFZGdlcy5jb250YWlucyhlNGEpKTsKKwkJYXNzZXJ0VHJ1ZShuNGFFZGdlcy5jb250YWlucyhlNGIpKTsKKwkJLy8gYXNzZXJ0VHJ1ZShuNGFFZGdlcy5jb250YWlucyggZGU0ICk7CisJCWZpbmFsIEVMaXN0IG40YUxhYmVscyA9IG40YS5nZXRMYWJlbHMoKTsKKwkJLy8gMSArIDEgc3RhdGljIGxhYmVsLCAxIGR5bmFtaWMKKwkJYXNzZXJ0VHJ1ZShuNGFMYWJlbHMuc2l6ZSgpID09IDEgKyAxICsgMSk7CisJCXZlcmlmeU5vZGVMYWJlbHNSZWZlcmVuY2VOb2RlKG40YSk7CisKKwkJZmluYWwgTm9kZSBuNGIgPSBjYW5vbmljYWxHcmFwaC5nZXROb2RlKE40Ql9VUkkpOworCQlmaW5hbCBFTGlzdCBuNGJFZGdlcyA9IG40Yi5nZXRFZGdlcygpOworCQkvLyAyIHN0YXRpYywgMSBkeW5hbWljCisJCWFzc2VydFRydWUobjRiRWRnZXMuc2l6ZSgpID09IDIgKyAxKTsKKwkJYXNzZXJ0VHJ1ZShuNGJFZGdlcy5jb250YWlucyhlMWIpKTsKKwkJYXNzZXJ0VHJ1ZShuNGJFZGdlcy5jb250YWlucyhlNGEpKTsKKwkJLy8gYXNzZXJ0VHJ1ZShuNGFFZGdlcy5jb250YWlucyggZGU0ICk7CisJCWZpbmFsIEVMaXN0IG40YkxhYmVscyA9IG40Yi5nZXRMYWJlbHMoKTsKKwkJLy8gMSArIDEgc3RhdGljIGxhYmVsLCAxIGR5bmFtaWMKKwkJYXNzZXJ0VHJ1ZShuNGJMYWJlbHMuc2l6ZSgpID09IDEgKyAxICsgMSk7CisJCXZlcmlmeU5vZGVMYWJlbHNSZWZlcmVuY2VOb2RlKG40Yik7CisKKwkJZmluYWwgTm9kZSBuNGMgPSBjYW5vbmljYWxHcmFwaC5nZXROb2RlKE40Q19VUkkpOworCQlmaW5hbCBFTGlzdCBuNGNFZGdlcyA9IG40Yy5nZXRFZGdlcygpOworCQlhc3NlcnRUcnVlKG40Y0VkZ2VzLnNpemUoKSA9PSAxKTsKKwkJYXNzZXJ0VHJ1ZShuNGNFZGdlcy5jb250YWlucyhlNGIpKTsKKwkJZmluYWwgRUxpc3QgbjRjTGFiZWxzID0gbjRjLmdldExhYmVscygpOworCQkvLyAxKyAxIHN0YXRpYyBsYWJlbCwgMSBkeW5hbWljCisJCWFzc2VydFRydWUobjRjTGFiZWxzLnNpemUoKSA9PSAxICsgMSArIDEpOworCQl2ZXJpZnlOb2RlTGFiZWxzUmVmZXJlbmNlTm9kZShuNGMpOworCisJCWZpbmFsIE5vZGUgbjRkID0gY2Fub25pY2FsR3JhcGguZ2V0Tm9kZShONERfVVJJKTsKKwkJZmluYWwgRUxpc3QgbjRkRWRnZXMgPSBuNGQuZ2V0RWRnZXMoKTsKKwkJYXNzZXJ0VHJ1ZShuNGRFZGdlcy5zaXplKCkgPT0gMCk7CisJCWZpbmFsIEVMaXN0IG40ZExhYmVscyA9IG40ZC5nZXRMYWJlbHMoKTsKKwkJLy8gMSBzdGF0aWMgbGFiZWwsIDEgZHluYW1pYworCQlhc3NlcnRUcnVlKG40ZExhYmVscy5zaXplKCkgPT0gMSArIDEpOworCQl2ZXJpZnlOb2RlTGFiZWxzUmVmZXJlbmNlTm9kZShuNGQpOworCisJCWZpbmFsIE5vZGUgbjVhID0gY2Fub25pY2FsR3JhcGguZ2V0Tm9kZShONUFfVVJJKTsKKwkJZmluYWwgRUxpc3QgbjVhRWRnZXMgPSBuNWEuZ2V0RWRnZXMoKTsKKwkJLy8gMyBzdGF0aWMsIDEgZHluYW1pYyBmcm9tIGVkZWMxYQorCQlhc3NlcnRUcnVlKG41YUVkZ2VzLnNpemUoKSA9PSAzICsgMSk7CisJCWFzc2VydFRydWUobjVhRWRnZXMuY29udGFpbnMoZTFhKSk7CisJCWFzc2VydFRydWUobjVhRWRnZXMuY29udGFpbnMoZTJhKSk7CisJCWFzc2VydFRydWUobjVhRWRnZXMuY29udGFpbnMoZTVhKSk7CisJCWZpbmFsIEVMaXN0IG41YUxhYmVscyA9IG41YS5nZXRMYWJlbHMoKTsKKwkJLy8gMSArIDEgc3RhdGljIGxhYmVsLCAyIGR5bmFtaWMgKE5ERUNfMEEgJiBOREVDXzJBKQorCQlhc3NlcnRUcnVlKG41YUxhYmVscy5zaXplKCkgPT0gMSArIDEgKyAyKTsKKwkJdmVyaWZ5Tm9kZUxhYmVsc1JlZmVyZW5jZU5vZGUobjVhKTsKKworCQlmaW5hbCBOb2RlIG41YiA9IGNhbm9uaWNhbEdyYXBoLmdldE5vZGUoTjVCX1VSSSk7CisJCWZpbmFsIEVMaXN0IG41YkVkZ2VzID0gbjViLmdldEVkZ2VzKCk7CisJCS8vIDMgc3RhdGljLCAxIGR5bmFtaWMgZnJvbSBlZGVjMWEKKwkJYXNzZXJ0VHJ1ZShuNWJFZGdlcy5zaXplKCkgPT0gMyArIDEpOworCQlhc3NlcnRUcnVlKG41YkVkZ2VzLmNvbnRhaW5zKGUxYikpOworCQlhc3NlcnRUcnVlKG41YkVkZ2VzLmNvbnRhaW5zKGUyYSkpOworCQlhc3NlcnRUcnVlKG41YkVkZ2VzLmNvbnRhaW5zKGU1YSkpOworCQlmaW5hbCBFTGlzdCBuNWJMYWJlbHMgPSBuNWIuZ2V0TGFiZWxzKCk7CisJCS8vIDErIDEgc3RhdGljIGxhYmVsLCAyIGR5bmFtaWMgKE5ERUNfMEEgJiBOREVDXzJBKQorCQlhc3NlcnRUcnVlKG41YkxhYmVscy5zaXplKCkgPT0gMSArIDEgKyAyKTsKKwkJdmVyaWZ5Tm9kZUxhYmVsc1JlZmVyZW5jZU5vZGUobjViKTsKKworCQkvLyBHcmFwaCBsYWJlbHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUgZ3JhcGgKKwkJZm9yIChmaW5hbCBJdGVyYXRvciBncmFwaExhYmVsSXRlciA9IGNhbm9uaWNhbEdyYXBoLmdldEdyYXBoTGFiZWxzKCkKKwkJCQkudmFsdWVzKCkuaXRlcmF0b3IoKTsgZ3JhcGhMYWJlbEl0ZXIuaGFzTmV4dCgpOykgeworCQkJZmluYWwgTGFiZWwgbGFiZWwgPSAoTGFiZWwpIGdyYXBoTGFiZWxJdGVyLm5leHQoKTsKKwkJCWZpbmFsIFVSSSBncmFwaFVSSSA9IGNhbm9uaWNhbEdyYXBoLmdldFVSSSgpOworCQkJYXNzZXJ0VHJ1ZSgiR3JhcGggbGFiZWwgXCIiICsgbGFiZWwuZ2V0VVJJKCkKKwkJCQkJKyAiXCIgZG9lcyBub3QgcmVmZXJlbmNlIGdyYXBoIFwiIiArIGdyYXBoVVJJCisJCQkJCSsgIlwiLCBpbnN0ZWFkLCBpdCByZWZlcmVuY2VzIFwiIgorCQkJCQkrIGxhYmVsLmdldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQoKSArICJcIiIsIGxhYmVsCisJCQkJCS5nZXRVUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKCkuZXF1YWxzKGdyYXBoVVJJKSk7CisJCX0gLy8gZm9yCisJfSAvLyB0ZXN0R2V0Q2Fub25pY2FsR3JhcGhfX1VSSQorCisJLyoqCisJICogVmVyaWZ5IHRoYXQgd2hlbiBhIGNhbm9uaWNhbCBncmFwaCBpcyBjcmVhdGVkLCBpdCBkb2VzIG5vdCBkZXN0cm95IHRoZQorCSAqIHJlcHJlc2VudGF0aW9uIG1haW50YWluZWQgaW4gdGhlIG1vZGVsLgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdE5vbkRlc3RydWN0aXZlR2V0Q2Fub25pY2FsR3JhcGgoKSB7CisJCWZpbmFsIE1vZGVsIG1vZGVsID0gZ2V0Rml4dHVyZSgpOworCisJCVNURU1UaW1lIG5vdyA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU1RFTVRpbWUoKTsKKwkJCisJCWZpbmFsIEdyYXBoIGdyYXBoMSA9IG1vZGVsLmdldENhbm9uaWNhbEdyYXBoKENBTk9OSUNBTF9HUkFQSDFfVVJJLCBuZXcgSWRlbnRpZmlhYmxlRmlsdGVySW1wbChtb2RlbC5nZXREdWJsaW5Db3JlKCkuZ2V0Q292ZXJhZ2UoKSksIG5vdyk7CisJCWZpbmFsIEdyYXBoIGdyYXBoMiA9IG1vZGVsLmdldENhbm9uaWNhbEdyYXBoKENBTk9OSUNBTF9HUkFQSDJfVVJJLCBuZXcgSWRlbnRpZmlhYmxlRmlsdGVySW1wbChtb2RlbC5nZXREdWJsaW5Db3JlKCkuZ2V0Q292ZXJhZ2UoKSksIG5vdyk7CisKKwkJZmluYWwgRHVibGluQ29yZSBkYzEgPSBncmFwaDEuZ2V0RHVibGluQ29yZSgpOworCQlmaW5hbCBEdWJsaW5Db3JlIGRjMiA9IGdyYXBoMi5nZXREdWJsaW5Db3JlKCk7CisKKwkJLy8gVGhlIGdyYXBocyBzaG91bGQgYmUgZGlmZmVyZW50IGluc3RhbmNlcworCQlhc3NlcnRUcnVlKGdyYXBoMSAhPSBncmFwaDIpOworCQlhc3NlcnRGYWxzZShncmFwaDEuZ2V0VVJJKCkuZXF1YWxzKGdyYXBoMi5nZXRVUkkoKSkpOworCisJCS8vIC4uLiBidXQgb3RoZXJ3aXNlIHRoZSBzYW1lCisJCWFzc2VydFRydWUoZ3JhcGgxLmdldFR5cGVVUkkoKS5lcXVhbHMoZ3JhcGgyLmdldFR5cGVVUkkoKSkpOworCisJCWFzc2VydFRydWUoZ3JhcGgxLmdldFVSSSgpLnRvU3RyaW5nKCkuZXF1YWxzKGRjMS5nZXRJZGVudGlmaWVyKCkpKTsKKwkJYXNzZXJ0VHJ1ZShncmFwaDEuZ2V0VHlwZVVSSSgpLnRvU3RyaW5nKCkuZXF1YWxzKGRjMS5nZXRUeXBlKCkpKTsKKworCQlhc3NlcnRUcnVlKGdyYXBoMi5nZXRVUkkoKS50b1N0cmluZygpLmVxdWFscyhkYzIuZ2V0SWRlbnRpZmllcigpKSk7CisJCWFzc2VydFRydWUoZ3JhcGgyLmdldFR5cGVVUkkoKS50b1N0cmluZygpLmVxdWFscyhkYzIuZ2V0VHlwZSgpKSk7CisKKwkJYXNzZXJ0VHJ1ZShncmFwaDEuZ2V0TnVtRWRnZXMoKSA9PSBncmFwaDIuZ2V0TnVtRWRnZXMoKSk7CisJCWFzc2VydFRydWUoZ3JhcGgxLmdldE51bU5vZGVzKCkgPT0gZ3JhcGgyLmdldE51bU5vZGVzKCkpOworCQlhc3NlcnRUcnVlKGdyYXBoMS5nZXROdW1Ob2RlTGFiZWxzKCkgPT0gZ3JhcGgyLmdldE51bU5vZGVMYWJlbHMoKSk7CisJCWFzc2VydFRydWUoZ3JhcGgxLmdldE51bUdyYXBoTGFiZWxzKCkgPT0gZ3JhcGgyLmdldE51bUdyYXBoTGFiZWxzKCkpOworCQlhc3NlcnRUcnVlKGdyYXBoMS5nZXROdW1EeW5hbWljTGFiZWxzKCkgPT0gZ3JhcGgyLmdldE51bUR5bmFtaWNMYWJlbHMoKSk7CisKKwkJLy8gLi4uIGFuZCBkaWZmZXJlbnQKKwkJYXNzZXJ0VHJ1ZShncmFwaDEuZ2V0RWRnZShFMUFfVVJJKSAhPSBncmFwaDIuZ2V0RWRnZShFMUFfVVJJKSk7CisKKwl9IC8vIHRlc3ROb25EZXN0cnVjdGl2ZUdldENhbm9uaWNhbEdyYXBoCisKKwkvKioKKwkgKiBUZXN0IHRoYXQgdW5yZXNvbHZlZCBpZGVudGlmaWVycyB3ZXJlIGZvdW5kCisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VW5yZXNvbHZlZENhbm9uaWNhbEdyYXBoKCkgeworCQlmaW5hbCBNb2RlbCBtb2RlbCA9IGdldFVucmVzb2x2ZWRGaXh0dXJlKCk7CisJCVNURU1UaW1lIG5vdyA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU1RFTVRpbWUoKTsKKwkJZmluYWwgR3JhcGggY2Fub25pY2FsR3JhcGggPSBtb2RlbAorCQkJCS5nZXRDYW5vbmljYWxHcmFwaChDQU5PTklDQUxfR1JBUEgxX1VSSSwgbmV3IElkZW50aWZpYWJsZUZpbHRlckltcGwobW9kZWwuZ2V0RHVibGluQ29yZSgpLmdldENvdmVyYWdlKCkpLCBub3cpOworCisJCS8vIFRoZSBVUkkgb2YgdGhlIGdyYXBoIHNob3VsZCBiZSB3aGF0IHdlIHRoaW5rIGl0IHNob3VsZCBiZQorCQlhc3NlcnRUcnVlKGNhbm9uaWNhbEdyYXBoLmdldFVSSSgpLmVxdWFscyhDQU5PTklDQUxfR1JBUEgxX1VSSSkpOworCisJCS8vIFRoZXJlIHNob3VsZCBiZSB1bnJlc29sdmVkIFVSSSByZWZlcmVuY2VzCisJCS8vIDEgZm9yIHRoZSBlZGdlIHRoYXQgY2FuJ3QgZmluZCBpdHMgbm9kZXMgYW5kIDEgZm9yIGEgTGFiZWwKKwkJLy8gdGhhdCBjYW4ndCBmaW5kIGl0cyBub2RlLgorCQlhc3NlcnRUcnVlKGNhbm9uaWNhbEdyYXBoLmdldFVucmVzb2x2ZWRJZGVudGlmaWFibGVzKCkuc2l6ZSgpID09IDEgKyAxKTsKKwkJLy8gVE9ETyByZS1kbyB0aGlzIHRlc3QKKwl9IC8vIHRlc3RHZXRVbnJlc29sdmVkQ2Fub25pY2FsR3JhcGgKKworCS8qKgorCSAqIFRlc3QgdGhlIE1vZGVsIGhhcyB0aGUgcmlnaHQgdHlwZSBVUkkuCisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZVVSSSgpIHsKKwkJZmluYWwgTW9kZWwgbW9kZWwgPSBnZXRGaXh0dXJlKCk7CisJCWZpbmFsIFVSSSB0eXBlVVJJID0gbW9kZWwuZ2V0VHlwZVVSSSgpOworCQlhc3NlcnRUcnVlKHR5cGVVUkkuc2NoZW1lKCkuZXF1YWxzKENvbnN0YW50cy5TVEVNX1RZUEVfU0NIRU1FKSk7CisJCWFzc2VydFRydWUodHlwZVVSSS5lcXVhbHMoU1RFTVVSSS5NT0RFTF9UWVBFX1VSSSkpOworCX0gLy8gdGVzdEdldFR5cGVVUkkKKworCS8qKgorCSAqIFRlc3QgdGhhdCBldmVyeXRoaW5nIGluIHRoZSBNb2RlbCBoYXMgdGhlIGNvcnJlY3QgVVJJIHNjaGVtZQorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRVUklzKCkgeworCQlmaW5hbCBNb2RlbCBtb2RlbCA9IGdldEZpeHR1cmUoKTsKKwkJU1RFTVRpbWUgbm93ID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTVEVNVGltZSgpOworCQlmaW5hbCBHcmFwaCBjYW5vbmljYWxHcmFwaCA9IG1vZGVsCisJCQkJLmdldENhbm9uaWNhbEdyYXBoKENBTk9OSUNBTF9HUkFQSDFfVVJJLCBuZXcgSWRlbnRpZmlhYmxlRmlsdGVySW1wbChtb2RlbC5nZXREdWJsaW5Db3JlKCkuZ2V0Q292ZXJhZ2UoKSksIG5vdyk7CisKKwkJYXNzZXJ0VHJ1ZShjYW5vbmljYWxHcmFwaC5zYW5lKCkpOworCisJCWFzc2VydFRydWUoY2Fub25pY2FsR3JhcGguZ2V0TnVtTm9kZXMoKSA+IDApOworCQlhc3NlcnRUcnVlKGNhbm9uaWNhbEdyYXBoLmdldE51bUVkZ2VzKCkgPiAwKTsKKwkJYXNzZXJ0VHJ1ZShjYW5vbmljYWxHcmFwaC5nZXROdW1Ob2RlTGFiZWxzKCkgPiAwKTsKKwkJYXNzZXJ0VHJ1ZShjYW5vbmljYWxHcmFwaC5nZXROdW1EeW5hbWljTGFiZWxzKCkgPiAwKTsKKworCQlmaW5hbCBFTGlzdCBkZWNvcmF0b3JzID0gY2Fub25pY2FsR3JhcGguZ2V0RGVjb3JhdG9ycygpOworCisJCWFzc2VydFRydWUoZGVjb3JhdG9ycy5zaXplKCkgPiAwKTsKKwkJLy8gRWRnZSBEZWNvcmF0b3JzCisJCWZvciAoZmluYWwgSXRlcmF0b3IgZWRnZURlY29yYXRvcmxJdGVyID0gZGVjb3JhdG9ycy5pdGVyYXRvcigpOyBlZGdlRGVjb3JhdG9ybEl0ZXIKKwkJCQkuaGFzTmV4dCgpOykgeworCQkJZmluYWwgRGVjb3JhdG9yIGVkZ2VEZWNvcmF0b3IgPSAoRGVjb3JhdG9yKSBlZGdlRGVjb3JhdG9ybEl0ZXIKKwkJCQkJLm5leHQoKTsKKwkJCWFzc2VydFRydWUoZWRnZURlY29yYXRvci5zYW5lKCkpOworCQl9IC8vIGZvciBlYWNoIGVkZ2UgZGVjb3JhdG9yCisKKwl9IC8vIHRlc3RHZXRVUklzCisKKwkvKioKKwkgKiBUZXN0IHRoZSBhYmlsaXR5IHRvIHNlcmlhbGl6ZSBhIG1vZGVsIGFuZCB0aGVuIGRlLXNlcmlhbGl6ZSBpdC4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplRGVzZXJpYWxpemUoKSB7CisJCWZpbmFsIE1vZGVsIG1vZGVsID0gZ2V0Rml4dHVyZSgpOworCQl0cnkgeworCQkJLy8gVGhlcmUgaXMgYW4gaXNzdWUgdG8gYmUgcmVzb2x2ZWQgd2l0aCBzZXJpYWxpemF0aW9uIG9mCisJCQkvLyBub24tY29udGFpbm1lbnQgcmVmZXJlbmNlcyB0byBzdWItbW9kZWxzIGFuZCBzdWItZ3JhcGhzLiBUaGUKKwkJCS8vIGZpeHR1cmUgd2UgY3JlYXRlIGFib3ZlIGhhcyBzb21lIHRoYXQgZG8gbm90IGhhdmUgYSByZXNvdXJjZQorCQkJLy8gc3BlY2lmaWVkIHNvIHdoZW4gd2Ugc2VyaWFsaXplIHRoZSBmaXh0dXJlIHRoZXkgZG9uJ3QgZ2V0CisJCQkvLyBzZXJpYWxpemVkLiBUaGUgcmVzdWx0IGlzIHRoYXQgd2hlbiB3ZSBkZS1zZXJpYWxpemUgdGhpbmdzIGZhaWwuCisJCQkvLyBDb21tZW50IG91dCB0aGUgcmVzdCBvZiB0aGlzIHRlc3QgdW50aWwgd2UgcmVzb2x2ZSBob3cgdG8gaGFuZGxlCisJCQkvLyB0aGlzIGFzIGEgc29sdXRpb24gbWF5IGVtZXJnZSBmcm9tIGhvdyB0aGUgZWRpdG9yIGltcGxlbWVudGF0aW9ucworCQkJLy8gc2VyaWFsaXplIHRoZSB0aGluZ3MgdGhleSBjcmVhdGUuIFRoZSBzb2x1dGlvbiBtYXkgYmUgdG8KKwkJCS8vIHJlZmxlY3RpdmVseSBsb29rIGZvciBub24tY29udGFpbm1lbnQgcmVmZXJlbmNlcyB3aGVuIHNlcmlhbGl6aW5nCisJCQkvLyBhbmQgc2V0IHRoZSByZXNvdXJjZSBmb3IgdGhvc2UgaW5zdGFuY2VzIHRoYXQgZG8gbm90IGhhdmUgb25lIHNvCisJCQkvLyB0aGV5IHdpbGwgYmUgcHJvcGVybHkgc2VyaWFsaXplZCB0b28uCisJCQkKKwkJCS8vVGVzdFV0aWwuc2VyaWFsaXplSWRlbnRpZmlhYmxlKG1vZGVsLCBTRVJJQUxaQVRJT05fVEVTVF9VUkkpOworCQkJLy8gZmluYWwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7CisJCQkvLyBmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKAorCQkJLy8gU0VSSUFMWkFUSU9OX1RFU1RfVVJJLCB0cnVlKTsKKwkJCS8vCisJCQkvLyByZXNvdXJjZS5sb2FkKG51bGwpOworCQkJLy8gZmluYWwgTW9kZWwgZGVzZXJpYWxpemVkTW9kZWwgPSAoTW9kZWwpCisJCQkvLyByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgKKwkJCS8vIDApOworCQkJLy8gYXNzZXJ0Tm90TnVsbChkZXNlcmlhbGl6ZWRNb2RlbCk7CisKKwkJfQorLy8JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgeworLy8JCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKy8vCQl9IC8vIGNhdGNoCisJCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKwkJCWZhaWwobnBlLmdldE1lc3NhZ2UoKSk7CisJCX0gLy8gbnVsbCBwb2ludGVyIGV4Y2VwdGlvbgorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOworCQl9CisJfSAvLyB0ZXN0U2VyaWFsaXplRGVzZXJpYWxpemUKKworCS8qKgorCSAqIFBlcmZvcm0gYSBKVW5pdCBhc3NlcnQgZW5zdXJpbmcgdGhhdCBhbGwgb2YgYSBOb2RlJ3MgbGFiZWxzIHJlZmVyZW5jZSB0aGUKKwkgKiBVUkkgb2YgdGhlIG5vZGUuCisJICogCisJICogQHBhcmFtIG5vZGUKKwkgKiAgICAgICAgICAgIHRoZSBub2RlIHRvIHZlcmlmeQorCSAqLworCXByaXZhdGUgdm9pZCB2ZXJpZnlOb2RlTGFiZWxzUmVmZXJlbmNlTm9kZShmaW5hbCBOb2RlIG5vZGUpIHsKKwkJZmluYWwgRUxpc3QgbGFiZWxzID0gbm9kZS5nZXRMYWJlbHMoKTsKKwkJZmluYWwgVVJJIG5vZGVVUkkgPSBub2RlLmdldFVSSSgpOworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yIG5vZGVMYWJlbEl0ZXIgPSBsYWJlbHMuaXRlcmF0b3IoKTsgbm9kZUxhYmVsSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBMYWJlbCBsYWJlbCA9IChMYWJlbCkgbm9kZUxhYmVsSXRlci5uZXh0KCk7CisJCQlhc3NlcnRUcnVlKCJMYWJlbCBcIiIgKyBsYWJlbC5nZXRVUkkoKQorCQkJCQkrICJcIiBkb2VzIG5vdCByZWZlcmVuY2Ugbm9kZSBcIiIgKyBub2RlVVJJLnRvU3RyaW5nKCkKKwkJCQkJKyAiXCIsIGluc3RlYWQsIGl0IHJlZmVyZW5jZXMgXCIiCisJCQkJCSsgbGFiZWwuZ2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCgpICsgIlwiIiwgbGFiZWwKKwkJCQkJLmdldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQoKS5lcXVhbHMobm9kZVVSSSkpOworCQl9IC8vIGZvciBlYWNoIG5vZGUncyBsYWJlbAorCX0gLy8gdmVyaWZ5TGFiZWxzUmVmZXJlbmNlTm9kZQorCit9IC8vIE1vZGVsVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvdGVzdHMvTW9kZWxUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvdGVzdHMvTW9kZWxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOGI0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC90ZXN0cy9Nb2RlbFRlc3RzLmphdmEKQEAgLTAsMCArMSw1NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IHN1aXRlIGZvciB0aGUgJzxlbT48Yj5tb2RlbDwvYj48L2VtPicgcGFja2FnZS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgTW9kZWxUZXN0cygibW9kZWwgVGVzdHMiKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKE1vZGVsVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShTVEVNVGltZVRlc3QuY2xhc3MpOworCQlyZXR1cm4gc3VpdGU7CisJfSAvLyBzdWl0ZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCit9IC8vTW9kZWxUZXN0cwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvdGVzdHMvTm9kZURlY29yYXRvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Rlc3RzL05vZGVEZWNvcmF0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkNGY1YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Rlc3RzL05vZGVEZWNvcmF0b3JUZXN0LmphdmEKQEAgLTAsMCArMSw5MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ob2RlIERlY29yYXRvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgTm9kZURlY29yYXRvclRlc3QgZXh0ZW5kcyBEZWNvcmF0b3JUZXN0IHsKKwkKKwlwdWJsaWMgc3RhdGljIFVSSSBERUNPUkFUT1JfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoImRlY29yYXRvci9ub2RlRGVjb3JhdG9yVGVzdC5kZWNvcmF0b3IiKTsKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihOb2RlRGVjb3JhdG9yVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBOb2RlIERlY29yYXRvciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vZGVEZWNvcmF0b3JUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTm9kZSBEZWNvcmF0b3IgdGVzdCBjYXNlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTm9kZURlY29yYXRvciBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKE5vZGVEZWNvcmF0b3IpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU5vZGVEZWNvcmF0b3IgZD0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVOb2RlRGVjb3JhdG9yKCk7CisJCWQuc2V0VVJJKERFQ09SQVRPUl9VUkkpOworCQlzZXRGaXh0dXJlKGQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IHRoZSBzYW5pdHkgb2YgdGhlIGZpeHR1cmUKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2FuZSgpIHsKKwkJZmluYWwgTm9kZURlY29yYXRvciBub2RlRGVjb3JhdG9yID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKG5vZGVEZWNvcmF0b3Iuc2FuZSgpKTsKKwl9IC8vIHRlc3RTYW5lCisKK30gLy8gTm9kZURlY29yYXRvclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Rlc3RzL1NURU1UaW1lVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kZWwvdGVzdHMvU1RFTVRpbWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUwZWU4NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3Rlc3RzL1NURU1UaW1lVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNURU0gVGltZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSB0ZXN0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lI2FkZEluY3JlbWVudChsb25nKSA8ZW0+QWRkIEluY3JlbWVudDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lI2hhc2hDb2RlKCkgPGVtPkhhc2ggQ29kZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KSA8ZW0+RXF1YWxzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFNURU1UaW1lVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCS8vIE9uZSBkYXkncyB3b3J0aCBvZiBtaWxsaXNlY29uZHMKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRFU1RfSU5DUkVNRU5UID0gMjQgKiA2MCAqIDYwICogMTAwMDsKKworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFNURU0gVGltZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNURU1UaW1lIGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oU1RFTVRpbWVUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFNURU0gVGltZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNURU1UaW1lVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNURU0gVGltZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShTVEVNVGltZSBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTVEVNIFRpbWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTVEVNVGltZSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTVEVNVGltZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lI2FkZEluY3JlbWVudChsb25nKSA8ZW0+QWRkIEluY3JlbWVudDwvZW0+fScKKwkgKiBvcGVyYXRpb24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lI2FkZEluY3JlbWVudChsb25nKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEFkZEluY3JlbWVudF9fbG9uZygpIHsKKwkJZmluYWwgU1RFTVRpbWUgc3RhcnRUaW1lID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBTVEVNVGltZSBuZXdUaW1lID0gc3RhcnRUaW1lLmFkZEluY3JlbWVudChURVNUX0lOQ1JFTUVOVCk7CisJCWFzc2VydFRydWUobmV3VGltZS5nZXRUaW1lKCkuY29tcGFyZVRvKHN0YXJ0VGltZS5nZXRUaW1lKCkpID4gMCk7CisJCWFzc2VydFRydWUobmV3VGltZS5nZXRUaW1lKCkuZ2V0VGltZSgpIC0gc3RhcnRUaW1lLmdldFRpbWUoKS5nZXRUaW1lKCkgPT0gVEVTVF9JTkNSRU1FTlQpOworCX0gLy8gdGVzdEFkZEluY3JlbWVudF9fbG9uZworCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lI2hhc2hDb2RlKCkgPGVtPkhhc2ggQ29kZTwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUjaGFzaENvZGUoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgeworCQlmaW5hbCBTVEVNVGltZSB0aW1lMSA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgU1RFTVRpbWUgdGltZTFhID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKHRpbWUxLmhhc2hDb2RlKCkgPT0gdGltZTFhLmhhc2hDb2RlKCkpOworCQlmaW5hbCBTVEVNVGltZSB0aW1lMiA9IHRpbWUxYS5hZGRJbmNyZW1lbnQoVEVTVF9JTkNSRU1FTlQpOworCQlhc3NlcnRGYWxzZSh0aW1lMS5oYXNoQ29kZSgpID09IHRpbWUyLmhhc2hDb2RlKCkpOworCX0gLy8gdGVzdEhhc2hDb2RlCisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpIDxlbT5FcXVhbHM8L2VtPn0nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEVxdWFsc19fT2JqZWN0KCkgeworCQlmaW5hbCBTVEVNVGltZSB0aW1lMSA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgU1RFTVRpbWUgdGltZTFhID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKHRpbWUxLmVxdWFscyggdGltZTFhKSk7CisJfSAvLyB0ZXN0RXF1YWxzX19PYmplY3QKKworfSAvLyBTVEVNVGltZVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL0RvdWJsZU1vZGlmaWVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvRG91YmxlTW9kaWZpZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ5YjM4OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL0RvdWJsZU1vZGlmaWVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvdWJsZSBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIERvdWJsZU1vZGlmaWVyVGVzdCBleHRlbmRzIFNpbmdsZVZhbHVlTW9kaWZpZXJUZXN0IHsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oRG91YmxlTW9kaWZpZXJUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IERvdWJsZSBNb2RpZmllciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRG91YmxlTW9kaWZpZXJUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRG91YmxlIE1vZGlmaWVyIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRG91YmxlTW9kaWZpZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChEb3VibGVNb2RpZmllcilmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG91YmxlTW9kaWZpZXIoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJQE92ZXJyaWRlCisJaW50IGdldE51bWJlck9mTW9kaWZpY2F0aW9ucygpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gMDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzaWZpZXIgZ2V0VGVzdEF0dHJpYnV0ZUVUeXBlKCkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRmVhdHVyZVZhbHVlKGludCBpKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIGZhbHNlOworCX0KKworfSAvL0RvdWJsZU1vZGlmaWVyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvRG91YmxlTk9QTW9kaWZpZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9Eb3VibGVOT1BNb2RpZmllclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTAzZDkyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvRG91YmxlTk9QTW9kaWZpZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMDQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRG91YmxlTk9QTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb3VibGUgTk9QIE1vZGlmaWVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBEb3VibGVOT1BNb2RpZmllclRlc3QgZXh0ZW5kcyBOT1BNb2RpZmllclRlc3QgeworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihEb3VibGVOT1BNb2RpZmllclRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgRG91YmxlIE5PUCBNb2RpZmllciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRG91YmxlTk9QTW9kaWZpZXJUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRG91YmxlIE5PUCBNb2RpZmllciB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIERvdWJsZU5PUE1vZGlmaWVyIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoRG91YmxlTk9QTW9kaWZpZXIpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiBhIHtAbGluayBEb3VibGVOT1BNb2RpZmllcn0gcmVhZHkgZm9yIHRlc3RpbmcuCisJICovCisJcHVibGljIERvdWJsZU5PUE1vZGlmaWVyIGNyZWF0ZUZpeHR1cmUoKSB7CisJCWZpbmFsIERvdWJsZU5PUE1vZGlmaWVyIHJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEb3VibGVOT1BNb2RpZmllcigpOworCQlFT2JqZWN0IHRlc3RPYmplY3QgPSBnZXRUZXN0T2JqZWN0KCk7CisJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gdGVzdE9iamVjdC5lQ2xhc3MoKQorCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwkJcmV0VmFsdWUuc2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmUpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVGaXh0dXJlCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuRmVhdHVyZU1vZGlmaWVyVGVzdCNnZXRUZXN0QXR0cmlidXRlRVR5cGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3NpZmllciBnZXRUZXN0QXR0cmlidXRlRVR5cGUoKSB7CisJCXJldHVybiBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVEb3VibGUoKTsKKwl9IC8vIGdldFRlc3RBdHRyaWJ1dGVFVHlwZQorfSAvL0RvdWJsZU5PUE1vZGlmaWVyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvRG91YmxlUmFuZ2VNb2RpZmllclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL0RvdWJsZVJhbmdlTW9kaWZpZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI4ZmU0NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL0RvdWJsZVJhbmdlTW9kaWZpZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMzIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZVJhbmdlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvdWJsZSBSYW5nZSBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgRG91YmxlUmFuZ2VNb2RpZmllclRlc3QgZXh0ZW5kcyBSYW5nZU1vZGlmaWVyVGVzdCB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBEUk1fU1RBUlRfVkFMVUUgPSAxMC4wOworCXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIERSTV9FTkRfVkFMVUUgPSAxMi41OworCXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIERSTV9JTkNSRU1FTlRfVkFMVUUgPSAxLjA7CisKKwkvLyAxMCwgMTEsIDEyLCAxMi41CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIEVYUEVDVEVEX1ZBTFVFU1tdID0gbmV3IGRvdWJsZVtdIHsKKwkJCURSTV9TVEFSVF9WQUxVRSwgRFJNX1NUQVJUX1ZBTFVFICsgRFJNX0lOQ1JFTUVOVF9WQUxVRSwKKwkJCURSTV9TVEFSVF9WQUxVRSArIDIgKiBEUk1fSU5DUkVNRU5UX1ZBTFVFLCBEUk1fRU5EX1ZBTFVFIH07CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihEb3VibGVSYW5nZU1vZGlmaWVyVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBEb3VibGUgUmFuZ2UgTW9kaWZpZXIgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEb3VibGVSYW5nZU1vZGlmaWVyVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIERvdWJsZSBSYW5nZSBNb2RpZmllciB0ZXN0IGNhc2UuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBEb3VibGVSYW5nZU1vZGlmaWVyIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoRG91YmxlUmFuZ2VNb2RpZmllcilmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogQHJldHVybiBhIHtAbGluayBEb3VibGVSYW5nZU1vZGlmaWVyfSByZWFkeSBmb3IgdGVzdGluZy4KKwkgKi8KKwlwdWJsaWMgRG91YmxlUmFuZ2VNb2RpZmllciBjcmVhdGVGaXh0dXJlKCkgeworCQlmaW5hbCBEb3VibGVSYW5nZU1vZGlmaWVyIHJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVEb3VibGVSYW5nZU1vZGlmaWVyKCk7CisJCXJldFZhbHVlLnNldFN0YXJ0VmFsdWUoRFJNX1NUQVJUX1ZBTFVFKTsKKwkJcmV0VmFsdWUuc2V0RW5kVmFsdWUoRFJNX0VORF9WQUxVRSk7CisJCXJldFZhbHVlLnNldEluY3JlbWVudChEUk1fSU5DUkVNRU5UX1ZBTFVFKTsKKwkJcmV0VmFsdWUuc2V0RVN0cnVjdHVyYWxGZWF0dXJlKGdldFRlc3RPYmplY3QoKS5lQ2xhc3MoKQorCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuRmVhdHVyZU1vZGlmaWVyVGVzdCNnZXRUZXN0QXR0cmlidXRlRVR5cGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3NpZmllciBnZXRUZXN0QXR0cmlidXRlRVR5cGUoKSB7CisJCXJldHVybiBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVEb3VibGUoKTsKKwl9IC8vIGdldFRlc3RBdHRyaWJ1dGVFVHlwZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuRmVhdHVyZU1vZGlmaWVyVGVzdCNnZXROdW1iZXJPZk1vZGlmaWNhdGlvbnMoKQorCSAqLworCUBPdmVycmlkZQorCWludCBnZXROdW1iZXJPZk1vZGlmaWNhdGlvbnMoKSB7CisJCXJldHVybiBFWFBFQ1RFRF9WQUxVRVMubGVuZ3RoOworCX0gLy8gZ2V0TnVtYmVyT2ZNb2RpZmljYXRpb25zCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0cy5GZWF0dXJlTW9kaWZpZXJUZXN0I3ZhbGlkYXRlRmVhdHVyZVZhbHVlKGludCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUZlYXR1cmVWYWx1ZShpbnQgaSkgeworCQlhc3NlcnRUcnVlKGkgPj0gMCk7CisJCWFzc2VydFRydWUoaSA8IEVYUEVDVEVEX1ZBTFVFUy5sZW5ndGgpOworCQlmaW5hbCBEb3VibGVSYW5nZU1vZGlmaWVyIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCURvdWJsZSBjdXJyZW50VmFsdWUgPSAoRG91YmxlKSBnZXRUZXN0T2JqZWN0KCkuZUdldCgKKwkJCQlmaXh0dXJlLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpKTsKKworCQlyZXR1cm4gY3VycmVudFZhbHVlLmRvdWJsZVZhbHVlKCkgPT0gRVhQRUNURURfVkFMVUVTW2ldOworCX0gLy8gdmFsaWRhdGVGZWF0dXJlVmFsdWUKKworfSAvLyBEb3VibGVSYW5nZU1vZGlmaWVyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvRG91YmxlU2VxdWVuY2VNb2RpZmllclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL0RvdWJsZVNlcXVlbmNlTW9kaWZpZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA2Y2U5NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL0RvdWJsZVNlcXVlbmNlTW9kaWZpZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMzUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZVNlcXVlbmNlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2VxdWVuY2VNb2RpZmllcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb3VibGUgU2VxdWVuY2UgTW9kaWZpZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIERvdWJsZVNlcXVlbmNlTW9kaWZpZXJUZXN0IGV4dGVuZHMgU2VxdWVuY2VNb2RpZmllclRlc3QgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIEVYUEVDVEVEX1ZBTFVFU1tdID0gbmV3IGRvdWJsZVtdIHsKKwkJCURvdWJsZVJhbmdlTW9kaWZpZXJUZXN0LkRSTV9TVEFSVF9WQUxVRSwKKwkJCURvdWJsZVJhbmdlTW9kaWZpZXJUZXN0LkRSTV9FTkRfVkFMVUUgfTsKKworCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oRG91YmxlU2VxdWVuY2VNb2RpZmllclRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgRG91YmxlIFNlcXVlbmNlIE1vZGlmaWVyIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEb3VibGVTZXF1ZW5jZU1vZGlmaWVyVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIERvdWJsZSBTZXF1ZW5jZSBNb2RpZmllciB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIERvdWJsZVNlcXVlbmNlTW9kaWZpZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChEb3VibGVTZXF1ZW5jZU1vZGlmaWVyKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQlzZXRGaXh0dXJlKGNyZWF0ZUZpeHR1cmUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuU2VxdWVuY2VNb2RpZmllclRlc3QjY3JlYXRlRml4dHVyZSgpCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCisJQE92ZXJyaWRlCisJcHVibGljIFNlcXVlbmNlTW9kaWZpZXIgY3JlYXRlRml4dHVyZSgpIHsKKwkJZmluYWwgRG91YmxlU2VxdWVuY2VNb2RpZmllciByZXRWYWx1ZSA9IE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlRG91YmxlU2VxdWVuY2VNb2RpZmllcigpOworCQlmb3IgKGRvdWJsZSB2YWx1ZSA6IEVYUEVDVEVEX1ZBTFVFUykgeworCQkJIHJldFZhbHVlLmdldFNlcXVlbmNlKCkuYWRkKHZhbHVlKTsKKwkJfSAvLyBmb3IgZWFjaCBkb3VibGUKKworCQlyZXRWYWx1ZS5zZXRFU3RydWN0dXJhbEZlYXR1cmUoZ2V0VGVzdE9iamVjdCgpLmVDbGFzcygpCisJCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0cy5GZWF0dXJlTW9kaWZpZXJUZXN0I2dldE51bWJlck9mTW9kaWZpY2F0aW9ucygpCisJICovCisJQE92ZXJyaWRlCisJaW50IGdldE51bWJlck9mTW9kaWZpY2F0aW9ucygpIHsKKwkJcmV0dXJuIEVYUEVDVEVEX1ZBTFVFUy5sZW5ndGg7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuRmVhdHVyZU1vZGlmaWVyVGVzdCNnZXRUZXN0QXR0cmlidXRlRVR5cGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3NpZmllciBnZXRUZXN0QXR0cmlidXRlRVR5cGUoKSB7CisJCXJldHVybiBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVEb3VibGUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0cy5GZWF0dXJlTW9kaWZpZXJUZXN0I3ZhbGlkYXRlRmVhdHVyZVZhbHVlKGludCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUZlYXR1cmVWYWx1ZShpbnQgaSkgeworCQlhc3NlcnRUcnVlKGkgPj0gMCk7CisJCWFzc2VydFRydWUoaSA8IEVYUEVDVEVEX1ZBTFVFUy5sZW5ndGgpOworCQlmaW5hbCBEb3VibGVTZXF1ZW5jZU1vZGlmaWVyIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCURvdWJsZSBjdXJyZW50VmFsdWUgPSAoRG91YmxlKSBnZXRUZXN0T2JqZWN0KCkuZUdldCgKKwkJCQlmaXh0dXJlLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpKTsKKwkJcmV0dXJuIGN1cnJlbnRWYWx1ZS5kb3VibGVWYWx1ZSgpID09IEVYUEVDVEVEX1ZBTFVFU1tpXTsKKwl9IC8vIHZhbGlkYXRlRmVhdHVyZVZhbHVlCisJCit9IC8vRG91YmxlU2VxdWVuY2VNb2RpZmllclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL0ZlYXR1cmVNb2RpZmllclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL0ZlYXR1cmVNb2RpZmllclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmRiYjY5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvRmVhdHVyZU1vZGlmaWVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRmVhdHVyZU1vZGlmaWVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmVhdHVyZSBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgdGVzdGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXIjaXNDb21wbGV0ZSgpIDxlbT5Db21wbGV0ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgYXJlIHRlc3RlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRmVhdHVyZU1vZGlmaWVyI3VwZGF0ZUZlYXR1cmUoKSA8ZW0+VXBkYXRlIEZlYXR1cmU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXIjcmVzZXQoKSA8ZW0+UmVzZXQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEZlYXR1cmVNb2RpZmllclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJVQ1RVUkFMX0ZFQVRVUkVfTkFNRSA9ICJhdHRyaWJ1dGUiOworCisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgRmVhdHVyZSBNb2RpZmllciB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEZlYXR1cmVNb2RpZmllciBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBvYmplY3QgdG8gYmUgbW9kaWZpZWQuCisJICovCisJcHJvdGVjdGVkIEVPYmplY3QgdGVzdE9iamVjdCA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZlYXR1cmUgTW9kaWZpZXIgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBGZWF0dXJlTW9kaWZpZXJUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQl0ZXN0T2JqZWN0ID0gY3JlYXRlVGVzdE9iamVjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRmVhdHVyZSBNb2RpZmllciB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShGZWF0dXJlTW9kaWZpZXIgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRmVhdHVyZSBNb2RpZmllciB0ZXN0IGNhc2UuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBGZWF0dXJlTW9kaWZpZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0VGVzdE9iamVjdCgpIHsKKwkJcmV0dXJuIHRlc3RPYmplY3Q7CisJfSAvLyBnZXRUZXN0T2JqZWN0CisKKwkvKioKKwkgKiBUZXN0IHRoYXQgdGhlIGZpeHR1cmUgaXMgInNhbmUiCisJICogCisJICogQHNlZSBTYW5pdHlDaGVja2VyCisJICovCisJcHVibGljIHZvaWQgdGVzdEZpeHR1cmVTYW5pdHkoKSB7CisJCWZpbmFsIFNhbml0eUNoZWNrZXIgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShmaXh0dXJlLnNhbmUoKSk7CisJfSAvLyB0ZXN0Rml4dHVyZVNhbml0eQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkZlYXR1cmVNb2RpZmllciNnZXRNb2RpZmljYXRpb25TdW1tYXJ5KCkgPGVtPk1vZGlmaWNhdGlvbiBTdW1tYXJ5PC9lbT59JworCSAqIGZlYXR1cmUgZ2V0dGVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXIjZ2V0TW9kaWZpY2F0aW9uU3VtbWFyeSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TW9kaWZpY2F0aW9uU3VtbWFyeSgpIHsKKwkJZmluYWwgRmVhdHVyZU1vZGlmaWVyIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCWZpbmFsIEVPYmplY3QgdGVzdE9iamVjdCA9IGdldFRlc3RPYmplY3QoKTsKKwkJZml4dHVyZS5zZXRUYXJnZXQodGVzdE9iamVjdCk7CisJCQorCQlmaW5hbCBpbnQgbnVtYmVyT2ZNb2RpZmljYXRpb25zID0gZ2V0TnVtYmVyT2ZNb2RpZmljYXRpb25zKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZNb2RpZmljYXRpb25zOyBpKyspIHsKKwkJCWFzc2VydEZhbHNlKGZpeHR1cmUuaXNDb21wbGV0ZSgpKTsKKwkJCWZpeHR1cmUudXBkYXRlRmVhdHVyZSgpOworCQkJZmluYWwgU3RyaW5nIHRlbXAgPSBmaXh0dXJlLmdldE1vZGlmaWNhdGlvblN1bW1hcnkoKTsKKwkJCWFzc2VydE5vdE51bGwodGVtcCk7CisJCQlhc3NlcnRGYWxzZSh0ZW1wLmVxdWFscygiIikpOworCQl9IC8vIGZvciBpCisJCWFzc2VydFRydWUoZml4dHVyZS5pc0NvbXBsZXRlKCkpOworCisJfSAvLyB0ZXN0R2V0TW9kaWZpY2F0aW9uU3VtbWFyeQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkZlYXR1cmVNb2RpZmllciNpc0NvbXBsZXRlKCkgPGVtPkNvbXBsZXRlPC9lbT59JworCSAqIGZlYXR1cmUgZ2V0dGVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXIjaXNDb21wbGV0ZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0SXNDb21wbGV0ZSgpIHsKKwkJZmluYWwgRmVhdHVyZU1vZGlmaWVyIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCWZpbmFsIEVPYmplY3QgdGVzdE9iamVjdCA9IGdldFRlc3RPYmplY3QoKTsKKwkJZml4dHVyZS5zZXRUYXJnZXQodGVzdE9iamVjdCk7CisKKwkJZmluYWwgaW50IG51bWJlck9mTW9kaWZpY2F0aW9ucyA9IGdldE51bWJlck9mTW9kaWZpY2F0aW9ucygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mTW9kaWZpY2F0aW9uczsgaSsrKSB7CisJCQlhc3NlcnRGYWxzZShmaXh0dXJlLmlzQ29tcGxldGUoKSk7CisJCQlmaXh0dXJlLnVwZGF0ZUZlYXR1cmUoKTsKKwkJfSAvLyBmb3IgaQorCQlhc3NlcnRUcnVlKGZpeHR1cmUuaXNDb21wbGV0ZSgpKTsKKwl9IC8vIHRlc3RJc0NvbXBsZXRlCisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRmVhdHVyZU1vZGlmaWVyI3VwZGF0ZUZlYXR1cmUoKSA8ZW0+VXBkYXRlIEZlYXR1cmU8L2VtPn0nCisJICogb3BlcmF0aW9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXIjdXBkYXRlRmVhdHVyZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRmVhdHVyZSgpIHsKKwkJZmluYWwgRmVhdHVyZU1vZGlmaWVyIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCWZpbmFsIEVPYmplY3QgdGVzdE9iamVjdCA9IGdldFRlc3RPYmplY3QoKTsKKwkJZml4dHVyZS5zZXRUYXJnZXQodGVzdE9iamVjdCk7CisKKwkJZmluYWwgaW50IG51bWJlck9mTW9kaWZpY2F0aW9ucyA9IGdldE51bWJlck9mTW9kaWZpY2F0aW9ucygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mTW9kaWZpY2F0aW9uczsgaSsrKSB7CisJCQlhc3NlcnRGYWxzZShmaXh0dXJlLmlzQ29tcGxldGUoKSk7CisJCQlmaXh0dXJlLnVwZGF0ZUZlYXR1cmUoKTsKKwkJCWFzc2VydFRydWUodmFsaWRhdGVGZWF0dXJlVmFsdWUoaSkpOworCQl9IC8vIGZvciBpCisJCWFzc2VydFRydWUoZml4dHVyZS5pc0NvbXBsZXRlKCkpOworCX0gLy8gdGVzdFVwZGF0ZUZlYXR1cmUKKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXIjcmVzZXQoKSA8ZW0+UmVzZXQ8L2VtPn0nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkZlYXR1cmVNb2RpZmllciNyZXNldCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0UmVzZXQoKSB7CisJCWZpbmFsIEZlYXR1cmVNb2RpZmllciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBFT2JqZWN0IHRlc3RPYmplY3QgPSBnZXRUZXN0T2JqZWN0KCk7CisJCWZpeHR1cmUuc2V0VGFyZ2V0KHRlc3RPYmplY3QpOworCQkvLyBUT0RPIGltcGxlbWVudCBGZWF0dXJlTW9kaWZpZXJUZXN0LnRlc3RSZXNldCgpCisJCWFzc2VydFRydWUodHJ1ZSk7CisJfSAvLyB0ZXN0UmVzZXQKKworCS8qKgorCSAqIEByZXR1cm4gYW4ge0BsaW5rIEVPYmplY3R9IHRvIGJlIG1vZGlmaWVkCisJICovCisJcHJvdGVjdGVkIEVPYmplY3QgY3JlYXRlVGVzdE9iamVjdCgpIHsKKwkJcmV0dXJuIE1vZGlmaWVyVGVzdC5jcmVhdGVUZXN0T2JqZWN0KCJUZXN0Q2xhc3MiLCBBcnJheXMKKwkJCQkuYXNMaXN0KGdldFRlc3RBdHRyaWJ1dGVFVHlwZSgpKSk7CisJfSAvLyBjcmVhdGVUZXN0T2JqZWN0CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgRUNsYXNzaWZpZXJ9IG9mIHRoYXQgaXMgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSBpbgorCSAqICAgICAgICAgdGhlIHRlc3Qgb2JqZWN0LgorCSAqLworCWFic3RyYWN0IHByb3RlY3RlZCBFQ2xhc3NpZmllciBnZXRUZXN0QXR0cmlidXRlRVR5cGUoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtb2RpZmljYXRpb25zIHRoZSB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyfSB3aWxsIG1ha2UKKwkgKiAgICAgICAgIHRvIHRoZSB0ZXN0IG9iamVjdC4KKwkgKi8KKwlhYnN0cmFjdCBpbnQgZ2V0TnVtYmVyT2ZNb2RpZmljYXRpb25zKCk7CisKKwkvKioKKwkgKiBAcGFyYW0gaQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZlYXR1cmUgdmFsdWUgbWF0Y2hlcyB0aGUgaSd0aAorCSAqICAgICAgICAgZXhwZWN0ZWQgdmFsdWUuCisJICovCisJYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVGZWF0dXJlVmFsdWUoaW50IGkpOworCit9IC8vIEZlYXR1cmVNb2RpZmllclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL0ludGVnZXJNb2RpZmllclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL0ludGVnZXJNb2RpZmllclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzdmNjUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvSW50ZWdlck1vZGlmaWVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlZ2VyIE1vZGlmaWVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgSW50ZWdlck1vZGlmaWVyVGVzdCBleHRlbmRzIFNpbmdsZVZhbHVlTW9kaWZpZXJUZXN0IHsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oSW50ZWdlck1vZGlmaWVyVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBJbnRlZ2VyIE1vZGlmaWVyIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJbnRlZ2VyTW9kaWZpZXJUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgSW50ZWdlciBNb2RpZmllciB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEludGVnZXJNb2RpZmllciBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKEludGVnZXJNb2RpZmllcilmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW50ZWdlck1vZGlmaWVyKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCUBPdmVycmlkZQorCWludCBnZXROdW1iZXJPZk1vZGlmaWNhdGlvbnMoKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIDA7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzc2lmaWVyIGdldFRlc3RBdHRyaWJ1dGVFVHlwZSgpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUZlYXR1cmVWYWx1ZShpbnQgaSkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBmYWxzZTsKKwl9CisKK30gLy9JbnRlZ2VyTW9kaWZpZXJUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9JbnRlZ2VyTk9QTW9kaWZpZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9JbnRlZ2VyTk9QTW9kaWZpZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhiZTliNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL0ludGVnZXJOT1BNb2RpZmllclRlc3QuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyTk9QTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlZ2VyIE5PUCBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgSW50ZWdlck5PUE1vZGlmaWVyVGVzdCBleHRlbmRzIE5PUE1vZGlmaWVyVGVzdCB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKEludGVnZXJOT1BNb2RpZmllclRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgSW50ZWdlciBOT1AgTW9kaWZpZXIgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEludGVnZXJOT1BNb2RpZmllclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBJbnRlZ2VyIE5PUCBNb2RpZmllciB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEludGVnZXJOT1BNb2RpZmllciBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKEludGVnZXJOT1BNb2RpZmllcilmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIGEge0BsaW5rIEludGVnZXJOT1BNb2RpZmllcn0gcmVhZHkgZm9yIHRlc3RpbmcuCisJICovCisJcHVibGljIEludGVnZXJOT1BNb2RpZmllciBjcmVhdGVGaXh0dXJlKCkgeworCQlmaW5hbCBJbnRlZ2VyTk9QTW9kaWZpZXIgcmV0VmFsdWUgPSBNb2RpZmllckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUludGVnZXJOT1BNb2RpZmllcigpOworCQlFT2JqZWN0IHRlc3RPYmplY3QgPSBnZXRUZXN0T2JqZWN0KCk7CisJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gdGVzdE9iamVjdC5lQ2xhc3MoKQorCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwkJcmV0VmFsdWUuc2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmUpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVGaXh0dXJlCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuRmVhdHVyZU1vZGlmaWVyVGVzdCNnZXRUZXN0QXR0cmlidXRlRVR5cGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3NpZmllciBnZXRUZXN0QXR0cmlidXRlRVR5cGUoKSB7CisJCXJldHVybiBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVJbnQoKTsKKwl9Cit9IC8vSW50ZWdlck5PUE1vZGlmaWVyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvSW50ZWdlclJhbmdlTW9kaWZpZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9JbnRlZ2VyUmFuZ2VNb2RpZmllclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTEzZmYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvSW50ZWdlclJhbmdlTW9kaWZpZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMzAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJSYW5nZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllckZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlZ2VyIFJhbmdlIE1vZGlmaWVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBJbnRlZ2VyUmFuZ2VNb2RpZmllclRlc3QgZXh0ZW5kcyBSYW5nZU1vZGlmaWVyVGVzdCB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJUk1fU1RBUlRfVkFMVUUgPSAyMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJUk1fRU5EX1ZBTFVFID0gMjI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVJNX0lOQ1JFTUVOVF9WQUxVRSA9IDE7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVhQRUNURURfVkFMVUVTW10gPSBuZXcgaW50W10geyBJUk1fU1RBUlRfVkFMVUUsCisJCQlJUk1fU1RBUlRfVkFMVUUgKyBJUk1fSU5DUkVNRU5UX1ZBTFVFLCBJUk1fRU5EX1ZBTFVFIH07CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihJbnRlZ2VyUmFuZ2VNb2RpZmllclRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgSW50ZWdlciBSYW5nZSBNb2RpZmllciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEludGVnZXJSYW5nZU1vZGlmaWVyVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEludGVnZXIgUmFuZ2UgTW9kaWZpZXIgdGVzdCBjYXNlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSW50ZWdlclJhbmdlTW9kaWZpZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChJbnRlZ2VyUmFuZ2VNb2RpZmllcilmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogQHJldHVybiBhIHtAbGluayBJbnRlZ2VyUmFuZ2VNb2RpZmllcn0gcmVhZHkgZm9yIHRlc3RpbmcuCisJICovCisJcHVibGljIEludGVnZXJSYW5nZU1vZGlmaWVyIGNyZWF0ZUZpeHR1cmUoKSB7CisJCWZpbmFsIEludGVnZXJSYW5nZU1vZGlmaWVyIHJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVJbnRlZ2VyUmFuZ2VNb2RpZmllcigpOworCQlyZXRWYWx1ZS5zZXRTdGFydFZhbHVlKElSTV9TVEFSVF9WQUxVRSk7CisJCXJldFZhbHVlLnNldEVuZFZhbHVlKElSTV9FTkRfVkFMVUUpOworCQlyZXRWYWx1ZS5zZXRJbmNyZW1lbnQoSVJNX0lOQ1JFTUVOVF9WQUxVRSk7CisJCXJldFZhbHVlLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShnZXRUZXN0T2JqZWN0KCkuZUNsYXNzKCkKKwkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUZpeHR1cmUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzLkZlYXR1cmVNb2RpZmllclRlc3QjZ2V0VGVzdEF0dHJpYnV0ZUVUeXBlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzaWZpZXIgZ2V0VGVzdEF0dHJpYnV0ZUVUeXBlKCkgeworCQlyZXR1cm4gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFSW50KCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuRmVhdHVyZU1vZGlmaWVyVGVzdCNnZXROdW1iZXJPZk1vZGlmaWNhdGlvbnMoKQorCSAqLworCUBPdmVycmlkZQorCWludCBnZXROdW1iZXJPZk1vZGlmaWNhdGlvbnMoKSB7CisJCXJldHVybiBFWFBFQ1RFRF9WQUxVRVMubGVuZ3RoOworCX0gLy8gZ2V0TnVtYmVyT2ZNb2RpZmljYXRpb25zCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0cy5GZWF0dXJlTW9kaWZpZXJUZXN0I3ZhbGlkYXRlRmVhdHVyZVZhbHVlKGludCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUZlYXR1cmVWYWx1ZShpbnQgaSkgeworCQlhc3NlcnRUcnVlKGkgPj0gMCk7CisJCWFzc2VydFRydWUoaSA8IEVYUEVDVEVEX1ZBTFVFUy5sZW5ndGgpOworCQlmaW5hbCBJbnRlZ2VyUmFuZ2VNb2RpZmllciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlJbnRlZ2VyIGN1cnJlbnRWYWx1ZSA9IChJbnRlZ2VyKSBnZXRUZXN0T2JqZWN0KCkuZUdldCgKKwkJCQlmaXh0dXJlLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpKTsKKworCQlyZXR1cm4gY3VycmVudFZhbHVlLmludFZhbHVlKCkgPT0gRVhQRUNURURfVkFMVUVTW2ldOworCX0gLy8gdmFsaWRhdGVGZWF0dXJlVmFsdWUKKworfSAvLyBJbnRlZ2VyUmFuZ2VNb2RpZmllclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL0ludGVnZXJTZXF1ZW5jZU1vZGlmaWVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ1Nzg2NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL0ludGVnZXJTZXF1ZW5jZU1vZGlmaWVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyU2VxdWVuY2VNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TZXF1ZW5jZU1vZGlmaWVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkludGVnZXIgU2VxdWVuY2UgTW9kaWZpZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEludGVnZXJTZXF1ZW5jZU1vZGlmaWVyVGVzdCBleHRlbmRzIFNlcXVlbmNlTW9kaWZpZXJUZXN0IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBFQ1RFRF9WQUxVRVNbXSA9IG5ldyBpbnRbXSB7CisJCUludGVnZXJSYW5nZU1vZGlmaWVyVGVzdC5JUk1fU1RBUlRfVkFMVUUsCisJCUludGVnZXJSYW5nZU1vZGlmaWVyVGVzdC5JUk1fRU5EX1ZBTFVFIH07CisKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKEludGVnZXJTZXF1ZW5jZU1vZGlmaWVyVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBJbnRlZ2VyIFNlcXVlbmNlIE1vZGlmaWVyIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJbnRlZ2VyU2VxdWVuY2VNb2RpZmllclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBJbnRlZ2VyIFNlcXVlbmNlIE1vZGlmaWVyIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSW50ZWdlclNlcXVlbmNlTW9kaWZpZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChJbnRlZ2VyU2VxdWVuY2VNb2RpZmllcilmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzLlNlcXVlbmNlTW9kaWZpZXJUZXN0I2NyZWF0ZUZpeHR1cmUoKQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQorCUBPdmVycmlkZQorCXB1YmxpYyBTZXF1ZW5jZU1vZGlmaWVyIGNyZWF0ZUZpeHR1cmUoKSB7CisJCWZpbmFsIEludGVnZXJTZXF1ZW5jZU1vZGlmaWVyIHJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVJbnRlZ2VyU2VxdWVuY2VNb2RpZmllcigpOworCQlmb3IgKGludCB2YWx1ZSA6IEVYUEVDVEVEX1ZBTFVFUykgeworCQkJIHJldFZhbHVlLmdldFNlcXVlbmNlKCkuYWRkKHZhbHVlKTsKKwkJfSAvLyBmb3IgZWFjaCBkb3VibGUKKworCQlyZXRWYWx1ZS5zZXRFU3RydWN0dXJhbEZlYXR1cmUoZ2V0VGVzdE9iamVjdCgpLmVDbGFzcygpCisJCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0cy5GZWF0dXJlTW9kaWZpZXJUZXN0I2dldE51bWJlck9mTW9kaWZpY2F0aW9ucygpCisJICovCisJQE92ZXJyaWRlCisJaW50IGdldE51bWJlck9mTW9kaWZpY2F0aW9ucygpIHsKKwkJcmV0dXJuIEVYUEVDVEVEX1ZBTFVFUy5sZW5ndGg7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuRmVhdHVyZU1vZGlmaWVyVGVzdCNnZXRUZXN0QXR0cmlidXRlRVR5cGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3NpZmllciBnZXRUZXN0QXR0cmlidXRlRVR5cGUoKSB7CisJCXJldHVybiBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVJbnQoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0cy5GZWF0dXJlTW9kaWZpZXJUZXN0I3ZhbGlkYXRlRmVhdHVyZVZhbHVlKGludCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUZlYXR1cmVWYWx1ZShpbnQgaSkgeworCQlhc3NlcnRUcnVlKGkgPj0gMCk7CisJCWFzc2VydFRydWUoaSA8IEVYUEVDVEVEX1ZBTFVFUy5sZW5ndGgpOworCQlmaW5hbCBJbnRlZ2VyU2VxdWVuY2VNb2RpZmllciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlJbnRlZ2VyIGN1cnJlbnRWYWx1ZSA9IChJbnRlZ2VyKSBnZXRUZXN0T2JqZWN0KCkuZUdldCgKKwkJCQlmaXh0dXJlLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpKTsKKwkJcmV0dXJuIGN1cnJlbnRWYWx1ZS5pbnRWYWx1ZSgpID09IEVYUEVDVEVEX1ZBTFVFU1tpXTsKKwl9IC8vIHZhbGlkYXRlRmVhdHVyZVZhbHVlCisJCit9IC8vSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9Mb25nTW9kaWZpZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9Mb25nTW9kaWZpZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3YjJhYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL0xvbmdNb2RpZmllclRlc3QuamF2YQpAQCAtMCwwICsxLDk4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ01vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllckZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TG9uZyBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIExvbmdNb2RpZmllclRlc3QgZXh0ZW5kcyBTaW5nbGVWYWx1ZU1vZGlmaWVyVGVzdCB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKExvbmdNb2RpZmllclRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgTG9uZyBNb2RpZmllciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTG9uZ01vZGlmaWVyVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIExvbmcgTW9kaWZpZXIgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBMb25nTW9kaWZpZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChMb25nTW9kaWZpZXIpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShNb2RpZmllckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxvbmdNb2RpZmllcigpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlpbnQgZ2V0TnVtYmVyT2ZNb2RpZmljYXRpb25zKCkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiAwOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3NpZmllciBnZXRUZXN0QXR0cmlidXRlRVR5cGUoKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVGZWF0dXJlVmFsdWUoaW50IGkpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gZmFsc2U7CisJfQorCit9IC8vTG9uZ01vZGlmaWVyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvTG9uZ05PUE1vZGlmaWVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvTG9uZ05PUE1vZGlmaWVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNjI4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9Mb25nTk9QTW9kaWZpZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMDQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ05PUE1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllckZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TG9uZyBOT1AgTW9kaWZpZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIExvbmdOT1BNb2RpZmllclRlc3QgZXh0ZW5kcyBOT1BNb2RpZmllclRlc3QgeworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihMb25nTk9QTW9kaWZpZXJUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IExvbmcgTk9QIE1vZGlmaWVyIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMb25nTk9QTW9kaWZpZXJUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTG9uZyBOT1AgTW9kaWZpZXIgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBMb25nTk9QTW9kaWZpZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChMb25nTk9QTW9kaWZpZXIpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiBhIHtAbGluayBMb25nTk9QTW9kaWZpZXJ9IHJlYWR5IGZvciB0ZXN0aW5nLgorCSAqLworCXB1YmxpYyBMb25nTk9QTW9kaWZpZXIgY3JlYXRlRml4dHVyZSgpIHsKKwkJZmluYWwgTG9uZ05PUE1vZGlmaWVyIHJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMb25nTk9QTW9kaWZpZXIoKTsKKwkJRU9iamVjdCB0ZXN0T2JqZWN0ID0gZ2V0VGVzdE9iamVjdCgpOworCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IHRlc3RPYmplY3QuZUNsYXNzKCkKKwkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJCXJldFZhbHVlLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlRml4dHVyZQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzLkZlYXR1cmVNb2RpZmllclRlc3QjZ2V0VGVzdEF0dHJpYnV0ZUVUeXBlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzaWZpZXIgZ2V0VGVzdEF0dHJpYnV0ZUVUeXBlKCkgeworCQlyZXR1cm4gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTG9uZygpOworCX0KK30gLy9Mb25nTk9QTW9kaWZpZXJUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9Mb25nUmFuZ2VNb2RpZmllclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL0xvbmdSYW5nZU1vZGlmaWVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMDEwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9Mb25nUmFuZ2VNb2RpZmllclRlc3QuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlclJhbmdlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkxvbmdSYW5nZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllckZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Mb25nIFJhbmdlIE1vZGlmaWVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBMb25nUmFuZ2VNb2RpZmllclRlc3QgZXh0ZW5kcyBSYW5nZU1vZGlmaWVyVGVzdCB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTFJNX1NUQVJUX1ZBTFVFID0gMjBMOworCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBMUk1fRU5EX1ZBTFVFID0gMjJMOworCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBMUk1fSU5DUkVNRU5UX1ZBTFVFID0gMUw7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVYUEVDVEVEX1ZBTFVFU1tdID0gbmV3IGxvbmdbXSB7IExSTV9TVEFSVF9WQUxVRSwKKwkJCUxSTV9TVEFSVF9WQUxVRSArIExSTV9JTkNSRU1FTlRfVkFMVUUsIExSTV9FTkRfVkFMVUUgfTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKExvbmdSYW5nZU1vZGlmaWVyVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBMb25nIFJhbmdlIE1vZGlmaWVyIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTG9uZ1JhbmdlTW9kaWZpZXJUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTG9uZyBSYW5nZSBNb2RpZmllciB0ZXN0IGNhc2UuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBMb25nUmFuZ2VNb2RpZmllciBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKExvbmdSYW5nZU1vZGlmaWVyKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIGEge0BsaW5rIEludGVnZXJSYW5nZU1vZGlmaWVyfSByZWFkeSBmb3IgdGVzdGluZy4KKwkgKi8KKwlwdWJsaWMgTG9uZ1JhbmdlTW9kaWZpZXIgY3JlYXRlRml4dHVyZSgpIHsKKwkJZmluYWwgTG9uZ1JhbmdlTW9kaWZpZXIgcmV0VmFsdWUgPSBNb2RpZmllckZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZUxvbmdSYW5nZU1vZGlmaWVyKCk7CisJCXJldFZhbHVlLnNldFN0YXJ0VmFsdWUoTFJNX1NUQVJUX1ZBTFVFKTsKKwkJcmV0VmFsdWUuc2V0RW5kVmFsdWUoTFJNX0VORF9WQUxVRSk7CisJCXJldFZhbHVlLnNldEluY3JlbWVudChMUk1fSU5DUkVNRU5UX1ZBTFVFKTsKKwkJcmV0VmFsdWUuc2V0RVN0cnVjdHVyYWxGZWF0dXJlKGdldFRlc3RPYmplY3QoKS5lQ2xhc3MoKQorCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuRmVhdHVyZU1vZGlmaWVyVGVzdCNnZXRUZXN0QXR0cmlidXRlRVR5cGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3NpZmllciBnZXRUZXN0QXR0cmlidXRlRVR5cGUoKSB7CisJCXJldHVybiBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVMb25nKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuRmVhdHVyZU1vZGlmaWVyVGVzdCNnZXROdW1iZXJPZk1vZGlmaWNhdGlvbnMoKQorCSAqLworCUBPdmVycmlkZQorCWludCBnZXROdW1iZXJPZk1vZGlmaWNhdGlvbnMoKSB7CisJCXJldHVybiBFWFBFQ1RFRF9WQUxVRVMubGVuZ3RoOworCX0gLy8gZ2V0TnVtYmVyT2ZNb2RpZmljYXRpb25zCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0cy5GZWF0dXJlTW9kaWZpZXJUZXN0I3ZhbGlkYXRlRmVhdHVyZVZhbHVlKGludCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUZlYXR1cmVWYWx1ZShpbnQgaSkgeworCQlhc3NlcnRUcnVlKGkgPj0gMCk7CisJCWFzc2VydFRydWUoaSA8IEVYUEVDVEVEX1ZBTFVFUy5sZW5ndGgpOworCQlmaW5hbCBMb25nUmFuZ2VNb2RpZmllciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlMb25nIGN1cnJlbnRWYWx1ZSA9IChMb25nKSBnZXRUZXN0T2JqZWN0KCkuZUdldCgKKwkJCQlmaXh0dXJlLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpKTsKKworCQlyZXR1cm4gY3VycmVudFZhbHVlLmxvbmdWYWx1ZSgpID09IEVYUEVDVEVEX1ZBTFVFU1tpXTsKKwl9IC8vIHZhbGlkYXRlRmVhdHVyZVZhbHVlCisKK30gLy8gTG9uZ1JhbmdlTW9kaWZpZXJUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9Mb25nU2VxdWVuY2VNb2RpZmllclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL0xvbmdTZXF1ZW5jZU1vZGlmaWVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MjNjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9Mb25nU2VxdWVuY2VNb2RpZmllclRlc3QuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ1NlcXVlbmNlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2VxdWVuY2VNb2RpZmllcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Mb25nIFNlcXVlbmNlIE1vZGlmaWVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBMb25nU2VxdWVuY2VNb2RpZmllclRlc3QgZXh0ZW5kcyBTZXF1ZW5jZU1vZGlmaWVyVGVzdCB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBFWFBFQ1RFRF9WQUxVRVNbXSA9IG5ldyBsb25nW10geworCQlMb25nUmFuZ2VNb2RpZmllclRlc3QuTFJNX1NUQVJUX1ZBTFVFLAorCQlMb25nUmFuZ2VNb2RpZmllclRlc3QuTFJNX0VORF9WQUxVRSB9OworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihMb25nU2VxdWVuY2VNb2RpZmllclRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgTG9uZyBTZXF1ZW5jZSBNb2RpZmllciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTG9uZ1NlcXVlbmNlTW9kaWZpZXJUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTG9uZyBTZXF1ZW5jZSBNb2RpZmllciB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIExvbmdTZXF1ZW5jZU1vZGlmaWVyIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoTG9uZ1NlcXVlbmNlTW9kaWZpZXIpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuU2VxdWVuY2VNb2RpZmllclRlc3QjY3JlYXRlRml4dHVyZSgpCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCisJQE92ZXJyaWRlCisJcHVibGljIFNlcXVlbmNlTW9kaWZpZXIgY3JlYXRlRml4dHVyZSgpIHsKKwkJZmluYWwgTG9uZ1NlcXVlbmNlTW9kaWZpZXIgcmV0VmFsdWUgPSBNb2RpZmllckZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZUxvbmdTZXF1ZW5jZU1vZGlmaWVyKCk7CisJCWZvciAobG9uZyB2YWx1ZSA6IEVYUEVDVEVEX1ZBTFVFUykgeworCQkJIHJldFZhbHVlLmdldFNlcXVlbmNlKCkuYWRkKHZhbHVlKTsKKwkJfSAvLyBmb3IgZWFjaCBkb3VibGUKKworCQlyZXRWYWx1ZS5zZXRFU3RydWN0dXJhbEZlYXR1cmUoZ2V0VGVzdE9iamVjdCgpLmVDbGFzcygpCisJCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0cy5GZWF0dXJlTW9kaWZpZXJUZXN0I2dldE51bWJlck9mTW9kaWZpY2F0aW9ucygpCisJICovCisJQE92ZXJyaWRlCisJaW50IGdldE51bWJlck9mTW9kaWZpY2F0aW9ucygpIHsKKwkJcmV0dXJuIEVYUEVDVEVEX1ZBTFVFUy5sZW5ndGg7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuRmVhdHVyZU1vZGlmaWVyVGVzdCNnZXRUZXN0QXR0cmlidXRlRVR5cGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3NpZmllciBnZXRUZXN0QXR0cmlidXRlRVR5cGUoKSB7CisJCXJldHVybiBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVMb25nKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuRmVhdHVyZU1vZGlmaWVyVGVzdCN2YWxpZGF0ZUZlYXR1cmVWYWx1ZShpbnQpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVGZWF0dXJlVmFsdWUoaW50IGkpIHsKKwkJYXNzZXJ0VHJ1ZShpID49IDApOworCQlhc3NlcnRUcnVlKGkgPCBFWFBFQ1RFRF9WQUxVRVMubGVuZ3RoKTsKKwkJZmluYWwgTG9uZ1NlcXVlbmNlTW9kaWZpZXIgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJTG9uZyBjdXJyZW50VmFsdWUgPSAoTG9uZykgZ2V0VGVzdE9iamVjdCgpLmVHZXQoCisJCQkJZml4dHVyZS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKSk7CisJCXJldHVybiBjdXJyZW50VmFsdWUubG9uZ1ZhbHVlKCkgPT0gRVhQRUNURURfVkFMVUVTW2ldOworCX0gLy8gdmFsaWRhdGVGZWF0dXJlVmFsdWUKKwkKKworfSAvL0xvbmdTZXF1ZW5jZU1vZGlmaWVyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvTW9kaWZpYWJsZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL01vZGlmaWFibGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzNThhMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL01vZGlmaWFibGVUZXN0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1vZGlmaWFibGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2RpZmlhYmxlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIE1vZGlmaWFibGUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNb2RpZmlhYmxlIGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBNb2RpZmlhYmxlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNb2RpZmlhYmxlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIE1vZGlmaWFibGUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoTW9kaWZpYWJsZSBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBNb2RpZmlhYmxlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTW9kaWZpYWJsZSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKK30gLy9Nb2RpZmlhYmxlVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvTW9kaWZpZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9Nb2RpZmllclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjcwYmE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvTW9kaWZpZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzMzYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwudGVzdHMuRGVjb3JhdG9yVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24udGVzdHMuSWRlbnRpZmlhYmxlVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC50ZXN0cy5FeHBlcmltZW50VGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVSYW5nZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJSYW5nZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TW9kaWZpZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHRlc3RlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXIjaXNDb21wbGV0ZSgpIDxlbT5Db21wbGV0ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgYXJlIHRlc3RlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXIjdXBkYXRlU2NlbmFyaW8ob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvKSA8ZW0+VXBkYXRlIFNjZW5hcmlvPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXIjcmVzZXQoKSA8ZW0+UmVzZXQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgTW9kaWZpZXJUZXN0IGV4dGVuZHMgRGVjb3JhdG9yVGVzdCB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BBQ0tBR0VfTkFNRSA9ICJ0ZXN0cGFja2FnZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QQUNLQUdFX05TUFJFRklYID0gInRlc3QiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUEFDS0FHRV9OU1VSSSA9ICJodHRwOi8vL2NvbS5leGFtcGxlLnRlc3QiOworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRU9CSkVDVF9DTEFTU05BTUUxID0gInRlc3RvYmplY3QxIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8RUNsYXNzaWZpZXI+IFRFU1RfT0JKRUNUX0ZFQVRVUkVTMSA9IEFycmF5cworCQkJLmFzTGlzdChuZXcgRUNsYXNzaWZpZXJbXSB7IEVjb3JlUGFja2FnZS5MaXRlcmFscy5FSU5ULAorCQkJCQlFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRURPVUJMRSwKKwkJCQkJTW9kZWxQYWNrYWdlLkxpdGVyYWxzLlNURU1fVElNRSB9KTsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0VPQkpFQ1RfQ0xBU1NOQU1FMiA9ICJ0ZXN0b2JqZWN0MiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PEVDbGFzc2lmaWVyPiBURVNUX09CSkVDVF9GRUFUVVJFUzIgPSBBcnJheXMKKwkJCS5hc0xpc3QobmV3IEVDbGFzc2lmaWVyW10geyBFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRUlOVCwKKwkJCQkJRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVET1VCTEUsCisJCQkJCU1vZGVsUGFja2FnZS5MaXRlcmFscy5TVEVNX1RJTUUsCisJCQkJCUVjb3JlUGFja2FnZS5MaXRlcmFscy5FU1RSSU5HIH0pOworCQorCS8qKgorCSAqIFRoaXMgaXMgdGhlIEVQYWNrYWdlIGluc3RhbmNlIHRoYXQgZGVmaW5lcyB7QGxpbmsgRUNsYXNzfXMgdG8gYmUgdXNlZCB0bworCSAqIGNyZWF0ZSB0ZXN0IG9iamVjdCBpbnN0YW5jZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBFUGFja2FnZSBURVNUX1BBQ0tBR0U7CisJCisJc3RhdGljIHsKKwkJZmluYWwgTWFwPFN0cmluZyxMaXN0PEVDbGFzc2lmaWVyPj4gZUNsYXNzTmFtZVRvZmVhdHVyZVR5cGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8RUNsYXNzaWZpZXI+PigpOworCQllQ2xhc3NOYW1lVG9mZWF0dXJlVHlwZU1hcC5wdXQoVEVTVF9FT0JKRUNUX0NMQVNTTkFNRTEsIFRFU1RfT0JKRUNUX0ZFQVRVUkVTMSk7CisJCWVDbGFzc05hbWVUb2ZlYXR1cmVUeXBlTWFwLnB1dChURVNUX0VPQkpFQ1RfQ0xBU1NOQU1FMiwgVEVTVF9PQkpFQ1RfRkVBVFVSRVMyKTsKKwkJVEVTVF9QQUNLQUdFID0gY3JlYXRlVGVzdFBhY2thZ2UoVEVTVF9QQUNLQUdFX05BTUUsIFRFU1RfUEFDS0FHRV9OU1BSRUZJWCwgVEVTVF9QQUNLQUdFX05TVVJJLAorCQkJCWVDbGFzc05hbWVUb2ZlYXR1cmVUeXBlTWFwKTsKKwl9IC8vIHN0YXRpYworCQorCS8qKgorCSAqIFRlc3Qgb2JqZWN0IGZvciBtb2RpZmljYXRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgRU9iamVjdCB0ZXN0T2JqZWN0MSA9IG51bGw7CisJLyoqCisJICogVGVzdCBvYmplY3QgZm9yIG1vZGlmaWNhdGlvbgorCSAqLworLy8JcHJvdGVjdGVkIEVPYmplY3QgdGVzdE9iamVjdDIgPSBudWxsOworCQorCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oTW9kaWZpZXJUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IE1vZGlmaWVyIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTW9kaWZpZXJUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTW9kaWZpZXIgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBNb2RpZmllciBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKE1vZGlmaWVyKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGVzdE9iamVjdDEgPSBURVNUX1BBQ0tBR0UuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpLmNyZWF0ZSgKKwkJCQkoRUNsYXNzKSBURVNUX1BBQ0tBR0UuZ2V0RUNsYXNzaWZpZXIoVEVTVF9FT0JKRUNUX0NMQVNTTkFNRTEpKTsKKy8vCQl0ZXN0T2JqZWN0MiA9IFRFU1RfUEFDS0FHRS5nZXRFRmFjdG9yeUluc3RhbmNlKCkuY3JlYXRlKAorLy8JCQkJKEVDbGFzcykgVEVTVF9QQUNLQUdFLmdldEVDbGFzc2lmaWVyKFRFU1RfRU9CSkVDVF9DTEFTU05BTUUyKSk7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSh0ZXN0T2JqZWN0MSkpOworCX0gLy8gc2V0VXAKKworCS8qKgorCSAqIEByZXR1cm4gYSB7QGxpbmsgTW9kaWZpZXJ9IGZvciB0ZXN0aW5nCisJICovCisJc3RhdGljIHB1YmxpYyAgTW9kaWZpZXIgY3JlYXRlRml4dHVyZShmaW5hbCBFT2JqZWN0IHRlc3RPYmplY3QpIHsKKwkJZmluYWwgTW9kaWZpZXIgcmV0VmFsdWUgPSBNb2RpZmllckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1vZGlmaWVyKCk7CisJCXJldFZhbHVlLmdldEZlYXR1cmVNb2RpZmllcnMoKS5hZGRBbGwoY3JlYXRlRmVhdHVyZU1vZGlmaWVycyh0ZXN0T2JqZWN0KSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUZpeHR1cmUKKworCS8qKgorCSAqIEBwYXJhbSB0ZXN0T2JqZWN0CisJICogICAgICAgICAgICB0aGUge0BsaW5rIEVPYmplY3R9IHRvIGNyZWF0ZSB0aGUge0BsaW5rIEZlYXR1cmVNb2RpZmllcn1zCisJICogICAgICAgICAgICBmb3IKKwkgKiBAcmV0dXJuIGEge0BsaW5rIExpc3R9IG9mIHtAbGluayBGZWF0dXJlTW9kaWZpZXJ9cyBmb3IgYSBzcGVjaWZpYworCSAqICAgICAgICAge0BsaW5rIEVPYmplY3R9CisJICovCisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxGZWF0dXJlTW9kaWZpZXI+IGNyZWF0ZUZlYXR1cmVNb2RpZmllcnMoCisJCQlmaW5hbCBFT2JqZWN0IHRlc3RPYmplY3QpIHsKKwkJZmluYWwgTGlzdDxGZWF0dXJlTW9kaWZpZXI+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxGZWF0dXJlTW9kaWZpZXI+KCk7CisJCWZvciAoRVN0cnVjdHVyYWxGZWF0dXJlIGVTdHJ1dHVyYWxGZWF0dXJlIDogdGVzdE9iamVjdC5lQ2xhc3MoKQorCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkpIHsKKwkJCS8vIEVJbnQ/CisJCQlpZiAoZVN0cnV0dXJhbEZlYXR1cmUuZ2V0RVR5cGUoKSA9PSBFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRUlOVCkgeworCQkJCS8vIFllcworCQkJCWZpbmFsIEludGVnZXJSYW5nZU1vZGlmaWVyIGlybSA9IE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCS5jcmVhdGVJbnRlZ2VyUmFuZ2VNb2RpZmllcigpOworCQkJCWlybS5zZXRFU3RydWN0dXJhbEZlYXR1cmUoZVN0cnV0dXJhbEZlYXR1cmUpOworCQkJCWlybS5zZXRTdGFydFZhbHVlKEludGVnZXJSYW5nZU1vZGlmaWVyVGVzdC5JUk1fU1RBUlRfVkFMVUUpOworCQkJCWlybS5zZXRFbmRWYWx1ZShJbnRlZ2VyUmFuZ2VNb2RpZmllclRlc3QuSVJNX0VORF9WQUxVRSk7CisJCQkJaXJtLnNldEluY3JlbWVudChJbnRlZ2VyUmFuZ2VNb2RpZmllclRlc3QuSVJNX0lOQ1JFTUVOVF9WQUxVRSk7CisJCQkJcmV0VmFsdWUuYWRkKGlybSk7CisJCQl9IC8vIGlmIEVJbnQKKwkJCS8vIEVEb3VibGUKKwkJCWVsc2UgaWYgKGVTdHJ1dHVyYWxGZWF0dXJlLmdldEVUeXBlKCkgPT0gRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVET1VCTEUpIHsKKwkJCQkvLyBZZXMKKwkJCQlmaW5hbCBEb3VibGVSYW5nZU1vZGlmaWVyIGRybSA9IE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCS5jcmVhdGVEb3VibGVSYW5nZU1vZGlmaWVyKCk7CisJCQkJZHJtLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShlU3RydXR1cmFsRmVhdHVyZSk7CisJCQkJZHJtLnNldFN0YXJ0VmFsdWUoRG91YmxlUmFuZ2VNb2RpZmllclRlc3QuRFJNX1NUQVJUX1ZBTFVFKTsKKwkJCQlkcm0uc2V0RW5kVmFsdWUoRG91YmxlUmFuZ2VNb2RpZmllclRlc3QuRFJNX0VORF9WQUxVRSk7CisJCQkJZHJtLnNldEluY3JlbWVudChEb3VibGVSYW5nZU1vZGlmaWVyVGVzdC5EUk1fSU5DUkVNRU5UX1ZBTFVFKTsKKwkJCQlyZXRWYWx1ZS5hZGQoZHJtKTsKKwkJCX0gLy8gaWYKKwkJfSAvLyBmb3IgZWFjaCBlU3RydWN0dXJhbEZlYXR1cmUKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVGZWF0dXJlTW9kaWZpZXJzCisKKwkvKioKKwkgKiBDcmVhdGUgYSBzaW5nbGUgRU1GIHtAbGluayBFT2JqZWN0fSBpbnN0YW5jZSBmb3IgdGVzdGluZy4KKwkgKiBAcGFyYW0gZUNsYXNzTmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHtAbGluayBFQ2xhc3N9IGZvciB0aGUge0BsaW5rIEVPYmplY3R9CisJICogQHBhcmFtIGZlYXR1cmVUeXBlcworCSAqICAgICAgICAgICAgYSBsaXN0IG9mIHtAbGluayBFQ2xhc3NpZmllcn0gaW5zdGFuY2VzIG9mIHRoZSB0eXBlcyBvZiB0aGUKKwkgKiAgICAgICAgICAgIGF0dHJpYnV0ZXMgaW4gdGhlIHtAbGluayBFQ2xhc3N9CisJICogQHJldHVybiBhbiB7QGxpbmsgRU9iamVjdH0gdG8gYmUgbW9kaWZpZWQKKwkgKi8KKwlzdGF0aWMgcHVibGljIEVPYmplY3QgY3JlYXRlVGVzdE9iamVjdChmaW5hbCBTdHJpbmcgZUNsYXNzTmFtZSwKKwkJCUxpc3Q8RUNsYXNzaWZpZXI+IGZlYXR1cmVUeXBlcykgeworCQlmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PEVDbGFzc2lmaWVyPj4gZUNsYXNzTmFtZVRvZmVhdHVyZVR5cGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8RUNsYXNzaWZpZXI+PigpOworCQllQ2xhc3NOYW1lVG9mZWF0dXJlVHlwZU1hcC5wdXQoZUNsYXNzTmFtZSwgZmVhdHVyZVR5cGVzKTsKKwkJZmluYWwgRVBhY2thZ2UgZVBhY2thZ2UgPSBjcmVhdGVUZXN0UGFja2FnZShURVNUX1BBQ0tBR0VfTkFNRSwKKwkJCQlURVNUX1BBQ0tBR0VfTlNQUkVGSVgsIFRFU1RfUEFDS0FHRV9OU1VSSSwKKwkJCQllQ2xhc3NOYW1lVG9mZWF0dXJlVHlwZU1hcCk7CisJCXJldHVybiBlUGFja2FnZS5nZXRFRmFjdG9yeUluc3RhbmNlKCkuY3JlYXRlKAorCQkJCShFQ2xhc3MpIGVQYWNrYWdlLmdldEVDbGFzc2lmaWVyKGVDbGFzc05hbWUpKTsKKwl9IC8vIGNyZWF0ZVRlc3RPYmplY3QKKworCS8qKgorCSAqIEBwYXJhbSBwYWNrYWdlTmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UKKwkgKiBAcGFyYW0gbnNQcmVmaXgKKwkgKiAgICAgICAgICAgIHRoZSBwcmVmaXggdG8gdXNlIGZvciB0aGUgcGFja2FnZSdzIG5hbWUgc3BhY2UKKwkgKiBAcGFyYW0gbnNVUkkKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgVVJJfSB0byB1c2UgZm9yIHRoZSBwYWNrYWdlJ3MgbmFtZSBzcGFjZQorCSAqIEBwYXJhbSBlQ2xhc3NOYW1lVG9mZWF0dXJlVHlwZU1hcAorCSAqICAgICAgICAgICAgYSB7QGxpbmsgTWFwfSBiZXR3ZWVuIHRoZSBuYW1lIG9mIGEge0BsaW5rIEVDbGFzc30gdGhhdAorCSAqICAgICAgICAgICAgZGVmaW5lcyBhbiB7QGxpbmsgRU9iamVjdH0gdG8gY3JlYXRlIGFuZCBhIGxpc3Qgb2YKKwkgKiAgICAgICAgICAgIHtAbGluayBFQ2xhc3NpZmllcn1zIHRoYXQgZGVmaW5lIHRoZSB0eXBlIHRoZSB7QGxpbmsgRU9iamVjdH0ncworCSAqICAgICAgICAgICAge0BsaW5rIEVTdHJ1Y3R1cmFsRmVhdHVyZX1zLiBUaGUgbmFtZXMgb2YgdGhlCisJICogICAgICAgICAgICB7QGxpbmsgRVN0cnVjdHVyYWxGZWF0dXJlfXMgd2lsbCBiZSBjcmVhdGVkIGZyb20gdGhlIHR5cGVzIG9mCisJICogICAgICAgICAgICB0aGUge0BsaW5rIEVDbGFzc2lmaWVyfXMuCisJICogQHJldHVybiBhbiB7QGxpbmsgRVBhY2thZ2V9CisJICovCisJcHVibGljIHN0YXRpYyBFUGFja2FnZSBjcmVhdGVUZXN0UGFja2FnZShmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUsCisJCQlmaW5hbCBTdHJpbmcgbnNQcmVmaXgsIGZpbmFsIFN0cmluZyBuc1VSSSwKKwkJCWZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8RUNsYXNzaWZpZXI+PiBlQ2xhc3NOYW1lVG9mZWF0dXJlVHlwZU1hcCkgeworCQkvLyBBIGxpdHRsZSBiaXQgb2YgZHluYW1pYyBFTUYgaGVyZS4uLgorCQlmaW5hbCBFUGFja2FnZSBlUGFja2FnZSA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRVBhY2thZ2UoKTsKKwkJZVBhY2thZ2Uuc2V0TmFtZShwYWNrYWdlTmFtZSk7CisJCWVQYWNrYWdlLnNldE5zUHJlZml4KG5zUHJlZml4KTsKKwkJZVBhY2thZ2Uuc2V0TnNVUkkobnNVUkkpOworCisJCWZvciAoU3RyaW5nIGVDbGFzc05hbWUgOiBlQ2xhc3NOYW1lVG9mZWF0dXJlVHlwZU1hcC5rZXlTZXQoKSkgeworCisJCQlmaW5hbCBFQ2xhc3MgdGVzdENsYXNzID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFQ2xhc3MoKTsKKwkJCXRlc3RDbGFzcy5zZXROYW1lKGVDbGFzc05hbWUpOworCQkJCisJCQlpbnQgYXR0cmlidXRlQ291bnQgPSAwOworCQkJLy8gTm93IGNyZWF0ZSB0aGUgc3RydWN0dXJhbCBmZWF0dXJlcworCQkJZm9yIChFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA6IGVDbGFzc05hbWVUb2ZlYXR1cmVUeXBlTWFwCisJCQkJCS5nZXQoZUNsYXNzTmFtZSkpIHsKKwkJCQlmaW5hbCBFQXR0cmlidXRlIGF0dHJpYnV0ZSA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCS5jcmVhdGVFQXR0cmlidXRlKCk7CisJCQkJYXR0cmlidXRlLnNldE5hbWUoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpICsgYXR0cmlidXRlQ291bnQrKyk7CisJCQkJYXR0cmlidXRlLnNldEVUeXBlKGVDbGFzc2lmaWVyKTsKKwkJCQlhdHRyaWJ1dGUuc2V0VW5zZXR0YWJsZShmYWxzZSk7CisJCQkJdGVzdENsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5hZGQoYXR0cmlidXRlKTsKKwkJCX0gLy8gZm9yIGVhY2ggRUNsYXNzaWZpZXIKKwkJCS8vIEFkZCB0aGUgY2xhc3MgdG8gdGhlIHBhY2thZ2UKKwkJCWVQYWNrYWdlLmdldEVDbGFzc2lmaWVycygpLmFkZCh0ZXN0Q2xhc3MpOworCQl9IC8vIGZvciBlYWNoIEVDbGFzcyBuYW1lCisJCXJldHVybiBlUGFja2FnZTsKKwl9IC8vIGNyZWF0ZVRlc3RQYWNrYWdlCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGVzdE9iamVjdDEgPSBudWxsOworLy8JCXRlc3RPYmplY3QyID0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXIjZ2V0TW9kaWZpY2F0aW9uU3VtbWFyeSgpIDxlbT5Nb2RpZmljYXRpb24gU3VtbWFyeTwvZW0+fScKKwkgKiBmZWF0dXJlIGdldHRlci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXIjZ2V0TW9kaWZpY2F0aW9uU3VtbWFyeSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TW9kaWZpY2F0aW9uU3VtbWFyeSgpIHsKKwkJZmluYWwgTW9kaWZpZXIgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShmaXh0dXJlLmdldEZlYXR1cmVNb2RpZmllcnMoKS5zaXplKCkgPiAwKTsKKwkJZmluYWwgTGlzdDxTdHJpbmc+IHN1bW1hcnkgPSBmaXh0dXJlLmdldE1vZGlmaWNhdGlvblN1bW1hcnkoKTsKKwkJYXNzZXJ0Tm90TnVsbChzdW1tYXJ5KTsKKwkJYXNzZXJ0VHJ1ZShzdW1tYXJ5LnNpemUoKSA+IDApOworCX0gLy8gdGVzdEdldE1vZGlmaWNhdGlvblN1bW1hcnkKKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllciNpc0NvbXBsZXRlKCkgPGVtPkNvbXBsZXRlPC9lbT59JworCSAqIGZlYXR1cmUgZ2V0dGVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllciNpc0NvbXBsZXRlKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RJc0NvbXBsZXRlKCkgeworCQlmaW5hbCBNb2RpZmllciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGZpeHR1cmUuZ2V0RmVhdHVyZU1vZGlmaWVycygpLnNpemUoKSA+IDApOworCQlhc3NlcnRGYWxzZShmaXh0dXJlLmlzQ29tcGxldGUoKSk7CisJfSAvLyB0ZXN0SXNDb21wbGV0ZQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyI3VwZGF0ZVNjZW5hcmlvKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbykgPGVtPlVwZGF0ZSBTY2VuYXJpbzwvZW0+fScKKwkgKiBvcGVyYXRpb24uIAorCSAqIAorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAorCSAqIAorCSAqIFRoaXMgaXMgYmVpbmcgdGVzdGVkIGJ5IHtAbGluayBFeHBlcmltZW50VGVzdCN0ZXN0TW9kaWZ5U2NlbmFyaW9fX1NjZW5hcmlvKCl9CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXIjdXBkYXRlU2NlbmFyaW8ob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICogCisJICovCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNjZW5hcmlvX19TY2VuYXJpbygpIHsKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwkJLy8gZmFpbCgpOworCQkvLyBmaW5hbCBNb2RpZmllciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQkvLyBmaW5hbCBTY2VuYXJpbyBiYXNlU2NlbmFyaW8gPSBFeHBlcmltZW50VGVzdC5nZXRCYXNlU2NlbmFyaW8oKTsKKwkJLy8gZml4dHVyZS51cGRhdGVTY2VuYXJpbyhiYXNlU2NlbmFyaW8pOworCQkvLyBhc3NlcnRUcnVlKGJhc2VTY2VuYXJpby5zYW5lKCkpOworCX0gLy8gdGVzdFVwZGF0ZVNjZW5hcmlvX19TY2VuYXJpbworCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyI3Jlc2V0KCkgPGVtPlJlc2V0PC9lbT59JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllciNyZXNldCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0UmVzZXQoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCBNb2RpZmllclRlc3QudGVzdFJlc2V0KCkKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwl9CisKK30gLy8gTW9kaWZpZXJUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9Nb2RpZmllclRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9Nb2RpZmllclRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxYmMwNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL01vZGlmaWVyVGVzdHMuamF2YQpAQCAtMCwwICsxLDc1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+bW9kaWZpZXI8L2I+PC9lbT4nIHBhY2thZ2UuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE1vZGlmaWVyVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgeworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBNb2RpZmllclRlc3RzKCJtb2RpZmllciBUZXN0cyIpOyAvLyROT04tTkxTLTEkCisJCXN1aXRlLmFkZFRlc3RTdWl0ZShEb3VibGVOT1BNb2RpZmllclRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRG91YmxlUmFuZ2VNb2RpZmllclRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRG91YmxlU2VxdWVuY2VNb2RpZmllclRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSW50ZWdlck5PUE1vZGlmaWVyVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShJbnRlZ2VyUmFuZ2VNb2RpZmllclRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKExvbmdOT1BNb2RpZmllclRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTG9uZ1JhbmdlTW9kaWZpZXJUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKExvbmdTZXF1ZW5jZU1vZGlmaWVyVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShNb2RpZmllclRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTk9QTW9kaWZpZXJUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFNURU1UaW1lTk9QTW9kaWZpZXJUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFNURU1UaW1lUmFuZ2VNb2RpZmllclRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShTdHJpbmdOT1BNb2RpZmllclRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RyaW5nU2VxdWVuY2VNb2RpZmllclRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRG91YmxlTW9kaWZpZXJUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEludGVnZXJNb2RpZmllclRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTG9uZ01vZGlmaWVyVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShTVEVNVGltZU1vZGlmaWVyVGVzdC5jbGFzcyk7CisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTW9kaWZpZXJUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKK30gLy9Nb2RpZmllclRlc3RzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9OT1BNb2RpZmllclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL05PUE1vZGlmaWVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZmEzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9OT1BNb2RpZmllclRlc3QuamF2YQpAQCAtMCwwICsxLDExMSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5OT1BNb2RpZmllcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5PUCBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgTk9QTW9kaWZpZXJUZXN0IGV4dGVuZHMgRmVhdHVyZU1vZGlmaWVyVGVzdCB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihOT1BNb2RpZmllclRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgTk9QIE1vZGlmaWVyIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTk9QTW9kaWZpZXJUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTk9QIE1vZGlmaWVyIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTk9QTW9kaWZpZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChOT1BNb2RpZmllcilmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXNldEZpeHR1cmUoTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVOT1BNb2RpZmllcigpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuRmVhdHVyZU1vZGlmaWVyVGVzdCNnZXRUZXN0QXR0cmlidXRlRVR5cGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3NpZmllciBnZXRUZXN0QXR0cmlidXRlRVR5cGUoKSB7CisJCXJldHVybiBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVJbnQoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0cy5GZWF0dXJlTW9kaWZpZXJUZXN0I3Rlc3RHZXRNb2RpZmljYXRpb25TdW1tYXJ5KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TW9kaWZpY2F0aW9uU3VtbWFyeSgpIHsKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0cy5GZWF0dXJlTW9kaWZpZXJUZXN0I2dldE51bWJlck9mTW9kaWZpY2F0aW9ucygpCisJICovCisJQE92ZXJyaWRlCisJaW50IGdldE51bWJlck9mTW9kaWZpY2F0aW9ucygpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuRmVhdHVyZU1vZGlmaWVyVGVzdCN2YWxpZGF0ZUZlYXR1cmVWYWx1ZShpbnQpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVGZWF0dXJlVmFsdWUoaW50IGkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30gLy8gTk9QTW9kaWZpZXJUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9SYW5nZU1vZGlmaWVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvUmFuZ2VNb2RpZmllclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTg2NDMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvUmFuZ2VNb2RpZmllclRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuUmFuZ2VNb2RpZmllcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SYW5nZSBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFJhbmdlTW9kaWZpZXJUZXN0IGV4dGVuZHMgRmVhdHVyZU1vZGlmaWVyVGVzdCB7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFJhbmdlIE1vZGlmaWVyIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSYW5nZU1vZGlmaWVyVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFJhbmdlIE1vZGlmaWVyIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUmFuZ2VNb2RpZmllciBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFJhbmdlTW9kaWZpZXIpZml4dHVyZTsKKwl9CisKK30gLy9SYW5nZU1vZGlmaWVyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvU1RFTVRpbWVNb2RpZmllclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL1NURU1UaW1lTW9kaWZpZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY2MTBkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL1NURU1UaW1lTW9kaWZpZXJUZXN0LmphdmEKQEAgLTAsMCArMSw5OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVNb2RpZmllcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TVEVNIFRpbWUgTW9kaWZpZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTVEVNVGltZU1vZGlmaWVyVGVzdCBleHRlbmRzIFNpbmdsZVZhbHVlTW9kaWZpZXJUZXN0IHsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oU1RFTVRpbWVNb2RpZmllclRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgU1RFTSBUaW1lIE1vZGlmaWVyIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTVEVNVGltZU1vZGlmaWVyVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNURU0gVGltZSBNb2RpZmllciB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFNURU1UaW1lTW9kaWZpZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChTVEVNVGltZU1vZGlmaWVyKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTVEVNVGltZU1vZGlmaWVyKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCUBPdmVycmlkZQorCWludCBnZXROdW1iZXJPZk1vZGlmaWNhdGlvbnMoKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIDA7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzc2lmaWVyIGdldFRlc3RBdHRyaWJ1dGVFVHlwZSgpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUZlYXR1cmVWYWx1ZShpbnQgaSkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBmYWxzZTsKKwl9CisKK30gLy9TVEVNVGltZU1vZGlmaWVyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvU1RFTVRpbWVOT1BNb2RpZmllclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL1NURU1UaW1lTk9QTW9kaWZpZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkYzkzMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL1NURU1UaW1lTk9QTW9kaWZpZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMDUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZU5PUE1vZGlmaWVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNURU0gVGltZSBOT1AgTW9kaWZpZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFNURU1UaW1lTk9QTW9kaWZpZXJUZXN0IGV4dGVuZHMgTk9QTW9kaWZpZXJUZXN0IHsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oU1RFTVRpbWVOT1BNb2RpZmllclRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgU1RFTSBUaW1lIE5PUCBNb2RpZmllciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU1RFTVRpbWVOT1BNb2RpZmllclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTVEVNIFRpbWUgTk9QIE1vZGlmaWVyIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU1RFTVRpbWVOT1BNb2RpZmllciBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFNURU1UaW1lTk9QTW9kaWZpZXIpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIGEge0BsaW5rIFNURU1UaW1lTk9QTW9kaWZpZXJ9IHJlYWR5IGZvciB0ZXN0aW5nLgorCSAqLworCXB1YmxpYyBTVEVNVGltZU5PUE1vZGlmaWVyIGNyZWF0ZUZpeHR1cmUoKSB7CisJCWZpbmFsIFNURU1UaW1lTk9QTW9kaWZpZXIgcmV0VmFsdWUgPSBNb2RpZmllckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNURU1UaW1lTk9QTW9kaWZpZXIoKTsKKwkJRU9iamVjdCB0ZXN0T2JqZWN0ID0gZ2V0VGVzdE9iamVjdCgpOworCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IHRlc3RPYmplY3QuZUNsYXNzKCkKKwkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJCXJldFZhbHVlLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlRml4dHVyZQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzLkZlYXR1cmVNb2RpZmllclRlc3QjZ2V0VGVzdEF0dHJpYnV0ZUVUeXBlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzaWZpZXIgZ2V0VGVzdEF0dHJpYnV0ZUVUeXBlKCkgeworCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTVEVNVGltZSgpOworCX0gLy8gZ2V0VGVzdEF0dHJpYnV0ZUVUeXBlCisKK30gLy9TVEVNVGltZU5PUE1vZGlmaWVyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvU1RFTVRpbWVSYW5nZU1vZGlmaWVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvU1RFTVRpbWVSYW5nZU1vZGlmaWVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZDVhNmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9TVEVNVGltZVJhbmdlTW9kaWZpZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMzkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZVJhbmdlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVSYW5nZU1vZGlmaWVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U1RFTSBUaW1lIFJhbmdlIE1vZGlmaWVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBTVEVNVGltZVJhbmdlTW9kaWZpZXJUZXN0IGV4dGVuZHMgUmFuZ2VNb2RpZmllclRlc3QgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTVEVNVGltZSBTVEVNX1RJTUVfU1RBUlRfVkFMVUUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCisJCQkuY3JlYXRlU1RFTVRpbWUoKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNURU1UaW1lIFNURU1fVElNRV9FTkRfVkFMVUUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCisJCQkuY3JlYXRlU1RFTVRpbWUoKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgU1RFTV9USU1FX0lOQ1JFTUVOVF9WQUxVRSA9IFNURU1UaW1lLlVuaXRzLkRBWQorCQkJLmdldE1pbGxpc2Vjb25kcygpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU1RFTVRpbWUgRVhQRUNURURfVkFMVUVTW10gPSBuZXcgU1RFTVRpbWVbXSB7CisJCQlTVEVNX1RJTUVfU1RBUlRfVkFMVUUsIFNURU1fVElNRV9FTkRfVkFMVUUgfTsKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihTVEVNVGltZVJhbmdlTW9kaWZpZXJUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFNURU0gVGltZSBSYW5nZSBNb2RpZmllciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNURU1UaW1lUmFuZ2VNb2RpZmllclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTVEVNIFRpbWUgUmFuZ2UgTW9kaWZpZXIgdGVzdCBjYXNlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU1RFTVRpbWVSYW5nZU1vZGlmaWVyIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoU1RFTVRpbWVSYW5nZU1vZGlmaWVyKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIGEge0BsaW5rIERvdWJsZVJhbmdlTW9kaWZpZXJ9IHJlYWR5IGZvciB0ZXN0aW5nLgorCSAqLworCXB1YmxpYyBTVEVNVGltZVJhbmdlTW9kaWZpZXIgY3JlYXRlRml4dHVyZSgpIHsKKwkJZmluYWwgU1RFTVRpbWVSYW5nZU1vZGlmaWVyIHJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVTVEVNVGltZVJhbmdlTW9kaWZpZXIoKTsKKwkJcmV0VmFsdWUuc2V0U3RhcnRWYWx1ZShTVEVNX1RJTUVfU1RBUlRfVkFMVUUpOworCQlyZXRWYWx1ZS5zZXRFbmRWYWx1ZShTVEVNX1RJTUVfRU5EX1ZBTFVFKTsKKwkJcmV0VmFsdWUuc2V0SW5jcmVtZW50KFNURU1fVElNRV9JTkNSRU1FTlRfVkFMVUUpOworCQlyZXRWYWx1ZS5zZXRFU3RydWN0dXJhbEZlYXR1cmUoZ2V0VGVzdE9iamVjdCgpLmVDbGFzcygpCisJCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0cy5GZWF0dXJlTW9kaWZpZXJUZXN0I2dldFRlc3RBdHRyaWJ1dGVFVHlwZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzc2lmaWVyIGdldFRlc3RBdHRyaWJ1dGVFVHlwZSgpIHsKKwkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U1RFTVRpbWUoKTsKKwl9IC8vIGdldFRlc3RBdHRyaWJ1dGVFVHlwZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuRmVhdHVyZU1vZGlmaWVyVGVzdCNnZXROdW1iZXJPZk1vZGlmaWNhdGlvbnMoKQorCSAqLworCUBPdmVycmlkZQorCWludCBnZXROdW1iZXJPZk1vZGlmaWNhdGlvbnMoKSB7CisJCVNURU1UaW1lUmFuZ2VNb2RpZmllciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQkvLyRBTkFMWVNJUy1JR05PUkUKKwkJZmluYWwgaW50IHJldFZhbHVlID0gKGludCkgKChmaXh0dXJlLmdldEVuZFZhbHVlKCkuZ2V0VGltZSgpLmdldFRpbWUoKSAtIGZpeHR1cmUKKwkJCQkJCS5nZXRTdGFydFZhbHVlKCkuZ2V0VGltZSgpLmdldFRpbWUoKSkgLyBmaXh0dXJlLmdldEluY3JlbWVudCgpKSArIDE7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldE51bWJlck9mTW9kaWZpY2F0aW9ucworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuRmVhdHVyZU1vZGlmaWVyVGVzdCN2YWxpZGF0ZUZlYXR1cmVWYWx1ZShpbnQpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVGZWF0dXJlVmFsdWUoaW50IGkpIHsKKwkJYXNzZXJ0VHJ1ZShpID49IDApOworCQlhc3NlcnRUcnVlKGkgPCBFWFBFQ1RFRF9WQUxVRVMubGVuZ3RoKTsKKwkJZmluYWwgU1RFTVRpbWVSYW5nZU1vZGlmaWVyIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCVNURU1UaW1lIGN1cnJlbnRWYWx1ZSA9IChTVEVNVGltZSkgZ2V0VGVzdE9iamVjdCgpLmVHZXQoCisJCQkJZml4dHVyZS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKSk7CisJCXJldHVybiBjdXJyZW50VmFsdWUuZXF1YWxzKCBFWFBFQ1RFRF9WQUxVRVNbaV0pOworCX0KKworfSAvLyBTVEVNVGltZVJhbmdlTW9kaWZpZXJUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9TVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9TVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5NWQwMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL1NURU1UaW1lU2VxdWVuY2VNb2RpZmllclRlc3QuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TZXF1ZW5jZU1vZGlmaWVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNURU0gVGltZSBTZXF1ZW5jZSBNb2RpZmllcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyVGVzdCBleHRlbmRzIFNlcXVlbmNlTW9kaWZpZXJUZXN0IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFNURU1UaW1lIEVYUEVDVEVEX1ZBTFVFU1tdID0gbmV3IFNURU1UaW1lW10geworCQlTVEVNVGltZVJhbmdlTW9kaWZpZXJUZXN0LlNURU1fVElNRV9TVEFSVF9WQUxVRSwKKwkJU1RFTVRpbWVSYW5nZU1vZGlmaWVyVGVzdC5TVEVNX1RJTUVfRU5EX1ZBTFVFIH07CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFNURU0gVGltZSBTZXF1ZW5jZSBNb2RpZmllciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNURU0gVGltZSBTZXF1ZW5jZSBNb2RpZmllciB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFNURU1UaW1lU2VxdWVuY2VNb2RpZmllciBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFNURU1UaW1lU2VxdWVuY2VNb2RpZmllcilmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzLlNlcXVlbmNlTW9kaWZpZXJUZXN0I2NyZWF0ZUZpeHR1cmUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTZXF1ZW5jZU1vZGlmaWVyIGNyZWF0ZUZpeHR1cmUoKSB7CisJCWZpbmFsIFNURU1UaW1lU2VxdWVuY2VNb2RpZmllciByZXRWYWx1ZSA9IE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyKCk7CisJCWZvciAoU1RFTVRpbWUgdmFsdWUgOiBFWFBFQ1RFRF9WQUxVRVMpIHsKKwkJCSByZXRWYWx1ZS5nZXRTZXF1ZW5jZSgpLmFkZCh2YWx1ZSk7CisJCX0gLy8gZm9yIGVhY2ggZG91YmxlCisKKwkJcmV0VmFsdWUuc2V0RVN0cnVjdHVyYWxGZWF0dXJlKGdldFRlc3RPYmplY3QoKS5lQ2xhc3MoKQorCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHMuRmVhdHVyZU1vZGlmaWVyVGVzdCNnZXROdW1iZXJPZk1vZGlmaWNhdGlvbnMoKQorCSAqLworCUBPdmVycmlkZQorCWludCBnZXROdW1iZXJPZk1vZGlmaWNhdGlvbnMoKSB7CisJCXJldHVybiBFWFBFQ1RFRF9WQUxVRVMubGVuZ3RoOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzLkZlYXR1cmVNb2RpZmllclRlc3QjZ2V0VGVzdEF0dHJpYnV0ZUVUeXBlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzaWZpZXIgZ2V0VGVzdEF0dHJpYnV0ZUVUeXBlKCkgeworCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTVEVNVGltZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzLkZlYXR1cmVNb2RpZmllclRlc3QjdmFsaWRhdGVGZWF0dXJlVmFsdWUoaW50KQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRmVhdHVyZVZhbHVlKGludCBpKSB7CisJCWFzc2VydFRydWUoaSA+PSAwKTsKKwkJYXNzZXJ0VHJ1ZShpIDwgRVhQRUNURURfVkFMVUVTLmxlbmd0aCk7CisJCWZpbmFsIFNURU1UaW1lU2VxdWVuY2VNb2RpZmllciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlTVEVNVGltZSBjdXJyZW50VmFsdWUgPSAoU1RFTVRpbWUpIGdldFRlc3RPYmplY3QoKS5lR2V0KAorCQkJCWZpeHR1cmUuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkpOworCQlyZXR1cm4gY3VycmVudFZhbHVlLmVxdWFscyggRVhQRUNURURfVkFMVUVTW2ldKTsKKwl9IC8vIHZhbGlkYXRlRmVhdHVyZVZhbHVlCisJCisKK30gLy9TVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9TZXF1ZW5jZU1vZGlmaWVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvU2VxdWVuY2VNb2RpZmllclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTg4MDUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvU2VxdWVuY2VNb2RpZmllclRlc3QuamF2YQpAQCAtMCwwICsxLDExOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNlcXVlbmNlTW9kaWZpZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VxdWVuY2UgTW9kaWZpZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHRlc3RlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2VxdWVuY2VNb2RpZmllciNnZXRTZXF1ZW5jZVNpemUoKSA8ZW0+U2VxdWVuY2UgU2l6ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNlcXVlbmNlTW9kaWZpZXIjZ2V0TmV4dFZhbHVlKCkgPGVtPk5leHQgVmFsdWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcXVlbmNlTW9kaWZpZXJUZXN0IGV4dGVuZHMgRmVhdHVyZU1vZGlmaWVyVGVzdCB7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFNlcXVlbmNlIE1vZGlmaWVyIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTZXF1ZW5jZU1vZGlmaWVyVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNlcXVlbmNlIE1vZGlmaWVyIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU2VxdWVuY2VNb2RpZmllciBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFNlcXVlbmNlTW9kaWZpZXIpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIGEgU2VxdWVuY2VNb2RpZmllciByZWFkeSBmb3IgdGVzdGluZy4KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgU2VxdWVuY2VNb2RpZmllciBjcmVhdGVGaXh0dXJlKCk7CisJCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNlcXVlbmNlTW9kaWZpZXIjZ2V0U2VxdWVuY2VTaXplKCkgPGVtPlNlcXVlbmNlIFNpemU8L2VtPn0nIGZlYXR1cmUgZ2V0dGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2VxdWVuY2VNb2RpZmllciNnZXRTZXF1ZW5jZVNpemUoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldFNlcXVlbmNlU2l6ZSgpIHsKKwkJZmluYWwgU2VxdWVuY2VNb2RpZmllciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGZpeHR1cmUuZ2V0U2VxdWVuY2VTaXplKCkgPT0gZ2V0TnVtYmVyT2ZNb2RpZmljYXRpb25zKCkpOworCX0gLy8gdGVzdEdldFNlcXVlbmNlU2l6ZQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNlcXVlbmNlTW9kaWZpZXIjZ2V0TmV4dFZhbHVlKCkgPGVtPk5leHQgVmFsdWU8L2VtPn0nIGZlYXR1cmUgZ2V0dGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2VxdWVuY2VNb2RpZmllciNnZXROZXh0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldE5leHRWYWx1ZSgpIHsKKwkJZmluYWwgU2VxdWVuY2VNb2RpZmllciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBFT2JqZWN0IHRlc3RPYmplY3QgPSBnZXRUZXN0T2JqZWN0KCk7CisJCWZpeHR1cmUuc2V0VGFyZ2V0KHRlc3RPYmplY3QpOworCQlhc3NlcnROb3ROdWxsKGZpeHR1cmUuZ2V0TmV4dFZhbHVlKCkgKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2VxdWVuY2VNb2RpZmllciNpc1NldE5leHRWYWx1ZSgpIDxlbT5pc1NldE5leHRWYWx1ZSgpPC9lbT59JyBtZXRob2QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TZXF1ZW5jZU1vZGlmaWVyI2lzU2V0TmV4dFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RJc1NldE5leHRWYWx1ZSgpIHsKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2VxdWVuY2VNb2RpZmllciNzZXROZXh0VmFsdWUoamF2YS5sYW5nLk9iamVjdCkgPGVtPk5leHQgVmFsdWU8L2VtPn0nIGZlYXR1cmUgc2V0dGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2VxdWVuY2VNb2RpZmllciNzZXROZXh0VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTZXROZXh0VmFsdWUoKSB7CisJCWFzc2VydFRydWUodHJ1ZSk7CisJfQorCQorfSAvL1NlcXVlbmNlTW9kaWZpZXJUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9TaW5nbGVWYWx1ZU1vZGlmaWVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvU2luZ2xlVmFsdWVNb2RpZmllclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDRlYTczCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvU2luZ2xlVmFsdWVNb2RpZmllclRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU2luZ2xlVmFsdWVNb2RpZmllcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TaW5nbGUgVmFsdWUgTW9kaWZpZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaW5nbGVWYWx1ZU1vZGlmaWVyVGVzdCBleHRlbmRzIEZlYXR1cmVNb2RpZmllclRlc3QgeworCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBTaW5nbGUgVmFsdWUgTW9kaWZpZXIgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNpbmdsZVZhbHVlTW9kaWZpZXJUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU2luZ2xlIFZhbHVlIE1vZGlmaWVyIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU2luZ2xlVmFsdWVNb2RpZmllciBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFNpbmdsZVZhbHVlTW9kaWZpZXIpZml4dHVyZTsKKwl9CisKK30gLy9TaW5nbGVWYWx1ZU1vZGlmaWVyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvU3RyaW5nTk9QTW9kaWZpZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9TdHJpbmdOT1BNb2RpZmllclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWVhN2EwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvdGVzdHMvU3RyaW5nTk9QTW9kaWZpZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMDUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuSW50ZWdlck5PUE1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlN0cmluZ05PUE1vZGlmaWVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0cmluZyBOT1AgTW9kaWZpZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFN0cmluZ05PUE1vZGlmaWVyVGVzdCBleHRlbmRzIE5PUE1vZGlmaWVyVGVzdCB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFN0cmluZ05PUE1vZGlmaWVyVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBTdHJpbmcgTk9QIE1vZGlmaWVyIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmdOT1BNb2RpZmllclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTdHJpbmcgTk9QIE1vZGlmaWVyIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nTk9QTW9kaWZpZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChTdHJpbmdOT1BNb2RpZmllcilmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gYSB7QGxpbmsgSW50ZWdlck5PUE1vZGlmaWVyfSByZWFkeSBmb3IgdGVzdGluZy4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nTk9QTW9kaWZpZXIgY3JlYXRlRml4dHVyZSgpIHsKKwkJZmluYWwgU3RyaW5nTk9QTW9kaWZpZXIgcmV0VmFsdWUgPSBNb2RpZmllckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVN0cmluZ05PUE1vZGlmaWVyKCk7CisJCUVPYmplY3QgdGVzdE9iamVjdCA9IGdldFRlc3RPYmplY3QoKTsKKwkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSB0ZXN0T2JqZWN0LmVDbGFzcygpCisJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCQlyZXRWYWx1ZS5zZXRFU3RydWN0dXJhbEZlYXR1cmUoZmVhdHVyZSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUZpeHR1cmUKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0cy5GZWF0dXJlTW9kaWZpZXJUZXN0I2dldFRlc3RBdHRyaWJ1dGVFVHlwZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzc2lmaWVyIGdldFRlc3RBdHRyaWJ1dGVFVHlwZSgpIHsKKwkJcmV0dXJuIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RVN0cmluZygpOworCX0KK30gLy9TdHJpbmdOT1BNb2RpZmllclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3Rlc3RzL1N0cmluZ1NlcXVlbmNlTW9kaWZpZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9TdHJpbmdTZXF1ZW5jZU1vZGlmaWVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZTI1MmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RpZmllci90ZXN0cy9TdHJpbmdTZXF1ZW5jZU1vZGlmaWVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNlcXVlbmNlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlN0cmluZ1NlcXVlbmNlTW9kaWZpZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RyaW5nIFNlcXVlbmNlIE1vZGlmaWVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyVGVzdCBleHRlbmRzIFNlcXVlbmNlTW9kaWZpZXJUZXN0IHsKKworcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1NUQVJUX1ZBTFVFID0gInN0YXJ0IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfRU5EX1ZBTFVFID0gImVuZCI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRUNURURfVkFMVUVTW10gPSBuZXcgU3RyaW5nW10geworCQkJU1RSSU5HX1NUQVJUX1ZBTFVFLCBTVFJJTkdfRU5EX1ZBTFVFIH07CisKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFN0cmluZ1NlcXVlbmNlTW9kaWZpZXJUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFN0cmluZyBTZXF1ZW5jZSBNb2RpZmllciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nU2VxdWVuY2VNb2RpZmllclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTdHJpbmcgU2VxdWVuY2UgTW9kaWZpZXIgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoU3RyaW5nU2VxdWVuY2VNb2RpZmllcilmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0cy5TZXF1ZW5jZU1vZGlmaWVyVGVzdCNjcmVhdGVGaXh0dXJlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU2VxdWVuY2VNb2RpZmllciBjcmVhdGVGaXh0dXJlKCkgeworCQlmaW5hbCBTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyIHJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyKCk7CisJCWZvciAoU3RyaW5nIHZhbHVlIDogRVhQRUNURURfVkFMVUVTKSB7CisJCQkgcmV0VmFsdWUuZ2V0U2VxdWVuY2UoKS5hZGQodmFsdWUpOworCQl9IC8vIGZvciBlYWNoIGRvdWJsZQorCisJCXJldFZhbHVlLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShnZXRUZXN0T2JqZWN0KCkuZUNsYXNzKCkKKwkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUZpeHR1cmUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzLkZlYXR1cmVNb2RpZmllclRlc3QjZ2V0TnVtYmVyT2ZNb2RpZmljYXRpb25zKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlpbnQgZ2V0TnVtYmVyT2ZNb2RpZmljYXRpb25zKCkgeworCQlyZXR1cm4gRVhQRUNURURfVkFMVUVTLmxlbmd0aDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci50ZXN0cy5GZWF0dXJlTW9kaWZpZXJUZXN0I2dldFRlc3RBdHRyaWJ1dGVFVHlwZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzc2lmaWVyIGdldFRlc3RBdHRyaWJ1dGVFVHlwZSgpIHsKKwkJcmV0dXJuIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RVN0cmluZygpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnRlc3RzLkZlYXR1cmVNb2RpZmllclRlc3QjdmFsaWRhdGVGZWF0dXJlVmFsdWUoaW50KQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRmVhdHVyZVZhbHVlKGludCBpKSB7CisJCWFzc2VydFRydWUoaSA+PSAwKTsKKwkJYXNzZXJ0VHJ1ZShpIDwgRVhQRUNURURfVkFMVUVTLmxlbmd0aCk7CisJCWZpbmFsIFN0cmluZ1NlcXVlbmNlTW9kaWZpZXIgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IChTdHJpbmcpIGdldFRlc3RPYmplY3QoKS5lR2V0KAorCQkJCWZpeHR1cmUuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkpOworCQlyZXR1cm4gY3VycmVudFZhbHVlLmVxdWFscyggRVhQRUNURURfVkFMVUVTW2ldKTsKKwl9IC8vIHZhbGlkYXRlRmVhdHVyZVZhbHVlCisJCisKK30gLy9TdHJpbmdTZXF1ZW5jZU1vZGlmaWVyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL0Fic29sdXRlVGltZVRlc3RUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvQWJzb2x1dGVUaW1lVGVzdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDg5NGI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL0Fic29sdXRlVGltZVRlc3RUZXN0LmphdmEKQEAgLTAsMCArMSw5MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5BYnNvbHV0ZVRpbWVUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BYnNvbHV0ZSBUaW1lIFRlc3Q8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEFic29sdXRlVGltZVRlc3RUZXN0IGV4dGVuZHMgVGltZVRlc3RUZXN0IHsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oQWJzb2x1dGVUaW1lVGVzdFRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgQWJzb2x1dGUgVGltZSBUZXN0IHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBYnNvbHV0ZVRpbWVUZXN0VGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEFic29sdXRlIFRpbWUgVGVzdCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEFic29sdXRlVGltZVRlc3QgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChBYnNvbHV0ZVRpbWVUZXN0KWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlmaW5hbCBBYnNvbHV0ZVRpbWVUZXN0IGF0dCA9IFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFic29sdXRlVGltZVRlc3QoKTsKKwkJY3VycmVudFRpbWVUb1Rlc3QgPSBhdHQuZ2V0VGltZSgpOworCQlzZXRGaXh0dXJlKGF0dCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnRlc3RzLlByZWRpY2F0ZVRlc3QjZ2V0RXhwZWN0ZWRSZXN1bHQoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGdldEV4cGVjdGVkUmVzdWx0KCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkKK30gLy9BYnNvbHV0ZVRpbWVUZXN0VGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL0FuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9BbmRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjMWI5MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9BbmRUZXN0LmphdmEKQEAgLTAsMCArMSw5NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5BbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuVHJ1ZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BbmQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEFuZFRlc3QgZXh0ZW5kcyBOYXJ5Qm9vbGVhbk9wZXJhdG9yVGVzdCB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKEFuZFRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgQW5kIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBbmRUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgQW5kIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQW5kIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoQW5kKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlmaW5hbCBBbmQgYW5kRXhwcmVzc2lvbiA9IFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFuZCgpOworCQlmaW5hbCBUcnVlIHRydWUwID0gUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHJ1ZSgpOworCQlmaW5hbCBUcnVlIHRydWUxID0gUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHJ1ZSgpOworCQlhbmRFeHByZXNzaW9uLmdldE9wZXJhbmRzKCkuYWRkKHRydWUwKTsKKwkJYW5kRXhwcmVzc2lvbi5nZXRPcGVyYW5kcygpLmFkZCh0cnVlMSk7CisJCXNldEZpeHR1cmUoYW5kRXhwcmVzc2lvbik7CisJfSAvLyBzZXRVcAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnRlc3RzLlByZWRpY2F0ZVRlc3QjZ2V0RXhwZWN0ZWRSZXN1bHQoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGdldEV4cGVjdGVkUmVzdWx0KCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK30gLy9BbmRUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvQm9vbGVhbkV4cHJlc3Npb25UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvQm9vbGVhbkV4cHJlc3Npb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3NGM0ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9Cb29sZWFuRXhwcmVzc2lvblRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5Cb29sZWFuRXhwcmVzc2lvbjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Cb29sZWFuIEV4cHJlc3Npb248L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCb29sZWFuRXhwcmVzc2lvblRlc3QgZXh0ZW5kcyBQcmVkaWNhdGVUZXN0IHsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgQm9vbGVhbiBFeHByZXNzaW9uIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCb29sZWFuRXhwcmVzc2lvblRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBCb29sZWFuIEV4cHJlc3Npb24gdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBCb29sZWFuRXhwcmVzc2lvbiBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKEJvb2xlYW5FeHByZXNzaW9uKWZpeHR1cmU7CisJfQorCit9IC8vQm9vbGVhbkV4cHJlc3Npb25UZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvQm9vbGVhbk9wZXJhdG9yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL0Jvb2xlYW5PcGVyYXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGEzMTFhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL0Jvb2xlYW5PcGVyYXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5Cb29sZWFuT3BlcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Qm9vbGVhbiBPcGVyYXRvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJvb2xlYW5PcGVyYXRvclRlc3QgZXh0ZW5kcyBCb29sZWFuRXhwcmVzc2lvblRlc3QgeworCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBCb29sZWFuIE9wZXJhdG9yIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCb29sZWFuT3BlcmF0b3JUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgQm9vbGVhbiBPcGVyYXRvciB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEJvb2xlYW5PcGVyYXRvciBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKEJvb2xlYW5PcGVyYXRvcilmaXh0dXJlOworCX0KKworfSAvL0Jvb2xlYW5PcGVyYXRvclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9FbGFwc2VkVGltZVRlc3RUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvRWxhcHNlZFRpbWVUZXN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZGFhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvRWxhcHNlZFRpbWVUZXN0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuRWxhcHNlZFRpbWVUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGFwc2VkIFRpbWUgVGVzdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgRWxhcHNlZFRpbWVUZXN0VGVzdCBleHRlbmRzIFRpbWVUZXN0VGVzdCB7CisKKwkKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgZWxhcHNlZCBkYXlzIHRvIHRlc3QgCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxBU1BFRF9EQVlTX1RPX1RFU1QgPSAyOworCisJCisJLyoqCisJICogVGhpcyBpcyB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvZiBlbGFwc2VkIHRpbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVMQVNQRURfTVNfVE9fVEVTVCA9IEVMQVNQRURfREFZU19UT19URVNUCisJCQkqIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZS5Vbml0cy5EQVkKKwkJCQkJLmdldE1pbGxpc2Vjb25kcygpOworCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKEVsYXBzZWRUaW1lVGVzdFRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgRWxhcHNlZCBUaW1lIFRlc3QgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVsYXBzZWRUaW1lVGVzdFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBFbGFwc2VkIFRpbWUgVGVzdCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVsYXBzZWRUaW1lVGVzdCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKEVsYXBzZWRUaW1lVGVzdClmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJZmluYWwgRWxhcHNlZFRpbWVUZXN0IGV0dCA9IFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZUVsYXBzZWRUaW1lVGVzdCgpOworCQlldHQuc2V0TnVtYmVyb2ZEYXlzKEVMQVNQRURfREFZU19UT19URVNUKTsKKwkJZXR0LnNldFJlZmVyZW5jZVRpbWVWYWxpZCh0cnVlKTsKKworCQkvLyBUaGUgY3VycmVudCB0aW1lIHdlJ2xsIHVzZSBmb3IgY29tcGFyaXNvbiB3aWxsIGJlIG9uZSBkYXkgYWZ0ZXIgdGhlCisJCS8vIG51bWJlciBvZiBkYXlzIGluIHRoZSB0ZXN0IHNvIHRoZSBleHBlY3RlZCByZXN1bHQgaXMgdHJ1ZQorCQlmaW5hbCBsb25nIGN1cnJlbnRUaW1lTVMgPSBldHQuZ2V0UmVmZXJlbmNlVGltZSgpLmdldFRpbWUoKS5nZXRUaW1lKCkKKwkJCQkrIChFTEFTUEVEX0RBWVNfVE9fVEVTVCArIDEpCisJCQkJKiBTVEVNVGltZS5Vbml0cy5EQVkuZ2V0TWlsbGlzZWNvbmRzKCk7CisJCWN1cnJlbnRUaW1lVG9UZXN0ID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTVEVNVGltZSgpOworCQljdXJyZW50VGltZVRvVGVzdC5zZXRUaW1lKG5ldyBEYXRlKGN1cnJlbnRUaW1lTVMpKTsKKworCQlzZXRGaXh0dXJlKGV0dCk7CisJfSAvLyBzZXRVcAorCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5FbGFwc2VkVGltZVRlc3QjZ2V0RWxhcHNlZE1pbGxpc2Vjb25kcygpIDxlbT5FbGFwc2VkIE1pbGxpc2Vjb25kczwvZW0+fScgZmVhdHVyZSBnZXR0ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuRWxhcHNlZFRpbWVUZXN0I2dldEVsYXBzZWRNaWxsaXNlY29uZHMoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldEVsYXBzZWRNaWxsaXNlY29uZHMoKSB7CisJCWZpbmFsIEVsYXBzZWRUaW1lVGVzdCBldHQgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoZXR0LmdldEVsYXBzZWRNaWxsaXNlY29uZHMoKSA9PSBFTEFTUEVEX0RBWVNfVE9fVEVTVAorCQkJCSogU1RFTVRpbWUuVW5pdHMuREFZLmdldE1pbGxpc2Vjb25kcygpKTsKKwl9IC8vIHRlc3RHZXRFbGFwc2VkTWlsbGlzZWNvbmRzCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUudGVzdHMuUHJlZGljYXRlVGVzdCNnZXRFeHBlY3RlZFJlc3VsdCgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gZ2V0RXhwZWN0ZWRSZXN1bHQoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworfSAvL0VsYXBzZWRUaW1lVGVzdFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9GYWxzZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9GYWxzZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTU1Y2YzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL0ZhbHNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsODggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuRmFsc2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZhbHNlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBGYWxzZVRlc3QgZXh0ZW5kcyBUZXN0VGVzdCB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKEZhbHNlVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBGYWxzZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRmFsc2VUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRmFsc2UgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBGYWxzZSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKEZhbHNlKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmFsc2UoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnRlc3RzLlByZWRpY2F0ZVRlc3QjZ2V0RXhwZWN0ZWRSZXN1bHQoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGdldEV4cGVjdGVkUmVzdWx0KCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorfSAvL0ZhbHNlVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL0lkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb25UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTI0MDgzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL0lkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb25UZXN0LmphdmEKQEAgLTAsMCArMSw5MyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5JZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlRydWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SWRlbnRpZmlhYmxlIFByZWRpY2F0ZSBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uVGVzdCBleHRlbmRzIElkZW50aWZpYWJsZVByZWRpY2F0ZVRlc3QgeworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBJZGVudGlmaWFibGUgUHJlZGljYXRlIEV4cHJlc3Npb24gdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb25UZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgSWRlbnRpZmlhYmxlIFByZWRpY2F0ZSBFeHByZXNzaW9uIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbiBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKElkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24pZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWZpbmFsIElkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb24gcEV4cHJlc3Npb24gPSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uKCk7CisJCWZpbmFsIFRydWUgdHJ1ZTAgPSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUcnVlKCk7CisJCXBFeHByZXNzaW9uLnNldFByZWRpY2F0ZSh0cnVlMCk7CisJCXNldEZpeHR1cmUocEV4cHJlc3Npb24pOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS50ZXN0cy5JZGVudGlmaWFibGVQcmVkaWNhdGVUZXN0I2dldEV4cGVjdGVkUmVzdWx0KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRFeHBlY3RlZFJlc3VsdCgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisKK30gLy9JZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL0lkZW50aWZpYWJsZVByZWRpY2F0ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9JZGVudGlmaWFibGVQcmVkaWNhdGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFkZmNkNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9JZGVudGlmaWFibGVQcmVkaWNhdGVUZXN0LmphdmEKQEAgLTAsMCArMSw4OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24udGVzdHMuSWRlbnRpZmlhYmxlVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5JZGVudGlmaWFibGVQcmVkaWNhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SWRlbnRpZmlhYmxlIFByZWRpY2F0ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSB0ZXN0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGUjZXZhbHVhdGUob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lLCBsb25nLCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yKSA8ZW0+RXZhbHVhdGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIElkZW50aWZpYWJsZVByZWRpY2F0ZVRlc3QgZXh0ZW5kcyBJZGVudGlmaWFibGVUZXN0IHsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgSWRlbnRpZmlhYmxlIFByZWRpY2F0ZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSWRlbnRpZmlhYmxlUHJlZGljYXRlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIElkZW50aWZpYWJsZSBQcmVkaWNhdGUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJZGVudGlmaWFibGVQcmVkaWNhdGUgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChJZGVudGlmaWFibGVQcmVkaWNhdGUpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZSNldmFsdWF0ZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIGxvbmcsIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IpIDxlbT5FdmFsdWF0ZTwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZSNldmFsdWF0ZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIGxvbmcsIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0RXZhbHVhdGVfX1NURU1UaW1lX2xvbmdfRGVjb3JhdG9yKCkgeworCQlmaW5hbCBQcmVkaWNhdGUgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgU1RFTVRpbWUgY3VycmVudFRpbWUgPSBnZXRDdXJyZW50VGltZXRvVGVzdCgpOworCQlmaW5hbCBsb25nIGVsYXBzZWRUaW1lID0gZ2V0RWxhcHNlZFRpbWVUb1Rlc3QoKTsKKwkJZmluYWwgYm9vbGVhbiByZXN1bHQgPSBmaXh0dXJlLmV2YWx1YXRlKGN1cnJlbnRUaW1lLCBlbGFwc2VkVGltZSwgbnVsbCk7CisJCWFzc2VydFRydWUgKHJlc3VsdCA9PSBnZXRFeHBlY3RlZFJlc3VsdCgpKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIGxvbmcgZ2V0RWxhcHNlZFRpbWVUb1Rlc3QoKSB7CisJCXJldHVybiAwTDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIFNURU1UaW1lIGdldEN1cnJlbnRUaW1ldG9UZXN0KCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBleHBlY3RlZCByZXN1bHQgb2YgY2FsbGluZyBnZXRGaXh0dXJlLmV2YWx1YXRlKCk7CisJICovCisJYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0RXhwZWN0ZWRSZXN1bHQoKTsKKwkKK30gLy9JZGVudGlmaWFibGVQcmVkaWNhdGVUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvSWRlbnRpZmlhYmxlVGVzdFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9JZGVudGlmaWFibGVUZXN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNGNhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvSWRlbnRpZmlhYmxlVGVzdFRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5JZGVudGlmaWFibGVUZXN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklkZW50aWZpYWJsZSBUZXN0PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSWRlbnRpZmlhYmxlVGVzdFRlc3QgZXh0ZW5kcyBJZGVudGlmaWFibGVQcmVkaWNhdGVUZXN0IHsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgSWRlbnRpZmlhYmxlIFRlc3QgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElkZW50aWZpYWJsZVRlc3RUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgSWRlbnRpZmlhYmxlIFRlc3QgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJZGVudGlmaWFibGVUZXN0IGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoSWRlbnRpZmlhYmxlVGVzdClmaXh0dXJlOworCX0KKworfSAvL0lkZW50aWZpYWJsZVRlc3RUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvTmFyeUJvb2xlYW5PcGVyYXRvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9OYXJ5Qm9vbGVhbk9wZXJhdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkN2FjYjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvTmFyeUJvb2xlYW5PcGVyYXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5OYXJ5Qm9vbGVhbk9wZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hcnkgQm9vbGVhbiBPcGVyYXRvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE5hcnlCb29sZWFuT3BlcmF0b3JUZXN0IGV4dGVuZHMgQm9vbGVhbk9wZXJhdG9yVGVzdCB7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IE5hcnkgQm9vbGVhbiBPcGVyYXRvciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTmFyeUJvb2xlYW5PcGVyYXRvclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBOYXJ5IEJvb2xlYW4gT3BlcmF0b3IgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBOYXJ5Qm9vbGVhbk9wZXJhdG9yIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoTmFyeUJvb2xlYW5PcGVyYXRvcilmaXh0dXJlOworCX0KKworfSAvL05hcnlCb29sZWFuT3BlcmF0b3JUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvTm90VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL05vdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjlhMTI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL05vdFRlc3QuamF2YQpAQCAtMCwwICsxLDkzIEBACisvLyBOb3RUZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuRmFsc2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5Ob3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5vdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgTm90VGVzdCBleHRlbmRzIFVuYXJ5Qm9vbGVhbk9wZXJhdG9yVGVzdCB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKE5vdFRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgTm90IHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTm90IHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTm90IGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoTm90KWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlmaW5hbCBOb3Qgbm90RXhwcmVzc2lvbiA9IFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU5vdCgpOworCQlmaW5hbCBGYWxzZSBmYWxzZTAgPSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGYWxzZSgpOworCQlub3RFeHByZXNzaW9uLnNldE9wZXJhbmQoZmFsc2UwKTsKKwkJc2V0Rml4dHVyZShub3RFeHByZXNzaW9uKTsKKwl9IC8vIHNldFVwCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUudGVzdHMuUHJlZGljYXRlVGVzdCNnZXRFeHBlY3RlZFJlc3VsdCgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gZ2V0RXhwZWN0ZWRSZXN1bHQoKSB7CisJCXJldHVybiB0cnVlOworCX0KKwkKK30gLy8gTm90VGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL09yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL09yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYTk4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvT3JUZXN0LmphdmEKQEAgLTAsMCArMSw5NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5GYWxzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLk9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlRydWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3I8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIE9yVGVzdCBleHRlbmRzIE5hcnlCb29sZWFuT3BlcmF0b3JUZXN0IHsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oT3JUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IE9yIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBPclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBPciB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9yIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoT3IpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWZpbmFsIE9yIG9yRXhwcmVzc2lvbiA9IFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9yKCk7CisJCWZpbmFsIEZhbHNlIGZhbHNlMCA9IFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZhbHNlKCk7CisJCWZpbmFsIFRydWUgdHJ1ZTAgPSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUcnVlKCk7CisJCW9yRXhwcmVzc2lvbi5nZXRPcGVyYW5kcygpLmFkZChmYWxzZTApOworCQlvckV4cHJlc3Npb24uZ2V0T3BlcmFuZHMoKS5hZGQodHJ1ZTApOworCQlzZXRGaXh0dXJlKG9yRXhwcmVzc2lvbik7CisJfSAvLyBzZXRVcAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnRlc3RzLlByZWRpY2F0ZVRlc3QjZ2V0RXhwZWN0ZWRSZXN1bHQoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGdldEV4cGVjdGVkUmVzdWx0KCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK30gLy9PclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9QcmVkaWNhdGVFeHByZXNzaW9uVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL1ByZWRpY2F0ZUV4cHJlc3Npb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI0ZDkzZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9QcmVkaWNhdGVFeHByZXNzaW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuRmFsc2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGVFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBQcmVkaWNhdGVFeHByZXNzaW9uVGVzdCBleHRlbmRzIEJvb2xlYW5FeHByZXNzaW9uVGVzdCB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFByZWRpY2F0ZUV4cHJlc3Npb25UZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IEV4cHJlc3Npb24gdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByZWRpY2F0ZUV4cHJlc3Npb25UZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRXhwcmVzc2lvbiB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFByZWRpY2F0ZUV4cHJlc3Npb24gZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChQcmVkaWNhdGVFeHByZXNzaW9uKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlmaW5hbCBQcmVkaWNhdGVFeHByZXNzaW9uIHBFeHByZXNzaW9uID0gUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJlZGljYXRlRXhwcmVzc2lvbigpOworCQlmaW5hbCBGYWxzZSBmYWxzZTAgPSBQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGYWxzZSgpOworCQlwRXhwcmVzc2lvbi5zZXRQcmVkaWNhdGUoZmFsc2UwKTsKKwkJc2V0Rml4dHVyZShwRXhwcmVzc2lvbik7CisJfSAvLyBzZXRVcAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnRlc3RzLlByZWRpY2F0ZVRlc3QjZ2V0RXhwZWN0ZWRSZXN1bHQoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGdldEV4cGVjdGVkUmVzdWx0KCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCit9IC8vUHJlZGljYXRlRXhwcmVzc2lvblRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9QcmVkaWNhdGVSZWZlcmVuY2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvUHJlZGljYXRlUmVmZXJlbmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNzQ4NzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvUHJlZGljYXRlUmVmZXJlbmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZVJlZmVyZW5jZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFByZWRpY2F0ZVJlZmVyZW5jZVRlc3QgZXh0ZW5kcyBQcmVkaWNhdGVUZXN0IHsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oUHJlZGljYXRlUmVmZXJlbmNlVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBSZWZlcmVuY2UgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByZWRpY2F0ZVJlZmVyZW5jZVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBSZWZlcmVuY2UgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBQcmVkaWNhdGVSZWZlcmVuY2UgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChQcmVkaWNhdGVSZWZlcmVuY2UpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShQcmVkaWNhdGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmVkaWNhdGVSZWZlcmVuY2UoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnRlc3RzLlByZWRpY2F0ZVRlc3QjdGVzdEV2YWx1YXRlX19TVEVNVGltZV9sb25nX0RlY29yYXRvcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdGVzdEV2YWx1YXRlX19TVEVNVGltZV9sb25nX0RlY29yYXRvcigpIHsKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUudGVzdHMuUHJlZGljYXRlVGVzdCNnZXRFeHBlY3RlZFJlc3VsdCgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gZ2V0RXhwZWN0ZWRSZXN1bHQoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCit9IC8vUHJlZGljYXRlUmVmZXJlbmNlVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL1ByZWRpY2F0ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9QcmVkaWNhdGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUyOTQ4YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9QcmVkaWNhdGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMDYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJlZGljYXRlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgYXJlIHRlc3RlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZSNldmFsdWF0ZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIGxvbmcsIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IpIDxlbT5FdmFsdWF0ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJlZGljYXRlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFByZWRpY2F0ZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFByZWRpY2F0ZSBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgUHJlZGljYXRlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcmVkaWNhdGVUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUHJlZGljYXRlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKFByZWRpY2F0ZSBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBQcmVkaWNhdGUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCS8vQE92ZXJyaWRlCisJcHJvdGVjdGVkIFByZWRpY2F0ZSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZSNldmFsdWF0ZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIGxvbmcsIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IpIDxlbT5FdmFsdWF0ZTwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZSNldmFsdWF0ZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIGxvbmcsIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0RXZhbHVhdGVfX1NURU1UaW1lX2xvbmdfRGVjb3JhdG9yKCkgeworCQlmaW5hbCBQcmVkaWNhdGUgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgU1RFTVRpbWUgY3VycmVudFRpbWUgPSBnZXRDdXJyZW50VGltZXRvVGVzdCgpOworCQlmaW5hbCBsb25nIGVsYXBzZWRUaW1lID0gZ2V0RWxhcHNlZFRpbWVUb1Rlc3QoKTsKKwkJZmluYWwgYm9vbGVhbiByZXN1bHQgPSBmaXh0dXJlLmV2YWx1YXRlKGN1cnJlbnRUaW1lLCBlbGFwc2VkVGltZSwgbnVsbCk7CisJCWFzc2VydFRydWUgKHJlc3VsdCA9PSBnZXRFeHBlY3RlZFJlc3VsdCgpKTsKKwl9IC8vIHRlc3RFdmFsdWF0ZV9fU1RFTVRpbWVfbG9uZ19EZWNvcmF0b3IKKworCS8qKgorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgbG9uZyBnZXRFbGFwc2VkVGltZVRvVGVzdCgpIHsKKwkJcmV0dXJuIDBMOworCX0KKworCS8qKgorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgU1RFTVRpbWUgZ2V0Q3VycmVudFRpbWV0b1Rlc3QoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGV4cGVjdGVkIHJlc3VsdCBvZiBjYWxsaW5nIGdldEZpeHR1cmUuZXZhbHVhdGUoKTsKKwkgKi8KKwlhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBnZXRFeHBlY3RlZFJlc3VsdCgpOworCit9IC8vUHJlZGljYXRlVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL1ByZWRpY2F0ZVRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvUHJlZGljYXRlVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTIwOWI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL1ByZWRpY2F0ZVRlc3RzLmphdmEKQEAgLTAsMCArMSw2NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IHN1aXRlIGZvciB0aGUgJzxlbT48Yj5wcmVkaWNhdGU8L2I+PC9lbT4nIHBhY2thZ2UuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFByZWRpY2F0ZVRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgUHJlZGljYXRlVGVzdHMoInByZWRpY2F0ZSBUZXN0cyIpOyAvLyROT04tTkxTLTEkCisJCXN1aXRlLmFkZFRlc3RTdWl0ZShBbmRUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEZhbHNlVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShOb3RUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKE9yVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShQcmVkaWNhdGVSZWZlcmVuY2VUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFRydWVUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFByZWRpY2F0ZUV4cHJlc3Npb25UZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKElkZW50aWZpYWJsZVByZWRpY2F0ZUV4cHJlc3Npb25UZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEFic29sdXRlVGltZVRlc3RUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVsYXBzZWRUaW1lVGVzdFRlc3QuY2xhc3MpOworCQlyZXR1cm4gc3VpdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByZWRpY2F0ZVRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworfSAvL1ByZWRpY2F0ZVRlc3RzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvVGVzdFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9UZXN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYzM3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvVGVzdFRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5UZXN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlc3Q8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0VGVzdCBleHRlbmRzIFByZWRpY2F0ZVRlc3QgeworCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBUZXN0IHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUZXN0VGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFRlc3QgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBUZXN0IGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoVGVzdClmaXh0dXJlOworCX0KKworfSAvL1Rlc3RUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvVGltZVRlc3RUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvVGltZVRlc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2ODRkMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9UaW1lVGVzdFRlc3QuamF2YQpAQCAtMCwwICsxLDY0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuVGltZVRlc3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGltZSBUZXN0PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGltZVRlc3RUZXN0IGV4dGVuZHMgVGVzdFRlc3QgeworCisJcHJvdGVjdGVkIFNURU1UaW1lIGN1cnJlbnRUaW1lVG9UZXN0ID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgVGltZSBUZXN0IHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUaW1lVGVzdFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBUaW1lIFRlc3QgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBUaW1lVGVzdCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFRpbWVUZXN0KWZpeHR1cmU7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnRlc3RzLlByZWRpY2F0ZVRlc3QjZ2V0Q3VycmVudFRpbWV0b1Rlc3QoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTVEVNVGltZSBnZXRDdXJyZW50VGltZXRvVGVzdCgpIHsKKwkJcmV0dXJuIGN1cnJlbnRUaW1lVG9UZXN0OworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS50ZXN0cy5QcmVkaWNhdGVUZXN0I2dldEVsYXBzZWRUaW1lVG9UZXN0KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgbG9uZyBnZXRFbGFwc2VkVGltZVRvVGVzdCgpIHsKKwkJcmV0dXJuIFNURU1UaW1lLlVuaXRzLkRBWS5nZXRNaWxsaXNlY29uZHMoKTsKKwl9CisKK30gLy8gVGltZVRlc3RUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvVHJ1ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9UcnVlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjODVjMWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvdGVzdHMvVHJ1ZVRlc3QuamF2YQpAQCAtMCwwICsxLDg3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5UcnVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRydWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFRydWVUZXN0IGV4dGVuZHMgVGVzdFRlc3QgeworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihUcnVlVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBUcnVlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUcnVlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFRydWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBUcnVlIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoVHJ1ZSlmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKFByZWRpY2F0ZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRydWUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnRlc3RzLlByZWRpY2F0ZVRlc3QjZ2V0RXhwZWN0ZWRSZXN1bHQoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGdldEV4cGVjdGVkUmVzdWx0KCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9IC8vVHJ1ZVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9VbmFyeUJvb2xlYW5PcGVyYXRvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS90ZXN0cy9VbmFyeUJvb2xlYW5PcGVyYXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjZhNTY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3Rlc3RzL1VuYXJ5Qm9vbGVhbk9wZXJhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlVuYXJ5Qm9vbGVhbk9wZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVuYXJ5IEJvb2xlYW4gT3BlcmF0b3I8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBVbmFyeUJvb2xlYW5PcGVyYXRvclRlc3QgZXh0ZW5kcyBCb29sZWFuT3BlcmF0b3JUZXN0IHsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgVW5hcnkgQm9vbGVhbiBPcGVyYXRvciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVW5hcnlCb29sZWFuT3BlcmF0b3JUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgVW5hcnkgQm9vbGVhbiBPcGVyYXRvciB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFVuYXJ5Qm9vbGVhbk9wZXJhdG9yIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoVW5hcnlCb29sZWFuT3BlcmF0b3IpZml4dHVyZTsKKwl9CisKK30gLy9VbmFyeUJvb2xlYW5PcGVyYXRvclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvL3Rlc3RzL1NjZW5hcmlvQWxsVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvL3Rlc3RzL1NjZW5hcmlvQWxsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjMwOWU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2NlbmFyaW8vdGVzdHMvU2NlbmFyaW9BbGxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+U2NlbmFyaW88L2I+PC9lbT4nIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTY2VuYXJpb0FsbFRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFNjZW5hcmlvQWxsVGVzdHMoIlNjZW5hcmlvIFRlc3RzIik7CisJCXN1aXRlLmFkZFRlc3QoU2NlbmFyaW9UZXN0cy5zdWl0ZSgpKTsKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTY2VuYXJpb0FsbFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworfSAvL1NjZW5hcmlvQWxsVGVzdHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvL3Rlc3RzL1NjZW5hcmlvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2NlbmFyaW8vdGVzdHMvU2NlbmFyaW9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4MjcxYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvL3Rlc3RzL1NjZW5hcmlvVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTU4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuVXRpbGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuSWRlbnRpZmlhYmxlRmlsdGVySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnRlc3RzLklkZW50aWZpYWJsZVRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnRlc3RzLk1vZGVsVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLmltcGwuU2VxdWVuY2VySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuRmRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLkRlY29yYXRvcnNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RJbnRlZ2VyTGFiZWxWYWx1ZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNjZW5hcmlvPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgYXJlIHRlc3RlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8jc3RlcCgpIDxlbT5TdGVwPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8jcmVzZXQoKSA8ZW0+UmVzZXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbyNpbml0aWFsaXplKCkgPGVtPkluaXRpYWxpemU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbyNwcm9kdWNlVGl0bGUoKSA8ZW0+UHJvZHVjZSBUaXRsZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBTY2VuYXJpb1Rlc3QgZXh0ZW5kcyBJZGVudGlmaWFibGVUZXN0IHsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHRpdGxlIG9mIHRoZSB0ZXN0IHNjZW5hcmlvLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU0NFTkFSSU9fVElUTEUgPSAiVGVzdCBTY2VuYXJpbyAjMSI7CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgU0NFTkFSSU9fU0VSSUFMWkFUSU9OX1RFU1RfVVJJID0gVVJJCisJCQkuY3JlYXRlVVJJKCJ0ZW1wL3Rlc3RzY2VuYXJpbzEuc2NlbmFyaW8iKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBDQU5PTklDQUxfR1JBUEhfU0VSSUFMWkFUSU9OX1RFU1RfVVJJID0gVVJJCisJCQkuY3JlYXRlVVJJKCJ0ZW1wL3Rlc3RjYW5vbmljYWxncmFwaDEuZ3JhcGgiKTsKKworCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0VOQVJJTyA9ICJzY2VuYXJpbyI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBVUkkgdGhhdCB3aWxsIGJlIHRoZSBJZGVudGlmaWVyIG9mIHRoZSBzY2VuYXJpbworCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBTQ0VOQVJJT19VUkkgPSBVUkkuY3JlYXRlVVJJKCJwbGF0Zm9ybTovcGx1Z2luLyIKKwkJCSsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRlc3RzLkFjdGl2YXRvci5QTFVHSU5fSUQKKwkJCSsgIi9kYXRhL3NjZW5hcmlvcy9iYXNpYy90ZXN0c2NlbmFyaW8xLnNjZW5hcmlvIik7CisJCisJLyoqCisJICogVVJJIGZvciB0aGUgU2VxdWVuY2VyIGluIHRoZSBTY2VuYXJpbworCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBTRVFVRU5DRVJfVVJJID0gVVJJLmNyZWF0ZVVSSSgiU0VRVUVOQ0VSL3NlcXVlbmNlcjEuc2VxdWVuY2VyIik7CisKKwkvKioKKwkgKiBVUkkgZm9yIHRoZSBEZWNvcmF0b3IgaW4gdGhlIHRlc3Qgc2NlbmFyaW8KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgREVDT0FSVE9SX1VSSSA9IFVSSS5jcmVhdGVVUkkoImRlY29yYXRvci9kZWNvcmF0b3IxLmRlY29yYXRvciIpOworCQkKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQ0FOT05JQ0FMX0dSQVBIX19VUkkgPSBTVEVNVVJJCisJCQkuY3JlYXRlVVJJKCJHUkFQSC90ZXN0Y2Fub25pY2FsZ3JhcGgiKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFNjZW5hcmlvVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBTY2VuYXJpbyB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNjZW5hcmlvVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNjZW5hcmlvIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU2NlbmFyaW8gZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChTY2VuYXJpbylmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9IC8vIHNldFVwCisKKwkvKioKKwkgKiBAcmV0dXJuIGEgc2NlbmFyaW8KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFNjZW5hcmlvIGNyZWF0ZUZpeHR1cmUoKSB7CisJCWZpbmFsIFNjZW5hcmlvIHNjZW5hcmlvID0gU2NlbmFyaW9GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTY2VuYXJpbygpOworCQlzY2VuYXJpby5zZXRNb2RlbChNb2RlbFRlc3QuY3JlYXRlRml4dHVyZSgpKTsKKwkJc2NlbmFyaW8uc2V0U2VxdWVuY2VyKGdldFRlc3RTZXF1ZW5jZXIoKSk7CisJCXNjZW5hcmlvLnNldFVSSShTQ0VOQVJJT19VUkkpOworCQlmaW5hbCBEZWNvcmF0b3IgZGVjb3JhdG9yID0gRGVjb3JhdG9yc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSgpOworCQlkZWNvcmF0b3Iuc2V0VVJJKERFQ09BUlRPUl9VUkkpOworCQlzY2VuYXJpby5nZXRTY2VuYXJpb0RlY29yYXRvcnMoKS5hZGQoZGVjb3JhdG9yKTsKKwkJc2NlbmFyaW8uZ2V0RHVibGluQ29yZSgpLnBvcHVsYXRlKCk7CisJCXNjZW5hcmlvLmdldER1YmxpbkNvcmUoKS5zZXRUaXRsZShURVNUX1NDRU5BUklPX1RJVExFKTsKKwkJCisJCS8vc2NlbmFyaW8uaW5pdGlhbGl6ZSgpOworCQkKKwkJU29sdmVyIHNvbHZlciA9IEZkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmluaXRlRGlmZmVyZW5jZSgpOworCQlzb2x2ZXIuc2V0RGVjb3JhdG9ycyhzY2VuYXJpby5nZXRTY2VuYXJpb0RlY29yYXRvcnMoKSk7CisJCXNjZW5hcmlvLnNldFNvbHZlcihzb2x2ZXIpOworCQkKKwkJCisJCQorCQkKKwkJCisJCQorCQlyZXR1cm4gc2NlbmFyaW87CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvI2dldENhbm9uaWNhbEdyYXBoKCkgPGVtPkNhbm9uaWNhbCBHcmFwaDwvZW0+fScKKwkgKiBmZWF0dXJlIGdldHRlci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8jZ2V0Q2Fub25pY2FsR3JhcGgoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldENhbm9uaWNhbEdyYXBoKCkgeworCQkvLyBOb3RoaW5nIHRvIHRlc3QKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwl9IC8vIHRlc3RHZXRDYW5vbmljYWxHcmFwaAorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvI3N0ZXAoKSA8ZW0+U3RlcDwvZW0+fScKKwkgKiBvcGVyYXRpb24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvI3N0ZXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdFN0ZXAoKSB7CisJCWZpbmFsIFNjZW5hcmlvIHNjZW5hcmlvID0gZ2V0Rml4dHVyZSgpOworCisJCXNjZW5hcmlvLmluaXRpYWxpemUoKTsKKwkJCisJCS8vIEhlcmUgd2Ugc2hvdWxkIHRlc3QgdGhhdCB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGR5bmFtaWMgbGFiZWxzIGFyZQorCQkvLyBjb3JyZWN0CisJCUdyYXBoIGNhbm9uaWNhbEdyYXBoID0gc2NlbmFyaW8uZ2V0Q2Fub25pY2FsR3JhcGgoKTsKKworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yIGR5bmFtaWNMYWJlbEl0ZXIgPSBjYW5vbmljYWxHcmFwaAorCQkJCS5nZXREeW5hbWljTGFiZWxzKCkuaXRlcmF0b3IoKTsgZHluYW1pY0xhYmVsSXRlci5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBEeW5hbWljTGFiZWwgZHluYW1pY0xhYmVsID0gKER5bmFtaWNMYWJlbCkgZHluYW1pY0xhYmVsSXRlcgorCQkJCQkubmV4dCgpOworCQkJYXNzZXJ0VHJ1ZSgoKFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSkgZHluYW1pY0xhYmVsLmdldEN1cnJlbnRWYWx1ZSgpKQorCQkJCQkuZ2V0SSgpID09IFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZS5DVVJSRU5UX0xBQkVMX0lOVEVHRVJfVkFMVUUpOworCQl9IC8vIGZvcgorCisJCXNjZW5hcmlvLnN0ZXAoKTsKKworCQkvLyBIZXJlIHdlIHNob3VsZCB0ZXN0IHRoYXQgdGhlIHZhbHVlcyBvZiB0aGUgZHluYW1pYyBsYWJlbHMgaGF2ZQorCQkvLyBjaGFuZ2VkCisJCWNhbm9uaWNhbEdyYXBoID0gc2NlbmFyaW8uZ2V0Q2Fub25pY2FsR3JhcGgoKTsKKworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yIGR5bmFtaWNMYWJlbEl0ZXIgPSBjYW5vbmljYWxHcmFwaAorCQkJCS5nZXREeW5hbWljTGFiZWxzKCkuaXRlcmF0b3IoKTsgZHluYW1pY0xhYmVsSXRlci5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBEeW5hbWljTGFiZWwgZHluYW1pY0xhYmVsID0gKER5bmFtaWNMYWJlbCkgZHluYW1pY0xhYmVsSXRlcgorCQkJCQkubmV4dCgpOworCQkJYXNzZXJ0VHJ1ZSgoKFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSkgZHluYW1pY0xhYmVsLmdldEN1cnJlbnRWYWx1ZSgpKQorCQkJCQkuZ2V0SSgpID09IFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZS5ORVhUX0xBQkVMX0lOVEVHRVJfVkFMVUUpOworCQl9IC8vIGZvcgorLy8KKy8vCQlpbnQgY291bnQgPSAxOworLy8JCWZvciAoOyBzY2VuYXJpby5zdGVwKCkgJiYgY291bnQgPCAxMTsgY291bnQrKykgeworLy8JCQkvLyBub3RoaW5nCisvLwkJfSAvLyBmb3IKKy8vCisvLwkJLy8gc3RlcCgpIHNob3VsZCBzdG9wIGJlZm9yZSBjb3VudCBtYWtlcyBpdCB0byAxMQorLy8JCWFzc2VydFRydWUoY291bnQgPT0gMTApOworCX0gLy8gdGVzdFN0ZXAKKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbyNyZXNldCgpIDxlbT5SZXNldDwvZW0+fScKKwkgKiBvcGVyYXRpb24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvI3Jlc2V0KCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RSZXNldCgpIHsKKwkJZmluYWwgU2NlbmFyaW8gc2NlbmFyaW8gPSBnZXRGaXh0dXJlKCk7CisKKwkJc2NlbmFyaW8uaW5pdGlhbGl6ZSgpOworCisJCS8vIEhlcmUgd2Ugc2hvdWxkIHRlc3QgdGhhdCB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGR5bmFtaWMgbGFiZWxzIGFyZQorCQkvLyBjb3JyZWN0CisJCUdyYXBoIGNhbm9uaWNhbEdyYXBoID0gc2NlbmFyaW8uZ2V0Q2Fub25pY2FsR3JhcGgoKTsKKworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yIGR5bmFtaWNMYWJlbEl0ZXIgPSBjYW5vbmljYWxHcmFwaAorCQkJCS5nZXREeW5hbWljTGFiZWxzKCkuaXRlcmF0b3IoKTsgZHluYW1pY0xhYmVsSXRlci5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBEeW5hbWljTGFiZWwgZHluYW1pY0xhYmVsID0gKER5bmFtaWNMYWJlbCkgZHluYW1pY0xhYmVsSXRlcgorCQkJCQkubmV4dCgpOworCQkJYXNzZXJ0VHJ1ZSgoKFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSkgZHluYW1pY0xhYmVsLmdldEN1cnJlbnRWYWx1ZSgpKQorCQkJCQkuZ2V0SSgpID09IFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZS5DVVJSRU5UX0xBQkVMX0lOVEVHRVJfVkFMVUUpOworCQl9IC8vIGZvcgorCisJCXNjZW5hcmlvLnN0ZXAoKTsKKworCQkvLyBIZXJlIHdlIHNob3VsZCB0ZXN0IHRoYXQgdGhlIHZhbHVlcyBvZiB0aGUgZHluYW1pYyBsYWJlbHMgaGF2ZQorCQkvLyBjaGFuZ2VkCisJCWNhbm9uaWNhbEdyYXBoID0gc2NlbmFyaW8uZ2V0Q2Fub25pY2FsR3JhcGgoKTsKKworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yIGR5bmFtaWNMYWJlbEl0ZXIgPSBjYW5vbmljYWxHcmFwaAorCQkJCS5nZXREeW5hbWljTGFiZWxzKCkuaXRlcmF0b3IoKTsgZHluYW1pY0xhYmVsSXRlci5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBEeW5hbWljTGFiZWwgZHluYW1pY0xhYmVsID0gKER5bmFtaWNMYWJlbCkgZHluYW1pY0xhYmVsSXRlcgorCQkJCQkubmV4dCgpOworCQkJYXNzZXJ0VHJ1ZSgoKFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSkgZHluYW1pY0xhYmVsLmdldEN1cnJlbnRWYWx1ZSgpKQorCQkJCQkuZ2V0SSgpID09IFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZS5ORVhUX0xBQkVMX0lOVEVHRVJfVkFMVUUpOworCQl9IC8vIGZvcgorCisJCXNjZW5hcmlvLnJlc2V0KCk7CisKKwkJLy8gSGVyZSB3ZSBzaG91bGQgdGVzdCB0aGF0IHRoZSB2YWx1ZXMgb2YgdGhlIGR5bmFtaWMgbGFiZWxzIGFyZSBiYWNrIHRvCisJCS8vIHRoZWlyIGluaXRpYWwgdmFsdWVzLgorCQljYW5vbmljYWxHcmFwaCA9IHNjZW5hcmlvLmdldENhbm9uaWNhbEdyYXBoKCk7CisKKwkJZm9yIChmaW5hbCBJdGVyYXRvciBkeW5hbWljTGFiZWxJdGVyID0gY2Fub25pY2FsR3JhcGgKKwkJCQkuZ2V0RHluYW1pY0xhYmVscygpLml0ZXJhdG9yKCk7IGR5bmFtaWNMYWJlbEl0ZXIuaGFzTmV4dCgpOykgeworCQkJZmluYWwgRHluYW1pY0xhYmVsIGR5bmFtaWNMYWJlbCA9IChEeW5hbWljTGFiZWwpIGR5bmFtaWNMYWJlbEl0ZXIKKwkJCQkJLm5leHQoKTsKKwkJCWFzc2VydFRydWUoKChUZXN0SW50ZWdlckxhYmVsVmFsdWUpIGR5bmFtaWNMYWJlbC5nZXRDdXJyZW50VmFsdWUoKSkKKwkJCQkJLmdldEkoKSA9PSBUZXN0SW50ZWdlckxhYmVsVmFsdWUuQ1VSUkVOVF9MQUJFTF9JTlRFR0VSX1ZBTFVFKTsKKwkJfSAvLyBmb3IKKworCQlhc3NlcnRGYWxzZShzY2VuYXJpby5nZXRTZXF1ZW5jZXIoKS5pc1RpbWVUb1N0b3AoKSk7CisJfSAvLyB0ZXN0UmVzZXQKKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbyNpbml0aWFsaXplKCkgPGVtPkluaXRpYWxpemU8L2VtPn0nCisJICogb3BlcmF0aW9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbyNpbml0aWFsaXplKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplKCkgeworCQlmaW5hbCBTY2VuYXJpbyBzY2VuYXJpbyA9IGdldEZpeHR1cmUoKTsKKwkJc2NlbmFyaW8uaW5pdGlhbGl6ZSgpOworCQkvLyBIZXJlIHdlIHNob3VsZCB0ZXN0IHRoYXQgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBkeW5hbWljIGxhYmVscyBhcmUKKwkJLy8gY29ycmVjdAorCQlHcmFwaCBjYW5vbmljYWxHcmFwaCA9IHNjZW5hcmlvLmdldENhbm9uaWNhbEdyYXBoKCk7CisKKwkJZm9yIChmaW5hbCBJdGVyYXRvciBkeW5hbWljTGFiZWxJdGVyID0gY2Fub25pY2FsR3JhcGgKKwkJCQkuZ2V0RHluYW1pY0xhYmVscygpLml0ZXJhdG9yKCk7IGR5bmFtaWNMYWJlbEl0ZXIuaGFzTmV4dCgpOykgeworCQkJZmluYWwgRHluYW1pY0xhYmVsIGR5bmFtaWNMYWJlbCA9IChEeW5hbWljTGFiZWwpIGR5bmFtaWNMYWJlbEl0ZXIKKwkJCQkJLm5leHQoKTsKKwkJCWFzc2VydFRydWUoKChUZXN0SW50ZWdlckxhYmVsVmFsdWUpIGR5bmFtaWNMYWJlbC5nZXRDdXJyZW50VmFsdWUoKSkKKwkJCQkJLmdldEkoKSA9PSBUZXN0SW50ZWdlckxhYmVsVmFsdWUuQ1VSUkVOVF9MQUJFTF9JTlRFR0VSX1ZBTFVFKTsKKwkJfSAvLyBmb3IKKworCQlhc3NlcnRGYWxzZShzY2VuYXJpby5nZXRTZXF1ZW5jZXIoKS5pc1RpbWVUb1N0b3AoKSk7CisKKwkJLy8gTG9vayBmb3IgdGhlIGdyYXBoIGxhYmVsIGFkZGVkIGJ5IHRoZSBTY2VuYXJpbyBkZWNvcmF0b3IKKwkJaW50IGNvdW50ID0gMDsKKwkJZm9yIChJdGVyYXRvciBncmFwaExhYmVsSXRlciA9IGNhbm9uaWNhbEdyYXBoLmdldEdyYXBoTGFiZWxzKCkudmFsdWVzKCkKKwkJCQkuaXRlcmF0b3IoKTsgZ3JhcGhMYWJlbEl0ZXIuaGFzTmV4dCgpOykgeworCQkJTGFiZWwgZ3JhcGhMYWJlbCA9IChMYWJlbCkgZ3JhcGhMYWJlbEl0ZXIubmV4dCgpOworCQkJaWYgKHdhc0FkZGVkQnlTY2VuYXJpb0RlY29yYXRvcihncmFwaExhYmVsKSkgeworCQkJCWNvdW50Kys7CisJCQl9CisJCX0KKwkJYXNzZXJ0VHJ1ZShjb3VudCA9PSAxKTsKKworCX0gLy8gdGVzdEluaXRpYWxpemUKKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbyNwcm9kdWNlVGl0bGUoKSA8ZW0+UHJvZHVjZSBUaXRsZTwvZW0+fScKKwkgKiBvcGVyYXRpb24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvI3Byb2R1Y2VUaXRsZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjZVRpdGxlKCkgeworCQlmaW5hbCBTY2VuYXJpbyBzY2VuYXJpbyA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgU3RyaW5nIHRpdGxlID0gc2NlbmFyaW8ucHJvZHVjZVRpdGxlKCk7CisKKwkJYXNzZXJ0VHJ1ZShzY2VuYXJpby5nZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKSAhPSBudWxsKTsKKwkJYXNzZXJ0Tm90TnVsbCh0aXRsZSk7CisJCWFzc2VydEZhbHNlKHRpdGxlLmVxdWFscygiIikpOworCX0gLy8gdGVzdFByb2R1Y2VUaXRsZQorCisJLyoqCisJICogQHBhcmFtIGdyYXBoTGFiZWwKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdyYXBoTGFiZWwgd2FzIGFkZGVkIGJ5IGEgc2NlbmFyaW8gZGVjb3JhdG9yCisJICovCisJcHJpdmF0ZSBib29sZWFuIHdhc0FkZGVkQnlTY2VuYXJpb0RlY29yYXRvcihMYWJlbCBncmFwaExhYmVsKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKKwkJaWYgKGdyYXBoTGFiZWwgaW5zdGFuY2VvZiBEeW5hbWljTGFiZWwpIHsKKwkJCUR5bmFtaWNMYWJlbCBkeW5hbWljTGFiZWwgPSAoRHluYW1pY0xhYmVsKSBncmFwaExhYmVsOworCQkJcmV0VmFsdWUgPSBkeW5hbWljTGFiZWwuZ2V0VVJJKCkgPT0gVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxLkxBQkVMX1VSSTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyB3YXNBZGRlZEJ5U2NlbmFyaW9EZWNvcmF0b3IKKworCS8qKgorCSAqIFRlc3QgdGhlIFNjZW5hcmlvIGhhcyB0aGUgcmlnaHQgdHlwZSBVUkkuCisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZVVSSSgpIHsKKwkJZmluYWwgU2NlbmFyaW8gc2NlbmFyaW8gPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoc2NlbmFyaW8uZ2V0VHlwZVVSSSgpLmVxdWFscyhTVEVNVVJJLlNDRU5BUklPX1RZUEVfVVJJKSk7CisJfSAvLyB0ZXN0R2V0VHlwZVVSSQorCisJLyoqCisJICogVGVzdCB0aGUgYWJpbGl0eSB0byBzZXJpYWxpemUgYSBzY2VuYXJpbyBhbmQgdGhlbiBkZS1zZXJpYWxpemUgaXQuCisJICovCisJLy8gcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZURlc2VyaWFsaXplU2NlbmFyaW8oKSB7CisJLy8gZmluYWwgU2NlbmFyaW8gc2NlbmFyaW8gPSBnZXRGaXh0dXJlKCk7CisJLy8gc2VyaWFsaXplRGVzZXJpYWxpemVTY2VuYXJpbyhzY2VuYXJpbywgU0NFTkFSSU9fU0VSSUFMWkFUSU9OX1RFU1RfVVJJKTsKKwkvLyB9IC8vIHRlc3RTZXJpYWxpemVEZXNlcmlhbGl6ZVNjZW5hcmlvCisJLyoqCisJICogVGVzdCB0aGUgYWJpbGl0eSB0byBzZXJpYWxpemUgYSBzY2VuYXJpbyBhbmQgdGhlbiBkZS1zZXJpYWxpemUgaXQuCisJICovCisJcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZURlc2VyaWFsaXplQ2Fub25pY2FsR3JhcGgoKSB7CisJCWZpbmFsIFNjZW5hcmlvIHNjZW5hcmlvID0gZ2V0Rml4dHVyZSgpOworCQlTVEVNVGltZSBub3cgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNURU1UaW1lKCk7CisJCWZpbmFsIEdyYXBoIGNhbm9uaWNhbEdyYXBoID0gc2NlbmFyaW8uZ2V0TW9kZWwoKS5nZXRDYW5vbmljYWxHcmFwaCgKKwkJCQlDQU5PTklDQUxfR1JBUEhfX1VSSSwgbmV3IElkZW50aWZpYWJsZUZpbHRlckltcGwoc2NlbmFyaW8uZ2V0TW9kZWwoKS5nZXREdWJsaW5Db3JlKCkuZ2V0Q292ZXJhZ2UoKSksIG5vdyk7CisJCXRyeSB7CisJCQlVdGlsaXR5LnNlcmlhbGl6ZUlkZW50aWZpYWJsZShjYW5vbmljYWxHcmFwaCwKKwkJCQkJQ0FOT05JQ0FMX0dSQVBIX1NFUklBTFpBVElPTl9URVNUX1VSSSk7CisKKwkJCWZpbmFsIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOworCQkJZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZSgKKwkJCQkJQ0FOT05JQ0FMX0dSQVBIX1NFUklBTFpBVElPTl9URVNUX1VSSSwgdHJ1ZSk7CisKKwkJCXJlc291cmNlLmxvYWQobnVsbCk7CisJCQlmaW5hbCBHcmFwaCBkZXNlcmlhbGl6ZWRHcmFwaCA9IChHcmFwaCkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoCisJCQkJCTApOworCQkJYXNzZXJ0Tm90TnVsbChkZXNlcmlhbGl6ZWRHcmFwaCk7CisJCQlhc3NlcnRUcnVlKGNhbm9uaWNhbEdyYXBoLmdldE51bUVkZ2VzKCkgPT0gZGVzZXJpYWxpemVkR3JhcGgKKwkJCQkJLmdldE51bUVkZ2VzKCkpOworCQkJYXNzZXJ0VHJ1ZShjYW5vbmljYWxHcmFwaC5nZXROdW1Ob2RlcygpID09IGRlc2VyaWFsaXplZEdyYXBoCisJCQkJCS5nZXROdW1Ob2RlcygpKTsKKwkJCWFzc2VydFRydWUoY2Fub25pY2FsR3JhcGguZ2V0TnVtRHluYW1pY0xhYmVscygpID09IGRlc2VyaWFsaXplZEdyYXBoCisJCQkJCS5nZXROdW1EeW5hbWljTGFiZWxzKCkpOworCQkJYXNzZXJ0VHJ1ZShjYW5vbmljYWxHcmFwaC5nZXROdW1HcmFwaExhYmVscygpID09IGRlc2VyaWFsaXplZEdyYXBoCisJCQkJCS5nZXROdW1HcmFwaExhYmVscygpKTsKKwkJCWFzc2VydFRydWUoY2Fub25pY2FsR3JhcGguZ2V0TnVtTm9kZUxhYmVscygpID09IGRlc2VyaWFsaXplZEdyYXBoCisJCQkJCS5nZXROdW1Ob2RlTGFiZWxzKCkpOworCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOworCQl9IC8vIGNhdGNoCisJCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKwkJCW5wZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCWZhaWwobnBlLmdldE1lc3NhZ2UoKSk7CisJCX0gLy8gbnVsbCBwb2ludGVyIGV4Y2VwdGlvbgorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOworCQl9IGZpbmFsbHkgeworCQkJLy8gUmVtb3ZlIHRoZSBzZXJpYWxpemVkIGZpbGUKKwkJCS8vIElGaWxlIHNlcmFsaXplRmlsZSA9CisJCX0KKwl9IC8vIHRlc3RTZXJpYWxpemVEZXNlcmlhbGl6ZUNhbm9uaWNhbEdyYXBoCisKKwkvKioKKwkgKiBUZXN0IHRoZSBwcm9jZXNzIG9mIHNlcmlhbGl6aW5nIGFuZCBkZS1zZXJpYWxpemluZyBhIHNjZW5hcmlvCisJICogCisJICogQHBhcmFtIHNjZW5hcmlvCisJICogICAgICAgICAgICB0aGUgc2NlbmFyaW8gdG8gdGVzdAorCSAqIEBwYXJhbSB1cmkKKwkgKiAgICAgICAgICAgIHdoZXJlIHRvIGRvIHRoZSB0ZXN0CisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZURlc2VyaWFsaXplU2NlbmFyaW8oZmluYWwgU2NlbmFyaW8gc2NlbmFyaW8sCisJCQlmaW5hbCBVUkkgdXJpKSB7CisJCXRyeSB7CisJCQlVdGlsaXR5LnNlcmlhbGl6ZUlkZW50aWZpYWJsZShzY2VuYXJpbywgdXJpKTsKKworCQkJZmluYWwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7CisJCQlmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7CisKKwkJCXJlc291cmNlLmxvYWQobnVsbCk7CisJCQlmaW5hbCBTY2VuYXJpbyBkZXNlcmlhbGl6ZWRTY2VuYXJpbyA9IChTY2VuYXJpbykgcmVzb3VyY2UKKwkJCQkJLmdldENvbnRlbnRzKCkuZ2V0KDApOworCQkJYXNzZXJ0Tm90TnVsbChkZXNlcmlhbGl6ZWRTY2VuYXJpbyk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOworCQl9IC8vIGNhdGNoCisJCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKwkJCWZhaWwobnBlLmdldE1lc3NhZ2UoKSk7CisJCX0gLy8gbnVsbCBwb2ludGVyIGV4Y2VwdGlvbgorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOworCQl9CisJfSAvLyBzZXJpYWxpemVEZXNlcmlhbGl6ZVNjZW5hcmlvCisKKwkvKioKKwkgKiBAcmV0dXJuIGEgPGNvZGU+U2VxdWVuY2VyPC9jb2RlPiBmb3IgdGVzdGluZy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTZXF1ZW5jZXIgZ2V0VGVzdFNlcXVlbmNlcigpIHsKKwkJZmluYWwgU2VxdWVuY2VyIHJldFZhbHVlID0gbmV3IFNlcXVlbmNlckltcGwoKSB7IAorCisJCQlwcm90ZWN0ZWQgbG9uZyB0aW1lSW5jcmVtZW50ID0gU1RFTVRpbWUuVW5pdHMuREFZLmdldE1pbGxpc2Vjb25kcygpOworCisJCQkvKioKKwkJCSAqIFRoaXMgaXMgYW4gYWNjdW11bGF0b3Igb2YgdGhlIHdvcmsgaW5jcmVtZW50IHRoYXQga2VlcHMgYWNjb3VudCBvZiAKKwkJCSAqIHRoZSBmcmFjdGlvbiBvZiB0aGUgd29yayBpbmNyZW1lbnRzIHVudGlsIHRoZXkgZXhjZWVkIDEuMAorCQkJICovCisJCQlwcml2YXRlIGRvdWJsZSB3b3JrSW5jcmVtZW50UnVubmluZ1RvdGFsID0gMC4wOworCisKKwkJCXB1YmxpYyBsb25nIGdldFRpbWVJbmNyZW1lbnQoKSB7CisJCQkJcmV0dXJuIHRpbWVJbmNyZW1lbnQ7CisJCQl9CisJCQkKKwkJCS8qKgorCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uaW1wbC5TZXF1ZW5jZXJJbXBsI2dldE5leHRUaW1lKCkKKwkJCSAqLworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU1RFTVRpbWUgZ2V0TmV4dFRpbWUoKSB7CisJCQkJc2V0Q3VycmVudFRpbWUoZ2V0Q3VycmVudFRpbWUoKS5hZGRJbmNyZW1lbnQoZ2V0VGltZUluY3JlbWVudCgpKSk7CisJCQkJc2V0V29ya0NvbXBsZXRlKE1hdGgubWluKGdldFdvcmtDb21wbGV0ZSgpICsgZ2V0V29ya0luY3JlbWVudCgpLCAxMDApKTsKKwkJCQlyZXR1cm4gZ2V0Q3VycmVudFRpbWUoKTsKKwkJCX0KKworCQkJLyoqCisJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5pbXBsLlNlcXVlbmNlckltcGwjZ2V0VGltZURlbHRhKCkKKwkJCSAqLworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgbG9uZyBnZXRUaW1lRGVsdGEoKSB7CisJCQkJcmV0dXJuIHN1cGVyLmdldFRpbWVEZWx0YSgpOworCQkJfQorCisJCQkvKioKKwkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLmltcGwuU2VxdWVuY2VySW1wbCNnZXRXb3JrSW5jcmVtZW50KCkKKwkJCSAqLworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgaW50IGdldFdvcmtJbmNyZW1lbnQoKSB7CisJCQkJaW50IHJldFZhbHVlID0gMDsKKwkJCQkvLyBJcyB0aGVyZSBhIHdvcmsgaW5jcmVtZW50PworCQkJCWlmIChnZXREdXJhdGlvbigpICE9IFVOS05PV05fRFVSQVRJT04pIHsKKwkJCQkJLy8gWWVzCisJCQkJCS8vIFRoZSB3b3JrIGluY3JlbWVudCBjb3VsZCBiZSBmcmFjdGlvbmFsICg8MS4wKS4gSWYgc28gdGhlbiBpdCB3aWxsCisJCQkJCS8vIG5vdCBhY2N1bXVsYXRlIGluIHRoZSBwcm9ncmVzcyBtb25pdG9yLiBTbywgd2Uga2VlcCBhIHJ1bm5pbmcgc3VtCisJCQkJCS8vIG9mIHRoZSB3b3JrIGluY3JlbWVudCBhbmQgd2hlbiBpdCBleGNlZWRzIDEuMCB3ZSByZXR1cm4gdGhlIHZhbHVlIGxlc3MKKwkJCQkJLy8gdGhlIGZyYWN0aW9uYWwgcGFydCBhbmQga2VlcCB0aGF0IGZvciB0aGUgZnV0dXJlLgorCQkJCQl3b3JrSW5jcmVtZW50UnVubmluZ1RvdGFsICs9IDEwMC4wICogZ2V0VGltZUluY3JlbWVudCgpCisJCQkJCQkJLyBnZXREdXJhdGlvbigpOworCQkJCQkKKwkJCQkJLy8gRG8gd2UgaGF2ZSBtb3JlIHRoYW4gMS4wPworCQkJCQlpZiAod29ya0luY3JlbWVudFJ1bm5pbmdUb3RhbCA+PSAxLjApIHsKKwkJCQkJCS8vIFllcworCQkJCQkJLy8kQU5BTFlTSVMtSUdOT1JFCisJCQkJCQlyZXRWYWx1ZSA9IChpbnQpd29ya0luY3JlbWVudFJ1bm5pbmdUb3RhbDsKKwkJCQkJCXdvcmtJbmNyZW1lbnRSdW5uaW5nVG90YWwgLT0gcmV0VmFsdWU7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4gcmV0VmFsdWU7CisJCQl9CisKKwkJCS8qKgorCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uaW1wbC5TZXF1ZW5jZXJJbXBsI2lzVGltZVRvU3RvcCgpCisJCQkgKi8KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gaXNUaW1lVG9TdG9wKCkgeworCQkJCWJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQkvLyBJcyB0aGVyZSBhbiBlbmQgdGltZT8KKwkJCQlpZiAoZ2V0RW5kVGltZSgpICE9IG51bGwpIHsKKwkJCQkJLy8gWWVzCisJCQkJCXJldFZhbHVlID0gZ2V0Q3VycmVudFRpbWUoKS5nZXRUaW1lKCkuYWZ0ZXIoZ2V0RW5kVGltZSgpLmdldFRpbWUoKSk7CisJCQkJfQorCQkJCXJldHVybiByZXRWYWx1ZTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgaW50IGdldEN5Y2xlKCkgeworCQkJCXJldHVybiAwOworCQkJfQorCisJCQkKKwkJfTsKKwkJcmV0VmFsdWUuc2V0U3RhcnRUaW1lKGNyZWF0ZVNURU1UaW1lKDIwMDAsIDAxLCAwMSkpOworCQlyZXRWYWx1ZS5nZXRDdXJyZW50VGltZSgpOworCQlyZXRWYWx1ZS5zZXRFbmRUaW1lKGNyZWF0ZVNURU1UaW1lKDIwMDAsIDAxLCAxMCkpOworCQlyZXRWYWx1ZS5zZXRVUkkoU0VRVUVOQ0VSX1VSSSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldFRlc3RTZXF1ZW5jZXIKKwkKKwkvKioKKwkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgU1RFTVRpbWUKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZQorCSAqLworCXByaXZhdGUgc3RhdGljIFNURU1UaW1lIGNyZWF0ZVNURU1UaW1lKGZpbmFsIGludCB5ZWFyLCBmaW5hbCBpbnQgbW9udGgsCisJCQlmaW5hbCBpbnQgZGF5KSB7CisJCWZpbmFsIFNURU1UaW1lIHJldFZhbHVlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTVEVNVGltZSgpOworCisJCWZpbmFsIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwkJY2FsZW5kYXIuc2V0KHllYXIsIG1vbnRoLCBkYXkpOworCQlyZXRWYWx1ZS5zZXRUaW1lKGNhbGVuZGFyLmdldFRpbWUoKSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZVNURU1UaW1lCisKK30gLy8gU2NlbmFyaW9UZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby90ZXN0cy9TY2VuYXJpb1Rlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby90ZXN0cy9TY2VuYXJpb1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyZDk3OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvL3Rlc3RzL1NjZW5hcmlvVGVzdHMuamF2YQpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3Qgc3VpdGUgZm9yIHRoZSAnPGVtPjxiPnNjZW5hcmlvPC9iPjwvZW0+JyBwYWNrYWdlLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTY2VuYXJpb1Rlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFNjZW5hcmlvVGVzdHMoInNjZW5hcmlvIFRlc3RzIik7IC8vJE5PTi1OTFMtMSQKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFNjZW5hcmlvVGVzdC5jbGFzcyk7CisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU2NlbmFyaW9UZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKK30gLy9TY2VuYXJpb1Rlc3RzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvdGVzdHMvUmVhbFRpbWVTZXF1ZW5jZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvdGVzdHMvUmVhbFRpbWVTZXF1ZW5jZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JlYjAyOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci90ZXN0cy9SZWFsVGltZVNlcXVlbmNlclRlc3QuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5SZWFsVGltZVNlcXVlbmNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlckZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZWFsIFRpbWUgU2VxdWVuY2VyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBSZWFsVGltZVNlcXVlbmNlclRlc3QgZXh0ZW5kcyBTZXF1ZW50aWFsU2VxdWVuY2VyVGVzdCB7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBSRUFMX1RJTUVfVElNRV9JTkNSRU1FTlQgPSBTVEVNVGltZS5Vbml0cy5TRUNPTkQuZ2V0TWlsbGlzZWNvbmRzKCk7CisKKwkvLyBTZXF1ZW5jZXIgVVJJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIFNFUVVFTkNFUl9VUkkgPSBVUkkuY3JlYXRlVVJJKCJwbGF0Zm9ybTovcGx1Z2luLyIKKwkJCSsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRlc3RzLkFjdGl2YXRvci5QTFVHSU5fSUQKKwkJCSsgIi9kYXRhL3NlcXVlbmNlcnMvYmFzaWMvdGVzdFJlYWxUaW1lU2VxdWVuY2VyMS5zZXF1ZW5jZXIiKTsKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihSZWFsVGltZVNlcXVlbmNlclRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgUmVhbCBUaW1lIFNlcXVlbmNlciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlYWxUaW1lU2VxdWVuY2VyVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFJlYWwgVGltZSBTZXF1ZW5jZXIgdGVzdCBjYXNlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUmVhbFRpbWVTZXF1ZW5jZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChSZWFsVGltZVNlcXVlbmNlcilmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLnRlc3RzLlNlcXVlbnRpYWxTZXF1ZW5jZXJUZXN0I3Rlc3RHZXRXb3JrQ29tcGxldGUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRlc3RHZXRXb3JrQ29tcGxldGUoKSB7CisJCS8vIGZpbmFsIFJlYWxUaW1lU2VxdWVuY2VyIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUodHJ1ZSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLnRlc3RzLlNlcXVlbnRpYWxTZXF1ZW5jZXJUZXN0I3Rlc3RHZXRXb3JrSW5jcmVtZW50KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0V29ya0luY3JlbWVudCgpIHsKKwkJLy8gZmluYWwgUmVhbFRpbWVTZXF1ZW5jZXIgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIudGVzdHMuU2VxdWVudGlhbFNlcXVlbmNlclRlc3QjdGVzdEdldER1cmF0aW9uKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0RHVyYXRpb24oKSB7CisJCS8vIGZpbmFsIFJlYWxUaW1lU2VxdWVuY2VyIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUodHJ1ZSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLnRlc3RzLlNlcXVlbnRpYWxTZXF1ZW5jZXJUZXN0I3Rlc3RHZXROZXh0VGltZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdGVzdEdldE5leHRUaW1lKCkgeworCQkvLyBUaGlzIGlzIGEgYml0IGhhcmQgdG8gdGVzdCBnaXZlbiB0aGF0IHRoZSB2YWx1ZSByZXR1cm5lZCBieSAKKwkJLy8gZ2V0TmV4dFRpbWUoKSBjYW4gdmFyeS4KKy8vCQkgZmluYWwgUmVhbFRpbWVTZXF1ZW5jZXIgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKy8vCQkgZmluYWwgU1RFTVRpbWUgbmV4dFRpbWUgPSBmaXh0dXJlLmdldE5leHRUaW1lKCk7CisJCWFzc2VydFRydWUodHJ1ZSk7CisJfSAvLyB0ZXN0R2V0TmV4dFRpbWUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci50ZXN0cy5TZXF1ZW50aWFsU2VxdWVuY2VyVGVzdCN0ZXN0SXNUaW1lVG9TdG9wKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0ZXN0SXNUaW1lVG9TdG9wKCkgeworCQkvLyBmaW5hbCBSZWFsVGltZVNlcXVlbmNlciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKHRydWUpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci50ZXN0cy5TZXF1ZW50aWFsU2VxdWVuY2VyVGVzdCN0ZXN0UmVzZXQoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRlc3RSZXNldCgpIHsKKwkJLy8gZmluYWwgUmVhbFRpbWVTZXF1ZW5jZXIgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwl9IC8vIHRlc3RSZXNldAorCisJLyoqCisJICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUmVhbFRpbWVTZXF1ZW5jZXJ9IGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVhbFRpbWVTZXF1ZW5jZXIgY3JlYXRlRml4dHVyZSgpIHsKKwkJZmluYWwgUmVhbFRpbWVTZXF1ZW5jZXIgcmV0VmFsdWUgPSBTZXF1ZW5jZXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZWFsVGltZVNlcXVlbmNlcigpOworCQkKKwkJcmV0VmFsdWUuc2V0VGltZUluY3JlbWVudChSRUFMX1RJTUVfVElNRV9JTkNSRU1FTlQpOworCQlyZXRWYWx1ZS5zZXRVUkkoU0VRVUVOQ0VSX1VSSSk7CisJCQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKKworfSAvLyBSZWFsVGltZVNlcXVlbmNlclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci90ZXN0cy9TZXF1ZW5jZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvdGVzdHMvU2VxdWVuY2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZTBkOTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvdGVzdHMvU2VxdWVuY2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi50ZXN0cy5JZGVudGlmaWFibGVUZXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VxdWVuY2VyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSB0ZXN0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXIjZ2V0TmV4dFRpbWUoKSA8ZW0+TmV4dCBUaW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlciNpc1RpbWVUb1N0b3AoKSA8ZW0+VGltZSBUbyBTdG9wPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlciNnZXRXb3JrSW5jcmVtZW50KCkgPGVtPldvcmsgSW5jcmVtZW50PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBhcmUgdGVzdGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyI3Jlc2V0KCkgPGVtPlJlc2V0PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXF1ZW5jZXJUZXN0IGV4dGVuZHMgSWRlbnRpZmlhYmxlVGVzdCB7CisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBTZXF1ZW5jZXIgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNlcXVlbmNlclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTZXF1ZW5jZXIgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTZXF1ZW5jZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChTZXF1ZW5jZXIpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlciNnZXROZXh0VGltZSgpIDxlbT5OZXh0IFRpbWU8L2VtPn0nIGZlYXR1cmUgZ2V0dGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlciNnZXROZXh0VGltZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TmV4dFRpbWUoKSB7CisJCWZhaWwoKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlciNpc1RpbWVUb1N0b3AoKSA8ZW0+VGltZSBUbyBTdG9wPC9lbT59JyBmZWF0dXJlIGdldHRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXIjaXNUaW1lVG9TdG9wKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RJc1RpbWVUb1N0b3AoKSB7CisJCWZhaWwoKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlciNnZXRXb3JrSW5jcmVtZW50KCkgPGVtPldvcmsgSW5jcmVtZW50PC9lbT59JyBmZWF0dXJlIGdldHRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXIjZ2V0V29ya0luY3JlbWVudCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0V29ya0luY3JlbWVudCgpIHsKKwkJZmFpbCgpOworCX0KKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyI3Jlc2V0KCkgPGVtPlJlc2V0PC9lbT59JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyI3Jlc2V0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgdGVzdFJlc2V0KCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBvcGVyYXRpb24gdGVzdCBtZXRob2QKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJZmFpbCgpOworCX0KKworfSAvL1NlcXVlbmNlclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci90ZXN0cy9TZXF1ZW5jZXJUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL3Rlc3RzL1NlcXVlbmNlclRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRhNGRjMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci90ZXN0cy9TZXF1ZW5jZXJUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+c2VxdWVuY2VyPC9iPjwvZW0+JyBwYWNrYWdlLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTZXF1ZW5jZXJUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBTZXF1ZW5jZXJUZXN0cygic2VxdWVuY2VyIFRlc3RzIik7IC8vJE5PTi1OTFMtMSQKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWxUaW1lU2VxdWVuY2VyVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShTZXF1ZW50aWFsU2VxdWVuY2VyVGVzdC5jbGFzcyk7CisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU2VxdWVuY2VyVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCit9IC8vU2VxdWVuY2VyVGVzdHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci90ZXN0cy9TZXF1ZW50aWFsU2VxdWVuY2VyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL3Rlc3RzL1NlcXVlbnRpYWxTZXF1ZW5jZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM4OTIxMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci90ZXN0cy9TZXF1ZW50aWFsU2VxdWVuY2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjcwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW50aWFsU2VxdWVuY2VyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VxdWVudGlhbCBTZXF1ZW5jZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxTZXF1ZW5jZXJUZXN0IGV4dGVuZHMgU2VxdWVuY2VyVGVzdCB7CisKKwlwdWJsaWMgc3RhdGljIFVSSSBTRVFVRU5DRVJfV0lUSF9FTkRfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoInNlcXVlbmNlci9zZXF1ZW50aWFsU2VxdWVuY2VyV2l0aEVuZFRlc3Quc2VxdWVuY2VyIik7CisJcHVibGljIHN0YXRpYyBVUkkgU0VRVUVOQ0VSX1dJVEhfTk9fRU5EX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKCJzZXF1ZW5jZXIvc2VxdWVudGlhbFNlcXVlbmNlcldpdGhOb0VuZFRlc3Quc2VxdWVuY2VyIik7CisJCisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0RBWSA9IDIwOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkRfREFZID0gMjk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTUJFUl9PRl9EQVlTID0gIEVORF9EQVkgLSBTVEFSVF9EQVkgKyAxOworCQorCS8vIFRoZSBmaXh0dXJlIHNlcXVlbmNlciBzZXF1ZW5jZXMgdGhyb3VnaCAxMCBkYXlzCisJcHVibGljIHN0YXRpYyBmaW5hbCBTVEVNVGltZSBTVEFSVF9USU1FID0gY3JlYXRlU1RFTVRpbWUoMjAwNiwKKwkJCUNhbGVuZGFyLk5PVkVNQkVSLCBTVEFSVF9EQVkpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTVEVNVGltZSBFTkRfVElNRSA9IGNyZWF0ZVNURU1UaW1lKDIwMDYsCisJCQlDYWxlbmRhci5OT1ZFTUJFUiwgRU5EX0RBWSk7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVElNRV9JTkNSRU1FTlQgPSBTVEVNVGltZS5Vbml0cy5EQVkuZ2V0TWlsbGlzZWNvbmRzKCk7CisJCisKKwkKKwkKKwkKKwlwcm90ZWN0ZWQgU2VxdWVudGlhbFNlcXVlbmNlciBzZXF1ZW5jZXJXaXRoTm9FbmRUaW1lID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFNlcXVlbnRpYWxTZXF1ZW5jZXJUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFNlcXVlbnRpYWwgU2VxdWVuY2VyIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU2VxdWVudGlhbFNlcXVlbmNlclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTZXF1ZW50aWFsIFNlcXVlbmNlciB0ZXN0IGNhc2UuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKFNlcXVlbnRpYWxTZXF1ZW5jZXIgZml4dHVyZSkgeworCQlzdXBlci5zZXRGaXh0dXJlKGZpeHR1cmUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU2VxdWVudGlhbCBTZXF1ZW5jZXIgdGVzdCBjYXNlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIFNlcXVlbnRpYWxTZXF1ZW5jZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChTZXF1ZW50aWFsU2VxdWVuY2VyKSBzdXBlci5maXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKworCQlzZXF1ZW5jZXJXaXRoTm9FbmRUaW1lID0gU2VxdWVuY2VyRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlU2VxdWVudGlhbFNlcXVlbmNlcigpOworCQlzZXF1ZW5jZXJXaXRoTm9FbmRUaW1lLnNldFN0YXJ0VGltZSgoU1RFTVRpbWUpIEVjb3JlVXRpbAorCQkJCS5jb3B5KFNUQVJUX1RJTUUpKTsKKwkJc2VxdWVuY2VyV2l0aE5vRW5kVGltZS5zZXRDdXJyZW50VGltZSgoU1RFTVRpbWUpIEVjb3JlVXRpbAorCQkJCS5jb3B5KFNUQVJUX1RJTUUpKTsKKwkJc2VxdWVuY2VyV2l0aE5vRW5kVGltZS5zZXRUaW1lSW5jcmVtZW50KFRJTUVfSU5DUkVNRU5UKTsKKwkJCisJCXNlcXVlbmNlcldpdGhOb0VuZFRpbWUuc2V0VVJJKFNFUVVFTkNFUl9XSVRIX05PX0VORF9VUkkpOworCX0gLy8gc2V0VXAKKworCS8qKgorCSAqIEByZXR1cm4gYSBzZXF1ZW50aWFsIHNlcXVlbmNlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgU2VxdWVudGlhbFNlcXVlbmNlciBjcmVhdGVGaXh0dXJlKCkgeworCQlmaW5hbCBTZXF1ZW50aWFsU2VxdWVuY2VyIHNlcXVlbmNlcldpdGhFbmQgPSBTZXF1ZW5jZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVTZXF1ZW50aWFsU2VxdWVuY2VyKCk7CisJCXNlcXVlbmNlcldpdGhFbmQuc2V0U3RhcnRUaW1lKChTVEVNVGltZSkgRWNvcmVVdGlsLmNvcHkoU1RBUlRfVElNRSkpOworCQlzZXF1ZW5jZXJXaXRoRW5kLnNldEN1cnJlbnRUaW1lKChTVEVNVGltZSkgRWNvcmVVdGlsLmNvcHkoU1RBUlRfVElNRSkpOworCQlzZXF1ZW5jZXJXaXRoRW5kLnNldEVuZFRpbWUoKFNURU1UaW1lKSBFY29yZVV0aWwuY29weShFTkRfVElNRSkpOworCQlzZXF1ZW5jZXJXaXRoRW5kLnNldFRpbWVJbmNyZW1lbnQoVElNRV9JTkNSRU1FTlQpOworCQlzZXF1ZW5jZXJXaXRoRW5kLnNldFVSSShTRVFVRU5DRVJfV0lUSF9FTkRfVVJJKTsKKwkJCisJCXJldHVybiBzZXF1ZW5jZXJXaXRoRW5kOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwkJc2VxdWVuY2VyV2l0aE5vRW5kVGltZSA9IG51bGw7CisJfSAvLyB0ZWFyRG93bgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8udGVzdHMuU2VxdWVuY2VyVGVzdCN0ZXN0R2V0TmV4dFRpbWUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRlc3RHZXROZXh0VGltZSgpIHsKKworCQlmaW5hbCBTVEVNVGltZSBuZXh0VGltZSA9IFNUQVJUX1RJTUUuYWRkSW5jcmVtZW50KFRJTUVfSU5DUkVNRU5UKTsKKworCQlmaW5hbCBTZXF1ZW50aWFsU2VxdWVuY2VyIHNlcVdpdGhFbmRUaW1lID0gZ2V0Rml4dHVyZSgpOworCQkvLyBUaGUgZmlyc3QgdGltZSBzaG91bGQgYmUgdGhlIHN0YXJ0IHRpbWUKKwkJYXNzZXJ0VHJ1ZShzZXFXaXRoRW5kVGltZS5nZXROZXh0VGltZSgpLmVxdWFscyhTVEFSVF9USU1FKSk7CisJCQorCQlhc3NlcnRUcnVlKHNlcVdpdGhFbmRUaW1lLmdldE5leHRUaW1lKCkuZXF1YWxzKG5leHRUaW1lKSk7CisJCWFzc2VydEZhbHNlKHNlcVdpdGhFbmRUaW1lLmdldE5leHRUaW1lKCkuZXF1YWxzKG5leHRUaW1lKSk7CisKKwkJZmluYWwgU2VxdWVudGlhbFNlcXVlbmNlciBzZXFXaXRoTm9FbmRUaW1lID0gc2VxdWVuY2VyV2l0aE5vRW5kVGltZTsKKwkJYXNzZXJ0VHJ1ZShzZXFXaXRoTm9FbmRUaW1lLmdldE5leHRUaW1lKCkuZXF1YWxzKCBTVEFSVF9USU1FKSk7CisJCWFzc2VydFRydWUoc2VxV2l0aE5vRW5kVGltZS5nZXROZXh0VGltZSgpLmVxdWFscyhuZXh0VGltZSkpOworCQlhc3NlcnRGYWxzZShzZXFXaXRoTm9FbmRUaW1lLmdldE5leHRUaW1lKCkuZXF1YWxzKG5leHRUaW1lKSk7CisJfSAvLyB0ZXN0R2V0TmV4dFRpbWUKKworCS8qKgorCSAqIFRlc3QgdGhhdCB0aGUgZHVyYXRpb24gaXMgY29tcHV0ZWQgY29ycmVjdGx5CisJICovCisJcHVibGljIHZvaWQgdGVzdEdldER1cmF0aW9uKCkgeworCQlmaW5hbCBTZXF1ZW50aWFsU2VxdWVuY2VyIHNlcVdpdGhFbmRUaW1lID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKHNlcVdpdGhFbmRUaW1lLmdldER1cmF0aW9uKCkgPT0gRU5EX1RJTUUuZ2V0VGltZSgpLmdldFRpbWUoKQorCQkJCS0gU1RBUlRfVElNRS5nZXRUaW1lKCkuZ2V0VGltZSgpKTsKKworCQlmaW5hbCBTZXF1ZW50aWFsU2VxdWVuY2VyIHNlcVdpdGhOb0VuZFRpbWUgPSBzZXF1ZW5jZXJXaXRoTm9FbmRUaW1lOworCQlhc3NlcnRUcnVlKHNlcVdpdGhOb0VuZFRpbWUuZ2V0RHVyYXRpb24oKSA9PSBTZXF1ZW5jZXIuVU5LTk9XTl9EVVJBVElPTik7CisJfSAvLyB0ZXN0R2V0RHVyYXRpb24KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLnRlc3RzLlNlcXVlbmNlclRlc3QjdGVzdEdldFdvcmtJbmNyZW1lbnQoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRlc3RHZXRXb3JrSW5jcmVtZW50KCkgeworCQlmaW5hbCBTZXF1ZW50aWFsU2VxdWVuY2VyIHNlcVdpdGhFbmRUaW1lID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKHNlcVdpdGhFbmRUaW1lLmdldFdvcmtJbmNyZW1lbnQoKSA9PSAxMCk7CisKKwkJZmluYWwgU2VxdWVudGlhbFNlcXVlbmNlciBzZXFXaXRoTm9FbmRUaW1lID0gc2VxdWVuY2VyV2l0aE5vRW5kVGltZTsKKwkJYXNzZXJ0VHJ1ZShzZXFXaXRoTm9FbmRUaW1lLmdldFdvcmtJbmNyZW1lbnQoKSA9PSAwKTsKKwl9IC8vIHRlc3RHZXRXb3JrSW5jcmVtZW50CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby50ZXN0cy5TZXF1ZW5jZXJUZXN0I3Rlc3RJc1RpbWVUb1N0b3AoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRlc3RJc1RpbWVUb1N0b3AoKSB7CisJCWZpbmFsIFNlcXVlbnRpYWxTZXF1ZW5jZXIgc2VxV2l0aEVuZFRpbWUgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydE5vdE51bGwoc2VxV2l0aEVuZFRpbWUuZ2V0RW5kVGltZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc2VxV2l0aEVuZFRpbWUuaXNUaW1lVG9TdG9wKCkpOworCQlmb3IgKGludCBpID0gMDsgaSA8IE5VTUJFUl9PRl9EQVlTOyBpKyspIHsKKwkJCWFzc2VydEZhbHNlKHNlcVdpdGhFbmRUaW1lLmlzVGltZVRvU3RvcCgpKTsKKwkJCXNlcVdpdGhFbmRUaW1lLmdldE5leHRUaW1lKCk7CisJCX0KKwkJYXNzZXJ0VHJ1ZShzZXFXaXRoRW5kVGltZS5pc1RpbWVUb1N0b3AoKSk7CisKKwkJZmluYWwgU2VxdWVudGlhbFNlcXVlbmNlciBzZXFXaXRoTm9FbmRUaW1lID0gc2VxdWVuY2VyV2l0aE5vRW5kVGltZTsKKwkJYXNzZXJ0RmFsc2Uoc2VxV2l0aE5vRW5kVGltZS5pc1RpbWVUb1N0b3AoKSk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQkJc2VxV2l0aE5vRW5kVGltZS5nZXROZXh0VGltZSgpOworCQkJYXNzZXJ0RmFsc2Uoc2VxV2l0aE5vRW5kVGltZS5pc1RpbWVUb1N0b3AoKSk7CisJCX0KKwkJc2VxV2l0aE5vRW5kVGltZS5nZXROZXh0VGltZSgpOworCQlhc3NlcnRGYWxzZShzZXFXaXRoTm9FbmRUaW1lLmlzVGltZVRvU3RvcCgpKTsKKwl9IC8vIHRlc3RJc1RpbWVUb1N0b3AKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRlc3RzLlNlcXVlbmNlclRlc3QjdGVzdEdldFdvcmtDb21wbGV0ZSgpCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldFdvcmtDb21wbGV0ZSgpIHsKKwkJZmluYWwgU2VxdWVudGlhbFNlcXVlbmNlciBzZXFXaXRoRW5kVGltZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0RmFsc2Uoc2VxV2l0aEVuZFRpbWUuaXNUaW1lVG9TdG9wKCkpOworCQlmb3IgKGludCBpID0gMDsgaSA8IE5VTUJFUl9PRl9EQVlTOyBpKyspIHsKKwkJCXNlcVdpdGhFbmRUaW1lLmdldE5leHRUaW1lKCk7CisJCQlhc3NlcnRUcnVlKHNlcVdpdGhFbmRUaW1lLmdldFdvcmtDb21wbGV0ZSgpID09IChpKzEpICogTlVNQkVSX09GX0RBWVMpOworCQl9CisJCWFzc2VydFRydWUoc2VxV2l0aEVuZFRpbWUuZ2V0V29ya0NvbXBsZXRlKCkgPT0gMTAwKTsKKworCQlmaW5hbCBTZXF1ZW50aWFsU2VxdWVuY2VyIHNlcVdpdGhOb0VuZFRpbWUgPSBzZXF1ZW5jZXJXaXRoTm9FbmRUaW1lOworCQlhc3NlcnRGYWxzZShzZXFXaXRoTm9FbmRUaW1lLmlzVGltZVRvU3RvcCgpKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1CRVJfT0ZfREFZUzsgaSsrKSB7CisJCQlzZXFXaXRoTm9FbmRUaW1lLmdldE5leHRUaW1lKCk7CisJCQlhc3NlcnRUcnVlKHNlcVdpdGhOb0VuZFRpbWUuZ2V0V29ya0NvbXBsZXRlKCkgPT0gMCk7CisJCX0KKwkJc2VxV2l0aE5vRW5kVGltZS5nZXROZXh0VGltZSgpOworCQlhc3NlcnRUcnVlKHNlcVdpdGhOb0VuZFRpbWUuZ2V0V29ya0NvbXBsZXRlKCkgPT0gMCk7CisJfSAvLyB0ZXN0R2V0V29ya0NvbXBsZXRlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIudGVzdHMuU2VxdWVuY2VyVGVzdCN0ZXN0UmVzZXQoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRlc3RSZXNldCgpIHsKKwkJZmluYWwgU2VxdWVudGlhbFNlcXVlbmNlciBzZXFXaXRoRW5kVGltZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShzZXFXaXRoRW5kVGltZS5nZXRTdGFydFRpbWUoKS5lcXVhbHMoCisJCQkJc2VxV2l0aEVuZFRpbWUuZ2V0Q3VycmVudFRpbWUoKSkpOworCQlmaW5hbCBTVEVNVGltZSB0aW1lMSA9IHNlcVdpdGhFbmRUaW1lLmdldE5leHRUaW1lKCk7CisJCWFzc2VydFRydWUoc2VxV2l0aEVuZFRpbWUuZ2V0U3RhcnRUaW1lKCkuZXF1YWxzKAorCQkJCXNlcVdpdGhFbmRUaW1lLmdldEN1cnJlbnRUaW1lKCkpKTsKKwkJc2VxV2l0aEVuZFRpbWUucmVzZXQoKTsKKwkJYXNzZXJ0VHJ1ZShzZXFXaXRoRW5kVGltZS5nZXRTdGFydFRpbWUoKS5lcXVhbHMoCisJCQkJc2VxV2l0aEVuZFRpbWUuZ2V0Q3VycmVudFRpbWUoKSkpOworCX0gLy8gdGVzdFJlc2V0CisKKwkvKioKKwkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgU1RFTVRpbWUKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZQorCSAqLworCXByaXZhdGUgc3RhdGljIFNURU1UaW1lIGNyZWF0ZVNURU1UaW1lKGZpbmFsIGludCB5ZWFyLCBmaW5hbCBpbnQgbW9udGgsCisJCQlmaW5hbCBpbnQgZGF5KSB7CisJCWZpbmFsIFNURU1UaW1lIHJldFZhbHVlID0gZ2V0Q3VycmVudFN5c3RlbVRpbWUoKTsKKworCQlmaW5hbCBDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisJCWNhbGVuZGFyLnNldCh5ZWFyLCBtb250aCwgZGF5KTsKKwkJcmV0VmFsdWUuc2V0VGltZShjYWxlbmRhci5nZXRUaW1lKCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVTVEVNVGltZQorCisJLyoqCisJICogQHJldHVybiB0aGUgY3VycmVudCByZWFsIHdhbGwgY2xvY2sgdGltZSBhcyByZXR1cm5lZCBieSB0aGUgc3lzdGVtLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgU1RFTVRpbWUgZ2V0Q3VycmVudFN5c3RlbVRpbWUoKSB7CisJCXJldHVybiBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNURU1UaW1lKCk7CisJfSAvLyBnZXRDdXJyZW50U3lzdGVtVGltZQorfSAvLyBTZXF1ZW50aWFsU2VxdWVuY2VyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL3Rlc3RzL1NvbHZlckV4YW1wbGUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlci90ZXN0cy9Tb2x2ZXJFeGFtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmYzI4MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlci90ZXN0cy9Tb2x2ZXJFeGFtcGxlLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci50ZXN0czsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgamF2YS5pby5GaWxlOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkRpYWdub3N0aWNpYW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUZhY3RvcnlJbXBsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclBhY2thZ2U7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHNhbXBsZSB1dGlsaXR5IGZvciB0aGUgJzxlbT48Yj5zb2x2ZXI8L2I+PC9lbT4nIHBhY2thZ2UuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTb2x2ZXJFeGFtcGxlIHsNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIExvYWQgYWxsIHRoZSBhcmd1bWVudCBmaWxlIHBhdGhzIG9yIFVSSXMgYXMgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBhcmdzIHRoZSBmaWxlIHBhdGhzIG9yIFVSSXMuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsNCisJCS8vIENyZWF0ZSBhIHJlc291cmNlIHNldCB0byBob2xkIHRoZSByZXNvdXJjZXMuDQorCQkvLw0KKwkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7DQorCQkNCisJCS8vIFJlZ2lzdGVyIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZSBmYWN0b3J5IHRvIGhhbmRsZSBhbGwgZmlsZSBleHRlbnNpb25zLg0KKwkJLy8NCisJCXJlc291cmNlU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0DQorCQkJKFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04sIA0KKwkJCSBuZXcgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsNCisNCisJCS8vIFJlZ2lzdGVyIHRoZSBwYWNrYWdlIHRvIGVuc3VyZSBpdCBpcyBhdmFpbGFibGUgZHVyaW5nIGxvYWRpbmcuDQorCQkvLw0KKwkJcmVzb3VyY2VTZXQuZ2V0UGFja2FnZVJlZ2lzdHJ5KCkucHV0DQorCQkJKFNvbHZlclBhY2thZ2UuZU5TX1VSSSwgDQorCQkJIFNvbHZlclBhY2thZ2UuZUlOU1RBTkNFKTsNCisgICAgICAgIA0KKwkJLy8gSWYgdGhlcmUgYXJlIG5vIGFyZ3VtZW50cywgZW1pdCBhbiBhcHByb3ByaWF0ZSB1c2FnZSBtZXNzYWdlLg0KKwkJLy8NCisJCWlmIChhcmdzLmxlbmd0aCA9PSAwKSB7DQorCQkJU3lzdGVtLm91dC5wcmludGxuKCJFbnRlciBhIGxpc3Qgb2YgZmlsZSBwYXRocyBvciBVUklzIHRoYXQgaGF2ZSBjb250ZW50IGxpa2UgdGhpczoiKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXRyeSB7DQorCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiaHR0cDovLy9NeS5zb2x2ZXIiKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJU29sdmVyIHJvb3QgPSBTb2x2ZXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTb2x2ZXIoKTsNCisJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQocm9vdCk7DQorCQkJCXJlc291cmNlLnNhdmUoU3lzdGVtLm91dCwgbnVsbCk7DQorCQkJfQ0KKwkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCX0NCisJCX0NCisJCWVsc2Ugew0KKwkJCS8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGFyZ3VtZW50cy4NCisJCQkvLw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkgew0KKwkJCQkvLyBDb25zdHJ1Y3QgdGhlIFVSSSBmb3IgdGhlIGluc3RhbmNlIGZpbGUuDQorCQkJCS8vIFRoZSBhcmd1bWVudCBpcyB0cmVhdGVkIGFzIGEgZmlsZSBwYXRoIG9ubHkgaWYgaXQgZGVub3RlcyBhbiBleGlzdGluZyBmaWxlLg0KKwkJCQkvLyBPdGhlcndpc2UsIGl0J3MgZGlyZWN0bHkgdHJlYXRlZCBhcyBhIFVSTC4NCisJCQkJLy8NCisJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoYXJnc1tpXSk7DQorCQkJCVVSSSB1cmkgPSBmaWxlLmlzRmlsZSgpID8gVVJJLmNyZWF0ZUZpbGVVUkkoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk6IFVSSS5jcmVhdGVVUkkoYXJnc1swXSk7DQorDQorCQkJCXRyeSB7DQorCQkJCQkvLyBEZW1hbmQgbG9hZCByZXNvdXJjZSBmb3IgdGhpcyBmaWxlLg0KKwkJCQkJLy8NCisJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsNCisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGVkICIgKyB1cmkpOyAvLyROT04tTkxTLTEkDQorDQorCQkJCQkvLyBWYWxpZGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIGxvYWRlZCByZXNvdXJjZS4NCisJCQkJCS8vDQorCQkJCQlmb3IgKEVPYmplY3QgZU9iamVjdCA6IHJlc291cmNlLmdldENvbnRlbnRzKCkpIHsNCisJCQkJCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBEaWFnbm9zdGljaWFuLklOU1RBTkNFLnZhbGlkYXRlKGVPYmplY3QpOw0KKwkJCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgew0KKwkJCQkJCQlwcmludERpYWdub3N0aWMoZGlhZ25vc3RpYywgIiIpOyAvLyROT04tTkxTLTEkDQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIGxvYWRpbmcgIiArIHVyaSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKwkNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFByaW50cyBkaWFnbm9zdGljcyB3aXRoIGluZGVudGF0aW9uLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIGRpYWdub3N0aWMgdGhlIGRpYWdub3N0aWMgdG8gcHJpbnQuDQorCSAqIEBwYXJhbSBpbmRlbnQgdGhlIGluZGVudGF0aW9uIGZvciBwcmludGluZy4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHByaW50RGlhZ25vc3RpYyhEaWFnbm9zdGljIGRpYWdub3N0aWMsIFN0cmluZyBpbmRlbnQpIHsNCisJCVN5c3RlbS5vdXQucHJpbnQoaW5kZW50KTsNCisJCVN5c3RlbS5vdXQucHJpbnRsbihkaWFnbm9zdGljLmdldE1lc3NhZ2UoKSk7DQorCQlmb3IgKERpYWdub3N0aWMgY2hpbGQgOiBkaWFnbm9zdGljLmdldENoaWxkcmVuKCkpIHsNCisJCQlwcmludERpYWdub3N0aWMoY2hpbGQsIGluZGVudCArICIgICIpOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCit9IC8vU29sdmVyRXhhbXBsZQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlci90ZXN0cy9Tb2x2ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvdGVzdHMvU29sdmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OTVmMjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvdGVzdHMvU29sdmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIudGVzdHM7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi50ZXN0cy5JZGVudGlmaWFibGVUZXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXJGYWN0b3J5Ow0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Tb2x2ZXI8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBhcmUgdGVzdGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXIjc3RlcChvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIGxvbmcsIGludCkgPGVtPlN0ZXA8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlciNyZXNldCgpIDxlbT5SZXNldDwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTb2x2ZXJUZXN0IGV4dGVuZHMgSWRlbnRpZmlhYmxlVGVzdCB7DQorDQorCXB1YmxpYyBzdGF0aWMgVVJJIFNPTFZFUl9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSSgic29sdmVyL3NvbHZlclRlc3Quc29sdmVyIik7DQorCQ0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsNCisJCVRlc3RSdW5uZXIucnVuKFNvbHZlclRlc3QuY2xhc3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFNvbHZlciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTb2x2ZXJUZXN0KFN0cmluZyBuYW1lKSB7DQorCQlzdXBlcihuYW1lKTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTb2x2ZXIgdGVzdCBjYXNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBTb2x2ZXIgZ2V0Rml4dHVyZSgpIHsNCisJCXJldHVybiAoU29sdmVyKWZpeHR1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gew0KKwkJU29sdmVyIHMgPSBTb2x2ZXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTb2x2ZXIoKTsNCisJCXMuc2V0VVJJKFNPTFZFUl9VUkkpOw0KKwkJc2V0Rml4dHVyZShzKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorCQlzZXRGaXh0dXJlKG51bGwpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlciNzdGVwKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSwgbG9uZywgaW50KSA8ZW0+U3RlcDwvZW0+fScgb3BlcmF0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlciNzdGVwKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSwgbG9uZywgaW50KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCB0ZXN0U3RlcF9fU1RFTVRpbWVfbG9uZ19pbnQoKSB7DQorCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBvcGVyYXRpb24gdGVzdCBtZXRob2QNCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UDQorCQlmYWlsKCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyI3Jlc2V0KCkgPGVtPlJlc2V0PC9lbT59JyBvcGVyYXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyI3Jlc2V0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgdGVzdFJlc2V0KCkgew0KKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgb3BlcmF0aW9uIHRlc3QgbWV0aG9kDQorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVA0KKwkJZmFpbCgpOw0KKwl9DQorDQorfSAvL1NvbHZlclRlc3QNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvdGVzdHMvU29sdmVyVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlci90ZXN0cy9Tb2x2ZXJUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYzY5ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvdGVzdHMvU29sdmVyVGVzdHMuamF2YQpAQCAtMCwwICsxLDU2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIudGVzdHM7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KKw0KK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+c29sdmVyPC9iPjwvZW0+JyBwYWNrYWdlLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU29sdmVyVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgew0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsNCisJCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFNvbHZlclRlc3RzKCJzb2x2ZXIgVGVzdHMiKTsgLy8kTk9OLU5MUy0xJA0KKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFNvbHZlclRlc3QuY2xhc3MpOw0KKwkJcmV0dXJuIHN1aXRlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNvbHZlclRlc3RzKFN0cmluZyBuYW1lKSB7DQorCQlzdXBlcihuYW1lKTsNCisJfQ0KKw0KK30gLy9Tb2x2ZXJUZXN0cw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3Rlc3RzL0FjdGl2YXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdGVzdHMvQWN0aXZhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE1YjgxMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3Rlc3RzL0FjdGl2YXRvci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CisKKy8qKgorICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBQbHVnaW4geworCisJLyoqCisJICogVGhlIHBsdWctaW4gSUQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRlc3QiOworCisJLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQorCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47CisKKwkvKioKKwkgKiBUaGUgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgQWN0aXZhdG9yKCkgeworCQlwbHVnaW4gPSB0aGlzOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBjb250ZXh0CisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdGFydChjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXBsdWdpbiA9IG51bGw7CisJCXN1cGVyLnN0b3AoY29udGV4dCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCisJICogCisJICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3Rlc3RzL1Rlc3RDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3Rlc3RzL1Rlc3RDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjkwNmE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdGVzdHMvVGVzdENvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8vIFRlc3RDb25zdGFudHMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyB1c2VkIGJ5IFNURU0ncyB0ZXN0cy4KKyAqLworcHVibGljIGludGVyZmFjZSBUZXN0Q29uc3RhbnRzIHsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIFVSSSBzdHJpbmcgb2YgdGhlIHNlcmlhbGl6ZWQgdGVzdCBzY2VuYXJpbyB1c2VkIGZvciBKVW5pdAorCSAqIHRlc3RzCisJICovCisJU3RyaW5nIEpVTklUX1RFU1RfU0NFTkFSSU9fMV9VUklfU1RSSU5HID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS5zdGVtLmNvcmUudGVzdC9kYXRhL3NjZW5hcmlvcy9iYXNpYy90ZXN0c2NlbmFyaW8xLnNjZW5hcmlvIjsKK30gLy8gVGVzdENvbnN0YW50cwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdGVzdHMvVGVzdExvZ1BlcmZvcm1hbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90ZXN0cy9UZXN0TG9nUGVyZm9ybWFuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODk1MWFhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdGVzdHMvVGVzdExvZ1BlcmZvcm1hbmNlLmphdmEKQEAgLTAsMCArMSw4OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBUZXN0TG9nUGVyZm9ybWFuY2UgeworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7CisJCXRyeSB7CisJCQlUZXN0TG9nUGVyZm9ybWFuY2UgdGVzdCA9IG5ldyBUZXN0TG9nUGVyZm9ybWFuY2UoKTsKKwkJCXRlc3QudGVzdDEoKTsKKwkJCXRlc3QudGVzdDIoKTsKKwkJfSBjYXRjaChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgdGVzdDEoKSAgdGhyb3dzIElPRXhjZXB0aW9ueworCQkvLyBDcmVhdGUgMTAwIGZpbGVzIGFuZCB3cml0ZSAKKwkJLy8gNCBjb2x1bW5zLCAxMDAwMCByb3dzIHRvIGVhY2ggZmlsZQorCQkKKwkJRmlsZVdyaXRlciBbXSBmaWxlV3JpdGVycyA9IG5ldyBGaWxlV3JpdGVyWzIwMF07CisJCQorCQlsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQorCQlmb3IoaW50IGluZCA9IDA7aW5kPGZpbGVXcml0ZXJzLmxlbmd0aDsrK2luZCkgeworCQkJZmlsZVdyaXRlcnNbaW5kXSA9IHRoaXMuY3JlYXRlRmlsZSgiYzpcXHBlcmZ0ZXN0XFx0ZXN0MV8iKyhpbmQpKyIuY3N2Iik7CisJCX0KKwkJCisJCVN0cmluZyBkYXRhID0gIkNPTDEsQ09MMixDT0wzLENPTDQiOworCQlmb3IoaW50IGk9MDtpPDEwMDAwOysraSkgeworCQkJZm9yKGludCBpbmQgPSAwO2luZDxmaWxlV3JpdGVycy5sZW5ndGg7KytpbmQpIHsKKwkJCQlmaWxlV3JpdGVyc1tpbmRdLmFwcGVuZChkYXRhKTsKKwkJCQlmaWxlV3JpdGVyc1tpbmRdLmFwcGVuZCgiXG4iKTsKKwkJCQlpZihpICUgNTAgPT0gMCkgZmlsZVdyaXRlcnNbaW5kXS5mbHVzaCgpOworCQkJfQorCQl9CisJCWZvcihGaWxlV3JpdGVyIGZ3OiBmaWxlV3JpdGVycykgeworCQkJZncuZmx1c2goKTsKKwkJCWZ3LmNsb3NlKCk7CisJCX0KKwkJbG9uZyB0aGVuID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCAxOiAiKyh0aGVuIC0gbm93KSk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0ZXN0MigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCS8vIENyZWF0ZSA0IGZpbGVzIGFuZCB3cml0ZSAKKwkJLy8gMTAwIGNvbHVtbnMsIDEwMDAwIHJvd3MgdG8gZWFjaCBmaWxlCisJCQorCQlGaWxlV3JpdGVyIFtdIGZpbGVXcml0ZXJzID0gbmV3IEZpbGVXcml0ZXJbNF07CisJCVN0cmluZyBkYXRhID0gIiI7CisJCWZvcihpbnQgY29sPTA7Y29sPDIwMDsrK2NvbCkgZGF0YSA9IGRhdGErIkNPTCIrY29sKyIsIjsKKwkJbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkKKwkJZm9yKGludCBpbmQgPSAwO2luZDxmaWxlV3JpdGVycy5sZW5ndGg7KytpbmQpIHsKKwkJCWZpbGVXcml0ZXJzW2luZF0gPSB0aGlzLmNyZWF0ZUZpbGUoImM6XFxwZXJmdGVzdFxcdGVzdDJfIisoaW5kKSsiLmNzdiIpOworCQl9CisJCQorCQkKKwkJZm9yKGludCBpPTA7aTwxMDAwMDsrK2kpIHsKKwkJCWZvcihpbnQgaW5kID0gMDtpbmQ8ZmlsZVdyaXRlcnMubGVuZ3RoOysraW5kKSB7CisJCQkJZmlsZVdyaXRlcnNbaW5kXS5hcHBlbmQoZGF0YSk7CisJCQkJZmlsZVdyaXRlcnNbaW5kXS5hcHBlbmQoIlxuIik7CisJCQkJaWYoaSAlIDUwID09IDApIGZpbGVXcml0ZXJzW2luZF0uZmx1c2goKTsKKwkJCX0KKwkJfQorCQlmb3IoRmlsZVdyaXRlciBmdzogZmlsZVdyaXRlcnMpIHsKKwkJCWZ3LmZsdXNoKCk7CisJCQlmdy5jbG9zZSgpOworCQl9CisJCWxvbmcgdGhlbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgMjogIisodGhlbiAtIG5vdykpOworCX0KKwkKKwlwcml2YXRlIEZpbGVXcml0ZXIgY3JlYXRlRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSk7CisJCXJldHVybiBmdzsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90ZXN0cy91dGlsL1V0aWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3Rlc3RzL3V0aWwvVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMjY4ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90ZXN0cy91dGlsL1V0aWwuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLy8gVXRpbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50ZXN0cy51dGlsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5VdGlsaXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLmltcGwuSWRlbnRpZmlhYmxlRmlsdGVySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnRlc3RzLkdyYXBoVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnRlc3RzLk1vZGVsVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLnRlc3RzLlNjZW5hcmlvVGVzdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGhvbGRzIHV0aWxpdHkgbWV0aG9kcyBmb3IgdGVzdGluZy4gVGhlIE1haW4gbWV0aG9kIGNyZWF0ZXMKKyAqIGluc3RhbmNlcyBvZiB0aGUgdGhlIGdyYXBoLCBtb2RlbCBhbmQgc2NlbmFyaW8ncyBiZWluZyB1c2VkIGZvciB0aGUgSlVuaXQKKyAqIHRlc3RzIGFuZCBzZXJpYWxpemVzIHRoZW0uCisgKi8KK3B1YmxpYyBjbGFzcyBVdGlsIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0VOQVJJT19GSUxFX05BTUUgPSAidGVzdHNjZW5hcmlvLnhtbCI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfRklMRV9OQU1FID0gInRlc3RncmFwaC54bWwiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMX0ZJTEVfTkFNRSA9ICJ0ZXN0bW9kZWwueG1sIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQU5PTklDQUxfR1JBUEhfRklMRV9OQU1FID0gInRlc3RjYW5vbmljYWxncmFwaC54bWwiOworCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJncykgeworCQl0cnkgeworCQkJc2VyaWFsaXplR3JhcGgoR1JBUEhfRklMRV9OQU1FKTsKKwkJCXNlcmlhbGl6ZU1vZGVsKE1PREVMX0ZJTEVfTkFNRSk7CisJCQlzZXJpYWxpemVTY2VuYXJpbyhTQ0VOQVJJT19GSUxFX05BTUUpOworCQkJc2VyaWFsaXplQ2Fub25pY2FsR3JhcGgoQ0FOT05JQ0FMX0dSQVBIX0ZJTEVfTkFNRSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwl9IC8vIG1haW4KKworCS8qKgorCSAqIFNlcmlhbGl6ZSBhIGdyYXBoLgorCSAqIAorCSAqIEBwYXJhbSBmaWxlTmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gc2VyaWFsaXplIGludG8KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgc2VyaWFsaXplR3JhcGgoZmluYWwgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlmaW5hbCBHcmFwaCBncmFwaCA9IEdyYXBoVGVzdC5jcmVhdGVGaXh0dXJlKCk7CisJCXJlZnJlc2hEdWJsaW5Db3JlKGdyYXBoKTsKKwkJVXRpbGl0eS5zZXJpYWxpemVJZGVudGlmaWFibGUoZ3JhcGgsIGNyZWF0ZVVSSShmaWxlTmFtZSkpOworCX0gLy8gc2VyaWFsaXplR3JhcGgKKworCS8qKgorCSAqIFNlcmlhbGl6ZSBhIG1vZGVsLgorCSAqIAorCSAqIEBwYXJhbSBmaWxlTmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gc2VyaWFsaXplIGludG8KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgc2VyaWFsaXplTW9kZWwoZmluYWwgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlmaW5hbCBNb2RlbCBtb2RlbCA9IE1vZGVsVGVzdC5jcmVhdGVGaXh0dXJlKCk7CisJCXJlZnJlc2hEdWJsaW5Db3JlKG1vZGVsKTsKKwkJVXRpbGl0eS5zZXJpYWxpemVJZGVudGlmaWFibGUobW9kZWwsIGNyZWF0ZVVSSShmaWxlTmFtZSkpOworCX0gLy8gc2VyaWFsaXplTW9kZWwKKworCS8qKgorCSAqIFNlcmlhbGl6ZSBhIHNjZW5hcmlvLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXJpYWxpemVTY2VuYXJpbyhmaW5hbCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWZpbmFsIFNjZW5hcmlvIHNjZW5hcmlvID0gU2NlbmFyaW9UZXN0LmNyZWF0ZUZpeHR1cmUoKTsKKwkJcmVmcmVzaER1YmxpbkNvcmUoc2NlbmFyaW8pOworCQlVdGlsaXR5LnNlcmlhbGl6ZUlkZW50aWZpYWJsZShzY2VuYXJpbywgY3JlYXRlVVJJKGZpbGVOYW1lKSk7CisJfSAvLyBzZXJpYWxpemVTY2VuYXJpbworCisJLyoqCisJICogQHBhcmFtIGNhbm9uaWNhbF9ncmFwaF9maWxlX25hbWUyCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZUNhbm9uaWNhbEdyYXBoKGZpbmFsIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJZmluYWwgU2NlbmFyaW8gc2NlbmFyaW8gPSBTY2VuYXJpb1Rlc3QuY3JlYXRlRml4dHVyZSgpOworCQlyZWZyZXNoRHVibGluQ29yZShzY2VuYXJpbyk7CisJCVNURU1UaW1lIG5vdyA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU1RFTVRpbWUoKTsKKwkJZmluYWwgR3JhcGggY2Fub25pY2FsR3JhcGggPSBzY2VuYXJpby5nZXRNb2RlbCgpLmdldENhbm9uaWNhbEdyYXBoKAorCQkJCVNURU1VUkkuY3JlYXRlVVJJKCJjYW5vbmljYWwiKSwgbmV3IElkZW50aWZpYWJsZUZpbHRlckltcGwoc2NlbmFyaW8uZ2V0TW9kZWwoKS5nZXREdWJsaW5Db3JlKCkuZ2V0Q292ZXJhZ2UoKSksIG5vdyk7CisJCVV0aWxpdHkuc2VyaWFsaXplSWRlbnRpZmlhYmxlKGNhbm9uaWNhbEdyYXBoLCBjcmVhdGVVUkkoZmlsZU5hbWUpKTsKKwl9IC8vIHNlcmlhbGl6ZUNhbm9uaWNhbEdyYXBoCisKKwkvKioKKwkgKiBAcGFyYW0gZmlsZU5hbWUKKwkgKiBAcmV0dXJuIGEgdXJpCisJICovCisJcHJpdmF0ZSBzdGF0aWMgVVJJIGNyZWF0ZVVSSShmaW5hbCBTdHJpbmcgZmlsZVBhdGgpIHsKKwkJZmluYWwgVVJJIHJldFZhbHVlID0gVVJJLmNyZWF0ZVVSSShmaWxlUGF0aCk7CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlVVJJCisKKwkvKioKKwkgKiBAcGFyYW0gZ3JhcGgKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIHJlZnJlc2hEdWJsaW5Db3JlKGZpbmFsIElkZW50aWZpYWJsZSBpZGVudGlmaWFibGUpIHsKKwkJZmluYWwgRHVibGluQ29yZSBkYyA9IGlkZW50aWZpYWJsZS5nZXREdWJsaW5Db3JlKCk7CisJCWRjLnBvcHVsYXRlKCk7CisJCWRjLnNldEZvcm1hdChpZGVudGlmaWFibGUuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKS5nZXROc1VSSSgpKTsKKwl9IC8vIHJlZnJlc2hEdWJsaW5Db3JlCit9IC8vIFV0aWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3RyaWdnZXIvdGVzdHMvVHJpZ2dlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3RyaWdnZXIvdGVzdHMvVHJpZ2dlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWUxNmU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdHJpZ2dlci90ZXN0cy9UcmlnZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsODggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC50ZXN0cy5EZWNvcmF0b3JUZXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuVHJpZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5UcmlnZ2VyRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UcmlnZ2VyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBUcmlnZ2VyVGVzdCBleHRlbmRzIERlY29yYXRvclRlc3QgeworCisJcHVibGljIHN0YXRpYyBVUkkgVFJJR0dFUl9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSSgidHJpZ2dlci90cmlnZ2VyVGVzdC5kZWNvcmF0b3IiKTsKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFRyaWdnZXJUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFRyaWdnZXIgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRyaWdnZXJUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgVHJpZ2dlciB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFRyaWdnZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChUcmlnZ2VyKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyaWdnZXIgdCA9IFRyaWdnZXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUcmlnZ2VyKCk7CisJCXQuc2V0VVJJKFRSSUdHRVJfVVJJKTsKKwkJc2V0Rml4dHVyZSh0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCit9IC8vVHJpZ2dlclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3RyaWdnZXIvdGVzdHMvVHJpZ2dlclRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90cmlnZ2VyL3Rlc3RzL1RyaWdnZXJUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNDllNTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90cmlnZ2VyL3Rlc3RzL1RyaWdnZXJUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3Qgc3VpdGUgZm9yIHRoZSAnPGVtPjxiPnRyaWdnZXI8L2I+PC9lbT4nIHBhY2thZ2UuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRyaWdnZXJUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRyaWdnZXJUZXN0cygidHJpZ2dlciBUZXN0cyIpOyAvLyROT04tTkxTLTEkCisJCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmlnZ2VyVGVzdC5jbGFzcyk7CisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVHJpZ2dlclRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworfSAvL1RyaWdnZXJUZXN0cwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlL3RlbXAvLmN2c2lnbm9yZSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS90ZW1wLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk0ZmNiNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZS90ZW1wLy5jdnNpZ25vcmUKQEAgLTAsMCArMSwzIEBACisqLmdyYXBoCisqLm1vZGVsCisqLnNjZW5hcmlvCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZTg2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy8ucHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhMzhjZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9uczwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NGE1NTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDY5IEBACisjTW9uIEphbiAyMSAxMjo0NjoyMyBFU1QgMjAwOAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWM0MTJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDIwIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucztzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZSwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeSwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwsCisgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlbywKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnRlc3RzLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnRlc3RzLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMudGVzdHMKK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZSwKKyBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTIwMTQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTMgQEAKKyMgPGNvcHlyaWdodD4KKyMgPC9jb3B5cmlnaHQ+CisjCisjICRJZCQKKworYmluLmluY2x1ZGVzID0gLixcCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgbm90aWNlLmh0bWwsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuCitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9kYXRhL3NwYXRpYWwvZ2VvL3Rlc3QxZ21sLmdtbCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvZGF0YS9zcGF0aWFsL2dlby90ZXN0MWdtbC5nbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyZTQ2MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvZGF0YS9zcGF0aWFsL2dlby90ZXN0MWdtbC5nbWwKQEAgLTAsMCArMSw2OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxNYXAgeG1sbnM6Z21sPSJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCIgeG1sbnM6Z2VvcnNzPSJodHRwOi8vd3d3Lmdlb3Jzcy5vcmcvZ2VvcnNzIj4KKzx0aXRsZT5VU0EgTGV2ZWwgMiBNYXA8L3RpdGxlPgorPHN1YlRpdGxlPkFkbWluaXN0cmF0aXZlIEJvdW5kYXJpZXM8L3N1YlRpdGxlPgorPHVwZGF0ZWQ+QXVnIDE2LCAyMDA2IDQ6MzE6MDggUE08L3VwZGF0ZWQ+Cis8ZW50cnk+Cis8Z2VvcnNzOndoZXJlPgorPGdtbDpQb2x5Z29uIGdtbDppZD0iVVMtQUstMDIwMTMiLz4KKworPGdtbDpQb2x5Z29uIGdtbDppZD0iVVMtQUstMDIyOTAiLz4KKworPGdtbDpQb2x5Z29uIGdtbDppZD0iVVMtQUwtMDEwMDEiPgorPGdtbDpvdXRlckJvdW5kYXJ5SXM+Cis8Z21sOkxpbmVhclJpbmc+Cis8Z21sOnBvc0xpc3Q+LTg2LjkxNjk1NiAzMi42NjQxNTggLTg2LjgxNzM0NCAzMi42NjAxNTEgLTg2LjcxMzQ5NSAzMi42NjczODIgLTg2LjYyMDY2MyAzMi43MDYyNiAtODYuNTI0NTkzIDMyLjcwNzA1NyAtODYuNTI0NTkzIDMyLjcwNzA1NyAtODYuNDY4MjAyIDMyLjcwNzg1NiAtODYuNDE2MTU5IDMyLjcwNzQ4IC04Ni40MTU2NDcgMzIuNzA3NDY0IC04Ni40MTMxMTYgMzIuNzA3Mzg2IC04Ni40MTMxMTYgMzIuNzA3Mzg2IC04Ni40MTI1NjcgMzIuNjA3MzQ3IC04Ni40MTIzNzggMzIuNTU3MDcxIC04Ni40MTIzNDIgMzIuNTAzNjM2IC04Ni40MTIwNzMgMzIuNDkyOTM0IC04Ni40MTIwNzMgMzIuNDkyOTM0IC04Ni40MTE5NzMgMzIuNDkxNjM0IC04Ni40MTE5NzMgMzIuNDkxNjM0IC04Ni40MTE5NzMgMzIuNDg5MzU1IC04Ni40MTE5NzMgMzIuNDg1ODM1IC04Ni40MTE3NzMgMzIuNDY1NzM1IC04Ni40MTExNzIgMzIuNDA5OTM3IC04Ni40MTExNzIgMzIuNDA5OTM3IC04Ni40MTY0NzIgMzIuNDA3MDM3IC04Ni40NDQ3ODUgMzIuMzk5ODYgLTg2LjQ2MzU2NCAzMi4zNzcyODggLTg2LjQ5Njc3NCAzMi4zNDQ0MzggLTg2LjQ5Njc3NCAzMi4zNDQ0MzggLTg2LjUzNTY2OCAzMi4zNDA0NCAtODYuNTQyMTYgMzIuMzYxNDE3IC04Ni43MDk3MTYgMzIuMzYwNCAtODYuNzgyMzc3IDMyLjM3MzM3NSAtODYuNzg0MzU1IDMyLjMyNDQwOCAtODYuODE0OTEyIDMyLjM0MDgwMyAtODYuODE0OTEyIDMyLjM0MDgwMyAtODYuODQzMDk2IDMyLjQzMjgxNCAtODYuODY2NjA3IDMyLjQ0MDExNCAtODYuOTAwNTE5IDMyLjU1NjA1NCAtODYuOTE2OTU2IDMyLjY2NDE1OCA8L2dtbDpwb3NMaXN0PgorPC9nbWw6TGluZWFyUmluZz4KKzwvZ21sOm91dGVyQm91bmRhcnlJcz4KKzwvZ21sOlBvbHlnb24+CisKKzxnbWw6UG9seWdvbiBnbWw6aWQ9IlVTLUFMLTAxMDAzIj4KKzxnbWw6b3V0ZXJCb3VuZGFyeUlzPgorPGdtbDpMaW5lYXJSaW5nPgorPGdtbDpwb3NMaXN0Pi04Ny45NTQ1MzMgMzAuOTE5MzI1IC04Ny45NTQ2NDEgMzAuOTE4NTc0IC04Ny45NTQ2NDEgMzAuOTE4NTc0IC04Ny45NTQ1MzMgMzAuOTE5MzI1IDwvZ21sOnBvc0xpc3Q+Cis8L2dtbDpMaW5lYXJSaW5nPgorPC9nbWw6b3V0ZXJCb3VuZGFyeUlzPgorPC9nbWw6UG9seWdvbj4KKzxnbWw6UG9seWdvbiBnbWw6aWQ9IlVTLUFMLTAxMDk1Ij4KKzxnbWw6b3V0ZXJCb3VuZGFyeUlzPgorPGdtbDpMaW5lYXJSaW5nPgorPGdtbDpwb3NMaXN0Pi04Ni4zMjY5ODcgMzQuNTk5NzQ0IC04Ni4yMjExOTIgMzQuNTk5ODUxIC04Ni4xNjc0ODQgMzQuNTk5MjYzIC04Ni4xNDg2ODEgMzQuNTg4MzM5IC04Ni4xNDk4MDYgMzQuNTMzNjMzIC04Ni4xNDk4MDYgMzQuNTMzNjMzIC04Ni4xNTQyNzUgMzQuNTMwMDU1IC04Ni4xNTI2NjMgMzQuNTMzNzE5IC04Ni4xNTA5NjYgMzQuNTMzNjUzIC04Ni4xNDk4MDYgMzQuNTMzNjMzIC04Ni4xNDk4MDYgMzQuNTMzNjMzIC04Ni4xNDU1MzMgMzQuNTMzNDc5IC04Ni4xNDU2MDIgMzQuNTIwMDExIC04Ni4wOTg0NzkgMzQuNTAwMDg3IC04Ni4wNTc3MTIgMzQuNDc1OTk0IDwvZ21sOnBvc0xpc3Q+Cis8L2dtbDpMaW5lYXJSaW5nPgorPGdtbDpMaW5lYXJSaW5nPgorPGdtbDpwb3NMaXN0Pi04Ni4xNDk4MDYgMzQuNTMzNjMzIC04Ni4xNDg2ODEgMzQuNTg4MzM5IC04Ni4xNjc0ODQgMzQuNTk5MjYzIC04Ni4yMjExOTIgMzQuNTk5ODUxIC04Ni4zMjY5ODcgMzQuNTk5NzQ0IC04Ni4zMjY5ODcgMzQuNTk5NzQ0IC04Ni4zMDU1ODcgMzQuNTk0MTIyIC04Ni4zOTE5OTIgMzQuNTE5NDQyIC04Ni40ODcyMTMgMzQuNDgwMDU2IC04Ni41NTAxNjYgMzQuNTQ1OTYzIC04Ni41NTAxNjYgMzQuNTQ1OTYzIC04Ni41NTk1NDIgMzQuNTAxODk5IC04Ni41NjU1MjIgMzQuNDY3OTQ5IC04Ni41NzQ1OTUgMzQuNDEyMTQ3IC04Ni41ODE5MzYgMzQuMzA0Njk0IC04Ni41ODE5MzYgMzQuMzA0Njk0IC04Ni41MjYyMiAzNC4zMDM0NTIgLTg2LjQ3MTg2NSAzNC4yODkyNDkgLTg2LjQ1Mjg1MSAzNC4yNTk0NTYgLTg2LjQ1Mjg3NiAzNC4yNTkzMTQgLTg2LjQ1Mjg3NiAzNC4yNTkzMTQgLTg2LjQ0NDMyNyAzNC4yNTYzMjQgLTg2LjM3ODMwNyAzNC4xNzM3OTIgLTg2LjM0MzgzMiAzNC4xMzg5OTkgLTg2LjMwMzQ5OCAzNC4wOTkwOTcgLTg2LjMwMzQ5OCAzNC4wOTkwOTcgLTg2LjIxNjI1NiAzNC4xNjUwMjQgLTg2LjE2NzQxIDM0LjE4NzQ3MSAtODYuMTEwNzc4IDM0LjE4NjM1MSAtODYuMTA2MDg2IDM0LjIwMDc1NiAtODYuMTA2MDg2IDM0LjIwMDc1NiAtODYuMTA3MjA3IDM0LjIzNzQ5MSAtODYuMTA4MTM5IDM0LjI5NDIyNSAtODYuMTExMzE2IDM0LjM5Mjk0OSAtODYuMDU3NzEyIDM0LjQ3NTk5NCAtODYuMDU3NzEyIDM0LjQ3NTk5NCAtODYuMDk4NDc5IDM0LjUwMDA4NyAtODYuMTQ1NjAyIDM0LjUyMDAxMSAtODYuMTQ1NTMzIDM0LjUzMzQ3OSAtODYuMTQ5ODA2IDM0LjUzMzYzMyA8L2dtbDpwb3NMaXN0PgorPC9nbWw6TGluZWFyUmluZz4KKzwvZ21sOm91dGVyQm91bmRhcnlJcz4KKzwvZ21sOlBvbHlnb24+CisKKzxnbWw6UG9seWdvbiBnbWw6aWQ9IlVTLUNBLTA2MDM3Ij4KKzxnbWw6b3V0ZXJCb3VuZGFyeUlzPgorPGdtbDpMaW5lYXJSaW5nPgorPGdtbDpwb3NMaXN0Pi04MC42MjU5MTcgMzMuNDE1MDcgLTgwLjQ0NzU1IDMzLjUwMDAyNSAtODAuMjUwOTAzIDMzLjM1MTY1OCAtODAuMjUwOTAzIDMzLjI4MTQ0IC04MC4zNzU5MDggMzMuMjYwMDc0IC04MC41NDg1NzcgMzMuMzc1MDI4IC04MC42MjU5MTcgMzMuNDE1MDcgLTgwLjYyNTkxNyAzMy40MTUwNyAtODAuNDQ3NTUgMzMuNTAwMDI1IC04MC4yNTA5MDMgMzMuMzUxNjU4IC04MC4yNTA5MDMgMzMuMjgxNDQgLTgwLjM3NTkwOCAzMy4yNjAwNzQgLTgwLjU0ODU3NyAzMy4zNzUwMjggLTgwLjYyNTkxNyAzMy40MTUwNyA8L2dtbDpwb3NMaXN0PgorPC9nbWw6TGluZWFyUmluZz4KKzxnbWw6TGluZWFyUmluZz4KKzxnbWw6cG9zTGlzdD4tODAuNjQ0NzMyIDMzLjAwMDAzMyAtODAuNjAzODQ3IDMyLjkwNDc4NyAtODAuNDM2NTM5IDMyLjc1MDAzOSAtODAuNDE5ODY0IDMyLjc1MDAzOSAtODAuMzc1OTA3IDMyLjkwODY4OCAtODAuNDc5OTQ1IDMzLjAwMDAzMyAtODAuNjI1OTE2IDMzLjA4NTY2NCAtODAuNjQ0NzMyIDMzLjAwMDAzMyAtODAuNjQ0NzMyIDMzLjAwMDAzMyAtODAuNjAzODQ3IDMyLjkwNDc4NyAtODAuNDM2NTM5IDMyLjc1MDAzOSAtODAuNDE5ODY0IDMyLjc1MDAzOSAtODAuMzc1OTA3IDMyLjkwODY4OCAtODAuNDc5OTQ1IDMzLjAwMDAzMyAtODAuNjI1OTE2IDMzLjA4NTY2NCAtODAuNjQ0NzMyIDMzLjAwMDAzMyA8L2dtbDpwb3NMaXN0PgorPC9nbWw6TGluZWFyUmluZz4KKzxnbWw6TGluZWFyUmluZz4KKzxnbWw6cG9zTGlzdD4tODAuNjMzMzcgMzQuMjcwNTQ2IC04MC42MzM3NzQgMzQuMjcyMjI2IC04MC42NDc0MDIgMzQuMzE0MDMyIC04MC42NzAzNDYgMzQuMzYwNjIyIC04MC42OTI1NTUgMzQuNDA2MzQ4IC04MC42OTI1NTUgMzQuNDA2MzQ4IC04MC43NjQ3MzMgMzQuNTUxOTU4IC04MC43OTM4ODYgMzQuNjExMDExIC04MC44NDA4NjMgMzQuNzA2NTA1IC04MC44ODE4OTUgMzQuNzkwNjE5IC04MC44ODE4OTUgMzQuNzkwNjE5IC04MC44ODI0MDIgMzQuNzkxNjc1IC04MC44ODI1MzcgMzQuNzkxOTkyIC04MC44OTQ0NjYgMzQuODE3NzU0IC04MC44ODE4NTggMzQuODE3ODAyIC04MC44ODE4NTggMzQuODE3ODAyIC04MC44ODE0MSAzNC44MTc4MDIgLTgwLjg4MTQxIDM0LjgxNzgwMiAtODAuNjgxMjE0IDM0LjgxODEyMiAtODAuNDY2NzMxIDM0LjgxNzY5MiAtODAuMjU1MzA5IDM0LjgyMDE1NSAtODAuMTcxNTk1IDM0LjgyMDU1NSAtODAuMTcxNTk1IDM0LjgyMDU1NSAtODAuMTcwNTcxIDM0LjgyMDYwMyAtODAuMTcwNTcxIDM0LjgyMDYwMyAtODAuMDkyOTY4IDM0LjgyMTEyMyAtNzAuOTg3NDYyIDM0LjgyMjE3MiAtNzAuODI0NzM3IDM0LjgyMjc0OSAtNzAuNjY3MjkyIDM0LjgyMjUyNiAtNzAuNjY3MjkyIDM0LjgyMjUyNiAtNzAuNjY3Mjk3IDM0LjcxMDU0OCAtNzAuNjY2ODcxIDM0LjYwMjEzNiAtNzAuNjYwMzMgMzQuNTUzMzM3IC03MC42NTk3MzggMzQuNDk4NzQ3IC03MC42NTk3MzggMzQuNDk4NzQ3IC03MC42NTk3NyAzNC40OTgyMDMgLTcwLjY1OTcwNiAzNC40OTc1MTUgLTcwLjY1OTcwMyAzNC40OTY5ODEgLTcwLjY1OTU2MSAzNC40NTE0ODUgLTcwLjY1OTU2MSAzNC40NTE0ODUgLTcwLjY1NTAxNCAzNC4zOTY5NDcgLTcwLjY1MzE1OSAzNC4zNzM3OTggLTcwLjY1MjY5MyAzNC4zNjczMzIgLTcwLjY1MjYwMSAzNC4zNjYwNDggLTcwLjY1MjYwMSAzNC4zNjYwNDggLTcwLjY1MDI0OCAzNC4zMzg4NjUgLTcwLjY0Nzg4IDM0LjI4MjU4IC03MC42NzUzMzQgMzQuMTc2OTgzIC03MC43MTAwODkgMzQuMDgxNjEgLTcwLjcxMDA4OSAzNC4wODE2MSAtNzAuNzEwMzI4IDM0LjA4MTAzMSAtNzAuNzEwNjg5IDM0LjA4MDMxIC03MC43MTE3NzQgMzQuMDc3ODQ0IC03MC43Mjk3ODkgMzQuMDI0NDExIC03MC43Mjk3ODkgMzQuMDI0NDExIC03MC43Mjk4ODkgMzQuMDI0MTExIC03MC43MzE4ODkgMzQuMDIwNTEyIC03MC43MzU4ODkgMzQuMDE4ODEyIC03MC43NDUyMTEgMzQuMDE5OTkxIC03MC43NDUyMTEgMzQuMDE5OTkxIC03MC43OTE3MiAzMy45OTQwOTggLTcwLjgwMjY5MSAzMy45NjgzMTMgLTcwLjc5Mzg1MyAzMy45NTkyNDMgLTcwLjc4MzI5IDMzLjk0NjQxMyAtNzAuNzgzMjkgMzMuOTQ2NDEzIC03MC43OTQyMDIgMzMuOTQ2NTQ0IC03MC43OTk4OSAzMy45NDY2MTMgLTcwLjgyOTAxIDMzLjk0NjYxMyAtNzAuODcwMTkzIDMzLjk0NTUxMyAtNzAuODcwMTkzIDMzLjk0NTUxMyAtNzAuOTI1MTc3IDMzLjk0NTk5NiAtNzAuOTc2MzYxIDMzLjkyNjYwNCAtODAuMDA5MTk2IDMzLjg4MDkxNCAtODAuMDExMzk2IDMzLjg3NDcxNCAtODAuMDExMzk2IDMzLjg3NDcxNCAtODAuMDExMzk2IDMzLjg3NDExNCAtODAuMDExMzk2IDMzLjg3MzMxNCAtODAuMDExOTk2IDMzLjg3MzMxNCAtODAuMDQxOTk3IDMzLjg2MjAxNCAtODAuMDQxOTk3IDMzLjg2MjAxNCAtODAuMDQxOTk3IDMzLjg2MTYxNCAtODAuMDUwNTk3IDMzLjg1MzIxNSAtODAuMDUwNTk3IDMzLjg1MjAxNSAtODAuMDgyMjk3IDMzLjgwNTUxNiAtODAuMDgyMjk3IDMzLjgwNTUxNiAtODAuMDg0NTk3IDMzLjgwMzIxNiAtODAuMDg0NzM1IDMzLjgwMjczMyAtODAuMDg0ODQ2IDMzLjgwMjM0NiAtODAuMDg1ODk2IDMzLjc5ODYzOCAtODAuMDg1ODk2IDMzLjc5ODYzOCAtODAuMDg2MDU4IDMzLjc5ODAxNyAtODAuMDg2NzM4IDMzLjc5NjA5IC04MC4wODY3MzggMzMuNzk2MDkgLTgwLjA4Njk5NyAzMy43OTU2MTYgLTgwLjA4Nzk5NyAzMy43OTQyMTYgLTgwLjA5MjI5NyAzMy43ODczMTYgLTgwLjA5MzE5NyAzMy43ODYwMTYgLTgwLjA5MzE5NyAzMy43ODYwMTYgLTgwLjA5ODY5MSAzMy43NzcyNzYgLTgwLjA5ODc5IDMzLjc3NjQyIC04MC4wOTg3MyAzMy43NzYzMDUgLTgwLjA5Nzg5NyAzMy43NzQ3MTYgLTgwLjA5Nzg5NyAzMy43NzQ3MTYgLTgwLjA5NzU5NyAzMy43NzQzMTYgLTgwLjA5NzU5NyAzMy43NzQzMTYgLTgwLjA5NzQyOCAzMy43NzQxMTUgLTgwLjA5NzQyOCAzMy43NzQxMTUgLTgwLjA5NzI2NSAzMy43NzM5MiAtODAuMDk3MjY1IDMzLjc3MzkyIC04MC4wOTY5OTcgMzMuNzczNDE2IC04MC4wOTY3NTIgMzMuNzczMDIgLTgwLjEwODE5MyAzMy43NTAwMTcgLTgwLjEyNTg5OCAzMy42OTcxMzYgLTgwLjEyNTg5OCAzMy42OTcxMzYgLTgwLjI0MzU0NiAzMy42ODQ4MDIgLTgwLjM1MjAwOCAzMy42NjY2NDkgLTgwLjQ3MzcwMiAzMy43MzU3MTQgLTgwLjUyNjQxNiAzMy45NTU5NDQgLTgwLjYyODg2MiAzMy45ODYxNTMgLTgwLjgwNTM3MiAzMy45NDcxNDUgLTgwLjk1MTcyMSAzMy45OTI4NTggLTgwLjk1MTcyMSAzMy45OTI4NTggLTgwLjkxNzMyMSAzNC4wOTAwMjcgLTgwLjgyMDg1MiAzNC4xNDg4MDYgLTgwLjcxNTc1NiAzNC4xNjgzMjIgLTgwLjYzMzM3IDM0LjI3MDU0NiA8L2dtbDpwb3NMaXN0PgorPC9nbWw6TGluZWFyUmluZz4KKzwvZ21sOm91dGVyQm91bmRhcnlJcz4KKzwvZ21sOlBvbHlnb24+CisKKzxnbWw6UG9seWdvbiBnbWw6aWQ9IlVTLUNBLTA2MDgzIj4KKzxnbWw6b3V0ZXJCb3VuZGFyeUlzPgorPGdtbDpMaW5lYXJSaW5nPgorPGdtbDpwb3NMaXN0Pi03MC40OTIyOSAzMy45ODMyMTUgLTcwLjkwNDgxMSAzMy45Mzk1MDQgLTgwLjAxNTUzNiAzMy44NzUwMDYgLTgwLjE5OTUxNCAzMy44NzUwMDIgLTgwLjI5ODkyNiAzMy45Njg0MTUgLTgwLjMzOTgyIDM0LjEyNDk5NCAtODAuMjUyOTUgMzQuMDU4MDk1IC03MC45OTE2NDMgMzQuMDY0ODY4IC03MC45NDc4MzUgMzQuMTI1MDAxIC03MC44Njg4MDQgMzQuMTI1MDAxIC03MC40NjgwNjQgMzQuMDYzMTM5IC03MC40NjgwNjQgMzQuMDYzMTM5IC03MC40ODY1MjEgMzQuMDAwMDAzIC03MC40OTIyOSAzMy45ODMyMTUgPC9nbWw6cG9zTGlzdD4KKzwvZ21sOkxpbmVhclJpbmc+Cis8Z21sOkxpbmVhclJpbmc+Cis8Z21sOnBvc0xpc3Q+LTgwLjU3MDY0NyAzNC45Nzc1MzcgLTgwLjQ4NDA1NiAzNC45OTE5NzYgLTgwLjM0NzM1NCAzNC45MzYwODEgLTgwLjMxMjkwOSAzNS4wMDU5ODMgLTgwLjI2Mjg1MiAzNS4wMjU1NCAtODAuMjYyODUyIDM1LjAyNTU0IC04MC4yNTk5MzkgMzUuMDI1OTE1IC04MC4yNTk5ODYgMzUuMDI1ODI5IC04MC4yNjAxNDMgMzUuMDI1NTQ0IC04MC4yNjAxNDMgMzUuMDI1NTQ0IC04MC4yNjEyNyAzNS4wMjE0MiAtODAuMjUzMjgyIDM1LjAyNzA5MiAtODAuMjI4MDIgMzUuMDIxNTQzIC04MC4yMjc3NjkgMzUuMDIxNzQ5IC04MC4yMjc3NjkgMzUuMDIxNzQ5IC04MC4xNDYyMjcgMzUuMDgzODc1IC04MC4wOTYzNDQgMzUuMTEwMjMxIC04MC4wOTMgMzUuMTE0MTA3IC04MC4wNjgwMDYgMzUuMDk3NDY4IC04MC4wNjgwMDYgMzUuMDk3NDY4IC04MC4wMTIzNzggMzUuMDc1NDg1IC03MC45NTk0NDUgMzUuMDU1NzIxIC03MC45MDY5NzIgMzUuMDM3OTEzIC03MC44ODY2MzcgMzUuMDQwMzkgLTcwLjg4NjYzNyAzNS4wNDAzOSAtNzAuNzg4NjYgMzQuOTg4NTE0IC03MC42OTY4MzcgMzQuOTc1MDQ1IC03MC42NDQyNjIgMzQuOTUzNTc1IC03MC41OTEzODMgMzQuOTMzNzMzIC03MC41OTEzODMgMzQuOTMzNzMzIC03MC41NDQwNTggMzQuOTAzMTc1IC03MC41MTU0OTIgMzQuODk3NzUgLTcwLjUxNDQ3OSAzNC44OTc3NTkgLTcwLjUwNTU3OCAzNC44OTc4MzYgLTcwLjUwNTU3OCAzNC44OTc4MzYgLTcwLjQ5MzQ4OCAzNC44OTc1NDcgLTcwLjQ5MDQ1NSAzNC44OTc0NzUgLTcwLjQ3NzgwNSAzNC45MDExNzQgLTcwLjQ3Mjc1NCAzNC45MDExNzQgLTcwLjQ3Mjc1NCAzNC45MDExNzQgLTcwLjQ2MTk2IDM0LjkwMTIxIC03MC40NDk1OTUgMzQuOTAxMjUgLTcwLjQ0MjM1MiAzNC45MDEyNzQgLTcwLjQ0MjM1MiAzNC45MDEyNzQgLTcwLjQ0MjE3NSAzNC44NDQ3ODUgLTcwLjQ0MjE1NCAzNC43OTA1OTIgLTcwLjQ0MjE1NCAzNC43ODgxNTIgLTcwLjQ0MjE1NCAzNC43ODcwOTQgLTcwLjQ0MjE1NCAzNC43ODcwOTQgLTcwLjQ0MTkxNyAzNC42NzYyODMgLTcwLjQ0MjM4NiAzNC41NzQ5MjUgLTcwLjQ0MjM1NCAzNC40NzgyOTIgLTcwLjQ1MzU1MyAzNC4zOTU4OTUgLTcwLjQ1MzU1MyAzNC4zOTU4OTUgLTcwLjQ3NjgzIDM0LjM3NDA3OCAtNzAuNDc2NjUzIDM0LjM3MzE5NSAtNzAuNDc3MzYzIDM0LjM3MTY4OSAtNzAuNTAwOTUzIDM0LjMyNjkyMiAtNzAuNTAwOTUzIDM0LjMyNjkyMiAtNzAuNjYwMDIxIDM0LjM1OTUxOCAtNzAuODYwMjI5IDM0LjM1NTY2MiAtODAuMDIyMzQ2IDM0LjQwODM0NyAtODAuMjI1NDkxIDM0LjQxODk4OCAtODAuNDE3Njk4IDM0LjM5NzU1MyAtODAuNTAwOTk2IDM0LjQwMzEzNiAtODAuNTg4MTY3IDM0LjQ5OTk4NSAtODAuNzAzODM2IDM0LjYyNDk4MyAtODAuNjk1NTU1IDM0Ljc3ODU1OSAtODAuNzAyNzk1IDM0Ljk5OTk3NSAtODAuNzAyNzk1IDM0Ljk5OTk3NSAtODAuNjQ5MTAzIDM0Ljk3NDU5OSAtODAuNTk0MTE3IDM0Ljk2NjU4NiAtODAuNTcxMjg3IDM0Ljk3NzY0NCAtODAuNTcwNjQ3IDM0Ljk3NzUzNyA8L2dtbDpwb3NMaXN0PgorPC9nbWw6TGluZWFyUmluZz4KKzxnbWw6TGluZWFyUmluZz4KKzxnbWw6cG9zTGlzdD4tNzAuMDAwOTMyIDMzLjUzNTg5NSAtNzAuMDAwOTMyIDMzLjUzNTg5NSAtNzAuMDAwOTMyIDMzLjUzNTg5NSAtNzAuMDAwOTMyIDMzLjUzNTg5NSA8L2dtbDpwb3NMaXN0PgorPC9nbWw6TGluZWFyUmluZz4KKzwvZ21sOm91dGVyQm91bmRhcnlJcz4KKzwvZ21sOlBvbHlnb24+CisKKzwvZ2VvcnNzOndoZXJlPgorPC9lbnRyeT4KKzwvTWFwPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9kYXRhL3NwYXRpYWwvZ2VvL3Rlc3RiYWRmb3JtYXRlcnJvci5nbWwgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL2RhdGEvc3BhdGlhbC9nZW8vdGVzdGJhZGZvcm1hdGVycm9yLmdtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWMyMDEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9kYXRhL3NwYXRpYWwvZ2VvL3Rlc3RiYWRmb3JtYXRlcnJvci5nbWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxNYXAgeG1sbnM6Z21sPSJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCIgeG1sbnM6Z2VvcnNzPSJodHRwOi8vd3d3Lmdlb3Jzcy5vcmcvZ2VvcnNzIj4KKzx0aXRsZT5VU0EgTGV2ZWwgMiBNYXA8L3RpdGxlPgorPHN1YlRpdGxlPkFkbWluaXN0cmF0aXZlIEJvdW5kYXJpZXM8L3N1YlRpdGxlPgorPHVwZGF0ZWQ+QXVnIDE2LCAyMDA2IDQ6MzE6MDggUE08L3VwZGF0ZWQ+Cis8ZW50cnk+Cis8Z2VvcnNzOndoZXJlPgorCis8LS0gVGhpcyBmaWxlIGhhcyBhbiBlcnJvciBpbiB0aGF0IHRoaXMgY29tbWVudCBpcyBpbmNvcnJlY3RseSBzcGVjaWZpZWQgLS0+CisKKzxnbWw6UG9seWdvbiBnbWw6aWQ9IlVTLUFMLTAxMDAxIj4KKzxnbWw6b3V0ZXJCb3VuZGFyeUlzPgorPGdtbDpMaW5lYXJSaW5nPgorPGdtbDpwb3NMaXN0Pi04Ni45MTY5NTYgMzIuNjY0MTU4IC04Ni44MTczNDQgIDwvZ21sOnBvc0xpc3Q+Cis8L2dtbDpMaW5lYXJSaW5nPgorPC9nbWw6b3V0ZXJCb3VuZGFyeUlzPgorPC9nbWw6UG9seWdvbj4KKworPC9nZW9yc3M6d2hlcmU+Cis8L2VudHJ5PgorPC9NYXA+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL2RhdGEvc3BhdGlhbC9nZW8vdGVzdGVsZW1lbnRlcnJvci5nbWwgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL2RhdGEvc3BhdGlhbC9nZW8vdGVzdGVsZW1lbnRlcnJvci5nbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJhMmRmNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvZGF0YS9zcGF0aWFsL2dlby90ZXN0ZWxlbWVudGVycm9yLmdtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPE1hcCB4bWxuczpnbWw9Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIiB4bWxuczpnZW9yc3M9Imh0dHA6Ly93d3cuZ2VvcnNzLm9yZy9nZW9yc3MiPgorPHRpdGxlPlVTQSBMZXZlbCAyIE1hcDwvdGl0bGU+Cis8c3ViVGl0bGU+QWRtaW5pc3RyYXRpdmUgQm91bmRhcmllczwvc3ViVGl0bGU+Cis8dXBkYXRlZD5BdWcgMTYsIDIwMDYgNDozMTowOCBQTTwvdXBkYXRlZD4KKzxlbnRyeT4KKzxnZW9yc3M6d2hlcmU+CisKKzwhLS0gVGhpcyBmaWxlIGhhcyBhbiBlcnJvciBpbiB0aGF0IGl0IGlzIG1pc3NpbmcgcG9seWdvbiBlbGVtZW50IC0tPgorCis8Z21sOm91dGVyQm91bmRhcnlJcz4KKzxnbWw6TGluZWFyUmluZz4KKzxnbWw6cG9zTGlzdD4tODYuOTE2OTU2IDMyLjY2NDE1OCAtODYuODE3MzQ0ICA8L2dtbDpwb3NMaXN0PgorPC9nbWw6TGluZWFyUmluZz4KKzwvZ21sOm91dGVyQm91bmRhcnlJcz4KKzwvZ21sOlBvbHlnb24+CisKKzwvZ2VvcnNzOndoZXJlPgorPC9lbnRyeT4KKzwvTWFwPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9kYXRhL3NwYXRpYWwvZ2VvL3Rlc3RsYXRsb25nZXJyb3IuZ21sIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9kYXRhL3NwYXRpYWwvZ2VvL3Rlc3RsYXRsb25nZXJyb3IuZ21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3N2RjZGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL2RhdGEvc3BhdGlhbC9nZW8vdGVzdGxhdGxvbmdlcnJvci5nbWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxNYXAgeG1sbnM6Z21sPSJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCIgeG1sbnM6Z2VvcnNzPSJodHRwOi8vd3d3Lmdlb3Jzcy5vcmcvZ2VvcnNzIj4KKzx0aXRsZT5VU0EgTGV2ZWwgMiBNYXA8L3RpdGxlPgorPHN1YlRpdGxlPkFkbWluaXN0cmF0aXZlIEJvdW5kYXJpZXM8L3N1YlRpdGxlPgorPHVwZGF0ZWQ+QXVnIDE2LCAyMDA2IDQ6MzE6MDggUE08L3VwZGF0ZWQ+Cis8ZW50cnk+Cis8Z2VvcnNzOndoZXJlPgorCis8IS0tIFRoaXMgZmlsZSBoYXMgYW4gZXJyb3IgaW4gdGhhdCB0aGUgbnVtYmVyIG9mIGxhdC9sb25nIGRhdGEgInBhaXJzIiBpcyBvZGQuIC0tPgorCis8Z21sOlBvbHlnb24gZ21sOmlkPSJVUy1BTC0wMTAwMSI+Cis8Z21sOm91dGVyQm91bmRhcnlJcz4KKzxnbWw6TGluZWFyUmluZz4KKzxnbWw6cG9zTGlzdD4tODYuOTE2OTU2IDMyLjY2NDE1OCAtODYuODE3MzQ0ICA8L2dtbDpwb3NMaXN0PgorPC9nbWw6TGluZWFyUmluZz4KKzwvZ21sOm91dGVyQm91bmRhcnlJcz4KKzwvZ21sOlBvbHlnb24+CisKKzwvZ2VvcnNzOndoZXJlPgorPC9lbnRyeT4KKzwvTWFwPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9kYXRhL3NwYXRpYWwvZ2VvL3Rlc3R3aGl0ZXNwYWNlLmdtbCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvZGF0YS9zcGF0aWFsL2dlby90ZXN0d2hpdGVzcGFjZS5nbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRlODJjOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvZGF0YS9zcGF0aWFsL2dlby90ZXN0d2hpdGVzcGFjZS5nbWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxNYXAgeG1sbnM6Z21sPSJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCIgeG1sbnM6Z2VvcnNzPSJodHRwOi8vd3d3Lmdlb3Jzcy5vcmcvZ2VvcnNzIj4KKzx0aXRsZT5VU0EgTGV2ZWwgMiBNYXA8L3RpdGxlPgorPHN1YlRpdGxlPkFkbWluaXN0cmF0aXZlIEJvdW5kYXJpZXM8L3N1YlRpdGxlPgorPHVwZGF0ZWQ+QXVnIDE2LCAyMDA2IDQ6MzE6MDggUE08L3VwZGF0ZWQ+Cis8ZW50cnk+Cis8Z2VvcnNzOndoZXJlPgorCis8IS0tIFRoaXMgZmlsZSBoYXMgZGlmZmVyZW50IGtpbmRzIG9mIHdoaXRlIHNwYWNlIGJldHdlZW4gdGhlIGxhdC9sb25nIGRhdGEgInBhaXJzIi4gLS0+CisKKzxnbWw6UG9seWdvbiBnbWw6aWQ9IlVTLUFMLTAxMDAxIj4KKzxnbWw6b3V0ZXJCb3VuZGFyeUlzPgorPGdtbDpMaW5lYXJSaW5nPgorPGdtbDpwb3NMaXN0Pi04Ni45MTY5NTYgCiszMi42NjQxNTggLTg2LjgxNzM0NCAJMzMuNjY0MTU4IDwvZ21sOnBvc0xpc3Q+Cis8L2dtbDpMaW5lYXJSaW5nPgorPC9nbWw6b3V0ZXJCb3VuZGFyeUlzPgorPC9nbWw6UG9seWdvbj4KKworPC9nZW9yc3M6d2hlcmU+Cis8L2VudHJ5PgorPC9NYXA+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNGIxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoreG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKK3htbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPGxpbmsgcmVsPUZpbGUtTGlzdAoraHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOkRvY3VtZW50UHJvcGVydGllcz4KKyAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KKyAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgorICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+CisgIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+CisgIDxvOlBhZ2VzPjQ8L286UGFnZXM+CisgIDxvOldvcmRzPjE2MjY8L286V29yZHM+CisgIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgorICAgPG86TGluZXM+Nzc8L286TGluZXM+CisgIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KKyAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+CisgIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+CisgPC9vOkRvY3VtZW50UHJvcGVydGllcz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OldvcmREb2N1bWVudD4KKyAgPHc6VHJhY2tSZXZpc2lvbnMvPgorIDwvdzpXb3JkRG9jdW1lbnQ+Cis8L3htbD48IVtlbmRpZl0tLT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlRhaG9tYTsKKwlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKKwltc28tZm9udC1jaGFyc2V0OjA7CisJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7CisJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7CisJbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KK3AuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bXNvLXN0eWxlLXBhcmVudDoiIjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwCisJe21hcmdpbi1yaWdodDowaW47CisJbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CisJbWFyZ2luLWxlZnQ6MGluOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKKwl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZTo4LjBwdDsKKwlmb250LWZhbWlseTpUYWhvbWE7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorQHBhZ2UgU2VjdGlvbjEKKwl7c2l6ZTo4LjVpbiAxMS4waW47CisJbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47CisJbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKKwltc28tZm9vdGVyLW1hcmdpbjouNWluOworCW1zby1wYXBlci1zb3VyY2U6MDt9CitkaXYuU2VjdGlvbjEKKwl7cGFnZTpTZWN0aW9uMTt9CistLT4KKzwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgorPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCitUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAorUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCitPRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCithZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKK3N1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKK2J5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgoraWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KK3N1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCit3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKK2VudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKK2NsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCitvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucworZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KK3JlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50CithIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KK3N0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5CitkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCitSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAorYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCitjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgorb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKK2J5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCit0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCithbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCitSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCitDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgordGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Citmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQordG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKK2lmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKK3RoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQorRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKK3JpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KK3RoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Cis8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK2l0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAorY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQorYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKK2FuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCitlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAoraW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAorYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCitzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0CitDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCitzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCitpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCitjb2RlIGZvcm06PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQorY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQorY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCitvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQorYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycworYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKK29mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAorbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCitDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKK2Nvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCit0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCitjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKK3RvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK3RvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCithbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQoraW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCit3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcworc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCitvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCitjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKK1dJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKK01FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQorUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcworQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKK2VxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgorVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgorVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKK29yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKK2Z1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgorYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAorb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCitzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCitwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQorY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKK3RoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKK0FncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCitzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAorZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCitTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCitBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKK0FncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKK2l0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9ub3RpY2UuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvbm90aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhZjk2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvbm90aWNlLmh0bWwKQEAgLTAsMCArMSw3OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5NYXJjaCAxNywgMjAwNTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisgICAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKKyAgIAorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCisgICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKyAgIAorPHVsPgorCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucworICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPiAgIAorIAorPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisJCQorPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisJPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQorCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisgICAKKzxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyZTM3ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNiBAQAorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFRvIGNvZGUgZGV2ZWxvcGVyOgorIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQorIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCisjICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCisjICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3BsdWdpbk5hbWUgPSBTVEVNIERlZmluaXRpb25zIFRlc3QgU3VpdGUKK3Byb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvcmVsYXRpdmV2YWx1ZS9SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3JlbGF0aXZldmFsdWUvUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ODJkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3JlbGF0aXZldmFsdWUvUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8vIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbFRlc3QuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0IHRlc3QgY2FzZSBmb3IKKyAqIHtAbGluayBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGx9LgorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK2ZpbmFsIHB1YmxpYyBjbGFzcyBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGxUZXN0IGV4dGVuZHMKKwkJUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0IHsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGZpeHR1cmUgZm9yIHRlc3RpbmcKKwkgKi8KKwlwdWJsaWMgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgY3JlYXRlRml4dHVyZSgpIHsKKwkJcmV0dXJuIG5ldyBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGwoKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3QgdGFyZ2V0LCBPYmplY3QgdHlwZSkgeworCQkJCXJldHVybiBuZXcgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0aWVzKCkgeworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIGRvdWJsZSBnZXRSZWxhdGl2ZVZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCQkKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBkb3VibGUgZ2V0RGVub21pbmF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJCQkJCXJldHVybiAwLjA7CisJCQkJCX0KKwkJCQkJCisJCQkJfTsKKwkJCX0gLy8gYWRhcHQKKwkJfTsKKwl9IC8vIGNyZWF0ZUZpeHR1cmUKKworfSAvLyBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3JlbGF0aXZldmFsdWUvUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3JlbGF0aXZldmFsdWUvUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhhNDRkOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvcmVsYXRpdmV2YWx1ZS9SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvLyBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0IHRlc3QgY2FzZSBmb3IgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsCisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHVuZGVyIHRlc3QuIFRoZSB2YWx1ZSBpcyBzZXQgaW4gdGhlCisJICogPGNvZGU+c2V0VXA8L2NvZGU+IG1ldGhvZCBvZiBhIGRlcml2ZWQgY2xhc3MuCisJICovCisJcHJvdGVjdGVkIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGZpeHR1cmUgPSBudWxsOworCisJQFN1cHByZXNzV2FybmluZ3MoInVucXVhbGlmaWVkLWZpZWxkLWFjY2VzcyIpCisJcHJpdmF0ZSBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9IC8vIFNwYXRpYWxQcm92aWRlckFkYXB0ZXJGYWN0b3J5CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKGZpbmFsIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9IC8vIHNldEZpeHR1cmUKKworCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsI2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RJc0ZhY3RvcnlGb3JUeXBlT2JqZWN0KCkgeworCQlmaW5hbCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGZpeHR1cmUuaXNGYWN0b3J5Rm9yVHlwZShSZWxhdGl2ZVZhbHVlUHJvdmlkZXIuY2xhc3MpKTsKKwl9IC8vIHRlc3RJc0ZhY3RvcnlGb3JUeXBlT2JqZWN0CisKK30gLy8gUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3JlbGF0aXZldmFsdWUvUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvcmVsYXRpdmV2YWx1ZS9SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MWEyNGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3JlbGF0aXZldmFsdWUvUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvLyBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyVGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0IHRlc3QgY2FzZSBmb3IgPGNvZGU+UmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcjwvY29kZT4ncy4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgYWRhcHRlciB1bmRlciB0ZXN0LiBUaGUgdmFsdWUgaXMgc2V0IGluIHRoZQorCSAqIDxjb2RlPnNldFVwPC9jb2RlPiBtZXRob2Qgb2YgYSBkZXJpdmVkIGNsYXNzLgorCSAqLworCXByb3RlY3RlZCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyIGZpeHR1cmUgPSBudWxsOworCisJQFN1cHByZXNzV2FybmluZ3MoInVucXVhbGlmaWVkLWZpZWxkLWFjY2VzcyIpCisJcHJpdmF0ZSBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0gLy8gZ2V0Rml4dHVyZQorCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShmaW5hbCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9IC8vIHNldEZpeHR1cmUKKworCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvcgorCSAqIHtAbGluayBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoT2JqZWN0KX0KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0SXNBZGFwdGVyRm9yVHlwZSgpIHsKKwkJZmluYWwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGZpeHR1cmUuaXNBZGFwdGVyRm9yVHlwZShSZWxhdGl2ZVZhbHVlUHJvdmlkZXIuY2xhc3MpKTsKKwl9IC8vIHRlc3RJc0FkYXB0ZXJGb3JUeXBlCisKK30gLy8gUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvcmVsYXRpdmV2YWx1ZS9oaXN0b3J5L1JlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3JlbGF0aXZldmFsdWUvaGlzdG9yeS9SZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YTViM2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3JlbGF0aXZldmFsdWUvaGlzdG9yeS9SZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvLyBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsVGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5oaXN0b3J5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbFRlc3QgZXh0ZW5kcworCQlSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0IHsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGZpeHR1cmUgZm9yIHRlc3RpbmcKKwkgKi8KKwlwdWJsaWMgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUZpeHR1cmUoKSB7CisJCXJldHVybiBuZXcgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5LlJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGwoKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3QgdGFyZ2V0LCBPYmplY3QgdHlwZSkgeworCQkJCXJldHVybiBuZXcgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXIoKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydGllcygpIHsKKwkJCQkJCXJldHVybiBudWxsOworCQkJCQl9CisJCQkJCQorCisJCQkJCXB1YmxpYyBkb3VibGVbXSBnZXRIaXN0b3JpY0luc3RhbmNlcygKKwkJCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5LAorCQkJCQkJCVNURU1UaW1lW10gdGltZVJhbmdlKSB7CisJCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQorCisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBkb3VibGUgZ2V0UmVsYXRpdmVWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIGRvdWJsZVtdIGdldEFsbEhpc3RvcmljUmVsYXRpdmVWYWx1ZXMoCisJCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJCQkJCXJldHVybiBuZXcgZG91YmxlWzBdOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBTVEVNVGltZVtdIGdldEFsbEhpc3RvcmljVGltZVZhbHVlcygpIHsKKwkJCQkJCXJldHVybiBuZXcgU1RFTVRpbWVbMF07CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIFNURU1UaW1lIGdldEVhcmxpZXN0VGltZVZhbHVlKCkgeworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIGRvdWJsZSBnZXRSZWxhdGl2ZVZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAorCQkJCQkJCVNURU1UaW1lIHRpbWUpIHsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJCQorCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIGRvdWJsZSBnZXREZW5vbWluYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQkJCQkJcmV0dXJuIDAuMDsKKwkJCQkJfQorCQkJCQkKKworCQkJCQlwdWJsaWMgaW50IGdldEVhcmxpZXN0Q3ljbGVOdW1iZXIoKSB7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCX07CisJCQl9IC8vIGFkYXB0CisJCX07CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKK30gLy8gUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvcmVsYXRpdmV2YWx1ZS9oaXN0b3J5L1JlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvcmVsYXRpdmV2YWx1ZS9oaXN0b3J5L1JlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjc2MTg4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9yZWxhdGl2ZXZhbHVlL2hpc3RvcnkvUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8vIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0IHRlc3QgY2FzZSBmb3IKKyAqIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeQorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHVuZGVyIHRlc3QuIFRoZSB2YWx1ZSBpcyBzZXQgaW4gdGhlCisJICogPGNvZGU+c2V0VXA8L2NvZGU+IG1ldGhvZCBvZiBhIGRlcml2ZWQgY2xhc3MuCisJICovCisJcHJvdGVjdGVkIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBmaXh0dXJlID0gbnVsbDsKKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnF1YWxpZmllZC1maWVsZC1hY2Nlc3MiKQorCXByaXZhdGUgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0gLy8gZ2V0Rml4dHVyZQorCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShmaW5hbCBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0gLy8gc2V0Rml4dHVyZQorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5oaXN0b3J5LlJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGwjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdElzRmFjdG9yeUZvclR5cGVPYmplY3QoKSB7CisJCWZpbmFsIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGZpeHR1cmUuaXNGYWN0b3J5Rm9yVHlwZShSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyLmNsYXNzKSk7CisJfSAvLyB0ZXN0SXNGYWN0b3J5Rm9yVHlwZU9iamVjdAorCit9IC8vIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvcmVsYXRpdmV2YWx1ZS9oaXN0b3J5L1JlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9yZWxhdGl2ZXZhbHVlL2hpc3RvcnkvUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkZjk3ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvcmVsYXRpdmV2YWx1ZS9oaXN0b3J5L1JlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8vIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyVGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5oaXN0b3J5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgSlVuaXQgdGVzdCBjYXNlIGZvcgorICogPGNvZGU+UmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXI8L2NvZGU+J3MuCisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJLyoqCisJICogVGhpcyBpcyB0aGUgYWRhcHRlciB1bmRlciB0ZXN0LiBUaGUgdmFsdWUgaXMgc2V0IGluIHRoZQorCSAqIDxjb2RlPnNldFVwPC9jb2RlPiBtZXRob2Qgb2YgYSBkZXJpdmVkIGNsYXNzLgorCSAqLworCXByb3RlY3RlZCBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlciBmaXh0dXJlID0gbnVsbDsKKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnF1YWxpZmllZC1maWVsZC1hY2Nlc3MiKQorCXByaXZhdGUgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfSAvLyBTcGF0aWFsUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQorCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShmaW5hbCBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlciBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfSAvLyBzZXRGaXh0dXJlCisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShPYmplY3QpfQorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RJc0FkYXB0ZXJGb3JUeXBlKCkgeworCQlmaW5hbCBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGZpeHR1cmUuaXNBZGFwdGVyRm9yVHlwZShSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyLmNsYXNzKSk7CisJfSAvLyB0ZXN0SXNBZGFwdGVyRm9yVHlwZQorCit9IC8vIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL1NwYXRpYWxQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL1NwYXRpYWxQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZmY3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3NwYXRpYWwvU3BhdGlhbFByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSwzNCBAQAorLy8gU3BhdGlhbFByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBKVW5pdCB0ZXN0IGNhc2UgZm9yIFNwYXRpYWxQcm92aWRlckFkYXB0ZXJGYWN0b3J5LgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgU3BhdGlhbFByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJcHJvdGVjdGVkIFNwYXRpYWxQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGZpeHR1cmU7CisKKwlAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bnF1YWxpZmllZC1maWVsZC1hY2Nlc3MiIH0pCisJcHJpdmF0ZSBTcGF0aWFsUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9IC8vIFNwYXRpYWxQcm92aWRlckFkYXB0ZXJGYWN0b3J5CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKGZpbmFsIFNwYXRpYWxQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9IC8vIHNldEZpeHR1cmUKKworfSAvLyBTcGF0aWFsUHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9TcGF0aWFsUHJvdmlkZXJBZGFwdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL1NwYXRpYWxQcm92aWRlckFkYXB0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiMzRkMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9TcGF0aWFsUHJvdmlkZXJBZGFwdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8vIFNwYXRpYWxQcm92aWRlckFkYXB0ZXJUZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBKVW5pdCB0ZXN0IGNhc2UgZm9yIFNwYXRpYWxQcm92aWRlckFkYXB0ZXIuCisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBTcGF0aWFsUHJvdmlkZXJBZGFwdGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCXByb3RlY3RlZCBTcGF0aWFsUHJvdmlkZXJBZGFwdGVyIGZpeHR1cmUgPSBudWxsOworCisJQFN1cHByZXNzV2FybmluZ3MoInVucXVhbGlmaWVkLWZpZWxkLWFjY2VzcyIpCisJcHJpdmF0ZSBmaW5hbCBTcGF0aWFsUHJvdmlkZXJBZGFwdGVyIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEZpeHR1cmUoU3BhdGlhbFByb3ZpZGVyQWRhcHRlciBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yIGlzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0SXNBZGFwdGVyRm9yVHlwZU9iamVjdCgpIHsKKwkJZmluYWwgU3BhdGlhbFByb3ZpZGVyQWRhcHRlciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGZpeHR1cmUuaXNBZGFwdGVyRm9yVHlwZShTcGF0aWFsUHJvdmlkZXIuY2xhc3MpKTsKKwl9IC8vIHRlc3RJc0FkYXB0ZXJGb3JUeXBlT2JqZWN0CisKK30gLy8gU3BhdGlhbFByb3ZpZGVyQWRhcHRlclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vSW5saW5lTGF0TG9uZ0RhdGFQcm92aWRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vSW5saW5lTGF0TG9uZ0RhdGFQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjNhMWM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9JbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTg0IEBACisvLyBJbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyVGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW87CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuU3BhdGlhbFByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmcuU2VnbWVudDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgSlVuaXQgdGVzdCBmb3IgSW5saW5lTGF0TG9uZ0RhdGFQcm92aWRlci4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgSW5saW5lTGF0TG9uZ0RhdGFQcm92aWRlclRlc3QgZXh0ZW5kcyBMYXRMb25nRGF0YVByb3ZpZGVyVGVzdCB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9JTkxJTkVfTEFUX0xPTkdfVVJJX1NUUklOR19NSVNNQVRDSF9FUlJPUjEgPSBJbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyLklOTElORV9TQ0hFTUUKKwkJCSsgIjovLy8wLDAsOTAsOTAsMCI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9JTkxJTkVfTEFUX0xPTkdfVVJJX1NUUklOR19NSVNNQVRDSF9FUlJPUjIgPSBJbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyLklOTElORV9TQ0hFTUUKKwkJCSsgIjovLy8wLDAsOTAsOTAsMCwiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfSU5MSU5FX0xBVF9MT05HX1VSSV9TVFJJTkdfTlVNQkVSX0ZPUk1BVF9FUlJPUiA9IElubGluZUxhdExvbmdEYXRhUHJvdmlkZXIuSU5MSU5FX1NDSEVNRQorCQkJKyAiOi8vLzAsYWJjLDkwLDkwLDAsMCI7CisKKwkvKioKKwkgKiBUZXN0IHN0cmluZworCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRFU1RfSU5MSU5FX0xBVF9MT05HX1VSSV9TVFJJTkcxID0gSW5saW5lTGF0TG9uZ0RhdGFQcm92aWRlci5JTkxJTkVfU0NIRU1FCisJCQkrICI6Ly8vMC4wMCwwLjAwLDkwLjAwLDkwLjAwLDAuMDAsOTAuMDAvMTAuMDAsMTUuMDAsMTAuMDAsMjAuMDAsMjAuMDAsMjAuMDAsNDAuMDAsNDAuMDAiOworCisJQFN1cHByZXNzV2FybmluZ3MoInVucXVhbGlmaWVkLWZpZWxkLWFjY2VzcyIpCisJcHJpdmF0ZSBJbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoSW5saW5lTGF0TG9uZ0RhdGFQcm92aWRlcikgZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShuZXcgSW5saW5lTGF0TG9uZ0RhdGFQcm92aWRlcigpKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICovCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLklubGluZUxhdExvbmdEYXRhUHJvdmlkZXIjZ2V0TGF0TG9uZyhvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldExhdExvbmcxKCkgeworCQlmaW5hbCBJbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCUxhdExvbmcgcmVzdWx0ID0gZml4dHVyZS5nZXRMYXRMb25nKFVSSQorCQkJCS5jcmVhdGVVUkkoVEVTVF9JTkxJTkVfTEFUX0xPTkdfVVJJX1NUUklORzEpKTsKKwkJYXNzZXJ0VHJ1ZShyZXN1bHQuc2l6ZSgpID09IDIpOworCQl2ZXJpZnlJbmxpbmVMYXRMb25nUmVzdWx0KHJlc3VsdCk7CisJfSAvLyB0ZXN0R2V0TGF0TG9uZzEKKworCS8qKgorCSAqIEBwYXJhbSByZXN1bHQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5SW5saW5lTGF0TG9uZ1Jlc3VsdChMYXRMb25nIHJlc3VsdCkgeworCQlTZWdtZW50IGxhdExvbmcwID0gbnVsbDsKKwkJU2VnbWVudCBsYXRMb25nMSA9IG51bGw7CisJCWlmIChyZXN1bHQuZ2V0U2VnbWVudHMoKS5nZXQoMCkuc2l6ZSgpID09IDMpIHsKKwkJCWxhdExvbmcwID0gcmVzdWx0LmdldFNlZ21lbnRzKCkuZ2V0KDApOworCQkJbGF0TG9uZzEgPSByZXN1bHQuZ2V0U2VnbWVudHMoKS5nZXQoMSk7CisKKwkJfSBlbHNlIHsKKwkJCWxhdExvbmcwID0gcmVzdWx0LmdldFNlZ21lbnRzKCkuZ2V0KDEpOworCQkJbGF0TG9uZzEgPSByZXN1bHQuZ2V0U2VnbWVudHMoKS5nZXQoMCk7CisJCX0KKworCQkvLyAtLS0gbGF0TG9uZzAKKwkJYXNzZXJ0VHJ1ZShsYXRMb25nMC5sYXRpdHVkZSgwKSA9PSAwLjApOworCQlhc3NlcnRUcnVlKGxhdExvbmcwLmxvbmdpdHVkZSgwKSA9PSAwLjApOworCisJCWFzc2VydFRydWUobGF0TG9uZzAubGF0aXR1ZGUoMSkgPT0gOTAuMCk7CisJCWFzc2VydFRydWUobGF0TG9uZzAubG9uZ2l0dWRlKDEpID09IDkwLjApOworCisJCWFzc2VydFRydWUobGF0TG9uZzAubGF0aXR1ZGUoMikgPT0gMC4wKTsKKwkJYXNzZXJ0VHJ1ZShsYXRMb25nMC5sb25naXR1ZGUoMikgPT0gOTAuMCk7CisKKwkJLy8gLS0tIGxhdExvbmcxCisJCWFzc2VydFRydWUobGF0TG9uZzEubGF0aXR1ZGUoMCkgPT0gMTAuMCk7CisJCWFzc2VydFRydWUobGF0TG9uZzEubG9uZ2l0dWRlKDApID09IDE1LjApOworCisJCWFzc2VydFRydWUobGF0TG9uZzEubGF0aXR1ZGUoMSkgPT0gMTAuMCk7CisJCWFzc2VydFRydWUobGF0TG9uZzEubG9uZ2l0dWRlKDEpID09IDIwLjApOworCisJCWFzc2VydFRydWUobGF0TG9uZzEubGF0aXR1ZGUoMikgPT0gMjAuMCk7CisJCWFzc2VydFRydWUobGF0TG9uZzEubG9uZ2l0dWRlKDIpID09IDIwLjApOworCisJCWFzc2VydFRydWUobGF0TG9uZzEubGF0aXR1ZGUoMykgPT0gNDAuMCk7CisJCWFzc2VydFRydWUobGF0TG9uZzEubG9uZ2l0dWRlKDMpID09IDQwLjApOworCisJfSAvLyB2ZXJpZnlJbmxpbmVMYXRMb25nUmVzdWx0CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLklubGluZUxhdExvbmdEYXRhUHJvdmlkZXIjZ2V0TGF0TG9uZyhvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldExhdExvbmdNaXNtYXRjaEVycm9yKCkgeworCQlJbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCXRyeSB7CisJCQlMYXRMb25nIHJlc3VsdDEgPSBmaXh0dXJlCisJCQkJCS5nZXRMYXRMb25nKFVSSQorCQkJCQkJCS5jcmVhdGVVUkkoVEVTVF9JTkxJTkVfTEFUX0xPTkdfVVJJX1NUUklOR19NSVNNQVRDSF9FUlJPUjEpKTsKKwkJCWFzc2VydFRydWUocmVzdWx0MS5zaXplKCkgPT0gMCk7CisJCX0gLy8gdHJ5CisJCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKwkJCS8vIGV4cGVjdGVkCisJCX0KKwkJdHJ5IHsKKwkJCUxhdExvbmcgcmVzdWx0MiA9IGZpeHR1cmUKKwkJCQkJLmdldExhdExvbmcoVVJJCisJCQkJCQkJLmNyZWF0ZVVSSShURVNUX0lOTElORV9MQVRfTE9OR19VUklfU1RSSU5HX01JU01BVENIX0VSUk9SMikpOworCQkJYXNzZXJ0VHJ1ZShyZXN1bHQyLnNpemUoKSA9PSAwKTsKKwkJfSAvLyB0cnkKKwkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworCQkJLy8gZXhwZWN0ZWQKKwkJfQorCX0gLy8gdGVzdEdldExhdExvbmdNaXNtYXRjaEVycm9yCisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLklubGluZUxhdExvbmdEYXRhUHJvdmlkZXIjZ2V0TGF0TG9uZyhvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldExhdExvbmdOdW1iZXJGb3JtYXRFcnJvcigpIHsKKwkJSW5saW5lTGF0TG9uZ0RhdGFQcm92aWRlciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQl0cnkgeworCQkJTGF0TG9uZyByZXN1bHQxID0gZml4dHVyZQorCQkJCQkuZ2V0TGF0TG9uZyhVUkkKKwkJCQkJCQkuY3JlYXRlVVJJKFRFU1RfSU5MSU5FX0xBVF9MT05HX1VSSV9TVFJJTkdfTlVNQkVSX0ZPUk1BVF9FUlJPUikpOworCQkJYXNzZXJ0VHJ1ZShyZXN1bHQxLnNpemUoKSA9PSAwKTsKKwkJfSAvLyB0cnkKKwkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworCQkJLy8gZXhwZWN0ZWQKKwkJfQorCisJfSAvLyB0ZXN0R2V0TGF0TG9uZ051bWJlckZvcm1hdEVycm9yCisKKwkvKioKKwkgKiBUZXN0IHRoYXQgd2UgY2FuIGNyZWF0ZSB0aGUgaW5saW5lIFVSSSBzdHJpbmcgZnJvbSB0aGUgc2VnbWVudCBhcnJheXMKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlSW5saW5lVVJJU3RyaW5nKCkgeworCQlmaW5hbCBJbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCUxhdExvbmcgcmVzdWx0ID0gZml4dHVyZS5nZXRMYXRMb25nKFVSSQorCQkJCS5jcmVhdGVVUkkoVEVTVF9JTkxJTkVfTEFUX0xPTkdfVVJJX1NUUklORzEpKTsKKwkJZmluYWwgU3RyaW5nIHJlc3VsdFN0cmluZyA9IElubGluZUxhdExvbmdEYXRhUHJvdmlkZXIKKwkJCQkuY3JlYXRlSW5saW5lVVJJU3RyaW5nKHJlc3VsdCk7CisJCWFzc2VydFRydWUocmVzdWx0U3RyaW5nLmVxdWFscyhURVNUX0lOTElORV9MQVRfTE9OR19VUklfU1RSSU5HMSkpOworCX0gLy8gdGVzdENyZWF0ZUlubGluZVVSSVN0cmluZworCisJLyoqCisJICogVGVzdCB0aGF0IHdlIGNhbiBjcmVhdGUgdGhlIHNwYXRpYWwgaW5saW5lIFVSSSBzdHJpbmcgZnJvbSB0aGUgc2VnbWVudAorCSAqIGFycmF5cworCSAqLworCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTcGF0aWFsSW5saW5lVVJJU3RyaW5nKCkgeworCQlmaW5hbCBJbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCUxhdExvbmcgcmVzdWx0ID0gZml4dHVyZS5nZXRMYXRMb25nKFVSSQorCQkJCS5jcmVhdGVVUkkoVEVTVF9JTkxJTkVfTEFUX0xPTkdfVVJJX1NUUklORzEpKTsKKwkJZmluYWwgU3RyaW5nIHJlc3VsdFN0cmluZyA9IElubGluZUxhdExvbmdEYXRhUHJvdmlkZXIKKwkJCQkuY3JlYXRlU3BhdGlhbElubGluZVVSSVN0cmluZyhyZXN1bHQpOworCQlhc3NlcnRUcnVlKHJlc3VsdFN0cmluZworCQkJCS5zdGFydHNXaXRoKFNwYXRpYWxQcm92aWRlckFkYXB0ZXIuU1RFTV9TUEFUSUFMX1NDSEVNRV9QUkVGSVgpKTsKKwkJYXNzZXJ0VHJ1ZShyZXN1bHRTdHJpbmcuZW5kc1dpdGgoVEVTVF9JTkxJTkVfTEFUX0xPTkdfVVJJX1NUUklORzEpKTsKKwkJYXNzZXJ0VHJ1ZShyZXN1bHRTdHJpbmcubGVuZ3RoKCkgPT0gKFRFU1RfSU5MSU5FX0xBVF9MT05HX1VSSV9TVFJJTkcxCisJCQkJLmxlbmd0aCgpICsgU3BhdGlhbFByb3ZpZGVyQWRhcHRlci5TVEVNX1NQQVRJQUxfU0NIRU1FX1BSRUZJWAorCQkJCS5sZW5ndGgoKSkpOworCX0gLy8gdGVzdENyZWF0ZVNwYXRpYWxJbmxpbmVVUklTdHJpbmcKK30gLy8gSW5saW5lTGF0TG9uZ0RhdGFQcm92aWRlclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vTGF0TG9uZ0RhdGFQcm92aWRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vTGF0TG9uZ0RhdGFQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2YzZTU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9MYXRMb25nRGF0YVByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8vIExhdExvbmdEYXRhUHJvdmlkZXJUZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlbzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0IHRlc3QgZm9yIExhdExvbmdEYXRhUHJvdmlkZXIuCisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBMYXRMb25nRGF0YVByb3ZpZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCXByb3RlY3RlZCBMYXRMb25nRGF0YVByb3ZpZGVyIGZpeHR1cmU7CisKKwlwcml2YXRlIGZpbmFsIExhdExvbmdEYXRhUHJvdmlkZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0Rml4dHVyZShMYXRMb25nRGF0YVByb3ZpZGVyIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9IC8vIHNldEZpeHR1cmUKKworfSAvLyBMYXRMb25nRGF0YVByb3ZpZGVyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9MYXRMb25nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJiYzE1MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLy8gTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlbzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5TcGF0aWFsUHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0IHRlc3QgY2FzZSBmb3IgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIExhdExvbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdCBleHRlbmRzCisJCVNwYXRpYWxQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdCB7CisKKwlwcml2YXRlIExhdExvbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkpIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobmV3IExhdExvbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCX0KKworCS8qKgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdElzRmFjdG9yeUZvclR5cGVPYmplY3QoKSB7CisJCWZpbmFsIExhdExvbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoZml4dHVyZS5pc0ZhY3RvcnlGb3JUeXBlKExhdExvbmdQcm92aWRlci5jbGFzcykpOworCX0gLy8gdGVzdElzRmFjdG9yeUZvclR5cGVPYmplY3QKKworCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQWRhcHRlcihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcil9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBZGFwdGVyTm90aWZpZXIoKSB7CisJCWZpbmFsIE5vZGUgbm9kZSA9IEdyYXBoRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTm9kZSgpOworCQlub2RlLmdldER1YmxpbkNvcmUoKS5zZXRTcGF0aWFsKAorCQkJCUxhdExvbmdQcm92aWRlckFkYXB0ZXJUZXN0LlNQQVRJQUxfSU5MSU5FX1RFU1RfVVJJX1NUUklORyk7CisKKwkJZmluYWwgTGF0TG9uZ1Byb3ZpZGVyIGxhdExvbmdQcm92aWRlciA9IChMYXRMb25nUHJvdmlkZXIpIExhdExvbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJLmFkYXB0KG5vZGUsIExhdExvbmdQcm92aWRlci5jbGFzcyk7CisKKwkJZmluYWwgTGF0TG9uZyByZXN1bHQgPSBsYXRMb25nUHJvdmlkZXIuZ2V0TGF0TG9uZygpOworCQlJbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyVGVzdC52ZXJpZnlJbmxpbmVMYXRMb25nUmVzdWx0KHJlc3VsdCk7CisJfSAvLyB0ZXN0Q3JlYXRlQWRhcHRlck5vdGlmaWVyCisKK30gLy8gTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3NwYXRpYWwvZ2VvL0xhdExvbmdQcm92aWRlckFkYXB0ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3NwYXRpYWwvZ2VvL0xhdExvbmdQcm92aWRlckFkYXB0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0Mjk0ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDc5IEBACisvLyBMYXRMb25nUHJvdmlkZXJBZGFwdGVyVGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW87CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuU3BhdGlhbFByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuU3BhdGlhbFByb3ZpZGVyQWRhcHRlclRlc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0IHRlc3QgY2FzZSBmb3IgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlci4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlclRlc3QgZXh0ZW5kcyBTcGF0aWFsUHJvdmlkZXJBZGFwdGVyVGVzdCB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFUSUFMX0lOTElORV9URVNUX1VSSV9TVFJJTkcgPSBTcGF0aWFsUHJvdmlkZXJBZGFwdGVyLlNURU1fU1BBVElBTF9TQ0hFTUUKKwkJCSsgIjoiCisJCQkrIElubGluZUxhdExvbmdEYXRhUHJvdmlkZXJUZXN0LlRFU1RfSU5MSU5FX0xBVF9MT05HX1VSSV9TVFJJTkcxOworCisJcHJpdmF0ZSBMYXRMb25nUHJvdmlkZXJBZGFwdGVyIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlcikgZml4dHVyZTsKKwl9IC8vIExhdExvbmdQcm92aWRlckFkYXB0ZXIKKworCS8qKgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlmaW5hbCBMYXRMb25nUHJvdmlkZXJBZGFwdGVyIHRlbXAgPSBuZXcgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlcigpOworCQlmaW5hbCBOb2RlIG5vZGUgPSBHcmFwaEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU5vZGUoKTsKKwkJbm9kZS5nZXREdWJsaW5Db3JlKCkuc2V0U3BhdGlhbChTUEFUSUFMX0lOTElORV9URVNUX1VSSV9TVFJJTkcpOworCQl0ZW1wLnNldFRhcmdldChub2RlKTsKKwkJc2V0Rml4dHVyZSh0ZW1wKTsKKwl9IC8vIHNldFVwCisKKwkvKioKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0SXNBZGFwdGVyRm9yVHlwZSgpIHsKKwkJZmluYWwgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGZpeHR1cmUuaXNBZGFwdGVyRm9yVHlwZShMYXRMb25nUHJvdmlkZXIuY2xhc3MpKTsKKwl9IC8vIHRlc3RJc0FkYXB0ZXJGb3JUeXBlCisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLkxhdExvbmdQcm92aWRlckFkYXB0ZXIjZ2V0TGF0TG9uZygpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TGF0TG9uZygpIHsKKwkJZmluYWwgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBMYXRMb25nIHJlc3VsdCA9IGZpeHR1cmUuZ2V0TGF0TG9uZygpOworCQlJbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyVGVzdC52ZXJpZnlJbmxpbmVMYXRMb25nUmVzdWx0KHJlc3VsdCk7CisJfQorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5MYXRMb25nUHJvdmlkZXJBZGFwdGVyI2dldENlbnRlckxhdExvbmcoKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldENlbnRlcigpIHsKKwkJZmluYWwgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBkb3VibGVbXSByZXN1bHQgPSBmaXh0dXJlLmdldENlbnRlcigpOworCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7CisJfSAvLyB0ZXN0R2V0Q2VudGVyCisKK30gLy8gTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vTGF0TG9uZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vTGF0TG9uZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjFlYTMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9MYXRMb25nVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvLyBMYXRMb25nVGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW87CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZy5TZWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZy5TZWdtZW50QnVpbGRlcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgSlVuaXQgdGVzdCBjYXNlIGZvciBMYXRMb25nLgorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBMYXRMb25nVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCXByb3RlY3RlZCBMYXRMb25nIGZpeHR1cmUgPSBudWxsOworCisJcHJpdmF0ZSBMYXRMb25nIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoTGF0TG9uZyBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJcHVibGljIHN0YXRpYyBMYXRMb25nIGNyZWF0ZUZpeHR1cmUoKSB7CisJCUxhdExvbmcgcmV0VmFsdWUgPSBuZXcgTGF0TG9uZygpOworCQlmaW5hbCBTZWdtZW50IHNlZ21lbnQgPSBTZWdtZW50VGVzdC5jcmVhdGVGaXh0dXJlKCk7CisJCXJldFZhbHVlLmFkZChzZWdtZW50KTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJLyoqCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICovCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nI2FkZChvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmcuU2VnbWVudCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RBZGRTZWdtZW50KCkgeworCQlmaW5hbCBMYXRMb25nIGxhdExvbmcgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUobGF0TG9uZy5zaXplKCkgPT0gMSk7CisJCWZpbmFsIFNlZ21lbnQgc2VnbWVudCA9IFNlZ21lbnRUZXN0LmNyZWF0ZUZpeHR1cmUoKTsKKwkJbGF0TG9uZy5hZGQoc2VnbWVudCk7CisJCWFzc2VydFRydWUobGF0TG9uZy5zaXplKCkgPT0gMik7CisJCWFzc2VydFRydWUobGF0TG9uZy5nZXRTZWdtZW50cygpLmNvbnRhaW5zKHNlZ21lbnQpKTsKKwl9IC8vIHRlc3RBZGRTZWdtZW50CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nI2FkZChqYXZhLnV0aWwuTGlzdCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RBZGRMaXN0T2ZTZWdtZW50KCkgeworCQlmaW5hbCBMYXRMb25nIGxhdExvbmcgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUobGF0TG9uZy5zaXplKCkgPT0gMSk7CisKKwkJZmluYWwgU2VnbWVudEJ1aWxkZXIgc2IxID0gbmV3IFNlZ21lbnRCdWlsZGVyKCk7CisJCXNiMS5hZGQoMS4wLCAyLjApOworCQlzYjEuYWRkKDMuMCwgNC4wKTsKKwkJZmluYWwgU2VnbWVudEJ1aWxkZXIgc2IyID0gbmV3IFNlZ21lbnRCdWlsZGVyKCk7CisJCXNiMi5hZGQoMTAuMCwgMjAuMCk7CisJCXNiMi5hZGQoMzAuMCwgNDAuMCk7CisKKwkJZmluYWwgTGlzdDxTZWdtZW50PiBzZWdtZW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8U2VnbWVudD4oKTsKKwkJc2VnbWVudExpc3QuYWRkKHNiMS50b1NlZ21lbnQoKSk7CisJCXNlZ21lbnRMaXN0LmFkZChzYjIudG9TZWdtZW50KCkpOworCQlsYXRMb25nLmFkZChzZWdtZW50TGlzdCk7CisKKwkJYXNzZXJ0VHJ1ZShsYXRMb25nLnNpemUoKSA9PSAzKTsKKworCX0gLy8gdGVzdEFkZExpc3RPZlNlZ21lbnQKKworCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmcjYWRkKG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZyl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RBZGRMYXRMb25nKCkgeworCQlmaW5hbCBMYXRMb25nIGxhdExvbmcgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUobGF0TG9uZy5zaXplKCkgPT0gMSk7CisJCWxhdExvbmcuYWRkKGNyZWF0ZUZpeHR1cmUoKSk7CisJCWFzc2VydFRydWUobGF0TG9uZy5zaXplKCkgPT0gMik7CisJfSAvLyB0ZXN0QWRkTGF0TG9uZworCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZyNnZXRTZWdtZW50cygpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U2VnbWVudHMoKSB7CisJCWZpbmFsIExhdExvbmcgbGF0TG9uZyA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShsYXRMb25nLnNpemUoKSA9PSAxKTsKKwkJYXNzZXJ0VHJ1ZShsYXRMb25nLmdldFNlZ21lbnRzKCkuc2l6ZSgpID09IDEpOworCX0gLy8gdGVzdEdldFNlZ21lbnRzCisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nI3NpemUoKX0uCisJICogCisJICogQmFzaWNhbGx5IHRoZSBzYW1lIGFzIHtAbGluayAjdGVzdEFkZFNlZ21lbnQoKX0KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKKwkJZmluYWwgTGF0TG9uZyBsYXRMb25nID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGxhdExvbmcuc2l6ZSgpID09IDEpOworCQlmaW5hbCBTZWdtZW50IHNlZ21lbnQgPSBTZWdtZW50VGVzdC5jcmVhdGVGaXh0dXJlKCk7CisJCWxhdExvbmcuYWRkKHNlZ21lbnQpOworCQlhc3NlcnRUcnVlKGxhdExvbmcuc2l6ZSgpID09IDIpOworCQlhc3NlcnRUcnVlKGxhdExvbmcuZ2V0U2VnbWVudHMoKS5jb250YWlucyhzZWdtZW50KSk7CisJfSAvLyB0ZXN0U2l6ZQorCit9IC8vIExhdExvbmdUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3NwYXRpYWwvZ2VvL1BsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vUGxhdGZvcm1MYXRMb25nRGF0YVByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YTM2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3NwYXRpYWwvZ2VvL1BsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDM1OCBAQAorLy8gUGxhdGZvcm1MYXRMb25nRGF0YVByb3ZpZGVyVGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW87CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgSlVuaXQgdGVzdCBmb3IgUGxhdGZvcm1MYXRMb25nRGF0YVByb3ZpZGVyLgorICogCisgKiBAc2VlIFBsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlcgorICogQHNlZSBJbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyVGVzdAorICogQHNlZSBJbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFBsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlclRlc3QgZXh0ZW5kcyBMYXRMb25nRGF0YVByb3ZpZGVyVGVzdCB7CisKKwkvLyBUaGlzIGlzIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIHRlc3QgZmlsZXMKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIm9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMiOworCisJLy8gVGhpcyBpcyB0aGUgcGF0aCB0byB0aGUgdGVzdCBmaWxlcworCXByaXZhdGUgc3RhdGljIFN0cmluZyBQQVRIID0gImRhdGEvc3BhdGlhbC9nZW8iOworCisJLy8gVGhpcyBpcyB0aGUgbmFtZSBvZiBhIGZpbGUKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRklMRV9OQU1FMSA9ICJ0ZXN0MWdtbC5nbWwiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBVExPTkdfRVJST1JfRklMRU5BTUUgPSAidGVzdGxhdGxvbmdlcnJvci5nbWwiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBRF9GT1JNQVRfRVJST1JfRklMRU5BTUUgPSAidGVzdGJhZGZvcm1hdGVycm9yLmdtbCI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9FUlJPUl9GSUxFTkFNRSA9ICJ0ZXN0ZWxlbWVudGVycm9yLmdtbCI7CisKKy8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSElURV9TUEFDRV9GSUxFTkFNRSA9ICJ0ZXN0d2hpdGVzcGFjZS5nbWwiOworCQorCS8qKgorCSAqICBUaGlzIGlzIHRoZSBjb21wbGV0ZSBzdHJpbmcgdGhhdCB3b3VsZCBiZSBleHRyYWN0ZWQgZnJvbSBhIGR1YmxpbiBjb3JlCisJICogInNwYXRpYWwiIGF0dHJpYnV0ZQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRFU1RfUExBVEZPUk1fTEFUX0xPTkdfVVJJX1NUUklORzEgPSBQbGF0Zm9ybUxhdExvbmdEYXRhUHJvdmlkZXIuUExBVEZPUk1fU0NIRU1FCisJCQkrICI6L3BsdWdpbi8iICsgUFJPSkVDVF9OQU1FICsgIi8iICsgUEFUSCArICIvIjsKKworCS8vIFRoZXNlIGFyZSB0aGUgbm9kZSBpZGVudGlmaWVycyBhbmQgdGhlIGNvdW50cyBvZiB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzCisJLy8gaW4gdGhlaXIgbGF0aXR1ZGUvbG9uZ2l0dWRlIGRhdGEKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBSzAyMDEzID0gIiNVUy1BSy0wMjAxMyI7CisKKwlwdWJsaWMgc3RhdGljIGludCBBSzAyMDEzQ09VTlQgPSAwOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQUswMjI5MCA9ICIjVVMtQUstMDIyOTAiOworCisJcHVibGljIHN0YXRpYyBpbnQgQUswMjI5MENPVU5UID0gMDsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFMMDEwMDEgPSAiI1VTLUFMLTAxMDAxIjsKKworCXB1YmxpYyBzdGF0aWMgaW50IEFMMDEwMDFDT1VOVCA9IDE7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBTDAxMDAzID0gIiNVUy1BTC0wMTAwMyI7CisKKwlwdWJsaWMgc3RhdGljIGludCBBTDAxMDAzQ09VTlQgPSAxOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQUwwMTA5NSA9ICIjVVMtQUwtMDEwOTUiOworCisJcHVibGljIHN0YXRpYyBpbnQgQUwwMTA5NUNPVU5UID0gMjsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENBMDYwMzcgPSAiI1VTLUNBLTA2MDM3IjsKKworCXB1YmxpYyBzdGF0aWMgaW50IENBMDYwMzdDT1VOVCA9IDM7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDQTA2MDgzID0gIiNVUy1DQS0wNjA4MyI7CisKKwlwdWJsaWMgc3RhdGljIGludCBDQTA2MDgzQ09VTlQgPSAzOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgVU5LTk9XTklEID0gIiNVTktOT1dOSUQiOworCisJcHVibGljIHN0YXRpYyBpbnQgVU5LTk9XTklEQ09VTlQgPSAwOworCisJc3RhdGljIFN0cmluZ1tdIElEX0ZSQUdNRU5UUyA9IG5ldyBTdHJpbmdbXSB7IEFLMDIwMTMsIEFLMDIyOTAsIEFMMDEwMDEsCisJCQlBTDAxMDAzLCBBTDAxMDk1LCBDQTA2MDM3LCBDQTA2MDgzLCBVTktOT1dOSUQgfTsKKworCXN0YXRpYyBpbnRbXSBJRF9TRUdNRU5UX0NPVU5UUyA9IG5ldyBpbnRbXSB7IEFLMDIwMTNDT1VOVCwgQUswMjI5MENPVU5ULAorCQkJQUwwMTAwMUNPVU5ULCBBTDAxMDAzQ09VTlQsIEFMMDEwOTVDT1VOVCwgQ0EwNjAzN0NPVU5ULAorCQkJQ0EwNjA4M0NPVU5ULCBVTktOT1dOSURDT1VOVCB9OworCisJLyoqCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobmV3IFBsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlcigpKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICovCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwlwcml2YXRlIFBsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlciBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFBsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlcikgZml4dHVyZTsKKwl9IC8vIGdldEZpeHR1cmUKKworCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuUGxhdGZvcm1MYXRMb25nRGF0YVByb3ZpZGVyI2dldExhdExvbmcob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRMYXRMb25nKCkgeworCQlmaW5hbCBQbGF0Zm9ybUxhdExvbmdEYXRhUHJvdmlkZXIgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IElEX0ZSQUdNRU5UUy5sZW5ndGg7IGkrKykgeworCQkJTGF0TG9uZyByZXN1bHQgPSBmaXh0dXJlLmdldExhdExvbmcoVVJJCisJCQkJCS5jcmVhdGVVUkkoVEVTVF9QTEFURk9STV9MQVRfTE9OR19VUklfU1RSSU5HMSArIEZJTEVfTkFNRTEKKwkJCQkJCQkrIElEX0ZSQUdNRU5UU1tpXSkpOworCisJCQlhc3NlcnRUcnVlKHJlc3VsdC5zaXplKCkgPT0gSURfU0VHTUVOVF9DT1VOVFNbaV0pOworCQl9IC8vIGZvciBpCisKKwl9IC8vIHRlc3RHZXRMYXRMb25nCisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLlBsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlciNnZXRMYXRMb25nKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TGF0TG9uZ0Vycm9yKCkgeworCQlmaW5hbCBQbGF0Zm9ybUxhdExvbmdEYXRhUHJvdmlkZXIgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKworCQlMYXRMb25nIHJlc3VsdCA9IGZpeHR1cmUuZ2V0TGF0TG9uZyhVUkkKKwkJCQkuY3JlYXRlVVJJKFRFU1RfUExBVEZPUk1fTEFUX0xPTkdfVVJJX1NUUklORzEKKwkJCQkJCSsgTEFUTE9OR19FUlJPUl9GSUxFTkFNRSArIEFMMDEwMDEpKTsKKwkJYXNzZXJ0VHJ1ZShyZXN1bHQuc2l6ZSgpID09IDApOworCX0gLy8gdGVzdEdldExhdExvbmdFcnJvcgorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5QbGF0Zm9ybUxhdExvbmdEYXRhUHJvdmlkZXIjZ2V0TGF0TG9uZyhvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldExhdExvbmdFbGVtZW50RXJyb3IoKSB7CisJCWZpbmFsIFBsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCisJCS8vIFRoaXMgdGVzdCBwcmludHMgb24gdG8gU3lzdGVtLmVyciwgc28gSSd2ZSBjb21tZW50ZWQgaXQgb3V0LgorCQkvLyBPdGhlcndpc2UgaXQgd29ya3MuCisJCWFzc2VydFRydWUodHJ1ZSk7CisJCS8vIExhdExvbmcgcmVzdWx0ID0gZml4dHVyZS5nZXRMYXRMb25nKFVSSQorCQkvLyAuY3JlYXRlVVJJKFRFU1RfUExBVEZPUk1fTEFUX0xPTkdfVVJJX1NUUklORzEKKwkJLy8gKyBFTEVNRU5UX0VSUk9SX0ZJTEVOQU1FICsgQUwwMTAwMSkpOworCQkvLyBhc3NlcnRUcnVlKHJlc3VsdC5zaXplKCkgPT0gMCk7CisJfSAvLyB0ZXN0R2V0TGF0TG9uZ0Vycm9yCisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLlBsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlciNnZXRMYXRMb25nKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TGF0TG9uZ0JhZEZvcm1hdEVycm9yKCkgeworCQlmaW5hbCBQbGF0Zm9ybUxhdExvbmdEYXRhUHJvdmlkZXIgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKworCQkvLyBUaGlzIHRlc3QgcHJpbnRzIG9uIHRvIFN5c3RlbS5lcnIsIHNvIEkndmUgY29tbWVudGVkIGl0IG91dC4KKwkJLy8gT3RoZXJ3aXNlIGl0IHdvcmtzLgorCQlhc3NlcnRUcnVlKHRydWUpOworCQkvLyBMYXRMb25nIHJlc3VsdCA9IGZpeHR1cmUuZ2V0TGF0TG9uZyhVUkkKKwkJLy8gLmNyZWF0ZVVSSShURVNUX1BMQVRGT1JNX0xBVF9MT05HX1VSSV9TVFJJTkcxCisJCS8vICsgQkFEX0ZPUk1BVF9FUlJPUl9GSUxFTkFNRSArIEFMMDEwMDEpKTsKKwkJLy8gYXNzZXJ0VHJ1ZShyZXN1bHQuc2l6ZSgpID09IDApOworCX0gLy8gdGVzdEdldExhdExvbmdCYWRGb3JtYXRFcnJvcgorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5QbGF0Zm9ybUxhdExvbmdEYXRhUHJvdmlkZXIjZ2V0TGF0TG9uZyhvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldExhdExvbmdXaGl0ZXNwYWNlUHJvY2Vzc2luZygpIHsKKwkJZmluYWwgUGxhdGZvcm1MYXRMb25nRGF0YVByb3ZpZGVyIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisKKwkJLy8gVGhpcyB0ZXN0IHByaW50cyBvbiB0byBTeXN0ZW0uZXJyLCBzbyBJJ3ZlIGNvbW1lbnRlZCBpdCBvdXQuCisJCS8vIE90aGVyd2lzZSBpdCB3b3Jrcy4KKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwkJLy8gTGF0TG9uZyByZXN1bHQgPSBmaXh0dXJlLmdldExhdExvbmcoVVJJCisJCS8vIC5jcmVhdGVVUkkoVEVTVF9QTEFURk9STV9MQVRfTE9OR19VUklfU1RSSU5HMQorCQkvLyArIFdISVRFX1NQQUNFX0ZJTEVOQU1FICsgQUwwMTAwMSkpOworCQkvLyBhc3NlcnRUcnVlKHJlc3VsdC5zaXplKCkgIT0gMCk7CisJfSAvLyB0ZXN0R2V0TGF0TG9uZ0JhZEZvcm1hdEVycm9yCisKKwkKKwkvKioKKwkgKiBUaGlzICJ0ZXN0IiBkb2VzIGEgc2NhbiBvZiBhIGdtbCBkYXRhIGZpbGUgYW5kIGNoZWNrcyB0aGF0IGVhY2ggcG9seWdvbgorCSAqIGlzIGNsb3NlZC4gSXQgcmVwb3J0cyB0aGUgb25lcyB0aGF0IGFyZSBub3QuCisJICogCisJICovCisJcHVibGljIHZvaWQgdGVzdERhdGFTYW5pdHkoKSB7CisJCWZpbmFsIFBsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBTdHJpbmcgVVJJX1NUUklORyA9ICJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1VTQS9VU0FfMl9NQVAueG1sIjsKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwkJLy8gcG9seWdvbkNoZWNrKGZpeHR1cmUsIFVSSV9TVFJJTkcpOworCisJCS8vIGR1cGxpY2F0ZUNoZWNrKGZpeHR1cmUsIFVSSV9TVFJJTkcpOworCisJfSAvLyB0ZXN0RGF0YVNhbml0eQorCisJLyoqCisJICogQHBhcmFtIGZpeHR1cmUKKwkgKiBAcGFyYW0gVVJJX1NUUklORworCSAqLworLy8JcHJpdmF0ZSB2b2lkIHBvbHlnb25DaGVjayhmaW5hbCBQbGF0Zm9ybUxhdExvbmdEYXRhUHJvdmlkZXIgZml4dHVyZSwKKy8vCQkJZmluYWwgU3RyaW5nIHVyaVN0cmluZykgeworLy8JCWZpbmFsIFVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaVN0cmluZyk7CisvLwkJZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IGlkcyA9IGZpeHR1cmUuZ2V0SWRzKHVyaSk7CisvLwkJU3lzdGVtLm91dC5wcmludGxuKCJUaGUgZm9sbG93aW5nIFNlZ21lbnRzIGFyZSBub3QgcG9seWdvbnMiKTsKKy8vCQlmb3IgKFN0cmluZyBpZCA6IGlkcykgeworLy8JCQlib29sZWFuIGZpcnN0VGltZSA9IHRydWU7CisvLwkJCWJvb2xlYW4gZm91bmROb3RQb2x5Z29uID0gZmFsc2U7CisvLwkJCWludCBzZWdtZW50Q291bnQgPSAwOworLy8KKy8vCQkJZmluYWwgTGF0TG9uZyByZXN1bHQgPSBmaXh0dXJlLmdldExhdExvbmcoVVJJLmNyZWF0ZVVSSSh1cmlTdHJpbmcKKy8vCQkJCQkrICIjIiArIGlkKSk7CisvLworLy8JCQkvLyBHZXQgZWFjaCBzZWdtZW50IGFuZCB0ZXN0IGZvciBwb2x5Z29uZXNzCisvLwkJCWZvciAoU2VnbWVudCBzZWdtZW50IDogcmVzdWx0LmdldFNlZ21lbnRzKCkpIHsKKy8vCQkJCS8vIElzIHRoaXMgYSBwb2x5Z29uPworLy8JCQkJaWYgKCFzZWdtZW50LmlzUG9seWdvbigpKSB7CisvLwkJCQkJLy8gTm8KKy8vCQkJCQlmb3VuZE5vdFBvbHlnb24gPSB0cnVlOworLy8JCQkJCS8vIFByaW50IHRoZSBpZD8KKy8vCQkJCQlpZiAoZmlyc3RUaW1lKSB7CisvLwkJCQkJCS8vIFllcworLy8JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklEOiBcIiIgKyBpZCArICJcIiIpOworLy8JCQkJCQlmaXJzdFRpbWUgPSBmYWxzZTsKKy8vCQkJCQl9CisvLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFNlZ21lbnQgIiArIHNlZ21lbnRDb3VudCArICI6ICIKKy8vCQkJCQkJCSsgc2VnbWVudC50b1N0cmluZygpKTsKKy8vCQkJCX0gLy8gaWYgbm90IGEgcG9seWdvbgorLy8JCQkJc2VnbWVudENvdW50Kys7CisvLworLy8JCQl9IC8vIGZvciBlYWNoIHNlZ21lbnQKKy8vCQkJLy8gbm90IGEgcG9seWdvbj8KKy8vCQkJaWYgKGZvdW5kTm90UG9seWdvbikgeworLy8JCQkJLy8gWWVzCisvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKKy8vCQkJfQorLy8JCX0gLy8gZm9yIGVhY2ggaWQKKy8vCX0gLy8gcG9seWdvbkNoZWNrCisKKwkvKioKKwkgKiBFeGFtaW5lIHRoZSBzZWdtZW50cyBpbiB0aGUgZGF0YSBmb3IgZHVwbGljYXRpb25zCisJICogCisJICogQHBhcmFtIGZpeHR1cmUKKwkgKiBAcGFyYW0gdXJpX3N0cmluZworCSAqLworLy8JcHJpdmF0ZSB2b2lkIGR1cGxpY2F0ZUNoZWNrKFBsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlciBmaXh0dXJlLAorLy8JCQlTdHJpbmcgdXJpU3RyaW5nKSB7CisvLwkJZmluYWwgVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpU3RyaW5nKTsKKy8vCQlmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gaWRzID0gZml4dHVyZS5nZXRJZHModXJpKTsKKy8vCisvLwkJLy8gV2UgZ2V0IGV2ZXJ5IHNlZ21lbnQgYW5kIHB1dCBpdCBpbnRvIGEgbWFwIGtleWVkIGJ5IGl0cyBoYXNoY29kZS4KKy8vCQkvLyBCZWZvcmUgd2UgcHV0IHRoZW0gaW50byB0aGUgbWFwIGhvd2V2ZXIsIHdlIHNlZSBpZiBzb21ldGhpbmcgd2l0aAorLy8JCS8vIHRoYXQgaGFzaCBjb2RlIGlzIGFscmVhZHkgdGhlcmUuIElmIHNvIHdlIGNoZWNrIGZvciBlcXVhbGl0eSBhbmQgaWYKKy8vCQkvLyB0aGV5J3JlIGVxdWFsIHdlJ3ZlIGdvdCBkdXBsaWNhdGlvbi4KKy8vCisvLwkJTWFwPEludGVnZXIsIER1cGxpY2F0ZU1hcEVudHJ5PiBtYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBEdXBsaWNhdGVNYXBFbnRyeT4oKTsKKy8vCQlMaXN0PER1cGxpY2F0ZU1hcEVudHJ5PiBkdXBMaXN0ID0gbmV3IEFycmF5TGlzdDxEdXBsaWNhdGVNYXBFbnRyeT4oKTsKKy8vCisvLwkJZm9yIChTdHJpbmcgaWQgOiBpZHMpIHsKKy8vCisvLwkJCWZpbmFsIExhdExvbmcgcmVzdWx0ID0gZml4dHVyZS5nZXRMYXRMb25nKFVSSS5jcmVhdGVVUkkodXJpU3RyaW5nCisvLwkJCQkJKyAiIyIgKyBpZCkpOworLy8JCQlpbnQgc2VnbWVudENvdW50ID0gMDsKKy8vCisvLwkJCS8vIEdldCBlYWNoIHNlZ21lbnQgYW5kIHRlc3QgZm9yIHBvbHlnb25lc3MKKy8vCQkJZm9yIChTZWdtZW50IHNlZ21lbnQgOiByZXN1bHQuZ2V0U2VnbWVudHMoKSkgeworLy8KKy8vCQkJCUludGVnZXIgaGFzaGNvZGUgPSBuZXcgSW50ZWdlcihzZWdtZW50Lmhhc2hDb2RlKCkpOworLy8KKy8vCQkJCUR1cGxpY2F0ZU1hcEVudHJ5IGVudHJ5ID0gbWFwLmdldChoYXNoY29kZSk7CisvLwkJCQkvLyBJcyB0aGUgc2VnbWVudCBpbiB0aGUgbWFwIGFscmVhZHk/CisvLwkJCQlpZiAoZW50cnkgPT0gbnVsbCkgeworLy8JCQkJCS8vIE5vCisvLwkJCQkJbWFwLnB1dChoYXNoY29kZSwgbmV3IER1cGxpY2F0ZU1hcEVudHJ5KGlkLCBzZWdtZW50Q291bnQsCisvLwkJCQkJCQlzZWdtZW50KSk7CisvLwkJCQl9IC8vIGlmCisvLwkJCQllbHNlIHsKKy8vCQkJCQkvLyBZZXMKKy8vCQkJCQkvLyBEdXAhCisvLwkJCQkJLy8gQXJlIHRoZXkgdHJ1ZWx5IEVRVUFMIQorLy8JCQkJCWlmIChlbnRyeS5zZWdtZW50LmVxdWFscyhzZWdtZW50KSkgeworLy8JCQkJCQkvLyBZZXMKKy8vCQkJCQkJZW50cnkuYWRkKG5ldyBEdXBsaWNhdGVNYXBFbnRyeShpZCwgc2VnbWVudENvdW50LAorLy8JCQkJCQkJCXNlZ21lbnQpKTsKKy8vCQkJCQkJLy8gQWRkIHRoaXMgdG8gdGhlIGR1cCBsaXN0PworLy8JCQkJCQlpZiAoZW50cnkuZHVwbGljYXRlcy5zaXplKCkgPT0gMSkgeworLy8JCQkJCQkJLy8gWWVzCisvLwkJCQkJCQlkdXBMaXN0LmFkZChlbnRyeSk7CisvLwkJCQkJCX0KKy8vCQkJCQl9CisvLwkJCQl9IC8vIGVsc2UgRHVwIQorLy8JCQkJc2VnbWVudENvdW50Kys7CisvLwkJCX0gLy8gZm9yIGVhY2ggc2VnbWVudAorLy8KKy8vCQl9IC8vIGZvciBlYWNoIGlkCisvLworLy8JCS8vIEFyZSB0aGVyZSBhbnkgZHVwbGljYXRpb25zPworLy8JCWlmIChkdXBMaXN0LnNpemUoKSA+IDApIHsKKy8vCQkJLy8gWWVzCisvLwkJCVN5c3RlbS5vdXQucHJpbnRsbigpOworLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRoZXJlIGFyZSAiICsgZHVwTGlzdC5zaXplKCkKKy8vCQkJCQkrICIgZHVwbGljYXRlIHNlZ21lbnRzLlxuIik7CisvLwkJCVN5c3RlbS5vdXQucHJpbnRsbigpOworLy8KKy8vCQkJLy8gVGhlIGR1cGxpY2F0ZXMgYXJlIG9uIHRoZSBkdXAgbGlzdC4uLgorLy8JCQlmb3IgKER1cGxpY2F0ZU1hcEVudHJ5IGVudHJ5IDogZHVwTGlzdCkgeworLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCJJZDogIiArIGVudHJ5LmlkICsgIiBzZWdtZW50ICIKKy8vCQkJCQkJKyBlbnRyeS5zZWdtZW50TnVtYmVyICsgIjogXCIiCisvLwkJCQkJCSsgZW50cnkuc2VnbWVudC50b1N0cmluZygpICsgIlwiIik7CisvLwkJCQlmb3IgKER1cGxpY2F0ZU1hcEVudHJ5IGR1cEVudHJ5IDogZW50cnkuZHVwbGljYXRlcykgeworLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRJZDogIiArIGR1cEVudHJ5LmlkICsgIiBzZWdtZW50ICIKKy8vCQkJCQkJCSsgZHVwRW50cnkuc2VnbWVudE51bWJlciArICI6IFwiIgorLy8JCQkJCQkJKyBkdXBFbnRyeS5zZWdtZW50LnRvU3RyaW5nKCkgKyAiXCIiKTsKKy8vCQkJCX0KKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOworLy8JCQl9IC8vIGZvcgorLy8JCX0KKy8vCX0gLy8gZHVwbGljYXRlQ2hlY2sKKworLy8JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHVwbGljYXRlTWFwRW50cnkgeworLy8JCVN0cmluZyBpZCA9IG51bGw7CisvLworLy8JCWludCBzZWdtZW50TnVtYmVyID0gLTE7CisvLworLy8JCVNlZ21lbnQgc2VnbWVudCA9IG51bGw7CisvLworLy8JCUxpc3Q8RHVwbGljYXRlTWFwRW50cnk+IGR1cGxpY2F0ZXMgPSBudWxsOworLy8KKy8vCQkvKioKKy8vCQkgKiBAcGFyYW0gaWQKKy8vCQkgKiBAcGFyYW0gc2VnbWVudE51bWJlcgorLy8JCSAqIEBwYXJhbSBzZWdtZW50CisvLwkJICovCisvLwkJcHJvdGVjdGVkIER1cGxpY2F0ZU1hcEVudHJ5KFN0cmluZyBpZCwgaW50IHNlZ21lbnROdW1iZXIsCisvLwkJCQlTZWdtZW50IHNlZ21lbnQpIHsKKy8vCQkJdGhpcy5pZCA9IGlkOworLy8JCQl0aGlzLnNlZ21lbnROdW1iZXIgPSBzZWdtZW50TnVtYmVyOworLy8JCQl0aGlzLnNlZ21lbnQgPSBzZWdtZW50OworLy8JCX0gLy8gRHVwbGljYXRlTWFwRW50cnkKKy8vCisvLwkJcHVibGljIHZvaWQgYWRkKER1cGxpY2F0ZU1hcEVudHJ5IGVudHJ5KSB7CisvLwkJCS8vIEFueSBkdXBsaWNhdGVzIGFscmVhZHkKKy8vCQkJaWYgKGR1cGxpY2F0ZXMgPT0gbnVsbCkgeworLy8JCQkJLy8gTm8KKy8vCQkJCWR1cGxpY2F0ZXMgPSBuZXcgQXJyYXlMaXN0PER1cGxpY2F0ZU1hcEVudHJ5PigpOworLy8JCQl9CisvLwkJCWR1cGxpY2F0ZXMuYWRkKGVudHJ5KTsKKy8vCQl9CisvLwl9IC8vIER1cGxpY2F0ZU1hcEVudHJ5CisKK30gLy8gUGxhdGZvcm1MYXRMb25nRGF0YVByb3ZpZGVyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9TZWdtZW50QnVpbGRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vU2VnbWVudEJ1aWxkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE4YzEzNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvYWRhcHRlcnMvc3BhdGlhbC9nZW8vU2VnbWVudEJ1aWxkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxODIgQEAKKy8vIFNlZ21lbnRCdWlsZGVyVGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW87CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nLlNlZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nLlNlZ21lbnRCdWlsZGVyOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBKVW5pdCB0ZXN0IGZvciBMYXRMb25nLlNlZ21lbnRCdWlsZGVyCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFNlZ21lbnRCdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCXByb3RlY3RlZCBTZWdtZW50QnVpbGRlciBmaXh0dXJlID0gbnVsbDsKKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnF1YWxpZmllZC1maWVsZC1hY2Nlc3MiKQorCXByaXZhdGUgU2VnbWVudEJ1aWxkZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShTZWdtZW50QnVpbGRlciBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgZml4dHVyZSBmb3IgdGVzdGluZworCSAqLworCXB1YmxpYyBzdGF0aWMgU2VnbWVudEJ1aWxkZXIgY3JlYXRlRml4dHVyZSgpIHsKKwkJcmV0dXJuIG5ldyBTZWdtZW50QnVpbGRlcigpOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJLyoqCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICovCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nLlNlZ21lbnRCdWlsZGVyI2FkZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdEFkZFN0cmluZ1N0cmluZygpIHsKKwkJZmluYWwgU2VnbWVudEJ1aWxkZXIgc2IgPSBnZXRGaXh0dXJlKCk7CisJCXNiLmFkZCgiMS41IiwgIjIuNSIpOworCQlmaW5hbCBTZWdtZW50IHNlZ21lbnQgPSBzYi50b1NlZ21lbnQoKTsKKwkJYXNzZXJ0VHJ1ZShzZWdtZW50LnNpemUoKSA9PSAxKTsKKwkJYXNzZXJ0VHJ1ZShzZWdtZW50LmxhdGl0dWRlKDApID09IDEuNSk7CisJCWFzc2VydFRydWUoc2VnbWVudC5sb25naXR1ZGUoMCkgPT0gMi41KTsKKwl9IC8vIHRlc3RBZGRTdHJpbmdTdHJpbmcKKworCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmcuU2VnbWVudEJ1aWxkZXIjYWRkKGRvdWJsZSwgZG91YmxlKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdEFkZERvdWJsZURvdWJsZSgpIHsKKwkJZmluYWwgU2VnbWVudEJ1aWxkZXIgc2IgPSBnZXRGaXh0dXJlKCk7CisJCXNiLmFkZCgxLjUsIDIuNSk7CisJCWZpbmFsIFNlZ21lbnQgc2VnbWVudCA9IHNiLnRvU2VnbWVudCgpOworCQlhc3NlcnRUcnVlKHNlZ21lbnQuc2l6ZSgpID09IDEpOworCQlhc3NlcnRUcnVlKHNlZ21lbnQubGF0aXR1ZGUoMCkgPT0gMS41KTsKKwkJYXNzZXJ0VHJ1ZShzZWdtZW50LmxvbmdpdHVkZSgwKSA9PSAyLjUpOworCX0gLy8gdGVzdEFkZERvdWJsZURvdWJsZQorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZy5TZWdtZW50QnVpbGRlciNzaXplKCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgeworCQlmaW5hbCBTZWdtZW50QnVpbGRlciBzYiA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShzYi5zaXplKCkgPT0gMCk7CisJCXNiLmFkZCgxLjUsIDIuNSk7CisJCWFzc2VydFRydWUoc2Iuc2l6ZSgpID09IDEpOworCQlzYi5hZGQoMy41LCA0LjUpOworCQlhc3NlcnRUcnVlKHNiLnNpemUoKSA9PSAyKTsKKwl9IC8vIHRlc3RTaXplCisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nLlNlZ21lbnRCdWlsZGVyI2NsZWFyKCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHsKKwkJZmluYWwgU2VnbWVudEJ1aWxkZXIgc2IgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoc2Iuc2l6ZSgpID09IDApOworCQlzYi5hZGQoMS41LCAyLjUpOworCQlhc3NlcnRUcnVlKHNiLnNpemUoKSA9PSAxKTsKKwkJc2IuYWRkKDMuNSwgNC41KTsKKwkJYXNzZXJ0VHJ1ZShzYi5zaXplKCkgPT0gMik7CisJCXNiLmNsZWFyKCk7CisJCWFzc2VydFRydWUoc2Iuc2l6ZSgpID09IDApOworCX0gLy8gdGVzdENsZWFyCisKKwkvKioKKwkgKiBUZXN0IHRvU2VnbWVudCB3aXRoIGZpbHRlcmluZworCSAqLworCXB1YmxpYyB2b2lkIHRlc3RUb1NlZ21lbnQoKSB7CisJCWZpbmFsIFNlZ21lbnRCdWlsZGVyIHNiID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKHNiLnNpemUoKSA9PSAwKTsKKwkJc2IuYWRkKDAsIDApOworCQlzYi5hZGQoMSwgMSk7CisJCXNiLmFkZCgyLCAyKTsKKwkJc2IuYWRkKDMsIDMpOworCQlzYi5hZGQoNCwgNCk7CisJCXNiLmFkZCg1LCA1KTsKKwkJc2IuYWRkKDYsIDYpOworCQlzYi5hZGQoNywgNyk7CisJCWFzc2VydFRydWUoc2Iuc2l6ZSgpID09IDgpOworCisJCWZpbmFsIFNlZ21lbnQgZmlsdGVyZWRTZWdtZW50NCA9IHNiLnRvU2VnbWVudCg0KTsKKwkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZFNlZ21lbnQ0LnNpemUoKSA9PSAzKTsKKwkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZFNlZ21lbnQ0LmxhdGl0dWRlKDApID09IDApOworCQlhc3NlcnRUcnVlKGZpbHRlcmVkU2VnbWVudDQubG9uZ2l0dWRlKDApID09IDApOworCQlhc3NlcnRUcnVlKGZpbHRlcmVkU2VnbWVudDQubGF0aXR1ZGUoMSkgPT0gNCk7CisJCWFzc2VydFRydWUoZmlsdGVyZWRTZWdtZW50NC5sb25naXR1ZGUoMSkgPT0gNCk7CisJCWFzc2VydFRydWUoZmlsdGVyZWRTZWdtZW50NC5sYXRpdHVkZSgyKSA9PSA3KTsKKwkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZFNlZ21lbnQ0LmxvbmdpdHVkZSgyKSA9PSA3KTsKKworCQlmaW5hbCBTZWdtZW50IGZpbHRlcmVkU2VnbWVudDEgPSBzYi50b1NlZ21lbnQoMSk7CisJCWFzc2VydFRydWUoZmlsdGVyZWRTZWdtZW50MS5zaXplKCkgPT0gc2Iuc2l6ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZFNlZ21lbnQxLmxhdGl0dWRlKDApID09IDApOworCQlhc3NlcnRUcnVlKGZpbHRlcmVkU2VnbWVudDEubG9uZ2l0dWRlKDApID09IDApOworCQlhc3NlcnRUcnVlKGZpbHRlcmVkU2VnbWVudDEubGF0aXR1ZGUoMSkgPT0gMSk7CisJCWFzc2VydFRydWUoZmlsdGVyZWRTZWdtZW50MS5sb25naXR1ZGUoMSkgPT0gMSk7CisJCWFzc2VydFRydWUoZmlsdGVyZWRTZWdtZW50MS5sYXRpdHVkZSgyKSA9PSAyKTsKKwkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZFNlZ21lbnQxLmxvbmdpdHVkZSgyKSA9PSAyKTsKKwkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZFNlZ21lbnQxLmxhdGl0dWRlKDMpID09IDMpOworCQlhc3NlcnRUcnVlKGZpbHRlcmVkU2VnbWVudDEubG9uZ2l0dWRlKDMpID09IDMpOworCQlhc3NlcnRUcnVlKGZpbHRlcmVkU2VnbWVudDEubGF0aXR1ZGUoNCkgPT0gNCk7CisJCWFzc2VydFRydWUoZmlsdGVyZWRTZWdtZW50MS5sb25naXR1ZGUoNCkgPT0gNCk7CisJCWFzc2VydFRydWUoZmlsdGVyZWRTZWdtZW50MS5sYXRpdHVkZSg1KSA9PSA1KTsKKwkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZFNlZ21lbnQxLmxvbmdpdHVkZSg1KSA9PSA1KTsKKwkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZFNlZ21lbnQxLmxhdGl0dWRlKDYpID09IDYpOworCQlhc3NlcnRUcnVlKGZpbHRlcmVkU2VnbWVudDEubG9uZ2l0dWRlKDYpID09IDYpOworCQlhc3NlcnRUcnVlKGZpbHRlcmVkU2VnbWVudDEubGF0aXR1ZGUoNykgPT0gNyk7CisJCWFzc2VydFRydWUoZmlsdGVyZWRTZWdtZW50MS5sb25naXR1ZGUoNykgPT0gNyk7CisKKwkJZmluYWwgU2VnbWVudCBmaWx0ZXJlZFNlZ21lbnRUb29CaWcgPSBzYi50b1NlZ21lbnQoc2Iuc2l6ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZFNlZ21lbnRUb29CaWcuc2l6ZSgpID09IDMpOworCQlhc3NlcnRUcnVlKGZpbHRlcmVkU2VnbWVudFRvb0JpZy5sYXRpdHVkZSgwKSA9PSAwKTsKKwkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZFNlZ21lbnRUb29CaWcubG9uZ2l0dWRlKDApID09IDApOworCQlhc3NlcnRUcnVlKGZpbHRlcmVkU2VnbWVudFRvb0JpZy5sYXRpdHVkZSgxKSA9PSA0KTsKKwkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZFNlZ21lbnRUb29CaWcubG9uZ2l0dWRlKDEpID09IDQpOworCQlhc3NlcnRUcnVlKGZpbHRlcmVkU2VnbWVudFRvb0JpZy5sYXRpdHVkZSgyKSA9PSA3KTsKKwkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZFNlZ21lbnRUb29CaWcubG9uZ2l0dWRlKDIpID09IDcpOworCisJCWZpbmFsIFNlZ21lbnQgZmlsdGVyZWRTZWdtZW50U2FtZVNpemUgPSBzYi50b1NlZ21lbnQoc2Iuc2l6ZSgpIC0gMSk7CisJCWFzc2VydFRydWUoZmlsdGVyZWRTZWdtZW50U2FtZVNpemUuc2l6ZSgpID09IDMpOworCQlhc3NlcnRUcnVlKGZpbHRlcmVkU2VnbWVudFNhbWVTaXplLmxhdGl0dWRlKDApID09IDApOworCQlhc3NlcnRUcnVlKGZpbHRlcmVkU2VnbWVudFNhbWVTaXplLmxvbmdpdHVkZSgwKSA9PSAwKTsKKwkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZFNlZ21lbnRTYW1lU2l6ZS5sYXRpdHVkZSgxKSA9PSA0KTsKKwkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZFNlZ21lbnRTYW1lU2l6ZS5sb25naXR1ZGUoMSkgPT0gNCk7CisJCWFzc2VydFRydWUoZmlsdGVyZWRTZWdtZW50U2FtZVNpemUubGF0aXR1ZGUoMikgPT0gNyk7CisJCWFzc2VydFRydWUoZmlsdGVyZWRTZWdtZW50U2FtZVNpemUubG9uZ2l0dWRlKDIpID09IDcpOworCisJCXRyeSB7CisJCQlmaW5hbCBTZWdtZW50IGZpbHRlcmVkU2VnbWVudFRvb1NtYWxsID0gc2IudG9TZWdtZW50KDApOworCQkJZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJLy8gZXhwZWN0ZWQKKwkJfQorCisJfSAvLyB0ZXN0VG9TZWdtZW50Cit9IC8vIFNlZ21lbnRCdWlsZGVyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9TZWdtZW50VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9hZGFwdGVycy9zcGF0aWFsL2dlby9TZWdtZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZDQ4MWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2FkYXB0ZXJzL3NwYXRpYWwvZ2VvL1NlZ21lbnRUZXN0LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8vIFNlZ21lbnRUZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlbzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmcuU2VnbWVudDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgU2VnbWVudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgTEFUXzAgPSAwOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIExPTkdfMCA9IDEuMDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBMQVRfMSA9IDEwLjA7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgTE9OR18xID0gMTEuMDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBMQVRfMiA9IExBVF8wOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIExPTkdfMiA9IExPTkdfMDsKKworCXByb3RlY3RlZCBTZWdtZW50IGZpeHR1cmUgPSBudWxsOworCisJQFN1cHByZXNzV2FybmluZ3MoInVucXVhbGlmaWVkLWZpZWxkLWFjY2VzcyIpCisJcHJpdmF0ZSBTZWdtZW50IGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoU2VnbWVudCBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgZml4dHVyZSBmb3IgdGVzdGluZworCSAqLworCXB1YmxpYyBzdGF0aWMgU2VnbWVudCBjcmVhdGVGaXh0dXJlKCkgeworCQlmaW5hbCBkb3VibGVbXVtdIGRhdGEgPSBuZXcgZG91YmxlWzNdWzJdOworCQlkYXRhWzBdW1NlZ21lbnQuTEFUSVRVREVfSU5ERVhdID0gTEFUXzA7CisJCWRhdGFbMF1bU2VnbWVudC5MT05HSVRVREVfSU5ERVhdID0gTE9OR18wOworCQlkYXRhWzFdW1NlZ21lbnQuTEFUSVRVREVfSU5ERVhdID0gTEFUXzE7CisJCWRhdGFbMV1bU2VnbWVudC5MT05HSVRVREVfSU5ERVhdID0gTE9OR18xOworCQlkYXRhWzJdW1NlZ21lbnQuTEFUSVRVREVfSU5ERVhdID0gTEFUXzI7CisJCWRhdGFbMl1bU2VnbWVudC5MT05HSVRVREVfSU5ERVhdID0gTE9OR18yOworCQlyZXR1cm4gbmV3IFNlZ21lbnQoZGF0YSk7CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKKwkvKioKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCX0KKworCS8qKgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmcuU2VnbWVudCNsYXRpdHVkZShpbnQpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0TGF0aXR1ZGUoKSB7CisJCWZpbmFsIFNlZ21lbnQgc2VnbWVudCA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShzZWdtZW50LmxhdGl0dWRlKDApID09IExBVF8wKTsKKwkJYXNzZXJ0VHJ1ZShzZWdtZW50LmxhdGl0dWRlKDEpID09IExBVF8xKTsKKwkJYXNzZXJ0VHJ1ZShzZWdtZW50LmxhdGl0dWRlKDIpID09IExBVF8yKTsKKwl9IC8vIHRlc3RMYXRpdHVkZQorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZy5TZWdtZW50I2xvbmdpdHVkZShpbnQpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0TG9uZ2l0dWRlKCkgeworCQlmaW5hbCBTZWdtZW50IHNlZ21lbnQgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoc2VnbWVudC5sb25naXR1ZGUoMCkgPT0gTE9OR18wKTsKKwkJYXNzZXJ0VHJ1ZShzZWdtZW50LmxvbmdpdHVkZSgxKSA9PSBMT05HXzEpOworCQlhc3NlcnRUcnVlKHNlZ21lbnQubG9uZ2l0dWRlKDIpID09IExPTkdfMik7CisJfSAvLyB0ZXN0TG9uZ2l0dWRlCisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nLlNlZ21lbnQjc2l6ZSgpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKKwkJZmluYWwgU2VnbWVudCBzZWdtZW50ID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKHNlZ21lbnQuc2l6ZSgpID09IDMpOworCX0KKworCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmcuU2VnbWVudCNpc1BvbHlnb24oKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdElzUG9seWdvbigpIHsKKwkJZmluYWwgU2VnbWVudCBzZWdtZW50ID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKHNlZ21lbnQuaXNQb2x5Z29uKCkpOworCX0gLy8gdGVzdElzUG9seWdvbgorCit9IC8vIFNlZ21lbnRUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Rlc3RzL0RlZmluaXRpb25zQWxsVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvdGVzdHMvRGVmaW5pdGlvbnNBbGxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZGNmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Rlc3RzL0RlZmluaXRpb25zQWxsVGVzdHMuamF2YQpAQCAtMCwwICsxLDYyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMudGVzdHMuTGFiZWxzVGVzdHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLnRlc3RzLk5vZGVzVGVzdHM7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+RGVmaW5pdGlvbnM8L2I+PC9lbT4nIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZpbml0aW9uc0FsbFRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgRGVmaW5pdGlvbnNBbGxUZXN0cygiRGVmaW5pdGlvbnMgVGVzdHMiKTsgLy8kTk9OLU5MUy0xJAorCQlzdWl0ZS5hZGRUZXN0KEVkZ2VzVGVzdHMuc3VpdGUoKSk7CisJCXN1aXRlLmFkZFRlc3QoTGFiZWxzVGVzdHMuc3VpdGUoKSk7CisJCXN1aXRlLmFkZFRlc3QoTm9kZXNUZXN0cy5zdWl0ZSgpKTsKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEZWZpbml0aW9uc0FsbFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworfSAvL0RlZmluaXRpb25zQWxsVGVzdHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvdGVzdHMvRWRnZXNUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy90ZXN0cy9FZGdlc1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY0Y2FiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvdGVzdHMvRWRnZXNUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+ZWRnZXM8L2I+PC9lbT4nIHBhY2thZ2UuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEVkZ2VzVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgeworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBFZGdlc1Rlc3RzKCJlZGdlcyBUZXN0cyIpOyAvLyROT04tTkxTLTEkCisJCXN1aXRlLmFkZFRlc3RTdWl0ZShNaWdyYXRpb25FZGdlVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShNaWdyYXRpb25FZGdlTGFiZWxUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKE1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShNaXhpbmdFZGdlVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShNaXhpbmdFZGdlTGFiZWxUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKE1peGluZ0VkZ2VMYWJlbFZhbHVlVGVzdC5jbGFzcyk7CisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRnZXNUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKK30gLy9FZGdlc1Rlc3RzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Rlc3RzL01pZ3JhdGlvbkVkZ2VMYWJlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvdGVzdHMvTWlncmF0aW9uRWRnZUxhYmVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMmFmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Rlc3RzL01pZ3JhdGlvbkVkZ2VMYWJlbFRlc3QuamF2YQpAQCAtMCwwICsxLDExMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnRlc3RzLkVkZ2VMYWJlbFRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5FZGdlc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlTGFiZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWlncmF0aW9uIEVkZ2UgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkIE5PVAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBNaWdyYXRpb25FZGdlTGFiZWxUZXN0IGV4dGVuZHMgRWRnZUxhYmVsVGVzdCB7CisKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBNaWdyYXRpb24gRWRnZSBMYWJlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1pZ3JhdGlvbkVkZ2VMYWJlbCBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oTWlncmF0aW9uRWRnZUxhYmVsVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBNaWdyYXRpb24gRWRnZSBMYWJlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTWlncmF0aW9uRWRnZUxhYmVsVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIE1pZ3JhdGlvbiBFZGdlIExhYmVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKE1pZ3JhdGlvbkVkZ2VMYWJlbCBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBNaWdyYXRpb24gRWRnZSBMYWJlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1pZ3JhdGlvbkVkZ2VMYWJlbCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShFZGdlc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1pZ3JhdGlvbkVkZ2VMYWJlbCgpKTsKKwl9CisKKwkvKioKKwkgKiBNYWtlIHN1cmUgdGhlIGZpeHR1cmUgbWFrZXMgc2Vuc2UuCisJICovCisJcHVibGljIHZvaWQgdGVzdEZpeHR1cmUoKSB7CisJCWZpbmFsIE1pZ3JhdGlvbkVkZ2VMYWJlbCBtaWdyYXRpb25FZGdlTGFiZWwgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydE5vdE51bGwobWlncmF0aW9uRWRnZUxhYmVsKTsKKwkJYXNzZXJ0VHJ1ZShtaWdyYXRpb25FZGdlTGFiZWwuc2FuZSgpKTsKKwkJCisJCWFzc2VydE5vdE51bGwobWlncmF0aW9uRWRnZUxhYmVsLmdldEN1cnJlbnRWYWx1ZSgpKTsKKwl9IC8vIHRlc3RGaXh0dXJlCQorCQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworfSAvL01pZ3JhdGlvbkVkZ2VMYWJlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvdGVzdHMvTWlncmF0aW9uRWRnZUxhYmVsVmFsdWVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Rlc3RzL01pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzN2M1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Rlc3RzL01pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudGVzdHMuTGFiZWxWYWx1ZVRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5FZGdlc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuTWlncmF0aW9uRWRnZUxhYmVsVmFsdWVJbXBsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1pZ3JhdGlvbiBFZGdlIExhYmVsIFZhbHVlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZCBOT1QKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgTWlncmF0aW9uRWRnZUxhYmVsVmFsdWVUZXN0IGV4dGVuZHMgTGFiZWxWYWx1ZVRlc3QgeworCS8qKk1pZ3JhdGlvbiByYXRlcyB0byB1c2UgaW4gdGhlIHRlc3RzKi8KKwlzdGF0aWMgZmluYWwgZG91YmxlIE1JR1JBVElPTl9SQVRFID0gMC41OworCQorCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIE1pZ3JhdGlvbiBFZGdlIExhYmVsIFZhbHVlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKE1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBNaWdyYXRpb24gRWRnZSBMYWJlbCBWYWx1ZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTWlncmF0aW9uRWRnZUxhYmVsVmFsdWVUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTWlncmF0aW9uIEVkZ2UgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTWlncmF0aW9uIEVkZ2UgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShFZGdlc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlKCkpOworCX0KKwkKKworCS8qKgorCSAqIE1ha2Ugc3VyZSB0aGUgZml4dHVyZSBtYWtlcyBzZW5zZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Rml4dHVyZSgpIHsKKwkJZmluYWwgTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUgbWlncmF0aW9uTGFiZWxWYWx1ZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0Tm90TnVsbChtaWdyYXRpb25MYWJlbFZhbHVlKTsKKwkJYXNzZXJ0VHJ1ZSgoKE1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlSW1wbCkgbWlncmF0aW9uTGFiZWxWYWx1ZSkuc2FuZSgpKTsKKwkJCisJCS8qTWFrZSBzdXJlIHdlIGNhbiBzZXQgdGhlIHZhbHVlKi8KKwkJbWlncmF0aW9uTGFiZWxWYWx1ZS5zZXRNaWdyYXRpb25SYXRlKE1JR1JBVElPTl9SQVRFKTsKKwkJYXNzZXJ0VHJ1ZShtaWdyYXRpb25MYWJlbFZhbHVlLmdldE1pZ3JhdGlvblJhdGUoKT09TUlHUkFUSU9OX1JBVEUpOworCQkKKwl9IC8vIHRlc3RGaXh0dXJlCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBNYWtlIHN1cmUgcmVzZXQgcmV2ZXJ0cyB0aGUgbGFiZWwgdmFsdWUgdG8gaXRzIGRlZmF1bHQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0ZXN0UmVzZXQoKSB7CisJCU1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlIG1pZ3JhdGlvbkxhYmVsVmFsdWUgPSBnZXRGaXh0dXJlKCk7CisJCWRvdWJsZSBvbGRWYWx1ZSA9IG1pZ3JhdGlvbkxhYmVsVmFsdWUuZ2V0TWlncmF0aW9uUmF0ZSgpOworCQltaWdyYXRpb25MYWJlbFZhbHVlLnNldE1pZ3JhdGlvblJhdGUoTUlHUkFUSU9OX1JBVEUpOworCQlhc3NlcnRGYWxzZShtaWdyYXRpb25MYWJlbFZhbHVlLmdldE1pZ3JhdGlvblJhdGUoKT09b2xkVmFsdWUpOworCQltaWdyYXRpb25MYWJlbFZhbHVlLnJlc2V0KCk7CisJCWFzc2VydFRydWUobWlncmF0aW9uTGFiZWxWYWx1ZS5nZXRNaWdyYXRpb25SYXRlKCk9PW9sZFZhbHVlKTsKKwkJCisJfQorCit9IC8vTWlncmF0aW9uRWRnZUxhYmVsVmFsdWVUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Rlc3RzL01pZ3JhdGlvbkVkZ2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Rlc3RzL01pZ3JhdGlvbkVkZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMzNTVjZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvZWRnZXMvdGVzdHMvTWlncmF0aW9uRWRnZVRlc3QuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5FZGdlc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5UZXN0VXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudGVzdHMuRWRnZVRlc3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWlncmF0aW9uIEVkZ2U8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkIE5PVAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBNaWdyYXRpb25FZGdlVGVzdCBleHRlbmRzIEVkZ2VUZXN0IHsKKwkKKwkvKipTdGF0aWMgbGFiZWwgZm9yIHVzZSBpbiB0ZXN0cyovCisJc3RhdGljIE1pZ3JhdGlvbkVkZ2VMYWJlbCBURVNUX0xBQkVMID0gRWRnZXNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNaWdyYXRpb25FZGdlTGFiZWwoKTsKKworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIE1pZ3JhdGlvbiBFZGdlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWlncmF0aW9uRWRnZSBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oTWlncmF0aW9uRWRnZVRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgTWlncmF0aW9uIEVkZ2UgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1pZ3JhdGlvbkVkZ2VUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTWlncmF0aW9uIEVkZ2UgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoTWlncmF0aW9uRWRnZSBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBNaWdyYXRpb24gRWRnZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1pZ3JhdGlvbkVkZ2UgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgdGhlIGZpeHR1cmUuIFdlIG5lZWQgdG8gaGF2ZSBub2RlcyBvbiBib3RoIHNpZGVzIGluIG9yZGVyIHRvIGJlIHNhbmUoKS4KKwkgKiAKKwkgKiAqLworCXB1YmxpYyBNaWdyYXRpb25FZGdlIGNyZWF0ZUZpeHR1cmUoKSB7CisJCWZpbmFsIE5vZGUgbm9kZUEgPSBUZXN0VXRpbC5jcmVhdGVTdGF0aWNhbGx5TGFiZWxlZE5vZGUoKTsKKwkJZmluYWwgTm9kZSBub2RlQiA9IFRlc3RVdGlsLmNyZWF0ZVN0YXRpY2FsbHlMYWJlbGVkTm9kZSgpOworCQlNaWdyYXRpb25FZGdlIG1pZ3JhdGlvbkVkZ2UgPSBFZGdlc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1pZ3JhdGlvbkVkZ2UoKTsKKwkJbWlncmF0aW9uRWRnZS5zZXROb2RlQVVSSShub2RlQS5nZXRVUkkoKSk7CisJCW1pZ3JhdGlvbkVkZ2Uuc2V0Tm9kZUJVUkkobm9kZUIuZ2V0VVJJKCkpOwkKKwkJCisJCS8vTWFrZSBzdXJlIHRoZSBub2RlIHJlbGF0aW9ucyBhcmUgY29vbAorCQltaWdyYXRpb25FZGdlLnNldEEobm9kZUEpOworCQltaWdyYXRpb25FZGdlLnNldEIobm9kZUIpOworCQlub2RlQS5nZXRFZGdlcygpLmFkZChtaWdyYXRpb25FZGdlKTsKKwkJbm9kZUIuZ2V0RWRnZXMoKS5hZGQobWlncmF0aW9uRWRnZSk7CisJCQorCQkKKwkJcmV0dXJuIG1pZ3JhdGlvbkVkZ2U7CisJfQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9CisJCisJLyoqUGVyZm9ybSBiYXNpYyB0ZXN0cyBvbiB0aGlzIGZpeHR1cmUqLworCXB1YmxpYyB2b2lkIHRlc3RGaXh0dXJlKCkgeworCQlNaWdyYXRpb25FZGdlIG1pZ3JhdGlvbkVkZ2UgID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnROb3ROdWxsKG1pZ3JhdGlvbkVkZ2UpOworCQlhc3NlcnRUcnVlKG1pZ3JhdGlvbkVkZ2Uuc2FuZSgpKTsKKwkJYXNzZXJ0VHJ1ZShtaWdyYXRpb25FZGdlLmlzRGlyZWN0ZWQoKSk7CisJCQorCQlhc3NlcnROb3ROdWxsKG1pZ3JhdGlvbkVkZ2UuZ2V0TGFiZWwoKSk7CisJfQorCQorCS8qKlRlc3Qgc2V0dGluZyB0aGUgbGFiZWwqLworCXB1YmxpYyB2b2lkIHRlc3RTZXRMYWJlbCgpIHsKKwkJTWlncmF0aW9uRWRnZSBtaWdyYXRpb25FZGdlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRGYWxzZShtaWdyYXRpb25FZGdlLmdldExhYmVsKCkgPT0gVEVTVF9MQUJFTCk7CisJCW1pZ3JhdGlvbkVkZ2Uuc2V0TGFiZWwoVEVTVF9MQUJFTCk7CisJCWFzc2VydFRydWUobWlncmF0aW9uRWRnZS5nZXRMYWJlbCgpPT1URVNUX0xBQkVMKTsKKwkJYXNzZXJ0VHJ1ZShtaWdyYXRpb25FZGdlLnNhbmUoKSk7CisJfQorCQorCS8qKlRlc3QgRGlyZWN0ZWQqLworCXB1YmxpYyB2b2lkIHRlc3RJc0RpcmVjdGVkQXRfX05vZGUoKSB7CisJCWZpbmFsIEVkZ2UgZWRnZSA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgTm9kZSBub2RlQSA9IGVkZ2UuZ2V0QSgpOworCQlmaW5hbCBOb2RlIG5vZGVCID0gZWRnZS5nZXRCKCk7CisJCQorCQllZGdlLnNldERpcmVjdGVkKHRydWUpOworCQlhc3NlcnRUcnVlKGVkZ2UuaXNEaXJlY3RlZCgpKTsKKworCQlhc3NlcnRGYWxzZShlZGdlLmlzRGlyZWN0ZWRBdChub2RlQSkpOworCQlhc3NlcnRUcnVlKGVkZ2UuaXNEaXJlY3RlZEF0KG5vZGVCKSk7CisJfQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKK30gLy9NaWdyYXRpb25FZGdlVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy90ZXN0cy9NaXhpbmdFZGdlTGFiZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Rlc3RzL01peGluZ0VkZ2VMYWJlbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTk0MGU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy90ZXN0cy9NaXhpbmdFZGdlTGFiZWxUZXN0LmphdmEKQEAgLTAsMCArMSwxMTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC50ZXN0cy5FZGdlTGFiZWxUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWl4aW5nRWRnZUxhYmVsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWl4aW5nIEVkZ2UgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkIE5PVAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBNaXhpbmdFZGdlTGFiZWxUZXN0IGV4dGVuZHMgRWRnZUxhYmVsVGVzdCB7CisKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBNaXhpbmcgRWRnZSBMYWJlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1peGluZ0VkZ2VMYWJlbCBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oTWl4aW5nRWRnZUxhYmVsVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBNaXhpbmcgRWRnZSBMYWJlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTWl4aW5nRWRnZUxhYmVsVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIE1peGluZyBFZGdlIExhYmVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKE1peGluZ0VkZ2VMYWJlbCBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBNaXhpbmcgRWRnZSBMYWJlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1peGluZ0VkZ2VMYWJlbCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShFZGdlc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1peGluZ0VkZ2VMYWJlbCgpKTsKKwl9CisKKwkvKioKKwkgKiBNYWtlIHN1cmUgdGhlIGZpeHR1cmUgbWFrZXMgc2Vuc2UuCisJICovCisJcHVibGljIHZvaWQgdGVzdEZpeHR1cmUoKSB7CisJCWZpbmFsIE1peGluZ0VkZ2VMYWJlbCBtaXhpbmdFZGdlTGFiZWwgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydE5vdE51bGwobWl4aW5nRWRnZUxhYmVsKTsKKwkJYXNzZXJ0VHJ1ZShtaXhpbmdFZGdlTGFiZWwuc2FuZSgpKTsKKwkJCisJCWFzc2VydE5vdE51bGwobWl4aW5nRWRnZUxhYmVsLmdldEN1cnJlbnRWYWx1ZSgpKTsKKwl9IC8vIHRlc3RGaXh0dXJlCQorCQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0JCisKK30gLy9NaXhpbmdFZGdlTGFiZWxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Rlc3RzL01peGluZ0VkZ2VMYWJlbFZhbHVlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy90ZXN0cy9NaXhpbmdFZGdlTGFiZWxWYWx1ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTAwMzgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy90ZXN0cy9NaXhpbmdFZGdlTGFiZWxWYWx1ZVRlc3QuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnRlc3RzLkxhYmVsVmFsdWVUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWl4aW5nRWRnZUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLk1peGluZ0VkZ2VMYWJlbFZhbHVlSW1wbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NaXhpbmcgRWRnZSBMYWJlbCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQgTk9UCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIE1peGluZ0VkZ2VMYWJlbFZhbHVlVGVzdCBleHRlbmRzIExhYmVsVmFsdWVUZXN0IHsKKworCXN0YXRpYyBkb3VibGUgTUlYSU5HX1JBVEUgPSAuMDAxOworCQorCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIE1peGluZyBFZGdlIExhYmVsIFZhbHVlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWl4aW5nRWRnZUxhYmVsVmFsdWUgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKE1peGluZ0VkZ2VMYWJlbFZhbHVlVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBNaXhpbmcgRWRnZSBMYWJlbCBWYWx1ZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTWl4aW5nRWRnZUxhYmVsVmFsdWVUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTWl4aW5nIEVkZ2UgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoTWl4aW5nRWRnZUxhYmVsVmFsdWUgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTWl4aW5nIEVkZ2UgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNaXhpbmdFZGdlTGFiZWxWYWx1ZSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShFZGdlc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1peGluZ0VkZ2VMYWJlbFZhbHVlKCkpOworCX0KKworCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCQorCS8qKgorCSAqIE1ha2Ugc3VyZSB0aGUgZml4dHVyZSBtYWtlcyBzZW5zZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Rml4dHVyZSgpIHsKKwkJZmluYWwgTWl4aW5nRWRnZUxhYmVsVmFsdWUgbWl4aW5nTGFiZWxWYWx1ZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0Tm90TnVsbChtaXhpbmdMYWJlbFZhbHVlKTsKKwkJYXNzZXJ0VHJ1ZSgoKE1peGluZ0VkZ2VMYWJlbFZhbHVlSW1wbCkgbWl4aW5nTGFiZWxWYWx1ZSkuc2FuZSgpKTsKKwkJCisJCS8qTWFrZSBzdXJlIHdlIGNhbiBzZXQgdGhlIHZhbHVlKi8KKwkJbWl4aW5nTGFiZWxWYWx1ZS5zZXRNaXhpbmdSYXRlKE1JWElOR19SQVRFKTsKKwkJYXNzZXJ0VHJ1ZShtaXhpbmdMYWJlbFZhbHVlLmdldE1peGluZ1JhdGUoKT09TUlYSU5HX1JBVEUpOworCQkKKwl9IC8vIHRlc3RGaXh0dXJlCisJCisJLyoqCisJICogTWFrZSBzdXJlIHJlc2V0IHJldmVydHMgdGhlIGxhYmVsIHZhbHVlIHRvIGl0cyBkZWZhdWx0CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdGVzdFJlc2V0KCkgeworCQlNaXhpbmdFZGdlTGFiZWxWYWx1ZSBtaXhpbmdMYWJlbFZhbHVlID0gZ2V0Rml4dHVyZSgpOworCQlkb3VibGUgb2xkVmFsdWUgPSBtaXhpbmdMYWJlbFZhbHVlLmdldE1peGluZ1JhdGUoKTsKKwkJbWl4aW5nTGFiZWxWYWx1ZS5zZXRNaXhpbmdSYXRlKE1JWElOR19SQVRFKTsKKwkJYXNzZXJ0RmFsc2UobWl4aW5nTGFiZWxWYWx1ZS5nZXRNaXhpbmdSYXRlKCk9PW9sZFZhbHVlKTsKKwkJbWl4aW5nTGFiZWxWYWx1ZS5yZXNldCgpOworCQlhc3NlcnRUcnVlKG1peGluZ0xhYmVsVmFsdWUuZ2V0TWl4aW5nUmF0ZSgpPT1vbGRWYWx1ZSk7CisJCQorCX0KKworfSAvL01peGluZ0VkZ2VMYWJlbFZhbHVlVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy90ZXN0cy9NaXhpbmdFZGdlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9lZGdlcy90ZXN0cy9NaXhpbmdFZGdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMTc2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2VkZ2VzL3Rlc3RzL01peGluZ0VkZ2VUZXN0LmphdmEKQEAgLTAsMCArMSwxNTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC50ZXN0cy5FZGdlVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLkVkZ2VzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1peGluZ0VkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaXhpbmdFZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLlRlc3RVdGlsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1peGluZyBFZGdlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZCBOT1QKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgTWl4aW5nRWRnZVRlc3QgZXh0ZW5kcyBFZGdlVGVzdCB7CisKKwlzdGF0aWMgTWl4aW5nRWRnZUxhYmVsIFRFU1RfTEFCRUwgPSBFZGdlc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1peGluZ0VkZ2VMYWJlbCgpOworCQorCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIE1peGluZyBFZGdlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWl4aW5nRWRnZSBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oTWl4aW5nRWRnZVRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgTWl4aW5nIEVkZ2UgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1peGluZ0VkZ2VUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTWl4aW5nIEVkZ2UgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoTWl4aW5nRWRnZSBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgdGhlIGZpeHR1cmUuIFdlIG5lZWQgdG8gaGF2ZSBub2RlcyBvbiBib3RoIHNpZGVzIGluIG9yZGVyIHRvIGJlIHNhbmUoKS4KKwkgKiAKKwkgKiAqLworCXB1YmxpYyBNaXhpbmdFZGdlIGNyZWF0ZUZpeHR1cmUoKSB7CisJCWZpbmFsIE5vZGUgbm9kZUEgPSBUZXN0VXRpbC5jcmVhdGVTdGF0aWNhbGx5TGFiZWxlZE5vZGUoKTsKKwkJZmluYWwgTm9kZSBub2RlQiA9IFRlc3RVdGlsLmNyZWF0ZVN0YXRpY2FsbHlMYWJlbGVkTm9kZSgpOworCQlNaXhpbmdFZGdlIG1peGluZ0VkZ2UgPSBFZGdlc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1peGluZ0VkZ2UoKTsKKwkJbWl4aW5nRWRnZS5zZXROb2RlQVVSSShub2RlQS5nZXRVUkkoKSk7CisJCW1peGluZ0VkZ2Uuc2V0Tm9kZUJVUkkobm9kZUIuZ2V0VVJJKCkpOworCQkKKwkJLy9NYWtlIHN1cmUgdGhlIG5vZGUgc3R1ZmYgaXMgYWxsIGNvb2wuCisJCW1peGluZ0VkZ2Uuc2V0QShub2RlQSk7CisJCW1peGluZ0VkZ2Uuc2V0Qihub2RlQik7CisJCW5vZGVBLmdldEVkZ2VzKCkuYWRkKG1peGluZ0VkZ2UpOworCQlub2RlQi5nZXRFZGdlcygpLmFkZChtaXhpbmdFZGdlKTsKKwkJCisJCXJldHVybiBtaXhpbmdFZGdlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTWl4aW5nIEVkZ2UgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNaXhpbmdFZGdlIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCX0KKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisJCisJLyoqUGVyZm9ybSBiYXNpYyB0ZXN0cyBvbiB0aGlzIGZpeHR1cmUqLworCXB1YmxpYyB2b2lkIHRlc3RGaXh0dXJlKCkgeworCQlNaXhpbmdFZGdlIG1peGluZ0VkZ2UgID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnROb3ROdWxsKG1peGluZ0VkZ2UpOworCQlhc3NlcnRUcnVlKG1peGluZ0VkZ2Uuc2FuZSgpKTsKKwkJYXNzZXJ0RmFsc2UobWl4aW5nRWRnZS5pc0RpcmVjdGVkKCkpOworCQkKKwkJYXNzZXJ0Tm90TnVsbChtaXhpbmdFZGdlLmdldExhYmVsKCkpOworCX0KKwkKKwkvKipUZXN0IHNldHRpbmcgdGhlIGxhYmVsKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TGFiZWwoKSB7CisJCU1peGluZ0VkZ2UgbWl4aW5nRWRnZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0RmFsc2UobWl4aW5nRWRnZS5nZXRMYWJlbCgpID09IFRFU1RfTEFCRUwpOworCQltaXhpbmdFZGdlLnNldExhYmVsKFRFU1RfTEFCRUwpOworCQlhc3NlcnRUcnVlKG1peGluZ0VkZ2UuZ2V0TGFiZWwoKT09VEVTVF9MQUJFTCk7CisJCWFzc2VydFRydWUobWl4aW5nRWRnZS5zYW5lKCkpOworCX0KKwkKKwkvKioKKwkqb3ZlcnJpZGUgb2YgaXMgZGlyZWN0ZWQgdGVzdCwgc2luY2UgdGhlc2UgZWRnZXMKKwkqY2Fubm90IGJlIGRpcmVjdGVkCisJICovCisJcHVibGljIHZvaWQgdGVzdElzRGlyZWN0ZWRBdF9fTm9kZSgpIHsKKwkJZmluYWwgRWRnZSBlZGdlID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBOb2RlIG5vZGVBID0gZWRnZS5nZXRBKCk7CisJCWZpbmFsIE5vZGUgbm9kZUIgPSBlZGdlLmdldEIoKTsKKworCQlhc3NlcnRGYWxzZShlZGdlLmlzRGlyZWN0ZWQoKSk7CisKKwkJYXNzZXJ0RmFsc2UoZWRnZS5pc0RpcmVjdGVkQXQobm9kZUEpKTsKKwkJYXNzZXJ0RmFsc2UoZWRnZS5pc0RpcmVjdGVkQXQobm9kZUIpKTsKKworCX0gLy8gdGVzdElzRGlyZWN0ZWRBdF9fTm9kZQorCit9IC8vTWl4aW5nRWRnZVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Rlc3RzL0FyZWFMYWJlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Rlc3RzL0FyZWFMYWJlbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTZjM2FmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvdGVzdHMvQXJlYUxhYmVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFyZWEgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHRlc3RlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWwjZ2V0Q3VycmVudEFyZWFWYWx1ZSgpIDxlbT5DdXJyZW50IEFyZWEgVmFsdWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQXJlYUxhYmVsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBBcmVhIExhYmVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQXJlYUxhYmVsIGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKEFyZWFMYWJlbFRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgQXJlYSBMYWJlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBcmVhTGFiZWxUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgQXJlYSBMYWJlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShBcmVhTGFiZWwgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgQXJlYSBMYWJlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFyZWFMYWJlbCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKGNyZWF0ZUZpeHR1cmUoKSk7CisJfSAvLyBzZXRVcAorCisJLyoqCisJICogQHJldHVybiBhbiBBcmVhTGFiZWwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFyZWFMYWJlbCBjcmVhdGVGaXh0dXJlKCkgeworCQlmaW5hbCBBcmVhTGFiZWwgcmV0VmFsdWUgPSBMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcmVhTGFiZWwoKTsKKwkJcmV0VmFsdWUuc2V0Q3VycmVudFZhbHVlKEFyZWFMYWJlbFZhbHVlVGVzdC5jcmVhdGVGaXh0dXJlKCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsI2dldEN1cnJlbnRBcmVhVmFsdWUoKSA8ZW0+Q3VycmVudCBBcmVhIFZhbHVlPC9lbT59JworCSAqIGZlYXR1cmUgZ2V0dGVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkFyZWFMYWJlbCNnZXRDdXJyZW50QXJlYVZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRDdXJyZW50QXJlYVZhbHVlKCkgeworCQlmaW5hbCBBcmVhTGFiZWwgYXJlYUxhYmVsID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGFyZWFMYWJlbC5nZXRDdXJyZW50QXJlYVZhbHVlKCkuZ2V0QXJlYSgpID09IEFyZWFMYWJlbFZhbHVlVGVzdC5URVNUX0FSRUFfVkFMVUUpOworCX0gLy8gdGVzdEdldEN1cnJlbnRBcmVhVmFsdWUKKworCS8qKgorCSAqIFRlc3QgdGhlIHNhbml0eSBvZiB0aGUgZml4dHVyZQorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RGaXh0dXJlU2FuaXR5KCkgeworCQlmaW5hbCBBcmVhTGFiZWwgYXJlYUxhYmVsID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGFyZWFMYWJlbC5zYW5lKCkpOworCX0gLy8gdGVzdEZpeHR1cmVTYW5pdHkKKworfSAvLyBBcmVhTGFiZWxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9BcmVhTGFiZWxWYWx1ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Rlc3RzL0FyZWFMYWJlbFZhbHVlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMTkwZjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9BcmVhTGFiZWxWYWx1ZVRlc3QuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFyZWEgTGFiZWwgVmFsdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEFyZWFMYWJlbFZhbHVlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCS8qKgorCSAqIFRoZSB0ZXN0IGFyZWEgdmFsdWUgKGttXjIpCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgVEVTVF9BUkVBX1ZBTFVFID0gMTsKKworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIEFyZWEgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBcmVhTGFiZWxWYWx1ZSBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihBcmVhTGFiZWxWYWx1ZVRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgQXJlYSBMYWJlbCBWYWx1ZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBcmVhTGFiZWxWYWx1ZVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBBcmVhIExhYmVsIFZhbHVlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKEFyZWFMYWJlbFZhbHVlIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEFyZWEgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQXJlYUxhYmVsVmFsdWUgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gY3JlYXRlIGFuIGluaXRpYWxpemVkIEFyZWFMYWJlbFZhbHVlCisJICogQHNlZSAjVEVTVF9BUkVBX1ZBTFVFCisJICovCisJcHVibGljIHN0YXRpYyBBcmVhTGFiZWxWYWx1ZSBjcmVhdGVGaXh0dXJlKCkgeworCQlmaW5hbCBBcmVhTGFiZWxWYWx1ZSByZXRWYWx1ZSA9IExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZUFyZWFMYWJlbFZhbHVlKCk7CisKKwkJcmV0VmFsdWUuc2V0QXJlYShURVNUX0FSRUFfVkFMVUUpOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUZpeHR1cmUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IHRoYXQgdGhlIGZpeHR1cmUgaXMgc2FuZQorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RGaXh0dXJlU2FuaXR5KCkgeworCQlmaW5hbCBBcmVhTGFiZWxWYWx1ZSBhcmVhTGFiZWxWYWx1ZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShhcmVhTGFiZWxWYWx1ZS5zYW5lKCkpOworCQlhc3NlcnRUcnVlKGFyZWFMYWJlbFZhbHVlLmdldEFyZWEoKSA9PSBURVNUX0FSRUFfVkFMVUUpOworCX0gLy8gdGVzdEZpeHR1cmVTYW5pdHkKK30gLy8gQXJlYUxhYmVsVmFsdWVUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Rlc3RzL0NvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZjE3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFRlc3QuamF2YQpAQCAtMCwwICsxLDgzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbW1vbiBCb3JkZXIgUmVsYXRpb25zaGlwIExhYmVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFRlc3QgZXh0ZW5kcyBQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVGVzdCB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgQ29tbW9uIEJvcmRlciBSZWxhdGlvbnNoaXAgTGFiZWwgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIENvbW1vbiBCb3JkZXIgUmVsYXRpb25zaGlwIExhYmVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbClmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RGaXh0dXJlU2FuaXR5KCkgeworCQlhc3NlcnRUcnVlKGdldEZpeHR1cmUoKS5zYW5lKCkpOworCX0KK30gLy9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Rlc3RzL0NvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YmQ3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9Db21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlVGVzdC5qYXZhCkBAIC0wLDAgKzEsODYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkNvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21tb24gQm9yZGVyIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZVRlc3QgZXh0ZW5kcyBQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVUZXN0IHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWVUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IENvbW1vbiBCb3JkZXIgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIENvbW1vbiBCb3JkZXIgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVmFsdWUpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIFRlc3QgdGhlIHNhbml0eSBvZiB0aGUgZml4dHVyZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Rml4dHVyZVNhbml0eSgpIHsKKwkJYXNzZXJ0VHJ1ZShnZXRGaXh0dXJlKCkuc2FuZSgpKTsKKwl9Cit9IC8vQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxWYWx1ZVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Rlc3RzL0RlZmluaXRpb25zQWxsVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Rlc3RzL0RlZmluaXRpb25zQWxsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjNkYjEzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvdGVzdHMvRGVmaW5pdGlvbnNBbGxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMudGVzdHMuTm9kZXNUZXN0czsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3Qgc3VpdGUgZm9yIHRoZSAnPGVtPjxiPkRlZmluaXRpb25zPC9iPjwvZW0+JworICogbW9kZWwuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRGVmaW5pdGlvbnNBbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIiI7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBhcmdzCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IERlZmluaXRpb25zQWxsVGVzdHMoIkRlZmluaXRpb25zIFRlc3RzIik7CisJCXN1aXRlLmFkZFRlc3QoTGFiZWxzVGVzdHMuc3VpdGUoKSk7CisJCXN1aXRlLmFkZFRlc3QoTm9kZXNUZXN0cy5zdWl0ZSgpKTsKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERlZmluaXRpb25zQWxsVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCit9IC8vIERlZmluaXRpb25zQWxsVGVzdHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Rlc3RzL0xhYmVsc1Rlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9MYWJlbHNUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OTcyZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9MYWJlbHNUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+bGFiZWxzPC9iPjwvZW0+JworICogcGFja2FnZS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBMYWJlbHNUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBMYWJlbHNUZXN0cygibGFiZWxzIFRlc3RzIik7IC8vJE5PTi1OTFMtMSQKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEFyZWFMYWJlbFRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXJlYUxhYmVsVmFsdWVUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXBMYWJlbFZhbHVlVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShQb3B1bGF0aW9uTGFiZWxUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFBvcHVsYXRpb25MYWJlbFZhbHVlVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZVRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlVGVzdC5jbGFzcyk7CisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMYWJlbHNUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKK30gLy8gTGFiZWxzVGVzdHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Rlc3RzL1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOTFkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBQaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBQaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworfSAvL1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZiMzliZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Rlc3RzL1BoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBQaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZVRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgUGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBQaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIFRlc3QgdGhhdCB0aGUgZml4dHVyZSBpcyBzYW5lLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RGaXh0dXJlU2FuaXR5KCkgeworCQlhc3NlcnRUcnVlKGdldEZpeHR1cmUoKS5zYW5lKCkpOworCX0KK30gLy9QaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9Qb3B1bGF0aW9uTGFiZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9Qb3B1bGF0aW9uTGFiZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4OTZiMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Rlc3RzL1BvcHVsYXRpb25MYWJlbFRlc3QuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlBvcHVsYXRpb25MYWJlbEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5SZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy50ZXN0cy5SZWdpb25UZXN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9wdWxhdGlvbiBMYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgdGVzdGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbCNnZXRDdXJyZW50UG9wdWxhdGlvblZhbHVlKCkgPGVtPkN1cnJlbnQgUG9wdWxhdGlvbiBWYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBQb3B1bGF0aW9uTGFiZWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFBvcHVsYXRpb24gTGFiZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQb3B1bGF0aW9uTGFiZWwgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBhcmdzCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oUG9wdWxhdGlvbkxhYmVsVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBQb3B1bGF0aW9uIExhYmVsIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBvcHVsYXRpb25MYWJlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBQb3B1bGF0aW9uIExhYmVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKFBvcHVsYXRpb25MYWJlbCBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBQb3B1bGF0aW9uIExhYmVsIHRlc3QgY2FzZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBvcHVsYXRpb25MYWJlbCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKGNyZWF0ZUZpeHR1cmUoKSk7CisJfSAvLyBzZXRVcAorCisJLyoqCisJICogQHJldHVybiBhIFBvcHVsYXRpb25MYWJlbCB3aXRoIGh1bWFuIHBvcHVsYXRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFBvcHVsYXRpb25MYWJlbCBjcmVhdGVGaXh0dXJlKCkgeworCQlyZXR1cm4gTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9wdWxhdGlvbkxhYmVsKCk7CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsI2dldEN1cnJlbnRQb3B1bGF0aW9uVmFsdWUoKSA8ZW0+Q3VycmVudCBQb3B1bGF0aW9uIFZhbHVlPC9lbT59JworCSAqIGZlYXR1cmUgZ2V0dGVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbCNnZXRDdXJyZW50UG9wdWxhdGlvblZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRDdXJyZW50UG9wdWxhdGlvblZhbHVlKCkgeworCQlmaW5hbCBQb3B1bGF0aW9uTGFiZWwgcG9wdWxhdGlvbkxhYmVsID0gZ2V0Rml4dHVyZSgpOworCisJCWZpbmFsIFBvcHVsYXRpb25MYWJlbFZhbHVlIHZhbHVlID0gcG9wdWxhdGlvbkxhYmVsCisJCQkJLmdldEN1cnJlbnRQb3B1bGF0aW9uVmFsdWUoKTsKKwkJYXNzZXJ0VHJ1ZSh2YWx1ZS5nZXRDb3VudCgpID09IDApOworCX0gLy8gdGVzdEdldEN1cnJlbnRQb3B1bGF0aW9uVmFsdWUKKworCS8qKgorCSAqIE1ha2Ugc3VyZSB0aGUgZml4dHVyZSBtYWtlcyBzZW5zZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Rml4dHVyZSgpIHsKKwkJZmluYWwgUG9wdWxhdGlvbkxhYmVsIHBvcHVsYXRpb25MYWJlbCA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0Tm90TnVsbChwb3B1bGF0aW9uTGFiZWwpOworCQlhc3NlcnRUcnVlKHBvcHVsYXRpb25MYWJlbC5zYW5lKCkpOworCQlhc3NlcnRUcnVlKHBvcHVsYXRpb25MYWJlbC5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpLmVxdWFscygKKwkJCQlQb3B1bGF0aW9uTGFiZWwuSFVNQU4pKTsKKwkJYXNzZXJ0VHJ1ZShwb3B1bGF0aW9uTGFiZWwuZ2V0TmFtZSgpLmVxdWFscyhQb3B1bGF0aW9uTGFiZWwuSFVNQU4pKTsKKwl9IC8vIHRlc3RGaXh0dXJlCisKKwkvKioKKwkgKiBUZXN0IHRoZSB0aGUgc3RhdGljIG1ldGhvZCBnZXRQb3B1bGF0aW9uTGFiZWwgYWN0dWFsbHkgZ2V0cyB0aGUKKwkgKiBwb3B1bGF0aW9uIGxhYmVsCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldFBvcHVsYXRpb25MYWJlbCgpIHsKKwkJZmluYWwgUmVnaW9uIGZpeHR1cmUgPSBSZWdpb25UZXN0LmNyZWF0ZUZpeHR1cmUoKTsKKwkJZmluYWwgUG9wdWxhdGlvbkxhYmVsIHBvcHVsYXRpb25MYWJlbCA9IFBvcHVsYXRpb25MYWJlbEltcGwKKwkJCQkuZ2V0UG9wdWxhdGlvbkxhYmVsKGNyZWF0ZUZpeHR1cmUoKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpLAorCQkJCQkJZml4dHVyZSk7CisJCWFzc2VydE5vdE51bGwocG9wdWxhdGlvbkxhYmVsKTsKKwl9IC8vIHRlc3RHZXRQb3B1bGF0aW9uTGFiZWwKKworfSAvLyBQb3B1bGF0aW9uTGFiZWxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9Qb3B1bGF0aW9uTGFiZWxWYWx1ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Rlc3RzL1BvcHVsYXRpb25MYWJlbFZhbHVlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYTAzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9Qb3B1bGF0aW9uTGFiZWxWYWx1ZVRlc3QuamF2YQpAQCAtMCwwICsxLDExMSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuaW1wbC5Qb3B1bGF0aW9uTGFiZWxWYWx1ZUltcGw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3B1bGF0aW9uIExhYmVsIFZhbHVlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBQb3B1bGF0aW9uTGFiZWxWYWx1ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgUG9wdWxhdGlvbiBMYWJlbCBWYWx1ZSB0ZXN0IGNhc2UuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQb3B1bGF0aW9uTGFiZWxWYWx1ZSBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihQb3B1bGF0aW9uTGFiZWxWYWx1ZVRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgUG9wdWxhdGlvbiBMYWJlbCBWYWx1ZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQb3B1bGF0aW9uTGFiZWxWYWx1ZVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBQb3B1bGF0aW9uIExhYmVsIFZhbHVlIHRlc3QgY2FzZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShQb3B1bGF0aW9uTGFiZWxWYWx1ZSBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBQb3B1bGF0aW9uIExhYmVsIFZhbHVlIHRlc3QgY2FzZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBvcHVsYXRpb25MYWJlbFZhbHVlIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3B1bGF0aW9uTGFiZWxWYWx1ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogTWFrZSBzdXJlIHRoZSBmaXh0dXJlIG1ha2VzIHNlbnNlLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RGaXh0dXJlKCkgeworCQlmaW5hbCBQb3B1bGF0aW9uTGFiZWxWYWx1ZSBwb3B1bGF0aW9uTGFiZWxWYWx1ZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0Tm90TnVsbChwb3B1bGF0aW9uTGFiZWxWYWx1ZSk7CisJCWFzc2VydFRydWUoKChQb3B1bGF0aW9uTGFiZWxWYWx1ZUltcGwpIHBvcHVsYXRpb25MYWJlbFZhbHVlKS5zYW5lKCkpOworCQkKKwl9IC8vIHRlc3RGaXh0dXJlCit9IC8vIFBvcHVsYXRpb25MYWJlbFZhbHVlVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvdGVzdHMvUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvdGVzdHMvUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZTU2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxUZXN0LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVsYXRpdmUgUGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSB0ZXN0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsI2dldEN1cnJlbnRSZWxhdGlvbnNoaXAoKSA8ZW0+Q3VycmVudCBSZWxhdGlvbnNoaXA8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVGVzdCBleHRlbmRzCisJCVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxUZXN0IHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFJlbGF0aXZlIFBoeXNpY2FsIFJlbGF0aW9uc2hpcCBMYWJlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBSZWxhdGl2ZSBQaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsI2dldEN1cnJlbnRSZWxhdGlvbnNoaXAoKSA8ZW0+Q3VycmVudCBSZWxhdGlvbnNoaXA8L2VtPn0nCisJICogZmVhdHVyZSBnZXR0ZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsI2dldEN1cnJlbnRSZWxhdGlvbnNoaXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldEN1cnJlbnRSZWxhdGlvbnNoaXAoKSB7CisJCWZpbmFsIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbCBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGZpeHR1cmUuZ2V0Q3VycmVudFJlbGF0aW9uc2hpcCgpID09IGZpeHR1cmUKKwkJCQkuZ2V0Q3VycmVudFZhbHVlKCkpOworCX0gLy8gdGVzdEdldEN1cnJlbnRSZWxhdGlvbnNoaXAKKworCS8qKgorCSAqIFRlc3QgdGhhdCB0aGUgZml4dHVyZSBpcyBzYW5lLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RGaXh0dXJlU2FuaXR5KCkgeworCQlmaW5hbCBSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWwgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShmaXh0dXJlLnNhbmUoKSk7CisJfSAvLyB0ZXN0Rml4dHVyZVNhbml0eQorCit9IC8vIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Rlc3RzL1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvdGVzdHMvUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhODM0NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Rlc3RzL1JlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZWxhdGl2ZSBQaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWwgVmFsdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBSZWxhdGl2ZSBQaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZVRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgUmVsYXRpdmUgUGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUmVsYXRpdmUgUGh5c2ljYWwgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShSZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxWYWx1ZSBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBSZWxhdGl2ZSBQaHlzaWNhbCBSZWxhdGlvbnNoaXAgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IHRoYXQgdGhlIGZpeHR1cmUgaXMgc2FuZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Rml4dHVyZVNhbml0eSgpIHsKKwkJZmluYWwgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShmaXh0dXJlLnNhbmUoKSk7CisJfSAvLyB0ZXN0Rml4dHVyZVNhbml0eQorCit9IC8vIFJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbFZhbHVlVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvdGVzdHMvUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvdGVzdHMvUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjY2Y5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxUZXN0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvYWQgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVGVzdCBleHRlbmRzIFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxUZXN0IHsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBSb2FkIFRyYW5zcG9ydCBSZWxhdGlvbnNoaXAgTGFiZWwgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBSb2FkIFRyYW5zcG9ydCBSZWxhdGlvbnNoaXAgTGFiZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisKKwlwdWJsaWMgdm9pZCB0ZXN0Rml4dHVyZVNhbml0eSgpIHsKKwkJYXNzZXJ0VHJ1ZShnZXRGaXh0dXJlKCkuc2FuZSgpKTsKKwl9CisJCit9IC8vUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvdGVzdHMvUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9Sb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmViM2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9sYWJlbHMvdGVzdHMvUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVUZXN0LmphdmEKQEAgLTAsMCArMSw4OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9hZCBUcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZVRlc3QgZXh0ZW5kcyBQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsVmFsdWVUZXN0IHsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFJvYWQgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUm9hZCBUcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChSb2FkVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSlmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvYWRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIFRlc3QgdGhlIHNhbml0eSBvZiB0aGUgZml4dHVyZS4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0ZXN0Rml4dHVyZVNhbml0eSgpIHsKKwkJYXNzZXJ0VHJ1ZShnZXRGaXh0dXJlKCkuc2FuZSgpKTsKKwl9CisJCit9IC8vUm9hZFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Rlc3RzL1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNGUxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFRlc3QuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuRGVjb3JhdG9yc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEVkZ2VEZWNvcmF0b3IxOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgdGVzdGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsI2dldEN1cnJlbnRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkgPGVtPkN1cnJlbnQgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwjZ2V0RGVwYXJ0dXJlQ2FwYWNpdHkoKSA8ZW0+RGVwYXJ0dXJlIENhcGFjaXR5PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCNnZXRDYXBhY2l0eSgpIDxlbT5DYXBhY2l0eTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCB0ZXN0IGNhc2UuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBUcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCB0ZXN0IGNhc2UuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCB0ZXN0IGNhc2UuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKGNyZWF0ZUZpeHR1cmUoKSk7CisJfSAvLyBzZXRVcAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsI2dldEN1cnJlbnRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlKCkgPGVtPkN1cnJlbnQgVHJhbnNwb3J0IFJlbGF0aW9uc2hpcCBMYWJlbCBWYWx1ZTwvZW0+fScKKwkgKiBmZWF0dXJlIGdldHRlci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCNnZXRDdXJyZW50VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VycmVudFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUoKSB7CisJCWZpbmFsIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoZml4dHVyZS5nZXRDdXJyZW50VHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpICE9IG51bGwpOworCX0gLy8gdGVzdEdldEN1cnJlbnRUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlCisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCNnZXREZXBhcnR1cmVDYXBhY2l0eSgpIDxlbT5EZXBhcnR1cmUgQ2FwYWNpdHk8L2VtPn0nIGZlYXR1cmUgZ2V0dGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCNnZXREZXBhcnR1cmVDYXBhY2l0eSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVwYXJ0dXJlQ2FwYWNpdHkoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIGZlYXR1cmUgZ2V0dGVyIHRlc3QgbWV0aG9kCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCWFzc2VydFRydWUodHJ1ZSk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwjZ2V0Q2FwYWNpdHkoKSA8ZW0+Q2FwYWNpdHk8L2VtPn0nIGZlYXR1cmUgZ2V0dGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCNnZXRDYXBhY2l0eSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2FwYWNpdHkoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIGZlYXR1cmUgZ2V0dGVyIHRlc3QgbWV0aG9kCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCWFzc2VydFRydWUodHJ1ZSk7CisJfQorCisJLyoqCisJICogQHJldHVybiBhIGZpeHR1cmUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsIGNyZWF0ZUZpeHR1cmUoKSB7CisJCWZpbmFsIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsIHRlbXAgPSBMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbCgpOworCQlmaW5hbCBUZXN0RWRnZURlY29yYXRvcjEgdGVkID0gRGVjb3JhdG9yc0ZhY3RvcnkuZUlOU1RBTkNFCisJCS5jcmVhdGVUZXN0RWRnZURlY29yYXRvcjEoKTsKKwkJdGVtcC5zZXREZWNvcmF0b3IodGVkKTsKKwkJdGVtcC5zZXRDdXJyZW50VmFsdWUoVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZVRlc3QKKwkJCQkuY3JlYXRlRml4dHVyZSgpKTsKKwkJcmV0dXJuIHRlbXA7CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKKwkvKioKKwkgKiBUZXN0IHRoYXQgdGhlIGZpeHR1cmUgaXMgc2FuZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Rml4dHVyZVNhbml0eSgpIHsKKwkJZmluYWwgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShmaXh0dXJlLnNhbmUoKSk7CisJfSAvLyB0ZXN0Rml4dHVyZVNhbml0eQorCisJLyoqCisJICogdGVzdCBjcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXAKKwkgKi8KKwkvLyBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVHJhbnNwb3J0UmVsYXRpb25zaGlwKCkgeworCS8vIGZhaWwoKTsKKwkvLyB9IC8vIHRlc3RDcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXAKKwkvLworCS8vIC8qKgorCS8vICogdGVzdCBjcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXAgKGRpcmVjdGVkKQorCS8vICovCisJLy8gcHVibGljIHZvaWQgdGVzdENyZWF0ZVRyYW5zcG9ydFJlbGF0aW9uc2hpcERpcmVjdGVkKCkgeworCS8vIGZhaWwoKTsKKwkvLyB9IC8vIHRlc3RDcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXBEaXJlY3RlZAorfSAvLyBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbGFiZWxzL3Rlc3RzL1RyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZDZjMzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL2xhYmVscy90ZXN0cy9UcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBUcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlIHRlc3QgY2FzZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWUgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBUcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBUcmFuc3BvcnQgUmVsYXRpb25zaGlwIExhYmVsIFZhbHVlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFRyYW5zcG9ydCBSZWxhdGlvbnNoaXAgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKGNyZWF0ZUZpeHR1cmUoKSk7CisJfSAvLyBzZXRVcAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSBjcmVhdGVGaXh0dXJlKCkgeworCQlmaW5hbCBUcmFuc3BvcnRSZWxhdGlvbnNoaXBMYWJlbFZhbHVlIHJldFZhbHVlID0gTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSgpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKKwkvKioKKwkgKiBUZXN0IHRoYXQgdGhlIGZpeHR1cmUgaXMgc2FuZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Rml4dHVyZVNhbml0eSgpIHsKKwkJZmluYWwgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxWYWx1ZSBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGZpeHR1cmUuc2FuZSgpKTsKKwl9IC8vIHRlc3RGaXh0dXJlU2FuaXR5Cit9IC8vIFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsVmFsdWVUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL3Rlc3RzL0dlb2dyYXBoaWNGZWF0dXJlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy90ZXN0cy9HZW9ncmFwaGljRmVhdHVyZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWQ5NWI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy9ub2Rlcy90ZXN0cy9HZW9ncmFwaGljRmVhdHVyZVRlc3QuamF2YQpAQCAtMCwwICsxLDYzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLkdlb2dyYXBoaWNGZWF0dXJlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R2VvZ3JhcGhpYyBGZWF0dXJlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VvZ3JhcGhpY0ZlYXR1cmVUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIEdlb2dyYXBoaWMgRmVhdHVyZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEdlb2dyYXBoaWNGZWF0dXJlIGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBHZW9ncmFwaGljIEZlYXR1cmUgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHZW9ncmFwaGljRmVhdHVyZVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBHZW9ncmFwaGljIEZlYXR1cmUgdGVzdCBjYXNlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKEdlb2dyYXBoaWNGZWF0dXJlIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEdlb2dyYXBoaWMgRmVhdHVyZSB0ZXN0IGNhc2UuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBHZW9ncmFwaGljRmVhdHVyZSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKK30gLy8gR2VvZ3JhcGhpY0ZlYXR1cmVUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL3Rlc3RzL05vZGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL3Rlc3RzL05vZGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjNDVlYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbm9kZXMvdGVzdHMvTm9kZVRlc3QuamF2YQpAQCAtMCwwICsxLDY0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Tm9kZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgTm9kZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE5vZGUgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IE5vZGUgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vZGVUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTm9kZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShOb2RlIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIE5vZGUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBOb2RlIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworfSAvL05vZGVUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL3Rlc3RzL05vZGVzVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbm9kZXMvdGVzdHMvTm9kZXNUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzODRhOTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL3Rlc3RzL05vZGVzVGVzdHMuamF2YQpAQCAtMCwwICsxLDUyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IHN1aXRlIGZvciB0aGUgJzxlbT48Yj5ub2RlczwvYj48L2VtPicKKyAqIHBhY2thZ2UuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTm9kZXNUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IE5vZGVzVGVzdHMoIm5vZGVzIFRlc3RzIik7IC8vJE5PTi1OTFMtMSQKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlZ2lvblRlc3QuY2xhc3MpOworCQlyZXR1cm4gc3VpdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb2Rlc1Rlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworfSAvLyBOb2Rlc1Rlc3RzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL3Rlc3RzL1JlZ2lvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvbm9kZXMvdGVzdHMvUmVnaW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNTEyYTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL25vZGVzL3Rlc3RzL1JlZ2lvblRlc3QuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMudGVzdHMuUG9wdWxhdGlvbkxhYmVsVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLk5vZGVzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLlJlZ2lvbjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlZ2lvbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQgTk9UCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFJlZ2lvblRlc3QgZXh0ZW5kcyBHZW9ncmFwaGljRmVhdHVyZVRlc3QgeworCQorCS8qKgorCSAqIE5vZGUgVVJJCisJICovCisJcHVibGljIHN0YXRpYyBVUkkgTk9ERV9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSSgiTk9ERS90ZXN0Tm9kZSIpOworCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFJlZ2lvblRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgUmVnaW9uIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUmVnaW9uVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFJlZ2lvbiB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFJlZ2lvbiBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFJlZ2lvbilmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9IC8vIHNldFVwCisKKwkvKioKKwkgKiBAcmV0dXJuIGEgcmVnaW9uIG5vZGUgd2l0aCBhIHBvcHVsYXRpb24gbGFiZWwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlZ2lvbiBjcmVhdGVGaXh0dXJlKCkgeworCQlmaW5hbCBSZWdpb24gcmV0VmFsdWUgPSBOb2Rlc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlZ2lvbigpOworCQlmaW5hbCBQb3B1bGF0aW9uTGFiZWwgcG9wdWxhdGlvbkxhYmVsID0gUG9wdWxhdGlvbkxhYmVsVGVzdAorCQkJCS5jcmVhdGVGaXh0dXJlKCk7CisJCXJldFZhbHVlLmdldExhYmVscygpLmFkZChwb3B1bGF0aW9uTGFiZWwpOworCQlyZXRWYWx1ZS5zZXRVUkkoTk9ERV9VUkkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogVGVzdCB0aGF0IHRoZSBmaXh0dXJlIGlzIHNhbmUuCisJICovCisJcHVibGljIHZvaWQgdGVzdEZpeHR1cmVTYW5pdHkoKSB7CisJCWZpbmFsIFJlZ2lvbiBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGZpeHR1cmUuc2FuZSgpKTsKKwl9IC8vIHRlc3RGaXh0dXJlU2FuaXR5CisKK30gLy8gUmVnaW9uVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy90ZXN0cy9DYXRlZ29yaXplZFR5cGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3R5cGVzL3Rlc3RzL0NhdGVnb3JpemVkVHlwZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTMxZmRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy90ZXN0cy9DYXRlZ29yaXplZFR5cGVUZXN0LmphdmEKQEAgLTAsMCArMSw2NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuQ2F0ZWdvcml6ZWRUeXBlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhdGVnb3JpemVkIFR5cGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDYXRlZ29yaXplZFR5cGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgQ2F0ZWdvcml6ZWQgVHlwZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENhdGVnb3JpemVkVHlwZSBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgQ2F0ZWdvcml6ZWQgVHlwZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ2F0ZWdvcml6ZWRUeXBlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIENhdGVnb3JpemVkIFR5cGUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoQ2F0ZWdvcml6ZWRUeXBlIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIENhdGVnb3JpemVkIFR5cGUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDYXRlZ29yaXplZFR5cGUgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCit9IC8vQ2F0ZWdvcml6ZWRUeXBlVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy90ZXN0cy9SYXRlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kZWZpbml0aW9ucy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90eXBlcy90ZXN0cy9SYXRlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMDkzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3R5cGVzL3Rlc3RzL1JhdGVUZXN0LmphdmEKQEAgLTAsMCArMSw2NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnR5cGVzLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuUmF0ZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SYXRlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmF0ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBSYXRlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUmF0ZSBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgUmF0ZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUmF0ZVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBSYXRlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKFJhdGUgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUmF0ZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFJhdGUgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCit9IC8vUmF0ZVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHlwZXMvdGVzdHMvVHlwZXNFeGFtcGxlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3R5cGVzL3Rlc3RzL1R5cGVzRXhhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjQzNmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3R5cGVzL3Rlc3RzL1R5cGVzRXhhbXBsZS5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkRpYWdub3N0aWNpYW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMuVHlwZXNQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHNhbXBsZSB1dGlsaXR5IGZvciB0aGUgJzxlbT48Yj50eXBlczwvYj48L2VtPicgcGFja2FnZS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVHlwZXNFeGFtcGxlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIExvYWQgYWxsIHRoZSBhcmd1bWVudCBmaWxlIHBhdGhzIG9yIFVSSXMgYXMgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gYXJncyB0aGUgZmlsZSBwYXRocyBvciBVUklzLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCS8vIENyZWF0ZSBhIHJlc291cmNlIHNldCB0byBob2xkIHRoZSByZXNvdXJjZXMuCisJCS8vCisJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOworCQkKKwkJLy8gUmVnaXN0ZXIgdGhlIGFwcHJvcHJpYXRlIHJlc291cmNlIGZhY3RvcnkgdG8gaGFuZGxlIGFsbCBmaWxlIGV4dGVuc2lvbnMuCisJCS8vCisJCXJlc291cmNlU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0CisJCQkoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5ERUZBVUxUX0VYVEVOU0lPTiwgCisJCQkgbmV3IFhNSVJlc291cmNlRmFjdG9yeUltcGwoKSk7CisKKwkJLy8gUmVnaXN0ZXIgdGhlIHBhY2thZ2UgdG8gZW5zdXJlIGl0IGlzIGF2YWlsYWJsZSBkdXJpbmcgbG9hZGluZy4KKwkJLy8KKwkJcmVzb3VyY2VTZXQuZ2V0UGFja2FnZVJlZ2lzdHJ5KCkucHV0CisJCQkoVHlwZXNQYWNrYWdlLmVOU19VUkksIAorCQkJIFR5cGVzUGFja2FnZS5lSU5TVEFOQ0UpOworICAgICAgICAKKwkJLy8gSWYgdGhlcmUgYXJlIG5vIGFyZ3VtZW50cywgZW1pdCBhbiBhcHByb3ByaWF0ZSB1c2FnZSBtZXNzYWdlLgorCQkvLworCQlpZiAoYXJncy5sZW5ndGggPT0gMCkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJFbnRlciBhIGxpc3Qgb2YgZmlsZSBwYXRocyBvciBVUklzIik7CisJCX0KKwkJZWxzZSB7CisJCQkvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBhcmd1bWVudHMuCisJCQkvLworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7CisJCQkJLy8gQ29uc3RydWN0IHRoZSBVUkkgZm9yIHRoZSBpbnN0YW5jZSBmaWxlLgorCQkJCS8vIFRoZSBhcmd1bWVudCBpcyB0cmVhdGVkIGFzIGEgZmlsZSBwYXRoIG9ubHkgaWYgaXQgZGVub3RlcyBhbiBleGlzdGluZyBmaWxlLgorCQkJCS8vIE90aGVyd2lzZSwgaXQncyBkaXJlY3RseSB0cmVhdGVkIGFzIGEgVVJMLgorCQkJCS8vCisJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoYXJnc1tpXSk7CisJCQkJVVJJIHVyaSA9IGZpbGUuaXNGaWxlKCkgPyBVUkkuY3JlYXRlRmlsZVVSSShmaWxlLmdldEFic29sdXRlUGF0aCgpKTogVVJJLmNyZWF0ZVVSSShhcmdzWzBdKTsKKworCQkJCXRyeSB7CisJCQkJCS8vIERlbWFuZCBsb2FkIHJlc291cmNlIGZvciB0aGlzIGZpbGUuCisJCQkJCS8vCisJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2FkZWQgIiArIHVyaSk7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkvLyBWYWxpZGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIGxvYWRlZCByZXNvdXJjZS4KKwkJCQkJLy8KKwkJCQkJZm9yIChFT2JqZWN0IGVPYmplY3QgOiByZXNvdXJjZS5nZXRDb250ZW50cygpKSB7CisJCQkJCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBEaWFnbm9zdGljaWFuLklOU1RBTkNFLnZhbGlkYXRlKGVPYmplY3QpOworCQkJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCQkJcHJpbnREaWFnbm9zdGljKGRpYWdub3N0aWMsICIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0gbG9hZGluZyAiICsgdXJpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogUHJpbnRzIGRpYWdub3N0aWNzIHdpdGggaW5kZW50YXRpb24uCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIGRpYWdub3N0aWMgdGhlIGRpYWdub3N0aWMgdG8gcHJpbnQuCisJICogQHBhcmFtIGluZGVudCB0aGUgaW5kZW50YXRpb24gZm9yIHByaW50aW5nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcHJpbnREaWFnbm9zdGljKERpYWdub3N0aWMgZGlhZ25vc3RpYywgU3RyaW5nIGluZGVudCkgeworCQlTeXN0ZW0ub3V0LnByaW50KGluZGVudCk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihkaWFnbm9zdGljLmdldE1lc3NhZ2UoKSk7CisJCWZvciAoRGlhZ25vc3RpYyBjaGlsZCA6IGRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKSkgeworCQkJcHJpbnREaWFnbm9zdGljKGNoaWxkLCBpbmRlbnQgKyAiICAiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCit9IC8vVHlwZXNFeGFtcGxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3R5cGVzL3Rlc3RzL1R5cGVzVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHlwZXMvdGVzdHMvVHlwZXNUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YzI4MzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3R5cGVzL3Rlc3RzL1R5cGVzVGVzdHMuamF2YQpAQCAtMCwwICsxLDU1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHlwZXMudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3Qgc3VpdGUgZm9yIHRoZSAnPGVtPjxiPnR5cGVzPC9iPjwvZW0+JyBwYWNrYWdlLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUeXBlc1Rlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVHlwZXNUZXN0cygidHlwZXMgVGVzdHMiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gc3VpdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFR5cGVzVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCit9IC8vVHlwZXNUZXN0cwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leGFtcGxlLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZTg2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leGFtcGxlLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leGFtcGxlLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5YWI5OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leGFtcGxlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leGFtcGxlPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leGFtcGxlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leGFtcGxlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODAwN2M2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsNzggQEAKKyNUdWUgU2VwIDIzIDA5OjM2OjE4IEVEVCAyMDA4CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leGFtcGxlL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZGFmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDE1IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUudGVzdHM7IHNpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcgorQnVuZGxlLUNsYXNzUGF0aDogLgorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS50ZXN0cworUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVsczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZSwKKyBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMsCisgb3JnLmp1bml0O3Zpc2liaWxpdHk6PXJlZXhwb3J0CitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leGFtcGxlL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I1ZjQwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leGFtcGxlL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMyBAQAorIyA8Y29weXJpZ2h0PgorIyA8L2NvcHlyaWdodD4KKyMKKyMgJElkJAorCitiaW4uaW5jbHVkZXMgPSAuLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICBub3RpY2UuaHRtbCxcCisgICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKK2phcnMuY29tcGlsZS5vcmRlciA9IC4KK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YjE5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leGFtcGxlL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoreG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKK3htbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPGxpbmsgcmVsPUZpbGUtTGlzdAoraHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOkRvY3VtZW50UHJvcGVydGllcz4KKyAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KKyAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgorICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+CisgIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+CisgIDxvOlBhZ2VzPjQ8L286UGFnZXM+CisgIDxvOldvcmRzPjE2MjY8L286V29yZHM+CisgIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgorICAgPG86TGluZXM+Nzc8L286TGluZXM+CisgIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KKyAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+CisgIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+CisgPC9vOkRvY3VtZW50UHJvcGVydGllcz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OldvcmREb2N1bWVudD4KKyAgPHc6VHJhY2tSZXZpc2lvbnMvPgorIDwvdzpXb3JkRG9jdW1lbnQ+Cis8L3htbD48IVtlbmRpZl0tLT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlRhaG9tYTsKKwlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKKwltc28tZm9udC1jaGFyc2V0OjA7CisJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7CisJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7CisJbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KK3AuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bXNvLXN0eWxlLXBhcmVudDoiIjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwCisJe21hcmdpbi1yaWdodDowaW47CisJbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CisJbWFyZ2luLWxlZnQ6MGluOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKKwl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZTo4LjBwdDsKKwlmb250LWZhbWlseTpUYWhvbWE7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorQHBhZ2UgU2VjdGlvbjEKKwl7c2l6ZTo4LjVpbiAxMS4waW47CisJbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47CisJbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKKwltc28tZm9vdGVyLW1hcmdpbjouNWluOworCW1zby1wYXBlci1zb3VyY2U6MDt9CitkaXYuU2VjdGlvbjEKKwl7cGFnZTpTZWN0aW9uMTt9CistLT4KKzwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgorPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCitUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAorUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCitPRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCithZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKK3N1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKK2J5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgoraWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KK3N1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCit3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKK2VudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKK2NsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCitvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucworZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KK3JlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50CithIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KK3N0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5CitkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCitSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAorYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCitjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgorb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKK2J5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCit0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCithbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCitSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCitDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgordGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Citmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQordG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKK2lmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKK3RoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQorRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKK3JpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KK3RoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Cis8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK2l0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAorY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQorYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKK2FuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCitlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAoraW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAorYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCitzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0CitDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCitzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCitpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCitjb2RlIGZvcm06PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQorY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQorY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCitvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQorYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycworYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKK29mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAorbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCitDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKK2Nvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCit0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCitjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKK3RvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK3RvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCithbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQoraW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCit3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcworc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCitvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCitjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKK1dJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKK01FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQorUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcworQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKK2VxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgorVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgorVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKK29yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKK2Z1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgorYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAorb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCitzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCitwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQorY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKK3RoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKK0FncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCitzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAorZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCitTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCitBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKK0FncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKK2l0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvbm90aWNlLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9ub3RpY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFmOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvbm90aWNlLmh0bWwKQEAgLTAsMCArMSw3OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5NYXJjaCAxNywgMjAwNTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisgICAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKKyAgIAorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCisgICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKyAgIAorPHVsPgorCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucworICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPiAgIAorIAorPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisJCQorPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisJPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQorCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisgICAKKzxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWNiOTM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNSBAQAorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFRvIGNvZGUgZGV2ZWxvcGVyOgorIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQorIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCisjICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCisjICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3BsdWdpbk5hbWUgPSBTVEVNIEV4YW1wbGUgRGlzZWFzZSBNb2RlbCBUZXN0IFN1aXRlCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL3Rlc3RzL0V4YW1wbGVBbGxUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL3Rlc3RzL0V4YW1wbGVBbGxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZjYwMDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvdGVzdHMvRXhhbXBsZUFsbFRlc3RzLmphdmEKQEAgLTAsMCArMSw1NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+RXhwZXJpbWVudGFsPC9iPjwvZW0+JyBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRXhhbXBsZUFsbFRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IEV4YW1wbGVBbGxUZXN0cygiRXhhbXBsZSBUZXN0cyIpOyAvLyROT04tTkxTLTEkCisJCXN1aXRlLmFkZFRlc3QoRXhhbXBsZVRlc3RzLnN1aXRlKCkpOworCQlyZXR1cm4gc3VpdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4YW1wbGVBbGxUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKK30gLy9FeGFtcGxlQWxsVGVzdHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS90ZXN0cy9FeGFtcGxlRGlzZWFzZU1vZGVsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL3Rlc3RzL0V4YW1wbGVEaXNlYXNlTW9kZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQzNzAxMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS90ZXN0cy9FeGFtcGxlRGlzZWFzZU1vZGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuRXhhbXBsZURpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5FeGFtcGxlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5pbXBsLkV4YW1wbGVEaXNlYXNlTW9kZWxJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNFSVJMYWJlbFZhbHVlSW1wbDsKKworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhhbXBsZSBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRXhhbXBsZURpc2Vhc2VNb2RlbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUkFORE9NX1NFRUQgPSAxbDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBURVNUX0dBSU4gPSAwLjAxZDsKKwkKKwkKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRXhhbXBsZURpc2Vhc2VNb2RlbCBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oRXhhbXBsZURpc2Vhc2VNb2RlbFRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXhhbXBsZURpc2Vhc2VNb2RlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGwjZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoKSA8ZW0+ZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHM8L2VtPn0nIG9wZXJhdGlvbi4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJbXBsI2RvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKCl7CisJCUV4YW1wbGVEaXNlYXNlTW9kZWxUZXN0ZXJJbXBsIGV4cGVyaW1lbnRhbERpc2Vhc2VNb2RlbCA9IG5ldyBFeGFtcGxlRGlzZWFzZU1vZGVsVGVzdGVySW1wbCgpOworCQlTRUlSTGFiZWxWYWx1ZUltcGwgY3VycmVudFNFSVIgPSBuZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMDBkLCA1MGQsIDQwZCwgMzBkLCAyMGQsIDEwZCk7CisJCWRvVGVzdChleHBlcmltZW50YWxEaXNlYXNlTW9kZWwsIGN1cnJlbnRTRUlSKTsKKwl9CisJCisJCisJLyoqCisJICogRG8gdGhlIHRlc3QKKwkgKiBAcGFyYW0gZXhwZXJpbWVudGFsRGlzZWFzZU1vZGVsCisJICogQHBhcmFtIGN1cnJlbnRTRUlSCisJICogQHBhcmFtIHNlaXJBZGRpdGlvbnMKKwkgKiBAcGFyYW0gc2VpckRlYXRocworCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJpdmF0ZSB2b2lkIGRvVGVzdChFeGFtcGxlRGlzZWFzZU1vZGVsVGVzdGVySW1wbCBleHBlcmltZW50YWxEaXNlYXNlTW9kZWwsCisJCQlTRUlSTGFiZWxWYWx1ZUltcGwgY3VycmVudFNFSVIpIHsKKwkJCisJCVNFSVJMYWJlbFZhbHVlSW1wbCBvbGRWYWwgPSAoU0VJUkxhYmVsVmFsdWVJbXBsKUVjb3JlVXRpbC5jb3B5KGN1cnJlbnRTRUlSKTsKKwkJCisJCWRvQ2FsY3VsYXRlTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKGN1cnJlbnRTRUlSLCBSQU5ET01fU0VFRCwgVEVTVF9HQUlOKTsKKworCQlTdHJpbmcgc3RhdGUgPSBnZXRTdGF0ZShjdXJyZW50U0VJUiwgb2xkVmFsKTsKKwkJCisJCXZhbGlkYXRlTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKGN1cnJlbnRTRUlSLAorCQkJCW9sZFZhbCwKKwkJCQlzdGF0ZSk7CisJfQorCQorCisJcHJpdmF0ZSB2b2lkIGRvQ2FsY3VsYXRlTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKAorCQkJU0VJUkxhYmVsVmFsdWVJbXBsIHBDdXJyZW50U0VJUiwKKwkJCWxvbmcgcFJhbmRvbVNlZWQsIGRvdWJsZSBwVGVzdEdhaW4pIHsKKwkJCisJCQorCQlmaW5hbCBTRUlSTGFiZWxWYWx1ZSBjdXJyZW50U0VJUiA9IHBDdXJyZW50U0VJUjsKKwkJUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20ocFJhbmRvbVNlZWQpOworCQlkb3VibGUgSW5vaXN5ID0gY3VycmVudFNFSVIuZ2V0SSgpKiBjb21wdXRlTm9pc2UocFRlc3RHYWluLCByYW5kb20pOworCQljdXJyZW50U0VJUi5zZXRJKElub2lzeSk7CisJCXJldHVybjsKKwkJCQkKKwkJCQkKKwl9CisKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVNb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoU0VJUkxhYmVsVmFsdWVJbXBsIGN1cnJlbnRTRUlSLAorCQkJU0VJUkxhYmVsVmFsdWVJbXBsIG9sZFNFSVIsCisJCQlTdHJpbmcgc3RhdGUpIHsKKwkJCisJCXRyeXsKKwkJCWN1cnJlbnRTRUlSLnNhbmUoKTsKKwkJfQorCQljYXRjaChUaHJvd2FibGUgdCl7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJuZXdTZWlyQWRkaXRpb25zIGlzIGluc2FuZSwgc3RhdGUgaXM6ICIgKyBzdGF0ZSwgdCk7CisJCX0KKwkJdHJ5eworCQkJb2xkU0VJUi5zYW5lKCk7CisJCX0KKwkJY2F0Y2goVGhyb3dhYmxlIHQpeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibmV3U2VpckRlYXRocyBpcyBpbnNhbmUsIHN0YXRlIGlzOiAiICsgc3RhdGUsIHQpOworCQl9CisKKwkJCisJCQorCQlhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImN1cnJlbnRTRUlSIGhhcyBpbnNhbmUgdmFsdWVzICVzIiwgc3RhdGUpLCBteVNhbml0eUNoZWNrKGN1cnJlbnRTRUlSKSk7CisJCWFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgib2xkU0VJUiBoYXMgaW5zYW5lIHZhbHVlcyAlcyIsIHN0YXRlKSwgbXlTYW5pdHlDaGVjayhvbGRTRUlSKSk7CisKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIGNoZWNrRXF1YWwoU0VJUkxhYmVsVmFsdWVJbXBsIHBDYWxjdWxhdGVkU2VpckFkZGl0aW9ucywKKwkJCVNFSVJMYWJlbFZhbHVlSW1wbCBwTmV3U2VpckFkZGl0aW9ucykgeworCQlpZigocENhbGN1bGF0ZWRTZWlyQWRkaXRpb25zLmdldERpc2Vhc2VEZWF0aHMoKSAhPSBwTmV3U2VpckFkZGl0aW9ucy5nZXREaXNlYXNlRGVhdGhzKCkpIHx8CisJCQkJKHBDYWxjdWxhdGVkU2VpckFkZGl0aW9ucy5nZXRFKCkgIT0gcE5ld1NlaXJBZGRpdGlvbnMuZ2V0RSgpKSB8fAorCQkJCShwQ2FsY3VsYXRlZFNlaXJBZGRpdGlvbnMuZ2V0SSgpICE9IHBOZXdTZWlyQWRkaXRpb25zLmdldEkoKSkgfHwKKwkJCQkocENhbGN1bGF0ZWRTZWlyQWRkaXRpb25zLmdldFBvcHVsYXRpb25Db3VudCgpICE9IHBOZXdTZWlyQWRkaXRpb25zLmdldFBvcHVsYXRpb25Db3VudCgpKSB8fAorCQkJCShwQ2FsY3VsYXRlZFNlaXJBZGRpdGlvbnMuZ2V0UigpICE9IHBOZXdTZWlyQWRkaXRpb25zLmdldFIoKSkgfHwKKwkJCQkocENhbGN1bGF0ZWRTZWlyQWRkaXRpb25zLmdldFMoKSAhPSBwTmV3U2VpckFkZGl0aW9ucy5nZXRTKCkpKXsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIG15U2FuaXR5Q2hlY2soU0VJUkxhYmVsVmFsdWVJbXBsIHBTZWlyKSB7CisJCXJldHVybiBhc3NlcnRWYWxpZERvdWJsZShwU2Vpci5nZXRFKCkpICYmIAorCQkJYXNzZXJ0VmFsaWREb3VibGUocFNlaXIuZ2V0SSgpKSAmJiAKKwkJCWFzc2VydFZhbGlkRG91YmxlKHBTZWlyLmdldFIoKSkgJiYgCisJCQlhc3NlcnRWYWxpZERvdWJsZShwU2Vpci5nZXRTKCkpOworCQkKKwl9CisJCisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgZG91YmxlIHByZWNpc2lvbiByYW5kb20gbm9pc2UgdmFyaWFibGUKKwkgKiByIGJldHdlZW4gKDEuMCt4KSBhbmQgKDEuMC14KQorCSAqIHdoZXJlIHggaXMgYSBwcm9kdWN0IEcqIE1hdGgucmFuZCgpLCBhbmQgRyBpcyBhIGdhaW4gZmFjdG9yIDA8RzxtYXggbm9pc2UKKwkgKiAKKwkgKiBAcGFyYW0gZ2FpbgorCSAqIEBwYXJhbSByYW5kCisJICogQHJldHVybiBub2lzZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZG91YmxlIGNvbXB1dGVOb2lzZShmaW5hbCBkb3VibGUgZ2FpbiwgZmluYWwgUmFuZG9tIHJhbmQpIHsKKworCQlkb3VibGUgeCA9ICgyLjAqcmFuZC5uZXh0RG91YmxlKCkpLTEuMDsgLy8gKy8tIDEKKwkJeCAqPSBnYWluOworCQl4ICs9IDEuMDsKKwkJYXNzZXJ0ICgoeD4wLjApJiYoeDwyLjApKSA6ICJyYW5kb20gbm9pc2Ugc2hvdWxkIGJlIGEgc21hbGwgcGVydHVyYmF0aW9uIEdhaW4gZmFjdG9yLCBnLCAgbXVzdCAwLjAgPCBnIDw8IDEuMCAiOworCQlyZXR1cm4geDsKKwkJCisJfSAvLyBnZXROb2lzZQorCQorCisJcHJpdmF0ZSBib29sZWFuIGFzc2VydFZhbGlkRG91YmxlKGRvdWJsZSBwRG91YmxlKSB7CisJCXJldHVybiAhKERvdWJsZS5pc05hTihwRG91YmxlKSB8fCBEb3VibGUuaXNJbmZpbml0ZShwRG91YmxlKSk7CisJfQorCQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhdGUoU0VJUkxhYmVsVmFsdWVJbXBsIHBDdXJyZW50U0VJUiwKKwkJCVNFSVJMYWJlbFZhbHVlSW1wbCBvbGRTRUlSKSB7CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCJcbnByZXNlbnQgc3RhdGUgaXM6IFxuQ3VycmVudFNFSVJbJXNdXG4gb2xkU0VJUlslc11cbiIsIAorCQkJCXBDdXJyZW50U0VJUiwgb2xkU0VJUik7CisJfQorCisJCisJCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKEV4YW1wbGVEaXNlYXNlTW9kZWwgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEV4YW1wbGVEaXNlYXNlTW9kZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoRXhhbXBsZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUV4YW1wbGVEaXNlYXNlTW9kZWwoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJCisJLyoqCisJICogY3JlYXRlZCBqdXN0IGZvciB0ZXN0aW5ncyBzaW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJbXBsI2RvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKCkgPGVtPmRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzPC9lbT59JyBpcyBwcm90ZWN0ZWQuCisJICogQGF1dGhvciBrYXVmbWFuCisJICoKKwkgKi8KKwlwcml2YXRlIGNsYXNzIEV4YW1wbGVEaXNlYXNlTW9kZWxUZXN0ZXJJbXBsIGV4dGVuZHMgRXhhbXBsZURpc2Vhc2VNb2RlbEltcGx7CisKKwkJcHVibGljIHZvaWQgZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoCisJCQkJU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHBDdXJyZW50U3RhdGUsCisJCQkJbG9uZyBwUmFuZG9tU2VlZCwgZG91YmxlIHBUZXN0R2FpbikgeworCQkJc2V0U2VlZChwUmFuZG9tU2VlZCk7CisJCQlzZXRHYWluKHBUZXN0R2Fpbik7CisJCQkKKwkJCS8vU0VJUkxhYmVsVmFsdWVJbXBsIG9sZEN1cnJlbnRTdGF0ZSA9IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0cy5TRUlSTGFiZWxWYWx1ZVRlc3RVdGlsLmNsb25lU0VJUkxhYmVsVmFsdWVJbXBsKChTRUlSTGFiZWxWYWx1ZUltcGwpcEN1cnJlbnRTdGF0ZSk7CisJCQkvL1NFSVJMYWJlbFZhbHVlSW1wbCBvbGRTdGF0ZUFkZGl0aW9uczIgPSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHMuU0VJUkxhYmVsVmFsdWVUZXN0VXRpbC5jbG9uZVNFSVJMYWJlbFZhbHVlSW1wbCgoU0VJUkxhYmVsVmFsdWVJbXBsKXBTdGF0ZUFkZGl0aW9uczIpOworCQkJLy9TRUlSTGFiZWxWYWx1ZUltcGwgb2xkU3RhdGVEZWF0aHMyID0gb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzLlNFSVJMYWJlbFZhbHVlVGVzdFV0aWwuY2xvbmVTRUlSTGFiZWxWYWx1ZUltcGwoKFNFSVJMYWJlbFZhbHVlSW1wbClwU3RhdGVEZWF0aHMyKTsKKwkJCQorCQkJc3VwZXIuZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMocEN1cnJlbnRTdGF0ZSk7CisJCX0KKwkJCisJfS8vIEV4YW1wbGVEaXNlYXNlTW9kZWxUZXN0ZXJJbXBsICBpbm5lciBjbGFzcworCQorfSAvL0V4YW1wbGVEaXNlYXNlTW9kZWxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvdGVzdHMvRXhhbXBsZVRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvdGVzdHMvRXhhbXBsZVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5OGRiNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS90ZXN0cy9FeGFtcGxlVGVzdHMuamF2YQpAQCAtMCwwICsxLDU1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IHN1aXRlIGZvciB0aGUgJzxlbT48Yj5leHBlcmltZW50YWw8L2I+PC9lbT4nIHBhY2thZ2UuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEV4YW1wbGVUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBFeGFtcGxlVGVzdHMoImV4YW1wbGUgVGVzdHMiKTsgLy8kTk9OLU5MUy0xJAorCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRXhhbXBsZURpc2Vhc2VNb2RlbFRlc3QuY2xhc3MpOworCQlyZXR1cm4gc3VpdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4YW1wbGVUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKK30gLy9FeGFtcGxlVGVzdHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRlODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTU1MDhmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZWY0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMTkgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLnRlc3RzOyBzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC50ZXN0cworUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVsczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuanVuaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1ZTMzMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDEyIEBACisjIDxjb3B5cmlnaHQ+CisjIDwvY29weXJpZ2h0PgorIworIyAkSWQkCisKK2Jpbi5pbmNsdWRlcyA9IC4sXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKK2phcnMuY29tcGlsZS5vcmRlciA9IC4KK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2YzMDUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDI2IEBACisjLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBUbyBjb2RlIGRldmVsb3BlcjoKKyMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKKyMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgorIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQorIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitwbHVnaW5OYW1lID0gU1RFTSBFeHBlcmltZW50YWwgRGlzZWFzZSBNb2RlbCBUZXN0IFN1aXRlCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OTRmOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3BsdWdpbi54bWwKQEAgLTAsMCArMSwxMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPCEtLQorIDxjb3B5cmlnaHQ+CisgPC9jb3B5cmlnaHQ+CisKKyAkSWQkCistLT4KKworPHBsdWdpbj4KKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC90ZXN0cy9FeHBlcmltZW50YWxBbGxUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC90ZXN0cy9FeHBlcmltZW50YWxBbGxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYTk5MWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL3Rlc3RzL0V4cGVyaW1lbnRhbEFsbFRlc3RzLmphdmEKQEAgLTAsMCArMSw1OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IHN1aXRlIGZvciB0aGUgJzxlbT48Yj5FeHBlcmltZW50YWw8L2I+PC9lbT4nIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFeHBlcmltZW50YWxBbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gYXJncyAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gIHRoZSB0ZXN0IHN1aXRlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IEV4cGVyaW1lbnRhbEFsbFRlc3RzKCJFeHBlcmltZW50YWwgVGVzdHMiKTsKKwkJc3VpdGUuYWRkVGVzdChFeHBlcmltZW50YWxUZXN0cy5zdWl0ZSgpKTsKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG5hbWUgCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFeHBlcmltZW50YWxBbGxUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKK30gLy9FeHBlcmltZW50YWxBbGxUZXN0cwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC90ZXN0cy9FeHBlcmltZW50YWxFeGFtcGxlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL3Rlc3RzL0V4cGVyaW1lbnRhbEV4YW1wbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmE1NThkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC90ZXN0cy9FeHBlcmltZW50YWxFeGFtcGxlLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5EaWFnbm9zdGljaWFuOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLkV4cGVyaW1lbnRhbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC5FeHBlcmltZW50YWxQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuUGVyY29sYXRpb25EaXNlYXNlTW9kZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgc2FtcGxlIHV0aWxpdHkgZm9yIHRoZSAnPGVtPjxiPmV4cGVyaW1lbnRhbDwvYj48L2VtPicgcGFja2FnZS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRXhwZXJpbWVudGFsRXhhbXBsZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBMb2FkIGFsbCB0aGUgYXJndW1lbnQgZmlsZSBwYXRocyBvciBVUklzIGFzIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIGFyZ3MgdGhlIGZpbGUgcGF0aHMgb3IgVVJJcy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQkvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQgdG8gaG9sZCB0aGUgcmVzb3VyY2VzLgorCQkvLworCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKKwkJCisJCS8vIFJlZ2lzdGVyIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZSBmYWN0b3J5IHRvIGhhbmRsZSBhbGwgZmlsZSBleHRlbnRpb25zLgorCQkvLworCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dAorCQkJKFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04sIAorCQkJIG5ldyBYTUlSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOworCisJCS8vIFJlZ2lzdGVyIHRoZSBwYWNrYWdlIHRvIGVuc3VyZSBpdCBpcyBhdmFpbGFibGUgZHVyaW5nIGxvYWRpbmcuCisJCS8vCisJCXJlc291cmNlU2V0LmdldFBhY2thZ2VSZWdpc3RyeSgpLnB1dAorCQkJKEV4cGVyaW1lbnRhbFBhY2thZ2UuZU5TX1VSSSwgCisJCQkgRXhwZXJpbWVudGFsUGFja2FnZS5lSU5TVEFOQ0UpOworICAgICAgICAKKwkJLy8gSWYgdGhlcmUgYXJlIG5vIGFyZ3VtZW50cywgZW1pdCBhbiBhcHByb3ByaWF0ZSB1c2FnZSBtZXNzYWdlLgorCQkvLworCQlpZiAoYXJncy5sZW5ndGggPT0gMCkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJFbnRlciBhIGxpc3Qgb2YgZmlsZSBwYXRocyBvciBVUklzIHRoYXQgaGF2ZSBjb250ZW50IGxpa2UgdGhpczoiKTsKKwkJCXRyeSB7CisJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCJodHRwOi8vL015LmV4cGVyaW1lbnRhbCIpKTsKKwkJCQlQZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbCByb290ID0gRXhwZXJpbWVudGFsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGVyY29sYXRpb25EaXNlYXNlTW9kZWwoKTsKKwkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChyb290KTsKKwkJCQlyZXNvdXJjZS5zYXZlKFN5c3RlbS5vdXQsIG51bGwpOworCQkJfQorCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGFyZ3VtZW50cy4KKwkJCS8vCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHsKKwkJCQkvLyBDb25zdHJ1Y3QgdGhlIFVSSSBmb3IgdGhlIGluc3RhbmNlIGZpbGUuCisJCQkJLy8gVGhlIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBmaWxlIHBhdGggb25seSBpZiBpdCBkZW5vdGVzIGFuIGV4aXN0aW5nIGZpbGUuCisJCQkJLy8gT3RoZXJ3aXNlLCBpdCdzIGRpcmVjdGx5IHRyZWF0ZWQgYXMgYSBVUkwuCisJCQkJLy8KKwkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShhcmdzW2ldKTsKKwkJCQlVUkkgdXJpID0gZmlsZS5pc0ZpbGUoKSA/IFVSSS5jcmVhdGVGaWxlVVJJKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOiBVUkkuY3JlYXRlVVJJKGFyZ3NbMF0pOworCisJCQkJdHJ5IHsKKwkJCQkJLy8gRGVtYW5kIGxvYWQgcmVzb3VyY2UgZm9yIHRoaXMgZmlsZS4KKwkJCQkJLy8KKwkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRlZCAiICsgdXJpKTsKKworCQkJCQkvLyBWYWxpZGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIGxvYWRlZCByZXNvdXJjZS4KKwkJCQkJLy8KKwkJCQkJZm9yIChFT2JqZWN0IGVPYmplY3QgOiByZXNvdXJjZS5nZXRDb250ZW50cygpKSB7CisJCQkJCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBEaWFnbm9zdGljaWFuLklOU1RBTkNFLnZhbGlkYXRlKGVPYmplY3QpOworCQkJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCQkJcHJpbnREaWFnbm9zdGljKGRpYWdub3N0aWMsICIiKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIGxvYWRpbmcgIiArIHVyaSk7CisJCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBQcmludHMgZGlhZ25vc3RpY3Mgd2l0aCBpbmRlbnRhdGlvbi4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gZGlhZ25vc3RpYyB0aGUgZGlhZ25vc3RpYyB0byBwcmludC4KKwkgKiBAcGFyYW0gaW5kZW50IHRoZSBpbmRlbnRhdGlvbiBmb3IgcHJpbnRpbmcuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBwcmludERpYWdub3N0aWMoRGlhZ25vc3RpYyBkaWFnbm9zdGljLCBTdHJpbmcgaW5kZW50KSB7CisJCVN5c3RlbS5vdXQucHJpbnQoaW5kZW50KTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpKTsKKwkJZm9yIChEaWFnbm9zdGljIGNoaWxkIDogZGlhZ25vc3RpYy5nZXRDaGlsZHJlbigpKSB7CisJCQlwcmludERpYWdub3N0aWMoY2hpbGQsIGluZGVudCArICIgICIpOworCQl9CisJfQorCit9IC8vRXhwZXJpbWVudGFsRXhhbXBsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC90ZXN0cy9FeHBlcmltZW50YWxUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4cGVyaW1lbnRhbC90ZXN0cy9FeHBlcmltZW50YWxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNWFkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL3Rlc3RzL0V4cGVyaW1lbnRhbFRlc3RzLmphdmEKQEAgLTAsMCArMSw1OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IHN1aXRlIGZvciB0aGUgJzxlbT48Yj5leHBlcmltZW50YWw8L2I+PC9lbT4nIHBhY2thZ2UuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEV4cGVyaW1lbnRhbFRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBhcmdzIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBUZXN0IFN1aXRlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IEV4cGVyaW1lbnRhbFRlc3RzKCJleHBlcmltZW50YWwgVGVzdHMiKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsVGVzdC5jbGFzcyk7CisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBuYW1lIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXhwZXJpbWVudGFsVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCit9IC8vRXhwZXJpbWVudGFsVGVzdHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHBlcmltZW50YWwvdGVzdHMvUGVyY29sYXRpb25EaXNlYXNlTW9kZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL3Rlc3RzL1BlcmNvbGF0aW9uRGlzZWFzZU1vZGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YjEyNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXhwZXJpbWVudGFsL3Rlc3RzL1BlcmNvbGF0aW9uRGlzZWFzZU1vZGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzI0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuRXhwZXJpbWVudGFsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhwZXJpbWVudGFsLlBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHBlcmltZW50YWwuaW1wbC5QZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0VJUkxhYmVsVmFsdWVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0cy5TRUlSTGFiZWxWYWx1ZVRlc3RVdGlsOworCisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QZXJjb2xhdGlvbiBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUGVyY29sYXRpb25EaXNlYXNlTW9kZWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJLyoqCisJICogU2VlZCBmb3IgdGVzdAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBSQU5ET01fU0VFRCA9IDFsOworCQorCS8qKgorCSAqIGRlZmF1bHQgZ2FpbiBmYWN0b3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBURVNUX0dBSU4gPSAwLjAxZDsKKwkKKwkKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBQZXJjb2xhdGlvbiBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGVyY29sYXRpb25EaXNlYXNlTW9kZWwgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBhcmdzIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBQZXJjb2xhdGlvbiBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG5hbWUgCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlIG1vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyBvcGVyYXRpb24uCisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0TW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKCl7CisJCVBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsVGVzdGVySW1wbCBwZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbCA9IG5ldyBQZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbFRlc3RlckltcGwoKTsKKwkJU0VJUkxhYmVsVmFsdWVJbXBsIGN1cnJlbnRTRUlSID0gbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAwZCwgNTBkLCA0MGQsIDMwZCwgMjBkLCAxMGQpOworCQlTRUlSTGFiZWxWYWx1ZUltcGwgc2VpckFkZGl0aW9ucyA9IG5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTBkLCAxZCwgMmQsIDNkLCAzZCwgMWQpOworCQlTRUlSTGFiZWxWYWx1ZUltcGwgc2VpckRlYXRocyA9IG5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTBkLCAxZCwgMmQsIDNkLCAzZCwgMWQpOworCQlkb1Rlc3QocGVyY29sYXRpb25EaXNlYXNlTW9kZWwsIGN1cnJlbnRTRUlSLCBzZWlyQWRkaXRpb25zLCBzZWlyRGVhdGhzKTsKKwl9CisJCisJCisJLyoqCisJICogRG8gdGhlIHRlc3QKKwkgKiBAcGFyYW0gcGVyY29sYXRpb25EaXNlYXNlTW9kZWwKKwkgKiBAcGFyYW0gY3VycmVudFNFSVIKKwkgKiBAcGFyYW0gc2VpckFkZGl0aW9ucworCSAqIEBwYXJhbSBzZWlyRGVhdGhzCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcml2YXRlIHZvaWQgZG9UZXN0KFBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsVGVzdGVySW1wbCBwZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbCwKKwkJCVNFSVJMYWJlbFZhbHVlSW1wbCBjdXJyZW50U0VJUiwgU0VJUkxhYmVsVmFsdWVJbXBsIHNlaXJBZGRpdGlvbnMsCisJCQlTRUlSTGFiZWxWYWx1ZUltcGwgc2VpckRlYXRocykgeworCQlTRUlSTGFiZWxWYWx1ZUltcGwgbmV3U2VpckFkZGl0aW9ucyA9IFNFSVJMYWJlbFZhbHVlVGVzdFV0aWwuY2xvbmVTRUlSTGFiZWxWYWx1ZUltcGwoc2VpckFkZGl0aW9ucyk7CisJCVNFSVJMYWJlbFZhbHVlSW1wbCBuZXdTZWlyRGVhdGhzID0gU0VJUkxhYmVsVmFsdWVUZXN0VXRpbC5jbG9uZVNFSVJMYWJlbFZhbHVlSW1wbChzZWlyRGVhdGhzKTsKKwkJCisJCXBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsLmRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKGN1cnJlbnRTRUlSLCBSQU5ET01fU0VFRCwgVEVTVF9HQUlOKTsKKwkJCisJCVNFSVJMYWJlbFZhbHVlSW1wbCBjYWxjdWxhdGVkU2VpckFkZGl0aW9ucyA9IFNFSVJMYWJlbFZhbHVlVGVzdFV0aWwuY2xvbmVTRUlSTGFiZWxWYWx1ZUltcGwoc2VpckFkZGl0aW9ucyk7CisJCVNFSVJMYWJlbFZhbHVlSW1wbCBjYWxjdWxhdGVkU2VpckRlYXRocyA9IFNFSVJMYWJlbFZhbHVlVGVzdFV0aWwuY2xvbmVTRUlSTGFiZWxWYWx1ZUltcGwoc2VpckRlYXRocyk7CisJCQorCQlkb0NhbGN1bGF0ZU1vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyhjdXJyZW50U0VJUiwgY2FsY3VsYXRlZFNlaXJBZGRpdGlvbnMsIGNhbGN1bGF0ZWRTZWlyRGVhdGhzLCBSQU5ET01fU0VFRCwgVEVTVF9HQUlOKTsKKworCQlTdHJpbmcgc3RhdGUgPSBnZXRTdGF0ZShjdXJyZW50U0VJUiwgc2VpckFkZGl0aW9ucywgc2VpckRlYXRocywgbmV3U2VpckFkZGl0aW9ucywgbmV3U2VpckRlYXRocywgY2FsY3VsYXRlZFNlaXJBZGRpdGlvbnMsIGNhbGN1bGF0ZWRTZWlyRGVhdGhzKTsKKwkJCisJCXZhbGlkYXRlTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKG5ld1NlaXJBZGRpdGlvbnMsCisJCQkJbmV3U2VpckRlYXRocywKKwkJCQljYWxjdWxhdGVkU2VpckFkZGl0aW9ucywKKwkJCQljYWxjdWxhdGVkU2VpckRlYXRocywKKwkJCQlzdGF0ZSk7CisJfQorCQorCisJcHJpdmF0ZSB2b2lkIGRvQ2FsY3VsYXRlTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKAorCQkJU0VJUkxhYmVsVmFsdWVJbXBsIHBDdXJyZW50U0VJUiwKKwkJCVNFSVJMYWJlbFZhbHVlSW1wbCBwQ2FsY3VsYXRlZFNlaXJBZGRpdGlvbnMsCisJCQlTRUlSTGFiZWxWYWx1ZUltcGwgcENhbGN1bGF0ZWRTZWlyRGVhdGhzLCBsb25nIHBSYW5kb21TZWVkLCBkb3VibGUgcFRlc3RHYWluKSB7CisJCQorCQlmaW5hbCBTRUlSTGFiZWxWYWx1ZSBjdXJyZW50U0VJUiA9IHBDdXJyZW50U0VJUjsKKwkJZmluYWwgU0VJUkxhYmVsVmFsdWUgc2VpckFkZGl0aW9ucyA9IHBDYWxjdWxhdGVkU2VpckFkZGl0aW9uczsKKwkJZmluYWwgU0VJUkxhYmVsVmFsdWUgc2VpckRlYXRocyA9IHBDYWxjdWxhdGVkU2VpckRlYXRoczsKKwkJCisJCQorCQkvLyBUaGUgbm9pc2UgaXMgYSBtdWx0aXBsaWVyIG9mICgxKy8teCkgd2l0aCB4IHNtYWxsLgorCQkvLyBDb21wdXRlIHRoZSB0cmFuc2l0aW9ucworCQkKKwkJUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20ocFJhbmRvbVNlZWQpOworCQkKKwkJc2VpckFkZGl0aW9ucy5zZXRTKE1hdGgubWluKGN1cnJlbnRTRUlSLmdldFIoKSwgKHNlaXJBZGRpdGlvbnMuZ2V0UygpICogY29tcHV0ZU5vaXNlKHBUZXN0R2FpbiwgcmFuZG9tKSkpKTsKKwkKKwkJc2VpckFkZGl0aW9ucy5zZXRFKE1hdGgubWluKGN1cnJlbnRTRUlSLmdldFMoKSwgKHNlaXJBZGRpdGlvbnMuZ2V0RSgpICogY29tcHV0ZU5vaXNlKHBUZXN0R2FpbiwgcmFuZG9tKSkpKTsKKwkKKwkJc2VpckFkZGl0aW9ucy5zZXRSKE1hdGgubWluKGN1cnJlbnRTRUlSLmdldEkoKSwgKHNlaXJBZGRpdGlvbnMuZ2V0UigpICogY29tcHV0ZU5vaXNlKHBUZXN0R2FpbiwgcmFuZG9tKSkpKTsKKyAgICAgICAKKwkJCisJCQorCQkKKwkJCisJCS8vIEluZmVjdGlvdXMgY2FzZSBpcyBtb3JlIGNvbXBsaWNhdGVkCisJCWRvdWJsZSBpbm9pc3kgPSBzZWlyQWRkaXRpb25zLmdldEkoKSogY29tcHV0ZU5vaXNlKHBUZXN0R2FpbiwgcmFuZG9tKTsKKwkJZG91YmxlIGRlbHRhSW5vaXNlID0gaW5vaXN5OworCQlpZiAoZGVsdGFJbm9pc2UgPiBjdXJyZW50U0VJUi5nZXRFKCkpIHsKKwkJCWRvdWJsZSByZXNjYWxlID0gY3VycmVudFNFSVIuZ2V0RSgpIC8gZGVsdGFJbm9pc2U7CisJCQlpbm9pc3kgKj0gcmVzY2FsZTsKKwkJfQorCQkKKwkJLy8gc2V0IHRoZSBjaGFuZ2UgaW4gaW5mZWN0aW91cyByZWNvdmVyZWQKKwkJc2VpckFkZGl0aW9ucy5zZXRJKGlub2lzeSk7CisJCQorCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJLy8gbm93IGhhbmRsZSB0aGUgZGVhdGhzCisJCXNlaXJEZWF0aHMuc2V0UyhNYXRoLm1pbihjdXJyZW50U0VJUi5nZXRTKCkgLCAoc2VpckRlYXRocy5nZXRTKCkgKiBjb21wdXRlTm9pc2UocFRlc3RHYWluLCByYW5kb20pKSkpOworCisJCXNlaXJEZWF0aHMuc2V0RShNYXRoLm1pbihjdXJyZW50U0VJUi5nZXRFKCkgLCAoc2VpckRlYXRocy5nZXRFKCkgKiBjb21wdXRlTm9pc2UocFRlc3RHYWluLCByYW5kb20pKSkpOworICAgICAgICAKKwkJc2VpckRlYXRocy5zZXRSKE1hdGgubWluKGN1cnJlbnRTRUlSLmdldFIoKSAsIChzZWlyRGVhdGhzLmdldFIoKSAqIGNvbXB1dGVOb2lzZShwVGVzdEdhaW4sIHJhbmRvbSkpKSk7CisJCQorCQkJCQorCX0KKworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU1vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyhTRUlSTGFiZWxWYWx1ZUltcGwgbmV3U2VpckFkZGl0aW9ucywKKwkJCVNFSVJMYWJlbFZhbHVlSW1wbCBuZXdTZWlyRGVhdGhzLAorCQkJU0VJUkxhYmVsVmFsdWVJbXBsIGNhbGN1bGF0ZWRTZWlyQWRkaXRpb25zLAorCQkJU0VJUkxhYmVsVmFsdWVJbXBsIGNhbGN1bGF0ZWRTZWlyRGVhdGhzLAorCQkJU3RyaW5nIHN0YXRlKSB7CisKKwkJCisJCXRyeXsKKwkJCW5ld1NlaXJBZGRpdGlvbnMuc2FuZSgpOworCQl9CisJCWNhdGNoKFRocm93YWJsZSB0KXsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5ld1NlaXJBZGRpdGlvbnMgaXMgaW5zYW5lLCBzdGF0ZSBpczogIiArIHN0YXRlLCB0KTsKKwkJfQorCQl0cnl7CisJCQluZXdTZWlyRGVhdGhzLnNhbmUoKTsKKwkJfQorCQljYXRjaChUaHJvd2FibGUgdCl7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJuZXdTZWlyRGVhdGhzIGlzIGluc2FuZSwgc3RhdGUgaXM6ICIgKyBzdGF0ZSwgdCk7CisJCX0KKworCQkKKwkJCisJCWFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgibmV3U2VpckFkZGl0aW9ucyBoYXMgaW5zYW5lIHZhbHVlcyAlcyIsIHN0YXRlKSwgbXlTYW5pdHlDaGVjayhuZXdTZWlyQWRkaXRpb25zKSk7CisJCWFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgibmV3U2VpckRlYXRocyBoYXMgaW5zYW5lIHZhbHVlcyAlcyIsIHN0YXRlKSwgbXlTYW5pdHlDaGVjayhuZXdTZWlyRGVhdGhzKSk7CisKKwkJYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJuZXdTZWlyQWRkaXRpb25zWyVzXSAhPSBjYWxjdWxhdGVkU2VpckFkZGl0aW9uc1slc10iLCBuZXdTZWlyQWRkaXRpb25zLCBjYWxjdWxhdGVkU2VpckFkZGl0aW9ucyksIGNoZWNrRXF1YWwoY2FsY3VsYXRlZFNlaXJBZGRpdGlvbnMsIG5ld1NlaXJBZGRpdGlvbnMpKTsKKwkJYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJuZXdTZWlyRGVhdGhzWyVzXSAhPSBjYWxjdWxhdGVkU2VpckRlYXRoc1slc10iLCBuZXdTZWlyRGVhdGhzLCBjYWxjdWxhdGVkU2VpckRlYXRocyksIGNoZWNrRXF1YWwoY2FsY3VsYXRlZFNlaXJEZWF0aHMsIG5ld1NlaXJEZWF0aHMpKTsKKwkJCisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBjaGVja0VxdWFsKFNFSVJMYWJlbFZhbHVlSW1wbCBwQ2FsY3VsYXRlZFNlaXJBZGRpdGlvbnMsCisJCQlTRUlSTGFiZWxWYWx1ZUltcGwgcE5ld1NlaXJBZGRpdGlvbnMpIHsKKwkJaWYoKHBDYWxjdWxhdGVkU2VpckFkZGl0aW9ucy5nZXREaXNlYXNlRGVhdGhzKCkgIT0gcE5ld1NlaXJBZGRpdGlvbnMuZ2V0RGlzZWFzZURlYXRocygpKSB8fAorCQkJCShwQ2FsY3VsYXRlZFNlaXJBZGRpdGlvbnMuZ2V0RSgpICE9IHBOZXdTZWlyQWRkaXRpb25zLmdldEUoKSkgfHwKKwkJCQkocENhbGN1bGF0ZWRTZWlyQWRkaXRpb25zLmdldEkoKSAhPSBwTmV3U2VpckFkZGl0aW9ucy5nZXRJKCkpIHx8CisJCQkJKHBDYWxjdWxhdGVkU2VpckFkZGl0aW9ucy5nZXRQb3B1bGF0aW9uQ291bnQoKSAhPSBwTmV3U2VpckFkZGl0aW9ucy5nZXRQb3B1bGF0aW9uQ291bnQoKSkgfHwKKwkJCQkocENhbGN1bGF0ZWRTZWlyQWRkaXRpb25zLmdldFIoKSAhPSBwTmV3U2VpckFkZGl0aW9ucy5nZXRSKCkpIHx8CisJCQkJKHBDYWxjdWxhdGVkU2VpckFkZGl0aW9ucy5nZXRTKCkgIT0gcE5ld1NlaXJBZGRpdGlvbnMuZ2V0UygpKSl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBteVNhbml0eUNoZWNrKFNFSVJMYWJlbFZhbHVlSW1wbCBwU2VpcikgeworCQlyZXR1cm4gYXNzZXJ0VmFsaWREb3VibGUocFNlaXIuZ2V0RSgpKSAmJiAKKwkJCWFzc2VydFZhbGlkRG91YmxlKHBTZWlyLmdldEkoKSkgJiYgCisJCQlhc3NlcnRWYWxpZERvdWJsZShwU2Vpci5nZXRSKCkpICYmIAorCQkJYXNzZXJ0VmFsaWREb3VibGUocFNlaXIuZ2V0UygpKTsKKwkJCisJfQorCQorCisJLyoqCisJICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGRvdWJsZSBwcmVjaXNpb24gcmFuZG9tIG5vaXNlIHZhcmlhYmxlCisJICogciBiZXR3ZWVuICgxLjAreCkgYW5kICgxLjAteCkKKwkgKiB3aGVyZSB4IGlzIGEgcHJvZHVjdCBHKiBNYXRoLnJhbmQoKSwgYW5kIEcgaXMgYSBnYWluIGZhY3RvciAwPEc8bWF4IG5vaXNlCisJICogCisJICogQHBhcmFtIGdhaW4KKwkgKiBAcGFyYW0gcmFuZAorCSAqIEByZXR1cm4gbm9pc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBjb21wdXRlTm9pc2UoZmluYWwgZG91YmxlIGdhaW4sIGZpbmFsIFJhbmRvbSByYW5kKSB7CisKKwkJZG91YmxlIHggPSAoMi4wKnJhbmQubmV4dERvdWJsZSgpKS0xLjA7IC8vICsvLSAxCisJCXggKj0gZ2FpbjsKKwkJeCArPSAxLjA7CisJCWFzc2VydCAoKHg+MC4wKSYmKHg8Mi4wKSkgOiAicmFuZG9tIG5vaXNlIHNob3VsZCBiZSBhIHNtYWxsIHBlcnR1cmJhdGlvbiBHYWluIGZhY3RvciwgZywgIG11c3QgMC4wIDwgZyA8PCAxLjAgIjsKKwkJcmV0dXJuIHg7CisJCQorCX0gLy8gZ2V0Tm9pc2UKKwkKKworCXByaXZhdGUgYm9vbGVhbiBhc3NlcnRWYWxpZERvdWJsZShkb3VibGUgcERvdWJsZSkgeworCQlyZXR1cm4gIShEb3VibGUuaXNOYU4ocERvdWJsZSkgfHwgRG91YmxlLmlzSW5maW5pdGUocERvdWJsZSkpOworCX0KKwkKKworCXByaXZhdGUgU3RyaW5nIGdldFN0YXRlKFNFSVJMYWJlbFZhbHVlSW1wbCBwQ3VycmVudFNFSVIsCisJCQlTRUlSTGFiZWxWYWx1ZUltcGwgcFNlaXJBZGRpdGlvbnMsIFNFSVJMYWJlbFZhbHVlSW1wbCBwU2VpckRlYXRocywKKwkJCVNFSVJMYWJlbFZhbHVlSW1wbCBwTmV3U2VpckFkZGl0aW9ucywKKwkJCVNFSVJMYWJlbFZhbHVlSW1wbCBwTmV3U2VpckRlYXRocywgU0VJUkxhYmVsVmFsdWVJbXBsIHBDYWxjdWxhdGVkU2VpckFkZGl0aW9ucywgU0VJUkxhYmVsVmFsdWVJbXBsIHBDYWxjdWxhdGVkU2VpckRlYXRocykgeworCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCgiXG5wcmVzZW50IHN0YXRlIGlzOiBcbkN1cnJlbnRTRUlSWyVzXVxuIFNlaXJBZGRpdGlvbnNbJXNdXG4gU2VpckRlYXRoc1slc11cbiBOZXdTZWlyQWRkaXRpb25zWyVzXVxuIE5ld1NlaXJEZWF0aHNbJXNdXG4gQ2FsY3VsYXRlZFNlaXJBZGRpdGlvbnNbJXNdXG4gQ2FsY3VsYXRlZFNlaXJEZWF0aHNbJXNdIiwgCisJCQkJcEN1cnJlbnRTRUlSLCBwU2VpckFkZGl0aW9ucywgcFNlaXJEZWF0aHMscE5ld1NlaXJBZGRpdGlvbnMscE5ld1NlaXJEZWF0aHMsIHBDYWxjdWxhdGVkU2VpckFkZGl0aW9ucywgcENhbGN1bGF0ZWRTZWlyRGVhdGhzKTsKKwl9CisKKwkKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFBlcmNvbGF0aW9uIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoUGVyY29sYXRpb25EaXNlYXNlTW9kZWwgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUGVyY29sYXRpb24gRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKEV4cGVyaW1lbnRhbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCQorCS8qKgorCSAqIGNyZWF0ZWQganVzdCBmb3IgdGVzdGluZ3Mgc2luY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbCNkb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cygpIDxlbT5kb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50czwvZW0+fScgaXMgcHJvdGVjdGVkLgorCSAqIEBhdXRob3Iga2F1Zm1hbgorCSAqCisJICovCisJcHJpdmF0ZSBjbGFzcyBQZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbFRlc3RlckltcGwgZXh0ZW5kcyBQZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbEltcGx7CisKKwkJcHVibGljIHZvaWQgZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoCisJCQkJU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHBDdXJyZW50U3RhdGUsCisJCQkJbG9uZyBwUmFuZG9tU2VlZCwgZG91YmxlIHBUZXN0R2FpbikgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJc2V0U2VlZChwUmFuZG9tU2VlZCk7CisJCQlzZXRHYWluKHBUZXN0R2Fpbik7CisJCQkKKwkJCS8vU0VJUkxhYmVsVmFsdWVJbXBsIG9sZEN1cnJlbnRTdGF0ZSA9IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0cy5TRUlSTGFiZWxWYWx1ZVRlc3RVdGlsLmNsb25lU0VJUkxhYmVsVmFsdWVJbXBsKChTRUlSTGFiZWxWYWx1ZUltcGwpcEN1cnJlbnRTdGF0ZSk7CisJCQkvL1NFSVJMYWJlbFZhbHVlSW1wbCBvbGRTdGF0ZUFkZGl0aW9uczIgPSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHMuU0VJUkxhYmVsVmFsdWVUZXN0VXRpbC5jbG9uZVNFSVJMYWJlbFZhbHVlSW1wbCgoU0VJUkxhYmVsVmFsdWVJbXBsKXBTdGF0ZUFkZGl0aW9uczIpOworCQkJLy9TRUlSTGFiZWxWYWx1ZUltcGwgb2xkU3RhdGVEZWF0aHMyID0gb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzLlNFSVJMYWJlbFZhbHVlVGVzdFV0aWwuY2xvbmVTRUlSTGFiZWxWYWx1ZUltcGwoKFNFSVJMYWJlbFZhbHVlSW1wbClwU3RhdGVEZWF0aHMyKTsKKwkJCQorCQkJc3VwZXIuZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMocEN1cnJlbnRTdGF0ZSk7CisJCX0KKwkJCisJfS8vIFBlcmNvbGF0aW9uRGlzZWFzZU1vZGVsVGVzdGVySW1wbCAgaW5uZXIgY2xhc3MKKwkKK30gLy9QZXJjb2xhdGlvbkRpc2Vhc2VNb2RlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRlODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzBiNzA4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5NzE1YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsNzggQEAKKyNUdWUgU2VwIDIzIDA5OjM2OjI3IEVEVCAyMDA4CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzI2MzRjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDIwIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cztzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS50ZXN0cworUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuanVuaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZSwKKyBvcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2VycywKKyBvcmcuZWNsaXBzZS5zdGVtLmpvYnMKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU4Mzc1OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDEyIEBACisjIDxjb3B5cmlnaHQ+CisjIDwvY29weXJpZ2h0PgorIworIyAkSWQ6IGJ1aWxkLnByb3BlcnRpZXMsdiAxLjEgMjAwOC8wMy8xOCAwNDo1MDoyOCBqa2F1Zm1hbiBFeHAgJAorCitiaW4uaW5jbHVkZXMgPSAuLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuCitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwYTM4YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNSBAQAorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFRvIGNvZGUgZGV2ZWxvcGVyOgorIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQorIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCisjICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCisjICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3BsdWdpbk5hbWUgPSBTVEVNIEV4dGVybmFsIERhdGEgU291cmNlIERpc2Vhc2UgTW9kZWwgVGVzdCBTdWl0ZQorcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGQ2NDM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+CisKKzwhLS0KKyA8Y29weXJpZ2h0PgorIDwvY29weXJpZ2h0PgorCisgJElkOiBwbHVnaW4ueG1sLHYgMS4xIDIwMDgvMDMvMTggMDQ6NTA6MjggamthdWZtYW4gRXhwICQKKy0tPgorCis8cGx1Z2luPgorPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3Rlc3RzL0V4dGVybmFsRGF0YVNvdXJjZUFsbFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3Rlc3RzL0V4dGVybmFsRGF0YVNvdXJjZUFsbFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlODJiNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvdGVzdHMvRXh0ZXJuYWxEYXRhU291cmNlQWxsVGVzdHMuamF2YQpAQCAtMCwwICsxLDU2IEBACisvLyBFeHRlcm5hbERhdGFTb3VyY2VBbGxUZXN0cy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IHN1aXRlIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbERhdGFTb3VyY2U8L2I+PC9lbT4nIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlcm5hbERhdGFTb3VyY2VBbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IEV4dGVybmFsRGF0YVNvdXJjZUFsbFRlc3RzKCJFeHRlcm5hbERhdGFTb3VyY2UgVGVzdHMiKTsKKwkJc3VpdGUuYWRkVGVzdChFeHRlcm5hbERhdGFTb3VyY2VUZXN0cy5zdWl0ZSgpKTsKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFeHRlcm5hbERhdGFTb3VyY2VBbGxUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKK30gLy9FeHRlcm5hbERhdGFTb3VyY2VBbGxUZXN0cwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS90ZXN0cy9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3Rlc3RzL0V4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjFjODE2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS90ZXN0cy9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxUZXN0LmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8vIEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbFRlc3QuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuaW1wbC5FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxJbXBsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCQorCQorCisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNlcCA9IEZpbGUuc2VwYXJhdG9yOworCQorCS8qKgorCSAqIFRoaXMgaXMgdGhlIERlZmF1bHQgZm9sZGVyIGZvciBJbXBvcnQgZmlsZXMuCisJICogVGhlIFVzZXIgY2FuIGNoYW5nZSB0aGlzIGJ1dCBieSBkZWZhdWx0LCBhbmQgZm9yIHRlc3RpbmcsCisJICogZGF0YSB3aWxsIGJlIGluIHN1Yi1mb2xkZXJzIG9mIHRoZSBkaXNlYXNlIG1vZGVsIHBsdWctaW4gcnVudGltZSBwcmVmZXJlbmNlcworCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NVQkRJUiA9ICJ0ZXN0aW5nIjsKKwkKKwkvKioKKwkgKiBUaGlzIGlzIGEgdGVzdCBzY2VuYXJpbyBuYW1lLgorCSAqLworCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NDRU5BUklPID0gInRlc3RzY2VuYXJpbyI7CisJCisJLyoqCisJICogVGhpcyBpcyBhIHRlc3QgbG9jYXRpb24gbmFtZS4KKwkqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0xPQ0FUSU9OID0gInRlc3Rsb2NhdGlvbiI7CisJCisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsVGVzdC5jbGFzcyk7CisJfQorCQorCS8qKgorCSAqIFRlc3QgdGhlIGxvZ2dpbmcKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RMb2dnaW5nKCkgeworCQkvLyB0ZXN0IHRoZSBjb25zdHJ1Y3Rpb24KKworCQlFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxJbXBsIGV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCA9IG5ldyBFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxJbXBsKCk7CisJCQorCQkvLyB0ZXN0IHRoZSBsb2dnaW5nCisJCWRvVGVzdCgpOworCX0KKwkKKwkvKioKKwkgKiBUZXN0IHRoZSBsb2dnaW5nIChub3QgY29tcGxldGUgeWV0KQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgZG9UZXN0KCkgeworCQkKKwkJZmluYWwgU3RyaW5nIGRpciA9IEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbC5ERUZBVUxUX0RJUitURVNUX1NVQkRJUitzZXA7CisJCQorCQl0cnkgeworCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyKTsKKwkJCWlmKCFmaWxlLmV4aXN0cygpKSB7CisJCQkJIGJvb2xlYW4gc3VjY2VzcyA9IChuZXcgRmlsZShkaXIpKS5ta2RpcnMoKTsKKwkJCX0KKwkJCQorCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkVycm9yIGNyZWF0aW5nIERpcmVjdG9yeSBbIitkaXIrIl0gZm9yIEpVTklUIHRlc3RpbmciLCBlKTsKKwkJfQorCQorCX0KKwkKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxUZXN0KCkgeworCQlzdXBlcigidGVzdCIpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShFeHRlcm5hbERhdGFTb3VyY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCit9IC8vRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS90ZXN0cy9FeHRlcm5hbERhdGFTb3VyY2VFeGFtcGxlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3Rlc3RzL0V4dGVybmFsRGF0YVNvdXJjZUV4YW1wbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDIwNWM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS90ZXN0cy9FeHRlcm5hbERhdGFTb3VyY2VFeGFtcGxlLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8vIEV4dGVybmFsRGF0YVNvdXJjZUV4YW1wbGUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5EaWFnbm9zdGljaWFuOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuRXh0ZXJuYWxEYXRhU291cmNlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLkV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgc2FtcGxlIHV0aWxpdHkgZm9yIHRoZSAnPGVtPjxiPmV4dGVybmFsZGF0YXNvdXJjZTwvYj48L2VtPicgcGFja2FnZS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRXh0ZXJuYWxEYXRhU291cmNlRXhhbXBsZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBMb2FkIGFsbCB0aGUgYXJndW1lbnQgZmlsZSBwYXRocyBvciBVUklzIGFzIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIGFyZ3MgdGhlIGZpbGUgcGF0aHMgb3IgVVJJcy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQkvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQgdG8gaG9sZCB0aGUgcmVzb3VyY2VzLgorCQkvLworCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKKwkJCisJCS8vIFJlZ2lzdGVyIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZSBmYWN0b3J5IHRvIGhhbmRsZSBhbGwgZmlsZSBleHRlbnNpb25zLgorCQkvLworCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dAorCQkJKFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04sIAorCQkJIG5ldyBYTUlSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOworCisJCS8vIFJlZ2lzdGVyIHRoZSBwYWNrYWdlIHRvIGVuc3VyZSBpdCBpcyBhdmFpbGFibGUgZHVyaW5nIGxvYWRpbmcuCisJCS8vCisJCXJlc291cmNlU2V0LmdldFBhY2thZ2VSZWdpc3RyeSgpLnB1dAorCQkJKEV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UuZU5TX1VSSSwgCisJCQkgRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZS5lSU5TVEFOQ0UpOworICAgICAgICAKKwkJLy8gSWYgdGhlcmUgYXJlIG5vIGFyZ3VtZW50cywgZW1pdCBhbiBhcHByb3ByaWF0ZSB1c2FnZSBtZXNzYWdlLgorCQkvLworCQlpZiAoYXJncy5sZW5ndGggPT0gMCkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJFbnRlciBhIGxpc3Qgb2YgZmlsZSBwYXRocyBvciBVUklzIHRoYXQgaGF2ZSBjb250ZW50IGxpa2UgdGhpczoiKTsKKwkJCXRyeSB7CisJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCJodHRwOi8vL015LmV4dGVybmFsZGF0YXNvdXJjZSIpKTsKKwkJCQlFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwgcm9vdCA9IEV4dGVybmFsRGF0YVNvdXJjZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCgpOworCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHJvb3QpOworCQkJCXJlc291cmNlLnNhdmUoU3lzdGVtLm91dCwgbnVsbCk7CisJCQl9CisJCQljYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYXJndW1lbnRzLgorCQkJLy8KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkgeworCQkJCS8vIENvbnN0cnVjdCB0aGUgVVJJIGZvciB0aGUgaW5zdGFuY2UgZmlsZS4KKwkJCQkvLyBUaGUgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGUgcGF0aCBvbmx5IGlmIGl0IGRlbm90ZXMgYW4gZXhpc3RpbmcgZmlsZS4KKwkJCQkvLyBPdGhlcndpc2UsIGl0J3MgZGlyZWN0bHkgdHJlYXRlZCBhcyBhIFVSTC4KKwkJCQkvLworCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGFyZ3NbaV0pOworCQkJCVVSSSB1cmkgPSBmaWxlLmlzRmlsZSgpID8gVVJJLmNyZWF0ZUZpbGVVUkkoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk6IFVSSS5jcmVhdGVVUkkoYXJnc1swXSk7CisKKwkJCQl0cnkgeworCQkJCQkvLyBEZW1hbmQgbG9hZCByZXNvdXJjZSBmb3IgdGhpcyBmaWxlLgorCQkJCQkvLworCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGVkICIgKyB1cmkpOworCisJCQkJCS8vIFZhbGlkYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgbG9hZGVkIHJlc291cmNlLgorCQkJCQkvLworCQkJCQlmb3IgKEVPYmplY3QgZU9iamVjdCA6IHJlc291cmNlLmdldENvbnRlbnRzKCkpIHsKKwkJCQkJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IERpYWdub3N0aWNpYW4uSU5TVEFOQ0UudmFsaWRhdGUoZU9iamVjdCk7CisJCQkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJCQlwcmludERpYWdub3N0aWMoZGlhZ25vc3RpYywgIiIpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0gbG9hZGluZyAiICsgdXJpKTsKKwkJCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFByaW50cyBkaWFnbm9zdGljcyB3aXRoIGluZGVudGF0aW9uLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBkaWFnbm9zdGljIHRoZSBkaWFnbm9zdGljIHRvIHByaW50LgorCSAqIEBwYXJhbSBpbmRlbnQgdGhlIGluZGVudGF0aW9uIGZvciBwcmludGluZy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHByaW50RGlhZ25vc3RpYyhEaWFnbm9zdGljIGRpYWdub3N0aWMsIFN0cmluZyBpbmRlbnQpIHsKKwkJU3lzdGVtLm91dC5wcmludChpbmRlbnQpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oZGlhZ25vc3RpYy5nZXRNZXNzYWdlKCkpOworCQlmb3IgKERpYWdub3N0aWMgY2hpbGQgOiBkaWFnbm9zdGljLmdldENoaWxkcmVuKCkpIHsKKwkJCXByaW50RGlhZ25vc3RpYyhjaGlsZCwgaW5kZW50ICsgIiAgIik7CisJCX0KKwl9CisKK30gLy9FeHRlcm5hbERhdGFTb3VyY2VFeGFtcGxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3Rlc3RzL0V4dGVybmFsRGF0YVNvdXJjZVRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3Rlc3RzL0V4dGVybmFsRGF0YVNvdXJjZVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdmMDQzZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvdGVzdHMvRXh0ZXJuYWxEYXRhU291cmNlVGVzdHMuamF2YQpAQCAtMCwwICsxLDU2IEBACisvLyBFeHRlcm5hbERhdGFTb3VyY2VUZXN0cy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IHN1aXRlIGZvciB0aGUgJzxlbT48Yj5leHRlcm5hbGRhdGFzb3VyY2U8L2I+PC9lbT4nIHBhY2thZ2UuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEV4dGVybmFsRGF0YVNvdXJjZVRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgRXh0ZXJuYWxEYXRhU291cmNlVGVzdHMoImV4dGVybmFsZGF0YXNvdXJjZSBUZXN0cyIpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsVGVzdC5jbGFzcyk7CisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXh0ZXJuYWxEYXRhU291cmNlVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCit9IC8vRXh0ZXJuYWxEYXRhU291cmNlVGVzdHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5mb3JjaW5nLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGU4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy8ucHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5mb3JjaW5nLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NTQ2Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZzwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4NmJmOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5mb3JjaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDE1IEBACisjVHVlIFNlcCAwMSAxNjo1ODo0OCBFRFQgMjAwOQorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uPXJldHVybl90YWcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5mb3JjaW5nL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMTY4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDE5IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmZvcmNpbmc7c2luZ2xldG9uOj10cnVlCitCdW5kbGUtVmVyc2lvbjogMS4wLjEucXVhbGlmaWVyCitCdW5kbGUtQ2xhc3NQYXRoOiAuCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLnRlc3RzCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVsczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuanVuaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDUxZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDEyIEBACisKKyMgPGNvcHlyaWdodD4KKyMgPC9jb3B5cmlnaHQ+CisjCisjICRJZDogYnVpbGQucHJvcGVydGllcyx2IDEuMSAyMDA5LzAzLzEzIDAwOjA2OjQ4IHNlZGx1bmQgRXhwICQKKworYmluLmluY2x1ZGVzID0gLixcCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKK2phcnMuY29tcGlsZS5vcmRlciA9IC4KK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZjI1MzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDEzIEBACisjLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BsdWdpbk5hbWUgPSBTVEVNIEZvcmNpbmcgRGlzZWFzZSBNb2RlbCBUZXN0IFN1aXRlCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL3Rlc3RzL0ZvcmNpbmdBbGxUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL3Rlc3RzL0ZvcmNpbmdBbGxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZDZiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvdGVzdHMvRm9yY2luZ0FsbFRlc3RzLmphdmEKQEAgLTAsMCArMSw1NiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+Rm9yY2luZzwvYj48L2VtPicgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEZvcmNpbmdBbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IEZvcmNpbmdBbGxUZXN0cygiRm9yY2luZyBUZXN0cyIpOyAvLyROT04tTkxTLTEkCisJCXN1aXRlLmFkZFRlc3QoRm9yY2luZ1Rlc3RzLnN1aXRlKCkpOworCQlyZXR1cm4gc3VpdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEZvcmNpbmdBbGxUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKK30gLy9Gb3JjaW5nQWxsVGVzdHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy90ZXN0cy9Gb3JjaW5nRGlzZWFzZU1vZGVsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL3Rlc3RzL0ZvcmNpbmdEaXNlYXNlTW9kZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1ZmVmYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy90ZXN0cy9Gb3JjaW5nRGlzZWFzZU1vZGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuaW1wbC5Gb3JjaW5nRGlzZWFzZU1vZGVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lSTGFiZWxWYWx1ZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRGYWN0b3J5SW1wbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBGb3JjaW5nRGlzZWFzZU1vZGVsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBGb3JjaW5nRGlzZWFzZU1vZGVsIGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihGb3JjaW5nRGlzZWFzZU1vZGVsVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBGb3JjaW5nRGlzZWFzZU1vZGVsVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoRm9yY2luZ0Rpc2Vhc2VNb2RlbCBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRm9yY2luZ0Rpc2Vhc2VNb2RlbCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShGb3JjaW5nRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0Rm9yY2luZ0Rpc2Vhc2VNb2RlbCgpeworCQlGb3JjaW5nRGlzZWFzZU1vZGVsVGVzdGVySW1wbCBmb3JjaW5nRGlzZWFzZU1vZGVsID0gbmV3IEZvcmNpbmdEaXNlYXNlTW9kZWxUZXN0ZXJJbXBsKCk7CisJCVNJUkxhYmVsIGxhYmVsID0gU3RhbmRhcmRGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlU0lSTGFiZWwoKTsKKwkJU0lSTGFiZWxWYWx1ZSBsYWJlbFZhbCA9IGxhYmVsLmdldFByb2JlVmFsdWUoKTsKKwkJbGFiZWxWYWwuc2V0UygxMDAwZCk7CisJCWxhYmVsVmFsLnNldEkoNTBkKTsKKwkJbGFiZWxWYWwuc2V0Uig0MGQpOworCQlTSVJMYWJlbFZhbHVlSW1wbCByZXRWYWwgPSBuZXcgU0lSTGFiZWxWYWx1ZUltcGwoMGQsIDBkLCAwZCwgMGQpOworCQlTVEVNVGltZSB0aW1lID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTVEVNVGltZSgpOworCisJCWZvcmNpbmdEaXNlYXNlTW9kZWwuY29tcHV0ZURpc2Vhc2VEZWx0YXModGltZSwgbGFiZWxWYWwsIGxhYmVsLCA4NjQwMDAwMCwgcmV0VmFsKTsKKwkJYXNzZXJ0KHJldFZhbC5zYW5lKCkpOworCQkKKwl9CisJCisJLyoqCisJICoKKwkgKi8KKwlwcml2YXRlIGNsYXNzIEZvcmNpbmdEaXNlYXNlTW9kZWxUZXN0ZXJJbXBsIGV4dGVuZHMgRm9yY2luZ0Rpc2Vhc2VNb2RlbEltcGx7CisKKwl9Ly8gRm9yY2luZ0Rpc2Vhc2VNb2RlbFRlc3RlckltcGwgIGlubmVyIGNsYXNzCisJCit9IC8vRm9yY2luZ0Rpc2Vhc2VNb2RlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy90ZXN0cy9Gb3JjaW5nVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy90ZXN0cy9Gb3JjaW5nVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjFkOWI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL3Rlc3RzL0ZvcmNpbmdUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3Qgc3VpdGUgZm9yIHRoZSAnPGVtPjxiPmZvcmNpbmc8L2I+PC9lbT4nIHBhY2thZ2UuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEZvcmNpbmdUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IEZvcmNpbmdUZXN0cygiZm9yY2luZyBUZXN0cyIpOyAvLyROT04tTkxTLTEkCisJCXN1aXRlLmFkZFRlc3RTdWl0ZShGb3JjaW5nRGlzZWFzZU1vZGVsVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxUZXN0LmNsYXNzKTsKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBGb3JjaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCit9IC8vRm9yY2luZ1Rlc3RzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvdGVzdHMvR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy90ZXN0cy9HYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZDE2OGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvdGVzdHMvR2F1c3NpYW4yRm9yY2luZ0Rpc2Vhc2VNb2RlbFRlc3QuamF2YQpAQCAtMCwwICsxLDk3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLnRlc3RzOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R2F1c3NpYW4yIEZvcmNpbmcgRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgR2F1c3NpYW4yIEZvcmNpbmcgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWwgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IEdhdXNzaWFuMiBGb3JjaW5nIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEdhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgR2F1c3NpYW4yIEZvcmNpbmcgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEdhdXNzaWFuMiBGb3JjaW5nIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKEZvcmNpbmdGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworfSAvL0dhdXNzaWFuMkZvcmNpbmdEaXNlYXNlTW9kZWxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvdGVzdHMvR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy90ZXN0cy9HYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZGQ5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvdGVzdHMvR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbFRlc3QuamF2YQpAQCAtMCwwICsxLDc5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HYXVzc2lhbjMgRm9yY2luZyBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbFRlc3QgZXh0ZW5kcyBHYXVzc2lhbjJGb3JjaW5nRGlzZWFzZU1vZGVsVGVzdCB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IEdhdXNzaWFuMyBGb3JjaW5nIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWxUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgR2F1c3NpYW4zIEZvcmNpbmcgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChHYXVzc2lhbjNGb3JjaW5nRGlzZWFzZU1vZGVsKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoRm9yY2luZ0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdhdXNzaWFuM0ZvcmNpbmdEaXNlYXNlTW9kZWwoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCit9IC8vR2F1c3NpYW4zRm9yY2luZ0Rpc2Vhc2VNb2RlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy90ZXN0cy9HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvdGVzdHMvR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ODRiYjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvdGVzdHMvR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcudGVzdHM7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuRm9yY2luZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdhdXNzaWFuIEZvcmNpbmcgRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBHYXVzc2lhbiBGb3JjaW5nIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbFRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgR2F1c3NpYW4gRm9yY2luZyBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgR2F1c3NpYW4gRm9yY2luZyBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKEdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBHYXVzc2lhbiBGb3JjaW5nIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBHYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoRm9yY2luZ0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdhdXNzaWFuRm9yY2luZ0Rpc2Vhc2VNb2RlbCgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKK30gLy9HYXVzc2lhbkZvcmNpbmdEaXNlYXNlTW9kZWxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmMDI0ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPGNsYXNzcGF0aD4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KKzwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZTJlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb248L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzljY2ZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw4IEBACisjVHVlIE1hciAzMCAxMTo0ODo1MyBQRFQgMjAxMA0KK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3INCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwZWVhMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyMCBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24udGVzdHM7c2luZ2xldG9uOj10cnVlCitCdW5kbGUtVmVyc2lvbjogMS4wLjEucXVhbGlmaWVyCitCdW5kbGUtQ2xhc3NQYXRoOiAuCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS42CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi50ZXN0cworUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVsczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmp1bml0O3Zpc2liaWxpdHk6PXJlZXhwb3J0CitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZjZlZTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMiBAQAorCisjIDxjb3B5cmlnaHQ+CisjIDwvY29weXJpZ2h0PgorIworIyAkSWQkCisKK2Jpbi5pbmNsdWRlcyA9IC4sXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuCitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3NjI3YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSw4IEBACisKKyMgPGNvcHlyaWdodD4KKyMgPC9jb3B5cmlnaHQ+CisjCisjICRJZCQKKworcGx1Z2luTmFtZSA9IE11bHRpcG9wdWxhdGlvbiBUZXN0cworcHJvdmlkZXJOYW1lID0gd3d3LmV4YW1wbGUub3JnCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3Rlc3RzL011bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3Rlc3RzL011bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4YzAwZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vdGVzdHMvTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbFRlc3QuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi50ZXN0czsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlwb3B1bGF0aW9uRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NdWx0aSBQb3B1bGF0aW9uIFNFSVIgRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxUZXN0IGV4dGVuZHMgTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsVGVzdCB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IE11bHRpIFBvcHVsYXRpb24gU0VJUiBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIE11bHRpIFBvcHVsYXRpb24gU0VJUiBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShNdWx0aXBvcHVsYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworfSAvL011bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3Rlc3RzL011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi90ZXN0cy9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDU4MDNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi90ZXN0cy9NdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbFRlc3QuamF2YQpAQCAtMCwwICsxLDk4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24udGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlwb3B1bGF0aW9uRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NdWx0aSBQb3B1bGF0aW9uIFNJIERpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBNdWx0aSBQb3B1bGF0aW9uIFNJIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IE11bHRpIFBvcHVsYXRpb24gU0kgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTXVsdGkgUG9wdWxhdGlvbiBTSSBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIE11bHRpIFBvcHVsYXRpb24gU0kgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKE11bHRpcG9wdWxhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworfSAvL011bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi90ZXN0cy9NdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3Rlc3RzL011bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmRhYzc5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi90ZXN0cy9NdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWxUZXN0LmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24udGVzdHM7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlwb3B1bGF0aW9uRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NdWx0aSBQb3B1bGF0aW9uIFNJUiBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsVGVzdCBleHRlbmRzIE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsVGVzdCB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKE11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbFRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgTXVsdGkgUG9wdWxhdGlvbiBTSVIgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIE11bHRpIFBvcHVsYXRpb24gU0lSIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShNdWx0aXBvcHVsYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCit9IC8vTXVsdGlQb3B1bGF0aW9uU0lSRGlzZWFzZU1vZGVsVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi90ZXN0cy9NdWx0aXBvcHVsYXRpb25BbGxUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi90ZXN0cy9NdWx0aXBvcHVsYXRpb25BbGxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MjI5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3Rlc3RzL011bHRpcG9wdWxhdGlvbkFsbFRlc3RzLmphdmEKQEAgLTAsMCArMSw1NiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IHN1aXRlIGZvciB0aGUgJzxlbT48Yj5NdWx0aXBvcHVsYXRpb248L2I+PC9lbT4nIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aXBvcHVsYXRpb25BbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IE11bHRpcG9wdWxhdGlvbkFsbFRlc3RzKCJNdWx0aXBvcHVsYXRpb24gVGVzdHMiKTsKKwkJc3VpdGUuYWRkVGVzdChNdWx0aXBvcHVsYXRpb25UZXN0cy5zdWl0ZSgpKTsKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNdWx0aXBvcHVsYXRpb25BbGxUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKK30gLy9NdWx0aXBvcHVsYXRpb25BbGxUZXN0cwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi90ZXN0cy9NdWx0aXBvcHVsYXRpb25FeGFtcGxlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3Rlc3RzL011bHRpcG9wdWxhdGlvbkV4YW1wbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E1YWZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi90ZXN0cy9NdWx0aXBvcHVsYXRpb25FeGFtcGxlLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5EaWFnbm9zdGljaWFuOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlwb3B1bGF0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpcG9wdWxhdGlvblBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgc2FtcGxlIHV0aWxpdHkgZm9yIHRoZSAnPGVtPjxiPm11bHRpcG9wdWxhdGlvbjwvYj48L2VtPicgcGFja2FnZS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTXVsdGlwb3B1bGF0aW9uRXhhbXBsZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBMb2FkIGFsbCB0aGUgYXJndW1lbnQgZmlsZSBwYXRocyBvciBVUklzIGFzIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIGFyZ3MgdGhlIGZpbGUgcGF0aHMgb3IgVVJJcy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQkvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQgdG8gaG9sZCB0aGUgcmVzb3VyY2VzLgorCQkvLworCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKKwkJCisJCS8vIFJlZ2lzdGVyIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZSBmYWN0b3J5IHRvIGhhbmRsZSBhbGwgZmlsZSBleHRlbnNpb25zLgorCQkvLworCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dAorCQkJKFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04sIAorCQkJIG5ldyBYTUlSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOworCisJCS8vIFJlZ2lzdGVyIHRoZSBwYWNrYWdlIHRvIGVuc3VyZSBpdCBpcyBhdmFpbGFibGUgZHVyaW5nIGxvYWRpbmcuCisJCS8vCisJCXJlc291cmNlU2V0LmdldFBhY2thZ2VSZWdpc3RyeSgpLnB1dAorCQkJKE11bHRpcG9wdWxhdGlvblBhY2thZ2UuZU5TX1VSSSwgCisJCQkgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOworICAgICAgICAKKwkJLy8gSWYgdGhlcmUgYXJlIG5vIGFyZ3VtZW50cywgZW1pdCBhbiBhcHByb3ByaWF0ZSB1c2FnZSBtZXNzYWdlLgorCQkvLworCQlpZiAoYXJncy5sZW5ndGggPT0gMCkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJFbnRlciBhIGxpc3Qgb2YgZmlsZSBwYXRocyBvciBVUklzIHRoYXQgaGF2ZSBjb250ZW50IGxpa2UgdGhpczoiKTsKKwkJCXRyeSB7CisJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCJodHRwOi8vL015Lm11bHRpcG9wdWxhdGlvbiIpKTsKKwkJCQlNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCByb290ID0gTXVsdGlwb3B1bGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwoKTsKKwkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChyb290KTsKKwkJCQlyZXNvdXJjZS5zYXZlKFN5c3RlbS5vdXQsIG51bGwpOworCQkJfQorCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGFyZ3VtZW50cy4KKwkJCS8vCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHsKKwkJCQkvLyBDb25zdHJ1Y3QgdGhlIFVSSSBmb3IgdGhlIGluc3RhbmNlIGZpbGUuCisJCQkJLy8gVGhlIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBmaWxlIHBhdGggb25seSBpZiBpdCBkZW5vdGVzIGFuIGV4aXN0aW5nIGZpbGUuCisJCQkJLy8gT3RoZXJ3aXNlLCBpdCdzIGRpcmVjdGx5IHRyZWF0ZWQgYXMgYSBVUkwuCisJCQkJLy8KKwkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShhcmdzW2ldKTsKKwkJCQlVUkkgdXJpID0gZmlsZS5pc0ZpbGUoKSA/IFVSSS5jcmVhdGVGaWxlVVJJKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOiBVUkkuY3JlYXRlVVJJKGFyZ3NbMF0pOworCisJCQkJdHJ5IHsKKwkJCQkJLy8gRGVtYW5kIGxvYWQgcmVzb3VyY2UgZm9yIHRoaXMgZmlsZS4KKwkJCQkJLy8KKwkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRlZCAiICsgdXJpKTsKKworCQkJCQkvLyBWYWxpZGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIGxvYWRlZCByZXNvdXJjZS4KKwkJCQkJLy8KKwkJCQkJZm9yIChFT2JqZWN0IGVPYmplY3QgOiByZXNvdXJjZS5nZXRDb250ZW50cygpKSB7CisJCQkJCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBEaWFnbm9zdGljaWFuLklOU1RBTkNFLnZhbGlkYXRlKGVPYmplY3QpOworCQkJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCQkJcHJpbnREaWFnbm9zdGljKGRpYWdub3N0aWMsICIiKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIGxvYWRpbmcgIiArIHVyaSk7CisJCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBQcmludHMgZGlhZ25vc3RpY3Mgd2l0aCBpbmRlbnRhdGlvbi4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gZGlhZ25vc3RpYyB0aGUgZGlhZ25vc3RpYyB0byBwcmludC4KKwkgKiBAcGFyYW0gaW5kZW50IHRoZSBpbmRlbnRhdGlvbiBmb3IgcHJpbnRpbmcuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBwcmludERpYWdub3N0aWMoRGlhZ25vc3RpYyBkaWFnbm9zdGljLCBTdHJpbmcgaW5kZW50KSB7CisJCVN5c3RlbS5vdXQucHJpbnQoaW5kZW50KTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpKTsKKwkJZm9yIChEaWFnbm9zdGljIGNoaWxkIDogZGlhZ25vc3RpYy5nZXRDaGlsZHJlbigpKSB7CisJCQlwcmludERpYWdub3N0aWMoY2hpbGQsIGluZGVudCArICIgICIpOworCQl9CisJfQorCit9IC8vTXVsdGlwb3B1bGF0aW9uRXhhbXBsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi90ZXN0cy9NdWx0aXBvcHVsYXRpb25UZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi90ZXN0cy9NdWx0aXBvcHVsYXRpb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZGRhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3Rlc3RzL011bHRpcG9wdWxhdGlvblRlc3RzLmphdmEKQEAgLTAsMCArMSw1OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IHN1aXRlIGZvciB0aGUgJzxlbT48Yj5tdWx0aXBvcHVsYXRpb248L2I+PC9lbT4nIHBhY2thZ2UuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE11bHRpcG9wdWxhdGlvblRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgTXVsdGlwb3B1bGF0aW9uVGVzdHMoIm11bHRpcG9wdWxhdGlvbiBUZXN0cyIpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKE11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbFRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbFRlc3QuY2xhc3MpOworCQlyZXR1cm4gc3VpdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE11bHRpcG9wdWxhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworfSAvL011bHRpcG9wdWxhdGlvblRlc3RzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGU4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ODY1NDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YzA0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsNjkgQEAKKyNNb24gSmFuIDIxIDEyOjQ2OjQ2IEVTVCAyMDA4CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRmYmY1ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0wLDAgKzEsNTAgQEAKKyNXZWQgSnVsIDI1IDE0OjA0OjExIEVEVCAyMDA3CitjbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9dHJ1ZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQorY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKK2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQorY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQorY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKK2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQorY2xlYW51cC51c2VfYmxvY2tzPXRydWUKK2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitjbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXBfcHJvZmlsZT1fY2xlYW51cAorY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjMjMwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDE4IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcgorQnVuZGxlLUNsYXNzUGF0aDogLgorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzLAorIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscywKKyBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuc2NlbmFyaW9zLAorIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci50ZXN0cworUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlLAorIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGVmaW5pdGlvbnMsCisgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzMGRhMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTQgQEAKKyMgPGNvcHlyaWdodD4KKyMgPC9jb3B5cmlnaHQ+CisjCisjICRJZCQKKworYmluLmluY2x1ZGVzID0gLixcCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgdGVtcC8sXAorICAgICAgICAgICAgICAgbm90aWNlLmh0bWwsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuCitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YjE5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9lcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwzMjggQEAKKzxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKK3htbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCit4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Cis8bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Cis8bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxsaW5rIHJlbD1GaWxlLUxpc3QKK2hyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgorPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Cis8IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8bzpEb2N1bWVudFByb3BlcnRpZXM+CisgIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+CisgIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KKyAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgorICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgorICA8bzpQYWdlcz40PC9vOlBhZ2VzPgorICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgorICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KKyAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgorICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+CisgIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgorICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgorIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Cis8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8dzpXb3JkRG9jdW1lbnQ+CisgIDx3OlRyYWNrUmV2aXNpb25zLz4KKyA8L3c6V29yZERvY3VtZW50PgorPC94bWw+PCFbZW5kaWZdLS0+Cis8c3R5bGU+Cis8IS0tCisgLyogRm9udCBEZWZpbml0aW9ucyAqLworQGZvbnQtZmFjZQorCXtmb250LWZhbWlseTpUYWhvbWE7CisJcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7CisJbXNvLWZvbnQtY2hhcnNldDowOworCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOworCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOworCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQorIC8qIFN0eWxlIERlZmluaXRpb25zICovCitwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCisJe21zby1zdHlsZS1wYXJlbnQ6IiI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorcAorCXttYXJnaW4tcmlnaHQ6MGluOworCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOworCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOworCW1hcmdpbi1sZWZ0OjBpbjsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0CisJe21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOworCW1hcmdpbjowaW47CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6OC4wcHQ7CisJZm9udC1mYW1pbHk6VGFob21hOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK0BwYWdlIFNlY3Rpb24xCisJe3NpemU6OC41aW4gMTEuMGluOworCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOworCW1zby1oZWFkZXItbWFyZ2luOi41aW47CisJbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKKwltc28tcGFwZXItc291cmNlOjA7fQorZGl2LlNlY3Rpb24xCisJe3BhZ2U6U2VjdGlvbjE7fQorLS0+Cis8L3N0eWxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+CisKKzxkaXYgY2xhc3M9U2VjdGlvbjE+CisKKzxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KKzwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgorVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKK1JFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQorT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2luIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCitkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+CitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2NoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCitzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCitieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKK2lmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCitzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKK1Byb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgord2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQord29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCitlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50CitjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQorb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKK2Rpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCityZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAorYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCitzdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQorZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQorU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cworUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKK3BhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKK2FuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQorY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KK29mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCitieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgordG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bworYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQorUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cworQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKK3RoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAorZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAorbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKK3RvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCitpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCit0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCitkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKK0VhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0CityaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCit0aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgorPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2VmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKK2NvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKK2FuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5CithbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKK2luY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKK2FzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQorc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAorQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQorc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAoraW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQorY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKK2NvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKK2NvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQorb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKK3N1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKK2FjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKK2FuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCitvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKK2xpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCitDb250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgorQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCitjb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCitsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwordGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgorY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKK29mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcworcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCit0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCit0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAorYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKK2luIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAord2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKK3NlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQorb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQorY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKK0FHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCitXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCitNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQorcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKK1Byb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKK0FncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKK2NvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCitlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCitPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKK1RIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKK1RIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCitvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0CitmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQorbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KK2FnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKK290aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQorc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAorc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQorcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKK3JpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKK2NvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50CitTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKK3RoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCit0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCitBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bworc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KKyhpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKK2V4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKK2V4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQorU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgorQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCitBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCitpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KKworPC9kaXY+CisKKzwvYm9keT4KKworPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9ub3RpY2UuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9ub3RpY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFmOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL25vdGljZS5odG1sCkBAIC0wLDAgKzEsNzkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+TWFyY2ggMTcsIDIwMDU8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorICAgCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCisgICAKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUworICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisgICAKKzx1bD4KKwk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4gICAKKyAKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKwk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCQkKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKwk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKKwk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorICAgCis8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjcxMWY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDAgQEAKKyMvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqCisjICogQ29udHJpYnV0b3JzOgorIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBUbyBjb2RlIGRldmVsb3BlcjoKKyMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKKyMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgorIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQorIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitwbHVnaW5OYW1lID0gU1RFTSBEaXNlYXNlIE1vZGVscyBUZXN0IFN1aXRlCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZworCisjIER1YmxpbiBjb3JlCitkY19jcmVhdG9yX2RhZm9yZCA9IGRhZm9yZAorZGNfc2VyaTF4MV9kZXNjID0gRGV0ZXJtaW5pc3RpYyBTRUlSIGRpc2Vhc2UgbW9kZWwgb24gYSBzaW5nbGUgbm9kZQorZGNfc2VyaTF4MV90aXRsZSA9IFNFSVIgMSB4IDEKK2RjX3NlcmkxeDJfZGVzYyA9IERldGVybWluaXN0aWMgU0VJUiBkaXNlYXNlIG1vZGVsIG9uIGEgMXgyIGxhdHRpY2UgZ3JhcGgKK2RjX3NlcmkxeDJfdGl0bGUgPSBTRUlSIDEgeCAyCitkY19zZXJpM3gzX2Rlc2MgPSBTdGFuZGFyZCBTRUlSIGRpc2Vhc2UgbW9kZWwgb24gYSAzeDMgbGF0dGljZSBncmFwaAorZGNfc2VyaTN4M190aXRsZSA9IFNFSVIgMyB4IDMKK2RjX3NlcmkxMDB4MTAwX2Rlc2MgPSBEZXRlcm1pbmlzdGljIFNFSVIgZGlzZWFzZSBtb2RlbCBvbiBhIDEwMHgxMDAgbGF0aWNlIGdyYXBoCitkY19zZXJpMTAweDEwMF90aXRsZSA9IFNFSVIgMTAwIHggMTAwCisKK2RtX2NhdCA9IERpc2Vhc2UgTW9kZWxzCitzdGFuZGFyZF9jYXQgPSBTdGFuZGFyZAord29ybGRfY2F0ID0gV29ybGQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0FnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9BZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YTU3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9BZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkFnZ3JlZ2F0aW5nRGlzZWFzZU1vZGVsU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BZ2dyZWdhdGluZyBEaXNlYXNlIE1vZGVsIFN0YXRlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlVGVzdCBleHRlbmRzIERpc2Vhc2VNb2RlbFN0YXRlVGVzdCB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBBZ2dyZWdhdGluZyBEaXNlYXNlIE1vZGVsIFN0YXRlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEFnZ3JlZ2F0aW5nIERpc2Vhc2UgTW9kZWwgU3RhdGUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBBZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZSlmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWdncmVnYXRpbmdEaXNlYXNlTW9kZWxTdGF0ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKK30gLy9BZ2dyZWdhdGluZ0Rpc2Vhc2VNb2RlbFN0YXRlVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNTczNzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9BZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWxUZXN0LmphdmEKQEAgLTAsMCArMSw3OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWdncmVnYXRpbmcgU0VJUiBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWxUZXN0IGV4dGVuZHMgQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxUZXN0IHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKEFnZ3JlZ2F0aW5nU0VJUkRpc2Vhc2VNb2RlbFRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgQWdncmVnYXRpbmcgU0VJUiBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWxUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgQWdncmVnYXRpbmcgU0VJUiBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBZ2dyZWdhdGluZ1NFSVJEaXNlYXNlTW9kZWwoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCit9IC8vQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0FnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlM2YzZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0FnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxUZXN0LmphdmEKQEAgLTAsMCArMSw3OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFnZ3JlZ2F0aW5nIFNJIERpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxUZXN0IGV4dGVuZHMgU0lUZXN0IHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKEFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IEFnZ3JlZ2F0aW5nIFNJIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgQWdncmVnYXRpbmcgU0kgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworfSAvL0FnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9BZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0FnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOWJkMGU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxUZXN0LmphdmEKQEAgLTAsMCArMSw3OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BZ2dyZWdhdGluZyBTSVIgRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxUZXN0IGV4dGVuZHMgQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbFRlc3QgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWxUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IEFnZ3JlZ2F0aW5nIFNJUiBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBBZ2dyZWdhdGluZyBTSVIgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoQWdncmVnYXRpbmdTSVJEaXNlYXNlTW9kZWwpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFnZ3JlZ2F0aW5nU0lSRGlzZWFzZU1vZGVsKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworfSAvLyBBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0RldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzYTQxMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0RldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbDsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbEltcGw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXRlcm1pbmlzdGljIFNFSVIgRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWxUZXN0IGV4dGVuZHMgU0VJUlRlc3QgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0RFVEVSTUlOSVNUSUNfU0VJUl9ESVNFQVNFX05BTUUgPSAiRGV0ZXJtaW5pc3RpYyBTRUlSIERpc2Vhc2UgTW9kZWwiOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKERldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBEZXRlcm1pbmlzdGljIFNFSVIgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEZXRlcm1pbmlzdGljIFNFSVIgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKERldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgbGFiZWwgdmFsdWUgZml4dHVyZQorCSAqLworCVNFSVJMYWJlbCBnZXRMYWJlbEZpeHR1cmUoKSB7CisJCXJldHVybiAoU0VJUkxhYmVsKSBsYWJlbEZpeHR1cmU7CisJfSAvLyBnZXRMYWJlbFZhbHVlRml4dHVyZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCQlTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRtbCA9IGNyZWF0ZUxhYmVsRml4dHVyZSgpOworCQlEaXNlYXNlTW9kZWxTdGF0ZSBkbXMgPSBnZXRGaXh0dXJlKCkuY3JlYXRlRGlzZWFzZU1vZGVsU3RhdGUoKTsKKwkJZG1sLnNldERpc2Vhc2VNb2RlbFN0YXRlKGRtcyk7CisJCXNldExhYmVsRml4dHVyZShkbWwpOworCQlmaXh0dXJlLmluaXRpYWxpemVEaXNlYXNlU3RhdGUoZG1zLCBkbWwpOworCX0gLy8gc2V0VXAKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnRlYXJEb3duKCk7CisJfSAvLyB0ZWFyRG93bgorCisJLyoqCisJICogQ3JlYXRlIGRpc2Vhc2UgbW9kZWwgaW5zdGFuY2UKKwkgKiAKKwkgKiBAcmV0dXJuIGEgZGlzZWFzZSBtb2RlbCBpbnN0YW5jZSBmb3IgdGVzdCBwdXJwb3NlcworCSAqLworCXB1YmxpYyBzdGF0aWMgRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWwgY3JlYXRlRml4dHVyZSgpIHsKKwkJcmV0dXJuIERldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsSW1wbAorCQkJCS5jcmVhdGVEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbCgKKwkJCQkJCVRFU1RfREVURVJNSU5JU1RJQ19TRUlSX0RJU0VBU0VfTkFNRSwgTU9SVEFMSVRZX1JBVEUsCisJCQkJCQlJTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFLAorCQkJCQkJVFJBTlNNSVNTSU9OX1JBVEUsIFJFQ09WRVJZX1JBVEUsIElNTVVOSVRZX0xPU1NfUkFURSwKKwkJCQkJCUlOQ1VCQVRJT05fUkFURSwgTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVCwKKwkJCQkJCVRFU1RfVElNRV9QRVJJT0QsIFRFU1RfUE9QVUxBVElPTl9JREVOVElGSUVSKTsKKwl9IC8vIGNyZWF0ZUZpeHR1cmUKKworfSAvLyBEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0RldGVybWluaXN0aWNTRUlSU2NlbmFyaW9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9EZXRlcm1pbmlzdGljU0VJUlNjZW5hcmlvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NDI2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9EZXRlcm1pbmlzdGljU0VJUlNjZW5hcmlvVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTYyIEBACisvLyBEZXRlcm1pbmlzdGljU0VJUlNjZW5hcmlvVGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TRUlSTGFiZWxWYWx1ZUltcGw7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0IHRlc3QgY2FzZSBmb3IgYSBEZXRlcm1pbmlzdGljIFNFSVIgZGlzZWFzZSBtb2RlbAorICogc2NlbmFyaW8uCisgKiAKKyAqIDx1bD4KKyAqIDxsaT4mbXU7ID0ge0BsaW5rIERpc2Vhc2VNb2RlbFRlc3QjTU9SVEFMSVRZX1JBVEV9ID0gMC4wMTwvbGk+CisgKiA8bGk+JmJldGE7ID0ge0BsaW5rIFNJVGVzdCNUUkFOU01JU1NJT05fUkFURX0gPSAwLjE8L2xpPgorICogPGxpPiZzaWdtYTsgPSB7QGxpbmsgU0lUZXN0I1JFQ09WRVJZX1JBVEV9ID0gMC4wMTwvbGk+CisgKiA8bGk+eCA9IHtAbGluayBTSVRlc3QjSU5GRUNUSU9VU19NT1JUQUxJVFl9ID0gMC4xIDwvbGk+CisgKiA8bGk+Jm11OzxzdWI+aTwvc3ViPiA9IHtAbGluayBTSVRlc3QjSU5GRUNUSU9VU19NT1JUQUlMWV9SQVRFfSA9IDAuMTwvbGk+CisgKiA8bGk+JmdhbW1hOyA9IHtAbGluayBTSVJUZXN0I0lNTVVOSVRZX0xPU1NfUkFURX0gPSAwLjE8L2xpPgorICogPGxpPiZwaGk7ID0ge0BsaW5rIFNFSVJUZXN0I0lOQ1VCQVRJT05fUkFURX0gPSAwLjE8L2xpPgorICogPGxpPkFyZWE8c3ViPmw8L3N1Yj4gPSAxLjA8L2xpPgorICogPGxpPkFyZWEgPSAxLjA8L2xpPgorICogPGxpPlAgPSBTICsgSSA9IHtAbGluayBEaXNlYXNlTW9kZWxUZXN0VXRpbCNURVNUX1BPUFVMQVRJT05fQ09VTlR9ID0gMTAwPC9saT4KKyAqIDwvdWw+CisgKiA8aDI+MXgxIERldGVybWluaXN0aWMgU0lSIFNjZW5hcmlvPC9oMj4KKyAqIDxoMz5Jbml0aWFsIFN0YXRlPC9oMz4KKyAqIDxwPgorICogUz0gOTkuMCwgSTxzdXA+Ujwvc3VwPj0xLjAsIEk8c3VwPkY8L3N1cD49MC4wLCBSPTAuMCwgQj0wLjAsIEQ9MC4wLAorICogREQ9MC4wCisgKiA8L3A+CisgKiA8aDM+U0VJUiAxeDEgU3RlcCAwPC9oMz4KKyAqIAorICogPHVsPgorICogPGxpPjxlbT5UU0Y8c3ViPmw8L3N1Yj4gPSAoMS9QKSooQXJlYS9BcmVhPHN1Yj5sPC9zdWI+KTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+VFNGPHN1Yj5sPC9zdWI+ID0gKDEvMTAwKSooMS8xKTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+VFNGPHN1Yj5sPC9zdWI+ID0gMC4wMTwvZW0+PC9saT4KKyAqIDwvdWw+CisgKiA8dWw+CisgKiA8bGk+PGVtPiZiZXRhOzxzdXA+Kjwvc3VwPiA9ICZiZXRhOyBUU0Y8c3ViPmw8L3N1Yj48L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZiZXRhOzxzdXA+Kjwvc3VwPiA9IDAuMSAqIDAuMDE8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZiZXRhOzxzdXA+Kjwvc3VwPiA9IDAuMDAxPC9lbT48L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO0IgPSAmbXU7ICogKFMgKyArRSArSTxzdXA+Ujwvc3VwPiArIEk8c3VwPkY8L3N1cD4gK1IpPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7QiA9IDAuMDEgKiAoOTkrMCsxKzApIDwvZW0+IDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtCID0gMS4wPC9lbT4gPC9saT4KKyAqIDwvdWw+CisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtERCA9ICZtdTs8c3ViPmk8L3N1Yj4gSTxzdXA+Rjwvc3VwPiAgPC9lbT4gPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0REPSAwLjEgKiAwPC9lbT4gPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0REPSAwLjA8L2VtPiA8L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO0QgPSAmbXU7UyArICZtdTtFICsoJm11OyArICZtdTs8c3ViPmk8L3N1Yj4gKUk8c3VwPkY8L3N1cD4gKyAmbXU7IEk8c3VwPlI8L3N1cD4gKyAmbXU7UiA8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0QgPSAwLjAxICogOTkgKyAwLjAxICogMCArICgwLjAxICsgMC4xICkgMCArIDAuMDEgKiAxICsgMC4wMSAqIDA8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0Q9IDE8L2VtPiA8L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO1MgPSAmbXU7IChTICsgRSArSSArIFIpIC0gJmJldGE7PHN1cD4qPC9zdXA+IFMgSSArICZnYW1tYTtSIC0gJm11OyBTPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7UyA9IDAuMDEgKDk5KygxKzArMCkrMCkgLSAwLjAwMSAqIDk5ICogKDErMCswKSArIDAuMDEgKiAwIC0gMC4wMSAqIDk5PC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7UyA9IDEuMCAtIDAuMDk5ICsgMC4wMSAtIDAuOTk8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtTID0gLTAuMDg5PC9lbT48L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO0UgPSAmYmV0YTs8c3VwPio8L3N1cD5TSSAtICZwaGk7RSAtICZtdTtFPC9zdXA+PC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7RSA9IDAuMDAxICogOTkgKiAxIC0gIDAuMSAqIDAgLSAwLjAxICogMDwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0UgPSAwLjA5OTwvZW0+PC9saT4KKyAqIDwvdWw+CisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtJPHN1cD5SPC9zdXA+ID0gKDEteCkmcGhpO0UgLSAmc2lnbWE7IEk8c3VwPlI8L3N1cD4gLSAmbXU7IEk8c3VwPlI8L3N1cD48L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJPHN1cD5SPC9zdXA+ID0gMC45ICogMCAgLSAgMC4wMSAqIDEgLSAwLjAxICogMTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPlI8L3N1cD4gPSAtIDAuMDEgLSAwLjAxPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7STxzdXA+Ujwvc3VwPiA9IC0wLjAyPC9lbT48L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPkY8L3N1cD4gPSB4JnBoaTtFICAtICgmbXU7ICsgJm11OzxzdWI+aTwvc3ViPikgSTxzdXA+Rjwvc3VwPjwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPkY8L3N1cD4gPSAwLjEgKiAwICAtICgwLjAxICsgMC4xKSAqIDA8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJPHN1cD5GPC9zdXA+ID0gMC4wPC9lbT48L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO1IgPSAmc2lnbWE7IEk8c3VwPlI8L3N1cD4gIC0gJmdhbW1hO1IgLSAmbXU7IFI8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtSID0gMC4wMSAqIDEgIC0gMC4wMSAqIDAgLSAwLjAxICogMDwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO1IgPSAuMDE8L2VtPjwvbGk+CisgKiA8L3VsPgorICogPHA+CisgKiBTPSA5OC45MTEsIEU9MC4wOTkgLCBJPHN1cD5SPC9zdXA+PTAuOTgsIEk8c3VwPkY8L3N1cD49MC4wLCBSPTAuMDEsCisgKiBCPTEuMCwgRD0xLjAsIEREPTAuMAorICogPC9wPgorICogCisgKiA8aDM+U0VJUiAxeDEgU3RlcCAxPC9oMz4KKyAqIAorICogPHVsPgorICogPGxpPjxlbT5UU0Y8c3ViPmw8L3N1Yj4gPSAoMS9QKSooQXJlYS9BcmVhPHN1Yj5sPC9zdWI+KTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+VFNGPHN1Yj5sPC9zdWI+ID0gKDEvMTAwKSooMS8xKTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+VFNGPHN1Yj5sPC9zdWI+ID0gMC4wMTwvZW0+PC9saT4KKyAqIDwvdWw+CisgKiA8dWw+CisgKiA8bGk+PGVtPiZiZXRhOzxzdXA+Kjwvc3VwPiA9ICZiZXRhOyBUU0Y8c3ViPmw8L3N1Yj48L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZiZXRhOzxzdXA+Kjwvc3VwPiA9IDAuMSAqIDAuMDE8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZiZXRhOzxzdXA+Kjwvc3VwPiA9IDAuMDAxPC9lbT48L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO0IgPSAmbXU7ICogKFMgKyBFICsgSTxzdXA+Ujwvc3VwPiArIEk8c3VwPkY8L3N1cD4gK1IpPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7QiA9IDAuMDEgKiAxMDAgPC9lbT4gPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0IgPSAxLjA8L2VtPiA8L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO0REID0gJm11OzxzdWI+aTwvc3ViPiBJPHN1cD5GPC9zdXA+ICA8L2VtPiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7REQ9IDAuMSAqIDA8L2VtPiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7REQ9IDAuMDwvZW0+IDwvbGk+CisgKiA8L3VsPgorICogPHVsPgorICogPGxpPjxlbT4mRGVsdGE7RCA9ICZtdTtTICsgJm11O0UgKyAoJm11OyArICZtdTs8c3ViPmk8L3N1Yj4gKUk8c3VwPkY8L3N1cD4gKyAmbXU7IEk8c3VwPlI8L3N1cD4gKyAmbXU7IFIgPC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtEID0gMC4wMSAqIDk4LjkxMSArIDAuMDEgKiAwLjA5OSArICgwLjAxICsgMC4xKSAqIDAgKyAwLjAxICogMC45OCArIDAuMDEgKiAwLjAxPC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtEPSAxLjA8L2VtPiA8L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO1MgPSAmbXU7IChTICsgRSArSSArIFIpIC0gJmJldGE7PHN1cD4qPC9zdXA+IFMgSSArICZnYW1tYTtSIC0gJm11OyBTPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7UyA9IDAuMDEgKDk5LjkxMSsgMC45ODggKDAuOTgwKzApKzAuMDEpIC0gMC4wMDEgKiA5OC45MTEgKiAwLjk4ICsgMC4xICogMC4wMSAtIDAuMDEgKiA5OC45MTE8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtTID0gMS4wIC0gMC4wOTY5MzI3OCArIDAuMDAxIC0gMC45ODkxMTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO1MgPSAtMC4wODU3MDQyNzg8L2VtPjwvbGk+CisgKiA8L3VsPgorICogPHVsPgorICogPGxpPjxlbT4mRGVsdGE7RSA9ICZiZXRhOzxzdXA+Kjwvc3VwPlNJIC0gJnBoaTtFIC0gJm11O0U8L3N1cD48L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtFID0gMC4wMDEgKiA5OC45MTEgKiAwLjk4IC0gIDAuMSAqIDAuMDk5IC0gMC4wMSAqIDAuMDk5PC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7RSA9IDAuMDk2OTMyNzggLSAgMC4wMDk5IC0gMC4wMDA5OTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0UgPSAwLjA4NjA0Mjc4PC9lbT48L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPlI8L3N1cD4gPSAoMS14KSZwaGk7RSAtICZzaWdtYTsgSTxzdXA+Ujwvc3VwPiAtICZtdTsgSTxzdXA+Ujwvc3VwPjwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPlI8L3N1cD4gPSAwLjkgKiAwLjAwOTkgIC0gIDAuMDEgKiAwLjk4IC0gMC4wMSAqIDAuOTg8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJPHN1cD5SPC9zdXA+ID0gMC4wMDg5MSAtIDAuMDA5OCAtIDAuMDA5ODwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPlI8L3N1cD4gPSAtMC4wMTA2OTwvZW0+PC9saT4KKyAqIDwvdWw+CisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtJPHN1cD5GPC9zdXA+ID0geCZwaGk7RSAgLSAoJm11OyArICZtdTs8c3ViPmk8L3N1Yj4pIEk8c3VwPkY8L3N1cD48L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJPHN1cD5GPC9zdXA+ID0gMC4xICogMC4wOTkgIC0gKDAuMDEgKyAwLjEpICogMC4wPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7STxzdXA+Rjwvc3VwPiA9IDAuMDA5OTwvZW0+PC9saT4KKyAqIDwvdWw+CisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtSID0gJnNpZ21hOyBJPHN1cD5SPC9zdXA+ICAtICZnYW1tYTtSIC0gJm11OyBSPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7UiA9IDAuMDEgKiAwLjk4ICAtIDAuMSAqIDAuMDEgLSAwLjAxICogMC4wMTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO1IgPSAuMDA4NzwvZW0+PC9saT4KKyAqIDwvdWw+CisgKiAgUz0gOTguOTExLCBFPTAuMDk5ICwgSTxzdXA+Ujwvc3VwPj0wLjk4LCBJPHN1cD5GPC9zdXA+PTAuMCwgUj0wLjAxLAorICogQj0xLjAsIEQ9MS4wLCBERD0wLjAKKyAqIAorICogPHA+CisgKiBTPSA5OC44MjUwNTcyMiwgRT0wLjE4NTA0Mjc4LCBJPHN1cD5SPC9zdXA+PTAuOTY5MzEsIEk8c3VwPkY8L3N1cD49MC4wMDk5LAorICogUj0wLjAxODcsIEI9Mi4wLCBEPTIuMCwgREQ9MC4wCisgKiA8L3A+CisgKiAKKyAqLworcHVibGljIGNsYXNzIERldGVybWluaXN0aWNTRUlSU2NlbmFyaW9UZXN0IGV4dGVuZHMgU0VJUkRpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdCB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTRUFTRV9VUklfUFJFRklYID0gIkRldGVybWluaXN0aWNTRUlSIjsKKworCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEludGVnZXI+IGV4cGVjdGVkTnVtYmVyT2ZMYWJlbHNUb1VwZGF0ZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKworCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFNFSVJMYWJlbFZhbHVlW11bXVtdPiBleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU0VJUkxhYmVsVmFsdWVbXVtdW10+KCk7CisKKwlzdGF0aWMgeworCisJCS8vIDF4MQorCQlleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcy5wdXQoVEVTVF9TQ0VOQVJJTzF4MV9LRVksCisJCQkJbmV3IFNFSVJMYWJlbFZhbHVlW11bXVtdIHsKKwkJCQkvLyBTdGVwIDAKKwkJCQkJCXsgeworCQkJCQkJLy8gTlswLDBdCisJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDk5LjAxLCAwLjAsIDAuOTgsIDAsIDAuMDEsCisJCQkJCQkJCTAuMCkgfSB9LAorCisJCQkJCQkvLyBTdGVwIDEKKwkJCQkJCXsgeworCQkJCQkJLy8gTlswLDBdCisJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDk5LjAyLCAwLjAsIDAuOTYsIDAuMCwgMC4wMiwgMCkgfSB9IH0gLy8gbmV3CisJCQkJLy8gU0VJUkxhYmVsVmFsdWUKKworCQkJCSk7IC8vIHB1dChURVNUX1NDRU5BUklPMXgxX0tFWSkKKworCQkvLyAxeDIKKwkJZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMKKwkJCQkucHV0KFRFU1RfU0NFTkFSSU8xeDJfS0VZLAorCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlW11bXVtdIHsKKwkJCQkJCS8vIFN0ZXAgMAorCQkJCQkJCQl7IHsKKwkJCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKSwKKwkJCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApIH0gfSwKKworCQkJCQkJCQkvLyBTdGVwIDEKKwkJCQkJCQkJeyB7CisJCQkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKSB9IH0sCisJCQkJCQkJCS8vIFN0ZXAgMgorCQkJCQkJCQl7IHsKKwkJCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKSwKKwkJCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApIH0gfSB9IC8vIG5ldworCQkJCS8vIFNFSVJMYWJlbFZhbHVlCisJCQkJKTsgLy8gcHV0KFRFU1RfU0NFTkFSSU8xeDJfS0VZKQorCisJCS8vIDF4MworCQlleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcworCQkJCS5wdXQoVEVTVF9TQ0VOQVJJTzF4M19LRVksCisJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVbXVtdW10geworCQkJCQkJLy8gU3RlcCAwCisJCQkJCQkJCXsgeworCisJCQkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKSwKKwkJCQkJCQkJCQkvLyBOWzAsMl0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApCisKKwkJCQkJCQkJfSB9LAorCisJCQkJCQkJCS8vIFN0ZXAgMQorCQkJCQkJCQl7IHsKKwkJCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKSwKKwkJCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMCwyXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCkKKworCQkJCQkJCQl9IH0sCisKKwkJCQkJCQkJLy8gU3RlcCAyCisJCQkJCQkJCXsgeworCQkJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlswLDJdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKQorCisJCQkJCQkJCX0gfSB9IC8vIG5ldyBTRUlSTGFiZWxWYWx1ZQorCisJCQkJKTsgLy8gcHV0KFRFU1RfU0NFTkFSSU8xeDNfS0VZKQorCisJCS8vIDJ4MgorCQlleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcy5wdXQoVEVTVF9TQ0VOQVJJTzJ4Ml9LRVksCisJCQkJbmV3IFNFSVJMYWJlbFZhbHVlW11bXVtdIHsKKwkJCQkvLyBTdGVwIDAKKwkJCQkJCXsKKwkJCQkJCQkJeworCisJCQkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKQorCisJCQkJCQkJCX0sCisJCQkJCQkJCXsKKworCQkJCQkJCQkvLyBOWzEsMF0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMSwxXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCkKKworCQkJCQkJCQl9IH0sCisKKwkJCQkJCS8vIFN0ZXAgMQorCQkJCQkJeworCQkJCQkJCQl7CisJCQkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlswLDF6CisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKQorCisJCQkJCQkJCX0sCisJCQkJCQkJCXsKKworCQkJCQkJCQkvLyBOWzEsMF0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMSwxXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCkKKworCQkJCQkJCQl9IH0sCisKKwkJCQkJCS8vIFN0ZXAgMgorCQkJCQkJeworCQkJCQkJCQl7CisJCQkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKQorCisJCQkJCQkJCX0sCisJCQkJCQkJCXsKKworCQkJCQkJCQkvLyBOWzEsMF0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMSwxXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCkKKworCQkJCQkJCQl9IH0gfSAvLyBuZXcgU0VJUkxhYmVsVmFsdWUKKworCQkJCSk7IC8vIHB1dChURVNUX1NDRU5BUklPMngyX0tFWSkKKworCQkvLyAzeDMKKwkJZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMucHV0KFRFU1RfU0NFTkFSSU8zeDNfS0VZLAorCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZVtdW11bXSB7CisJCQkJLy8gU3RlcCAwCisJCQkJCQl7CisJCQkJCQkJCXsKKworCQkJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlswLDJdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKQorCisJCQkJCQkJCX0sCisJCQkJCQkJCXsKKworCQkJCQkJCQkvLyBOWzEsMF0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMSwxXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlsxLDJdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKQorCisJCQkJCQkJCX0sCisJCQkJCQkJCXsKKworCQkJCQkJCQkvLyBOWzIsMF0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMiwxXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlsyLDJdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKQorCisJCQkJCQkJCX0gfSwKKworCQkJCQkJLy8gU3RlcCAxCisJCQkJCQl7CisJCQkJCQkJCXsKKwkJCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKSwKKwkJCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMCwyXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCkKKworCQkJCQkJCQl9LAorCQkJCQkJCQl7CisKKwkJCQkJCQkJLy8gTlsxLDBdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKSwKKwkJCQkJCQkJCQkvLyBOWzEsMV0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMSwyXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCkKKworCQkJCQkJCQl9LAorCQkJCQkJCQl7CisKKwkJCQkJCQkJLy8gTlsyLDBdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKSwKKwkJCQkJCQkJCQkvLyBOWzIsMV0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMiwyXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCkKKworCQkJCQkJCQl9IH0sCisKKwkJCQkJCS8vIFN0ZXAgMgorCQkJCQkJeworCQkJCQkJCQl7CisJCQkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKSwKKwkJCQkJCQkJCQkvLyBOWzAsMl0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApCisKKwkJCQkJCQkJfSwKKwkJCQkJCQkJeworCisJCQkJCQkJCS8vIE5bMSwwXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlsxLDFdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKSwKKwkJCQkJCQkJCQkvLyBOWzEsMl0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApCisKKwkJCQkJCQkJfSwKKwkJCQkJCQkJeworCisJCQkJCQkJCS8vIE5bMiwwXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlsyLDFdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKSwKKwkJCQkJCQkJCQkvLyBOWzIsMl0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApCisKKwkJCQkJCQkJfSB9IH0gLy8gbmV3IFNFSVJMYWJlbFZhbHVlCisKKwkJCQkpOyAvLyBwdXQoVEVTVF9TQ0VOQVJJTzN4M19LRVkpCisKKwkJLy8gRmlsbCBvdXQgdGhlIG1hcCB0aGF0IHNwZWNpZmllcyBob3cgbWFueSBsYWJlbHMgc2hvdWxkIGJlIHVwZGF0ZWQgYnkKKwkJLy8gYSBkaXNlYXNlIG1vZGVsIGZvciBlYWNoIHRlc3QuCisJCWZvciAoVGVzdFNwZWMgdGVzdFNwZWMgOiB0ZXN0U3BlY2lmaWNhdGlvbnMpIHsKKwkJCWV4cGVjdGVkTnVtYmVyT2ZMYWJlbHNUb1VwZGF0ZQorCQkJCQkucHV0KAorCQkJCQkJCXRlc3RTcGVjLnNjZW5hcmlvRGlzZWFzZUtleSwKKwkJCQkJCQluZXcgSW50ZWdlcigKKwkJCQkJCQkJCWNvbXB1dGVFeHBlY3RlZE51bWJlck9mTGFiZWxzKGV4cGVjdGVkRGlzZWFzZU1vZGVsU3RhdGVzCisJCQkJCQkJCQkJCS5nZXQodGVzdFNwZWMuc2NlbmFyaW9EaXNlYXNlS2V5KSkpKTsKKwkJfSAvLyBmb3IgZWFjaCB0ZXN0IHNwZWNpZmljYXRpb24KKworCX0gLy8gc3RhdGljCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0cy5EaXNlYXNlTW9kZWxTY2VuYXJpb1Rlc3QjZ2V0RGlzZWFzZU1vZGVsc1RvVGVzdCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8Tm9kZURlY29yYXRvcj4gZ2V0RGlzZWFzZU1vZGVsc1RvVGVzdCgpIHsKKwkJZmluYWwgTGlzdDxOb2RlRGVjb3JhdG9yPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8Tm9kZURlY29yYXRvcj4oKTsKKwkJcmV0VmFsdWUuYWRkKERldGVybWluaXN0aWNTRUlSRGlzZWFzZU1vZGVsVGVzdC5jcmVhdGVGaXh0dXJlKCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXREaXNlYXNlTW9kZWxzVG9UZXN0CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgaW50IGdldE51bWJlck9mU3RlcHMoZmluYWwgU3RyaW5nIGRpc2Vhc2VTY2VuYXJpb0tleSkgeworCQlTRUlSTGFiZWxWYWx1ZVtdW11bXSB0ZW1wID0gZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMKKwkJCQkuZ2V0KGRpc2Vhc2VTY2VuYXJpb0tleSk7CisJCXJldHVybiB0ZW1wLmxlbmd0aDsKKwl9IC8vIGdldE51bWJlck9mU3RlcHMKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBpbnQgZ2V0RXhwZWN0ZWROdW1iZXJPZkxhYmVsc1RvVXBkYXRlKAorCQkJZmluYWwgU3RyaW5nIGRpc2Vhc2VTY2VuYXJpb0tleSkgeworCQlJbnRlZ2VyIHRlbXAgPSBleHBlY3RlZE51bWJlck9mTGFiZWxzVG9VcGRhdGUuZ2V0KGRpc2Vhc2VTY2VuYXJpb0tleSk7CisJCXJldHVybiB0ZW1wLmludFZhbHVlKCk7CisJfSAvLyBnZXRFeHBlY3RlZE51bWJlck9mTGFiZWxzVG9VcGRhdGUKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBMYWJlbFZhbHVlW11bXSBnZXRFeHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlKAorCQkJZmluYWwgU3RyaW5nIGRpc2Vhc2VTY2VuYXJpb0tleSwgZmluYWwgaW50IHN0ZXApIHsKKwkJZmluYWwgU0VJUkxhYmVsVmFsdWVbXVtdW10gc2VpckxhYmVsVmFsdWUgPSBleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcworCQkJCS5nZXQoZGlzZWFzZVNjZW5hcmlvS2V5KTsKKwkJcmV0dXJuIHNlaXJMYWJlbFZhbHVlW3N0ZXBdOworCX0gLy8gZ2V0RXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXREaXNlYXNlVVJJUHJlZml4KCkgeworCQlyZXR1cm4gRElTRUFTRV9VUklfUFJFRklYOworCX0gLy8gZ2V0RGlzZWFzZVVSSVByZWZpeAorCisJLyoqCisJICogQHBhcmFtIG51bVJvd3MKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgbGF0dGljZQorCSAqIEBwYXJhbSBudW1Db2x1bW5zCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGxhdHRpY2UKKwkgKiBAcmV0dXJuIGEgc2NlbmFyaW8gd2l0aCBub2RlcyBpbiBhIGxhdHRpY2Ugd2l0aCBhIGRldGVybWluaXN0aWMgU0VJUgorCSAqICAgICAgICAgZGlzZWFzZSBtb2RlbCBhbmQgb25lIHBvcHVsYXRpb24gbWVtYmVyIGluZmVjdGVkIGluIE5vZGUgWzBdWzBdCisJICovCisJcHVibGljIHN0YXRpYyBTY2VuYXJpbyBjcmVhdGVTY2VuYXJpbyhmaW5hbCBpbnQgbnVtUm93cywKKwkJCWZpbmFsIGludCBudW1Db2x1bW5zKSB7CisJCWZpbmFsIENvbGxlY3Rpb248Tm9kZURlY29yYXRvcj4gZGlzZWFzZU1vZGVscyA9IG5ldyBBcnJheUxpc3Q8Tm9kZURlY29yYXRvcj4oKTsKKworCQlkaXNlYXNlTW9kZWxzLmFkZChEZXRlcm1pbmlzdGljU0VJUkRpc2Vhc2VNb2RlbFRlc3QuY3JlYXRlRml4dHVyZSgpKTsKKworCQlmaW5hbCBNb2RlbCBtb2RlbCA9IERpc2Vhc2VNb2RlbFRlc3RVdGlsLmNyZWF0ZUxhdHRpY2VNb2RlbCgKKwkJCQlkaXNlYXNlTW9kZWxzLCBudW1Sb3dzLCBudW1Db2x1bW5zLAorCQkJCURpc2Vhc2VNb2RlbFRlc3RVdGlsLlRFU1RfUE9QVUxBVElPTl9DT1VOVCwKKwkJCQlEaXNlYXNlTW9kZWxUZXN0VXRpbC5URVNUX0FSRUEpOworCisJCWZpbmFsIFNjZW5hcmlvIHJldFZhbHVlID0gRGlzZWFzZU1vZGVsVGVzdFV0aWwuY3JlYXRlTGF0dGljZVNjZW5hcmlvKAorCQkJCVNJRGlzZWFzZU1vZGVsU2NlbmFyaW9UZXN0LmNyZWF0ZUluZmVjdG9ycyhtb2RlbCksIG1vZGVsKTsKKworCQlhc3NlcnQgcmV0VmFsdWUuc2FuZSgpOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUZpeHR1cmUKKworfSAvLyBEZXRlcm1pbmlzdGljU0VJUlNjZW5hcmlvVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjYwODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9EZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWxUZXN0LmphdmEKQEAgLTAsMCArMSwxMDYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbDsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsSW1wbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRldGVybWluaXN0aWMgU0kgRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsVGVzdCBleHRlbmRzIFNJVGVzdCB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfREVURVJNSU5JU1RJQ19TSV9ESVNFQVNFX05BTUUgPSAiRGV0ZXJtaW5pc3RpYyBTSSBEaXNlYXNlIE1vZGVsIjsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihEZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWxUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IERldGVybWluaXN0aWMgU0kgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWxUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRGV0ZXJtaW5pc3RpYyBTSSBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIERldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKERldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbClmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwkJU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBkbWwgPSBjcmVhdGVMYWJlbEZpeHR1cmUoKTsKKwkJRGlzZWFzZU1vZGVsU3RhdGUgZG1zID0gZ2V0Rml4dHVyZSgpLmNyZWF0ZURpc2Vhc2VNb2RlbFN0YXRlKCk7CisJCWRtbC5zZXREaXNlYXNlTW9kZWxTdGF0ZShkbXMpOworCQlzZXRMYWJlbEZpeHR1cmUoZG1sKTsKKwkJZml4dHVyZS5pbml0aWFsaXplRGlzZWFzZVN0YXRlKGRtcywgZG1sKTsKKwl9IC8vIHNldFVwCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci50ZWFyRG93bigpOworCX0gLy8gdGVhckRvd24KKworCS8qKgorCSAqIENyZWF0ZSBkaXNlYXNlIG1vZGVsIGluc3RhbmNlCisJICogCisJICogQHJldHVybiBhIGRpc2Vhc2UgbW9kZWwgaW5zdGFuY2UgZm9yIHRlc3QgcHVycG9zZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIERldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbCBjcmVhdGVGaXh0dXJlKCkgeworCQlyZXR1cm4gRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsSW1wbAorCQkJCS5jcmVhdGVEZXRlcm1pbmlzdGljU0lEaXNlYXNlTW9kZWwoCisJCQkJCQlURVNUX0RFVEVSTUlOSVNUSUNfU0lfRElTRUFTRV9OQU1FLCBNT1JUQUxJVFlfUkFURSwKKwkJCQkJCUlORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUsCisJCQkJCQlUUkFOU01JU1NJT05fUkFURSwgUkVDT1ZFUllfUkFURSwKKwkJCQkJCU5PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQsIFRFU1RfVElNRV9QRVJJT0QsCisJCQkJCQlURVNUX1BPUFVMQVRJT05fSURFTlRJRklFUik7CisJfSAvLyBjcmVhdGVGaXh0dXJlCit9IC8vIERldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0RldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9EZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZWEzYWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9EZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxTdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsSW1wbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRldGVybWluaXN0aWMgU0lSIERpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIERldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWxUZXN0IGV4dGVuZHMgU0lSVGVzdCB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfREVURVJNSU5JU1RJQ19TSVJfRElTRUFTRV9OQU1FID0gIkRldGVybWluaXN0aWMgU0lSIERpc2Vhc2UgTW9kZWwiOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKERldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWxUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IERldGVybWluaXN0aWMgU0lSIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEZXRlcm1pbmlzdGljIFNJUiBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIERldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCQlTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRtbCA9IGNyZWF0ZUxhYmVsRml4dHVyZSgpOworCQlEaXNlYXNlTW9kZWxTdGF0ZSBkbXMgPSBnZXRGaXh0dXJlKCkuY3JlYXRlRGlzZWFzZU1vZGVsU3RhdGUoKTsKKwkJZG1sLnNldERpc2Vhc2VNb2RlbFN0YXRlKGRtcyk7CisJCXNldExhYmVsRml4dHVyZShkbWwpOworCQlmaXh0dXJlLmluaXRpYWxpemVEaXNlYXNlU3RhdGUoZG1zLCBkbWwpOworCX0gLy8gc2V0VXAKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnRlYXJEb3duKCk7CisJfSAvLyB0ZWFyRG93bgorCisJLyoqCisJICogQ3JlYXRlIGRpc2Vhc2UgbW9kZWwgaW5zdGFuY2UKKwkgKiAKKwkgKiBAcmV0dXJuIGEgZGlzZWFzZSBtb2RlbCBpbnN0YW5jZSBmb3IgdGVzdCBwdXJwb3NlcworCSAqLworCXB1YmxpYyBzdGF0aWMgRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbCBjcmVhdGVGaXh0dXJlKCkgeworCQlyZXR1cm4gRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbEltcGwKKwkJCQkuY3JlYXRlRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbCgKKwkJCQkJCVRFU1RfREVURVJNSU5JU1RJQ19TSVJfRElTRUFTRV9OQU1FLCBNT1JUQUxJVFlfUkFURSwKKwkJCQkJCUlORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUsCisJCQkJCQlUUkFOU01JU1NJT05fUkFURSwgUkVDT1ZFUllfUkFURSwgSU1NVU5JVFlfTE9TU19SQVRFLAorCQkJCQkJTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVCwgVEVTVF9USU1FX1BFUklPRCwKKwkJCQkJCVRFU1RfUE9QVUxBVElPTl9JREVOVElGSUVSKTsKKwl9IC8vIGNyZWF0ZUZpeHR1cmUKKworfSAvLyBEZXRlcm1pbmlzdGljU0lSRGlzZWFzZU1vZGVsVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvRGV0ZXJtaW5pc3RpY1NJUlNjZW5hcmlvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvRGV0ZXJtaW5pc3RpY1NJUlNjZW5hcmlvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZTJmODUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9EZXRlcm1pbmlzdGljU0lSU2NlbmFyaW9UZXN0LmphdmEKQEAgLTAsMCArMSw0NTAgQEAKKy8vIERldGVybWluaXN0aWNTSVJTY2VuYXJpb1Rlc3QuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lSTGFiZWxWYWx1ZUltcGw7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0IHRlc3QgY2FzZSBmb3IgYSBEZXRlcm1pbmlzdGljIFNJUiBkaXNlYXNlIG1vZGVsCisgKiBzY2VuYXJpby4gCisgKiA8dWw+CisgKiA8bGk+Jm11OyA9IHtAbGluayBEaXNlYXNlTW9kZWxUZXN0I01PUlRBTElUWV9SQVRFfSA9IDAuMDE8L2xpPgorICogPGxpPiZiZXRhOyA9IHtAbGluayBTSVRlc3QjVFJBTlNNSVNTSU9OX1JBVEV9ID0gMC4xPC9saT4KKyAqIDxsaT4mc2lnbWE7ID0ge0BsaW5rIFNJVGVzdCNSRUNPVkVSWV9SQVRFfSA9IDAuMDE8L2xpPgorICogPGxpPnggPSB7QGxpbmsgU0lUZXN0I0lORkVDVElPVVNfTU9SVEFMSVRZfSA9IDAuMSA8L2xpPgorICogPGxpPiZtdTs8c3ViPmk8L3N1Yj4gPSB7QGxpbmsgU0lUZXN0I0lORkVDVElPVVNfTU9SVEFJTFlfUkFURX0gPSAwLjE8L2xpPgorICogPGxpPiZnYW1tYTsgPSB7QGxpbmsgU0lSVGVzdCNJTU1VTklUWV9MT1NTX1JBVEV9ID0gMC4xPC9saT4KKyAqIDxsaT5BcmVhPHN1Yj5sPC9zdWI+ID0gMS4wPC9saT4KKyAqIDxsaT5BcmVhID0gMS4wPC9saT4KKyAqIDxsaT5QID0gUyArIEkgPSB7QGxpbmsgRGlzZWFzZU1vZGVsVGVzdFV0aWwjVEVTVF9QT1BVTEFUSU9OX0NPVU5UfSA9IDEwMDwvbGk+CisgKiA8L3VsPgorICogPGgyPjF4MSBEZXRlcm1pbmlzdGljIFNJUiBTY2VuYXJpbzwvaDI+CisgKiA8aDM+SW5pdGlhbCBTdGF0ZTwvaDM+CisgKiA8cD4KKyAqIFM9IDk5LjAsIEk8c3VwPlI8L3N1cD49MS4wLCBJPHN1cD5GPC9zdXA+PTAuMCwgUj0wLjAsIEI9MC4wLCBEPTAuMCwKKyAqIEREPTAuMAorICogPC9wPgorICogPGgzPlNJUiAxeDEgU3RlcCAwPC9oMz4KKyAqIAorICogPHVsPgorICogPGxpPjxlbT5UU0Y8c3ViPmw8L3N1Yj4gPSAoMS9QKSooQXJlYS9BcmVhPHN1Yj5sPC9zdWI+KTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+VFNGPHN1Yj5sPC9zdWI+ID0gKDEvMTAwKSooMS8xKTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+VFNGPHN1Yj5sPC9zdWI+ID0gMC4wMTwvZW0+PC9saT4KKyAqIDwvdWw+CisgKiA8dWw+CisgKiA8bGk+PGVtPiZiZXRhOzxzdXA+Kjwvc3VwPiA9ICZiZXRhOyBUU0Y8c3ViPmw8L3N1Yj48L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZiZXRhOzxzdXA+Kjwvc3VwPiA9IDAuMSAqIDAuMDE8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZiZXRhOzxzdXA+Kjwvc3VwPiA9IDAuMDAxPC9lbT48L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO0IgPSAmbXU7ICogKFMgKyBJPHN1cD5SPC9zdXA+ICsgSTxzdXA+Rjwvc3VwPiArUik8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtCID0gMC4wMSAqICg5OSsxKzApIDwvZW0+IDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtCID0gMS4wPC9lbT4gPC9saT4KKyAqIDwvdWw+CisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtERCA9ICZtdTs8c3ViPmk8L3N1Yj4gSTxzdXA+Rjwvc3VwPiAgPC9lbT4gPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0REPSAwLjEgKiAwPC9lbT4gPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0REPSAwLjA8L2VtPiA8L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO0QgPSAmbXU7IFMgKyAoJm11OyArICZtdTs8c3ViPmk8L3N1Yj4gKUk8c3VwPkY8L3N1cD4gKyAmbXU7IEk8c3VwPlI8L3N1cD4gKyAmbXU7IFIgPC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtEID0gMC4wMSAqIDk5ICsgKDAuMDEgKyAwLjEgKSAwICsgMC4wMSAqIDEgKyAwLjAxICogMDwvZW0+CisgKiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7RD0gMTwvZW0+IDwvbGk+CisgKiA8L3VsPgorICogPHVsPgorICogPGxpPjxlbT4mRGVsdGE7UyA9ICZtdTsgKFMgKyBJICsgUikgLSAmYmV0YTs8c3VwPio8L3N1cD4gUyBJICsgJmdhbW1hO1IgLSAmbXU7IFM8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtTID0gMC4wMSAoOTkrKDErMCkrMCkgLSAwLjAwMSAqIDk5ICogKDErMCswKSArIDAuMDEgKiAwIC0gMC4wMSAqIDk5PC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7UyA9IDEuMCAtIDAuMDk5ICsgMC4wMSAtIDAuOTk8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtTID0gLTAuMDg5PC9lbT48L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPlI8L3N1cD4gPSAoMS14KSZiZXRhOzxzdXA+Kjwvc3VwPiBTIEkgLSAmc2lnbWE7IEk8c3VwPlI8L3N1cD4gLSAmbXU7IEk8c3VwPlI8L3N1cD48L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJPHN1cD5SPC9zdXA+ID0gMC45ICogMC4wMDEgKiA5OSAqIDEgLSAgMC4wMSAqIDEgLSAwLjAxICogMTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPlI8L3N1cD4gPSAwLjA4OTEgLSAuMDEgLSAuMDE8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJPHN1cD5SPC9zdXA+ID0gMC4wNjkxPC9lbT48L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPkY8L3N1cD4gPSB4JmJldGE7PHN1cD4qPC9zdXA+IFMgSSAgLSAoJm11OyArICZtdTs8c3ViPmk8L3N1Yj4pIEk8c3VwPkY8L3N1cD48L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJPHN1cD5GPC9zdXA+ID0gMC4xICogMC4wMDEgKiA5OSAqIDEgIC0gKDAuMDEgKyAwLjEpICogMDwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPkY8L3N1cD4gPSAuMDA5OTwvZW0+PC9saT4KKyAqIDwvdWw+CisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtSID0gJnNpZ21hOyBJPHN1cD5SPC9zdXA+ICAtICZnYW1tYTtSIC0gJm11OyBSPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7UiA9IDAuMDEgKiAxICAtIDAuMDEgKiAwIC0gMC4wMSAqIDA8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtSID0gLjAxPC9lbT48L2xpPgorICogPC91bD4KKyAqIDxwPgorICogUz0gOTguOTExLCBJPHN1cD5SPC9zdXA+PTEuMDY5MSwgSTxzdXA+Rjwvc3VwPj0wLjAwOTksIFI9MC4wMSwgQj0xLjAsCisgKiBEPTEuMCwgREQ9MC4wCisgKiA8L3A+CisgKiAKKyAqIDxoMz5TSVIgMXgxIFN0ZXAgMTwvaDM+CisgKiAKKyAqIDx1bD4KKyAqIDxsaT48ZW0+VFNGPHN1Yj5sPC9zdWI+ID0gKDEvUCkqKEFyZWEvQXJlYTxzdWI+bDwvc3ViPik8L2VtPjwvbGk+CisgKiA8bGk+PGVtPlRTRjxzdWI+bDwvc3ViPiA9ICgxLzk5Ljk4OSkqKDEvMSk8L2VtPjwvbGk+CisgKiA8bGk+PGVtPlRTRjxzdWI+bDwvc3ViPiA9IDAuMDEwMDAxMTwvZW0+PC9saT4KKyAqIDwvdWw+CisgKiA8dWw+CisgKiA8bGk+PGVtPiZiZXRhOzxzdXA+Kjwvc3VwPiA9ICZiZXRhOyBUU0Y8c3ViPmw8L3N1Yj48L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZiZXRhOzxzdXA+Kjwvc3VwPiA9IDAuMSAqIDAuMDEwMDAxMTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JmJldGE7PHN1cD4qPC9zdXA+ID0gMC4wMDEwMDAxMTwvZW0+PC9saT4KKyAqIDwvdWw+CisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtCID0gJm11OyAqIChTICsgSTxzdXA+Ujwvc3VwPiArIEk8c3VwPkY8L3N1cD4gK1IpPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7QiA9IDAuMDEgKiA5OS45ODkgPC9lbT4gPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0IgPSAwLjk5OTg5PC9lbT4gPC9saT4KKyAqIDwvdWw+CisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtERCA9ICZtdTs8c3ViPmk8L3N1Yj4gSTxzdXA+Rjwvc3VwPiAgPC9lbT4gPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0REPSAwLjEgKiAwLjAwOTk8L2VtPiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7REQ9IDAuMDAwOTk8L2VtPiA8L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO0QgPSAmbXU7IFMgKyAoJm11OyArICZtdTs8c3ViPmk8L3N1Yj4gKUk8c3VwPkY8L3N1cD4gKyAmbXU7IEk8c3VwPlI8L3N1cD4gKyAmbXU7IFIgPC9lbT4KKyAqIDwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtEID0gMC4wMSAqIDk4LjkxMSArICgwLjAxICsgMC4xKSAwLjAwOTkgKyAwLjAxICogMS4wNjkxICsgMC4wMSAqIDAuMDE8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0Q9IDEuMDAwOTk8L2VtPiA8L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO1MgPSAmbXU7IChTICsgSSArIFIpIC0gJmJldGE7PHN1cD4qPC9zdXA+IFMgSSArICZnYW1tYTtSIC0gJm11OyBTPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7UyA9IDAuMDEgKiA5OS45ODkgLSAwLjAwMTAwMDExICogOTguOTExICogKDEuMDY5MSswLjAwOTkpICsgMC4wMSAqIDAuMDEgLSAwLjAxICogOTguOTExPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7UyA9IDAuOTk5ODkgLSAwLjEwNjczNjcwOSArIDAuMDAwMSAtIDAuOTg5MTE8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtTID0gLTAuMDk1ODU2NzA5PC9lbT48L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPlI8L3N1cD4gPSAoMS14KSZiZXRhOzxzdXA+Kjwvc3VwPiBTIEkgLSAmc2lnbWE7IEk8c3VwPlI8L3N1cD4gLSAmbXU7IEk8c3VwPlI8L3N1cD48L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJPHN1cD5SPC9zdXA+ID0gMC45ICogMC4wMDEwMDAxMSAqIDk4LjkxMSAqICgxLjA2OTErMC4wMDk5KSAtICAwLjAxICogMS4wNjkxIC0gMC4wMSAqIDEuMDY5MTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPlI8L3N1cD4gPSAwLjA5NjA2MzAzOCAtIC4wMTA2OTEgLSAuMDEwNjkxPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7STxzdXA+Ujwvc3VwPiA9IDAuMDc0NjgxMDM4PC9lbT48L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPkY8L3N1cD4gPSB4JmJldGE7PHN1cD4qPC9zdXA+IFMgSSAgLSAoJm11OyArICZtdTs8c3ViPmk8L3N1Yj4pIEk8c3VwPkY8L3N1cD48L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJPHN1cD5GPC9zdXA+ID0gMC4xICogMC4wMDEwMDAxMSAqIDk4LjkxMSAqICgxLjA2OTErMC4wMDk5KSAgLSAoMC4wMSArIDAuMSkgKiAwLjAwOTk8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJPHN1cD5GPC9zdXA+ID0gMC4wMTA2NzM2NzEgIC0gMC4wMDEwODk8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJPHN1cD5GPC9zdXA+ID0gLjAwOTU4NDY3MTwvZW0+PC9saT4KKyAqIDwvdWw+CisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtSID0gJnNpZ21hOyBJPHN1cD5SPC9zdXA+ICAtICZnYW1tYTtSIC0gJm11OyBSPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7UiA9IDAuMDEgKiAxLjA2OTEgIC0gMC4wMSAqIDAuMDEgLSAwLjAxICogMC4wMTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO1IgPSAuMDEwNDkxPC9lbT48L2xpPgorICogPC91bD4KKyAqIDxwPgorICogUz0gOTguODE1MTQzMjksIEk8c3VwPlI8L3N1cD49MS4xNDM3ODEwMzgsIEk8c3VwPkY8L3N1cD49MC4wMTk0ODQ2NzEsCisgKiBSPTAuMDIwNDkxLCBCPTEuOTk5ODksIEQ9Mi4wMDA5OSwgREQ9MC4wMDA5OQorICogPC9wPgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBEZXRlcm1pbmlzdGljU0lSU2NlbmFyaW9UZXN0IGV4dGVuZHMgU0lSRGlzZWFzZU1vZGVsU2NlbmFyaW9UZXN0IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNFQVNFX1VSSV9QUkVGSVggPSAiRGV0ZXJtaW5pc3RpY1NJUiI7CisKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBleHBlY3RlZE51bWJlck9mTGFiZWxzVG9VcGRhdGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTSVJMYWJlbFZhbHVlW11bXVtdPiBleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU0lSTGFiZWxWYWx1ZVtdW11bXT4oKTsKKworCXN0YXRpYyB7CisKKwkJLy8gMXgxCisJCWV4cGVjdGVkRGlzZWFzZU1vZGVsU3RhdGVzLnB1dChURVNUX1NDRU5BUklPMXgxX0tFWSwKKwkJCQluZXcgU0lSTGFiZWxWYWx1ZVtdW11bXSB7CisJCQkJLy8gU3RlcCAwCisJCQkJCQl7IHsKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDk5LjAxLCAwLjk4LCAwLjAsIDAuMDEsCisJCQkJCQkJCTAuMCkgfSB9LAorCisJCQkJCQkvLyBTdGVwIDEKKwkJCQkJCXsgeworCQkJCQkJLy8gTlswLDBdCisJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoOTkuMDIsIDAuOTYsIDAuMCwgMC4wMiwgCisJCQkJCQkJCTAuMDApIH0gfSB9IC8vIG5ldworCQkJCS8vIFNJUkxhYmVsVmFsdWUKKworCQkJCSk7IC8vIHB1dChURVNUX1NDRU5BUklPMXgxX0tFWSkKKworCQkvLyAxeDIKKwkJZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMKKwkJCQkucHV0KFRFU1RfU0NFTkFSSU8xeDJfS0VZLAorCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVbXVtdW10geworCQkJCQkJLy8gU3RlcCAwCisJCQkJCQkJCXsgeworCQkJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSB9IH0sCisKKwkJCQkJCQkJLy8gU3RlcCAxCisJCQkJCQkJCXsgeworCQkJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwCisJCQkJCQkJCQkJCQkpIH0gfSwKKwkJCQkJCQkJLy8gU3RlcCAyCisJCQkJCQkJCXsgeworCQkJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwCisJCQkJCQkJCQkJCQkpLAorCQkJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAKKwkJCQkJCQkJCQkJCSkgfSB9IH0gLy8gbmV3CisJCQkJLy8gU0lSTGFiZWxWYWx1ZQorCQkJCSk7IC8vIHB1dChURVNUX1NDRU5BUklPMXgyX0tFWSkKKworCQkvLyAxeDMKKwkJZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMucHV0KFRFU1RfU0NFTkFSSU8xeDNfS0VZLAorCQkJCW5ldyBTSVJMYWJlbFZhbHVlW11bXVtdIHsKKwkJCQkvLyBTdGVwIDAKKwkJCQkJCXsgeworCisJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDJdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApCisKKwkJCQkJCX0gfSwKKworCQkJCQkJLy8gU3RlcCAxCisJCQkJCQl7IHsKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzAsMl0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCkKKworCQkJCQkJfSB9LAorCisJCQkJCQkvLyBTdGVwIDIKKwkJCQkJCXsgeworCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMCwyXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKQorCisJCQkJCQl9IH0gfSAvLyBuZXcgU0lSTGFiZWxWYWx1ZQorCisJCQkJKTsgLy8gcHV0KFRFU1RfU0NFTkFSSU8xeDNfS0VZKQorCisJCS8vIDJ4MgorCQlleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcy5wdXQoVEVTVF9TQ0VOQVJJTzJ4Ml9LRVksCisJCQkJbmV3IFNJUkxhYmVsVmFsdWVbXVtdW10geworCQkJCS8vIFN0ZXAgMAorCQkJCQkJeyB7CisKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApCisKKwkJCQkJCX0sIHsKKworCQkJCQkJLy8gTlsxLDBdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzEsMV0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCkKKworCQkJCQkJfSB9LAorCisJCQkJCQkvLyBTdGVwIDEKKwkJCQkJCXsgeworCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCkKKworCQkJCQkJfSwgeworCisJCQkJCQkvLyBOWzEsMF0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMSwxXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKQorCisJCQkJCQl9IH0sCisKKwkJCQkJCS8vIFN0ZXAgMgorCQkJCQkJeyB7CisJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKQorCisJCQkJCQl9LCB7CisKKwkJCQkJCS8vIE5bMSwwXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsxLDFdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApCisKKwkJCQkJCX0gfSB9IC8vIG5ldyBTSVJMYWJlbFZhbHVlCisKKwkJCQkpOyAvLyBwdXQoVEVTVF9TQ0VOQVJJTzJ4Ml9LRVkpCisKKwkJLy8gM3gzCisJCWV4cGVjdGVkRGlzZWFzZU1vZGVsU3RhdGVzLnB1dChURVNUX1NDRU5BUklPM3gzX0tFWSwKKwkJCQluZXcgU0lSTGFiZWxWYWx1ZVtdW11bXSB7CisJCQkJLy8gU3RlcCAwCisJCQkJCQl7IHsKKworCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMCwyXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKQorCisJCQkJCQl9LCB7CisKKwkJCQkJCS8vIE5bMSwwXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsxLDFdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzEsMl0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCkKKworCQkJCQkJfSwgeworCisJCQkJCQkvLyBOWzIsMF0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMiwxXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsyLDJdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApCisKKwkJCQkJCX0gfSwKKworCQkJCQkJLy8gU3RlcCAxCisJCQkJCQl7IHsKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzAsMl0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCkKKworCQkJCQkJfSwgeworCisJCQkJCQkvLyBOWzEsMF0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMSwxXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsxLDJdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApCisKKwkJCQkJCX0sIHsKKworCQkJCQkJLy8gTlsyLDBdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzIsMV0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMiwyXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKQorCisJCQkJCQl9IH0sCisKKwkJCQkJCS8vIFN0ZXAgMgorCQkJCQkJeyB7CisJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDJdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApCisKKwkJCQkJCX0sIHsKKworCQkJCQkJLy8gTlsxLDBdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzEsMV0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMSwyXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKQorCisJCQkJCQl9LCB7CisKKwkJCQkJCS8vIE5bMiwwXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsyLDFdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzIsMl0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCkKKworCQkJCQkJfSB9IH0gLy8gbmV3IFNJUkxhYmVsVmFsdWUKKworCQkJCSk7IC8vIHB1dChURVNUX1NDRU5BUklPM3gzX0tFWSkKKworCQkvLyBGaWxsIG91dCB0aGUgbWFwIHRoYXQgc3BlY2lmaWVzIGhvdyBtYW55IGxhYmVscyBzaG91bGQgYmUgdXBkYXRlZCBieQorCQkvLyBhIGRpc2Vhc2UgbW9kZWwgZm9yIGVhY2ggdGVzdC4KKwkJZm9yIChUZXN0U3BlYyB0ZXN0U3BlYyA6IHRlc3RTcGVjaWZpY2F0aW9ucykgeworCQkJZXhwZWN0ZWROdW1iZXJPZkxhYmVsc1RvVXBkYXRlCisJCQkJCS5wdXQoCisJCQkJCQkJdGVzdFNwZWMuc2NlbmFyaW9EaXNlYXNlS2V5LAorCQkJCQkJCW5ldyBJbnRlZ2VyKAorCQkJCQkJCQkJY29tcHV0ZUV4cGVjdGVkTnVtYmVyT2ZMYWJlbHMoZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMKKwkJCQkJCQkJCQkJLmdldCh0ZXN0U3BlYy5zY2VuYXJpb0Rpc2Vhc2VLZXkpKSkpOworCQl9IC8vIGZvciBlYWNoIHRlc3Qgc3BlY2lmaWNhdGlvbgorCisJfSAvLyBzdGF0aWMKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzLkRpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdCNnZXREaXNlYXNlTW9kZWxzVG9UZXN0KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxOb2RlRGVjb3JhdG9yPiBnZXREaXNlYXNlTW9kZWxzVG9UZXN0KCkgeworCQlmaW5hbCBMaXN0PE5vZGVEZWNvcmF0b3I+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxOb2RlRGVjb3JhdG9yPigpOworCQlyZXRWYWx1ZS5hZGQoRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbFRlc3QuY3JlYXRlRml4dHVyZSgpKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0RGlzZWFzZU1vZGVsc1RvVGVzdAorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGludCBnZXROdW1iZXJPZlN0ZXBzKGZpbmFsIFN0cmluZyBkaXNlYXNlU2NlbmFyaW9LZXkpIHsKKwkJU0lSTGFiZWxWYWx1ZVtdW11bXSB0ZW1wID0gZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMKKwkJCQkuZ2V0KGRpc2Vhc2VTY2VuYXJpb0tleSk7CisJCXJldHVybiB0ZW1wLmxlbmd0aDsKKwl9IC8vIGdldE51bWJlck9mU3RlcHMKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBpbnQgZ2V0RXhwZWN0ZWROdW1iZXJPZkxhYmVsc1RvVXBkYXRlKAorCQkJZmluYWwgU3RyaW5nIGRpc2Vhc2VTY2VuYXJpb0tleSkgeworCQlJbnRlZ2VyIHRlbXAgPSBleHBlY3RlZE51bWJlck9mTGFiZWxzVG9VcGRhdGUuZ2V0KGRpc2Vhc2VTY2VuYXJpb0tleSk7CisJCXJldHVybiB0ZW1wLmludFZhbHVlKCk7CisJfSAvLyBnZXRFeHBlY3RlZE51bWJlck9mTGFiZWxzVG9VcGRhdGUKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBMYWJlbFZhbHVlW11bXSBnZXRFeHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlKAorCQkJZmluYWwgU3RyaW5nIGRpc2Vhc2VTY2VuYXJpb0tleSwgZmluYWwgaW50IHN0ZXApIHsKKwkJZmluYWwgU0lSTGFiZWxWYWx1ZVtdW11bXSBzaXJMYWJlbFZhbHVlID0gZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMKKwkJCQkuZ2V0KGRpc2Vhc2VTY2VuYXJpb0tleSk7CisJCXJldHVybiBzaXJMYWJlbFZhbHVlW3N0ZXBdOworCX0gLy8gZ2V0RXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXREaXNlYXNlVVJJUHJlZml4KCkgeworCQlyZXR1cm4gRElTRUFTRV9VUklfUFJFRklYOworCX0gLy8gZ2V0RGlzZWFzZVVSSVByZWZpeAorfSAvLyBEZXRlcm1pbmlzdGljU0lSU2NlbmFyaW9UZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9EZXRlcm1pbmlzdGljU0lTY2VuYXJpb1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0RldGVybWluaXN0aWNTSVNjZW5hcmlvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyY2FkNWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9EZXRlcm1pbmlzdGljU0lTY2VuYXJpb1Rlc3QuamF2YQpAQCAtMCwwICsxLDQ3NyBAQAorLy8gRGV0ZXJtaW5pc3RpY1NJU2NlbmFyaW9UZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lMYWJlbFZhbHVlSW1wbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgSlVuaXQgdGVzdCBjYXNlIGZvciBhIERldGVybWluaXN0aWMgU0kgZGlzZWFzZSBtb2RlbAorICogc2NlbmFyaW8uCisgKiAKKyAqIDx1bD4KKyAqIDxsaT5TIC0gVGhlIG51bWJlciBvZiA8Y29kZT5TdXNjZXB0aWJsZTwvY29kZT4gcG9wdWxhdGlvbiBtZW1iZXJzLiBNZW1iZXJzCisgKiBlbnRlciB0aGlzIHN0YXRlIGJ5IGJlaW5nIGJvcm4gb3IgYnkgInJlY292ZXJpbmciIGZyb20gYmVpbmcKKyAqIDxjb2RlPkluZmVjdGlvdXM8L2NvZGU+LiBUaGV5IGxlYXZlIHRoaXMgc3RhdGUgZWl0aGVyIGJ5IGRlYXRoIG9yIGJ5CisgKiBlbnRlcmluZyB0aGUgPGNvZGU+SW5mZWN0aW91czwvY29kZT4gc3RhdGUuCisgKiB7QGxpbmsgU0lUZXN0I1RSQU5TTUlTU0lPTl9SQVRFfSA9IDAuMSwge0BsaW5rIFNJVGVzdCNSRUNPVkVSWV9SQVRFfSA9IDAuMQorICogCisgKiBJbml0aWFsaXplZCB0byB7QGxpbmsgRGlzZWFzZU1vZGVsVGVzdFV0aWwjVEVTVF9QT1BVTEFUSU9OX0NPVU5UfSA9IDEwMCA8L2xpPgorICogPGxpPkkgLSBUaGUgbnVtYmVyIG9mIDxjb2RlPkluZmVjdGlvdXM8L2NvZGU+IHBvcHVsYXRpb24gbWVtYmVycy4KKyAqIEluaXRpYWxpemVkIHRvIHtAbGluayBTSURpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdCNOVU1CRVJfVE9fSU5GRUNUfSA9IDEgPC9saT4KKyAqIAorICogPGxpPkIgLSBUaGUgbnVtYmVyIG9mIDxjb2RlPkJpcnRoczwvY29kZT4gb2YgbmV3IChTdXNjZXB0aWJsZSkgcG9wdWxhdGlvbgorICogbWVtYmVycy4KKyAqIAorICogCisgKiBDb21wdXRlZCBhcyBhIGZ1bmN0aW9uIG9mIHRoZSAiYmFja2dyb3VuZCBtb3J0YWxpdHkgcmF0ZSIKKyAqIHtAbGluayBEaXNlYXNlTW9kZWwjZ2V0QmFja2dyb3VuZE1vcnRhbGl0eVJhdGUoKX0uIFdlIHVzZSB0aGUgZGVhdGggcmF0ZQorICogYmVjYXVzZSB3ZSBhc3N1bWUgdGhhdCB0aGUgcG9wdWxhdGlvbiB3YXMgaW4gZXF1aWxpYnJpdW0gYmVmb3JlIHRoZSBvbnNldCBvZgorICogdGhlIGRpc2Vhc2UgKGkuZS4sIG5laXRoZXIgbmF0dXJhbGx5IGdyb3dpbmcgb3Igc2hyaW5raW5nIG11Y2ggb3ZlciB0aGUgdGltZQorICogcGVyaW9kIG9mIHRoZSBzaW11bGF0aW9uKS4gVGhlIHZhbHVlIHVzZWQgZm9yIHRoZSB0ZXN0IGlzIC4gSW5pdGlhbGl6ZWQgdG8gMC4KKyAqIDwvbGk+CisgKiAKKyAqIAorICogPGxpPkQgLSBUaGUgdG90YWwgbnVtYmVyIG9mIDxjb2RlPkRlYXRoczwvY29kZT4gb2YgYWxsIHR5cGVzIG9mIHBvcHVsYXRpb24KKyAqIG1lbWJlcnMuIEp1c3QgbGlrZSB0aGUgYmlydGhzLCB0aGlzIGlzIGNvbXB1dGVkIGFzIGEgZnVuY3Rpb24gb2YgdGhlCisgKiAiYmFja2dyb3VuZCBtb3J0YWxpdHkgcmF0ZSIge0BsaW5rIERpc2Vhc2VNb2RlbCNnZXRCYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSgpfS4KKyAqIFRoZSByYXRlIHVzZWQgZm9yIHRoZSB0ZXN0IGlzIHtAbGluayBEaXNlYXNlTW9kZWxUZXN0I01PUlRBTElUWV9SQVRFfSA9IDAuMDEuCisgKiBIb3dldmVyLCBpdCBhbHNvIGluY2x1ZGVzIHRoZSBhZGRpdGlvbmFsIGRlYXRocyBvZiA8Y29kZT5JbmZlY3Rpb3VzPC9jb2RlPgorICogcG9wdWxhdGlvbiBtZW1iZXJzIChpLmUuLCBERCBiZWxvdykgZHVlIHRvIHRoZSBkaXNlYXNlLiBJbml0aWFsaXplZCB0byAwLjwvbGk+CisgKiA8bGk+REQgLSBUaGUgdG90YWwgbnVtYmVyIG9mIDxjb2RlPkRpc2Vhc2UgRGVhdGhzPC9jb2RlPiBvZgorICogPGNvZGU+SW5mZWN0aW91czwvY29kZT4gcG9wdWxhdGlvbiBtZW1iZXJzLiBJdCBpcyBhIGZ1bmN0aW9uIG9mIHRoZSB3aGljaAorICogaXMgbm90IGEgcmF0ZSwgYnV0IHJhdGhlciB0aGUgZnJhY3Rpb24gb2YgPGNvZGU+SW5mZWN0aW91czwvY29kZT4KKyAqIHBvcHVsYXRpb24gbWVtYmVycyB0aGF0IGV2ZW50dWFsbHkgZGllIGZyb20gdGhlIGRpc2Vhc2UgKGkuZS4sIGl0J3MgdGhlCisgKiBtb3J0YWxpdHkgb2YgdGhlIGRpc2Vhc2UsIGhvdyBtYW55IHdobyBnZXQgaXQgZGllIGZyb20gaXQpLgorICoge0BsaW5rIFNJSW1wbCNjb21wdXRlSW5mZWN0aW91c01vcnRhbGl0eVJhdGUoZG91YmxlLCBkb3VibGUpfS4gSW5pdGlhbGl6ZWQKKyAqIHRvIDAuIDwvbGk+CisgKiA8L3VsPgorICogPHVsPgorICogPGxpPiZtdTsgPSB7QGxpbmsgRGlzZWFzZU1vZGVsVGVzdCNNT1JUQUxJVFlfUkFURX0gPSAwLjAxPC9saT4KKyAqIDxsaT4mYmV0YTsgPSB7QGxpbmsgU0lUZXN0I1RSQU5TTUlTU0lPTl9SQVRFfSA9IDAuMTwvbGk+CisgKiA8bGk+JnNpZ21hOyA9IHtAbGluayBTSVRlc3QjUkVDT1ZFUllfUkFURX0gPSAwLjAxPC9saT4KKyAqIDxsaT54ID0ge0BsaW5rIFNJVGVzdCNJTkZFQ1RJT1VTX01PUlRBTElUWX0gPSAwLjEgPC9saT4KKyAqIDxsaT4mbXU7PHN1Yj5pPC9zdWI+ID0ge0BsaW5rIFNJVGVzdCNJTkZFQ1RJT1VTX01PUlRBSUxZX1JBVEV9ID0gMC4xPC9saT4KKyAqIDxsaT5BcmVhPHN1Yj5sPC9zdWI+ID0gMS4wPC9saT4KKyAqIDxsaT5BcmVhID0gMS4wPC9saT4KKyAqIDxsaT5QID0gUyArIEkgPSB7QGxpbmsgRGlzZWFzZU1vZGVsVGVzdFV0aWwjVEVTVF9QT1BVTEFUSU9OX0NPVU5UfSA9IDEwMDwvbGk+CisgKiA8L3VsPgorICogPGgyPjF4MSBEZXRlcm1pbmlzdGljIFNJIFNjZW5hcmlvPC9oMj4KKyAqIDxoMz5Jbml0aWFsIFN0YXRlPC9oMz4KKyAqIDxwPgorICogUz0gOTkuMCwgSTxzdXA+Ujwvc3VwPj0xLjAsIEk8c3VwPkY8L3N1cD49MC4wLCBCPTAuMCwgRD0wLjAsIEREPTAuMAorICogPC9wPgorICogPGgzPlNJIDF4MSBTdGVwIDA8L2gzPgorICogCisgKiA8dWw+CisgKiA8bGk+PGVtPlRTRjxzdWI+bDwvc3ViPiA9ICgxL1ApKihBcmVhL0FyZWE8c3ViPmw8L3N1Yj4pPC9lbT48L2xpPgorICogPGxpPjxlbT5UU0Y8c3ViPmw8L3N1Yj4gPSAoMS8xMDApKigxLzEpPC9lbT48L2xpPgorICogPGxpPjxlbT5UU0Y8c3ViPmw8L3N1Yj4gPSAwLjAxPC9lbT48L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JmJldGE7PHN1cD4qPC9zdXA+ID0gJmJldGE7IFRTRjxzdWI+bDwvc3ViPjwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JmJldGE7PHN1cD4qPC9zdXA+ID0gMC4xICogMC4wMTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JmJldGE7PHN1cD4qPC9zdXA+ID0gMC4wMDE8L2VtPjwvbGk+CisgKiA8L3VsPgorICogPHVsPgorICogPGxpPjxlbT4mRGVsdGE7QiA9ICZtdTsgKiAoUyArIEk8c3VwPlI8L3N1cD4gKyBJPHN1cD5GPC9zdXA+KTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0IgPSAwLjAxICogKDk5KzErMCkgPC9lbT4gPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0IgPSAxLjA8L2VtPiA8L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO0REID0gJm11OzxzdWI+aTwvc3ViPiBJPHN1cD5GPC9zdXA+ICA8L2VtPiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7REQ9IDAuMSAqIDA8L2VtPiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7REQ9IDAuMDwvZW0+IDwvbGk+CisgKiA8L3VsPgorICogPHVsPgorICogPGxpPjxlbT4mRGVsdGE7RCA9ICZtdTsgUyArICgmbXU7ICsgJm11OzxzdWI+aTwvc3ViPiApSTxzdXA+Rjwvc3VwPiArICZtdTsgSTxzdXA+Ujwvc3VwPiA8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0QgPSAwLjAxICogOTkgKyAoMC4wMSArIDAuMSApIDAgKyAwLjAxICogMSA8L2VtPiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7RD0gMTwvZW0+IDwvbGk+CisgKiA8L3VsPgorICogPHVsPgorICogPGxpPjxlbT4mRGVsdGE7UyA9ICZtdTsgKFMgKyBJKSAtICZiZXRhOzxzdXA+Kjwvc3VwPiBTIEkgKyAmc2lnbWE7IEk8c3VwPlI8L3N1cD4gLSAmbXU7IFM8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtTID0gMC4wMSAoOTkrKDErMCkpIC0gMC4wMDEgKiA5OSAqICgxKzApICsgMC4wMSAqIDEgLSAwLjAxICogOTk8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtTID0gMS4wIC0gMC4wOTkgKyAwLjAxIC0gMC45OTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO1MgPSAtMC4wNzk8L2VtPjwvbGk+CisgKiA8L3VsPgorICogPHVsPgorICogPGxpPjxlbT4mRGVsdGE7STxzdXA+Ujwvc3VwPiA9ICgxLXgpJmJldGE7PHN1cD4qPC9zdXA+IFMgSSAtICZzaWdtYTsgSTxzdXA+Ujwvc3VwPiAtICZtdTsgSTxzdXA+Ujwvc3VwPjwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPlI8L3N1cD4gPSAwLjkgKiAwLjAwMSAqIDk5ICogMSAtICAwLjAxICogMSAtIDAuMDEgKiAxPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7STxzdXA+Ujwvc3VwPiA9IDAuMDg5MSAtIC4wMSAtIC4wMTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPlI8L3N1cD4gPSAwLjA2OTE8L2VtPjwvbGk+CisgKiA8L3VsPgorICogPHVsPgorICogPGxpPjxlbT4mRGVsdGE7STxzdXA+Rjwvc3VwPiA9IHgmYmV0YTs8c3VwPio8L3N1cD4gUyBJICAtICgmbXU7ICsgJm11OzxzdWI+aTwvc3ViPikgSTxzdXA+Rjwvc3VwPjwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPkY8L3N1cD4gPSAwLjEgKiAwLjAwMSAqIDk5ICogMSAgLSAoMC4wMSArIDAuMSkgKiAwPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7STxzdXA+Rjwvc3VwPiA9IC4wMDk5PC9lbT48L2xpPgorICogPC91bD4KKyAqIDxwPgorICogUz0gOTguOTIxLCBJPHN1cD5SPC9zdXA+PTEuMDY5MSwgSTxzdXA+Rjwvc3VwPj0wLjAwOTksIEI9MS4wLCBEPTEuMCwKKyAqIEREPTAuMAorICogPC9wPgorICogCisgKiA8aDM+U0kgMXgxIFN0ZXAgMTwvaDM+CisgKiA8dWw+CisgKiA8bGk+PGVtPlRTRjxzdWI+bDwvc3ViPiA9ICgxL1ApKihBcmVhL0FyZWE8c3ViPmw8L3N1Yj4pPC9lbT48L2xpPgorICogPGxpPjxlbT5UU0Y8c3ViPmw8L3N1Yj4gPSAoMS8xMDApKigxLzEpPC9lbT48L2xpPgorICogPGxpPjxlbT5UU0Y8c3ViPmw8L3N1Yj4gPSAwLjAxPC9lbT48L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JmJldGE7PHN1cD4qPC9zdXA+ID0gJmJldGE7IFRTRjxzdWI+bDwvc3ViPjwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JmJldGE7PHN1cD4qPC9zdXA+ID0gMC4xICogMC4wMTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JmJldGE7PHN1cD4qPC9zdXA+ID0gMC4wMDE8L2VtPjwvbGk+CisgKiA8L3VsPgorICogPHVsPgorICogPGxpPjxlbT4mRGVsdGE7QiA9ICZtdTsgKiAoUyArIEk8c3VwPlI8L3N1cD4gKyBJPHN1cD5GPC9zdXA+KTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0IgPSAwLjAxICogKDEwMCkgPC9lbT4gPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0IgPSAxLjA8L2VtPiA8L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO0REID0gJm11OzxzdWI+aTwvc3ViPiBJPHN1cD5GPC9zdXA+ICA8L2VtPiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7REQ9IDAuMSAqIDAuMDE8L2VtPiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7REQ9IDAuMDAxPC9lbT4gPC9saT4KKyAqIDwvdWw+CisgKiA8dWw+CisgKiA8bGk+PGVtPiZEZWx0YTtEID0gJm11OyBTICsgKCZtdTsgKyAmbXU7PHN1Yj5pPC9zdWI+IClJPHN1cD5GPC9zdXA+ICsgJm11OyBJPHN1cD5SPC9zdXA+IDwvZW0+CisgKiA8L2xpPgorICogPGxpPjxlbT4mRGVsdGE7RCA9IDAuMDEgKiA5OC45MjEgKyAoMC4wMSArIDAuMSApMC4wMDk5ICsgMC4wMSAqIDEuMDY5MSA8L2VtPgorICogPC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0Q9IDEuMDAwOTk8L2VtPiA8L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO1MgPSAmbXU7IChTICsgSSkgLSAmYmV0YTs8c3VwPio8L3N1cD4gUyBJICsgJnNpZ21hOyBJPHN1cD5SPC9zdXA+IC0gJm11OyBTPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7UyA9IDAuMDEgKiAxMDAgLSAwLjAwMSAqIDk4LjkyMSAqICgxLjA2OTErMC4wMDk5KSArIDAuMDEgKiAxLjA2OTEgLSAwLjAxICogOTguOTIxPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7UyA9IDEuMCAtIDAuMTA1OTY4NTkgKyAwLjAxMDY5MSAtIDAuOTg5MjE8L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtTID0gLTAuMDg0NDg3NTk8L2VtPjwvbGk+CisgKiA8L3VsPgorICogPHVsPgorICogPGxpPjxlbT4mRGVsdGE7STxzdXA+Ujwvc3VwPiA9ICgxLXgpJmJldGE7PHN1cD4qPC9zdXA+IFMgSSAtICZzaWdtYTsgSTxzdXA+Ujwvc3VwPiAtICZtdTsgSTxzdXA+Ujwvc3VwPjwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPlI8L3N1cD4gPSAwLjkgKiAwLjAwMSAqIDk4LjkyMSAqICgxLjA2OTErMC4wMDk5KSAtICAwLjAxICogMS4wNjkxIC0gMC4wMSAqIDEuMDY5MTwvZW0+PC9saT4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPlI8L3N1cD4gPSAwLjA5NTM3MTczMSAtIC4wMTA2OTEgLSAuMDEwNjkxPC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7STxzdXA+Ujwvc3VwPiA9IDAuMDczOTg5NzMxPC9lbT48L2xpPgorICogPC91bD4KKyAqIDx1bD4KKyAqIDxsaT48ZW0+JkRlbHRhO0k8c3VwPkY8L3N1cD4gPSB4JmJldGE7PHN1cD4qPC9zdXA+IFMgSSAgLSAoJm11OyArICZtdTs8c3ViPmk8L3N1Yj4pIEk8c3VwPkY8L3N1cD48L2VtPjwvbGk+CisgKiA8bGk+PGVtPiZEZWx0YTtJPHN1cD5GPC9zdXA+ID0gMC4xICogMC4wMDEgKiA5OC45MjEgKiAoMS4wNjkxKzAuMDA5OSkgIC0gKDAuMDEgKyAwLjEpICogMC4wMDk5PC9lbT48L2xpPgorICogPGxpPjxlbT4mRGVsdGE7STxzdXA+Rjwvc3VwPiA9IC4wMDk1MDc4NTk8L2VtPjwvbGk+CisgKiA8L3VsPgorICogPHA+CisgKiBTPSA5OC44MzY1MTI0MSwgSTxzdXA+Ujwvc3VwPj0xLjE0MzA4OTczMSwgSTxzdXA+Rjwvc3VwPj0wLjAxOTQwNzg1OSAsCisgKiBCPTIuMCwgRD0yLjAwMDk5LCBERD0wLjAwMQorICogPC9wPiA8CisgKiAKKyAqIEBzZWUgRGlzZWFzZU1vZGVsVGVzdFV0aWwjVEVTVF9QT1BVTEFUSU9OX0NPVU5UCisgKiBAc2VlIFNJRGlzZWFzZU1vZGVsU2NlbmFyaW9UZXN0I05VTUJFUl9UT19JTkZFQ1QKKyAqIEBzZWUgRGlzZWFzZU1vZGVsVGVzdFV0aWwjVEVTVF9BUkVBCisgKiBAc2VlIFNJVGVzdCNJTkZFQ1RJT1VTX01PUlRBTElUWQorICogQHNlZSBTSVRlc3QjVFJBTlNNSVNTSU9OX1JBVEUKKyAqIEBzZWUgU0lUZXN0I05PTl9MSU5FQVJJVFlfQ09FRkZJQ0lFTlQKKyAqIEBzZWUgU0lUZXN0I1JFQ09WRVJZX1JBVEUKKyAqIEBzZWUgU0lJbXBsCisgKi8KK3B1YmxpYyBjbGFzcyBEZXRlcm1pbmlzdGljU0lTY2VuYXJpb1Rlc3QgZXh0ZW5kcyBTSURpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdCB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTRUFTRV9VUklfUFJFRklYID0gIkRldGVybWluaXN0aWNTSSI7CisKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBleHBlY3RlZE51bWJlck9mTGFiZWxzVG9VcGRhdGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTSUxhYmVsVmFsdWVbXVtdW10+IGV4cGVjdGVkRGlzZWFzZU1vZGVsU3RhdGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTSUxhYmVsVmFsdWVbXVtdW10+KCk7CisKKwlzdGF0aWMgeworCisJCS8vIDF4MQorCQlleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcy5wdXQoVEVTVF9TQ0VOQVJJTzF4MV9LRVksCisJCQkJbmV3IFNJTGFiZWxWYWx1ZVtdW11bXSB7CisJCQkJLy8gU3RlcCAwCisJCQkJCQl7IHsKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoOTkuMDIsIDAuOTgsIDAuMCwgCisJCQkJCQkJCTAuMCkgfSB9LAorCisJCQkJCQkvLyBTdGVwIDEKKwkJCQkJCXsgeworCQkJCQkJLy8gTlswLDBdCisJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCg5OS4wNCwgMC45NiwKKwkJCQkJCQkJMC4wLCAwLjApIH0gfSB9IC8vIG5ldworCQkJCS8vIFNJTGFiZWxWYWx1ZQorCisJCQkJKTsgLy8gcHV0KFRFU1RfU0NFTkFSSU8xeDFfS0VZKQorCisJCS8vIDF4MgorCQlleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcy5wdXQoVEVTVF9TQ0VOQVJJTzF4Ml9LRVksCisJCQkJbmV3IFNJTGFiZWxWYWx1ZVtdW11bXSB7CisJCQkJLy8gU3RlcCAwCisJCQkJCQl7IHsKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsICAwKSwKKwkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgIDApIH0gfSwKKworCQkJCQkJLy8gU3RlcCAxCisJCQkJCQl7IHsKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsICAwKSwKKwkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgIDApIH0gfSwKKwkJCQkJCS8vIFN0ZXAgMgorCQkJCQkJeyB7CisJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAgMCksCisJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsICAwKSB9IH0gfSAvLyBuZXcKKwkJCQkvLyBTSUxhYmVsVmFsdWUKKwkJCQkpOyAvLyBwdXQoVEVTVF9TQ0VOQVJJTzF4Ml9LRVkpCisKKwkJLy8gMXgzCisJCWV4cGVjdGVkRGlzZWFzZU1vZGVsU3RhdGVzLnB1dChURVNUX1NDRU5BUklPMXgzX0tFWSwKKwkJCQluZXcgU0lMYWJlbFZhbHVlW11bXVtdIHsKKwkJCQkvLyBTdGVwIDAKKwkJCQkJCXsgeworCisJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAgMCksCisJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsICAwKSwKKwkJCQkJCQkJLy8gTlswLDJdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCkKKworCQkJCQkJfSB9LAorCisJCQkJCQkvLyBTdGVwIDEKKwkJCQkJCXsgeworCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgIDApLAorCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAgMCksCisJCQkJCQkJCS8vIE5bMCwyXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsICAwKQorCisJCQkJCQl9IH0sCisKKwkJCQkJCS8vIFN0ZXAgMgorCQkJCQkJeyB7CisJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAgMCksCisJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsICAwKSwKKwkJCQkJCQkJLy8gTlswLDJdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgIDApCisKKwkJCQkJCX0gfSB9IC8vIG5ldyBTSUxhYmVsVmFsdWUKKworCQkJCSk7IC8vIHB1dChURVNUX1NDRU5BUklPMXgzX0tFWSkKKworCQkvLyAyeDIKKwkJZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMucHV0KFRFU1RfU0NFTkFSSU8yeDJfS0VZLAorCQkJCW5ldyBTSUxhYmVsVmFsdWVbXVtdW10geworCQkJCS8vIFN0ZXAgMAorCQkJCQkJeyB7CisKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsICAwKSwKKwkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgIDApCisKKwkJCQkJCX0sIHsKKworCQkJCQkJLy8gTlsxLDBdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgIDApLAorCQkJCQkJCQkvLyBOWzEsMV0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAgMCkKKworCQkJCQkJfSB9LAorCisJCQkJCQkvLyBTdGVwIDEKKwkJCQkJCXsgeworCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgIDApLAorCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAgMCkKKworCQkJCQkJfSwgeworCisJCQkJCQkvLyBOWzEsMF0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAgMCksCisJCQkJCQkJCS8vIE5bMSwxXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsICAwKQorCisJCQkJCQl9IH0sCisKKwkJCQkJCS8vIFN0ZXAgMgorCQkJCQkJeyB7CisJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAgMCksCisJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsICAwKQorCisJCQkJCQl9LCB7CisKKwkJCQkJCS8vIE5bMSwwXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsICAwKSwKKwkJCQkJCQkJLy8gTlsxLDFdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgIDApCisKKwkJCQkJCX0gfSB9IC8vIG5ldyBTSUxhYmVsVmFsdWUKKworCQkJCSk7IC8vIHB1dChURVNUX1NDRU5BUklPMngyX0tFWSkKKworCQkvLyAzeDMKKwkJZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMucHV0KFRFU1RfU0NFTkFSSU8zeDNfS0VZLAorCQkJCW5ldyBTSUxhYmVsVmFsdWVbXVtdW10geworCQkJCS8vIFN0ZXAgMAorCQkJCQkJeyB7CisKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDJdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCkKKworCQkJCQkJfSwgeworCisJCQkJCQkvLyBOWzEsMF0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsxLDFdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgIDApLAorCQkJCQkJCQkvLyBOWzEsMl0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKQorCisJCQkJCQl9LCB7CisKKwkJCQkJCS8vIE5bMiwwXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzIsMV0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsyLDJdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCkKKworCQkJCQkJfSB9LAorCisJCQkJCQkvLyBTdGVwIDEKKwkJCQkJCXsgeworCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzAsMl0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKQorCisJCQkJCQl9LCB7CisKKwkJCQkJCS8vIE5bMSwwXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzEsMV0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsxLDJdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCkKKworCQkJCQkJfSwgeworCisJCQkJCQkvLyBOWzIsMF0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsyLDFdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMiwyXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApCisKKwkJCQkJCX0gfSwKKworCQkJCQkJLy8gU3RlcCAyCisJCQkJCQl7IHsKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDJdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwwKQorCisJCQkJCQl9LCB7CisKKwkJCQkJCS8vIE5bMSwwXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzEsMV0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsxLDJdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCkKKworCQkJCQkJfSwgeworCisJCQkJCQkvLyBOWzIsMF0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsyLDFdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMiwyXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApCisKKwkJCQkJCX0gfSB9IC8vIG5ldyBTSUxhYmVsVmFsdWUKKworCQkJCSk7IC8vIHB1dChURVNUX1NDRU5BUklPM3gzX0tFWSkKKworCQkvLyBGaWxsIG91dCB0aGUgbWFwIHRoYXQgc3BlY2lmaWVzIGhvdyBtYW55IGxhYmVscyBzaG91bGQgYmUgdXBkYXRlZCBieQorCQkvLyBhIGRpc2Vhc2UgbW9kZWwgZm9yIGVhY2ggdGVzdC4KKwkJZm9yIChUZXN0U3BlYyB0ZXN0U3BlYyA6IHRlc3RTcGVjaWZpY2F0aW9ucykgeworCQkJZXhwZWN0ZWROdW1iZXJPZkxhYmVsc1RvVXBkYXRlCisJCQkJCS5wdXQoCisJCQkJCQkJdGVzdFNwZWMuc2NlbmFyaW9EaXNlYXNlS2V5LAorCQkJCQkJCW5ldyBJbnRlZ2VyKAorCQkJCQkJCQkJY29tcHV0ZUV4cGVjdGVkTnVtYmVyT2ZMYWJlbHMoZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMKKwkJCQkJCQkJCQkJLmdldCh0ZXN0U3BlYy5zY2VuYXJpb0Rpc2Vhc2VLZXkpKSkpOworCQl9IC8vIGZvciBlYWNoIHRlc3Qgc3BlY2lmaWNhdGlvbgorCisJfSAvLyBzdGF0aWMKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzLkRpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdCNnZXREaXNlYXNlTW9kZWxzVG9UZXN0KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxOb2RlRGVjb3JhdG9yPiBnZXREaXNlYXNlTW9kZWxzVG9UZXN0KCkgeworCQlmaW5hbCBMaXN0PE5vZGVEZWNvcmF0b3I+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxOb2RlRGVjb3JhdG9yPigpOworCQlyZXRWYWx1ZS5hZGQoRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsVGVzdC5jcmVhdGVGaXh0dXJlKCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXREaXNlYXNlTW9kZWxzVG9UZXN0CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgaW50IGdldE51bWJlck9mU3RlcHMoZmluYWwgU3RyaW5nIGRpc2Vhc2VTY2VuYXJpb0tleSkgeworCQlTSUxhYmVsVmFsdWVbXVtdW10gdGVtcCA9IGV4cGVjdGVkRGlzZWFzZU1vZGVsU3RhdGVzCisJCQkJLmdldChkaXNlYXNlU2NlbmFyaW9LZXkpOworCQlyZXR1cm4gdGVtcC5sZW5ndGg7CisJfSAvLyBnZXROdW1iZXJPZlN0ZXBzCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgaW50IGdldEV4cGVjdGVkTnVtYmVyT2ZMYWJlbHNUb1VwZGF0ZSgKKwkJCWZpbmFsIFN0cmluZyBkaXNlYXNlU2NlbmFyaW9LZXkpIHsKKwkJSW50ZWdlciB0ZW1wID0gZXhwZWN0ZWROdW1iZXJPZkxhYmVsc1RvVXBkYXRlLmdldChkaXNlYXNlU2NlbmFyaW9LZXkpOworCQlyZXR1cm4gdGVtcC5pbnRWYWx1ZSgpOworCX0gLy8gZ2V0RXhwZWN0ZWROdW1iZXJPZkxhYmVsc1RvVXBkYXRlCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTGFiZWxWYWx1ZVtdW10gZ2V0RXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZSgKKwkJCWZpbmFsIFN0cmluZyBkaXNlYXNlU2NlbmFyaW9LZXksIGZpbmFsIGludCBzdGVwKSB7CisJCWZpbmFsIFNJTGFiZWxWYWx1ZVtdW11bXSBzaUxhYmVsVmFsdWUgPSBleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcworCQkJCS5nZXQoZGlzZWFzZVNjZW5hcmlvS2V5KTsKKwkJcmV0dXJuIHNpTGFiZWxWYWx1ZVtzdGVwXTsKKwl9IC8vIGdldEV4cGVjdGVkRGlzZWFzZU1vZGVsU3RhdGUKKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzZWFzZVVSSVByZWZpeCgpIHsKKwkJcmV0dXJuIERJU0VBU0VfVVJJX1BSRUZJWDsKKwl9IC8vIGdldERpc2Vhc2VVUklQcmVmaXgKK30gLy8gRGV0ZXJtaW5pc3RpY1NJU2NlbmFyaW9UZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9EaXNlYXNlTW9kZWxMYWJlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0Rpc2Vhc2VNb2RlbExhYmVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NDUxZjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9EaXNlYXNlTW9kZWxMYWJlbFRlc3QuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuUG9wdWxhdGlvbkxhYmVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLlJlZ2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNlYXNlIE1vZGVsIExhYmVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlzZWFzZU1vZGVsTGFiZWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIERpc2Vhc2UgTW9kZWwgTGFiZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEaXNlYXNlTW9kZWxMYWJlbCBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgRGlzZWFzZSBNb2RlbCBMYWJlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEaXNlYXNlIE1vZGVsIExhYmVsIHRlc3QgY2FzZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShEaXNlYXNlTW9kZWxMYWJlbCBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEaXNlYXNlIE1vZGVsIExhYmVsIHRlc3QgY2FzZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXByaXZhdGUgRGlzZWFzZU1vZGVsTGFiZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsI2dldEN1cnJlbnREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCkgPGVtPkN1cnJlbnQgRGlzZWFzZSBNb2RlbCBMYWJlbCBWYWx1ZTwvZW0+fScgZmVhdHVyZSBnZXR0ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbCNnZXRDdXJyZW50RGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VycmVudERpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKSB7CisJCWFzc2VydFRydWUodHJ1ZSk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsI2dldE5leHREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCkgPGVtPk5leHQgRGlzZWFzZSBNb2RlbCBMYWJlbCBWYWx1ZTwvZW0+fScgZmVhdHVyZSBnZXR0ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbCNnZXROZXh0RGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TmV4dERpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKSB7CisJCWFzc2VydFRydWUodHJ1ZSk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxhYmVsUmVnaW9uKGZpbmFsIERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VMYWJlbCwKKwkJCWZpbmFsIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllciwgZmluYWwgUmVnaW9uIHJlZ2lvbikgeworCQlkaXNlYXNlTGFiZWwuc2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZChyZWdpb24uZ2V0VVJJKCkpOworCQlmaW5hbCBQb3B1bGF0aW9uTGFiZWwgcG9wdWxhdGlvbkxhYmVsID0gUG9wdWxhdGlvbkxhYmVsSW1wbAorCQkJCS5nZXRQb3B1bGF0aW9uTGFiZWwocG9wdWxhdGlvbklkZW50aWZpZXIsIHJlZ2lvbik7CisJCWRpc2Vhc2VMYWJlbC5zZXRQb3B1bGF0aW9uTGFiZWwocG9wdWxhdGlvbkxhYmVsKTsKKwkJcmVnaW9uLmdldExhYmVscygpLmFkZChkaXNlYXNlTGFiZWwpOworCX0gLy8gbGFiZWxSZWdpb24KKworfSAvLyBEaXNlYXNlTW9kZWxMYWJlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0Rpc2Vhc2VNb2RlbExhYmVsVmFsdWVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMjllYTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9EaXNlYXNlTW9kZWxMYWJlbFZhbHVlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQ0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2Vhc2UgTW9kZWwgTGFiZWwgVmFsdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHRlc3RlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSNnZXRQb3B1bGF0aW9uQ291bnQoKSA8ZW0+UG9wdWxhdGlvbiBDb3VudDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgYXJlIHRlc3RlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSNzZXQob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUpIDxlbT5TZXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlI2FkZChvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSkgPGVtPkFkZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUjc3ViKG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlKSA8ZW0+U3ViPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSNzY2FsZShkb3VibGUpIDxlbT5TY2FsZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUjemVyb091dFBvcHVsYXRpb25Db3VudCgpIDxlbT5aZXJvIE91dCBQb3B1bGF0aW9uIENvdW50PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFRFU1RfQklSVEhTID0gNzsKKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFRFTVBfVEVTVF9CSVJUSFMgPSBURVNUX0JJUlRIUyArIDcwOworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgVEVTVF9ERUFUSFMgPSA5OworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgVEVNUF9URVNUX0RFQVRIUyA9IFRFU1RfREVBVEhTICsgOTA7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBURVNUX0RJU0VBU0VfREVBVEhTID0gODsKKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFRFTVBfVEVTVF9ESVNFQVNFX0RFQVRIUyA9IFRFU1RfRElTRUFTRV9ERUFUSFMgKyA4MDsKKworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIERpc2Vhc2UgTW9kZWwgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIFRoaXMgZml4dHVyZSBpcyBjaGFuZ2VkIGR1cmluZyB0ZXN0cworCSAqLworCXByb3RlY3RlZCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHRlbXBGaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgRGlzZWFzZSBNb2RlbCBMYWJlbCBWYWx1ZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIERpc2Vhc2UgTW9kZWwgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRGlzZWFzZSBNb2RlbCBMYWJlbCBWYWx1ZSB0ZXN0IGNhc2UuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0VGVtcEZpeHR1cmUoRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSB0ZW1wRml4dHVyZSkgeworCQl0aGlzLnRlbXBGaXh0dXJlID0gdGVtcEZpeHR1cmU7CisJfSAvLyBzZXRUZW1wRml4dHVyZQorCisJLyoqCisJICogQHJldHVybiBhIGZpeHR1cmUKKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBjcmVhdGVUZW1wRml4dHVyZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEaXNlYXNlIE1vZGVsIExhYmVsIFZhbHVlIHRlc3QgY2FzZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHRoYXQgY2FuIGJlIGNoYW5nZWQKKwkgKi8KKwlwcml2YXRlIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZ2V0VGVtcEZpeHR1cmUoKSB7CisJCXJldHVybiB0ZW1wRml4dHVyZTsKKwl9IC8vIGdldFRlbXBGaXh0dXJlCisKKwkvKioKKwkgKiBUZXN0IHRoZSBzYW5pdHkgb2YgdGhlIHRlc3QgZml4dHVyZXMuCisJICovCisJcHVibGljIHZvaWQgdGVzdFNhbml0eSgpIHsKKwkJZmluYWwgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBsYWJlbFZhbHVlID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGxhYmVsVmFsdWVUZW1wID0gZ2V0VGVtcEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShsYWJlbFZhbHVlLnNhbmUoKSk7CisJCWFzc2VydFRydWUobGFiZWxWYWx1ZVRlbXAuc2FuZSgpKTsKKwl9IC8vIHRlc3RTYW5pdHkKKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlI2dldFBvcHVsYXRpb25Db3VudCgpIDxlbT5Qb3B1bGF0aW9uIENvdW50PC9lbT59JworCSAqIGZlYXR1cmUgZ2V0dGVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlI2dldFBvcHVsYXRpb25Db3VudCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0UG9wdWxhdGlvbkNvdW50KCkgeworCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoZml4dHVyZS5nZXRQb3B1bGF0aW9uQ291bnQoKSA9PSBnZXRFeHBlY3RlZFBvcHVsYXRpb25Db3VudChmaXh0dXJlKSk7CisJfSAvLyB0ZXN0R2V0UG9wdWxhdGlvbkNvdW50CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSNzZXQob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUpIDxlbT5TZXQ8L2VtPn0nCisJICogb3BlcmF0aW9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlI3NldChvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTZXRfX0Rpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKSB7CisJCWZpbmFsIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSB0ZW1wID0gZ2V0VGVtcEZpeHR1cmUoKTsKKworCQlhc3NlcnRGYWxzZShFY29yZVV0aWwuZXF1YWxzKGZpeHR1cmUsIHRlbXApKTsKKwkJdGVtcC5zZXQoKEludGVncmF0aW9uTGFiZWxWYWx1ZSlmaXh0dXJlKTsKKwkJYXNzZXJ0VHJ1ZShFY29yZVV0aWwuZXF1YWxzKGZpeHR1cmUsIHRlbXApKTsKKwl9IC8vIHRlc3RTZXRfX0Rpc2Vhc2VNb2RlbExhYmVsVmFsdWUKKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlI2FkZChvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSkgPGVtPkFkZDwvZW0+fScKKwkgKiBvcGVyYXRpb24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUjYWRkKG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEFkZF9fRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpIHsKKwkJZmluYWwgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHRlbXAgPSBnZXRUZW1wRml4dHVyZSgpOworCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGV4cGVjdGVkUmVzdWx0ID0gZ2V0RXhwZWN0ZWRGaXh0dXJlQWRkaXRpb25SZXN1bHQoCisJCQkJZml4dHVyZSwgdGVtcCk7CisJCWFzc2VydEZhbHNlKEVjb3JlVXRpbC5lcXVhbHMoZml4dHVyZSwgdGVtcCkpOworCQl0ZW1wLmFkZCgoSW50ZWdyYXRpb25MYWJlbFZhbHVlKWZpeHR1cmUpOworCQkvLyBEaXNlYXNlIGRlYXRocyBhcmUgbm90IGFkZGl0aXZlLiBGaXgKKwkJdGVtcC5zZXREaXNlYXNlRGVhdGhzKGV4cGVjdGVkUmVzdWx0LmdldERpc2Vhc2VEZWF0aHMoKSk7CisJCWFzc2VydFRydWUoRWNvcmVVdGlsLmVxdWFscyh0ZW1wLCBleHBlY3RlZFJlc3VsdCkpOworCX0gLy8gdGVzdEFkZF9fRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUjc3ViKG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlKSA8ZW0+U3ViPC9lbT59JworCSAqIG9wZXJhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSNzdWIob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U3ViX19EaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCkgeworCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCWZpbmFsIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgdGVtcCA9IGdldFRlbXBGaXh0dXJlKCk7CisJCWZpbmFsIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZXhwZWN0ZWRSZXN1bHQgPSBnZXRFeHBlY3RlZEZpeHR1cmVTdWJ0cmFjdGlvblJlc3VsdCgKKwkJCQl0ZW1wLCBmaXh0dXJlKTsKKwkJYXNzZXJ0RmFsc2UoRWNvcmVVdGlsLmVxdWFscyhmaXh0dXJlLCB0ZW1wKSk7CisJCXRlbXAuc3ViKChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpZml4dHVyZSk7CisJCS8vIERpc2Vhc2UgZGVhdGhzIGFyZSBub3Qgc3Vic3RyYWN0ZWQuIEZpeAorCQl0ZW1wLnNldERpc2Vhc2VEZWF0aHMoZXhwZWN0ZWRSZXN1bHQuZ2V0RGlzZWFzZURlYXRocygpKTsKKwkJYXNzZXJ0VHJ1ZShFY29yZVV0aWwuZXF1YWxzKHRlbXAsIGV4cGVjdGVkUmVzdWx0KSk7CisJfSAvLyB0ZXN0U3ViX19EaXNlYXNlTW9kZWxMYWJlbFZhbHVlCisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSNzY2FsZShkb3VibGUpIDxlbT5TY2FsZTwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSNzY2FsZShkb3VibGUpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2NhbGVfX2RvdWJsZSgpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgb3BlcmF0aW9uIHRlc3QgbWV0aG9kCisJCWFzc2VydFRydWUodHJ1ZSk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWUjemVyb091dFBvcHVsYXRpb25Db3VudCgpIDxlbT5aZXJvIE91dCBQb3B1bGF0aW9uIENvdW50PC9lbT59JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlI3plcm9PdXRQb3B1bGF0aW9uQ291bnQoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdFplcm9PdXRQb3B1bGF0aW9uQ291bnQoKSB7CisJCWZpbmFsIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShmaXh0dXJlLmdldFBvcHVsYXRpb25Db3VudCgpID4gMCk7CisJCWZpeHR1cmUuemVyb091dFBvcHVsYXRpb25Db3VudCgpOworCQlhc3NlcnRUcnVlKGZpeHR1cmUuZ2V0UG9wdWxhdGlvbkNvdW50KCk9PSAwKTsKKwl9IC8vIHRlc3RaZXJvT3V0UG9wdWxhdGlvbkNvdW50CisJCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBleHBlY3RlZCBwb3B1bGF0aW9uIGNvdW50IGZvciB0aGUgZGlzZWFzZSBtb2RlbCBsYWJlbCB2YWx1ZQorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBkb3VibGUgZ2V0RXhwZWN0ZWRQb3B1bGF0aW9uQ291bnQoCisJCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGZpeHR1cmUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgZXhwZWN0ZWQgcmVzdWx0IG9mIGFkZGluZyBmaXh0dXJlMSBhbmQgZml4dHVyZTIKKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBnZXRFeHBlY3RlZEZpeHR1cmVBZGRpdGlvblJlc3VsdCgKKwkJCWZpbmFsIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZml4dHVyZTEsCisJCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGZpeHR1cmUyKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGV4cGVjdGVkIHJlc3VsdCBvZiBzdWJ0cmFjdGluZyBmaXh0dXJlMiBmcm9tIGZpeHR1cmUxCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZ2V0RXhwZWN0ZWRGaXh0dXJlU3VidHJhY3Rpb25SZXN1bHQoCisJCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGZpeHR1cmUxLAorCQkJZmluYWwgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBmaXh0dXJlMik7CisKK30gLy8gRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0Rpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvRGlzZWFzZU1vZGVsU2NlbmFyaW9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYzODk0YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0Rpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDAyIEBACisvLyBEaXNlYXNlTW9kZWxTY2VuYXJpb1Rlc3QuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLnRlc3RzLlNjZW5hcmlvVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLlJlZ2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRoZSB0b3AtbGV2ZWwgY2xhc3MgZm9yIGFsbCB0ZXN0IG9mIGRpc2Vhc2UgbW9kZWxzIGluIGEKKyAqIHBhcnRpY3VsYXIgc2NlbmFyaW8uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaXNlYXNlTW9kZWxTY2VuYXJpb1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RPUlkgPSAidGVtcCI7CisKKwkvKioKKwkgKiBUaGUga2V5IGZvciBzY2VuYXJpbyAxeDEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NDRU5BUklPMXgxX0tFWSA9ICIxeDEiOworCisJLyoqCisJICogVGhlIGtleSBmb3Igc2NlbmFyaW8gMXgyCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TQ0VOQVJJTzF4Ml9LRVkgPSAiMXgyIjsKKworCS8qKgorCSAqIFRoZSBrZXkgZm9yIHNjZW5hcmlvIDF4MworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU0NFTkFSSU8xeDNfS0VZID0gIjF4MyI7CisKKwkvKioKKwkgKiBUaGUga2V5IGZvciBzY2VuYXJpbyAyeDIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NDRU5BUklPMngyX0tFWSA9ICIyeDIiOworCisJLyoqCisJICogVGhlIGtleSBmb3Igc2NlbmFyaW8gM3gzCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TQ0VOQVJJTzN4M19LRVkgPSAiM3gzIjsKKworCS8vIFRPRE8gaW1wbGVtZW50IHRoZSBkaXNlYXNlIG1vZGVsIHRlc3Qgc2NlbmFyaW9zCisKKwkvLyBZb3UgbmVlZCB0byB1bi1jb21tZW50IHRoZSB0ZXN0U3BlY2lmaWNhdGlvbnMgYW5kIHRoZW4gaW4gZWFjaCBvZiB0aGUKKwkvLyB0ZXN0IGltcGxlbWVudGF0aW9ucyB5b3UncmUgZ29pbmcgdG8gbmVlZCB0byBmaWd1cmUgb3V0IHRoZSB2YWxpZCBkaXNlYXNlCisJLy8gbW9kZWwgbGFiZWwgdmFsdWVzLiBzZWUgU3RvY2hhc3RpY1NFSVJTY2VuYXJpb1Rlc3QuamF2YSBldGMuCisJcHJvdGVjdGVkIHN0YXRpYyBUZXN0U3BlY1tdIHRlc3RTcGVjaWZpY2F0aW9ucyA9IG5ldyBUZXN0U3BlY1tdIHsgbmV3IFRlc3RTcGVjKAorCQkJMSwgMSwgVEVTVF9TQ0VOQVJJTzF4MV9LRVkpCisJLyoKKwkgKiBuZXcgVGVzdFNwZWMoMSwgMSwgVEVTVF9TQ0VOQVJJTzF4MV9LRVkpLCBuZXcgVGVzdFNwZWMoMSwgMiwKKwkgKiBURVNUX1NDRU5BUklPMXgyX0tFWSksIG5ldyBUZXN0U3BlYygxLCAzLCBURVNUX1NDRU5BUklPMXgzX0tFWSksIG5ldworCSAqIFRlc3RTcGVjKDIsIDIsIFRFU1RfU0NFTkFSSU8yeDJfS0VZKSwgbmV3IFRlc3RTcGVjKDMsIDMsCisJICogVEVTVF9TQ0VOQVJJTzN4M19LRVkpCisJICovCisJfTsKKworCS8qKgorCSAqIEBwYXJhbSBleHBlY3RlZExhYmVsVmFsdWVzCisJICogICAgICAgICAgICB0aGUgZXhwZWN0ZWQgbGFiZWwgdmFsdWVzIGZvciB0aGUgdGVzdAorCSAqIEByZXR1cm4gaG93IG1hbnkgbGFiZWxzIGFyZSBleHBlY3RlZCB0byBiZSB1cGRhdGVkIGJ5IGEgZGlzZWFzZSBtb2RlbCBmb3IKKwkgKiAgICAgICAgIGVhY2ggdGVzdC4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGludCBjb21wdXRlRXhwZWN0ZWROdW1iZXJPZkxhYmVscygKKwkJCWZpbmFsIExhYmVsVmFsdWVbXVtdW10gZXhwZWN0ZWRMYWJlbFZhbHVlcykgeworCQlyZXR1cm4gZXhwZWN0ZWRMYWJlbFZhbHVlc1swXS5sZW5ndGggKiBleHBlY3RlZExhYmVsVmFsdWVzWzBdWzBdLmxlbmd0aDsKKwl9IC8vIGNvbXB1dGVFeHBlY3RlZE51bWJlck9mTGFiZWxzCisKKwkvKioKKwkgKiBAcGFyYW0gbnVtUm93cworCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBsYXR0aWNlCisJICogQHBhcmFtIG51bUNvbHVtbnMKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgbGF0dGljZQorCSAqIEByZXR1cm4gYSBzY2VuYXJpbyB3aXRoIG5vZGVzIGluIGEgbGF0dGljZSB3aXRoIGEgZGlzZWFzZSBtb2RlbC4KKwkgKi8KKwlwdWJsaWMgU2NlbmFyaW8gY3JlYXRlRml4dHVyZShmaW5hbCBpbnQgbnVtUm93cywgZmluYWwgaW50IG51bUNvbHVtbnMpIHsKKwkJZmluYWwgQ29sbGVjdGlvbjxOb2RlRGVjb3JhdG9yPiBESVNFQVNFX01PREVMUyA9IG5ldyBBcnJheUxpc3Q8Tm9kZURlY29yYXRvcj4oKTsKKwkJRElTRUFTRV9NT0RFTFMuYWRkQWxsKGdldERpc2Vhc2VNb2RlbHNUb1Rlc3QoKSk7CisKKwkJZmluYWwgTW9kZWwgbW9kZWwgPSBEaXNlYXNlTW9kZWxUZXN0VXRpbC5jcmVhdGVMYXR0aWNlTW9kZWwoCisJCQkJRElTRUFTRV9NT0RFTFMsIG51bVJvd3MsIG51bUNvbHVtbnMsCisJCQkJRGlzZWFzZU1vZGVsVGVzdFV0aWwuVEVTVF9QT1BVTEFUSU9OX0NPVU5ULAorCQkJCURpc2Vhc2VNb2RlbFRlc3RVdGlsLlRFU1RfQVJFQSk7CisKKwkJZmluYWwgU2NlbmFyaW8gcmV0VmFsdWUgPSBEaXNlYXNlTW9kZWxUZXN0VXRpbC5jcmVhdGVMYXR0aWNlU2NlbmFyaW8oCisJCQkJZ2V0U2NlbmFyaW9EZWNvcmF0b3JzKG1vZGVsKSwgbW9kZWwpOworCisJCWFzc2VydCByZXRWYWx1ZS5zYW5lKCk7CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJLyoqCisJICogRXhlY3V0ZSBhbGwgb2YgdGhlIHRlc3RzIHNwZWNpZmllZCBpbiB0ZXN0U3BlY2lmaWNhdGlvbnMKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0RG9BbGxUZXN0cygpIHsKKwkJZm9yIChmaW5hbCBUZXN0U3BlYyB0ZXN0U3BlYyA6IHRlc3RTcGVjaWZpY2F0aW9ucykgeworCQkJZG9UZXN0KHRlc3RTcGVjKTsKKwkJfQorCX0gLy8gdGVzdERvQWxsVGVzdHMKKworCS8qKgorCSAqIFRlc3Qgc2VyaWFsaXppbmcgYW5kIGRlLXNlcmlhbGl6aW5nIHNjZW5hcmlvcworCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVEZXNlcmlhbGl6ZVNjZW5hcmlvKCkgeworCisJCWZpbmFsIGludFtdW10gcm93Q29sdW1ucyA9IG5ldyBpbnRbXVtdIHsgeyAxLCAxIH0sIHsgMSwgMiB9LCB7IDMsIDMgfSB9OworCisJCWZvciAoZmluYWwgaW50W10gcm93Q29sdW1uIDogcm93Q29sdW1ucykgeworCQkJZmluYWwgU2NlbmFyaW8gZml4dHVyZSA9IGNyZWF0ZUZpeHR1cmUocm93Q29sdW1uWzBdLCByb3dDb2x1bW5bMV0pOworCisJCQlmaW5hbCBVUkkgdXJpID0gY3JlYXRlU2VyaWFsaXphdGlvblVSSShmaXh0dXJlKTsKKwkJCVNjZW5hcmlvVGVzdC5zZXJpYWxpemVEZXNlcmlhbGl6ZVNjZW5hcmlvKGZpeHR1cmUsIHVyaSk7CisJCX0KKwl9IC8vIHRlc3RTZXJpYWxpemVEZXNlcmlhbGl6ZVNjZW5hcmlvCisKKwkvKioKKwkgKiBAcGFyYW0gdGVzdFNwZWMKKwkgKiAgICAgICAgICAgIGEgdGVzdCBzcGVjaWZpY2F0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIGRvVGVzdChmaW5hbCBUZXN0U3BlYyB0ZXN0U3BlYykgeworCQlkb1Rlc3QoY3JlYXRlRml4dHVyZSh0ZXN0U3BlYy5udW1Sb3dzLCB0ZXN0U3BlYy5udW1Db2x1bW5zKSwKKwkJCQl0ZXN0U3BlYy5zY2VuYXJpb0Rpc2Vhc2VLZXkpOworCX0gLy8gZG9UZXN0CisKKwkvKioKKwkgKiBAcGFyYW0gc2NlbmFyaW8KKwkgKiAgICAgICAgICAgIHRoZSBzY2VuYXJpbyB0byB0ZXN0CisJICogQHBhcmFtIHNjZW5hcmlvRGlzZWFzZUtleQorCSAqICAgICAgICAgICAgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBzY2VuYXJpbyB0ZXN0CisJICovCisJcHJpdmF0ZSB2b2lkIGRvVGVzdChmaW5hbCBTY2VuYXJpbyBzY2VuYXJpbywgZmluYWwgU3RyaW5nIHNjZW5hcmlvRGlzZWFzZUtleSkgeworCisJCWZpbmFsIGludCBudW1TdGVwcyA9IGdldE51bWJlck9mU3RlcHMoc2NlbmFyaW9EaXNlYXNlS2V5KTsKKworCQkvLyBTdGVwIHRocm91Z2ggdGhlIGRpc2Vhc2UgY29tcHV0YXRpb24gYnkgdXNpbmcgdGhlIGFjdHVhbCBzY2VuYXJpbworCQkvLyBzdGVwIG1ldGhvZAorCQlmb3IgKGludCBzdGVwID0gMDsgc3RlcCA8IG51bVN0ZXBzOyBzdGVwKyspIHsKKwkJCS8vIE1ha2Ugb25lIHN0ZXAuLi4KKwkJCXNjZW5hcmlvLnN0ZXAoKTsKKwkJCS8vIC4uLiBhbmQgbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgbG9va3Mgb2sKKwkJCWFzc2VydFRydWUoc2NlbmFyaW8uc2FuZSgpKTsKKworCQkJLy8gTm93IHZhbGlkYXRlIHRoZSBjb21wdXRlZCB2YWx1ZXMgZm9yIGVhY2ggZGlzZWFzZSBtb2RlbCBpbiB0aGUKKwkJCS8vIHNjZW5hcmlvLi4uCisJCQlmb3IgKGZpbmFsIERpc2Vhc2VNb2RlbCBkaXNlYXNlTW9kZWwgOiBnZXREaXNlYXNlTW9kZWxzKHNjZW5hcmlvKSkgeworCQkJCS8vIFJlYWxseSBvbmx5IG5lZWQgdG8gY2hlY2sgdGhpcyBvbmNlLi4uCisJCQkJaWYgKHN0ZXAgPT0gMCkgeworCQkJCQlhc3NlcnRUcnVlKAorCQkJCQkJCSJEaXNlYXNlIG1vZGVsIFwiIgorCQkJCQkJCQkJKyBkaXNlYXNlTW9kZWwuZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCkKKwkJCQkJCQkJCSsgIlwiIFwiIgorCQkJCQkJCQkJKyBzY2VuYXJpby5nZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKQorCQkJCQkJCQkJKyAiXCIgXCIiICsgc2NlbmFyaW9EaXNlYXNlS2V5LAorCQkJCQkJCWRpc2Vhc2VNb2RlbC5nZXRMYWJlbHNUb1VwZGF0ZSgpLnNpemUoKSA9PSBnZXRFeHBlY3RlZE51bWJlck9mTGFiZWxzVG9VcGRhdGUoc2NlbmFyaW9EaXNlYXNlS2V5KSk7CisJCQkJfSAvLyBpZgorCisJCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0ZURpc2Vhc2VNb2RlbFN0YXRlKHNjZW5hcmlvLAorCQkJCQkJc2NlbmFyaW9EaXNlYXNlS2V5LCBzdGVwLCBkaXNlYXNlTW9kZWwsCisJCQkJCQlnZXRFeHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlKHNjZW5hcmlvRGlzZWFzZUtleSwgc3RlcCkpKTsKKworCQkJfSAvLyBmb3IgZWFjaCBkaXNlYXNlIG1vZGVsCisJCX0gLy8gZm9yIGVhY2ggc3RlcAorCisJfSAvLyBkb1Rlc3QKKworCS8qKgorCSAqIEBwYXJhbSBzY2VuYXJpbworCSAqICAgICAgICAgICAgdGhlIHNjZW5hcmlvIHdob3NlIHN0YXRlIGlzIHRvIGJlIHZlcmlmaWVkCisJICogQHBhcmFtIHNjZW5hcmlvRGlzZWFzZUtleQorCSAqICAgICAgICAgICAgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBzY2VuYXJpbyB0ZXN0CisJICogQHBhcmFtIHN0ZXAKKwkgKiAgICAgICAgICAgIHRoZSBzdGVwIG51bWJlciBpbiB0aGUgdGVzdCBiZWluZyB2ZXJpZmllZAorCSAqIEBwYXJhbSBleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlCisJICogICAgICAgICAgICB0aGUgZGlzZWFzZSBtb2RlbCBsYWJlbCB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgcHJlc2VudAorCSAqLworCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZURpc2Vhc2VNb2RlbFN0YXRlKGZpbmFsIFNjZW5hcmlvIHNjZW5hcmlvLAorCQkJZmluYWwgU3RyaW5nIHNjZW5hcmlvRGlzZWFzZUtleSwgZmluYWwgaW50IHN0ZXAsCisJCQlmaW5hbCBEaXNlYXNlTW9kZWwgZGlzZWFzZU1vZGVsLAorCQkJZmluYWwgTGFiZWxWYWx1ZVtdW10gZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZSkgeworCQlmaW5hbCBib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKKworCQlmaW5hbCBHcmFwaCBjYW5vbmljYWxHcmFwaCA9IHNjZW5hcmlvLmdldENhbm9uaWNhbEdyYXBoKCk7CisKKwkJZm9yIChpbnQgcm93ID0gMDsgcm93IDwgZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZS5sZW5ndGg7IHJvdysrKSB7CisJCQlmb3IgKGludCBjb2x1bW4gPSAwOyBjb2x1bW4gPCBleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlW3Jvd10ubGVuZ3RoOyBjb2x1bW4rKykgeworCQkJCWZpbmFsIFJlZ2lvbiByZWdpb24gPSBEaXNlYXNlTW9kZWxUZXN0VXRpbC5nZXRSZWdpb24oCisJCQkJCQljYW5vbmljYWxHcmFwaCwgcm93LCBjb2x1bW4pOworCQkJCWZpbmFsIExhYmVsVmFsdWUgbGFiZWxWYWx1ZSA9IGV4cGVjdGVkRGlzZWFzZU1vZGVsU3RhdGVbcm93XVtjb2x1bW5dOworCQkJCWZpbmFsIExhYmVsVmFsdWUgZG1MYWJlbFZhbHVlID0gZ2V0Q3VycmVudERpc2Vhc2VNb2RlbExhYmVsVmFsdWUoCisJCQkJCQlyZWdpb24sIGRpc2Vhc2VNb2RlbCk7CisJCQkJYXNzZXJ0VHJ1ZSgiRGlzZWFzZSBtb2RlbCBcIiIKKwkJCQkJCSsgZGlzZWFzZU1vZGVsLmdldER1YmxpbkNvcmUoKS5nZXRUaXRsZSgpICsgIlwiICgiCisJCQkJCQkrIHNjZW5hcmlvRGlzZWFzZUtleSArICIpIHN0ZXA6ICIgKyBzdGVwICsgIiBbIiArIHJvdworCQkJCQkJKyAiLCAiICsgY29sdW1uICsgIl0gR290IFwiIiArIGRtTGFiZWxWYWx1ZS50b1N0cmluZygpCisJCQkJCQkrICJcIiwgZXhwZWN0ZWQgXCIiICsgbGFiZWxWYWx1ZS50b1N0cmluZygpICsgIlwiIiwKKwkJCQkJCWNvbXBhcmVMYWJlbFZhbHVlcyhsYWJlbFZhbHVlLCBkbUxhYmVsVmFsdWUpKTsKKwkJCX0gLy8gZm9yIGNvbHVtbgorCQl9IC8vIGZvciByb3cKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyB2YWxpZGF0ZURpc2Vhc2VNb2RlbFN0YXRlCisKKwkvKioKKwkgKiBAcGFyYW0gbGFiZWxWYWx1ZQorCSAqIEBwYXJhbSBkbUxhYmVsVmFsdWUKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsYWJlbHMgYXJlICJlcXVhbCIuIFdlIGRvIGEgImZ1enp5IgorCSAqICAgICAgICAgY29tcGFyZSBvbiB0aGUgZG91YmxlIHZhbHVlcy4gV2UgZGVjbGFyZSB0aGVtICJlcXVhbCIgaWYgdGhleQorCSAqICAgICAgICAgZGlmZmVyIGJ5IGxlc3MgdGhhbiBhIHNwZWNpZmllZCB0b2xlcmFuY2UuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY29tcGFyZUxhYmVsVmFsdWVzKGZpbmFsIExhYmVsVmFsdWUgbGFibGVWYWx1ZTEsCisJCQlmaW5hbCBMYWJlbFZhbHVlIGxhYmxlVmFsdWUyKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOworCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGRtTFYxID0gKERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpIGxhYmxlVmFsdWUxOworCQlmaW5hbCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGRtTFYyID0gKERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpIGxhYmxlVmFsdWUyOworCisJCXJldFZhbHVlID0gcmV0VmFsdWUKKwkJCQkmJiBEaXNlYXNlTW9kZWxUZXN0VXRpbC5jbG9zZUVub3VnaChkbUxWMS5nZXREaXNlYXNlRGVhdGhzKCksCisJCQkJCQlkbUxWMi5nZXREaXNlYXNlRGVhdGhzKCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjb21wYXJlTGFiZWxWYWx1ZXMKKworCS8qKgorCSAqIEBwYXJhbSBmaXh0dXJlCisJICogICAgICAgICAgICB0aGUgc2NlbmFyaW8gdG8gdGVzdAorCSAqIEByZXR1cm4gdGhlIFVSSSB0byB1c2UgdG8gc2VyaWFsaXplIGFuZCB0aGVuIGRlLXNlcmlhbGl6ZSB0aGUgc2NlbmFyaW8KKwkgKiAgICAgICAgIHVuZGVyIHRlc3QKKwkgKi8KKwlwcml2YXRlIFVSSSBjcmVhdGVTZXJpYWxpemF0aW9uVVJJKGZpbmFsIFNjZW5hcmlvIGZpeHR1cmUpIHsKKwkJZmluYWwgVVJJIHVyaSA9IFVSSQorCQkJCS5jcmVhdGVVUkkoRElSRUNUT1JZICsgIi8iICsgZ2V0RGlzZWFzZVVSSVByZWZpeCgpCisJCQkJCQkrIGVuY29kZVRpdGxlKGZpeHR1cmUuZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCkpCisJCQkJCQkrICIuc2NlbmFyaW8iKTsKKwkJcmV0dXJuIHVyaTsKKwl9IC8vIGNyZWF0ZVNlcmlhbGl6YXRpb25VUkkKKworCS8qKgorCSAqIEBwYXJhbSB0aXRsZQorCSAqICAgICAgICAgICAgdGhlIHRpdGxlIG9mIGEgc2NlbmFyaW8KKwkgKiBAcmV0dXJuIHRoZSB0aXRsZSB3aXRoIGFsbCB3aGl0ZXNwYWNlIHJlbW92ZWQKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBlbmNvZGVUaXRsZShmaW5hbCBTdHJpbmcgdGl0bGUpIHsKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWZpbmFsIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGl0bGUsICIsLltdICIpOworCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisJCQlzYi5hcHBlbmQoc3QubmV4dFRva2VuKCkpOworCQl9IC8vIHdoaWxlCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0gLy8gZW5jb2RlVGl0bGUKKworCS8qKgorCSAqIEBwYXJhbSByZWdpb24KKwkgKiAgICAgICAgICAgIHRoZSByZWdpb24gbm9kZSB0byBzZWFyY2ggZm9yIGEgbGFiZWwgdXBkYXRlZCBieSB0aGUgZGlzZWFzZQorCSAqICAgICAgICAgICAgbW9kZWwKKwkgKiBAcGFyYW0gZGlzZWFzZU1vZGVsCisJICogICAgICAgICAgICB0aGUgZGlzZWFzZSBtb2RlbAorCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxhYmVsIG9uIHRoZSBub2RlIHVwZGF0ZWQgYnkgdGhlIGRpc2Vhc2UKKwkgKiAgICAgICAgIG1vZGVsCisJICovCisJcHJpdmF0ZSBMYWJlbFZhbHVlIGdldEN1cnJlbnREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKGZpbmFsIFJlZ2lvbiByZWdpb24sCisJCQlmaW5hbCBEaXNlYXNlTW9kZWwgZGlzZWFzZU1vZGVsKSB7CisJCUxhYmVsVmFsdWUgcmV0VmFsdWUgPSBudWxsOworCQlmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogcmVnaW9uLmdldExhYmVscygpKSB7CisJCQlmaW5hbCBOb2RlTGFiZWwgbm9kZUxhYmVsID0gKE5vZGVMYWJlbCkgZWxlbWVudDsKKwkJCWlmIChub2RlTGFiZWwgaW5zdGFuY2VvZiBEaXNlYXNlTW9kZWxMYWJlbCkgeworCQkJCWZpbmFsIERpc2Vhc2VNb2RlbExhYmVsIGRpc2Vhc2VNb2RlbExhYmVsID0gKERpc2Vhc2VNb2RlbExhYmVsKSBub2RlTGFiZWw7CisJCQkJLy8gSXMgdGhpcyBsYWJlbCB1cGRhdGVkIGJ5IHRoZSBkaXNlYXNlIG1vZGVsPworCQkJCWlmIChkaXNlYXNlTW9kZWwuZ2V0TGFiZWxzVG9VcGRhdGUoKQorCQkJCQkJLmNvbnRhaW5zKGRpc2Vhc2VNb2RlbExhYmVsKSkgeworCQkJCQkvLyBZZXMKKwkJCQkJcmV0VmFsdWUgPSBkaXNlYXNlTW9kZWxMYWJlbC5nZXRDdXJyZW50VmFsdWUoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSAvLyBpZgorCQl9IC8vIGZvciBlYWNoIG5vZGUgbGFiZWwKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0Q3VycmVudERpc2Vhc2VNb2RlbExhYmVsVmFsdWUKKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBzY2VuYXJpbworCSAqICAgICAgICAgICAgYSBzY2VuYXJpbworCSAqIEByZXR1cm4gYWxsIG9mIHRoZSBkaXNlYXNlIG1vZGVscyBpbiB0aGUgc2NlbmFyaW8uCisJICovCisJcHJvdGVjdGVkIExpc3Q8RGlzZWFzZU1vZGVsPiBnZXREaXNlYXNlTW9kZWxzKGZpbmFsIFNjZW5hcmlvIHNjZW5hcmlvKSB7CisJCWZpbmFsIExpc3Q8RGlzZWFzZU1vZGVsPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8RGlzZWFzZU1vZGVsPigpOworCisJCWZvciAoZmluYWwgT2JqZWN0IGVsZW1lbnQgOiBzY2VuYXJpby5nZXRDYW5vbmljYWxHcmFwaCgpCisJCQkJLmdldERlY29yYXRvcnMoKSkgeworCQkJZmluYWwgRGVjb3JhdG9yIGRlY29yYXRvciA9IChEZWNvcmF0b3IpIGVsZW1lbnQ7CisJCQlpZiAoZGVjb3JhdG9yIGluc3RhbmNlb2YgRGlzZWFzZU1vZGVsKSB7CisJCQkJcmV0VmFsdWUuYWRkKChEaXNlYXNlTW9kZWwpIGRlY29yYXRvcik7CisJCQl9CisJCX0gLy8gZm9yIGVhY2ggZGVjb3JhdG9yIGluIHRoZSBjYW5vbmljYWwgZ3JhcGgKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0RGlzZWFzZU1vZGVsCisKKwkvKioKKwkgKiBAcGFyYW0gZGlzZWFzZVNjZW5hcmlvS2V5CisJICogICAgICAgICAgICB0aGUga2V5IGlkZW50aWZ5aW5nIHRoZSB0ZXN0CisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGRpc2Vhc2UgbW9kZWwgY29tcHV0YXRpb25zIHRvIGV4ZWN1dGUgZm9yIHRoZSB0ZXN0LgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0TnVtYmVyT2ZTdGVwcyhmaW5hbCBTdHJpbmcgZGlzZWFzZVNjZW5hcmlvS2V5KTsKKworCS8qKgorCSAqIEBwYXJhbSBkaXNlYXNlU2NlbmFyaW9LZXkKKwkgKiAgICAgICAgICAgIHRoZSBrZXkgaWRlbnRpZnlpbmcgdGhlIHRlc3QKKwkgKiBAcmV0dXJuIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgbGFiZWxzIGEgZGlzZWFzZSBtb2RlbCB3aWxsIHVwZGF0ZQorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0RXhwZWN0ZWROdW1iZXJPZkxhYmVsc1RvVXBkYXRlKAorCQkJZmluYWwgU3RyaW5nIGRpc2Vhc2VTY2VuYXJpb0tleSk7CisKKwkvKioKKwkgKiBAcGFyYW0gZGlzZWFzZVNjZW5hcmlvS2V5CisJICogICAgICAgICAgICBpZGVudGlmaWVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgY29tYmluYXRpb24gb2YgZGlzZWFzZQorCSAqICAgICAgICAgICAgYW5kIHNjZW5hcmlvLgorCSAqIEBwYXJhbSBzdGVwCisJICogICAgICAgICAgICB0aGUgc2ltdWxhdGlvbiBzdGVwIHRoYXQgaGFzIGJlZW4gY29tcGxldGVkLgorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZGlzZWFzZSBtb2RlbCBsYWJlbCB2YWx1ZXMgdGhhdCBhcmUgdGhlIGV4cGVjdGVkCisJICogICAgICAgICB2YWx1ZXMgYWZ0ZXIgdGhlIGdpdmVuIHN0ZXAgb2YgdGhlIHNpbXVsYXRpb24uCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IExhYmVsVmFsdWVbXVtdIGdldEV4cGVjdGVkRGlzZWFzZU1vZGVsU3RhdGUoCisJCQlmaW5hbCBTdHJpbmcgZGlzZWFzZVNjZW5hcmlvS2V5LCBmaW5hbCBpbnQgc3RlcCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkaXNlYXNlIG1vZGVscyB0byBiZSB0ZXN0ZWQKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgTGlzdDxOb2RlRGVjb3JhdG9yPiBnZXREaXNlYXNlTW9kZWxzVG9UZXN0KCk7CisKKwkvKioKKwkgKiBAcGFyYW0gbW9kZWwKKwkgKiAgICAgICAgICAgIHRoZSBtb2RlbCB0byBnZW5lcmF0ZSBzY2VuYXJpbyBkZWNvcmF0b3JzIGZvcgorCSAqIEByZXR1cm4gdGhlIHNjZW5hcmlvIGRlY29yYXRvcnMgdG8gaW5jbHVkZSBpbiBhIGZpeHR1cmUKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgQ29sbGVjdGlvbjxEZWNvcmF0b3I+IGdldFNjZW5hcmlvRGVjb3JhdG9ycyhNb2RlbCBtb2RlbCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgaW4gYSBVUkkgdG8gcHJlZml4IHRoZSBzY2VuYXJpbyBmaWxlcyBiZWluZworCSAqICAgICAgICAgc2VyaWFsaXplZCBmb3IgYSBwYXJ0aWN1bGFyIGRpc2Vhc2UgdW5kZXIgdGVzdC4KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERpc2Vhc2VVUklQcmVmaXgoKTsKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIHNwZWNpZmljYXRpb24gb2YgYSB0ZXN0CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXN0U3BlYyB7CisJCS8qKgorCQkgKiBUaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGxhdHRpY2UgZ3JhcGgKKwkJICovCisJCXB1YmxpYyBpbnQgbnVtUm93cyA9IDA7CisKKwkJLyoqCisJCSAqIFRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgbGF0dGljZSBncmFwaAorCQkgKi8KKwkJcHVibGljIGludCBudW1Db2x1bW5zID0gMDsKKworCQkvKioKKwkJICogVGhlIHNjZW5hcmlvL2Rpc2Vhc2Uga2V5IG9mIHRoZSB0ZXN0LgorCQkgKi8KKwkJcHVibGljIFN0cmluZyBzY2VuYXJpb0Rpc2Vhc2VLZXkgPSAiIjsKKworCQkvKioKKwkJICogQHBhcmFtIG51bVJvd3MKKwkJICogQHBhcmFtIG51bUNvbHVtbnMKKwkJICogQHBhcmFtIHNjZW5hcmlvRGlzZWFzZUtleQorCQkgKi8KKwkJcHJvdGVjdGVkIFRlc3RTcGVjKGZpbmFsIGludCBudW1Sb3dzLCBmaW5hbCBpbnQgbnVtQ29sdW1ucywKKwkJCQlmaW5hbCBTdHJpbmcgc2NlbmFyaW9EaXNlYXNlS2V5KSB7CisJCQlzdXBlcigpOworCQkJdGhpcy5udW1Sb3dzID0gbnVtUm93czsKKwkJCXRoaXMubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7CisJCQl0aGlzLnNjZW5hcmlvRGlzZWFzZUtleSA9IHNjZW5hcmlvRGlzZWFzZUtleTsKKwkJfQorCX0gLy8gVGVzdFNwZWMKKworfSAvLyBEaXNlYXNlTW9kZWxTY2VuYXJpb1Rlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0Rpc2Vhc2VNb2RlbFN0YXRlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvRGlzZWFzZU1vZGVsU3RhdGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNjNjcxYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0Rpc2Vhc2VNb2RlbFN0YXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxTdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5EaXNlYXNlTW9kZWxTdGF0ZUltcGw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNlYXNlIE1vZGVsIFN0YXRlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlzZWFzZU1vZGVsU3RhdGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIERpc2Vhc2UgTW9kZWwgU3RhdGUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEaXNlYXNlTW9kZWxTdGF0ZSBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgRGlzZWFzZSBNb2RlbCBTdGF0ZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEaXNlYXNlTW9kZWxTdGF0ZVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEaXNlYXNlIE1vZGVsIFN0YXRlIHRlc3QgY2FzZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShEaXNlYXNlTW9kZWxTdGF0ZSBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEaXNlYXNlIE1vZGVsIFN0YXRlIHRlc3QgY2FzZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIERpc2Vhc2VNb2RlbFN0YXRlIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIHRlc3QgdGhlIHNhbml0eSBvZiB0aGUgZml4dHVyZQorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RGaXh0dXJlU2FuaXR5KCkgeworCQlmaW5hbCBEaXNlYXNlTW9kZWxTdGF0ZUltcGwgZml4dHVyZSA9IChEaXNlYXNlTW9kZWxTdGF0ZUltcGwpIGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShmaXh0dXJlLnNhbmUoKSk7CisJfSAvLyB0ZXN0Rml4dHVyZVNhbml0eQorfSAvLyBEaXNlYXNlTW9kZWxTdGF0ZVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0Rpc2Vhc2VNb2RlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0Rpc2Vhc2VNb2RlbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTM1MDdiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvRGlzZWFzZU1vZGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjM0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSB0ZXN0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCNnZXRBZGp1c3RlZEJhY2tncm91bmRNb3J0YWxpdHlSYXRlKGxvbmcpIDxlbT5HZXQgQWRqdXN0ZWQgQmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCNjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbCgpIDxlbT5DcmVhdGUgRGlzZWFzZSBNb2RlbCBMYWJlbDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCNjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCkgPGVtPkNyZWF0ZSBEaXNlYXNlIE1vZGVsIExhYmVsIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2NyZWF0ZURpc2Vhc2VNb2RlbFN0YXRlKCkgPGVtPkNyZWF0ZSBEaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2luaXRpYWxpemVEaXNlYXNlU3RhdGUob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbFN0YXRlLCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWwpIDxlbT5Jbml0aWFsaXplIERpc2Vhc2UgU3RhdGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwjaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZShvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWwpIDxlbT5Jbml0aWFsaXplIERpc2Vhc2UgU3RhdGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwjY3JlYXRlSW5mZWN0b3IoKSA8ZW0+Q3JlYXRlIEluZmVjdG9yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2dldEFkanVzdGVkQmFja2dyb3VuZEJpcnRoUmF0ZShsb25nKSA8ZW0+R2V0IEFkanVzdGVkIEJhY2tncm91bmQgQmlydGggUmF0ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlzZWFzZU1vZGVsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCS8qKgorCSAqIFRoZSBwb3B1bGF0aW9uIGlkZW50aWZpZXIgdG8gdXNlIGZvciB0ZXN0aW5nIGRpc2Vhc2UgbW9kZWxzLgorCSAqLworCWZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRFU1RfUE9QVUxBVElPTl9JREVOVElGSUVSID0gUG9wdWxhdGlvbkxhYmVsLkhVTUFOOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgcmF0ZSBhdCB3aGljaCBwb3B1bGF0aW9uIG1lbWJlcnMgKG9uIGF2ZXJhZ2UpIHRyYW5zaXRpb24gZnJvbQorCSAqIGFsbCBvZiB0aGUgb3RoZXIgc3RhdGVzIChleGNlcHQgPGVtPlByZS1Cb3JuPC9lbT4pIHRvIHRoZSBzdGF0ZQorCSAqIDxlbT5EZWFkPC9lbT4sIHBlciB0aW1lIHBlcmlvZC4gVW5pdHM6IHBvcHVsYXRpb24gbWVtYmVycworCSAqIAorCSAqIEBzZWUgU3RhbmRhcmREaXNlYXNlTW9kZWwjZ2V0QmFja2dyb3VuZE1vcnRhbGl0eVJhdGUoKQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIE1PUlRBTElUWV9SQVRFID0gMC4wMTsKKworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEaXNlYXNlTW9kZWwgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGlzZWFzZU1vZGVsVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoRGlzZWFzZU1vZGVsIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEaXNlYXNlTW9kZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsI2dldEFkanVzdGVkQmFja2dyb3VuZE1vcnRhbGl0eVJhdGUobG9uZykgPGVtPkdldCBBZGp1c3RlZCBCYWNrZ3JvdW5kIE1vcnRhbGl0eSBSYXRlPC9lbT59JworCSAqIG9wZXJhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwjZ2V0QWRqdXN0ZWRCYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZShsb25nKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldEFkanVzdGVkQmFja2dyb3VuZE1vcnRhbGl0eVJhdGVfX2xvbmcoKSB7CisJCWZpbmFsIERpc2Vhc2VNb2RlbCBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKERpc2Vhc2VNb2RlbFRlc3RVdGlsLmNsb3NlRW5vdWdoKAorCQkJCWZpeHR1cmUuZ2V0QWRqdXN0ZWRCYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZSgyICogZml4dHVyZQorCQkJCQkJLmdldFRpbWVQZXJpb2QoKSksICgyICogZml4dHVyZQorCQkJCQkJLmdldEJhY2tncm91bmRNb3J0YWxpdHlSYXRlKCkpKSk7CisJfSAvLyB0ZXN0R2V0QWRqdXN0ZWRCYWNrZ3JvdW5kTW9ydGFsaXR5UmF0ZV9fbG9uZworCisJLyoqCisJICogdGVzdCB0aGUgc2FuaXR5IG9mIHRoZSBmaXh0dXJlCisJICovCisJcHVibGljIHZvaWQgdGVzdEZpeHR1cmVTYW5pdHkoKSB7CisJCWZpbmFsIERpc2Vhc2VNb2RlbCBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGZpeHR1cmUuc2FuZSgpKTsKKwl9IC8vIHRlc3RGaXh0dXJlU2FuaXR5CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2NyZWF0ZURpc2Vhc2VNb2RlbExhYmVsKCkgPGVtPkNyZWF0ZSBEaXNlYXNlIE1vZGVsIExhYmVsPC9lbT59JworCSAqIG9wZXJhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2NyZWF0ZURpc2Vhc2VNb2RlbExhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEaXNlYXNlTW9kZWxMYWJlbCgpIHsKKwkJZmluYWwgRGlzZWFzZU1vZGVsIGRpc2Vhc2VNb2RlbCA9IGdldEZpeHR1cmUoKTsKKwkJaWYgKCEoZGlzZWFzZU1vZGVsIGluc3RhbmNlb2YgQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbCkpIHsKKwkJZmluYWwgRGlzZWFzZU1vZGVsTGFiZWwgZG1sID0gZGlzZWFzZU1vZGVsLmNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsKCk7CisJCWFzc2VydFRydWUoZG1sLmVDbGFzcygpLmVxdWFscyhnZXREaXNlYXNlTW9kZWxMYWJlbENsYXNzKCkpKTsKKwkJfQorCX0gLy8gdGVzdENyZWF0ZURpc2Vhc2VNb2RlbExhYmVsCisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2NyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKSA8ZW0+Q3JlYXRlIERpc2Vhc2UgTW9kZWwgTGFiZWwgVmFsdWU8L2VtPn0nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCNjcmVhdGVEaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBvcGVyYXRpb24gdGVzdCBtZXRob2QKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2NyZWF0ZURpc2Vhc2VNb2RlbFN0YXRlKCkgPGVtPkNyZWF0ZSBEaXNlYXNlIE1vZGVsIFN0YXRlPC9lbT59JworCSAqIG9wZXJhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2NyZWF0ZURpc2Vhc2VNb2RlbFN0YXRlKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEaXNlYXNlTW9kZWxTdGF0ZSgpIHsKKwkJZmluYWwgRGlzZWFzZU1vZGVsIGRpc2Vhc2VNb2RlbCA9IGdldEZpeHR1cmUoKTsKKwkJaWYgKCEoZGlzZWFzZU1vZGVsIGluc3RhbmNlb2YgQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbCkpIHsKKworCQkJZmluYWwgRGlzZWFzZU1vZGVsU3RhdGUgZG1zID0gZGlzZWFzZU1vZGVsCisJCQkJCS5jcmVhdGVEaXNlYXNlTW9kZWxTdGF0ZSgpOworCQkJYXNzZXJ0VHJ1ZShkbXMuZUNsYXNzKCkuZXF1YWxzKGdldERpc2Vhc2VNb2RlbFN0YXRlQ2xhc3MoKSkpOworCQl9CisJfSAvLyB0ZXN0Q3JlYXRlRGlzZWFzZU1vZGVsU3RhdGUKKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwjaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZShvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsU3RhdGUsIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbCkgPGVtPkluaXRpYWxpemUgRGlzZWFzZSBTdGF0ZTwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCNpbml0aWFsaXplRGlzZWFzZVN0YXRlKG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxTdGF0ZSwgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZV9fRGlzZWFzZU1vZGVsU3RhdGVfRGlzZWFzZU1vZGVsTGFiZWwoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG9wZXJhdGlvbiB0ZXN0IG1ldGhvZAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQlmYWlsKCk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCNpbml0aWFsaXplRGlzZWFzZVN0YXRlKG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbCkgPGVtPkluaXRpYWxpemUgRGlzZWFzZSBTdGF0ZTwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCNpbml0aWFsaXplRGlzZWFzZVN0YXRlKG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVEaXNlYXNlU3RhdGVfX0Rpc2Vhc2VNb2RlbExhYmVsKCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBvcGVyYXRpb24gdGVzdCBtZXRob2QKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJZmFpbCgpOworCX0KKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwjY3JlYXRlSW5mZWN0b3IoKSA8ZW0+Q3JlYXRlIEluZmVjdG9yPC9lbT59JworCSAqIG9wZXJhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2NyZWF0ZUluZmVjdG9yKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVJbmZlY3RvcigpIHsKKwkJZmluYWwgRGlzZWFzZU1vZGVsIGRpc2Vhc2VNb2RlbCA9IGdldEZpeHR1cmUoKTsKKwkJaWYgKCEoZGlzZWFzZU1vZGVsIGluc3RhbmNlb2YgQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbCkpIHsKKwkJCWZpbmFsIEluZmVjdG9yIGluZmVjdG9yID0gZGlzZWFzZU1vZGVsLmNyZWF0ZUluZmVjdG9yKCk7CisJCQlhc3NlcnROb3ROdWxsKGluZmVjdG9yKTsKKwkJCWFzc2VydFRydWUoaW5mZWN0b3IuZ2V0RGlzZWFzZU5hbWUoKS5lcXVhbHMoCisJCQkJCWZpeHR1cmUuZ2V0RGlzZWFzZU5hbWUoKSkpOworCQkJYXNzZXJ0VHJ1ZShpbmZlY3Rvci5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpLmVxdWFsc0lnbm9yZUNhc2UoCisJCQkJCWZpeHR1cmUuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSkpOworCQl9CisKKwl9IC8vIHRlc3RDcmVhdGVJbmZlY3RvcgorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCNnZXRBZGp1c3RlZEJhY2tncm91bmRCaXJ0aFJhdGUobG9uZykgPGVtPkdldCBBZGp1c3RlZCBCYWNrZ3JvdW5kIEJpcnRoIFJhdGU8L2VtPn0nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCNnZXRBZGp1c3RlZEJhY2tncm91bmRCaXJ0aFJhdGUobG9uZykKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldEFkanVzdGVkQmFja2dyb3VuZEJpcnRoUmF0ZV9fbG9uZygpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgb3BlcmF0aW9uIHRlc3QgbWV0aG9kCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCisJCWZhaWwoKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBFQ2xhc3Mgb2YgdGhlIGNsYXNzIHRoaXMgZGlzZWFzZSBtb2RlbCB1cGRhdGVzCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IEVDbGFzcyBnZXREaXNlYXNlTW9kZWxMYWJlbENsYXNzKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBFQ2xhc3Mgb2YgdGhlIGNsYXNzIHRoaXMgZGlzZWFzZSBtb2RlbCB1c2VzIHRvIHN0b3JlCisJICogICAgICAgICBjb21wdXRhdGlvbiBzdGF0ZQorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBFQ2xhc3MgZ2V0RGlzZWFzZU1vZGVsU3RhdGVDbGFzcygpOworCit9IC8vIERpc2Vhc2VNb2RlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0Rpc2Vhc2VNb2RlbFRlc3RVdGlsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9EaXNlYXNlTW9kZWxUZXN0VXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNDMyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9EaXNlYXNlTW9kZWxUZXN0VXRpbC5qYXZhCkBAIC0wLDAgKzEsODg4IEBACisvLyBEaXNlYXNlTW9kZWxUZXN0VXRpbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkVkZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW9GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIudGVzdHMuU2VxdWVudGlhbFNlcXVlbmNlclRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5JbmxpbmVMYXRMb25nRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmcuU2VnbWVudEJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5UcmFuc3BvcnRNb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuQ29tbW9uQm9yZGVyUmVsYXRpb25zaGlwTGFiZWxJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuTm9kZXNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuUmVnaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLkRlY29yYXRvcnNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RFZGdlRGVjb3JhdG9yMTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGEgbnVtYmVyIG9mIHV0aWxpdGllcyBmb3IgY3JlYXRpbmcgYXJ0aWZhY3RzIHVzZWZ1bCBmb3IKKyAqIHRlc3RpbmcgZGlzZWFzZSBtb2RlbC4KKyAqLworcHVibGljIGNsYXNzIERpc2Vhc2VNb2RlbFRlc3RVdGlsIHsKKworCS8qKgorCSAqIFRoZSBtaW5pbXVtIGxhdGl0dWRlIHZhbHVlIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIHRvIHdoaWNoIG5vZGUgc3BhdGlhbAorCSAqIGRhdGEgaXMgbWFwcGVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgZG91YmxlIE1JTl9MQVRJVFVERV9WQUxVRSA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBtYXhpbXVtIGxhdGl0dWRlIHZhbHVlIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIHRvIHdoaWNoIG5vZGUgc3BhdGlhbAorCSAqIGRhdGEgaXMgbWFwcGVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgZG91YmxlIE1BWF9MQVRJVFVERV9WQUxVRSA9IDUwLjA7CisKKwkvKioKKwkgKiBUaGUgbWluaW11bSBsb25naXR1ZGUgdmFsdWUgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgdG8gd2hpY2ggbm9kZSBzcGF0aWFsCisJICogZGF0YSBpcyBtYXBwZWQuCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBkb3VibGUgTUlOX0xPTkdJVFVERV9WQUxVRSA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBtYXhpbXVtIGxvbmdpdHVkZSB2YWx1ZSBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSB0byB3aGljaCBub2RlIHNwYXRpYWwKKwkgKiBkYXRhIGlzIG1hcHBlZC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIGRvdWJsZSBNQVhfTE9OR0lUVURFX1ZBTFVFID0gMTAwLjA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIGRlZ3JlZXMgb2YgbGF0aXR1ZGUgb2YgdGhlIGFyZWEgb24gdGhlIEVhcnRoJ3Mgc3VyZmFjZSB0bworCSAqIHdoaWNoIHRoZSBub2RlcyBhcmUgbWFwcGVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgZG91YmxlIExBVElUVURFX0hFSUdIVCA9IE1BWF9MQVRJVFVERV9WQUxVRQorCQkJLSBNSU5fTEFUSVRVREVfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIGRlZ3JlZXMgb2YgbG9uZ2l0dWRlIG9mIHRoZSBhcmVhIG9uIHRoZSBFYXJ0aCdzIHN1cmZhY2UgdG8KKwkgKiB3aGljaCB0aGUgbm9kZXMgYXJlIG1hcHBlZC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIGRvdWJsZSBMT05HSVRVREVfV0lEVEggPSBNQVhfTE9OR0lUVURFX1ZBTFVFCisJCQktIE1JTl9MT05HSVRVREVfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgdmFsdWUgdXNlZCBmb3IgdGhlIHBvcHVsYXRpb24gb2YgYSBub2RlLgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgZG91YmxlIFRFU1RfUE9QVUxBVElPTl9DT1VOVCA9IDEwMDsKKworCS8qKgorCSAqIFRoZSB2YWx1ZSB1c2VkIGZvciBhcmVhIG9mIGEgbm9kZS4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIGRvdWJsZSBURVNUX0FSRUEgPSAxMDAuMDsKKworCS8qKgorCSAqIFRoZSBwb3B1bGF0aW9uIHVzZWQgZm9yIHRoZSBkaXNlYXNlIG1vZGVsIHRlc3RzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUE9QVUxBVElPTl9JREVOVElGSUVSID0gUG9wdWxhdGlvbkxhYmVsLkhVTUFOOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdGltZSBwZXJpb2QgYmV0d2VlbiBzdWNjZXNzaXZlIGNvbXB1dGF0aW9ucyBvZiBsYWJlbCB2YWx1ZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFRFU1RfVFJBTlNQT1JUX1JBVEVfVElNRV9QRVJJT0QgPSBTVEVNVGltZS5Vbml0cy5EQVkuZ2V0TWlsbGlzZWNvbmRzKCk7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIGh1bWFucyB0aGF0IHRyYXZlbCBieSBhaXIgZnJvbSBvbmUgbm9kZSB0byBhbm90aGVyLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFJUl9UUkFOU1BPUlRfTUFYX0NBUEFDSVRZID0gNTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2YgaHVtYW5zIHRoYXQgdHJhdmVsIGJ5IHJvYWQgMSBmcm9tIG9uZSBub2RlIHRvIGFub3RoZXIuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9BRDFfVFJBTlNQT1JUX01BWF9DQVBBQ0lUWSA9IDM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIGh1bWFucyB0aGF0IHRyYXZlbCBieSByb2FkIDIgZnJvbSBvbmUgbm9kZSB0byBhbm90aGVyLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPQUQyX1RSQU5TUE9SVF9NQVhfQ0FQQUNJVFkgPSAyOworCisJLyoqCisJICogVGhlIG5hbWUgb2YgYSByb2FkIGNvbm5lY3RpbmcgdHdvIG5vZGVzIHRvZ2V0aGVyIGluIHRoZSBncmFwaC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0FEMV9UUkFOU1BPUlRfSUQgPSAicm9hZDEiOworCisJLyoqCisJICogVGhlIG5hbWUgb2YgYSByb2FkIGNvbm5lY3RpbmcgdHdvIG5vZGVzIHRvZ2V0aGVyIGluIHRoZSBncmFwaC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0FEMl9UUkFOU1BPUlRfSUQgPSAicm9hZDIiOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBraWxvbWV0ZXJzIG9mIGNvbW1vbiBib3JkZXIgdGhhdCB0d28gbm9kZXMgc2hhcmUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NTU9OX0JPUkRFUl9MRU5HVEggPSAxMDsKKworCS8qKgorCSAqIFRoZSBpZGVudGlmaWVyIHVzZWQgZm9yIGFpciB0cmFuc3BvcnQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBSVJfVFJBTlNQT1JUX0lEID0gImFpcmNhbmFkYSI7CisKKwkvKioKKwkgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBkb3VibGUgdmFsdWVzIHRoYXQgY29uc3RpdHV0ZXMgaW5lcXVhbGl0eQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIERPVUJMRV9FUVVBTElUWV9UT0xFUkFOQ0UgPSAwLjAyOworCisJLyoqCisJICogQHBhcmFtIHYxCisJICogICAgICAgICAgICBhIGRvdWJsZQorCSAqIEBwYXJhbSB2MgorCSAqICAgICAgICAgICAgYSBkb3VibGUKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0d28gZG91YmxlIHZhbHVlcyBkaWZmZXIgdGhhbiBieSBsZXNzCisJICogICAgICAgICB0aGFuIHtAbGluayAjRE9VQkxFX0VRVUFMSVRZX1RPTEVSQU5DRX0gYW5kIHNvIHNob3VsZCBiZQorCSAqICAgICAgICAgY29uc2lkZXJlZCB0byBiZSBlcXVhbC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2xvc2VFbm91Z2goZmluYWwgZG91YmxlIHYxLCBmaW5hbCBkb3VibGUgdjIpIHsKKwkJcmV0dXJuIE1hdGguYWJzKHYxIC0gdjIpIDwgRE9VQkxFX0VRVUFMSVRZX1RPTEVSQU5DRTsKKwl9IC8vIGNsb3NlRW5vdWdoCisKKwkvKioKKwkgKiBAcGFyYW0gc2NlbmFyaW9EZWNvcmF0b3JzCisJICogQHBhcmFtIG1vZGVsCisJICogQHJldHVybiBhIHNjZW5hcmlvCisJICovCisJcHVibGljIHN0YXRpYyBTY2VuYXJpbyBjcmVhdGVMYXR0aWNlU2NlbmFyaW8oCisJCQlmaW5hbCBDb2xsZWN0aW9uPERlY29yYXRvcj4gc2NlbmFyaW9EZWNvcmF0b3JzLCBmaW5hbCBNb2RlbCBtb2RlbCkgeworCQlmaW5hbCBTY2VuYXJpbyByZXRWYWx1ZSA9IFNjZW5hcmlvRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2NlbmFyaW8oKTsKKwkJZmluYWwgRHVibGluQ29yZSBkYyA9IHJldFZhbHVlLmdldER1YmxpbkNvcmUoKTsKKwkJZGMucG9wdWxhdGUoKTsKKwkJZGMuc2V0VGl0bGUobW9kZWwuZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCkpOworCisJCXJldFZhbHVlLnNldE1vZGVsKG1vZGVsKTsKKworCQlyZXRWYWx1ZS5zZXRTZXF1ZW5jZXIoU2VxdWVudGlhbFNlcXVlbmNlclRlc3QuY3JlYXRlRml4dHVyZSgpKTsKKworCQkvLyBTY2VuYXJpbyBEZWNvcmF0b3JzCisJCXJldFZhbHVlLmdldFNjZW5hcmlvRGVjb3JhdG9ycygpLmFkZEFsbChzY2VuYXJpb0RlY29yYXRvcnMpOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUxhdHRpY2VTY2VuYXJpbworCisJLyoqCisJICogQ3JlYXRlIGEgU2NlbmFyaW8gd2l0aCBhIGxhdHRpY2UgZm9yIGEgZ3JhcGgKKwkgKiAKKwkgKiBAcGFyYW0gbm9kZURlY29yYXRvcnMKKwkgKiAgICAgICAgICAgIHRoZSBub2RlIGRlY29yYXRvcnMgZm9yIHRoZSBtb2RlbAorCSAqIEBwYXJhbSBudW1Sb3dzCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHJvd3Mgb2Ygbm9kZXMgaW4gdGhlIGxhdHRpY2UKKwkgKiBAcGFyYW0gbnVtQ29sdW1ucworCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIG5vZGVzIGluIHRoZSBsYXR0aWNlCisJICogQHBhcmFtIHBvcHVsYXRpb25Db3VudAorCSAqICAgICAgICAgICAgdGhlIChEZWZhdWx0OiBodW1hbikgcG9wdWxhdGlvbiBhdCBlYWNoIG5vZGUKKwkgKiBAcGFyYW0gYXJlYQorCSAqICAgICAgICAgICAgdGhlIGFyZWEgKGttXjIpIG9mIGVhY2ggbm9kZQorCSAqIAorCSAqIEByZXR1cm4gdGhlIHNjZW5hcmlvCisJICovCisJLy8gcHVibGljIHN0YXRpYyBTY2VuYXJpbyBjcmVhdGVMYXR0aWNlU2NlbmFyaW8oCisJLy8gZmluYWwgQ29sbGVjdGlvbjxOb2RlRGVjb3JhdG9yPiBub2RlRGVjb3JhdG9ycywgZmluYWwgaW50IG51bVJvd3MsCisJLy8gZmluYWwgaW50IG51bUNvbHVtbnMsIGZpbmFsIGRvdWJsZSBwb3B1bGF0aW9uQ291bnQsIGZpbmFsIGRvdWJsZSBhcmVhKSB7CisJLy8gZmluYWwgU2NlbmFyaW8gcmV0VmFsdWUgPSBTY2VuYXJpb0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNjZW5hcmlvKCk7CisJLy8KKwkvLyAvLyBNb2RlbAorCS8vIGZpbmFsIE1vZGVsIG1vZGVsID0gY3JlYXRlTGF0dGljZU1vZGVsKG5vZGVEZWNvcmF0b3JzLCBudW1Sb3dzLAorCS8vIG51bUNvbHVtbnMsIHBvcHVsYXRpb25Db3VudCwgYXJlYSk7CisJLy8JCQorCS8vIC8vIFNjZW5hcmlvIGRlY29yYXRvcnMKKwkvLyBmaW5hbCBMaXN0PERlY29yYXRvcj4gc2NlbmFyaW9EZWNvcmF0b3JzID0gZ2V0CisJLy8gLy8gU2VxdWVuY2VyCisJLy8gcmV0VmFsdWUuc2V0U2VxdWVuY2VyKFNlcXVlbnRpYWxTZXF1ZW5jZXJUZXN0LmNyZWF0ZUZpeHR1cmUoKSk7CisJLy8KKwkvLyAvLyBEdWJsaW4gQ29yZQorCS8vIGZpbmFsIER1YmxpbkNvcmUgZGMgPSByZXRWYWx1ZS5nZXREdWJsaW5Db3JlKCk7CisJLy8gZGMucG9wdWxhdGUoKTsKKwkvLyBkYy5zZXRUaXRsZShjcmVhdGVTY2VuYXJpb1RpdGxlKGNhbm9uaWNhbFNjZW5hcmlvRGVjb3JhdG9ycywKKwkvLyBub2RlRGVjb3JhdG9ycywgbnVtUm93cywgbnVtQ29sdW1ucywgcG9wdWxhdGlvbkNvdW50LCBhcmVhKSk7CisJLy8KKwkvLyAvLyBTY2VuYXJpbyBEZWNvcmF0b3JzCisJLy8gcmV0VmFsdWUuZ2V0RGVjb3JhdG9ycygpLmFkZEFsbChjYW5vbmljYWxTY2VuYXJpb0RlY29yYXRvcnMpOworCS8vCisJLy8gLy8gTW9kZWwKKwkvLyByZXRWYWx1ZS5zZXRNb2RlbChtb2RlbCk7CisJLy8KKwkvLyBhc3NlcnQgcmV0VmFsdWUuc2FuZSgpOworCS8vCisJLy8gcmV0dXJuIHJldFZhbHVlOworCS8vIH0gLy8gY3JlYXRlTGF0dGljZVNjZW5hcmlvCisJLyoqCisJICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIE1vZGVsIHdoZXJlIHRoZSBub2RlcyBhcmUgaW50ZXJjb25uZWN0ZWQgYXMgaW4gYQorCSAqIGxhdHRpY2UuCisJICogCisJICogQHBhcmFtIG5vZGVEZWNvcmF0b3JzCisJICogICAgICAgICAgICB0aGUgbm9kZSBkZWNvcmF0b3JzIGZvciB0aGUgbW9kZWwKKwkgKiBAcGFyYW0gbnVtUm93cworCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiByb3dzIG9mIG5vZGVzIGluIHRoZSBsYXR0aWNlCisJICogQHBhcmFtIG51bUNvbHVtbnMKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1ucyBvZiBub2RlcyBpbiB0aGUgbGF0dGljZQorCSAqIEBwYXJhbSBwb3B1bGF0aW9uQ291bnQKKwkgKiAgICAgICAgICAgIHRoZSAoRGVmYXVsdDogaHVtYW4pIHBvcHVsYXRpb24gYXQgZWFjaCBub2RlCisJICogQHBhcmFtIGFyZWEKKwkgKiAgICAgICAgICAgIHRoZSBhcmVhIChrbV4yKSBvZiBlYWNoIG5vZGUKKwkgKiBAcmV0dXJuIHRoZSBtb2RlbAorCSAqLworCXB1YmxpYyBzdGF0aWMgTW9kZWwgY3JlYXRlTGF0dGljZU1vZGVsKAorCQkJZmluYWwgQ29sbGVjdGlvbjxOb2RlRGVjb3JhdG9yPiBub2RlRGVjb3JhdG9ycywgZmluYWwgaW50IG51bVJvd3MsCisJCQlmaW5hbCBpbnQgbnVtQ29sdW1ucywgZmluYWwgZG91YmxlIHBvcHVsYXRpb25Db3VudCwKKwkJCWZpbmFsIGRvdWJsZSBhcmVhKSB7CisJCWZpbmFsIE1vZGVsIHJldFZhbHVlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNb2RlbCgpOworCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gcmV0VmFsdWUuZ2V0RHVibGluQ29yZSgpOworCQlkYy5wb3B1bGF0ZSgpOworCQlkYy5zZXRUaXRsZShjcmVhdGVNb2RlbFRpdGxlKG5vZGVEZWNvcmF0b3JzLCBudW1Sb3dzLCBudW1Db2x1bW5zLAorCQkJCXBvcHVsYXRpb25Db3VudCwgYXJlYSkpOworCisJCXJldFZhbHVlLmdldE5vZGVEZWNvcmF0b3JzKCkuYWRkQWxsKG5vZGVEZWNvcmF0b3JzKTsKKwkJZmluYWwgR3JhcGggbGF0dGljZUdyYXBoID0gY3JlYXRlTGF0dGljZUdyYXBoKG51bVJvd3MsIG51bUNvbHVtbnMsCisJCQkJcG9wdWxhdGlvbkNvdW50LCBhcmVhKTsKKwkJcmV0VmFsdWUuZ2V0R3JhcGhzKCkuYWRkKGxhdHRpY2VHcmFwaCk7CisKKwkJYXNzZXJ0IHJldFZhbHVlLnNhbmUoKTsKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVMYXR0aWNlTW9kZWwKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBncmFwaCB3aGVyZSB0aGUgbm9kZXMgYXJlIGludGVyY29ubmVjdGVkIGFzIGluIGEKKwkgKiBsYXR0aWNlLgorCSAqIAorCSAqIEBwYXJhbSBudW1Sb3dzCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHJvd3Mgb2Ygbm9kZXMgaW4gdGhlIGxhdHRpY2UKKwkgKiBAcGFyYW0gbnVtQ29sdW1ucworCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIG5vZGVzIGluIHRoZSBsYXR0aWNlCisJICogQHBhcmFtIHBvcHVsYXRpb25Db3VudAorCSAqICAgICAgICAgICAgdGhlIChEZWZhdWx0OiBodW1hbikgcG9wdWxhdGlvbiBhdCBlYWNoIG5vZGUKKwkgKiBAcGFyYW0gYXJlYQorCSAqICAgICAgICAgICAgdGhlIGFyZWEgKGttXjIpIG9mIGVhY2ggbm9kZQorCSAqIEByZXR1cm4gZ3JhcGggdGhhdCBpcyBhIGxhdHRpY2Ugb2Ygbm9kZXMuCisJICovCisJcHVibGljIHN0YXRpYyBHcmFwaCBjcmVhdGVMYXR0aWNlR3JhcGgoZmluYWwgaW50IG51bVJvd3MsCisJCQlmaW5hbCBpbnQgbnVtQ29sdW1ucywgZmluYWwgZG91YmxlIHBvcHVsYXRpb25Db3VudCwKKwkJCWZpbmFsIGRvdWJsZSBhcmVhKSB7CisKKwkJZmluYWwgTm9kZSBub2RlSG9sZGVyW11bXSA9IG5ldyBOb2RlW251bVJvd3NdW251bUNvbHVtbnNdOworCQlmaW5hbCBHcmFwaCByZXRWYWx1ZSA9IEdyYXBoRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGgoKTsKKworCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gcmV0VmFsdWUuZ2V0RHVibGluQ29yZSgpOworCQlkYy5wb3B1bGF0ZSgpOworCQlkYworCQkJCS5zZXRUaXRsZShjcmVhdGVHcmFwaFRpdGxlKG51bVJvd3MsIG51bUNvbHVtbnMsCisJCQkJCQlwb3B1bGF0aW9uQ291bnQsIGFyZWEpKTsKKworCQkvLyBDcmVhdGUgdGhlIG5vZGVzIGFuZCBwdXQgdGhlbSBpbnRvIHRoZSBncmFwaAorCQlmb3IgKGludCByb3cgPSAwOyByb3cgPCBudW1Sb3dzOyByb3crKykgeworCQkJZm9yIChpbnQgY29sdW1uID0gMDsgY29sdW1uIDwgbnVtQ29sdW1uczsgY29sdW1uKyspIHsKKwkJCQlmaW5hbCBSZWdpb24gcmVnaW9uTm9kZSA9IGNyZWF0ZVJlZ2lvbk5vZGUocm93LCBjb2x1bW4pOworCQkJCW5vZGVIb2xkZXJbcm93XVtjb2x1bW5dID0gcmVnaW9uTm9kZTsKKwkJCQlyZXRWYWx1ZS5wdXROb2RlKHJlZ2lvbk5vZGUpOworCQkJfSAvLyBmb3IgZWFjaCBjb2x1bW4KKwkJfSAvLyBmb3IgZWFjaCByb3cKKworCQkvLyBBZGQgdGhlIFBvcHVsYXRpb24gYW5kIEFyZWEgbGFiZWxzCisJCWZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG51bVJvd3M7IHJvdysrKSB7CisJCQlmb3IgKGludCBjb2x1bW4gPSAwOyBjb2x1bW4gPCBudW1Db2x1bW5zOyBjb2x1bW4rKykgeworCQkJCWZpbmFsIE5vZGUgbm9kZSA9IG5vZGVIb2xkZXJbcm93XVtjb2x1bW5dOworCisJCQkJLy8gUG9wdWxhdGlvbgorCQkJCXJldFZhbHVlLnB1dE5vZGVMYWJlbChjcmVhdGVQb3B1bGF0aW9uTGFiZWwoCisJCQkJCQlURVNUX1BPUFVMQVRJT05fSURFTlRJRklFUiwgcG9wdWxhdGlvbkNvdW50LCBub2RlKSk7CisKKwkJCQkvLyBBcmVhCisJCQkJcmV0VmFsdWUucHV0Tm9kZUxhYmVsKGNyZWF0ZUFyZWFMYWJlbChhcmVhLCBub2RlKSk7CisJCQl9IC8vIGZvciBlYWNoIGNvbHVtbgorCQl9IC8vIGZvciBlYWNoIHJvdworCisJCS8vIE5vdyBhZGQgcmVsYXRpb25zaGlwcworCisJCS8vIERvIHRoZSBmaXJzdCByb3cgYnkgaXRzZWxmCisJCWZvciAoaW50IGNvbHVtbiA9IDE7IGNvbHVtbiA8IG51bUNvbHVtbnM7IGNvbHVtbisrKSB7CisJCQlhZGRSZWxhdGlvbkVkZ2VzKG5vZGVIb2xkZXJbMF1bY29sdW1uIC0gMV0sIG5vZGVIb2xkZXJbMF1bY29sdW1uXSwKKwkJCQkJcmV0VmFsdWUpOworCQl9IC8vIGZvciBjb2x1bW4KKworCQkvLyBBZGRlZCB0aGUgcGh5c2ljYWwgcmVsYXRpb25zCisJCWZvciAoaW50IHJvdyA9IDE7IHJvdyA8IG51bVJvd3M7IHJvdysrKSB7CisJCQlmb3IgKGludCBjb2x1bW4gPSAxOyBjb2x1bW4gPCBudW1Db2x1bW5zOyBjb2x1bW4rKykgeworCQkJCWFkZFJlbGF0aW9uRWRnZXMobm9kZUhvbGRlcltyb3ddW2NvbHVtbiAtIDFdLAorCQkJCQkJbm9kZUhvbGRlcltyb3ddW2NvbHVtbl0sIHJldFZhbHVlKTsKKwkJCQlhZGRSZWxhdGlvbkVkZ2VzKG5vZGVIb2xkZXJbcm93IC0gMV1bY29sdW1uXSwKKwkJCQkJCW5vZGVIb2xkZXJbcm93XVtjb2x1bW5dLCByZXRWYWx1ZSk7CisJCQl9IC8vIGZvciBlYWNoIGNvbHVtbgorCQl9IC8vIGZvciBlYWNoIHJvdworCisJCS8vIERvIHRoZSBmaXJzdCBjb2x1bW4gYnkgaXRzZWxmCisJCWZvciAoaW50IHJvdyA9IDE7IHJvdyA8IG51bVJvd3M7IHJvdysrKSB7CisJCQlhZGRSZWxhdGlvbkVkZ2VzKG5vZGVIb2xkZXJbcm93IC0gMV1bMF0sIG5vZGVIb2xkZXJbcm93XVswXSwKKwkJCQkJcmV0VmFsdWUpOworCQl9IC8vIGZvciByb3cKKworCQkvLyBBZGQgdGhlIHNwYXRpYWwgc3BlY2lmaWNhdGlvbiB0byB0aGUgc3BhdGlhbCBhdHRyaWJ1dGUgb2YgZWFjaCBub2RlJ3MKKwkJLy8gZHVibGluIGNvcmUgaW5zdGFuY2UgYW5kIGZvciBlYWNoIGVkZ2UuIFRoZSB2YWx1ZSBmb3IgdGhlIG5vZGVzIHdpbGwKKwkJLy8gYmUgYSByZWN0YW5ndWxhciBhcmVhIGV4cHJlc3NlZCBhcyBhIHNldCBvZiBsYXQvbG9uZyBwb2ludHMgdGhhdAorCQkvLyBsYXlvdXQgYSBwb2x5Z29uLiBUaGUgcG9zaXRpb24gb2YgdGhlIHBvbHlnb24gd2lsbCBhdCBwb3NpdGlvbiB0aGF0CisJCS8vIG1hdGNoZXMgdGhlIHBvc2l0aW9uIChyb3csIGNvbHVtbikgb2YgdGhlIG5vZGUgaW4gdGhlIGxhdHRpY2UuCisJCWFkZFNwYXRpYWxTcGVjaWZpY2F0aW9ucyhub2RlSG9sZGVyKTsKKworCQlhc3NlcnQgcmV0VmFsdWUuc2FuZSgpOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUxhdHRpY2VHcmFwaAorCisJLyoqCisJICogQWRkIHRoZSBzcGF0aWFsIHNwZWNpZmljYXRpb24gdG8gdGhlIHNwYXRpYWwgYXR0cmlidXRlIG9mIGVhY2ggbm9kZSdzCisJICogZHVibGluIGNvcmUgaW5zdGFuY2UuIFRoZSB2YWx1ZSB3aWxsIGJlIGEgcmV0YW5ndWxhciBhcmVhIGV4cHJlc3NlZCBhcyBhCisJICogc2V0IG9mIGxhdC9sb25nIHBvaW50cyB0aGF0IGxheW91dCBhIHBvbHlnb24uIFRoZSBwb3NpdGlvbiBvZiB0aGUgcG9seWdvbgorCSAqIHdpbGwgYXQgcG9zaXRpb24gdGhhdCBtYXRjaGVzIHRoZSBwb3NpdGlvbiAocm93LCBjb2x1bW4pIG9mIHRoZSBub2RlIGluCisJICogdGhlIGxhdHRpY2UuIE5vZGUgYXQgcG9zaXRpb24gWzBdWzBdIHdpbGwgYmUgaW4gdGhlIHVwcGVyIGxlZnQgd2hpbGUgdGhlCisJICogbm9kZSBhdCBwb3NpdG9uIFtudW1yb3dzXVtudW1jb2x1bW5zXSB3aWxsIGJlIGluIHRoZSBsb3dlciByaWdodCBvZiB0aGUKKwkgKiByZWN0YW5ndWxhciBhcmVhLgorCSAqIAorCSAqIEBwYXJhbSBub2RlSG9sZGVyCisJICogICAgICAgICAgICB0aGUgYXJyYXkgdGhhdCBob2xkcyB0aGUgbm9kZXMgb2YgdGhlIGxhdHRpYworCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkU3BhdGlhbFNwZWNpZmljYXRpb25zKGZpbmFsIE5vZGVbXVtdIG5vZGVIb2xkZXIpIHsKKworCQkvLyBGaXJzdCBydW4gdGhyb3VnaCBhbGwgb2YgdGhlIG5vZGVzIGNyZWF0aW5nIGEgcG9seWdvbiBmb3IgdGhlaXIKKwkJLy8gYm9yZGVyIGFuZCBhZGRpbmcgdGhlIGRhdGEgYXMgYW4gaW5saW5lIHZhbHVlIGluIHRoZSBzcGF0aWFsCisJCS8vIGF0dHJpYnV0ZSBvZiB0aGUgbm9kZSdzIGR1YmxpbiBjb3JlLgorCQlmb3IgKGludCByb3cgPSAwOyByb3cgPCBub2RlSG9sZGVyLmxlbmd0aDsgcm93KyspIHsKKwkJCWZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IG5vZGVIb2xkZXJbcm93XS5sZW5ndGg7IGNvbHVtbisrKSB7CisJCQkJZmluYWwgTm9kZSBub2RlID0gbm9kZUhvbGRlcltyb3ddW2NvbHVtbl07CisJCQkJZmluYWwgTGF0TG9uZyBub2RlU2VnbWVudHMgPSBjcmVhdGVOb2RlQm9yZGVyTGF0TG9uZ1NlZ21lbnRzKAorCQkJCQkJcm93LCBub2RlSG9sZGVyLmxlbmd0aCwgY29sdW1uLCBub2RlSG9sZGVyW3Jvd10ubGVuZ3RoKTsKKwkJCQlmaW5hbCBTdHJpbmcgc3BhdGlhbFVSSVN0cmluZyA9IElubGluZUxhdExvbmdEYXRhUHJvdmlkZXIKKwkJCQkJCS5jcmVhdGVTcGF0aWFsSW5saW5lVVJJU3RyaW5nKG5vZGVTZWdtZW50cyk7CisJCQkJbm9kZS5nZXREdWJsaW5Db3JlKCkuc2V0U3BhdGlhbChzcGF0aWFsVVJJU3RyaW5nKTsKKwkJCX0gLy8gZm9yIGVhY2ggY29sdW1uCisJCX0gLy8gZm9yIGVhY2ggcm93CisKKwkJLy8gTm93IGRvIGFsbCB0aGUgZWRnZXMsIHdlJ2xsIHN0YXJ0IGluIHRoZSB1cHBlciByaWdodCBhbmQgZG8gZWRnZXMKKwkJLy8gYmV0d2VlbiBzdWNjZXNzaXZlIHBhaXJzIG9mIG5vZGVzLgorCQlmb3IgKGludCByb3cgPSAwOyByb3cgPCBub2RlSG9sZGVyLmxlbmd0aCAtIDE7IHJvdysrKSB7CisJCQlmb3IgKGludCBjb2x1bW4gPSAwOyBjb2x1bW4gPCBub2RlSG9sZGVyW3Jvd10ubGVuZ3RoIC0gMTsgY29sdW1uKyspIHsKKworCQkJCS8vIEZpcnN0IGRvIHRoZSBlZGdlcyB0byB0aGUgcmlnaHQKKwkJCQlmaW5hbCBMYXRMb25nIGVkZ2VTZWdtZW50c1JpZ2h0ID0gY3JlYXRlRWRnZUxhdExvbmdTZWdtZW50cygKKwkJCQkJCXJvdywgY29sdW1uLCByb3csIGNvbHVtbiArIDEsIG5vZGVIb2xkZXIubGVuZ3RoLAorCQkJCQkJbm9kZUhvbGRlcltyb3ddLmxlbmd0aCk7CisKKwkJCQlmaW5hbCBTdHJpbmcgZWRnZVNwYXRpYWxBdHRyaWJ1dGVSaWdodCA9IElubGluZUxhdExvbmdEYXRhUHJvdmlkZXIKKwkJCQkJCS5jcmVhdGVTcGF0aWFsSW5saW5lVVJJU3RyaW5nKGVkZ2VTZWdtZW50c1JpZ2h0KTsKKworCQkJCWZvciAoRWRnZSBlZGdlIDogZ2V0RWRnZXNCZXR3ZWVuTm9kZXMobm9kZUhvbGRlcltyb3ddW2NvbHVtbl0sCisJCQkJCQlub2RlSG9sZGVyW3Jvd11bY29sdW1uICsgMV0pKSB7CisJCQkJCWVkZ2UuZ2V0RHVibGluQ29yZSgpLnNldFNwYXRpYWwoZWRnZVNwYXRpYWxBdHRyaWJ1dGVSaWdodCk7CisJCQkJfQorCisJCQkJLy8gVGhlbiBkbyB0aGUgZWRnZXMgYmVsb3cKKwkJCQlmaW5hbCBMYXRMb25nIGVkZ2VTZWdtZW50c0JlbG93ID0gY3JlYXRlRWRnZUxhdExvbmdTZWdtZW50cygKKwkJCQkJCXJvdywgY29sdW1uLCByb3cgKyAxLCBjb2x1bW4sIG5vZGVIb2xkZXIubGVuZ3RoLAorCQkJCQkJbm9kZUhvbGRlcltyb3ddLmxlbmd0aCk7CisKKwkJCQlmaW5hbCBTdHJpbmcgZWRnZVNwYXRpYWxBdHRyaWJ1dGVCZWxvdyA9IElubGluZUxhdExvbmdEYXRhUHJvdmlkZXIKKwkJCQkJCS5jcmVhdGVTcGF0aWFsSW5saW5lVVJJU3RyaW5nKGVkZ2VTZWdtZW50c0JlbG93KTsKKworCQkJCWZvciAoRWRnZSBlZGdlIDogZ2V0RWRnZXNCZXR3ZWVuTm9kZXMobm9kZUhvbGRlcltyb3ddW2NvbHVtbl0sCisJCQkJCQlub2RlSG9sZGVyW3JvdyArIDFdW2NvbHVtbl0pKSB7CisJCQkJCWVkZ2UuZ2V0RHVibGluQ29yZSgpLnNldFNwYXRpYWwoZWRnZVNwYXRpYWxBdHRyaWJ1dGVCZWxvdyk7CisJCQkJfQorCQkJfSAvLyBmb3IgZWFjaCBjb2x1bW4KKwkJfSAvLyBmb3IgZWFjaCByb3cKKworCX0gLy8gYWRkU3BhdGlhbFNwZWNpZmljYXRpb25zCisKKwkvKioKKwkgKiBAcGFyYW0gbm9kZTEKKwkgKiBAcGFyYW0gbm9kZTIKKwkgKiBAcmV0dXJuIGFsbCB0aGUgZWRnZXMgYmV0d2VlbiB0aGUgdHdvIG5vZGVzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxFZGdlPiBnZXRFZGdlc0JldHdlZW5Ob2RlcyhOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB7CisJCWZpbmFsIExpc3Q8RWRnZT4gcmV0VmFsdWUgPSBuZXcgQXJyYXlMaXN0PEVkZ2U+KCk7CisJCWZvciAoSXRlcmF0b3IgZWRnZUl0ZXJhdG9yID0gbm9kZTEuZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBlZGdlSXRlcmF0b3IKKwkJCQkuaGFzTmV4dCgpOykgeworCQkJZmluYWwgRWRnZSBlZGdlID0gKEVkZ2UpIGVkZ2VJdGVyYXRvci5uZXh0KCk7CisJCQlpZiAoZWRnZS5nZXRPdGhlck5vZGUobm9kZTEpID09IG5vZGUyKSB7CisJCQkJcmV0VmFsdWUuYWRkKGVkZ2UpOworCQkJfQorCQl9CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldEVkZ2VzQmV0d2Vlbk5vZGVzCisKKwkvKioKKwkgKiBAcGFyYW0gcm93CisJICogICAgICAgICAgICB0aGUgcm93IGluIHRoZSBsYXR0aWNlIG9mIHRoZSBub2RlCisJICogQHBhcmFtIG51bVJvd3MKKwkgKiAgICAgICAgICAgIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cyBpbiB0aGUgbGF0dGljZQorCSAqIEBwYXJhbSBjb2x1bW4KKwkgKiAgICAgICAgICAgIHRoZSBjb2x1bW4gaW4gdGhlIGxhdHRpY2Ugb2YgdGhlIG5vZGUKKwkgKiBAcGFyYW0gbnVtQ29sdW1ucworCSAqICAgICAgICAgICAgdGhlIHRvdGFsIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBsYXR0aWNlCisJICogQHJldHVybiBhIGxpc3Qgb2YgbGF0L2xvbmcgcG9seWdvbnMvbGluZXMgZm9yIHRoZSBub2RlCisJICovCisJcHJpdmF0ZSBzdGF0aWMgTGF0TG9uZyBjcmVhdGVOb2RlQm9yZGVyTGF0TG9uZ1NlZ21lbnRzKGZpbmFsIGludCByb3csCisJCQlmaW5hbCBpbnQgbnVtUm93cywgZmluYWwgaW50IGNvbHVtbiwgZmluYWwgaW50IG51bUNvbHVtbnMpIHsKKwkJZmluYWwgTGF0TG9uZyByZXRWYWx1ZSA9IG5ldyBMYXRMb25nKCk7CisJCWZpbmFsIGRvdWJsZSBub2RlTGF0SGVpZ2h0ID0gTEFUSVRVREVfSEVJR0hUIC8gbnVtUm93czsKKwkJZmluYWwgZG91YmxlIG5vZGVMb25nV2lkdGggPSBMT05HSVRVREVfV0lEVEggLyBudW1Db2x1bW5zOworCisJCWZpbmFsIGRvdWJsZSBsb3dlckxlZnRMYXQgPSBNSU5fTEFUSVRVREVfVkFMVUUgKyAobnVtUm93cyAtIHJvdyAtIDEpCisJCQkJKiBub2RlTGF0SGVpZ2h0OworCQlmaW5hbCBkb3VibGUgbG93ZXJMZWZ0TG9uZyA9IE1JTl9MT05HSVRVREVfVkFMVUUgKyBjb2x1bW4KKwkJCQkqIG5vZGVMb25nV2lkdGg7CisKKwkJZmluYWwgZG91YmxlIHVwcGVyUmlnaHRMYXQgPSBsb3dlckxlZnRMYXQgKyBub2RlTGF0SGVpZ2h0OworCQlmaW5hbCBkb3VibGUgdXBwZXJSaWdodExvbmcgPSBsb3dlckxlZnRMb25nICsgbm9kZUxvbmdXaWR0aDsKKworCQlmaW5hbCBTZWdtZW50QnVpbGRlciBzYiA9IG5ldyBTZWdtZW50QnVpbGRlcigpOworCisJCS8vIFdlIGp1c3QgbWFrZSBhIHJlY3RhbmdsZS4uLgorCQlzYi5hZGQobG93ZXJMZWZ0TGF0LCBsb3dlckxlZnRMb25nKTsKKwkJc2IuYWRkKHVwcGVyUmlnaHRMYXQsIGxvd2VyTGVmdExvbmcpOworCQlzYi5hZGQodXBwZXJSaWdodExhdCwgdXBwZXJSaWdodExvbmcpOworCQlzYi5hZGQobG93ZXJMZWZ0TGF0LCB1cHBlclJpZ2h0TG9uZyk7CisJCXNiLmFkZChsb3dlckxlZnRMYXQsIGxvd2VyTGVmdExvbmcpOworCQlyZXRWYWx1ZS5hZGQoc2IudG9TZWdtZW50KCkpOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZU5vZGVCb3JkZXJMYXRMb25nU2VnbWVudHMKKworCS8qKgorCSAqIEBwYXJhbSBub2RlMVJvdworCSAqIEBwYXJhbSBub2RlMUNvbHVtbgorCSAqIEBwYXJhbSBub2RlMlJvdworCSAqIEBwYXJhbSBub2RlMkNvbHVtbgorCSAqIEBwYXJhbSBsZW5ndGgKKwkgKiBAcGFyYW0gbGVuZ3RoMgorCSAqIEByZXR1cm4gYSBsaXN0IG9mIGEgbGF0L2xvbmcgbGluZSBiZXR3ZWVuIHRoZSBjZW50ZXJzIG9mIHRoZSB0d28gbm9kZXMuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgTGF0TG9uZyBjcmVhdGVFZGdlTGF0TG9uZ1NlZ21lbnRzKGludCBub2RlMVJvdywKKwkJCWludCBub2RlMUNvbHVtbiwgaW50IG5vZGUyUm93LCBpbnQgbm9kZTJDb2x1bW4sIGludCBudW1Sb3dzLAorCQkJaW50IG51bUNvbHVtbnMpIHsKKwkJZmluYWwgTGF0TG9uZyByZXRWYWx1ZSA9IG5ldyBMYXRMb25nKCk7CisJCWZpbmFsIGRvdWJsZSBub2RlTGF0SGVpZ2h0ID0gTEFUSVRVREVfSEVJR0hUIC8gbnVtQ29sdW1uczsKKwkJZmluYWwgZG91YmxlIG5vZGVMb25nV2lkdGggPSBMT05HSVRVREVfV0lEVEggLyBudW1Sb3dzOworCisJCWZpbmFsIGRvdWJsZSByZWxhdGl2ZU5vZGVDZW50ZXJMYXQgPSBub2RlTGF0SGVpZ2h0IC8gMi4wOworCQlmaW5hbCBkb3VibGUgcmVsYXRpdmVOb2RlQ2VudGVyTG9uZyA9IG5vZGVMb25nV2lkdGggLyAyLjA7CisKKwkJZmluYWwgZG91YmxlIG5vZGUxTG93ZXJMZWZ0TGF0ID0gTUlOX0xBVElUVURFX1ZBTFVFCisJCQkJKyAobnVtUm93cyAtIG5vZGUxUm93IC0gMSkgKiBub2RlTGF0SGVpZ2h0OworCQlmaW5hbCBkb3VibGUgbm9kZTFMb3dlckxlZnRMb25nID0gTUlOX0xPTkdJVFVERV9WQUxVRSArIG5vZGUxQ29sdW1uCisJCQkJKiBub2RlTG9uZ1dpZHRoOworCisJCWZpbmFsIGRvdWJsZSBub2RlMkxvd2VyTGVmdExhdCA9IE1JTl9MQVRJVFVERV9WQUxVRQorCQkJCSsgKG51bVJvd3MgLSBub2RlMlJvdyAtIDEpICogbm9kZUxhdEhlaWdodDsKKwkJZmluYWwgZG91YmxlIG5vZGUyTG93ZXJMZWZ0TG9uZyA9IE1JTl9MT05HSVRVREVfVkFMVUUgKyBub2RlMkNvbHVtbgorCQkJCSogbm9kZUxvbmdXaWR0aDsKKworCQlmaW5hbCBTZWdtZW50QnVpbGRlciBzYiA9IG5ldyBTZWdtZW50QnVpbGRlcigpOworCQkvLyBXZSBqdXN0IG1ha2UgYSBzdHJhaWdodCBsaW5lIGJldHdlZW4gdGhlIGNlbnRlcnMuLi4KKwkJc2IuYWRkKG5vZGUxTG93ZXJMZWZ0TGF0ICsgcmVsYXRpdmVOb2RlQ2VudGVyTGF0LCBub2RlMUxvd2VyTGVmdExvbmcKKwkJCQkrIHJlbGF0aXZlTm9kZUNlbnRlckxvbmcpOworCQlzYi5hZGQobm9kZTJMb3dlckxlZnRMYXQgKyByZWxhdGl2ZU5vZGVDZW50ZXJMYXQsIG5vZGUyTG93ZXJMZWZ0TG9uZworCQkJCSsgcmVsYXRpdmVOb2RlQ2VudGVyTG9uZyk7CisKKwkJcmV0VmFsdWUuYWRkKHNiLnRvU2VnbWVudCgpKTsKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVFZGdlTGF0TG9uZ1NlZ21lbnRzCisKKwkvKioKKwkgKiBAcGFyYW0gbm9kZTEKKwkgKiBAcGFyYW0gbm9kZTIKKwkgKiBAcGFyYW0gZ3JhcGgKKwkgKiAgICAgICAgICAgIHRoZSBncmFwaCB0byBnZXQgdGhlIGVkZ2VzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRSZWxhdGlvbkVkZ2VzKGZpbmFsIE5vZGUgbm9kZTEsIGZpbmFsIE5vZGUgbm9kZTIsCisJCQlmaW5hbCBHcmFwaCBncmFwaCkgeworCQlmb3IgKEVkZ2UgZWRnZSA6IGNyZWF0ZVJlbGF0aW9uRWRnZXMobm9kZTEsIG5vZGUyKSkgeworCQkJZ3JhcGgucHV0RWRnZShlZGdlKTsKKwkJfQorCX0gLy8gYWRkUmVsYXRpb25FZGdlcworCisJLyoqCisJICogQHBhcmFtIG5vZGUxCisJICogICAgICAgICAgICB0aGUgZmlyc3Qgbm9kZQorCSAqIEBwYXJhbSBub2RlMgorCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBub2RlCisJICogQHJldHVybiBhIGxpc3Qgb2YgZWRnZXMgdGhhdCByZXByZXNlbnQgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0d28KKwkgKiAgICAgICAgIG5vZGVzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxFZGdlPiBjcmVhdGVSZWxhdGlvbkVkZ2VzKGZpbmFsIE5vZGUgbm9kZTEsCisJCQlmaW5hbCBOb2RlIG5vZGUyKSB7CisJCWZpbmFsIExpc3Q8RWRnZT4gcmV0VmFsdWUgPSBuZXcgQXJyYXlMaXN0PEVkZ2U+KCk7CisKKwkJLy8gQWRqYWNlbmN5CisJCXJldFZhbHVlLmFkZChjcmVhdGVBZGphY2VuY3lFZGdlKG5vZGUxLCBub2RlMikpOworCisJCS8vIENvbW1vbiBCb3JkZXIKKwkJcmV0VmFsdWUuYWRkKENvbW1vbkJvcmRlclJlbGF0aW9uc2hpcExhYmVsSW1wbAorCQkJCS5jcmVhdGVDb21tb25Cb3JkZXJSZWxhdGlvbnNoaXAobm9kZTEsIG5vZGUyLAorCQkJCQkJQ09NTU9OX0JPUkRFUl9MRU5HVEgpKTsKKworCQlmaW5hbCBUZXN0RWRnZURlY29yYXRvcjEgdGVkID0gRGVjb3JhdG9yc0ZhY3RvcnkuZUlOU1RBTkNFCisJCS5jcmVhdGVUZXN0RWRnZURlY29yYXRvcjEoKTsKKwkJLy8gQWlyIHRyYW5zcG9ydAorCQlyZXRWYWx1ZS5hZGQoVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsCisJCQkJLmNyZWF0ZVRyYW5zcG9ydFJlbGF0aW9uc2hpcChub2RlMSwgbm9kZTIsCisJCQkJCQlUcmFuc3BvcnRNb2RlLkFJUl9MSVRFUkFMLCBBSVJfVFJBTlNQT1JUX0lELAorCQkJCQkJVEVTVF9QT1BVTEFUSU9OX0lERU5USUZJRVIsCisJCQkJCQlURVNUX1RSQU5TUE9SVF9SQVRFX1RJTUVfUEVSSU9ELAorCQkJCQkJQUlSX1RSQU5TUE9SVF9NQVhfQ0FQQUNJVFksdGVkKSk7CisKKwkJLy8gUm9hZCB0cmFuc3BvcnQKKwkJcmV0VmFsdWUuYWRkKFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSW1wbAorCQkJCS5jcmVhdGVUcmFuc3BvcnRSZWxhdGlvbnNoaXAobm9kZTEsIG5vZGUyLAorCQkJCQkJVHJhbnNwb3J0TW9kZS5ST0FEX0xJVEVSQUwsIFJPQUQxX1RSQU5TUE9SVF9JRCwKKwkJCQkJCVRFU1RfUE9QVUxBVElPTl9JREVOVElGSUVSLCBTVEVNVGltZS5Vbml0cy5EQVkuZ2V0TWlsbGlzZWNvbmRzKCksCisJCQkJCQlST0FEMV9UUkFOU1BPUlRfTUFYX0NBUEFDSVRZLHRlZCkpOworCisJCS8vIFJvYWQgdHJhbnNwb3J0IChvbmUtd2F5KQorCQlyZXRWYWx1ZS5hZGQoVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsCisJCQkJLmNyZWF0ZVRyYW5zcG9ydFJlbGF0aW9uc2hpcChub2RlMSwgbm9kZTIsCisJCQkJCQlUcmFuc3BvcnRNb2RlLlJPQURfTElURVJBTCwgUk9BRDJfVFJBTlNQT1JUX0lELAorCQkJCQkJVEVTVF9QT1BVTEFUSU9OX0lERU5USUZJRVIsCisJCQkJCQlURVNUX1RSQU5TUE9SVF9SQVRFX1RJTUVfUEVSSU9ELAorCQkJCQkJUk9BRDJfVFJBTlNQT1JUX01BWF9DQVBBQ0lUWSwgdHJ1ZSwgdGVkKSk7CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlUmVsYXRpb25FZGdlcworCisJLyoqCisJICogQHBhcmFtIGFyZWEKKwkgKiAgICAgICAgICAgIHRoZSBhcmVhIG9mIHRoZSBub2RlCisJICogQHBhcmFtIG5vZGUKKwkgKiAgICAgICAgICAgIHRoZSBub2RlCisJICogQHJldHVybiBhbiBBcmVhTGFiZWwgZm9yIHRoZSBub2RlCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQXJlYUxhYmVsIGNyZWF0ZUFyZWFMYWJlbChmaW5hbCBkb3VibGUgYXJlYSwgZmluYWwgTm9kZSBub2RlKSB7CisJCWZpbmFsIEFyZWFMYWJlbCByZXRWYWx1ZSA9IExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFyZWFMYWJlbCgpOworCQlyZXRWYWx1ZS5nZXRDdXJyZW50QXJlYVZhbHVlKCkuc2V0QXJlYShhcmVhKTsKKwkJbm9kZS5nZXRMYWJlbHMoKS5hZGQocmV0VmFsdWUpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVBcmVhTGFiZWwKKworCS8qKgorCSAqIEBwYXJhbSBwb3B1bGF0aW9uQ291bnQKKwkgKiAgICAgICAgICAgIG51bWJlciBvZiAoRGVmYXVsdDogaHVtYW4pIHBvcHVsYXRpb24gbWVtYmVycyBhdCB0aGUgbm9kZQorCSAqIEBwYXJhbSBub2RlCisJICogICAgICAgICAgICB0aGUgbm9kZQorCSAqIEByZXR1cm4gYSBwb3B1bGF0aW9uIGxhYmVsCisJICovCisJcHJpdmF0ZSBzdGF0aWMgUG9wdWxhdGlvbkxhYmVsIGNyZWF0ZVBvcHVsYXRpb25MYWJlbCgKKwkJCWZpbmFsIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllciwgZmluYWwgZG91YmxlIHBvcHVsYXRpb25Db3VudCwKKwkJCWZpbmFsIE5vZGUgbm9kZSkgeworCQlmaW5hbCBQb3B1bGF0aW9uTGFiZWwgcmV0VmFsdWUgPSBMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVQb3B1bGF0aW9uTGFiZWwoKTsKKwkJcmV0VmFsdWUuc2V0UG9wdWxhdGlvbklkZW50aWZpZXIocG9wdWxhdGlvbklkZW50aWZpZXIpOworCQlyZXRWYWx1ZS5nZXRDdXJyZW50UG9wdWxhdGlvblZhbHVlKCkuc2V0Q291bnQocG9wdWxhdGlvbkNvdW50KTsKKwkJbm9kZS5nZXRMYWJlbHMoKS5hZGQocmV0VmFsdWUpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVQb3B1bGF0aW9uTGFiZWwKKworCS8qKgorCSAqIENyZWF0ZSBhIHNpbmdsZSBwb3B1bGF0ZWQgbm9kZS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBKVW5pdCB0ZXN0cyBmb3IKKwkgKiBkaXNlYXNlIG1vZGVscyB3aGljaCBuZWVkIHRvIGhhdmUgYSBkaXNlYXNlIG1vZGVsIGxhYmVsIHRoYXQgaGFzIGFuCisJICogYXNzb2NpYXRlZCBub2RlLgorCSAqIAorCSAqIAorCSAqIEByZXR1cm4gYSBub2RlCisJICovCisJcHVibGljIHN0YXRpYyBSZWdpb24gY3JlYXRlUG9wdWxhdGlvblJlZ2lvbk5vZGUoKSB7CisJCXJldHVybiBjcmVhdGVQb3B1bGF0aW9uUmVnaW9uTm9kZShURVNUX1BPUFVMQVRJT05fSURFTlRJRklFUik7CisJfSAvLyBjcmVhdGVQb3B1bGF0aW9uUmVnaW9uTm9kZQorCisJLyoqCisJICogQ3JlYXRlIGEgc2luZ2xlIHBvcHVsYXRlZCBub2RlLiBUaGlzIGlzIHVzZWQgYnkgdGhlIEpVbml0IHRlc3RzIGZvcgorCSAqIGRpc2Vhc2UgbW9kZWxzIHdoaWNoIG5lZWQgdG8gaGF2ZSBhIGRpc2Vhc2UgbW9kZWwgbGFiZWwgdGhhdCBoYXMgYW4KKwkgKiBhc3NvY2lhdGVkIG5vZGUuCisJICogCisJICogQHBhcmFtIHBvcHVsYXRpb25JZGVudGlmaWVyCisJICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBvZiB0aGUgcG9wdWxhdGlvbgorCSAqIAorCSAqIAorCSAqIEByZXR1cm4gYSBub2RlCisJICovCisJcHVibGljIHN0YXRpYyBSZWdpb24gY3JlYXRlUG9wdWxhdGlvblJlZ2lvbk5vZGUoCisJCQlmaW5hbCBTdHJpbmcgcG9wdWxhdGlvbklkZW50aWZpZXIpIHsKKwkJcmV0dXJuIGNyZWF0ZVBvcHVsYXRpb25SZWdpb25Ob2RlKHBvcHVsYXRpb25JZGVudGlmaWVyLAorCQkJCVRFU1RfUE9QVUxBVElPTl9DT1VOVCwgVEVTVF9BUkVBKTsKKwl9IC8vIGNyZWF0ZVBvcHVsYXRpb25SZWdpb25Ob2RlCisKKwkvKioKKwkgKiBDcmVhdGUgYSBzaW5nbGUgcG9wdWxhdGVkIG5vZGUuIFRoaXMgaXMgdXNlZCBieSB0aGUgSlVuaXQgdGVzdHMgZm9yCisJICogZGlzZWFzZSBtb2RlbHMgd2hpY2ggbmVlZCB0byBoYXZlIGEgZGlzZWFzZSBtb2RlbCBsYWJlbCB0aGF0IGhhcyBhbgorCSAqIGFzc29jaWF0ZWQgbm9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbklkZW50aWZpZXIKKwkgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwb3B1bGF0aW9uCisJICogCisJICogQHBhcmFtIHBvcHVsYXRpb25Db3VudAorCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMKKwkgKiBAcGFyYW0gYXJlYQorCSAqICAgICAgICAgICAgdGhlIGFyZWEgb2YgdGhlIG5vZGUgKGttXjIpCisJICogQHJldHVybiBhIG5vZGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlZ2lvbiBjcmVhdGVQb3B1bGF0aW9uUmVnaW9uTm9kZSgKKwkJCWZpbmFsIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllciwgZmluYWwgZG91YmxlIHBvcHVsYXRpb25Db3VudCwKKwkJCWZpbmFsIGRvdWJsZSBhcmVhKSB7CisJCXJldHVybiBjcmVhdGVQb3B1bGF0aW9uUmVnaW9uTm9kZSgwLCAwLCBwb3B1bGF0aW9uSWRlbnRpZmllciwKKwkJCQlwb3B1bGF0aW9uQ291bnQsIGFyZWEpOworCX0gLy8gY3JlYXRlUG9wdWxhdGlvblJlZ2lvbk5vZGUKKworCS8qKgorCSAqIENyZWF0ZSBhIHNpbmdsZSBwb3B1bGF0ZWQgbm9kZS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBKVW5pdCB0ZXN0cyBmb3IKKwkgKiBkaXNlYXNlIG1vZGVscyB3aGljaCBuZWVkIHRvIGhhdmUgYSBkaXNlYXNlIG1vZGVsIGxhYmVsIHRoYXQgaGFzIGFuCisJICogYXNzb2NpYXRlZCBub2RlLgorCSAqIAorCSAqIEBwYXJhbSByb3cKKwkgKiAgICAgICAgICAgIHRoZSByb3cgaW5kZXggb2YgdGhlIG5vZGUKKwkgKiBAcGFyYW0gY29sdW1uCisJICogICAgICAgICAgICB0aGUgY29sdW1uIGluZGV4IG9mIHRoZSBub2RlCisJICogQHBhcmFtIHBvcHVsYXRpb25JZGVudGlmaWVyCisJICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBvZiB0aGUgcG9wdWxhdGlvbgorCSAqIEBwYXJhbSBwb3B1bGF0aW9uQ291bnQKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcG9wdWxhdGlvbiBtZW1iZXJzCisJICogQHBhcmFtIGFyZWEKKwkgKiAgICAgICAgICAgIHRoZSBhcmVhIG9mIHRoZSBub2RlIChrbV4yKQorCSAqIEByZXR1cm4gYSBub2RlCisJICovCisJcHVibGljIHN0YXRpYyBSZWdpb24gY3JlYXRlUG9wdWxhdGlvblJlZ2lvbk5vZGUoZmluYWwgaW50IHJvdywKKwkJCWZpbmFsIGludCBjb2x1bW4sIGZpbmFsIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllciwKKwkJCWZpbmFsIGRvdWJsZSBwb3B1bGF0aW9uQ291bnQsIGZpbmFsIGRvdWJsZSBhcmVhKSB7CisJCWZpbmFsIFJlZ2lvbiByZXRWYWx1ZSA9IGNyZWF0ZVJlZ2lvbk5vZGUocm93LCBjb2x1bW4pOworCisJCS8vIFBvcHVsYXRpb24KKwkJY3JlYXRlUG9wdWxhdGlvbkxhYmVsKHBvcHVsYXRpb25JZGVudGlmaWVyLCBwb3B1bGF0aW9uQ291bnQsIHJldFZhbHVlKTsKKworCQkvLyBBcmVhCisJCWNyZWF0ZUFyZWFMYWJlbChhcmVhLCByZXRWYWx1ZSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZVBvcHVsYXRpb25SZWdpb25Ob2RlCisKKwkvKioKKwkgKiBAcGFyYW0gcm93CisJICogICAgICAgICAgICB0aGUgcm93IG9mIHRoZSBub2RlIGluIHRoZSBsYXR0aWNlCisJICogQHBhcmFtIGNvbHVtbgorCSAqICAgICAgICAgICAgdGhlIGNvbHVtbiBvZiB0aGUgbm9kZSBpbiB0aGUgbGF0dGljZQorCSAqIEByZXR1cm4gYSBub2RlCisJICovCisJcHJpdmF0ZSBzdGF0aWMgUmVnaW9uIGNyZWF0ZVJlZ2lvbk5vZGUoaW50IHJvdywgaW50IGNvbHVtbikgeworCQlmaW5hbCBSZWdpb24gcmV0VmFsdWUgPSBOb2Rlc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlZ2lvbigpOworCisJCWZpbmFsIER1YmxpbkNvcmUgZGMgPSByZXRWYWx1ZS5nZXREdWJsaW5Db3JlKCk7CisJCWRjLnNldFRpdGxlKGNyZWF0ZU5vZGVUaXRsZShyb3csIGNvbHVtbikpOworCQlyZXRWYWx1ZS5zZXRVUkkoY3JlYXRlUmVnaW9uTm9kZVVSSShyb3csIGNvbHVtbikpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVSZWdpb25Ob2RlCisKKwkvKioKKwkgKiBAcGFyYW0gcm93CisJICogICAgICAgICAgICB0aGUgcm93IG9mIHRoZSByZWdpb24gaW4gdGhlIGxhdHRpY2UKKwkgKiBAcGFyYW0gY29sdW1uCisJICogICAgICAgICAgICB0aGUgY29sdW1uIG9mIHRoZSByZWdpb24gaW4gdGhlIGxhdHRpY2UKKwkgKiBAcmV0dXJuIGEgVVJJIGZvciB0aGUgcmVnaW9uIG5vZGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVSZWdpb25Ob2RlVVJJKGludCByb3csIGludCBjb2x1bW4pIHsKKwkJVVJJIHJldFZhbHVlID0gU1RFTVVSSS5jcmVhdGVVUkkoUmVnaW9uLlVSSV9UWVBFX1JFR0lPTl9OT0RFX1NFR01FTlQKKwkJCQkrICIvIiArIHJvdyArICJfIiArIGNvbHVtbik7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZVJlZ2lvbk5vZGVVUkkKKworCS8qKgorCSAqIEBwYXJhbSByb3cKKwkgKiAgICAgICAgICAgIHRoZSByb3cgb2YgdGhlIG5vZGUgaW4gdGhlIGxhdHRpY2UKKwkgKiBAcGFyYW0gY29sdW1uCisJICogICAgICAgICAgICB0aGUgY29sdW1uIG9mIHRoZSBub2RlIGluIHRoZSBsYXR0aWNlCisJICogQHJldHVybiBhIHRpdGxlIGZvciBhIG5vZGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVOb2RlVGl0bGUoaW50IHJvdywgaW50IGNvbHVtbikgeworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIk5vZGVbIik7CisJCXNiLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKHJvdykpOworCQlzYi5hcHBlbmQoIiwgIik7CisJCXNiLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGNvbHVtbikpOworCQlzYi5hcHBlbmQoIl0iKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfSAvLyBjcmVhdGVOb2RlVGl0bGUKKworCS8qKgorCSAqIEBwYXJhbSBudW1Sb3dzCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHJvd3Mgb2Ygbm9kZXMgaW4gdGhlIGxhdHRpY2UKKwkgKiBAcGFyYW0gbnVtQ29sdW1ucworCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIG5vZGVzIGluIHRoZSBsYXR0aWNlCisJICogQHBhcmFtIHBvcHVsYXRpb25Db3VudAorCSAqICAgICAgICAgICAgdGhlIChEZWZhdWx0OiBodW1hbikgcG9wdWxhdGlvbiBhdCBlYWNoIG5vZGUKKwkgKiBAcGFyYW0gYXJlYQorCSAqICAgICAgICAgICAgdGhlIGFyZWEgKGttXjIpIG9mIGVhY2ggbm9kZQorCSAqIEByZXR1cm4gYSB0aXRsZSBmb3IgYSBncmFwaAorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVHcmFwaFRpdGxlKGludCBudW1Sb3dzLCBpbnQgbnVtQ29sdW1ucywKKwkJCWRvdWJsZSBwb3B1bGF0aW9uQ291bnQsIGRvdWJsZSBhcmVhKSB7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiR3JhcGgiKTsKKwkJc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcobnVtUm93cykpOworCQlzYi5hcHBlbmQoIngiKTsKKwkJc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcobnVtQ29sdW1ucykpOworCQlzYi5hcHBlbmQoIlsiKTsKKwkJc2IuYXBwZW5kKERvdWJsZS50b1N0cmluZyhwb3B1bGF0aW9uQ291bnQpKTsKKwkJc2IuYXBwZW5kKCIsICIpOworCQlzYi5hcHBlbmQoYXJlYSk7CisJCXNiLmFwcGVuZCgiXSIpOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9IC8vIGNyZWF0ZUdyYXBoVGl0bGUKKworCS8qKgorCSAqIEBwYXJhbSBub2RlRGVjb3JhdG9ycworCSAqIEBwYXJhbSBudW1Sb3dzCisJICogQHBhcmFtIG51bUNvbHVtbnMKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbkNvdW50CisJICogQHBhcmFtIGFyZWEKKwkgKiBAcmV0dXJuIHRoZSB0aXRsZSBvZiB0aGUgbW9kZWwKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlTW9kZWxUaXRsZSgKKwkJCWZpbmFsIENvbGxlY3Rpb248Tm9kZURlY29yYXRvcj4gbm9kZURlY29yYXRvcnMsIGludCBudW1Sb3dzLAorCQkJaW50IG51bUNvbHVtbnMsIGRvdWJsZSBwb3B1bGF0aW9uQ291bnQsIGRvdWJsZSBhcmVhKSB7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiTW9kZWwiKTsKKwkJc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcobnVtUm93cykpOworCQlzYi5hcHBlbmQoIngiKTsKKwkJc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcobnVtQ29sdW1ucykpOworCQlmb3IgKEl0ZXJhdG9yPE5vZGVEZWNvcmF0b3I+IG5vZGVEZWNvcmF0b3JJdGVyID0gbm9kZURlY29yYXRvcnMKKwkJCQkuaXRlcmF0b3IoKTsgbm9kZURlY29yYXRvckl0ZXIuaGFzTmV4dCgpOykgeworCQkJZmluYWwgTm9kZURlY29yYXRvciBub2RlRGVjb3JhdG9yID0gbm9kZURlY29yYXRvckl0ZXIubmV4dCgpOworCQkJc2IuYXBwZW5kKG5vZGVEZWNvcmF0b3IuZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCkpOworCQl9IC8vIGZvcgorCisJCXNiLmFwcGVuZCgiWyIpOworCQlzYi5hcHBlbmQoRG91YmxlLnRvU3RyaW5nKHBvcHVsYXRpb25Db3VudCkpOworCQlzYi5hcHBlbmQoIiwgIik7CisJCXNiLmFwcGVuZChhcmVhKTsKKwkJc2IuYXBwZW5kKCJdIik7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0gLy8gY3JlYXRlTW9kZWxUaXRsZQorCisJLy8gLyoqCisJLy8gKiBAcGFyYW0gY2Fub25pY2FsU2NlbmFyaW9EZWNvcmF0b3JzCisJLy8gKiBAcGFyYW0gbm9kZURlY29yYXRvcnMKKwkvLyAqIEBwYXJhbSBudW1Sb3dzCisJLy8gKiBAcGFyYW0gbnVtQ29sdW1ucworCS8vICogQHBhcmFtIHBvcHVsYXRpb25Db3VudAorCS8vICogQHBhcmFtIGFyZWEKKwkvLyAqIEByZXR1cm4gdGhlIHRpdGxlIG9mIGEgc2NlbmFyaW8KKwkvLyAqLworCS8vIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVTY2VuYXJpb1RpdGxlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCS8vIENvbGxlY3Rpb248RGVjb3JhdG9yPiBjYW5vbmljYWxTY2VuYXJpb0RlY29yYXRvcnMsCisJLy8gQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJLy8gQ29sbGVjdGlvbjxOb2RlRGVjb3JhdG9yPiBub2RlRGVjb3JhdG9ycywgaW50IG51bVJvd3MsCisJLy8gaW50IG51bUNvbHVtbnMsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCS8vIGRvdWJsZSBwb3B1bGF0aW9uQ291bnQsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCS8vIGRvdWJsZSBhcmVhKSB7CisJLy8gZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJTY2VuYXJpbyIpOworCS8vIHNiLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKG51bVJvd3MpKTsKKwkvLyBzYi5hcHBlbmQoIngiKTsKKwkvLyBzYi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhudW1Db2x1bW5zKSk7CisJLy8gcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJLy8gfSAvLyBjcmVhdGVTY2VuYXJpb1RpdGxlCisKKwkvKioKKwkgKiBAcGFyYW0gbm9kZUEKKwkgKiBAcGFyYW0gbm9kZUIKKwkgKiBAcmV0dXJuIGFuIEVkZ2UgYmV0d2VlbiB0aGUgdHdvIG5vZGVzIGxhYmVsZWQgd2l0aCBhIHJlbGF0aXZlIHBoeXNpY2FsCisJICogICAgICAgICByZWxhdGlvbnNoaXAgbGFiZWwgb2YgImFkamFjZW50IgorCSAqLworCXByaXZhdGUgc3RhdGljIEVkZ2UgY3JlYXRlQWRqYWNlbmN5RWRnZShmaW5hbCBOb2RlIG5vZGVBLCBmaW5hbCBOb2RlIG5vZGVCKSB7CisJCWZpbmFsIEVkZ2UgcmV0VmFsdWUgPSBFZGdlSW1wbC5jcmVhdGVFZGdlKG5vZGVBLCBub2RlQik7CisKKwkJZmluYWwgUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsIGxhYmVsID0gTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlUmVsYXRpdmVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsKCk7CisJCWxhYmVsLnNldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQocmV0VmFsdWUuZ2V0VVJJKCkpOworCQlsYWJlbC5nZXRDdXJyZW50UmVsYXRpb25zaGlwKCkuc2V0QWRqYWNlbnQodHJ1ZSk7CisJCXJldFZhbHVlLnNldExhYmVsKGxhYmVsKTsKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVBZGphY2VuY3lFZGdlCisKKwkvKioKKwkgKiBAcGFyYW0gZ3JhcGgKKwkgKiBAcGFyYW0gcm93CisJICogQHBhcmFtIGNvbHVtbgorCSAqIEByZXR1cm4gdGhlIGluZGV4ZWQgcmVnaW9uIGZyb20gdGhlIGdyYXBoCisJICovCisJcHVibGljIHN0YXRpYyBSZWdpb24gZ2V0UmVnaW9uKGZpbmFsIEdyYXBoIGdyYXBoLCBmaW5hbCBpbnQgcm93LAorCQkJZmluYWwgaW50IGNvbHVtbikgeworCQlSZWdpb24gcmV0VmFsdWUgPSBudWxsOworCisJCWZvciAoSXRlcmF0b3Igbm9kZUl0ZXIgPSBncmFwaC5nZXROb2RlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IG5vZGVJdGVyCisJCQkJLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIFJlZ2lvbiByZWdpb24gPSAoUmVnaW9uKSBub2RlSXRlci5uZXh0KCk7CisJCQlmaW5hbCBTdHJpbmcgbmFtZSA9IHJlZ2lvbi5nZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKTsKKwkJCS8vIElzIHRoaXMgdGhlIHJlZ2lvbiB3ZSdyZSBsb29raW5nIGZvcj8KKwkJCWlmIChuYW1lLmVxdWFscyhEaXNlYXNlTW9kZWxUZXN0VXRpbC5jcmVhdGVOb2RlVGl0bGUocm93LCBjb2x1bW4pKSkgeworCQkJCS8vIFllcworCQkJCXJldFZhbHVlID0gcmVnaW9uOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldFJlZ2lvbgorCisJLyoqCisJICogRXhhbWluZSB0aGUgdHJhbnNwb3J0YXRpb24gZWRnZXMgY29taW5nIGludG8gbm9kZUEgZnJvbSBub2RlQiBhbmQgcmV0dXJuCisJICogdGhlIG9uZSB3aXRoIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllci4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZUEKKwkgKiBAcGFyYW0gbm9kZUIKKwkgKiBAcGFyYW0gdHJhbnNwb3J0SWQKKwkgKiBAcmV0dXJuIHRoZSB0cmFuc3BvcnRhdGlvbiBlZGdlIGJldHdlZW4gdHdvIG5vZGVzIHdpdGggYSBzcGVjaWZpYworCSAqICAgICAgICAgdHJhbnNwb3J0IGlkCisJICovCisJcHVibGljIHN0YXRpYyBFZGdlIGdldFRyYW5zcG9ydEVkZ2UoZmluYWwgTm9kZSBub2RlQSwgZmluYWwgTm9kZSBub2RlQiwKKwkJCWZpbmFsIFN0cmluZyB0cmFuc3BvcnRJZCkgeworCQlFZGdlIHJldFZhbHVlID0gbnVsbDsKKworCQlmb3IgKEVkZ2UgdHJhbnNwb3J0RWRnZSA6IFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsSW1wbAorCQkJCS5nZXRUcmFuc3BvcnRFZGdlc1RvTm9kZShub2RlQSwKKwkJCQkJCURpc2Vhc2VNb2RlbFRlc3RVdGlsLlRFU1RfUE9QVUxBVElPTl9JREVOVElGSUVSKSkgeworCQkJLy8gSXMgdGhpcyBlZGdlIGZyb20gbm9kZUI/CisJCQlpZiAodHJhbnNwb3J0RWRnZS5nZXRPdGhlck5vZGUobm9kZUEpID09IG5vZGVCKSB7CisJCQkJLy8gWWVzCisJCQkJZmluYWwgVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWwgdHJsID0gKFRyYW5zcG9ydFJlbGF0aW9uc2hpcExhYmVsKSB0cmFuc3BvcnRFZGdlCisJCQkJCQkuZ2V0TGFiZWwoKTsKKwkJCQkvLyBEb2VzIHRoaXMgZWRnZSBoYXZlIHRoZSB0cmFuc3BvcnQgaWQgd2UncmUgbG9va2luZyBmb3I/CisJCQkJaWYgKHRybC5nZXRUcmFuc3BvcnRJZGVudGlmaWVyKCkuZXF1YWxzSWdub3JlQ2FzZSh0cmFuc3BvcnRJZCkpIHsKKwkJCQkJLy8gWWVzCisJCQkJCXJldFZhbHVlID0gdHJhbnNwb3J0RWRnZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IC8vIGZvciBlYWNoIHRyYW5zcG9ydCBlZGdlCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldFRyYW5zcG9ydEVkZ2UKKworfSAvLyBEaXNlYXNlTW9kZWxUZXN0VXRpbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvRGlzZWFzZW1vZGVsc0FsbFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9EaXNlYXNlbW9kZWxzQWxsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWY2YTgwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvRGlzZWFzZW1vZGVsc0FsbFRlc3RzLmphdmEKQEAgLTAsMCArMSw2MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3Qgc3VpdGUgZm9yIHRoZSAnPGVtPjxiPkRpc2Vhc2Vtb2RlbHM8L2I+PC9lbT4nCisgKiBtb2RlbC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEaXNlYXNlbW9kZWxzQWxsVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgRGlzZWFzZW1vZGVsc0FsbFRlc3RzKCJEaXNlYXNlbW9kZWxzIFRlc3RzIik7IC8vJE5PTi1OTFMtMSQKKwkJc3VpdGUuYWRkVGVzdChTdGFuZGFyZFRlc3RzLnN1aXRlKCkpOworCQlyZXR1cm4gc3VpdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGlzZWFzZW1vZGVsc0FsbFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworfSAvLyBEaXNlYXNlbW9kZWxzQWxsVGVzdHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0luZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9JbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ODkyODEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9JbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZCQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5mZWN0b3IgSW5vY3VsYXRvciBDb2xsZWN0aW9uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBJbmZlY3RvciBJbm9jdWxhdG9yIENvbGxlY3Rpb24gdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uIGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihJbmZlY3Rvcklub2N1bGF0b3JDb2xsZWN0aW9uVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBJbmZlY3RvciBJbm9jdWxhdG9yIENvbGxlY3Rpb24gdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb25UZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgSW5mZWN0b3IgSW5vY3VsYXRvciBDb2xsZWN0aW9uIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKEluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24gZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgSW5mZWN0b3IgSW5vY3VsYXRvciBDb2xsZWN0aW9uIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbiBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24oKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCit9IC8vSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvblRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0luZmVjdG9yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvSW5mZWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhNjk2ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0luZmVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5JbmZlY3RvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluZmVjdG9yPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW5mZWN0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIEluZmVjdG9yIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSW5mZWN0b3IgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IEluZmVjdG9yIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEluZmVjdG9yVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIEluZmVjdG9yIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKEluZmVjdG9yIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEluZmVjdG9yIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSW5mZWN0b3IgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogdGVzdCB0aGUgc2FuaXR5IG9mIHRoZSBmaXh0dXJlCisJICovCisJcHVibGljIHZvaWQgdGVzdEZpeHR1cmVTYW5pdHkoKSB7CisJCWZpbmFsIEluZmVjdG9yIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoZml4dHVyZS5zYW5lKCkpOworCX0gLy8gdGVzdEZpeHR1cmVTYW5pdHkKK30gLy8gSW5mZWN0b3JUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9JbnRlZ3JhdGlvbkRlY29yYXRvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0ludGVncmF0aW9uRGVjb3JhdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMTc4OGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9JbnRlZ3JhdGlvbkRlY29yYXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDgzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3I7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkludGVncmF0aW9uIERlY29yYXRvcjwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSB0ZXN0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3IjaXNEZXRlcm1pbmlzdGljKCkgPGVtPklzIERldGVybWluaXN0aWM8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW50ZWdyYXRpb25EZWNvcmF0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KKw0KKwkvKioNCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgSW50ZWdyYXRpb24gRGVjb3JhdG9yIHRlc3QgY2FzZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbnRlZ3JhdGlvbkRlY29yYXRvciBmaXh0dXJlID0gbnVsbDsNCisNCisJLyoqDQorCSAqIENvbnN0cnVjdHMgYSBuZXcgSW50ZWdyYXRpb24gRGVjb3JhdG9yIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEludGVncmF0aW9uRGVjb3JhdG9yVGVzdChTdHJpbmcgbmFtZSkgew0KKwkJc3VwZXIobmFtZSk7DQorCX0NCisNCisJLyoqDQorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgSW50ZWdyYXRpb24gRGVjb3JhdG9yIHRlc3QgY2FzZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoSW50ZWdyYXRpb25EZWNvcmF0b3IgZml4dHVyZSkgew0KKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBJbnRlZ3JhdGlvbiBEZWNvcmF0b3IgdGVzdCBjYXNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEludGVncmF0aW9uRGVjb3JhdG9yIGdldEZpeHR1cmUoKSB7DQorCQlyZXR1cm4gZml4dHVyZTsNCisJfQ0KKw0KKwkvKioNCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yI2lzRGV0ZXJtaW5pc3RpYygpIDxlbT5JcyBEZXRlcm1pbmlzdGljPC9lbT59JyBvcGVyYXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvciNpc0RldGVybWluaXN0aWMoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCB0ZXN0SXNEZXRlcm1pbmlzdGljKCkgew0KKwkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgb3BlcmF0aW9uIHRlc3QgbWV0aG9kDQorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVA0KKwkJZmFpbCgpOw0KKwl9DQorDQorfSAvL0ludGVncmF0aW9uRGVjb3JhdG9yVGVzdA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL0ludGVncmF0aW9uTGFiZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9JbnRlZ3JhdGlvbkxhYmVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NjEyZTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9JbnRlZ3JhdGlvbkxhYmVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5JbnRlZ3JhdGlvbkxhYmVsOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlZ3JhdGlvbiBMYWJlbDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbnRlZ3JhdGlvbkxhYmVsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCisNCisJLyoqDQorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIEludGVncmF0aW9uIExhYmVsIHRlc3QgY2FzZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbnRlZ3JhdGlvbkxhYmVsIGZpeHR1cmUgPSBudWxsOw0KKw0KKwkvKioNCisJICogQ29uc3RydWN0cyBhIG5ldyBJbnRlZ3JhdGlvbiBMYWJlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJbnRlZ3JhdGlvbkxhYmVsVGVzdChTdHJpbmcgbmFtZSkgew0KKwkJc3VwZXIobmFtZSk7DQorCX0NCisNCisJLyoqDQorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgSW50ZWdyYXRpb24gTGFiZWwgdGVzdCBjYXNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShJbnRlZ3JhdGlvbkxhYmVsIGZpeHR1cmUpIHsNCisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgSW50ZWdyYXRpb24gTGFiZWwgdGVzdCBjYXNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEludGVncmF0aW9uTGFiZWwgZ2V0Rml4dHVyZSgpIHsNCisJCXJldHVybiBmaXh0dXJlOw0KKwl9DQorDQorfSAvL0ludGVncmF0aW9uTGFiZWxUZXN0DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvSW50ZWdyYXRpb25MYWJlbFZhbHVlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvSW50ZWdyYXRpb25MYWJlbFZhbHVlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZWUwMTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9JbnRlZ3JhdGlvbkxhYmVsVmFsdWVUZXN0LmphdmEKQEAgLTAsMCArMSw2NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkludGVncmF0aW9uTGFiZWxWYWx1ZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlZ3JhdGlvbiBMYWJlbCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEludGVncmF0aW9uTGFiZWxWYWx1ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBJbnRlZ3JhdGlvbiBMYWJlbCBWYWx1ZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEludGVncmF0aW9uTGFiZWxWYWx1ZSBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgSW50ZWdyYXRpb24gTGFiZWwgVmFsdWUgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEludGVncmF0aW9uTGFiZWxWYWx1ZVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBJbnRlZ3JhdGlvbiBMYWJlbCBWYWx1ZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgSW50ZWdyYXRpb24gTGFiZWwgVmFsdWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCit9IC8vSW50ZWdyYXRpb25MYWJlbFZhbHVlVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0VJUkRpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0VJUkRpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiODBlYjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TRUlSRGlzZWFzZU1vZGVsU2NlbmFyaW9UZXN0LmphdmEKQEAgLTAsMCArMSwyMSBAQAorLy8gU0VJUkRpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0IHRlc3QgY2FzZSBmb3IgU0VJUiBEaXNlYXNlIE1vZGVscyBTY2VuYXJpb3MKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNFSVJEaXNlYXNlTW9kZWxTY2VuYXJpb1Rlc3QgZXh0ZW5kcworCQlTSVJEaXNlYXNlTW9kZWxTY2VuYXJpb1Rlc3QgeworCS8vIE5vdGhpbmcKK30gLy8gU0VJUkRpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0VJUkxhYmVsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0VJUkxhYmVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMTAwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TRUlSTGFiZWxUZXN0LmphdmEKQEAgLTAsMCArMSwxNTYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5SZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5EZWNvcmF0b3JzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5UZXN0Tm9kZURlY29yYXRvcjE7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TRUlSIExhYmVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBTRUlSTGFiZWxUZXN0IGV4dGVuZHMgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFRlc3QgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihTRUlSTGFiZWxUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFNFSVIgTGFiZWwgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU0VJUkxhYmVsVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNFSVIgTGFiZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTRUlSTGFiZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChTRUlSTGFiZWwpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKGNyZWF0ZUZpeHR1cmUoKSk7CisJfSAvLyBzZXRVcAorCisJLyoqCisJICogQHJldHVybiBhbiBTRUlSTGFiZWwgaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFNFSVJMYWJlbCBjcmVhdGVGaXh0dXJlKCkgeworCQlmaW5hbCBTRUlSTGFiZWwgcmV0VmFsdWUgPSBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNFSVJMYWJlbCgpOworCQlmaW5hbCBSZWdpb24gbm9kZSA9IERpc2Vhc2VNb2RlbFRlc3RVdGlsCisJCQkJLmNyZWF0ZVBvcHVsYXRpb25SZWdpb25Ob2RlKERpc2Vhc2VNb2RlbFRlc3RVdGlsLlRFU1RfUE9QVUxBVElPTl9JREVOVElGSUVSKTsKKwkJZmluYWwgVGVzdE5vZGVEZWNvcmF0b3IxIHRuZCA9IERlY29yYXRvcnNGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVUZXN0Tm9kZURlY29yYXRvcjEoKTsKKwkJcmV0VmFsdWUuc2V0RGVjb3JhdG9yKHRuZCk7CisJCURpc2Vhc2VNb2RlbExhYmVsVGVzdC5sYWJlbFJlZ2lvbihyZXRWYWx1ZSwKKwkJCQlEaXNlYXNlTW9kZWxUZXN0VXRpbC5URVNUX1BPUFVMQVRJT05fSURFTlRJRklFUiwgbm9kZSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUZpeHR1cmUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsI2dldEN1cnJlbnRTRUlSVmFsdWUoKSA8ZW0+Q3VycmVudCBTRUlSIFZhbHVlPC9lbT59JworCSAqIGZlYXR1cmUgZ2V0dGVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWwjZ2V0Q3VycmVudFNFSVJWYWx1ZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VycmVudFNFSVJWYWx1ZSgpIHsKKwkJZmluYWwgU0VJUkxhYmVsIHNlaXJMYWJlbCA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgU0VJUkxhYmVsVmFsdWUgdmFsdWUgPSBzZWlyTGFiZWwuZ2V0Q3VycmVudFNFSVJWYWx1ZSgpOworCQlhc3NlcnROb3ROdWxsKHZhbHVlKTsKKwl9IC8vIHRlc3RHZXRDdXJyZW50U0VJUlZhbHVlCisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsI2dldE5leHRTRUlSVmFsdWUoKSA8ZW0+TmV4dCBTRUlSIFZhbHVlPC9lbT59JworCSAqIGZlYXR1cmUgZ2V0dGVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWwjZ2V0TmV4dFNFSVJWYWx1ZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TmV4dFNFSVJWYWx1ZSgpIHsKKwkJZmluYWwgU0VJUkxhYmVsIHNlaXJMYWJlbCA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgU0VJUkxhYmVsVmFsdWUgdmFsdWUgPSBzZWlyTGFiZWwuZ2V0TmV4dFNFSVJWYWx1ZSgpOworCQlhc3NlcnROb3ROdWxsKHZhbHVlKTsKKwl9IC8vIHRlc3RHZXROZXh0U0VJUlZhbHVlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWwjc2V0RShkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsI2dldEUoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVJMYWJlbCNzZXROZXh0RShkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsI2dldE5leHRFKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0Q3VycmVudE5leHRTRUlSTGFiZWxFKCkgeworCQlmaW5hbCBTRUlSTGFiZWwgc2VpckxhYmVsID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKHNlaXJMYWJlbC5nZXRFKCkgPT0gMC4wKTsKKwkJYXNzZXJ0VHJ1ZShzZWlyTGFiZWwuZ2V0TmV4dEUoKSA9PSAwLjApOworCQlzZWlyTGFiZWwuc2V0RShTRUlSTGFiZWxWYWx1ZVRlc3QuVEVTVF9FKTsKKwkJc2VpckxhYmVsLnNldE5leHRFKFNFSVJMYWJlbFZhbHVlVGVzdC5URU1QX1RFU1RfRSk7CisJCWFzc2VydFRydWUoc2VpckxhYmVsLmdldEUoKSA9PSBTRUlSTGFiZWxWYWx1ZVRlc3QuVEVTVF9FKTsKKwkJYXNzZXJ0VHJ1ZShzZWlyTGFiZWwuZ2V0TmV4dEUoKSA9PSBTRUlSTGFiZWxWYWx1ZVRlc3QuVEVNUF9URVNUX0UpOworCQlzZWlyTGFiZWwuc2V0TmV4dFZhbHVlVmFsaWQodHJ1ZSk7CisJCXNlaXJMYWJlbC5zd2l0Y2hUb05leHRWYWx1ZSgpOworCQlhc3NlcnRUcnVlKHNlaXJMYWJlbC5nZXRFKCkgPT0gU0VJUkxhYmVsVmFsdWVUZXN0LlRFTVBfVEVTVF9FKTsKKwkJYXNzZXJ0VHJ1ZShzZWlyTGFiZWwuZ2V0TmV4dEUoKSA9PSBTRUlSTGFiZWxWYWx1ZVRlc3QuVEVTVF9FKTsKKwl9IC8vIHRlc3RTZXRHZXRDdXJyZW50TmV4dFNFSVJMYWJlbEUKKworCS8qKgorCSAqIHRlc3QgdGhhdCB0aGUgZml4dHVyZSBpcyBzYW5lCisJICovCisJcHVibGljIHZvaWQgdGVzdEZpeHR1cmVTYW5pdHkoKSB7CisJCWZpbmFsIFNFSVJMYWJlbCBzZWlyTGFiZWwgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoc2VpckxhYmVsLnNhbmUoKSk7CisJfSAvLyB0ZXN0Rml4dHVyZVNhbml0eQorCit9IC8vIFNFSVJMYWJlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NFSVJMYWJlbFZhbHVlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0VJUkxhYmVsVmFsdWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ1Yzg4ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NFSVJMYWJlbFZhbHVlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWxWYWx1ZTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNFSVJMYWJlbFZhbHVlSW1wbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNFSVIgTGFiZWwgVmFsdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFNFSVJMYWJlbFZhbHVlVGVzdCBleHRlbmRzIFNJUkxhYmVsVmFsdWVUZXN0IHsKKwkvKioKKwkgKiBUZXN0IHZhbHVlIGZvciBleHBvc2VkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgVEVTVF9FID0gNDsKKworCS8qKgorCSAqIFRlc3QgdmFsdWUgZm9yIGV4cG9zZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBURU1QX1RFU1RfRSA9IFRFU1RfRSArIDQwOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFNFSVJMYWJlbFZhbHVlVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBTRUlSIExhYmVsIFZhbHVlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNFSVJMYWJlbFZhbHVlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNFSVIgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU0VJUkxhYmVsVmFsdWUgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChTRUlSTGFiZWxWYWx1ZSlmaXh0dXJlOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXByaXZhdGUgU0VJUkxhYmVsVmFsdWUgZ2V0VGVtcEZpeHR1cmUoKSB7CisJCXJldHVybiAoU0VJUkxhYmVsVmFsdWUpIHRlbXBGaXh0dXJlOworCX0gLy8gZ2V0VGVtcEZpeHR1cmUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwkJc2V0VGVtcEZpeHR1cmUoY3JlYXRlVGVtcEZpeHR1cmUoKSk7CisJfSAvLyBzZXR1cAorCisJLyoqCisJICogQHJldHVybiBhIHZhbHVlIGZvciB0ZXN0aW5nCisJICovCisJcHVibGljIHN0YXRpYyBTRUlSTGFiZWxWYWx1ZSBjcmVhdGVGaXh0dXJlKCkgeworCQlmaW5hbCBTRUlSTGFiZWxWYWx1ZUltcGwgcmV0VmFsdWUgPSBuZXcgU0VJUkxhYmVsVmFsdWVJbXBsKFRFU1RfUywKKwkJCQlURVNUX0UsIFRFU1RfSSwgVEVTVF9SLAorCQkJCVRFU1RfRElTRUFTRV9ERUFUSFMpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVTRUlSTGFiZWxWYWx1ZQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY3JlYXRlVGVtcEZpeHR1cmUoKSB7CisJCWZpbmFsIFNFSVJMYWJlbFZhbHVlSW1wbCByZXRWYWx1ZSA9IG5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoVEVNUF9URVNUX1MsCisJCQkJVEVNUF9URVNUX0UsIFRFTVBfVEVTVF9JLCBURU1QX1RFU1RfUiwKKwkJCQkgVEVNUF9URVNUX0RJU0VBU0VfREVBVEhTKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlVGVtcEZpeHR1cmUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJCXNldFRlbXBGaXh0dXJlKG51bGwpOworCX0gLy8gdGVhckRvd24KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZ2V0RXhwZWN0ZWRDb252ZXJ0VG9Tb3VyY2VTdGF0ZXMoCisJCQlTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZml4dHVyZSkgeworCQlmaW5hbCBTRUlSTGFiZWxWYWx1ZSBzZWlyTGFiZWwgPSAoU0VJUkxhYmVsVmFsdWUpIGZpeHR1cmU7CisJCXJldHVybiBuZXcgU0VJUkxhYmVsVmFsdWVJbXBsKHNlaXJMYWJlbC5nZXRFKCksIHNlaXJMYWJlbC5nZXRJKCksCisJCQkJIHNlaXJMYWJlbC5nZXRSKCksIDAsc2VpckxhYmVsLmdldFMoKSwgZml4dHVyZQorCQkJCQkJLmdldERpc2Vhc2VEZWF0aHMoKSk7CisJfSAvLyBnZXRFeHBlY3RlZENvbnZlcnRUb1NvdXJjZVN0YXRlcworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZ2V0RXhwZWN0ZWRGaXh0dXJlQWRkaXRpb25SZXN1bHQoCisJCQlEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGZpeHR1cmUxLCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGZpeHR1cmUyKSB7CisJCWZpbmFsIFNFSVJMYWJlbFZhbHVlIHNlaXJMYWJlbDEgPSAoU0VJUkxhYmVsVmFsdWUpIGZpeHR1cmUxOworCQlmaW5hbCBTRUlSTGFiZWxWYWx1ZSBzZWlyTGFiZWwyID0gKFNFSVJMYWJlbFZhbHVlKSBmaXh0dXJlMjsKKwkJcmV0dXJuIG5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoc2VpckxhYmVsMS5nZXRTKCkgKyBzZWlyTGFiZWwyLmdldFMoKSwKKwkJCQlzZWlyTGFiZWwxLmdldEUoKSArIHNlaXJMYWJlbDIuZ2V0RSgpLCBzZWlyTGFiZWwxLmdldEkoKQorCQkJCQkJKyBzZWlyTGFiZWwyLmdldEkoKSwgc2VpckxhYmVsMS5nZXRSKCkKKwkJCQkJCSsgc2VpckxhYmVsMi5nZXRSKCksIHNlaXJMYWJlbDEuZ2V0RGlzZWFzZURlYXRocygpCisJCQkJCQkrIHNlaXJMYWJlbDIuZ2V0RGlzZWFzZURlYXRocygpKTsKKwl9IC8vIGdldEV4cGVjdGVkRml4dHVyZUFkZGl0aW9uUmVzdWx0CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBnZXRFeHBlY3RlZEZpeHR1cmVTdWJ0cmFjdGlvblJlc3VsdCgKKwkJCURpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZml4dHVyZTEsIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZml4dHVyZTIpIHsKKwkJZmluYWwgU0VJUkxhYmVsVmFsdWUgc2VpckxhYmVsMSA9IChTRUlSTGFiZWxWYWx1ZSkgZml4dHVyZTE7CisJCWZpbmFsIFNFSVJMYWJlbFZhbHVlIHNlaXJMYWJlbDIgPSAoU0VJUkxhYmVsVmFsdWUpIGZpeHR1cmUyOworCQlyZXR1cm4gbmV3IFNFSVJMYWJlbFZhbHVlSW1wbChzZWlyTGFiZWwxLmdldFMoKSAtIHNlaXJMYWJlbDIuZ2V0UygpLAorCQkJCXNlaXJMYWJlbDEuZ2V0RSgpIC0gc2VpckxhYmVsMi5nZXRFKCksIHNlaXJMYWJlbDEuZ2V0SSgpCisJCQkJCQktIHNlaXJMYWJlbDIuZ2V0SSgpLCBzZWlyTGFiZWwxLmdldFIoKQorCQkJCQkJLSBzZWlyTGFiZWwyLmdldFIoKSwgc2VpckxhYmVsMS5nZXREaXNlYXNlRGVhdGhzKCkKKwkJCQkJCS0gc2VpckxhYmVsMi5nZXREaXNlYXNlRGVhdGhzKCkpOworCX0gLy8gZ2V0RXhwZWN0ZWRGaXh0dXJlU3VidHJhY3Rpb25SZXN1bHQKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBkb3VibGUgZ2V0RXhwZWN0ZWRQb3B1bGF0aW9uQ291bnQoRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBmaXh0dXJlKSB7CisJCWZpbmFsIFNFSVJMYWJlbFZhbHVlIHNlaXJMYWJlbCA9IChTRUlSTGFiZWxWYWx1ZSkgZml4dHVyZTsKKwkJcmV0dXJuIHNlaXJMYWJlbC5nZXRTKCkgKyBzZWlyTGFiZWwuZ2V0RSgpICsgc2VpckxhYmVsLmdldEkoKQorCQkJCSsgc2VpckxhYmVsLmdldFIoKTsKKwl9IC8vIGdldEV4cGVjdGVkUG9wdWxhdGlvbkNvdW50CisKK30gLy8gU0VJUkxhYmVsVmFsdWVUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TRUlSTGFiZWxWYWx1ZVRlc3RVdGlsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TRUlSTGFiZWxWYWx1ZVRlc3RVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljNGY0ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NFSVJMYWJlbFZhbHVlVGVzdFV0aWwuamF2YQpAQCAtMCwwICsxLDI2MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLk5vZGVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxTdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TRUlSTGFiZWxJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNFSVJMYWJlbFZhbHVlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSURpc2Vhc2VNb2RlbFN0YXRlSW1wbDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFNFSVJMYWJlbFZhbHVlVGVzdFV0aWwgZXh0ZW5kcyBUZXN0Q2FzZXsKKwkKKwkvKioKKwkgKiBOdW1iZXIgb2YgcmFuZG9tIHZhbHVlcyB0byB0ZXN0IHdpdGgKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNQkVSX09GX1JBTkRPTVMgPSAwOworCisJLyoqCisJICogbWF4IGRvdWJsZSB2YWx1ZSB0byBiZSB1c2VkIGluIHRoZSB0ZXN0CisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIFRFU1RfTUFYX0RPVUJMRV9WQUxVRSA9IDFlMTJkOworCisJLyoqCisJICogbWF4IGxvbmcgdmFsdWUgdG8gYmUgdXNlZCBpbiB0aGUgdGVzdAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVEVTVF9NQVhfTE9OR19WQUxVRSA9IExvbmcuTUFYX1ZBTFVFOworCisJLyoqCisJICogaWYgdGhlcmUgaXMgYSBzeXN0ZW0gcHJvcGVydHkgd2l0aCB0aGlzIHZhbHVlIHRoZW4gdGhlIHRlc3Qgd2lsbCBiZSBjb21wZXJoZW5zaXZlLiBJZiBub3QKKwkgKiB0aGVuIHRoZSB0ZXN0IHdpbGwgY2hlY2sgb25seSBmZXcgY2FzZXMuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBFUkhBTlNJVkVfVEVTVCA9ICJjb21wZXJoZW5zaXZlLnRlc3QiOworCisJcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBjb21wZXJoZW5zaXZlID0gbnVsbDsKKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiB7QGxpbmsgU0VJUkxhYmVsVmFsdWVJbXBsfSBvYmplY3RzLgorCSAqIFNvbWUgb2JqZWN0cyBpbiB0aGUgbGlzdCBhcmUgcmFuZG9tIGFuZCBzb21lIG5vdCByYW5kb20gYXQgYWxsLgorCSAqIFRoZSBvbmVzIHRoYXQgYXJlIG5vdCByYW5kb20gcmVwcmVzZW50cyBleHRyZW1lIGNhc2VzLgorCSAqIFRoZSBudW1lcmljIHZhbHVlcyBmb3IgdGhlIGV4dHJlbWUgY2FzZXMgYXJlIDAuMCwgTUFYX0RPVUJMRSwgYW5kIEkgYWRkZWQgdGhlIG51bWJlciAxLjAuIAorCSAqIFRoZSBudW1iZXIgb2YgcmFuZG9tIG51bWJlcnMgdG8gdGVzdCB3aXRoIGlzIE5VTUJFUl9PRl9SQU5ET01TLgorCSAqIE5vdGUgdGhhdCB3aXRoIE5VTUJFUl9PRl9SQU5ET01TID0gMCB5b3Ugd2lsbCBoYXZlIDQzNzQgcGVybXV0YXRpb25zIG9mIGFsbCB2YWx1ZXMgb2Yge0BTRUlSTGFiZWxWYWx1ZUltcGx9LgorCSAqIElmIHlvdSB3aXNoIHRvIG1ha2UgTlVNQkVSX09GX1JBTkRPTVMgaGlnaGVyIHRoZW4gMCB0aGVuIGJlIHJlYWR5IGZvciBhIGxvbmcgdGVzdCA6LSkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIExpc3Q8U0VJUkxhYmVsVmFsdWVJbXBsPiBjcmVhdGVSYW5kb21TRUlSTGFiZWxWYWx1ZUltcGwoKXsKKwkJUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKKwkJZG91YmxlW10gdmFsdWVzID0gbmV3IGRvdWJsZVszICsgTlVNQkVSX09GX1JBTkRPTVNdOworCQl2YWx1ZXNbMF0gPSAwLjBkOworCQl2YWx1ZXNbMV0gPSBURVNUX01BWF9ET1VCTEVfVkFMVUU7CisJICAgIHZhbHVlc1syXSA9IDEuMGQ7CisJCWZvcihpbnQgaSA9ICh2YWx1ZXMubGVuZ3RoICsgMSk7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspeworCQkJdmFsdWVzW2ldID0gcmFuZG9tLm5leHREb3VibGUoKSAqIFRFU1RfTUFYX0RPVUJMRV9WQUxVRTsKKwkJfQorCQlMaXN0PFNFSVJMYWJlbFZhbHVlSW1wbD4gbW9kZWxMZXZlbFZhbHVlcyA9IG5ldyBMaW5rZWRMaXN0PFNFSVJMYWJlbFZhbHVlSW1wbD4oKTsKKwkJaW50IGl0ZXJhdGlvbiA9IDA7CisJCWZvcihkb3VibGUgcyA6IHZhbHVlcyl7CisJCQlmb3IoZG91YmxlIGUgOiB2YWx1ZXMpeworCQkJCWZvcihkb3VibGUgaSA6IHZhbHVlcyl7CisJCQkJCWZvcihkb3VibGUgciA6IHZhbHVlcyl7CisJCQkJCQlmb3IoZG91YmxlIGJpcnRocyA6IHZhbHVlcyl7CisJCQkJCQkJZm9yKGRvdWJsZSBkZWF0aHMgOiB2YWx1ZXMpeworCQkJCQkJCQlmb3IoZG91YmxlIGRpc2Vhc2VEZWF0aHMgOiB2YWx1ZXMpeworCQkJCQkJCQkJaWYoZGlzZWFzZURlYXRocyA+IGRlYXRocyl7CisJCQkJCQkJCQkJY29udGludWU7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlpZihza2lwVmFsdWVTZXQoaXRlcmF0aW9uKyssIGRpc2Vhc2VEZWF0aHMsIGRlYXRocywgcywgZSwgaSwgcikpeworCQkJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCQkJfQorCQkJCQkJCQkJU0VJUkxhYmVsVmFsdWVJbXBsIG1vZGVsTGFibGVWYWx1ZSA9IG5ldyBTRUlSTGFiZWxWYWx1ZUltcGwocywgZSwgaSwgciwgZGlzZWFzZURlYXRocyk7CisJCQkJCQkJCQlhc3NlcnRUcnVlKCJUaGUgU0VJUkxhYmVsVmFsdWVJbXBsOiAiICsgbW9kZWxMYWJsZVZhbHVlICsgIiBpcyBpbnNhbmUhIiwgbW9kZWxMYWJsZVZhbHVlLnNhbmUoKSk7CisJCQkJCQkJCQltb2RlbExldmVsVmFsdWVzLmFkZChtb2RlbExhYmxlVmFsdWUpOworCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKG1vZGVsTGV2ZWxWYWx1ZXMuc2l6ZSgpKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCXJldHVybiBtb2RlbExldmVsVmFsdWVzOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNraXBWYWx1ZVNldChkb3VibGUgaXRlcmF0aW9uLCBkb3VibGUgZGlzZWFzZURlYXRocywgZG91YmxlIGRlYXRocywgZG91YmxlIHMsIGRvdWJsZSBlLCBkb3VibGUgaSwgZG91YmxlIHIpIHsKKwkJaWYoIWlzQ29tcGVyaGVuc2l2ZSgpKXsKKwkJCWlmKGl0ZXJhdGlvbiAlIDUwMCA+IDEpeworCQkJCS8vZG8gb25seSBvbmUgb2YgYW55IDUwMCBwZXJtdXRhdGlvbnMKKwkJCQlTeXN0ZW0ub3V0LnByaW50KCIuIik7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJaWYoZGlzZWFzZURlYXRocyA+IGRlYXRocyl7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlkb3VibGUgcG9wdWxhdGlvbiA9IHMgKyBpICsgcjsKKwkJaWYoZGVhdGhzID4gcG9wdWxhdGlvbil7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZihkaXNlYXNlRGVhdGhzID4gcG9wdWxhdGlvbil7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb21wZXJoZW5zaXZlKCkgeworCQlpZihudWxsICE9IGNvbXBlcmhlbnNpdmUgKXsKKwkJCXJldHVybiBjb21wZXJoZW5zaXZlLmJvb2xlYW5WYWx1ZSgpOworCQl9CisJCVN0cmluZyBjb21wZXJoZW5zaXZlUHJvcGVydHkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQ09NUEVSSEFOU0lWRV9URVNUKTsKKwkJaWYobnVsbCAhPSBjb21wZXJoZW5zaXZlUHJvcGVydHkpeworCQkJY29tcGVyaGVuc2l2ZVByb3BlcnR5ID0gY29tcGVyaGVuc2l2ZVByb3BlcnR5LnRyaW0oKTsKKwkJCWlmKGNvbXBlcmhlbnNpdmVQcm9wZXJ0eS5lcXVhbHNJZ25vcmVDYXNlKCJ5ZXMiKSB8fCBjb21wZXJoZW5zaXZlUHJvcGVydHkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKXsJCQkKKwkJCQljb21wZXJoZW5zaXZlID0gbmV3IEJvb2xlYW4odHJ1ZSk7CisJCQl9CisJCX0KKwkJaWYobnVsbCA9PSBjb21wZXJoZW5zaXZlICl7CisJCQljb21wZXJoZW5zaXZlID0gbmV3IEJvb2xlYW4oZmFsc2UpOworCQl9CisJCXJldHVybiBjb21wZXJoZW5zaXZlLmJvb2xlYW5WYWx1ZSgpOworCX0KKwkvKioKKwkgKiBDbG9uZSB0aGUgU0VJUkxhYmVsVmFsdWVJbXBsCisJICogQHBhcmFtIG9yaWdpbmFsIHdpbGwgbm90IGJlIG1vZGVmaWxlcworCSAqIEByZXR1cm4gYSBjbG9uZSBvZiAnb3JpZ2luYWwnCisJICovCisJcHVibGljIHN0YXRpYyBTRUlSTGFiZWxWYWx1ZUltcGwgY2xvbmVTRUlSTGFiZWxWYWx1ZUltcGwoU0VJUkxhYmVsVmFsdWVJbXBsIG9yaWdpbmFsKXsKKwkJU0VJUkxhYmVsVmFsdWVJbXBsIHZhbHVlID0gIG5ldyBTRUlSTGFiZWxWYWx1ZUltcGwob3JpZ2luYWwuZ2V0UygpLCBvcmlnaW5hbC5nZXRFKCksIG9yaWdpbmFsLmdldEkoKSwgIAorCQkJCW9yaWdpbmFsLmdldFIoKSwgIG9yaWdpbmFsLmdldERpc2Vhc2VEZWF0aHMoKSk7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiB7QGxpbmsgU0VJUkxhYmVsSW1wbH0gb2JqZWN0cy4KKwkgKiBTb21lIG9iamVjdHMgaW4gdGhlIGxpc3QgYXJlIHJhbmRvbSBhbmQgc29tZSBub3QgcmFuZG9tIGF0IGFsbC4KKwkgKiBUaGUgb25lcyB0aGF0IGFyZSBub3QgcmFuZG9tIHJlcHJlc2VudHMgZXh0cmVtZSBjYXNlcy4KKwkgKiBUaGUgbnVtZXJpYyB2YWx1ZXMgZm9yIHRoZSBleHRyZW1lIGNhc2VzIGFyZSAwLjAsIE1BWF9ET1VCTEUsIGFuZCBJIGFkZGVkIHRoZSBudW1iZXIgMS4wLiAKKwkgKiBUaGUgbnVtYmVyIG9mIHJhbmRvbSBudW1iZXJzIHRvIHRlc3Qgd2l0aCBpcyBOVU1CRVJfT0ZfUkFORE9NUy4KKwkgKiBOb3RlIHRoYXQgd2l0aCBOVU1CRVJfT0ZfUkFORE9NUyA9IDAgeW91IHdpbGwgaGF2ZSA0Mzc0IHBlcm11dGF0aW9ucyBvZiBhbGwgdmFsdWVzIG9mIHtTRUlSTGFiZWxJbXBsfS4KKwkgKiBJZiB5b3Ugd2lzaCB0byBtYWtlIE5VTUJFUl9PRl9SQU5ET01TIGhpZ2hlciB0aGVuIDAgdGhlbiBiZSByZWFkeSBmb3IgYSBsb25nIHRlc3QgOi0pCisJICogCisJICovCisJcHVibGljIExpc3Q8U0VJUkxhYmVsSW1wbD4gY3JlYXRlUmFuZG9tU0VJUkxhYmVsSW1wbCgpeworCQlSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOworCQlkb3VibGVbXSB2YWx1ZXMgPSBuZXcgZG91YmxlWzMgKyBOVU1CRVJfT0ZfUkFORE9NU107CisJCXZhbHVlc1swXSA9IDAuMGQ7CisJCXZhbHVlc1sxXSA9IFRFU1RfTUFYX0RPVUJMRV9WQUxVRTsKKwkJdmFsdWVzWzJdID0gMS4wZDsKKwkJZm9yKGludCBpID0gMzsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKyl7CisJCQl2YWx1ZXNbaV0gPSByYW5kb20ubmV4dERvdWJsZSgpICogVEVTVF9NQVhfRE9VQkxFX1ZBTFVFOworCQl9CisJCUxpc3Q8U0VJUkxhYmVsSW1wbD4gbW9kZWxMZXZlbFZhbHVlcyA9IG5ldyBMaW5rZWRMaXN0PFNFSVJMYWJlbEltcGw+KCk7CisJCWludCBpdGVyYXRpb24gPSAwOworCQlmb3IoZG91YmxlIHMgOiB2YWx1ZXMpeworCQkJZm9yKGRvdWJsZSBlIDogdmFsdWVzKXsKKwkJCQlmb3IoZG91YmxlIGkgOiB2YWx1ZXMpeworCQkJCQlmb3IoZG91YmxlIHIgOiB2YWx1ZXMpeworCQkJCQkJZm9yKGRvdWJsZSBiaXJ0aHMgOiB2YWx1ZXMpeworCQkJCQkJCWZvcihkb3VibGUgZGVhdGhzIDogdmFsdWVzKXsKKwkJCQkJCQkJZm9yKGRvdWJsZSBkaXNlYXNlRGVhdGhzIDogdmFsdWVzKXsKKwkJCQkJCQkJCWlmKHNraXBWYWx1ZVNldChpdGVyYXRpb24rKywgZGlzZWFzZURlYXRocywgZGVhdGhzLCBzLCBlLCBpLCByKSl7CisJCQkJCQkJCQkJY29udGludWU7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlTRUlSTGFiZWxJbXBsIG1vZGVsTGFibGUgPSBuZXcgU0VJUkxhYmVsVGVzdGVySW1wbChzLCBlLCBpLCByLCBiaXJ0aHMsIGRlYXRocywJZGlzZWFzZURlYXRocywgCisJCQkJCQkJCQkJCW5ldyBTSURpc2Vhc2VNb2RlbFN0YXRlVGVzdGVySW1wbCgpLCBuZXcgTm9kZVRlc3RlckltcGwoKSk7CisJCQkJCQkJCQlhc3NlcnRUcnVlKCJUaGUgU0VJUkxhYmVsSW1wbDogIiArIG1vZGVsTGFibGUgKyAiIGlzIGluc2FuZSEiLCBtb2RlbExhYmxlLnNhbmUoKSk7CisJCQkJCQkJCQltb2RlbExldmVsVmFsdWVzLmFkZChtb2RlbExhYmxlKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCXJldHVybiBtb2RlbExldmVsVmFsdWVzOworCX0KKwkKKwkKKworCXByaXZhdGUgY2xhc3MgU0lEaXNlYXNlTW9kZWxTdGF0ZVRlc3RlckltcGwgZXh0ZW5kcyBTSURpc2Vhc2VNb2RlbFN0YXRlSW1wbHsKKwkJcHVibGljIFNJRGlzZWFzZU1vZGVsU3RhdGVUZXN0ZXJJbXBsKCl7CisJCQlzdXBlcigpOworCQl9CisJfQorCQorCQorCXByaXZhdGUgY2xhc3MgU0VJUkxhYmVsVGVzdGVySW1wbCBleHRlbmRzIFNFSVJMYWJlbEltcGx7CisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZXMgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisJCSAqIAorCQkgKiBAcGFyYW0gcworCQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc3VzY2VwdGlibGUgcG9wdWxhdGlvbiBtZW1iZXJzCisJCSAqIEBwYXJhbSBlCisJCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBleHBvc2VkIHBvcHVsYXRpb24gbWVtYmVycworCQkgKiBAcGFyYW0gaVIKKwkJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHJlY292ZXJpbmcgaW5mZWN0aW91cyBwb3B1bGF0aW9uIG1lbWJlcnMKKwkJICogQHBhcmFtIGlGCisJCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBmYXRhbGx5IGluZmVjdGlvdXMgcG9wdWxhdGlvbiBtZW1iZXJzCisJCSAqIEBwYXJhbSByCisJCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiByZWNvdmVyZWQgcG9wdWxhdGlvbiBtZW1iZXJzCisJCSAqIEBwYXJhbSBiaXJ0aHMKKwkJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJpcnRocyB0aGF0IGhhdmUgb2NjdXJlZCBpbiB0aGUgcG9wdWxhdGlvbgorCQkgKiBAcGFyYW0gZGVhdGhzCisJCSAqICAgICAgICAgICAgdGhlIHRvdGFsIG51bWJlciBvZiBkZWF0aHMgdGhhdCBoYXZlIG9jY3VyZWQgaW4gdGhlIHBvcHVsYXRpb24KKwkJICogQHBhcmFtIGRpc2Vhc2VEZWF0aHMKKwkJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGRlYXRocyBkdWUgdG8gdGhlIGRpc2Vhc2UgdGhhdCBoYXZlIG9jY3VyZWQgaW4KKwkJICogICAgICAgICAgICB0aGUgcG9wdWxhdGlvbgorCQkgKiAKKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBwYXJhbSBuZXdEaXNlYXNlTW9kZWxTdGF0ZSAKKwkJICogQHBhcmFtIG5ld05vZGUgCisJCSAqLworCQlwdWJsaWMgU0VJUkxhYmVsVGVzdGVySW1wbChmaW5hbCBkb3VibGUgcywgZmluYWwgZG91YmxlIGUsIGZpbmFsIGRvdWJsZSBpLAorCQkJCWZpbmFsIGRvdWJsZSByLCBmaW5hbCBkb3VibGUgYmlydGhzLCBmaW5hbCBkb3VibGUgZGVhdGhzLAorCQkJCWZpbmFsIGRvdWJsZSBkaXNlYXNlRGVhdGhzLCBmaW5hbCBEaXNlYXNlTW9kZWxTdGF0ZSBuZXdEaXNlYXNlTW9kZWxTdGF0ZSwgTm9kZSBuZXdOb2RlKSB7CisJCQlzdXBlcigpOworCQkJc2V0UyhzKTsKKwkJCXNldEUoZSk7CisJCQlzZXRJKGkpOworCQkJc2V0UihyKTsKKwkJCXNldERpc2Vhc2VEZWF0aHMoZGlzZWFzZURlYXRocyk7CisJCQlzZXREaXNlYXNlTW9kZWxTdGF0ZShuZXdEaXNlYXNlTW9kZWxTdGF0ZSk7CisJCQlzZXROb2RlKG5ld05vZGUpOworCQl9IC8vIFNFSVJMYWJlbFZhbHVlSW1wbAkKKwl9CisKKwlwcml2YXRlIGNsYXNzIE5vZGVUZXN0ZXJJbXBsIGV4dGVuZHMgTm9kZUltcGx7CisJCXB1YmxpYyBOb2RlVGVzdGVySW1wbCgpeworCQkJc3VwZXIoKTsKKwkJfQorCX0KKwkKKwkKKwlwdWJsaWMgbG9uZ1tdIGNyZWF0ZXJhbmRvbURlbHRhcygpIHsKKwkJUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKKwkJbG9uZ1tdIHZhbHVlcyA9IG5ldyBsb25nWzIgKyBOVU1CRVJfT0ZfUkFORE9NU107CisJCXZhbHVlc1swXSA9IFRFU1RfTUFYX0xPTkdfVkFMVUU7CisJCXZhbHVlc1sxXSA9IDFsOworCQlmb3IoaW50IGkgPSAzOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKXsKKwkJCXZhbHVlc1tpXSA9IHJhbmRvbS5uZXh0TG9uZygpICogVEVTVF9NQVhfTE9OR19WQUxVRTsKKwkJfQorCQlyZXR1cm4gdmFsdWVzOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NFSVJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TRUlSVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZTc3MTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TRUlSVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNFSVI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBhcmUgdGVzdGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSI2dldEFkanVzdGVkSW5jdWJhdGlvblJhdGUobG9uZykgPGVtPkdldCBBZGp1c3RlZCBJbmN1YmF0aW9uIFJhdGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNFSVJUZXN0IGV4dGVuZHMgU0lSVGVzdCB7CisKKwkvKioKKwkgKiBUaGlzIGNvZWZmaWNpZW50IGRldGVybWluZXMgdGhlIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgaW4gdGhlCisJICogPGVtPkV4cG9zZWQ8L2VtPiBzdGF0ZSB0aGF0IGJlY29tZSBpbmZlY3RlZCBwZXIgcG9wdWxhdGlvbiBtZW1iZXIgaW4KKwkgKiB0aGUgPGVtPkV4cG9zZWQ8L2VtPiBzdGF0ZSwgcGVyIHRpbWUgcGVyaW9kLiBVbml0czogcG9wdWxhdGlvbiBtZW1iZXJzCisJICogCisJICogQHNlZSBTRUlSI2dldEluY3ViYXRpb25SYXRlKCkKKwkgKi8KKwlmaW5hbCBwdWJsaWMgc3RhdGljIGRvdWJsZSBJTkNVQkFUSU9OX1JBVEUgPSAwLjE7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFNFSVIgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTRUlSVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUiNnZXRBZGp1c3RlZEluY3ViYXRpb25SYXRlKGxvbmcpIDxlbT5HZXQgQWRqdXN0ZWQgSW5jdWJhdGlvbiBSYXRlPC9lbT59JworCSAqIG9wZXJhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUiNnZXRBZGp1c3RlZEluY3ViYXRpb25SYXRlKGxvbmcpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0QWRqdXN0ZWRJbmN1YmF0aW9uUmF0ZV9fbG9uZygpIHsKKwkJZmluYWwgU0VJUiBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKERpc2Vhc2VNb2RlbFRlc3RVdGlsLmNsb3NlRW5vdWdoKGZpeHR1cmUKKwkJCQkuZ2V0QWRqdXN0ZWRJbmN1YmF0aW9uUmF0ZSgyICogZml4dHVyZS5nZXRUaW1lUGVyaW9kKCkpLAorCQkJCSgyICogZml4dHVyZS5nZXRJbmN1YmF0aW9uUmF0ZSgpKSkpOworCX0gLy8gdGVzdEdldEFkanVzdGVkSW5jdWJhdGlvblJhdGVfX2xvbmcKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU0VJUiB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFNFSVIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChTRUlSKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogQHJldHVybiBhIGRpc2Vhc2UgbW9kZWwgbGFiZWwgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGVzdGluZworCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXByaXZhdGUgU0VJUkxhYmVsIGdldExhYmVsRml4dHVyZSgpIHsKKwkJcmV0dXJuIChTRUlSTGFiZWwpIGxhYmVsRml4dHVyZTsKKwl9IC8vIGdldExhYmVsRml4dHVyZQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBnZXREaXNlYXNlTW9kZWxMYWJlbENsYXNzKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTRUlSTGFiZWwoKTsKKwl9IC8vIGdldERpc2Vhc2VNb2RlbExhYmVsQ2xhc3MKKworCS8qKgorCSAqIEByZXR1cm4gYSBsYWJlbCB2YWx1ZSBmb3IgdGVzdGluZworCSAqLworCXB1YmxpYyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGNyZWF0ZUxhYmVsRml4dHVyZSgpIHsKKwkJcmV0dXJuIFNFSVJMYWJlbFRlc3QuY3JlYXRlRml4dHVyZSgpOworCX0gLy8gY3JlYXRlTGFiZWxWYWx1ZUZpeHR1cmUKKworfSAvLyBTRUlSVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0lEaXNlYXNlTW9kZWxTY2VuYXJpb1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NJRGlzZWFzZU1vZGVsU2NlbmFyaW9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0ODg3ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NJRGlzZWFzZU1vZGVsU2NlbmFyaW9UZXN0LmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8vIFNJRGlzZWFzZU1vZGVsU2NlbmFyaW9UZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0k7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJSW5mZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgSlVuaXQgdGVzdCBjYXNlIGZvciBTSSBEaXNlYXNlIE1vZGVsIFNjZW5hcmlvcworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU0lEaXNlYXNlTW9kZWxTY2VuYXJpb1Rlc3QgZXh0ZW5kcworCQlTdGFuZGFyZERpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdCB7CisKKwkvKioKKwkgKiBUaGUgcm93IGluZGV4IG9mIHRoZSByZWdpb24gdG8gYmUgaW5mZWN0ZWQuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GRUNUSU9OX1JPV19JTkRFWCA9IDA7CisKKwkvKioKKwkgKiBUaGUgY29sdW1uIGluZGV4IG9mIHRoZSByZWdpb24gdG8gZSBpbmZlY3RlZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZFQ1RJT05fQ09MVU1OX0lOREVYID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2YgcG9wdWxhdGlvbiBtZW1iZXJzIHRvIGluZmVjdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1CRVJfVE9fSU5GRUNUID0gMTsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzLkRpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdCNnZXRTY2VuYXJpb0RlY29yYXRvcnMoTW9kZWwpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIENvbGxlY3Rpb248RGVjb3JhdG9yPiBnZXRTY2VuYXJpb0RlY29yYXRvcnMoZmluYWwgTW9kZWwgbW9kZWwpIHsKKwkJcmV0dXJuIGNyZWF0ZUluZmVjdG9ycyhtb2RlbCk7CisJfSAvLyBnZXRTY2VuYXJpb0RlY29yYXRvcnMKKworCS8qKgorCSAqIENyZWF0ZSBhbiBpbmZlY3RvciBmb3IgZWFjaCBkaXNlYXNlIG1vZGVsIGluIGEgbW9kZWwgZm9yIHRoZSBzaW5nbGUgbm9kZSBbe0BsaW5rICNJTkZFQ1RJT05fUk9XX0lOREVYfV1be0BsaW5rICNJTkZFQ1RJT05fQ09MVU1OX0lOREVYfV0KKwkgKiAKKwkgKiBAcGFyYW0gbW9kZWwKKwkgKiAgICAgICAgICAgIHRoZSBtb2RlbCB3aXRoIHRoZSBkaXNlYXNlIG1vZGVscworCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoZSBpbmZlY3RvcnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RGVjb3JhdG9yPiBjcmVhdGVJbmZlY3RvcnMoZmluYWwgTW9kZWwgbW9kZWwpIHsKKwkJTGlzdDxEZWNvcmF0b3I+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxEZWNvcmF0b3I+KCk7CisKKwkJLy8gQ3JlYXRlIGFuIGluZmVjdG9yIGZvciBlYWNoIGRpc2Vhc2UgbW9kZWwgaW4gdGhlIG1vZGVsCisJCWZvciAoSXRlcmF0b3Igbm9kZURlY29yYXRvckl0ZXIgPSBtb2RlbC5nZXROb2RlRGVjb3JhdG9ycygpLml0ZXJhdG9yKCk7IG5vZGVEZWNvcmF0b3JJdGVyCisJCQkJLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIE5vZGVEZWNvcmF0b3Igbm9kZURlY29yYXRvciA9IChOb2RlRGVjb3JhdG9yKSBub2RlRGVjb3JhdG9ySXRlcgorCQkJCQkubmV4dCgpOworCQkJLy8gSXMgaXQgYSBkaXNlYXNlIG1vZGVsPworCQkJaWYgKG5vZGVEZWNvcmF0b3IgaW5zdGFuY2VvZiBTSSkgeworCQkJCS8vIFllcworCQkJCWZpbmFsIFNJIHN0YW5kYXJkRGlzZWFzZU1vZGVsID0gKFNJKSBub2RlRGVjb3JhdG9yOworCQkJCWZpbmFsIFVSSSB0YXJnZXRVUkkgPSBEaXNlYXNlTW9kZWxUZXN0VXRpbC5jcmVhdGVSZWdpb25Ob2RlVVJJKAorCQkJCQkJSU5GRUNUSU9OX1JPV19JTkRFWCwgSU5GRUNUSU9OX0NPTFVNTl9JTkRFWCk7CisKKwkJCQlmaW5hbCBTSUluZmVjdG9yIGluZmVjdG9yID0gKFNJSW5mZWN0b3IpIHN0YW5kYXJkRGlzZWFzZU1vZGVsCisJCQkJCQkuY3JlYXRlSW5mZWN0b3IoKTsKKwkJCQlpbmZlY3Rvci5nZXREdWJsaW5Db3JlKCkuc2V0VGl0bGUoIkluZmVjdG9yIik7CisJCQkJaW5mZWN0b3Iuc2V0VGFyZ2V0VVJJKHRhcmdldFVSSSk7CisJCQkJaW5mZWN0b3Iuc2V0SW5mZWN0aW91c0NvdW50KE5VTUJFUl9UT19JTkZFQ1QpOworCQkJCWluZmVjdG9yLnNldEluZmVjdFBlcmNlbnRhZ2UoZmFsc2UpOworCQkJCXJldFZhbHVlLmFkZChpbmZlY3Rvcik7CisJCQl9IC8vIGlmIGEgc3RhbmRhcmQgZGlzZWFzZQorCQl9IC8vIGZvciBlYWNoIG5vZGUgZGVjb3JhdG9yCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlSW5mZWN0b3JzCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0cy5EaXNlYXNlTW9kZWxTY2VuYXJpb1Rlc3QjY29tcGFyZUxhYmVsVmFsdWVzKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlLAorCSAqICAgICAgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWUpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gY29tcGFyZUxhYmVsVmFsdWVzKExhYmVsVmFsdWUgbGFibGVWYWx1ZTEsCisJCQlMYWJlbFZhbHVlIGxhYmxlVmFsdWUyKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5jb21wYXJlTGFiZWxWYWx1ZXMobGFibGVWYWx1ZTEsIGxhYmxlVmFsdWUyKTsKKwkJZmluYWwgU0lMYWJlbFZhbHVlIHNpTFYxID0gKFNJTGFiZWxWYWx1ZSkgbGFibGVWYWx1ZTE7CisJCWZpbmFsIFNJTGFiZWxWYWx1ZSBzaUxWMiA9IChTSUxhYmVsVmFsdWUpIGxhYmxlVmFsdWUyOworCisJCXJldFZhbHVlID0gcmV0VmFsdWUKKwkJCQkmJiBEaXNlYXNlTW9kZWxUZXN0VXRpbC5jbG9zZUVub3VnaChzaUxWMS5nZXRTKCksIHNpTFYyLmdldFMoKSk7CisJCXJldFZhbHVlID0gcmV0VmFsdWUKKwkJCQkmJiBEaXNlYXNlTW9kZWxUZXN0VXRpbC5jbG9zZUVub3VnaChzaUxWMS5nZXRJKCksIHNpTFYyLmdldEkoKSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNvbXBhcmVMYWJlbFZhbHVlcworCit9IC8vIFNJRGlzZWFzZU1vZGVsU2NlbmFyaW9UZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TSURpc2Vhc2VNb2RlbFN0YXRlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0lEaXNlYXNlTW9kZWxTdGF0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmVhNjIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0lEaXNlYXNlTW9kZWxTdGF0ZVRlc3QuamF2YQpAQCAtMCwwICsxLDgyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSURpc2Vhc2VNb2RlbFN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TSSBEaXNlYXNlIE1vZGVsIFN0YXRlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBTSURpc2Vhc2VNb2RlbFN0YXRlVGVzdCBleHRlbmRzIFN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGVUZXN0IHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBhcmdzCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oU0lEaXNlYXNlTW9kZWxTdGF0ZVRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgU0kgRGlzZWFzZSBNb2RlbCBTdGF0ZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTSURpc2Vhc2VNb2RlbFN0YXRlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNJIERpc2Vhc2UgTW9kZWwgU3RhdGUgdGVzdCBjYXNlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU0lEaXNlYXNlTW9kZWxTdGF0ZSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFNJRGlzZWFzZU1vZGVsU3RhdGUpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTSURpc2Vhc2VNb2RlbFN0YXRlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKK30gLy8gU0lEaXNlYXNlTW9kZWxTdGF0ZVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NJSW5mZWN0b3JUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TSUluZmVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOTBjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TSUluZmVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lJbmZlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U0kgSW5mZWN0b3I8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFNJSW5mZWN0b3JUZXN0IGV4dGVuZHMgU3RhbmRhcmRJbmZlY3RvclRlc3QgeworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIElORkVDVE9SX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKCJpbmZlY3Rvci90ZXN0SW5mZWN0b3IuZGVjb3JhdG9yIik7CisJCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFNJSW5mZWN0b3JUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFNJIEluZmVjdG9yIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJSW5mZWN0b3JUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU0kgSW5mZWN0b3IgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTSUluZmVjdG9yIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoU0lJbmZlY3RvcilmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNJSW5mZWN0b3IgdGVtcCA9IFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0lJbmZlY3RvcigpOworCQl0ZW1wLnNldFRhcmdldElTT0tleSgiVVMiKTsKKwkJdGVtcC5zZXRVUkkoSU5GRUNUT1JfVVJJKTsKKwkJc2V0Rml4dHVyZSh0ZW1wKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCit9IC8vIFNJSW5mZWN0b3JUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TSUxhYmVsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0lMYWJlbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODQ1MDE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0lMYWJlbFRlc3QuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLlJlZ2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TSSBMYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgU0lMYWJlbFRlc3QgZXh0ZW5kcyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVGVzdCB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFNJTGFiZWxUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFNJIExhYmVsIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJTGFiZWxUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU0kgTGFiZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTSUxhYmVsIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoU0lMYWJlbClmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIGFuIFNJTGFiZWwgaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFNJTGFiZWwgY3JlYXRlRml4dHVyZSgpIHsKKwkJZmluYWwgU0lMYWJlbCByZXRWYWx1ZSA9IFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0lMYWJlbCgpOworCQlmaW5hbCBSZWdpb24gbm9kZSA9IERpc2Vhc2VNb2RlbFRlc3RVdGlsCisJCQkJLmNyZWF0ZVBvcHVsYXRpb25SZWdpb25Ob2RlKERpc2Vhc2VNb2RlbFRlc3RVdGlsLlRFU1RfUE9QVUxBVElPTl9JREVOVElGSUVSKTsKKworCQlEaXNlYXNlTW9kZWxMYWJlbFRlc3QubGFiZWxSZWdpb24ocmV0VmFsdWUsCisJCQkJRGlzZWFzZU1vZGVsVGVzdFV0aWwuVEVTVF9QT1BVTEFUSU9OX0lERU5USUZJRVIsIG5vZGUpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWwjZ2V0Q3VycmVudFNJVmFsdWUoKSA8ZW0+Q3VycmVudCBTSSBWYWx1ZTwvZW0+fScKKwkgKiBmZWF0dXJlIGdldHRlci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbCNnZXRDdXJyZW50U0lWYWx1ZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VycmVudFNJVmFsdWUoKSB7CisJCWZpbmFsIFNJTGFiZWwgc3RhbmRhcmRMYWJlbCA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgU0lMYWJlbFZhbHVlIHZhbHVlID0gKFNJTGFiZWxWYWx1ZSlzdGFuZGFyZExhYmVsLmdldEN1cnJlbnRWYWx1ZSgpOworCQlhc3NlcnROb3ROdWxsKHZhbHVlKTsKKwl9IC8vIHRlc3RHZXRDdXJyZW50U0lWYWx1ZQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWwjZ2V0TmV4dFNJVmFsdWUoKSA8ZW0+TmV4dCBTSSBWYWx1ZTwvZW0+fScKKwkgKiBmZWF0dXJlIGdldHRlci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbCNnZXROZXh0U0lWYWx1ZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TmV4dFNJVmFsdWUoKSB7CisJCWZpbmFsIFNJTGFiZWwgc3RhbmRhcmRMYWJlbCA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgU0lMYWJlbFZhbHVlIHZhbHVlID0gKFNJTGFiZWxWYWx1ZSlzdGFuZGFyZExhYmVsLmdldE5leHRWYWx1ZSgpOworCQlhc3NlcnROb3ROdWxsKHZhbHVlKTsKKwl9IC8vIHRlc3RHZXROZXh0U0lWYWx1ZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbCNzZXRJKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsI2dldEkoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWwjc2V0TmV4dEkoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWwjZ2V0TmV4dEkoKQorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTZXRHZXRDdXJyZW50TmV4dFNJTGFiZWxJKCkgeworCQlmaW5hbCBTSUxhYmVsIHNpTGFiZWwgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoc2lMYWJlbC5nZXRJKCkgPT0gMC4wKTsKKwkJYXNzZXJ0VHJ1ZShzaUxhYmVsLmdldE5leHRJKCkgPT0gMC4wKTsKKwkJc2lMYWJlbC5zZXRJKFNJTGFiZWxWYWx1ZVRlc3QuVEVTVF9JKTsKKwkJc2lMYWJlbC5zZXROZXh0SShTSUxhYmVsVmFsdWVUZXN0LlRFTVBfVEVTVF9JKTsKKwkJYXNzZXJ0VHJ1ZShzaUxhYmVsLmdldEkoKSA9PSBTSUxhYmVsVmFsdWVUZXN0LlRFU1RfSSk7CisJCWFzc2VydFRydWUoc2lMYWJlbC5nZXROZXh0SSgpID09IFNJTGFiZWxWYWx1ZVRlc3QuVEVNUF9URVNUX0kpOworCQlzaUxhYmVsLnNldE5leHRWYWx1ZVZhbGlkKHRydWUpOworCQlzaUxhYmVsLnN3aXRjaFRvTmV4dFZhbHVlKCk7CisJCWFzc2VydFRydWUoc2lMYWJlbC5nZXRJKCkgPT0gU0lMYWJlbFZhbHVlVGVzdC5URU1QX1RFU1RfSSk7CisJCWFzc2VydFRydWUoc2lMYWJlbC5nZXROZXh0SSgpID09IFNJTGFiZWxWYWx1ZVRlc3QuVEVTVF9JKTsKKwl9IC8vIHRlc3RTZXRHZXRDdXJyZW50TmV4dFNJTGFiZWxJCisKK30gLy8gU0lMYWJlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NJTGFiZWxWYWx1ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NJTGFiZWxWYWx1ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmFjN2RiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0lMYWJlbFZhbHVlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSUxhYmVsVmFsdWVJbXBsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U0kgTGFiZWwgVmFsdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFNJTGFiZWxWYWx1ZVRlc3QgZXh0ZW5kcyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVUZXN0IHsKKwkvKioKKwkgKiBUZXN0IHZhbHVlIGZvciBpbmZlY3Rpb3VzCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgVEVTVF9JID0gMjsKKworCS8qKgorCSAqIFRlc3QgdmFsdWUgZm9yIGluZmVjdGlvdXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBURU1QX1RFU1RfSSA9IFRFU1RfSSArIDIwOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFNJTGFiZWxWYWx1ZVRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgU0kgTGFiZWwgVmFsdWUgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU0lMYWJlbFZhbHVlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNJIExhYmVsIFZhbHVlIHRlc3QgY2FzZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFNJTGFiZWxWYWx1ZSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFNJTGFiZWxWYWx1ZSlmaXh0dXJlOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXByaXZhdGUgU0lMYWJlbFZhbHVlIGdldFRlbXBGaXh0dXJlKCkgeworCQlyZXR1cm4gKFNJTGFiZWxWYWx1ZSkgdGVtcEZpeHR1cmU7CisJfSAvLyBnZXRUZW1wRml4dHVyZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCQlzZXRUZW1wRml4dHVyZShjcmVhdGVUZW1wRml4dHVyZSgpKTsKKwl9IC8vIHNldFVwCisKKwkvKioKKwkgKiBAcmV0dXJuIGEgdmFsdWUgZm9yIHRlc3RpbmcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFNJTGFiZWxWYWx1ZSBjcmVhdGVGaXh0dXJlKCkgeworCQlmaW5hbCBTSUxhYmVsVmFsdWVJbXBsIHJldFZhbHVlID0gbmV3IFNJTGFiZWxWYWx1ZUltcGwoVEVTVF9TLCBURVNUX0ksCisJCQkJVEVTVF9ESVNFQVNFX0RFQVRIUyk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUZpeHR1cmUKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGNyZWF0ZVRlbXBGaXh0dXJlKCkgeworCQlmaW5hbCBTSUxhYmVsVmFsdWVJbXBsIHJldFZhbHVlID0gbmV3IFNJTGFiZWxWYWx1ZUltcGwoVEVNUF9URVNUX1MsCisJCQkJVEVNUF9URVNUX0ksCisJCQkJVEVNUF9URVNUX0RJU0VBU0VfREVBVEhTKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlVGVtcEZpeHR1cmUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJCXNldFRlbXBGaXh0dXJlKG51bGwpOworCX0gLy8gdGVhckRvd24KKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWUjZ2V0SSgpIDxlbT5JPC9lbT59JworCSAqIGZlYXR1cmUgZ2V0dGVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWUjZ2V0SSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0SSgpIHsKKwkJZmluYWwgU0lMYWJlbFZhbHVlIHNpTGFiZWxWYWx1ZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShzaUxhYmVsVmFsdWUuZ2V0SSgpID09IFRFU1RfSSk7CisJfSAvLyB0ZXN0R2V0SQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBnZXRFeHBlY3RlZENvbnZlcnRUb1NvdXJjZVN0YXRlcygKKwkJCVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBmaXh0dXJlKSB7CisJCWZpbmFsIFNJTGFiZWxWYWx1ZSBzaUxhYmVsID0gKFNJTGFiZWxWYWx1ZSkgZml4dHVyZTsKKwkJcmV0dXJuIG5ldyBTSUxhYmVsVmFsdWVJbXBsKHNpTGFiZWwuZ2V0SSgpLCBzaUxhYmVsLmdldFMoKSwgMC4wLAorCQkJCSBmaXh0dXJlCisJCQkJCQkuZ2V0RGlzZWFzZURlYXRocygpKTsKKwl9IC8vIGdldEV4cGVjdGVkQ29udmVydFRvU291cmNlU3RhdGVzCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBnZXRFeHBlY3RlZEZpeHR1cmVBZGRpdGlvblJlc3VsdCgKKwkJCURpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZml4dHVyZTEsIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZml4dHVyZTIpIHsKKwkJZmluYWwgU0lMYWJlbFZhbHVlIHNpTGFiZWwxID0gKFNJTGFiZWxWYWx1ZSkgZml4dHVyZTE7CisJCWZpbmFsIFNJTGFiZWxWYWx1ZSBzaUxhYmVsMiA9IChTSUxhYmVsVmFsdWUpIGZpeHR1cmUyOworCQlyZXR1cm4gbmV3IFNJTGFiZWxWYWx1ZUltcGwoc2lMYWJlbDEuZ2V0UygpICsgc2lMYWJlbDIuZ2V0UygpLCBzaUxhYmVsMQorCQkJCS5nZXRJKCkKKwkJCQkrIHNpTGFiZWwyLmdldEkoKSwKKwkJCQkgZml4dHVyZTEuZ2V0RGlzZWFzZURlYXRocygpCisJCQkJCQkrIGZpeHR1cmUyLmdldERpc2Vhc2VEZWF0aHMoKSk7CisJfSAvLyBnZXRFeHBlY3RlZEZpeHR1cmVBZGRpdGlvblJlc3VsdAorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZ2V0RXhwZWN0ZWRGaXh0dXJlU3VidHJhY3Rpb25SZXN1bHQoCisJCQlEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGZpeHR1cmUxLCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGZpeHR1cmUyKSB7CisJCWZpbmFsIFNJTGFiZWxWYWx1ZSBzaUxhYmVsMSA9IChTSUxhYmVsVmFsdWUpIGZpeHR1cmUxOworCQlmaW5hbCBTSUxhYmVsVmFsdWUgc2lMYWJlbDIgPSAoU0lMYWJlbFZhbHVlKSBmaXh0dXJlMjsKKwkJcmV0dXJuIG5ldyBTSUxhYmVsVmFsdWVJbXBsKHNpTGFiZWwxLmdldFMoKSAtIHNpTGFiZWwyLmdldFMoKSwgc2lMYWJlbDEKKwkJCQkuZ2V0SSgpCisJCQkJLSBzaUxhYmVsMi5nZXRJKCksIAorCQkJCSBmaXh0dXJlMS5nZXREaXNlYXNlRGVhdGhzKCkKKwkJCQkJCS0gZml4dHVyZTIuZ2V0RGlzZWFzZURlYXRocygpKTsKKwl9IC8vIGdldEV4cGVjdGVkRml4dHVyZVN1YnRyYWN0aW9uUmVzdWx0CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgZG91YmxlIGdldEV4cGVjdGVkUG9wdWxhdGlvbkNvdW50KERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZml4dHVyZSkgeworCQlmaW5hbCBTSUxhYmVsVmFsdWUgc2lMYWJlbCA9IChTSUxhYmVsVmFsdWUpIGZpeHR1cmU7CisJCXJldHVybiBzaUxhYmVsLmdldFMoKSArIHNpTGFiZWwuZ2V0SSgpOworCX0gLy8gZ2V0RXhwZWN0ZWRQb3B1bGF0aW9uQ291bnQKKworfSAvLyBTSUxhYmVsVmFsdWVUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TSUxhYmVsVmFsdWVUZXN0VXRpbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0lMYWJlbFZhbHVlVGVzdFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzUyMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0lMYWJlbFZhbHVlVGVzdFV0aWwuamF2YQpAQCAtMCwwICsxLDI1NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLk5vZGVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxTdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSUxhYmVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSUxhYmVsVmFsdWVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJRGlzZWFzZU1vZGVsU3RhdGVJbXBsOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU0lMYWJlbFZhbHVlVGVzdFV0aWwgZXh0ZW5kcyBUZXN0Q2FzZXsKKwkKKwkvKioKKwkgKiBOdW1iZXIgb2YgcmFuZG9tIHZhbHVlcyB0byB0ZXN0IHdpdGgKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNQkVSX09GX1JBTkRPTVMgPSAwOworCisJLyoqCisJICogbWF4IGRvdWJsZSB2YWx1ZSB0byBiZSB1c2VkIGluIHRoZSB0ZXN0CisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIFRFU1RfTUFYX0RPVUJMRV9WQUxVRSA9IDFlMTJkOworCisJLyoqCisJICogbWF4IGxvbmcgdmFsdWUgdG8gYmUgdXNlZCBpbiB0aGUgdGVzdAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVEVTVF9NQVhfTE9OR19WQUxVRSA9IExvbmcuTUFYX1ZBTFVFOworCisJLyoqCisJICogaWYgdGhlcmUgaXMgYSBzeXN0ZW0gcHJvcGVydHkgd2l0aCB0aGlzIHZhbHVlIHRoZW4gdGhlIHRlc3Qgd2lsbCBiZSBjb21wZXJoZW5zaXZlLiBJZiBub3QKKwkgKiB0aGVuIHRoZSB0ZXN0IHdpbGwgY2hlY2sgb25seSBmZXcgY2FzZXMuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBFUkhBTlNJVkVfVEVTVCA9ICJjb21wZXJoZW5zaXZlLnRlc3QiOworCisJcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBjb21wZXJoZW5zaXZlID0gbnVsbDsKKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiB7QGxpbmsgU0lMYWJlbFZhbHVlSW1wbH0gb2JqZWN0cy4KKwkgKiBTb21lIG9iamVjdHMgaW4gdGhlIGxpc3QgYXJlIHJhbmRvbSBhbmQgc29tZSBub3QgcmFuZG9tIGF0IGFsbC4KKwkgKiBUaGUgb25lcyB0aGF0IGFyZSBub3QgcmFuZG9tIHJlcHJlc2VudHMgZXh0cmVtZSBjYXNlcy4KKwkgKiBUaGUgbnVtZXJpYyB2YWx1ZXMgZm9yIHRoZSBleHRyZW1lIGNhc2VzIGFyZSAwLjAsIE1BWF9ET1VCTEUsIGFuZCBJIGFkZGVkIHRoZSBudW1iZXIgMS4wLiAKKwkgKiBUaGUgbnVtYmVyIG9mIHJhbmRvbSBudW1iZXJzIHRvIHRlc3Qgd2l0aCBpcyBOVU1CRVJfT0ZfUkFORE9NUy4KKwkgKiBOb3RlIHRoYXQgd2l0aCBOVU1CRVJfT0ZfUkFORE9NUyA9IDAgeW91IHdpbGwgaGF2ZSA0Mzc0IHBlcm11dGF0aW9ucyBvZiBhbGwgdmFsdWVzIG9mIHtAU0lMYWJlbFZhbHVlSW1wbH0uCisJICogSWYgeW91IHdpc2ggdG8gbWFrZSBOVU1CRVJfT0ZfUkFORE9NUyBoaWdoZXIgdGhlbiAwIHRoZW4gYmUgcmVhZHkgZm9yIGEgbG9uZyB0ZXN0IDotKQorCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdDxTSUxhYmVsVmFsdWVJbXBsPiBjcmVhdGVSYW5kb21TSUxhYmVsVmFsdWVJbXBsKCl7CisJCVJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7CisJCWRvdWJsZVtdIHZhbHVlcyA9IG5ldyBkb3VibGVbMyArIE5VTUJFUl9PRl9SQU5ET01TXTsKKwkJdmFsdWVzWzBdID0gMC4wZDsKKwkJdmFsdWVzWzFdID0gVEVTVF9NQVhfRE9VQkxFX1ZBTFVFOworCSAgICB2YWx1ZXNbMl0gPSAxLjBkOworCQlmb3IoaW50IGkgPSAodmFsdWVzLmxlbmd0aCArIDEpOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKXsKKwkJCXZhbHVlc1tpXSA9IHJhbmRvbS5uZXh0RG91YmxlKCkgKiBURVNUX01BWF9ET1VCTEVfVkFMVUU7CisJCX0KKwkJTGlzdDxTSUxhYmVsVmFsdWVJbXBsPiBtb2RlbExldmVsVmFsdWVzID0gbmV3IExpbmtlZExpc3Q8U0lMYWJlbFZhbHVlSW1wbD4oKTsKKwkJaW50IGl0ZXJhdGlvbiA9IDA7CisJCWZvcihkb3VibGUgcyA6IHZhbHVlcyl7CisJCQlmb3IoZG91YmxlIGUgOiB2YWx1ZXMpeworCQkJCWZvcihkb3VibGUgaSA6IHZhbHVlcyl7CisJCQkJCWZvcihkb3VibGUgciA6IHZhbHVlcyl7CisJCQkJCQlmb3IoZG91YmxlIGJpcnRocyA6IHZhbHVlcyl7CisJCQkJCQkJZm9yKGRvdWJsZSBkZWF0aHMgOiB2YWx1ZXMpeworCQkJCQkJCQlmb3IoZG91YmxlIGRpc2Vhc2VEZWF0aHMgOiB2YWx1ZXMpeworCQkJCQkJCQkJaWYoZGlzZWFzZURlYXRocyA+IGRlYXRocyl7CisJCQkJCQkJCQkJY29udGludWU7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlpZihza2lwVmFsdWVTZXQoaXRlcmF0aW9uKyssIGRpc2Vhc2VEZWF0aHMsIGRlYXRocywgcywgZSwgaSwgcikpeworCQkJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCQkJfQorCQkJCQkJCQkJU0lMYWJlbFZhbHVlSW1wbCBtb2RlbExhYmxlVmFsdWUgPSBuZXcgU0lMYWJlbFZhbHVlSW1wbChzLCBpLAlkaXNlYXNlRGVhdGhzKTsKKwkJCQkJCQkJCWFzc2VydFRydWUoIlRoZSBTSUxhYmVsVmFsdWVJbXBsOiAiICsgbW9kZWxMYWJsZVZhbHVlICsgIiBpcyBpbnNhbmUhIiwgbW9kZWxMYWJsZVZhbHVlLnNhbmUoKSk7CisJCQkJCQkJCQltb2RlbExldmVsVmFsdWVzLmFkZChtb2RlbExhYmxlVmFsdWUpOworCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKG1vZGVsTGV2ZWxWYWx1ZXMuc2l6ZSgpKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbW9kZWxMZXZlbFZhbHVlczsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBza2lwVmFsdWVTZXQoZG91YmxlIGl0ZXJhdGlvbiwgZG91YmxlIGRpc2Vhc2VEZWF0aHMsIGRvdWJsZSBkZWF0aHMsIGRvdWJsZSBzLCBkb3VibGUgZSwgZG91YmxlIGksZG91YmxlIHIpIHsKKwkJaWYoIWlzQ29tcGVyaGVuc2l2ZSgpKXsKKwkJCWlmKGl0ZXJhdGlvbiAlIDUwMCA+IDEpeworCQkJCS8vZG8gb25seSBvbmUgb2YgYW55IDUwMCBwZXJtdXRhdGlvbnMKKwkJCQlTeXN0ZW0ub3V0LnByaW50KCIuIik7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJaWYoZGlzZWFzZURlYXRocyA+IGRlYXRocyl7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlkb3VibGUgcG9wdWxhdGlvbiA9IHMgKyBpICsgcjsKKwkJaWYoZGVhdGhzID4gcG9wdWxhdGlvbil7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZihkaXNlYXNlRGVhdGhzID4gcG9wdWxhdGlvbil7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb21wZXJoZW5zaXZlKCkgeworCQlpZihudWxsICE9IGNvbXBlcmhlbnNpdmUgKXsKKwkJCXJldHVybiBjb21wZXJoZW5zaXZlLmJvb2xlYW5WYWx1ZSgpOworCQl9CisJCVN0cmluZyBjb21wZXJoZW5zaXZlUHJvcGVydHkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQ09NUEVSSEFOU0lWRV9URVNUKTsKKwkJaWYobnVsbCAhPSBjb21wZXJoZW5zaXZlUHJvcGVydHkpeworCQkJY29tcGVyaGVuc2l2ZVByb3BlcnR5ID0gY29tcGVyaGVuc2l2ZVByb3BlcnR5LnRyaW0oKTsKKwkJCWlmKGNvbXBlcmhlbnNpdmVQcm9wZXJ0eS5lcXVhbHNJZ25vcmVDYXNlKCJ5ZXMiKSB8fCBjb21wZXJoZW5zaXZlUHJvcGVydHkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKXsJCQkKKwkJCQljb21wZXJoZW5zaXZlID0gbmV3IEJvb2xlYW4odHJ1ZSk7CisJCQl9CisJCX0KKwkJaWYobnVsbCA9PSBjb21wZXJoZW5zaXZlICl7CisJCQljb21wZXJoZW5zaXZlID0gbmV3IEJvb2xlYW4oZmFsc2UpOworCQl9CisJCXJldHVybiBjb21wZXJoZW5zaXZlLmJvb2xlYW5WYWx1ZSgpOworCX0KKwkvKioKKwkgKiBDbG9uZSB0aGUgU0lMYWJlbFZhbHVlSW1wbAorCSAqIEBwYXJhbSBvcmlnaW5hbCB3aWxsIG5vdCBiZSBtb2RlZmlsZXMKKwkgKiBAcmV0dXJuIGEgY2xvbmUgb2YgJ29yaWdpbmFsJworCSAqLworCXB1YmxpYyBzdGF0aWMgU0lMYWJlbFZhbHVlSW1wbCBjbG9uZVNJTGFiZWxWYWx1ZUltcGwoU0lMYWJlbFZhbHVlSW1wbCBvcmlnaW5hbCl7CisJCVNJTGFiZWxWYWx1ZUltcGwgdmFsdWUgPSAgbmV3IFNJTGFiZWxWYWx1ZUltcGwob3JpZ2luYWwuZ2V0UygpLCBvcmlnaW5hbC5nZXRJKCksIAorCQkJCW9yaWdpbmFsLmdldERpc2Vhc2VEZWF0aHMoKSk7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiB7QGxpbmsgU0lMYWJlbEltcGx9IG9iamVjdHMuCisJICogU29tZSBvYmplY3RzIGluIHRoZSBsaXN0IGFyZSByYW5kb20gYW5kIHNvbWUgbm90IHJhbmRvbSBhdCBhbGwuCisJICogVGhlIG9uZXMgdGhhdCBhcmUgbm90IHJhbmRvbSByZXByZXNlbnRzIGV4dHJlbWUgY2FzZXMuCisJICogVGhlIG51bWVyaWMgdmFsdWVzIGZvciB0aGUgZXh0cmVtZSBjYXNlcyBhcmUgMC4wLCBNQVhfRE9VQkxFLCBhbmQgSSBhZGRlZCB0aGUgbnVtYmVyIDEuMC4gCisJICogVGhlIG51bWJlciBvZiByYW5kb20gbnVtYmVycyB0byB0ZXN0IHdpdGggaXMgTlVNQkVSX09GX1JBTkRPTVMuCisJICogTm90ZSB0aGF0IHdpdGggTlVNQkVSX09GX1JBTkRPTVMgPSAwIHlvdSB3aWxsIGhhdmUgNDM3NCBwZXJtdXRhdGlvbnMgb2YgYWxsIHZhbHVlcyBvZiB7U0lMYWJlbEltcGx9LgorCSAqIElmIHlvdSB3aXNoIHRvIG1ha2UgTlVNQkVSX09GX1JBTkRPTVMgaGlnaGVyIHRoZW4gMCB0aGVuIGJlIHJlYWR5IGZvciBhIGxvbmcgdGVzdCA6LSkKKwkgKiAKKwkgKi8KKwlwdWJsaWMgTGlzdDxTSUxhYmVsSW1wbD4gY3JlYXRlUmFuZG9tU0lMYWJlbEltcGwoKXsKKwkJUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKKwkJZG91YmxlW10gdmFsdWVzID0gbmV3IGRvdWJsZVszICsgTlVNQkVSX09GX1JBTkRPTVNdOworCQl2YWx1ZXNbMF0gPSAwLjBkOworCQl2YWx1ZXNbMV0gPSBURVNUX01BWF9ET1VCTEVfVkFMVUU7CisJCXZhbHVlc1syXSA9IDEuMGQ7CisJCWZvcihpbnQgaSA9IDM7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspeworCQkJdmFsdWVzW2ldID0gcmFuZG9tLm5leHREb3VibGUoKSAqIFRFU1RfTUFYX0RPVUJMRV9WQUxVRTsKKwkJfQorCQlMaXN0PFNJTGFiZWxJbXBsPiBtb2RlbExldmVsVmFsdWVzID0gbmV3IExpbmtlZExpc3Q8U0lMYWJlbEltcGw+KCk7CisJCWludCBpdGVyYXRpb24gPSAwOworCQlmb3IoZG91YmxlIHMgOiB2YWx1ZXMpeworCQkJZm9yKGRvdWJsZSBlIDogdmFsdWVzKXsKKwkJCQlmb3IoZG91YmxlIGkgOiB2YWx1ZXMpeworCQkJCQlmb3IoZG91YmxlIHIgOiB2YWx1ZXMpeworCQkJCQkJZm9yKGRvdWJsZSBiaXJ0aHMgOiB2YWx1ZXMpeworCQkJCQkJCWZvcihkb3VibGUgZGVhdGhzIDogdmFsdWVzKXsKKwkJCQkJCQkJZm9yKGRvdWJsZSBkaXNlYXNlRGVhdGhzIDogdmFsdWVzKXsKKwkJCQkJCQkJCWlmKHNraXBWYWx1ZVNldChpdGVyYXRpb24rKywgZGlzZWFzZURlYXRocywgZGVhdGhzLCBzLCBlLCBpLCByKSl7CisJCQkJCQkJCQkJY29udGludWU7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlTSUxhYmVsSW1wbCBtb2RlbExhYmxlID0gbmV3IFNJTGFiZWxUZXN0ZXJJbXBsKHMsIGksIGJpcnRocywgZGVhdGhzLAlkaXNlYXNlRGVhdGhzLCAKKwkJCQkJCQkJCQkJbmV3IFNJRGlzZWFzZU1vZGVsU3RhdGVUZXN0ZXJJbXBsKCksIG5ldyBOb2RlVGVzdGVySW1wbCgpKTsKKwkJCQkJCQkJCWFzc2VydFRydWUoIlRoZSBTSUxhYmVsSW1wbDogIiArIG1vZGVsTGFibGUgKyAiIGlzIGluc2FuZSEiLCBtb2RlbExhYmxlLnNhbmUoKSk7CisJCQkJCQkJCQltb2RlbExldmVsVmFsdWVzLmFkZChtb2RlbExhYmxlKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbW9kZWxMZXZlbFZhbHVlczsKKwl9CisJCisJCisKKwlwcml2YXRlIGNsYXNzIFNJRGlzZWFzZU1vZGVsU3RhdGVUZXN0ZXJJbXBsIGV4dGVuZHMgU0lEaXNlYXNlTW9kZWxTdGF0ZUltcGx7CisJCXB1YmxpYyBTSURpc2Vhc2VNb2RlbFN0YXRlVGVzdGVySW1wbCgpeworCQkJc3VwZXIoKTsKKwkJfQorCX0KKwkKKwkKKwlwcml2YXRlIGNsYXNzIFNJTGFiZWxUZXN0ZXJJbXBsIGV4dGVuZHMgU0lMYWJlbEltcGx7CisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiAKKwkJICogVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZXMgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisJCSAqIAorCQkgKiBAcGFyYW0gcworCQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc3VzY2VwdGlibGUgcG9wdWxhdGlvbiBtZW1iZXJzCisJCSAqIEBwYXJhbSBpUgorCQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcmVjb3ZlcmluZyBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gbWVtYmVycworCQkgKiBAcGFyYW0gaUYKKwkJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGZhdGFsbHkgaW5mZWN0aW91cyBwb3B1bGF0aW9uIG1lbWJlcnMKKwkJICogQHBhcmFtIGJpcnRocworCQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYmlydGhzIHRoYXQgaGF2ZSBvY2N1cmVkIGluIHRoZSBwb3B1bGF0aW9uCisJCSAqIEBwYXJhbSBkZWF0aHMKKwkJICogICAgICAgICAgICB0aGUgdG90YWwgbnVtYmVyIG9mIGRlYXRocyB0aGF0IGhhdmUgb2NjdXJlZCBpbiB0aGUgcG9wdWxhdGlvbgorCQkgKiBAcGFyYW0gZGlzZWFzZURlYXRocworCQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGVhdGhzIGR1ZSB0byB0aGUgZGlzZWFzZSB0aGF0IGhhdmUgb2NjdXJlZCBpbgorCQkgKiAgICAgICAgICAgIHRoZSBwb3B1bGF0aW9uCisJCSAqIAorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHBhcmFtIG5ld0Rpc2Vhc2VNb2RlbFN0YXRlIAorCQkgKiBAcGFyYW0gbmV3Tm9kZSAKKwkJICovCisJCXB1YmxpYyBTSUxhYmVsVGVzdGVySW1wbChmaW5hbCBkb3VibGUgcywgZmluYWwgZG91YmxlIGksCisJCQkJZmluYWwgZG91YmxlIGJpcnRocywgZmluYWwgZG91YmxlIGRlYXRocywKKwkJCQlmaW5hbCBkb3VibGUgZGlzZWFzZURlYXRocywgZmluYWwgRGlzZWFzZU1vZGVsU3RhdGUgbmV3RGlzZWFzZU1vZGVsU3RhdGUsIE5vZGUgbmV3Tm9kZSkgeworCQkJc3VwZXIoKTsKKwkJCXNldFMocyk7CisJCQlzZXRJKGkpOworCQkJc2V0RGlzZWFzZURlYXRocyhkaXNlYXNlRGVhdGhzKTsKKwkJCXNldERpc2Vhc2VNb2RlbFN0YXRlKG5ld0Rpc2Vhc2VNb2RlbFN0YXRlKTsKKwkJCXNldE5vZGUobmV3Tm9kZSk7CisJCX0gLy8gU0lMYWJlbFZhbHVlSW1wbAkKKwl9CisKKwlwcml2YXRlIGNsYXNzIE5vZGVUZXN0ZXJJbXBsIGV4dGVuZHMgTm9kZUltcGx7CisJCXB1YmxpYyBOb2RlVGVzdGVySW1wbCgpeworCQkJc3VwZXIoKTsKKwkJfQorCX0KKwkKKwkKKwlwdWJsaWMgbG9uZ1tdIGNyZWF0ZXJhbmRvbURlbHRhcygpIHsKKwkJUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKKwkJbG9uZ1tdIHZhbHVlcyA9IG5ldyBsb25nWzIgKyBOVU1CRVJfT0ZfUkFORE9NU107CisJCXZhbHVlc1swXSA9IFRFU1RfTUFYX0xPTkdfVkFMVUU7CisJCXZhbHVlc1sxXSA9IDFsOworCQlmb3IoaW50IGkgPSAzOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKXsKKwkJCXZhbHVlc1tpXSA9IHJhbmRvbS5uZXh0TG9uZygpICogVEVTVF9NQVhfTE9OR19WQUxVRTsKKwkJfQorCQlyZXR1cm4gdmFsdWVzOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NJUkRpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0lSRGlzZWFzZU1vZGVsU2NlbmFyaW9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFkZDYyNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NJUkRpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8vIFNJUkRpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0IHRlc3QgY2FzZSBmb3IgU0lSIERpc2Vhc2UgTW9kZWxzIFNjZW5hcmlvcworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU0lSRGlzZWFzZU1vZGVsU2NlbmFyaW9UZXN0IGV4dGVuZHMKKwkJU0lEaXNlYXNlTW9kZWxTY2VuYXJpb1Rlc3QgeworCS8vIE5vdGhpbmcKK30vLyBTSVJEaXNlYXNlTW9kZWxTY2VuYXJpb1Rlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NJUklub2N1bGF0b3JUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TSVJJbm9jdWxhdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNGIwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TSVJJbm9jdWxhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsODcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSSW5vY3VsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNJUiBJbm9jdWxhdG9yPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBTSVJJbm9jdWxhdG9yVGVzdCBleHRlbmRzIFNJSW5mZWN0b3JUZXN0IHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIElOT0NVTEFUT1JfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoImlubm9jdWxhdG9yL3Rlc3RJbm9jdWxhdG9yLmRlY29yYXRvciIpOworCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oU0lSSW5vY3VsYXRvclRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgU0lSIElub2N1bGF0b3IgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJUklub2N1bGF0b3JUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU0lSIElub2N1bGF0b3IgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTSVJJbm9jdWxhdG9yIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoU0lSSW5vY3VsYXRvcilmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU0lSSW5vY3VsYXRvciB0ZW1wID0gU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTSVJJbm9jdWxhdG9yKCk7CisJCXRlbXAuc2V0VGFyZ2V0SVNPS2V5KCJVUyIpOworCQl0ZW1wLnNldFVSSShJTk9DVUxBVE9SX1VSSSk7CisJCXNldEZpeHR1cmUodGVtcCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCit9IC8vU0lSSW5vY3VsYXRvclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NJUkxhYmVsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0lSTGFiZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhOGJiZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NJUkxhYmVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuUmVnaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLkRlY29yYXRvcnNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3ROb2RlRGVjb3JhdG9yMTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNJUiBMYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgU0lSTGFiZWxUZXN0IGV4dGVuZHMgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFRlc3QgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihTSVJMYWJlbFRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgU0lSIExhYmVsIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJUkxhYmVsVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNJUiBMYWJlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFNJUkxhYmVsIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoU0lSTGFiZWwpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKGNyZWF0ZUZpeHR1cmUoKSk7CisJfSAvLyBzZXRVcAorCisJLyoqCisJICogQHJldHVybiBhbiBTSVJMYWJlbCBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgU0lSTGFiZWwgY3JlYXRlRml4dHVyZSgpIHsKKwkJZmluYWwgU0lSTGFiZWwgcmV0VmFsdWUgPSBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNJUkxhYmVsKCk7CisJCWZpbmFsIFJlZ2lvbiBub2RlID0gRGlzZWFzZU1vZGVsVGVzdFV0aWwKKwkJCQkuY3JlYXRlUG9wdWxhdGlvblJlZ2lvbk5vZGUoRGlzZWFzZU1vZGVsVGVzdFV0aWwuVEVTVF9QT1BVTEFUSU9OX0lERU5USUZJRVIpOworCisJCWZpbmFsIFRlc3ROb2RlRGVjb3JhdG9yMSB0bmQgPSBEZWNvcmF0b3JzRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlVGVzdE5vZGVEZWNvcmF0b3IxKCk7CisJCXJldFZhbHVlLnNldERlY29yYXRvcih0bmQpOworCQlEaXNlYXNlTW9kZWxMYWJlbFRlc3QubGFiZWxSZWdpb24ocmV0VmFsdWUsCisJCQkJRGlzZWFzZU1vZGVsVGVzdFV0aWwuVEVTVF9QT1BVTEFUSU9OX0lERU5USUZJRVIsIG5vZGUpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsI2dldEN1cnJlbnRTSVJWYWx1ZSgpIDxlbT5DdXJyZW50IFNJUiBWYWx1ZTwvZW0+fScKKwkgKiBmZWF0dXJlIGdldHRlci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWwjZ2V0Q3VycmVudFNJUlZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRDdXJyZW50U0lSVmFsdWUoKSB7CisJCWZpbmFsIFNJUkxhYmVsIHNpckxhYmVsID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBTSVJMYWJlbFZhbHVlIHZhbHVlID0gc2lyTGFiZWwuZ2V0Q3VycmVudFNJUlZhbHVlKCk7CisJCWFzc2VydE5vdE51bGwodmFsdWUpOworCX0gLy8gdGVzdEdldEN1cnJlbnRTSVJWYWx1ZQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsI2dldE5leHRTSVJWYWx1ZSgpIDxlbT5OZXh0IFNJUiBWYWx1ZTwvZW0+fScKKwkgKiBmZWF0dXJlIGdldHRlci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWwjZ2V0TmV4dFNJUlZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXROZXh0U0lSVmFsdWUoKSB7CisJCWZpbmFsIFNJUkxhYmVsIHNpckxhYmVsID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBTSVJMYWJlbFZhbHVlIHZhbHVlID0gc2lyTGFiZWwuZ2V0TmV4dFNJUlZhbHVlKCk7CisJCWFzc2VydE5vdE51bGwodmFsdWUpOworCX0gLy8gdGVzdEdldE5leHRTSVJWYWx1ZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWwjc2V0Uihkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWwjZ2V0UigpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWwjc2V0TmV4dFIoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsI2dldE5leHRSKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0Q3VycmVudE5leHRTSVJMYWJlbFIoKSB7CisJCWZpbmFsIFNJUkxhYmVsIHNpckxhYmVsID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKHNpckxhYmVsLmdldFIoKSA9PSAwLjApOworCQlhc3NlcnRUcnVlKHNpckxhYmVsLmdldE5leHRSKCkgPT0gMC4wKTsKKwkJc2lyTGFiZWwuc2V0UihTSVJMYWJlbFZhbHVlVGVzdC5URVNUX1IpOworCQlzaXJMYWJlbC5zZXROZXh0UihTSVJMYWJlbFZhbHVlVGVzdC5URU1QX1RFU1RfUik7CisJCWFzc2VydFRydWUoc2lyTGFiZWwuZ2V0UigpID09IFNJUkxhYmVsVmFsdWVUZXN0LlRFU1RfUik7CisJCWFzc2VydFRydWUoc2lyTGFiZWwuZ2V0TmV4dFIoKSA9PSBTSVJMYWJlbFZhbHVlVGVzdC5URU1QX1RFU1RfUik7CisJCXNpckxhYmVsLnNldE5leHRWYWx1ZVZhbGlkKHRydWUpOworCQlzaXJMYWJlbC5zd2l0Y2hUb05leHRWYWx1ZSgpOworCQlhc3NlcnRUcnVlKHNpckxhYmVsLmdldFIoKSA9PSBTSVJMYWJlbFZhbHVlVGVzdC5URU1QX1RFU1RfUik7CisJCWFzc2VydFRydWUoc2lyTGFiZWwuZ2V0TmV4dFIoKSA9PSBTSVJMYWJlbFZhbHVlVGVzdC5URVNUX1IpOworCX0gLy8gdGVzdFNldEdldEN1cnJlbnROZXh0U0lSTGFiZWxSCisKKwkvKioKKwkgKiB0ZXN0IHRoYXQgdGhlIGZpeHR1cmUgaXMgc2FuZQorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RGaXh0dXJlU2FuZSgpIHsKKwkJZmluYWwgU0lSTGFiZWwgc2lyTGFiZWwgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoc2lyTGFiZWwuc2FuZSgpKTsKKwl9IC8vIHRlc3RGaXh0dXJlU2FuZQorCit9IC8vIFNJUkxhYmVsVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0lSTGFiZWxWYWx1ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NJUkxhYmVsVmFsdWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE1ODIyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NJUkxhYmVsVmFsdWVUZXN0LmphdmEKQEAgLTAsMCArMSwxNTcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUkxhYmVsVmFsdWU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TSVJMYWJlbFZhbHVlSW1wbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNJUiBMYWJlbCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgU0lSTGFiZWxWYWx1ZVRlc3QgZXh0ZW5kcyBTSUxhYmVsVmFsdWVUZXN0IHsKKwkvKioKKwkgKiBUZXN0IHZhbHVlIGZvciByZWNvdmVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBURVNUX1IgPSAzOworCisJLyoqCisJICogVGVzdCB2YWx1ZSBmb3IgcmVjb3ZlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgVEVNUF9URVNUX1IgPSBURVNUX1IgKyAzMDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihTSVJMYWJlbFZhbHVlVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBTSVIgTGFiZWwgVmFsdWUgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU0lSTGFiZWxWYWx1ZVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTSVIgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU0lSTGFiZWxWYWx1ZSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFNJUkxhYmVsVmFsdWUpZml4dHVyZTsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwlwcml2YXRlIFNJUkxhYmVsVmFsdWUgZ2V0VGVtcEZpeHR1cmUoKSB7CisJCXJldHVybiAoU0lSTGFiZWxWYWx1ZSkgdGVtcEZpeHR1cmU7CisJfSAvLyBnZXRUZW1wRml4dHVyZQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCQlzZXRUZW1wRml4dHVyZShjcmVhdGVUZW1wRml4dHVyZSgpKTsKKwl9IC8vIHNldFVwCisKKwkvKioKKwkgKiBAcmV0dXJuIGEgdmFsdWUgZm9yIHRlc3RpbmcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFNJUkxhYmVsVmFsdWUgY3JlYXRlRml4dHVyZSgpIHsKKwkJZmluYWwgU0lSTGFiZWxWYWx1ZUltcGwgcmV0VmFsdWUgPSBuZXcgU0lSTGFiZWxWYWx1ZUltcGwoVEVTVF9TLAorCQkJCVRFU1RfSSwgVEVTVF9SLCAKKwkJCQlURVNUX0RJU0VBU0VfREVBVEhTKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgY3JlYXRlVGVtcEZpeHR1cmUoKSB7CisJCWZpbmFsIFNJUkxhYmVsVmFsdWVJbXBsIHJldFZhbHVlID0gbmV3IFNJUkxhYmVsVmFsdWVJbXBsKFRFTVBfVEVTVF9TLAorCQkJCVRFTVBfVEVTVF9JLCBURU1QX1RFU1RfUiwgVEVNUF9URVNUX0RJU0VBU0VfREVBVEhTKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlVGVtcEZpeHR1cmUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJCXNldFRlbXBGaXh0dXJlKG51bGwpOworCX0gLy8gdGVhckRvd24KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZ2V0RXhwZWN0ZWRDb252ZXJ0VG9Tb3VyY2VTdGF0ZXMoCisJCQlTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZml4dHVyZSkgeworCQlmaW5hbCBTSVJMYWJlbFZhbHVlIHNpTGFiZWwgPSAoU0lSTGFiZWxWYWx1ZSkgZml4dHVyZTsKKwkJcmV0dXJuIG5ldyBTSVJMYWJlbFZhbHVlSW1wbChzaUxhYmVsLmdldEkoKSwgc2lMYWJlbC5nZXRSKCksIDAuMCwKKwkJCQlzaUxhYmVsLmdldFMoKSwgCisJCQkJZml4dHVyZS5nZXREaXNlYXNlRGVhdGhzKCkpOworCX0gLy8gZ2V0RXhwZWN0ZWRDb252ZXJ0VG9Tb3VyY2VTdGF0ZXMKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGdldEV4cGVjdGVkRml4dHVyZUFkZGl0aW9uUmVzdWx0KAorCQkJRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBmaXh0dXJlMSwgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBmaXh0dXJlMikgeworCQlmaW5hbCBTSVJMYWJlbFZhbHVlIHNpckxhYmVsMSA9IChTSVJMYWJlbFZhbHVlKSBmaXh0dXJlMTsKKwkJZmluYWwgU0lSTGFiZWxWYWx1ZSBzaXJMYWJlbDIgPSAoU0lSTGFiZWxWYWx1ZSkgZml4dHVyZTI7CisJCXJldHVybiBuZXcgU0lSTGFiZWxWYWx1ZUltcGwoc2lyTGFiZWwxLmdldFMoKSArIHNpckxhYmVsMi5nZXRTKCksCisJCQkJc2lyTGFiZWwxLmdldEkoKSArIHNpckxhYmVsMi5nZXRJKCksIHNpckxhYmVsMS5nZXRSKCkKKwkJCQkJCSsgc2lyTGFiZWwyLmdldFIoKSwgIHNpckxhYmVsMS5nZXREaXNlYXNlRGVhdGhzKCkKKwkJCQkJCSsgc2lyTGFiZWwyLmdldERpc2Vhc2VEZWF0aHMoKSk7CisJfSAvLyBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBnZXRFeHBlY3RlZEZpeHR1cmVTdWJ0cmFjdGlvblJlc3VsdCgKKwkJCURpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZml4dHVyZTEsIERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgZml4dHVyZTIpIHsKKwkJZmluYWwgU0lSTGFiZWxWYWx1ZSBzaXJMYWJlbDEgPSAoU0lSTGFiZWxWYWx1ZSkgZml4dHVyZTE7CisJCWZpbmFsIFNJUkxhYmVsVmFsdWUgc2lyTGFiZWwyID0gKFNJUkxhYmVsVmFsdWUpIGZpeHR1cmUyOworCQlyZXR1cm4gbmV3IFNJUkxhYmVsVmFsdWVJbXBsKHNpckxhYmVsMS5nZXRTKCkgLSBzaXJMYWJlbDIuZ2V0UygpLAorCQkJCXNpckxhYmVsMS5nZXRJKCkgLSBzaXJMYWJlbDIuZ2V0SSgpLCBzaXJMYWJlbDEuZ2V0UigpCisJCQkJCQktIHNpckxhYmVsMi5nZXRSKCksIHNpckxhYmVsMS5nZXREaXNlYXNlRGVhdGhzKCkKKwkJCQkJCS0gc2lyTGFiZWwyLmdldERpc2Vhc2VEZWF0aHMoKSk7CisJfSAvLyBnZXRFeHBlY3RlZEZpeHR1cmVTdWJ0cmFjdGlvblJlc3VsdAorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGRvdWJsZSBnZXRFeHBlY3RlZFBvcHVsYXRpb25Db3VudChEaXNlYXNlTW9kZWxMYWJlbFZhbHVlIGZpeHR1cmUpIHsKKwkJZmluYWwgU0lSTGFiZWxWYWx1ZSBzaXJWYWx1ZSA9IChTSVJMYWJlbFZhbHVlKSBmaXh0dXJlOworCQlyZXR1cm4gc2lyVmFsdWUuZ2V0UygpICsgc2lyVmFsdWUuZ2V0SSgpICsgc2lyVmFsdWUuZ2V0UigpOworCX0gLy8gZ2V0RXhwZWN0ZWRQb3B1bGF0aW9uQ291bnQKKworfSAvLyBTSVJMYWJlbFZhbHVlVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0lSTGFiZWxWYWx1ZVRlc3RVdGlsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TSVJMYWJlbFZhbHVlVGVzdFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjYxOGUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0lSTGFiZWxWYWx1ZVRlc3RVdGlsLmphdmEKQEAgLTAsMCArMSwyNTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5Ob2RlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lSTGFiZWxJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJUkxhYmVsVmFsdWVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJRGlzZWFzZU1vZGVsU3RhdGVJbXBsOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU0lSTGFiZWxWYWx1ZVRlc3RVdGlsIGV4dGVuZHMgVGVzdENhc2V7CisJCisJLyoqCisJICogTnVtYmVyIG9mIHJhbmRvbSB2YWx1ZXMgdG8gdGVzdCB3aXRoCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTUJFUl9PRl9SQU5ET01TID0gMDsKKworCS8qKgorCSAqIG1heCBkb3VibGUgdmFsdWUgdG8gYmUgdXNlZCBpbiB0aGUgdGVzdAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBURVNUX01BWF9ET1VCTEVfVkFMVUUgPSAxZTEyZDsKKworCS8qKgorCSAqIG1heCBsb25nIHZhbHVlIHRvIGJlIHVzZWQgaW4gdGhlIHRlc3QKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRFU1RfTUFYX0xPTkdfVkFMVUUgPSBMb25nLk1BWF9WQUxVRTsKKworCS8qKgorCSAqIGlmIHRoZXJlIGlzIGEgc3lzdGVtIHByb3BlcnR5IHdpdGggdGhpcyB2YWx1ZSB0aGVuIHRoZSB0ZXN0IHdpbGwgYmUgY29tcGVyaGVuc2l2ZS4gSWYgbm90CisJICogdGhlbiB0aGUgdGVzdCB3aWxsIGNoZWNrIG9ubHkgZmV3IGNhc2VzLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QRVJIQU5TSVZFX1RFU1QgPSAiY29tcGVyaGVuc2l2ZS50ZXN0IjsKKworCXByaXZhdGUgc3RhdGljIEJvb2xlYW4gY29tcGVyaGVuc2l2ZSA9IG51bGw7CisJCisJLyoqCisJICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2Yge0BsaW5rIFNJUkxhYmVsVmFsdWVJbXBsfSBvYmplY3RzLgorCSAqIFNvbWUgb2JqZWN0cyBpbiB0aGUgbGlzdCBhcmUgcmFuZG9tIGFuZCBzb21lIG5vdCByYW5kb20gYXQgYWxsLgorCSAqIFRoZSBvbmVzIHRoYXQgYXJlIG5vdCByYW5kb20gcmVwcmVzZW50cyBleHRyZW1lIGNhc2VzLgorCSAqIFRoZSBudW1lcmljIHZhbHVlcyBmb3IgdGhlIGV4dHJlbWUgY2FzZXMgYXJlIDAuMCwgTUFYX0RPVUJMRSwgYW5kIEkgYWRkZWQgdGhlIG51bWJlciAxLjAuIAorCSAqIFRoZSBudW1iZXIgb2YgcmFuZG9tIG51bWJlcnMgdG8gdGVzdCB3aXRoIGlzIE5VTUJFUl9PRl9SQU5ET01TLgorCSAqIE5vdGUgdGhhdCB3aXRoIE5VTUJFUl9PRl9SQU5ET01TID0gMCB5b3Ugd2lsbCBoYXZlIDQzNzQgcGVybXV0YXRpb25zIG9mIGFsbCB2YWx1ZXMgb2Yge0BTSVJMYWJlbFZhbHVlSW1wbH0uCisJICogSWYgeW91IHdpc2ggdG8gbWFrZSBOVU1CRVJfT0ZfUkFORE9NUyBoaWdoZXIgdGhlbiAwIHRoZW4gYmUgcmVhZHkgZm9yIGEgbG9uZyB0ZXN0IDotKQorCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdDxTSVJMYWJlbFZhbHVlSW1wbD4gY3JlYXRlUmFuZG9tU0lSTGFiZWxWYWx1ZUltcGwoKXsKKwkJUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKKwkJZG91YmxlW10gdmFsdWVzID0gbmV3IGRvdWJsZVszICsgTlVNQkVSX09GX1JBTkRPTVNdOworCQl2YWx1ZXNbMF0gPSAwLjBkOworCQl2YWx1ZXNbMV0gPSBURVNUX01BWF9ET1VCTEVfVkFMVUU7CisJICAgIHZhbHVlc1syXSA9IDEuMGQ7CisJCWZvcihpbnQgaSA9ICh2YWx1ZXMubGVuZ3RoICsgMSk7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspeworCQkJdmFsdWVzW2ldID0gcmFuZG9tLm5leHREb3VibGUoKSAqIFRFU1RfTUFYX0RPVUJMRV9WQUxVRTsKKwkJfQorCQlMaXN0PFNJUkxhYmVsVmFsdWVJbXBsPiBtb2RlbExldmVsVmFsdWVzID0gbmV3IExpbmtlZExpc3Q8U0lSTGFiZWxWYWx1ZUltcGw+KCk7CisJCWludCBpdGVyYXRpb24gPSAwOworCQlmb3IoZG91YmxlIHMgOiB2YWx1ZXMpeworCQkJZm9yKGRvdWJsZSBlIDogdmFsdWVzKXsKKwkJCQlmb3IoZG91YmxlIGkgOiB2YWx1ZXMpeworCQkJCQlmb3IoZG91YmxlIHIgOiB2YWx1ZXMpeworCQkJCQkJZm9yKGRvdWJsZSBiaXJ0aHMgOiB2YWx1ZXMpeworCQkJCQkJCWZvcihkb3VibGUgZGVhdGhzIDogdmFsdWVzKXsKKwkJCQkJCQkJZm9yKGRvdWJsZSBkaXNlYXNlRGVhdGhzIDogdmFsdWVzKXsKKwkJCQkJCQkJCWlmKGRpc2Vhc2VEZWF0aHMgPiBkZWF0aHMpeworCQkJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCQkJfQorCQkJCQkJCQkJaWYoc2tpcFZhbHVlU2V0KGl0ZXJhdGlvbisrLCBkaXNlYXNlRGVhdGhzLCBkZWF0aHMsIHMsIGUsIGksIHIpKXsKKwkJCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCVNJUkxhYmVsVmFsdWVJbXBsIG1vZGVsTGFibGVWYWx1ZSA9IG5ldyBTSVJMYWJlbFZhbHVlSW1wbChzLCBpLCByLCBkaXNlYXNlRGVhdGhzKTsKKwkJCQkJCQkJCWFzc2VydFRydWUoIlRoZSBTSVJMYWJlbFZhbHVlSW1wbDogIiArIG1vZGVsTGFibGVWYWx1ZSArICIgaXMgaW5zYW5lISIsIG1vZGVsTGFibGVWYWx1ZS5zYW5lKCkpOworCQkJCQkJCQkJbW9kZWxMZXZlbFZhbHVlcy5hZGQobW9kZWxMYWJsZVZhbHVlKTsKKwkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtb2RlbExldmVsVmFsdWVzLnNpemUoKSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG1vZGVsTGV2ZWxWYWx1ZXM7CisJfQorCQorCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2tpcFZhbHVlU2V0KGRvdWJsZSBpdGVyYXRpb24sIGRvdWJsZSBkaXNlYXNlRGVhdGhzLCBkb3VibGUgZGVhdGhzLCBkb3VibGUgcywgZG91YmxlIGUsIGRvdWJsZSBpLCBkb3VibGUgcikgeworCQlpZighaXNDb21wZXJoZW5zaXZlKCkpeworCQkJaWYoaXRlcmF0aW9uICUgNTAwID4gMSl7CisJCQkJLy9kbyBvbmx5IG9uZSBvZiBhbnkgNTAwIHBlcm11dGF0aW9ucworCQkJCVN5c3RlbS5vdXQucHJpbnQoIi4iKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlpZihkaXNlYXNlRGVhdGhzID4gZGVhdGhzKXsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWRvdWJsZSBwb3B1bGF0aW9uID0gcyArIGkgKyByOworCQlpZihkZWF0aHMgPiBwb3B1bGF0aW9uKXsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmKGRpc2Vhc2VEZWF0aHMgPiBwb3B1bGF0aW9uKXsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbXBlcmhlbnNpdmUoKSB7CisJCWlmKG51bGwgIT0gY29tcGVyaGVuc2l2ZSApeworCQkJcmV0dXJuIGNvbXBlcmhlbnNpdmUuYm9vbGVhblZhbHVlKCk7CisJCX0KKwkJU3RyaW5nIGNvbXBlcmhlbnNpdmVQcm9wZXJ0eSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShDT01QRVJIQU5TSVZFX1RFU1QpOworCQlpZihudWxsICE9IGNvbXBlcmhlbnNpdmVQcm9wZXJ0eSl7CisJCQljb21wZXJoZW5zaXZlUHJvcGVydHkgPSBjb21wZXJoZW5zaXZlUHJvcGVydHkudHJpbSgpOworCQkJaWYoY29tcGVyaGVuc2l2ZVByb3BlcnR5LmVxdWFsc0lnbm9yZUNhc2UoInllcyIpIHx8IGNvbXBlcmhlbnNpdmVQcm9wZXJ0eS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpewkJCQorCQkJCWNvbXBlcmhlbnNpdmUgPSBuZXcgQm9vbGVhbih0cnVlKTsKKwkJCX0KKwkJfQorCQlpZihudWxsID09IGNvbXBlcmhlbnNpdmUgKXsKKwkJCWNvbXBlcmhlbnNpdmUgPSBuZXcgQm9vbGVhbihmYWxzZSk7CisJCX0KKwkJcmV0dXJuIGNvbXBlcmhlbnNpdmUuYm9vbGVhblZhbHVlKCk7CisJfQorCS8qKgorCSAqIENsb25lIHRoZSBTSVJMYWJlbFZhbHVlSW1wbAorCSAqIEBwYXJhbSBvcmlnaW5hbCB3aWxsIG5vdCBiZSBtb2RlZmlsZXMKKwkgKiBAcmV0dXJuIGEgY2xvbmUgb2YgJ29yaWdpbmFsJworCSAqLworCXB1YmxpYyBzdGF0aWMgU0lSTGFiZWxWYWx1ZUltcGwgY2xvbmVTSVJMYWJlbFZhbHVlSW1wbChTSVJMYWJlbFZhbHVlSW1wbCBvcmlnaW5hbCl7CisJCVNJUkxhYmVsVmFsdWVJbXBsIHZhbHVlID0gIG5ldyBTSVJMYWJlbFZhbHVlSW1wbChvcmlnaW5hbC5nZXRTKCksIG9yaWdpbmFsLmdldEkoKSwgCisJCQkJb3JpZ2luYWwuZ2V0UigpLCBvcmlnaW5hbC5nZXREaXNlYXNlRGVhdGhzKCkpOworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2Yge0BsaW5rIFNJUkxhYmVsSW1wbH0gb2JqZWN0cy4KKwkgKiBTb21lIG9iamVjdHMgaW4gdGhlIGxpc3QgYXJlIHJhbmRvbSBhbmQgc29tZSBub3QgcmFuZG9tIGF0IGFsbC4KKwkgKiBUaGUgb25lcyB0aGF0IGFyZSBub3QgcmFuZG9tIHJlcHJlc2VudHMgZXh0cmVtZSBjYXNlcy4KKwkgKiBUaGUgbnVtZXJpYyB2YWx1ZXMgZm9yIHRoZSBleHRyZW1lIGNhc2VzIGFyZSAwLjAsIE1BWF9ET1VCTEUsIGFuZCBJIGFkZGVkIHRoZSBudW1iZXIgMS4wLiAKKwkgKiBUaGUgbnVtYmVyIG9mIHJhbmRvbSBudW1iZXJzIHRvIHRlc3Qgd2l0aCBpcyBOVU1CRVJfT0ZfUkFORE9NUy4KKwkgKiBOb3RlIHRoYXQgd2l0aCBOVU1CRVJfT0ZfUkFORE9NUyA9IDAgeW91IHdpbGwgaGF2ZSA0Mzc0IHBlcm11dGF0aW9ucyBvZiBhbGwgdmFsdWVzIG9mIHtTSVJMYWJlbEltcGx9LgorCSAqIElmIHlvdSB3aXNoIHRvIG1ha2UgTlVNQkVSX09GX1JBTkRPTVMgaGlnaGVyIHRoZW4gMCB0aGVuIGJlIHJlYWR5IGZvciBhIGxvbmcgdGVzdCA6LSkKKwkgKiAKKwkgKi8KKwlwdWJsaWMgTGlzdDxTSVJMYWJlbEltcGw+IGNyZWF0ZVJhbmRvbVNJUkxhYmVsSW1wbCgpeworCQlSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOworCQlkb3VibGVbXSB2YWx1ZXMgPSBuZXcgZG91YmxlWzMgKyBOVU1CRVJfT0ZfUkFORE9NU107CisJCXZhbHVlc1swXSA9IDAuMGQ7CisJCXZhbHVlc1sxXSA9IFRFU1RfTUFYX0RPVUJMRV9WQUxVRTsKKwkJdmFsdWVzWzJdID0gMS4wZDsKKwkJZm9yKGludCBpID0gMzsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKyl7CisJCQl2YWx1ZXNbaV0gPSByYW5kb20ubmV4dERvdWJsZSgpICogVEVTVF9NQVhfRE9VQkxFX1ZBTFVFOworCQl9CisJCUxpc3Q8U0lSTGFiZWxJbXBsPiBtb2RlbExldmVsVmFsdWVzID0gbmV3IExpbmtlZExpc3Q8U0lSTGFiZWxJbXBsPigpOworCQlpbnQgaXRlcmF0aW9uID0gMDsKKwkJZm9yKGRvdWJsZSBzIDogdmFsdWVzKXsKKwkJCWZvcihkb3VibGUgZSA6IHZhbHVlcyl7CisJCQkJZm9yKGRvdWJsZSBpIDogdmFsdWVzKXsKKwkJCQkJZm9yKGRvdWJsZSByIDogdmFsdWVzKXsKKwkJCQkJCWZvcihkb3VibGUgYmlydGhzIDogdmFsdWVzKXsKKwkJCQkJCQlmb3IoZG91YmxlIGRlYXRocyA6IHZhbHVlcyl7CisJCQkJCQkJCWZvcihkb3VibGUgZGlzZWFzZURlYXRocyA6IHZhbHVlcyl7CisJCQkJCQkJCQlpZihza2lwVmFsdWVTZXQoaXRlcmF0aW9uKyssIGRpc2Vhc2VEZWF0aHMsIGRlYXRocywgcywgZSwgaSwgcikpeworCQkJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCQkJfQorCQkJCQkJCQkJU0lSTGFiZWxJbXBsIG1vZGVsTGFibGUgPSBuZXcgU0lSTGFiZWxUZXN0ZXJJbXBsKHMsIGksIHIsIGJpcnRocywgZGVhdGhzLCBkaXNlYXNlRGVhdGhzLCAKKwkJCQkJCQkJCQkJbmV3IFNJRGlzZWFzZU1vZGVsU3RhdGVUZXN0ZXJJbXBsKCksIG5ldyBOb2RlVGVzdGVySW1wbCgpKTsKKwkJCQkJCQkJCWFzc2VydFRydWUoIlRoZSBTSVJMYWJlbEltcGw6ICIgKyBtb2RlbExhYmxlICsgIiBpcyBpbnNhbmUhIiwgbW9kZWxMYWJsZS5zYW5lKCkpOworCQkJCQkJCQkJbW9kZWxMZXZlbFZhbHVlcy5hZGQobW9kZWxMYWJsZSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwlyZXR1cm4gbW9kZWxMZXZlbFZhbHVlczsKKwl9CisJCisJCisKKwlwcml2YXRlIGNsYXNzIFNJRGlzZWFzZU1vZGVsU3RhdGVUZXN0ZXJJbXBsIGV4dGVuZHMgU0lEaXNlYXNlTW9kZWxTdGF0ZUltcGx7CisJCXB1YmxpYyBTSURpc2Vhc2VNb2RlbFN0YXRlVGVzdGVySW1wbCgpeworCQkJc3VwZXIoKTsKKwkJfQorCX0KKwkKKwkKKwlwcml2YXRlIGNsYXNzIFNJUkxhYmVsVGVzdGVySW1wbCBleHRlbmRzIFNJUkxhYmVsSW1wbHsKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIAorCQkgKiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGluc3RhbmNlcyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKwkJICogCisJCSAqIEBwYXJhbSBzCisJCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBzdXNjZXB0aWJsZSBwb3B1bGF0aW9uIG1lbWJlcnMKKwkJICogQHBhcmFtIGlSCisJCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiByZWNvdmVyaW5nIGluZmVjdGlvdXMgcG9wdWxhdGlvbiBtZW1iZXJzCisJCSAqIEBwYXJhbSBpRgorCQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZmF0YWxseSBpbmZlY3Rpb3VzIHBvcHVsYXRpb24gbWVtYmVycworCQkgKiBAcGFyYW0gcgorCQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcmVjb3ZlcmVkIHBvcHVsYXRpb24gbWVtYmVycworCQkgKiBAcGFyYW0gYmlydGhzCisJCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBiaXJ0aHMgdGhhdCBoYXZlIG9jY3VyZWQgaW4gdGhlIHBvcHVsYXRpb24KKwkJICogQHBhcmFtIGRlYXRocworCQkgKiAgICAgICAgICAgIHRoZSB0b3RhbCBudW1iZXIgb2YgZGVhdGhzIHRoYXQgaGF2ZSBvY2N1cmVkIGluIHRoZSBwb3B1bGF0aW9uCisJCSAqIEBwYXJhbSBkaXNlYXNlRGVhdGhzCisJCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBkZWF0aHMgZHVlIHRvIHRoZSBkaXNlYXNlIHRoYXQgaGF2ZSBvY2N1cmVkIGluCisJCSAqICAgICAgICAgICAgdGhlIHBvcHVsYXRpb24KKwkJICogCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAcGFyYW0gbmV3RGlzZWFzZU1vZGVsU3RhdGUgCisJCSAqIEBwYXJhbSBuZXdOb2RlIAorCQkgKi8KKwkJcHVibGljIFNJUkxhYmVsVGVzdGVySW1wbChmaW5hbCBkb3VibGUgcywgZmluYWwgZG91YmxlIGksCisJCQkJZmluYWwgZG91YmxlIHIsIGZpbmFsIGRvdWJsZSBiaXJ0aHMsIGZpbmFsIGRvdWJsZSBkZWF0aHMsCisJCQkJZmluYWwgZG91YmxlIGRpc2Vhc2VEZWF0aHMsIGZpbmFsIERpc2Vhc2VNb2RlbFN0YXRlIG5ld0Rpc2Vhc2VNb2RlbFN0YXRlLCBOb2RlIG5ld05vZGUpIHsKKwkJCXN1cGVyKCk7CisJCQlzZXRTKHMpOworCQkJc2V0SShpKTsKKwkJCXNldFIocik7CisJCQlzZXREaXNlYXNlRGVhdGhzKGRpc2Vhc2VEZWF0aHMpOworCQkJc2V0RGlzZWFzZU1vZGVsU3RhdGUobmV3RGlzZWFzZU1vZGVsU3RhdGUpOworCQkJc2V0Tm9kZShuZXdOb2RlKTsKKwkJfSAvLyBTSVJMYWJlbFZhbHVlSW1wbAkKKwl9CisKKwlwcml2YXRlIGNsYXNzIE5vZGVUZXN0ZXJJbXBsIGV4dGVuZHMgTm9kZUltcGx7CisJCXB1YmxpYyBOb2RlVGVzdGVySW1wbCgpeworCQkJc3VwZXIoKTsKKwkJfQorCX0KKwkKKwkKKwlwdWJsaWMgbG9uZ1tdIGNyZWF0ZXJhbmRvbURlbHRhcygpIHsKKwkJUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKKwkJbG9uZ1tdIHZhbHVlcyA9IG5ldyBsb25nWzIgKyBOVU1CRVJfT0ZfUkFORE9NU107CisJCXZhbHVlc1swXSA9IFRFU1RfTUFYX0xPTkdfVkFMVUU7CisJCXZhbHVlc1sxXSA9IDFsOworCQlmb3IoaW50IGkgPSAzOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKXsKKwkJCXZhbHVlc1tpXSA9IHJhbmRvbS5uZXh0TG9uZygpICogVEVTVF9NQVhfTE9OR19WQUxVRTsKKwkJfQorCQlyZXR1cm4gdmFsdWVzOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NJUlRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1NJUlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDMxZjg2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0lSVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U0lSPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgYXJlIHRlc3RlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSI2dldEFkanVzdGVkSW1tdW5pdHlMb3NzUmF0ZShsb25nKSA8ZW0+R2V0IEFkanVzdGVkIEltbXVuaXR5IExvc3MgUmF0ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU0lSVGVzdCBleHRlbmRzIFNJVGVzdCB7CisKKwkvKioKKwkgKiBUaGlzIGNvZWZmaWNpZW50IGRldGVybWluZXMgdGhlIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgdGhhdCBsb3NlCisJICogdGhlaXIgaW1tdW5pdHkgdG8gYSBkaXNlYXNlIGFuZCBiZWNvbWUgU3VzY2VwdGlibGUgdG8gdGhlIGRpc2Vhc2UgcGVyCisJICogcG9wdWxhdGlvbiBtZW1iZXIgaW4gdGhlIDxlbT5SZWNvdmVyZWQ8L2VtPiBzdGF0ZS4gQSB2YWx1ZSBvZiB6ZXJvCisJICogKDAuMCksIHRoZSBkZWZhdWx0LCBtZWFucyB0aGUgcG9wdWxhdGlvbiBtZW1iZXJzIG5ldmVyIGxvc2UgdGhlaXIKKwkgKiBpbW11bml0eS4gVW5pdHM6IHBvcHVsYXRpb24gbWVtYmVycworCSAqIAorCSAqIEBzZWUgU0lSI2dldEltbXVuaXR5TG9zc1JhdGUoKQorCSAqLworCWZpbmFsIHB1YmxpYyBzdGF0aWMgZG91YmxlIElNTVVOSVRZX0xPU1NfUkFURSA9IDAuMTsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgU0lSIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU0lSVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNJUiB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFNJUiBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFNJUilmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVIjZ2V0QWRqdXN0ZWRJbW11bml0eUxvc3NSYXRlIDxlbT5HZXQgQWRqdXN0ZWQgSW1tdW5pdHkgTG9zcyBSYXRlPC9lbT59JworCSAqIG9wZXJhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSI2dldEFkanVzdGVkSW1tdW5pdHlMb3NzUmF0ZQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldEFkanVzdGVkSW1tdW5pdHlMb3NzUmF0ZV9fbG9uZygpIHsKKwkJZmluYWwgU0lSIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoRGlzZWFzZU1vZGVsVGVzdFV0aWwuY2xvc2VFbm91Z2goZml4dHVyZQorCQkJCS5nZXRBZGp1c3RlZEltbXVuaXR5TG9zc1JhdGUoMiAqIGZpeHR1cmUuZ2V0VGltZVBlcmlvZCgpKSwKKwkJCQkoMiAqIGZpeHR1cmUuZ2V0SW1tdW5pdHlMb3NzUmF0ZSgpKSkpOworCX0gLy8gdGVzdEdldEFkanVzdGVkSW1tdW5pdHlMb3NzUmF0ZV9fbG9uZworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgY3JlYXRlTGFiZWxGaXh0dXJlKCkgeworCQlyZXR1cm4gU0lSTGFiZWxUZXN0LmNyZWF0ZUZpeHR1cmUoKTsKKwl9IC8vIGNyZWF0ZUxhYmVsVmFsdWVGaXh0dXJlCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGdldERpc2Vhc2VNb2RlbExhYmVsQ2xhc3MoKSB7CisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNJUkxhYmVsKCk7CisJfSAvLyBnZXREaXNlYXNlTW9kZWxMYWJlbENsYXNzCisKK30gLy8gU0lSVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0lUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TSVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGU0NGRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU0lUZXN0LmphdmEKQEAgLTAsMCArMSwyMDMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TSTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSB0ZXN0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJI2dldEFkanVzdGVkSW5mZWN0aW91c01vcnRhbGl0eVJhdGUobG9uZykgPGVtPkdldCBBZGp1c3RlZCBJbmZlY3Rpb3VzIE1vcnRhbGl0eSBSYXRlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kjZ2V0QWRqdXN0ZWRUcmFuc21pc3Npb25SYXRlKGxvbmcpIDxlbT5HZXQgQWRqdXN0ZWQgVHJhbnNtaXNzaW9uIFJhdGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRBZGp1c3RlZFJlY292ZXJ5UmF0ZShsb25nKSA8ZW0+R2V0IEFkanVzdGVkIFJlY292ZXJ5IFJhdGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRFZmZlY3RpdmVJbmZlY3Rpb3VzKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlLCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCwgZG91YmxlKSA8ZW0+R2V0IEVmZmVjdGl2ZSBJbmZlY3Rpb3VzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kjZ2V0Tm9ybWFsaXplZEVmZmVjdGl2ZUluZmVjdGlvdXMob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGUsIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsLCBkb3VibGUpIDxlbT5HZXQgTm9ybWFsaXplZCBFZmZlY3RpdmUgSW5mZWN0aW91czwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU0lUZXN0IGV4dGVuZHMgU3RhbmRhcmREaXNlYXNlTW9kZWxUZXN0IHsKKworCS8qKgorCSAqIFRoaXMgY29lZmZpY2llbnQgZGV0ZXJtaW5lcyB0aGUgaW5jcmVhc2VkIHJhdGUgYXQgd2hpY2ggaW5mZWN0aW91cyBwb3B1bGF0aW9uCisJICogbWVtYmVycyBkaWUgcGVyIHRpbWUgcGVyaW9kIGR1ZSB0byB0aGUgZGlzZWFzZS4gVGhpcyBpcworCSAqIDxlbT4mbXU7PHN1Yj5pPC9zdWI+LgorCSAqLworCWZpbmFsIHB1YmxpYyBzdGF0aWMgZG91YmxlIElORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUgPSAwLjE7CisKKwkvKioKKwkgKiBUaGlzIGNvZWZmaWNpZW50IGRldGVybWluZXMgdGhlIG51bWJlciBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgdGhhdCBiZWNvbWUKKwkgKiBpbmZlY3RlZC9leHBvc2VkIHBlciBwb3B1bGF0aW9uIG1lbWJlciBpbiB0aGUgPGVtPkluZmVjdGlvdXM8L2VtPgorCSAqIHN0YXRlLCBhc3N1bWluZyB0aGUgZW50aXJlIHBvcHVsYXRpb24gaXMgaW4gdGhlIDxlbT5TdXNjZXB0aWJsZTwvZW0+CisJICogc3RhdGUsIHBlciB0aW1lIHBlcmlvZC4gVGhpcyBpcyA8ZW0+JmJldGE7PC9lbT4KKwkgKiAKKwkgKiBAc2VlIFNJI2dldFRyYW5zbWlzc2lvblJhdGUoKQorCSAqLworCWZpbmFsIHB1YmxpYyBzdGF0aWMgZG91YmxlIFRSQU5TTUlTU0lPTl9SQVRFID0gMC4xOworCisJLyoqCisJICogQnkgZGVmYXVsdCB0aGlzIGV4cG9uZW50IGlzIG9uZSAoMS4wKSBhbmQgdGhlIHJhdGUgb2YgaW5mZWN0aW9uIHNjYWxlcyBhcworCSAqIHRoZSBwcm9kdWN0IG9mIHRoZSBTdXNjZXB0aWJsZSBwb3B1bGF0aW9uIGFuZCB0aGUgSW5mZWN0aW91cyBwb3B1bGF0aW9uLgorCSAqIEluIGEgbm9ubGluZWFyIG1vZGVsICh3aGljaCBjYXB0dXJlcyBzYXR1cmF0aW9uIG9mIHRoZSBpbW11bmUgc3lzdGVtIGZvcgorCSAqIFN1c2NlcHRpYmxlIHBvcHVsYXRpb24pLCB0aGUgSW5mZWN0aW91cyB0ZXJtIGlzIHJhaXNlIHRvIHRoaXMgcG93ZXIgKD49CisJICogMC4wKSBUaGlzIGV4cG9uZW50IHNob3VsZCBuZXZlciBiZSBsZXNzIHRoYW4gemVyby4gVGhlIGRlZmF1bHQgdmFsdWUgb2YgMS4wIGJhc2ljYWxseSByZW1vdmVzIGl0IGZyb20KKwkgKiB0aGUgY29tcHV0YXRpb24uCisJICogCisJICogQHNlZSBTSSNnZXROb25MaW5lYXJpdHlDb2VmZmljaWVudCgpCisJICovCisJZmluYWwgcHVibGljIHN0YXRpYyBkb3VibGUgTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVCA9IDEuMDsKKworCS8qKgorCSAqIFRoaXMgY29lZmZpY2llbnQgZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHBvcHVsYXRpb24gbWVtYmVycyB0aGF0IHJlY292ZXIKKwkgKiBmcm9tIHRoZSBkaXNlYXNlIHBlciBwb3B1bGF0aW9uIG1lbWJlciBpbiB0aGUgPGVtPkluZmVjdGlvdXM8L2VtPgorCSAqIHN0YXRlLiBUaGlzIGlzIDxlbT4mc2lnbWE7PC9lbT4uCisJICogCisJICogQHNlZSBTSSNnZXRSZWNvdmVyeVJhdGUoKQorCSAqLworCWZpbmFsIHB1YmxpYyBzdGF0aWMgZG91YmxlIFJFQ09WRVJZX1JBVEUgPSAwLjAxOworCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBTSSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+CisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNJVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNJIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU0kgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChTSSlmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRBZGp1c3RlZEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKGxvbmcpIDxlbT5HZXQgQWRqdXN0ZWQgSW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZTwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kjZ2V0QWRqdXN0ZWRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZShsb25nKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldEFkanVzdGVkSW5mZWN0aW91c01vcnRhbGl0eVJhdGVfX2xvbmcoKSB7CisJCWZpbmFsIFNJIGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoRGlzZWFzZU1vZGVsVGVzdFV0aWwuY2xvc2VFbm91Z2goZml4dHVyZQorCQkJCS5nZXRBZGp1c3RlZEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKDIgKiBmaXh0dXJlLmdldFRpbWVQZXJpb2QoKSksCisJCQkJKDIgKiBmaXh0dXJlLmdldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKCkpKSk7CisJfSAvLyB0ZXN0R2V0QWRqdXN0ZWRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZV9fbG9uZworCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJI2dldEFkanVzdGVkVHJhbnNtaXNzaW9uUmF0ZSA8ZW0+R2V0IEFkanVzdGVkIFRyYW5zbWlzc2lvbiBSYXRlPC9lbT59JworCSAqIG9wZXJhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kjZ2V0QWRqdXN0ZWRUcmFuc21pc3Npb25SYXRlCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0QWRqdXN0ZWRUcmFuc21pc3Npb25SYXRlX19sb25nKCkgeworCQlmaW5hbCBTSSBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKERpc2Vhc2VNb2RlbFRlc3RVdGlsLmNsb3NlRW5vdWdoKGZpeHR1cmUKKwkJCQkuZ2V0QWRqdXN0ZWRUcmFuc21pc3Npb25SYXRlKDIgKiBmaXh0dXJlLmdldFRpbWVQZXJpb2QoKSksCisJCQkJKDIgKiBmaXh0dXJlLmdldFRyYW5zbWlzc2lvblJhdGUoKSkpKTsKKwl9IC8vIHRlc3RHZXRBZGp1c3RlZFRyYW5zbWlzc2lvblJhdGVfX2xvbmcKKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRBZGp1c3RlZFJlY292ZXJ5UmF0ZSA8ZW0+R2V0IEFkanVzdGVkIFJlY292ZXJ5IFJhdGU8L2VtPn0nCisJICogb3BlcmF0aW9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRBZGp1c3RlZFJlY292ZXJ5UmF0ZQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldEFkanVzdGVkUmVjb3ZlcnlSYXRlX19sb25nKCkgeworCQlmaW5hbCBTSSBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKERpc2Vhc2VNb2RlbFRlc3RVdGlsLmNsb3NlRW5vdWdoKGZpeHR1cmUKKwkJCQkuZ2V0QWRqdXN0ZWRSZWNvdmVyeVJhdGUoMiAqIGZpeHR1cmUuZ2V0VGltZVBlcmlvZCgpKSwKKwkJCQkoMiAqIGZpeHR1cmUuZ2V0UmVjb3ZlcnlSYXRlKCkpKSk7CisJfSAvLyB0ZXN0R2V0QWRqdXN0ZWRSZWNvdmVyeVJhdGVfX2xvbmcKKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRFZmZlY3RpdmVJbmZlY3Rpb3VzKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlLCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCwgZG91YmxlKSA8ZW0+R2V0IEVmZmVjdGl2ZSBJbmZlY3Rpb3VzPC9lbT59JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRFZmZlY3RpdmVJbmZlY3Rpb3VzKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlLCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCwgZG91YmxlKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldEVmZmVjdGl2ZUluZmVjdGlvdXNfX05vZGVfU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbF9kb3VibGUoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG9wZXJhdGlvbiB0ZXN0IG1ldGhvZAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQlhc3NlcnRUcnVlKHRydWUpOworCX0KKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cyhvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZSwgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwsIGRvdWJsZSkgPGVtPkdldCBOb3JtYWxpemVkIEVmZmVjdGl2ZSBJbmZlY3Rpb3VzPC9lbT59JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91cyhvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZSwgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwsIGRvdWJsZSkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91c19fTm9kZV9TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsX2RvdWJsZSgpIHsKKwkJLy8gVE9ETzogaW1wbGVtZW50IHRlc3RHZXROb3JtYWxpemVkRWZmZWN0aXZlSW5mZWN0aW91c19fTm9kZV9TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsX2RvdWJsZQorCQlhc3NlcnRUcnVlKHRydWUpOworCX0KKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSSNnZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlLCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCkgPGVtPkdldCBQaHlzaWNhbGx5IEFkamFjZW50IEluZmVjdGlvdXM8L2VtPn0nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJI2dldFBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXMob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGUsIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldFBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNfX05vZGVfU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCgpIHsKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0kjZ2V0UGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91cyhvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZSkgPGVtPkdldCBQaHlzaWNhbGx5IEFkamFjZW50IEluZmVjdGlvdXM8L2VtPn0nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJI2dldFBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXMob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGUpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0UGh5c2ljYWxseUFkamFjZW50SW5mZWN0aW91c19fTm9kZSgpIHsKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBjcmVhdGVMYWJlbEZpeHR1cmUoKSB7CisJCXJldHVybiBTSUxhYmVsVGVzdC5jcmVhdGVGaXh0dXJlKCk7CisJfSAvLyBjcmVhdGVMYWJlbFZhbHVlRml4dHVyZQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBnZXREaXNlYXNlTW9kZWxMYWJlbENsYXNzKCkgeworCQlyZXR1cm4gU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTSUxhYmVsKCk7CisJfSAvLyBnZXREaXNlYXNlTW9kZWxMYWJlbENsYXNzCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGdldERpc2Vhc2VNb2RlbFN0YXRlQ2xhc3MoKSB7CisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNJRGlzZWFzZU1vZGVsU3RhdGUoKTsKKwl9IC8vIGdldERpc2Vhc2VNb2RlbFN0YXRlQ2xhc3MKKworfSAvLyBTSVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1Nhbml0eUNoZWNrZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TYW5pdHlDaGVja2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOWU1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TYW5pdHlDaGVja2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TYW5pdHkgQ2hlY2tlcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNhbml0eUNoZWNrZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgU2FuaXR5IENoZWNrZXIgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTYW5pdHlDaGVja2VyIGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBTYW5pdHkgQ2hlY2tlciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU2FuaXR5Q2hlY2tlclRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTYW5pdHkgQ2hlY2tlciB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShTYW5pdHlDaGVja2VyIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNhbml0eSBDaGVja2VyIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU2FuaXR5Q2hlY2tlciBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKK30gLy9TYW5pdHlDaGVja2VyVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNjMTY3ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxUZXN0LmphdmEKQEAgLTAsMCArMSw5NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2Vhc2UgTW9kZWwgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVGVzdCBleHRlbmRzCisJCURpc2Vhc2VNb2RlbExhYmVsVGVzdCB7CisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBEaXNlYXNlIE1vZGVsIExhYmVsIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRGlzZWFzZSBNb2RlbCBMYWJlbCB0ZXN0IGNhc2UuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCNnZXRDdXJyZW50U3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCkgPGVtPkN1cnJlbnQgU3RhbmRhcmQgRGlzZWFzZSBNb2RlbCBMYWJlbCBWYWx1ZTwvZW0+fScKKwkgKiBmZWF0dXJlIGdldHRlci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCNnZXRDdXJyZW50U3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRDdXJyZW50U3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKCkgeworCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIHN0YW5kYXJkTGFiZWwgPSBnZXRGaXh0dXJlKCk7CisJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSB2YWx1ZSA9IChTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpc3RhbmRhcmRMYWJlbAorCQkJCS5nZXRDdXJyZW50VmFsdWUoKTsKKwkJYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7CisJfSAvLyB0ZXN0R2V0Q3VycmVudFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwjZ2V0TmV4dFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpIDxlbT5OZXh0IFN0YW5kYXJkIERpc2Vhc2UgTW9kZWwgTGFiZWwgVmFsdWU8L2VtPn0nCisJICogZmVhdHVyZSBnZXR0ZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwjZ2V0TmV4dFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TmV4dFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSgpIHsKKwkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBzdGFuZGFyZExhYmVsID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgdmFsdWUgPSAoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlKXN0YW5kYXJkTGFiZWwKKwkJCQkuZ2V0TmV4dFZhbHVlKCk7CisJCWFzc2VydE5vdE51bGwodmFsdWUpOworCX0gLy8gdGVzdEdldE5leHRTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwjc2V0Uyhkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCNnZXRTKCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsI3NldE5leHRTKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsI2dldE5leHRTKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0Q3VycmVudE5leHRTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsUygpIHsKKwkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBzdGFuZGFyZExhYmVsID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKHN0YW5kYXJkTGFiZWwuZ2V0UygpID09IDAuMCk7CisJCWFzc2VydFRydWUoc3RhbmRhcmRMYWJlbC5nZXROZXh0UygpID09IDAuMCk7CisJCXN0YW5kYXJkTGFiZWwuc2V0UyhTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVUZXN0LlRFU1RfUyk7CisJCXN0YW5kYXJkTGFiZWwuc2V0TmV4dFMoU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlVGVzdC5URU1QX1RFU1RfUyk7CisJCWFzc2VydFRydWUoc3RhbmRhcmRMYWJlbC5nZXRTKCkgPT0gU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlVGVzdC5URVNUX1MpOworCQlhc3NlcnRUcnVlKHN0YW5kYXJkTGFiZWwuZ2V0TmV4dFMoKSA9PSBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVUZXN0LlRFTVBfVEVTVF9TKTsKKwkJc3RhbmRhcmRMYWJlbC5zZXROZXh0VmFsdWVWYWxpZCh0cnVlKTsKKwkJc3RhbmRhcmRMYWJlbC5zd2l0Y2hUb05leHRWYWx1ZSgpOworCQlhc3NlcnRUcnVlKHN0YW5kYXJkTGFiZWwuZ2V0UygpID09IFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZVRlc3QuVEVNUF9URVNUX1MpOworCQlhc3NlcnRUcnVlKHN0YW5kYXJkTGFiZWwuZ2V0TmV4dFMoKSA9PSBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVUZXN0LlRFU1RfUyk7CisJfSAvLyB0ZXN0U2V0R2V0Q3VycmVudE5leHRTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsUworCit9IC8vIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2MmY4OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZVRlc3QuamF2YQpAQCAtMCwwICsxLDcwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzZWFzZSBNb2RlbCBMYWJlbCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZVRlc3QgZXh0ZW5kcworCQlEaXNlYXNlTW9kZWxMYWJlbFZhbHVlVGVzdCB7CisJLyoqCisJICogVGVzdCB2YWx1ZSBmb3IgU3VzY2VwdGlibGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBURVNUX1MgPSAxOworCisJLyoqCisJICogVGVzdCB2YWx1ZSBmb3IgU3VzY2VwdGlibGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBURU1QX1RFU1RfUyA9IFRFU1RfUyArIDEwOworCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBEaXNlYXNlIE1vZGVsIExhYmVsIFZhbHVlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEaXNlYXNlIE1vZGVsIExhYmVsIFZhbHVlIHRlc3QgY2FzZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSlmaXh0dXJlOworCX0KKworCisJLyoqCisJICogVGhlIGRpc2Vhc2UgbW9kZWwgbGFiZWwgdmFsdWUgcmVwcmVzZW50cyB0aGUgYWRkaXRpb25zIHRvIHRoZSBzdGF0ZXMKKwkgKiBjYXVzZWQgYnkgdGhlIGRpc2Vhc2UuIFRoZSBjb252ZXJzaW9uIGNyZWF0ZXMgYSBkaWZmZXJlbnQgdmFsdWUgdGhhdAorCSAqIHJlcHJlc2VudHMgdGhlIGVxdWl2YWxlbnQgc3VidHJhY3Rpb25zIGZyb20gdGhlIHNvdXJjZSBzdGF0ZXMuCisJICogCisJICogQHBhcmFtIGZpeHR1cmUKKwkgKiAgICAgICAgICAgIHRoZSBkaXNlYXNlIG1vZGVsIHN0YXRlIGxhYmVsIHZhbHVlIHVuZGVyIHRlc3QKKwkgKiBAcmV0dXJuIHRoZSBlcXVpdmFsZW50IHZhbHVlIG9mIHRoZSBzb3VyY2Ugc3RhdGVzCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBnZXRFeHBlY3RlZENvbnZlcnRUb1NvdXJjZVN0YXRlcygKKwkJCVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBmaXh0dXJlKTsKKworfSAvLyBTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdGFuZGFyZERpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU3RhbmRhcmREaXNlYXNlTW9kZWxTY2VuYXJpb1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDYzMjU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU3RhbmRhcmREaXNlYXNlTW9kZWxTY2VuYXJpb1Rlc3QuamF2YQpAQCAtMCwwICsxLDIxIEBACisvLyBTdGFuZGFyZERpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0IHRlc3QgY2FzZSBmb3IgU3RhbmRhcmQgRGlzZWFzZSBNb2RlbHMgU2NlbmFyaW9zCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGFuZGFyZERpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdCBleHRlbmRzCisJCURpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdCB7CisJLy8gTm90aGluZworfSAvLyBTdGFuZGFyZERpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4NzVhOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGVUZXN0LmphdmEKQEAgLTAsMCArMSw0NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNlYXNlIE1vZGVsIFN0YXRlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZVRlc3QgZXh0ZW5kcworCQlEaXNlYXNlTW9kZWxTdGF0ZVRlc3QgeworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgRGlzZWFzZSBNb2RlbCBTdGF0ZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIERpc2Vhc2UgTW9kZWwgU3RhdGUgdGVzdCBjYXNlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFN0YW5kYXJkRGlzZWFzZU1vZGVsU3RhdGUpZml4dHVyZTsKKwl9CisKK30gLy8gU3RhbmRhcmREaXNlYXNlTW9kZWxTdGF0ZVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0YW5kYXJkRGlzZWFzZU1vZGVsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU3RhbmRhcmREaXNlYXNlTW9kZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4MGI1ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0YW5kYXJkRGlzZWFzZU1vZGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzI2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSB0ZXN0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsI2FkZFRvVG90YWxQb3B1bGF0aW9uQ291bnQoZG91YmxlKSA8ZW0+QWRkIFRvIFRvdGFsIFBvcHVsYXRpb24gQ291bnQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbCNjb21wdXRlVG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsKCkgPGVtPkNvbXB1dGUgVG90YWwgUG9wdWxhdGlvbiBDb3VudCBSZWNpcHJvY2FsPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwjYWRkVG9Ub3RhbEFyZWEoZG91YmxlKSA8ZW0+QWRkIFRvIFRvdGFsIEFyZWE8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbCNjYWxjdWxhdGVEZWx0YShvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWUsIGxvbmcsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdCkgPGVtPkNhbGN1bGF0ZSBEZWx0YTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsI2RvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpIDxlbT5EbyBNb2RlbCBTcGVjaWZpYyBBZGp1c3RtZW50czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yI2lzRGV0ZXJtaW5pc3RpYygpIDxlbT5JcyBEZXRlcm1pbmlzdGljPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGFic3RyYWN0IGNsYXNzIFN0YW5kYXJkRGlzZWFzZU1vZGVsVGVzdCBleHRlbmRzIERpc2Vhc2VNb2RlbFRlc3QgeworCisJLyoqCisJICogVGhpcyBpcyBpbml0aWFsaXplZCB0byBjb250YWluIGEgZGlzZWFzZSBsYWJlbCwKKwkgKi8KKwlwcm90ZWN0ZWQgU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbCBsYWJlbEZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgcGVyaW9kIG9mIHRpbWUgKG1pbGxpc2Vjb25kcykgZm9yIHRoZSBkaWVhc2UgbW9kZWwgcmF0ZXMuCisJICogVmFsdWU6IDEgZGF5LgorCSAqLworCWZpbmFsIHB1YmxpYyBzdGF0aWMgbG9uZyBURVNUX1RJTUVfUEVSSU9EID0gU1RFTVRpbWUuVW5pdHMuREFZLmdldE1pbGxpc2Vjb25kcygpOworCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0CisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdGFuZGFyZERpc2Vhc2VNb2RlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RhbmRhcmREaXNlYXNlTW9kZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChTdGFuZGFyZERpc2Vhc2VNb2RlbClmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbCNhZGRUb1RvdGFsUG9wdWxhdGlvbkNvdW50KGRvdWJsZSkgPGVtPkFkZCBUbyBUb3RhbCBQb3B1bGF0aW9uIENvdW50PC9lbT59JworCSAqIG9wZXJhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwjYWRkVG9Ub3RhbFBvcHVsYXRpb25Db3VudChkb3VibGUpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0QWRkVG9Ub3RhbFBvcHVsYXRpb25Db3VudF9fZG91YmxlKCkgeworCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbCBzZG0gPSBnZXRGaXh0dXJlKCk7CisJCWZpbmFsIGRvdWJsZSB0b3RhbFBvcEJlZm9yZSA9IHNkbS5nZXRUb3RhbFBvcHVsYXRpb25Db3VudCgpOworCQlzZG0uYWRkVG9Ub3RhbFBvcHVsYXRpb25Db3VudCgxLjApOworCQlhc3NlcnRUcnVlKHNkbS5nZXRUb3RhbFBvcHVsYXRpb25Db3VudCgpID09IHRvdGFsUG9wQmVmb3JlICsgMS4wKTsKKwl9IC8vIHRlc3RBZGRUb1RvdGFsUG9wdWxhdGlvbkNvdW50X19kb3VibGUKKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbCNjb21wdXRlVG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsKCkgPGVtPkNvbXB1dGUgVG90YWwgUG9wdWxhdGlvbiBDb3VudCBSZWNpcHJvY2FsPC9lbT59JworCSAqIG9wZXJhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwjY29tcHV0ZVRvdGFsUG9wdWxhdGlvbkNvdW50UmVjaXByb2NhbCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Q29tcHV0ZVRvdGFsUG9wdWxhdGlvbkNvdW50UmVjaXByb2NhbCgpIHsKKwkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWwgc2RtID0gZ2V0Rml4dHVyZSgpOworCQlzZG0uc2V0VG90YWxQb3B1bGF0aW9uQ291bnQoMSk7CisJCXNkbS5jb21wdXRlVG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsKCk7CisJCWFzc2VydFRydWUoc2RtLmdldFRvdGFsUG9wdWxhdGlvbkNvdW50UmVjaXByb2NhbCgpID09IDEuMCk7CisKKwkJc2RtLnNldFRvdGFsUG9wdWxhdGlvbkNvdW50KDIuMCk7CisJCWFzc2VydFRydWUoc2RtLmdldFRvdGFsUG9wdWxhdGlvbkNvdW50UmVjaXByb2NhbCgpID09IDEuMCk7CisKKwkJc2RtLmNvbXB1dGVUb3RhbFBvcHVsYXRpb25Db3VudFJlY2lwcm9jYWwoKTsKKwkJYXNzZXJ0VHJ1ZShzZG0uZ2V0VG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsKCkgPT0gMC41KTsKKwl9IC8vIHRlc3RDb21wdXRlVG90YWxQb3B1bGF0aW9uQ291bnRSZWNpcHJvY2FsCisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwjYWRkVG9Ub3RhbEFyZWEoZG91YmxlKSA8ZW0+QWRkIFRvIFRvdGFsIEFyZWE8L2VtPn0nCisJICogb3BlcmF0aW9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbCNhZGRUb1RvdGFsQXJlYShkb3VibGUpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0QWRkVG9Ub3RhbEFyZWFfX2RvdWJsZSgpIHsKKwkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWwgc2RtID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBkb3VibGUgdG90YWxBcmVhQmVmb3JlID0gc2RtLmdldFRvdGFsQXJlYSgpOworCQlzZG0uYWRkVG9Ub3RhbEFyZWEoMS4wKTsKKwkJYXNzZXJ0VHJ1ZShzZG0uZ2V0VG90YWxBcmVhKCkgPT0gdG90YWxBcmVhQmVmb3JlICsgMS4wKTsKKwl9IC8vIHRlc3RBZGRUb1RvdGFsQXJlYV9fZG91YmxlCisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwjY2FsY3VsYXRlRGVsdGEob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lLCBsb25nLCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QpIDxlbT5DYWxjdWxhdGUgRGVsdGE8L2VtPn0nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsI2NhbGN1bGF0ZURlbHRhKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZSwgbG9uZywgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Q2FsY3VsYXRlRGVsdGFfX1NURU1UaW1lX2xvbmdfRUxpc3QoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG9wZXJhdGlvbiB0ZXN0IG1ldGhvZAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQlmYWlsKCk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsI2RvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUpIDxlbT5EbyBNb2RlbCBTcGVjaWZpYyBBZGp1c3RtZW50czwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWwjZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgdGVzdERvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzX19TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG9wZXJhdGlvbiB0ZXN0IG1ldGhvZAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQlmYWlsKCk7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yI2lzRGV0ZXJtaW5pc3RpYygpIDxlbT5JcyBEZXRlcm1pbmlzdGljPC9lbT59JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvciNpc0RldGVybWluaXN0aWMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0SXNEZXRlcm1pbmlzdGljKCkgeworCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBvcGVyYXRpb24gdGVzdCBtZXRob2QKKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKKwkJZmFpbCgpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gYSBkaXNlYXNlIG1vZGVsIGxhYmVsIHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRlc3RpbmcKKwkgKi8KKwlwcml2YXRlIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgZ2V0TGFiZWxGaXh0dXJlKCkgeworCQlyZXR1cm4gbGFiZWxGaXh0dXJlOworCX0gLy8gZ2V0TGFiZWxGaXh0dXJlCisKKwkvKioKKwkgKiBAcGFyYW0gbGFiZWxGaXh0dXJlCisJICogICAgICAgICAgICB0aGUgZGlzZWFzZSBtb2RlbCBsYWJlbCB2YWx1ZSBmb3IgdGVzdGluZworCSAqLworCXByb3RlY3RlZCB2b2lkIHNldExhYmVsRml4dHVyZShTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGxhYmVsRml4dHVyZSkgeworCQl0aGlzLmxhYmVsRml4dHVyZSA9IGxhYmVsRml4dHVyZTsKKwl9IC8vIHNldExhYmVsRml4dHVyZQorCisJLyoqCisJICogQ3JlYXRlIGEgbGFiZWwgdmFsdWUgZm9yIHRlc3RpbmcuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgY3JlYXRlTGFiZWxGaXh0dXJlKCk7CisKKwkvKioKKwkgKiB0ZXN0IGdldFRyYW5zcG9ydEVkZ2VzVG9Ob2RlCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldFRyYW5zcG9ydEVkZ2VzVG9Ob2RlKCkgeworCQlmaW5hbCBHcmFwaCBmaXh0dXJlID0gRGlzZWFzZU1vZGVsVGVzdFV0aWwuY3JlYXRlTGF0dGljZUdyYXBoKDIsIDIsCisJCQkJRGlzZWFzZU1vZGVsVGVzdFV0aWwuVEVTVF9QT1BVTEFUSU9OX0NPVU5ULAorCQkJCURpc2Vhc2VNb2RlbFRlc3RVdGlsLlRFU1RfQVJFQSk7CisJCWZpbmFsIE5vZGUgbm9kZSA9IERpc2Vhc2VNb2RlbFRlc3RVdGlsLmdldFJlZ2lvbihmaXh0dXJlLCAxLCAwKTsKKworCQlmaW5hbCBMaXN0PEVkZ2U+IHRyYW5zcG9ydEVkZ2VzID0gVHJhbnNwb3J0UmVsYXRpb25zaGlwTGFiZWxJbXBsCisJCQkJLmdldFRyYW5zcG9ydEVkZ2VzVG9Ob2RlKG5vZGUsCisJCQkJCQlEaXNlYXNlTW9kZWxUZXN0VXRpbC5URVNUX1BPUFVMQVRJT05fSURFTlRJRklFUik7CisJCS8vIDIgKyAyIHJlZmxleGl2ZSBlZGdlcyArIDEgZGlyZWN0ZWQgaW4gdG8gdGhlIG5vZGUKKwkJYXNzZXJ0VHJ1ZSh0cmFuc3BvcnRFZGdlcy5zaXplKCkgPT0gNSk7CisJfSAvLyB0ZXN0R2V0VHJhbnNwb3J0RWRnZXNUb05vZGUKKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwjaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZShvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsU3RhdGUsIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbCkgPGVtPkluaXRpYWxpemUgRGlzZWFzZSBTdGF0ZTwvZW0+fScKKwkgKiBvcGVyYXRpb24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCNpbml0aWFsaXplRGlzZWFzZVN0YXRlKG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxTdGF0ZSwKKwkgKiAgICAgIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxMYWJlbCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplRGlzZWFzZVN0YXRlX19EaXNlYXNlTW9kZWxTdGF0ZV9EaXNlYXNlTW9kZWxMYWJlbCgpIHsKKwkJZmluYWwgU3RhbmRhcmREaXNlYXNlTW9kZWwgZGlzZWFzZU1vZGVsID0gZ2V0Rml4dHVyZSgpOworCisJCWlmICghKGRpc2Vhc2VNb2RlbCBpbnN0YW5jZW9mIEFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwpKSB7CisKKwkJCWZpbmFsIERpc2Vhc2VNb2RlbExhYmVsIGRtbCA9IGdldExhYmVsRml4dHVyZSgpOworCisJCQkvLyBBdCB0aGlzIHBvaW50IHRoZSBmaXh0dXJlIGhhcyBhbHJlYWR5IGluaXRpYWxpemVkIG9uZSBkaXNlYXNlCisJCQkvLyBtb2RlbAorCQkJLy8gc3RhdGUgc28gaXRzIHBvcHVsYXRpb24gYW5kIGFyZWEgY291bnRzIGFyZSBub3QgemVyby4KKwkJCWFzc2VydFRydWUoZGlzZWFzZU1vZGVsLmdldFRvdGFsUG9wdWxhdGlvbkNvdW50KCkgPT0gRGlzZWFzZU1vZGVsVGVzdFV0aWwuVEVTVF9QT1BVTEFUSU9OX0NPVU5UKTsKKwkJCWFzc2VydFRydWUoZGlzZWFzZU1vZGVsLmdldFRvdGFsQXJlYSgpID09IERpc2Vhc2VNb2RlbFRlc3RVdGlsLlRFU1RfQVJFQSk7CisKKwkJCURpc2Vhc2VNb2RlbExhYmVsVGVzdC5sYWJlbFJlZ2lvbihkbWwsCisJCQkJCURpc2Vhc2VNb2RlbFRlc3RVdGlsLlRFU1RfUE9QVUxBVElPTl9JREVOVElGSUVSLAorCQkJCQlEaXNlYXNlTW9kZWxUZXN0VXRpbC5jcmVhdGVQb3B1bGF0aW9uUmVnaW9uTm9kZSgpKTsKKworCQkJRGlzZWFzZU1vZGVsU3RhdGUgZG1zID0gZGlzZWFzZU1vZGVsLmNyZWF0ZURpc2Vhc2VNb2RlbFN0YXRlKCk7CisJCQlmaXh0dXJlLmluaXRpYWxpemVEaXNlYXNlU3RhdGUoZG1zLCBkbWwpOworCisJCQlhc3NlcnRUcnVlKGRpc2Vhc2VNb2RlbC5nZXRUb3RhbFBvcHVsYXRpb25Db3VudCgpID09IDIgKiBEaXNlYXNlTW9kZWxUZXN0VXRpbC5URVNUX1BPUFVMQVRJT05fQ09VTlQpOworCQkJYXNzZXJ0VHJ1ZShkaXNlYXNlTW9kZWwuZ2V0VG90YWxBcmVhKCkgPT0gMiAqIERpc2Vhc2VNb2RlbFRlc3RVdGlsLlRFU1RfQVJFQSk7CisKKwkJCS8vIExldCdzIGRvIGl0IGFnYWluLi4uc2hvdWxkIGhhdmUgdHdpY2UgdGhlIGFjY3VtdWxhdGVkIGNvdW50cyBpbgorCQkJLy8gdGhlCisJCQkvLyBkaXNlYXNlIG1vZGVsCisJCQlkbXMgPSBkaXNlYXNlTW9kZWwuY3JlYXRlRGlzZWFzZU1vZGVsU3RhdGUoKTsKKwkJCWZpeHR1cmUuaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZShkbXMsIGRtbCk7CisKKwkJCWFzc2VydFRydWUoZGlzZWFzZU1vZGVsLmdldFRvdGFsUG9wdWxhdGlvbkNvdW50KCkgPT0gMyAqIERpc2Vhc2VNb2RlbFRlc3RVdGlsLlRFU1RfUE9QVUxBVElPTl9DT1VOVCk7CisJCQlhc3NlcnRUcnVlKGRpc2Vhc2VNb2RlbC5nZXRUb3RhbEFyZWEoKSA9PSAzICogRGlzZWFzZU1vZGVsVGVzdFV0aWwuVEVTVF9BUkVBKTsKKwkJfSAvLyBpZgorCX0gLy8gdGVzdEluaXRpYWxpemVEaXNlYXNlU3RhdGVfX0Rpc2Vhc2VNb2RlbFN0YXRlX0Rpc2Vhc2VNb2RlbExhYmVsCisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2luaXRpYWxpemVEaXNlYXNlU3RhdGUob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsKSA8ZW0+SW5pdGlhbGl6ZSBEaXNlYXNlIFN0YXRlPC9lbT59JworCSAqIG9wZXJhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsI2luaXRpYWxpemVEaXNlYXNlU3RhdGUob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVEaXNlYXNlU3RhdGVfX0Rpc2Vhc2VNb2RlbExhYmVsKCkgeworCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbCBkaXNlYXNlTW9kZWwgPSBnZXRGaXh0dXJlKCk7CisJCWZpbmFsIERpc2Vhc2VNb2RlbExhYmVsIGRtbCA9IGdldExhYmVsRml4dHVyZSgpOworCQlpZiAoZG1sIGluc3RhbmNlb2YgQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbCkgeworCisJCQkvLyBBdCB0aGlzIHBvaW50IHRoZSBmaXh0dXJlIGhhcyBhbHJlYWR5IGluaXRpYWxpemVkIG9uZSBkaXNlYXNlCisJCQkvLyBtb2RlbAorCQkJLy8gc3RhdGUgc28gaXRzIHBvcHVsYXRpb24gYW5kIGFyZWEgY291bnRzIGFyZSBub3QgemVyby4KKwkJCWFzc2VydFRydWUoZGlzZWFzZU1vZGVsLmdldFRvdGFsUG9wdWxhdGlvbkNvdW50KCkgPT0gRGlzZWFzZU1vZGVsVGVzdFV0aWwuVEVTVF9QT1BVTEFUSU9OX0NPVU5UKTsKKwkJCWFzc2VydFRydWUoZGlzZWFzZU1vZGVsLmdldFRvdGFsQXJlYSgpID09IERpc2Vhc2VNb2RlbFRlc3RVdGlsLlRFU1RfQVJFQSk7CisKKwkJCURpc2Vhc2VNb2RlbExhYmVsVGVzdC5sYWJlbFJlZ2lvbihkbWwsCisJCQkJCURpc2Vhc2VNb2RlbFRlc3RVdGlsLlRFU1RfUE9QVUxBVElPTl9JREVOVElGSUVSLAorCQkJCQlEaXNlYXNlTW9kZWxUZXN0VXRpbC5jcmVhdGVQb3B1bGF0aW9uUmVnaW9uTm9kZSgpKTsKKworCQkJZml4dHVyZS5pbml0aWFsaXplRGlzZWFzZVN0YXRlKGRtbCk7CisJCQlTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlIGRtcyA9IChTdGFuZGFyZERpc2Vhc2VNb2RlbFN0YXRlKSBkbWwKKwkJCQkJLmdldERpc2Vhc2VNb2RlbFN0YXRlKCk7CisJCQlhc3NlcnRUcnVlKGRtcy5nZXRBcmVhUmF0aW8oKSA9PSBkaXNlYXNlTW9kZWwuZ2V0VG90YWxBcmVhKCkKKwkJCQkJLyBEaXNlYXNlTW9kZWxUZXN0VXRpbC5URVNUX0FSRUEpOworCQl9CisJfSAvLyB0ZXN0SW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZV9fRGlzZWFzZU1vZGVsTGFiZWwKKworCS8qKgorCSAqIEluIHRoaXMgdGVzdCB3ZSBzcGVjaWZ5IGFuIGFyZWEgZm9yIHRoZSBwb3B1bGF0aW9uIGxhYmVsIHRoYXQgc2hvdWxkIGJlCisJICogdXNlZCBpbnN0ZWFkIG9mIHRoZSBhcmVhIG9mIHRoZSByZWdpb24uCisJICovCisJcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVEaXNlYXNlU3RhdGUyKCkgeworCQlmaW5hbCBTdGFuZGFyZERpc2Vhc2VNb2RlbCBkaXNlYXNlTW9kZWwgPSBnZXRGaXh0dXJlKCk7CisJCWlmICghKGRpc2Vhc2VNb2RlbCBpbnN0YW5jZW9mIEFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwpKSB7CisKKwkJCS8vIEF0IHRoaXMgcG9pbnQgdGhlIGZpeHR1cmUgaGFzIGFscmVhZHkgaW5pdGlhbGl6ZWQgb25lIGRpc2Vhc2UKKwkJCS8vIG1vZGVsCisJCQkvLyBzdGF0ZSBzbyBpdHMgcG9wdWxhdGlvbiBhbmQgYXJlYSBjb3VudHMgYXJlIG5vdCB6ZXJvLgorCQkJYXNzZXJ0VHJ1ZShkaXNlYXNlTW9kZWwuZ2V0VG90YWxQb3B1bGF0aW9uQ291bnQoKSA9PSBEaXNlYXNlTW9kZWxUZXN0VXRpbC5URVNUX1BPUFVMQVRJT05fQ09VTlQpOworCQkJYXNzZXJ0VHJ1ZShkaXNlYXNlTW9kZWwuZ2V0VG90YWxBcmVhKCkgPT0gRGlzZWFzZU1vZGVsVGVzdFV0aWwuVEVTVF9BUkVBKTsKKworCQkJZmluYWwgRGlzZWFzZU1vZGVsTGFiZWwgZG1sID0gZGlzZWFzZU1vZGVsCisJCQkJCS5jcmVhdGVEaXNlYXNlTW9kZWxMYWJlbCgpOworCisJCQlEaXNlYXNlTW9kZWxMYWJlbFRlc3QubGFiZWxSZWdpb24oZG1sLAorCQkJCQlEaXNlYXNlTW9kZWxUZXN0VXRpbC5URVNUX1BPUFVMQVRJT05fSURFTlRJRklFUiwKKwkJCQkJRGlzZWFzZU1vZGVsVGVzdFV0aWwuY3JlYXRlUG9wdWxhdGlvblJlZ2lvbk5vZGUoKSk7CisKKwkJCS8vIFNldCB0aGUgYXJlYSBvZiB0aGUgcG9wdWxhdGlvbiwgdGhpcyBzaG91bGQgb3ZlcnJpZGUgdGhlIGFyZWEKKwkJCS8vIGJlaW5nCisJCQkvLyB0YWtlbiBmcm9tIHRoZSByZWdpb24uCisJCQlmaW5hbCBQb3B1bGF0aW9uTGFiZWwgcG9wdWxhdGlvbkxhYmVsID0gZG1sLmdldFBvcHVsYXRpb25MYWJlbCgpOworCQkJcG9wdWxhdGlvbkxhYmVsCisJCQkJCS5zZXRQb3B1bGF0ZWRBcmVhKERpc2Vhc2VNb2RlbFRlc3RVdGlsLlRFU1RfQVJFQSAvIDIuMCk7CisKKwkJCURpc2Vhc2VNb2RlbFN0YXRlIGRtcyA9IGRpc2Vhc2VNb2RlbC5jcmVhdGVEaXNlYXNlTW9kZWxTdGF0ZSgpOworCQkJZml4dHVyZS5pbml0aWFsaXplRGlzZWFzZVN0YXRlKGRtcywgZG1sKTsKKworCQkJYXNzZXJ0VHJ1ZShkaXNlYXNlTW9kZWwuZ2V0VG90YWxQb3B1bGF0aW9uQ291bnQoKSA9PSAyICogRGlzZWFzZU1vZGVsVGVzdFV0aWwuVEVTVF9QT1BVTEFUSU9OX0NPVU5UKTsKKwkJCWFzc2VydFRydWUoZGlzZWFzZU1vZGVsLmdldFRvdGFsQXJlYSgpID09IDEuNSAqIERpc2Vhc2VNb2RlbFRlc3RVdGlsLlRFU1RfQVJFQSk7CisJCX0KKwl9IC8vIHRlc3RJbml0aWFsaXplRGlzZWFzZVN0YXRlMgorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwkJc2V0TGFiZWxGaXh0dXJlKG51bGwpOworCX0gLy8gdGVhckRvd24KKworfSAvLyBTdGFuZGFyZERpc2Vhc2VNb2RlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0YW5kYXJkSW5mZWN0b3JUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdGFuZGFyZEluZmVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MWExNTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdGFuZGFyZEluZmVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEluZmVjdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5mZWN0b3I8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGFuZGFyZEluZmVjdG9yVGVzdCBleHRlbmRzIEluZmVjdG9yVGVzdCB7CisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBJbmZlY3RvciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdGFuZGFyZEluZmVjdG9yVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEluZmVjdG9yIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RhbmRhcmRJbmZlY3RvciBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFN0YW5kYXJkSW5mZWN0b3IpZml4dHVyZTsKKwl9CisKK30gLy8gU3RhbmRhcmRJbmZlY3RvclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODYyYmUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RvY2hhc3RpYyBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgYXJlIHRlc3RlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsI2NvbXB1dGVOb2lzZSgpIDxlbT5Db21wdXRlIE5vaXNlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxUZXN0IGV4dGVuZHMgU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbFRlc3QgeworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgU3RvY2hhc3RpYyBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU3RvY2hhc3RpYyBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCNjb21wdXRlTm9pc2UoKSA8ZW0+Q29tcHV0ZSBOb2lzZTwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsI2NvbXB1dGVOb2lzZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Q29tcHV0ZU5vaXNlKCkgeworCQlTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxUZXN0LnN0YXRpY0NvbXB1dGVOb2lzZVRlc3QoKTsKKwl9CisJCisJCisJLyoqCisJICogc3RhdGljIHRlc3QgbWV0aG9kLiBDbGFzcyBpcyBhYnN0cmFjdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc3RhdGljQ29tcHV0ZU5vaXNlVGVzdCgpIHsKKwkJUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKDApOworCQlkb3VibGUgclRlc3QgPSByYW5kLm5leHREb3VibGUoKTsKKwkJLy8gZm9yIHRlc3RpbmcgcHVycG9zZXMgd2Ugd2lsbCB0ZXN0IGF0IGEgZ2FpbiBvZiAxLjAKKwkJU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGwuc2V0TUFYX0dBSU4oMS4wKTsKKwkJZG91YmxlIG5vaXNlID0gU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbC5jb21wdXRlTm9pc2UoMS4wLHJhbmQpOworCQlhc3NlcnRUcnVlICgobm9pc2UgPj0gMC4wICkmJihub2lzZSA8PSAyLjApKTsKKwl9CisJCisKK30gLy9TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdGFuZGFyZFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdGFuZGFyZFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdiZjU1ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0YW5kYXJkVGVzdHMuamF2YQpAQCAtMCwwICsxLDgyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+c3RhbmRhcmQ8L2I+PC9lbT4nCisgKiBwYWNrYWdlLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgU3RhbmRhcmRUZXN0cygic3RhbmRhcmQgVGVzdHMiKTsgLy8kTk9OLU5MUy0xJAorCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRGV0ZXJtaW5pc3RpY1NFSVJEaXNlYXNlTW9kZWxUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKERldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbFRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRGV0ZXJtaW5pc3RpY1NJUkRpc2Vhc2VNb2RlbFRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU0VJUkxhYmVsVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShTRUlSTGFiZWxWYWx1ZVRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU0lJbmZlY3RvclRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU0lMYWJlbFRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU0lMYWJlbFZhbHVlVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShTSVJMYWJlbFRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU0lSTGFiZWxWYWx1ZVRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbFRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbFRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQWdncmVnYXRpbmdTSURpc2Vhc2VNb2RlbFRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQWdncmVnYXRpbmdTRUlSRGlzZWFzZU1vZGVsVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShBZ2dyZWdhdGluZ1NJUkRpc2Vhc2VNb2RlbFRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU0lSSW5vY3VsYXRvclRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbFRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbFRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvblRlc3QuY2xhc3MpOworCQlyZXR1cm4gc3VpdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RhbmRhcmRUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKK30gLy8gU3RhbmRhcmRUZXN0cwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0b2NoYXN0aWNEaXNlYXNlTW9kZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE2Zjk5NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0b2NoYXN0aWNEaXNlYXNlTW9kZWxUZXN0LmphdmEKQEAgLTAsMCArMSw0NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNEaXNlYXNlTW9kZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RvY2hhc3RpYyBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbFRlc3QgZXh0ZW5kcyBEaXNlYXNlTW9kZWxUZXN0IHsKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFN0b2NoYXN0aWMgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTdG9jaGFzdGljIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdG9jaGFzdGljRGlzZWFzZU1vZGVsIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbClmaXh0dXJlOworCX0KKworfSAvL1N0b2NoYXN0aWNEaXNlYXNlTW9kZWxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjOGE1NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbFRlc3QuamF2YQpAQCAtMCwwICsxLDg3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RvY2hhc3RpYyBQb2lzc29uIFNFSVIgRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbFRlc3QgZXh0ZW5kcyBTRUlSVGVzdCB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFVSSSBESVNFQVNFTU9ERUxfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoImRpc2Vhc2VNb2RlbHMvdGVzdFN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbC5kZWNvcmF0b3IiKTsKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbFRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgU3RvY2hhc3RpYyBQb2lzc29uIFNFSVIgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RvY2hhc3RpY1BvaXNzb25TRUlSRGlzZWFzZU1vZGVsVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFN0b2NoYXN0aWMgUG9pc3NvbiBTRUlSIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChTdG9jaGFzdGljUG9pc3NvblNFSVJEaXNlYXNlTW9kZWwpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRGlzZWFzZU1vZGVsIGQgPSBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVN0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbCgpOworCQlkLnNldFVSSShESVNFQVNFTU9ERUxfVVJJKTsKKwkJZC5zZXREaXNlYXNlTmFtZSgidGVzdCIpOworCQlzZXRGaXh0dXJlKGQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworfSAvL1N0b2NoYXN0aWNQb2lzc29uU0VJUkRpc2Vhc2VNb2RlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYjk4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsODcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RvY2hhc3RpYyBQb2lzc29uIFNJIERpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsVGVzdCBleHRlbmRzIFNJVGVzdCB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFVSSSBESVNFQVNFTU9ERUxfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoImRpc2Vhc2VNb2RlbHMvdGVzdFN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwuZGVjb3JhdG9yIik7CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihTdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBTdG9jaGFzdGljIFBvaXNzb24gU0kgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTdG9jaGFzdGljIFBvaXNzb24gU0kgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0b2NoYXN0aWNQb2lzc29uU0lEaXNlYXNlTW9kZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChTdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCURpc2Vhc2VNb2RlbCBkID0gU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdG9jaGFzdGljUG9pc3NvblNJRGlzZWFzZU1vZGVsKCk7CisJCWQuc2V0RGlzZWFzZU5hbWUoInRlc3QiKTsKKwkJZC5zZXRVUkkoRElTRUFTRU1PREVMX1VSSSk7CisJCXNldEZpeHR1cmUoZCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCit9IC8vU3RvY2hhc3RpY1BvaXNzb25TSURpc2Vhc2VNb2RlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I5MmM4YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsODggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RvY2hhc3RpYyBQb2lzc29uIFNJUiBEaXNlYXNlIE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxUZXN0IGV4dGVuZHMgU0lSVGVzdCB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFVSSSBESVNFQVNFTU9ERUxfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoImRpc2Vhc2VNb2RlbHMvdGVzdFN0b2NoYXN0aWNQb2lzc29uRGlzZWFzZU1vZGVsLmRlY29yYXRvciIpOworCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFN0b2NoYXN0aWMgUG9pc3NvbiBTSVIgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWxUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU3RvY2hhc3RpYyBQb2lzc29uIFNJUiBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RvY2hhc3RpY1BvaXNzb25TSVJEaXNlYXNlTW9kZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChTdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbClmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlEaXNlYXNlTW9kZWwgZD0gU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdG9jaGFzdGljUG9pc3NvblNJUkRpc2Vhc2VNb2RlbCgpOworCQlkLnNldFVSSShESVNFQVNFTU9ERUxfVVJJKTsKKwkJZC5zZXREaXNlYXNlTmFtZSgidGVzdCIpOworCQlzZXRGaXh0dXJlKGQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworfSAvL1N0b2NoYXN0aWNQb2lzc29uU0lSRGlzZWFzZU1vZGVsVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGM1YzlmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxUZXN0LmphdmEKQEAgLTAsMCArMSwzMDUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbFN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TRUlSTGFiZWxWYWx1ZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbEltcGw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdG9jaGFzdGljIFNFSVIgRGlzZWFzZSBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSB0ZXN0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCNjb21wdXRlTm9pc2UoKSA8ZW0+Q29tcHV0ZSBOb2lzZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbFRlc3QgZXh0ZW5kcyBTRUlSVGVzdCB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUkFORE9NX1NFRUQgPSAxbDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBURVNUX0dBSU4gPSAwLjAxZDsKKwkKKwkvKioKKwkgKiBUaGUgbmFtZSBvZiB0aGUgdGVzdCBkaXNlYXNlIChhbiBpbnN0YW5jZSBvZiBhIGRpc2Vhc2UgbW9kZWwpCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TRUlSX0RJU0VBU0VfTkFNRSA9ICJUZXN0IFN0b2Nhc3RpYyBTRUlSIERpc2Vhc2UiOworCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBTdG9jaGFzdGljIFNFSVIgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTdG9jaGFzdGljIFNFSVIgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCQlTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRtbCA9IGNyZWF0ZUxhYmVsRml4dHVyZSgpOworCQlEaXNlYXNlTW9kZWxTdGF0ZSBkbXMgPSBnZXRGaXh0dXJlKCkuY3JlYXRlRGlzZWFzZU1vZGVsU3RhdGUoKTsKKwkJZG1sLnNldERpc2Vhc2VNb2RlbFN0YXRlKGRtcyk7CisJCXNldExhYmVsRml4dHVyZShkbWwpOworCQlmaXh0dXJlLmluaXRpYWxpemVEaXNlYXNlU3RhdGUoZG1zLCBkbWwpOworCX0gLy8gc2V0VXAKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnRlYXJEb3duKCk7CisJfSAvLyB0ZWFyRG93bgorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCNjb21wdXRlTm9pc2UoKSA8ZW0+Q29tcHV0ZSBOb2lzZTwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsI2NvbXB1dGVOb2lzZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Q29tcHV0ZU5vaXNlKCkgeworCQlTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxUZXN0LnN0YXRpY0NvbXB1dGVOb2lzZVRlc3QoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgZGlzZWFzZSBtb2RlbCBpbnN0YW5jZQorCSAqIAorCSAqIEByZXR1cm4gYSBkaXNlYXNlIG1vZGVsIGluc3RhbmNlIGZvciB0ZXN0IHB1cnBvc2VzCisJICovCisJcHVibGljIHN0YXRpYyBTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCBjcmVhdGVGaXh0dXJlKCkgeworCQlyZXR1cm4gY3JlYXRlRml4dHVyZShTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJbXBsLkdBSU5fRURFRkFVTFQpOworCX0gLy8gY3JlYXRlRml4dHVyZQorCQorCS8qKgorCSAqIENyZWF0ZSBkaXNlYXNlIG1vZGVsIGluc3RhbmNlCisJICogCisJICogQHJldHVybiBhIGRpc2Vhc2UgbW9kZWwgaW5zdGFuY2UgZm9yIHRlc3QgcHVycG9zZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsIGNyZWF0ZUZpeHR1cmUoZG91YmxlIG5ld0dhaW4pIHsKKwkJcmV0dXJuIFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsSW1wbC5jcmVhdGVTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbCgKKwkJCQlURVNUX1NFSVJfRElTRUFTRV9OQU1FLCBNT1JUQUxJVFlfUkFURSwKKwkJCQlJTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFLCBUUkFOU01JU1NJT05fUkFURSwgUkVDT1ZFUllfUkFURSwKKwkJCQlJTU1VTklUWV9MT1NTX1JBVEUsIElOQ1VCQVRJT05fUkFURSwgTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVCwKKwkJCQlURVNUX1RJTUVfUEVSSU9ELCBURVNUX1BPUFVMQVRJT05fSURFTlRJRklFUiwgbmV3R2Fpbik7CisJCQorCQkKKwl9IC8vIGNyZWF0ZUZpeHR1cmUKKworCQorCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJbXBsI2RvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKCkgPGVtPmRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzPC9lbT59JyBvcGVyYXRpb24uCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbCNkb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cygpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygic3ludGhldGljLWFjY2VzcyIpCisJcHVibGljIHZvaWQgdGVzdE1vZGVsU3BlY2lmaWNBZGp1c3RtZW50cygpeworCQlTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbFRlc3RlckltcGwgc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwgPSBuZXcgU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxUZXN0ZXJJbXBsKCk7CisJCVNFSVJMYWJlbFZhbHVlSW1wbCBjdXJyZW50U0VJUiA9IG5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwMGQsIDUwZCwgNDBkLCAzMGQsIDIwZCwgMTBkKTsKKwkJZG9UZXN0KHN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsLCBjdXJyZW50U0VJUik7CisJfQorCisvLwlwcml2YXRlIHZvaWQgZG9UZXN0V2l0aFBlcm11dGF0aW9ucygpIHsKKy8vCQlTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbFRlc3RlckltcGwgc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwgPSBuZXcgU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxUZXN0ZXJJbXBsKCk7CisvLwkJTGlzdDxTRUlSTGFiZWxWYWx1ZUltcGw+IG1vZGVsTGFibGVWYWx1ZXMgPSBTRUlSTGFiZWxWYWx1ZVRlc3RVdGlsLmNyZWF0ZVJhbmRvbVNFSVJMYWJlbFZhbHVlSW1wbCgpOworLy8JCQorLy8JCWludCBjb3VudDEgPSAwOworLy8JCWludCBjb3VudDIgPSAwOworLy8JCVN5c3RlbS5vdXQucHJpbnRsbigpOworLy8JCWZvcihTRUlSTGFiZWxWYWx1ZUltcGwgY3VycmVudFNFSVI6IG1vZGVsTGFibGVWYWx1ZXMpeworLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oY291bnQxKyspOworLy8JCQlmb3IoU0VJUkxhYmVsVmFsdWVJbXBsIHNlaXJBZGRpdGlvbnM6IG1vZGVsTGFibGVWYWx1ZXMpeworLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIJIiArIGNvdW50MisrKTsKKy8vCQkJCWZvcihTRUlSTGFiZWxWYWx1ZUltcGwgc2VpckRlYXRoczogbW9kZWxMYWJsZVZhbHVlcyl7CisvLwkJCQkJLy9zZWlyRGVhdGhzIGFuZCBzZWlyQWRkaXRpb25zIHdpbGwgYmUgbW9kaWZpZWQgbXkgdGhlIHRlc3QgbWV0aG9kLCBzbyB3ZSBiZXR0ZXIgY2xvbmUgdGhlbSAKKy8vCQkJCQlkb1Rlc3Qoc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwsIGN1cnJlbnRTRUlSLAorLy8JCQkJCQkJc2VpckFkZGl0aW9ucywgc2VpckRlYXRocyk7CisvLwkJCSAJfQorLy8JCQl9CisvLwkJfQorLy8JfQorCisJcHJpdmF0ZSB2b2lkIGRvVGVzdChTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbFRlc3RlckltcGwgc3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWwsCisJCQlTRUlSTGFiZWxWYWx1ZUltcGwgY3VycmVudFNFSVIpIHsKKwkJCisJCVNFSVJMYWJlbFZhbHVlSW1wbCBvbGRTRUlSID0gKFNFSVJMYWJlbFZhbHVlSW1wbClFY29yZVV0aWwuY29weShjdXJyZW50U0VJUik7CisJCXN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsLmRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKGN1cnJlbnRTRUlSLCBSQU5ET01fU0VFRCwgVEVTVF9HQUlOKTsKKwkJCisJCWRvQ2FsY3VsYXRlTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKGN1cnJlbnRTRUlSLCBSQU5ET01fU0VFRCwgVEVTVF9HQUlOKTsKKworCQlTdHJpbmcgc3RhdGUgPSBnZXRTdGF0ZShjdXJyZW50U0VJUiwgb2xkU0VJUik7CisJCQorCQl2YWxpZGF0ZU1vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyhjdXJyZW50U0VJUiwKKwkJCQlvbGRTRUlSLAorCQkJCXN0YXRlKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgZG91YmxlIHByZWNpc2lvbiByYW5kb20gbm9pc2UgdmFyaWFibGUKKwkgKiByIGJldHdlZW4gKDEuMCt4KSBhbmQgKDEuMC14KQorCSAqIHdoZXJlIHggaXMgYSBwcm9kdWN0IEcqIE1hdGgucmFuZCgpLCBhbmQgRyBpcyBhIGdhaW4gZmFjdG9yIDA8RzxtYXggbm9pc2UKKwkgKiAKKwkgKiBAcGFyYW0gZ2FpbgorCSAqIEBwYXJhbSByYW5kCisJICogQHJldHVybiBub2lzZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZG91YmxlIGNvbXB1dGVOb2lzZShmaW5hbCBkb3VibGUgZ2FpbiwgZmluYWwgUmFuZG9tIHJhbmQpIHsKKworCQlkb3VibGUgeCA9ICgyLjAqcmFuZC5uZXh0RG91YmxlKCkpLTEuMDsgLy8gKy8tIDEKKwkJeCAqPSBnYWluOworCQl4ICs9IDEuMDsKKwkJYXNzZXJ0ICgoeD4wLjApJiYoeDwyLjApKSA6ICJyYW5kb20gbm9pc2Ugc2hvdWxkIGJlIGEgc21hbGwgcGVydHVyYmF0aW9uIEdhaW4gZmFjdG9yLCBnLCAgbXVzdCAwLjAgPCBnIDw8IDEuMCAiOworCQlyZXR1cm4geDsKKwkJCisJfSAvLyBnZXROb2lzZQorCQorCQorCXByaXZhdGUgdm9pZCBkb0NhbGN1bGF0ZU1vZGVsU3BlY2lmaWNBZGp1c3RtZW50cygKKwkJCVNFSVJMYWJlbFZhbHVlSW1wbCBwQ3VycmVudFNFSVIsIGxvbmcgcFJhbmRvbVNlZWQsIGRvdWJsZSBwVGVzdEdhaW4pIHsKKwkJCisJCQorCQlmaW5hbCBTRUlSTGFiZWxWYWx1ZSBjdXJyZW50U0VJUiA9IChTRUlSTGFiZWxWYWx1ZSkgcEN1cnJlbnRTRUlSOworCQlSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbShwUmFuZG9tU2VlZCk7CisJCWRvdWJsZSBJbm9pc3kgPSBjdXJyZW50U0VJUi5nZXRJKCkqIGNvbXB1dGVOb2lzZShwVGVzdEdhaW4sIHJhbmRvbSk7CisJCWN1cnJlbnRTRUlSLnNldEkoSW5vaXN5KTsKKwkJcmV0dXJuOworCQkJCQorCQkJCQorCX0KKworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU1vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyhTRUlSTGFiZWxWYWx1ZUltcGwgY3VycmVudFNFSVIsCisJCQlTRUlSTGFiZWxWYWx1ZUltcGwgb2xkU0VJUiwKKwkJCVN0cmluZyBzdGF0ZSkgeworCisJCQorCQl0cnl7CisJCQljdXJyZW50U0VJUi5zYW5lKCk7CisJCX0KKwkJY2F0Y2goVGhyb3dhYmxlIHQpeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY3VycmVudFNFSVIgaXMgaW5zYW5lLCBzdGF0ZSBpczogIiArIHN0YXRlLCB0KTsKKwkJfQorCQl0cnl7CisJCQlvbGRTRUlSLnNhbmUoKTsKKwkJfQorCQljYXRjaChUaHJvd2FibGUgdCl7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvbGRTRUlSIGlzIGluc2FuZSwgc3RhdGUgaXM6ICIgKyBzdGF0ZSwgdCk7CisJCX0KKworCQkKKwkJCisJCWFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiY3VycmVudFNFSVIgaGFzIGluc2FuZSB2YWx1ZXMgJXMiLCBzdGF0ZSksIG15U2FuaXR5Q2hlY2soY3VycmVudFNFSVIpKTsKKwkJYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJvbGRTRUlSIGhhcyBpbnNhbmUgdmFsdWVzICVzIiwgc3RhdGUpLCBteVNhbml0eUNoZWNrKG9sZFNFSVIpKTsKKworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tFcXVhbChTRUlSTGFiZWxWYWx1ZUltcGwgcENhbGN1bGF0ZWRTZWlyQWRkaXRpb25zLAorCQkJU0VJUkxhYmVsVmFsdWVJbXBsIHBOZXdTZWlyQWRkaXRpb25zKSB7CisJCWlmKChwQ2FsY3VsYXRlZFNlaXJBZGRpdGlvbnMuZ2V0RGlzZWFzZURlYXRocygpICE9IHBOZXdTZWlyQWRkaXRpb25zLmdldERpc2Vhc2VEZWF0aHMoKSkgfHwKKwkJCQkocENhbGN1bGF0ZWRTZWlyQWRkaXRpb25zLmdldEUoKSAhPSBwTmV3U2VpckFkZGl0aW9ucy5nZXRFKCkpIHx8CisJCQkJKHBDYWxjdWxhdGVkU2VpckFkZGl0aW9ucy5nZXRJKCkgIT0gcE5ld1NlaXJBZGRpdGlvbnMuZ2V0SSgpKSB8fAorCQkJCShwQ2FsY3VsYXRlZFNlaXJBZGRpdGlvbnMuZ2V0UG9wdWxhdGlvbkNvdW50KCkgIT0gcE5ld1NlaXJBZGRpdGlvbnMuZ2V0UG9wdWxhdGlvbkNvdW50KCkpIHx8CisJCQkJKHBDYWxjdWxhdGVkU2VpckFkZGl0aW9ucy5nZXRSKCkgIT0gcE5ld1NlaXJBZGRpdGlvbnMuZ2V0UigpKSB8fAorCQkJCShwQ2FsY3VsYXRlZFNlaXJBZGRpdGlvbnMuZ2V0UygpICE9IHBOZXdTZWlyQWRkaXRpb25zLmdldFMoKSkpeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gbXlTYW5pdHlDaGVjayhTRUlSTGFiZWxWYWx1ZUltcGwgcFNlaXIpIHsKKwkJcmV0dXJuIGFzc2VydFZhbGlkRG91YmxlKHBTZWlyLmdldEUoKSkgJiYgCisJCQlhc3NlcnRWYWxpZERvdWJsZShwU2Vpci5nZXRJKCkpICYmIAorCQkJYXNzZXJ0VmFsaWREb3VibGUocFNlaXIuZ2V0UigpKSAmJiAKKwkJCWFzc2VydFZhbGlkRG91YmxlKHBTZWlyLmdldFMoKSk7CisJCQorCX0KKworCXByaXZhdGUgYm9vbGVhbiBhc3NlcnRWYWxpZERvdWJsZShkb3VibGUgcERvdWJsZSkgeworCQlyZXR1cm4gIShEb3VibGUuaXNOYU4ocERvdWJsZSkgfHwgRG91YmxlLmlzSW5maW5pdGUocERvdWJsZSkpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFN0YXRlKFNFSVJMYWJlbFZhbHVlSW1wbCBwQ3VycmVudFNFSVIsCisJCQlTRUlSTGFiZWxWYWx1ZUltcGwgb2xkU0VJUikgeworCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCgiXG5wcmVzZW50IHN0YXRlIGlzOiBcbmN1cnJlbnRTRUlSWyVzXVxuIG9sZFNFSVJbJXNdIiwgCisJCQkJcEN1cnJlbnRTRUlSLCBvbGRTRUlSKTsKKwl9CisKKwkKKwkvKioKKwkgKiBjcmVhdGVkIGp1c3QgZm9yIHRlc3RpbmdzIHNpbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGwjZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoKSA8ZW0+ZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHM8L2VtPn0nIGlzIHByb3RlY3RlZC4KKwkgKiBAYXV0aG9yIGVpc2hheQorCSAqCisJICovCisJcHJpdmF0ZSBjbGFzcyBTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbFRlc3RlckltcGwgZXh0ZW5kcyBTdG9jaGFzdGljU0VJUkRpc2Vhc2VNb2RlbEltcGx7CisKKwkJcHVibGljIHZvaWQgZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoCisJCQkJU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlIHBDdXJyZW50U3RhdGUsCisJCQkJbG9uZyBwUmFuZG9tU2VlZCwgZG91YmxlIHBUZXN0R2FpbikgeworCQkJc2V0U2VlZChwUmFuZG9tU2VlZCk7CisJCQlzZXRHYWluKHBUZXN0R2Fpbik7CisJCQkKKwkJCVNFSVJMYWJlbFZhbHVlSW1wbCBvbGRDdXJyZW50U3RhdGUgPSBTRUlSTGFiZWxWYWx1ZVRlc3RVdGlsLmNsb25lU0VJUkxhYmVsVmFsdWVJbXBsKChTRUlSTGFiZWxWYWx1ZUltcGwpcEN1cnJlbnRTdGF0ZSk7CisJCQlzdXBlci5kb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyhwQ3VycmVudFN0YXRlKTsKKwkJfQorCQkKKwl9CisJCit9IC8vIFN0b2NoYXN0aWNTRUlSRGlzZWFzZU1vZGVsVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU3RvY2hhc3RpY1NFSVJTY2VuYXJpb1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0b2NoYXN0aWNTRUlSU2NlbmFyaW9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRmN2Q1MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0b2NoYXN0aWNTRUlSU2NlbmFyaW9UZXN0LmphdmEKQEAgLTAsMCArMSwzOTggQEAKKy8vIFN0b2NoYXN0aWNTRUlSU2NlbmFyaW9UZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TRUlSTGFiZWxWYWx1ZUltcGw7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0IHRlc3QgY2FzZSBmb3IgYSBTdG9jaGFzdGljIFNFSVIgZGlzZWFzZSBtb2RlbCBzY2VuYXJpbworICovCitwdWJsaWMgY2xhc3MgU3RvY2hhc3RpY1NFSVJTY2VuYXJpb1Rlc3QgZXh0ZW5kcyBTRUlSRGlzZWFzZU1vZGVsU2NlbmFyaW9UZXN0IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNFQVNFX1VSSV9QUkVGSVggPSAiU3RvY2hhc3RpY1NFSVIiOworCisJcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgSW50ZWdlcj4gZXhwZWN0ZWROdW1iZXJPZkxhYmVsc1RvVXBkYXRlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworCisJcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU0VJUkxhYmVsVmFsdWVbXVtdW10+IGV4cGVjdGVkRGlzZWFzZU1vZGVsU3RhdGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTRUlSTGFiZWxWYWx1ZVtdW11bXT4oKTsKKworCXN0YXRpYyB7CisKKwkJLy8gVGhlc2Ugd2VyZSBjb3BpZWQgZnJvbSBEZXRlcm1pbmlzdGljU0VJUlNjZW5hcmlvVGVzdAorCQkvLyAxeDEKKwkJZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMucHV0KFRFU1RfU0NFTkFSSU8xeDFfS0VZLAorCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZVtdW11bXSB7CisJCQkJLy8gU3RlcCAwCisJCQkJCQl7IHsKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCg5OS4wMSwgMC4wLCAwLjk4LCAwLjAsIDAuMDEsCisJCQkJCQkJCTApIH0gfSwKKworCQkJCQkJLy8gU3RlcCAxCisJCQkJCQl7IHsKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCg5OS4wMiwgMC4wLAorCQkJCQkJCQkwLjk2LCAwLjAwLCAwLjAyLCAwKSB9IH0gfSAvLyBuZXcKKwkJCQkvLyBTRUlSTGFiZWxWYWx1ZQorCisJCQkJKTsgLy8gcHV0KFRFU1RfU0NFTkFSSU8xeDFfS0VZKQorCQkvLyAxeDIKKwkJZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMKKwkJCQkucHV0KFRFU1RfU0NFTkFSSU8xeDJfS0VZLAorCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlW11bXVtdIHsKKwkJCQkJCS8vIFN0ZXAgMAorCQkJCQkJCQl7IHsKKwkJCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKSwKKwkJCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApIH0gfSwKKworCQkJCQkJCQkvLyBTdGVwIDEKKwkJCQkJCQkJeyB7CisJCQkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKSB9IH0sCisJCQkJCQkJCS8vIFN0ZXAgMgorCQkJCQkJCQl7IHsKKwkJCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKSwKKwkJCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApIH0gfSB9IC8vIG5ldworCQkJCS8vIFNFSVJMYWJlbFZhbHVlCisJCQkJKTsgLy8gcHV0KFRFU1RfU0NFTkFSSU8xeDJfS0VZKQorCisJCS8vIDF4MworCQlleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcworCQkJCS5wdXQoVEVTVF9TQ0VOQVJJTzF4M19LRVksCisJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVbXVtdW10geworCQkJCQkJLy8gU3RlcCAwCisJCQkJCQkJCXsgeworCisJCQkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKSwKKwkJCQkJCQkJCQkvLyBOWzAsMl0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApCisKKwkJCQkJCQkJfSB9LAorCisJCQkJCQkJCS8vIFN0ZXAgMQorCQkJCQkJCQl7IHsKKwkJCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKSwKKwkJCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMCwyXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCkKKworCQkJCQkJCQl9IH0sCisKKwkJCQkJCQkJLy8gU3RlcCAyCisJCQkJCQkJCXsgeworCQkJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlswLDJdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKQorCisJCQkJCQkJCX0gfSB9IC8vIG5ldyBTRUlSTGFiZWxWYWx1ZQorCisJCQkJKTsgLy8gcHV0KFRFU1RfU0NFTkFSSU8xeDNfS0VZKQorCisJCS8vIDJ4MgorCQlleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcy5wdXQoVEVTVF9TQ0VOQVJJTzJ4Ml9LRVksCisJCQkJbmV3IFNFSVJMYWJlbFZhbHVlW11bXVtdIHsKKwkJCQkvLyBTdGVwIDAKKwkJCQkJCXsKKwkJCQkJCQkJeworCisJCQkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKQorCisJCQkJCQkJCX0sCisJCQkJCQkJCXsKKworCQkJCQkJCQkvLyBOWzEsMF0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMSwxXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCkKKworCQkJCQkJCQl9IH0sCisKKwkJCQkJCS8vIFN0ZXAgMQorCQkJCQkJeworCQkJCQkJCQl7CisJCQkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKQorCisJCQkJCQkJCX0sCisJCQkJCQkJCXsKKworCQkJCQkJCQkvLyBOWzEsMF0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMSwxXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCkKKworCQkJCQkJCQl9IH0sCisKKwkJCQkJCS8vIFN0ZXAgMgorCQkJCQkJeworCQkJCQkJCQl7CisJCQkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKQorCisJCQkJCQkJCX0sCisJCQkJCQkJCXsKKworCQkJCQkJCQkvLyBOWzEsMF0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMSwxXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCkKKworCQkJCQkJCQl9IH0gfSAvLyBuZXcgU0VJUkxhYmVsVmFsdWUKKworCQkJCSk7IC8vIHB1dChURVNUX1NDRU5BUklPMngyX0tFWSkKKworCQkvLyAzeDMKKwkJZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMucHV0KFRFU1RfU0NFTkFSSU8zeDNfS0VZLAorCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZVtdW11bXSB7CisJCQkJLy8gU3RlcCAwCisJCQkJCQl7CisJCQkJCQkJCXsKKworCQkJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlswLDJdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKQorCisJCQkJCQkJCX0sCisJCQkJCQkJCXsKKworCQkJCQkJCQkvLyBOWzEsMF0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMSwxXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlsxLDJdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKQorCisJCQkJCQkJCX0sCisJCQkJCQkJCXsKKworCQkJCQkJCQkvLyBOWzIsMF0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMiwxXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCksCisJCQkJCQkJCQkJLy8gTlsyLDJdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKQorCisJCQkJCQkJCX0gfSwKKworCQkJCQkJLy8gU3RlcCAxCisJCQkJCQl7CisJCQkJCQkJCXsKKwkJCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkwKSwKKwkJCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJCQluZXcgU0VJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCwKKwkJCQkJCQkJCQkJCTApLAorCQkJCQkJCQkJCS8vIE5bMCwyXQorCQkJCQkJCQkJCW5ldyBTRUlSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQkJMCkKKworCQkJCQkJCQl9LAorCQkJCQkJCQl7CisKKwkJCQkJCQkJLy8gTlsxLDBdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkgMCksCisJCQkJCQkJCQkJLy8gTlsxLDFdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkgMCksCisJCQkJCQkJCQkJLy8gTlsxLDJdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkgMCkKKworCQkJCQkJCQl9LAorCQkJCQkJCQl7CisKKwkJCQkJCQkJLy8gTlsyLDBdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkgMCksCisJCQkJCQkJCQkJLy8gTlsyLDFdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkgMCksCisJCQkJCQkJCQkJLy8gTlsyLDJdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCSAwKQorCisJCQkJCQkJCX0gfSwKKworCQkJCQkJLy8gU3RlcCAyCisJCQkJCQl7CisJCQkJCQkJCXsKKwkJCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkgMCksCisJCQkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkgMCksCisJCQkJCQkJCQkJLy8gTlswLDJdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkgMCkKKworCQkJCQkJCQl9LAorCQkJCQkJCQl7CisKKwkJCQkJCQkJLy8gTlsxLDBdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkgMCksCisJCQkJCQkJCQkJLy8gTlsxLDFdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkgMCksCisJCQkJCQkJCQkJLy8gTlsxLDJdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkgMCkKKworCQkJCQkJCQl9LAorCQkJCQkJCQl7CisKKwkJCQkJCQkJLy8gTlsyLDBdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkgMCksCisJCQkJCQkJCQkJLy8gTlsyLDFdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkgMCksCisJCQkJCQkJCQkJLy8gTlsyLDJdCisJCQkJCQkJCQkJbmV3IFNFSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAsCisJCQkJCQkJCQkJCQkgMCkKKworCQkJCQkJCQl9IH0gfSAvLyBuZXcgU0VJUkxhYmVsVmFsdWUKKworCQkJCSk7IC8vIHB1dChURVNUX1NDRU5BUklPM3gzX0tFWSkKKworCQkvLyBGaWxsIG91dCB0aGUgbWFwIHRoYXQgc3BlY2lmaWVzIGhvdyBtYW55IGxhYmVscyBzaG91bGQgYmUgdXBkYXRlZCBieQorCQkvLyBhIGRpc2Vhc2UgbW9kZWwgZm9yIGVhY2ggdGVzdC4KKwkJZm9yIChUZXN0U3BlYyB0ZXN0U3BlYyA6IHRlc3RTcGVjaWZpY2F0aW9ucykgeworCQkJZXhwZWN0ZWROdW1iZXJPZkxhYmVsc1RvVXBkYXRlCisJCQkJCS5wdXQoCisJCQkJCQkJdGVzdFNwZWMuc2NlbmFyaW9EaXNlYXNlS2V5LAorCQkJCQkJCW5ldyBJbnRlZ2VyKAorCQkJCQkJCQkJY29tcHV0ZUV4cGVjdGVkTnVtYmVyT2ZMYWJlbHMoZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMKKwkJCQkJCQkJCQkJLmdldCh0ZXN0U3BlYy5zY2VuYXJpb0Rpc2Vhc2VLZXkpKSkpOworCQl9IC8vIGZvciBlYWNoIHRlc3Qgc3BlY2lmaWNhdGlvbgorCisJfSAvLyBzdGF0aWMKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzLkRpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdCNnZXREaXNlYXNlTW9kZWxzVG9UZXN0KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxOb2RlRGVjb3JhdG9yPiBnZXREaXNlYXNlTW9kZWxzVG9UZXN0KCkgeworCQlmaW5hbCBMaXN0PE5vZGVEZWNvcmF0b3I+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxOb2RlRGVjb3JhdG9yPigpOworCQkvLyB0aGlzIGlzIGEgdGVzdCB3aXRoIGEgZ2FpbiBvZiB6ZXJvCisJCS8vIGlmIE1VU1QgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBhcyB0aGUgZGV0ZXJtaW5pc3RpYyBtb2RlbAorCQkvLyBiZWNhdXNlIHRoZSBub2lzZSBtdWxpdHBsaWVyIGlzIDEuMCBmb3IgYSBnYWluIG9mIDAuMAorCQlyZXRWYWx1ZS5hZGQoU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxUZXN0LmNyZWF0ZUZpeHR1cmUoMC4wKSk7CisJCQorCQkvLyBORVcgVEVTVCBOZWVkZWQgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODYwNDMKKwkJLy8KKwkJLy8gd2UgbmVlZCB0byBhZGQgYSB0ZXN0IGF0IGEgaGlnaGVyIGdhaW4uIEZvciBhIGdhaW4gPiB0aGUgZnV6enkgY29tcGFyZSAoZG91YmxlIGVxdWFsaXR5IHRvbGxlcmFuY2UpCisJCS8vIDEuIHRoZSByZXN1bHRzIHNob3VsZCBESUZGRVIgZnJvbSB0aGUgZGV0ZXJtaW5pc3RpYyByZXN1bHQgKHByb3ZlcyB0aGVyZSBpcyBub2lzZQorCQkvLyAyLiB0aGUgc3RvY2hhc3RpYyB0ZXN0IHNob3VsZCBhZ3JlZSB3aXRoIHBlcmNvbXB1dGVkIHZhbHVlcworCQkvLyByZXRWYWx1ZS5hZGQoU3RvY2hhc3RpY1NFSVJEaXNlYXNlTW9kZWxUZXN0LmNyZWF0ZUZpeHR1cmUoMC4wMikpOworCQkKKwkJCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldERpc2Vhc2VNb2RlbHNUb1Rlc3QKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBpbnQgZ2V0TnVtYmVyT2ZTdGVwcyhmaW5hbCBTdHJpbmcgZGlzZWFzZVNjZW5hcmlvS2V5KSB7CisJCVNFSVJMYWJlbFZhbHVlW11bXVtdIHRlbXAgPSBleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcworCQkJCS5nZXQoZGlzZWFzZVNjZW5hcmlvS2V5KTsKKwkJcmV0dXJuIHRlbXAubGVuZ3RoOworCX0gLy8gZ2V0TnVtYmVyT2ZTdGVwcworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGludCBnZXRFeHBlY3RlZE51bWJlck9mTGFiZWxzVG9VcGRhdGUoCisJCQlmaW5hbCBTdHJpbmcgZGlzZWFzZVNjZW5hcmlvS2V5KSB7CisJCUludGVnZXIgdGVtcCA9IGV4cGVjdGVkTnVtYmVyT2ZMYWJlbHNUb1VwZGF0ZS5nZXQoZGlzZWFzZVNjZW5hcmlvS2V5KTsKKwkJcmV0dXJuIHRlbXAuaW50VmFsdWUoKTsKKwl9IC8vIGdldEV4cGVjdGVkTnVtYmVyT2ZMYWJlbHNUb1VwZGF0ZQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIExhYmVsVmFsdWVbXVtdIGdldEV4cGVjdGVkRGlzZWFzZU1vZGVsU3RhdGUoCisJCQlmaW5hbCBTdHJpbmcgZGlzZWFzZVNjZW5hcmlvS2V5LCBmaW5hbCBpbnQgc3RlcCkgeworCQlmaW5hbCBTRUlSTGFiZWxWYWx1ZVtdW11bXSBzZWlyTGFiZWxWYWx1ZSA9IGV4cGVjdGVkRGlzZWFzZU1vZGVsU3RhdGVzCisJCQkJLmdldChkaXNlYXNlU2NlbmFyaW9LZXkpOworCQlyZXR1cm4gc2VpckxhYmVsVmFsdWVbc3RlcF07CisJfSAvLyBnZXRFeHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlCisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldERpc2Vhc2VVUklQcmVmaXgoKSB7CisJCXJldHVybiBESVNFQVNFX1VSSV9QUkVGSVg7CisJfSAvLyBnZXREaXNlYXNlVVJJUHJlZml4Cit9IC8vIFN0b2NoYXN0aWNTRUlSU2NlbmFyaW9UZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2Mjc0MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbFRlc3QuamF2YQpAQCAtMCwwICsxLDI5MyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdG9jaGFzdGljU0lEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lMYWJlbFZhbHVlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbEltcGw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdG9jaGFzdGljIFNJIERpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBhcmUgdGVzdGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwjY29tcHV0ZU5vaXNlKCkgPGVtPkNvbXB1dGUgTm9pc2U8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsVGVzdCBleHRlbmRzIFNJVGVzdCB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUkFORE9NX1NFRUQgPSAxbDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBURVNUX0dBSU4gPSAwLjAxZDsKKwkKKwkvKioKKwkgKiBUaGUgbmFtZSBvZiB0aGUgdGVzdCBkaXNlYXNlIChhbiBpbnN0YW5jZSBvZiBhIGRpc2Vhc2UgbW9kZWwpCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TSV9ESVNFQVNFX05BTUUgPSAiVGVzdCBTdG9jYXN0aWMgU0kgRGlzZWFzZSI7CisKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBwYXJhbSBhcmdzCisJICogCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBTdG9jaGFzdGljIFNJIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFN0b2NoYXN0aWMgU0kgRGlzZWFzZSBNb2RlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwpZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKGNyZWF0ZUZpeHR1cmUoKSk7CisJCVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgZG1sID0gY3JlYXRlTGFiZWxGaXh0dXJlKCk7CisJCURpc2Vhc2VNb2RlbFN0YXRlIGRtcyA9IGdldEZpeHR1cmUoKS5jcmVhdGVEaXNlYXNlTW9kZWxTdGF0ZSgpOworCQlkbWwuc2V0RGlzZWFzZU1vZGVsU3RhdGUoZG1zKTsKKwkJc2V0TGFiZWxGaXh0dXJlKGRtbCk7CisJCWZpeHR1cmUuaW5pdGlhbGl6ZURpc2Vhc2VTdGF0ZShkbXMsIGRtbCk7CisJfSAvLyBzZXRVcAorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIudGVhckRvd24oKTsKKwl9IC8vIHRlYXJEb3duCisKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsI2NvbXB1dGVOb2lzZSgpIDxlbT5Db21wdXRlIE5vaXNlPC9lbT59JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwjY29tcHV0ZU5vaXNlKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RDb21wdXRlTm9pc2UoKSB7CisJCVN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbFRlc3Quc3RhdGljQ29tcHV0ZU5vaXNlVGVzdCgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBkaXNlYXNlIG1vZGVsIGluc3RhbmNlCisJICogCisJICogQHJldHVybiBhIGRpc2Vhc2UgbW9kZWwgaW5zdGFuY2UgZm9yIHRlc3QgcHVycG9zZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbCBjcmVhdGVGaXh0dXJlKCkgeworCQlyZXR1cm4gY3JlYXRlRml4dHVyZShTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJbXBsLkdBSU5fRURFRkFVTFQpOworCX0gLy8gY3JlYXRlRml4dHVyZQorCQorCS8qKgorCSAqIENyZWF0ZSBkaXNlYXNlIG1vZGVsIGluc3RhbmNlCisJICogCisJICogQHJldHVybiBhIGRpc2Vhc2UgbW9kZWwgaW5zdGFuY2UgZm9yIHRlc3QgcHVycG9zZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbCBjcmVhdGVGaXh0dXJlKGRvdWJsZSBuZXdHYWluKSB7CisJCXJldHVybiBTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxJbXBsLmNyZWF0ZVN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbCgKKwkJCQlURVNUX1NJX0RJU0VBU0VfTkFNRSwgTU9SVEFMSVRZX1JBVEUsCisJCQkJSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURSwgVFJBTlNNSVNTSU9OX1JBVEUsIFJFQ09WRVJZX1JBVEUsCisJCQkJTk9OX0xJTkVBUklUWV9DT0VGRklDSUVOVCwKKwkJCQlURVNUX1RJTUVfUEVSSU9ELCBURVNUX1BPUFVMQVRJT05fSURFTlRJRklFUiwgbmV3R2Fpbik7CisJCQorCX0gLy8gY3JlYXRlRml4dHVyZQorCisJCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGwjZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoKSA8ZW0+ZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHM8L2VtPn0nIG9wZXJhdGlvbi4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlN0b2NoYXN0aWNEaXNlYXNlTW9kZWxJbXBsI2RvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKCl7CisJCVN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbFRlc3RlckltcGwgc3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsID0gbmV3IFN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbFRlc3RlckltcGwoKTsKKwkJU0lMYWJlbFZhbHVlSW1wbCBjdXJyZW50U0kgPSBuZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAwZCwgNDBkLCAyMGQsIDEwZCk7CisJCWRvVGVzdChzdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwsIGN1cnJlbnRTSSk7CisJfQorCisvLwlwcml2YXRlIHZvaWQgZG9UZXN0V2l0aFBlcm11dGF0aW9ucygpIHsKKy8vCQlTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxUZXN0ZXJJbXBsIHN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbCA9IG5ldyBTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxUZXN0ZXJJbXBsKCk7CisvLwkJTGlzdDxTSUxhYmVsVmFsdWVJbXBsPiBtb2RlbExhYmxlVmFsdWVzID0gU0lMYWJlbFZhbHVlVGVzdFV0aWwuY3JlYXRlUmFuZG9tU0lMYWJlbFZhbHVlSW1wbCgpOworLy8JCQorLy8JCWludCBjb3VudDEgPSAwOworLy8JCWludCBjb3VudDIgPSAwOworLy8JCVN5c3RlbS5vdXQucHJpbnRsbigpOworLy8JCWZvcihTSUxhYmVsVmFsdWVJbXBsIGN1cnJlbnRTSTogbW9kZWxMYWJsZVZhbHVlcyl7CisvLwkJCVN5c3RlbS5vdXQucHJpbnRsbihjb3VudDErKyk7CisvLwkJCWZvcihTSUxhYmVsVmFsdWVJbXBsIFNJQWRkaXRpb25zOiBtb2RlbExhYmxlVmFsdWVzKXsKKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiCSIgKyBjb3VudDIrKyk7CisvLwkJCQlmb3IoU0lMYWJlbFZhbHVlSW1wbCBTSURlYXRoczogbW9kZWxMYWJsZVZhbHVlcyl7CisvLwkJCQkJLy9TSURlYXRocyBhbmQgU0lBZGRpdGlvbnMgd2lsbCBiZSBtb2RpZmllZCBteSB0aGUgdGVzdCBtZXRob2QsIHNvIHdlIGJldHRlciBjbG9uZSB0aGVtIAorLy8JCQkJCWRvVGVzdChzdG9jaGFzdGljU0lEaXNlYXNlTW9kZWwsIGN1cnJlbnRTSSwKKy8vCQkJCQkJCVNJQWRkaXRpb25zLCBTSURlYXRocyk7CisvLwkJCSAJfQorLy8JCQl9CisvLwkJfQorLy8JfQorCisJcHJpdmF0ZSB2b2lkIGRvVGVzdChTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxUZXN0ZXJJbXBsIHN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbCwKKwkJCVNJTGFiZWxWYWx1ZUltcGwgY3VycmVudFNJKSB7CisJCXN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbC5kb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyhjdXJyZW50U0ksIFJBTkRPTV9TRUVELCBURVNUX0dBSU4pOworCQkKKwkJU0lMYWJlbFZhbHVlSW1wbCBvbGRWYWwgPSAoU0lMYWJlbFZhbHVlSW1wbClFY29yZVV0aWwuY29weShjdXJyZW50U0kpOworCQlkb0NhbGN1bGF0ZU1vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyhjdXJyZW50U0ksIFJBTkRPTV9TRUVELCBURVNUX0dBSU4pOworCisJCVN0cmluZyBzdGF0ZSA9IGdldFN0YXRlKGN1cnJlbnRTSSwgb2xkVmFsKTsKKwkJCisJCXZhbGlkYXRlTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKGN1cnJlbnRTSSwgb2xkVmFsLAorCQkJCXN0YXRlKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgZG91YmxlIHByZWNpc2lvbiByYW5kb20gbm9pc2UgdmFyaWFibGUKKwkgKiByIGJldHdlZW4gKDEuMCt4KSBhbmQgKDEuMC14KQorCSAqIHdoZXJlIHggaXMgYSBwcm9kdWN0IEcqIE1hdGgucmFuZCgpLCBhbmQgRyBpcyBhIGdhaW4gZmFjdG9yIDA8RzxtYXggbm9pc2UKKwkgKiAKKwkgKiBAcGFyYW0gZ2FpbgorCSAqIEBwYXJhbSByYW5kCisJICogQHJldHVybiBub2lzZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZG91YmxlIGNvbXB1dGVOb2lzZShmaW5hbCBkb3VibGUgZ2FpbiwgZmluYWwgUmFuZG9tIHJhbmQpIHsKKworCQlkb3VibGUgeCA9ICgyLjAqcmFuZC5uZXh0RG91YmxlKCkpLTEuMDsgLy8gKy8tIDEKKwkJeCAqPSBnYWluOworCQl4ICs9IDEuMDsKKwkJYXNzZXJ0ICgoeD4wLjApJiYoeDwyLjApKSA6ICJyYW5kb20gbm9pc2Ugc2hvdWxkIGJlIGEgc21hbGwgcGVydHVyYmF0aW9uIEdhaW4gZmFjdG9yLCBnLCAgbXVzdCAwLjAgPCBnIDw8IDEuMCAiOworCQlyZXR1cm4geDsKKwkJCisJfSAvLyBnZXROb2lzZQorCQorCQorCXByaXZhdGUgdm9pZCBkb0NhbGN1bGF0ZU1vZGVsU3BlY2lmaWNBZGp1c3RtZW50cygKKwkJCVNJTGFiZWxWYWx1ZUltcGwgcEN1cnJlbnRTSSwgbG9uZyBwUmFuZG9tU2VlZCwgZG91YmxlIHBUZXN0R2FpbikgeworCQlmaW5hbCBTSUxhYmVsVmFsdWUgY3VycmVudFNJID0gKFNJTGFiZWxWYWx1ZSkgcEN1cnJlbnRTSTsKKwkJUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20ocFJhbmRvbVNlZWQpOworCQlkb3VibGUgSW5vaXN5ID0gY3VycmVudFNJLmdldEkoKSogY29tcHV0ZU5vaXNlKHBUZXN0R2FpbiwgcmFuZG9tKTsKKwkJY3VycmVudFNJLnNldEkoSW5vaXN5KTsKKwkJcmV0dXJuOworCX0KKworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU1vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyhTSUxhYmVsVmFsdWVJbXBsIGN1cnJlbnRWYWwsCisJCQlTSUxhYmVsVmFsdWVJbXBsIG9sZFZhbCwKKwkJCVN0cmluZyBzdGF0ZSkgeworCisJCQorCQl0cnl7CisJCQljdXJyZW50VmFsLnNhbmUoKTsKKwkJfQorCQljYXRjaChUaHJvd2FibGUgdCl7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjdXJyZW50VmFsIGlzIGluc2FuZSwgc3RhdGUgaXM6ICIgKyBzdGF0ZSwgdCk7CisJCX0KKwkJdHJ5eworCQkJb2xkVmFsLnNhbmUoKTsKKwkJfQorCQljYXRjaChUaHJvd2FibGUgdCl7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvbGRWYWwgaXMgaW5zYW5lLCBzdGF0ZSBpczogIiArIHN0YXRlLCB0KTsKKwkJfQorCisJCQorCQkKKwkJYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJjdXJyZW50VmFsIGhhcyBpbnNhbmUgdmFsdWVzICVzIiwgc3RhdGUpLCBteVNhbml0eUNoZWNrKGN1cnJlbnRWYWwpKTsKKwkJYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJvbGRWYWwgaGFzIGluc2FuZSB2YWx1ZXMgJXMiLCBzdGF0ZSksIG15U2FuaXR5Q2hlY2sob2xkVmFsKSk7CisJCQorCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tFcXVhbChTSUxhYmVsVmFsdWVJbXBsIHBDYWxjdWxhdGVkU0lBZGRpdGlvbnMsCisJCQlTSUxhYmVsVmFsdWVJbXBsIHBOZXdTSUFkZGl0aW9ucykgeworCQlpZigocENhbGN1bGF0ZWRTSUFkZGl0aW9ucy5nZXREaXNlYXNlRGVhdGhzKCkgIT0gcE5ld1NJQWRkaXRpb25zLmdldERpc2Vhc2VEZWF0aHMoKSkgfHwKKwkJCQkocENhbGN1bGF0ZWRTSUFkZGl0aW9ucy5nZXRJKCkgIT0gcE5ld1NJQWRkaXRpb25zLmdldEkoKSkgfHwKKwkJCQkocENhbGN1bGF0ZWRTSUFkZGl0aW9ucy5nZXRQb3B1bGF0aW9uQ291bnQoKSAhPSBwTmV3U0lBZGRpdGlvbnMuZ2V0UG9wdWxhdGlvbkNvdW50KCkpIHx8CisJCQkJKHBDYWxjdWxhdGVkU0lBZGRpdGlvbnMuZ2V0UygpICE9IHBOZXdTSUFkZGl0aW9ucy5nZXRTKCkpKXsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIG15U2FuaXR5Q2hlY2soU0lMYWJlbFZhbHVlSW1wbCBwU0kpIHsKKwkJcmV0dXJuIGFzc2VydFZhbGlkRG91YmxlKHBTSS5nZXRJKCkpICYmIAorCQkJYXNzZXJ0VmFsaWREb3VibGUocFNJLmdldFMoKSk7CisJCQorCX0KKworCXByaXZhdGUgYm9vbGVhbiBhc3NlcnRWYWxpZERvdWJsZShkb3VibGUgcERvdWJsZSkgeworCQlyZXR1cm4gIShEb3VibGUuaXNOYU4ocERvdWJsZSkgfHwgRG91YmxlLmlzSW5maW5pdGUocERvdWJsZSkpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFN0YXRlKFNJTGFiZWxWYWx1ZUltcGwgcEN1cnJlbnRTSSwKKwkJCVNJTGFiZWxWYWx1ZUltcGwgb2xkVmFsKSB7CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCJcbnByZXNlbnQgc3RhdGUgaXM6IFxuQ3VycmVudFNJWyVzXVxuIG9sZFNJWyVzXVxuIiwgCisJCQkJcEN1cnJlbnRTSSwgb2xkVmFsKTsKKwl9CisKKwkKKwkvKioKKwkgKiBjcmVhdGVkIGp1c3QgZm9yIHRlc3RpbmdzIHNpbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGwjZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoKSA8ZW0+ZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHM8L2VtPn0nIGlzIHByb3RlY3RlZC4KKwkgKiBAYXV0aG9yIGVpc2hheQorCSAqCisJICovCisJcHJpdmF0ZSBjbGFzcyBTdG9jaGFzdGljU0lEaXNlYXNlTW9kZWxUZXN0ZXJJbXBsIGV4dGVuZHMgU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsSW1wbHsKKworCQlwdWJsaWMgdm9pZCBkb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cygKKwkJCQlTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWUgcEN1cnJlbnRTdGF0ZSwKKwkJCQlsb25nIHBSYW5kb21TZWVkLCBkb3VibGUgcFRlc3RHYWluKSB7CisJCQlzZXRTZWVkKHBSYW5kb21TZWVkKTsKKwkJCXNldEdhaW4ocFRlc3RHYWluKTsKKwkJCQorCQkJU0lMYWJlbFZhbHVlSW1wbCBvbGRDdXJyZW50U3RhdGUgPSBTSUxhYmVsVmFsdWVUZXN0VXRpbC5jbG9uZVNJTGFiZWxWYWx1ZUltcGwoKFNJTGFiZWxWYWx1ZUltcGwpcEN1cnJlbnRTdGF0ZSk7CisJCQlzdXBlci5kb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyhwQ3VycmVudFN0YXRlKTsKKwkJfQorCQkKKwl9CisJCit9IC8vIFN0b2NoYXN0aWNTSURpc2Vhc2VNb2RlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNzhiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzAyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWxTdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lSTGFiZWxWYWx1ZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSW1wbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0b2NoYXN0aWMgU0lSIERpc2Vhc2UgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBhcmUgdGVzdGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWwjY29tcHV0ZU5vaXNlKCkgPGVtPkNvbXB1dGUgTm9pc2U8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbFRlc3QgZXh0ZW5kcyBTSVJUZXN0IHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBSQU5ET01fU0VFRCA9IDFsOworCXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIFRFU1RfR0FJTiA9IDAuMDFkOworCQorCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0IGRpc2Vhc2UgKGFuIGluc3RhbmNlIG9mIGEgZGlzZWFzZSBtb2RlbCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NJUl9ESVNFQVNFX05BTUUgPSAiVGVzdCBTdG9jYXN0aWMgU0lSIERpc2Vhc2UiOworCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFN0b2NoYXN0aWMgU0lSIERpc2Vhc2UgTW9kZWwgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTdG9jaGFzdGljIFNJUiBEaXNlYXNlIE1vZGVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIChTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCQlTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsIGRtbCA9IGNyZWF0ZUxhYmVsRml4dHVyZSgpOworCQlEaXNlYXNlTW9kZWxTdGF0ZSBkbXMgPSBnZXRGaXh0dXJlKCkuY3JlYXRlRGlzZWFzZU1vZGVsU3RhdGUoKTsKKwkJZG1sLnNldERpc2Vhc2VNb2RlbFN0YXRlKGRtcyk7CisJCXNldExhYmVsRml4dHVyZShkbWwpOworCQlmaXh0dXJlLmluaXRpYWxpemVEaXNlYXNlU3RhdGUoZG1zLCBkbWwpOworCX0gLy8gc2V0VXAKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnRlYXJEb3duKCk7CisJfSAvLyB0ZWFyRG93bgorCisJLyoqCisJICogVGVzdHMgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbCNjb21wdXRlTm9pc2UoKSA8ZW0+Q29tcHV0ZSBOb2lzZTwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsI2NvbXB1dGVOb2lzZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Q29tcHV0ZU5vaXNlKCkgeworCQlTdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWxUZXN0LnN0YXRpY0NvbXB1dGVOb2lzZVRlc3QoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgZGlzZWFzZSBtb2RlbCBpbnN0YW5jZQorCSAqIAorCSAqIEByZXR1cm4gYSBkaXNlYXNlIG1vZGVsIGluc3RhbmNlIGZvciB0ZXN0IHB1cnBvc2VzCisJICovCisJcHVibGljIHN0YXRpYyBTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsIGNyZWF0ZUZpeHR1cmUoKSB7CisJCXJldHVybiBjcmVhdGVGaXh0dXJlKFN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGwuR0FJTl9FREVGQVVMVCk7CisJfSAvLyBjcmVhdGVGaXh0dXJlCisJCisJLyoqCisJICogQ3JlYXRlIGRpc2Vhc2UgbW9kZWwgaW5zdGFuY2UKKwkgKiAKKwkgKiBAcmV0dXJuIGEgZGlzZWFzZSBtb2RlbCBpbnN0YW5jZSBmb3IgdGVzdCBwdXJwb3NlcworCSAqLworCXB1YmxpYyBzdGF0aWMgU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCBjcmVhdGVGaXh0dXJlKGRvdWJsZSBuZXdHYWluKSB7CisJCXJldHVybiBTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsSW1wbC5jcmVhdGVTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsKAorCQkJCVRFU1RfU0lSX0RJU0VBU0VfTkFNRSwgTU9SVEFMSVRZX1JBVEUsCisJCQkJSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURSwgVFJBTlNNSVNTSU9OX1JBVEUsIFJFQ09WRVJZX1JBVEUsCisJCQkJSU1NVU5JVFlfTE9TU19SQVRFLCBOT05fTElORUFSSVRZX0NPRUZGSUNJRU5ULAorCQkJCVRFU1RfVElNRV9QRVJJT0QsIFRFU1RfUE9QVUxBVElPTl9JREVOVElGSUVSLCBuZXdHYWluKTsKKwkJCisJfSAvLyBjcmVhdGVGaXh0dXJlCisKKwkKKwkvKioKKwkgKiBUZXN0cyB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuaW1wbC5TdG9jaGFzdGljRGlzZWFzZU1vZGVsSW1wbCNkb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cygpIDxlbT5kb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50czwvZW0+fScgb3BlcmF0aW9uLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGwjZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQorCXB1YmxpYyB2b2lkIHRlc3RNb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoKXsKKwkJU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbFRlc3RlckltcGwgc3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCA9IG5ldyBTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsVGVzdGVySW1wbCgpOworCQlTSVJMYWJlbFZhbHVlSW1wbCBjdXJyZW50U0lSID0gbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMDBkLCA0MGQsIDMwZCwgMjBkLCAxMGQpOworCQlkb1Rlc3Qoc3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbCwgY3VycmVudFNJUik7CisJfQorCisvLwlAU3VwcHJlc3NXYXJuaW5ncygic3ludGhldGljLWFjY2VzcyIpCisvLwlwcml2YXRlIHZvaWQgZG9UZXN0V2l0aFBlcm11dGF0aW9ucygpIHsKKy8vCQlTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsVGVzdGVySW1wbCBzdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsID0gbmV3IFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxUZXN0ZXJJbXBsKCk7CisvLwkJTGlzdDxTSVJMYWJlbFZhbHVlSW1wbD4gbW9kZWxMYWJsZVZhbHVlcyA9IFNJUkxhYmVsVmFsdWVUZXN0VXRpbC5jcmVhdGVSYW5kb21TSVJMYWJlbFZhbHVlSW1wbCgpOworLy8JCQorLy8JCWludCBjb3VudDEgPSAwOworLy8JCWludCBjb3VudDIgPSAwOworLy8JCVN5c3RlbS5vdXQucHJpbnRsbigpOworLy8JCWZvcihTSVJMYWJlbFZhbHVlSW1wbCBjdXJyZW50U0lSOiBtb2RlbExhYmxlVmFsdWVzKXsKKy8vCQkJU3lzdGVtLm91dC5wcmludGxuKGNvdW50MSsrKTsKKy8vCQkJZm9yKFNJUkxhYmVsVmFsdWVJbXBsIFNJUkFkZGl0aW9uczogbW9kZWxMYWJsZVZhbHVlcyl7CisvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIgkiICsgY291bnQyKyspOworLy8JCQkJZm9yKFNJUkxhYmVsVmFsdWVJbXBsIFNJUkRlYXRoczogbW9kZWxMYWJsZVZhbHVlcyl7CisvLwkJCQkJLy9TSVJEZWF0aHMgYW5kIFNJUkFkZGl0aW9ucyB3aWxsIGJlIG1vZGlmaWVkIG15IHRoZSB0ZXN0IG1ldGhvZCwgc28gd2UgYmV0dGVyIGNsb25lIHRoZW0gCisvLwkJCQkJZG9UZXN0KHN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWwsIGN1cnJlbnRTSVIsCisvLwkJCQkJCQlTSVJBZGRpdGlvbnMsIFNJUkRlYXRocyk7CisvLwkJCSAJfQorLy8JCQl9CisvLwkJfQorLy8JfQorCisJcHJpdmF0ZSB2b2lkIGRvVGVzdChTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsVGVzdGVySW1wbCBzdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsLAorCQkJU0lSTGFiZWxWYWx1ZUltcGwgY3VycmVudFNJUikgeworCQkKKwkJc3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbC5kb01vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyhjdXJyZW50U0lSLCBSQU5ET01fU0VFRCwgVEVTVF9HQUlOKTsKKwkJU0lSTGFiZWxWYWx1ZUltcGwgb2xkU0lSPSAoU0lSTGFiZWxWYWx1ZUltcGwpRWNvcmVVdGlsLmNvcHkoY3VycmVudFNJUik7CisJCWRvQ2FsY3VsYXRlTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKGN1cnJlbnRTSVIsIFJBTkRPTV9TRUVELCBURVNUX0dBSU4pOworCisJCVN0cmluZyBzdGF0ZSA9IGdldFN0YXRlKGN1cnJlbnRTSVIsIG9sZFNJUik7CisJCQorCQl2YWxpZGF0ZU1vZGVsU3BlY2lmaWNBZGp1c3RtZW50cyhjdXJyZW50U0lSLAorCQkJCW9sZFNJUiwKKwkJCQlzdGF0ZSk7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGRvdWJsZSBwcmVjaXNpb24gcmFuZG9tIG5vaXNlIHZhcmlhYmxlCisJICogciBiZXR3ZWVuICgxLjAreCkgYW5kICgxLjAteCkKKwkgKiB3aGVyZSB4IGlzIGEgcHJvZHVjdCBHKiBNYXRoLnJhbmQoKSwgYW5kIEcgaXMgYSBnYWluIGZhY3RvciAwPEc8bWF4IG5vaXNlCisJICogCisJICogQHBhcmFtIGdhaW4KKwkgKiBAcGFyYW0gcmFuZAorCSAqIEByZXR1cm4gbm9pc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBjb21wdXRlTm9pc2UoZmluYWwgZG91YmxlIGdhaW4sIGZpbmFsIFJhbmRvbSByYW5kKSB7CisKKwkJZG91YmxlIHggPSAoMi4wKnJhbmQubmV4dERvdWJsZSgpKS0xLjA7IC8vICsvLSAxCisJCXggKj0gZ2FpbjsKKwkJeCArPSAxLjA7CisJCWFzc2VydCAoKHg+MC4wKSYmKHg8Mi4wKSkgOiAicmFuZG9tIG5vaXNlIHNob3VsZCBiZSBhIHNtYWxsIHBlcnR1cmJhdGlvbiBHYWluIGZhY3RvciwgZywgIG11c3QgMC4wIDwgZyA8PCAxLjAgIjsKKwkJcmV0dXJuIHg7CisJCQorCX0gLy8gZ2V0Tm9pc2UKKwkKKwkKKwlwcml2YXRlIHZvaWQgZG9DYWxjdWxhdGVNb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoCisJCQlTSVJMYWJlbFZhbHVlSW1wbCBwQ3VycmVudFNJUiwgbG9uZyBwUmFuZG9tU2VlZCwgZG91YmxlIHBUZXN0R2FpbikgeworCQkKKwkJZmluYWwgU0lSTGFiZWxWYWx1ZSBjdXJyZW50U0kgPSAoU0lSTGFiZWxWYWx1ZSkgcEN1cnJlbnRTSVI7CisJCVJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKHBSYW5kb21TZWVkKTsKKwkJZG91YmxlIElub2lzeSA9IGN1cnJlbnRTSS5nZXRJKCkqIGNvbXB1dGVOb2lzZShwVGVzdEdhaW4sIHJhbmRvbSk7CisJCWN1cnJlbnRTSS5zZXRJKElub2lzeSk7CisJCXJldHVybjsKKwkJCQkKKwl9CisKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVNb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoU0lSTGFiZWxWYWx1ZUltcGwgY3VycmVudFNJUiwKKwkJCVNJUkxhYmVsVmFsdWVJbXBsIG9sZFNJUiwKKwkJCVN0cmluZyBzdGF0ZSkgeworCisJCQorCQl0cnl7CisJCQljdXJyZW50U0lSLnNhbmUoKTsKKwkJfQorCQljYXRjaChUaHJvd2FibGUgdCl7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjdXJyZW50U0lSIGlzIGluc2FuZSwgc3RhdGUgaXM6ICIgKyBzdGF0ZSwgdCk7CisJCX0KKwkJdHJ5eworCQkJb2xkU0lSLnNhbmUoKTsKKwkJfQorCQljYXRjaChUaHJvd2FibGUgdCl7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvbGRTSVIgaXMgaW5zYW5lLCBzdGF0ZSBpczogIiArIHN0YXRlLCB0KTsKKwkJfQorCisJCQorCQkKKwkJYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJjdXJyZW50U0lSIGhhcyBpbnNhbmUgdmFsdWVzICVzIiwgc3RhdGUpLCBteVNhbml0eUNoZWNrKGN1cnJlbnRTSVIpKTsKKwkJYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJvbGRTSVIgaGFzIGluc2FuZSB2YWx1ZXMgJXMiLCBzdGF0ZSksIG15U2FuaXR5Q2hlY2sob2xkU0lSKSk7CisKKwkJCisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBjaGVja0VxdWFsKFNJUkxhYmVsVmFsdWVJbXBsIHBDYWxjdWxhdGVkU0lSQWRkaXRpb25zLAorCQkJU0lSTGFiZWxWYWx1ZUltcGwgcE5ld1NJUkFkZGl0aW9ucykgeworCQlpZigocENhbGN1bGF0ZWRTSVJBZGRpdGlvbnMuZ2V0RGlzZWFzZURlYXRocygpICE9IHBOZXdTSVJBZGRpdGlvbnMuZ2V0RGlzZWFzZURlYXRocygpKSB8fAorCQkJCShwQ2FsY3VsYXRlZFNJUkFkZGl0aW9ucy5nZXRJKCkgIT0gcE5ld1NJUkFkZGl0aW9ucy5nZXRJKCkpIHx8CisJCQkJKHBDYWxjdWxhdGVkU0lSQWRkaXRpb25zLmdldFBvcHVsYXRpb25Db3VudCgpICE9IHBOZXdTSVJBZGRpdGlvbnMuZ2V0UG9wdWxhdGlvbkNvdW50KCkpIHx8CisJCQkJKHBDYWxjdWxhdGVkU0lSQWRkaXRpb25zLmdldFIoKSAhPSBwTmV3U0lSQWRkaXRpb25zLmdldFIoKSkgfHwKKwkJCQkocENhbGN1bGF0ZWRTSVJBZGRpdGlvbnMuZ2V0UygpICE9IHBOZXdTSVJBZGRpdGlvbnMuZ2V0UygpKSl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBteVNhbml0eUNoZWNrKFNJUkxhYmVsVmFsdWVJbXBsIHBTSVIpIHsKKwkJcmV0dXJuIGFzc2VydFZhbGlkRG91YmxlKHBTSVIuZ2V0SSgpKSAmJiAKKwkJCWFzc2VydFZhbGlkRG91YmxlKHBTSVIuZ2V0UigpKSAmJiAKKwkJCWFzc2VydFZhbGlkRG91YmxlKHBTSVIuZ2V0UygpKTsKKwkJCisJfQorCisJcHJpdmF0ZSBib29sZWFuIGFzc2VydFZhbGlkRG91YmxlKGRvdWJsZSBwRG91YmxlKSB7CisJCXJldHVybiAhKERvdWJsZS5pc05hTihwRG91YmxlKSB8fCBEb3VibGUuaXNJbmZpbml0ZShwRG91YmxlKSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhdGUoU0lSTGFiZWxWYWx1ZUltcGwgcEN1cnJlbnRTSVIsCisJCQlTSVJMYWJlbFZhbHVlSW1wbCBvbGRTSVIpIHsKKwkJcmV0dXJuIFN0cmluZy5mb3JtYXQoIlxucHJlc2VudCBzdGF0ZSBpczogXG5DdXJyZW50U0lSWyVzXVxuIE9sZFNJUlslc11cbiIsIAorCQkJCXBDdXJyZW50U0lSLCBwQ3VycmVudFNJUiwgb2xkU0lSKTsKKwl9CisKKwkKKwkvKioKKwkgKiBjcmVhdGVkIGp1c3QgZm9yIHRlc3RpbmdzIHNpbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbEltcGwjZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHMoKSA8ZW0+ZG9Nb2RlbFNwZWNpZmljQWRqdXN0bWVudHM8L2VtPn0nIGlzIHByb3RlY3RlZC4KKwkgKiBAYXV0aG9yIGVpc2hheQorCSAqCisJICovCisJcHJpdmF0ZSBjbGFzcyBTdG9jaGFzdGljU0lSRGlzZWFzZU1vZGVsVGVzdGVySW1wbCBleHRlbmRzIFN0b2NoYXN0aWNTSVJEaXNlYXNlTW9kZWxJbXBseworCisJCXB1YmxpYyB2b2lkIGRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKAorCQkJCVN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBwQ3VycmVudFN0YXRlLAorCQkJCWxvbmcgcFJhbmRvbVNlZWQsIGRvdWJsZSBwVGVzdEdhaW4pIHsKKwkJCXNldFNlZWQocFJhbmRvbVNlZWQpOworCQkJc2V0R2FpbihwVGVzdEdhaW4pOworCQkJCisJCQlTSVJMYWJlbFZhbHVlSW1wbCBvbGRDdXJyZW50U3RhdGUgPSBTSVJMYWJlbFZhbHVlVGVzdFV0aWwuY2xvbmVTSVJMYWJlbFZhbHVlSW1wbCgoU0lSTGFiZWxWYWx1ZUltcGwpcEN1cnJlbnRTdGF0ZSk7CisJCQkKKwkJCXN1cGVyLmRvTW9kZWxTcGVjaWZpY0FkanVzdG1lbnRzKHBDdXJyZW50U3RhdGUpOworCQl9CisJCQorCX0KKwkKK30gLy8gU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0b2NoYXN0aWNTSVJTY2VuYXJpb1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0b2NoYXN0aWNTSVJTY2VuYXJpb1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmIzN2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvdGVzdHMvU3RvY2hhc3RpY1NJUlNjZW5hcmlvVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzI0IEBACisvLyBTdG9jaGFzdGljU0lSU2NlbmFyaW9UZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJUkxhYmVsVmFsdWVJbXBsOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBKVW5pdCB0ZXN0IGNhc2UgZm9yIGEgU3RvY2hhc3RpYyBTSVIgZGlzZWFzZSBtb2RlbCBzY2VuYXJpbworICovCitwdWJsaWMgY2xhc3MgU3RvY2hhc3RpY1NJUlNjZW5hcmlvVGVzdCBleHRlbmRzIFNJUkRpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdCB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTRUFTRV9VUklfUFJFRklYID0gIlN0b2NoYXN0aWNTSVIiOworCisJcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgSW50ZWdlcj4gZXhwZWN0ZWROdW1iZXJPZkxhYmVsc1RvVXBkYXRlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworCisJcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU0lSTGFiZWxWYWx1ZVtdW11bXT4gZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNJUkxhYmVsVmFsdWVbXVtdW10+KCk7CisKKwlzdGF0aWMgeworCisJCS8vIFRoZXNlIHdlcmUgY29waWVkIGZyb20gRGV0ZXJtaW5pc3RpY1NJUlNjZW5hcmlvVGVzdAorCQkvLyAxeDEKKwkJZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMucHV0KFRFU1RfU0NFTkFSSU8xeDFfS0VZLAorCQkJCW5ldyBTSVJMYWJlbFZhbHVlW11bXVtdIHsKKwkJCQkvLyBTdGVwIDAKKwkJCQkJCXsgeworCQkJCQkJLy8gTlswLDBdCisJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoOTkuMDEsIDAuOTgsIDAuMDAsIDAuMDEsCisJCQkJCQkJCTAuMCkgfSB9LAorCisJCQkJCQkvLyBTdGVwIDEKKwkJCQkJCXsgeworCQkJCQkJLy8gTlswLDBdCisJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoOTkuMDIsIDAuOTYsCisJCQkJCQkJCTAuMCwgMC4wMiwgCisJCQkJCQkJCTAuMDApIH0gfSB9IC8vIG5ldworCQkJCS8vIFNJUkxhYmVsVmFsdWUKKworCQkJCSk7IC8vIHB1dChURVNUX1NDRU5BUklPMXgxX0tFWSkKKworCQkvLyAxeDIKKwkJZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMKKwkJCQkucHV0KFRFU1RfU0NFTkFSSU8xeDJfS0VZLAorCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVbXVtdW10geworCQkJCQkJLy8gU3RlcCAwCisJCQkJCQkJCXsgeworCQkJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwCisJCQkJCQkJCQkJCQkpLAorCQkJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAKKwkJCQkJCQkJCQkJCSkgfSB9LAorCisJCQkJCQkJCS8vIFN0ZXAgMQorCQkJCQkJCQl7IHsKKwkJCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMAorCQkJCQkJCQkJCQkJKSwKKwkJCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwCisJCQkJCQkJCQkJCQkpIH0gfSwKKwkJCQkJCQkJLy8gU3RlcCAyCisJCQkJCQkJCXsgeworCQkJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwCisJCQkJCQkJCQkJCQkpLAorCQkJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDAKKwkJCQkJCQkJCQkJCSkgfSB9IH0gLy8gbmV3CisJCQkJLy8gU0lSTGFiZWxWYWx1ZQorCQkJCSk7IC8vIHB1dChURVNUX1NDRU5BUklPMXgyX0tFWSkKKworCQkvLyAxeDMKKwkJZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMucHV0KFRFU1RfU0NFTkFSSU8xeDNfS0VZLAorCQkJCW5ldyBTSVJMYWJlbFZhbHVlW11bXVtdIHsKKwkJCQkvLyBTdGVwIDAKKwkJCQkJCXsgeworCisJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDJdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApCisKKwkJCQkJCX0gfSwKKworCQkJCQkJLy8gU3RlcCAxCisJCQkJCQl7IHsKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzAsMl0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCkKKworCQkJCQkJfSB9LAorCisJCQkJCQkvLyBTdGVwIDIKKwkJCQkJCXsgeworCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMCwyXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKQorCisJCQkJCQl9IH0gfSAvLyBuZXcgU0lSTGFiZWxWYWx1ZQorCisJCQkJKTsgLy8gcHV0KFRFU1RfU0NFTkFSSU8xeDNfS0VZKQorCisJCS8vIDJ4MgorCQlleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcy5wdXQoVEVTVF9TQ0VOQVJJTzJ4Ml9LRVksCisJCQkJbmV3IFNJUkxhYmVsVmFsdWVbXVtdW10geworCQkJCS8vIFN0ZXAgMAorCQkJCQkJeyB7CisKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApCisKKwkJCQkJCX0sIHsKKworCQkJCQkJLy8gTlsxLDBdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzEsMV0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCkKKworCQkJCQkJfSB9LAorCisJCQkJCQkvLyBTdGVwIDEKKwkJCQkJCXsgeworCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCkKKworCQkJCQkJfSwgeworCisJCQkJCQkvLyBOWzEsMF0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMSwxXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKQorCisJCQkJCQl9IH0sCisKKwkJCQkJCS8vIFN0ZXAgMgorCQkJCQkJeyB7CisJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKQorCisJCQkJCQl9LCB7CisKKwkJCQkJCS8vIE5bMSwwXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsxLDFdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApCisKKwkJCQkJCX0gfSB9IC8vIG5ldyBTSVJMYWJlbFZhbHVlCisKKwkJCQkpOyAvLyBwdXQoVEVTVF9TQ0VOQVJJTzJ4Ml9LRVkpCisKKwkJLy8gM3gzCisJCWV4cGVjdGVkRGlzZWFzZU1vZGVsU3RhdGVzLnB1dChURVNUX1NDRU5BUklPM3gzX0tFWSwKKwkJCQluZXcgU0lSTGFiZWxWYWx1ZVtdW11bXSB7CisJCQkJLy8gU3RlcCAwCisJCQkJCQl7IHsKKworCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMCwyXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKQorCisJCQkJCQl9LCB7CisKKwkJCQkJCS8vIE5bMSwwXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsxLDFdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzEsMl0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCkKKworCQkJCQkJfSwgeworCisJCQkJCQkvLyBOWzIsMF0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMiwxXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsyLDJdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApCisKKwkJCQkJCX0gfSwKKworCQkJCQkJLy8gU3RlcCAxCisJCQkJCQl7IHsKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzAsMl0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCkKKworCQkJCQkJfSwgeworCisJCQkJCQkvLyBOWzEsMF0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMSwxXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsxLDJdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApCisKKwkJCQkJCX0sIHsKKworCQkJCQkJLy8gTlsyLDBdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzIsMV0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMiwyXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKQorCisJCQkJCQl9IH0sCisKKwkJCQkJCS8vIFN0ZXAgMgorCQkJCQkJeyB7CisJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDJdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApCisKKwkJCQkJCX0sIHsKKworCQkJCQkJLy8gTlsxLDBdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzEsMV0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMSwyXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKQorCisJCQkJCQl9LCB7CisKKwkJCQkJCS8vIE5bMiwwXQorCQkJCQkJCQluZXcgU0lSTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsyLDFdCisJCQkJCQkJCW5ldyBTSVJMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzIsMl0KKwkJCQkJCQkJbmV3IFNJUkxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCwgMCkKKworCQkJCQkJfSB9IH0gLy8gbmV3IFNJUkxhYmVsVmFsdWUKKworCQkJCSk7IC8vIHB1dChURVNUX1NDRU5BUklPM3gzX0tFWSkKKworCQkvLyBGaWxsIG91dCB0aGUgbWFwIHRoYXQgc3BlY2lmaWVzIGhvdyBtYW55IGxhYmVscyBzaG91bGQgYmUgdXBkYXRlZCBieQorCQkvLyBhIGRpc2Vhc2UgbW9kZWwgZm9yIGVhY2ggdGVzdC4KKwkJZm9yIChUZXN0U3BlYyB0ZXN0U3BlYyA6IHRlc3RTcGVjaWZpY2F0aW9ucykgeworCQkJZXhwZWN0ZWROdW1iZXJPZkxhYmVsc1RvVXBkYXRlCisJCQkJCS5wdXQoCisJCQkJCQkJdGVzdFNwZWMuc2NlbmFyaW9EaXNlYXNlS2V5LAorCQkJCQkJCW5ldyBJbnRlZ2VyKAorCQkJCQkJCQkJY29tcHV0ZUV4cGVjdGVkTnVtYmVyT2ZMYWJlbHMoZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMKKwkJCQkJCQkJCQkJLmdldCh0ZXN0U3BlYy5zY2VuYXJpb0Rpc2Vhc2VLZXkpKSkpOworCQl9IC8vIGZvciBlYWNoIHRlc3Qgc3BlY2lmaWNhdGlvbgorCisJfSAvLyBzdGF0aWMKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzLkRpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdCNnZXREaXNlYXNlTW9kZWxzVG9UZXN0KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxOb2RlRGVjb3JhdG9yPiBnZXREaXNlYXNlTW9kZWxzVG9UZXN0KCkgeworCQlmaW5hbCBMaXN0PE5vZGVEZWNvcmF0b3I+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxOb2RlRGVjb3JhdG9yPigpOworCQlyZXRWYWx1ZS5hZGQoU3RvY2hhc3RpY1NJUkRpc2Vhc2VNb2RlbFRlc3QuY3JlYXRlRml4dHVyZSgpKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0RGlzZWFzZU1vZGVsc1RvVGVzdAorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGludCBnZXROdW1iZXJPZlN0ZXBzKGZpbmFsIFN0cmluZyBkaXNlYXNlU2NlbmFyaW9LZXkpIHsKKwkJU0lSTGFiZWxWYWx1ZVtdW11bXSB0ZW1wID0gZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMKKwkJCQkuZ2V0KGRpc2Vhc2VTY2VuYXJpb0tleSk7CisJCXJldHVybiB0ZW1wLmxlbmd0aDsKKwl9IC8vIGdldE51bWJlck9mU3RlcHMKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBpbnQgZ2V0RXhwZWN0ZWROdW1iZXJPZkxhYmVsc1RvVXBkYXRlKAorCQkJZmluYWwgU3RyaW5nIGRpc2Vhc2VTY2VuYXJpb0tleSkgeworCQlJbnRlZ2VyIHRlbXAgPSBleHBlY3RlZE51bWJlck9mTGFiZWxzVG9VcGRhdGUuZ2V0KGRpc2Vhc2VTY2VuYXJpb0tleSk7CisJCXJldHVybiB0ZW1wLmludFZhbHVlKCk7CisJfSAvLyBnZXRFeHBlY3RlZE51bWJlck9mTGFiZWxzVG9VcGRhdGUKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBMYWJlbFZhbHVlW11bXSBnZXRFeHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlKAorCQkJZmluYWwgU3RyaW5nIGRpc2Vhc2VTY2VuYXJpb0tleSwgZmluYWwgaW50IHN0ZXApIHsKKwkJZmluYWwgU0lSTGFiZWxWYWx1ZVtdW11bXSBzaXJMYWJlbFZhbHVlID0gZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMKKwkJCQkuZ2V0KGRpc2Vhc2VTY2VuYXJpb0tleSk7CisJCXJldHVybiBzaXJMYWJlbFZhbHVlW3N0ZXBdOworCX0gLy8gZ2V0RXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXREaXNlYXNlVVJJUHJlZml4KCkgeworCQlyZXR1cm4gRElTRUFTRV9VUklfUFJFRklYOworCX0gLy8gZ2V0RGlzZWFzZVVSSVByZWZpeAorfSAvLyBTdG9jaGFzdGljU0lSU2NlbmFyaW9UZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdG9jaGFzdGljU0lTY2VuYXJpb1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Rlc3RzL1N0b2NoYXN0aWNTSVNjZW5hcmlvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZmQ0ODYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC90ZXN0cy9TdG9jaGFzdGljU0lTY2VuYXJpb1Rlc3QuamF2YQpAQCAtMCwwICsxLDMxOSBAQAorLy8gU3RvY2hhc3RpY1NJU2NlbmFyaW9UZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU0lMYWJlbFZhbHVlSW1wbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgSlVuaXQgdGVzdCBjYXNlIGZvciBhIFN0b2NoYXN0aWMgU0kgZGlzZWFzZSBtb2RlbCBzY2VuYXJpbworICovCitwdWJsaWMgY2xhc3MgU3RvY2hhc3RpY1NJU2NlbmFyaW9UZXN0IGV4dGVuZHMgU0lEaXNlYXNlTW9kZWxTY2VuYXJpb1Rlc3QgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0VBU0VfVVJJX1BSRUZJWCA9ICJTdG9jaGFzdGljU0kiOworCisJcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgSW50ZWdlcj4gZXhwZWN0ZWROdW1iZXJPZkxhYmVsc1RvVXBkYXRlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworCisJcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU0lMYWJlbFZhbHVlW11bXVtdPiBleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU0lMYWJlbFZhbHVlW11bXVtdPigpOworCisJc3RhdGljIHsKKworCQkvLyAxeDEKKwkJLy8gVGhlc2UgYXJlIGNvcGllZCBmcm9tIERldGVybWluaXN0aWNTSVNjZW5hcmlvVGVzdCBhbmQgdXNlZCBiZWNhdXNlCisJCS8vIHRoZSBTdG9jaGFzdGljIGRpc2Vhc2UgbW9kZWxzIGhhdmUgbm90IGJlZW4gZW5hYmxlZCBhbmQgZG8gZXhhY3RseSB0aGUKKwkJLy8gc2FtZSB0aGluZyBhcyB0aGUgZGV0ZXJtaW5pc3RpYworLy8JCSAxeDEKKwkJZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMucHV0KFRFU1RfU0NFTkFSSU8xeDFfS0VZLAorCQkJCW5ldyBTSUxhYmVsVmFsdWVbXVtdW10geworCQkJCS8vIFN0ZXAgMAorCQkJCQkJeyB7CisJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDk4Ljk5LCAwLjk5ICwgMC4wMSwKKwkJCQkJCQkJMC4wKSB9IH0sCisJCQkJCQkJCQorCQkJCQkJLy8gU3RlcCAxCisJCQkJCQl7IHsKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoOTkuMCAsIDAuOTggLCAwLjAyICwgMC4wMCkgfSB9IH0gLy8gbmV3CisJCQkJLy8gU0lMYWJlbFZhbHVlCisKKwkJCQkpOyAvLyBwdXQoVEVTVF9TQ0VOQVJJTzF4MV9LRVkpCisKKworCQkvLyAxeDIKKwkJZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMucHV0KFRFU1RfU0NFTkFSSU8xeDJfS0VZLAorCQkJCW5ldyBTSUxhYmVsVmFsdWVbXVtdW10geworCQkJCS8vIFN0ZXAgMAorCQkJCQkJeyB7CisJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCkgfSB9LAorCisJCQkJCQkvLyBTdGVwIDEKKwkJCQkJCXsgeworCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApIH0gfSwKKwkJCQkJCS8vIFN0ZXAgMgorCQkJCQkJeyB7CisJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCkgfSB9IH0gLy8gbmV3CisJCQkJLy8gU0lMYWJlbFZhbHVlCisJCQkJKTsgLy8gcHV0KFRFU1RfU0NFTkFSSU8xeDJfS0VZKQorCisJCS8vIDF4MworCQlleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcy5wdXQoVEVTVF9TQ0VOQVJJTzF4M19LRVksCisJCQkJbmV3IFNJTGFiZWxWYWx1ZVtdW11bXSB7CisJCQkJLy8gU3RlcCAwCisJCQkJCQl7IHsKKworCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzAsMl0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKQorCisJCQkJCQl9IH0sCisKKwkJCQkJCS8vIFN0ZXAgMQorCQkJCQkJeyB7CisJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMCwyXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApCisKKwkJCQkJCX0gfSwKKworCQkJCQkJLy8gU3RlcCAyCisJCQkJCQl7IHsKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsICAwKSwKKwkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgIDApLAorCQkJCQkJCQkvLyBOWzAsMl0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAgMCkKKworCQkJCQkJfSB9IH0gLy8gbmV3IFNJTGFiZWxWYWx1ZQorCisJCQkJKTsgLy8gcHV0KFRFU1RfU0NFTkFSSU8xeDNfS0VZKQorCisJCS8vIDJ4MgorCQlleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcy5wdXQoVEVTVF9TQ0VOQVJJTzJ4Ml9LRVksCisJCQkJbmV3IFNJTGFiZWxWYWx1ZVtdW11bXSB7CisJCQkJLy8gU3RlcCAwCisJCQkJCQl7IHsKKworCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApCisKKwkJCQkJCX0sIHsKKworCQkJCQkJLy8gTlsxLDBdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMSwxXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApCisKKwkJCQkJCX0gfSwKKworCQkJCQkJLy8gU3RlcCAxCisJCQkJCQl7IHsKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKQorCisJCQkJCQl9LCB7CisKKwkJCQkJCS8vIE5bMSwwXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzEsMV0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKQorCisJCQkJCQl9IH0sCisKKwkJCQkJCS8vIFN0ZXAgMgorCQkJCQkJeyB7CisJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCkKKworCQkJCQkJfSwgeworCisJCQkJCQkvLyBOWzEsMF0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsxLDFdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCkKKworCQkJCQkJfSB9IH0gLy8gbmV3IFNJTGFiZWxWYWx1ZQorCisJCQkJKTsgLy8gcHV0KFRFU1RfU0NFTkFSSU8yeDJfS0VZKQorCisJCS8vIDN4MworCQlleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcy5wdXQoVEVTVF9TQ0VOQVJJTzN4M19LRVksCisJCQkJbmV3IFNJTGFiZWxWYWx1ZVtdW11bXSB7CisJCQkJLy8gU3RlcCAwCisJCQkJCQl7IHsKKworCQkJCQkJLy8gTlswLDBdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMCwxXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzAsMl0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKQorCisJCQkJCQl9LCB7CisKKwkJCQkJCS8vIE5bMSwwXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzEsMV0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsxLDJdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCkKKworCQkJCQkJfSwgeworCisJCQkJCQkvLyBOWzIsMF0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsyLDFdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMiwyXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApCisKKwkJCQkJCX0gfSwKKworCQkJCQkJLy8gU3RlcCAxCisJCQkJCQl7IHsKKwkJCQkJCS8vIE5bMCwwXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzAsMV0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDJdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCkKKworCQkJCQkJfSwgeworCisJCQkJCQkvLyBOWzEsMF0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlsxLDFdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMSwyXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApCisKKwkJCQkJCX0sIHsKKworCQkJCQkJLy8gTlsyLDBdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMiwxXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsIDApLAorCQkJCQkJCQkvLyBOWzIsMl0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKQorCisJCQkJCQl9IH0sCisKKwkJCQkJCS8vIFN0ZXAgMgorCQkJCQkJeyB7CisJCQkJCQkvLyBOWzAsMF0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAwKSwKKwkJCQkJCQkJLy8gTlswLDFdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgMCksCisJCQkJCQkJCS8vIE5bMCwyXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsICAwKQorCisJCQkJCQl9LCB7CisKKwkJCQkJCS8vIE5bMSwwXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsICAwKSwKKwkJCQkJCQkJLy8gTlsxLDFdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgIDApLAorCQkJCQkJCQkvLyBOWzEsMl0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAgMCkKKworCQkJCQkJfSwgeworCisJCQkJCQkvLyBOWzIsMF0KKwkJCQkJCQkJbmV3IFNJTGFiZWxWYWx1ZUltcGwoMTAwLCAwLCAwLCAgMCksCisJCQkJCQkJCS8vIE5bMiwxXQorCQkJCQkJCQluZXcgU0lMYWJlbFZhbHVlSW1wbCgxMDAsIDAsIDAsICAwKSwKKwkJCQkJCQkJLy8gTlsyLDJdCisJCQkJCQkJCW5ldyBTSUxhYmVsVmFsdWVJbXBsKDEwMCwgMCwgMCwgIDApCisKKwkJCQkJCX0gfSB9IC8vIG5ldyBTSUxhYmVsVmFsdWUKKworCQkJCSk7IC8vIHB1dChURVNUX1NDRU5BUklPM3gzX0tFWSkKKworCQkvLyBGaWxsIG91dCB0aGUgbWFwIHRoYXQgc3BlY2lmaWVzIGhvdyBtYW55IGxhYmVscyBzaG91bGQgYmUgdXBkYXRlZCBieQorCQkvLyBhIGRpc2Vhc2UgbW9kZWwgZm9yIGVhY2ggdGVzdC4KKwkJZm9yIChUZXN0U3BlYyB0ZXN0U3BlYyA6IHRlc3RTcGVjaWZpY2F0aW9ucykgeworCQkJZXhwZWN0ZWROdW1iZXJPZkxhYmVsc1RvVXBkYXRlCisJCQkJCS5wdXQoCisJCQkJCQkJdGVzdFNwZWMuc2NlbmFyaW9EaXNlYXNlS2V5LAorCQkJCQkJCW5ldyBJbnRlZ2VyKAorCQkJCQkJCQkJY29tcHV0ZUV4cGVjdGVkTnVtYmVyT2ZMYWJlbHMoZXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZXMKKwkJCQkJCQkJCQkJLmdldCh0ZXN0U3BlYy5zY2VuYXJpb0Rpc2Vhc2VLZXkpKSkpOworCQl9IC8vIGZvciBlYWNoIHRlc3Qgc3BlY2lmaWNhdGlvbgorCisJfSAvLyBzdGF0aWMKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnRlc3RzLkRpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdCNnZXREaXNlYXNlTW9kZWxzVG9UZXN0KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxOb2RlRGVjb3JhdG9yPiBnZXREaXNlYXNlTW9kZWxzVG9UZXN0KCkgeworCQlmaW5hbCBMaXN0PE5vZGVEZWNvcmF0b3I+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxOb2RlRGVjb3JhdG9yPigpOworCQlyZXRWYWx1ZS5hZGQoU3RvY2hhc3RpY1NJRGlzZWFzZU1vZGVsVGVzdC5jcmVhdGVGaXh0dXJlKCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXREaXNlYXNlTW9kZWxzVG9UZXN0CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgaW50IGdldE51bWJlck9mU3RlcHMoZmluYWwgU3RyaW5nIGRpc2Vhc2VTY2VuYXJpb0tleSkgeworCQlTSUxhYmVsVmFsdWVbXVtdW10gdGVtcCA9IGV4cGVjdGVkRGlzZWFzZU1vZGVsU3RhdGVzCisJCQkJLmdldChkaXNlYXNlU2NlbmFyaW9LZXkpOworCQlyZXR1cm4gdGVtcC5sZW5ndGg7CisJfSAvLyBnZXROdW1iZXJPZlN0ZXBzCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgaW50IGdldEV4cGVjdGVkTnVtYmVyT2ZMYWJlbHNUb1VwZGF0ZSgKKwkJCWZpbmFsIFN0cmluZyBkaXNlYXNlU2NlbmFyaW9LZXkpIHsKKwkJSW50ZWdlciB0ZW1wID0gZXhwZWN0ZWROdW1iZXJPZkxhYmVsc1RvVXBkYXRlLmdldChkaXNlYXNlU2NlbmFyaW9LZXkpOworCQlyZXR1cm4gdGVtcC5pbnRWYWx1ZSgpOworCX0gLy8gZ2V0RXhwZWN0ZWROdW1iZXJPZkxhYmVsc1RvVXBkYXRlCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTGFiZWxWYWx1ZVtdW10gZ2V0RXhwZWN0ZWREaXNlYXNlTW9kZWxTdGF0ZSgKKwkJCWZpbmFsIFN0cmluZyBkaXNlYXNlU2NlbmFyaW9LZXksIGZpbmFsIGludCBzdGVwKSB7CisJCWZpbmFsIFNJTGFiZWxWYWx1ZVtdW11bXSBzaUxhYmVsVmFsdWUgPSBleHBlY3RlZERpc2Vhc2VNb2RlbFN0YXRlcworCQkJCS5nZXQoZGlzZWFzZVNjZW5hcmlvS2V5KTsKKwkJcmV0dXJuIHNpTGFiZWxWYWx1ZVtzdGVwXTsKKwl9IC8vIGdldEV4cGVjdGVkRGlzZWFzZU1vZGVsU3RhdGUKKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzZWFzZVVSSVByZWZpeCgpIHsKKwkJcmV0dXJuIERJU0VBU0VfVVJJX1BSRUZJWDsKKwl9IC8vIGdldERpc2Vhc2VVUklQcmVmaXgKK30gLy8gU3RvY2hhc3RpY1NJU2NlbmFyaW9UZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvZGlzZWFzZW1vZGVscy9BY3RpdmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy9kaXNlYXNlbW9kZWxzL0FjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODM1ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvZGlzZWFzZW1vZGVscy9BY3RpdmF0b3IuamF2YQpAQCAtMCwwICsxLDYzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVsczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCisvKioKKyAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQorICovCitwdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgUGx1Z2luIHsKKworCS8vIFRoZSBwbHVnLWluIElECisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscyI7CisKKwkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCisJcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsKKwkKKwkvKioKKwkgKiBUaGUgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgQWN0aXZhdG9yKCkgeworCQlwbHVnaW4gPSB0aGlzOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc3RhcnQoY29udGV4dCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlwbHVnaW4gPSBudWxsOworCQlzdXBlci5zdG9wKGNvbnRleHQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQorCSAqCisJICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy9kaXNlYXNlbW9kZWxzL3NjZW5hcmlvcy9Xb3JsZFNjZW5hcmlvQ3JlYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL2Rpc2Vhc2Vtb2RlbHMvc2NlbmFyaW9zL1dvcmxkU2NlbmFyaW9DcmVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0MDA4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy9kaXNlYXNlbW9kZWxzL3NjZW5hcmlvcy9Xb3JsZFNjZW5hcmlvQ3JlYXRvci5qYXZhCkBAIC0wLDAgKzEsNDM2IEBACisvLyBXb3JsZFNjZW5hcmlvQ3JlYXRvci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy5zY2VuYXJpb3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW9QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIudGVzdHMuU2VxdWVudGlhbFNlcXVlbmNlclRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5Ob2Rlc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHMuRGV0ZXJtaW5pc3RpY1NJRGlzZWFzZU1vZGVsVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudGVzdHMuU0lEaXNlYXNlTW9kZWxTY2VuYXJpb1Rlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLkNvdW50cnlHcmFwaENyZWF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLkNvdW50cnlNb2RlbENyZWF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLkNvdW50cnlEaXJlY3RvcnlVdGlsaXRpZXMuQ291bnRyeUNvZGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBjcmVhdGVzIGRpc2Vhc2UgbW9kZWwgc2NlbmFyaW9zLgorICovCitwdWJsaWMgY2xhc3MgV29ybGRTY2VuYXJpb0NyZWF0b3IgeworCisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zICJtb2RlbCIgc3ViLWRpcmVjdG9yaWVzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDRU5BUklPX0RJUiA9ICJzY2VuYXJpb3MiOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgZm9ybWF0IHN0cmluZyBmb3IgdGhlIGlkZW50aWZpZXIgb2YgYSBjb3VudHJ5IGdyYXBoIG9yIG1vZGVsCisJICogZmlsZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJRVJfRk9STUFUID0gInswfS8iICsgU0NFTkFSSU9fRElSCisJCQkrICIvezF9L3syfSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9PVVRQVVRfRElSID0gInRlbXAiOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgcGF0aCB0byB0aGUgY291bnRyeSBtb2RlbHMgZGlyZWN0b3J5CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09STERfU0NFTkFSSU9fUEFUSCA9IFJPT1RfT1VUUFVUX0RJUgorCQkJKyBGaWxlLnNlcGFyYXRvciArIFNDRU5BUklPX0RJUjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0VOQVJJTyA9ICJTY2VuYXJpbyI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRElTRUFTRV9URVNUX1BMVUdJTiA9IENvbnN0YW50cy5JRF9ST09UCisJCQkrICIuZGlzZWFzZW1vZGVscy50ZXN0cyI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBwcmVmaXggb2YgdGhlIHBsYXRmb3JtIFVSSSBmb3IgZ2VvZ3JhcGh5IGdyYXBocyBhbmQgbW9kZWxzCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTRUFTRV9URVNUX0ZJTEVfVVJJX1BSRUZJWCA9ICJwbGF0Zm9ybTovcGx1Z2luLyIKKwkJCSsgSURfRElTRUFTRV9URVNUX1BMVUdJTiArICIvZGF0YSI7CisKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciB1c2VkIGluIHdvcmxkIG1vZGVsIHJlY29yZCBpbnN0YW5jZXMuIEl0IGlzIGxpa2UgYQorCSAqIHtAbGluayBDb3VudHJ5Q29kZX0gLCBidXQgZm9yIHRoZSBlbnRpcmUgd29ybGQuCisJICovCisJLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDRU5BUklPX0lEID0gIlNDRU5BUklPIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfU0NFTkFSSU9fQ0FURUdPUlkgPSAiZm9vIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGlkIG9mIHRoZSBleHRlbnNpb24gcG9pbnQgZXh0ZW5kZWQgYnkgIndvcmxkIiBtb2RlbHMgdGhhdCBhcmUKKwkgKiBwbHVnZ2VkIGludG8gU1RFTQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1NDRU5BUklPX1dPUkxEX0NBVEVHT1JZID0gSURfU0NFTkFSSU9fQ0FURUdPUlkKKwkJCSsgIi4iICsgU0NFTkFSSU8udG9Mb3dlckNhc2UoKTsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKworCQlmaW5hbCBXb3JsZFNjZW5hcmlvQ3JlYXRvciB3c2MgPSBuZXcgV29ybGRTY2VuYXJpb0NyZWF0b3IoKTsKKworCQlmaW5hbCBMaXN0PE1vZGVsPiB3b3JsZE1vZGVscyA9IHdzYy5nZXRXb3JsZE1vZGVscygpOworCQlmaW5hbCBMaXN0PFN0YW5kYXJkRGlzZWFzZU1vZGVsPiBkaXNlYXNlTW9kZWxzID0gd3NjLmdldERpc2Vhc2VNb2RlbHMoKTsKKworCQlmaW5hbCBMaXN0PFNjZW5hcmlvUmVjb3JkPiB3b3JsZFNjZW5hcmlvUmVjb3JkcyA9IHdzYworCQkJCS5jcmVhdGVXb3JsZERpc2Vhc2VNb2RlbFNjZW5hcmlvcyh3b3JsZE1vZGVscywgZGlzZWFzZU1vZGVscyk7CisJCXRyeSB7CisJCQl3c2Muc2VyaWFsaXplU2NlbmFyaW9Nb2RlbHMod29ybGRTY2VuYXJpb1JlY29yZHMsCisJCQkJCVdPUkxEX1NDRU5BUklPX1BBVEgpOworCisJCQlmaW5hbCBGaWxlIHdvcmxkRXh0ZW5zaW9uRmlsZSA9IG5ldyBGaWxlKFdPUkxEX1NDRU5BUklPX1BBVEgKKwkJCQkJKyBDb3VudHJ5R3JhcGhDcmVhdG9yLkdSQVBIX0VYVEVOU0lPTl9QT0lOVF9GSUxFX05BTUUpOworCQkJZmluYWwgRmlsZSB3b3JsZE1vZGVsUGx1Z2luUHJvcGVydGllc0ZpbGUgPSBuZXcgRmlsZSgKKwkJCQkJV09STERfU0NFTkFSSU9fUEFUSAorCQkJCQkJCSsgQ291bnRyeUdyYXBoQ3JlYXRvci5HUkFQSF9QTFVHSU5fUFJPUEVSVElFU19QT0lOVF9GSUxFX05BTUUpOworCisJCQlmaW5hbCBCdWZmZXJlZFdyaXRlciB3b3JsZE1vZGVsT3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKAorCQkJCQluZXcgRmlsZVdyaXRlcih3b3JsZEV4dGVuc2lvbkZpbGUpKTsKKworCQkJZmluYWwgQnVmZmVyZWRXcml0ZXIgcGx1Z2luT3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKAorCQkJCQl3b3JsZE1vZGVsUGx1Z2luUHJvcGVydGllc0ZpbGUpKTsKKwkJCS8vIENyZWF0ZSBhIHNuaXBwZXQgb2YgeG1sIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIGEgcGx1Z2luLnhtbCBmaWxlCisJCQkvLyB0byBwbHVnIGludG8gU1RFTSB0aGUgc2NlbmFyaW9zIHdlIGp1c3Qgc2VyaWFsaXplZC4KKwkJCXdzYy5nZW5lcmF0ZU1vZGVsRXh0ZW5zaW9uUG9pbnRYTUwod29ybGRTY2VuYXJpb1JlY29yZHMsCisJCQkJCXdvcmxkTW9kZWxPdXQsIHBsdWdpbk91dCk7CisJCX0gLy8gdHJ5CisJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisKKwl9IC8vIG1haW4KKworCS8qKgorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSBkaXNlYXNlIG1vZGVscyBmb3Igd2hpY2ggc2NlbmFyaW9zIHdpbGwgYmUgY3JlYXRlZC4KKwkgKi8KKwlwcml2YXRlIExpc3Q8U3RhbmRhcmREaXNlYXNlTW9kZWw+IGdldERpc2Vhc2VNb2RlbHMoKSB7CisJCWZpbmFsIExpc3Q8U3RhbmRhcmREaXNlYXNlTW9kZWw+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxTdGFuZGFyZERpc2Vhc2VNb2RlbD4oKTsKKwkJcmV0VmFsdWUuYWRkKERldGVybWluaXN0aWNTSURpc2Vhc2VNb2RlbFRlc3QuY3JlYXRlRml4dHVyZSgpKTsKKwkJLy8gcmV0VmFsdWUuYWRkKERldGVybWluaXN0aWNTSVJEaXNlYXNlTW9kZWxUZXN0LmNyZWF0ZUZpeHR1cmUoKSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldERpc2Vhc2VNb2RlbHMKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG1vZGVsIG9mIHRoZSB3b3JsZCB0byB1c2UgZm9yIHRoZSBzY2VuYXJpb3MKKwkgKi8KKwlwcml2YXRlIExpc3Q8TW9kZWw+IGdldFdvcmxkTW9kZWxzKCkgeworCisJCWZpbmFsIExpc3Q8TW9kZWw+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxNb2RlbD4oKTsKKworCQkvLyBUaGlzIGNvZGUgaXMgcnVubmluZyAic3RhbmQgYWxvbmUiIChpLmUuLCBub3Qgd2l0aGluIGVjbGlwc2UpLCB0aHVzCisJCS8vIHRoZSBkZWZhdWx0IGZhY3RvcmllcyBmb3IgdGhlIGV4dGVuc2lvbnMgYXJlIG5vdCByZWdpc3RlcmVkIGFzIHRoZXkKKwkJLy8gd291bGQgZnJvbSB0aGVpciBleHRlbnNpb24gb2YKKwkJLy8gIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIi4gU28gd2UgbmVlZCB0byByZWdpc3RlciB0aGVtCisJCS8vIGhlcmUuCisKKwkJLy8gVGhpcyBjYXVzZXMgdGhlIG1vZGVsIHBhY2thZ2UgdG8gYmUgcmVnaXN0ZXJlZC4KKwkJLy8gR3JhcGhQYWNrYWdlLmVJTlNUQU5DRS5nZXROc1VSSSgpOworCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5zVVJJKCk7CisJCU5vZGVzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TnNVUkkoKTsKKworCQlmaW5hbCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKKwkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKQorCQkJCS5wdXQoIioiLCBuZXcgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKKwkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRQcm90b2NvbFRvRmFjdG9yeU1hcCgpLnB1dCgKKwkJCQkicGxhdGZvcm0iLCBuZXcgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKKworCQlmaW5hbCBTdHJpbmcgdXJpU3RyaW5nUHJlZml4ID0gIi4uL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5LyIKKwkJCQkrICJyZXNvdXJjZXMvZGF0YS9tb2RlbHMvd29ybGQvV09STEQvIjsKKworCQlmaW5hbCBTdHJpbmdbXSBtb2RlbEZpbGVOYW1lcyA9IG5ldyBTdHJpbmdbXSB7ICJXT1JMRF8wXzFfMi5tb2RlbCIsCisJCQkJIldPUkxEXzAubW9kZWwiLCAiV09STERfMS5tb2RlbCIsICJXT1JMRF8yLm1vZGVsIiB9OworCQlmb3IgKFN0cmluZyB3b3JsZE1vZGVsRmlsZU5hbWUgOiBtb2RlbEZpbGVOYW1lcykgeworCQkJZmluYWwgVVJJIHdvcmxkTW9kZWxVUkkgPSBVUkkuY3JlYXRlRmlsZVVSSSh1cmlTdHJpbmdQcmVmaXgKKwkJCQkJKyB3b3JsZE1vZGVsRmlsZU5hbWUpOworCisJCQlmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKHJlc291cmNlU2V0CisJCQkJCS5nZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUod29ybGRNb2RlbFVSSSksIHRydWUpOworCisJCQl0cnkgeworCQkJCXJlc291cmNlLmxvYWQobnVsbCk7CisJCQkJcmV0VmFsdWUuYWRkKChNb2RlbCkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCkpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7CisJCQl9IC8vIGNhdGNoCisJCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKG5wZS5nZXRNZXNzYWdlKCkpOworCQkJfSAvLyBudWxsIHBvaW50ZXIgZXhjZXB0aW9uCisJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOworCQkJfQorCQl9IC8vIGZvciBlYWNoIG1vZGVsIGZpbGVuYW1lCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldFdvcmxkTW9kZWwKKworCS8qKgorCSAqIEByZXR1cm4gYSBsaXN0IG9mIFNjZW5hcmlvIFJlY29yZHMgZm9yIGRpc2Vhc2UgbW9kZWxzIG9uIGEgd29ybGQgbW9kZWwKKwkgKi8KKwlwcml2YXRlIExpc3Q8U2NlbmFyaW9SZWNvcmQ+IGNyZWF0ZVdvcmxkRGlzZWFzZU1vZGVsU2NlbmFyaW9zKAorCQkJTGlzdDxNb2RlbD4gd29ybGRNb2RlbHMsIExpc3Q8U3RhbmRhcmREaXNlYXNlTW9kZWw+IGRpc2Vhc2VNb2RlbHMpIHsKKwkJZmluYWwgTGlzdDxTY2VuYXJpb1JlY29yZD4gcmV0VmFsdWUgPSBuZXcgQXJyYXlMaXN0PFNjZW5hcmlvUmVjb3JkPigpOworCisJCWludCBzY2VuYXJpb0NvdW50ZXIgPSAwOworCisJCWZvciAoTW9kZWwgbW9kZWwgOiB3b3JsZE1vZGVscykgeworCQkJZm9yIChTdGFuZGFyZERpc2Vhc2VNb2RlbCBkaXNlYXNlTW9kZWwgOiBkaXNlYXNlTW9kZWxzKSB7CisKKwkJCQlmaW5hbCBTY2VuYXJpbyBzY2VuYXJpbyA9IFNjZW5hcmlvRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCS5jcmVhdGVTY2VuYXJpbygpOworCQkJCWZpbmFsIER1YmxpbkNvcmUgZGMgPSBzY2VuYXJpby5nZXREdWJsaW5Db3JlKCk7CisJCQkJZGMucG9wdWxhdGUoKTsKKwkJCQlkYy5zZXRUaXRsZSgiU2NlbmFyaW86ICIgKyBtb2RlbC5nZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKQorCQkJCQkJKyBkaXNlYXNlTW9kZWwuZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCkpOworCQkJCWRjLnNldEZvcm1hdChTY2VuYXJpb1BhY2thZ2UuZU5TX1VSSSk7CisKKwkJCQkvLyBBZGQgdGhlIGRpc2Vhc2UgbW9kZWwgdG8gdGhlIG1vZGVsCisJCQkJZmluYWwgTW9kZWwgdGVtcCA9IChNb2RlbClFY29yZVV0aWwuY29weShtb2RlbCk7CisJCQkJdGVtcC5nZXROb2RlRGVjb3JhdG9ycygpLmFkZCgoTm9kZURlY29yYXRvcikKKwkJCQkJCUVjb3JlVXRpbC5jb3B5KGRpc2Vhc2VNb2RlbCkpOworCisJCQkJc2NlbmFyaW8uc2V0TW9kZWwodGVtcCk7CisKKwkJCQkvLyBBZGQgdGhlIHNlcXVlbmNlciB0byB0aGUgc2NlbmFyaW8KKwkJCQlzY2VuYXJpby5zZXRTZXF1ZW5jZXIoU2VxdWVudGlhbFNlcXVlbmNlclRlc3QuY3JlYXRlRml4dHVyZSgpKTsKKworCQkJCS8vIEFkZCBpbmZlY3RvcihzKSBmb3IgZWFjaCBkaXNlYXNlIG1vZGVsIHRvIHRoZSBzY2VuYXJpbworCQkJCUNvbGxlY3Rpb248RGVjb3JhdG9yPiBpbmZlY3RvcnMgPSBTSURpc2Vhc2VNb2RlbFNjZW5hcmlvVGVzdAorCQkJCQkJLmNyZWF0ZUluZmVjdG9ycyh0ZW1wKTsKKwkJCQlmaW5hbCBOb2RlIG5vZGVUb0luZmVjdCA9IHBpY2tOb2RlVG9JbmZlY3Qoc2NlbmFyaW8uZ2V0TW9kZWwoKSk7CisJCQkJZm9yIChEZWNvcmF0b3IgZGVjb3JhdG9yIDogaW5mZWN0b3JzKSB7CisJCQkJCWZpbmFsIEluZmVjdG9yIGluZmVjdG9yID0gKEluZmVjdG9yKSBkZWNvcmF0b3I7CisJCQkJCS8vIERpZCB3ZSBmaW5kIGEgbm9kZT8KKwkJCQkJaWYgKG5vZGVUb0luZmVjdCAhPSBudWxsKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCWluZmVjdG9yLnNldFRhcmdldFVSSShub2RlVG9JbmZlY3QuZ2V0VVJJKCkpOworCQkJCQl9CisKKwkJCQl9CisJCQkJc2NlbmFyaW8uZ2V0U2NlbmFyaW9EZWNvcmF0b3JzKCkuYWRkQWxsKGluZmVjdG9ycyk7CisKKwkJCQlmaW5hbCBTY2VuYXJpb1JlY29yZCBzY2VuYXJpb1JlY29yZCA9IG5ldyBTY2VuYXJpb1JlY29yZCgKKwkJCQkJCXNjZW5hcmlvLCAiV09STEQiLCBzY2VuYXJpb0NvdW50ZXIrKyk7CisKKwkJCQlmaW5hbCBTdHJpbmcgdXJpU3RyaW5nID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQlJREVOVElGSUVSX0ZPUk1BVCwgRElTRUFTRV9URVNUX0ZJTEVfVVJJX1BSRUZJWCwKKwkJCQkJCSJXT1JMRCIsIHNjZW5hcmlvUmVjb3JkLmdldFNlcmlhbGl6YXRpb25GaWxlTmFtZSgpKTsKKwkJCQlkYy5zZXRJZGVudGlmaWVyKHVyaVN0cmluZyk7CisJCQkJc2NlbmFyaW8uc2V0VVJJKFVSSS5jcmVhdGVVUkkodXJpU3RyaW5nKSk7CisKKwkJCQlyZXRWYWx1ZS5hZGQoc2NlbmFyaW9SZWNvcmQpOworCQkJfSAvLyBmb3IgZWFjaCBkaXNlYXNlIG1vZGVsCisJCX0gLy8gZm9yIGVhY2ggbW9kZWwKKworCQkvLyBmb3IgKGludCBhZG1pbkxldmVsID0gMDsgYWRtaW5MZXZlbCA8IG1vZGVsc0J5QWRtaW5MZXZlbC5zaXplKCk7CisJCS8vIGFkbWluTGV2ZWwrKykgeworCQkvLworCQkvLyBmaW5hbCBNb2RlbCB3b3JsZE1vZGVsID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNb2RlbCgpOworCQkvLyBmaW5hbCBEdWJsaW5Db3JlIGRjID0gd29ybGRNb2RlbC5nZXREdWJsaW5Db3JlKCk7CisJCS8vIGRjLnBvcHVsYXRlKCk7CisJCS8vIGRjLnNldFRpdGxlKCJXb3JsZCBNb2RlbCAoTGV2ZWwgIiArIGFkbWluTGV2ZWwgKyAiLCAiCisJCS8vICsgbW9kZWxzQnlBZG1pbkxldmVsLmdldChhZG1pbkxldmVsKS5zaXplKCkgKyAiIG1vZGVscykiKTsKKwkJLy8KKwkJLy8gZm9yIChDb3VudHJ5TW9kZWxSZWNvcmQgbW9kZWxSZWNvcmQgOiBtb2RlbHNCeUFkbWluTGV2ZWwKKwkJLy8gLmdldChhZG1pbkxldmVsKSkgeworCQkvLyB3b3JsZE1vZGVsLmdldE1vZGVscygpLmFkZChtb2RlbFJlY29yZC5nZXRNb2RlbCgpKTsKKwkJLy8gfSAvLyBmb3JlYWNoIE1vZGVsUmVjb3JkIGF0IGFkbWluTGV2ZWwKKwkJLy8KKwkJLy8gZmluYWwgV29ybGRNb2RlbFJlY29yZCB3b3JsZE1vZGVsUmVjb3JkID0gbmV3IFdvcmxkTW9kZWxSZWNvcmQoCisJCS8vIHdvcmxkTW9kZWwsIFdPUkxEX0lELCBhZG1pbkxldmVsKTsKKwkJLy8gd29ybGRNb2RlbC5zZXRVUkkoVVJJLmNyZWF0ZVVSSShNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJLy8gSURFTlRJRklFUl9GT1JNQVQsCisJCS8vIENvdW50cnlHcmFwaENyZWF0b3IuR0VPR1JBUEhZX0ZJTEVfVVJJX1BSRUZJWCwgV09STERfSUQsCisJCS8vIHdvcmxkTW9kZWxSZWNvcmQuZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lKCkpKSk7CisJCS8vCisJCS8vIHJldFZhbHVlLmFkZCh3b3JsZE1vZGVsUmVjb3JkKTsKKwkJLy8gfSAvLyBmb3IgYWRtaW5MZXZlbAorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZVdvcmxkRGlzZWFzZU1vZGVsU2NlbmFyaW9zCisKKwkvKioKKwkgKiBTZWxlY3QgYSBOb2RlIGZyb20gdGhlIG1vZGVsIHRvIGluZmVjdAorCSAqIAorCSAqIEBwYXJhbSBtb2RlbAorCSAqIEByZXR1cm4gYSBOb2RlCisJICovCisJcHJpdmF0ZSBOb2RlIHBpY2tOb2RlVG9JbmZlY3QoTW9kZWwgbW9kZWwpIHsKKwkJLy8gUGljayB0aGUgZmlyc3Qgbm9kZSB3aXRoIHBvcHVsYXRpb24gbWVtYmVycyB3ZSBmaW5kCisJCU5vZGUgcmV0VmFsdWUgPSBudWxsOworCisJCS8vIExvb2sgaW4gdGhlIGdyYXBocworCQlmb3IgKEl0ZXJhdG9yIGdyYXBoSXRlciA9IG1vZGVsLmdldEdyYXBocygpLml0ZXJhdG9yKCk7IGdyYXBoSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlHcmFwaCBncmFwaCA9IChHcmFwaCkgZ3JhcGhJdGVyLm5leHQoKTsKKwkJCS8vIEFueSBub2RlcyBpbiB0aGlzIGdyYXBoPworCQkJZm9yIChJdGVyYXRvciBub2RlSXRlciA9IGdyYXBoLmdldE5vZGVzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgbm9kZUl0ZXIKKwkJCQkJLmhhc05leHQoKTspIHsKKwkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbm9kZUl0ZXIubmV4dCgpOworCQkJCS8vIGdvdCBvbmUKKwkJCQlyZXR1cm4gbm9kZTsKKwkJCX0KKwkJfQorCQkvLyBpZiB3ZSBnZXQgaGVyZSB3ZSBkaWRuJ3QgZmluZCBvbmUgaW4gdGhlIGdyYXBocworCQlmb3IgKEl0ZXJhdG9yIG1vZGVsSXRlciA9IG1vZGVsLmdldE1vZGVscygpLml0ZXJhdG9yKCk7IHJldFZhbHVlID09IG51bGwKKwkJCQkmJiBtb2RlbEl0ZXIuaGFzTmV4dCgpOykgeworCQkJTW9kZWwgc3VibW9kZWwgPSAoTW9kZWwpIG1vZGVsSXRlci5uZXh0KCk7CisJCQlyZXRWYWx1ZSA9IHBpY2tOb2RlVG9JbmZlY3Qoc3VibW9kZWwpOworCQl9CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gcGlja05vZGVUb0luZmVjdAorCisJLyoqCisJICogQHBhcmFtIHdvcmxkU2NlbmFyaW9SZWNvcmRzCisJICogQHBhcmFtIHdvcmxkU2NlbmFyaW9PdXQKKwkgKiBAcGFyYW0gcGx1Z2luT3V0CisJICovCisJcHJpdmF0ZSB2b2lkIGdlbmVyYXRlTW9kZWxFeHRlbnNpb25Qb2ludFhNTCgKKwkJCUxpc3Q8U2NlbmFyaW9SZWNvcmQ+IHdvcmxkU2NlbmFyaW9SZWNvcmRzLAorCQkJQnVmZmVyZWRXcml0ZXIgd29ybGRTY2VuYXJpb091dCwgQnVmZmVyZWRXcml0ZXIgcGx1Z2luT3V0KSB7CisKKwkJLy8gVGhlIGR1YmxpbiBjb3JlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWxzIGxpa2VseSBzaGFyZSBjb21tb24KKwkJLy8gYXR0cmlidXRlcywgd2UgY2FuIGF2b2lkIGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSBmaWxlcyB3ZQorCQkvLyBnZW5lcmF0ZSBieSBmaW5kaW5nIHRoZSBkdXBsaWNhdGUgZW50cmllcyBhbmQgb25seSBnZW5lcmF0aW5nIGEKKwkJLy8gc2luZ2xlIGtleSBmb3IgdGhlIGdlbmVyYXRlZCBwbHVnaW5zIGZpbGUgY29udGVudC4KKwkJZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBkY1ZhbHVlS2V5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKwkJdHJ5IHsKKwkJCXdvcmxkU2NlbmFyaW9PdXQKKwkJCQkJLndyaXRlKCI8IS0tIEdlbmVyYXRlZCBjb250ZW50LiAgRG8gbm90IG1vZGlmeSAtLT5cbiIpOworCisJCQl3b3JsZFNjZW5hcmlvT3V0LndyaXRlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQlDb3VudHJ5R3JhcGhDcmVhdG9yLlhNTF9FWFRFTlNJT05fUE9JTlRfT1BFTiwKKwkJCQkJbmV3IE9iamVjdFtdIHsgQ29uc3RhbnRzLklEX1NDRU5BUklPX0VYVEVOU0lPTl9QT0lOVCB9KSk7CisJCQl3b3JsZFNjZW5hcmlvT3V0LndyaXRlKCJcbiIpOworCisJCQlwbHVnaW5PdXQKKwkJCQkJLndyaXRlKCIjTW9kZWwgTkxTIEtleXMuICBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCwgZG8gbm90IG1vZGlmeS4gIgorCQkJCQkJCSsgQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkKKwkJCQkJCQkrICIgIgorCQkJCQkJCSsgU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLm5hbWUiKSArICJcbiIpOworCisJCQkvLyBXb3JsZCBNb2RlbAorCQkJQ291bnRyeUdyYXBoQ3JlYXRvci5vdXRwdXRDYXRlZ29yeShJRF9TQ0VOQVJJT19XT1JMRF9DQVRFR09SWSwKKwkJCQkJU0NFTkFSSU8sIENvdW50cnlNb2RlbENyZWF0b3IuSURfTU9ERUxfUE9MSVRJQ0FMX0NBVEVHT1JZLAorCQkJCQlDb3VudHJ5TW9kZWxDcmVhdG9yLk5MU19DQVRFR09SWV9LRVlfRk9STUFULAorCQkJCQl3b3JsZFNjZW5hcmlvT3V0LCBwbHVnaW5PdXQpOworCisJCQlmb3IgKFNjZW5hcmlvUmVjb3JkIHdvcmxkTW9kZWxSZWNvcmQgOiB3b3JsZFNjZW5hcmlvUmVjb3JkcykgeworCQkJCUNvdW50cnlHcmFwaENyZWF0b3Iub3V0cHV0RHVibGluQ29yZSh3b3JsZE1vZGVsUmVjb3JkLAorCQkJCQkJSURfU0NFTkFSSU9fV09STERfQ0FURUdPUlksIGRjVmFsdWVLZXlNYXAsCisJCQkJCQl3b3JsZFNjZW5hcmlvT3V0LCBwbHVnaW5PdXQpOworCQkJfSAvLyBmb3IgZWFjaCB3b3JsZCBtb2RlbCByZWNvcmQKKworCQkJd29ybGRTY2VuYXJpb091dAorCQkJCQkud3JpdGUoQ291bnRyeUdyYXBoQ3JlYXRvci5YTUxfRVhURU5TSU9OX1BPSU5UX0NMT1NFKTsKKwkJCXdvcmxkU2NlbmFyaW9PdXQuY2xvc2UoKTsKKwkJCXBsdWdpbk91dC5jbG9zZSgpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisKKwl9IC8vIGdlbmVyYXRlTW9kZWxFeHRlbnNpb25Qb2ludFhNTAorCisJLyoqCisJICogQHBhcmFtIHdvcmxkTW9kZWxzCisJICogQHBhcmFtIHVyaVBhdGhTdHJpbmcKKwkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIHRoZSByb290IG9mIHRoZSBmb2xkZXIgdG8gc2VyaWFsaXplIHRoZSBtb2RlbHMgdG8KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZVNjZW5hcmlvTW9kZWxzKAorCQkJZmluYWwgTGlzdDxTY2VuYXJpb1JlY29yZD4gd29ybGRTY2VuYXJpb3MsCisJCQlmaW5hbCBTdHJpbmcgdXJpUGF0aFN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJZm9yIChTY2VuYXJpb1JlY29yZCBzY2VuYXJpb1JlY29yZCA6IHdvcmxkU2NlbmFyaW9zKSB7CisJCQlzY2VuYXJpb1JlY29yZC5zZXJpYWxpemUodXJpUGF0aFN0cmluZyk7CisJCX0gLy8gZm9yIGVhY2ggbW9kZWwgcmVjb3JkCisJfSAvLyBzZXJpYWxpemVXb3JsZE1vZGVscworCisJLyoqCisJICogVGhpcyBjbGFzcyBjb250YWlucyBhIHdvcmxkIHNjZW5hcmlvIGFuZCBpdHMgbWV0YWRhdGEuCisJICovCisJcHVibGljIGNsYXNzIFNjZW5hcmlvUmVjb3JkIGV4dGVuZHMgQ291bnRyeUdyYXBoQ3JlYXRvci5SZWNvcmQgeworCisJCS8qKgorCQkgKiBDb25zdHJ1Y3RvcgorCQkgKi8KKwkJcHVibGljIFNjZW5hcmlvUmVjb3JkKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCisJCS8qKgorCQkgKiBAcGFyYW0gaWRlbnRpZmlhYmxlCisJCSAqIEBwYXJhbSBpZAorCQkgKiBAcGFyYW0gYWRtaW5MZXZlbAorCQkgKi8KKwkJcHVibGljIFNjZW5hcmlvUmVjb3JkKElkZW50aWZpYWJsZSBpZGVudGlmaWFibGUsIFN0cmluZyBpZCwKKwkJCQlpbnQgYWRtaW5MZXZlbCkgeworCQkJc3VwZXIoaWRlbnRpZmlhYmxlLCBpZCwgYWRtaW5MZXZlbCk7CisJCX0KKworCQkvKioKKwkJICogQHBhcmFtIGlkZW50aWZpYWJsZQorCQkgKiBAcGFyYW0gaWQKKwkJICogQHBhcmFtIGFkbWluTGV2ZWxzCisJCSAqLworCQlwdWJsaWMgU2NlbmFyaW9SZWNvcmQoSWRlbnRpZmlhYmxlIGlkZW50aWZpYWJsZSwgU3RyaW5nIGlkLAorCQkJCUxpc3Q8SW50ZWdlcj4gYWRtaW5MZXZlbHMpIHsKKwkJCXN1cGVyKGlkZW50aWZpYWJsZSwgaWQsIGFkbWluTGV2ZWxzKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuZ3JhcGguQ291bnRyeUdyYXBoQ3JlYXRvci5SZWNvcmQjZ2V0T3V0cHV0VHlwZSgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRPdXRwdXRUeXBlKCkgeworCQkJcmV0dXJuICJzY2VuYXJpbyI7CisJCX0gLy8gZ2V0T3V0cHV0VHlwZQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuZ3JhcGguQ291bnRyeUdyYXBoQ3JlYXRvci5SZWNvcmQjZ2V0VHlwZSgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQkJcmV0dXJuICJzY2VuYXJpbyI7CisJCX0gLy8gZ2V0VHlwZQorCisJfSAvLyBTY2VuYXJpb1JlY29yZAorCit9IC8vIFdvcmxkU2NlbmFyaW9DcmVhdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci90ZXN0cy9EaXNlYXNlTW9kZWxMYWJlbFJlbGF0aXZlVmFsdWVQcm92aWRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL3Rlc3RzL0Rpc2Vhc2VNb2RlbExhYmVsUmVsYXRpdmVWYWx1ZVByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYWE4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcm92aWRlci90ZXN0cy9EaXNlYXNlTW9kZWxMYWJlbFJlbGF0aXZlVmFsdWVQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDU4IEBACisvLyBEaXNlYXNlTW9kZWxMYWJlbFJlbGF0aXZlVmFsdWVQcm92aWRlclRlc3QuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdGFuZGFyZFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LkRpc2Vhc2VNb2RlbExhYmVsUmVsYXRpdmVWYWx1ZVByb3ZpZGVyOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBKVW5pdCB0ZXN0IGZvcgorICoge0BsaW5rIERpc2Vhc2VNb2RlbExhYmVsUmVsYXRpdmVWYWx1ZVByb3ZpZGVyfQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBEaXNlYXNlTW9kZWxMYWJlbFJlbGF0aXZlVmFsdWVQcm92aWRlclRlc3QgZXh0ZW5kcworCQlSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyVGVzdCB7CisKKwkvKioKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gYSA8Y29kZT5SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyPC9jb2RlPiBmb3IgdGVzdGluZworCSAqLworCXB1YmxpYyBzdGF0aWMgRGlzZWFzZU1vZGVsTGFiZWxSZWxhdGl2ZVZhbHVlUHJvdmlkZXIgY3JlYXRlRml4dHVyZSgpIHsKKwkJcmV0dXJuIG5ldyBEaXNlYXNlTW9kZWxMYWJlbFJlbGF0aXZlVmFsdWVQcm92aWRlcigpOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdGFuZGFyZFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LkRpc2Vhc2VNb2RlbExhYmVsUmVsYXRpdmVWYWx1ZVByb3ZpZGVyI2dldFByb3BlcnRpZXMoKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldFByb3BlcnRpZXMoKSB7CisJCS8vIGZvciBzb21lb25lIHRvIGRvCisJCWFzc2VydFRydWUodHJ1ZSk7CisJfQorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdGFuZGFyZFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LkRpc2Vhc2VNb2RlbExhYmVsUmVsYXRpdmVWYWx1ZVByb3ZpZGVyI2dldFJlbGF0aXZlVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWxhdGl2ZVZhbHVlRVN0cnVjdHVyYWxGZWF0dXJlKCkgeworCQkvLyBmb3Igc29tZW9uZSB0byBkbworCQlhc3NlcnRUcnVlKHRydWUpOworCX0gLy8gdGVzdEdldFJlbGF0aXZlVmFsdWVFU3RydWN0dXJhbEZlYXR1cmUKKworfSAvLyBEaXNlYXNlTW9kZWxMYWJlbFJlbGF0aXZlVmFsdWVQcm92aWRlclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL3Rlc3RzL1N0YW5kYXJkUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvdGVzdHMvU3RhbmRhcmRSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2YTdiYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL3Rlc3RzL1N0YW5kYXJkUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvLyBTdGFuZGFyZFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLmhpc3RvcnkuUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeS5SZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdGFuZGFyZEhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdGFuZGFyZFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgSlVuaXQgdGVzdCBjYXNlIGZvcgorICoge0BsaW5rIFN0YW5kYXJkUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5fS4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0CisJCWV4dGVuZHMKKwkJb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLmhpc3RvcnkuUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdCB7CisKKwlzdGF0aWMgeworCQkvLyBBZGQgdG8gUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJbmV3IFN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKKworCQkvLyBBZGQgdG8gSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJbmV3IFN0YW5kYXJkSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKKwl9IC8vIHN0YXRpYworCisJcHJpdmF0ZSBTdGFuZGFyZFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFN0YW5kYXJkUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5KSBmaXh0dXJlOworCX0gLy8gU3BhdGlhbFByb3ZpZGVyQWRhcHRlckZhY3RvcnkKKworCS8qKgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKGNyZWF0ZUZpeHR1cmUoKSk7CisJfQorCisJLyoqCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogQHJldHVybiBhIGZhY3RvcnkgaW5zdGFuY2UgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisJICovCisJcHJvdGVjdGVkIFN0YW5kYXJkUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUZpeHR1cmUoKSB7CisJCXJldHVybiBuZXcgU3RhbmRhcmRSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKKwl9IC8vIGNyZWF0ZUZpeHR1cmUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLnRlc3RzLlN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0I3Rlc3RQcm9wZXJBZGFwdGVyRmFjdG9yeUNvbXBvc2l0aW9uKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVyQWRhcHRlckZhY3RvcnlDb21wb3NpdGlvbigpIHsKKwkJZmluYWwgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5IHJ2cGFmID0gUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFOworCQkvLyBNYWtlIHRoZSBsYWJlbCB2YWx1ZSB0byBiZSBhZGFwdGVkCisJCWZpbmFsIERpc2Vhc2VNb2RlbExhYmVsIGRtbCA9IGdldERpc2Vhc2VNb2RlbExhYmVsVG9UZXN0KCk7CisKKwkJZmluYWwgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlciByZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyID0gKFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIpIHJ2cGFmCisJCQkJLmFkYXB0KGRtbCwgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlci5jbGFzcyk7CisKKwkJYXNzZXJ0Tm90TnVsbChyZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyKTsKKwkJYXNzZXJ0VHJ1ZShyZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyIGluc3RhbmNlb2YgU3RhbmRhcmRSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuRGlzZWFzZU1vZGVsTGFiZWxSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbCNpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpfS4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0ZXN0SXNGYWN0b3J5Rm9yVHlwZU9iamVjdCgpIHsKKwkJZmluYWwgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoZml4dHVyZS5pc0ZhY3RvcnlGb3JUeXBlKFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIuY2xhc3MpKTsKKwl9IC8vIHRlc3RJc0ZhY3RvcnlGb3JUeXBlT2JqZWN0CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVsYXRpdmVWYWx1ZUJ5VGltZSgpIHsKKwkJLy8gVE9ETyBpbXBsZW1lbnQgdGVzdEdldFJlbGF0aXZlVmFsdWVCeVRpbWUKKwkJZmluYWwgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlciByVkhQID0gZ2V0QWRhcHRlclRvVGVzdCgpOworCQlhc3NlcnROb3ROdWxsKHJWSFApOworCQlmaW5hbCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5ID0gKEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIHJWSFAKKwkJCQkuZ2V0UHJvcGVydGllcygpLmdldCgwKTsKKwkJZmluYWwgZG91YmxlIHJ2VGltZTEgPSByVkhQLmdldFJlbGF0aXZlVmFsdWUocHJvcGVydHksIHJWSFAKKwkJCQkuZ2V0RWFybGllc3RUaW1lVmFsdWUoKSk7CisJCWFzc2VydFRydWUodmFsdWVXaXRoaW5SYW5nZShydlRpbWUxKSk7CisKKwl9IC8vIHRlc3RHZXRSZWxhdGl2ZVZhbHVlQnlUaW1lCisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsSGlzdG9yaWNSZWxhdGl2ZVZhbHVlcygpIHsKKwkJZmluYWwgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlciByVkhQID0gZ2V0QWRhcHRlclRvVGVzdCgpOworCQlhc3NlcnROb3ROdWxsKHJWSFApOworCQlmaW5hbCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5ID0gKEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIHJWSFAKKwkJCQkuZ2V0UHJvcGVydGllcygpLmdldCgwKTsKKwkJZmluYWwgZG91YmxlW10gYWxsUmVsYXRpdmVWYWx1ZXMgPSByVkhQCisJCQkJLmdldEFsbEhpc3RvcmljUmVsYXRpdmVWYWx1ZXMocHJvcGVydHkpOworLy8JCWFzc2VydFRydWUoYWxsUmVsYXRpdmVWYWx1ZXMubGVuZ3RoID4gMCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsUmVsYXRpdmVWYWx1ZXMubGVuZ3RoOyBpKyspIHsKKwkJCWFzc2VydFRydWUodmFsdWVXaXRoaW5SYW5nZShhbGxSZWxhdGl2ZVZhbHVlc1tpXSkpOworCQl9IC8vIGZvcgorCX0gLy8gdGVzdEdldEFsbEhpc3RvcmljUmVsYXRpdmVWYWx1ZXMKKworCXB1YmxpYyB2b2lkIHRlc3RHZXRFYXJsaWVzdFRpbWVWYWx1ZSgpIHsKKwkJLy8gVE9ETyBpbXBsZW1lbnQgdGVzdEdldEVhcmxpZXN0VGltZVZhbHVlCisJCWZpbmFsIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIgclZIUCA9IGdldEFkYXB0ZXJUb1Rlc3QoKTsKKwkJYXNzZXJ0Tm90TnVsbChyVkhQKTsKKwkJZmluYWwgU1RFTVRpbWUgZWFybGllc3RUaW1lID0gclZIUC5nZXRFYXJsaWVzdFRpbWVWYWx1ZSgpOworCQlhc3NlcnRUcnVlKGVhcmxpZXN0VGltZSAhPSBudWxsKTsKKwl9IC8vIHRlc3RHZXRFYXJsaWVzdFRpbWVWYWx1ZQorCisJLyoqCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlciBnZXRBZGFwdGVyVG9UZXN0KCkgeworCQlmaW5hbCBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgRGlzZWFzZU1vZGVsTGFiZWwgZG1sID0gZ2V0RGlzZWFzZU1vZGVsTGFiZWxUb1Rlc3QoKTsKKworCQlmaW5hbCBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyIHJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIgPSAoUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlcikgZml4dHVyZQorCQkJCS5hZGFwdChkbWwsIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIuY2xhc3MpOworCQlyZXR1cm4gcmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBEaXNlYXNlTW9kZWxMYWJlbCBnZXREaXNlYXNlTW9kZWxMYWJlbFRvVGVzdCgpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0CisJCQkJLmNyZWF0ZVNFSVJMYWJlbCgpOworCX0gLy8gZ2V0RGlzZWFzZU1vZGVsTGFiZWxUb1Rlc3QKKworCS8qKgorCSAqIEBwYXJhbSByZWxhdGl2ZVZhbHVlCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWUgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMCwKKwkgKiAgICAgICAgIGluY2x1c2l2ZS4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gdmFsdWVXaXRoaW5SYW5nZShkb3VibGUgcmVsYXRpdmVWYWx1ZSkgeworCQlyZXR1cm4gcmVsYXRpdmVWYWx1ZSA+PSAwLjAgJiYgcmVsYXRpdmVWYWx1ZSA8PSAxLjA7CisJfQorCit9IC8vIFN0YW5kYXJkUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJvdmlkZXIvdGVzdHMvU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL3Rlc3RzL1N0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI5MTI2YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3Byb3ZpZGVyL3Rlc3RzL1N0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSw0MTIgQEAKKy8vIFN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5VGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0VJUkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVJMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0IHRlc3QgY2FzZSBmb3IKKyAqIHtAbGluayBTdGFuZGFyZFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5fS4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QgZXh0ZW5kcworCQlSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QgeworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIGluIGEgZGlzZWFzZSBtb2RlbCBsYWJlbCB2YWx1ZSAoQmlydGhzLCBEZWF0aHMsCisJICogRGVhdGhzIGZyb20gRGlzZWFzZSBhcmUgcmVsYXRpdmUgdG8gdG90YWwgcG9wdWxhdGlvbikKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1fRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9QUk9QRVJUSUVTID0gMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBpbiBhIFNJIGRpc2Vhc2UgbW9kZWwgbGFiZWwgdmFsdWUgKFMsIEksIElSLCBJRiwgaW5jaWRlbmNlICsKKwkgKiBETUxWUCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1fU0lfRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9QUk9QRVJUSUVTID0gNSArIE5VTV9ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX1BST1BFUlRJRVM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHByb3BlcnRpZXMgaW4gYSBTSVIgZGlzZWFzZSBtb2RlbCBsYWJlbCB2YWx1ZSAoUywgSSwgSVIsIElGLCBpbmNpZGVuY2UgKworCSAqIFIgKyBETUxWUCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1fU0lSX0RJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfUFJPUEVSVElFUyA9IE5VTV9TSV9ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX1BST1BFUlRJRVMgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIGluIGEgU0VJUiBkaXNlYXNlIG1vZGVsIGxhYmVsIHZhbHVlIChTLCBFLCBJLCBJUiwKKwkgKiBJRiwgaW5jaWRlbmNlICsgUiArIERNTFZQKQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTV9TRUlSX0RJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfUFJPUEVSVElFUyA9IE5VTV9TSVJfRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9QUk9QRVJUSUVTICsgMTsKKworCS8qKgorCSAqIFRoZSBpbml0aWFsIG51bWJlciBvZiBiaXJ0aHMgZm9yIGRpc2Vhc2UgbW9kZWwgbGFiZWwgdmFsdWVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIE5VTV9ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX0JJUlRIUyA9IDEwMDsKKworCS8qKgorCSAqIFRoZSBpbml0aWFsIG51bWJlciBvZiAodG90YWwpIGRlYXRocyBmb3IgZGlzZWFzZSBtb2RlbCBsYWJlbCB2YWx1ZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgTlVNX0RJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfREVBVEhTID0gMTA7CisKKwkvKioKKwkgKiBUaGUgaW5pdGlhbCBudW1iZXIgb2YgZGVhdGhzIGZyb20gZGlzZWFzZSBmb3IgZGlzZWFzZSBtb2RlbCBsYWJlbCB2YWx1ZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgTlVNX0RJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfRElTRUFTRV9ERUFUSFMgPSAxOworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgTlVNX1NfUE9QVUxBVElPTiA9IDY0OworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgTlVNX0VfUE9QVUxBVElPTiA9IDMyOworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgTlVNX0lfUE9QVUxBVElPTiA9IDE2OworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgTlVNX1JfUE9QVUxBVElPTiA9IDg7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBUT1RBTF9TSV9QT1BVTEFUSU9OID0gTlVNX1NfUE9QVUxBVElPTgorCQkJKyBOVU1fSV9QT1BVTEFUSU9OOworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgVE9UQUxfU0lSX1BPUFVMQVRJT04gPSBUT1RBTF9TSV9QT1BVTEFUSU9OCisJCQkrIE5VTV9SX1BPUFVMQVRJT047CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBUT1RBTF9TRUlSX1BPUFVMQVRJT04gPSBUT1RBTF9TSVJfUE9QVUxBVElPTgorCQkJKyBOVU1fRV9QT1BVTEFUSU9OOworCisJcHJpdmF0ZSBTdGFuZGFyZFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSkgZml4dHVyZTsKKwl9IC8vIFNwYXRpYWxQcm92aWRlckFkYXB0ZXJGYWN0b3J5CisKKwkvKioKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCX0KKworCS8qKgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gYSBmYWN0b3J5IGluc3RhbmNlIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorCSAqLworCXByb3RlY3RlZCBTdGFuZGFyZFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUZpeHR1cmUoKSB7CisJCXJldHVybiBuZXcgU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJLyoqCisJICogQHBhcmFtIGxhYmVsCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGluaXRpYWxpemVEaXNlYXNlTW9kZWxMYWJlbCgKKwkJCWZpbmFsIFN0YW5kYXJkRGlzZWFzZU1vZGVsTGFiZWwgbGFiZWwpIHsKKwkJaW5pdGlhbGl6ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWVzKChEaXNlYXNlTW9kZWxMYWJlbFZhbHVlKWxhYmVsCisJCQkJLmdldEN1cnJlbnRWYWx1ZSgpKTsKKwkJaW5pdGlhbGl6ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWVzKChEaXNlYXNlTW9kZWxMYWJlbFZhbHVlKWxhYmVsCisJCQkJLmdldE5leHRWYWx1ZSgpKTsKKwl9IC8vIGluaXRpYWxpemVEaXNlYXNlTW9kZWxMYWJlbAorCisJLyoqCisJICogQHBhcmFtIGxhYmVsVmFsdWUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgaW5pdGlhbGl6ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWVzKAorCQkJZmluYWwgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZSBkbWx2KSB7CisJCWRtbHYuc2V0RGlzZWFzZURlYXRocyhOVU1fRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9ESVNFQVNFX0RFQVRIUyk7CisJfSAvLyBpbml0aWFsaXplZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVzCisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTRUlSTGFiZWwgY3JlYXRlU0VJUkxhYmVsKCkgeworCQlmaW5hbCBTRUlSTGFiZWwgc2VpckxhYmVsID0gU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTRUlSTGFiZWwoKTsKKwkKKwkJaW5pdGlhbGl6ZURpc2Vhc2VNb2RlbExhYmVsKHNlaXJMYWJlbCk7CisJCXNlaXJMYWJlbC5nZXRDdXJyZW50U0VJUlZhbHVlKCkuc2V0UyhOVU1fU19QT1BVTEFUSU9OKTsKKwkJc2VpckxhYmVsLmdldEN1cnJlbnRTRUlSVmFsdWUoKS5zZXRFKE5VTV9FX1BPUFVMQVRJT04pOworCQlzZWlyTGFiZWwuZ2V0Q3VycmVudFNFSVJWYWx1ZSgpLnNldEkoTlVNX0lfUE9QVUxBVElPTik7CisJCXNlaXJMYWJlbC5nZXRDdXJyZW50U0VJUlZhbHVlKCkuc2V0UihOVU1fUl9QT1BVTEFUSU9OKTsKKwkJcmV0dXJuIHNlaXJMYWJlbDsKKwl9IC8vIGNyZWF0ZVNFSVJMYWJlbAorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdGFuZGFyZFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVNJTGFiZWxBZGFwdGVyKCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTSUxhYmVsQWRhcHRlcigpIHsKKwkJZmluYWwgU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBTSUxhYmVsIHNJTGFiZWwgPSBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNJTGFiZWwoKTsKKworCQlpbml0aWFsaXplRGlzZWFzZU1vZGVsTGFiZWwoc0lMYWJlbCk7CisJCXNJTGFiZWwuc2V0UyhOVU1fU19QT1BVTEFUSU9OKTsKKwkJc0lMYWJlbC5zZXRJKE5VTV9JX1BPUFVMQVRJT04pOworCisJCWZpbmFsIFJlbGF0aXZlVmFsdWVQcm92aWRlciByZWxhdGl2ZVZhbHVlUHJvdmlkZXIgPSAoUmVsYXRpdmVWYWx1ZVByb3ZpZGVyKSBmaXh0dXJlCisJCQkJLmFkYXB0KHNJTGFiZWwsIFJlbGF0aXZlVmFsdWVQcm92aWRlci5jbGFzcyk7CisKKwkJYXNzZXJ0Tm90TnVsbChyZWxhdGl2ZVZhbHVlUHJvdmlkZXIpOworCisJCWZpbmFsIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BlcnRpZXMgPSByZWxhdGl2ZVZhbHVlUHJvdmlkZXIKKwkJCQkuZ2V0UHJvcGVydGllcygpOworCQlhc3NlcnROb3ROdWxsKHByb3BlcnRpZXMpOworCisJCWFzc2VydFRydWUocHJvcGVydGllcy5zaXplKCkgPT0gTlVNX1NJX0RJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfUFJPUEVSVElFUyk7CisKKwkJYXNzZXJ0VHJ1ZShyZWxhdGl2ZVZhbHVlUHJvdmlkZXIKKwkJCQkuZ2V0UmVsYXRpdmVWYWx1ZShTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFCisJCQkJCQkuZ2V0U3RhbmRhcmREaXNlYXNlTW9kZWxMYWJlbFZhbHVlX1MoKSkgPT0gTlVNX1NfUE9QVUxBVElPTgorCQkJCS8gVE9UQUxfU0lfUE9QVUxBVElPTik7CisKKwkJYXNzZXJ0VHJ1ZShyZWxhdGl2ZVZhbHVlUHJvdmlkZXIKKwkJCQkuZ2V0UmVsYXRpdmVWYWx1ZShTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNJTGFiZWxWYWx1ZV9JKCkpID09IE5VTV9JX1BPUFVMQVRJT04KKwkJCQkvIFRPVEFMX1NJX1BPUFVMQVRJT04pOworCisJfSAvLyB0ZXN0Q3JlYXRlU0lMYWJlbEFkYXB0ZXIKKworCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVTSVJMYWJlbEFkYXB0ZXIoKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdENyZWF0ZVNJUkxhYmVsQWRhcHRlcigpIHsKKwkJZmluYWwgU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBTSVJMYWJlbCBzaXJMYWJlbCA9IFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0lSTGFiZWwoKTsKKworCQlpbml0aWFsaXplRGlzZWFzZU1vZGVsTGFiZWwoc2lyTGFiZWwpOworCQlzaXJMYWJlbC5nZXRDdXJyZW50U0lSVmFsdWUoKS5zZXRTKE5VTV9TX1BPUFVMQVRJT04pOworCQlzaXJMYWJlbC5nZXRDdXJyZW50U0lSVmFsdWUoKS5zZXRJKE5VTV9JX1BPUFVMQVRJT04pOworCQlzaXJMYWJlbC5nZXRDdXJyZW50U0lSVmFsdWUoKS5zZXRSKE5VTV9SX1BPUFVMQVRJT04pOworCisJCWZpbmFsIFJlbGF0aXZlVmFsdWVQcm92aWRlciByZWxhdGl2ZVZhbHVlUHJvdmlkZXIgPSAoUmVsYXRpdmVWYWx1ZVByb3ZpZGVyKSBmaXh0dXJlCisJCQkJLmFkYXB0KHNpckxhYmVsLCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIuY2xhc3MpOworCisJCWFzc2VydE5vdE51bGwocmVsYXRpdmVWYWx1ZVByb3ZpZGVyKTsKKworCQlmaW5hbCBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wZXJ0aWVzID0gcmVsYXRpdmVWYWx1ZVByb3ZpZGVyCisJCQkJLmdldFByb3BlcnRpZXMoKTsKKwkJYXNzZXJ0Tm90TnVsbChwcm9wZXJ0aWVzKTsKKworCQlhc3NlcnRUcnVlKHByb3BlcnRpZXMuc2l6ZSgpID09IE5VTV9TSVJfRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9QUk9QRVJUSUVTKTsKKworCQlhc3NlcnRUcnVlKHJlbGF0aXZlVmFsdWVQcm92aWRlcgorCQkJCS5nZXRSZWxhdGl2ZVZhbHVlKFN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCS5nZXRTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVfUygpKSA9PSBOVU1fU19QT1BVTEFUSU9OCisJCQkJLyBUT1RBTF9TSVJfUE9QVUxBVElPTik7CisKKwkJYXNzZXJ0VHJ1ZShyZWxhdGl2ZVZhbHVlUHJvdmlkZXIKKwkJCQkuZ2V0UmVsYXRpdmVWYWx1ZShTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNJTGFiZWxWYWx1ZV9JKCkpID09IE5VTV9JX1BPUFVMQVRJT04KKwkJCQkvIFRPVEFMX1NJUl9QT1BVTEFUSU9OKTsKKworCQlhc3NlcnRUcnVlKHJlbGF0aXZlVmFsdWVQcm92aWRlcgorCQkJCS5nZXRSZWxhdGl2ZVZhbHVlKFN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCS5nZXRTSVJMYWJlbFZhbHVlX1IoKSkgPT0gTlVNX1JfUE9QVUxBVElPTgorCQkJCS8gVE9UQUxfU0lSX1BPUFVMQVRJT04pOworCX0gLy8gdGVzdENyZWF0ZVNJUkxhYmVsQWRhcHRlcgorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdGFuZGFyZFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVNFSVJMYWJlbEFkYXB0ZXIoKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdENyZWF0ZVNFSVJMYWJlbEFkYXB0ZXIoKSB7CisJCWZpbmFsIFN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgU0VJUkxhYmVsIHNlaXJMYWJlbCA9IGNyZWF0ZVNFSVJMYWJlbCgpOworCisJCWZpbmFsIFJlbGF0aXZlVmFsdWVQcm92aWRlciByZWxhdGl2ZVZhbHVlUHJvdmlkZXIgPSAoUmVsYXRpdmVWYWx1ZVByb3ZpZGVyKSBmaXh0dXJlCisJCQkJLmFkYXB0KHNlaXJMYWJlbCwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyLmNsYXNzKTsKKworCQlhc3NlcnROb3ROdWxsKHJlbGF0aXZlVmFsdWVQcm92aWRlcik7CisKKwkJZmluYWwgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcHJvcGVydGllcyA9IHJlbGF0aXZlVmFsdWVQcm92aWRlcgorCQkJCS5nZXRQcm9wZXJ0aWVzKCk7CisJCWFzc2VydE5vdE51bGwocHJvcGVydGllcyk7CisJCWFzc2VydFRydWUocHJvcGVydGllcy5zaXplKCkgPT0gTlVNX1NFSVJfRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9QUk9QRVJUSUVTKTsKKworCQlhc3NlcnRUcnVlKHJlbGF0aXZlVmFsdWVQcm92aWRlcgorCQkJCS5nZXRSZWxhdGl2ZVZhbHVlKFN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCS5nZXRTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVfUygpKSA9PSBOVU1fU19QT1BVTEFUSU9OCisJCQkJLyBUT1RBTF9TRUlSX1BPUFVMQVRJT04pOworCisJCWFzc2VydFRydWUocmVsYXRpdmVWYWx1ZVByb3ZpZGVyCisJCQkJLmdldFJlbGF0aXZlVmFsdWUoU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRQorCQkJCQkJLmdldFNFSVJMYWJlbFZhbHVlX0UoKSkgPT0gTlVNX0VfUE9QVUxBVElPTgorCQkJCS8gVE9UQUxfU0VJUl9QT1BVTEFUSU9OKTsKKworCQlhc3NlcnRUcnVlKHJlbGF0aXZlVmFsdWVQcm92aWRlcgorCQkJCS5nZXRSZWxhdGl2ZVZhbHVlKFN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0lMYWJlbFZhbHVlX0koKSkgPT0gTlVNX0lfUE9QVUxBVElPTgorCQkJCS8gVE9UQUxfU0VJUl9QT1BVTEFUSU9OKTsKKworCQlhc3NlcnRUcnVlKHJlbGF0aXZlVmFsdWVQcm92aWRlcgorCQkJCS5nZXRSZWxhdGl2ZVZhbHVlKFN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCS5nZXRTSVJMYWJlbFZhbHVlX1IoKSkgPT0gTlVNX1JfUE9QVUxBVElPTgorCQkJCS8gVE9UQUxfU0VJUl9QT1BVTEFUSU9OKTsKKwl9IC8vIHRlc3RDcmVhdGVTRUlSTGFiZWxBZGFwdGVyCisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlU0lMYWJlbFZhbHVlQWRhcHRlcigpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU0lMYWJlbFZhbHVlQWRhcHRlcigpIHsKKwkJZmluYWwgU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlmaW5hbCBTSUxhYmVsVmFsdWUgc0lMYWJlbFZhbHVlID0gU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVTSUxhYmVsVmFsdWUoKTsKKworCQlpbml0aWFsaXplRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZXMoc0lMYWJlbFZhbHVlKTsKKwkJc0lMYWJlbFZhbHVlLnNldFMoTlVNX1NfUE9QVUxBVElPTik7CisJCXNJTGFiZWxWYWx1ZS5zZXRJKE5VTV9JX1BPUFVMQVRJT04pOworCisJCWZpbmFsIFJlbGF0aXZlVmFsdWVQcm92aWRlciByZWxhdGl2ZVZhbHVlUHJvdmlkZXIgPSAoUmVsYXRpdmVWYWx1ZVByb3ZpZGVyKSBmaXh0dXJlCisJCQkJLmFkYXB0KHNJTGFiZWxWYWx1ZSwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyLmNsYXNzKTsKKworCQlhc3NlcnROb3ROdWxsKHJlbGF0aXZlVmFsdWVQcm92aWRlcik7CisKKwkJZmluYWwgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcHJvcGVydGllcyA9IHJlbGF0aXZlVmFsdWVQcm92aWRlcgorCQkJCS5nZXRQcm9wZXJ0aWVzKCk7CisJCWFzc2VydE5vdE51bGwocHJvcGVydGllcyk7CisKKwkJYXNzZXJ0VHJ1ZShwcm9wZXJ0aWVzLnNpemUoKSA9PSBOVU1fU0lfRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9QUk9QRVJUSUVTKTsKKworCQlhc3NlcnRUcnVlKHJlbGF0aXZlVmFsdWVQcm92aWRlcgorCQkJCS5nZXRSZWxhdGl2ZVZhbHVlKFN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCS5nZXRTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVfUygpKSA9PSBOVU1fU19QT1BVTEFUSU9OCisJCQkJLyBUT1RBTF9TSV9QT1BVTEFUSU9OKTsKKworCQlhc3NlcnRUcnVlKHJlbGF0aXZlVmFsdWVQcm92aWRlcgorCQkJCS5nZXRSZWxhdGl2ZVZhbHVlKFN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0lMYWJlbFZhbHVlX0koKSkgPT0gTlVNX0lfUE9QVUxBVElPTgorCQkJCS8gVE9UQUxfU0lfUE9QVUxBVElPTik7CisKKwl9IC8vIHRlc3RDcmVhdGVTSUxhYmVsVmFsdWVBZGFwdGVyCisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlU0lSTGFiZWxWYWx1ZUFkYXB0ZXIoKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdENyZWF0ZVNJUkxhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlmaW5hbCBTdGFuZGFyZFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGZpeHR1cmUgPSBnZXRGaXh0dXJlKCk7CisJCWZpbmFsIFNJUkxhYmVsVmFsdWUgc0lSTGFiZWxWYWx1ZSA9IFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlU0lSTGFiZWxWYWx1ZSgpOworCisJCWluaXRpYWxpemVEaXNlYXNlTW9kZWxMYWJlbFZhbHVlcyhzSVJMYWJlbFZhbHVlKTsKKwkJc0lSTGFiZWxWYWx1ZS5zZXRTKE5VTV9TX1BPUFVMQVRJT04pOworCQlzSVJMYWJlbFZhbHVlLnNldEkoTlVNX0lfUE9QVUxBVElPTik7CisJCXNJUkxhYmVsVmFsdWUuc2V0UihOVU1fUl9QT1BVTEFUSU9OKTsKKworCQlmaW5hbCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIgcmVsYXRpdmVWYWx1ZVByb3ZpZGVyID0gKFJlbGF0aXZlVmFsdWVQcm92aWRlcikgZml4dHVyZQorCQkJCS5hZGFwdChzSVJMYWJlbFZhbHVlLCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIuY2xhc3MpOworCisJCWFzc2VydE5vdE51bGwocmVsYXRpdmVWYWx1ZVByb3ZpZGVyKTsKKworCQlmaW5hbCBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wZXJ0aWVzID0gcmVsYXRpdmVWYWx1ZVByb3ZpZGVyCisJCQkJLmdldFByb3BlcnRpZXMoKTsKKwkJYXNzZXJ0Tm90TnVsbChwcm9wZXJ0aWVzKTsKKworCQlhc3NlcnRUcnVlKHByb3BlcnRpZXMuc2l6ZSgpID09IE5VTV9TSVJfRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9QUk9QRVJUSUVTKTsKKworCQlhc3NlcnRUcnVlKHJlbGF0aXZlVmFsdWVQcm92aWRlcgorCQkJCS5nZXRSZWxhdGl2ZVZhbHVlKFN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCS5nZXRTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVfUygpKSA9PSBOVU1fU19QT1BVTEFUSU9OCisJCQkJLyBUT1RBTF9TSVJfUE9QVUxBVElPTik7CisKKwkJYXNzZXJ0VHJ1ZShyZWxhdGl2ZVZhbHVlUHJvdmlkZXIKKwkJCQkuZ2V0UmVsYXRpdmVWYWx1ZShTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNJTGFiZWxWYWx1ZV9JKCkpID09IE5VTV9JX1BPUFVMQVRJT04KKwkJCQkvIFRPVEFMX1NJUl9QT1BVTEFUSU9OKTsKKworCQlhc3NlcnRUcnVlKHJlbGF0aXZlVmFsdWVQcm92aWRlcgorCQkJCS5nZXRSZWxhdGl2ZVZhbHVlKFN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCS5nZXRTSVJMYWJlbFZhbHVlX1IoKSkgPT0gTlVNX1JfUE9QVUxBVElPTgorCQkJCS8gVE9UQUxfU0lSX1BPUFVMQVRJT04pOworCX0gLy8gdGVzdENyZWF0ZVNJUkxhYmVsVmFsdWVBZGFwdGVyCisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlU0VJUkxhYmVsVmFsdWVBZGFwdGVyKCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTRUlSTGFiZWxWYWx1ZUFkYXB0ZXIoKSB7CisJCWZpbmFsIFN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJZmluYWwgU0VJUkxhYmVsVmFsdWUgc0VJUkxhYmVsVmFsdWUgPSBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZVNFSVJMYWJlbFZhbHVlKCk7CisKKwkJaW5pdGlhbGl6ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWVzKHNFSVJMYWJlbFZhbHVlKTsKKwkJc0VJUkxhYmVsVmFsdWUuc2V0UyhOVU1fU19QT1BVTEFUSU9OKTsKKwkJc0VJUkxhYmVsVmFsdWUuc2V0RShOVU1fRV9QT1BVTEFUSU9OKTsKKwkJc0VJUkxhYmVsVmFsdWUuc2V0SShOVU1fSV9QT1BVTEFUSU9OKTsKKwkJc0VJUkxhYmVsVmFsdWUuc2V0UihOVU1fUl9QT1BVTEFUSU9OKTsKKworCQlmaW5hbCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIgcmVsYXRpdmVWYWx1ZVByb3ZpZGVyID0gKFJlbGF0aXZlVmFsdWVQcm92aWRlcikgZml4dHVyZQorCQkJCS5hZGFwdChzRUlSTGFiZWxWYWx1ZSwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyLmNsYXNzKTsKKworCQlhc3NlcnROb3ROdWxsKHJlbGF0aXZlVmFsdWVQcm92aWRlcik7CisKKwkJZmluYWwgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcHJvcGVydGllcyA9IHJlbGF0aXZlVmFsdWVQcm92aWRlcgorCQkJCS5nZXRQcm9wZXJ0aWVzKCk7CisJCWFzc2VydE5vdE51bGwocHJvcGVydGllcyk7CisJCWFzc2VydFRydWUocHJvcGVydGllcy5zaXplKCkgPT0gTlVNX1NFSVJfRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9QUk9QRVJUSUVTKTsKKworCQlhc3NlcnRUcnVlKHJlbGF0aXZlVmFsdWVQcm92aWRlcgorCQkJCS5nZXRSZWxhdGl2ZVZhbHVlKFN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCS5nZXRTdGFuZGFyZERpc2Vhc2VNb2RlbExhYmVsVmFsdWVfUygpKSA9PSBOVU1fU19QT1BVTEFUSU9OCisJCQkJLyBUT1RBTF9TRUlSX1BPUFVMQVRJT04pOworCisJCWFzc2VydFRydWUocmVsYXRpdmVWYWx1ZVByb3ZpZGVyCisJCQkJLmdldFJlbGF0aXZlVmFsdWUoU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRQorCQkJCQkJLmdldFNFSVJMYWJlbFZhbHVlX0UoKSkgPT0gTlVNX0VfUE9QVUxBVElPTgorCQkJCS8gVE9UQUxfU0VJUl9QT1BVTEFUSU9OKTsKKworCQlhc3NlcnRUcnVlKHJlbGF0aXZlVmFsdWVQcm92aWRlcgorCQkJCS5nZXRSZWxhdGl2ZVZhbHVlKFN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U0lMYWJlbFZhbHVlX0koKSkgPT0gTlVNX0lfUE9QVUxBVElPTgorCQkJCS8gVE9UQUxfU0VJUl9QT1BVTEFUSU9OKTsKKworCQlhc3NlcnRUcnVlKHJlbGF0aXZlVmFsdWVQcm92aWRlcgorCQkJCS5nZXRSZWxhdGl2ZVZhbHVlKFN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCS5nZXRTSVJMYWJlbFZhbHVlX1IoKSkgPT0gTlVNX1JfUE9QVUxBVElPTgorCQkJCS8gVE9UQUxfU0VJUl9QT1BVTEFUSU9OKTsKKwl9IC8vIHRlc3RDcmVhdGVTRUlSTGFiZWxWYWx1ZUFkYXB0ZXIKKworCS8qKgorCSAqIFRlc3QgdGhhdCB0aGlzIGZhY3RvcnkgaXMgcHJvcGVybHkgYWRkZWQgdG8gdGhlIGNvbXBvc2VkIGFkYXB0b3IgZmFjdG9yeQorCSAqIDxjb2RlPlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbDwvY29kZT4gc28gdGhhdCB0aGUKKwkgKiBjbGFzc2VzIGluIHRoZSBTdGFuZGFyZCAoRGlzZWFzZSBtb2RlbCkgcGFja2FnZSB3aWxsIGJlIHByb3Blcmx5IGFkYXB0ZWQKKwkgKiB0byB7QGxpbmsgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyfSdzLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJBZGFwdGVyRmFjdG9yeUNvbXBvc2l0aW9uKCkgeworCQlmaW5hbCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBydnBhZiA9IFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFOworCQkvLyBNYWtlIHRoZSBsYWJlbCB2YWx1ZSB0byBiZSBhZGFwdGVkCisJCWZpbmFsIFNFSVJMYWJlbFZhbHVlIHNFSVJMYWJlbFZhbHVlID0gU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVTRUlSTGFiZWxWYWx1ZSgpOworCQlpbml0aWFsaXplRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZXMoc0VJUkxhYmVsVmFsdWUpOworCQlzRUlSTGFiZWxWYWx1ZS5zZXRTKE5VTV9TX1BPUFVMQVRJT04pOworCQlzRUlSTGFiZWxWYWx1ZS5zZXRFKE5VTV9FX1BPUFVMQVRJT04pOworCQlzRUlSTGFiZWxWYWx1ZS5zZXRJKE5VTV9JX1BPUFVMQVRJT04pOworCQlzRUlSTGFiZWxWYWx1ZS5zZXRSKE5VTV9SX1BPUFVMQVRJT04pOworCisJCWZpbmFsIFJlbGF0aXZlVmFsdWVQcm92aWRlciByZWxhdGl2ZVZhbHVlUHJvdmlkZXIgPSAoUmVsYXRpdmVWYWx1ZVByb3ZpZGVyKSBydnBhZgorCQkJCS5hZGFwdChzRUlSTGFiZWxWYWx1ZSwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyLmNsYXNzKTsKKworCQlhc3NlcnROb3ROdWxsKHJlbGF0aXZlVmFsdWVQcm92aWRlcik7CisJCWFzc2VydFRydWUocmVsYXRpdmVWYWx1ZVByb3ZpZGVyIGluc3RhbmNlb2YgU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5EaXNlYXNlTW9kZWxMYWJlbFZhbHVlUmVsYXRpdmVWYWx1ZVByb3ZpZGVyKTsKKwl9IC8vIHRlc3RQcm9wZXJBZGFwdGVyRmFjdG9yeUNvbXBvc2l0aW9uCisKK30gLy8gU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscy90ZW1wLy5jdnNpZ25vcmUgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvdGVtcC8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMTYxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRpc2Vhc2Vtb2RlbHMvdGVtcC8uY3ZzaWdub3JlCkBAIC0wLDAgKzEgQEAKKyouc2NlbmFyaW8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuaW50ZXJuYWwuZGF0YS8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5pbnRlcm5hbC5kYXRhLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZTg2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuaW50ZXJuYWwuZGF0YS8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmludGVybmFsLmRhdGEvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmludGVybmFsLmRhdGEvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhOTI4NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuaW50ZXJuYWwuZGF0YS8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmludGVybmFsLmRhdGE8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5pbnRlcm5hbC5kYXRhL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5pbnRlcm5hbC5kYXRhL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YjMzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmludGVybmFsLmRhdGEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwxNSBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS50ZXN0cztzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5qdW5pdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmludGVybmFsLmRhdGEvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuaW50ZXJuYWwuZGF0YS9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzI1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmludGVybmFsLmRhdGEvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDEyIEBACisKKyMgPGNvcHlyaWdodD4KKyMgPC9jb3B5cmlnaHQ+CisjCisjICRJZDogYnVpbGQucHJvcGVydGllcyx2IDEuMSAyMDA5LzAyLzA1IDIyOjQ2OjE4IGRmb3JkIEV4cCAkCisKK2Jpbi5pbmNsdWRlcyA9IC4sXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuCitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5pbnRlcm5hbC5kYXRhL3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5pbnRlcm5hbC5kYXRhL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OGI0NmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmludGVybmFsLmRhdGEvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMyBAQAorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwbHVnaW5OYW1lID0gU1RFTSBEYXRhIEdlbmVyYXRvciBUZXN0IFN1aXRlCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5pbnRlcm5hbC5kYXRhL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2ludGVybmFsL2RhdGEvZ2VuZXJhdGVkcGx1Z2luL3Rlc3RzL0R1YmxpbkNvcmVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmludGVybmFsLmRhdGEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vaW50ZXJuYWwvZGF0YS9nZW5lcmF0ZWRwbHVnaW4vdGVzdHMvRHVibGluQ29yZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDQ1ODEwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5pbnRlcm5hbC5kYXRhL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2ludGVybmFsL2RhdGEvZ2VuZXJhdGVkcGx1Z2luL3Rlc3RzL0R1YmxpbkNvcmVUZXN0LmphdmEKQEAgLTAsMCArMSwxMDYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlbmVyYXRlZHBsdWdpbi50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW5lcmF0ZWRwbHVnaW4uRHVibGluQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VuZXJhdGVkcGx1Z2luLkdlbmVyYXRlZHBsdWdpbkZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJworICogPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+Jy4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiAKKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgRHVibGluQ29yZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBEdWJsaW4gQ29yZSB0ZXN0IGNhc2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEdWJsaW5Db3JlIGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oRHVibGluQ29yZVRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgRHVibGluIENvcmUgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEdWJsaW5Db3JlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIER1YmxpbiBDb3JlIHRlc3QgY2FzZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShEdWJsaW5Db3JlIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIER1YmxpbiBDb3JlIHRlc3QgY2FzZS4gPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIER1YmxpbkNvcmUgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKEdlbmVyYXRlZHBsdWdpbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUR1YmxpbkNvcmUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIEtlZXBzIEpVbml0IHF1aWV0IGFib3V0IHRoZSBsYWNrIG9mIHRlc3RzIGluIHRoaXMgY2xhc3MuCisJICovCisJcHVibGljIHZvaWQgdGVzdEZvbygpIHsKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwl9CisKK30gLy8gRHVibGluQ29yZVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuaW50ZXJuYWwuZGF0YS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9pbnRlcm5hbC9kYXRhL2dlbmVyYXRlZHBsdWdpbi90ZXN0cy9FeHRlbnNpb25UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmludGVybmFsLmRhdGEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vaW50ZXJuYWwvZGF0YS9nZW5lcmF0ZWRwbHVnaW4vdGVzdHMvRXh0ZW5zaW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MTU2M2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmludGVybmFsLmRhdGEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vaW50ZXJuYWwvZGF0YS9nZW5lcmF0ZWRwbHVnaW4vdGVzdHMvRXh0ZW5zaW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW5lcmF0ZWRwbHVnaW4udGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VuZXJhdGVkcGx1Z2luLkV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VuZXJhdGVkcGx1Z2luLkdlbmVyYXRlZHBsdWdpbkZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJworICogPGVtPjxiPkV4dGVuc2lvbjwvYj48L2VtPicuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogCisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEV4dGVuc2lvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBFeHRlbnNpb24gdGVzdCBjYXNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRXh0ZW5zaW9uIGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oRXh0ZW5zaW9uVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBFeHRlbnNpb24gdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFeHRlbnNpb25UZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRXh0ZW5zaW9uIHRlc3QgY2FzZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShFeHRlbnNpb24gZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRXh0ZW5zaW9uIHRlc3QgY2FzZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEV4dGVuc2lvbiBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoR2VuZXJhdGVkcGx1Z2luRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXh0ZW5zaW9uKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBLZWVwcyBKVW5pdCBxdWlldCBhYm91dCB0aGUgbGFjayBvZiB0ZXN0cyBpbiB0aGlzIGNsYXNzLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RGb28oKSB7CisJCWFzc2VydFRydWUodHJ1ZSk7CisJfQorfSAvLyBFeHRlbnNpb25UZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmludGVybmFsLmRhdGEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vaW50ZXJuYWwvZGF0YS9nZW5lcmF0ZWRwbHVnaW4vdGVzdHMvR2VuZXJhdGVkUGx1Z2luQWxsVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuaW50ZXJuYWwuZGF0YS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9pbnRlcm5hbC9kYXRhL2dlbmVyYXRlZHBsdWdpbi90ZXN0cy9HZW5lcmF0ZWRQbHVnaW5BbGxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZTNjYjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmludGVybmFsLmRhdGEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vaW50ZXJuYWwvZGF0YS9nZW5lcmF0ZWRwbHVnaW4vdGVzdHMvR2VuZXJhdGVkUGx1Z2luQWxsVGVzdHMuamF2YQpAQCAtMCwwICsxLDU2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW5lcmF0ZWRwbHVnaW4udGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGVkUGx1Z2luPC9iPjwvZW0+CisgKiAnIG1vZGVsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIAorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBHZW5lcmF0ZWRQbHVnaW5BbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgR2VuZXJhdGVkUGx1Z2luQWxsVGVzdHMoIkdlbmVyYXRlZFBsdWdpbiBUZXN0cyIpOworCQlyZXR1cm4gc3VpdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHZW5lcmF0ZWRQbHVnaW5BbGxUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKK30gLy8gR2VuZXJhdGVkUGx1Z2luQWxsVGVzdHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuaW50ZXJuYWwuZGF0YS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9pbnRlcm5hbC9kYXRhL2dlbmVyYXRlZHBsdWdpbi90ZXN0cy9HZW5lcmF0ZWRwbHVnaW5UZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5pbnRlcm5hbC5kYXRhL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2ludGVybmFsL2RhdGEvZ2VuZXJhdGVkcGx1Z2luL3Rlc3RzL0dlbmVyYXRlZHBsdWdpblRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxNjUxNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuaW50ZXJuYWwuZGF0YS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9pbnRlcm5hbC9kYXRhL2dlbmVyYXRlZHBsdWdpbi90ZXN0cy9HZW5lcmF0ZWRwbHVnaW5UZXN0cy5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlbmVyYXRlZHBsdWdpbi50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IHN1aXRlIGZvciB0aGUgJzxlbT48Yj5nZW5lcmF0ZWRwbHVnaW48L2I+PC9lbT4KKyAqICcgcGFja2FnZS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiAKKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgR2VuZXJhdGVkcGx1Z2luVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgeworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IEdlbmVyYXRlZHBsdWdpblRlc3RzKCJnZW5lcmF0ZWRwbHVnaW4gVGVzdHMiKTsKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR2VuZXJhdGVkcGx1Z2luVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCit9IC8vIEdlbmVyYXRlZHBsdWdpblRlc3RzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmludGVybmFsLmRhdGEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vaW50ZXJuYWwvZGF0YS9nZW5lcmF0ZWRwbHVnaW4vdGVzdHMvUGx1Z2luVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5pbnRlcm5hbC5kYXRhL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2ludGVybmFsL2RhdGEvZ2VuZXJhdGVkcGx1Z2luL3Rlc3RzL1BsdWdpblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjE5N2M1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5pbnRlcm5hbC5kYXRhL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2ludGVybmFsL2RhdGEvZ2VuZXJhdGVkcGx1Z2luL3Rlc3RzL1BsdWdpblRlc3QuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VuZXJhdGVkcGx1Z2luLnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MTWFwSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VuZXJhdGVkcGx1Z2luLkdlbmVyYXRlZHBsdWdpbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlbmVyYXRlZHBsdWdpbi5HZW5lcmF0ZWRwbHVnaW5QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW5lcmF0ZWRwbHVnaW4uUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW5lcmF0ZWRwbHVnaW4udXRpbC5HZW5lcmF0ZWRwbHVnaW5SZXNvdXJjZUZhY3RvcnlJbXBsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICcKKyAqIDxlbT48Yj5QbHVnaW48L2I+PC9lbT4nLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIAorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBQbHVnaW5UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgUGx1Z2luIHRlc3QgY2FzZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBsdWdpbiBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFBsdWdpblRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgUGx1Z2luIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGx1Z2luVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFBsdWdpbiB0ZXN0IGNhc2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoUGx1Z2luIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFBsdWdpbiB0ZXN0IGNhc2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQbHVnaW4gZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKEdlbmVyYXRlZHBsdWdpbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBsdWdpbigpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCisJLyoqCisJICogCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIHZvaWQgdGVzdERlc2VyaWFsaXplUGx1Z2luWE1MKCkgeworCisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCJ0ZXN0ZGF0YS9wbHVnaW4ueG1sIik7CisJCWZpbmFsIFVSSSBQTFVHSU5fVVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKwkJdHJ5IHsKKworCQkJR2VuZXJhdGVkcGx1Z2luUmVzb3VyY2VGYWN0b3J5SW1wbCByZmkgPSBuZXcgR2VuZXJhdGVkcGx1Z2luUmVzb3VyY2VGYWN0b3J5SW1wbCgpOworCisJCQlYTUxSZXNvdXJjZS5YTUxNYXAgeG1sTWFwID0gbmV3IFhNTE1hcEltcGwoKTsKKwkJCXhtbE1hcC5zZXROb05hbWVzcGFjZVBhY2thZ2UoR2VuZXJhdGVkcGx1Z2luUGFja2FnZS5lSU5TVEFOQ0UpOworCQkJTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOworCQkJb3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1hNTF9NQVAsIHhtbE1hcCk7CisKKwkJCWZpbmFsIFJlc291cmNlIHJlc291cmNlID0gcmZpLmNyZWF0ZVJlc291cmNlKFBMVUdJTl9VUkkpOworCQkJcmVzb3VyY2UubG9hZChvcHRpb25zKTsKKwkJCWZpbmFsIFBsdWdpbiBwbHVnaW4gPSAoUGx1Z2luKSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKKworCQkJYXNzZXJ0VHJ1ZShwbHVnaW4uZ2V0RXh0ZW5zaW9uZWxlbWVudCgpLnNpemUoKSA9PSAxKTsKKworCQkJLy8gZm9yIChFeHRlbnNpb24gZXh0ZW5zaW9uIDogcGx1Z2luLmdldEV4dGVuc2lvbmVsZW1lbnQoKSkgeworCQkJLy8JCQkJCisJCQkvLyBmb3IgKCBTdGVtQ2F0ZWdvcnkgY2F0ZWdvcnkgOmV4dGVuc2lvbi5nZXRDYXRlZ29yaWVzKCkpIHsKKwkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihjYXRlZ29yeS50b1N0cmluZygpKTsKKwkJCS8vIH0KKwkJCS8vCQkJCQorCQkJLy8gZm9yICggRHVibGluQ29yZSBkYyA6ZXh0ZW5zaW9uLmdldER1YmxpbkNvcmVzKCkpIHsKKwkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihkYy50b1N0cmluZygpKTsKKwkJCS8vIH0KKwkJCS8vCQkJCQorCQkJLy8gfSAvLyBmb3IgZWFjaAorCQl9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKGUudG9TdHJpbmcoKSk7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfSAvLyB0ZXN0RGVzZXJpYWxpemVQbHVnaW5YTUwKK30gLy8gUGx1Z2luVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5pbnRlcm5hbC5kYXRhL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2ludGVybmFsL2RhdGEvZ2VuZXJhdGVkcGx1Z2luL3Rlc3RzL1N0ZW1DYXRlZ29yeVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuaW50ZXJuYWwuZGF0YS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9pbnRlcm5hbC9kYXRhL2dlbmVyYXRlZHBsdWdpbi90ZXN0cy9TdGVtQ2F0ZWdvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg5ZDI4YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuaW50ZXJuYWwuZGF0YS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9pbnRlcm5hbC9kYXRhL2dlbmVyYXRlZHBsdWdpbi90ZXN0cy9TdGVtQ2F0ZWdvcnlUZXN0LmphdmEKQEAgLTAsMCArMSwxMDQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlbmVyYXRlZHBsdWdpbi50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VuZXJhdGVkcGx1Z2luLkdlbmVyYXRlZHBsdWdpbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlbmVyYXRlZHBsdWdpbi5TdGVtQ2F0ZWdvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJworICogPGVtPjxiPlN0ZW0gQ2F0ZWdvcnk8L2I+PC9lbT4nLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIAorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBTdGVtQ2F0ZWdvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgU3RlbSBDYXRlZ29yeSB0ZXN0IGNhc2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTdGVtQ2F0ZWdvcnkgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihTdGVtQ2F0ZWdvcnlUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFN0ZW0gQ2F0ZWdvcnkgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdGVtQ2F0ZWdvcnlUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU3RlbSBDYXRlZ29yeSB0ZXN0IGNhc2UuIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoU3RlbUNhdGVnb3J5IGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFN0ZW0gQ2F0ZWdvcnkgdGVzdCBjYXNlLiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RlbUNhdGVnb3J5IGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShHZW5lcmF0ZWRwbHVnaW5GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdGVtQ2F0ZWdvcnkoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworCS8qKgorCSAqIEtlZXBzIEpVbml0IHF1aWV0IGFib3V0IHRoZSBsYWNrIG9mIHRlc3RzIGluIHRoaXMgY2xhc3MuCisJICovCisJcHVibGljIHZvaWQgdGVzdEZvbygpIHsKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwl9Cit9IC8vIFN0ZW1DYXRlZ29yeVRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuaW50ZXJuYWwuZGF0YS90ZXN0ZGF0YS9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5pbnRlcm5hbC5kYXRhL3Rlc3RkYXRhL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3M2IzYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuaW50ZXJuYWwuZGF0YS90ZXN0ZGF0YS9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsMjg2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjMiPz4KKzxwbHVnaW4+Cis8IS0tIEdlbmVyYXRlZCBDb250ZW50LiAgRG8gbm90IEVkaXQuIC0tPgorPCEtLSBHZW5lcmF0ZWQ6IDIwMDktMDItMDIgMTY6NDAgLS0+Cis8IS0tICoqKioqKioqKioqIEdyYXBocyAqKioqKioqKioqKiAtLT4KKzxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaCI+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoIiBuYW1lPSIlX1VJX1N0YW5kYXJkX1NjZW5hcmlvX2NhdGVnb3J5IiBwYXJlbnRfaWQ9Ii8iLz4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5IiBuYW1lPSIlX1VJX0dlb2dyYXBoeV9jYXRlZ29yeSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgiLz4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbCIgbmFtZT0iJV9VSV9Qb2x0aWNhbF9jYXRlZ29yeSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5Ii8+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIiBuYW1lPSIlX1VJX0NvdW50cmllc19jYXRlZ29yeSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbCIvPgorCis8IS0tIEFCVyAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYWJ3IiBuYW1lPSJBQlciIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYWJ3IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BQlcvQUJXXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQUJXICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2FhLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFidyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQUJXL0FCV18wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBQlcoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0FCVy9BQldfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gQUZHIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hZmciIG5hbWU9IkFGRyIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hZmciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FGRy9BRkdfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBRkcgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYWYuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYWZnIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BRkcvQUZHXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFGRygwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQUZHL0FGR18wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFmZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQUZHL0FGR18xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFGRyAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFmZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQUZHL0FGR18xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBRkcoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0FGRy9BRkdfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hZmciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FGRy9BRkdfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBRkcgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hZmciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FGRy9BRkdfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQUZHKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9BRkcvQUZHXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hZmciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FGR18yX0FGR18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBBRkciIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFmZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQUZHXzJfQ0hOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBBRkcgYW5kIENITiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYWZnIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9BRkdfMl9JUk5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEFGRyBhbmQgSVJOIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hZmciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FGR18yX1BBS18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQUZHIGFuZCBQQUsiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFmZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQUZHXzJfVEpLXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBBRkcgYW5kIFRKSyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYWZnIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9BRkdfMl9US01fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEFGRyBhbmQgVEtNIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hZmciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FGR18yX1VaQl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQUZHIGFuZCBVWkIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFmZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0FGR18wX0FGR18xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBBRkcgbGV2ZWwgKDEpIGJ5IEFGRyAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hZmciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9BRkdfMV9BRkdfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQUZHIGxldmVsICgyKSBieSBBRkcgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEFHTyAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYWdvIiBuYW1lPSJBR08iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYWdvIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BR08vQUdPXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQUdPICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2FvLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFnbyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQUdPL0FHT18wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBR08oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0FHTy9BR09fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hZ28iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FHTy9BR09fMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBR08gKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hZ28iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FHTy9BR09fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQUdPKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9BR08vQUdPXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYWdvIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BR08vQUdPXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQUdPICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYWdvIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BR08vQUdPXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFHTygyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQUdPL0FHT18yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYWdvIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9BR09fMl9BR09fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgQUdPIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hZ28iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FHT18yX0NPRF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQUdPIGFuZCBDT0QiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFnbyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQUdPXzJfQ09HXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBBR08gYW5kIENPRyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYWdvIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9BR09fMl9OQU1fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEFHTyBhbmQgTkFNIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hZ28iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FHT18yX1pNQl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQUdPIGFuZCBaTUIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFnbyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0FHT18wX0FHT18xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBBR08gbGV2ZWwgKDEpIGJ5IEFHTyAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hZ28iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9BR09fMV9BR09fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQUdPIGxldmVsICgyKSBieSBBR08gKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEFJQSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYWlhIiBuYW1lPSJBSUEiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYWlhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BSUEvQUlBXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQUlBICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2F2Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFpYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQUlBL0FJQV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBSUEoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0FJQS9BSUFfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gQUxBIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hbGEiIG5hbWU9IkFMQSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hbGEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FMQS9BTEFfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBTEEgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hbGEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FMQS9BTEFfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQUxBKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9BTEEvQUxBXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEFMQiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYWxiIiBuYW1lPSJBTEIiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYWxiIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BTEIvQUxCXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQUxCICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2FsLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFsYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQUxCL0FMQl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBTEIoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0FMQi9BTEJfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hbGIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FMQi9BTEJfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBTEIgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hbGIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FMQi9BTEJfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQUxCKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9BTEIvQUxCXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hbGIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FMQl8xX0FMQl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBBTEIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFsYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQUxCXzFfR1JDXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBBTEIgYW5kIEdSQyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYWxiIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9BTEJfMV9NS0RfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEFMQiBhbmQgTUtEIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hbGIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FMQl8xX01LRF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQUxCIGFuZCBNS0QiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFsYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQUxCXzFfU1JCXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBBTEIgYW5kIFNSQiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYWxiIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvQUxCXzBfQUxCXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEFMQiBsZXZlbCAoMSkgYnkgQUxCICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBBTkQgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFuZCIgbmFtZT0iQU5EIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFuZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQU5EL0FORF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFORCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9hbi5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hbmQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FORC9BTkRfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQU5EKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9BTkQvQU5EXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYW5kIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BTkQvQU5EXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQU5EICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYW5kIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BTkQvQU5EXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFORCgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQU5EL0FORF8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYW5kIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9BTkRfMV9BTkRfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgQU5EIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hbmQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FORF8xX0VTUF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQU5EIGFuZCBFU1AiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFuZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQU5EXzFfRlJBXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBBTkQgYW5kIEZSQSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYW5kIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvQU5EXzBfQU5EXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEFORCBsZXZlbCAoMSkgYnkgQU5EICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBBTlQgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFudCIgbmFtZT0iQU5UIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFudCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQU5UL0FOVF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFOVCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9udC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hbnQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FOVC9BTlRfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQU5UKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9BTlQvQU5UXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEFSRSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXJlIiBuYW1lPSJBUkUiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXJlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BUkUvQVJFXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQVJFICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2FlLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFyZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQVJFL0FSRV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBUkUoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0FSRS9BUkVfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hcmUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FSRS9BUkVfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBUkUgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hcmUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FSRS9BUkVfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQVJFKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9BUkUvQVJFXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXJlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BUkUvQVJFXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQVJFICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXJlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BUkUvQVJFXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFSRSgyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQVJFL0FSRV8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXJlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9BUkVfMl9BUkVfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgQVJFIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hcmUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FSRV8yX09NTl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQVJFIGFuZCBPTU4iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFyZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQVJFXzJfUUFUXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBBUkUgYW5kIFFBVCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXJlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9BUkVfMl9TQVVfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEFSRSBhbmQgU0FVIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hcmUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9BUkVfMF9BUkVfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQVJFIGxldmVsICgxKSBieSBBUkUgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXJlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvQVJFXzFfQVJFXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEFSRSBsZXZlbCAoMikgYnkgQVJFICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBBUkcgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFyZyIgbmFtZT0iQVJHIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFyZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQVJHL0FSR18wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFSRyAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9hci5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hcmciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FSRy9BUkdfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQVJHKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9BUkcvQVJHXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXJnIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BUkcvQVJHXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQVJHICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXJnIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BUkcvQVJHXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFSRygxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQVJHL0FSR18xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFyZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQVJHL0FSR18yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFSRyAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFyZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQVJHL0FSR18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBUkcoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0FSRy9BUkdfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFyZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQVJHXzJfQVJHXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IEFSRyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXJnIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9BUkdfMl9CT0xfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEFSRyBhbmQgQk9MIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hcmciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FSR18yX0JSQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQVJHIGFuZCBCUkEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFyZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQVJHXzJfQ0hMXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBBUkcgYW5kIENITCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXJnIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9BUkdfMl9QUllfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEFSRyBhbmQgUFJZIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hcmciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FSR18yX1VSWV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQVJHIGFuZCBVUlkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFyZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0FSR18wX0FSR18xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBBUkcgbGV2ZWwgKDEpIGJ5IEFSRyAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hcmciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9BUkdfMV9BUkdfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQVJHIGxldmVsICgyKSBieSBBUkcgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEFSTSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXJtIiBuYW1lPSJBUk0iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXJtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BUk0vQVJNXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQVJNICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2FtLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFybSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQVJNL0FSTV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBUk0oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0FSTS9BUk1fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hcm0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FSTS9BUk1fMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBUk0gKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hcm0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FSTS9BUk1fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQVJNKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9BUk0vQVJNXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXJtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BUk0vQVJNXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQVJNICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXJtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BUk0vQVJNXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFSTSgyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQVJNL0FSTV8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXJtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9BUk1fMl9BUk1fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgQVJNIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hcm0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FSTV8yX0FaRV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQVJNIGFuZCBBWkUiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFybSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQVJNXzJfR0VPXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBBUk0gYW5kIEdFTyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXJtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9BUk1fMl9JUk5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEFSTSBhbmQgSVJOIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hcm0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FSTV8yX1RVUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQVJNIGFuZCBUVVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFybSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0FSTV8wX0FSTV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBBUk0gbGV2ZWwgKDEpIGJ5IEFSTSAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hcm0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9BUk1fMV9BUk1fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQVJNIGxldmVsICgyKSBieSBBUk0gKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEFTTSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXNtIiBuYW1lPSJBU00iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXNtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BU00vQVNNXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQVNNICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2FhLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmFzbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQVNNL0FTTV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBU00oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0FTTS9BU01fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gQVRBIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hdGEiIG5hbWU9IkFUQSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hdGEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FUQS9BVEFfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBVEEgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYXkuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXRhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BVEEvQVRBXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFUQSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQVRBL0FUQV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBBVEYgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmF0ZiIgbmFtZT0iQVRGIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmF0ZiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQVRGL0FURl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFURiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9mcy5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hdGYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FURi9BVEZfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQVRGKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9BVEYvQVRGXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEFURyAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXRnIiBuYW1lPSJBVEciIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXRnIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BVEcvQVRHXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQVRHICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2FjLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmF0ZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQVRHL0FUR18wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBVEcoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0FURy9BVEdfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gQVVTIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hdXMiIG5hbWU9IkFVUyIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hdXMiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FVUy9BVVNfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBVVMgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYmUuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXVzIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BVVMvQVVTXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFVUygwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQVVTL0FVU18wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmF1cyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQVVTL0FVU18xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFVUyAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXVzIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BVVMvQVVTXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFVUygxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0FVUy9BVVNfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmF1cyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQVVTXzFfQVVTXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IEFVUyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXVzIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvQVVTXzBfQVVTXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEFVUyBsZXZlbCAoMSkgYnkgQVVTICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBBVVQgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmF1dCIgbmFtZT0iQVVUIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmF1dCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQVVUL0FVVF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFVVCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9hdS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hdXQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FVVC9BVVRfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQVVUKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9BVVQvQVVUXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXV0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BVVQvQVVUXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQVVUICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXV0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BVVQvQVVUXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFVVCgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQVVUL0FVVF8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXV0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9BVVRfMV9BVVRfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgQVVUIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hdXQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FVVF8xX0NIRV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQVVUIGFuZCBDSEUiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmF1dCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQVVUXzFfQ1pFXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBBVVQgYW5kIENaRSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXV0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9BVVRfMV9ERVVfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEFVVCBhbmQgREVVIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hdXQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FVVF8xX0hVTl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQVVUIGFuZCBIVU4iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmF1dCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQVVUXzFfSVRBXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBBVVQgYW5kIElUQSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXV0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9BVVRfMV9MSUVfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEFVVCBhbmQgTElFIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hdXQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FVVF8xX1NWTl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQVVUIGFuZCBTVk4iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmF1dCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0FVVF8wX0FVVF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBBVVQgbGV2ZWwgKDEpIGJ5IEFVVCAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gQVpFIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hemUiIG5hbWU9IkFaRSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hemUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FaRS9BWkVfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBWkUgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYWouaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXplIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9BWkUvQVpFXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFaRSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQVpFL0FaRV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmF6ZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQVpFL0FaRV8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFaRSAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmF6ZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQVpFL0FaRV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBWkUoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0FaRS9BWkVfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hemUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FaRS9BWkVfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBWkUgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hemUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0FaRS9BWkVfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQVpFKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9BWkUvQVpFXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hemUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FaRV8yX0FaRV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBBWkUiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmF6ZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQVpFXzJfR0VPXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBBWkUgYW5kIEdFTyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXplIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9BWkVfMl9JUk5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEFaRSBhbmQgSVJOIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5hemUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0FaRV8yX1JVU18xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQVpFIGFuZCBSVVMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmF6ZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQVpFXzJfVFVSXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBBWkUgYW5kIFRVUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYXplIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvQVpFXzBfQVpFXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEFaRSBsZXZlbCAoMSkgYnkgQVpFICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmF6ZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0FaRV8xX0FaRV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBBWkUgbGV2ZWwgKDIpIGJ5IEFaRSAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gQkRJIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZGkiIG5hbWU9IkJESSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZGkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JESS9CRElfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCREkgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYnkuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmRpIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CREkvQkRJXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJESSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQkRJL0JESV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJkaSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQkRJL0JESV8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJESSAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJkaSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQkRJL0JESV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCREkoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0JESS9CRElfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZGkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JESS9CRElfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCREkgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZGkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JESS9CRElfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQkRJKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9CREkvQkRJXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZGkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JESV8yX0JESV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBCREkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJkaSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQkRJXzJfQ09EXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBCREkgYW5kIENPRCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmRpIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CRElfMl9SV0FfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEJESSBhbmQgUldBIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZGkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JESV8yX1RaQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQkRJIGFuZCBUWkEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJkaSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0JESV8wX0JESV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBCREkgbGV2ZWwgKDEpIGJ5IEJESSAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZGkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9CRElfMV9CRElfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQkRJIGxldmVsICgyKSBieSBCREkgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEJFTCAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmVsIiBuYW1lPSJCRUwiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmVsIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CRUwvQkVMXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQkVMICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2JlLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJlbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQkVML0JFTF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCRUwoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0JFTC9CRUxfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZWwiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JFTC9CRUxfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCRUwgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZWwiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JFTC9CRUxfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQkVMKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9CRUwvQkVMXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZWwiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JFTF8xX0JFTF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBCRUwiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJlbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQkVMXzFfREVVXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBCRUwgYW5kIERFVSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmVsIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CRUxfMV9GUkFfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEJFTCBhbmQgRlJBIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZWwiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JFTF8xX0xVWF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQkVMIGFuZCBMVVgiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJlbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQkVMXzFfTkxEXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBCRUwgYW5kIE5MRCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmVsIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvQkVMXzBfQkVMXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEJFTCBsZXZlbCAoMSkgYnkgQkVMICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBCRU4gLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJlbiIgbmFtZT0iQkVOIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJlbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQkVOL0JFTl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJFTiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9ibi5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JFTi9CRU5fMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQkVOKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9CRU4vQkVOXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmVuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CRU4vQkVOXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQkVOICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmVuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CRU4vQkVOXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJFTigxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQkVOL0JFTl8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJlbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQkVOL0JFTl8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJFTiAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJlbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQkVOL0JFTl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCRU4oMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0JFTi9CRU5fMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJlbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQkVOXzJfQkVOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IEJFTiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmVuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CRU5fMl9CRkFfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEJFTiBhbmQgQkZBIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JFTl8yX05FUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQkVOIGFuZCBORVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJlbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQkVOXzJfTkdBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBCRU4gYW5kIE5HQSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmVuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CRU5fMl9UR09fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEJFTiBhbmQgVEdPIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9CRU5fMF9CRU5fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQkVOIGxldmVsICgxKSBieSBCRU4gKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmVuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvQkVOXzFfQkVOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEJFTiBsZXZlbCAoMikgYnkgQkVOICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBCRkEgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJmYSIgbmFtZT0iQkZBIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJmYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQkZBL0JGQV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJGQSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy91di5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZmEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JGQS9CRkFfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQkZBKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9CRkEvQkZBXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmZhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CRkEvQkZBXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQkZBICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmZhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CRkEvQkZBXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJGQSgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQkZBL0JGQV8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJmYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQkZBL0JGQV8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJGQSAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJmYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQkZBL0JGQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCRkEoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0JGQS9CRkFfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJmYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQkZBXzJfQkZBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IEJGQSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmZhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CRkFfMl9DSVZfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEJGQSBhbmQgQ0lWIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZmEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JGQV8yX0dIQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQkZBIGFuZCBHSEEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJmYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQkZBXzJfTUxJXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBCRkEgYW5kIE1MSSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmZhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CRkFfMl9ORVJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEJGQSBhbmQgTkVSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZmEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JGQV8yX1RHT18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQkZBIGFuZCBUR08iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJmYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0JGQV8wX0JGQV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBCRkEgbGV2ZWwgKDEpIGJ5IEJGQSAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZmEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9CRkFfMV9CRkFfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQkZBIGxldmVsICgyKSBieSBCRkEgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEJHRCAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmdkIiBuYW1lPSJCR0QiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmdkIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CR0QvQkdEXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQkdEICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2JnLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJnZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQkdEL0JHRF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCR0QoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0JHRC9CR0RfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZ2QiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JHRC9CR0RfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCR0QgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZ2QiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JHRC9CR0RfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQkdEKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9CR0QvQkdEXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmdkIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CR0QvQkdEXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQkdEICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmdkIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CR0QvQkdEXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJHRCgyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQkdEL0JHRF8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmdkIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CR0RfMl9CR0RfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgQkdEIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZ2QiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JHRF8yX0lORF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQkdEIGFuZCBJTkQiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJnZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0JHRF8wX0JHRF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBCR0QgbGV2ZWwgKDEpIGJ5IEJHRCAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZ2QiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9CR0RfMV9CR0RfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQkdEIGxldmVsICgyKSBieSBCR0QgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEJHUiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmdyIiBuYW1lPSJCR1IiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmdyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CR1IvQkdSXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQkdSICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2J1Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJnciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQkdSL0JHUl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCR1IoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0JHUi9CR1JfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZ3IiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JHUi9CR1JfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCR1IgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZ3IiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JHUi9CR1JfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQkdSKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9CR1IvQkdSXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZ3IiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JHUl8xX0JHUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBCR1IiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJnciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQkdSXzFfR1JDXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBCR1IgYW5kIEdSQyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmdyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CR1JfMV9NS0RfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEJHUiBhbmQgTUtEIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZ3IiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JHUl8xX01LRF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQkdSIGFuZCBNS0QiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJnciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQkdSXzFfUk9VXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBCR1IgYW5kIFJPVSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmdyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CR1JfMV9TUkJfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEJHUiBhbmQgU1JCIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iZ3IiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JHUl8xX1RVUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQkdSIGFuZCBUVVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJnciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0JHUl8wX0JHUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBCR1IgbGV2ZWwgKDEpIGJ5IEJHUiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gQkhSIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iaHIiIG5hbWU9IkJIUiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iaHIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JIUi9CSFJfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCSFIgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYmEuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmhyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CSFIvQkhSXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJIUigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQkhSL0JIUl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJociIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQkhSL0JIUl8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJIUiAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJociIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQkhSL0JIUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCSFIoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0JIUi9CSFJfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iaHIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JIUi9CSFJfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCSFIgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iaHIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JIUi9CSFJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQkhSKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9CSFIvQkhSXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iaHIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JIUl8yX0JIUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBCSFIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJociIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0JIUl8wX0JIUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBCSFIgbGV2ZWwgKDEpIGJ5IEJIUiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iaHIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9CSFJfMV9CSFJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQkhSIGxldmVsICgyKSBieSBCSFIgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEJIUyAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmhzIiBuYW1lPSJCSFMiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmhzIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CSFMvQkhTXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQkhTICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2JmLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJocyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQkhTL0JIU18wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCSFMoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0JIUy9CSFNfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gQklIIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iaWgiIG5hbWU9IkJJSCIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iaWgiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JJSC9CSUhfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCSUggKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYmsuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmloIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CSUgvQklIXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJJSCgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQklIL0JJSF8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJpaCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQklIL0JJSF8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJJSCAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJpaCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQklIL0JJSF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCSUgoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0JJSC9CSUhfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJpaCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQklIXzFfQklIXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IEJJSCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmloIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CSUhfMV9IUlZfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEJJSCBhbmQgSFJWIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5iaWgiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JJSF8xX1NSQl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQklIIGFuZCBTUkIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJpaCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0JJSF8wX0JJSF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBCSUggbGV2ZWwgKDEpIGJ5IEJJSCAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gQkxSIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ibHIiIG5hbWU9IkJMUiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ibHIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JMUi9CTFJfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCTFIgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYm8uaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmxyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CTFIvQkxSXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJMUigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQkxSL0JMUl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmxyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CTFJfMF9MVFVfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEJMUiBhbmQgTFRVIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ibHIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JMUl8wX0xWQV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQkxSIGFuZCBMVkEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJsciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQkxSXzBfUE9MXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBCTFIgYW5kIFBPTCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmxyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CTFJfMF9SVVNfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEJMUiBhbmQgUlVTIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ibHIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JMUl8wX1VLUl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIGJldHdlZW4gY291bnRyeSBCTFIgYW5kIFVLUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDEtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYmxyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CTFJfMF9VS1JfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciBiZXR3ZWVuIGNvdW50cnkgQkxSIGFuZCBVS1IiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDAxLTAxLTAxOyIgLz4KKworPCEtLSBCTFogLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJseiIgbmFtZT0iQkxaIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJseiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQkxaL0JMWl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJMWiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9iaC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ibHoiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JMWi9CTFpfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQkxaKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9CTFovQkxaXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ibHoiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JMWl8wX0dUTV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQkxaIGFuZCBHVE0iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJseiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQkxaXzBfTUVYXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBCTFogYW5kIE1FWCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorCis8IS0tIEJNVSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYm11IiBuYW1lPSJCTVUiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYm11IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CTVUvQk1VXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQk1VICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2JkLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJtdSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQk1VL0JNVV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCTVUoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0JNVS9CTVVfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gQk9MIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ib2wiIG5hbWU9IkJPTCIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ib2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JPTC9CT0xfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCT0wgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYmwuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYm9sIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CT0wvQk9MXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJPTCgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQk9ML0JPTF8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJvbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQk9ML0JPTF8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJPTCAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJvbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQk9ML0JPTF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCT0woMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0JPTC9CT0xfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ib2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JPTC9CT0xfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCT0wgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ib2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JPTC9CT0xfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQk9MKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9CT0wvQk9MXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ib2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JPTF8yX0JPTF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBCT0wiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJvbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQk9MXzJfQlJBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBCT0wgYW5kIEJSQSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYm9sIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CT0xfMl9DSExfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEJPTCBhbmQgQ0hMIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ib2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JPTF8yX1BFUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQk9MIGFuZCBQRVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJvbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQk9MXzJfUFJZXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBCT0wgYW5kIFBSWSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYm9sIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvQk9MXzBfQk9MXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEJPTCBsZXZlbCAoMSkgYnkgQk9MICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJvbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0JPTF8xX0JPTF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBCT0wgbGV2ZWwgKDIpIGJ5IEJPTCAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gQlJBIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5icmEiIG5hbWU9IkJSQSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5icmEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JSQS9CUkFfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCUkEgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYnIuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnJhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CUkEvQlJBXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJSQSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQlJBL0JSQV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJyYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQlJBL0JSQV8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJSQSAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJyYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQlJBL0JSQV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCUkEoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0JSQS9CUkFfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5icmEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JSQS9CUkFfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCUkEgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5icmEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JSQS9CUkFfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQlJBKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9CUkEvQlJBXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5icmEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JSQV8yX0JSQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBCUkEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJyYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQlJBXzJfQ09MXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBCUkEgYW5kIENPTCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnJhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CUkFfMl9HVUZfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEJSQSBhbmQgR1VGIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5icmEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JSQV8yX0dVWV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQlJBIGFuZCBHVVkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJyYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQlJBXzJfUEVSXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBCUkEgYW5kIFBFUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnJhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CUkFfMl9QUllfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEJSQSBhbmQgUFJZIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5icmEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JSQV8yX1NVUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQlJBIGFuZCBTVVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJyYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQlJBXzJfVVJZXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBCUkEgYW5kIFVSWSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnJhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CUkFfMl9WRU5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEJSQSBhbmQgVkVOIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5icmEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9CUkFfMF9CUkFfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQlJBIGxldmVsICgxKSBieSBCUkEgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnJhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvQlJBXzFfQlJBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEJSQSBsZXZlbCAoMikgYnkgQlJBICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBCUkIgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJyYiIgbmFtZT0iQlJCIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJyYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQlJCL0JSQl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJSQiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9iYi5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5icmIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JSQi9CUkJfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQlJCKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9CUkIvQlJCXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEJSTiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnJuIiBuYW1lPSJCUk4iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnJuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CUk4vQlJOXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQlJOICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2J4Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJybiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQlJOL0JSTl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCUk4oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0JSTi9CUk5fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5icm4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JSTi9CUk5fMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCUk4gKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5icm4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JSTi9CUk5fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQlJOKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9CUk4vQlJOXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnJuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CUk4vQlJOXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQlJOICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnJuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CUk4vQlJOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJSTigyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQlJOL0JSTl8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnJuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CUk5fMl9CUk5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgQlJOIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5icm4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JSTl8yX01ZU18wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQlJOIGFuZCBNWVMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJybiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0JSTl8wX0JSTl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBCUk4gbGV2ZWwgKDEpIGJ5IEJSTiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5icm4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9CUk5fMV9CUk5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQlJOIGxldmVsICgyKSBieSBCUk4gKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEJUTiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnRuIiBuYW1lPSJCVE4iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnRuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CVE4vQlROXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQlROICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2J0Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJ0biIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQlROL0JUTl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCVE4oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0JUTi9CVE5fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5idG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JUTi9CVE5fMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCVE4gKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5idG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JUTi9CVE5fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQlROKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9CVE4vQlROXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnRuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CVE4vQlROXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQlROICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnRuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CVE4vQlROXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJUTigyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQlROL0JUTl8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnRuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CVE5fMl9CVE5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgQlROIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5idG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JUTl8yX0NITl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQlROIGFuZCBDSE4iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJ0biIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQlROXzJfSU5EXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBCVE4gYW5kIElORCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnRuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvQlROXzBfQlROXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEJUTiBsZXZlbCAoMSkgYnkgQlROICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJ0biIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0JUTl8xX0JUTl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBCVE4gbGV2ZWwgKDIpIGJ5IEJUTiAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gQlZUIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5idnQiIG5hbWU9IkJWVCIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5idnQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JWVC9CVlRfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJCVlQgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYnYuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnZ0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9CVlQvQlZUXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJWVCgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQlZUL0JWVF8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYnZ0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvQlZUXzBfQlZUXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEJWVCBsZXZlbCAoMSkgYnkgQlZUICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBCV0EgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJ3YSIgbmFtZT0iQldBIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJ3YSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQldBL0JXQV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkJXQSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9iYy5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5id2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0JXQS9CV0FfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQldBKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9CV0EvQldBXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5id2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JXQV8wX05BTV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQldBIGFuZCBOQU0iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmJ3YSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQldBXzBfWkFGXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBCV0EgYW5kIFpBRiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuYndhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9CV0FfMF9aTUJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEJXQSBhbmQgWk1CIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5id2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0JXQV8wX1pXRV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQldBIGFuZCBaV0UiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKworPCEtLSBDQUYgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNhZiIgbmFtZT0iQ0FGIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNhZiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ0FGL0NBRl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNBRiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9jdC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jYWYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NBRi9DQUZfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ0FGKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9DQUYvQ0FGXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2FmIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DQUYvQ0FGXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ0FGICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2FmIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DQUYvQ0FGXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNBRigxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQ0FGL0NBRl8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNhZiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ0FGL0NBRl8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNBRiAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNhZiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ0FGL0NBRl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDQUYoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0NBRi9DQUZfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNhZiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ0FGXzJfQ0FGXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IENBRiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2FmIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DQUZfMl9DTVJfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENBRiBhbmQgQ01SIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jYWYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NBRl8yX0NPRF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ0FGIGFuZCBDT0QiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNhZiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ0FGXzJfQ09HXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBDQUYgYW5kIENPRyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2FmIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DQUZfMl9TRE5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENBRiBhbmQgU0ROIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jYWYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NBRl8yX1RDRF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ0FGIGFuZCBUQ0QiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNhZiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0NBRl8wX0NBRl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBDQUYgbGV2ZWwgKDEpIGJ5IENBRiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jYWYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9DQUZfMV9DQUZfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQ0FGIGxldmVsICgyKSBieSBDQUYgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIENBTiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2FuIiBuYW1lPSJDQU4iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2FuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DQU4vQ0FOXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ0FOICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2NhLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNhbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ0FOL0NBTl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDQU4oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0NBTi9DQU5fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jYW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NBTi9DQU5fMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDQU4gKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jYW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NBTi9DQU5fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ0FOKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQ0FOL0NBTl8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2FuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DQU5fMV9DQU5fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgQ0FOIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jYW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NBTl8xX1VTQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ0FOIGFuZCBVU0EiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNhbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0NBTl8wX0NBTl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBDQU4gbGV2ZWwgKDEpIGJ5IENBTiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gQ0NLIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jY2siIG5hbWU9IkNDSyIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jY2siIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NDSy9DQ0tfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDQ0sgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvY2suaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2NrIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DQ0svQ0NLXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNDSygwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQ0NLL0NDS18wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBDSEUgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNoZSIgbmFtZT0iQ0hFIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNoZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ0hFL0NIRV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNIRSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9zei5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaGUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NIRS9DSEVfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ0hFKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9DSEUvQ0hFXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2hlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DSEUvQ0hFXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ0hFICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2hlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DSEUvQ0hFXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNIRSgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQ0hFL0NIRV8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2hlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DSEVfMV9DSEVfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgQ0hFIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaGUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NIRV8xX0RFVV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ0hFIGFuZCBERVUiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNoZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ0hFXzFfRlJBXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBDSEUgYW5kIEZSQSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2hlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DSEVfMV9JVEFfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENIRSBhbmQgSVRBIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaGUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NIRV8xX0xJRV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ0hFIGFuZCBMSUUiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNoZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0NIRV8wX0NIRV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBDSEUgbGV2ZWwgKDEpIGJ5IENIRSAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gQ0hMIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaGwiIG5hbWU9IkNITCIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaGwiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NITC9DSExfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDSEwgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvY2kuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2hsIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DSEwvQ0hMXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNITCgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQ0hML0NITF8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNobCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ0hML0NITF8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNITCAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNobCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ0hML0NITF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDSEwoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0NITC9DSExfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaGwiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NITC9DSExfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDSEwgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaGwiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NITC9DSExfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ0hMKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9DSEwvQ0hMXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaGwiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NITF8yX0NITF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBDSEwiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNobCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ0hMXzJfUEVSXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBDSEwgYW5kIFBFUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2hsIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvQ0hMXzBfQ0hMXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIENITCBsZXZlbCAoMSkgYnkgQ0hMICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNobCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0NITF8xX0NITF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBDSEwgbGV2ZWwgKDIpIGJ5IENITCAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gQ0hOIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaG4iIG5hbWU9IkNITiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NITi9DSE5fMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDSE4gKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvY2guaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2huIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DSE4vQ0hOXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNITigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQ0hOL0NITl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNobiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ0hOL0NITl8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNITiAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNobiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ0hOL0NITl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDSE4oMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0NITi9DSE5fMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NITi9DSE5fMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDSE4gKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NITi9DSE5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ0hOKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9DSE4vQ0hOXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NITl8yX0NITl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBDSE4iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNobiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ0hOXzJfSEtHXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBDSE4gYW5kIEhLRyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2huIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DSE5fMl9JTkRfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENITiBhbmQgSU5EIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NITl8yX0tBWl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ0hOIGFuZCBLQVoiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNobiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ0hOXzJfS0daXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBDSE4gYW5kIEtHWiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2huIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DSE5fMl9MQU9fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENITiBhbmQgTEFPIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NITl8yX01BQ18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ0hOIGFuZCBNQUMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNobiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ0hOXzJfTU5HXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBDSE4gYW5kIE1ORyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2huIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DSE5fMl9OUExfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENITiBhbmQgTlBMIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NITl8yX1BBS18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ0hOIGFuZCBQQUsiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNobiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ0hOXzJfUFJLXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBDSE4gYW5kIFBSSyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2huIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DSE5fMl9SVVNfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENITiBhbmQgUlVTIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NITl8yX1RKS18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ0hOIGFuZCBUSksiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNobiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ0hOXzJfVFdOXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBDSE4gYW5kIFRXTiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2huIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DSE5fMl9WTk1fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENITiBhbmQgVk5NIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9DSE5fMF9DSE5fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQ0hOIGxldmVsICgxKSBieSBDSE4gKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2huIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvQ0hOXzFfQ0hOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIENITiBsZXZlbCAoMikgYnkgQ0hOICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBDSVYgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNpdiIgbmFtZT0iQ0lWIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNpdiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ0lWL0NJVl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNJViAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9pdi5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaXYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NJVi9DSVZfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ0lWKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9DSVYvQ0lWXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2l2IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DSVYvQ0lWXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ0lWICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2l2IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DSVYvQ0lWXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNJVigxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQ0lWL0NJVl8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNpdiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ0lWL0NJVl8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNJViAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNpdiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ0lWL0NJVl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDSVYoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0NJVi9DSVZfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNpdiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ0lWXzJfQ0lWXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IENJViIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2l2IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DSVZfMl9HSEFfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENJViBhbmQgR0hBIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaXYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NJVl8yX0dJTl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ0lWIGFuZCBHSU4iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNpdiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ0lWXzJfTEJSXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBDSVYgYW5kIExCUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2l2IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DSVZfMl9NTElfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENJViBhbmQgTUxJIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jaXYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9DSVZfMF9DSVZfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQ0lWIGxldmVsICgxKSBieSBDSVYgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY2l2IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvQ0lWXzFfQ0lWXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIENJViBsZXZlbCAoMikgYnkgQ0lWICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBDTVIgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNtciIgbmFtZT0iQ01SIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNtciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ01SL0NNUl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNNUiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9jbS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jbXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NNUi9DTVJfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ01SKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9DTVIvQ01SXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jbXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NNUl8wX0NPRF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ01SIGFuZCBDT0QiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNtciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ01SXzBfQ09HXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBDTVIgYW5kIENPRyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY21yIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DTVJfMF9HQUJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENNUiBhbmQgR0FCIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jbXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NNUl8wX0dOUV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ01SIGFuZCBHTlEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNtciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ01SXzBfTkdBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBDTVIgYW5kIE5HQSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY21yIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DTVJfMF9UQ0RfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENNUiBhbmQgVENEIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+CisKKzwhLS0gQ09EIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jb2QiIG5hbWU9IkNPRCIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jb2QiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NPRC9DT0RfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDT0QgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvY2cuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29kIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DT0QvQ09EXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNPRCgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQ09EL0NPRF8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29kIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DT0RfMF9DT0dfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENPRCBhbmQgQ09HIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jb2QiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NPRF8wX1JXQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ09EIGFuZCBSV0EiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNvZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ09EXzBfU0ROXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBDT0QgYW5kIFNETiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29kIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DT0RfMF9VR0FfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENPRCBhbmQgVUdBIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jb2QiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NPRF8wX1pNQl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ09EIGFuZCBaTUIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKworPCEtLSBDT0cgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNvZyIgbmFtZT0iQ09HIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNvZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ09HL0NPR18wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNPRyAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9jZi5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jb2ciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NPRy9DT0dfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ09HKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9DT0cvQ09HXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29nIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DT0cvQ09HXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ09HICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29nIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DT0cvQ09HXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNPRygxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQ09HL0NPR18xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNvZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ09HL0NPR18yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNPRyAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNvZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ09HL0NPR18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDT0coMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0NPRy9DT0dfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNvZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ09HXzJfQ09HXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IENPRyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29nIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DT0dfMl9HQUJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENPRyBhbmQgR0FCIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jb2ciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9DT0dfMF9DT0dfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQ09HIGxldmVsICgxKSBieSBDT0cgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29nIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvQ09HXzFfQ09HXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIENPRyBsZXZlbCAoMikgYnkgQ09HICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBDT0sgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNvayIgbmFtZT0iQ09LIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNvayIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ09LL0NPS18wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNPSyAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9jdy5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jb2siIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NPSy9DT0tfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ09LKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9DT0svQ09LXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jb2siIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9DT0tfMF9DT0tfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQ09LIGxldmVsICgxKSBieSBDT0sgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIENPTCAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29sIiBuYW1lPSJDT0wiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29sIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DT0wvQ09MXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ09MICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2NvLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNvbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ09ML0NPTF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDT0woMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0NPTC9DT0xfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jb2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NPTC9DT0xfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDT0wgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jb2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NPTC9DT0xfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ09MKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9DT0wvQ09MXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29sIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DT0wvQ09MXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ09MICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29sIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DT0wvQ09MXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNPTCgyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQ09ML0NPTF8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29sIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DT0xfMl9DT0xfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgQ09MIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jb2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NPTF8yX0VDVV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ09MIGFuZCBFQ1UiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNvbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ09MXzJfUEFOXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBDT0wgYW5kIFBBTiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29sIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DT0xfMl9QRVJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENPTCBhbmQgUEVSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jb2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NPTF8yX1ZFTl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ09MIGFuZCBWRU4iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNvbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0NPTF8wX0NPTF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBDT0wgbGV2ZWwgKDEpIGJ5IENPTCAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jb2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9DT0xfMV9DT0xfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQ09MIGxldmVsICgyKSBieSBDT0wgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIENPTSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29tIiBuYW1lPSJDT00iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29tIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DT00vQ09NXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ09NICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2NuLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNvbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ09NL0NPTV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDT00oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0NPTS9DT01fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jb20iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NPTS9DT01fMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDT00gKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jb20iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NPTS9DT01fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ09NKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9DT00vQ09NXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29tIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DT00vQ09NXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ09NICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29tIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DT00vQ09NXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNPTSgyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQ09NL0NPTV8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29tIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DT01fMl9DT01fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgQ09NIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jb20iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9DT01fMF9DT01fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQ09NIGxldmVsICgxKSBieSBDT00gKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY29tIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvQ09NXzFfQ09NXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIENPTSBsZXZlbCAoMikgYnkgQ09NICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBDUFYgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNwdiIgbmFtZT0iQ1BWIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNwdiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ1BWL0NQVl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNQViAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9jdi5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jcHYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NQVi9DUFZfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ1BWKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9DUFYvQ1BWXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY3B2IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DUFYvQ1BWXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ1BWICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY3B2IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DUFYvQ1BWXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNQVigxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQ1BWL0NQVl8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNwdiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ1BWL0NQVl8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNQViAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNwdiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ1BWL0NQVl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDUFYoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0NQVi9DUFZfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNwdiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ1BWXzJfQ1BWXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IENQViIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY3B2IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvQ1BWXzBfQ1BWXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIENQViBsZXZlbCAoMSkgYnkgQ1BWICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmNwdiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0NQVl8xX0NQVl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBDUFYgbGV2ZWwgKDIpIGJ5IENQViAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gQ1JJIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jcmkiIG5hbWU9IkNSSSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jcmkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NSSS9DUklfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDUkkgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvY3MuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY3JpIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DUkkvQ1JJXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNSSSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQ1JJL0NSSV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY3JpIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DUklfMF9OSUNfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENSSSBhbmQgTklDIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jcmkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NSSV8wX1BBTl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ1JJIGFuZCBQQU4iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKworPCEtLSBDVUIgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmN1YiIgbmFtZT0iQ1VCIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmN1YiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ1VCL0NVQl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNVQiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9jdS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jdWIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NVQi9DVUJfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ1VCKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9DVUIvQ1VCXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jdWIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9DVUJfMF9DVUJfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQ1VCIGxldmVsICgxKSBieSBDVUIgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIENYUiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY3hyIiBuYW1lPSJDWFIiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY3hyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DWFIvQ1hSXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ1hSICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2t0Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmN4ciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ1hSL0NYUl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDWFIoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0NYUi9DWFJfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gQ1lNIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jeW0iIG5hbWU9IkNZTSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jeW0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NZTS9DWU1fMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDWU0gKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvY2ouaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY3ltIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DWU0vQ1lNXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNZTSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvQ1lNL0NZTV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBDWVAgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmN5cCIgbmFtZT0iQ1lQIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmN5cCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ1lQL0NZUF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNZUCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9jeS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jeXAiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NZUC9DWVBfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ1lQKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9DWVAvQ1lQXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jeXAiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9DWVBfMF9DWVBfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQ1lQIGxldmVsICgxKSBieSBDWVAgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIENaRSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY3plIiBuYW1lPSJDWkUiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY3plIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9DWkUvQ1pFXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ1pFICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2V6Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmN6ZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvQ1pFL0NaRV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDWkUoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0NaRS9DWkVfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jemUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NaRS9DWkVfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDWkUgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jemUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0NaRS9DWkVfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ1pFKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9DWkUvQ1pFXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jemUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NaRV8wX1VLUl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIGJldHdlZW4gY291bnRyeSBDWkUgYW5kIFVLUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDEtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY3plIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DWkVfMF9VS1JfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciBiZXR3ZWVuIGNvdW50cnkgQ1pFIGFuZCBVS1IiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDAxLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmN6ZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ1pFXzFfQ1pFXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IENaRSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY3plIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DWkVfMV9ERVVfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IENaRSBhbmQgREVVIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jemUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0NaRV8xX0hVTl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgQ1pFIGFuZCBIVU4iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmN6ZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ1pFXzFfUE9MXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBDWkUgYW5kIFBPTCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuY3plIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9DWkVfMV9VS1JfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciBiZXR3ZWVuIGNvdW50cnkgQ1pFIGFuZCBVS1IiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDAxLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmN6ZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvQ1pFXzFfVUtSXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgYmV0d2VlbiBjb3VudHJ5IENaRSBhbmQgVUtSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwMS0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5jemUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9DWkVfMF9DWkVfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgQ1pFIGxldmVsICgxKSBieSBDWkUgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIERFVSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZGV1IiBuYW1lPSJERVUiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZGV1IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9ERVUvREVVXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iREVVICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2dtLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmRldSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvREVVL0RFVV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJERVUoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0RFVS9ERVVfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5kZXUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0RFVS9ERVVfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJERVUgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5kZXUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0RFVS9ERVVfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iREVVKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9ERVUvREVVXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5kZXUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0RFVV8xX0RFVV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBERVUiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmRldSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvREVVXzFfRE5LXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBERVUgYW5kIEROSyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZGV1IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9ERVVfMV9GUkFfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IERFVSBhbmQgRlJBIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5kZXUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0RFVV8xX0xVWF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgREVVIGFuZCBMVVgiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmRldSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvREVVXzFfTkxEXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBERVUgYW5kIE5MRCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZGV1IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9ERVVfMV9QT0xfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IERFVSBhbmQgUE9MIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5kZXUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9ERVVfMF9ERVVfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgREVVIGxldmVsICgxKSBieSBERVUgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIERKSSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZGppIiBuYW1lPSJESkkiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZGppIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9ESkkvREpJXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iREpJICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2RqLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmRqaSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvREpJL0RKSV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJESkkoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0RKSS9ESklfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmRqaSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvREpJXzBfRVJJXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBESkkgYW5kIEVSSSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZGppIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9ESklfMF9FVEhfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IERKSSBhbmQgRVRIIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5kamkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0RKSV8wX1NPTV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgREpJIGFuZCBTT00iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmRqaSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0RKSV8wX0RKSV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBESkkgbGV2ZWwgKDEpIGJ5IERKSSAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gRE1BIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5kbWEiIG5hbWU9IkRNQSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5kbWEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0RNQS9ETUFfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJETUEgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvZG8uaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZG1hIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9ETUEvRE1BXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkRNQSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvRE1BL0RNQV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBETksgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmRuayIgbmFtZT0iRE5LIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmRuayIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvRE5LL0ROS18wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkROSyAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9kYS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5kbmsiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0ROSy9ETktfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRE5LKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9ETksvRE5LXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZG5rIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9ETksvRE5LXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRE5LICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZG5rIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9ETksvRE5LXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkROSygxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvRE5LL0ROS18xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZG5rIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9ETktfMV9ETktfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgRE5LIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5kbmsiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9ETktfMF9ETktfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgRE5LIGxldmVsICgxKSBieSBETksgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIERPTSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZG9tIiBuYW1lPSJET00iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZG9tIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9ET00vRE9NXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRE9NICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2RyLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmRvbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvRE9NL0RPTV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJET00oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0RPTS9ET01fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmRvbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0RPTV8wX0RPTV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBET00gbGV2ZWwgKDEpIGJ5IERPTSAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gRFpBIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5kemEiIG5hbWU9IkRaQSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5kemEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0RaQS9EWkFfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJEWkEgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYWcuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZHphIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9EWkEvRFpBXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkRaQSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvRFpBL0RaQV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmR6YSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvRFpBL0RaQV8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkRaQSAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmR6YSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvRFpBL0RaQV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJEWkEoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0RaQS9EWkFfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5kemEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0RaQS9EWkFfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJEWkEgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5kemEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0RaQS9EWkFfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRFpBKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9EWkEvRFpBXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5kemEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0RaQV8yX0RaQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBEWkEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmR6YSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvRFpBXzJfRVNIXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBEWkEgYW5kIEVTSCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZHphIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9EWkFfMl9MQllfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IERaQSBhbmQgTEJZIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5kemEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0RaQV8yX01BUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgRFpBIGFuZCBNQVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmR6YSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvRFpBXzJfTUxJXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBEWkEgYW5kIE1MSSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZHphIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9EWkFfMl9NUlRfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IERaQSBhbmQgTVJUIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5kemEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0RaQV8yX05FUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgRFpBIGFuZCBORVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmR6YSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvRFpBXzJfVFVOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBEWkEgYW5kIFRVTiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZHphIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvRFpBXzBfRFpBXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIERaQSBsZXZlbCAoMSkgYnkgRFpBICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmR6YSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0RaQV8xX0RaQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBEWkEgbGV2ZWwgKDIpIGJ5IERaQSAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gRUNVIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lY3UiIG5hbWU9IkVDVSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lY3UiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0VDVS9FQ1VfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJFQ1UgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvZWMuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZWN1IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9FQ1UvRUNVXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkVDVSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvRUNVL0VDVV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmVjdSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvRUNVL0VDVV8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkVDVSAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmVjdSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvRUNVL0VDVV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJFQ1UoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0VDVS9FQ1VfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lY3UiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0VDVS9FQ1VfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJFQ1UgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lY3UiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0VDVS9FQ1VfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRUNVKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9FQ1UvRUNVXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lY3UiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0VDVV8yX0VDVV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBFQ1UiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmVjdSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvRUNVXzJfUEVSXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBFQ1UgYW5kIFBFUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZWN1IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvRUNVXzBfRUNVXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEVDVSBsZXZlbCAoMSkgYnkgRUNVICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmVjdSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0VDVV8xX0VDVV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBFQ1UgbGV2ZWwgKDIpIGJ5IEVDVSAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gRUdZIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lZ3kiIG5hbWU9IkVHWSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lZ3kiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0VHWS9FR1lfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJFR1kgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvZWcuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZWd5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9FR1kvRUdZXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkVHWSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvRUdZL0VHWV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmVneSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvRUdZL0VHWV8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkVHWSAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmVneSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvRUdZL0VHWV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJFR1koMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0VHWS9FR1lfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lZ3kiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0VHWS9FR1lfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJFR1kgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lZ3kiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0VHWS9FR1lfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRUdZKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9FR1kvRUdZXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lZ3kiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0VHWV8yX0VHWV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBFR1kiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmVneSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvRUdZXzJfSVNSXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBFR1kgYW5kIElTUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZWd5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9FR1lfMl9MQllfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEVHWSBhbmQgTEJZIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lZ3kiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0VHWV8yX1NETl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgRUdZIGFuZCBTRE4iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmVneSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0VHWV8wX0VHWV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBFR1kgbGV2ZWwgKDEpIGJ5IEVHWSAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lZ3kiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9FR1lfMV9FR1lfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgRUdZIGxldmVsICgyKSBieSBFR1kgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEVSSSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZXJpIiBuYW1lPSJFUkkiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZXJpIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9FUkkvRVJJXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRVJJICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2VyLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmVyaSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvRVJJL0VSSV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJFUkkoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0VSSS9FUklfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lcmkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0VSSS9FUklfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJFUkkgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lcmkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0VSSS9FUklfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRVJJKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9FUkkvRVJJXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZXJpIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9FUkkvRVJJXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRVJJICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZXJpIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9FUkkvRVJJXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkVSSSgyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvRVJJL0VSSV8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZXJpIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9FUklfMl9FUklfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgRVJJIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lcmkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0VSSV8yX0VUSF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgRVJJIGFuZCBFVEgiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmVyaSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvRVJJXzJfU0ROXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBFUkkgYW5kIFNETiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZXJpIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvRVJJXzBfRVJJXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEVSSSBsZXZlbCAoMSkgYnkgRVJJICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmVyaSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0VSSV8xX0VSSV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBFUkkgbGV2ZWwgKDIpIGJ5IEVSSSAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gRVNIIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lc2giIG5hbWU9IkVTSCIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lc2giIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0VTSC9FU0hfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJFU0ggKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3Mvd2kuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZXNoIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9FU0gvRVNIXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkVTSCgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvRVNIL0VTSF8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZXNoIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9FU0hfMF9NQVJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEVTSCBhbmQgTUFSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lc2giIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0VTSF8wX01SVF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgRVNIIGFuZCBNUlQiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKworPCEtLSBFU1AgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmVzcCIgbmFtZT0iRVNQIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmVzcCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvRVNQL0VTUF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkVTUCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9zcC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lc3AiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0VTUC9FU1BfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRVNQKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9FU1AvRVNQXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZXNwIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9FU1AvRVNQXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRVNQICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZXNwIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9FU1AvRVNQXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkVTUCgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvRVNQL0VTUF8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZXNwIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9FU1BfMV9FU1BfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgRVNQIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lc3AiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0VTUF8xX0ZSQV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgRVNQIGFuZCBGUkEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmVzcCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvRVNQXzFfUFJUXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBFU1AgYW5kIFBSVCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZXNwIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvRVNQXzBfRVNQXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEVTUCBsZXZlbCAoMSkgYnkgRVNQICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBFU1QgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmVzdCIgbmFtZT0iRVNUIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmVzdCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvRVNUL0VTVF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkVTVCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9lbi5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lc3QiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0VTVC9FU1RfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRVNUKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9FU1QvRVNUXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5lc3QiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0VTVF8wX0xWQV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgRVNUIGFuZCBMVkEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmVzdCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvRVNUXzBfUlVTXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBFU1QgYW5kIFJVUyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorCis8IS0tIEVUSCAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZXRoIiBuYW1lPSJFVEgiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZXRoIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9FVEgvRVRIXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRVRIICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2V0Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmV0aCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvRVRIL0VUSF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJFVEgoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0VUSC9FVEhfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmV0aCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvRVRIXzBfS0VOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBFVEggYW5kIEtFTiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZXRoIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9FVEhfMF9TRE5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEVUSCBhbmQgU0ROIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ldGgiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0VUSF8wX1NPTV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgRVRIIGFuZCBTT00iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKworPCEtLSBGSU4gLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmZpbiIgbmFtZT0iRklOIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmZpbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvRklOL0ZJTl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkZJTiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9maS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5maW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0ZJTi9GSU5fMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRklOKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9GSU4vRklOXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZmluIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9GSU4vRklOXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRklOICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZmluIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9GSU4vRklOXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkZJTigxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvRklOL0ZJTl8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZmluIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9GSU5fMV9GSU5fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgRklOIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5maW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0ZJTl8xX05PUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgRklOIGFuZCBOT1IiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmZpbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvRklOXzFfUlVTXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBGSU4gYW5kIFJVUyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZmluIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9GSU5fMV9TV0VfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEZJTiBhbmQgU1dFIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5maW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9GSU5fMF9GSU5fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgRklOIGxldmVsICgxKSBieSBGSU4gKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEZKSSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZmppIiBuYW1lPSJGSkkiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZmppIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9GSkkvRkpJXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRkpJICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2ZqLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmZqaSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvRkpJL0ZKSV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJGSkkoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0ZKSS9GSklfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gRkxLIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5mbGsiIG5hbWU9IkZMSyIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5mbGsiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0ZMSy9GTEtfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJGTEsgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvZmsuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZmxrIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9GTEsvRkxLXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkZMSygwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvRkxLL0ZMS18wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBGUkEgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmZyYSIgbmFtZT0iRlJBIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmZyYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvRlJBL0ZSQV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkZSQSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9mci5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5mcmEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0ZSQS9GUkFfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRlJBKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9GUkEvRlJBXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZnJhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9GUkEvRlJBXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRlJBICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZnJhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9GUkEvRlJBXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkZSQSgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvRlJBL0ZSQV8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZnJhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9GUkFfMV9GUkFfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgRlJBIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5mcmEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0ZSQV8xX0lUQV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgRlJBIGFuZCBJVEEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmZyYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvRlJBXzFfTFVYXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBGUkEgYW5kIExVWCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZnJhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvRlJBXzBfRlJBXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEZSQSBsZXZlbCAoMSkgYnkgRlJBICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBGUk8gLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmZybyIgbmFtZT0iRlJPIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmZybyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvRlJPL0ZST18wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkZSTyAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9mby5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5mcm8iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0ZSTy9GUk9fMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRlJPKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9GUk8vRlJPXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEZTTSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZnNtIiBuYW1lPSJGU00iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZnNtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9GU00vRlNNXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iRlNNICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2ZtLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmZzbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvRlNNL0ZTTV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJGU00oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0ZTTS9GU01fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gR0FCIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nYWIiIG5hbWU9IkdBQiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nYWIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dBQi9HQUJfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHQUIgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvZ2IuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2FiIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HQUIvR0FCXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdBQigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvR0FCL0dBQl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdhYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR0FCL0dBQl8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdBQiAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdhYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR0FCL0dBQl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHQUIoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0dBQi9HQUJfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nYWIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dBQi9HQUJfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHQUIgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nYWIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dBQi9HQUJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR0FCKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9HQUIvR0FCXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nYWIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0dBQl8yX0dBQl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBHQUIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdhYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvR0FCXzJfR05RXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBHQUIgYW5kIEdOUSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2FiIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvR0FCXzBfR0FCXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEdBQiBsZXZlbCAoMSkgYnkgR0FCICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdhYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0dBQl8xX0dBQl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBHQUIgbGV2ZWwgKDIpIGJ5IEdBQiAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gR0JSIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nYnIiIG5hbWU9IkdCUiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nYnIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dCUi9HQlJfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHQlIgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvdWsuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2JyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HQlIvR0JSXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdCUigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvR0JSL0dCUl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdiciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR0JSL0dCUl8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdCUiAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdiciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR0JSL0dCUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHQlIoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0dCUi9HQlJfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdiciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvR0JSXzFfR0JSXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IEdCUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2JyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9HQlJfMV9JUkxfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEdCUiBhbmQgSVJMIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nYnIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9HQlJfMF9HQlJfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgR0JSIGxldmVsICgxKSBieSBHQlIgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEdFTyAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2VvIiBuYW1lPSJHRU8iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2VvIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HRU8vR0VPXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR0VPICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2dnLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdlbyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR0VPL0dFT18wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHRU8oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0dFTy9HRU9fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdlbyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvR0VPXzBfUlVTXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBHRU8gYW5kIFJVUyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2VvIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9HRU9fMF9UVVJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEdFTyBhbmQgVFVSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+CisKKzwhLS0gR0dZIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nZ3kiIG5hbWU9IkdHWSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nZ3kiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dHWS9HR1lfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHR1kgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvZ2suaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2d5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HR1kvR0dZXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdHWSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvR0dZL0dHWV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBHSEEgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdoYSIgbmFtZT0iR0hBIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdoYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR0hBL0dIQV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdIQSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9naC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5naGEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dIQS9HSEFfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR0hBKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9HSEEvR0hBXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2hhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HSEEvR0hBXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR0hBICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2hhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HSEEvR0hBXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdIQSgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvR0hBL0dIQV8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdoYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR0hBL0dIQV8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdIQSAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdoYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR0hBL0dIQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHSEEoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0dIQS9HSEFfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdoYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvR0hBXzJfR0hBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IEdIQSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2hhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9HSEFfMl9UR09fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEdIQSBhbmQgVEdPIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5naGEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9HSEFfMF9HSEFfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgR0hBIGxldmVsICgxKSBieSBHSEEgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2hhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvR0hBXzFfR0hBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEdIQSBsZXZlbCAoMikgYnkgR0hBICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBHSUIgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdpYiIgbmFtZT0iR0lCIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdpYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR0lCL0dJQl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdJQiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9naS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5naWIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dJQi9HSUJfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR0lCKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9HSUIvR0lCXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEdJTiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2luIiBuYW1lPSJHSU4iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2luIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HSU4vR0lOXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR0lOICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2d2Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdpbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR0lOL0dJTl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHSU4oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0dJTi9HSU5fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5naW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dJTi9HSU5fMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHSU4gKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdpbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR0lOL0dJTl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHSU4oMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0dJTi9HSU5fMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5naW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dJTi9HSU5fMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHSU4gKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdpbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR0lOL0dJTl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHSU4oMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0dJTi9HSU5fMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdpbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvR0lOXzJfR0lOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IEdJTiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2luIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9HSU5fMl9HTkJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEdJTiBhbmQgR05CIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5naW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0dJTl8yX0xCUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgR0lOIGFuZCBMQlIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdpbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvR0lOXzJfTUxJXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBHSU4gYW5kIE1MSSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2luIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9HSU5fMl9TRU5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEdJTiBhbmQgU0VOIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5naW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0dJTl8yX1NMRV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgR0lOIGFuZCBTTEUiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdpbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0dJTl8wX0dJTl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBHSU4gbGV2ZWwgKDEpIGJ5IEdJTiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5naW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9HSU5fMV9HSU5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgR0lOIGxldmVsICgyKSBieSBHSU4gKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEdMUCAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2xwIiBuYW1lPSJHTFAiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ2xwIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HTFAvR0xQXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR0xQICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2dwLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdscCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR0xQL0dMUF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHTFAoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0dMUC9HTFBfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gR01CIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nbWIiIG5hbWU9IkdNQiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nbWIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dNQi9HTUJfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHTUIgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvZ2EuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ21iIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HTUIvR01CXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdNQigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvR01CL0dNQl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdtYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR01CL0dNQl8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdNQiAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdtYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR01CL0dNQl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHTUIoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0dNQi9HTUJfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nbWIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dNQi9HTUJfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHTUIgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nbWIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dNQi9HTUJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR01CKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9HTUIvR01CXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nbWIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0dNQl8yX0dNQl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBHTUIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdtYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvR01CXzJfU0VOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBHTUIgYW5kIFNFTiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ21iIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvR01CXzBfR01CXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEdNQiBsZXZlbCAoMSkgYnkgR01CICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdtYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0dNQl8xX0dNQl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBHTUIgbGV2ZWwgKDIpIGJ5IEdNQiAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gR05CIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nbmIiIG5hbWU9IkdOQiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nbmIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dOQi9HTkJfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHTkIgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvcHUuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ25iIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HTkIvR05CXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdOQigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvR05CL0dOQl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmduYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR05CL0dOQl8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdOQiAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ25iIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HTkIvR05CXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdOQigxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvR05CL0dOQl8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmduYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR05CL0dOQl8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdOQiAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ25iIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HTkIvR05CXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdOQigyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvR05CL0dOQl8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ25iIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9HTkJfMl9HTkJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgR05CIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nbmIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0dOQl8yX1NFTl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgR05CIGFuZCBTRU4iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmduYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0dOQl8wX0dOQl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBHTkIgbGV2ZWwgKDEpIGJ5IEdOQiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nbmIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9HTkJfMV9HTkJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgR05CIGxldmVsICgyKSBieSBHTkIgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEdOUSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ25xIiBuYW1lPSJHTlEiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ25xIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HTlEvR05RXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR05RICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2VrLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmducSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR05RL0dOUV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHTlEoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0dOUS9HTlFfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nbnEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dOUS9HTlFfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHTlEgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nbnEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dOUS9HTlFfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR05RKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9HTlEvR05RXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ25xIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HTlEvR05RXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR05RICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ25xIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HTlEvR05RXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdOUSgyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvR05RL0dOUV8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ25xIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9HTlFfMl9HTlFfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgR05RIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5nbnEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9HTlFfMF9HTlFfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgR05RIGxldmVsICgxKSBieSBHTlEgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ25xIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvR05RXzFfR05RXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEdOUSBsZXZlbCAoMikgYnkgR05RICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBHUkMgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdyYyIgbmFtZT0iR1JDIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdyYyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR1JDL0dSQ18wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdSQyAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9nci5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ncmMiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dSQy9HUkNfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR1JDKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9HUkMvR1JDXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ3JjIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HUkMvR1JDXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR1JDICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ3JjIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HUkMvR1JDXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdSQygxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvR1JDL0dSQ18xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ3JjIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9HUkNfMV9HUkNfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgR1JDIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ncmMiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0dSQ18xX01LRF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgR1JDIGFuZCBNS0QiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdyYyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvR1JDXzFfTUtEXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBHUkMgYW5kIE1LRCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ3JjIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9HUkNfMV9TUkJfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEdSQyBhbmQgU1JCIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ncmMiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0dSQ18xX1RVUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgR1JDIGFuZCBUVVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdyYyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0dSQ18wX0dSQ18xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBHUkMgbGV2ZWwgKDEpIGJ5IEdSQyAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gR1JEIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ncmQiIG5hbWU9IkdSRCIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ncmQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dSRC9HUkRfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHUkQgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvZ2ouaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ3JkIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HUkQvR1JEXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdSRCgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvR1JEL0dSRF8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ3JkIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvR1JEXzBfR1JEXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEdSRCBsZXZlbCAoMSkgYnkgR1JEICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBHUkwgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdybCIgbmFtZT0iR1JMIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmdybCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR1JML0dSTF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdSTCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9nbC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ncmwiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dSTC9HUkxfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR1JMKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9HUkwvR1JMXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEdUTSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ3RtIiBuYW1lPSJHVE0iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ3RtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HVE0vR1RNXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR1RNICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2d0Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmd0bSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR1RNL0dUTV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHVE0oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0dUTS9HVE1fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmd0bSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvR1RNXzBfSE5EXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBHVE0gYW5kIEhORCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ3RtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9HVE1fMF9NRVhfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEdUTSBhbmQgTUVYIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ndG0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0dUTV8wX1NMVl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgR1RNIGFuZCBTTFYiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKworPCEtLSBHVUYgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmd1ZiIgbmFtZT0iR1VGIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmd1ZiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR1VGL0dVRl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdVRiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9mZy5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ndWYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dVRi9HVUZfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR1VGKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9HVUYvR1VGXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ndWYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0dVRl8wX1NVUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgR1VGIGFuZCBTVVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKworPCEtLSBHVU0gLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmd1bSIgbmFtZT0iR1VNIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmd1bSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR1VNL0dVTV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdVTSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9ncS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ndW0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dVTS9HVU1fMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR1VNKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9HVU0vR1VNXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEdVWSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ3V5IiBuYW1lPSJHVVkiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ3V5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HVVkvR1VZXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR1VZICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2d5Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmd1eSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvR1VZL0dVWV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHVVkoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0dVWS9HVVlfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ndXkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dVWS9HVVlfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJHVVkgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ndXkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0dVWS9HVVlfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR1VZKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9HVVkvR1VZXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ3V5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HVVkvR1VZXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iR1VZICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ3V5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9HVVkvR1VZXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkdVWSgyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvR1VZL0dVWV8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ3V5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9HVVlfMl9HVVlfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgR1VZIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ndXkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0dVWV8yX1NVUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgR1VZIGFuZCBTVVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmd1eSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvR1VZXzJfVkVOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBHVVkgYW5kIFZFTiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuZ3V5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvR1VZXzBfR1VZXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEdVWSBsZXZlbCAoMSkgYnkgR1VZICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmd1eSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0dVWV8xX0dVWV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBHVVkgbGV2ZWwgKDIpIGJ5IEdVWSAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gSEtHIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5oa2ciIG5hbWU9IkhLRyIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5oa2ciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0hLRy9IS0dfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJIS0cgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvaGsuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaGtnIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9IS0cvSEtHXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkhLRygwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvSEtHL0hLR18wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBITUQgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmhtZCIgbmFtZT0iSE1EIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmhtZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSE1EL0hNRF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkhNRCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9obS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5obWQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0hNRC9ITURfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSE1EKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9ITUQvSE1EXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEhORCAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaG5kIiBuYW1lPSJITkQiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaG5kIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9ITkQvSE5EXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSE5EICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2hvLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmhuZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSE5EL0hORF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJITkQoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0hORC9ITkRfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmhuZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvSE5EXzBfTklDXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBITkQgYW5kIE5JQyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaG5kIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9ITkRfMF9TTFZfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEhORCBhbmQgU0xWIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5obmQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9ITkRfMF9ITkRfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgSE5EIGxldmVsICgxKSBieSBITkQgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEhSViAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaHJ2IiBuYW1lPSJIUlYiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaHJ2IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9IUlYvSFJWXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSFJWICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2hyLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmhydiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSFJWL0hSVl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJIUlYoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0hSVi9IUlZfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ocnYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0hSVi9IUlZfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJIUlYgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ocnYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0hSVi9IUlZfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSFJWKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9IUlYvSFJWXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ocnYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0hSVl8xX0hSVl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBIUlYiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmhydiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvSFJWXzFfSFVOXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBIUlYgYW5kIEhVTiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaHJ2IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9IUlZfMV9TUkJfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEhSViBhbmQgU1JCIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ocnYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0hSVl8xX1NWTl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgSFJWIGFuZCBTVk4iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmhydiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0hSVl8wX0hSVl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBIUlYgbGV2ZWwgKDEpIGJ5IEhSViAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gSFRJIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5odGkiIG5hbWU9IkhUSSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5odGkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0hUSS9IVElfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJIVEkgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvaGEuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaHRpIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9IVEkvSFRJXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkhUSSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvSFRJL0hUSV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBIVU4gLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmh1biIgbmFtZT0iSFVOIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmh1biIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSFVOL0hVTl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkhVTiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9odS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5odW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0hVTi9IVU5fMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSFVOKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9IVU4vSFVOXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaHVuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9IVU4vSFVOXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSFVOICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaHVuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9IVU4vSFVOXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkhVTigxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvSFVOL0hVTl8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaHVuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9IVU5fMF9VS1JfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciBiZXR3ZWVuIGNvdW50cnkgSFVOIGFuZCBVS1IiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDAxLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmh1biIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvSFVOXzBfVUtSXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgYmV0d2VlbiBjb3VudHJ5IEhVTiBhbmQgVUtSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwMS0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5odW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0hVTl8xX0hVTl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBIVU4iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmh1biIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvSFVOXzFfUk9VXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBIVU4gYW5kIFJPVSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaHVuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9IVU5fMV9TUkJfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEhVTiBhbmQgU1JCIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5odW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0hVTl8xX1NWTl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgSFVOIGFuZCBTVk4iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmh1biIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvSFVOXzFfVUtSXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgYmV0d2VlbiBjb3VudHJ5IEhVTiBhbmQgVUtSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwMS0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5odW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0hVTl8xX1VLUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIGJldHdlZW4gY291bnRyeSBIVU4gYW5kIFVLUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDEtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaHVuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvSFVOXzBfSFVOXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEhVTiBsZXZlbCAoMSkgYnkgSFVOICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBJRE4gLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlkbiIgbmFtZT0iSUROIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlkbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSUROL0lETl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IklETiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9pZC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pZG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0lETi9JRE5fMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSUROKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9JRE4vSUROXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaWRuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9JRE4vSUROXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSUROICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaWRuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9JRE4vSUROXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IklETigxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvSUROL0lETl8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlkbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSUROL0lETl8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IklETiAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlkbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSUROL0lETl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJJRE4oMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0lETi9JRE5fMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlkbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvSUROXzJfSUROXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IElETiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaWRuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9JRE5fMl9NWVNfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IElETiBhbmQgTVlTIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pZG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0lETl8yX1BOR18wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgSUROIGFuZCBQTkciIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlkbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvSUROXzJfUE5HXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBJRE4gYW5kIFBORyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaWRuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvSUROXzBfSUROXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIElETiBsZXZlbCAoMSkgYnkgSUROICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlkbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0lETl8xX0lETl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBJRE4gbGV2ZWwgKDIpIGJ5IElETiAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gSU1OIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pbW4iIG5hbWU9IklNTiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pbW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0lNTi9JTU5fMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJJTU4gKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvaW0uaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaW1uIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9JTU4vSU1OXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IklNTigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvSU1OL0lNTl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBJTkQgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmluZCIgbmFtZT0iSU5EIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmluZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSU5EL0lORF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IklORCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9pbi5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pbmQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0lORC9JTkRfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSU5EKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9JTkQvSU5EXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaW5kIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9JTkQvSU5EXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSU5EICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaW5kIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9JTkQvSU5EXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IklORCgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvSU5EL0lORF8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmluZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSU5EL0lORF8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IklORCAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmluZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSU5EL0lORF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJJTkQoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0lORC9JTkRfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmluZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvSU5EXzJfSU5EXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IElORCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaW5kIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9JTkRfMl9OUExfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IElORCBhbmQgTlBMIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pbmQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0lORF8yX1BBS18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgSU5EIGFuZCBQQUsiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmluZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0lORF8wX0lORF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBJTkQgbGV2ZWwgKDEpIGJ5IElORCAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pbmQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9JTkRfMV9JTkRfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgSU5EIGxldmVsICgyKSBieSBJTkQgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIElPVCAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaW90IiBuYW1lPSJJT1QiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaW90IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9JT1QvSU9UXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSU9UICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2lvLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlvdCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSU9UL0lPVF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJJT1QoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0lPVC9JT1RfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gSVJMIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pcmwiIG5hbWU9IklSTCIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pcmwiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0lSTC9JUkxfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJJUkwgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvZWkuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXJsIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9JUkwvSVJMXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IklSTCgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvSVJML0lSTF8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlybCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSVJML0lSTF8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IklSTCAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlybCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSVJML0lSTF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJJUkwoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0lSTC9JUkxfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlybCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvSVJMXzFfSVJMXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IElSTCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXJsIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvSVJMXzBfSVJMXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIElSTCBsZXZlbCAoMSkgYnkgSVJMICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBJUk4gLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlybiIgbmFtZT0iSVJOIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlybiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSVJOL0lSTl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IklSTiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9pci5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pcm4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0lSTi9JUk5fMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSVJOKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9JUk4vSVJOXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXJuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9JUk4vSVJOXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSVJOICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXJuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9JUk4vSVJOXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IklSTigxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvSVJOL0lSTl8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlybiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSVJOL0lSTl8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IklSTiAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlybiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSVJOL0lSTl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJJUk4oMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0lSTi9JUk5fMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlybiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvSVJOXzJfSVJOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IElSTiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXJuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9JUk5fMl9JUlFfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IElSTiBhbmQgSVJRIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pcm4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0lSTl8yX1BBS18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgSVJOIGFuZCBQQUsiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlybiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvSVJOXzJfVEtNXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBJUk4gYW5kIFRLTSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXJuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9JUk5fMl9UVVJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IElSTiBhbmQgVFVSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pcm4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9JUk5fMF9JUk5fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgSVJOIGxldmVsICgxKSBieSBJUk4gKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXJuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvSVJOXzFfSVJOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIElSTiBsZXZlbCAoMikgYnkgSVJOICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBJUlEgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlycSIgbmFtZT0iSVJRIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlycSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSVJRL0lSUV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IklSUSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9pei5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pcnEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0lSUS9JUlFfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSVJRKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9JUlEvSVJRXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXJxIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9JUlEvSVJRXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSVJRICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXJxIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9JUlEvSVJRXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IklSUSgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvSVJRL0lSUV8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlycSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSVJRL0lSUV8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IklSUSAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlycSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSVJRL0lSUV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJJUlEoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0lSUS9JUlFfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlycSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvSVJRXzJfSVJRXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IElSUSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXJxIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9JUlFfMl9KT1JfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IElSUSBhbmQgSk9SIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pcnEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0lSUV8yX0tXVF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgSVJRIGFuZCBLV1QiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlycSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvSVJRXzJfU0FVXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBJUlEgYW5kIFNBVSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXJxIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9JUlFfMl9TWVJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IElSUSBhbmQgU1lSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pcnEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0lSUV8yX1RVUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgSVJRIGFuZCBUVVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlycSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0lSUV8wX0lSUV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBJUlEgbGV2ZWwgKDEpIGJ5IElSUSAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pcnEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9JUlFfMV9JUlFfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgSVJRIGxldmVsICgyKSBieSBJUlEgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIElTTCAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXNsIiBuYW1lPSJJU0wiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXNsIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9JU0wvSVNMXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSVNMICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2ljLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlzbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSVNML0lTTF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJJU0woMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0lTTC9JU0xfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pc2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0lTTC9JU0xfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJJU0wgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pc2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0lTTC9JU0xfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSVNMKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvSVNML0lTTF8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXNsIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9JU0xfMV9JU0xfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgSVNMIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pc2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9JU0xfMF9JU0xfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgSVNMIGxldmVsICgxKSBieSBJU0wgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIElTUiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXNyIiBuYW1lPSJJU1IiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXNyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9JU1IvSVNSXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSVNSICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2lzLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlzciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSVNSL0lTUl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJJU1IoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0lTUi9JU1JfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pc3IiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0lTUi9JU1JfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJJU1IgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iSXNyYWVsIENEQyBiaXRtYXAgKFNjYW5uZWQpIiB2YWxpZD0ic3RhcnQ9MjAwMS0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pc3IiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0lTUi9JU1JfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSVNSKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9JU1IvSVNSXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXNyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9JU1IvSVNSXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSVNSICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9IklzcmFlbCBDREMgYml0bWFwIChTY2FubmVkKSIgdmFsaWQ9InN0YXJ0PTIwMDEtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXNyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9JU1IvSVNSXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IklTUigyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvSVNSL0lTUl8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXNyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9JU1JfMl9JU1JfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgSVNSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pc3IiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0lTUl8yX0pPUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgSVNSIGFuZCBKT1IiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlzciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvSVNSXzJfTEJOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBJU1IgYW5kIExCTiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXNyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9JU1JfMl9QU0VfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IElTUiBhbmQgUFNFIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pc3IiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0lTUl8yX1NZUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgSVNSIGFuZCBTWVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmlzciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0lTUl8wX0lTUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBJU1IgbGV2ZWwgKDEpIGJ5IElTUiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pc3IiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9JU1JfMV9JU1JfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgSVNSIGxldmVsICgyKSBieSBJU1IgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIElUQSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXRhIiBuYW1lPSJJVEEiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXRhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9JVEEvSVRBXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSVRBICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2l0Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLml0YSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSVRBL0lUQV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJJVEEoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0lUQS9JVEFfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pdGEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0lUQS9JVEFfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJJVEEgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pdGEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0lUQS9JVEFfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSVRBKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9JVEEvSVRBXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pdGEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0lUQV8xX0lUQV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBJVEEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLml0YSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvSVRBXzFfU01SXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBJVEEgYW5kIFNNUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuaXRhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9JVEFfMV9TVk5fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IElUQSBhbmQgU1ZOIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5pdGEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9JVEFfMF9JVEFfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgSVRBIGxldmVsICgxKSBieSBJVEEgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEpBTSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuamFtIiBuYW1lPSJKQU0iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuamFtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9KQU0vSkFNXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSkFNICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2ptLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmphbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSkFNL0pBTV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJKQU0oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0pBTS9KQU1fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gSkVZIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5qZXkiIG5hbWU9IkpFWSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5qZXkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0pFWS9KRVlfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJKRVkgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvamUuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuamV5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9KRVkvSkVZXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkpFWSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvSkVZL0pFWV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBKT1IgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmpvciIgbmFtZT0iSk9SIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmpvciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSk9SL0pPUl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkpPUiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9qby5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5qb3IiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0pPUi9KT1JfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSk9SKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9KT1IvSk9SXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuam9yIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9KT1IvSk9SXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSk9SICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuam9yIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9KT1IvSk9SXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkpPUigxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvSk9SL0pPUl8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmpvciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSk9SL0pPUl8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkpPUiAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmpvciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSk9SL0pPUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJKT1IoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0pPUi9KT1JfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmpvciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvSk9SXzJfSk9SXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IEpPUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuam9yIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9KT1JfMl9QU0VfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEpPUiBhbmQgUFNFIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5qb3IiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0pPUl8yX1NBVV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgSk9SIGFuZCBTQVUiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmpvciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvSk9SXzJfU1lSXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBKT1IgYW5kIFNZUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuam9yIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvSk9SXzBfSk9SXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEpPUiBsZXZlbCAoMSkgYnkgSk9SICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmpvciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0pPUl8xX0pPUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBKT1IgbGV2ZWwgKDIpIGJ5IEpPUiAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gSlBOIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5qcG4iIG5hbWU9IkpQTiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5qcG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0pQTi9KUE5fMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJKUE4gKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvamEuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuanBuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9KUE4vSlBOXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkpQTigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvSlBOL0pQTl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmpwbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSlBOL0pQTl8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkpQTiAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmpwbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvSlBOL0pQTl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJKUE4oMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0pQTi9KUE5fMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5qcG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0pQTi9KUE5fMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJKUE4gKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5qcG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0pQTi9KUE5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iSlBOKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9KUE4vSlBOXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5qcG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0pQTl8yX0pQTl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBKUE4iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmpwbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0pQTl8wX0pQTl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBKUE4gbGV2ZWwgKDEpIGJ5IEpQTiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5qcG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9KUE5fMV9KUE5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgSlBOIGxldmVsICgyKSBieSBKUE4gKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEtBWiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2F6IiBuYW1lPSJLQVoiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2F6IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9LQVovS0FaXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iS0FaICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2t6Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtheiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvS0FaL0tBWl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJLQVooMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0tBWi9LQVpfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rYXoiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0tBWi9LQVpfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJLQVogKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rYXoiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0tBWi9LQVpfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iS0FaKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9LQVovS0FaXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2F6IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9LQVovS0FaXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iS0FaICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2F6IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9LQVovS0FaXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IktBWigyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvS0FaL0tBWl8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2F6IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9LQVpfMl9LQVpfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgS0FaIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rYXoiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0tBWl8yX0tHWl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgS0FaIGFuZCBLR1oiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtheiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvS0FaXzJfUlVTXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBLQVogYW5kIFJVUyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2F6IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9LQVpfMl9US01fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEtBWiBhbmQgVEtNIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rYXoiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0tBWl8yX1VaQl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgS0FaIGFuZCBVWkIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtheiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0tBWl8wX0tBWl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBLQVogbGV2ZWwgKDEpIGJ5IEtBWiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rYXoiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9LQVpfMV9LQVpfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgS0FaIGxldmVsICgyKSBieSBLQVogKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEtFTiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2VuIiBuYW1lPSJLRU4iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2VuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9LRU4vS0VOXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iS0VOICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2tlLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtlbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvS0VOL0tFTl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJLRU4oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0tFTi9LRU5fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rZW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0tFTi9LRU5fMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJLRU4gKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rZW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0tFTi9LRU5fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iS0VOKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9LRU4vS0VOXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2VuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9LRU4vS0VOXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iS0VOICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2VuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9LRU4vS0VOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IktFTigyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvS0VOL0tFTl8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2VuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9LRU5fMl9LRU5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgS0VOIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rZW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0tFTl8yX1NETl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgS0VOIGFuZCBTRE4iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtlbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvS0VOXzJfU09NXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBLRU4gYW5kIFNPTSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2VuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9LRU5fMl9UWkFfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEtFTiBhbmQgVFpBIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rZW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0tFTl8yX1VHQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgS0VOIGFuZCBVR0EiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtlbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0tFTl8wX0tFTl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBLRU4gbGV2ZWwgKDEpIGJ5IEtFTiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rZW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9LRU5fMV9LRU5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgS0VOIGxldmVsICgyKSBieSBLRU4gKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEtHWiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2d6IiBuYW1lPSJLR1oiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2d6IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9LR1ovS0daXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iS0daICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2tnLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtneiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvS0daL0tHWl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJLR1ooMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0tHWi9LR1pfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rZ3oiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0tHWi9LR1pfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJLR1ogKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rZ3oiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0tHWi9LR1pfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iS0daKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9LR1ovS0daXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2d6IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9LR1ovS0daXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iS0daICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2d6IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9LR1ovS0daXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IktHWigyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvS0daL0tHWl8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2d6IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9LR1pfMl9LR1pfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgS0daIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rZ3oiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0tHWl8yX1RKS18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgS0daIGFuZCBUSksiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtneiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvS0daXzJfVVpCXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBLR1ogYW5kIFVaQiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2d6IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvS0daXzBfS0daXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEtHWiBsZXZlbCAoMSkgYnkgS0daICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtneiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0tHWl8xX0tHWl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBLR1ogbGV2ZWwgKDIpIGJ5IEtHWiAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gS0hNIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5raG0iIG5hbWU9IktITSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5raG0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0tITS9LSE1fMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJLSE0gKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvY2IuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2htIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9LSE0vS0hNXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IktITSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvS0hNL0tITV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtobSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvS0hNL0tITV8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IktITSAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtobSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvS0hNL0tITV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJLSE0oMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0tITS9LSE1fMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5raG0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0tITS9LSE1fMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJLSE0gKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5raG0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0tITS9LSE1fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iS0hNKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9LSE0vS0hNXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5raG0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0tITV8yX0tITV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBLSE0iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtobSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvS0hNXzJfTEFPXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBLSE0gYW5kIExBTyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2htIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9LSE1fMl9USEFfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEtITSBhbmQgVEhBIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5raG0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0tITV8yX1ZOTV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgS0hNIGFuZCBWTk0iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtobSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0tITV8wX0tITV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBLSE0gbGV2ZWwgKDEpIGJ5IEtITSAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5raG0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9LSE1fMV9LSE1fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgS0hNIGxldmVsICgyKSBieSBLSE0gKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIEtJUiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2lyIiBuYW1lPSJLSVIiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua2lyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9LSVIvS0lSXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iS0lSICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2tyLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtpciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvS0lSL0tJUl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJLSVIoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0tJUi9LSVJfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gS05BIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rbmEiIG5hbWU9IktOQSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rbmEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0tOQS9LTkFfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJLTkEgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3Mvc2MuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua25hIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9LTkEvS05BXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IktOQSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvS05BL0tOQV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBLT1IgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtvciIgbmFtZT0iS09SIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtvciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvS09SL0tPUl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IktPUiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9rcy5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rb3IiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0tPUi9LT1JfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iS09SKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9LT1IvS09SXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua29yIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9LT1IvS09SXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iS09SICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua29yIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9LT1IvS09SXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IktPUigxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvS09SL0tPUl8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtvciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvS09SL0tPUl8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IktPUiAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtvciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvS09SL0tPUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJLT1IoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0tPUi9LT1JfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmtvciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvS09SXzJfS09SXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IEtPUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua29yIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9LT1JfMl9QUktfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEtPUiBhbmQgUFJLIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rb3IiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9LT1JfMF9LT1JfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgS09SIGxldmVsICgxKSBieSBLT1IgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua29yIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvS09SXzFfS09SXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEtPUiBsZXZlbCAoMikgYnkgS09SICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBLV1QgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmt3dCIgbmFtZT0iS1dUIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmt3dCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvS1dUL0tXVF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IktXVCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9rdS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rd3QiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0tXVC9LV1RfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iS1dUKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9LV1QvS1dUXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua3d0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9LV1QvS1dUXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iS1dUICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua3d0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9LV1QvS1dUXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IktXVCgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvS1dUL0tXVF8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmt3dCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvS1dUL0tXVF8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IktXVCAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmt3dCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvS1dUL0tXVF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJLV1QoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0tXVC9LV1RfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmt3dCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvS1dUXzJfS1dUXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IEtXVCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua3d0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9LV1RfMl9TQVVfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IEtXVCBhbmQgU0FVIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5rd3QiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9LV1RfMF9LV1RfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgS1dUIGxldmVsICgxKSBieSBLV1QgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMua3d0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvS1dUXzFfS1dUXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEtXVCBsZXZlbCAoMikgYnkgS1dUICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBMQU8gLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxhbyIgbmFtZT0iTEFPIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxhbyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTEFPL0xBT18wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkxBTyAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9sYS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sYW8iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0xBTy9MQU9fMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTEFPKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9MQU8vTEFPXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGFvIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9MQU8vTEFPXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTEFPICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGFvIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9MQU8vTEFPXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkxBTygxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTEFPL0xBT18xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxhbyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTEFPL0xBT18yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkxBTyAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxhbyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTEFPL0xBT18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJMQU8oMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0xBTy9MQU9fMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxhbyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTEFPXzJfTEFPXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IExBTyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGFvIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9MQU9fMl9USEFfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IExBTyBhbmQgVEhBIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sYW8iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0xBT18yX1ZOTV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgTEFPIGFuZCBWTk0iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxhbyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0xBT18wX0xBT18xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBMQU8gbGV2ZWwgKDEpIGJ5IExBTyAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sYW8iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9MQU9fMV9MQU9fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgTEFPIGxldmVsICgyKSBieSBMQU8gKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIExCTiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGJuIiBuYW1lPSJMQk4iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGJuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9MQk4vTEJOXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTEJOICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2xlLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxibiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTEJOL0xCTl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJMQk4oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0xCTi9MQk5fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sYm4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0xCTi9MQk5fMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJMQk4gKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sYm4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0xCTi9MQk5fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTEJOKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9MQk4vTEJOXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGJuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9MQk4vTEJOXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTEJOICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGJuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9MQk4vTEJOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkxCTigyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTEJOL0xCTl8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGJuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9MQk5fMl9MQk5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgTEJOIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sYm4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0xCTl8yX1NZUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgTEJOIGFuZCBTWVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxibiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0xCTl8wX0xCTl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBMQk4gbGV2ZWwgKDEpIGJ5IExCTiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sYm4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9MQk5fMV9MQk5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgTEJOIGxldmVsICgyKSBieSBMQk4gKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIExCUiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGJyIiBuYW1lPSJMQlIiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGJyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9MQlIvTEJSXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTEJSICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2xpLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxiciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTEJSL0xCUl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJMQlIoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0xCUi9MQlJfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sYnIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0xCUi9MQlJfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJMQlIgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sYnIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0xCUi9MQlJfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTEJSKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9MQlIvTEJSXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGJyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9MQlIvTEJSXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTEJSICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGJyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9MQlIvTEJSXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkxCUigyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTEJSL0xCUl8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGJyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9MQlJfMl9MQlJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgTEJSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sYnIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0xCUl8yX1NMRV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgTEJSIGFuZCBTTEUiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxiciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0xCUl8wX0xCUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBMQlIgbGV2ZWwgKDEpIGJ5IExCUiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sYnIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9MQlJfMV9MQlJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgTEJSIGxldmVsICgyKSBieSBMQlIgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIExCWSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGJ5IiBuYW1lPSJMQlkiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGJ5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9MQlkvTEJZXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTEJZICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2x5Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxieSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTEJZL0xCWV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJMQlkoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0xCWS9MQllfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sYnkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0xCWS9MQllfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJMQlkgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sYnkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0xCWS9MQllfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTEJZKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9MQlkvTEJZXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sYnkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0xCWV8xX0xCWV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBMQlkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxieSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTEJZXzFfTkVSXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBMQlkgYW5kIE5FUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGJ5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9MQllfMV9TRE5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IExCWSBhbmQgU0ROIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sYnkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0xCWV8xX1RDRF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgTEJZIGFuZCBUQ0QiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxieSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTEJZXzFfVFVOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBMQlkgYW5kIFRVTiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGJ5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvTEJZXzBfTEJZXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIExCWSBsZXZlbCAoMSkgYnkgTEJZICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBMQ0EgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxjYSIgbmFtZT0iTENBIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxjYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTENBL0xDQV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkxDQSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9zdC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sY2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0xDQS9MQ0FfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTENBKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9MQ0EvTENBXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIExJRSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGllIiBuYW1lPSJMSUUiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGllIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9MSUUvTElFXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTElFICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2xzLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxpZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTElFL0xJRV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJMSUUoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0xJRS9MSUVfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5saWUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0xJRS9MSUVfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJMSUUgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5saWUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0xJRS9MSUVfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTElFKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9MSUUvTElFXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5saWUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0xJRV8xX0xJRV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBMSUUiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxpZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL0xJRV8wX0xJRV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBMSUUgbGV2ZWwgKDEpIGJ5IExJRSAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gTEtBIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sa2EiIG5hbWU9IkxLQSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sa2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0xLQS9MS0FfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJMS0EgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvY2UuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubGthIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9MS0EvTEtBXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkxLQSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTEtBL0xLQV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBMU08gLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxzbyIgbmFtZT0iTFNPIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxzbyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTFNPL0xTT18wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkxTTyAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9sdC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sc28iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0xTTy9MU09fMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTFNPKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9MU08vTFNPXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubHNvIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9MU08vTFNPXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTFNPICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubHNvIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9MU08vTFNPXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkxTTygxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTFNPL0xTT18xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxzbyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTFNPL0xTT18yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkxTTyAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxzbyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTFNPL0xTT18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJMU08oMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0xTTy9MU09fMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmxzbyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTFNPXzJfTFNPXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IExTTyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubHNvIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9MU09fMl9aQUZfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IExTTyBhbmQgWkFGIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sc28iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9MU09fMF9MU09fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgTFNPIGxldmVsICgxKSBieSBMU08gKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubHNvIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvTFNPXzFfTFNPXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIExTTyBsZXZlbCAoMikgYnkgTFNPICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBMVFUgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmx0dSIgbmFtZT0iTFRVIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmx0dSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTFRVL0xUVV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkxUVSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9saC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sdHUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0xUVS9MVFVfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTFRVKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9MVFUvTFRVXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sdHUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0xUVV8wX0xWQV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgTFRVIGFuZCBMVkEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmx0dSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTFRVXzBfUE9MXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBMVFUgYW5kIFBPTCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubHR1IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9MVFVfMF9SVVNfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IExUVSBhbmQgUlVTIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+CisKKzwhLS0gTFVYIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sdXgiIG5hbWU9IkxVWCIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sdXgiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0xVWC9MVVhfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJMVVggKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbHUuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubHV4IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9MVVgvTFVYXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkxVWCgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTFVYL0xVWF8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmx1eCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTFVYL0xVWF8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkxVWCAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmx1eCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTFVYL0xVWF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJMVVgoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L0xVWC9MVVhfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmx1eCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTFVYXzFfTFVYXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IExVWCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubHV4IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvTFVYXzBfTFVYXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIExVWCBsZXZlbCAoMSkgYnkgTFVYICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBMVkEgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmx2YSIgbmFtZT0iTFZBIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLmx2YSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTFZBL0xWQV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkxWQSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9sZy5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sdmEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L0xWQS9MVkFfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTFZBKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9MVkEvTFZBXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5sdmEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL0xWQV8wX1JVU18xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgTFZBIGFuZCBSVVMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKworPCEtLSBNQUMgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1hYyIgbmFtZT0iTUFDIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1hYyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTUFDL01BQ18wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1BQyAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9tYy5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tYWMiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01BQy9NQUNfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTUFDKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9NQUMvTUFDXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWFjIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NQUMvTUFDXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTUFDICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWFjIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NQUMvTUFDXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1BQygxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTUFDL01BQ18xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1hYyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTUFDL01BQ18yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1BQyAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1hYyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTUFDL01BQ18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNQUMoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L01BQy9NQUNfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1hYyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTUFDXzJfTUFDXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IE1BQyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWFjIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvTUFDXzBfTUFDXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIE1BQyBsZXZlbCAoMSkgYnkgTUFDICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1hYyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL01BQ18xX01BQ18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBNQUMgbGV2ZWwgKDIpIGJ5IE1BQyAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gTUFSIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tYXIiIG5hbWU9Ik1BUiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tYXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01BUi9NQVJfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNQVIgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbW8uaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWFyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NQVIvTUFSXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1BUigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTUFSL01BUl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1hciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTUFSL01BUl8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1BUiAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1hciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTUFSL01BUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNQVIoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L01BUi9NQVJfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tYXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01BUi9NQVJfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNQVIgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tYXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01BUi9NQVJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTUFSKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9NQVIvTUFSXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tYXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL01BUl8yX01BUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBNQVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1hciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTUFSXzJfTVJUXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBNQVIgYW5kIE1SVCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWFyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvTUFSXzBfTUFSXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIE1BUiBsZXZlbCAoMSkgYnkgTUFSICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1hciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL01BUl8xX01BUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBNQVIgbGV2ZWwgKDIpIGJ5IE1BUiAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gTUNPIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tY28iIG5hbWU9Ik1DTyIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tY28iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01DTy9NQ09fMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNQ08gKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbW4uaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWNvIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NQ08vTUNPXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1DTygwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTUNPL01DT18wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWNvIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvTUNPXzBfTUNPXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIE1DTyBsZXZlbCAoMSkgYnkgTUNPICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBNREEgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1kYSIgbmFtZT0iTURBIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1kYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTURBL01EQV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1EQSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9tZC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tZGEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01EQS9NREFfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTURBKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9NREEvTURBXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWRhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NREEvTURBXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTURBICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWRhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NREEvTURBXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1EQSgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTURBL01EQV8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1kYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTURBL01EQV8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1EQSAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1kYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTURBL01EQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNREEoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L01EQS9NREFfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1kYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTURBXzBfVUtSXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgYmV0d2VlbiBjb3VudHJ5IE1EQSBhbmQgVUtSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwMS0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tZGEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL01EQV8wX1VLUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIGJldHdlZW4gY291bnRyeSBNREEgYW5kIFVLUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDEtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWRhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9NREFfMV9VS1JfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciBiZXR3ZWVuIGNvdW50cnkgTURBIGFuZCBVS1IiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDAxLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1kYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTURBXzFfVUtSXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgYmV0d2VlbiBjb3VudHJ5IE1EQSBhbmQgVUtSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwMS0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tZGEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL01EQV8yX01EQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBNREEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1kYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTURBXzJfUk9VXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBNREEgYW5kIFJPVSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWRhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9NREFfMl9VS1JfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciBiZXR3ZWVuIGNvdW50cnkgTURBIGFuZCBVS1IiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDAxLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1kYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTURBXzJfVUtSXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgYmV0d2VlbiBjb3VudHJ5IE1EQSBhbmQgVUtSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwMS0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tZGEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9NREFfMF9NREFfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgTURBIGxldmVsICgxKSBieSBNREEgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWRhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvTURBXzFfTURBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIE1EQSBsZXZlbCAoMikgYnkgTURBICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBNREcgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1kZyIgbmFtZT0iTURHIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1kZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTURHL01ER18wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1ERyAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9tYS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tZGciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01ERy9NREdfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTURHKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9NREcvTURHXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWRnIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NREcvTURHXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTURHICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWRnIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NREcvTURHXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1ERygxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTURHL01ER18xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1kZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTURHL01ER18yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1ERyAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1kZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTURHL01ER18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNREcoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L01ERy9NREdfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1kZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTURHXzJfTURHXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IE1ERyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWRnIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvTURHXzBfTURHXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIE1ERyBsZXZlbCAoMSkgYnkgTURHICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1kZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL01ER18xX01ER18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBNREcgbGV2ZWwgKDIpIGJ5IE1ERyAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gTURWIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tZHYiIG5hbWU9Ik1EViIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tZHYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01EVi9NRFZfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNRFYgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbXYuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWR2IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NRFYvTURWXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1EVigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTURWL01EVl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBNRVggLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1leCIgbmFtZT0iTUVYIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1leCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTUVYL01FWF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1FWCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9teC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tZXgiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01FWC9NRVhfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTUVYKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9NRVgvTUVYXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWV4IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NRVgvTUVYXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTUVYICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWV4IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NRVgvTUVYXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1FWCgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTUVYL01FWF8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWV4IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9NRVhfMV9NRVhfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgTUVYIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tZXgiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL01FWF8xX1VTQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgTUVYIGFuZCBVU0EiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1leCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL01FWF8wX01FWF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBNRVggbGV2ZWwgKDEpIGJ5IE1FWCAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gTUhMIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5taGwiIG5hbWU9Ik1ITCIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5taGwiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01ITC9NSExfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNSEwgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3Mvcm0uaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWhsIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NSEwvTUhMXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1ITCgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTUhML01ITF8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBNS0QgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1rZCIgbmFtZT0iTUtEIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1rZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTUtEL01LRF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1LRCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9tay5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ta2QiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01LRC9NS0RfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTUtEKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9NS0QvTUtEXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ta2QiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL01LRF8wX1NSQl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgTUtEIGFuZCBTUkIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1rZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTUtEXzJfTUtEXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IE1LRCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWtkIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9NS0RfMl9TUkJfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IE1LRCBhbmQgU1JCIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+CisKKzwhLS0gTUxJIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tbGkiIG5hbWU9Ik1MSSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tbGkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01MSS9NTElfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNTEkgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbWwuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWxpIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NTEkvTUxJXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1MSSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTUxJL01MSV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWxpIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9NTElfMF9NUlRfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IE1MSSBhbmQgTVJUIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tbGkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL01MSV8wX05FUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgTUxJIGFuZCBORVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1saSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTUxJXzBfU0VOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBNTEkgYW5kIFNFTiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorCis8IS0tIE1MVCAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWx0IiBuYW1lPSJNTFQiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubWx0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NTFQvTUxUXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTUxUICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL210Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1sdCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTUxUL01MVF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNTFQoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L01MVC9NTFRfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1sdCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL01MVF8wX01MVF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBNTFQgbGV2ZWwgKDEpIGJ5IE1MVCAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gTU1SIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tbXIiIG5hbWU9Ik1NUiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tbXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01NUi9NTVJfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNTVIgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYm0uaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubW1yIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NTVIvTU1SXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1NUigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTU1SL01NUl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBNTkUgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1uZSIgbmFtZT0iTU5FIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1uZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTU5FL01ORV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1ORSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9tai5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tbmUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01ORS9NTkVfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTU5FKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9NTkUvTU5FXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIE1ORyAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubW5nIiBuYW1lPSJNTkciIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubW5nIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NTkcvTU5HXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTU5HICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL21nLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1uZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTU5HL01OR18wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNTkcoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L01ORy9NTkdfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tbmciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01ORy9NTkdfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNTkcgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tbmciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01ORy9NTkdfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTU5HKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9NTkcvTU5HXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubW5nIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NTkcvTU5HXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTU5HICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubW5nIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NTkcvTU5HXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1ORygyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTU5HL01OR18yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubW5nIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9NTkdfMl9NTkdfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgTU5HIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tbmciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL01OR18yX1JVU18xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgTU5HIGFuZCBSVVMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1uZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL01OR18wX01OR18xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBNTkcgbGV2ZWwgKDEpIGJ5IE1ORyAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tbmciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9NTkdfMV9NTkdfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgTU5HIGxldmVsICgyKSBieSBNTkcgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIE1OUCAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubW5wIiBuYW1lPSJNTlAiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubW5wIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NTlAvTU5QXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTU5QICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2NxLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1ucCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTU5QL01OUF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNTlAoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L01OUC9NTlBfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gTU9aIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tb3oiIG5hbWU9Ik1PWiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tb3oiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01PWi9NT1pfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNT1ogKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbXouaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubW96IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NT1ovTU9aXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1PWigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTU9aL01PWl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1veiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTU9aL01PWl8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1PWiAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1veiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTU9aL01PWl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNT1ooMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L01PWi9NT1pfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tb3oiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01PWi9NT1pfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNT1ogKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tb3oiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01PWi9NT1pfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTU9aKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9NT1ovTU9aXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tb3oiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL01PWl8yX01PWl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBNT1oiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1veiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTU9aXzJfTVdJXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBNT1ogYW5kIE1XSSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubW96IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9NT1pfMl9TV1pfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IE1PWiBhbmQgU1daIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tb3oiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL01PWl8yX1RaQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgTU9aIGFuZCBUWkEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1veiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTU9aXzJfWkFGXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBNT1ogYW5kIFpBRiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubW96IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9NT1pfMl9aTUJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IE1PWiBhbmQgWk1CIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tb3oiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL01PWl8yX1pXRV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgTU9aIGFuZCBaV0UiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1veiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL01PWl8wX01PWl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBNT1ogbGV2ZWwgKDEpIGJ5IE1PWiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tb3oiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9NT1pfMV9NT1pfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgTU9aIGxldmVsICgyKSBieSBNT1ogKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIE1SVCAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubXJ0IiBuYW1lPSJNUlQiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubXJ0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NUlQvTVJUXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTVJUICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL21yLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1ydCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTVJUL01SVF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNUlQoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L01SVC9NUlRfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1ydCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTVJUXzBfU0VOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBNUlQgYW5kIFNFTiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorCis8IS0tIE1TUiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubXNyIiBuYW1lPSJNU1IiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubXNyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NU1IvTVNSXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTVNSICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL21oLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm1zciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTVNSL01TUl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNU1IoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L01TUi9NU1JfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gTVRRIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tdHEiIG5hbWU9Ik1UUSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tdHEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01UUS9NVFFfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNVFEgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbWIuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubXRxIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NVFEvTVRRXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1UUSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTVRRL01UUV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBNVVMgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm11cyIgbmFtZT0iTVVTIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm11cyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTVVTL01VU18wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1VUyAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9tcC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5tdXMiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01VUy9NVVNfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTVVTKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9NVVMvTVVTXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubXVzIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NVVMvTVVTXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTVVTICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubXVzIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NVVMvTVVTXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1VUygxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTVVTL01VU18xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm11cyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTVVTL01VU18yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1VUyAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm11cyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTVVTL01VU18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNVVMoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L01VUy9NVVNfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm11cyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTVVTXzJfTVVTXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IE1VUyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubXVzIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvTVVTXzBfTVVTXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIE1VUyBsZXZlbCAoMSkgYnkgTVVTICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm11cyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL01VU18xX01VU18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBNVVMgbGV2ZWwgKDIpIGJ5IE1VUyAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gTVdJIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5td2kiIG5hbWU9Ik1XSSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5td2kiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01XSS9NV0lfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNV0kgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbWkuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubXdpIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9NV0kvTVdJXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1XSSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTVdJL01XSV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm13aSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTVdJL01XSV8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1XSSAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm13aSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTVdJL01XSV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNV0koMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L01XSS9NV0lfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5td2kiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01XSS9NV0lfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJNV0kgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5td2kiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01XSS9NV0lfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTVdJKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9NV0kvTVdJXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5td2kiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL01XSV8yX01XSV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBNV0kiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm13aSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTVdJXzJfVFpBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBNV0kgYW5kIFRaQSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubXdpIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9NV0lfMl9aTUJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IE1XSSBhbmQgWk1CIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5td2kiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9NV0lfMF9NV0lfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgTVdJIGxldmVsICgxKSBieSBNV0kgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubXdpIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvTVdJXzFfTVdJXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIE1XSSBsZXZlbCAoMikgYnkgTVdJICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBNWVMgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm15cyIgbmFtZT0iTVlTIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm15cyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTVlTL01ZU18wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1ZUyAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9teS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5teXMiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01ZUy9NWVNfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTVlTKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9NWVMvTVlTXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5teXMiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL01ZU18wX1NHUF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgTVlTIGFuZCBTR1AiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm15cyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTVlTXzBfVEhBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBNWVMgYW5kIFRIQSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubXlzIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvTVlTXzBfTVlTXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIE1ZUyBsZXZlbCAoMSkgYnkgTVlTICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBNWVQgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm15dCIgbmFtZT0iTVlUIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm15dCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTVlUL01ZVF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik1ZVCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9tZi5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5teXQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L01ZVC9NWVRfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTVlUKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9NWVQvTVlUXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5teXQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9NWVRfMF9NWVRfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgTVlUIGxldmVsICgxKSBieSBNWVQgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIE5BTSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmFtIiBuYW1lPSJOQU0iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmFtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9OQU0vTkFNXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTkFNICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3dhLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5hbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTkFNL05BTV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJOQU0oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L05BTS9OQU1fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5uYW0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L05BTS9OQU1fMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJOQU0gKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5uYW0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L05BTS9OQU1fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTkFNKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9OQU0vTkFNXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmFtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9OQU0vTkFNXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTkFNICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmFtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9OQU0vTkFNXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik5BTSgyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTkFNL05BTV8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmFtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9OQU1fMl9OQU1fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgTkFNIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5uYW0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL05BTV8yX1pBRl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgTkFNIGFuZCBaQUYiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5hbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTkFNXzJfWk1CXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBOQU0gYW5kIFpNQiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmFtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9OQU1fMl9aV0VfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IE5BTSBhbmQgWldFIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5uYW0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9OQU1fMF9OQU1fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgTkFNIGxldmVsICgxKSBieSBOQU0gKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmFtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvTkFNXzFfTkFNXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIE5BTSBsZXZlbCAoMikgYnkgTkFNICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBOQ0wgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5jbCIgbmFtZT0iTkNMIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5jbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTkNML05DTF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik5DTCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9uYy5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5uY2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L05DTC9OQ0xfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTkNMKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9OQ0wvTkNMXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIE5FUiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmVyIiBuYW1lPSJORVIiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmVyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9ORVIvTkVSXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTkVSICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL25nLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5lciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTkVSL05FUl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJORVIoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L05FUi9ORVJfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5uZXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L05FUi9ORVJfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJORVIgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5uZXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L05FUi9ORVJfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTkVSKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9ORVIvTkVSXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmVyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9ORVIvTkVSXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTkVSICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmVyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9ORVIvTkVSXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik5FUigyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTkVSL05FUl8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmVyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9ORVJfMl9ORVJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgTkVSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5uZXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL05FUl8yX05HQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgTkVSIGFuZCBOR0EiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5lciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTkVSXzJfVENEXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBORVIgYW5kIFRDRCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmVyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvTkVSXzBfTkVSXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIE5FUiBsZXZlbCAoMSkgYnkgTkVSICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5lciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL05FUl8xX05FUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBORVIgbGV2ZWwgKDIpIGJ5IE5FUiAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gTkZLIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5uZmsiIG5hbWU9Ik5GSyIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5uZmsiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L05GSy9ORktfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJORksgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbmYuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmZrIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9ORksvTkZLXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik5GSygwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTkZLL05GS18wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBOR0EgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5nYSIgbmFtZT0iTkdBIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5nYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTkdBL05HQV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik5HQSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9uaS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5uZ2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L05HQS9OR0FfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTkdBKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9OR0EvTkdBXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmdhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9OR0EvTkdBXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTkdBICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmdhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9OR0EvTkdBXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik5HQSgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTkdBL05HQV8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5nYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTkdBL05HQV8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik5HQSAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5nYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTkdBL05HQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJOR0EoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L05HQS9OR0FfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5nYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTkdBXzJfTkdBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IE5HQSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmdhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9OR0FfMl9UQ0RfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IE5HQSBhbmQgVENEIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5uZ2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9OR0FfMF9OR0FfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgTkdBIGxldmVsICgxKSBieSBOR0EgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmdhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvTkdBXzFfTkdBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIE5HQSBsZXZlbCAoMikgYnkgTkdBICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBOSUMgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5pYyIgbmFtZT0iTklDIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5pYyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTklDL05JQ18wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik5JQyAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9udS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5uaWMiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L05JQy9OSUNfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTklDKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9OSUMvTklDXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIE5JVSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubml1IiBuYW1lPSJOSVUiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubml1IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9OSVUvTklVXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTklVICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL25lLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5pdSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTklVL05JVV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJOSVUoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L05JVS9OSVVfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gTkxEIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ubGQiIG5hbWU9Ik5MRCIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ubGQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L05MRC9OTERfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJOTEQgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbmwuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmxkIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9OTEQvTkxEXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik5MRCgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTkxEL05MRF8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5sZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTkxEL05MRF8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik5MRCAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5sZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTkxEL05MRF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJOTEQoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L05MRC9OTERfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5sZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTkxEXzFfTkxEXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IE5MRCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubmxkIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvTkxEXzBfTkxEXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIE5MRCBsZXZlbCAoMSkgYnkgTkxEICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBOT1IgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5vciIgbmFtZT0iTk9SIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5vciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTk9SL05PUl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik5PUiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9uby5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ub3IiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L05PUi9OT1JfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTk9SKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9OT1IvTk9SXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubm9yIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9OT1IvTk9SXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTk9SICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubm9yIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9OT1IvTk9SXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik5PUigxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTk9SL05PUl8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubm9yIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9OT1JfMV9OT1JfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgTk9SIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ub3IiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL05PUl8xX1JVU18xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgTk9SIGFuZCBSVVMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5vciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTk9SXzFfU1dFXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBOT1IgYW5kIFNXRSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubm9yIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvTk9SXzBfTk9SXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIE5PUiBsZXZlbCAoMSkgYnkgTk9SICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBOUEwgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5wbCIgbmFtZT0iTlBMIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5wbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTlBML05QTF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik5QTCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9ucC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ucGwiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L05QTC9OUExfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTlBMKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9OUEwvTlBMXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubnBsIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9OUEwvTlBMXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTlBMICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubnBsIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9OUEwvTlBMXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik5QTCgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTlBML05QTF8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5wbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTlBML05QTF8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik5QTCAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5wbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTlBML05QTF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJOUEwoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L05QTC9OUExfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5wbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvTlBMXzJfTlBMXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IE5QTCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubnBsIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvTlBMXzBfTlBMXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIE5QTCBsZXZlbCAoMSkgYnkgTlBMICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm5wbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL05QTF8xX05QTF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBOUEwgbGV2ZWwgKDIpIGJ5IE5QTCAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gTlJVIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ucnUiIG5hbWU9Ik5SVSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ucnUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L05SVS9OUlVfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJOUlUgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbnIuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMubnJ1IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9OUlUvTlJVXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik5SVSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvTlJVL05SVV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBOWkwgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm56bCIgbmFtZT0iTlpMIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm56bCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvTlpML05aTF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik5aTCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9uei5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5uemwiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L05aTC9OWkxfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iTlpMKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9OWkwvTlpMXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIE9NTiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMub21uIiBuYW1lPSJPTU4iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMub21uIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9PTU4vT01OXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iT01OICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL211Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm9tbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvT01OL09NTl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJPTU4oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L09NTi9PTU5fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5vbW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L09NTi9PTU5fMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJPTU4gKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5vbW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L09NTi9PTU5fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iT01OKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9PTU4vT01OXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMub21uIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9PTU4vT01OXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iT01OICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMub21uIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9PTU4vT01OXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9Ik9NTigyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvT01OL09NTl8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMub21uIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9PTU5fMl9PTU5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgT01OIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5vbW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL09NTl8yX1NBVV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgT01OIGFuZCBTQVUiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm9tbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvT01OXzJfWUVNXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBPTU4gYW5kIFlFTSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMub21uIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvT01OXzBfT01OXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIE9NTiBsZXZlbCAoMSkgYnkgT01OICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLm9tbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL09NTl8xX09NTl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBPTU4gbGV2ZWwgKDIpIGJ5IE9NTiAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gUEFLIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wYWsiIG5hbWU9IlBBSyIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wYWsiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BBSy9QQUtfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQQUsgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvcGsuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucGFrIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QQUsvUEFLXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBBSygwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvUEFLL1BBS18wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBhayIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUEFLL1BBS18xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBBSyAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucGFrIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QQUsvUEFLXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBBSygxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvUEFLL1BBS18xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBhayIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUEFLL1BBS18yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBBSyAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBhayIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUEFLL1BBS18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQQUsoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1BBSy9QQUtfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBhayIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvUEFLXzJfUEFLXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IFBBSyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucGFrIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvUEFLXzBfUEFLXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFBBSyBsZXZlbCAoMSkgYnkgUEFLICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBhayIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1BBS18xX1BBS18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBQQUsgbGV2ZWwgKDIpIGJ5IFBBSyAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gUEFOIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wYW4iIG5hbWU9IlBBTiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wYW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BBTi9QQU5fMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQQU4gKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvcG0uaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucGFuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QQU4vUEFOXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBBTigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvUEFOL1BBTl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBQQ04gLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBjbiIgbmFtZT0iUENOIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBjbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUENOL1BDTl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBDTiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9wYy5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wY24iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BDTi9QQ05fMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUENOKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9QQ04vUENOXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFBFUiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucGVyIiBuYW1lPSJQRVIiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucGVyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QRVIvUEVSXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUEVSICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3BlLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBlciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUEVSL1BFUl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQRVIoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1BFUi9QRVJfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wZXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BFUi9QRVJfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQRVIgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wZXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BFUi9QRVJfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUEVSKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9QRVIvUEVSXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucGVyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QRVIvUEVSXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUEVSICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucGVyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QRVIvUEVSXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBFUigyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvUEVSL1BFUl8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucGVyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9QRVJfMl9QRVJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgUEVSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wZXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9QRVJfMF9QRVJfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgUEVSIGxldmVsICgxKSBieSBQRVIgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucGVyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvUEVSXzFfUEVSXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFBFUiBsZXZlbCAoMikgYnkgUEVSICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBQSEwgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBobCIgbmFtZT0iUEhMIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBobCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUEhML1BITF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBITCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9ycC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5waGwiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BITC9QSExfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUEhMKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9QSEwvUEhMXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucGhsIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QSEwvUEhMXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUEhMICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucGhsIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QSEwvUEhMXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBITCgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvUEhML1BITF8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBobCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUEhML1BITF8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBITCAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBobCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUEhML1BITF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQSEwoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1BITC9QSExfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBobCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvUEhMXzJfUEhMXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IFBITCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucGhsIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvUEhMXzBfUEhMXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFBITCBsZXZlbCAoMSkgYnkgUEhMICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBobCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1BITF8xX1BITF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBQSEwgbGV2ZWwgKDIpIGJ5IFBITCAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gUExXIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wbHciIG5hbWU9IlBMVyIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wbHciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BMVy9QTFdfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQTFcgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvcHMuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucGx3IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QTFcvUExXXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBMVygwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvUExXL1BMV18wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucGx3IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvUExXXzBfUExXXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFBMVyBsZXZlbCAoMSkgYnkgUExXICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBQTkcgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBuZyIgbmFtZT0iUE5HIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBuZyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUE5HL1BOR18wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBORyAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9wcC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wbmciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BORy9QTkdfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUE5HKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9QTkcvUE5HXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wbmciIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1BOR18yX1BOR18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBQTkciIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKworPCEtLSBQT0wgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBvbCIgbmFtZT0iUE9MIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBvbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUE9ML1BPTF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBPTCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9wbC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wb2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BPTC9QT0xfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUE9MKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9QT0wvUE9MXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucG9sIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QT0wvUE9MXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUE9MICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucG9sIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QT0wvUE9MXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBPTCgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvUE9ML1BPTF8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucG9sIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9QT0xfMF9VS1JfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciBiZXR3ZWVuIGNvdW50cnkgUE9MIGFuZCBVS1IiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDAxLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBvbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvUE9MXzBfVUtSXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgYmV0d2VlbiBjb3VudHJ5IFBPTCBhbmQgVUtSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwMS0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wb2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1BPTF8xX1BPTF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBQT0wiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBvbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvUE9MXzFfUlVTXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBQT0wgYW5kIFJVUyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucG9sIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9QT0xfMV9VS1JfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciBiZXR3ZWVuIGNvdW50cnkgUE9MIGFuZCBVS1IiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDAxLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBvbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvUE9MXzFfVUtSXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgYmV0d2VlbiBjb3VudHJ5IFBPTCBhbmQgVUtSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwMS0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wb2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9QT0xfMF9QT0xfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgUE9MIGxldmVsICgxKSBieSBQT0wgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFBSSSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHJpIiBuYW1lPSJQUkkiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHJpIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QUkkvUFJJXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUFJJICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3JxLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnByaSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUFJJL1BSSV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQUkkoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1BSSS9QUklfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wcmkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BSSS9QUklfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQUkkgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cCUzQSUyRiUyRmZhY3RmaW5kZXIuY2Vuc3VzLmdvdiUyRnNlcnZsZXQlMkZHQ1RUYWJsZSUzRl9ibSUzRHklMjYtZ2VvX2lkJTNEMDQwMDBVUzcyJTI2LV9ib3hfaGVhZF9uYnIlM0RHQ1QtUEgxJTI2LWRzX25hbWUlM0RERUNfMjAwMF9TRjFfVSUyNi1yZWRvTG9nJTNEZmFsc2UlMjYtbXRfbmFtZSUzRERFQ18yMDAwX1NGMV9VX0dDVFBIMV9VUzklMjYtZm9ybWF0JTNEU1QtMiUyNi1DT05URVhUJTNEZ2N0IiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wcmkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BSSS9QUklfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUFJJKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9QUkkvUFJJXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wcmkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1BSSV8xX1BSSV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBQUkkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnByaSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1BSSV8wX1BSSV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBQUkkgbGV2ZWwgKDEpIGJ5IFBSSSAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gUFJLIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wcmsiIG5hbWU9IlBSSyIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wcmsiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BSSy9QUktfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQUksgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3Mva24uaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHJrIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QUksvUFJLXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBSSygwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvUFJLL1BSS18wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnByayIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUFJLL1BSS18xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBSSyAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnByayIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUFJLL1BSS18xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQUksoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1BSSy9QUktfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wcmsiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BSSy9QUktfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQUksgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wcmsiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BSSy9QUktfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUFJLKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9QUksvUFJLXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wcmsiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1BSS18yX1BSS18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBQUksiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnByayIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvUFJLXzJfUlVTXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBQUksgYW5kIFJVUyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHJrIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvUFJLXzBfUFJLXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFBSSyBsZXZlbCAoMSkgYnkgUFJLICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnByayIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1BSS18xX1BSS18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBQUksgbGV2ZWwgKDIpIGJ5IFBSSyAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gUFJUIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wcnQiIG5hbWU9IlBSVCIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wcnQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BSVC9QUlRfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQUlQgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvcG8uaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHJ0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QUlQvUFJUXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBSVCgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvUFJUL1BSVF8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBydCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUFJUL1BSVF8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBSVCAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHJ0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QUlQvUFJUXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBSVCgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvUFJUL1BSVF8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHJ0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9QUlRfMV9QUlRfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgUFJUIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wcnQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9QUlRfMF9QUlRfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgUFJUIGxldmVsICgxKSBieSBQUlQgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFBSWSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHJ5IiBuYW1lPSJQUlkiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHJ5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QUlkvUFJZXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUFJZICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3BhLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnByeSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUFJZL1BSWV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQUlkoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1BSWS9QUllfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wcnkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BSWS9QUllfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQUlkgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wcnkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BSWS9QUllfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUFJZKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9QUlkvUFJZXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHJ5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QUlkvUFJZXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUFJZICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHJ5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QUlkvUFJZXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBSWSgyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvUFJZL1BSWV8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHJ5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9QUllfMl9QUllfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgUFJZIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wcnkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9QUllfMF9QUllfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgUFJZIGxldmVsICgxKSBieSBQUlkgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHJ5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvUFJZXzFfUFJZXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFBSWSBsZXZlbCAoMikgYnkgUFJZICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBQU0UgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBzZSIgbmFtZT0iUFNFIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnBzZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUFNFL1BTRV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBTRSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy93ZS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wc2UiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1BTRS9QU0VfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUFNFKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9QU0UvUFNFXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHNlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QU0UvUFNFXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUFNFICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9IklzcmFlbCBDREMgYml0bWFwIChzY2FubmVkKSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHNlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QU0UvUFNFXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBTRSgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvUFNFL1BTRV8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHNlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9QU0VfMV9QU0VfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgUFNFIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5wc2UiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9QU0VfMF9QU0VfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgUFNFIGxldmVsICgxKSBieSBQU0UgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFBZRiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHlmIiBuYW1lPSJQWUYiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucHlmIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9QWUYvUFlGXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUFlGICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2ZwLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnB5ZiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUFlGL1BZRl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQWUYoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1BZRi9QWUZfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gUUFUIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5xYXQiIG5hbWU9IlFBVCIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5xYXQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1FBVC9RQVRfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJRQVQgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvcWEuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucWF0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9RQVQvUUFUXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlFBVCgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvUUFUL1FBVF8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnFhdCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUUFUL1FBVF8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlFBVCAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnFhdCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUUFUL1FBVF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJRQVQoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1FBVC9RQVRfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5xYXQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1FBVC9RQVRfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJRQVQgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5xYXQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1FBVC9RQVRfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUUFUKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9RQVQvUUFUXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5xYXQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1FBVF8yX1FBVF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBRQVQiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnFhdCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvUUFUXzJfU0FVXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBRQVQgYW5kIFNBVSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucWF0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvUUFUXzBfUUFUXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFFBVCBsZXZlbCAoMSkgYnkgUUFUICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnFhdCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1FBVF8xX1FBVF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBRQVQgbGV2ZWwgKDIpIGJ5IFFBVCAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gUkVVIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5yZXUiIG5hbWU9IlJFVSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5yZXUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1JFVS9SRVVfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJSRVUgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvcmUuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucmV1IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9SRVUvUkVVXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlJFVSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvUkVVL1JFVV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBST1UgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnJvdSIgbmFtZT0iUk9VIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnJvdSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUk9VL1JPVV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlJPVSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9yby5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5yb3UiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1JPVS9ST1VfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUk9VKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9ST1UvUk9VXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucm91IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9ST1UvUk9VXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUk9VICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5yb3UiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1JPVS9ST1VfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUk9VKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9ST1UvUk9VXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5yb3UiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1JPVV8wX1VLUl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIGJldHdlZW4gY291bnRyeSBST1UgYW5kIFVLUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDEtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucm91IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9ST1VfMF9VS1JfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciBiZXR3ZWVuIGNvdW50cnkgUk9VIGFuZCBVS1IiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDAxLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnJvdSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvUk9VXzFfUk9VXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IFJPVSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucm91IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9ST1VfMV9TUkJfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IFJPVSBhbmQgU1JCIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5yb3UiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1JPVV8xX1VLUl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIGJldHdlZW4gY291bnRyeSBST1UgYW5kIFVLUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDEtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucm91IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9ST1VfMV9VS1JfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciBiZXR3ZWVuIGNvdW50cnkgUk9VIGFuZCBVS1IiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDAxLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnJvdSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1JPVV8wX1JPVV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBST1UgbGV2ZWwgKDEpIGJ5IFJPVSAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gUlVTIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ydXMiIG5hbWU9IlJVUyIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ydXMiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1JVUy9SVVNfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJSVVMgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvcnMuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucnVzIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9SVVMvUlVTXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlJVUygwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvUlVTL1JVU18wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnJ1cyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUlVTL1JVU18xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlJVUyAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnJ1cyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUlVTL1JVU18xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJSVVMoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1JVUy9SVVNfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnJ1cyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvUlVTXzBfVUtSXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgYmV0d2VlbiBjb3VudHJ5IFJVUyBhbmQgVUtSIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwMS0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ydXMiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1JVU18wX1VLUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIGJldHdlZW4gY291bnRyeSBSVVMgYW5kIFVLUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDEtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucnVzIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9SVVNfMV9SVVNfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgUlVTIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5ydXMiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1JVU18xX1VLUl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIGJldHdlZW4gY291bnRyeSBSVVMgYW5kIFVLUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDEtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucnVzIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9SVVNfMV9VS1JfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciBiZXR3ZWVuIGNvdW50cnkgUlVTIGFuZCBVS1IiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDAxLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnJ1cyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1JVU18wX1JVU18xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBSVVMgbGV2ZWwgKDEpIGJ5IFJVUyAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gUldBIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5yd2EiIG5hbWU9IlJXQSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5yd2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1JXQS9SV0FfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJSV0EgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvcncuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucndhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9SV0EvUldBXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlJXQSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvUldBL1JXQV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnJ3YSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUldBL1JXQV8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlJXQSAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnJ3YSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvUldBL1JXQV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJSV0EoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1JXQS9SV0FfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5yd2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1JXQS9SV0FfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJSV0EgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5yd2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1JXQS9SV0FfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUldBKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9SV0EvUldBXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5yd2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1JXQV8yX1JXQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBSV0EiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnJ3YSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvUldBXzJfVFpBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBSV0EgYW5kIFRaQSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucndhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9SV0FfMl9VR0FfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IFJXQSBhbmQgVUdBIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5yd2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9SV0FfMF9SV0FfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgUldBIGxldmVsICgxKSBieSBSV0EgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMucndhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvUldBXzFfUldBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFJXQSBsZXZlbCAoMikgYnkgUldBICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBTQVUgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNhdSIgbmFtZT0iU0FVIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNhdSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU0FVL1NBVV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNBVSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9zYS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zYXUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NBVS9TQVVfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU0FVKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9TQVUvU0FVXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2F1IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TQVUvU0FVXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU0FVICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2F1IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TQVUvU0FVXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNBVSgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvU0FVL1NBVV8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNhdSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU0FVL1NBVV8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNBVSAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNhdSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU0FVL1NBVV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTQVUoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1NBVS9TQVVfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNhdSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvU0FVXzJfU0FVXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IFNBVSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2F1IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9TQVVfMl9ZRU1fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IFNBVSBhbmQgWUVNIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zYXUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9TQVVfMF9TQVVfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgU0FVIGxldmVsICgxKSBieSBTQVUgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2F1IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvU0FVXzFfU0FVXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFNBVSBsZXZlbCAoMikgYnkgU0FVICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBTRE4gLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNkbiIgbmFtZT0iU0ROIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNkbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU0ROL1NETl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNETiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9zdS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zZG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NETi9TRE5fMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU0ROKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9TRE4vU0ROXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2RuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TRE4vU0ROXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU0ROICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2RuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TRE4vU0ROXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNETigxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvU0ROL1NETl8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNkbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU0ROL1NETl8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNETiAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNkbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU0ROL1NETl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTRE4oMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1NETi9TRE5fMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNkbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvU0ROXzJfU0ROXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IFNETiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2RuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9TRE5fMl9UQ0RfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IFNETiBhbmQgVENEIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zZG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1NETl8yX1VHQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgU0ROIGFuZCBVR0EiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNkbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1NETl8wX1NETl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBTRE4gbGV2ZWwgKDEpIGJ5IFNETiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zZG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9TRE5fMV9TRE5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgU0ROIGxldmVsICgyKSBieSBTRE4gKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFNFTiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2VuIiBuYW1lPSJTRU4iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2VuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TRU4vU0VOXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU0VOICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3NnLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNlbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU0VOL1NFTl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTRU4oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1NFTi9TRU5fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zZW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NFTi9TRU5fMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTRU4gKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zZW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NFTi9TRU5fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU0VOKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9TRU4vU0VOXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2VuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TRU4vU0VOXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU0VOICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2VuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TRU4vU0VOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNFTigyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvU0VOL1NFTl8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2VuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9TRU5fMl9TRU5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgU0VOIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zZW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9TRU5fMF9TRU5fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgU0VOIGxldmVsICgxKSBieSBTRU4gKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2VuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvU0VOXzFfU0VOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFNFTiBsZXZlbCAoMikgYnkgU0VOICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBTR1AgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNncCIgbmFtZT0iU0dQIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNncCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU0dQL1NHUF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNHUCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9zbi5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zZ3AiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NHUC9TR1BfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU0dQKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9TR1AvU0dQXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2dwIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TR1AvU0dQXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU0dQICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2dwIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TR1AvU0dQXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNHUCgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvU0dQL1NHUF8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNncCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU0dQL1NHUF8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNHUCAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNncCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU0dQL1NHUF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTR1AoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1NHUC9TR1BfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNncCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvU0dQXzJfU0dQXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IFNHUCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2dwIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvU0dQXzBfU0dQXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFNHUCBsZXZlbCAoMSkgYnkgU0dQICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNncCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1NHUF8xX1NHUF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBTR1AgbGV2ZWwgKDIpIGJ5IFNHUCAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gU0dTIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zZ3MiIG5hbWU9IlNHUyIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zZ3MiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NHUy9TR1NfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTR1MgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3Mvc3guaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2dzIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TR1MvU0dTXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNHUygwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvU0dTL1NHU18wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBTSE4gLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNobiIgbmFtZT0iU0hOIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNobiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU0hOL1NITl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNITiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9zaC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zaG4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NITi9TSE5fMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU0hOKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9TSE4vU0hOXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFNKTSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2ptIiBuYW1lPSJTSk0iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2ptIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TSk0vU0pNXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU0pNICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3N2Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNqbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU0pNL1NKTV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTSk0oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1NKTS9TSk1fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gU0xCIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zbGIiIG5hbWU9IlNMQiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zbGIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NMQi9TTEJfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTTEIgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYnAuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2xiIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TTEIvU0xCXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNMQigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvU0xCL1NMQl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBTTEUgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNsZSIgbmFtZT0iU0xFIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNsZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU0xFL1NMRV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNMRSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9zbC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zbGUiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NMRS9TTEVfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU0xFKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9TTEUvU0xFXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2xlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TTEUvU0xFXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU0xFICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2xlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TTEUvU0xFXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNMRSgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvU0xFL1NMRV8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNsZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU0xFL1NMRV8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNMRSAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNsZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU0xFL1NMRV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTTEUoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1NMRS9TTEVfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNsZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvU0xFXzJfU0xFXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IFNMRSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2xlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvU0xFXzBfU0xFXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFNMRSBsZXZlbCAoMSkgYnkgU0xFICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNsZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1NMRV8xX1NMRV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBTTEUgbGV2ZWwgKDIpIGJ5IFNMRSAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gU0xWIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zbHYiIG5hbWU9IlNMViIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zbHYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NMVi9TTFZfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTTFYgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvZXMuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc2x2IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TTFYvU0xWXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNMVigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvU0xWL1NMVl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBTTVIgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNtciIgbmFtZT0iU01SIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNtciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU01SL1NNUl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNNUiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9zbS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zbXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NNUi9TTVJfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU01SKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9TTVIvU01SXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc21yIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TTVIvU01SXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU01SICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zbXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NNUi9TTVJfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU01SKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9TTVIvU01SXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zbXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1NNUl8xX1NNUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBTTVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNtciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1NNUl8wX1NNUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBTTVIgbGV2ZWwgKDEpIGJ5IFNNUiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gU09NIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zb20iIG5hbWU9IlNPTSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zb20iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NPTS9TT01fMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTT00gKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3Mvc28uaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc29tIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TT00vU09NXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNPTSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvU09NL1NPTV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNvbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU09NL1NPTV8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNPTSAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNvbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU09NL1NPTV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTT00oMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1NPTS9TT01fMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zb20iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NPTS9TT01fMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTT00gKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zb20iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NPTS9TT01fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU09NKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9TT00vU09NXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zb20iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1NPTV8yX1NPTV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBTT00iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNvbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1NPTV8wX1NPTV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBTT00gbGV2ZWwgKDEpIGJ5IFNPTSAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zb20iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9TT01fMV9TT01fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgU09NIGxldmVsICgyKSBieSBTT00gKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFNQTSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3BtIiBuYW1lPSJTUE0iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3BtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TUE0vU1BNXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU1BNICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3NiLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNwbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1BNL1NQTV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTUE0oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1NQTS9TUE1fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gU1FSIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zcXIiIG5hbWU9IlNRUiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zcXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NRUi9TUVJfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTUVIgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3FyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TUVIvU1FSXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNRUigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvU1FSL1NRUl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNxciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1FSL1NRUl8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNRUiAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNxciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1FSL1NRUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTUVIoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1NRUi9TUVJfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNxciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvU1FSXzFfU1FSXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiB2YWxpZGF0aW9uIHJlZ2lvbiBTUVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2OyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNxciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1NRUl8wX1NRUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBTUVIgbGV2ZWwgKDEpIGJ5IFNRUiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gU1JCIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zcmIiIG5hbWU9IlNSQiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zcmIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NSQi9TUkJfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTUkIgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3Mvc3IuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3JiIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TUkIvU1JCXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNSQigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvU1JCL1NSQl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNyYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1JCL1NSQl8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNSQiAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNyYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1JCL1NSQl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTUkIoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1NSQi9TUkJfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnNyYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvU1JCXzFfU1JCXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IFNSQiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3JiIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvU1JCXzBfU1JCXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFNSQiBsZXZlbCAoMSkgYnkgU1JCICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBTVFAgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN0cCIgbmFtZT0iU1RQIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN0cCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1RQL1NUUF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNUUCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy90cC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zdHAiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NUUC9TVFBfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU1RQKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9TVFAvU1RQXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3RwIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TVFAvU1RQXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU1RQICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3RwIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TVFAvU1RQXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNUUCgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvU1RQL1NUUF8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN0cCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1RQL1NUUF8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNUUCAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN0cCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1RQL1NUUF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTVFAoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1NUUC9TVFBfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN0cCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvU1RQXzJfU1RQXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IFNUUCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3RwIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvU1RQXzBfU1RQXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFNUUCBsZXZlbCAoMSkgYnkgU1RQICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN0cCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1NUUF8xX1NUUF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBTVFAgbGV2ZWwgKDIpIGJ5IFNUUCAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gU1VSIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zdXIiIG5hbWU9IlNVUiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zdXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NVUi9TVVJfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTVVIgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbnMuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3VyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TVVIvU1VSXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNVUigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvU1VSL1NVUl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN1ciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1VSL1NVUl8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNVUiAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN1ciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1VSL1NVUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTVVIoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1NVUi9TVVJfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zdXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NVUi9TVVJfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTVVIgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zdXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NVUi9TVVJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU1VSKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9TVVIvU1VSXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zdXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1NVUl8yX1NVUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBTVVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN1ciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1NVUl8wX1NVUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBTVVIgbGV2ZWwgKDEpIGJ5IFNVUiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zdXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9TVVJfMV9TVVJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgU1VSIGxldmVsICgyKSBieSBTVVIgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFNWSyAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3ZrIiBuYW1lPSJTVksiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3ZrIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TVksvU1ZLXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU1ZLICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2xvLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN2ayIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1ZLL1NWS18wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTVksoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1NWSy9TVktfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gU1ZOIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zdm4iIG5hbWU9IlNWTiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zdm4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NWTi9TVk5fMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTVk4gKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3Mvc2kuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3ZuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TVk4vU1ZOXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNWTigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvU1ZOL1NWTl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN2biIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1ZOL1NWTl8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNWTiAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN2biIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1ZOL1NWTl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTVk4oMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1NWTi9TVk5fMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN2biIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvU1ZOXzFfU1ZOXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IFNWTiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3ZuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvU1ZOXzBfU1ZOXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFNWTiBsZXZlbCAoMSkgYnkgU1ZOICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBTV0UgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN3ZSIgbmFtZT0iU1dFIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN3ZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1dFL1NXRV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNXRSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9zdy5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zd2UiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NXRS9TV0VfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU1dFKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9TV0UvU1dFXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3dlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TV0UvU1dFXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU1dFICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3dlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TV0UvU1dFXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNXRSgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvU1dFL1NXRV8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3dlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9TV0VfMV9TV0VfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgU1dFIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zd2UiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9TV0VfMF9TV0VfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgU1dFIGxldmVsICgxKSBieSBTV0UgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFNXWiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3d6IiBuYW1lPSJTV1oiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3d6IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TV1ovU1daXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU1daICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3d6Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN3eiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1daL1NXWl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTV1ooMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1NXWi9TV1pfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN3eiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvU1daXzBfWkFGXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBTV1ogYW5kIFpBRiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3d6IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvU1daXzBfU1daXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFNXWiBsZXZlbCAoMSkgYnkgU1daICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBTWUMgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN5YyIgbmFtZT0iU1lDIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN5YyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1lDL1NZQ18wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNZQyAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9zZS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zeWMiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NZQy9TWUNfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU1lDKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9TWUMvU1lDXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3ljIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TWUMvU1lDXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU1lDICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3ljIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TWUMvU1lDXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNZQygxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvU1lDL1NZQ18xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN5YyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1lDL1NZQ18yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNZQyAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN5YyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1lDL1NZQ18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTWUMoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1NZQy9TWUNfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN5YyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvU1lDXzJfU1lDXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IFNZQyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3ljIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvU1lDXzBfU1lDXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFNZQyBsZXZlbCAoMSkgYnkgU1lDICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN5YyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1NZQ18xX1NZQ18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBTWUMgbGV2ZWwgKDIpIGJ5IFNZQyAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gU1lSIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zeXIiIG5hbWU9IlNZUiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zeXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NZUi9TWVJfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTWVIgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3Mvc3kuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3lyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9TWVIvU1lSXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNZUigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvU1lSL1NZUl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN5ciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1lSL1NZUl8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlNZUiAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN5ciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvU1lSL1NZUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTWVIoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1NZUi9TWVJfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zeXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NZUi9TWVJfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJTWVIgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zeXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1NZUi9TWVJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iU1lSKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9TWVIvU1lSXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy5zeXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1NZUl8yX1NZUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBTWVIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN5ciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvU1lSXzJfVFVSXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBTWVIgYW5kIFRVUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuc3lyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvU1lSXzBfU1lSXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFNZUiBsZXZlbCAoMSkgYnkgU1lSICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnN5ciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1NZUl8xX1NZUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBTWVIgbGV2ZWwgKDIpIGJ5IFNZUiAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gVENBIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50Y2EiIG5hbWU9IlRDQSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50Y2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RDQS9UQ0FfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUQ0EgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvdGsuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGNhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9UQ0EvVENBXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRDQSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVENBL1RDQV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBUQ0QgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRjZCIgbmFtZT0iVENEIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRjZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVENEL1RDRF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRDRCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9jZC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50Y2QiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RDRC9UQ0RfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVENEKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9UQ0QvVENEXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGNkIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9UQ0QvVENEXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVENEICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGNkIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9UQ0QvVENEXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRDRCgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVENEL1RDRF8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRjZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVENEL1RDRF8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRDRCAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRjZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVENEL1RDRF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUQ0QoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1RDRC9UQ0RfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRjZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvVENEXzJfVENEXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IFRDRCIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGNkIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvVENEXzBfVENEXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFRDRCBsZXZlbCAoMSkgYnkgVENEICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRjZCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1RDRF8xX1RDRF8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBUQ0QgbGV2ZWwgKDIpIGJ5IFRDRCAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gVEdPIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50Z28iIG5hbWU9IlRHTyIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50Z28iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RHTy9UR09fMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUR08gKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvdG8uaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGdvIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9UR08vVEdPXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRHTygwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVEdPL1RHT18wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRnbyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVEdPL1RHT18xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRHTyAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRnbyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVEdPL1RHT18xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUR08oMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1RHTy9UR09fMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50Z28iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RHTy9UR09fMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUR08gKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50Z28iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RHTy9UR09fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVEdPKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9UR08vVEdPXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50Z28iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1RHT18yX1RHT18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBUR08iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRnbyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1RHT18wX1RHT18xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBUR08gbGV2ZWwgKDEpIGJ5IFRHTyAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50Z28iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9UR09fMV9UR09fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgVEdPIGxldmVsICgyKSBieSBUR08gKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFRIQSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGhhIiBuYW1lPSJUSEEiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGhhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9USEEvVEhBXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVEhBICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3RoLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRoYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVEhBL1RIQV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUSEEoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1RIQS9USEFfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50aGEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RIQS9USEFfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUSEEgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50aGEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RIQS9USEFfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVEhBKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9USEEvVEhBXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGhhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9USEEvVEhBXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVEhBICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGhhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9USEEvVEhBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRIQSgyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVEhBL1RIQV8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGhhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9USEFfMl9USEFfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgVEhBIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50aGEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9USEFfMF9USEFfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgVEhBIGxldmVsICgxKSBieSBUSEEgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGhhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvVEhBXzFfVEhBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFRIQSBsZXZlbCAoMikgYnkgVEhBICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBUSksgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRqayIgbmFtZT0iVEpLIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRqayIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVEpLL1RKS18wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRKSyAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy90aS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50amsiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RKSy9USktfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVEpLKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9USksvVEpLXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGprIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9USksvVEpLXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVEpLICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGprIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9USksvVEpLXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRKSygxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVEpLL1RKS18xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRqayIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVEpLL1RKS18yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRKSyAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRqayIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVEpLL1RKS18yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUSksoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1RKSy9USktfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRqayIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvVEpLXzJfVEpLXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IFRKSyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGprIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9USktfMl9VWkJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb3VudHJ5IFRKSyBhbmQgVVpCIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50amsiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9USktfMF9USktfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgVEpLIGxldmVsICgxKSBieSBUSksgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGprIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvVEpLXzFfVEpLXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFRKSyBsZXZlbCAoMikgYnkgVEpLICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBUS0wgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRrbCIgbmFtZT0iVEtMIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRrbCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVEtML1RLTF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRLTCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy90bC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50a2wiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RLTC9US0xfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVEtMKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9US0wvVEtMXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFRLTSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGttIiBuYW1lPSJUS00iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGttIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9US00vVEtNXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVEtNICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3R4Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRrbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVEtNL1RLTV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUS00oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1RLTS9US01fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50a20iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RLTS9US01fMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUS00gKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50a20iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RLTS9US01fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVEtNKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9US00vVEtNXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGttIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9US00vVEtNXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVEtNICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGttIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9US00vVEtNXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRLTSgyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVEtNL1RLTV8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGttIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9US01fMl9US01fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgVEtNIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50a20iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1RLTV8yX1VaQl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgVEtNIGFuZCBVWkIiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRrbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1RLTV8wX1RLTV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBUS00gbGV2ZWwgKDEpIGJ5IFRLTSAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50a20iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9US01fMV9US01fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgVEtNIGxldmVsICgyKSBieSBUS00gKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFRMUyAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGxzIiBuYW1lPSJUTFMiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudGxzIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9UTFMvVExTXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVExTICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3R0Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnRscyIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVExTL1RMU18wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUTFMoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1RMUy9UTFNfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gVE9OIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50b24iIG5hbWU9IlRPTiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50b24iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RPTi9UT05fMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUT04gKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvdG4uaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudG9uIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9UT04vVE9OXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRPTigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVE9OL1RPTl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBUVE8gLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnR0byIgbmFtZT0iVFRPIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnR0byIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVFRPL1RUT18wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRUTyAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy90ZC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50dG8iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RUTy9UVE9fMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVFRPKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9UVE8vVFRPXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFRVTiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudHVuIiBuYW1lPSJUVU4iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudHVuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9UVU4vVFVOXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVFVOICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3RzLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnR1biIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVFVOL1RVTl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUVU4oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1RVTi9UVU5fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50dW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RVTi9UVU5fMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUVU4gKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50dW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RVTi9UVU5fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVFVOKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9UVU4vVFVOXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudHVuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9UVU4vVFVOXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVFVOICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudHVuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9UVU4vVFVOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRVTigyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVFVOL1RVTl8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudHVuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9UVU5fMl9UVU5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgVFVOIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50dW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9UVU5fMF9UVU5fMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgVFVOIGxldmVsICgxKSBieSBUVU4gKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudHVuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvVFVOXzFfVFVOXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFRVTiBsZXZlbCAoMikgYnkgVFVOICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBUVVIgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnR1ciIgbmFtZT0iVFVSIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnR1ciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVFVSL1RVUl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRVUiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy90dS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50dXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RVUi9UVVJfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVFVSKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9UVVIvVFVSXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudHVyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9UVVIvVFVSXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVFVSICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudHVyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9UVVIvVFVSXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRVUigxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVFVSL1RVUl8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnR1ciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVFVSL1RVUl8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRVUiAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnR1ciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVFVSL1RVUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUVVIoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1RVUi9UVVJfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnR1ciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvVFVSXzJfVFVSXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IFRVUiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudHVyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvVFVSXzBfVFVSXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFRVUiBsZXZlbCAoMSkgYnkgVFVSICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnR1ciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1RVUl8xX1RVUl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBUVVIgbGV2ZWwgKDIpIGJ5IFRVUiAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gVFVWIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50dXYiIG5hbWU9IlRVViIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50dXYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RVVi9UVVZfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUVVYgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvdHYuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudHV2IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9UVVYvVFVWXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRVVigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVFVWL1RVVl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBUV04gLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnR3biIgbmFtZT0iVFdOIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnR3biIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVFdOL1RXTl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRXTiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy90dy5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50d24iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RXTi9UV05fMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVFdOKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9UV04vVFdOXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFRaQSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudHphIiBuYW1lPSJUWkEiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudHphIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9UWkEvVFpBXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVFpBICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3R6Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnR6YSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVFpBL1RaQV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUWkEoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1RaQS9UWkFfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50emEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RaQS9UWkFfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUWkEgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50emEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1RaQS9UWkFfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVFpBKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9UWkEvVFpBXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudHphIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9UWkEvVFpBXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVFpBICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudHphIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9UWkEvVFpBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRaQSgyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVFpBL1RaQV8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudHphIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9UWkFfMl9UWkFfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgVFpBIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy50emEiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1RaQV8yX1VHQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgVFpBIGFuZCBVR0EiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnR6YSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvVFpBXzJfWk1CXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyeSBUWkEgYW5kIFpNQiIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudHphIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvVFpBXzBfVFpBXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFRaQSBsZXZlbCAoMSkgYnkgVFpBICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnR6YSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1RaQV8xX1RaQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBUWkEgbGV2ZWwgKDIpIGJ5IFRaQSAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gVUdBIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51Z2EiIG5hbWU9IlVHQSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51Z2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1VHQS9VR0FfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJVR0EgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvdWcuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudWdhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9VR0EvVUdBXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlVHQSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVUdBL1VHQV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnVnYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVUdBL1VHQV8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlVHQSAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnVnYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVUdBL1VHQV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJVR0EoMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1VHQS9VR0FfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51Z2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1VHQS9VR0FfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJVR0EgKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51Z2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1VHQS9VR0FfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVUdBKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9VR0EvVUdBXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51Z2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1VHQV8yX1VHQV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBVR0EiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnVnYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1VHQV8wX1VHQV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBVR0EgbGV2ZWwgKDEpIGJ5IFVHQSAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51Z2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9VR0FfMV9VR0FfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgVUdBIGxldmVsICgyKSBieSBVR0EgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFVLUiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudWtyIiBuYW1lPSJVS1IiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudWtyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9VS1IvVUtSXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVUtSICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3VwLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnVrciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVUtSL1VLUl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJVS1IoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudWtyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9VS1IvVUtSXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVUtSICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudWtyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9VS1IvVUtSXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkFsbCBVS1IgKGxldmVsIDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9VS1IvVUtSXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51a3IiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1VLUl8xX1VLUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBVS1IiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDAxLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnVrciIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1VLUl8wX1VLUl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBVS1IgbGV2ZWwgKDEpIGJ5IFVLUiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gVU1JIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51bWkiIG5hbWU9IlVNSSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51bWkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1VNSS9VTUlfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJVTUkgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvdW0uaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudW1pIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9VTUkvVU1JXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlVNSSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVU1JL1VNSV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBVUlkgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnVyeSIgbmFtZT0iVVJZIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnVyeSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVVJZL1VSWV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlVSWSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy91eS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51cnkiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1VSWS9VUllfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVVJZKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9VUlkvVVJZXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudXJ5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9VUlkvVVJZXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVVJZICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudXJ5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9VUlkvVVJZXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlVSWSgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVVJZL1VSWV8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnVyeSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVVJZL1VSWV8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlVSWSAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnVyeSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVVJZL1VSWV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJVUlkoMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1VSWS9VUllfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnVyeSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvVVJZXzJfVVJZXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IFVSWSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudXJ5IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvVVJZXzBfVVJZXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFVSWSBsZXZlbCAoMSkgYnkgVVJZICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnVyeSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1VSWV8xX1VSWV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBVUlkgbGV2ZWwgKDIpIGJ5IFVSWSAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gVVNBIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51c2EiIG5hbWU9IlVTQSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51c2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1VTQS9VU0FfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUaGUgYXJlYSAoa21eMikgZm9yIHRoZSBVU0EgKDApIChleGNlcHQgUHVlcnRvIFJpY28pIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3VzLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnVzYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVVNBL1VTQV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUaGUgVVNBICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVVNBL1VTQV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnVzYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVVNBL1VTQV8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlRoZSBhcmVhIChrbV4yKSBmb3IgdGhlIFN0YXRlcyAoMSkgb2YgdGhlIFVTQSAoZXhjZXB0IFB1ZXJ0byBSaWNvKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmNlbnN1cy5nb3YvcG9wdWxhdGlvbi93d3cvY2Vuc3VzZGF0YS9kZW5zaXR5Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnVzYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVVNBL1VTQV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJBbGwgVVNBIFN0YXRlcyAoMSkgKGV4Y2VwdCBQdWVydG8gUmljbykiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1VTQS9VU0FfMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51c2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1VTQS9VU0FfMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJUaGUgYXJlYSAoa21eMikgZm9yIGFsbCBVU0EgQ291bnRpZXMgKGV4Y2VwdCBQdWVydG8gUmljbykiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5jZW5zdXMuZ292L2dlby93d3cvdGlnZXIvIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51c2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1VTQS9VU0FfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQWxsIFVTQSBDb3VudGllcyAoMikgKGV4Y2VwdCBQdWVydG8gUmljbykiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1VTQS9VU0FfMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51c2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1VTQS9VU0FfM19hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJVU0EgKDMpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iQ2Vuc3VzIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51c2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1VTQS9VU0FfMy5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVVNBIChsZXZlbCAzLCBWZXJtb250IG9ubHkgZm9yIG5vdykiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iY2Vuc3VzIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVVNBL1VTQV8zX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudXNhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9VU0FfMl9VU0FfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgVVNBIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51c2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1VTQV8yX1VTQV8zLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBVU0EgY291bnRpZXMgaW4gb3RoZXIgc3RhdGVzIHRvIHRvd25zIGluIFZlcm1vbnQiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDAxLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnVzYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvVVNBXzNfVVNBXzMuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBWZXJtb250IGNvdW50cnkgVVNBIGxldmVsIDMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDAxLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnVzYSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1VTQV8wX1VTQV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiB0aGUgU3RhdGVzICgxKSBieSBVU0EgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudXNhIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvVVNBXzFfVVNBXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIHRoZSBDb3VudGllcyBvZiBUaGUgVW5pdGVkIFN0YXRlcyAoMikgYnkgdGhlIFN0YXRlcyBvZiBUaGUgVW5pdGVkIFN0YXRlcyAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51c2EiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9VU0FfMl9VU0FfMy5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgdGhlIFN0YXRlcyAoMykgYnkgVVNBICgyKSBWZXJtb250IiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFVaQiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudXpiIiBuYW1lPSJVWkIiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudXpiIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9VWkIvVVpCXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVVpCICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3V6Lmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnV6YiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVVpCL1VaQl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJVWkIoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1VaQi9VWkJfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51emIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1VaQi9VWkJfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJVWkIgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51emIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1VaQi9VWkJfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVVpCKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9VWkIvVVpCXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudXpiIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9VWkIvVVpCXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVVpCICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudXpiIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9VWkIvVVpCXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlVaQigyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVVpCL1VaQl8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudXpiIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9VWkJfMl9VWkJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgVVpCIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy51emIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9VWkJfMF9VWkJfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgVVpCIGxldmVsICgxKSBieSBVWkIgKDApIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudXpiIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvVVpCXzFfVVpCXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFVaQiBsZXZlbCAoMikgYnkgVVpCICgxKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBWQVQgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnZhdCIgbmFtZT0iVkFUIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnZhdCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVkFUL1ZBVF8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlZBVCAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy92dC5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy52YXQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1ZBVC9WQVRfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVkFUKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9WQVQvVkFUXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFZDVCAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudmN0IiBuYW1lPSJWQ1QiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudmN0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9WQ1QvVkNUXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVkNUICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3ZjLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnZjdCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVkNUL1ZDVF8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJWQ1QoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1ZDVC9WQ1RfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnZjdCIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1ZDVF8wX1ZDVF8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBWQ1QgbGV2ZWwgKDEpIGJ5IFZDVCAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gVkVOIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy52ZW4iIG5hbWU9IlZFTiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy52ZW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1ZFTi9WRU5fMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJWRU4gKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvdmUuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudmVuIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9WRU4vVkVOXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlZFTigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVkVOL1ZFTl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnZlbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVkVOL1ZFTl8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlZFTiAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnZlbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVkVOL1ZFTl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJWRU4oMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1ZFTi9WRU5fMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy52ZW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1ZFTi9WRU5fMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJWRU4gKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy52ZW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1ZFTi9WRU5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVkVOKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9WRU4vVkVOXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy52ZW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1ZFTl8yX1ZFTl8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBWRU4iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnZlbiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1ZFTl8wX1ZFTl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBWRU4gbGV2ZWwgKDEpIGJ5IFZFTiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy52ZW4iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9WRU5fMV9WRU5fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgVkVOIGxldmVsICgyKSBieSBWRU4gKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFZHQiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudmdiIiBuYW1lPSJWR0IiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudmdiIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9WR0IvVkdCXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVkdCICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3ZpLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnZnYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVkdCL1ZHQl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJWR0IoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1ZHQi9WR0JfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gVklSIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy52aXIiIG5hbWU9IlZJUiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy52aXIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1ZJUi9WSVJfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJWSVIgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvdnEuaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudmlyIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9WSVIvVklSXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlZJUigwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVklSL1ZJUl8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBWTk0gLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnZubSIgbmFtZT0iVk5NIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnZubSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVk5NL1ZOTV8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlZOTSAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy92bS5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy52bm0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1ZOTS9WTk1fMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVk5NKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9WTk0vVk5NXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudm5tIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9WTk0vVk5NXzFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iVk5NICgxKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudm5tIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9WTk0vVk5NXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlZOTSgxKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVk5NL1ZOTV8xX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnZubSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVk5NL1ZOTV8yX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlZOTSAoMikgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnZubSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvVk5NL1ZOTV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJWTk0oMikgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1ZOTS9WTk1fMl9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnZubSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvVk5NXzJfVk5NXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIHdpdGhpbiBjb3VudHJ5IFZOTSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgdmFsaWQ9InN0YXJ0PTIwMDYtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudm5tIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL3JlbGF0aXZlcGh5c2ljYWwvVk5NXzBfVk5NXzEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIFZOTSBsZXZlbCAoMSkgYnkgVk5NICgwKSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmlibS5jb20iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnZubSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1ZOTV8xX1ZOTV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBWTk0gbGV2ZWwgKDIpIGJ5IFZOTSAoMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gVlVUIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy52dXQiIG5hbWU9IlZVVCIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy52dXQiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1ZVVC9WVVRfMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJWVVQgKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbmguaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMudnV0IiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9WVVQvVlVUXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlZVVCgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvVlVUL1ZVVF8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKworPCEtLSBXTEYgLS0+Cis8c3RlbV9jYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLndsZiIgbmFtZT0iV0xGIiBwYXJlbnRfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcyIvPgorCTwhLS0gTm9kZXMgYW5kIExhYmVscyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLndsZiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvV0xGL1dMRl8wX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IldMRiAoMCkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy93Zi5odG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy53bGYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1dMRi9XTEZfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iV0xGKDApIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9XTEYvV0xGXzBfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFdTTSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMud3NtIiBuYW1lPSJXU00iIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMud3NtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9XU00vV1NNXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iV1NNICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3dzLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLndzbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvV1NNL1dTTV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJXU00oMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1dTTS9XU01fMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gWUVNIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy55ZW0iIG5hbWU9IllFTSIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy55ZW0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1lFTS9ZRU1fMF9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJZRU0gKDApIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MveW0uaHRtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMueWVtIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9ZRU0vWUVNXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IllFTSgwKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvWUVNL1lFTV8wX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnllbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvWUVNL1lFTV8xX2FyZWEuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IllFTSAoMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnllbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvWUVNL1lFTV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJZRU0oMSkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1lFTS9ZRU1fMV9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy55ZW0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1lFTS9ZRU1fMl9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJZRU0gKDIpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy55ZW0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1lFTS9ZRU1fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iWUVNKDIpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9ZRU0vWUVNXzJfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCTwhLS0gRWRnZXMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy55ZW0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1lFTV8yX1lFTV8yLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCB3aXRoaW4gY291bnRyeSBZRU0iIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnllbSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1lFTV8wX1lFTV8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBZRU0gbGV2ZWwgKDEpIGJ5IFlFTSAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy55ZW0iIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9ZRU1fMV9ZRU1fMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgWUVNIGxldmVsICgyKSBieSBZRU0gKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFpBRiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuemFmIiBuYW1lPSJaQUYiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuemFmIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9aQUYvWkFGXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iWkFGICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3NmLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnphZiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvWkFGL1pBRl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJaQUYoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1pBRi9aQUZfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy56YWYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1pBRi9aQUZfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJaQUYgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy56YWYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1pBRi9aQUZfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iWkFGKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9aQUYvWkFGXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuemFmIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9aQUYvWkFGXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iWkFGICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuemFmIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9aQUYvWkFGXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlpBRigyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvWkFGL1pBRl8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuemFmIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9aQUZfMl9aQUZfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgWkFGIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy56YWYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1pBRl8yX1pXRV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgWkFGIGFuZCBaV0UiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnphZiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1pBRl8wX1pBRl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBaQUYgbGV2ZWwgKDEpIGJ5IFpBRiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy56YWYiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9aQUZfMV9aQUZfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgWkFGIGxldmVsICgyKSBieSBaQUYgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFpNQiAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuem1iIiBuYW1lPSJaTUIiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuem1iIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9aTUIvWk1CXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iWk1CICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3phLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnptYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvWk1CL1pNQl8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJaTUIoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1pNQi9aTUJfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy56bWIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1pNQi9aTUJfMV9hcmVhLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJaTUIgKDEpIGFyZWEiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy56bWIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1pNQi9aTUJfMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iWk1CKDEpIE5vZGVzIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vaG9tZS5odG0iIHNwYXRpYWw9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS9aTUIvWk1CXzFfTUFQLnhtbCIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuem1iIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9aTUIvWk1CXzJfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iWk1CICgyKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLyIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuem1iIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9aTUIvWk1CXzIuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IlpNQigyKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiBzcGF0aWFsPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvWk1CL1pNQl8yX01BUC54bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKwk8IS0tIEVkZ2VzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuem1iIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvcmVsYXRpb25zaGlwL2NvbW1vbmJvcmRlci9aTUJfMl9aTUJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iQ29tbW9uIEJvcmRlciByZWxhdGlvbnNoaXAgd2l0aGluIGNvdW50cnkgWk1CIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiB2YWxpZD0ic3RhcnQ9MjAwNi0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy56bWIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyL1pNQl8yX1pXRV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJDb21tb24gQm9yZGVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdW50cnkgWk1CIGFuZCBaV0UiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnptYiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1pNQl8wX1pNQl8xLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJQaHlzaWNhbCBjb250YWlubWVudCBvZiBaTUIgbGV2ZWwgKDEpIGJ5IFpNQiAoMCkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy56bWIiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9yZWxhdGlvbnNoaXAvcmVsYXRpdmVwaHlzaWNhbC9aTUJfMV9aTUJfMi5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgWk1CIGxldmVsICgyKSBieSBaTUIgKDEpIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgdmFsaWQ9InN0YXJ0PTE5MDAtMDEtMDE7IiAvPgorCis8IS0tIFpXRSAtLT4KKzxzdGVtX2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuendlIiBuYW1lPSJaV0UiIHBhcmVudF9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzIi8+CisJPCEtLSBOb2RlcyBhbmQgTGFiZWxzIC0tPgorPGR1Ymxpbl9jb3JlIGNhdGVnb3J5X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMuendlIiBpZGVudGlmaWVyPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9aV0UvWldFXzBfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iWldFICgwKSBhcmVhIiBmb3JtYXQ9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2dyYXBoLmVjb3JlIiBzb3VyY2U9Imh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3ppLmh0bWwiIHZhbGlkPSJzdGFydD0xOTAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnp3ZSIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvWldFL1pXRV8wLmdyYXBoIiB0eXBlPSJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vR3JhcGgiIHRpdGxlPSJaV0UoMCkgTm9kZXMiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5pc28ub3JnL2lzby9ob21lLmh0bSIgc3BhdGlhbD0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5L1pXRS9aV0VfMF9NQVAueG1sIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+CisKKzwhLS0gWlpaIC0tPgorPHN0ZW1fY2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy56enoiIG5hbWU9IlpaWiIgcGFyZW50X2lkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguZ2VvZ3JhcGh5LnBvbGl0aWNhbC5jb3VudHJpZXMiLz4KKwk8IS0tIE5vZGVzIGFuZCBMYWJlbHMgLS0+Cis8ZHVibGluX2NvcmUgY2F0ZWdvcnlfaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5nZW9ncmFwaHkucG9saXRpY2FsLmNvdW50cmllcy56enoiIGlkZW50aWZpZXI9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9jb3VudHJ5L1paWi9aWlpfLTFfYXJlYS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iWlpaICgtMSkgYXJlYSIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8iIHZhbGlkPSJzdGFydD0xNjAwLTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnp6eiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2NvdW50cnkvWlpaL1paWl8tMS5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iWlpaKC0xKSBOb2RlcyIgZm9ybWF0PSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC5lY29yZSIgc291cmNlPSJodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2hvbWUuaHRtIiB2YWxpZD0ic3RhcnQ9MTYwMC0wMS0wMTsiIC8+CisJPCEtLSBFZGdlcyAtLT4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnp6eiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9jb21tb25ib3JkZXIvWlpaXzBfWlpaXzAuZ3JhcGgiIHR5cGU9InN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9HcmFwaCIgdGl0bGU9IkNvbW1vbiBCb3JkZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gYWxsIGNvdW50cmllcyBpbiB0aGUgd29ybGQiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHZhbGlkPSJzdGFydD0yMDA2LTAxLTAxOyIgLz4KKzxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmdlb2dyYXBoeS5wb2xpdGljYWwuY291bnRyaWVzLnp6eiIgaWRlbnRpZmllcj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsL1paWl8tMV9aWlpfMC5ncmFwaCIgdHlwZT0ic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL0dyYXBoIiB0aXRsZT0iUGh5c2ljYWwgY29udGFpbm1lbnQgb2YgYWxsIENvdW50cmllcyAoMCkgYnkgdGhlIEVhcnRoICgtMSkiIGZvcm1hdD0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGguZWNvcmUiIHNvdXJjZT0iaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svIiB2YWxpZD0ic3RhcnQ9MTkwMC0wMS0wMTsiIC8+Cis8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmpvYnMvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NjRjYjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmpvYnMvLmNsYXNzcGF0aApAQCAtMCwwICsxLDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuSlVOSVRfQ09OVEFJTkVSLzQiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmpvYnMvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmpvYnMvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0OGVmNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmpvYnM8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5qb2JzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiYTgyMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSwyMCBAQAorI1R1ZSBTZXAgMDEgMTY6NTc6MzYgRURUIDIwMDkKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb249cmV0dXJuX3RhZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzI1YTFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5qb2JzL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMTIgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmpvYnMKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy5BY3RpdmF0b3IKK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnN0ZW0uam9icywKKyBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5qb2JzL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwZjBlZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNyBAQAorc291cmNlLi4gPSBzcmMvCitvdXRwdXQuLiA9IGJpbi8KK2Jpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICAuLFwKKyAgICAgICAgICAgICAgIG5vdGljZS5odG1sLFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5qb2JzL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YjE5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9lcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwzMjggQEAKKzxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKK3htbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCit4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Cis8bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Cis8bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxsaW5rIHJlbD1GaWxlLUxpc3QKK2hyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgorPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Cis8IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8bzpEb2N1bWVudFByb3BlcnRpZXM+CisgIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+CisgIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KKyAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgorICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgorICA8bzpQYWdlcz40PC9vOlBhZ2VzPgorICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgorICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KKyAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgorICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+CisgIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgorICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgorIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Cis8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8dzpXb3JkRG9jdW1lbnQ+CisgIDx3OlRyYWNrUmV2aXNpb25zLz4KKyA8L3c6V29yZERvY3VtZW50PgorPC94bWw+PCFbZW5kaWZdLS0+Cis8c3R5bGU+Cis8IS0tCisgLyogRm9udCBEZWZpbml0aW9ucyAqLworQGZvbnQtZmFjZQorCXtmb250LWZhbWlseTpUYWhvbWE7CisJcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7CisJbXNvLWZvbnQtY2hhcnNldDowOworCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOworCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOworCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQorIC8qIFN0eWxlIERlZmluaXRpb25zICovCitwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCisJe21zby1zdHlsZS1wYXJlbnQ6IiI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorcAorCXttYXJnaW4tcmlnaHQ6MGluOworCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOworCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOworCW1hcmdpbi1sZWZ0OjBpbjsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0CisJe21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOworCW1hcmdpbjowaW47CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6OC4wcHQ7CisJZm9udC1mYW1pbHk6VGFob21hOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK0BwYWdlIFNlY3Rpb24xCisJe3NpemU6OC41aW4gMTEuMGluOworCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOworCW1zby1oZWFkZXItbWFyZ2luOi41aW47CisJbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKKwltc28tcGFwZXItc291cmNlOjA7fQorZGl2LlNlY3Rpb24xCisJe3BhZ2U6U2VjdGlvbjE7fQorLS0+Cis8L3N0eWxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+CisKKzxkaXYgY2xhc3M9U2VjdGlvbjE+CisKKzxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KKzwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgorVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKK1JFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQorT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2luIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCitkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+CitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2NoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCitzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCitieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKK2lmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCitzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKK1Byb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgord2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQord29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCitlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50CitjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQorb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKK2Rpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCityZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAorYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCitzdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQorZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQorU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cworUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKK3BhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKK2FuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQorY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KK29mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCitieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgordG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bworYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQorUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cworQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKK3RoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAorZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAorbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKK3RvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCitpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCit0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCitkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKK0VhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0CityaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCit0aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgorPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2VmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKK2NvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKK2FuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5CithbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKK2luY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKK2FzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQorc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAorQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQorc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAoraW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQorY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKK2NvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKK2NvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQorb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKK3N1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKK2FjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKK2FuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCitvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKK2xpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCitDb250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgorQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCitjb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCitsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwordGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgorY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKK29mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcworcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCit0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCit0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAorYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKK2luIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAord2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKK3NlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQorb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQorY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKK0FHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCitXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCitNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQorcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKK1Byb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKK0FncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKK2NvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCitlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCitPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKK1RIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKK1RIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCitvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0CitmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQorbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KK2FnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKK290aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQorc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAorc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQorcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKK3JpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKK2NvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50CitTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKK3RoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCit0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCitBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bworc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KKyhpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKK2V4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKK2V4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQorU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgorQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCitBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCitpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KKworPC9kaXY+CisKKzwvYm9keT4KKworPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9ub3RpY2UuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9ub3RpY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFmOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5qb2JzL25vdGljZS5odG1sCkBAIC0wLDAgKzEsNzkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+TWFyY2ggMTcsIDIwMDU8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorICAgCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCisgICAKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUworICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisgICAKKzx1bD4KKwk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4gICAKKyAKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKwk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCQkKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKwk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKKwk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorICAgCis8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGY5NTg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5qb2JzL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjYgQEAKKyMvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqCisjICogQ29udHJpYnV0b3JzOgorIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBUbyBjb2RlIGRldmVsb3BlcjoKKyMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKKyMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgorIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQorIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitwbHVnaW5OYW1lID0gU1RFTSBKb2IgYW5kIFNpbXVsYXRpb24gTWFuYWdlciBUZXN0IFN1aXRlCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9iYXRjaC9CYXRjaE1hbmFnZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9iYXRjaC9CYXRjaE1hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0NGFjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2JhdGNoL0JhdGNoTWFuYWdlclRlc3QuamF2YQpAQCAtMCwwICsxLDc2IEBACisvLyBCYXRjaE1hbmFnZXJUZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC50ZXN0cy5FeHBlcmltZW50VGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBKVW5pdDQgdGVzdCBjYXNlIGZvciB0aGUgdGhlIHtAbGluayBCYXRjaE1hbmFnZXJ9LgorICovCitwdWJsaWMgY2xhc3MgQmF0Y2hNYW5hZ2VyVGVzdCB7CisKKwkvLyBUaGUgY3VycmVudCBCYXRjaE1hbmFnZXIgdW5kZXIgdGVzdC4KKwlwcm90ZWN0ZWQgQmF0Y2hNYW5hZ2VyIGZpeHR1cmU7CisKKwlwcml2YXRlIEJhdGNoTWFuYWdlciBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9IC8vIGdldEZpeHR1cmUKKworCXByaXZhdGUgdm9pZCBzZXRGaXh0dXJlKGZpbmFsIEJhdGNoTWFuYWdlciBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfSAvLyBzZXRGaXh0dXJlCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgQmF0Y2hNYW5hZ2VyfSB0byBiZSB1c2VkIGZvciB0ZXN0aW5nLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQmF0Y2hNYW5hZ2VyIGNyZWF0ZUZpeHR1cmUoKSB7CisJCUJhdGNoTWFuYWdlci5yZXNldEJhdGNoTWFuYWdlcigpOworCQlyZXR1cm4gQmF0Y2hNYW5hZ2VyLklOU1RBTkNFOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJLyoqCisJICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCisJICovCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLkJhdGNoTWFuYWdlciNnZXRBY3RpdmVCYXRjaGVzKCl9LgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldEJhdGNoZXMoKSB7CisJCS8vIFRoaXMgaXNuJ3QgbXVjaCBvZiBhIHRlc3QuCisJCWZpbmFsIEJhdGNoTWFuYWdlciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGZpeHR1cmUuZ2V0QWN0aXZlQmF0Y2hlcygpLnNpemUoKSA9PSAwKTsKKwl9IC8vIHRlc3RHZXRCYXRjaGVzCisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLkJhdGNoTWFuYWdlciNnZXRTZXF1ZW5jZU51bWJlcigpfS4KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRTZXF1ZW5jZU51bWJlcigpIHsKKwkJLy8gVGVzdCB0aGF0IHRoZSBzZXF1ZW5jZSBudW1iZXIgaXMgaW5jcmVtZW50ZWQuCisJCWZpbmFsIEJhdGNoTWFuYWdlciBmaXh0dXJlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnRUcnVlKGZpeHR1cmUuZ2V0U2VxdWVuY2VOdW1iZXIoKSA9PSAwKTsKKwkJZml4dHVyZS5jcmVhdGVCYXRjaChFeHBlcmltZW50VGVzdC5jcmVhdGVGaXh0dXJlKCkpOworCQlhc3NlcnRUcnVlKGZpeHR1cmUuZ2V0U2VxdWVuY2VOdW1iZXIoKSA9PSAxKTsKKwl9IC8vIHRlc3RHZXRTZXF1ZW5jZU51bWJlcgorfSAvLyBCYXRjaE1hbmFnZXJUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9iYXRjaC9CYXRjaFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL2JhdGNoL0JhdGNoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZWM3YjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9iYXRjaC9CYXRjaFRlc3QuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLy8gQmF0Y2hUZXN0LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0NCB0ZXN0IGNhc2UgZm9yIHRoZSB7QGxpbmsgQmF0Y2h9IGNsYXNzLgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgQmF0Y2hUZXN0IHsKKworCS8qKgorCSAqIEFuIGludGVnZXIgdG8gYmUgdXNlZCBhcyBhIHNlcXVlbmNlIG51bWJlciBmb3IgdGVzdGluZy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVRDSF9TRVFVRU5DRV9OVU1CRVIgPSAzOworCisJLyoqCisJICogVGhlIGN1cnJlbnQge0BsaW5rIEJhdGNofSB1bmRlciB0ZXN0LgorCSAqLworCXByb3RlY3RlZCBCYXRjaCBmaXh0dXJlOworCisJcHJpdmF0ZSBCYXRjaCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9IC8vIGdldEZpeHR1cmUKKworCXZvaWQgc2V0Rml4dHVyZShmaW5hbCBCYXRjaCBiYXRjaCkgeworCQl0aGlzLmZpeHR1cmUgPSBiYXRjaDsKKwl9IC8vIHNldEZpeHR1cmUKKworCS8qKgorCSAqIEByZXR1cm4gYSBuZXcgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEJhdGNofSBvciBhIHN1YmNsYXNzIGZvciB0ZXN0aW5nCisJICogICAgICAgICBwdXJwb3Nlcy4KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgQmF0Y2ggY3JlYXRlRml4dHVyZSgpOworCisJLyoqCisJICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCisJICovCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9IC8vIHNldFVwCisKKwkvLyAvKioKKwkvLyAqIFRlc3QgbWV0aG9kIGZvcgorCS8vICoge0BsaW5rCisJLy8gb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLkJhdGNoI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcil9LgorCS8vICovCisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCB0ZXN0UnVuSVByb2dyZXNzTW9uaXRvcigpIHsKKwkvLyBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7IC8vIFRPRE8KKwkvLyB9CisJLy8KKwkvLyAvKioKKwkvLyAqIFRlc3QgbWV0aG9kIGZvcgorCS8vICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5CYXRjaCNnZXRUb3RhbFdvcmsoKX0uCisJLy8gKi8KKwkvLyBAVGVzdAorCS8vIHB1YmxpYyB2b2lkIHRlc3RHZXRUb3RhbFdvcmsoKSB7CisJLy8gZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOyAvLyBUT0RPCisJLy8gfQorCS8vCisJLy8gLyoqCisJLy8gKiBUZXN0IG1ldGhvZCBmb3IKKwkvLyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guQmF0Y2gjZ2V0TmV4dFNpbXVsYXRpb25Ub1J1bigpfS4KKwkvLyAqLworCS8vIEBUZXN0CisJLy8gcHVibGljIHZvaWQgdGVzdEdldE5leHRTaW11bGF0aW9uVG9SdW4oKSB7CisJLy8gZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOyAvLyBUT0RPCisJLy8gfQorCisJLy8gLyoqCisJLy8gKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5CYXRjaCNydW4oKX0uCisJLy8gKi8KKwkvLyBAVGVzdAorCS8vIHB1YmxpYyB2b2lkIHRlc3RSdW4oKSB7CisJLy8gZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOyAvLyBUT0RPCisJLy8gfQorCS8vCisJLy8gLyoqCisJLy8gKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5CYXRjaCNzdG9wKCl9LgorCS8vICovCisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCB0ZXN0U3RvcCgpIHsKKwkvLyBmYWlsKCJOb3QgeWV0IGltcGxlbWVudGVkIik7IC8vIFRPRE8KKwkvLyB9CisKKwkvLyAvKioKKwkvLyAqIFRlc3QgbWV0aG9kIGZvcgorCS8vICoge0BsaW5rCisJLy8gb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLkJhdGNoI3NpbXVsYXRpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25FdmVudCl9LgorCS8vICovCisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCB0ZXN0U2ltdWxhdGlvbkNoYW5nZWQoKSB7CisJLy8gZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOyAvLyBUT0RPCisJLy8gfQorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5CYXRjaCNnZXRTZXF1ZW5jZU51bWJlcigpfS4KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRTZXF1ZW5jZU51bWJlcigpIHsKKwkJZmluYWwgQmF0Y2ggZml4dHVyZSA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShmaXh0dXJlLmdldFNlcXVlbmNlTnVtYmVyKCkgPT0gQkFUQ0hfU0VRVUVOQ0VfTlVNQkVSKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLkJhdGNoI2dldEJhdGNoU3RhdGUoKX0uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0QmF0Y2hTdGF0ZSgpIHsKKwkJYXNzZXJ0VHJ1ZShnZXRGaXh0dXJlKCkuZ2V0QmF0Y2hTdGF0ZSgpID09IEJhdGNoU3RhdGUuUEFVU0VEKTsKKwl9IC8vIHRlc3RHZXRCYXRjaFN0YXRlCisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5CYXRjaCN0b1N0cmluZygpfS4KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKKwkJYXNzZXJ0Tm90TnVsbChnZXRGaXh0dXJlKCkudG9TdHJpbmcoKSk7CisJfSAvLyB0ZXN0VG9TdHJpbmcKKworfSAvLyBCYXRjaFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vU2ltdWxhdGlvbkV2ZW50VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9TaW11bGF0aW9uRXZlbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyOWM0NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vU2ltdWxhdGlvbkV2ZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8vIFNpbXVsYXRpb25FdmVudFRlc3QuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLnRlc3RzLlNjZW5hcmlvVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvblN0YXRlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBKVW5pdCB0ZXN0IGNhc2UgZm9yIHRoZSBjbGFzcyBTaW11bGF0aW9uRXZlbnQKKyAqLworcHVibGljIGNsYXNzIFNpbXVsYXRpb25FdmVudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBTaW11bGF0aW9uRXZlbnQgdGVzdC4KKwkgKi8KKwlwcm90ZWN0ZWQgU2ltdWxhdGlvbkV2ZW50IGZpeHR1cmU7CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNpbXVsYXRpb25FdmVudCB0ZXN0IGNhc2UuCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShTaW11bGF0aW9uRXZlbnQgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU2ltdWxhdGlvbkV2ZW50IHRlc3QgY2FzZS4KKwkgKi8KKwlwcml2YXRlIFNpbXVsYXRpb25FdmVudCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gdGhpcy5maXh0dXJlOworCX0gLy8gZ2V0Rml4dHVyZQorCisJLyoqCisJICogQHJldHVybiBhIFNpbXVsYXRpb25FdmVudCBmb3IgdGVzdGluZworCSAqLworCXB1YmxpYyBzdGF0aWMgU2ltdWxhdGlvbkV2ZW50IGNyZWF0ZUZpeHR1cmUoKSB7CisJCVNjZW5hcmlvIHNjZW5hcmlvID0gU2NlbmFyaW9UZXN0LmNyZWF0ZUZpeHR1cmUoKTsKKwkJZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IFNpbXVsYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKQorCQkJCS5jcmVhdGVTaW11bGF0aW9uKHNjZW5hcmlvLCBudWxsKTsKKwkJcmV0dXJuIG5ldyBTaW11bGF0aW9uRXZlbnQoc2ltdWxhdGlvbiwgU2ltdWxhdGlvblN0YXRlLlJVTk5JTkcpOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJLyoqCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9IC8vIHNldFVwCisKKwkvKioKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IgdGhlIGFiaWxpdHkgdG8gZ2V0IHRoZSBzdGF0ZQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uRXZlbnQjZ2V0U2ltdWxhdGlvblN0YXRlKCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRTaW11bGF0aW9uU3RhdGUoKSB7CisJCWZpbmFsIFNpbXVsYXRpb25FdmVudCBzaW11bGF0aW9uRXZlbnQgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoc2ltdWxhdGlvbkV2ZW50LmdldFNpbXVsYXRpb25TdGF0ZSgpLmVxdWFscygKKwkJCQlTaW11bGF0aW9uU3RhdGUuUlVOTklORykpOworCX0gLy8gdGVzdEdldFNpbXVsYXRpb25TdGF0ZQorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yIHRoZSBhYmlsaXR5IHRvIGdldCB0aGUgb3JpZ2luYXRpbmcgU2ltdWxhdGlvbgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uRXZlbnQjZ2V0U2ltdWxhdGlvbigpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U2ltdWxhdGlvbigpIHsKKwkJZmluYWwgU2ltdWxhdGlvbkV2ZW50IHNpbXVsYXRpb25FdmVudCA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0Tm90TnVsbChzaW11bGF0aW9uRXZlbnQuZ2V0U2ltdWxhdGlvbigpKTsKKwl9IC8vIHRlc3RHZXRTaW11bGF0aW9uCisKK30KKy8vIFNpbXVsYXRpb25FdmVudFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vU2ltdWxhdGlvbk1hbmFnZXJFdmVudFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vU2ltdWxhdGlvbk1hbmFnZXJFdmVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTM3N2JlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9TaW11bGF0aW9uTWFuYWdlckV2ZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvLyBTaW11bGF0aW9uTWFuYWdlckV2ZW50VGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyRXZlbnQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIEpVbml0IHRlc3Qgb2YgU2ltdWxhdGlvbk1hbmFnZXJFdmVudAorICovCitwdWJsaWMgY2xhc3MgU2ltdWxhdGlvbk1hbmFnZXJFdmVudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBTaW11bGF0aW9uRXZlbnQgdGVzdC4KKwkgKi8KKwlwcm90ZWN0ZWQgU2ltdWxhdGlvbk1hbmFnZXJFdmVudCBmaXh0dXJlOworCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTaW11bGF0aW9uRXZlbnQgdGVzdCBjYXNlLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoU2ltdWxhdGlvbk1hbmFnZXJFdmVudCBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTaW11bGF0aW9uRXZlbnQgdGVzdCBjYXNlLgorCSAqLworCXByaXZhdGUgU2ltdWxhdGlvbk1hbmFnZXJFdmVudCBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gdGhpcy5maXh0dXJlOworCX0gLy8gZ2V0Rml4dHVyZQorCisJLyoqCisJICogQHJldHVybiBhIFNpbXVsYXRpb25FdmVudCBmb3IgdGVzdGluZworCSAqLworCXB1YmxpYyBzdGF0aWMgU2ltdWxhdGlvbk1hbmFnZXJFdmVudCBjcmVhdGVGaXh0dXJlKCkgeworCQlTaW11bGF0aW9uTWFuYWdlciBzaW11bGF0aW9uTWFuYWdlciA9IFNpbXVsYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKTsKKwkJcmV0dXJuIG5ldyBTaW11bGF0aW9uTWFuYWdlckV2ZW50KHNpbXVsYXRpb25NYW5hZ2VyLAorCQkJCVNpbXVsYXRpb25NYW5hZ2VyLk5PTkUsIFNpbXVsYXRpb25NYW5hZ2VyLk5PTkUpOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJLyoqCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9IC8vIHNldFVwCisKKwkvKioKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXJFdmVudCNTaW11bGF0aW9uTWFuYWdlckV2ZW50KG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyLCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbltdLCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbltdKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdFNpbXVsYXRpb25NYW5hZ2VyRXZlbnQoKSB7CisJCWZpbmFsIFNpbXVsYXRpb25NYW5hZ2VyRXZlbnQgc2ltdWxhdGlvbk1hbmFnZXJFdmVudCA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShzaW11bGF0aW9uTWFuYWdlckV2ZW50LmdldFNpbXVsYXRpb25zQWRkZWQoKS5sZW5ndGggPT0gMCk7CisJCWFzc2VydFRydWUoc2ltdWxhdGlvbk1hbmFnZXJFdmVudC5nZXRTaW11bGF0aW9uc1JlbW92ZWQoKS5sZW5ndGggPT0gMCk7CisJCS8vIGFzc2VydFRydWUoc2ltdWxhdGlvbk1hbmFnZXJFdmVudC5nZXRTaW11bGF0aW9uc0FkZGVkKCkuZXF1YWxzKAorCQkvLyBTaW11bGF0aW9uTWFuYWdlci5OT05FKSk7CisJCS8vIGFzc2VydFRydWUoc2ltdWxhdGlvbk1hbmFnZXJFdmVudC5nZXRTaW11bGF0aW9uc1JlbW92ZWQoKS5lcXVhbHMoCisJCS8vIFNpbXVsYXRpb25NYW5hZ2VyLk5PTkUpKTsKKwl9IC8vIHRlc3RTaW11bGF0aW9uTWFuYWdlckV2ZW50CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXJFdmVudCNnZXRTaW11bGF0aW9uc0FkZGVkKCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRTaW11bGF0aW9uc0FkZGVkKCkgeworCQlmaW5hbCBTaW11bGF0aW9uTWFuYWdlckV2ZW50IHNpbXVsYXRpb25NYW5hZ2VyRXZlbnQgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoc2ltdWxhdGlvbk1hbmFnZXJFdmVudC5nZXRTaW11bGF0aW9uc0FkZGVkKCkubGVuZ3RoID09IDApOworCQkvLyBhc3NlcnRUcnVlKHNpbXVsYXRpb25NYW5hZ2VyRXZlbnQuZ2V0U2ltdWxhdGlvbnNBZGRlZCgpLmVxdWFscygKKwkJLy8JCQkJU2ltdWxhdGlvbk1hbmFnZXIuTk9ORSkpOworCX0gLy8gdGVzdEdldFNpbXVsYXRpb25zQWRkZWQKKworCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvcgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uTWFuYWdlckV2ZW50I2dldFNpbXVsYXRpb25zUmVtb3ZlZCgpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U2ltdWxhdGlvbnNSZW1vdmVkKCkgeworCQlmaW5hbCBTaW11bGF0aW9uTWFuYWdlckV2ZW50IHNpbXVsYXRpb25NYW5hZ2VyRXZlbnQgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoc2ltdWxhdGlvbk1hbmFnZXJFdmVudC5nZXRTaW11bGF0aW9uc1JlbW92ZWQoKS5sZW5ndGggPT0gMCk7CisJCS8vIGFzc2VydFRydWUoc2ltdWxhdGlvbk1hbmFnZXJFdmVudC5nZXRTaW11bGF0aW9uc1JlbW92ZWQoKS5lcXVhbHMoCisJCS8vIFNpbXVsYXRpb25NYW5hZ2VyLk5PTkUpKTsKKwl9CisKK30gLy8gU2ltdWxhdGlvbk1hbmFnZXJFdmVudFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vU2ltdWxhdGlvbk1hbmFnZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9zaW11bGF0aW9uL1NpbXVsYXRpb25NYW5hZ2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YTJjZTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vam9icy9zaW11bGF0aW9uL1NpbXVsYXRpb25NYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTk0IEBACisvLyBTaW11bGF0aW9uTWFuYWdlclRlc3QuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby50ZXN0cy5TY2VuYXJpb1Rlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXJFdmVudDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgSlVuaXQgdGVzdCBmb3Ige0BsaW5rIFNpbXVsYXRpb25NYW5hZ2VyfS4KKyAqLworcHVibGljIGNsYXNzIFNpbXVsYXRpb25NYW5hZ2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIGltcGxlbWVudHMKKwkJSVNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXIgeworCisJLyoqCisJICogVGhlIGZpeHR1cmUgdG8gYmUgdGVzdGVkLgorCSAqLworCXByb3RlY3RlZCBTaW11bGF0aW9uTWFuYWdlciBmaXh0dXJlOworCisJcHJpdmF0ZSBJU2ltdWxhdGlvbltdIGV4cGVjdGVkUmVtb3ZlZDsKKworCXByaXZhdGUgSVNpbXVsYXRpb25bXSBleHBlY3RlZEFkZGVkOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTaW11bGF0aW9uRXZlbnQgdGVzdCBjYXNlLgorCSAqLworCXByaXZhdGUgU2ltdWxhdGlvbk1hbmFnZXIgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIHRoaXMuZml4dHVyZTsKKwl9IC8vIGdldEZpeHR1cmUKKworCS8qKgorCSAqIEByZXR1cm4gYSBTaW11bGF0aW9uTWFuYWdlciBmb3IgdGVzdGluZworCSAqLworCXB1YmxpYyBzdGF0aWMgU2ltdWxhdGlvbk1hbmFnZXIgY3JlYXRlRml4dHVyZSgpIHsKKwkJU2ltdWxhdGlvbk1hbmFnZXIucmVzZXRTaW11bGF0aW9uTWFuYWdlcigpOworCQlmaW5hbCBTaW11bGF0aW9uTWFuYWdlciBtYW5hZ2VyID0gU2ltdWxhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpOworCQltYW5hZ2VyLmNyZWF0ZVNpbXVsYXRpb24oU2NlbmFyaW9UZXN0LmNyZWF0ZUZpeHR1cmUoKSwgbnVsbCk7CisJCXJldHVybiBtYW5hZ2VyOworCX0gLy8gY3JlYXRlRml4dHVyZQorCisJLyoqCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwkJZ2V0Rml4dHVyZSgpLmFkZFNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXIodGhpcyk7CisJfSAvLyBzZXRVcAorCisJLyoqCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfSAvLyB0ZWFyRG93bgorCisJLyoqCisJICogQHBhcmFtIGZpeHR1cmUKKwkgKiAgICAgICAgICAgIHRoZSBzaW11bGF0aW9uIG1hbmFnZXIgdG8gdGVzdAorCSAqLworCXByaXZhdGUgdm9pZCBzZXRGaXh0dXJlKFNpbXVsYXRpb25NYW5hZ2VyIGZpeHR1cmUpIHsKKwkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKKwl9IC8vIHNldEZpeHR1cmUKKworCS8qKgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uTWFuYWdlciNnZXRNYW5hZ2VyKCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRNYW5hZ2VyKCkgeworCQlmaW5hbCBTaW11bGF0aW9uTWFuYWdlciBtYW5hZ2VyID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnROb3ROdWxsKG1hbmFnZXIpOworCX0gLy8gdGVzdEdldE1hbmFnZXIKKworCS8qKgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uTWFuYWdlciNnZXRBY3RpdmVTaW11bGF0aW9ucygpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0QWN0aXZlU2ltdWxhdGlvbnMoKSB7CisJCWZpbmFsIFNpbXVsYXRpb25NYW5hZ2VyIG1hbmFnZXIgPSBjcmVhdGVGaXh0dXJlKCk7CisJCUxpc3Q8SVNpbXVsYXRpb24+IHNpbXVsYXRpb25zID0gbWFuYWdlci5nZXRBY3RpdmVTaW11bGF0aW9ucygpOworCQlhc3NlcnRUcnVlKHNpbXVsYXRpb25zLnNpemUoKSA+IDApOworCX0gLy8gdGVzdEdldEFjdGl2ZVNpbXVsYXRpb25zCisKKwkvLyAvKioKKwkvLyAqIHtAbGluaworCS8vIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyI2NyZWF0ZVNpbXVsYXRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCl9LgorCS8vICovCisJLy8gcHVibGljIHZvaWQgdGVzdENyZWF0ZVNpbXVsYXRpb25JQ29uZmlndXJhdGlvbkVsZW1lbnQoKSB7CisJLy8gZmluYWwgU2ltdWxhdGlvbk1hbmFnZXIgbWFuYWdlciA9IGNyZWF0ZUZpeHR1cmUoKTsKKwkvLyBmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uID0KKwkvLyBtYW5hZ2VyLmNyZWF0ZVNpbXVsYXRpb24oZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKSk7CisJLy8gYXNzZXJ0Tm90TnVsbChzaW11bGF0aW9uKTsKKwkvLyB9IC8vIHRlc3RDcmVhdGVTaW11bGF0aW9uSUNvbmZpZ3VyYXRpb25FbGVtZW50CisKKwkvLyAvKioKKwkvLyAqIEByZXR1cm4gYSBDb25maWd1cmF0aW9uRWxlbWVudCB0aGF0IHNwZWNpZmllcyBhIFNjZW5hcmlvCisJLy8gKi8KKwkvLyBwcml2YXRlIFNjZW5hcmlvIGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkgeworCS8vCQkKKwkvLyB9IC8vIGdldENvbmZpZ3VyYXRpb25FbGVtZW50CisKKwkvKioKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXIjY3JlYXRlU2ltdWxhdGlvbihvcmcuZWNsaXBzZS5zdGVtLnNjZW5hcmlvLlNjZW5hcmlvKX0uCisJICogVE9ETyB0aGUgVVJJIGlzbid0ICJtYXBwZWQiLCBuZWVkIHRvIHdvcmsgb24gdGhpcyB0ZXN0LgorCSAqLworCS8vIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTaW11bGF0aW9uVVJJKCkgeworCS8vIGZpbmFsIFNpbXVsYXRpb25NYW5hZ2VyIG1hbmFnZXIgPSBjcmVhdGVGaXh0dXJlKCk7CisJLy8gbWFuYWdlci5jcmVhdGVTaW11bGF0aW9uKFVSSQorCS8vIC5jcmVhdGVVUkkoVGVzdENvbnN0YW50cy5KVU5JVF9URVNUX1NDRU5BUklPXzFfVVJJX1NUUklORykpOworCS8vIGFzc2VydFRydWUobWFuYWdlci5nZXRBY3RpdmVTaW11bGF0aW9ucygpLnNpemUoKSA9PSAyKTsKKwkvLyB9IC8vIHRlc3RDcmVhdGVTaW11bGF0aW9uVVJJCisJLyoqCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyI2NyZWF0ZVNpbXVsYXRpb24ob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdENyZWF0ZVNpbXVsYXRpb25TY2VuYXJpbygpIHsKKwkJZmluYWwgU2ltdWxhdGlvbk1hbmFnZXIgbWFuYWdlciA9IGNyZWF0ZUZpeHR1cmUoKTsKKwkJbWFuYWdlci5jcmVhdGVTaW11bGF0aW9uKFNjZW5hcmlvVGVzdC5jcmVhdGVGaXh0dXJlKCksIG51bGwpOworCQlhc3NlcnRUcnVlKG1hbmFnZXIuZ2V0QWN0aXZlU2ltdWxhdGlvbnMoKS5zaXplKCkgPT0gMik7CisJfSAvLyB0ZXN0Q3JlYXRlU2ltdWxhdGlvblNjZW5hcmlvCisKKwkvKioKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXIjY3JlYXRlU2ltdWxhdGlvbihvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8pfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2ltdWxhdGlvblNlcXVlbmNlTnVtYmVyKCkgeworCQlmaW5hbCBTaW11bGF0aW9uTWFuYWdlciBtYW5hZ2VyID0gY3JlYXRlRml4dHVyZSgpOworCQkvLyBUaGUgbWFuYWdlciBpcyBjcmVhdGVkIHdpdGggYW4gYWN0aXZlIHNpbXVsYXRpb24gc28gdGhlIHNlcXVlbmNlCisJCS8vIG51bWJlciBvZiB0aGF0IHNpbXVsYXRpb24gc2hvdWxkIGJlICIwIiAoemVybykuCisJCWFzc2VydFRydWUobWFuYWdlci5nZXRBY3RpdmVTaW11bGF0aW9ucygpLnNpemUoKSA9PSAxKTsKKwkJSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IG1hbmFnZXIuZ2V0QWN0aXZlU2ltdWxhdGlvbnMoKS5nZXQoMCk7CisJCWFzc2VydFRydWUoc2ltdWxhdGlvbi5nZXRTZXF1ZW5jZU51bWJlcigpID09IDApOworCisJCS8vIExldCdzIGNyZWF0ZSBhbm90aGVyIHNpbXVsYXRpb24gYW5kIGNoZWNrIGl0cyBudW1iZXIKKwkJbWFuYWdlci5jcmVhdGVTaW11bGF0aW9uKFNjZW5hcmlvVGVzdC5jcmVhdGVGaXh0dXJlKCksIG51bGwpOworCQlhc3NlcnRUcnVlKG1hbmFnZXIuZ2V0QWN0aXZlU2ltdWxhdGlvbnMoKS5zaXplKCkgPT0gMik7CisJCXNpbXVsYXRpb24gPSBtYW5hZ2VyLmdldEFjdGl2ZVNpbXVsYXRpb25zKCkuZ2V0KDEpOworCQlhc3NlcnRUcnVlKHNpbXVsYXRpb24uZ2V0U2VxdWVuY2VOdW1iZXIoKSA9PSAxKTsKKwl9IC8vIHRlc3RTaW11bGF0aW9uU2VxdWVuY2VOdW1iZXIKKworCS8qKgorCSAqIHRlc3QgY3JlYXRpbmcgYW5kIHJ1bm5pbmcgYSBzaW11bGF0aW9uIGZyb20gYSBzY2VuYXJpbworCSAqIAorCSAqIFlvdSBjYW4ndCB0ZXN0IHRoaXMuIFdoYXQgaGFwcGVucyBpcyB0aGUgY2FsbCB0byBzaW11bGF0aW9uc0NoYW5nZWQKKwkgKiBvY2N1cnMgYmVmb3JlIHRoZSBhc3NpZ25tZW50IHRvIGV4cGVjdGVkQWRkZWQuCisJICovCisJLy8gcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZFJ1blNpbXVsYXRpb25TY2VuYXJpbygpIHsKKwkvLyBmaW5hbCBTaW11bGF0aW9uTWFuYWdlciBtYW5hZ2VyID0gZ2V0Rml4dHVyZSgpOworCS8vIGZpbmFsIElTaW11bGF0aW9uIG5ld1NpbXVsYXRpb24gPSBtYW5hZ2VyCisJLy8gLmNyZWF0ZUFuZFJ1blNpbXVsYXRpb24oU2NlbmFyaW9UZXN0LmNyZWF0ZUZpeHR1cmUoKSk7CisJLy8gZXhwZWN0ZWRBZGRlZCA9IG5ldyBJU2ltdWxhdGlvbltdIHsgbmV3U2ltdWxhdGlvbiB9OworCS8vIH0gLy8gdGVzdENyZWF0ZUFuZFJ1blNpbXVsYXRpb25TY2VuYXJpbworCS8qKgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uTWFuYWdlciNhZGRTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdEFkZFNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXIoKSB7CisJCWZpbmFsIFNpbXVsYXRpb25NYW5hZ2VyIG1hbmFnZXIgPSBnZXRGaXh0dXJlKCk7CisJCW1hbmFnZXIuYWRkU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lcih0aGlzKTsKKwl9IC8vIHRlc3RBZGRTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyCisKKwkvKioKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXIpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTGlzdGVuZXIoKSB7CisJCS8vIE5vdCBzdXJlIHdoYXQgZWxzZSB0byBkbyBoZXJlLCBvdGhlciB0aGFuIHRvIHZlcmlmeSB0aGF0IHRoZXJlIGFyZW4ndAorCQkvLyBhbnkgZXhjZXB0aW9ucworCQl0ZXN0QWRkU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lcigpOworCQlmaW5hbCBTaW11bGF0aW9uTWFuYWdlciBtYW5hZ2VyID0gZ2V0Rml4dHVyZSgpOworCQltYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKHRoaXMpOworCX0gLy8gdGVzdFJlbW92ZUxpc3RlbmVyCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyI3NpbXVsYXRpb25zQ2hhbmdlZChvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uTWFuYWdlckV2ZW50KQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnF1YWxpZmllZC1maWVsZC1hY2Nlc3MiKQorCXB1YmxpYyB2b2lkIHNpbXVsYXRpb25zQ2hhbmdlZChTaW11bGF0aW9uTWFuYWdlckV2ZW50IGV2ZW50KSB7CisJCWFzc2VydFRydWUoZXZlbnQuZ2V0U2ltdWxhdGlvbnNBZGRlZCgpLmVxdWFscyhleHBlY3RlZEFkZGVkKSk7CisJCWFzc2VydFRydWUoZXZlbnQuZ2V0U2ltdWxhdGlvbnNSZW1vdmVkKCkuZXF1YWxzKGV4cGVjdGVkUmVtb3ZlZCkpOworCX0gLy8gc2ltdWxhdGlvbnNDaGFuZ2VkCisKK30vLyBTaW11bGF0aW9uTWFuYWdlclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vU2ltdWxhdGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9qb2JzL3NpbXVsYXRpb24vU2ltdWxhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDU3Y2NlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5qb2JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2pvYnMvc2ltdWxhdGlvbi9TaW11bGF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTk5IEBACisvLyBTaW11bGF0aW9uVGVzdC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby50ZXN0cy5TY2VuYXJpb1Rlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvblN0YXRlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBKVW5pdCB0ZXN0IGNhc2UgZm9yIHRoZSBjbGFzcyBTaW11bGF0aW9uLmphdmEKKyAqLworcHVibGljIGNsYXNzIFNpbXVsYXRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgaW1wbGVtZW50cyBJU2ltdWxhdGlvbkxpc3RlbmVyIHsKKworCS8qKgorCSAqIFRoZSBzaW11bGF0aW9uIHdlIHRlc3QuCisJICovCisJcHJpdmF0ZSBJU2ltdWxhdGlvbiBmaXh0dXJlOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc3RhdGUgdGhhdCB3ZSdyZSBleHBlY3RpbmcgdGhlIGZpeHR1cmUgc2ltdWxhdGlvbiB0byByZXBvcnQuCisJICovCisJcHJpdmF0ZSBTaW11bGF0aW9uU3RhdGUgZXhwZWN0ZWRTaW11bGF0aW9uU3RhdGU7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNpbXVsYXRpb25FdmVudCB0ZXN0IGNhc2UuCisJICovCisJcHJpdmF0ZSBJU2ltdWxhdGlvbiBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gdGhpcy5maXh0dXJlOworCX0gLy8gZ2V0Rml4dHVyZQorCisJLyoqCisJICogQHJldHVybiBhIFNpbXVsYXRpb24gZm9yIHRlc3RpbmcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElTaW11bGF0aW9uIGNyZWF0ZUZpeHR1cmUoKSB7CisJCWZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb24gPSBTaW11bGF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkKKwkJCQkuY3JlYXRlU2ltdWxhdGlvbihTY2VuYXJpb1Rlc3QuY3JlYXRlRml4dHVyZSgpLCBudWxsKTsKKwkJcmV0dXJuIHNpbXVsYXRpb247CisJfSAvLyBjcmVhdGVGaXh0dXJlCisKKwkvKioKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCQlnZXRGaXh0dXJlKCkuYWRkU2ltdWxhdGlvbkxpc3RlbmVyKHRoaXMpOworCX0gLy8gc2V0VXAKKworCS8qKgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0gLy8gdGVhckRvd24KKworCS8qKgorCSAqIEBwYXJhbSBvYmplY3QKKwkgKi8KKwlwcml2YXRlIHZvaWQgc2V0Rml4dHVyZShJU2ltdWxhdGlvbiBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb24jU2ltdWxhdGlvbihvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8sIGludCl9CisJICovCisJcHVibGljIHZvaWQgdGVzdFNpbXVsYXRpb25TY2VuYXJpbygpIHsKKwkJZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0Tm90TnVsbChzaW11bGF0aW9uLmdldFNjZW5hcmlvKCkpOworCX0gLy8gdGVzdFNpbXVsYXRpb25TY2VuYXJpbworCisJLyoqCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb24jZ2V0U2ltdWxhdGlvblN0YXRlKCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRTaW11bGF0aW9uU3RhdGUoKSB7CisJCWZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb24gPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUoc2ltdWxhdGlvbi5nZXRTaW11bGF0aW9uU3RhdGUoKS5lcXVhbHMoCisJCQkJU2ltdWxhdGlvblN0YXRlLlBBVVNFRCkpOworCX0gLy8gdGVzdEdldFNpbXVsYXRpb25TdGF0ZQorCisJLy8gVGhlc2UgYXJlIGNvbW1lbnRlZCBvdXQgYmVjYXVzZSBtb3JlIHdvcmsgbmVlZHMgdG8gYmUgZG9uZSB0byBlbmFibGUgdGhlCisJLy8gcnVubmluZyBvZiB0aGUgdGVzdHMgb3V0IHNpZGUgb2YgZWNsaXBzZS4KKworCS8vIC8qKgorCS8vICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb24jcnVuKCl9LgorCS8vICovCisJLy8gcHVibGljIHZvaWQgdGVzdFJ1blNpbXVsYXRpb24oKSB7CisJLy8gZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IGdldEZpeHR1cmUoKTsKKwkvLyBleHBlY3RlZFNpbXVsYXRpb25TdGF0ZSA9IFNpbXVsYXRpb25TdGF0ZS5SVU5OSU5HOworCS8vIHNpbXVsYXRpb24ucnVuKCk7CisJLy8gc2ltdWxhdGlvbi5zdG9wKCk7CisJLy8gfSAvLyB0ZXN0UnVuU2ltdWxhdGlvbgorCS8vCisJLy8gLyoqCisJLy8gKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbiNwYXVzZSgpfS4KKwkvLyAqLworCS8vIHB1YmxpYyB2b2lkIHRlc3RQYXVzZVNpbXVsYXRpb24oKSB7CisJLy8gZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IGdldEZpeHR1cmUoKTsKKwkvLyBleHBlY3RlZFNpbXVsYXRpb25TdGF0ZSA9IFNpbXVsYXRpb25TdGF0ZS5SVU5OSU5HOworCS8vIHNpbXVsYXRpb24ucnVuKCk7CisJLy8gZXhwZWN0ZWRTaW11bGF0aW9uU3RhdGUgPSBTaW11bGF0aW9uU3RhdGUuUEFVU0VEOworCS8vIHNpbXVsYXRpb24uc3RvcCgpOworCS8vIH0gLy8gdGVzdFBhdXNlU2ltdWxhdGlvbgorCS8vCisJLy8gLyoqCisJLy8gKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbiNyZXNldCgpfS4KKwkvLyAqLworCS8vIHB1YmxpYyB2b2lkIHRlc3RSZXNldFNpbXVsYXRpb24oKSB7CisJLy8gZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IGdldEZpeHR1cmUoKTsKKwkvLyBleHBlY3RlZFNpbXVsYXRpb25TdGF0ZSA9IFNpbXVsYXRpb25TdGF0ZS5SVU5OSU5HOworCS8vIHNpbXVsYXRpb24ucnVuKCk7CisJLy8gZXhwZWN0ZWRTaW11bGF0aW9uU3RhdGUgPSBTaW11bGF0aW9uU3RhdGUuUlVOTklORzsKKwkvLyBzaW11bGF0aW9uLnBhdXNlKCk7CisJLy8gZXhwZWN0ZWRTaW11bGF0aW9uU3RhdGUgPSBTaW11bGF0aW9uU3RhdGUuUkVTRVQ7CisJLy8gc2ltdWxhdGlvbi5yZXNldCgpOworCS8vIHNpbXVsYXRpb24uc3RvcCgpOworCS8vIH0gLy8gdGVzdFJlc2V0U2ltdWxhdGlvbgorCisvLwkvKioKKy8vCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uI3N0ZXAoKX0uCisvLwkgKi8KKy8vCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnF1YWxpZmllZC1maWVsZC1hY2Nlc3MiKQorLy8JcHVibGljIHZvaWQgdGVzdFN0ZXBTaW11bGF0aW9uKCkgeworLy8JCWZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb24gPSBnZXRGaXh0dXJlKCk7CisvLwkJZXhwZWN0ZWRTaW11bGF0aW9uU3RhdGUgPSBTaW11bGF0aW9uU3RhdGUuUlVOTklORzsKKy8vCQlzaW11bGF0aW9uLnBhdXNlKCk7CisvLwkJZXhwZWN0ZWRTaW11bGF0aW9uU3RhdGUgPSBTaW11bGF0aW9uU3RhdGUuUEFVU0VEOworLy8JCXNpbXVsYXRpb24ucGF1c2UoKTsKKy8vCQlleHBlY3RlZFNpbXVsYXRpb25TdGF0ZSA9IFNpbXVsYXRpb25TdGF0ZS5DT01QTEVURURfQ1lDTEU7CisvLwkJc2ltdWxhdGlvbi5zdGVwKCk7CisvLwkJZXhwZWN0ZWRTaW11bGF0aW9uU3RhdGUgPSBTaW11bGF0aW9uU3RhdGUuU1RPUFBFRDsKKy8vCQlzaW11bGF0aW9uLnN0b3AoKTsKKy8vCX0gLy8gdGVzdFN0ZXBTaW11bGF0aW9uCisKKy8vCS8qKgorLy8JICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb24jc3RvcCgpfS4KKy8vCSAqLworLy8JQFN1cHByZXNzV2FybmluZ3MoInVucXVhbGlmaWVkLWZpZWxkLWFjY2VzcyIpCisvLwlwdWJsaWMgdm9pZCB0ZXN0U3RvcFNpbXVsYXRpb24oKSB7CisvLwkJZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IGdldEZpeHR1cmUoKTsKKy8vCQlleHBlY3RlZFNpbXVsYXRpb25TdGF0ZSA9IFNpbXVsYXRpb25TdGF0ZS5SVU5OSU5HOworLy8JCXNpbXVsYXRpb24ucGF1c2UoKTsKKy8vCQlleHBlY3RlZFNpbXVsYXRpb25TdGF0ZSA9IFNpbXVsYXRpb25TdGF0ZS5TVE9QUEVEOworLy8JCXNpbXVsYXRpb24uc3RvcCgpOworLy8JfSAvLyB0ZXN0U3RvcFNpbXVsYXRpb24KKworCS8qKgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uI2dldFNjZW5hcmlvKCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2VuYXJpbygpIHsKKwkJZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0Tm90TnVsbChzaW11bGF0aW9uLmdldFNjZW5hcmlvKCkpOworCX0gLy8gdGVzdEdldFNjZW5hcmlvCisKKwkvKioKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbiNhZGRTaW11bGF0aW9uTGlzdGVuZXIob3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25MaXN0ZW5lcil9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RBZGRTaW11bGF0aW9uTGlzdGVuZXIoKSB7CisJCWZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb24gPSBnZXRGaXh0dXJlKCk7CisJCXNpbXVsYXRpb24uYWRkU2ltdWxhdGlvbkxpc3RlbmVyKHRoaXMpOworCX0gLy8gdGVzdEFkZFNpbXVsYXRpb25MaXN0ZW5lcgorCisJLyoqCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb24jcmVtb3ZlU2ltdWxhdGlvbkxpc3RlbmVyKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uTGlzdGVuZXIpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU2ltdWxhdGlvbkxpc3RlbmVyKCkgeworCQkvLyBOb3Qgc3VyZSB3aGF0IGVsc2UgdG8gZG8gaGVyZSwgb3RoZXIgdGhhbiB0byB2ZXJpZnkgdGhhdCB0aGVyZSBhcmVuJ3QKKwkJLy8gYW55IGV4Y2VwdGlvbnMKKwkJdGVzdEFkZFNpbXVsYXRpb25MaXN0ZW5lcigpOworCQlmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uID0gZ2V0Rml4dHVyZSgpOworCQlzaW11bGF0aW9uLnJlbW92ZVNpbXVsYXRpb25MaXN0ZW5lcih0aGlzKTsKKwl9IC8vIHRlc3RSZW1vdmVTaW11bGF0aW9uTGlzdGVuZXIKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25MaXN0ZW5lciNzaW11bGF0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uRXZlbnQpCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVucXVhbGlmaWVkLWZpZWxkLWFjY2VzcyIpCisJcHVibGljIHZvaWQgc2ltdWxhdGlvbkNoYW5nZWQoU2ltdWxhdGlvbkV2ZW50IGV2ZW50KSB7CisJCWFzc2VydFRydWUoIkV4cGVjdGVkIHN0YXRlIFwiIiArIGV2ZW50LmdldFNpbXVsYXRpb25TdGF0ZSgpCisJCQkJKyAiXCIgYnV0IHJlY2VpdmVkIFwiIiArIGV4cGVjdGVkU2ltdWxhdGlvblN0YXRlICsgIlwiIiwKKwkJZXhwZWN0ZWRTaW11bGF0aW9uU3RhdGUuZXF1YWxzKGV2ZW50LmdldFNpbXVsYXRpb25TdGF0ZSgpKSk7CisJfSAvLyBzaW11bGF0aW9uQ2hhbmdlZAorCit9IC8vIFNpbXVsYXRpb25UZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvam9icy9BY3RpdmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9icy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy9qb2JzL0FjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZjBjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmpvYnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvam9icy9BY3RpdmF0b3IuamF2YQpAQCAtMCwwICsxLDYzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuam9iczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworLyoqCisgKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKKyAqLworcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4geworCisJLyoqCisJICogVGhlIHBsdWctaW4gSUQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5qb2JzIjsgLy8kTk9OLU5MUy0xJAorCisJLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQorCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47CisJCisJLyoqCisJICogVGhlIGNvbnN0cnVjdG9yCisJICovCisJcHVibGljIEFjdGl2YXRvcigpIHsKKwkJcGx1Z2luID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXBsdWdpbiA9IG51bGw7CisJCXN1cGVyLnN0b3AoY29udGV4dCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCisJICoKKwkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5zZXF1ZW5jZXJzLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnNlcXVlbmNlcnMvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODM1MDY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5zZXF1ZW5jZXJzLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuc2VxdWVuY2Vycy8ucHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuc2VxdWVuY2Vycy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmRmZGExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5zZXF1ZW5jZXJzLy5wcm9qZWN0CkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuc2VxdWVuY2VyczwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnNlcXVlbmNlcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5zZXF1ZW5jZXJzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWU0OWZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5zZXF1ZW5jZXJzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDY5IEBACisjTW9uIEphbiAyMSAxMjo0ODozOCBFU1QgMjAwOAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5zZXF1ZW5jZXJzL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5zZXF1ZW5jZXJzL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZmQxNGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnNlcXVlbmNlcnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwxMCBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuc2VxdWVuY2VycztzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuY29yZQorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnNlcXVlbmNlcnMvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMuc2VxdWVuY2Vycy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMmQzOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnNlcXVlbmNlcnMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDExIEBACisjIDxjb3B5cmlnaHQ+CisjIDwvY29weXJpZ2h0PgorIworIyAkSWQkCisKK2Jpbi5pbmNsdWRlcyA9IC4sXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIG5vdGljZS5odG1sLFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbAoramFycy5jb21waWxlLm9yZGVyID0gLgorb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnNlcXVlbmNlcnMvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5zZXF1ZW5jZXJzL2VwbC12MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDRiMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5zZXF1ZW5jZXJzL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoreG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKK3htbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPGxpbmsgcmVsPUZpbGUtTGlzdAoraHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOkRvY3VtZW50UHJvcGVydGllcz4KKyAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KKyAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgorICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+CisgIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+CisgIDxvOlBhZ2VzPjQ8L286UGFnZXM+CisgIDxvOldvcmRzPjE2MjY8L286V29yZHM+CisgIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgorICAgPG86TGluZXM+Nzc8L286TGluZXM+CisgIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KKyAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+CisgIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+CisgPC9vOkRvY3VtZW50UHJvcGVydGllcz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OldvcmREb2N1bWVudD4KKyAgPHc6VHJhY2tSZXZpc2lvbnMvPgorIDwvdzpXb3JkRG9jdW1lbnQ+Cis8L3htbD48IVtlbmRpZl0tLT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlRhaG9tYTsKKwlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKKwltc28tZm9udC1jaGFyc2V0OjA7CisJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7CisJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7CisJbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KK3AuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bXNvLXN0eWxlLXBhcmVudDoiIjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwCisJe21hcmdpbi1yaWdodDowaW47CisJbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CisJbWFyZ2luLWxlZnQ6MGluOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKKwl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZTo4LjBwdDsKKwlmb250LWZhbWlseTpUYWhvbWE7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorQHBhZ2UgU2VjdGlvbjEKKwl7c2l6ZTo4LjVpbiAxMS4waW47CisJbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47CisJbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKKwltc28tZm9vdGVyLW1hcmdpbjouNWluOworCW1zby1wYXBlci1zb3VyY2U6MDt9CitkaXYuU2VjdGlvbjEKKwl7cGFnZTpTZWN0aW9uMTt9CistLT4KKzwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgorPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCitUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAorUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCitPRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCithZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKK3N1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKK2J5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgoraWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KK3N1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCit3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKK2VudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKK2NsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCitvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucworZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KK3JlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50CithIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KK3N0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5CitkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCitSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAorYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCitjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgorb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKK2J5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCit0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCithbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCitSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCitDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgordGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Citmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQordG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKK2lmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKK3RoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQorRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKK3JpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KK3RoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Cis8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK2l0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAorY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQorYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKK2FuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCitlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAoraW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAorYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCitzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0CitDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCitzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCitpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCitjb2RlIGZvcm06PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQorY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQorY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCitvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQorYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycworYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKK29mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAorbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCitDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKK2Nvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCit0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCitjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKK3RvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK3RvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCithbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQoraW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCit3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcworc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCitvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCitjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKK1dJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKK01FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQorUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcworQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKK2VxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgorVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgorVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKK29yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKK2Z1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgorYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAorb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCitzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCitwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQorY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKK3RoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKK0FncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCitzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAorZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCitTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCitBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKK0FncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKK2l0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5zZXF1ZW5jZXJzL25vdGljZS5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5zZXF1ZW5jZXJzL25vdGljZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YWY5NjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnNlcXVlbmNlcnMvbm90aWNlLmh0bWwKQEAgLTAsMCArMSw3OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5NYXJjaCAxNywgMjAwNTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisgICAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKKyAgIAorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCisgICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKyAgIAorPHVsPgorCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucworICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPiAgIAorIAorPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisJCQorPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisJPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQorCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisgICAKKzxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5zZXF1ZW5jZXJzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5zZXF1ZW5jZXJzL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYmJiNzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnNlcXVlbmNlcnMvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNiBAQAorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFRvIGNvZGUgZGV2ZWxvcGVyOgorIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQorIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCisjICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCisjICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3BsdWdpbk5hbWUgPSBTVEVNIFNlcXVlbmNlcnMgVGVzdCBTdWl0ZQorcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0Ly5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZTg2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0Ly5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0Ly5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU1MTM3MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0Ly5wcm9qZWN0CkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0PC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTY2OTVjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsNzMgQEAKKyNNb24gSmFuIDIxIDEyOjQ5OjE1IEVTVCAyMDA4CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnRyYW5zcG9ydC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0L01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNDQzNWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnRyYW5zcG9ydC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDE4IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQ7c2luZ2xldG9uOj10cnVlCitCdW5kbGUtVmVyc2lvbjogMS4wLjEucXVhbGlmaWVyCitCdW5kbGUtQ2xhc3NQYXRoOiAuCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC50ZXN0cworUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbCwKKyBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmRlZmluaXRpb25zLAorIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMuZGlzZWFzZW1vZGVscywKKyBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLmNvcmUsCisgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLAorIG9yZy5qdW5pdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydAorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0L2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlMTU1NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0L2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMSBAQAorCisjIDxjb3B5cmlnaHQ+CisjIDwvY29weXJpZ2h0PgorIworIyAkSWQkCisKK2Jpbi5pbmNsdWRlcyA9IC4sXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuCitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNGIxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnRyYW5zcG9ydC9lcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwzMjggQEAKKzxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKK3htbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCit4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Cis8bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Cis8bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxsaW5rIHJlbD1GaWxlLUxpc3QKK2hyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgorPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Cis8IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8bzpEb2N1bWVudFByb3BlcnRpZXM+CisgIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+CisgIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KKyAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgorICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgorICA8bzpQYWdlcz40PC9vOlBhZ2VzPgorICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgorICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KKyAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgorICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+CisgIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgorICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgorIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Cis8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8dzpXb3JkRG9jdW1lbnQ+CisgIDx3OlRyYWNrUmV2aXNpb25zLz4KKyA8L3c6V29yZERvY3VtZW50PgorPC94bWw+PCFbZW5kaWZdLS0+Cis8c3R5bGU+Cis8IS0tCisgLyogRm9udCBEZWZpbml0aW9ucyAqLworQGZvbnQtZmFjZQorCXtmb250LWZhbWlseTpUYWhvbWE7CisJcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7CisJbXNvLWZvbnQtY2hhcnNldDowOworCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOworCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOworCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQorIC8qIFN0eWxlIERlZmluaXRpb25zICovCitwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCisJe21zby1zdHlsZS1wYXJlbnQ6IiI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorcAorCXttYXJnaW4tcmlnaHQ6MGluOworCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOworCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOworCW1hcmdpbi1sZWZ0OjBpbjsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0CisJe21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOworCW1hcmdpbjowaW47CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6OC4wcHQ7CisJZm9udC1mYW1pbHk6VGFob21hOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK0BwYWdlIFNlY3Rpb24xCisJe3NpemU6OC41aW4gMTEuMGluOworCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOworCW1zby1oZWFkZXItbWFyZ2luOi41aW47CisJbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKKwltc28tcGFwZXItc291cmNlOjA7fQorZGl2LlNlY3Rpb24xCisJe3BhZ2U6U2VjdGlvbjE7fQorLS0+Cis8L3N0eWxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+CisKKzxkaXYgY2xhc3M9U2VjdGlvbjE+CisKKzxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KKzwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgorVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKK1JFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQorT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2luIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCitkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+CitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2NoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCitzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCitieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKK2lmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCitzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKK1Byb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgord2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQord29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCitlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50CitjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQorb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKK2Rpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCityZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAorYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCitzdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQorZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQorU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cworUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKK3BhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKK2FuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQorY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KK29mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCitieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgordG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bworYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQorUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cworQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKK3RoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAorZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAorbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKK3RvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCitpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCit0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCitkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKK0VhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0CityaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCit0aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgorPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2VmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKK2NvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKK2FuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5CithbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKK2luY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKK2FzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQorc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAorQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQorc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAoraW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQorY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKK2NvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKK2NvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQorb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKK3N1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKK2FjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKK2FuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCitvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKK2xpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCitDb250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgorQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCitjb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCitsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwordGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgorY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKK29mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcworcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCit0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCit0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAorYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKK2luIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAord2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKK3NlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQorb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQorY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKK0FHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCitXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCitNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQorcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKK1Byb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKK0FncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKK2NvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCitlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCitPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKK1RIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKK1RIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCitvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0CitmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQorbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KK2FnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKK290aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQorc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAorc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQorcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKK3JpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKK2NvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50CitTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKK3RoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCit0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCitBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bworc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KKyhpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKK2V4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKK2V4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQorU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgorQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCitBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCitpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KKworPC9kaXY+CisKKzwvYm9keT4KKworPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0L25vdGljZS5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQvbm90aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhZjk2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0L25vdGljZS5odG1sCkBAIC0wLDAgKzEsNzkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+TWFyY2ggMTcsIDIwMDU8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorICAgCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCisgICAKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUworICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisgICAKKzx1bD4KKwk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4gICAKKyAKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKwk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCQkKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKwk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKKwk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorICAgCis8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5ODQ4OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0L3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjUgQEAKKyMvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqCisjICogQ29udHJpYnV0b3JzOgorIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBUbyBjb2RlIGRldmVsb3BlcjoKKyMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKKyMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgorIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQorIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitwbHVnaW5OYW1lID0gU1RFTSBUcmFuc3BvcnQgVGVzdHMKK3Byb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvdGVzdHMvTG9hZFVubG9hZEVkZ2VMYWJlbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC90ZXN0cy9Mb2FkVW5sb2FkRWRnZUxhYmVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkODI0MTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvdGVzdHMvTG9hZFVubG9hZEVkZ2VMYWJlbFRlc3QuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnRlc3RzLk1pZ3JhdGlvbkVkZ2VMYWJlbFRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuTG9hZFVubG9hZEVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5UcmFuc3BvcnRGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxvYWQgVW5sb2FkIEVkZ2UgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBhcmUgdGVzdGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWwjcmVzZXQoKSA8ZW0+UmVzZXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWwjc3dpdGNoVG9OZXh0VmFsdWUoKSA8ZW0+U3dpdGNoIFRvIE5leHQgVmFsdWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIEBnZW5lcmF0ZWQgTk9UCisgKi8KK3B1YmxpYyBjbGFzcyBMb2FkVW5sb2FkRWRnZUxhYmVsVGVzdCBleHRlbmRzIE1pZ3JhdGlvbkVkZ2VMYWJlbFRlc3QgeworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFRFU1RfUkFURSA9IDEuMDsKKwkKKwkvKioKKwkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBMb2FkIFVubG9hZCBFZGdlIExhYmVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTG9hZFVubG9hZEVkZ2VMYWJlbCBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oTG9hZFVubG9hZEVkZ2VMYWJlbFRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgTG9hZCBVbmxvYWQgRWRnZSBMYWJlbCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTG9hZFVubG9hZEVkZ2VMYWJlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBMb2FkIFVubG9hZCBFZGdlIExhYmVsIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKExvYWRVbmxvYWRFZGdlTGFiZWwgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTG9hZCBVbmxvYWQgRWRnZSBMYWJlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIExvYWRVbmxvYWRFZGdlTGFiZWwgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZSBhIExvYWRVbmxvYWRFZGdlTGFiZWwgZm9yIHVzZSBpbiB0aGVzZSB0ZXN0IGNhc2UuCisJICogKi8KKwlwdWJsaWMgTG9hZFVubG9hZEVkZ2VMYWJlbCBjcmVhdGVGaXh0dXJlKCkgeworCQlMb2FkVW5sb2FkRWRnZUxhYmVsIGx1ZUxibCA9IFRyYW5zcG9ydEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxvYWRVbmxvYWRFZGdlTGFiZWwoKTsKKwkJCisJCVNURU1UaW1lIHN0YXJ0VGltZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU1RFTVRpbWUoKTsKKwkJU1RFTVRpbWUgZW5kVGltZSA9IHN0YXJ0VGltZS5hZGRJbmNyZW1lbnQoMTAwMCk7CisJCWx1ZUxibC5zZXRBY3RpdmF0aW9uVGltZShzdGFydFRpbWUpOworCQlsdWVMYmwuc2V0RGVhY3RpdmF0aW9uVGltZShlbmRUaW1lKTsKKwkJCQkKKwkJCisJCXJldHVybiBsdWVMYmw7CisJfQorCQorCS8qKgorCSAqIFRlc3QgdGhlIHNldHRpbmcgb2YgdGhlIGxhYmVsCisJICoqLworCXB1YmxpYyB2b2lkIHRlc3RBY3RpdmF0ZWRSYXRlICgpIHsKKwkJTG9hZFVubG9hZEVkZ2VMYWJlbCBsdWVMYWJlbCA9IGdldEZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShsdWVMYWJlbC5nZXRBY3RpdmF0ZWRSYXRlKCk9PTApOworCQkKKwkJbHVlTGFiZWwuc2V0QWN0aXZhdGVkUmF0ZShURVNUX1JBVEUpOworCQlhc3NlcnRUcnVlKGx1ZUxhYmVsLmdldEFjdGl2YXRlZFJhdGUoKT09VEVTVF9SQVRFKTsKKwkJCisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKGNyZWF0ZUZpeHR1cmUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCQorCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWwjcmVzZXQoKSA8ZW0+UmVzZXQ8L2VtPn0nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbCNyZXNldCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0UmVzZXQoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG9wZXJhdGlvbiB0ZXN0IG1ldGhvZAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQlhc3NlcnRUcnVlKHRydWUpOworCX0KKworCS8qKgorCSAqIFRlc3RzIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWwjc3dpdGNoVG9OZXh0VmFsdWUoKSA8ZW0+U3dpdGNoIFRvIE5leHQgVmFsdWU8L2VtPn0nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbCNzd2l0Y2hUb05leHRWYWx1ZSgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoVG9OZXh0VmFsdWUoKSB7CisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG9wZXJhdGlvbiB0ZXN0IG1ldGhvZAorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQlhc3NlcnRUcnVlKHRydWUpOworCX0KKworCS8qKgorCSAqIFRlc3QgdGhlIExhYmVsIGhhcyB0aGUgcmlnaHQgdHlwZSBVUkkuCisJICogT3ZlcnJpZGUgdGVzdCBvZiBnZXRUeXBlVVJJCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZVVSSSgpIHsKKwkJZmluYWwgTGFiZWwgbGFiZWwgPSBnZXRGaXh0dXJlKCk7CisJCWFzc2VydFRydWUobGFiZWwuZ2V0VHlwZVVSSSgpLmVxdWFscyhMb2FkVW5sb2FkRWRnZUxhYmVsLlVSSV9UWVBFX0xPQURfVU5MT0FEX0VER0VfTEFCRUwpKTsKKwl9IC8vIHRlc3RHZXRUeXBlVVJJCisKKwkKKworfSAvL0xvYWRVbmxvYWRFZGdlTGFiZWxUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvdGVzdHMvTG9hZFVubG9hZEVkZ2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvdGVzdHMvTG9hZFVubG9hZEVkZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4NjgxMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC90ZXN0cy9Mb2FkVW5sb2FkRWRnZVRlc3QuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy50ZXN0cy5NaWdyYXRpb25FZGdlVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5Mb2FkVW5sb2FkRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5Mb2FkVW5sb2FkRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlRyYW5zcG9ydEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLlRlc3RVdGlsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxvYWQgVW5sb2FkIEVkZ2U8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkIE5PVAorICovCitwdWJsaWMgY2xhc3MgTG9hZFVubG9hZEVkZ2VUZXN0IGV4dGVuZHMgTWlncmF0aW9uRWRnZVRlc3QgeworCQorCS8qKkxhYmVsIHRvIGhlbHAgd2l0aCBzb21lIHRlc3QgY2FzZXMqLworCUxvYWRVbmxvYWRFZGdlTGFiZWwgVEVTVF9MQUJFTCA9IFRyYW5zcG9ydEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxvYWRVbmxvYWRFZGdlTGFiZWwoKTsKKworCVVSSSBOT0RFX0FfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoIm5vZGVzL25vZGVBIik7CisJCisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgTG9hZCBVbmxvYWQgRWRnZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIExvYWRVbmxvYWRFZGdlIGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihMb2FkVW5sb2FkRWRnZVRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgTG9hZCBVbmxvYWQgRWRnZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTG9hZFVubG9hZEVkZ2VUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTG9hZCBVbmxvYWQgRWRnZSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShMb2FkVW5sb2FkRWRnZSBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBMb2FkIFVubG9hZCBFZGdlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTG9hZFVubG9hZEVkZ2UgZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgdGhlIGZpeHR1cmUuIFdlIG5lZWQgdG8gaGF2ZSBub2RlcyBvbiBib3RoIHNpZGVzIGluIG9yZGVyIHRvIGJlIHNhbmUoKS4KKwkgKiAKKwkgKiAqLworCXB1YmxpYyBMb2FkVW5sb2FkRWRnZSBjcmVhdGVGaXh0dXJlKCkgeworCQkKKwkJLy9UaGlzIHdpbGwgYmUgYSB1bmxvYWQgZWRnZQorCQlmaW5hbCBOb2RlIG5vZGVBID0gVHJhbnNwb3J0RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0oKTsKKwkJbm9kZUEuc2V0VVJJKE5PREVfQV9VUkkpOworCQlmaW5hbCBOb2RlIG5vZGVCID0gVGVzdFV0aWwuY3JlYXRlU3RhdGljYWxseUxhYmVsZWROb2RlKCk7CisJCUxvYWRVbmxvYWRFZGdlIGx1RWRnZSA9IFRyYW5zcG9ydEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxvYWRVbmxvYWRFZGdlKCk7CisJCWx1RWRnZS5zZXRMYWJlbChUcmFuc3BvcnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMb2FkVW5sb2FkRWRnZUxhYmVsKCkpOworCQlsdUVkZ2Uuc2V0TG9hZGluZ0VkZ2UoZmFsc2UpOworCQlsdUVkZ2Uuc2V0Tm9kZUFVUkkobm9kZUEuZ2V0VVJJKCkpOworCQlsdUVkZ2Uuc2V0Tm9kZUJVUkkobm9kZUIuZ2V0VVJJKCkpOwkKKwkJCisJCQorCQkvL1dlIG5lZWQgdG8gc2V0IHVwIHN0YXJ0IGFuZCBlbmQgdGltZXMgZm9yIGxvYWRpbmcKKwkJU1RFTVRpbWUgc3RhcnRUaW1lID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTVEVNVGltZSgpOworCQlTVEVNVGltZSBlbmRUaW1lID0gc3RhcnRUaW1lLmFkZEluY3JlbWVudCgxMDAwKTsKKwkJCisJCWx1RWRnZS5nZXRMYWJlbCgpLnNldEFjdGl2YXRpb25UaW1lKHN0YXJ0VGltZSk7CisJCWx1RWRnZS5nZXRMYWJlbCgpLnNldERlYWN0aXZhdGlvblRpbWUoZW5kVGltZSk7CisJCQorCQkvL01ha2Ugc3VyZSB0aGUgbm9kZSByZWxhdGlvbnMgYXJlIGNvb2wKKwkJbHVFZGdlLnNldEEobm9kZUEpOworCQlsdUVkZ2Uuc2V0Qihub2RlQik7CisJCW5vZGVBLmdldEVkZ2VzKCkuYWRkKGx1RWRnZSk7CisJCW5vZGVCLmdldEVkZ2VzKCkuYWRkKGx1RWRnZSk7CisJCQorCQkKKwkJcmV0dXJuIGx1RWRnZTsKKwl9CisKKworCS8qKlRlc3Qgc2V0dGluZyB0aGUgZm9yIHRoZSBMb2FkVW5sb2FkRWRnZSovCisJcHVibGljIHZvaWQgdGVzdFNldExhYmVsKCkgeworCQlMb2FkVW5sb2FkRWRnZSBsdUVkZ2UgPSBnZXRGaXh0dXJlKCk7CisJCisJCS8vV2UgbmVlZCB0byBzZXQgdXAgc3RhcnQgYW5kIGVuZCB0aW1lcyBmb3IgbG9hZGluZworCQlTVEVNVGltZSBzdGFydFRpbWUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNURU1UaW1lKCk7CisJCVNURU1UaW1lIGVuZFRpbWUgPSBzdGFydFRpbWUuYWRkSW5jcmVtZW50KDIwMDApOworCQkKKwkJVEVTVF9MQUJFTC5zZXRBY3RpdmF0aW9uVGltZShzdGFydFRpbWUpOworCQlURVNUX0xBQkVMLnNldERlYWN0aXZhdGlvblRpbWUoZW5kVGltZSk7CisJCQorCQlhc3NlcnRGYWxzZShsdUVkZ2UuZ2V0TGFiZWwoKSA9PSBURVNUX0xBQkVMKTsKKwkJbHVFZGdlLnNldExhYmVsKFRFU1RfTEFCRUwpOworCQlhc3NlcnRUcnVlKGx1RWRnZS5nZXRMYWJlbCgpPT1URVNUX0xBQkVMKTsKKwkJYXNzZXJ0VHJ1ZShsdUVkZ2Uuc2FuZSgpKTsKKwl9CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKGNyZWF0ZUZpeHR1cmUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCit9IC8vTG9hZFVubG9hZEVkZ2VUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvdGVzdHMvUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3JUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvdGVzdHMvUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhZmZkZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC90ZXN0cy9QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDM0MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnRlc3RzLkVkZ2VEZWNvcmF0b3JUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW9GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbnRpYWxTZXF1ZW5jZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5SZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuTG9hZFVubG9hZEVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuTG9hZFVubG9hZEVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRUcmFuc3BvcnRMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5UcmFuc3BvcnRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC50ZXN0cy5EaXNlYXNlTW9kZWxUZXN0VXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuRmRGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhY2tldCBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtIERlY29yYXRvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQgTk9UCisgKi8KK3B1YmxpYyBjbGFzcyBQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvclRlc3QgZXh0ZW5kcyBFZGdlRGVjb3JhdG9yVGVzdCB7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBVUkkgRklYVFVSRV9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSSgiZGVjb3JhdG9ycy90cmFuc3BvcnREZWNvcmF0b3JUZXN0Iik7CisJCisJCisJLypDb25zdGFudHMgZm9yIHVzZSBpbiB0aGUgdGVzdHMqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIFRSQU5TUE9SVF9DQVBBQ0lUWSA9IDEwMC4wOworCXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIExPQURfVU5MT0FEX1JBVEUgID0gMC41OworCXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIFBPUlRfUE9QVUxBVElPTiA9IDEwMDAwMC4wOworCQorCS8qVGltZSBTdHVmZiovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0RBWSA9IDIwOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkRfREFZID0gMjk7CQorCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTUJFUl9PRl9EQVlTID0gIEVORF9EQVkgLSBTVEFSVF9EQVkgKyAxOworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJVkFUSU9OX0RBWSA9IDI1OworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUFDVElWQVRJT05fREFZID0gMjc7CisJCisJLy8gVGhlIGZpeHR1cmUgc2VxdWVuY2VyIHNlcXVlbmNlcyB0aHJvdWdoIDEwIGRheXMKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNURU1UaW1lIFNUQVJUX1RJTUUgPSBjcmVhdGVTVEVNVGltZSgyMDA2LAorCQkJQ2FsZW5kYXIuTk9WRU1CRVIsIFNUQVJUX0RBWSk7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNURU1UaW1lIEVORF9USU1FID0gIGNyZWF0ZVNURU1UaW1lKDIwMDYsCisJCQlDYWxlbmRhci5OT1ZFTUJFUiwgRU5EX0RBWSk7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVElNRV9JTkNSRU1FTlQgPSBTVEVNVGltZS5Vbml0cy5EQVkuZ2V0TWlsbGlzZWNvbmRzKCkvNDsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNURU1UaW1lIEFDVElWQVRJT05fVElNRSA9IAljcmVhdGVTVEVNVGltZSgyMDA2LAorCQkJQ2FsZW5kYXIuTk9WRU1CRVIsIEFDVElWQVRJT05fREFZKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNURU1UaW1lIERFQUNUSVZBVElPTl9USU1FID0gY3JlYXRlU1RFTVRpbWUoMjAwNiwKKwkJCUNhbGVuZGFyLk5PVkVNQkVSLCBERUFDVElWQVRJT05fREFZKTsJCisJCisJLyoqCisJICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgUGFja2V0IFN0eWxlIFRyYW5zcG9ydCBTeXN0ZW0gRGVjb3JhdG9yIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3IgZml4dHVyZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9yVGVzdC5jbGFzcyk7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgdGhlIHVuZGVybHlpbmcgbW9kZWwgd2l0aCBhIGRlY29yYXRvciBhbmQgbG9hZC91bmxvYWQgZWRnZXMgCisJICogCisJICogQHBhcmFtIGxvYWRpbmcgc2hvdWxkIHdlIHNldCB1cCB0aGUgbW9kZWwgZm9yIGEgbG9hZGluZyBlZGdlIG9yIGZvciBhbiB1bmxvYWRpbmcgZWRnZS4KKwkgKi8KKwlwdWJsaWMgU2NlbmFyaW8gY3JlYXRlRGVjb3JhdG9yU2NlbmFyaW8gIChib29sZWFuIGxvYWRpbmcpIHsKKwkJLy9UaGUgc2NlbmFyaW8gdG8gcmV0dXJuCisJCVNjZW5hcmlvIHJldFZhbHVlID0gU2NlbmFyaW9GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTY2VuYXJpbygpOworCQlEdWJsaW5Db3JlIGRjID0gcmV0VmFsdWUuZ2V0RHVibGluQ29yZSgpOworCQlkYy5wb3B1bGF0ZSgpOworCQlkYy5zZXRUaXRsZSgiTG9hZFVubG9hZFNjZW5hcmlvIik7CisJCQorCQkvL1dlIG5lZWQgdG8gbWFrZSBhIG1vZGVsIGZvciB0aGUgc2NlbmFyaW8uCisJCU1vZGVsIHNjbk1vZGVsID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNb2RlbCgpOworCQlkYyA9IHNjbk1vZGVsLmdldER1YmxpbkNvcmUoKTsKKwkJZGMucG9wdWxhdGUoKTsKKwkJZGMuc2V0VGl0bGUoIkxvYWRVbmxvYWRNb2RlIik7CisJCQorCQkKKwkJLy9XZSBuZWVkIHRvIG1ha2UgYSBncmFwaCBmb3IgdGhlIG1vZGVsLgorCQlHcmFwaCBtZGxHcmFwaCA9IEdyYXBoRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGgoKTsKKwkJZGMgPSBtZGxHcmFwaC5nZXREdWJsaW5Db3JlKCk7CisJCWRjLnBvcHVsYXRlKCk7CisJCWRjLnNldFRpdGxlKCJMb2FkVW5sb2FkR3JhcGgiKTsKKwkJCisJCS8vUHV0IGluIGEgcGFja2V0IHN0eWxlIHRyYW5zcG9ydCBzeXN0ZW0gYW5kIGEgcmFuZG9tIG5vZGUgdG8gCisJCS8vdW5sb2FkIHRvLgorCQkKKwkJLy9DcmVhdGUgdGhlIFBTVHJhbnNwb3J0U3lzdGVtIG5vZGUKKwkJUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0gdHJhbnNwb3J0ID0gVHJhbnNwb3J0RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0oKTsJCisJCVBhY2tldFRyYW5zcG9ydExhYmVsIHB0TGFiZWwgPSBUcmFuc3BvcnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYWNrZXRUcmFuc3BvcnRMYWJlbCgpOworCQl0cmFuc3BvcnQuc2V0UGFja2V0VHJhbnNwb3J0TGFiZWwocHRMYWJlbCk7CisJCXRyYW5zcG9ydC5nZXRQYWNrZXRUcmFuc3BvcnRMYWJlbCgpLmdldEN1cnJlbnRWYWx1ZSgpLnNldENhcGFjaXR5KFRSQU5TUE9SVF9DQVBBQ0lUWSk7CisJCQorCQlQb3B1bGF0aW9uTGFiZWwgcG9wTGFiZWwgPSBMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3B1bGF0aW9uTGFiZWwoKTsKKwkJcG9wTGFiZWwuZ2V0Q3VycmVudFBvcHVsYXRpb25WYWx1ZSgpLnNldENvdW50KFRSQU5TUE9SVF9DQVBBQ0lUWSk7CisJCXRyYW5zcG9ydC5nZXRMYWJlbHMoKS5hZGQocG9wTGFiZWwpOworCQkKKwkJbWRsR3JhcGguZ2V0Tm9kZUxhYmVscygpLnB1dChwdExhYmVsLmdldFVSSSgpLHB0TGFiZWwpOworCQltZGxHcmFwaC5nZXROb2RlTGFiZWxzKCkucHV0KHBvcExhYmVsLmdldFVSSSgpLCBwb3BMYWJlbCk7CisJCQorCQkvL0NyZWF0ZSB0aGUgc291cmNlL2Rlc3RpbmF0aW9uIG5vZGUuCisJCVJlZ2lvbiByZWdpb24gPSBEaXNlYXNlTW9kZWxUZXN0VXRpbC5jcmVhdGVQb3B1bGF0aW9uUmVnaW9uTm9kZSgKKwkJCQlEaXNlYXNlTW9kZWxUZXN0VXRpbC5URVNUX1BPUFVMQVRJT05fSURFTlRJRklFUiwKKwkJCQlQT1JUX1BPUFVMQVRJT04sIERpc2Vhc2VNb2RlbFRlc3RVdGlsLlRFU1RfQVJFQSk7CisJCQorCQkKKworCQkvL0NyZWF0ZSB0aGUgTG9hZFVubG9hZCBlZGdlIGJldHdlZW4gdGhlc2UgYW5kIHNldCB1cCB0aGUgCisJCS8vYXBwcm9wcmlhdGUgcGFyYW1ldGVycworCQlMb2FkVW5sb2FkRWRnZSBsdUVkZ2UgPSBUcmFuc3BvcnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMb2FkVW5sb2FkRWRnZSgpOworCQlMb2FkVW5sb2FkRWRnZUxhYmVsIGx1ZUxhYmVsID1UcmFuc3BvcnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMb2FkVW5sb2FkRWRnZUxhYmVsKCk7CisJCWx1RWRnZS5zZXRMYWJlbChsdWVMYWJlbCk7CisJCWx1ZUxhYmVsLnNldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQobHVFZGdlLmdldFVSSSgpKTsKKwkJCisJCWlmIChsb2FkaW5nKSB7CisJCQlsdUVkZ2Uuc2V0TG9hZGluZ0VkZ2UodHJ1ZSk7CisJCQlsdUVkZ2Uuc2V0Tm9kZUFVUkkocmVnaW9uLmdldFVSSSgpKTsKKwkJCWx1RWRnZS5zZXROb2RlQlVSSSh0cmFuc3BvcnQuZ2V0VVJJKCkpOworCQkJbHVFZGdlLnNldEEocmVnaW9uKTsKKwkJCWx1RWRnZS5zZXRCKHRyYW5zcG9ydCk7CQorCQkJCisJCX0gZWxzZSB7CisJCQlsdUVkZ2Uuc2V0TG9hZGluZ0VkZ2UoZmFsc2UpOworCQkJbHVFZGdlLnNldE5vZGVCVVJJKHJlZ2lvbi5nZXRVUkkoKSk7CisJCQlsdUVkZ2Uuc2V0Tm9kZUFVUkkodHJhbnNwb3J0LmdldFVSSSgpKTsKKwkJCWx1RWRnZS5zZXRCKHJlZ2lvbik7CisJCQlsdUVkZ2Uuc2V0QSh0cmFuc3BvcnQpOwkKKwkJCQorCQl9CisJCQorCQlyZWdpb24uZ2V0RWRnZXMoKS5hZGQobHVFZGdlKTsKKwkJdHJhbnNwb3J0LmdldEVkZ2VzKCkuYWRkKGx1RWRnZSk7CisJCQorCQlsdUVkZ2UuZ2V0TGFiZWwoKS5zZXRBY3RpdmF0ZWRSYXRlKExPQURfVU5MT0FEX1JBVEUpOworCQlsdUVkZ2UuZ2V0TGFiZWwoKS5zZXRBY3RpdmF0aW9uVGltZShBQ1RJVkFUSU9OX1RJTUUpOworCQlsdUVkZ2UuZ2V0TGFiZWwoKS5zZXREZWFjdGl2YXRpb25UaW1lKERFQUNUSVZBVElPTl9USU1FKTsKKwkJCisJCS8vYWRkIHRoZSBub2RlcyBhbmQgdGhlIGVkZ2VzIHRvIHRoZSBncmFwaAorCQltZGxHcmFwaC5wdXRFZGdlKGx1RWRnZSk7CisJCW1kbEdyYXBoLmdldER5bmFtaWNMYWJlbHMoKS5hZGQobHVFZGdlLmdldExhYmVsKCkpOworCQltZGxHcmFwaC5wdXROb2RlKHJlZ2lvbik7CisJCW1kbEdyYXBoLnB1dE5vZGUodHJhbnNwb3J0KTsKKwkJCisJCS8vYWRkIHRoZSBncmFwaCB0byB0aGUgbWRsLgorCQlzY25Nb2RlbC5nZXRHcmFwaHMoKS5hZGQobWRsR3JhcGgpOworCQkKKwkJLy9hZGQgdGhlIG1kbCB0byB0aGUgc2NlbmFyaW8gYW5kIGdpdmUgaXQgYSBzZXF1ZW5jZXIKKwkJcmV0VmFsdWUuc2V0TW9kZWwoc2NuTW9kZWwpOworCQkKKwkJU2VxdWVudGlhbFNlcXVlbmNlciBzZXF1ZW5jZXIgPSBTZXF1ZW5jZXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXF1ZW50aWFsU2VxdWVuY2VyKCk7CisJCXNlcXVlbmNlci5zZXRTdGFydFRpbWUoKFNURU1UaW1lKUVjb3JlVXRpbC5jb3B5KFNUQVJUX1RJTUUpKTsKKwkJc2VxdWVuY2VyLnNldEN1cnJlbnRUaW1lKChTVEVNVGltZSlFY29yZVV0aWwuY29weShTVEFSVF9USU1FKSk7CisJCXNlcXVlbmNlci5zZXRFbmRUaW1lKChTVEVNVGltZSlFY29yZVV0aWwuY29weShFTkRfVElNRSkpOworCQlzZXF1ZW5jZXIuc2V0VGltZUluY3JlbWVudChUSU1FX0lOQ1JFTUVOVCk7CisJCXJldFZhbHVlLnNldFNlcXVlbmNlcihzZXF1ZW5jZXIpOworCQkKKwkJLy9jcmVhdGUgdGhlIGRlY29yYXRvciBhbmQgYWRkIGl0IHRvIHRoZSBzY2VuYXJpbworCQlQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvciBkZWNvcmF0b3IgPSB0aGlzLmdldEZpeHR1cmUoKTsKKwkJcmV0VmFsdWUuZ2V0U2NlbmFyaW9EZWNvcmF0b3JzKCkuYWRkKGRlY29yYXRvcik7CisJCQorCQlTb2x2ZXIgc29sdmVyID0gRmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaW5pdGVEaWZmZXJlbmNlKCk7CisJCXNvbHZlci5zZXREZWNvcmF0b3JzKHJldFZhbHVlLmdldFNjZW5hcmlvRGVjb3JhdG9ycygpKTsKKwkJcmV0VmFsdWUuc2V0U29sdmVyKHNvbHZlcik7CisJCQorCQkKKwkJLy9tYWtlIHN1cmUgZXZlcnl0aGluZyB3ZSBhcmUgcmV0dXJuaW5nIGlzIHNhbmUKKwkJYXNzZXJ0IGx1RWRnZS5zYW5lKCk7CisJCWFzc2VydCByZWdpb24uc2FuZSgpOworCQlhc3NlcnQgdHJhbnNwb3J0LnNhbmUoKTsKKwkJYXNzZXJ0IG1kbEdyYXBoLnNhbmUoKTsKKwkJYXNzZXJ0IHNjbk1vZGVsLnNhbmUoKTsKKwkJYXNzZXJ0IHJldFZhbHVlLnNhbmUoKTsKKwkJCisJCQorCQkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0KKwkKKwkvKipUZXN0IHRoZSBkZWNvcmF0b3IgZm9yIHVubG9hZGluZyovCisJcHVibGljIHZvaWQgdGVzdFVubG9hZCAoKSB7CisJCVNjZW5hcmlvIHNjbiA9IGNyZWF0ZURlY29yYXRvclNjZW5hcmlvKGZhbHNlKTsKKwkJCQkJCQorCQlzY24uaW5pdGlhbGl6ZSgpOworCQkvL3Njbi5nZXRDYW5vbmljYWxHcmFwaCgpCisJCUxvYWRVbmxvYWRFZGdlIGx1RWRnZSA9IChMb2FkVW5sb2FkRWRnZSlzY24uZ2V0Q2Fub25pY2FsR3JhcGgoKS5nZXRFZGdlcygpLnZhbHVlcygpLnRvQXJyYXkoKVswXTsJCisJCWFzc2VydFRydWUobHVFZGdlLmdldExhYmVsKCkuZ2V0Q3VycmVudFZhbHVlKCkuZ2V0TWlncmF0aW9uUmF0ZSgpPT0wKTsKKwkJCisJCXdoaWxlIChzY24uc3RlcCgpKSB7CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic3RlcDoiK3Njbi5nZXRTZXF1ZW5jZXIoKS5nZXRDdXJyZW50VGltZSgpKTsKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjdXJyOiIrbHVFZGdlLmdldExhYmVsKCkuZ2V0Q3VycmVudFZhbHVlKCkuZ2V0TWlncmF0aW9uUmF0ZSgpKTsKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJuZXh0OiIrKChNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSlsdUVkZ2UuZ2V0TGFiZWwoKS5nZXROZXh0VmFsdWUoKSkuZ2V0TWlncmF0aW9uUmF0ZSgpKTsKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjaGVja2luZzoiK2x1RWRnZS5nZXRMYWJlbCgpLmhhc2hDb2RlKCkpOwkJCQorCQkJCisJCQlpZiAoc2NuLmdldFNlcXVlbmNlcigpLmdldEN1cnJlbnRUaW1lKCkuZ2V0VGltZSgpLmFmdGVyKEFDVElWQVRJT05fVElNRS5nZXRUaW1lKCkpICYmCisJCQkJCXNjbi5nZXRTZXF1ZW5jZXIoKS5nZXRDdXJyZW50VGltZSgpLmdldFRpbWUoKS5iZWZvcmUoREVBQ1RJVkFUSU9OX1RJTUUuZ2V0VGltZSgpKSkgeworCQkJCWFzc2VydFRydWUobHVFZGdlLmdldExhYmVsKCkuZ2V0Q3VycmVudFZhbHVlKCkuZ2V0TWlncmF0aW9uUmF0ZSgpPT1MT0FEX1VOTE9BRF9SQVRFKTsKKwkJCX0gZWxzZSB7CisJCQkJYXNzZXJ0VHJ1ZShsdUVkZ2UuZ2V0TGFiZWwoKS5nZXRDdXJyZW50VmFsdWUoKS5nZXRNaWdyYXRpb25SYXRlKCk9PTApOwkKKwkJCX0KKwkJfQorCQkKKwkKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdExvYWQoKSB7CisJCVNjZW5hcmlvIHNjbiA9IGNyZWF0ZURlY29yYXRvclNjZW5hcmlvKHRydWUpOworCQkKKwkJc2NuLmluaXRpYWxpemUoKTsKKwkJLy9zY24uZ2V0Q2Fub25pY2FsR3JhcGgoKQorCQlMb2FkVW5sb2FkRWRnZSBsdUVkZ2UgPSAoTG9hZFVubG9hZEVkZ2Upc2NuLmdldENhbm9uaWNhbEdyYXBoKCkuZ2V0RWRnZXMoKS52YWx1ZXMoKS50b0FycmF5KClbMF07CQorCQlhc3NlcnRUcnVlKGx1RWRnZS5nZXRMYWJlbCgpLmdldEN1cnJlbnRWYWx1ZSgpLmdldE1pZ3JhdGlvblJhdGUoKT09MCk7CisJCQorCQl3aGlsZSAoc2NuLnN0ZXAoKSkgeworCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInN0ZXA6IitzY24uZ2V0U2VxdWVuY2VyKCkuZ2V0Q3VycmVudFRpbWUoKSk7CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiY3VycjoiK2x1RWRnZS5nZXRMYWJlbCgpLmdldEN1cnJlbnRWYWx1ZSgpLmdldE1pZ3JhdGlvblJhdGUoKSk7CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibmV4dDoiKygoTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUpbHVFZGdlLmdldExhYmVsKCkuZ2V0TmV4dFZhbHVlKCkpLmdldE1pZ3JhdGlvblJhdGUoKSk7CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiY2hlY2tpbmc6IitsdUVkZ2UuZ2V0TGFiZWwoKS5oYXNoQ29kZSgpICsidmEuIik7CQkJCisJCQkKKwkJCWlmIChzY24uZ2V0U2VxdWVuY2VyKCkuZ2V0Q3VycmVudFRpbWUoKS5nZXRUaW1lKCkuYWZ0ZXIoQUNUSVZBVElPTl9USU1FLmdldFRpbWUoKSkgJiYKKwkJCQkJc2NuLmdldFNlcXVlbmNlcigpLmdldEN1cnJlbnRUaW1lKCkuZ2V0VGltZSgpLmJlZm9yZShERUFDVElWQVRJT05fVElNRS5nZXRUaW1lKCkpKSB7CisJCQkJYXNzZXJ0VHJ1ZShsdUVkZ2UuZ2V0TGFiZWwoKS5nZXRDdXJyZW50VmFsdWUoKS5nZXRNaWdyYXRpb25SYXRlKCk9PQorCQkJCQlMT0FEX1VOTE9BRF9SQVRFKlRSQU5TUE9SVF9DQVBBQ0lUWS9QT1JUX1BPUFVMQVRJT04pOworCQkJfSBlbHNlIHsKKwkJCQlhc3NlcnRUcnVlKGx1RWRnZS5nZXRMYWJlbCgpLmdldEN1cnJlbnRWYWx1ZSgpLmdldE1pZ3JhdGlvblJhdGUoKT09MCk7CQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBQYWNrZXQgU3R5bGUgVHJhbnNwb3J0IFN5c3RlbSBEZWNvcmF0b3IgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9yVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFBhY2tldCBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtIERlY29yYXRvciB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvciBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBQYWNrZXQgU3R5bGUgVHJhbnNwb3J0IFN5c3RlbSBEZWNvcmF0b3IgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvciBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3IgZCA9IFRyYW5zcG9ydEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9yKCk7CisJCWQuc2V0VVJJKEZJWFRVUkVfVVJJKTsKKwkJc2V0Rml4dHVyZShkKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShudWxsKTsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFNURU1UaW1lCisJICogCisJICogQHJldHVybiB0aGUgaW5zdGFuY2UKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTVEVNVGltZSBjcmVhdGVTVEVNVGltZShmaW5hbCBpbnQgeWVhciwgZmluYWwgaW50IG1vbnRoLAorCQkJZmluYWwgaW50IGRheSkgeworCQlmaW5hbCBTVEVNVGltZSByZXRWYWx1ZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU1RFTVRpbWUoKTsKKworCQlmaW5hbCBDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisJCWNhbGVuZGFyLnNldCh5ZWFyLCBtb250aCwgZGF5KTsKKwkJcmV0VmFsdWUuc2V0VGltZShjYWxlbmRhci5nZXRUaW1lKCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVTVEVNVGltZQorCisKK30gLy9QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvclRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC90ZXN0cy9QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC90ZXN0cy9QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjYwNTllCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L3Rlc3RzL1BhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuVHJhbnNwb3J0RmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrZXQgU3R5bGUgVHJhbnNwb3J0IFN5c3RlbTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtVGVzdCBleHRlbmRzIFRyYW5zcG9ydFN5c3RlbVRlc3QgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBVUkkgVFJBTlNQT1JUX1NZU1RFTV9VUkkgPSBTVEVNVVJJLmNyZWF0ZVVSSSgiUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0iKTsKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBQYWNrZXQgU3R5bGUgVHJhbnNwb3J0IFN5c3RlbSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1UZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUGFja2V0IFN0eWxlIFRyYW5zcG9ydCBTeXN0ZW0gdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gKFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtKWZpeHR1cmU7CisJfQorCQorCS8qKmNyZWF0ZSB0aGUgZml4dHVyZSovCisJcHJpdmF0ZSBzdGF0aWMgUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0gY3JlYXRlRml4dHVyZSgpIHsKKwkJUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0gcmMgPSBUcmFuc3BvcnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSgpOworCQlyYy5zZXRVUkkoVFJBTlNQT1JUX1NZU1RFTV9VUkkpOworCQlyYy5nZXRMYWJlbHMoKS5hZGQoTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9wdWxhdGlvbkxhYmVsKCkpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKGNyZWF0ZUZpeHR1cmUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCit9IC8vUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1UZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvdGVzdHMvUGFja2V0VHJhbnNwb3J0TGFiZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvdGVzdHMvUGFja2V0VHJhbnNwb3J0TGFiZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2ODhiMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC90ZXN0cy9QYWNrZXRUcmFuc3BvcnRMYWJlbFRlc3QuamF2YQpAQCAtMCwwICsxLDk3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LnRlc3RzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnRlc3RzLkxhYmVsVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRUcmFuc3BvcnRMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5UcmFuc3BvcnRGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhY2tldCBUcmFuc3BvcnQgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkIE5PVAorICovCitwdWJsaWMgY2xhc3MgUGFja2V0VHJhbnNwb3J0TGFiZWxUZXN0IGV4dGVuZHMgTGFiZWxUZXN0IHsKKworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFBhY2tldCBUcmFuc3BvcnQgTGFiZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQYWNrZXRUcmFuc3BvcnRMYWJlbCBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVGVzdFJ1bm5lci5ydW4oUGFja2V0VHJhbnNwb3J0TGFiZWxUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IFBhY2tldCBUcmFuc3BvcnQgTGFiZWwgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBhY2tldFRyYW5zcG9ydExhYmVsVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFBhY2tldCBUcmFuc3BvcnQgTGFiZWwgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoUGFja2V0VHJhbnNwb3J0TGFiZWwgZml4dHVyZSkgeworCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUGFja2V0IFRyYW5zcG9ydCBMYWJlbCB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBhY2tldFRyYW5zcG9ydExhYmVsIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKFRyYW5zcG9ydEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhY2tldFRyYW5zcG9ydExhYmVsKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKworfSAvL1BhY2tldFRyYW5zcG9ydExhYmVsVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L3Rlc3RzL1BhY2tldFRyYW5zcG9ydExhYmVsVmFsdWVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvdGVzdHMvUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmE4NGRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L3Rlc3RzL1BhY2tldFRyYW5zcG9ydExhYmVsVmFsdWVUZXN0LmphdmEKQEAgLTAsMCArMSwxMjkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudGVzdHMuTGFiZWxWYWx1ZVRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5UcmFuc3BvcnRGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhY2tldCBUcmFuc3BvcnQgTGFiZWwgVmFsdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkIE5PVAorICovCitwdWJsaWMgY2xhc3MgUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZVRlc3QgZXh0ZW5kcyBMYWJlbFZhbHVlVGVzdCB7CisJCisJcHVibGljIHN0YXRpYyBkb3VibGUgVEVTVF9DQVBBQ0lUWSA9IDEyMzQuMDsKKworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFBhY2tldCBUcmFuc3BvcnQgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlIGZpeHR1cmUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlVGVzdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBQYWNrZXQgVHJhbnNwb3J0IExhYmVsIFZhbHVlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFBhY2tldCBUcmFuc3BvcnQgTGFiZWwgVmFsdWUgdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZSBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBQYWNrZXQgVHJhbnNwb3J0IExhYmVsIFZhbHVlIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZSBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2V0Rml4dHVyZShUcmFuc3BvcnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKG51bGwpOworCX0KKwkKKwkvKipNYWtlIHN1cmUgdGhlIGZpeHR1cmUgbWFrZXMgc2Vuc2UqLworCXB1YmxpYyB2b2lkIHRlc3RGaXh0dXJlKCkgeworCQlmaW5hbCBQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlIHB0bFZhbHVlID0gZ2V0Rml4dHVyZSgpOworCQlhc3NlcnROb3ROdWxsKHB0bFZhbHVlKTsKKwkJYXNzZXJ0VHJ1ZShwdGxWYWx1ZS5zYW5lKCkpOworCQkJCQorCQkvKk1ha2Ugc3VyZSB3ZSBjYW4gc2V0IHRoZSB2YWx1ZSovCisJCXB0bFZhbHVlLnNldENhcGFjaXR5KFRFU1RfQ0FQQUNJVFkpOworCQlhc3NlcnRUcnVlKHB0bFZhbHVlLmdldENhcGFjaXR5KCk9PVRFU1RfQ0FQQUNJVFkpOworCQkKKwl9CisKKwkvKioKKwkgKiBNYWtlcyBzdXJlIHRoYXQgcmVzZXQgc2V0cyB0aGlzIGJhY2sgdG8gaXRzIGRlZmF1bHQgdmFsdWUqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRlc3RSZXNldCgpIHsKKwkJZmluYWwgUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZSBwdGxWYWx1ZSA9IGdldEZpeHR1cmUoKTsKKwkJZG91YmxlIGRlZlZhbCA9IHB0bFZhbHVlLmdldENhcGFjaXR5KCk7CisKKwkJcHRsVmFsdWUuc2V0Q2FwYWNpdHkoVEVTVF9DQVBBQ0lUWSk7CisJCWFzc2VydEZhbHNlKHB0bFZhbHVlLmdldENhcGFjaXR5KCk9PWRlZlZhbCk7CisJCXB0bFZhbHVlLnJlc2V0KCk7CisJCQorCQlhc3NlcnRUcnVlKHB0bFZhbHVlLmdldENhcGFjaXR5KCk9PWRlZlZhbCk7CisJCQorCQkKKwl9CisJCisJCisKK30gLy9QYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L3Rlc3RzL1BpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC90ZXN0cy9QaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjExMGQ2MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC90ZXN0cy9QaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW1UZXN0LmphdmEKQEAgLTAsMCArMSw5NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuVHJhbnNwb3J0RmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QaXBlIFN0eWxlIFRyYW5zcG9ydCBTeXN0ZW08L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW1UZXN0IGV4dGVuZHMgVHJhbnNwb3J0U3lzdGVtVGVzdCB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFVSSSBUUkFOU1BPUlRfU1lTVEVNX1VSSSA9IFNURU1VUkkuY3JlYXRlVVJJKCJQaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW0iKTsKKwkKKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKFBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbVRlc3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgUGlwZSBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW1UZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUGlwZSBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtIGdldEZpeHR1cmUoKSB7CisJCXJldHVybiAoUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtKWZpeHR1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXRGaXh0dXJlKGNyZWF0ZUZpeHR1cmUoKSk7CisJfQorCQorCS8qKmNyZWF0ZSB0aGUgZml4dHVyZSovCisJcHJpdmF0ZSBzdGF0aWMgUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtIGNyZWF0ZUZpeHR1cmUoKSB7CisJCVBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbSByYyA9IFRyYW5zcG9ydEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbSgpOworCQlyYy5zZXRVUkkoVFJBTlNQT1JUX1NZU1RFTV9VUkkpOworCQlyYy5nZXRMYWJlbHMoKS5hZGQoTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9wdWxhdGlvbkxhYmVsKCkpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldEZpeHR1cmUobnVsbCk7CisJfQorCQorCQorCit9IC8vUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L3Rlc3RzL1RyYW5zcG9ydEFsbFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvdGVzdHMvVHJhbnNwb3J0QWxsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDFiNTJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L3Rlc3RzL1RyYW5zcG9ydEFsbFRlc3RzLmphdmEKQEAgLTAsMCArMSw1NiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+VHJhbnNwb3J0PC9iPjwvZW0+JyBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVHJhbnNwb3J0QWxsVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgeworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUcmFuc3BvcnRBbGxUZXN0cygiVHJhbnNwb3J0IFRlc3RzIik7CisJCXN1aXRlLmFkZFRlc3QoVHJhbnNwb3J0VGVzdHMuc3VpdGUoKSk7CisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVHJhbnNwb3J0QWxsVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCit9IC8vVHJhbnNwb3J0QWxsVGVzdHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC90ZXN0cy9UcmFuc3BvcnRTeXN0ZW1UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvdGVzdHMvVHJhbnNwb3J0U3lzdGVtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMDQ2ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvdGVzdHMvVHJhbnNwb3J0U3lzdGVtVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQudGVzdHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnRlc3RzLk5vZGVUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlRyYW5zcG9ydFN5c3RlbTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TeXN0ZW08L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkIE5PVAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhbnNwb3J0U3lzdGVtVGVzdCBleHRlbmRzIE5vZGVUZXN0IHsKKworCS8qKgorCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFN5c3RlbSB0ZXN0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyYW5zcG9ydFN5c3RlbSBmaXh0dXJlID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgU3lzdGVtIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUcmFuc3BvcnRTeXN0ZW1UZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU3lzdGVtIHRlc3QgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKFRyYW5zcG9ydFN5c3RlbSBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTeXN0ZW0gdGVzdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmFuc3BvcnRTeXN0ZW0gZ2V0Rml4dHVyZSgpIHsKKwkJcmV0dXJuIGZpeHR1cmU7CisJfQorCit9IC8vVHJhbnNwb3J0U3lzdGVtVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L3Rlc3RzL1RyYW5zcG9ydFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvdGVzdHMvVHJhbnNwb3J0VGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDczNGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L3Rlc3RzL1RyYW5zcG9ydFRlc3RzLmphdmEKQEAgLTAsMCArMSw2MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC50ZXN0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+dHJhbnNwb3J0PC9iPjwvZW0+JyBwYWNrYWdlLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFuc3BvcnRUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRyYW5zcG9ydFRlc3RzKCJ0cmFuc3BvcnQgVGVzdHMiKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKExvYWRVbmxvYWRFZGdlVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShMb2FkVW5sb2FkRWRnZUxhYmVsVGVzdC5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbVRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGFja2V0VHJhbnNwb3J0TGFiZWxUZXN0LmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbVRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZVRlc3QuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3JUZXN0LmNsYXNzKTsKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUcmFuc3BvcnRUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKK30gLy9UcmFuc3BvcnRUZXN0cwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGU4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2UvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOGI0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2U8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTY4Zjk5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw3IEBACisjTW9uIEphbiAyMSAxMjo1MDowMyBFU1QgMjAwOAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwYTQxNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMCwwICsxLDMgQEAKKyNUaHUgT2N0IDA1IDE0OjI4OjA2IFBEVCAyMDA2CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwNTk4ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCkBAIC0wLDAgKzEsMyBAQAorI1RodSBPY3QgMDUgMTQ6Mjg6MDcgUERUIDIwMDYKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2NmMWM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDE0IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlCitCdW5kbGUtVmVyc2lvbjogMS4wLjEucXVhbGlmaWVyCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2Uuc3RlbS51aS5nZSwKKyBvcmcuZWNsaXBzZS5zdGVtLnVpLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMsCisgb3JnLmp1bml0LAorIG9yZy5lY2xpcHNlLmhlbHAudWkKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2UvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2UvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDhlNzdhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTUgQEAKK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCitiaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIG5vdGljZS5odG1sLFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcworc3JjLmluY2x1ZGVzID0gLmNsYXNzcGF0aCxcCisgICAgICAgICAgICAgICAucHJvamVjdCxcCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgYmluLyxcCisgICAgICAgICAgICAgICBzcmMvLFwKKyAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2UvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YjE5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2UvZXBsLXYxMC5odG1sCkBAIC0wLDAgKzEsMzI4IEBACis8aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCit4bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoreG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgorPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgorPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Cis8bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Cis8bGluayByZWw9RmlsZS1MaXN0CitocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KKzx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgorPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+CisgPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgorICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgorICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+CisgIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KKyAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KKyAgPG86UGFnZXM+NDwvbzpQYWdlcz4KKyAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KKyAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+CisgICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KKyAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgorICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KKyAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KKyA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgorPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+CisgPHc6V29yZERvY3VtZW50PgorICA8dzpUcmFja1JldmlzaW9ucy8+CisgPC93OldvcmREb2N1bWVudD4KKzwveG1sPjwhW2VuZGlmXS0tPgorPHN0eWxlPgorPCEtLQorIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KK0Bmb250LWZhY2UKKwl7Zm9udC1mYW1pbHk6VGFob21hOworCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OworCW1zby1mb250LWNoYXJzZXQ6MDsKKwltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKKwltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKKwltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KKyAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLworcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAorCXttc28tc3R5bGUtcGFyZW50OiIiOworCW1hcmdpbjowaW47CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AKKwl7bWFyZ2luLXJpZ2h0OjBpbjsKKwltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKKwltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKKwltYXJnaW4tbGVmdDowaW47CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAorCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjguMHB0OworCWZvbnQtZmFtaWx5OlRhaG9tYTsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitAcGFnZSBTZWN0aW9uMQorCXtzaXplOjguNWluIDExLjBpbjsKKwltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKKwltc28taGVhZGVyLW1hcmdpbjouNWluOworCW1zby1mb290ZXItbWFyZ2luOi41aW47CisJbXNvLXBhcGVyLXNvdXJjZTowO30KK2Rpdi5TZWN0aW9uMQorCXtwYWdlOlNlY3Rpb24xO30KKy0tPgorPC9zdHlsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgorCis8ZGl2IGNsYXNzPVNlY3Rpb24xPgorCis8cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Cis8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKK1RIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCitSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKK09GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgorZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgorYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCitjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKK2FkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQorc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAorYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCitpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgorc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCitQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KK3dpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKK3dvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgorZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAorY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKK29yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCitkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobworcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQorU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKK2Egbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgorc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKK2Rpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCitDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKK2Zvcm0uPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKK1JlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCitwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0CithbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKK2NvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCitvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAorYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KK3RvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KK2FueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKK2xpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKK1JlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKK0NvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCit0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5CityaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKK2ZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKK2xpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Cit0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAoraWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQordGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQorZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCitFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAorcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgordGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KKzwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2l0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQoraXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCitlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCitjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCithbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQorYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKK2VmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCitpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCithcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKK3N0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKK0NvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKK3N0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKK2luZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKK2NvZGUgZm9ybTo8L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2l0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCitjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Citjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKK29yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCitzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5CithY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCithbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQorb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCitsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQorUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAorQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKK0NvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAorY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgorbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KK3RoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KK2Nvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0CitvZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKK3JlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgordG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgordG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKK2FueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCitpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQorUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQorQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKK2NsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKK3dhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCitzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKK290aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKK2NvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAorV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKK3Jlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCitQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCitBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCitjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgorZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKK0FHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKK05FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCitUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCitUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAorb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKK2VuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAorZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKK21pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCithZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCithbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCitvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKK1JlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKK3N1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKK3NoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCitjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKK3BlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCityaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCitSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKK1JlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCitjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKK2NvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAorU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCit0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwordGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAorQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KK3NlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgorb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KKyhpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKK2luIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KK3RoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCitleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90CitleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKK1N0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKK0FtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcworQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcworaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+CisKKzwvZGl2PgorCis8L2JvZHk+CisKKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlL25vdGljZS5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS9ub3RpY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFmOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS9ub3RpY2UuaHRtbApAQCAtMCwwICsxLDc5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Cis8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPk1hcmNoIDE3LCAyMDA1PC9wPgorCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisKKzxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKyAgIAorPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAorICAgCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKKyAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorICAgCis8dWw+CisJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKzwvdWw+ICAgCisgCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKworPHVsPgorCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKwkJCis8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCitpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KK3RoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KKwk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCisJPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKwk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCis8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKworPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKyAgIAorPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjBhYTVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDI3IEBACisjLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBUbyBjb2RlIGRldmVsb3BlcjoKKyMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKKyMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgorIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQorIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitwbHVnaW5OYW1lID0gU1RFTSBHb29nbGUgRWFydGggVUkgVGVzdCBTdWl0ZQorcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91aS9nZS9BY3RpdmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdWkvZ2UvQWN0aXZhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI3MjFiMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdWkvZ2UvQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSw3NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAorCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCisKKy8qKgorICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlLgorICogSXQgc3ViY2xhc3NlcyBBYnN0cmFjdFVJUGx1Z2luIHdoaWNoIHRha2VzIGNhcmUgb2YgCisgKiByZXN0b3JpbmcgYW5kIHNhdmluZyBQcmVmZXJlbmNlcy4KKyAqIAorICogSXQgaXMgbm90IGNsZWFyIGlmIHdlIG5lZWQgdGhpcyBjbGFzcyBmb3IgdGhlIGdlLnRlc3RzIAorICogcGx1Z2luIHByb2plY3QuICBTbyBmYXIgaXQgaGFzIG5vdCBodXJ0IQorICovCitwdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgUGx1Z2luIHsKKworCS8qKgorCSAqIFRoZSBwbHVnLWluIElECisJICovIAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IENvbnN0YW50cy5JRF9ST09UICsiLmdlLnRlc3RzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqIAorCSAqIFRoZSBzaGFyZWQgaW5zdGFuY2UKKwkgKiAKKwkgKi8KKwlzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsKKwkKKwkvKioKKwkgKiBUaGUgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgQWN0aXZhdG9yKCkgeworCQlwbHVnaW4gPSB0aGlzOworCX0KKworCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdGFydChjb250ZXh0KTsKKwl9CisKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcGx1Z2luID0gbnVsbDsKKwkJc3VwZXIuc3RvcChjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKKwkgKgorCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7CisJCWlmIChwbHVnaW4gPT0gbnVsbCkgCisJCQlwbHVnaW4gPSBuZXcgQWN0aXZhdG9yKCk7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL0FzcGVjdFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2UvQXNwZWN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MzRlODYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL0FzcGVjdFRlc3QuamF2YQpAQCAtMCwwICsxLDI1NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworCisvKioKKyAqIFRlc3QgdGhlIEFzcGVjdCBjbGFzcyAKKyAqIAorICogVGhpcyBjYW4gcnVuIGFzIGEgamF2YSBqdW5pdCBjbGFzcyAKKyAqIEl0IGRvZXMgbm90IGhhdmUgdG8gcnVuIGFzIGEgcGx1Z2luCisgKgorICovCitwdWJsaWMgY2xhc3MgQXNwZWN0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKwkKKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCS8vIFNob3VsZCBkbyBqdXN0IFMgRSBJIFIgYXMgZGVmYXVsdAorCQkvL1Byb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisJCS8vIGNhbGwgdGhlIHNldHVwKCkgbWV0aG9kIGZvciB0aGUgQXNwZWN0IGNsYXNzLgorCQlBc3BlY3Quc2V0dXAoKTsJCQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIudGVhckRvd24oKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuQXNwZWN0I3NldHVwKCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTZXR1cCgpIHsKKwkJCisJCUFzcGVjdC5zZXR1cCgpOworCX0KKworCQorCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvciBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkFzcGVjdCNnZXRBc3BlY3RzKFByb3BlcnRpZXMpCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldEFzcGVjdHMoKSB7CisJCS8vIHdlIGRpZCB0aGUgZ2V0QXNwZWN0cyBpbiBzZXR1cCBzbyBqdXN0IGNoZWNrIHJlc3VsdHMKKwkJTWFwPFN0cmluZyxBc3BlY3Q+IGFzcGVjdHMgPSBBc3BlY3QuZ2V0TWFwKCk7CisJCQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDQsYXNwZWN0cy5zaXplKCkpOworCQlmb3IoTWFwLkVudHJ5PFN0cmluZyxBc3BlY3Q+IGVudHJ5OiBhc3BlY3RzLmVudHJ5U2V0KCkpIHsKKwkJCUFzcGVjdCBhc3BlY3QgPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJYm9vbGVhbiBzYW5lID0gYXNwZWN0LmlzU2FuZSgpOworCQkJQXNzZXJ0LmFzc2VydFRydWUoc2FuZSk7CisJCX0KKwkJCisJfQorCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5Bc3BlY3QjQXNwZWN0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0QXNwZWN0KCkgeworCQlBc3BlY3QgYSA9IG5ldyBBc3BlY3QoIlQiLCJUZXN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiQ29uc3RydWN0b3IgZmFpbGVkIiwgYSk7CSAvLyROT04tTkxTLTEkCisJfQorCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5Bc3BlY3QjZ2V0QXNwZWN0KGphdmEubGFuZy5TdHJpbmcpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0QXNwZWN0KCkgeworCQkKKwkJQXNwZWN0IHQgPSBBc3BlY3QuZ2V0QXNwZWN0KCJTIik7CQkgLy8kTk9OLU5MUy0xJAorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKHQuZ2V0Q29kZSgpLCJTIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yIAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0KCkgeworCQlBc3BlY3QgZGVmYXVsdEEgPSBBc3BlY3QuZ2V0RGVmYXVsdCgpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJJIixkZWZhdWx0QS5nZXRDb2RlKCkpOyAvLyROT04tTkxTLTEkCisJCQorCX0KKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuQXNwZWN0I2V4aXN0cyhqYXZhLmxhbmcuU3RyaW5nKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdEV4aXN0cygpIHsKKwkJCQorCQlBc3NlcnQuYXNzZXJ0VHJ1ZShBc3BlY3QuZXhpc3RzKCJFIikpOyAvLyROT04tTkxTLTEkCisJCUFzc2VydC5hc3NlcnRGYWxzZShBc3BlY3QuZXhpc3RzKCJYIikpOyAvLyROT04tTkxTLTEkCisJfQorCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5Bc3BlY3QjZ2V0TWFwKCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXAoKSB7CisJCU1hcDxTdHJpbmcsQXNwZWN0PiBtYXAgPSBBc3BlY3QuZ2V0TWFwKCk7CisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCJnZXRNYXAgZmFpbGVkIiwgbWFwKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCQorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkFzcGVjdCNnZXRDb2RlKCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2RlKCkgeworCQlBc3BlY3QgdGVzdCA9IEFzcGVjdC5nZXRBc3BlY3QoIlIiKTsgLy8kTk9OLU5MUy0xJAorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKHRlc3QuZ2V0Q29kZSgpLCJSIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuQXNwZWN0I3NldENvZGUoamF2YS5sYW5nLlN0cmluZyl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTZXRDb2RlKCkgeworCQlBc3BlY3QgdGVzdCA9IEFzcGVjdC5nZXRBc3BlY3QoIlIiKTsgLy8kTk9OLU5MUy0xJAorCQl0ZXN0LnNldENvZGUoIlgiKTsgLy8kTk9OLU5MUy0xJAorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKHRlc3QuZ2V0Q29kZSgpLCJYIik7IC8vJE5PTi1OTFMtMSQKKwkJQXNzZXJ0LmFzc2VydFRydWUoQXNwZWN0LmV4aXN0cygiWCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCQorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkFzcGVjdCNzZXROYW1lKGphdmEubGFuZy5TdHJpbmcpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHsKKwkJQXNwZWN0IHRlc3QgPSBBc3BlY3QuZ2V0QXNwZWN0KCJSIik7IC8vJE5PTi1OTFMtMSQKKwkJdGVzdC5zZXROYW1lKCJOZXdOYW1lIik7IC8vJE5PTi1OTFMtMSQKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyh0ZXN0LmdldE5hbWUoKSwiTmV3TmFtZSIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkFzcGVjdCN0b1N0cmluZygpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisJCUFzcGVjdCB0ZXN0ID0gQXNwZWN0LmdldEFzcGVjdCgiUiIpOyAvLyROT04tTkxTLTEkCisJCUFzc2VydC5hc3NlcnRFcXVhbHModGVzdC50b1N0cmluZygpLHRlc3QuZ2V0Q29kZSgpKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuQXNwZWN0I2dldERlc2NyaXB0aW9uKCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXREZXNjcmlwdGlvbigpIHsKKwkJQXNwZWN0IHRlc3QgPSBBc3BlY3QuZ2V0QXNwZWN0KCJSIik7IC8vJE5PTi1OTFMtMSQKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwodGVzdC5nZXREZXNjcmlwdGlvbigpKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuQXNwZWN0I3NldERlc2NyaXB0aW9uKGphdmEubGFuZy5TdHJpbmcpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVzY3JpcHRpb24oKSB7CisJCUFzcGVjdCB0ZXN0ID0gQXNwZWN0LmdldEFzcGVjdCgiUiIpOyAvLyROT04tTkxTLTEkCisJCXRlc3Quc2V0RGVzY3JpcHRpb24oIk5ldyBkZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCisJCUFzc2VydC5hc3NlcnRFcXVhbHModGVzdC5nZXREZXNjcmlwdGlvbigpLCJOZXcgZGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5Bc3BlY3QjZ2V0UmFuZ2UoKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldFJhbmdlKCkgeworCQlBc3BlY3QgdGVzdCA9IEFzcGVjdC5nZXRBc3BlY3QoIlIiKTsgLy8kTk9OLU5MUy0xJAorCQlBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0LmlzU2FuZSgpKTsKKwkJCisJfQorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkFzcGVjdCNzZXRSYW5nZShqYXZhLmxhbmcuU3RyaW5nKX0uCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCisJcHVibGljIHZvaWQgdGVzdFNldFJhbmdlU3RyaW5nKCkgeworCQlBc3BlY3QgdGVzdCA9IEFzcGVjdC5nZXRBc3BlY3QoIlIiKTsgLy8kTk9OLU5MUy0xJAorCQl0ZXN0LnNldFJhbmdlKCIwLjAsMC41LDEuMCIpOyAvLyROT04tTkxTLTEkCisJCUFzc2VydC5hc3NlcnRFcXVhbHModGVzdC5nZXRSYW5nZSgxKSwwLjUpOworCX0KKworCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5Bc3BlY3QjZ2V0T3BhY2l0eSgpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0T3BhY2l0eSgpIHsKKwkJQXNwZWN0IHRlc3QgPSBBc3BlY3QuZ2V0QXNwZWN0KCJSIik7IC8vJE5PTi1OTFMtMSQKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyh0ZXN0LmdldE9wYWNpdHkoMCksIDApOworCX0KKworCQorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkFzcGVjdCNzZXRPcGFjaXR5KGphdmEubGFuZy5TdHJpbmcpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0T3BhY2l0eSgpIHsKKwkJQXNwZWN0IHRlc3QgPSBBc3BlY3QuZ2V0QXNwZWN0KCJSIik7IC8vJE5PTi1OTFMtMSQKKwkJdGVzdC5zZXRPcGFjaXR5KCIwIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuQXNwZWN0I3NldFJlZChqYXZhLmxhbmcuU3RyaW5nKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdFNldFJlZCgpIHsKKwkJQXNwZWN0IHRlc3QgPSBBc3BlY3QuZ2V0QXNwZWN0KCJSIik7IC8vJE5PTi1OTFMtMSQKKwkJdGVzdC5zZXRSZWQoIjAiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5Bc3BlY3Qjc2V0R3JlZW4oamF2YS5sYW5nLlN0cmluZyl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTZXRHcmVlbigpIHsKKwkJQXNwZWN0IHRlc3QgPSBBc3BlY3QuZ2V0QXNwZWN0KCJSIik7IC8vJE5PTi1OTFMtMSQKKwkJdGVzdC5zZXRHcmVlbigiMCwxMjgsMjU1Iik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuQXNwZWN0I3NldEJsdWUoamF2YS5sYW5nLlN0cmluZyl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTZXRCbHVlKCkgeworCQlBc3BlY3QgdGVzdCA9IEFzcGVjdC5nZXRBc3BlY3QoIlIiKTsgLy8kTk9OLU5MUy0xJAorCQl0ZXN0LnNldEJsdWUoIjAsMTI4LDI1NSIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkFzcGVjdCNnZXRSZWQoaW50KX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldFJlZCgpIHsKKwkJQXNwZWN0IHRlc3QgPSBBc3BlY3QuZ2V0QXNwZWN0KCJSIik7IC8vJE5PTi1OTFMtMSQKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyh0ZXN0LmdldFJlZCgwKSwgMCk7CisJfQorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkFzcGVjdCNnZXRHcmVlbihpbnQpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0R3JlZW4oKSB7CisJCUFzcGVjdCB0ZXN0ID0gQXNwZWN0LmdldEFzcGVjdCgiUiIpOyAvLyROT04tTkxTLTEkCisJCUFzc2VydC5hc3NlcnRFcXVhbHModGVzdC5nZXRHcmVlbigwKSwgMjQwKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuQXNwZWN0I2dldEJsdWUoaW50KX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldEJsdWUoKSB7CisJCUFzcGVjdCB0ZXN0ID0gQXNwZWN0LmdldEFzcGVjdCgiUiIpOyAvLyROT04tTkxTLTEkCisJCUFzc2VydC5hc3NlcnRFcXVhbHModGVzdC5nZXRCbHVlKDEpLCAwKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2UvR0VEYXRhVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9HRURhdGFUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3MjI3ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2UvR0VEYXRhVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2U7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmcuU2VnbWVudDsKKworLyoqCisgKiB0ZXN0CisgKgorICovCitwdWJsaWMgY2xhc3MgR0VEYXRhVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCVN0cmluZyBuYW1lID0gbnVsbDsKKwkKKwlHRURhdGEgZ2VkYXRhID0gbnVsbDsKKwkKKwkvKioKKwkgKiBAcGFyYW0gbmFtZQorCSAqLworCXB1YmxpYyBHRURhdGFUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCQlHRUxvZy5ERUJVRyA9IHRydWU7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQluYW1lID0gIlRlc3QiOyAvLyROT04tTkxTLTEkIAorCQlkb3VibGVbXVtdIGQgPSB7ezAuMCwgMCwwfSwKKwkJCQl7MTAuMCwgMCwwfSwKKwkJCQl7MTAuMCwgMTAsMH0sCisJCQkJezAuMCwgMTAsMH0sCisJCQkJezAuMCwgMCwwfSB9OworCQlTZWdtZW50IHMgPSBuZXcgU2VnbWVudChkKTsKKwkJTGF0TG9uZyBwb2x5Z29uID0gbmV3IExhdExvbmcoKTsKKwkJcG9seWdvbi5hZGQocyk7CisJCWRvdWJsZVtdW10gZDIgPSB7ezIwLjAsIDAsMH0sCisJCQkJezIwLjAsIDIwLDB9LAorCQkJCXs0MC4wLCAwLDB9LAorCQkJCXsyMC4wLCAwLDB9IH07CisJCVNlZ21lbnQgczIgPSBuZXcgU2VnbWVudChkMik7CisJCXBvbHlnb24uYWRkKHMyKTsKKwkJZ2VkYXRhID0gbmV3IEdFRGF0YShuYW1lLHBvbHlnb24pOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIudGVhckRvd24oKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R0VEYXRhKCkgeworCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgic2V0dXAgZmFpbGVkLiIsZ2VkYXRhKTsvLyROT04tTkxTLTEkIAorCQlHRURhdGEgZ2VkYXRheCA9IG5ldyBHRURhdGEoIlRlc3RHRURhdGEiLG51bGwpOy8vJE5PTi1OTFMtMSQgCisJCWlmIChnZWRhdGF4ID09IG51bGwpIAorCQkJZmFpbCgiRmFpbGVkIHRvIGNyZWF0ZSBhIEdFRGF0YSBpbnN0YW5jZSIpOy8vJE5PTi1OTFMtMSQgCisJfQorCisJLyoqCisJICogCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldENvb3JkaW5hdGVzQXNTdHJpbmcoKSB7CisJCVN0cmluZyBjb29yZCA9IGdlZGF0YS5nZXRDb29yZGluYXRlc0FzU3RyaW5nKDApOworCQlpZiAoY29vcmQgPT0gbnVsbCB8fCBjb29yZC5sZW5ndGgoKSA8PSAwKQorCQkJZmFpbCgiZmFpbGVkIHRvIGNyZWF0ZSBhIEtNTCBzdHJpbmcgb2YgQ29vcmRpbmF0ZXMuIik7Ly8kTk9OLU5MUy0xJCAKKwkJR0VMb2cuZGVidWcodGhpcywiIGNvb3JkOiAiK2Nvb3JkKTsvLyROT04tTkxTLTEkIAorCX0KKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXROdW1BcmVhcygpIHsKKwkJYXNzZXJ0VHJ1ZShnZWRhdGEuZ2V0TnVtQXJlYXMoKSA9PSAyKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHsKKwkJYXNzZXJ0VHJ1ZShnZWRhdGEuZ2V0TmFtZSgpLmVxdWFscygiVGVzdCIpKTsvLyROT04tTkxTLTEkIAorCQlnZWRhdGEuc2V0TmFtZSgiTmV3VGVzdCIpOy8vJE5PTi1OTFMtMSQgCisJCWFzc2VydFRydWUoZ2VkYXRhLmdldE5hbWUoKS5lcXVhbHMoIk5ld1Rlc3QiKSk7Ly8kTk9OLU5MUy0xJCAKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHsKKwkJZ2VkYXRhLnNldE5hbWUoIlRlc3QyIik7Ly8kTk9OLU5MUy0xJCAKKwkJYXNzZXJ0VHJ1ZShnZWRhdGEuZ2V0TmFtZSgpLmVxdWFscygiVGVzdDIiKSk7Ly8kTk9OLU5MUy0xJCAKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0SWQoKSB7CisJCWFzc2VydFRydWUoZ2VkYXRhLmdldElkKCkuZXF1YWxzKCJUZXN0IikpOy8vJE5PTi1OTFMtMSQgCisJfQorCisJLyoqCisJICogCisJICovCisJcHVibGljIHZvaWQgdGVzdFNldElkKCkgeworCQlnZWRhdGEuc2V0SWQoIlRlc3QzIik7Ly8kTk9OLU5MUy0xJCAKKwkJYXNzZXJ0VHJ1ZShnZWRhdGEuZ2V0SWQoKS5lcXVhbHMoIlRlc3QzIikpOy8vJE5PTi1OTFMtMSQgCisJfQorCS8qKiAKKwkgKiAKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7CisJCUFzcGVjdCB0ZXN0QXNwZWN0ID0gbmV3IEFzcGVjdCgiVCIsIlRlc3QiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCisJCWdlZGF0YS5zZXRWYWx1ZSh0ZXN0QXNwZWN0LCAwLjUpOworCQlkb3VibGUgdmFsdWUgPSBnZWRhdGEuZ2V0VmFsdWUodGVzdEFzcGVjdCk7CisJCWFzc2VydEVxdWFscyh2YWx1ZSwwLjUpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2UvR0VJbnRlcmZhY2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL0dFSW50ZXJmYWNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwM2M1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL0dFSW50ZXJmYWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2U7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBHRUludGVyZmFjZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSAgICAgIHsKKworCS8qKgorCSAqIEBwYXJhbSBuYW1lCisJICovCisJcHVibGljIEdFSW50ZXJmYWNlVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqLworCQorLy8JcHJpdmF0ZSBTY2VuYXJpbyBzY2VuYXJpbyA9IG51bGw7CisJCisJLyoqCisJICogdGhpcyBoYXMgdGhlIGtleSBwYXJ0IGNvbW1lbnRlZCBvdXQuCisJICogVG8gcmVlc3RhYmxpc2ggdGhpcyB0ZXN0IHdlIG5lZWQgdG8gYmUgYWJsZSB0byBjcmVhdGUgYSB0ZXN0IHNjZW5hcmlvLgorCSAqIFdlIG5lZWQgdG8ga25vdyBob3cgdG8gZG8gdGhpcy4KKwkgKiAKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworLy8JCSBUaGlzIGNyZWF0ZXMgYSBzY2VuYXJpbyB0aGF0J3MgcmVhZHkgdG8gYmUgInN0ZXBwZWQiIChpLmUuLAorCQkvLyBzaW11bGF0ZWQpLiBUaGUgd29ybGQgaXMgYSBsYXR0aWNlIChncmlkKSB0aGF0IDJ4MiB3aGVyZSBlYWNoIG5vZGUKKwkJLy8gaGFzIGEgcG9wdWxhdGlvbiBvZiAxMDAgaHVtYW5zIGFuZCBoYXMgYW4gYXJlYSBvZiAxMDAgc3F1YXJlCisJCS8vIGtpbG9tZXRlcnMuIFRoZXJlIGlzIG9uZSBkaXNlYXNlIHRoYXQgaXMgbW9kZWxlZCB3aXRoIGEKKwkJLy8gImRldGVybWluaXN0aWMgU0VJUiBkaXNlYXNlIG1vZGVsIi4gT25lIHBlcnNvbiBpbiB0aGUgbm9kZSBhdAorCQkvLyBwb3NpdGlvbiBbMF1bMF0sIGluIHRoZSB1cHBlciBsZWZ0IG9mIHRoZSBncmlkLCBpcyBpbmZlY3RlZC4KKy8vCQlzY2VuYXJpbyA9IERldGVybWluaXN0aWNTRUlSU2NlbmFyaW9UZXN0LmNyZWF0ZVNjZW5hcmlvKDIsIDIpOworCisJCS8vIFRoaXMgd2lsbCBpbml0aWFsaXplIHRoZSBzY2VuYXJpbyBhbmQgbWFrZSBpdCByZWFkeSB0byBzdGVwIHRocm91Z2gKKwkJLy8gdGhlIHNpbXVsYXRpb24gc2VxdWVuY2UuIEluIHBhcnRpY3VsYXIsIGl0IHdpbGwgY3JlYXRlIHRoZSBjYW5ub25pY2FsCisJCS8vIGdyYXBoIGZyb20gdGhlIHNjZW5hcmlvJ3MgbW9kZWwuCisvLwkJc2NlbmFyaW8uaW5pdGlhbGl6ZSgpOworCisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci50ZWFyRG93bigpOworCX0KKwkKKwkKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5HRUludGVyZmFjZSNzaW11bGF0aW9uc0NoYW5nZWQob3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXJFdmVudCl9LgorCSAqCisJICogVGhpcyB3aWxsIHRlc3QgdGhlIG1ldGhvZCB0aGF0IGdldHMgY29udHJvbCB3aGVuIGEgCisJICogU2ltdWxhdGlvbiBzdGFydHMuIAorCSAqIAorCSAqLworCQorCXB1YmxpYyB2b2lkIHRlc3RTaW11bGF0aW9uc0NoYW5nZWQoKSB7CisJCS8vIFRoZSBzY2VuYXJpbyB3YXMgY3JlYXRlZCBpbiB0aGUgc2V0dXAgbWV0aG9kLgorCQkgCisJCS8vIGNyZWF0ZSBhIHNpbXVsYXRpb24KKy8vCQlJU2ltdWxhdGlvbiBzaW11bGF0aW9uID0gbmV3IFNpbXVsYXRpb24oc2NlbmFyaW8pOworCQkvLyBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgR0VJbnRlcmZhY2UgdG8gdGVzdAkJCisvLwkJR0VJbnRlcmZhY2UgZ2VpID0gbmV3IEdFSW50ZXJmYWNlKG51bGwpOworICAgICAgICAvLyBpbnZva2UgdGhlIHNpbXVsYXRpb25zQ2hhbmdlZCBtZXRob2QgdG8JCQorCQkvLyB0ZWxsIGdlaSB0aGF0IGEgU2ltdWxhdGlvbiBoYXMgYmVlbiBhZGRlZC4KKy8vCQlTaW11bGF0aW9uTWFuYWdlciBzb3VyY2UgPSBTaW11bGF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCk7CisvLwkJSVNpbXVsYXRpb25bXSBhZGQgPSB7c2ltdWxhdGlvbn07CisvLwkJSVNpbXVsYXRpb25bXSByZW1vdmUgPSB7fTsKKy8vCQlTaW11bGF0aW9uTWFuYWdlckV2ZW50IHNtZXZlbnQgPSAKKy8vCQkJbmV3IFNpbXVsYXRpb25NYW5hZ2VyRXZlbnQoc291cmNlLGFkZCxyZW1vdmUpOworLy8JCWdlaS5zaW11bGF0aW9uc0NoYW5nZWQoc21ldmVudCk7CisJfQorCisvKioKKyAqIAorICovCisvLwlwdWJsaWMgdm9pZCB0ZXN0U3RhcnRTZXJ2ZXIoKSB7CisvLwkJR0VJbnRlcmZhY2UgZ2VpID0gbmV3IEdFSW50ZXJmYWNlKCk7CisvLwkJYm9vbGVhbiBzdGFydGVkID0gZ2VpLnN0YXJ0U2VydmVyKCk7CisvLwkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHN0YXJ0IHdlYiBzZXJ2ZXIuIixzdGFydGVkKTsKKy8vCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0QWN0aXZlKCkgeworICAgICAgIC8vCQkgY3JlYXRlIGEgc2ltdWxhdGlvbgorLy8JCUlTaW11bGF0aW9uIHNpbXVsYXRpb24gPSBuZXcgU2ltdWxhdGlvbihzY2VuYXJpbyk7CisJCS8vIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBHRUludGVyZmFjZSB0byB0ZXN0CQkKKy8vCQlHRUludGVyZmFjZSBnZWkgPSBuZXcgR0VJbnRlcmZhY2UobnVsbCk7CisvLwkJYm9vbGVhbiBvayA9IGdlaS5zZXRBY3RpdmUoc2ltdWxhdGlvbiwgdHJ1ZSk7CisvLwkJYXNzZXJ0RmFsc2Uob2spOworCX0KKwkKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0RGlzcGxheU1hcCgpIHsKKwkJR0VMb2cuREVCVUcgPSB0cnVlOworLy8JCSBjcmVhdGUgYSBzaW11bGF0aW9uCisvLwkJSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IG5ldyBTaW11bGF0aW9uKHNjZW5hcmlvKTsKKwkJLy8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIEdFSW50ZXJmYWNlIHRvIHRlc3QJCQorLy8JCUdFSW50ZXJmYWNlIGdlaSA9IG5ldyBHRUludGVyZmFjZShudWxsKTsKKy8vCQlib29sZWFuIG9rID0gZ2VpLmRpc3BsYXlNYXAoc2ltdWxhdGlvbik7CisvLwkJYXNzZXJ0VHJ1ZShvayk7CisJfQorCQorCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3REaXNwbGF5TWFwTm9kZSgpIHsKKwkJR0VMb2cuREVCVUcgPSB0cnVlOworLy8JCSBjcmVhdGUgYSBzaW11bGF0aW9uCisvLwkJSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IG5ldyBTaW11bGF0aW9uKHNjZW5hcmlvKTsKKwkJLy8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIEdFSW50ZXJmYWNlIHRvIHRlc3QJCQorCQlHRUludGVyZmFjZSBnZWkgPSBuZXcgR0VJbnRlcmZhY2UobnVsbCk7CisJCQorCQlib29sZWFuIG9rID0gZ2VpLmRpc3BsYXlBcmVhKCJVU0EvVVNBXzJfTUFQLnhtbCIsImF6IixmYWxzZSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAorCQlhc3NlcnRUcnVlKG9rKTsKKwl9CisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuR0VJbnRlcmZhY2Ujc2ltdWxhdGlvbnNDaGFuZ2VkKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyRXZlbnQpfS4KKwkgKgorCSAqIFRoaXMgd2lsbCB0ZXN0IHRoZSBtZXRob2QgdGhhdCBnZXRzIGNvbnRyb2wgd2hlbiBhIAorCSAqIFNpbXVsYXRpb24gc2lnbmFscyBhIGNoYW5nZS4gSW4gb3VyIGNhc2Ugd2UgYXJlIGludGVyZXN0ZWQgaW4KKwkgKiB0aGUgIFNpbXVsYXRpb25TdGF0ZS5DT01QTEVURURfQ1lDTEUgZXZlbnQuCisJICogCisJICovCisvLwkKKy8vCXB1YmxpYyB2b2lkIHRlc3RTaW11bGF0aW9uQ2hhbmdlZCgpIHsKKy8vCQkKKy8vCQkvLyBjcmVhdGUgYSBzaW11bGF0aW9uCisvLwkJSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IG5ldyBTaW11bGF0aW9uKHNjZW5hcmlvKTsKKy8vCQkvLyBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgR0VJbnRlcmZhY2UgdG8gdGVzdAkJCisvLwkJR0VJbnRlcmZhY2UgZ2VpID0gbmV3IEdFSW50ZXJmYWNlKG51bGwpOworLy8gICAgICAgIAorLy8JCS8vIHRlbGwgZ2VpIHRoYXQgYSBTaW11bGF0aW9uIGhhcyBiZWVuIGFkZGVkLgorLy8JCQorLy8JCWdlaS5zZXRBY3RpdmUoc2ltdWxhdGlvbix0cnVlKTsKKy8vCQkKKy8vCQkvLyBzZW5kIGEgc2ltdWxhdGlvbiBldmVudC4KKy8vCQlTaW11bGF0aW9uU3RhdGUgc3RhdGUgPSBTaW11bGF0aW9uU3RhdGUuQ09NUExFVEVEX0NZQ0xFOworLy8JCVNpbXVsYXRpb25FdmVudCBldmVudCA9IG5ldyBTaW11bGF0aW9uRXZlbnQoc2ltdWxhdGlvbixzdGF0ZSk7CisvLwkJCisvLwkJZ2VpLnNpbXVsYXRpb25DaGFuZ2VkKGV2ZW50KTsKKy8vCQkKKy8vCQkvLyBob3cgc2hvdWxkIEkgY2hlY2sgZm9yIHN1Y2Vzcz8/PworLy8JCQorLy8JfQorCit9CisKKy8vIG9sZCBzdHVmZiB0byBzYXZlCisvLy8qKgorLy8qIHByb3ZpZGUgbWV0aG9kcyBmb3IgU3RlbU1hcENvbnRlbnRQcm92aWRlciBpbXBsbWVudGF0aW9uCisvLyovCisvL3B1YmxpYyBpbnQgZ2V0QXNwZWN0KCkgeworLy8JcmV0dXJuIDM7CisvL30KKy8vCisvL3B1YmxpYyBNYXA8U3RyaW5nLEdFRGF0YT4gZ2V0U1RFTU1hcCgpIHsKKy8vCVN0cmluZyBuYW1lID0gIlVTLUFMLTAxMDAxIjsKKy8vCUFycmF5TGlzdDxDb29yZGluYXRlcz4gY29vcmQgPSBuZXcgQXJyYXlMaXN0PENvb3JkaW5hdGVzPigpOworLy8JZG91YmxlW10gcG9pbnRzID0gbmV3IGRvdWJsZVtdIHsKKy8vCQkJLTg2LjkxNjk1NiwzMi42NjQxNTgsIC04Ni44MTczNDQsMzIuNjYwMTUxLAorLy8JCQktODYuNzEzNDk1LDMyLjY2NzM4MiwgLTg2LjYyMDY2MywzMi43MDYyNiwKKy8vCQkJLTg2LjUyNDU5MywzMi43MDcwNTcsIC04Ni41MjQ1OTMsMzIuNzA3MDU3LAorLy8JCQktODYuNDY4MjAyLDMyLjcwNzg1NiwgLTg2LjQxNjE1OSwzMi43MDc0OCwKKy8vCQkJLTg2LjQxNTY0NywzMi43MDc0NjQsIC04Ni40MTMxMTYsMzIuNzA3Mzg2LAorLy8JCQktODYuNDEzMTE2LDMyLjcwNzM4NiwgLTg2LjQxMjU2NywzMi42MDczNDcsCisvLwkJCS04Ni40MTIzNzgsMzIuNTU3MDcxLCAtODYuNDEyMzQyLDMyLjUwMzYzNiwKKy8vCQkJLTg2LjQxMjA3MywzMi40OTI5MzQsIC04Ni40MTIwNzMsMzIuNDkyOTM0LAorLy8JCQktODYuNDExOTczLDMyLjQ5MTYzNCwgLTg2LjQxMTk3MywzMi40OTE2MzQsCisvLwkJCS04Ni40MTE5NzMsMzIuNDg5MzU1LCAtODYuNDExOTczLDMyLjQ4NTgzNSwKKy8vCQkJLTg2LjQxMTc3MywzMi40NjU3MzUsIC04Ni40MTExNzIsMzIuNDA5OTM3LAorLy8JCQktODYuNDExMTcyLDMyLjQwOTkzNywgLTg2LjQxNjQ3MiwzMi40MDcwMzcsCisvLwkJCS04Ni40NDQ3ODUsMzIuMzk5ODYsIC04Ni40NjM1NjQsMzIuMzc3Mjg4LAorLy8JCQktODYuNDk2Nzc0LDMyLjM0NDQzOCwgLTg2LjQ5Njc3NCwzMi4zNDQ0MzgsCisvLwkJCS04Ni41MzU2NjgsMzIuMzQwNDQsIC04Ni41NDIxNiwzMi4zNjE0MTcsCisvLwkJCS04Ni43MDk3MTYsMzIuMzYwNCwgLTg2Ljc4MjM3NywzMi4zNzMzNzUsCisvLwkJCS04Ni43ODQzNTUsMzIuMzI0NDA4LCAtODYuODE0OTEyLDMyLjM0MDgwMywKKy8vCQkJLTg2LjgxNDkxMiwzMi4zNDA4MDMsIC04Ni44NDMwOTYsMzIuNDMyODE0LAorLy8JCQktODYuODY2NjA3LDMyLjQ0MDExNCwgLTg2LjkwMDUxOSwzMi41NTYwNTQsCisvLwkJCS04Ni45MTY5NTYsMzIuNjY0MTU4IH07CisvLwkKKy8vCWZvciAoaW50IGk9MDsgaTxwb2ludHMubGVuZ3RoO2krKykgeworLy8JICAgIENvb3JkaW5hdGVzIGMgPSBuZXcgQ29vcmRpbmF0ZXMocG9pbnRzW2ldLHBvaW50c1tpKzFdKTsKKy8vCSAgICBpKys7CisvLwkgICAgY29vcmQuYWRkKGMpOworLy8JfQorLy8JCisvLwkKKy8vCQorLy8JR0VEYXRhIGxvYyA9bmV3IEdFRGF0YShuYW1lLGNvb3JkKTsKKy8vCU1hcDxTdHJpbmcsR0VEYXRhPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsR0VEYXRhPigxMDI0KTsKKy8vCW1hcC5wdXQobmFtZSxsb2MpOworLy8JcmV0dXJuIG1hcDsKKy8vfQorLy8KKy8vcHVibGljIE1hcDxTdHJpbmcsQ29sb3I+IGdldENvbG9ycygpIHsKKy8vCVN0cmluZyBuYW1lID0gIlVTLUFMLTAxMDAxIjsKKy8vCU1hcDxTdHJpbmcsQ29sb3I+IGNvbG9yTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLENvbG9yPigxMDI0KTsKKy8vCUNvbG9yIGMgPSBDb2xvci5ibHVlOworLy8JY29sb3JNYXAucHV0KG5hbWUsYyk7CisvLwlyZXR1cm4gY29sb3JNYXA7CisvL30KKy8vCisvL3ByaXZhdGUgbG9uZyBjeWNsZSA9IC0xOworLy9wdWJsaWMgbG9uZyBnZXRDeWNsZSgpIHsKKy8vCWN5Y2xlKys7CisvLwlyZXR1cm4gY3ljbGU7IAorLy99CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL0dFTG9nVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9HRUxvZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWFmMTNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9HRUxvZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDkyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2U7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogdGVzdGNhc2UgZm9yIEdFTE9HCisgKgorICovCitwdWJsaWMgY2xhc3MgR0VMb2dUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisJLyoqCisJICogQHBhcmFtIG5hbWUKKwkgKi8KKwlwdWJsaWMgR0VMb2dUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnRlYXJEb3duKCk7CisJfQorCisJLyoqCisJICogCisJICovCisJcHVibGljIHZvaWQgdGVzdExvZ09uKCkgeworCQlHRUxvZy5ERUJVRz10cnVlOworCQlHRUxvZy5kZWJ1Zyh0aGlzLmdldENsYXNzKCksIkRFQlVHIG9wdGlvbiB0dXJuZWQgT04iKTsvLyROT04tTkxTLTEkIAorCQlHRUxvZy5kZWJ1ZygidGVzdCBtc2ciKTsvLyROT04tTkxTLTEkIAorCQlBc3NlcnQuYXNzZXJ0VHJ1ZShHRUxvZy5ERUJVRyk7CisJfQorCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RMb2dEZWJ1ZygpIHsKKwkJR0VMb2cuREVCVUc9dHJ1ZTsKKwkJR0VMb2cuZGVidWcodGhpcy5nZXRDbGFzcygpLCJWZXJpZnk6IEdFTG9nVGVzdDogIik7Ly8kTk9OLU5MUy0xJCAKKwkJR0VMb2cuZGVidWcodGhpcywiVmVyaWZ5OiBHRUxvZ1Rlc3Q6ICIpOy8vJE5PTi1OTFMtMSQgCisJCUdFTG9nLmRlYnVnKCJHRUxvZ1Rlc3QudGVzdExvZyIsIlZlcmlmeTogR0VMb2dUZXN0LnRlc3RMb2c6ICIpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkICAKKwkJQXNzZXJ0LmFzc2VydFRydWUoR0VMb2cuREVCVUcpOworCQorCX0KKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0TG9nRXJyb3IoKSB7CisJCUdFTG9nLkRFQlVHPXRydWU7CisJCUdFTG9nLmVycm9yKCJHRUxvZ1Rlc3Q6IGVycm9yICIsbnVsbCk7Ly8kTk9OLU5MUy0xJCAKKwkJCisJfQorCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RMb2dJbmZvKCkgeworCQlHRUxvZy5ERUJVRz10cnVlOworCQlHRUxvZy5pbmZvKCJHRUxvZ1Rlc3Q6IGluZm8gIik7Ly8kTk9OLU5MUy0xJCAKKwkJCisJfQorCisJLyoqCisJICogCisJICovCisJcHVibGljIHZvaWQgdGVzdExvZ09GRigpIHsJCisJCUdFTG9nLmRlYnVnKHRoaXMsIkRFQlVHIG9wdGlvbiB3aWxsIGJlIHR1cm5lZCBPRkYiKTsvLyROT04tTkxTLTEkIAorCQlHRUxvZy5ERUJVRz1mYWxzZTsKKwkJR0VMb2cuZGVidWcodGhpcywiREVCVUcgb3B0aW9uIHR1cm5lZCBPRkYiKTsvLyROT04tTkxTLTEkIAorCQlBc3NlcnQuYXNzZXJ0RmFsc2UoR0VMb2cuREVCVUcpOworCX0KKwkKK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9TbGlkZVNob3dTZXJ2bGV0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9TbGlkZVNob3dTZXJ2bGV0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjAyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL1NsaWRlU2hvd1NlcnZsZXRUZXN0LmphdmEKQEAgLTAsMCArMSwxMjYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5nZTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKKy8vaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5zZXJ2bGV0LlNsaWRlU2hvd0luZm87CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnNlcnZsZXQuU2xpZGVTaG93U2VydmxldDsKKworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnNlcnZsZXQuVmVyaWZ5Q2xpZW50OworCisvKioKKyAqIHRlc3QgZm9yIHRoZSBTbGlkZVNob3dTZXJ2bGV0CisgKiAKKyAqIEN1cnJlbnRseSB0aGlzIHJlcXVpcmVzIHRoYXQgdGhlIGV4dGVybmFsIFRvbWNhdCB3ZWJzZXJ2ZXIgCisgKiBpcyBhdmFpbGFibGUgYXQgbG9jYWxob3N0OjgwODAgIAorICogCisgKiBJdCBjb3VsZCBiZSByZWRvbmUgdG8gdXNlIHRoZSBlbWJlZGRlZCB3ZWIgc2VydmVyIHN1cHBvcnQgCisgKiB0byB2ZXJpZnkgdGhhdCB0aGUgc2VydmxldHMgd29yay4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTbGlkZVNob3dTZXJ2bGV0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKwkvKioKKwkgKiBpbmZvIAorCSAqLworLy8JcHVibGljIFNsaWRlU2hvd0luZm8gaW5mbyA9IG51bGw7CisJCisJVmVyaWZ5Q2xpZW50IHZjID0gbnVsbDsKKwkvKioKKwkgKiBAcGFyYW0gbmFtZQorCSAqLworCXB1YmxpYyBTbGlkZVNob3dTZXJ2bGV0VGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQorCQlzdXBlci5zZXRVcCgpOworLy8JCWluZm8gPSBuZXcgU2xpZGVTaG93SW5mbygia2V5IiwiZTpcXHRtcFxcZ2UiLGZhbHNlLG51bGwpOworCQl2YyA9IG5ldyBWZXJpZnlDbGllbnQoKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnRlYXJEb3duKCk7CisJfQorCisJLyoqCisJICogVGVzdCBtZXRob2QgCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldEZpbGVzKCkgeworLy8JCUZpbGVbXSBmaWxlcyA9IG51bGw7CisvLwkJU2xpZGVTaG93U2VydmxldCB0ZXN0ID0gbmV3IFNsaWRlU2hvd1NlcnZsZXQoKTsKKy8vCQlmaWxlcyA9IHRlc3QuZ2V0RmlsZXMoaW5mbyk7CisvLwkJaWYgKGZpbGVzID09IG51bGwpCisvLwkJICAgZmFpbCgiZ2V0RmlsZXMgcmV0dXJuZWQgbnVsbCIpOworLy8JCWZvciAoaW50IGk9MDsgaTxmaWxlcy5sZW5ndGg7IGkrKykgeworLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oImZpbGU6ICIraSsiICIrZmlsZXNbaV0uZ2V0TmFtZSgpKTsKKy8vCQl9CisJCQorCX0KKworCS8qKgorCSAqIFZlcmlmeSB0aGF0IHRoZSB3ZWJzZXJ2ZXIgaXMgYWN0aXZlIGFuZCAKKwkgKiB0aGUgdmVyaWZ5U2VydmxldCBpcyBkZXBsb3llZCAKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5KCkgeworCQlTdHJpbmcgdXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9TbGlkZVNob3cvdmVyaWZ5IjsKKwkJCisJCWJvb2xlYW4gcmVzdWx0ID0gdmMudmVyaWZ5KHVybCk7CisJCUFzc2VydC5hc3NlcnRUcnVlKHZjLmdldEVycm9yKCkscmVzdWx0KTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgdGhhdCB3aGVuIHRoZSB3ZWJzZXJ2ZXIgaXMgYWN0aXZlIGJ1dCB0aGUgIAorCSAqIHRoZSB2ZXJpZnlTZXJ2bGV0IGlzIG5vdCBkZXBsb3llZCB3ZSBnZXQgYW4gZXJyb3IgCisJICogV2Ugd2lsbCB0ZXN0IGZvciB0aGlzIGJ5IHVzaW5nIGFuIGludmFsaWQgc2VydmxldCBuYW1lCisJICovCisJcHVibGljIHZvaWQgdGVzdFZlcmlmeTEoKSB7CisJCVN0cmluZyB1cmwgPSAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL1NsaWRlU2hvdy92ZXJpZnkxIjsKKwkJYm9vbGVhbiByZXN1bHQgPSB2Yy52ZXJpZnkodXJsKTsKKwkJCisJCWlmIChyZXN1bHQgfHwgISB2Yy5nZXRFcnJvcigpLnN0YXJ0c1dpdGgoIkVYQ0VQVElPTiIpKQorCQkgICBBc3NlcnQuZmFpbCh2Yy5nZXRFcnJvcigpKTsKKwl9CisJLyoqCisJICogVmVyaWZ5IHRoYXQgd2hlbiB0aGUgd2Vic2VydmVyIGlzIG5vdCBhY3RpdmUgd2UgCisJICogZ2V0IGFuIGVycm9yIG1zZworCSAqIFdlIHdpbGwgdGVzdCB0aGlzIGJ5IHNwZWNpZmluZyBhbiBpbnZhbGlkIHBvcnQKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5MigpIHsJCisJCVN0cmluZyB1cmwgPSAiaHR0cDovL2xvY2FsaG9zdDo1NTU1L1NsaWRlU2hvdy92ZXJpZnkiOwkJCisJCWJvb2xlYW4gcmVzdWx0ID0gdmMudmVyaWZ5KHVybCk7CisJCWlmIChyZXN1bHQgfHwgISB2Yy5nZXRFcnJvcigpLnN0YXJ0c1dpdGgoIkVYQ0VQVElPTiIpKQorCQkJICAgQXNzZXJ0LmZhaWwodmMuZ2V0RXJyb3IoKSk7CisJCQorCX0KKwkvKioKKwkgKiBWZXJpZnkgdGhhdCB3ZSBnZXQgYW4gZXJyb3IgZm9yIGFuIGludmFsaWQgVVJMCisJICovCisJcHVibGljIHZvaWQgdGVzdFZlcmlmeTMoKSB7CQorCQlTdHJpbmcgdXJsID0gImxvY2FsaG9zdDo1NTU1L1NsaWRlU2hvdy92ZXJpZnkiOwkJCisJCWJvb2xlYW4gcmVzdWx0ID0gdmMudmVyaWZ5KHVybCk7CisJCWlmIChyZXN1bHQgfHwgISB2Yy5nZXRFcnJvcigpLnN0YXJ0c1dpdGgoIkVSUk9SIikpCisJCQkgICBBc3NlcnQuZmFpbCh2Yy5nZXRFcnJvcigpKTsKKwkJCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9rbWwvU3RlbUttbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uva21sL1N0ZW1LbWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlMTgzZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uva21sL1N0ZW1LbWxUZXN0LmphdmEKQEAgLTAsMCArMSw3NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLmttbDsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5HRUxvZzsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgU3RlbUttbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBAcGFyYW0gbmFtZQorCSAqLworCXB1YmxpYyBTdGVtS21sVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnRlYXJEb3duKCk7CisJfQorCisJLyoqCisJICogdGVzdCBzdGFydHVwIG9mIGVtYmVkZGVkIHdlYiBzZXJ2ZXIKKwkgKiBUZXN0IG11c3QgcnVuIGFzIEpVbml0IHBsdWdpbiB0ZXN0CisJICogVGhpcyB3aWxsIHRlc3QgYm90aCB0aGUgY29kZSB0byBzdGFydCB0aGUgCisJICogd2ViIHNlcnZlciBidXQgYWxzbyB0aGUgZGVwbG95bWVudCBvZiB0aGUgCisJICogc2VydmxldHMuIAorCSAqIAorCSAqIFRoZSByZXN1bHQgb2YgdGhlIHRlc3Qgc2hvdWxkIGJlIHRoYXQgYSAKKwkgKiBzbWFsbCBwbmcgaW1hZ2Ugd2l0aCB0ZXh0ICJEZWZhdWx0IiAKKwkgKiB3aWxsIGJlIGRpc3BsYXllZCBvbiB5b3VyIGJyb3dzZXIuCisJICogCisJICovCisgICBwdWJsaWMgdm9pZCB0ZXN0c3RhcnRXZWJTZXJ2ZXIoKSB7CisJICBHRUxvZy5ERUJVRyA9IHRydWU7CisJICAKKyAgIAkgIHRyeSB7CisJCVN0cmluZyB1cmxzdHIgPSBTdGVtS21sLnN0YXJ0V2ViU2VydmVyKCk7CisJCSAgaWYgKHVybHN0ciA9PSBudWxsIHx8IHVybHN0ci5sZW5ndGgoKSA8PSAwKQorCQkJCWZhaWwoImZhaWxlZCB0byBzdGFydCB0aGUgaW50ZXJuYWwgd2ViIHNlcnZlci4iKTsgLy8kTk9OLU5MUy0xJAorCQkgIHVybHN0ciA9IHVybHN0cisiLyIrIlNsaWRlU2hvdyIrIi8iKyJpbWFnZSI7IC8vJE5PTi1OTFMtNCQKKwkJICBVUkwgdXJsID0gbmV3IFVSTCh1cmxzdHIpOworCQkgIEdFTG9nLmRlYnVnKHRoaXMsIlVSTDogIit1cmwudG9TdHJpbmcoKSk7CisJCSAgU3RlbUttbC5sYXVuY2godXJsc3RyKTsKKwkJICB0cnkgeworCSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMCoxMDAwKTsKKwkgICAgICB9ICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCSAgICAgICAgICAgIC8vIElnbm9yZWQuCisJICAgICAgfQorCSAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJZmFpbCgiRXhjZXB0aW9uIHN0YXJ0aW5nIGVtYmVkZGVkIHNlcnZlciIpOworCSAgfQorICAgCSAgCisgICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3ZpZXdzL0dFUHJlZmVyZW5jZVBhZ2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3ZpZXdzL0dFUHJlZmVyZW5jZVBhZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzYTE1NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvdmlld3MvR0VQcmVmZXJlbmNlUGFnZVRlc3QuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuR0VMb2c7CisKKy8qKgorICogVGVzdCBvZiB0aGUgR0VQcmVmZXJlbmMgUGFnZQorICogCisgKiBUaGlzIHRlc3RjYXNlIG11c3QgcnVuIGFzIGEgSlVuaXQgUGx1Z2luVGVzdC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBHRVByZWZlcmVuY2VQYWdlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCS8qKgorCSAqIEBwYXJhbSBuYW1lCisJICovCisJcHVibGljIEdFUHJlZmVyZW5jZVBhZ2VUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJR0VMb2cuREVCVUcgPSB0cnVlOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIudGVhckRvd24oKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uudmlld3MuR0VQcmVmZXJlbmNlUGFnZSNnZXRGb2xkZXIoKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdEdldEZvbGRlcigpIHsKKwkJU3RyaW5nIGZvbGRlciA9IEdFUHJlZmVyZW5jZVBhZ2UuZ2V0Rm9sZGVyKCk7CisJCWlmIChmb2xkZXIgPT0gbnVsbCkKKwkJICBmYWlsKCJSZXR1cm5lZCBudWxsIGZyb20gZ2V0Rm9sZGVyKCkiKTsvLyROT04tTkxTLTEkIAorCX0KKworCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS52aWV3cy5HRVByZWZlcmVuY2VQYWdlI3NldEZvbGRlcihqYXZhLmxhbmcuU3RyaW5nKX0uCisJICovCisJcHVibGljIHZvaWQgdGVzdFNldEZvbGRlcigpIHsKKwkJR0VQcmVmZXJlbmNlUGFnZS5zZXRGb2xkZXIoImM6L3RtcCIpOy8vJE5PTi1OTFMtMSQgCisJCVN0cmluZyBmb2xkZXIgPSBHRVByZWZlcmVuY2VQYWdlLmdldEZvbGRlcigpOworCQlpZiAoISAiYzovdG1wIi5lcXVhbHMoZm9sZGVyKSkgey8vJE5PTi1OTFMtMSQgCisJCQlmYWlsKCJzZXRGb2xkZXIgZmFpbGVkLiIpOy8vJE5PTi1OTFMtMSQgCisJCX0KKwl9CisKKworCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS52aWV3cy5HRVByZWZlcmVuY2VQYWdlI2dldEFzcGVjdCgpfS4KKwkgKi8KKy8vCXB1YmxpYyB2b2lkIHRlc3RHZXRBc3BlY3QoKSB7CisvLwkJQXNwZWN0IGFzcGVjdCA9IEdFUHJlZmVyZW5jZVBhZ2UuZ2V0QXNwZWN0KCk7CisvLyAgICAgIFRoaXMgY2FuIHJldHVybiBudWxsCQkKKy8vCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiSW52YWxpZCBBc3BlY3QiLGFzcGVjdCk7CisvLwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uudmlld3MuR0VQcmVmZXJlbmNlUGFnZSNnZXRTZXJ2ZXJIb3N0KCl9LgorCSAqLworCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRTZXJ2ZXJIb3N0KCkgeworCQlTdHJpbmcgZXhwZWN0ZWQgPSAibG9jYWxob3N0OjgwODAiOy8vJE5PTi1OTFMtMSQgCisJCVN0cmluZyBob3N0ID0gR0VQcmVmZXJlbmNlUGFnZS5nZXRTZXJ2ZXJIb3N0KCk7CisJCWlmICghIGV4cGVjdGVkLmVxdWFscyhob3N0KSkgeworCQkJZmFpbCgiZ2V0U2VydmVySG9zdCBmYWlsZWQuIik7Ly8kTk9OLU5MUy0xJCAKKwkJfQorCX0KKworCS8qKgorCSAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS52aWV3cy5HRVByZWZlcmVuY2VQYWdlI2lzQXV0b0xhdW5jaCgpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0Z2V0TWV0aG9kKCkgeworCQlpbnQgZXhwZWN0ZWQgPSBHRVByZWZlcmVuY2VQYWdlLk1fTUFOVUFMX0RJU1BMQVk7CisJCWludCB0ZXN0ID0gR0VQcmVmZXJlbmNlUGFnZS5nZXRNZXRob2QoKTsKKwkJaWYgKCBleHBlY3RlZCAhPSB0ZXN0ICkgeworCQkJZmFpbCgiZ2V0TWV0aG9kKCkgZmFpbGVkLiIpOy8vJE5PTi1OTFMtMSQgCisJCX0KKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uudmlld3MuR0VQcmVmZXJlbmNlUGFnZSNpc0ludGVybmFsU2VydmVyKCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RJc0ludGVybmFsU2VydmVyKCkgeworCQlib29sZWFuIGV4cGVjdGVkID0gdHJ1ZTsKKwkJYm9vbGVhbiB0ZXN0ID0gR0VQcmVmZXJlbmNlUGFnZS5pc0ludGVybmFsU2VydmVyKCk7CisJCWlmIChleHBlY3RlZCAhPSB0ZXN0KSB7CisJCQlmYWlsKCJJc0ludGVybmFsU2VydmVyKCkgZmFpbGVkLiIpOy8vJE5PTi1OTFMtMSQgCisJCX0KKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0SXNBdXRvTmV0d29ya0xpbmsoKSB7CisJCWJvb2xlYW4gZXhwZWN0ZWQgPSB0cnVlOworCQlib29sZWFuIHRlc3QgPSBHRVByZWZlcmVuY2VQYWdlLmlzQXV0b0xhdW5jaCgpOworCQlpZiAoZXhwZWN0ZWQgIT0gdGVzdCkgeworCQkJZmFpbCgiSXNBdXRvTGF1bmNoKCkgZmFpbGVkLiIpOy8vJE5PTi1OTFMtMSQgCisJCX0KKwl9CisKKwkvKioKKwkgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uudmlld3MuR0VQcmVmZXJlbmNlUGFnZSNnZXRXaGljaEN5Y2xlKCl9LgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RHZXRXaGljaEN5Y2xlKCkgeworCQlpbnQgZXhwZWN0ZWQgPSAxOworCQlpbnQgdGVzdCA9IEdFUHJlZmVyZW5jZVBhZ2UuZ2V0V2hpY2hDeWNsZSgpOworCQlpZiAoZXhwZWN0ZWQgIT0gdGVzdCkgeworCQkJZmFpbCgiR2V0V2hpY2hDeWNsZSgpIGZhaWxlZC4iKTsvLyROT04tTkxTLTEkIAorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3ZpZXdzL0dFVmlld1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvdmlld3MvR0VWaWV3VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMGIwNDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3ZpZXdzL0dFVmlld1Rlc3QuamF2YQpAQCAtMCwwICsxLDIyOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuR0VJbnRlcmZhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5HRUxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisKKworLyoqCisgKiBUaGUgY2xhc3MgPGNvZGU+R0VWaWV3VGVzdDwvY29kZT4gY29udGFpbnMgdGVzdHMgCisgKiBmb3IgdGhlIGNsYXNzICAgR0VWaWV3LgorICoKKyAqIFRoaXMgd2lsbCBtYWtlIGEgdmVyeSBoaWxldmVsIHRlc3Qgb2YgdGhlIEdFVmlldyBjbGFzcy4KKyAqIEl0IHdpbGwgaW52b2tlIHRoZSB2aWV3ZXIgYW5kIHZlcmlmeSB0aGF0IGl0IHN0YXJ0cyBhbmQgCisgKiB3aWxsIGluaXRpYWxseSBnZXQgbm90aGluZyB0byBsaXN0IGluIHRoZSBMaXN0Vmlld2VyLgorICogCisgKiBTb21lIG9mIHRoaXMgd2FzIGNvcGllZCBmcm9tIHRoZSBib29rIAorICogRWNsaXBzZSBCdWlsZGluZyBjb21tZXJjaWFsIHF1YWxpdHkgcGx1Zy1pbnMiCisgKiAKKyAqIEBwYXR0ZXJuIEpVbml0IFRlc3QgQ2FzZQorICogCisgKiBJbnZva2UgdGhpcyBhcyBhIEpVbml0IFBsdWdpbiBUZXN0CisgKi8KK3B1YmxpYyBjbGFzcyBHRVZpZXdUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKwkKKwkvKiogCisJICogbXVzdCBtYXRjaCB0aGUgaWQgaW4gdGhlIEdFVmlldyBjbGFzcworCSAqLworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfSUQgPSAKKwkgICBDb25zdGFudHMuSURfUk9PVCsiLnVpLnZpZXdzLmdlIjsvLyROT04tTkxTLTEkIAorICAgICAgCisKKyAgIC8qKgorICAgICogVGhlIG9iamVjdCB0aGF0IGlzIGJlaW5nIHRlc3RlZC4KKyAgICAqCisgICAgKiAKKyAgICAqLworICAgcHJpdmF0ZSBHRVZpZXcgZ2VWaWV3OworCisgICAvKioKKyAgIC8qKgorICAgICogQ29uc3RydWN0IG5ldyB0ZXN0IGluc3RhbmNlLgorICAgICoKKyAgICAqIEBwYXJhbSBuYW1lIHRoZSB0ZXN0IG5hbWUKKyAgICAqLworICAgcHVibGljIEdFVmlld1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgIHN1cGVyKG5hbWUpOworICAgfQorCisKKyAgIC8qKgorICAgICogUGVyZm9ybSBwcmUtdGVzdCBpbml0aWFsaXphdGlvbi4KKyAgICAqCisgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICoKKyAgICAqIEBzZWUgVGVzdENhc2Ujc2V0VXAoKQorICAgICovCisgICBAT3ZlcnJpZGUKK3Byb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgIHN1cGVyLnNldFVwKCk7CisgICAgIEdFTG9nLkRFQlVHID0gdHJ1ZTsKKyAgICAgdHJ5IHsKKyAgICAgIC8vIEluaXRpYWxpemUgdGhlIHRlc3QgZml4dHVyZSBmb3IgZWFjaCB0ZXN0IAorICAgICAgLy8gdGhhdCBpcyBydW4uCisgICAgICB3YWl0Rm9ySm9icygpOworICAgICAgZ2VWaWV3ID0gKEdFVmlldykgCisgICAgICAgICBQbGF0Zm9ybVVJCisgICAgICAgICAgICAuZ2V0V29ya2JlbmNoKCkKKyAgICAgICAgICAgIC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQorICAgICAgICAgICAgLmdldEFjdGl2ZVBhZ2UoKQorICAgICAgICAgICAgLnNob3dWaWV3KFZJRVdfSUQpOworCisgICAgICAvLyBEZWxheSBmb3IgMyBzZWNvbmRzIHNvIHRoYXQgCisgICAgICAvLyB0aGUgR0UgdmlldyBjYW4gYmUgc2Vlbi4KKyAgICAgIHdhaXRGb3JKb2JzKCk7CisgICAgICBkZWxheSgzMDAwKTsKKyAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworCSAgIEFjdGl2YXRvci5sb2dFcnJvcigiVW5hYmxlIHRvIHJ1biBHRVZpZXdUZXN0IGluIHRoaXMgZW52aXJvbm1lbnQiLCBlKTsvLyROT04tTkxTLTEkIAorCX0KKyAgICAgIC8vIEFkZCBhZGRpdGlvbmFsIHNldHVwIGNvZGUgaGVyZS4KKyAgIH0KKworICAgLyoqCisgICAgKiBQZXJmb3JtIHBvc3QtdGVzdCBjbGVhbnVwLgorICAgICoKKyAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgKgorICAgICogQHNlZSBUZXN0Q2FzZSN0ZWFyRG93bigpCisgICAgKi8KKyAgIEBPdmVycmlkZQorcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgICAvLyBEaXNwb3NlIG9mIHRlc3QgZml4dHVyZS4KKyAgICAgIHRyeSB7CisJCXdhaXRGb3JKb2JzKCk7CisJCSAgCisJCSAgUGxhdGZvcm1VSQorCQkgICAgIC5nZXRXb3JrYmVuY2goKQorCQkgICAgIC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQorCQkgICAgIC5nZXRBY3RpdmVQYWdlKCkKKwkJICAgICAuaGlkZVZpZXcoZ2VWaWV3KTsKKwkJICAvLyBBZGQgYWRkaXRpb25hbCB0ZWFyZG93biBjb2RlIGhlcmUuCisJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCSAgQWN0aXZhdG9yLmxvZ0Vycm9yKCJVbmFibGUgdG8gcnVuIEdFVmlld1Rlc3QgaW4gdGhpcyBlbnZpcm9ubWVudCIsIGUpOy8vJE5PTi1OTFMtMSQgCisJfQorICAgfQorCisgICAKKyAgIAorICAgLyoqCisgICAgKiBSdW4gdGhlIHZpZXcgdGVzdC4KKyAgICAqLworICAgcHVibGljIHZvaWQgdGVzdFZpZXcoKSB7CisJICBpZiAoZ2VWaWV3ID09IG51bGwpIAorCQkgIHJldHVybjsKKwkgIAorCSAgR0VJbnRlcmZhY2UgZ2VpID0gbmV3IEdFSW50ZXJmYWNlKGdlVmlldyk7CisgICAgICBMaXN0Vmlld2VyIHZpZXdlciA9IGdlVmlldy5nZXRWaWV3ZXIoKTsKKyAgICAgIEdFVmlld0NvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgR0VWaWV3Q29udGVudFByb3ZpZGVyKGdlaSk7IAorCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7CisJCS8vdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEdFVmlld0xhYmVsUHJvdmlkZXIoKSk7CisJCS8vIGRlZmluZSB0aGUgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIHRoZSBwYXJlbnQgCisJCS8vIHBhc3NlZCB0byB0aGUgZ2V0RWxlbWVudHMgbWV0aG9kCisJCXZpZXdlci5zZXRJbnB1dChTaW11bGF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkpOworCQlPYmplY3RbXSBleHBlY3RlZENvbnRlbnQgPSAKKwkgICAgICAgICBuZXcgT2JqZWN0W10geyB9OworCQkKKwkJT2JqZWN0W10gYWN0dWFsQ29udGVudCA9IGNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyh2aWV3ZXIuZ2V0SW5wdXQoKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZENvbnRlbnQsYWN0dWFsQ29udGVudCk7IAorCQkKKyAgIH0KKworICAgLyoqCisgICAgKiBQcm9jZXNzIFVJIGlucHV0IGJ1dCBkbyBub3QgcmV0dXJuIGZvciB0aGUgCisgICAgKiBzcGVjaWZpZWQgdGltZSBpbnRlcnZhbC4KKyAgICAqIAorICAgICogQHBhcmFtIHdhaXRUaW1lTWlsbGlzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIAorICAgICovCisgICBwcml2YXRlIHZvaWQgZGVsYXkobG9uZyB3YWl0VGltZU1pbGxpcykgeworICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7CisgICAgICAKKyAgICAgIC8vIElmIHRoaXMgaXMgdGhlIFVJIHRocmVhZCwgCisgICAgICAvLyB0aGVuIHByb2Nlc3MgaW5wdXQuCisgICAgICBpZiAoZGlzcGxheSAhPSBudWxsKSB7CisgICAgICAgICBsb25nIGVuZFRpbWVNaWxsaXMgPSAKKyAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgd2FpdFRpbWVNaWxsaXM7CisgICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBlbmRUaW1lTWlsbGlzKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQorICAgICAgICAgICAgICAgZGlzcGxheS5zbGVlcCgpOworICAgICAgICAgfQorICAgICAgICAgZGlzcGxheS51cGRhdGUoKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gT3RoZXJ3aXNlLCBwZXJmb3JtIGEgc2ltcGxlIHNsZWVwLgorICAgICAgZWxzZSB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHdhaXRUaW1lTWlsbGlzKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmVkLgorICAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKioKKyAgICAqIFdhaXQgdW50aWwgYWxsIGJhY2tncm91bmQgdGFza3MgYXJlIGNvbXBsZXRlLgorICAgICovCisgICBwdWJsaWMgdm9pZCB3YWl0Rm9ySm9icygpIHsKKyAgICAgIHdoaWxlIChKb2IuZ2V0Sm9iTWFuYWdlcigpLmN1cnJlbnRKb2IoKSAhPSBudWxsKQorICAgICAgICAgZGVsYXkoMTAqMTAwMCk7CisgICB9CisKKyAgIC8qKgorICAgICogQXNzZXJ0IHRoYXQgdGhlIHR3byBhcnJheXMgYXJlIGVxdWFsLgorICAgICogVGhyb3cgYW4gQXNzZXJ0aW9uRXhjZXB0aW9uIGlmIHRoZXkgYXJlIG5vdC4KKyAgICAqIAorICAgICogQHBhcmFtIGV4cGVjdGVkIGZpcnN0IGFycmF5CisgICAgKiBAcGFyYW0gYWN0dWFsIHNlY29uZCBhcnJheQorICAgICovCisgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1YWxzKE9iamVjdFtdIGV4cGVjdGVkLCBPYmplY3RbXSBhY3R1YWwpIHsKKyAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7CisgICAgICAgICBpZiAoYWN0dWFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoCisgICAgICAgICAgICAiZXhwZWN0ZWQgaXMgbnVsbCwgYnV0IGFjdHVhbCBpcyBub3QiKTsgIC8vJE5PTi1OTFMtMSQgIAorICAgICAgfQorICAgICAgCisgICAgICAvL2Vsc2UgeworICAgICAgICAgaWYgKGFjdHVhbCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKAorICAgICAgICAgICAgICAgImFjdHVhbCBpcyBudWxsLCBidXQgZXhwZWN0ZWQgaXMgbm90Iik7Ly8kTk9OLU5MUy0xJCAKKyAgICAgIC8vfQorICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgImV4cGVjdGVkLmxlbmd0aCAiLy8kTk9OLU5MUy0xJCAKKyAgICAgICAgICAgICsgZXhwZWN0ZWQubGVuZ3RoCisgICAgICAgICAgICArICIsIGJ1dCBhY3R1YWwubGVuZ3RoICIvLyROT04tTkxTLTEkIAorICAgICAgICAgICAgKyBhY3R1YWwubGVuZ3RoLAorICAgICAgICAgZXhwZWN0ZWQubGVuZ3RoLAorICAgICAgICAgYWN0dWFsLmxlbmd0aCk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdHVhbC5sZW5ndGg7IGkrKykKKyAgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICJleHBlY3RlZFsiICsgaSArIC8vJE5PTi1OTFMtMSQgCisgICAgICAgICAgICAgICAiXSBpcyBub3QgZXF1YWwgdG8gYWN0dWFsWyIgKyAvLyROT04tTkxTLTEkIAorICAgICAgICAgICAgICAgaSArICJdIiwvLyROT04tTkxTLTEkIAorICAgICAgICAgICAgZXhwZWN0ZWRbaV0sCisgICAgICAgICAgICBhY3R1YWxbaV0pOworICAgfQorfSAgLy8gR0VWaWV3VGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGU4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYWFhMTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLy5wcm9qZWN0CkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWk8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjNmNzZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw1NyBAQAorI01vbiBKYW4gMjEgMTI6NDk6MzcgRVNUIDIwMDgKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3ZWM4NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMCwwICsxLDUwIEBACisjV2VkIFNlcCAxMiAxMjo1NDo0NyBFRFQgMjAwNworY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitjbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPXRydWUKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQorY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCitjbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK2NsZWFudXAudXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQorY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitjbGVhbnVwX3Byb2ZpbGU9X2NsZWFudXAKK2NsZWFudXBfc2V0dGluZ3NfdmVyc2lvbj0yCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliYjIyMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwxNSBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkuQWN0aXZhdG9yCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwsCisgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy5jb3JlLAorIG9yZy5lY2xpcHNlLnN0ZW0udWksCisgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucywKKyBvcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeQorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMGYwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSw3IEBACitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLworYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIC4sXAorICAgICAgICAgICAgICAgbm90aWNlLmh0bWwsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNGIxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoreG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKK3htbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPGxpbmsgcmVsPUZpbGUtTGlzdAoraHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOkRvY3VtZW50UHJvcGVydGllcz4KKyAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KKyAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgorICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+CisgIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+CisgIDxvOlBhZ2VzPjQ8L286UGFnZXM+CisgIDxvOldvcmRzPjE2MjY8L286V29yZHM+CisgIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgorICAgPG86TGluZXM+Nzc8L286TGluZXM+CisgIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KKyAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+CisgIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+CisgPC9vOkRvY3VtZW50UHJvcGVydGllcz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OldvcmREb2N1bWVudD4KKyAgPHc6VHJhY2tSZXZpc2lvbnMvPgorIDwvdzpXb3JkRG9jdW1lbnQ+Cis8L3htbD48IVtlbmRpZl0tLT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlRhaG9tYTsKKwlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKKwltc28tZm9udC1jaGFyc2V0OjA7CisJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7CisJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7CisJbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KK3AuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bXNvLXN0eWxlLXBhcmVudDoiIjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwCisJe21hcmdpbi1yaWdodDowaW47CisJbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CisJbWFyZ2luLWxlZnQ6MGluOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKKwl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZTo4LjBwdDsKKwlmb250LWZhbWlseTpUYWhvbWE7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorQHBhZ2UgU2VjdGlvbjEKKwl7c2l6ZTo4LjVpbiAxMS4waW47CisJbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47CisJbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKKwltc28tZm9vdGVyLW1hcmdpbjouNWluOworCW1zby1wYXBlci1zb3VyY2U6MDt9CitkaXYuU2VjdGlvbjEKKwl7cGFnZTpTZWN0aW9uMTt9CistLT4KKzwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgorPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCitUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAorUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCitPRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCithZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKK3N1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKK2J5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgoraWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KK3N1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCit3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKK2VudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKK2NsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCitvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucworZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KK3JlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50CithIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KK3N0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5CitkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCitSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAorYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCitjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgorb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKK2J5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCit0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCithbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCitSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCitDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgordGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Citmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQordG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKK2lmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKK3RoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQorRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKK3JpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KK3RoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Cis8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK2l0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAorY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQorYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKK2FuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCitlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAoraW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAorYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCitzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0CitDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCitzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCitpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCitjb2RlIGZvcm06PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQorY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQorY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCitvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQorYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycworYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKK29mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAorbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCitDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKK2Nvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCit0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCitjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKK3RvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK3RvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCithbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQoraW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCit3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcworc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCitvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCitjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKK1dJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKK01FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQorUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcworQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKK2VxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgorVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgorVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKK29yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKK2Z1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgorYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAorb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCitzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCitwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQorY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKK3RoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKK0FncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCitzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAorZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCitTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCitBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKK0FncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKK2l0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS9ub3RpY2UuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkvbm90aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhZjk2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkvbm90aWNlLmh0bWwKQEAgLTAsMCArMSw3OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5NYXJjaCAxNywgMjAwNTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisgICAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKKyAgIAorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCisgICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKyAgIAorPHVsPgorCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucworICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPiAgIAorIAorPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisJCQorPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisJPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQorCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisgICAKKzxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE4YWM1MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNiBAQAorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFRvIGNvZGUgZGV2ZWxvcGVyOgorIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQorIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCisjICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCisjICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3BsdWdpbk5hbWUgPSBTVEVNIENvcmUgVUkgVGVzdCBTdWl0ZQorcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91aS9BY3RpdmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdWkvQWN0aXZhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlZjhhMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdWkvQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSw2MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCisvKioKKyAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQorICovCitwdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7CisKKwkvKioKKwkgKiBUaGUgcGx1Zy1pbiBJRAorCSAqLyAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aSI7CisKKwkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCisJcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsKKwkKKwkvKioKKwkgKiBUaGUgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgQWN0aXZhdG9yKCkgeworCQlwbHVnaW4gPSB0aGlzOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICovCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc3RhcnQoY29udGV4dCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcGx1Z2luID0gbnVsbDsKKwkJc3VwZXIuc3RvcChjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKKwkgKgorCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCit9IC8vIEFjdGl2YXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9VdGlsaXR5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9VdGlsaXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZTBhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL1V0aWxpdHlUZXN0LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLy8gVXRpbGl0eVRlc3QuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgSlVuaXQgdGVzdCBjYXNlIGZvciB7QGxpbmsgVXRpbGl0eX0uCisgKi8KK3B1YmxpYyBjbGFzcyBVdGlsaXR5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBBUlVCQV9BUkVBXzBfVVJJID0gVVJJCisJCQkuY3JlYXRlVVJJKCJzdGVtOi8vb3JnLmVjbGlwc2Uuc3RlbS9sYWJlbC9hcmVhL0FCVy8wL0FCVyIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIFBPUFVMQVRJT05fVVJJID0gVVJJCisJCQkuY3JlYXRlVVJJKCJzdGVtOi8vb3JnLmVjbGlwc2Uuc3RlbS9sYWJlbC9wb3B1bGF0aW9uL0FGRy8yL2h1bWFuLzIwMDYvQUYtQkRTLUcwMTAwMDEiKTsKKworCS8qKgorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgiKiIsCisJCQkJbmV3IFhNSVJlc291cmNlRmFjdG9yeUltcGwoKSk7CisJCVJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKS5wdXQoCisJCQkJInBsYXRmb3JtIiwgbmV3IFhNSVJlc291cmNlRmFjdG9yeUltcGwoKSk7CisJfSAvLyBzZXRVcAorCisJLyoqCisJICogVGVzdCBtZXRob2QgZm9yCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkuVXRpbGl0eSNnZXRMYWJlbChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKX0KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TGFiZWwoKSB7CisJCWZpbmFsIExhYmVsIGFyZWFMYWJlbCA9IFV0aWxpdHkuZ2V0TGFiZWwoUE9QVUxBVElPTl9VUkkpOworCQlhc3NlcnROb3ROdWxsKGFyZWFMYWJlbCk7CisJCWFzc2VydFRydWUodHJ1ZSk7CisJfSAvLyB0ZXN0R2V0TGFiZWwKKworfSAvLyBVdGlsaXR5VGVzdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvbWFwL1N0ZW1Qb2x5Z29uVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9tYXAvU3RlbVBvbHlnb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkMjVhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvbWFwL1N0ZW1Qb2x5Z29uVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5tYXA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLlRlc3RVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuU3RlbVBvbHlnb247CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIFRlc3RDYXNlIGZvciB0aGUgU3RlbVBvbHlnb24gY2xhc3MuCisgKiAKKyAqLworcHVibGljIGNsYXNzIFN0ZW1Qb2x5Z29uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCXByb3RlY3RlZCBTdGVtUG9seWdvbiBmaXh0dXJlID0gbnVsbDsKKworCXByb3RlY3RlZCBkb3VibGUgVEhSRVNIT0xEID0gMC4wMDAwMDE7CisKKy8vCS8qKgorLy8JICogdGhlIGRlZmF1bHQgRm9yZUdyb3VuZCBDb2xvciBLZXkKKy8vCSAqLworLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09MT1JfS0VZID0gVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlLkZPUkVHUk9VTkRfQVRUUklCVVRFX05BTUVfREVGQVVMVF9TVFJJTkc7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKi8KKwlwdWJsaWMgU3RlbVBvbHlnb25UZXN0KGZpbmFsIFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gU3RlbVBvbHlnb24gb2JqZWN0LgorCSAqIAorCSAqIEByZXR1cm4gU3RlbVBvbHlnb24KKwkgKi8KKwlwdWJsaWMgU3RlbVBvbHlnb24gY3JlYXRlRml4dHVyZSgpIHsKKwkJZmluYWwgU3RlbVBvbHlnb24gcG9seSA9IG5ldyBTdGVtUG9seWdvbigpOworCQlyZXR1cm4gcG9seTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBvYmplY3QgY3JlYXRlZCB0byBiZSB0aGUgb25lIGhlbGQgYnkgdGhlIGNsYXNzLgorCSAqIAorCSAqIEBwYXJhbSBmaXh0dXJlCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShmaW5hbCBTdGVtUG9seWdvbiBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHJpdmF0ZSBTdGVtUG9seWdvbiBnZXRGaXh0dXJlKCkgeworCQlyZXR1cm4gZml4dHVyZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlUZXN0VXRpbC5yZXNldENvdW50ZXJzKCk7CisJCXNldEZpeHR1cmUoY3JlYXRlRml4dHVyZSgpKTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3MgdGhhdCB0aGUgcG9seWdvbiBjcmVhdGVkIGlzIGVtcHR5LgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTdGVtUG9seWdvbigpIHsKKwkJZmluYWwgU3RlbVBvbHlnb24gcG9seSA9IGNyZWF0ZUZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShwb2x5LmdldE51bWJlck9mUG9pbnRzKCkgPT0gMCk7CisJfQorCisvLwkvKioKKy8vCSAqIFRlc3RzIHRoZSByZXRyaWV2YWwgaWYgYSByZWxhdGl2ZSB2YWx1ZSBvZiBhIHBvbHlnb24uCisvLwkgKiAKKy8vCSAqLworLy8JcHVibGljIHZvaWQgdGVzdEdldFJlbGF0aXZlVmFsdWUoKSB7CisvLwkJZmluYWwgU3RlbVBvbHlnb24gcG9seSA9IGNyZWF0ZUZpeHR1cmUoKTsKKy8vCisvLwkJcG9seS5zZXRSZWxhdGl2ZVZhbHVlKERFRkFVTFRfQ09MT1JfS0VZLCAwLjUpOworLy8KKy8vCQlmaW5hbCBNYXA8U3RyaW5nLCBEb3VibGU+IHJlbGF0aXZlVmFsdWVNYXAgPSBwb2x5LmdldFJlbGF0aXZlVmFsdWVNYXAoKTsKKy8vCisvLwkJZmluYWwgZG91YmxlIHJldFZhbCA9IHJlbGF0aXZlVmFsdWVNYXAuZ2V0KERFRkFVTFRfQ09MT1JfS0VZKQorLy8JCQkJLmRvdWJsZVZhbHVlKCk7CisvLworLy8JCWFzc2VydFRydWUoTWF0aC5hYnMocmV0VmFsIC0gMC41KSA8IFRIUkVTSE9MRCk7CisvLwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvbWFwL1N0ZW1Qb2x5Z29uc0xpc3RUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL21hcC9TdGVtUG9seWdvbnNMaXN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZTgzMTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL21hcC9TdGVtUG9seWdvbnNMaXN0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5tYXA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLlRlc3RVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuU3RlbVBvbHlnb25zTGlzdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgVGVzdENhc2UgZm9yIHRoZSBTdGVtUG9seWdvbnNMaXN0IGNsYXNzLgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBTdGVtUG9seWdvbnNMaXN0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworCXByb3RlY3RlZCBTdGVtUG9seWdvbnNMaXN0IGZpeHR1cmUgPSBudWxsOworCisJcHJvdGVjdGVkIGRvdWJsZSBUSFJFU0hPTEQgPSAwLjAwMDAwMTsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqLworCXB1YmxpYyBTdGVtUG9seWdvbnNMaXN0VGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIFN0ZW1Qb2x5Z29uc0xpc3Qgb2JqZWN0LgorCSAqIAorCSAqIEByZXR1cm4gU3RlbVBvbHlnb25zTGlzdAorCSAqLworCXB1YmxpYyBTdGVtUG9seWdvbnNMaXN0IGNyZWF0ZUZpeHR1cmUoKSB7CisJCWZpbmFsIFN0ZW1Qb2x5Z29uc0xpc3QgcG9seUxpc3QgPSBuZXcgU3RlbVBvbHlnb25zTGlzdCgpOworCQlyZXR1cm4gcG9seUxpc3Q7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdGVzdCBvYmplY3QgdG8gYmUgdGhlIG9uZSBoZWxkIGJ5IHRoZSBjbGFzcy4KKwkgKiAKKwkgKiBAcGFyYW0gZml4dHVyZQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoU3RlbVBvbHlnb25zTGlzdCBmaXh0dXJlKSB7CisJCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHJpdmF0ZSBTdGVtUG9seWdvbnNMaXN0IGdldEZpeHR1cmUoKSB7CisJCXJldHVybiBmaXh0dXJlOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRlc3RVdGlsLnJlc2V0Q291bnRlcnMoKTsKKwkJc2V0Rml4dHVyZShjcmVhdGVGaXh0dXJlKCkpOworCX0KKworCS8qKgorCSAqIENoZWNrcyB0aGF0IHRoZSBjcmVhdGVkIHBvbHlnb25zIGxpc3QgaXMgZW1wdHkuCisJICogCisJICovCisJcHVibGljIHZvaWQgdGVzdFN0ZW1Qb2x5Z29uc0xpc3QoKSB7CisKKwkJZmluYWwgU3RlbVBvbHlnb25zTGlzdCBwb2x5TGlzdCA9IGNyZWF0ZUZpeHR1cmUoKTsKKwkJYXNzZXJ0VHJ1ZShwb2x5TGlzdC5pc0VtcHR5KCkpOworCisJfQorCit9IC8vIFN0ZW1Qb2x5Z29uc0xpc3RUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGU4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTkwODUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMzM0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsNjkgQEAKKyNNb24gSmFuIDIxIDEyOjUwOjI0IEVTVCAyMDA4CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzk1ZTkwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMjUgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWw7IHNpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcgorQnVuZGxlLUNsYXNzUGF0aDogLgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMucHJvdmlkZXIuVGVzdHV0aWxpdHlFZGl0UGx1Z2luJEltcGxlbWVudGF0aW9uCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwsCisgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMsCisgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuaW1wbCwKKyBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5wcmVzZW50YXRpb24sCisgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMucHJvdmlkZXIsCisgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMudXRpbCwKKyBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLAorIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbCwKKyBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLnByZXNlbnRhdGlvbiwKKyBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLnByb3ZpZGVyLAorIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMudXRpbAorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CitJbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MDUxZTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE2IEBACisjIDxjb3B5cmlnaHQ+CisjIDwvY29weXJpZ2h0PgorIworIyAkSWQkCisKK2Jpbi5pbmNsdWRlcyA9IC4sXAorICAgICAgICAgICAgICAgaWNvbnMvLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIGJpbi8sXAorICAgICAgICAgICAgICAgbm90aWNlLmh0bWwsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuCitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YjE5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9lcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwzMjggQEAKKzxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKK3htbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCit4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Cis8bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Cis8bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxsaW5rIHJlbD1GaWxlLUxpc3QKK2hyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgorPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Cis8IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8bzpEb2N1bWVudFByb3BlcnRpZXM+CisgIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+CisgIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KKyAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgorICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgorICA8bzpQYWdlcz40PC9vOlBhZ2VzPgorICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgorICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KKyAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgorICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+CisgIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgorICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgorIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Cis8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8dzpXb3JkRG9jdW1lbnQ+CisgIDx3OlRyYWNrUmV2aXNpb25zLz4KKyA8L3c6V29yZERvY3VtZW50PgorPC94bWw+PCFbZW5kaWZdLS0+Cis8c3R5bGU+Cis8IS0tCisgLyogRm9udCBEZWZpbml0aW9ucyAqLworQGZvbnQtZmFjZQorCXtmb250LWZhbWlseTpUYWhvbWE7CisJcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7CisJbXNvLWZvbnQtY2hhcnNldDowOworCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOworCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOworCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQorIC8qIFN0eWxlIERlZmluaXRpb25zICovCitwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCisJe21zby1zdHlsZS1wYXJlbnQ6IiI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorcAorCXttYXJnaW4tcmlnaHQ6MGluOworCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOworCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOworCW1hcmdpbi1sZWZ0OjBpbjsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0CisJe21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOworCW1hcmdpbjowaW47CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6OC4wcHQ7CisJZm9udC1mYW1pbHk6VGFob21hOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK0BwYWdlIFNlY3Rpb24xCisJe3NpemU6OC41aW4gMTEuMGluOworCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOworCW1zby1oZWFkZXItbWFyZ2luOi41aW47CisJbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKKwltc28tcGFwZXItc291cmNlOjA7fQorZGl2LlNlY3Rpb24xCisJe3BhZ2U6U2VjdGlvbjE7fQorLS0+Cis8L3N0eWxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+CisKKzxkaXYgY2xhc3M9U2VjdGlvbjE+CisKKzxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KKzwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgorVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKK1JFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQorT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2luIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCitkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+CitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2NoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCitzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCitieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKK2lmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCitzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKK1Byb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgord2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQord29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCitlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50CitjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQorb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKK2Rpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCityZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAorYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCitzdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQorZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQorU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cworUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKK3BhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKK2FuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQorY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KK29mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCitieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgordG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bworYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQorUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cworQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKK3RoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAorZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAorbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKK3RvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCitpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCit0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCitkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKK0VhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0CityaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCit0aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgorPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2VmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKK2NvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKK2FuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5CithbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKK2luY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKK2FzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQorc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAorQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQorc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAoraW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQorY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKK2NvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKK2NvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQorb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKK3N1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKK2FjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKK2FuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCitvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKK2xpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCitDb250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgorQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCitjb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCitsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwordGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgorY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKK29mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcworcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCit0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCit0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAorYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKK2luIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAord2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKK3NlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQorb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQorY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKK0FHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCitXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCitNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQorcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKK1Byb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKK0FncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKK2NvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCitlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCitPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKK1RIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKK1RIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCitvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0CitmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQorbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KK2FnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKK290aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQorc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAorc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQorcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKK3JpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKK2NvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50CitTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKK3RoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCit0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCitBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bworc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KKyhpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKK2V4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKK2V4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQorU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgorQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCitBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCitpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KKworPC9kaXY+CisKKzwvYm9keT4KKworPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9UZXN0SW50ZWdlckxhYmVsVmFsdWUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEeW5hbWljTGFiZWxfbmV4dFZhbHVlX1Rlc3RJbnRlZ2VyTGFiZWxWYWx1ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyOTk5OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRHluYW1pY0xhYmVsX25leHRWYWx1ZV9UZXN0SW50ZWdlckxhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSWRlbnRpZmlhYmxlX2R1YmxpbkNvcmVfRHVibGluQ29yZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlkZW50aWZpYWJsZV9kdWJsaW5Db3JlX0R1YmxpbkNvcmUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMmY1MzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlkZW50aWZpYWJsZV9kdWJsaW5Db3JlX0R1YmxpbkNvcmUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGFiZWxfY3VycmVudFZhbHVlX1Rlc3RJbnRlZ2VyTGFiZWxWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9UZXN0SW50ZWdlckxhYmVsVmFsdWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3Mjk5OTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxhYmVsX2N1cnJlbnRWYWx1ZV9UZXN0SW50ZWdlckxhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L0RlY29yYXRvcnNNb2RlbEZpbGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL2ljb25zL2Z1bGwvb2JqMTYvRGVjb3JhdG9yc01vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxNzg2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L0RlY29yYXRvcnNNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L0xhYmVsc01vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvaWNvbnMvZnVsbC9vYmoxNi9MYWJlbHNNb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNTE3OTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvaWNvbnMvZnVsbC9vYmoxNi9MYWJlbHNNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L1Rlc3REeW5hbWljRWRnZUxhYmVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L1Rlc3REeW5hbWljRWRnZUxhYmVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzUwMGRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL2ljb25zL2Z1bGwvb2JqMTYvVGVzdER5bmFtaWNFZGdlTGFiZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L1Rlc3REeW5hbWljTGFiZWwxLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L1Rlc3REeW5hbWljTGFiZWwxLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTU4YTY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL2ljb25zL2Z1bGwvb2JqMTYvVGVzdER5bmFtaWNMYWJlbDEuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L1Rlc3REeW5hbWljTm9kZUxhYmVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L1Rlc3REeW5hbWljTm9kZUxhYmVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzllYmJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL2ljb25zL2Z1bGwvb2JqMTYvVGVzdER5bmFtaWNOb2RlTGFiZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L1Rlc3RFZGdlRGVjb3JhdG9yMS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvaWNvbnMvZnVsbC9vYmoxNi9UZXN0RWRnZURlY29yYXRvcjEuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOWJjNzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvaWNvbnMvZnVsbC9vYmoxNi9UZXN0RWRnZURlY29yYXRvcjEuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L1Rlc3RHcmFwaERlY29yYXRvcjEuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL2ljb25zL2Z1bGwvb2JqMTYvVGVzdEdyYXBoRGVjb3JhdG9yMS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNkYzVhOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L1Rlc3RHcmFwaERlY29yYXRvcjEuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L1Rlc3RJbnRlZ2VyTGFiZWxWYWx1ZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvaWNvbnMvZnVsbC9vYmoxNi9UZXN0SW50ZWdlckxhYmVsVmFsdWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMTc1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvaWNvbnMvZnVsbC9vYmoxNi9UZXN0SW50ZWdlckxhYmVsVmFsdWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L1Rlc3RMYWJlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvaWNvbnMvZnVsbC9vYmoxNi9UZXN0TGFiZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZjBjNDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvaWNvbnMvZnVsbC9vYmoxNi9UZXN0TGFiZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L1Rlc3ROb2RlRGVjb3JhdG9yMS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvaWNvbnMvZnVsbC9vYmoxNi9UZXN0Tm9kZURlY29yYXRvcjEuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDU1MWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvaWNvbnMvZnVsbC9vYmoxNi9UZXN0Tm9kZURlY29yYXRvcjEuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L1Rlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvaWNvbnMvZnVsbC9vYmoxNi9UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YmMyMmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvaWNvbnMvZnVsbC9vYmoxNi9UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L1Rlc3RTdGF0aWNFZGdlTGFiZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL2ljb25zL2Z1bGwvb2JqMTYvVGVzdFN0YXRpY0VkZ2VMYWJlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1MDBkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L1Rlc3RTdGF0aWNFZGdlTGFiZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L1Rlc3RTdGF0aWNOb2RlTGFiZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL2ljb25zL2Z1bGwvb2JqMTYvVGVzdFN0YXRpY05vZGVMYWJlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM5ZWJiZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL29iajE2L1Rlc3RTdGF0aWNOb2RlTGFiZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL3dpemJhbi9OZXdEZWNvcmF0b3JzLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL3dpemJhbi9OZXdEZWNvcmF0b3JzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzE2OGJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL2ljb25zL2Z1bGwvd2l6YmFuL05ld0RlY29yYXRvcnMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL3dpemJhbi9OZXdMYWJlbHMuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL2ljb25zL2Z1bGwvd2l6YmFuL05ld0xhYmVscy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdmZDFlMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9pY29ucy9mdWxsL3dpemJhbi9OZXdMYWJlbHMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9tb2RlbC9kZWNvcmF0b3JzLmVjb3JlIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL21vZGVsL2RlY29yYXRvcnMuZWNvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ5Yjk4YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9tb2RlbC9kZWNvcmF0b3JzLmVjb3JlCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImRlY29yYXRvcnMiCisgICAgbnNVUkk9Imh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMuZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycyI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVzdEVkZ2VEZWNvcmF0b3IxIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL21vZGVsLmVjb3JlIy8vRWRnZURlY29yYXRvciI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vZGVBVVJJIiBlVHlwZT0iIy8vVVJJIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vZGVCVVJJIiBlVHlwZT0iIy8vVVJJIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVkZ2VVUkkiIGVUeXBlPSIjLy9VUkkiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVzdEdyYXBoRGVjb3JhdG9yMSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9tb2RlbC5lY29yZSMvL0dyYXBoRGVjb3JhdG9yIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVzdE5vZGVEZWNvcmF0b3IxIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL21vZGVsLmVjb3JlIy8vTm9kZURlY29yYXRvciIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9tb2RlbC5lY29yZSMvL0dyYXBoRGVjb3JhdG9yIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZG91YmxlVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW50VmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RyaW5nVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic1RFTVRpbWVWYWx1ZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvbW9kZWwuZWNvcmUjLy9TVEVNVGltZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib29sZWFuVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVkZ2VEZWNvcmF0b3IiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRWRnZURlY29yYXRvciIKKyAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaERlY29yYXRvciIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5HcmFwaERlY29yYXRvciIKKyAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOb2RlRGVjb3JhdG9yIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3IiCisgICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVVJJIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSIvPgorPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9tb2RlbC9sYWJlbHMuZWNvcmUgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvbW9kZWwvbGFiZWxzLmVjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTY1MTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvbW9kZWwvbGFiZWxzLmVjb3JlCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImxhYmVscyIKKyAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscyI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVzdER5bmFtaWNFZGdlTGFiZWwiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUjLy9EeW5hbWljRWRnZUxhYmVsIj4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaW5jcmVtZW50Ii8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlc3REeW5hbWljTGFiZWwxIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2dyYXBoLmVjb3JlIy8vRHluYW1pY0xhYmVsIj4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaW5jcmVtZW50Ii8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlc3REeW5hbWljTm9kZUxhYmVsIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2dyYXBoLmVjb3JlIy8vRHluYW1pY05vZGVMYWJlbCI+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImluY3JlbWVudCIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZXN0SW50ZWdlckxhYmVsVmFsdWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUjLy9MYWJlbFZhbHVlIj4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaW5jcmVtZW50Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVzdExhYmVsIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2dyYXBoLmVjb3JlIy8vTGFiZWwiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZXN0U3RhdGljRWRnZUxhYmVsIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2dyYXBoLmVjb3JlIy8vU3RhdGljRWRnZUxhYmVsIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVzdFN0YXRpY05vZGVMYWJlbCIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9ncmFwaC5lY29yZSMvL1N0YXRpY05vZGVMYWJlbCIvPgorPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9tb2RlbC90ZXN0dXRpbGl0eS5nZW5tb2RlbCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9tb2RlbC90ZXN0dXRpbGl0eS5nZW5tb2RlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTRmNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL21vZGVsL3Rlc3R1dGlsaXR5Lmdlbm1vZGVsCkBAIC0wLDAgKzEsNTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgorICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMiCisgICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMiCisgICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsIiBtb2RlbE5hbWU9IlRlc3R1dGlsaXR5IiBub25OTFNNYXJrZXJzPSJ0cnVlIgorICAgIHRlc3RzRGlyZWN0b3J5PSIiIHRlc3RTdWl0ZUNsYXNzPSIiIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5qYXZhIgorICAgIGNvbXBsaWFuY2VMZXZlbD0iNS4wIiBjb3B5cmlnaHRGaWVsZHM9ImZhbHNlIiB1c2VkR2VuUGFja2FnZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vbW9kZWwgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9jb21tb24gLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9ncmFwaCAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL21vZGlmaWVyIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9zY2VuYXJpbyAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL3NlcXVlbmNlciI+CisgIDxmb3JlaWduTW9kZWw+QG1vZGVsPC9mb3JlaWduTW9kZWw+CisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkRlY29yYXRvcnMiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCisgICAgICBnZW5lcmF0ZUV4YW1wbGVDbGFzcz0iZmFsc2UiIG11bHRpcGxlRWRpdG9yUGFnZXM9ImZhbHNlIiBnZW5lcmF0ZU1vZGVsV2l6YXJkPSJmYWxzZSIKKyAgICAgIGVjb3JlUGFja2FnZT0iZGVjb3JhdG9ycy5lY29yZSMvIj4KKyAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9ImRlY29yYXRvcnMuZWNvcmUjLy9VUkkiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkZWNvcmF0b3JzLmVjb3JlIy8vVGVzdEVkZ2VEZWNvcmF0b3IxIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkZWNvcmF0b3JzLmVjb3JlIy8vVGVzdEVkZ2VEZWNvcmF0b3IxL25vZGVBVVJJIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGVjb3JhdG9ycy5lY29yZSMvL1Rlc3RFZGdlRGVjb3JhdG9yMS9ub2RlQlVSSSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRlY29yYXRvcnMuZWNvcmUjLy9UZXN0RWRnZURlY29yYXRvcjEvZWRnZVVSSSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkZWNvcmF0b3JzLmVjb3JlIy8vVGVzdEdyYXBoRGVjb3JhdG9yMSIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRlY29yYXRvcnMuZWNvcmUjLy9UZXN0Tm9kZURlY29yYXRvcjEiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkZWNvcmF0b3JzLmVjb3JlIy8vVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkZWNvcmF0b3JzLmVjb3JlIy8vVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxL2RvdWJsZVZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGVjb3JhdG9ycy5lY29yZSMvL1Rlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMS9pbnRWYWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRlY29yYXRvcnMuZWNvcmUjLy9UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEvc3RyaW5nVmFsdWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkZWNvcmF0b3JzLmVjb3JlIy8vVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxL3NURU1UaW1lVmFsdWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkZWNvcmF0b3JzLmVjb3JlIy8vVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxL2Jvb2xlYW5WYWx1ZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImRlY29yYXRvcnMuZWNvcmUjLy9FZGdlRGVjb3JhdG9yIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJkZWNvcmF0b3JzLmVjb3JlIy8vR3JhcGhEZWNvcmF0b3IiLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImRlY29yYXRvcnMuZWNvcmUjLy9Ob2RlRGVjb3JhdG9yIi8+CisgIDwvZ2VuUGFja2FnZXM+CisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkxhYmVscyIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbCIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKKyAgICAgIGdlbmVyYXRlRXhhbXBsZUNsYXNzPSJmYWxzZSIgbXVsdGlwbGVFZGl0b3JQYWdlcz0iZmFsc2UiIGdlbmVyYXRlTW9kZWxXaXphcmQ9ImZhbHNlIgorICAgICAgZWNvcmVQYWNrYWdlPSJsYWJlbHMuZWNvcmUjLyI+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibGFiZWxzLmVjb3JlIy8vVGVzdER5bmFtaWNFZGdlTGFiZWwiPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImxhYmVscy5lY29yZSMvL1Rlc3REeW5hbWljRWRnZUxhYmVsL2luY3JlbWVudCIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJsYWJlbHMuZWNvcmUjLy9UZXN0RHluYW1pY0xhYmVsMSI+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibGFiZWxzLmVjb3JlIy8vVGVzdER5bmFtaWNMYWJlbDEvaW5jcmVtZW50Ii8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImxhYmVscy5lY29yZSMvL1Rlc3REeW5hbWljTm9kZUxhYmVsIj4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJsYWJlbHMuZWNvcmUjLy9UZXN0RHluYW1pY05vZGVMYWJlbC9pbmNyZW1lbnQiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibGFiZWxzLmVjb3JlIy8vVGVzdEludGVnZXJMYWJlbFZhbHVlIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBsYWJlbHMuZWNvcmUjLy9UZXN0SW50ZWdlckxhYmVsVmFsdWUvaSIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImxhYmVscy5lY29yZSMvL1Rlc3RJbnRlZ2VyTGFiZWxWYWx1ZS9pbmNyZW1lbnQiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibGFiZWxzLmVjb3JlIy8vVGVzdExhYmVsIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibGFiZWxzLmVjb3JlIy8vVGVzdFN0YXRpY0VkZ2VMYWJlbCIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImxhYmVscy5lY29yZSMvL1Rlc3RTdGF0aWNOb2RlTGFiZWwiLz4KKyAgPC9nZW5QYWNrYWdlcz4KKzwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvbm90aWNlLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvbm90aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhZjk2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9ub3RpY2UuaHRtbApAQCAtMCwwICsxLDc5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Cis8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPk1hcmNoIDE3LCAyMDA1PC9wPgorCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisKKzxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKyAgIAorPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAorICAgCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKKyAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorICAgCis8dWw+CisJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKzwvdWw+ICAgCisgCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKworPHVsPgorCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKwkJCis8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCitpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KK3RoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KKwk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCisJPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKwk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCis8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKworPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKyAgIAorPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI2ZDM0MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9wbHVnaW4ucHJvcGVydGllcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NGIzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvcGx1Z2luLnhtbApAQCAtMCwwICsxLDYwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgorCis8IS0tCisgPGNvcHlyaWdodD4KKyA8L2NvcHlyaWdodD4KKworICRJZCQKKy0tPgorCis8cGx1Z2luPgorCisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Lml0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3JpZXMiPgorICAgIDxmYWN0b3J5IAorICAgICAgIHVyaSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzLmVjb3JlIiAKKyAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5wcm92aWRlci5EZWNvcmF0b3JzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCisgICAgICAgc3VwcG9ydGVkVHlwZXMgPSAKKyAgICAgICAgICJvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcgorICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcgorICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcgorICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcgorICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UiIC8+CisgIDwvZXh0ZW5zaW9uPgorICAKKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KKyAgICA8cGFja2FnZQorICAgICAgIHVyaSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzLmVjb3JlIgorICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLkRlY29yYXRvcnNQYWNrYWdlIgorICAgICAgIGdlbk1vZGVsID0gIm1vZGVsL3Rlc3R1dGlsaXR5Lmdlbm1vZGVsIiAvPiAKKyAgPC9leHRlbnNpb24+CisKKworICA8ZXh0ZW5zaW9uCisgICAgcG9pbnQgPSAib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+CisgICAgPGNhdGVnb3J5CisgICAgICBpZCA9ICJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuV2l6YXJkLmNhdGVnb3J5LklEIgorICAgICAgbmFtZT0iJV9VSV9XaXphcmRfY2F0ZWdvcnkiPgorICAgIDwvY2F0ZWdvcnk+CisgICAgPHdpemFyZAorICAgICAgaWQgPSAib3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMucHJlc2VudGF0aW9uLkRlY29yYXRvcnNNb2RlbFdpemFyZElEIgorICAgICAgbmFtZSA9ICIlX1VJX0RlY29yYXRvcnNNb2RlbFdpemFyZF9sYWJlbCIKKyAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLnByZXNlbnRhdGlvbi5EZWNvcmF0b3JzTW9kZWxXaXphcmQiCisgICAgICBjYXRlZ29yeSA9ICJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuV2l6YXJkLmNhdGVnb3J5LklEIgorICAgICAgaWNvbiA9ICJpY29ucy9mdWxsL29iajE2L0RlY29yYXRvcnNNb2RlbEZpbGUuZ2lmIj4KKyAgICAgIDxkZXNjcmlwdGlvbj4lX1VJX0RlY29yYXRvcnNNb2RlbFdpemFyZF9kZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+CisgICAgICA8c2VsZWN0aW9uIGNsYXNzID0gIm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIgLz4KKyAgICA8L3dpemFyZD4KKyAgPC9leHRlbnNpb24+CisKKyAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KKyAgICA8ZWRpdG9yCisgICAgICAgIGlkID0gIm9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLnByZXNlbnRhdGlvbi5EZWNvcmF0b3JzRWRpdG9ySUQiCisgICAgICAgIG5hbWUgPSAiJV9VSV9EZWNvcmF0b3JzRWRpdG9yX2xhYmVsIgorICAgICAgICBpY29uID0gImljb25zL2Z1bGwvb2JqMTYvRGVjb3JhdG9yc01vZGVsRmlsZS5naWYiCisgICAgICAgIGV4dGVuc2lvbnMgPSAiZGVjb3JhdG9ycyIKKyAgICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMucHJlc2VudGF0aW9uLkRlY29yYXRvcnNFZGl0b3IiIAorICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5wcmVzZW50YXRpb24uRGVjb3JhdG9yc0FjdGlvbkJhckNvbnRyaWJ1dG9yIiA+CisgICAgPC9lZGl0b3I+CisgIDwvZXh0ZW5zaW9uPiAgICAKKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvQWN0aXZhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjIyNDExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSw2MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CisKKy8qKgorICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKKworCS8qKgorCSAqIFRoZSBwbHVnLWluIElECisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbCI7CisKKwkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCisJcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsKKwkKKwkvKioKKwkgKiBUaGUgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgQWN0aXZhdG9yKCkgeworCQlwbHVnaW4gPSB0aGlzOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICovCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc3RhcnQoY29udGV4dCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcGx1Z2luID0gbnVsbDsKKwkJc3VwZXIuc3RvcChjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKKwkgKgorCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCit9IC8vIEFjdGl2YXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvQ291bnRyeURpcmVjdG9yeVV0aWxpdGllcy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvQ291bnRyeURpcmVjdG9yeVV0aWxpdGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYzI1NjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9Db3VudHJ5RGlyZWN0b3J5VXRpbGl0aWVzLmphdmEKQEAgLTAsMCArMSwyMzEgQEAKKy8vIENvdW50cnlEaXJlY3RvcnlVdGlsaXRpZXMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8qKgorICogVGhpcyBjbGFzcyBjb250YWlucyB1dGlsaXR5IG1ldGhvZHMgZm9yIGV4dHJhY3RpbmcgaW5mb3JtYXRpb24gc3VjaCBhcworICogSVNPMzAxNjYtMSBhbHBoYTMgY29kZXMgZnJvbSBkaXJlY3RvcmllcyBhbmQgdGhlaXIgbmFtZXMgdGhhdCBjb250YWluCisgKiBwcm9wZXJ0eSBmaWxlcyBkZWZpbmluZyBncmFwaHMgcmVwcmVzZW50aW5nIGNvdW50cmllcy4KKyAqLworcHVibGljIGNsYXNzIENvdW50cnlEaXJlY3RvcnlVdGlsaXRpZXMgeworCisJZmluYWwgc3RhdGljIFN0cmluZyBDT1VOVFJZX0RJUl9QQVRIID0gQ291bnRyeUdyYXBoQ3JlYXRvci5SRVNPVVJDRVNfRElSCisJCQkrIEZpbGUuc2VwYXJhdG9yICsgQ291bnRyeUdyYXBoQ3JlYXRvci5EQVRBX0RJUiArIEZpbGUuc2VwYXJhdG9yCisJCQkrIENvdW50cnlHcmFwaENyZWF0b3IuQ09VTlRSWV9ESVI7CisKKwkvKioKKwkgKiBAcGFyYW0gY291bnRyeUNvZGUKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb3VudHJ5CisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q291bnRyeU5hbWUoQ291bnRyeUNvZGUgY291bnRyeUNvZGUpIHsKKwkJU3RyaW5nIHJldFZhbHVlID0gIiI7CisKKwkJZmluYWwgU3RyaW5nIGNvdW50cnlQYXRoID0gQ09VTlRSWV9ESVJfUEFUSCArIEZpbGUuc2VwYXJhdG9yCisJCQkJKyBjb3VudHJ5Q29kZSArIEZpbGUuc2VwYXJhdG9yICsgY291bnRyeUNvZGUKKwkJCQkrICJfbmFtZXMucHJvcGVydGllcyI7CisKKwkJRmlsZSBjb3VudHJ5TmFtZXNGaWxlID0gbmV3IEZpbGUoY291bnRyeVBhdGgpOworCQlpZiAoY291bnRyeU5hbWVzRmlsZS5pc0ZpbGUoKSAmJiBjb3VudHJ5TmFtZXNGaWxlLmNhblJlYWQoKSkgeworCQkJUHJvcGVydGllcyBjb3VudHJ5TmFtZURhdGEgPSBuZXcgUHJvcGVydGllcygpOworCQkJRmlsZUlucHV0U3RyZWFtIGNvdW50cnlOYW1lc0lucHV0U3RyZWFtID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJY291bnRyeU5hbWVzSW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGNvdW50cnlOYW1lc0ZpbGUpOworCQkJCWNvdW50cnlOYW1lRGF0YS5sb2FkKGNvdW50cnlOYW1lc0lucHV0U3RyZWFtKTsKKwkJCQlyZXRWYWx1ZSA9IGNvdW50cnlOYW1lRGF0YS5nZXRQcm9wZXJ0eShjb3VudHJ5Q29kZS50b1N0cmluZygpKTsKKwkJCQljb3VudHJ5TmFtZXNJbnB1dFN0cmVhbS5jbG9zZSgpOworCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCS8vIFN5c3RlbS5lcnIucHJpbnRsbigiVHJvdWJsZSByZWFkaW5nIFwiIiArIGNvdW50cnlOYW1lc0ZpbGUgKworCQkJLy8gIlwiIik7CisJCX0KKwkJcmV0dXJuIHJldFZhbHVlOworCisJfSAvLyBnZXRDb3VudHJ5TmFtZQorCisJLyoqCisJICogVGhpcyBtZXRob2QgZXhhbWluZXMgYSBkaXJlY3RvcnkgY29uc2lzdGluZyBvZiBzdWJkaXJlY3RvcmllcyBuYW1lZCB3aXRoCisJICogSVMwMzE2Ni0xIGFscGhhMyBjb2RlcyBhbmQgZXh0cmFjdHMgdGhlIGNvZGVzLgorCSAqIAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSBhbGwgb2YgdGhlIElTMDMxNjYtMSBhbHBoYTMgY291bnRyeSBjb2RlcworCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdDxDb3VudHJ5Q29kZT4gZ2V0QWxsQ291bnRyeUNvZGVzKCkgeworCQlmaW5hbCBMaXN0PENvdW50cnlDb2RlPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8Q291bnRyeUNvZGU+KCk7CisJCWZvciAoRmlsZSBjb3VudHJ5RGlyZWN0b3J5IDogZ2V0Q291bnRyeURpcmVjdG9yaWVzKCkpIHsKKwkJCXJldFZhbHVlLmFkZChnZXRDb3VudHJ5Q29kZShjb3VudHJ5RGlyZWN0b3J5KSk7CisJCX0KKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0QWxsQ291bnRyeUNvZGVzCisKKwkvKioKKwkgKiBAcGFyYW0gY291bnRyeURpcmVjdG9yeQorCSAqICAgICAgICAgICAgZGlyZWN0b3J5IGZvciBhIHNwZWNpZmljIGNvdW50cnkgdGhhdCBjb250YWlucyBkYXRhIHRoYXQKKwkgKiAgICAgICAgICAgIGRlZmluZXMgdGhlIGdlb2dyYXBoIGFuZCBmZWF0dXJlcyBvZiB0aGF0IGNvdW50cnkuCisJICogQHJldHVybiB0aGUgdGhyZWUgbGV0dGVyIGNvZGUgdGhlIGlkZW50aWZpZXMgdGhlIGNvdW50cnkKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBDb3VudHJ5Q29kZSBnZXRDb3VudHJ5Q29kZShmaW5hbCBGaWxlIGNvdW50cnlEaXJlY3RvcnkpIHsKKwkJQ291bnRyeUNvZGUgcmV0VmFsdWUgPSBudWxsOworCQl0cnkgeworCQkJcmV0VmFsdWUgPSBuZXcgQ291bnRyeUNvZGUoY291bnRyeURpcmVjdG9yeS5nZXRDYW5vbmljYWxGaWxlKCkKKwkJCQkJLmdldE5hbWUoKSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0Q291bnRyeUNvZGUKKworCS8qKgorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gdGhlIGNvdW50cnkgZGF0YQorCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdDxGaWxlPiBnZXRDb3VudHJ5RGlyZWN0b3JpZXMoKSB7CisJCUxpc3Q8RmlsZT4gcmV0VmFsdWUgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7CisKKwkJZmluYWwgRmlsZSBjb3VudHJ5RGlyZWN0b3J5ID0gbmV3IEZpbGUoQ09VTlRSWV9ESVJfUEFUSCk7CisKKwkJaWYgKGNvdW50cnlEaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgeworCQkJZmluYWwgRmlsZVtdIGNvdW50cmllcyA9IGNvdW50cnlEaXJlY3RvcnkKKwkJCQkJLmxpc3RGaWxlcyhuZXcgRmlsZUZpbHRlcigpIHsKKwkJCQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIHBhdGhuYW1lKSB7CisJCQkJCQkJLy8gU2tpcCBvdmVyIHRoZSBzdWJ2ZXJzaW9uIGRpcmVjdG9yeQorCQkJCQkJCXJldHVybiAhcGF0aG5hbWUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuc3ZuIik7CisJCQkJCQl9CisJCQkJCX0pOworCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50cmllcy5sZW5ndGg7IGkrKykgeworCQkJCXJldFZhbHVlLmFkZChjb3VudHJpZXNbaV0pOworCQkJfQorCQl9IGVsc2UgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJcIiIgKyBDT1VOVFJZX0RJUl9QQVRICisJCQkJCSsgIlwiIGlzIG5vdCBhIGRpcmVjdG9yeSIpOworCQl9CisJCXJldHVybiByZXRWYWx1ZTsKKworCX0gLy8gZ2V0Q291bnRyeURpcmVjdG9yaWVzCisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gY291bnRyeUNvZGUKKwkgKiAgICAgICAgICAgIHRoZSBjb3VudHJ5CisJICogQHBhcmFtIGRhdGFUeXBlCisJICogICAgICAgICAgICB0aGUgdHlwZSBvZiBmaWxlcyB0byByZXR1cm4KKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0aGUgZmlsZXMgZm9yIHRoZSBzcGVjaWZpZWQgY291bnRyeSB0aGF0IGNvbnRhaW4gZGF0YQorCSAqICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBkYXRhIHR5cGUuCisJICovCisJcHVibGljIHN0YXRpYyBMaXN0PEZpbGU+IGdldERhdGFGaWxlcyhDb3VudHJ5Q29kZSBjb3VudHJ5Q29kZSwKKwkJCVN0cmluZyBkYXRhVHlwZSkgeworCQlmaW5hbCBMaXN0PEZpbGU+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOworCisJCWZpbmFsIEZpbGUgY291bnRyeURpcmVjdG9yeSA9IG5ldyBGaWxlKENPVU5UUllfRElSX1BBVEgKKwkJCQkrIEZpbGUuc2VwYXJhdG9yICsgY291bnRyeUNvZGUpOworCisJCWlmIChjb3VudHJ5RGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKKwkJCWZpbmFsIFN0cmluZyBzdWZmaXggPSBkYXRhVHlwZSArICIucHJvcGVydGllcyI7CisJCQlmaW5hbCBGaWxlW10gY291bnRyaWVzID0gY291bnRyeURpcmVjdG9yeQorCQkJCQkubGlzdEZpbGVzKG5ldyBGaWxlRmlsdGVyKCkgeworCQkJCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKKwkJCQkJCQlyZXR1cm4gcGF0aG5hbWUuZ2V0TmFtZSgpLmVuZHNXaXRoKHN1ZmZpeCk7CisJCQkJCQl9CisJCQkJCX0pOworCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50cmllcy5sZW5ndGg7IGkrKykgeworCQkJCXJldFZhbHVlLmFkZChjb3VudHJpZXNbaV0pOworCQkJfQorCQl9IGVsc2UgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJcIiIgKyBDT1VOVFJZX0RJUl9QQVRICisJCQkJCSsgIlwiIGlzIG5vdCBhIGRpcmVjdG9yeSIpOworCQl9CisJCXJldHVybiByZXRWYWx1ZTsKKworCX0gLy8gZ2V0RGF0YUZpbGVzCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gSVNPLTMxNjYtYWxwaGEzIGNvdW50cnkgY29kZQorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ291bnRyeUNvZGUgaW1wbGVtZW50cyBDb21wYXJhYmxlPENvdW50cnlDb2RlPiB7CisJCXByaXZhdGUgU3RyaW5nIGNvZGUgPSBudWxsOworCisJCS8qKgorCQkgKiBAcGFyYW0gY29kZQorCQkgKi8KKwkJcHVibGljIENvdW50cnlDb2RlKFN0cmluZyBjb2RlKSB7CisJCQl0aGlzLmNvZGUgPSBjb2RlOworCQl9CisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIGNvZGUKKwkJICovCisJCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q29kZSgpIHsKKwkJCXJldHVybiBjb2RlOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJCXJldHVybiBjb2RlLmhhc2hDb2RlKCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCQlpZiAodGhpcyA9PSBvYmopCisJCQkJcmV0dXJuIHRydWU7CisJCQlpZiAob2JqID09IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJZmluYWwgQ291bnRyeUNvZGUgb3RoZXIgPSAoQ291bnRyeUNvZGUpIG9iajsKKwkJCWlmIChjb2RlID09IG51bGwpIHsKKwkJCQlpZiAob3RoZXIuY29kZSAhPSBudWxsKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IGVsc2UgaWYgKCFjb2RlLmVxdWFscyhvdGhlci5jb2RlKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gY29kZTsKKwkJfQorCisJCS8qKgorCQkgKiBAcGFyYW0gbworCQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiBzdHJpbmcgY29tcGFyZVRvCisJCSAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUjY29tcGFyZVRvKGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhDb3VudHJ5Q29kZSBvKSB7CisJCQlyZXR1cm4gdGhpcy5jb2RlLmNvbXBhcmVUbyhvLmNvZGUpOworCQl9CisKKwl9IC8vIENvdW50cnlDb2RlCisKK30gLy8gQ291bnRyeURpcmVjdG9yeVV0aWxpdGllcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvQ291bnRyeUdyYXBoQ3JlYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvQ291bnRyeUdyYXBoQ3JlYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZGE4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9Db3VudHJ5R3JhcGhDcmVhdG9yLmphdmEKQEAgLTAsMCArMSwxOTQzIEBACisvLyBDb3VudHJ5R3JhcGhDcmVhdG9yLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5VdGlsaXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLlNwYXRpYWxQcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLmltcGwuQXJlYUxhYmVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5pbXBsLlBvcHVsYXRpb25MYWJlbEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5Ob2Rlc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5SZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5pbXBsLlJlZ2lvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLkNvdW50cnlEaXJlY3RvcnlVdGlsaXRpZXMuQ291bnRyeUNvZGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBnZW5lcmF0ZXMgdGhlIHBsdWdnZWQgaW4gR3JhcGggZmlsZXMgZm9yIFNURU0gZnJvbSB0aGUgYmFzaWMKKyAqIHByb3BlcnRpZXMgZmlsZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBDb3VudHJ5R3JhcGhDcmVhdG9yIHsKKworCS8qKgorCSAqIFRoZSBkaXJlY3RvcnkgaW4gdGhlIHBsdWdpbiB0aGF0IGlzIHRoZSByb290IG9mIGFsbCByZXNvdXJjZXMgKGkuZS4KKwkgKiBmaWxlcywgZGF0YSwgZXRjLikKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRVNfRElSID0gInJlc291cmNlcyI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSByb290IGRpcmVjdG9yeSBjb250YWluaW5nIGRhdGEgZm9yIHRoZQorCSAqIGRlZmluaXRpb25zIG9mIGdyYXBocy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0RJUiA9ICJkYXRhIjsKKworCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdW5kZXIge0BsaW5rICNEQVRBX0RJUn0gdGhhdCBjb250YWlucyAiY291bnRyeSIKKwkgKiBzdWItZGlyZWN0b3JpZXMgbmFtZWQgYnkgdGhlaXIgSVNPMzAxNjYtMSBhbHBoYTMgY29kZXMuIFRoZSBjb3VudHJ5CisJICogZGlyZWN0b3JpZXMgY29udGFpbiB0aGUgcHJvcGVydHkgZmlsZXMgdGhhdCBkZWZpbmUgdGhlIGRldGFpbHMgZm9yIGVhY2gKKwkgKiBjb3VudHJ5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPVU5UUllfRElSID0gImNvdW50cnkiOworCisJLyoqCisJICogVGhlIHJvb3QgZGlyZWN0b3J5IGZvciBnZW5lcmF0ZWQgZmlsZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9PVVRQVVRfRElSID0gInRlbXAiOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHVuZGVyIHRoZSB7QGxpbmsgI1JPT1RfT1VUUFVUX0RJUn0gdGhhdAorCSAqIGNvbnRhaW5zIHRoZSBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gdGhlIGdyYXBocyB0aGF0IGRlZmluZSB0aGUKKwkgKiBnZW9ncmFwaGllcyBhbmQgZmVhdHVyZXMgb2YgY291bnRyaWVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX09VVFBVVF9ESVIgPSAiZ3JhcGhzIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHBhdGggdG8gdGhlIGNvdW50cnkgZ3JhcGhzIGRpcmVjdG9yeQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPVU5UUllfR1JBUEhfUEFUSCA9IFJPT1RfT1VUUFVUX0RJUgorCQkJKyBGaWxlLnNlcGFyYXRvciArIEdSQVBIX09VVFBVVF9ESVIgKyBGaWxlLnNlcGFyYXRvciArIENPVU5UUllfRElSOworCisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIFNURU0gY2F0ZWdvcnkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVNID0gIlNURU0iOworCisJLyoqCisJICogCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VPR1JBUEhZID0gIkdlb2dyYXBoeSI7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT0xJVElDQUwgPSAiUG9saXRpY2FsIjsKKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPVU5UUklFUyA9ICJDb3VudHJpZXMiOworCisJLyoqCisJICogCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUwgPSAiTGV2ZWwiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0dFT0dSQVBIWV9QTFVHSU4gPSAib3JnLmVjbGlwc2Uuc3RlbS4iCisJCQkrIEdFT0dSQVBIWS50b0xvd2VyQ2FzZSgpOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgcHJlZml4IG9mIHRoZSBwbGF0Zm9ybSBVUkkgZm9yIGdlb2dyYXBoeSBncmFwaHMgYW5kIG1vZGVscworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFT0dSQVBIWV9GSUxFX1VSSV9QUkVGSVggPSAicGxhdGZvcm06L3BsdWdpbi8iCisJCQkrIElEX0dFT0dSQVBIWV9QTFVHSU4gKyAiL3Jlc291cmNlcy9kYXRhIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGZvcm1hdCBzdHJpbmcgZm9yIHRoZSBpZGVudGlmaWVyIG9mIGEgY291bnRyeSBncmFwaCBvciBtb2RlbAorCSAqIGZpbGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElGSUVSX0ZPUk1BVCA9ICJ7MH0vIiArIENPVU5UUllfRElSCisJCQkrICIvezF9L3syfS57M30iOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgaWQgb2YgdGhlIHRvcC1sZXZlbCBTVEVNIGNhdGVnb3J5IGZvciBncmFwaHMKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfU1RFTV9HUkFQSF9DQVRFR09SWSA9IENvbnN0YW50cy5JRF9ST09UCisJCQkrICIuY29yZS5ncmFwaCI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBpZCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50IGV4dGVuZGVkIGJ5IGdyYXBocyB0aGF0IGFyZSBwbHVnZ2VkCisJICogaW50byBTVEVNCisJICovCisJLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0dSQVBIX0VYVEVOU0lPTl9QT0lOVCA9IENvbnN0YW50cy5JRF9ST09UCisJLy8gKyAiLmNvcmUuZ3JhcGgiOworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGlkIG9mIHRoZSBleHRlbnNpb24gcG9pbnQgZXh0ZW5kZWQgYnkgZ3JhcGhzIHdpdGggZ2VvZ3JhcGhpYworCSAqIGluZm9ybWF0aW9uIHRoYXQgYXJlIHBsdWdnZWQgaW50byBTVEVNCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0dSQVBIX0dFT0dSQVBIWV9DQVRFR09SWSA9IElEX1NURU1fR1JBUEhfQ0FURUdPUlkKKwkJCSsgIi4iICsgR0VPR1JBUEhZLnRvTG93ZXJDYXNlKCk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBpZCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50IGV4dGVuZGVkIGJ5IGdyYXBocyB3aXRoIGdlb2dyYXBoaWMKKwkgKiBwb2xpdGljYWwgaW5mb3JtYXRpb24gdGhhdCBhcmUgcGx1Z2dlZCBpbnRvIFNURU0KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfR1JBUEhfUE9MSVRJQ0FMX0NBVEVHT1JZID0gSURfR1JBUEhfR0VPR1JBUEhZX0NBVEVHT1JZCisJCQkrICIuIiArIFBPTElUSUNBTC50b0xvd2VyQ2FzZSgpOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgaWQgb2YgdGhlIGV4dGVuc2lvbiBwb2ludCBleHRlbmRlZCBieSBncmFwaHMgd2l0aCBnZW9ncmFwaGljCisJICogcG9saXRpY2FsIGluZm9ybWF0aW9uIHRoYXQgYXJlIHBsdWdnZWQgaW50byBTVEVNCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0dSQVBIX0NPVU5UUklFU19DQVRFR09SWSA9IElEX0dSQVBIX1BPTElUSUNBTF9DQVRFR09SWQorCQkJKyAiLiIgKyBDT1VOVFJJRVMudG9Mb3dlckNhc2UoKTsKKworCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgdGhlIGdlbmVyYXRlZCBleHRlbnNpb24gcG9pbnRzIGFyZSB3cml0dGVuIHRvCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfRVhURU5TSU9OX1BPSU5UX0ZJTEVfTkFNRSA9ICJleHRlbnNpb24ueG1sIjsKKworCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgdGhlIGdlbmVyYXRlZCBwcm9wZXJ0aWVzIGFyZSB3cml0dGVuIHRvCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfUExVR0lOX1BST1BFUlRJRVNfUE9JTlRfRklMRV9OQU1FID0gInBsdWdpbi5wcm9wZXJ0aWVzIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG9wZW5pbmcgeG1sIGVsZW1lbnQgZm9yIGEgZ3JhcGggZXh0ZW5zaW9uIHBvaW50IGluIGEKKwkgKiBwbHVnaW4ueG1sIGZpbGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRVhURU5TSU9OX1BPSU5UX09QRU4gPSAiPGV4dGVuc2lvbiBwb2ludD1cInswfVwiPiI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjbG9zaW5nIHhtbCBlbGVtZW50IGZvciBhIGdyYXBoIGV4dGVuc2lvbiBwb2ludCBpbiBhCisJICogcGx1Z2luLnhtbCBmaWxlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VYVEVOU0lPTl9QT0lOVF9DTE9TRSA9ICI8L2V4dGVuc2lvbj4iOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgb3BlbmluZyB4bWwgZWxlbWVudCBmb3IgYSBjYXRlZ29yeSBpbiBhIHBsdWdpbi54bWwgZmlsZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DQVRFR09SWV9FTEVNRU5UX09QRU4gPSAiPGNhdGVnb3J5IGlkPVwiezB9XCIgbmFtZT1cInsxfVwiIHBhcmVudF9pZD1cInsyfVwiLz4iOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgb3BlbmluZyB4bWwgZWxlbWVudCBmb3IgYSBjYXRlZ29yeSBpbiBhIHBsdWdpbi54bWwgZmlsZQorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRFVCTElOX0NPUkVfRUxFTUVOVF9PUEVOID0gIjxkdWJsaW5fY29yZSBjYXRlZ29yeV9pZD1cInswfVwiICI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkxTX0RFTElNSVRFUiA9ICJfIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGZvcm1hdCBvZiB0aGUgZ2VuZXJhdGVkIE5MUyBrZXlzIGZvciBjYXRlZ29yaWVzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5MU19DQVRFR09SWV9LRVlfRk9STUFUID0gIl9VSV97MH1fZ3JhcGhfY2F0ZWdvcnkiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5MU19EQ19GRUFUVVJFX0tFWV9GT1JNQVQgPSAiX1VJIgorCQkJKyBOTFNfREVMSU1JVEVSICsgInswfSIgKyBOTFNfREVMSU1JVEVSICsgInsxfSIgKyBOTFNfREVMSU1JVEVSCisJCQkrICJ7Mn0iICsgTkxTX0RFTElNSVRFUiArICJ7M30iICsgTkxTX0RFTElNSVRFUiArICJ7NH0iOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRUxpc3QgZGNGZWF0dXJlcyA9IENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRFVCTElOX0NPUkUKKwkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCk7CisKKwkvKioKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGZpbmFsIFN0cmluZ1tdIGFyZ3MpIHsKKworCQkvLyBOb3cgY3JlYXRlIHRoZSBncmFwaHMKKwkJZmluYWwgTGlzdDxDb3VudHJ5Q29kZT4gY291bnRyeUNvZGVzID0gQ291bnRyeURpcmVjdG9yeVV0aWxpdGllcworCQkJCS5nZXRBbGxDb3VudHJ5Q29kZXMoKTsKKwkJQ29sbGVjdGlvbnMuc29ydChjb3VudHJ5Q29kZXMpOworCisJCWZpbmFsIENvdW50cnlHcmFwaENyZWF0b3IgY2djID0gbmV3IENvdW50cnlHcmFwaENyZWF0b3IoKTsKKworCQlmaW5hbCBNYXA8Q291bnRyeUNvZGUsIExpc3Q8R3JhcGhSZWNvcmQ+PiBub2RlR3JhcGhzID0gY2djCisJCQkJLmNyZWF0ZUdyYXBoUmVjb3JkcyhHRU9HUkFQSFlfRklMRV9VUklfUFJFRklYLCBjb3VudHJ5Q29kZXMsCisJCQkJCQlEYXRhVHlwZS5ub2RlKTsKKworCQlmaW5hbCBNYXA8Q291bnRyeUNvZGUsIExpc3Q8R3JhcGhSZWNvcmQ+PiBwb3B1bGF0aW9uR3JhcGhzID0gY2djCisJCQkJLmNyZWF0ZUdyYXBoUmVjb3JkcyhHRU9HUkFQSFlfRklMRV9VUklfUFJFRklYLCBjb3VudHJ5Q29kZXMsCisJCQkJCQlEYXRhVHlwZS5wb3B1bGF0aW9uKTsKKworCQlmaW5hbCBNYXA8Q291bnRyeUNvZGUsIExpc3Q8R3JhcGhSZWNvcmQ+PiBhcmVhR3JhcGhzID0gY2djCisJCQkJLmNyZWF0ZUdyYXBoUmVjb3JkcyhHRU9HUkFQSFlfRklMRV9VUklfUFJFRklYLCBjb3VudHJ5Q29kZXMsCisJCQkJCQlEYXRhVHlwZS5hcmVhKTsKKwkJdHJ5IHsKKwkJCWNnYy5zZXJpYWxpemVDb3VudHJ5R3JhcGhzKG5vZGVHcmFwaHMsIENPVU5UUllfR1JBUEhfUEFUSCk7CisKKwkJCWNnYy5zZXJpYWxpemVDb3VudHJ5R3JhcGhzKHBvcHVsYXRpb25HcmFwaHMsIENPVU5UUllfR1JBUEhfUEFUSCk7CisKKwkJCWNnYy5zZXJpYWxpemVDb3VudHJ5R3JhcGhzKGFyZWFHcmFwaHMsIENPVU5UUllfR1JBUEhfUEFUSCk7CisKKwkJCWZpbmFsIExpc3Q8TWFwPENvdW50cnlDb2RlLCBMaXN0PEdyYXBoUmVjb3JkPj4+IGdyYXBoUmVjb3JkcyA9IG5ldyBBcnJheUxpc3Q8TWFwPENvdW50cnlDb2RlLCBMaXN0PEdyYXBoUmVjb3JkPj4+KCk7CisJCQlncmFwaFJlY29yZHMuYWRkKG5vZGVHcmFwaHMpOworCQkJZ3JhcGhSZWNvcmRzLmFkZChwb3B1bGF0aW9uR3JhcGhzKTsKKwkJCWdyYXBoUmVjb3Jkcy5hZGQoYXJlYUdyYXBocyk7CisKKwkJCWludCBtYXhBZG1pbkxldmVsID0gMDsKKwkJCW1heEFkbWluTGV2ZWwgPSBNYXRoLm1heChtYXhBZG1pbkxldmVsLAorCQkJCQlnZXRNYXhBZG1pbkxldmVsKG5vZGVHcmFwaHMpKTsKKwkJCW1heEFkbWluTGV2ZWwgPSBNYXRoLm1heChtYXhBZG1pbkxldmVsLAorCQkJCQlnZXRNYXhBZG1pbkxldmVsKHBvcHVsYXRpb25HcmFwaHMpKTsKKwkJCW1heEFkbWluTGV2ZWwgPSBNYXRoLm1heChtYXhBZG1pbkxldmVsLAorCQkJCQlnZXRNYXhBZG1pbkxldmVsKGFyZWFHcmFwaHMpKTsKKworCQkJZmluYWwgRmlsZSBncmFwaEV4dGVuc2lvbkZpbGUgPSBuZXcgRmlsZShDT1VOVFJZX0dSQVBIX1BBVEgKKwkJCQkJKyBHUkFQSF9FWFRFTlNJT05fUE9JTlRfRklMRV9OQU1FKTsKKwkJCWZpbmFsIEZpbGUgZ3JhcGhQbHVnaW5Qcm9wZXJ0aWVzRmlsZSA9IG5ldyBGaWxlKENPVU5UUllfR1JBUEhfUEFUSAorCQkJCQkrIEdSQVBIX1BMVUdJTl9QUk9QRVJUSUVTX1BPSU5UX0ZJTEVfTkFNRSk7CisKKwkJCWZpbmFsIEJ1ZmZlcmVkV3JpdGVyIGdyYXBoT3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKAorCQkJCQlncmFwaEV4dGVuc2lvbkZpbGUpKTsKKworCQkJZmluYWwgQnVmZmVyZWRXcml0ZXIgcGx1Z2luT3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKAorCQkJCQlncmFwaFBsdWdpblByb3BlcnRpZXNGaWxlKSk7CisKKwkJCS8vIENyZWF0ZSBhIHNuaXBwZXQgb2YgeG1sIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIGEgcGx1Z2luLnhtbCBmaWxlCisJCQkvLyB0byBwbHVnIGludG8gU1RFTSB0aGUgZ3JhcGhzIHdlIGp1c3Qgc2VyaWFsaXplZC4KKwkJCWNnYy5nZW5lcmF0ZUdyYXBoRXh0ZW5zaW9uUG9pbnRYTUwoZ3JhcGhSZWNvcmRzLCBjb3VudHJ5Q29kZXMsCisJCQkJCW1heEFkbWluTGV2ZWwsIGdyYXBoT3V0LCBwbHVnaW5PdXQpOworCQl9IC8vIHRyeQorCQljYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCisJCS8qCisJCSAqIAorCQkgKiBNYXA8U3RyaW5nLCBMaXN0PE1hcDxTdHJpbmcsIEdyYXBoPj4+IGNvdW50cnlHcmFwaHMgPSBuZXcKKwkJICogSGFzaE1hcDxTdHJpbmcsIExpc3Q8TWFwPFN0cmluZywgR3JhcGg+Pj4oKTsgTGlzdDxTdHJpbmc+IGdyYXBoVHlwZXMKKwkJICogPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJICogCisJCSAqIGZpbmFsIENvdW50cnlHcmFwaENyZWF0b3IgY2djID0gbmV3IENvdW50cnlHcmFwaENyZWF0b3IoKTsKKwkJICogCisJCSAqIGZpbmFsIExpc3Q8TWFwPFN0cmluZywgR3JhcGg+PiBjb3VudHJ5Tm9kZUdyYXBoID0gY2djCisJCSAqIC5jcmVhdGVDb3VudHJ5Tm9kZUdyYXBocyhNSU5fQURNSU5fTEVWRUwsIE1BWF9BRE1JTl9MRVZFTCwKKwkJICogR0VPR1JBUEhZX0ZJTEVfVVJJX1BSRUZJWCArICIvZ3JhcGhzIiwgY291bnRyeUNvZGVzKTsgZmluYWwKKwkJICogTGlzdDxNYXA8U3RyaW5nLCBHcmFwaFJlY29yZD4+IGNvdW50cnlBcmVhR3JhcGhSZWNvcmQgPSBjZ2MKKwkJICogLmNyZWF0ZUNvdW50cnlBcmVhR3JhcGhzKE1JTl9BRE1JTl9MRVZFTCwgTUFYX0FETUlOX0xFVkVMLAorCQkgKiBHRU9HUkFQSFlfRklMRV9VUklfUFJFRklYICsgIi9ncmFwaHMiLCBjb3VudHJ5Q29kZXMpOworCQkgKiAKKwkJICogZmluYWwgTWFwPFN0cmluZywgTGlzdDxNYXA8U3RyaW5nLCBHcmFwaFJlY29yZD4+PgorCQkgKiBjb3VudHJ5UG9wdWxhdGlvbkdyYXBocyA9IGNnYworCQkgKiAuY3JlYXRlQ291bnRyeVBvcHVsYXRpb25HcmFwaHMoTUlOX0FETUlOX0xFVkVMLCBNQVhfQURNSU5fTEVWRUwsCisJCSAqIEdFT0dSQVBIWV9GSUxFX1VSSV9QUkVGSVggKyAiL2dyYXBocyIsIGNvdW50cnlDb2Rlcyk7CisJCSAqIAorCQkgKiBjZ2Muc2VyaWFsaXplQ291bnRyeUdyYXBocyhjb3VudHJ5Tm9kZUdyYXBoLCBDT1VOVFJZX0dSQVBIX1BBVEgsCisJCSAqIENPVU5UUllfTk9ERV9HUkFQSCk7CisJCSAqIAorCQkgKiBjZ2Muc2VyaWFsaXplQ291bnRyeUdyYXBocyhjb3VudHJ5QXJlYUdyYXBoUmVjb3JkLAorCQkgKiBDT1VOVFJZX0dSQVBIX1BBVEgsIENPVU5UUllfQVJFQV9HUkFQSCk7CisJCSAqIAorCQkgKiBmb3IgKFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmVyIDogY291bnRyeVBvcHVsYXRpb25HcmFwaHMua2V5U2V0KCkpIHsKKwkJICogZmluYWwgTGlzdDxNYXA8U3RyaW5nLCBHcmFwaFJlY29yZD4+IHBvcHVsYXRpb25HcmFwaFJlY29yZCA9CisJCSAqIGNvdW50cnlQb3B1bGF0aW9uR3JhcGhzIC5nZXQocG9wdWxhdGlvbklkZW50aWZlcik7CisJCSAqIGNnYy5zZXJpYWxpemVDb3VudHJ5R3JhcGhzKHBvcHVsYXRpb25HcmFwaFJlY29yZCwgQ09VTlRSWV9HUkFQSF9QQVRILAorCQkgKiBDT1VOVFJZX1BPUFVMQVRJT05fR1JBUEgpOyB9IC8vIGZvciBlYWNoIHBvcHVsYXRpb24KKwkJICogCisJCSAqIGNvdW50cnlHcmFwaHMucHV0KENPVU5UUllfTk9ERV9HUkFQSCwgY291bnRyeU5vZGVHcmFwaCk7CisJCSAqIGdyYXBoVHlwZXMuYWRkKENPVU5UUllfTk9ERV9HUkFQSCk7CisJCSAqIAorCQkgKiBjb3VudHJ5R3JhcGhzLnB1dChDT1VOVFJZX0FSRUFfR1JBUEgsIGNvdW50cnlBcmVhR3JhcGhSZWNvcmQpOworCQkgKiBncmFwaFR5cGVzLmFkZChDT1VOVFJZX0FSRUFfR1JBUEgpOworCQkgKiAKKwkJICogdHJ5IHsgZmluYWwgRmlsZSBncmFwaEV4dGVuc2lvbkZpbGUgPSBuZXcgRmlsZShDT1VOVFJZX0dSQVBIX1BBVEggKworCQkgKiBHUkFQSF9FWFRFTlNJT05fUE9JTlRfRklMRV9OQU1FKTsgZmluYWwgRmlsZQorCQkgKiBncmFwaFBsdWdpblByb3BlcnRpZXNGaWxlID0gbmV3IEZpbGUoQ09VTlRSWV9HUkFQSF9QQVRIICsKKwkJICogR1JBUEhfUExVR0lOX1BST1BFUlRJRVNfUE9JTlRfRklMRV9OQU1FKTsKKwkJICogCisJCSAqIGZpbmFsIEJ1ZmZlcmVkV3JpdGVyIGdyYXBoT3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKAorCQkgKiBncmFwaEV4dGVuc2lvbkZpbGUpKTsKKwkJICogCisJCSAqIGZpbmFsIEJ1ZmZlcmVkV3JpdGVyIHBsdWdpbk91dCA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcigKKwkJICogZ3JhcGhQbHVnaW5Qcm9wZXJ0aWVzRmlsZSkpOyAvLyBDcmVhdGUgYSBzbmlwcGV0IG9mIHhtbCB0aGF0IGNhbiBiZQorCQkgKiBpbmNsdWRlZCBpbiBhIHBsdWdpbi54bWwgZmlsZSAvLyB0byBwbHVnIHRoZSBncmFwaHMgd2UganVzdAorCQkgKiBzZXJpYWxpemVkIGludG8gU1RFTS4KKwkJICogY2djLmdlbmVyYXRlR3JhcGhFeHRlbnNpb25Qb2ludFhNTChjb3VudHJ5R3JhcGhzLCBncmFwaFR5cGVzLAorCQkgKiBncmFwaE91dCwgcGx1Z2luT3V0KTsgfSAvLyB0cnkgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJICogZS5wcmludFN0YWNrVHJhY2UoKTsgfQorCQkgKi8KKwl9IC8vIG1haW4KKworCS8qKgorCSAqIEBwYXJhbSBub2RlR3JhcGhzICoKKwkgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIGFkbWluaXN0cmF0aW9uIGxldmVsIGZvdW5kCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF4QWRtaW5MZXZlbCgKKwkJCWZpbmFsIE1hcDxDb3VudHJ5Q29kZSwgTGlzdDxHcmFwaFJlY29yZD4+IG5vZGVHcmFwaHMpIHsKKwkJaW50IG1heEFkbWluTGV2ZWwgPSAwOworCQlmb3IgKGZpbmFsIExpc3Q8R3JhcGhSZWNvcmQ+IGxpc3QgOiBub2RlR3JhcGhzLnZhbHVlcygpKSB7CisJCQltYXhBZG1pbkxldmVsID0gTWF0aC5tYXgobWF4QWRtaW5MZXZlbCwgZ2V0TWF4QWRtaW5MZXZlbChsaXN0KSk7CisJCX0gLy8gZm9yCisJCXJldHVybiBtYXhBZG1pbkxldmVsOworCX0gLy8gZ2V0TWF4QWRtaW5MZXZlbAorCisJLyoqCisJICogQHBhcmFtIGdyYXBoUmVjb3JkcworCSAqIEByZXR1cm4gdGhlIG1heGltdW0gYWRtaW5pc3RyYXRpb24gbGV2ZWwgZm91bmQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBnZXRNYXhBZG1pbkxldmVsKGZpbmFsIExpc3Q8R3JhcGhSZWNvcmQ+IGdyYXBoUmVjb3JkcykgeworCQlpbnQgbWF4QWRtaW5MZXZlbCA9IDA7CisJCWZvciAoZmluYWwgR3JhcGhSZWNvcmQgZ3JhcGhSZWNvcmQgOiBncmFwaFJlY29yZHMpIHsKKwkJCW1heEFkbWluTGV2ZWwgPSBNYXRoCisJCQkJCS5tYXgobWF4QWRtaW5MZXZlbCwgZ3JhcGhSZWNvcmQuZ2V0QWRtaW5MZXZlbCgpKTsKKwkJfQorCQlyZXR1cm4gbWF4QWRtaW5MZXZlbDsKKwl9IC8vIGdldE1heEFkbWluTGV2ZWwKKworCS8qKgorCSAqIEBwYXJhbSB1cmlQYXRoU3RyaW5nCisJICogICAgICAgICAgICB0aGUgcGF0aCB0byB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gc2VyaWFsaXplIHRoZSBncmFwaHMgaW4KKwkgKiBAcGFyYW0gY291bnRyeUdyYXBocworCSAqICAgICAgICAgICAgYSBtYXAgb2YgbGlzdHMgb2YgdGhlIGdyYXBoIHJlY29yZHMga2V5ZWQgYnkgY291bnRyeSBjb2RlCisJICogQHBhcmFtIGdyYXBoRGF0YVR5cGUKKwkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGRhdGEgaW4gdGhlIGdyYXBocyBjb250YWluZWQgaW4gdGhlIGdyYXBoIHJlY29yZHMKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZUNvdW50cnlHcmFwaHMoCisJCQlmaW5hbCBNYXA8Q291bnRyeUNvZGUsIExpc3Q8R3JhcGhSZWNvcmQ+PiBncmFwaHMsCisJCQlmaW5hbCBTdHJpbmcgdXJpUGF0aFN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlmb3IgKGZpbmFsIENvdW50cnlDb2RlIGNvdW50cnlDb2RlIDogZ3JhcGhzLmtleVNldCgpKSB7CisJCQlmb3IgKGZpbmFsIEdyYXBoUmVjb3JkIGdyYXBoUmVjb3JkIDogZ3JhcGhzLmdldChjb3VudHJ5Q29kZSkpIHsKKwkJCQlncmFwaFJlY29yZC5zZXJpYWxpemUodXJpUGF0aFN0cmluZyk7CisJCQl9IC8vIGZvciBlYWNoIGdyYXBoIHJlY29yZCBmb3IgZWFjaCBjb3VudHJ5CisJCX0gLy8gZm9yIGVhY2ggY291bnRyeSBjb2RlCisKKwkJLy8gZm9yIChMaXN0PEdyYXBoUmVjb3JkPiByZWNvcmRzOiBncmFwaHMudmFsdWVzKCkpIHsKKwkJLy8gUmVjb3JkLnNlcmlhbGl6ZVJlY29yZHMoKExpc3Q8UmVjb3JkPilyZWNvcmRzLCB1cmlQYXRoU3RyaW5nKTsKKwkJLy8gfQorCX0gLy8gc2VyaWFsaXplQ291bnRyeUdyYXBocworCisJLyoqCisJICogQHBhcmFtIGNvdW50cnlOb2RlR3JhcGhzCisJICogICAgICAgICAgICBhIGxpc3Qgb2YgbWFwcyBvZiBncmFwaHMgb2Ygbm9kZXMgZm9yIGNvdW50cmllcyBmb3IgZWFjaAorCSAqICAgICAgICAgICAgYWRtaW5zdHJhdGlvbiBsZXZlbAorCSAqIEBwYXJhbSBncmFwaE91dAorCSAqICAgICAgICAgICAgdGhlIG91dHB1dCB3cml0ZXIgZm9yIHRoZSBwbHVnaW4ueG1sIGZpbGUgY29udGVudHMKKwkgKiBAcGFyYW0gcGx1Z2luT3V0CisJICogICAgICAgICAgICB0aGUgb3V0cHV0IHdyaXRlciBmb3IgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGVudHMKKwkgKi8KKwlwcml2YXRlIHZvaWQgZ2VuZXJhdGVHcmFwaEV4dGVuc2lvblBvaW50WE1MKAorCQkJZmluYWwgTGlzdDxNYXA8Q291bnRyeUNvZGUsIExpc3Q8R3JhcGhSZWNvcmQ+Pj4gZ3JhcGhSZWNvcmRzLAorCQkJZmluYWwgTGlzdDxDb3VudHJ5Q29kZT4gY291bnRyeUNvZGVzLCBmaW5hbCBpbnQgbWF4QWRtaW5MZXZlbCwKKwkJCWZpbmFsIFdyaXRlciBncmFwaE91dCwgZmluYWwgV3JpdGVyIHBsdWdpbk91dCkgeworCisJCS8vIFRoZSBkdWJsaW4gY29yZSBpbnN0YW5jZXMgb2YgdGhlIGdyYXBocyBsaWtlbHkgc2hhcmUgY29tbW9uCisJCS8vIGF0dHJpYnV0ZXMsIHdlIGNhbiBhdm9pZCBkdXBsaWNhdGUgZW50cmllcyBpbiB0aGUgZmlsZXMgd2UgZ2VuZXJhdGUKKwkJLy8gYnkgZmluZGluZyB0aGUgZHVwbGljYXRlIGVudHJpZXMgYW5kIG9ubHkgZ2VuZXJhdGluZyBhIHNpbmdsZSBrZXkgZm9yCisJCS8vIHRoZSBnZW5lcmF0ZWQgcGx1Z2lucyBmaWxlIGNvbnRlbnQuCisJCWZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gZGNWYWx1ZUtleU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisJCS8vIFdlIGFsc28gZG9uJ3Qgd2FudCB0byBnZW5lcmF0ZSBkdXBsaWNhdGUgY291bnRyeSBjYXRlZ29yaWVzCisJCWZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gY291bnRyeUNhdGVnb3JpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworCQl0cnkgeworCQkJZ3JhcGhPdXQud3JpdGUoIjwhLS0gR2VuZXJhdGVkIGNvbnRlbnQuICBEbyBub3QgbW9kaWZ5IC0tPlxuIik7CisKKwkJCWdyYXBoT3V0LndyaXRlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFhNTF9FWFRFTlNJT05fUE9JTlRfT1BFTiwKKwkJCQkJbmV3IE9iamVjdFtdIHsgQ29uc3RhbnRzLklEX0dSQVBIX0VYVEVOU0lPTl9QT0lOVCB9KSk7CisJCQlncmFwaE91dC53cml0ZSgiXG4iKTsKKworCQkJcGx1Z2luT3V0CisJCQkJCS53cml0ZSgiI0dyYXBoIE5MUyBLZXlzLiAgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQsIGRvIG5vdCBtb2RpZnkuICIKKwkJCQkJCQkrIENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpCisJCQkJCQkJKyAiICIKKwkJCQkJCQkrIFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5uYW1lIikgKyAiXG4iKTsKKworCQkJLy8gT3V0cHV0IHRoZSBjYXRlZ29yaWVzIHRoYXQgbWFrZSB1cCB0aGUgaGllcmFyY2h5IGZvciB0aGUgZ3JhcGgKKwkJCS8vIHBsdWdpbnMgKGFsbCBleGNlcHQgZm9yIHRoZSBjb3VudHJ5IGNhdGVnb3JpZXMgd2hpY2ggd2Ugb3V0cHV0CisJCQkvLyBiZWxvdykKKwkJCWZpbmFsIFN0cmluZ1tdIGxldmVsQ2F0ZWdvcnlJZCA9IG91dHB1dENhdGVnb3JpZXMoCisJCQkJCW1heEFkbWluTGV2ZWwgKyAxLCBncmFwaE91dCwgcGx1Z2luT3V0KTsKKworCQkJZm9yIChmaW5hbCBDb3VudHJ5Q29kZSBjb3VudHJ5Q29kZSA6IGNvdW50cnlDb2RlcykgeworCQkJCWZvciAoZmluYWwgTWFwPENvdW50cnlDb2RlLCBMaXN0PEdyYXBoUmVjb3JkPj4gZ3JhcGhSZWNvcmRNYXAgOiBncmFwaFJlY29yZHMpIHsKKwkJCQkJZm9yIChmaW5hbCBHcmFwaFJlY29yZCBncmFwaFJlY29yZCA6IGdyYXBoUmVjb3JkTWFwCisJCQkJCQkJLmdldChjb3VudHJ5Q29kZSkpIHsKKwkJCQkJCS8vIAorCQkJCQkJb3V0cHV0R3JhcGhSZWNvcmQoZ3JhcGhSZWNvcmQsIGRjVmFsdWVLZXlNYXAsCisJCQkJCQkJCWNvdW50cnlDYXRlZ29yaWVzLCBsZXZlbENhdGVnb3J5SWQsIGdyYXBoT3V0LAorCQkJCQkJCQlwbHVnaW5PdXQpOworCQkJCQl9CisJCQkJfSAvLyBmb3IgZWFjaCB0eXBlIG9mIGdyYXBoIFJlY29yZAorCQkJfSAvLyBmb3IgZWFjaCBjb3VudHJ5IGNvZGUKKworCQkJZ3JhcGhPdXQud3JpdGUoWE1MX0VYVEVOU0lPTl9QT0lOVF9DTE9TRSk7CisJCQlncmFwaE91dC5jbG9zZSgpOworCQkJcGx1Z2luT3V0LmNsb3NlKCk7CisJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKworCX0vLyBnZW5lcmF0ZUdyYXBoRXh0ZW5zaW9uUG9pbnRYTUwKKworCS8qKgorCSAqIEBwYXJhbSBncmFwaFJlY29yZAorCSAqIEBwYXJhbSBkY1ZhbHVlS2V5TWFwCisJICogQHBhcmFtIGNvdW50cnlDYXRlZ29yaWVzCisJICogQHBhcmFtIGxldmVsQ2F0ZWdvcnlJZAorCSAqIEBwYXJhbSBncmFwaE91dAorCSAqIEBwYXJhbSBwbHVnaW5PdXQKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIG91dHB1dEdyYXBoUmVjb3JkKGZpbmFsIEdyYXBoUmVjb3JkIGdyYXBoUmVjb3JkLAorCQkJZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBkY1ZhbHVlS2V5TWFwLAorCQkJZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBjb3VudHJ5Q2F0ZWdvcmllcywKKwkJCWZpbmFsIFN0cmluZ1tdIGxldmVsQ2F0ZWdvcnlJZCwgZmluYWwgV3JpdGVyIGdyYXBoT3V0LAorCQkJZmluYWwgV3JpdGVyIHBsdWdpbk91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLy8gTWFrZSBldmVyeXRoaW5nIGNvbWUgb3V0IGluIGFscGhhYmV0aWNhbCBvcmRlcgorCisJCWZpbmFsIFN0cmluZyBjb3VudHJ5Q29kZVN0cmluZyA9IGdyYXBoUmVjb3JkLmdldElkKCkudG9Mb3dlckNhc2UoKTsKKwkJZmluYWwgU3RyaW5nIGNvdW50cnlDYXRlZ29yeUlkID0gbGV2ZWxDYXRlZ29yeUlkW2dyYXBoUmVjb3JkCisJCQkJLmdldEFkbWluTGV2ZWwoKV0KKwkJCQkrICIuIiArIGNvdW50cnlDb2RlU3RyaW5nOworCisJCS8vIEhhdmUgd2Ugc2VlbiB0aGlzIGNvdW50cnkgY2F0ZWdvcnkgaWQgYmVmb3JlPworCQlpZiAoY291bnRyeUNhdGVnb3JpZXMuZ2V0KGNvdW50cnlDYXRlZ29yeUlkKSA9PSBudWxsKSB7CisJCQkvLyBObworCQkJLy8gQ3JlYXRlIGEgY2F0ZWdvcnkgZm9yIHRoZSBjb3VudHJ5CisJCQlncmFwaE91dC53cml0ZShNZXNzYWdlRm9ybWF0LmZvcm1hdChYTUxfQ0FURUdPUllfRUxFTUVOVF9PUEVOLAorCQkJCQluZXcgT2JqZWN0W10geyBjb3VudHJ5Q2F0ZWdvcnlJZCwgZ3JhcGhSZWNvcmQuZ2V0SWQoKSwKKwkJCQkJCQlsZXZlbENhdGVnb3J5SWRbZ3JhcGhSZWNvcmQuZ2V0QWRtaW5MZXZlbCgpXSB9KSk7CisJCQlncmFwaE91dC53cml0ZSgiXG4iKTsKKwkJCS8vIC4uLmFuZCByZW1lbWJlciB3ZSBkaWQgc28gd2UgZG9uJ3QgZG8gaXQgYWdhaW4KKwkJCWNvdW50cnlDYXRlZ29yaWVzLnB1dChjb3VudHJ5Q2F0ZWdvcnlJZCwgY291bnRyeUNhdGVnb3J5SWQpOworCQl9IC8vIGlmIHdlIGhhdmVuJ3Qgc2VlbiB0aGlzIGNhdGVnb3J5IGlkIGJlZm9yZQorCisJCS8vIHBsdWdpbk91dC53cml0ZSgiIyBEdWJsaW4gQ29yZSBmb3IgIgorCQkvLyArIGdyYXBoUmVjb3JkLmdldENvdW50cnlDb2RlKCkudG9TdHJpbmcoKSArICJcbiIpOworCQkvLyAvLyBXZSBkb24ndCBOTFMgdGhlIElTTzMwMTY2IGFscGhhLTMgY29kZXMKKworCQlvdXRwdXREdWJsaW5Db3JlKGdyYXBoUmVjb3JkLCBjb3VudHJ5Q2F0ZWdvcnlJZCwgZGNWYWx1ZUtleU1hcCwKKwkJCQlncmFwaE91dCwgcGx1Z2luT3V0KTsKKworCX0gLy8gb3V0cHV0R3JhcGhSZWNvcmQKKworCS8qKgorCSAqIEBwYXJhbSByZWNvcmQKKwkgKiBAcGFyYW0gY291bnRyeUNhdGVnb3J5SWQKKwkgKiBAcGFyYW0gZGNWYWx1ZUtleU1hcAorCSAqIEBwYXJhbSBncmFwaE91dAorCSAqIEBwYXJhbSBwbHVnaW5PdXQKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICogCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG91dHB1dER1YmxpbkNvcmUoZmluYWwgUmVjb3JkIHJlY29yZCwKKwkJCWZpbmFsIFN0cmluZyBjb3VudHJ5Q2F0ZWdvcnlJZCwKKwkJCWZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gZGNWYWx1ZUtleU1hcCwgZmluYWwgV3JpdGVyIGdyYXBoT3V0LAorCQkJZmluYWwgV3JpdGVyIHBsdWdpbk91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gcmVjb3JkLmdldER1YmxpbkNvcmUoKTsKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCVhNTF9EVUJMSU5fQ09SRV9FTEVNRU5UX09QRU4sCisJCQkJbmV3IE9iamVjdFtdIHsgY291bnRyeUNhdGVnb3J5SWQgfSkpOworCisJCWZvciAoZmluYWwgSXRlcmF0b3IgZmVhdHVyZXNJdGVyID0gZGNGZWF0dXJlcy5pdGVyYXRvcigpOyBmZWF0dXJlc0l0ZXIKKwkJCQkuaGFzTmV4dCgpOykgeworCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGRjRmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzSXRlcgorCQkJCQkubmV4dCgpOworCQkJLy8gSXMgaXQgc2V0PworCQkJaWYgKGRjLmVJc1NldChkY0ZlYXR1cmUpKSB7CisJCQkJLy8gWWVzCisJCQkJZmluYWwgU3RyaW5nIGZlYXR1cmVWYWx1ZSA9IChTdHJpbmcpIGRjLmVHZXQoZGNGZWF0dXJlKTsKKwkJCQlzYi5hcHBlbmQoZGNGZWF0dXJlLmdldE5hbWUoKSk7CisJCQkJc2IuYXBwZW5kKCI9XCIiKTsKKwkJCQkvLyBTaG91bGQgdGhlIGR1YmxpbiBjb3JlIGF0dHJpYnV0ZSBiZSBOTFMncyBvciBub3Q/CisJCQkJaWYgKGlzRHVibGluQ29yZU5MU0ZlYXR1cmUoZGNGZWF0dXJlKSkgeworCQkJCQkvLyBZZXMKKwkJCQkJLy8gSGF2ZSB3ZSBvdXRwdXQgdGhpcyBmZWF0dXJlIHZhbHVlIGJlZm9yZT8KKwkJCQkJU3RyaW5nIGRjRmVhdHVyZUtleSA9IGRjVmFsdWVLZXlNYXAuZ2V0KGZlYXR1cmVWYWx1ZSk7CisJCQkJCWlmIChkY0ZlYXR1cmVLZXkgPT0gbnVsbCkgeworCQkJCQkJLy8gTm8KKwkJCQkJCWRjRmVhdHVyZUtleSA9IE1lc3NhZ2VGb3JtYXQKKwkJCQkJCQkJLmZvcm1hdCgKKwkJCQkJCQkJCQlOTFNfRENfRkVBVFVSRV9LRVlfRk9STUFULAorCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7CisJCQkJCQkJCQkJCQlyZWNvcmQuZ2V0SWQoKSwKKwkJCQkJCQkJCQkJCXJlY29yZAorCQkJCQkJCQkJCQkJCQkuZ2V0QWRtaW5MZXZlbHNBc1N0cmluZyhOTFNfREVMSU1JVEVSKSwKKwkJCQkJCQkJCQkJCXJlY29yZC5nZXRUeXBlKCksCisJCQkJCQkJCQkJCQlyZWNvcmQuZ2V0T3V0cHV0VHlwZSgpLAorCQkJCQkJCQkJCQkJZGNGZWF0dXJlLmdldE5hbWUoKSB9KTsKKwkJCQkJCS8vIE5vdyB3ZSBoYXZlCisJCQkJCQlkY1ZhbHVlS2V5TWFwLnB1dChmZWF0dXJlVmFsdWUsIGRjRmVhdHVyZUtleSk7CisKKwkJCQkJCXNiLmFwcGVuZCgiJSIpOworCQkJCQkJc2IuYXBwZW5kKGRjRmVhdHVyZUtleSk7CisJCQkJCQkvLyBXcml0ZSB0aGUga2V5IGFuZCB2YWx1ZSBvdXQgdG8gdGhlIHBsdWdpbnMgZmlsZQorCQkJCQkJcGx1Z2luT3V0LndyaXRlKGRjRmVhdHVyZUtleSArICIgPSAiICsgZmVhdHVyZVZhbHVlCisJCQkJCQkJCSsgIlxuIik7CisJCQkJCX0gLy8gaWYgbm90IG91dHB1dCB0aGlzIHZhbHVlIGJlZm9yZQorCQkJCQllbHNlIHsKKwkJCQkJCS8vIFllcworCQkJCQkJLy8gU28gd2UganVzdCB1c2UgdGhlIGtleSBhZ2FpbiBiZWNhdXNlIGl0J3MgYWxyZWFkeSBpbgorCQkJCQkJLy8gcHJvcGVydGllcyBmaWxlCisJCQkJCQlzYi5hcHBlbmQoZGNGZWF0dXJlS2V5KTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8vIE5vCisJCQkJCS8vIE5vIE5MUywganVzdCB1c2UgdGhlIHZhbHVlIGlubGluZSBpbiB0aGUgRHVibGluIENvcmUKKwkJCQkJLy8gZWxlbWVudAorCQkJCQlzYi5hcHBlbmQoZmVhdHVyZVZhbHVlKTsKKwkJCQl9CisJCQkJc2IuYXBwZW5kKCJcIiAiKTsKKwkJCX0gLy8gaWYgZmVhdHVyZSBzZXQKKwkJfSAvLyBmb3IgZmVhdHVyZXMKKworCQlzYi5hcHBlbmQoIi8+XG4iKTsKKwkJZmluYWwgU3RyaW5nIHJlc3VsdCA9IHNiLnRvU3RyaW5nKCk7CisKKwkJZ3JhcGhPdXQud3JpdGUocmVzdWx0KTsKKwkJZ3JhcGhPdXQud3JpdGUoIlxuIik7CisJfSAvLyBvdXRwdXREdWJsaW5Db3JlCisKKwkvKioKKwkgKiBAcGFyYW0gZGNGZWF0dXJlCisJICogICAgICAgICAgICBhIHtAbGluayBEdWJsaW5Db3JlfSBmZWF0dXJlCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBmZWF0dXJlIHNob3VsZCBiZSBOTFMncworCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEdWJsaW5Db3JlTkxTRmVhdHVyZSgKKwkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBkY0ZlYXR1cmUpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOworCisJCXN3aXRjaCAoZGNGZWF0dXJlLmdldEZlYXR1cmVJRCgpKSB7CisJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQ09OVFJJQlVUT1I6CisJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQ09WRVJBR0U6CisJCWNhc2UgQ29tbW9uUGFja2FnZS5EVUJMSU5fQ09SRV9fQ1JFQVRPUjoKKwkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19ERVNDUklQVElPTjoKKwkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19MSUNFTlNFOgorCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1BVQkxJU0hFUjoKKwkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19SRUxBVElPTjoKKwkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19SRVFVSVJFRDoKKwkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19SSUdIVFM6CisJCQkvLyBjYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1NPVVJDRToKKwkJY2FzZSBDb21tb25QYWNrYWdlLkRVQkxJTl9DT1JFX19TVUJKRUNUOgorCQljYXNlIENvbW1vblBhY2thZ2UuRFVCTElOX0NPUkVfX1RJVExFOgorCisJCQlyZXRWYWx1ZSA9IHRydWU7CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0gLy8gc3dpdGNoCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGlzRHVibGluQ29yZU5MU0ZlYXR1cmUKKworCS8qKgorCSAqIEBwYXJhbSBudW1MZXZlbHMKKwkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYWRtaW5pc3RyYXRpb24gbGV2ZWxzIHRvIGdlbmVyYXRlIGNhdGVnb3JpZXMgZm9yCisJICogQHBhcmFtIGdyYXBoT3V0CisJICogICAgICAgICAgICB0aGUgb3V0cHV0IHdyaXRlciBmb3IgdGhlIHBsdWdpbi54bWwgZmlsZSBjb250ZW50cworCSAqIEBwYXJhbSBwbHVnaW5PdXQKKwkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgd3JpdGVyIGZvciB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBjb250ZW50cworCSAqIEByZXR1cm4gYW4gYXJyYXkgaW5kZXhlZCBieSBhZG1pbmlzdHJhdGlvbiBsZXZlbCBvZiB0aGUgY2F0ZWdvcnkgaWRlYXMgb2YKKwkgKiAgICAgICAgIHRoZSBkaWZmZXJlbnQgYWRtaW5pc3RyYXRpb24gbGV2ZWxzCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSB3cml0aW5nIHRvIHRoZSBvdXRwdXQgd3JpdGVycworCSAqLworCXByaXZhdGUgU3RyaW5nW10gb3V0cHV0Q2F0ZWdvcmllcyhmaW5hbCBpbnQgbnVtTGV2ZWxzLAorCQkJZmluYWwgV3JpdGVyIGdyYXBoT3V0LCBmaW5hbCBXcml0ZXIgcGx1Z2luT3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkvLyBUaGUgY2F0ZWdvcmllcworCQkvLyBTVEVNCisJCW91dHB1dENhdGVnb3J5KElEX1NURU1fR1JBUEhfQ0FURUdPUlksIFNURU0sICIvIiwKKwkJCQlOTFNfQ0FURUdPUllfS0VZX0ZPUk1BVCwgZ3JhcGhPdXQsIHBsdWdpbk91dCk7CisKKwkJLy8gR2VvZ3JhcGh5CisJCW91dHB1dENhdGVnb3J5KElEX0dSQVBIX0dFT0dSQVBIWV9DQVRFR09SWSwgR0VPR1JBUEhZLAorCQkJCUlEX1NURU1fR1JBUEhfQ0FURUdPUlksIE5MU19DQVRFR09SWV9LRVlfRk9STUFULCBncmFwaE91dCwKKwkJCQlwbHVnaW5PdXQpOworCisJCS8vIFBvbGl0aWNhbAorCQlvdXRwdXRDYXRlZ29yeShJRF9HUkFQSF9QT0xJVElDQUxfQ0FURUdPUlksIFBPTElUSUNBTCwKKwkJCQlJRF9HUkFQSF9HRU9HUkFQSFlfQ0FURUdPUlksIE5MU19DQVRFR09SWV9LRVlfRk9STUFULCBncmFwaE91dCwKKwkJCQlwbHVnaW5PdXQpOworCisJCS8vIENvdW50cnkKKwkJb3V0cHV0Q2F0ZWdvcnkoSURfR1JBUEhfQ09VTlRSSUVTX0NBVEVHT1JZLCBDT1VOVFJJRVMsCisJCQkJSURfR1JBUEhfUE9MSVRJQ0FMX0NBVEVHT1JZLCBOTFNfQ0FURUdPUllfS0VZX0ZPUk1BVCwgZ3JhcGhPdXQsCisJCQkJcGx1Z2luT3V0KTsKKworCQlmaW5hbCBTdHJpbmdbXSBsZXZlbENhdGVnb3J5SWQgPSBuZXcgU3RyaW5nW251bUxldmVsc107CisKKwkJLy8gTGV2ZWwKKwkJZm9yIChpbnQgYWRtaW5MZXZlbCA9IDA7IGFkbWluTGV2ZWwgPCBudW1MZXZlbHM7IGFkbWluTGV2ZWwrKykgeworCQkJLy8gTGV2ZWwgY2F0ZWdvcnkKKwkJCWxldmVsQ2F0ZWdvcnlJZFthZG1pbkxldmVsXSA9IElEX0dSQVBIX0NPVU5UUklFU19DQVRFR09SWSArICIuIgorCQkJCQkrIExFVkVMLnRvTG93ZXJDYXNlKCkgKyBhZG1pbkxldmVsOworCisJCQlvdXRwdXRDYXRlZ29yeShsZXZlbENhdGVnb3J5SWRbYWRtaW5MZXZlbF0sIExFVkVMICsgYWRtaW5MZXZlbCwKKwkJCQkJSURfR1JBUEhfQ09VTlRSSUVTX0NBVEVHT1JZLCBOTFNfQ0FURUdPUllfS0VZX0ZPUk1BVCwKKwkJCQkJZ3JhcGhPdXQsIHBsdWdpbk91dCk7CisJCX0gLy8gZm9yIGFkbWluTGV2ZWwKKworCQlncmFwaE91dC53cml0ZSgiXG4iKTsKKwkJcGx1Z2luT3V0LndyaXRlKCJcbiIpOworCQlyZXR1cm4gbGV2ZWxDYXRlZ29yeUlkOworCX0gLy8gb3V0cHV0Y2F0ZWdvcmllcworCisJLyoqCisJICogQHBhcmFtIGV4dGVuc2lvblBvaW50SWQKKwkgKiBAcGFyYW0gY2F0ZWdvcnlJZAorCSAqIEBwYXJhbSBwYXJlbnRDYXRlZ29yeUlkCisJICogQHBhcmFtIG5sc0tleUZvcm1hdAorCSAqIEBwYXJhbSBncmFwaE91dAorCSAqIEBwYXJhbSBwbHVnaW5PdXQKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG91dHB1dENhdGVnb3J5KGZpbmFsIFN0cmluZyBleHRlbnNpb25Qb2ludElkLAorCQkJZmluYWwgU3RyaW5nIGNhdGVnb3J5SWQsIGZpbmFsIFN0cmluZyBwYXJlbnRDYXRlZ29yeUlkLAorCQkJZmluYWwgU3RyaW5nIG5sc0tleUZvcm1hdCwgZmluYWwgV3JpdGVyIGdyYXBoT3V0LAorCQkJZmluYWwgV3JpdGVyIHBsdWdpbk91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJZmluYWwgU3RyaW5nIG5sc0tleSA9IGNyZWF0ZUNhdGVnb3J5TkxTS2V5KGNhdGVnb3J5SWQsIG5sc0tleUZvcm1hdCk7CisJCWdyYXBoT3V0LndyaXRlKE1lc3NhZ2VGb3JtYXQKKwkJCQkuZm9ybWF0KFhNTF9DQVRFR09SWV9FTEVNRU5UX09QRU4sIG5ldyBPYmplY3RbXSB7CisJCQkJCQlleHRlbnNpb25Qb2ludElkLCAiJSIgKyBubHNLZXksIHBhcmVudENhdGVnb3J5SWQgfSkpOworCQlncmFwaE91dC53cml0ZSgiXG4iKTsKKworCQkvLyBIYWNrIGFsZXJ0IQorCQkvLyBGb3IgImxldmVscyIsIHRoZSBjYXRlZ29yeUlkIGxvb2tzIGxpa2UgdGhpcyAiTGV2ZWwwIiwgd2Ugd2FudCBpdCB0bworCQkvLyBsb29rIGxpa2UgdGhpcyAiTGV2ZWwgMCIgd2hlbiB3ZSBwdXQgaXQgaW4gdGhlIHBsdWdpbi5wcm9wZXJpdGVzIGZpbGUKKwkJLy8gYmVjYXVzZSB0aGlzIGlzIHdoYXQgcGVvcGxlIHdpbGwgc2VlIGluIHRoZSBhcHBsaWNhdGlvbgorCQlmaW5hbCBTdHJpbmcgdGVtcCA9IGNhdGVnb3J5SWQuc3RhcnRzV2l0aChMRVZFTCkgPyBMRVZFTCArICIgIgorCQkJCSsgY2F0ZWdvcnlJZC5zdWJzdHJpbmcoTEVWRUwubGVuZ3RoKCkpIDogY2F0ZWdvcnlJZDsKKworCQlwbHVnaW5PdXQud3JpdGUobmxzS2V5ICsgIiA9ICIgKyB0ZW1wICsgIlxuIik7CisJfSAvLyBvdXRwdXRDYXRlZ29yeQorCisJLyoqCisJICogQHBhcmFtIGtleQorCSAqIEBwYXJhbSBubHNLZXlGb3JtYXQKKwkgKiBAcmV0dXJuIGEgTkxTIGtleSBmb3IgY2F0ZWdvcmllcyBpbiB0aGUgcGx1Z2luLnByb3Blcml0ZXMgZmlsZQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUNhdGVnb3J5TkxTS2V5KGZpbmFsIFN0cmluZyBrZXksCisJCQlmaW5hbCBTdHJpbmcgbmxzS2V5Rm9ybWF0KSB7CisJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChubHNLZXlGb3JtYXQsIG5ldyBPYmplY3RbXSB7IGtleSB9KTsKKwl9IC8vIGNyZWF0ZUNhdGVnb3J5TkxTS2V5CisKKwkvKioKKwkgKiBQcm9jZXNzIGFsbCBvZiB0aGUgZGF0YSB0aGF0IGRlZmluZXMgdGhlIGdyYXBoIG9mIHRoZSBwb3B1bGF0aW9uIGxhYmVscworCSAqIGZvciBjb3VudHJpZXMgYW5kIGNyZWF0ZSBncmFwaHMgb2YganVzdCBwb3B1bGF0aW9uIGxhYmVscyBmb3IgYSBzcGVjaWZpZWQKKwkgKiByYW5nZSBvZiBhZG1pbmlzdHJhdGlvbiBsZXZlbHMuCisJICogCisJICogQHBhcmFtIGNvdW50cnlDb2RlcworCSAqICAgICAgICAgICAgdGhlIElTTzMxNjYtMSBhbHBoYS0zIGNvZGVzIG9mIHRoZSBjb3VudHJpZXMgdG8gZ2VuZXJhdGUKKwkgKiAgICAgICAgICAgIGdyYXBocyBmb3IKKwkgKiBAcGFyYW0gZGF0YVR5cGUKKwkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGdyYXBoIHRvIGNyZWF0ZXMKKwkgKiBAcmV0dXJuIHN0dWZmCisJICovCisJcHVibGljIE1hcDxDb3VudHJ5Q29kZSwgTGlzdDxHcmFwaFJlY29yZD4+IGNyZWF0ZUdyYXBoUmVjb3JkcygKKwkJCWZpbmFsIExpc3Q8Q291bnRyeUNvZGU+IGNvdW50cnlDb2RlcywgZmluYWwgRGF0YVR5cGUgZGF0YVR5cGUpIHsKKwkJcmV0dXJuIGNyZWF0ZUdyYXBoUmVjb3JkcyhHRU9HUkFQSFlfRklMRV9VUklfUFJFRklYLCBjb3VudHJ5Q29kZXMsCisJCQkJZGF0YVR5cGUpOworCX0gLy8gY3JlYXRlR3JhcGhSZWNvcmRzCisKKwkvKioKKwkgKiBQcm9jZXNzIGFsbCBvZiB0aGUgZGF0YSB0aGF0IGRlZmluZXMgdGhlIGdyYXBoIG9mIHRoZSBwb3B1bGF0aW9uIGxhYmVscworCSAqIGZvciBjb3VudHJpZXMgYW5kIGNyZWF0ZSBncmFwaHMgb2YganVzdCBwb3B1bGF0aW9uIGxhYmVscyBmb3IgYSBzcGVjaWZpZWQKKwkgKiByYW5nZSBvZiBhZG1pbmlzdHJhdGlvbiBsZXZlbHMuCisJICogCisJICogQHBhcmFtIGRhdGFGaWxlVVJJUHJlZml4CisJICogICAgICAgICAgICB0aGUgVVJJIHByZWZpeCBmb3IgdGhlIGNvdW50cnkgZ3JhcGhzIGJlaW5nIGNyZWF0ZWQKKwkgKiBAcGFyYW0gY291bnRyeUNvZGVzCisJICogICAgICAgICAgICB0aGUgSVNPMzE2Ni0xIGFscGhhLTMgY29kZXMgb2YgdGhlIGNvdW50cmllcyB0byBnZW5lcmF0ZQorCSAqICAgICAgICAgICAgZ3JhcGhzIGZvcgorCSAqLworCXByaXZhdGUgTWFwPENvdW50cnlDb2RlLCBMaXN0PEdyYXBoUmVjb3JkPj4gY3JlYXRlR3JhcGhSZWNvcmRzKAorCQkJZmluYWwgU3RyaW5nIGRhdGFGaWxlVVJJUHJlZml4LAorCQkJZmluYWwgTGlzdDxDb3VudHJ5Q29kZT4gY291bnRyeUNvZGVzLCBmaW5hbCBEYXRhVHlwZSBkYXRhVHlwZSkgeworCQlmaW5hbCBNYXA8Q291bnRyeUNvZGUsIExpc3Q8R3JhcGhSZWNvcmQ+PiByZXRWYWx1ZSA9IG5ldyBIYXNoTWFwPENvdW50cnlDb2RlLCBMaXN0PEdyYXBoUmVjb3JkPj4oKTsKKworCQkvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBjb3VudHJ5CisJCWZvciAoZmluYWwgQ291bnRyeUNvZGUgY291bnRyeUNvZGUgOiBjb3VudHJ5Q29kZXMpIHsKKwkJCS8vIEdldCBhbGwgb2YgdGhlIGRhdGEgZmlsZXMgZm9yIHRoZSBjb3VudHJ5CisJCQlmaW5hbCBMaXN0PEZpbGU+IGRhdGFGaWxlcyA9IENvdW50cnlEaXJlY3RvcnlVdGlsaXRpZXMKKwkJCQkJLmdldERhdGFGaWxlcyhjb3VudHJ5Q29kZSwgZGF0YVR5cGUudG9TdHJpbmcoKSk7CisJCQlmb3IgKGZpbmFsIEZpbGUgZmlsZSA6IGRhdGFGaWxlcykgeworCQkJCS8vIEdldCB0aGUgZ3JhcGggcmVjb3JkIGZvciB0aGUgZmlsZQorCQkJCWZpbmFsIEdyYXBoUmVjb3JkIGdyYXBoUmVjb3JkID0gUmVjb3JkRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkJLmNyZWF0ZUdyYXBoUmVjb3JkKGRhdGFUeXBlLCBjb3VudHJ5Q29kZSwKKwkJCQkJCQkJZGF0YUZpbGVVUklQcmVmaXgsIGZpbGUpOworCisJCQkJLy8gRGlkIHdlIGhhdmUgdHJvdWJsZSBjcmVhdGluZyB0aGUgZ3JhcGg/CisJCQkJaWYgKGdyYXBoUmVjb3JkLmdldEdyYXBoKCkgIT0gbnVsbCkgeworCQkJCQkvLyBObworCisJCQkJCS8vIEhhdmUgd2UgcHJvY2Vzc2VkIHRoaXMgY291bnRyeSBjb2RlIGJlZm9yZT8KKwkJCQkJTGlzdDxHcmFwaFJlY29yZD4gY291bnRyeUxpc3QgPSByZXRWYWx1ZS5nZXQoY291bnRyeUNvZGUpOworCQkJCQlpZiAoY291bnRyeUxpc3QgPT0gbnVsbCkgeworCQkJCQkJLy8gTm8KKwkJCQkJCWNvdW50cnlMaXN0ID0gbmV3IEFycmF5TGlzdDxHcmFwaFJlY29yZD4oKTsKKwkJCQkJCXJldFZhbHVlLnB1dChjb3VudHJ5Q29kZSwgY291bnRyeUxpc3QpOworCQkJCQl9CisJCQkJCWNvdW50cnlMaXN0LmFkZChncmFwaFJlY29yZCk7CisJCQkJfSAvLyBpZiBubyBwcm9ibGVtIGNyZWF0aW5nIHRoZSBncmFwaAorCQkJfSAvLyBmb3IgZmlsZQorCQl9IC8vIGZvciBlYWNoIGNvdW50cnkgY29kZQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVHcmFwaFJlY29yZHMKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbGwgb2YgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBkYXRhIGZpbGVzIHRoYXQgY2FuCisJICogYmUgZGVmaW5lZCBmb3IgYSBjb3VudHJ5CisJICovCisJcHVibGljIGVudW0gRGF0YVR5cGUgeworCQkvKioKKwkJICogCisJCSAqLworCQlub2RlLAorCQkvKioKKwkJICogCisJCSAqLworCQlhcmVhLAorCQkvKioKKwkJICogCisJCSAqLworCQlwb3B1bGF0aW9uOworCisJfSAvLyBEYXRhVHlwZQorCisJLyoqCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBDb3VudHJ5RGF0YSB7CisJCS8vIE5vdGhpbmcKKwl9IC8vIENvdW50cnlEYXRhCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHRoZSBkYXRhIHRoYXQgZGVmaW5lcyBub2RlIGluIGEgY291bnRyeSBncmFwaC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb2RlRGF0YSBleHRlbmRzIENvdW50cnlEYXRhIHsKKwkJLyoqCisJCSAqIFRoZSBuYW1lIG9mIHRoZSBub2RlLgorCQkgKi8KKwkJU3RyaW5nIG5hbWUgPSBudWxsOworCisJCS8qKgorCQkgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIG5vZGUuCisJCSAqLworCQlTdHJpbmcgaWRlbnRpZmllciA9IG51bGw7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBuYW1lCisJCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgbm9kZS4KKwkJICogQHBhcmFtIGlkZW50aWZpZXIKKwkJICogICAgICAgICAgICBpZGVudGlmaWVyIGZvciB0aGUgbm9kZS4KKwkJICovCisJCXB1YmxpYyBOb2RlRGF0YShmaW5hbCBTdHJpbmcgaWRlbnRpZmllciwgZmluYWwgU3RyaW5nIG5hbWUpIHsKKwkJCXRoaXMubmFtZSA9IG5hbWU7CisJCQl0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyOworCisJCX0gLy8gTm9kZURhdGEKKworCQkvKioKKwkJICogQHJldHVybiB0aGUgY29kZQorCQkgKi8KKwkJcHVibGljIGZpbmFsIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgeworCQkJcmV0dXJuIGlkZW50aWZpZXI7CisJCX0KKworCQkvKioKKwkJICogQHBhcmFtIGlkZW50aWZpZXIKKwkJICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciB0byBzZXQKKwkJICovCisJCXB1YmxpYyBmaW5hbCB2b2lkIHNldElkZW50aWZpZXIoZmluYWwgU3RyaW5nIGlkZW50aWZpZXIpIHsKKwkJCXRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7CisJCX0KKworCQkvKioKKwkJICogQHJldHVybiB0aGUgbmFtZQorCQkgKi8KKwkJcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lKCkgeworCQkJcmV0dXJuIG5hbWU7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKG5hbWUpOworCQkJc2IuYXBwZW5kKCIgKCIpOworCQkJc2IuYXBwZW5kKGlkZW50aWZpZXIpOworCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJCX0KKworCX0gLy8gTm9kZURhdGEKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgYXJlYSBpbiBzcXVhcmUga2lsb21ldGVycyBmb3IgYSBzcGVjaWZpYyBub2RlCisJICogaW4gYSBzcGVjaWZpYyBhZG1pbnN0cmF0aW9uIGxldmVsCisJICovCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXJlYURhdGEgZXh0ZW5kcyBDb3VudHJ5RGF0YSB7CisKKwkJLy8gSVNPLTMxNjYtMSwgSVNPLTMxNjYtMiwgb3IgSVNPLTMxNjYtMiBhbHBoYSdzCisJCS8vIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBub2RlCisJCVN0cmluZyBpZGVudGlmaWVyID0gIiI7CisKKwkJLy8gU3F1YXJlIEttJ3MKKwkJU3RyaW5nIGFyZWEgPSAiIjsKKworCQkvKioKKwkJICogQHBhcmFtIGlkZW50aWZpZXIKKwkJICogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgbm9kZQorCQkgKiBAcGFyYW0gYXJlYQorCQkgKiAgICAgICAgICAgIHRoZSBhcmVhIG9mIHRoZSBub2RlIGluIHNxdWFyZSBraWxvbWV0ZXJzCisJCSAqLworCQlwdWJsaWMgQXJlYURhdGEoZmluYWwgU3RyaW5nIGlkZW50aWZpZXIsIGZpbmFsIFN0cmluZyBhcmVhKSB7CisJCQl0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyOworCQkJdGhpcy5hcmVhID0gYXJlYTsKKwkJfSAvLyBBcmVhRGF0YQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBhcmVhIG9mIHRoZSBub2RlIGluIHNxdWFyZSBraWxvbWV0ZXJzCisJCSAqLworCQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFyZWEoKSB7CisJCQlyZXR1cm4gYXJlYTsKKwkJfQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBub2RlCisJCSAqLworCQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7CisJCQlyZXR1cm4gaWRlbnRpZmllcjsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gaWRlbnRpZmllciArICIgPSAiICsgYXJlYTsKKwkJfSAvLyB0b1N0cmluZworCisJfSAvLyBBcmVhRGF0YQorCisJLyoqCisJICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgcG9wdWxhdGlvbiBtZW1iZXJzIG9mIGEgcGFydGljdWxhcgorCSAqIHR5cGUgd2hvIG9jY3VweSBhIHNwZWNpZmljIG5vZGUuIEl0IGFsc28sIGluY2x1ZGVzIGFuIG9wdGlvbmFsCisJICogc3BlY2lmaWNhdGlvbiBvZiB0aGUgYXJlYSB0aGF0IHRoZSBwb3B1bGF0aW9uIGxpdmVzIGluLiBUaGlzIGlzIGludGVuZGVkCisJICogdG8gcHJvdmlkZSBiZXR0ZXIgcG9wdWxhdGlvbiBkZW5zaXR5IHZhbHVlcyB3aGVuIGEgcG9wdWxhdGlvbiBsaXZlcyBpbiBhCisJICogc21hbGwgYXJlYSAoZS5nLiwgYSBjaXR5KSBjb21wYXJlZCB0byB0aGUgdG90YWwgYXJlYSBvZiB0aGUgbm9kZS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBQb3B1bGF0aW9uRGF0YSBleHRlbmRzIENvdW50cnlEYXRhIHsKKworCQkvLyBJU08tMzE2Ni0xLCBJU08tMzE2Ni0yLCBvciA/CisJCVN0cmluZyBub2RlQ29kZSA9ICIiOworCisJCS8vIEluZGl2aWR1YWxzCisJCVN0cmluZyBjb3VudCA9ICIiOworCisJCS8vIE9wdGlvbmFsIGFyZWEgb2NjdXBpZWQgYnkgcG9wdWxhdGlvbgorCQlTdHJpbmcgYXJlYSA9IG51bGw7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBub2RlQ29kZQorCQkgKiAgICAgICAgICAgIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgbm9kZQorCQkgKiBAcGFyYW0gZGF0YVN0cmluZworCQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUgcG9wdWxhdGlvbiBjb3VudCBhbmQgb3B0aW9uYWwKKwkJICogICAgICAgICAgICBhcmVhIGV4dGVudAorCQkgKi8KKwkJcHVibGljIFBvcHVsYXRpb25EYXRhKGZpbmFsIFN0cmluZyBub2RlQ29kZSwgZmluYWwgU3RyaW5nIGRhdGFTdHJpbmcpIHsKKwkJCXN1cGVyKCk7CisKKwkJCXRoaXMubm9kZUNvZGUgPSBub2RlQ29kZTsKKworCQkJLy8gVGhlIGRhdGEgc3RyaW5nIGNvbnRhaW5zIHRoZSBwb3B1bGF0aW9uIGNvdW50IGFuZCBhbiBvcHRpb25hbAorCQkJLy8gc3BlY2lmaWF0aW9uIG9mIHRoZSBhcmVhIGluIHNxdWFyZSBraWxvbWV0ZXJzIHRoYXQgdGhlIHBvcHVsYXRpb24KKwkJCS8vIGlzIGRpc3RyaWJ1dGVkIG92ZXIuIFRoZSBvcHRpb25hbCBhcmVhIHNwZWNpZmljYXRpb24gaXMgdXNlZCB0bworCQkJLy8gZmFjaWxsaXRhdGUgbW9yZSBhY2N1cmF0ZSBjb21wdXRhdGlvbiBvZiB0aGUgcG9wdWxhdGlvbiBkZW5zaXR5CisJCQkvLyBmb3IgY2FzZXMgd2hlcmUgdGhlIGFyZWEgb2YgYSByZWdpb24gYmVpbmcgbGFiZWxlZCBieSB0aGUKKwkJCS8vIHBvcHVsYXRpb24gaXMgbXVjaCBsYXJnZXIgdGhhbiB0aGUgYXJlYSB3aGVyZSBtb3N0IG9mIHRoZQorCQkJLy8gcG9wdWxhdGlvbiBleGlzdHMuIEZvciBpbnN0YW5jZSwgdGhlIGNhc2Ugb2YgYSBzaW5nbGUgY2l0eSBpbiBhbgorCQkJLy8gb3RoZXJ3aXNlIGxhcmdlIHVub2NjdXBpZWQgcmVnaW9uLiBUaGUgZm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMKKwkJCS8vIGVpdGhlciBhIHNpbmdsZSBpbnRlZ2VyIGZvciB0aGUgcG9wdWxhdGlvbiBjb3VudCwgb3IgYW4gaW50ZWdlcgorCQkJLy8gZm9sbG93ZWQgYnkgYSBjb21tYSBmb2xsb3dlZCBieSBhbiBkb3VibGUgZm9yIHRoZSBhcmVhLiBlLmcuCisJCQkvLyAiMTIzIiBvciAiMTIzLCA0NS42IgorCisJCQlmaW5hbCBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRhdGFTdHJpbmcsICIsICIpOworCQkJY291bnQgPSBzdC5uZXh0VG9rZW4oKTsKKwkJCWFyZWEgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7CisJCX0gLy8gUG9wdWxhdGlvbkRhdGEKKworCQkvKioKKwkJICogQHJldHVybiB0aGUgY291bnQKKwkJICovCisJCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q291bnQoKSB7CisJCQlyZXR1cm4gY291bnQ7CisJCX0KKworCQkvKioKKwkJICogQHJldHVybiB0aGUgbm9kZUNvZGUKKwkJICovCisJCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Tm9kZUNvZGUoKSB7CisJCQlyZXR1cm4gbm9kZUNvZGU7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKG5vZGVDb2RlKTsKKwkJCXNiLmFwcGVuZCgiICgiKTsKKwkJCXNiLmFwcGVuZChjb3VudCk7CisJCQlzYi5hcHBlbmQoYXJlYSAhPSBudWxsID8gIi8iICsgYXJlYSArICJrbV4yIiA6ICIiKTsKKwkJCXNiLmFwcGVuZCgiKSIpOworCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJCX0gLy8gdG9TdHJpbmcKKworCX0gLy8gUG9wdWxhdGlvbkRhdGEKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYSBmYWN0b3J5IGZvciBHcmFwaFJlY29yZHMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFJlY29yZEZhY3RvcnkgeworCQkvKioKKwkJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeQorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBSZWNvcmRGYWN0b3J5IElOU1RBTkNFID0gbmV3IFJlY29yZEZhY3RvcnkoKTsKKworCQkvKioKKwkJICogQHBhcmFtIGRhdGFUeXBlCisJCSAqIEBwYXJhbSBjb3VudHJ5Q29kZQorCQkgKiBAcGFyYW0gZGF0YUZpbGVVUklQcmVmaXgKKwkJICogQHBhcmFtIGZpbGUKKwkJICogQHJldHVybiB0aGUgZ3JhcGggcmVjb3JkIGV4dHJhY3RlZCBmcm9tIHRoZSBkYXRhIGZpbGUKKwkJICovCisJCXB1YmxpYyBHcmFwaFJlY29yZCBjcmVhdGVHcmFwaFJlY29yZChmaW5hbCBEYXRhVHlwZSBkYXRhVHlwZSwKKwkJCQlmaW5hbCBDb3VudHJ5Q29kZSBjb3VudHJ5Q29kZSwgZmluYWwgU3RyaW5nIGRhdGFGaWxlVVJJUHJlZml4LAorCQkJCWZpbmFsIEZpbGUgZmlsZSkgeworCQkJR3JhcGhSZWNvcmQgcmV0VmFsdWUgPSBudWxsOworCisJCQlzd2l0Y2ggKGRhdGFUeXBlKSB7CisJCQljYXNlIG5vZGU6CisJCQkJcmV0VmFsdWUgPSBuZXcgTm9kZUdyYXBoUmVjb3JkKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIGFyZWE6CisJCQkJcmV0VmFsdWUgPSBuZXcgQXJlYUdyYXBoUmVjb3JkKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIHBvcHVsYXRpb246CisJCQkJcmV0VmFsdWUgPSBuZXcgUG9wdWxhdGlvbkdyYXBoUmVjb3JkKCk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGRhdGFUeXBlLnRvU3RyaW5nKCkKKwkJCQkJCSsgIiBub3QgYSByZWNvZ25pemVkIGRhdGEgdHlwZSIpOworCQkJfSAvLyBzd2l0Y2gKKworCQkJcmV0VmFsdWUuaW5pdGlhbGl6ZShjb3VudHJ5Q29kZSwgZGF0YUZpbGVVUklQcmVmaXgsIGZpbGUpOworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGNyZWF0ZUdyYXBoUmVjb3JkCisKKwl9IC8vIFJlY29yZEZhY3RvcnkKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgY29udGFpbnMgbWV0YWRhdGEgZm9yIGEgZ3JhcGgsIG1vZGVsIG9yIHNjZW5hcmlvCisJICovCisJYWJzdHJhY3QgcHVibGljIHN0YXRpYyBjbGFzcyBSZWNvcmQgeworCisJCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVVJJQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBVUklDb252ZXJ0ZXJJbXBsKCk7CisKKwkJLyoqCisJCSAqIFRoaXMgaXMgYW4gaWRlbnRpZmllciBmb3IgdGhlIGdyYXBoL21vZGVsL3NjZW5hcmlvIGJlaW5nIGNyZWF0ZWQuCisJCSAqIGUuZy4sIENvdW50cnlDb2RlCisJCSAqLworCQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gIiI7CisKKwkJcHJvdGVjdGVkIElkZW50aWZpYWJsZSBpZGVudGlmaWFibGUgPSBudWxsOworCisJCXByb3RlY3RlZCBMaXN0PEludGVnZXI+IGFkbWluTGV2ZWxzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCisJCS8qKgorCQkgKiBUaGUgbWF4aW11bSBhZG1pbmlzdHJhdGlvbiBsZXZlbCBpbiB0aGUgZ3JhcGgvbW9kZWwKKwkJICovCisJCXByb3RlY3RlZCBpbnQgbWF4QWRtaW5MZXZlbCA9IC0xOworCisJCS8qKgorCQkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisJCSAqLworCQlwdWJsaWMgUmVjb3JkKCkgeworCQkJLy8gbm90aGluZworCQl9IC8vIFJlY29yZAorCisJCS8qKgorCQkgKiBAcGFyYW0gaWRlbnRpZmlhYmxlCisJCSAqICAgICAgICAgICAgdGhlIGlkZW50aWZpYWJsZSAoZ3JhcGgvbW9kZWwvc2NlbmFyaW8pIHRoYXQgdGhlIG1ldGFkYXRhCisJCSAqICAgICAgICAgICAgZGVzY3JpYmVzCisJCSAqIEBwYXJhbSBpZAorCQkgKiAgICAgICAgICAgIGEgc2hvcnQgaWRlbnRpZmllciBvZiB0aGUgaWRlbnRpZmlhYmxlIChlLmcuLCBjb3VudHJ5CisJCSAqICAgICAgICAgICAgY29kZSkKKwkJICogQHBhcmFtIGFkbWluTGV2ZWwKKwkJICogICAgICAgICAgICB0aGUgYWRtaW5pc3RyYXRpb24gbGV2ZWwgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZQorCQkgKiAgICAgICAgICAgIGlkZW50aWZpYWJsZQorCQkgKi8KKwkJcHVibGljIFJlY29yZChmaW5hbCBJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlLCBmaW5hbCBTdHJpbmcgaWQsCisJCQkJZmluYWwgaW50IGFkbWluTGV2ZWwpIHsKKwkJCXRoaXMoaWRlbnRpZmlhYmxlLCBpZCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChJbnRlZ2VyCisJCQkJCS52YWx1ZU9mKGFkbWluTGV2ZWwpKSk7CisJCX0gLy8gUmVjb3JkCisKKwkJLyoqCisJCSAqIEBwYXJhbSBpZGVudGlmaWFibGUKKwkJICogICAgICAgICAgICB0aGUgaWRlbnRpZmlhYmxlIChncmFwaC9tb2RlbC9zY2VuYXJpbykgdGhhdCB0aGUgbWV0YWRhdGEKKwkJICogICAgICAgICAgICBkZXNjcmliZXMKKwkJICogQHBhcmFtIGlkCisJCSAqICAgICAgICAgICAgYSBzaG9ydCBpZGVudGlmaWVyIG9mIHRoZSBpZGVudGlmaWFibGUgKGUuZy4sIGNvdW50cnkKKwkJICogICAgICAgICAgICBjb2RlKQorCQkgKiBAcGFyYW0gYWRtaW5MZXZlbHMKKwkJICogICAgICAgICAgICB0aGUgYWRtaW5pc3RyYXRpb24gbGV2ZWxzIG9mIHRoZSBjb250ZW50cyBvZiB0aGUKKwkJICogICAgICAgICAgICBpZGVudGlmaWFibGUKKwkJICovCisJCXB1YmxpYyBSZWNvcmQoZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50aWZpYWJsZSwgZmluYWwgU3RyaW5nIGlkLAorCQkJCWZpbmFsIExpc3Q8SW50ZWdlcj4gYWRtaW5MZXZlbHMpIHsKKwkJCXRoaXMuaWRlbnRpZmlhYmxlID0gaWRlbnRpZmlhYmxlOworCQkJdGhpcy5pZCA9IGlkOworCQkJYWRkQWRtaW5MZXZlbHMoYWRtaW5MZXZlbHMpOworCQl9IC8vIFJlY29yZAorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBkdWJsaW4gY29yZSBpbnN0YW5jZSBvZiB0aGUgY29udGFpbmVkIElkZW50aWZpYWJsZQorCQkgKi8KKwkJcHVibGljIER1YmxpbkNvcmUgZ2V0RHVibGluQ29yZSgpIHsKKwkJCXJldHVybiBpZGVudGlmaWFibGUuZ2V0RHVibGluQ29yZSgpOworCQl9IC8vIGdldER1YmxpbkNvcmUKKworCQkvKioKKwkJICogQHJldHVybiBlLmcuLCAiZ3JhcGgiLCAibW9kZWwiLCAic2NlbmFyaW8iCisJCSAqLworCQlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldE91dHB1dFR5cGUoKTsKKworCQkvKioKKwkJICogQHJldHVybiB0aGUgaWQKKwkJICovCisJCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0SWQoKSB7CisJCQlyZXR1cm4gaWQ7CisJCX0gLy8gZ2V0SWQKKworCQkvKioKKwkJICogQHBhcmFtIGFkbWluTGV2ZWwKKwkJICogICAgICAgICAgICB0aGUgYWRtaW5pc3RyYXRpb24gbGV2ZWwgdG8gYWRkIHRvIHRoZSByZWNvcmQKKwkJICovCisJCXB1YmxpYyB2b2lkIGFkZEFkbWluTGV2ZWwoZmluYWwgaW50IGFkbWluTGV2ZWwpIHsKKwkJCWFkZEFkbWluTGV2ZWwoSW50ZWdlci52YWx1ZU9mKGFkbWluTGV2ZWwpKTsKKwkJfSAvLyBhZGRBZG1pbkxldmVsCisKKwkJLyoqCisJCSAqIEBwYXJhbSBhZG1pbkxldmVsCisJCSAqICAgICAgICAgICAgdGhlIGFkbWluaXN0cmF0aW9uIGxldmVsIHRvIGFkZCB0byB0aGUgcmVjb3JkCisJCSAqLworCQlwdWJsaWMgdm9pZCBhZGRBZG1pbkxldmVsKGZpbmFsIEludGVnZXIgYWRtaW5MZXZlbCkgeworCQkJLy8gSXMgdGhlIGFkbWluIGxldmVsIGFscmVhZHkgaW4gb3VyIGNvbGxlY3Rpb24/CisJCQlpZiAoIWFkbWluTGV2ZWxzLmNvbnRhaW5zKGFkbWluTGV2ZWwpKSB7CisJCQkJLy8gTm8KKwkJCQlhZG1pbkxldmVscy5hZGQoYWRtaW5MZXZlbCk7CisJCQkJbWF4QWRtaW5MZXZlbCA9IE1hdGgubWF4KG1heEFkbWluTGV2ZWwsIGFkbWluTGV2ZWwuaW50VmFsdWUoKSk7CisJCQkJQ29sbGVjdGlvbnMuc29ydChhZG1pbkxldmVscyk7CisJCQl9CisJCX0gLy8gYWRkQWRtaW5MZXZlbAorCisJCS8qKgorCQkgKiBBZGQgYSBsaXN0IG9mIGFkbWluaXN0cmF0aW9uIGxldmVscyB0byB0aGUgY29sbGVjaXRvbiBvZgorCQkgKiBhZG1pbmlzdHJhdGlvbiBsZXZlbHMKKwkJICogCisJCSAqIEBwYXJhbSBhZG1pbkxldmVscworCQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBhZG1pbmlzdHJhdGlvbiBsZXZlbHMKKwkJICovCisJCXB1YmxpYyB2b2lkIGFkZEFkbWluTGV2ZWxzKGZpbmFsIExpc3Q8SW50ZWdlcj4gYWRtaW5MZXZlbHMpIHsKKwkJCWZvciAoZmluYWwgSW50ZWdlciBhZG1pbkxldmVsIDogYWRtaW5MZXZlbHMpIHsKKwkJCQlhZGRBZG1pbkxldmVsKGFkbWluTGV2ZWwpOworCQkJfQorCQl9IC8vIGFkZEFkbWluTGV2ZWxzCisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIGFkbWluaXN0cmF0aW9uIGxldmVscworCQkgKi8KKwkJcHVibGljIGZpbmFsIExpc3Q8SW50ZWdlcj4gZ2V0QWRtaW5MZXZlbHMoKSB7CisJCQlyZXR1cm4gYWRtaW5MZXZlbHM7CisJCX0gLy8gZ2V0QWRtaW5MZXZlbHMKKworCQkvKioKKwkJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGFkbWluaXN0cmF0aW9uIGxldmVscyByZXByZXNlbnRlZCBpbiB0aGUKKwkJICogICAgICAgICBpZGVudGlmaWFibGUuCisJCSAqLworCQlwdWJsaWMgaW50IGdldE51bUFkbWluTGV2ZWxzKCkgeworCQkJcmV0dXJuIGFkbWluTGV2ZWxzLnNpemUoKTsKKwkJfSAvLyBnZXROdW1BZG1pbkxldmVscworCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIGFkbWluaXN0cmF0aW9uIGxldmVsIGluIHRlaCBkYXRhCisJCSAqLworCQlwdWJsaWMgZmluYWwgaW50IGdldE1heEFkbWluTGV2ZWwoKSB7CisJCQlyZXR1cm4gbWF4QWRtaW5MZXZlbDsKKwkJfQorCisJCS8qKgorCQkgKiBTZXJpYWxpemUgYSBsaXN0IG9mIHJlY29yZHMuCisJCSAqIAorCQkgKiBAcGFyYW0gcmVjb3JkcworCQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBSZWNvcmRzIHRvIGJlIHNlcmlhbGl6ZWQKKwkJICogQHBhcmFtIHVyaVBhdGhTdHJpbmcKKwkJICogICAgICAgICAgICB0aGUgcGF0aCB0byB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gc2VyaWFsaXplIHRoZSBncmFwaHMgaW4KKwkJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCQkgKi8KKwkJcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZVJlY29yZHMoZmluYWwgTGlzdDxSZWNvcmQ+IHJlY29yZHMsCisJCQkJZmluYWwgU3RyaW5nIHVyaVBhdGhTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQlmb3IgKGZpbmFsIFJlY29yZCByZWNvcmQgOiByZWNvcmRzKSB7CisJCQkJcmVjb3JkLnNlcmlhbGl6ZSh1cmlQYXRoU3RyaW5nKTsKKwkJCX0gLy8gZm9yIGVhY2ggZ3JhcGggcmVjb3JkIGZvciBlYWNoIGNvdW50cnkKKwkJfSAvLyBzZXJpYWxpemVSZWNvcmRzCisKKwkJLyoqCisJCSAqIEBwYXJhbSB1cmlQYXRoU3RyaW5nCisJCSAqICAgICAgICAgICAgdGhlIHBhdGggdG8gdGhlIHJvb3Qgc2VyaWFsaXphdGlvbiBkaXJlY3RvcnkKKwkJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCQkgKi8KKwkJcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIFN0cmluZyB1cmlQYXRoU3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJVXRpbGl0eS5zZXJpYWxpemVJZGVudGlmaWFibGUoaWRlbnRpZmlhYmxlLCBjb252ZXJ0ZXIubm9ybWFsaXplKFVSSQorCQkJCQkuY3JlYXRlRmlsZVVSSSh1cmlQYXRoU3RyaW5nICsgRmlsZS5zZXBhcmF0b3IgKyBpZAorCQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBnZXRTZXJpYWxpemF0aW9uRmlsZU5hbWUoKSkpKTsKKwkJfSAvLyBzZXJpYWxpemUKKworCQkvKioKKwkJICogQHBhcmFtIGRlbG1pdGVyCisJCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBwbGFjZSBiZXR3ZWVuIHRoZSBhZG1pbmlzdHJhdGlvbiBsZXZlbAorCQkgKiAgICAgICAgICAgIGludGVnZXJzCisJCSAqIEByZXR1cm4gdGhlIGFkbWluaXN0cmF0aW9uIGxldmVsIGludGVnZXJzIGNvbmNhdGVuYXRlZCB0b2dldGhlciB3aXRoCisJCSAqICAgICAgICAgYSAiXyIgYXMgYSBkZWxpbWl0ZXIKKwkJICovCisJCXB1YmxpYyBPYmplY3QgZ2V0QWRtaW5MZXZlbHNBc1N0cmluZyhmaW5hbCBTdHJpbmcgZGVsbWl0ZXIpIHsKKwkJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZG1pbkxldmVscy5zaXplKCk7IGkrKykgeworCQkJCS8vIElzIHRoaXMgdGhlIGZpcnN0IG9uZT8KKwkJCQlpZiAoaSAhPSAwKSB7CisJCQkJCS8vIE5vCisJCQkJCXNiLmFwcGVuZChkZWxtaXRlcik7CisJCQkJfQorCQkJCXNiLmFwcGVuZChhZG1pbkxldmVscy5nZXQoaSkpOworCQkJfQorCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJCX0gLy8gZ2V0QWRtaW5MZXZlbHNBc1N0cmluZworCisJCS8qKgorCQkgKiBAcmV0dXJuIGEgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIFJlY29yZCAoZS5nLiwgIm5vZGUiLAorCQkgKiAgICAgICAgICJtb2RlbCIpCisJCSAqLworCQlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKTsKKworCQkvKioKKwkJICogQHJldHVybiB0aGUgc2VyaWFsaXphdGlvbiBmaWxlIG5hbWUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LmdyYXBoLkNvdW50cnlHcmFwaENyZWF0b3IuUmVjb3JkI2dldFNlcmlhbGl6YXRpb25GaWxlTmFtZSgpCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25GaWxlTmFtZSgpIHsKKwkJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihnZXRJZCgpKTsKKwkJCXNiLmFwcGVuZCgiXyIpOworCQkJc2IuYXBwZW5kKGdldEFkbWluTGV2ZWxzQXNTdHJpbmcoIl8iKSk7CisJCQlzYi5hcHBlbmQoIi4iKTsKKwkJCXNiLmFwcGVuZChnZXRPdXRwdXRUeXBlKCkpOworCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJCX0gLy8gZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lCisJfSAvLyBSZWNvcmQKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cworCSAqLworCWFic3RyYWN0IHB1YmxpYyBzdGF0aWMgY2xhc3MgR3JhcGhSZWNvcmQgZXh0ZW5kcyBSZWNvcmQgeworCisJCS8qKgorCQkgKiBUaGlzIGlzIHRoZSBwcm9wZXJ0eSBpbiBhIGRhdGEgZmlsZSB0aGF0IHNwZWNpZmllcyB0aGUgZGF0ZSByYW5nZQorCQkgKiB0aGF0IHRoZSBkYXRhIGlzIHZhbGlkIGZvci4KKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEX1BST1BFUlRZID0gIlZBTElEIjsKKworCQkvKioKKwkJICogVGhpcyBpcyB0aGUgcHJvcGVydHkgaW4gYSBkYXRhIGZpbGUgdGhhdCBzcGVjaWZpZXMgdGhlIGFkbWluaXN0cmF0aW9uCisJCSAqIGxldmVsIHRoZSBkYXRhIGFwcGxpZXMgdG8uCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRE1JTl9MRVZFTF9QUk9QRVJUWSA9ICJBRE1JTl9MRVZFTCI7CisKKwkJLyoqCisJCSAqIFRoaXMgaXMgdGhlIHByb3BlcnR5IGluIGEgZGF0YSBmaWxlIHRoYXQgc3BlY2lmaWVzIHRoZSBzb3VyY2Ugb2YgdGhlCisJCSAqIGRhdGEuCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfUFJPUEVSVFkgPSAiU09VUkNFIjsKKworCQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgU3RyaW5nPiBub25EYXRhUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisJCS8qKgorCQkgKiBUaGUgZmlsZSBuYW1lIG9mIHRoZSBwcm9wZXJ0aWVzIGZpbGUgKD8pCisJCSAqLworCQlwcm90ZWN0ZWQgU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKKworCQkvKioKKwkJICogVGhlIGR1YmxpbiBjb3JlIHNvdXJjZSBvZiB0aGUgZGF0YSB0aGF0IGNyZWF0ZWQgdGhlIGdyYXBoCisJCSAqLworCQlwcm90ZWN0ZWQgU3RyaW5nIHNvdXJjZSA9IG51bGw7CisKKwkJcHJvdGVjdGVkIGludCB5ZWFyID0gLTE7CisKKwkJcHJvdGVjdGVkIEdyYXBoUmVjb3JkKCkgeworCQkJLy8gbm90aGluZworCQl9IC8vIEdyYXBoUmVjb3JkCisKKwkJLyoqCisJCSAqIEBwYXJhbSBncmFwaAorCQkgKiBAcGFyYW0gYWRtaW5MZXZlbAorCQkgKiBAcGFyYW0geWVhcgorCQkgKi8KKwkJcHJvdGVjdGVkIEdyYXBoUmVjb3JkKGZpbmFsIENvdW50cnlDb2RlIGNvdW50cnlDb2RlLAorCQkJCWZpbmFsIFN0cmluZyBmaWxlTmFtZSwgZmluYWwgR3JhcGggZ3JhcGgsIGZpbmFsIFN0cmluZyBzb3VyY2UsCisJCQkJZmluYWwgaW50IGFkbWluTGV2ZWwsIGZpbmFsIGludCB5ZWFyKSB7CisJCQlzdXBlcihncmFwaCwgY291bnRyeUNvZGUudG9TdHJpbmcoKSwgYWRtaW5MZXZlbCk7CisJCQl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7CisJCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKwkJCXRoaXMueWVhciA9IHllYXI7CisJCX0gLy8gR3JhcGhSZWNvcmQKKworCQkvKioKKwkJICogQHJldHVybiB0aGUgZmlsZSBuYW1lCisJCSAqLworCQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldEZpbGVOYW1lKCkgeworCQkJcmV0dXJuIGZpbGVOYW1lOworCQl9CisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIGdyYXBoCisJCSAqLworCQlwdWJsaWMgZmluYWwgR3JhcGggZ2V0R3JhcGgoKSB7CisJCQlyZXR1cm4gKEdyYXBoKSBpZGVudGlmaWFibGU7CisJCX0gLy8gZ2V0R3JhcGgKKworCQkvKioKKwkJICogQHJldHVybiB0aGUgeWVhcgorCQkgKi8KKwkJcHVibGljIGZpbmFsIGludCBnZXRZZWFyKCkgeworCQkJcmV0dXJuIHllYXI7CisJCX0KKworCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKGZpbmFsIENvdW50cnlDb2RlIGNvdW50cnlDb2RlLAorCQkJCWZpbmFsIFN0cmluZyBkYXRhRmlsZVVSSVByZWZpeCwgZmluYWwgRmlsZSBkYXRhRmlsZSkgeworCisJCQl0aGlzLmlkID0gY291bnRyeUNvZGUudG9TdHJpbmcoKTsKKworCQkJZmlsZU5hbWUgPSBkYXRhRmlsZS5nZXROYW1lKCkuc3Vic3RyaW5nKDAsCisJCQkJCWRhdGFGaWxlLmdldE5hbWUoKS5pbmRleE9mKCIucHJvcGVydGllcyIpKTsKKworCQkJaWYgKGRhdGFGaWxlLmlzRmlsZSgpICYmIGRhdGFGaWxlLmNhblJlYWQoKSkgeworCQkJCWZpbmFsIFByb3BlcnRpZXMgZGF0YVByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworCQkJCXRyeSB7CisJCQkJCWZpbmFsIEZpbGVJbnB1dFN0cmVhbSBkYXRhRmlsZUlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSgKKwkJCQkJCQlkYXRhRmlsZSk7CisJCQkJCWRhdGFQcm9wZXJ0aWVzLmxvYWQoZGF0YUZpbGVJbnB1dFN0cmVhbSk7CisKKwkJCQkJY29sbGVjdE5vbkRhdGFQcm9wZXJ0aWVzKGRhdGFQcm9wZXJ0aWVzKTsKKworCQkJCQkvLyBBcmUgYWxsIG9mIHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzIGluIHRoZSBmaWxlPworCQkJCQlpZiAoYWxsTm9uRGF0YVByb3BlcnRpZXNDb2xsZWN0ZWQoKSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQlzZXRGaWVsZHNGcm9tTm9uRGF0YVByb3BlcnRpZXMoKTsKKworCQkJCQkJZmluYWwgTGlzdDxDb3VudHJ5RGF0YT4gZGF0YVNldCA9IG5ldyBBcnJheUxpc3Q8Q291bnRyeURhdGE+KCk7CisKKwkJCQkJCWZvciAoZmluYWwgRW50cnk8T2JqZWN0LCBPYmplY3Q+IGVudHJ5IDogZGF0YVByb3BlcnRpZXMKKwkJCQkJCQkJLmVudHJ5U2V0KCkpIHsKKwkJCQkJCQlmaW5hbCBTdHJpbmcgZGF0YVByb3BlcnR5S2V5ID0gKFN0cmluZykgZW50cnkKKwkJCQkJCQkJCS5nZXRLZXkoKTsKKworCQkJCQkJCS8vIElzIHRoaXMgYSBkYXRhIHByb3BlcnR5PworCQkJCQkJCWlmIChpc0RhdGFQcm9wZXJ0eShkYXRhUHJvcGVydHlLZXkpKSB7CisJCQkJCQkJCS8vIFllcworCQkJCQkJCQlmaW5hbCBDb3VudHJ5RGF0YSBkYXRhID0gY3JlYXRlRGF0YSgKKwkJCQkJCQkJCQlkYXRhUHJvcGVydHlLZXksICgoU3RyaW5nKSBlbnRyeQorCQkJCQkJCQkJCQkJLmdldFZhbHVlKCkpLnRyaW0oKSk7CisJCQkJCQkJCWRhdGFTZXQuYWRkKGRhdGEpOworCQkJCQkJCX0gLy8gaWYgZGF0YSBwcm9wZXJ0eQorCisJCQkJCQl9IC8vIGZvcgorCQkJCQkJaWRlbnRpZmlhYmxlID0gY3JlYXRlR3JhcGgoY291bnRyeUNvZGUsIGRhdGFTZXQpOworCQkJCQkJaWRlbnRpZmlhYmxlLnNldFVSSShVUkkuY3JlYXRlVVJJKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCQlJREVOVElGSUVSX0ZPUk1BVCwgZGF0YUZpbGVVUklQcmVmaXgsCisJCQkJCQkJCWNvdW50cnlDb2RlLCBmaWxlTmFtZSwgImdyYXBoIikpKTsKKwkJCQkJCWlkZW50aWZpYWJsZS5nZXREdWJsaW5Db3JlKCkuc2V0VGl0bGUoZ2V0RmlsZU5hbWUoKSk7CisJCQkJCQkvLyBpZGVudGlmaWFibGUuZ2V0RHVibGluQ29yZSgpLnNldElkZW50aWZpZXIoCisJCQkJCQkvLyBNZXNzYWdlRm9ybWF0LmZvcm1hdChJREVOVElGSUVSX0ZPUk1BVCwKKwkJCQkJCS8vIGRhdGFGaWxlVVJJUHJlZml4LCBjb3VudHJ5Q29kZSwKKwkJCQkJCS8vIGZpbGVOYW1lLCAiZ3JhcGgiKSk7CisKKwkJCQkJfSAvLyBpZiBhbGwgcHJvcGVydGllcyBhcmUgcHJlc2VudAorCQkJCQllbHNlIHsKKwkJCQkJCS8vIE5vCisJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlRoZSBmaWxlIFwiIiArIGRhdGFGaWxlLmdldE5hbWUoKQorCQkJCQkJCQkrICJcIiBpcyBtaXNzaW5nIHRoZSBmb2xsb3dpbmcgcHJvcGVyaXRlczogIgorCQkJCQkJCQkrIGdldE1pc3NpbmdOb25EYXRhUHJvcGVydGllcygpKTsKKwkJCQkJfSAvLyBlbHNlCisJCQkJCWRhdGFGaWxlSW5wdXRTdHJlYW0uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChmaW5hbCBGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOworCQkJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJU3lzdGVtLmVyci5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVHJvdWJsZSByZWFkaW5nIFwiIiArIGRhdGFGaWxlICsgIlwiIik7CisJCQl9CisJCX0vLyBpbml0aWFsaXplCisKKwkJLyoqCisJCSAqIEBwYXJhbSBkYXRhUHJvcGVydHlLZXkKKwkJICogQHBhcmFtIGRhdGFQcm9wZXJ0eQorCQkgKi8KKwkJYWJzdHJhY3QgcHJvdGVjdGVkIENvdW50cnlEYXRhIGNyZWF0ZURhdGEoU3RyaW5nIGRhdGFQcm9wZXJ0eUtleSwKKwkJCQlTdHJpbmcgZGF0YVByb3BlcnR5KTsKKworCQkvKioKKwkJICogQHBhcmFtIGNvdW50cnlDb2RlMgorCQkgKiBAcGFyYW0gZGF0YVNldAorCQkgKi8KKwkJYWJzdHJhY3QgcHJvdGVjdGVkIEdyYXBoIGNyZWF0ZUdyYXBoKENvdW50cnlDb2RlIGNvdW50cnlDb2RlMiwKKwkJCQlMaXN0PENvdW50cnlEYXRhPiBkYXRhU2V0KTsKKworCQkvKioKKwkJICogQHBhcmFtIGRhdGFQcm9wZXJ0aWVzCisJCSAqLworCQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0Tm9uRGF0YVByb3BlcnRpZXMoZmluYWwgUHJvcGVydGllcyBkYXRhUHJvcGVydGllcykgeworCQkJLy8gR2V0IHRoZSBzb3VyY2UKKwkJCWZpbmFsIFN0cmluZyBzb3VyY2UgPSBkYXRhUHJvcGVydGllcy5nZXRQcm9wZXJ0eShTT1VSQ0VfUFJPUEVSVFkpOworCQkJaWYgKHNvdXJjZSAhPSBudWxsKSB7CisJCQkJbm9uRGF0YVByb3BlcnRpZXMucHV0KFNPVVJDRV9QUk9QRVJUWSwgc291cmNlKTsKKwkJCX0KKworCQkJLy8gR2V0IHRoZSB2YWxpZCBkYXRlIHJhbmdlCisJCQlmaW5hbCBTdHJpbmcgdmFsaWQgPSBkYXRhUHJvcGVydGllcy5nZXRQcm9wZXJ0eShWQUxJRF9QUk9QRVJUWSk7CisJCQlpZiAodmFsaWQgIT0gbnVsbCkgeworCQkJCW5vbkRhdGFQcm9wZXJ0aWVzLnB1dChWQUxJRF9QUk9QRVJUWSwgdmFsaWQpOworCQkJfQorCisJCQkvLyBHZXQgdGhlIGFkbWluIGxldmVsCisJCQlmaW5hbCBTdHJpbmcgYWRtaW5MZXZlbCA9IGRhdGFQcm9wZXJ0aWVzCisJCQkJCS5nZXRQcm9wZXJ0eShBRE1JTl9MRVZFTF9QUk9QRVJUWSk7CisJCQlpZiAoYWRtaW5MZXZlbCAhPSBudWxsKSB7CisJCQkJbm9uRGF0YVByb3BlcnRpZXMucHV0KEFETUlOX0xFVkVMX1BST1BFUlRZLCBhZG1pbkxldmVsKTsKKwkJCX0KKworCQl9IC8vIGNvbGxlY3ROb25EYXRhUHJvcGVydGllcworCisJCS8qKgorCQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIGEgZGF0YSBwcm9wZXJ0eQorCQkgKi8KKwkJcHJvdGVjdGVkIGJvb2xlYW4gaXNEYXRhUHJvcGVydHkoZmluYWwgU3RyaW5nIHByb3BlcnR5KSB7CisJCQlyZXR1cm4gIShwcm9wZXJ0eS5lcXVhbHMoVkFMSURfUFJPUEVSVFkpCisJCQkJCXx8IHByb3BlcnR5LmVxdWFscyhBRE1JTl9MRVZFTF9QUk9QRVJUWSkgfHwgcHJvcGVydHkKKwkJCQkJLmVxdWFscyhTT1VSQ0VfUFJPUEVSVFkpKTsKKwkJfSAvLyBpc0RhdGFQcm9wZXJ0eQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRydWUgaWYgYWxsIG9mIHRoZSBub24tZGF0YSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBjb2xsZWN0ZWQKKwkJICovCisJCXByb3RlY3RlZCBib29sZWFuIGFsbE5vbkRhdGFQcm9wZXJ0aWVzQ29sbGVjdGVkKCkgeworCQkJcmV0dXJuIG5vbkRhdGFQcm9wZXJ0aWVzLmdldChTT1VSQ0VfUFJPUEVSVFkpICE9IG51bGwKKwkJCQkJJiYgbm9uRGF0YVByb3BlcnRpZXMuZ2V0KEFETUlOX0xFVkVMX1BST1BFUlRZKSAhPSBudWxsCisJCQkJCSYmIG5vbkRhdGFQcm9wZXJ0aWVzLmdldChWQUxJRF9QUk9QRVJUWSkgIT0gbnVsbDsKKwkJfSAvLyBhbGxEYXRhUHJvcGVydGllc0NvbGxlY3RlZAorCisJCS8qKgorCQkgKiBAcmV0dXJuIGEgc3RyaW5nIHdpdGggdGhlIG5hbWVzIG9mIHRoZSBwcm9wZXJ0aWVzIG1pc3NpbmcgZnJvbSB0aGUKKwkJICogICAgICAgICBub24gZGF0YSBwcm9wZXJ0aWVzCisJCSAqLworCQlwcm90ZWN0ZWQgQ2hhclNlcXVlbmNlIGdldE1pc3NpbmdOb25EYXRhUHJvcGVydGllcygpIHsKKwkJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisJCQlzYgorCQkJCQkuYXBwZW5kKG5vbkRhdGFQcm9wZXJ0aWVzLmdldChTT1VSQ0VfUFJPUEVSVFkpID09IG51bGwgPyAoU09VUkNFX1BST1BFUlRZICsgIiAiKQorCQkJCQkJCTogIiIpOworCQkJc2IKKwkJCQkJLmFwcGVuZChub25EYXRhUHJvcGVydGllcy5nZXQoQURNSU5fTEVWRUxfUFJPUEVSVFkpID09IG51bGwgPyAoQURNSU5fTEVWRUxfUFJPUEVSVFkgKyAiICIpCisJCQkJCQkJOiAiIik7CisJCQlzYgorCQkJCQkuYXBwZW5kKG5vbkRhdGFQcm9wZXJ0aWVzLmdldChWQUxJRF9QUk9QRVJUWSkgPT0gbnVsbCA/IChWQUxJRF9QUk9QRVJUWSArICIgIikKKwkJCQkJCQk6ICIiKTsKKwkJCXJldHVybiBzYi50b1N0cmluZygpOworCQl9IC8vIGdldE1pc3NpbmdOb25EYXRhUHJvcGVydGllcworCisJCS8qKgorCQkgKiAKKwkJICovCisJCXByb3RlY3RlZCB2b2lkIHNldEZpZWxkc0Zyb21Ob25EYXRhUHJvcGVydGllcygpIHsKKwkJCXNvdXJjZSA9IG5vbkRhdGFQcm9wZXJ0aWVzLmdldChTT1VSQ0VfUFJPUEVSVFkpOworCQkJYWRkQWRtaW5MZXZlbChJbnRlZ2VyLnBhcnNlSW50KG5vbkRhdGFQcm9wZXJ0aWVzCisJCQkJCS5nZXQoQURNSU5fTEVWRUxfUFJPUEVSVFkpKSk7CisJCQl5ZWFyID0gZXh0cmFjdFllYXIobm9uRGF0YVByb3BlcnRpZXMuZ2V0KFZBTElEX1BST1BFUlRZKSk7CisJCX0gLy8gc2V0RmllbGRzRnJvbU5vbkRhdGFQcm9wZXJ0aWVzCisKKwkJLyoqCisJCSAqIEBwYXJhbSB2YWxpZFN0cmluZworCQkgKiBAcmV0dXJuIHRoZSB5ZWFyIG9mIHRoZSBzdGFydCBkYXRlCisJCSAqLworCQlwcml2YXRlIGludCBleHRyYWN0WWVhcihmaW5hbCBTdHJpbmcgdmFsaWRTdHJpbmcpIHsKKwkJCS8vIFN0cmluZyBpcyBvZiBmb3JtYXQgc3RhcnQ9MjAwNi0uLi4uIHdlIHdhbnQgdGhlIDIwMDYKKwkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHZhbGlkU3RyaW5nLnN1YnN0cmluZyg2LCAxMCkpOworCQl9IC8vIGV4dHJhY3RZZWFyCisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIGFkbWluaXN0cmF0aW9uIGxldmVsIG9mIHRoZSBncmFwaAorCQkgKi8KKwkJcHVibGljIGludCBnZXRBZG1pbkxldmVsKCkgeworCQkJYXNzZXJ0IGFkbWluTGV2ZWxzLnNpemUoKSA9PSAxOworCQkJcmV0dXJuIGFkbWluTGV2ZWxzLmdldCgwKS5pbnRWYWx1ZSgpOworCQl9IC8vIGdldEFkbWluTGV2ZWwKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LmdyYXBoLkNvdW50cnlHcmFwaENyZWF0b3IuUmVjb3JkI2dldFNlcmlhbGl6YXRpb25GaWxlTmFtZSgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRTZXJpYWxpemF0aW9uRmlsZU5hbWUoKSB7CisJCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZmlsZU5hbWUpOworCQkJc2IuYXBwZW5kKCIuIik7CisJCQlzYi5hcHBlbmQoZ2V0T3V0cHV0VHlwZSgpKTsKKwkJCXJldHVybiBzYi50b1N0cmluZygpOworCQl9IC8vIGdldFNlcmlhbGl6YXRpb25GaWxlTmFtZQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuZ3JhcGguQ291bnRyeUdyYXBoQ3JlYXRvci5SZWNvcmQjZ2V0VHlwZSgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQkJcmV0dXJuIGdldEdyYXBoVHlwZSgpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5ncmFwaC5Db3VudHJ5R3JhcGhDcmVhdG9yLlJlY29yZCNnZXRPdXRwdXRUeXBlKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldE91dHB1dFR5cGUoKSB7CisJCQlyZXR1cm4gImdyYXBoIjsKKwkJfQorCisJCS8qKgorCQkgKiBAcmV0dXJuIGEgc3RyaW5nIHRoYXQgaXMgdGhlIG5hbWUgb2YgdGhlIGdyYXBoIHR5cGUKKwkJICovCisJCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0R3JhcGhUeXBlKCk7CisKKwl9IC8vIEdyYXBoUmVjb3JkCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGJ1bmRsZXMgYSBncmFwaCBvZiBnZW9ncmFwaGljIG5vZGVzLgorCSAqLworCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vZGVHcmFwaFJlY29yZCBleHRlbmRzIEdyYXBoUmVjb3JkIHsKKworCQkvKioKKwkJICogVGhpcyBpcyB0aGUgcHJvcGVydHkgaW4gYSBzcGF0aWFsIChHTUwpIGRhdGEgZmlsZSB0aGF0IHNwZWNpZmllcyB0aGUKKwkJICogZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YSBmb3IgdGhlIG5vZGVzLgorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBVElBTF9QUk9QRVJUWSA9ICJTUEFUSUFMX1VSSSI7CisKKwkJcHJvdGVjdGVkIFN0cmluZyBzcGF0aWFsVVJJID0gbnVsbDsKKworCQkvKioKKwkJICogCisJCSAqLworCQlwdWJsaWMgTm9kZUdyYXBoUmVjb3JkKCkgeworCQkJc3VwZXIoKTsKKwkJfSAvLyBOb2RlR3JhcGhSZWNvcmQKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VvZ3JhcGh5LmdyYXBoLkNvdW50cnlHcmFwaENyZWF0b3IyLkdyYXBoUmVjb3JkI2NyZWF0ZURhdGEoamF2YS5sYW5nLlN0cmluZywKKwkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBDb3VudHJ5RGF0YSBjcmVhdGVEYXRhKGZpbmFsIFN0cmluZyBkYXRhUHJvcGVydHlLZXksCisJCQkJZmluYWwgU3RyaW5nIGRhdGFQcm9wZXJ0eSkgeworCQkJcmV0dXJuIG5ldyBOb2RlRGF0YShkYXRhUHJvcGVydHlLZXksIGRhdGFQcm9wZXJ0eSk7CisJCX0gLy8gY3JlYXRlRGF0YQorCisJCS8qKgorCQkgKiBAcGFyYW0gZGF0YVByb3BlcnRpZXMKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0Tm9uRGF0YVByb3BlcnRpZXMoZmluYWwgUHJvcGVydGllcyBkYXRhUHJvcGVydGllcykgeworCQkJc3VwZXIuY29sbGVjdE5vbkRhdGFQcm9wZXJ0aWVzKGRhdGFQcm9wZXJ0aWVzKTsKKworCQkJLy8gR2V0IHRoZSBwb3B1bGF0aW9uIGxldmVsIGRhdGVzCisJCQlzcGF0aWFsVVJJID0gZGF0YVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoU1BBVElBTF9QUk9QRVJUWSk7CisJCQlpZiAoc3BhdGlhbFVSSSAhPSBudWxsKSB7CisJCQkJbm9uRGF0YVByb3BlcnRpZXMucHV0KFNQQVRJQUxfUFJPUEVSVFksIHNwYXRpYWxVUkkpOworCQkJfQorCQl9IC8vIGNvbGxlY3ROb25EYXRhUHJvcGVydGllcworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuZ3JhcGguQ291bnRyeUdyYXBoQ3JlYXRvci5HcmFwaFJlY29yZCNpc0RhdGFQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBib29sZWFuIGlzRGF0YVByb3BlcnR5KGZpbmFsIFN0cmluZyBwcm9wZXJ0eSkgeworCQkJcmV0dXJuICghcHJvcGVydHkuZXF1YWxzKFNQQVRJQUxfUFJPUEVSVFkpKQorCQkJCQkmJiBzdXBlci5pc0RhdGFQcm9wZXJ0eShwcm9wZXJ0eSk7CisJCX0gLy8gaXNEYXRhUHJvcGVydHkKKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIGJvb2xlYW4gYWxsTm9uRGF0YVByb3BlcnRpZXNDb2xsZWN0ZWQoKSB7CisJCQkvLyByZXR1cm4gbm9uRGF0YVByb3BlcnRpZXMuZ2V0KFNQQVRJQUxfUFJPUEVSVFkpICE9IG51bGwKKwkJCS8vICYmIHN1cGVyLmFsbE5vbkRhdGFQcm9wZXJ0aWVzQ29sbGVjdGVkKCk7CisJCQlyZXR1cm4gc3VwZXIuYWxsTm9uRGF0YVByb3BlcnRpZXNDb2xsZWN0ZWQoKTsKKwkJfSAvLyBhbGxEYXRhUHJvcGVydGllc0NvbGxlY3RlZAorCisJCS8qKgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWlzc2luZ05vbkRhdGFQcm9wZXJ0aWVzKCkgeworCQkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN1cGVyCisJCQkJCS5nZXRNaXNzaW5nTm9uRGF0YVByb3BlcnRpZXMoKSk7CisJCQlzYgorCQkJCQkuYXBwZW5kKG5vbkRhdGFQcm9wZXJ0aWVzLmdldChTUEFUSUFMX1BST1BFUlRZKSA9PSBudWxsID8gKFNQQVRJQUxfUFJPUEVSVFkgKyAiICIpCisJCQkJCQkJOiAiIik7CisJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwkJfSAvLyBnZXRNaXNzaW5nTm9uRGF0YVByb3BlcnRpZXMKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VvZ3JhcGh5LmdyYXBoLkNvdW50cnlHcmFwaENyZWF0b3IyLkdyYXBoUmVjb3JkI2NyZWF0ZUdyYXBoKG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuZ3JhcGguQ291bnRyeURpcmVjdG9yeVV0aWxpdGllcy5Db3VudHJ5Q29kZSwKKwkJICogICAgICBqYXZhLnV0aWwuTGlzdCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgR3JhcGggY3JlYXRlR3JhcGgoZmluYWwgQ291bnRyeUNvZGUgY291bnRyeUNvZGUsCisJCQkJZmluYWwgTGlzdDxDb3VudHJ5RGF0YT4gZGF0YVNldCkgeworCQkJR3JhcGggcmV0VmFsdWUgPSBudWxsOworCisJCQkvLyBXYXMgdGhlcmUgYW55IGRhdGEgZm9yIHRoaXMgY291bnRyeSBhdCB0aGlzIGFkbWluaXN0cmF0aW9uIGxldmVsPworCQkJaWYgKGRhdGFTZXQuc2l6ZSgpID4gMCkgeworCQkJCS8vIFllcworCQkJCWZpbmFsIFN0cmluZyBhZG1pbkxldmVsID0gbm9uRGF0YVByb3BlcnRpZXMKKwkJCQkJCS5nZXQoQURNSU5fTEVWRUxfUFJPUEVSVFkpOworCisJCQkJcmV0VmFsdWUgPSBHcmFwaEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoKCk7CisJCQkJZmluYWwgRHVibGluQ29yZSBkYyA9IHJldFZhbHVlLmdldER1YmxpbkNvcmUoKTsKKwkJCQlkYy5wb3B1bGF0ZSgpOworCQkJCWRjLnNldFRpdGxlKENvdW50cnlEaXJlY3RvcnlVdGlsaXRpZXMKKwkJCQkJCS5nZXRDb3VudHJ5TmFtZShjb3VudHJ5Q29kZSkKKwkJCQkJCSsgIiBOb2RlcyAoTGV2ZWwgIgorCQkJCQkJKyBhZG1pbkxldmVsCisJCQkJCQkrICIsICIKKwkJCQkJCSsgbm9uRGF0YVByb3BlcnRpZXMuZ2V0KFZBTElEX1BST1BFUlRZKQorCQkJCQkJKyAiLCAiCisJCQkJCQkrIGRhdGFTZXQuc2l6ZSgpCisJCQkJCQkrIChkYXRhU2V0LnNpemUoKSA9PSAxID8gIiBub2RlKSIgOiAiIG5vZGVzKSIpKTsKKwkJCQlkYy5zZXRTb3VyY2Uobm9uRGF0YVByb3BlcnRpZXMuZ2V0KFNPVVJDRV9QUk9QRVJUWSkpOworCQkJCWRjLnNldFZhbGlkKG5vbkRhdGFQcm9wZXJ0aWVzLmdldChWQUxJRF9QUk9QRVJUWSkpOworCisJCQkJZm9yIChmaW5hbCBDb3VudHJ5RGF0YSBub2RlRGF0YSA6IGRhdGFTZXQpIHsKKwkJCQkJcmV0VmFsdWUucHV0Tm9kZShjcmVhdGVOb2RlKEludGVnZXIucGFyc2VJbnQoYWRtaW5MZXZlbCksCisJCQkJCQkJY291bnRyeUNvZGUsIHNwYXRpYWxVUkksIG5vZGVEYXRhKSk7CisJCQkJfSAvLyBmb3IgZWFjaCBub2RlIGRhdGEKKworCQkJfSAvLyBpZiBhbnkgZGF0YQorCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGNyZWF0ZUdyYXBoCisKKwkJLyoqCisJCSAqIEByZXR1cm4gYSBub2RlIHRoYXQgcmVwcmVzZW50cyBhIGdlb2dyYXBoaWMgcGxhY2Ugd2l0aGluIHRoZSBjb250ZXh0CisJCSAqICAgICAgICAgb2YgYSBzcGVjaWZpZWQgY291bnRyeSBhdCBhIHNwZWNpZmllZCBhZG1pbmlzdHJhdGlvbiBsZXZlbAorCQkgKi8KKwkJcHJpdmF0ZSBzdGF0aWMgTm9kZSBjcmVhdGVOb2RlKGZpbmFsIGludCBhZG1pbkxldmVsLAorCQkJCWZpbmFsIENvdW50cnlDb2RlIGNvdW50cnlDb2RlLCBmaW5hbCBTdHJpbmcgc3BhdGlhbEZpbGVVUkksCisJCQkJZmluYWwgQ291bnRyeURhdGEgY291bnRyeURhdGEpIHsKKwkJCWZpbmFsIE5vZGVEYXRhIG5vZGVEYXRhID0gKE5vZGVEYXRhKSBjb3VudHJ5RGF0YTsKKwkJCWZpbmFsIFJlZ2lvbiByZXRWYWx1ZSA9IE5vZGVzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVnaW9uKCk7CisJCQlyZXRWYWx1ZS5zZXRVUkkoUmVnaW9uSW1wbC5jcmVhdGVSZWdpb25Ob2RlVVJJKG5vZGVEYXRhCisJCQkJCS5nZXRJZGVudGlmaWVyKCkpKTsKKwkJCXJldFZhbHVlLmdldER1YmxpbkNvcmUoKS5zZXRUaXRsZSgKKwkJCQkJbm9kZURhdGEuZ2V0TmFtZSgpICsgIiAiICsgbm9kZURhdGEuZ2V0SWRlbnRpZmllcigpKTsKKworCQkJZmluYWwgU3RyaW5nIGRjU3BhdGlhbCA9IChzcGF0aWFsRmlsZVVSSSA9PSBudWxsID8gbnVsbAorCQkJCQk6IFNwYXRpYWxQcm92aWRlckFkYXB0ZXIuU1RFTV9TUEFUSUFMX1NDSEVNRV9QUkVGSVgKKwkJCQkJCQkrIHNwYXRpYWxGaWxlVVJJICsgIiMiICsgbm9kZURhdGEuZ2V0SWRlbnRpZmllcigpKTsKKworCQkJcmV0VmFsdWUuZ2V0RHVibGluQ29yZSgpLnNldFNwYXRpYWwoZGNTcGF0aWFsKTsKKworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGNyZWF0ZU5vZGUKKworCQkvKioKKwkJICogQHJldHVybiAibm9kZSIKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldEdyYXBoVHlwZSgpIHsKKwkJCXJldHVybiAibm9kZSI7CisJCX0gLy8gZ2V0R3JhcGhUeXBlCisKKwl9IC8vIE5vZGVHcmFwaFJlY29yZAorCisJLyoqCisJICogVGhpcyBjbGFzcyBidW5kbGVzIGEgZ3JhcGggb2YgYXJlYSBsYWJlbHMgdG9nZXRoZXIgd2l0aCB0aGUgZGV0YWlscyBvZgorCSAqIHRoZSBsYWJlbHMuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXJlYUdyYXBoUmVjb3JkIGV4dGVuZHMgR3JhcGhSZWNvcmQgeworCisJCS8qKgorCQkgKiAKKwkJICovCisJCXB1YmxpYyBBcmVhR3JhcGhSZWNvcmQoKSB7CisJCQlzdXBlcigpOworCQl9CisKKwkJLyoqCisJCSAqIEBwYXJhbSBjb3VudHJ5Q29kZQorCQkgKiBAcGFyYW0gZmlsZU5hbWUKKwkJICogQHBhcmFtIGdyYXBoCisJCSAqIEBwYXJhbSBzb3VyY2UKKwkJICogQHBhcmFtIGFkbWluTGV2ZWwKKwkJICogQHBhcmFtIHllYXIKKwkJICovCisJCXB1YmxpYyBBcmVhR3JhcGhSZWNvcmQoZmluYWwgQ291bnRyeUNvZGUgY291bnRyeUNvZGUsCisJCQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lLCBmaW5hbCBHcmFwaCBncmFwaCwgZmluYWwgU3RyaW5nIHNvdXJjZSwKKwkJCQlmaW5hbCBpbnQgYWRtaW5MZXZlbCwgZmluYWwgaW50IHllYXIpIHsKKwkJCXN1cGVyKGNvdW50cnlDb2RlLCBmaWxlTmFtZSwgZ3JhcGgsIHNvdXJjZSwgYWRtaW5MZXZlbCwgeWVhcik7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VvZ3JhcGh5LmdyYXBoLkNvdW50cnlHcmFwaENyZWF0b3IyLkdyYXBoUmVjb3JkI2NyZWF0ZURhdGEoamF2YS5sYW5nLlN0cmluZywKKwkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBDb3VudHJ5RGF0YSBjcmVhdGVEYXRhKGZpbmFsIFN0cmluZyBkYXRhUHJvcGVydHlLZXksCisJCQkJZmluYWwgU3RyaW5nIGRhdGFQcm9wZXJ0eSkgeworCQkJcmV0dXJuIG5ldyBBcmVhRGF0YShkYXRhUHJvcGVydHlLZXksIGRhdGFQcm9wZXJ0eSk7CisJCX0gLy8gY3JlYXRlRGF0YQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW9ncmFwaHkuZ3JhcGguQ291bnRyeUdyYXBoQ3JlYXRvcjIuR3JhcGhSZWNvcmQjY3JlYXRlR3JhcGgob3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5ncmFwaC5Db3VudHJ5RGlyZWN0b3J5VXRpbGl0aWVzLkNvdW50cnlDb2RlLAorCQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBHcmFwaCBjcmVhdGVHcmFwaChmaW5hbCBDb3VudHJ5Q29kZSBjb3VudHJ5Q29kZSwKKwkJCQlmaW5hbCBMaXN0PENvdW50cnlEYXRhPiBkYXRhU2V0KSB7CisJCQlHcmFwaCByZXRWYWx1ZSA9IG51bGw7CisKKwkJCS8vIFdhcyB0aGVyZSBhbnkgZGF0YSBmb3IgdGhpcyBjb3VudHJ5IGF0IHRoaXMgYWRtaW5pc3RyYXRpb24gbGV2ZWw/CisJCQlpZiAoZGF0YVNldC5zaXplKCkgPiAwKSB7CisJCQkJLy8gWWVzCisJCQkJZmluYWwgU3RyaW5nIGFkbWluTGV2ZWwgPSBub25EYXRhUHJvcGVydGllcworCQkJCQkJLmdldChBRE1JTl9MRVZFTF9QUk9QRVJUWSk7CisKKwkJCQlyZXRWYWx1ZSA9IEdyYXBoRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGgoKTsKKwkJCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gcmV0VmFsdWUuZ2V0RHVibGluQ29yZSgpOworCQkJCWRjLnBvcHVsYXRlKCk7CisJCQkJZGMuc2V0VGl0bGUoQ291bnRyeURpcmVjdG9yeVV0aWxpdGllcworCQkJCQkJLmdldENvdW50cnlOYW1lKGNvdW50cnlDb2RlKQorCQkJCQkJKyAiIEFyZWEgKExldmVsICIKKwkJCQkJCSsgYWRtaW5MZXZlbAorCQkJCQkJKyAiLCAiCisJCQkJCQkrIG5vbkRhdGFQcm9wZXJ0aWVzLmdldChWQUxJRF9QUk9QRVJUWSkKKwkJCQkJCSsgIiwgIgorCQkJCQkJKyBkYXRhU2V0LnNpemUoKQorCQkJCQkJKyAoZGF0YVNldC5zaXplKCkgPT0gMSA/ICIgbGFiZWwpIiA6ICIgbGFiZWxzKSIpKTsKKwkJCQlkYy5zZXRTb3VyY2Uobm9uRGF0YVByb3BlcnRpZXMuZ2V0KFNPVVJDRV9QUk9QRVJUWSkpOworCQkJCWRjLnNldFZhbGlkKG5vbkRhdGFQcm9wZXJ0aWVzLmdldChWQUxJRF9QUk9QRVJUWSkpOworCQkJCWZvciAoZmluYWwgQ291bnRyeURhdGEgZGF0YUluc3RhbmNlIDogZGF0YVNldCkgeworCQkJCQlyZXRWYWx1ZS5wdXROb2RlTGFiZWwoY3JlYXRlQXJlYUxhYmVsKEludGVnZXIKKwkJCQkJCQkucGFyc2VJbnQoYWRtaW5MZXZlbCksIGNvdW50cnlDb2RlLCBkYXRhSW5zdGFuY2UpKTsKKwkJCQl9IC8vIGZvciBlYWNoIG5vZGUgZGF0YQorCisJCQl9IC8vIGlmIGFueSBkYXRhCisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gY3JlYXRlR3JhcGgKKworCQkvKioKKwkJICogQHBhcmFtIGFkbWluTGV2ZWwKKwkJICogICAgICAgICAgICB0aGUgbGV2ZWwgb2YgdGhlIGNvdW50cnkgbm9kZSB0aGUgYXJlYSBsYWJlbCBsYWJlbHMKKwkJICogQHBhcmFtIGNvdW50cnlDb2RlCisJCSAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvdW50cnkgdG8gd2hpY2ggdGhlIGxhYmVsZWQgbm9kZQorCQkgKiAgICAgICAgICAgIGJlbG9uZ3MKKwkJICogQHBhcmFtIGFyZWFEYXRhCisJCSAqICAgICAgICAgICAgdGhlIGFyZWEgZGF0YQorCQkgKiBAcmV0dXJuIGFuIEFyZWEgbGFiZWwKKwkJICovCisJCXByb3RlY3RlZCBBcmVhTGFiZWwgY3JlYXRlQXJlYUxhYmVsKGZpbmFsIGludCBhZG1pbkxldmVsLAorCQkJCWZpbmFsIENvdW50cnlDb2RlIGNvdW50cnlDb2RlLCBmaW5hbCBDb3VudHJ5RGF0YSBjb3VudHJ5RGF0YSkgeworCQkJZmluYWwgQXJlYURhdGEgYXJlYURhdGEgPSAoQXJlYURhdGEpIGNvdW50cnlEYXRhOworCQkJZmluYWwgQXJlYUxhYmVsIHJldFZhbHVlID0gTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJLmNyZWF0ZUFyZWFMYWJlbCgpOworCQkJcmV0VmFsdWUuc2V0VVJJKEFyZWFMYWJlbEltcGwuY3JlYXRlQXJlYUxhYmVsVVJJKGFkbWluTGV2ZWwsCisJCQkJCWNvdW50cnlDb2RlLnRvU3RyaW5nKCksIGFyZWFEYXRhLmdldElkZW50aWZpZXIoKSkpOworCQkJcmV0VmFsdWUuc2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZChSZWdpb25JbXBsCisJCQkJCS5jcmVhdGVSZWdpb25Ob2RlVVJJKGFyZWFEYXRhLmdldElkZW50aWZpZXIoKSkpOworCQkJcmV0VmFsdWUuZ2V0Q3VycmVudEFyZWFWYWx1ZSgpLnNldEFyZWEoCisJCQkJCURvdWJsZS5wYXJzZURvdWJsZShhcmVhRGF0YS5nZXRBcmVhKCkpKTsKKworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGNyZWF0ZUFyZWFMYWJlbAorCisJCS8qKgorCQkgKiBAcmV0dXJuICJhcmVhIgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0R3JhcGhUeXBlKCkgeworCQkJcmV0dXJuICJhcmVhIjsKKwkJfSAvLyBnZXRHcmFwaFR5cGUKKwl9IC8vIEFyZWFHcmFwaFJlY29yZAorCisJLyoqCisJICogVGhpcyBjbGFzcyBidW5kbGVzIGEgZ3JhcGggb2YgcG9wdWxhdGlvbiBsYWJlbHMgdG9nZXRoZXIgd2l0aCB0aGUgZGV0YWlscworCSAqIG9mIHRoZSBsYWJlbHMuIEZvciBpbnN0YW5jZSwgdGhlIHllYXIgb2YgdGhlIGRhdGEsIHRoZSBhZG1pbmlzdHJhdGlvbgorCSAqIGxldmVsIGFuZCB0aGUgcG9wdWxhdGlvbiBpZGVudGlmaWVyLgorCSAqLworCXByaXZhdGUgc3RhdGljIGNsYXNzIFBvcHVsYXRpb25HcmFwaFJlY29yZCBleHRlbmRzIEdyYXBoUmVjb3JkIHsKKworCQkvKioKKwkJICogVGhpcyBpcyB0aGUgcHJvcGVydHkgaW4gYSBwb3B1bGF0aW9uIGRhdGEgZmlsZSB0aGF0IHNwZWNpZmllcyB0aGUKKwkJICogcG9wdWxhdGlvbiBpZGVudGlmaWVyLgorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9QVUxBVElPTl9QUk9QRVJUWSA9ICJQT1BVTEFUSU9OIjsKKworCQlwcml2YXRlIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllciA9IG51bGw7CisKKwkJcHJvdGVjdGVkIFBvcHVsYXRpb25HcmFwaFJlY29yZCgpIHsKKwkJCXN1cGVyKCk7CisJCX0KKworCQkvKioKKwkJICogQHBhcmFtIHBvcHVsYXRpb25HcmFwaAorCQkgKiBAcGFyYW0gYWRtaW5MZXZlbAorCQkgKiBAcGFyYW0geWVhcgorCQkgKiBAcGFyYW0gcG9wdWxhdGlvbklkZW50aWZpZXIKKwkJICovCisJCXByb3RlY3RlZCBQb3B1bGF0aW9uR3JhcGhSZWNvcmQoZmluYWwgQ291bnRyeUNvZGUgY291bnRyeUNvZGUsCisJCQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lLCBmaW5hbCBHcmFwaCBwb3B1bGF0aW9uR3JhcGgsCisJCQkJZmluYWwgU3RyaW5nIHNvdXJjZSwgZmluYWwgaW50IGFkbWluTGV2ZWwsIGZpbmFsIGludCB5ZWFyLAorCQkJCWZpbmFsIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllcikgeworCQkJc3VwZXIoY291bnRyeUNvZGUsIGZpbGVOYW1lLCBwb3B1bGF0aW9uR3JhcGgsIHNvdXJjZSwgYWRtaW5MZXZlbCwKKwkJCQkJeWVhcik7CisJCQl0aGlzLnBvcHVsYXRpb25JZGVudGlmaWVyID0gcG9wdWxhdGlvbklkZW50aWZpZXI7CisJCX0KKworCQkvKioKKwkJICogCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgc2V0RmllbGRzRnJvbU5vbkRhdGFQcm9wZXJ0aWVzKCkgeworCQkJc3VwZXIuc2V0RmllbGRzRnJvbU5vbkRhdGFQcm9wZXJ0aWVzKCk7CisJCQlwb3B1bGF0aW9uSWRlbnRpZmllciA9IG5vbkRhdGFQcm9wZXJ0aWVzLmdldChQT1BVTEFUSU9OX1BST1BFUlRZKTsKKwkJfSAvLyBzZXRGaWVsZHNGcm9tTm9uRGF0YVByb3BlcnRpZXMKKworCQkvKioKKwkJICogQHBhcmFtIGNvdW50cnlDb2RlCisJCSAqIEBwYXJhbSBkYXRhU2V0CisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEdyYXBoIGNyZWF0ZUdyYXBoKGZpbmFsIENvdW50cnlDb2RlIGNvdW50cnlDb2RlLAorCQkJCWZpbmFsIExpc3Q8Q291bnRyeURhdGE+IGRhdGFTZXQpIHsKKwkJCUdyYXBoIHJldFZhbHVlID0gbnVsbDsKKworCQkJLy8gV2FzIHRoZXJlIGFueSBkYXRhIGZvciB0aGlzIGNvdW50cnkgYXQgdGhpcyBhZG1pbmlzdHJhdGlvbiBsZXZlbD8KKwkJCWlmIChkYXRhU2V0LnNpemUoKSA+IDApIHsKKwkJCQkvLyBZZXMKKwkJCQlmaW5hbCBTdHJpbmcgYWRtaW5MZXZlbCA9IG5vbkRhdGFQcm9wZXJ0aWVzCisJCQkJCQkuZ2V0KEFETUlOX0xFVkVMX1BST1BFUlRZKTsKKworCQkJCXJldFZhbHVlID0gR3JhcGhGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaCgpOworCQkJCWZpbmFsIER1YmxpbkNvcmUgZGMgPSByZXRWYWx1ZS5nZXREdWJsaW5Db3JlKCk7CisJCQkJZGMucG9wdWxhdGUoKTsKKwkJCQlkYy5zZXRUaXRsZShDb3VudHJ5RGlyZWN0b3J5VXRpbGl0aWVzCisJCQkJCQkuZ2V0Q291bnRyeU5hbWUoY291bnRyeUNvZGUpCisJCQkJCQkrICIgUG9wdWxhdGlvbiAoTGV2ZWwgIgorCQkJCQkJKyBhZG1pbkxldmVsCisJCQkJCQkrICIsICIKKwkJCQkJCSsgbm9uRGF0YVByb3BlcnRpZXMuZ2V0KFBPUFVMQVRJT05fUFJPUEVSVFkpCisJCQkJCQkrICIsICIKKwkJCQkJCSsgbm9uRGF0YVByb3BlcnRpZXMuZ2V0KFZBTElEX1BST1BFUlRZKQorCQkJCQkJKyAiLCAiCisJCQkJCQkrIGRhdGFTZXQuc2l6ZSgpCisJCQkJCQkrIChkYXRhU2V0LnNpemUoKSA9PSAxID8gIiBsYWJlbCkiIDogIiBsYWJlbHMpIikpOworCQkJCWRjLnNldFNvdXJjZShub25EYXRhUHJvcGVydGllcy5nZXQoU09VUkNFX1BST1BFUlRZKSk7CisJCQkJZGMuc2V0VmFsaWQobm9uRGF0YVByb3BlcnRpZXMuZ2V0KFZBTElEX1BST1BFUlRZKSk7CisKKwkJCQlmb3IgKGZpbmFsIENvdW50cnlEYXRhIHBvcHVsYXRpb25EYXRhIDogZGF0YVNldCkgeworCQkJCQlyZXRWYWx1ZS5wdXROb2RlTGFiZWwoY3JlYXRlUG9wdWxhdGlvbkxhYmVsKEludGVnZXIKKwkJCQkJCQkucGFyc2VJbnQoYWRtaW5MZXZlbCksIGNvdW50cnlDb2RlLAorCQkJCQkJCW5vbkRhdGFQcm9wZXJ0aWVzLmdldChQT1BVTEFUSU9OX1BST1BFUlRZKSwKKwkJCQkJCQlwb3B1bGF0aW9uRGF0YSkpOworCQkJCX0gLy8gZm9yIGVhY2ggbm9kZSBkYXRhCisKKwkJCX0gLy8gaWYgYW55IGRhdGEKKwkJCXJldHVybiByZXRWYWx1ZTsKKwkJfSAvLyBjcmVhdGVHcmFwaAorCisJCS8qKgorCQkgKiBAcGFyYW0gYWRtaW5MZXZlbAorCQkgKiAgICAgICAgICAgIHRoZSBsZXZlbCBvZiB0aGUgY291bnRyeSBub2RlIHRoZSBhcmVhIGxhYmVsIGxhYmVscworCQkgKiBAcGFyYW0gY291bnRyeUNvZGUKKwkJICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBvZiB0aGUgY291bnRyeSB0byB3aGljaCB0aGUgbGFiZWxlZCBub2RlCisJCSAqICAgICAgICAgICAgYmVsb25ncworCQkgKiBAcGFyYW0gcG9wdWxhdGlvbklkZW50aWZpZXIKKwkJICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBvZiB0aGUgcG9wdWxhdGlvbgorCQkgKiBAcGFyYW0gcG9wdWxhdGlvbkRhdGEKKwkJICogICAgICAgICAgICB0aGUgZGF0YSB0byB1c2UgdG8gaW5pdGlhbGl6ZSB0aGUgcG9wdWxhdGlvbiBsYWJlbAorCQkgKiBAcmV0dXJuIGEgcG9wdWxhdGlvbiBsYWJlbAorCQkgKi8KKwkJcHJpdmF0ZSBzdGF0aWMgUG9wdWxhdGlvbkxhYmVsIGNyZWF0ZVBvcHVsYXRpb25MYWJlbCgKKwkJCQlmaW5hbCBpbnQgYWRtaW5MZXZlbCwgZmluYWwgQ291bnRyeUNvZGUgY291bnRyeUNvZGUsCisJCQkJZmluYWwgU3RyaW5nIHBvcHVsYXRpb25JZGVudGlmaWVyLCBmaW5hbCBDb3VudHJ5RGF0YSBkYXRhU2V0KSB7CisJCQlmaW5hbCBQb3B1bGF0aW9uRGF0YSBwb3B1bGF0aW9uRGF0YSA9IChQb3B1bGF0aW9uRGF0YSkgZGF0YVNldDsKKwkJCWZpbmFsIFBvcHVsYXRpb25MYWJlbCByZXRWYWx1ZSA9IExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCS5jcmVhdGVQb3B1bGF0aW9uTGFiZWwoKTsKKwkJCXJldFZhbHVlLnNldFVSSShQb3B1bGF0aW9uTGFiZWxJbXBsLmNyZWF0ZVBvcHVsYXRpb25MYWJlbFVSSSgKKwkJCQkJYWRtaW5MZXZlbCwgY291bnRyeUNvZGUudG9TdHJpbmcoKSwgcG9wdWxhdGlvbklkZW50aWZpZXIsCisJCQkJCSIyMDA2IiwgcG9wdWxhdGlvbkRhdGEuZ2V0Tm9kZUNvZGUoKSkpOworCQkJcmV0VmFsdWUuc2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZChSZWdpb25JbXBsCisJCQkJCS5jcmVhdGVSZWdpb25Ob2RlVVJJKHBvcHVsYXRpb25EYXRhLmdldE5vZGVDb2RlKCkpKTsKKwkJCXJldFZhbHVlLnNldFBvcHVsYXRpb25JZGVudGlmaWVyKHBvcHVsYXRpb25JZGVudGlmaWVyKTsKKwkJCXJldFZhbHVlLmdldEN1cnJlbnRQb3B1bGF0aW9uVmFsdWUoKS5zZXRDb3VudCgKKwkJCQkJTG9uZy5wYXJzZUxvbmcocG9wdWxhdGlvbkRhdGEuZ2V0Q291bnQoKSkpOworCisJCQkvLyBXYXMgYW4gYXJlYSBzcGVjaWZpZWQgZm9yIHRoZSBwb3B1bGF0aW9uPworCQkJaWYgKHBvcHVsYXRpb25EYXRhLmFyZWEgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCXJldFZhbHVlLnNldFBvcHVsYXRlZEFyZWEoRG91YmxlCisJCQkJCQkucGFyc2VEb3VibGUocG9wdWxhdGlvbkRhdGEuYXJlYSkpOworCQkJfQorCisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gY3JlYXRlUG9wdWxhdGlvbkxhYmVsCisKKwkJLyoqCisJCSAqIEBwYXJhbSBkYXRhUHJvcGVydHlLZXkKKwkJICogQHBhcmFtIGRhdGFQcm9wZXJ0eQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBDb3VudHJ5RGF0YSBjcmVhdGVEYXRhKGZpbmFsIFN0cmluZyBkYXRhUHJvcGVydHlLZXksCisJCQkJZmluYWwgU3RyaW5nIGRhdGFQcm9wZXJ0eSkgeworCQkJcmV0dXJuIG5ldyBQb3B1bGF0aW9uRGF0YShkYXRhUHJvcGVydHlLZXksIGRhdGFQcm9wZXJ0eSk7CisJCX0gLy8gY3JlYXRlRGF0YQorCisJCS8qKgorCQkgKiBAcGFyYW0gZGF0YVByb3BlcnRpZXMKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0Tm9uRGF0YVByb3BlcnRpZXMoZmluYWwgUHJvcGVydGllcyBkYXRhUHJvcGVydGllcykgeworCQkJc3VwZXIuY29sbGVjdE5vbkRhdGFQcm9wZXJ0aWVzKGRhdGFQcm9wZXJ0aWVzKTsKKworCQkJLy8gR2V0IHRoZSBwb3B1bGF0aW9uIGxldmVsIGRhdGVzCisJCQlmaW5hbCBTdHJpbmcgcG9wdWxhdGlvbklkZW50aWZpZXIgPSBkYXRhUHJvcGVydGllcworCQkJCQkuZ2V0UHJvcGVydHkoUE9QVUxBVElPTl9QUk9QRVJUWSk7CisJCQlpZiAocG9wdWxhdGlvbklkZW50aWZpZXIgIT0gbnVsbCkgeworCQkJCW5vbkRhdGFQcm9wZXJ0aWVzCisJCQkJCQkucHV0KFBPUFVMQVRJT05fUFJPUEVSVFksIHBvcHVsYXRpb25JZGVudGlmaWVyKTsKKwkJCX0KKwkJfSAvLyBjb2xsZWN0Tm9uRGF0YVByb3BlcnRpZXMKKworCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkgeworCQkJcmV0dXJuIHBvcHVsYXRpb25JZGVudGlmaWVyOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBib29sZWFuIGlzRGF0YVByb3BlcnR5KGZpbmFsIFN0cmluZyBwcm9wZXJ0eSkgeworCQkJcmV0dXJuICghcHJvcGVydHkuZXF1YWxzKFBPUFVMQVRJT05fUFJPUEVSVFkpKQorCQkJCQkmJiBzdXBlci5pc0RhdGFQcm9wZXJ0eShwcm9wZXJ0eSk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIGJvb2xlYW4gYWxsTm9uRGF0YVByb3BlcnRpZXNDb2xsZWN0ZWQoKSB7CisJCQlyZXR1cm4gbm9uRGF0YVByb3BlcnRpZXMuZ2V0KFBPUFVMQVRJT05fUFJPUEVSVFkpICE9IG51bGwKKwkJCQkJJiYgc3VwZXIuYWxsTm9uRGF0YVByb3BlcnRpZXNDb2xsZWN0ZWQoKTsKKwkJfSAvLyBhbGxEYXRhUHJvcGVydGllc0NvbGxlY3RlZAorCisJCS8qKgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWlzc2luZ05vbkRhdGFQcm9wZXJ0aWVzKCkgeworCQkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN1cGVyCisJCQkJCS5nZXRNaXNzaW5nTm9uRGF0YVByb3BlcnRpZXMoKSk7CisKKwkJCXNiCisJCQkJCS5hcHBlbmQobm9uRGF0YVByb3BlcnRpZXMuZ2V0KFBPUFVMQVRJT05fUFJPUEVSVFkpID09IG51bGwgPyAoUE9QVUxBVElPTl9QUk9QRVJUWSArICIgIikKKwkJCQkJCQk6ICIiKTsKKwkJCXJldHVybiBzYi50b1N0cmluZygpOworCQl9IC8vIGdldE1pc3NpbmdOb25EYXRhUHJvcGVydGllcworCisJCS8qKgorCQkgKiBAcmV0dXJuICJwb3B1bGF0aW9uIgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0R3JhcGhUeXBlKCkgeworCQkJcmV0dXJuICJwb3B1bGF0aW9uIjsKKwkJfSAvLyBnZXRHcmFwaFR5cGUKKwl9IC8vIFBvcHVsYXRpb25HcmFwaFJlY29yZAorCit9IC8vIENvdW50cnlHcmFwaENyZWF0b3IyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9Db3VudHJ5TW9kZWxDcmVhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9Db3VudHJ5TW9kZWxDcmVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkYTg1NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL0NvdW50cnlNb2RlbENyZWF0b3IuamF2YQpAQCAtMCwwICsxLDU5NyBAQAorLy8gQ291bnRyeU1vZGVsQ3JlYXRvci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuQ291bnRyeURpcmVjdG9yeVV0aWxpdGllcy5Db3VudHJ5Q29kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuQ291bnRyeUdyYXBoQ3JlYXRvci5EYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuQ291bnRyeUdyYXBoQ3JlYXRvci5HcmFwaFJlY29yZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuQ291bnRyeUdyYXBoQ3JlYXRvci5SZWNvcmQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGF1b3RtYXRlIHRoZSBnZW5lcmF0aW9uIG9mIG1vZGVscyBpbiBTVEVNLgorICovCitwdWJsaWMgY2xhc3MgQ291bnRyeU1vZGVsQ3JlYXRvciB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdW5kZXIgdGhlCisJICoge0BsaW5rIENvdW50cnlHcmFwaENyZWF0b3IjUk9PVF9PVVRQVVRfRElSfSB0aGF0IGNvbnRhaW5zIHRoZSBkaXJlY3RvcmllcworCSAqIHRoYXQgY29udGFpbiB0aGUgbW9kZWxzIHRoYXQgZGVmaW5lIHRoZSBnZW9ncmFwaGllcyBhbmQgZmVhdHVyZXMgb2YKKwkgKiBjb3VudHJpZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfT1VUUFVUX0RJUiA9ICJtb2RlbHMiOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgcGF0aCB0byB0aGUgY291bnRyeSBtb2RlbHMgZGlyZWN0b3J5CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09VTlRSWV9NT0RFTF9QQVRIID0gQ291bnRyeUdyYXBoQ3JlYXRvci5ST09UX09VVFBVVF9ESVIKKwkJCSsgRmlsZS5zZXBhcmF0b3IKKwkJCSsgTU9ERUxfT1VUUFVUX0RJUgorCQkJKyBGaWxlLnNlcGFyYXRvcgorCQkJKyBDb3VudHJ5R3JhcGhDcmVhdG9yLkNPVU5UUllfRElSOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgaWQgb2YgdGhlIGV4dGVuc2lvbiBwb2ludCBleHRlbmRlZCBieSBncmFwaHMgdGhhdCBhcmUgcGx1Z2dlZAorCSAqIGludG8gU1RFTQorCSAqLworCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX01PREVMX0VYVEVOU0lPTl9QT0lOVCA9IENvbnN0YW50cy5JRF9ST09UCisJLy8gKyAiLmNvcmUubW9kZWwiOworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGlkIG9mIHRoZSB0b3AtbGV2ZWwgU1RFTSBjYXRlZ29yeSBmb3IgZ3JhcGhzCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfU1RFTV9NT0RFTF9DQVRFR09SWSA9IENvbnN0YW50cy5JRF9ST09UCisJCQkrICIuY29yZS5tb2RlbCI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBpZCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50IGV4dGVuZGVkIGJ5IG1vZGVscyB3aXRoIGdlb2dyYXBoaWMKKwkgKiBpbmZvcm1hdGlvbiB0aGF0IGFyZSBwbHVnZ2VkIGludG8gU1RFTQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX01PREVMX0dFT0dSQVBIWV9DQVRFR09SWSA9IElEX1NURU1fTU9ERUxfQ0FURUdPUlkKKwkJCSsgIi4iICsgQ291bnRyeUdyYXBoQ3JlYXRvci5HRU9HUkFQSFkudG9Mb3dlckNhc2UoKTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGlkIG9mIHRoZSBleHRlbnNpb24gcG9pbnQgZXh0ZW5kZWQgYnkgbW9kZWxzIHdpdGggZ2VvZ3JhcGhpYworCSAqIHBvbGl0aWNhbCBpbmZvcm1hdGlvbiB0aGF0IGFyZSBwbHVnZ2VkIGludG8gU1RFTQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX01PREVMX1BPTElUSUNBTF9DQVRFR09SWSA9IElEX01PREVMX0dFT0dSQVBIWV9DQVRFR09SWQorCQkJKyAiLiIgKyBDb3VudHJ5R3JhcGhDcmVhdG9yLlBPTElUSUNBTC50b0xvd2VyQ2FzZSgpOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgaWQgb2YgdGhlIGV4dGVuc2lvbiBwb2ludCBleHRlbmRlZCBieSBtb2RlbHMgd2l0aCBnZW9ncmFwaGljCisJICogcG9saXRpY2FsIGluZm9ybWF0aW9uIHRoYXQgYXJlIHBsdWdnZWQgaW50byBTVEVNCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfTU9ERUxfQ09VTlRSSUVTX0NBVEVHT1JZID0gSURfTU9ERUxfUE9MSVRJQ0FMX0NBVEVHT1JZCisJCQkrICIuIiArIENvdW50cnlHcmFwaENyZWF0b3IuQ09VTlRSSUVTLnRvTG93ZXJDYXNlKCk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBmb3JtYXQgb2YgdGhlIGdlbmVyYXRlZCBOTFMga2V5cyBmb3IgY2F0ZWdvcmllcworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5MU19DQVRFR09SWV9LRVlfRk9STUFUID0gIl9VSV97MH1fbW9kZWxfY2F0ZWdvcnkiOworCisJLyoqCisJICogQHBhcmFtIGFyZ3MKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCS8vIE5vdyBjcmVhdGUgdGhlIGdyYXBocworCQlmaW5hbCBMaXN0PENvdW50cnlDb2RlPiBjb3VudHJ5Q29kZXMgPSBDb3VudHJ5RGlyZWN0b3J5VXRpbGl0aWVzCisJCQkJLmdldEFsbENvdW50cnlDb2RlcygpOworCQlDb2xsZWN0aW9ucy5zb3J0KGNvdW50cnlDb2Rlcyk7CisKKwkJZmluYWwgQ291bnRyeU1vZGVsQ3JlYXRvciBjbWMgPSBuZXcgQ291bnRyeU1vZGVsQ3JlYXRvcigpOworCQlmaW5hbCBNYXA8Q291bnRyeUNvZGUsIExpc3Q8Q291bnRyeU1vZGVsUmVjb3JkPj4gY291bnRyeU1vZGVscyA9IGNtYworCQkJCS5jcmVhdGVDb3VudHJ5TW9kZWxzKCk7CisJCXRyeSB7CisJCQljbWMuc2VyaWFsaXplQ291bnRyeU1vZGVscyhjb3VudHJ5TW9kZWxzLCBDT1VOVFJZX01PREVMX1BBVEgpOworCisJCQlMaXN0PE1hcDxDb3VudHJ5Q29kZSwgTGlzdDxDb3VudHJ5TW9kZWxSZWNvcmQ+Pj4gbW9kZWxSZWNvcmRzID0gbmV3IEFycmF5TGlzdDxNYXA8Q291bnRyeUNvZGUsIExpc3Q8Q291bnRyeU1vZGVsUmVjb3JkPj4+KCk7CisJCQltb2RlbFJlY29yZHMuYWRkKGNvdW50cnlNb2RlbHMpOworCisJCQlpbnQgbWF4QWRtaW5MZXZlbCA9IDA7CisJCQltYXhBZG1pbkxldmVsID0gTWF0aC5tYXgobWF4QWRtaW5MZXZlbCwKKwkJCQkJZ2V0TWF4QWRtaW5MZXZlbChjb3VudHJ5TW9kZWxzKSk7CisKKwkJCWZpbmFsIEZpbGUgbW9kZWxFeHRlbnNpb25GaWxlID0gbmV3IEZpbGUoQ09VTlRSWV9NT0RFTF9QQVRICisJCQkJCSsgQ291bnRyeUdyYXBoQ3JlYXRvci5HUkFQSF9FWFRFTlNJT05fUE9JTlRfRklMRV9OQU1FKTsKKwkJCWZpbmFsIEZpbGUgbW9kZWxQbHVnaW5Qcm9wZXJ0aWVzRmlsZSA9IG5ldyBGaWxlKAorCQkJCQlDT1VOVFJZX01PREVMX1BBVEgKKwkJCQkJCQkrIENvdW50cnlHcmFwaENyZWF0b3IuR1JBUEhfUExVR0lOX1BST1BFUlRJRVNfUE9JTlRfRklMRV9OQU1FKTsKKworCQkJZmluYWwgQnVmZmVyZWRXcml0ZXIgbW9kZWxPdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoCisJCQkJCW1vZGVsRXh0ZW5zaW9uRmlsZSkpOworCisJCQlmaW5hbCBCdWZmZXJlZFdyaXRlciBwbHVnaW5PdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoCisJCQkJCW1vZGVsUGx1Z2luUHJvcGVydGllc0ZpbGUpKTsKKworCQkJLy8gQ3JlYXRlIGEgc25pcHBldCBvZiB4bWwgdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gYSBwbHVnaW4ueG1sIGZpbGUKKwkJCS8vIHRvIHBsdWcgaW50byBTVEVNIHRoZSBncmFwaHMgd2UganVzdCBzZXJpYWxpemVkLgorCQkJY21jLmdlbmVyYXRlTW9kZWxFeHRlbnNpb25Qb2ludFhNTChtb2RlbFJlY29yZHMsIGNvdW50cnlDb2RlcywKKwkJCQkJbWF4QWRtaW5MZXZlbCwgbW9kZWxPdXQsIHBsdWdpbk91dCk7CisJCX0gLy8gdHJ5CisJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfSAvLyBtYWluCisKKwkvKioKKwkgKiBAcGFyYW0gbW9kZWxzCisJICogICAgICAgICAgICBhIG1hcCBiZXR3ZWVuIGNvdW50cnkgY29kZSBhbmQgbGlzdCBvZiBtb2RlbCByZWNvcmRzIGZvciB0aGUKKwkgKiAgICAgICAgICAgIGNvdW50cnkKKwkgKiBAcGFyYW0gdXJpUGF0aFN0cmluZworCSAqICAgICAgICAgICAgdGhlIHBhdGggdG8gdGhlIHJvb3Qgb2YgdGhlIGZvbGRlciB0byBzZXJpYWxpemUgdGhlIG1vZGVscyB0bworCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwcml2YXRlIHZvaWQgc2VyaWFsaXplQ291bnRyeU1vZGVscygKKwkJCWZpbmFsIE1hcDxDb3VudHJ5Q29kZSwgTGlzdDxDb3VudHJ5TW9kZWxSZWNvcmQ+PiBtb2RlbHMsCisJCQlmaW5hbCBTdHJpbmcgdXJpUGF0aFN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlmb3IgKENvdW50cnlDb2RlIGNvdW50cnlDb2RlIDogbW9kZWxzLmtleVNldCgpKSB7CisJCQlmb3IgKENvdW50cnlNb2RlbFJlY29yZCBtb2RlbFJlY29yZCA6IG1vZGVscy5nZXQoY291bnRyeUNvZGUpKSB7CisJCQkJbW9kZWxSZWNvcmQuc2VyaWFsaXplKHVyaVBhdGhTdHJpbmcpOworCQkJfSAvLyBmb3IgZWFjaCBtb2RlbCByZWNvcmQgZm9yIGVhY2ggY291bnRyeQorCQl9IC8vIGZvciBlYWNoIGNvdW50cnkgY29kZQorCisJCS8vCQkKKwkJLy8gZm9yIChDb3VudHJ5Q29kZSBjb3VudHJ5Q29kZSA6IGdyYXBocy5rZXlTZXQoKSkgeworCQkvLyBmb3IgKEdyYXBoUmVjb3JkIGdyYXBoUmVjb3JkIDogZ3JhcGhzLmdldChjb3VudHJ5Q29kZSkpIHsKKwkJLy8gZ3JhcGhSZWNvcmQuc2VyaWFsaXplKHVyaVBhdGhTdHJpbmcpOworCQkvLyB9IC8vIGZvciBlYWNoIGdyYXBoIHJlY29yZCBmb3IgZWFjaCBjb3VudHJ5CisJCS8vIH0gLy8gZm9yIGVhY2ggY291bnRyeSBjb2RlCisKKwl9IC8vIHNlcmlhbGl6ZUNvdW50cnlNb2RlbHMKKworCS8qKgorCSAqIEBwYXJhbSBjb3VudHJ5Tm9kZUdyYXBocworCSAqICAgICAgICAgICAgYSBsaXN0IG9mIG1hcHMgb2YgbW9kZWxzIG9mIG5vZGVzIGZvciBjb3VudHJpZXMgZm9yIGVhY2gKKwkgKiAgICAgICAgICAgIGFkbWluc3RyYXRpb24gbGV2ZWwKKwkgKiBAcGFyYW0gbW9kZWxPdXQKKwkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgd3JpdGVyIGZvciB0aGUgcGx1Z2luLnhtbCBmaWxlIGNvbnRlbnRzCisJICogQHBhcmFtIHBsdWdpbk91dAorCSAqICAgICAgICAgICAgdGhlIG91dHB1dCB3cml0ZXIgZm9yIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRlbnRzCisJICovCisJcHJpdmF0ZSB2b2lkIGdlbmVyYXRlTW9kZWxFeHRlbnNpb25Qb2ludFhNTCgKKwkJCWZpbmFsIExpc3Q8TWFwPENvdW50cnlDb2RlLCBMaXN0PENvdW50cnlNb2RlbFJlY29yZD4+PiBtb2RlbFJlY29yZHMsCisJCQlMaXN0PENvdW50cnlDb2RlPiBjb3VudHJ5Q29kZXMsIGZpbmFsIGludCBtYXhBZG1pbkxldmVsLAorCQkJZmluYWwgV3JpdGVyIG1vZGVsT3V0LCBmaW5hbCBXcml0ZXIgcGx1Z2luT3V0KSB7CisKKwkJLy8gVGhlIGR1YmxpbiBjb3JlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWxzIGxpa2VseSBzaGFyZSBjb21tb24KKwkJLy8gYXR0cmlidXRlcywgd2UgY2FuIGF2b2lkIGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSBmaWxlcyB3ZSBnZW5lcmF0ZQorCQkvLyBieSBmaW5kaW5nIHRoZSBkdXBsaWNhdGUgZW50cmllcyBhbmQgb25seSBnZW5lcmF0aW5nIGEgc2luZ2xlIGtleSBmb3IKKwkJLy8gdGhlIGdlbmVyYXRlZCBwbHVnaW5zIGZpbGUgY29udGVudC4KKwkJZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBkY1ZhbHVlS2V5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKwkJLy8gV2UgYWxzbyBkb24ndCB3YW50IHRvIGdlbmVyYXRlIGR1cGxpY2F0ZSBjb3VudHJ5IGNhdGVnb3JpZXMKKwkJZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBjb3VudHJ5Q2F0ZWdvcmllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisJCXRyeSB7CisJCQltb2RlbE91dC53cml0ZSgiPCEtLSBHZW5lcmF0ZWQgY29udGVudC4gIERvIG5vdCBtb2RpZnkgLS0+XG4iKTsKKworCQkJbW9kZWxPdXQud3JpdGUoTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCUNvdW50cnlHcmFwaENyZWF0b3IuWE1MX0VYVEVOU0lPTl9QT0lOVF9PUEVOLAorCQkJCQluZXcgT2JqZWN0W10geyBDb25zdGFudHMuSURfTU9ERUxfRVhURU5TSU9OX1BPSU5UIH0pKTsKKwkJCW1vZGVsT3V0LndyaXRlKCJcbiIpOworCisJCQlwbHVnaW5PdXQKKwkJCQkJLndyaXRlKCIjTW9kZWwgTkxTIEtleXMuICBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCwgZG8gbm90IG1vZGlmeS4gIgorCQkJCQkJCSsgQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkKKwkJCQkJCQkrICIgIgorCQkJCQkJCSsgU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLm5hbWUiKSArICJcbiIpOworCisJCQkvLyBPdXRwdXQgdGhlIGNhdGVnb3JpZXMgdGhhdCBtYWtlIHVwIHRoZSBoaWVyYXJjaHkgZm9yIHRoZSBncmFwaAorCQkJLy8gcGx1Z2lucyAoYWxsIGV4Y2VwdCBmb3IgdGhlIGNvdW50cnkgY2F0ZWdvcmllcyB3aGljaCB3ZSBvdXRwdXQKKwkJCS8vIGJlbG93KQorCQkJZmluYWwgU3RyaW5nW10gbGV2ZWxDYXRlZ29yeUlkID0gb3V0cHV0Q2F0ZWdvcmllcygKKwkJCQkJbWF4QWRtaW5MZXZlbCArIDEsIG1vZGVsT3V0LCBwbHVnaW5PdXQpOworCisJCQlmb3IgKENvdW50cnlDb2RlIGNvdW50cnlDb2RlIDogY291bnRyeUNvZGVzKSB7CisJCQkJZm9yIChNYXA8Q291bnRyeUNvZGUsIExpc3Q8Q291bnRyeU1vZGVsUmVjb3JkPj4gbW9kZWxSZWNvcmRNYXAgOiBtb2RlbFJlY29yZHMpIHsKKwkJCQkJTGlzdDxDb3VudHJ5TW9kZWxSZWNvcmQ+IGZvbyA9IG1vZGVsUmVjb3JkTWFwCisJCQkJCQkJLmdldChjb3VudHJ5Q29kZSk7CisJCQkJCS8vIEFueXRoaW5nIGluIHRoZSBsaXN0PworCQkJCQlpZiAoZm9vICE9IG51bGwpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJZm9yIChDb3VudHJ5TW9kZWxSZWNvcmQgbW9kZWxSZWNvcmQgOiBtb2RlbFJlY29yZE1hcAorCQkJCQkJCQkuZ2V0KGNvdW50cnlDb2RlKSkgeworCQkJCQkJCW91dHB1dE1vZGVsUmVjb3JkKG1vZGVsUmVjb3JkLCBkY1ZhbHVlS2V5TWFwLAorCQkJCQkJCQkJY291bnRyeUNhdGVnb3JpZXMsIGxldmVsQ2F0ZWdvcnlJZCwKKwkJCQkJCQkJCW1vZGVsT3V0LCBwbHVnaW5PdXQpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQl9IC8vIGZvciBlYWNoIHR5cGUgb2YgZ3JhcGggUmVjb3JkCisJCQl9IC8vIGZvciBlYWNoIGNvdW50cnkgY29kZQorCisJCQltb2RlbE91dC53cml0ZShDb3VudHJ5R3JhcGhDcmVhdG9yLlhNTF9FWFRFTlNJT05fUE9JTlRfQ0xPU0UpOworCQkJbW9kZWxPdXQuY2xvc2UoKTsKKwkJCXBsdWdpbk91dC5jbG9zZSgpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisKKwl9Ly8gZ2VuZXJhdGVNb2RlbEV4dGVuc2lvblBvaW50WE1MCisKKwkvKioKKwkgKiBAcGFyYW0gbnVtTGV2ZWxzCisJICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGFkbWluaXN0cmF0aW9uIGxldmVscyB0byBnZW5lcmF0ZSBjYXRlZ29yaWVzIGZvcgorCSAqIEBwYXJhbSBtb2RlbE91dAorCSAqICAgICAgICAgICAgdGhlIG91dHB1dCB3cml0ZXIgZm9yIHRoZSBwbHVnaW4ueG1sIGZpbGUgY29udGVudHMKKwkgKiBAcGFyYW0gcGx1Z2luT3V0CisJICogICAgICAgICAgICB0aGUgb3V0cHV0IHdyaXRlciBmb3IgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGVudHMKKwkgKiBAcmV0dXJuIGFuIGFycmF5IGluZGV4ZWQgYnkgYWRtaW5pc3RyYXRpb24gbGV2ZWwgb2YgdGhlIGNhdGVnb3J5IGlkZWFzIG9mCisJICogICAgICAgICB0aGUgZGlmZmVyZW50IGFkbWluaXN0cmF0aW9uIGxldmVscworCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gd3JpdGluZyB0byB0aGUgb3V0cHV0IHdyaXRlcnMKKwkgKi8KKwlwcml2YXRlIFN0cmluZ1tdIG91dHB1dENhdGVnb3JpZXMoZmluYWwgaW50IG51bUxldmVscywKKwkJCWZpbmFsIFdyaXRlciBtb2RlbE91dCwgZmluYWwgV3JpdGVyIHBsdWdpbk91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLy8gVGhlIGNhdGVnb3JpZXMKKwkJLy8gU1RFTQorCQlDb3VudHJ5R3JhcGhDcmVhdG9yLm91dHB1dENhdGVnb3J5KElEX1NURU1fTU9ERUxfQ0FURUdPUlksCisJCQkJQ291bnRyeUdyYXBoQ3JlYXRvci5TVEVNLCAiLyIsIE5MU19DQVRFR09SWV9LRVlfRk9STUFULAorCQkJCW1vZGVsT3V0LCBwbHVnaW5PdXQpOworCisJCS8vIEdlb2dyYXBoeQorCQlDb3VudHJ5R3JhcGhDcmVhdG9yLm91dHB1dENhdGVnb3J5KElEX01PREVMX0dFT0dSQVBIWV9DQVRFR09SWSwKKwkJCQlDb3VudHJ5R3JhcGhDcmVhdG9yLkdFT0dSQVBIWSwgSURfU1RFTV9NT0RFTF9DQVRFR09SWSwKKwkJCQlOTFNfQ0FURUdPUllfS0VZX0ZPUk1BVCwgbW9kZWxPdXQsIHBsdWdpbk91dCk7CisKKwkJLy8gUG9saXRpY2FsCisJCUNvdW50cnlHcmFwaENyZWF0b3Iub3V0cHV0Q2F0ZWdvcnkoSURfTU9ERUxfUE9MSVRJQ0FMX0NBVEVHT1JZLAorCQkJCUNvdW50cnlHcmFwaENyZWF0b3IuUE9MSVRJQ0FMLCBJRF9NT0RFTF9HRU9HUkFQSFlfQ0FURUdPUlksCisJCQkJTkxTX0NBVEVHT1JZX0tFWV9GT1JNQVQsIG1vZGVsT3V0LCBwbHVnaW5PdXQpOworCisJCS8vIENvdW50cnkKKwkJQ291bnRyeUdyYXBoQ3JlYXRvci5vdXRwdXRDYXRlZ29yeShJRF9NT0RFTF9DT1VOVFJJRVNfQ0FURUdPUlksCisJCQkJQ291bnRyeUdyYXBoQ3JlYXRvci5DT1VOVFJJRVMsIElEX01PREVMX1BPTElUSUNBTF9DQVRFR09SWSwKKwkJCQlOTFNfQ0FURUdPUllfS0VZX0ZPUk1BVCwgbW9kZWxPdXQsIHBsdWdpbk91dCk7CisKKwkJZmluYWwgU3RyaW5nW10gbGV2ZWxDYXRlZ29yeUlkID0gbmV3IFN0cmluZ1tudW1MZXZlbHNdOworCisJCS8vIExldmVsCisJCWZvciAoaW50IGFkbWluTGV2ZWwgPSAwOyBhZG1pbkxldmVsIDwgbnVtTGV2ZWxzOyBhZG1pbkxldmVsKyspIHsKKwkJCS8vIExldmVsIGNhdGVnb3J5CisJCQlsZXZlbENhdGVnb3J5SWRbYWRtaW5MZXZlbF0gPSBJRF9NT0RFTF9DT1VOVFJJRVNfQ0FURUdPUlkgKyAiLiIKKwkJCQkJKyBDb3VudHJ5R3JhcGhDcmVhdG9yLkxFVkVMLnRvTG93ZXJDYXNlKCkgKyBhZG1pbkxldmVsOworCisJCQlDb3VudHJ5R3JhcGhDcmVhdG9yLm91dHB1dENhdGVnb3J5KGxldmVsQ2F0ZWdvcnlJZFthZG1pbkxldmVsXSwKKwkJCQkJQ291bnRyeUdyYXBoQ3JlYXRvci5MRVZFTCArIGFkbWluTGV2ZWwsCisJCQkJCUlEX01PREVMX0NPVU5UUklFU19DQVRFR09SWSwgTkxTX0NBVEVHT1JZX0tFWV9GT1JNQVQsCisJCQkJCW1vZGVsT3V0LCBwbHVnaW5PdXQpOworCQl9IC8vIGZvciBhZG1pbkxldmVsCisKKwkJbW9kZWxPdXQud3JpdGUoIlxuIik7CisJCXBsdWdpbk91dC53cml0ZSgiXG4iKTsKKwkJcmV0dXJuIGxldmVsQ2F0ZWdvcnlJZDsKKwl9IC8vIG91dHB1dENhdGVnb3JpZXMKKworCS8qKgorCSAqIEBwYXJhbSBtb2RlbFJlY29yZAorCSAqIEBwYXJhbSBkY1ZhbHVlS2V5TWFwCisJICogQHBhcmFtIGNvdW50cnlDYXRlZ29yaWVzCisJICogQHBhcmFtIGxldmVsQ2F0ZWdvcnlJZAorCSAqIEBwYXJhbSBtb2RlbE91dAorCSAqIEBwYXJhbSBwbHVnaW5PdXQKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIG91dHB1dE1vZGVsUmVjb3JkKE1vZGVsUmVjb3JkIG1vZGVsUmVjb3JkLAorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBkY1ZhbHVlS2V5TWFwLAorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBjb3VudHJ5Q2F0ZWdvcmllcywgU3RyaW5nW10gbGV2ZWxDYXRlZ29yeUlkLAorCQkJV3JpdGVyIG1vZGVsT3V0LCBXcml0ZXIgcGx1Z2luT3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkvLyBNYWtlIGV2ZXJ5dGhpbmcgY29tZSBvdXQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyCisKKwkJZmluYWwgU3RyaW5nIGNvdW50cnlDb2RlU3RyaW5nID0gbW9kZWxSZWNvcmQuZ2V0SWQoKS50b0xvd2VyQ2FzZSgpOworCQlmaW5hbCBTdHJpbmcgY291bnRyeUNhdGVnb3J5SWQgPSBsZXZlbENhdGVnb3J5SWRbbW9kZWxSZWNvcmQKKwkJCQkuZ2V0TWF4QWRtaW5MZXZlbCgpXQorCQkJCSsgIi4iICsgY291bnRyeUNvZGVTdHJpbmc7CisKKwkJLy8gSGF2ZSB3ZSBzZWVuIHRoaXMgY291bnRyeSBjYXRlZ29yeSBpZCBiZWZvcmU/CisJCWlmIChjb3VudHJ5Q2F0ZWdvcmllcy5nZXQoY291bnRyeUNhdGVnb3J5SWQpID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQkvLyBDcmVhdGUgYSBjYXRlZ29yeSBmb3IgdGhlIGNvdW50cnkKKwkJCW1vZGVsT3V0LndyaXRlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQlDb3VudHJ5R3JhcGhDcmVhdG9yLlhNTF9DQVRFR09SWV9FTEVNRU5UX09QRU4sCisJCQkJCW5ldyBPYmplY3RbXSB7IGNvdW50cnlDYXRlZ29yeUlkLCBtb2RlbFJlY29yZC5nZXRJZCgpLAorCQkJCQkJCWxldmVsQ2F0ZWdvcnlJZFttb2RlbFJlY29yZC5nZXRNYXhBZG1pbkxldmVsKCldIH0pKTsKKwkJCW1vZGVsT3V0LndyaXRlKCJcbiIpOworCQkJLy8gLi4uYW5kIHJlbWVtYmVyIHdlIGRpZCBzbyB3ZSBkb24ndCBkbyBpdCBhZ2FpbgorCQkJY291bnRyeUNhdGVnb3JpZXMucHV0KGNvdW50cnlDYXRlZ29yeUlkLCBjb3VudHJ5Q2F0ZWdvcnlJZCk7CisJCX0gLy8gaWYgd2UgaGF2ZW4ndCBzZWVuIHRoaXMgY2F0ZWdvcnkgaWQgYmVmb3JlCisKKwkJLy8gcGx1Z2luT3V0LndyaXRlKCIjIER1YmxpbiBDb3JlIGZvciAiCisJCS8vICsgZ3JhcGhSZWNvcmQuZ2V0Q291bnRyeUNvZGUoKS50b1N0cmluZygpICsgIlxuIik7CisJCS8vIC8vIFdlIGRvbid0IE5MUyB0aGUgSVNPMzAxNjYgYWxwaGEtMyBjb2RlcworCisJCUNvdW50cnlHcmFwaENyZWF0b3Iub3V0cHV0RHVibGluQ29yZShtb2RlbFJlY29yZCwgY291bnRyeUNhdGVnb3J5SWQsCisJCQkJZGNWYWx1ZUtleU1hcCwgbW9kZWxPdXQsIHBsdWdpbk91dCk7CisKKwl9IC8vIG91dHB1dE1vZGVsUmVjb3JkCisKKwkvKioKKwkgKiBAcmV0dXJuIGEgbWFwcGluZyBiZXR3ZWVuIGNvdW50cnkgY29kZSBhbmQgYSBsaXN0IG9mIHRoZSBtb2RlbHMgZm9yIHRoZQorCSAqICAgICAgICAgY291bnRyeS4gVGhlIG1vZGVscyBhcmUgb2YgbWl4ZWQgYWRtaW5pc3RyYXRpb24gbGV2ZWxzLgorCSAqLworCXB1YmxpYyBNYXA8Q291bnRyeUNvZGUsIExpc3Q8Q291bnRyeU1vZGVsUmVjb3JkPj4gY3JlYXRlQ291bnRyeU1vZGVscygpIHsKKwkJZmluYWwgTWFwPENvdW50cnlDb2RlLCBMaXN0PENvdW50cnlNb2RlbFJlY29yZD4+IHJldFZhbHVlID0gbmV3IEhhc2hNYXA8Q291bnRyeUNvZGUsIExpc3Q8Q291bnRyeU1vZGVsUmVjb3JkPj4oKTsKKworCQlmaW5hbCBMaXN0PENvdW50cnlDb2RlPiBjb3VudHJ5Q29kZXMgPSBDb3VudHJ5RGlyZWN0b3J5VXRpbGl0aWVzCisJCQkJLmdldEFsbENvdW50cnlDb2RlcygpOworCQlDb2xsZWN0aW9ucy5zb3J0KGNvdW50cnlDb2Rlcyk7CisKKwkJZmluYWwgQ291bnRyeUdyYXBoQ3JlYXRvciBjZ2MgPSBuZXcgQ291bnRyeUdyYXBoQ3JlYXRvcigpOworCisJCU1hcDxDb3VudHJ5Q29kZSwgTGlzdDxHcmFwaFJlY29yZD4+IG5vZGVHcmFwaHMgPSBjZ2MKKwkJCQkuY3JlYXRlR3JhcGhSZWNvcmRzKGNvdW50cnlDb2RlcywgRGF0YVR5cGUubm9kZSk7CisKKwkJTWFwPENvdW50cnlDb2RlLCBMaXN0PEdyYXBoUmVjb3JkPj4gYXJlYUdyYXBocyA9IGNnYworCQkJCS5jcmVhdGVHcmFwaFJlY29yZHMoY291bnRyeUNvZGVzLCBEYXRhVHlwZS5hcmVhKTsKKworCQlmb3IgKENvdW50cnlDb2RlIGNvdW50cnlDb2RlIDogY291bnRyeUNvZGVzKSB7CisJCQlMaXN0PEdyYXBoUmVjb3JkPiBub2RlR3JhcGhSZWNvcmRzID0gbm9kZUdyYXBocy5nZXQoY291bnRyeUNvZGUpOworCQkJTGlzdDxHcmFwaFJlY29yZD4gYXJlYUdyYXBoUmVjb3JkcyA9IGFyZWFHcmFwaHMuZ2V0KGNvdW50cnlDb2RlKTsKKworCQkJLy8gRmluZCB0aGUgbWF4aW11bSBhZG1pbnN0cmF0aW9uIGxldmVsIHdlJ3JlIHdvcmtpbmcgd2l0aAorCQkJZmluYWwgaW50IG1heE5vZGVBZG1pbkxldmVsID0gbm9kZUdyYXBoUmVjb3JkcyAhPSBudWxsID8gQ291bnRyeUdyYXBoQ3JlYXRvcgorCQkJCQkuZ2V0TWF4QWRtaW5MZXZlbChub2RlR3JhcGhSZWNvcmRzKQorCQkJCQk6IC0xOworCQkJZmluYWwgaW50IG1heEFyZWFBZG1pbkxldmVsID0gYXJlYUdyYXBoUmVjb3JkcyAhPSBudWxsID8gQ291bnRyeUdyYXBoQ3JlYXRvcgorCQkJCQkuZ2V0TWF4QWRtaW5MZXZlbChhcmVhR3JhcGhSZWNvcmRzKQorCQkJCQk6IC0xOworCQkJaW50IG1heEFkbWluTGV2ZWwgPSBNYXRoLm1heChtYXhBcmVhQWRtaW5MZXZlbCwgbWF4Tm9kZUFkbWluTGV2ZWwpOworCisJCQkvLyBDcmVhdGUgb25lIGNvdW50cnkgbW9kZWwgZm9yIGVhY2ggYWRtaW5pc3RyYXRpb24gbGV2ZWwKKwkJCWZpbmFsIExpc3Q8Q291bnRyeU1vZGVsUmVjb3JkPiBjb3VudHJ5TW9kZWxzID0gbmV3IEFycmF5TGlzdDxDb3VudHJ5TW9kZWxSZWNvcmQ+KCk7CisJCQlmb3IgKGludCBhZG1pbkxldmVsID0gMDsgYWRtaW5MZXZlbCA8IG1heEFkbWluTGV2ZWwgKyAxOyBhZG1pbkxldmVsKyspIHsKKworCQkJCS8vIERpZCB3ZSBnZXQgbm9kZXM/CisJCQkJaWYgKG5vZGVHcmFwaFJlY29yZHMgPT0gbnVsbCkgeworCQkJCQkvLyBObworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNraXBwaW5nIGNvdW50cnkgXCIiCisJCQkJCQkJKyBjb3VudHJ5Q29kZS50b1N0cmluZygpICsgIlwiIGF0IGxldmVsIFwiIgorCQkJCQkJCSsgYWRtaW5MZXZlbCArICJcIiBiZWNhdXNlIHRoZXJlIGFyZSBubyBub2RlcyIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLy8gRGlkIHdlIGdldCBhcmVhIGxhYmVscz8KKwkJCQlpZiAoYXJlYUdyYXBoUmVjb3JkcyA9PSBudWxsKSB7CisJCQkJCS8vIE5vCisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2tpcHBpbmcgY291bnRyeSBcIiIKKwkJCQkJCQkrIGNvdW50cnlDb2RlLnRvU3RyaW5nKCkgKyAiXCIgYXQgbGV2ZWwgXCIiCisJCQkJCQkJKyBhZG1pbkxldmVsCisJCQkJCQkJKyAiXCIgYmVjYXVzZSB0aGVyZSBhcmUgbm8gYXJlYSBsYWJlbHMiKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJZmluYWwgTGlzdDxHcmFwaFJlY29yZD4gbW9kZWxSZWNvcmRzID0gbmV3IEFycmF5TGlzdDxHcmFwaFJlY29yZD4oKTsKKwkJCQlmaW5hbCBHcmFwaFJlY29yZCBub2RlR3JhcGggPSBnZXRCeUFkbWluTGV2ZWwoYWRtaW5MZXZlbCwKKwkJCQkJCW5vZGVHcmFwaFJlY29yZHMpOworCQkJCWZpbmFsIEdyYXBoUmVjb3JkIGFyZWFHcmFwaCA9IGdldEJ5QWRtaW5MZXZlbChhZG1pbkxldmVsLAorCQkJCQkJYXJlYUdyYXBoUmVjb3Jkcyk7CisJCQkJbW9kZWxSZWNvcmRzLmFkZChub2RlR3JhcGgpOworCQkJCW1vZGVsUmVjb3Jkcy5hZGQoYXJlYUdyYXBoKTsKKwkJCQljb3VudHJ5TW9kZWxzLmFkZChuZXcgQ291bnRyeU1vZGVsUmVjb3JkKGNyZWF0ZU1vZGVsKAorCQkJCQkJY291bnRyeUNvZGUsIGFkbWluTGV2ZWwsIG1vZGVsUmVjb3JkcywKKwkJCQkJCUNvdW50cnlHcmFwaENyZWF0b3IuR0VPR1JBUEhZX0ZJTEVfVVJJX1BSRUZJWCksCisJCQkJCQljb3VudHJ5Q29kZSwgYWRtaW5MZXZlbCkpOworCQkJfSAvLyBmb3IgYWRtaW5MZXZlbAorCisJCQkvLyBBbnkgY291bnRyeSBtb2RlbHMgY3JlYXRlZD8KKwkJCWlmIChjb3VudHJ5TW9kZWxzLnNpemUoKSA+IDApIHsKKwkJCQkvLyBZZXMKKwkJCQlyZXRWYWx1ZS5wdXQoY291bnRyeUNvZGUsIGNvdW50cnlNb2RlbHMpOworCQkJfQorCisJCX0gLy8gZm9yIGVhY2ggY291bnRyeSBjb2RlCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlQ291bnRyeU1vZGVscworCisJLyoqCisJICogQ3JlYXRlIHRoZSBjb3VudHJ5IG1vZGVscywgYnV0IG9yZ2FuaXplIHRoZW0gYnkgYWRtaW5pc3RyYXRpb24gbGV2ZWwKKwkgKiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBsaXN0cyBvZiBNb2RlbFJlY29yZCdzLCB0aGUgMCd0aCBlbGVtZW50IG9mIHRoZSBsaXN0CisJICogICAgICAgICBjb250YWlucyBhIGxpc3Qgb2YgbW9kZWxzIGF0IGFkbWluaXN0cmF0aW9uIGxldmVsIDAKKwkgKi8KKwlwdWJsaWMgTGlzdDxMaXN0PENvdW50cnlNb2RlbFJlY29yZD4+IGNyZWF0ZUNvdW50cnlNb2RlbHMyKCkgeworCQlmaW5hbCBNYXA8Q291bnRyeUNvZGUsIExpc3Q8Q291bnRyeU1vZGVsUmVjb3JkPj4gY291bnRyeU1vZGVscyA9IGNyZWF0ZUNvdW50cnlNb2RlbHMoKTsKKworCQkvLyBSZW9yZ2FuaXplIHRoZSBtb2RlbHMgYnkgYWRtaW5pc3RyYXRpb24gbGV2ZWwKKwkJZmluYWwgaW50IG1heEFkbWluTGV2ZWwgPSBnZXRNYXhBZG1pbkxldmVsKGNvdW50cnlNb2RlbHMpOworCQlMaXN0PExpc3Q8Q291bnRyeU1vZGVsUmVjb3JkPj4gcmV0VmFsdWUgPSBuZXcgQXJyYXlMaXN0PExpc3Q8Q291bnRyeU1vZGVsUmVjb3JkPj4oKTsKKwkJZm9yIChpbnQgYWRtaW5MZXZlbCA9IDA7IGFkbWluTGV2ZWwgPCBtYXhBZG1pbkxldmVsICsgMTsgYWRtaW5MZXZlbCsrKSB7CisJCQlyZXRWYWx1ZS5hZGQobmV3IEFycmF5TGlzdDxDb3VudHJ5TW9kZWxSZWNvcmQ+KCkpOworCQl9IC8vIGZvciBhZG1pbkxldmVsCisKKwkJZm9yIChFbnRyeTxDb3VudHJ5Q29kZSwgTGlzdDxDb3VudHJ5TW9kZWxSZWNvcmQ+PiBlbnRyeSA6IGNvdW50cnlNb2RlbHMKKwkJCQkuZW50cnlTZXQoKSkgeworCQkJZm9yIChDb3VudHJ5TW9kZWxSZWNvcmQgbW9kZWxSZWNvcmQgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisJCQkJcmV0VmFsdWUuZ2V0KG1vZGVsUmVjb3JkLmdldE1heEFkbWluTGV2ZWwoKSkuYWRkKG1vZGVsUmVjb3JkKTsKKwkJCX0gLy8gZm9yZWFjaCBNb2RlbFJlY29yZAorCQl9IC8vIGZvcmVhY2ggY291bnRyeU1vZGVscy5lbnRyeVNldAorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUNvdW50cnlNb2RlbHMyCisKKwkvKioKKwkgKiBAcGFyYW0gY291bnRyeUNvZGUKKwkgKiBAcGFyYW0gYWRtaW5MZXZlbAorCSAqIEBwYXJhbSBncmFwaFJlY29yZHMKKwkgKiBAcGFyYW0gZGF0YUZpbGVVUklQcmVmaXgKKwkgKiBAcmV0dXJuIGEgbW9kZWwgd2l0aCBhbGwgb2YgdGhlIGdyYXBocyBhZGRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByaXZhdGUgTW9kZWwgY3JlYXRlTW9kZWwoZmluYWwgQ291bnRyeUNvZGUgY291bnRyeUNvZGUsCisJCQlmaW5hbCBpbnQgYWRtaW5MZXZlbCwgZmluYWwgTGlzdDxHcmFwaFJlY29yZD4gZ3JhcGhSZWNvcmRzLAorCQkJZmluYWwgU3RyaW5nIGRhdGFGaWxlVVJJUHJlZml4KSB7CisJCWZpbmFsIE1vZGVsIHJldFZhbHVlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNb2RlbCgpOworCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gcmV0VmFsdWUuZ2V0RHVibGluQ29yZSgpOworCQlkYy5wb3B1bGF0ZSgpOworCQlkYy5zZXRUaXRsZShDb3VudHJ5RGlyZWN0b3J5VXRpbGl0aWVzLmdldENvdW50cnlOYW1lKGNvdW50cnlDb2RlKQorCQkJCSsgIiBNb2RlbCAoTGV2ZWwgIiArIGFkbWluTGV2ZWwgKyAiLCAiICsgZ3JhcGhSZWNvcmRzLnNpemUoKQorCQkJCSsgIiBncmFwaHMpIik7CisJCS8vIGRjLnNldFNvdXJjZShub25EYXRhUHJvcGVydGllcy5nZXQoU09VUkNFX1BST1BFUlRZKSk7CisKKwkJcmV0VmFsdWUuc2V0VVJJKFVSSS5jcmVhdGVVUkkoTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJQ291bnRyeUdyYXBoQ3JlYXRvci5JREVOVElGSUVSX0ZPUk1BVCwgZGF0YUZpbGVVUklQcmVmaXgsCisJCQkJY291bnRyeUNvZGUsIGNvdW50cnlDb2RlLnRvU3RyaW5nKCkgKyAiXyIKKwkJCQkJCSsgSW50ZWdlci50b1N0cmluZyhhZG1pbkxldmVsKSwgIm1vZGVsIikpKTsKKworCQlmb3IgKEdyYXBoUmVjb3JkIG1vZGVsUmVjb3JkIDogZ3JhcGhSZWNvcmRzKSB7CisJCQkvLyBBIG51bGwgdmFsdWU/CisJCQlpZiAobW9kZWxSZWNvcmQgIT0gbnVsbCkgeworCQkJCS8vIE5vCisJCQkJcmV0VmFsdWUuZ2V0R3JhcGhzKCkuYWRkKG1vZGVsUmVjb3JkLmdldEdyYXBoKCkpOworCQkJfQorCQl9IC8vIGZvciBlYWNoIG5vZGUgZGF0YQorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZU1vZGVsCisKKwkvKioKKwkgKiBAcGFyYW0gZ3JhcGhSZWNvcmRzCisJICogICAgICAgICAgICBhIGxpc3Qgb2YgR3JhcGhSZWNvcmRzIHRvIHNlYXJjaAorCSAqIEByZXR1cm4gdGhlIGZpcnN0IEdyYXBoUmVjb3JkIHRoYXQgbWF0Y2hlcyB0aGUgYWRtaW5pc3RyYXRpb24gbGV2ZWwgb3IKKwkgKiAgICAgICAgIG51bGwgaWYgbm90IGZvdW5kCisJICovCisJcHJpdmF0ZSBHcmFwaFJlY29yZCBnZXRCeUFkbWluTGV2ZWwoZmluYWwgaW50IGFkbWluTGV2ZWwsCisJCQlMaXN0PEdyYXBoUmVjb3JkPiBub2RlR3JhcGhSZWNvcmRzKSB7CisJCUdyYXBoUmVjb3JkIHJldFZhbHVlID0gbnVsbDsKKwkJZm9yIChHcmFwaFJlY29yZCByZWNvcmQgOiBub2RlR3JhcGhSZWNvcmRzKSB7CisJCQkvLyBJcyB0aGlzIGF0IHRoZSByaWdodCBhZG1pbiBsZXZlbD8KKwkJCWlmIChyZWNvcmQuZ2V0QWRtaW5MZXZlbCgpID09IGFkbWluTGV2ZWwpIHsKKwkJCQkvLyBZZXMKKwkJCQlyZXRWYWx1ZSA9IHJlY29yZDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRCeUFkbWluTGV2ZWwKKworCS8qKgorCSAqIEBwYXJhbSBtb2RlbHMKKwkgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIGFkbWluaXN0cmF0aW9uIGxldmVsIGZvdW5kCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF4QWRtaW5MZXZlbCgKKwkJCU1hcDxDb3VudHJ5Q29kZSwgTGlzdDxDb3VudHJ5TW9kZWxSZWNvcmQ+PiBtb2RlbHMpIHsKKwkJaW50IG1heEFkbWluTGV2ZWwgPSAwOworCQlmb3IgKExpc3Q8Q291bnRyeU1vZGVsUmVjb3JkPiBsaXN0IDogbW9kZWxzLnZhbHVlcygpKSB7CisJCQltYXhBZG1pbkxldmVsID0gTWF0aC5tYXgobWF4QWRtaW5MZXZlbCwgZ2V0TWF4QWRtaW5MZXZlbChsaXN0KSk7CisJCX0gLy8gZm9yCisJCXJldHVybiBtYXhBZG1pbkxldmVsOworCX0gLy8gZ2V0TWF4QWRtaW5MZXZlbAorCisJLyoqCisJICogQHBhcmFtIG1vZGVsUmVjb3JkcworCSAqIEByZXR1cm4gdGhlIG1heGltdW0gYWRtaW5pc3RyYXRpb24gbGV2ZWwgZm91bmQgaW4gYWxsIG9mIHRoZSBtb2RlbAorCSAqICAgICAgICAgcmVjb3JkcworCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IGdldE1heEFkbWluTGV2ZWwoTGlzdDxDb3VudHJ5TW9kZWxSZWNvcmQ+IG1vZGVsUmVjb3JkcykgeworCQlpbnQgbWF4QWRtaW5MZXZlbCA9IDA7CisJCWZvciAoQ291bnRyeU1vZGVsUmVjb3JkIG1vZGVsUmVjb3JkIDogbW9kZWxSZWNvcmRzKSB7CisJCQltYXhBZG1pbkxldmVsID0gTWF0aC5tYXgobWF4QWRtaW5MZXZlbCwgbW9kZWxSZWNvcmQKKwkJCQkJLmdldE1heEFkbWluTGV2ZWwoKSk7CisJCX0KKwkJcmV0dXJuIG1heEFkbWluTGV2ZWw7CisJfSAvLyBnZXRNYXhBZG1pbkxldmVsCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBtb2RlbC4KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgc3RhdGljIGNsYXNzIE1vZGVsUmVjb3JkIGV4dGVuZHMgUmVjb3JkIHsKKworCQkvKioKKwkJICogQHBhcmFtIG1vZGVsCisJCSAqICAgICAgICAgICAgdGhlIG1vZGVsCisJCSAqIEBwYXJhbSBpZAorCQkgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgdGhlIG1vZGVsCisJCSAqIEBwYXJhbSBhZG1pbkxldmVsCisJCSAqICAgICAgICAgICAgdGhlIGFkbWluaXN0cmF0aW9uIGxldmVsIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgbW9kZWwKKwkJICovCisJCXB1YmxpYyBNb2RlbFJlY29yZChmaW5hbCBNb2RlbCBtb2RlbCwgZmluYWwgU3RyaW5nIGlkLAorCQkJCWZpbmFsIGludCBhZG1pbkxldmVsKSB7CisJCQl0aGlzKG1vZGVsLCBpZCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChJbnRlZ2VyCisJCQkJCS52YWx1ZU9mKGFkbWluTGV2ZWwpKSk7CisJCX0gLy8gTW9kZWxSZWNvcmQKKworCQkvKioKKwkJICogQHBhcmFtIG1vZGVsCisJCSAqICAgICAgICAgICAgdGhlIG1vZGVsCisJCSAqIEBwYXJhbSBpZAorCQkgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgdGhlIG1vZGVsCisJCSAqIEBwYXJhbSBhZG1pbkxldmVscworCQkgKiAgICAgICAgICAgIHRoZSBhZG1pbmlzdHJhdGlvbiBsZXZlbCBvZiB0aGUgY29udGVudHMgb2YgdGhlIG1vZGVsCisJCSAqLworCQlwdWJsaWMgTW9kZWxSZWNvcmQoZmluYWwgTW9kZWwgbW9kZWwsIGZpbmFsIFN0cmluZyBpZCwKKwkJCQlmaW5hbCBMaXN0PEludGVnZXI+IGFkbWluTGV2ZWxzKSB7CisJCQlzdXBlcihtb2RlbCwgaWQsIGFkbWluTGV2ZWxzKTsKKwkJfSAvLyBNb2RlbFJlY29yZAorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBtb2RlbAorCQkgKi8KKwkJcHVibGljIGZpbmFsIE1vZGVsIGdldE1vZGVsKCkgeworCQkJcmV0dXJuIChNb2RlbCkgaWRlbnRpZmlhYmxlOworCQl9IC8vIGdldE1vZGVsCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5ncmFwaC5Db3VudHJ5R3JhcGhDcmVhdG9yLlJlY29yZCNnZXRPdXRwdXRUeXBlKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldE91dHB1dFR5cGUoKSB7CisJCQlyZXR1cm4gIm1vZGVsIjsKKwkJfQorCX0gLy8gTW9kZWxSZWNvcmQKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG1vZGVsIG9mIGEgY291bnRyeSBhbmQgaXRzIGRldGFpbHMuCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBDb3VudHJ5TW9kZWxSZWNvcmQgZXh0ZW5kcyBNb2RlbFJlY29yZCB7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBtb2RlbAorCQkgKiAgICAgICAgICAgIHRoZSBtb2RlbAorCQkgKiBAcGFyYW0gY291bnRyeUNvZGUKKwkJICogICAgICAgICAgICB0aGUgY29kZSBvZiB0aGUgY291bnRyeSB0aGUgbW9kZWwgcmVwcmVzZW50cworCQkgKiBAcGFyYW0gYWRtaW5MZXZlbAorCQkgKiAgICAgICAgICAgIHRoZSBhZG1pbmlzdHJhdGlvbiBsZXZlbCBvZiB0aGUgY29udGVudHMgb2YgdGhlIG1vZGVsCisJCSAqLworCQlwdWJsaWMgQ291bnRyeU1vZGVsUmVjb3JkKGZpbmFsIE1vZGVsIG1vZGVsLAorCQkJCWZpbmFsIENvdW50cnlDb2RlIGNvdW50cnlDb2RlLCBmaW5hbCBpbnQgYWRtaW5MZXZlbCkgeworCQkJc3VwZXIobW9kZWwsIGNvdW50cnlDb2RlLnRvU3RyaW5nKCksIGFkbWluTGV2ZWwpOworCQl9IC8vIENvdW50cnlNb2RlbFJlY29yZAorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuZ3JhcGguQ291bnRyeUdyYXBoQ3JlYXRvci5SZWNvcmQjZ2V0VHlwZSgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQkJcmV0dXJuICJjb3VudHJ5IjsKKwkJfQorCisJfSAvLyBDb3VudHJ5TW9kZWxSZWNvcmQKKworfSAvLyBDb3VudHJ5TW9kZWxDcmVhdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9UZXN0VXRpbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvVGVzdFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjNhMGNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvVGVzdFV0aWwuamF2YQpAQCAtMCwwICsxLDQ4MyBAQAorLy8gVGVzdFV0aWwuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNFZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNOb2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY0VkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkVkZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkVkZ2VEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuRGVjb3JhdG9yc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdE5vZGVEZWNvcmF0b3IxOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdER5bmFtaWNMYWJlbDE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0RHluYW1pY05vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RJbnRlZ2VyTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RTdGF0aWNFZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0U3RhdGljTm9kZUxhYmVsOworCisvKioKKyAqIFRoaXMgY2xhc3MgY29udGFpbnMgdXRpbGl0eSBtZXRob2RzIGZvciB0ZXN0aW5nIFNURU0uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VXRpbCB7CisKKwkvKioKKwkgKiBUaGlzIGlzIGEgY291bnRlciB1c2VkIHRvIHVuaXF1ZWx5IG51bWJlciB0aGUgbGFiZWxzIHRoYXQgYXJlIGNyZWF0ZWQuCisJICogCisJICogQHNlZSAjY3JlYXRlU3RhdGljTGFiZWwoVVJJKQorCSAqLworCXByaXZhdGUgc3RhdGljIGludCBsYWJlbENvdW50ZXIgPSAwOworCisJLyoqCisJICogVGhpcyBpcyBhIGNvdW50ZXIgdXNlZCB0byB1bmlxdWVseSBudW1iZXIgdGhlIGR5bmFtaWMgbGFiZWxzIHRoYXQgYXJlCisJICogY3JlYXRlZC4KKwkgKiAKKwkgKiBAc2VlICNjcmVhdGVEeW5hbWljTGFiZWwoVVJJKQorCSAqLworCXByaXZhdGUgc3RhdGljIGludCBkeW5hbWljTGFiZWxDb3VudGVyID0gMDsKKworCS8qKgorCSAqIFRoaXMgaXMgYSBjb3VudGVyIHVzZWQgdG8gdW5pcXVlbHkgbnVtYmVyIHRoZSBlZGdlcyB0aGF0IGFyZSBjcmVhdGVkLgorCSAqIAorCSAqIEBzZWUgI2NyZWF0ZU5leHRFZGdlVVJJKCkKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBpbnQgZWRnZUNvdW50ZXIgPSAwOworCisJLyoqCisJICogVGhpcyBpcyBhIGNvdW50ZXIgdXNlZCB0byB1bmlxdWVseSBudW1iZXIgdGhlIG5vZGVzIHRoYXQgYXJlIGNyZWF0ZWQuCisJICogCisJICogQHNlZSAjY3JlYXRlTmV4dE5vZGVVUkkoKQorCSAqLworCXByaXZhdGUgc3RhdGljIGludCBub2RlQ291bnRlciA9IDA7CisKKwkvKioKKwkgKiBUaGlzIGlzIGEgY291bnRlciB1c2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBVUkkncyBvZiB0aGluZ3MgdG8gbGFiZWwKKwkgKiAKKwkgKiBAc2VlICNjcmVhdGVGaXh0dXJlKCkKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBpbnQgaWRDb3VudGVyID0gMDsKKworCS8qKgorCSAqIFJlc2V0IHRoZSBjb3VudGVycworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNldENvdW50ZXJzKCkgeworCQlsYWJlbENvdW50ZXIgPSAwOworCQlkeW5hbWljTGFiZWxDb3VudGVyID0gMDsKKwkJZWRnZUNvdW50ZXIgPSAwOworCQlub2RlQ291bnRlciA9IDA7CisJCWlkQ291bnRlciA9IDA7CisJfQorCisJLyoqCisJICogQHJldHVybiBhIHN0YXRpYyBsYWJlbCBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlU3RhdGljTGFiZWwoKSB7CisJCXJldHVybiBjcmVhdGVTdGF0aWNMYWJlbChjcmVhdGVOZXh0SWRlbnRpZmlhYmxlVG9MYWJlbFVSSSgpKTsKKwl9IC8vIGNyZWF0ZVN0YXRpY0xhYmVsCisKKwkvKioKKwkgKiBAcGFyYW0gdXJpT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZAorCSAqIEByZXR1cm4gYSBzdGF0aWMgbGFiZWwgaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVN0YXRpY0xhYmVsKGZpbmFsIFVSSSB1cmlPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKSB7CisJCXJldHVybiBjcmVhdGVTdGF0aWNMYWJlbChjcmVhdGVOZXh0TGFiZWxVUkkoKSwKKwkJCQl1cmlPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKTsKKwl9IC8vIGNyZWF0ZVN0YXRpY0xhYmVsCisKKwkvKioKKwkgKiBAcGFyYW0gbGFiZWxVUkkKKwkgKiBAcGFyYW0gdXJpT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZAorCSAqIEByZXR1cm4gYSBzdGF0aWMgbGFiZWwgaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVN0YXRpY0xhYmVsKGZpbmFsIFVSSSBsYWJlbFVSSSwKKwkJCWZpbmFsIFVSSSB1cmlPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKSB7CisJCWZpbmFsIFRlc3RMYWJlbCByZXRWYWx1ZSA9IExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlc3RMYWJlbCgpOworCQlyZXRWYWx1ZS5zZXRVUkkobGFiZWxVUkkpOworCQlyZXRWYWx1ZS5zZXRVUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKHVyaU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQpOworCisJCWZpbmFsIFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSBzdGF0aWNMYWJlbEN1cnJlbnRWYWx1ZSA9IExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZVRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSgpOworCQlzdGF0aWNMYWJlbEN1cnJlbnRWYWx1ZQorCQkJCS5zZXRJKFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZS5DVVJSRU5UX0xBQkVMX0lOVEVHRVJfVkFMVUUpOworCQlyZXRWYWx1ZS5zZXRDdXJyZW50VmFsdWUoc3RhdGljTGFiZWxDdXJyZW50VmFsdWUpOworCisJCWFzc2VydCByZXRWYWx1ZS5zYW5lKCk7CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlU3RhdGljTGFiZWwKKworCS8qKgorCSAqIEByZXR1cm4gYSB1bmlxdWUgVVJJIGZvciBhIGxhYmVsLgorCSAqLworCXByaXZhdGUgc3RhdGljIFVSSSBjcmVhdGVOZXh0TGFiZWxVUkkoKSB7CisJCXJldHVybiBTVEVNVVJJLmNyZWF0ZVVSSSgiTEFCRUwiICsgIi8iICsgbGFiZWxDb3VudGVyKyspOworCX0gLy8gY3JlYXRlTmV4dExhYmVsVVJJCisKKwkvKioKKwkgKiBAcGFyYW0gdXJpT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZAorCSAqIEByZXR1cm4gYSB1bmlxdWUgZHluYW1pYyBsYWJlbAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdER5bmFtaWNMYWJlbDEgY3JlYXRlRHluYW1pY0xhYmVsKAorCQkJZmluYWwgVVJJIHVyaU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQpIHsKKwkJZmluYWwgVGVzdE5vZGVEZWNvcmF0b3IxIHRuZCA9IERlY29yYXRvcnNGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVUZXN0Tm9kZURlY29yYXRvcjEoKTsKKwkJcmV0dXJuIGNyZWF0ZUR5bmFtaWNMYWJlbChjcmVhdGVOZXh0RHluYW1pY0xhYmVsVVJJKCksCisJCQkJdXJpT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCwgdG5kKTsKKwl9IC8vIGNyZWF0ZUR5bmFtaWNMYWJlbAorCisJLyoqCisJICogQHBhcmFtIHVyaU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQKKwkgKiBAcmV0dXJuIGEgdW5pcXVlIGR5bmFtaWMgbGFiZWwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRlc3REeW5hbWljTGFiZWwxIGNyZWF0ZUR5bmFtaWNMYWJlbCgKKwkJCWZpbmFsIFVSSSB1cmlPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkLCBmaW5hbCBEZWNvcmF0b3IgZGVjb3JhdG9yKSB7CisJCXJldHVybiBjcmVhdGVEeW5hbWljTGFiZWwoY3JlYXRlTmV4dER5bmFtaWNMYWJlbFVSSSgpLAorCQkJCXVyaU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQsIGRlY29yYXRvcik7CisJfSAvLyBjcmVhdGVEeW5hbWljTGFiZWwKKworCS8qKgorCSAqIEBwYXJhbSBsYWJlbFVSSQorCSAqIEBwYXJhbSB1cmlPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkCisJICogQHJldHVybiBhIHVuaXF1ZSBkeW5hbWljIGxhYmVsCisJICovCisJcHVibGljIHN0YXRpYyBUZXN0RHluYW1pY0xhYmVsMSBjcmVhdGVEeW5hbWljTGFiZWwoZmluYWwgVVJJIGxhYmVsVVJJLAorCQkJZmluYWwgVVJJIHVyaU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQsIGZpbmFsIERlY29yYXRvciBkZWNvcmF0b3IpIHsKKwkJZmluYWwgVGVzdER5bmFtaWNMYWJlbDEgcmV0VmFsdWUgPSBMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVUZXN0RHluYW1pY0xhYmVsMSgpOworCQlyZXRWYWx1ZS5zZXRVUkkobGFiZWxVUkkpOworCQlyZXRWYWx1ZS5zZXRVUklPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKHVyaU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQpOworCQlyZXRWYWx1ZS5zZXREZWNvcmF0b3IoZGVjb3JhdG9yKTsKKwkJZmluYWwgVGVzdEludGVnZXJMYWJlbFZhbHVlIGR5bmFtaWNMYWJlbEN1cnJlbnRWYWx1ZSA9IExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZVRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSgpOworCQlmaW5hbCBUZXN0SW50ZWdlckxhYmVsVmFsdWUgZHluYW1pY0xhYmVsTmV4dFZhbHVlID0gTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlVGVzdEludGVnZXJMYWJlbFZhbHVlKCk7CisJCWR5bmFtaWNMYWJlbEN1cnJlbnRWYWx1ZQorCQkJCS5zZXRJKFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZS5DVVJSRU5UX0xBQkVMX0lOVEVHRVJfVkFMVUUpOworCQlkeW5hbWljTGFiZWxOZXh0VmFsdWUKKwkJCQkuc2V0SShUZXN0SW50ZWdlckxhYmVsVmFsdWUuTkVYVF9MQUJFTF9JTlRFR0VSX1ZBTFVFKTsKKworCQlyZXRWYWx1ZS5zZXRDdXJyZW50VmFsdWUoZHluYW1pY0xhYmVsQ3VycmVudFZhbHVlKTsKKwkJcmV0VmFsdWUuc2V0TmV4dFZhbHVlKGR5bmFtaWNMYWJlbE5leHRWYWx1ZSk7CisKKwkJYXNzZXJ0IHJldFZhbHVlLnNhbmUoKTsKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVEeW5hbWljTGFiZWwKKworCS8qKgorCSAqIEBwYXJhbSBsYWJlbFVSSQorCSAqIEBwYXJhbSB1cmlPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkCisJICogQHJldHVybiBhIHN0YXRpYyBub2RlIGxhYmVsCisJICovCisJcHVibGljIHN0YXRpYyBTdGF0aWNOb2RlTGFiZWwgY3JlYXRlU3RhdGljTm9kZUxhYmVsKGZpbmFsIFVSSSBsYWJlbFVSSSwKKwkJCWZpbmFsIFVSSSB1cmlPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKSB7CisJCWZpbmFsIFRlc3RTdGF0aWNOb2RlTGFiZWwgcmV0VmFsdWUgPSBMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVUZXN0U3RhdGljTm9kZUxhYmVsKCk7CisJCXJldFZhbHVlLnNldFVSSShsYWJlbFVSSSk7CisJCXJldFZhbHVlLnNldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQodXJpT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCk7CisKKwkJZmluYWwgVGVzdEludGVnZXJMYWJlbFZhbHVlIHN0YXRpY0xhYmVsQ3VycmVudFZhbHVlID0gTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlVGVzdEludGVnZXJMYWJlbFZhbHVlKCk7CisJCXN0YXRpY0xhYmVsQ3VycmVudFZhbHVlCisJCQkJLnNldEkoVGVzdEludGVnZXJMYWJlbFZhbHVlLkNVUlJFTlRfTEFCRUxfSU5URUdFUl9WQUxVRSk7CisJCXJldFZhbHVlLnNldEN1cnJlbnRWYWx1ZShzdGF0aWNMYWJlbEN1cnJlbnRWYWx1ZSk7CisKKwkJYXNzZXJ0IHJldFZhbHVlLnNhbmUoKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlU3RhdGljTm9kZUxhYmVsCisKKwkvKioKKwkgKiBAcmV0dXJuIGEgdW5pcXVlIGR5bmFtaWMgbm9kZSBsYWJlbAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdER5bmFtaWNOb2RlTGFiZWwgY3JlYXRlRHluYW1pY05vZGVMYWJlbCgpIHsKKwkJZmluYWwgVGVzdE5vZGVEZWNvcmF0b3IxIHRuZCA9IERlY29yYXRvcnNGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVUZXN0Tm9kZURlY29yYXRvcjEoKTsKKwkJcmV0dXJuIGNyZWF0ZUR5bmFtaWNOb2RlTGFiZWwoY3JlYXRlTmV4dER5bmFtaWNMYWJlbFVSSSgpLAorCQkJCWNyZWF0ZU5leHRJZGVudGlmaWFibGVUb0xhYmVsVVJJKCksIHRuZCk7CisJfSAvLyBjcmVhdGVEeW5hbWljTm9kZUxhYmVsCisKKwkvKioKKwkgKiBAcGFyYW0gdXJpT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZAorCSAqIEByZXR1cm4gYSB1bmlxdWUgZHluYW1pYyBub2RlIGxhYmVsCisJICovCisJcHVibGljIHN0YXRpYyBUZXN0RHluYW1pY05vZGVMYWJlbCBjcmVhdGVEeW5hbWljTm9kZUxhYmVsKAorCQkJZmluYWwgVVJJIHVyaU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQsCisJCQlmaW5hbCBOb2RlRGVjb3JhdG9yIG5vZGVEZWNvcmF0b3IpIHsKKwkJcmV0dXJuIGNyZWF0ZUR5bmFtaWNOb2RlTGFiZWwoY3JlYXRlTmV4dER5bmFtaWNMYWJlbFVSSSgpLAorCQkJCXVyaU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQsIG5vZGVEZWNvcmF0b3IpOworCX0gLy8gY3JlYXRlRHluYW1pY05vZGVMYWJlbAorCisJLyoqCisJICogQHBhcmFtIGxhYmVsVVJJCisJICogQHBhcmFtIHVyaU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQKKwkgKiBAcmV0dXJuIGEgdW5pcXVlIGR5bmFtaWMgbGFiZWwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRlc3REeW5hbWljTm9kZUxhYmVsIGNyZWF0ZUR5bmFtaWNOb2RlTGFiZWwoCisJCQlmaW5hbCBVUkkgbGFiZWxVUkksIGZpbmFsIFVSSSB1cmlPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkLAorCQkJZmluYWwgTm9kZURlY29yYXRvciBub2RlRGVjb3JhdG9yKSB7CisJCWZpbmFsIFRlc3REeW5hbWljTm9kZUxhYmVsIHJldFZhbHVlID0gTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlVGVzdER5bmFtaWNOb2RlTGFiZWwoKTsKKwkJcmV0VmFsdWUuc2V0VVJJKGxhYmVsVVJJKTsKKwkJcmV0VmFsdWUuc2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCh1cmlPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKTsKKworCQlyZXRWYWx1ZS5zZXREZWNvcmF0b3Iobm9kZURlY29yYXRvcik7CisKKwkJZmluYWwgVGVzdEludGVnZXJMYWJlbFZhbHVlIGR5bmFtaWNMYWJlbEN1cnJlbnRWYWx1ZSA9IExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFCisJCQkJLmNyZWF0ZVRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSgpOworCQlmaW5hbCBUZXN0SW50ZWdlckxhYmVsVmFsdWUgZHluYW1pY0xhYmVsTmV4dFZhbHVlID0gTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlVGVzdEludGVnZXJMYWJlbFZhbHVlKCk7CisJCWR5bmFtaWNMYWJlbEN1cnJlbnRWYWx1ZQorCQkJCS5zZXRJKFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZS5DVVJSRU5UX0xBQkVMX0lOVEVHRVJfVkFMVUUpOworCQlkeW5hbWljTGFiZWxOZXh0VmFsdWUKKwkJCQkuc2V0SShUZXN0SW50ZWdlckxhYmVsVmFsdWUuTkVYVF9MQUJFTF9JTlRFR0VSX1ZBTFVFKTsKKworCQlyZXRWYWx1ZS5zZXRDdXJyZW50VmFsdWUoZHluYW1pY0xhYmVsQ3VycmVudFZhbHVlKTsKKwkJcmV0VmFsdWUuc2V0TmV4dFZhbHVlKGR5bmFtaWNMYWJlbE5leHRWYWx1ZSk7CisKKwkJYXNzZXJ0IHJldFZhbHVlLnNhbmUoKTsKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVEeW5hbWljTm9kZUxhYmVsCisKKwkvKioKKwkgKiBAcmV0dXJuIGEgdW5pcXVlIFVSSSBmb3IgYSBsYWJlbC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBVUkkgY3JlYXRlTmV4dER5bmFtaWNMYWJlbFVSSSgpIHsKKwkJcmV0dXJuIFNURU1VUkkuY3JlYXRlVVJJKCJEWU5BTUlDTEFCRUwiICsgIi8iICsgZHluYW1pY0xhYmVsQ291bnRlcisrKTsKKwl9IC8vIGNyZWF0ZU5leHREeW5hbWljTGFiZWxVUkkKKworCS8qKgorCSAqIEByZXR1cm4gYSB1bmlxdWUgVVJJIGZvciBhIElkZW50aWZpYWJsZSB0byBsYWJlbAorCSAqLworCXB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZU5leHRJZGVudGlmaWFibGVUb0xhYmVsVVJJKCkgeworCQlyZXR1cm4gU1RFTVVSSS5jcmVhdGVVUkkoIkZPT0JBUiIgKyAiLyIgKyBpZENvdW50ZXIrKyk7CisJfSAvLyBjcmVhdGVOZXh0VGhpbmdUb0xhYmVsVVJJCisKKwkvKioKKwkgKiBAcGFyYW0gbm9kZUFVUkkKKwkgKiAgICAgICAgICAgIHRoZSBVUkkgb2YgdGhlIEEgbm9kZSB0aGUgZWRnZSBsaW5rcyB0bworCSAqIEBwYXJhbSBub2RlQlVSSQorCSAqICAgICAgICAgICAgdGhlIFVSSSBvZiB0aGUgQiBub2RlIHRoZSBlZGdlIGxpbmtzIHRvCisJICogQHBhcmFtIGVkZ2VEZWNvcmF0b3IKKwkgKiBAcmV0dXJuIGEgZHluYW1pY2FsbHkgbGFiZWxlZCBlZGdlIGxpbmtpbmcgbm9kZXMgd2l0aCB0aGUgdHdvIFVSSSdzCisJICovCisJcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZUR5bmFtaWNhbGx5TGFiZWxlZEVkZ2UoZmluYWwgVVJJIG5vZGVBVVJJLAorCQkJZmluYWwgVVJJIG5vZGVCVVJJLCBFZGdlRGVjb3JhdG9yIGVkZ2VEZWNvcmF0b3IpIHsKKwkJcmV0dXJuIGNyZWF0ZUR5bmFtaWNhbGx5TGFiZWxlZEVkZ2Uobm9kZUFVUkksIG5vZGVCVVJJLAorCQkJCWNyZWF0ZU5leHRFZGdlVVJJKCksIGVkZ2VEZWNvcmF0b3IpOworCX0gLy8gY3JlYXRlRHluYW1pY2FsbHlMYWJlbGVkRWRnZQorCisJLyoqCisJICogQHBhcmFtIG5vZGVBVVJJCisJICogICAgICAgICAgICB0aGUgVVJJIG9mIHRoZSBBIG5vZGUgdGhlIGVkZ2UgbGlua3MgdG8KKwkgKiBAcGFyYW0gbm9kZUJVUkkKKwkgKiAgICAgICAgICAgIHRoZSBVUkkgb2YgdGhlIEIgbm9kZSB0aGUgZWRnZSBsaW5rcyB0bworCSAqIEBwYXJhbSBlZGdlVVJJCisJICogICAgICAgICAgICB1cmkgdG8gdXNlIGZvciB0aGUgZWRnZQorCSAqIEBwYXJhbSBlZGdlRGVjb3JhdG9yCisJICogQHJldHVybiBhIGR5bmFtaWNhbGx5IGxhYmVsZWQgZWRnZSBsaW5raW5nIG5vZGVzIHdpdGggdGhlIHR3byBVUkkncworCSAqLworCXB1YmxpYyBzdGF0aWMgRWRnZSBjcmVhdGVEeW5hbWljYWxseUxhYmVsZWRFZGdlKGZpbmFsIFVSSSBub2RlQVVSSSwKKwkJCWZpbmFsIFVSSSBub2RlQlVSSSwgZmluYWwgVVJJIGVkZ2VVUkksIEVkZ2VEZWNvcmF0b3IgZWRnZURlY29yYXRvcikgeworCQlmaW5hbCBFZGdlIGVkZ2UgPSBFZGdlSW1wbC5jcmVhdGVFZGdlKG5vZGVBVVJJLCBub2RlQlVSSSwgZWRnZVVSSSk7CisJCWZpbmFsIER5bmFtaWNFZGdlTGFiZWwgZGVsID0gY3JlYXRlRHluYW1pY0VkZ2VMYWJlbCgKKwkJCQljcmVhdGVOZXh0RHluYW1pY0xhYmVsVVJJKCksIGVkZ2UuZ2V0VVJJKCkpOworCQlkZWwuc2V0RGVjb3JhdG9yKGVkZ2VEZWNvcmF0b3IpOworCQllZGdlLnNldExhYmVsKGRlbCk7CisJCWFzc2VydCBlZGdlLnNhbmUoKTsKKwkJcmV0dXJuIGVkZ2U7CisJfSAvLyBjcmVhdGVEeW5hbWljYWxseUxhYmVsZWRFZGdlCisKKwkvKioKKwkgKiBAcGFyYW0gbGFiZWxVUkkKKwkgKiBAcGFyYW0gdXJpT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZAorCSAqIEByZXR1cm4gYSBEeW5hbWljRWRnZUxhYmVsCisJICovCisJcHJpdmF0ZSBzdGF0aWMgRHluYW1pY0VkZ2VMYWJlbCBjcmVhdGVEeW5hbWljRWRnZUxhYmVsKGZpbmFsIFVSSSBsYWJlbFVSSSwKKwkJCWZpbmFsIFVSSSB1cmlPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKSB7CisJCWZpbmFsIFRlc3REeW5hbWljRWRnZUxhYmVsIHJldFZhbHVlID0gTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlVGVzdER5bmFtaWNFZGdlTGFiZWwoKTsKKwkJcmV0VmFsdWUuc2V0VVJJKGxhYmVsVVJJKTsKKwkJcmV0VmFsdWUuc2V0VVJJT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCh1cmlPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKTsKKworCQlmaW5hbCBUZXN0SW50ZWdlckxhYmVsVmFsdWUgZHluYW1pY0xhYmVsQ3VycmVudFZhbHVlID0gTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlVGVzdEludGVnZXJMYWJlbFZhbHVlKCk7CisJCWZpbmFsIFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSBkeW5hbWljTGFiZWxOZXh0VmFsdWUgPSBMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVUZXN0SW50ZWdlckxhYmVsVmFsdWUoKTsKKwkJZHluYW1pY0xhYmVsQ3VycmVudFZhbHVlCisJCQkJLnNldEkoVGVzdEludGVnZXJMYWJlbFZhbHVlLkNVUlJFTlRfTEFCRUxfSU5URUdFUl9WQUxVRSk7CisJCWR5bmFtaWNMYWJlbE5leHRWYWx1ZQorCQkJCS5zZXRJKFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZS5ORVhUX0xBQkVMX0lOVEVHRVJfVkFMVUUpOworCisJCXJldFZhbHVlLnNldEN1cnJlbnRWYWx1ZShkeW5hbWljTGFiZWxDdXJyZW50VmFsdWUpOworCQlyZXRWYWx1ZS5zZXROZXh0VmFsdWUoZHluYW1pY0xhYmVsTmV4dFZhbHVlKTsKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVEeW5hbWljRWRnZUxhYmVsCisKKwkvKioKKwkgKiBAcGFyYW0gbm9kZUFVUkkKKwkgKiAgICAgICAgICAgIHRoZSBVUkkgb2YgdGhlIEEgbm9kZSB0aGUgZWRnZSBsaW5rcyB0bworCSAqIEBwYXJhbSBub2RlQlVSSQorCSAqICAgICAgICAgICAgdGhlIFVSSSBvZiB0aGUgQiBub2RlIHRoZSBlZGdlIGxpbmtzIHRvCisJICogQHJldHVybiBhIHN0YXRpY2FsbHkgbGFiZWxlZCBlZGdlIGxpbmtpbmcgbm9kZXMgd2l0aCB0aGUgdHdvIFVSSSdzCisJICovCisJcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZVN0YXRpY2FsbHlMYWJlbGVkRWRnZShmaW5hbCBVUkkgbm9kZUFVUkksCisJCQlmaW5hbCBVUkkgbm9kZUJVUkkpIHsKKwkJcmV0dXJuIGNyZWF0ZVN0YXRpY2FsbHlMYWJlbGVkRWRnZShjcmVhdGVOZXh0RWRnZVVSSSgpLCBub2RlQVVSSSwKKwkJCQlub2RlQlVSSSk7CisJfSAvLyBjcmVhdGVTdGF0aWNhbGx5TGFiZWxlZEVkZ2UKKworCS8qKgorCSAqIEBwYXJhbSBlZGdlVVJJCisJICogQHBhcmFtIG5vZGVBVVJJCisJICogQHBhcmFtIG5vZGVCVVJJCisJICogQHJldHVybiBhIHN0YXRpY2FsbHkgbGFiZWxlZCBlZGdlCisJICovCisJcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZVN0YXRpY2FsbHlMYWJlbGVkRWRnZShmaW5hbCBVUkkgZWRnZVVSSSwKKwkJCWZpbmFsIFVSSSBub2RlQVVSSSwgZmluYWwgVVJJIG5vZGVCVVJJKSB7CisJCXJldHVybiBjcmVhdGVTdGF0aWNhbGx5TGFiZWxlZEVkZ2UoZWRnZVVSSSwgbm9kZUFVUkksIG5vZGVCVVJJLCBmYWxzZSk7CisJfSAvLyBjcmVhdGVTdGF0aWNhbGx5TGFiZWxlZEVkZ2UKKworCS8qKgorCSAqIEBwYXJhbSBlZGdlVVJJCisJICogQHBhcmFtIG5vZGVBVVJJCisJICogQHBhcmFtIG5vZGVCVVJJCisJICogQHBhcmFtIGRpcmVjdGVkCisJICogQHJldHVybiBhIHN0YXRpY2FsbHkgbGFiZWxlZCBlZGdlCisJICovCisJcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZVN0YXRpY2FsbHlMYWJlbGVkRWRnZShmaW5hbCBVUkkgZWRnZVVSSSwKKwkJCWZpbmFsIFVSSSBub2RlQVVSSSwgZmluYWwgVVJJIG5vZGVCVVJJLCBmaW5hbCBib29sZWFuIGRpcmVjdGVkKSB7CisJCWZpbmFsIEVkZ2UgcmV0VmFsdWUgPSBFZGdlSW1wbC5jcmVhdGVFZGdlKG5vZGVBVVJJLCBub2RlQlVSSSwgZGlyZWN0ZWQsCisJCQkJZWRnZVVSSSk7CisJCXJldFZhbHVlLnNldExhYmVsKGNyZWF0ZVN0YXRpY0VkZ2VMYWJlbChyZXRWYWx1ZS5nZXRVUkkoKSwgcmV0VmFsdWUKKwkJCQkuZ2V0VVJJKCkpKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlU3RhdGljYWxseUxhYmVsZWRFZGdlCisKKwkvKioKKwkgKiBAcGFyYW0gbGFiZWxVUkkKKwkgKiBAcGFyYW0gdXJpT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZAorCSAqIEByZXR1cm4gYSBTdGF0aWNFZGdlTGFiZWwKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdGF0aWNFZGdlTGFiZWwgY3JlYXRlU3RhdGljRWRnZUxhYmVsKGZpbmFsIFVSSSBsYWJlbFVSSSwKKwkJCWZpbmFsIFVSSSB1cmlPZklkZW50aWZpYWJsZVRvQmVMYWJlbGVkKSB7CisJCWZpbmFsIFRlc3RTdGF0aWNFZGdlTGFiZWwgcmV0VmFsdWUgPSBMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVUZXN0U3RhdGljRWRnZUxhYmVsKCk7CisJCXJldFZhbHVlLnNldFVSSShsYWJlbFVSSSk7CisJCXJldFZhbHVlLnNldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQodXJpT2ZJZGVudGlmaWFibGVUb0JlTGFiZWxlZCk7CisKKwkJZmluYWwgVGVzdEludGVnZXJMYWJlbFZhbHVlIHN0YXRpY0xhYmVsQ3VycmVudFZhbHVlID0gTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlVGVzdEludGVnZXJMYWJlbFZhbHVlKCk7CisJCXN0YXRpY0xhYmVsQ3VycmVudFZhbHVlCisJCQkJLnNldEkoVGVzdEludGVnZXJMYWJlbFZhbHVlLkNVUlJFTlRfTEFCRUxfSU5URUdFUl9WQUxVRSk7CisJCXJldFZhbHVlLnNldEN1cnJlbnRWYWx1ZShzdGF0aWNMYWJlbEN1cnJlbnRWYWx1ZSk7CisKKwkJYXNzZXJ0IHJldFZhbHVlLnNhbmUoKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlU3RhdGljRWRnZUxhYmVsCisKKwkvKioKKwkgKiBAcmV0dXJuIGEgdW5pcXVlIFVSSSBmb3IgYW4gZWRnZS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBVUkkgY3JlYXRlTmV4dEVkZ2VVUkkoKSB7CisJCXJldHVybiBTVEVNVVJJLmNyZWF0ZVVSSSgiRURHRSIgKyAiLyIgKyBlZGdlQ291bnRlcisrKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbm9kZURlY29yYXRvcgorCSAqICAgICAgICAgICAgVE9ETworCSAqIEByZXR1cm4gYSBkeW5hbWljYWxseSBsYWJlbGVkIG5vZGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIE5vZGUgY3JlYXRlRHluYW1pY2FseUxhYmVsZWROb2RlKE5vZGVEZWNvcmF0b3Igbm9kZURlY29yYXRvcikgeworCQlmaW5hbCBOb2RlIHJldFZhbHVlID0gR3JhcGhGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVOb2RlKCk7CisJCXJldFZhbHVlLnNldFVSSShjcmVhdGVOZXh0Tm9kZVVSSSgpKTsKKworCQlmaW5hbCBEeW5hbWljTm9kZUxhYmVsIGR5bmFtaWNOb2RlTGFiZWwgPSBUZXN0VXRpbAorCQkJCS5jcmVhdGVEeW5hbWljTm9kZUxhYmVsKHJldFZhbHVlLmdldFVSSSgpLCBub2RlRGVjb3JhdG9yKTsKKworCQlyZXRWYWx1ZS5nZXRMYWJlbHMoKS5hZGQoZHluYW1pY05vZGVMYWJlbCk7CisKKwkJYXNzZXJ0IHJldFZhbHVlLnNhbmUoKTsKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVEeW5hbWljYWx5TGFiZWxlZE5vZGUKKworCS8qKgorCSAqIEBwYXJhbSBub2RlVVJJCisJICogQHJldHVybiBhIGR5bmFtaWNhbGx5IGxhYmVsZWQgbm9kZQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBzdGF0aWMgTm9kZSBjcmVhdGVTdGF0aWNhbGx5TGFiZWxlZE5vZGUoZmluYWwgVVJJIG5vZGVVUkkpIHsKKwkJZmluYWwgTm9kZSByZXRWYWx1ZSA9IEdyYXBoRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTm9kZSgpOworCQlyZXRWYWx1ZS5zZXRVUkkobm9kZVVSSSk7CisJCWZpbmFsIFN0YXRpY05vZGVMYWJlbCBzdGF0aWNOb2RlTGFiZWwgPSBUZXN0VXRpbC5jcmVhdGVTdGF0aWNOb2RlTGFiZWwoCisJCQkJVGVzdFV0aWwuY3JlYXRlTmV4dExhYmVsVVJJKCksIHJldFZhbHVlLmdldFVSSSgpKTsKKwkJcmV0VmFsdWUuZ2V0TGFiZWxzKCkuYWRkKHN0YXRpY05vZGVMYWJlbCk7CisKKwkJYXNzZXJ0IHJldFZhbHVlLnNhbmUoKTsKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVTdGF0aWNhbGx5TGFiZWxlZE5vZGUKKworCS8qKgorCSAqIEByZXR1cm4gYSBkeW5hbWljYWxseSBsYWJlbGVkIG5vZGUKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgc3RhdGljIE5vZGUgY3JlYXRlU3RhdGljYWxseUxhYmVsZWROb2RlKCkgeworCQlmaW5hbCBOb2RlIHJldFZhbHVlID0gR3JhcGhGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVOb2RlKCk7CisKKwkJcmV0VmFsdWUuc2V0VVJJKGNyZWF0ZU5leHROb2RlVVJJKCkpOworCQkKKwkJZmluYWwgU3RhdGljTm9kZUxhYmVsIHN0YXRpY05vZGVMYWJlbCA9IFRlc3RVdGlsLmNyZWF0ZVN0YXRpY05vZGVMYWJlbCgKKwkJCQlUZXN0VXRpbC5jcmVhdGVOZXh0TGFiZWxVUkkoKSwgcmV0VmFsdWUuZ2V0VVJJKCkpOworCQkvLyBzdGF0aWNOb2RlTGFiZWwuc2V0Tm9kZShyZXRWYWx1ZSk7CisJCXJldFZhbHVlLmdldExhYmVscygpLmFkZChzdGF0aWNOb2RlTGFiZWwpOworCisJCWFzc2VydCByZXRWYWx1ZS5zYW5lKCk7CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlU3RhdGljYWxseUxhYmVsZWROb2RlCisKKwkvKioKKwkgKiBAcmV0dXJuIGEgdW5pcXVlIFVSSSBmb3IgYSBub2RlLgorCSAqLworCXByaXZhdGUgc3RhdGljIFVSSSBjcmVhdGVOZXh0Tm9kZVVSSSgpIHsKKwkJcmV0dXJuIFNURU1VUkkuY3JlYXRlVVJJKCJOT0RFIiArICIvIiArIG5vZGVDb3VudGVyKyspOworCX0gLy8gY3JlYXRlTmV4dE5vZGVVUkkKKworCS8qKgorCSAqIEBwYXJhbSBncmFwaAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXByaXZhdGUgc3RhdGljIHZvaWQgcmVmcmVzaER1YmxpbkNvcmUoZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50aWZpYWJsZSkgeworCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gaWRlbnRpZmlhYmxlLmdldER1YmxpbkNvcmUoKTsKKwkJZGMucG9wdWxhdGUoKTsKKwkJZGMuc2V0Rm9ybWF0KGlkZW50aWZpYWJsZS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpLmdldE5zVVJJKCkpOworCQkvLyBkYy5zZXRTdWJqZWN0KCJKVW5pdCB0ZXN0IG91dHB1dCIpOworCX0gLy8gcmVmcmVzaER1YmxpbkNvcmUKKworfSAvLyBUZXN0VXRpbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvV29ybGRNb2RlbENyZWF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL1dvcmxkTW9kZWxDcmVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc3NTU0NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL1dvcmxkTW9kZWxDcmVhdG9yLmphdmEKQEAgLTAsMCArMSwzMDYgQEAKKy8vIFdvcmxkTW9kZWxDcmVhdG9yLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLkNvdW50cnlEaXJlY3RvcnlVdGlsaXRpZXMuQ291bnRyeUNvZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLkNvdW50cnlNb2RlbENyZWF0b3IuQ291bnRyeU1vZGVsUmVjb3JkOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5Db3VudHJ5TW9kZWxDcmVhdG9yLk1vZGVsUmVjb3JkOworCisvKioKKyAqIFRoaXMgY2xhc3MgY3JlYXRlcyBtb2RlbHMgb2YgdGhlIHdvcmxkIGF0IHZhcmlvdXMgcmVzb2x1dGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBXb3JsZE1vZGVsQ3JlYXRvciB7CisKKwkvKioKKwkgKiBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgIm1vZGVsIiBzdWItZGlyZWN0b3JpZXMKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09STERfRElSID0gIndvcmxkIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGZvcm1hdCBzdHJpbmcgZm9yIHRoZSBpZGVudGlmaWVyIG9mIGEgY291bnRyeSBncmFwaCBvciBtb2RlbAorCSAqIGZpbGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElGSUVSX0ZPUk1BVCA9ICJ7MH0vIiArIFdPUkxEX0RJUgorCQkJKyAiL3sxfS97Mn0iOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgcGF0aCB0byB0aGUgY291bnRyeSBtb2RlbHMgZGlyZWN0b3J5CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09STERfTU9ERUxfUEFUSCA9IENvdW50cnlHcmFwaENyZWF0b3IuUk9PVF9PVVRQVVRfRElSCisJCQkrIEZpbGUuc2VwYXJhdG9yCisJCQkrIENvdW50cnlNb2RlbENyZWF0b3IuTU9ERUxfT1VUUFVUX0RJUgorCQkJKyBGaWxlLnNlcGFyYXRvciArIFdPUkxEX0RJUjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JMRCA9ICJXb3JsZCI7CisKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciB1c2VkIGluIHdvcmxkIG1vZGVsIHJlY29yZCBpbnN0YW5jZXMuIEl0IGlzIGxpa2UgYQorCSAqIHtAbGluayBDb3VudHJ5Q29kZX0gLCBidXQgZm9yIHRoZSBlbnRpcmUgd29ybGQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUkxEX0lEID0gIldPUkxEIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGlkIG9mIHRoZSBleHRlbnNpb24gcG9pbnQgZXh0ZW5kZWQgYnkgIndvcmxkIiBtb2RlbHMgdGhhdCBhcmUKKwkgKiBwbHVnZ2VkIGludG8gU1RFTQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX01PREVMX1dPUkxEX0NBVEVHT1JZID0gQ291bnRyeU1vZGVsQ3JlYXRvci5JRF9NT0RFTF9QT0xJVElDQUxfQ0FURUdPUlkKKwkJCSsgIi4iICsgV09STEQudG9Mb3dlckNhc2UoKTsKKworCS8qKgorCSAqIEBwYXJhbSBhcmdzCisJICogICAgICAgICAgICBub25lCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJncykgeworCisJCWZpbmFsIENvdW50cnlNb2RlbENyZWF0b3IgY21jID0gbmV3IENvdW50cnlNb2RlbENyZWF0b3IoKTsKKworCQlmaW5hbCBMaXN0PExpc3Q8Q291bnRyeU1vZGVsUmVjb3JkPj4gbW9kZWxzQnlBZG1pbkxldmVsID0gY21jCisJCQkJLmNyZWF0ZUNvdW50cnlNb2RlbHMyKCk7CisKKwkJZmluYWwgV29ybGRNb2RlbENyZWF0b3Igd21jID0gbmV3IFdvcmxkTW9kZWxDcmVhdG9yKCk7CisKKwkJLy8gQ3JlYXRlIHRoZSB3b3JsZCBtb2RlbHMgYnkgZWFjaCBhZG1pbmlzdHJhdGlvbiBsZXZlbAorCQlmaW5hbCBMaXN0PFdvcmxkTW9kZWxSZWNvcmQ+IHdvcmxkTW9kZWxSZWNvcmRzID0gd21jCisJCQkJLmNyZWF0ZVdvcmxkTW9kZWxzKG1vZGVsc0J5QWRtaW5MZXZlbCk7CisJCXRyeSB7CisJCQl3bWMuc2VyaWFsaXplV29ybGRNb2RlbHMod29ybGRNb2RlbFJlY29yZHMsIFdPUkxEX01PREVMX1BBVEgpOworCisJCQlmaW5hbCBGaWxlIHdvcmxkTW9kZWxFeHRlbnNpb25GaWxlID0gbmV3IEZpbGUoV09STERfTU9ERUxfUEFUSAorCQkJCQkrIENvdW50cnlHcmFwaENyZWF0b3IuR1JBUEhfRVhURU5TSU9OX1BPSU5UX0ZJTEVfTkFNRSk7CisJCQlmaW5hbCBGaWxlIHdvcmxkTW9kZWxQbHVnaW5Qcm9wZXJ0aWVzRmlsZSA9IG5ldyBGaWxlKAorCQkJCQlXT1JMRF9NT0RFTF9QQVRICisJCQkJCQkJKyBDb3VudHJ5R3JhcGhDcmVhdG9yLkdSQVBIX1BMVUdJTl9QUk9QRVJUSUVTX1BPSU5UX0ZJTEVfTkFNRSk7CisKKwkJCWZpbmFsIEJ1ZmZlcmVkV3JpdGVyIHdvcmxkTW9kZWxPdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIoCisJCQkJCW5ldyBGaWxlV3JpdGVyKHdvcmxkTW9kZWxFeHRlbnNpb25GaWxlKSk7CisKKwkJCWZpbmFsIEJ1ZmZlcmVkV3JpdGVyIHBsdWdpbk91dCA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcigKKwkJCQkJd29ybGRNb2RlbFBsdWdpblByb3BlcnRpZXNGaWxlKSk7CisKKwkJCS8vIENyZWF0ZSBhIHNuaXBwZXQgb2YgeG1sIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIGEgcGx1Z2luLnhtbCBmaWxlCisJCQkvLyB0byBwbHVnIGludG8gU1RFTSB0aGUgbW9kZWxzIHdlIGp1c3Qgc2VyaWFsaXplZC4KKwkJCXdtYy5nZW5lcmF0ZU1vZGVsRXh0ZW5zaW9uUG9pbnRYTUwod29ybGRNb2RlbFJlY29yZHMsCisJCQkJCXdvcmxkTW9kZWxPdXQsIHBsdWdpbk91dCk7CisJCX0gLy8gdHJ5CisJCWNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfSAvLyBtYWluCisKKwkvKioKKwkgKiBHaXZlbiBhIGNvbGxlY3Rpb24gb2YgY291bnRyeSBtb2RlbHMgZ3JvdXBlZCBieSBhZG1pbmlzdHJhdGlvbiBsZXZlbCwKKwkgKiBjcmVhdGUgYSBoaWdoZXIgd29ybGQgbW9kZWwgZm9yIGVhY2ggbGV2ZWwgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlCisJICogY291bnRyeSBtb2RlbHMgZm9yIHRoYXQgbGV2ZWwuCisJICogCisJICogQHBhcmFtIG1vZGVsc0J5QWRtaW5MZXZlbAorCSAqICAgICAgICAgICAgYSBsaXN0IG9yZGVyZWQgYnkgYWRtaW5pc3RyYXRpb24gbGV2ZWwgb2YgbGlzdHMgb2YgbW9kZWwKKwkgKiAgICAgICAgICAgIHJlY29yZHMgZm9yIGVhY2ggYWRtaW5pc3RyYXRpb24gbGV2ZWwKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiB3b3JsZCBtb2RlbCByZWNvcmRzLCBvbmUgZm9yIGVhY2ggYWRtaW5pc3RyYXRpb24gbGV2ZWwuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIExpc3Q8V29ybGRNb2RlbFJlY29yZD4gY3JlYXRlV29ybGRNb2RlbHMoCisJCQlmaW5hbCBMaXN0PExpc3Q8Q291bnRyeU1vZGVsUmVjb3JkPj4gbW9kZWxzQnlBZG1pbkxldmVsKSB7CisJCWZpbmFsIExpc3Q8V29ybGRNb2RlbFJlY29yZD4gcmV0VmFsdWUgPSBuZXcgQXJyYXlMaXN0PFdvcmxkTW9kZWxSZWNvcmQ+KCk7CisKKwkJZm9yIChpbnQgYWRtaW5MZXZlbCA9IDA7IGFkbWluTGV2ZWwgPCBtb2RlbHNCeUFkbWluTGV2ZWwuc2l6ZSgpOyBhZG1pbkxldmVsKyspIHsKKworCQkJZmluYWwgTW9kZWwgd29ybGRNb2RlbCA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTW9kZWwoKTsKKwkJCWZpbmFsIER1YmxpbkNvcmUgZGMgPSB3b3JsZE1vZGVsLmdldER1YmxpbkNvcmUoKTsKKwkJCWRjLnBvcHVsYXRlKCk7CisJCQlkYy5zZXRUaXRsZSgiV29ybGQgTW9kZWwgKExldmVsICIgKyBhZG1pbkxldmVsICsgIiwgIgorCQkJCQkrIG1vZGVsc0J5QWRtaW5MZXZlbC5nZXQoYWRtaW5MZXZlbCkuc2l6ZSgpICsgIiBtb2RlbHMpIik7CisKKwkJCWZvciAoZmluYWwgQ291bnRyeU1vZGVsUmVjb3JkIG1vZGVsUmVjb3JkIDogbW9kZWxzQnlBZG1pbkxldmVsCisJCQkJCS5nZXQoYWRtaW5MZXZlbCkpIHsKKwkJCQl3b3JsZE1vZGVsLmdldE1vZGVscygpLmFkZChtb2RlbFJlY29yZC5nZXRNb2RlbCgpKTsKKwkJCX0gLy8gZm9yZWFjaCBNb2RlbFJlY29yZCBhdCBhZG1pbkxldmVsCisKKwkJCWZpbmFsIFdvcmxkTW9kZWxSZWNvcmQgd29ybGRNb2RlbFJlY29yZCA9IG5ldyBXb3JsZE1vZGVsUmVjb3JkKAorCQkJCQl3b3JsZE1vZGVsLCBXT1JMRF9JRCwgYWRtaW5MZXZlbCk7CisJCQl3b3JsZE1vZGVsLnNldFVSSShVUkkuY3JlYXRlVVJJKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQlJREVOVElGSUVSX0ZPUk1BVCwKKwkJCQkJQ291bnRyeUdyYXBoQ3JlYXRvci5HRU9HUkFQSFlfRklMRV9VUklfUFJFRklYLCBXT1JMRF9JRCwKKwkJCQkJd29ybGRNb2RlbFJlY29yZC5nZXRTZXJpYWxpemF0aW9uRmlsZU5hbWUoKSkpKTsKKworCQkJcmV0VmFsdWUuYWRkKHdvcmxkTW9kZWxSZWNvcmQpOworCQl9IC8vIGZvciBhZG1pbkxldmVsCisKKwkJZmluYWwgV29ybGRNb2RlbFJlY29yZCBtdWx0aUxldmVsV29ybGRNb2RlbCA9IGNyZWF0ZU11bHRpTGV2ZWxXb3JsZChyZXRWYWx1ZSk7CisJCXJldFZhbHVlLmFkZChtdWx0aUxldmVsV29ybGRNb2RlbCk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZVdvcmxkTW9kZWxzCisKKwkvKioKKwkgKiBDcmVhdGUgb25lIHdvcmxkIG1vZGVsIGNvbXBvc2VkIG9mIHRoZSBtb2RlbHMgb2YgdGhlIHdvcmxkIGF0IGVhY2gKKwkgKiBhZG1pbmlzdHJhdGlvbiBsZXZlbAorCSAqIAorCSAqIEBwYXJhbSB3b3JsZE1vZGVscworCSAqICAgICAgICAgICAgbGlzdCBvZiBtb2RlbHMgb3JkZXJlZCBieSBhZG1pbmlzdHJhdGlvbiBsZXZlbAorCSAqIEByZXR1cm4gYSBtb2RlbCBjb21wb3NlZCBvZiB0aGUgc3ViLW1vZGVscyBmb3IgdGhlIHdvcmxkIGF0IGVhY2ggbGV2ZWwKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgV29ybGRNb2RlbFJlY29yZCBjcmVhdGVNdWx0aUxldmVsV29ybGQoCisJCQlmaW5hbCBMaXN0PFdvcmxkTW9kZWxSZWNvcmQ+IHdvcmxkTW9kZWxzKSB7CisKKwkJZmluYWwgTW9kZWwgd29ybGRNb2RlbCA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTW9kZWwoKTsKKworCQlmaW5hbCBXb3JsZE1vZGVsUmVjb3JkIHJldFZhbHVlID0gbmV3IFdvcmxkTW9kZWxSZWNvcmQod29ybGRNb2RlbCwKKwkJCQlXT1JMRF9JRCwgMCk7CisKKwkJZm9yIChmaW5hbCBXb3JsZE1vZGVsUmVjb3JkIG1vZGVsUmVjb3JkIDogd29ybGRNb2RlbHMpIHsKKwkJCXdvcmxkTW9kZWwuZ2V0TW9kZWxzKCkuYWRkKAorCQkJCQkoTW9kZWwpRWNvcmVVdGlsLmNvcHkobW9kZWxSZWNvcmQuZ2V0TW9kZWwoKSkpOworCQkJcmV0VmFsdWUuYWRkQWRtaW5MZXZlbHMobW9kZWxSZWNvcmQuZ2V0QWRtaW5MZXZlbHMoKSk7CisJCX0KKworCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gd29ybGRNb2RlbC5nZXREdWJsaW5Db3JlKCk7CisJCWRjLnBvcHVsYXRlKCk7CisJCWRjLnNldFRpdGxlKCJXb3JsZCBNb2RlbCAoTGV2ZWxzICIKKwkJCQkrIHJldFZhbHVlLmdldEFkbWluTGV2ZWxzQXNTdHJpbmcoIiwgIikgKyAiKSIpOworCQlmaW5hbCBTdHJpbmcgdXJpU3RyaW5nID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSURFTlRJRklFUl9GT1JNQVQsCisJCQkJQ291bnRyeUdyYXBoQ3JlYXRvci5HRU9HUkFQSFlfRklMRV9VUklfUFJFRklYLCBXT1JMRF9JRCwKKwkJCQlyZXRWYWx1ZS5nZXRTZXJpYWxpemF0aW9uRmlsZU5hbWUoKSk7CisJCWRjLnNldElkZW50aWZpZXIodXJpU3RyaW5nKTsKKwkJd29ybGRNb2RlbC5zZXRVUkkoVVJJLmNyZWF0ZVVSSSh1cmlTdHJpbmcpKTsKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVNdWx0aUxldmVsV29ybGQKKworCS8qKgorCSAqIEBwYXJhbSB3b3JsZE1vZGVscworCSAqIEBwYXJhbSB1cmlQYXRoU3RyaW5nCisJICogICAgICAgICAgICB0aGUgcGF0aCB0byB0aGUgcm9vdCBvZiB0aGUgZm9sZGVyIHRvIHNlcmlhbGl6ZSB0aGUgbW9kZWxzIHRvCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXByaXZhdGUgdm9pZCBzZXJpYWxpemVXb3JsZE1vZGVscyhmaW5hbCBMaXN0PFdvcmxkTW9kZWxSZWNvcmQ+IHdvcmxkTW9kZWxzLAorCQkJZmluYWwgU3RyaW5nIHVyaVBhdGhTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWZvciAoZmluYWwgV29ybGRNb2RlbFJlY29yZCBtb2RlbFJlY29yZCA6IHdvcmxkTW9kZWxzKSB7CisJCQltb2RlbFJlY29yZC5zZXJpYWxpemUodXJpUGF0aFN0cmluZyk7CisJCX0gLy8gZm9yIGVhY2ggbW9kZWwgcmVjb3JkCisJfSAvLyBzZXJpYWxpemVXb3JsZE1vZGVscworCisJLyoqCisJICogQHBhcmFtIGNvdW50cnlOb2RlR3JhcGhzCisJICogICAgICAgICAgICBhIGxpc3Qgb2YgbWFwcyBvZiBtb2RlbHMgb2Ygbm9kZXMgZm9yIGNvdW50cmllcyBmb3IgZWFjaAorCSAqICAgICAgICAgICAgYWRtaW5zdHJhdGlvbiBsZXZlbAorCSAqIEBwYXJhbSBtb2RlbE91dAorCSAqICAgICAgICAgICAgdGhlIG91dHB1dCB3cml0ZXIgZm9yIHRoZSBwbHVnaW4ueG1sIGZpbGUgY29udGVudHMKKwkgKiBAcGFyYW0gcGx1Z2luT3V0CisJICogICAgICAgICAgICB0aGUgb3V0cHV0IHdyaXRlciBmb3IgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGVudHMKKwkgKi8KKwlwcml2YXRlIHZvaWQgZ2VuZXJhdGVNb2RlbEV4dGVuc2lvblBvaW50WE1MKAorCQkJZmluYWwgTGlzdDxXb3JsZE1vZGVsUmVjb3JkPiB3b3JsZE1vZGVsUmVjb3JkcywKKwkJCWZpbmFsIFdyaXRlciBtb2RlbE91dCwgZmluYWwgV3JpdGVyIHBsdWdpbk91dCkgeworCisJCS8vIFRoZSBkdWJsaW4gY29yZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVscyBsaWtlbHkgc2hhcmUgY29tbW9uCisJCS8vIGF0dHJpYnV0ZXMsIHdlIGNhbiBhdm9pZCBkdXBsaWNhdGUgZW50cmllcyBpbiB0aGUgZmlsZXMgd2UgZ2VuZXJhdGUKKwkJLy8gYnkgZmluZGluZyB0aGUgZHVwbGljYXRlIGVudHJpZXMgYW5kIG9ubHkgZ2VuZXJhdGluZyBhIHNpbmdsZSBrZXkgZm9yCisJCS8vIHRoZSBnZW5lcmF0ZWQgcGx1Z2lucyBmaWxlIGNvbnRlbnQuCisJCWZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gZGNWYWx1ZUtleU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisJCXRyeSB7CisJCQltb2RlbE91dC53cml0ZSgiPCEtLSBHZW5lcmF0ZWQgY29udGVudC4gIERvIG5vdCBtb2RpZnkgLS0+XG4iKTsKKworCQkJbW9kZWxPdXQud3JpdGUoTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCUNvdW50cnlHcmFwaENyZWF0b3IuWE1MX0VYVEVOU0lPTl9QT0lOVF9PUEVOLAorCQkJCQluZXcgT2JqZWN0W10geyBDb25zdGFudHMuSURfTU9ERUxfRVhURU5TSU9OX1BPSU5UIH0pKTsKKwkJCW1vZGVsT3V0LndyaXRlKCJcbiIpOworCisJCQlwbHVnaW5PdXQKKwkJCQkJLndyaXRlKCIjTW9kZWwgTkxTIEtleXMuICBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCwgZG8gbm90IG1vZGlmeS4gIgorCQkJCQkJCSsgQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkKKwkJCQkJCQkrICIgIgorCQkJCQkJCSsgU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLm5hbWUiKSArICJcbiIpOworCisJCQkvLyBXb3JsZCBNb2RlbAorCQkJQ291bnRyeUdyYXBoQ3JlYXRvci5vdXRwdXRDYXRlZ29yeShJRF9NT0RFTF9XT1JMRF9DQVRFR09SWSwgV09STEQsCisJCQkJCUNvdW50cnlNb2RlbENyZWF0b3IuSURfTU9ERUxfUE9MSVRJQ0FMX0NBVEVHT1JZLAorCQkJCQlDb3VudHJ5TW9kZWxDcmVhdG9yLk5MU19DQVRFR09SWV9LRVlfRk9STUFULCBtb2RlbE91dCwKKwkJCQkJcGx1Z2luT3V0KTsKKworCQkJZm9yIChmaW5hbCBXb3JsZE1vZGVsUmVjb3JkIHdvcmxkTW9kZWxSZWNvcmQgOiB3b3JsZE1vZGVsUmVjb3JkcykgeworCQkJCUNvdW50cnlHcmFwaENyZWF0b3Iub3V0cHV0RHVibGluQ29yZSh3b3JsZE1vZGVsUmVjb3JkLAorCQkJCQkJSURfTU9ERUxfV09STERfQ0FURUdPUlksIGRjVmFsdWVLZXlNYXAsIG1vZGVsT3V0LAorCQkJCQkJcGx1Z2luT3V0KTsKKwkJCX0gLy8gZm9yIGVhY2ggd29ybGQgbW9kZWwgcmVjb3JkCisKKwkJCW1vZGVsT3V0LndyaXRlKENvdW50cnlHcmFwaENyZWF0b3IuWE1MX0VYVEVOU0lPTl9QT0lOVF9DTE9TRSk7CisJCQltb2RlbE91dC5jbG9zZSgpOworCQkJcGx1Z2luT3V0LmNsb3NlKCk7CisJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKworCX0gLy8gZ2VuZXJhdGVNb2RlbEV4dGVuc2lvblBvaW50WE1MCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGEgd29ybGQgbW9kZWwgYW5kIGl0cyBtZXRhZGF0YS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFdvcmxkTW9kZWxSZWNvcmQgZXh0ZW5kcyBNb2RlbFJlY29yZCB7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBtb2RlbAorCQkgKiAgICAgICAgICAgIHRoZSB3b3JsZCBtb2RlbAorCQkgKiBAcGFyYW0gaWQKKwkJICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBvZiB0aGUgbW9kZWwKKwkJICogQHBhcmFtIGFkbWluTGV2ZWwKKwkJICogICAgICAgICAgICB0aGUgYWRtaW5pc3RyYXRpb24gbGV2ZWxzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwKKwkJICovCisJCXB1YmxpYyBXb3JsZE1vZGVsUmVjb3JkKGZpbmFsIE1vZGVsIG1vZGVsLCBmaW5hbCBTdHJpbmcgaWQsCisJCQkJZmluYWwgaW50IGFkbWluTGV2ZWwpIHsKKwkJCXRoaXMobW9kZWwsIGlkLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEludGVnZXIKKwkJCQkJLnZhbHVlT2YoYWRtaW5MZXZlbCkpKTsKKwkJfSAvLyBXb3JsZE1vZGVsUmVjb3JkCisKKwkJLyoqCisJCSAqIEBwYXJhbSBtb2RlbAorCQkgKiAgICAgICAgICAgIHRoZSB3b3JsZCBtb2RlbAorCQkgKiBAcGFyYW0gaWQKKwkJICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBvZiB0aGUgbW9kZWwKKwkJICogQHBhcmFtIGFkbWluTGV2ZWxzCisJCSAqICAgICAgICAgICAgdGhlIGFkbWluaXN0cmF0aW9uIGxldmVscyBjb250YWluZWQgaW4gdGhlIG1vZGVsCisJCSAqLworCQlwdWJsaWMgV29ybGRNb2RlbFJlY29yZChmaW5hbCBNb2RlbCBtb2RlbCwgZmluYWwgU3RyaW5nIGlkLAorCQkJCWZpbmFsIExpc3Q8SW50ZWdlcj4gYWRtaW5MZXZlbHMpIHsKKwkJCXN1cGVyKG1vZGVsLCBpZCwgYWRtaW5MZXZlbHMpOworCQl9IC8vIFdvcmxkTW9kZWxSZWNvcmQKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LmdyYXBoLkNvdW50cnlHcmFwaENyZWF0b3IuUmVjb3JkI2dldFR5cGUoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJCXJldHVybiAid29ybGQiOworCQl9IC8vIGdldFR5cGUKKworCX0gLy8gV29ybGRNb2RlbFJlY29yZAorfSAvLyBXb3JsZE1vZGVsQ3JlYXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9EZWNvcmF0b3JzRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9EZWNvcmF0b3JzRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZDZiMzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL0RlY29yYXRvcnNGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9yczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuRGVjb3JhdG9yc1BhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBEZWNvcmF0b3JzRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCURlY29yYXRvcnNGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuRGVjb3JhdG9yc0ZhY3RvcnlJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVzdCBFZGdlIERlY29yYXRvcjE8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlc3QgRWRnZSBEZWNvcmF0b3IxPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUZXN0RWRnZURlY29yYXRvcjEgY3JlYXRlVGVzdEVkZ2VEZWNvcmF0b3IxKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlc3QgR3JhcGggRGVjb3JhdG9yMTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVzdCBHcmFwaCBEZWNvcmF0b3IxPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUZXN0R3JhcGhEZWNvcmF0b3IxIGNyZWF0ZVRlc3RHcmFwaERlY29yYXRvcjEoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVzdCBOb2RlIERlY29yYXRvcjE8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlc3QgTm9kZSBEZWNvcmF0b3IxPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUZXN0Tm9kZURlY29yYXRvcjEgY3JlYXRlVGVzdE5vZGVEZWNvcmF0b3IxKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlc3QgU2NlbmFyaW8gR3JhcGggRGVjb3JhdG9yMTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVzdCBTY2VuYXJpbyBHcmFwaCBEZWNvcmF0b3IxPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEgY3JlYXRlVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogQGdlbmVyYXRlZAorCSAqLworCURlY29yYXRvcnNQYWNrYWdlIGdldERlY29yYXRvcnNQYWNrYWdlKCk7CisKK30gLy9EZWNvcmF0b3JzRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9EZWNvcmF0b3JzUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9EZWNvcmF0b3JzUGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMWI4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL0RlY29yYXRvcnNQYWNrYWdlLmphdmEKQEAgLTAsMCArMSw4NzcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLkRlY29yYXRvcnNGYWN0b3J5CisgKiBAbW9kZWwga2luZD0icGFja2FnZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBEZWNvcmF0b3JzUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTkFNRSA9ICJkZWNvcmF0b3JzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzLmVjb3JlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCURlY29yYXRvcnNQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuRGVjb3JhdG9yc1BhY2thZ2VJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkVkZ2VEZWNvcmF0b3IgPGVtPkVkZ2UgRGVjb3JhdG9yPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkVkZ2VEZWNvcmF0b3IKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuRGVjb3JhdG9yc1BhY2thZ2VJbXBsI2dldEVkZ2VEZWNvcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgRURHRV9ERUNPUkFUT1IgPSA0OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5pbXBsLlRlc3RFZGdlRGVjb3JhdG9yMUltcGwgPGVtPlRlc3QgRWRnZSBEZWNvcmF0b3IxPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuaW1wbC5UZXN0RWRnZURlY29yYXRvcjFJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5pbXBsLkRlY29yYXRvcnNQYWNrYWdlSW1wbCNnZXRUZXN0RWRnZURlY29yYXRvcjEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVEVTVF9FREdFX0RFQ09SQVRPUjEgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfRURHRV9ERUNPUkFUT1IxX19VUkkgPSBNb2RlbFBhY2thZ2UuRURHRV9ERUNPUkFUT1JfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfRURHRV9ERUNPUkFUT1IxX19UWVBFX1VSSSA9IE1vZGVsUGFja2FnZS5FREdFX0RFQ09SQVRPUl9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0VER0VfREVDT1JBVE9SMV9fRFVCTElOX0NPUkUgPSBNb2RlbFBhY2thZ2UuRURHRV9ERUNPUkFUT1JfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfRURHRV9ERUNPUkFUT1IxX19MQUJFTFNfVE9fVVBEQVRFID0gTW9kZWxQYWNrYWdlLkVER0VfREVDT1JBVE9SX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfRURHRV9ERUNPUkFUT1IxX19HUkFQSCA9IE1vZGVsUGFja2FnZS5FREdFX0RFQ09SQVRPUl9fR1JBUEg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfRURHRV9ERUNPUkFUT1IxX19FTkFCTEVEID0gTW9kZWxQYWNrYWdlLkVER0VfREVDT1JBVE9SX19FTkFCTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfRURHRV9ERUNPUkFUT1IxX19HUkFQSF9ERUNPUkFURUQgPSBNb2RlbFBhY2thZ2UuRURHRV9ERUNPUkFUT1JfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlIEFVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0VER0VfREVDT1JBVE9SMV9fTk9ERV9BVVJJID0gTW9kZWxQYWNrYWdlLkVER0VfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGUgQlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfRURHRV9ERUNPUkFUT1IxX19OT0RFX0JVUkkgPSBNb2RlbFBhY2thZ2UuRURHRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWRnZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0VER0VfREVDT1JBVE9SMV9fRURHRV9VUkkgPSBNb2RlbFBhY2thZ2UuRURHRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGVzdCBFZGdlIERlY29yYXRvcjE8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9FREdFX0RFQ09SQVRPUjFfRkVBVFVSRV9DT1VOVCA9IE1vZGVsUGFja2FnZS5FREdFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkdyYXBoRGVjb3JhdG9yIDxlbT5HcmFwaCBEZWNvcmF0b3I8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuR3JhcGhEZWNvcmF0b3IKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuRGVjb3JhdG9yc1BhY2thZ2VJbXBsI2dldEdyYXBoRGVjb3JhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEdSQVBIX0RFQ09SQVRPUiA9IDU7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuVGVzdEdyYXBoRGVjb3JhdG9yMUltcGwgPGVtPlRlc3QgR3JhcGggRGVjb3JhdG9yMTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuVGVzdEdyYXBoRGVjb3JhdG9yMUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuRGVjb3JhdG9yc1BhY2thZ2VJbXBsI2dldFRlc3RHcmFwaERlY29yYXRvcjEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVEVTVF9HUkFQSF9ERUNPUkFUT1IxID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0dSQVBIX0RFQ09SQVRPUjFfX1VSSSA9IE1vZGVsUGFja2FnZS5HUkFQSF9ERUNPUkFUT1JfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfR1JBUEhfREVDT1JBVE9SMV9fVFlQRV9VUkkgPSBNb2RlbFBhY2thZ2UuR1JBUEhfREVDT1JBVE9SX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfR1JBUEhfREVDT1JBVE9SMV9fRFVCTElOX0NPUkUgPSBNb2RlbFBhY2thZ2UuR1JBUEhfREVDT1JBVE9SX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0dSQVBIX0RFQ09SQVRPUjFfX0xBQkVMU19UT19VUERBVEUgPSBNb2RlbFBhY2thZ2UuR1JBUEhfREVDT1JBVE9SX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfR1JBUEhfREVDT1JBVE9SMV9fR1JBUEggPSBNb2RlbFBhY2thZ2UuR1JBUEhfREVDT1JBVE9SX19HUkFQSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9HUkFQSF9ERUNPUkFUT1IxX19FTkFCTEVEID0gTW9kZWxQYWNrYWdlLkdSQVBIX0RFQ09SQVRPUl9fRU5BQkxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0dSQVBIX0RFQ09SQVRPUjFfX0dSQVBIX0RFQ09SQVRFRCA9IE1vZGVsUGFja2FnZS5HUkFQSF9ERUNPUkFUT1JfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZXN0IEdyYXBoIERlY29yYXRvcjE8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9HUkFQSF9ERUNPUkFUT1IxX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuR1JBUEhfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvciA8ZW0+Tm9kZSBEZWNvcmF0b3I8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuaW1wbC5EZWNvcmF0b3JzUGFja2FnZUltcGwjZ2V0Tm9kZURlY29yYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBOT0RFX0RFQ09SQVRPUiA9IDY7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuVGVzdE5vZGVEZWNvcmF0b3IxSW1wbCA8ZW0+VGVzdCBOb2RlIERlY29yYXRvcjE8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5pbXBsLlRlc3ROb2RlRGVjb3JhdG9yMUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuRGVjb3JhdG9yc1BhY2thZ2VJbXBsI2dldFRlc3ROb2RlRGVjb3JhdG9yMSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBURVNUX05PREVfREVDT1JBVE9SMSA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9OT0RFX0RFQ09SQVRPUjFfX1VSSSA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9OT0RFX0RFQ09SQVRPUjFfX1RZUEVfVVJJID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfTk9ERV9ERUNPUkFUT1IxX19EVUJMSU5fQ09SRSA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWxzIFRvIFVwZGF0ZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9OT0RFX0RFQ09SQVRPUjFfX0xBQkVMU19UT19VUERBVEUgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfX0xBQkVMU19UT19VUERBVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGg8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9OT0RFX0RFQ09SQVRPUjFfX0dSQVBIID0gTW9kZWxQYWNrYWdlLk5PREVfREVDT1JBVE9SX19HUkFQSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9OT0RFX0RFQ09SQVRPUjFfX0VOQUJMRUQgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfX0VOQUJMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRGVjb3JhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9OT0RFX0RFQ09SQVRPUjFfX0dSQVBIX0RFQ09SQVRFRCA9IE1vZGVsUGFja2FnZS5OT0RFX0RFQ09SQVRPUl9fR1JBUEhfREVDT1JBVEVEOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRlc3QgTm9kZSBEZWNvcmF0b3IxPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfTk9ERV9ERUNPUkFUT1IxX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuTk9ERV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxSW1wbCA8ZW0+VGVzdCBTY2VuYXJpbyBHcmFwaCBEZWNvcmF0b3IxPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuaW1wbC5UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5pbXBsLkRlY29yYXRvcnNQYWNrYWdlSW1wbCNnZXRUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVEVTVF9TQ0VOQVJJT19HUkFQSF9ERUNPUkFUT1IxID0gMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX1VSSSA9IE1vZGVsUGFja2FnZS5HUkFQSF9ERUNPUkFUT1JfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMV9fVFlQRV9VUkkgPSBNb2RlbFBhY2thZ2UuR1JBUEhfREVDT1JBVE9SX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMV9fRFVCTElOX0NPUkUgPSBNb2RlbFBhY2thZ2UuR1JBUEhfREVDT1JBVE9SX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHMgVG8gVXBkYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX0xBQkVMU19UT19VUERBVEUgPSBNb2RlbFBhY2thZ2UuR1JBUEhfREVDT1JBVE9SX19MQUJFTFNfVE9fVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMV9fR1JBUEggPSBNb2RlbFBhY2thZ2UuR1JBUEhfREVDT1JBVE9SX19HUkFQSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9TQ0VOQVJJT19HUkFQSF9ERUNPUkFUT1IxX19FTkFCTEVEID0gTW9kZWxQYWNrYWdlLkdSQVBIX0RFQ09SQVRPUl9fRU5BQkxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBEZWNvcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX0dSQVBIX0RFQ09SQVRFRCA9IE1vZGVsUGFja2FnZS5HUkFQSF9ERUNPUkFUT1JfX0dSQVBIX0RFQ09SQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb3VibGUgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX0RPVUJMRV9WQUxVRSA9IE1vZGVsUGFja2FnZS5HUkFQSF9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9TQ0VOQVJJT19HUkFQSF9ERUNPUkFUT1IxX19JTlRfVkFMVUUgPSBNb2RlbFBhY2thZ2UuR1JBUEhfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cmluZyBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMV9fU1RSSU5HX1ZBTFVFID0gTW9kZWxQYWNrYWdlLkdSQVBIX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TVEVNIFRpbWUgVmFsdWU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX1NURU1fVElNRV9WQUxVRSA9IE1vZGVsUGFja2FnZS5HUkFQSF9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Qm9vbGVhbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMV9fQk9PTEVBTl9WQUxVRSA9IE1vZGVsUGFja2FnZS5HUkFQSF9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGVzdCBTY2VuYXJpbyBHcmFwaCBEZWNvcmF0b3IxPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMV9GRUFUVVJFX0NPVU5UID0gTW9kZWxQYWNrYWdlLkdSQVBIX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FZGdlIERlY29yYXRvcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFREdFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HcmFwaCBEZWNvcmF0b3I8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR1JBUEhfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk5vZGUgRGVjb3JhdG9yPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE5PREVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgPSAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5VUkk8L2VtPicgZGF0YSB0eXBlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5pbXBsLkRlY29yYXRvcnNQYWNrYWdlSW1wbCNnZXRVUkkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVVJJID0gNzsKKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEVkZ2VEZWNvcmF0b3IxIDxlbT5UZXN0IEVkZ2UgRGVjb3JhdG9yMTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UZXN0IEVkZ2UgRGVjb3JhdG9yMTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RFZGdlRGVjb3JhdG9yMQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0VGVzdEVkZ2VEZWNvcmF0b3IxKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RFZGdlRGVjb3JhdG9yMSNnZXROb2RlQVVSSSA8ZW0+Tm9kZSBBVVJJPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm9kZSBBVVJJPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEVkZ2VEZWNvcmF0b3IxI2dldE5vZGVBVVJJKCkKKwkgKiBAc2VlICNnZXRUZXN0RWRnZURlY29yYXRvcjEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFRlc3RFZGdlRGVjb3JhdG9yMV9Ob2RlQVVSSSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5UZXN0RWRnZURlY29yYXRvcjEjZ2V0Tm9kZUJVUkkgPGVtPk5vZGUgQlVSSTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vZGUgQlVSSTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RFZGdlRGVjb3JhdG9yMSNnZXROb2RlQlVSSSgpCisJICogQHNlZSAjZ2V0VGVzdEVkZ2VEZWNvcmF0b3IxKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUZXN0RWRnZURlY29yYXRvcjFfTm9kZUJVUkkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEVkZ2VEZWNvcmF0b3IxI2dldEVkZ2VVUkkgPGVtPkVkZ2UgVVJJPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWRnZSBVUkk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5UZXN0RWRnZURlY29yYXRvcjEjZ2V0RWRnZVVSSSgpCisJICogQHNlZSAjZ2V0VGVzdEVkZ2VEZWNvcmF0b3IxKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUZXN0RWRnZURlY29yYXRvcjFfRWRnZVVSSSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEdyYXBoRGVjb3JhdG9yMSA8ZW0+VGVzdCBHcmFwaCBEZWNvcmF0b3IxPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRlc3QgR3JhcGggRGVjb3JhdG9yMTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RHcmFwaERlY29yYXRvcjEKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFRlc3RHcmFwaERlY29yYXRvcjEoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3ROb2RlRGVjb3JhdG9yMSA8ZW0+VGVzdCBOb2RlIERlY29yYXRvcjE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVzdCBOb2RlIERlY29yYXRvcjE8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5UZXN0Tm9kZURlY29yYXRvcjEKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFRlc3ROb2RlRGVjb3JhdG9yMSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxIDxlbT5UZXN0IFNjZW5hcmlvIEdyYXBoIERlY29yYXRvcjE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVzdCBTY2VuYXJpbyBHcmFwaCBEZWNvcmF0b3IxPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxI2dldERvdWJsZVZhbHVlIDxlbT5Eb3VibGUgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Eb3VibGUgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEjZ2V0RG91YmxlVmFsdWUoKQorCSAqIEBzZWUgI2dldFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxX0RvdWJsZVZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSNnZXRJbnRWYWx1ZSA8ZW0+SW50IFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW50IFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxI2dldEludFZhbHVlKCkKKwkgKiBAc2VlICNnZXRUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMV9JbnRWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEjZ2V0U3RyaW5nVmFsdWUgPGVtPlN0cmluZyBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0cmluZyBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSNnZXRTdHJpbmdWYWx1ZSgpCisJICogQHNlZSAjZ2V0VGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFfU3RyaW5nVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxI2dldFNURU1UaW1lVmFsdWUgPGVtPlNURU0gVGltZSBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNURU0gVGltZSBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSNnZXRTVEVNVGltZVZhbHVlKCkKKwkgKiBAc2VlICNnZXRUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMV9TVEVNVGltZVZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSNpc0Jvb2xlYW5WYWx1ZSA8ZW0+Qm9vbGVhbiBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJvb2xlYW4gVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEjaXNCb29sZWFuVmFsdWUoKQorCSAqIEBzZWUgI2dldFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxX0Jvb2xlYW5WYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkVkZ2VEZWNvcmF0b3IgPGVtPkVkZ2UgRGVjb3JhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVkZ2UgRGVjb3JhdG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkVkZ2VEZWNvcmF0b3IKKwkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkVkZ2VEZWNvcmF0b3IiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRFZGdlRGVjb3JhdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuR3JhcGhEZWNvcmF0b3IgPGVtPkdyYXBoIERlY29yYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HcmFwaCBEZWNvcmF0b3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuR3JhcGhEZWNvcmF0b3IKKwkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkdyYXBoRGVjb3JhdG9yIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0R3JhcGhEZWNvcmF0b3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yIDxlbT5Ob2RlIERlY29yYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Ob2RlIERlY29yYXRvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yCisJICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Tm9kZURlY29yYXRvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkgPGVtPlVSSTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VVJJPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSQorCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRGF0YVR5cGUgZ2V0VVJJKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEZWNvcmF0b3JzRmFjdG9yeSBnZXREZWNvcmF0b3JzRmFjdG9yeSgpOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50CisJICogPHVsPgorCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisJICogPC91bD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50ZXJmYWNlIExpdGVyYWxzICB7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuaW1wbC5UZXN0RWRnZURlY29yYXRvcjFJbXBsIDxlbT5UZXN0IEVkZ2UgRGVjb3JhdG9yMTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuVGVzdEVkZ2VEZWNvcmF0b3IxSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuRGVjb3JhdG9yc1BhY2thZ2VJbXBsI2dldFRlc3RFZGdlRGVjb3JhdG9yMSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBURVNUX0VER0VfREVDT1JBVE9SMSA9IGVJTlNUQU5DRS5nZXRUZXN0RWRnZURlY29yYXRvcjEoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vZGUgQVVSSTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRFU1RfRURHRV9ERUNPUkFUT1IxX19OT0RFX0FVUkkgPSBlSU5TVEFOQ0UuZ2V0VGVzdEVkZ2VEZWNvcmF0b3IxX05vZGVBVVJJKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob2RlIEJVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBURVNUX0VER0VfREVDT1JBVE9SMV9fTk9ERV9CVVJJID0gZUlOU1RBTkNFLmdldFRlc3RFZGdlRGVjb3JhdG9yMV9Ob2RlQlVSSSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWRnZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBURVNUX0VER0VfREVDT1JBVE9SMV9fRURHRV9VUkkgPSBlSU5TVEFOQ0UuZ2V0VGVzdEVkZ2VEZWNvcmF0b3IxX0VkZ2VVUkkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuVGVzdEdyYXBoRGVjb3JhdG9yMUltcGwgPGVtPlRlc3QgR3JhcGggRGVjb3JhdG9yMTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuVGVzdEdyYXBoRGVjb3JhdG9yMUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5pbXBsLkRlY29yYXRvcnNQYWNrYWdlSW1wbCNnZXRUZXN0R3JhcGhEZWNvcmF0b3IxKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRFU1RfR1JBUEhfREVDT1JBVE9SMSA9IGVJTlNUQU5DRS5nZXRUZXN0R3JhcGhEZWNvcmF0b3IxKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5pbXBsLlRlc3ROb2RlRGVjb3JhdG9yMUltcGwgPGVtPlRlc3QgTm9kZSBEZWNvcmF0b3IxPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuaW1wbC5UZXN0Tm9kZURlY29yYXRvcjFJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuaW1wbC5EZWNvcmF0b3JzUGFja2FnZUltcGwjZ2V0VGVzdE5vZGVEZWNvcmF0b3IxKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRFU1RfTk9ERV9ERUNPUkFUT1IxID0gZUlOU1RBTkNFLmdldFRlc3ROb2RlRGVjb3JhdG9yMSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuaW1wbC5UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFJbXBsIDxlbT5UZXN0IFNjZW5hcmlvIEdyYXBoIERlY29yYXRvcjE8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5pbXBsLlRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5pbXBsLkRlY29yYXRvcnNQYWNrYWdlSW1wbCNnZXRUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVEVTVF9TQ0VOQVJJT19HUkFQSF9ERUNPUkFUT1IxID0gZUlOU1RBTkNFLmdldFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RG91YmxlIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgVEVTVF9TQ0VOQVJJT19HUkFQSF9ERUNPUkFUT1IxX19ET1VCTEVfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0VGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxX0RvdWJsZVZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBURVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX0lOVF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFfSW50VmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0cmluZyBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMV9fU1RSSU5HX1ZBTFVFID0gZUlOU1RBTkNFLmdldFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMV9TdHJpbmdWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U1RFTSBUaW1lIFZhbHVlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgVEVTVF9TQ0VOQVJJT19HUkFQSF9ERUNPUkFUT1IxX19TVEVNX1RJTUVfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0VGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxX1NURU1UaW1lVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJvb2xlYW4gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBURVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX0JPT0xFQU5fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0VGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxX0Jvb2xlYW5WYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkVkZ2VEZWNvcmF0b3IgPGVtPkVkZ2UgRGVjb3JhdG9yPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkVkZ2VEZWNvcmF0b3IKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5pbXBsLkRlY29yYXRvcnNQYWNrYWdlSW1wbCNnZXRFZGdlRGVjb3JhdG9yKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIEVER0VfREVDT1JBVE9SID0gZUlOU1RBTkNFLmdldEVkZ2VEZWNvcmF0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5HcmFwaERlY29yYXRvciA8ZW0+R3JhcGggRGVjb3JhdG9yPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkdyYXBoRGVjb3JhdG9yCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuaW1wbC5EZWNvcmF0b3JzUGFja2FnZUltcGwjZ2V0R3JhcGhEZWNvcmF0b3IoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgR1JBUEhfREVDT1JBVE9SID0gZUlOU1RBTkNFLmdldEdyYXBoRGVjb3JhdG9yKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvciA8ZW0+Tm9kZSBEZWNvcmF0b3I8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuRGVjb3JhdG9yc1BhY2thZ2VJbXBsI2dldE5vZGVEZWNvcmF0b3IoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgTk9ERV9ERUNPUkFUT1IgPSBlSU5TVEFOQ0UuZ2V0Tm9kZURlY29yYXRvcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VVJJPC9lbT4nIGRhdGEgdHlwZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuRGVjb3JhdG9yc1BhY2thZ2VJbXBsI2dldFVSSSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVEYXRhVHlwZSBVUkkgPSBlSU5TVEFOQ0UuZ2V0VVJJKCk7CisKKwl9CisKK30gLy9EZWNvcmF0b3JzUGFja2FnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9UZXN0RWRnZURlY29yYXRvcjEuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvVGVzdEVkZ2VEZWNvcmF0b3IxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4NjMyYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvVGVzdEVkZ2VEZWNvcmF0b3IxLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLy8gVGVzdEVkZ2VEZWNvcmF0b3IxLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRWRnZURlY29yYXRvcjsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIHRoZSBtb2RlbCBvZiBhbiBhYnN0cmFjdCBjbGFzcyBpbiBhbiBFTUYgbW9kZWwgdGhhdAorICogaXMgYW4gZXhhbXBsZSBvZiBhIEVkZ2VEZWNvcmF0b3IgaW1wbGVtZW50YXRpb24gdXNlZCBmb3IgdGVzdCBwdXJwb3Nlcy4KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGVzdEVkZ2VEZWNvcmF0b3IxIGV4dGVuZHMgRWRnZURlY29yYXRvciB7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgVVJJIGZvciBub2RlIEEKKwkgKiBAbW9kZWwKKwkgKi8KKwlVUkkgZ2V0Tm9kZUFVUkkoKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5UZXN0RWRnZURlY29yYXRvcjEjZ2V0Tm9kZUFVUkkgPGVtPk5vZGUgQVVSSTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm9kZSBBVVJJPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXROb2RlQVVSSSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Tm9kZUFVUkkoVVJJIHZhbHVlKTsKKworCS8qKgorCSAqIEByZXR1cm4gIHRoZSBVUkkgZm9yIG5vZGUgQgorCSAqIEBtb2RlbAorCSAqLworCVVSSSBnZXROb2RlQlVSSSgpOworCQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RFZGdlRGVjb3JhdG9yMSNnZXROb2RlQlVSSSA8ZW0+Tm9kZSBCVVJJPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob2RlIEJVUkk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE5vZGVCVVJJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXROb2RlQlVSSShVUkkgdmFsdWUpOworCisJLyoqCisJICogQHJldHVybiB0aGUgVVJJIG9mIHRoZSBlZGdlCisJICogQG1vZGVsCisJICovCisJVVJJIGdldEVkZ2VVUkkoKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5UZXN0RWRnZURlY29yYXRvcjEjZ2V0RWRnZVVSSSA8ZW0+RWRnZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVkZ2UgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRFZGdlVVJJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRFZGdlVVJJKFVSSSB2YWx1ZSk7CisKK30gLy8gVGVzdEVkZ2VEZWNvcmF0b3IxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9UZXN0R3JhcGhEZWNvcmF0b3IxLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL1Rlc3RHcmFwaERlY29yYXRvcjEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2M5YzE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9UZXN0R3JhcGhEZWNvcmF0b3IxLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLy8gVGVzdEdyYXBoRGVjb3JhdG9yMS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5HcmFwaERlY29yYXRvcjsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIHRoZSBtb2RlbCBvZiBhbiBhYnN0cmFjdCBjbGFzcyBpbiBhbiBFTUYgbW9kZWwgdGhhdAorICogaXMgYW4gZXhhbXBsZSBvZiBhIEdyYXBoRGVjb3JhdG9yIGltcGxlbWVudGF0aW9uIHVzZWQgZm9yIHRlc3QgcHVycG9zZXMuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRlc3RHcmFwaERlY29yYXRvcjEgZXh0ZW5kcyBHcmFwaERlY29yYXRvciB7CisJLy8gTm90aGluZworfSAvLyBUZXN0R3JhcGhEZWNvcmF0b3IxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9UZXN0Tm9kZURlY29yYXRvcjEuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvVGVzdE5vZGVEZWNvcmF0b3IxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1MDkxNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvVGVzdE5vZGVEZWNvcmF0b3IxLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLy8gVGVzdE5vZGVEZWNvcmF0b3IxLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3I7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyB0aGUgbW9kZWwgb2YgYW4gYWJzdHJhY3QgY2xhc3MgaW4gYW4gRU1GIG1vZGVsIHRoYXQKKyAqIGlzIGFuIGV4YW1wbGUgb2YgYSBOb2RlRGVjb3JhdG9yIGltcGxlbWVudGF0aW9uIHVzZWQgZm9yIHRlc3QgcHVycG9zZXMuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRlc3ROb2RlRGVjb3JhdG9yMSBleHRlbmRzIE5vZGVEZWNvcmF0b3IgeworCS8vIE5vdGhpbmcKK30gLy8gVGVzdE5vZGVEZWNvcmF0b3IxCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL1Rlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDYwOTkwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLy8gVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuR3JhcGhEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbzsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSB7QGxpbmsgR3JhcGh9IGRlY29yYXRvciB0aGF0IGRlY29yYXRlcyB0aGUgY2Fub25pY2FsCisgKiBncmFwaCBhdCB7QGxpbmsgU2NlbmFyaW99IGluaXRpYWxpemF0aW9uLgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEgZXh0ZW5kcyBHcmFwaERlY29yYXRvciB7CisJLyoqCisJICogdGVzdCBsYWJlbCBVUkkKKwkgKi8KKwlVUkkgTEFCRUxfVVJJID0gU1RFTVVSSS5jcmVhdGVVUkkoImR5bmFtaWNsYWJlbC9zY2VuYXJpbyIpOworCisJLyoqCisJICogQG1vZGVsCisJICovCisJZG91YmxlIGdldERvdWJsZVZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEjZ2V0RG91YmxlVmFsdWUgPGVtPkRvdWJsZSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RG91YmxlIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXREb3VibGVWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RG91YmxlVmFsdWUoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIEBtb2RlbAorCSAqLworCWludCBnZXRJbnRWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxI2dldEludFZhbHVlIDxlbT5JbnQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkludCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SW50VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEludFZhbHVlKGludCB2YWx1ZSk7CisKKwkvKioKKwkgKiBAbW9kZWwKKwkgKi8KKwlTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSNnZXRTdHJpbmdWYWx1ZSA8ZW0+U3RyaW5nIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJpbmcgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFN0cmluZ1ZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTdHJpbmdWYWx1ZShTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogQG1vZGVsCisJICovCisJU1RFTVRpbWUgZ2V0U1RFTVRpbWVWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxI2dldFNURU1UaW1lVmFsdWUgPGVtPlNURU0gVGltZSBWYWx1ZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U1RFTSBUaW1lIFZhbHVlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTVEVNVGltZVZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTVEVNVGltZVZhbHVlKFNURU1UaW1lIHZhbHVlKTsKKworCS8qKgorCSAqIEBtb2RlbAorCSAqLworCWJvb2xlYW4gaXNCb29sZWFuVmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSNpc0Jvb2xlYW5WYWx1ZSA8ZW0+Qm9vbGVhbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Qm9vbGVhbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNCb29sZWFuVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEJvb2xlYW5WYWx1ZShib29sZWFuIHZhbHVlKTsKK30gLy8gVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL2ltcGwvRGVjb3JhdG9yc0ZhY3RvcnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL2ltcGwvRGVjb3JhdG9yc0ZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU5ZjUyYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvaW1wbC9EZWNvcmF0b3JzRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDE5MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuRGVjb3JhdG9yc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuRGVjb3JhdG9yc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEVkZ2VEZWNvcmF0b3IxOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RHcmFwaERlY29yYXRvcjE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdE5vZGVEZWNvcmF0b3IxOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEZWNvcmF0b3JzRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBEZWNvcmF0b3JzRmFjdG9yeSB7CisJLyoqCisJICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgRGVjb3JhdG9yc0ZhY3RvcnkgaW5pdCgpIHsKKwkJdHJ5IHsKKwkJCURlY29yYXRvcnNGYWN0b3J5IHRoZURlY29yYXRvcnNGYWN0b3J5ID0gKERlY29yYXRvcnNGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzLmVjb3JlIik7IC8vJE5PTi1OTFMtMSQgCisJCQlpZiAodGhlRGVjb3JhdG9yc0ZhY3RvcnkgIT0gbnVsbCkgeworCQkJCXJldHVybiB0aGVEZWNvcmF0b3JzRmFjdG9yeTsKKwkJCX0KKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwkJcmV0dXJuIG5ldyBEZWNvcmF0b3JzRmFjdG9yeUltcGwoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEZWNvcmF0b3JzRmFjdG9yeUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKKwkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgRGVjb3JhdG9yc1BhY2thZ2UuVEVTVF9FREdFX0RFQ09SQVRPUjE6IHJldHVybiBjcmVhdGVUZXN0RWRnZURlY29yYXRvcjEoKTsKKwkJCWNhc2UgRGVjb3JhdG9yc1BhY2thZ2UuVEVTVF9HUkFQSF9ERUNPUkFUT1IxOiByZXR1cm4gY3JlYXRlVGVzdEdyYXBoRGVjb3JhdG9yMSgpOworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX05PREVfREVDT1JBVE9SMTogcmV0dXJuIGNyZWF0ZVRlc3ROb2RlRGVjb3JhdG9yMSgpOworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjE6IHJldHVybiBjcmVhdGVUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEoKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5VUkk6CisJCQkJcmV0dXJuIGNyZWF0ZVVSSUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIERlY29yYXRvcnNQYWNrYWdlLlVSSToKKwkJCQlyZXR1cm4gY29udmVydFVSSVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRlc3RFZGdlRGVjb3JhdG9yMSBjcmVhdGVUZXN0RWRnZURlY29yYXRvcjEoKSB7CisJCVRlc3RFZGdlRGVjb3JhdG9yMUltcGwgdGVzdEVkZ2VEZWNvcmF0b3IxID0gbmV3IFRlc3RFZGdlRGVjb3JhdG9yMUltcGwoKTsKKwkJcmV0dXJuIHRlc3RFZGdlRGVjb3JhdG9yMTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGVzdEdyYXBoRGVjb3JhdG9yMSBjcmVhdGVUZXN0R3JhcGhEZWNvcmF0b3IxKCkgeworCQlUZXN0R3JhcGhEZWNvcmF0b3IxSW1wbCB0ZXN0R3JhcGhEZWNvcmF0b3IxID0gbmV3IFRlc3RHcmFwaERlY29yYXRvcjFJbXBsKCk7CisJCXJldHVybiB0ZXN0R3JhcGhEZWNvcmF0b3IxOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUZXN0Tm9kZURlY29yYXRvcjEgY3JlYXRlVGVzdE5vZGVEZWNvcmF0b3IxKCkgeworCQlUZXN0Tm9kZURlY29yYXRvcjFJbXBsIHRlc3ROb2RlRGVjb3JhdG9yMSA9IG5ldyBUZXN0Tm9kZURlY29yYXRvcjFJbXBsKCk7CisJCXJldHVybiB0ZXN0Tm9kZURlY29yYXRvcjE7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSBjcmVhdGVUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEoKSB7CisJCVRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMUltcGwgdGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxID0gbmV3IFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMUltcGwoKTsKKwkJcmV0dXJuIHRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFVSSSBjcmVhdGVVUklGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoaW5pdGlhbFZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0VVJJVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGVjb3JhdG9yc1BhY2thZ2UgZ2V0RGVjb3JhdG9yc1BhY2thZ2UoKSB7CisJCXJldHVybiAoRGVjb3JhdG9yc1BhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBkZXByZWNhdGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBEZWNvcmF0b3JzUGFja2FnZSBnZXRQYWNrYWdlKCkgeworCQlyZXR1cm4gRGVjb3JhdG9yc1BhY2thZ2UuZUlOU1RBTkNFOworCX0KKworfSAvL0RlY29yYXRvcnNGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9pbXBsL0RlY29yYXRvcnNQYWNrYWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9pbXBsL0RlY29yYXRvcnNQYWNrYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMDBkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL2ltcGwvRGVjb3JhdG9yc1BhY2thZ2VJbXBsLmphdmEKQEAgLTAsMCArMSw0NDYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRWRnZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuR3JhcGhEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLkRlY29yYXRvcnNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLkRlY29yYXRvcnNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RFZGdlRGVjb3JhdG9yMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5UZXN0R3JhcGhEZWNvcmF0b3IxOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3ROb2RlRGVjb3JhdG9yMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5MYWJlbHNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEZWNvcmF0b3JzUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBEZWNvcmF0b3JzUGFja2FnZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGVzdEVkZ2VEZWNvcmF0b3IxRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHRlc3RHcmFwaERlY29yYXRvcjFFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGVzdE5vZGVEZWNvcmF0b3IxRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBlZGdlRGVjb3JhdG9yRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGdyYXBoRGVjb3JhdG9yRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIG5vZGVEZWNvcmF0b3JFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRGF0YVR5cGUgdXJpRURhdGFUeXBlID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQorCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgorCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKKwkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcworCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCisJICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLkRlY29yYXRvcnNQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBEZWNvcmF0b3JzUGFja2FnZUltcGwoKSB7CisJCXN1cGVyKGVOU19VUkksIERlY29yYXRvcnNGYWN0b3J5LmVJTlNUQU5DRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCisJICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKKwkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAorCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcworCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKKwkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgorCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKKwkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKKwkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6CisJICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKKwkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bworCSAqIHRob3NlIG9mIGFub3RoZXIuCisJICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQorCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIERlY29yYXRvcnNQYWNrYWdlIGluaXQoKSB7CisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChEZWNvcmF0b3JzUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEZWNvcmF0b3JzUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCisJCURlY29yYXRvcnNQYWNrYWdlSW1wbCB0aGVEZWNvcmF0b3JzUGFja2FnZSA9IChEZWNvcmF0b3JzUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgRGVjb3JhdG9yc1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgRGVjb3JhdG9yc1BhY2thZ2VJbXBsKCkpOworCisJCWlzSW5pdGVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKKwkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCUdyYXBoUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCU1vZGlmaWVyUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCVNjZW5hcmlvUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCVNlcXVlbmNlclBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCisJCUxhYmVsc1BhY2thZ2VJbXBsIHRoZUxhYmVsc1BhY2thZ2UgPSAoTGFiZWxzUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKExhYmVsc1BhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBMYWJlbHNQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKExhYmVsc1BhY2thZ2UuZU5TX1VSSSkgOiBMYWJlbHNQYWNrYWdlLmVJTlNUQU5DRSk7CisKKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKKwkJdGhlRGVjb3JhdG9yc1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUxhYmVsc1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQorCQl0aGVEZWNvcmF0b3JzUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUxhYmVsc1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKwkJdGhlRGVjb3JhdG9yc1BhY2thZ2UuZnJlZXplKCk7CisKKwkJcmV0dXJuIHRoZURlY29yYXRvcnNQYWNrYWdlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0VGVzdEVkZ2VEZWNvcmF0b3IxKCkgeworCQlyZXR1cm4gdGVzdEVkZ2VEZWNvcmF0b3IxRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRlc3RFZGdlRGVjb3JhdG9yMV9Ob2RlQVVSSSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXRlc3RFZGdlRGVjb3JhdG9yMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRlc3RFZGdlRGVjb3JhdG9yMV9Ob2RlQlVSSSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXRlc3RFZGdlRGVjb3JhdG9yMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRlc3RFZGdlRGVjb3JhdG9yMV9FZGdlVVJJKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGVzdEVkZ2VEZWNvcmF0b3IxRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRUZXN0R3JhcGhEZWNvcmF0b3IxKCkgeworCQlyZXR1cm4gdGVzdEdyYXBoRGVjb3JhdG9yMUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRlc3ROb2RlRGVjb3JhdG9yMSgpIHsKKwkJcmV0dXJuIHRlc3ROb2RlRGVjb3JhdG9yMUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSgpIHsKKwkJcmV0dXJuIHRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFfRG91YmxlVmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0ZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFfSW50VmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0ZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFfU3RyaW5nVmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0ZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFfU1RFTVRpbWVWYWx1ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMV9Cb29sZWFuVmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0ZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEVkZ2VEZWNvcmF0b3IoKSB7CisJCXJldHVybiBlZGdlRGVjb3JhdG9yRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0R3JhcGhEZWNvcmF0b3IoKSB7CisJCXJldHVybiBncmFwaERlY29yYXRvckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldE5vZGVEZWNvcmF0b3IoKSB7CisJCXJldHVybiBub2RlRGVjb3JhdG9yRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VVJJKCkgeworCQlyZXR1cm4gdXJpRURhdGFUeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEZWNvcmF0b3JzRmFjdG9yeSBnZXREZWNvcmF0b3JzRmFjdG9yeSgpIHsKKwkJcmV0dXJuIChEZWNvcmF0b3JzRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCisJICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOworCQlpc0NyZWF0ZWQgPSB0cnVlOworCisJCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcworCQl0ZXN0RWRnZURlY29yYXRvcjFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVTVF9FREdFX0RFQ09SQVRPUjEpOworCQljcmVhdGVFQXR0cmlidXRlKHRlc3RFZGdlRGVjb3JhdG9yMUVDbGFzcywgVEVTVF9FREdFX0RFQ09SQVRPUjFfX05PREVfQVVSSSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodGVzdEVkZ2VEZWNvcmF0b3IxRUNsYXNzLCBURVNUX0VER0VfREVDT1JBVE9SMV9fTk9ERV9CVVJJKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0ZXN0RWRnZURlY29yYXRvcjFFQ2xhc3MsIFRFU1RfRURHRV9ERUNPUkFUT1IxX19FREdFX1VSSSk7CisKKwkJdGVzdEdyYXBoRGVjb3JhdG9yMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhURVNUX0dSQVBIX0RFQ09SQVRPUjEpOworCisJCXRlc3ROb2RlRGVjb3JhdG9yMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhURVNUX05PREVfREVDT1JBVE9SMSk7CisKKwkJdGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxRUNsYXNzLCBURVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX0RPVUJMRV9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxRUNsYXNzLCBURVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX0lOVF9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxRUNsYXNzLCBURVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX1NUUklOR19WQUxVRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UodGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxRUNsYXNzLCBURVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX1NURU1fVElNRV9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxRUNsYXNzLCBURVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX0JPT0xFQU5fVkFMVUUpOworCisJCWVkZ2VEZWNvcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRURHRV9ERUNPUkFUT1IpOworCisJCWdyYXBoRGVjb3JhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdSQVBIX0RFQ09SQVRPUik7CisKKwkJbm9kZURlY29yYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOT0RFX0RFQ09SQVRPUik7CisKKwkJLy8gQ3JlYXRlIGRhdGEgdHlwZXMKKwkJdXJpRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFVSSSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOworCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKKwkJc2V0TmFtZShlTkFNRSk7CisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOworCQlzZXROc1VSSShlTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCisJCU1vZGVsUGFja2FnZSB0aGVNb2RlbFBhY2thZ2UgPSAoTW9kZWxQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGVsUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQl0ZXN0RWRnZURlY29yYXRvcjFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlTW9kZWxQYWNrYWdlLmdldEVkZ2VEZWNvcmF0b3IoKSk7CisJCXRlc3RHcmFwaERlY29yYXRvcjFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlTW9kZWxQYWNrYWdlLmdldEdyYXBoRGVjb3JhdG9yKCkpOworCQl0ZXN0Tm9kZURlY29yYXRvcjFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlTW9kZWxQYWNrYWdlLmdldE5vZGVEZWNvcmF0b3IoKSk7CisJCXRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RlbFBhY2thZ2UuZ2V0R3JhcGhEZWNvcmF0b3IoKSk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKwkJaW5pdEVDbGFzcyh0ZXN0RWRnZURlY29yYXRvcjFFQ2xhc3MsIFRlc3RFZGdlRGVjb3JhdG9yMS5jbGFzcywgIlRlc3RFZGdlRGVjb3JhdG9yMSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRUZXN0RWRnZURlY29yYXRvcjFfTm9kZUFVUkkoKSwgdGhpcy5nZXRVUkkoKSwgIm5vZGVBVVJJIiwgbnVsbCwgMCwgMSwgVGVzdEVkZ2VEZWNvcmF0b3IxLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFRlc3RFZGdlRGVjb3JhdG9yMV9Ob2RlQlVSSSgpLCB0aGlzLmdldFVSSSgpLCAibm9kZUJVUkkiLCBudWxsLCAwLCAxLCBUZXN0RWRnZURlY29yYXRvcjEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGVzdEVkZ2VEZWNvcmF0b3IxX0VkZ2VVUkkoKSwgdGhpcy5nZXRVUkkoKSwgImVkZ2VVUkkiLCBudWxsLCAwLCAxLCBUZXN0RWRnZURlY29yYXRvcjEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHRlc3RHcmFwaERlY29yYXRvcjFFQ2xhc3MsIFRlc3RHcmFwaERlY29yYXRvcjEuY2xhc3MsICJUZXN0R3JhcGhEZWNvcmF0b3IxIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyh0ZXN0Tm9kZURlY29yYXRvcjFFQ2xhc3MsIFRlc3ROb2RlRGVjb3JhdG9yMS5jbGFzcywgIlRlc3ROb2RlRGVjb3JhdG9yMSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3ModGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxRUNsYXNzLCBUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEuY2xhc3MsICJUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxX0RvdWJsZVZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJkb3VibGVWYWx1ZSIsIG51bGwsIDAsIDEsIFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFfSW50VmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgImludFZhbHVlIiwgbnVsbCwgMCwgMSwgVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMV9TdHJpbmdWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic3RyaW5nVmFsdWUiLCBudWxsLCAwLCAxLCBUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0VGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxX1NURU1UaW1lVmFsdWUoKSwgdGhlTW9kZWxQYWNrYWdlLmdldFNURU1UaW1lKCksIG51bGwsICJzVEVNVGltZVZhbHVlIiwgbnVsbCwgMCwgMSwgVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMV9Cb29sZWFuVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJib29sZWFuVmFsdWUiLCBudWxsLCAwLCAxLCBUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGVkZ2VEZWNvcmF0b3JFQ2xhc3MsIEVkZ2VEZWNvcmF0b3IuY2xhc3MsICJFZGdlRGVjb3JhdG9yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKGdyYXBoRGVjb3JhdG9yRUNsYXNzLCBHcmFwaERlY29yYXRvci5jbGFzcywgIkdyYXBoRGVjb3JhdG9yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKG5vZGVEZWNvcmF0b3JFQ2xhc3MsIE5vZGVEZWNvcmF0b3IuY2xhc3MsICJOb2RlRGVjb3JhdG9yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKKwkJaW5pdEVEYXRhVHlwZSh1cmlFRGF0YVR5cGUsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkuY2xhc3MsICJVUkkiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQ3JlYXRlIHJlc291cmNlCisJCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCX0KKworfSAvL0RlY29yYXRvcnNQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9pbXBsL1Rlc3RFZGdlRGVjb3JhdG9yMUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvaW1wbC9UZXN0RWRnZURlY29yYXRvcjFJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4N2JlMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvaW1wbC9UZXN0RWRnZURlY29yYXRvcjFJbXBsLmphdmEKQEAgLTAsMCArMSwzMzQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5FZGdlRGVjb3JhdG9ySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuVGVzdFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuRGVjb3JhdG9yc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuRGVjb3JhdG9yc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEVkZ2VEZWNvcmF0b3IxOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdER5bmFtaWNFZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0RHluYW1pY0xhYmVsMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RJbnRlZ2VyTGFiZWxWYWx1ZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVzdCBFZGdlIERlY29yYXRvcjE8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuVGVzdEVkZ2VEZWNvcmF0b3IxSW1wbCNnZXROb2RlQVVSSSA8ZW0+Tm9kZSBBVVJJPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5pbXBsLlRlc3RFZGdlRGVjb3JhdG9yMUltcGwjZ2V0Tm9kZUJVUkkgPGVtPk5vZGUgQlVSSTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuaW1wbC5UZXN0RWRnZURlY29yYXRvcjFJbXBsI2dldEVkZ2VVUkkgPGVtPkVkZ2UgVVJJPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVGVzdEVkZ2VEZWNvcmF0b3IxSW1wbCBleHRlbmRzIEVkZ2VEZWNvcmF0b3JJbXBsIGltcGxlbWVudHMKKwkJVGVzdEVkZ2VEZWNvcmF0b3IxIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm9kZUFVUkkoKSA8ZW0+Tm9kZSBBVVJJPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Tm9kZUFVUkkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVVJJIE5PREVfQVVSSV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb2RlQVVSSSgpIDxlbT5Ob2RlIEFVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROb2RlQVVSSSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFVSSSBub2RlQVVSSSA9IE5PREVfQVVSSV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb2RlQlVSSSgpIDxlbT5Ob2RlIEJVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROb2RlQlVSSSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgTk9ERV9CVVJJX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vZGVCVVJJKCkgPGVtPk5vZGUgQlVSSTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5vZGVCVVJJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVVJJIG5vZGVCVVJJID0gTk9ERV9CVVJJX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVkZ2VVUkkoKSA8ZW0+RWRnZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFZGdlVVJJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVSSSBFREdFX1VSSV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFZGdlVVJJKCkgPGVtPkVkZ2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RWRnZVVSSSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFVSSSBlZGdlVVJJID0gRURHRV9VUklfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRlc3RFZGdlRGVjb3JhdG9yMUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gRGVjb3JhdG9yc1BhY2thZ2UuTGl0ZXJhbHMuVEVTVF9FREdFX0RFQ09SQVRPUjE7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVUkkgZ2V0Tm9kZUFVUkkoKSB7CisJCXJldHVybiBub2RlQVVSSTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Tm9kZUFVUkkoVVJJIG5ld05vZGVBVVJJKSB7CisJCVVSSSBvbGROb2RlQVVSSSA9IG5vZGVBVVJJOworCQlub2RlQVVSSSA9IG5ld05vZGVBVVJJOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEZWNvcmF0b3JzUGFja2FnZS5URVNUX0VER0VfREVDT1JBVE9SMV9fTk9ERV9BVVJJLCBvbGROb2RlQVVSSSwgbm9kZUFVUkkpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVSSSBnZXROb2RlQlVSSSgpIHsKKwkJcmV0dXJuIG5vZGVCVVJJOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROb2RlQlVSSShVUkkgbmV3Tm9kZUJVUkkpIHsKKwkJVVJJIG9sZE5vZGVCVVJJID0gbm9kZUJVUkk7CisJCW5vZGVCVVJJID0gbmV3Tm9kZUJVUkk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfRURHRV9ERUNPUkFUT1IxX19OT0RFX0JVUkksIG9sZE5vZGVCVVJJLCBub2RlQlVSSSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVVJJIGdldEVkZ2VVUkkoKSB7CisJCXJldHVybiBlZGdlVVJJOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFZGdlVVJJKFVSSSBuZXdFZGdlVVJJKSB7CisJCVVSSSBvbGRFZGdlVVJJID0gZWRnZVVSSTsKKwkJZWRnZVVSSSA9IG5ld0VkZ2VVUkk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfRURHRV9ERUNPUkFUT1IxX19FREdFX1VSSSwgb2xkRWRnZVVSSSwgZWRnZVVSSSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfRURHRV9ERUNPUkFUT1IxX19OT0RFX0FVUkk6CisJCQkJcmV0dXJuIGdldE5vZGVBVVJJKCk7CisJCQljYXNlIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfRURHRV9ERUNPUkFUT1IxX19OT0RFX0JVUkk6CisJCQkJcmV0dXJuIGdldE5vZGVCVVJJKCk7CisJCQljYXNlIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfRURHRV9ERUNPUkFUT1IxX19FREdFX1VSSToKKwkJCQlyZXR1cm4gZ2V0RWRnZVVSSSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX0VER0VfREVDT1JBVE9SMV9fTk9ERV9BVVJJOgorCQkJCXNldE5vZGVBVVJJKChVUkkpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRGVjb3JhdG9yc1BhY2thZ2UuVEVTVF9FREdFX0RFQ09SQVRPUjFfX05PREVfQlVSSToKKwkJCQlzZXROb2RlQlVSSSgoVVJJKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfRURHRV9ERUNPUkFUT1IxX19FREdFX1VSSToKKwkJCQlzZXRFZGdlVVJJKChVUkkpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX0VER0VfREVDT1JBVE9SMV9fTk9ERV9BVVJJOgorCQkJCXNldE5vZGVBVVJJKE5PREVfQVVSSV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX0VER0VfREVDT1JBVE9SMV9fTk9ERV9CVVJJOgorCQkJCXNldE5vZGVCVVJJKE5PREVfQlVSSV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX0VER0VfREVDT1JBVE9SMV9fRURHRV9VUkk6CisJCQkJc2V0RWRnZVVSSShFREdFX1VSSV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX0VER0VfREVDT1JBVE9SMV9fTk9ERV9BVVJJOgorCQkJCXJldHVybiBOT0RFX0FVUklfRURFRkFVTFQgPT0gbnVsbCA/IG5vZGVBVVJJICE9IG51bGwgOiAhTk9ERV9BVVJJX0VERUZBVUxULmVxdWFscyhub2RlQVVSSSk7CisJCQljYXNlIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfRURHRV9ERUNPUkFUT1IxX19OT0RFX0JVUkk6CisJCQkJcmV0dXJuIE5PREVfQlVSSV9FREVGQVVMVCA9PSBudWxsID8gbm9kZUJVUkkgIT0gbnVsbCA6ICFOT0RFX0JVUklfRURFRkFVTFQuZXF1YWxzKG5vZGVCVVJJKTsKKwkJCWNhc2UgRGVjb3JhdG9yc1BhY2thZ2UuVEVTVF9FREdFX0RFQ09SQVRPUjFfX0VER0VfVVJJOgorCQkJCXJldHVybiBFREdFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gZWRnZVVSSSAhPSBudWxsIDogIUVER0VfVVJJX0VERUZBVUxULmVxdWFscyhlZGdlVVJJKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChub2RlQVVSSTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChub2RlQVVSSSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbm9kZUJVUkk6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobm9kZUJVUkkpOworCQlyZXN1bHQuYXBwZW5kKCIsIGVkZ2VVUkk6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZWRnZVVSSSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbCNkZWNvcmF0ZUdyYXBoKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGRlY29yYXRlR3JhcGgoU1RFTVRpbWUgdGltZSkgeworCQlmaW5hbCBOb2RlIG5vZGVBID0gZ2V0R3JhcGgoKS5nZXROb2RlKGdldE5vZGVBVVJJKCkpOworCQlmaW5hbCBOb2RlIG5vZGVCID0gZ2V0R3JhcGgoKS5nZXROb2RlKGdldE5vZGVCVVJJKCkpOworCisJCWZpbmFsIFRlc3RFZGdlRGVjb3JhdG9yMSB0ZWQgPSBEZWNvcmF0b3JzRmFjdG9yeS5lSU5TVEFOQ0UKKwkJLmNyZWF0ZVRlc3RFZGdlRGVjb3JhdG9yMSgpOworCQkKKwkJZmluYWwgRWRnZSBlZGdlID0gVGVzdFV0aWwuY3JlYXRlRHluYW1pY2FsbHlMYWJlbGVkRWRnZShnZXROb2RlQVVSSSgpLAorCQkJCWdldE5vZGVCVVJJKCksZ2V0RWRnZVVSSSgpLCB0ZWQpOworCQllZGdlLnNldEEobm9kZUEpOworCQllZGdlLnNldEIobm9kZUIpOworCQlub2RlQS5nZXRFZGdlcygpLmFkZChlZGdlKTsKKwkJbm9kZUIuZ2V0RWRnZXMoKS5hZGQoZWRnZSk7CisKKwkJZ2V0TGFiZWxzVG9VcGRhdGUoKS5hZGQoKER5bmFtaWNMYWJlbCllZGdlLmdldExhYmVsKCkpOworCisvLwkJZ2V0R3JhcGgoKS5hZGREeW5hbWljTGFiZWwoKER5bmFtaWNMYWJlbCkgZWRnZS5nZXRMYWJlbCgpKTsKKwkJZ2V0R3JhcGgoKS5wdXRFZGdlKGVkZ2UpOworCisJCWFzc2VydCBlZGdlLnNhbmUoKTsKKwkJcmV0dXJuIHRydWU7CisJfSAvLyBkZWNvcmF0ZUdyYXBoCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkRlY29yYXRvckltcGwjdXBkYXRlTGFiZWxzKEdyYXBoLCBTVEVNVGltZSwgbG9uZykKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZUxhYmVscyhTVEVNVGltZSB0aW1lLCBmaW5hbCBsb25nIHRpbWVEZWx0YSwgaW50IGN5Y2VsZSkgeworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yIGR5bmFtaWNMYWJlbEl0ZXIgPSBnZXRMYWJlbHNUb1VwZGF0ZSgpLml0ZXJhdG9yKCk7IGR5bmFtaWNMYWJlbEl0ZXIKKwkJCQkuaGFzTmV4dCgpOykgeworCQkJZmluYWwgVGVzdER5bmFtaWNFZGdlTGFiZWwgdGVzdExhYmVsID0gKFRlc3REeW5hbWljRWRnZUxhYmVsKSBkeW5hbWljTGFiZWxJdGVyCisJCQkJCS5uZXh0KCk7CisJCQl0ZXN0TGFiZWwuaW5jcmVtZW50KCk7CisJCX0gLy8gZm9yCisJfSAvLyB1cGRhdGVMYWJlbHMKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbCNyZXNldExhYmVscyhvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGgpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNldExhYmVscygpIHsKKwkJZmluYWwgVGVzdER5bmFtaWNMYWJlbDEgVEVTVF9MQUJFTCA9IFRlc3RVdGlsCisJCQkJLmNyZWF0ZUR5bmFtaWNMYWJlbChUZXN0VXRpbC5jcmVhdGVOZXh0SWRlbnRpZmlhYmxlVG9MYWJlbFVSSSgpKTsKKwkJZmluYWwgVGVzdEludGVnZXJMYWJlbFZhbHVlIFJFU0VUX1ZBTFVFID0gKFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSkgVEVTVF9MQUJFTAorCQkJCS5nZXRDdXJyZW50VmFsdWUoKTsKKwkJZm9yIChJdGVyYXRvciBsYWJlbEl0ZXIgPSBnZXRMYWJlbHNUb1VwZGF0ZSgpLml0ZXJhdG9yKCk7IGxhYmVsSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBUZXN0RHluYW1pY0VkZ2VMYWJlbCBkeW5hbWljTGFiZWwgPSAoVGVzdER5bmFtaWNFZGdlTGFiZWwpIGxhYmVsSXRlcgorCQkJCQkubmV4dCgpOworCQkJZHluYW1pY0xhYmVsLnNldEN1cnJlbnRWYWx1ZSgoTGFiZWxWYWx1ZSlFY29yZVV0aWwKKwkJCQkJLmNvcHkoUkVTRVRfVkFMVUUpKTsKKwkJfQorCX0gLy8gcmVzZXRMYWJlbHMKKworfSAvLyBUZXN0RWRnZURlY29yYXRvcjFJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL2ltcGwvVGVzdEdyYXBoRGVjb3JhdG9yMUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvaW1wbC9UZXN0R3JhcGhEZWNvcmF0b3IxSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOGRiODEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL2ltcGwvVGVzdEdyYXBoRGVjb3JhdG9yMUltcGwuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkdyYXBoRGVjb3JhdG9ySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuVGVzdFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuRGVjb3JhdG9yc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEdyYXBoRGVjb3JhdG9yMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljTGFiZWwxOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdEludGVnZXJMYWJlbFZhbHVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXN0IEdyYXBoIERlY29yYXRvcjE8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0R3JhcGhEZWNvcmF0b3IxSW1wbCBleHRlbmRzIEdyYXBoRGVjb3JhdG9ySW1wbCBpbXBsZW1lbnRzCisJCVRlc3RHcmFwaERlY29yYXRvcjEgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGVzdEdyYXBoRGVjb3JhdG9yMUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gRGVjb3JhdG9yc1BhY2thZ2UuTGl0ZXJhbHMuVEVTVF9HUkFQSF9ERUNPUkFUT1IxOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbCNkZWNvcmF0ZUdyYXBoKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGRlY29yYXRlR3JhcGgoU1RFTVRpbWUgdGltZSkgeworCQlmaW5hbCBEeW5hbWljTGFiZWwgZHluYW1pY0xhYmVsID0gVGVzdFV0aWwuY3JlYXRlRHluYW1pY0xhYmVsKGdldEdyYXBoKCkuZ2V0VVJJKCkpOworCQlnZXRMYWJlbHNUb1VwZGF0ZSgpLmFkZChkeW5hbWljTGFiZWwpOworCQlnZXRHcmFwaCgpLnB1dEdyYXBoTGFiZWwoZHluYW1pY0xhYmVsKTsKKwkJcmV0dXJuIHRydWU7CisJfSAvLyBkZWNvcmF0ZUdyYXBoCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkRlY29yYXRvckltcGwjdXBkYXRlTGFiZWxzKEdyYXBoLCBTVEVNVGltZSwgbG9uZykKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZUxhYmVscyhTVEVNVGltZSB0aW1lLCBmaW5hbCBsb25nIHRpbWVEZWx0YSwgaW50IGN5Y2xlKSB7CisJCWZvciAoZmluYWwgSXRlcmF0b3IgZHluYW1pY0xhYmVsSXRlciA9IGdldExhYmVsc1RvVXBkYXRlKCkuaXRlcmF0b3IoKTsgZHluYW1pY0xhYmVsSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBUZXN0RHluYW1pY0xhYmVsMSB0ZXN0TGFiZWwgPSAoVGVzdER5bmFtaWNMYWJlbDEpIGR5bmFtaWNMYWJlbEl0ZXIKKwkJCQkJLm5leHQoKTsKKwkJCXRlc3RMYWJlbC5pbmNyZW1lbnQoKTsKKwkJfSAvLyBmb3IKKwl9IC8vIHVwZGF0ZUxhYmVscworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5EZWNvcmF0b3JJbXBsI3Jlc2V0TGFiZWxzKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlc2V0TGFiZWxzKCkgeworCQlmaW5hbCBUZXN0RHluYW1pY0xhYmVsMSBURVNUX0xBQkVMID0gVGVzdFV0aWwKKwkJCQkuY3JlYXRlRHluYW1pY0xhYmVsKFRlc3RVdGlsLmNyZWF0ZU5leHRJZGVudGlmaWFibGVUb0xhYmVsVVJJKCkpOworCQlmaW5hbCBUZXN0SW50ZWdlckxhYmVsVmFsdWUgUkVTRVRfVkFMVUUgPSAoVGVzdEludGVnZXJMYWJlbFZhbHVlKSBURVNUX0xBQkVMCisJCQkJLmdldEN1cnJlbnRWYWx1ZSgpOworCQlmb3IgKEl0ZXJhdG9yIGxhYmVsSXRlciA9IGdldExhYmVsc1RvVXBkYXRlKCkuaXRlcmF0b3IoKTsgbGFiZWxJdGVyCisJCQkJLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIFRlc3REeW5hbWljTGFiZWwxIGR5bmFtaWNMYWJlbCA9IChUZXN0RHluYW1pY0xhYmVsMSkgbGFiZWxJdGVyCisJCQkJCS5uZXh0KCk7CisJCQlkeW5hbWljTGFiZWwuc2V0Q3VycmVudFZhbHVlKChMYWJlbFZhbHVlKUVjb3JlVXRpbAorCQkJCQkuY29weShSRVNFVF9WQUxVRSkpOworCQl9CisJCWFzc2VydCB0aGlzLnNhbmUoKTsKKwl9IC8vIHJlc2V0TGFiZWxzCit9IC8vIFRlc3RHcmFwaERlY29yYXRvcjFJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL2ltcGwvVGVzdE5vZGVEZWNvcmF0b3IxSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9pbXBsL1Rlc3ROb2RlRGVjb3JhdG9yMUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODhhNTZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9pbXBsL1Rlc3ROb2RlRGVjb3JhdG9yMUltcGwuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNOb2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLk5vZGVEZWNvcmF0b3JJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5UZXN0VXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5EZWNvcmF0b3JzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5EZWNvcmF0b3JzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5UZXN0Tm9kZURlY29yYXRvcjE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0RHluYW1pY0xhYmVsMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdEludGVnZXJMYWJlbFZhbHVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXN0IE5vZGUgRGVjb3JhdG9yMTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRlc3ROb2RlRGVjb3JhdG9yMUltcGwgZXh0ZW5kcyBOb2RlRGVjb3JhdG9ySW1wbCBpbXBsZW1lbnRzCisJCVRlc3ROb2RlRGVjb3JhdG9yMSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUZXN0Tm9kZURlY29yYXRvcjFJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIERlY29yYXRvcnNQYWNrYWdlLkxpdGVyYWxzLlRFU1RfTk9ERV9ERUNPUkFUT1IxOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbCNkZWNvcmF0ZUdyYXBoKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCkKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGRlY29yYXRlR3JhcGgoU1RFTVRpbWUgdGltZSkgeworCQlmaW5hbCBUZXN0Tm9kZURlY29yYXRvcjEgdG5kID0gRGVjb3JhdG9yc0ZhY3RvcnkuZUlOU1RBTkNFCisJCS5jcmVhdGVUZXN0Tm9kZURlY29yYXRvcjEoKTsKKwkJLy9nZXRHcmFwaCgpLmdldERlY29yYXRvcnMoKS5hZGQodG5kKTsKKwkJZm9yIChmaW5hbCBJdGVyYXRvciBub2RlSXRlciA9IGdldEdyYXBoKCkuZ2V0Tm9kZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBub2RlSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBOb2RlIG5vZGUgPSAoTm9kZSkgbm9kZUl0ZXIubmV4dCgpOworCQkJZmluYWwgRHluYW1pY05vZGVMYWJlbCBkeW5hbWljTm9kZUxhYmVsID0gVGVzdFV0aWwuY3JlYXRlRHluYW1pY05vZGVMYWJlbChub2RlLmdldFVSSSgpLCB0bmQpOworCQkJZ2V0R3JhcGgoKS5wdXROb2RlTGFiZWwoZHluYW1pY05vZGVMYWJlbCk7CisJCQlnZXRMYWJlbHNUb1VwZGF0ZSgpLmFkZChkeW5hbWljTm9kZUxhYmVsKTsKKwkJCW5vZGUuZ2V0TGFiZWxzKCkuYWRkKGR5bmFtaWNOb2RlTGFiZWwpOworCQl9IC8vIGZvcgorCQlyZXR1cm4gdHJ1ZTsKKwl9IC8vIGRlY29yYXRlR3JhcGgKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbCN1cGRhdGVMYWJlbHMoR3JhcGgsIFNURU1UaW1lLCBsb25nKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlTGFiZWxzKFNURU1UaW1lIHRpbWUsIGZpbmFsIGxvbmcgdGltZURlbHRhLCBpbnQgY3ljbGUpIHsKKwkJZm9yIChmaW5hbCBJdGVyYXRvciBkeW5hbWljTGFiZWxJdGVyID0gZ2V0TGFiZWxzVG9VcGRhdGUoKS5pdGVyYXRvcigpOyBkeW5hbWljTGFiZWxJdGVyCisJCQkJLmhhc05leHQoKTspIHsKKwkJCWZpbmFsIER5bmFtaWNMYWJlbCB0ZXN0TGFiZWwgPSAoRHluYW1pY0xhYmVsKSBkeW5hbWljTGFiZWxJdGVyCisJCQkJCS5uZXh0KCk7CisJCQlpZiAodGVzdExhYmVsIGluc3RhbmNlb2YgVGVzdER5bmFtaWNMYWJlbDEpIHsKKwkJCQlUZXN0RHluYW1pY0xhYmVsMSB0ZGwxID0gKFRlc3REeW5hbWljTGFiZWwxKSB0ZXN0TGFiZWw7CisJCQkJdGRsMS5pbmNyZW1lbnQoKTsKKwkJCX0KKwkJCWlmICh0ZXN0TGFiZWwgaW5zdGFuY2VvZiBUZXN0RHluYW1pY05vZGVMYWJlbCkgeworCQkJCVRlc3REeW5hbWljTm9kZUxhYmVsIHRkbmwgPSAoVGVzdER5bmFtaWNOb2RlTGFiZWwpIHRlc3RMYWJlbDsKKwkJCQl0ZG5sLmluY3JlbWVudCgpOworCQkJfQorCQl9IC8vIGZvcgorCX0gLy8gdXBkYXRlTGFiZWxzCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkRlY29yYXRvckltcGwjcmVzZXRMYWJlbHMob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVzZXRMYWJlbHMoKSB7CisJCWZpbmFsIFRlc3REeW5hbWljTGFiZWwxIFRFU1RfTEFCRUwgPSBUZXN0VXRpbAorCQkJCS5jcmVhdGVEeW5hbWljTGFiZWwoVGVzdFV0aWwuY3JlYXRlTmV4dElkZW50aWZpYWJsZVRvTGFiZWxVUkkoKSk7CisJCWZpbmFsIFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSBSRVNFVF9WQUxVRSA9IChUZXN0SW50ZWdlckxhYmVsVmFsdWUpIFRFU1RfTEFCRUwKKwkJCQkuZ2V0Q3VycmVudFZhbHVlKCk7CisJCWZvciAoSXRlcmF0b3IgbGFiZWxJdGVyID0gZ2V0TGFiZWxzVG9VcGRhdGUoKS5pdGVyYXRvcigpOyBsYWJlbEl0ZXIKKwkJCQkuaGFzTmV4dCgpOykgeworCQkJZmluYWwgRHluYW1pY0xhYmVsIGR5bmFtaWNMYWJlbCA9IChEeW5hbWljTGFiZWwpIGxhYmVsSXRlcgorCQkJCQkubmV4dCgpOworCQkJZHluYW1pY0xhYmVsLnNldEN1cnJlbnRWYWx1ZSgoTGFiZWxWYWx1ZSlFY29yZVV0aWwKKwkJCQkJLmNvcHkoUkVTRVRfVkFMVUUpKTsKKwkJfQorCX0gLy8gcmVzZXRMYWJlbHMKKworfSAvLyBUZXN0Tm9kZURlY29yYXRvcjFJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL2ltcGwvVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9pbXBsL1Rlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2NhZDg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9pbXBsL1Rlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMUltcGwuamF2YQpAQCAtMCwwICsxLDQzOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5pbXBsLkdyYXBoRGVjb3JhdG9ySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuVGVzdFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuRGVjb3JhdG9yc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdER5bmFtaWNMYWJlbDE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0SW50ZWdlckxhYmVsVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlc3QgU2NlbmFyaW8gR3JhcGggRGVjb3JhdG9yMTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuaW1wbC5UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFJbXBsI2dldERvdWJsZVZhbHVlIDxlbT5Eb3VibGUgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLmltcGwuVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxSW1wbCNnZXRJbnRWYWx1ZSA8ZW0+SW50IFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5pbXBsLlRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMUltcGwjZ2V0U3RyaW5nVmFsdWUgPGVtPlN0cmluZyBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuaW1wbC5UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFJbXBsI2dldFNURU1UaW1lVmFsdWUgPGVtPlNURU0gVGltZSBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuaW1wbC5UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFJbXBsI2lzQm9vbGVhblZhbHVlIDxlbT5Cb29sZWFuIFZhbHVlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxSW1wbCBleHRlbmRzIEdyYXBoRGVjb3JhdG9ySW1wbAorCQlpbXBsZW1lbnRzIFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERvdWJsZVZhbHVlKCkgPGVtPkRvdWJsZSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RG91YmxlVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIERPVUJMRV9WQUxVRV9FREVGQVVMVCA9IDAuMDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREb3VibGVWYWx1ZSgpIDxlbT5Eb3VibGUgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERvdWJsZVZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIGRvdWJsZVZhbHVlID0gRE9VQkxFX1ZBTFVFX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRWYWx1ZSgpIDxlbT5JbnQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEludFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJTlRfVkFMVUVfRURFRkFVTFQgPSAwOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludFZhbHVlKCkgPGVtPkludCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW50VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBpbnQgaW50VmFsdWUgPSBJTlRfVkFMVUVfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cmluZ1ZhbHVlKCkgPGVtPlN0cmluZyBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U3RyaW5nVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19WQUxVRV9FREVGQVVMVCA9IG51bGw7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RyaW5nVmFsdWUoKSA8ZW0+U3RyaW5nIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTdHJpbmdWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBzdHJpbmdWYWx1ZSA9IFNUUklOR19WQUxVRV9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTVEVNVGltZVZhbHVlKCkgPGVtPlNURU0gVGltZSBWYWx1ZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U1RFTVRpbWVWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFNURU1UaW1lIHNURU1UaW1lVmFsdWU7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNCb29sZWFuVmFsdWUoKSA8ZW0+Qm9vbGVhbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNCb29sZWFuVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBCT09MRUFOX1ZBTFVFX0VERUZBVUxUID0gZmFsc2U7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNCb29sZWFuVmFsdWUoKSA8ZW0+Qm9vbGVhbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNCb29sZWFuVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGJvb2xlYW5WYWx1ZSA9IEJPT0xFQU5fVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gRGVjb3JhdG9yc1BhY2thZ2UuTGl0ZXJhbHMuVEVTVF9TQ0VOQVJJT19HUkFQSF9ERUNPUkFUT1IxOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0RG91YmxlVmFsdWUoKSB7CisJCXJldHVybiBkb3VibGVWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREb3VibGVWYWx1ZShkb3VibGUgbmV3RG91YmxlVmFsdWUpIHsKKwkJZG91YmxlIG9sZERvdWJsZVZhbHVlID0gZG91YmxlVmFsdWU7CisJCWRvdWJsZVZhbHVlID0gbmV3RG91YmxlVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMV9fRE9VQkxFX1ZBTFVFLCBvbGREb3VibGVWYWx1ZSwgZG91YmxlVmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldEludFZhbHVlKCkgeworCQlyZXR1cm4gaW50VmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SW50VmFsdWUoaW50IG5ld0ludFZhbHVlKSB7CisJCWludCBvbGRJbnRWYWx1ZSA9IGludFZhbHVlOworCQlpbnRWYWx1ZSA9IG5ld0ludFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEZWNvcmF0b3JzUGFja2FnZS5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX0lOVF9WQUxVRSwgb2xkSW50VmFsdWUsIGludFZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpIHsKKwkJcmV0dXJuIHN0cmluZ1ZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0cmluZ1ZhbHVlKFN0cmluZyBuZXdTdHJpbmdWYWx1ZSkgeworCQlTdHJpbmcgb2xkU3RyaW5nVmFsdWUgPSBzdHJpbmdWYWx1ZTsKKwkJc3RyaW5nVmFsdWUgPSBuZXdTdHJpbmdWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRGVjb3JhdG9yc1BhY2thZ2UuVEVTVF9TQ0VOQVJJT19HUkFQSF9ERUNPUkFUT1IxX19TVFJJTkdfVkFMVUUsIG9sZFN0cmluZ1ZhbHVlLCBzdHJpbmdWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTVEVNVGltZSBnZXRTVEVNVGltZVZhbHVlKCkgeworCQlpZiAoc1RFTVRpbWVWYWx1ZSAhPSBudWxsICYmIHNURU1UaW1lVmFsdWUuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNURU1UaW1lVmFsdWUgPSAoSW50ZXJuYWxFT2JqZWN0KXNURU1UaW1lVmFsdWU7CisJCQlzVEVNVGltZVZhbHVlID0gKFNURU1UaW1lKWVSZXNvbHZlUHJveHkob2xkU1RFTVRpbWVWYWx1ZSk7CisJCQlpZiAoc1RFTVRpbWVWYWx1ZSAhPSBvbGRTVEVNVGltZVZhbHVlKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRGVjb3JhdG9yc1BhY2thZ2UuVEVTVF9TQ0VOQVJJT19HUkFQSF9ERUNPUkFUT1IxX19TVEVNX1RJTUVfVkFMVUUsIG9sZFNURU1UaW1lVmFsdWUsIHNURU1UaW1lVmFsdWUpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc1RFTVRpbWVWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU1RFTVRpbWUgYmFzaWNHZXRTVEVNVGltZVZhbHVlKCkgeworCQlyZXR1cm4gc1RFTVRpbWVWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTVEVNVGltZVZhbHVlKFNURU1UaW1lIG5ld1NURU1UaW1lVmFsdWUpIHsKKwkJU1RFTVRpbWUgb2xkU1RFTVRpbWVWYWx1ZSA9IHNURU1UaW1lVmFsdWU7CisJCXNURU1UaW1lVmFsdWUgPSBuZXdTVEVNVGltZVZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEZWNvcmF0b3JzUGFja2FnZS5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX1NURU1fVElNRV9WQUxVRSwgb2xkU1RFTVRpbWVWYWx1ZSwgc1RFTVRpbWVWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQm9vbGVhblZhbHVlKCkgeworCQlyZXR1cm4gYm9vbGVhblZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJvb2xlYW5WYWx1ZShib29sZWFuIG5ld0Jvb2xlYW5WYWx1ZSkgeworCQlib29sZWFuIG9sZEJvb2xlYW5WYWx1ZSA9IGJvb2xlYW5WYWx1ZTsKKwkJYm9vbGVhblZhbHVlID0gbmV3Qm9vbGVhblZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEZWNvcmF0b3JzUGFja2FnZS5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX0JPT0xFQU5fVkFMVUUsIG9sZEJvb2xlYW5WYWx1ZSwgYm9vbGVhblZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX0RPVUJMRV9WQUxVRToKKwkJCQlyZXR1cm4gbmV3IERvdWJsZShnZXREb3VibGVWYWx1ZSgpKTsKKwkJCWNhc2UgRGVjb3JhdG9yc1BhY2thZ2UuVEVTVF9TQ0VOQVJJT19HUkFQSF9ERUNPUkFUT1IxX19JTlRfVkFMVUU6CisJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEludFZhbHVlKCkpOworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX1NUUklOR19WQUxVRToKKwkJCQlyZXR1cm4gZ2V0U3RyaW5nVmFsdWUoKTsKKwkJCWNhc2UgRGVjb3JhdG9yc1BhY2thZ2UuVEVTVF9TQ0VOQVJJT19HUkFQSF9ERUNPUkFUT1IxX19TVEVNX1RJTUVfVkFMVUU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTVEVNVGltZVZhbHVlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U1RFTVRpbWVWYWx1ZSgpOworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX0JPT0xFQU5fVkFMVUU6CisJCQkJcmV0dXJuIGlzQm9vbGVhblZhbHVlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMV9fRE9VQkxFX1ZBTFVFOgorCQkJCXNldERvdWJsZVZhbHVlKCgoRG91YmxlKW5ld1ZhbHVlKS5kb3VibGVWYWx1ZSgpKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMV9fSU5UX1ZBTFVFOgorCQkJCXNldEludFZhbHVlKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX1NUUklOR19WQUxVRToKKwkJCQlzZXRTdHJpbmdWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMV9fU1RFTV9USU1FX1ZBTFVFOgorCQkJCXNldFNURU1UaW1lVmFsdWUoKFNURU1UaW1lKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMV9fQk9PTEVBTl9WQUxVRToKKwkJCQlzZXRCb29sZWFuVmFsdWUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRGVjb3JhdG9yc1BhY2thZ2UuVEVTVF9TQ0VOQVJJT19HUkFQSF9ERUNPUkFUT1IxX19ET1VCTEVfVkFMVUU6CisJCQkJc2V0RG91YmxlVmFsdWUoRE9VQkxFX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMV9fSU5UX1ZBTFVFOgorCQkJCXNldEludFZhbHVlKElOVF9WQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX1NUUklOR19WQUxVRToKKwkJCQlzZXRTdHJpbmdWYWx1ZShTVFJJTkdfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRGVjb3JhdG9yc1BhY2thZ2UuVEVTVF9TQ0VOQVJJT19HUkFQSF9ERUNPUkFUT1IxX19TVEVNX1RJTUVfVkFMVUU6CisJCQkJc2V0U1RFTVRpbWVWYWx1ZSgoU1RFTVRpbWUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX0JPT0xFQU5fVkFMVUU6CisJCQkJc2V0Qm9vbGVhblZhbHVlKEJPT0xFQU5fVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX0RPVUJMRV9WQUxVRToKKwkJCQlyZXR1cm4gZG91YmxlVmFsdWUgIT0gRE9VQkxFX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX0lOVF9WQUxVRToKKwkJCQlyZXR1cm4gaW50VmFsdWUgIT0gSU5UX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX1NUUklOR19WQUxVRToKKwkJCQlyZXR1cm4gU1RSSU5HX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBzdHJpbmdWYWx1ZSAhPSBudWxsIDogIVNUUklOR19WQUxVRV9FREVGQVVMVC5lcXVhbHMoc3RyaW5nVmFsdWUpOworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX1NURU1fVElNRV9WQUxVRToKKwkJCQlyZXR1cm4gc1RFTVRpbWVWYWx1ZSAhPSBudWxsOworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX0JPT0xFQU5fVkFMVUU6CisJCQkJcmV0dXJuIGJvb2xlYW5WYWx1ZSAhPSBCT09MRUFOX1ZBTFVFX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoZG91YmxlVmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZG91YmxlVmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGludFZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGludFZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBzdHJpbmdWYWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChzdHJpbmdWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgYm9vbGVhblZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGJvb2xlYW5WYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbCNkZWNvcmF0ZUdyYXBoKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBkZWNvcmF0ZUdyYXBoKFNURU1UaW1lIHRpbWUpIHsKKwkJZmluYWwgRHluYW1pY0xhYmVsIGR5bmFtaWNMYWJlbCA9IFRlc3RVdGlsLmNyZWF0ZUR5bmFtaWNMYWJlbChnZXRHcmFwaCgpCisJCQkJLmdldFVSSSgpKTsKKwkJZHluYW1pY0xhYmVsLnNldFVSSShMQUJFTF9VUkkpOworCQlnZXRMYWJlbHNUb1VwZGF0ZSgpLmFkZChkeW5hbWljTGFiZWwpOworCQlnZXRHcmFwaCgpLnB1dEdyYXBoTGFiZWwoZHluYW1pY0xhYmVsKTsKKy8vCQlnZXRHcmFwaCgpLmFkZER5bmFtaWNMYWJlbChkeW5hbWljTGFiZWwpOworCQlyZXR1cm4gdHJ1ZTsKKwl9IC8vIGRlY29yYXRlR3JhcGgKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLmltcGwuRGVjb3JhdG9ySW1wbCN1cGRhdGVMYWJlbHMoR3JhcGgsIFNURU1UaW1lLCBsb25nKQorCSAqICAgICAgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZUxhYmVscyhTVEVNVGltZSB0aW1lLCBmaW5hbCBsb25nIHRpbWVEZWx0YSwgaW50IGN5Y2xlKSB7CisJCWZvciAoZmluYWwgSXRlcmF0b3IgZHluYW1pY0xhYmVsSXRlciA9IGdldExhYmVsc1RvVXBkYXRlKCkuaXRlcmF0b3IoKTsgZHluYW1pY0xhYmVsSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBUZXN0RHluYW1pY0xhYmVsMSB0ZXN0TGFiZWwgPSAoVGVzdER5bmFtaWNMYWJlbDEpIGR5bmFtaWNMYWJlbEl0ZXIKKwkJCQkJLm5leHQoKTsKKwkJCXRlc3RMYWJlbC5pbmNyZW1lbnQoKTsKKwkJfSAvLyBmb3IKKwl9IC8vIHVwZGF0ZUxhYmVscworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5EZWNvcmF0b3JJbXBsI3Jlc2V0TGFiZWxzKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNldExhYmVscygpIHsKKwkJZmluYWwgVGVzdER5bmFtaWNMYWJlbDEgVEVTVF9MQUJFTCA9IFRlc3RVdGlsCisJCQkJLmNyZWF0ZUR5bmFtaWNMYWJlbChUZXN0VXRpbC5jcmVhdGVOZXh0SWRlbnRpZmlhYmxlVG9MYWJlbFVSSSgpKTsKKwkJZmluYWwgVGVzdEludGVnZXJMYWJlbFZhbHVlIFJFU0VUX1ZBTFVFID0gKFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSkgVEVTVF9MQUJFTAorCQkJCS5nZXRDdXJyZW50VmFsdWUoKTsKKwkJZm9yIChJdGVyYXRvciBsYWJlbEl0ZXIgPSBnZXRMYWJlbHNUb1VwZGF0ZSgpLml0ZXJhdG9yKCk7IGxhYmVsSXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBUZXN0RHluYW1pY0xhYmVsMSBkeW5hbWljTGFiZWwgPSAoVGVzdER5bmFtaWNMYWJlbDEpIGxhYmVsSXRlcgorCQkJCQkubmV4dCgpOworCQkJZHluYW1pY0xhYmVsLnNldEN1cnJlbnRWYWx1ZSgoTGFiZWxWYWx1ZSlFY29yZVV0aWwKKwkJCQkJLmNvcHkoUkVTRVRfVkFMVUUpKTsKKwkJfQorCX0gLy8gcmVzZXRMYWJlbHMKKworfSAvLyBUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL3ByZXNlbnRhdGlvbi9EZWNvcmF0b3JzQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvcHJlc2VudGF0aW9uL0RlY29yYXRvcnNBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNGE3ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL3ByZXNlbnRhdGlvbi9EZWNvcmF0b3JzQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpAQCAtMCwwICsxLDQzMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29udHJvbEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJDb250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5wcm92aWRlci5UZXN0dXRpbGl0eUVkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBpcyB0aGUgYWN0aW9uIGJhciBjb250cmlidXRvciBmb3IgdGhlIERlY29yYXRvcnMgbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRGVjb3JhdG9yc0FjdGlvbkJhckNvbnRyaWJ1dG9yCisJZXh0ZW5kcyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IKKwlpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvclBhcnQ7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBhY3Rpb24gb3BlbnMgdGhlIFByb3BlcnRpZXMgdmlldy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUFjdGlvbiBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24gPQorCQluZXcgQWN0aW9uKFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtIikpIC8vJE5PTi1OTFMtMSQKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJdHJ5IHsKKwkJCQkJZ2V0UGFnZSgpLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyBhY3Rpb24gcmVmcmVzaGVzIHRoZSB2aWV3ZXIgb2YgdGhlIGN1cnJlbnQgZWRpdG9yIGlmIHRoZSBlZGl0b3IKKwkgKiBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQWN0aW9uIHJlZnJlc2hWaWV3ZXJBY3Rpb24gPQorCQluZXcgQWN0aW9uKFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbSIpKSAvLyROT04tTkxTLTEkCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworCQkJCXJldHVybiBhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlpZiAoYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgeworCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpYWN0aXZlRWRpdG9yUGFydCkuZ2V0Vmlld2VyKCk7CisJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgeworCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcgorCSAqIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZUNoaWxkQWN0aW9uczsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCBmb3IgQ3JlYXRlQ2hpbGQgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcgorCSAqIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZVNpYmxpbmdBY3Rpb25zOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVTaWJsaW5nIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvbnRyaWJ1dG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEZWNvcmF0b3JzQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7CisJCXN1cGVyKEFERElUSU9OU19MQVNUX1NUWUxFKTsKKwkJbG9hZFJlc291cmNlQWN0aW9uID0gbmV3IExvYWRSZXNvdXJjZUFjdGlvbigpOworCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBWYWxpZGF0ZUFjdGlvbigpOworCQljb250cm9sQWN0aW9uID0gbmV3IENvbnRyb2xBY3Rpb24oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgU2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucyB0byB0aGUgdG9vbCBiYXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImRlY29yYXRvcnMtc2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImRlY29yYXRvcnMtYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHRvIHRoZSBtZW51IGJhciBhIG1lbnUgYW5kIHNvbWUgc2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucywKKwkgKiBhcyB3ZWxsIGFzIHRoZSBzdWItbWVudXMgZm9yIG9iamVjdCBjcmVhdGlvbiBpdGVtcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQlzdXBlci5jb250cmlidXRlVG9NZW51KG1lbnVNYW5hZ2VyKTsKKworCQlJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RlY29yYXRvcnNFZGl0b3JfbWVudSIpLCAib3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnNNZW51SUQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhY3Rpb25zIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucy1lbmQiKSk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVDaGlsZCBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCisJCS8vCisJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlU2libGluZyBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCisJCS8vCisJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gRm9yY2UgYW4gdXBkYXRlIGJlY2F1c2UgRWNsaXBzZSBoaWRlcyBlbXB0eSBtZW51cyBub3cuCisJCS8vCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcgorCQkJKG5ldyBJTWVudUxpc3RlbmVyKCkgeworCQkJCSBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCQkJCSBtZW51TWFuYWdlci51cGRhdGVBbGwodHJ1ZSk7CisJCQkJIH0KKwkJCSB9KTsKKworCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiBXaGVuIHRoZSBhY3RpdmUgZWRpdG9yIGNoYW5nZXMsIHRoaXMgcmVtZW1iZXJzIHRoZSBjaGFuZ2UgYW5kIHJlZ2lzdGVycyB3aXRoIGl0IGFzIGEgc2VsZWN0aW9uIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBwYXJ0KSB7CisJCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihwYXJ0KTsKKwkJYWN0aXZlRWRpdG9yUGFydCA9IHBhcnQ7CisKKwkJLy8gU3dpdGNoIHRvIHRoZSBuZXcgc2VsZWN0aW9uIHByb3ZpZGVyLgorCQkvLworCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCQl9CisJCWlmIChwYXJ0ID09IG51bGwpIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsKKwkJfQorCQllbHNlIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gcGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKKwkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKworCQkJLy8gRmFrZSBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IHRvIHVwZGF0ZSB0aGUgbWVudXMuCisJCQkvLworCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpICE9IG51bGwpIHsKKwkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn0sCisJICogaGFuZGxpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50fXMgYnkgcXVlcnlpbmcgZm9yIHRoZSBjaGlsZHJlbiBhbmQgc2libGluZ3MKKwkgKiB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZCB1cGRhdGluZyB0aGUgbWVudXMgYWNjb3JkaW5nbHkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJLy8gUmVtb3ZlIGFueSBtZW51IGl0ZW1zIGZvciBvbGQgc2VsZWN0aW9uLgorCQkvLworCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMpOworCQl9CisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucyk7CisJCX0KKworCQkvLyBRdWVyeSB0aGUgbmV3IHNlbGVjdGlvbiBmb3IgYXBwcm9wcmlhdGUgbmV3IGNoaWxkL3NpYmxpbmcgZGVzY3JpcHRvcnMKKwkJLy8KKwkJQ29sbGVjdGlvbjw/PiBuZXdDaGlsZERlc2NyaXB0b3JzID0gbnVsbDsKKwkJQ29sbGVjdGlvbjw/PiBuZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBudWxsOworCisJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7CisJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsKKwkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7CisKKwkJCUVkaXRpbmdEb21haW4gZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKKworCQkJbmV3Q2hpbGREZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgbnVsbCk7CisJCQluZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhudWxsLCBvYmplY3QpOworCQl9CisKKwkJLy8gR2VuZXJhdGUgYWN0aW9ucyBmb3Igc2VsZWN0aW9uOyBwb3B1bGF0ZSBhbmQgcmVkcmF3IHRoZSBtZW51cy4KKwkJLy8KKwkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMobmV3Q2hpbGREZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKKwkJY3JlYXRlU2libGluZ0FjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKG5ld1NpYmxpbmdEZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKKworCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKKwkJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOworCQl9CisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOworCQkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwKKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgeworCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVDaGlsZEFjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYWN0aW9uczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwKKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoQ29sbGVjdGlvbjw/PiBkZXNjcmlwdG9ycywgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJQ29sbGVjdGlvbjxJQWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOworCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgeworCQkJZm9yIChPYmplY3QgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7CisJCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCisJLyoqCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiB3aXRoIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbiwKKwkgKiBieSBpbnNlcnRpbmcgdGhlbSBiZWZvcmUgdGhlIHNwZWNpZmllZCBjb250cmlidXRpb24gaXRlbSA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4uCisJICogSWYgPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGV5IGFyZSBzaW1wbHkgYWRkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248PyBleHRlbmRzIElBY3Rpb24+IGFjdGlvbnMsIFN0cmluZyBjb250cmlidXRpb25JRCkgeworCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKElBY3Rpb24gYWN0aW9uIDogYWN0aW9ucykgeworCQkJCWlmIChjb250cmlidXRpb25JRCAhPSBudWxsKSB7CisJCQkJCW1hbmFnZXIuaW5zZXJ0QmVmb3JlKGNvbnRyaWJ1dGlvbklELCBhY3Rpb24pOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJbWFuYWdlci5hZGQoYWN0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCQorCS8qKgorCSAqIFRoaXMgcmVtb3ZlcyBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gYWxsIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkZXBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zKSB7CisJCWlmIChhY3Rpb25zICE9IG51bGwpIHsKKwkJCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtYW5hZ2VyLmdldEl0ZW1zKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CisJCQkJLy8gTG9vayBpbnRvIFN1YkNvbnRyaWJ1dGlvbkl0ZW1zCisJCQkJLy8KKwkJCQlJQ29udHJpYnV0aW9uSXRlbSBjb250cmlidXRpb25JdGVtID0gaXRlbXNbaV07CisJCQkJd2hpbGUgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBTdWJDb250cmlidXRpb25JdGVtKSB7CisJCQkJCWNvbnRyaWJ1dGlvbkl0ZW0gPSAoKFN1YkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0SW5uZXJJdGVtKCk7CisJCQkJfQorCisJCQkJLy8gRGVsZXRlIHRoZSBBY3Rpb25Db250cmlidXRpb25JdGVtcyB3aXRoIG1hdGNoaW5nIGFjdGlvbi4KKwkJCQkvLworCQkJCWlmIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCQlJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSljb250cmlidXRpb25JdGVtKS5nZXRBY3Rpb24oKTsKKwkJCQkJaWYgKGFjdGlvbnMuY29udGFpbnMoYWN0aW9uKSkgeworCQkJCQkJbWFuYWdlci5yZW1vdmUoY29udHJpYnV0aW9uSXRlbSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgcG9wLXVwIG1lbnUgYmVmb3JlIGl0IGFwcGVhcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQlzdXBlci5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOworCQlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG51bGw7CisKKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7CisJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZWRpdCIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBpbnNlcnRzIGdsb2JhbCBhY3Rpb25zIGJlZm9yZSB0aGUgImFkZGl0aW9ucy1lbmQiIHNlcGFyYXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRHbG9iYWxBY3Rpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zLWVuZCIsIG5ldyBTZXBhcmF0b3IoInVpLWFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKKworCQlyZWZyZXNoVmlld2VyQWN0aW9uLnNldEVuYWJsZWQocmVmcmVzaFZpZXdlckFjdGlvbi5pc0VuYWJsZWQoKSk7CQkKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCByZWZyZXNoVmlld2VyQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAorCisJCXN1cGVyLmFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgZW5zdXJlcyB0aGF0IGEgZGVsZXRlIGFjdGlvbiB3aWxsIGNsZWFuIHVwIGFsbCByZWZlcmVuY2VzIHRvIGRlbGV0ZWQgb2JqZWN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVBbGxSZWZlcmVuY2VzT25EZWxldGUoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9wcmVzZW50YXRpb24vRGVjb3JhdG9yc0VkaXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9wcmVzZW50YXRpb24vRGVjb3JhdG9yc0VkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZjcwZjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL3ByZXNlbnRhdGlvbi9EZWNvcmF0b3JzRWRpdG9yLmphdmEKQEAgLTAsMCArMSwxNTA0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLmVkaXRvci5Qcm9ibGVtRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVmFsaWRhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuY2VsbGVkaXRvci5BZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuTG9jYWxUcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuVmlld2VyRHJhZ0FkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLlVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSU1hcmtlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudmlldy5FeHRlbmRlZFByb3BlcnR5U2hlZXRQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXIuTW9kaWZpZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJvdmlkZXIuU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLnByb3ZpZGVyLlNlcXVlbmNlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLnByb3ZpZGVyLkRlY29yYXRvcnNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5wcm92aWRlci5UZXN0dXRpbGl0eUVkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5wcm92aWRlci5MYWJlbHNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TYXZlQXNEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKKworCisvKioKKyAqIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIERlY29yYXRvcnMgbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRGVjb3JhdG9yc0VkaXRvcgorCWV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydAorCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5Qcm92aWRlciwgSVNlbGVjdGlvblByb3ZpZGVyLCBJTWVudUxpc3RlbmVyLCBJVmlld2VyUHJvdmlkZXIsIElHb3RvTWFya2VyIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBlZGl0aW5nIGRvbWFpbiB0aGF0IGlzIHVzZWQgdG8gdHJhY2sgYWxsIGNoYW5nZXMgdG8gdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG9uZSBhZGFwdGVyIGZhY3RvcnkgdXNlZCBmb3IgcHJvdmlkaW5nIHZpZXdzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQ29udGVudE91dGxpbmVQYWdlIGNvbnRlbnRPdXRsaW5lUGFnZTsKKworCS8qKgorCSAqIFRoaXMgaXMgYSBrbHVkZ2UuLi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVN0YXR1c0xpbmVNYW5hZ2VyIGNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZSdzIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBjb250ZW50T3V0bGluZVZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHByb3BlcnR5IHNoZWV0IHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFByb3BlcnR5U2hlZXRQYWdlIHByb3BlcnR5U2hlZXRQYWdlOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdmlld2VyIHRoYXQgc2hhZG93cyB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb250ZW50IG91dGxpbmUuCisJICogVGhlIHBhcmVudCByZWxhdGlvbiBtdXN0IGJlIGNvcnJlY3RseSBkZWZpbmVkIGZvciB0aGlzIHRvIHdvcmsuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgc2VsZWN0aW9uVmlld2VyOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGNvbnRlbnQgdmlld2VyLCB3aGljaCBtYXkgYmUgZWl0aGVyIG9uZSBvZiB0aGUgdmlld2VycyBpbiB0aGUgcGFnZXMgb3IgdGhlIGNvbnRlbnQgb3V0bGluZSB2aWV3ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFZpZXdlciBjdXJyZW50Vmlld2VyOworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIHRvIHdoaWNoIGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn1zIHRoYXQgYXJlIGxpc3RlbmluZyB0byB0aGlzIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPigpOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgc2VsZWN0aW9uIG9mIHRoZSBlZGl0b3IgYXMgYSB3aG9sZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBlZGl0b3JTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOworCisJLyoqCisJICogVGhlIE1hcmtlckhlbHBlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgd29ya3NwYWNlIHJlc291cmNlIG1hcmtlcnMgcHJlc2VudGVkCisJICogaW4gRWNsaXBzZSdzIFByb2JsZW1zIFZpZXcuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1hcmtlckhlbHBlciBtYXJrZXJIZWxwZXIgPSBuZXcgRWRpdFVJTWFya2VySGVscGVyKCk7CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdoZW4gdGhlIG91dGxpbmUgYmVjb21lcyBhY3RpdmUKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPQorCQluZXcgSVBhcnRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCWlmIChwIGluc3RhbmNlb2YgQ29udGVudE91dGxpbmUpIHsKKwkJCQkJaWYgKCgoQ29udGVudE91dGxpbmUpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBjb250ZW50T3V0bGluZVBhZ2UpIHsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKERlY29yYXRvcnNFZGl0b3IudGhpcyk7CisKKwkJCQkJCXNldEN1cnJlbnRWaWV3ZXIoY29udGVudE91dGxpbmVWaWV3ZXIpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHAgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSB7CisJCQkJCWlmICgoKFByb3BlcnR5U2hlZXQpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBwcm9wZXJ0eVNoZWV0UGFnZSkgeworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoRGVjb3JhdG9yc0VkaXRvci50aGlzKTsKKwkJCQkJCWhhbmRsZUFjdGl2YXRlKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAocCA9PSBEZWNvcmF0b3JzRWRpdG9yLnRoaXMpIHsKKwkJCQkJaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQl9CisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIHNpbmNlIGxhc3QgYWN0aXZhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHNhdmVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBzYXZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBNYXAgdG8gc3RvcmUgdGhlIGRpYWdub3N0aWMgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4gcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4oKTsKKworCS8qKgorCSAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiBzaG91bGQgYmUgdXBkYXRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisKKwkvKioKKwkgKiBBZGFwdGVyIHVzZWQgdG8gdXBkYXRlIHRoZSBwcm9ibGVtIGluZGljYXRpb24gd2hlbiByZXNvdXJjZXMgYXJlIGRlbWFuZGVkIGxvYWRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUNvbnRlbnRBZGFwdGVyIHByb2JsZW1JbmRpY2F0aW9uQWRhcHRlciA9IAorCQluZXcgRUNvbnRlbnRBZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBSZXNvdXJjZSkgeworCQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVzb3VyY2UuY2xhc3MpKSB7CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQ6CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19FUlJPUlM6CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19XQVJOSU5HUzogeworCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOworCQkJCQkJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBudWxsKTsKKwkJCQkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBkaWFnbm9zdGljKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnJlbW92ZShyZXNvdXJjZSk7CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKSB7CisJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCQkJCQkJCQkJIH0KKwkJCQkJCQkJCSB9KTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJCQl9CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VGFyZ2V0KFJlc291cmNlIHRhcmdldCkgeworCQkJCWJhc2ljU2V0VGFyZ2V0KHRhcmdldCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgdW5zZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7CisJCQkJYmFzaWNVbnNldFRhcmdldCh0YXJnZXQpOworCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIGZvciB3b3Jrc3BhY2UgY2hhbmdlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9CisJCW5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKKwkJCQl0cnkgeworCQkJCQljbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7CisJCQkJCQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7CisJCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisJCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CisJCQkJCQkJaWYgKGRlbHRhLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7CisJCQkJCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCB8fAorCQkJCQkJCQkgICAgZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgZGVsdGEuZ2V0RmxhZ3MoKSAhPSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSB7CisJCQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKFVSSS5jcmVhdGVVUkkoZGVsdGEuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSwgZmFsc2UpOworCQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKKwkJCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKKwkJCQkJCQkJCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQllbHNlIGlmICghc2F2ZWRSZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlKSkgeworCQkJCQkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQl9CisKKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgeworCQkJCQkJCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOworCQkJCQkJfQorCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsKKwkJCQkJCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlczsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCVJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsKKwkJCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOworCisJCQkJCWlmICghdmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKSk7CisJCQkJCQlpZiAoIWlzRGlydHkoKSkgeworCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkJIGdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoRGVjb3JhdG9yc0VkaXRvci50aGlzLCBmYWxzZSk7CisJCQkJCQkJCQkgfQorCQkJCQkJCQkgfSk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlpZiAoIXZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOworCQkJCQkJaWYgKGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gRGVjb3JhdG9yc0VkaXRvci50aGlzKSB7CisJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCQkgaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQkJCQkJCSB9CisJCQkJCQkJCSB9KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIEhhbmRsZXMgYWN0aXZhdGlvbiBvZiB0aGUgZWRpdG9yIG9yIGl0J3MgYXNzb2NpYXRlZCB2aWV3cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0ZSgpIHsKKwkJLy8gUmVjb21wdXRlIHRoZSByZWFkIG9ubHkgc3RhdGUuCisJCS8vCisJCWlmIChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpICE9IG51bGwpIHsKKwkJICBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpLmNsZWFyKCk7CisKKwkJICAvLyBSZWZyZXNoIGFueSBhY3Rpb25zIHRoYXQgbWF5IGJlY29tZSBlbmFibGVkIG9yIGRpc2FibGVkLgorCQkgIC8vCisJCSAgc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKKwkJfQorCisJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCWlmIChoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpIHsKKwkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKERlY29yYXRvcnNFZGl0b3IudGhpcywgZmFsc2UpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVtb3ZlZFJlc291cmNlcy5jbGVhcigpOworCQkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgeworCQkJY2hhbmdlZFJlc291cmNlcy5yZW1vdmVBbGwoc2F2ZWRSZXNvdXJjZXMpOworCQkJaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpOworCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOworCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEhhbmRsZXMgd2hhdCB0byBkbyB3aXRoIGNoYW5nZWQgcmVzb3VyY2VzIG9uIGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpIHsKKwkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSAmJiAoIWlzRGlydHkoKSB8fCBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpKSB7CisJCQlpZiAoaXNEaXJ0eSgpKSB7CisJCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsKKwkJCX0KKwkJCWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZmx1c2goKTsKKworCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKwkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7CisJCQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKKwkJCQkJcmVzb3VyY2UudW5sb2FkKCk7CisJCQkJCXRyeSB7CisJCQkJCQlyZXNvdXJjZS5sb2FkKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJaWYgKCFyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5jb250YWluc0tleShyZXNvdXJjZSkpIHsKKwkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbi5pc1N0YWxlKGVkaXRvclNlbGVjdGlvbikpIHsKKwkJCQlzZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7CisJCQl9CisKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCX0KKwl9CisgIAorCS8qKgorCSAqIFVwZGF0ZXMgdGhlIHByb2JsZW1zIGluZGljYXRpb24gd2l0aCB0aGUgaW5mb3JtYXRpb24gZGVzY3JpYmVkIGluIHRoZSBzcGVjaWZpZWQgZGlhZ25vc3RpYy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpIHsKKwkJaWYgKHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKSB7CisJCQlCYXNpY0RpYWdub3N0aWMgZGlhZ25vc3RpYyA9CisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5PSywKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgbnVsbCwKKwkJCQkJIG5ldyBPYmplY3QgW10geyBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkgfSk7CisJCQlmb3IgKERpYWdub3N0aWMgY2hpbGREaWFnbm9zdGljIDogcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAudmFsdWVzKCkpIHsKKwkJCQlpZiAoY2hpbGREaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQlkaWFnbm9zdGljLmFkZChjaGlsZERpYWdub3N0aWMpOworCQkJCX0KKwkJCX0KKworCQkJaW50IGxhc3RFZGl0b3JQYWdlID0gZ2V0UGFnZUNvdW50KCkgLSAxOworCQkJaWYgKGxhc3RFZGl0b3JQYWdlID49IDAgJiYgZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSBpbnN0YW5jZW9mIFByb2JsZW1FZGl0b3JQYXJ0KSB7CisJCQkJKChQcm9ibGVtRWRpdG9yUGFydClnZXRFZGl0b3IobGFzdEVkaXRvclBhZ2UpKS5zZXREaWFnbm9zdGljKGRpYWdub3N0aWMpOworCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQlzZXRBY3RpdmVQYWdlKGxhc3RFZGl0b3JQYWdlKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCVByb2JsZW1FZGl0b3JQYXJ0IHByb2JsZW1FZGl0b3JQYXJ0ID0gbmV3IFByb2JsZW1FZGl0b3JQYXJ0KCk7CisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsKKwkJCQlwcm9ibGVtRWRpdG9yUGFydC5zZXRNYXJrZXJIZWxwZXIobWFya2VySGVscGVyKTsKKwkJCQl0cnkgeworCQkJCQlhZGRQYWdlKCsrbGFzdEVkaXRvclBhZ2UsIHByb2JsZW1FZGl0b3JQYXJ0LCBnZXRFZGl0b3JJbnB1dCgpKTsKKwkJCQkJc2V0UGFnZVRleHQobGFzdEVkaXRvclBhZ2UsIHByb2JsZW1FZGl0b3JQYXJ0LmdldFBhcnROYW1lKCkpOworCQkJCQlzZXRBY3RpdmVQYWdlKGxhc3RFZGl0b3JQYWdlKTsKKwkJCQkJc2hvd1RhYnMoKTsKKwkJCQl9CisJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfQorCisJCQlpZiAobWFya2VySGVscGVyLmhhc01hcmtlcnMoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKSkgeworCQkJCW1hcmtlckhlbHBlci5kZWxldGVNYXJrZXJzKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCXRyeSB7CisJCQkJCQltYXJrZXJIZWxwZXIuY3JlYXRlTWFya2VycyhkaWFnbm9zdGljKTsKKwkJCQkJfQorCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCVRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFNob3dzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsKKwkJcmV0dXJuCisJCQlNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbgorCQkJCShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRmlsZUNvbmZsaWN0X2xhYmVsIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfV0FSTl9GaWxlQ29uZmxpY3QiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBtb2RlbCBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERlY29yYXRvcnNFZGl0b3IoKSB7CisJCXN1cGVyKCk7CisJCWluaXRpYWxpemVFZGl0aW5nRG9tYWluKCk7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHVwIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1vZGVsIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWRpdGluZ0RvbWFpbigpIHsKKwkJLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlpZWxkcyBpdGVtIHByb3ZpZGVycy4KKwkJLy8KKwkJYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOworCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRGVjb3JhdG9yc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTGFiZWxzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBHcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTW9kaWZpZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlIGV4ZWN1dGVkLgorCQkvLworCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKKworCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLgorCQkvLworCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIKKwkJCShuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7CisJCQkJIHB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsKKwkJCQkJIGdldENvbnRhaW5lcigpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCSAobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCSAgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkgIGZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKKworCQkJCQkJCQkgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuCisJCQkJCQkJCSAgLy8KKwkJCQkJCQkJICBDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spZXZlbnQuZ2V0U291cmNlKCkpLmdldE1vc3RSZWNlbnRDb21tYW5kKCk7CisJCQkJCQkJCSAgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKKwkJCQkJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOworCQkJCQkJCQkgIH0KKwkJCQkJCQkJICBpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCAmJiAhcHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgeworCQkJCQkJCQkJICBwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7CisJCQkJCQkJCSAgfQorCQkJCQkJCSAgfQorCQkJCQkJICB9KTsKKwkJCQkgfQorCQkJIH0pOworCisJCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KKwkJLy8KKwkJZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywgbmV3IEhhc2hNYXA8UmVzb3VyY2UsIEJvb2xlYW4+KCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgaGVyZSBmb3IgdGhlIGxpc3RlbmVyIHRvIGJlIGFibGUgdG8gY2FsbCBpdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoaW50IGFjdGlvbikgeworCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UoYWN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdGhlIHNlbGVjdGlvbiBpbnRvIHdoaWNoZXZlciB2aWV3ZXIgaXMgYWN0aXZlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgeworCQlmaW5hbCBDb2xsZWN0aW9uPD8+IHRoZVNlbGVjdGlvbiA9IGNvbGxlY3Rpb247CisJCS8vIE1ha2Ugc3VyZSBpdCdzIG9rYXkuCisJCS8vCisJCWlmICh0aGVTZWxlY3Rpb24gIT0gbnVsbCAmJiAhdGhlU2VsZWN0aW9uLmlzRW1wdHkoKSkgeworCQkJLy8gSSBkb24ndCBrbm93IGlmIHRoaXMgc2hvdWxkIGJlIHJ1biB0aGlzIGRlZmVycmVkCisJCQkvLyBiZWNhdXNlIHdlIG1pZ2h0IGhhdmUgdG8gZ2l2ZSB0aGUgZWRpdG9yIGEgY2hhbmNlIHRvIHByb2Nlc3MgdGhlIHZpZXdlciB1cGRhdGUgZXZlbnRzCisJCQkvLyBhbmQgaGVuY2UgdG8gdXBkYXRlIHRoZSB2aWV3cyBmaXJzdC4KKwkJCS8vCisJCQkvLworCQkJUnVubmFibGUgcnVubmFibGUgPQorCQkJCW5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgY29udGVudCB2aWV3ZXIgb2YgdGhlIGVkaXRvci4KKwkJCQkJCS8vCisJCQkJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7CisJCQkJCQkJY3VycmVudFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhlU2VsZWN0aW9uLnRvQXJyYXkoKSksIHRydWUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfTsKKwkJCXJ1bm5hYmxlLnJ1bigpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBlZGl0aW5nIGRvbWFpbiBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElFZGl0aW5nRG9tYWluUHJvdmlkZXJ9IGludGVyZmFjZS4KKwkgKiBUaGlzIGlzIGltcG9ydGFudCBmb3IgaW1wbGVtZW50aW5nIHRoZSBzdGF0aWMgbWV0aG9kcyBvZiB7QGxpbmsgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWlufQorCSAqIGFuZCBmb3Igc3VwcG9ydGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb259LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7CisJCXJldHVybiBlZGl0aW5nRG9tYWluOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBjbGFzcyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciB7CisJCXB1YmxpYyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0IFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIHBhcmVudCAhPSBudWxsOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBtYWtlcyBzdXJlIHRoYXQgb25lIGNvbnRlbnQgdmlld2VyLCBlaXRoZXIgZm9yIHRoZSBjdXJyZW50IHBhZ2Ugb3IgdGhlIG91dGxpbmUgdmlldywgaWYgaXQgaGFzIGZvY3VzLAorCSAqIGlzIHRoZSBjdXJyZW50IG9uZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vmlld2VyKFZpZXdlciB2aWV3ZXIpIHsKKwkJLy8gSWYgaXQgaXMgY2hhbmdpbmcuLi4KKwkJLy8KKwkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gdmlld2VyKSB7CisJCQlpZiAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsKKwkJCQkvLyBDcmVhdGUgdGhlIGxpc3RlbmVyIG9uIGRlbWFuZC4KKwkJCQkvLworCQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9CisJCQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJCQkJLy8gVGhpcyBqdXN0IG5vdGlmaWVzIHRob3NlIHRoaW5ncyB0aGF0IGFyZSBhZmZlY3RlZCBieSB0aGUgc2VjdGlvbi4KKwkJCQkJCS8vCisJCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBzZWxlY3Rpb25DaGFuZ2VkRXZlbnQpIHsKKwkJCQkJCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCX0KKworCQkJLy8gU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG9sZCBvbmUuCisJCQkvLworCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgeworCQkJCWN1cnJlbnRWaWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7CisJCQl9CisKKwkJCS8vIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmV3IG9uZS4KKwkJCS8vCisJCQlpZiAodmlld2VyICE9IG51bGwpIHsKKwkJCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7CisJCQl9CisKKwkJCS8vIFJlbWVtYmVyIGl0LgorCQkJLy8KKwkJCWN1cnJlbnRWaWV3ZXIgPSB2aWV3ZXI7CisKKwkJCS8vIFNldCB0aGUgZWRpdG9ycyBzZWxlY3Rpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgdmlld2VyJ3Mgc2VsZWN0aW9uLgorCQkJLy8KKwkJCXNldFNlbGVjdGlvbihjdXJyZW50Vmlld2VyID09IG51bGwgPyBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZIDogY3VycmVudFZpZXdlci5nZXRTZWxlY3Rpb24oKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHZpZXdlciBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElWaWV3ZXJQcm92aWRlcn0gaW50ZXJmYWNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgeworCQlyZXR1cm4gY3VycmVudFZpZXdlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIgYW5kIGFkZHMgYSBsaXN0ZW5lciBhcyB3ZWxsIHJlZ2lzdGVyaW5nIHRoZSBtZW51IGZvciBleHRlbnNpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKKwkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOworCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7CisJCU1lbnUgbWVudT0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7CisJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKKwkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUsIG5ldyBVbndyYXBwaW5nU2VsZWN0aW9uUHJvdmlkZXIodmlld2VyKSk7CisKKwkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTks7CisJCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKKwkJdmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyYWdBZGFwdGVyKHZpZXdlcikpOworCQl2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyKGVkaXRpbmdEb21haW4sIHZpZXdlcikpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCBjYWxsZWQgdG8gbG9hZCBhIHJlc291cmNlIGludG8gdGhlIGVkaXRpbmcgZG9tYWluJ3MgcmVzb3VyY2Ugc2V0IGJhc2VkIG9uIHRoZSBlZGl0b3IncyBpbnB1dC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVNb2RlbCgpIHsKKwkJVVJJIHJlc291cmNlVVJJID0gRWRpdFVJVXRpbC5nZXRVUkkoZ2V0RWRpdG9ySW5wdXQoKSk7CisJCUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7CisJCXRyeSB7CisJCQkvLyBMb2FkIHRoZSByZXNvdXJjZSB0aHJvdWdoIHRoZSBlZGl0aW5nIGRvbWFpbi4KKwkJCS8vCisJCQlyZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgdHJ1ZSk7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlleGNlcHRpb24gPSBlOworCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIGZhbHNlKTsKKwkJfQorCisJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pOworCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJfQorCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkuYWRkKHByb2JsZW1JbmRpY2F0aW9uQWRhcHRlcik7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIGRpYWdub3N0aWMgZGVzY3JpYmluZyB0aGUgZXJyb3JzIGFuZCB3YXJuaW5ncyBsaXN0ZWQgaW4gdGhlIHJlc291cmNlCisJICogYW5kIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIChpZiBhbnkpLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEaWFnbm9zdGljIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKFJlc291cmNlIHJlc291cmNlLCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCWlmICghcmVzb3VyY2UuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpIHx8ICFyZXNvdXJjZS5nZXRXYXJuaW5ncygpLmlzRW1wdHkoKSkgeworCQkJQmFzaWNEaWFnbm9zdGljIGJhc2ljRGlhZ25vc3RpYyA9CisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZXhjZXB0aW9uID09IG51bGwgPyAoT2JqZWN0KXJlc291cmNlIDogZXhjZXB0aW9uIH0pOworCQkJYmFzaWNEaWFnbm9zdGljLm1lcmdlKEVjb3JlVXRpbC5jb21wdXRlRGlhZ25vc3RpYyhyZXNvdXJjZSwgdHJ1ZSkpOworCQkJcmV0dXJuIGJhc2ljRGlhZ25vc3RpYzsKKwkJfQorCQllbHNlIGlmIChleGNlcHRpb24gIT0gbnVsbCkgeworCQkJcmV0dXJuCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCSBuZXcgT2JqZWN0W10geyBleGNlcHRpb24gfSk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gRGlhZ25vc3RpYy5PS19JTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gaW5zdGFsbCB5b3VyIG93biBjb250cm9scy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlcygpIHsKKwkJLy8gQ3JlYXRlcyB0aGUgbW9kZWwgZnJvbSB0aGUgZWRpdG9yIGlucHV0CisJCS8vCisJCWNyZWF0ZU1vZGVsKCk7CisKKwkJLy8gT25seSBjcmVhdGVzIHRoZSBvdGhlciBwYWdlcyBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhhdCBjYW4gYmUgZWRpdGVkCisJCS8vCisJCWlmICghZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgc2VsZWN0aW9uIHRyZWUgdmlldy4KKwkJCS8vCisJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShnZXRDb250YWluZXIoKSwgU1dULk1VTFRJKTsKKwkJCXNlbGVjdGlvblZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOworCQkJc2V0Q3VycmVudFZpZXdlcihzZWxlY3Rpb25WaWV3ZXIpOworCisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKworCQkJbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcihzZWxlY3Rpb25WaWV3ZXIuZ2V0VHJlZSgpLCBhZGFwdGVyRmFjdG9yeSk7CisKKwkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHNlbGVjdGlvblZpZXdlcik7CisJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh0cmVlKTsKKwkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCSBzZXRBY3RpdmVQYWdlKDApOworCQkJCQkgfQorCQkJCSB9KTsKKwkJfQorCisJCS8vIEVuc3VyZXMgdGhhdCB0aGlzIGVkaXRvciB3aWxsIG9ubHkgZGlzcGxheSB0aGUgcGFnZSdzIHRhYgorCQkvLyBhcmVhIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHBhZ2UKKwkJLy8KKwkJZ2V0Q29udGFpbmVyKCkuYWRkQ29udHJvbExpc3RlbmVyCisJCQkobmV3IENvbnRyb2xBZGFwdGVyKCkgeworCQkJCWJvb2xlYW4gZ3VhcmQgPSBmYWxzZTsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsKKwkJCQkJaWYgKCFndWFyZCkgeworCQkJCQkJZ3VhcmQgPSB0cnVlOworCQkJCQkJaGlkZVRhYnMoKTsKKwkJCQkJCWd1YXJkID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkgfSk7CisKKwkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkgfQorCQkJIH0pOworCX0KKworCS8qKgorCSAqIElmIHRoZXJlIGlzIGp1c3Qgb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsCisJICogdGhpcyBoaWRlcyB0aGUgc2luZ2xlIHRhYiBhdCB0aGUgYm90dG9tLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhpZGVUYWJzKCkgeworCQlpZiAoZ2V0UGFnZUNvdW50KCkgPD0gMSkgeworCQkJc2V0UGFnZVRleHQoMCwgIiIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7CisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoMSk7CisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7CisJCQkJZ2V0Q29udGFpbmVyKCkuc2V0U2l6ZShwb2ludC54LCBwb2ludC55ICsgNik7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsCisJICogdGhpcyBzaG93cyB0aGUgdGFicyBhdCB0aGUgYm90dG9tLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNob3dUYWJzKCkgeworCQlpZiAoZ2V0UGFnZUNvdW50KCkgPiAxKSB7CisJCQlzZXRQYWdlVGV4dCgwLCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7CisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoU1dULkRFRkFVTFQpOworCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOworCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSAtIDYpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIHRyYWNrIHRoZSBhY3RpdmUgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IHBhZ2VJbmRleCkgeworCQlzdXBlci5wYWdlQ2hhbmdlKHBhZ2VJbmRleCk7CisKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7CisJCQloYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihjb250ZW50T3V0bGluZVBhZ2UuZ2V0U2VsZWN0aW9uKCkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBob3cgdGhlIGZyYW1ld29yayBkZXRlcm1pbmVzIHdoaWNoIGludGVyZmFjZXMgd2UgaW1wbGVtZW50LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7CisJCWlmIChrZXkuZXF1YWxzKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gc2hvd091dGxpbmVWaWV3KCkgPyBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSA6IG51bGw7CisJCX0KKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gZ2V0UHJvcGVydHlTaGVldFBhZ2UoKTsKKwkJfQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IG91dGxpbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQ29udGVudE91dGxpbmVQYWdlIGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIHsKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSA9PSBudWxsKSB7CisJCQkvLyBUaGUgY29udGVudCBvdXRsaW5lIGlzIGp1c3QgYSB0cmVlLgorCQkJLy8KKwkJCWNsYXNzIE15Q29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgQ29udGVudE91dGxpbmVQYWdlIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCQkJCS8vIFNldCB1cCB0aGUgdHJlZSB2aWV3ZXIuCisJCQkJCS8vCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisKKwkJCQkJLy8gTWFrZSBzdXJlIG91ciBwb3B1cHMgd29yay4KKwkJCQkJLy8KKwkJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IoY29udGVudE91dGxpbmVWaWV3ZXIpOworCisJCQkJCWlmICghZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkgIC8vIFNlbGVjdCB0aGUgcm9vdCBvYmplY3QgaW4gdGhlIHZpZXcuCisJCQkJCSAgLy8KKwkJCQkJICBjb250ZW50T3V0bGluZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCQkJCQl9CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgbWFrZUNvbnRyaWJ1dGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlcikgeworCQkJCQlzdXBlci5tYWtlQ29udHJpYnV0aW9ucyhtZW51TWFuYWdlciwgdG9vbEJhck1hbmFnZXIsIHN0YXR1c0xpbmVNYW5hZ2VyKTsKKwkJCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsKKwkJCQl9CisJCQl9CisKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZSA9IG5ldyBNeUNvbnRlbnRPdXRsaW5lUGFnZSgpOworCisJCQkvLyBMaXN0ZW4gdG8gc2VsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBpdCBpcyBhIHNwZWNpYWwgd2F5LgorCQkJLy8KKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKKwkJCQkobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQkJCSAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBoYW5kbGUgc2VsZWN0aW9ucyBjb3JyZWN0bHkuCisJCQkJCSAvLworCQkJCQkgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQkJCSBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJcmV0dXJuIGNvbnRlbnRPdXRsaW5lUGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIHByb3BlcnR5IHNoZWV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7CisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZSA9CisJCQkJbmV3IEV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2UoZWRpdGluZ0RvbWFpbikgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoTGlzdDw/PiBzZWxlY3Rpb24pIHsKKwkJCQkJCURlY29yYXRvcnNFZGl0b3IudGhpcy5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihzZWxlY3Rpb24pOworCQkJCQkJRGVjb3JhdG9yc0VkaXRvci50aGlzLnNldEZvY3VzKCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisJCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7CisJCQkJCX0KKwkJCQl9OworCQkJcHJvcGVydHlTaGVldFBhZ2Uuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJfQorCisJCXJldHVybiBwcm9wZXJ0eVNoZWV0UGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGRlYWxzIHdpdGggaG93IHdlIHdhbnQgc2VsZWN0aW9uIGluIHRoZSBvdXRsaW5lciB0byBhZmZlY3QgdGhlIG90aGVyIHZpZXdzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWlmIChzZWxlY3Rpb25WaWV3ZXIgIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJSXRlcmF0b3I8Pz4gc2VsZWN0ZWRFbGVtZW50cyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5pdGVyYXRvcigpOworCQkJaWYgKHNlbGVjdGVkRWxlbWVudHMuaGFzTmV4dCgpKSB7CisJCQkJLy8gR2V0IHRoZSBmaXJzdCBzZWxlY3RlZCBlbGVtZW50LgorCQkJCS8vCisJCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHMubmV4dCgpOworCisJCQkJQXJyYXlMaXN0PE9iamVjdD4gc2VsZWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudCk7CisJCQkJd2hpbGUgKHNlbGVjdGVkRWxlbWVudHMuaGFzTmV4dCgpKSB7CisJCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudHMubmV4dCgpKTsKKwkJCQl9CisKKwkJCQkvLyBTZXQgdGhlIHNlbGVjdGlvbiB0byB0aGUgd2lkZ2V0LgorCQkJCS8vCisJCQkJc2VsZWN0aW9uVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb25MaXN0KSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHRlc3RzIHRoZSBjb21tYW5kIHN0YWNrLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7CisJCXJldHVybiAoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLmlzU2F2ZU5lZWRlZCgpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSUVkaXRvclBhcnR9IGFuZCBzaW1wbHkgc2F2ZXMgdGhlIG1vZGVsIGZpbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisJCS8vIFNhdmUgb25seSByZXNvdXJjZXMgdGhhdCBoYXZlIGFjdHVhbGx5IGNoYW5nZWQuCisJCS8vCisJCWZpbmFsIE1hcDxPYmplY3QsIE9iamVjdD4gc2F2ZU9wdGlvbnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKKwkJc2F2ZU9wdGlvbnMucHV0KFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRCwgUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOworCisJCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtiZW5jaC4KKwkJLy8KKwkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9CisJCQluZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgeworCQkJCS8vIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IGdldHMgaW52b2tlZCB3aGVuIHRoZSBvcGVyYXRpb24gcnVucy4KKwkJCQkvLworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJCS8vIFNhdmUgdGhlIHJlc291cmNlcyB0byB0aGUgZmlsZSBzeXN0ZW0uCisJCQkJCS8vCisJCQkJCWJvb2xlYW4gZmlyc3QgPSB0cnVlOworCQkJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKSB7CisJCQkJCQlpZiAoKGZpcnN0IHx8ICFyZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSB8fCBpc1BlcnNpc3RlZChyZXNvdXJjZSkpICYmICFlZGl0aW5nRG9tYWluLmlzUmVhZE9ubHkocmVzb3VyY2UpKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJbG9uZyB0aW1lU3RhbXAgPSByZXNvdXJjZS5nZXRUaW1lU3RhbXAoKTsKKwkJCQkJCQkJcmVzb3VyY2Uuc2F2ZShzYXZlT3B0aW9ucyk7CisJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUaW1lU3RhbXAoKSAhPSB0aW1lU3RhbXApIHsKKwkJCQkJCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCQkJCQkJfQorCQkJCQkJCWZpcnN0ID0gZmFsc2U7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9OworCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisJCXRyeSB7CisJCQkvLyBUaGlzIHJ1bnMgdGhlIG9wdGlvbnMsIGFuZCBzaG93cyBwcm9ncmVzcy4KKwkJCS8vCisJCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7CisKKwkJCS8vIFJlZnJlc2ggdGhlIG5lY2Vzc2FyeSBzdGF0ZS4KKwkJCS8vCisJCQkoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLnNhdmVJc0RvbmUoKTsKKwkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgdGhhdCBzaG91bGRuJ3QuCisJCQkvLworCQkJVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgd2hldGhlciBzb21ldGhpbmcgaGFzIGJlZW4gcGVyc2lzdGVkIHRvIHRoZSBVUkkgb2YgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgVVJJIGNvbnZlcnRlciBmcm9tIHRoZSBlZGl0b3IncyByZXNvdXJjZSBzZXQgdG8gdHJ5IHRvIG9wZW4gYW4gaW5wdXQgc3RyZWFtLiAKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BlcnNpc3RlZChSZXNvdXJjZSByZXNvdXJjZSkgeworCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQl0cnkgeworCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKHJlc291cmNlLmdldFVSSSgpKTsKKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgeworCQkJCXJlc3VsdCA9IHRydWU7CisJCQkJc3RyZWFtLmNsb3NlKCk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElnbm9yZQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogVGhpcyBhbHdheXMgcmV0dXJucyB0cnVlIGJlY2F1c2UgaXQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFsc28gY2hhbmdlcyB0aGUgZWRpdG9yJ3MgaW5wdXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7CisJCVNhdmVBc0RpYWxvZyBzYXZlQXNEaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKKwkJc2F2ZUFzRGlhbG9nLm9wZW4oKTsKKwkJSVBhdGggcGF0aCA9IHNhdmVBc0RpYWxvZy5nZXRSZXN1bHQoKTsKKwkJaWYgKHBhdGggIT0gbnVsbCkgeworCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKKwkJCWlmIChmaWxlICE9IG51bGwpIHsKKwkJCQlkb1NhdmVBcyhVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZG9TYXZlQXMoVVJJIHVyaSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisJCShlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKS5zZXRVUkkodXJpKTsKKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKKwkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPQorCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgIT0gbnVsbCA/CisJCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgOgorCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisJCWRvU2F2ZShwcm9ncmVzc01vbml0b3IpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKKwkJdHJ5IHsKKwkJCWlmIChtYXJrZXIuZ2V0VHlwZSgpLmVxdWFscyhFVmFsaWRhdG9yLk1BUktFUikpIHsKKwkJCQlTdHJpbmcgdXJpQXR0cmlidXRlID0gbWFya2VyLmdldEF0dHJpYnV0ZShFVmFsaWRhdG9yLlVSSV9BVFRSSUJVVEUsIG51bGwpOworCQkJCWlmICh1cmlBdHRyaWJ1dGUgIT0gbnVsbCkgeworCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSSh1cmlBdHRyaWJ1dGUpOworCQkJCQlFT2JqZWN0IGVPYmplY3QgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0RU9iamVjdCh1cmksIHRydWUpOworCQkJCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7CisJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGVkaXRpbmdEb21haW4uZ2V0V3JhcHBlcihlT2JqZWN0KSkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHN0YXJ0dXAuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKKwkJc2V0U2l0ZShzaXRlKTsKKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKKwkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsKKwkJc2l0ZS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7CisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJZ2V0Q29udHJvbChnZXRBY3RpdmVQYWdlKCkpLnNldEZvY3VzKCk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byByZXR1cm4gdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7CisJCXJldHVybiBlZGl0b3JTZWxlY3Rpb247CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gc2V0IHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCisJICogQ2FsbGluZyB0aGlzIHJlc3VsdCB3aWxsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQllZGl0b3JTZWxlY3Rpb24gPSBzZWxlY3Rpb247CisKKwkJZm9yIChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyIDogc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycykgeworCQkJbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOworCQl9CisJCXNldFN0YXR1c0xpbmVNYW5hZ2VyKHNlbGVjdGlvbik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZU1hbmFnZXIoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyID0gY3VycmVudFZpZXdlciAhPSBudWxsICYmIGN1cnJlbnRWaWV3ZXIgPT0gY29udGVudE91dGxpbmVWaWV3ZXIgPworCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA6IGdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOworCisJCWlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKSB7CisJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCQlDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikudG9MaXN0KCk7CisJCQkJc3dpdGNoIChjb2xsZWN0aW9uLnNpemUoKSkgeworCQkJCQljYXNlIDA6IHsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTm9PYmplY3RTZWxlY3RlZCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAxOiB7CisJCQkJCQlTdHJpbmcgdGV4dCA9IG5ldyBBZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3IoYWRhcHRlckZhY3RvcnkpLmdldFRleHQoY29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkIiwgdGV4dCkpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlkZWZhdWx0OiB7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQiLCBJbnRlZ2VyLnRvU3RyaW5nKGNvbGxlY3Rpb24uc2l6ZSgpKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoIiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHRoZSBwbHVnaW4ncyBwbHVnaW4ucHJvcGVydGllcyBmaWxlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQlyZXR1cm4gVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXkpOworCX0KKworCS8qKgorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gcGx1Z2luLnByb3BlcnRpZXMsIG1ha2luZyBhIHN1YnN0aXR1dGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgeworCQlyZXR1cm4gVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXksIG5ldyBPYmplY3QgW10geyBzMSB9KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyfSB0byBoZWxwIGZpbGwgdGhlIGNvbnRleHQgbWVudXMgd2l0aCBjb250cmlidXRpb25zIGZyb20gdGhlIEVkaXQgbWVudS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCSgoSU1lbnVMaXN0ZW5lcilnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSkubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgeworCQlyZXR1cm4gKEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcilnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsKKwkJcmV0dXJuIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aW9uQmFycygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisKKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7CisKKwkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKKworCQlhZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7CisKKwkJaWYgKGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gdGhpcykgeworCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IobnVsbCk7CisJCX0KKworCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgeworCQkJcHJvcGVydHlTaGVldFBhZ2UuZGlzcG9zZSgpOworCQl9CisKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7CisJCQljb250ZW50T3V0bGluZVBhZ2UuZGlzcG9zZSgpOworCQl9CisKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgb3V0bGluZSB2aWV3IHNob3VsZCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd091dGxpbmVWaWV3KCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9wcmVzZW50YXRpb24vRGVjb3JhdG9yc01vZGVsV2l6YXJkLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL3ByZXNlbnRhdGlvbi9EZWNvcmF0b3JzTW9kZWxXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTI2YjZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9wcmVzZW50YXRpb24vRGVjb3JhdG9yc01vZGVsV2l6YXJkLmphdmEKQEAgLTAsMCArMSw1OTcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuRGVjb3JhdG9yc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuRGVjb3JhdG9yc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMucHJvdmlkZXIuVGVzdHV0aWxpdHlFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OworCisKKy8qKgorICogVGhpcyBpcyBhIHNpbXBsZSB3aXphcmQgZm9yIGNyZWF0aW5nIGEgbmV3IG1vZGVsIGZpbGUuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEZWNvcmF0b3JzTW9kZWxXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKKwkvKioKKwkgKiBUaGlzIGNhY2hlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGVjb3JhdG9yc1BhY2thZ2UgZGVjb3JhdG9yc1BhY2thZ2UgPSBEZWNvcmF0b3JzUGFja2FnZS5lSU5TVEFOQ0U7CisKKwkvKioKKwkgKiBUaGlzIGNhY2hlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGVjb3JhdG9yc0ZhY3RvcnkgZGVjb3JhdG9yc0ZhY3RvcnkgPSBkZWNvcmF0b3JzUGFja2FnZS5nZXREZWNvcmF0b3JzRmFjdG9yeSgpOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgZmlsZSBjcmVhdGlvbiBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEZWNvcmF0b3JzTW9kZWxXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIG5ld0ZpbGVDcmVhdGlvblBhZ2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBpbml0aWFsIG9iamVjdCBjcmVhdGlvbiBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEZWNvcmF0b3JzTW9kZWxXaXphcmRJbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlIGluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2U7CisKKwkvKioKKwkgKiBSZW1lbWJlciB0aGUgc2VsZWN0aW9uIGR1cmluZyBpbml0aWFsaXphdGlvbiBmb3IgcG9wdWxhdGluZyB0aGUgZGVmYXVsdCBjb250YWluZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKKworCS8qKgorCSAqIFJlbWVtYmVyIHRoZSB3b3JrYmVuY2ggZHVyaW5nIGluaXRpYWxpemF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJV29ya2JlbmNoIHdvcmtiZW5jaDsKKworCS8qKgorCSAqIENhY2hlcyB0aGUgbmFtZXMgb2YgdGhlIHR5cGVzIHRoYXQgY2FuIGJlIGNyZWF0ZWQgYXMgdGhlIHJvb3Qgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gaW5pdGlhbE9iamVjdE5hbWVzOworCisJLyoqCisJICogVGhpcyBqdXN0IHJlY29yZHMgdGhlIGluZm9ybWF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQl0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKKwkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247CisJCXNldFdpbmRvd1RpdGxlKFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9XaXphcmRfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LklOU1RBTkNFLmdldEltYWdlRGVzY3JpcHRvcihUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvd2l6YmFuL05ld0RlY29yYXRvcnMiKSkpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIHR5cGVzIHRoYXQgY2FuIGJlIGNyZWF0ZWQgYXMgdGhlIHJvb3Qgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0SW5pdGlhbE9iamVjdE5hbWVzKCkgeworCQlpZiAoaW5pdGlhbE9iamVjdE5hbWVzID09IG51bGwpIHsKKwkJCWluaXRpYWxPYmplY3ROYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJZm9yIChFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA6IGRlY29yYXRvcnNQYWNrYWdlLmdldEVDbGFzc2lmaWVycygpKSB7CisJCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7CisJCQkJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKWVDbGFzc2lmaWVyOworCQkJCQlpZiAoIWVDbGFzcy5pc0Fic3RyYWN0KCkpIHsKKwkJCQkJCWluaXRpYWxPYmplY3ROYW1lcy5hZGQoZUNsYXNzLmdldE5hbWUoKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlDb2xsZWN0aW9ucy5zb3J0KGluaXRpYWxPYmplY3ROYW1lcywgamF2YS50ZXh0LkNvbGxhdG9yLmdldEluc3RhbmNlKCkpOworCQl9CisJCXJldHVybiBpbml0aWFsT2JqZWN0TmFtZXM7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBFT2JqZWN0IGNyZWF0ZUluaXRpYWxNb2RlbCgpIHsKKwkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpZGVjb3JhdG9yc1BhY2thZ2UuZ2V0RUNsYXNzaWZpZXIoaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5nZXRJbml0aWFsT2JqZWN0TmFtZSgpKTsKKwkJRU9iamVjdCByb290T2JqZWN0ID0gZGVjb3JhdG9yc0ZhY3RvcnkuY3JlYXRlKGVDbGFzcyk7CisJCXJldHVybiByb290T2JqZWN0OworCX0KKworCS8qKgorCSAqIERvIHRoZSB3b3JrIGFmdGVyIGV2ZXJ5dGhpbmcgaXMgc3BlY2lmaWVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7CisJCXRyeSB7CisJCQkvLyBSZW1lbWJlciB0aGUgZmlsZS4KKwkJCS8vCisJCQlmaW5hbCBJRmlsZSBtb2RlbEZpbGUgPSBnZXRNb2RlbEZpbGUoKTsKKworCQkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbi4KKwkJCS8vCisJCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0KKwkJCQluZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworCQkJCQkJdHJ5IHsKKwkJCQkJCQkvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQKKwkJCQkJCQkvLworCQkJCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOworCisJCQkJCQkJLy8gR2V0IHRoZSBVUkkgb2YgdGhlIG1vZGVsIGZpbGUuCisJCQkJCQkJLy8KKwkJCQkJCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKG1vZGVsRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpOworCisJCQkJCQkJLy8gQ3JlYXRlIGEgcmVzb3VyY2UgZm9yIHRoaXMgZmlsZS4KKwkJCQkJCQkvLworCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoZmlsZVVSSSk7CisKKwkJCQkJCQkvLyBBZGQgdGhlIGluaXRpYWwgbW9kZWwgb2JqZWN0IHRvIHRoZSBjb250ZW50cy4KKwkJCQkJCQkvLworCQkJCQkJCUVPYmplY3Qgcm9vdE9iamVjdCA9IGNyZWF0ZUluaXRpYWxNb2RlbCgpOworCQkJCQkJCWlmIChyb290T2JqZWN0ICE9IG51bGwpIHsKKwkJCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQocm9vdE9iamVjdCk7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gU2F2ZSB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlIHRvIHRoZSBmaWxlIHN5c3RlbS4KKwkJCQkJCQkvLworCQkJCQkJCU1hcDxPYmplY3QsIE9iamVjdD4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOworCQkJCQkJCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5nZXRFbmNvZGluZygpKTsKKwkJCQkJCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOworCQkJCQkJfQorCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCQlUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJCQl9CisJCQkJCQlmaW5hbGx5IHsKKwkJCQkJCQlwcm9ncmVzc01vbml0b3IuZG9uZSgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfTsKKworCQkJZ2V0Q29udGFpbmVyKCkucnVuKGZhbHNlLCBmYWxzZSwgb3BlcmF0aW9uKTsKKworCQkJLy8gU2VsZWN0IHRoZSBuZXcgZmlsZSByZXNvdXJjZSBpbiB0aGUgY3VycmVudCB2aWV3LgorCQkJLy8KKwkJCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOworCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7CisJCQlmaW5hbCBJV29ya2JlbmNoUGFydCBhY3RpdmVQYXJ0ID0gcGFnZS5nZXRBY3RpdmVQYXJ0KCk7CisJCQlpZiAoYWN0aXZlUGFydCBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpIHsKKwkJCQlmaW5hbCBJU2VsZWN0aW9uIHRhcmdldFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vZGVsRmlsZSk7CisJCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCSAoKElTZXRTZWxlY3Rpb25UYXJnZXQpYWN0aXZlUGFydCkuc2VsZWN0UmV2ZWFsKHRhcmdldFNlbGVjdGlvbik7CisJCQkJCQkgfQorCQkJCQkgfSk7CisJCQl9CisKKwkJCS8vIE9wZW4gYW4gZWRpdG9yIG9uIHRoZSBuZXcgZmlsZS4KKwkJCS8vCisJCQl0cnkgeworCQkJCXBhZ2Uub3BlbkVkaXRvcgorCQkJCQkobmV3IEZpbGVFZGl0b3JJbnB1dChtb2RlbEZpbGUpLAorCQkJCQkgd29ya2JlbmNoLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdEVkaXRvcihtb2RlbEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS5nZXRJZCgpKTsKKwkJCX0KKwkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcih3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKSwgVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbCIpLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCVRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG9uZSBwYWdlIG9mIHRoZSB3aXphcmQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGNsYXNzIERlY29yYXRvcnNNb2RlbFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsKKwkJLyoqCisJCSAqIFBhc3MgaW4gdGhlIHNlbGVjdGlvbi4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBEZWNvcmF0b3JzTW9kZWxXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlKFN0cmluZyBwYWdlSWQsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQkJc3VwZXIocGFnZUlkLCBzZWxlY3Rpb24pOworCQl9CisKKwkJLyoqCisJCSAqIFRoZSBmcmFtZXdvcmsgY2FsbHMgdGhpcyB0byBzZWUgaWYgdGhlIGZpbGUgaXMgY29ycmVjdC4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7CisJCQlpZiAoc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsKKwkJCQkvLyBNYWtlIHN1cmUgdGhlIGZpbGUgZW5kcyBpbiAiLmRlY29yYXRvcnMiLgorCQkJCS8vCisJCQkJU3RyaW5nIHJlcXVpcmVkRXh0ID0gVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RlY29yYXRvcnNFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbiIpOyAvLyROT04tTkxTLTEkCisJCQkJU3RyaW5nIGVudGVyZWRFeHQgPSBuZXcgUGF0aChnZXRGaWxlTmFtZSgpKS5nZXRGaWxlRXh0ZW5zaW9uKCk7CisJCQkJaWYgKGVudGVyZWRFeHQgPT0gbnVsbCB8fCAhZW50ZXJlZEV4dC5lcXVhbHMocmVxdWlyZWRFeHQpKSB7CisJCQkJCXNldEVycm9yTWVzc2FnZShUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbiIsIG5ldyBPYmplY3QgW10geyByZXF1aXJlZEV4dCB9KSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgSUZpbGUgZ2V0TW9kZWxGaWxlKCkgeworCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShnZXRDb250YWluZXJGdWxsUGF0aCgpLmFwcGVuZChnZXRGaWxlTmFtZSgpKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBwYWdlIHdoZXJlIHRoZSB0eXBlIG9mIG9iamVjdCB0byBjcmVhdGUgaXMgc2VsZWN0ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGNsYXNzIERlY29yYXRvcnNNb2RlbFdpemFyZEluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwcm90ZWN0ZWQgQ29tYm8gaW5pdGlhbE9iamVjdEZpZWxkOworCisJCS8qKgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKi8KKwkJcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBlbmNvZGluZ3M7CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwcm90ZWN0ZWQgQ29tYm8gZW5jb2RpbmdGaWVsZDsKKworCQkvKioKKwkJICogUGFzcyBpbiB0aGUgc2VsZWN0aW9uLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIERlY29yYXRvcnNNb2RlbFdpemFyZEluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UoU3RyaW5nIHBhZ2VJZCkgeworCQkJc3VwZXIocGFnZUlkKTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsgeworCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7CisJCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEyOworCQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKworCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJfQorCisJCQlMYWJlbCBjb250YWluZXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKKwkJCXsKKwkJCQljb250YWluZXJMYWJlbC5zZXRUZXh0KFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Nb2RlbE9iamVjdCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJY29udGFpbmVyTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCX0KKworCQkJaW5pdGlhbE9iamVjdEZpZWxkID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJCQl7CisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJCQlpbml0aWFsT2JqZWN0RmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCX0KKworCQkJZm9yIChTdHJpbmcgb2JqZWN0TmFtZSA6IGdldEluaXRpYWxPYmplY3ROYW1lcygpKSB7CisJCQkJaW5pdGlhbE9iamVjdEZpZWxkLmFkZChnZXRMYWJlbChvYmplY3ROYW1lKSk7CisJCQl9CisKKwkJCWlmIChpbml0aWFsT2JqZWN0RmllbGQuZ2V0SXRlbUNvdW50KCkgPT0gMSkgeworCQkJCWluaXRpYWxPYmplY3RGaWVsZC5zZWxlY3QoMCk7CisJCQl9CisJCQlpbml0aWFsT2JqZWN0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodmFsaWRhdG9yKTsKKworCQkJTGFiZWwgZW5jb2RpbmdMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKKwkJCXsKKwkJCQllbmNvZGluZ0xhYmVsLnNldFRleHQoVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1hNTEVuY29kaW5nIikpOyAvLyROT04tTkxTLTEkCisKKwkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJCQllbmNvZGluZ0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCQl9CisJCQllbmNvZGluZ0ZpZWxkID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJCQl7CisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJCQllbmNvZGluZ0ZpZWxkLnNldExheW91dERhdGEoZGF0YSk7CisJCQl9CisKKwkJCWZvciAoU3RyaW5nIGVuY29kaW5nIDogZ2V0RW5jb2RpbmdzKCkpIHsKKwkJCQllbmNvZGluZ0ZpZWxkLmFkZChlbmNvZGluZyk7CisJCQl9CisKKwkJCWVuY29kaW5nRmllbGQuc2VsZWN0KDApOworCQkJZW5jb2RpbmdGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih2YWxpZGF0b3IpOworCisJCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOworCQkJc2V0Q29udHJvbChjb21wb3NpdGUpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgdmFsaWRhdG9yID0KKwkJCW5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKKwkJCQl9CisJCQl9OworCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgeworCQkJcmV0dXJuIGdldEluaXRpYWxPYmplY3ROYW1lKCkgIT0gbnVsbCAmJiBnZXRFbmNvZGluZ3MoKS5jb250YWlucyhlbmNvZGluZ0ZpZWxkLmdldFRleHQoKSk7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeworCQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKKwkJCWlmICh2aXNpYmxlKSB7CisJCQkJaWYgKGluaXRpYWxPYmplY3RGaWVsZC5nZXRJdGVtQ291bnQoKSA9PSAxKSB7CisJCQkJCWluaXRpYWxPYmplY3RGaWVsZC5jbGVhclNlbGVjdGlvbigpOworCQkJCQllbmNvZGluZ0ZpZWxkLnNldEZvY3VzKCk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQllbmNvZGluZ0ZpZWxkLmNsZWFyU2VsZWN0aW9uKCk7CisJCQkJCWluaXRpYWxPYmplY3RGaWVsZC5zZXRGb2N1cygpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRJbml0aWFsT2JqZWN0TmFtZSgpIHsKKwkJCVN0cmluZyBsYWJlbCA9IGluaXRpYWxPYmplY3RGaWVsZC5nZXRUZXh0KCk7CisKKwkJCWZvciAoU3RyaW5nIG5hbWUgOiBnZXRJbml0aWFsT2JqZWN0TmFtZXMoKSkgeworCQkJCWlmIChnZXRMYWJlbChuYW1lKS5lcXVhbHMobGFiZWwpKSB7CisJCQkJCXJldHVybiBuYW1lOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgeworCQkJcmV0dXJuIGVuY29kaW5nRmllbGQuZ2V0VGV4dCgpOworCQl9CisKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIGxhYmVsIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgbmFtZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoU3RyaW5nIHR5cGVOYW1lKSB7CisJCQl0cnkgeworCQkJCXJldHVybiBUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfIiArIHR5cGVOYW1lICsgIl90eXBlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJfQorCQkJY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkgeworCQkJCVRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2cobXJlKTsKKwkJCX0KKwkJCXJldHVybiB0eXBlTmFtZTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBnZXRFbmNvZGluZ3MoKSB7CisJCQlpZiAoZW5jb2RpbmdzID09IG51bGwpIHsKKwkJCQllbmNvZGluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCQlmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9YTUxFbmNvZGluZ0Nob2ljZXMiKSk7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgLy8kTk9OLU5MUy0xJAorCQkJCXsKKwkJCQkJZW5jb2RpbmdzLmFkZChzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCkpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBlbmNvZGluZ3M7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGUgZnJhbWV3b3JrIGNhbGxzIHRoaXMgdG8gY3JlYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgd2l6YXJkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgeworCQkvLyBDcmVhdGUgYSBwYWdlLCBzZXQgdGhlIHRpdGxlLCBhbmQgdGhlIGluaXRpYWwgbW9kZWwgZmlsZSBuYW1lLgorCQkvLworCQluZXdGaWxlQ3JlYXRpb25QYWdlID0gbmV3IERlY29yYXRvcnNNb2RlbFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UoIldoYXRldmVyIiwgc2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAorCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldFRpdGxlKFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9EZWNvcmF0b3JzTW9kZWxXaXphcmRfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXREZXNjcmlwdGlvbihUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRGVjb3JhdG9yc01vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCisJCW5ld0ZpbGVDcmVhdGlvblBhZ2Uuc2V0RmlsZU5hbWUoVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RlY29yYXRvcnNFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlIikgKyAiLiIgKyBUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRGVjb3JhdG9yc0VkaXRvckZpbGVuYW1lRXh0ZW5zaW9uIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQlhZGRQYWdlKG5ld0ZpbGVDcmVhdGlvblBhZ2UpOworCisJCS8vIFRyeSBhbmQgZ2V0IHRoZSByZXNvdXJjZSBzZWxlY3Rpb24gdG8gZGV0ZXJtaW5lIGEgY3VycmVudCBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlIGRpYWxvZy4KKwkJLy8KKwkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7CisJCQkvLyBHZXQgdGhlIHJlc291cmNlLi4uCisJCQkvLworCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKTsKKwkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKKwkJCQkvLyBHZXQgdGhlIHJlc291cmNlIHBhcmVudCwgaWYgaXRzIGEgZmlsZS4KKwkJCQkvLworCQkJCUlSZXNvdXJjZSBzZWxlY3RlZFJlc291cmNlID0gKElSZXNvdXJjZSlzZWxlY3RlZEVsZW1lbnQ7CisJCQkJaWYgKHNlbGVjdGVkUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7CisJCQkJCXNlbGVjdGVkUmVzb3VyY2UgPSBzZWxlY3RlZFJlc291cmNlLmdldFBhcmVudCgpOworCQkJCX0KKworCQkJCS8vIFRoaXMgZ2l2ZXMgdXMgYSBkaXJlY3RvcnkuLi4KKwkJCQkvLworCQkJCWlmIChzZWxlY3RlZFJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlciB8fCBzZWxlY3RlZFJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKKwkJCQkJLy8gU2V0IHRoaXMgZm9yIHRoZSBjb250YWluZXIuCisJCQkJCS8vCisJCQkJCW5ld0ZpbGVDcmVhdGlvblBhZ2Uuc2V0Q29udGFpbmVyRnVsbFBhdGgoc2VsZWN0ZWRSZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKKworCQkJCQkvLyBNYWtlIHVwIGEgdW5pcXVlIG5ldyBuYW1lIGhlcmUuCisJCQkJCS8vCisJCQkJCVN0cmluZyBkZWZhdWx0TW9kZWxCYXNlRmlsZW5hbWUgPSBUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRGVjb3JhdG9yc0VkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2UiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlTdHJpbmcgZGVmYXVsdE1vZGVsRmlsZW5hbWVFeHRlbnNpb24gPSBUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRGVjb3JhdG9yc0VkaXRvckZpbGVuYW1lRXh0ZW5zaW9uIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJU3RyaW5nIG1vZGVsRmlsZW5hbWUgPSBkZWZhdWx0TW9kZWxCYXNlRmlsZW5hbWUgKyAiLiIgKyBkZWZhdWx0TW9kZWxGaWxlbmFtZUV4dGVuc2lvbjsgLy8kTk9OLU5MUy0xJAorCQkJCQlmb3IgKGludCBpID0gMTsgKChJQ29udGFpbmVyKXNlbGVjdGVkUmVzb3VyY2UpLmZpbmRNZW1iZXIobW9kZWxGaWxlbmFtZSkgIT0gbnVsbDsgKytpKSB7CisJCQkJCQltb2RlbEZpbGVuYW1lID0gZGVmYXVsdE1vZGVsQmFzZUZpbGVuYW1lICsgaSArICIuIiArIGRlZmF1bHRNb2RlbEZpbGVuYW1lRXh0ZW5zaW9uOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXRGaWxlTmFtZShtb2RlbEZpbGVuYW1lKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSA9IG5ldyBEZWNvcmF0b3JzTW9kZWxXaXphcmRJbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlKCJXaGF0ZXZlcjIiKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlLnNldFRpdGxlKFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9EZWNvcmF0b3JzTW9kZWxXaXphcmRfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5zZXREZXNjcmlwdGlvbihUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV2l6YXJkX2luaXRpYWxfb2JqZWN0X2Rlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCisJCWFkZFBhZ2UoaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBmaWxlIGZyb20gdGhlIHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElGaWxlIGdldE1vZGVsRmlsZSgpIHsKKwkJcmV0dXJuIG5ld0ZpbGVDcmVhdGlvblBhZ2UuZ2V0TW9kZWxGaWxlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL3Byb3ZpZGVyL0NvcmV0ZXN0RWRpdFBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9wcm92aWRlci9Db3JldGVzdEVkaXRQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmUxMWRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9wcm92aWRlci9Db3JldGVzdEVkaXRQbHVnaW4uamF2YQpAQCAtMCwwICsxLDEwNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLkVjbGlwc2VVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CisKKy8qKgorICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBDb3JldGVzdCBlZGl0b3IgcGx1Z2luLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29yZXRlc3RFZGl0UGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29yZXRlc3RFZGl0UGx1Z2luIElOU1RBTkNFID0gbmV3IENvcmV0ZXN0RWRpdFBsdWdpbigpOworCisJLyoqCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvcmV0ZXN0RWRpdFBsdWdpbigpIHsKKwkJc3VwZXIKKwkJICAobmV3IFJlc291cmNlTG9jYXRvciBbXSB7CisJCSAgICAgQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCSAgIH0pOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKworCS8qKgorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVVJUGx1Z2luIHsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOworCisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgorCQkJLy8KKwkJCXBsdWdpbiA9IHRoaXM7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvcHJvdmlkZXIvRGVjb3JhdG9yc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL3Byb3ZpZGVyL0RlY29yYXRvcnNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYzFjZTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL3Byb3ZpZGVyL0RlY29yYXRvcnNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjc4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy51dGlsLkRlY29yYXRvcnNBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuCisgKiBUaGUgYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4KKyAqIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCisgKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEZWNvcmF0b3JzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBEZWNvcmF0b3JzQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKKworCS8qKgorCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5IHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxPYmplY3Q+IHN1cHBvcnRlZFR5cGVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERlY29yYXRvcnNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEVkZ2VEZWNvcmF0b3IxfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRlc3RFZGdlRGVjb3JhdG9yMUl0ZW1Qcm92aWRlciB0ZXN0RWRnZURlY29yYXRvcjFJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEVkZ2VEZWNvcmF0b3IxfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXN0RWRnZURlY29yYXRvcjFBZGFwdGVyKCkgeworCQlpZiAodGVzdEVkZ2VEZWNvcmF0b3IxSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXRlc3RFZGdlRGVjb3JhdG9yMUl0ZW1Qcm92aWRlciA9IG5ldyBUZXN0RWRnZURlY29yYXRvcjFJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gdGVzdEVkZ2VEZWNvcmF0b3IxSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEdyYXBoRGVjb3JhdG9yMX0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUZXN0R3JhcGhEZWNvcmF0b3IxSXRlbVByb3ZpZGVyIHRlc3RHcmFwaERlY29yYXRvcjFJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEdyYXBoRGVjb3JhdG9yMX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVzdEdyYXBoRGVjb3JhdG9yMUFkYXB0ZXIoKSB7CisJCWlmICh0ZXN0R3JhcGhEZWNvcmF0b3IxSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXRlc3RHcmFwaERlY29yYXRvcjFJdGVtUHJvdmlkZXIgPSBuZXcgVGVzdEdyYXBoRGVjb3JhdG9yMUl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiB0ZXN0R3JhcGhEZWNvcmF0b3IxSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdE5vZGVEZWNvcmF0b3IxfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRlc3ROb2RlRGVjb3JhdG9yMUl0ZW1Qcm92aWRlciB0ZXN0Tm9kZURlY29yYXRvcjFJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdE5vZGVEZWNvcmF0b3IxfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXN0Tm9kZURlY29yYXRvcjFBZGFwdGVyKCkgeworCQlpZiAodGVzdE5vZGVEZWNvcmF0b3IxSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXRlc3ROb2RlRGVjb3JhdG9yMUl0ZW1Qcm92aWRlciA9IG5ldyBUZXN0Tm9kZURlY29yYXRvcjFJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gdGVzdE5vZGVEZWNvcmF0b3IxSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMUl0ZW1Qcm92aWRlciB0ZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFBZGFwdGVyKCkgeworCQlpZiAodGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMUl0ZW1Qcm92aWRlciA9IG5ldyBUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gdGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7CisJCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKKwkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKKwkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKKwkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3M8Pz4pdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKKwkJCQlyZXR1cm4gYWRhcHRlcjsKKwkJCX0KKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKKwkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfSBhbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCisJCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7CisJCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LiAKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlpZiAodGVzdEVkZ2VEZWNvcmF0b3IxSXRlbVByb3ZpZGVyICE9IG51bGwpIHRlc3RFZGdlRGVjb3JhdG9yMUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmICh0ZXN0R3JhcGhEZWNvcmF0b3IxSXRlbVByb3ZpZGVyICE9IG51bGwpIHRlc3RHcmFwaERlY29yYXRvcjFJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAodGVzdE5vZGVEZWNvcmF0b3IxSXRlbVByb3ZpZGVyICE9IG51bGwpIHRlc3ROb2RlRGVjb3JhdG9yMUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmICh0ZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFJdGVtUHJvdmlkZXIgIT0gbnVsbCkgdGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvcHJvdmlkZXIvVGVzdEVkZ2VEZWNvcmF0b3IxSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL3Byb3ZpZGVyL1Rlc3RFZGdlRGVjb3JhdG9yMUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNWJjMTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL3Byb3ZpZGVyL1Rlc3RFZGdlRGVjb3JhdG9yMUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByb3ZpZGVyLkVkZ2VEZWNvcmF0b3JJdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuRGVjb3JhdG9yc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEVkZ2VEZWNvcmF0b3IxOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEVkZ2VEZWNvcmF0b3IxfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RWRnZURlY29yYXRvcjFJdGVtUHJvdmlkZXIKKwlleHRlbmRzIEVkZ2VEZWNvcmF0b3JJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGVzdEVkZ2VEZWNvcmF0b3IxSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJCWFkZE5vZGVBVVJJUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGROb2RlQlVSSVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkRWRnZVVSSVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTm9kZSBBVVJJIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkTm9kZUFVUklQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9UZXN0RWRnZURlY29yYXRvcjFfbm9kZUFVUklfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGVzdEVkZ2VEZWNvcmF0b3IxX25vZGVBVVJJX2ZlYXR1cmUiLCAiX1VJX1Rlc3RFZGdlRGVjb3JhdG9yMV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIERlY29yYXRvcnNQYWNrYWdlLkxpdGVyYWxzLlRFU1RfRURHRV9ERUNPUkFUT1IxX19OT0RFX0FVUkksCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5vZGUgQlVSSSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZE5vZGVCVVJJUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfVGVzdEVkZ2VEZWNvcmF0b3IxX25vZGVCVVJJX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rlc3RFZGdlRGVjb3JhdG9yMV9ub2RlQlVSSV9mZWF0dXJlIiwgIl9VSV9UZXN0RWRnZURlY29yYXRvcjFfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBEZWNvcmF0b3JzUGFja2FnZS5MaXRlcmFscy5URVNUX0VER0VfREVDT1JBVE9SMV9fTk9ERV9CVVJJLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgZmFsc2UsCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFZGdlIFVSSSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEVkZ2VVUklQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9UZXN0RWRnZURlY29yYXRvcjFfZWRnZVVSSV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UZXN0RWRnZURlY29yYXRvcjFfZWRnZVVSSV9mZWF0dXJlIiwgIl9VSV9UZXN0RWRnZURlY29yYXRvcjFfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBEZWNvcmF0b3JzUGFja2FnZS5MaXRlcmFscy5URVNUX0VER0VfREVDT1JBVE9SMV9fRURHRV9VUkksCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFRlc3RFZGdlRGVjb3JhdG9yMS5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9UZXN0RWRnZURlY29yYXRvcjEiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChUZXN0RWRnZURlY29yYXRvcjEpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9UZXN0RWRnZURlY29yYXRvcjFfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfVGVzdEVkZ2VEZWNvcmF0b3IxX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUZXN0RWRnZURlY29yYXRvcjEuY2xhc3MpKSB7CisJCQljYXNlIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfRURHRV9ERUNPUkFUT1IxX19OT0RFX0FVUkk6CisJCQljYXNlIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfRURHRV9ERUNPUkFUT1IxX19OT0RFX0JVUkk6CisJCQljYXNlIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfRURHRV9ERUNPUkFUT1IxX19FREdFX1VSSToKKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9wcm92aWRlci9UZXN0R3JhcGhEZWNvcmF0b3IxSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL3Byb3ZpZGVyL1Rlc3RHcmFwaERlY29yYXRvcjFJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjNhNmFhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9wcm92aWRlci9UZXN0R3JhcGhEZWNvcmF0b3IxSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByb3ZpZGVyLkdyYXBoRGVjb3JhdG9ySXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RHcmFwaERlY29yYXRvcjE7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5UZXN0R3JhcGhEZWNvcmF0b3IxfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0R3JhcGhEZWNvcmF0b3IxSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBHcmFwaERlY29yYXRvckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUZXN0R3JhcGhEZWNvcmF0b3IxSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFRlc3RHcmFwaERlY29yYXRvcjEuZ2lmLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVGVzdEdyYXBoRGVjb3JhdG9yMSIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKFRlc3RHcmFwaERlY29yYXRvcjEpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9UZXN0R3JhcGhEZWNvcmF0b3IxX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX1Rlc3RHcmFwaERlY29yYXRvcjFfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9wcm92aWRlci9UZXN0Tm9kZURlY29yYXRvcjFJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvcHJvdmlkZXIvVGVzdE5vZGVEZWNvcmF0b3IxSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2Mjk3MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvcHJvdmlkZXIvVGVzdE5vZGVEZWNvcmF0b3IxSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByb3ZpZGVyLk5vZGVEZWNvcmF0b3JJdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdE5vZGVEZWNvcmF0b3IxOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdE5vZGVEZWNvcmF0b3IxfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0Tm9kZURlY29yYXRvcjFJdGVtUHJvdmlkZXIKKwlleHRlbmRzIE5vZGVEZWNvcmF0b3JJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGVzdE5vZGVEZWNvcmF0b3IxSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFRlc3ROb2RlRGVjb3JhdG9yMS5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9UZXN0Tm9kZURlY29yYXRvcjEiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChUZXN0Tm9kZURlY29yYXRvcjEpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9UZXN0Tm9kZURlY29yYXRvcjFfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfVGVzdE5vZGVEZWNvcmF0b3IxX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvcHJvdmlkZXIvVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL3Byb3ZpZGVyL1Rlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZTNkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL3Byb3ZpZGVyL1Rlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjU5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByb3ZpZGVyLkdyYXBoRGVjb3JhdG9ySXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLkRlY29yYXRvcnNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMX0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBHcmFwaERlY29yYXRvckl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkRG91YmxlVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKwkJCWFkZEludFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCQlhZGRTdHJpbmdWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkU1RFTVRpbWVWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQkJYWRkQm9vbGVhblZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEb3VibGUgVmFsdWUgZmVhdHVyZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGREb3VibGVWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1Rlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMV9kb3VibGVWYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFfZG91YmxlVmFsdWVfZmVhdHVyZSIsICJfVUlfVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkgRGVjb3JhdG9yc1BhY2thZ2UuTGl0ZXJhbHMuVEVTVF9TQ0VOQVJJT19HUkFQSF9ERUNPUkFUT1IxX19ET1VCTEVfVkFMVUUsCisJCQkJIHRydWUsCisJCQkJIGZhbHNlLAorCQkJCSBmYWxzZSwKKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5SRUFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEludCBWYWx1ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEludFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxX2ludFZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMV9pbnRWYWx1ZV9mZWF0dXJlIiwgIl9VSV9UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBEZWNvcmF0b3JzUGFja2FnZS5MaXRlcmFscy5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX0lOVF9WQUxVRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN0cmluZyBWYWx1ZSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFN0cmluZ1ZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxX3N0cmluZ1ZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMV9zdHJpbmdWYWx1ZV9mZWF0dXJlIiwgIl9VSV9UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBEZWNvcmF0b3JzUGFja2FnZS5MaXRlcmFscy5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX1NUUklOR19WQUxVRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU1RFTSBUaW1lIFZhbHVlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkU1RFTVRpbWVWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCisJCQkJIGdldFN0cmluZygiX1VJX1Rlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMV9zVEVNVGltZVZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMV9zVEVNVGltZVZhbHVlX2ZlYXR1cmUiLCAiX1VJX1Rlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIERlY29yYXRvcnNQYWNrYWdlLkxpdGVyYWxzLlRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMV9fU1RFTV9USU1FX1ZBTFVFLAorCQkJCSB0cnVlLAorCQkJCSBmYWxzZSwKKwkJCQkgdHJ1ZSwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCwKKwkJCQkgbnVsbCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCb29sZWFuIFZhbHVlIGZlYXR1cmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQm9vbGVhblZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxX2Jvb2xlYW5WYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFfYm9vbGVhblZhbHVlX2ZlYXR1cmUiLCAiX1VJX1Rlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJIERlY29yYXRvcnNQYWNrYWdlLkxpdGVyYWxzLlRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMV9fQk9PTEVBTl9WQUxVRSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UsCisJCQkJIG51bGwsCisJCQkJIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1Rlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSlvYmplY3QpLmdldFVSSSgpOworCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOworCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KKwkJCWdldFN0cmluZygiX1VJX1Rlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMV90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9UZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjFfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisKKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMS5jbGFzcykpIHsKKwkJCWNhc2UgRGVjb3JhdG9yc1BhY2thZ2UuVEVTVF9TQ0VOQVJJT19HUkFQSF9ERUNPUkFUT1IxX19ET1VCTEVfVkFMVUU6CisJCQljYXNlIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMV9fSU5UX1ZBTFVFOgorCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX1NDRU5BUklPX0dSQVBIX0RFQ09SQVRPUjFfX1NUUklOR19WQUxVRToKKwkJCWNhc2UgRGVjb3JhdG9yc1BhY2thZ2UuVEVTVF9TQ0VOQVJJT19HUkFQSF9ERUNPUkFUT1IxX19CT09MRUFOX1ZBTFVFOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9kZWNvcmF0b3JzL3Byb3ZpZGVyL1Rlc3R1dGlsaXR5RWRpdFBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9wcm92aWRlci9UZXN0dXRpbGl0eUVkaXRQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDZlYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy9wcm92aWRlci9UZXN0dXRpbGl0eUVkaXRQbHVnaW4uamF2YQpAQCAtMCwwICsxLDEwMiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLkVjbGlwc2VVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUVkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db3JlRWRpdFBsdWdpbjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBjZW50cmFsIHNpbmdsZXRvbiBmb3IgdGhlIFRlc3R1dGlsaXR5IGVkaXRvciBwbHVnaW4uCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUZXN0dXRpbGl0eUVkaXRQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4geworCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFRlc3R1dGlsaXR5RWRpdFBsdWdpbiBJTlNUQU5DRSA9IG5ldyBUZXN0dXRpbGl0eUVkaXRQbHVnaW4oKTsKKworCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUZXN0dXRpbGl0eUVkaXRQbHVnaW4oKSB7CisJCXN1cGVyCisJCQkobmV3IFJlc291cmNlTG9jYXRvciBbXSB7CisJCQkJQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCQkJRWNvcmVFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkJfSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4geworCQkvKioKKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKKwkJCXN1cGVyKCk7CisJCisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgorCQkJLy8KKwkJCXBsdWdpbiA9IHRoaXM7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvdXRpbC9EZWNvcmF0b3JzQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvdXRpbC9EZWNvcmF0b3JzQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTMxYWEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy91dGlsL0RlY29yYXRvcnNBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzUyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLnV0aWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5FZGdlRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5HcmFwaERlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuRGVjb3JhdG9yc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEVkZ2VEZWNvcmF0b3IxOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RHcmFwaERlY29yYXRvcjE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdE5vZGVEZWNvcmF0b3IxOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLkRlY29yYXRvcnNQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEZWNvcmF0b3JzQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIERlY29yYXRvcnNQYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGVjb3JhdG9yc0FkYXB0ZXJGYWN0b3J5KCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IERlY29yYXRvcnNQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7CisJCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGVjb3JhdG9yc1N3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9CisJCW5ldyBEZWNvcmF0b3JzU3dpdGNoPEFkYXB0ZXI+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGVzdEVkZ2VEZWNvcmF0b3IxKFRlc3RFZGdlRGVjb3JhdG9yMSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlVGVzdEVkZ2VEZWNvcmF0b3IxQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGVzdEdyYXBoRGVjb3JhdG9yMShUZXN0R3JhcGhEZWNvcmF0b3IxIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVUZXN0R3JhcGhEZWNvcmF0b3IxQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGVzdE5vZGVEZWNvcmF0b3IxKFRlc3ROb2RlRGVjb3JhdG9yMSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlVGVzdE5vZGVEZWNvcmF0b3IxQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxKFRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRWRnZURlY29yYXRvcihFZGdlRGVjb3JhdG9yIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFZGdlRGVjb3JhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlR3JhcGhEZWNvcmF0b3IoR3JhcGhEZWNvcmF0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUdyYXBoRGVjb3JhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTm9kZURlY29yYXRvcihOb2RlRGVjb3JhdG9yIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVOb2RlRGVjb3JhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgPFQ+IEFkYXB0ZXIgY2FzZUNvbXBhcmFibGUoQ29tcGFyYWJsZTxUPiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ29tcGFyYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUlkZW50aWZpYWJsZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlY29yYXRvcihEZWNvcmF0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZURlY29yYXRvckFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUVkZ2VEZWNvcmF0b3JfMShFZGdlRGVjb3JhdG9yIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFZGdlRGVjb3JhdG9yXzFBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VHcmFwaERlY29yYXRvcl8xKEdyYXBoRGVjb3JhdG9yIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVHcmFwaERlY29yYXRvcl8xQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTm9kZURlY29yYXRvcl8xKE5vZGVEZWNvcmF0b3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZU5vZGVEZWNvcmF0b3JfMUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCisJICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7CisJCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOworCX0KKworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5UZXN0Tm9kZURlY29yYXRvcjEgPGVtPlRlc3QgTm9kZSBEZWNvcmF0b3IxPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3ROb2RlRGVjb3JhdG9yMQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXN0Tm9kZURlY29yYXRvcjFBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RFZGdlRGVjb3JhdG9yMSA8ZW0+VGVzdCBFZGdlIERlY29yYXRvcjE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEVkZ2VEZWNvcmF0b3IxCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlc3RFZGdlRGVjb3JhdG9yMUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEdyYXBoRGVjb3JhdG9yMSA8ZW0+VGVzdCBHcmFwaCBEZWNvcmF0b3IxPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RHcmFwaERlY29yYXRvcjEKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVzdEdyYXBoRGVjb3JhdG9yMUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxIDxlbT5UZXN0IFNjZW5hcmlvIEdyYXBoIERlY29yYXRvcjE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3IgPGVtPk5vZGUgRGVjb3JhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Ob2RlRGVjb3JhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5vZGVEZWNvcmF0b3JBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmEubGFuZy5Db21wYXJhYmxlIDxlbT5Db21wYXJhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhcmFibGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlIDxlbT5JZGVudGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yIDxlbT5EZWNvcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWNvcmF0b3JBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5FZGdlRGVjb3JhdG9yIDxlbT5FZGdlIERlY29yYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRWRnZURlY29yYXRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFZGdlRGVjb3JhdG9yXzFBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5HcmFwaERlY29yYXRvciA8ZW0+R3JhcGggRGVjb3JhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5HcmFwaERlY29yYXRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaERlY29yYXRvcl8xQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvciA8ZW0+Tm9kZSBEZWNvcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk5vZGVEZWNvcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTm9kZURlY29yYXRvcl8xQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRWRnZURlY29yYXRvciA8ZW0+RWRnZSBEZWNvcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkVkZ2VEZWNvcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRWRnZURlY29yYXRvckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkdyYXBoRGVjb3JhdG9yIDxlbT5HcmFwaCBEZWNvcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkdyYXBoRGVjb3JhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoRGVjb3JhdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL0RlY29yYXRvcnNBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvZGVjb3JhdG9ycy91dGlsL0RlY29yYXRvcnNTd2l0Y2guamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvdXRpbC9EZWNvcmF0b3JzU3dpdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2ZGM1YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2RlY29yYXRvcnMvdXRpbC9EZWNvcmF0b3JzU3dpdGNoLmphdmEKQEAgLTAsMCArMSwzNTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5FZGdlRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5HcmFwaERlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuRGVjb3JhdG9yc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdEVkZ2VEZWNvcmF0b3IxOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RHcmFwaERlY29yYXRvcjE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuVGVzdE5vZGVEZWNvcmF0b3IxOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLlRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KKyAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KKyAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKKyAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0CisgKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5CisgKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKKyAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5EZWNvcmF0b3JzUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRGVjb3JhdG9yc1N3aXRjaDxUMT4geworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgRGVjb3JhdG9yc1BhY2thZ2UgbW9kZWxQYWNrYWdlOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEZWNvcmF0b3JzU3dpdGNoKCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IERlY29yYXRvcnNQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7CisJCX0KKwkJZWxzZSB7CisJCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKKwkJCXJldHVybgorCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/CisJCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKKwkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQxIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgeworCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX0VER0VfREVDT1JBVE9SMTogeworCQkJCVRlc3RFZGdlRGVjb3JhdG9yMSB0ZXN0RWRnZURlY29yYXRvcjEgPSAoVGVzdEVkZ2VEZWNvcmF0b3IxKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVRlc3RFZGdlRGVjb3JhdG9yMSh0ZXN0RWRnZURlY29yYXRvcjEpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVkZ2VEZWNvcmF0b3JfMSh0ZXN0RWRnZURlY29yYXRvcjEpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcih0ZXN0RWRnZURlY29yYXRvcjEpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZSh0ZXN0RWRnZURlY29yYXRvcjEpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUodGVzdEVkZ2VEZWNvcmF0b3IxKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfR1JBUEhfREVDT1JBVE9SMTogeworCQkJCVRlc3RHcmFwaERlY29yYXRvcjEgdGVzdEdyYXBoRGVjb3JhdG9yMSA9IChUZXN0R3JhcGhEZWNvcmF0b3IxKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVRlc3RHcmFwaERlY29yYXRvcjEodGVzdEdyYXBoRGVjb3JhdG9yMSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3JhcGhEZWNvcmF0b3JfMSh0ZXN0R3JhcGhEZWNvcmF0b3IxKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZWNvcmF0b3IodGVzdEdyYXBoRGVjb3JhdG9yMSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHRlc3RHcmFwaERlY29yYXRvcjEpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUodGVzdEdyYXBoRGVjb3JhdG9yMSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBEZWNvcmF0b3JzUGFja2FnZS5URVNUX05PREVfREVDT1JBVE9SMTogeworCQkJCVRlc3ROb2RlRGVjb3JhdG9yMSB0ZXN0Tm9kZURlY29yYXRvcjEgPSAoVGVzdE5vZGVEZWNvcmF0b3IxKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVRlc3ROb2RlRGVjb3JhdG9yMSh0ZXN0Tm9kZURlY29yYXRvcjEpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVEZWNvcmF0b3JfMSh0ZXN0Tm9kZURlY29yYXRvcjEpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcih0ZXN0Tm9kZURlY29yYXRvcjEpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZSh0ZXN0Tm9kZURlY29yYXRvcjEpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUodGVzdE5vZGVEZWNvcmF0b3IxKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIERlY29yYXRvcnNQYWNrYWdlLlRFU1RfU0NFTkFSSU9fR1JBUEhfREVDT1JBVE9SMTogeworCQkJCVRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSB0ZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEgPSAoVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSh0ZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUdyYXBoRGVjb3JhdG9yXzEodGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZWNvcmF0b3IodGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUodGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHRlc3RTY2VuYXJpb0dyYXBoRGVjb3JhdG9yMSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVzdCBOb2RlIERlY29yYXRvcjE8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXN0IE5vZGUgRGVjb3JhdG9yMTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VUZXN0Tm9kZURlY29yYXRvcjEoVGVzdE5vZGVEZWNvcmF0b3IxIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXN0IEVkZ2UgRGVjb3JhdG9yMTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlc3QgRWRnZSBEZWNvcmF0b3IxPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVRlc3RFZGdlRGVjb3JhdG9yMShUZXN0RWRnZURlY29yYXRvcjEgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlc3QgR3JhcGggRGVjb3JhdG9yMTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlc3QgR3JhcGggRGVjb3JhdG9yMTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VUZXN0R3JhcGhEZWNvcmF0b3IxKFRlc3RHcmFwaERlY29yYXRvcjEgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlc3QgU2NlbmFyaW8gR3JhcGggRGVjb3JhdG9yMTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlc3QgU2NlbmFyaW8gR3JhcGggRGVjb3JhdG9yMTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VUZXN0U2NlbmFyaW9HcmFwaERlY29yYXRvcjEoVGVzdFNjZW5hcmlvR3JhcGhEZWNvcmF0b3IxIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlIERlY29yYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgRGVjb3JhdG9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZU5vZGVEZWNvcmF0b3IoTm9kZURlY29yYXRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyA8VD4gVDEgY2FzZUNvbXBhcmFibGUoQ29tcGFyYWJsZTxUPiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlY29yYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlY29yYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VEZWNvcmF0b3IoRGVjb3JhdG9yIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FZGdlIERlY29yYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVkZ2UgRGVjb3JhdG9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUVkZ2VEZWNvcmF0b3JfMShFZGdlRGVjb3JhdG9yIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBEZWNvcmF0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBEZWNvcmF0b3I8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlR3JhcGhEZWNvcmF0b3JfMShHcmFwaERlY29yYXRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZSBEZWNvcmF0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlIERlY29yYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VOb2RlRGVjb3JhdG9yXzEoTm9kZURlY29yYXRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWRnZSBEZWNvcmF0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FZGdlIERlY29yYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VFZGdlRGVjb3JhdG9yKEVkZ2VEZWNvcmF0b3Igb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoIERlY29yYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoIERlY29yYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VHcmFwaERlY29yYXRvcihHcmFwaERlY29yYXRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9IC8vRGVjb3JhdG9yc1N3aXRjaApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL0xhYmVsc0ZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9MYWJlbHNGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiNmNhNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9MYWJlbHNGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMDUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVsczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5MYWJlbHNQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTGFiZWxzRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUxhYmVsc0ZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5pbXBsLkxhYmVsc0ZhY3RvcnlJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVzdCBEeW5hbWljIEVkZ2UgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlc3QgRHluYW1pYyBFZGdlIExhYmVsPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUZXN0RHluYW1pY0VkZ2VMYWJlbCBjcmVhdGVUZXN0RHluYW1pY0VkZ2VMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZXN0IER5bmFtaWMgTGFiZWwxPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZXN0IER5bmFtaWMgTGFiZWwxPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUZXN0RHluYW1pY0xhYmVsMSBjcmVhdGVUZXN0RHluYW1pY0xhYmVsMSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZXN0IER5bmFtaWMgTm9kZSBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVzdCBEeW5hbWljIE5vZGUgTGFiZWw8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVRlc3REeW5hbWljTm9kZUxhYmVsIGNyZWF0ZVRlc3REeW5hbWljTm9kZUxhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlc3QgSW50ZWdlciBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVzdCBJbnRlZ2VyIExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUZXN0SW50ZWdlckxhYmVsVmFsdWUgY3JlYXRlVGVzdEludGVnZXJMYWJlbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlc3QgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlc3QgTGFiZWw8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVRlc3RMYWJlbCBjcmVhdGVUZXN0TGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVzdCBTdGF0aWMgRWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVzdCBTdGF0aWMgRWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGVzdFN0YXRpY0VkZ2VMYWJlbCBjcmVhdGVUZXN0U3RhdGljRWRnZUxhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlc3QgU3RhdGljIE5vZGUgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlc3QgU3RhdGljIE5vZGUgTGFiZWw8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVRlc3RTdGF0aWNOb2RlTGFiZWwgY3JlYXRlVGVzdFN0YXRpY05vZGVMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMYWJlbHNQYWNrYWdlIGdldExhYmVsc1BhY2thZ2UoKTsKKworfSAvL0xhYmVsc0ZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9MYWJlbHNQYWNrYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvTGFiZWxzUGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZmU4MDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvTGFiZWxzUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsODM0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50CisgKiA8dWw+CisgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorICogPC91bD4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLkxhYmVsc0ZhY3RvcnkKKyAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIExhYmVsc1BhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7CisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5BTUUgPSAibGFiZWxzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMuZWNvcmUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMYWJlbHNQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbC5pbml0KCk7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5UZXN0RHluYW1pY0VkZ2VMYWJlbEltcGwgPGVtPlRlc3QgRHluYW1pYyBFZGdlIExhYmVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5pbXBsLlRlc3REeW5hbWljRWRnZUxhYmVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5pbXBsLkxhYmVsc1BhY2thZ2VJbXBsI2dldFRlc3REeW5hbWljRWRnZUxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRFU1RfRFlOQU1JQ19FREdFX0xBQkVMID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0RZTkFNSUNfRURHRV9MQUJFTF9fVVJJID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfRURHRV9MQUJFTF9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9EWU5BTUlDX0VER0VfTEFCRUxfX1RZUEVfVVJJID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfRURHRV9MQUJFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0RZTkFNSUNfRURHRV9MQUJFTF9fRFVCTElOX0NPUkUgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19FREdFX0xBQkVMX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkkgT2YgSWRlbnRpZmlhYmxlIFRvIEJlIExhYmVsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0RZTkFNSUNfRURHRV9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfRURHRV9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0RZTkFNSUNfRURHRV9MQUJFTF9fQ1VSUkVOVF9WQUxVRSA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX0VER0VfTEFCRUxfX0NVUlJFTlRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRlbnRpZmlhYmxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9EWU5BTUlDX0VER0VfTEFCRUxfX0lERU5USUZJQUJMRSA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX0VER0VfTEFCRUxfX0lERU5USUZJQUJMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlIFZhbGlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9EWU5BTUlDX0VER0VfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19FREdFX0xBQkVMX19ORVhUX1ZBTFVFX1ZBTElEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5leHQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0RZTkFNSUNfRURHRV9MQUJFTF9fTkVYVF9WQUxVRSA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX0VER0VfTEFCRUxfX05FWFRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVjb3JhdG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9EWU5BTUlDX0VER0VfTEFCRUxfX0RFQ09SQVRPUiA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX0VER0VfTEFCRUxfX0RFQ09SQVRPUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FZGdlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfRFlOQU1JQ19FREdFX0xBQkVMX19FREdFID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfRURHRV9MQUJFTF9fRURHRTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZXN0IER5bmFtaWMgRWRnZSBMYWJlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0RZTkFNSUNfRURHRV9MQUJFTF9GRUFUVVJFX0NPVU5UID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfRURHRV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5pbXBsLlRlc3REeW5hbWljTGFiZWwxSW1wbCA8ZW0+VGVzdCBEeW5hbWljIExhYmVsMTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5UZXN0RHluYW1pY0xhYmVsMUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRUZXN0RHluYW1pY0xhYmVsMSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBURVNUX0RZTkFNSUNfTEFCRUwxID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0RZTkFNSUNfTEFCRUwxX19VUkkgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19MQUJFTF9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9EWU5BTUlDX0xBQkVMMV9fVFlQRV9VUkkgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19MQUJFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0RZTkFNSUNfTEFCRUwxX19EVUJMSU5fQ09SRSA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX0xBQkVMX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkkgT2YgSWRlbnRpZmlhYmxlIFRvIEJlIExhYmVsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0RZTkFNSUNfTEFCRUwxX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0RZTkFNSUNfTEFCRUwxX19DVVJSRU5UX1ZBTFVFID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTEFCRUxfX0NVUlJFTlRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRlbnRpZmlhYmxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9EWU5BTUlDX0xBQkVMMV9fSURFTlRJRklBQkxFID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTEFCRUxfX0lERU5USUZJQUJMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlIFZhbGlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9EWU5BTUlDX0xBQkVMMV9fTkVYVF9WQUxVRV9WQUxJRCA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX0xBQkVMX19ORVhUX1ZBTFVFX1ZBTElEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5leHQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0RZTkFNSUNfTEFCRUwxX19ORVhUX1ZBTFVFID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTEFCRUxfX05FWFRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVjb3JhdG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9EWU5BTUlDX0xBQkVMMV9fREVDT1JBVE9SID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTEFCRUxfX0RFQ09SQVRPUjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZXN0IER5bmFtaWMgTGFiZWwxPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfRFlOQU1JQ19MQUJFTDFfRkVBVFVSRV9DT1VOVCA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLmltcGwuVGVzdER5bmFtaWNOb2RlTGFiZWxJbXBsIDxlbT5UZXN0IER5bmFtaWMgTm9kZSBMYWJlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5UZXN0RHluYW1pY05vZGVMYWJlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRUZXN0RHluYW1pY05vZGVMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBURVNUX0RZTkFNSUNfTk9ERV9MQUJFTCA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9EWU5BTUlDX05PREVfTEFCRUxfX1VSSSA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfRFlOQU1JQ19OT0RFX0xBQkVMX19UWVBFX1VSSSA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9EWU5BTUlDX05PREVfTEFCRUxfX0RVQkxJTl9DT1JFID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTk9ERV9MQUJFTF9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9EWU5BTUlDX05PREVfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCA9IEdyYXBoUGFja2FnZS5EWU5BTUlDX05PREVfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9EWU5BTUlDX05PREVfTEFCRUxfX0NVUlJFTlRfVkFMVUUgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19OT0RFX0xBQkVMX19DVVJSRU5UX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkZW50aWZpYWJsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfRFlOQU1JQ19OT0RFX0xBQkVMX19JREVOVElGSUFCTEUgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19OT0RFX0xBQkVMX19JREVOVElGSUFCTEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV4dCBWYWx1ZSBWYWxpZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfRFlOQU1JQ19OT0RFX0xBQkVMX19ORVhUX1ZBTFVFX1ZBTElEID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTk9ERV9MQUJFTF9fTkVYVF9WQUxVRV9WQUxJRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9EWU5BTUlDX05PREVfTEFCRUxfX05FWFRfVkFMVUUgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19OT0RFX0xBQkVMX19ORVhUX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlY29yYXRvcjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfRFlOQU1JQ19OT0RFX0xBQkVMX19ERUNPUkFUT1IgPSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19OT0RFX0xBQkVMX19ERUNPUkFUT1I7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfRFlOQU1JQ19OT0RFX0xBQkVMX19OT0RFID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTk9ERV9MQUJFTF9fTk9ERTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZXN0IER5bmFtaWMgTm9kZSBMYWJlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0RZTkFNSUNfTk9ERV9MQUJFTF9GRUFUVVJFX0NPVU5UID0gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTk9ERV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5pbXBsLlRlc3RJbnRlZ2VyTGFiZWxWYWx1ZUltcGwgPGVtPlRlc3QgSW50ZWdlciBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5UZXN0SW50ZWdlckxhYmVsVmFsdWVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLmltcGwuTGFiZWxzUGFja2FnZUltcGwjZ2V0VGVzdEludGVnZXJMYWJlbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRFU1RfSU5URUdFUl9MQUJFTF9WQUxVRSA9IDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+STwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfSU5URUdFUl9MQUJFTF9WQUxVRV9fSSA9IEdyYXBoUGFja2FnZS5MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZXN0IEludGVnZXIgTGFiZWwgVmFsdWU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9JTlRFR0VSX0xBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgPSBHcmFwaFBhY2thZ2UuTEFCRUxfVkFMVUVfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5UZXN0TGFiZWxJbXBsIDxlbT5UZXN0IExhYmVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5pbXBsLlRlc3RMYWJlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRUZXN0TGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVEVTVF9MQUJFTCA9IDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9MQUJFTF9fVVJJID0gR3JhcGhQYWNrYWdlLkxBQkVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0xBQkVMX19UWVBFX1VSSSA9IEdyYXBoUGFja2FnZS5MQUJFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0xBQkVMX19EVUJMSU5fQ09SRSA9IEdyYXBoUGFja2FnZS5MQUJFTF9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEID0gR3JhcGhQYWNrYWdlLkxBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfTEFCRUxfX0NVUlJFTlRfVkFMVUUgPSBHcmFwaFBhY2thZ2UuTEFCRUxfX0NVUlJFTlRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRlbnRpZmlhYmxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9MQUJFTF9fSURFTlRJRklBQkxFID0gR3JhcGhQYWNrYWdlLkxBQkVMX19JREVOVElGSUFCTEU7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGVzdCBMYWJlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX0xBQkVMX0ZFQVRVUkVfQ09VTlQgPSBHcmFwaFBhY2thZ2UuTEFCRUxfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5UZXN0U3RhdGljRWRnZUxhYmVsSW1wbCA8ZW0+VGVzdCBTdGF0aWMgRWRnZSBMYWJlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5UZXN0U3RhdGljRWRnZUxhYmVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5pbXBsLkxhYmVsc1BhY2thZ2VJbXBsI2dldFRlc3RTdGF0aWNFZGdlTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVEVTVF9TVEFUSUNfRURHRV9MQUJFTCA9IDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9TVEFUSUNfRURHRV9MQUJFTF9fVVJJID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19FREdFX0xBQkVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX1NUQVRJQ19FREdFX0xBQkVMX19UWVBFX1VSSSA9IEdyYXBoUGFja2FnZS5TVEFUSUNfRURHRV9MQUJFTF9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX1NUQVRJQ19FREdFX0xBQkVMX19EVUJMSU5fQ09SRSA9IEdyYXBoUGFja2FnZS5TVEFUSUNfRURHRV9MQUJFTF9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9TVEFUSUNfRURHRV9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19FREdFX0xBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfU1RBVElDX0VER0VfTEFCRUxfX0NVUlJFTlRfVkFMVUUgPSBHcmFwaFBhY2thZ2UuU1RBVElDX0VER0VfTEFCRUxfX0NVUlJFTlRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRlbnRpZmlhYmxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9TVEFUSUNfRURHRV9MQUJFTF9fSURFTlRJRklBQkxFID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19FREdFX0xBQkVMX19JREVOVElGSUFCTEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWRnZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX1NUQVRJQ19FREdFX0xBQkVMX19FREdFID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19FREdFX0xBQkVMX19FREdFOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRlc3QgU3RhdGljIEVkZ2UgTGFiZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9TVEFUSUNfRURHRV9MQUJFTF9GRUFUVVJFX0NPVU5UID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19FREdFX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLmltcGwuVGVzdFN0YXRpY05vZGVMYWJlbEltcGwgPGVtPlRlc3QgU3RhdGljIE5vZGUgTGFiZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLmltcGwuVGVzdFN0YXRpY05vZGVMYWJlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRUZXN0U3RhdGljTm9kZUxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRFU1RfU1RBVElDX05PREVfTEFCRUwgPSA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfU1RBVElDX05PREVfTEFCRUxfX1VSSSA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9TVEFUSUNfTk9ERV9MQUJFTF9fVFlQRV9VUkkgPSBHcmFwaFBhY2thZ2UuU1RBVElDX05PREVfTEFCRUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9TVEFUSUNfTk9ERV9MQUJFTF9fRFVCTElOX0NPUkUgPSBHcmFwaFBhY2thZ2UuU1RBVElDX05PREVfTEFCRUxfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSSBPZiBJZGVudGlmaWFibGUgVG8gQmUgTGFiZWxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfU1RBVElDX05PREVfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX1NUQVRJQ19OT0RFX0xBQkVMX19DVVJSRU5UX1ZBTFVFID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19OT0RFX0xBQkVMX19DVVJSRU5UX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkZW50aWZpYWJsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFU1RfU1RBVElDX05PREVfTEFCRUxfX0lERU5USUZJQUJMRSA9IEdyYXBoUGFja2FnZS5TVEFUSUNfTk9ERV9MQUJFTF9fSURFTlRJRklBQkxFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVNUX1NUQVRJQ19OT0RFX0xBQkVMX19OT0RFID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19OT0RFX0xBQkVMX19OT0RFOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRlc3QgU3RhdGljIE5vZGUgTGFiZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVTVF9TVEFUSUNfTk9ERV9MQUJFTF9GRUFUVVJFX0NPVU5UID0gR3JhcGhQYWNrYWdlLlNUQVRJQ19OT0RFX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAwOworCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljRWRnZUxhYmVsIDxlbT5UZXN0IER5bmFtaWMgRWRnZSBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UZXN0IER5bmFtaWMgRWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdER5bmFtaWNFZGdlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFRlc3REeW5hbWljRWRnZUxhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljTGFiZWwxIDxlbT5UZXN0IER5bmFtaWMgTGFiZWwxPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRlc3QgRHluYW1pYyBMYWJlbDE8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljTGFiZWwxCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUZXN0RHluYW1pY0xhYmVsMSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0RHluYW1pY05vZGVMYWJlbCA8ZW0+VGVzdCBEeW5hbWljIE5vZGUgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVzdCBEeW5hbWljIE5vZGUgTGFiZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljTm9kZUxhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUZXN0RHluYW1pY05vZGVMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0SW50ZWdlckxhYmVsVmFsdWUgPGVtPlRlc3QgSW50ZWdlciBMYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UZXN0IEludGVnZXIgTGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RJbnRlZ2VyTGFiZWxWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0VGVzdEludGVnZXJMYWJlbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdEludGVnZXJMYWJlbFZhbHVlI2dldEkgPGVtPkk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0SW50ZWdlckxhYmVsVmFsdWUjZ2V0SSgpCisJICogQHNlZSAjZ2V0VGVzdEludGVnZXJMYWJlbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUZXN0SW50ZWdlckxhYmVsVmFsdWVfSSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0TGFiZWwgPGVtPlRlc3QgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVzdCBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdExhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUZXN0TGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdFN0YXRpY0VkZ2VMYWJlbCA8ZW0+VGVzdCBTdGF0aWMgRWRnZSBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UZXN0IFN0YXRpYyBFZGdlIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0U3RhdGljRWRnZUxhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUZXN0U3RhdGljRWRnZUxhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RTdGF0aWNOb2RlTGFiZWwgPGVtPlRlc3QgU3RhdGljIE5vZGUgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVzdCBTdGF0aWMgTm9kZSBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdFN0YXRpY05vZGVMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0VGVzdFN0YXRpY05vZGVMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGFiZWxzRmFjdG9yeSBnZXRMYWJlbHNGYWN0b3J5KCk7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKKwkgKiA8dWw+CisJICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisJICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKwkgKiA8L3VsPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnRlcmZhY2UgTGl0ZXJhbHMgeworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5UZXN0RHluYW1pY0VkZ2VMYWJlbEltcGwgPGVtPlRlc3QgRHluYW1pYyBFZGdlIExhYmVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5pbXBsLlRlc3REeW5hbWljRWRnZUxhYmVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRUZXN0RHluYW1pY0VkZ2VMYWJlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBURVNUX0RZTkFNSUNfRURHRV9MQUJFTCA9IGVJTlNUQU5DRS5nZXRUZXN0RHluYW1pY0VkZ2VMYWJlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5pbXBsLlRlc3REeW5hbWljTGFiZWwxSW1wbCA8ZW0+VGVzdCBEeW5hbWljIExhYmVsMTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5UZXN0RHluYW1pY0xhYmVsMUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLmltcGwuTGFiZWxzUGFja2FnZUltcGwjZ2V0VGVzdER5bmFtaWNMYWJlbDEoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVEVTVF9EWU5BTUlDX0xBQkVMMSA9IGVJTlNUQU5DRS5nZXRUZXN0RHluYW1pY0xhYmVsMSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5pbXBsLlRlc3REeW5hbWljTm9kZUxhYmVsSW1wbCA8ZW0+VGVzdCBEeW5hbWljIE5vZGUgTGFiZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLmltcGwuVGVzdER5bmFtaWNOb2RlTGFiZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5pbXBsLkxhYmVsc1BhY2thZ2VJbXBsI2dldFRlc3REeW5hbWljTm9kZUxhYmVsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRFU1RfRFlOQU1JQ19OT0RFX0xBQkVMID0gZUlOU1RBTkNFLmdldFRlc3REeW5hbWljTm9kZUxhYmVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLmltcGwuVGVzdEludGVnZXJMYWJlbFZhbHVlSW1wbCA8ZW0+VGVzdCBJbnRlZ2VyIExhYmVsIFZhbHVlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5pbXBsLlRlc3RJbnRlZ2VyTGFiZWxWYWx1ZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLmltcGwuTGFiZWxzUGFja2FnZUltcGwjZ2V0VGVzdEludGVnZXJMYWJlbFZhbHVlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRFU1RfSU5URUdFUl9MQUJFTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRUZXN0SW50ZWdlckxhYmVsVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBURVNUX0lOVEVHRVJfTEFCRUxfVkFMVUVfX0kgPSBlSU5TVEFOQ0UuZ2V0VGVzdEludGVnZXJMYWJlbFZhbHVlX0koKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5UZXN0TGFiZWxJbXBsIDxlbT5UZXN0IExhYmVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5pbXBsLlRlc3RMYWJlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLmltcGwuTGFiZWxzUGFja2FnZUltcGwjZ2V0VGVzdExhYmVsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRFU1RfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0VGVzdExhYmVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLmltcGwuVGVzdFN0YXRpY0VkZ2VMYWJlbEltcGwgPGVtPlRlc3QgU3RhdGljIEVkZ2UgTGFiZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLmltcGwuVGVzdFN0YXRpY0VkZ2VMYWJlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLmltcGwuTGFiZWxzUGFja2FnZUltcGwjZ2V0VGVzdFN0YXRpY0VkZ2VMYWJlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBURVNUX1NUQVRJQ19FREdFX0xBQkVMID0gZUlOU1RBTkNFLmdldFRlc3RTdGF0aWNFZGdlTGFiZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5UZXN0U3RhdGljTm9kZUxhYmVsSW1wbCA8ZW0+VGVzdCBTdGF0aWMgTm9kZSBMYWJlbDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5UZXN0U3RhdGljTm9kZUxhYmVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5MYWJlbHNQYWNrYWdlSW1wbCNnZXRUZXN0U3RhdGljTm9kZUxhYmVsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRFU1RfU1RBVElDX05PREVfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0VGVzdFN0YXRpY05vZGVMYWJlbCgpOworCisJfQorCit9IC8vTGFiZWxzUGFja2FnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL1Rlc3REeW5hbWljRWRnZUxhYmVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvVGVzdER5bmFtaWNFZGdlTGFiZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzZhNDUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL1Rlc3REeW5hbWljRWRnZUxhYmVsLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLy8gVGVzdER5bmFtaWNFZGdlTGFiZWwuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljRWRnZUxhYmVsOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGZvciB0ZXN0aW5nLgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBUZXN0RHluYW1pY0VkZ2VMYWJlbCBleHRlbmRzIER5bmFtaWNFZGdlTGFiZWwgeworCisJLyoqCisJICogTWFrZSB0aGUgbmV4dCB2YWx1ZSBiZSBvbmUgbW9yZSB0aGFuIHRoZSBjdXJyZW50IHZhbHVlLgorCSAqIAorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwl2b2lkIGluY3JlbWVudCgpOworfSAvLyBUZXN0RHluYW1pY0VkZ2VMYWJlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL1Rlc3REeW5hbWljTGFiZWwxLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvVGVzdER5bmFtaWNMYWJlbDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2ZiNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL1Rlc3REeW5hbWljTGFiZWwxLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLy8gVGVzdER5bmFtaWNMYWJlbDEuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWw7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyB0aGUgbW9kZWwgb2YgYW4gYWJzdHJhY3QgY2xhc3MgaW4gYW4gRU1GIG1vZGVsIHRoYXQKKyAqIGlzIGFuIGV4YW1wbGUgb2YgYSBEeW5hbWljTGFiZWwgaW1wbGVtZW50YXRpb24gdXNlZCBmb3IgdGVzdCBwdXJwb3Nlcy4KKyAqIAorICogQHNlZSBUZXN0SW50ZWdlckxhYmVsVmFsdWUKKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGVzdER5bmFtaWNMYWJlbDEgZXh0ZW5kcyBEeW5hbWljTGFiZWwgeworCisJLyoqCisJICogTWFrZSB0aGUgbmV4dCB2YWx1ZSBiZSBvbmUgbW9yZSB0aGFuIHRoZSBjdXJyZW50IHZhbHVlLgorCSAqIAorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwl2b2lkIGluY3JlbWVudCgpOworCit9IC8vIFRlc3REeW5hbWljTGFiZWwxCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvVGVzdER5bmFtaWNOb2RlTGFiZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9UZXN0RHluYW1pY05vZGVMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMDM5YTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvVGVzdER5bmFtaWNOb2RlTGFiZWwuamF2YQpAQCAtMCwwICsxLDMxIEBACisvLyBUZXN0RHluYW1pY05vZGVMYWJlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNOb2RlTGFiZWw7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgZm9yIHRlc3RpbmcuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRlc3REeW5hbWljTm9kZUxhYmVsIGV4dGVuZHMgRHluYW1pY05vZGVMYWJlbCB7CisKKwkvKioKKwkgKiBNYWtlIHRoZSBuZXh0IHZhbHVlIGJlIG9uZSBtb3JlIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUuCisJICogCisJICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIgorCSAqLworCXZvaWQgaW5jcmVtZW50KCk7CisKK30gLy8gVGVzdER5bmFtaWNOb2RlTGFiZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9UZXN0SW50ZWdlckxhYmVsVmFsdWUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9UZXN0SW50ZWdlckxhYmVsVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTE5Y2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL1Rlc3RJbnRlZ2VyTGFiZWxWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8vIFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CisKKy8qKgorICogLyoqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgdGhlIG1vZGVsIG9mIGFuIGFic3RyYWN0IGNsYXNzIGluIGFuIEVNRiBtb2RlbAorICogdGhhdCBpcyBhbiBleGFtcGxlIG9mIGEgTGFiZWxWYWx1ZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGZvciB0ZXN0IHB1cnBvc2VzLgorICogCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBUZXN0SW50ZWdlckxhYmVsVmFsdWUgZXh0ZW5kcyBMYWJlbFZhbHVlIHsKKworCS8qKgorCSAqIFRoZSBpbnRlZ2VyIHZhbHVlIHVzZWQgaW4gdGVzdCBjYXNlcyBmb3IgdGhlIGluaXRpYWwgImN1cnJlbnQiIHZhbHVlLgorCSAqLworCWludCBDVVJSRU5UX0xBQkVMX0lOVEVHRVJfVkFMVUUgPSAxMDsKKwkKKwkvKioKKwkgKiBUaGUgaW50ZWdlciB2YWx1ZSB1c2VkIGluIHRlc3QgY2FzZXMgZm9yIHRoZSBpbml0aWFsICJuZXh0IiB2YWx1ZS4KKwkgKi8KKwlpbnQgTkVYVF9MQUJFTF9JTlRFR0VSX1ZBTFVFID0gMTE7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIDxjb2RlPmk8L2NvZGU+CisJICogQG1vZGVsCisJICovCisJaW50IGdldEkoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdEludGVnZXJMYWJlbFZhbHVlI2dldEkgPGVtPkk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEkoaW50IHZhbHVlKTsKKworCS8qKgorCSAqIEBtb2RlbCB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKwkgKi8KKwl2b2lkIGluY3JlbWVudCgpOworfSAvLyBUZXN0SW50ZWdlckxhYmVsVmFsdWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9UZXN0TGFiZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9UZXN0TGFiZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWNhYzIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL1Rlc3RMYWJlbC5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8vIFRlc3RMYWJlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgdGhlIG1vZGVsIG9mIGFuIGFic3RyYWN0IGNsYXNzIGluIGFuIEVNRiBtb2RlbCB0aGF0CisgKiBpcyBhbiBleGFtcGxlIG9mIGEgTGFiZWwgaW1wbGVtZW50YXRpb24gdXNlZCBmb3IgdGVzdCBwdXJwb3Nlcy4KKyAqIAorICogQHNlZSBUZXN0SW50ZWdlckxhYmVsVmFsdWUKKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGVzdExhYmVsIGV4dGVuZHMgTGFiZWwgeworfSAvLyBUZXN0TGFiZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9UZXN0U3RhdGljRWRnZUxhYmVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvVGVzdFN0YXRpY0VkZ2VMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OTc1YTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvVGVzdFN0YXRpY0VkZ2VMYWJlbC5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8vIFRlc3RTdGF0aWNFZGdlTGFiZWwuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNFZGdlTGFiZWw7CisKKy8qKgorICogVGhpcyBpcyBhIHRlc3QgY2xhc3MuCisgKiAKKyAqIEBtb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRlc3RTdGF0aWNFZGdlTGFiZWwgZXh0ZW5kcyBTdGF0aWNFZGdlTGFiZWwgeworCit9ICAvLyBUZXN0U3RhdGljRWRnZUxhYmVsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL1Rlc3RTdGF0aWNOb2RlTGFiZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9UZXN0U3RhdGljTm9kZUxhYmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyMmIwNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9UZXN0U3RhdGljTm9kZUxhYmVsLmphdmEKQEAgLTAsMCArMSwyMyBAQAorLy8gVGVzdFN0YXRpY05vZGVMYWJlbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY05vZGVMYWJlbDsKKworLyoqCisgKiBUaGlzIGlzIGEgdGVzdCBjbGFzcy4KKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGVzdFN0YXRpY05vZGVMYWJlbCBleHRlbmRzIFN0YXRpY05vZGVMYWJlbCB7Cit9IC8vIFRlc3RTdGF0aWNOb2RlTGFiZWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvaW1wbC9MYWJlbHNGYWN0b3J5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL2ltcGwvTGFiZWxzRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDBkMTAyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL2ltcGwvTGFiZWxzRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5MYWJlbHNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuTGFiZWxzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdER5bmFtaWNMYWJlbDE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0RHluYW1pY05vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RJbnRlZ2VyTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RTdGF0aWNFZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0U3RhdGljTm9kZUxhYmVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIExhYmVsc0ZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgTGFiZWxzRmFjdG9yeSB7CisJLyoqCisJICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgTGFiZWxzRmFjdG9yeSBpbml0KCkgeworCQl0cnkgeworCQkJTGFiZWxzRmFjdG9yeSB0aGVMYWJlbHNGYWN0b3J5ID0gKExhYmVsc0ZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy5lY29yZSIpOyAvLyROT04tTkxTLTEkIAorCQkJaWYgKHRoZUxhYmVsc0ZhY3RvcnkgIT0gbnVsbCkgeworCQkJCXJldHVybiB0aGVMYWJlbHNGYWN0b3J5OworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IExhYmVsc0ZhY3RvcnlJbXBsKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGFiZWxzRmFjdG9yeUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKKwkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5URVNUX0RZTkFNSUNfRURHRV9MQUJFTDogcmV0dXJuIGNyZWF0ZVRlc3REeW5hbWljRWRnZUxhYmVsKCk7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVEVTVF9EWU5BTUlDX0xBQkVMMTogcmV0dXJuIGNyZWF0ZVRlc3REeW5hbWljTGFiZWwxKCk7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVEVTVF9EWU5BTUlDX05PREVfTEFCRUw6IHJldHVybiBjcmVhdGVUZXN0RHluYW1pY05vZGVMYWJlbCgpOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRFU1RfSU5URUdFUl9MQUJFTF9WQUxVRTogcmV0dXJuIGNyZWF0ZVRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSgpOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRFU1RfTEFCRUw6IHJldHVybiBjcmVhdGVUZXN0TGFiZWwoKTsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5URVNUX1NUQVRJQ19FREdFX0xBQkVMOiByZXR1cm4gY3JlYXRlVGVzdFN0YXRpY0VkZ2VMYWJlbCgpOworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRFU1RfU1RBVElDX05PREVfTEFCRUw6IHJldHVybiBjcmVhdGVUZXN0U3RhdGljTm9kZUxhYmVsKCk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRlc3REeW5hbWljRWRnZUxhYmVsIGNyZWF0ZVRlc3REeW5hbWljRWRnZUxhYmVsKCkgeworCQlUZXN0RHluYW1pY0VkZ2VMYWJlbEltcGwgdGVzdER5bmFtaWNFZGdlTGFiZWwgPSBuZXcgVGVzdER5bmFtaWNFZGdlTGFiZWxJbXBsKCk7CisJCXJldHVybiB0ZXN0RHluYW1pY0VkZ2VMYWJlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGVzdER5bmFtaWNMYWJlbDEgY3JlYXRlVGVzdER5bmFtaWNMYWJlbDEoKSB7CisJCVRlc3REeW5hbWljTGFiZWwxSW1wbCB0ZXN0RHluYW1pY0xhYmVsMSA9IG5ldyBUZXN0RHluYW1pY0xhYmVsMUltcGwoKTsKKwkJcmV0dXJuIHRlc3REeW5hbWljTGFiZWwxOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUZXN0RHluYW1pY05vZGVMYWJlbCBjcmVhdGVUZXN0RHluYW1pY05vZGVMYWJlbCgpIHsKKwkJVGVzdER5bmFtaWNOb2RlTGFiZWxJbXBsIHRlc3REeW5hbWljTm9kZUxhYmVsID0gbmV3IFRlc3REeW5hbWljTm9kZUxhYmVsSW1wbCgpOworCQlyZXR1cm4gdGVzdER5bmFtaWNOb2RlTGFiZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSBjcmVhdGVUZXN0SW50ZWdlckxhYmVsVmFsdWUoKSB7CisJCVRlc3RJbnRlZ2VyTGFiZWxWYWx1ZUltcGwgdGVzdEludGVnZXJMYWJlbFZhbHVlID0gbmV3IFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZUltcGwoKTsKKwkJcmV0dXJuIHRlc3RJbnRlZ2VyTGFiZWxWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGVzdExhYmVsIGNyZWF0ZVRlc3RMYWJlbCgpIHsKKwkJVGVzdExhYmVsSW1wbCB0ZXN0TGFiZWwgPSBuZXcgVGVzdExhYmVsSW1wbCgpOworCQlyZXR1cm4gdGVzdExhYmVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUZXN0U3RhdGljRWRnZUxhYmVsIGNyZWF0ZVRlc3RTdGF0aWNFZGdlTGFiZWwoKSB7CisJCVRlc3RTdGF0aWNFZGdlTGFiZWxJbXBsIHRlc3RTdGF0aWNFZGdlTGFiZWwgPSBuZXcgVGVzdFN0YXRpY0VkZ2VMYWJlbEltcGwoKTsKKwkJcmV0dXJuIHRlc3RTdGF0aWNFZGdlTGFiZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRlc3RTdGF0aWNOb2RlTGFiZWwgY3JlYXRlVGVzdFN0YXRpY05vZGVMYWJlbCgpIHsKKwkJVGVzdFN0YXRpY05vZGVMYWJlbEltcGwgdGVzdFN0YXRpY05vZGVMYWJlbCA9IG5ldyBUZXN0U3RhdGljTm9kZUxhYmVsSW1wbCgpOworCQlyZXR1cm4gdGVzdFN0YXRpY05vZGVMYWJlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGFiZWxzUGFja2FnZSBnZXRMYWJlbHNQYWNrYWdlKCkgeworCQlyZXR1cm4gKExhYmVsc1BhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBkZXByZWNhdGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBMYWJlbHNQYWNrYWdlIGdldFBhY2thZ2UoKSB7CisJCXJldHVybiBMYWJlbHNQYWNrYWdlLmVJTlNUQU5DRTsKKwl9CisKK30gLy9MYWJlbHNGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL2ltcGwvTGFiZWxzUGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9pbXBsL0xhYmVsc1BhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA3MmFiMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9pbXBsL0xhYmVsc1BhY2thZ2VJbXBsLmphdmEKQEAgLTAsMCArMSwzNTYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlclBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuRGVjb3JhdG9yc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMuaW1wbC5EZWNvcmF0b3JzUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5MYWJlbHNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuTGFiZWxzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdER5bmFtaWNMYWJlbDE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0RHluYW1pY05vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RJbnRlZ2VyTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RTdGF0aWNFZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0U3RhdGljTm9kZUxhYmVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIExhYmVsc1BhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgTGFiZWxzUGFja2FnZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGVzdER5bmFtaWNFZGdlTGFiZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGVzdER5bmFtaWNMYWJlbDFFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGVzdER5bmFtaWNOb2RlTGFiZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGVzdEludGVnZXJMYWJlbFZhbHVlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHRlc3RMYWJlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB0ZXN0U3RhdGljRWRnZUxhYmVsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHRlc3RTdGF0aWNOb2RlTGFiZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCisJICogcGFja2FnZSBVUkkgdmFsdWUuCisJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYworCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCisJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKKwkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5MYWJlbHNQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBMYWJlbHNQYWNrYWdlSW1wbCgpIHsKKwkJc3VwZXIoZU5TX1VSSSwgTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcworCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCisJICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKKwkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKKwkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCisJICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KKwkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCisJICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCisJICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgorCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55CisJICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KKwkgKiB0aG9zZSBvZiBhbm90aGVyLgorCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKKwkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNlTlNfVVJJCisJICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBMYWJlbHNQYWNrYWdlIGluaXQoKSB7CisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChMYWJlbHNQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKExhYmVsc1BhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQorCQlMYWJlbHNQYWNrYWdlSW1wbCB0aGVMYWJlbHNQYWNrYWdlID0gKExhYmVsc1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIExhYmVsc1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgTGFiZWxzUGFja2FnZUltcGwoKSk7CisKKwkJaXNJbml0ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcworCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJR3JhcGhQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJTW9kaWZpZXJQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJU2NlbmFyaW9QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJU2VxdWVuY2VyUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisKKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKKwkJRGVjb3JhdG9yc1BhY2thZ2VJbXBsIHRoZURlY29yYXRvcnNQYWNrYWdlID0gKERlY29yYXRvcnNQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRGVjb3JhdG9yc1BhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBEZWNvcmF0b3JzUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEZWNvcmF0b3JzUGFja2FnZS5lTlNfVVJJKSA6IERlY29yYXRvcnNQYWNrYWdlLmVJTlNUQU5DRSk7CisKKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKKwkJdGhlTGFiZWxzUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlRGVjb3JhdG9yc1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQorCQl0aGVMYWJlbHNQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlRGVjb3JhdG9yc1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKwkJdGhlTGFiZWxzUGFja2FnZS5mcmVlemUoKTsKKworCQlyZXR1cm4gdGhlTGFiZWxzUGFja2FnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRlc3REeW5hbWljRWRnZUxhYmVsKCkgeworCQlyZXR1cm4gdGVzdER5bmFtaWNFZGdlTGFiZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRUZXN0RHluYW1pY0xhYmVsMSgpIHsKKwkJcmV0dXJuIHRlc3REeW5hbWljTGFiZWwxRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0VGVzdER5bmFtaWNOb2RlTGFiZWwoKSB7CisJCXJldHVybiB0ZXN0RHluYW1pY05vZGVMYWJlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSgpIHsKKwkJcmV0dXJuIHRlc3RJbnRlZ2VyTGFiZWxWYWx1ZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUZXN0SW50ZWdlckxhYmVsVmFsdWVfSSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXRlc3RJbnRlZ2VyTGFiZWxWYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0VGVzdExhYmVsKCkgeworCQlyZXR1cm4gdGVzdExhYmVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0VGVzdFN0YXRpY0VkZ2VMYWJlbCgpIHsKKwkJcmV0dXJuIHRlc3RTdGF0aWNFZGdlTGFiZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRUZXN0U3RhdGljTm9kZUxhYmVsKCkgeworCQlyZXR1cm4gdGVzdFN0YXRpY05vZGVMYWJlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGFiZWxzRmFjdG9yeSBnZXRMYWJlbHNGYWN0b3J5KCkgeworCQlyZXR1cm4gKExhYmVsc0ZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcworCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKKwkJaXNDcmVhdGVkID0gdHJ1ZTsKKworCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJdGVzdER5bmFtaWNFZGdlTGFiZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVTVF9EWU5BTUlDX0VER0VfTEFCRUwpOworCisJCXRlc3REeW5hbWljTGFiZWwxRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFU1RfRFlOQU1JQ19MQUJFTDEpOworCisJCXRlc3REeW5hbWljTm9kZUxhYmVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFU1RfRFlOQU1JQ19OT0RFX0xBQkVMKTsKKworCQl0ZXN0SW50ZWdlckxhYmVsVmFsdWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVTVF9JTlRFR0VSX0xBQkVMX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0ZXN0SW50ZWdlckxhYmVsVmFsdWVFQ2xhc3MsIFRFU1RfSU5URUdFUl9MQUJFTF9WQUxVRV9fSSk7CisKKwkJdGVzdExhYmVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFU1RfTEFCRUwpOworCisJCXRlc3RTdGF0aWNFZGdlTGFiZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVTVF9TVEFUSUNfRURHRV9MQUJFTCk7CisKKwkJdGVzdFN0YXRpY05vZGVMYWJlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhURVNUX1NUQVRJQ19OT0RFX0xBQkVMKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOworCisJLyoqCisJICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKKwkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47CisJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgcGFja2FnZQorCQlzZXROYW1lKGVOQU1FKTsKKwkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7CisJCXNldE5zVVJJKGVOU19VUkkpOworCisJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKKwkJR3JhcGhQYWNrYWdlIHRoZUdyYXBoUGFja2FnZSA9IChHcmFwaFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoR3JhcGhQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCXRlc3REeW5hbWljRWRnZUxhYmVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUdyYXBoUGFja2FnZS5nZXREeW5hbWljRWRnZUxhYmVsKCkpOworCQl0ZXN0RHluYW1pY0xhYmVsMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVHcmFwaFBhY2thZ2UuZ2V0RHluYW1pY0xhYmVsKCkpOworCQl0ZXN0RHluYW1pY05vZGVMYWJlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVHcmFwaFBhY2thZ2UuZ2V0RHluYW1pY05vZGVMYWJlbCgpKTsKKwkJdGVzdEludGVnZXJMYWJlbFZhbHVlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUdyYXBoUGFja2FnZS5nZXRMYWJlbFZhbHVlKCkpOworCQl0ZXN0TGFiZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlR3JhcGhQYWNrYWdlLmdldExhYmVsKCkpOworCQl0ZXN0U3RhdGljRWRnZUxhYmVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUdyYXBoUGFja2FnZS5nZXRTdGF0aWNFZGdlTGFiZWwoKSk7CisJCXRlc3RTdGF0aWNOb2RlTGFiZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlR3JhcGhQYWNrYWdlLmdldFN0YXRpY05vZGVMYWJlbCgpKTsKKworCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycworCQlpbml0RUNsYXNzKHRlc3REeW5hbWljRWRnZUxhYmVsRUNsYXNzLCBUZXN0RHluYW1pY0VkZ2VMYWJlbC5jbGFzcywgIlRlc3REeW5hbWljRWRnZUxhYmVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJYWRkRU9wZXJhdGlvbih0ZXN0RHluYW1pY0VkZ2VMYWJlbEVDbGFzcywgbnVsbCwgImluY3JlbWVudCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHRlc3REeW5hbWljTGFiZWwxRUNsYXNzLCBUZXN0RHluYW1pY0xhYmVsMS5jbGFzcywgIlRlc3REeW5hbWljTGFiZWwxIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJYWRkRU9wZXJhdGlvbih0ZXN0RHluYW1pY0xhYmVsMUVDbGFzcywgbnVsbCwgImluY3JlbWVudCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHRlc3REeW5hbWljTm9kZUxhYmVsRUNsYXNzLCBUZXN0RHluYW1pY05vZGVMYWJlbC5jbGFzcywgIlRlc3REeW5hbWljTm9kZUxhYmVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJYWRkRU9wZXJhdGlvbih0ZXN0RHluYW1pY05vZGVMYWJlbEVDbGFzcywgbnVsbCwgImluY3JlbWVudCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHRlc3RJbnRlZ2VyTGFiZWxWYWx1ZUVDbGFzcywgVGVzdEludGVnZXJMYWJlbFZhbHVlLmNsYXNzLCAiVGVzdEludGVnZXJMYWJlbFZhbHVlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZV9JKCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJpIiwgbnVsbCwgMCwgMSwgVGVzdEludGVnZXJMYWJlbFZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJYWRkRU9wZXJhdGlvbih0ZXN0SW50ZWdlckxhYmVsVmFsdWVFQ2xhc3MsIG51bGwsICJpbmNyZW1lbnQiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisKKwkJaW5pdEVDbGFzcyh0ZXN0TGFiZWxFQ2xhc3MsIFRlc3RMYWJlbC5jbGFzcywgIlRlc3RMYWJlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCisJCWluaXRFQ2xhc3ModGVzdFN0YXRpY0VkZ2VMYWJlbEVDbGFzcywgVGVzdFN0YXRpY0VkZ2VMYWJlbC5jbGFzcywgIlRlc3RTdGF0aWNFZGdlTGFiZWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKworCQlpbml0RUNsYXNzKHRlc3RTdGF0aWNOb2RlTGFiZWxFQ2xhc3MsIFRlc3RTdGF0aWNOb2RlTGFiZWwuY2xhc3MsICJUZXN0U3RhdGljTm9kZUxhYmVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQ3JlYXRlIHJlc291cmNlCisJCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCX0KKworfSAvL0xhYmVsc1BhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvaW1wbC9UZXN0RHluYW1pY0VkZ2VMYWJlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9pbXBsL1Rlc3REeW5hbWljRWRnZUxhYmVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYzg2NjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvaW1wbC9UZXN0RHluYW1pY0VkZ2VMYWJlbEltcGwuamF2YQpAQCAtMCwwICsxLDYxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkR5bmFtaWNFZGdlTGFiZWxJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuTGFiZWxzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdEludGVnZXJMYWJlbFZhbHVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVzdCBEeW5hbWljIEVkZ2UgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RHluYW1pY0VkZ2VMYWJlbEltcGwgZXh0ZW5kcyBEeW5hbWljRWRnZUxhYmVsSW1wbCBpbXBsZW1lbnRzIFRlc3REeW5hbWljRWRnZUxhYmVsIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGVzdER5bmFtaWNFZGdlTGFiZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gTGFiZWxzUGFja2FnZS5MaXRlcmFscy5URVNUX0RZTkFNSUNfRURHRV9MQUJFTDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIGluY3JlbWVudCgpIHsKKwkJZmluYWwgVGVzdEludGVnZXJMYWJlbFZhbHVlIG5leHRMYWJlbFZhbHVlID0gKFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSkgZ2V0TmV4dFZhbHVlKCk7CisJCWZpbmFsIFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSBjdXJyZW50TGFiZWxWYWx1ZSA9IChUZXN0SW50ZWdlckxhYmVsVmFsdWUpIGdldEN1cnJlbnRWYWx1ZSgpOworCQluZXh0TGFiZWxWYWx1ZS5zZXRJKGN1cnJlbnRMYWJlbFZhbHVlLmdldEkoKSArIDEpOworCQlzZXROZXh0VmFsdWVWYWxpZCh0cnVlKTsKKwl9IC8vIGluY3JlbWVudAorCit9IC8vVGVzdER5bmFtaWNFZGdlTGFiZWxJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL2ltcGwvVGVzdER5bmFtaWNMYWJlbDFJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvaW1wbC9UZXN0RHluYW1pY0xhYmVsMUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2EwYTJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL2ltcGwvVGVzdER5bmFtaWNMYWJlbDFJbXBsLmphdmEKQEAgLTAsMCArMSw5MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5EeW5hbWljTGFiZWxJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLkxhYmVsc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0RHluYW1pY0xhYmVsMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RJbnRlZ2VyTGFiZWxWYWx1ZTsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXN0IER5bmFtaWMgTGFiZWwxPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVGVzdER5bmFtaWNMYWJlbDFJbXBsIGV4dGVuZHMgRHluYW1pY0xhYmVsSW1wbCBpbXBsZW1lbnRzCisJCVRlc3REeW5hbWljTGFiZWwxIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBUZXN0RHluYW1pY0xhYmVsMUltcGwoKSB7CisJCXN1cGVyKCk7CisJCWN1cnJlbnRWYWx1ZSA9IExhYmVsc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSgpOworCQluZXh0VmFsdWUgPSBMYWJlbHNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZXN0SW50ZWdlckxhYmVsVmFsdWUoKTsKKwl9IC8vIFRlc3REeW5hbWljTGFiZWwxSW1wbAorCisJCisJQE92ZXJyaWRlCisJcHVibGljIElkZW50aWZpYWJsZSBnZXRJZGVudGlmaWFibGUoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0SWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBuZXdJZGVudGlmaWFibGUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlRFU1RfRFlOQU1JQ19MQUJFTDE7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbmNyZW1lbnQoKSB7CisJCWZpbmFsIFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSBuZXh0TGFiZWxWYWx1ZSA9IChUZXN0SW50ZWdlckxhYmVsVmFsdWUpIGdldE5leHRWYWx1ZSgpOworCQlmaW5hbCBUZXN0SW50ZWdlckxhYmVsVmFsdWUgY3VycmVudExhYmVsVmFsdWUgPSAoVGVzdEludGVnZXJMYWJlbFZhbHVlKSBnZXRDdXJyZW50VmFsdWUoKTsKKwkJbmV4dExhYmVsVmFsdWUuc2V0SShjdXJyZW50TGFiZWxWYWx1ZS5nZXRJKCkrMSk7CisJCXNldE5leHRWYWx1ZVZhbGlkKHRydWUpOworCX0gLy8gaW5jcmVtZW50CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50ZXN0LmxhYmVscy5pbXBsLlRlc3RMYWJlbEltcGwjdG9TdHJpbmcoKQorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJDOiAiKTsKKwkJc2IuYXBwZW5kKGdldEN1cnJlbnRWYWx1ZSgpLnRvU3RyaW5nKCkpOworCQlzYi5hcHBlbmQoIiwgTjogIik7CisJCXNiLmFwcGVuZChnZXROZXh0VmFsdWUoKS50b1N0cmluZygpKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfSAvLyB0b1N0cmluZworCit9IC8vIFRlc3REeW5hbWljTGFiZWwxSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL2ltcGwvVGVzdER5bmFtaWNOb2RlTGFiZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvaW1wbC9UZXN0RHluYW1pY05vZGVMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDExZjMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL2ltcGwvVGVzdER5bmFtaWNOb2RlTGFiZWxJbXBsLmphdmEKQEAgLTAsMCArMSw1OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5EeW5hbWljTm9kZUxhYmVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLkxhYmVsc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0RHluYW1pY05vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RJbnRlZ2VyTGFiZWxWYWx1ZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVzdCBEeW5hbWljIE5vZGUgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RHluYW1pY05vZGVMYWJlbEltcGwgZXh0ZW5kcyBEeW5hbWljTm9kZUxhYmVsSW1wbCBpbXBsZW1lbnRzCisJCVRlc3REeW5hbWljTm9kZUxhYmVsIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRlc3REeW5hbWljTm9kZUxhYmVsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlRFU1RfRFlOQU1JQ19OT0RFX0xBQkVMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgaW5jcmVtZW50KCkgeworCQlmaW5hbCBUZXN0SW50ZWdlckxhYmVsVmFsdWUgbmV4dExhYmVsVmFsdWUgPSAoVGVzdEludGVnZXJMYWJlbFZhbHVlKSBnZXROZXh0VmFsdWUoKTsKKwkJZmluYWwgVGVzdEludGVnZXJMYWJlbFZhbHVlIGN1cnJlbnRMYWJlbFZhbHVlID0gKFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSkgZ2V0Q3VycmVudFZhbHVlKCk7CisJCW5leHRMYWJlbFZhbHVlLnNldEkoY3VycmVudExhYmVsVmFsdWUuZ2V0SSgpICsgMSk7CisJCXNldE5leHRWYWx1ZVZhbGlkKHRydWUpOworCX0gLy8gaW5jcmVtZW50CisKK30gLy8gVGVzdER5bmFtaWNOb2RlTGFiZWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvaW1wbC9UZXN0SW50ZWdlckxhYmVsVmFsdWVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvaW1wbC9UZXN0SW50ZWdlckxhYmVsVmFsdWVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYzMTZkZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9pbXBsL1Rlc3RJbnRlZ2VyTGFiZWxWYWx1ZUltcGwuamF2YQpAQCAtMCwwICsxLDE4NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxWYWx1ZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5MYWJlbHNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdEludGVnZXJMYWJlbFZhbHVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXN0IEludGVnZXIgTGFiZWwgVmFsdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbC5UZXN0SW50ZWdlckxhYmVsVmFsdWVJbXBsI2dldEkgPGVtPkk8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0SW50ZWdlckxhYmVsVmFsdWVJbXBsIGV4dGVuZHMgTGFiZWxWYWx1ZUltcGwgaW1wbGVtZW50cworCQlUZXN0SW50ZWdlckxhYmVsVmFsdWUgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJKCkgPGVtPkk8L2VtPn0nIGF0dHJpYnV0ZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAc2VlICNnZXRJKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJX0VERUZBVUxUID0gMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEkoKSA8ZW0+STwvZW0+fScgYXR0cmlidXRlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBzZWUgI2dldEkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBpbnQgaSA9IElfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gTGFiZWxzUGFja2FnZS5MaXRlcmFscy5URVNUX0lOVEVHRVJfTEFCRUxfVkFMVUU7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbFZhbHVlSW1wbCNyZXNldCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCXNldEkoSV9FREVGQVVMVCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0SSgpIHsKKwkJcmV0dXJuIGk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEkoaW50IG5ld0kpIHsKKwkJaW50IG9sZEkgPSBpOworCQlpID0gbmV3STsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTGFiZWxzUGFja2FnZS5URVNUX0lOVEVHRVJfTEFCRUxfVkFMVUVfX0ksIG9sZEksIGkpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIGluY3JlbWVudCgpIHsKKwkJaSsrOworCX0gLy8gaW5jcmVtZW50CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlciNzYW5lKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzYW5lKCkgeworCQlib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKKworCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmIGdldEkoKSA+PSAwOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBzYW5lCisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRFU1RfSU5URUdFUl9MQUJFTF9WQUxVRV9fSToKKwkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0SSgpKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5URVNUX0lOVEVHRVJfTEFCRUxfVkFMVUVfX0k6CisJCQkJc2V0SSgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRFU1RfSU5URUdFUl9MQUJFTF9WQUxVRV9fSToKKwkJCQlzZXRJKElfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5URVNUX0lOVEVHRVJfTEFCRUxfVkFMVUVfX0k6CisJCQkJcmV0dXJuIGkgIT0gSV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkKKwkJCXJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoSW50ZWdlci50b1N0cmluZyhnZXRJKCkpKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0gLy8gdG9TdHJpbmcKKworfSAvLyBUZXN0SW50ZWdlckxhYmVsVmFsdWVJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvaW1wbC9UZXN0TGFiZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvaW1wbC9UZXN0TGFiZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkZTg2YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9pbXBsL1Rlc3RMYWJlbEltcGwuamF2YQpAQCAtMCwwICsxLDcwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkxhYmVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLkxhYmVsc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5MYWJlbHNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdExhYmVsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXN0IExhYmVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVGVzdExhYmVsSW1wbCBleHRlbmRzIExhYmVsSW1wbCBpbXBsZW1lbnRzIFRlc3RMYWJlbCB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgVGVzdExhYmVsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwkJY3VycmVudFZhbHVlID0gTGFiZWxzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVzdEludGVnZXJMYWJlbFZhbHVlKCk7CisJfSAvLyBUZXN0TGFiZWxJbXBsCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSWRlbnRpZmlhYmxlIGdldElkZW50aWZpYWJsZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0SWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBuZXdJZGVudGlmaWFibGUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuVEVTVF9MQUJFTDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkxhYmVsSW1wbCN0b1N0cmluZygpCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0Q3VycmVudFZhbHVlKCkudG9TdHJpbmcoKSk7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0gLy8gdG9TdHJpbmcKKworCQorfSAvLyBUZXN0TGFiZWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvaW1wbC9UZXN0U3RhdGljRWRnZUxhYmVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL2ltcGwvVGVzdFN0YXRpY0VkZ2VMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWMzNWY5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL2ltcGwvVGVzdFN0YXRpY0VkZ2VMYWJlbEltcGwuamF2YQpAQCAtMCwwICsxLDQ4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLlN0YXRpY0VkZ2VMYWJlbEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5MYWJlbHNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdFN0YXRpY0VkZ2VMYWJlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlc3QgU3RhdGljIEVkZ2UgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U3RhdGljRWRnZUxhYmVsSW1wbCBleHRlbmRzIFN0YXRpY0VkZ2VMYWJlbEltcGwgaW1wbGVtZW50cyBUZXN0U3RhdGljRWRnZUxhYmVsIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGVzdFN0YXRpY0VkZ2VMYWJlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlRFU1RfU1RBVElDX0VER0VfTEFCRUw7CisJfQorCit9IC8vVGVzdFN0YXRpY0VkZ2VMYWJlbEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvaW1wbC9UZXN0U3RhdGljTm9kZUxhYmVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL2ltcGwvVGVzdFN0YXRpY05vZGVMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWU0M2M4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL2ltcGwvVGVzdFN0YXRpY05vZGVMYWJlbEltcGwuamF2YQpAQCAtMCwwICsxLDQ4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLlN0YXRpY05vZGVMYWJlbEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5MYWJlbHNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdFN0YXRpY05vZGVMYWJlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlc3QgU3RhdGljIE5vZGUgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U3RhdGljTm9kZUxhYmVsSW1wbCBleHRlbmRzIFN0YXRpY05vZGVMYWJlbEltcGwgaW1wbGVtZW50cyBUZXN0U3RhdGljTm9kZUxhYmVsIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGVzdFN0YXRpY05vZGVMYWJlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlRFU1RfU1RBVElDX05PREVfTEFCRUw7CisJfQorCit9IC8vVGVzdFN0YXRpY05vZGVMYWJlbEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJlc2VudGF0aW9uL0xhYmVsc0FjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJlc2VudGF0aW9uL0xhYmVsc0FjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5NTcwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9wcmVzZW50YXRpb24vTGFiZWxzQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpAQCAtMCwwICsxLDQzMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db250cm9sQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Mb2FkUmVzb3VyY2VBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlZhbGlkYXRlQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YkNvbnRyaWJ1dGlvbkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLnByb3ZpZGVyLlRlc3R1dGlsaXR5RWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZvciB0aGUgTGFiZWxzIG1vZGVsIGVkaXRvci4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIExhYmVsc0FjdGlvbkJhckNvbnRyaWJ1dG9yCisJZXh0ZW5kcyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IKKwlpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvclBhcnQ7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBhY3Rpb24gb3BlbnMgdGhlIFByb3BlcnRpZXMgdmlldy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUFjdGlvbiBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24gPQorCQluZXcgQWN0aW9uKFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtIikpIC8vJE5PTi1OTFMtMSQKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJdHJ5IHsKKwkJCQkJZ2V0UGFnZSgpLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyBhY3Rpb24gcmVmcmVzaGVzIHRoZSB2aWV3ZXIgb2YgdGhlIGN1cnJlbnQgZWRpdG9yIGlmIHRoZSBlZGl0b3IKKwkgKiBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQWN0aW9uIHJlZnJlc2hWaWV3ZXJBY3Rpb24gPQorCQluZXcgQWN0aW9uKFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbSIpKSAvLyROT04tTkxTLTEkCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworCQkJCXJldHVybiBhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlpZiAoYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgeworCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpYWN0aXZlRWRpdG9yUGFydCkuZ2V0Vmlld2VyKCk7CisJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgeworCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcgorCSAqIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZUNoaWxkQWN0aW9uczsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCBmb3IgQ3JlYXRlQ2hpbGQgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcgorCSAqIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZVNpYmxpbmdBY3Rpb25zOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVTaWJsaW5nIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvbnRyaWJ1dG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMYWJlbHNBY3Rpb25CYXJDb250cmlidXRvcigpIHsKKwkJc3VwZXIoQURESVRJT05TX0xBU1RfU1RZTEUpOworCQlsb2FkUmVzb3VyY2VBY3Rpb24gPSBuZXcgTG9hZFJlc291cmNlQWN0aW9uKCk7CisJCXZhbGlkYXRlQWN0aW9uID0gbmV3IFZhbGlkYXRlQWN0aW9uKCk7CisJCWNvbnRyb2xBY3Rpb24gPSBuZXcgQ29udHJvbEFjdGlvbigpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBTZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zIHRvIHRoZSB0b29sIGJhci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgeworCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigibGFiZWxzLXNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJsYWJlbHMtYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHRvIHRoZSBtZW51IGJhciBhIG1lbnUgYW5kIHNvbWUgc2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucywKKwkgKiBhcyB3ZWxsIGFzIHRoZSBzdWItbWVudXMgZm9yIG9iamVjdCBjcmVhdGlvbiBpdGVtcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQlzdXBlci5jb250cmlidXRlVG9NZW51KG1lbnVNYW5hZ2VyKTsKKworCQlJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0xhYmVsc0VkaXRvcl9tZW51IiksICJvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzTWVudUlEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlQ2hpbGQgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgorCQkvLworCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIFByZXBhcmUgZm9yIENyZWF0ZVNpYmxpbmcgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgorCQkvLworCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEZvcmNlIGFuIHVwZGF0ZSBiZWNhdXNlIEVjbGlwc2UgaGlkZXMgZW1wdHkgbWVudXMgbm93LgorCQkvLworCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIKKwkJCShuZXcgSU1lbnVMaXN0ZW5lcigpIHsKKwkJCQkgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQkJCQkgbWVudU1hbmFnZXIudXBkYXRlQWxsKHRydWUpOworCQkJCSB9CisJCQkgfSk7CisKKwkJYWRkR2xvYmFsQWN0aW9ucyhzdWJtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogV2hlbiB0aGUgYWN0aXZlIGVkaXRvciBjaGFuZ2VzLCB0aGlzIHJlbWVtYmVycyB0aGUgY2hhbmdlIGFuZCByZWdpc3RlcnMgd2l0aCBpdCBhcyBhIHNlbGVjdGlvbiBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkgeworCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IocGFydCk7CisJCWFjdGl2ZUVkaXRvclBhcnQgPSBwYXJ0OworCisJCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KKwkJLy8KKwkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKwkJfQorCQlpZiAocGFydCA9PSBudWxsKSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7CisJCX0KKwkJZWxzZSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7CisJCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisKKwkJCS8vIEZha2UgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCB0byB1cGRhdGUgdGhlIG1lbnVzLgorCQkJLy8KKwkJCWlmIChzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSAhPSBudWxsKSB7CisJCQkJc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNlbGVjdGlvblByb3ZpZGVyLCBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LAorCSAqIGhhbmRsaW5nIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH1zIGJ5IHF1ZXJ5aW5nIGZvciB0aGUgY2hpbGRyZW4gYW5kIHNpYmxpbmdzCisJICogdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGVkIG9iamVjdCBhbmQgdXBkYXRpbmcgdGhlIG1lbnVzIGFjY29yZGluZ2x5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCS8vIFJlbW92ZSBhbnkgbWVudSBpdGVtcyBmb3Igb2xkIHNlbGVjdGlvbi4KKwkJLy8KKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMpOworCQl9CisKKwkJLy8gUXVlcnkgdGhlIG5ldyBzZWxlY3Rpb24gZm9yIGFwcHJvcHJpYXRlIG5ldyBjaGlsZC9zaWJsaW5nIGRlc2NyaXB0b3JzCisJCS8vCisJCUNvbGxlY3Rpb248Pz4gbmV3Q2hpbGREZXNjcmlwdG9ycyA9IG51bGw7CisJCUNvbGxlY3Rpb248Pz4gbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gbnVsbDsKKworCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOworCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnNpemUoKSA9PSAxKSB7CisJCQlPYmplY3Qgb2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOworCisJCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7CisKKwkJCW5ld0NoaWxkRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhvYmplY3QsIG51bGwpOworCQkJbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobnVsbCwgb2JqZWN0KTsKKwkJfQorCisJCS8vIEdlbmVyYXRlIGFjdGlvbnMgZm9yIHNlbGVjdGlvbjsgcG9wdWxhdGUgYW5kIHJlZHJhdyB0aGUgbWVudXMuCisJCS8vCisJCWNyZWF0ZUNoaWxkQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKG5ld0NoaWxkRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7CisJCWNyZWF0ZVNpYmxpbmdBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhuZXdTaWJsaW5nRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7CisKKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7CisJCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKKwkJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7CisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7CisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlQ2hpbGRBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCisJLyoqCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgeworCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVTaWJsaW5nQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwgZGVzY3JpcHRvcikpOworCQkJfQorCQl9CisJCXJldHVybiBhY3Rpb25zOworCX0KKworCS8qKgorCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gd2l0aCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cworCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sCisJICogYnkgaW5zZXJ0aW5nIHRoZW0gYmVmb3JlIHRoZSBzcGVjaWZpZWQgY29udHJpYnV0aW9uIGl0ZW0gPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+LgorCSAqIElmIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgc2ltcGx5IGFkZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zLCBTdHJpbmcgY29udHJpYnV0aW9uSUQpIHsKKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChJQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMpIHsKKwkJCQlpZiAoY29udHJpYnV0aW9uSUQgIT0gbnVsbCkgeworCQkJCQltYW5hZ2VyLmluc2VydEJlZm9yZShjb250cmlidXRpb25JRCwgYWN0aW9uKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCW1hbmFnZXIuYWRkKGFjdGlvbik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQkKKwkvKioKKwkgKiBUaGlzIHJlbW92ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cworCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucykgeworCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7CisJCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgeworCQkJCS8vIExvb2sgaW50byBTdWJDb250cmlidXRpb25JdGVtcworCQkJCS8vCisJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uSXRlbSA9IGl0ZW1zW2ldOworCQkJCXdoaWxlIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCQljb250cmlidXRpb25JdGVtID0gKChTdWJDb250cmlidXRpb25JdGVtKWNvbnRyaWJ1dGlvbkl0ZW0pLmdldElubmVySXRlbSgpOworCQkJCX0KKworCQkJCS8vIERlbGV0ZSB0aGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbXMgd2l0aCBtYXRjaGluZyBhY3Rpb24uCisJCQkJLy8KKwkJCQlpZiAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKKwkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0QWN0aW9uKCk7CisJCQkJCWlmIChhY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsKKwkJCQkJCW1hbmFnZXIucmVtb3ZlKGNvbnRyaWJ1dGlvbkl0ZW0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHBvcC11cCBtZW51IGJlZm9yZSBpdCBhcHBlYXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKKwkJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBudWxsOworCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOworCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7CisJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZWRpdCIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgaW5zZXJ0cyBnbG9iYWwgYWN0aW9ucyBiZWZvcmUgdGhlICJhZGRpdGlvbnMtZW5kIiBzZXBhcmF0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucy1lbmQiLCBuZXcgU2VwYXJhdG9yKCJ1aS1hY3Rpb25zIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24pOyAvLyROT04tTkxTLTEkCisKKwkJcmVmcmVzaFZpZXdlckFjdGlvbi5zZXRFbmFibGVkKHJlZnJlc2hWaWV3ZXJBY3Rpb24uaXNFbmFibGVkKCkpOwkJCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgcmVmcmVzaFZpZXdlckFjdGlvbik7IC8vJE5PTi1OTFMtMSQKKworCQlzdXBlci5hZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGVuc3VyZXMgdGhhdCBhIGRlbGV0ZSBhY3Rpb24gd2lsbCBjbGVhbiB1cCBhbGwgcmVmZXJlbmNlcyB0byBkZWxldGVkIG9iamVjdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlQWxsUmVmZXJlbmNlc09uRGVsZXRlKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9wcmVzZW50YXRpb24vTGFiZWxzRWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJlc2VudGF0aW9uL0xhYmVsc0VkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZGY2NjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJlc2VudGF0aW9uL0xhYmVsc0VkaXRvci5qYXZhCkBAIC0wLDAgKzEsMTUwNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLmVkaXRvci5Qcm9ibGVtRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVmFsaWRhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuY2VsbGVkaXRvci5BZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuTG9jYWxUcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuVmlld2VyRHJhZ0FkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLlVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSU1hcmtlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudmlldy5FeHRlbmRlZFByb3BlcnR5U2hlZXRQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXIuTW9kaWZpZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJvdmlkZXIuU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLnByb3ZpZGVyLlNlcXVlbmNlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLnByb3ZpZGVyLkRlY29yYXRvcnNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5wcm92aWRlci5UZXN0dXRpbGl0eUVkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5wcm92aWRlci5MYWJlbHNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TYXZlQXNEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKKworCisvKioKKyAqIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIExhYmVscyBtb2RlbCBlZGl0b3IuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBMYWJlbHNFZGl0b3IKKwlleHRlbmRzIE11bHRpUGFnZUVkaXRvclBhcnQKKwlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluUHJvdmlkZXIsIElTZWxlY3Rpb25Qcm92aWRlciwgSU1lbnVMaXN0ZW5lciwgSVZpZXdlclByb3ZpZGVyLCBJR290b01hcmtlciB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgZWRpdGluZyBkb21haW4gdGhhdCBpcyB1c2VkIHRvIHRyYWNrIGFsbCBjaGFuZ2VzIHRvIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBvbmUgYWRhcHRlciBmYWN0b3J5IHVzZWQgZm9yIHByb3ZpZGluZyB2aWV3cyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNvbnRlbnRPdXRsaW5lUGFnZSBjb250ZW50T3V0bGluZVBhZ2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIGEga2x1ZGdlLi4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBjb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UncyB2aWV3ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgY29udGVudE91dGxpbmVWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBwcm9wZXJ0eSBzaGVldCBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQcm9wZXJ0eVNoZWV0UGFnZSBwcm9wZXJ0eVNoZWV0UGFnZTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHZpZXdlciB0aGF0IHNoYWRvd3MgdGhlIHNlbGVjdGlvbiBpbiB0aGUgY29udGVudCBvdXRsaW5lLgorCSAqIFRoZSBwYXJlbnQgcmVsYXRpb24gbXVzdCBiZSBjb3JyZWN0bHkgZGVmaW5lZCBmb3IgdGhpcyB0byB3b3JrLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmVlVmlld2VyIHNlbGVjdGlvblZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBjb250ZW50IHZpZXdlciwgd2hpY2ggbWF5IGJlIGVpdGhlciBvbmUgb2YgdGhlIHZpZXdlcnMgaW4gdGhlIHBhZ2VzIG9yIHRoZSBjb250ZW50IG91dGxpbmUgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBWaWV3ZXIgY3VycmVudFZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyB0byB3aGljaCBldmVyIHZpZXdlciBpcyBhY3RpdmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9cyB0aGF0IGFyZSBsaXN0ZW5pbmcgdG8gdGhpcyBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZWRpdG9yIGFzIGEgd2hvbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb24gZWRpdG9yU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKKworCS8qKgorCSAqIFRoZSBNYXJrZXJIZWxwZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHdvcmtzcGFjZSByZXNvdXJjZSBtYXJrZXJzIHByZXNlbnRlZAorCSAqIGluIEVjbGlwc2UncyBQcm9ibGVtcyBWaWV3LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXJrZXJIZWxwZXIgbWFya2VySGVscGVyID0gbmV3IEVkaXRVSU1hcmtlckhlbHBlcigpOworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIGZvciB3aGVuIHRoZSBvdXRsaW5lIGJlY29tZXMgYWN0aXZlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyID0KKwkJbmV3IElQYXJ0TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQlpZiAocCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSB7CisJCQkJCWlmICgoKENvbnRlbnRPdXRsaW5lKXApLmdldEN1cnJlbnRQYWdlKCkgPT0gY29udGVudE91dGxpbmVQYWdlKSB7CisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihMYWJlbHNFZGl0b3IudGhpcyk7CisKKwkJCQkJCXNldEN1cnJlbnRWaWV3ZXIoY29udGVudE91dGxpbmVWaWV3ZXIpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHAgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSB7CisJCQkJCWlmICgoKFByb3BlcnR5U2hlZXQpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBwcm9wZXJ0eVNoZWV0UGFnZSkgeworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoTGFiZWxzRWRpdG9yLnRoaXMpOworCQkJCQkJaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChwID09IExhYmVsc0VkaXRvci50aGlzKSB7CisJCQkJCWhhbmRsZUFjdGl2YXRlKCk7CisJCQkJfQorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCX07CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBzYXZlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gc2F2ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogTWFwIHRvIHN0b3JlIHRoZSBkaWFnbm9zdGljIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+IHJlc291cmNlVG9EaWFnbm9zdGljTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+KCk7CisKKwkvKioKKwkgKiBDb250cm9scyB3aGV0aGVyIHRoZSBwcm9ibGVtIGluZGljYXRpb24gc2hvdWxkIGJlIHVwZGF0ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOworCisJLyoqCisJICogQWRhcHRlciB1c2VkIHRvIHVwZGF0ZSB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHdoZW4gcmVzb3VyY2VzIGFyZSBkZW1hbmRlZCBsb2FkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEVDb250ZW50QWRhcHRlciBwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIgPSAKKwkJbmV3IEVDb250ZW50QWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKKwkJCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJlc291cmNlLmNsYXNzKSkgeworCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEOgorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fRVJST1JTOgorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fV0FSTklOR1M6IHsKKwkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKKwkJCQkJCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgbnVsbCk7CisJCQkJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgZGlhZ25vc3RpYyk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5yZW1vdmUocmVzb3VyY2UpOworCQkJCQkJCX0KKworCQkJCQkJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgeworCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQkJCQkJCQkJCSB9CisJCQkJCQkJCQkgfSk7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCQkJfQorCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsKKwkJCQliYXNpY1NldFRhcmdldCh0YXJnZXQpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHVuc2V0VGFyZ2V0KFJlc291cmNlIHRhcmdldCkgeworCQkJCWJhc2ljVW5zZXRUYXJnZXQodGFyZ2V0KTsKKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyBmb3Igd29ya3NwYWNlIGNoYW5nZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPQorCQluZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7CisJCQkJdHJ5IHsKKwkJCQkJY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgeworCQkJCQkJcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpOworCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworCQkJCQkJCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgeworCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgfHwKKwkJCQkJCQkJICAgIGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIGRlbHRhLmdldEZsYWdzKCkgIT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUykgeworCQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShVUkkuY3JlYXRlVVJJKGRlbHRhLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSksIGZhbHNlKTsKKwkJCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisJCQkJCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7CisJCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJZWxzZSBpZiAoIXNhdmVkUmVzb3VyY2VzLnJlbW92ZShyZXNvdXJjZSkpIHsKKwkJCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJfQorCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsKKwkJCQkJCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlczsKKwkJCQkJCX0KKworCQkJCQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlbW92ZWRSZXNvdXJjZXMoKSB7CisJCQkJCQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpdG9yKCk7CisJCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKKworCQkJCQlpZiAoIXZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkJcmVtb3ZlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkpOworCQkJCQkJaWYgKCFpc0RpcnR5KCkpIHsKKwkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJCSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKExhYmVsc0VkaXRvci50aGlzLCBmYWxzZSk7CisJCQkJCQkJCQkgfQorCQkJCQkJCQkgfSk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlpZiAoIXZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOworCQkJCQkJaWYgKGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gTGFiZWxzRWRpdG9yLnRoaXMpIHsKKwkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJCSBoYW5kbGVBY3RpdmF0ZSgpOworCQkJCQkJCQkJIH0KKwkJCQkJCQkJIH0pOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogSGFuZGxlcyBhY3RpdmF0aW9uIG9mIHRoZSBlZGl0b3Igb3IgaXQncyBhc3NvY2lhdGVkIHZpZXdzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFjdGl2YXRlKCkgeworCQkvLyBSZWNvbXB1dGUgdGhlIHJlYWQgb25seSBzdGF0ZS4KKwkJLy8KKwkJaWYgKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkgIT0gbnVsbCkgeworCQkgIGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkuY2xlYXIoKTsKKworCQkgIC8vIFJlZnJlc2ggYW55IGFjdGlvbnMgdGhhdCBtYXkgYmVjb21lIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisJCSAgLy8KKwkJICBzZXRTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpOworCQl9CisKKwkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgeworCQkJaWYgKGhhbmRsZURpcnR5Q29uZmxpY3QoKSkgeworCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoTGFiZWxzRWRpdG9yLnRoaXMsIGZhbHNlKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCWNoYW5nZWRSZXNvdXJjZXMucmVtb3ZlQWxsKHNhdmVkUmVzb3VyY2VzKTsKKwkJCWhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKTsKKwkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBIYW5kbGVzIHdoYXQgdG8gZG8gd2l0aCBjaGFuZ2VkIHJlc291cmNlcyBvbiBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKSB7CisJCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkgJiYgKCFpc0RpcnR5KCkgfHwgaGFuZGxlRGlydHlDb25mbGljdCgpKSkgeworCQkJaWYgKGlzRGlydHkoKSkgeworCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSk7CisJCQl9CisJCQllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7CisKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgeworCQkJCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKSB7CisJCQkJCXJlc291cmNlLnVubG9hZCgpOworCQkJCQl0cnkgeworCQkJCQkJcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOworCQkJCQl9CisJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCWlmICghcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAuY29udGFpbnNLZXkocmVzb3VyY2UpKSB7CisJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4uaXNTdGFsZShlZGl0b3JTZWxlY3Rpb24pKSB7CisJCQkJc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOworCQkJfQorCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQl9CisJfQorICAKKwkvKioKKwkgKiBVcGRhdGVzIHRoZSBwcm9ibGVtcyBpbmRpY2F0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWVkIGRpYWdub3N0aWMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKSB7CisJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgeworCQkJQmFzaWNEaWFnbm9zdGljIGRpYWdub3N0aWMgPQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMKKwkJCQkJKERpYWdub3N0aWMuT0ssCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkgMCwKKwkJCQkJIG51bGwsCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpIH0pOworCQkJZm9yIChEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA6IHJlc291cmNlVG9EaWFnbm9zdGljTWFwLnZhbHVlcygpKSB7CisJCQkJaWYgKGNoaWxkRGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJZGlhZ25vc3RpYy5hZGQoY2hpbGREaWFnbm9zdGljKTsKKwkJCQl9CisJCQl9CisKKwkJCWludCBsYXN0RWRpdG9yUGFnZSA9IGdldFBhZ2VDb3VudCgpIC0gMTsKKwkJCWlmIChsYXN0RWRpdG9yUGFnZSA+PSAwICYmIGdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkgaW5zdGFuY2VvZiBQcm9ibGVtRWRpdG9yUGFydCkgeworCQkJCSgoUHJvYmxlbUVkaXRvclBhcnQpZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSkuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQlQcm9ibGVtRWRpdG9yUGFydCBwcm9ibGVtRWRpdG9yUGFydCA9IG5ldyBQcm9ibGVtRWRpdG9yUGFydCgpOworCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7CisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0TWFya2VySGVscGVyKG1hcmtlckhlbHBlcik7CisJCQkJdHJ5IHsKKwkJCQkJYWRkUGFnZSgrK2xhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydCwgZ2V0RWRpdG9ySW5wdXQoKSk7CisJCQkJCXNldFBhZ2VUZXh0KGxhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydC5nZXRQYXJ0TmFtZSgpKTsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJCXNob3dUYWJzKCk7CisJCQkJfQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKworCQkJaWYgKG1hcmtlckhlbHBlci5oYXNNYXJrZXJzKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSkpIHsKKwkJCQltYXJrZXJIZWxwZXIuZGVsZXRlTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQl0cnkgeworCQkJCQkJbWFya2VySGVscGVyLmNyZWF0ZU1hcmtlcnMoZGlhZ25vc3RpYyk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQlUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBTaG93cyBhIGRpYWxvZyB0aGF0IGFza3MgaWYgY29uZmxpY3RpbmcgY2hhbmdlcyBzaG91bGQgYmUgZGlzY2FyZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZURpcnR5Q29uZmxpY3QoKSB7CisJCXJldHVybgorCQkJTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24KKwkJCQkoZ2V0U2l0ZSgpLmdldFNoZWxsKCksCisJCQkJIGdldFN0cmluZygiX1VJX0ZpbGVDb25mbGljdF9sYWJlbCIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1dBUk5fRmlsZUNvbmZsaWN0IikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGEgbW9kZWwgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMYWJlbHNFZGl0b3IoKSB7CisJCXN1cGVyKCk7CisJCWluaXRpYWxpemVFZGl0aW5nRG9tYWluKCk7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHVwIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1vZGVsIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWRpdGluZ0RvbWFpbigpIHsKKwkJLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlpZWxkcyBpdGVtIHByb3ZpZGVycy4KKwkJLy8KKwkJYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOworCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRGVjb3JhdG9yc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTGFiZWxzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBHcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTW9kaWZpZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlIGV4ZWN1dGVkLgorCQkvLworCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKKworCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLgorCQkvLworCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIKKwkJCShuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7CisJCQkJIHB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsKKwkJCQkJIGdldENvbnRhaW5lcigpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCSAobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCSAgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkgIGZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKKworCQkJCQkJCQkgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuCisJCQkJCQkJCSAgLy8KKwkJCQkJCQkJICBDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spZXZlbnQuZ2V0U291cmNlKCkpLmdldE1vc3RSZWNlbnRDb21tYW5kKCk7CisJCQkJCQkJCSAgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKKwkJCQkJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOworCQkJCQkJCQkgIH0KKwkJCQkJCQkJICBpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCAmJiAhcHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgeworCQkJCQkJCQkJICBwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7CisJCQkJCQkJCSAgfQorCQkJCQkJCSAgfQorCQkJCQkJICB9KTsKKwkJCQkgfQorCQkJIH0pOworCisJCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KKwkJLy8KKwkJZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywgbmV3IEhhc2hNYXA8UmVzb3VyY2UsIEJvb2xlYW4+KCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgaGVyZSBmb3IgdGhlIGxpc3RlbmVyIHRvIGJlIGFibGUgdG8gY2FsbCBpdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoaW50IGFjdGlvbikgeworCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UoYWN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdGhlIHNlbGVjdGlvbiBpbnRvIHdoaWNoZXZlciB2aWV3ZXIgaXMgYWN0aXZlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgeworCQlmaW5hbCBDb2xsZWN0aW9uPD8+IHRoZVNlbGVjdGlvbiA9IGNvbGxlY3Rpb247CisJCS8vIE1ha2Ugc3VyZSBpdCdzIG9rYXkuCisJCS8vCisJCWlmICh0aGVTZWxlY3Rpb24gIT0gbnVsbCAmJiAhdGhlU2VsZWN0aW9uLmlzRW1wdHkoKSkgeworCQkJLy8gSSBkb24ndCBrbm93IGlmIHRoaXMgc2hvdWxkIGJlIHJ1biB0aGlzIGRlZmVycmVkCisJCQkvLyBiZWNhdXNlIHdlIG1pZ2h0IGhhdmUgdG8gZ2l2ZSB0aGUgZWRpdG9yIGEgY2hhbmNlIHRvIHByb2Nlc3MgdGhlIHZpZXdlciB1cGRhdGUgZXZlbnRzCisJCQkvLyBhbmQgaGVuY2UgdG8gdXBkYXRlIHRoZSB2aWV3cyBmaXJzdC4KKwkJCS8vCisJCQkvLworCQkJUnVubmFibGUgcnVubmFibGUgPQorCQkJCW5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgY29udGVudCB2aWV3ZXIgb2YgdGhlIGVkaXRvci4KKwkJCQkJCS8vCisJCQkJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7CisJCQkJCQkJY3VycmVudFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhlU2VsZWN0aW9uLnRvQXJyYXkoKSksIHRydWUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfTsKKwkJCXJ1bm5hYmxlLnJ1bigpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBlZGl0aW5nIGRvbWFpbiBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElFZGl0aW5nRG9tYWluUHJvdmlkZXJ9IGludGVyZmFjZS4KKwkgKiBUaGlzIGlzIGltcG9ydGFudCBmb3IgaW1wbGVtZW50aW5nIHRoZSBzdGF0aWMgbWV0aG9kcyBvZiB7QGxpbmsgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWlufQorCSAqIGFuZCBmb3Igc3VwcG9ydGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb259LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7CisJCXJldHVybiBlZGl0aW5nRG9tYWluOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBjbGFzcyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciB7CisJCXB1YmxpYyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0IFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIHBhcmVudCAhPSBudWxsOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBtYWtlcyBzdXJlIHRoYXQgb25lIGNvbnRlbnQgdmlld2VyLCBlaXRoZXIgZm9yIHRoZSBjdXJyZW50IHBhZ2Ugb3IgdGhlIG91dGxpbmUgdmlldywgaWYgaXQgaGFzIGZvY3VzLAorCSAqIGlzIHRoZSBjdXJyZW50IG9uZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vmlld2VyKFZpZXdlciB2aWV3ZXIpIHsKKwkJLy8gSWYgaXQgaXMgY2hhbmdpbmcuLi4KKwkJLy8KKwkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gdmlld2VyKSB7CisJCQlpZiAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsKKwkJCQkvLyBDcmVhdGUgdGhlIGxpc3RlbmVyIG9uIGRlbWFuZC4KKwkJCQkvLworCQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9CisJCQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJCQkJLy8gVGhpcyBqdXN0IG5vdGlmaWVzIHRob3NlIHRoaW5ncyB0aGF0IGFyZSBhZmZlY3RlZCBieSB0aGUgc2VjdGlvbi4KKwkJCQkJCS8vCisJCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBzZWxlY3Rpb25DaGFuZ2VkRXZlbnQpIHsKKwkJCQkJCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCX0KKworCQkJLy8gU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG9sZCBvbmUuCisJCQkvLworCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgeworCQkJCWN1cnJlbnRWaWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7CisJCQl9CisKKwkJCS8vIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmV3IG9uZS4KKwkJCS8vCisJCQlpZiAodmlld2VyICE9IG51bGwpIHsKKwkJCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7CisJCQl9CisKKwkJCS8vIFJlbWVtYmVyIGl0LgorCQkJLy8KKwkJCWN1cnJlbnRWaWV3ZXIgPSB2aWV3ZXI7CisKKwkJCS8vIFNldCB0aGUgZWRpdG9ycyBzZWxlY3Rpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgdmlld2VyJ3Mgc2VsZWN0aW9uLgorCQkJLy8KKwkJCXNldFNlbGVjdGlvbihjdXJyZW50Vmlld2VyID09IG51bGwgPyBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZIDogY3VycmVudFZpZXdlci5nZXRTZWxlY3Rpb24oKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHZpZXdlciBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElWaWV3ZXJQcm92aWRlcn0gaW50ZXJmYWNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgeworCQlyZXR1cm4gY3VycmVudFZpZXdlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIgYW5kIGFkZHMgYSBsaXN0ZW5lciBhcyB3ZWxsIHJlZ2lzdGVyaW5nIHRoZSBtZW51IGZvciBleHRlbnNpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKKwkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOworCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7CisJCU1lbnUgbWVudT0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7CisJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKKwkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUsIG5ldyBVbndyYXBwaW5nU2VsZWN0aW9uUHJvdmlkZXIodmlld2VyKSk7CisKKwkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTks7CisJCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKKwkJdmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyYWdBZGFwdGVyKHZpZXdlcikpOworCQl2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyKGVkaXRpbmdEb21haW4sIHZpZXdlcikpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCBjYWxsZWQgdG8gbG9hZCBhIHJlc291cmNlIGludG8gdGhlIGVkaXRpbmcgZG9tYWluJ3MgcmVzb3VyY2Ugc2V0IGJhc2VkIG9uIHRoZSBlZGl0b3IncyBpbnB1dC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVNb2RlbCgpIHsKKwkJVVJJIHJlc291cmNlVVJJID0gRWRpdFVJVXRpbC5nZXRVUkkoZ2V0RWRpdG9ySW5wdXQoKSk7CisJCUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7CisJCXRyeSB7CisJCQkvLyBMb2FkIHRoZSByZXNvdXJjZSB0aHJvdWdoIHRoZSBlZGl0aW5nIGRvbWFpbi4KKwkJCS8vCisJCQlyZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgdHJ1ZSk7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlleGNlcHRpb24gPSBlOworCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIGZhbHNlKTsKKwkJfQorCisJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pOworCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJfQorCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkuYWRkKHByb2JsZW1JbmRpY2F0aW9uQWRhcHRlcik7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIGRpYWdub3N0aWMgZGVzY3JpYmluZyB0aGUgZXJyb3JzIGFuZCB3YXJuaW5ncyBsaXN0ZWQgaW4gdGhlIHJlc291cmNlCisJICogYW5kIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIChpZiBhbnkpLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEaWFnbm9zdGljIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKFJlc291cmNlIHJlc291cmNlLCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCWlmICghcmVzb3VyY2UuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpIHx8ICFyZXNvdXJjZS5nZXRXYXJuaW5ncygpLmlzRW1wdHkoKSkgeworCQkJQmFzaWNEaWFnbm9zdGljIGJhc2ljRGlhZ25vc3RpYyA9CisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZXhjZXB0aW9uID09IG51bGwgPyAoT2JqZWN0KXJlc291cmNlIDogZXhjZXB0aW9uIH0pOworCQkJYmFzaWNEaWFnbm9zdGljLm1lcmdlKEVjb3JlVXRpbC5jb21wdXRlRGlhZ25vc3RpYyhyZXNvdXJjZSwgdHJ1ZSkpOworCQkJcmV0dXJuIGJhc2ljRGlhZ25vc3RpYzsKKwkJfQorCQllbHNlIGlmIChleGNlcHRpb24gIT0gbnVsbCkgeworCQkJcmV0dXJuCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCSBuZXcgT2JqZWN0W10geyBleGNlcHRpb24gfSk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gRGlhZ25vc3RpYy5PS19JTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gaW5zdGFsbCB5b3VyIG93biBjb250cm9scy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlcygpIHsKKwkJLy8gQ3JlYXRlcyB0aGUgbW9kZWwgZnJvbSB0aGUgZWRpdG9yIGlucHV0CisJCS8vCisJCWNyZWF0ZU1vZGVsKCk7CisKKwkJLy8gT25seSBjcmVhdGVzIHRoZSBvdGhlciBwYWdlcyBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhhdCBjYW4gYmUgZWRpdGVkCisJCS8vCisJCWlmICghZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgc2VsZWN0aW9uIHRyZWUgdmlldy4KKwkJCS8vCisJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShnZXRDb250YWluZXIoKSwgU1dULk1VTFRJKTsKKwkJCXNlbGVjdGlvblZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOworCQkJc2V0Q3VycmVudFZpZXdlcihzZWxlY3Rpb25WaWV3ZXIpOworCisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKworCQkJbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcihzZWxlY3Rpb25WaWV3ZXIuZ2V0VHJlZSgpLCBhZGFwdGVyRmFjdG9yeSk7CisKKwkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHNlbGVjdGlvblZpZXdlcik7CisJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh0cmVlKTsKKwkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCSBzZXRBY3RpdmVQYWdlKDApOworCQkJCQkgfQorCQkJCSB9KTsKKwkJfQorCisJCS8vIEVuc3VyZXMgdGhhdCB0aGlzIGVkaXRvciB3aWxsIG9ubHkgZGlzcGxheSB0aGUgcGFnZSdzIHRhYgorCQkvLyBhcmVhIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHBhZ2UKKwkJLy8KKwkJZ2V0Q29udGFpbmVyKCkuYWRkQ29udHJvbExpc3RlbmVyCisJCQkobmV3IENvbnRyb2xBZGFwdGVyKCkgeworCQkJCWJvb2xlYW4gZ3VhcmQgPSBmYWxzZTsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsKKwkJCQkJaWYgKCFndWFyZCkgeworCQkJCQkJZ3VhcmQgPSB0cnVlOworCQkJCQkJaGlkZVRhYnMoKTsKKwkJCQkJCWd1YXJkID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkgfSk7CisKKwkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkgfQorCQkJIH0pOworCX0KKworCS8qKgorCSAqIElmIHRoZXJlIGlzIGp1c3Qgb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsCisJICogdGhpcyBoaWRlcyB0aGUgc2luZ2xlIHRhYiBhdCB0aGUgYm90dG9tLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhpZGVUYWJzKCkgeworCQlpZiAoZ2V0UGFnZUNvdW50KCkgPD0gMSkgeworCQkJc2V0UGFnZVRleHQoMCwgIiIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7CisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoMSk7CisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7CisJCQkJZ2V0Q29udGFpbmVyKCkuc2V0U2l6ZShwb2ludC54LCBwb2ludC55ICsgNik7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsCisJICogdGhpcyBzaG93cyB0aGUgdGFicyBhdCB0aGUgYm90dG9tLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNob3dUYWJzKCkgeworCQlpZiAoZ2V0UGFnZUNvdW50KCkgPiAxKSB7CisJCQlzZXRQYWdlVGV4dCgwLCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7CisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoU1dULkRFRkFVTFQpOworCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOworCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSAtIDYpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIHRyYWNrIHRoZSBhY3RpdmUgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IHBhZ2VJbmRleCkgeworCQlzdXBlci5wYWdlQ2hhbmdlKHBhZ2VJbmRleCk7CisKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7CisJCQloYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihjb250ZW50T3V0bGluZVBhZ2UuZ2V0U2VsZWN0aW9uKCkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBob3cgdGhlIGZyYW1ld29yayBkZXRlcm1pbmVzIHdoaWNoIGludGVyZmFjZXMgd2UgaW1wbGVtZW50LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7CisJCWlmIChrZXkuZXF1YWxzKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gc2hvd091dGxpbmVWaWV3KCkgPyBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSA6IG51bGw7CisJCX0KKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gZ2V0UHJvcGVydHlTaGVldFBhZ2UoKTsKKwkJfQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IG91dGxpbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQ29udGVudE91dGxpbmVQYWdlIGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIHsKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSA9PSBudWxsKSB7CisJCQkvLyBUaGUgY29udGVudCBvdXRsaW5lIGlzIGp1c3QgYSB0cmVlLgorCQkJLy8KKwkJCWNsYXNzIE15Q29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgQ29udGVudE91dGxpbmVQYWdlIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCQkJCS8vIFNldCB1cCB0aGUgdHJlZSB2aWV3ZXIuCisJCQkJCS8vCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisKKwkJCQkJLy8gTWFrZSBzdXJlIG91ciBwb3B1cHMgd29yay4KKwkJCQkJLy8KKwkJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IoY29udGVudE91dGxpbmVWaWV3ZXIpOworCisJCQkJCWlmICghZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkgIC8vIFNlbGVjdCB0aGUgcm9vdCBvYmplY3QgaW4gdGhlIHZpZXcuCisJCQkJCSAgLy8KKwkJCQkJICBjb250ZW50T3V0bGluZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCQkJCQl9CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgbWFrZUNvbnRyaWJ1dGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlcikgeworCQkJCQlzdXBlci5tYWtlQ29udHJpYnV0aW9ucyhtZW51TWFuYWdlciwgdG9vbEJhck1hbmFnZXIsIHN0YXR1c0xpbmVNYW5hZ2VyKTsKKwkJCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsKKwkJCQl9CisJCQl9CisKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZSA9IG5ldyBNeUNvbnRlbnRPdXRsaW5lUGFnZSgpOworCisJCQkvLyBMaXN0ZW4gdG8gc2VsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBpdCBpcyBhIHNwZWNpYWwgd2F5LgorCQkJLy8KKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKKwkJCQkobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQkJCSAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBoYW5kbGUgc2VsZWN0aW9ucyBjb3JyZWN0bHkuCisJCQkJCSAvLworCQkJCQkgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQkJCSBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJcmV0dXJuIGNvbnRlbnRPdXRsaW5lUGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIHByb3BlcnR5IHNoZWV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7CisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZSA9CisJCQkJbmV3IEV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2UoZWRpdGluZ0RvbWFpbikgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoTGlzdDw/PiBzZWxlY3Rpb24pIHsKKwkJCQkJCUxhYmVsc0VkaXRvci50aGlzLnNldFNlbGVjdGlvblRvVmlld2VyKHNlbGVjdGlvbik7CisJCQkJCQlMYWJlbHNFZGl0b3IudGhpcy5zZXRGb2N1cygpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworCQkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOworCQkJCQl9CisJCQkJfTsKKwkJCXByb3BlcnR5U2hlZXRQYWdlLnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCX0KKworCQlyZXR1cm4gcHJvcGVydHlTaGVldFBhZ2U7CisJfQorCisJLyoqCisJICogVGhpcyBkZWFscyB3aXRoIGhvdyB3ZSB3YW50IHNlbGVjdGlvbiBpbiB0aGUgb3V0bGluZXIgdG8gYWZmZWN0IHRoZSBvdGhlciB2aWV3cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlpZiAoc2VsZWN0aW9uVmlld2VyICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCUl0ZXJhdG9yPD8+IHNlbGVjdGVkRWxlbWVudHMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuaXRlcmF0b3IoKTsKKwkJCWlmIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgeworCQkJCS8vIEdldCB0aGUgZmlyc3Qgc2VsZWN0ZWQgZWxlbWVudC4KKwkJCQkvLworCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzLm5leHQoKTsKKworCQkJCUFycmF5TGlzdDxPYmplY3Q+IHNlbGVjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKwkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnQpOworCQkJCXdoaWxlIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgeworCQkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnRzLm5leHQoKSk7CisJCQkJfQorCisJCQkJLy8gU2V0IHRoZSBzZWxlY3Rpb24gdG8gdGhlIHdpZGdldC4KKwkJCQkvLworCQkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uTGlzdCkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSB0ZXN0cyB0aGUgY29tbWFuZCBzdGFjay4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgeworCQlyZXR1cm4gKChCYXNpY0NvbW1hbmRTdGFjayllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5pc1NhdmVOZWVkZWQoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHNhdmVzIHRoZSBtb2RlbCBmaWxlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworCQkvLyBTYXZlIG9ubHkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBhY3R1YWxseSBjaGFuZ2VkLgorCQkvLworCQlmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7CisJCXNhdmVPcHRpb25zLnB1dChSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRUQsIFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRF9NRU1PUllfQlVGRkVSKTsKKworCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guCisJCS8vCisJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPQorCQkJbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKKwkJCQkvLyBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBnZXRzIGludm9rZWQgd2hlbiB0aGUgb3BlcmF0aW9uIHJ1bnMuCisJCQkJLy8KKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJCQkvLyBTYXZlIHRoZSByZXNvdXJjZXMgdG8gdGhlIGZpbGUgc3lzdGVtLgorCQkJCQkvLworCQkJCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwkJCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSkgeworCQkJCQkJaWYgKChmaXJzdCB8fCAhcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkgfHwgaXNQZXJzaXN0ZWQocmVzb3VyY2UpKSAmJiAhZWRpdGluZ0RvbWFpbi5pc1JlYWRPbmx5KHJlc291cmNlKSkgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCWxvbmcgdGltZVN0YW1wID0gcmVzb3VyY2UuZ2V0VGltZVN0YW1wKCk7CisJCQkJCQkJCXJlc291cmNlLnNhdmUoc2F2ZU9wdGlvbnMpOworCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VGltZVN0YW1wKCkgIT0gdGltZVN0YW1wKSB7CisJCQkJCQkJCQlzYXZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQkJCQkJCX0KKwkJCQkJCQlmaXJzdCA9IGZhbHNlOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfTsKKworCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOworCQl0cnkgeworCQkJLy8gVGhpcyBydW5zIHRoZSBvcHRpb25zLCBhbmQgc2hvd3MgcHJvZ3Jlc3MuCisJCQkvLworCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSkucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOworCisJCQkvLyBSZWZyZXNoIHRoZSBuZWNlc3Nhcnkgc3RhdGUuCisJCQkvLworCQkJKChCYXNpY0NvbW1hbmRTdGFjayllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5zYXZlSXNEb25lKCk7CisJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCS8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHRoYXQgc2hvdWxkbid0LgorCQkJLy8KKwkJCVRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHdoZXRoZXIgc29tZXRoaW5nIGhhcyBiZWVuIHBlcnNpc3RlZCB0byB0aGUgVVJJIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisJICogVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIFVSSSBjb252ZXJ0ZXIgZnJvbSB0aGUgZWRpdG9yJ3MgcmVzb3VyY2Ugc2V0IHRvIHRyeSB0byBvcGVuIGFuIGlucHV0IHN0cmVhbS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNQZXJzaXN0ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbShyZXNvdXJjZS5nZXRVUkkoKSk7CisJCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKKwkJCQlyZXN1bHQgPSB0cnVlOworCQkJCXN0cmVhbS5jbG9zZSgpOworCQkJfQorCQl9CisJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBJZ25vcmUKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgdHJ1ZSBiZWNhdXNlIGl0IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogVGhpcyBhbHNvIGNoYW5nZXMgdGhlIGVkaXRvcidzIGlucHV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgeworCQlTYXZlQXNEaWFsb2cgc2F2ZUFzRGlhbG9nID0gbmV3IFNhdmVBc0RpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7CisJCXNhdmVBc0RpYWxvZy5vcGVuKCk7CisJCUlQYXRoIHBhdGggPSBzYXZlQXNEaWFsb2cuZ2V0UmVzdWx0KCk7CisJCWlmIChwYXRoICE9IG51bGwpIHsKKwkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7CisJCQlpZiAoZmlsZSAhPSBudWxsKSB7CisJCQkJZG9TYXZlQXMoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpLCBuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGRvU2F2ZUFzKFVSSSB1cmksIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgeworCQkoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSkuc2V0VVJJKHVyaSk7CisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7CisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7CisJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0KKwkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpICE9IG51bGwgPworCQkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpIDoKKwkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworCQlkb1NhdmUocHJvZ3Jlc3NNb25pdG9yKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7CisJCXRyeSB7CisJCQlpZiAobWFya2VyLmdldFR5cGUoKS5lcXVhbHMoRVZhbGlkYXRvci5NQVJLRVIpKSB7CisJCQkJU3RyaW5nIHVyaUF0dHJpYnV0ZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoRVZhbGlkYXRvci5VUklfQVRUUklCVVRFLCBudWxsKTsKKwkJCQlpZiAodXJpQXR0cmlidXRlICE9IG51bGwpIHsKKwkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpQXR0cmlidXRlKTsKKwkJCQkJRU9iamVjdCBlT2JqZWN0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldEVPYmplY3QodXJpLCB0cnVlKTsKKwkJCQkJaWYgKGVPYmplY3QgIT0gbnVsbCkgeworCQkJCQkgIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zLnNpbmdsZXRvbihlZGl0aW5nRG9tYWluLmdldFdyYXBwZXIoZU9iamVjdCkpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCVRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBzdGFydHVwLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisJCXNldFNpdGUoc2l0ZSk7CisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7CisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7CisJCXNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7CisJCXNpdGUuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCWdldENvbnRyb2woZ2V0QWN0aXZlUGFnZSgpKS5zZXRGb2N1cygpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gcmV0dXJuIHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgeworCQlyZXR1cm4gZWRpdG9yU2VsZWN0aW9uOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHNldCB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLgorCSAqIENhbGxpbmcgdGhpcyByZXN1bHQgd2lsbCBub3RpZnkgdGhlIGxpc3RlbmVycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJZWRpdG9yU2VsZWN0aW9uID0gc2VsZWN0aW9uOworCisJCWZvciAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA6IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMpIHsKKwkJCWxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsKKwkJfQorCQlzZXRTdGF0dXNMaW5lTWFuYWdlcihzZWxlY3Rpb24pOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0YXR1c0xpbmVNYW5hZ2VyKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciA9IGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCAmJiBjdXJyZW50Vmlld2VyID09IGNvbnRlbnRPdXRsaW5lVmlld2VyID8KKwkJCWNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXIgOiBnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKKworCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgeworCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnRvTGlzdCgpOworCQkJCXN3aXRjaCAoY29sbGVjdGlvbi5zaXplKCkpIHsKKwkJCQkJY2FzZSAwOiB7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX05vT2JqZWN0U2VsZWN0ZWQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNhc2UgMTogeworCQkJCQkJU3RyaW5nIHRleHQgPSBuZXcgQWRhcHRlckZhY3RvcnlJdGVtRGVsZWdhdG9yKGFkYXB0ZXJGYWN0b3J5KS5nZXRUZXh0KGNvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkpOworCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZCIsIHRleHQpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZGVmYXVsdDogeworCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9NdWx0aU9iamVjdFNlbGVjdGVkIiwgSW50ZWdlci50b1N0cmluZyhjb2xsZWN0aW9uLnNpemUoKSkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBsb29rcyB1cCBhIHN0cmluZyBpbiB0aGUgcGx1Z2luJ3MgcGx1Z2luLnByb3BlcnRpZXMgZmlsZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJcmV0dXJuIFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHBsdWdpbi5wcm9wZXJ0aWVzLCBtYWtpbmcgYSBzdWJzdGl0dXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEpIHsKKwkJcmV0dXJuIFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5LCBuZXcgT2JqZWN0IFtdIHsgczEgfSk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcn0gdG8gaGVscCBmaWxsIHRoZSBjb250ZXh0IG1lbnVzIHdpdGggY29udHJpYnV0aW9ucyBmcm9tIHRoZSBFZGl0IG1lbnUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQkoKElNZW51TGlzdGVuZXIpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkpLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpIHsKKwkJcmV0dXJuIChFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKSB7CisJCXJldHVybiBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGlvbkJhcnMoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7CisJCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOworCisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOworCisJCWdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7CisKKwkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOworCisJCWlmIChnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGl2ZUVkaXRvcigpID09IHRoaXMpIHsKKwkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKG51bGwpOworCQl9CisKKwkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKKwkJCXByb3BlcnR5U2hlZXRQYWdlLmRpc3Bvc2UoKTsKKwkJfQorCisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgIT0gbnVsbCkgeworCQkJY29udGVudE91dGxpbmVQYWdlLmRpc3Bvc2UoKTsKKwkJfQorCisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG91dGxpbmUgdmlldyBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHNob3dPdXRsaW5lVmlldygpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9wcmVzZW50YXRpb24vTGFiZWxzTW9kZWxXaXphcmQuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9wcmVzZW50YXRpb24vTGFiZWxzTW9kZWxXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmFlYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL3ByZXNlbnRhdGlvbi9MYWJlbHNNb2RlbFdpemFyZC5qYXZhCkBAIC0wLDAgKzEsNTk3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMucHJvdmlkZXIuVGVzdHV0aWxpdHlFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLkxhYmVsc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTZXRTZWxlY3Rpb25UYXJnZXQ7CisKKworLyoqCisgKiBUaGlzIGlzIGEgc2ltcGxlIHdpemFyZCBmb3IgY3JlYXRpbmcgYSBuZXcgbW9kZWwgZmlsZS4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIExhYmVsc01vZGVsV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7CisJLyoqCisJICogVGhpcyBjYWNoZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIExhYmVsc1BhY2thZ2UgbGFiZWxzUGFja2FnZSA9IExhYmVsc1BhY2thZ2UuZUlOU1RBTkNFOworCisJLyoqCisJICogVGhpcyBjYWNoZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIExhYmVsc0ZhY3RvcnkgbGFiZWxzRmFjdG9yeSA9IGxhYmVsc1BhY2thZ2UuZ2V0TGFiZWxzRmFjdG9yeSgpOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgZmlsZSBjcmVhdGlvbiBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBMYWJlbHNNb2RlbFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgbmV3RmlsZUNyZWF0aW9uUGFnZTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGluaXRpYWwgb2JqZWN0IGNyZWF0aW9uIHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIExhYmVsc01vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSBpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlOworCisJLyoqCisJICogUmVtZW1iZXIgdGhlIHNlbGVjdGlvbiBkdXJpbmcgaW5pdGlhbGl6YXRpb24gZm9yIHBvcHVsYXRpbmcgdGhlIGRlZmF1bHQgY29udGFpbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247CisKKwkvKioKKwkgKiBSZW1lbWJlciB0aGUgd29ya2JlbmNoIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVdvcmtiZW5jaCB3b3JrYmVuY2g7CisKKwkvKioKKwkgKiBDYWNoZXMgdGhlIG5hbWVzIG9mIHRoZSB0eXBlcyB0aGF0IGNhbiBiZSBjcmVhdGVkIGFzIHRoZSByb290IG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGluaXRpYWxPYmplY3ROYW1lczsKKworCS8qKgorCSAqIFRoaXMganVzdCByZWNvcmRzIHRoZSBpbmZvcm1hdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7CisJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOworCQlzZXRXaW5kb3dUaXRsZShUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV2l6YXJkX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5JTlNUQU5DRS5nZXRJbWFnZURlc2NyaXB0b3IoVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL3dpemJhbi9OZXdMYWJlbHMiKSkpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIHR5cGVzIHRoYXQgY2FuIGJlIGNyZWF0ZWQgYXMgdGhlIHJvb3Qgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0SW5pdGlhbE9iamVjdE5hbWVzKCkgeworCQlpZiAoaW5pdGlhbE9iamVjdE5hbWVzID09IG51bGwpIHsKKwkJCWluaXRpYWxPYmplY3ROYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJZm9yIChFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA6IGxhYmVsc1BhY2thZ2UuZ2V0RUNsYXNzaWZpZXJzKCkpIHsKKwkJCQlpZiAoZUNsYXNzaWZpZXIgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKKwkJCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpZUNsYXNzaWZpZXI7CisJCQkJCWlmICghZUNsYXNzLmlzQWJzdHJhY3QoKSkgeworCQkJCQkJaW5pdGlhbE9iamVjdE5hbWVzLmFkZChlQ2xhc3MuZ2V0TmFtZSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCUNvbGxlY3Rpb25zLnNvcnQoaW5pdGlhbE9iamVjdE5hbWVzLCBqYXZhLnRleHQuQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKSk7CisJCX0KKwkJcmV0dXJuIGluaXRpYWxPYmplY3ROYW1lczsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEVPYmplY3QgY3JlYXRlSW5pdGlhbE1vZGVsKCkgeworCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcylsYWJlbHNQYWNrYWdlLmdldEVDbGFzc2lmaWVyKGluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UuZ2V0SW5pdGlhbE9iamVjdE5hbWUoKSk7CisJCUVPYmplY3Qgcm9vdE9iamVjdCA9IGxhYmVsc0ZhY3RvcnkuY3JlYXRlKGVDbGFzcyk7CisJCXJldHVybiByb290T2JqZWN0OworCX0KKworCS8qKgorCSAqIERvIHRoZSB3b3JrIGFmdGVyIGV2ZXJ5dGhpbmcgaXMgc3BlY2lmaWVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7CisJCXRyeSB7CisJCQkvLyBSZW1lbWJlciB0aGUgZmlsZS4KKwkJCS8vCisJCQlmaW5hbCBJRmlsZSBtb2RlbEZpbGUgPSBnZXRNb2RlbEZpbGUoKTsKKworCQkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbi4KKwkJCS8vCisJCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0KKwkJCQluZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworCQkJCQkJdHJ5IHsKKwkJCQkJCQkvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQKKwkJCQkJCQkvLworCQkJCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOworCisJCQkJCQkJLy8gR2V0IHRoZSBVUkkgb2YgdGhlIG1vZGVsIGZpbGUuCisJCQkJCQkJLy8KKwkJCQkJCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKG1vZGVsRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpOworCisJCQkJCQkJLy8gQ3JlYXRlIGEgcmVzb3VyY2UgZm9yIHRoaXMgZmlsZS4KKwkJCQkJCQkvLworCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoZmlsZVVSSSk7CisKKwkJCQkJCQkvLyBBZGQgdGhlIGluaXRpYWwgbW9kZWwgb2JqZWN0IHRvIHRoZSBjb250ZW50cy4KKwkJCQkJCQkvLworCQkJCQkJCUVPYmplY3Qgcm9vdE9iamVjdCA9IGNyZWF0ZUluaXRpYWxNb2RlbCgpOworCQkJCQkJCWlmIChyb290T2JqZWN0ICE9IG51bGwpIHsKKwkJCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQocm9vdE9iamVjdCk7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gU2F2ZSB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlIHRvIHRoZSBmaWxlIHN5c3RlbS4KKwkJCQkJCQkvLworCQkJCQkJCU1hcDxPYmplY3QsIE9iamVjdD4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOworCQkJCQkJCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5nZXRFbmNvZGluZygpKTsKKwkJCQkJCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOworCQkJCQkJfQorCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCQlUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJCQl9CisJCQkJCQlmaW5hbGx5IHsKKwkJCQkJCQlwcm9ncmVzc01vbml0b3IuZG9uZSgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfTsKKworCQkJZ2V0Q29udGFpbmVyKCkucnVuKGZhbHNlLCBmYWxzZSwgb3BlcmF0aW9uKTsKKworCQkJLy8gU2VsZWN0IHRoZSBuZXcgZmlsZSByZXNvdXJjZSBpbiB0aGUgY3VycmVudCB2aWV3LgorCQkJLy8KKwkJCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOworCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7CisJCQlmaW5hbCBJV29ya2JlbmNoUGFydCBhY3RpdmVQYXJ0ID0gcGFnZS5nZXRBY3RpdmVQYXJ0KCk7CisJCQlpZiAoYWN0aXZlUGFydCBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpIHsKKwkJCQlmaW5hbCBJU2VsZWN0aW9uIHRhcmdldFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vZGVsRmlsZSk7CisJCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCSAoKElTZXRTZWxlY3Rpb25UYXJnZXQpYWN0aXZlUGFydCkuc2VsZWN0UmV2ZWFsKHRhcmdldFNlbGVjdGlvbik7CisJCQkJCQkgfQorCQkJCQkgfSk7CisJCQl9CisKKwkJCS8vIE9wZW4gYW4gZWRpdG9yIG9uIHRoZSBuZXcgZmlsZS4KKwkJCS8vCisJCQl0cnkgeworCQkJCXBhZ2Uub3BlbkVkaXRvcgorCQkJCQkobmV3IEZpbGVFZGl0b3JJbnB1dChtb2RlbEZpbGUpLAorCQkJCQkgd29ya2JlbmNoLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdEVkaXRvcihtb2RlbEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS5nZXRJZCgpKTsKKwkJCX0KKwkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcih3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKSwgVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbCIpLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCVRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG9uZSBwYWdlIG9mIHRoZSB3aXphcmQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGNsYXNzIExhYmVsc01vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgeworCQkvKioKKwkJICogUGFzcyBpbiB0aGUgc2VsZWN0aW9uLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIExhYmVsc01vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZShTdHJpbmcgcGFnZUlkLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJCXN1cGVyKHBhZ2VJZCwgc2VsZWN0aW9uKTsKKwkJfQorCisJCS8qKgorCQkgKiBUaGUgZnJhbWV3b3JrIGNhbGxzIHRoaXMgdG8gc2VlIGlmIHRoZSBmaWxlIGlzIGNvcnJlY3QuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgeworCQkJaWYgKHN1cGVyLnZhbGlkYXRlUGFnZSgpKSB7CisJCQkJLy8gTWFrZSBzdXJlIHRoZSBmaWxlIGVuZHMgaW4gIi5sYWJlbHMiLgorCQkJCS8vCisJCQkJU3RyaW5nIHJlcXVpcmVkRXh0ID0gVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0xhYmVsc0VkaXRvckZpbGVuYW1lRXh0ZW5zaW9uIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlTdHJpbmcgZW50ZXJlZEV4dCA9IG5ldyBQYXRoKGdldEZpbGVOYW1lKCkpLmdldEZpbGVFeHRlbnNpb24oKTsKKwkJCQlpZiAoZW50ZXJlZEV4dCA9PSBudWxsIHx8ICFlbnRlcmVkRXh0LmVxdWFscyhyZXF1aXJlZEV4dCkpIHsKKwkJCQkJc2V0RXJyb3JNZXNzYWdlKFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uIiwgbmV3IE9iamVjdCBbXSB7IHJlcXVpcmVkRXh0IH0pKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBJRmlsZSBnZXRNb2RlbEZpbGUoKSB7CisJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGdldENvbnRhaW5lckZ1bGxQYXRoKCkuYXBwZW5kKGdldEZpbGVOYW1lKCkpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHBhZ2Ugd2hlcmUgdGhlIHR5cGUgb2Ygb2JqZWN0IHRvIGNyZWF0ZSBpcyBzZWxlY3RlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgY2xhc3MgTGFiZWxzTW9kZWxXaXphcmRJbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7CisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIENvbWJvIGluaXRpYWxPYmplY3RGaWVsZDsKKworCQkvKioKKwkJICogQGdlbmVyYXRlZAorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICovCisJCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gZW5jb2RpbmdzOworCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIENvbWJvIGVuY29kaW5nRmllbGQ7CisKKwkJLyoqCisJCSAqIFBhc3MgaW4gdGhlIHNlbGVjdGlvbi4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBMYWJlbHNNb2RlbFdpemFyZEluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UoU3RyaW5nIHBhZ2VJZCkgeworCQkJc3VwZXIocGFnZUlkKTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsgeworCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7CisJCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEyOworCQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKworCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJfQorCisJCQlMYWJlbCBjb250YWluZXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKKwkJCXsKKwkJCQljb250YWluZXJMYWJlbC5zZXRUZXh0KFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Nb2RlbE9iamVjdCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJY29udGFpbmVyTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCX0KKworCQkJaW5pdGlhbE9iamVjdEZpZWxkID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJCQl7CisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJCQlpbml0aWFsT2JqZWN0RmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCX0KKworCQkJZm9yIChTdHJpbmcgb2JqZWN0TmFtZSA6IGdldEluaXRpYWxPYmplY3ROYW1lcygpKSB7CisJCQkJaW5pdGlhbE9iamVjdEZpZWxkLmFkZChnZXRMYWJlbChvYmplY3ROYW1lKSk7CisJCQl9CisKKwkJCWlmIChpbml0aWFsT2JqZWN0RmllbGQuZ2V0SXRlbUNvdW50KCkgPT0gMSkgeworCQkJCWluaXRpYWxPYmplY3RGaWVsZC5zZWxlY3QoMCk7CisJCQl9CisJCQlpbml0aWFsT2JqZWN0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodmFsaWRhdG9yKTsKKworCQkJTGFiZWwgZW5jb2RpbmdMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKKwkJCXsKKwkJCQllbmNvZGluZ0xhYmVsLnNldFRleHQoVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1hNTEVuY29kaW5nIikpOyAvLyROT04tTkxTLTEkCisKKwkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJCQllbmNvZGluZ0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCQl9CisJCQllbmNvZGluZ0ZpZWxkID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJCQl7CisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJCQllbmNvZGluZ0ZpZWxkLnNldExheW91dERhdGEoZGF0YSk7CisJCQl9CisKKwkJCWZvciAoU3RyaW5nIGVuY29kaW5nIDogZ2V0RW5jb2RpbmdzKCkpIHsKKwkJCQllbmNvZGluZ0ZpZWxkLmFkZChlbmNvZGluZyk7CisJCQl9CisKKwkJCWVuY29kaW5nRmllbGQuc2VsZWN0KDApOworCQkJZW5jb2RpbmdGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih2YWxpZGF0b3IpOworCisJCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOworCQkJc2V0Q29udHJvbChjb21wb3NpdGUpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgdmFsaWRhdG9yID0KKwkJCW5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKKwkJCQl9CisJCQl9OworCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgeworCQkJcmV0dXJuIGdldEluaXRpYWxPYmplY3ROYW1lKCkgIT0gbnVsbCAmJiBnZXRFbmNvZGluZ3MoKS5jb250YWlucyhlbmNvZGluZ0ZpZWxkLmdldFRleHQoKSk7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeworCQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKKwkJCWlmICh2aXNpYmxlKSB7CisJCQkJaWYgKGluaXRpYWxPYmplY3RGaWVsZC5nZXRJdGVtQ291bnQoKSA9PSAxKSB7CisJCQkJCWluaXRpYWxPYmplY3RGaWVsZC5jbGVhclNlbGVjdGlvbigpOworCQkJCQllbmNvZGluZ0ZpZWxkLnNldEZvY3VzKCk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQllbmNvZGluZ0ZpZWxkLmNsZWFyU2VsZWN0aW9uKCk7CisJCQkJCWluaXRpYWxPYmplY3RGaWVsZC5zZXRGb2N1cygpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRJbml0aWFsT2JqZWN0TmFtZSgpIHsKKwkJCVN0cmluZyBsYWJlbCA9IGluaXRpYWxPYmplY3RGaWVsZC5nZXRUZXh0KCk7CisKKwkJCWZvciAoU3RyaW5nIG5hbWUgOiBnZXRJbml0aWFsT2JqZWN0TmFtZXMoKSkgeworCQkJCWlmIChnZXRMYWJlbChuYW1lKS5lcXVhbHMobGFiZWwpKSB7CisJCQkJCXJldHVybiBuYW1lOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgeworCQkJcmV0dXJuIGVuY29kaW5nRmllbGQuZ2V0VGV4dCgpOworCQl9CisKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIGxhYmVsIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgbmFtZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoU3RyaW5nIHR5cGVOYW1lKSB7CisJCQl0cnkgeworCQkJCXJldHVybiBUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfIiArIHR5cGVOYW1lICsgIl90eXBlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJfQorCQkJY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkgeworCQkJCVRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2cobXJlKTsKKwkJCX0KKwkJCXJldHVybiB0eXBlTmFtZTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBnZXRFbmNvZGluZ3MoKSB7CisJCQlpZiAoZW5jb2RpbmdzID09IG51bGwpIHsKKwkJCQllbmNvZGluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCQlmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9YTUxFbmNvZGluZ0Nob2ljZXMiKSk7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgLy8kTk9OLU5MUy0xJAorCQkJCXsKKwkJCQkJZW5jb2RpbmdzLmFkZChzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCkpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBlbmNvZGluZ3M7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGUgZnJhbWV3b3JrIGNhbGxzIHRoaXMgdG8gY3JlYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgd2l6YXJkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgeworCQkvLyBDcmVhdGUgYSBwYWdlLCBzZXQgdGhlIHRpdGxlLCBhbmQgdGhlIGluaXRpYWwgbW9kZWwgZmlsZSBuYW1lLgorCQkvLworCQluZXdGaWxlQ3JlYXRpb25QYWdlID0gbmV3IExhYmVsc01vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSgiV2hhdGV2ZXIiLCBzZWxlY3Rpb24pOyAvLyROT04tTkxTLTEkCisJCW5ld0ZpbGVDcmVhdGlvblBhZ2Uuc2V0VGl0bGUoVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0xhYmVsc01vZGVsV2l6YXJkX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCW5ld0ZpbGVDcmVhdGlvblBhZ2Uuc2V0RGVzY3JpcHRpb24oVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0xhYmVsc01vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCisJCW5ld0ZpbGVDcmVhdGlvblBhZ2Uuc2V0RmlsZU5hbWUoVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0xhYmVsc0VkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2UiKSArICIuIiArIFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9MYWJlbHNFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJYWRkUGFnZShuZXdGaWxlQ3JlYXRpb25QYWdlKTsKKworCQkvLyBUcnkgYW5kIGdldCB0aGUgcmVzb3VyY2Ugc2VsZWN0aW9uIHRvIGRldGVybWluZSBhIGN1cnJlbnQgZGlyZWN0b3J5IGZvciB0aGUgZmlsZSBkaWFsb2cuCisJCS8vCisJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgeworCQkJLy8gR2V0IHRoZSByZXNvdXJjZS4uLgorCQkJLy8KKwkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCk7CisJCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7CisJCQkJLy8gR2V0IHRoZSByZXNvdXJjZSBwYXJlbnQsIGlmIGl0cyBhIGZpbGUuCisJCQkJLy8KKwkJCQlJUmVzb3VyY2Ugc2VsZWN0ZWRSZXNvdXJjZSA9IChJUmVzb3VyY2Upc2VsZWN0ZWRFbGVtZW50OworCQkJCWlmIChzZWxlY3RlZFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgeworCQkJCQlzZWxlY3RlZFJlc291cmNlID0gc2VsZWN0ZWRSZXNvdXJjZS5nZXRQYXJlbnQoKTsKKwkJCQl9CisKKwkJCQkvLyBUaGlzIGdpdmVzIHVzIGEgZGlyZWN0b3J5Li4uCisJCQkJLy8KKwkJCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIgfHwgc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CisJCQkJCS8vIFNldCB0aGlzIGZvciB0aGUgY29udGFpbmVyLgorCQkJCQkvLworCQkJCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldENvbnRhaW5lckZ1bGxQYXRoKHNlbGVjdGVkUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7CisKKwkJCQkJLy8gTWFrZSB1cCBhIHVuaXF1ZSBuZXcgbmFtZSBoZXJlLgorCQkJCQkvLworCQkJCQlTdHJpbmcgZGVmYXVsdE1vZGVsQmFzZUZpbGVuYW1lID0gVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0xhYmVsc0VkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2UiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlTdHJpbmcgZGVmYXVsdE1vZGVsRmlsZW5hbWVFeHRlbnNpb24gPSBUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfTGFiZWxzRWRpdG9yRmlsZW5hbWVFeHRlbnNpb24iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlTdHJpbmcgbW9kZWxGaWxlbmFtZSA9IGRlZmF1bHRNb2RlbEJhc2VGaWxlbmFtZSArICIuIiArIGRlZmF1bHRNb2RlbEZpbGVuYW1lRXh0ZW5zaW9uOyAvLyROT04tTkxTLTEkCisJCQkJCWZvciAoaW50IGkgPSAxOyAoKElDb250YWluZXIpc2VsZWN0ZWRSZXNvdXJjZSkuZmluZE1lbWJlcihtb2RlbEZpbGVuYW1lKSAhPSBudWxsOyArK2kpIHsKKwkJCQkJCW1vZGVsRmlsZW5hbWUgPSBkZWZhdWx0TW9kZWxCYXNlRmlsZW5hbWUgKyBpICsgIi4iICsgZGVmYXVsdE1vZGVsRmlsZW5hbWVFeHRlbnNpb247IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldEZpbGVOYW1lKG1vZGVsRmlsZW5hbWUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlID0gbmV3IExhYmVsc01vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSgiV2hhdGV2ZXIyIik7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5zZXRUaXRsZShUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfTGFiZWxzTW9kZWxXaXphcmRfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5zZXREZXNjcmlwdGlvbihUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV2l6YXJkX2luaXRpYWxfb2JqZWN0X2Rlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCisJCWFkZFBhZ2UoaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBmaWxlIGZyb20gdGhlIHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElGaWxlIGdldE1vZGVsRmlsZSgpIHsKKwkJcmV0dXJuIG5ld0ZpbGVDcmVhdGlvblBhZ2UuZ2V0TW9kZWxGaWxlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJvdmlkZXIvTGFiZWxzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9wcm92aWRlci9MYWJlbHNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZmYzNWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJvdmlkZXIvTGFiZWxzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM1MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLnV0aWwuTGFiZWxzQWRhcHRlckZhY3Rvcnk7CisKKy8qKgorICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLgorICogVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uCisgKiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgorICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTGFiZWxzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBMYWJlbHNBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGFiZWxzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOworCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7CisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdER5bmFtaWNMYWJlbDF9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGVzdER5bmFtaWNMYWJlbDFJdGVtUHJvdmlkZXIgdGVzdER5bmFtaWNMYWJlbDFJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0RHluYW1pY0xhYmVsMX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVzdER5bmFtaWNMYWJlbDFBZGFwdGVyKCkgeworCQlpZiAodGVzdER5bmFtaWNMYWJlbDFJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJdGVzdER5bmFtaWNMYWJlbDFJdGVtUHJvdmlkZXIgPSBuZXcgVGVzdER5bmFtaWNMYWJlbDFJdGVtUHJvdmlkZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gdGVzdER5bmFtaWNMYWJlbDFJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljTm9kZUxhYmVsfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRlc3REeW5hbWljTm9kZUxhYmVsSXRlbVByb3ZpZGVyIHRlc3REeW5hbWljTm9kZUxhYmVsSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdER5bmFtaWNOb2RlTGFiZWx9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlc3REeW5hbWljTm9kZUxhYmVsQWRhcHRlcigpIHsKKwkJaWYgKHRlc3REeW5hbWljTm9kZUxhYmVsSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXRlc3REeW5hbWljTm9kZUxhYmVsSXRlbVByb3ZpZGVyID0gbmV3IFRlc3REeW5hbWljTm9kZUxhYmVsSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHRlc3REeW5hbWljTm9kZUxhYmVsSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0SW50ZWdlckxhYmVsVmFsdWV9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGVzdEludGVnZXJMYWJlbFZhbHVlSXRlbVByb3ZpZGVyIHRlc3RJbnRlZ2VyTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RJbnRlZ2VyTGFiZWxWYWx1ZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVzdEludGVnZXJMYWJlbFZhbHVlQWRhcHRlcigpIHsKKwkJaWYgKHRlc3RJbnRlZ2VyTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQl0ZXN0SW50ZWdlckxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgPSBuZXcgVGVzdEludGVnZXJMYWJlbFZhbHVlSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHRlc3RJbnRlZ2VyTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdExhYmVsfSBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRlc3RMYWJlbEl0ZW1Qcm92aWRlciB0ZXN0TGFiZWxJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0TGFiZWx9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlc3RMYWJlbEFkYXB0ZXIoKSB7CisJCWlmICh0ZXN0TGFiZWxJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJdGVzdExhYmVsSXRlbVByb3ZpZGVyID0gbmV3IFRlc3RMYWJlbEl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiB0ZXN0TGFiZWxJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RTdGF0aWNOb2RlTGFiZWx9IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGVzdFN0YXRpY05vZGVMYWJlbEl0ZW1Qcm92aWRlciB0ZXN0U3RhdGljTm9kZUxhYmVsSXRlbVByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdFN0YXRpY05vZGVMYWJlbH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVzdFN0YXRpY05vZGVMYWJlbEFkYXB0ZXIoKSB7CisJCWlmICh0ZXN0U3RhdGljTm9kZUxhYmVsSXRlbVByb3ZpZGVyID09IG51bGwpIHsKKwkJCXRlc3RTdGF0aWNOb2RlTGFiZWxJdGVtUHJvdmlkZXIgPSBuZXcgVGVzdFN0YXRpY05vZGVMYWJlbEl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiB0ZXN0U3RhdGljTm9kZUxhYmVsSXRlbVByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0RHluYW1pY0VkZ2VMYWJlbH0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUZXN0RHluYW1pY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlciB0ZXN0RHluYW1pY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljRWRnZUxhYmVsfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXN0RHluYW1pY0VkZ2VMYWJlbEFkYXB0ZXIoKSB7CisJCWlmICh0ZXN0RHluYW1pY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisJCQl0ZXN0RHluYW1pY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlciA9IG5ldyBUZXN0RHluYW1pY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlcih0aGlzKTsKKwkJfQorCisJCXJldHVybiB0ZXN0RHluYW1pY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdFN0YXRpY0VkZ2VMYWJlbH0gaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUZXN0U3RhdGljRWRnZUxhYmVsSXRlbVByb3ZpZGVyIHRlc3RTdGF0aWNFZGdlTGFiZWxJdGVtUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0U3RhdGljRWRnZUxhYmVsfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXN0U3RhdGljRWRnZUxhYmVsQWRhcHRlcigpIHsKKwkJaWYgKHRlc3RTdGF0aWNFZGdlTGFiZWxJdGVtUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJdGVzdFN0YXRpY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlciA9IG5ldyBUZXN0U3RhdGljRWRnZUxhYmVsSXRlbVByb3ZpZGVyKHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHRlc3RTdGF0aWNFZGdlTGFiZWxJdGVtUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7CisJCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOworCX0KKworCS8qKgorCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKKwkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7CisJCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgeworCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgeworCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOworCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzczw/Pil0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgeworCQkJCXJldHVybiBhZGFwdGVyOworCQkJfQorCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKKwkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9IGFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisKKwkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKKwkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGRpc3Bvc2VzIGFsbCBvZiB0aGUgaXRlbSBwcm92aWRlcnMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkuIAorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWlmICh0ZXN0RHluYW1pY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlciAhPSBudWxsKSB0ZXN0RHluYW1pY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmICh0ZXN0RHluYW1pY0xhYmVsMUl0ZW1Qcm92aWRlciAhPSBudWxsKSB0ZXN0RHluYW1pY0xhYmVsMUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmICh0ZXN0RHluYW1pY05vZGVMYWJlbEl0ZW1Qcm92aWRlciAhPSBudWxsKSB0ZXN0RHluYW1pY05vZGVMYWJlbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJCWlmICh0ZXN0SW50ZWdlckxhYmVsVmFsdWVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgdGVzdEludGVnZXJMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKHRlc3RMYWJlbEl0ZW1Qcm92aWRlciAhPSBudWxsKSB0ZXN0TGFiZWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworCQlpZiAodGVzdFN0YXRpY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlciAhPSBudWxsKSB0ZXN0U3RhdGljRWRnZUxhYmVsSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKKwkJaWYgKHRlc3RTdGF0aWNOb2RlTGFiZWxJdGVtUHJvdmlkZXIgIT0gbnVsbCkgdGVzdFN0YXRpY05vZGVMYWJlbEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJvdmlkZXIvVGVzdER5bmFtaWNFZGdlTGFiZWxJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9wcm92aWRlci9UZXN0RHluYW1pY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YzhlNTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJvdmlkZXIvVGVzdER5bmFtaWNFZGdlTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuRHluYW1pY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5wcm92aWRlci5UZXN0dXRpbGl0eUVkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0RHluYW1pY0VkZ2VMYWJlbDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdER5bmFtaWNFZGdlTGFiZWx9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRlc3REeW5hbWljRWRnZUxhYmVsSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBEeW5hbWljRWRnZUxhYmVsSXRlbVByb3ZpZGVyCisJaW1wbGVtZW50cwkKKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRlc3REeW5hbWljRWRnZUxhYmVsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFRlc3REeW5hbWljRWRnZUxhYmVsLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1Rlc3REeW5hbWljRWRnZUxhYmVsIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworCQlVUkkgbGFiZWxWYWx1ZSA9ICgoVGVzdER5bmFtaWNFZGdlTGFiZWwpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9UZXN0RHluYW1pY0VkZ2VMYWJlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9UZXN0RHluYW1pY0VkZ2VMYWJlbF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJvdmlkZXIvVGVzdER5bmFtaWNMYWJlbDFJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9wcm92aWRlci9UZXN0RHluYW1pY0xhYmVsMUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MWYyMjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJvdmlkZXIvVGVzdER5bmFtaWNMYWJlbDFJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuRHluYW1pY0xhYmVsSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5kZWNvcmF0b3JzLnByb3ZpZGVyLlRlc3R1dGlsaXR5RWRpdFBsdWdpbjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuTGFiZWxzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljTGFiZWwxOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0RHluYW1pY0xhYmVsMX0gb2JqZWN0LgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVGVzdER5bmFtaWNMYWJlbDFJdGVtUHJvdmlkZXIKKwlleHRlbmRzIER5bmFtaWNMYWJlbEl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUZXN0RHluYW1pY0xhYmVsMUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBUZXN0RHluYW1pY0xhYmVsMS5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9UZXN0RHluYW1pY0xhYmVsMSIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKFRlc3REeW5hbWljTGFiZWwxKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfVGVzdER5bmFtaWNMYWJlbDFfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfVGVzdER5bmFtaWNMYWJlbDFfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL3Byb3ZpZGVyL1Rlc3REeW5hbWljTm9kZUxhYmVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJvdmlkZXIvVGVzdER5bmFtaWNOb2RlTGFiZWxJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTRhZWE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL3Byb3ZpZGVyL1Rlc3REeW5hbWljTm9kZUxhYmVsSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLkR5bmFtaWNOb2RlTGFiZWxJdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMucHJvdmlkZXIuVGVzdHV0aWxpdHlFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdER5bmFtaWNOb2RlTGFiZWw7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljTm9kZUxhYmVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RHluYW1pY05vZGVMYWJlbEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgRHluYW1pY05vZGVMYWJlbEl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUZXN0RHluYW1pY05vZGVMYWJlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBUZXN0RHluYW1pY05vZGVMYWJlbC5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9UZXN0RHluYW1pY05vZGVMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKKwkJVVJJIGxhYmVsVmFsdWUgPSAoKFRlc3REeW5hbWljTm9kZUxhYmVsKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfVGVzdER5bmFtaWNOb2RlTGFiZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfVGVzdER5bmFtaWNOb2RlTGFiZWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgeworCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gVGVzdHV0aWxpdHlFZGl0UGx1Z2luLklOU1RBTkNFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL3Byb3ZpZGVyL1Rlc3RJbnRlZ2VyTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL3Byb3ZpZGVyL1Rlc3RJbnRlZ2VyTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMTczYTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJvdmlkZXIvVGVzdEludGVnZXJMYWJlbFZhbHVlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5wcm92aWRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5wcm92aWRlci5UZXN0dXRpbGl0eUVkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5MYWJlbHNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdEludGVnZXJMYWJlbFZhbHVlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0SW50ZWdlckxhYmVsVmFsdWV9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgTGFiZWxWYWx1ZUl0ZW1Qcm92aWRlcgorCWltcGxlbWVudHMJCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CisJLyoqCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUZXN0SW50ZWdlckxhYmVsVmFsdWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKworCQkJYWRkSVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOworCQl9CisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSSBmZWF0dXJlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZElQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9UZXN0SW50ZWdlckxhYmVsVmFsdWVfaV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UZXN0SW50ZWdlckxhYmVsVmFsdWVfaV9mZWF0dXJlIiwgIl9VSV9UZXN0SW50ZWdlckxhYmVsVmFsdWVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSBMYWJlbHNQYWNrYWdlLkxpdGVyYWxzLlRFU1RfSU5URUdFUl9MQUJFTF9WQUxVRV9fSSwKKwkJCQkgdHJ1ZSwKKwkJCQkgZmFsc2UsCisJCQkJIGZhbHNlLAorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAorCQkJCSBudWxsLAorCQkJCSBudWxsKSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZS5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9UZXN0SW50ZWdlckxhYmVsVmFsdWUiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSB0ZXN0SW50ZWdlckxhYmVsVmFsdWUgPSAoVGVzdEludGVnZXJMYWJlbFZhbHVlKW9iamVjdDsKKwkJcmV0dXJuIGdldFN0cmluZygiX1VJX1Rlc3RJbnRlZ2VyTGFiZWxWYWx1ZV90eXBlIikgKyAiICIgKyB0ZXN0SW50ZWdlckxhYmVsVmFsdWUuZ2V0SSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUZXN0SW50ZWdlckxhYmVsVmFsdWUuY2xhc3MpKSB7CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVEVTVF9JTlRFR0VSX0xBQkVMX1ZBTFVFX19JOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBUZXN0dXRpbGl0eUVkaXRQbHVnaW4uSU5TVEFOQ0U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJvdmlkZXIvVGVzdExhYmVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJvdmlkZXIvVGVzdExhYmVsSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4ZWRhOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9wcm92aWRlci9UZXN0TGFiZWxJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLnByb3ZpZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuTGFiZWxJdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmRlY29yYXRvcnMucHJvdmlkZXIuVGVzdHV0aWxpdHlFZGl0UGx1Z2luOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5MYWJlbHNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdExhYmVsOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0TGFiZWx9IG9iamVjdC4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRlc3RMYWJlbEl0ZW1Qcm92aWRlcgorCWV4dGVuZHMgTGFiZWxJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGVzdExhYmVsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CisKKwkJfQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIFRlc3RMYWJlbC5naWYuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9UZXN0TGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChUZXN0TGFiZWwpb2JqZWN0KS5nZXRVUkkoKTsKKwkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/CisJCQlnZXRTdHJpbmcoIl9VSV9UZXN0TGFiZWxfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfVUlfVGVzdExhYmVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9wcm92aWRlci9UZXN0U3RhdGljRWRnZUxhYmVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJvdmlkZXIvVGVzdFN0YXRpY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZTA1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJvdmlkZXIvVGVzdFN0YXRpY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLlN0YXRpY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5wcm92aWRlci5UZXN0dXRpbGl0eUVkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0U3RhdGljRWRnZUxhYmVsOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0U3RhdGljRWRnZUxhYmVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U3RhdGljRWRnZUxhYmVsSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBTdGF0aWNFZGdlTGFiZWxJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGVzdFN0YXRpY0VkZ2VMYWJlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBUZXN0U3RhdGljRWRnZUxhYmVsLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1Rlc3RTdGF0aWNFZGdlTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChUZXN0U3RhdGljRWRnZUxhYmVsKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfVGVzdFN0YXRpY0VkZ2VMYWJlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9UZXN0U3RhdGljRWRnZUxhYmVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy9wcm92aWRlci9UZXN0U3RhdGljTm9kZUxhYmVsSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJvdmlkZXIvVGVzdFN0YXRpY05vZGVMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMGQ1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvcHJvdmlkZXIvVGVzdFN0YXRpY05vZGVMYWJlbEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMucHJvdmlkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLlN0YXRpY05vZGVMYWJlbEl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwuZGVjb3JhdG9ycy5wcm92aWRlci5UZXN0dXRpbGl0eUVkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0U3RhdGljTm9kZUxhYmVsOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0U3RhdGljTm9kZUxhYmVsfSBvYmplY3QuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U3RhdGljTm9kZUxhYmVsSXRlbVByb3ZpZGVyCisJZXh0ZW5kcyBTdGF0aWNOb2RlTGFiZWxJdGVtUHJvdmlkZXIKKwlpbXBsZW1lbnRzCQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCisJCUlJdGVtTGFiZWxQcm92aWRlciwJCisJCUlJdGVtUHJvcGVydHlTb3VyY2UgeworCS8qKgorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGVzdFN0YXRpY05vZGVMYWJlbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworCisJCX0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBUZXN0U3RhdGljTm9kZUxhYmVsLmdpZi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1Rlc3RTdGF0aWNOb2RlTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisJCVVSSSBsYWJlbFZhbHVlID0gKChUZXN0U3RhdGljTm9kZUxhYmVsKW9iamVjdCkuZ2V0VVJJKCk7CisJCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7CisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPworCQkJZ2V0U3RyaW5nKCJfVUlfVGVzdFN0YXRpY05vZGVMYWJlbF90eXBlIikgOiAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9UZXN0U3RhdGljTm9kZUxhYmVsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIFRlc3R1dGlsaXR5RWRpdFBsdWdpbi5JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS90ZXN0cy91dGlsL2xhYmVscy91dGlsL0xhYmVsc0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvdXRpbC9MYWJlbHNBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZDg5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvdXRpbC9MYWJlbHNBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTA5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMudXRpbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0VkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY0VkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY05vZGVMYWJlbDsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLkxhYmVsc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0RHluYW1pY0VkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljTGFiZWwxOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdER5bmFtaWNOb2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0SW50ZWdlckxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0TGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0U3RhdGljRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdFN0YXRpY05vZGVMYWJlbDsKKworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLkxhYmVsc1BhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIExhYmVsc0FkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBMYWJlbHNQYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGFiZWxzQWRhcHRlckZhY3RvcnkoKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gTGFiZWxzUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgeworCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBUaGUgc3dpdGNoIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIExhYmVsc1N3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9CisJCW5ldyBMYWJlbHNTd2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUZXN0RHluYW1pY0VkZ2VMYWJlbChUZXN0RHluYW1pY0VkZ2VMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlVGVzdER5bmFtaWNFZGdlTGFiZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUZXN0RHluYW1pY0xhYmVsMShUZXN0RHluYW1pY0xhYmVsMSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlVGVzdER5bmFtaWNMYWJlbDFBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUZXN0RHluYW1pY05vZGVMYWJlbChUZXN0RHluYW1pY05vZGVMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlVGVzdER5bmFtaWNOb2RlTGFiZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUZXN0SW50ZWdlckxhYmVsVmFsdWUoVGVzdEludGVnZXJMYWJlbFZhbHVlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVUZXN0SW50ZWdlckxhYmVsVmFsdWVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUZXN0TGFiZWwoVGVzdExhYmVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVUZXN0TGFiZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUZXN0U3RhdGljRWRnZUxhYmVsKFRlc3RTdGF0aWNFZGdlTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRlc3RTdGF0aWNFZGdlTGFiZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUZXN0U3RhdGljTm9kZUxhYmVsKFRlc3RTdGF0aWNOb2RlTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRlc3RTdGF0aWNOb2RlTGFiZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyA8VD4gQWRhcHRlciBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTGFiZWwoTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRHluYW1pY0xhYmVsKER5bmFtaWNMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRHluYW1pY0xhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRWRnZUxhYmVsKEVkZ2VMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRWRnZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRHluYW1pY0VkZ2VMYWJlbChEeW5hbWljRWRnZUxhYmVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVEeW5hbWljRWRnZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTm9kZUxhYmVsKE5vZGVMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTm9kZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRHluYW1pY05vZGVMYWJlbChEeW5hbWljTm9kZUxhYmVsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVEeW5hbWljTm9kZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU2FuaXR5Q2hlY2tlcihTYW5pdHlDaGVja2VyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTYW5pdHlDaGVja2VyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTGFiZWxWYWx1ZShMYWJlbFZhbHVlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVMYWJlbFZhbHVlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3RhdGljTGFiZWwoU3RhdGljTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0YXRpY0xhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTW9kaWZpYWJsZShNb2RpZmlhYmxlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVNb2RpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3RhdGljRWRnZUxhYmVsKFN0YXRpY0VkZ2VMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU3RhdGljRWRnZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3RhdGljTm9kZUxhYmVsKFN0YXRpY05vZGVMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU3RhdGljTm9kZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworCQkJfQorCQl9OworCisJLyoqCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdER5bmFtaWNMYWJlbDEgPGVtPlRlc3QgRHluYW1pYyBMYWJlbDE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0RHluYW1pY0xhYmVsMQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXN0RHluYW1pY0xhYmVsMUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0SW50ZWdlckxhYmVsVmFsdWUgPGVtPlRlc3QgSW50ZWdlciBMYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RJbnRlZ2VyTGFiZWxWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXN0SW50ZWdlckxhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdExhYmVsIDxlbT5UZXN0IExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdExhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlc3RMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0U3RhdGljTm9kZUxhYmVsIDxlbT5UZXN0IFN0YXRpYyBOb2RlIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdFN0YXRpY05vZGVMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXN0U3RhdGljTm9kZUxhYmVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLmxhbmcuQ29tcGFyYWJsZSA8ZW0+Q29tcGFyYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljRWRnZUxhYmVsIDxlbT5UZXN0IER5bmFtaWMgRWRnZSBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljRWRnZUxhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlc3REeW5hbWljRWRnZUxhYmVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RTdGF0aWNFZGdlTGFiZWwgPGVtPlRlc3QgU3RhdGljIEVkZ2UgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0U3RhdGljRWRnZUxhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlc3RTdGF0aWNFZGdlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdER5bmFtaWNOb2RlTGFiZWwgPGVtPlRlc3QgRHluYW1pYyBOb2RlIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdER5bmFtaWNOb2RlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVzdER5bmFtaWNOb2RlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlIDxlbT5JZGVudGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWwgPGVtPkxhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbCA8ZW0+RHluYW1pYyBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUR5bmFtaWNMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWUgPGVtPkxhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNMYWJlbCA8ZW0+U3RhdGljIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGF0aWNMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUgPGVtPk1vZGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kaWZpYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbCA8ZW0+Tm9kZSBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5vZGVMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY05vZGVMYWJlbCA8ZW0+U3RhdGljIE5vZGUgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY05vZGVMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGF0aWNOb2RlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlTGFiZWwgPGVtPkVkZ2UgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFZGdlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljRWRnZUxhYmVsIDxlbT5EeW5hbWljIEVkZ2UgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNFZGdlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRHluYW1pY0VkZ2VMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY0VkZ2VMYWJlbCA8ZW0+U3RhdGljIEVkZ2UgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY0VkZ2VMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGF0aWNFZGdlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTm9kZUxhYmVsIDxlbT5EeW5hbWljIE5vZGUgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNOb2RlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRHluYW1pY05vZGVMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyIDxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2FuaXR5Q2hlY2tlckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9MYWJlbHNBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL3V0aWwvTGFiZWxzU3dpdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdGVzdHMvdXRpbC9sYWJlbHMvdXRpbC9MYWJlbHNTd2l0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWQ3NTY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3Rlc3RzL3V0aWwvbGFiZWxzL3V0aWwvTGFiZWxzU3dpdGNoLmphdmEKQEAgLTAsMCArMSw1MzIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy51dGlsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLlNhbml0eUNoZWNrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNFZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY05vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNFZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNOb2RlTGFiZWw7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5MYWJlbHNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdER5bmFtaWNFZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy51dGlsLmxhYmVscy5UZXN0RHluYW1pY0xhYmVsMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3REeW5hbWljTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdEludGVnZXJMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuVGVzdFN0YXRpY0VkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnRlc3RzLnV0aWwubGFiZWxzLlRlc3RTdGF0aWNOb2RlTGFiZWw7CisKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQorICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAorICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKKyAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKyAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAorICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbC5sYWJlbHMuTGFiZWxzUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTGFiZWxzU3dpdGNoPFQxPiB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBMYWJlbHNQYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGFiZWxzU3dpdGNoKCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IExhYmVsc1BhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKgorCSAqIEBwYXJhbSB0aGVFT2JqZWN0IAorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogCisJICogIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOworCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQxIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOworCQl9CisJCWVsc2UgeworCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7CisJCQlyZXR1cm4KKwkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPworCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6CisJCQkJCWRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUMSBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5URVNUX0RZTkFNSUNfRURHRV9MQUJFTDogeworCQkJCVRlc3REeW5hbWljRWRnZUxhYmVsIHRlc3REeW5hbWljRWRnZUxhYmVsID0gKFRlc3REeW5hbWljRWRnZUxhYmVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVRlc3REeW5hbWljRWRnZUxhYmVsKHRlc3REeW5hbWljRWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEeW5hbWljRWRnZUxhYmVsKHRlc3REeW5hbWljRWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEeW5hbWljTGFiZWwodGVzdER5bmFtaWNFZGdlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVkZ2VMYWJlbCh0ZXN0RHluYW1pY0VkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGFiZWwodGVzdER5bmFtaWNFZGdlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZSh0ZXN0RHluYW1pY0VkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZSh0ZXN0RHluYW1pY0VkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRFU1RfRFlOQU1JQ19MQUJFTDE6IHsKKwkJCQlUZXN0RHluYW1pY0xhYmVsMSB0ZXN0RHluYW1pY0xhYmVsMSA9IChUZXN0RHluYW1pY0xhYmVsMSl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VUZXN0RHluYW1pY0xhYmVsMSh0ZXN0RHluYW1pY0xhYmVsMSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRHluYW1pY0xhYmVsKHRlc3REeW5hbWljTGFiZWwxKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbCh0ZXN0RHluYW1pY0xhYmVsMSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHRlc3REeW5hbWljTGFiZWwxKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHRlc3REeW5hbWljTGFiZWwxKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVEVTVF9EWU5BTUlDX05PREVfTEFCRUw6IHsKKwkJCQlUZXN0RHluYW1pY05vZGVMYWJlbCB0ZXN0RHluYW1pY05vZGVMYWJlbCA9IChUZXN0RHluYW1pY05vZGVMYWJlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VUZXN0RHluYW1pY05vZGVMYWJlbCh0ZXN0RHluYW1pY05vZGVMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRHluYW1pY05vZGVMYWJlbCh0ZXN0RHluYW1pY05vZGVMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRHluYW1pY0xhYmVsKHRlc3REeW5hbWljTm9kZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlTGFiZWwodGVzdER5bmFtaWNOb2RlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsKHRlc3REeW5hbWljTm9kZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUodGVzdER5bmFtaWNOb2RlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUodGVzdER5bmFtaWNOb2RlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5URVNUX0lOVEVHRVJfTEFCRUxfVkFMVUU6IHsKKwkJCQlUZXN0SW50ZWdlckxhYmVsVmFsdWUgdGVzdEludGVnZXJMYWJlbFZhbHVlID0gKFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VUZXN0SW50ZWdlckxhYmVsVmFsdWUodGVzdEludGVnZXJMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbFZhbHVlKHRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcih0ZXN0SW50ZWdlckxhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgTGFiZWxzUGFja2FnZS5URVNUX0xBQkVMOiB7CisJCQkJVGVzdExhYmVsIHRlc3RMYWJlbCA9IChUZXN0TGFiZWwpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlVGVzdExhYmVsKHRlc3RMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGFiZWwodGVzdExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUodGVzdExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHRlc3RMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBMYWJlbHNQYWNrYWdlLlRFU1RfU1RBVElDX0VER0VfTEFCRUw6IHsKKwkJCQlUZXN0U3RhdGljRWRnZUxhYmVsIHRlc3RTdGF0aWNFZGdlTGFiZWwgPSAoVGVzdFN0YXRpY0VkZ2VMYWJlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VUZXN0U3RhdGljRWRnZUxhYmVsKHRlc3RTdGF0aWNFZGdlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVN0YXRpY0VkZ2VMYWJlbCh0ZXN0U3RhdGljRWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFZGdlTGFiZWwodGVzdFN0YXRpY0VkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhdGljTGFiZWwodGVzdFN0YXRpY0VkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kaWZpYWJsZSh0ZXN0U3RhdGljRWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbCh0ZXN0U3RhdGljRWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUodGVzdFN0YXRpY0VkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZSh0ZXN0U3RhdGljRWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIExhYmVsc1BhY2thZ2UuVEVTVF9TVEFUSUNfTk9ERV9MQUJFTDogeworCQkJCVRlc3RTdGF0aWNOb2RlTGFiZWwgdGVzdFN0YXRpY05vZGVMYWJlbCA9IChUZXN0U3RhdGljTm9kZUxhYmVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVRlc3RTdGF0aWNOb2RlTGFiZWwodGVzdFN0YXRpY05vZGVMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU3RhdGljTm9kZUxhYmVsKHRlc3RTdGF0aWNOb2RlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVMYWJlbCh0ZXN0U3RhdGljTm9kZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTdGF0aWNMYWJlbCh0ZXN0U3RhdGljTm9kZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKHRlc3RTdGF0aWNOb2RlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsKHRlc3RTdGF0aWNOb2RlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZSh0ZXN0U3RhdGljTm9kZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHRlc3RTdGF0aWNOb2RlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlc3QgRHluYW1pYyBMYWJlbDE8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXN0IER5bmFtaWMgTGFiZWwxPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVRlc3REeW5hbWljTGFiZWwxKFRlc3REeW5hbWljTGFiZWwxIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXN0IEludGVnZXIgTGFiZWwgVmFsdWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXN0IEludGVnZXIgTGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlVGVzdEludGVnZXJMYWJlbFZhbHVlKFRlc3RJbnRlZ2VyTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVzdCBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlc3QgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlVGVzdExhYmVsKFRlc3RMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVzdCBTdGF0aWMgTm9kZSBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlc3QgU3RhdGljIE5vZGUgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlVGVzdFN0YXRpY05vZGVMYWJlbChUZXN0U3RhdGljTm9kZUxhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXJhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIDxUPiBUMSBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXN0IER5bmFtaWMgRWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlc3QgRHluYW1pYyBFZGdlIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVRlc3REeW5hbWljRWRnZUxhYmVsKFRlc3REeW5hbWljRWRnZUxhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXN0IFN0YXRpYyBFZGdlIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVzdCBTdGF0aWMgRWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VUZXN0U3RhdGljRWRnZUxhYmVsKFRlc3RTdGF0aWNFZGdlTGFiZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlc3QgRHluYW1pYyBOb2RlIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVzdCBEeW5hbWljIE5vZGUgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlVGVzdER5bmFtaWNOb2RlTGFiZWwoVGVzdER5bmFtaWNOb2RlTGFiZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUxhYmVsKExhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EeW5hbWljIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RHluYW1pYyBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VEeW5hbWljTGFiZWwoRHluYW1pY0xhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUxhYmVsVmFsdWUoTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RhdGljIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RhdGljIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVN0YXRpY0xhYmVsKFN0YXRpY0xhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2RpZmlhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kaWZpYWJsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VNb2RpZmlhYmxlKE1vZGlmaWFibGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZU5vZGVMYWJlbChOb2RlTGFiZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0YXRpYyBOb2RlIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RhdGljIE5vZGUgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlU3RhdGljTm9kZUxhYmVsKFN0YXRpY05vZGVMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVkZ2UgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRWRnZUxhYmVsKEVkZ2VMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RHluYW1pYyBFZGdlIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RHluYW1pYyBFZGdlIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUR5bmFtaWNFZGdlTGFiZWwoRHluYW1pY0VkZ2VMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RhdGljIEVkZ2UgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGF0aWMgRWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTdGF0aWNFZGdlTGFiZWwoU3RhdGljRWRnZUxhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EeW5hbWljIE5vZGUgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EeW5hbWljIE5vZGUgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRHluYW1pY05vZGVMYWJlbChEeW5hbWljTm9kZUxhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNhbml0eSBDaGVja2VyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVNhbml0eUNoZWNrZXIoU2FuaXR5Q2hlY2tlciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9IC8vTGFiZWxzU3dpdGNoCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRlODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGVmNjNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQ8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYWY4YTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw3OCBAQAorI1R1ZSBEZWMgMDQgMTc6MzE6MDYgRVNUIDIwMDcKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYwNTI0YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMTQgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydDsgc2luZ2xldG9uOj10cnVlCitCdW5kbGUtVmVyc2lvbjogMS4wLjEucXVhbGlmaWVyCitCdW5kbGUtQ2xhc3NQYXRoOiAuCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwsCisgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQudXRpbAorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnM7dmlzaWJpbGl0eTo9cmVleHBvcnQKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmQ5YzJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE0IEBACisKKyMgPGNvcHlyaWdodD4KKyMgPC9jb3B5cmlnaHQ+CisjCisjICRJZCQKKworYmluLmluY2x1ZGVzID0gLixcCisgICAgICAgICAgICAgICBtb2RlbC8sXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKK2phcnMuY29tcGlsZS5vcmRlciA9IC4KK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YjE5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoreG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKK3htbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPGxpbmsgcmVsPUZpbGUtTGlzdAoraHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOkRvY3VtZW50UHJvcGVydGllcz4KKyAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KKyAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgorICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+CisgIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+CisgIDxvOlBhZ2VzPjQ8L286UGFnZXM+CisgIDxvOldvcmRzPjE2MjY8L286V29yZHM+CisgIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgorICAgPG86TGluZXM+Nzc8L286TGluZXM+CisgIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KKyAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+CisgIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+CisgPC9vOkRvY3VtZW50UHJvcGVydGllcz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OldvcmREb2N1bWVudD4KKyAgPHc6VHJhY2tSZXZpc2lvbnMvPgorIDwvdzpXb3JkRG9jdW1lbnQ+Cis8L3htbD48IVtlbmRpZl0tLT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlRhaG9tYTsKKwlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKKwltc28tZm9udC1jaGFyc2V0OjA7CisJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7CisJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7CisJbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KK3AuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bXNvLXN0eWxlLXBhcmVudDoiIjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwCisJe21hcmdpbi1yaWdodDowaW47CisJbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CisJbWFyZ2luLWxlZnQ6MGluOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKKwl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZTo4LjBwdDsKKwlmb250LWZhbWlseTpUYWhvbWE7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorQHBhZ2UgU2VjdGlvbjEKKwl7c2l6ZTo4LjVpbiAxMS4waW47CisJbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47CisJbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKKwltc28tZm9vdGVyLW1hcmdpbjouNWluOworCW1zby1wYXBlci1zb3VyY2U6MDt9CitkaXYuU2VjdGlvbjEKKwl7cGFnZTpTZWN0aW9uMTt9CistLT4KKzwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgorPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCitUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAorUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCitPRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCithZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKK3N1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKK2J5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgoraWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KK3N1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCit3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKK2VudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKK2NsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCitvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucworZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KK3JlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50CithIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KK3N0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5CitkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCitSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAorYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCitjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgorb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKK2J5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCit0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCithbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCitSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCitDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgordGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Citmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQordG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKK2lmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKK3RoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQorRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKK3JpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KK3RoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Cis8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK2l0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAorY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQorYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKK2FuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCitlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAoraW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAorYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCitzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0CitDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCitzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCitpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCitjb2RlIGZvcm06PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQorY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQorY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCitvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQorYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycworYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKK29mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAorbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCitDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKK2Nvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCit0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCitjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKK3RvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK3RvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCithbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQoraW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCit3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcworc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCitvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCitjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKK1dJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKK01FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQorUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcworQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKK2VxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgorVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgorVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKK29yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKK2Z1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgorYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAorb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCitzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCitwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQorY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKK3RoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKK0FncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCitzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAorZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCitTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCitBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKK0FncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKK2l0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvbW9kZWwvdHJhbnNwb3J0LmVjb3JlIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvbW9kZWwvdHJhbnNwb3J0LmVjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNmZiYjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9tb2RlbC90cmFuc3BvcnQuZWNvcmUKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0idHJhbnNwb3J0IgorICAgIG5zVVJJPSJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0LmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQiPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxvYWRVbmxvYWRFZGdlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy9tb2RlbC9lZGdlcy5lY29yZSMvL01pZ3JhdGlvbkVkZ2UiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2FkaW5nRWRnZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxvYWRVbmxvYWRFZGdlTGFiZWwiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zL21vZGVsL2VkZ2VzLmVjb3JlIy8vTWlncmF0aW9uRWRnZUxhYmVsIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9ncmFwaC5lY29yZSMvL0R5bmFtaWNMYWJlbCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFjdGl2YXRpb25UaW1lIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9tb2RlbC5lY29yZSMvL1NURU1UaW1lIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlYWN0aXZhdGlvblRpbWUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL21vZGVsLmVjb3JlIy8vU1RFTVRpbWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZhdGVkUmF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSIgZVN1cGVyVHlwZXM9IiMvL1RyYW5zcG9ydFN5c3RlbSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhY2tldFRyYW5zcG9ydExhYmVsIiBlVHlwZT0iIy8vUGFja2V0VHJhbnNwb3J0TGFiZWwiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibG9hZGluZ0VkZ2VzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL0xvYWRVbmxvYWRFZGdlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InVubG9hZGluZ0VkZ2VzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL0xvYWRVbmxvYWRFZGdlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2tldFRyYW5zcG9ydExhYmVsIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2dyYXBoLmVjb3JlIy8vTm9kZUxhYmVsIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtIiBlU3VwZXJUeXBlcz0iIy8vVHJhbnNwb3J0U3lzdGVtIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5UcmFuc3BvcnRFZGdlcyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9QaXBlVHJhbnNwb3J0RWRnZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRUcmFuc3BvcnRFZGdlcyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9QaXBlVHJhbnNwb3J0RWRnZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYXhDYXBhY2l0eSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VEb3VibGUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVHJhbnNwb3J0U3lzdGVtIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9ncmFwaC5lY29yZSMvL05vZGUiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2dyYXBoLmVjb3JlIy8vTGFiZWxWYWx1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhcGFjaXR5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9yIgorICAgICAgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9tb2RlbC5lY29yZSMvL0VkZ2VEZWNvcmF0b3IiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQaXBlVHJhbnNwb3J0RWRnZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvbW9kZWwvZWRnZXMuZWNvcmUjLy9Qb3B1bGF0aW9uRWRnZSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBpcGVUcmFuc3BvcnRFZGdlTGFiZWwiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUjLy9FZGdlTGFiZWwiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvZ3JhcGguZWNvcmUjLy9MYWJlbFZhbHVlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWF4RmxvdyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VEb3VibGUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGltZVBlcmlvZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VMb25nIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L21vZGVsL3RyYW5zcG9ydC5nZW5tb2RlbCBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L21vZGVsL3RyYW5zcG9ydC5nZW5tb2RlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWQ0ZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvbW9kZWwvdHJhbnNwb3J0Lmdlbm1vZGVsCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgorICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYyIKKyAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydCIgbW9kZWxOYW1lPSJUcmFuc3BvcnQiIHRlc3RzRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uuc3RlbS50ZXN0cy50cmFuc3BvcnQvc3JjIgorICAgIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5qYXZhIiBjb21wbGlhbmNlTGV2ZWw9IjUuMCIgY29weXJpZ2h0RmllbGRzPSJmYWxzZSIKKyAgICB1c2VkR2VuUGFja2FnZXM9Ii4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMvbW9kZWwvZGVmaW5pdGlvbnMuZ2VubW9kZWwjLy9lZGdlcyAuLi8uLi9vcmcuZWNsaXBzZS5zdGVtLmNvcmUvbW9kZWwvY29yZS5nZW5tb2RlbCMvL2dyYXBoIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vY29tbW9uIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vbW9kZWwgLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9tb2RpZmllciBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlIC4uLy4uL29yZy5lY2xpcHNlLnN0ZW0uY29yZS9tb2RlbC9jb3JlLmdlbm1vZGVsIy8vc2NlbmFyaW8gLi4vLi4vb3JnLmVjbGlwc2Uuc3RlbS5jb3JlL21vZGVsL2NvcmUuZ2VubW9kZWwjLy9zZXF1ZW5jZXIiPgorICA8Zm9yZWlnbk1vZGVsPkBtb2RlbDwvZm9yZWlnbk1vZGVsPgorICA8Z2VuUGFja2FnZXMgcHJlZml4PSJUcmFuc3BvcnQiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgorICAgICAgZ2VuZXJhdGVFeGFtcGxlQ2xhc3M9ImZhbHNlIiBtdWx0aXBsZUVkaXRvclBhZ2VzPSJmYWxzZSIgZ2VuZXJhdGVNb2RlbFdpemFyZD0iZmFsc2UiCisgICAgICBlY29yZVBhY2thZ2U9InRyYW5zcG9ydC5lY29yZSMvIj4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ0cmFuc3BvcnQuZWNvcmUjLy9Mb2FkVW5sb2FkRWRnZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdHJhbnNwb3J0LmVjb3JlIy8vTG9hZFVubG9hZEVkZ2UvbG9hZGluZ0VkZ2UiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idHJhbnNwb3J0LmVjb3JlIy8vTG9hZFVubG9hZEVkZ2VMYWJlbCI+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdHJhbnNwb3J0LmVjb3JlIy8vTG9hZFVubG9hZEVkZ2VMYWJlbC9hY3RpdmF0aW9uVGltZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRyYW5zcG9ydC5lY29yZSMvL0xvYWRVbmxvYWRFZGdlTGFiZWwvZGVhY3RpdmF0aW9uVGltZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRyYW5zcG9ydC5lY29yZSMvL0xvYWRVbmxvYWRFZGdlTGFiZWwvYWN0aXZhdGVkUmF0ZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ0cmFuc3BvcnQuZWNvcmUjLy9QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSI+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdHJhbnNwb3J0LmVjb3JlIy8vUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0vcGFja2V0VHJhbnNwb3J0TGFiZWwiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0cmFuc3BvcnQuZWNvcmUjLy9QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbS9sb2FkaW5nRWRnZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0cmFuc3BvcnQuZWNvcmUjLy9QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbS91bmxvYWRpbmdFZGdlcyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ0cmFuc3BvcnQuZWNvcmUjLy9QYWNrZXRUcmFuc3BvcnRMYWJlbCIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InRyYW5zcG9ydC5lY29yZSMvL1BpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbSI+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdHJhbnNwb3J0LmVjb3JlIy8vUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtL2luTWlncmF0aW9uRWRnZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0cmFuc3BvcnQuZWNvcmUjLy9QaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW0vb3V0TWlncmF0aW9uRWRnZXMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ0cmFuc3BvcnQuZWNvcmUjLy9UcmFuc3BvcnRTeXN0ZW0iLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ0cmFuc3BvcnQuZWNvcmUjLy9QYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0cmFuc3BvcnQuZWNvcmUjLy9QYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlL2NhcGFjaXR5Ii8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InRyYW5zcG9ydC5lY29yZSMvL1BhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9yIi8+CisgIDwvZ2VuUGFja2FnZXM+Cis8L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvbm90aWNlLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9ub3RpY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFmOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvbm90aWNlLmh0bWwKQEAgLTAsMCArMSw3OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5NYXJjaCAxNywgMjAwNTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisgICAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKKyAgIAorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCisgICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKyAgIAorPHVsPgorCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucworICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPiAgIAorIAorPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisJCQorPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisJPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQorCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisgICAKKzxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWI1N2QyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNiBAQAorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgVG8gY29kZSBkZXZlbG9wZXI6CisjICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCisjICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KKyMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKKyMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworcGx1Z2luTmFtZSA9IFNURU0gVHJhbnNwb3J0IE1vZGVsIFRlc3RzCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhODdhMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3BsdWdpbi54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPCEtLQorIDxjb3B5cmlnaHQ+CisgPC9jb3B5cmlnaHQ+CisKKyAkSWQkCistLT4KKworPHBsdWdpbj4KKworICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgorICAgIDxwYWNrYWdlIAorICAgICAgIHVyaSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0LmVjb3JlIiAKKyAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5UcmFuc3BvcnRQYWNrYWdlIgorICAgICAgIGdlbk1vZGVsID0gIm1vZGVsL3RyYW5zcG9ydC5nZW5tb2RlbCIgLz4gCisgIDwvZXh0ZW5zaW9uPgorCis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9Mb2FkVW5sb2FkRWRnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L0xvYWRVbmxvYWRFZGdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZmZGI3YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9Mb2FkVW5sb2FkRWRnZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlOworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gZWRnZSBmb3IgdGhlIGxvYWRpbmcgYW5kIHVubG9hZGluZyBvZiBhIHBhY2tldCBzdHlsZSB0cmFuc3BvcnQgCisgKiBuZXR3b3JrLiAKKyAqIAorICogQGF1dGhvciBqbGVzc2xlcgorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTG9hZFVubG9hZEVkZ2UgZXh0ZW5kcyBNaWdyYXRpb25FZGdlIHsKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzZWdtZW50IG9mIHRoZSB0eXBlIFVSSSB0aGF0IHByZWZpeGVzIGFsbCBvdGhlciBzZWdtZW50cyBpbiBhCisJICogbWlncmF0aW9uIGVkZ2UgVVJJLgorCSAqLworCVN0cmluZyBVUklfVFlQRV9MT0FEVU5MT0FERURHRV9TRUdNRU5UID0gVVJJX1RZUEVfTUlHUkFUSU9OX0VER0VfU0VHTUVOVCArICIvbG9hZC11bmxvYWQiOworCQorCQorCS8qKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGxvYWRpbmcgZWRnZSwgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvdGhlcndpc2UuCisJICogCisJICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgorCSAqICovCisJYm9vbGVhbiBpc0xvYWRpbmdFZGdlKCk7CisJCisJCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuTG9hZFVubG9hZEVkZ2UjaXNMb2FkaW5nRWRnZSA8ZW0+TG9hZGluZyBFZGdlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2FkaW5nIEVkZ2U8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzTG9hZGluZ0VkZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldExvYWRpbmdFZGdlKGJvb2xlYW4gdmFsdWUpOworCisKKwkvKioKKwkgKiBHZXQgdGhlIGxhYmVsIGZvciB0aGlzIGVkZ2UuLi5tdXN0IGJlIGEgbG9hZC91bmxvYWQgZWRnZSBsYWJlbAorCSAqIAorCSAqIEByZXR1cm4gYW4gZWRnZSBsYWJlbCBzcGVjaWZ5aW5nIGNvbm5lY3Rpb24gdGltZXMsIGV0Yy4KKwkgKiAKKwkgKi8KKwlMb2FkVW5sb2FkRWRnZUxhYmVsIGdldExhYmVsKCk7CisJCisJLyoqCisJICogQHBhcmFtIGxibAorCSAqLworCXZvaWQgc2V0TGFiZWwoTG9hZFVubG9hZEVkZ2VMYWJlbCBsYmwpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L0xvYWRVbmxvYWRFZGdlTGFiZWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9Mb2FkVW5sb2FkRWRnZUxhYmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxYmI2MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9Mb2FkVW5sb2FkRWRnZUxhYmVsLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2VMYWJlbDsKKworLyoqCisgKiBMYWJlbCBmb3IgbG9hZGluZyBhbmQgdW5sb2FkaW5nIGVkZ2VzLiBIYXMgaW5mb3JtYXRpb24gYWJvdXQgY29ubmVjdGlvbiB0aW1lcywgZGlzY29ubmVjdGlvbiB0aW1lcywgZXRjLgorICogCisgKiBAYXV0aG9yIGpsZXNzbGVyCisgKgorICpAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBMb2FkVW5sb2FkRWRnZUxhYmVsIGV4dGVuZHMgTWlncmF0aW9uRWRnZUxhYmVsLCBEeW5hbWljTGFiZWwgeworCQkKKwkKKwkvKiogR2l2ZSB0aGVzZSBsYWJlbHMgYSBzcGVjaWFsIFVSSSAqLwkKKwlTdHJpbmcgVVJJX1RZUEVfTE9BRF9VTkxPQURfRURHRV9MQUJFTF9TRUdNRU5UID0gVVJJX1RZUEVfTUlHUkFUSU9OX1JFTEFUSU9OU0hJUF9MQUJFTF9TRUdNRU5UICsgIi9sb2FkVW5sb2FkIjsKKwkKKwkvKioKKwkgKiAKKwkgKi8KKwlVUkkgVVJJX1RZUEVfTE9BRF9VTkxPQURfRURHRV9MQUJFTCA9IFNURU1VUkkuY3JlYXRlVHlwZVVSSShVUklfVFlQRV9MT0FEX1VOTE9BRF9FREdFX0xBQkVMX1NFR01FTlQpOworCQorCS8qKgorCSAqIGdldCB0aGUgYWN0aXZhdGlvbiB0aW1lIGZvciB0aGlzIGVkZ2UsIHRoYXQgaXMgd2hlbiBsb2FkaW5nL3VubG9hZGluZyBzdGFydHMKKwkgKiBAcmV0dXJuIHRpbWUgb2YgYWN0aXZhdGlvbgorCSAqIAorCSAqIEBtb2RlbCovCisJU1RFTVRpbWUgZ2V0QWN0aXZhdGlvblRpbWUoKTsKKwkKKwkvKioKKwkgKiBHZXQgdGhlIGFjdGl2YXRlZCByYXRlLiBUaGUgcmF0ZSBvZiB0aGlzIGVkZ2Ugd2hlbiBub3QgYWN0aXZlIGlzIDAuIFRoaXMKKwkgKiByYXRlIGlzIGJhc2VkIG9uIHRoZSBjYXBhY2l0eSBvZiB0aGUgUGFja2V0VHJhbnNwb3J0U3lzdGVtIGJlaW5nIGxvYWRlZAorCSAqIG9yIHVubG9hZGVkLCBzbyBpdCBuZWVkcyB0byBiZSBub3JtYWxpemVkIGJlZm9yZSBiZWluZyBwYXNzZWQgb24gdG8gdGhlCisJICogZGlzZWFzZSBtb2RlbHMuCisJICogCisJICogQHJldHVybiB0aGUgcmF0ZSBvZiBsb2FkIG9yIHVubG9hZCBjb21wYXJlZCB0byB0aGUgcGFja2V0IHRyYW5zcG9ydAorCSAqICAgICAgICAgc3lzdGVtIHdoZW4gYWN0aXZhdGVkLgorCSAqIAorCSAqIEBtb2RlbAorCSAqLworCWRvdWJsZSBnZXRBY3RpdmF0ZWRSYXRlKCk7CisJCisJLyoqCisJICogR2V0cyB0aGUgYWN0aXZhdGVkIHJhdGUgbm9ybWFsaXplZCBmb3IgdGhlIHNpemUgb2YgdGhlIHBvcHVsYXRpb24gYmVpbmcKKwkgKiBsb2FkZWQvdW5sb2FkZWQuCisJICogCisJICogQHJldHVybiB0aGUgbm9ybWFsaXplZCByYXRlLgorCSAqLworCWRvdWJsZSBnZXROb3JtYWxpemVkQWN0aXZhdGVkUmF0ZSgpOworCQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LkxvYWRVbmxvYWRFZGdlTGFiZWwjZ2V0QWN0aXZhdGVkUmF0ZSA8ZW0+QWN0aXZhdGVkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2YXRlZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRBY3RpdmF0ZWRSYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRBY3RpdmF0ZWRSYXRlKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5Mb2FkVW5sb2FkRWRnZUxhYmVsI2dldEFjdGl2YXRpb25UaW1lIDxlbT5BY3RpdmF0aW9uIFRpbWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gVGltZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QWN0aXZhdGlvblRpbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEFjdGl2YXRpb25UaW1lKFNURU1UaW1lIHZhbHVlKTsKKworCisJLyoqCisJICogR2V0IHRoZSBkZWFjdGl2YXRpb24gdGltZSBmb3IgdGhpcyBlZGdlLCB0aGF0IGlzIHdoZW4gbG9hZGluZy91bmxvYWRpbmcKKwkgKiBlbmRzLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHRpbWUgb2YgZGVhY3RpdmF0aW9uCisJICogCisJICogQG1vZGVsCisJICovCisJU1RFTVRpbWUgZ2V0RGVhY3RpdmF0aW9uVGltZSgpOworCisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5Mb2FkVW5sb2FkRWRnZUxhYmVsI2dldERlYWN0aXZhdGlvblRpbWUgPGVtPkRlYWN0aXZhdGlvbiBUaW1lPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWFjdGl2YXRpb24gVGltZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0RGVhY3RpdmF0aW9uVGltZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RGVhY3RpdmF0aW9uVGltZShTVEVNVGltZSB2YWx1ZSk7CisJCisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNTFkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0uamF2YQpAQCAtMCwwICsxLDgwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworCisvKioKKyAqIFBhY2tldCBzdHlsZSB0cmFuc3BvcnQgc3lzdGVtcyBoYXZlIGR5bmFtaWMgZWRnZXMgY29ubmVjdGluZworICogdGhlbSB0byBkaWZmZXJlbnQgYXJlYXMuIFRoZXkgcmVtYWluIGNvbm5lY3RlZCBmb3IgYSB3aGlsZSwgaGF2aW5nIAorICogb25seSBhbiBpbmZsdXggb2YgcG9wdWxhdGlvbiAodGhlIGxvYWRpbmcgcGhhc2UpLCB0aGVuIGFyZQorICogZGlzY29ubmVjdGVkIGZvciBhIHNtYWxsIHBlcmlvZCAodGhlIHRyYW5zcG9ydCBwaGFzZSksIGFuZCBmaW5hbGx5CisgKiBhcmUgY29ubmVjdGVkIHRvIGEgZGVzdGluYXRpb24gZm9yIGEgZGVmaW5lZCBwZXJpb2QgKHRoZSB1bmxvYWRpbmcgcGhhc2UpCisgKiAKKyAqIEBhdXRob3Igamxlc3NsZXIKKyAqCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSBleHRlbmRzIFRyYW5zcG9ydFN5c3RlbSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlTdHJpbmcgVVJJX1RZUEVfUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU0gPSBVUklfVFlQRV9UUkFOU1BPUlRfU1lTVEVNX05PREVfU0VHTUVOVCAKKwkrICIvcGFja2V0IjsKKwkKKwkvKioKKwkgKiBUaGlzIGdpdmUgYSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYmVoYXZpb3Igb2YgdGhpcyB0cmFuc3BvcnQgc3lzdGVtCisJICogCisJICogQHJldHVybiBhIGxhYmVsIGRlc2NyaWJpbmcgdGhpcyBzeXN0ZW0KKwkgKiAKKwkgKiBAbW9kZWwKKwkgKi8KKwlQYWNrZXRUcmFuc3BvcnRMYWJlbCBnZXRQYWNrZXRUcmFuc3BvcnRMYWJlbCAoKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSNnZXRQYWNrZXRUcmFuc3BvcnRMYWJlbCA8ZW0+UGFja2V0IFRyYW5zcG9ydCBMYWJlbDwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFja2V0IFRyYW5zcG9ydCBMYWJlbDwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UGFja2V0VHJhbnNwb3J0TGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFBhY2tldFRyYW5zcG9ydExhYmVsKFBhY2tldFRyYW5zcG9ydExhYmVsIHZhbHVlKTsKKworCS8qKgorCSAqIEdldHMgdGhlIHNlcmllcyBvZiBlZGdlcyB0aGF0IHRoZSBwYWNrZXQgdHJhbnNwb3J0IHN5c3RlbSB3aWxsIHVzZSB0bworCSAqIGxvYWQgdGhlIHN5c3RlbS4gVGhpcyBpcyBhIGxpc3Qgb2YgbWlncmF0aW9uIGVkZ2VzIHRoYXQgd2lsbCBiZSBtYWRlCisJICogYWN0aXZlIGF0IHRoZSBzcGVjaWZpZWQgdGltZXMgaW4gdGhhdCBlZGdlLgorCSAqIAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIG1pZ3JhdGlvbiBlZGdlcworCSAqIAorCSAqIEBtb2RlbAorCSAqLworCUVMaXN0PExvYWRVbmxvYWRFZGdlPiBnZXRMb2FkaW5nRWRnZXMoKTsKKwkJCQorCQorCS8qKgorCSAqIEdldHMgdGhlIHNlcmllcyBvZiBlZGdlcyB0aGF0IHRoZSBwYWNrZXQgdHJhbnNwb3J0IHN5c3RlbSB3aWxsIHVzZSB0bworCSAqIHVubG9hZCB0aGUgc3lzdGVtLiBUaGlzIGlzIGEgbGlzdCBvZiBtaWdyYXRpb24gZWRnZXMgdGhhdCB3aWxsIGJlIG1hZGUKKwkgKiBhY3RpdmUgYXQgdGhlIHNwZWNpZmllZCB0aW1lcyBpbiB0aGF0IGVkZ2UuCisJICogCisJICogQHJldHVybiBhIGxpc3Qgb2YgbWlncmF0aW9uIGVkZ2VzCisJICogCisJICogQG1vZGVsCisJICovCisJRUxpc3Q8TG9hZFVubG9hZEVkZ2U+IGdldFVubG9hZGluZ0VkZ2VzKCk7CisJCQorCQorfQorCQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L1BhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDMyODU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L1BhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9yLmphdmEKQEAgLTAsMCArMSwzMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRWRnZURlY29yYXRvcjsKKworLyoqCisgKiAKKyAqIERlY29yYXRvciBmb3IgcGFja2V0IHN0eWxlIHRyYW5zcG9ydCBzeXN0ZW1zLiBSZXNwb25zaWJsZSBmb3Igc2V0dGluZyB0aGVpciAKKyAqIGVkZ2UgY29ubmVjdGlvbnMsIGV0Yy4sIGJhc2VkIHVwb24gdGhlIGN1cnJlbnQgdGltZS4gVGhlIG1lYW50IHRoYXQgdGhlCisgKiBkZWNvcmF0b3Igd2lsbCBtYWtlIHN1cmUgdGhlIGNvcnJlY3QgbG9hZC91bmxvYWQgZWRnZXMgYXJlIHplcm9lZCBvdXQgb3IKKyAqIGFjdGl2ZSBhdCB0aGUgY29ycmVjdCB0aW1lcy4KKyAqCisgKiAKKyAqIEBhdXRob3Igamxlc3NsZXIKKyAqCisgKiBAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvciBleHRlbmRzIEVkZ2VEZWNvcmF0b3IgeworCS8vIEVtcHR5CQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L1BhY2tldFRyYW5zcG9ydExhYmVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvUGFja2V0VHJhbnNwb3J0TGFiZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWYyYjY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L1BhY2tldFRyYW5zcG9ydExhYmVsLmphdmEKQEAgLTAsMCArMSwzNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworCisvKioKKyAqIExhYmVsIGZvciBhIHBhY2tldCB0cmFuc3BvcnQuIFJpZ2h0IG5vdyBvbmx5IHByb3ZpZGVzIGEgY2FwYWNpdHkuCisgKiAKKyAqIEBhdXRob3Igamxlc3NsZXIKKyAqIAorICogQG1vZGVsCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGFja2V0VHJhbnNwb3J0TGFiZWwgZXh0ZW5kcyBOb2RlTGFiZWwgeworCisJLyoqCisJICogTWFrZSB0aGUgY3VycmVudCB2YWx1ZSBzdHVmZiBoYXZlIHRvIGJlIFBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWVzCisJICogQHJldHVybiBUT0RPCisJICovCisJUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZSBnZXRDdXJyZW50VmFsdWUoKTsKKworCS8qKgorCSAqIEBwYXJhbSB2YWwKKwkgKi8KKwl2b2lkIHNldEN1cnJlbnRWYWx1ZShQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlIHZhbCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L1BhY2tldFRyYW5zcG9ydExhYmVsVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjA3ZWY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L1BhY2tldFRyYW5zcG9ydExhYmVsVmFsdWUuamF2YQpAQCAtMCwwICsxLDQzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworCisvKioKKyAqIFRoZSB2YWx1ZSBmb3IgdGhlIHBhY2tldCB0cmFuc3BvcnQgbGFiZWwuIFRoaXMgaGFzIGEgY2FwYWNpdHksIGluZGljYXRpbmcgaG93IGJpZyB0aGUgc3lzdGVtIGlzLgorICogCisgKiBAYXV0aG9yIGpsZXNzbGVyCisgKgorICpAbW9kZWwKKyAqLworcHVibGljIGludGVyZmFjZSBQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlIGV4dGVuZHMgTGFiZWxWYWx1ZSB7CisKKwkvKioKKwkgKiBHZXQgdGhlIGNhcGFjaXR5IGZvciB0aGUgbmV0d29yaworCSAqIAorCSAqIEByZXR1cm4gdGhlIGNhcGFjaXR5IG9mIHRoZSBuZXR3b3JrICh1bml0cz8pCisJICogQG1vZGVsIGRlZmF1bHQ9MTAwLjAKKwkgKi8KKwlkb3VibGUgZ2V0Q2FwYWNpdHkoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWUjZ2V0Q2FwYWNpdHkgPGVtPkNhcGFjaXR5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXBhY2l0eTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0Q2FwYWNpdHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldENhcGFjaXR5KGRvdWJsZSB2YWx1ZSk7CisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlYWM1NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9QaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW0uamF2YQpAQCAtMCwwICsxLDk1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworLyoqCisgKiBBIHBpcGUgc3R5bGUgdHJhbnNwb3J0IHN5c3RlbSBpcyBtdWNoIGxpa2UgYSBnZW9ncmFwaGljYWwgcmVnaW9uLiBEaXNlYXNlCisgKiBwcm9jZXNzZXMgd29yayB3aXRoaW4gdGhlIHN5c3RlbSBiYXNlZCBvbiBpdHMgb24gcG9wdWxhdGlvbiBkZW5zaXR5LCBldGMuIEl0CisgKiBpcyBjb25uZWN0ZWQgdG8gdGhlIGdlb2dyYXBoaWNhbCBhcmVhcyBpdCBsaW5rcyBieSBhIHNlcmllcyBvZiBib3RoIGluCisgKiBtaWdyYXRpb24gYW5kIG91dCBtaWdyYXRpb24gZWRnZXMuIFRoZSBzdW0gb2YgdGhlIHJhdGVzIG9mIG91dCBtaWdyYXRpb24gb24KKyAqIHRoZSBvdXQgbWlncmF0aW9uIGVkZ2VzIHNob3VsZCBzb21lIHRvIHRoZSBhdmVyYWdlIHRpbWUgdGhhdCBhbiBpbmRpdmlkdWFsCisgKiBzcGVuZHMgd2l0aGluIHRoZSB0cmFuc3BvcnQgc3lzdGVtLgorICogCisgKiBAYXV0aG9yIGpsZXNzbGVyCisgKiAKKyAqIEBtb2RlbAorICogCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtIGV4dGVuZHMgVHJhbnNwb3J0U3lzdGVtIHsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluIFRyYW5zcG9ydCBFZGdlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVUcmFuc3BvcnRFZGdlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluIFRyYW5zcG9ydCBFZGdlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluIFRyYW5zcG9ydCBFZGdlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlRyYW5zcG9ydFBhY2thZ2UjZ2V0UGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtX0luVHJhbnNwb3J0RWRnZXMoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxQaXBlVHJhbnNwb3J0RWRnZT4gZ2V0SW5UcmFuc3BvcnRFZGdlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0IFRyYW5zcG9ydCBFZGdlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVUcmFuc3BvcnRFZGdlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk91dCBUcmFuc3BvcnQgRWRnZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXQgVHJhbnNwb3J0IEVkZ2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuVHJhbnNwb3J0UGFja2FnZSNnZXRQaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW1fT3V0VHJhbnNwb3J0RWRnZXMoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxQaXBlVHJhbnNwb3J0RWRnZT4gZ2V0T3V0VHJhbnNwb3J0RWRnZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1heCBDYXBhY2l0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWF4IENhcGFjaXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1heCBDYXBhY2l0eTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TWF4Q2FwYWNpdHkoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuVHJhbnNwb3J0UGFja2FnZSNnZXRQaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW1fTWF4Q2FwYWNpdHkoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0TWF4Q2FwYWNpdHkoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbSNnZXRNYXhDYXBhY2l0eSA8ZW0+TWF4IENhcGFjaXR5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXggQ2FwYWNpdHk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1heENhcGFjaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNYXhDYXBhY2l0eShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogCisJICovCisJU3RyaW5nIFVSSV9UWVBFX1BJUEVfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTSA9IFVSSV9UWVBFX1RSQU5TUE9SVF9TWVNURU1fTk9ERV9TRUdNRU5UCisJCQkrICIvcGlwZSI7CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9QaXBlVHJhbnNwb3J0RWRnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L1BpcGVUcmFuc3BvcnRFZGdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiMDNhMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9QaXBlVHJhbnNwb3J0RWRnZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5Qb3B1bGF0aW9uRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGlwZSBUcmFuc3BvcnQgRWRnZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5UcmFuc3BvcnRQYWNrYWdlI2dldFBpcGVUcmFuc3BvcnRFZGdlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFBpcGVUcmFuc3BvcnRFZGdlIGV4dGVuZHMgUG9wdWxhdGlvbkVkZ2UgeworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHNlZ21lbnQgb2YgdGhlIHR5cGUgVVJJIHRoYXQgcHJlZml4ZXMgYWxsIG90aGVyIHNlZ21lbnRzIGluIGEKKwkgKiBwaXBlIHRyYW5zcG9ydCBlZGdlIFVSSS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIFVSSV9UWVBFX1BJUEVfVFJBTlNQT1JUX0VER0VfU0VHTUVOVCA9IFVSSV9UWVBFX0VER0VfU0VHTUVOVCArICIvcGlwZXRyYW5zcG9ydCI7CisKK30gLy8gUGlwZVRyYW5zcG9ydEVkZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9QaXBlVHJhbnNwb3J0RWRnZUxhYmVsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0Y2EzZDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGlwZSBUcmFuc3BvcnQgRWRnZSBMYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5UcmFuc3BvcnRQYWNrYWdlI2dldFBpcGVUcmFuc3BvcnRFZGdlTGFiZWwoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbCBleHRlbmRzIEVkZ2VMYWJlbCB7CisJLy8gTm90aGluZworfSAvLyBQaXBlVHJhbnNwb3J0RWRnZUxhYmVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5ZDM2NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9QaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUuamF2YQpAQCAtMCwwICsxLDg2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QaXBlIFRyYW5zcG9ydCBFZGdlIExhYmVsIFZhbHVlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSNnZXRNYXhGbG93IDxlbT5NYXggRmxvdzwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlI2dldFRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5UcmFuc3BvcnRQYWNrYWdlI2dldFBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUgZXh0ZW5kcyBMYWJlbFZhbHVlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXggRmxvdzwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWF4IEZsb3c8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWF4IEZsb3c8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE1heEZsb3coZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuVHJhbnNwb3J0UGFja2FnZSNnZXRQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWVfTWF4RmxvdygpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRNYXhGbG93KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUjZ2V0TWF4RmxvdyA8ZW0+TWF4IEZsb3c8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1heCBGbG93PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRNYXhGbG93KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNYXhGbG93KGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFRpbWVQZXJpb2QobG9uZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlRyYW5zcG9ydFBhY2thZ2UjZ2V0UGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlX1RpbWVQZXJpb2QoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlsb25nIGdldFRpbWVQZXJpb2QoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSNnZXRUaW1lUGVyaW9kIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFRpbWVQZXJpb2QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRpbWVQZXJpb2QobG9uZyB2YWx1ZSk7CisKK30gLy8gUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhdWUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9QaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmF1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNDU2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhdWUuamF2YQpAQCAtMCwwICsxLDU3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QaXBlIFRyYW5zcG9ydCBFZGdlIExhYmVsIFZhdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhdWUjZ2V0TWF4RmxvdyA8ZW0+TWF4IEZsb3c8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmF1ZSBleHRlbmRzIExhYmVsVmFsdWUgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1heCBGbG93PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXggRmxvdzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXggRmxvdzwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TWF4Rmxvdyhkb3VibGUpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRNYXhGbG93KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmF1ZSNnZXRNYXhGbG93IDxlbT5NYXggRmxvdzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWF4IEZsb3c8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1heEZsb3coKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1heEZsb3coZG91YmxlIHZhbHVlKTsKKworfSAvLyBQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmF1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L1RyYW5zcG9ydEZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9UcmFuc3BvcnRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiYWQ5MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9UcmFuc3BvcnRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMzIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlRyYW5zcG9ydFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBUcmFuc3BvcnRGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgeworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVHJhbnNwb3J0RmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlRyYW5zcG9ydEZhY3RvcnlJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TG9hZCBVbmxvYWQgRWRnZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TG9hZCBVbmxvYWQgRWRnZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTG9hZFVubG9hZEVkZ2UgY3JlYXRlTG9hZFVubG9hZEVkZ2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TG9hZCBVbmxvYWQgRWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TG9hZCBVbmxvYWQgRWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTG9hZFVubG9hZEVkZ2VMYWJlbCBjcmVhdGVMb2FkVW5sb2FkRWRnZUxhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhY2tldCBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYWNrZXQgU3R5bGUgVHJhbnNwb3J0IFN5c3RlbTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0gY3JlYXRlUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0oKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFja2V0IFRyYW5zcG9ydCBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFja2V0IFRyYW5zcG9ydCBMYWJlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGFja2V0VHJhbnNwb3J0TGFiZWwgY3JlYXRlUGFja2V0VHJhbnNwb3J0TGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGlwZSBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QaXBlIFN0eWxlIFRyYW5zcG9ydCBTeXN0ZW08L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbSBjcmVhdGVQaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW0oKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFja2V0IFRyYW5zcG9ydCBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFja2V0IFRyYW5zcG9ydCBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZSBjcmVhdGVQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhY2tldCBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtIERlY29yYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFja2V0IFN0eWxlIFRyYW5zcG9ydCBTeXN0ZW0gRGVjb3JhdG9yPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvciBjcmVhdGVQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QaXBlIFRyYW5zcG9ydCBFZGdlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QaXBlIFRyYW5zcG9ydCBFZGdlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQaXBlVHJhbnNwb3J0RWRnZSBjcmVhdGVQaXBlVHJhbnNwb3J0RWRnZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QaXBlIFRyYW5zcG9ydCBFZGdlIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QaXBlIFRyYW5zcG9ydCBFZGdlIExhYmVsPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQaXBlVHJhbnNwb3J0RWRnZUxhYmVsIGNyZWF0ZVBpcGVUcmFuc3BvcnRFZGdlTGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGlwZSBUcmFuc3BvcnQgRWRnZSBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGlwZSBUcmFuc3BvcnQgRWRnZSBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlIGNyZWF0ZVBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUcmFuc3BvcnRQYWNrYWdlIGdldFRyYW5zcG9ydFBhY2thZ2UoKTsKKworfSAvL1RyYW5zcG9ydEZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9UcmFuc3BvcnRQYWNrYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvVHJhbnNwb3J0UGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMDFjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvVHJhbnNwb3J0UGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsMTQ5NiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlRyYW5zcG9ydEZhY3RvcnkKKyAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRyYW5zcG9ydFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7CisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5BTUUgPSAidHJhbnNwb3J0IjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC5lY29yZSI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydCI7CisKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVRyYW5zcG9ydFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5UcmFuc3BvcnRQYWNrYWdlSW1wbC5pbml0KCk7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuTG9hZFVubG9hZEVkZ2VJbXBsIDxlbT5Mb2FkIFVubG9hZCBFZGdlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5Mb2FkVW5sb2FkRWRnZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuVHJhbnNwb3J0UGFja2FnZUltcGwjZ2V0TG9hZFVubG9hZEVkZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgTE9BRF9VTkxPQURfRURHRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9BRF9VTkxPQURfRURHRV9fVVJJID0gRWRnZXNQYWNrYWdlLk1JR1JBVElPTl9FREdFX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT0FEX1VOTE9BRF9FREdFX19UWVBFX1VSSSA9IEVkZ2VzUGFja2FnZS5NSUdSQVRJT05fRURHRV9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT0FEX1VOTE9BRF9FREdFX19EVUJMSU5fQ09SRSA9IEVkZ2VzUGFja2FnZS5NSUdSQVRJT05fRURHRV9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPQURfVU5MT0FEX0VER0VfX0EgPSBFZGdlc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfX0E7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZSBBVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9BRF9VTkxPQURfRURHRV9fTk9ERV9BVVJJID0gRWRnZXNQYWNrYWdlLk1JR1JBVElPTl9FREdFX19OT0RFX0FVUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPQURfVU5MT0FEX0VER0VfX0IgPSBFZGdlc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfX0I7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZSBCVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9BRF9VTkxPQURfRURHRV9fTk9ERV9CVVJJID0gRWRnZXNQYWNrYWdlLk1JR1JBVElPTl9FREdFX19OT0RFX0JVUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT0FEX1VOTE9BRF9FREdFX19MQUJFTCA9IEVkZ2VzUGFja2FnZS5NSUdSQVRJT05fRURHRV9fTEFCRUw7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlyZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT0FEX1VOTE9BRF9FREdFX19ESVJFQ1RFRCA9IEVkZ2VzUGFja2FnZS5NSUdSQVRJT05fRURHRV9fRElSRUNURUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9wdWxhdGlvbiBJZGVudGlmaWVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9BRF9VTkxPQURfRURHRV9fUE9QVUxBVElPTl9JREVOVElGSUVSID0gRWRnZXNQYWNrYWdlLk1JR1JBVElPTl9FREdFX19QT1BVTEFUSU9OX0lERU5USUZJRVI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9hZGluZyBFZGdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9BRF9VTkxPQURfRURHRV9fTE9BRElOR19FREdFID0gRWRnZXNQYWNrYWdlLk1JR1JBVElPTl9FREdFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvYWQgVW5sb2FkIEVkZ2U8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9BRF9VTkxPQURfRURHRV9GRUFUVVJFX0NPVU5UID0gRWRnZXNQYWNrYWdlLk1JR1JBVElPTl9FREdFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLkxvYWRVbmxvYWRFZGdlTGFiZWxJbXBsIDxlbT5Mb2FkIFVubG9hZCBFZGdlIExhYmVsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5Mb2FkVW5sb2FkRWRnZUxhYmVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5UcmFuc3BvcnRQYWNrYWdlSW1wbCNnZXRMb2FkVW5sb2FkRWRnZUxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IExPQURfVU5MT0FEX0VER0VfTEFCRUwgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPQURfVU5MT0FEX0VER0VfTEFCRUxfX1VSSSA9IEVkZ2VzUGFja2FnZS5NSUdSQVRJT05fRURHRV9MQUJFTF9fVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fVFlQRV9VUkkgPSBFZGdlc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfTEFCRUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fRFVCTElOX0NPUkUgPSBFZGdlc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfTEFCRUxfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSSBPZiBJZGVudGlmaWFibGUgVG8gQmUgTGFiZWxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPQURfVU5MT0FEX0VER0VfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCA9IEVkZ2VzUGFja2FnZS5NSUdSQVRJT05fRURHRV9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1cnJlbnQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT0FEX1VOTE9BRF9FREdFX0xBQkVMX19DVVJSRU5UX1ZBTFVFID0gRWRnZXNQYWNrYWdlLk1JR1JBVElPTl9FREdFX0xBQkVMX19DVVJSRU5UX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkZW50aWZpYWJsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPQURfVU5MT0FEX0VER0VfTEFCRUxfX0lERU5USUZJQUJMRSA9IEVkZ2VzUGFja2FnZS5NSUdSQVRJT05fRURHRV9MQUJFTF9fSURFTlRJRklBQkxFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVkZ2U8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fRURHRSA9IEVkZ2VzUGFja2FnZS5NSUdSQVRJT05fRURHRV9MQUJFTF9fRURHRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlIFZhbGlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fTkVYVF9WQUxVRV9WQUxJRCA9IEVkZ2VzUGFja2FnZS5NSUdSQVRJT05fRURHRV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXh0IFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fTkVYVF9WQUxVRSA9IEVkZ2VzUGFja2FnZS5NSUdSQVRJT05fRURHRV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWNvcmF0b3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT0FEX1VOTE9BRF9FREdFX0xBQkVMX19ERUNPUkFUT1IgPSBFZGdlc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBUaW1lPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fQUNUSVZBVElPTl9USU1FID0gRWRnZXNQYWNrYWdlLk1JR1JBVElPTl9FREdFX0xBQkVMX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlYWN0aXZhdGlvbiBUaW1lPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fREVBQ1RJVkFUSU9OX1RJTUUgPSBFZGdlc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfTEFCRUxfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZhdGVkIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMT0FEX1VOTE9BRF9FREdFX0xBQkVMX19BQ1RJVkFURURfUkFURSA9IEVkZ2VzUGFja2FnZS5NSUdSQVRJT05fRURHRV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Mb2FkIFVubG9hZCBFZGdlIExhYmVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExPQURfVU5MT0FEX0VER0VfTEFCRUxfRkVBVFVSRV9DT1VOVCA9IEVkZ2VzUGFja2FnZS5NSUdSQVRJT05fRURHRV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgNjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5UcmFuc3BvcnRTeXN0ZW1JbXBsIDxlbT5TeXN0ZW08L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlRyYW5zcG9ydFN5c3RlbUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuVHJhbnNwb3J0UGFja2FnZUltcGwjZ2V0VHJhbnNwb3J0U3lzdGVtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRSQU5TUE9SVF9TWVNURU0gPSA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRSQU5TUE9SVF9TWVNURU1fX1VSSSA9IEdyYXBoUGFja2FnZS5OT0RFX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUUkFOU1BPUlRfU1lTVEVNX19UWVBFX1VSSSA9IEdyYXBoUGFja2FnZS5OT0RFX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRSQU5TUE9SVF9TWVNURU1fX0RVQkxJTl9DT1JFID0gR3JhcGhQYWNrYWdlLk5PREVfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVkZ2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUUkFOU1BPUlRfU1lTVEVNX19FREdFUyA9IEdyYXBoUGFja2FnZS5OT0RFX19FREdFUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRSQU5TUE9SVF9TWVNURU1fX0xBQkVMUyA9IEdyYXBoUGFja2FnZS5OT0RFX19MQUJFTFM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U3lzdGVtPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRSQU5TUE9SVF9TWVNURU1fRkVBVFVSRV9DT1VOVCA9IEdyYXBoUGFja2FnZS5OT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtSW1wbCA8ZW0+UGFja2V0IFN0eWxlIFRyYW5zcG9ydCBTeXN0ZW08L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5UcmFuc3BvcnRQYWNrYWdlSW1wbCNnZXRQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBQQUNLRVRfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTSA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX1VSSSA9IFRSQU5TUE9SVF9TWVNURU1fX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19UWVBFX1VSSSA9IFRSQU5TUE9SVF9TWVNURU1fX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX0RVQkxJTl9DT1JFID0gVFJBTlNQT1JUX1NZU1RFTV9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWRnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19FREdFUyA9IFRSQU5TUE9SVF9TWVNURU1fX0VER0VTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX0xBQkVMUyA9IFRSQU5TUE9SVF9TWVNURU1fX0xBQkVMUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWNrZXQgVHJhbnNwb3J0IExhYmVsPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX1BBQ0tFVF9UUkFOU1BPUlRfTEFCRUwgPSBUUkFOU1BPUlRfU1lTVEVNX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYWRpbmcgRWRnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19MT0FESU5HX0VER0VTID0gVFJBTlNQT1JUX1NZU1RFTV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmxvYWRpbmcgRWRnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19VTkxPQURJTkdfRURHRVMgPSBUUkFOU1BPUlRfU1lTVEVNX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhY2tldCBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX0ZFQVRVUkVfQ09VTlQgPSBUUkFOU1BPUlRfU1lTVEVNX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlBhY2tldFRyYW5zcG9ydExhYmVsSW1wbCA8ZW0+UGFja2V0IFRyYW5zcG9ydCBMYWJlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuUGFja2V0VHJhbnNwb3J0TGFiZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlRyYW5zcG9ydFBhY2thZ2VJbXBsI2dldFBhY2tldFRyYW5zcG9ydExhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBBQ0tFVF9UUkFOU1BPUlRfTEFCRUwgPSAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBQ0tFVF9UUkFOU1BPUlRfTEFCRUxfX1VSSSA9IEdyYXBoUGFja2FnZS5OT0RFX0xBQkVMX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUNLRVRfVFJBTlNQT1JUX0xBQkVMX19UWVBFX1VSSSA9IEdyYXBoUGFja2FnZS5OT0RFX0xBQkVMX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBQ0tFVF9UUkFOU1BPUlRfTEFCRUxfX0RVQkxJTl9DT1JFID0gR3JhcGhQYWNrYWdlLk5PREVfTEFCRUxfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSSBPZiBJZGVudGlmaWFibGUgVG8gQmUgTGFiZWxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBQ0tFVF9UUkFOU1BPUlRfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRCA9IEdyYXBoUGFja2FnZS5OT0RFX0xBQkVMX19VUklfT0ZfSURFTlRJRklBQkxFX1RPX0JFX0xBQkVMRUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBQ0tFVF9UUkFOU1BPUlRfTEFCRUxfX0NVUlJFTlRfVkFMVUUgPSBHcmFwaFBhY2thZ2UuTk9ERV9MQUJFTF9fQ1VSUkVOVF9WQUxVRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZGVudGlmaWFibGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUNLRVRfVFJBTlNQT1JUX0xBQkVMX19JREVOVElGSUFCTEUgPSBHcmFwaFBhY2thZ2UuTk9ERV9MQUJFTF9fSURFTlRJRklBQkxFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUNLRVRfVFJBTlNQT1JUX0xBQkVMX19OT0RFID0gR3JhcGhQYWNrYWdlLk5PREVfTEFCRUxfX05PREU7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGFja2V0IFRyYW5zcG9ydCBMYWJlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUNLRVRfVFJBTlNQT1JUX0xBQkVMX0ZFQVRVUkVfQ09VTlQgPSBHcmFwaFBhY2thZ2UuTk9ERV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5QaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW1JbXBsIDxlbT5QaXBlIFN0eWxlIFRyYW5zcG9ydCBTeXN0ZW08L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuVHJhbnNwb3J0UGFja2FnZUltcGwjZ2V0UGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBJUEVfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTSA9IDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUElQRV9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19VUkkgPSBUUkFOU1BPUlRfU1lTVEVNX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQSVBFX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX1RZUEVfVVJJID0gVFJBTlNQT1JUX1NZU1RFTV9fVFlQRV9VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVibGluIENvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQSVBFX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX0RVQkxJTl9DT1JFID0gVFJBTlNQT1JUX1NZU1RFTV9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWRnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBJUEVfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9fRURHRVMgPSBUUkFOU1BPUlRfU1lTVEVNX19FREdFUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBJUEVfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9fTEFCRUxTID0gVFJBTlNQT1JUX1NZU1RFTV9fTEFCRUxTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluIFRyYW5zcG9ydCBFZGdlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUElQRV9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19JTl9UUkFOU1BPUlRfRURHRVMgPSBUUkFOU1BPUlRfU1lTVEVNX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dCBUcmFuc3BvcnQgRWRnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBJUEVfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9fT1VUX1RSQU5TUE9SVF9FREdFUyA9IFRSQU5TUE9SVF9TWVNURU1fRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWF4IENhcGFjaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUElQRV9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19NQVhfQ0FQQUNJVFkgPSBUUkFOU1BPUlRfU1lTVEVNX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBpcGUgU3R5bGUgVHJhbnNwb3J0IFN5c3RlbTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQSVBFX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fRkVBVFVSRV9DT1VOVCA9IFRSQU5TUE9SVF9TWVNURU1fRkVBVFVSRV9DT1VOVCArIDM7CisKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5QYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlSW1wbCA8ZW0+UGFja2V0IFRyYW5zcG9ydCBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuVHJhbnNwb3J0UGFja2FnZUltcGwjZ2V0UGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBQQUNLRVRfVFJBTlNQT1JUX0xBQkVMX1ZBTFVFID0gNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXBhY2l0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBQ0tFVF9UUkFOU1BPUlRfTEFCRUxfVkFMVUVfX0NBUEFDSVRZID0gR3JhcGhQYWNrYWdlLkxBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhY2tldCBUcmFuc3BvcnQgTGFiZWwgVmFsdWU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFDS0VUX1RSQU5TUE9SVF9MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UID0gR3JhcGhQYWNrYWdlLkxBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3JJbXBsIDxlbT5QYWNrZXQgU3R5bGUgVHJhbnNwb3J0IFN5c3RlbSBEZWNvcmF0b3I8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9ySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5UcmFuc3BvcnRQYWNrYWdlSW1wbCNnZXRQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBQQUNLRVRfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9ERUNPUkFUT1IgPSA3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX0RFQ09SQVRPUl9fVVJJID0gTW9kZWxQYWNrYWdlLkVER0VfREVDT1JBVE9SX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUNLRVRfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9ERUNPUkFUT1JfX1RZUEVfVVJJID0gTW9kZWxQYWNrYWdlLkVER0VfREVDT1JBVE9SX19UWVBFX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdWJsaW4gQ29yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX0RFQ09SQVRPUl9fRFVCTElOX0NPUkUgPSBNb2RlbFBhY2thZ2UuRURHRV9ERUNPUkFUT1JfX0RVQkxJTl9DT1JFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVscyBUbyBVcGRhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX0RFQ09SQVRPUl9fTEFCRUxTX1RPX1VQREFURSA9IE1vZGVsUGFja2FnZS5FREdFX0RFQ09SQVRPUl9fTEFCRUxTX1RPX1VQREFURTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUNLRVRfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9ERUNPUkFUT1JfX0dSQVBIID0gTW9kZWxQYWNrYWdlLkVER0VfREVDT1JBVE9SX19HUkFQSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fREVDT1JBVE9SX19FTkFCTEVEID0gTW9kZWxQYWNrYWdlLkVER0VfREVDT1JBVE9SX19FTkFCTEVEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIERlY29yYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX0RFQ09SQVRPUl9fR1JBUEhfREVDT1JBVEVEID0gTW9kZWxQYWNrYWdlLkVER0VfREVDT1JBVE9SX19HUkFQSF9ERUNPUkFURUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3Jlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUNLRVRfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9ERUNPUkFUT1JfX1BST0dSRVNTID0gTW9kZWxQYWNrYWdlLkVER0VfREVDT1JBVE9SX19QUk9HUkVTUzsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QYWNrZXQgU3R5bGUgVHJhbnNwb3J0IFN5c3RlbSBEZWNvcmF0b3I8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgPSBNb2RlbFBhY2thZ2UuRURHRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDA7CisKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5QaXBlVHJhbnNwb3J0RWRnZUltcGwgPGVtPlBpcGUgVHJhbnNwb3J0IEVkZ2U8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlBpcGVUcmFuc3BvcnRFZGdlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5UcmFuc3BvcnRQYWNrYWdlSW1wbCNnZXRQaXBlVHJhbnNwb3J0RWRnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBQSVBFX1RSQU5TUE9SVF9FREdFID0gODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQSVBFX1RSQU5TUE9SVF9FREdFX19VUkkgPSBFZGdlc1BhY2thZ2UuUE9QVUxBVElPTl9FREdFX19VUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQSVBFX1RSQU5TUE9SVF9FREdFX19UWVBFX1VSSSA9IEVkZ2VzUGFja2FnZS5QT1BVTEFUSU9OX0VER0VfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUElQRV9UUkFOU1BPUlRfRURHRV9fRFVCTElOX0NPUkUgPSBFZGdlc1BhY2thZ2UuUE9QVUxBVElPTl9FREdFX19EVUJMSU5fQ09SRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUElQRV9UUkFOU1BPUlRfRURHRV9fQSA9IEVkZ2VzUGFja2FnZS5QT1BVTEFUSU9OX0VER0VfX0E7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZSBBVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUElQRV9UUkFOU1BPUlRfRURHRV9fTk9ERV9BVVJJID0gRWRnZXNQYWNrYWdlLlBPUFVMQVRJT05fRURHRV9fTk9ERV9BVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQSVBFX1RSQU5TUE9SVF9FREdFX19CID0gRWRnZXNQYWNrYWdlLlBPUFVMQVRJT05fRURHRV9fQjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlIEJVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQSVBFX1RSQU5TUE9SVF9FREdFX19OT0RFX0JVUkkgPSBFZGdlc1BhY2thZ2UuUE9QVUxBVElPTl9FREdFX19OT0RFX0JVUkk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQSVBFX1RSQU5TUE9SVF9FREdFX19MQUJFTCA9IEVkZ2VzUGFja2FnZS5QT1BVTEFUSU9OX0VER0VfX0xBQkVMOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUElQRV9UUkFOU1BPUlRfRURHRV9fRElSRUNURUQgPSBFZGdlc1BhY2thZ2UuUE9QVUxBVElPTl9FREdFX19ESVJFQ1RFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3B1bGF0aW9uIElkZW50aWZpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQSVBFX1RSQU5TUE9SVF9FREdFX19QT1BVTEFUSU9OX0lERU5USUZJRVIgPSBFZGdlc1BhY2thZ2UuUE9QVUxBVElPTl9FREdFX19QT1BVTEFUSU9OX0lERU5USUZJRVI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGlwZSBUcmFuc3BvcnQgRWRnZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQSVBFX1RSQU5TUE9SVF9FREdFX0ZFQVRVUkVfQ09VTlQgPSBFZGdlc1BhY2thZ2UuUE9QVUxBVElPTl9FREdFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbEltcGwgPGVtPlBpcGUgVHJhbnNwb3J0IEVkZ2UgTGFiZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlBpcGVUcmFuc3BvcnRFZGdlTGFiZWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlRyYW5zcG9ydFBhY2thZ2VJbXBsI2dldFBpcGVUcmFuc3BvcnRFZGdlTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUElQRV9UUkFOU1BPUlRfRURHRV9MQUJFTCA9IDk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUElQRV9UUkFOU1BPUlRfRURHRV9MQUJFTF9fVVJJID0gR3JhcGhQYWNrYWdlLkVER0VfTEFCRUxfX1VSSTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBJUEVfVFJBTlNQT1JUX0VER0VfTEFCRUxfX1RZUEVfVVJJID0gR3JhcGhQYWNrYWdlLkVER0VfTEFCRUxfX1RZUEVfVVJJOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1YmxpbiBDb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUElQRV9UUkFOU1BPUlRfRURHRV9MQUJFTF9fRFVCTElOX0NPUkUgPSBHcmFwaFBhY2thZ2UuRURHRV9MQUJFTF9fRFVCTElOX0NPUkU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJIE9mIElkZW50aWZpYWJsZSBUbyBCZSBMYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUElQRV9UUkFOU1BPUlRfRURHRV9MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEID0gR3JhcGhQYWNrYWdlLkVER0VfTEFCRUxfX1VSSV9PRl9JREVOVElGSUFCTEVfVE9fQkVfTEFCRUxFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUElQRV9UUkFOU1BPUlRfRURHRV9MQUJFTF9fQ1VSUkVOVF9WQUxVRSA9IEdyYXBoUGFja2FnZS5FREdFX0xBQkVMX19DVVJSRU5UX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkZW50aWZpYWJsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBJUEVfVFJBTlNQT1JUX0VER0VfTEFCRUxfX0lERU5USUZJQUJMRSA9IEdyYXBoUGFja2FnZS5FREdFX0xBQkVMX19JREVOVElGSUFCTEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWRnZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQSVBFX1RSQU5TUE9SVF9FREdFX0xBQkVMX19FREdFID0gR3JhcGhQYWNrYWdlLkVER0VfTEFCRUxfX0VER0U7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGlwZSBUcmFuc3BvcnQgRWRnZSBMYWJlbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQSVBFX1RSQU5TUE9SVF9FREdFX0xBQkVMX0ZFQVRVUkVfQ09VTlQgPSBHcmFwaFBhY2thZ2UuRURHRV9MQUJFTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5QaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWVJbXBsIDxlbT5QaXBlIFRyYW5zcG9ydCBFZGdlIExhYmVsIFZhbHVlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5QaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlRyYW5zcG9ydFBhY2thZ2VJbXBsI2dldFBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBQSVBFX1RSQU5TUE9SVF9FREdFX0xBQkVMX1ZBTFVFID0gMTA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWF4IEZsb3c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQSVBFX1RSQU5TUE9SVF9FREdFX0xBQkVMX1ZBTFVFX19NQVhfRkxPVyA9IEdyYXBoUGFja2FnZS5MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBJUEVfVFJBTlNQT1JUX0VER0VfTEFCRUxfVkFMVUVfX1RJTUVfUEVSSU9EID0gR3JhcGhQYWNrYWdlLkxBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBpcGUgVHJhbnNwb3J0IEVkZ2UgTGFiZWwgVmFsdWU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUElQRV9UUkFOU1BPUlRfRURHRV9MQUJFTF9WQUxVRV9GRUFUVVJFX0NPVU5UID0gR3JhcGhQYWNrYWdlLkxBQkVMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuTG9hZFVubG9hZEVkZ2UgPGVtPkxvYWQgVW5sb2FkIEVkZ2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TG9hZCBVbmxvYWQgRWRnZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LkxvYWRVbmxvYWRFZGdlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRMb2FkVW5sb2FkRWRnZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5Mb2FkVW5sb2FkRWRnZSNpc0xvYWRpbmdFZGdlIDxlbT5Mb2FkaW5nIEVkZ2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2FkaW5nIEVkZ2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5Mb2FkVW5sb2FkRWRnZSNpc0xvYWRpbmdFZGdlKCkKKwkgKiBAc2VlICNnZXRMb2FkVW5sb2FkRWRnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0TG9hZFVubG9hZEVkZ2VfTG9hZGluZ0VkZ2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LkxvYWRVbmxvYWRFZGdlTGFiZWwgPGVtPkxvYWQgVW5sb2FkIEVkZ2UgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TG9hZCBVbmxvYWQgRWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LkxvYWRVbmxvYWRFZGdlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldExvYWRVbmxvYWRFZGdlTGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuTG9hZFVubG9hZEVkZ2VMYWJlbCNnZXRBY3RpdmF0aW9uVGltZSA8ZW0+QWN0aXZhdGlvbiBUaW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QWN0aXZhdGlvbiBUaW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuTG9hZFVubG9hZEVkZ2VMYWJlbCNnZXRBY3RpdmF0aW9uVGltZSgpCisJICogQHNlZSAjZ2V0TG9hZFVubG9hZEVkZ2VMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0TG9hZFVubG9hZEVkZ2VMYWJlbF9BY3RpdmF0aW9uVGltZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5Mb2FkVW5sb2FkRWRnZUxhYmVsI2dldERlYWN0aXZhdGlvblRpbWUgPGVtPkRlYWN0aXZhdGlvbiBUaW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RGVhY3RpdmF0aW9uIFRpbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5Mb2FkVW5sb2FkRWRnZUxhYmVsI2dldERlYWN0aXZhdGlvblRpbWUoKQorCSAqIEBzZWUgI2dldExvYWRVbmxvYWRFZGdlTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldExvYWRVbmxvYWRFZGdlTGFiZWxfRGVhY3RpdmF0aW9uVGltZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5Mb2FkVW5sb2FkRWRnZUxhYmVsI2dldEFjdGl2YXRlZFJhdGUgPGVtPkFjdGl2YXRlZCBSYXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0aXZhdGVkIFJhdGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5Mb2FkVW5sb2FkRWRnZUxhYmVsI2dldEFjdGl2YXRlZFJhdGUoKQorCSAqIEBzZWUgI2dldExvYWRVbmxvYWRFZGdlTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldExvYWRVbmxvYWRFZGdlTGFiZWxfQWN0aXZhdGVkUmF0ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0gPGVtPlBhY2tldCBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhY2tldCBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtI2dldFBhY2tldFRyYW5zcG9ydExhYmVsIDxlbT5QYWNrZXQgVHJhbnNwb3J0IExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UGFja2V0IFRyYW5zcG9ydCBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtI2dldFBhY2tldFRyYW5zcG9ydExhYmVsKCkKKwkgKiBAc2VlICNnZXRQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1fUGFja2V0VHJhbnNwb3J0TGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSNnZXRMb2FkaW5nRWRnZXMgPGVtPkxvYWRpbmcgRWRnZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkxvYWRpbmcgRWRnZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSNnZXRMb2FkaW5nRWRnZXMoKQorCSAqIEBzZWUgI2dldFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbV9Mb2FkaW5nRWRnZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSNnZXRVbmxvYWRpbmdFZGdlcyA8ZW0+VW5sb2FkaW5nIEVkZ2VzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5VbmxvYWRpbmcgRWRnZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSNnZXRVbmxvYWRpbmdFZGdlcygpCisJICogQHNlZSAjZ2V0UGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtX1VubG9hZGluZ0VkZ2VzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRUcmFuc3BvcnRMYWJlbCA8ZW0+UGFja2V0IFRyYW5zcG9ydCBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYWNrZXQgVHJhbnNwb3J0IExhYmVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGFja2V0VHJhbnNwb3J0TGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBhY2tldFRyYW5zcG9ydExhYmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW0gPGVtPlBpcGUgU3R5bGUgVHJhbnNwb3J0IFN5c3RlbTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QaXBlIFN0eWxlIFRyYW5zcG9ydCBTeXN0ZW08L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW0KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbSNnZXRJblRyYW5zcG9ydEVkZ2VzIDxlbT5JbiBUcmFuc3BvcnQgRWRnZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkluIFRyYW5zcG9ydCBFZGdlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbSNnZXRJblRyYW5zcG9ydEVkZ2VzKCkKKwkgKiBAc2VlICNnZXRQaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbV9JblRyYW5zcG9ydEVkZ2VzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtI2dldE91dFRyYW5zcG9ydEVkZ2VzIDxlbT5PdXQgVHJhbnNwb3J0IEVkZ2VzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXQgVHJhbnNwb3J0IEVkZ2VzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtI2dldE91dFRyYW5zcG9ydEVkZ2VzKCkKKwkgKiBAc2VlICNnZXRQaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbV9PdXRUcmFuc3BvcnRFZGdlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW0jZ2V0TWF4Q2FwYWNpdHkgPGVtPk1heCBDYXBhY2l0eTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1heCBDYXBhY2l0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbSNnZXRNYXhDYXBhY2l0eSgpCisJICogQHNlZSAjZ2V0UGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRQaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW1fTWF4Q2FwYWNpdHkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlRyYW5zcG9ydFN5c3RlbSA8ZW0+U3lzdGVtPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlN5c3RlbTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlRyYW5zcG9ydFN5c3RlbQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0VHJhbnNwb3J0U3lzdGVtKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlIDxlbT5QYWNrZXQgVHJhbnNwb3J0IExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhY2tldCBUcmFuc3BvcnQgTGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWUjZ2V0Q2FwYWNpdHkgPGVtPkNhcGFjaXR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FwYWNpdHk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlI2dldENhcGFjaXR5KCkKKwkgKiBAc2VlICNnZXRQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlX0NhcGFjaXR5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvciA8ZW0+UGFja2V0IFN0eWxlIFRyYW5zcG9ydCBTeXN0ZW0gRGVjb3JhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhY2tldCBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtIERlY29yYXRvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGlwZVRyYW5zcG9ydEVkZ2UgPGVtPlBpcGUgVHJhbnNwb3J0IEVkZ2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGlwZSBUcmFuc3BvcnQgRWRnZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVUcmFuc3BvcnRFZGdlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRQaXBlVHJhbnNwb3J0RWRnZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbCA8ZW0+UGlwZSBUcmFuc3BvcnQgRWRnZSBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QaXBlIFRyYW5zcG9ydCBFZGdlIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0UGlwZVRyYW5zcG9ydEVkZ2VMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlIDxlbT5QaXBlIFRyYW5zcG9ydCBFZGdlIExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBpcGUgVHJhbnNwb3J0IEVkZ2UgTGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUjZ2V0TWF4RmxvdyA8ZW0+TWF4IEZsb3c8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXggRmxvdzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSNnZXRNYXhGbG93KCkKKwkgKiBAc2VlICNnZXRQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZV9NYXhGbG93KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSNnZXRUaW1lUGVyaW9kIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRpbWUgUGVyaW9kPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlI2dldFRpbWVQZXJpb2QoKQorCSAqIEBzZWUgI2dldFBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlX1RpbWVQZXJpb2QoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogQGdlbmVyYXRlZAorCSAqLworCVRyYW5zcG9ydEZhY3RvcnkgZ2V0VHJhbnNwb3J0RmFjdG9yeSgpOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50CisJICogPHVsPgorCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisJICogPC91bD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50ZXJmYWNlIExpdGVyYWxzIHsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLkxvYWRVbmxvYWRFZGdlSW1wbCA8ZW0+TG9hZCBVbmxvYWQgRWRnZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuTG9hZFVubG9hZEVkZ2VJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5UcmFuc3BvcnRQYWNrYWdlSW1wbCNnZXRMb2FkVW5sb2FkRWRnZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBMT0FEX1VOTE9BRF9FREdFID0gZUlOU1RBTkNFLmdldExvYWRVbmxvYWRFZGdlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2FkaW5nIEVkZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBMT0FEX1VOTE9BRF9FREdFX19MT0FESU5HX0VER0UgPSBlSU5TVEFOQ0UuZ2V0TG9hZFVubG9hZEVkZ2VfTG9hZGluZ0VkZ2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuTG9hZFVubG9hZEVkZ2VMYWJlbEltcGwgPGVtPkxvYWQgVW5sb2FkIEVkZ2UgTGFiZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLkxvYWRVbmxvYWRFZGdlTGFiZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5UcmFuc3BvcnRQYWNrYWdlSW1wbCNnZXRMb2FkVW5sb2FkRWRnZUxhYmVsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIExPQURfVU5MT0FEX0VER0VfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0TG9hZFVubG9hZEVkZ2VMYWJlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBUaW1lPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fQUNUSVZBVElPTl9USU1FID0gZUlOU1RBTkNFLmdldExvYWRVbmxvYWRFZGdlTGFiZWxfQWN0aXZhdGlvblRpbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlYWN0aXZhdGlvbiBUaW1lPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fREVBQ1RJVkFUSU9OX1RJTUUgPSBlSU5TVEFOQ0UuZ2V0TG9hZFVubG9hZEVkZ2VMYWJlbF9EZWFjdGl2YXRpb25UaW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY3RpdmF0ZWQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIExPQURfVU5MT0FEX0VER0VfTEFCRUxfX0FDVElWQVRFRF9SQVRFID0gZUlOU1RBTkNFLmdldExvYWRVbmxvYWRFZGdlTGFiZWxfQWN0aXZhdGVkUmF0ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbUltcGwgPGVtPlBhY2tldCBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlRyYW5zcG9ydFBhY2thZ2VJbXBsI2dldFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNID0gZUlOU1RBTkNFLmdldFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYWNrZXQgVHJhbnNwb3J0IExhYmVsPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX1BBQ0tFVF9UUkFOU1BPUlRfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0UGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1fUGFja2V0VHJhbnNwb3J0TGFiZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvYWRpbmcgRWRnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19MT0FESU5HX0VER0VTID0gZUlOU1RBTkNFLmdldFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtX0xvYWRpbmdFZGdlcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VW5sb2FkaW5nIEVkZ2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBQQUNLRVRfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9fVU5MT0FESU5HX0VER0VTID0gZUlOU1RBTkNFLmdldFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtX1VubG9hZGluZ0VkZ2VzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlBhY2tldFRyYW5zcG9ydExhYmVsSW1wbCA8ZW0+UGFja2V0IFRyYW5zcG9ydCBMYWJlbDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuUGFja2V0VHJhbnNwb3J0TGFiZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5UcmFuc3BvcnRQYWNrYWdlSW1wbCNnZXRQYWNrZXRUcmFuc3BvcnRMYWJlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBQQUNLRVRfVFJBTlNQT1JUX0xBQkVMID0gZUlOU1RBTkNFLmdldFBhY2tldFRyYW5zcG9ydExhYmVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbUltcGwgPGVtPlBpcGUgU3R5bGUgVHJhbnNwb3J0IFN5c3RlbTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuVHJhbnNwb3J0UGFja2FnZUltcGwjZ2V0UGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFBJUEVfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTSA9IGVJTlNUQU5DRS5nZXRQaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW0oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluIFRyYW5zcG9ydCBFZGdlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUElQRV9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19JTl9UUkFOU1BPUlRfRURHRVMgPSBlSU5TVEFOQ0UuZ2V0UGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtX0luVHJhbnNwb3J0RWRnZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dCBUcmFuc3BvcnQgRWRnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFBJUEVfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9fT1VUX1RSQU5TUE9SVF9FREdFUyA9IGVJTlNUQU5DRS5nZXRQaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW1fT3V0VHJhbnNwb3J0RWRnZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1heCBDYXBhY2l0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBJUEVfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9fTUFYX0NBUEFDSVRZID0gZUlOU1RBTkNFLmdldFBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbV9NYXhDYXBhY2l0eSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5UcmFuc3BvcnRTeXN0ZW1JbXBsIDxlbT5TeXN0ZW08L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlRyYW5zcG9ydFN5c3RlbUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlRyYW5zcG9ydFBhY2thZ2VJbXBsI2dldFRyYW5zcG9ydFN5c3RlbSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBUUkFOU1BPUlRfU1lTVEVNID0gZUlOU1RBTkNFLmdldFRyYW5zcG9ydFN5c3RlbSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5QYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlSW1wbCA8ZW0+UGFja2V0IFRyYW5zcG9ydCBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlRyYW5zcG9ydFBhY2thZ2VJbXBsI2dldFBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUEFDS0VUX1RSQU5TUE9SVF9MQUJFTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXBhY2l0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBBQ0tFVF9UUkFOU1BPUlRfTEFCRUxfVkFMVUVfX0NBUEFDSVRZID0gZUlOU1RBTkNFLmdldFBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWVfQ2FwYWNpdHkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3JJbXBsIDxlbT5QYWNrZXQgU3R5bGUgVHJhbnNwb3J0IFN5c3RlbSBEZWNvcmF0b3I8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9ySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuVHJhbnNwb3J0UGFja2FnZUltcGwjZ2V0UGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3IoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fREVDT1JBVE9SID0gZUlOU1RBTkNFLmdldFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9yKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlBpcGVUcmFuc3BvcnRFZGdlSW1wbCA8ZW0+UGlwZSBUcmFuc3BvcnQgRWRnZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuUGlwZVRyYW5zcG9ydEVkZ2VJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5UcmFuc3BvcnRQYWNrYWdlSW1wbCNnZXRQaXBlVHJhbnNwb3J0RWRnZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBQSVBFX1RSQU5TUE9SVF9FREdFID0gZUlOU1RBTkNFLmdldFBpcGVUcmFuc3BvcnRFZGdlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlBpcGVUcmFuc3BvcnRFZGdlTGFiZWxJbXBsIDxlbT5QaXBlIFRyYW5zcG9ydCBFZGdlIExhYmVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5QaXBlVHJhbnNwb3J0RWRnZUxhYmVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuVHJhbnNwb3J0UGFja2FnZUltcGwjZ2V0UGlwZVRyYW5zcG9ydEVkZ2VMYWJlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBQSVBFX1RSQU5TUE9SVF9FREdFX0xBQkVMID0gZUlOU1RBTkNFLmdldFBpcGVUcmFuc3BvcnRFZGdlTGFiZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlSW1wbCA8ZW0+UGlwZSBUcmFuc3BvcnQgRWRnZSBMYWJlbCBWYWx1ZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuVHJhbnNwb3J0UGFja2FnZUltcGwjZ2V0UGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFBJUEVfVFJBTlNQT1JUX0VER0VfTEFCRUxfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0UGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXggRmxvdzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBJUEVfVFJBTlNQT1JUX0VER0VfTEFCRUxfVkFMVUVfX01BWF9GTE9XID0gZUlOU1RBTkNFLmdldFBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZV9NYXhGbG93KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBJUEVfVFJBTlNQT1JUX0VER0VfTEFCRUxfVkFMVUVfX1RJTUVfUEVSSU9EID0gZUlOU1RBTkNFLmdldFBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZV9UaW1lUGVyaW9kKCk7CisKKwl9CisKK30gLy9UcmFuc3BvcnRQYWNrYWdlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvVHJhbnNwb3J0U3lzdGVtLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvVHJhbnNwb3J0U3lzdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3MGE4ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9UcmFuc3BvcnRTeXN0ZW0uamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworCisvKioKKyAqIE5vZGUgcmVwcmVzZW50aW5nIHRoZSB0cmFuc3BvcnQgc3lzdGVtLgorICogCisgKiBAYXV0aG9yIGpsZXNzbGVyCisgKgorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRyYW5zcG9ydFN5c3RlbSBleHRlbmRzIE5vZGUgeworCQorCS8qKgorCSAqIAorCSAqLworCVN0cmluZyBVUklfVFlQRV9UUkFOU1BPUlRfU1lTVEVNX05PREVfU0VHTUVOVCA9IFVSSV9UWVBFX05PREVfU0VHTUVOVAorCQkrICIvdHJhbnNwb3J0IjsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9pbXBsL0xvYWRVbmxvYWRFZGdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L2ltcGwvTG9hZFVubG9hZEVkZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxYjVhNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9pbXBsL0xvYWRVbmxvYWRFZGdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjE1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuTWlncmF0aW9uRWRnZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5Mb2FkVW5sb2FkRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5Mb2FkVW5sb2FkRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlRyYW5zcG9ydFBhY2thZ2U7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxvYWQgVW5sb2FkIEVkZ2U8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuTG9hZFVubG9hZEVkZ2VJbXBsI2lzTG9hZGluZ0VkZ2UgPGVtPkxvYWRpbmcgRWRnZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIExvYWRVbmxvYWRFZGdlSW1wbCBleHRlbmRzIE1pZ3JhdGlvbkVkZ2VJbXBsIGltcGxlbWVudHMgTG9hZFVubG9hZEVkZ2UgeworCQorCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xvYWRpbmdFZGdlKCkgPGVtPkxvYWRpbmcgRWRnZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNMb2FkaW5nRWRnZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQURJTkdfRURHRV9FREVGQVVMVCA9IGZhbHNlOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9hZGluZ0VkZ2UoKSA8ZW0+TG9hZGluZyBFZGdlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0xvYWRpbmdFZGdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBsb2FkaW5nRWRnZSA9IExPQURJTkdfRURHRV9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIFVSSSdzIGZvciBlYWNoIExvYWRVbmxvYWRFZGdlRWRnZSBnZW5lcmF0ZWQKKwkgKi8KKwlzdGF0aWMgaW50IGxvYWRVbmxvYWRFZGdlQ291bnRlciA9IDA7CisJCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBMb2FkVW5sb2FkRWRnZUltcGwoKSB7CisJCXN1cGVyKCk7CisJCQorCQkvL1dlIG5lZWQgdG8gc2V0IHRoZSBVUkkKKwkJc2V0VVJJKFNURU1VUkkuY3JlYXRlVVJJKFVSSV9UWVBFX0xPQURVTkxPQURFREdFX1NFR01FTlQgKyAiLyIKKwkJCQkJCStJbnRlZ2VyLnRvU3RyaW5nKGxvYWRVbmxvYWRFZGdlQ291bnRlcisrKSkpOworCQkKKwkJLy9NYWtlIGEgbGFiZWwKKwkJLy9zZXRMYWJlbChUcmFuc3BvcnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMb2FkVW5sb2FkRWRnZUxhYmVsKCkpOworCQkKKworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gVHJhbnNwb3J0UGFja2FnZS5MaXRlcmFscy5MT0FEX1VOTE9BRF9FREdFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTG9hZGluZ0VkZ2UoKSB7CisJCXJldHVybiBsb2FkaW5nRWRnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMb2FkaW5nRWRnZShib29sZWFuIG5ld0xvYWRpbmdFZGdlKSB7CisJCWJvb2xlYW4gb2xkTG9hZGluZ0VkZ2UgPSBsb2FkaW5nRWRnZTsKKwkJbG9hZGluZ0VkZ2UgPSBuZXdMb2FkaW5nRWRnZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX19MT0FESU5HX0VER0UsIG9sZExvYWRpbmdFZGdlLCBsb2FkaW5nRWRnZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX19MT0FESU5HX0VER0U6CisJCQkJcmV0dXJuIGlzTG9hZGluZ0VkZ2UoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLkxPQURfVU5MT0FEX0VER0VfX0xPQURJTkdfRURHRToKKwkJCQlzZXRMb2FkaW5nRWRnZSgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX19MT0FESU5HX0VER0U6CisJCQkJc2V0TG9hZGluZ0VkZ2UoTE9BRElOR19FREdFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX19MT0FESU5HX0VER0U6CisJCQkJcmV0dXJuIGxvYWRpbmdFZGdlICE9IExPQURJTkdfRURHRV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGxvYWRpbmdFZGdlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChsb2FkaW5nRWRnZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCS8qKkltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgdG8gcmVzb2x2ZQorCSAqIHJldHVybiB0eXBlIGNvbmZsaWN0cy4qLworCXB1YmxpYyBMb2FkVW5sb2FkRWRnZUxhYmVsIGdldExhYmVsKCkgeworCQlyZXR1cm4gKExvYWRVbmxvYWRFZGdlTGFiZWwpc3VwZXIuZ2V0TGFiZWwoKTsKKwl9CisJcHVibGljIHZvaWQgc2V0TGFiZWwoTG9hZFVubG9hZEVkZ2VMYWJlbCBsYmwpIHsKKwkJc3VwZXIuc2V0TGFiZWwobGJsKTsKKwl9CisJCisJCisJLyoqUGVyZm9ybSBzYW5pdHkgY2hlY2tzIG5lY2Vzc2FyeSBmb3IgdGhpcyB0eXBlIG9mIGVkZ2UuKi8KKwlwdWJsaWMgYm9vbGVhbiBzYW5lKCkgeworCQlib29sZWFuIHJjID0gc3VwZXIuc2FuZSgpOworCQkKKwkJaWYgKHRoaXMuaXNMb2FkaW5nRWRnZSgpKSB7CisJCQlyYyA9IHJjICYmIHRoaXMuZ2V0QigpIGluc3RhbmNlb2YgUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW07CisJCX0gZWxzZSB7CisJCQlyYyA9IHJjICYmIHRoaXMuZ2V0QSgpIGluc3RhbmNlb2YgUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW07CisJCX0KKwkJCisJCWFzc2VydCByYzsKKwkJCisJCXJldHVybiByYzsKKwl9CisJCisJCit9IC8vTG9hZFVubG9hZEVkZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvaW1wbC9Mb2FkVW5sb2FkRWRnZUxhYmVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L2ltcGwvTG9hZFVubG9hZEVkZ2VMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzljODdlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L2ltcGwvTG9hZFVubG9hZEVkZ2VMYWJlbEltcGwuamF2YQpAQCAtMCwwICsxLDY3MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5TVEVNVGltZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZUxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5pbXBsLk1pZ3JhdGlvbkVkZ2VMYWJlbEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbFZhbHVlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuTG9hZFVubG9hZEVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuTG9hZFVubG9hZEVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRUcmFuc3BvcnRMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5UcmFuc3BvcnRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TG9hZCBVbmxvYWQgRWRnZSBMYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5Mb2FkVW5sb2FkRWRnZUxhYmVsSW1wbCNpc05leHRWYWx1ZVZhbGlkIDxlbT5OZXh0IFZhbHVlIFZhbGlkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLkxvYWRVbmxvYWRFZGdlTGFiZWxJbXBsI2dldE5leHRWYWx1ZSA8ZW0+TmV4dCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5Mb2FkVW5sb2FkRWRnZUxhYmVsSW1wbCNnZXREZWNvcmF0b3IgPGVtPkRlY29yYXRvcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5Mb2FkVW5sb2FkRWRnZUxhYmVsSW1wbCNnZXRBY3RpdmF0aW9uVGltZSA8ZW0+QWN0aXZhdGlvbiBUaW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLkxvYWRVbmxvYWRFZGdlTGFiZWxJbXBsI2dldERlYWN0aXZhdGlvblRpbWUgPGVtPkRlYWN0aXZhdGlvbiBUaW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLkxvYWRVbmxvYWRFZGdlTGFiZWxJbXBsI2dldEFjdGl2YXRlZFJhdGUgPGVtPkFjdGl2YXRlZCBSYXRlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTG9hZFVubG9hZEVkZ2VMYWJlbEltcGwgZXh0ZW5kcyBNaWdyYXRpb25FZGdlTGFiZWxJbXBsIGltcGxlbWVudHMgTG9hZFVubG9hZEVkZ2VMYWJlbCB7CisJCisJCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTmV4dFZhbHVlVmFsaWQoKSA8ZW0+TmV4dCBWYWx1ZSBWYWxpZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNOZXh0VmFsdWVWYWxpZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE5FWFRfVkFMVUVfVkFMSURfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTmV4dFZhbHVlVmFsaWQoKSA8ZW0+TmV4dCBWYWx1ZSBWYWxpZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNOZXh0VmFsdWVWYWxpZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gbmV4dFZhbHVlVmFsaWQgPSBORVhUX1ZBTFVFX1ZBTElEX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmV4dFZhbHVlKCkgPGVtPk5leHQgVmFsdWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5leHRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIExhYmVsVmFsdWUgbmV4dFZhbHVlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVjb3JhdG9yKCkgPGVtPkRlY29yYXRvcjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGVjb3JhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGVjb3JhdG9yIGRlY29yYXRvcjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2YXRpb25UaW1lKCkgPGVtPkFjdGl2YXRpb24gVGltZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QWN0aXZhdGlvblRpbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTVEVNVGltZSBhY3RpdmF0aW9uVGltZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlYWN0aXZhdGlvblRpbWUoKSA8ZW0+RGVhY3RpdmF0aW9uIFRpbWU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlYWN0aXZhdGlvblRpbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTVEVNVGltZSBkZWFjdGl2YXRpb25UaW1lOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2YXRlZFJhdGUoKSA8ZW0+QWN0aXZhdGVkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFjdGl2YXRlZFJhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIEFDVElWQVRFRF9SQVRFX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZhdGVkUmF0ZSgpIDxlbT5BY3RpdmF0ZWQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QWN0aXZhdGVkUmF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBhY3RpdmF0ZWRSYXRlID0gQUNUSVZBVEVEX1JBVEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIExvYWRVbmxvYWRFZGdlTGFiZWxJbXBsKCkgeworCQlzdXBlcigpOworCQkKKwkJLy9tYWtlIHN1cmUgdGhlIHR5cGUgVVJJIGlzIHNldAorCQl0aGlzLnNldFR5cGVVUkkoVVJJX1RZUEVfTE9BRF9VTkxPQURfRURHRV9MQUJFTCk7CisJCQorCQkvL2dpdmUgYSB2YWx1ZSBmb3IgdGhlIG5leHQgdmFsdWUKKwkJc2V0TmV4dFZhbHVlKEVkZ2VzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUoKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBUcmFuc3BvcnRQYWNrYWdlLkxpdGVyYWxzLkxPQURfVU5MT0FEX0VER0VfTEFCRUw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNOZXh0VmFsdWVWYWxpZCgpIHsKKwkJcmV0dXJuIG5leHRWYWx1ZVZhbGlkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE5leHRWYWx1ZVZhbGlkKGJvb2xlYW4gbmV3TmV4dFZhbHVlVmFsaWQpIHsKKwkJYm9vbGVhbiBvbGROZXh0VmFsdWVWYWxpZCA9IG5leHRWYWx1ZVZhbGlkOworCQluZXh0VmFsdWVWYWxpZCA9IG5ld05leHRWYWx1ZVZhbGlkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUcmFuc3BvcnRQYWNrYWdlLkxPQURfVU5MT0FEX0VER0VfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQsIG9sZE5leHRWYWx1ZVZhbGlkLCBuZXh0VmFsdWVWYWxpZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMYWJlbFZhbHVlIGdldE5leHRWYWx1ZSgpIHsKKwkJcmV0dXJuIG5leHRWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXROZXh0VmFsdWUoTGFiZWxWYWx1ZSBuZXdOZXh0VmFsdWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJTGFiZWxWYWx1ZSBvbGROZXh0VmFsdWUgPSBuZXh0VmFsdWU7CisJCW5leHRWYWx1ZSA9IG5ld05leHRWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX0xBQkVMX19ORVhUX1ZBTFVFLCBvbGROZXh0VmFsdWUsIG5ld05leHRWYWx1ZSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJCisJLyoqTWlncmF0aW9uIGVkZ2UgdmVyc2lvbiovCisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TmV4dFZhbHVlKExhYmVsVmFsdWUgbmV3TmV4dFZhbHVlKSB7CisJCWlmIChuZXdOZXh0VmFsdWUgIT0gbmV4dFZhbHVlKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChuZXh0VmFsdWUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV4dFZhbHVlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX0xBQkVMX19ORVhUX1ZBTFVFLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdOZXh0VmFsdWUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TmV4dFZhbHVlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX0xBQkVMX19ORVhUX1ZBTFVFLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldE5leHRWYWx1ZShuZXdOZXh0VmFsdWUsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX0xBQkVMX19ORVhUX1ZBTFVFLCBuZXdOZXh0VmFsdWUsIG5ld05leHRWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEZWNvcmF0b3IgZ2V0RGVjb3JhdG9yKCkgeworCQlpZiAoZGVjb3JhdG9yICE9IG51bGwgJiYgZGVjb3JhdG9yLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGREZWNvcmF0b3IgPSAoSW50ZXJuYWxFT2JqZWN0KWRlY29yYXRvcjsKKwkJCWRlY29yYXRvciA9IChEZWNvcmF0b3IpZVJlc29sdmVQcm94eShvbGREZWNvcmF0b3IpOworCQkJaWYgKGRlY29yYXRvciAhPSBvbGREZWNvcmF0b3IpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBUcmFuc3BvcnRQYWNrYWdlLkxPQURfVU5MT0FEX0VER0VfTEFCRUxfX0RFQ09SQVRPUiwgb2xkRGVjb3JhdG9yLCBkZWNvcmF0b3IpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZGVjb3JhdG9yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEZWNvcmF0b3IgYmFzaWNHZXREZWNvcmF0b3IoKSB7CisJCXJldHVybiBkZWNvcmF0b3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RGVjb3JhdG9yKERlY29yYXRvciBuZXdEZWNvcmF0b3IsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJRGVjb3JhdG9yIG9sZERlY29yYXRvciA9IGRlY29yYXRvcjsKKwkJZGVjb3JhdG9yID0gbmV3RGVjb3JhdG9yOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUcmFuc3BvcnRQYWNrYWdlLkxPQURfVU5MT0FEX0VER0VfTEFCRUxfX0RFQ09SQVRPUiwgb2xkRGVjb3JhdG9yLCBuZXdEZWNvcmF0b3IpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlY29yYXRvcihEZWNvcmF0b3IgbmV3RGVjb3JhdG9yKSB7CisJCWlmIChuZXdEZWNvcmF0b3IgIT0gZGVjb3JhdG9yKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZGVjb3JhdG9yKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBNb2RlbFBhY2thZ2UuREVDT1JBVE9SX19MQUJFTFNfVE9fVVBEQVRFLCBEZWNvcmF0b3IuY2xhc3MsIG1zZ3MpOworCQkJaWYgKG5ld0RlY29yYXRvciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdEZWNvcmF0b3IpLmVJbnZlcnNlQWRkKHRoaXMsIE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0xBQkVMU19UT19VUERBVEUsIERlY29yYXRvci5jbGFzcywgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXREZWNvcmF0b3IobmV3RGVjb3JhdG9yLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fREVDT1JBVE9SLCBuZXdEZWNvcmF0b3IsIG5ld0RlY29yYXRvcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTVEVNVGltZSBnZXRBY3RpdmF0aW9uVGltZSgpIHsKKwkJaWYgKGFjdGl2YXRpb25UaW1lICE9IG51bGwgJiYgYWN0aXZhdGlvblRpbWUuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEFjdGl2YXRpb25UaW1lID0gKEludGVybmFsRU9iamVjdClhY3RpdmF0aW9uVGltZTsKKwkJCWFjdGl2YXRpb25UaW1lID0gKFNURU1UaW1lKWVSZXNvbHZlUHJveHkob2xkQWN0aXZhdGlvblRpbWUpOworCQkJaWYgKGFjdGl2YXRpb25UaW1lICE9IG9sZEFjdGl2YXRpb25UaW1lKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX0xBQkVMX19BQ1RJVkFUSU9OX1RJTUUsIG9sZEFjdGl2YXRpb25UaW1lLCBhY3RpdmF0aW9uVGltZSkpOworCQkJfQorCQl9CisJCXJldHVybiBhY3RpdmF0aW9uVGltZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU1RFTVRpbWUgYmFzaWNHZXRBY3RpdmF0aW9uVGltZSgpIHsKKwkJcmV0dXJuIGFjdGl2YXRpb25UaW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEFjdGl2YXRpb25UaW1lKFNURU1UaW1lIG5ld0FjdGl2YXRpb25UaW1lKSB7CisJCVNURU1UaW1lIG9sZEFjdGl2YXRpb25UaW1lID0gYWN0aXZhdGlvblRpbWU7CisJCWFjdGl2YXRpb25UaW1lID0gbmV3QWN0aXZhdGlvblRpbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fQUNUSVZBVElPTl9USU1FLCBvbGRBY3RpdmF0aW9uVGltZSwgYWN0aXZhdGlvblRpbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU1RFTVRpbWUgZ2V0RGVhY3RpdmF0aW9uVGltZSgpIHsKKwkJaWYgKGRlYWN0aXZhdGlvblRpbWUgIT0gbnVsbCAmJiBkZWFjdGl2YXRpb25UaW1lLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGREZWFjdGl2YXRpb25UaW1lID0gKEludGVybmFsRU9iamVjdClkZWFjdGl2YXRpb25UaW1lOworCQkJZGVhY3RpdmF0aW9uVGltZSA9IChTVEVNVGltZSllUmVzb2x2ZVByb3h5KG9sZERlYWN0aXZhdGlvblRpbWUpOworCQkJaWYgKGRlYWN0aXZhdGlvblRpbWUgIT0gb2xkRGVhY3RpdmF0aW9uVGltZSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fREVBQ1RJVkFUSU9OX1RJTUUsIG9sZERlYWN0aXZhdGlvblRpbWUsIGRlYWN0aXZhdGlvblRpbWUpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZGVhY3RpdmF0aW9uVGltZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU1RFTVRpbWUgYmFzaWNHZXREZWFjdGl2YXRpb25UaW1lKCkgeworCQlyZXR1cm4gZGVhY3RpdmF0aW9uVGltZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWFjdGl2YXRpb25UaW1lKFNURU1UaW1lIG5ld0RlYWN0aXZhdGlvblRpbWUpIHsKKwkJU1RFTVRpbWUgb2xkRGVhY3RpdmF0aW9uVGltZSA9IGRlYWN0aXZhdGlvblRpbWU7CisJCWRlYWN0aXZhdGlvblRpbWUgPSBuZXdEZWFjdGl2YXRpb25UaW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUcmFuc3BvcnRQYWNrYWdlLkxPQURfVU5MT0FEX0VER0VfTEFCRUxfX0RFQUNUSVZBVElPTl9USU1FLCBvbGREZWFjdGl2YXRpb25UaW1lLCBkZWFjdGl2YXRpb25UaW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0QWN0aXZhdGVkUmF0ZSgpIHsKKwkJcmV0dXJuIGFjdGl2YXRlZFJhdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QWN0aXZhdGVkUmF0ZShkb3VibGUgbmV3QWN0aXZhdGVkUmF0ZSkgeworCQlkb3VibGUgb2xkQWN0aXZhdGVkUmF0ZSA9IGFjdGl2YXRlZFJhdGU7CisJCWFjdGl2YXRlZFJhdGUgPSBuZXdBY3RpdmF0ZWRSYXRlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUcmFuc3BvcnRQYWNrYWdlLkxPQURfVU5MT0FEX0VER0VfTEFCRUxfX0FDVElWQVRFRF9SQVRFLCBvbGRBY3RpdmF0ZWRSYXRlLCBhY3RpdmF0ZWRSYXRlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQkvL3NldCB0aGUgbWlncmF0aW9uIHJhdGUgdG8gMAorCQl0aGlzLmdldEN1cnJlbnRWYWx1ZSgpLnNldE1pZ3JhdGlvblJhdGUoMC4wKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgc3dpdGNoVG9OZXh0VmFsdWUoKSB7CisJCU1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlIHRtcCA9IHRoaXMuZ2V0Q3VycmVudFZhbHVlKCk7CisJCXNldEN1cnJlbnRWYWx1ZSh0aGlzLmdldE5leHRWYWx1ZSgpKTsKKwkJc2V0TmV4dFZhbHVlKHRtcCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLkxPQURfVU5MT0FEX0VER0VfTEFCRUxfX0RFQ09SQVRPUjoKKwkJCQlpZiAoZGVjb3JhdG9yICE9IG51bGwpCisJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClkZWNvcmF0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIE1vZGVsUGFja2FnZS5ERUNPUkFUT1JfX0xBQkVMU19UT19VUERBVEUsIERlY29yYXRvci5jbGFzcywgbXNncyk7CisJCQkJcmV0dXJuIGJhc2ljU2V0RGVjb3JhdG9yKChEZWNvcmF0b3Ipb3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fTkVYVF9WQUxVRToKKwkJCQlyZXR1cm4gYmFzaWNTZXROZXh0VmFsdWUobnVsbCwgbXNncyk7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fREVDT1JBVE9SOgorCQkJCXJldHVybiBiYXNpY1NldERlY29yYXRvcihudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLkxPQURfVU5MT0FEX0VER0VfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQ6CisJCQkJcmV0dXJuIGlzTmV4dFZhbHVlVmFsaWQoKTsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX0xBQkVMX19ORVhUX1ZBTFVFOgorCQkJCXJldHVybiBnZXROZXh0VmFsdWUoKTsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX0xBQkVMX19ERUNPUkFUT1I6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXREZWNvcmF0b3IoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXREZWNvcmF0b3IoKTsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX0xBQkVMX19BQ1RJVkFUSU9OX1RJTUU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRBY3RpdmF0aW9uVGltZSgpOworCQkJCXJldHVybiBiYXNpY0dldEFjdGl2YXRpb25UaW1lKCk7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fREVBQ1RJVkFUSU9OX1RJTUU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXREZWFjdGl2YXRpb25UaW1lKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0RGVhY3RpdmF0aW9uVGltZSgpOworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLkxPQURfVU5MT0FEX0VER0VfTEFCRUxfX0FDVElWQVRFRF9SQVRFOgorCQkJCXJldHVybiBnZXRBY3RpdmF0ZWRSYXRlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX0xBQkVMX19ORVhUX1ZBTFVFX1ZBTElEOgorCQkJCXNldE5leHRWYWx1ZVZhbGlkKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fTkVYVF9WQUxVRToKKwkJCQlzZXROZXh0VmFsdWUoKExhYmVsVmFsdWUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX0xBQkVMX19ERUNPUkFUT1I6CisJCQkJc2V0RGVjb3JhdG9yKChEZWNvcmF0b3IpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX0xBQkVMX19BQ1RJVkFUSU9OX1RJTUU6CisJCQkJc2V0QWN0aXZhdGlvblRpbWUoKFNURU1UaW1lKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fREVBQ1RJVkFUSU9OX1RJTUU6CisJCQkJc2V0RGVhY3RpdmF0aW9uVGltZSgoU1RFTVRpbWUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX0xBQkVMX19BQ1RJVkFURURfUkFURToKKwkJCQlzZXRBY3RpdmF0ZWRSYXRlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fTkVYVF9WQUxVRV9WQUxJRDoKKwkJCQlzZXROZXh0VmFsdWVWYWxpZChORVhUX1ZBTFVFX1ZBTElEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fTkVYVF9WQUxVRToKKwkJCQlzZXROZXh0VmFsdWUoKExhYmVsVmFsdWUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLkxPQURfVU5MT0FEX0VER0VfTEFCRUxfX0RFQ09SQVRPUjoKKwkJCQlzZXREZWNvcmF0b3IoKERlY29yYXRvciludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fQUNUSVZBVElPTl9USU1FOgorCQkJCXNldEFjdGl2YXRpb25UaW1lKChTVEVNVGltZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fREVBQ1RJVkFUSU9OX1RJTUU6CisJCQkJc2V0RGVhY3RpdmF0aW9uVGltZSgoU1RFTVRpbWUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLkxPQURfVU5MT0FEX0VER0VfTEFCRUxfX0FDVElWQVRFRF9SQVRFOgorCQkJCXNldEFjdGl2YXRlZFJhdGUoQUNUSVZBVEVEX1JBVEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLkxPQURfVU5MT0FEX0VER0VfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQ6CisJCQkJcmV0dXJuIG5leHRWYWx1ZVZhbGlkICE9IE5FWFRfVkFMVUVfVkFMSURfRURFRkFVTFQ7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fTkVYVF9WQUxVRToKKwkJCQlyZXR1cm4gbmV4dFZhbHVlICE9IG51bGw7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fREVDT1JBVE9SOgorCQkJCXJldHVybiBkZWNvcmF0b3IgIT0gbnVsbDsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX0xBQkVMX19BQ1RJVkFUSU9OX1RJTUU6CisJCQkJcmV0dXJuIGFjdGl2YXRpb25UaW1lICE9IG51bGw7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fREVBQ1RJVkFUSU9OX1RJTUU6CisJCQkJcmV0dXJuIGRlYWN0aXZhdGlvblRpbWUgIT0gbnVsbDsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX0xBQkVMX19BQ1RJVkFURURfUkFURToKKwkJCQlyZXR1cm4gYWN0aXZhdGVkUmF0ZSAhPSBBQ1RJVkFURURfUkFURV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCQorCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBEeW5hbWljTGFiZWwuY2xhc3MpIHsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgeworCQkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5MT0FEX1VOTE9BRF9FREdFX0xBQkVMX19ORVhUX1ZBTFVFX1ZBTElEOiByZXR1cm4gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQ7CisJCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLkxPQURfVU5MT0FEX0VER0VfTEFCRUxfX05FWFRfVkFMVUU6IHJldHVybiBHcmFwaFBhY2thZ2UuRFlOQU1JQ19MQUJFTF9fTkVYVF9WQUxVRTsKKwkJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fREVDT1JBVE9SOiByZXR1cm4gR3JhcGhQYWNrYWdlLkRZTkFNSUNfTEFCRUxfX0RFQ09SQVRPUjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBEeW5hbWljTGFiZWwuY2xhc3MpIHsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgeworCQkJCWNhc2UgR3JhcGhQYWNrYWdlLkRZTkFNSUNfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQ6IHJldHVybiBUcmFuc3BvcnRQYWNrYWdlLkxPQURfVU5MT0FEX0VER0VfTEFCRUxfX05FWFRfVkFMVUVfVkFMSUQ7CisJCQkJY2FzZSBHcmFwaFBhY2thZ2UuRFlOQU1JQ19MQUJFTF9fTkVYVF9WQUxVRTogcmV0dXJuIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fTkVYVF9WQUxVRTsKKwkJCQljYXNlIEdyYXBoUGFja2FnZS5EWU5BTUlDX0xBQkVMX19ERUNPUkFUT1I6IHJldHVybiBUcmFuc3BvcnRQYWNrYWdlLkxPQURfVU5MT0FEX0VER0VfTEFCRUxfX0RFQ09SQVRPUjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChuZXh0VmFsdWVWYWxpZDogIik7CisJCXJlc3VsdC5hcHBlbmQobmV4dFZhbHVlVmFsaWQpOworCQlyZXN1bHQuYXBwZW5kKCIsIGFjdGl2YXRlZFJhdGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKGFjdGl2YXRlZFJhdGUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKKwkvKipEbyB0aGUgc3R1ZmYgZm9yIHRlc3RpbmcgaWYgYSBsb2FkL3VubG9hZCBlZGdlIGxhYmVsIGlzICJzYW5lIiovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2FuZSgpIHsKKwkJYm9vbGVhbiByYyA9IHN1cGVyLnNhbmUoKTsKKwkJCisJCS8vYXJlIGFjdGl2YXRpb24gYW5kIGRlYWN0aXZhdGlvbiB0aW1lcyBzZXQuCisJCXJjID0gcmMgJiYgKGdldEFjdGl2YXRpb25UaW1lKCkhPW51bGwpOworCQlhc3NlcnQocmMpOworCQkKKwkJcmMgPSByYyAmJiAoZ2V0RGVhY3RpdmF0aW9uVGltZSgpIT1udWxsKTsKKwkJYXNzZXJ0KHJjKTsKKwkJCisJCS8vbWFrZSBzdXJlIHRoZSBhY3RpdmF0aW9uIHRpbWUgaXMgYmVmb3JlIHRoZSBkZWFjdGl2YXRpb24gdGltZS4KKwkJcmMgPSByYyAmJiBnZXRBY3RpdmF0aW9uVGltZSgpLmdldFRpbWUoKS5iZWZvcmUoZ2V0RGVhY3RpdmF0aW9uVGltZSgpLmdldFRpbWUoKSk7CisJCWFzc2VydChyYyk7CisJCQorCQlyZXR1cm4gcmM7CisJfQorCisJCisJcHVibGljIGRvdWJsZSBnZXROb3JtYWxpemVkQWN0aXZhdGVkUmF0ZSgpIHsKKwkJTG9hZFVubG9hZEVkZ2UgbGFiZWxlZEVkZ2UgPSAoTG9hZFVubG9hZEVkZ2UpdGhpcy5nZXRFZGdlKCk7CisJCQorCQlOb2RlIHNvdXJjZSA9IGxhYmVsZWRFZGdlLmdldEEoKTsKKwkJUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0gdHJhbnNTeXN0ZW0gPSAKKwkJCShQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSkgKChsYWJlbGVkRWRnZS5pc0xvYWRpbmdFZGdlKCkpPyhsYWJlbGVkRWRnZS5nZXRCKCkpOihsYWJlbGVkRWRnZS5nZXRBKCkpKTsJCQkJCQkKKwkJCisJCUNvbGxlY3Rpb24gPE5vZGVMYWJlbD4gbGJscz1zb3VyY2UuZ2V0TGFiZWxzKCk7CisJCWRvdWJsZSBzb3VyY2VQb3AgPSAwOworCQkKKwkJLy9HZXQgdGhlIHBvcHVsYXRpb24gc2l6ZSBvZiB0aGUgc291cmNlIG5vZGUKKwkJZm9yKEl0ZXJhdG9yPE5vZGVMYWJlbD4gaXQgPSBsYmxzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKwkJCU5vZGVMYWJlbCBsYmwgPSBpdC5uZXh0KCk7CisJCQlpZiAobGJsIGluc3RhbmNlb2YgUG9wdWxhdGlvbkxhYmVsKSB7CisJCQkJc291cmNlUG9wID0gKChQb3B1bGF0aW9uTGFiZWxWYWx1ZSkoKFBvcHVsYXRpb25MYWJlbClsYmwpLmdldEN1cnJlbnRWYWx1ZSgpKS5nZXRDb3VudCgpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWFzc2VydCBzb3VyY2VQb3AgPiAwOworCQkKKwkJCisJCWxibHM9dHJhbnNTeXN0ZW0uZ2V0TGFiZWxzKCk7CisJCWRvdWJsZSB0cmFuc0NhcGFjaXR5ICA9IDA7CisJCQorCQkKKwkJLy9HZXQgdGhlIGNhcGFjaXR5IG9mIHRoZSBwYWNrZXQgdHJhbnNwb3J0IGxhYmVsCisJCWZvcihJdGVyYXRvcjxOb2RlTGFiZWw+IGl0ID0gbGJscy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisJCQlOb2RlTGFiZWwgbGJsID0gaXQubmV4dCgpOworCQkJaWYgKGxibCBpbnN0YW5jZW9mIFBhY2tldFRyYW5zcG9ydExhYmVsKSB7CisJCQkJdHJhbnNDYXBhY2l0eSA9ICgoUGFja2V0VHJhbnNwb3J0TGFiZWwpbGJsKS5nZXRDdXJyZW50VmFsdWUoKS5nZXRDYXBhY2l0eSgpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGdldEFjdGl2YXRlZFJhdGUoKSp0cmFuc0NhcGFjaXR5L3NvdXJjZVBvcDsKKwl9CisKK30gLy9Mb2FkVW5sb2FkRWRnZUxhYmVsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L2ltcGwvUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3JJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvaW1wbC9QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjI3NjA3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L2ltcGwvUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3JJbXBsLmphdmEKQEAgLTAsMCArMSwxMTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuaW1wbC5FZGdlRGVjb3JhdG9ySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2VMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlRyYW5zcG9ydFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuTG9hZFVubG9hZEVkZ2VMYWJlbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhY2tldCBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtIERlY29yYXRvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9ySW1wbCBleHRlbmRzIEVkZ2VEZWNvcmF0b3JJbXBsIGltcGxlbWVudHMgUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3IgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBUcmFuc3BvcnRQYWNrYWdlLkxpdGVyYWxzLlBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX0RFQ09SQVRPUjsKKwl9CisKKwkvKioKKwkgKiBVdGlsaXR5IG1ldGhvZCBmb3IgZ2V0dGluZyBhbGwgb2YgdGhlIExvYWRVbmxvYWRFZGdlTGFiZWxzIGluIHRoZSBncmFwaAorCSAqICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248TG9hZFVubG9hZEVkZ2VMYWJlbD4gZ2V0TG9hZFVubG9hZExhYmVscyAoZmluYWwgR3JhcGggZ3JhcGgpeworCQkvL0xpc3Qgd2Ugd2lsbCByZXR1cm4KKwkJZmluYWwgTGlzdDxMb2FkVW5sb2FkRWRnZUxhYmVsPiByYyA9IG5ldyBBcnJheUxpc3Q8TG9hZFVubG9hZEVkZ2VMYWJlbD4oKTsKKwkKKwkJLy9nZXQgYWxsIG9mIHRoZSBMb2FkVW5sb2FkRWRnZUxhYmVscworCQkJZm9yIChJdGVyYXRvcjxEeW5hbWljTGFiZWw+IGx1TGFiZWxJdGVyYXRvciA9IGdyYXBoLmdldER5bmFtaWNMYWJlbHMoKS5pdGVyYXRvcigpOworCQlsdUxhYmVsSXRlcmF0b3IuaGFzTmV4dCgpOykgewkJCQorCQkJRHluYW1pY0xhYmVsIHRtcCA9IGx1TGFiZWxJdGVyYXRvci5uZXh0KCk7CisJCQlpZiAodG1wLmdldFR5cGVVUkkoKS5lcXVhbHMoTG9hZFVubG9hZEVkZ2VMYWJlbC5VUklfVFlQRV9MT0FEX1VOTE9BRF9FREdFX0xBQkVMKSkgeworCQkJCXJjLmFkZCgoTG9hZFVubG9hZEVkZ2VMYWJlbCl0bXApOworCQkJfQorCQl9CisJCisJCXJldHVybiByYzsKKwl9CisJCisJLyoqCisJICogSW5pdGlhbGl6ZSB0aGUgZ3JhcGguIE1ha2VzIHN1cmUgYWxsIG9mIHRoZSByYXRlcyBmb3IgdGhlIGVkZ2VzIGFyZSB6ZXJvZWQgb3V0LgorCSAqLworCXB1YmxpYyBib29sZWFuIGRlY29yYXRlR3JhcGgoU1RFTVRpbWUgdGltZSkgeworCQkvL1RoZXJlIGlzIG5vdGhpbmcgdG8gZG8gZXhjZXB0IHJlc2V0IHRoZSBsYWJlbHMuCQkKKwkJcmVzZXRMYWJlbHMoKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCS8qKgorCSAqIFVwZGF0ZSBsYWJlbHMuIE1ha2Ugc3VyZSBhbGwgb2YgdGhlIGxhYmVscyBmb3IgdGhlIGdyYXBoIGFyZSBpbiB0aGUgYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgdGltCisJICogaW50ZXJ2YWwuCisJICovCisJcHVibGljIHZvaWQgdXBkYXRlTGFiZWxzKGZpbmFsIFNURU1UaW1lIHRpbWUsIGZpbmFsIGxvbmcgdGltZXJQZXJpb2QsIGludCBjeWNsZSkgeworCQlmb3IgKEl0ZXJhdG9yPExvYWRVbmxvYWRFZGdlTGFiZWw+IGl0ID0gZ2V0TG9hZFVubG9hZExhYmVscyhnZXRHcmFwaCgpKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CQkJCisJCQlMb2FkVW5sb2FkRWRnZUxhYmVsIHRvVXBkYXRlID0gaXQubmV4dCgpOwkJCQorCQkJCisJCQlpZih0aW1lLmdldFRpbWUoKS5hZnRlcih0b1VwZGF0ZS5nZXRBY3RpdmF0aW9uVGltZSgpLmdldFRpbWUoKSkgJiYKKwkJCQkJdGltZS5nZXRUaW1lKCkuYmVmb3JlKHRvVXBkYXRlLmdldERlYWN0aXZhdGlvblRpbWUoKS5nZXRUaW1lKCkpKSB7CisJCQkJLy9FZGdlIHNob3VsZCBiZSBhY3RpdmUuLi50aGUgcmF0ZSBvZiBhY3RpdmUgZWRnZXMgbmVlZHMgdG8gYmUgbm9ybWFsaXplZAorCQkJCS8vIHRvIHRoZSBwb3B1bGF0aW9uIHRoYXQgaXMgY29taW5nIGluCQkJCQorCQkJCSgoTWlncmF0aW9uRWRnZUxhYmVsVmFsdWUpdG9VcGRhdGUuZ2V0TmV4dFZhbHVlKCkpLnNldE1pZ3JhdGlvblJhdGUodG9VcGRhdGUuZ2V0Tm9ybWFsaXplZEFjdGl2YXRlZFJhdGUoKSk7CQkJCQorCQkJfSBlbHNlIHsKKwkJCQkvL0VkZ2Ugc2hvdWxkIGJlIGluYWN0aXZlCisJCQkJKChNaWdyYXRpb25FZGdlTGFiZWxWYWx1ZSl0b1VwZGF0ZS5nZXROZXh0VmFsdWUoKSkuc2V0TWlncmF0aW9uUmF0ZSgwLjApOworCQkJfQorCQl9CisJfQorCQorCS8qKgorCSAqIHJlc2V0IHRoZSBsYWJlbHMgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgZ3JhcGgKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXNldExhYmVscygpIHsKKwkJZm9yIChJdGVyYXRvcjxMb2FkVW5sb2FkRWRnZUxhYmVsPiBpdCA9IGdldExvYWRVbmxvYWRMYWJlbHMoZ2V0R3JhcGgoKSkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewkJCQorCQkJTG9hZFVubG9hZEVkZ2VMYWJlbCB0b1VwZGF0ZSA9IGl0Lm5leHQoKTsKKwkJCXRvVXBkYXRlLnJlc2V0KCk7CisJCX0KKwl9CisJCit9IC8vUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3JJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvaW1wbC9QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9pbXBsL1BhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MmE2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvaW1wbC9QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbUltcGwuamF2YQpAQCAtMCwwICsxLDI0NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5Mb2FkVW5sb2FkRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRUcmFuc3BvcnRMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5UcmFuc3BvcnRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFja2V0IFN0eWxlIFRyYW5zcG9ydCBTeXN0ZW08L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1JbXBsI2dldFBhY2tldFRyYW5zcG9ydExhYmVsIDxlbT5QYWNrZXQgVHJhbnNwb3J0IExhYmVsPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtSW1wbCNnZXRMb2FkaW5nRWRnZXMgPGVtPkxvYWRpbmcgRWRnZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1JbXBsI2dldFVubG9hZGluZ0VkZ2VzIDxlbT5VbmxvYWRpbmcgRWRnZXM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbUltcGwgZXh0ZW5kcyBUcmFuc3BvcnRTeXN0ZW1JbXBsIGltcGxlbWVudHMgUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0geworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2tldFRyYW5zcG9ydExhYmVsKCkgPGVtPlBhY2tldCBUcmFuc3BvcnQgTGFiZWw8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBhY2tldFRyYW5zcG9ydExhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGFja2V0VHJhbnNwb3J0TGFiZWwgcGFja2V0VHJhbnNwb3J0TGFiZWw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2FkaW5nRWRnZXMoKSA8ZW0+TG9hZGluZyBFZGdlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMb2FkaW5nRWRnZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxMb2FkVW5sb2FkRWRnZT4gbG9hZGluZ0VkZ2VzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5sb2FkaW5nRWRnZXMoKSA8ZW0+VW5sb2FkaW5nIEVkZ2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFVubG9hZGluZ0VkZ2VzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8TG9hZFVubG9hZEVkZ2U+IHVubG9hZGluZ0VkZ2VzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbUltcGwoKSB7CisJCXN1cGVyKCk7CisJCQkJCisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBUcmFuc3BvcnRQYWNrYWdlLkxpdGVyYWxzLlBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQYWNrZXRUcmFuc3BvcnRMYWJlbCBnZXRQYWNrZXRUcmFuc3BvcnRMYWJlbCgpIHsKKwkJaWYgKHBhY2tldFRyYW5zcG9ydExhYmVsICE9IG51bGwgJiYgcGFja2V0VHJhbnNwb3J0TGFiZWwuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFBhY2tldFRyYW5zcG9ydExhYmVsID0gKEludGVybmFsRU9iamVjdClwYWNrZXRUcmFuc3BvcnRMYWJlbDsKKwkJCXBhY2tldFRyYW5zcG9ydExhYmVsID0gKFBhY2tldFRyYW5zcG9ydExhYmVsKWVSZXNvbHZlUHJveHkob2xkUGFja2V0VHJhbnNwb3J0TGFiZWwpOworCQkJaWYgKHBhY2tldFRyYW5zcG9ydExhYmVsICE9IG9sZFBhY2tldFRyYW5zcG9ydExhYmVsKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgVHJhbnNwb3J0UGFja2FnZS5QQUNLRVRfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9fUEFDS0VUX1RSQU5TUE9SVF9MQUJFTCwgb2xkUGFja2V0VHJhbnNwb3J0TGFiZWwsIHBhY2tldFRyYW5zcG9ydExhYmVsKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHBhY2tldFRyYW5zcG9ydExhYmVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQYWNrZXRUcmFuc3BvcnRMYWJlbCBiYXNpY0dldFBhY2tldFRyYW5zcG9ydExhYmVsKCkgeworCQlyZXR1cm4gcGFja2V0VHJhbnNwb3J0TGFiZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhY2tldFRyYW5zcG9ydExhYmVsKFBhY2tldFRyYW5zcG9ydExhYmVsIG5ld1BhY2tldFRyYW5zcG9ydExhYmVsKSB7CisJCVBhY2tldFRyYW5zcG9ydExhYmVsIG9sZFBhY2tldFRyYW5zcG9ydExhYmVsID0gcGFja2V0VHJhbnNwb3J0TGFiZWw7CisJCXBhY2tldFRyYW5zcG9ydExhYmVsID0gbmV3UGFja2V0VHJhbnNwb3J0TGFiZWw7CisJCW5ld1BhY2tldFRyYW5zcG9ydExhYmVsLnNldFVSSU9mSWRlbnRpZmlhYmxlVG9CZUxhYmVsZWQodGhpcy5nZXRVUkkoKSk7CisJCXRoaXMuZ2V0TGFiZWxzKCkuYWRkKG5ld1BhY2tldFRyYW5zcG9ydExhYmVsKTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVHJhbnNwb3J0UGFja2FnZS5QQUNLRVRfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9fUEFDS0VUX1RSQU5TUE9SVF9MQUJFTCwgb2xkUGFja2V0VHJhbnNwb3J0TGFiZWwsIHBhY2tldFRyYW5zcG9ydExhYmVsKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PExvYWRVbmxvYWRFZGdlPiBnZXRMb2FkaW5nRWRnZXMoKSB7CisJCWlmIChsb2FkaW5nRWRnZXMgPT0gbnVsbCkgeworCQkJbG9hZGluZ0VkZ2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxMb2FkVW5sb2FkRWRnZT4oTG9hZFVubG9hZEVkZ2UuY2xhc3MsIHRoaXMsIFRyYW5zcG9ydFBhY2thZ2UuUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX0xPQURJTkdfRURHRVMpOworCQl9CisJCXJldHVybiBsb2FkaW5nRWRnZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PExvYWRVbmxvYWRFZGdlPiBnZXRVbmxvYWRpbmdFZGdlcygpIHsKKwkJaWYgKHVubG9hZGluZ0VkZ2VzID09IG51bGwpIHsKKwkJCXVubG9hZGluZ0VkZ2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxMb2FkVW5sb2FkRWRnZT4oTG9hZFVubG9hZEVkZ2UuY2xhc3MsIHRoaXMsIFRyYW5zcG9ydFBhY2thZ2UuUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX1VOTE9BRElOR19FREdFUyk7CisJCX0KKwkJcmV0dXJuIHVubG9hZGluZ0VkZ2VzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QQUNLRVRfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9fUEFDS0VUX1RSQU5TUE9SVF9MQUJFTDoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFBhY2tldFRyYW5zcG9ydExhYmVsKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0UGFja2V0VHJhbnNwb3J0TGFiZWwoKTsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QQUNLRVRfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9fTE9BRElOR19FREdFUzoKKwkJCQlyZXR1cm4gZ2V0TG9hZGluZ0VkZ2VzKCk7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX1VOTE9BRElOR19FREdFUzoKKwkJCQlyZXR1cm4gZ2V0VW5sb2FkaW5nRWRnZXMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLlBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19QQUNLRVRfVFJBTlNQT1JUX0xBQkVMOgorCQkJCXNldFBhY2tldFRyYW5zcG9ydExhYmVsKChQYWNrZXRUcmFuc3BvcnRMYWJlbCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLlBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19MT0FESU5HX0VER0VTOgorCQkJCWdldExvYWRpbmdFZGdlcygpLmNsZWFyKCk7CisJCQkJZ2V0TG9hZGluZ0VkZ2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBMb2FkVW5sb2FkRWRnZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QQUNLRVRfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9fVU5MT0FESU5HX0VER0VTOgorCQkJCWdldFVubG9hZGluZ0VkZ2VzKCkuY2xlYXIoKTsKKwkJCQlnZXRVbmxvYWRpbmdFZGdlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTG9hZFVubG9hZEVkZ2U+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLlBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19QQUNLRVRfVFJBTlNQT1JUX0xBQkVMOgorCQkJCXNldFBhY2tldFRyYW5zcG9ydExhYmVsKChQYWNrZXRUcmFuc3BvcnRMYWJlbCludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX0xPQURJTkdfRURHRVM6CisJCQkJZ2V0TG9hZGluZ0VkZ2VzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX1VOTE9BRElOR19FREdFUzoKKwkJCQlnZXRVbmxvYWRpbmdFZGdlcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX1BBQ0tFVF9UUkFOU1BPUlRfTEFCRUw6CisJCQkJcmV0dXJuIHBhY2tldFRyYW5zcG9ydExhYmVsICE9IG51bGw7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX0xPQURJTkdfRURHRVM6CisJCQkJcmV0dXJuIGxvYWRpbmdFZGdlcyAhPSBudWxsICYmICFsb2FkaW5nRWRnZXMuaXNFbXB0eSgpOworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLlBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19VTkxPQURJTkdfRURHRVM6CisJCQkJcmV0dXJuIHVubG9hZGluZ0VkZ2VzICE9IG51bGwgJiYgIXVubG9hZGluZ0VkZ2VzLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCQorCQorfSAvL1BhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L2ltcGwvUGFja2V0VHJhbnNwb3J0TGFiZWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvaW1wbC9QYWNrZXRUcmFuc3BvcnRMYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzRjYzJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L2ltcGwvUGFja2V0VHJhbnNwb3J0TGFiZWxJbXBsLmphdmEKQEAgLTAsMCArMSw2OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5Ob2RlTGFiZWxJbXBsOworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRUcmFuc3BvcnRMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlRyYW5zcG9ydEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuVHJhbnNwb3J0UGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhY2tldCBUcmFuc3BvcnQgTGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQYWNrZXRUcmFuc3BvcnRMYWJlbEltcGwgZXh0ZW5kcyBOb2RlTGFiZWxJbXBsIGltcGxlbWVudHMgUGFja2V0VHJhbnNwb3J0TGFiZWwgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgUGFja2V0VHJhbnNwb3J0TGFiZWxJbXBsKCkgeworCQlzdXBlcigpOwkJCisJCQorCQkvL1NldCB0aGUgbGFiZWwgdmFsdWUKKwkJdGhpcy5zZXRDdXJyZW50VmFsdWUoVHJhbnNwb3J0RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZSgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFRyYW5zcG9ydFBhY2thZ2UuTGl0ZXJhbHMuUEFDS0VUX1RSQU5TUE9SVF9MQUJFTDsKKwl9CisJCisJCisKKwkvKipNYWtlIHRoZSBjdXJyZW50ICB2YWx1ZSBzdHVmZiBoYXZlIHRvIGJlIFBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWVzCisJICogKi8KKwlwdWJsaWMgUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZSBnZXRDdXJyZW50VmFsdWUoKSB7CisJCXJldHVybiAoUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZSlzdXBlci5nZXRDdXJyZW50VmFsdWUoKTsKKwl9CisJcHVibGljIHZvaWQgc2V0Q3VycmVudFZhbHVlKFBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWUgdmFsKSB7CisJCXN1cGVyLnNldEN1cnJlbnRWYWx1ZSh2YWwpOworCX0KKwkKKwkKK30gLy9QYWNrZXRUcmFuc3BvcnRMYWJlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9pbXBsL1BhY2tldFRyYW5zcG9ydExhYmVsVmFsdWVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvaW1wbC9QYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYTM2MDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvaW1wbC9QYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLmltcGwuTGFiZWxWYWx1ZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlRyYW5zcG9ydFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrZXQgVHJhbnNwb3J0IExhYmVsIFZhbHVlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWVJbXBsI2dldENhcGFjaXR5IDxlbT5DYXBhY2l0eTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWVJbXBsIGV4dGVuZHMgTGFiZWxWYWx1ZUltcGwgaW1wbGVtZW50cyBQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FwYWNpdHkoKSA8ZW0+Q2FwYWNpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENhcGFjaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBDQVBBQ0lUWV9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhcGFjaXR5KCkgPGVtPkNhcGFjaXR5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDYXBhY2l0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBjYXBhY2l0eSA9IENBUEFDSVRZX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gVHJhbnNwb3J0UGFja2FnZS5MaXRlcmFscy5QQUNLRVRfVFJBTlNQT1JUX0xBQkVMX1ZBTFVFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0Q2FwYWNpdHkoKSB7CisJCXJldHVybiBjYXBhY2l0eTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDYXBhY2l0eShkb3VibGUgbmV3Q2FwYWNpdHkpIHsKKwkJZG91YmxlIG9sZENhcGFjaXR5ID0gY2FwYWNpdHk7CisJCWNhcGFjaXR5ID0gbmV3Q2FwYWNpdHk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRyYW5zcG9ydFBhY2thZ2UuUEFDS0VUX1RSQU5TUE9SVF9MQUJFTF9WQUxVRV9fQ0FQQUNJVFksIG9sZENhcGFjaXR5LCBjYXBhY2l0eSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QQUNLRVRfVFJBTlNQT1JUX0xBQkVMX1ZBTFVFX19DQVBBQ0lUWToKKwkJCQlyZXR1cm4gZ2V0Q2FwYWNpdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLlBBQ0tFVF9UUkFOU1BPUlRfTEFCRUxfVkFMVUVfX0NBUEFDSVRZOgorCQkJCXNldENhcGFjaXR5KChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUEFDS0VUX1RSQU5TUE9SVF9MQUJFTF9WQUxVRV9fQ0FQQUNJVFk6CisJCQkJc2V0Q2FwYWNpdHkoQ0FQQUNJVFlfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLlBBQ0tFVF9UUkFOU1BPUlRfTEFCRUxfVkFMVUVfX0NBUEFDSVRZOgorCQkJCXJldHVybiBjYXBhY2l0eSAhPSBDQVBBQ0lUWV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGNhcGFjaXR5OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChjYXBhY2l0eSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwkvKipSZXNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZSovCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCXN1cGVyLnJlc2V0KCk7CisJCXNldENhcGFjaXR5KENBUEFDSVRZX0VERUZBVUxUKTsJCisJfQorCisKK30gLy9QYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L2ltcGwvUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L2ltcGwvUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MWQ0ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvaW1wbC9QaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW1JbXBsLmphdmEKQEAgLTAsMCArMSwyNDUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVUcmFuc3BvcnRFZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlRyYW5zcG9ydFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QaXBlIFN0eWxlIFRyYW5zcG9ydCBTeXN0ZW08L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtSW1wbCNnZXRJblRyYW5zcG9ydEVkZ2VzIDxlbT5JbiBUcmFuc3BvcnQgRWRnZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGwuUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtSW1wbCNnZXRPdXRUcmFuc3BvcnRFZGdlcyA8ZW0+T3V0IFRyYW5zcG9ydCBFZGdlczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5QaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW1JbXBsI2dldE1heENhcGFjaXR5IDxlbT5NYXggQ2FwYWNpdHk8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW1JbXBsIGV4dGVuZHMgVHJhbnNwb3J0U3lzdGVtSW1wbCBpbXBsZW1lbnRzIFBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbSB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5UcmFuc3BvcnRFZGdlcygpIDxlbT5JbiBUcmFuc3BvcnQgRWRnZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW5UcmFuc3BvcnRFZGdlcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFBpcGVUcmFuc3BvcnRFZGdlPiBpblRyYW5zcG9ydEVkZ2VzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0VHJhbnNwb3J0RWRnZXMoKSA8ZW0+T3V0IFRyYW5zcG9ydCBFZGdlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPdXRUcmFuc3BvcnRFZGdlcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFBpcGVUcmFuc3BvcnRFZGdlPiBvdXRUcmFuc3BvcnRFZGdlczsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXhDYXBhY2l0eSgpIDxlbT5NYXggQ2FwYWNpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1heENhcGFjaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBNQVhfQ0FQQUNJVFlfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXhDYXBhY2l0eSgpIDxlbT5NYXggQ2FwYWNpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1heENhcGFjaXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIG1heENhcGFjaXR5ID0gTUFYX0NBUEFDSVRZX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBUcmFuc3BvcnRQYWNrYWdlLkxpdGVyYWxzLlBJUEVfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8UGlwZVRyYW5zcG9ydEVkZ2U+IGdldEluVHJhbnNwb3J0RWRnZXMoKSB7CisJCWlmIChpblRyYW5zcG9ydEVkZ2VzID09IG51bGwpIHsKKwkJCWluVHJhbnNwb3J0RWRnZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFBpcGVUcmFuc3BvcnRFZGdlPihQaXBlVHJhbnNwb3J0RWRnZS5jbGFzcywgdGhpcywgVHJhbnNwb3J0UGFja2FnZS5QSVBFX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX0lOX1RSQU5TUE9SVF9FREdFUyk7CisJCX0KKwkJcmV0dXJuIGluVHJhbnNwb3J0RWRnZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFBpcGVUcmFuc3BvcnRFZGdlPiBnZXRPdXRUcmFuc3BvcnRFZGdlcygpIHsKKwkJaWYgKG91dFRyYW5zcG9ydEVkZ2VzID09IG51bGwpIHsKKwkJCW91dFRyYW5zcG9ydEVkZ2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxQaXBlVHJhbnNwb3J0RWRnZT4oUGlwZVRyYW5zcG9ydEVkZ2UuY2xhc3MsIHRoaXMsIFRyYW5zcG9ydFBhY2thZ2UuUElQRV9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19PVVRfVFJBTlNQT1JUX0VER0VTKTsKKwkJfQorCQlyZXR1cm4gb3V0VHJhbnNwb3J0RWRnZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRNYXhDYXBhY2l0eSgpIHsKKwkJcmV0dXJuIG1heENhcGFjaXR5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1heENhcGFjaXR5KGRvdWJsZSBuZXdNYXhDYXBhY2l0eSkgeworCQlkb3VibGUgb2xkTWF4Q2FwYWNpdHkgPSBtYXhDYXBhY2l0eTsKKwkJbWF4Q2FwYWNpdHkgPSBuZXdNYXhDYXBhY2l0eTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVHJhbnNwb3J0UGFja2FnZS5QSVBFX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX01BWF9DQVBBQ0lUWSwgb2xkTWF4Q2FwYWNpdHksIG1heENhcGFjaXR5KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLlBJUEVfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9fSU5fVFJBTlNQT1JUX0VER0VTOgorCQkJCXJldHVybiBnZXRJblRyYW5zcG9ydEVkZ2VzKCk7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUElQRV9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19PVVRfVFJBTlNQT1JUX0VER0VTOgorCQkJCXJldHVybiBnZXRPdXRUcmFuc3BvcnRFZGdlcygpOworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLlBJUEVfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9fTUFYX0NBUEFDSVRZOgorCQkJCXJldHVybiBnZXRNYXhDYXBhY2l0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUElQRV9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19JTl9UUkFOU1BPUlRfRURHRVM6CisJCQkJZ2V0SW5UcmFuc3BvcnRFZGdlcygpLmNsZWFyKCk7CisJCQkJZ2V0SW5UcmFuc3BvcnRFZGdlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUGlwZVRyYW5zcG9ydEVkZ2U+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUElQRV9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19PVVRfVFJBTlNQT1JUX0VER0VTOgorCQkJCWdldE91dFRyYW5zcG9ydEVkZ2VzKCkuY2xlYXIoKTsKKwkJCQlnZXRPdXRUcmFuc3BvcnRFZGdlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUGlwZVRyYW5zcG9ydEVkZ2U+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUElQRV9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19NQVhfQ0FQQUNJVFk6CisJCQkJc2V0TWF4Q2FwYWNpdHkoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QSVBFX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX0lOX1RSQU5TUE9SVF9FREdFUzoKKwkJCQlnZXRJblRyYW5zcG9ydEVkZ2VzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUElQRV9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19PVVRfVFJBTlNQT1JUX0VER0VTOgorCQkJCWdldE91dFRyYW5zcG9ydEVkZ2VzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUElQRV9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19NQVhfQ0FQQUNJVFk6CisJCQkJc2V0TWF4Q2FwYWNpdHkoTUFYX0NBUEFDSVRZX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QSVBFX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX0lOX1RSQU5TUE9SVF9FREdFUzoKKwkJCQlyZXR1cm4gaW5UcmFuc3BvcnRFZGdlcyAhPSBudWxsICYmICFpblRyYW5zcG9ydEVkZ2VzLmlzRW1wdHkoKTsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QSVBFX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX09VVF9UUkFOU1BPUlRfRURHRVM6CisJCQkJcmV0dXJuIG91dFRyYW5zcG9ydEVkZ2VzICE9IG51bGwgJiYgIW91dFRyYW5zcG9ydEVkZ2VzLmlzRW1wdHkoKTsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QSVBFX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX01BWF9DQVBBQ0lUWToKKwkJCQlyZXR1cm4gbWF4Q2FwYWNpdHkgIT0gTUFYX0NBUEFDSVRZX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobWF4Q2FwYWNpdHk6ICIpOworCQlyZXN1bHQuYXBwZW5kKG1heENhcGFjaXR5KTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L2ltcGwvUGlwZVRyYW5zcG9ydEVkZ2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvaW1wbC9QaXBlVHJhbnNwb3J0RWRnZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODExODY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L2ltcGwvUGlwZVRyYW5zcG9ydEVkZ2VJbXBsLmphdmEKQEAgLTAsMCArMSw2OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLmltcGwuUG9wdWxhdGlvbkVkZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5pbXBsLkVkZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGlwZVRyYW5zcG9ydEVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuVHJhbnNwb3J0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5UcmFuc3BvcnRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGlwZSBUcmFuc3BvcnQgRWRnZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBpcGVUcmFuc3BvcnRFZGdlSW1wbCBleHRlbmRzIFBvcHVsYXRpb25FZGdlSW1wbCBpbXBsZW1lbnRzIFBpcGVUcmFuc3BvcnRFZGdlIHsKKwkKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIFVSSSdzIGZvciBlYWNoIHBpcGUgdHJhbnNwb3J0IGVkZ2UgZ2VuZXJhdGVkCisJICovCisJc3RhdGljIGludCBwaXBlVHJhbnNwb3J0RWRnZUNvdW50ZXIgPSAwOworCQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgUGlwZVRyYW5zcG9ydEVkZ2VJbXBsKCkgeworCQlzdXBlcigpOworCQkvL3NldCB0aGUgVVJJCisJCXNldFVSSShTVEVNVVJJLmNyZWF0ZVVSSShVUklfVFlQRV9QSVBFX1RSQU5TUE9SVF9FREdFX1NFR01FTlQgKyAiLyIKKwkJCQkrIEludGVnZXIudG9TdHJpbmcocGlwZVRyYW5zcG9ydEVkZ2VDb3VudGVyKyspKSk7CisJCQkKKwkJLy9NYWtlIGEgbGFiZWwKKwkJc2V0TGFiZWwoVHJhbnNwb3J0RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbCgpKTsJCQkJCisJCQorCQkvL3RoaXMgZWRnZSBtdXN0IGJlIGRpcmVjdGVkCisJCXNldERpcmVjdGVkKHRydWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gVHJhbnNwb3J0UGFja2FnZS5MaXRlcmFscy5QSVBFX1RSQU5TUE9SVF9FREdFOworCX0KKworfSAvL1BpcGVUcmFuc3BvcnRFZGdlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L2ltcGwvUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9pbXBsL1BpcGVUcmFuc3BvcnRFZGdlTGFiZWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1MGQ0YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9pbXBsL1BpcGVUcmFuc3BvcnRFZGdlTGFiZWxJbXBsLmphdmEKQEAgLTAsMCArMSw1MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5FZGdlTGFiZWxJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5UcmFuc3BvcnRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGlwZSBUcmFuc3BvcnQgRWRnZSBMYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBpcGVUcmFuc3BvcnRFZGdlTGFiZWxJbXBsIGV4dGVuZHMgRWRnZUxhYmVsSW1wbCBpbXBsZW1lbnRzIFBpcGVUcmFuc3BvcnRFZGdlTGFiZWwgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQaXBlVHJhbnNwb3J0RWRnZUxhYmVsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFRyYW5zcG9ydFBhY2thZ2UuTGl0ZXJhbHMuUElQRV9UUkFOU1BPUlRfRURHRV9MQUJFTDsKKwl9CisKK30gLy9QaXBlVHJhbnNwb3J0RWRnZUxhYmVsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L2ltcGwvUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L2ltcGwvUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NWY4NzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvaW1wbC9QaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWVJbXBsLmphdmEKQEAgLTAsMCArMSwyMjcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5MYWJlbFZhbHVlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5UcmFuc3BvcnRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGlwZSBUcmFuc3BvcnQgRWRnZSBMYWJlbCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbC5QaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWVJbXBsI2dldE1heEZsb3cgPGVtPk1heCBGbG93PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsLlBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZUltcGwjZ2V0VGltZVBlcmlvZCA8ZW0+VGltZSBQZXJpb2Q8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWVJbXBsIGV4dGVuZHMgTGFiZWxWYWx1ZUltcGwgaW1wbGVtZW50cyBQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXhGbG93KCkgPGVtPk1heCBGbG93PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXhGbG93KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBNQVhfRkxPV19FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1heEZsb3coKSA8ZW0+TWF4IEZsb3c8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1heEZsb3coKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgbWF4RmxvdyA9IE1BWF9GTE9XX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVQZXJpb2QoKSA8ZW0+VGltZSBQZXJpb2Q8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRpbWVQZXJpb2QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBUSU1FX1BFUklPRF9FREVGQVVMVCA9IDBMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZVBlcmlvZCgpIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGltZVBlcmlvZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGxvbmcgdGltZVBlcmlvZCA9IFRJTUVfUEVSSU9EX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBUcmFuc3BvcnRQYWNrYWdlLkxpdGVyYWxzLlBJUEVfVFJBTlNQT1JUX0VER0VfTEFCRUxfVkFMVUU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRNYXhGbG93KCkgeworCQlyZXR1cm4gbWF4RmxvdzsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXhGbG93KGRvdWJsZSBuZXdNYXhGbG93KSB7CisJCWRvdWJsZSBvbGRNYXhGbG93ID0gbWF4RmxvdzsKKwkJbWF4RmxvdyA9IG5ld01heEZsb3c7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRyYW5zcG9ydFBhY2thZ2UuUElQRV9UUkFOU1BPUlRfRURHRV9MQUJFTF9WQUxVRV9fTUFYX0ZMT1csIG9sZE1heEZsb3csIG1heEZsb3cpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRUaW1lUGVyaW9kKCkgeworCQlyZXR1cm4gdGltZVBlcmlvZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUaW1lUGVyaW9kKGxvbmcgbmV3VGltZVBlcmlvZCkgeworCQlsb25nIG9sZFRpbWVQZXJpb2QgPSB0aW1lUGVyaW9kOworCQl0aW1lUGVyaW9kID0gbmV3VGltZVBlcmlvZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVHJhbnNwb3J0UGFja2FnZS5QSVBFX1RSQU5TUE9SVF9FREdFX0xBQkVMX1ZBTFVFX19USU1FX1BFUklPRCwgb2xkVGltZVBlcmlvZCwgdGltZVBlcmlvZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QSVBFX1RSQU5TUE9SVF9FREdFX0xBQkVMX1ZBTFVFX19NQVhfRkxPVzoKKwkJCQlyZXR1cm4gZ2V0TWF4RmxvdygpOworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLlBJUEVfVFJBTlNQT1JUX0VER0VfTEFCRUxfVkFMVUVfX1RJTUVfUEVSSU9EOgorCQkJCXJldHVybiBnZXRUaW1lUGVyaW9kKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QSVBFX1RSQU5TUE9SVF9FREdFX0xBQkVMX1ZBTFVFX19NQVhfRkxPVzoKKwkJCQlzZXRNYXhGbG93KChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QSVBFX1RSQU5TUE9SVF9FREdFX0xBQkVMX1ZBTFVFX19USU1FX1BFUklPRDoKKwkJCQlzZXRUaW1lUGVyaW9kKChMb25nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLlBJUEVfVFJBTlNQT1JUX0VER0VfTEFCRUxfVkFMVUVfX01BWF9GTE9XOgorCQkJCXNldE1heEZsb3coTUFYX0ZMT1dfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QSVBFX1RSQU5TUE9SVF9FREdFX0xBQkVMX1ZBTFVFX19USU1FX1BFUklPRDoKKwkJCQlzZXRUaW1lUGVyaW9kKFRJTUVfUEVSSU9EX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QSVBFX1RSQU5TUE9SVF9FREdFX0xBQkVMX1ZBTFVFX19NQVhfRkxPVzoKKwkJCQlyZXR1cm4gbWF4RmxvdyAhPSBNQVhfRkxPV19FREVGQVVMVDsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QSVBFX1RSQU5TUE9SVF9FREdFX0xBQkVMX1ZBTFVFX19USU1FX1BFUklPRDoKKwkJCQlyZXR1cm4gdGltZVBlcmlvZCAhPSBUSU1FX1BFUklPRF9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKG1heEZsb3c6ICIpOworCQlyZXN1bHQuYXBwZW5kKG1heEZsb3cpOworCQlyZXN1bHQuYXBwZW5kKCIsIHRpbWVQZXJpb2Q6ICIpOworCQlyZXN1bHQuYXBwZW5kKHRpbWVQZXJpb2QpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9QaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWVJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvaW1wbC9UcmFuc3BvcnRGYWN0b3J5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L2ltcGwvVHJhbnNwb3J0RmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWNhNjUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L2ltcGwvVHJhbnNwb3J0RmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDIwMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5pbXBsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0Lio7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVHJhbnNwb3J0RmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBUcmFuc3BvcnRGYWN0b3J5IHsKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUcmFuc3BvcnRGYWN0b3J5IGluaXQoKSB7CisJCXRyeSB7CisJCQlUcmFuc3BvcnRGYWN0b3J5IHRoZVRyYW5zcG9ydEZhY3RvcnkgPSAoVHJhbnNwb3J0RmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC5lY29yZSIpOyAKKwkJCWlmICh0aGVUcmFuc3BvcnRGYWN0b3J5ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdGhlVHJhbnNwb3J0RmFjdG9yeTsKKwkJCX0KKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwkJcmV0dXJuIG5ldyBUcmFuc3BvcnRGYWN0b3J5SW1wbCgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRyYW5zcG9ydEZhY3RvcnlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7CisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRTogcmV0dXJuIGNyZWF0ZUxvYWRVbmxvYWRFZGdlKCk7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuTE9BRF9VTkxPQURfRURHRV9MQUJFTDogcmV0dXJuIGNyZWF0ZUxvYWRVbmxvYWRFZGdlTGFiZWwoKTsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QQUNLRVRfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTTogcmV0dXJuIGNyZWF0ZVBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtKCk7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUEFDS0VUX1RSQU5TUE9SVF9MQUJFTDogcmV0dXJuIGNyZWF0ZVBhY2tldFRyYW5zcG9ydExhYmVsKCk7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUElQRV9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNOiByZXR1cm4gY3JlYXRlUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtKCk7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUEFDS0VUX1RSQU5TUE9SVF9MQUJFTF9WQUxVRTogcmV0dXJuIGNyZWF0ZVBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWUoKTsKKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QQUNLRVRfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9ERUNPUkFUT1I6IHJldHVybiBjcmVhdGVQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvcigpOworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLlBJUEVfVFJBTlNQT1JUX0VER0U6IHJldHVybiBjcmVhdGVQaXBlVHJhbnNwb3J0RWRnZSgpOworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLlBJUEVfVFJBTlNQT1JUX0VER0VfTEFCRUw6IHJldHVybiBjcmVhdGVQaXBlVHJhbnNwb3J0RWRnZUxhYmVsKCk7CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUElQRV9UUkFOU1BPUlRfRURHRV9MQUJFTF9WQUxVRTogcmV0dXJuIGNyZWF0ZVBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSgpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExvYWRVbmxvYWRFZGdlIGNyZWF0ZUxvYWRVbmxvYWRFZGdlKCkgeworCQlMb2FkVW5sb2FkRWRnZUltcGwgbG9hZFVubG9hZEVkZ2UgPSBuZXcgTG9hZFVubG9hZEVkZ2VJbXBsKCk7CisJCXJldHVybiBsb2FkVW5sb2FkRWRnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTG9hZFVubG9hZEVkZ2VMYWJlbCBjcmVhdGVMb2FkVW5sb2FkRWRnZUxhYmVsKCkgeworCQlMb2FkVW5sb2FkRWRnZUxhYmVsSW1wbCBsb2FkVW5sb2FkRWRnZUxhYmVsID0gbmV3IExvYWRVbmxvYWRFZGdlTGFiZWxJbXBsKCk7CisJCXJldHVybiBsb2FkVW5sb2FkRWRnZUxhYmVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSBjcmVhdGVQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSgpIHsKKwkJUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1JbXBsIHBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtID0gbmV3IFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtSW1wbCgpOworCQlyZXR1cm4gcGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBhY2tldFRyYW5zcG9ydExhYmVsIGNyZWF0ZVBhY2tldFRyYW5zcG9ydExhYmVsKCkgeworCQlQYWNrZXRUcmFuc3BvcnRMYWJlbEltcGwgcGFja2V0VHJhbnNwb3J0TGFiZWwgPSBuZXcgUGFja2V0VHJhbnNwb3J0TGFiZWxJbXBsKCk7CisJCXJldHVybiBwYWNrZXRUcmFuc3BvcnRMYWJlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtIGNyZWF0ZVBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbSgpIHsKKwkJUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtSW1wbCBwaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW0gPSBuZXcgUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtSW1wbCgpOworCQlyZXR1cm4gcGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlIGNyZWF0ZVBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWUoKSB7CisJCVBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWVJbXBsIHBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWUgPSBuZXcgUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZUltcGwoKTsKKwkJcmV0dXJuIHBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9yIGNyZWF0ZVBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9yKCkgeworCQlQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvckltcGwgcGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3IgPSBuZXcgUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3JJbXBsKCk7CisJCXJldHVybiBwYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGlwZVRyYW5zcG9ydEVkZ2UgY3JlYXRlUGlwZVRyYW5zcG9ydEVkZ2UoKSB7CisJCVBpcGVUcmFuc3BvcnRFZGdlSW1wbCBwaXBlVHJhbnNwb3J0RWRnZSA9IG5ldyBQaXBlVHJhbnNwb3J0RWRnZUltcGwoKTsKKwkJcmV0dXJuIHBpcGVUcmFuc3BvcnRFZGdlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQaXBlVHJhbnNwb3J0RWRnZUxhYmVsIGNyZWF0ZVBpcGVUcmFuc3BvcnRFZGdlTGFiZWwoKSB7CisJCVBpcGVUcmFuc3BvcnRFZGdlTGFiZWxJbXBsIHBpcGVUcmFuc3BvcnRFZGdlTGFiZWwgPSBuZXcgUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbEltcGwoKTsKKwkJcmV0dXJuIHBpcGVUcmFuc3BvcnRFZGdlTGFiZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSBjcmVhdGVQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUoKSB7CisJCVBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZUltcGwgcGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlID0gbmV3IFBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZUltcGwoKTsKKwkJcmV0dXJuIHBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVHJhbnNwb3J0UGFja2FnZSBnZXRUcmFuc3BvcnRQYWNrYWdlKCkgeworCQlyZXR1cm4gKFRyYW5zcG9ydFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBkZXByZWNhdGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBUcmFuc3BvcnRQYWNrYWdlIGdldFBhY2thZ2UoKSB7CisJCXJldHVybiBUcmFuc3BvcnRQYWNrYWdlLmVJTlNUQU5DRTsKKwl9CisKK30gLy9UcmFuc3BvcnRGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGVmaW5pdGlvbnMvdHJhbnNwb3J0L2ltcGwvVHJhbnNwb3J0UGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9pbXBsL1RyYW5zcG9ydFBhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRiMDU4NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9pbXBsL1RyYW5zcG9ydFBhY2thZ2VJbXBsLmphdmEKQEAgLTAsMCArMSw1NTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuaW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vblBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuRWRnZXNQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuTG9hZFVubG9hZEVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuTG9hZFVubG9hZEVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRUcmFuc3BvcnRMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QaXBlVHJhbnNwb3J0RWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QaXBlVHJhbnNwb3J0RWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5UcmFuc3BvcnRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlRyYW5zcG9ydFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuVHJhbnNwb3J0U3lzdGVtOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRyYW5zcG9ydFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgVHJhbnNwb3J0UGFja2FnZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgbG9hZFVubG9hZEVkZ2VFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgbG9hZFVubG9hZEVkZ2VMYWJlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBwYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBwYWNrZXRUcmFuc3BvcnRMYWJlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBwaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW1FQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdHJhbnNwb3J0U3lzdGVtRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3JFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcGlwZVRyYW5zcG9ydEVkZ2VFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcGlwZVRyYW5zcG9ydEVkZ2VMYWJlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBwaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCisJICogcGFja2FnZSBVUkkgdmFsdWUuCisJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYworCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCisJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKKwkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuVHJhbnNwb3J0UGFja2FnZSNlTlNfVVJJCisJICogQHNlZSAjaW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgVHJhbnNwb3J0UGFja2FnZUltcGwoKSB7CisJCXN1cGVyKGVOU19VUkksIFRyYW5zcG9ydEZhY3RvcnkuZUlOU1RBTkNFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCisJICogCisJICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBUcmFuc3BvcnRQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgorCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNlTlNfVVJJCisJICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUcmFuc3BvcnRQYWNrYWdlIGluaXQoKSB7CisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChUcmFuc3BvcnRQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRyYW5zcG9ydFBhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQorCQlUcmFuc3BvcnRQYWNrYWdlSW1wbCB0aGVUcmFuc3BvcnRQYWNrYWdlID0gKFRyYW5zcG9ydFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBUcmFuc3BvcnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBUcmFuc3BvcnRQYWNrYWdlSW1wbCgpKTsKKworCQlpc0luaXRlZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCisJCUVkZ2VzUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisKKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKKwkJdGhlVHJhbnNwb3J0UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCisJCXRoZVRyYW5zcG9ydFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKwkJdGhlVHJhbnNwb3J0UGFja2FnZS5mcmVlemUoKTsKKworICAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChUcmFuc3BvcnRQYWNrYWdlLmVOU19VUkksIHRoZVRyYW5zcG9ydFBhY2thZ2UpOworCQlyZXR1cm4gdGhlVHJhbnNwb3J0UGFja2FnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldExvYWRVbmxvYWRFZGdlKCkgeworCQlyZXR1cm4gbG9hZFVubG9hZEVkZ2VFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0TG9hZFVubG9hZEVkZ2VfTG9hZGluZ0VkZ2UoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlsb2FkVW5sb2FkRWRnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0TG9hZFVubG9hZEVkZ2VMYWJlbCgpIHsKKwkJcmV0dXJuIGxvYWRVbmxvYWRFZGdlTGFiZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TG9hZFVubG9hZEVkZ2VMYWJlbF9BY3RpdmF0aW9uVGltZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWxvYWRVbmxvYWRFZGdlTGFiZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMb2FkVW5sb2FkRWRnZUxhYmVsX0RlYWN0aXZhdGlvblRpbWUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlsb2FkVW5sb2FkRWRnZUxhYmVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0TG9hZFVubG9hZEVkZ2VMYWJlbF9BY3RpdmF0ZWRSYXRlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9hZFVubG9hZEVkZ2VMYWJlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0oKSB7CisJCXJldHVybiBwYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbV9QYWNrZXRUcmFuc3BvcnRMYWJlbCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1fTG9hZGluZ0VkZ2VzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbV9VbmxvYWRpbmdFZGdlcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQYWNrZXRUcmFuc3BvcnRMYWJlbCgpIHsKKwkJcmV0dXJuIHBhY2tldFRyYW5zcG9ydExhYmVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtKCkgeworCQlyZXR1cm4gcGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbV9JblRyYW5zcG9ydEVkZ2VzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtX091dFRyYW5zcG9ydEVkZ2VzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtX01heENhcGFjaXR5KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRUcmFuc3BvcnRTeXN0ZW0oKSB7CisJCXJldHVybiB0cmFuc3BvcnRTeXN0ZW1FQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlKCkgeworCQlyZXR1cm4gcGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlX0NhcGFjaXR5KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3IoKSB7CisJCXJldHVybiBwYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFBpcGVUcmFuc3BvcnRFZGdlKCkgeworCQlyZXR1cm4gcGlwZVRyYW5zcG9ydEVkZ2VFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQaXBlVHJhbnNwb3J0RWRnZUxhYmVsKCkgeworCQlyZXR1cm4gcGlwZVRyYW5zcG9ydEVkZ2VMYWJlbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSgpIHsKKwkJcmV0dXJuIHBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWVfTWF4RmxvdygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZV9UaW1lUGVyaW9kKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRyYW5zcG9ydEZhY3RvcnkgZ2V0VHJhbnNwb3J0RmFjdG9yeSgpIHsKKwkJcmV0dXJuIChUcmFuc3BvcnRGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKKwkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47CisJCWlzQ3JlYXRlZCA9IHRydWU7CisKKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCisJCWxvYWRVbmxvYWRFZGdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKExPQURfVU5MT0FEX0VER0UpOworCQljcmVhdGVFQXR0cmlidXRlKGxvYWRVbmxvYWRFZGdlRUNsYXNzLCBMT0FEX1VOTE9BRF9FREdFX19MT0FESU5HX0VER0UpOworCisJCWxvYWRVbmxvYWRFZGdlTGFiZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTE9BRF9VTkxPQURfRURHRV9MQUJFTCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UobG9hZFVubG9hZEVkZ2VMYWJlbEVDbGFzcywgTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fQUNUSVZBVElPTl9USU1FKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShsb2FkVW5sb2FkRWRnZUxhYmVsRUNsYXNzLCBMT0FEX1VOTE9BRF9FREdFX0xBQkVMX19ERUFDVElWQVRJT05fVElNRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUobG9hZFVubG9hZEVkZ2VMYWJlbEVDbGFzcywgTE9BRF9VTkxPQURfRURHRV9MQUJFTF9fQUNUSVZBVEVEX1JBVEUpOworCisJCXBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShwYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbUVDbGFzcywgUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fX1BBQ0tFVF9UUkFOU1BPUlRfTEFCRUwpOworCQljcmVhdGVFUmVmZXJlbmNlKHBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRUNsYXNzLCBQQUNLRVRfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9fTE9BRElOR19FREdFUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UocGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1FQ2xhc3MsIFBBQ0tFVF9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19VTkxPQURJTkdfRURHRVMpOworCisJCXBhY2tldFRyYW5zcG9ydExhYmVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBQ0tFVF9UUkFOU1BPUlRfTEFCRUwpOworCisJCXBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQSVBFX1NUWUxFX1RSQU5TUE9SVF9TWVNURU0pOworCQljcmVhdGVFUmVmZXJlbmNlKHBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbUVDbGFzcywgUElQRV9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19JTl9UUkFOU1BPUlRfRURHRVMpOworCQljcmVhdGVFUmVmZXJlbmNlKHBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbUVDbGFzcywgUElQRV9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNX19PVVRfVFJBTlNQT1JUX0VER0VTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW1FQ2xhc3MsIFBJUEVfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTV9fTUFYX0NBUEFDSVRZKTsKKworCQl0cmFuc3BvcnRTeXN0ZW1FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVFJBTlNQT1JUX1NZU1RFTSk7CisKKwkJcGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQQUNLRVRfVFJBTlNQT1JUX0xBQkVMX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlRUNsYXNzLCBQQUNLRVRfVFJBTlNQT1JUX0xBQkVMX1ZBTFVFX19DQVBBQ0lUWSk7CisKKwkJcGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fREVDT1JBVE9SKTsKKworCQlwaXBlVHJhbnNwb3J0RWRnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQSVBFX1RSQU5TUE9SVF9FREdFKTsKKworCQlwaXBlVHJhbnNwb3J0RWRnZUxhYmVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBJUEVfVFJBTlNQT1JUX0VER0VfTEFCRUwpOworCisJCXBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQSVBFX1RSQU5TUE9SVF9FREdFX0xBQkVMX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWVFQ2xhc3MsIFBJUEVfVFJBTlNQT1JUX0VER0VfTEFCRUxfVkFMVUVfX01BWF9GTE9XKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWVFQ2xhc3MsIFBJUEVfVFJBTlNQT1JUX0VER0VfTEFCRUxfVkFMVUVfX1RJTUVfUEVSSU9EKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOworCisJLyoqCisJICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKKwkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47CisJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgcGFja2FnZQorCQlzZXROYW1lKGVOQU1FKTsKKwkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7CisJCXNldE5zVVJJKGVOU19VUkkpOworCisJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKKwkJRWRnZXNQYWNrYWdlIHRoZUVkZ2VzUGFja2FnZSA9IChFZGdlc1BhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWRnZXNQYWNrYWdlLmVOU19VUkkpOworCQlHcmFwaFBhY2thZ2UgdGhlR3JhcGhQYWNrYWdlID0gKEdyYXBoUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShHcmFwaFBhY2thZ2UuZU5TX1VSSSk7CisJCU1vZGVsUGFja2FnZSB0aGVNb2RlbFBhY2thZ2UgPSAoTW9kZWxQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZGVsUGFja2FnZS5lTlNfVVJJKTsKKwkJRWNvcmVQYWNrYWdlIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCWxvYWRVbmxvYWRFZGdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVkZ2VzUGFja2FnZS5nZXRNaWdyYXRpb25FZGdlKCkpOworCQlsb2FkVW5sb2FkRWRnZUxhYmVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVkZ2VzUGFja2FnZS5nZXRNaWdyYXRpb25FZGdlTGFiZWwoKSk7CisJCWxvYWRVbmxvYWRFZGdlTGFiZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlR3JhcGhQYWNrYWdlLmdldER5bmFtaWNMYWJlbCgpKTsKKwkJcGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRUcmFuc3BvcnRTeXN0ZW0oKSk7CisJCXBhY2tldFRyYW5zcG9ydExhYmVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUdyYXBoUGFja2FnZS5nZXROb2RlTGFiZWwoKSk7CisJCXBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFRyYW5zcG9ydFN5c3RlbSgpKTsKKwkJdHJhbnNwb3J0U3lzdGVtRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUdyYXBoUGFja2FnZS5nZXROb2RlKCkpOworCQlwYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUdyYXBoUGFja2FnZS5nZXRMYWJlbFZhbHVlKCkpOworCQlwYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVNb2RlbFBhY2thZ2UuZ2V0RWRnZURlY29yYXRvcigpKTsKKwkJcGlwZVRyYW5zcG9ydEVkZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWRnZXNQYWNrYWdlLmdldFBvcHVsYXRpb25FZGdlKCkpOworCQlwaXBlVHJhbnNwb3J0RWRnZUxhYmVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUdyYXBoUGFja2FnZS5nZXRFZGdlTGFiZWwoKSk7CisJCXBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVHcmFwaFBhY2thZ2UuZ2V0TGFiZWxWYWx1ZSgpKTsKKworCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycworCQlpbml0RUNsYXNzKGxvYWRVbmxvYWRFZGdlRUNsYXNzLCBMb2FkVW5sb2FkRWRnZS5jbGFzcywgIkxvYWRVbmxvYWRFZGdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRMb2FkVW5sb2FkRWRnZV9Mb2FkaW5nRWRnZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImxvYWRpbmdFZGdlIiwgImZhbHNlIiwgMCwgMSwgTG9hZFVubG9hZEVkZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhsb2FkVW5sb2FkRWRnZUxhYmVsRUNsYXNzLCBMb2FkVW5sb2FkRWRnZUxhYmVsLmNsYXNzLCAiTG9hZFVubG9hZEVkZ2VMYWJlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9hZFVubG9hZEVkZ2VMYWJlbF9BY3RpdmF0aW9uVGltZSgpLCB0aGVNb2RlbFBhY2thZ2UuZ2V0U1RFTVRpbWUoKSwgbnVsbCwgImFjdGl2YXRpb25UaW1lIiwgbnVsbCwgMCwgMSwgTG9hZFVubG9hZEVkZ2VMYWJlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9hZFVubG9hZEVkZ2VMYWJlbF9EZWFjdGl2YXRpb25UaW1lKCksIHRoZU1vZGVsUGFja2FnZS5nZXRTVEVNVGltZSgpLCBudWxsLCAiZGVhY3RpdmF0aW9uVGltZSIsIG51bGwsIDAsIDEsIExvYWRVbmxvYWRFZGdlTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldExvYWRVbmxvYWRFZGdlTGFiZWxfQWN0aXZhdGVkUmF0ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiYWN0aXZhdGVkUmF0ZSIsIG51bGwsIDAsIDEsIExvYWRVbmxvYWRFZGdlTGFiZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhwYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbUVDbGFzcywgUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0uY2xhc3MsICJQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1fUGFja2V0VHJhbnNwb3J0TGFiZWwoKSwgdGhpcy5nZXRQYWNrZXRUcmFuc3BvcnRMYWJlbCgpLCBudWxsLCAicGFja2V0VHJhbnNwb3J0TGFiZWwiLCBudWxsLCAwLCAxLCBQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1fTG9hZGluZ0VkZ2VzKCksIHRoaXMuZ2V0TG9hZFVubG9hZEVkZ2UoKSwgbnVsbCwgImxvYWRpbmdFZGdlcyIsIG51bGwsIDAsIC0xLCBQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1fVW5sb2FkaW5nRWRnZXMoKSwgdGhpcy5nZXRMb2FkVW5sb2FkRWRnZSgpLCBudWxsLCAidW5sb2FkaW5nRWRnZXMiLCBudWxsLCAwLCAtMSwgUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhwYWNrZXRUcmFuc3BvcnRMYWJlbEVDbGFzcywgUGFja2V0VHJhbnNwb3J0TGFiZWwuY2xhc3MsICJQYWNrZXRUcmFuc3BvcnRMYWJlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKHBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbUVDbGFzcywgUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtLmNsYXNzLCAiUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRQaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW1fSW5UcmFuc3BvcnRFZGdlcygpLCB0aGlzLmdldFBpcGVUcmFuc3BvcnRFZGdlKCksIG51bGwsICJpblRyYW5zcG9ydEVkZ2VzIiwgbnVsbCwgMCwgLTEsIFBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtX091dFRyYW5zcG9ydEVkZ2VzKCksIHRoaXMuZ2V0UGlwZVRyYW5zcG9ydEVkZ2UoKSwgbnVsbCwgIm91dFRyYW5zcG9ydEVkZ2VzIiwgbnVsbCwgMCwgLTEsIFBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtX01heENhcGFjaXR5KCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJtYXhDYXBhY2l0eSIsIG51bGwsIDAsIDEsIFBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHRyYW5zcG9ydFN5c3RlbUVDbGFzcywgVHJhbnNwb3J0U3lzdGVtLmNsYXNzLCAiVHJhbnNwb3J0U3lzdGVtIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyhwYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlRUNsYXNzLCBQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlLmNsYXNzLCAiUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZV9DYXBhY2l0eSgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiY2FwYWNpdHkiLCBudWxsLCAwLCAxLCBQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MocGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3JFQ2xhc3MsIFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9yLmNsYXNzLCAiUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyhwaXBlVHJhbnNwb3J0RWRnZUVDbGFzcywgUGlwZVRyYW5zcG9ydEVkZ2UuY2xhc3MsICJQaXBlVHJhbnNwb3J0RWRnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKHBpcGVUcmFuc3BvcnRFZGdlTGFiZWxFQ2xhc3MsIFBpcGVUcmFuc3BvcnRFZGdlTGFiZWwuY2xhc3MsICJQaXBlVHJhbnNwb3J0RWRnZUxhYmVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MocGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlRUNsYXNzLCBQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUuY2xhc3MsICJQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZV9NYXhGbG93KCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJtYXhGbG93IiwgbnVsbCwgMCwgMSwgUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWVfVGltZVBlcmlvZCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUxvbmcoKSwgInRpbWVQZXJpb2QiLCBudWxsLCAwLCAxLCBQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJLy8gQ3JlYXRlIHJlc291cmNlCisJCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCX0KKworfSAvL1RyYW5zcG9ydFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvaW1wbC9UcmFuc3BvcnRTeXN0ZW1JbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvaW1wbC9UcmFuc3BvcnRTeXN0ZW1JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5Mzc0MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC9pbXBsL1RyYW5zcG9ydFN5c3RlbUltcGwuamF2YQpAQCAtMCwwICsxLDcxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LmltcGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguaW1wbC5Ob2RlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5UcmFuc3BvcnRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlRyYW5zcG9ydFN5c3RlbTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN5c3RlbTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zcG9ydFN5c3RlbUltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIFRyYW5zcG9ydFN5c3RlbSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBUcmFuc3BvcnRTeXN0ZW1JbXBsKCkgeworCQlzdXBlcigpOwkJCQkKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFRyYW5zcG9ydFBhY2thZ2UuTGl0ZXJhbHMuVFJBTlNQT1JUX1NZU1RFTTsKKwl9CisJCisJLyoqCisJICogTWFrZSBzdXJlIHRoYXQgdGhpcyB0cmFuc3BvcnQgc3lzdGVtIGlzIHNhbmUoKS4gVGhhdCBpcyB0aGF0IGl0IGhhcyBhbGwgb2YgdGhlIHByb3BlcnRpZXMgdGhhdAorCSAqIGEgdHJhbnNwb3J0IHN5c3RlbSBtdXN0IGhhdmUuLi5uYW1lbHkgc29tZSBwb3B1bGF0aW9uIGxhYmVsLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNhbmUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5zYW5lKCk7CisJCQorLy8JCS8vIEEgVHJhbnNwb3J0YXRpb24gU3lzdGVtIHNob3VsZCBoYXZlIGEgcG9wdWxhdGlvbiBsYWJlbAorCQkvLyBOb3QgY2xlYXIgdGhhdCB0aGlzIGlzIHRydWUKKy8vCQlyZXRWYWx1ZSA9IGZhbHNlOworLy8JCWZvciAoTm9kZUxhYmVsIGw6dGhpcy5nZXRMYWJlbHMoKSkgeworLy8JCQkvLyBGb3VuZCBhIHBvcHVsYXRpb24gbGFiZWw/CisvLwkJCWlmIChsIGluc3RhbmNlb2YgUG9wdWxhdGlvbkxhYmVsKSB7CisvLwkJCQkvLyBZZXMKKy8vCQkJCXJldFZhbHVlID0gdHJ1ZTsKKy8vCQkJCWJyZWFrOworLy8JCQl9IC8vIGlmIFBvcHVsYXRpb25MYWJlbAorLy8JCX0KKy8vCQlhc3NlcnQgcmV0VmFsdWU7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHNhbmUKKworfSAvL1RyYW5zcG9ydFN5c3RlbUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC91dGlsL1RyYW5zcG9ydEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvdXRpbC9UcmFuc3BvcnRBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NDQyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvdXRpbC9UcmFuc3BvcnRBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNjE1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LnV0aWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5FZGdlRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2VMYWJlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuUG9wdWxhdGlvbkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuKjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlRyYW5zcG9ydFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRyYW5zcG9ydEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc3BvcnRQYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVHJhbnNwb3J0QWRhcHRlckZhY3RvcnkoKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gVHJhbnNwb3J0UGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgeworCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBUaGUgc3dpdGNoIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyYW5zcG9ydFN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9CisJCW5ldyBUcmFuc3BvcnRTd2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VMb2FkVW5sb2FkRWRnZShMb2FkVW5sb2FkRWRnZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTG9hZFVubG9hZEVkZ2VBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VMb2FkVW5sb2FkRWRnZUxhYmVsKExvYWRVbmxvYWRFZGdlTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUxvYWRVbmxvYWRFZGdlTGFiZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbShQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1BZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQYWNrZXRUcmFuc3BvcnRMYWJlbChQYWNrZXRUcmFuc3BvcnRMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUGFja2V0VHJhbnNwb3J0TGFiZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW0oUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVQaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW1BZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUcmFuc3BvcnRTeXN0ZW0oVHJhbnNwb3J0U3lzdGVtIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVUcmFuc3BvcnRTeXN0ZW1BZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlKFBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvcihQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3JBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQaXBlVHJhbnNwb3J0RWRnZShQaXBlVHJhbnNwb3J0RWRnZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUGlwZVRyYW5zcG9ydEVkZ2VBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQaXBlVHJhbnNwb3J0RWRnZUxhYmVsKFBpcGVUcmFuc3BvcnRFZGdlTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVBpcGVUcmFuc3BvcnRFZGdlTGFiZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUoUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyA8VD4gQWRhcHRlciBjYXNlQ29tcGFyYWJsZShDb21wYXJhYmxlPFQ+IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDb21wYXJhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTW9kaWZpYWJsZShNb2RpZmlhYmxlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVNb2RpZmlhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRWRnZShFZGdlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFZGdlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUG9wdWxhdGlvbkVkZ2UoUG9wdWxhdGlvbkVkZ2Ugb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVBvcHVsYXRpb25FZGdlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTWlncmF0aW9uRWRnZShNaWdyYXRpb25FZGdlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVNaWdyYXRpb25FZGdlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTGFiZWwoTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRWRnZUxhYmVsKEVkZ2VMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRWRnZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTWlncmF0aW9uRWRnZUxhYmVsKE1pZ3JhdGlvbkVkZ2VMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTWlncmF0aW9uRWRnZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRHluYW1pY0xhYmVsKER5bmFtaWNMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRHluYW1pY0xhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTm9kZShOb2RlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVOb2RlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTm9kZUxhYmVsKE5vZGVMYWJlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTm9kZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU2FuaXR5Q2hlY2tlcihTYW5pdHlDaGVja2VyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTYW5pdHlDaGVja2VyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTGFiZWxWYWx1ZShMYWJlbFZhbHVlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVMYWJlbFZhbHVlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGVjb3JhdG9yKERlY29yYXRvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGVjb3JhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRWRnZURlY29yYXRvcihFZGdlRGVjb3JhdG9yIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFZGdlRGVjb3JhdG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworCQkJfQorCQl9OworCisJLyoqCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LkxvYWRVbmxvYWRFZGdlIDxlbT5Mb2FkIFVubG9hZCBFZGdlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LkxvYWRVbmxvYWRFZGdlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvYWRVbmxvYWRFZGdlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5Mb2FkVW5sb2FkRWRnZUxhYmVsIDxlbT5Mb2FkIFVubG9hZCBFZGdlIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LkxvYWRVbmxvYWRFZGdlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9hZFVubG9hZEVkZ2VMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0gPGVtPlBhY2tldCBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRUcmFuc3BvcnRMYWJlbCA8ZW0+UGFja2V0IFRyYW5zcG9ydCBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRUcmFuc3BvcnRMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYWNrZXRUcmFuc3BvcnRMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtIDxlbT5QaXBlIFN0eWxlIFRyYW5zcG9ydCBTeXN0ZW08L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuVHJhbnNwb3J0U3lzdGVtIDxlbT5TeXN0ZW08L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuVHJhbnNwb3J0U3lzdGVtCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRyYW5zcG9ydFN5c3RlbUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZSA8ZW0+UGFja2V0IFRyYW5zcG9ydCBMYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9yIDxlbT5QYWNrZXQgU3R5bGUgVHJhbnNwb3J0IFN5c3RlbSBEZWNvcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3JBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVUcmFuc3BvcnRFZGdlIDxlbT5QaXBlIFRyYW5zcG9ydCBFZGdlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVUcmFuc3BvcnRFZGdlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBpcGVUcmFuc3BvcnRFZGdlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC5QaXBlVHJhbnNwb3J0RWRnZUxhYmVsIDxlbT5QaXBlIFRyYW5zcG9ydCBFZGdlIExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVUcmFuc3BvcnRFZGdlTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy50cmFuc3BvcnQuUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlIDxlbT5QaXBlIFRyYW5zcG9ydCBFZGdlIExhYmVsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmEubGFuZy5Db21wYXJhYmxlIDxlbT5Db21wYXJhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhcmFibGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlIDxlbT5JZGVudGlmaWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpZmlhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZSA8ZW0+TW9kaWZpYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2RpZmlhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZSA8ZW0+RWRnZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFZGdlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLlBvcHVsYXRpb25FZGdlIDxlbT5Qb3B1bGF0aW9uIEVkZ2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5Qb3B1bGF0aW9uRWRnZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3B1bGF0aW9uRWRnZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlIDxlbT5NaWdyYXRpb24gRWRnZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2UKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlncmF0aW9uRWRnZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsIDxlbT5MYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlTGFiZWwgPGVtPkVkZ2UgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFZGdlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZUxhYmVsIDxlbT5NaWdyYXRpb24gRWRnZSBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLk1pZ3JhdGlvbkVkZ2VMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaWdyYXRpb25FZGdlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWwgPGVtPkR5bmFtaWMgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEeW5hbWljTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlIDxlbT5Ob2RlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5vZGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWwgPGVtPk5vZGUgTGFiZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVOb2RlTGFiZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU2FuaXR5Q2hlY2tlciA8ZW0+U2FuaXR5IENoZWNrZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNhbml0eUNoZWNrZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbFZhbHVlIDxlbT5MYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWxWYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVMYWJlbFZhbHVlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yIDxlbT5EZWNvcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWNvcmF0b3JBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5FZGdlRGVjb3JhdG9yIDxlbT5FZGdlIERlY29yYXRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRWRnZURlY29yYXRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFZGdlRGVjb3JhdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL1RyYW5zcG9ydEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvdXRpbC9UcmFuc3BvcnRTd2l0Y2guamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udHJhbnNwb3J0L3NyYy9vcmcvZWNsaXBzZS9zdGVtL2RlZmluaXRpb25zL3RyYW5zcG9ydC91dGlsL1RyYW5zcG9ydFN3aXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZjIwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnRyYW5zcG9ydC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kZWZpbml0aW9ucy90cmFuc3BvcnQvdXRpbC9UcmFuc3BvcnRTd2l0Y2guamF2YQpAQCAtMCwwICsxLDY0NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC51dGlsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TYW5pdHlDaGVja2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkVkZ2VMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkVkZ2VEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5NaWdyYXRpb25FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMuTWlncmF0aW9uRWRnZUxhYmVsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5Qb3B1bGF0aW9uRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLnRyYW5zcG9ydC4qOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQorICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAorICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKKyAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKyAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAorICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMudHJhbnNwb3J0LlRyYW5zcG9ydFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRyYW5zcG9ydFN3aXRjaDxUMT4geworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNwb3J0UGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRyYW5zcG9ydFN3aXRjaCgpIHsKKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7CisJCQltb2RlbFBhY2thZ2UgPSBUcmFuc3BvcnRQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVDEgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7CisJCX0KKwkJZWxzZSB7CisJCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKKwkJCXJldHVybgorCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/CisJCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKKwkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQxIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgeworCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLkxPQURfVU5MT0FEX0VER0U6IHsKKwkJCQlMb2FkVW5sb2FkRWRnZSBsb2FkVW5sb2FkRWRnZSA9IChMb2FkVW5sb2FkRWRnZSl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VMb2FkVW5sb2FkRWRnZShsb2FkVW5sb2FkRWRnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWlncmF0aW9uRWRnZShsb2FkVW5sb2FkRWRnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUG9wdWxhdGlvbkVkZ2UobG9hZFVubG9hZEVkZ2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVkZ2UobG9hZFVubG9hZEVkZ2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShsb2FkVW5sb2FkRWRnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kaWZpYWJsZShsb2FkVW5sb2FkRWRnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShsb2FkVW5sb2FkRWRnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLkxPQURfVU5MT0FEX0VER0VfTEFCRUw6IHsKKwkJCQlMb2FkVW5sb2FkRWRnZUxhYmVsIGxvYWRVbmxvYWRFZGdlTGFiZWwgPSAoTG9hZFVubG9hZEVkZ2VMYWJlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VMb2FkVW5sb2FkRWRnZUxhYmVsKGxvYWRVbmxvYWRFZGdlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1pZ3JhdGlvbkVkZ2VMYWJlbChsb2FkVW5sb2FkRWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEeW5hbWljTGFiZWwobG9hZFVubG9hZEVkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWRnZUxhYmVsKGxvYWRVbmxvYWRFZGdlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsKGxvYWRVbmxvYWRFZGdlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShsb2FkVW5sb2FkRWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKGxvYWRVbmxvYWRFZGdlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QQUNLRVRfU1RZTEVfVFJBTlNQT1JUX1NZU1RFTTogeworCQkJCVBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtIHBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtID0gKFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtKHBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VUcmFuc3BvcnRTeXN0ZW0ocGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUocGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW0pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShwYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGFyYWJsZShwYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLlBBQ0tFVF9UUkFOU1BPUlRfTEFCRUw6IHsKKwkJCQlQYWNrZXRUcmFuc3BvcnRMYWJlbCBwYWNrZXRUcmFuc3BvcnRMYWJlbCA9IChQYWNrZXRUcmFuc3BvcnRMYWJlbCl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VQYWNrZXRUcmFuc3BvcnRMYWJlbChwYWNrZXRUcmFuc3BvcnRMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZUxhYmVsKHBhY2tldFRyYW5zcG9ydExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMYWJlbChwYWNrZXRUcmFuc3BvcnRMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHBhY2tldFRyYW5zcG9ydExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHBhY2tldFRyYW5zcG9ydExhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUElQRV9TVFlMRV9UUkFOU1BPUlRfU1lTVEVNOiB7CisJCQkJUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtIHBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbSA9IChQaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW0pdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlUGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtKHBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlVHJhbnNwb3J0U3lzdGVtKHBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZShwaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW0pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShwaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW0pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhcmFibGUocGlwZVN0eWxlVHJhbnNwb3J0U3lzdGVtKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuVFJBTlNQT1JUX1NZU1RFTTogeworCQkJCVRyYW5zcG9ydFN5c3RlbSB0cmFuc3BvcnRTeXN0ZW0gPSAoVHJhbnNwb3J0U3lzdGVtKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVRyYW5zcG9ydFN5c3RlbSh0cmFuc3BvcnRTeXN0ZW0pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUodHJhbnNwb3J0U3lzdGVtKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJZGVudGlmaWFibGUodHJhbnNwb3J0U3lzdGVtKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHRyYW5zcG9ydFN5c3RlbSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBUcmFuc3BvcnRQYWNrYWdlLlBBQ0tFVF9UUkFOU1BPUlRfTEFCRUxfVkFMVUU6IHsKKwkJCQlQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlIHBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWUgPSAoUGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZSl0aGVFT2JqZWN0OworCQkJCVQxIHJlc3VsdCA9IGNhc2VQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlKHBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsVmFsdWUocGFja2V0VHJhbnNwb3J0TGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2FuaXR5Q2hlY2tlcihwYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUEFDS0VUX1NUWUxFX1RSQU5TUE9SVF9TWVNURU1fREVDT1JBVE9SOiB7CisJCQkJUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3IgcGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3IgPSAoUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3IpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlUGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3IocGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVkZ2VEZWNvcmF0b3IocGFja2V0U3R5bGVUcmFuc3BvcnRTeXN0ZW1EZWNvcmF0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlY29yYXRvcihwYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtRGVjb3JhdG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUElQRV9UUkFOU1BPUlRfRURHRTogeworCQkJCVBpcGVUcmFuc3BvcnRFZGdlIHBpcGVUcmFuc3BvcnRFZGdlID0gKFBpcGVUcmFuc3BvcnRFZGdlKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVBpcGVUcmFuc3BvcnRFZGdlKHBpcGVUcmFuc3BvcnRFZGdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQb3B1bGF0aW9uRWRnZShwaXBlVHJhbnNwb3J0RWRnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWRnZShwaXBlVHJhbnNwb3J0RWRnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSWRlbnRpZmlhYmxlKHBpcGVUcmFuc3BvcnRFZGdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2RpZmlhYmxlKHBpcGVUcmFuc3BvcnRFZGdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHBpcGVUcmFuc3BvcnRFZGdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFRyYW5zcG9ydFBhY2thZ2UuUElQRV9UUkFOU1BPUlRfRURHRV9MQUJFTDogeworCQkJCVBpcGVUcmFuc3BvcnRFZGdlTGFiZWwgcGlwZVRyYW5zcG9ydEVkZ2VMYWJlbCA9IChQaXBlVHJhbnNwb3J0RWRnZUxhYmVsKXRoZUVPYmplY3Q7CisJCQkJVDEgcmVzdWx0ID0gY2FzZVBpcGVUcmFuc3BvcnRFZGdlTGFiZWwocGlwZVRyYW5zcG9ydEVkZ2VMYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWRnZUxhYmVsKHBpcGVUcmFuc3BvcnRFZGdlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxhYmVsKHBpcGVUcmFuc3BvcnRFZGdlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlkZW50aWZpYWJsZShwaXBlVHJhbnNwb3J0RWRnZUxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXJhYmxlKHBpcGVUcmFuc3BvcnRFZGdlTGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgVHJhbnNwb3J0UGFja2FnZS5QSVBFX1RSQU5TUE9SVF9FREdFX0xBQkVMX1ZBTFVFOiB7CisJCQkJUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlIHBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSA9IChQaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUpdGhlRU9iamVjdDsKKwkJCQlUMSByZXN1bHQgPSBjYXNlUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlKHBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGFiZWxWYWx1ZShwaXBlVHJhbnNwb3J0RWRnZUxhYmVsVmFsdWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNhbml0eUNoZWNrZXIocGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Mb2FkIFVubG9hZCBFZGdlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9hZCBVbmxvYWQgRWRnZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VMb2FkVW5sb2FkRWRnZShMb2FkVW5sb2FkRWRnZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9hZCBVbmxvYWQgRWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvYWQgVW5sb2FkIEVkZ2UgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTG9hZFVubG9hZEVkZ2VMYWJlbChMb2FkVW5sb2FkRWRnZUxhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWNrZXQgU3R5bGUgVHJhbnNwb3J0IFN5c3RlbTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhY2tldCBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtKFBhY2tldFN0eWxlVHJhbnNwb3J0U3lzdGVtIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWNrZXQgVHJhbnNwb3J0IExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFja2V0IFRyYW5zcG9ydCBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VQYWNrZXRUcmFuc3BvcnRMYWJlbChQYWNrZXRUcmFuc3BvcnRMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGlwZSBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGlwZSBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVBpcGVTdHlsZVRyYW5zcG9ydFN5c3RlbShQaXBlU3R5bGVUcmFuc3BvcnRTeXN0ZW0gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN5c3RlbTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN5c3RlbTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VUcmFuc3BvcnRTeXN0ZW0oVHJhbnNwb3J0U3lzdGVtIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWNrZXQgVHJhbnNwb3J0IExhYmVsIFZhbHVlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFja2V0IFRyYW5zcG9ydCBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VQYWNrZXRUcmFuc3BvcnRMYWJlbFZhbHVlKFBhY2tldFRyYW5zcG9ydExhYmVsVmFsdWUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhY2tldCBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtIERlY29yYXRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhY2tldCBTdHlsZSBUcmFuc3BvcnQgU3lzdGVtIERlY29yYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvcihQYWNrZXRTdHlsZVRyYW5zcG9ydFN5c3RlbURlY29yYXRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGlwZSBUcmFuc3BvcnQgRWRnZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBpcGUgVHJhbnNwb3J0IEVkZ2U8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlUGlwZVRyYW5zcG9ydEVkZ2UoUGlwZVRyYW5zcG9ydEVkZ2Ugb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBpcGUgVHJhbnNwb3J0IEVkZ2UgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QaXBlIFRyYW5zcG9ydCBFZGdlIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZVBpcGVUcmFuc3BvcnRFZGdlTGFiZWwoUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGlwZSBUcmFuc3BvcnQgRWRnZSBMYWJlbCBWYWx1ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBpcGUgVHJhbnNwb3J0IEVkZ2UgTGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlUGlwZVRyYW5zcG9ydEVkZ2VMYWJlbFZhbHVlKFBpcGVUcmFuc3BvcnRFZGdlTGFiZWxWYWx1ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGFyYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhcmFibGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyA8VD4gVDEgY2FzZUNvbXBhcmFibGUoQ29tcGFyYWJsZTxUPiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SWRlbnRpZmlhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUlkZW50aWZpYWJsZShJZGVudGlmaWFibGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZGlmaWFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2RpZmlhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZU1vZGlmaWFibGUoTW9kaWZpYWJsZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWRnZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVkZ2U8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRWRnZShFZGdlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3B1bGF0aW9uIEVkZ2U8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3B1bGF0aW9uIEVkZ2U8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlUG9wdWxhdGlvbkVkZ2UoUG9wdWxhdGlvbkVkZ2Ugb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pZ3JhdGlvbiBFZGdlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWlncmF0aW9uIEVkZ2U8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTWlncmF0aW9uRWRnZShNaWdyYXRpb25FZGdlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUxhYmVsKExhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FZGdlIExhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VFZGdlTGFiZWwoRWRnZUxhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NaWdyYXRpb24gRWRnZSBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pZ3JhdGlvbiBFZGdlIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZU1pZ3JhdGlvbkVkZ2VMYWJlbChNaWdyYXRpb25FZGdlTGFiZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkR5bmFtaWMgTGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EeW5hbWljIExhYmVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZUR5bmFtaWNMYWJlbChEeW5hbWljTGFiZWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVDEgY2FzZU5vZGUoTm9kZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZSBMYWJlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgTGFiZWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTm9kZUxhYmVsKE5vZGVMYWJlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2FuaXR5IENoZWNrZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TYW5pdHkgQ2hlY2tlcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VTYW5pdHlDaGVja2VyKFNhbml0eUNoZWNrZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxhYmVsIFZhbHVlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGFiZWwgVmFsdWU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlTGFiZWxWYWx1ZShMYWJlbFZhbHVlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWNvcmF0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWNvcmF0b3I8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUMSBjYXNlRGVjb3JhdG9yKERlY29yYXRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWRnZSBEZWNvcmF0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FZGdlIERlY29yYXRvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGNhc2VFZGdlRGVjb3JhdG9yKEVkZ2VEZWNvcmF0b3Igb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQxIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL1RyYW5zcG9ydFN3aXRjaApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZTg2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExMDNiMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmZjU3OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMTYgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZTtzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlLnByZXNlbnRhdGlvbi5FeGFtcGxlRWRpdG9yUGx1Z2luJEltcGxlbWVudGF0aW9uCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlLnByZXNlbnRhdGlvbgorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0udWksCisgb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0MWFiNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNCBAQAorCisjIDxjb3B5cmlnaHQ+CisjIDwvY29weXJpZ2h0PgorIworIyAkSWQ6IGJ1aWxkLnByb3BlcnRpZXMsdiAxLjEgMjAwOC8xMi8xNSAyMTo0OTo1NiBqa2F1Zm1hbiBFeHAgJAorCitiaW4uaW5jbHVkZXMgPSAuLFwKKyAgICAgICAgICAgICAgIGljb25zLyxcCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcworamFycy5jb21waWxlLm9yZGVyID0gLgorc291cmNlLi4gPSBzcmMvCitvdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlL2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZU1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9pY29ucy9mdWxsL29iajE2L0V4YW1wbGVNb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMDRkYWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9pY29ucy9mdWxsL29iajE2L0V4YW1wbGVNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNjYTFjYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDcgQEAKKworIyA8Y29weXJpZ2h0PgorIyA8L2NvcHlyaWdodD4KKyMKKyMgJElkOiBwbHVnaW4ucHJvcGVydGllcyx2IDEuMyAyMDA5LzAzLzExIDAzOjQ1OjI2IHNlZGx1bmQgRXhwICQKKworcGx1Z2luTmFtZSA9IFNURU0gRXhhbXBsZSBEaXNlYXNlIE1vZGVsIFVJCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZworCitfVUlfRXhhbXBsZUVkaXRvcl9tZW51ID0gJkV4YW1wbGUgRWRpdG9yCisKK19VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0gPSAmTmV3IENoaWxkCitfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0gPSBOJmV3IFNpYmxpbmcKKworX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW0gPSBTaG93ICZQcm9wZXJ0aWVzIFZpZXcKK19VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbSA9ICZSZWZyZXNoCisKK19VSV9TZWxlY3Rpb25QYWdlX2xhYmVsID0gU2VsZWN0aW9uCisKK19VSV9Ob09iamVjdFNlbGVjdGVkID0gU2VsZWN0ZWQgTm90aGluZworX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkID0gU2VsZWN0ZWQgT2JqZWN0OiB7MH0KK19VSV9NdWx0aU9iamVjdFNlbGVjdGVkID0gU2VsZWN0ZWQgezB9IE9iamVjdHMKKworX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbCA9IE9wZW4gRWRpdG9yCisKK19VSV9XaXphcmRfY2F0ZWdvcnkgPSBFeGFtcGxlIEVNRiBNb2RlbCBDcmVhdGlvbiBXaXphcmRzCisKK19VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UgPSBQcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiBmaWxlICJ7MH0iCisKK19VSV9FeGFtcGxlRWRpdG9yX2xhYmVsID0gRXhhbXBsZSBNb2RlbCBFZGl0b3IKKworX1VJX0V4YW1wbGVFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlID0gTXkKK19VSV9FeGFtcGxlRWRpdG9yRmlsZW5hbWVFeHRlbnNpb25zID0gZXhhbXBsZQorCitfVUlfV2l6YXJkX2xhYmVsID0gTmV3CisKK19XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uID0gVGhlIGZpbGUgbmFtZSBtdXN0IGVuZCBpbiAnJy57MH0nJworX1dBUk5fRmlsZW5hbWVFeHRlbnNpb25zID0gVGhlIGZpbGUgbmFtZSBtdXN0IGhhdmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uczogezB9CisKK19VSV9Nb2RlbE9iamVjdCA9ICZNb2RlbCBPYmplY3QKK19VSV9YTUxFbmNvZGluZyA9ICZYTUwgRW5jb2RpbmcKK19VSV9YTUxFbmNvZGluZ0Nob2ljZXMgPSBVVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQorX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbiA9IFNlbGVjdCBhIG1vZGVsIG9iamVjdCB0byBjcmVhdGUKKworX1VJX0ZpbGVDb25mbGljdF9sYWJlbCA9IEZpbGUgQ29uZmxpY3QKK19XQVJOX0ZpbGVDb25mbGljdCA9IFRoZXJlIGFyZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCBjb25mbGljdCB3aXRoIGNoYW5nZXMgbWFkZSBvdXRzaWRlIHRoZSBlZGl0b3IuICBEbyB5b3Ugd2lzaCB0byBkaXNjYXJkIHRoaXMgZWRpdG9yJ3MgY2hhbmdlcz8KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJiMGIzMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlL3BsdWdpbi54bWwKQEAgLTAsMCArMSw0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPCEtLQorIDxjb3B5cmlnaHQ+CisgPC9jb3B5cmlnaHQ+CisKKyAkSWQ6IHBsdWdpbi54bWwsdiAxLjQgMjAwOS8wMy8xMSAwMzo0NToyNiBzZWRsdW5kIEV4cCAkCistLT4KKworPHBsdWdpbj4KKworCisgIDxleHRlbnNpb24KKyAgICBwb2ludCA9ICJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KKyAgICA8Y2F0ZWdvcnkKKyAgICAgIGlkID0gIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5XaXphcmQuY2F0ZWdvcnkuSUQiCisgICAgICBuYW1lPSIlX1VJX1dpemFyZF9jYXRlZ29yeSI+CisgICAgPC9jYXRlZ29yeT4KKyAgICA8d2l6YXJkCisgICAgICBpZCA9ICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5wcmVzZW50YXRpb24uRXhhbXBsZU1vZGVsV2l6YXJkSUQiCisgICAgICBuYW1lID0gIiVfVUlfRXhhbXBsZU1vZGVsV2l6YXJkX2xhYmVsIgorICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUucHJlc2VudGF0aW9uLkV4YW1wbGVNb2RlbFdpemFyZCIKKyAgICAgIGNhdGVnb3J5ID0gIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5XaXphcmQuY2F0ZWdvcnkuSUQiCisgICAgICBpY29uID0gImljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZU1vZGVsRmlsZS5naWYiPgorICAgICAgPGRlc2NyaXB0aW9uPiVfVUlfRXhhbXBsZU1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxzZWxlY3Rpb24gY2xhc3MgPSAib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPgorICAgIDwvd2l6YXJkPgorICA8L2V4dGVuc2lvbj4KKworICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgorICAgIDxlZGl0b3IKKyAgICAgICAgaWQgPSAib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUucHJlc2VudGF0aW9uLkV4YW1wbGVFZGl0b3JJRCIKKyAgICAgICAgbmFtZSA9ICIlX1VJX0V4YW1wbGVFZGl0b3JfbGFiZWwiCisgICAgICAgIGljb24gPSAiaWNvbnMvZnVsbC9vYmoxNi9FeGFtcGxlTW9kZWxGaWxlLmdpZiIKKyAgICAgICAgZXh0ZW5zaW9ucyA9ICJleGFtcGxlIgorICAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5wcmVzZW50YXRpb24uRXhhbXBsZUVkaXRvciIgCisgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLnByZXNlbnRhdGlvbi5FeGFtcGxlQWN0aW9uQmFyQ29udHJpYnV0b3IiID4KKyAgICA8L2VkaXRvcj4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnN0YXJ0dXAiPgorICAgICA8c3RhcnR1cAorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUucHJlc2VudGF0aW9uLkV4YW1wbGVQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkiPgorICAgICA8L3N0YXJ0dXA+CisgIDwvZXh0ZW5zaW9uPgorPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvcHJlc2VudGF0aW9uL0V4YW1wbGVBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL3ByZXNlbnRhdGlvbi9FeGFtcGxlQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWY5NDE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL3ByZXNlbnRhdGlvbi9FeGFtcGxlQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpAQCAtMCwwICsxLDQzNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbnRyb2xBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkxvYWRSZXNvdXJjZUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJDb250cmlidXRpb25JdGVtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUucHJlc2VudGF0aW9uLkV4YW1wbGVFZGl0b3JQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZvciB0aGUgRXhhbXBsZSBtb2RlbCBlZGl0b3IuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFeGFtcGxlQWN0aW9uQmFyQ29udHJpYnV0b3IKKwlleHRlbmRzIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcgorCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yUGFydDsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGFjdGlvbiBvcGVucyB0aGUgUHJvcGVydGllcyB2aWV3LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQWN0aW9uIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbiA9CisJCW5ldyBBY3Rpb24oRXhhbXBsZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtIikpIC8vJE5PTi1OTFMtMSQKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJdHJ5IHsKKwkJCQkJZ2V0UGFnZSgpLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlFeGFtcGxlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgYWN0aW9uIHJlZnJlc2hlcyB0aGUgdmlld2VyIG9mIHRoZSBjdXJyZW50IGVkaXRvciBpZiB0aGUgZWRpdG9yCisJICogaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUFjdGlvbiByZWZyZXNoVmlld2VyQWN0aW9uID0KKwkJbmV3IEFjdGlvbihFeGFtcGxlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtIikpIC8vJE5PTi1OTFMtMSQKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisJCQkJcmV0dXJuIGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWlmIChhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7CisJCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRWaWV3ZXIoKTsKKwkJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7CisJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyB3aWxsIGNvbnRhaW4gb25lIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlQ2hpbGRBY3Rpb25zOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVDaGlsZCBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlU2libGluZ0FjdGlvbnM7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZVNpYmxpbmcgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgY29udHJpYnV0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4YW1wbGVBY3Rpb25CYXJDb250cmlidXRvcigpIHsKKwkJc3VwZXIoQURESVRJT05TX0xBU1RfU1RZTEUpOworCQlsb2FkUmVzb3VyY2VBY3Rpb24gPSBuZXcgTG9hZFJlc291cmNlQWN0aW9uKCk7CisJCXZhbGlkYXRlQWN0aW9uID0gbmV3IFZhbGlkYXRlQWN0aW9uKCk7CisJCWNvbnRyb2xBY3Rpb24gPSBuZXcgQ29udHJvbEFjdGlvbigpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBTZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zIHRvIHRoZSB0b29sIGJhci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgeworCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiZXhhbXBsZS1zZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAorCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiZXhhbXBsZS1hZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgdG8gdGhlIG1lbnUgYmFyIGEgbWVudSBhbmQgc29tZSBzZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zLAorCSAqIGFzIHdlbGwgYXMgdGhlIHN1Yi1tZW51cyBmb3Igb2JqZWN0IGNyZWF0aW9uIGl0ZW1zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudU1hbmFnZXIpOworCisJCUlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihFeGFtcGxlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0V4YW1wbGVFZGl0b3JfbWVudSIpLCAib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGVNZW51SUQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhY3Rpb25zIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucy1lbmQiKSk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVDaGlsZCBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCisJCS8vCisJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoRXhhbXBsZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIFByZXBhcmUgZm9yIENyZWF0ZVNpYmxpbmcgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgorCQkvLworCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoRXhhbXBsZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBGb3JjZSBhbiB1cGRhdGUgYmVjYXVzZSBFY2xpcHNlIGhpZGVzIGVtcHR5IG1lbnVzIG5vdy4KKwkJLy8KKwkJc3VibWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyCisJCQkobmV3IElNZW51TGlzdGVuZXIoKSB7CisJCQkJIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJCQkJIG1lbnVNYW5hZ2VyLnVwZGF0ZUFsbCh0cnVlKTsKKwkJCQkgfQorCQkJIH0pOworCisJCWFkZEdsb2JhbEFjdGlvbnMoc3VibWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIFdoZW4gdGhlIGFjdGl2ZSBlZGl0b3IgY2hhbmdlcywgdGhpcyByZW1lbWJlcnMgdGhlIGNoYW5nZSBhbmQgcmVnaXN0ZXJzIHdpdGggaXQgYXMgYSBzZWxlY3Rpb24gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHBhcnQpIHsKKwkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOworCQlhY3RpdmVFZGl0b3JQYXJ0ID0gcGFydDsKKworCQkvLyBTd2l0Y2ggdG8gdGhlIG5ldyBzZWxlY3Rpb24gcHJvdmlkZXIuCisJCS8vCisJCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCX0KKwkJaWYgKHBhcnQgPT0gbnVsbCkgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOworCQl9CisJCWVsc2UgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBwYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOworCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCQkvLyBGYWtlIGEgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgdG8gdXBkYXRlIHRoZSBtZW51cy4KKwkJCS8vCisJCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkgeworCQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfSwKKwkgKiBoYW5kbGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnR9cyBieSBxdWVyeWluZyBmb3IgdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncworCSAqIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZWxlY3RlZCBvYmplY3QgYW5kIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBldmVudCAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJLy8gUmVtb3ZlIGFueSBtZW51IGl0ZW1zIGZvciBvbGQgc2VsZWN0aW9uLgorCQkvLworCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMpOworCQl9CisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucyk7CisJCX0KKworCQkvLyBRdWVyeSB0aGUgbmV3IHNlbGVjdGlvbiBmb3IgYXBwcm9wcmlhdGUgbmV3IGNoaWxkL3NpYmxpbmcgZGVzY3JpcHRvcnMKKwkJLy8KKwkJQ29sbGVjdGlvbjw/PiBuZXdDaGlsZERlc2NyaXB0b3JzID0gbnVsbDsKKwkJQ29sbGVjdGlvbjw/PiBuZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBudWxsOworCisJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7CisJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsKKwkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7CisKKwkJCUVkaXRpbmdEb21haW4gZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKKworCQkJbmV3Q2hpbGREZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgbnVsbCk7CisJCQluZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhudWxsLCBvYmplY3QpOworCQl9CisKKwkJLy8gR2VuZXJhdGUgYWN0aW9ucyBmb3Igc2VsZWN0aW9uOyBwb3B1bGF0ZSBhbmQgcmVkcmF3IHRoZSBtZW51cy4KKwkJLy8KKwkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMobmV3Q2hpbGREZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKKwkJY3JlYXRlU2libGluZ0FjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKG5ld1NpYmxpbmdEZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKKworCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKKwkJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOworCQl9CisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOworCQkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwKKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgeworCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVDaGlsZEFjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYWN0aW9uczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwKKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoQ29sbGVjdGlvbjw/PiBkZXNjcmlwdG9ycywgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJQ29sbGVjdGlvbjxJQWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOworCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgeworCQkJZm9yIChPYmplY3QgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7CisJCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCisJLyoqCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiB3aXRoIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbiwKKwkgKiBieSBpbnNlcnRpbmcgdGhlbSBiZWZvcmUgdGhlIHNwZWNpZmllZCBjb250cmlidXRpb24gaXRlbSA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4uCisJICogSWYgPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGV5IGFyZSBzaW1wbHkgYWRkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248PyBleHRlbmRzIElBY3Rpb24+IGFjdGlvbnMsIFN0cmluZyBjb250cmlidXRpb25JRCkgeworCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKElBY3Rpb24gYWN0aW9uIDogYWN0aW9ucykgeworCQkJCWlmIChjb250cmlidXRpb25JRCAhPSBudWxsKSB7CisJCQkJCW1hbmFnZXIuaW5zZXJ0QmVmb3JlKGNvbnRyaWJ1dGlvbklELCBhY3Rpb24pOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJbWFuYWdlci5hZGQoYWN0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCQorCS8qKgorCSAqIFRoaXMgcmVtb3ZlcyBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gYWxsIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkZXBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zKSB7CisJCWlmIChhY3Rpb25zICE9IG51bGwpIHsKKwkJCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtYW5hZ2VyLmdldEl0ZW1zKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CisJCQkJLy8gTG9vayBpbnRvIFN1YkNvbnRyaWJ1dGlvbkl0ZW1zCisJCQkJLy8KKwkJCQlJQ29udHJpYnV0aW9uSXRlbSBjb250cmlidXRpb25JdGVtID0gaXRlbXNbaV07CisJCQkJd2hpbGUgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBTdWJDb250cmlidXRpb25JdGVtKSB7CisJCQkJCWNvbnRyaWJ1dGlvbkl0ZW0gPSAoKFN1YkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0SW5uZXJJdGVtKCk7CisJCQkJfQorCisJCQkJLy8gRGVsZXRlIHRoZSBBY3Rpb25Db250cmlidXRpb25JdGVtcyB3aXRoIG1hdGNoaW5nIGFjdGlvbi4KKwkJCQkvLworCQkJCWlmIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCQlJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSljb250cmlidXRpb25JdGVtKS5nZXRBY3Rpb24oKTsKKwkJCQkJaWYgKGFjdGlvbnMuY29udGFpbnMoYWN0aW9uKSkgeworCQkJCQkJbWFuYWdlci5yZW1vdmUoY29udHJpYnV0aW9uSXRlbSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgcG9wLXVwIG1lbnUgYmVmb3JlIGl0IGFwcGVhcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQlzdXBlci5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOworCQlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG51bGw7CisKKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoRXhhbXBsZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOworCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihFeGFtcGxlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOworCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGluc2VydHMgZ2xvYmFsIGFjdGlvbnMgYmVmb3JlIHRoZSAiYWRkaXRpb25zLWVuZCIgc2VwYXJhdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMtZW5kIiwgbmV3IFNlcGFyYXRvcigidWktYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uKTsgLy8kTk9OLU5MUy0xJAorCisJCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsJCQorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHJlZnJlc2hWaWV3ZXJBY3Rpb24pOyAvLyROT04tTkxTLTEkCisKKwkJc3VwZXIuYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogVGhpcyBlbnN1cmVzIHRoYXQgYSBkZWxldGUgYWN0aW9uIHdpbGwgY2xlYW4gdXAgYWxsIHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBvYmplY3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUFsbFJlZmVyZW5jZXNPbkRlbGV0ZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL3ByZXNlbnRhdGlvbi9FeGFtcGxlRWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvcHJlc2VudGF0aW9uL0V4YW1wbGVFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjkwN2MzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leGFtcGxlL3ByZXNlbnRhdGlvbi9FeGFtcGxlRWRpdG9yLmphdmEKQEAgLTAsMCArMSwxNjAyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuTWFya2VySGVscGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5lZGl0b3IuUHJvYmxlbUVkaXRvclBhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuY2VsbGVkaXRvci5BZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5Mb2NhbFRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5VbndyYXBwaW5nU2VsZWN0aW9uUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSU1hcmtlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSVV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS52aWV3LkV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5wcm92aWRlci5FeGFtcGxlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcm92aWRlci5Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByb3ZpZGVyLk1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJvdmlkZXIuU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIucHJvdmlkZXIuU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLnByb3ZpZGVyLlNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnByb3ZpZGVyLkxhYmVsc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5wcmVzZW50YXRpb24uRXhhbXBsZUVkaXRvclBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOworCisKKy8qKgorICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgRXhhbXBsZSBtb2RlbCBlZGl0b3IuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFeGFtcGxlRWRpdG9yCisJZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0CisJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpblByb3ZpZGVyLCBJU2VsZWN0aW9uUHJvdmlkZXIsIElNZW51TGlzdGVuZXIsIElWaWV3ZXJQcm92aWRlciwgSUdvdG9NYXJrZXIgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGVkaXRpbmcgZG9tYWluIHRoYXQgaXMgdXNlZCB0byB0cmFjayBhbGwgY2hhbmdlcyB0byB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgb25lIGFkYXB0ZXIgZmFjdG9yeSB1c2VkIGZvciBwcm92aWRpbmcgdmlld3Mgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElDb250ZW50T3V0bGluZVBhZ2UgY29udGVudE91dGxpbmVQYWdlOworCisJLyoqCisJICogVGhpcyBpcyBhIGtsdWRnZS4uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlJ3Mgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmVlVmlld2VyIGNvbnRlbnRPdXRsaW5lVmlld2VyOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgcHJvcGVydHkgc2hlZXQgcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB2aWV3ZXIgdGhhdCBzaGFkb3dzIHRoZSBzZWxlY3Rpb24gaW4gdGhlIGNvbnRlbnQgb3V0bGluZS4KKwkgKiBUaGUgcGFyZW50IHJlbGF0aW9uIG11c3QgYmUgY29ycmVjdGx5IGRlZmluZWQgZm9yIHRoaXMgdG8gd29yay4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBzZWxlY3Rpb25WaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgY29udGVudCB2aWV3ZXIsIHdoaWNoIG1heSBiZSBlaXRoZXIgb25lIG9mIHRoZSB2aWV3ZXJzIGluIHRoZSBwYWdlcyBvciB0aGUgY29udGVudCBvdXRsaW5lIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVmlld2VyIGN1cnJlbnRWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgdG8gd2hpY2ggZXZlciB2aWV3ZXIgaXMgYWN0aXZlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfXMgdGhhdCBhcmUgbGlzdGVuaW5nIHRvIHRoaXMgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+KCk7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGVkaXRvciBhcyBhIHdob2xlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uIGVkaXRvclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7CisKKwkvKioKKwkgKiBUaGUgTWFya2VySGVscGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB3b3Jrc3BhY2UgcmVzb3VyY2UgbWFya2VycyBwcmVzZW50ZWQKKwkgKiBpbiBFY2xpcHNlJ3MgUHJvYmxlbXMgVmlldy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFya2VySGVscGVyIG1hcmtlckhlbHBlciA9IG5ldyBFZGl0VUlNYXJrZXJIZWxwZXIoKTsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyBmb3Igd2hlbiB0aGUgb3V0bGluZSBiZWNvbWVzIGFjdGl2ZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9CisJCW5ldyBJUGFydExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJaWYgKHAgaW5zdGFuY2VvZiBDb250ZW50T3V0bGluZSkgeworCQkJCQlpZiAoKChDb250ZW50T3V0bGluZSlwKS5nZXRDdXJyZW50UGFnZSgpID09IGNvbnRlbnRPdXRsaW5lUGFnZSkgeworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoRXhhbXBsZUVkaXRvci50aGlzKTsKKworCQkJCQkJc2V0Q3VycmVudFZpZXdlcihjb250ZW50T3V0bGluZVZpZXdlcik7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAocCBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpIHsKKwkJCQkJaWYgKCgoUHJvcGVydHlTaGVldClwKS5nZXRDdXJyZW50UGFnZSgpID09IHByb3BlcnR5U2hlZXRQYWdlKSB7CisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihFeGFtcGxlRWRpdG9yLnRoaXMpOworCQkJCQkJaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChwID09IEV4YW1wbGVFZGl0b3IudGhpcykgeworCQkJCQloYW5kbGVBY3RpdmF0ZSgpOworCQkJCX0KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQl9OworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkIHNpbmNlIGxhc3QgYWN0aXZhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gc2F2ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHNhdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIE1hcCB0byBzdG9yZSB0aGUgZGlhZ25vc3RpYyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwPFJlc291cmNlLCBEaWFnbm9zdGljPiByZXNvdXJjZVRvRGlhZ25vc3RpY01hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFJlc291cmNlLCBEaWFnbm9zdGljPigpOworCisJLyoqCisJICogQ29udHJvbHMgd2hldGhlciB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHNob3VsZCBiZSB1cGRhdGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKworCS8qKgorCSAqIEFkYXB0ZXIgdXNlZCB0byB1cGRhdGUgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiB3aGVuIHJlc291cmNlcyBhcmUgZGVtYW5kZWQgbG9hZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBFQ29udGVudEFkYXB0ZXIgcHJvYmxlbUluZGljYXRpb25BZGFwdGVyID0gCisJCW5ldyBFQ29udGVudEFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisJCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZXNvdXJjZS5jbGFzcykpIHsKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRDoKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0VSUk9SUzoKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX1dBUk5JTkdTOiB7CisJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2Upbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7CisJCQkJCQkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIG51bGwpOworCQkJCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGRpYWdub3N0aWMpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucmVtb3ZlKHJlc291cmNlKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAodXBkYXRlUHJvYmxlbUluZGljYXRpb24pIHsKKwkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkJCQkJCQkgfQorCQkJCQkJCQkJIH0pOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCQkJCX0KKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7CisJCQkJYmFzaWNTZXRUYXJnZXQodGFyZ2V0KTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCB1bnNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsKKwkJCQliYXNpY1Vuc2V0VGFyZ2V0KHRhcmdldCk7CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdvcmtzcGFjZSBjaGFuZ2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0KKwkJbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOworCQkJCXRyeSB7CisJCQkJCWNsYXNzIFJlc291cmNlRGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKKwkJCQkJCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKwkJCQkJCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKKwkJCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIHx8CisJCQkJCQkJCSAgICBkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiBkZWx0YS5nZXRGbGFncygpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMpIHsKKwkJCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSShkZWx0YS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLCBmYWxzZSk7CisJCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworCQkJCQkJCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgeworCQkJCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWVsc2UgaWYgKCFzYXZlZFJlc291cmNlcy5yZW1vdmUocmVzb3VyY2UpKSB7CisJCQkJCQkJCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCX0KKworCQkJCQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldENoYW5nZWRSZXNvdXJjZXMoKSB7CisJCQkJCQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7CisJCQkJCQl9CisKKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRSZW1vdmVkUmVzb3VyY2VzKCkgeworCQkJCQkJCXJldHVybiByZW1vdmVkUmVzb3VyY2VzOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOworCQkJCQlkZWx0YS5hY2NlcHQodmlzaXRvcik7CisKKwkJCQkJaWYgKCF2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsKKwkJCQkJCWlmICghaXNEaXJ0eSgpKSB7CisJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCQkgZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihFeGFtcGxlRWRpdG9yLnRoaXMsIGZhbHNlKTsKKwkJCQkJCQkJCSB9CisJCQkJCQkJCSB9KTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmICghdmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7CisJCQkJCQlpZiAoZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSBFeGFtcGxlRWRpdG9yLnRoaXMpIHsKKwkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJCSBoYW5kbGVBY3RpdmF0ZSgpOworCQkJCQkJCQkJIH0KKwkJCQkJCQkJIH0pOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlFeGFtcGxlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIEhhbmRsZXMgYWN0aXZhdGlvbiBvZiB0aGUgZWRpdG9yIG9yIGl0J3MgYXNzb2NpYXRlZCB2aWV3cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0ZSgpIHsKKwkJLy8gUmVjb21wdXRlIHRoZSByZWFkIG9ubHkgc3RhdGUuCisJCS8vCisJCWlmIChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpICE9IG51bGwpIHsKKwkJICBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpLmNsZWFyKCk7CisKKwkJICAvLyBSZWZyZXNoIGFueSBhY3Rpb25zIHRoYXQgbWF5IGJlY29tZSBlbmFibGVkIG9yIGRpc2FibGVkLgorCQkgIC8vCisJCSAgc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKKwkJfQorCisJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCWlmIChoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpIHsKKwkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKEV4YW1wbGVFZGl0b3IudGhpcywgZmFsc2UpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVtb3ZlZFJlc291cmNlcy5jbGVhcigpOworCQkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgeworCQkJY2hhbmdlZFJlc291cmNlcy5yZW1vdmVBbGwoc2F2ZWRSZXNvdXJjZXMpOworCQkJaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpOworCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOworCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEhhbmRsZXMgd2hhdCB0byBkbyB3aXRoIGNoYW5nZWQgcmVzb3VyY2VzIG9uIGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpIHsKKwkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSAmJiAoIWlzRGlydHkoKSB8fCBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpKSB7CisJCQlpZiAoaXNEaXJ0eSgpKSB7CisJCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsKKwkJCX0KKwkJCWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZmx1c2goKTsKKworCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKwkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7CisJCQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKKwkJCQkJcmVzb3VyY2UudW5sb2FkKCk7CisJCQkJCXRyeSB7CisJCQkJCQlyZXNvdXJjZS5sb2FkKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJaWYgKCFyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5jb250YWluc0tleShyZXNvdXJjZSkpIHsKKwkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbi5pc1N0YWxlKGVkaXRvclNlbGVjdGlvbikpIHsKKwkJCQlzZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7CisJCQl9CisKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCX0KKwl9CisgIAorCS8qKgorCSAqIFVwZGF0ZXMgdGhlIHByb2JsZW1zIGluZGljYXRpb24gd2l0aCB0aGUgaW5mb3JtYXRpb24gZGVzY3JpYmVkIGluIHRoZSBzcGVjaWZpZWQgZGlhZ25vc3RpYy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpIHsKKwkJaWYgKHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKSB7CisJCQlCYXNpY0RpYWdub3N0aWMgZGlhZ25vc3RpYyA9CisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5PSywKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5lZGl0b3IiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgbnVsbCwKKwkJCQkJIG5ldyBPYmplY3QgW10geyBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkgfSk7CisJCQlmb3IgKERpYWdub3N0aWMgY2hpbGREaWFnbm9zdGljIDogcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAudmFsdWVzKCkpIHsKKwkJCQlpZiAoY2hpbGREaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQlkaWFnbm9zdGljLmFkZChjaGlsZERpYWdub3N0aWMpOworCQkJCX0KKwkJCX0KKworCQkJaW50IGxhc3RFZGl0b3JQYWdlID0gZ2V0UGFnZUNvdW50KCkgLSAxOworCQkJaWYgKGxhc3RFZGl0b3JQYWdlID49IDAgJiYgZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSBpbnN0YW5jZW9mIFByb2JsZW1FZGl0b3JQYXJ0KSB7CisJCQkJKChQcm9ibGVtRWRpdG9yUGFydClnZXRFZGl0b3IobGFzdEVkaXRvclBhZ2UpKS5zZXREaWFnbm9zdGljKGRpYWdub3N0aWMpOworCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQlzZXRBY3RpdmVQYWdlKGxhc3RFZGl0b3JQYWdlKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCVByb2JsZW1FZGl0b3JQYXJ0IHByb2JsZW1FZGl0b3JQYXJ0ID0gbmV3IFByb2JsZW1FZGl0b3JQYXJ0KCk7CisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsKKwkJCQlwcm9ibGVtRWRpdG9yUGFydC5zZXRNYXJrZXJIZWxwZXIobWFya2VySGVscGVyKTsKKwkJCQl0cnkgeworCQkJCQlhZGRQYWdlKCsrbGFzdEVkaXRvclBhZ2UsIHByb2JsZW1FZGl0b3JQYXJ0LCBnZXRFZGl0b3JJbnB1dCgpKTsKKwkJCQkJc2V0UGFnZVRleHQobGFzdEVkaXRvclBhZ2UsIHByb2JsZW1FZGl0b3JQYXJ0LmdldFBhcnROYW1lKCkpOworCQkJCQlzZXRBY3RpdmVQYWdlKGxhc3RFZGl0b3JQYWdlKTsKKwkJCQkJc2hvd1RhYnMoKTsKKwkJCQl9CisJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlFeGFtcGxlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKworCQkJaWYgKG1hcmtlckhlbHBlci5oYXNNYXJrZXJzKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSkpIHsKKwkJCQltYXJrZXJIZWxwZXIuZGVsZXRlTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQl0cnkgeworCQkJCQkJbWFya2VySGVscGVyLmNyZWF0ZU1hcmtlcnMoZGlhZ25vc3RpYyk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQlFeGFtcGxlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogU2hvd3MgYSBkaWFsb2cgdGhhdCBhc2tzIGlmIGNvbmZsaWN0aW5nIGNoYW5nZXMgc2hvdWxkIGJlIGRpc2NhcmRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkgeworCQlyZXR1cm4KKwkJCU1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uCisJCQkJKGdldFNpdGUoKS5nZXRTaGVsbCgpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9GaWxlQ29uZmxpY3RfbGFiZWwiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9XQVJOX0ZpbGVDb25mbGljdCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhIG1vZGVsIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXhhbXBsZUVkaXRvcigpIHsKKwkJc3VwZXIoKTsKKwkJaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdXAgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgbW9kZWwgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFZGl0aW5nRG9tYWluKCkgeworCQkvLyBDcmVhdGUgYW4gYWRhcHRlciBmYWN0b3J5IHRoYXQgeWllbGRzIGl0ZW0gcHJvdmlkZXJzLgorCQkvLworCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkuRGVzY3JpcHRvci5SZWdpc3RyeS5JTlNUQU5DRSk7CisKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBFeGFtcGxlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTdGFuZGFyZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBFY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNlcXVlbmNlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTGFiZWxzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTb2x2ZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKworCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUgZXhlY3V0ZWQuCisJCS8vCisJCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOworCisJCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCisJCS8vCisJCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcgorCQkJKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKKwkJCQkgcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgeworCQkJCQkgZ2V0Q29udGFpbmVyKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJIChuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJICBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCSAgZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworCisJCQkJCQkJCSAgLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KKwkJCQkJCQkJICAvLworCQkJCQkJCQkgIENvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaylldmVudC5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsKKwkJCQkJCQkJICBpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgeworCQkJCQkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihtb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7CisJCQkJCQkJCSAgfQorCQkJCQkJCQkgIGlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsICYmICFwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQkJCQkgIHByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsKKwkJCQkJCQkJICB9CisJCQkJCQkJICB9CisJCQkJCQkgIH0pOworCQkJCSB9CisJCQkgfSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgorCQkvLworCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgQm9vbGVhbj4oKSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBoZXJlIGZvciB0aGUgbGlzdGVuZXIgdG8gYmUgYWJsZSB0byBjYWxsIGl0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCQkJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGludCBhY3Rpb24pIHsKKwkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKGFjdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHRoZSBzZWxlY3Rpb24gaW50byB3aGljaGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBjb2xsZWN0aW9uIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKKwkJZmluYWwgQ29sbGVjdGlvbjw/PiB0aGVTZWxlY3Rpb24gPSBjb2xsZWN0aW9uOworCQkvLyBNYWtlIHN1cmUgaXQncyBva2F5LgorCQkvLworCQlpZiAodGhlU2VsZWN0aW9uICE9IG51bGwgJiYgIXRoZVNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKKwkJCS8vIEkgZG9uJ3Qga25vdyBpZiB0aGlzIHNob3VsZCBiZSBydW4gdGhpcyBkZWZlcnJlZAorCQkJLy8gYmVjYXVzZSB3ZSBtaWdodCBoYXZlIHRvIGdpdmUgdGhlIGVkaXRvciBhIGNoYW5jZSB0byBwcm9jZXNzIHRoZSB2aWV3ZXIgdXBkYXRlIGV2ZW50cworCQkJLy8gYW5kIGhlbmNlIHRvIHVwZGF0ZSB0aGUgdmlld3MgZmlyc3QuCisJCQkvLworCQkJLy8KKwkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0KKwkJCQluZXcgUnVubmFibGUoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGl0ZW1zIGluIHRoZSBjdXJyZW50IGNvbnRlbnQgdmlld2VyIG9mIHRoZSBlZGl0b3IuCisJCQkJCQkvLworCQkJCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgeworCQkJCQkJCWN1cnJlbnRWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoZVNlbGVjdGlvbi50b0FycmF5KCkpLCB0cnVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX07CisJCQlydW5uYWJsZS5ydW4oKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgZWRpdGluZyBkb21haW4gYXMgcmVxdWlyZWQgYnkgdGhlIHtAbGluayBJRWRpdGluZ0RvbWFpblByb3ZpZGVyfSBpbnRlcmZhY2UuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGltcGxlbWVudGluZyB0aGUgc3RhdGljIG1ldGhvZHMgb2Yge0BsaW5rIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbn0KKwkgKiBhbmQgZm9yIHN1cHBvcnRpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7CisJCXJldHVybiBlZGl0aW5nRG9tYWluOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBjbGFzcyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciB7CisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkgCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0IFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE9iamVjdCBbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7CisJCQlyZXR1cm4gKHBhcmVudCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhcmVudCkpLnRvQXJyYXkoKTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiBwYXJlbnQgIT0gbnVsbDsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBtYWtlcyBzdXJlIHRoYXQgb25lIGNvbnRlbnQgdmlld2VyLCBlaXRoZXIgZm9yIHRoZSBjdXJyZW50IHBhZ2Ugb3IgdGhlIG91dGxpbmUgdmlldywgaWYgaXQgaGFzIGZvY3VzLAorCSAqIGlzIHRoZSBjdXJyZW50IG9uZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2aWV3ZXIgCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRWaWV3ZXIoVmlld2VyIHZpZXdlcikgeworCQkvLyBJZiBpdCBpcyBjaGFuZ2luZy4uLgorCQkvLworCQlpZiAoY3VycmVudFZpZXdlciAhPSB2aWV3ZXIpIHsKKwkJCWlmIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgeworCQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgb24gZGVtYW5kLgorCQkJCS8vCisJCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0KKwkJCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQkJCQkvLyBUaGlzIGp1c3Qgbm90aWZpZXMgdGhvc2UgdGhpbmdzIHRoYXQgYXJlIGFmZmVjdGVkIGJ5IHRoZSBzZWN0aW9uLgorCQkJCQkJLy8KKwkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHNlbGVjdGlvbkNoYW5nZWRFdmVudCkgeworCQkJCQkJCXNldFNlbGVjdGlvbihzZWxlY3Rpb25DaGFuZ2VkRXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQkJfQorCQkJCQl9OworCQkJfQorCisJCQkvLyBTdG9wIGxpc3RlbmluZyB0byB0aGUgb2xkIG9uZS4KKwkJCS8vCisJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7CisJCQkJY3VycmVudFZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKKwkJCX0KKworCQkJLy8gU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXcgb25lLgorCQkJLy8KKwkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgeworCQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKKwkJCX0KKworCQkJLy8gUmVtZW1iZXIgaXQuCisJCQkvLworCQkJY3VycmVudFZpZXdlciA9IHZpZXdlcjsKKworCQkJLy8gU2V0IHRoZSBlZGl0b3JzIHNlbGVjdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCB2aWV3ZXIncyBzZWxlY3Rpb24uCisJCQkvLworCQkJc2V0U2VsZWN0aW9uKGN1cnJlbnRWaWV3ZXIgPT0gbnVsbCA/IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkgOiBjdXJyZW50Vmlld2VyLmdldFNlbGVjdGlvbigpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgdmlld2VyIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSVZpZXdlclByb3ZpZGVyfSBpbnRlcmZhY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKKwkJcmV0dXJuIGN1cnJlbnRWaWV3ZXI7CisJfQorCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGEgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyIGFuZCBhZGRzIGEgbGlzdGVuZXIgYXMgd2VsbCByZWdpc3RlcmluZyB0aGUgbWVudSBmb3IgZXh0ZW5zaW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7CisJCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsgLy8kTk9OLU5MUy0xJAorCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKKwkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKHRoaXMpOworCQlNZW51IG1lbnU9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOworCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7CisJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGNvbnRleHRNZW51LCBuZXcgVW53cmFwcGluZ1NlbGVjdGlvblByb3ZpZGVyKHZpZXdlcikpOworCisJCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LOworCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07CisJCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKKwkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgY2FsbGVkIHRvIGxvYWQgYSByZXNvdXJjZSBpbnRvIHRoZSBlZGl0aW5nIGRvbWFpbidzIHJlc291cmNlIHNldCBiYXNlZCBvbiB0aGUgZWRpdG9yJ3MgaW5wdXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlTW9kZWwoKSB7CisJCVVSSSByZXNvdXJjZVVSSSA9IEVkaXRVSVV0aWwuZ2V0VVJJKGdldEVkaXRvcklucHV0KCkpOworCQlFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworCQl0cnkgeworCQkJLy8gTG9hZCB0aGUgcmVzb3VyY2UgdGhyb3VnaCB0aGUgZWRpdGluZyBkb21haW4uCisJCQkvLworCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIHRydWUpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZXhjZXB0aW9uID0gZTsKKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCBmYWxzZSk7CisJCX0KKworCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKTsKKwkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsICBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCX0KKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBkaWFnbm9zdGljIGRlc2NyaWJpbmcgdGhlIGVycm9ycyBhbmQgd2FybmluZ3MgbGlzdGVkIGluIHRoZSByZXNvdXJjZQorCSAqIGFuZCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiAoaWYgYW55KS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSByZXNvdXJjZSAKKwkgKiBAcGFyYW0gZXhjZXB0aW9uIAorCSAqIEByZXR1cm4gCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEaWFnbm9zdGljIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKFJlc291cmNlIHJlc291cmNlLCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCWlmICghcmVzb3VyY2UuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpIHx8ICFyZXNvdXJjZS5nZXRXYXJuaW5ncygpLmlzRW1wdHkoKSkgeworCQkJQmFzaWNEaWFnbm9zdGljIGJhc2ljRGlhZ25vc3RpYyA9CisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5lZGl0b3IiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZXhjZXB0aW9uID09IG51bGwgPyAoT2JqZWN0KXJlc291cmNlIDogZXhjZXB0aW9uIH0pOworCQkJYmFzaWNEaWFnbm9zdGljLm1lcmdlKEVjb3JlVXRpbC5jb21wdXRlRGlhZ25vc3RpYyhyZXNvdXJjZSwgdHJ1ZSkpOworCQkJcmV0dXJuIGJhc2ljRGlhZ25vc3RpYzsKKwkJfQorCQllbHNlIGlmIChleGNlcHRpb24gIT0gbnVsbCkgeworCQkJcmV0dXJuCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5lZGl0b3IiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCSBuZXcgT2JqZWN0W10geyBleGNlcHRpb24gfSk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gRGlhZ25vc3RpYy5PS19JTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gaW5zdGFsbCB5b3VyIG93biBjb250cm9scy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlcygpIHsKKwkJLy8gQ3JlYXRlcyB0aGUgbW9kZWwgZnJvbSB0aGUgZWRpdG9yIGlucHV0CisJCS8vCisJCWNyZWF0ZU1vZGVsKCk7CisKKwkJLy8gT25seSBjcmVhdGVzIHRoZSBvdGhlciBwYWdlcyBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhhdCBjYW4gYmUgZWRpdGVkCisJCS8vCisJCWlmICghZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgc2VsZWN0aW9uIHRyZWUgdmlldy4KKwkJCS8vCisJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShnZXRDb250YWluZXIoKSwgU1dULk1VTFRJKTsKKwkJCXNlbGVjdGlvblZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOworCQkJc2V0Q3VycmVudFZpZXdlcihzZWxlY3Rpb25WaWV3ZXIpOworCisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKworCQkJbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcihzZWxlY3Rpb25WaWV3ZXIuZ2V0VHJlZSgpLCBhZGFwdGVyRmFjdG9yeSk7CisKKwkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHNlbGVjdGlvblZpZXdlcik7CisJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh0cmVlKTsKKwkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCSBzZXRBY3RpdmVQYWdlKDApOworCQkJCQkgfQorCQkJCSB9KTsKKwkJfQorCisJCS8vIEVuc3VyZXMgdGhhdCB0aGlzIGVkaXRvciB3aWxsIG9ubHkgZGlzcGxheSB0aGUgcGFnZSdzIHRhYgorCQkvLyBhcmVhIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHBhZ2UKKwkJLy8KKwkJZ2V0Q29udGFpbmVyKCkuYWRkQ29udHJvbExpc3RlbmVyCisJCQkobmV3IENvbnRyb2xBZGFwdGVyKCkgeworCQkJCWJvb2xlYW4gZ3VhcmQgPSBmYWxzZTsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsKKwkJCQkJaWYgKCFndWFyZCkgeworCQkJCQkJZ3VhcmQgPSB0cnVlOworCQkJCQkJaGlkZVRhYnMoKTsKKwkJCQkJCWd1YXJkID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkgfSk7CisKKwkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkgfQorCQkJIH0pOworCX0KKworCS8qKgorCSAqIElmIHRoZXJlIGlzIGp1c3Qgb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsCisJICogdGhpcyBoaWRlcyB0aGUgc2luZ2xlIHRhYiBhdCB0aGUgYm90dG9tLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhpZGVUYWJzKCkgeworCQlpZiAoZ2V0UGFnZUNvdW50KCkgPD0gMSkgeworCQkJc2V0UGFnZVRleHQoMCwgIiIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7CisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoMSk7CisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7CisJCQkJZ2V0Q29udGFpbmVyKCkuc2V0U2l6ZShwb2ludC54LCBwb2ludC55ICsgNik7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsCisJICogdGhpcyBzaG93cyB0aGUgdGFicyBhdCB0aGUgYm90dG9tLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNob3dUYWJzKCkgeworCQlpZiAoZ2V0UGFnZUNvdW50KCkgPiAxKSB7CisJCQlzZXRQYWdlVGV4dCgwLCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7CisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoU1dULkRFRkFVTFQpOworCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOworCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSAtIDYpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIHRyYWNrIHRoZSBhY3RpdmUgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IHBhZ2VJbmRleCkgeworCQlzdXBlci5wYWdlQ2hhbmdlKHBhZ2VJbmRleCk7CisKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7CisJCQloYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihjb250ZW50T3V0bGluZVBhZ2UuZ2V0U2VsZWN0aW9uKCkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBob3cgdGhlIGZyYW1ld29yayBkZXRlcm1pbmVzIHdoaWNoIGludGVyZmFjZXMgd2UgaW1wbGVtZW50LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKKwkJaWYgKGtleS5lcXVhbHMoSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcykpIHsKKwkJCXJldHVybiBzaG93T3V0bGluZVZpZXcoKSA/IGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIDogbnVsbDsKKwkJfQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykpIHsKKwkJCXJldHVybiBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOworCQl9CisJCWVsc2UgaWYgKGtleS5lcXVhbHMoSUdvdG9NYXJrZXIuY2xhc3MpKSB7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGtleSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIGNvbnRlbnQgb3V0bGluZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSUNvbnRlbnRPdXRsaW5lUGFnZSBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSB7CisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgPT0gbnVsbCkgeworCQkJLy8gVGhlIGNvbnRlbnQgb3V0bGluZSBpcyBqdXN0IGEgdHJlZS4KKwkJCS8vCisJCQljbGFzcyBNeUNvbnRlbnRPdXRsaW5lUGFnZSBleHRlbmRzIENvbnRlbnRPdXRsaW5lUGFnZSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCQkJCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKworCQkJCQkvLyBTZXQgdXAgdGhlIHRyZWUgdmlld2VyLgorCQkJCQkvLworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCisJCQkJCS8vIE1ha2Ugc3VyZSBvdXIgcG9wdXBzIHdvcmsuCisJCQkJCS8vCisJCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKGNvbnRlbnRPdXRsaW5lVmlld2VyKTsKKworCQkJCQlpZiAoIWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCQkJICAvLyBTZWxlY3QgdGhlIHJvb3Qgb2JqZWN0IGluIHRoZSB2aWV3LgorCQkJCQkgIC8vCisJCQkJCSAgY29udGVudE91dGxpbmVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIG1ha2VDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwgSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLCBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsKKwkJCQkJc3VwZXIubWFrZUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLCBzdGF0dXNMaW5lTWFuYWdlcik7CisJCQkJCWNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXIgPSBzdGF0dXNMaW5lTWFuYWdlcjsKKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKKwkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKKwkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7CisJCQkJfQorCQkJfQorCisJCQljb250ZW50T3V0bGluZVBhZ2UgPSBuZXcgTXlDb250ZW50T3V0bGluZVBhZ2UoKTsKKworCQkJLy8gTGlzdGVuIHRvIHNlbGVjdGlvbiBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgaXQgaXMgYSBzcGVjaWFsIHdheS4KKwkJCS8vCisJCQljb250ZW50T3V0bGluZVBhZ2UuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCisJCQkJKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJCQkgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2UgaGFuZGxlIHNlbGVjdGlvbnMgY29ycmVjdGx5LgorCQkJCQkgLy8KKwkJCQkJIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJCQkgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQkgfQorCQkJCSB9KTsKKwkJfQorCisJCXJldHVybiBjb250ZW50T3V0bGluZVBhZ2U7CisJfQorCisJLyoqCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBwcm9wZXJ0eSBzaGVldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7CisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZSA9CisJCQkJbmV3IEV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2UoZWRpdGluZ0RvbWFpbikgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoTGlzdDw/PiBzZWxlY3Rpb24pIHsKKwkJCQkJCUV4YW1wbGVFZGl0b3IudGhpcy5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihzZWxlY3Rpb24pOworCQkJCQkJRXhhbXBsZUVkaXRvci50aGlzLnNldEZvY3VzKCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisJCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7CisJCQkJCX0KKwkJCQl9OworCQkJcHJvcGVydHlTaGVldFBhZ2Uuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJfQorCisJCXJldHVybiBwcm9wZXJ0eVNoZWV0UGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGRlYWxzIHdpdGggaG93IHdlIHdhbnQgc2VsZWN0aW9uIGluIHRoZSBvdXRsaW5lciB0byBhZmZlY3QgdGhlIG90aGVyIHZpZXdzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHNlbGVjdGlvbiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJaWYgKHNlbGVjdGlvblZpZXdlciAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQlJdGVyYXRvcjw/PiBzZWxlY3RlZEVsZW1lbnRzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLml0ZXJhdG9yKCk7CisJCQlpZiAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsKKwkJCQkvLyBHZXQgdGhlIGZpcnN0IHNlbGVjdGVkIGVsZW1lbnQuCisJCQkJLy8KKwkJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCk7CisKKwkJCQlBcnJheUxpc3Q8T2JqZWN0PiBzZWxlY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisJCQkJc2VsZWN0aW9uTGlzdC5hZGQoc2VsZWN0ZWRFbGVtZW50KTsKKwkJCQl3aGlsZSAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsKKwkJCQkJc2VsZWN0aW9uTGlzdC5hZGQoc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCkpOworCQkJCX0KKworCQkJCS8vIFNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSB3aWRnZXQuCisJCQkJLy8KKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbkxpc3QpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSUVkaXRvclBhcnR9IGFuZCBzaW1wbHkgdGVzdHMgdGhlIGNvbW1hbmQgc3RhY2suCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKwkJcmV0dXJuICgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuaXNTYXZlTmVlZGVkKCk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSBzYXZlcyB0aGUgbW9kZWwgZmlsZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKKwkJLy8gU2F2ZSBvbmx5IHJlc291cmNlcyB0aGF0IGhhdmUgYWN0dWFsbHkgY2hhbmdlZC4KKwkJLy8KKwkJZmluYWwgTWFwPE9iamVjdCwgT2JqZWN0PiBzYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOworCQlzYXZlT3B0aW9ucy5wdXQoUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VELCBSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRURfTUVNT1JZX0JVRkZFUik7CisKKwkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbiBiZWNhdXNlIHRoaXMgaXMgYSBsb25nIHJ1bm5pbmcgYWN0aXZpdHkgdGhhdCBtb2RpZmllcyB0aGUgd29ya2JlbmNoLgorCQkvLworCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0KKwkJCW5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7CisJCQkJLy8gVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBydW5zLgorCQkJCS8vCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQkJLy8gU2F2ZSB0aGUgcmVzb3VyY2VzIHRvIHRoZSBmaWxlIHN5c3RlbS4KKwkJCQkJLy8KKwkJCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7CisJCQkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpIHsKKwkJCQkJCWlmICgoZmlyc3QgfHwgIXJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpIHx8IGlzUGVyc2lzdGVkKHJlc291cmNlKSkgJiYgIWVkaXRpbmdEb21haW4uaXNSZWFkT25seShyZXNvdXJjZSkpIHsKKwkJCQkJCQl0cnkgeworCQkJCQkJCQlsb25nIHRpbWVTdGFtcCA9IHJlc291cmNlLmdldFRpbWVTdGFtcCgpOworCQkJCQkJCQlyZXNvdXJjZS5zYXZlKHNhdmVPcHRpb25zKTsKKwkJCQkJCQkJaWYgKHJlc291cmNlLmdldFRpbWVTdGFtcCgpICE9IHRpbWVTdGFtcCkgeworCQkJCQkJCQkJc2F2ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJCQkJCQl9CisJCQkJCQkJZmlyc3QgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX07CisKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCS8vIFRoaXMgcnVucyB0aGUgb3B0aW9ucywgYW5kIHNob3dzIHByb2dyZXNzLgorCQkJLy8KKwkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpLnJ1bih0cnVlLCBmYWxzZSwgb3BlcmF0aW9uKTsKKworCQkJLy8gUmVmcmVzaCB0aGUgbmVjZXNzYXJ5IHN0YXRlLgorCQkJLy8KKwkJCSgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuc2F2ZUlzRG9uZSgpOworCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZyB0aGF0IHNob3VsZG4ndC4KKwkJCS8vCisJCQlFeGFtcGxlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgd2hldGhlciBzb21ldGhpbmcgaGFzIGJlZW4gcGVyc2lzdGVkIHRvIHRoZSBVUkkgb2YgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgVVJJIGNvbnZlcnRlciBmcm9tIHRoZSBlZGl0b3IncyByZXNvdXJjZSBzZXQgdG8gdHJ5IHRvIG9wZW4gYW4gaW5wdXQgc3RyZWFtLiAKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BlcnNpc3RlZChSZXNvdXJjZSByZXNvdXJjZSkgeworCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQl0cnkgeworCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKHJlc291cmNlLmdldFVSSSgpKTsKKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgeworCQkJCXJlc3VsdCA9IHRydWU7CisJCQkJc3RyZWFtLmNsb3NlKCk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElnbm9yZQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogVGhpcyBhbHdheXMgcmV0dXJucyB0cnVlIGJlY2F1c2UgaXQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFsc28gY2hhbmdlcyB0aGUgZWRpdG9yJ3MgaW5wdXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7CisJCVNhdmVBc0RpYWxvZyBzYXZlQXNEaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKKwkJc2F2ZUFzRGlhbG9nLm9wZW4oKTsKKwkJSVBhdGggcGF0aCA9IHNhdmVBc0RpYWxvZy5nZXRSZXN1bHQoKTsKKwkJaWYgKHBhdGggIT0gbnVsbCkgeworCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKKwkJCWlmIChmaWxlICE9IG51bGwpIHsKKwkJCQlkb1NhdmVBcyhVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZG9TYXZlQXMoVVJJIHVyaSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisJCShlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKS5zZXRVUkkodXJpKTsKKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKKwkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPQorCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgIT0gbnVsbCA/CisJCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgOgorCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisJCWRvU2F2ZShwcm9ncmVzc01vbml0b3IpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG1hcmtlciAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgeworCQl0cnkgeworCQkJaWYgKG1hcmtlci5nZXRUeXBlKCkuZXF1YWxzKEVWYWxpZGF0b3IuTUFSS0VSKSkgeworCQkJCVN0cmluZyB1cmlBdHRyaWJ1dGUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKEVWYWxpZGF0b3IuVVJJX0FUVFJJQlVURSwgbnVsbCk7CisJCQkJaWYgKHVyaUF0dHJpYnV0ZSAhPSBudWxsKSB7CisJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaUF0dHJpYnV0ZSk7CisJCQkJCUVPYmplY3QgZU9iamVjdCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7CisJCQkJCWlmIChlT2JqZWN0ICE9IG51bGwpIHsKKwkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9ucy5zaW5nbGV0b24oZWRpdGluZ0RvbWFpbi5nZXRXcmFwcGVyKGVPYmplY3QpKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQlFeGFtcGxlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHN0YXJ0dXAuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKKwkJc2V0U2l0ZShzaXRlKTsKKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKKwkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsKKwkJc2l0ZS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7CisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJZ2V0Q29udHJvbChnZXRBY3RpdmVQYWdlKCkpLnNldEZvY3VzKCk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gbGlzdGVuZXIgCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBsaXN0ZW5lciAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHJldHVybiB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogQHJldHVybgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7CisJCXJldHVybiBlZGl0b3JTZWxlY3Rpb247CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gc2V0IHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCisJICogQ2FsbGluZyB0aGlzIHJlc3VsdCB3aWxsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHNlbGVjdGlvbiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQllZGl0b3JTZWxlY3Rpb24gPSBzZWxlY3Rpb247CisKKwkJZm9yIChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyIDogc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycykgeworCQkJbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOworCQl9CisJCXNldFN0YXR1c0xpbmVNYW5hZ2VyKHNlbGVjdGlvbik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gc2VsZWN0aW9uIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXNMaW5lTWFuYWdlcihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBjdXJyZW50Vmlld2VyICE9IG51bGwgJiYgY3VycmVudFZpZXdlciA9PSBjb250ZW50T3V0bGluZVZpZXdlciA/CisJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyIDogZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7CisKKwkJaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJCUNvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS50b0xpc3QoKTsKKwkJCQlzd2l0Y2ggKGNvbGxlY3Rpb24uc2l6ZSgpKSB7CisJCQkJCWNhc2UgMDogeworCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9Ob09iamVjdFNlbGVjdGVkIikpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIDE6IHsKKwkJCQkJCVN0cmluZyB0ZXh0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcihhZGFwdGVyRmFjdG9yeSkuZ2V0VGV4dChjb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQiLCB0ZXh0KSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWRlZmF1bHQ6IHsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTXVsdGlPYmplY3RTZWxlY3RlZCIsIEludGVnZXIudG9TdHJpbmcoY29sbGVjdGlvbi5zaXplKCkpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZSgiIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gdGhlIHBsdWdpbidzIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7CisJCXJldHVybiBFeGFtcGxlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXkpOworCX0KKworCS8qKgorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gcGx1Z2luLnByb3BlcnRpZXMsIG1ha2luZyBhIHN1YnN0aXR1dGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgeworCQlyZXR1cm4gRXhhbXBsZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5LCBuZXcgT2JqZWN0IFtdIHsgczEgfSk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcn0gdG8gaGVscCBmaWxsIHRoZSBjb250ZXh0IG1lbnVzIHdpdGggY29udHJpYnV0aW9ucyBmcm9tIHRoZSBFZGl0IG1lbnUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gbWVudU1hbmFnZXIgCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJKChJTWVudUxpc3RlbmVyKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpKS5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogQHJldHVybiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7CisJCXJldHVybiAoRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogQHJldHVybiAKKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKSB7CisJCXJldHVybiBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGlvbkJhcnMoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisKKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7CisKKwkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKKworCQlhZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7CisKKwkJaWYgKGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gdGhpcykgeworCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IobnVsbCk7CisJCX0KKworCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgeworCQkJcHJvcGVydHlTaGVldFBhZ2UuZGlzcG9zZSgpOworCQl9CisKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7CisJCQljb250ZW50T3V0bGluZVBhZ2UuZGlzcG9zZSgpOworCQl9CisKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgb3V0bGluZSB2aWV3IHNob3VsZCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd091dGxpbmVWaWV3KCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9leGFtcGxlL3ByZXNlbnRhdGlvbi9FeGFtcGxlRGlzZWFzZU1vZGVsQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9leGFtcGxlL3ByZXNlbnRhdGlvbi9FeGFtcGxlRGlzZWFzZU1vZGVsQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMmIwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvcHJlc2VudGF0aW9uL0V4YW1wbGVEaXNlYXNlTW9kZWxBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw0MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5wcmVzZW50YXRpb247CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5kaXNlYXNlbW9kZWxwcm9wZXJ0eWVkaXRvci5EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmRpc2Vhc2Vtb2RlbHByb3BlcnR5ZWRpdG9yLkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuRGlzZWFzZU1vZGVsUHJvcGVydHlDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKKworLyoqCisgKiAgCisgKiBBZGFwdGVyIGZvciBQcm9wZXJ0eSBFZGl0b3IKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBFeGFtcGxlRGlzZWFzZU1vZGVsQWRhcHRlciBleHRlbmRzCisJCURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlciB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IgY3JlYXRlRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IoCisJCQlEaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZSBkaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZSwKKwkJCWludCBzdHlsZSwgTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCkgeworCQlyZXR1cm4gbmV3IEV4YW1wbGVEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcigKKwkJCQlkaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZSwgc3R5bGUsCisJCQkJKERpc2Vhc2VNb2RlbCkgZ2V0VGFyZ2V0KCksIHByb2plY3RWYWxpZGF0b3IsIHByb2plY3QpOworCX0gLy8gY3JlYXRlRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IKKworfSAvLyBFeGFtcGxlRGlzZWFzZU1vZGVsQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9leGFtcGxlL3ByZXNlbnRhdGlvbi9FeGFtcGxlRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS9wcmVzZW50YXRpb24vRXhhbXBsZURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyMzQ2OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS9wcmVzZW50YXRpb24vRXhhbXBsZURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUucHJlc2VudGF0aW9uOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUuRXhhbXBsZURpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5FeGFtcGxlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZGlzZWFzZW1vZGVscHJvcGVydHllZGl0b3IuRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3MuUHJvcGVydHlTdHJpbmdQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLkRpc2Vhc2VXaXphcmRNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgRXhhbXBsZURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yIGV4dGVuZHMKKwkJRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IgeworCQorCS8qKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gc3R5bGUKKwkgKiBAcGFyYW0gZGlzZWFzZU1vZGVsCisJICogQHBhcmFtIHByb2plY3RWYWxpZGF0b3IKKwkgKi8KKwlwdWJsaWMgRXhhbXBsZURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsCisJCQlpbnQgc3R5bGUsIERpc2Vhc2VNb2RlbCBkaXNlYXNlTW9kZWwsCisJCQlNb2RpZnlMaXN0ZW5lciBwcm9qZWN0VmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB7CisJCXN1cGVyKHBhcmVudCwgc3R5bGUsIGRpc2Vhc2VNb2RlbCwgcHJvamVjdFZhbGlkYXRvciwgcHJvamVjdCk7CisJfSAvLyBFeGFtcGxlRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLlN0YW5kYXJkRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IjcG9wdWxhdGUob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwb3B1bGF0ZShEaXNlYXNlTW9kZWwgZGlzZWFzZU1vZGVsKSB7CisJCXN1cGVyLnBvcHVsYXRlKGRpc2Vhc2VNb2RlbCk7CisJCQorCQlmb3IgKGZpbmFsIE1hcC5FbnRyeTxFU3RydWN0dXJhbEZlYXR1cmUsIFRleHQ+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpIHsKKwkJCWRvdWJsZSBkVmFsID0gMC4wOworCQkKKwkJCXN3aXRjaCAoZW50cnkuZ2V0S2V5KCkuZ2V0RmVhdHVyZUlEKCkpIHsKKwkJCWNhc2UgRXhhbXBsZVBhY2thZ2UuRVhBTVBMRV9ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0ZMT09SOgorCQkJCWRWYWwgPSAobmV3IERvdWJsZShlbnRyeS5nZXRWYWx1ZSgpLmdldFRleHQoKSkpLmRvdWJsZVZhbHVlKCk7CisJCQkJKChFeGFtcGxlRGlzZWFzZU1vZGVsKSBkaXNlYXNlTW9kZWwpLnNldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKGRWYWwpOworCQkJCWJyZWFrOworCQkJY2FzZSBFeGFtcGxlUGFja2FnZS5FWEFNUExFX0RJU0VBU0VfTU9ERUxfX1NFQVNPTkFMX01PRFVMQVRJT05fRVhQT05FTlQ6CisJCQkJZFZhbCA9IChuZXcgRG91YmxlKGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpKSkuZG91YmxlVmFsdWUoKTsKKwkJCQkoKEV4YW1wbGVEaXNlYXNlTW9kZWwpIGRpc2Vhc2VNb2RlbCkuc2V0U2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQoZFZhbCk7CisJCQkJYnJlYWs7CQorCQkJY2FzZSBFeGFtcGxlUGFja2FnZS5FWEFNUExFX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EOgorCQkJCWRWYWwgPSAobmV3IERvdWJsZShlbnRyeS5nZXRWYWx1ZSgpLmdldFRleHQoKSkpLmRvdWJsZVZhbHVlKCk7CisJCQkJKChFeGFtcGxlRGlzZWFzZU1vZGVsKSBkaXNlYXNlTW9kZWwpCisJCQkJCQkuc2V0TW9kdWxhdGlvblBlcmlvZChkVmFsKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRXhhbXBsZVBhY2thZ2UuRVhBTVBMRV9ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZUOgorCQkJCWRWYWwgPSAobmV3IERvdWJsZShlbnRyeS5nZXRWYWx1ZSgpLmdldFRleHQoKSkpLmRvdWJsZVZhbHVlKCk7CisJCQkJKChFeGFtcGxlRGlzZWFzZU1vZGVsKSBkaXNlYXNlTW9kZWwpCisJCQkJCQkuc2V0TW9kdWxhdGlvblBoYXNlU2hpZnQoZFZhbCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfSAvLyBzd2l0Y2gKKwkJfSAvLyBmb3IgZWFjaCBNYXAuZW50cnkKKwkJCisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuU3RhbmRhcmREaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvciN2YWxpZGF0ZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci52YWxpZGF0ZSgpOworCQkvLyBEaXNlYXNlIERhdGEgRGlyZWN0b3J5IG9yIEZpbGUKKwkJaWYgKHJldFZhbHVlKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIFRleHQgdGV4dCA9IG1hcAorCQkJCQkuZ2V0KEV4YW1wbGVQYWNrYWdlLkxpdGVyYWxzLkVYQU1QTEVfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0QpOworCQkJU3RyaW5nIHNWYWwgPSB0ZXh0LmdldFRleHQoKTsKKwkJCXRyeSB7CisJCQkJLy8gVE9ETyBjaGVjayBpZiBhbGwgdGhyZWUgcGFyYW1zIGFyZSBhIHZhbGlkIG51bWJlcgorCQkJCW5ldyBEb3VibGUoc1ZhbCk7CisJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQllcnJvck1lc3NhZ2UgPSBEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJORGl6V2l6RXJyMjAiKTsgLy8kTk9OLU5MUy0xJAorCQkJfSAvLyBpZgorCQl9IC8vIGlmCisJCQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfQorCQorfSAvLyBFeGFtcGxlRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS9wcmVzZW50YXRpb24vRXhhbXBsZURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS9wcmVzZW50YXRpb24vRXhhbXBsZURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTI0Njk3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9leGFtcGxlL3ByZXNlbnRhdGlvbi9FeGFtcGxlRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUucHJlc2VudGF0aW9uOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLnV0aWwuRXhhbXBsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZGlzZWFzZW1vZGVscHJvcGVydHllZGl0b3IuRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZGlzZWFzZW1vZGVscHJvcGVydHllZGl0b3IuRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBAYXV0aG9yIGphbWVzCisgKiAKKyAqLworcHVibGljIGNsYXNzIEV4YW1wbGVEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKKwkJRXhhbXBsZUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMKKwkJRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgRXhhbXBsZURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJCURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkuYWRkQWRhcHRlckZhY3RvcnkodGhpcyk7CisJfQorCisJLyoqCisJICogCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhhbXBsZURpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgRXhhbXBsZURpc2Vhc2VNb2RlbEFkYXB0ZXIoKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlLnV0aWwuRXhhbXBsZUFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCXJldHVybiB0eXBlID09IERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlci5jbGFzcworCQkJCXx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CisJfQorfSAvLyBFeGFtcGxlRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9leGFtcGxlL3ByZXNlbnRhdGlvbi9FeGFtcGxlRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvcHJlc2VudGF0aW9uL0V4YW1wbGVEaXNlYXNlV2l6YXJkTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTlmM2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9leGFtcGxlL3ByZXNlbnRhdGlvbi9FeGFtcGxlRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLy8gRXhhbXBsZURpc2Vhc2VXaXphcmRNZXNzYWdlcy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0aGUgUmVzb3VyY2UgQnVuZGxlIGZvciB0aGlzIHBhY2thZ2UuCisgKi8KK3B1YmxpYyBjbGFzcyBFeGFtcGxlRGlzZWFzZVdpemFyZE1lc3NhZ2VzIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSBDb25zdGFudHMuSURfUk9PVAorCQkJKyAiLnVpLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS5wcmVzZW50YXRpb24uZXhhbXBsZWRpc2Vhc2VtZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCisJCQkuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBFeGFtcGxlRGlzZWFzZVdpemFyZE1lc3NhZ2VzKCkgeworCQkvLyBlbXB0eQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBrZXkKKwkgKiAgICAgICAgICAgIHRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlCisJICogQHJldHVybiB0aGUgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUga2V5CisJICogQHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gaWYgdGhlIGtleSBjYW5ub3QgYmUgZm91bmQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoZmluYWwgU3RyaW5nIGtleSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbnsKKwkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7CisJfSAvLyBnZXRTdHJpbmcKK30gLy8gRXhhbXBsZURpc2Vhc2VXaXphcmRNZXNzYWdlcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9leGFtcGxlL3ByZXNlbnRhdGlvbi9FeGFtcGxlRWRpdG9yUGx1Z2luLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvcHJlc2VudGF0aW9uL0V4YW1wbGVFZGl0b3JQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmJmN2VmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9leGFtcGxlL3ByZXNlbnRhdGlvbi9FeGFtcGxlRWRpdG9yUGx1Z2luLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuRWNsaXBzZVVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXIuRGVmaW5pdGlvbnNFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5EaXNlYXNlbW9kZWxzRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBjZW50cmFsIHNpbmdsZXRvbiBmb3IgdGhlIEV4YW1wbGUgZWRpdG9yIHBsdWdpbi4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQorcHVibGljIGZpbmFsIGNsYXNzIEV4YW1wbGVFZGl0b3JQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4geworCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEV4YW1wbGVFZGl0b3JQbHVnaW4gSU5TVEFOQ0UgPSBuZXcgRXhhbXBsZUVkaXRvclBsdWdpbigpOworCQorCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFeGFtcGxlRWRpdG9yUGx1Z2luKCkgeworCQlzdXBlcgorCQkJKG5ldyBSZXNvdXJjZUxvY2F0b3IgW10geworCQkJCURpc2Vhc2Vtb2RlbHNFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkJCUNvcmVFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkJCUVjb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJCQlEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCQl9KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCQorCS8qKgorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVVJUGx1Z2luIHsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOworCQorCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4KKwkJCS8vCisJCQlwbHVnaW4gPSB0aGlzOworCQl9CisJCQorCQkvKioKKwkJICogCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworLy8JCQluZXcgRXhhbXBsZVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOworCQkJbmV3IEV4YW1wbGVEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5KCk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS9wcmVzZW50YXRpb24vRXhhbXBsZVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9leGFtcGxlL3ByZXNlbnRhdGlvbi9FeGFtcGxlUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiYjViMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leGFtcGxlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZXhhbXBsZS9wcmVzZW50YXRpb24vRXhhbXBsZVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvLyBFeGFtcGxlUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS51dGlsLkV4YW1wbGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBFeGFtcGxlUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKKwkJRXhhbXBsZUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMKKwkJUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LCBJU3RhcnR1cCB7CisKKwlQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKKworCS8qKgorCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgRXhhbXBsZVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkZEFkYXB0ZXJGYWN0b3J5KHRoaXMpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXAjZWFybHlTdGFydHVwKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBlYXJseVN0YXJ0dXAoKSB7CisJCS8vIE5vdGhpbmcgdG8gZG8gaGVyZS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBoYXMKKwkJLy8gcnVuIHdoaWNoIGlzIHRoZSBlbnRpcmUgcG9pbnQgb2YgZWFybHkgYWN0aXZhdGlvbiB3aGljaCBjYXVzZXMgdGhlCisJCS8vIGZhY3RvcnkgdG8gYmUgYWRkZWQgdG8gdGhlIFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGwjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSkKKwkJCQl8fCB0eXBlID09IFByb3BlcnR5U3RyaW5nUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS51dGlsLkV4YW1wbGVBZGFwdGVyRmFjdG9yeSNjcmVhdGVFeGFtcGxlRGlzZWFzZU1vZGVsQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhhbXBsZURpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCS8vIEhhdmUgd2UgY3JlYXRlZCBvbmUgYmVmb3JlPworCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7CisJCQkvLyBObworCQkJYWRhcHRlciA9IG5ldyAgU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlcigpIHsKKworCQkJCS8qKgorCQkJCSAqIEBwYXJhbSBkZXNjcmlwdG9yCisJCQkJICogQHJldHVybiB0aGUgTkxTJ2QgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZGlzcGxheSB0byB0aGUgdXNlcgorCQkJCSAqLworCQkJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCXJldHVybiBFeGFtcGxlRGlzZWFzZVdpemFyZE1lc3NhZ2VzCisJCQkJCQkJCS5nZXRTdHJpbmcoKChFU3RydWN0dXJhbEZlYXR1cmUpIGRlc2NyaXB0b3IKKwkJCQkJCQkJCQkuZ2V0RmVhdHVyZShudWxsKSkuZ2V0TmFtZSgpKTsKKwkJCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eU5hbWUoZGVzY3JpcHRvcik7CisJCQkJCX0KKwkJCQl9IC8vIGdldFByb3BlcnR5TmFtZQorCisJCQkJLyoqCisJCQkJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkJCQkgKiBAcmV0dXJuIHRoZSBOTFMnZCB0b29sIHRpcCB0ZXh0IHRoYXQgZGVzY3JpYmVzIHRoZSBwcm9wZXJ0eQorCQkJCSAqLworCQkJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlUb29sVGlwKAorCQkJCQkJSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQkJCQl0cnkgeworCQkJCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBkZXNjcmlwdG9yCisJCQkJCQkJCS5nZXRGZWF0dXJlKG51bGwpOworCQkJCQkJcmV0dXJuIEV4YW1wbGVEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKGZlYXR1cmUKKwkJCQkJCQkJLmdldE5hbWUoKQorCQkJCQkJCQkrIFRUX1NVRkZJWCk7CisJCQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlUb29sVGlwKGRlc2NyaXB0b3IpOworCQkJCQl9CisJCQkJfSAvLyBnZXRQcm9wZXJ0eVRvb2xUaXAKKworCQkJCS8qKgorCQkJCSAqIEBwYXJhbSBkZXNjcmlwdG9yCisJCQkJICogQHJldHVybiB0aGUgTkxTJ2QgdGV4dCB0aGF0IHJlcHJlc2VudHMgdGhlIHVuaXRzIG9mIHRoZQorCQkJCSAqICAgICAgICAgcHJvcGVydHkKKwkJCQkgKi8KKwkJCQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VW5pdHMoCisJCQkJCQlJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisJCQkJCXRyeSB7CisJCQkJCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGRlc2NyaXB0b3IKKwkJCQkJCQkJLmdldEZlYXR1cmUobnVsbCk7CisJCQkJCQlyZXR1cm4gRXhhbXBsZURpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoZmVhdHVyZQorCQkJCQkJCQkuZ2V0TmFtZSgpCisJCQkJCQkJCSsgVU5JVF9TVUZGSVgpOworCQkJCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCQkJCQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5VW5pdHMoZGVzY3JpcHRvcik7CisJCQkJCX0KKwkJCQl9IC8vIGdldFByb3BlcnR5VW5pdHMKKwkJCX07CisJCX0gLy8gaWYgd2UgZGlkbid0IGNyZWF0ZSBvbmUgYmVmb3JlCisJCXJldHVybiBhZGFwdGVyOworCX0vLyBjcmVhdGVFeGFtcGxlRGlzZWFzZU1vZGVsQWRhcHRlcigpCisKK30gLy8gRXhhbXBsZVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9leGFtcGxlL3ByZXNlbnRhdGlvbi9leGFtcGxlZGlzZWFzZW1lc3NhZ2VzLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2V4YW1wbGUvcHJlc2VudGF0aW9uL2V4YW1wbGVkaXNlYXNlbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTU4YzhmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9leGFtcGxlL3ByZXNlbnRhdGlvbi9leGFtcGxlZGlzZWFzZW1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNiBAQAorIyBkaXNlYXNld2l6YXJkbWVzc2FnZXMucHJvcGVydGllcworIworIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3NlYXNvbmFsTW9kdWxhdGlvbiA9IFNlYXNvbmFsIE1vZHVsYXRpb24KK3NlYXNvbmFsTW9kdWxhdGlvblRUID0gU2Vhc29uYWwgTW9kdWxhdGlvbgorc2Vhc29uYWxNb2R1bGF0aW9uVU5JVCA9IERheXMKKworbW9kdWxhdGlvblBlcmlvZCA9IE1vZHVsYXRpb24gUGVyaW9kCittb2R1bGF0aW9uUGVyaW9kVFQgPSBNb2R1bGF0aW9uIFBlcmlvZAorbW9kdWxhdGlvblBlcmlvZFVOSVQgPSBEYXlzCisKK21vZHVsYXRpb25QaGFzZVNoaWZ0ID0gTW9kdWxhdGlvbiBQaGFzZSBTaGlmdAorbW9kdWxhdGlvblBoYXNlU2hpZnRUVCA9IE1vZHVsYXRpb24gUGhhc2UgU2hpZnQKK21vZHVsYXRpb25QaGFzZVNoaWZ0VU5JVCA9IERheXMKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGU4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OWIwMzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2U8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmUxMDI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSwxMiBAQAorI1R1ZSBTZXAgMjMgMDk6MzY6MzggRURUIDIwMDgKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDkwYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDE2IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZTtzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UucHJlc2VudGF0aW9uLkV4dGVybmFsRGF0YVNvdXJjZUVkaXRvclBsdWdpbiRJbXBsZW1lbnRhdGlvbgorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLnByZXNlbnRhdGlvbgorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2U7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMsCisgb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLAorIG9yZy5lY2xpcHNlLnN0ZW0udWkKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTExZGNiOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE0IEBACisKKyMgPGNvcHlyaWdodD4KKyMgPC9jb3B5cmlnaHQ+CisjCisjICRJZDogYnVpbGQucHJvcGVydGllcyx2IDEuMSAyMDA4LzAzLzE4IDA0OjUxOjU3IGprYXVmbWFuIEV4cCAkCisKK2Jpbi5pbmNsdWRlcyA9IC4sXAorICAgICAgICAgICAgICAgaWNvbnMvLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuCitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9pY29ucy9mdWxsL29iajE2L0V4dGVybmFsRGF0YVNvdXJjZU1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL2ljb25zL2Z1bGwvb2JqMTYvRXh0ZXJuYWxEYXRhU291cmNlTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTk0NDEwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9pY29ucy9mdWxsL29iajE2L0V4dGVybmFsRGF0YVNvdXJjZU1vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9pY29ucy9mdWxsL3dpemJhbi9OZXdFeHRlcm5hbERhdGFTb3VyY2UuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9pY29ucy9mdWxsL3dpemJhbi9OZXdFeHRlcm5hbERhdGFTb3VyY2UuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzhiNzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL2ljb25zL2Z1bGwvd2l6YmFuL05ld0V4dGVybmFsRGF0YVNvdXJjZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRlMTNkZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2OCBAQAorCisjIDxjb3B5cmlnaHQ+CisjIDwvY29weXJpZ2h0PgorIworIyAkSWQ6IHBsdWdpbi5wcm9wZXJ0aWVzLHYgMS4xIDIwMDgvMDMvMTggMDQ6NTE6NTcgamthdWZtYW4gRXhwICQKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBUbyBjb2RlIGRldmVsb3BlcjoKKyMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKKyMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgorIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQorIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitwbHVnaW5OYW1lID0gU1RFTSBFeHRlcm5hbCBEYXRhIFNvdXJjZSBEaXNlYXNlIE1vZGVsIFVJCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZworCitfVUlfRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yX21lbnUgPSAmRXh0ZXJuYWxEYXRhU291cmNlIEVkaXRvcgorCitfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtID0gJk5ldyBDaGlsZAorX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtID0gTiZldyBTaWJsaW5nCisKK19VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtID0gU2hvdyAmUHJvcGVydGllcyBWaWV3CitfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0gPSAmUmVmcmVzaAorCitfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCA9IFNlbGVjdGlvbgorX1VJX1BhcmVudFBhZ2VfbGFiZWwgPSBQYXJlbnQKK19VSV9MaXN0UGFnZV9sYWJlbCA9IExpc3QKK19VSV9UcmVlUGFnZV9sYWJlbCA9IFRyZWUKK19VSV9UYWJsZVBhZ2VfbGFiZWwgPSBUYWJsZQorX1VJX1RyZWVXaXRoQ29sdW1uc1BhZ2VfbGFiZWwgPSBUcmVlIHdpdGggQ29sdW1ucworX1VJX09iamVjdENvbHVtbl9sYWJlbCA9IE9iamVjdAorX1VJX1NlbGZDb2x1bW5fbGFiZWwgPSBTZWxmCisKK19VSV9Ob09iamVjdFNlbGVjdGVkID0gU2VsZWN0ZWQgTm90aGluZworX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkID0gU2VsZWN0ZWQgT2JqZWN0OiB7MH0KK19VSV9NdWx0aU9iamVjdFNlbGVjdGVkID0gU2VsZWN0ZWQgezB9IE9iamVjdHMKKworX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbCA9IE9wZW4gRWRpdG9yCisKK19VSV9XaXphcmRfY2F0ZWdvcnkgPSBFeGFtcGxlIEVNRiBNb2RlbCBDcmVhdGlvbiBXaXphcmRzCisKK19VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UgPSBQcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiBmaWxlICJ7MH0iCisKK19VSV9FeHRlcm5hbERhdGFTb3VyY2VNb2RlbFdpemFyZF9sYWJlbCA9IEV4dGVybmFsRGF0YVNvdXJjZSBNb2RlbAorX1VJX0V4dGVybmFsRGF0YVNvdXJjZU1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IEV4dGVybmFsRGF0YVNvdXJjZSBtb2RlbAorCitfVUlfRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yX2xhYmVsID0gRXh0ZXJuYWxEYXRhU291cmNlIE1vZGVsIEVkaXRvcgorCitfVUlfRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZSA9IE15CitfVUlfRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yRmlsZW5hbWVFeHRlbnNpb24gPSBleHRlcm5hbGRhdGFzb3VyY2UKKworX1VJX1dpemFyZF9sYWJlbCA9IE5ldworCitfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbiA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gIi57MH0iCisKK19VSV9Nb2RlbE9iamVjdCA9ICZNb2RlbCBPYmplY3QKK19VSV9YTUxFbmNvZGluZyA9ICZYTUwgRW5jb2RpbmcKK19VSV9YTUxFbmNvZGluZ0Nob2ljZXMgPSBVVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQorX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbiA9IFNlbGVjdCBhIG1vZGVsIG9iamVjdCB0byBjcmVhdGUKKworX1VJX0ZpbGVDb25mbGljdF9sYWJlbCA9IEZpbGUgQ29uZmxpY3QKK19XQVJOX0ZpbGVDb25mbGljdCA9IFRoZXJlIGFyZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCBjb25mbGljdCB3aXRoIGNoYW5nZXMgbWFkZSBvdXRzaWRlIHRoZSBlZGl0b3IuICBEbyB5b3Ugd2lzaCB0byBkaXNjYXJkIHRoaXMgZWRpdG9yJ3MgY2hhbmdlcz8KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYmJiYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3BsdWdpbi54bWwKQEAgLTAsMCArMSw0NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPCEtLQorIDxjb3B5cmlnaHQ+CisgPC9jb3B5cmlnaHQ+CisKKyAkSWQ6IHBsdWdpbi54bWwsdiAxLjEgMjAwOC8wMy8xOCAwNDo1MTo1NyBqa2F1Zm1hbiBFeHAgJAorLS0+CisKKzxwbHVnaW4+CisKKworICA8ZXh0ZW5zaW9uCisgICAgcG9pbnQgPSAib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+CisgICAgPGNhdGVnb3J5CisgICAgICBpZCA9ICJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuV2l6YXJkLmNhdGVnb3J5LklEIgorICAgICAgbmFtZT0iJV9VSV9XaXphcmRfY2F0ZWdvcnkiPgorICAgIDwvY2F0ZWdvcnk+CisgICAgPHdpemFyZAorICAgICAgaWQgPSAib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5wcmVzZW50YXRpb24uRXh0ZXJuYWxEYXRhU291cmNlTW9kZWxXaXphcmRJRCIKKyAgICAgIG5hbWUgPSAiJV9VSV9FeHRlcm5hbERhdGFTb3VyY2VNb2RlbFdpemFyZF9sYWJlbCIKKyAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UucHJlc2VudGF0aW9uLkV4dGVybmFsRGF0YVNvdXJjZU1vZGVsV2l6YXJkIgorICAgICAgY2F0ZWdvcnkgPSAib3JnLmVjbGlwc2UuZW1mLmVjb3JlLldpemFyZC5jYXRlZ29yeS5JRCIKKyAgICAgIGljb24gPSAiaWNvbnMvZnVsbC9vYmoxNi9FeHRlcm5hbERhdGFTb3VyY2VNb2RlbEZpbGUuZ2lmIj4KKyAgICAgIDxkZXNjcmlwdGlvbj4lX1VJX0V4dGVybmFsRGF0YVNvdXJjZU1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxzZWxlY3Rpb24gY2xhc3MgPSAib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPgorICAgIDwvd2l6YXJkPgorICA8L2V4dGVuc2lvbj4KKworICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgorICAgIDxlZGl0b3IKKyAgICAgICAgaWQgPSAib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5wcmVzZW50YXRpb24uRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9ySUQiCisgICAgICAgIG5hbWUgPSAiJV9VSV9FeHRlcm5hbERhdGFTb3VyY2VFZGl0b3JfbGFiZWwiCisgICAgICAgIGljb24gPSAiaWNvbnMvZnVsbC9vYmoxNi9FeHRlcm5hbERhdGFTb3VyY2VNb2RlbEZpbGUuZ2lmIgorICAgICAgICBleHRlbnNpb25zID0gImV4dGVybmFsZGF0YXNvdXJjZSIKKyAgICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5wcmVzZW50YXRpb24uRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yIiAKKyAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5wcmVzZW50YXRpb24uRXh0ZXJuYWxEYXRhU291cmNlQWN0aW9uQmFyQ29udHJpYnV0b3IiID4KKyAgICA8L2VkaXRvcj4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnN0YXJ0dXAiPgorICAgICA8c3RhcnR1cAorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5wcmVzZW50YXRpb24uRXh0ZXJuYWxEYXRhU291cmNlUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij48L3N0YXJ0dXA+CisgIDwvZXh0ZW5zaW9uPiAgICAKKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS9wcmVzZW50YXRpb24vRXh0ZXJuYWxEYXRhU291cmNlQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvcHJlc2VudGF0aW9uL0V4dGVybmFsRGF0YVNvdXJjZUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5MWRhZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvcHJlc2VudGF0aW9uL0V4dGVybmFsRGF0YVNvdXJjZUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKQEAgLTAsMCArMSw0MjkgQEAKKy8vIEV4dGVybmFsRGF0YVNvdXJjZUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29udHJvbEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJDb250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZvciB0aGUgRXh0ZXJuYWxEYXRhU291cmNlIG1vZGVsIGVkaXRvci4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEV4dGVybmFsRGF0YVNvdXJjZUFjdGlvbkJhckNvbnRyaWJ1dG9yCisJZXh0ZW5kcyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IKKwlpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvclBhcnQ7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBhY3Rpb24gb3BlbnMgdGhlIFByb3BlcnRpZXMgdmlldy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUFjdGlvbiBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24gPQorCQluZXcgQWN0aW9uKEV4dGVybmFsRGF0YVNvdXJjZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtIikpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCXRyeSB7CisJCQkJCWdldFBhZ2UoKS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIpOworCQkJCX0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCUV4dGVybmFsRGF0YVNvdXJjZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIGFjdGlvbiByZWZyZXNoZXMgdGhlIHZpZXdlciBvZiB0aGUgY3VycmVudCBlZGl0b3IgaWYgdGhlIGVkaXRvcgorCSAqIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElBY3Rpb24gcmVmcmVzaFZpZXdlckFjdGlvbiA9CisJCW5ldyBBY3Rpb24oRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtIikpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworCQkJCXJldHVybiBhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlpZiAoYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgeworCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpYWN0aXZlRWRpdG9yUGFydCkuZ2V0Vmlld2VyKCk7CisJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgeworCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcgorCSAqIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZUNoaWxkQWN0aW9uczsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCBmb3IgQ3JlYXRlQ2hpbGQgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcgorCSAqIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZVNpYmxpbmdBY3Rpb25zOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVTaWJsaW5nIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvbnRyaWJ1dG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFeHRlcm5hbERhdGFTb3VyY2VBY3Rpb25CYXJDb250cmlidXRvcigpIHsKKwkJc3VwZXIoQURESVRJT05TX0xBU1RfU1RZTEUpOworCQlsb2FkUmVzb3VyY2VBY3Rpb24gPSBuZXcgTG9hZFJlc291cmNlQWN0aW9uKCk7CisJCXZhbGlkYXRlQWN0aW9uID0gbmV3IFZhbGlkYXRlQWN0aW9uKCk7CisJCWNvbnRyb2xBY3Rpb24gPSBuZXcgQ29udHJvbEFjdGlvbigpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBTZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zIHRvIHRoZSB0b29sIGJhci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgeworCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiZXh0ZXJuYWxkYXRhc291cmNlLXNldHRpbmdzIikpOworCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiZXh0ZXJuYWxkYXRhc291cmNlLWFkZGl0aW9ucyIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgdG8gdGhlIG1lbnUgYmFyIGEgbWVudSBhbmQgc29tZSBzZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zLAorCSAqIGFzIHdlbGwgYXMgdGhlIHN1Yi1tZW51cyBmb3Igb2JqZWN0IGNyZWF0aW9uIGl0ZW1zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudU1hbmFnZXIpOworCisJCUlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yX21lbnUiKSwgIm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2VNZW51SUQiKTsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInNldHRpbmdzIikpOworCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWN0aW9ucyIpKTsKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucy1lbmQiKSk7CisKKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlQ2hpbGQgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgorCQkvLworCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKEV4dGVybmFsRGF0YVNvdXJjZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7CisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcik7CisKKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlU2libGluZyBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCisJCS8vCisJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7CisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsKKworCQkvLyBGb3JjZSBhbiB1cGRhdGUgYmVjYXVzZSBFY2xpcHNlIGhpZGVzIGVtcHR5IG1lbnVzIG5vdy4KKwkJLy8KKwkJc3VibWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyCisJCQkobmV3IElNZW51TGlzdGVuZXIoKSB7CisJCQkJIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJCQkJIG1lbnVNYW5hZ2VyLnVwZGF0ZUFsbCh0cnVlKTsKKwkJCQkgfQorCQkJIH0pOworCisJCWFkZEdsb2JhbEFjdGlvbnMoc3VibWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIFdoZW4gdGhlIGFjdGl2ZSBlZGl0b3IgY2hhbmdlcywgdGhpcyByZW1lbWJlcnMgdGhlIGNoYW5nZSBhbmQgcmVnaXN0ZXJzIHdpdGggaXQgYXMgYSBzZWxlY3Rpb24gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHBhcnQpIHsKKwkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOworCQlhY3RpdmVFZGl0b3JQYXJ0ID0gcGFydDsKKworCQkvLyBTd2l0Y2ggdG8gdGhlIG5ldyBzZWxlY3Rpb24gcHJvdmlkZXIuCisJCS8vCisJCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCX0KKwkJaWYgKHBhcnQgPT0gbnVsbCkgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOworCQl9CisJCWVsc2UgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBwYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOworCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCQkvLyBGYWtlIGEgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgdG8gdXBkYXRlIHRoZSBtZW51cy4KKwkJCS8vCisJCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkgeworCQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfSwKKwkgKiBoYW5kbGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnR9cyBieSBxdWVyeWluZyBmb3IgdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncworCSAqIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZWxlY3RlZCBvYmplY3QgYW5kIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBldmVudCAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJLy8gUmVtb3ZlIGFueSBtZW51IGl0ZW1zIGZvciBvbGQgc2VsZWN0aW9uLgorCQkvLworCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMpOworCQl9CisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucyk7CisJCX0KKworCQkvLyBRdWVyeSB0aGUgbmV3IHNlbGVjdGlvbiBmb3IgYXBwcm9wcmlhdGUgbmV3IGNoaWxkL3NpYmxpbmcgZGVzY3JpcHRvcnMKKwkJLy8KKwkJQ29sbGVjdGlvbjw/PiBuZXdDaGlsZERlc2NyaXB0b3JzID0gbnVsbDsKKwkJQ29sbGVjdGlvbjw/PiBuZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBudWxsOworCisJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7CisJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsKKwkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7CisKKwkJCUVkaXRpbmdEb21haW4gZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKKworCQkJbmV3Q2hpbGREZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgbnVsbCk7CisJCQluZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhudWxsLCBvYmplY3QpOworCQl9CisKKwkJLy8gR2VuZXJhdGUgYWN0aW9ucyBmb3Igc2VsZWN0aW9uOyBwb3B1bGF0ZSBhbmQgcmVkcmF3IHRoZSBtZW51cy4KKwkJLy8KKwkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMobmV3Q2hpbGREZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKKwkJY3JlYXRlU2libGluZ0FjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKG5ld1NpYmxpbmdEZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKKworCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKKwkJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOworCQl9CisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOworCQkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwKKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgeworCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVDaGlsZEFjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYWN0aW9uczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwKKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoQ29sbGVjdGlvbjw/PiBkZXNjcmlwdG9ycywgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJQ29sbGVjdGlvbjxJQWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOworCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgeworCQkJZm9yIChPYmplY3QgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7CisJCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCisJLyoqCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiB3aXRoIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbiwKKwkgKiBieSBpbnNlcnRpbmcgdGhlbSBiZWZvcmUgdGhlIHNwZWNpZmllZCBjb250cmlidXRpb24gaXRlbSA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4uCisJICogSWYgPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGV5IGFyZSBzaW1wbHkgYWRkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248PyBleHRlbmRzIElBY3Rpb24+IGFjdGlvbnMsIFN0cmluZyBjb250cmlidXRpb25JRCkgeworCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKElBY3Rpb24gYWN0aW9uIDogYWN0aW9ucykgeworCQkJCWlmIChjb250cmlidXRpb25JRCAhPSBudWxsKSB7CisJCQkJCW1hbmFnZXIuaW5zZXJ0QmVmb3JlKGNvbnRyaWJ1dGlvbklELCBhY3Rpb24pOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJbWFuYWdlci5hZGQoYWN0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCQorCS8qKgorCSAqIFRoaXMgcmVtb3ZlcyBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gYWxsIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkZXBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zKSB7CisJCWlmIChhY3Rpb25zICE9IG51bGwpIHsKKwkJCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtYW5hZ2VyLmdldEl0ZW1zKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CisJCQkJLy8gTG9vayBpbnRvIFN1YkNvbnRyaWJ1dGlvbkl0ZW1zCisJCQkJLy8KKwkJCQlJQ29udHJpYnV0aW9uSXRlbSBjb250cmlidXRpb25JdGVtID0gaXRlbXNbaV07CisJCQkJd2hpbGUgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBTdWJDb250cmlidXRpb25JdGVtKSB7CisJCQkJCWNvbnRyaWJ1dGlvbkl0ZW0gPSAoKFN1YkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0SW5uZXJJdGVtKCk7CisJCQkJfQorCisJCQkJLy8gRGVsZXRlIHRoZSBBY3Rpb25Db250cmlidXRpb25JdGVtcyB3aXRoIG1hdGNoaW5nIGFjdGlvbi4KKwkJCQkvLworCQkJCWlmIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCQlJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSljb250cmlidXRpb25JdGVtKS5nZXRBY3Rpb24oKTsKKwkJCQkJaWYgKGFjdGlvbnMuY29udGFpbnMoYWN0aW9uKSkgeworCQkJCQkJbWFuYWdlci5yZW1vdmUoY29udHJpYnV0aW9uSXRlbSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgcG9wLXVwIG1lbnUgYmVmb3JlIGl0IGFwcGVhcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQlzdXBlci5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOworCQlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG51bGw7CisKKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsKKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOworCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7CisKKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOworCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW5zZXJ0cyBnbG9iYWwgYWN0aW9ucyBiZWZvcmUgdGhlICJhZGRpdGlvbnMtZW5kIiBzZXBhcmF0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucy1lbmQiLCBuZXcgU2VwYXJhdG9yKCJ1aS1hY3Rpb25zIikpOworCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbik7CisKKwkJcmVmcmVzaFZpZXdlckFjdGlvbi5zZXRFbmFibGVkKHJlZnJlc2hWaWV3ZXJBY3Rpb24uaXNFbmFibGVkKCkpOwkJCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgcmVmcmVzaFZpZXdlckFjdGlvbik7CisKKwkJc3VwZXIuYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogVGhpcyBlbnN1cmVzIHRoYXQgYSBkZWxldGUgYWN0aW9uIHdpbGwgY2xlYW4gdXAgYWxsIHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBvYmplY3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUFsbFJlZmVyZW5jZXNPbkRlbGV0ZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS9wcmVzZW50YXRpb24vRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS9wcmVzZW50YXRpb24vRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMmQ5MWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3ByZXNlbnRhdGlvbi9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw0MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLnByZXNlbnRhdGlvbjsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmRpc2Vhc2Vtb2RlbHByb3BlcnR5ZWRpdG9yLkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZGlzZWFzZW1vZGVscHJvcGVydHllZGl0b3IuRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5EaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworCisvKioKKyAqIAorICogQWRhcHRlciBmb3IgUHJvcGVydHkgRWRpdG9yCisgKgorICovCitwdWJsaWMgY2xhc3MgRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsQWRhcHRlciBleHRlbmRzCisJCURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlciB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IgY3JlYXRlRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IoCisJCQlEaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZSBkaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZSwKKwkJCWludCBzdHlsZSwgTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCkgeworCQlyZXR1cm4gbmV3IEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yKAorCQkJCWRpc2Vhc2VNb2RlbFByb3BlcnR5Q29tcG9zaXRlLCBzdHlsZSwKKwkJCQkoRGlzZWFzZU1vZGVsKSBnZXRUYXJnZXQoKSwgcHJvamVjdFZhbGlkYXRvciwgcHJvamVjdCk7CisJfSAvLyBjcmVhdGVEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcgorCit9IC8vIEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEFkYXB0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvcHJlc2VudGF0aW9uL0V4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3ByZXNlbnRhdGlvbi9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NDFiNDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3ByZXNlbnRhdGlvbi9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvci5qYXZhCkBAIC0wLDAgKzEsMTExIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UucHJlc2VudGF0aW9uOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZGlzZWFzZW1vZGVscHJvcGVydHllZGl0b3IuRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3MuUHJvcGVydHlTdHJpbmdQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLkRpc2Vhc2VXaXphcmRNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IgZXh0ZW5kcworCQlEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvciB7CisJCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqIEBwYXJhbSBkaXNlYXNlTW9kZWwKKwkgKiBAcGFyYW0gcHJvamVjdFZhbGlkYXRvcgorCSAqLworCXB1YmxpYyBFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50LAorCQkJaW50IHN0eWxlLCBEaXNlYXNlTW9kZWwgZGlzZWFzZU1vZGVsLAorCQkJTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcihwYXJlbnQsIHN0eWxlLCBkaXNlYXNlTW9kZWwsIHByb2plY3RWYWxpZGF0b3IsIHByb2plY3QpOworCX0gLy8gRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLlN0YW5kYXJkRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IjcG9wdWxhdGUob3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwb3B1bGF0ZShEaXNlYXNlTW9kZWwgZGlzZWFzZU1vZGVsKSB7CisJCXN1cGVyLnBvcHVsYXRlKGRpc2Vhc2VNb2RlbCk7CisJCQorCQlmb3IgKGZpbmFsIE1hcC5FbnRyeTxFU3RydWN0dXJhbEZlYXR1cmUsIFRleHQ+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpIHsKKwkJCXN3aXRjaCAoZW50cnkuZ2V0S2V5KCkuZ2V0RmVhdHVyZUlEKCkpIHsKKwkJCWNhc2UgRXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZS5FWFRFUk5BTF9EQVRBX1NPVVJDRV9ESVNFQVNFX01PREVMX19EQVRBX1BBVEg6CisJCQkJKChFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWwpIGRpc2Vhc2VNb2RlbCkKKwkJCQkJCS5zZXREYXRhUGF0aChlbnRyeQorCQkJCQkJCQkuZ2V0VmFsdWUoKS5nZXRUZXh0KCkpOworCQkJCWJyZWFrOworCQkJY2FzZSBFeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlLkVYVEVSTkFMX0RBVEFfU09VUkNFX0RJU0VBU0VfTU9ERUxfX0RJU0VBU0VfVFlQRToKKwkJCQkoKEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbCkgZGlzZWFzZU1vZGVsKQorCQkJCQkJLnNldERpc2Vhc2VUeXBlKGVudHJ5CisJCQkJCQkJCS5nZXRWYWx1ZSgpLmdldFRleHQoKSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfSAvLyBzd2l0Y2gKKwkJfSAvLyBmb3IgZWFjaCBNYXAuZW50cnkKKwkJCisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuU3RhbmRhcmREaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvciN2YWxpZGF0ZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci52YWxpZGF0ZSgpOworCQkvLyBEaXNlYXNlIERhdGEgRGlyZWN0b3J5IG9yIEZpbGUKKwkJaWYgKHJldFZhbHVlKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIFRleHQgdGV4dCA9IG1hcAorCQkJCQkuZ2V0KEV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UuTGl0ZXJhbHMuRVhURVJOQUxfREFUQV9TT1VSQ0VfRElTRUFTRV9NT0RFTF9fREFUQV9QQVRIKTsKKwkJCUZpbGUgZiA9IG5ldyBGaWxlKHRleHQuZ2V0VGV4dCgpKTsKKwkJCXJldFZhbHVlID0gZi5leGlzdHMoKTsKKwkJCS8vIGV4aXN0cz8KKwkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkvLyBZZXMKKwkJCQllcnJvck1lc3NhZ2UgPSBEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJORGl6V2l6RXJyMjAiKTsgLy8kTk9OLU5MUy0xJAorCQkJfSAvLyBpZgorCQl9IC8vIGlmCisJCQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfQorCQorfSAvLyBFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS9wcmVzZW50YXRpb24vRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS9wcmVzZW50YXRpb24vRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZjAwOGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3ByZXNlbnRhdGlvbi9FeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLnByZXNlbnRhdGlvbjsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLnV0aWwuRXh0ZXJuYWxEYXRhU291cmNlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5kaXNlYXNlbW9kZWxwcm9wZXJ0eWVkaXRvci5EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5kaXNlYXNlbW9kZWxwcm9wZXJ0eWVkaXRvci5EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5OworCisvKioKKyAqIEBhdXRob3IgamFtZXMKKyAqIAorICovCitwdWJsaWMgY2xhc3MgRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCUV4dGVybmFsRGF0YVNvdXJjZUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMKKwkJRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCS5hZGRBZGFwdGVyRmFjdG9yeSh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlcm5hbERhdGFTb3VyY2VEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEFkYXB0ZXIoKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UudXRpbC5FeHRlcm5hbERhdGFTb3VyY2VBZGFwdGVyRmFjdG9yeSNpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gdHlwZSA9PSBEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuY2xhc3MKKwkJCQl8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOworCX0KK30gLy8gRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS9wcmVzZW50YXRpb24vRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3ByZXNlbnRhdGlvbi9FeHRlcm5hbERhdGFTb3VyY2VFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmYzODlhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS9wcmVzZW50YXRpb24vRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yLmphdmEKQEAgLTAsMCArMSwxODE5IEBACisvLyBFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3IuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuTWFya2VySGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVmlld2VyUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLmVkaXRvci5Qcm9ibGVtRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVmFsaWRhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuY2VsbGVkaXRvci5BZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuTG9jYWxUcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuVmlld2VyRHJhZ0FkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLlVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSU1hcmtlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudmlldy5FeHRlbmRlZFByb3BlcnR5U2hlZXRQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlci5MYWJlbHNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLnByb3ZpZGVyLkV4dGVybmFsRGF0YVNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdGFuZGFyZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNhdmVBc0RpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOworCisKKy8qKgorICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgRXh0ZXJuYWxEYXRhU291cmNlIG1vZGVsIGVkaXRvci4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEV4dGVybmFsRGF0YVNvdXJjZUVkaXRvcgorCWV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydAorCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5Qcm92aWRlciwgSVNlbGVjdGlvblByb3ZpZGVyLCBJTWVudUxpc3RlbmVyLCBJVmlld2VyUHJvdmlkZXIsIElHb3RvTWFya2VyIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBlZGl0aW5nIGRvbWFpbiB0aGF0IGlzIHVzZWQgdG8gdHJhY2sgYWxsIGNoYW5nZXMgdG8gdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG9uZSBhZGFwdGVyIGZhY3RvcnkgdXNlZCBmb3IgcHJvdmlkaW5nIHZpZXdzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQ29udGVudE91dGxpbmVQYWdlIGNvbnRlbnRPdXRsaW5lUGFnZTsKKworCS8qKgorCSAqIFRoaXMgaXMgYSBrbHVkZ2UuLi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVN0YXR1c0xpbmVNYW5hZ2VyIGNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZSdzIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBjb250ZW50T3V0bGluZVZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHByb3BlcnR5IHNoZWV0IHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFByb3BlcnR5U2hlZXRQYWdlIHByb3BlcnR5U2hlZXRQYWdlOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdmlld2VyIHRoYXQgc2hhZG93cyB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb250ZW50IG91dGxpbmUuCisJICogVGhlIHBhcmVudCByZWxhdGlvbiBtdXN0IGJlIGNvcnJlY3RseSBkZWZpbmVkIGZvciB0aGlzIHRvIHdvcmsuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgc2VsZWN0aW9uVmlld2VyOworCisJLyoqCisJICogVGhpcyBpbnZlcnRzIHRoZSByb2xsIG9mIHBhcmVudCBhbmQgY2hpbGQgaW4gdGhlIGNvbnRlbnQgcHJvdmlkZXIgYW5kIHNob3cgcGFyZW50cyBhcyBhIHRyZWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgcGFyZW50Vmlld2VyOworCisJLyoqCisJICogVGhpcyBzaG93cyBob3cgYSB0cmVlIHZpZXcgd29ya3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgc2hvd3MgaG93IGEgbGlzdCB2aWV3IHdvcmtzLgorCSAqIEEgbGlzdCB2aWV3ZXIgZG9lc24ndCBzdXBwb3J0IGljb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBMaXN0Vmlld2VyIGxpc3RWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIHNob3dzIGhvdyBhIHRhYmxlIHZpZXcgd29ya3MuCisJICogQSB0YWJsZSBjYW4gYmUgdXNlZCBhcyBhIGxpc3Qgd2l0aCBpY29ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIHNob3dzIGhvdyBhIHRyZWUgdmlldyB3aXRoIGNvbHVtbnMgd29ya3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcldpdGhDb2x1bW5zOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIHZpZXdlciBwYW5lLCBpbiB0aGUgYm9vay4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVmlld2VyUGFuZSBjdXJyZW50Vmlld2VyUGFuZTsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBjb250ZW50IHZpZXdlciwgd2hpY2ggbWF5IGJlIGVpdGhlciBvbmUgb2YgdGhlIHZpZXdlcnMgaW4gdGhlIHBhZ2VzIG9yIHRoZSBjb250ZW50IG91dGxpbmUgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBWaWV3ZXIgY3VycmVudFZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyB0byB3aGljaCBldmVyIHZpZXdlciBpcyBhY3RpdmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9cyB0aGF0IGFyZSBsaXN0ZW5pbmcgdG8gdGhpcyBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZWRpdG9yIGFzIGEgd2hvbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb24gZWRpdG9yU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKKworCS8qKgorCSAqIFRoZSBNYXJrZXJIZWxwZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHdvcmtzcGFjZSByZXNvdXJjZSBtYXJrZXJzIHByZXNlbnRlZAorCSAqIGluIEVjbGlwc2UncyBQcm9ibGVtcyBWaWV3LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXJrZXJIZWxwZXIgbWFya2VySGVscGVyID0gbmV3IEVkaXRVSU1hcmtlckhlbHBlcigpOworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIGZvciB3aGVuIHRoZSBvdXRsaW5lIGJlY29tZXMgYWN0aXZlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyID0KKwkJbmV3IElQYXJ0TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQlpZiAocCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSB7CisJCQkJCWlmICgoKENvbnRlbnRPdXRsaW5lKXApLmdldEN1cnJlbnRQYWdlKCkgPT0gY29udGVudE91dGxpbmVQYWdlKSB7CisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3IudGhpcyk7CisKKwkJCQkJCXNldEN1cnJlbnRWaWV3ZXIoY29udGVudE91dGxpbmVWaWV3ZXIpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHAgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSB7CisJCQkJCWlmICgoKFByb3BlcnR5U2hlZXQpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBwcm9wZXJ0eVNoZWV0UGFnZSkgeworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yLnRoaXMpOworCQkJCQkJaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChwID09IEV4dGVybmFsRGF0YVNvdXJjZUVkaXRvci50aGlzKSB7CisJCQkJCWhhbmRsZUFjdGl2YXRlKCk7CisJCQkJfQorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCX07CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBzYXZlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gc2F2ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogTWFwIHRvIHN0b3JlIHRoZSBkaWFnbm9zdGljIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+IHJlc291cmNlVG9EaWFnbm9zdGljTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+KCk7CisKKwkvKioKKwkgKiBDb250cm9scyB3aGV0aGVyIHRoZSBwcm9ibGVtIGluZGljYXRpb24gc2hvdWxkIGJlIHVwZGF0ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOworCisJLyoqCisJICogQWRhcHRlciB1c2VkIHRvIHVwZGF0ZSB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHdoZW4gcmVzb3VyY2VzIGFyZSBkZW1hbmRlZCBsb2FkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEVDb250ZW50QWRhcHRlciBwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIgPSAKKwkJbmV3IEVDb250ZW50QWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKKwkJCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJlc291cmNlLmNsYXNzKSkgeworCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEOgorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fRVJST1JTOgorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fV0FSTklOR1M6IHsKKwkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKKwkJCQkJCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgbnVsbCk7CisJCQkJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgZGlhZ25vc3RpYyk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5yZW1vdmUocmVzb3VyY2UpOworCQkJCQkJCX0KKworCQkJCQkJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgeworCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQkJCQkJCQkJCSB9CisJCQkJCQkJCQkgfSk7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCQkJfQorCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsKKwkJCQliYXNpY1NldFRhcmdldCh0YXJnZXQpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHVuc2V0VGFyZ2V0KFJlc291cmNlIHRhcmdldCkgeworCQkJCWJhc2ljVW5zZXRUYXJnZXQodGFyZ2V0KTsKKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyBmb3Igd29ya3NwYWNlIGNoYW5nZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPQorCQluZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQkvLyBPbmx5IGxpc3RlbmluZyB0byB0aGVzZS4KKwkJCQkvLyBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZURlbHRhLlBPU1RfQ0hBTkdFKQorCQkJCXsKKwkJCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOworCQkJCQl0cnkgeworCQkJCQkJY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgeworCQkJCQkJCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKKwkJCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisJCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKwkJCQkJCQkJaWYgKGRlbHRhLmdldEZsYWdzKCkgIT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUyAmJgorCQkJCQkJCQkgICAgZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKKwkJCQkJCQkJCWlmICgoZGVsdGEuZ2V0S2luZCgpICYgKElSZXNvdXJjZURlbHRhLkNIQU5HRUQgfCBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSkgIT0gMCkgeworCQkJCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSShkZWx0YS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLCBmYWxzZSk7CisJCQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKKwkJCQkJCQkJCQkJaWYgKChkZWx0YS5nZXRLaW5kKCkgJiBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSAhPSAwKSB7CisJCQkJCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJZWxzZSBpZiAoIXNhdmVkUmVzb3VyY2VzLnJlbW92ZShyZXNvdXJjZSkpIHsKKwkJCQkJCQkJCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCisJCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJCX0KKworCQkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgeworCQkJCQkJCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlczsKKwkJCQkJCQl9CisKKwkJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsKKwkJCQkJCQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpdG9yKCk7CisJCQkJCQlkZWx0YS5hY2NlcHQodmlzaXRvcik7CisKKwkJCQkJCWlmICghdmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCQkJcmVtb3ZlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkpOworCQkJCQkJCWlmICghaXNEaXJ0eSgpKSB7CisJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCQkJIGdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yLnRoaXMsIGZhbHNlKTsKKwkJCQkJCQkJCQkJIEV4dGVybmFsRGF0YVNvdXJjZUVkaXRvci50aGlzLmRpc3Bvc2UoKTsKKwkJCQkJCQkJCQkgfQorCQkJCQkJCQkJIH0pOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJaWYgKCF2aXNpdG9yLmdldENoYW5nZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7CisJCQkJCQkJaWYgKGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yLnRoaXMpIHsKKwkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJCQkgaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQkJCQkJCQkgfQorCQkJCQkJCQkJIH0pOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCUV4dGVybmFsRGF0YVNvdXJjZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIEhhbmRsZXMgYWN0aXZhdGlvbiBvZiB0aGUgZWRpdG9yIG9yIGl0J3MgYXNzb2NpYXRlZCB2aWV3cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0ZSgpIHsKKwkJLy8gUmVjb21wdXRlIHRoZSByZWFkIG9ubHkgc3RhdGUuCisJCS8vCisJCWlmIChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpICE9IG51bGwpIHsKKwkJICBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpLmNsZWFyKCk7CisKKwkJICAvLyBSZWZyZXNoIGFueSBhY3Rpb25zIHRoYXQgbWF5IGJlY29tZSBlbmFibGVkIG9yIGRpc2FibGVkLgorCQkgIC8vCisJCSAgc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKKwkJfQorCisJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCWlmIChoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpIHsKKwkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKEV4dGVybmFsRGF0YVNvdXJjZUVkaXRvci50aGlzLCBmYWxzZSk7CisJCQkJRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yLnRoaXMuZGlzcG9zZSgpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVtb3ZlZFJlc291cmNlcy5jbGVhcigpOworCQkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgeworCQkJY2hhbmdlZFJlc291cmNlcy5yZW1vdmVBbGwoc2F2ZWRSZXNvdXJjZXMpOworCQkJaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpOworCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOworCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEhhbmRsZXMgd2hhdCB0byBkbyB3aXRoIGNoYW5nZWQgcmVzb3VyY2VzIG9uIGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpIHsKKwkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSAmJiAoIWlzRGlydHkoKSB8fCBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpKSB7CisJCQllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7CisKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgeworCQkJCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKSB7CisJCQkJCXJlc291cmNlLnVubG9hZCgpOworCQkJCQl0cnkgeworCQkJCQkJcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOworCQkJCQl9CisJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCWlmICghcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAuY29udGFpbnNLZXkocmVzb3VyY2UpKSB7CisJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQl9CisJfQorICAKKwkvKioKKwkgKiBVcGRhdGVzIHRoZSBwcm9ibGVtcyBpbmRpY2F0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWVkIGRpYWdub3N0aWMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKSB7CisJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgeworCQkJQmFzaWNEaWFnbm9zdGljIGRpYWdub3N0aWMgPQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMKKwkJCQkJKERpYWdub3N0aWMuT0ssCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5lZGl0b3IiLAorCQkJCQkgMCwKKwkJCQkJIG51bGwsCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpIH0pOworCQkJZm9yIChEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA6IHJlc291cmNlVG9EaWFnbm9zdGljTWFwLnZhbHVlcygpKSB7CisJCQkJaWYgKGNoaWxkRGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJZGlhZ25vc3RpYy5hZGQoY2hpbGREaWFnbm9zdGljKTsKKwkJCQl9CisJCQl9CisKKwkJCWludCBsYXN0RWRpdG9yUGFnZSA9IGdldFBhZ2VDb3VudCgpIC0gMTsKKwkJCWlmIChsYXN0RWRpdG9yUGFnZSA+PSAwICYmIGdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkgaW5zdGFuY2VvZiBQcm9ibGVtRWRpdG9yUGFydCkgeworCQkJCSgoUHJvYmxlbUVkaXRvclBhcnQpZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSkuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQlQcm9ibGVtRWRpdG9yUGFydCBwcm9ibGVtRWRpdG9yUGFydCA9IG5ldyBQcm9ibGVtRWRpdG9yUGFydCgpOworCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7CisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0TWFya2VySGVscGVyKG1hcmtlckhlbHBlcik7CisJCQkJdHJ5IHsKKwkJCQkJYWRkUGFnZSgrK2xhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydCwgZ2V0RWRpdG9ySW5wdXQoKSk7CisJCQkJCXNldFBhZ2VUZXh0KGxhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydC5nZXRQYXJ0TmFtZSgpKTsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJCXNob3dUYWJzKCk7CisJCQkJfQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKworCQkJaWYgKG1hcmtlckhlbHBlci5oYXNNYXJrZXJzKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSkpIHsKKwkJCQltYXJrZXJIZWxwZXIuZGVsZXRlTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQl0cnkgeworCQkJCQkJbWFya2VySGVscGVyLmNyZWF0ZU1hcmtlcnMoZGlhZ25vc3RpYyk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQlFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBTaG93cyBhIGRpYWxvZyB0aGF0IGFza3MgaWYgY29uZmxpY3RpbmcgY2hhbmdlcyBzaG91bGQgYmUgZGlzY2FyZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZURpcnR5Q29uZmxpY3QoKSB7CisJCXJldHVybgorCQkJTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24KKwkJCQkoZ2V0U2l0ZSgpLmdldFNoZWxsKCksCisJCQkJIGdldFN0cmluZygiX1VJX0ZpbGVDb25mbGljdF9sYWJlbCIpLAorCQkJCSBnZXRTdHJpbmcoIl9XQVJOX0ZpbGVDb25mbGljdCIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBtb2RlbCBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4dGVybmFsRGF0YVNvdXJjZUVkaXRvcigpIHsKKwkJc3VwZXIoKTsKKwkJaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdXAgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgbW9kZWwgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFZGl0aW5nRG9tYWluKCkgeworCQkvLyBDcmVhdGUgYW4gYWRhcHRlciBmYWN0b3J5IHRoYXQgeWllbGRzIGl0ZW0gcHJvdmlkZXJzLgorCQkvLworCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkuRGVzY3JpcHRvci5SZWdpc3RyeS5JTlNUQU5DRSk7CisKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBFeHRlcm5hbERhdGFTb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBHcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTGFiZWxzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlIGV4ZWN1dGVkLgorCQkvLworCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKKworCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLgorCQkvLworCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIKKwkJCShuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7CisJCQkJIEBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKKwkJCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGZpbmFsIEV2ZW50T2JqZWN0IGV2ZW50KSB7CisJCQkJCSBnZXRDb250YWluZXIoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkgKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJICBmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7CisKKwkJCQkJCQkJICAvLyBUcnkgdG8gc2VsZWN0IHRoZSBhZmZlY3RlZCBvYmplY3RzLgorCQkJCQkJCQkgIC8vCisJCQkJCQkJCSAgQ29tbWFuZCBtb3N0UmVjZW50Q29tbWFuZCA9ICgoQ29tbWFuZFN0YWNrKWV2ZW50LmdldFNvdXJjZSgpKS5nZXRNb3N0UmVjZW50Q29tbWFuZCgpOworCQkJCQkJCQkgIGlmIChtb3N0UmVjZW50Q29tbWFuZCAhPSBudWxsKSB7CisJCQkJCQkJCQkgIHNldFNlbGVjdGlvblRvVmlld2VyKG1vc3RSZWNlbnRDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpKTsKKwkJCQkJCQkJICB9CisJCQkJCQkJCSAgaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwgJiYgIXByb3BlcnR5U2hlZXRQYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQkJCQkJCSAgcHJvcGVydHlTaGVldFBhZ2UucmVmcmVzaCgpOworCQkJCQkJCQkgIH0KKwkJCQkJCQkgIH0KKwkJCQkJCSAgfSk7CisJCQkJIH0KKwkJCSB9KTsKKworCQkvLyBDcmVhdGUgdGhlIGVkaXRpbmcgZG9tYWluIHdpdGggYSBzcGVjaWFsIGNvbW1hbmQgc3RhY2suCisJCS8vCisJCWVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKGFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2ssIG5ldyBIYXNoTWFwPFJlc291cmNlLCBCb29sZWFuPigpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGhlcmUgZm9yIHRoZSBsaXN0ZW5lciB0byBiZSBhYmxlIHRvIGNhbGwgaXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJCQlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoaW50IGFjdGlvbikgeworCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UoYWN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdGhlIHNlbGVjdGlvbiBpbnRvIHdoaWNoZXZlciB2aWV3ZXIgaXMgYWN0aXZlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIGNvbGxlY3Rpb24gCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgeworCQlmaW5hbCBDb2xsZWN0aW9uPD8+IHRoZVNlbGVjdGlvbiA9IGNvbGxlY3Rpb247CisJCS8vIE1ha2Ugc3VyZSBpdCdzIG9rYXkuCisJCS8vCisJCWlmICh0aGVTZWxlY3Rpb24gIT0gbnVsbCAmJiAhdGhlU2VsZWN0aW9uLmlzRW1wdHkoKSkgeworCQkJLy8gSSBkb24ndCBrbm93IGlmIHRoaXMgc2hvdWxkIGJlIHJ1biB0aGlzIGRlZmVycmVkCisJCQkvLyBiZWNhdXNlIHdlIG1pZ2h0IGhhdmUgdG8gZ2l2ZSB0aGUgZWRpdG9yIGEgY2hhbmNlIHRvIHByb2Nlc3MgdGhlIHZpZXdlciB1cGRhdGUgZXZlbnRzCisJCQkvLyBhbmQgaGVuY2UgdG8gdXBkYXRlIHRoZSB2aWV3cyBmaXJzdC4KKwkJCS8vCisJCQkvLworCQkJUnVubmFibGUgcnVubmFibGUgPQorCQkJCW5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgY29udGVudCB2aWV3ZXIgb2YgdGhlIGVkaXRvci4KKwkJCQkJCS8vCisJCQkJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7CisJCQkJCQkJY3VycmVudFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhlU2VsZWN0aW9uLnRvQXJyYXkoKSksIHRydWUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfTsKKwkJCXJ1bm5hYmxlLnJ1bigpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBlZGl0aW5nIGRvbWFpbiBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElFZGl0aW5nRG9tYWluUHJvdmlkZXJ9IGludGVyZmFjZS4KKwkgKiBUaGlzIGlzIGltcG9ydGFudCBmb3IgaW1wbGVtZW50aW5nIHRoZSBzdGF0aWMgbWV0aG9kcyBvZiB7QGxpbmsgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWlufQorCSAqIGFuZCBmb3Igc3VwcG9ydGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb259LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBlZGl0aW5nRG9tYWluCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7CisJCXJldHVybiBlZGl0aW5nRG9tYWluOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBjbGFzcyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciB7CisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5IAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0IFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE9iamVjdCBbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7CisJCQlyZXR1cm4gKHBhcmVudCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhcmVudCkpLnRvQXJyYXkoKTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiBwYXJlbnQgIT0gbnVsbDsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmlld2VyUGFuZSAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q3VycmVudFZpZXdlclBhbmUoVmlld2VyUGFuZSB2aWV3ZXJQYW5lKSB7CisJCWlmIChjdXJyZW50Vmlld2VyUGFuZSAhPSB2aWV3ZXJQYW5lKSB7CisJCQlpZiAoY3VycmVudFZpZXdlclBhbmUgIT0gbnVsbCkgeworCQkJCWN1cnJlbnRWaWV3ZXJQYW5lLnNob3dGb2N1cyhmYWxzZSk7CisJCQl9CisJCQljdXJyZW50Vmlld2VyUGFuZSA9IHZpZXdlclBhbmU7CisJCX0KKwkJc2V0Q3VycmVudFZpZXdlcihjdXJyZW50Vmlld2VyUGFuZS5nZXRWaWV3ZXIoKSk7CisJfQorCisJLyoqCisJICogVGhpcyBtYWtlcyBzdXJlIHRoYXQgb25lIGNvbnRlbnQgdmlld2VyLCBlaXRoZXIgZm9yIHRoZSBjdXJyZW50IHBhZ2Ugb3IgdGhlIG91dGxpbmUgdmlldywgaWYgaXQgaGFzIGZvY3VzLAorCSAqIGlzIHRoZSBjdXJyZW50IG9uZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2aWV3ZXIgCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRWaWV3ZXIoVmlld2VyIHZpZXdlcikgeworCQkvLyBJZiBpdCBpcyBjaGFuZ2luZy4uLgorCQkvLworCQlpZiAoY3VycmVudFZpZXdlciAhPSB2aWV3ZXIpIHsKKwkJCWlmIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgeworCQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgb24gZGVtYW5kLgorCQkJCS8vCisJCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0KKwkJCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQkJCQkvLyBUaGlzIGp1c3Qgbm90aWZpZXMgdGhvc2UgdGhpbmdzIHRoYXQgYXJlIGFmZmVjdGVkIGJ5IHRoZSBzZWN0aW9uLgorCQkJCQkJLy8KKwkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHNlbGVjdGlvbkNoYW5nZWRFdmVudCkgeworCQkJCQkJCXNldFNlbGVjdGlvbihzZWxlY3Rpb25DaGFuZ2VkRXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQkJfQorCQkJCQl9OworCQkJfQorCisJCQkvLyBTdG9wIGxpc3RlbmluZyB0byB0aGUgb2xkIG9uZS4KKwkJCS8vCisJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7CisJCQkJY3VycmVudFZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKKwkJCX0KKworCQkJLy8gU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXcgb25lLgorCQkJLy8KKwkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgeworCQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKKwkJCX0KKworCQkJLy8gUmVtZW1iZXIgaXQuCisJCQkvLworCQkJY3VycmVudFZpZXdlciA9IHZpZXdlcjsKKworCQkJLy8gU2V0IHRoZSBlZGl0b3JzIHNlbGVjdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCB2aWV3ZXIncyBzZWxlY3Rpb24uCisJCQkvLworCQkJc2V0U2VsZWN0aW9uKGN1cnJlbnRWaWV3ZXIgPT0gbnVsbCA/IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkgOiBjdXJyZW50Vmlld2VyLmdldFNlbGVjdGlvbigpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgdmlld2VyIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSVZpZXdlclByb3ZpZGVyfSBpbnRlcmZhY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGN1cnJlbnRWaWV3ZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7CisJCXJldHVybiBjdXJyZW50Vmlld2VyOworCX0KKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlciBhbmQgYWRkcyBhIGxpc3RlbmVyIGFzIHdlbGwgcmVnaXN0ZXJpbmcgdGhlIG1lbnUgZm9yIGV4dGVuc2lvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgeworCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7CisJCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7CisJCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKKwkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKHRoaXMpOworCQlNZW51IG1lbnU9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOworCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7CisJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGNvbnRleHRNZW51LCBuZXcgVW53cmFwcGluZ1NlbGVjdGlvblByb3ZpZGVyKHZpZXdlcikpOworCisJCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LOworCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07CisJCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKKwkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgY2FsbGVkIHRvIGxvYWQgYSByZXNvdXJjZSBpbnRvIHRoZSBlZGl0aW5nIGRvbWFpbidzIHJlc291cmNlIHNldCBiYXNlZCBvbiB0aGUgZWRpdG9yJ3MgaW5wdXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlTW9kZWwoKSB7CisJCVVSSSByZXNvdXJjZVVSSSA9IEVkaXRVSVV0aWwuZ2V0VVJJKGdldEVkaXRvcklucHV0KCkpOworCQlFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworCQl0cnkgeworCQkJLy8gTG9hZCB0aGUgcmVzb3VyY2UgdGhyb3VnaCB0aGUgZWRpdGluZyBkb21haW4uCisJCQkvLworCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIHRydWUpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZXhjZXB0aW9uID0gZTsKKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCBmYWxzZSk7CisJCX0KKworCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKTsKKwkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsICBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCX0KKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBkaWFnbm9zdGljIGRlc2NyaWJpbmcgdGhlIGVycm9ycyBhbmQgd2FybmluZ3MgbGlzdGVkIGluIHRoZSByZXNvdXJjZQorCSAqIGFuZCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiAoaWYgYW55KS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSByZXNvdXJjZSAKKwkgKiBAcGFyYW0gZXhjZXB0aW9uIAorCSAqIEByZXR1cm4gYSBkaWFnbm9zdGljIGRlc2NyaWJpbmcgZXJyb3JzIGFuZCB3YXJuaW5ncyAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERpYWdub3N0aWMgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMoUmVzb3VyY2UgcmVzb3VyY2UsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJaWYgKCFyZXNvdXJjZS5nZXRFcnJvcnMoKS5pc0VtcHR5KCkgfHwgIXJlc291cmNlLmdldFdhcm5pbmdzKCkuaXNFbXB0eSgpKSB7CisJCQlCYXNpY0RpYWdub3N0aWMgYmFzaWNEaWFnbm9zdGljID0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UuZWRpdG9yIiwKKwkJCQkJIDAsCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZXhjZXB0aW9uID09IG51bGwgPyAoT2JqZWN0KXJlc291cmNlIDogZXhjZXB0aW9uIH0pOworCQkJYmFzaWNEaWFnbm9zdGljLm1lcmdlKEVjb3JlVXRpbC5jb21wdXRlRGlhZ25vc3RpYyhyZXNvdXJjZSwgdHJ1ZSkpOworCQkJcmV0dXJuIGJhc2ljRGlhZ25vc3RpYzsKKwkJfQorCQllbHNlIGlmIChleGNlcHRpb24gIT0gbnVsbCkgeworCQkJcmV0dXJuCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLmVkaXRvciIsCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLAorCQkJCQkgbmV3IE9iamVjdFtdIHsgZXhjZXB0aW9uIH0pOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIERpYWdub3N0aWMuT0tfSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGluc3RhbGwgeW91ciBvd24gY29udHJvbHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3JlYXRlUGFnZXMoKSB7CisJCS8vIENyZWF0ZXMgdGhlIG1vZGVsIGZyb20gdGhlIGVkaXRvciBpbnB1dAorCQkvLworCQljcmVhdGVNb2RlbCgpOworCisJCS8vIE9ubHkgY3JlYXRlcyB0aGUgb3RoZXIgcGFnZXMgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGVkaXRlZAorCQkvLworCQlpZiAoIWdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSAmJgorCQkgICAgIShnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7CisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgc2VsZWN0aW9uIHRyZWUgdmlldy4KKwkJCS8vCisJCQl7CisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yLnRoaXMpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQkJCQkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGNvbXBvc2l0ZSwgU1dULk1VTFRJKTsKKwkJCQkJCQlUcmVlVmlld2VyIG5ld1RyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKKwkJCQkJCQlyZXR1cm4gbmV3VHJlZVZpZXdlcjsKKwkJCQkJCX0KKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7CisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsKKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOworCisJCQkJc2VsZWN0aW9uVmlld2VyID0gKFRyZWVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsKKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCisJCQkJc2VsZWN0aW9uVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCXNlbGVjdGlvblZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCQkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCQkJCXZpZXdlclBhbmUuc2V0VGl0bGUoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKworCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3Ioc2VsZWN0aW9uVmlld2VyLmdldFRyZWUoKSwgYWRhcHRlckZhY3RvcnkpOworCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Ioc2VsZWN0aW9uVmlld2VyKTsKKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7CisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOworCQkJfQorCisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgcGFyZW50IHRyZWUgdmlldy4KKwkJCS8vCisJCQl7CisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yLnRoaXMpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQkJCQkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGNvbXBvc2l0ZSwgU1dULk1VTFRJKTsKKwkJCQkJCQlUcmVlVmlld2VyIG5ld1RyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKKwkJCQkJCQlyZXR1cm4gbmV3VHJlZVZpZXdlcjsKKwkJCQkJCX0KKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7CisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsKKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOworCisJCQkJcGFyZW50Vmlld2VyID0gKFRyZWVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsKKwkJCQlwYXJlbnRWaWV3ZXIuc2V0QXV0b0V4cGFuZExldmVsKDMwKTsKKwkJCQlwYXJlbnRWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQlwYXJlbnRWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisKKwkJCQljcmVhdGVDb250ZXh0TWVudUZvcihwYXJlbnRWaWV3ZXIpOworCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsKKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1BhcmVudFBhZ2VfbGFiZWwiKSk7CisJCQl9CisKKwkJCS8vIFRoaXMgaXMgdGhlIHBhZ2UgZm9yIHRoZSBsaXN0IHZpZXdlcgorCQkJLy8KKwkJCXsKKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3IudGhpcykgeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7CisJCQkJCQkJcmV0dXJuIG5ldyBMaXN0Vmlld2VyKGNvbXBvc2l0ZSk7CisJCQkJCQl9CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgeworCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7CisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7CisJCQkJCQl9CisJCQkJCX07CisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsKKwkJCQlsaXN0Vmlld2VyID0gKExpc3RWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsKKwkJCQlsaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQlsaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IobGlzdFZpZXdlcik7CisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOworCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfTGlzdFBhZ2VfbGFiZWwiKSk7CisJCQl9CisKKwkJCS8vIFRoaXMgaXMgdGhlIHBhZ2UgZm9yIHRoZSB0cmVlIHZpZXdlcgorCQkJLy8KKwkJCXsKKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3IudGhpcykgeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7CisJCQkJCQkJcmV0dXJuIG5ldyBUcmVlVmlld2VyKGNvbXBvc2l0ZSk7CisJCQkJCQl9CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgeworCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7CisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7CisJCQkJCQl9CisJCQkJCX07CisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsKKwkJCQl0cmVlVmlld2VyID0gKFRyZWVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsKKwkJCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCisJCQkJbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcih0cmVlVmlld2VyLmdldFRyZWUoKSwgYWRhcHRlckZhY3RvcnkpOworCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IodHJlZVZpZXdlcik7CisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOworCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfVHJlZVBhZ2VfbGFiZWwiKSk7CisJCQl9CisKKwkJCS8vIFRoaXMgaXMgdGhlIHBhZ2UgZm9yIHRoZSB0YWJsZSB2aWV3ZXIuCisJCQkvLworCQkJeworCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9CisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIEV4dGVybmFsRGF0YVNvdXJjZUVkaXRvci50aGlzKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKwkJCQkJCQlyZXR1cm4gbmV3IFRhYmxlVmlld2VyKGNvbXBvc2l0ZSk7CisJCQkJCQl9CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgeworCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7CisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7CisJCQkJCQl9CisJCQkJCX07CisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsKKwkJCQl0YWJsZVZpZXdlciA9IChUYWJsZVZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOworCisJCQkJVGFibGUgdGFibGUgPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpOworCQkJCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOworCQkJCXRhYmxlLnNldExheW91dChsYXlvdXQpOworCQkJCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7CisJCQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOworCisJCQkJVGFibGVDb2x1bW4gb2JqZWN0Q29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7CisJCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMywgMTAwLCB0cnVlKSk7CisJCQkJb2JqZWN0Q29sdW1uLnNldFRleHQoZ2V0U3RyaW5nKCJfVUlfT2JqZWN0Q29sdW1uX2xhYmVsIikpOworCQkJCW9iamVjdENvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7CisKKwkJCQlUYWJsZUNvbHVtbiBzZWxmQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7CisJCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMiwgMTAwLCB0cnVlKSk7CisJCQkJc2VsZkNvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX1NlbGZDb2x1bW5fbGFiZWwiKSk7CisJCQkJc2VsZkNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7CisKKwkJCQl0YWJsZVZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKG5ldyBTdHJpbmcgW10geyJhIiwgImIifSk7CisJCQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IodGFibGVWaWV3ZXIpOworCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsKKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1RhYmxlUGFnZV9sYWJlbCIpKTsKKwkJCX0KKworCQkJLy8gVGhpcyBpcyB0aGUgcGFnZSBmb3IgdGhlIHRhYmxlIHRyZWUgdmlld2VyLgorCQkJLy8KKwkJCXsKKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3IudGhpcykgeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7CisJCQkJCQkJcmV0dXJuIG5ldyBUcmVlVmlld2VyKGNvbXBvc2l0ZSk7CisJCQkJCQl9CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgeworCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7CisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7CisJCQkJCQl9CisJCQkJCX07CisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsKKworCQkJCXRyZWVWaWV3ZXJXaXRoQ29sdW1ucyA9IChUcmVlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7CisKKwkJCQlUcmVlIHRyZWUgPSB0cmVlVmlld2VyV2l0aENvbHVtbnMuZ2V0VHJlZSgpOworCQkJCXRyZWUuc2V0TGF5b3V0RGF0YShuZXcgRmlsbExheW91dCgpKTsKKwkJCQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7CisJCQkJdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7CisKKwkJCQlUcmVlQ29sdW1uIG9iamVjdENvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKKwkJCQlvYmplY3RDb2x1bW4uc2V0VGV4dChnZXRTdHJpbmcoIl9VSV9PYmplY3RDb2x1bW5fbGFiZWwiKSk7CisJCQkJb2JqZWN0Q29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKKwkJCQlvYmplY3RDb2x1bW4uc2V0V2lkdGgoMjUwKTsKKworCQkJCVRyZWVDb2x1bW4gc2VsZkNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKKwkJCQlzZWxmQ29sdW1uLnNldFRleHQoZ2V0U3RyaW5nKCJfVUlfU2VsZkNvbHVtbl9sYWJlbCIpKTsKKwkJCQlzZWxmQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKKwkJCQlzZWxmQ29sdW1uLnNldFdpZHRoKDIwMCk7CisKKwkJCQl0cmVlVmlld2VyV2l0aENvbHVtbnMuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nIFtdIHsiYSIsICJiIn0pOworCQkJCXRyZWVWaWV3ZXJXaXRoQ29sdW1ucy5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJdHJlZVZpZXdlcldpdGhDb2x1bW5zLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IodHJlZVZpZXdlcldpdGhDb2x1bW5zKTsKKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7CisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9UcmVlV2l0aENvbHVtbnNQYWdlX2xhYmVsIikpOworCQkJfQorCisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJIEBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJIHNldEFjdGl2ZVBhZ2UoMCk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJLy8gRW5zdXJlcyB0aGF0IHRoaXMgZWRpdG9yIHdpbGwgb25seSBkaXNwbGF5IHRoZSBwYWdlJ3MgdGFiCisJCS8vIGFyZWEgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgcGFnZQorCQkvLworCQlnZXRDb250YWluZXIoKS5hZGRDb250cm9sTGlzdGVuZXIKKwkJCShuZXcgQ29udHJvbEFkYXB0ZXIoKSB7CisJCQkJYm9vbGVhbiBndWFyZCA9IGZhbHNlOworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBldmVudCkgeworCQkJCQlpZiAoIWd1YXJkKSB7CisJCQkJCQlndWFyZCA9IHRydWU7CisJCQkJCQloaWRlVGFicygpOworCQkJCQkJZ3VhcmQgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCSB9KTsKKworCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQkJCSB9CisJCQkgfSk7CisJfQorCisJLyoqCisJICogSWYgdGhlcmUgaXMganVzdCBvbmUgcGFnZSBpbiB0aGUgbXVsdGktcGFnZSBlZGl0b3IgcGFydCwKKwkgKiB0aGlzIGhpZGVzIHRoZSBzaW5nbGUgdGFiIGF0IHRoZSBib3R0b20uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGlkZVRhYnMoKSB7CisJCWlmIChnZXRQYWdlQ291bnQoKSA8PSAxKSB7CisJCQlzZXRQYWdlVGV4dCgwLCAiIik7CisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7CisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoMSk7CisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7CisJCQkJZ2V0Q29udGFpbmVyKCkuc2V0U2l6ZShwb2ludC54LCBwb2ludC55ICsgNik7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsCisJICogdGhpcyBzaG93cyB0aGUgdGFicyBhdCB0aGUgYm90dG9tLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNob3dUYWJzKCkgeworCQlpZiAoZ2V0UGFnZUNvdW50KCkgPiAxKSB7CisJCQlzZXRQYWdlVGV4dCgwLCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOworCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgeworCQkJCSgoQ1RhYkZvbGRlcilnZXRDb250YWluZXIoKSkuc2V0VGFiSGVpZ2h0KFNXVC5ERUZBVUxUKTsKKwkJCQlQb2ludCBwb2ludCA9IGdldENvbnRhaW5lcigpLmdldFNpemUoKTsKKwkJCQlnZXRDb250YWluZXIoKS5zZXRTaXplKHBvaW50LngsIHBvaW50LnkgLSA2KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdXNlZCB0byB0cmFjayB0aGUgYWN0aXZlIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBwYWdlSW5kZXgpIHsKKwkJc3VwZXIucGFnZUNoYW5nZShwYWdlSW5kZXgpOworCisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgIT0gbnVsbCkgeworCQkJaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oY29udGVudE91dGxpbmVQYWdlLmdldFNlbGVjdGlvbigpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgaG93IHRoZSBmcmFtZXdvcmsgZGV0ZXJtaW5lcyB3aGljaCBpbnRlcmZhY2VzIHdlIGltcGxlbWVudC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7CisJCWlmIChrZXkuZXF1YWxzKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gc2hvd091dGxpbmVWaWV3KCkgPyBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSA6IG51bGw7CisJCX0KKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gZ2V0UHJvcGVydHlTaGVldFBhZ2UoKTsKKwkJfQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IG91dGxpbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IG91dGxpbmVyLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSUNvbnRlbnRPdXRsaW5lUGFnZSBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSB7CisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgPT0gbnVsbCkgeworCQkJLy8gVGhlIGNvbnRlbnQgb3V0bGluZSBpcyBqdXN0IGEgdHJlZS4KKwkJCS8vCisJCQljbGFzcyBNeUNvbnRlbnRPdXRsaW5lUGFnZSBleHRlbmRzIENvbnRlbnRPdXRsaW5lUGFnZSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCQkJCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKworCQkJCQkvLyBTZXQgdXAgdGhlIHRyZWUgdmlld2VyLgorCQkJCQkvLworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCisJCQkJCS8vIE1ha2Ugc3VyZSBvdXIgcG9wdXBzIHdvcmsuCisJCQkJCS8vCisJCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKGNvbnRlbnRPdXRsaW5lVmlld2VyKTsKKworCQkJCQlpZiAoIWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCQkJICAvLyBTZWxlY3QgdGhlIHJvb3Qgb2JqZWN0IGluIHRoZSB2aWV3LgorCQkJCQkgIC8vCisJCQkJCSAgY29udGVudE91dGxpbmVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIG1ha2VDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwgSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLCBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsKKwkJCQkJc3VwZXIubWFrZUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLCBzdGF0dXNMaW5lTWFuYWdlcik7CisJCQkJCWNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXIgPSBzdGF0dXNMaW5lTWFuYWdlcjsKKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKKwkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKKwkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7CisJCQkJfQorCQkJfQorCisJCQljb250ZW50T3V0bGluZVBhZ2UgPSBuZXcgTXlDb250ZW50T3V0bGluZVBhZ2UoKTsKKworCQkJLy8gTGlzdGVuIHRvIHNlbGVjdGlvbiBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgaXQgaXMgYSBzcGVjaWFsIHdheS4KKwkJCS8vCisJCQljb250ZW50T3V0bGluZVBhZ2UuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCisJCQkJKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJCQkgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2UgaGFuZGxlIHNlbGVjdGlvbnMgY29ycmVjdGx5LgorCQkJCQkgLy8KKwkJCQkJIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJCQkgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQkgfQorCQkJCSB9KTsKKwkJfQorCisJCXJldHVybiBjb250ZW50T3V0bGluZVBhZ2U7CisJfQorCisJLyoqCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBwcm9wZXJ0eSBzaGVldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUgcHJvcGVydHkgc2hlZXQuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7CisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZSA9CisJCQkJbmV3IEV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2UoZWRpdGluZ0RvbWFpbikgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoTGlzdDw/PiBzZWxlY3Rpb24pIHsKKwkJCQkJCUV4dGVybmFsRGF0YVNvdXJjZUVkaXRvci50aGlzLnNldFNlbGVjdGlvblRvVmlld2VyKHNlbGVjdGlvbik7CisJCQkJCQlFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3IudGhpcy5zZXRGb2N1cygpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworCQkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOworCQkJCQl9CisJCQkJfTsKKwkJCXByb3BlcnR5U2hlZXRQYWdlLnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCX0KKworCQlyZXR1cm4gcHJvcGVydHlTaGVldFBhZ2U7CisJfQorCisJLyoqCisJICogVGhpcyBkZWFscyB3aXRoIGhvdyB3ZSB3YW50IHNlbGVjdGlvbiBpbiB0aGUgb3V0bGluZXIgdG8gYWZmZWN0IHRoZSBvdGhlciB2aWV3cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBzZWxlY3Rpb24gCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWlmIChjdXJyZW50Vmlld2VyUGFuZSAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQlJdGVyYXRvcjw/PiBzZWxlY3RlZEVsZW1lbnRzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLml0ZXJhdG9yKCk7CisJCQlpZiAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsKKwkJCQkvLyBHZXQgdGhlIGZpcnN0IHNlbGVjdGVkIGVsZW1lbnQuCisJCQkJLy8KKwkJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCk7CisKKwkJCQkvLyBJZiBpdCdzIHRoZSBzZWxlY3Rpb24gdmlld2VyLCB0aGVuIHdlIHdhbnQgaXQgdG8gc2VsZWN0IHRoZSBzYW1lIHNlbGVjdGlvbiBhcyB0aGlzIHNlbGVjdGlvbi4KKwkJCQkvLworCQkJCWlmIChjdXJyZW50Vmlld2VyUGFuZS5nZXRWaWV3ZXIoKSA9PSBzZWxlY3Rpb25WaWV3ZXIpIHsKKwkJCQkJQXJyYXlMaXN0PE9iamVjdD4gc2VsZWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCQkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnQpOworCQkJCQl3aGlsZSAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsKKwkJCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudHMubmV4dCgpKTsKKwkJCQkJfQorCisJCQkJCS8vIFNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSB3aWRnZXQuCisJCQkJCS8vCisJCQkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uTGlzdCkpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJLy8gU2V0IHRoZSBpbnB1dCB0byB0aGUgd2lkZ2V0LgorCQkJCQkvLworCQkJCQlpZiAoY3VycmVudFZpZXdlclBhbmUuZ2V0Vmlld2VyKCkuZ2V0SW5wdXQoKSAhPSBzZWxlY3RlZEVsZW1lbnQpIHsKKwkJCQkJCWN1cnJlbnRWaWV3ZXJQYW5lLmdldFZpZXdlcigpLnNldElucHV0KHNlbGVjdGVkRWxlbWVudCk7CisJCQkJCQljdXJyZW50Vmlld2VyUGFuZS5zZXRUaXRsZShzZWxlY3RlZEVsZW1lbnQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSB0ZXN0cyB0aGUgY29tbWFuZCBzdGFjay4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgeworCQlyZXR1cm4gKChCYXNpY0NvbW1hbmRTdGFjayllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5pc1NhdmVOZWVkZWQoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHNhdmVzIHRoZSBtb2RlbCBmaWxlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworCQkvLyBTYXZlIG9ubHkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBhY3R1YWxseSBjaGFuZ2VkLgorCQkvLworCQlmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7CisJCXNhdmVPcHRpb25zLnB1dChSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRUQsIFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRF9NRU1PUllfQlVGRkVSKTsKKworCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guCisJCS8vCisJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPQorCQkJbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKKwkJCQkvLyBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBnZXRzIGludm9rZWQgd2hlbiB0aGUgb3BlcmF0aW9uIHJ1bnMuCisJCQkJLy8KKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJCQkvLyBTYXZlIHRoZSByZXNvdXJjZXMgdG8gdGhlIGZpbGUgc3lzdGVtLgorCQkJCQkvLworCQkJCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwkJCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSkgeworCQkJCQkJaWYgKChmaXJzdCB8fCAhcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkgfHwgaXNQZXJzaXN0ZWQocmVzb3VyY2UpKSAmJiAhZWRpdGluZ0RvbWFpbi5pc1JlYWRPbmx5KHJlc291cmNlKSkgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCXJlc291cmNlLnNhdmUoc2F2ZU9wdGlvbnMpOworCQkJCQkJCX0KKwkJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJCQkJCQl9CisJCQkJCQkJZmlyc3QgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX07CisKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCS8vIFRoaXMgcnVucyB0aGUgb3B0aW9ucywgYW5kIHNob3dzIHByb2dyZXNzLgorCQkJLy8KKwkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpLnJ1bih0cnVlLCBmYWxzZSwgb3BlcmF0aW9uKTsKKworCQkJLy8gUmVmcmVzaCB0aGUgbmVjZXNzYXJ5IHN0YXRlLgorCQkJLy8KKwkJCSgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuc2F2ZUlzRG9uZSgpOworCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZyB0aGF0IHNob3VsZG4ndC4KKwkJCS8vCisJCQlFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOworCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB3aGV0aGVyIHNvbWV0aGluZyBoYXMgYmVlbiBwZXJzaXN0ZWQgdG8gdGhlIFVSSSBvZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBVUkkgY29udmVydGVyIGZyb20gdGhlIGVkaXRvcidzIHJlc291cmNlIHNldCB0byB0cnkgdG8gb3BlbiBhbiBpbnB1dCBzdHJlYW0uIAorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzUGVyc2lzdGVkKFJlc291cmNlIHJlc291cmNlKSB7CisJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisJCXRyeSB7CisJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0ocmVzb3VyY2UuZ2V0VVJJKCkpOworCQkJaWYgKHN0cmVhbSAhPSBudWxsKSB7CisJCQkJcmVzdWx0ID0gdHJ1ZTsKKwkJCQlzdHJlYW0uY2xvc2UoKTsKKwkJCX0KKwkJfQorCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gSWdub3JlCisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIHRydWUgYmVjYXVzZSBpdCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFRoaXMgYWxzbyBjaGFuZ2VzIHRoZSBlZGl0b3IncyBpbnB1dC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKKwkJU2F2ZUFzRGlhbG9nIHNhdmVBc0RpYWxvZyA9IG5ldyBTYXZlQXNEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOworCQlzYXZlQXNEaWFsb2cub3BlbigpOworCQlJUGF0aCBwYXRoID0gc2F2ZUFzRGlhbG9nLmdldFJlc3VsdCgpOworCQlpZiAocGF0aCAhPSBudWxsKSB7CisJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOworCQkJaWYgKGZpbGUgIT0gbnVsbCkgeworCQkJCWRvU2F2ZUFzKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKSwgbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVBcyhVUkkgdXJpLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKKwkJKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLnNldFVSSSh1cmkpOworCQlzZXRJbnB1dFdpdGhOb3RpZnkoZWRpdG9ySW5wdXQpOworCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOworCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9CisJCQlnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSAhPSBudWxsID8KKwkJCQlnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5nZXRQcm9ncmVzc01vbml0b3IoKSA6CisJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKKwkJZG9TYXZlKHByb2dyZXNzTW9uaXRvcik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gbWFya2VyIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7CisJCXRyeSB7CisJCQlpZiAobWFya2VyLmdldFR5cGUoKS5lcXVhbHMoRVZhbGlkYXRvci5NQVJLRVIpKSB7CisJCQkJU3RyaW5nIHVyaUF0dHJpYnV0ZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoRVZhbGlkYXRvci5VUklfQVRUUklCVVRFLCBudWxsKTsKKwkJCQlpZiAodXJpQXR0cmlidXRlICE9IG51bGwpIHsKKwkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpQXR0cmlidXRlKTsKKwkJCQkJRU9iamVjdCBlT2JqZWN0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldEVPYmplY3QodXJpLCB0cnVlKTsKKwkJCQkJaWYgKGVPYmplY3QgIT0gbnVsbCkgeworCQkJCQkgIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zLnNpbmdsZXRvbihlZGl0aW5nRG9tYWluLmdldFdyYXBwZXIoZU9iamVjdCkpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCUV4dGVybmFsRGF0YVNvdXJjZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBzdGFydHVwLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisJCXNldFNpdGUoc2l0ZSk7CisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7CisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7CisJCXNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7CisJCXNpdGUuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCWlmIChjdXJyZW50Vmlld2VyUGFuZSAhPSBudWxsKSB7CisJCQljdXJyZW50Vmlld2VyUGFuZS5zZXRGb2N1cygpOworCQl9CisJCWVsc2UgeworCQkJZ2V0Q29udHJvbChnZXRBY3RpdmVQYWdlKCkpLnNldEZvY3VzKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBsaXN0ZW5lciAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIGxpc3RlbmVyIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gcmV0dXJuIHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGVkaXRvclNlbGVjdGlvbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7CisJCXJldHVybiBlZGl0b3JTZWxlY3Rpb247CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gc2V0IHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCisJICogQ2FsbGluZyB0aGlzIHJlc3VsdCB3aWxsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHNlbGVjdGlvbiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWVkaXRvclNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKworCQlmb3IgKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgOiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzKSB7CisJCQlsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7CisJCX0KKwkJc2V0U3RhdHVzTGluZU1hbmFnZXIoc2VsZWN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBzZWxlY3Rpb24gCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0YXR1c0xpbmVNYW5hZ2VyKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciA9IGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCAmJiBjdXJyZW50Vmlld2VyID09IGNvbnRlbnRPdXRsaW5lVmlld2VyID8KKwkJCWNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXIgOiBnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKKworCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgeworCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnRvTGlzdCgpOworCQkJCXN3aXRjaCAoY29sbGVjdGlvbi5zaXplKCkpIHsKKwkJCQkJY2FzZSAwOiB7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX05vT2JqZWN0U2VsZWN0ZWQiKSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIDE6IHsKKwkJCQkJCVN0cmluZyB0ZXh0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcihhZGFwdGVyRmFjdG9yeSkuZ2V0VGV4dChjb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQiLCB0ZXh0KSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlkZWZhdWx0OiB7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQiLCBJbnRlZ2VyLnRvU3RyaW5nKGNvbGxlY3Rpb24uc2l6ZSgpKSkpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKCIiKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gdGhlIHBsdWdpbidzIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7CisJCXJldHVybiBFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSk7CisJfQorCisJLyoqCisJICogVGhpcyBsb29rcyB1cCBhIHN0cmluZyBpbiBwbHVnaW4ucHJvcGVydGllcywgbWFraW5nIGEgc3Vic3RpdHV0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxKSB7CisJCXJldHVybiBFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSwgbmV3IE9iamVjdCBbXSB7IHMxIH0pOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXJ9IHRvIGhlbHAgZmlsbCB0aGUgY29udGV4dCBtZW51cyB3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgRWRpdCBtZW51LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG1lbnVNYW5hZ2VyIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCSgoSU1lbnVMaXN0ZW5lcilnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSkubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYWN0aW9uQmFyQ29udHJpYnV0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpIHsKKwkJcmV0dXJuIChFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBhY3Rpb25CYXJzCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgeworCQlyZXR1cm4gZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3Rpb25CYXJzKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZhY3RvcnkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKKworCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworCisJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKKworCQlpZiAoZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSB0aGlzKSB7CisJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihudWxsKTsKKwkJfQorCisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBvdXRsaW5lIHZpZXcgc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93T3V0bGluZVZpZXcoKSB7CisJCXJldHVybiB0cnVlOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvcHJlc2VudGF0aW9uL0V4dGVybmFsRGF0YVNvdXJjZUVkaXRvclBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS9wcmVzZW50YXRpb24vRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlNzU4NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvcHJlc2VudGF0aW9uL0V4dGVybmFsRGF0YVNvdXJjZUVkaXRvclBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvLyBFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3JQbHVnaW4uamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLkVjbGlwc2VVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMucHJvdmlkZXIuRGVmaW5pdGlvbnNFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5EaXNlYXNlbW9kZWxzRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBjZW50cmFsIHNpbmdsZXRvbiBmb3IgdGhlIEV4dGVybmFsRGF0YVNvdXJjZSBlZGl0b3IgcGx1Z2luLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yUGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIHsKKwkvKioKKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3JQbHVnaW4gSU5TVEFOQ0UgPSBuZXcgRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yUGx1Z2luKCk7CisJCisJLyoqCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3JQbHVnaW4oKSB7CisJCXN1cGVyCisJCQkobmV3IFJlc291cmNlTG9jYXRvciBbXSB7CisJCQkJRGlzZWFzZW1vZGVsc0VkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCQkJQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCQkJRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkJfSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKwkKKwkvKioKKwkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlBsdWdpbjwvYj4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4geworCQkvKioKKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQgTk9UCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOworCisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgorCQkJLy8KKwkJCXBsdWdpbiA9IHRoaXM7CisJCX0KKworCQkvKioKKwkJICogCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCQkJbmV3IEV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkoKTsKKwkJfQorCisJCS8qKgorCQkgKiAKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlzdXBlci5zdG9wKGNvbnRleHQpOworCQl9CisKKwkJCisJCQorCX0gLy8gSW1wbGVtZW50YXRpb24KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS9wcmVzZW50YXRpb24vRXh0ZXJuYWxEYXRhU291cmNlTW9kZWxXaXphcmQuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvcHJlc2VudGF0aW9uL0V4dGVybmFsRGF0YVNvdXJjZU1vZGVsV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyYTg1YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvcHJlc2VudGF0aW9uL0V4dGVybmFsRGF0YVNvdXJjZU1vZGVsV2l6YXJkLmphdmEKQEAgLTAsMCArMSw2MDMgQEAKKy8vIEV4dGVybmFsRGF0YVNvdXJjZU1vZGVsV2l6YXJkLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLkV4dGVybmFsRGF0YVNvdXJjZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5FeHRlcm5hbERhdGFTb3VyY2VQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UucHJvdmlkZXIuRXh0ZXJuYWxEYXRhU291cmNlRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNldFNlbGVjdGlvblRhcmdldDsKKworLyoqCisgKiBUaGlzIGlzIGEgc2ltcGxlIHdpemFyZCBmb3IgY3JlYXRpbmcgYSBuZXcgbW9kZWwgZmlsZS4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEV4dGVybmFsRGF0YVNvdXJjZU1vZGVsV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7CisJLyoqCisJICogVGhpcyBjYWNoZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UgZXh0ZXJuYWxEYXRhU291cmNlUGFja2FnZSA9IEV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UuZUlOU1RBTkNFOworCisJLyoqCisJICogVGhpcyBjYWNoZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEV4dGVybmFsRGF0YVNvdXJjZUZhY3RvcnkgZXh0ZXJuYWxEYXRhU291cmNlRmFjdG9yeSA9IGV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UuZ2V0RXh0ZXJuYWxEYXRhU291cmNlRmFjdG9yeSgpOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgZmlsZSBjcmVhdGlvbiBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBFeHRlcm5hbERhdGFTb3VyY2VNb2RlbFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgbmV3RmlsZUNyZWF0aW9uUGFnZTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGluaXRpYWwgb2JqZWN0IGNyZWF0aW9uIHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEV4dGVybmFsRGF0YVNvdXJjZU1vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSBpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlOworCisJLyoqCisJICogUmVtZW1iZXIgdGhlIHNlbGVjdGlvbiBkdXJpbmcgaW5pdGlhbGl6YXRpb24gZm9yIHBvcHVsYXRpbmcgdGhlIGRlZmF1bHQgY29udGFpbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247CisKKwkvKioKKwkgKiBSZW1lbWJlciB0aGUgd29ya2JlbmNoIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVdvcmtiZW5jaCB3b3JrYmVuY2g7CisKKwkvKioKKwkgKiBDYWNoZXMgdGhlIG5hbWVzIG9mIHRoZSB0eXBlcyB0aGF0IGNhbiBiZSBjcmVhdGVkIGFzIHRoZSByb290IG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGluaXRpYWxPYmplY3ROYW1lczsKKworCS8qKgorCSAqIFRoaXMganVzdCByZWNvcmRzIHRoZSBpbmZvcm1hdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB3b3JrYmVuY2ggCisJICogQHBhcmFtIHNlbGVjdGlvbiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCXRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOworCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKwkJc2V0V2luZG93VGl0bGUoRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1dpemFyZF9sYWJlbCIpKTsKKwkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LklOU1RBTkNFLmdldEltYWdlRGVzY3JpcHRvcihFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvd2l6YmFuL05ld0V4dGVybmFsRGF0YVNvdXJjZSIpKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIHR5cGVzIHRoYXQgY2FuIGJlIGNyZWF0ZWQgYXMgdGhlIHJvb3Qgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0SW5pdGlhbE9iamVjdE5hbWVzKCkgeworCQlpZiAoaW5pdGlhbE9iamVjdE5hbWVzID09IG51bGwpIHsKKwkJCWluaXRpYWxPYmplY3ROYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJZm9yIChFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA6IGV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UuZ2V0RUNsYXNzaWZpZXJzKCkpIHsKKwkJCQlpZiAoZUNsYXNzaWZpZXIgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKKwkJCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpZUNsYXNzaWZpZXI7CisJCQkJCWlmICghZUNsYXNzLmlzQWJzdHJhY3QoKSkgeworCQkJCQkJaW5pdGlhbE9iamVjdE5hbWVzLmFkZChlQ2xhc3MuZ2V0TmFtZSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCUNvbGxlY3Rpb25zLnNvcnQoaW5pdGlhbE9iamVjdE5hbWVzLCBDb21tb25QbHVnaW4uSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpKTsKKwkJfQorCQlyZXR1cm4gaW5pdGlhbE9iamVjdE5hbWVzOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRU9iamVjdCBjcmVhdGVJbml0aWFsTW9kZWwoKSB7CisJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKWV4dGVybmFsRGF0YVNvdXJjZVBhY2thZ2UuZ2V0RUNsYXNzaWZpZXIoaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5nZXRJbml0aWFsT2JqZWN0TmFtZSgpKTsKKwkJRU9iamVjdCByb290T2JqZWN0ID0gZXh0ZXJuYWxEYXRhU291cmNlRmFjdG9yeS5jcmVhdGUoZUNsYXNzKTsKKwkJcmV0dXJuIHJvb3RPYmplY3Q7CisJfQorCisJLyoqCisJICogRG8gdGhlIHdvcmsgYWZ0ZXIgZXZlcnl0aGluZyBpcyBzcGVjaWZpZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKKwkJdHJ5IHsKKwkJCS8vIFJlbWVtYmVyIHRoZSBmaWxlLgorCQkJLy8KKwkJCWZpbmFsIElGaWxlIG1vZGVsRmlsZSA9IGdldE1vZGVsRmlsZSgpOworCisJCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uLgorCQkJLy8KKwkJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPQorCQkJCW5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCS8vIENyZWF0ZSBhIHJlc291cmNlIHNldAorCQkJCQkJCS8vCisJCQkJCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7CisKKwkJCQkJCQkvLyBHZXQgdGhlIFVSSSBvZiB0aGUgbW9kZWwgZmlsZS4KKwkJCQkJCQkvLworCQkJCQkJCVVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkobW9kZWxGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSk7CisKKwkJCQkJCQkvLyBDcmVhdGUgYSByZXNvdXJjZSBmb3IgdGhpcyBmaWxlLgorCQkJCQkJCS8vCisJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShmaWxlVVJJKTsKKworCQkJCQkJCS8vIEFkZCB0aGUgaW5pdGlhbCBtb2RlbCBvYmplY3QgdG8gdGhlIGNvbnRlbnRzLgorCQkJCQkJCS8vCisJCQkJCQkJRU9iamVjdCByb290T2JqZWN0ID0gY3JlYXRlSW5pdGlhbE1vZGVsKCk7CisJCQkJCQkJaWYgKHJvb3RPYmplY3QgIT0gbnVsbCkgeworCQkJCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChyb290T2JqZWN0KTsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgcmVzb3VyY2UgdG8gdGhlIGZpbGUgc3lzdGVtLgorCQkJCQkJCS8vCisJCQkJCQkJTWFwPE9iamVjdCwgT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7CisJCQkJCQkJb3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCBpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlLmdldEVuY29kaW5nKCkpOworCQkJCQkJCXJlc291cmNlLnNhdmUob3B0aW9ucyk7CisJCQkJCQl9CisJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJCUV4dGVybmFsRGF0YVNvdXJjZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQkJCX0KKwkJCQkJCWZpbmFsbHkgeworCQkJCQkJCXByb2dyZXNzTW9uaXRvci5kb25lKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9OworCisJCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIGZhbHNlLCBvcGVyYXRpb24pOworCisJCQkvLyBTZWxlY3QgdGhlIG5ldyBmaWxlIHJlc291cmNlIGluIHRoZSBjdXJyZW50IHZpZXcuCisJCQkvLworCQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7CisJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKKwkJCWZpbmFsIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBwYWdlLmdldEFjdGl2ZVBhcnQoKTsKKwkJCWlmIChhY3RpdmVQYXJ0IGluc3RhbmNlb2YgSVNldFNlbGVjdGlvblRhcmdldCkgeworCQkJCWZpbmFsIElTZWxlY3Rpb24gdGFyZ2V0U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obW9kZWxGaWxlKTsKKwkJCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJICgoSVNldFNlbGVjdGlvblRhcmdldClhY3RpdmVQYXJ0KS5zZWxlY3RSZXZlYWwodGFyZ2V0U2VsZWN0aW9uKTsKKwkJCQkJCSB9CisJCQkJCSB9KTsKKwkJCX0KKworCQkJLy8gT3BlbiBhbiBlZGl0b3Igb24gdGhlIG5ldyBmaWxlLgorCQkJLy8KKwkJCXRyeSB7CisJCQkJcGFnZS5vcGVuRWRpdG9yCisJCQkJCShuZXcgRmlsZUVkaXRvcklucHV0KG1vZGVsRmlsZSksCisJCQkJCSB3b3JrYmVuY2guZ2V0RWRpdG9yUmVnaXN0cnkoKS5nZXREZWZhdWx0RWRpdG9yKG1vZGVsRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLmdldElkKCkpOworCQkJfQorCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHdvcmtiZW5jaFdpbmRvdy5nZXRTaGVsbCgpLCBFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsIiksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCUV4dGVybmFsRGF0YVNvdXJjZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG9uZSBwYWdlIG9mIHRoZSB3aXphcmQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGNsYXNzIEV4dGVybmFsRGF0YVNvdXJjZU1vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgeworCQkvKioKKwkJICogUGFzcyBpbiB0aGUgc2VsZWN0aW9uLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHBhcmFtIHBhZ2VJZCAKKwkJICogQHBhcmFtIHNlbGVjdGlvbiAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIEV4dGVybmFsRGF0YVNvdXJjZU1vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZShTdHJpbmcgcGFnZUlkLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJCXN1cGVyKHBhZ2VJZCwgc2VsZWN0aW9uKTsKKwkJfQorCisJCS8qKgorCQkgKiBUaGUgZnJhbWV3b3JrIGNhbGxzIHRoaXMgdG8gc2VlIGlmIHRoZSBmaWxlIGlzIGNvcnJlY3QuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7CisJCQlpZiAoc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsKKwkJCQkvLyBNYWtlIHN1cmUgdGhlIGZpbGUgZW5kcyBpbiAiLmV4dGVybmFsZGF0YXNvdXJjZSIuCisJCQkJLy8KKwkJCQlTdHJpbmcgcmVxdWlyZWRFeHQgPSBFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yRmlsZW5hbWVFeHRlbnNpb24iKTsKKwkJCQlTdHJpbmcgZW50ZXJlZEV4dCA9IG5ldyBQYXRoKGdldEZpbGVOYW1lKCkpLmdldEZpbGVFeHRlbnNpb24oKTsKKwkJCQlpZiAoZW50ZXJlZEV4dCA9PSBudWxsIHx8ICFlbnRlcmVkRXh0LmVxdWFscyhyZXF1aXJlZEV4dCkpIHsKKwkJCQkJc2V0RXJyb3JNZXNzYWdlKEV4dGVybmFsRGF0YVNvdXJjZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uIiwgbmV3IE9iamVjdCBbXSB7IHJlcXVpcmVkRXh0IH0pKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHJldHVybiBtb2RlbEZpbGUKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIElGaWxlIGdldE1vZGVsRmlsZSgpIHsKKwkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5hcHBlbmQoZ2V0RmlsZU5hbWUoKSkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgcGFnZSB3aGVyZSB0aGUgdHlwZSBvZiBvYmplY3QgdG8gY3JlYXRlIGlzIHNlbGVjdGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBjbGFzcyBFeHRlcm5hbERhdGFTb3VyY2VNb2RlbFdpemFyZEluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwcm90ZWN0ZWQgQ29tYm8gaW5pdGlhbE9iamVjdEZpZWxkOworCisJCS8qKgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKi8KKwkJcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBlbmNvZGluZ3M7CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwcm90ZWN0ZWQgQ29tYm8gZW5jb2RpbmdGaWVsZDsKKworCQkvKioKKwkJICogUGFzcyBpbiB0aGUgc2VsZWN0aW9uLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHBhcmFtIHBhZ2VJZCAKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIEV4dGVybmFsRGF0YVNvdXJjZU1vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZShTdHJpbmcgcGFnZUlkKSB7CisJCQlzdXBlcihwYWdlSWQpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAcGFyYW0gcGFyZW50IAorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOyB7CisJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQkJCWxheW91dC5udW1Db2x1bW5zID0gMTsKKwkJCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTI7CisJCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7CisJCQl9CisKKwkJCUxhYmVsIGNvbnRhaW5lckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOworCQkJeworCQkJCWNvbnRhaW5lckxhYmVsLnNldFRleHQoRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX01vZGVsT2JqZWN0IikpOworCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJY29udGFpbmVyTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCX0KKworCQkJaW5pdGlhbE9iamVjdEZpZWxkID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJCQl7CisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJCQlpbml0aWFsT2JqZWN0RmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCX0KKworCQkJZm9yIChTdHJpbmcgb2JqZWN0TmFtZSA6IGdldEluaXRpYWxPYmplY3ROYW1lcygpKSB7CisJCQkJaW5pdGlhbE9iamVjdEZpZWxkLmFkZChnZXRMYWJlbChvYmplY3ROYW1lKSk7CisJCQl9CisKKwkJCWlmIChpbml0aWFsT2JqZWN0RmllbGQuZ2V0SXRlbUNvdW50KCkgPT0gMSkgeworCQkJCWluaXRpYWxPYmplY3RGaWVsZC5zZWxlY3QoMCk7CisJCQl9CisJCQlpbml0aWFsT2JqZWN0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodmFsaWRhdG9yKTsKKworCQkJTGFiZWwgZW5jb2RpbmdMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKKwkJCXsKKwkJCQllbmNvZGluZ0xhYmVsLnNldFRleHQoRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1hNTEVuY29kaW5nIikpOworCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJZW5jb2RpbmdMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJfQorCQkJZW5jb2RpbmdGaWVsZCA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5CT1JERVIpOworCQkJeworCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCQkJZW5jb2RpbmdGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJfQorCisJCQlmb3IgKFN0cmluZyBlbmNvZGluZyA6IGdldEVuY29kaW5ncygpKSB7CisJCQkJZW5jb2RpbmdGaWVsZC5hZGQoZW5jb2RpbmcpOworCQkJfQorCisJCQllbmNvZGluZ0ZpZWxkLnNlbGVjdCgwKTsKKwkJCWVuY29kaW5nRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodmFsaWRhdG9yKTsKKworCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKKwkJCXNldENvbnRyb2woY29tcG9zaXRlKTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIHZhbGlkYXRvciA9CisJCQluZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisJCQkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7CisJCQkJfQorCQkJfTsKKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKKwkJCXJldHVybiBnZXRJbml0aWFsT2JqZWN0TmFtZSgpICE9IG51bGwgJiYgZ2V0RW5jb2RpbmdzKCkuY29udGFpbnMoZW5jb2RpbmdGaWVsZC5nZXRUZXh0KCkpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKwkJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7CisJCQlpZiAodmlzaWJsZSkgeworCQkJCWlmIChpbml0aWFsT2JqZWN0RmllbGQuZ2V0SXRlbUNvdW50KCkgPT0gMSkgeworCQkJCQlpbml0aWFsT2JqZWN0RmllbGQuY2xlYXJTZWxlY3Rpb24oKTsKKwkJCQkJZW5jb2RpbmdGaWVsZC5zZXRGb2N1cygpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJZW5jb2RpbmdGaWVsZC5jbGVhclNlbGVjdGlvbigpOworCQkJCQlpbml0aWFsT2JqZWN0RmllbGQuc2V0Rm9jdXMoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEByZXR1cm4gaW5pdGlhbE9iamVjdE5hbWUKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRJbml0aWFsT2JqZWN0TmFtZSgpIHsKKwkJCVN0cmluZyBsYWJlbCA9IGluaXRpYWxPYmplY3RGaWVsZC5nZXRUZXh0KCk7CisKKwkJCWZvciAoU3RyaW5nIG5hbWUgOiBnZXRJbml0aWFsT2JqZWN0TmFtZXMoKSkgeworCQkJCWlmIChnZXRMYWJlbChuYW1lKS5lcXVhbHMobGFiZWwpKSB7CisJCQkJCXJldHVybiBuYW1lOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAcmV0dXJuIGVuY29kaW5nRmllbGQuZ2V0VGV4dCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7CisJCQlyZXR1cm4gZW5jb2RpbmdGaWVsZC5nZXRUZXh0KCk7CisJCX0KKworCQkvKioKKwkJICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZSBuYW1lLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbChTdHJpbmcgdHlwZU5hbWUpIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIEV4dGVybmFsRGF0YVNvdXJjZUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfIiArIHR5cGVOYW1lICsgIl90eXBlIik7CisJCQl9CisJCQljYXRjaChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7CisJCQkJRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhtcmUpOworCQkJfQorCQkJcmV0dXJuIHR5cGVOYW1lOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEVuY29kaW5ncygpIHsKKwkJCWlmIChlbmNvZGluZ3MgPT0gbnVsbCkgeworCQkJCWVuY29kaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJCWZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1hNTEVuY29kaW5nQ2hvaWNlcyIpKTsgc3RyaW5nVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgKSB7CisJCQkJCWVuY29kaW5ncy5hZGQoc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gZW5jb2RpbmdzOworCQl9CisJfQorCisJLyoqCisJICogVGhlIGZyYW1ld29yayBjYWxscyB0aGlzIHRvIGNyZWF0ZSB0aGUgY29udGVudHMgb2YgdGhlIHdpemFyZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwkJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7CisJCS8vIENyZWF0ZSBhIHBhZ2UsIHNldCB0aGUgdGl0bGUsIGFuZCB0aGUgaW5pdGlhbCBtb2RlbCBmaWxlIG5hbWUuCisJCS8vCisJCW5ld0ZpbGVDcmVhdGlvblBhZ2UgPSBuZXcgRXh0ZXJuYWxEYXRhU291cmNlTW9kZWxXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlKCJXaGF0ZXZlciIsIHNlbGVjdGlvbik7CisJCW5ld0ZpbGVDcmVhdGlvblBhZ2Uuc2V0VGl0bGUoRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0V4dGVybmFsRGF0YVNvdXJjZU1vZGVsV2l6YXJkX2xhYmVsIikpOworCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldERlc2NyaXB0aW9uKEV4dGVybmFsRGF0YVNvdXJjZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9FeHRlcm5hbERhdGFTb3VyY2VNb2RlbFdpemFyZF9kZXNjcmlwdGlvbiIpKTsKKwkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXRGaWxlTmFtZShFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZSIpICsgIi4iICsgRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0V4dGVybmFsRGF0YVNvdXJjZUVkaXRvckZpbGVuYW1lRXh0ZW5zaW9uIikpOworCQlhZGRQYWdlKG5ld0ZpbGVDcmVhdGlvblBhZ2UpOworCisJCS8vIFRyeSBhbmQgZ2V0IHRoZSByZXNvdXJjZSBzZWxlY3Rpb24gdG8gZGV0ZXJtaW5lIGEgY3VycmVudCBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlIGRpYWxvZy4KKwkJLy8KKwkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7CisJCQkvLyBHZXQgdGhlIHJlc291cmNlLi4uCisJCQkvLworCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKTsKKwkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKKwkJCQkvLyBHZXQgdGhlIHJlc291cmNlIHBhcmVudCwgaWYgaXRzIGEgZmlsZS4KKwkJCQkvLworCQkJCUlSZXNvdXJjZSBzZWxlY3RlZFJlc291cmNlID0gKElSZXNvdXJjZSlzZWxlY3RlZEVsZW1lbnQ7CisJCQkJaWYgKHNlbGVjdGVkUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7CisJCQkJCXNlbGVjdGVkUmVzb3VyY2UgPSBzZWxlY3RlZFJlc291cmNlLmdldFBhcmVudCgpOworCQkJCX0KKworCQkJCS8vIFRoaXMgZ2l2ZXMgdXMgYSBkaXJlY3RvcnkuLi4KKwkJCQkvLworCQkJCWlmIChzZWxlY3RlZFJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlciB8fCBzZWxlY3RlZFJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKKwkJCQkJLy8gU2V0IHRoaXMgZm9yIHRoZSBjb250YWluZXIuCisJCQkJCS8vCisJCQkJCW5ld0ZpbGVDcmVhdGlvblBhZ2Uuc2V0Q29udGFpbmVyRnVsbFBhdGgoc2VsZWN0ZWRSZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKKworCQkJCQkvLyBNYWtlIHVwIGEgdW5pcXVlIG5ldyBuYW1lIGhlcmUuCisJCQkJCS8vCisJCQkJCVN0cmluZyBkZWZhdWx0TW9kZWxCYXNlRmlsZW5hbWUgPSBFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZSIpOworCQkJCQlTdHJpbmcgZGVmYXVsdE1vZGVsRmlsZW5hbWVFeHRlbnNpb24gPSBFeHRlcm5hbERhdGFTb3VyY2VFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yRmlsZW5hbWVFeHRlbnNpb24iKTsKKwkJCQkJU3RyaW5nIG1vZGVsRmlsZW5hbWUgPSBkZWZhdWx0TW9kZWxCYXNlRmlsZW5hbWUgKyAiLiIgKyBkZWZhdWx0TW9kZWxGaWxlbmFtZUV4dGVuc2lvbjsKKwkJCQkJZm9yIChpbnQgaSA9IDE7ICgoSUNvbnRhaW5lcilzZWxlY3RlZFJlc291cmNlKS5maW5kTWVtYmVyKG1vZGVsRmlsZW5hbWUpICE9IG51bGw7ICsraSkgeworCQkJCQkJbW9kZWxGaWxlbmFtZSA9IGRlZmF1bHRNb2RlbEJhc2VGaWxlbmFtZSArIGkgKyAiLiIgKyBkZWZhdWx0TW9kZWxGaWxlbmFtZUV4dGVuc2lvbjsKKwkJCQkJfQorCQkJCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldEZpbGVOYW1lKG1vZGVsRmlsZW5hbWUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlID0gbmV3IEV4dGVybmFsRGF0YVNvdXJjZU1vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSgiV2hhdGV2ZXIyIik7CisJCWluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2Uuc2V0VGl0bGUoRXh0ZXJuYWxEYXRhU291cmNlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0V4dGVybmFsRGF0YVNvdXJjZU1vZGVsV2l6YXJkX2xhYmVsIikpOworCQlpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlLnNldERlc2NyaXB0aW9uKEV4dGVybmFsRGF0YVNvdXJjZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb24iKSk7CisJCWFkZFBhZ2UoaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBmaWxlIGZyb20gdGhlIHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtb2RlbEZpbGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElGaWxlIGdldE1vZGVsRmlsZSgpIHsKKwkJcmV0dXJuIG5ld0ZpbGVDcmVhdGlvblBhZ2UuZ2V0TW9kZWxGaWxlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3ByZXNlbnRhdGlvbi9FeHRlcm5hbERhdGFTb3VyY2VQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvcHJlc2VudGF0aW9uL0V4dGVybmFsRGF0YVNvdXJjZVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2N2RkYjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3ByZXNlbnRhdGlvbi9FeHRlcm5hbERhdGFTb3VyY2VQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLy8gRXh0ZXJuYWxEYXRhU291cmNlUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UudXRpbC5FeHRlcm5hbERhdGFTb3VyY2VBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlcm5hbERhdGFTb3VyY2VQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcworCQlFeHRlcm5hbERhdGFTb3VyY2VBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzCisJCVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSwgSVN0YXJ0dXAgeworCisJUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IG51bGw7CisKKwkvKioKKwkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisJICovCisJcHVibGljIEV4dGVybmFsRGF0YVNvdXJjZVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkZEFkYXB0ZXJGYWN0b3J5KHRoaXMpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXAjZWFybHlTdGFydHVwKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBlYXJseVN0YXJ0dXAoKSB7CisJCS8vIE5vdGhpbmcgdG8gZG8gaGVyZS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBoYXMKKwkJLy8gcnVuIHdoaWNoIGlzIHRoZSBlbnRpcmUgcG9pbnQgb2YgZWFybHkgYWN0aXZhdGlvbiB3aGljaCBjYXVzZXMgdGhlCisJCS8vIGZhY3RvcnkgdG8gYmUgYWRkZWQgdG8gdGhlIFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGwjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSkKKwkJCQl8fCB0eXBlID09IFByb3BlcnR5U3RyaW5nUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLnV0aWwuRXh0ZXJuYWxEYXRhU291cmNlQWRhcHRlckZhY3RvcnkjY3JlYXRlRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZXJuYWxEYXRhU291cmNlRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJLy8gSGF2ZSB3ZSBjcmVhdGVkIG9uZSBiZWZvcmU/CisJCWlmIChhZGFwdGVyID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQlhZGFwdGVyID0gbmV3ICBTdGFuZGFyZFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5TdGFuZGFyZFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyKCkgeworCisJCQkJLyoqCisJCQkJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkJCQkgKiBAcmV0dXJuIHRoZSBOTFMnZCBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCisJCQkJICovCisJCQkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQkJCQl0cnkgeworCQkJCQkJcmV0dXJuIEV4dGVybmFsRGlzZWFzZVdpemFyZE1lc3NhZ2VzCisJCQkJCQkJCS5nZXRTdHJpbmcoKChFU3RydWN0dXJhbEZlYXR1cmUpIGRlc2NyaXB0b3IKKwkJCQkJCQkJCQkuZ2V0RmVhdHVyZShudWxsKSkuZ2V0TmFtZSgpKTsKKwkJCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eU5hbWUoZGVzY3JpcHRvcik7CisJCQkJCX0KKwkJCQl9IC8vIGdldFByb3BlcnR5TmFtZQorCisJCQkJLyoqCisJCQkJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkJCQkgKiBAcmV0dXJuIHRoZSBOTFMnZCB0b29sIHRpcCB0ZXh0IHRoYXQgZGVzY3JpYmVzIHRoZSBwcm9wZXJ0eQorCQkJCSAqLworCQkJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlUb29sVGlwKAorCQkJCQkJSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQkJCQl0cnkgeworCQkJCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBkZXNjcmlwdG9yCisJCQkJCQkJCS5nZXRGZWF0dXJlKG51bGwpOworCQkJCQkJcmV0dXJuIEV4dGVybmFsRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZyhmZWF0dXJlCisJCQkJCQkJCS5nZXROYW1lKCkKKwkJCQkJCQkJKyBUVF9TVUZGSVgpOworCQkJCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCQkJCQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5VG9vbFRpcChkZXNjcmlwdG9yKTsKKwkJCQkJfQorCQkJCX0gLy8gZ2V0UHJvcGVydHlUb29sVGlwCisKKwkJCQkvKioKKwkJCQkgKiBAcGFyYW0gZGVzY3JpcHRvcgorCQkJCSAqIEByZXR1cm4gdGhlIE5MUydkIHRleHQgdGhhdCByZXByZXNlbnRzIHRoZSB1bml0cyBvZiB0aGUKKwkJCQkgKiAgICAgICAgIHByb3BlcnR5CisJCQkJICovCisJCQkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVVuaXRzKAorCQkJCQkJSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQkJCQl0cnkgeworCQkJCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBkZXNjcmlwdG9yCisJCQkJCQkJCS5nZXRGZWF0dXJlKG51bGwpOworCQkJCQkJcmV0dXJuIEV4dGVybmFsRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZyhmZWF0dXJlCisJCQkJCQkJCS5nZXROYW1lKCkKKwkJCQkJCQkJKyBVTklUX1NVRkZJWCk7CisJCQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlVbml0cyhkZXNjcmlwdG9yKTsKKwkJCQkJfQorCQkJCX0gLy8gZ2V0UHJvcGVydHlVbml0cworCQkJfTsKKwkJfSAvLyBpZiB3ZSBkaWRuJ3QgY3JlYXRlIG9uZSBiZWZvcmUKKwkJcmV0dXJuIGFkYXB0ZXI7CisJfS8vIGNyZWF0ZUV4dGVybmFsRGF0YVNvdXJjZURpc2Vhc2VNb2RlbEFkYXB0ZXIoKQorCit9IC8vIEV4dGVybmFsRGF0YVNvdXJjZVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2V4dGVybmFsZGF0YXNvdXJjZS9wcmVzZW50YXRpb24vRXh0ZXJuYWxEaXNlYXNlV2l6YXJkTWVzc2FnZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvcHJlc2VudGF0aW9uL0V4dGVybmFsRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkYTYwZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvcHJlc2VudGF0aW9uL0V4dGVybmFsRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLy8gRXh0ZXJuYWxEaXNlYXNlV2l6YXJkTWVzc2FnZXMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0aGUgUmVzb3VyY2UgQnVuZGxlIGZvciB0aGlzIHBhY2thZ2UuCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlcm5hbERpc2Vhc2VXaXphcmRNZXNzYWdlcyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gQ29uc3RhbnRzLklEX1JPT1QKKwkJCSsgIi5kaXNlYXNlbW9kZWxzLmV4dGVybmFsZGF0YXNvdXJjZS5wcmVzZW50YXRpb24uZXh0ZXJuYWxkaXNlYXNlbWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQorCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7CisKKwlwcml2YXRlIEV4dGVybmFsRGlzZWFzZVdpemFyZE1lc3NhZ2VzKCkgeworCQkvLyBlbXB0eQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBrZXkKKwkgKiAgICAgICAgICAgIHRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlCisJICogQHJldHVybiB0aGUgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUga2V5CisJICogQHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gaWYgdGhlIGtleSBjYW5ub3QgYmUgZm91bmQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoZmluYWwgU3RyaW5nIGtleSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbnsKKwkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7CisJfSAvLyBnZXRTdHJpbmcKK30gLy8gRXh0ZXJuYWxEaXNlYXNlV2l6YXJkTWVzc2FnZXMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9leHRlcm5hbGRhdGFzb3VyY2UvcHJlc2VudGF0aW9uL2V4dGVybmFsZGlzZWFzZW1lc3NhZ2VzLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3ByZXNlbnRhdGlvbi9leHRlcm5hbGRpc2Vhc2VtZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YzFkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZXh0ZXJuYWxkYXRhc291cmNlL3ByZXNlbnRhdGlvbi9leHRlcm5hbGRpc2Vhc2VtZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzQgQEAKKyMgZGlzZWFzZXdpemFyZG1lc3NhZ2VzLnByb3BlcnRpZXMKKyMKKyMvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqCisjICogQ29udHJpYnV0b3JzOgorIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKK2RhdGFGaWxlID0gRGF0YSBGaWxlCitkYXRhRmlsZVRUID0gVGhlIGZpbGUgY29udGFpbmluZyBoaXN0b3JpYyBkaXNlYXNlIGRhdGEgdG8gcmVhZCBpbi4KK2RhdGFGaWxlVU5JVCA9IE5vdCBVc2VkCisKK2RhdGFEaXJlY3RvcnkgPSBEYXRhIERpcmVjdG9yeQorZGF0YURpcmVjdG9yeVRUID0gVGhlIGZvbGRlciBjb250YWluaW5nIHRoZSBleHRlcm5hbCBkYXRhIGZpbGVzIGZvciBhIHNjZW5hcmlvIHRvIGJlIGltcG9ydGVkLgorZGF0YURpcmVjdG9yeVVOSVQgPSBTY2VuYXJpbyBGb2xkZXIKKworZGF0YVBhdGggPSBEYXRhIFBhdGgKK2RhdGFQYXRoVFQgPSBUaGUgZmlsZSBvciBmb2xkZXIgb2YgZmlsZXMsIGNvbnRhaW5pbmcgaGlzdG9yaWMgc2NlbmFyaW8gZGlzZWFzZSBkYXRhIHRvIGJlIGltcG9ydGVkLgorZGF0YVBhdGhVTklUID0gTm90IFVzZWQKKworZGlzZWFzZVR5cGUgPSBEaXNlYXNlIFR5cGUKK2Rpc2Vhc2VUeXBlVFQgPSBUeXBlIG9mIERpc2Vhc2UgYmVpbmcgaW1wb3J0ZWQuIE11c3QgYmUgU0ksIFNJUiwgU0VJUi4KK2Rpc2Vhc2VUeXBlVU5JVCA9IFNJIFNJUiBvciBTRUlSCisKK2Rpc2Vhc2VEaXJlY3RvcnkgPSBEaXNlYXNlIERpcmVjdG9yeQorZGlzZWFzZURpcmVjdG9yeVRUID0gRGlzZWFzZSBEaXJlY3RvcnkKK2Rpc2Vhc2VEaXJlY3RvcnlVTklUID0gRGlzZWFzZSBEaXJlY3RvcnkgCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRlODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmYyZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmc8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZTdkMmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSwxNSBAQAorI1R1ZSBTZXAgMDEgMTY6NTM6MzAgRURUIDIwMDkKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdEZXNjcmlwdGlvbj1yZXR1cm5fdGFnCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YThhZDgyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyNSBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nLmVkaXRvcjtzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nLnByZXNlbnRhdGlvbi5Gb3JjaW5nRWRpdG9yUGx1Z2luJEltcGxlbWVudGF0aW9uCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLnByZXNlbnRhdGlvbiwKKyBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5wcmVzZW50YXRpb24KK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCisgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmc7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS51aS5pZGU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscywKKyBvcmcuZWNsaXBzZS5zdGVtLnVpCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA1MWNjYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNCBAQAorCisjIDxjb3B5cmlnaHQ+CisjIDwvY29weXJpZ2h0PgorIworIyAkSWQ6IGJ1aWxkLnByb3BlcnRpZXMsdiAxLjEgMjAwOS8wMy8xMyAwMDowNzo0OCBzZWRsdW5kIEV4cCAkCisKK2Jpbi5pbmNsdWRlcyA9IC4sXAorICAgICAgICAgICAgICAgaWNvbnMvLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuCitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvaWNvbnMvZnVsbC9vYmoxNi9Gb3JjaW5nTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nL2ljb25zL2Z1bGwvb2JqMTYvRm9yY2luZ01vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0MDRlNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nL2ljb25zL2Z1bGwvb2JqMTYvRm9yY2luZ01vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjEzY2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1MSBAQAorCisjIDxjb3B5cmlnaHQ+CisjIDwvY29weXJpZ2h0PgorIworIyAkSWQ6IHBsdWdpbi5wcm9wZXJ0aWVzLHYgMS4xIDIwMDkvMDMvMTMgMDA6MDc6NDggc2VkbHVuZCBFeHAgJAorCitwbHVnaW5OYW1lID0gU1RFTSBGb3JjaW5nIERpc2Vhc2UgTW9kZWwgVUkKK3Byb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCisKK19VSV9FeGFtcGxlRWRpdG9yX21lbnUgPSAmRXhhbXBsZSBFZGl0b3IKKworX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSA9ICZOZXcgQ2hpbGQKK19VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSA9IE4mZXcgU2libGluZworCitfVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbSA9IFNob3cgJlByb3BlcnRpZXMgVmlldworX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtID0gJlJlZnJlc2gKKworX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwgPSBTZWxlY3Rpb24KKworX1VJX05vT2JqZWN0U2VsZWN0ZWQgPSBTZWxlY3RlZCBOb3RoaW5nCitfVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQgPSBTZWxlY3RlZCBPYmplY3Q6IHswfQorX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQgPSBTZWxlY3RlZCB7MH0gT2JqZWN0cworCitfVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsID0gT3BlbiBFZGl0b3IKKworX1VJX1dpemFyZF9jYXRlZ29yeSA9IEV4YW1wbGUgRU1GIE1vZGVsIENyZWF0aW9uIFdpemFyZHMKKworX1VJX0NyZWF0ZU1vZGVsRXJyb3JfbWVzc2FnZSA9IFByb2JsZW1zIGVuY291bnRlcmVkIGluIGZpbGUgInswfSIKKworX1VJX0V4YW1wbGVFZGl0b3JfbGFiZWwgPSBFeGFtcGxlIE1vZGVsIEVkaXRvcgorCitfVUlfRXhhbXBsZUVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2UgPSBNeQorX1VJX0V4YW1wbGVFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbnMgPSBleGFtcGxlCisKK19VSV9XaXphcmRfbGFiZWwgPSBOZXcKKworX1dBUk5fRmlsZW5hbWVFeHRlbnNpb24gPSBUaGUgZmlsZSBuYW1lIG11c3QgZW5kIGluICcnLnswfScnCitfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbnMgPSBUaGUgZmlsZSBuYW1lIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zOiB7MH0KKworX1VJX01vZGVsT2JqZWN0ID0gJk1vZGVsIE9iamVjdAorX1VJX1hNTEVuY29kaW5nID0gJlhNTCBFbmNvZGluZworX1VJX1hNTEVuY29kaW5nQ2hvaWNlcyA9IFVURi04IEFTQ0lJIFVURi0xNiBVVEYtMTZCRSBVVEYtMTZMRSBJU08tODg1OS0xCitfVUlfV2l6YXJkX2luaXRpYWxfb2JqZWN0X2Rlc2NyaXB0aW9uID0gU2VsZWN0IGEgbW9kZWwgb2JqZWN0IHRvIGNyZWF0ZQorCitfVUlfRmlsZUNvbmZsaWN0X2xhYmVsID0gRmlsZSBDb25mbGljdAorX1dBUk5fRmlsZUNvbmZsaWN0ID0gVGhlcmUgYXJlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IGNvbmZsaWN0IHdpdGggY2hhbmdlcyBtYWRlIG91dHNpZGUgdGhlIGVkaXRvci4gIERvIHlvdSB3aXNoIHRvIGRpc2NhcmQgdGhpcyBlZGl0b3IncyBjaGFuZ2VzPworCitfVUlfRm9yY2luZ0VkaXRvcl9tZW51ID0gJkZvcmNpbmcgRWRpdG9yCitfVUlfRm9yY2luZ0VkaXRvcl9sYWJlbCA9IEZvcmNpbmcgTW9kZWwgRWRpdG9yCitfVUlfRm9yY2luZ0VkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2UgPSBNeQorX1VJX0ZvcmNpbmdFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbnMgPSBmb3JjaW5nCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjQ2MjQzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvcGx1Z2luLnhtbApAQCAtMCwwICsxLDQ3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgorCis8IS0tCisgPGNvcHlyaWdodD4KKyA8L2NvcHlyaWdodD4KKworICRJZDogcGx1Z2luLnhtbCx2IDEuMSAyMDA5LzAzLzEzIDAwOjA3OjQ4IHNlZGx1bmQgRXhwICQKKy0tPgorCis8cGx1Z2luPgorCisKKyAgPGV4dGVuc2lvbgorICAgIHBvaW50ID0gIm9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgorICAgIDxjYXRlZ29yeQorICAgICAgaWQgPSAib3JnLmVjbGlwc2UuZW1mLmVjb3JlLldpemFyZC5jYXRlZ29yeS5JRCIKKyAgICAgIG5hbWU9IiVfVUlfV2l6YXJkX2NhdGVnb3J5Ij4KKyAgICA8L2NhdGVnb3J5PgorICAgIDx3aXphcmQKKyAgICAgIGlkID0gIm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLnByZXNlbnRhdGlvbi5Gb3JjaW5nTW9kZWxXaXphcmRJRCIKKyAgICAgIG5hbWUgPSAiJV9VSV9Gb3JjaW5nTW9kZWxXaXphcmRfbGFiZWwiCisgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5wcmVzZW50YXRpb24uRm9yY2luZ01vZGVsV2l6YXJkIgorICAgICAgY2F0ZWdvcnkgPSAib3JnLmVjbGlwc2UuZW1mLmVjb3JlLldpemFyZC5jYXRlZ29yeS5JRCIKKyAgICAgIGljb24gPSAiaWNvbnMvZnVsbC9vYmoxNi9Gb3JjaW5nTW9kZWxGaWxlLmdpZiI+CisgICAgICA8ZGVzY3JpcHRpb24+JV9VSV9FeGFtcGxlTW9kZWxXaXphcmRfZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgorICAgICAgPHNlbGVjdGlvbiBjbGFzcyA9ICJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiIC8+CisgICAgPC93aXphcmQ+CisgIDwvZXh0ZW5zaW9uPgorCisgIDxleHRlbnNpb24gcG9pbnQgPSAib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+CisgICAgPGVkaXRvcgorICAgICAgICBpZCA9ICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5wcmVzZW50YXRpb24uRm9yY2luZ0VkaXRvcklEIgorICAgICAgICBuYW1lID0gIiVfVUlfRm9yY2luZ0VkaXRvcl9sYWJlbCIKKyAgICAgICAgaWNvbiA9ICJpY29ucy9mdWxsL29iajE2L0ZvcmNpbmdNb2RlbEZpbGUuZ2lmIgorICAgICAgICBleHRlbnNpb25zID0gImZvcmNpbmciCisgICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLnByZXNlbnRhdGlvbi5Gb3JjaW5nRWRpdG9yIiAKKyAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcucHJlc2VudGF0aW9uLkZvcmNpbmdBY3Rpb25CYXJDb250cmlidXRvciIgPgorICAgIDwvZWRpdG9yPgorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3RhcnR1cCI+CisgICAgIDxzdGFydHVwCisgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5wcmVzZW50YXRpb24uRm9yY2luZ1Byb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSI+CisgICAgIDwvc3RhcnR1cD4KKyAgPC9leHRlbnNpb24+Cis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9wcmVzZW50YXRpb24vRm9yY2luZ0FjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJlc2VudGF0aW9uL0ZvcmNpbmdBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwOGNjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJlc2VudGF0aW9uL0ZvcmNpbmdBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCkBAIC0wLDAgKzEsNDM2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29udHJvbEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YkNvbnRyaWJ1dGlvbkl0ZW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5wcmVzZW50YXRpb24uRm9yY2luZ0VkaXRvclBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGFjdGlvbiBiYXIgY29udHJpYnV0b3IgZm9yIHRoZSBGb3JjaW5nIG1vZGVsIGVkaXRvci4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEZvcmNpbmdBY3Rpb25CYXJDb250cmlidXRvcgorCWV4dGVuZHMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yCisJaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3JQYXJ0OworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgYWN0aW9uIG9wZW5zIHRoZSBQcm9wZXJ0aWVzIHZpZXcuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElBY3Rpb24gc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uID0KKwkJbmV3IEFjdGlvbihGb3JjaW5nRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW0iKSkgLy8kTk9OLU5MUy0xJAorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQl0cnkgeworCQkJCQlnZXRQYWdlKCkuc2hvd1ZpZXcoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCUZvcmNpbmdFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyBhY3Rpb24gcmVmcmVzaGVzIHRoZSB2aWV3ZXIgb2YgdGhlIGN1cnJlbnQgZWRpdG9yIGlmIHRoZSBlZGl0b3IKKwkgKiBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQWN0aW9uIHJlZnJlc2hWaWV3ZXJBY3Rpb24gPQorCQluZXcgQWN0aW9uKEZvcmNpbmdFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0iKSkgLy8kTk9OLU5MUy0xJAorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKwkJCQlyZXR1cm4gYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcjsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJaWYgKGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKKwkJCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldFZpZXdlcigpOworCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKKwkJCQkJCXZpZXdlci5yZWZyZXNoKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gY29ycmVzcG9uZGluZyB0byBlYWNoIGRlc2NyaXB0b3IKKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBjcmVhdGVDaGlsZEFjdGlvbnM7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZUNoaWxkIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyB3aWxsIGNvbnRhaW4gb25lIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gY29ycmVzcG9uZGluZyB0byBlYWNoIGRlc2NyaXB0b3IKKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBjcmVhdGVTaWJsaW5nQWN0aW9uczsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCBmb3IgQ3JlYXRlU2libGluZyBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBjb250cmlidXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRm9yY2luZ0FjdGlvbkJhckNvbnRyaWJ1dG9yKCkgeworCQlzdXBlcihBRERJVElPTlNfTEFTVF9TVFlMRSk7CisJCWxvYWRSZXNvdXJjZUFjdGlvbiA9IG5ldyBMb2FkUmVzb3VyY2VBY3Rpb24oKTsKKwkJdmFsaWRhdGVBY3Rpb24gPSBuZXcgVmFsaWRhdGVBY3Rpb24oKTsKKwkJY29udHJvbEFjdGlvbiA9IG5ldyBDb250cm9sQWN0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIFNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMgdG8gdGhlIHRvb2wgYmFyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7CisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJmb3JjaW5nLXNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJmb3JjaW5nLWFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB0byB0aGUgbWVudSBiYXIgYSBtZW51IGFuZCBzb21lIHNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMsCisJICogYXMgd2VsbCBhcyB0aGUgc3ViLW1lbnVzIGZvciBvYmplY3QgY3JlYXRpb24gaXRlbXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51TWFuYWdlcik7CisKKwkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKEZvcmNpbmdFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRm9yY2luZ0VkaXRvcl9tZW51IiksICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZ01lbnVJRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigic2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIFByZXBhcmUgZm9yIENyZWF0ZUNoaWxkIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KKwkJLy8KKwkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihGb3JjaW5nRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlU2libGluZyBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCisJCS8vCisJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihGb3JjaW5nRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEZvcmNlIGFuIHVwZGF0ZSBiZWNhdXNlIEVjbGlwc2UgaGlkZXMgZW1wdHkgbWVudXMgbm93LgorCQkvLworCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIKKwkJCShuZXcgSU1lbnVMaXN0ZW5lcigpIHsKKwkJCQkgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQkJCQkgbWVudU1hbmFnZXIudXBkYXRlQWxsKHRydWUpOworCQkJCSB9CisJCQkgfSk7CisKKwkJYWRkR2xvYmFsQWN0aW9ucyhzdWJtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogV2hlbiB0aGUgYWN0aXZlIGVkaXRvciBjaGFuZ2VzLCB0aGlzIHJlbWVtYmVycyB0aGUgY2hhbmdlIGFuZCByZWdpc3RlcnMgd2l0aCBpdCBhcyBhIHNlbGVjdGlvbiBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkgeworCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IocGFydCk7CisJCWFjdGl2ZUVkaXRvclBhcnQgPSBwYXJ0OworCisJCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KKwkJLy8KKwkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKwkJfQorCQlpZiAocGFydCA9PSBudWxsKSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7CisJCX0KKwkJZWxzZSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7CisJCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisKKwkJCS8vIEZha2UgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCB0byB1cGRhdGUgdGhlIG1lbnVzLgorCQkJLy8KKwkJCWlmIChzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSAhPSBudWxsKSB7CisJCQkJc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNlbGVjdGlvblByb3ZpZGVyLCBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LAorCSAqIGhhbmRsaW5nIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH1zIGJ5IHF1ZXJ5aW5nIGZvciB0aGUgY2hpbGRyZW4gYW5kIHNpYmxpbmdzCisJICogdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGVkIG9iamVjdCBhbmQgdXBkYXRpbmcgdGhlIG1lbnVzIGFjY29yZGluZ2x5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCS8vIFJlbW92ZSBhbnkgbWVudSBpdGVtcyBmb3Igb2xkIHNlbGVjdGlvbi4KKwkJLy8KKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMpOworCQl9CisKKwkJLy8gUXVlcnkgdGhlIG5ldyBzZWxlY3Rpb24gZm9yIGFwcHJvcHJpYXRlIG5ldyBjaGlsZC9zaWJsaW5nIGRlc2NyaXB0b3JzCisJCS8vCisJCUNvbGxlY3Rpb248Pz4gbmV3Q2hpbGREZXNjcmlwdG9ycyA9IG51bGw7CisJCUNvbGxlY3Rpb248Pz4gbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gbnVsbDsKKworCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOworCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnNpemUoKSA9PSAxKSB7CisJCQlPYmplY3Qgb2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOworCisJCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7CisKKwkJCW5ld0NoaWxkRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhvYmplY3QsIG51bGwpOworCQkJbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobnVsbCwgb2JqZWN0KTsKKwkJfQorCisJCS8vIEdlbmVyYXRlIGFjdGlvbnMgZm9yIHNlbGVjdGlvbjsgcG9wdWxhdGUgYW5kIHJlZHJhdyB0aGUgbWVudXMuCisJCS8vCisJCWNyZWF0ZUNoaWxkQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKG5ld0NoaWxkRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7CisJCWNyZWF0ZVNpYmxpbmdBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhuZXdTaWJsaW5nRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7CisKKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7CisJCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKKwkJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7CisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7CisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlQ2hpbGRBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCisJLyoqCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgeworCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVTaWJsaW5nQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwgZGVzY3JpcHRvcikpOworCQkJfQorCQl9CisJCXJldHVybiBhY3Rpb25zOworCX0KKworCS8qKgorCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gd2l0aCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cworCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sCisJICogYnkgaW5zZXJ0aW5nIHRoZW0gYmVmb3JlIHRoZSBzcGVjaWZpZWQgY29udHJpYnV0aW9uIGl0ZW0gPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+LgorCSAqIElmIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgc2ltcGx5IGFkZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zLCBTdHJpbmcgY29udHJpYnV0aW9uSUQpIHsKKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChJQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMpIHsKKwkJCQlpZiAoY29udHJpYnV0aW9uSUQgIT0gbnVsbCkgeworCQkJCQltYW5hZ2VyLmluc2VydEJlZm9yZShjb250cmlidXRpb25JRCwgYWN0aW9uKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCW1hbmFnZXIuYWRkKGFjdGlvbik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQkKKwkvKioKKwkgKiBUaGlzIHJlbW92ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cworCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucykgeworCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7CisJCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgeworCQkJCS8vIExvb2sgaW50byBTdWJDb250cmlidXRpb25JdGVtcworCQkJCS8vCisJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uSXRlbSA9IGl0ZW1zW2ldOworCQkJCXdoaWxlIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCQljb250cmlidXRpb25JdGVtID0gKChTdWJDb250cmlidXRpb25JdGVtKWNvbnRyaWJ1dGlvbkl0ZW0pLmdldElubmVySXRlbSgpOworCQkJCX0KKworCQkJCS8vIERlbGV0ZSB0aGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbXMgd2l0aCBtYXRjaGluZyBhY3Rpb24uCisJCQkJLy8KKwkJCQlpZiAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKKwkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0QWN0aW9uKCk7CisJCQkJCWlmIChhY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsKKwkJCQkJCW1hbmFnZXIucmVtb3ZlKGNvbnRyaWJ1dGlvbkl0ZW0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHBvcC11cCBtZW51IGJlZm9yZSBpdCBhcHBlYXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKKwkJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBudWxsOworCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKEZvcmNpbmdFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisKKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoRm9yY2luZ0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBpbnNlcnRzIGdsb2JhbCBhY3Rpb25zIGJlZm9yZSB0aGUgImFkZGl0aW9ucy1lbmQiIHNlcGFyYXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRHbG9iYWxBY3Rpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zLWVuZCIsIG5ldyBTZXBhcmF0b3IoInVpLWFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKKworCQlyZWZyZXNoVmlld2VyQWN0aW9uLnNldEVuYWJsZWQocmVmcmVzaFZpZXdlckFjdGlvbi5pc0VuYWJsZWQoKSk7CQkKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCByZWZyZXNoVmlld2VyQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAorCisJCXN1cGVyLmFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgZW5zdXJlcyB0aGF0IGEgZGVsZXRlIGFjdGlvbiB3aWxsIGNsZWFuIHVwIGFsbCByZWZlcmVuY2VzIHRvIGRlbGV0ZWQgb2JqZWN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVBbGxSZWZlcmVuY2VzT25EZWxldGUoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9wcmVzZW50YXRpb24vRm9yY2luZ0VkaXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9mb3JjaW5nL3ByZXNlbnRhdGlvbi9Gb3JjaW5nRWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwZmJlMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9wcmVzZW50YXRpb24vRm9yY2luZ0VkaXRvci5qYXZhCkBAIC0wLDAgKzEsMTU3OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNhdmVBc0RpYWxvZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldFBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuZWRpdG9yLlByb2JsZW1FZGl0b3JQYXJ0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5SZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmNlbGxlZGl0b3IuQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuTG9jYWxUcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuVmlld2VyRHJhZ0FkYXB0ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuVW53cmFwcGluZ1NlbGVjdGlvblByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlNYXJrZXJIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlVdGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudmlldy5FeHRlbmRlZFByb3BlcnR5U2hlZXRQYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcucHJvdmlkZXIuRm9yY2luZ0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLkdyYXBoSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5wcm92aWRlci5Nb2RpZmllckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLnByb3ZpZGVyLlNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLnByb3ZpZGVyLlNlcXVlbmNlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5wcm92aWRlci5Tb2x2ZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlci5MYWJlbHNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdGFuZGFyZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcucHJlc2VudGF0aW9uLkZvcmNpbmdFZGl0b3JQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKKworCisvKioKKyAqIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIEZvcmNpbmcgbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikgCitwdWJsaWMgY2xhc3MgRm9yY2luZ0VkaXRvcgorCWV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydAorCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5Qcm92aWRlciwgSVNlbGVjdGlvblByb3ZpZGVyLCBJTWVudUxpc3RlbmVyLCBJVmlld2VyUHJvdmlkZXIsIElHb3RvTWFya2VyIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBlZGl0aW5nIGRvbWFpbiB0aGF0IGlzIHVzZWQgdG8gdHJhY2sgYWxsIGNoYW5nZXMgdG8gdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG9uZSBhZGFwdGVyIGZhY3RvcnkgdXNlZCBmb3IgcHJvdmlkaW5nIHZpZXdzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQ29udGVudE91dGxpbmVQYWdlIGNvbnRlbnRPdXRsaW5lUGFnZTsKKworCS8qKgorCSAqIFRoaXMgaXMgYSBrbHVkZ2UuLi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVN0YXR1c0xpbmVNYW5hZ2VyIGNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZSdzIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBjb250ZW50T3V0bGluZVZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHByb3BlcnR5IHNoZWV0IHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFByb3BlcnR5U2hlZXRQYWdlIHByb3BlcnR5U2hlZXRQYWdlOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdmlld2VyIHRoYXQgc2hhZG93cyB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb250ZW50IG91dGxpbmUuCisJICogVGhlIHBhcmVudCByZWxhdGlvbiBtdXN0IGJlIGNvcnJlY3RseSBkZWZpbmVkIGZvciB0aGlzIHRvIHdvcmsuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgc2VsZWN0aW9uVmlld2VyOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGNvbnRlbnQgdmlld2VyLCB3aGljaCBtYXkgYmUgZWl0aGVyIG9uZSBvZiB0aGUgdmlld2VycyBpbiB0aGUgcGFnZXMgb3IgdGhlIGNvbnRlbnQgb3V0bGluZSB2aWV3ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFZpZXdlciBjdXJyZW50Vmlld2VyOworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIHRvIHdoaWNoIGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn1zIHRoYXQgYXJlIGxpc3RlbmluZyB0byB0aGlzIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPigpOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgc2VsZWN0aW9uIG9mIHRoZSBlZGl0b3IgYXMgYSB3aG9sZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBlZGl0b3JTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOworCisJLyoqCisJICogVGhlIE1hcmtlckhlbHBlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgd29ya3NwYWNlIHJlc291cmNlIG1hcmtlcnMgcHJlc2VudGVkCisJICogaW4gRWNsaXBzZSdzIFByb2JsZW1zIFZpZXcuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1hcmtlckhlbHBlciBtYXJrZXJIZWxwZXIgPSBuZXcgRWRpdFVJTWFya2VySGVscGVyKCk7CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdoZW4gdGhlIG91dGxpbmUgYmVjb21lcyBhY3RpdmUKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPQorCQluZXcgSVBhcnRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCWlmIChwIGluc3RhbmNlb2YgQ29udGVudE91dGxpbmUpIHsKKwkJCQkJaWYgKCgoQ29udGVudE91dGxpbmUpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBjb250ZW50T3V0bGluZVBhZ2UpIHsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKEZvcmNpbmdFZGl0b3IudGhpcyk7CisKKwkJCQkJCXNldEN1cnJlbnRWaWV3ZXIoY29udGVudE91dGxpbmVWaWV3ZXIpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHAgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSB7CisJCQkJCWlmICgoKFByb3BlcnR5U2hlZXQpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBwcm9wZXJ0eVNoZWV0UGFnZSkgeworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoRm9yY2luZ0VkaXRvci50aGlzKTsKKwkJCQkJCWhhbmRsZUFjdGl2YXRlKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAocCA9PSBGb3JjaW5nRWRpdG9yLnRoaXMpIHsKKwkJCQkJaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQl9CisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIHNpbmNlIGxhc3QgYWN0aXZhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHNhdmVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBzYXZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBNYXAgdG8gc3RvcmUgdGhlIGRpYWdub3N0aWMgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4gcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4oKTsKKworCS8qKgorCSAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiBzaG91bGQgYmUgdXBkYXRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisKKwkvKioKKwkgKiBBZGFwdGVyIHVzZWQgdG8gdXBkYXRlIHRoZSBwcm9ibGVtIGluZGljYXRpb24gd2hlbiByZXNvdXJjZXMgYXJlIGRlbWFuZGVkIGxvYWRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUNvbnRlbnRBZGFwdGVyIHByb2JsZW1JbmRpY2F0aW9uQWRhcHRlciA9IAorCQluZXcgRUNvbnRlbnRBZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBSZXNvdXJjZSkgeworCQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVzb3VyY2UuY2xhc3MpKSB7CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQ6CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19FUlJPUlM6CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19XQVJOSU5HUzogeworCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOworCQkJCQkJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBudWxsKTsKKwkJCQkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBkaWFnbm9zdGljKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnJlbW92ZShyZXNvdXJjZSk7CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKSB7CisJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCQkJCQkJCQkJIH0KKwkJCQkJCQkJCSB9KTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJCQl9CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VGFyZ2V0KFJlc291cmNlIHRhcmdldCkgeworCQkJCWJhc2ljU2V0VGFyZ2V0KHRhcmdldCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgdW5zZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7CisJCQkJYmFzaWNVbnNldFRhcmdldCh0YXJnZXQpOworCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIGZvciB3b3Jrc3BhY2UgY2hhbmdlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9CisJCW5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKKwkJCQl0cnkgeworCQkJCQljbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7CisJCQkJCQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7CisJCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisJCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CisJCQkJCQkJaWYgKGRlbHRhLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7CisJCQkJCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCB8fAorCQkJCQkJCQkgICAgZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgZGVsdGEuZ2V0RmxhZ3MoKSAhPSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSB7CisJCQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGRlbHRhLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIGZhbHNlKTsKKwkJCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisJCQkJCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7CisJCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJZWxzZSBpZiAoIXNhdmVkUmVzb3VyY2VzLnJlbW92ZShyZXNvdXJjZSkpIHsKKwkJCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJfQorCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsKKwkJCQkJCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlczsKKwkJCQkJCX0KKworCQkJCQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlbW92ZWRSZXNvdXJjZXMoKSB7CisJCQkJCQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlmaW5hbCBSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpdG9yKCk7CisJCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKKworCQkJCQlpZiAoIXZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkgcmVtb3ZlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkpOworCQkJCQkJCQkJIGlmICghaXNEaXJ0eSgpKSB7CisJCQkJCQkJCQkJIGdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoRm9yY2luZ0VkaXRvci50aGlzLCBmYWxzZSk7CisJCQkJCQkJCQkgfQorCQkJCQkJCQkgfQorCQkJCQkJCSB9KTsKKwkJCQkJfQorCisJCQkJCWlmICghdmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCSBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7CisJCQkJCQkJCQkgaWYgKGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gRm9yY2luZ0VkaXRvci50aGlzKSB7CisJCQkJCQkJCQkJIGhhbmRsZUFjdGl2YXRlKCk7CisJCQkJCQkJCQkgfQorCQkJCQkJCQkgfQorCQkJCQkJCSB9KTsKKwkJCQkJfQorCQkJCX0KKwkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJRm9yY2luZ0VkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBIYW5kbGVzIGFjdGl2YXRpb24gb2YgdGhlIGVkaXRvciBvciBpdCdzIGFzc29jaWF0ZWQgdmlld3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoKSB7CisJCS8vIFJlY29tcHV0ZSB0aGUgcmVhZCBvbmx5IHN0YXRlLgorCQkvLworCQlpZiAoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKSAhPSBudWxsKSB7CisJCSAgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKS5jbGVhcigpOworCisJCSAgLy8gUmVmcmVzaCBhbnkgYWN0aW9ucyB0aGF0IG1heSBiZWNvbWUgZW5hYmxlZCBvciBkaXNhYmxlZC4KKwkJICAvLworCQkgIHNldFNlbGVjdGlvbihnZXRTZWxlY3Rpb24oKSk7CisJCX0KKworCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7CisJCQlpZiAoaGFuZGxlRGlydHlDb25mbGljdCgpKSB7CisJCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihGb3JjaW5nRWRpdG9yLnRoaXMsIGZhbHNlKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCWNoYW5nZWRSZXNvdXJjZXMucmVtb3ZlQWxsKHNhdmVkUmVzb3VyY2VzKTsKKwkJCWhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKTsKKwkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBIYW5kbGVzIHdoYXQgdG8gZG8gd2l0aCBjaGFuZ2VkIHJlc291cmNlcyBvbiBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKSB7CisJCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkgJiYgKCFpc0RpcnR5KCkgfHwgaGFuZGxlRGlydHlDb25mbGljdCgpKSkgeworCQkJaWYgKGlzRGlydHkoKSkgeworCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSk7CisJCQl9CisJCQllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7CisKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgeworCQkJCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKSB7CisJCQkJCXJlc291cmNlLnVubG9hZCgpOworCQkJCQl0cnkgeworCQkJCQkJcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOworCQkJCQl9CisJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCWlmICghcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAuY29udGFpbnNLZXkocmVzb3VyY2UpKSB7CisJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4uaXNTdGFsZShlZGl0b3JTZWxlY3Rpb24pKSB7CisJCQkJc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOworCQkJfQorCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQl9CisJfQorICAKKwkvKioKKwkgKiBVcGRhdGVzIHRoZSBwcm9ibGVtcyBpbmRpY2F0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWVkIGRpYWdub3N0aWMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKSB7CisJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgeworCQkJQmFzaWNEaWFnbm9zdGljIGRpYWdub3N0aWMgPQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMKKwkJCQkJKERpYWdub3N0aWMuT0ssCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuZWRpdG9yIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkgMCwKKwkJCQkJIG51bGwsCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpIH0pOworCQkJZm9yIChEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA6IHJlc291cmNlVG9EaWFnbm9zdGljTWFwLnZhbHVlcygpKSB7CisJCQkJaWYgKGNoaWxkRGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJZGlhZ25vc3RpYy5hZGQoY2hpbGREaWFnbm9zdGljKTsKKwkJCQl9CisJCQl9CisKKwkJCWludCBsYXN0RWRpdG9yUGFnZSA9IGdldFBhZ2VDb3VudCgpIC0gMTsKKwkJCWlmIChsYXN0RWRpdG9yUGFnZSA+PSAwICYmIGdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkgaW5zdGFuY2VvZiBQcm9ibGVtRWRpdG9yUGFydCkgeworCQkJCSgoUHJvYmxlbUVkaXRvclBhcnQpZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSkuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQlQcm9ibGVtRWRpdG9yUGFydCBwcm9ibGVtRWRpdG9yUGFydCA9IG5ldyBQcm9ibGVtRWRpdG9yUGFydCgpOworCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7CisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0TWFya2VySGVscGVyKG1hcmtlckhlbHBlcik7CisJCQkJdHJ5IHsKKwkJCQkJYWRkUGFnZSgrK2xhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydCwgZ2V0RWRpdG9ySW5wdXQoKSk7CisJCQkJCXNldFBhZ2VUZXh0KGxhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydC5nZXRQYXJ0TmFtZSgpKTsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJCXNob3dUYWJzKCk7CisJCQkJfQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJRm9yY2luZ0VkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChtYXJrZXJIZWxwZXIuaGFzTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpKSB7CisJCQkJbWFya2VySGVscGVyLmRlbGV0ZU1hcmtlcnMoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCW1hcmtlckhlbHBlci5jcmVhdGVNYXJrZXJzKGRpYWdub3N0aWMpOworCQkJCQl9CisJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJRm9yY2luZ0VkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFNob3dzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsKKwkJcmV0dXJuCisJCQlNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbgorCQkJCShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRmlsZUNvbmZsaWN0X2xhYmVsIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfV0FSTl9GaWxlQ29uZmxpY3QiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBtb2RlbCBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEZvcmNpbmdFZGl0b3IoKSB7CisJCXN1cGVyKCk7CisJCWluaXRpYWxpemVFZGl0aW5nRG9tYWluKCk7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHVwIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1vZGVsIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWRpdGluZ0RvbWFpbigpIHsKKwkJLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlpZWxkcyBpdGVtIHByb3ZpZGVycy4KKwkJLy8KKwkJYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOworCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRm9yY2luZ0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IENvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEdyYXBoSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RpZmllckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IExhYmVsc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTb2x2ZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKworCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUgZXhlY3V0ZWQuCisJCS8vCisJCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOworCisJCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCisJCS8vCisJCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcgorCQkJKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKKwkJCQkgcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgeworCQkJCQkgZ2V0Q29udGFpbmVyKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJIChuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJICBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCSAgZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworCisJCQkJCQkJCSAgLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KKwkJCQkJCQkJICAvLworCQkJCQkJCQkgIENvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaylldmVudC5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsKKwkJCQkJCQkJICBpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgeworCQkJCQkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihtb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7CisJCQkJCQkJCSAgfQorCQkJCQkJCQkgIGlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsICYmICFwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQkJCQkgIHByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsKKwkJCQkJCQkJICB9CisJCQkJCQkJICB9CisJCQkJCQkgIH0pOworCQkJCSB9CisJCQkgfSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgorCQkvLworCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgQm9vbGVhbj4oKSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBoZXJlIGZvciB0aGUgbGlzdGVuZXIgdG8gYmUgYWJsZSB0byBjYWxsIGl0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCQkJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGludCBhY3Rpb24pIHsKKwkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKGFjdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHRoZSBzZWxlY3Rpb24gaW50byB3aGljaGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKKwkJZmluYWwgQ29sbGVjdGlvbjw/PiB0aGVTZWxlY3Rpb24gPSBjb2xsZWN0aW9uOworCQkvLyBNYWtlIHN1cmUgaXQncyBva2F5LgorCQkvLworCQlpZiAodGhlU2VsZWN0aW9uICE9IG51bGwgJiYgIXRoZVNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKKwkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0KKwkJCQluZXcgUnVubmFibGUoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGl0ZW1zIGluIHRoZSBjdXJyZW50IGNvbnRlbnQgdmlld2VyIG9mIHRoZSBlZGl0b3IuCisJCQkJCQkvLworCQkJCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgeworCQkJCQkJCWN1cnJlbnRWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoZVNlbGVjdGlvbi50b0FycmF5KCkpLCB0cnVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX07CisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgZWRpdGluZyBkb21haW4gYXMgcmVxdWlyZWQgYnkgdGhlIHtAbGluayBJRWRpdGluZ0RvbWFpblByb3ZpZGVyfSBpbnRlcmZhY2UuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGltcGxlbWVudGluZyB0aGUgc3RhdGljIG1ldGhvZHMgb2Yge0BsaW5rIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbn0KKwkgKiBhbmQgZm9yIHN1cHBvcnRpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgeworCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgY2xhc3MgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgeworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0IFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIHBhcmVudCAhPSBudWxsOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ha2VzIHN1cmUgdGhhdCBvbmUgY29udGVudCB2aWV3ZXIsIGVpdGhlciBmb3IgdGhlIGN1cnJlbnQgcGFnZSBvciB0aGUgb3V0bGluZSB2aWV3LCBpZiBpdCBoYXMgZm9jdXMsCisJICogaXMgdGhlIGN1cnJlbnQgb25lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRWaWV3ZXIoVmlld2VyIHZpZXdlcikgeworCQkvLyBJZiBpdCBpcyBjaGFuZ2luZy4uLgorCQkvLworCQlpZiAoY3VycmVudFZpZXdlciAhPSB2aWV3ZXIpIHsKKwkJCWlmIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgeworCQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgb24gZGVtYW5kLgorCQkJCS8vCisJCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0KKwkJCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQkJCQkvLyBUaGlzIGp1c3Qgbm90aWZpZXMgdGhvc2UgdGhpbmdzIHRoYXQgYXJlIGFmZmVjdGVkIGJ5IHRoZSBzZWN0aW9uLgorCQkJCQkJLy8KKwkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHNlbGVjdGlvbkNoYW5nZWRFdmVudCkgeworCQkJCQkJCXNldFNlbGVjdGlvbihzZWxlY3Rpb25DaGFuZ2VkRXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQkJfQorCQkJCQl9OworCQkJfQorCisJCQkvLyBTdG9wIGxpc3RlbmluZyB0byB0aGUgb2xkIG9uZS4KKwkJCS8vCisJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7CisJCQkJY3VycmVudFZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKKwkJCX0KKworCQkJLy8gU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXcgb25lLgorCQkJLy8KKwkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgeworCQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKKwkJCX0KKworCQkJLy8gUmVtZW1iZXIgaXQuCisJCQkvLworCQkJY3VycmVudFZpZXdlciA9IHZpZXdlcjsKKworCQkJLy8gU2V0IHRoZSBlZGl0b3JzIHNlbGVjdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCB2aWV3ZXIncyBzZWxlY3Rpb24uCisJCQkvLworCQkJc2V0U2VsZWN0aW9uKGN1cnJlbnRWaWV3ZXIgPT0gbnVsbCA/IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkgOiBjdXJyZW50Vmlld2VyLmdldFNlbGVjdGlvbigpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgdmlld2VyIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSVZpZXdlclByb3ZpZGVyfSBpbnRlcmZhY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7CisJCXJldHVybiBjdXJyZW50Vmlld2VyOworCX0KKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlciBhbmQgYWRkcyBhIGxpc3RlbmVyIGFzIHdlbGwgcmVnaXN0ZXJpbmcgdGhlIG1lbnUgZm9yIGV4dGVuc2lvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgeworCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQKKwkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7CisJCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKKwkJTWVudSBtZW51PSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKKwkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOworCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgbmV3IFVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcih2aWV3ZXIpKTsKKworCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSzsKKwkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OworCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgVmlld2VyRHJhZ0FkYXB0ZXIodmlld2VyKSk7CisJCXZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIGNhbGxlZCB0byBsb2FkIGEgcmVzb3VyY2UgaW50byB0aGUgZWRpdGluZyBkb21haW4ncyByZXNvdXJjZSBzZXQgYmFzZWQgb24gdGhlIGVkaXRvcidzIGlucHV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZU1vZGVsKCkgeworCQlVUkkgcmVzb3VyY2VVUkkgPSBFZGl0VUlVdGlsLmdldFVSSShnZXRFZGl0b3JJbnB1dCgpKTsKKwkJRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCS8vIExvYWQgdGhlIHJlc291cmNlIHRocm91Z2ggdGhlIGVkaXRpbmcgZG9tYWluLgorCQkJLy8KKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCB0cnVlKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWV4Y2VwdGlvbiA9IGU7CisJCQlyZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgZmFsc2UpOworCQl9CisKKwkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbik7CisJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCAgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQl9CisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5hZGQocHJvYmxlbUluZGljYXRpb25BZGFwdGVyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgZGlhZ25vc3RpYyBkZXNjcmliaW5nIHRoZSBlcnJvcnMgYW5kIHdhcm5pbmdzIGxpc3RlZCBpbiB0aGUgcmVzb3VyY2UKKwkgKiBhbmQgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gKGlmIGFueSkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERpYWdub3N0aWMgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMoUmVzb3VyY2UgcmVzb3VyY2UsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJaWYgKCFyZXNvdXJjZS5nZXRFcnJvcnMoKS5pc0VtcHR5KCkgfHwgIXJlc291cmNlLmdldFdhcm5pbmdzKCkuaXNFbXB0eSgpKSB7CisJCQlCYXNpY0RpYWdub3N0aWMgYmFzaWNEaWFnbm9zdGljID0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nLmVkaXRvciIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJIDAsCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksIC8vJE5PTi1OTFMtMSQKKwkJCQkJIG5ldyBPYmplY3QgW10geyBleGNlcHRpb24gPT0gbnVsbCA/IChPYmplY3QpcmVzb3VyY2UgOiBleGNlcHRpb24gfSk7CisJCQliYXNpY0RpYWdub3N0aWMubWVyZ2UoRWNvcmVVdGlsLmNvbXB1dGVEaWFnbm9zdGljKHJlc291cmNlLCB0cnVlKSk7CisJCQlyZXR1cm4gYmFzaWNEaWFnbm9zdGljOworCQl9CisJCWVsc2UgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQlyZXR1cm4KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nLmVkaXRvciIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJIDAsCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksIC8vJE5PTi1OTFMtMSQKKwkJCQkJIG5ldyBPYmplY3RbXSB7IGV4Y2VwdGlvbiB9KTsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBEaWFnbm9zdGljLk9LX0lOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBpbnN0YWxsIHlvdXIgb3duIGNvbnRyb2xzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VzKCkgeworCQkvLyBDcmVhdGVzIHRoZSBtb2RlbCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQKKwkJLy8KKwkJY3JlYXRlTW9kZWwoKTsKKworCQkvLyBPbmx5IGNyZWF0ZXMgdGhlIG90aGVyIHBhZ2VzIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBlZGl0ZWQKKwkJLy8KKwkJaWYgKCFnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCS8vIENyZWF0ZSBhIHBhZ2UgZm9yIHRoZSBzZWxlY3Rpb24gdHJlZSB2aWV3LgorCQkJLy8KKwkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGdldENvbnRhaW5lcigpLCBTV1QuTVVMVEkpOworCQkJc2VsZWN0aW9uVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7CisJCQlzZXRDdXJyZW50Vmlld2VyKHNlbGVjdGlvblZpZXdlcik7CisKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCisJCQluZXcgQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yKHNlbGVjdGlvblZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsKKworCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Ioc2VsZWN0aW9uVmlld2VyKTsKKwkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHRyZWUpOworCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisKKwkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJIHNldEFjdGl2ZVBhZ2UoMCk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJLy8gRW5zdXJlcyB0aGF0IHRoaXMgZWRpdG9yIHdpbGwgb25seSBkaXNwbGF5IHRoZSBwYWdlJ3MgdGFiCisJCS8vIGFyZWEgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgcGFnZQorCQkvLworCQlnZXRDb250YWluZXIoKS5hZGRDb250cm9sTGlzdGVuZXIKKwkJCShuZXcgQ29udHJvbEFkYXB0ZXIoKSB7CisJCQkJYm9vbGVhbiBndWFyZCA9IGZhbHNlOworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBldmVudCkgeworCQkJCQlpZiAoIWd1YXJkKSB7CisJCQkJCQlndWFyZCA9IHRydWU7CisJCQkJCQloaWRlVGFicygpOworCQkJCQkJZ3VhcmQgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCSB9KTsKKworCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQkJCSB9CisJCQkgfSk7CisJfQorCisJLyoqCisJICogSWYgdGhlcmUgaXMganVzdCBvbmUgcGFnZSBpbiB0aGUgbXVsdGktcGFnZSBlZGl0b3IgcGFydCwKKwkgKiB0aGlzIGhpZGVzIHRoZSBzaW5nbGUgdGFiIGF0IHRoZSBib3R0b20uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGlkZVRhYnMoKSB7CisJCWlmIChnZXRQYWdlQ291bnQoKSA8PSAxKSB7CisJCQlzZXRQYWdlVGV4dCgwLCAiIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsKKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodCgxKTsKKwkJCQlQb2ludCBwb2ludCA9IGdldENvbnRhaW5lcigpLmdldFNpemUoKTsKKwkJCQlnZXRDb250YWluZXIoKS5zZXRTaXplKHBvaW50LngsIHBvaW50LnkgKyA2KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGFnZSBpbiB0aGUgbXVsdGktcGFnZSBlZGl0b3IgcGFydCwKKwkgKiB0aGlzIHNob3dzIHRoZSB0YWJzIGF0IHRoZSBib3R0b20uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2hvd1RhYnMoKSB7CisJCWlmIChnZXRQYWdlQ291bnQoKSA+IDEpIHsKKwkJCXNldFBhZ2VUZXh0KDAsIGdldFN0cmluZygiX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsKKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodChTV1QuREVGQVVMVCk7CisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7CisJCQkJZ2V0Q29udGFpbmVyKCkuc2V0U2l6ZShwb2ludC54LCBwb2ludC55IC0gNik7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWQgdG8gdHJhY2sgdGhlIGFjdGl2ZSB2aWV3ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgcGFnZUluZGV4KSB7CisJCXN1cGVyLnBhZ2VDaGFuZ2UocGFnZUluZGV4KTsKKworCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsKKwkJCWhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKGNvbnRlbnRPdXRsaW5lUGFnZS5nZXRTZWxlY3Rpb24oKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGhvdyB0aGUgZnJhbWV3b3JrIGRldGVybWluZXMgd2hpY2ggaW50ZXJmYWNlcyB3ZSBpbXBsZW1lbnQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgeworCQlpZiAoa2V5LmVxdWFscyhJQ29udGVudE91dGxpbmVQYWdlLmNsYXNzKSkgeworCQkJcmV0dXJuIHNob3dPdXRsaW5lVmlldygpID8gZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgOiBudWxsOworCQl9CisJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzKSkgeworCQkJcmV0dXJuIGdldFByb3BlcnR5U2hlZXRQYWdlKCk7CisJCX0KKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhJR290b01hcmtlci5jbGFzcykpIHsKKwkJCXJldHVybiB0aGlzOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoa2V5KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgYWNjZXNzZXMgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUgY29udGVudCBvdXRsaW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSUNvbnRlbnRPdXRsaW5lUGFnZSBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSB7CisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgPT0gbnVsbCkgeworCQkJLy8gVGhlIGNvbnRlbnQgb3V0bGluZSBpcyBqdXN0IGEgdHJlZS4KKwkJCS8vCisJCQljbGFzcyBNeUNvbnRlbnRPdXRsaW5lUGFnZSBleHRlbmRzIENvbnRlbnRPdXRsaW5lUGFnZSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCQkJCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKworCQkJCQkvLyBTZXQgdXAgdGhlIHRyZWUgdmlld2VyLgorCQkJCQkvLworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCisJCQkJCS8vIE1ha2Ugc3VyZSBvdXIgcG9wdXBzIHdvcmsuCisJCQkJCS8vCisJCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKGNvbnRlbnRPdXRsaW5lVmlld2VyKTsKKworCQkJCQlpZiAoIWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCQkJICAvLyBTZWxlY3QgdGhlIHJvb3Qgb2JqZWN0IGluIHRoZSB2aWV3LgorCQkJCQkgIC8vCisJCQkJCSAgY29udGVudE91dGxpbmVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIG1ha2VDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwgSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLCBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsKKwkJCQkJc3VwZXIubWFrZUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLCBzdGF0dXNMaW5lTWFuYWdlcik7CisJCQkJCWNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXIgPSBzdGF0dXNMaW5lTWFuYWdlcjsKKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKKwkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKKwkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7CisJCQkJfQorCQkJfQorCisJCQljb250ZW50T3V0bGluZVBhZ2UgPSBuZXcgTXlDb250ZW50T3V0bGluZVBhZ2UoKTsKKworCQkJLy8gTGlzdGVuIHRvIHNlbGVjdGlvbiBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgaXQgaXMgYSBzcGVjaWFsIHdheS4KKwkJCS8vCisJCQljb250ZW50T3V0bGluZVBhZ2UuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCisJCQkJKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJCQkgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2UgaGFuZGxlIHNlbGVjdGlvbnMgY29ycmVjdGx5LgorCQkJCQkgLy8KKwkJCQkJIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJCQkgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQkgfQorCQkJCSB9KTsKKwkJfQorCisJCXJldHVybiBjb250ZW50T3V0bGluZVBhZ2U7CisJfQorCisJLyoqCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBwcm9wZXJ0eSBzaGVldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVByb3BlcnR5U2hlZXRQYWdlIGdldFByb3BlcnR5U2hlZXRQYWdlKCkgeworCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgPT0gbnVsbCkgeworCQkJcHJvcGVydHlTaGVldFBhZ2UgPQorCQkJCW5ldyBFeHRlbmRlZFByb3BlcnR5U2hlZXRQYWdlKGVkaXRpbmdEb21haW4pIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKExpc3Q8Pz4gc2VsZWN0aW9uKSB7CisJCQkJCQlGb3JjaW5nRWRpdG9yLnRoaXMuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0aW9uKTsKKwkJCQkJCUZvcmNpbmdFZGl0b3IudGhpcy5zZXRGb2N1cygpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworCQkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOworCQkJCQl9CisJCQkJfTsKKwkJCXByb3BlcnR5U2hlZXRQYWdlLnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCX0KKworCQlyZXR1cm4gcHJvcGVydHlTaGVldFBhZ2U7CisJfQorCisJLyoqCisJICogVGhpcyBkZWFscyB3aXRoIGhvdyB3ZSB3YW50IHNlbGVjdGlvbiBpbiB0aGUgb3V0bGluZXIgdG8gYWZmZWN0IHRoZSBvdGhlciB2aWV3cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlpZiAoc2VsZWN0aW9uVmlld2VyICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCUl0ZXJhdG9yPD8+IHNlbGVjdGVkRWxlbWVudHMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuaXRlcmF0b3IoKTsKKwkJCWlmIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgeworCQkJCS8vIEdldCB0aGUgZmlyc3Qgc2VsZWN0ZWQgZWxlbWVudC4KKwkJCQkvLworCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzLm5leHQoKTsKKworCQkJCUFycmF5TGlzdDxPYmplY3Q+IHNlbGVjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKwkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnQpOworCQkJCXdoaWxlIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgeworCQkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnRzLm5leHQoKSk7CisJCQkJfQorCisJCQkJLy8gU2V0IHRoZSBzZWxlY3Rpb24gdG8gdGhlIHdpZGdldC4KKwkJCQkvLworCQkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uTGlzdCkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSB0ZXN0cyB0aGUgY29tbWFuZCBzdGFjay4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgeworCQlyZXR1cm4gKChCYXNpY0NvbW1hbmRTdGFjayllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5pc1NhdmVOZWVkZWQoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHNhdmVzIHRoZSBtb2RlbCBmaWxlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworCQkvLyBTYXZlIG9ubHkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBhY3R1YWxseSBjaGFuZ2VkLgorCQkvLworCQlmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7CisJCXNhdmVPcHRpb25zLnB1dChSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRUQsIFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRF9NRU1PUllfQlVGRkVSKTsKKworCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guCisJCS8vCisJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPQorCQkJbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKKwkJCQkvLyBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBnZXRzIGludm9rZWQgd2hlbiB0aGUgb3BlcmF0aW9uIHJ1bnMuCisJCQkJLy8KKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJCQkvLyBTYXZlIHRoZSByZXNvdXJjZXMgdG8gdGhlIGZpbGUgc3lzdGVtLgorCQkJCQkvLworCQkJCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwkJCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSkgeworCQkJCQkJaWYgKChmaXJzdCB8fCAhcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkgfHwgaXNQZXJzaXN0ZWQocmVzb3VyY2UpKSAmJiAhZWRpdGluZ0RvbWFpbi5pc1JlYWRPbmx5KHJlc291cmNlKSkgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCWxvbmcgdGltZVN0YW1wID0gcmVzb3VyY2UuZ2V0VGltZVN0YW1wKCk7CisJCQkJCQkJCXJlc291cmNlLnNhdmUoc2F2ZU9wdGlvbnMpOworCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VGltZVN0YW1wKCkgIT0gdGltZVN0YW1wKSB7CisJCQkJCQkJCQlzYXZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQkJCQkJCX0KKwkJCQkJCQlmaXJzdCA9IGZhbHNlOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfTsKKworCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOworCQl0cnkgeworCQkJLy8gVGhpcyBydW5zIHRoZSBvcHRpb25zLCBhbmQgc2hvd3MgcHJvZ3Jlc3MuCisJCQkvLworCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSkucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOworCisJCQkvLyBSZWZyZXNoIHRoZSBuZWNlc3Nhcnkgc3RhdGUuCisJCQkvLworCQkJKChCYXNpY0NvbW1hbmRTdGFjayllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5zYXZlSXNEb25lKCk7CisJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCS8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHRoYXQgc2hvdWxkbid0LgorCQkJLy8KKwkJCUZvcmNpbmdFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOworCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB3aGV0aGVyIHNvbWV0aGluZyBoYXMgYmVlbiBwZXJzaXN0ZWQgdG8gdGhlIFVSSSBvZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBVUkkgY29udmVydGVyIGZyb20gdGhlIGVkaXRvcidzIHJlc291cmNlIHNldCB0byB0cnkgdG8gb3BlbiBhbiBpbnB1dCBzdHJlYW0uIAorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzUGVyc2lzdGVkKFJlc291cmNlIHJlc291cmNlKSB7CisJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisJCXRyeSB7CisJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0ocmVzb3VyY2UuZ2V0VVJJKCkpOworCQkJaWYgKHN0cmVhbSAhPSBudWxsKSB7CisJCQkJcmVzdWx0ID0gdHJ1ZTsKKwkJCQlzdHJlYW0uY2xvc2UoKTsKKwkJCX0KKwkJfQorCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gSWdub3JlCisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIHRydWUgYmVjYXVzZSBpdCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFRoaXMgYWxzbyBjaGFuZ2VzIHRoZSBlZGl0b3IncyBpbnB1dC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKKwkJU2F2ZUFzRGlhbG9nIHNhdmVBc0RpYWxvZyA9IG5ldyBTYXZlQXNEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOworCQlzYXZlQXNEaWFsb2cub3BlbigpOworCQlJUGF0aCBwYXRoID0gc2F2ZUFzRGlhbG9nLmdldFJlc3VsdCgpOworCQlpZiAocGF0aCAhPSBudWxsKSB7CisJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOworCQkJaWYgKGZpbGUgIT0gbnVsbCkgeworCQkJCWRvU2F2ZUFzKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKSwgbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVBcyhVUkkgdXJpLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKKwkJKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLnNldFVSSSh1cmkpOworCQlzZXRJbnB1dFdpdGhOb3RpZnkoZWRpdG9ySW5wdXQpOworCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOworCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9CisJCQlnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSAhPSBudWxsID8KKwkJCQlnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5nZXRQcm9ncmVzc01vbml0b3IoKSA6CisJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKKwkJZG9TYXZlKHByb2dyZXNzTW9uaXRvcik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgeworCQl0cnkgeworCQkJaWYgKG1hcmtlci5nZXRUeXBlKCkuZXF1YWxzKEVWYWxpZGF0b3IuTUFSS0VSKSkgeworCQkJCVN0cmluZyB1cmlBdHRyaWJ1dGUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKEVWYWxpZGF0b3IuVVJJX0FUVFJJQlVURSwgbnVsbCk7CisJCQkJaWYgKHVyaUF0dHJpYnV0ZSAhPSBudWxsKSB7CisJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaUF0dHJpYnV0ZSk7CisJCQkJCUVPYmplY3QgZU9iamVjdCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7CisJCQkJCWlmIChlT2JqZWN0ICE9IG51bGwpIHsKKwkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9ucy5zaW5nbGV0b24oZWRpdGluZ0RvbWFpbi5nZXRXcmFwcGVyKGVPYmplY3QpKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQlGb3JjaW5nRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHN0YXJ0dXAuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKKwkJc2V0U2l0ZShzaXRlKTsKKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKKwkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsKKwkJc2l0ZS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7CisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJZ2V0Q29udHJvbChnZXRBY3RpdmVQYWdlKCkpLnNldEZvY3VzKCk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byByZXR1cm4gdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7CisJCXJldHVybiBlZGl0b3JTZWxlY3Rpb247CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gc2V0IHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCisJICogQ2FsbGluZyB0aGlzIHJlc3VsdCB3aWxsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQllZGl0b3JTZWxlY3Rpb24gPSBzZWxlY3Rpb247CisKKwkJZm9yIChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyIDogc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycykgeworCQkJbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOworCQl9CisJCXNldFN0YXR1c0xpbmVNYW5hZ2VyKHNlbGVjdGlvbik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZU1hbmFnZXIoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyID0gY3VycmVudFZpZXdlciAhPSBudWxsICYmIGN1cnJlbnRWaWV3ZXIgPT0gY29udGVudE91dGxpbmVWaWV3ZXIgPworCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA6IGdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOworCisJCWlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKSB7CisJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCQlDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikudG9MaXN0KCk7CisJCQkJc3dpdGNoIChjb2xsZWN0aW9uLnNpemUoKSkgeworCQkJCQljYXNlIDA6IHsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTm9PYmplY3RTZWxlY3RlZCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAxOiB7CisJCQkJCQlTdHJpbmcgdGV4dCA9IG5ldyBBZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3IoYWRhcHRlckZhY3RvcnkpLmdldFRleHQoY29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkIiwgdGV4dCkpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlkZWZhdWx0OiB7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQiLCBJbnRlZ2VyLnRvU3RyaW5nKGNvbGxlY3Rpb24uc2l6ZSgpKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoIiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHRoZSBwbHVnaW4ncyBwbHVnaW4ucHJvcGVydGllcyBmaWxlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQlyZXR1cm4gRm9yY2luZ0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHBsdWdpbi5wcm9wZXJ0aWVzLCBtYWtpbmcgYSBzdWJzdGl0dXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEpIHsKKwkJcmV0dXJuIEZvcmNpbmdFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSwgbmV3IE9iamVjdCBbXSB7IHMxIH0pOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXJ9IHRvIGhlbHAgZmlsbCB0aGUgY29udGV4dCBtZW51cyB3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgRWRpdCBtZW51LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJKChJTWVudUxpc3RlbmVyKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpKS5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7CisJCXJldHVybiAoRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgeworCQlyZXR1cm4gZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3Rpb25CYXJzKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKKworCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworCisJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKKworCQlpZiAoZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSB0aGlzKSB7CisJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihudWxsKTsKKwkJfQorCisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBvdXRsaW5lIHZpZXcgc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93T3V0bGluZVZpZXcoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJlc2VudGF0aW9uL0ZvcmNpbmdEaXNlYXNlTW9kZWxBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJlc2VudGF0aW9uL0ZvcmNpbmdEaXNlYXNlTW9kZWxBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY4MTIwOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9wcmVzZW50YXRpb24vRm9yY2luZ0Rpc2Vhc2VNb2RlbEFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nLnByZXNlbnRhdGlvbjsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmRpc2Vhc2Vtb2RlbHByb3BlcnR5ZWRpdG9yLkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZGlzZWFzZW1vZGVscHJvcGVydHllZGl0b3IuRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5EaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworCisvKioKKyAqICAKKyAqIEFkYXB0ZXIgZm9yIFByb3BlcnR5IEVkaXRvcgorICoKKyAqLworcHVibGljIGNsYXNzIEZvcmNpbmdEaXNlYXNlTW9kZWxBZGFwdGVyIGV4dGVuZHMKKwkJRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyIHsKKworCS8qKgorCSAqIAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvciBjcmVhdGVEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcigKKwkJCURpc2Vhc2VNb2RlbFByb3BlcnR5Q29tcG9zaXRlIGRpc2Vhc2VNb2RlbFByb3BlcnR5Q29tcG9zaXRlLAorCQkJaW50IHN0eWxlLCBNb2RpZnlMaXN0ZW5lciBwcm9qZWN0VmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB7CisJCXJldHVybiBuZXcgRm9yY2luZ0Rpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yKAorCQkJCWRpc2Vhc2VNb2RlbFByb3BlcnR5Q29tcG9zaXRlLCBzdHlsZSwKKwkJCQkoRGlzZWFzZU1vZGVsKSBnZXRUYXJnZXQoKSwgcHJvamVjdFZhbGlkYXRvciwgcHJvamVjdCk7CisJfSAvLyBjcmVhdGVEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcgorCit9IC8vIEZvcmNpbmdEaXNlYXNlTW9kZWxBZGFwdGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJlc2VudGF0aW9uL0ZvcmNpbmdEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9mb3JjaW5nL3ByZXNlbnRhdGlvbi9Gb3JjaW5nRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjFhNjAyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9mb3JjaW5nL3ByZXNlbnRhdGlvbi9Gb3JjaW5nRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5wcmVzZW50YXRpb247CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5Gb3JjaW5nRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5mb3JjaW5nLkZvcmNpbmdQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5kaXNlYXNlbW9kZWxwcm9wZXJ0eWVkaXRvci5EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuRGlzZWFzZVdpemFyZE1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworCisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGb3JjaW5nRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IgZXh0ZW5kcworCQlEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvciB7CisJCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqIEBwYXJhbSBkaXNlYXNlTW9kZWwKKwkgKiBAcGFyYW0gcHJvamVjdFZhbGlkYXRvcgorCSAqLworCXB1YmxpYyBGb3JjaW5nRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwKKwkJCWludCBzdHlsZSwgRGlzZWFzZU1vZGVsIGRpc2Vhc2VNb2RlbCwKKwkJCU1vZGlmeUxpc3RlbmVyIHByb2plY3RWYWxpZGF0b3IsIElQcm9qZWN0IHByb2plY3QpIHsKKwkJc3VwZXIocGFyZW50LCBzdHlsZSwgZGlzZWFzZU1vZGVsLCBwcm9qZWN0VmFsaWRhdG9yLCBwcm9qZWN0KTsKKwl9IC8vIEZvcmNpbmdEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuU3RhbmRhcmREaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvciNwb3B1bGF0ZShvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHBvcHVsYXRlKERpc2Vhc2VNb2RlbCBkaXNlYXNlTW9kZWwpIHsKKwkJc3VwZXIucG9wdWxhdGUoZGlzZWFzZU1vZGVsKTsKKwkJCisJCWZvciAoZmluYWwgTWFwLkVudHJ5PEVTdHJ1Y3R1cmFsRmVhdHVyZSwgVGV4dD4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgeworCQkJZG91YmxlIGRWYWwgPSAwLjA7CisJCQlpbnQgaVZhbCA9IDA7CisJCQlzd2l0Y2ggKGVudHJ5LmdldEtleSgpLmdldEZlYXR1cmVJRCgpKSB7CisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkZPUkNJTkdfRElTRUFTRV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9GTE9PUjoKKwkJCQlkVmFsID0gKG5ldyBEb3VibGUoZW50cnkuZ2V0VmFsdWUoKS5nZXRUZXh0KCkpKS5kb3VibGVWYWx1ZSgpOworCQkJCSgoRm9yY2luZ0Rpc2Vhc2VNb2RlbCkgZGlzZWFzZU1vZGVsKS5zZXRTZWFzb25hbE1vZHVsYXRpb25GbG9vcihkVmFsKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRm9yY2luZ1BhY2thZ2UuRk9SQ0lOR19ESVNFQVNFX01PREVMX19TRUFTT05BTF9NT0RVTEFUSU9OX0VYUE9ORU5UOgorCQkJCWlWYWwgPSAobmV3IEludGVnZXIoZW50cnkuZ2V0VmFsdWUoKS5nZXRUZXh0KCkpKS5pbnRWYWx1ZSgpOworCQkJCSgoRm9yY2luZ0Rpc2Vhc2VNb2RlbCkgZGlzZWFzZU1vZGVsKS5zZXRTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudChpVmFsKTsKKwkJCQlicmVhazsJCisJCQljYXNlIEZvcmNpbmdQYWNrYWdlLkZPUkNJTkdfRElTRUFTRV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0Q6CisJCQkJZFZhbCA9IChuZXcgRG91YmxlKGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpKSkuZG91YmxlVmFsdWUoKTsKKwkJCQkoKEZvcmNpbmdEaXNlYXNlTW9kZWwpIGRpc2Vhc2VNb2RlbCkKKwkJCQkJCS5zZXRNb2R1bGF0aW9uUGVyaW9kKGRWYWwpOworCQkJCWJyZWFrOworCQkJY2FzZSBGb3JjaW5nUGFja2FnZS5GT1JDSU5HX0RJU0VBU0VfTU9ERUxfX01PRFVMQVRJT05fUEhBU0VfU0hJRlQ6CisJCQkJZFZhbCA9IChuZXcgRG91YmxlKGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpKSkuZG91YmxlVmFsdWUoKTsKKwkJCQkoKEZvcmNpbmdEaXNlYXNlTW9kZWwpIGRpc2Vhc2VNb2RlbCkKKwkJCQkJCS5zZXRNb2R1bGF0aW9uUGhhc2VTaGlmdChkVmFsKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9IC8vIHN3aXRjaAorCQl9IC8vIGZvciBlYWNoIE1hcC5lbnRyeQorCQkKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5TdGFuZGFyZERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yI3ZhbGlkYXRlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHN1cGVyLnZhbGlkYXRlKCk7CisJCS8vIERpc2Vhc2UgRGF0YSBEaXJlY3Rvcnkgb3IgRmlsZQorCQlpZiAocmV0VmFsdWUpIHsKKwkJCS8vIFllcworCQkJZmluYWwgVGV4dCB0ZXh0ID0gbWFwCisJCQkJCS5nZXQoRm9yY2luZ1BhY2thZ2UuTGl0ZXJhbHMuRk9SQ0lOR19ESVNFQVNFX01PREVMX19NT0RVTEFUSU9OX1BFUklPRCk7CisJCQlTdHJpbmcgc1ZhbCA9IHRleHQuZ2V0VGV4dCgpOworCQkJdHJ5IHsKKwkJCQkvLyBUT0RPIGNoZWNrIGlmIGFsbCB0aHJlZSBwYXJhbXMgYXJlIGEgdmFsaWQgbnVtYmVyCisJCQkJbmV3IERvdWJsZShzVmFsKTsKKwkJCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCWVycm9yTWVzc2FnZSA9IERpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5EaXpXaXpFcnIyMCIpOyAvLyROT04tTkxTLTEkCisJCQl9IC8vIGlmCisJCX0gLy8gaWYKKwkJCisJCXJldHVybiByZXRWYWx1ZTsKKwl9CisJCit9IC8vIEZvcmNpbmdEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9mb3JjaW5nL3ByZXNlbnRhdGlvbi9Gb3JjaW5nRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9mb3JjaW5nL3ByZXNlbnRhdGlvbi9Gb3JjaW5nRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZDM5YTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJlc2VudGF0aW9uL0ZvcmNpbmdEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5wcmVzZW50YXRpb247CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcudXRpbC5Gb3JjaW5nQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5kaXNlYXNlbW9kZWxwcm9wZXJ0eWVkaXRvci5EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5kaXNlYXNlbW9kZWxwcm9wZXJ0eWVkaXRvci5EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5OworCisvKioKKyAqIEBhdXRob3IgamFtZXMKKyAqIAorICovCitwdWJsaWMgY2xhc3MgRm9yY2luZ0Rpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkgZXh0ZW5kcworCQlGb3JjaW5nQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cworCQlEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5IHsKKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBGb3JjaW5nRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCS5hZGRBZGFwdGVyRmFjdG9yeSh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVGb3JjaW5nRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBGb3JjaW5nRGlzZWFzZU1vZGVsQWRhcHRlcigpOworCX0KKworCS8qKgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcudXRpbC5Gb3JjaW5nQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyLmNsYXNzCisJCQkJfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9Cit9IC8vIEZvcmNpbmdEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJlc2VudGF0aW9uL0ZvcmNpbmdEaXNlYXNlV2l6YXJkTWVzc2FnZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9wcmVzZW50YXRpb24vRm9yY2luZ0Rpc2Vhc2VXaXphcmRNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OWU4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJlc2VudGF0aW9uL0ZvcmNpbmdEaXNlYXNlV2l6YXJkTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvLyBFeGFtcGxlRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50czsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRoZSBSZXNvdXJjZSBCdW5kbGUgZm9yIHRoaXMgcGFja2FnZS4KKyAqLworcHVibGljIGNsYXNzIEZvcmNpbmdEaXNlYXNlV2l6YXJkTWVzc2FnZXMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IENvbnN0YW50cy5JRF9ST09UCisJCQkrICIudWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nLnByZXNlbnRhdGlvbi5mb3JjaW5nZGlzZWFzZW1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKKwkJCS5nZXRCdW5kbGUoQlVORExFX05BTUUpOworCisJLyoqCisJICogCisJICovCisJcHVibGljIEZvcmNpbmdEaXNlYXNlV2l6YXJkTWVzc2FnZXMoKSB7CisJCS8vIGVtcHR5CisJfQorCisJLyoqCisJICogQHBhcmFtIGtleQorCSAqICAgICAgICAgICAgdGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UKKwkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSBrZXkKKwkgKiBAdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBpZiB0aGUga2V5IGNhbm5vdCBiZSBmb3VuZAorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhmaW5hbCBTdHJpbmcga2V5KSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9ueworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwl9IC8vIGdldFN0cmluZworfSAvLyBGb3JjaW5nRGlzZWFzZVdpemFyZE1lc3NhZ2VzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJlc2VudGF0aW9uL0ZvcmNpbmdFZGl0b3JQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9wcmVzZW50YXRpb24vRm9yY2luZ0VkaXRvclBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyM2VmN2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJlc2VudGF0aW9uL0ZvcmNpbmdFZGl0b3JQbHVnaW4uamF2YQpAQCAtMCwwICsxLDExNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5FTUZQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLkVjbGlwc2VVSVBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRWNvcmVFZGl0UGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db3JlRWRpdFBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuZWRnZXMucHJvdmlkZXIuRGVmaW5pdGlvbnNFZGl0UGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLkRpc2Vhc2Vtb2RlbHNFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdGFuZGFyZEVkaXRQbHVnaW47CisKKy8qKgorICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBGb3JjaW5nIGVkaXRvciBwbHVnaW4uCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKK3B1YmxpYyBmaW5hbCBjbGFzcyBGb3JjaW5nRWRpdG9yUGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIHsKKwkvKioKKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBGb3JjaW5nRWRpdG9yUGx1Z2luIElOU1RBTkNFID0gbmV3IEZvcmNpbmdFZGl0b3JQbHVnaW4oKTsKKwkKKwkvKioKKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gcGx1Z2luOworCisJLyoqCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRm9yY2luZ0VkaXRvclBsdWdpbigpIHsKKwkJc3VwZXIKKwkJCShuZXcgUmVzb3VyY2VMb2NhdG9yIFtdIHsKKwkJCQlEaXNlYXNlbW9kZWxzRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJCQlDb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJCQlFY29yZUVkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCQkJRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkJCVN0YW5kYXJkRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJCX0pOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisJCisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4geworCQkvKioKKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKKwkJCXN1cGVyKCk7CisJCisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgorCQkJLy8KKwkJCXBsdWdpbiA9IHRoaXM7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9wcmVzZW50YXRpb24vRm9yY2luZ1Byb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9mb3JjaW5nL3ByZXNlbnRhdGlvbi9Gb3JjaW5nUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5NzljMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9wcmVzZW50YXRpb24vRm9yY2luZ1Byb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvLyBFeGFtcGxlUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy51dGlsLkZvcmNpbmdBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBGb3JjaW5nUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKKwkJRm9yY2luZ0FkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMKKwkJUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LCBJU3RhcnR1cCB7CisKKwlQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKKworCS8qKgorCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgRm9yY2luZ1Byb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkZEFkYXB0ZXJGYWN0b3J5KHRoaXMpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXAjZWFybHlTdGFydHVwKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBlYXJseVN0YXJ0dXAoKSB7CisJCS8vIE5vdGhpbmcgdG8gZG8gaGVyZS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBoYXMKKwkJLy8gcnVuIHdoaWNoIGlzIHRoZSBlbnRpcmUgcG9pbnQgb2YgZWFybHkgYWN0aXZhdGlvbiB3aGljaCBjYXVzZXMgdGhlCisJCS8vIGZhY3RvcnkgdG8gYmUgYWRkZWQgdG8gdGhlIFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGwjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSkKKwkJCQl8fCB0eXBlID09IFByb3BlcnR5U3RyaW5nUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy51dGlsLkZvcmNuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZUV4YW1wbGVEaXNlYXNlTW9kZWxBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVGb3JjaW5nRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJLy8gSGF2ZSB3ZSBjcmVhdGVkIG9uZSBiZWZvcmU/CisJCWlmIChhZGFwdGVyID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQlhZGFwdGVyID0gbmV3ICBTdGFuZGFyZFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5TdGFuZGFyZFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyKCkgeworCisJCQkJLyoqCisJCQkJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkJCQkgKiBAcmV0dXJuIHRoZSBOTFMnZCBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCisJCQkJICovCisJCQkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQkJCQl0cnkgeworCQkJCQkJcmV0dXJuIEZvcmNpbmdEaXNlYXNlV2l6YXJkTWVzc2FnZXMKKwkJCQkJCQkJLmdldFN0cmluZygoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZGVzY3JpcHRvcgorCQkJCQkJCQkJCS5nZXRGZWF0dXJlKG51bGwpKS5nZXROYW1lKCkpOworCQkJCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCQkJCQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5TmFtZShkZXNjcmlwdG9yKTsKKwkJCQkJfQorCQkJCX0gLy8gZ2V0UHJvcGVydHlOYW1lCisKKwkJCQkvKioKKwkJCQkgKiBAcGFyYW0gZGVzY3JpcHRvcgorCQkJCSAqIEByZXR1cm4gdGhlIE5MUydkIHRvb2wgdGlwIHRleHQgdGhhdCBkZXNjcmliZXMgdGhlIHByb3BlcnR5CisJCQkJICovCisJCQkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVRvb2xUaXAoCisJCQkJCQlJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisJCQkJCXRyeSB7CisJCQkJCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGRlc2NyaXB0b3IKKwkJCQkJCQkJLmdldEZlYXR1cmUobnVsbCk7CisJCQkJCQlyZXR1cm4gRm9yY2luZ0Rpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoZmVhdHVyZQorCQkJCQkJCQkuZ2V0TmFtZSgpCisJCQkJCQkJCSsgVFRfU1VGRklYKTsKKwkJCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eVRvb2xUaXAoZGVzY3JpcHRvcik7CisJCQkJCX0KKwkJCQl9IC8vIGdldFByb3BlcnR5VG9vbFRpcAorCisJCQkJLyoqCisJCQkJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkJCQkgKiBAcmV0dXJuIHRoZSBOTFMnZCB0ZXh0IHRoYXQgcmVwcmVzZW50cyB0aGUgdW5pdHMgb2YgdGhlCisJCQkJICogICAgICAgICBwcm9wZXJ0eQorCQkJCSAqLworCQkJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlVbml0cygKKwkJCQkJCUlJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZGVzY3JpcHRvcgorCQkJCQkJCQkuZ2V0RmVhdHVyZShudWxsKTsKKwkJCQkJCXJldHVybiBGb3JjaW5nRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZyhmZWF0dXJlCisJCQkJCQkJCS5nZXROYW1lKCkKKwkJCQkJCQkJKyBVTklUX1NVRkZJWCk7CisJCQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlVbml0cyhkZXNjcmlwdG9yKTsKKwkJCQkJfQorCQkJCX0gLy8gZ2V0UHJvcGVydHlVbml0cworCQkJfTsKKwkJfSAvLyBpZiB3ZSBkaWRuJ3QgY3JlYXRlIG9uZSBiZWZvcmUKKwkJcmV0dXJuIGFkYXB0ZXI7CisJfS8vIGNyZWF0ZUZvcmNpbmdEaXNlYXNlTW9kZWxBZGFwdGVyKCkKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcudXRpbC5Gb3JjbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVFeGFtcGxlRGlzZWFzZU1vZGVsQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlR2F1c3NpYW5Gb3JjaW5nRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJLy8gSGF2ZSB3ZSBjcmVhdGVkIG9uZSBiZWZvcmU/CisJCWlmIChhZGFwdGVyID09IG51bGwpIHsKKwkJCWFkYXB0ZXIgPSAoU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlciljcmVhdGVGb3JjaW5nRGlzZWFzZU1vZGVsQWRhcHRlcigpOworCQl9IC8vIGlmIHdlIGRpZG4ndCBjcmVhdGUgb25lIGJlZm9yZQorCQlyZXR1cm4gYWRhcHRlcjsKKwl9Ly8gY3JlYXRlRm9yY2luZ0Rpc2Vhc2VNb2RlbEFkYXB0ZXIoKQorfSAvLyBGb3JjaW5nUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJlc2VudGF0aW9uL2ZvcmNpbmdkaXNlYXNlbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5mb3JjaW5nL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZm9yY2luZy9wcmVzZW50YXRpb24vZm9yY2luZ2Rpc2Vhc2VtZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ODE0MmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2ZvcmNpbmcvcHJlc2VudGF0aW9uL2ZvcmNpbmdkaXNlYXNlbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDQxIEBACisjIGRpc2Vhc2V3aXphcmRtZXNzYWdlcy5wcm9wZXJ0aWVzCisjCisjLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc2Vhc29uYWxNb2R1bGF0aW9uID0gU2Vhc29uYWwgTW9kdWxhdGlvbgorc2Vhc29uYWxNb2R1bGF0aW9uVFQgPSBTZWFzb25hbCBNb2R1bGF0aW9uCitzZWFzb25hbE1vZHVsYXRpb25VTklUID0gRGF5cworCittb2R1bGF0aW9uUGVyaW9kID0gTW9kdWxhdGlvbiBQZXJpb2QKK21vZHVsYXRpb25QZXJpb2RUVCA9IE1vZHVsYXRpb24gUGVyaW9kCittb2R1bGF0aW9uUGVyaW9kVU5JVCA9IERheXMKKworbW9kdWxhdGlvblBoYXNlU2hpZnQgPSBNb2R1bGF0aW9uIFBoYXNlIFNoaWZ0Cittb2R1bGF0aW9uUGhhc2VTaGlmdFRUID0gTW9kdWxhdGlvbiBQaGFzZSBTaGlmdAorbW9kdWxhdGlvblBoYXNlU2hpZnRVTklUID0gRGF5cworCitzZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudCA9IFNlYXNvbmFsIE1vZHVsYXRpb24gRXhwb25lbnQKK3NlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50VFQgPSBFeHBvbmVudCB1c2VkIGZvciBzZWFzb25hbCBtb2R1bGF0aW9uIGZvcmNpbmcKK3NlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50VU5JVCA9IAorCitzZWFzb25hbE1vZHVsYXRpb25GbG9vciA9IFNlYXNvbmFsIE1vZHVsYXRpb24gRmxvb3IKK3NlYXNvbmFsTW9kdWxhdGlvbkZsb29yVFQgPSBGbG9vciBvciBtaW5pbXVtIHRyYW5zbWlzc2lvbiBsZXZlbCB3aXRob3V0IHNlYXNvbmFsIG1vZHVsYXRpb24KK3NlYXNvbmFsTW9kdWxhdGlvbkZsb29yVU5JVCA9IAorCitzaWdtYTIgPSBTaWdtYV4yCitzaWdtYTJUVCA9IFNpZ21hIHNxdWFyZWQKK3NpZ21hMlVOSVQgPSAKKworbW9kdWxhdGlvbkZsb29yID0gU2Vhc29uYWwgTW9kdWxhdGlvbiBGbG9vcgorbW9kdWxhdGlvbkZsb29yVFQgPSBGbG9vciBvciBtaW5pbXVtIHRyYW5zbWlzc2lvbiBsZXZlbCB3aXRob3V0IHNlYXNvbmFsIG1vZHVsYXRpb24KK21vZHVsYXRpb25GbG9vclVOSVQgPSAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmMDI0ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8Y2xhc3NwYXRoPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQorPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNTczYTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8cHJvamVjdERlc2NyaXB0aW9uPg0KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWw8L25hbWU+DQorCTxjb21tZW50PjwvY29tbWVudD4NCisJPHByb2plY3RzPg0KKwk8L3Byb2plY3RzPg0KKwk8YnVpbGRTcGVjPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCTwvYnVpbGRTcGVjPg0KKwk8bmF0dXJlcz4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQorCTwvbmF0dXJlcz4NCis8L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2IyYmZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDggQEAKKyNXZWQgSnVsIDE1IDEyOjA3OjExIFBEVCAyMDA5DQorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyZDhkZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDI1IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjANCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lDQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmVkaXRvcjtzaW5nbGV0b246PXRydWUNCitCdW5kbGUtVmVyc2lvbjogMS4wLjEucXVhbGlmaWVyDQorQnVuZGxlLUNsYXNzUGF0aDogLg0KK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5wcmVzZW50YXRpb24uR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4kSW1wbGVtZW50YXRpb24NCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lDQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5wcmVzZW50YXRpb24sDQorIG9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5wcmVzZW50YXRpb24NCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KKyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsO3Zpc2liaWxpdHk6PXJlZXhwb3J0LA0KKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO3Zpc2liaWxpdHk6PXJlZXhwb3J0LA0KKyBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2UudWkuaWRlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LA0KKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHM7dmlzaWJpbGl0eTo9cmVleHBvcnQsDQorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsDQorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnM7dmlzaWJpbGl0eTo9cmVleHBvcnQsDQorIG9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscywNCisgb3JnLmVjbGlwc2Uuc3RlbS51aQ0KK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDBiMjBhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNCBAQAorDQorIyA8Y29weXJpZ2h0Pg0KKyMgPC9jb3B5cmlnaHQ+DQorIw0KKyMgJElkJA0KKw0KK2Jpbi5pbmNsdWRlcyA9IC4sXA0KKyAgICAgICAgICAgICAgIGljb25zLyxcDQorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcw0KK2phcnMuY29tcGlsZS5vcmRlciA9IC4NCitzb3VyY2UuLiA9IHNyYy8NCitvdXRwdXQuLiA9IGJpbi8NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvaWNvbnMvZnVsbC9vYmoxNi9HbG9iYWxpbmZsdWVuemFtb2RlbE1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvaWNvbnMvZnVsbC9vYmoxNi9HbG9iYWxpbmZsdWVuemFtb2RlbE1vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0MDRlNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9pY29ucy9mdWxsL29iajE2L0dsb2JhbGluZmx1ZW56YW1vZGVsTW9kZWxGaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvaWNvbnMvZnVsbC9vYmoxNi9UaHVtYnMuZGIgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvaWNvbnMvZnVsbC9vYmoxNi9UaHVtYnMuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3ZDYxNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9pY29ucy9mdWxsL29iajE2L1RodW1icy5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvaWNvbnMvZnVsbC93aXpiYW4vTmV3R2xvYmFsaW5mbHVlbnphbW9kZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL2ljb25zL2Z1bGwvd2l6YmFuL05ld0dsb2JhbGluZmx1ZW56YW1vZGVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTc0M2NlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL2ljb25zL2Z1bGwvd2l6YmFuL05ld0dsb2JhbGluZmx1ZW56YW1vZGVsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzMTgzNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDU3IEBACisNCisjIDxjb3B5cmlnaHQ+DQorIyA8L2NvcHlyaWdodD4NCisjDQorIyAkSWQkDQorDQorcGx1Z2luTmFtZSA9IFNURU0gR2xvYmFsIEluZmx1ZW56YSBEaXNlYXNlIE1vZGVsIFVJDQorcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCisNCitfVUlfR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JfbWVudSA9ICZHbG9iYWxpbmZsdWVuemFtb2RlbCBFZGl0b3INCisNCitfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtID0gJk5ldyBDaGlsZA0KK19VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSA9IE4mZXcgU2libGluZw0KKw0KK19VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtID0gU2hvdyAmUHJvcGVydGllcyBWaWV3DQorX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtID0gJlJlZnJlc2gNCisNCitfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCA9IFNlbGVjdGlvbg0KK19VSV9QYXJlbnRQYWdlX2xhYmVsID0gUGFyZW50DQorX1VJX0xpc3RQYWdlX2xhYmVsID0gTGlzdA0KK19VSV9UcmVlUGFnZV9sYWJlbCA9IFRyZWUNCitfVUlfVGFibGVQYWdlX2xhYmVsID0gVGFibGUNCitfVUlfVHJlZVdpdGhDb2x1bW5zUGFnZV9sYWJlbCA9IFRyZWUgd2l0aCBDb2x1bW5zDQorX1VJX09iamVjdENvbHVtbl9sYWJlbCA9IE9iamVjdA0KK19VSV9TZWxmQ29sdW1uX2xhYmVsID0gU2VsZg0KKw0KK19VSV9Ob09iamVjdFNlbGVjdGVkID0gU2VsZWN0ZWQgTm90aGluZw0KK19VSV9TaW5nbGVPYmplY3RTZWxlY3RlZCA9IFNlbGVjdGVkIE9iamVjdDogezB9DQorX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQgPSBTZWxlY3RlZCB7MH0gT2JqZWN0cw0KKw0KK19VSV9PcGVuRWRpdG9yRXJyb3JfbGFiZWwgPSBPcGVuIEVkaXRvcg0KKw0KK19VSV9XaXphcmRfY2F0ZWdvcnkgPSBFeGFtcGxlIEVNRiBNb2RlbCBDcmVhdGlvbiBXaXphcmRzDQorDQorX1VJX0NyZWF0ZU1vZGVsRXJyb3JfbWVzc2FnZSA9IFByb2JsZW1zIGVuY291bnRlcmVkIGluIGZpbGUgInswfSINCisNCitfVUlfR2xvYmFsaW5mbHVlbnphbW9kZWxNb2RlbFdpemFyZF9sYWJlbCA9IEdsb2JhbGluZmx1ZW56YW1vZGVsIE1vZGVsDQorX1VJX0dsb2JhbGluZmx1ZW56YW1vZGVsTW9kZWxXaXphcmRfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgR2xvYmFsaW5mbHVlbnphbW9kZWwgbW9kZWwNCisNCitfVUlfR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JfbGFiZWwgPSBHbG9iYWxpbmZsdWVuemFtb2RlbCBNb2RlbCBFZGl0b3INCisNCitfVUlfR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlID0gTXkNCitfVUlfR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbnMgPSBnbG9iYWxpbmZsdWVuemFtb2RlbA0KKw0KK19VSV9XaXphcmRfbGFiZWwgPSBOZXcNCisNCitfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbiA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gJycuezB9JycNCitfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbnMgPSBUaGUgZmlsZSBuYW1lIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zOiB7MH0NCisNCitfVUlfTW9kZWxPYmplY3QgPSAmTW9kZWwgT2JqZWN0DQorX1VJX1hNTEVuY29kaW5nID0gJlhNTCBFbmNvZGluZw0KK19VSV9YTUxFbmNvZGluZ0Nob2ljZXMgPSBVVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQ0KK19VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb24gPSBTZWxlY3QgYSBtb2RlbCBvYmplY3QgdG8gY3JlYXRlDQorDQorX1VJX0ZpbGVDb25mbGljdF9sYWJlbCA9IEZpbGUgQ29uZmxpY3QNCitfV0FSTl9GaWxlQ29uZmxpY3QgPSBUaGVyZSBhcmUgdW5zYXZlZCBjaGFuZ2VzIHRoYXQgY29uZmxpY3Qgd2l0aCBjaGFuZ2VzIG1hZGUgb3V0c2lkZSB0aGUgZWRpdG9yLiAgRG8geW91IHdpc2ggdG8gZGlzY2FyZCB0aGlzIGVkaXRvcidzIGNoYW5nZXM/DQorDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmJhNWMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3BsdWdpbi54bWwKQEAgLTAsMCArMSw0NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+DQorDQorPCEtLQ0KKyA8Y29weXJpZ2h0Pg0KKyA8L2NvcHlyaWdodD4NCisNCisgJElkJA0KKy0tPg0KKw0KKzxwbHVnaW4+DQorDQorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+DQorICAgICAgPGNhdGVnb3J5DQorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5XaXphcmQuY2F0ZWdvcnkuSUQiDQorICAgICAgICAgICAgbmFtZT0iJV9VSV9XaXphcmRfY2F0ZWdvcnkiLz4NCisgICAgICA8d2l6YXJkDQorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5wcmVzZW50YXRpb24uR2xvYmFsaW5mbHVlbnphbW9kZWxNb2RlbFdpemFyZElEIg0KKyAgICAgICAgICAgIG5hbWU9IiVfVUlfR2xvYmFsaW5mbHVlbnphbW9kZWxNb2RlbFdpemFyZF9sYWJlbCINCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLnByZXNlbnRhdGlvbi5HbG9iYWxpbmZsdWVuemFtb2RlbE1vZGVsV2l6YXJkIg0KKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuV2l6YXJkLmNhdGVnb3J5LklEIg0KKyAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvR2xvYmFsaW5mbHVlbnphbW9kZWxNb2RlbEZpbGUuZ2lmIj4NCisgICAgICAgICA8ZGVzY3JpcHRpb24+JV9VSV9HbG9iYWxpbmZsdWVuemFtb2RlbE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4NCisgICAgICAgICA8c2VsZWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4NCisgICAgICA8L3dpemFyZD4NCisgICA8L2V4dGVuc2lvbj4NCisNCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4NCisgICAgICA8ZWRpdG9yDQorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5wcmVzZW50YXRpb24uR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JJRCINCisgICAgICAgICAgICBuYW1lPSIlX1VJX0dsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yX2xhYmVsIg0KKyAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvR2xvYmFsaW5mbHVlbnphbW9kZWxNb2RlbEZpbGUuZ2lmIg0KKyAgICAgICAgICAgIGV4dGVuc2lvbnM9Imdsb2JhbGluZmx1ZW56YW1vZGVsIg0KKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwucHJlc2VudGF0aW9uLkdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yIg0KKyAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5wcmVzZW50YXRpb24uR2xvYmFsaW5mbHVlbnphbW9kZWxBY3Rpb25CYXJDb250cmlidXRvciI+DQorICAgICAgPC9lZGl0b3I+DQorICAgPC9leHRlbnNpb24+DQorICAgPGV4dGVuc2lvbg0KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnN0YXJ0dXAiPg0KKyAgICAgPHN0YXJ0dXANCisgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwucHJlc2VudGF0aW9uLkdsb2JhbGluZmx1ZW56YW1vZGVsUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij4NCisgICAgIDwvc3RhcnR1cD4NCisgIDwvZXh0ZW5zaW9uPg0KKw0KKzwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3ByZXNlbnRhdGlvbi9HbG9iYWxpbmZsdWVuemFtb2RlbEFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9wcmVzZW50YXRpb24vR2xvYmFsaW5mbHVlbnphbW9kZWxBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NGI3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9wcmVzZW50YXRpb24vR2xvYmFsaW5mbHVlbnphbW9kZWxBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCkBAIC0wLDAgKzEsNDM0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5wcmVzZW50YXRpb247DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbnRyb2xBY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Mb2FkUmVzb3VyY2VBY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YkNvbnRyaWJ1dGlvbkl0ZW07DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwucHJlc2VudGF0aW9uLkdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgYWN0aW9uIGJhciBjb250cmlidXRvciBmb3IgdGhlIEdsb2JhbGluZmx1ZW56YW1vZGVsIG1vZGVsIGVkaXRvci4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgR2xvYmFsaW5mbHVlbnphbW9kZWxBY3Rpb25CYXJDb250cmlidXRvcg0KKwlleHRlbmRzIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcg0KKwlpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgew0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGVkaXRvci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3JQYXJ0Ow0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gcHJvdmlkZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOw0KKw0KKwkvKioNCisJICogVGhpcyBhY3Rpb24gb3BlbnMgdGhlIFByb3BlcnRpZXMgdmlldy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJQWN0aW9uIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbiA9DQorCQluZXcgQWN0aW9uKEdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW0iKSkgew0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJdHJ5IHsNCisJCQkJCWdldFBhZ2UoKS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIpOw0KKwkJCQl9DQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCUdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJCQl9DQorCQkJfQ0KKwkJfTsNCisNCisJLyoqDQorCSAqIFRoaXMgYWN0aW9uIHJlZnJlc2hlcyB0aGUgdmlld2VyIG9mIHRoZSBjdXJyZW50IGVkaXRvciBpZiB0aGUgZWRpdG9yDQorCSAqIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcn0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUFjdGlvbiByZWZyZXNoVmlld2VyQWN0aW9uID0NCisJCW5ldyBBY3Rpb24oR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0iKSkgew0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsNCisJCQkJcmV0dXJuIGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7DQorCQkJfQ0KKw0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJaWYgKGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsNCisJCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRWaWV3ZXIoKTsNCisJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgew0KKwkJCQkJCXZpZXdlci5yZWZyZXNoKCk7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQl9Ow0KKw0KKwkvKioNCisJICogVGhpcyB3aWxsIGNvbnRhaW4gb25lIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yDQorCSAqIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlQ2hpbGRBY3Rpb25zOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVDaGlsZCBhY3Rpb25zLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyOw0KKw0KKwkvKioNCisJICogVGhpcyB3aWxsIGNvbnRhaW4gb25lIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gY29ycmVzcG9uZGluZyB0byBlYWNoIGRlc2NyaXB0b3INCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBjcmVhdGVTaWJsaW5nQWN0aW9uczsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCBmb3IgQ3JlYXRlU2libGluZyBhY3Rpb25zLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvbnRyaWJ1dG9yLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEdsb2JhbGluZmx1ZW56YW1vZGVsQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7DQorCQlzdXBlcihBRERJVElPTlNfTEFTVF9TVFlMRSk7DQorCQlsb2FkUmVzb3VyY2VBY3Rpb24gPSBuZXcgTG9hZFJlc291cmNlQWN0aW9uKCk7DQorCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBWYWxpZGF0ZUFjdGlvbigpOw0KKwkJY29udHJvbEFjdGlvbiA9IG5ldyBDb250cm9sQWN0aW9uKCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBTZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zIHRvIHRoZSB0b29sIGJhci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgew0KKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImdsb2JhbGluZmx1ZW56YW1vZGVsLXNldHRpbmdzIikpOw0KKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImdsb2JhbGluZmx1ZW56YW1vZGVsLWFkZGl0aW9ucyIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHRvIHRoZSBtZW51IGJhciBhIG1lbnUgYW5kIHNvbWUgc2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucywNCisJICogYXMgd2VsbCBhcyB0aGUgc3ViLW1lbnVzIGZvciBvYmplY3QgY3JlYXRpb24gaXRlbXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsNCisJCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudU1hbmFnZXIpOw0KKw0KKwkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKEdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0dsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yX21lbnUiKSwgIm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbE1lbnVJRCIpOw0KKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsNCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzZXR0aW5ncyIpKTsNCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhY3Rpb25zIikpOw0KKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsNCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOw0KKw0KKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlQ2hpbGQgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLg0KKwkJLy8NCisJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOw0KKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyKTsNCisNCisJCS8vIFByZXBhcmUgZm9yIENyZWF0ZVNpYmxpbmcgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLg0KKwkJLy8NCisJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihHbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsNCisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsNCisNCisJCS8vIEZvcmNlIGFuIHVwZGF0ZSBiZWNhdXNlIEVjbGlwc2UgaGlkZXMgZW1wdHkgbWVudXMgbm93Lg0KKwkJLy8NCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcg0KKwkJCShuZXcgSU1lbnVMaXN0ZW5lcigpIHsNCisJCQkJIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsNCisJCQkJCSBtZW51TWFuYWdlci51cGRhdGVBbGwodHJ1ZSk7DQorCQkJCSB9DQorCQkJIH0pOw0KKw0KKwkJYWRkR2xvYmFsQWN0aW9ucyhzdWJtZW51TWFuYWdlcik7DQorCX0NCisNCisJLyoqDQorCSAqIFdoZW4gdGhlIGFjdGl2ZSBlZGl0b3IgY2hhbmdlcywgdGhpcyByZW1lbWJlcnMgdGhlIGNoYW5nZSBhbmQgcmVnaXN0ZXJzIHdpdGggaXQgYXMgYSBzZWxlY3Rpb24gcHJvdmlkZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHBhcnQpIHsNCisJCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihwYXJ0KTsNCisJCWFjdGl2ZUVkaXRvclBhcnQgPSBwYXJ0Ow0KKw0KKwkJLy8gU3dpdGNoIHRvIHRoZSBuZXcgc2VsZWN0aW9uIHByb3ZpZGVyLg0KKwkJLy8NCisJCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7DQorCQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOw0KKwkJfQ0KKwkJaWYgKHBhcnQgPT0gbnVsbCkgew0KKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsNCisJCX0NCisJCWVsc2Ugew0KKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gcGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsNCisJCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7DQorDQorCQkJLy8gRmFrZSBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IHRvIHVwZGF0ZSB0aGUgbWVudXMuDQorCQkJLy8NCisJCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkgew0KKwkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKSk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn0sDQorCSAqIGhhbmRsaW5nIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH1zIGJ5IHF1ZXJ5aW5nIGZvciB0aGUgY2hpbGRyZW4gYW5kIHNpYmxpbmdzDQorCSAqIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZWxlY3RlZCBvYmplY3QgYW5kIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7DQorCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uDQorCQkvLw0KKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgew0KKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7DQorCQl9DQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsNCisJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsNCisJCX0NCisNCisJCS8vIFF1ZXJ5IHRoZSBuZXcgc2VsZWN0aW9uIGZvciBhcHByb3ByaWF0ZSBuZXcgY2hpbGQvc2libGluZyBkZXNjcmlwdG9ycw0KKwkJLy8NCisJCUNvbGxlY3Rpb248Pz4gbmV3Q2hpbGREZXNjcmlwdG9ycyA9IG51bGw7DQorCQlDb2xsZWN0aW9uPD8+IG5ld1NpYmxpbmdEZXNjcmlwdG9ycyA9IG51bGw7DQorDQorCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOw0KKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5zaXplKCkgPT0gMSkgew0KKwkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7DQorDQorCQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpYWN0aXZlRWRpdG9yUGFydCkuZ2V0RWRpdGluZ0RvbWFpbigpOw0KKw0KKwkJCW5ld0NoaWxkRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhvYmplY3QsIG51bGwpOw0KKwkJCW5ld1NpYmxpbmdEZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG51bGwsIG9iamVjdCk7DQorCQl9DQorDQorCQkvLyBHZW5lcmF0ZSBhY3Rpb25zIGZvciBzZWxlY3Rpb247IHBvcHVsYXRlIGFuZCByZWRyYXcgdGhlIG1lbnVzLg0KKwkJLy8NCisJCWNyZWF0ZUNoaWxkQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKG5ld0NoaWxkRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7DQorCQljcmVhdGVTaWJsaW5nQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMobmV3U2libGluZ0Rlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOw0KKw0KKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgew0KKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOw0KKwkJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7DQorCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOw0KKwkJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwNCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7DQorCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgew0KKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgew0KKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlQ2hpbGRBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIGFjdGlvbnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LA0KKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJQ29sbGVjdGlvbjxJQWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOw0KKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsNCisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsNCisJCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIGFjdGlvbnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gd2l0aCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cw0KKwkgKiBiYXNlZCBvbiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLA0KKwkgKiBieSBpbnNlcnRpbmcgdGhlbSBiZWZvcmUgdGhlIHNwZWNpZmllZCBjb250cmlidXRpb24gaXRlbSA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4uDQorCSAqIElmIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgc2ltcGx5IGFkZGVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248PyBleHRlbmRzIElBY3Rpb24+IGFjdGlvbnMsIFN0cmluZyBjb250cmlidXRpb25JRCkgew0KKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgew0KKwkJCWZvciAoSUFjdGlvbiBhY3Rpb24gOiBhY3Rpb25zKSB7DQorCQkJCWlmIChjb250cmlidXRpb25JRCAhPSBudWxsKSB7DQorCQkJCQltYW5hZ2VyLmluc2VydEJlZm9yZShjb250cmlidXRpb25JRCwgYWN0aW9uKTsNCisJCQkJfQ0KKwkJCQllbHNlIHsNCisJCQkJCW1hbmFnZXIuYWRkKGFjdGlvbik7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCX0NCisJCQ0KKwkvKioNCisJICogVGhpcyByZW1vdmVzIGZyb20gdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMNCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRlcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248PyBleHRlbmRzIElBY3Rpb24+IGFjdGlvbnMpIHsNCisJCWlmIChhY3Rpb25zICE9IG51bGwpIHsNCisJCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsNCisJCQkJLy8gTG9vayBpbnRvIFN1YkNvbnRyaWJ1dGlvbkl0ZW1zDQorCQkJCS8vDQorCQkJCUlDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbkl0ZW0gPSBpdGVtc1tpXTsNCisJCQkJd2hpbGUgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBTdWJDb250cmlidXRpb25JdGVtKSB7DQorCQkJCQljb250cmlidXRpb25JdGVtID0gKChTdWJDb250cmlidXRpb25JdGVtKWNvbnRyaWJ1dGlvbkl0ZW0pLmdldElubmVySXRlbSgpOw0KKwkJCQl9DQorDQorCQkJCS8vIERlbGV0ZSB0aGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbXMgd2l0aCBtYXRjaGluZyBhY3Rpb24uDQorCQkJCS8vDQorCQkJCWlmIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgew0KKwkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0QWN0aW9uKCk7DQorCQkJCQlpZiAoYWN0aW9ucy5jb250YWlucyhhY3Rpb24pKSB7DQorCQkJCQkJbWFuYWdlci5yZW1vdmUoY29udHJpYnV0aW9uSXRlbSk7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBwb3AtdXAgbWVudSBiZWZvcmUgaXQgYXBwZWFycy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7DQorCQlzdXBlci5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOw0KKwkJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBudWxsOw0KKw0KKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOw0KKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOw0KKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOw0KKw0KKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7DQorCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsNCisJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZWRpdCIsIHN1Ym1lbnVNYW5hZ2VyKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbnNlcnRzIGdsb2JhbCBhY3Rpb25zIGJlZm9yZSB0aGUgImFkZGl0aW9ucy1lbmQiIHNlcGFyYXRvci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRHbG9iYWxBY3Rpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgew0KKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucy1lbmQiLCBuZXcgU2VwYXJhdG9yKCJ1aS1hY3Rpb25zIikpOw0KKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24pOw0KKw0KKwkJcmVmcmVzaFZpZXdlckFjdGlvbi5zZXRFbmFibGVkKHJlZnJlc2hWaWV3ZXJBY3Rpb24uaXNFbmFibGVkKCkpOwkJDQorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHJlZnJlc2hWaWV3ZXJBY3Rpb24pOw0KKw0KKwkJc3VwZXIuYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgZW5zdXJlcyB0aGF0IGEgZGVsZXRlIGFjdGlvbiB3aWxsIGNsZWFuIHVwIGFsbCByZWZlcmVuY2VzIHRvIGRlbGV0ZWQgb2JqZWN0cy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVBbGxSZWZlcmVuY2VzT25EZWxldGUoKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9wcmVzZW50YXRpb24vR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3ByZXNlbnRhdGlvbi9HbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZjAzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9wcmVzZW50YXRpb24vR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3IuamF2YQpAQCAtMCwwICsxLDE4NDMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLnByZXNlbnRhdGlvbjsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZVBhZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldFBhZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5NYXJrZXJIZWxwZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVmlld2VyUGFuZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5lZGl0b3IuUHJvYmxlbUVkaXRvclBhcnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5jZWxsZWRpdG9yLkFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkxvY2FsVHJhbnNmZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuVW53cmFwcGluZ1NlbGVjdGlvblByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSU1hcmtlckhlbHBlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS52aWV3LkV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5wcm92aWRlci5HbG9iYWxpbmZsdWVuemFtb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLkdyYXBoSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcm92aWRlci5Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXIuTW9kaWZpZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLnByb3ZpZGVyLlNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIucHJvdmlkZXIuU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIucHJvdmlkZXIuU29sdmVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnByb3ZpZGVyLkxhYmVsc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLnByZXNlbnRhdGlvbi5HbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvclBsdWdpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247DQorDQorDQorLyoqDQorICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgR2xvYmFsaW5mbHVlbnphbW9kZWwgbW9kZWwgZWRpdG9yLg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBHbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvcg0KKwlleHRlbmRzIE11bHRpUGFnZUVkaXRvclBhcnQNCisJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpblByb3ZpZGVyLCBJU2VsZWN0aW9uUHJvdmlkZXIsIElNZW51TGlzdGVuZXIsIElWaWV3ZXJQcm92aWRlciwgSUdvdG9NYXJrZXIgew0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgZWRpdGluZyBkb21haW4gdGhhdCBpcyB1c2VkIHRvIHRyYWNrIGFsbCBjaGFuZ2VzIHRvIHRoZSBtb2RlbC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIG9uZSBhZGFwdGVyIGZhY3RvcnkgdXNlZCBmb3IgcHJvdmlkaW5nIHZpZXdzIG9mIHRoZSBtb2RlbC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5Ow0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUNvbnRlbnRPdXRsaW5lUGFnZSBjb250ZW50T3V0bGluZVBhZ2U7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIGEga2x1ZGdlLi4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVN0YXR1c0xpbmVNYW5hZ2VyIGNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZSdzIHZpZXdlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBUcmVlVmlld2VyIGNvbnRlbnRPdXRsaW5lVmlld2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgcHJvcGVydHkgc2hlZXQgcGFnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBQcm9wZXJ0eVNoZWV0UGFnZSBwcm9wZXJ0eVNoZWV0UGFnZTsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIHZpZXdlciB0aGF0IHNoYWRvd3MgdGhlIHNlbGVjdGlvbiBpbiB0aGUgY29udGVudCBvdXRsaW5lLg0KKwkgKiBUaGUgcGFyZW50IHJlbGF0aW9uIG11c3QgYmUgY29ycmVjdGx5IGRlZmluZWQgZm9yIHRoaXMgdG8gd29yay4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBUcmVlVmlld2VyIHNlbGVjdGlvblZpZXdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgaW52ZXJ0cyB0aGUgcm9sbCBvZiBwYXJlbnQgYW5kIGNoaWxkIGluIHRoZSBjb250ZW50IHByb3ZpZGVyIGFuZCBzaG93IHBhcmVudHMgYXMgYSB0cmVlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgcGFyZW50Vmlld2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBzaG93cyBob3cgYSB0cmVlIHZpZXcgd29ya3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBzaG93cyBob3cgYSBsaXN0IHZpZXcgd29ya3MuDQorCSAqIEEgbGlzdCB2aWV3ZXIgZG9lc24ndCBzdXBwb3J0IGljb25zLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExpc3RWaWV3ZXIgbGlzdFZpZXdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgc2hvd3MgaG93IGEgdGFibGUgdmlldyB3b3Jrcy4NCisJICogQSB0YWJsZSBjYW4gYmUgdXNlZCBhcyBhIGxpc3Qgd2l0aCBpY29ucy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgc2hvd3MgaG93IGEgdHJlZSB2aWV3IHdpdGggY29sdW1ucyB3b3Jrcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBUcmVlVmlld2VyIHRyZWVWaWV3ZXJXaXRoQ29sdW1uczsNCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSB2aWV3ZXIgcGFuZSwgaW4gdGhlIGJvb2suDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVmlld2VyUGFuZSBjdXJyZW50Vmlld2VyUGFuZTsNCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBjb250ZW50IHZpZXdlciwgd2hpY2ggbWF5IGJlIGVpdGhlciBvbmUgb2YgdGhlIHZpZXdlcnMgaW4gdGhlIHBhZ2VzIG9yIHRoZSBjb250ZW50IG91dGxpbmUgdmlld2VyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFZpZXdlciBjdXJyZW50Vmlld2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBsaXN0ZW5zIHRvIHdoaWNoIGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsNCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfXMgdGhhdCBhcmUgbGlzdGVuaW5nIHRvIHRoaXMgZWRpdG9yLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsNCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZWRpdG9yIGFzIGEgd2hvbGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBlZGl0b3JTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOw0KKw0KKwkvKioNCisJICogVGhlIE1hcmtlckhlbHBlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgd29ya3NwYWNlIHJlc291cmNlIG1hcmtlcnMgcHJlc2VudGVkDQorCSAqIGluIEVjbGlwc2UncyBQcm9ibGVtcyBWaWV3Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE1hcmtlckhlbHBlciBtYXJrZXJIZWxwZXIgPSBuZXcgRWRpdFVJTWFya2VySGVscGVyKCk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdoZW4gdGhlIG91dGxpbmUgYmVjb21lcyBhY3RpdmUNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9DQorCQluZXcgSVBhcnRMaXN0ZW5lcigpIHsNCisJCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsNCisJCQkJaWYgKHAgaW5zdGFuY2VvZiBDb250ZW50T3V0bGluZSkgew0KKwkJCQkJaWYgKCgoQ29udGVudE91dGxpbmUpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBjb250ZW50T3V0bGluZVBhZ2UpIHsNCisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihHbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvci50aGlzKTsNCisNCisJCQkJCQlzZXRDdXJyZW50Vmlld2VyKGNvbnRlbnRPdXRsaW5lVmlld2VyKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQllbHNlIGlmIChwIGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgew0KKwkJCQkJaWYgKCgoUHJvcGVydHlTaGVldClwKS5nZXRDdXJyZW50UGFnZSgpID09IHByb3BlcnR5U2hlZXRQYWdlKSB7DQorCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3IudGhpcyk7DQorCQkJCQkJaGFuZGxlQWN0aXZhdGUoKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQllbHNlIGlmIChwID09IEdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yLnRoaXMpIHsNCisJCQkJCWhhbmRsZUFjdGl2YXRlKCk7DQorCQkJCX0NCisJCQl9DQorCQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwKSB7DQorCQkJCS8vIElnbm9yZS4NCisJCQl9DQorCQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwKSB7DQorCQkJCS8vIElnbm9yZS4NCisJCQl9DQorCQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsNCisJCQkJLy8gSWdub3JlLg0KKwkJCX0NCisJCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHApIHsNCisJCQkJLy8gSWdub3JlLg0KKwkJCX0NCisJCX07DQorDQorCS8qKg0KKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7DQorDQorCS8qKg0KKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7DQorDQorCS8qKg0KKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gc2F2ZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gc2F2ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOw0KKw0KKwkvKioNCisJICogTWFwIHRvIHN0b3JlIHRoZSBkaWFnbm9zdGljIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4gcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4oKTsNCisNCisJLyoqDQorCSAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiBzaG91bGQgYmUgdXBkYXRlZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsNCisNCisJLyoqDQorCSAqIEFkYXB0ZXIgdXNlZCB0byB1cGRhdGUgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiB3aGVuIHJlc291cmNlcyBhcmUgZGVtYW5kZWQgbG9hZGVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVDb250ZW50QWRhcHRlciBwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIgPSANCisJCW5ldyBFQ29udGVudEFkYXB0ZXIoKSB7DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7DQorCQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVzb3VyY2UuY2xhc3MpKSB7DQorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEOg0KKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0VSUk9SUzoNCisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19XQVJOSU5HUzogew0KKwkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsNCisJCQkJCQkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIG51bGwpOw0KKwkJCQkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsNCisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgZGlhZ25vc3RpYyk7DQorCQkJCQkJCX0NCisJCQkJCQkJZWxzZSB7DQorCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5yZW1vdmUocmVzb3VyY2UpOw0KKwkJCQkJCQl9DQorDQorCQkJCQkJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgew0KKwkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYw0KKwkJCQkJCQkJCShuZXcgUnVubmFibGUoKSB7DQorCQkJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsNCisJCQkJCQkJCQkJIH0NCisJCQkJCQkJCQkgfSk7DQorCQkJCQkJCX0NCisJCQkJCQkJYnJlYWs7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWVsc2Ugew0KKwkJCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJCUBPdmVycmlkZQ0KKwkJCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsNCisJCQkJYmFzaWNTZXRUYXJnZXQodGFyZ2V0KTsNCisJCQl9DQorDQorCQkJQE92ZXJyaWRlDQorCQkJcHJvdGVjdGVkIHZvaWQgdW5zZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7DQorCQkJCWJhc2ljVW5zZXRUYXJnZXQodGFyZ2V0KTsNCisJCQl9DQorCQl9Ow0KKw0KKwkvKioNCisJICogVGhpcyBsaXN0ZW5zIGZvciB3b3Jrc3BhY2UgY2hhbmdlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0NCisJCW5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsNCisJCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsNCisJCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOw0KKwkJCQl0cnkgew0KKwkJCQkJY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3Igew0KKwkJCQkJCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsNCisJCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7DQorCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOw0KKw0KKwkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7DQorCQkJCQkJCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgew0KKwkJCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIHx8DQorCQkJCQkJCQkgICAgZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgZGVsdGEuZ2V0RmxhZ3MoKSAhPSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSB7DQorCQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShVUkkuY3JlYXRlVVJJKGRlbHRhLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSksIGZhbHNlKTsNCisJCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgew0KKwkJCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsNCisJCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsNCisJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQllbHNlIGlmICghc2F2ZWRSZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlKSkgew0KKwkJCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOw0KKwkJCQkJCQkJCQl9DQorCQkJCQkJCQkJfQ0KKwkJCQkJCQkJfQ0KKwkJCQkJCQl9DQorDQorCQkJCQkJCXJldHVybiB0cnVlOw0KKwkJCQkJCX0NCisNCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsNCisJCQkJCQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7DQorCQkJCQkJfQ0KKw0KKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRSZW1vdmVkUmVzb3VyY2VzKCkgew0KKwkJCQkJCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlczsNCisJCQkJCQl9DQorCQkJCQl9DQorDQorCQkJCQlSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpdG9yKCk7DQorCQkJCQlkZWx0YS5hY2NlcHQodmlzaXRvcik7DQorDQorCQkJCQlpZiAoIXZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgew0KKwkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsNCisJCQkJCQlpZiAoIWlzRGlydHkoKSkgew0KKwkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjDQorCQkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKEdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yLnRoaXMsIGZhbHNlKTsNCisJCQkJCQkJCQkgfQ0KKwkJCQkJCQkJIH0pOw0KKwkJCQkJCX0NCisJCQkJCX0NCisNCisJCQkJCWlmICghdmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7DQorCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOw0KKwkJCQkJCWlmIChnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpID09IEdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yLnRoaXMpIHsNCisJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYw0KKwkJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsNCisJCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkgaGFuZGxlQWN0aXZhdGUoKTsNCisJCQkJCQkJCQkgfQ0KKwkJCQkJCQkJIH0pOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCUdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJCQl9DQorCQkJfQ0KKwkJfTsNCisNCisJLyoqDQorCSAqIEhhbmRsZXMgYWN0aXZhdGlvbiBvZiB0aGUgZWRpdG9yIG9yIGl0J3MgYXNzb2NpYXRlZCB2aWV3cy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFjdGl2YXRlKCkgew0KKwkJLy8gUmVjb21wdXRlIHRoZSByZWFkIG9ubHkgc3RhdGUuDQorCQkvLw0KKwkJaWYgKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkgIT0gbnVsbCkgew0KKwkJICBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpLmNsZWFyKCk7DQorDQorCQkgIC8vIFJlZnJlc2ggYW55IGFjdGlvbnMgdGhhdCBtYXkgYmVjb21lIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQorCQkgIC8vDQorCQkgIHNldFNlbGVjdGlvbihnZXRTZWxlY3Rpb24oKSk7DQorCQl9DQorDQorCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7DQorCQkJaWYgKGhhbmRsZURpcnR5Q29uZmxpY3QoKSkgew0KKwkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKEdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yLnRoaXMsIGZhbHNlKTsNCisJCQl9DQorCQkJZWxzZSB7DQorCQkJCXJlbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsNCisJCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOw0KKwkJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOw0KKwkJCX0NCisJCX0NCisJCWVsc2UgaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgew0KKwkJCWNoYW5nZWRSZXNvdXJjZXMucmVtb3ZlQWxsKHNhdmVkUmVzb3VyY2VzKTsNCisJCQloYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCk7DQorCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOw0KKwkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEhhbmRsZXMgd2hhdCB0byBkbyB3aXRoIGNoYW5nZWQgcmVzb3VyY2VzIG9uIGFjdGl2YXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCkgew0KKwkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSAmJiAoIWlzRGlydHkoKSB8fCBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpKSB7DQorCQkJaWYgKGlzRGlydHkoKSkgew0KKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpOw0KKwkJCX0NCisJCQllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7DQorDQorCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsNCisJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgew0KKwkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgew0KKwkJCQkJcmVzb3VyY2UudW5sb2FkKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsNCisJCQkJCX0NCisJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCQlpZiAoIXJlc291cmNlVG9EaWFnbm9zdGljTWFwLmNvbnRhaW5zS2V5KHJlc291cmNlKSkgew0KKwkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorDQorCQkJaWYgKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbi5pc1N0YWxlKGVkaXRvclNlbGVjdGlvbikpIHsNCisJCQkJc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOw0KKwkJCX0NCisNCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7DQorCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsNCisJCX0NCisJfQ0KKyAgDQorCS8qKg0KKwkgKiBVcGRhdGVzIHRoZSBwcm9ibGVtcyBpbmRpY2F0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWVkIGRpYWdub3N0aWMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpIHsNCisJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgew0KKwkJCUJhc2ljRGlhZ25vc3RpYyBkaWFnbm9zdGljID0NCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYw0KKwkJCQkJKERpYWdub3N0aWMuT0ssDQorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5lZGl0b3IiLA0KKwkJCQkJIDAsDQorCQkJCQkgbnVsbCwNCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpIH0pOw0KKwkJCWZvciAoRGlhZ25vc3RpYyBjaGlsZERpYWdub3N0aWMgOiByZXNvdXJjZVRvRGlhZ25vc3RpY01hcC52YWx1ZXMoKSkgew0KKwkJCQlpZiAoY2hpbGREaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgew0KKwkJCQkJZGlhZ25vc3RpYy5hZGQoY2hpbGREaWFnbm9zdGljKTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQlpbnQgbGFzdEVkaXRvclBhZ2UgPSBnZXRQYWdlQ291bnQoKSAtIDE7DQorCQkJaWYgKGxhc3RFZGl0b3JQYWdlID49IDAgJiYgZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSBpbnN0YW5jZW9mIFByb2JsZW1FZGl0b3JQYXJ0KSB7DQorCQkJCSgoUHJvYmxlbUVkaXRvclBhcnQpZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSkuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsNCisJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7DQorCQkJCQlzZXRBY3RpdmVQYWdlKGxhc3RFZGl0b3JQYWdlKTsNCisJCQkJfQ0KKwkJCX0NCisJCQllbHNlIGlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgew0KKwkJCQlQcm9ibGVtRWRpdG9yUGFydCBwcm9ibGVtRWRpdG9yUGFydCA9IG5ldyBQcm9ibGVtRWRpdG9yUGFydCgpOw0KKwkJCQlwcm9ibGVtRWRpdG9yUGFydC5zZXREaWFnbm9zdGljKGRpYWdub3N0aWMpOw0KKwkJCQlwcm9ibGVtRWRpdG9yUGFydC5zZXRNYXJrZXJIZWxwZXIobWFya2VySGVscGVyKTsNCisJCQkJdHJ5IHsNCisJCQkJCWFkZFBhZ2UoKytsYXN0RWRpdG9yUGFnZSwgcHJvYmxlbUVkaXRvclBhcnQsIGdldEVkaXRvcklucHV0KCkpOw0KKwkJCQkJc2V0UGFnZVRleHQobGFzdEVkaXRvclBhZ2UsIHByb2JsZW1FZGl0b3JQYXJ0LmdldFBhcnROYW1lKCkpOw0KKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7DQorCQkJCQlzaG93VGFicygpOw0KKwkJCQl9DQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCUdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJCWlmIChtYXJrZXJIZWxwZXIuaGFzTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpKSB7DQorCQkJCW1hcmtlckhlbHBlci5kZWxldGVNYXJrZXJzKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7DQorCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgew0KKwkJCQkJdHJ5IHsNCisJCQkJCQltYXJrZXJIZWxwZXIuY3JlYXRlTWFya2VycyhkaWFnbm9zdGljKTsNCisJCQkJCX0NCisJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQkJCUdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBTaG93cyBhIGRpYWxvZyB0aGF0IGFza3MgaWYgY29uZmxpY3RpbmcgY2hhbmdlcyBzaG91bGQgYmUgZGlzY2FyZGVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsNCisJCXJldHVybg0KKwkJCU1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uDQorCQkJCShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX0ZpbGVDb25mbGljdF9sYWJlbCIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfV0FSTl9GaWxlQ29uZmxpY3QiKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhIG1vZGVsIGVkaXRvci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBHbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvcigpIHsNCisJCXN1cGVyKCk7DQorCQlpbml0aWFsaXplRWRpdGluZ0RvbWFpbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHNldHMgdXAgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgbW9kZWwgZWRpdG9yLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKSB7DQorCQkvLyBDcmVhdGUgYW4gYWRhcHRlciBmYWN0b3J5IHRoYXQgeWllbGRzIGl0ZW0gcHJvdmlkZXJzLg0KKwkJLy8NCisJCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5EZXNjcmlwdG9yLlJlZ2lzdHJ5LklOU1RBTkNFKTsNCisNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEdsb2JhbGluZmx1ZW56YW1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEdyYXBoSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTW9kaWZpZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBFY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTGFiZWxzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU29sdmVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKw0KKwkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlIGV4ZWN1dGVkLg0KKwkJLy8NCisJCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOw0KKw0KKwkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gc2V0IHRoZSBtb3N0IHJlY2VudCBjb21tYW5kJ3MgYWZmZWN0ZWQgb2JqZWN0cyB0byBiZSB0aGUgc2VsZWN0aW9uIG9mIHRoZSB2aWV3ZXIgd2l0aCBmb2N1cy4NCisJCS8vDQorCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXINCisJCQkobmV3IENvbW1hbmRTdGFja0xpc3RlbmVyKCkgew0KKwkJCQkgcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgew0KKwkJCQkJIGdldENvbnRhaW5lcigpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMNCisJCQkJCQkgKG5ldyBSdW5uYWJsZSgpIHsNCisJCQkJCQkJICBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkgIGZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsNCisNCisJCQkJCQkJCSAgLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4NCisJCQkJCQkJCSAgLy8NCisJCQkJCQkJCSAgQ29tbWFuZCBtb3N0UmVjZW50Q29tbWFuZCA9ICgoQ29tbWFuZFN0YWNrKWV2ZW50LmdldFNvdXJjZSgpKS5nZXRNb3N0UmVjZW50Q29tbWFuZCgpOw0KKwkJCQkJCQkJICBpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgew0KKwkJCQkJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOw0KKwkJCQkJCQkJICB9DQorCQkJCQkJCQkgIGlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsICYmICFwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7DQorCQkJCQkJCQkJICBwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7DQorCQkJCQkJCQkgIH0NCisJCQkJCQkJICB9DQorCQkJCQkJICB9KTsNCisJCQkJIH0NCisJCQkgfSk7DQorDQorCQkvLyBDcmVhdGUgdGhlIGVkaXRpbmcgZG9tYWluIHdpdGggYSBzcGVjaWFsIGNvbW1hbmQgc3RhY2suDQorCQkvLw0KKwkJZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywgbmV3IEhhc2hNYXA8UmVzb3VyY2UsIEJvb2xlYW4+KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIGhlcmUgZm9yIHRoZSBsaXN0ZW5lciB0byBiZSBhYmxlIHRvIGNhbGwgaXQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwkJCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoaW50IGFjdGlvbikgew0KKwkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKGFjdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgc2V0cyB0aGUgc2VsZWN0aW9uIGludG8gd2hpY2hldmVyIHZpZXdlciBpcyBhY3RpdmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsNCisJCWZpbmFsIENvbGxlY3Rpb248Pz4gdGhlU2VsZWN0aW9uID0gY29sbGVjdGlvbjsNCisJCS8vIE1ha2Ugc3VyZSBpdCdzIG9rYXkuDQorCQkvLw0KKwkJaWYgKHRoZVNlbGVjdGlvbiAhPSBudWxsICYmICF0aGVTZWxlY3Rpb24uaXNFbXB0eSgpKSB7DQorCQkJLy8gSSBkb24ndCBrbm93IGlmIHRoaXMgc2hvdWxkIGJlIHJ1biB0aGlzIGRlZmVycmVkDQorCQkJLy8gYmVjYXVzZSB3ZSBtaWdodCBoYXZlIHRvIGdpdmUgdGhlIGVkaXRvciBhIGNoYW5jZSB0byBwcm9jZXNzIHRoZSB2aWV3ZXIgdXBkYXRlIGV2ZW50cw0KKwkJCS8vIGFuZCBoZW5jZSB0byB1cGRhdGUgdGhlIHZpZXdzIGZpcnN0Lg0KKwkJCS8vDQorCQkJLy8NCisJCQlSdW5uYWJsZSBydW5uYWJsZSA9DQorCQkJCW5ldyBSdW5uYWJsZSgpIHsNCisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBpdGVtcyBpbiB0aGUgY3VycmVudCBjb250ZW50IHZpZXdlciBvZiB0aGUgZWRpdG9yLg0KKwkJCQkJCS8vDQorCQkJCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgew0KKwkJCQkJCQljdXJyZW50Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0aGVTZWxlY3Rpb24udG9BcnJheSgpKSwgdHJ1ZSk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9Ow0KKwkJCXJ1bm5hYmxlLnJ1bigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGVkaXRpbmcgZG9tYWluIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSUVkaXRpbmdEb21haW5Qcm92aWRlcn0gaW50ZXJmYWNlLg0KKwkgKiBUaGlzIGlzIGltcG9ydGFudCBmb3IgaW1wbGVtZW50aW5nIHRoZSBzdGF0aWMgbWV0aG9kcyBvZiB7QGxpbmsgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWlufQ0KKwkgKiBhbmQgZm9yIHN1cHBvcnRpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9ufS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7DQorCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciB7DQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlAT3ZlcnJpZGUNCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgew0KKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsNCisJCQlyZXR1cm4gKHBhcmVudCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhcmVudCkpLnRvQXJyYXkoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlAT3ZlcnJpZGUNCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgew0KKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsNCisJCQlyZXR1cm4gKHBhcmVudCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhcmVudCkpLnRvQXJyYXkoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlAT3ZlcnJpZGUNCisJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsNCisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7DQorCQkJcmV0dXJuIHBhcmVudCAhPSBudWxsOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0Q3VycmVudFZpZXdlclBhbmUoVmlld2VyUGFuZSB2aWV3ZXJQYW5lKSB7DQorCQlpZiAoY3VycmVudFZpZXdlclBhbmUgIT0gdmlld2VyUGFuZSkgew0KKwkJCWlmIChjdXJyZW50Vmlld2VyUGFuZSAhPSBudWxsKSB7DQorCQkJCWN1cnJlbnRWaWV3ZXJQYW5lLnNob3dGb2N1cyhmYWxzZSk7DQorCQkJfQ0KKwkJCWN1cnJlbnRWaWV3ZXJQYW5lID0gdmlld2VyUGFuZTsNCisJCX0NCisJCXNldEN1cnJlbnRWaWV3ZXIoY3VycmVudFZpZXdlclBhbmUuZ2V0Vmlld2VyKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIG1ha2VzIHN1cmUgdGhhdCBvbmUgY29udGVudCB2aWV3ZXIsIGVpdGhlciBmb3IgdGhlIGN1cnJlbnQgcGFnZSBvciB0aGUgb3V0bGluZSB2aWV3LCBpZiBpdCBoYXMgZm9jdXMsDQorCSAqIGlzIHRoZSBjdXJyZW50IG9uZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRWaWV3ZXIoVmlld2VyIHZpZXdlcikgew0KKwkJLy8gSWYgaXQgaXMgY2hhbmdpbmcuLi4NCisJCS8vDQorCQlpZiAoY3VycmVudFZpZXdlciAhPSB2aWV3ZXIpIHsNCisJCQlpZiAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsNCisJCQkJLy8gQ3JlYXRlIHRoZSBsaXN0ZW5lciBvbiBkZW1hbmQuDQorCQkJCS8vDQorCQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9DQorCQkJCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsNCisJCQkJCQkvLyBUaGlzIGp1c3Qgbm90aWZpZXMgdGhvc2UgdGhpbmdzIHRoYXQgYXJlIGFmZmVjdGVkIGJ5IHRoZSBzZWN0aW9uLg0KKwkJCQkJCS8vDQorCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgc2VsZWN0aW9uQ2hhbmdlZEV2ZW50KSB7DQorCQkJCQkJCXNldFNlbGVjdGlvbihzZWxlY3Rpb25DaGFuZ2VkRXZlbnQuZ2V0U2VsZWN0aW9uKCkpOw0KKwkJCQkJCX0NCisJCQkJCX07DQorCQkJfQ0KKw0KKwkJCS8vIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBvbGQgb25lLg0KKwkJCS8vDQorCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgew0KKwkJCQljdXJyZW50Vmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOw0KKwkJCX0NCisNCisJCQkvLyBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG5ldyBvbmUuDQorCQkJLy8NCisJCQlpZiAodmlld2VyICE9IG51bGwpIHsNCisJCQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOw0KKwkJCX0NCisNCisJCQkvLyBSZW1lbWJlciBpdC4NCisJCQkvLw0KKwkJCWN1cnJlbnRWaWV3ZXIgPSB2aWV3ZXI7DQorDQorCQkJLy8gU2V0IHRoZSBlZGl0b3JzIHNlbGVjdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCB2aWV3ZXIncyBzZWxlY3Rpb24uDQorCQkJLy8NCisJCQlzZXRTZWxlY3Rpb24oY3VycmVudFZpZXdlciA9PSBudWxsID8gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSA6IGN1cnJlbnRWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHZpZXdlciBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElWaWV3ZXJQcm92aWRlcn0gaW50ZXJmYWNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7DQorCQlyZXR1cm4gY3VycmVudFZpZXdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGEgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyIGFuZCBhZGRzIGEgbGlzdGVuZXIgYXMgd2VsbCByZWdpc3RlcmluZyB0aGUgbWVudSBmb3IgZXh0ZW5zaW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsNCisJCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsNCisJCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7DQorCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7DQorCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7DQorCQlNZW51IG1lbnU9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOw0KKwkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOw0KKwkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUsIG5ldyBVbndyYXBwaW5nU2VsZWN0aW9uUHJvdmlkZXIodmlld2VyKSk7DQorDQorCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSzsNCisJCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsNCisJCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsNCisJCXZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCBjYWxsZWQgdG8gbG9hZCBhIHJlc291cmNlIGludG8gdGhlIGVkaXRpbmcgZG9tYWluJ3MgcmVzb3VyY2Ugc2V0IGJhc2VkIG9uIHRoZSBlZGl0b3IncyBpbnB1dC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGNyZWF0ZU1vZGVsKCkgew0KKwkJVVJJIHJlc291cmNlVVJJID0gRWRpdFVJVXRpbC5nZXRVUkkoZ2V0RWRpdG9ySW5wdXQoKSk7DQorCQlFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCisJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsNCisJCXRyeSB7DQorCQkJLy8gTG9hZCB0aGUgcmVzb3VyY2UgdGhyb3VnaCB0aGUgZWRpdGluZyBkb21haW4uDQorCQkJLy8NCisJCQlyZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgdHJ1ZSk7DQorCQl9DQorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsNCisJCQlleGNlcHRpb24gPSBlOw0KKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCBmYWxzZSk7DQorCQl9DQorDQorCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKTsNCisJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgew0KKwkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsNCisJCX0NCisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5hZGQocHJvYmxlbUluZGljYXRpb25BZGFwdGVyKTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyBhIGRpYWdub3N0aWMgZGVzY3JpYmluZyB0aGUgZXJyb3JzIGFuZCB3YXJuaW5ncyBsaXN0ZWQgaW4gdGhlIHJlc291cmNlDQorCSAqIGFuZCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiAoaWYgYW55KS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBEaWFnbm9zdGljIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKFJlc291cmNlIHJlc291cmNlLCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQlpZiAoIXJlc291cmNlLmdldEVycm9ycygpLmlzRW1wdHkoKSB8fCAhcmVzb3VyY2UuZ2V0V2FybmluZ3MoKS5pc0VtcHR5KCkpIHsNCisJCQlCYXNpY0RpYWdub3N0aWMgYmFzaWNEaWFnbm9zdGljID0NCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYw0KKwkJCQkJKERpYWdub3N0aWMuRVJST1IsDQorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5lZGl0b3IiLA0KKwkJCQkJIDAsDQorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLA0KKwkJCQkJIG5ldyBPYmplY3QgW10geyBleGNlcHRpb24gPT0gbnVsbCA/IChPYmplY3QpcmVzb3VyY2UgOiBleGNlcHRpb24gfSk7DQorCQkJYmFzaWNEaWFnbm9zdGljLm1lcmdlKEVjb3JlVXRpbC5jb21wdXRlRGlhZ25vc3RpYyhyZXNvdXJjZSwgdHJ1ZSkpOw0KKwkJCXJldHVybiBiYXNpY0RpYWdub3N0aWM7DQorCQl9DQorCQllbHNlIGlmIChleGNlcHRpb24gIT0gbnVsbCkgew0KKwkJCXJldHVybg0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljDQorCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwNCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLmVkaXRvciIsDQorCQkJCQkgMCwNCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksDQorCQkJCQkgbmV3IE9iamVjdFtdIHsgZXhjZXB0aW9uIH0pOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJcmV0dXJuIERpYWdub3N0aWMuT0tfSU5TVEFOQ0U7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gaW5zdGFsbCB5b3VyIG93biBjb250cm9scy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlcygpIHsNCisJCS8vIENyZWF0ZXMgdGhlIG1vZGVsIGZyb20gdGhlIGVkaXRvciBpbnB1dA0KKwkJLy8NCisJCWNyZWF0ZU1vZGVsKCk7DQorDQorCQkvLyBPbmx5IGNyZWF0ZXMgdGhlIG90aGVyIHBhZ2VzIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBlZGl0ZWQNCisJCS8vDQorCQlpZiAoIWdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgew0KKwkJCS8vIENyZWF0ZSBhIHBhZ2UgZm9yIHRoZSBzZWxlY3Rpb24gdHJlZSB2aWV3Lg0KKwkJCS8vDQorCQkJew0KKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQ0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3IudGhpcykgew0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsNCisJCQkJCQkJVHJlZSB0cmVlID0gbmV3IFRyZWUoY29tcG9zaXRlLCBTV1QuTVVMVEkpOw0KKwkJCQkJCQlUcmVlVmlld2VyIG5ld1RyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsNCisJCQkJCQkJcmV0dXJuIG5ld1RyZWVWaWV3ZXI7DQorCQkJCQkJfQ0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgew0KKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOw0KKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsNCisJCQkJCQl9DQorCQkJCQl9Ow0KKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOw0KKw0KKwkJCQlzZWxlY3Rpb25WaWV3ZXIgPSAoVHJlZVZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOw0KKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKw0KKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorCQkJCXNlbGVjdGlvblZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOw0KKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsNCisJCQkJdmlld2VyUGFuZS5zZXRUaXRsZShlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOw0KKw0KKwkJCQluZXcgQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yKHNlbGVjdGlvblZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsNCisNCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Ioc2VsZWN0aW9uVmlld2VyKTsNCisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOw0KKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwiKSk7DQorCQkJfQ0KKw0KKwkJCS8vIENyZWF0ZSBhIHBhZ2UgZm9yIHRoZSBwYXJlbnQgdHJlZSB2aWV3Lg0KKwkJCS8vDQorCQkJew0KKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQ0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3IudGhpcykgew0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsNCisJCQkJCQkJVHJlZSB0cmVlID0gbmV3IFRyZWUoY29tcG9zaXRlLCBTV1QuTVVMVEkpOw0KKwkJCQkJCQlUcmVlVmlld2VyIG5ld1RyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsNCisJCQkJCQkJcmV0dXJuIG5ld1RyZWVWaWV3ZXI7DQorCQkJCQkJfQ0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgew0KKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOw0KKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsNCisJCQkJCQl9DQorCQkJCQl9Ow0KKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOw0KKw0KKwkJCQlwYXJlbnRWaWV3ZXIgPSAoVHJlZVZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOw0KKwkJCQlwYXJlbnRWaWV3ZXIuc2V0QXV0b0V4cGFuZExldmVsKDMwKTsNCisJCQkJcGFyZW50Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorCQkJCXBhcmVudFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisNCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IocGFyZW50Vmlld2VyKTsNCisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOw0KKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1BhcmVudFBhZ2VfbGFiZWwiKSk7DQorCQkJfQ0KKw0KKwkJCS8vIFRoaXMgaXMgdGhlIHBhZ2UgZm9yIHRoZSBsaXN0IHZpZXdlcg0KKwkJCS8vDQorCQkJew0KKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQ0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3IudGhpcykgew0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsNCisJCQkJCQkJcmV0dXJuIG5ldyBMaXN0Vmlld2VyKGNvbXBvc2l0ZSk7DQorCQkJCQkJfQ0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgew0KKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOw0KKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsNCisJCQkJCQl9DQorCQkJCQl9Ow0KKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOw0KKwkJCQlsaXN0Vmlld2VyID0gKExpc3RWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsNCisJCQkJbGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorCQkJCWxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorDQorCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKGxpc3RWaWV3ZXIpOw0KKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7DQorCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfTGlzdFBhZ2VfbGFiZWwiKSk7DQorCQkJfQ0KKw0KKwkJCS8vIFRoaXMgaXMgdGhlIHBhZ2UgZm9yIHRoZSB0cmVlIHZpZXdlcg0KKwkJCS8vDQorCQkJew0KKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQ0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3IudGhpcykgew0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsNCisJCQkJCQkJcmV0dXJuIG5ldyBUcmVlVmlld2VyKGNvbXBvc2l0ZSk7DQorCQkJCQkJfQ0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgew0KKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOw0KKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsNCisJCQkJCQl9DQorCQkJCQl9Ow0KKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOw0KKwkJCQl0cmVlVmlld2VyID0gKFRyZWVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsNCisJCQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorCQkJCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorDQorCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3IodHJlZVZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsNCisNCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IodHJlZVZpZXdlcik7DQorCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsNCisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9UcmVlUGFnZV9sYWJlbCIpKTsNCisJCQl9DQorDQorCQkJLy8gVGhpcyBpcyB0aGUgcGFnZSBmb3IgdGhlIHRhYmxlIHZpZXdlci4NCisJCQkvLw0KKwkJCXsNCisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0NCisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIEdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yLnRoaXMpIHsNCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7DQorCQkJCQkJCXJldHVybiBuZXcgVGFibGVWaWV3ZXIoY29tcG9zaXRlKTsNCisJCQkJCQl9DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7DQorCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7DQorCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOw0KKwkJCQkJCX0NCisJCQkJCX07DQorCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7DQorCQkJCXRhYmxlVmlld2VyID0gKFRhYmxlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7DQorDQorCQkJCVRhYmxlIHRhYmxlID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsNCisJCQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7DQorCQkJCXRhYmxlLnNldExheW91dChsYXlvdXQpOw0KKwkJCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOw0KKwkJCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7DQorDQorCQkJCVRhYmxlQ29sdW1uIG9iamVjdENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOw0KKwkJCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgzLCAxMDAsIHRydWUpKTsNCisJCQkJb2JqZWN0Q29sdW1uLnNldFRleHQoZ2V0U3RyaW5nKCJfVUlfT2JqZWN0Q29sdW1uX2xhYmVsIikpOw0KKwkJCQlvYmplY3RDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOw0KKw0KKwkJCQlUYWJsZUNvbHVtbiBzZWxmQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7DQorCQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDIsIDEwMCwgdHJ1ZSkpOw0KKwkJCQlzZWxmQ29sdW1uLnNldFRleHQoZ2V0U3RyaW5nKCJfVUlfU2VsZkNvbHVtbl9sYWJlbCIpKTsNCisJCQkJc2VsZkNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7DQorDQorCQkJCXRhYmxlVmlld2VyLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZyBbXSB7ImEiLCAiYiJ9KTsNCisJCQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisNCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IodGFibGVWaWV3ZXIpOw0KKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7DQorCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfVGFibGVQYWdlX2xhYmVsIikpOw0KKwkJCX0NCisNCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgdGFibGUgdHJlZSB2aWV3ZXIuDQorCQkJLy8NCisJCQl7DQorCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9DQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBHbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvci50aGlzKSB7DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgew0KKwkJCQkJCQlyZXR1cm4gbmV3IFRyZWVWaWV3ZXIoY29tcG9zaXRlKTsNCisJCQkJCQl9DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7DQorCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7DQorCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOw0KKwkJCQkJCX0NCisJCQkJCX07DQorCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7DQorDQorCQkJCXRyZWVWaWV3ZXJXaXRoQ29sdW1ucyA9IChUcmVlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7DQorDQorCQkJCVRyZWUgdHJlZSA9IHRyZWVWaWV3ZXJXaXRoQ29sdW1ucy5nZXRUcmVlKCk7DQorCQkJCXRyZWUuc2V0TGF5b3V0RGF0YShuZXcgRmlsbExheW91dCgpKTsNCisJCQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOw0KKwkJCQl0cmVlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsNCisNCisJCQkJVHJlZUNvbHVtbiBvYmplY3RDb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7DQorCQkJCW9iamVjdENvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX09iamVjdENvbHVtbl9sYWJlbCIpKTsNCisJCQkJb2JqZWN0Q29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsNCisJCQkJb2JqZWN0Q29sdW1uLnNldFdpZHRoKDI1MCk7DQorDQorCQkJCVRyZWVDb2x1bW4gc2VsZkNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsNCisJCQkJc2VsZkNvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX1NlbGZDb2x1bW5fbGFiZWwiKSk7DQorCQkJCXNlbGZDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOw0KKwkJCQlzZWxmQ29sdW1uLnNldFdpZHRoKDIwMCk7DQorDQorCQkJCXRyZWVWaWV3ZXJXaXRoQ29sdW1ucy5zZXRDb2x1bW5Qcm9wZXJ0aWVzKG5ldyBTdHJpbmcgW10geyJhIiwgImIifSk7DQorCQkJCXRyZWVWaWV3ZXJXaXRoQ29sdW1ucy5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorCQkJCXRyZWVWaWV3ZXJXaXRoQ29sdW1ucy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisNCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IodHJlZVZpZXdlcldpdGhDb2x1bW5zKTsNCisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOw0KKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1RyZWVXaXRoQ29sdW1uc1BhZ2VfbGFiZWwiKSk7DQorCQkJfQ0KKw0KKwkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMNCisJCQkJKG5ldyBSdW5uYWJsZSgpIHsNCisJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJIHNldEFjdGl2ZVBhZ2UoMCk7DQorCQkJCQkgfQ0KKwkJCQkgfSk7DQorCQl9DQorDQorCQkvLyBFbnN1cmVzIHRoYXQgdGhpcyBlZGl0b3Igd2lsbCBvbmx5IGRpc3BsYXkgdGhlIHBhZ2UncyB0YWINCisJCS8vIGFyZWEgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgcGFnZQ0KKwkJLy8NCisJCWdldENvbnRhaW5lcigpLmFkZENvbnRyb2xMaXN0ZW5lcg0KKwkJCShuZXcgQ29udHJvbEFkYXB0ZXIoKSB7DQorCQkJCWJvb2xlYW4gZ3VhcmQgPSBmYWxzZTsNCisJCQkJQE92ZXJyaWRlDQorCQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBldmVudCkgew0KKwkJCQkJaWYgKCFndWFyZCkgew0KKwkJCQkJCWd1YXJkID0gdHJ1ZTsNCisJCQkJCQloaWRlVGFicygpOw0KKwkJCQkJCWd1YXJkID0gZmFsc2U7DQorCQkJCQl9DQorCQkJCX0NCisJCQkgfSk7DQorDQorCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjDQorCQkJKG5ldyBSdW5uYWJsZSgpIHsNCisJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOw0KKwkJCQkgfQ0KKwkJCSB9KTsNCisJfQ0KKw0KKwkvKioNCisJICogSWYgdGhlcmUgaXMganVzdCBvbmUgcGFnZSBpbiB0aGUgbXVsdGktcGFnZSBlZGl0b3IgcGFydCwNCisJICogdGhpcyBoaWRlcyB0aGUgc2luZ2xlIHRhYiBhdCB0aGUgYm90dG9tLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGlkZVRhYnMoKSB7DQorCQlpZiAoZ2V0UGFnZUNvdW50KCkgPD0gMSkgew0KKwkJCXNldFBhZ2VUZXh0KDAsICIiKTsNCisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7DQorCQkJCSgoQ1RhYkZvbGRlcilnZXRDb250YWluZXIoKSkuc2V0VGFiSGVpZ2h0KDEpOw0KKwkJCQlQb2ludCBwb2ludCA9IGdldENvbnRhaW5lcigpLmdldFNpemUoKTsNCisJCQkJZ2V0Q29udGFpbmVyKCkuc2V0U2l6ZShwb2ludC54LCBwb2ludC55ICsgNik7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsDQorCSAqIHRoaXMgc2hvd3MgdGhlIHRhYnMgYXQgdGhlIGJvdHRvbS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNob3dUYWJzKCkgew0KKwkJaWYgKGdldFBhZ2VDb3VudCgpID4gMSkgew0KKwkJCXNldFBhZ2VUZXh0KDAsIGdldFN0cmluZygiX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwiKSk7DQorCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgew0KKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodChTV1QuREVGQVVMVCk7DQorCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOw0KKwkJCQlnZXRDb250YWluZXIoKS5zZXRTaXplKHBvaW50LngsIHBvaW50LnkgLSA2KTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdXNlZCB0byB0cmFjayB0aGUgYWN0aXZlIHZpZXdlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBwYWdlSW5kZXgpIHsNCisJCXN1cGVyLnBhZ2VDaGFuZ2UocGFnZUluZGV4KTsNCisNCisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgIT0gbnVsbCkgew0KKwkJCWhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKGNvbnRlbnRPdXRsaW5lUGFnZS5nZXRTZWxlY3Rpb24oKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgaG93IHRoZSBmcmFtZXdvcmsgZGV0ZXJtaW5lcyB3aGljaCBpbnRlcmZhY2VzIHdlIGltcGxlbWVudC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgew0KKwkJaWYgKGtleS5lcXVhbHMoSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcykpIHsNCisJCQlyZXR1cm4gc2hvd091dGxpbmVWaWV3KCkgPyBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSA6IG51bGw7DQorCQl9DQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykpIHsNCisJCQlyZXR1cm4gZ2V0UHJvcGVydHlTaGVldFBhZ2UoKTsNCisJCX0NCisJCWVsc2UgaWYgKGtleS5lcXVhbHMoSUdvdG9NYXJrZXIuY2xhc3MpKSB7DQorCQkJcmV0dXJuIHRoaXM7DQorCQl9DQorCQllbHNlIHsNCisJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIGNvbnRlbnQgb3V0bGluZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRPdXRsaW5lUGFnZSBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSB7DQorCQlpZiAoY29udGVudE91dGxpbmVQYWdlID09IG51bGwpIHsNCisJCQkvLyBUaGUgY29udGVudCBvdXRsaW5lIGlzIGp1c3QgYSB0cmVlLg0KKwkJCS8vDQorCQkJY2xhc3MgTXlDb250ZW50T3V0bGluZVBhZ2UgZXh0ZW5kcyBDb250ZW50T3V0bGluZVBhZ2Ugew0KKwkJCQlAT3ZlcnJpZGUNCisJCQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7DQorCQkJCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7DQorCQkJCQljb250ZW50T3V0bGluZVZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsNCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsNCisNCisJCQkJCS8vIFNldCB1cCB0aGUgdHJlZSB2aWV3ZXIuDQorCQkJCQkvLw0KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOw0KKw0KKwkJCQkJLy8gTWFrZSBzdXJlIG91ciBwb3B1cHMgd29yay4NCisJCQkJCS8vDQorCQkJCQljcmVhdGVDb250ZXh0TWVudUZvcihjb250ZW50T3V0bGluZVZpZXdlcik7DQorDQorCQkJCQlpZiAoIWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsNCisJCQkJCSAgLy8gU2VsZWN0IHRoZSByb290IG9iamVjdCBpbiB0aGUgdmlldy4NCisJCQkJCSAgLy8NCisJCQkJCSAgY29udGVudE91dGxpbmVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQlAT3ZlcnJpZGUNCisJCQkJcHVibGljIHZvaWQgbWFrZUNvbnRyaWJ1dGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlcikgew0KKwkJCQkJc3VwZXIubWFrZUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLCBzdGF0dXNMaW5lTWFuYWdlcik7DQorCQkJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyID0gc3RhdHVzTGluZU1hbmFnZXI7DQorCQkJCX0NCisNCisJCQkJQE92ZXJyaWRlDQorCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgew0KKwkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsNCisJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOw0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJCWNvbnRlbnRPdXRsaW5lUGFnZSA9IG5ldyBNeUNvbnRlbnRPdXRsaW5lUGFnZSgpOw0KKw0KKwkJCS8vIExpc3RlbiB0byBzZWxlY3Rpb24gc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGl0IGlzIGEgc3BlY2lhbCB3YXkuDQorCQkJLy8NCisJCQljb250ZW50T3V0bGluZVBhZ2UuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyDQorCQkJCShuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsNCisJCQkJCSAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBoYW5kbGUgc2VsZWN0aW9ucyBjb3JyZWN0bHkuDQorCQkJCQkgLy8NCisJCQkJCSBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgew0KKwkJCQkJCSBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7DQorCQkJCQkgfQ0KKwkJCQkgfSk7DQorCQl9DQorDQorCQlyZXR1cm4gY29udGVudE91dGxpbmVQYWdlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIHByb3BlcnR5IHNoZWV0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQcm9wZXJ0eVNoZWV0UGFnZSBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpIHsNCisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7DQorCQkJcHJvcGVydHlTaGVldFBhZ2UgPQ0KKwkJCQluZXcgRXh0ZW5kZWRQcm9wZXJ0eVNoZWV0UGFnZShlZGl0aW5nRG9tYWluKSB7DQorCQkJCQlAT3ZlcnJpZGUNCisJCQkJCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKExpc3Q8Pz4gc2VsZWN0aW9uKSB7DQorCQkJCQkJR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3IudGhpcy5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihzZWxlY3Rpb24pOw0KKwkJCQkJCUdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yLnRoaXMuc2V0Rm9jdXMoKTsNCisJCQkJCX0NCisNCisJCQkJCUBPdmVycmlkZQ0KKwkJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7DQorCQkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsNCisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsNCisJCQkJCX0NCisJCQkJfTsNCisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIHByb3BlcnR5U2hlZXRQYWdlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGRlYWxzIHdpdGggaG93IHdlIHdhbnQgc2VsZWN0aW9uIGluIHRoZSBvdXRsaW5lciB0byBhZmZlY3QgdGhlIG90aGVyIHZpZXdzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCWlmIChjdXJyZW50Vmlld2VyUGFuZSAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7DQorCQkJSXRlcmF0b3I8Pz4gc2VsZWN0ZWRFbGVtZW50cyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5pdGVyYXRvcigpOw0KKwkJCWlmIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgew0KKwkJCQkvLyBHZXQgdGhlIGZpcnN0IHNlbGVjdGVkIGVsZW1lbnQuDQorCQkJCS8vDQorCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzLm5leHQoKTsNCisNCisJCQkJLy8gSWYgaXQncyB0aGUgc2VsZWN0aW9uIHZpZXdlciwgdGhlbiB3ZSB3YW50IGl0IHRvIHNlbGVjdCB0aGUgc2FtZSBzZWxlY3Rpb24gYXMgdGhpcyBzZWxlY3Rpb24uDQorCQkJCS8vDQorCQkJCWlmIChjdXJyZW50Vmlld2VyUGFuZS5nZXRWaWV3ZXIoKSA9PSBzZWxlY3Rpb25WaWV3ZXIpIHsNCisJCQkJCUFycmF5TGlzdDxPYmplY3Q+IHNlbGVjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCisJCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudCk7DQorCQkJCQl3aGlsZSAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsNCisJCQkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnRzLm5leHQoKSk7DQorCQkJCQl9DQorDQorCQkJCQkvLyBTZXQgdGhlIHNlbGVjdGlvbiB0byB0aGUgd2lkZ2V0Lg0KKwkJCQkJLy8NCisJCQkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uTGlzdCkpOw0KKwkJCQl9DQorCQkJCWVsc2Ugew0KKwkJCQkJLy8gU2V0IHRoZSBpbnB1dCB0byB0aGUgd2lkZ2V0Lg0KKwkJCQkJLy8NCisJCQkJCWlmIChjdXJyZW50Vmlld2VyUGFuZS5nZXRWaWV3ZXIoKS5nZXRJbnB1dCgpICE9IHNlbGVjdGVkRWxlbWVudCkgew0KKwkJCQkJCWN1cnJlbnRWaWV3ZXJQYW5lLmdldFZpZXdlcigpLnNldElucHV0KHNlbGVjdGVkRWxlbWVudCk7DQorCQkJCQkJY3VycmVudFZpZXdlclBhbmUuc2V0VGl0bGUoc2VsZWN0ZWRFbGVtZW50KTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSB0ZXN0cyB0aGUgY29tbWFuZCBzdGFjay4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgew0KKwkJcmV0dXJuICgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuaXNTYXZlTmVlZGVkKCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSUVkaXRvclBhcnR9IGFuZCBzaW1wbHkgc2F2ZXMgdGhlIG1vZGVsIGZpbGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7DQorCQkvLyBTYXZlIG9ubHkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBhY3R1YWxseSBjaGFuZ2VkLg0KKwkJLy8NCisJCWZpbmFsIE1hcDxPYmplY3QsIE9iamVjdD4gc2F2ZU9wdGlvbnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsNCisJCXNhdmVPcHRpb25zLnB1dChSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRUQsIFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRF9NRU1PUllfQlVGRkVSKTsNCisNCisJCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtiZW5jaC4NCisJCS8vDQorCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0NCisJCQluZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgew0KKwkJCQkvLyBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBnZXRzIGludm9rZWQgd2hlbiB0aGUgb3BlcmF0aW9uIHJ1bnMuDQorCQkJCS8vDQorCQkJCUBPdmVycmlkZQ0KKwkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KKwkJCQkJLy8gU2F2ZSB0aGUgcmVzb3VyY2VzIHRvIHRoZSBmaWxlIHN5c3RlbS4NCisJCQkJCS8vDQorCQkJCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsNCisJCQkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpIHsNCisJCQkJCQlpZiAoKGZpcnN0IHx8ICFyZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSB8fCBpc1BlcnNpc3RlZChyZXNvdXJjZSkpICYmICFlZGl0aW5nRG9tYWluLmlzUmVhZE9ubHkocmVzb3VyY2UpKSB7DQorCQkJCQkJCXRyeSB7DQorCQkJCQkJCQlsb25nIHRpbWVTdGFtcCA9IHJlc291cmNlLmdldFRpbWVTdGFtcCgpOw0KKwkJCQkJCQkJcmVzb3VyY2Uuc2F2ZShzYXZlT3B0aW9ucyk7DQorCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VGltZVN0YW1wKCkgIT0gdGltZVN0YW1wKSB7DQorCQkJCQkJCQkJc2F2ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsNCisJCQkJCQkJCX0NCisJCQkJCQkJfQ0KKwkJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7DQorCQkJCQkJCX0NCisJCQkJCQkJZmlyc3QgPSBmYWxzZTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9Ow0KKw0KKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsNCisJCXRyeSB7DQorCQkJLy8gVGhpcyBydW5zIHRoZSBvcHRpb25zLCBhbmQgc2hvd3MgcHJvZ3Jlc3MuDQorCQkJLy8NCisJCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7DQorDQorCQkJLy8gUmVmcmVzaCB0aGUgbmVjZXNzYXJ5IHN0YXRlLg0KKwkJCS8vDQorCQkJKChCYXNpY0NvbW1hbmRTdGFjayllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5zYXZlSXNEb25lKCk7DQorCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOw0KKwkJfQ0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZyB0aGF0IHNob3VsZG4ndC4NCisJCQkvLw0KKwkJCUdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJfQ0KKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOw0KKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHdoZXRoZXIgc29tZXRoaW5nIGhhcyBiZWVuIHBlcnNpc3RlZCB0byB0aGUgVVJJIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuDQorCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBVUkkgY29udmVydGVyIGZyb20gdGhlIGVkaXRvcidzIHJlc291cmNlIHNldCB0byB0cnkgdG8gb3BlbiBhbiBpbnB1dCBzdHJlYW0uIA0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNQZXJzaXN0ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsNCisJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7DQorCQl0cnkgew0KKwkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbShyZXNvdXJjZS5nZXRVUkkoKSk7DQorCQkJaWYgKHN0cmVhbSAhPSBudWxsKSB7DQorCQkJCXJlc3VsdCA9IHRydWU7DQorCQkJCXN0cmVhbS5jbG9zZSgpOw0KKwkJCX0NCisJCX0NCisJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQorCQkJLy8gSWdub3JlDQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIHRydWUgYmVjYXVzZSBpdCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhbHNvIGNoYW5nZXMgdGhlIGVkaXRvcidzIGlucHV0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgew0KKwkJU2F2ZUFzRGlhbG9nIHNhdmVBc0RpYWxvZyA9IG5ldyBTYXZlQXNEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOw0KKwkJc2F2ZUFzRGlhbG9nLm9wZW4oKTsNCisJCUlQYXRoIHBhdGggPSBzYXZlQXNEaWFsb2cuZ2V0UmVzdWx0KCk7DQorCQlpZiAocGF0aCAhPSBudWxsKSB7DQorCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsNCisJCQlpZiAoZmlsZSAhPSBudWxsKSB7DQorCQkJCWRvU2F2ZUFzKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKSwgbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9TYXZlQXMoVVJJIHVyaSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7DQorCQkoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSkuc2V0VVJJKHVyaSk7DQorCQlzZXRJbnB1dFdpdGhOb3RpZnkoZWRpdG9ySW5wdXQpOw0KKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsNCisJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0NCisJCQlnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSAhPSBudWxsID8NCisJCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgOg0KKwkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOw0KKwkJZG9TYXZlKHByb2dyZXNzTW9uaXRvcik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7DQorCQl0cnkgew0KKwkJCWlmIChtYXJrZXIuZ2V0VHlwZSgpLmVxdWFscyhFVmFsaWRhdG9yLk1BUktFUikpIHsNCisJCQkJU3RyaW5nIHVyaUF0dHJpYnV0ZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoRVZhbGlkYXRvci5VUklfQVRUUklCVVRFLCBudWxsKTsNCisJCQkJaWYgKHVyaUF0dHJpYnV0ZSAhPSBudWxsKSB7DQorCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSSh1cmlBdHRyaWJ1dGUpOw0KKwkJCQkJRU9iamVjdCBlT2JqZWN0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldEVPYmplY3QodXJpLCB0cnVlKTsNCisJCQkJCWlmIChlT2JqZWN0ICE9IG51bGwpIHsNCisJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGVkaXRpbmdEb21haW4uZ2V0V3JhcHBlcihlT2JqZWN0KSkpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBzdGFydHVwLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7DQorCQlzZXRTaXRlKHNpdGUpOw0KKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsNCisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7DQorCQlzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKHRoaXMpOw0KKwkJc2l0ZS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7DQorCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7DQorCQlpZiAoY3VycmVudFZpZXdlclBhbmUgIT0gbnVsbCkgew0KKwkJCWN1cnJlbnRWaWV3ZXJQYW5lLnNldEZvY3VzKCk7DQorCQl9DQorCQllbHNlIHsNCisJCQlnZXRDb250cm9sKGdldEFjdGl2ZVBhZ2UoKSkuc2V0Rm9jdXMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgew0KKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7DQorCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHJldHVybiB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgew0KKwkJcmV0dXJuIGVkaXRvclNlbGVjdGlvbjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gc2V0IHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uDQorCSAqIENhbGxpbmcgdGhpcyByZXN1bHQgd2lsbCBub3RpZnkgdGhlIGxpc3RlbmVycy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJZWRpdG9yU2VsZWN0aW9uID0gc2VsZWN0aW9uOw0KKw0KKwkJZm9yIChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyIDogc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycykgew0KKwkJCWxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsNCisJCX0NCisJCXNldFN0YXR1c0xpbmVNYW5hZ2VyKHNlbGVjdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXNMaW5lTWFuYWdlcihJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyID0gY3VycmVudFZpZXdlciAhPSBudWxsICYmIGN1cnJlbnRWaWV3ZXIgPT0gY29udGVudE91dGxpbmVWaWV3ZXIgPw0KKwkJCWNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXIgOiBnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsNCisNCisJCWlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKSB7DQorCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7DQorCQkJCUNvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS50b0xpc3QoKTsNCisJCQkJc3dpdGNoIChjb2xsZWN0aW9uLnNpemUoKSkgew0KKwkJCQkJY2FzZSAwOiB7DQorCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9Ob09iamVjdFNlbGVjdGVkIikpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQkJY2FzZSAxOiB7DQorCQkJCQkJU3RyaW5nIHRleHQgPSBuZXcgQWRhcHRlckZhY3RvcnlJdGVtRGVsZWdhdG9yKGFkYXB0ZXJGYWN0b3J5KS5nZXRUZXh0KGNvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkpOw0KKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQiLCB0ZXh0KSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCQlkZWZhdWx0OiB7DQorCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9NdWx0aU9iamVjdFNlbGVjdGVkIiwgSW50ZWdlci50b1N0cmluZyhjb2xsZWN0aW9uLnNpemUoKSkpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQllbHNlIHsNCisJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZSgiIik7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHRoZSBwbHVnaW4ncyBwbHVnaW4ucHJvcGVydGllcyBmaWxlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7DQorCQlyZXR1cm4gR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gcGx1Z2luLnByb3BlcnRpZXMsIG1ha2luZyBhIHN1YnN0aXR1dGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxKSB7DQorCQlyZXR1cm4gR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSwgbmV3IE9iamVjdCBbXSB7IHMxIH0pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyfSB0byBoZWxwIGZpbGwgdGhlIGNvbnRleHQgbWVudXMgd2l0aCBjb250cmlidXRpb25zIGZyb20gdGhlIEVkaXQgbWVudS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsNCisJCSgoSU1lbnVMaXN0ZW5lcilnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSkubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7DQorCQlyZXR1cm4gKEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcilnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgew0KKwkJcmV0dXJuIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aW9uQmFycygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgew0KKwkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5Ow0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQorCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOw0KKw0KKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7DQorDQorCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOw0KKw0KKwkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOw0KKw0KKwkJaWYgKGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gdGhpcykgew0KKwkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKG51bGwpOw0KKwkJfQ0KKw0KKwkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsNCisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7DQorCQl9DQorDQorCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsNCisJCQljb250ZW50T3V0bGluZVBhZ2UuZGlzcG9zZSgpOw0KKwkJfQ0KKw0KKwkJc3VwZXIuZGlzcG9zZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG91dGxpbmUgdmlldyBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd091dGxpbmVWaWV3KCkgew0KKwkJcmV0dXJuIHRydWU7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvcHJlc2VudGF0aW9uL0dsb2JhbGluZmx1ZW56YW1vZGVsTW9kZWxXaXphcmQuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3ByZXNlbnRhdGlvbi9HbG9iYWxpbmZsdWVuemFtb2RlbE1vZGVsV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ1ZGJhYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3ByZXNlbnRhdGlvbi9HbG9iYWxpbmZsdWVuemFtb2RlbE1vZGVsV2l6YXJkLmphdmEKQEAgLTAsMCArMSw2MzkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLnByZXNlbnRhdGlvbjsNCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNldFNlbGVjdGlvblRhcmdldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLkdsb2JhbGluZmx1ZW56YW1vZGVsRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLkdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLnByb3ZpZGVyLkdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdFBsdWdpbjsNCisNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwucHJlc2VudGF0aW9uLkdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOw0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgYSBzaW1wbGUgd2l6YXJkIGZvciBjcmVhdGluZyBhIG5ldyBtb2RlbCBmaWxlLg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBHbG9iYWxpbmZsdWVuemFtb2RlbE1vZGVsV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7DQorCS8qKg0KKwkgKiBUaGUgc3VwcG9ydGVkIGV4dGVuc2lvbnMgZm9yIGNyZWF0ZWQgZmlsZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBGSUxFX0VYVEVOU0lPTlMgPQ0KKwkJQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KEdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0dsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yRmlsZW5hbWVFeHRlbnNpb25zIikuc3BsaXQoIlxccyosXFxzKiIpKSk7DQorDQorCS8qKg0KKwkgKiBBIGZvcm1hdHRlZCBsaXN0IG9mIHN1cHBvcnRlZCBmaWxlIGV4dGVuc2lvbnMsIHN1aXRhYmxlIGZvciBkaXNwbGF5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVEX0ZJTEVfRVhURU5TSU9OUyA9DQorCQlHbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9HbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9ucyIpLnJlcGxhY2VBbGwoIlxccyosXFxzKiIsICIsICIpOw0KKw0KKwkvKioNCisJICogVGhpcyBjYWNoZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIHBhY2thZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlIGdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZSA9IEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZS5lSU5TVEFOQ0U7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNhY2hlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBHbG9iYWxpbmZsdWVuemFtb2RlbEZhY3RvcnkgZ2xvYmFsaW5mbHVlbnphbW9kZWxGYWN0b3J5ID0gZ2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLmdldEdsb2JhbGluZmx1ZW56YW1vZGVsRmFjdG9yeSgpOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgZmlsZSBjcmVhdGlvbiBwYWdlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEdsb2JhbGluZmx1ZW56YW1vZGVsTW9kZWxXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIG5ld0ZpbGVDcmVhdGlvblBhZ2U7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBpbml0aWFsIG9iamVjdCBjcmVhdGlvbiBwYWdlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEdsb2JhbGluZmx1ZW56YW1vZGVsTW9kZWxXaXphcmRJbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlIGluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2U7DQorDQorCS8qKg0KKwkgKiBSZW1lbWJlciB0aGUgc2VsZWN0aW9uIGR1cmluZyBpbml0aWFsaXphdGlvbiBmb3IgcG9wdWxhdGluZyB0aGUgZGVmYXVsdCBjb250YWluZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOw0KKw0KKwkvKioNCisJICogUmVtZW1iZXIgdGhlIHdvcmtiZW5jaCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVdvcmtiZW5jaCB3b3JrYmVuY2g7DQorDQorCS8qKg0KKwkgKiBDYWNoZXMgdGhlIG5hbWVzIG9mIHRoZSB0eXBlcyB0aGF0IGNhbiBiZSBjcmVhdGVkIGFzIHRoZSByb290IG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gaW5pdGlhbE9iamVjdE5hbWVzOw0KKw0KKwkvKioNCisJICogVGhpcyBqdXN0IHJlY29yZHMgdGhlIGluZm9ybWF0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQl0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsNCisJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOw0KKwkJc2V0V2luZG93VGl0bGUoR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV2l6YXJkX2xhYmVsIikpOw0KKwkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LklOU1RBTkNFLmdldEltYWdlRGVzY3JpcHRvcihHbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC93aXpiYW4vTmV3R2xvYmFsaW5mbHVlbnphbW9kZWwiKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgdHlwZXMgdGhhdCBjYW4gYmUgY3JlYXRlZCBhcyB0aGUgcm9vdCBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEluaXRpYWxPYmplY3ROYW1lcygpIHsNCisJCWlmIChpbml0aWFsT2JqZWN0TmFtZXMgPT0gbnVsbCkgew0KKwkJCWluaXRpYWxPYmplY3ROYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KKwkJCWZvciAoRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgOiBnbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuZ2V0RUNsYXNzaWZpZXJzKCkpIHsNCisJCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7DQorCQkJCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcyllQ2xhc3NpZmllcjsNCisJCQkJCWlmICghZUNsYXNzLmlzQWJzdHJhY3QoKSkgew0KKwkJCQkJCWluaXRpYWxPYmplY3ROYW1lcy5hZGQoZUNsYXNzLmdldE5hbWUoKSk7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJQ29sbGVjdGlvbnMuc29ydChpbml0aWFsT2JqZWN0TmFtZXMsIENvbW1vblBsdWdpbi5JTlNUQU5DRS5nZXRDb21wYXJhdG9yKCkpOw0KKwkJfQ0KKwkJcmV0dXJuIGluaXRpYWxPYmplY3ROYW1lczsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlIGEgbmV3IG1vZGVsLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgY3JlYXRlSW5pdGlhbE1vZGVsKCkgew0KKwkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpZ2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLmdldEVDbGFzc2lmaWVyKGluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UuZ2V0SW5pdGlhbE9iamVjdE5hbWUoKSk7DQorCQlFT2JqZWN0IHJvb3RPYmplY3QgPSBnbG9iYWxpbmZsdWVuemFtb2RlbEZhY3RvcnkuY3JlYXRlKGVDbGFzcyk7DQorCQlyZXR1cm4gcm9vdE9iamVjdDsNCisJfQ0KKw0KKwkvKioNCisJICogRG8gdGhlIHdvcmsgYWZ0ZXIgZXZlcnl0aGluZyBpcyBzcGVjaWZpZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsNCisJCXRyeSB7DQorCQkJLy8gUmVtZW1iZXIgdGhlIGZpbGUuDQorCQkJLy8NCisJCQlmaW5hbCBJRmlsZSBtb2RlbEZpbGUgPSBnZXRNb2RlbEZpbGUoKTsNCisNCisJCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uLg0KKwkJCS8vDQorCQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9DQorCQkJCW5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7DQorCQkJCQlAT3ZlcnJpZGUNCisJCQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsNCisJCQkJCQl0cnkgew0KKwkJCQkJCQkvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQNCisJCQkJCQkJLy8NCisJCQkJCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7DQorDQorCQkJCQkJCS8vIEdldCB0aGUgVVJJIG9mIHRoZSBtb2RlbCBmaWxlLg0KKwkJCQkJCQkvLw0KKwkJCQkJCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKG1vZGVsRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpOw0KKw0KKwkJCQkJCQkvLyBDcmVhdGUgYSByZXNvdXJjZSBmb3IgdGhpcyBmaWxlLg0KKwkJCQkJCQkvLw0KKwkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKGZpbGVVUkkpOw0KKw0KKwkJCQkJCQkvLyBBZGQgdGhlIGluaXRpYWwgbW9kZWwgb2JqZWN0IHRvIHRoZSBjb250ZW50cy4NCisJCQkJCQkJLy8NCisJCQkJCQkJRU9iamVjdCByb290T2JqZWN0ID0gY3JlYXRlSW5pdGlhbE1vZGVsKCk7DQorCQkJCQkJCWlmIChyb290T2JqZWN0ICE9IG51bGwpIHsNCisJCQkJCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHJvb3RPYmplY3QpOw0KKwkJCQkJCQl9DQorDQorCQkJCQkJCS8vIFNhdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSByZXNvdXJjZSB0byB0aGUgZmlsZSBzeXN0ZW0uDQorCQkJCQkJCS8vDQorCQkJCQkJCU1hcDxPYmplY3QsIE9iamVjdD4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOw0KKwkJCQkJCQlvcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsIGluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UuZ2V0RW5jb2RpbmcoKSk7DQorCQkJCQkJCXJlc291cmNlLnNhdmUob3B0aW9ucyk7DQorCQkJCQkJfQ0KKwkJCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJCQkJCUdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJCQkJCX0NCisJCQkJCQlmaW5hbGx5IHsNCisJCQkJCQkJcHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX07DQorDQorCQkJZ2V0Q29udGFpbmVyKCkucnVuKGZhbHNlLCBmYWxzZSwgb3BlcmF0aW9uKTsNCisNCisJCQkvLyBTZWxlY3QgdGhlIG5ldyBmaWxlIHJlc291cmNlIGluIHRoZSBjdXJyZW50IHZpZXcuDQorCQkJLy8NCisJCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsNCisJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsNCisJCQlmaW5hbCBJV29ya2JlbmNoUGFydCBhY3RpdmVQYXJ0ID0gcGFnZS5nZXRBY3RpdmVQYXJ0KCk7DQorCQkJaWYgKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KSB7DQorCQkJCWZpbmFsIElTZWxlY3Rpb24gdGFyZ2V0U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obW9kZWxGaWxlKTsNCisJCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjDQorCQkJCQkobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCSAoKElTZXRTZWxlY3Rpb25UYXJnZXQpYWN0aXZlUGFydCkuc2VsZWN0UmV2ZWFsKHRhcmdldFNlbGVjdGlvbik7DQorCQkJCQkJIH0NCisJCQkJCSB9KTsNCisJCQl9DQorDQorCQkJLy8gT3BlbiBhbiBlZGl0b3Igb24gdGhlIG5ldyBmaWxlLg0KKwkJCS8vDQorCQkJdHJ5IHsNCisJCQkJcGFnZS5vcGVuRWRpdG9yDQorCQkJCQkobmV3IEZpbGVFZGl0b3JJbnB1dChtb2RlbEZpbGUpLA0KKwkJCQkJIHdvcmtiZW5jaC5nZXRFZGl0b3JSZWdpc3RyeSgpLmdldERlZmF1bHRFZGl0b3IobW9kZWxGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkuZ2V0SWQoKSk7DQorCQkJfQ0KKwkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Iod29ya2JlbmNoV2luZG93LmdldFNoZWxsKCksIEdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbCIpLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsNCisJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCX0NCisNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBvbmUgcGFnZSBvZiB0aGUgd2l6YXJkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIEdsb2JhbGluZmx1ZW56YW1vZGVsTW9kZWxXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSB7DQorCQkvKioNCisJCSAqIFBhc3MgaW4gdGhlIHNlbGVjdGlvbi4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIEdsb2JhbGluZmx1ZW56YW1vZGVsTW9kZWxXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlKFN0cmluZyBwYWdlSWQsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJCXN1cGVyKHBhZ2VJZCwgc2VsZWN0aW9uKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogVGhlIGZyYW1ld29yayBjYWxscyB0aGlzIHRvIHNlZSBpZiB0aGUgZmlsZSBpcyBjb3JyZWN0Lg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlAT3ZlcnJpZGUNCisJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsNCisJCQlpZiAoc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsNCisJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IG5ldyBQYXRoKGdldEZpbGVOYW1lKCkpLmdldEZpbGVFeHRlbnNpb24oKTsNCisJCQkJaWYgKGV4dGVuc2lvbiA9PSBudWxsIHx8ICFGSUxFX0VYVEVOU0lPTlMuY29udGFpbnMoZXh0ZW5zaW9uKSkgew0KKwkJCQkJU3RyaW5nIGtleSA9IEZJTEVfRVhURU5TSU9OUy5zaXplKCkgPiAxID8gIl9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9ucyIgOiAiX1dBUk5fRmlsZW5hbWVFeHRlbnNpb24iOw0KKwkJCQkJc2V0RXJyb3JNZXNzYWdlKEdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXksIG5ldyBPYmplY3QgW10geyBGT1JNQVRURURfRklMRV9FWFRFTlNJT05TIH0pKTsNCisJCQkJCXJldHVybiBmYWxzZTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBJRmlsZSBnZXRNb2RlbEZpbGUoKSB7DQorCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShnZXRDb250YWluZXJGdWxsUGF0aCgpLmFwcGVuZChnZXRGaWxlTmFtZSgpKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIHBhZ2Ugd2hlcmUgdGhlIHR5cGUgb2Ygb2JqZWN0IHRvIGNyZWF0ZSBpcyBzZWxlY3RlZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBHbG9iYWxpbmZsdWVuemFtb2RlbE1vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSBleHRlbmRzIFdpemFyZFBhZ2Ugew0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBDb21ibyBpbml0aWFsT2JqZWN0RmllbGQ7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqLw0KKwkJcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBlbmNvZGluZ3M7DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJvdGVjdGVkIENvbWJvIGVuY29kaW5nRmllbGQ7DQorDQorCQkvKioNCisJCSAqIFBhc3MgaW4gdGhlIHNlbGVjdGlvbi4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIEdsb2JhbGluZmx1ZW56YW1vZGVsTW9kZWxXaXphcmRJbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlKFN0cmluZyBwYWdlSWQpIHsNCisJCQlzdXBlcihwYWdlSWQpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KKwkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOw0KKwkJCXsNCisJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOw0KKwkJCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7DQorCQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxMjsNCisJCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOw0KKw0KKwkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7DQorCQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsNCisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCisJCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7DQorCQkJfQ0KKw0KKwkJCUxhYmVsIGNvbnRhaW5lckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOw0KKwkJCXsNCisJCQkJY29udGFpbmVyTGFiZWwuc2V0VGV4dChHbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Nb2RlbE9iamVjdCIpKTsNCisNCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJCQljb250YWluZXJMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOw0KKwkJCX0NCisNCisJCQlpbml0aWFsT2JqZWN0RmllbGQgPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSKTsNCisJCQl7DQorCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsNCisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCisJCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsNCisJCQkJaW5pdGlhbE9iamVjdEZpZWxkLnNldExheW91dERhdGEoZGF0YSk7DQorCQkJfQ0KKw0KKwkJCWZvciAoU3RyaW5nIG9iamVjdE5hbWUgOiBnZXRJbml0aWFsT2JqZWN0TmFtZXMoKSkgew0KKwkJCQlpbml0aWFsT2JqZWN0RmllbGQuYWRkKGdldExhYmVsKG9iamVjdE5hbWUpKTsNCisJCQl9DQorDQorCQkJaWYgKGluaXRpYWxPYmplY3RGaWVsZC5nZXRJdGVtQ291bnQoKSA9PSAxKSB7DQorCQkJCWluaXRpYWxPYmplY3RGaWVsZC5zZWxlY3QoMCk7DQorCQkJfQ0KKwkJCWluaXRpYWxPYmplY3RGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih2YWxpZGF0b3IpOw0KKw0KKwkJCUxhYmVsIGVuY29kaW5nTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7DQorCQkJew0KKwkJCQllbmNvZGluZ0xhYmVsLnNldFRleHQoR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfWE1MRW5jb2RpbmciKSk7DQorDQorCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsNCisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCisJCQkJZW5jb2RpbmdMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOw0KKwkJCX0NCisJCQllbmNvZGluZ0ZpZWxkID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7DQorCQkJew0KKwkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7DQorCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQorCQkJCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7DQorCQkJCWVuY29kaW5nRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsNCisJCQl9DQorDQorCQkJZm9yIChTdHJpbmcgZW5jb2RpbmcgOiBnZXRFbmNvZGluZ3MoKSkgew0KKwkJCQllbmNvZGluZ0ZpZWxkLmFkZChlbmNvZGluZyk7DQorCQkJfQ0KKw0KKwkJCWVuY29kaW5nRmllbGQuc2VsZWN0KDApOw0KKwkJCWVuY29kaW5nRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodmFsaWRhdG9yKTsNCisNCisJCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOw0KKwkJCXNldENvbnRyb2woY29tcG9zaXRlKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgdmFsaWRhdG9yID0NCisJCQluZXcgTW9kaWZ5TGlzdGVuZXIoKSB7DQorCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgew0KKwkJCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgew0KKwkJCXJldHVybiBnZXRJbml0aWFsT2JqZWN0TmFtZSgpICE9IG51bGwgJiYgZ2V0RW5jb2RpbmdzKCkuY29udGFpbnMoZW5jb2RpbmdGaWVsZC5nZXRUZXh0KCkpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsNCisJCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOw0KKwkJCWlmICh2aXNpYmxlKSB7DQorCQkJCWlmIChpbml0aWFsT2JqZWN0RmllbGQuZ2V0SXRlbUNvdW50KCkgPT0gMSkgew0KKwkJCQkJaW5pdGlhbE9iamVjdEZpZWxkLmNsZWFyU2VsZWN0aW9uKCk7DQorCQkJCQllbmNvZGluZ0ZpZWxkLnNldEZvY3VzKCk7DQorCQkJCX0NCisJCQkJZWxzZSB7DQorCQkJCQllbmNvZGluZ0ZpZWxkLmNsZWFyU2VsZWN0aW9uKCk7DQorCQkJCQlpbml0aWFsT2JqZWN0RmllbGQuc2V0Rm9jdXMoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxPYmplY3ROYW1lKCkgew0KKwkJCVN0cmluZyBsYWJlbCA9IGluaXRpYWxPYmplY3RGaWVsZC5nZXRUZXh0KCk7DQorDQorCQkJZm9yIChTdHJpbmcgbmFtZSA6IGdldEluaXRpYWxPYmplY3ROYW1lcygpKSB7DQorCQkJCWlmIChnZXRMYWJlbChuYW1lKS5lcXVhbHMobGFiZWwpKSB7DQorCQkJCQlyZXR1cm4gbmFtZTsNCisJCQkJfQ0KKwkJCX0NCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgew0KKwkJCXJldHVybiBlbmNvZGluZ0ZpZWxkLmdldFRleHQoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZSBuYW1lLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKFN0cmluZyB0eXBlTmFtZSkgew0KKwkJCXRyeSB7DQorCQkJCXJldHVybiBHbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfIiArIHR5cGVOYW1lICsgIl90eXBlIik7DQorCQkJfQ0KKwkJCWNhdGNoKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUpIHsNCisJCQkJR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKG1yZSk7DQorCQkJfQ0KKwkJCXJldHVybiB0eXBlTmFtZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEVuY29kaW5ncygpIHsNCisJCQlpZiAoZW5jb2RpbmdzID09IG51bGwpIHsNCisJCQkJZW5jb2RpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQorCQkJCWZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfWE1MRW5jb2RpbmdDaG9pY2VzIikpOyBzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpOyApIHsNCisJCQkJCWVuY29kaW5ncy5hZGQoc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpKTsNCisJCQkJfQ0KKwkJCX0NCisJCQlyZXR1cm4gZW5jb2RpbmdzOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGUgZnJhbWV3b3JrIGNhbGxzIHRoaXMgdG8gY3JlYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgd2l6YXJkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsNCisJCS8vIENyZWF0ZSBhIHBhZ2UsIHNldCB0aGUgdGl0bGUsIGFuZCB0aGUgaW5pdGlhbCBtb2RlbCBmaWxlIG5hbWUuDQorCQkvLw0KKwkJbmV3RmlsZUNyZWF0aW9uUGFnZSA9IG5ldyBHbG9iYWxpbmZsdWVuemFtb2RlbE1vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSgiV2hhdGV2ZXIiLCBzZWxlY3Rpb24pOw0KKwkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXRUaXRsZShHbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9HbG9iYWxpbmZsdWVuemFtb2RlbE1vZGVsV2l6YXJkX2xhYmVsIikpOw0KKwkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXREZXNjcmlwdGlvbihHbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9HbG9iYWxpbmZsdWVuemFtb2RlbE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uIikpOw0KKwkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXRGaWxlTmFtZShHbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9HbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2UiKSArICIuIiArIEZJTEVfRVhURU5TSU9OUy5nZXQoMCkpOw0KKwkJYWRkUGFnZShuZXdGaWxlQ3JlYXRpb25QYWdlKTsNCisNCisJCS8vIFRyeSBhbmQgZ2V0IHRoZSByZXNvdXJjZSBzZWxlY3Rpb24gdG8gZGV0ZXJtaW5lIGEgY3VycmVudCBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlIGRpYWxvZy4NCisJCS8vDQorCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCisJCQkvLyBHZXQgdGhlIHJlc291cmNlLi4uDQorCQkJLy8NCisJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpOw0KKwkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsNCisJCQkJLy8gR2V0IHRoZSByZXNvdXJjZSBwYXJlbnQsIGlmIGl0cyBhIGZpbGUuDQorCQkJCS8vDQorCQkJCUlSZXNvdXJjZSBzZWxlY3RlZFJlc291cmNlID0gKElSZXNvdXJjZSlzZWxlY3RlZEVsZW1lbnQ7DQorCQkJCWlmIChzZWxlY3RlZFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgew0KKwkJCQkJc2VsZWN0ZWRSZXNvdXJjZSA9IHNlbGVjdGVkUmVzb3VyY2UuZ2V0UGFyZW50KCk7DQorCQkJCX0NCisNCisJCQkJLy8gVGhpcyBnaXZlcyB1cyBhIGRpcmVjdG9yeS4uLg0KKwkJCQkvLw0KKwkJCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIgfHwgc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7DQorCQkJCQkvLyBTZXQgdGhpcyBmb3IgdGhlIGNvbnRhaW5lci4NCisJCQkJCS8vDQorCQkJCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldENvbnRhaW5lckZ1bGxQYXRoKHNlbGVjdGVkUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7DQorDQorCQkJCQkvLyBNYWtlIHVwIGEgdW5pcXVlIG5ldyBuYW1lIGhlcmUuDQorCQkJCQkvLw0KKwkJCQkJU3RyaW5nIGRlZmF1bHRNb2RlbEJhc2VGaWxlbmFtZSA9IEdsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0dsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZSIpOw0KKwkJCQkJU3RyaW5nIGRlZmF1bHRNb2RlbEZpbGVuYW1lRXh0ZW5zaW9uID0gRklMRV9FWFRFTlNJT05TLmdldCgwKTsNCisJCQkJCVN0cmluZyBtb2RlbEZpbGVuYW1lID0gZGVmYXVsdE1vZGVsQmFzZUZpbGVuYW1lICsgIi4iICsgZGVmYXVsdE1vZGVsRmlsZW5hbWVFeHRlbnNpb247DQorCQkJCQlmb3IgKGludCBpID0gMTsgKChJQ29udGFpbmVyKXNlbGVjdGVkUmVzb3VyY2UpLmZpbmRNZW1iZXIobW9kZWxGaWxlbmFtZSkgIT0gbnVsbDsgKytpKSB7DQorCQkJCQkJbW9kZWxGaWxlbmFtZSA9IGRlZmF1bHRNb2RlbEJhc2VGaWxlbmFtZSArIGkgKyAiLiIgKyBkZWZhdWx0TW9kZWxGaWxlbmFtZUV4dGVuc2lvbjsNCisJCQkJCX0NCisJCQkJCW5ld0ZpbGVDcmVhdGlvblBhZ2Uuc2V0RmlsZU5hbWUobW9kZWxGaWxlbmFtZSk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlID0gbmV3IEdsb2JhbGluZmx1ZW56YW1vZGVsTW9kZWxXaXphcmRJbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlKCJXaGF0ZXZlcjIiKTsNCisJCWluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2Uuc2V0VGl0bGUoR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR2xvYmFsaW5mbHVlbnphbW9kZWxNb2RlbFdpemFyZF9sYWJlbCIpKTsNCisJCWluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2Uuc2V0RGVzY3JpcHRpb24oR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV2l6YXJkX2luaXRpYWxfb2JqZWN0X2Rlc2NyaXB0aW9uIikpOw0KKwkJYWRkUGFnZShpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlKTsNCisJfQ0KKw0KKwkvKioNCisJICogR2V0IHRoZSBmaWxlIGZyb20gdGhlIHBhZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpbGUgZ2V0TW9kZWxGaWxlKCkgew0KKwkJcmV0dXJuIG5ld0ZpbGVDcmVhdGlvblBhZ2UuZ2V0TW9kZWxGaWxlKCk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvcHJlc2VudGF0aW9uL0dsb2JhbGluZmx1ZW56YW1vZGVsQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvcHJlc2VudGF0aW9uL0dsb2JhbGluZmx1ZW56YW1vZGVsQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzdhYWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9wcmVzZW50YXRpb24vR2xvYmFsaW5mbHVlbnphbW9kZWxBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw0MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwucHJlc2VudGF0aW9uOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZGlzZWFzZW1vZGVscHJvcGVydHllZGl0b3IuRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5kaXNlYXNlbW9kZWxwcm9wZXJ0eWVkaXRvci5EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLkRpc2Vhc2VNb2RlbFByb3BlcnR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CisKKy8qKgorICogIAorICogQWRhcHRlciBmb3IgUHJvcGVydHkgRWRpdG9yCisgKgorICovCitwdWJsaWMgY2xhc3MgR2xvYmFsaW5mbHVlbnphbW9kZWxBZGFwdGVyIGV4dGVuZHMKKwkJRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyIHsKKworCS8qKgorCSAqIAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvciBjcmVhdGVEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcigKKwkJCURpc2Vhc2VNb2RlbFByb3BlcnR5Q29tcG9zaXRlIGRpc2Vhc2VNb2RlbFByb3BlcnR5Q29tcG9zaXRlLAorCQkJaW50IHN0eWxlLCBNb2RpZnlMaXN0ZW5lciBwcm9qZWN0VmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB7CisJCXJldHVybiBuZXcgR2xvYmFsaW5mbHVlbnphbW9kZWxQcm9wZXJ0eUVkaXRvcigKKwkJCQlkaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZSwgc3R5bGUsCisJCQkJKERpc2Vhc2VNb2RlbCkgZ2V0VGFyZ2V0KCksIHByb2plY3RWYWxpZGF0b3IsIHByb2plY3QpOworCX0gLy8gY3JlYXRlRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IKKworfSAvLyBGb3JjaW5nRGlzZWFzZU1vZGVsQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvcHJlc2VudGF0aW9uL0dsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yUGx1Z2luLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9wcmVzZW50YXRpb24vR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjZjMDNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvcHJlc2VudGF0aW9uL0dsb2JhbGluZmx1ZW56YW1vZGVsRWRpdG9yUGx1Z2luLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLnByZXNlbnRhdGlvbjsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5FTUZQbHVnaW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuRWNsaXBzZVVJUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRWNvcmVFZGl0UGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnByb3ZpZGVyLkRlZmluaXRpb25zRWRpdFBsdWdpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLkRpc2Vhc2Vtb2RlbHNFZGl0UGx1Z2luOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgR2xvYmFsaW5mbHVlbnphbW9kZWwgZWRpdG9yIHBsdWdpbi4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgZmluYWwgY2xhc3MgR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4gew0KKwkvKioNCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBHbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvclBsdWdpbiBJTlNUQU5DRSA9IG5ldyBHbG9iYWxpbmZsdWVuemFtb2RlbEVkaXRvclBsdWdpbigpOw0KKwkNCisJLyoqDQorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsNCisNCisJLyoqDQorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgR2xvYmFsaW5mbHVlbnphbW9kZWxFZGl0b3JQbHVnaW4oKSB7DQorCQlzdXBlcg0KKwkJCShuZXcgUmVzb3VyY2VMb2NhdG9yIFtdIHsNCisJCQkJRGlzZWFzZW1vZGVsc0VkaXRQbHVnaW4uSU5TVEFOQ0UsDQorCQkJCUNvcmVFZGl0UGx1Z2luLklOU1RBTkNFLA0KKwkJCQlFY29yZUVkaXRQbHVnaW4uSU5TVEFOQ0UsDQorCQkJCURlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRSwNCisJCQl9KTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgew0KKwkJcmV0dXJuIHBsdWdpbjsNCisJfQ0KKwkNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgew0KKwkJcmV0dXJuIHBsdWdpbjsNCisJfQ0KKwkNCisJLyoqDQorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4gew0KKwkJLyoqDQorCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7DQorCQkJc3VwZXIoKTsNCisJDQorCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4NCisJCQkvLw0KKwkJCXBsdWdpbiA9IHRoaXM7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvcHJlc2VudGF0aW9uL0dsb2JhbGluZmx1ZW56YW1vZGVsUHJvcGVydHlFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3ByZXNlbnRhdGlvbi9HbG9iYWxpbmZsdWVuemFtb2RlbFByb3BlcnR5RWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4OGJhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3ByZXNlbnRhdGlvbi9HbG9iYWxpbmZsdWVuemFtb2RlbFByb3BlcnR5RWRpdG9yLmphdmEKQEAgLTAsMCArMSwxMjggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLnByZXNlbnRhdGlvbjsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5HbG9iYWxJbmZsdWVuemFNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwuR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5kaXNlYXNlbW9kZWxwcm9wZXJ0eWVkaXRvci5EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuRGlzZWFzZVdpemFyZE1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworCisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBHbG9iYWxpbmZsdWVuemFtb2RlbFByb3BlcnR5RWRpdG9yIGV4dGVuZHMKKwkJRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IgeworCQorCS8qKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gc3R5bGUKKwkgKiBAcGFyYW0gZGlzZWFzZU1vZGVsCisJICogQHBhcmFtIHByb2plY3RWYWxpZGF0b3IKKwkgKi8KKwlwdWJsaWMgR2xvYmFsaW5mbHVlbnphbW9kZWxQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50LAorCQkJaW50IHN0eWxlLCBEaXNlYXNlTW9kZWwgZGlzZWFzZU1vZGVsLAorCQkJTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcihwYXJlbnQsIHN0eWxlLCBkaXNlYXNlTW9kZWwsIHByb2plY3RWYWxpZGF0b3IsIHByb2plY3QpOworCisJfSAvLyBHbG9iYWxpbmZsdWVuemFNb2RlbFByb3BlcnR5RWRpdG9yCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5TdGFuZGFyZERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yI3BvcHVsYXRlKG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcG9wdWxhdGUoRGlzZWFzZU1vZGVsIGRpc2Vhc2VNb2RlbCkgeworCQlzdXBlci5wb3B1bGF0ZShkaXNlYXNlTW9kZWwpOworCQkKKwkJZm9yIChmaW5hbCBNYXAuRW50cnk8RVN0cnVjdHVyYWxGZWF0dXJlLCBUZXh0PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7CisJCQlkb3VibGUgZFZhbCA9IDAuMDsKKwkJCWludCBpVmFsID0gMDsKKwkJCXN3aXRjaCAoZW50cnkuZ2V0S2V5KCkuZ2V0RmVhdHVyZUlEKCkpIHsKKwkJCWNhc2UgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLkdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX1NFQVNPTkFMX01PRFVMQVRJT05fRkxPT1I6CisJCQkJZFZhbCA9IChuZXcgRG91YmxlKGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpKSkuZG91YmxlVmFsdWUoKTsKKwkJCQkoKEdsb2JhbEluZmx1ZW56YU1vZGVsKSBkaXNlYXNlTW9kZWwpLnNldFNlYXNvbmFsTW9kdWxhdGlvbkZsb29yKGRWYWwpOworCQkJCWJyZWFrOworCQkJY2FzZSBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fU0VBU09OQUxfTU9EVUxBVElPTl9FWFBPTkVOVDoKKwkJCQlpVmFsID0gKG5ldyBJbnRlZ2VyKGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpKSkuaW50VmFsdWUoKTsKKwkJCQkoKEdsb2JhbEluZmx1ZW56YU1vZGVsKSBkaXNlYXNlTW9kZWwpLnNldFNlYXNvbmFsTW9kdWxhdGlvbkV4cG9uZW50KGlWYWwpOworCQkJCWJyZWFrOwkKKwkJCWNhc2UgR2xvYmFsaW5mbHVlbnphbW9kZWxQYWNrYWdlLkdMT0JBTF9JTkZMVUVOWkFfTU9ERUxfX01PRFVMQVRJT05fUEVSSU9EOgorCQkJCWRWYWwgPSAobmV3IERvdWJsZShlbnRyeS5nZXRWYWx1ZSgpLmdldFRleHQoKSkpLmRvdWJsZVZhbHVlKCk7CisJCQkJKChHbG9iYWxJbmZsdWVuemFNb2RlbCkgZGlzZWFzZU1vZGVsKQorCQkJCQkJLnNldE1vZHVsYXRpb25QZXJpb2QoZFZhbCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEdsb2JhbGluZmx1ZW56YW1vZGVsUGFja2FnZS5HTE9CQUxfSU5GTFVFTlpBX01PREVMX19NT0RVTEFUSU9OX1BIQVNFX1NISUZUOgorCQkJCWRWYWwgPSAobmV3IERvdWJsZShlbnRyeS5nZXRWYWx1ZSgpLmdldFRleHQoKSkpLmRvdWJsZVZhbHVlKCk7CisJCQkJKChHbG9iYWxJbmZsdWVuemFNb2RlbCkgZGlzZWFzZU1vZGVsKQorCQkJCQkJLnNldE1vZHVsYXRpb25QaGFzZVNoaWZ0KGRWYWwpOworCQkJCWJyZWFrOworCQkJY2FzZSBHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fTEFUSVRVREVfU0lHTU9JRF9XSURUSDoKKwkJCQlkVmFsID0gKG5ldyBEb3VibGUoZW50cnkuZ2V0VmFsdWUoKS5nZXRUZXh0KCkpKS5kb3VibGVWYWx1ZSgpOworCQkJCSgoR2xvYmFsSW5mbHVlbnphTW9kZWwpIGRpc2Vhc2VNb2RlbCkKKwkJCQkJCS5zZXRMYXRpdHVkZVNpZ21vaWRXaWR0aChkVmFsKTsKKwkJCQlicmVhazsKKwkJCQorCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0gLy8gc3dpdGNoCisJCX0gLy8gZm9yIGVhY2ggTWFwLmVudHJ5CisJCQorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLlN0YW5kYXJkRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IjdmFsaWRhdGUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgeworCQlib29sZWFuIHJldFZhbHVlID0gc3VwZXIudmFsaWRhdGUoKTsKKwkJLy8gRGlzZWFzZSBEYXRhIERpcmVjdG9yeSBvciBGaWxlCisJCWlmIChyZXRWYWx1ZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBUZXh0IHRleHQgPSBtYXAKKwkJCQkJLmdldChHbG9iYWxpbmZsdWVuemFtb2RlbFBhY2thZ2UuTGl0ZXJhbHMuR0xPQkFMX0lORkxVRU5aQV9NT0RFTF9fTU9EVUxBVElPTl9QRVJJT0QpOworCQkJU3RyaW5nIHNWYWwgPSB0ZXh0LmdldFRleHQoKTsKKwkJCXRyeSB7CisJCQkJLy8gVE9ETyBjaGVjayBpZiBhbGwgdGhyZWUgcGFyYW1zIGFyZSBhIHZhbGlkIG51bWJlcgorCQkJCW5ldyBEb3VibGUoc1ZhbCk7CisJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQllcnJvck1lc3NhZ2UgPSBEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJORGl6V2l6RXJyMjAiKTsgLy8kTk9OLU5MUy0xJAorCQkJfSAvLyBpZgorCQl9IC8vIGlmCisJCQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfQorCQorfSAvLyBHbG9iYWxpbmZsdWVuemFNb2RlbFByb3BlcnR5RWRpdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9wcmVzZW50YXRpb24vR2xvYmFsaW5mbHVlbnphbW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9wcmVzZW50YXRpb24vR2xvYmFsaW5mbHVlbnphbW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlkOGFlZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3ByZXNlbnRhdGlvbi9HbG9iYWxpbmZsdWVuemFtb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5wcmVzZW50YXRpb247CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLnV0aWwuR2xvYmFsaW5mbHVlbnphbW9kZWxBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmRpc2Vhc2Vtb2RlbHByb3BlcnR5ZWRpdG9yLkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmRpc2Vhc2Vtb2RlbHByb3BlcnR5ZWRpdG9yLkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3Rvcnk7CisKKy8qKgorICogQGF1dGhvciBqYW1lcworICogCisgKi8KK3B1YmxpYyBjbGFzcyBHbG9iYWxpbmZsdWVuemFtb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkgZXh0ZW5kcworCQlHbG9iYWxpbmZsdWVuemFtb2RlbEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMKKwkJRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgR2xvYmFsaW5mbHVlbnphbW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5KCkgeworCQlzdXBlcigpOworCQlEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJLmFkZEFkYXB0ZXJGYWN0b3J5KHRoaXMpOworCX0KKworCS8qKgorCSAqIAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdsb2JhbEluZmx1ZW56YU1vZGVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBHbG9iYWxpbmZsdWVuemFtb2RlbEFkYXB0ZXIoKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC51dGlsLkZvcmNpbmdBZGFwdGVyRmFjdG9yeSNpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gdHlwZSA9PSBEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuY2xhc3MKKwkJCQl8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOworCX0KK30gLy8gRm9yY2luZ0Rpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3ByZXNlbnRhdGlvbi9HbG9iYWxpbmZsdWVuemFtb2RlbFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvcHJlc2VudGF0aW9uL0dsb2JhbGluZmx1ZW56YW1vZGVsUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkZmJiYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3ByZXNlbnRhdGlvbi9HbG9iYWxpbmZsdWVuemFtb2RlbFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvLyBFeGFtcGxlUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsLnV0aWwuR2xvYmFsaW5mbHVlbnphbW9kZWxBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBHbG9iYWxpbmZsdWVuemFtb2RlbFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJICAgIEdsb2JhbGluZmx1ZW56YW1vZGVsQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cworCQlQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnksIElTdGFydHVwIHsKKworCVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOworCisJLyoqCisJICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBHbG9iYWxpbmZsdWVuemFtb2RlbFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkZEFkYXB0ZXJGYWN0b3J5KHRoaXMpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXAjZWFybHlTdGFydHVwKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBlYXJseVN0YXJ0dXAoKSB7CisJCS8vIE5vdGhpbmcgdG8gZG8gaGVyZS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBoYXMKKwkJLy8gcnVuIHdoaWNoIGlzIHRoZSBlbnRpcmUgcG9pbnQgb2YgZWFybHkgYWN0aXZhdGlvbiB3aGljaCBjYXVzZXMgdGhlCisJCS8vIGZhY3RvcnkgdG8gYmUgYWRkZWQgdG8gdGhlIFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGwjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSkKKwkJCQl8fCB0eXBlID09IFByb3BlcnR5U3RyaW5nUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwudXRpbC5Gb3JjbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVFeGFtcGxlRGlzZWFzZU1vZGVsQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlR2xvYmFsSW5mbHVlbnphTW9kZWxBZGFwdGVyKCkgeworCQkvLyBIYXZlIHdlIGNyZWF0ZWQgb25lIGJlZm9yZT8KKwkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgeworCQkJLy8gTm8KKwkJCWFkYXB0ZXIgPSBuZXcgIFN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LlN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIoKSB7CisKKwkJCQkvKioKKwkJCQkgKiBAcGFyYW0gZGVzY3JpcHRvcgorCQkJCSAqIEByZXR1cm4gdGhlIE5MUydkIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKKwkJCQkgKi8KKwkJCQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZShJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisJCQkJCXRyeSB7CisJCQkJCQlyZXR1cm4gR2xvYmFsaW5mbHVlbnphbW9kZWxXaXphcmRNZXNzYWdlcworCQkJCQkJCQkuZ2V0U3RyaW5nKCgoRVN0cnVjdHVyYWxGZWF0dXJlKSBkZXNjcmlwdG9yCisJCQkJCQkJCQkJLmdldEZlYXR1cmUobnVsbCkpLmdldE5hbWUoKSk7CisJCQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlOYW1lKGRlc2NyaXB0b3IpOworCQkJCQl9CisJCQkJfSAvLyBnZXRQcm9wZXJ0eU5hbWUKKworCQkJCS8qKgorCQkJCSAqIEBwYXJhbSBkZXNjcmlwdG9yCisJCQkJICogQHJldHVybiB0aGUgTkxTJ2QgdG9vbCB0aXAgdGV4dCB0aGF0IGRlc2NyaWJlcyB0aGUgcHJvcGVydHkKKwkJCQkgKi8KKwkJCQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VG9vbFRpcCgKKwkJCQkJCUlJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZGVzY3JpcHRvcgorCQkJCQkJCQkuZ2V0RmVhdHVyZShudWxsKTsKKwkJCQkJCXJldHVybiBHbG9iYWxpbmZsdWVuemFtb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZyhmZWF0dXJlCisJCQkJCQkJCS5nZXROYW1lKCkKKwkJCQkJCQkJKyBUVF9TVUZGSVgpOworCQkJCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCQkJCQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5VG9vbFRpcChkZXNjcmlwdG9yKTsKKwkJCQkJfQorCQkJCX0gLy8gZ2V0UHJvcGVydHlUb29sVGlwCisKKwkJCQkvKioKKwkJCQkgKiBAcGFyYW0gZGVzY3JpcHRvcgorCQkJCSAqIEByZXR1cm4gdGhlIE5MUydkIHRleHQgdGhhdCByZXByZXNlbnRzIHRoZSB1bml0cyBvZiB0aGUKKwkJCQkgKiAgICAgICAgIHByb3BlcnR5CisJCQkJICovCisJCQkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVVuaXRzKAorCQkJCQkJSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQkJCQl0cnkgeworCQkJCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBkZXNjcmlwdG9yCisJCQkJCQkJCS5nZXRGZWF0dXJlKG51bGwpOworCQkJCQkJcmV0dXJuIEdsb2JhbGluZmx1ZW56YW1vZGVsV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKGZlYXR1cmUKKwkJCQkJCQkJLmdldE5hbWUoKQorCQkJCQkJCQkrIFVOSVRfU1VGRklYKTsKKwkJCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eVVuaXRzKGRlc2NyaXB0b3IpOworCQkJCQl9CisJCQkJfSAvLyBnZXRQcm9wZXJ0eVVuaXRzCisJCQl9OworCQl9IC8vIGlmIHdlIGRpZG4ndCBjcmVhdGUgb25lIGJlZm9yZQorCQlyZXR1cm4gYWRhcHRlcjsKKwl9Ly8gY3JlYXRlRm9yY2luZ0Rpc2Vhc2VNb2RlbEFkYXB0ZXIoKQorCit9IC8vIEZvcmNpbmdQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3ByZXNlbnRhdGlvbi9HbG9iYWxpbmZsdWVuemFtb2RlbFdpemFyZE1lc3NhZ2VzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9wcmVzZW50YXRpb24vR2xvYmFsaW5mbHVlbnphbW9kZWxXaXphcmRNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZmEzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9nbG9iYWxpbmZsdWVuemFtb2RlbC9wcmVzZW50YXRpb24vR2xvYmFsaW5mbHVlbnphbW9kZWxXaXphcmRNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8vIEV4YW1wbGVEaXNlYXNlV2l6YXJkTWVzc2FnZXMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZ2xvYmFsaW5mbHVlbnphbW9kZWwucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50czsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRoZSBSZXNvdXJjZSBCdW5kbGUgZm9yIHRoaXMgcGFja2FnZS4KKyAqLworcHVibGljIGNsYXNzIEdsb2JhbGluZmx1ZW56YW1vZGVsV2l6YXJkTWVzc2FnZXMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IENvbnN0YW50cy5JRF9ST09UCisJCQkrICIudWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC5wcmVzZW50YXRpb24uZ2xvYmFsaW5mbHVlbnphbW9kZWxtZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCisJCQkuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBHbG9iYWxpbmZsdWVuemFtb2RlbFdpemFyZE1lc3NhZ2VzKCkgeworCQkvLyBlbXB0eQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBrZXkKKwkgKiAgICAgICAgICAgIHRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlCisJICogQHJldHVybiB0aGUgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUga2V5CisJICogQHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gaWYgdGhlIGtleSBjYW5ub3QgYmUgZm91bmQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoZmluYWwgU3RyaW5nIGtleSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbnsKKwkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7CisJfSAvLyBnZXRTdHJpbmcKK30gLy8gR2xvYmFsaW5mbHVlbnphbW9kZWxXaXphcmRNZXNzYWdlcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmdsb2JhbGluZmx1ZW56YW1vZGVsL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvZ2xvYmFsaW5mbHVlbnphbW9kZWwvcHJlc2VudGF0aW9uL2dsb2JhbGluZmx1ZW56YW1vZGVsbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3ByZXNlbnRhdGlvbi9nbG9iYWxpbmZsdWVuemFtb2RlbG1lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5ODRjMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5nbG9iYWxpbmZsdWVuemFtb2RlbC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL2dsb2JhbGluZmx1ZW56YW1vZGVsL3ByZXNlbnRhdGlvbi9nbG9iYWxpbmZsdWVuemFtb2RlbG1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzNyBAQAorIyBkaXNlYXNld2l6YXJkbWVzc2FnZXMucHJvcGVydGllcworIworIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3NlYXNvbmFsTW9kdWxhdGlvbiA9IFNlYXNvbmFsIE1vZHVsYXRpb24KK3NlYXNvbmFsTW9kdWxhdGlvblRUID0gU2Vhc29uYWwgTW9kdWxhdGlvbgorc2Vhc29uYWxNb2R1bGF0aW9uVU5JVCA9IERheXMKKworbW9kdWxhdGlvblBlcmlvZCA9IE1vZHVsYXRpb24gUGVyaW9kCittb2R1bGF0aW9uUGVyaW9kVFQgPSBNb2R1bGF0aW9uIFBlcmlvZAorbW9kdWxhdGlvblBlcmlvZFVOSVQgPSBEYXlzCisKK21vZHVsYXRpb25QaGFzZVNoaWZ0ID0gTW9kdWxhdGlvbiBQaGFzZSBTaGlmdAorbW9kdWxhdGlvblBoYXNlU2hpZnRUVCA9IE1vZHVsYXRpb24gUGhhc2UgU2hpZnQKK21vZHVsYXRpb25QaGFzZVNoaWZ0VU5JVCA9IERheXMKKworc2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnQgPSBTZWFzb25hbE1vZHVsYXRpb25FeHBvbmVudAorc2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnRUVCA9IEV4cG9uZW50IHVzZWQgZm9yIHNlYXNvbmFsIG1vZHVsYXRpb24gZm9yY2luZworc2Vhc29uYWxNb2R1bGF0aW9uRXhwb25lbnRVTklUID0gCisKK3NlYXNvbmFsTW9kdWxhdGlvbkZsb29yID0gU2Vhc29uYWxNb2R1bGF0aW9uRmxvb3IKK3NlYXNvbmFsTW9kdWxhdGlvbkZsb29yVFQgPSBGbG9vciBvciBtaW5pbXVtIHRyYW5zbWlzc2lvbiBsZXZlbCB3aXRob3V0IHNlYXNvbmFsIG1vZHVsYXRpb24KK3NlYXNvbmFsTW9kdWxhdGlvbkZsb29yVU5JVCA9IAorCitsYXRpdHVkZVNpZ21vaWRXaWR0aCA9IExhdC4gV2lkdGgKK2xhdGl0dWRlU2lnbW9pZFdpZHRoVFQgPSBMYXRpdHVkZSBTaWdtb2lkIEZ1bmN0aW9uIFdpZHRoCitsYXRpdHVkZVNpZ21vaWRXaWR0aFVOSVQgPSBEZWdyZWVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZjAyNGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxjbGFzc3BhdGg+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCis8L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjE4ZjYzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIyMWY3MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsOCBAQAorI1R1ZSBNYXIgMzAgMTE6NDk6MTkgUERUIDIwMTANCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNDYzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMjUgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcgorQnVuZGxlLUNsYXNzUGF0aDogLgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5wcmVzZW50YXRpb24uTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luJEltcGxlbWVudGF0aW9uCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24ucHJlc2VudGF0aW9uCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb247dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS51aS5pZGU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVsczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5zdGVtLnVpO2J1bmRsZS12ZXJzaW9uPSIxLjAuMSIsCisgb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzO2J1bmRsZS12ZXJzaW9uPSIxLjAuMSIKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhM2IyYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE0IEBACisKKyMgPGNvcHlyaWdodD4KKyMgPC9jb3B5cmlnaHQ+CisjCisjICRJZCQKKworYmluLmluY2x1ZGVzID0gLixcCisgICAgICAgICAgICAgICBpY29ucy8sXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKK2phcnMuY29tcGlsZS5vcmRlciA9IC4KK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL2ljb25zL2Z1bGwvb2JqMTYvTXVsdGlwb3B1bGF0aW9uTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vaWNvbnMvZnVsbC9vYmoxNi9NdWx0aXBvcHVsYXRpb25Nb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZTUyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL2ljb25zL2Z1bGwvb2JqMTYvTXVsdGlwb3B1bGF0aW9uTW9kZWxGaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL2ljb25zL2Z1bGwvd2l6YmFuL05ld011bHRpcG9wdWxhdGlvbi5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL2ljb25zL2Z1bGwvd2l6YmFuL05ld011bHRpcG9wdWxhdGlvbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQzMjQ5NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vaWNvbnMvZnVsbC93aXpiYW4vTmV3TXVsdGlwb3B1bGF0aW9uLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWUwN2IwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDU3IEBACisKKyMgPGNvcHlyaWdodD4KKyMgPC9jb3B5cmlnaHQ+CisjCisjICRJZCQKKworcGx1Z2luTmFtZSA9IE11bHRpcG9wdWxhdGlvbiBFZGl0b3IKK3Byb3ZpZGVyTmFtZSA9IHd3dy5leGFtcGxlLm9yZworCitfVUlfTXVsdGlwb3B1bGF0aW9uRWRpdG9yX21lbnUgPSAmTXVsdGlwb3B1bGF0aW9uIEVkaXRvcgorCitfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtID0gJk5ldyBDaGlsZAorX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtID0gTiZldyBTaWJsaW5nCisKK19VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtID0gU2hvdyAmUHJvcGVydGllcyBWaWV3CitfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0gPSAmUmVmcmVzaAorCitfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCA9IFNlbGVjdGlvbgorX1VJX1BhcmVudFBhZ2VfbGFiZWwgPSBQYXJlbnQKK19VSV9MaXN0UGFnZV9sYWJlbCA9IExpc3QKK19VSV9UcmVlUGFnZV9sYWJlbCA9IFRyZWUKK19VSV9UYWJsZVBhZ2VfbGFiZWwgPSBUYWJsZQorX1VJX1RyZWVXaXRoQ29sdW1uc1BhZ2VfbGFiZWwgPSBUcmVlIHdpdGggQ29sdW1ucworX1VJX09iamVjdENvbHVtbl9sYWJlbCA9IE9iamVjdAorX1VJX1NlbGZDb2x1bW5fbGFiZWwgPSBTZWxmCisKK19VSV9Ob09iamVjdFNlbGVjdGVkID0gU2VsZWN0ZWQgTm90aGluZworX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkID0gU2VsZWN0ZWQgT2JqZWN0OiB7MH0KK19VSV9NdWx0aU9iamVjdFNlbGVjdGVkID0gU2VsZWN0ZWQgezB9IE9iamVjdHMKKworX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbCA9IE9wZW4gRWRpdG9yCisKK19VSV9XaXphcmRfY2F0ZWdvcnkgPSBFeGFtcGxlIEVNRiBNb2RlbCBDcmVhdGlvbiBXaXphcmRzCisKK19VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UgPSBQcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiBmaWxlICJ7MH0iCisKK19VSV9NdWx0aXBvcHVsYXRpb25Nb2RlbFdpemFyZF9sYWJlbCA9IE11bHRpcG9wdWxhdGlvbiBNb2RlbAorX1VJX011bHRpcG9wdWxhdGlvbk1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IE11bHRpcG9wdWxhdGlvbiBtb2RlbAorCitfVUlfTXVsdGlwb3B1bGF0aW9uRWRpdG9yX2xhYmVsID0gTXVsdGlwb3B1bGF0aW9uIE1vZGVsIEVkaXRvcgorCitfVUlfTXVsdGlwb3B1bGF0aW9uRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZSA9IE15CitfVUlfTXVsdGlwb3B1bGF0aW9uRWRpdG9yRmlsZW5hbWVFeHRlbnNpb25zID0gbXVsdGlwb3B1bGF0aW9uCisKK19VSV9XaXphcmRfbGFiZWwgPSBOZXcKKworX1dBUk5fRmlsZW5hbWVFeHRlbnNpb24gPSBUaGUgZmlsZSBuYW1lIG11c3QgZW5kIGluICcnLnswfScnCitfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbnMgPSBUaGUgZmlsZSBuYW1lIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zOiB7MH0KKworX1VJX01vZGVsT2JqZWN0ID0gJk1vZGVsIE9iamVjdAorX1VJX1hNTEVuY29kaW5nID0gJlhNTCBFbmNvZGluZworX1VJX1hNTEVuY29kaW5nQ2hvaWNlcyA9IFVURi04IEFTQ0lJIFVURi0xNiBVVEYtMTZCRSBVVEYtMTZMRSBJU08tODg1OS0xCitfVUlfV2l6YXJkX2luaXRpYWxfb2JqZWN0X2Rlc2NyaXB0aW9uID0gU2VsZWN0IGEgbW9kZWwgb2JqZWN0IHRvIGNyZWF0ZQorCitfVUlfRmlsZUNvbmZsaWN0X2xhYmVsID0gRmlsZSBDb25mbGljdAorX1dBUk5fRmlsZUNvbmZsaWN0ID0gVGhlcmUgYXJlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IGNvbmZsaWN0IHdpdGggY2hhbmdlcyBtYWRlIG91dHNpZGUgdGhlIGVkaXRvci4gIERvIHlvdSB3aXNoIHRvIGRpc2NhcmQgdGhpcyBlZGl0b3IncyBjaGFuZ2VzPworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiOGI4NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vcGx1Z2luLnhtbApAQCAtMCwwICsxLDUxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgorCis8IS0tCisgPGNvcHlyaWdodD4KKyA8L2NvcHlyaWdodD4KKworICRJZCQKKy0tPgorCis8cGx1Z2luPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KKyAgICAgIDxjYXRlZ29yeQorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5XaXphcmQuY2F0ZWdvcnkuSUQiCisgICAgICAgICAgICBuYW1lPSIlX1VJX1dpemFyZF9jYXRlZ29yeSIvPgorICAgICAgPHdpemFyZAorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24ucHJlc2VudGF0aW9uLk11bHRpcG9wdWxhdGlvbk1vZGVsV2l6YXJkSUQiCisgICAgICAgICAgICBuYW1lPSIlX1VJX011bHRpcG9wdWxhdGlvbk1vZGVsV2l6YXJkX2xhYmVsIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24ucHJlc2VudGF0aW9uLk11bHRpcG9wdWxhdGlvbk1vZGVsV2l6YXJkIgorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5XaXphcmQuY2F0ZWdvcnkuSUQiCisgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L011bHRpcG9wdWxhdGlvbk1vZGVsRmlsZS5naWYiPgorICAgICAgICAgPGRlc2NyaXB0aW9uPiVfVUlfTXVsdGlwb3B1bGF0aW9uTW9kZWxXaXphcmRfZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgorICAgICAgICAgPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIi8+CisgICAgICA8L3dpemFyZD4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KKyAgICAgIDxlZGl0b3IKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLnByZXNlbnRhdGlvbi5NdWx0aXBvcHVsYXRpb25FZGl0b3JJRCIKKyAgICAgICAgICAgIG5hbWU9IiVfVUlfTXVsdGlwb3B1bGF0aW9uRWRpdG9yX2xhYmVsIgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9NdWx0aXBvcHVsYXRpb25Nb2RlbEZpbGUuZ2lmIgorICAgICAgICAgICAgZXh0ZW5zaW9ucz0ibXVsdGlwb3B1bGF0aW9uIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24ucHJlc2VudGF0aW9uLk11bHRpcG9wdWxhdGlvbkVkaXRvciIKKyAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24ucHJlc2VudGF0aW9uLk11bHRpcG9wdWxhdGlvbkFjdGlvbkJhckNvbnRyaWJ1dG9yIj4KKyAgICAgIDwvZWRpdG9yPgorICAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3RhcnR1cCI+CisgICAgICAgICA8c3RhcnR1cAorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5wcmVzZW50YXRpb24uTXVsdGlQb3B1bGF0aW9uUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij4KKyAgICAgPC9zdGFydHVwPgorICAgPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnN0YXJ0dXAiPgorICAgICA8c3RhcnR1cAorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5hZGFwdGVycy5NdWx0aURpc2Vhc2VOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeSI+PC9zdGFydHVwPgorICA8L2V4dGVuc2lvbj4KKyAgCis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJlc2VudGF0aW9uL011bHRpUG9wdWxhdGlvbkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3ByZXNlbnRhdGlvbi9NdWx0aVBvcHVsYXRpb25EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNmY3NTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3ByZXNlbnRhdGlvbi9NdWx0aVBvcHVsYXRpb25EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvci5qYXZhCkBAIC0wLDAgKzEsMzc0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24ucHJlc2VudGF0aW9uOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uQ29tbW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkRvdWJsZVZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRG91YmxlVmFsdWVNYXRyaXg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5TdHJpbmdWYWx1ZUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5NdWx0aXBvcHVsYXRpb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmRpc2Vhc2Vtb2RlbHByb3BlcnR5ZWRpdG9yLkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3MuUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3MuUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2lkZ2V0cy5NYXRyaXhFZGl0b3JXaWRnZXQuTWF0cml4RWRpdG9yVmFsaWRhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5EaXNlYXNlV2l6YXJkTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLlN0YW5kYXJkRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIE11bHRpUG9wdWxhdGlvbkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yIGV4dGVuZHMKKwkJU3RhbmRhcmREaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvciB7CisJCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqIEBwYXJhbSBkaXNlYXNlTW9kZWwKKwkgKiBAcGFyYW0gcHJvamVjdFZhbGlkYXRvcgorCSAqLworCXB1YmxpYyBNdWx0aVBvcHVsYXRpb25EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50LAorCQkJaW50IHN0eWxlLCBEaXNlYXNlTW9kZWwgZGlzZWFzZU1vZGVsLAorCQkJTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcihwYXJlbnQsIHN0eWxlLCBkaXNlYXNlTW9kZWwsIHByb2plY3RWYWxpZGF0b3IsIHByb2plY3QpOworCX0gLy8gTXVsdGlEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuU3RhbmRhcmREaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvciNwb3B1bGF0ZShvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHBvcHVsYXRlKERpc2Vhc2VNb2RlbCBkaXNlYXNlTW9kZWwpIHsKKwkJc3VwZXIucG9wdWxhdGUoZGlzZWFzZU1vZGVsKTsKKwkJCisJCWZvciAoZmluYWwgTWFwLkVudHJ5PEVTdHJ1Y3R1cmFsRmVhdHVyZSwgVGV4dD4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgeworCQkJZG91YmxlIGRWYWwgPSAwLjA7CisJCQorCQkJc3dpdGNoIChlbnRyeS5nZXRLZXkoKS5nZXRGZWF0dXJlSUQoKSkgeworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT046CisJCQkJZFZhbCA9IChuZXcgRG91YmxlKGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpKSkuZG91YmxlVmFsdWUoKTsKKwkJCQkoKE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKSBkaXNlYXNlTW9kZWwpLnNldFBoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uKGRWYWwpOworCQkJCWJyZWFrOworCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTjoKKwkJCQlkVmFsID0gKG5ldyBEb3VibGUoZW50cnkuZ2V0VmFsdWUoKS5nZXRUZXh0KCkpKS5kb3VibGVWYWx1ZSgpOworCQkJCSgoTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwpIGRpc2Vhc2VNb2RlbCkuc2V0Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbihkVmFsKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0gLy8gc3dpdGNoCisJCX0gLy8gZm9yIGVhY2ggTWFwLmVudHJ5CisJCQorCQlmb3IoZmluYWwgTWFwLkVudHJ5PEVTdHJ1Y3R1cmFsRmVhdHVyZSwgU3RyaW5nW10+ZW50cnk6bWF0cml4TWFwLmVudHJ5U2V0KCkpIHsKKwkJCXN3aXRjaChlbnRyeS5nZXRLZXkoKS5nZXRGZWF0dXJlSUQoKSkgeworCQkJCWNhc2UgTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEU6CisJCQkJCWRvdWJsZSBbXSBkdmFscyA9IGdldERvdWJsZUFycmF5KGVudHJ5LmdldFZhbHVlKCkpOworCQkJCQlEb3VibGVWYWx1ZUxpc3QgbmV3TGlzdCA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKS5jcmVhdGVEb3VibGVWYWx1ZUxpc3QoKTsKKwkJCQkJKChNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCkgZGlzZWFzZU1vZGVsKS5zZXRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZShuZXdMaXN0KTsKKwkJCQkJZm9yKGRvdWJsZSBkOmR2YWxzKSB7CisJCQkJCQlEb3VibGVWYWx1ZSBkdmFsID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZURvdWJsZVZhbHVlKCk7CisJCQkJCQlkdmFsLnNldFZhbHVlKGQpOworCQkJCQkJKChNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCkgZGlzZWFzZU1vZGVsKS5nZXRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSgpLmdldFZhbHVlcygpLmFkZChkdmFsKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFOgorCQkJCQlkdmFscyA9IGdldERvdWJsZUFycmF5KGVudHJ5LmdldFZhbHVlKCkpOworCQkJCQluZXdMaXN0ID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZURvdWJsZVZhbHVlTGlzdCgpOworCQkJCQkoKE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKSBkaXNlYXNlTW9kZWwpLnNldFJlY292ZXJ5UmF0ZShuZXdMaXN0KTsKKwkJCQkJZm9yKGRvdWJsZSBkOmR2YWxzKSB7CisJCQkJCQlEb3VibGVWYWx1ZSBkdmFsID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZURvdWJsZVZhbHVlKCk7CisJCQkJCQlkdmFsLnNldFZhbHVlKGQpOworCQkJCQkJKChNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCkgZGlzZWFzZU1vZGVsKS5nZXRSZWNvdmVyeVJhdGUoKS5nZXRWYWx1ZXMoKS5hZGQoZHZhbCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0lNTVVOSVRZX0xPU1NfUkFURToKKwkJCQkJZHZhbHMgPSBnZXREb3VibGVBcnJheShlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJCQkJbmV3TGlzdCA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKS5jcmVhdGVEb3VibGVWYWx1ZUxpc3QoKTsKKwkJCQkJKChNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwpIGRpc2Vhc2VNb2RlbCkuc2V0SW1tdW5pdHlMb3NzUmF0ZShuZXdMaXN0KTsKKwkJCQkJZm9yKGRvdWJsZSBkOmR2YWxzKSB7CisJCQkJCQlEb3VibGVWYWx1ZSBkdmFsID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZURvdWJsZVZhbHVlKCk7CisJCQkJCQlkdmFsLnNldFZhbHVlKGQpOworCQkJCQkJKChNdWx0aVBvcHVsYXRpb25TSVJEaXNlYXNlTW9kZWwpIGRpc2Vhc2VNb2RlbCkuZ2V0SW1tdW5pdHlMb3NzUmF0ZSgpLmdldFZhbHVlcygpLmFkZChkdmFsKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0lOQ1VCQVRJT05fUkFURToKKwkJCQkJZHZhbHMgPSBnZXREb3VibGVBcnJheShlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJCQkJbmV3TGlzdCA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKS5jcmVhdGVEb3VibGVWYWx1ZUxpc3QoKTsKKwkJCQkJKChNdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsKSBkaXNlYXNlTW9kZWwpLnNldEluY3ViYXRpb25SYXRlKG5ld0xpc3QpOworCQkJCQlmb3IoZG91YmxlIGQ6ZHZhbHMpIHsKKwkJCQkJCURvdWJsZVZhbHVlIGR2YWwgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlRG91YmxlVmFsdWUoKTsKKwkJCQkJCWR2YWwuc2V0VmFsdWUoZCk7CisJCQkJCQkoKE11bHRpUG9wdWxhdGlvblNFSVJEaXNlYXNlTW9kZWwpIGRpc2Vhc2VNb2RlbCkuZ2V0SW5jdWJhdGlvblJhdGUoKS5nZXRWYWx1ZXMoKS5hZGQoZHZhbCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEU6CisJCQkJICAgIGR2YWxzID0gZ2V0RG91YmxlQXJyYXkoZW50cnkuZ2V0VmFsdWUoKSk7CisJCQkJCURvdWJsZVZhbHVlTWF0cml4IG5ld01hdHJpeCA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKS5jcmVhdGVEb3VibGVWYWx1ZU1hdHJpeCgpOworCQkJCQkoKE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKSBkaXNlYXNlTW9kZWwpLnNldFRyYW5zbWlzc2lvblJhdGUobmV3TWF0cml4KTsKKwkJCQkJLy8gdWdoCisJCQkJCWludCBncm91cHMgPSAoaW50KU1hdGguc3FydCgoZG91YmxlKWR2YWxzLmxlbmd0aCk7CisJCQkJICAgIGZvcihpbnQgcj0wO3I8Z3JvdXBzOysrcikgewkgICAgCQorCQkJCSAgICAJRG91YmxlVmFsdWVMaXN0IG5sID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZURvdWJsZVZhbHVlTGlzdCgpOworCQkJCSAgICAJKChNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCkgZGlzZWFzZU1vZGVsKS5nZXRUcmFuc21pc3Npb25SYXRlKCkuZ2V0VmFsdWVMaXN0cygpLmFkZChubCk7CQorCQkJCSAgICAJZm9yKGludCBjPTA7Yzxncm91cHM7KytjKSB7CisJCQkJICAgIAkJRG91YmxlVmFsdWUgZHZhbCA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKS5jcmVhdGVEb3VibGVWYWx1ZSgpOworCQkJCSAgICAJCWR2YWwuc2V0VmFsdWUoZHZhbHNbcipncm91cHMrY10pOworCQkJCSAgICAJCW5sLmdldFZhbHVlcygpLmFkZChkdmFsKTsKKwkJCQkgICAgCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0dST1VQUzoKKwkJCQkJU3RyaW5nIFtdIHN2YWxzID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQkJU3RyaW5nVmFsdWVMaXN0IG5ld1NMaXN0ID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZVN0cmluZ1ZhbHVlTGlzdCgpOworCQkJCQkoKE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKSBkaXNlYXNlTW9kZWwpLnNldFBvcHVsYXRpb25Hcm91cHMobmV3U0xpc3QpOworCQkJCQlmb3IoU3RyaW5nIHM6c3ZhbHMpIHsKKwkJCQkJCW9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU3RyaW5nVmFsdWUgc3ZhbCA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKS5jcmVhdGVTdHJpbmdWYWx1ZSgpOworCQkJCQkJc3ZhbC5zZXRWYWx1ZShzKTsKKwkJCQkJCSgoTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwpIGRpc2Vhc2VNb2RlbCkuZ2V0UG9wdWxhdGlvbkdyb3VwcygpLmdldFZhbHVlcygpLmFkZChzdmFsKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkKKwkJLy8gTGV0J3MgZmlsbCBpbiB0aGUgaWRlbnRpZmllcnMgZm9yIHRoZSB2YXJpb3VzIHJhdGVzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGVkaXQgbGF0ZXIgaW4gdGhlIHByb3BlcnR5IGVkaXRvcgorCQlpZigoKE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKSBkaXNlYXNlTW9kZWwpLmdldFBvcHVsYXRpb25Hcm91cHMoKSAhPSBudWxsKSB7CisJCQlTdHJpbmcgW11ncm91cHMgPSBuZXcgU3RyaW5nWygoTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwpIGRpc2Vhc2VNb2RlbCkuZ2V0UG9wdWxhdGlvbkdyb3VwcygpLmdldFZhbHVlcygpLnNpemUoKV07CisJCQlpbnQgaT0wOworCQkJZm9yKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU3RyaW5nVmFsdWUgc3Y6KChNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCkgZGlzZWFzZU1vZGVsKS5nZXRQb3B1bGF0aW9uR3JvdXBzKCkuZ2V0VmFsdWVzKCkpCisJCQkJZ3JvdXBzW2krK10gPSBzdi5nZXRWYWx1ZSgpOworCQkJCisJCQlpPTA7CisJCQlEb3VibGVWYWx1ZUxpc3QgZHZsID0gKChNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCkgZGlzZWFzZU1vZGVsKS5nZXRJbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZSgpOworCQkJaWYoZHZsICE9IG51bGwpIAorCQkJCWZvcihEb3VibGVWYWx1ZSBkdjpkdmwuZ2V0VmFsdWVzKCkpCisJCQkJCWR2LnNldElkZW50aWZpZXIoZ3JvdXBzW2krK10pOworCQkKKwkJCWk9MDsKKwkJCWR2bCA9ICgoTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwpIGRpc2Vhc2VNb2RlbCkuZ2V0UmVjb3ZlcnlSYXRlKCk7CisJCQlpZihkdmwgIT0gbnVsbCkKKwkJCQlmb3IoRG91YmxlVmFsdWUgZHY6ZHZsLmdldFZhbHVlcygpKQorCQkJCQlkdi5zZXRJZGVudGlmaWVyKGdyb3Vwc1tpKytdKTsKKwkJCQorCQkJaT0wOworCQkJRG91YmxlVmFsdWVNYXRyaXggZHZtID0gKChNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCkgZGlzZWFzZU1vZGVsKS5nZXRUcmFuc21pc3Npb25SYXRlKCk7CisJCQlpZihkdm0gIT0gbnVsbCkgCisJCQkJZm9yKERvdWJsZVZhbHVlTGlzdCBkdmwyOmR2bS5nZXRWYWx1ZUxpc3RzKCkpIHsKKwkJCQlkdmwyLnNldElkZW50aWZpZXIoZ3JvdXBzW2krK10pOworCQkJCWludCBqPTA7CisJCQkJZm9yKERvdWJsZVZhbHVlIGR2OmR2bDIuZ2V0VmFsdWVzKCkpIAorCQkJCQlkdi5zZXRJZGVudGlmaWVyKGdyb3Vwc1tqKytdKTsKKwkJCX0KKwkJCQkKKwkJCWlmKGRpc2Vhc2VNb2RlbCBpbnN0YW5jZW9mIE11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbCkgeworCQkJCWk9MDsKKwkJCQlkdmwgPSAoKE11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbCkgZGlzZWFzZU1vZGVsKS5nZXRJbW11bml0eUxvc3NSYXRlKCk7CisJCQkJaWYoZHZsICE9IG51bGwpIAorCQkJCQlmb3IoRG91YmxlVmFsdWUgZHY6ZHZsLmdldFZhbHVlcygpKQorCQkJCQkJZHYuc2V0SWRlbnRpZmllcihncm91cHNbaSsrXSk7CisJCQl9CisJCQkJCisJCQlpZihkaXNlYXNlTW9kZWwgaW5zdGFuY2VvZiBNdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsKSB7CisJCQkJaT0wOworCQkJCWR2bCA9ICgoTXVsdGlQb3B1bGF0aW9uU0VJUkRpc2Vhc2VNb2RlbCkgZGlzZWFzZU1vZGVsKS5nZXRJbmN1YmF0aW9uUmF0ZSgpOworCQkJCWlmKGR2bCAhPSBudWxsKQorCQkJCQlmb3IoRG91YmxlVmFsdWUgZHY6ZHZsLmdldFZhbHVlcygpKQorCQkJCQkJZHYuc2V0SWRlbnRpZmllcihncm91cHNbaSsrXSk7CisJCQl9CisJCX0gLy8gaGFzIGdyb3VwcworCX0KKworCXByaXZhdGUgZG91YmxlIFtdIGdldERvdWJsZUFycmF5KFN0cmluZyBbXXN2YWxzKSB7CisJCWRvdWJsZSBbXSByZXMgPSBuZXcgZG91YmxlW3N2YWxzLmxlbmd0aF07CisJCWZvcihpbnQgaT0wO2k8cmVzLmxlbmd0aDsrK2kpIHJlc1tpXSA9IERvdWJsZS5wYXJzZURvdWJsZShzdmFsc1tpXSk7CisJCXJldHVybiByZXM7CisJfQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLlN0YW5kYXJkRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IjdmFsaWRhdGUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgeworCQlib29sZWFuIHJldFZhbHVlID0gc3VwZXIudmFsaWRhdGUoKTsKKwkJLy8gSW5mZWN0aW91cyBNb3J0YWxpdHkgUmF0ZQorCQlpZiAocmV0VmFsdWUpIHsKKwkJCS8vIFllcworCQkJZmluYWwgVGV4dCB0ZXh0ID0gbWFwCisJCQkJCS5nZXQoTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5MaXRlcmFscy5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEUpOworCQkJaWYgKHRleHQgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCXJldFZhbHVlID0gIXRleHQuZ2V0VGV4dCgpLmVxdWFscygiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkvLyBub3RoaW5nPworCQkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWVycm9yTWVzc2FnZSA9IERpc2Vhc2VXaXphcmRNZXNzYWdlcworCQkJCQkJCS5nZXRTdHJpbmcoIlJFQ09WRVJZX1JBVEVfSU5WQUxJRCIpOyAvLyROT04tTkxTLTEkCisJCQkJfSAvLyBpZgorCQkJCWVsc2UgeworCQkJCQkvLyBObworCQkJCQkvLyBJcyBpdCBhIHZhbGlkIHZhbHVlPworCQkJCQlyZXRWYWx1ZSA9IGlzVmFsaWRWYWx1ZSh0ZXh0LmdldFRleHQoKSwgMC4wKTsKKwkJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQkJLy8gTm8KKwkJCQkJCWVycm9yTWVzc2FnZSA9IE11bHRpcG9wdWxhdGlvbkRpc2Vhc2VXaXphcmRNZXNzYWdlcworCQkJCQkJCQkuZ2V0U3RyaW5nKCJSRUNPVkVSWV9SQVRFX0lOVkFMSUQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9IC8vIGlmCisJCQkJfQorCQkJfSAvLyBpZgorCQl9CisJCWlmIChyZXRWYWx1ZSkgeworCQkJCS8vIFllcworCQkJCVRleHQgdGV4dCA9IG1hcAorCQkJCQkJLmdldChNdWx0aXBvcHVsYXRpb25QYWNrYWdlLkxpdGVyYWxzLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT04pOworCQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKKwkJCQkJLy8gWWVzCisJCQkJCXJldFZhbHVlID0gIXRleHQuZ2V0VGV4dCgpLmVxdWFscygiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJLy8gbm90aGluZz8KKwkJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQllcnJvck1lc3NhZ2UgPSBEaXNlYXNlV2l6YXJkTWVzc2FnZXMKKwkJCQkJCQkJLmdldFN0cmluZygiUEhZU19BREpfSU5WQUxJRCIpOyAvLyROT04tTkxTLTEkCisJCQkJCX0gLy8gaWYKKwkJCQkJZWxzZSB7CisJCQkJCQkvLyBObworCQkJCQkJLy8gSXMgaXQgYSB2YWxpZCB2YWx1ZT8KKwkJCQkJCXJldFZhbHVlID0gaXNWYWxpZFZhbHVlKHRleHQuZ2V0VGV4dCgpLCAwLjApOworCQkJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQkJCS8vIE5vCisJCQkJCQkJZXJyb3JNZXNzYWdlID0gTXVsdGlwb3B1bGF0aW9uRGlzZWFzZVdpemFyZE1lc3NhZ2VzCisJCQkJCQkJCQkuZ2V0U3RyaW5nKCJQSFlTX0FESl9JTlZBTElEIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCX0gLy8gaWYKKwkJCQkJfQorCQkJCX0gLy8gaWYKKwkJfQkJCisJCWlmIChyZXRWYWx1ZSkgeworCQkJCQkvLyBZZXMKKwkJCQkJVGV4dCB0ZXh0ID0gbWFwCisJCQkJCQkJLmdldChNdWx0aXBvcHVsYXRpb25QYWNrYWdlLkxpdGVyYWxzLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTik7CisJCQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJcmV0VmFsdWUgPSAhdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJLy8gbm90aGluZz8KKwkJCQkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkJCQkvLyBZZXMKKwkJCQkJCQllcnJvck1lc3NhZ2UgPSBEaXNlYXNlV2l6YXJkTWVzc2FnZXMKKwkJCQkJCQkJCS5nZXRTdHJpbmcoIlJPQURfTkVUX0lOVkFMSUQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfSAvLyBpZgorCQkJCQkJZWxzZSB7CisJCQkJCQkJLy8gTm8KKwkJCQkJCQkvLyBJcyBpdCBhIHZhbGlkIHZhbHVlPworCQkJCQkJCXJldFZhbHVlID0gaXNWYWxpZFZhbHVlKHRleHQuZ2V0VGV4dCgpLCAwLjApOworCQkJCQkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkJCQkJLy8gTm8KKwkJCQkJCQkJZXJyb3JNZXNzYWdlID0gTXVsdGlwb3B1bGF0aW9uRGlzZWFzZVdpemFyZE1lc3NhZ2VzCisJCQkJCQkJCQkJLmdldFN0cmluZygiUk9BRF9ORVRfSU5WQUxJRCIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJfSAvLyBpZgorCQkJCQkJfQorCQkJCQl9IC8vIGlmCisJCX0KKwkJCisJCXJldHVybiByZXRWYWx1ZTsKKwl9CisJCisJLyoqCisJICogVGhlc2UgYXJlIG92ZXJyaWRlbiBieSBzdWJjbGFzcworCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBzaG9ydCBnZXRDb2xDb3VudChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQlTdHJpbmcgW10gZ3JvdXBzID0gbWF0cml4TWFwLmdldChNdWx0aXBvcHVsYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbF9Qb3B1bGF0aW9uR3JvdXBzKCkpOworCQlpZihncm91cHMgPT0gbnVsbClyZXR1cm4gMDsKKwkJZWxzZSByZXR1cm4gKHNob3J0KWdyb3Vwcy5sZW5ndGg7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZ2V0Rml4ZWRTaXplKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCWlmKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgPT0gTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTKQorCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nW10gZ2V0Um93TmFtZXMoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJU3RyaW5nIFtdIGdyb3VwcyA9IG1hdHJpeE1hcC5nZXQoTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfUG9wdWxhdGlvbkdyb3VwcygpKTsKKwkJcmV0dXJuIGdyb3VwczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nW10gZ2V0Q29sTmFtZXMoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJU3RyaW5nIFtdIGdyb3VwcyA9IG1hdHJpeE1hcC5nZXQoTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxfUG9wdWxhdGlvbkdyb3VwcygpKTsKKwkJcmV0dXJuIGdyb3VwczsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHNob3J0IGdldFJvd0NvdW50KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCVN0cmluZyBbXSBncm91cHMgPSBtYXRyaXhNYXAuZ2V0KE11bHRpcG9wdWxhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsX1BvcHVsYXRpb25Hcm91cHMoKSk7CisJCWlmKGdyb3VwcyA9PSBudWxsKXJldHVybiAwOworCQllbHNlIHJldHVybiAoc2hvcnQpZ3JvdXBzLmxlbmd0aDsKKwl9CisJCisJLyoqCisJICogZ2V0VmFsaWRhdG9yLiBWYWxpZGF0b3JzCisJICogc3ViY2xhc3MgZm9yIG1vcmUgYWR2YW5jZWQgdmFsaWRhdGlvbiAoPjAgZXRjLikKKwkgKiBAcGFyYW0gZmVhdHVyZQorCSAqIEByZXR1cm4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWF0cml4RWRpdG9yVmFsaWRhdG9yIGdldFZhbGlkYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQkvL0VDbGFzc2lmaWVyIHR5cGUgPSBmZWF0dXJlLmdldEVUeXBlKCk7CisJCU1hdHJpeEVkaXRvclZhbGlkYXRvciB2YWxpZGF0b3I9bnVsbDsKKwkJaWYoZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSA9PSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fVFJBTlNNSVNTSU9OX1JBVEUgfHwKKwkJCQlmZWF0dXJlLmdldEZlYXR1cmVJRCgpID09IE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19JTkZFQ1RJT1VTX01PUlRBTElUWV9SQVRFIHx8CisJCQkJZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSA9PSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fUkVDT1ZFUllfUkFURSkgCisJCQl2YWxpZGF0b3IgPSBuZXcgTWF0cml4RWRpdG9yVmFsaWRhdG9yKCkgeworCQkJCQorCQkJCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWUoU3RyaW5nIHZhbCkgeworCQkJCQlpZih2YWwgPT0gbnVsbCB8fCB2YWwudHJpbSgpLmVxdWFscygiIikpIHJldHVybiBmYWxzZTsKKwkJCQkJdHJ5IHsKKwkJCQkJCURvdWJsZS5wYXJzZURvdWJsZSh2YWwudHJpbSgpKTsKKwkJCQkJfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQkJCisJCQkJCXJldHVybiBpc1ZhbGlkVmFsdWUodmFsLCAwLjApOworCQkJCX0KKwkJfTsJCQkKKwkJaWYodmFsaWRhdG9yID09IG51bGwpIHZhbGlkYXRvciA9IHN1cGVyLmdldFZhbGlkYXRvcihmZWF0dXJlKTsKKwkJcmV0dXJuIHZhbGlkYXRvcjsKKwl9CisJCit9IC8vIE11bHRpUG9wdWxhdGlvbkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3ByZXNlbnRhdGlvbi9NdWx0aVBvcHVsYXRpb25EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJlc2VudGF0aW9uL011bHRpUG9wdWxhdGlvbkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNmVmMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3ByZXNlbnRhdGlvbi9NdWx0aVBvcHVsYXRpb25EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24ucHJlc2VudGF0aW9uOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZGlzZWFzZW1vZGVscHJvcGVydHllZGl0b3IuRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5kaXNlYXNlbW9kZWxwcm9wZXJ0eWVkaXRvci5EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLkRpc2Vhc2VNb2RlbFByb3BlcnR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CisKKy8qKgorICogIAorICogQWRhcHRlciBmb3IgUHJvcGVydHkgRWRpdG9yCisgKgorICovCitwdWJsaWMgY2xhc3MgTXVsdGlQb3B1bGF0aW9uRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyIGV4dGVuZHMKKwkJRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyIHsKKworCS8qKgorCSAqIAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvciBjcmVhdGVEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcigKKwkJCURpc2Vhc2VNb2RlbFByb3BlcnR5Q29tcG9zaXRlIGRpc2Vhc2VNb2RlbFByb3BlcnR5Q29tcG9zaXRlLAorCQkJaW50IHN0eWxlLCBNb2RpZnlMaXN0ZW5lciBwcm9qZWN0VmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB7CisJCXJldHVybiBuZXcgTXVsdGlQb3B1bGF0aW9uRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IoCisJCQkJZGlzZWFzZU1vZGVsUHJvcGVydHlDb21wb3NpdGUsIHN0eWxlLAorCQkJCShEaXNlYXNlTW9kZWwpIGdldFRhcmdldCgpLCBwcm9qZWN0VmFsaWRhdG9yLCBwcm9qZWN0KTsKKwl9IC8vIGNyZWF0ZURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yCisKK30gLy8gRXhhbXBsZURpc2Vhc2VNb2RlbEFkYXB0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJlc2VudGF0aW9uL011bHRpUG9wdWxhdGlvbkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJlc2VudGF0aW9uL011bHRpUG9wdWxhdGlvbkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTdlODRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi9wcmVzZW50YXRpb24vTXVsdGlQb3B1bGF0aW9uRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5wcmVzZW50YXRpb247CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi51dGlsLk11bHRpcG9wdWxhdGlvbkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZGlzZWFzZW1vZGVscHJvcGVydHllZGl0b3IuRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZGlzZWFzZW1vZGVscHJvcGVydHllZGl0b3IuRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBAYXV0aG9yIGphbWVzCisgKiAKKyAqLworcHVibGljIGNsYXNzIE11bHRpUG9wdWxhdGlvbkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkgZXh0ZW5kcworCQlNdWx0aXBvcHVsYXRpb25BZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzCisJCURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkgeworCisJLyoqCisJICogCisJICovCisJcHVibGljIE11bHRpUG9wdWxhdGlvbkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJCURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkuYWRkQWRhcHRlckZhY3RvcnkodGhpcyk7CisJfQorCisJLyoqCisJICogCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IE11bHRpUG9wdWxhdGlvbkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlcigpOworCX0KKworCS8qKgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUudXRpbC5FeGFtcGxlQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyLmNsYXNzCisJCQkJfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9Cit9IC8vIE11bHRpUG9wdWxhdGlvbkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJlc2VudGF0aW9uL011bHRpUG9wdWxhdGlvblByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi9wcmVzZW50YXRpb24vTXVsdGlQb3B1bGF0aW9uUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlOTJmMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJlc2VudGF0aW9uL011bHRpUG9wdWxhdGlvblByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvLyBFeGFtcGxlUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24udXRpbC5NdWx0aXBvcHVsYXRpb25BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aVBvcHVsYXRpb25Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcworCQlNdWx0aXBvcHVsYXRpb25BZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzCisJCVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSwgSVN0YXJ0dXAgeworCisJUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IG51bGw7CisKKwkvKioKKwkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisJICovCisJcHVibGljIE11bHRpUG9wdWxhdGlvblByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkZEFkYXB0ZXJGYWN0b3J5KHRoaXMpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXAjZWFybHlTdGFydHVwKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBlYXJseVN0YXJ0dXAoKSB7CisJCS8vIE5vdGhpbmcgdG8gZG8gaGVyZS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBoYXMKKwkJLy8gcnVuIHdoaWNoIGlzIHRoZSBlbnRpcmUgcG9pbnQgb2YgZWFybHkgYWN0aXZhdGlvbiB3aGljaCBjYXVzZXMgdGhlCisJCS8vIGZhY3RvcnkgdG8gYmUgYWRkZWQgdG8gdGhlIFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGwjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSkKKwkJCQl8fCB0eXBlID09IFByb3BlcnR5U3RyaW5nUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZXhhbXBsZS51dGlsLkV4YW1wbGVBZGFwdGVyRmFjdG9yeSNjcmVhdGVFeGFtcGxlRGlzZWFzZU1vZGVsQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQkvLyBIYXZlIHdlIGNyZWF0ZWQgb25lIGJlZm9yZT8KKwkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgeworCQkJLy8gTm8KKwkJCWFkYXB0ZXIgPSBuZXcgIFN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LlN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIoKSB7CisKKwkJCQkvKioKKwkJCQkgKiBAcGFyYW0gZGVzY3JpcHRvcgorCQkJCSAqIEByZXR1cm4gdGhlIE5MUydkIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKKwkJCQkgKi8KKwkJCQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZShJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisJCQkJCXRyeSB7CisJCQkJCQlyZXR1cm4gTXVsdGlwb3B1bGF0aW9uRGlzZWFzZVdpemFyZE1lc3NhZ2VzCisJCQkJCQkJCS5nZXRTdHJpbmcoKChFU3RydWN0dXJhbEZlYXR1cmUpIGRlc2NyaXB0b3IKKwkJCQkJCQkJCQkuZ2V0RmVhdHVyZShudWxsKSkuZ2V0TmFtZSgpKTsKKwkJCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eU5hbWUoZGVzY3JpcHRvcik7CisJCQkJCX0KKwkJCQl9IC8vIGdldFByb3BlcnR5TmFtZQorCisJCQkJLyoqCisJCQkJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkJCQkgKiBAcmV0dXJuIHRoZSBOTFMnZCB0b29sIHRpcCB0ZXh0IHRoYXQgZGVzY3JpYmVzIHRoZSBwcm9wZXJ0eQorCQkJCSAqLworCQkJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlUb29sVGlwKAorCQkJCQkJSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQkJCQl0cnkgeworCQkJCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBkZXNjcmlwdG9yCisJCQkJCQkJCS5nZXRGZWF0dXJlKG51bGwpOworCQkJCQkJcmV0dXJuIE11bHRpcG9wdWxhdGlvbkRpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoZmVhdHVyZQorCQkJCQkJCQkuZ2V0TmFtZSgpCisJCQkJCQkJCSsgVFRfU1VGRklYKTsKKwkJCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eVRvb2xUaXAoZGVzY3JpcHRvcik7CisJCQkJCX0KKwkJCQl9IC8vIGdldFByb3BlcnR5VG9vbFRpcAorCisJCQkJLyoqCisJCQkJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkJCQkgKiBAcmV0dXJuIHRoZSBOTFMnZCB0ZXh0IHRoYXQgcmVwcmVzZW50cyB0aGUgdW5pdHMgb2YgdGhlCisJCQkJICogICAgICAgICBwcm9wZXJ0eQorCQkJCSAqLworCQkJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlVbml0cygKKwkJCQkJCUlJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZGVzY3JpcHRvcgorCQkJCQkJCQkuZ2V0RmVhdHVyZShudWxsKTsKKwkJCQkJCXJldHVybiBNdWx0aXBvcHVsYXRpb25EaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKGZlYXR1cmUKKwkJCQkJCQkJLmdldE5hbWUoKQorCQkJCQkJCQkrIFVOSVRfU1VGRklYKTsKKwkJCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eVVuaXRzKGRlc2NyaXB0b3IpOworCQkJCQl9CisJCQkJfSAvLyBnZXRQcm9wZXJ0eVVuaXRzCisJCQl9OworCQl9IC8vIGlmIHdlIGRpZG4ndCBjcmVhdGUgb25lIGJlZm9yZQorCQlyZXR1cm4gYWRhcHRlcjsKKwl9Ly8gY3JlYXRlRXhhbXBsZURpc2Vhc2VNb2RlbEFkYXB0ZXIoKQorCit9IC8vIEV4YW1wbGVQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJlc2VudGF0aW9uL011bHRpcG9wdWxhdGlvbkFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3ByZXNlbnRhdGlvbi9NdWx0aXBvcHVsYXRpb25BY3Rpb25CYXJDb250cmlidXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNzVmMGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3ByZXNlbnRhdGlvbi9NdWx0aXBvcHVsYXRpb25BY3Rpb25CYXJDb250cmlidXRvci5qYXZhCkBAIC0wLDAgKzEsNDMyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24ucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db250cm9sQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Mb2FkUmVzb3VyY2VBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlZhbGlkYXRlQWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uSXRlbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGFjdGlvbiBiYXIgY29udHJpYnV0b3IgZm9yIHRoZSBNdWx0aXBvcHVsYXRpb24gbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTXVsdGlwb3B1bGF0aW9uQWN0aW9uQmFyQ29udHJpYnV0b3IKKwlleHRlbmRzIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcgorCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yUGFydDsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGFjdGlvbiBvcGVucyB0aGUgUHJvcGVydGllcyB2aWV3LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQWN0aW9uIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbiA9CisJCW5ldyBBY3Rpb24oTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW0iKSkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJdHJ5IHsKKwkJCQkJZ2V0UGFnZSgpLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7CisJCQkJfQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgYWN0aW9uIHJlZnJlc2hlcyB0aGUgdmlld2VyIG9mIHRoZSBjdXJyZW50IGVkaXRvciBpZiB0aGUgZWRpdG9yCisJICogaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUFjdGlvbiByZWZyZXNoVmlld2VyQWN0aW9uID0KKwkJbmV3IEFjdGlvbihNdWx0aXBvcHVsYXRpb25FZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0iKSkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisJCQkJcmV0dXJuIGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWlmIChhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7CisJCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRWaWV3ZXIoKTsKKwkJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7CisJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyB3aWxsIGNvbnRhaW4gb25lIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlQ2hpbGRBY3Rpb25zOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVDaGlsZCBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlU2libGluZ0FjdGlvbnM7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZVNpYmxpbmcgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgY29udHJpYnV0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE11bHRpcG9wdWxhdGlvbkFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgeworCQlzdXBlcihBRERJVElPTlNfTEFTVF9TVFlMRSk7CisJCWxvYWRSZXNvdXJjZUFjdGlvbiA9IG5ldyBMb2FkUmVzb3VyY2VBY3Rpb24oKTsKKwkJdmFsaWRhdGVBY3Rpb24gPSBuZXcgVmFsaWRhdGVBY3Rpb24oKTsKKwkJY29udHJvbEFjdGlvbiA9IG5ldyBDb250cm9sQWN0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIFNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMgdG8gdGhlIHRvb2wgYmFyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7CisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJtdWx0aXBvcHVsYXRpb24tc2V0dGluZ3MiKSk7CisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJtdWx0aXBvcHVsYXRpb24tYWRkaXRpb25zIikpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB0byB0aGUgbWVudSBiYXIgYSBtZW51IGFuZCBzb21lIHNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMsCisJICogYXMgd2VsbCBhcyB0aGUgc3ViLW1lbnVzIGZvciBvYmplY3QgY3JlYXRpb24gaXRlbXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51TWFuYWdlcik7CisKKwkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKE11bHRpcG9wdWxhdGlvbkVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9NdWx0aXBvcHVsYXRpb25FZGl0b3JfbWVudSIpLCAib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbk1lbnVJRCIpOworCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOworCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigic2V0dGluZ3MiKSk7CisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhY3Rpb25zIikpOworCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOworCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsKKworCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVDaGlsZCBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCisJCS8vCisJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsKKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyKTsKKworCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVTaWJsaW5nIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KKwkJLy8KKwkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKE11bHRpcG9wdWxhdGlvbkVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsKKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIpOworCisJCS8vIEZvcmNlIGFuIHVwZGF0ZSBiZWNhdXNlIEVjbGlwc2UgaGlkZXMgZW1wdHkgbWVudXMgbm93LgorCQkvLworCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIKKwkJCShuZXcgSU1lbnVMaXN0ZW5lcigpIHsKKwkJCQkgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQkJCQkgbWVudU1hbmFnZXIudXBkYXRlQWxsKHRydWUpOworCQkJCSB9CisJCQkgfSk7CisKKwkJYWRkR2xvYmFsQWN0aW9ucyhzdWJtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogV2hlbiB0aGUgYWN0aXZlIGVkaXRvciBjaGFuZ2VzLCB0aGlzIHJlbWVtYmVycyB0aGUgY2hhbmdlIGFuZCByZWdpc3RlcnMgd2l0aCBpdCBhcyBhIHNlbGVjdGlvbiBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkgeworCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IocGFydCk7CisJCWFjdGl2ZUVkaXRvclBhcnQgPSBwYXJ0OworCisJCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KKwkJLy8KKwkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKwkJfQorCQlpZiAocGFydCA9PSBudWxsKSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7CisJCX0KKwkJZWxzZSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7CisJCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisKKwkJCS8vIEZha2UgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCB0byB1cGRhdGUgdGhlIG1lbnVzLgorCQkJLy8KKwkJCWlmIChzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSAhPSBudWxsKSB7CisJCQkJc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNlbGVjdGlvblByb3ZpZGVyLCBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LAorCSAqIGhhbmRsaW5nIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH1zIGJ5IHF1ZXJ5aW5nIGZvciB0aGUgY2hpbGRyZW4gYW5kIHNpYmxpbmdzCisJICogdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGVkIG9iamVjdCBhbmQgdXBkYXRpbmcgdGhlIG1lbnVzIGFjY29yZGluZ2x5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCS8vIFJlbW92ZSBhbnkgbWVudSBpdGVtcyBmb3Igb2xkIHNlbGVjdGlvbi4KKwkJLy8KKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMpOworCQl9CisKKwkJLy8gUXVlcnkgdGhlIG5ldyBzZWxlY3Rpb24gZm9yIGFwcHJvcHJpYXRlIG5ldyBjaGlsZC9zaWJsaW5nIGRlc2NyaXB0b3JzCisJCS8vCisJCUNvbGxlY3Rpb248Pz4gbmV3Q2hpbGREZXNjcmlwdG9ycyA9IG51bGw7CisJCUNvbGxlY3Rpb248Pz4gbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gbnVsbDsKKworCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOworCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnNpemUoKSA9PSAxKSB7CisJCQlPYmplY3Qgb2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOworCisJCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7CisKKwkJCW5ld0NoaWxkRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhvYmplY3QsIG51bGwpOworCQkJbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobnVsbCwgb2JqZWN0KTsKKwkJfQorCisJCS8vIEdlbmVyYXRlIGFjdGlvbnMgZm9yIHNlbGVjdGlvbjsgcG9wdWxhdGUgYW5kIHJlZHJhdyB0aGUgbWVudXMuCisJCS8vCisJCWNyZWF0ZUNoaWxkQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKG5ld0NoaWxkRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7CisJCWNyZWF0ZVNpYmxpbmdBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhuZXdTaWJsaW5nRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7CisKKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7CisJCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKKwkJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7CisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7CisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlQ2hpbGRBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCisJLyoqCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgeworCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVTaWJsaW5nQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwgZGVzY3JpcHRvcikpOworCQkJfQorCQl9CisJCXJldHVybiBhY3Rpb25zOworCX0KKworCS8qKgorCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gd2l0aCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cworCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sCisJICogYnkgaW5zZXJ0aW5nIHRoZW0gYmVmb3JlIHRoZSBzcGVjaWZpZWQgY29udHJpYnV0aW9uIGl0ZW0gPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+LgorCSAqIElmIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgc2ltcGx5IGFkZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zLCBTdHJpbmcgY29udHJpYnV0aW9uSUQpIHsKKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChJQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMpIHsKKwkJCQlpZiAoY29udHJpYnV0aW9uSUQgIT0gbnVsbCkgeworCQkJCQltYW5hZ2VyLmluc2VydEJlZm9yZShjb250cmlidXRpb25JRCwgYWN0aW9uKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCW1hbmFnZXIuYWRkKGFjdGlvbik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQkKKwkvKioKKwkgKiBUaGlzIHJlbW92ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cworCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucykgeworCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7CisJCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgeworCQkJCS8vIExvb2sgaW50byBTdWJDb250cmlidXRpb25JdGVtcworCQkJCS8vCisJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uSXRlbSA9IGl0ZW1zW2ldOworCQkJCXdoaWxlIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCQljb250cmlidXRpb25JdGVtID0gKChTdWJDb250cmlidXRpb25JdGVtKWNvbnRyaWJ1dGlvbkl0ZW0pLmdldElubmVySXRlbSgpOworCQkJCX0KKworCQkJCS8vIERlbGV0ZSB0aGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbXMgd2l0aCBtYXRjaGluZyBhY3Rpb24uCisJCQkJLy8KKwkJCQlpZiAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKKwkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0QWN0aW9uKCk7CisJCQkJCWlmIChhY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsKKwkJCQkJCW1hbmFnZXIucmVtb3ZlKGNvbnRyaWJ1dGlvbkl0ZW0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHBvcC11cCBtZW51IGJlZm9yZSBpdCBhcHBlYXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKKwkJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBudWxsOworCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKE11bHRpcG9wdWxhdGlvbkVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7CisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOworCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKE11bHRpcG9wdWxhdGlvbkVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsKKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7CisJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZWRpdCIsIHN1Ym1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGluc2VydHMgZ2xvYmFsIGFjdGlvbnMgYmVmb3JlIHRoZSAiYWRkaXRpb25zLWVuZCIgc2VwYXJhdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMtZW5kIiwgbmV3IFNlcGFyYXRvcigidWktYWN0aW9ucyIpKTsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24pOworCisJCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsJCQorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHJlZnJlc2hWaWV3ZXJBY3Rpb24pOworCisJCXN1cGVyLmFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgZW5zdXJlcyB0aGF0IGEgZGVsZXRlIGFjdGlvbiB3aWxsIGNsZWFuIHVwIGFsbCByZWZlcmVuY2VzIHRvIGRlbGV0ZWQgb2JqZWN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVBbGxSZWZlcmVuY2VzT25EZWxldGUoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJlc2VudGF0aW9uL011bHRpcG9wdWxhdGlvbkRpc2Vhc2VXaXphcmRNZXNzYWdlcy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi9wcmVzZW50YXRpb24vTXVsdGlwb3B1bGF0aW9uRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY0M2ZhMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJlc2VudGF0aW9uL011bHRpcG9wdWxhdGlvbkRpc2Vhc2VXaXphcmRNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8vIEV4YW1wbGVEaXNlYXNlV2l6YXJkTWVzc2FnZXMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0aGUgUmVzb3VyY2UgQnVuZGxlIGZvciB0aGlzIHBhY2thZ2UuCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aXBvcHVsYXRpb25EaXNlYXNlV2l6YXJkTWVzc2FnZXMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IENvbnN0YW50cy5JRF9ST09UCisJCQkrICIuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24ucHJlc2VudGF0aW9uLm11bHRpcG9wdWxhdGlvbmRpc2Vhc2VtZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCisJCQkuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBNdWx0aXBvcHVsYXRpb25EaXNlYXNlV2l6YXJkTWVzc2FnZXMoKSB7CisJCS8vIGVtcHR5CisJfQorCisJLyoqCisJICogQHBhcmFtIGtleQorCSAqICAgICAgICAgICAgdGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UKKwkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSBrZXkKKwkgKiBAdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBpZiB0aGUga2V5IGNhbm5vdCBiZSBmb3VuZAorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhmaW5hbCBTdHJpbmcga2V5KSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9ueworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwl9IC8vIGdldFN0cmluZworfSAvLyBFeGFtcGxlRGlzZWFzZVdpemFyZE1lc3NhZ2VzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3ByZXNlbnRhdGlvbi9NdWx0aXBvcHVsYXRpb25FZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJlc2VudGF0aW9uL011bHRpcG9wdWxhdGlvbkVkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDMzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3ByZXNlbnRhdGlvbi9NdWx0aXBvcHVsYXRpb25FZGl0b3IuamF2YQpAQCAtMCwwICsxLDE4NTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNhdmVBc0RpYWxvZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldFBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlZpZXdlclBhbmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLmVkaXRvci5Qcm9ibGVtRWRpdG9yUGFydDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVmFsaWRhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlJdGVtRGVsZWdhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5jZWxsZWRpdG9yLkFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkxvY2FsVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLlZpZXdlckRyYWdBZGFwdGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLlVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJTWFya2VySGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJVXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnZpZXcuRXh0ZW5kZWRQcm9wZXJ0eVNoZWV0UGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24ucHJvdmlkZXIuTXVsdGlwb3B1bGF0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcm92aWRlci5Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByb3ZpZGVyLk1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJvdmlkZXIuU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIucHJvdmlkZXIuU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLnByb3ZpZGVyLlNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMucHJvdmlkZXIuTGFiZWxzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOworCisKKy8qKgorICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgTXVsdGlwb3B1bGF0aW9uIG1vZGVsIGVkaXRvci4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE11bHRpcG9wdWxhdGlvbkVkaXRvcgorCWV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydAorCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5Qcm92aWRlciwgSVNlbGVjdGlvblByb3ZpZGVyLCBJTWVudUxpc3RlbmVyLCBJVmlld2VyUHJvdmlkZXIsIElHb3RvTWFya2VyIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBlZGl0aW5nIGRvbWFpbiB0aGF0IGlzIHVzZWQgdG8gdHJhY2sgYWxsIGNoYW5nZXMgdG8gdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG9uZSBhZGFwdGVyIGZhY3RvcnkgdXNlZCBmb3IgcHJvdmlkaW5nIHZpZXdzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQ29udGVudE91dGxpbmVQYWdlIGNvbnRlbnRPdXRsaW5lUGFnZTsKKworCS8qKgorCSAqIFRoaXMgaXMgYSBrbHVkZ2UuLi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVN0YXR1c0xpbmVNYW5hZ2VyIGNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZSdzIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBjb250ZW50T3V0bGluZVZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHByb3BlcnR5IHNoZWV0IHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFByb3BlcnR5U2hlZXRQYWdlIHByb3BlcnR5U2hlZXRQYWdlOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdmlld2VyIHRoYXQgc2hhZG93cyB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb250ZW50IG91dGxpbmUuCisJICogVGhlIHBhcmVudCByZWxhdGlvbiBtdXN0IGJlIGNvcnJlY3RseSBkZWZpbmVkIGZvciB0aGlzIHRvIHdvcmsuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgc2VsZWN0aW9uVmlld2VyOworCisJLyoqCisJICogVGhpcyBpbnZlcnRzIHRoZSByb2xsIG9mIHBhcmVudCBhbmQgY2hpbGQgaW4gdGhlIGNvbnRlbnQgcHJvdmlkZXIgYW5kIHNob3cgcGFyZW50cyBhcyBhIHRyZWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgcGFyZW50Vmlld2VyOworCisJLyoqCisJICogVGhpcyBzaG93cyBob3cgYSB0cmVlIHZpZXcgd29ya3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgc2hvd3MgaG93IGEgbGlzdCB2aWV3IHdvcmtzLgorCSAqIEEgbGlzdCB2aWV3ZXIgZG9lc24ndCBzdXBwb3J0IGljb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBMaXN0Vmlld2VyIGxpc3RWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIHNob3dzIGhvdyBhIHRhYmxlIHZpZXcgd29ya3MuCisJICogQSB0YWJsZSBjYW4gYmUgdXNlZCBhcyBhIGxpc3Qgd2l0aCBpY29ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIHNob3dzIGhvdyBhIHRyZWUgdmlldyB3aXRoIGNvbHVtbnMgd29ya3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcldpdGhDb2x1bW5zOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIHZpZXdlciBwYW5lLCBpbiB0aGUgYm9vay4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVmlld2VyUGFuZSBjdXJyZW50Vmlld2VyUGFuZTsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBjb250ZW50IHZpZXdlciwgd2hpY2ggbWF5IGJlIGVpdGhlciBvbmUgb2YgdGhlIHZpZXdlcnMgaW4gdGhlIHBhZ2VzIG9yIHRoZSBjb250ZW50IG91dGxpbmUgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBWaWV3ZXIgY3VycmVudFZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyB0byB3aGljaCBldmVyIHZpZXdlciBpcyBhY3RpdmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9cyB0aGF0IGFyZSBsaXN0ZW5pbmcgdG8gdGhpcyBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZWRpdG9yIGFzIGEgd2hvbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb24gZWRpdG9yU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKKworCS8qKgorCSAqIFRoZSBNYXJrZXJIZWxwZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHdvcmtzcGFjZSByZXNvdXJjZSBtYXJrZXJzIHByZXNlbnRlZAorCSAqIGluIEVjbGlwc2UncyBQcm9ibGVtcyBWaWV3LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXJrZXJIZWxwZXIgbWFya2VySGVscGVyID0gbmV3IEVkaXRVSU1hcmtlckhlbHBlcigpOworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIGZvciB3aGVuIHRoZSBvdXRsaW5lIGJlY29tZXMgYWN0aXZlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyID0KKwkJbmV3IElQYXJ0TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQlpZiAocCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSB7CisJCQkJCWlmICgoKENvbnRlbnRPdXRsaW5lKXApLmdldEN1cnJlbnRQYWdlKCkgPT0gY29udGVudE91dGxpbmVQYWdlKSB7CisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihNdWx0aXBvcHVsYXRpb25FZGl0b3IudGhpcyk7CisKKwkJCQkJCXNldEN1cnJlbnRWaWV3ZXIoY29udGVudE91dGxpbmVWaWV3ZXIpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHAgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSB7CisJCQkJCWlmICgoKFByb3BlcnR5U2hlZXQpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBwcm9wZXJ0eVNoZWV0UGFnZSkgeworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoTXVsdGlwb3B1bGF0aW9uRWRpdG9yLnRoaXMpOworCQkJCQkJaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChwID09IE11bHRpcG9wdWxhdGlvbkVkaXRvci50aGlzKSB7CisJCQkJCWhhbmRsZUFjdGl2YXRlKCk7CisJCQkJfQorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCX07CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBzYXZlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gc2F2ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogTWFwIHRvIHN0b3JlIHRoZSBkaWFnbm9zdGljIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+IHJlc291cmNlVG9EaWFnbm9zdGljTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+KCk7CisKKwkvKioKKwkgKiBDb250cm9scyB3aGV0aGVyIHRoZSBwcm9ibGVtIGluZGljYXRpb24gc2hvdWxkIGJlIHVwZGF0ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOworCisJLyoqCisJICogQWRhcHRlciB1c2VkIHRvIHVwZGF0ZSB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHdoZW4gcmVzb3VyY2VzIGFyZSBkZW1hbmRlZCBsb2FkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEVDb250ZW50QWRhcHRlciBwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIgPSAKKwkJbmV3IEVDb250ZW50QWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKKwkJCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJlc291cmNlLmNsYXNzKSkgeworCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEOgorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fRVJST1JTOgorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fV0FSTklOR1M6IHsKKwkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKKwkJCQkJCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgbnVsbCk7CisJCQkJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgZGlhZ25vc3RpYyk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5yZW1vdmUocmVzb3VyY2UpOworCQkJCQkJCX0KKworCQkJCQkJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgeworCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQkJCQkJCQkJCSB9CisJCQkJCQkJCQkgfSk7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCQkJfQorCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsKKwkJCQliYXNpY1NldFRhcmdldCh0YXJnZXQpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHVuc2V0VGFyZ2V0KFJlc291cmNlIHRhcmdldCkgeworCQkJCWJhc2ljVW5zZXRUYXJnZXQodGFyZ2V0KTsKKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyBmb3Igd29ya3NwYWNlIGNoYW5nZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPQorCQluZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7CisJCQkJdHJ5IHsKKwkJCQkJY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgeworCQkJCQkJcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpOworCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworCQkJCQkJCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgeworCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgfHwKKwkJCQkJCQkJICAgIGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIGRlbHRhLmdldEZsYWdzKCkgIT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUykgeworCQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShkZWx0YS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpLCBmYWxzZSk7CisJCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworCQkJCQkJCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgeworCQkJCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWVsc2UgaWYgKCFzYXZlZFJlc291cmNlcy5yZW1vdmUocmVzb3VyY2UpKSB7CisJCQkJCQkJCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCX0KKworCQkJCQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldENoYW5nZWRSZXNvdXJjZXMoKSB7CisJCQkJCQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7CisJCQkJCQl9CisKKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRSZW1vdmVkUmVzb3VyY2VzKCkgeworCQkJCQkJCXJldHVybiByZW1vdmVkUmVzb3VyY2VzOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJZmluYWwgUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOworCQkJCQlkZWx0YS5hY2NlcHQodmlzaXRvcik7CisKKwkJCQkJaWYgKCF2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJIHJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsKKwkJCQkJCQkJCSBpZiAoIWlzRGlydHkoKSkgeworCQkJCQkJCQkJCSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKE11bHRpcG9wdWxhdGlvbkVkaXRvci50aGlzLCBmYWxzZSk7CisJCQkJCQkJCQkgfQorCQkJCQkJCQkgfQorCQkJCQkJCSB9KTsKKwkJCQkJfQorCisJCQkJCWlmICghdmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCSBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7CisJCQkJCQkJCQkgaWYgKGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gTXVsdGlwb3B1bGF0aW9uRWRpdG9yLnRoaXMpIHsKKwkJCQkJCQkJCQkgaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQkJCQkJCSB9CisJCQkJCQkJCSB9CisJCQkJCQkJIH0pOworCQkJCQl9CisJCQkJfQorCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlNdWx0aXBvcHVsYXRpb25FZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogSGFuZGxlcyBhY3RpdmF0aW9uIG9mIHRoZSBlZGl0b3Igb3IgaXQncyBhc3NvY2lhdGVkIHZpZXdzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFjdGl2YXRlKCkgeworCQkvLyBSZWNvbXB1dGUgdGhlIHJlYWQgb25seSBzdGF0ZS4KKwkJLy8KKwkJaWYgKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkgIT0gbnVsbCkgeworCQkgIGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkuY2xlYXIoKTsKKworCQkgIC8vIFJlZnJlc2ggYW55IGFjdGlvbnMgdGhhdCBtYXkgYmVjb21lIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisJCSAgLy8KKwkJICBzZXRTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpOworCQl9CisKKwkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgeworCQkJaWYgKGhhbmRsZURpcnR5Q29uZmxpY3QoKSkgeworCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoTXVsdGlwb3B1bGF0aW9uRWRpdG9yLnRoaXMsIGZhbHNlKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCWNoYW5nZWRSZXNvdXJjZXMucmVtb3ZlQWxsKHNhdmVkUmVzb3VyY2VzKTsKKwkJCWhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKTsKKwkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBIYW5kbGVzIHdoYXQgdG8gZG8gd2l0aCBjaGFuZ2VkIHJlc291cmNlcyBvbiBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKSB7CisJCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkgJiYgKCFpc0RpcnR5KCkgfHwgaGFuZGxlRGlydHlDb25mbGljdCgpKSkgeworCQkJaWYgKGlzRGlydHkoKSkgeworCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSk7CisJCQl9CisJCQllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7CisKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgeworCQkJCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKSB7CisJCQkJCXJlc291cmNlLnVubG9hZCgpOworCQkJCQl0cnkgeworCQkJCQkJcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOworCQkJCQl9CisJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCWlmICghcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAuY29udGFpbnNLZXkocmVzb3VyY2UpKSB7CisJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4uaXNTdGFsZShlZGl0b3JTZWxlY3Rpb24pKSB7CisJCQkJc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOworCQkJfQorCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQl9CisJfQorICAKKwkvKioKKwkgKiBVcGRhdGVzIHRoZSBwcm9ibGVtcyBpbmRpY2F0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWVkIGRpYWdub3N0aWMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKSB7CisJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgeworCQkJQmFzaWNEaWFnbm9zdGljIGRpYWdub3N0aWMgPQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMKKwkJCQkJKERpYWdub3N0aWMuT0ssCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5lZGl0b3IiLAorCQkJCQkgMCwKKwkJCQkJIG51bGwsCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpIH0pOworCQkJZm9yIChEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA6IHJlc291cmNlVG9EaWFnbm9zdGljTWFwLnZhbHVlcygpKSB7CisJCQkJaWYgKGNoaWxkRGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJZGlhZ25vc3RpYy5hZGQoY2hpbGREaWFnbm9zdGljKTsKKwkJCQl9CisJCQl9CisKKwkJCWludCBsYXN0RWRpdG9yUGFnZSA9IGdldFBhZ2VDb3VudCgpIC0gMTsKKwkJCWlmIChsYXN0RWRpdG9yUGFnZSA+PSAwICYmIGdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkgaW5zdGFuY2VvZiBQcm9ibGVtRWRpdG9yUGFydCkgeworCQkJCSgoUHJvYmxlbUVkaXRvclBhcnQpZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSkuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQlQcm9ibGVtRWRpdG9yUGFydCBwcm9ibGVtRWRpdG9yUGFydCA9IG5ldyBQcm9ibGVtRWRpdG9yUGFydCgpOworCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7CisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0TWFya2VySGVscGVyKG1hcmtlckhlbHBlcik7CisJCQkJdHJ5IHsKKwkJCQkJYWRkUGFnZSgrK2xhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydCwgZ2V0RWRpdG9ySW5wdXQoKSk7CisJCQkJCXNldFBhZ2VUZXh0KGxhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydC5nZXRQYXJ0TmFtZSgpKTsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJCXNob3dUYWJzKCk7CisJCQkJfQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKworCQkJaWYgKG1hcmtlckhlbHBlci5oYXNNYXJrZXJzKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSkpIHsKKwkJCQltYXJrZXJIZWxwZXIuZGVsZXRlTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQl0cnkgeworCQkJCQkJbWFya2VySGVscGVyLmNyZWF0ZU1hcmtlcnMoZGlhZ25vc3RpYyk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQlNdWx0aXBvcHVsYXRpb25FZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBTaG93cyBhIGRpYWxvZyB0aGF0IGFza3MgaWYgY29uZmxpY3RpbmcgY2hhbmdlcyBzaG91bGQgYmUgZGlzY2FyZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZURpcnR5Q29uZmxpY3QoKSB7CisJCXJldHVybgorCQkJTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24KKwkJCQkoZ2V0U2l0ZSgpLmdldFNoZWxsKCksCisJCQkJIGdldFN0cmluZygiX1VJX0ZpbGVDb25mbGljdF9sYWJlbCIpLAorCQkJCSBnZXRTdHJpbmcoIl9XQVJOX0ZpbGVDb25mbGljdCIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBtb2RlbCBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE11bHRpcG9wdWxhdGlvbkVkaXRvcigpIHsKKwkJc3VwZXIoKTsKKwkJaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdXAgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgbW9kZWwgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFZGl0aW5nRG9tYWluKCkgeworCQkvLyBDcmVhdGUgYW4gYWRhcHRlciBmYWN0b3J5IHRoYXQgeWllbGRzIGl0ZW0gcHJvdmlkZXJzLgorCQkvLworCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkuRGVzY3JpcHRvci5SZWdpc3RyeS5JTlNUQU5DRSk7CisKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNdWx0aXBvcHVsYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBFY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTb2x2ZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IExhYmVsc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlIGV4ZWN1dGVkLgorCQkvLworCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKKworCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLgorCQkvLworCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIKKwkJCShuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7CisJCQkJIHB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsKKwkJCQkJIGdldENvbnRhaW5lcigpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCSAobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCSAgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkgIGZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKKworCQkJCQkJCQkgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuCisJCQkJCQkJCSAgLy8KKwkJCQkJCQkJICBDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spZXZlbnQuZ2V0U291cmNlKCkpLmdldE1vc3RSZWNlbnRDb21tYW5kKCk7CisJCQkJCQkJCSAgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKKwkJCQkJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOworCQkJCQkJCQkgIH0KKwkJCQkJCQkJICBpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCAmJiAhcHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgeworCQkJCQkJCQkJICBwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7CisJCQkJCQkJCSAgfQorCQkJCQkJCSAgfQorCQkJCQkJICB9KTsKKwkJCQkgfQorCQkJIH0pOworCisJCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KKwkJLy8KKwkJZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywgbmV3IEhhc2hNYXA8UmVzb3VyY2UsIEJvb2xlYW4+KCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgaGVyZSBmb3IgdGhlIGxpc3RlbmVyIHRvIGJlIGFibGUgdG8gY2FsbCBpdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwkJCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgYWN0aW9uKSB7CisJCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShhY3Rpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgc2V0cyB0aGUgc2VsZWN0aW9uIGludG8gd2hpY2hldmVyIHZpZXdlciBpcyBhY3RpdmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisJCWZpbmFsIENvbGxlY3Rpb248Pz4gdGhlU2VsZWN0aW9uID0gY29sbGVjdGlvbjsKKwkJLy8gTWFrZSBzdXJlIGl0J3Mgb2theS4KKwkJLy8KKwkJaWYgKHRoZVNlbGVjdGlvbiAhPSBudWxsICYmICF0aGVTZWxlY3Rpb24uaXNFbXB0eSgpKSB7CisJCQlSdW5uYWJsZSBydW5uYWJsZSA9CisJCQkJbmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBpdGVtcyBpbiB0aGUgY3VycmVudCBjb250ZW50IHZpZXdlciBvZiB0aGUgZWRpdG9yLgorCQkJCQkJLy8KKwkJCQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKKwkJCQkJCQljdXJyZW50Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0aGVTZWxlY3Rpb24udG9BcnJheSgpKSwgdHJ1ZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9OworCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGVkaXRpbmcgZG9tYWluIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSUVkaXRpbmdEb21haW5Qcm92aWRlcn0gaW50ZXJmYWNlLgorCSAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBpbXBsZW1lbnRpbmcgdGhlIHN0YXRpYyBtZXRob2RzIG9mIHtAbGluayBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW59CisJICogYW5kIGZvciBzdXBwb3J0aW5nIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKKwkJcmV0dXJuIGVkaXRpbmdEb21haW47CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGNsYXNzIFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0IFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE9iamVjdCBbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7CisJCQlyZXR1cm4gKHBhcmVudCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhcmVudCkpLnRvQXJyYXkoKTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiBwYXJlbnQgIT0gbnVsbDsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q3VycmVudFZpZXdlclBhbmUoVmlld2VyUGFuZSB2aWV3ZXJQYW5lKSB7CisJCWlmIChjdXJyZW50Vmlld2VyUGFuZSAhPSB2aWV3ZXJQYW5lKSB7CisJCQlpZiAoY3VycmVudFZpZXdlclBhbmUgIT0gbnVsbCkgeworCQkJCWN1cnJlbnRWaWV3ZXJQYW5lLnNob3dGb2N1cyhmYWxzZSk7CisJCQl9CisJCQljdXJyZW50Vmlld2VyUGFuZSA9IHZpZXdlclBhbmU7CisJCX0KKwkJc2V0Q3VycmVudFZpZXdlcihjdXJyZW50Vmlld2VyUGFuZS5nZXRWaWV3ZXIoKSk7CisJfQorCisJLyoqCisJICogVGhpcyBtYWtlcyBzdXJlIHRoYXQgb25lIGNvbnRlbnQgdmlld2VyLCBlaXRoZXIgZm9yIHRoZSBjdXJyZW50IHBhZ2Ugb3IgdGhlIG91dGxpbmUgdmlldywgaWYgaXQgaGFzIGZvY3VzLAorCSAqIGlzIHRoZSBjdXJyZW50IG9uZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vmlld2VyKFZpZXdlciB2aWV3ZXIpIHsKKwkJLy8gSWYgaXQgaXMgY2hhbmdpbmcuLi4KKwkJLy8KKwkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gdmlld2VyKSB7CisJCQlpZiAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsKKwkJCQkvLyBDcmVhdGUgdGhlIGxpc3RlbmVyIG9uIGRlbWFuZC4KKwkJCQkvLworCQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9CisJCQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJCQkJLy8gVGhpcyBqdXN0IG5vdGlmaWVzIHRob3NlIHRoaW5ncyB0aGF0IGFyZSBhZmZlY3RlZCBieSB0aGUgc2VjdGlvbi4KKwkJCQkJCS8vCisJCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBzZWxlY3Rpb25DaGFuZ2VkRXZlbnQpIHsKKwkJCQkJCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCX0KKworCQkJLy8gU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG9sZCBvbmUuCisJCQkvLworCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgeworCQkJCWN1cnJlbnRWaWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7CisJCQl9CisKKwkJCS8vIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmV3IG9uZS4KKwkJCS8vCisJCQlpZiAodmlld2VyICE9IG51bGwpIHsKKwkJCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7CisJCQl9CisKKwkJCS8vIFJlbWVtYmVyIGl0LgorCQkJLy8KKwkJCWN1cnJlbnRWaWV3ZXIgPSB2aWV3ZXI7CisKKwkJCS8vIFNldCB0aGUgZWRpdG9ycyBzZWxlY3Rpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgdmlld2VyJ3Mgc2VsZWN0aW9uLgorCQkJLy8KKwkJCXNldFNlbGVjdGlvbihjdXJyZW50Vmlld2VyID09IG51bGwgPyBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZIDogY3VycmVudFZpZXdlci5nZXRTZWxlY3Rpb24oKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHZpZXdlciBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElWaWV3ZXJQcm92aWRlcn0gaW50ZXJmYWNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgeworCQlyZXR1cm4gY3VycmVudFZpZXdlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIgYW5kIGFkZHMgYSBsaXN0ZW5lciBhcyB3ZWxsIHJlZ2lzdGVyaW5nIHRoZSBtZW51IGZvciBleHRlbnNpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKKwkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOworCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOworCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7CisJCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKKwkJTWVudSBtZW51PSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKKwkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOworCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgbmV3IFVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcih2aWV3ZXIpKTsKKworCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSzsKKwkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OworCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgVmlld2VyRHJhZ0FkYXB0ZXIodmlld2VyKSk7CisJCXZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIGNhbGxlZCB0byBsb2FkIGEgcmVzb3VyY2UgaW50byB0aGUgZWRpdGluZyBkb21haW4ncyByZXNvdXJjZSBzZXQgYmFzZWQgb24gdGhlIGVkaXRvcidzIGlucHV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZU1vZGVsKCkgeworCQlVUkkgcmVzb3VyY2VVUkkgPSBFZGl0VUlVdGlsLmdldFVSSShnZXRFZGl0b3JJbnB1dCgpKTsKKwkJRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCS8vIExvYWQgdGhlIHJlc291cmNlIHRocm91Z2ggdGhlIGVkaXRpbmcgZG9tYWluLgorCQkJLy8KKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCB0cnVlKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWV4Y2VwdGlvbiA9IGU7CisJCQlyZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgZmFsc2UpOworCQl9CisKKwkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbik7CisJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCAgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQl9CisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5hZGQocHJvYmxlbUluZGljYXRpb25BZGFwdGVyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgZGlhZ25vc3RpYyBkZXNjcmliaW5nIHRoZSBlcnJvcnMgYW5kIHdhcm5pbmdzIGxpc3RlZCBpbiB0aGUgcmVzb3VyY2UKKwkgKiBhbmQgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gKGlmIGFueSkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERpYWdub3N0aWMgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMoUmVzb3VyY2UgcmVzb3VyY2UsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJaWYgKCFyZXNvdXJjZS5nZXRFcnJvcnMoKS5pc0VtcHR5KCkgfHwgIXJlc291cmNlLmdldFdhcm5pbmdzKCkuaXNFbXB0eSgpKSB7CisJCQlCYXNpY0RpYWdub3N0aWMgYmFzaWNEaWFnbm9zdGljID0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uZWRpdG9yIiwKKwkJCQkJIDAsCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZXhjZXB0aW9uID09IG51bGwgPyAoT2JqZWN0KXJlc291cmNlIDogZXhjZXB0aW9uIH0pOworCQkJYmFzaWNEaWFnbm9zdGljLm1lcmdlKEVjb3JlVXRpbC5jb21wdXRlRGlhZ25vc3RpYyhyZXNvdXJjZSwgdHJ1ZSkpOworCQkJcmV0dXJuIGJhc2ljRGlhZ25vc3RpYzsKKwkJfQorCQllbHNlIGlmIChleGNlcHRpb24gIT0gbnVsbCkgeworCQkJcmV0dXJuCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLmVkaXRvciIsCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLAorCQkJCQkgbmV3IE9iamVjdFtdIHsgZXhjZXB0aW9uIH0pOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIERpYWdub3N0aWMuT0tfSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGluc3RhbGwgeW91ciBvd24gY29udHJvbHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3JlYXRlUGFnZXMoKSB7CisJCS8vIENyZWF0ZXMgdGhlIG1vZGVsIGZyb20gdGhlIGVkaXRvciBpbnB1dAorCQkvLworCQljcmVhdGVNb2RlbCgpOworCisJCS8vIE9ubHkgY3JlYXRlcyB0aGUgb3RoZXIgcGFnZXMgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGVkaXRlZAorCQkvLworCQlpZiAoIWdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJLy8gQ3JlYXRlIGEgcGFnZSBmb3IgdGhlIHNlbGVjdGlvbiB0cmVlIHZpZXcuCisJCQkvLworCQkJeworCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9CisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIE11bHRpcG9wdWxhdGlvbkVkaXRvci50aGlzKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKwkJCQkJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShjb21wb3NpdGUsIFNXVC5NVUxUSSk7CisJCQkJCQkJVHJlZVZpZXdlciBuZXdUcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7CisJCQkJCQkJcmV0dXJuIG5ld1RyZWVWaWV3ZXI7CisJCQkJCQl9CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgeworCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7CisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7CisJCQkJCQl9CisJCQkJCX07CisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsKKworCQkJCXNlbGVjdGlvblZpZXdlciA9IChUcmVlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7CisJCQkJc2VsZWN0aW9uVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKworCQkJCXNlbGVjdGlvblZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKwkJCQl2aWV3ZXJQYW5lLnNldFRpdGxlKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisKKwkJCQluZXcgQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yKHNlbGVjdGlvblZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsKKworCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHNlbGVjdGlvblZpZXdlcik7CisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOworCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsKKwkJCX0KKworCQkJLy8gQ3JlYXRlIGEgcGFnZSBmb3IgdGhlIHBhcmVudCB0cmVlIHZpZXcuCisJCQkvLworCQkJeworCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9CisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIE11bHRpcG9wdWxhdGlvbkVkaXRvci50aGlzKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKwkJCQkJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShjb21wb3NpdGUsIFNXVC5NVUxUSSk7CisJCQkJCQkJVHJlZVZpZXdlciBuZXdUcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7CisJCQkJCQkJcmV0dXJuIG5ld1RyZWVWaWV3ZXI7CisJCQkJCQl9CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgeworCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7CisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7CisJCQkJCQl9CisJCQkJCX07CisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsKKworCQkJCXBhcmVudFZpZXdlciA9IChUcmVlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7CisJCQkJcGFyZW50Vmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbCgzMCk7CisJCQkJcGFyZW50Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJcGFyZW50Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IocGFyZW50Vmlld2VyKTsKKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7CisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9QYXJlbnRQYWdlX2xhYmVsIikpOworCQkJfQorCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgbGlzdCB2aWV3ZXIKKwkJCS8vCisJCQl7CisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgTXVsdGlwb3B1bGF0aW9uRWRpdG9yLnRoaXMpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQkJCQkJCXJldHVybiBuZXcgTGlzdFZpZXdlcihjb21wb3NpdGUpOworCQkJCQkJfQorCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsKKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOworCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOworCQkJCQkJfQorCQkJCQl9OworCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7CisJCQkJbGlzdFZpZXdlciA9IChMaXN0Vmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7CisJCQkJbGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJbGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKworCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKGxpc3RWaWV3ZXIpOworCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsKKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX0xpc3RQYWdlX2xhYmVsIikpOworCQkJfQorCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgdHJlZSB2aWV3ZXIKKwkJCS8vCisJCQl7CisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgTXVsdGlwb3B1bGF0aW9uRWRpdG9yLnRoaXMpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQkJCQkJCXJldHVybiBuZXcgVHJlZVZpZXdlcihjb21wb3NpdGUpOworCQkJCQkJfQorCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsKKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOworCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOworCQkJCQkJfQorCQkJCQl9OworCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7CisJCQkJdHJlZVZpZXdlciA9IChUcmVlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7CisJCQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKworCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3IodHJlZVZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsKKworCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRyZWVWaWV3ZXIpOworCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsKKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1RyZWVQYWdlX2xhYmVsIikpOworCQkJfQorCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgdGFibGUgdmlld2VyLgorCQkJLy8KKwkJCXsKKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBNdWx0aXBvcHVsYXRpb25FZGl0b3IudGhpcykgeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7CisJCQkJCQkJcmV0dXJuIG5ldyBUYWJsZVZpZXdlcihjb21wb3NpdGUpOworCQkJCQkJfQorCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsKKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOworCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOworCQkJCQkJfQorCQkJCQl9OworCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7CisJCQkJdGFibGVWaWV3ZXIgPSAoVGFibGVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsKKworCQkJCVRhYmxlIHRhYmxlID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKKwkJCQlUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKKwkJCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOworCQkJCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKKworCQkJCVRhYmxlQ29sdW1uIG9iamVjdENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOworCQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDMsIDEwMCwgdHJ1ZSkpOworCQkJCW9iamVjdENvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX09iamVjdENvbHVtbl9sYWJlbCIpKTsKKwkJCQlvYmplY3RDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOworCisJCQkJVGFibGVDb2x1bW4gc2VsZkNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOworCQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDIsIDEwMCwgdHJ1ZSkpOworCQkJCXNlbGZDb2x1bW4uc2V0VGV4dChnZXRTdHJpbmcoIl9VSV9TZWxmQ29sdW1uX2xhYmVsIikpOworCQkJCXNlbGZDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOworCisJCQkJdGFibGVWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nIFtdIHsiYSIsICJiIn0pOworCQkJCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKworCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRhYmxlVmlld2VyKTsKKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7CisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9UYWJsZVBhZ2VfbGFiZWwiKSk7CisJCQl9CisKKwkJCS8vIFRoaXMgaXMgdGhlIHBhZ2UgZm9yIHRoZSB0YWJsZSB0cmVlIHZpZXdlci4KKwkJCS8vCisJCQl7CisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgTXVsdGlwb3B1bGF0aW9uRWRpdG9yLnRoaXMpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQkJCQkJCXJldHVybiBuZXcgVHJlZVZpZXdlcihjb21wb3NpdGUpOworCQkJCQkJfQorCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsKKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOworCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOworCQkJCQkJfQorCQkJCQl9OworCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7CisKKwkJCQl0cmVlVmlld2VyV2l0aENvbHVtbnMgPSAoVHJlZVZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOworCisJCQkJVHJlZSB0cmVlID0gdHJlZVZpZXdlcldpdGhDb2x1bW5zLmdldFRyZWUoKTsKKwkJCQl0cmVlLnNldExheW91dERhdGEobmV3IEZpbGxMYXlvdXQoKSk7CisJCQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOworCQkJCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOworCisJCQkJVHJlZUNvbHVtbiBvYmplY3RDb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7CisJCQkJb2JqZWN0Q29sdW1uLnNldFRleHQoZ2V0U3RyaW5nKCJfVUlfT2JqZWN0Q29sdW1uX2xhYmVsIikpOworCQkJCW9iamVjdENvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7CisJCQkJb2JqZWN0Q29sdW1uLnNldFdpZHRoKDI1MCk7CisKKwkJCQlUcmVlQ29sdW1uIHNlbGZDb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7CisJCQkJc2VsZkNvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX1NlbGZDb2x1bW5fbGFiZWwiKSk7CisJCQkJc2VsZkNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7CisJCQkJc2VsZkNvbHVtbi5zZXRXaWR0aCgyMDApOworCisJCQkJdHJlZVZpZXdlcldpdGhDb2x1bW5zLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZyBbXSB7ImEiLCAiYiJ9KTsKKwkJCQl0cmVlVmlld2VyV2l0aENvbHVtbnMuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCXRyZWVWaWV3ZXJXaXRoQ29sdW1ucy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKworCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRyZWVWaWV3ZXJXaXRoQ29sdW1ucyk7CisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOworCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfVHJlZVdpdGhDb2x1bW5zUGFnZV9sYWJlbCIpKTsKKwkJCX0KKworCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkgc2V0QWN0aXZlUGFnZSgwKTsKKwkJCQkJIH0KKwkJCQkgfSk7CisJCX0KKworCQkvLyBFbnN1cmVzIHRoYXQgdGhpcyBlZGl0b3Igd2lsbCBvbmx5IGRpc3BsYXkgdGhlIHBhZ2UncyB0YWIKKwkJLy8gYXJlYSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBwYWdlCisJCS8vCisJCWdldENvbnRhaW5lcigpLmFkZENvbnRyb2xMaXN0ZW5lcgorCQkJKG5ldyBDb250cm9sQWRhcHRlcigpIHsKKwkJCQlib29sZWFuIGd1YXJkID0gZmFsc2U7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7CisJCQkJCWlmICghZ3VhcmQpIHsKKwkJCQkJCWd1YXJkID0gdHJ1ZTsKKwkJCQkJCWhpZGVUYWJzKCk7CisJCQkJCQlndWFyZCA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJIH0pOworCisJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCQkJIH0KKwkJCSB9KTsKKwl9CisKKwkvKioKKwkgKiBJZiB0aGVyZSBpcyBqdXN0IG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LAorCSAqIHRoaXMgaGlkZXMgdGhlIHNpbmdsZSB0YWIgYXQgdGhlIGJvdHRvbS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoaWRlVGFicygpIHsKKwkJaWYgKGdldFBhZ2VDb3VudCgpIDw9IDEpIHsKKwkJCXNldFBhZ2VUZXh0KDAsICIiKTsKKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsKKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodCgxKTsKKwkJCQlQb2ludCBwb2ludCA9IGdldENvbnRhaW5lcigpLmdldFNpemUoKTsKKwkJCQlnZXRDb250YWluZXIoKS5zZXRTaXplKHBvaW50LngsIHBvaW50LnkgKyA2KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGFnZSBpbiB0aGUgbXVsdGktcGFnZSBlZGl0b3IgcGFydCwKKwkgKiB0aGlzIHNob3dzIHRoZSB0YWJzIGF0IHRoZSBib3R0b20uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2hvd1RhYnMoKSB7CisJCWlmIChnZXRQYWdlQ291bnQoKSA+IDEpIHsKKwkJCXNldFBhZ2VUZXh0KDAsIGdldFN0cmluZygiX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwiKSk7CisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7CisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoU1dULkRFRkFVTFQpOworCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOworCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSAtIDYpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIHRyYWNrIHRoZSBhY3RpdmUgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IHBhZ2VJbmRleCkgeworCQlzdXBlci5wYWdlQ2hhbmdlKHBhZ2VJbmRleCk7CisKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7CisJCQloYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihjb250ZW50T3V0bGluZVBhZ2UuZ2V0U2VsZWN0aW9uKCkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBob3cgdGhlIGZyYW1ld29yayBkZXRlcm1pbmVzIHdoaWNoIGludGVyZmFjZXMgd2UgaW1wbGVtZW50LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKKwkJaWYgKGtleS5lcXVhbHMoSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcykpIHsKKwkJCXJldHVybiBzaG93T3V0bGluZVZpZXcoKSA/IGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIDogbnVsbDsKKwkJfQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykpIHsKKwkJCXJldHVybiBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOworCQl9CisJCWVsc2UgaWYgKGtleS5lcXVhbHMoSUdvdG9NYXJrZXIuY2xhc3MpKSB7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGtleSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIGNvbnRlbnQgb3V0bGluZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElDb250ZW50T3V0bGluZVBhZ2UgZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgeworCQlpZiAoY29udGVudE91dGxpbmVQYWdlID09IG51bGwpIHsKKwkJCS8vIFRoZSBjb250ZW50IG91dGxpbmUgaXMganVzdCBhIHRyZWUuCisJCQkvLworCQkJY2xhc3MgTXlDb250ZW50T3V0bGluZVBhZ2UgZXh0ZW5kcyBDb250ZW50T3V0bGluZVBhZ2UgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQkJCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyID0gZ2V0VHJlZVZpZXdlcigpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisKKwkJCQkJLy8gU2V0IHVwIHRoZSB0cmVlIHZpZXdlci4KKwkJCQkJLy8KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKworCQkJCQkvLyBNYWtlIHN1cmUgb3VyIHBvcHVwcyB3b3JrLgorCQkJCQkvLworCQkJCQljcmVhdGVDb250ZXh0TWVudUZvcihjb250ZW50T3V0bGluZVZpZXdlcik7CisKKwkJCQkJaWYgKCFlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCSAgLy8gU2VsZWN0IHRoZSByb290IG9iamVjdCBpbiB0aGUgdmlldy4KKwkJCQkJICAvLworCQkJCQkgIGNvbnRlbnRPdXRsaW5lVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBtYWtlQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyKSB7CisJCQkJCXN1cGVyLm1ha2VDb250cmlidXRpb25zKG1lbnVNYW5hZ2VyLCB0b29sQmFyTWFuYWdlciwgc3RhdHVzTGluZU1hbmFnZXIpOworCQkJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyID0gc3RhdHVzTGluZU1hbmFnZXI7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisJCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7CisJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOworCQkJCX0KKwkJCX0KKworCQkJY29udGVudE91dGxpbmVQYWdlID0gbmV3IE15Q29udGVudE91dGxpbmVQYWdlKCk7CisKKwkJCS8vIExpc3RlbiB0byBzZWxlY3Rpb24gc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGl0IGlzIGEgc3BlY2lhbCB3YXkuCisJCQkvLworCQkJY29udGVudE91dGxpbmVQYWdlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgorCQkJCShuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCQkJIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGhhbmRsZSBzZWxlY3Rpb25zIGNvcnJlY3RseS4KKwkJCQkJIC8vCisJCQkJCSBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCQkJIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKKwkJCQkJIH0KKwkJCQkgfSk7CisJCX0KKworCQlyZXR1cm4gY29udGVudE91dGxpbmVQYWdlOworCX0KKworCS8qKgorCSAqIFRoaXMgYWNjZXNzZXMgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUgcHJvcGVydHkgc2hlZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElQcm9wZXJ0eVNoZWV0UGFnZSBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKKwkJaWYgKHByb3BlcnR5U2hlZXRQYWdlID09IG51bGwpIHsKKwkJCXByb3BlcnR5U2hlZXRQYWdlID0KKwkJCQluZXcgRXh0ZW5kZWRQcm9wZXJ0eVNoZWV0UGFnZShlZGl0aW5nRG9tYWluKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihMaXN0PD8+IHNlbGVjdGlvbikgeworCQkJCQkJTXVsdGlwb3B1bGF0aW9uRWRpdG9yLnRoaXMuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0aW9uKTsKKwkJCQkJCU11bHRpcG9wdWxhdGlvbkVkaXRvci50aGlzLnNldEZvY3VzKCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisJCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7CisJCQkJCX0KKwkJCQl9OworCQkJcHJvcGVydHlTaGVldFBhZ2Uuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJfQorCisJCXJldHVybiBwcm9wZXJ0eVNoZWV0UGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGRlYWxzIHdpdGggaG93IHdlIHdhbnQgc2VsZWN0aW9uIGluIHRoZSBvdXRsaW5lciB0byBhZmZlY3QgdGhlIG90aGVyIHZpZXdzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWlmIChjdXJyZW50Vmlld2VyUGFuZSAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQlJdGVyYXRvcjw/PiBzZWxlY3RlZEVsZW1lbnRzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLml0ZXJhdG9yKCk7CisJCQlpZiAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsKKwkJCQkvLyBHZXQgdGhlIGZpcnN0IHNlbGVjdGVkIGVsZW1lbnQuCisJCQkJLy8KKwkJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCk7CisKKwkJCQkvLyBJZiBpdCdzIHRoZSBzZWxlY3Rpb24gdmlld2VyLCB0aGVuIHdlIHdhbnQgaXQgdG8gc2VsZWN0IHRoZSBzYW1lIHNlbGVjdGlvbiBhcyB0aGlzIHNlbGVjdGlvbi4KKwkJCQkvLworCQkJCWlmIChjdXJyZW50Vmlld2VyUGFuZS5nZXRWaWV3ZXIoKSA9PSBzZWxlY3Rpb25WaWV3ZXIpIHsKKwkJCQkJQXJyYXlMaXN0PE9iamVjdD4gc2VsZWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCQkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnQpOworCQkJCQl3aGlsZSAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsKKwkJCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudHMubmV4dCgpKTsKKwkJCQkJfQorCisJCQkJCS8vIFNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSB3aWRnZXQuCisJCQkJCS8vCisJCQkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uTGlzdCkpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJLy8gU2V0IHRoZSBpbnB1dCB0byB0aGUgd2lkZ2V0LgorCQkJCQkvLworCQkJCQlpZiAoY3VycmVudFZpZXdlclBhbmUuZ2V0Vmlld2VyKCkuZ2V0SW5wdXQoKSAhPSBzZWxlY3RlZEVsZW1lbnQpIHsKKwkJCQkJCWN1cnJlbnRWaWV3ZXJQYW5lLmdldFZpZXdlcigpLnNldElucHV0KHNlbGVjdGVkRWxlbWVudCk7CisJCQkJCQljdXJyZW50Vmlld2VyUGFuZS5zZXRUaXRsZShzZWxlY3RlZEVsZW1lbnQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSB0ZXN0cyB0aGUgY29tbWFuZCBzdGFjay4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgeworCQlyZXR1cm4gKChCYXNpY0NvbW1hbmRTdGFjayllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5pc1NhdmVOZWVkZWQoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHNhdmVzIHRoZSBtb2RlbCBmaWxlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworCQkvLyBTYXZlIG9ubHkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBhY3R1YWxseSBjaGFuZ2VkLgorCQkvLworCQlmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7CisJCXNhdmVPcHRpb25zLnB1dChSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRUQsIFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRF9NRU1PUllfQlVGRkVSKTsKKworCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guCisJCS8vCisJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPQorCQkJbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKKwkJCQkvLyBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBnZXRzIGludm9rZWQgd2hlbiB0aGUgb3BlcmF0aW9uIHJ1bnMuCisJCQkJLy8KKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJCQkvLyBTYXZlIHRoZSByZXNvdXJjZXMgdG8gdGhlIGZpbGUgc3lzdGVtLgorCQkJCQkvLworCQkJCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwkJCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSkgeworCQkJCQkJaWYgKChmaXJzdCB8fCAhcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkgfHwgaXNQZXJzaXN0ZWQocmVzb3VyY2UpKSAmJiAhZWRpdGluZ0RvbWFpbi5pc1JlYWRPbmx5KHJlc291cmNlKSkgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCWxvbmcgdGltZVN0YW1wID0gcmVzb3VyY2UuZ2V0VGltZVN0YW1wKCk7CisJCQkJCQkJCXJlc291cmNlLnNhdmUoc2F2ZU9wdGlvbnMpOworCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VGltZVN0YW1wKCkgIT0gdGltZVN0YW1wKSB7CisJCQkJCQkJCQlzYXZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQkJCQkJCX0KKwkJCQkJCQlmaXJzdCA9IGZhbHNlOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfTsKKworCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOworCQl0cnkgeworCQkJLy8gVGhpcyBydW5zIHRoZSBvcHRpb25zLCBhbmQgc2hvd3MgcHJvZ3Jlc3MuCisJCQkvLworCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSkucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOworCisJCQkvLyBSZWZyZXNoIHRoZSBuZWNlc3Nhcnkgc3RhdGUuCisJCQkvLworCQkJKChCYXNpY0NvbW1hbmRTdGFjayllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5zYXZlSXNEb25lKCk7CisJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCS8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHRoYXQgc2hvdWxkbid0LgorCQkJLy8KKwkJCU11bHRpcG9wdWxhdGlvbkVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHdoZXRoZXIgc29tZXRoaW5nIGhhcyBiZWVuIHBlcnNpc3RlZCB0byB0aGUgVVJJIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisJICogVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIFVSSSBjb252ZXJ0ZXIgZnJvbSB0aGUgZWRpdG9yJ3MgcmVzb3VyY2Ugc2V0IHRvIHRyeSB0byBvcGVuIGFuIGlucHV0IHN0cmVhbS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNQZXJzaXN0ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbShyZXNvdXJjZS5nZXRVUkkoKSk7CisJCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKKwkJCQlyZXN1bHQgPSB0cnVlOworCQkJCXN0cmVhbS5jbG9zZSgpOworCQkJfQorCQl9CisJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBJZ25vcmUKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgdHJ1ZSBiZWNhdXNlIGl0IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogVGhpcyBhbHNvIGNoYW5nZXMgdGhlIGVkaXRvcidzIGlucHV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgeworCQlTYXZlQXNEaWFsb2cgc2F2ZUFzRGlhbG9nID0gbmV3IFNhdmVBc0RpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7CisJCXNhdmVBc0RpYWxvZy5vcGVuKCk7CisJCUlQYXRoIHBhdGggPSBzYXZlQXNEaWFsb2cuZ2V0UmVzdWx0KCk7CisJCWlmIChwYXRoICE9IG51bGwpIHsKKwkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7CisJCQlpZiAoZmlsZSAhPSBudWxsKSB7CisJCQkJZG9TYXZlQXMoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpLCBuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGRvU2F2ZUFzKFVSSSB1cmksIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgeworCQkoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSkuc2V0VVJJKHVyaSk7CisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7CisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7CisJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0KKwkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpICE9IG51bGwgPworCQkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpIDoKKwkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworCQlkb1NhdmUocHJvZ3Jlc3NNb25pdG9yKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7CisJCXRyeSB7CisJCQlpZiAobWFya2VyLmdldFR5cGUoKS5lcXVhbHMoRVZhbGlkYXRvci5NQVJLRVIpKSB7CisJCQkJU3RyaW5nIHVyaUF0dHJpYnV0ZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoRVZhbGlkYXRvci5VUklfQVRUUklCVVRFLCBudWxsKTsKKwkJCQlpZiAodXJpQXR0cmlidXRlICE9IG51bGwpIHsKKwkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpQXR0cmlidXRlKTsKKwkJCQkJRU9iamVjdCBlT2JqZWN0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldEVPYmplY3QodXJpLCB0cnVlKTsKKwkJCQkJaWYgKGVPYmplY3QgIT0gbnVsbCkgeworCQkJCQkgIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zLnNpbmdsZXRvbihlZGl0aW5nRG9tYWluLmdldFdyYXBwZXIoZU9iamVjdCkpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCU11bHRpcG9wdWxhdGlvbkVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBzdGFydHVwLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisJCXNldFNpdGUoc2l0ZSk7CisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7CisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7CisJCXNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7CisJCXNpdGUuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCWlmIChjdXJyZW50Vmlld2VyUGFuZSAhPSBudWxsKSB7CisJCQljdXJyZW50Vmlld2VyUGFuZS5zZXRGb2N1cygpOworCQl9CisJCWVsc2UgeworCQkJZ2V0Q29udHJvbChnZXRBY3RpdmVQYWdlKCkpLnNldEZvY3VzKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHJldHVybiB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKKwkJcmV0dXJuIGVkaXRvclNlbGVjdGlvbjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byBzZXQgdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4KKwkgKiBDYWxsaW5nIHRoaXMgcmVzdWx0IHdpbGwgbm90aWZ5IHRoZSBsaXN0ZW5lcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWVkaXRvclNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKworCQlmb3IgKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgOiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzKSB7CisJCQlsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7CisJCX0KKwkJc2V0U3RhdHVzTGluZU1hbmFnZXIoc2VsZWN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXNMaW5lTWFuYWdlcihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBjdXJyZW50Vmlld2VyICE9IG51bGwgJiYgY3VycmVudFZpZXdlciA9PSBjb250ZW50T3V0bGluZVZpZXdlciA/CisJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyIDogZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7CisKKwkJaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJCUNvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS50b0xpc3QoKTsKKwkJCQlzd2l0Y2ggKGNvbGxlY3Rpb24uc2l6ZSgpKSB7CisJCQkJCWNhc2UgMDogeworCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9Ob09iamVjdFNlbGVjdGVkIikpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAxOiB7CisJCQkJCQlTdHJpbmcgdGV4dCA9IG5ldyBBZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3IoYWRhcHRlckZhY3RvcnkpLmdldFRleHQoY29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkIiwgdGV4dCkpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZGVmYXVsdDogeworCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9NdWx0aU9iamVjdFNlbGVjdGVkIiwgSW50ZWdlci50b1N0cmluZyhjb2xsZWN0aW9uLnNpemUoKSkpKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZSgiIik7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHRoZSBwbHVnaW4ncyBwbHVnaW4ucHJvcGVydGllcyBmaWxlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQlyZXR1cm4gTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXkpOworCX0KKworCS8qKgorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gcGx1Z2luLnByb3BlcnRpZXMsIG1ha2luZyBhIHN1YnN0aXR1dGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgeworCQlyZXR1cm4gTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXksIG5ldyBPYmplY3QgW10geyBzMSB9KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyfSB0byBoZWxwIGZpbGwgdGhlIGNvbnRleHQgbWVudXMgd2l0aCBjb250cmlidXRpb25zIGZyb20gdGhlIEVkaXQgbWVudS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCSgoSU1lbnVMaXN0ZW5lcilnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSkubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgeworCQlyZXR1cm4gKEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcilnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsKKwkJcmV0dXJuIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aW9uQmFycygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisKKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7CisKKwkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKKworCQlhZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7CisKKwkJaWYgKGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gdGhpcykgeworCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IobnVsbCk7CisJCX0KKworCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgeworCQkJcHJvcGVydHlTaGVldFBhZ2UuZGlzcG9zZSgpOworCQl9CisKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7CisJCQljb250ZW50T3V0bGluZVBhZ2UuZGlzcG9zZSgpOworCQl9CisKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgb3V0bGluZSB2aWV3IHNob3VsZCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd091dGxpbmVWaWV3KCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3ByZXNlbnRhdGlvbi9NdWx0aXBvcHVsYXRpb25FZGl0b3JQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJlc2VudGF0aW9uL011bHRpcG9wdWxhdGlvbkVkaXRvclBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NTNjMjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3ByZXNlbnRhdGlvbi9NdWx0aXBvcHVsYXRpb25FZGl0b3JQbHVnaW4uamF2YQpAQCAtMCwwICsxLDEyNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuRWNsaXBzZVVJUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUVkaXRQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcm92aWRlci5EZWZpbml0aW9uc0VkaXRQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuRGlzZWFzZW1vZGVsc0VkaXRQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RhbmRhcmRFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5TdGFuZGFyZERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CisKKy8qKgorICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBNdWx0aXBvcHVsYXRpb24gZWRpdG9yIHBsdWdpbi4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE11bHRpcG9wdWxhdGlvbkVkaXRvclBsdWdpbiBleHRlbmRzIEVNRlBsdWdpbiB7CisJLyoqCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luIElOU1RBTkNFID0gbmV3IE11bHRpcG9wdWxhdGlvbkVkaXRvclBsdWdpbigpOworCQorCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNdWx0aXBvcHVsYXRpb25FZGl0b3JQbHVnaW4oKSB7CisJCXN1cGVyCisJCQkobmV3IFJlc291cmNlTG9jYXRvciBbXSB7CisJCQkJRGlzZWFzZW1vZGVsc0VkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCQkJQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCQkJRWNvcmVFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkJCURlZmluaXRpb25zRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJCQlTdGFuZGFyZEVkaXRQbHVnaW4uSU5TVEFOQ0UsCisJCQl9KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCQorCS8qKgorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVVJUGx1Z2luIHsKKwkJLyoqCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7CisJCQlzdXBlcigpOworCQorCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4KKwkJCS8vCisJCQlwbHVnaW4gPSB0aGlzOworCQl9CisJCQorCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQkJc3VwZXIuc3RhcnQoY29udGV4dCk7CisJCQluZXcgTXVsdGlQb3B1bGF0aW9uRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeSgpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3ByZXNlbnRhdGlvbi9NdWx0aXBvcHVsYXRpb25Nb2RlbFdpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi9wcmVzZW50YXRpb24vTXVsdGlwb3B1bGF0aW9uTW9kZWxXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzY0ZTczCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL211bHRpcG9wdWxhdGlvbi9wcmVzZW50YXRpb24vTXVsdGlwb3B1bGF0aW9uTW9kZWxXaXphcmQuamF2YQpAQCAtMCwwICsxLDYzNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNldFNlbGVjdGlvblRhcmdldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlwb3B1bGF0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpcG9wdWxhdGlvblBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5wcm92aWRlci5NdWx0aXBvcHVsYXRpb25FZGl0UGx1Z2luOworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworCisKKy8qKgorICogVGhpcyBpcyBhIHNpbXBsZSB3aXphcmQgZm9yIGNyZWF0aW5nIGEgbmV3IG1vZGVsIGZpbGUuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aXBvcHVsYXRpb25Nb2RlbFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgeworCS8qKgorCSAqIFRoZSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyBmb3IgY3JlYXRlZCBmaWxlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBGSUxFX0VYVEVOU0lPTlMgPQorCQlDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX011bHRpcG9wdWxhdGlvbkVkaXRvckZpbGVuYW1lRXh0ZW5zaW9ucyIpLnNwbGl0KCJcXHMqLFxccyoiKSkpOworCisJLyoqCisJICogQSBmb3JtYXR0ZWQgbGlzdCBvZiBzdXBwb3J0ZWQgZmlsZSBleHRlbnNpb25zLCBzdWl0YWJsZSBmb3IgZGlzcGxheS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURURfRklMRV9FWFRFTlNJT05TID0KKwkJTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX011bHRpcG9wdWxhdGlvbkVkaXRvckZpbGVuYW1lRXh0ZW5zaW9ucyIpLnJlcGxhY2VBbGwoIlxccyosXFxzKiIsICIsICIpOworCisJLyoqCisJICogVGhpcyBjYWNoZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE11bHRpcG9wdWxhdGlvblBhY2thZ2UgbXVsdGlwb3B1bGF0aW9uUGFja2FnZSA9IE11bHRpcG9wdWxhdGlvblBhY2thZ2UuZUlOU1RBTkNFOworCisJLyoqCisJICogVGhpcyBjYWNoZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE11bHRpcG9wdWxhdGlvbkZhY3RvcnkgbXVsdGlwb3B1bGF0aW9uRmFjdG9yeSA9IG11bHRpcG9wdWxhdGlvblBhY2thZ2UuZ2V0TXVsdGlwb3B1bGF0aW9uRmFjdG9yeSgpOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgZmlsZSBjcmVhdGlvbiBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNdWx0aXBvcHVsYXRpb25Nb2RlbFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgbmV3RmlsZUNyZWF0aW9uUGFnZTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGluaXRpYWwgb2JqZWN0IGNyZWF0aW9uIHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE11bHRpcG9wdWxhdGlvbk1vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSBpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlOworCisJLyoqCisJICogUmVtZW1iZXIgdGhlIHNlbGVjdGlvbiBkdXJpbmcgaW5pdGlhbGl6YXRpb24gZm9yIHBvcHVsYXRpbmcgdGhlIGRlZmF1bHQgY29udGFpbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247CisKKwkvKioKKwkgKiBSZW1lbWJlciB0aGUgd29ya2JlbmNoIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVdvcmtiZW5jaCB3b3JrYmVuY2g7CisKKwkvKioKKwkgKiBDYWNoZXMgdGhlIG5hbWVzIG9mIHRoZSB0eXBlcyB0aGF0IGNhbiBiZSBjcmVhdGVkIGFzIHRoZSByb290IG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGluaXRpYWxPYmplY3ROYW1lczsKKworCS8qKgorCSAqIFRoaXMganVzdCByZWNvcmRzIHRoZSBpbmZvcm1hdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7CisJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOworCQlzZXRXaW5kb3dUaXRsZShNdWx0aXBvcHVsYXRpb25FZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV2l6YXJkX2xhYmVsIikpOworCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihFeHRlbmRlZEltYWdlUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0SW1hZ2VEZXNjcmlwdG9yKE11bHRpcG9wdWxhdGlvbkVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC93aXpiYW4vTmV3TXVsdGlwb3B1bGF0aW9uIikpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgdHlwZXMgdGhhdCBjYW4gYmUgY3JlYXRlZCBhcyB0aGUgcm9vdCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbml0aWFsT2JqZWN0TmFtZXMoKSB7CisJCWlmIChpbml0aWFsT2JqZWN0TmFtZXMgPT0gbnVsbCkgeworCQkJaW5pdGlhbE9iamVjdE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQlmb3IgKEVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyIDogbXVsdGlwb3B1bGF0aW9uUGFja2FnZS5nZXRFQ2xhc3NpZmllcnMoKSkgeworCQkJCWlmIChlQ2xhc3NpZmllciBpbnN0YW5jZW9mIEVDbGFzcykgeworCQkJCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcyllQ2xhc3NpZmllcjsKKwkJCQkJaWYgKCFlQ2xhc3MuaXNBYnN0cmFjdCgpKSB7CisJCQkJCQlpbml0aWFsT2JqZWN0TmFtZXMuYWRkKGVDbGFzcy5nZXROYW1lKCkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJQ29sbGVjdGlvbnMuc29ydChpbml0aWFsT2JqZWN0TmFtZXMsIENvbW1vblBsdWdpbi5JTlNUQU5DRS5nZXRDb21wYXJhdG9yKCkpOworCQl9CisJCXJldHVybiBpbml0aWFsT2JqZWN0TmFtZXM7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBFT2JqZWN0IGNyZWF0ZUluaXRpYWxNb2RlbCgpIHsKKwkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpbXVsdGlwb3B1bGF0aW9uUGFja2FnZS5nZXRFQ2xhc3NpZmllcihpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlLmdldEluaXRpYWxPYmplY3ROYW1lKCkpOworCQlFT2JqZWN0IHJvb3RPYmplY3QgPSBtdWx0aXBvcHVsYXRpb25GYWN0b3J5LmNyZWF0ZShlQ2xhc3MpOworCQlyZXR1cm4gcm9vdE9iamVjdDsKKwl9CisKKwkvKioKKwkgKiBEbyB0aGUgd29yayBhZnRlciBldmVyeXRoaW5nIGlzIHNwZWNpZmllZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgeworCQl0cnkgeworCQkJLy8gUmVtZW1iZXIgdGhlIGZpbGUuCisJCQkvLworCQkJZmluYWwgSUZpbGUgbW9kZWxGaWxlID0gZ2V0TW9kZWxGaWxlKCk7CisKKwkJCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24uCisJCQkvLworCQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9CisJCQkJbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJLy8gQ3JlYXRlIGEgcmVzb3VyY2Ugc2V0CisJCQkJCQkJLy8KKwkJCQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKKworCQkJCQkJCS8vIEdldCB0aGUgVVJJIG9mIHRoZSBtb2RlbCBmaWxlLgorCQkJCQkJCS8vCisJCQkJCQkJVVJJIGZpbGVVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShtb2RlbEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKTsKKworCQkJCQkJCS8vIENyZWF0ZSBhIHJlc291cmNlIGZvciB0aGlzIGZpbGUuCisJCQkJCQkJLy8KKwkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKGZpbGVVUkkpOworCisJCQkJCQkJLy8gQWRkIHRoZSBpbml0aWFsIG1vZGVsIG9iamVjdCB0byB0aGUgY29udGVudHMuCisJCQkJCQkJLy8KKwkJCQkJCQlFT2JqZWN0IHJvb3RPYmplY3QgPSBjcmVhdGVJbml0aWFsTW9kZWwoKTsKKwkJCQkJCQlpZiAocm9vdE9iamVjdCAhPSBudWxsKSB7CisJCQkJCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHJvb3RPYmplY3QpOworCQkJCQkJCX0KKworCQkJCQkJCS8vIFNhdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSByZXNvdXJjZSB0byB0aGUgZmlsZSBzeXN0ZW0uCisJCQkJCQkJLy8KKwkJCQkJCQlNYXA8T2JqZWN0LCBPYmplY3Q+IG9wdGlvbnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKKwkJCQkJCQlvcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsIGluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UuZ2V0RW5jb2RpbmcoKSk7CisJCQkJCQkJcmVzb3VyY2Uuc2F2ZShvcHRpb25zKTsKKwkJCQkJCX0KKwkJCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQkJTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCQkJfQorCQkJCQkJZmluYWxseSB7CisJCQkJCQkJcHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX07CisKKwkJCWdldENvbnRhaW5lcigpLnJ1bihmYWxzZSwgZmFsc2UsIG9wZXJhdGlvbik7CisKKwkJCS8vIFNlbGVjdCB0aGUgbmV3IGZpbGUgcmVzb3VyY2UgaW4gdGhlIGN1cnJlbnQgdmlldy4KKwkJCS8vCisJCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKKwkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOworCQkJZmluYWwgSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydCA9IHBhZ2UuZ2V0QWN0aXZlUGFydCgpOworCQkJaWYgKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KSB7CisJCQkJZmluYWwgSVNlbGVjdGlvbiB0YXJnZXRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb2RlbEZpbGUpOworCQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkgKChJU2V0U2VsZWN0aW9uVGFyZ2V0KWFjdGl2ZVBhcnQpLnNlbGVjdFJldmVhbCh0YXJnZXRTZWxlY3Rpb24pOworCQkJCQkJIH0KKwkJCQkJIH0pOworCQkJfQorCisJCQkvLyBPcGVuIGFuIGVkaXRvciBvbiB0aGUgbmV3IGZpbGUuCisJCQkvLworCQkJdHJ5IHsKKwkJCQlwYWdlLm9wZW5FZGl0b3IKKwkJCQkJKG5ldyBGaWxlRWRpdG9ySW5wdXQobW9kZWxGaWxlKSwKKwkJCQkJIHdvcmtiZW5jaC5nZXRFZGl0b3JSZWdpc3RyeSgpLmdldERlZmF1bHRFZGl0b3IobW9kZWxGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkuZ2V0SWQoKSk7CisJCQl9CisJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Iod29ya2JlbmNoV2luZG93LmdldFNoZWxsKCksIE11bHRpcG9wdWxhdGlvbkVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9PcGVuRWRpdG9yRXJyb3JfbGFiZWwiKSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgb25lIHBhZ2Ugb2YgdGhlIHdpemFyZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgY2xhc3MgTXVsdGlwb3B1bGF0aW9uTW9kZWxXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSB7CisJCS8qKgorCQkgKiBQYXNzIGluIHRoZSBzZWxlY3Rpb24uCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgTXVsdGlwb3B1bGF0aW9uTW9kZWxXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlKFN0cmluZyBwYWdlSWQsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQkJc3VwZXIocGFnZUlkLCBzZWxlY3Rpb24pOworCQl9CisKKwkJLyoqCisJCSAqIFRoZSBmcmFtZXdvcmsgY2FsbHMgdGhpcyB0byBzZWUgaWYgdGhlIGZpbGUgaXMgY29ycmVjdC4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7CisJCQlpZiAoc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsKKwkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gbmV3IFBhdGgoZ2V0RmlsZU5hbWUoKSkuZ2V0RmlsZUV4dGVuc2lvbigpOworCQkJCWlmIChleHRlbnNpb24gPT0gbnVsbCB8fCAhRklMRV9FWFRFTlNJT05TLmNvbnRhaW5zKGV4dGVuc2lvbikpIHsKKwkJCQkJU3RyaW5nIGtleSA9IEZJTEVfRVhURU5TSU9OUy5zaXplKCkgPiAxID8gIl9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9ucyIgOiAiX1dBUk5fRmlsZW5hbWVFeHRlbnNpb24iOworCQkJCQlzZXRFcnJvck1lc3NhZ2UoTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXksIG5ldyBPYmplY3QgW10geyBGT1JNQVRURURfRklMRV9FWFRFTlNJT05TIH0pKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIElGaWxlIGdldE1vZGVsRmlsZSgpIHsKKwkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5hcHBlbmQoZ2V0RmlsZU5hbWUoKSkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgcGFnZSB3aGVyZSB0aGUgdHlwZSBvZiBvYmplY3QgdG8gY3JlYXRlIGlzIHNlbGVjdGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBjbGFzcyBNdWx0aXBvcHVsYXRpb25Nb2RlbFdpemFyZEluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwcm90ZWN0ZWQgQ29tYm8gaW5pdGlhbE9iamVjdEZpZWxkOworCisJCS8qKgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKi8KKwkJcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBlbmNvZGluZ3M7CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwcm90ZWN0ZWQgQ29tYm8gZW5jb2RpbmdGaWVsZDsKKworCQkvKioKKwkJICogUGFzcyBpbiB0aGUgc2VsZWN0aW9uLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIE11bHRpcG9wdWxhdGlvbk1vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZShTdHJpbmcgcGFnZUlkKSB7CisJCQlzdXBlcihwYWdlSWQpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOyB7CisJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQkJCWxheW91dC5udW1Db2x1bW5zID0gMTsKKwkJCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTI7CisJCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7CisJCQl9CisKKwkJCUxhYmVsIGNvbnRhaW5lckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOworCQkJeworCQkJCWNvbnRhaW5lckxhYmVsLnNldFRleHQoTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX01vZGVsT2JqZWN0IikpOworCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJY29udGFpbmVyTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCX0KKworCQkJaW5pdGlhbE9iamVjdEZpZWxkID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJCQl7CisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJCQlpbml0aWFsT2JqZWN0RmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCX0KKworCQkJZm9yIChTdHJpbmcgb2JqZWN0TmFtZSA6IGdldEluaXRpYWxPYmplY3ROYW1lcygpKSB7CisJCQkJaW5pdGlhbE9iamVjdEZpZWxkLmFkZChnZXRMYWJlbChvYmplY3ROYW1lKSk7CisJCQl9CisKKwkJCWlmIChpbml0aWFsT2JqZWN0RmllbGQuZ2V0SXRlbUNvdW50KCkgPT0gMSkgeworCQkJCWluaXRpYWxPYmplY3RGaWVsZC5zZWxlY3QoMCk7CisJCQl9CisJCQlpbml0aWFsT2JqZWN0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodmFsaWRhdG9yKTsKKworCQkJTGFiZWwgZW5jb2RpbmdMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKKwkJCXsKKwkJCQllbmNvZGluZ0xhYmVsLnNldFRleHQoTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1hNTEVuY29kaW5nIikpOworCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJZW5jb2RpbmdMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJfQorCQkJZW5jb2RpbmdGaWVsZCA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5CT1JERVIpOworCQkJeworCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCQkJZW5jb2RpbmdGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJfQorCisJCQlmb3IgKFN0cmluZyBlbmNvZGluZyA6IGdldEVuY29kaW5ncygpKSB7CisJCQkJZW5jb2RpbmdGaWVsZC5hZGQoZW5jb2RpbmcpOworCQkJfQorCisJCQllbmNvZGluZ0ZpZWxkLnNlbGVjdCgwKTsKKwkJCWVuY29kaW5nRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodmFsaWRhdG9yKTsKKworCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKKwkJCXNldENvbnRyb2woY29tcG9zaXRlKTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIHZhbGlkYXRvciA9CisJCQluZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisJCQkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7CisJCQkJfQorCQkJfTsKKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKKwkJCXJldHVybiBnZXRJbml0aWFsT2JqZWN0TmFtZSgpICE9IG51bGwgJiYgZ2V0RW5jb2RpbmdzKCkuY29udGFpbnMoZW5jb2RpbmdGaWVsZC5nZXRUZXh0KCkpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKwkJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7CisJCQlpZiAodmlzaWJsZSkgeworCQkJCWlmIChpbml0aWFsT2JqZWN0RmllbGQuZ2V0SXRlbUNvdW50KCkgPT0gMSkgeworCQkJCQlpbml0aWFsT2JqZWN0RmllbGQuY2xlYXJTZWxlY3Rpb24oKTsKKwkJCQkJZW5jb2RpbmdGaWVsZC5zZXRGb2N1cygpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJZW5jb2RpbmdGaWVsZC5jbGVhclNlbGVjdGlvbigpOworCQkJCQlpbml0aWFsT2JqZWN0RmllbGQuc2V0Rm9jdXMoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbE9iamVjdE5hbWUoKSB7CisJCQlTdHJpbmcgbGFiZWwgPSBpbml0aWFsT2JqZWN0RmllbGQuZ2V0VGV4dCgpOworCisJCQlmb3IgKFN0cmluZyBuYW1lIDogZ2V0SW5pdGlhbE9iamVjdE5hbWVzKCkpIHsKKwkJCQlpZiAoZ2V0TGFiZWwobmFtZSkuZXF1YWxzKGxhYmVsKSkgeworCQkJCQlyZXR1cm4gbmFtZTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKKwkJCXJldHVybiBlbmNvZGluZ0ZpZWxkLmdldFRleHQoKTsKKwkJfQorCisJCS8qKgorCQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIG5hbWUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKFN0cmluZyB0eXBlTmFtZSkgeworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gTXVsdGlwb3B1bGF0aW9uRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV8iICsgdHlwZU5hbWUgKyAiX3R5cGUiKTsKKwkJCX0KKwkJCWNhdGNoKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUpIHsKKwkJCQlNdWx0aXBvcHVsYXRpb25FZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKG1yZSk7CisJCQl9CisJCQlyZXR1cm4gdHlwZU5hbWU7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0RW5jb2RpbmdzKCkgeworCQkJaWYgKGVuY29kaW5ncyA9PSBudWxsKSB7CisJCQkJZW5jb2RpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihNdWx0aXBvcHVsYXRpb25FZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfWE1MRW5jb2RpbmdDaG9pY2VzIikpOyBzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpOyApIHsKKwkJCQkJZW5jb2RpbmdzLmFkZChzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCkpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBlbmNvZGluZ3M7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGUgZnJhbWV3b3JrIGNhbGxzIHRoaXMgdG8gY3JlYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgd2l6YXJkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCQlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKKwkJLy8gQ3JlYXRlIGEgcGFnZSwgc2V0IHRoZSB0aXRsZSwgYW5kIHRoZSBpbml0aWFsIG1vZGVsIGZpbGUgbmFtZS4KKwkJLy8KKwkJbmV3RmlsZUNyZWF0aW9uUGFnZSA9IG5ldyBNdWx0aXBvcHVsYXRpb25Nb2RlbFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UoIldoYXRldmVyIiwgc2VsZWN0aW9uKTsKKwkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXRUaXRsZShNdWx0aXBvcHVsYXRpb25FZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfTXVsdGlwb3B1bGF0aW9uTW9kZWxXaXphcmRfbGFiZWwiKSk7CisJCW5ld0ZpbGVDcmVhdGlvblBhZ2Uuc2V0RGVzY3JpcHRpb24oTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX011bHRpcG9wdWxhdGlvbk1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uIikpOworCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldEZpbGVOYW1lKE11bHRpcG9wdWxhdGlvbkVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9NdWx0aXBvcHVsYXRpb25FZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlIikgKyAiLiIgKyBGSUxFX0VYVEVOU0lPTlMuZ2V0KDApKTsKKwkJYWRkUGFnZShuZXdGaWxlQ3JlYXRpb25QYWdlKTsKKworCQkvLyBUcnkgYW5kIGdldCB0aGUgcmVzb3VyY2Ugc2VsZWN0aW9uIHRvIGRldGVybWluZSBhIGN1cnJlbnQgZGlyZWN0b3J5IGZvciB0aGUgZmlsZSBkaWFsb2cuCisJCS8vCisJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgeworCQkJLy8gR2V0IHRoZSByZXNvdXJjZS4uLgorCQkJLy8KKwkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCk7CisJCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7CisJCQkJLy8gR2V0IHRoZSByZXNvdXJjZSBwYXJlbnQsIGlmIGl0cyBhIGZpbGUuCisJCQkJLy8KKwkJCQlJUmVzb3VyY2Ugc2VsZWN0ZWRSZXNvdXJjZSA9IChJUmVzb3VyY2Upc2VsZWN0ZWRFbGVtZW50OworCQkJCWlmIChzZWxlY3RlZFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgeworCQkJCQlzZWxlY3RlZFJlc291cmNlID0gc2VsZWN0ZWRSZXNvdXJjZS5nZXRQYXJlbnQoKTsKKwkJCQl9CisKKwkJCQkvLyBUaGlzIGdpdmVzIHVzIGEgZGlyZWN0b3J5Li4uCisJCQkJLy8KKwkJCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIgfHwgc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CisJCQkJCS8vIFNldCB0aGlzIGZvciB0aGUgY29udGFpbmVyLgorCQkJCQkvLworCQkJCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldENvbnRhaW5lckZ1bGxQYXRoKHNlbGVjdGVkUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7CisKKwkJCQkJLy8gTWFrZSB1cCBhIHVuaXF1ZSBuZXcgbmFtZSBoZXJlLgorCQkJCQkvLworCQkJCQlTdHJpbmcgZGVmYXVsdE1vZGVsQmFzZUZpbGVuYW1lID0gTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX011bHRpcG9wdWxhdGlvbkVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2UiKTsKKwkJCQkJU3RyaW5nIGRlZmF1bHRNb2RlbEZpbGVuYW1lRXh0ZW5zaW9uID0gRklMRV9FWFRFTlNJT05TLmdldCgwKTsKKwkJCQkJU3RyaW5nIG1vZGVsRmlsZW5hbWUgPSBkZWZhdWx0TW9kZWxCYXNlRmlsZW5hbWUgKyAiLiIgKyBkZWZhdWx0TW9kZWxGaWxlbmFtZUV4dGVuc2lvbjsKKwkJCQkJZm9yIChpbnQgaSA9IDE7ICgoSUNvbnRhaW5lcilzZWxlY3RlZFJlc291cmNlKS5maW5kTWVtYmVyKG1vZGVsRmlsZW5hbWUpICE9IG51bGw7ICsraSkgeworCQkJCQkJbW9kZWxGaWxlbmFtZSA9IGRlZmF1bHRNb2RlbEJhc2VGaWxlbmFtZSArIGkgKyAiLiIgKyBkZWZhdWx0TW9kZWxGaWxlbmFtZUV4dGVuc2lvbjsKKwkJCQkJfQorCQkJCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldEZpbGVOYW1lKG1vZGVsRmlsZW5hbWUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlID0gbmV3IE11bHRpcG9wdWxhdGlvbk1vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSgiV2hhdGV2ZXIyIik7CisJCWluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2Uuc2V0VGl0bGUoTXVsdGlwb3B1bGF0aW9uRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX011bHRpcG9wdWxhdGlvbk1vZGVsV2l6YXJkX2xhYmVsIikpOworCQlpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlLnNldERlc2NyaXB0aW9uKE11bHRpcG9wdWxhdGlvbkVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb24iKSk7CisJCWFkZFBhZ2UoaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBmaWxlIGZyb20gdGhlIHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElGaWxlIGdldE1vZGVsRmlsZSgpIHsKKwkJcmV0dXJuIG5ld0ZpbGVDcmVhdGlvblBhZ2UuZ2V0TW9kZWxGaWxlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3ByZXNlbnRhdGlvbi9tdWx0aXBvcHVsYXRpb25kaXNlYXNlbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vcHJlc2VudGF0aW9uL211bHRpcG9wdWxhdGlvbmRpc2Vhc2VtZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMmUzNGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL3ByZXNlbnRhdGlvbi9tdWx0aXBvcHVsYXRpb25kaXNlYXNlbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDcgQEAKK3BvcHVsYXRpb25Hcm91cHMgPSBQb3B1bGF0aW9uIEdyb3VwcworcG9wdWxhdGlvbkdyb3Vwc1VOSVQgPSAKK3BvcHVsYXRpb25Hcm91cHNUVCA9IAorCitSRUNPVkVSWV9SQVRFX0lOVkFMSUQgPSAgSW52YWxpZCB2YWx1ZSBmb3IgcmVjb3ZlcnkgcmF0ZQorUEhZU19BREpfSU5WQUxJRCA9ICBJbnZhbGlkIHZhbHVlIGZvciBQaHlzaWNhbCBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb24KK1JPQURfTkVUX0lOVkFMSUQgPSBJbnZhbGlkIHZhbHVlIGZvciBSb2FkIE5ldHdvcmsgSW5mZWN0aW91cyBQcm9wb3J0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL2FkYXB0ZXJzL011bHRpRGlzZWFzZU5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvbXVsdGlwb3B1bGF0aW9uL2FkYXB0ZXJzL011bHRpRGlzZWFzZU5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwNmM2YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24vc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZGlzZWFzZW1vZGVscy9tdWx0aXBvcHVsYXRpb24vYWRhcHRlcnMvTXVsdGlEaXNlYXNlTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLy8gRGlzZWFzZU5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi5hZGFwdGVyczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uLk11bHRpcG9wdWxhdGlvblBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbi51dGlsLk11bHRpcG9wdWxhdGlvbkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudXRpbC5TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubmV3bW9kaWZpZXJwYWdlLk5ld01vZGlmaWVyUGFnZUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5uZXdtb2RpZmllcnBhZ2UuTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLlN0YW5kYXJkRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLkRpc2Vhc2VXaXphcmRNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3TW9kaWZpZXJQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdGFydHVwOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4ge0BsaW5rIE5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5fSB0aGF0IGFkYXB0cworICoge0BsaW5rIERpc2Vhc2VNb2RlbH1zIHRvIHtAbGluayBOZXdNb2RpZmllclBhZ2V9cy4KKyAqLworcHVibGljIGNsYXNzIE11bHRpRGlzZWFzZU5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKKwkJTXVsdGlwb3B1bGF0aW9uQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeSwgSVN0YXJ0dXAgeworCisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgTXVsdGlEaXNlYXNlTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJCU5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkZEFkYXB0ZXJGYWN0b3J5KHRoaXMpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXAjZWFybHlTdGFydHVwKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBlYXJseVN0YXJ0dXAoKSB7CisJCS8vIE5vdGhpbmcgdG8gZG8gdGhlIGNvbnN0cnVjdG9yIHdpbGwgZG8gZXZlcnl0aGluZy4JCQorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLnV0aWwuU2NlbmFyaW9BZGFwdGVyRmFjdG9yeSNpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShmaW5hbCBPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gdHlwZSA9PSBOZXdNb2RpZmllclBhZ2VBZGFwdGVyLmNsYXNzIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CisJfQorCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgTXVsdGlEaXNlYXNlTmV3TW9kaWZpZXJQYWdlQWRhcHRlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU11bHRpUG9wdWxhdGlvblNJUkRpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgTXVsdGlEaXNlYXNlTmV3TW9kaWZpZXJQYWdlQWRhcHRlcigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNdWx0aVBvcHVsYXRpb25TRUlSRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBNdWx0aURpc2Vhc2VOZXdNb2RpZmllclBhZ2VBZGFwdGVyKCk7CisJfQorCQorCS8qKgorCSAqIFRoaXMgY2xhc3MgYWRhcHRzIHtAbGluayBEaXNlYXNlTW9kZWx9cyB0byB7QGxpbmsgTmV3TW9kaWZpZXJQYWdlfXMKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBNdWx0aURpc2Vhc2VOZXdNb2RpZmllclBhZ2VBZGFwdGVyIGV4dGVuZHMKKwkJCU5ld01vZGlmaWVyUGFnZUFkYXB0ZXIgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubmV3bW9kaWZpZXJwYWdlLk5ld01vZGlmaWVyUGFnZUFkYXB0ZXIjY3JlYXRlTmV3TW9kaWZpZXJQYWdlKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgTmV3TW9kaWZpZXJQYWdlIGNyZWF0ZU5ld01vZGlmaWVyUGFnZSgpIHsKKwkJCXJldHVybiBuZXcgTmV3TW9kaWZpZXJQYWdlKChJZGVudGlmaWFibGUpIGdldFRhcmdldCgpKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNVc2VyU3BlY2lmaWVkUHJvcGVydHkoCisJCQkJCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQkJCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisJCQkJCWZpbmFsIEVDbGFzcyBjb250YWluaW5nQ2xhc3MgPSBmZWF0dXJlLmdldEVDb250YWluaW5nQ2xhc3MoKTsKKwkJCQkJLy8gSXMgaXQgYSBkaXNlYXNlIG1vZGVsIHByb3BlcnR5PworCQkJCQlpZiAoY29udGFpbmluZ0NsYXNzLmVxdWFscyhNdWx0aXBvcHVsYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbCgpKQorCQkJCQkJCXx8IGNvbnRhaW5pbmdDbGFzcy5nZXRFQWxsU3VwZXJUeXBlcygpLmNvbnRhaW5zKAorCQkJCQkJCQkJTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWwoKSkpIHsKKwkJCQkJCQorCQkJCQkJaWYoZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSA9PSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lfRElTRUFTRV9NT0RFTF9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURSB8fAorCQkJCQkJCQlmZWF0dXJlLmdldEZlYXR1cmVJRCgpID09IE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0dST1VQUyB8fAorCQkJCQkJCQlmZWF0dXJlLmdldEZlYXR1cmVJRCgpID09IE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TSV9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFIHx8CisJCQkJCQkJCWZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgPT0gTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJX0RJU0VBU0VfTU9ERUxfX1RSQU5TTUlTU0lPTl9SQVRFIHx8CisJCQkJCQkJCWZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgPT0gTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19JTU1VTklUWV9MT1NTX1JBVEUgfHwKKwkJCQkJCQkJZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSA9PSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUgfHwKKwkJCQkJCQkJZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSA9PSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0lSX0RJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTIHx8CisJCQkJCQkJCWZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgPT0gTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19SRUNPVkVSWV9SQVRFIHx8CisJCQkJCQkJCWZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgPT0gTXVsdGlwb3B1bGF0aW9uUGFja2FnZS5NVUxUSV9QT1BVTEFUSU9OX1NJUl9ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURSB8fAorCQkJCQkJCQlmZWF0dXJlLmdldEZlYXR1cmVJRCgpID09IE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0lNTVVOSVRZX0xPU1NfUkFURSB8fAorCQkJCQkJCQlmZWF0dXJlLmdldEZlYXR1cmVJRCgpID09IE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0lOQ1VCQVRJT05fUkFURSB8fAorCQkJCQkJCQlmZWF0dXJlLmdldEZlYXR1cmVJRCgpID09IE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUgfHwKKwkJCQkJCQkJZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSA9PSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0dST1VQUyB8fAorCQkJCQkJCQlmZWF0dXJlLmdldEZlYXR1cmVJRCgpID09IE11bHRpcG9wdWxhdGlvblBhY2thZ2UuTVVMVElfUE9QVUxBVElPTl9TRUlSX0RJU0VBU0VfTU9ERUxfX1JFQ09WRVJZX1JBVEUgfHwKKwkJCQkJCQkJZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSA9PSBNdWx0aXBvcHVsYXRpb25QYWNrYWdlLk1VTFRJX1BPUFVMQVRJT05fU0VJUl9ESVNFQVNFX01PREVMX19UUkFOU01JU1NJT05fUkFURSkKKwkJCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGxpc3QgYW5kIG1hdHJpY2VzIGNhbid0IGJlIG1vZGlmaWVkIGhlcmUKKwkJCQkJCQorCQkJCQkJLy8gWWVzCisJCQkJCQlyZXRWYWx1ZSA9IHRydWU7CisJCQkJCX0gLy8gaWYgYSBkaXNlYXNlIG1vZGVsIHByb3BlcnR5CisJCQkJCXJldHVybiByZXRWYWx1ZTsKKwkJCQl9IC8vIGlzVXNlclNwZWNpZmllZFByb3BlcnR5CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJvdHRvbVRleHQoKSB7CisJCQkJCXJldHVybiBEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJQTVRQX0RlZiIpOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBib29sZWFuIGlzTW9kaWZpYWJsZVByb3BlcnR5KAorCQkJCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJCQkJYm9vbGVhbiByZXRWYWx1ZSA9IHN1cGVyLmlzTW9kaWZpYWJsZVByb3BlcnR5KGZlYXR1cmUpOworCisJCQkJCXJldHVybiByZXRWYWx1ZTsKKwkJCQl9IC8vIGlzTW9kaWZpYWJsZVByb3BlcnR5CisJCQl9OworCQl9IC8vIGNyZWF0ZU5ld01vZGlmaWVyUGFnZQorCisJfSAvLyBNdWx0aURpc2Vhc2VOZXdNb2RpZmllclBhZ2VBZGFwdGVyCisKK30gLy8gTXVsdGlEaXNlYXNlTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZTg2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmN2FlYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHM8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjNDljZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw2OSBAQAorI01vbiBKYW4gMjEgMTI6NTE6MzMgRVNUIDIwMDgKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmNhYTUwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTAsMCArMSw1MCBAQAorI1dlZCBPY3QgMjQgMTQ6MTQ6NTUgRURUIDIwMDcKK2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD10cnVlCitjbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitjbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9dHJ1ZQorY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9dHJ1ZQorY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQorY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCitjbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQorY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCitjbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQorY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCitjbGVhbnVwLnVzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKK2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorY2xlYW51cF9wcm9maWxlPV9jbGVhbnVwCitjbGVhbnVwX3NldHRpbmdzX3ZlcnNpb249MgorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWI4NjkzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMjMgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHM7c2luZ2xldG9uOj10cnVlCitCdW5kbGUtVmVyc2lvbjogMS4wLjEucXVhbGlmaWVyCitCdW5kbGUtQ2xhc3NQYXRoOiAuCitCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJlc2VudGF0aW9uLkRpc2Vhc2Vtb2RlbHNFZGl0b3JQbHVnaW4kSW1wbGVtZW50YXRpb24KK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcmVzZW50YXRpb24sCisgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5kaXNlYXNlbW9kZWxwcm9wZXJ0eWVkaXRvciwKKyBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLm5ld21vZGlmaWVycGFnZSwKKyBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMKK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS51aSwKKyBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LAorIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvciwKKyBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLAorIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0LAorIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscywKKyBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MDUxZTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE2IEBACisjIDxjb3B5cmlnaHQ+CisjIDwvY29weXJpZ2h0PgorIworIyAkSWQkCisKK2Jpbi5pbmNsdWRlcyA9IC4sXAorICAgICAgICAgICAgICAgaWNvbnMvLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIGJpbi8sXAorICAgICAgICAgICAgICAgbm90aWNlLmh0bWwsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuCitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YjE5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9lcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwzMjggQEAKKzxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKK3htbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCit4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Cis8bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Cis8bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KKzxsaW5rIHJlbD1GaWxlLUxpc3QKK2hyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgorPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Cis8IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8bzpEb2N1bWVudFByb3BlcnRpZXM+CisgIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+CisgIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KKyAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgorICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgorICA8bzpQYWdlcz40PC9vOlBhZ2VzPgorICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgorICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KKyAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgorICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+CisgIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgorICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgorIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Cis8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KKyA8dzpXb3JkRG9jdW1lbnQ+CisgIDx3OlRyYWNrUmV2aXNpb25zLz4KKyA8L3c6V29yZERvY3VtZW50PgorPC94bWw+PCFbZW5kaWZdLS0+Cis8c3R5bGU+Cis8IS0tCisgLyogRm9udCBEZWZpbml0aW9ucyAqLworQGZvbnQtZmFjZQorCXtmb250LWZhbWlseTpUYWhvbWE7CisJcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7CisJbXNvLWZvbnQtY2hhcnNldDowOworCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOworCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOworCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQorIC8qIFN0eWxlIERlZmluaXRpb25zICovCitwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCisJe21zby1zdHlsZS1wYXJlbnQ6IiI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorcAorCXttYXJnaW4tcmlnaHQ6MGluOworCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOworCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOworCW1hcmdpbi1sZWZ0OjBpbjsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0CisJe21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOworCW1hcmdpbjowaW47CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6OC4wcHQ7CisJZm9udC1mYW1pbHk6VGFob21hOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK0BwYWdlIFNlY3Rpb24xCisJe3NpemU6OC41aW4gMTEuMGluOworCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOworCW1zby1oZWFkZXItbWFyZ2luOi41aW47CisJbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKKwltc28tcGFwZXItc291cmNlOjA7fQorZGl2LlNlY3Rpb24xCisJe3BhZ2U6U2VjdGlvbjE7fQorLS0+Cis8L3N0eWxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+CisKKzxkaXYgY2xhc3M9U2VjdGlvbjE+CisKKzxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KKzwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgorVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKK1JFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQorT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2luIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCitkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+CitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2NoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCitzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCitieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKK2lmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCitzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKK1Byb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgord2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQord29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCitlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50CitjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQorb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKK2Rpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCityZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAorYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCitzdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQorZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQorU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cworUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKK3BhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKK2FuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQorY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KK29mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCitieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgordG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bworYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQorUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cworQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKK3RoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAorZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAorbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKK3RvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCitpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCit0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCitkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKK0VhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0CityaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCit0aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgorPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKK2VmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKK2NvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKK2FuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5CithbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQorZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKK2luY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKK2FzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQorc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAorQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQorc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAoraW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQorY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKK2NvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKK2NvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQorb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKK3N1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKK2FjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKK2FuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCitvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKK2xpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCitDb250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgorQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCitjb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCitsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwordGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgorY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKK29mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcworcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCit0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCit0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAorYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKK2luIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAord2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKK3NlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQorb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQorY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKK0FHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKK1dBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCitXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCitNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQorcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKK1Byb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKK0FncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKK2NvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCitlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCitPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKK1RIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKK1RIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCitvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0CitmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQorbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KK2FnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKK290aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQorc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAorc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQorcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKK3JpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKK2NvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50CitTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKK3RoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCit0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCitBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bworc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KKyhpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKK2V4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKK2V4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQorU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgorQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCitBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCitpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KKworPC9kaXY+CisKKzwvYm9keT4KKworPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L0RlY29yYXRvci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdXN0b20xNi9EZWNvcmF0b3IuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMzc2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC9jdXN0b20xNi9EZWNvcmF0b3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L2Rpc2Vhc2UuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvZGlzZWFzZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0MDRlNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L2Rpc2Vhc2UuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L2luZmVjdG9yLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L2luZmVjdG9yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWJiNjg2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvaW5mZWN0b3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L3JlY29yZGVkY3N2LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL2N1c3RvbTE2L3JlY29yZGVkY3N2LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjE2MjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvcmVjb3JkZWRjc3YuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L1N0YW5kYXJkTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL29iajE2L1N0YW5kYXJkTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWUyZjhjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvU3RhbmRhcmRNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9pY29ucy9mdWxsL3dpemJhbi9OZXdTdGFuZGFyZC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC93aXpiYW4vTmV3U3RhbmRhcmQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZjMxMmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvaWNvbnMvZnVsbC93aXpiYW4vTmV3U3RhbmRhcmQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9ub3RpY2UuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9ub3RpY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFmOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL25vdGljZS5odG1sCkBAIC0wLDAgKzEsNzkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+TWFyY2ggMTcsIDIwMDU8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorICAgCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCisgICAKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUworICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisgICAKKzx1bD4KKwk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4gICAKKyAKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKwk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCQkKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKwk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKKwk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorICAgCis8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTA5NDY5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3BsdWdpbi5wcm9wZXJ0aWVzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlODdkMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsMjEyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgorCis8IS0tCisgPGNvcHlyaWdodD4KKyA8L2NvcHlyaWdodD4KKworICRJZCQKKy0tPgorCis8cGx1Z2luPgorCisKKyAgPGV4dGVuc2lvbgorICAgIHBvaW50ID0gIm9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgorICAgIDx3aXphcmQKKyAgICAgIGlkID0gIm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcmVzZW50YXRpb24uU3RhbmRhcmRNb2RlbFdpemFyZElEIgorICAgICAgbmFtZSA9ICIlX1VJX1N0YW5kYXJkTW9kZWxXaXphcmRfbGFiZWwiCisgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJlc2VudGF0aW9uLlN0YW5kYXJkTW9kZWxXaXphcmQiCisgICAgICBjYXRlZ29yeSA9ICJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuV2l6YXJkLmNhdGVnb3J5LklEIgorICAgICAgaWNvbiA9ICJpY29ucy9mdWxsL29iajE2L1N0YW5kYXJkTW9kZWxGaWxlLmdpZiI+CisgICAgICA8ZGVzY3JpcHRpb24+JV9VSV9TdGFuZGFyZE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxzZWxlY3Rpb24gY2xhc3MgPSAib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPgorICAgIDwvd2l6YXJkPgorICAgIDx3aXphcmQKKyAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLnN0ZW1jYXRlZ29yeSIKKyAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0Rpc2Vhc2VXaXphcmQiCisgICAgICAgICAgaGFzUGFnZXM9InRydWUiCisgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9TdGFuZGFyZE1vZGVsRmlsZS5naWYiCisgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcmVzZW50YXRpb24uU3RhbmRhcmRNb2RlbFdpemFyZElEIgorICAgICAgICAgIG5hbWU9IiVfVUlfRGlzZWFzZSIvPgorICAgIDx3aXphcmQKKyAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLnN0ZW1jYXRlZ29yeSIKKyAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0luZmVjdG9yV2l6YXJkIgorICAgICAgICAgIGhhc1BhZ2VzPSJ0cnVlIgorICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvU3RhbmRhcmRNb2RlbEZpbGUuZ2lmIgorICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJlc2VudGF0aW9uLlN0YW5kYXJkTW9kZWxJbmZlY3RvcklEIgorICAgICAgICAgIG5hbWU9IiVfVUlfSW5mZWN0b3IiLz4KKyAgPC9leHRlbnNpb24+CisKKyAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KKyAgICA8ZWRpdG9yCisgICAgICAgIGlkID0gIm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcmVzZW50YXRpb24uU3RhbmRhcmRFZGl0b3JJRCIKKyAgICAgICAgbmFtZSA9ICIlX1VJX1N0YW5kYXJkRWRpdG9yX2xhYmVsIgorICAgICAgICBpY29uID0gImljb25zL2Z1bGwvY3VzdG9tMTYvRGVjb3JhdG9yLmdpZiIKKyAgICAgICAgZXh0ZW5zaW9ucyA9ICJzdGFuZGFyZCIKKyAgICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByZXNlbnRhdGlvbi5TdGFuZGFyZEVkaXRvciIgCisgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcmVzZW50YXRpb24uU3RhbmRhcmRBY3Rpb25CYXJDb250cmlidXRvciIgPgorICAgIDwvZWRpdG9yPgorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgorICAgICA8dmlldworICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cyIKKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZGlzZWFzZS5EaXNlYXNlVmlldyIKKyAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdXN0b20xNi9kaXNlYXNlLmdpZiIKKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZGlzZWFzZXMiCisgICAgICAgICAgIG5hbWU9IiVfVUlfRFZpZXdfTmFtZSIvPgorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KKyAgICAgPHBlcnNwZWN0aXZlRXh0ZW5zaW9uIHRhcmdldElEPSJvcmcuZWNsaXBzZS5zdGVtLnVpLlNURU1EZXNpZ25lclBlcnNwZWN0aXZlIj4KKyAgICAgICAgPHZpZXcKKyAgICAgICAgICAgICAgY2xvc2VhYmxlPSJ0cnVlIgorICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5kaXNlYXNlcyIKKyAgICAgICAgICAgICAgbW92ZWFibGU9InRydWUiCisgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD0ic3RhY2siCisgICAgICAgICAgICAgIHJlbGF0aXZlPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmRlY29yYXRvcnMiCisgICAgICAgICAgICAgIHNob3dUaXRsZT0idHJ1ZSIKKyAgICAgICAgICAgICAgc3RhbmRhbG9uZT0idHJ1ZSIKKyAgICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSIvPgorICAgICAgICA8dmlld1Nob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmRpc2Vhc2VzIi8+CisgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+CisgIDwvZXh0ZW5zaW9uPgorICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5zdGFydHVwIj4KKyAgICAgPHN0YXJ0dXAKKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubmV3bW9kaWZpZXJwYWdlLkRpc2Vhc2VOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeSI+PC9zdGFydHVwPgorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICBsb2NhdGlvblVSST0ibWVudTpvcmcuZWNsaXBzZS5zdGVtLnVpLm1lbnUubmV3d2l6YXJkcz9hZnRlcj1hZGRpdGlvbnMiPgorICAgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5jb21tYW5kLndpei5kaXNlYXNlIgorICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbTE2L2Rpc2Vhc2UuZ2lmIgorICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9EaXNlYXNlTW9kZWxXaXphcmRfbGFiZWwiCisgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgorICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX01vZGVsTW9kZWxXaXphcmRfZGVzY3JpcHRpb24iPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmNvbW1hbmQud2l6LmluZmVjdG9yIgorICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbTE2L2luZmVjdG9yLmdpZiIKKyAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfSW5mZWN0b3JXaXphcmRfbGFiZWwiCisgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgorICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX0luZmVjdG9yV2l6YXJkX2Rlc2NyaXB0aW9uIj4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICA8L21lbnVDb250cmlidXRpb24+CisgICAgIDxtZW51Q29udHJpYnV0aW9uCisgICAgICAgICAgIGxvY2F0aW9uVVJJPSJ0b29sYmFyOm9yZy5lY2xpcHNlLnN0ZW0udWkudG9vbGJhci5uZXd3aXphcmRzP2FmdGVyPWFkZGl0aW9ucyI+CisgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmNvbW1hbmQud2l6LmRpc2Vhc2UiCisgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tMTYvZGlzZWFzZS5naWYiCisgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0Rpc2Vhc2VNb2RlbFdpemFyZF9sYWJlbCIKKyAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfTW9kZWxNb2RlbFdpemFyZF9kZXNjcmlwdGlvbiI+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuY29tbWFuZC53aXouaW5mZWN0b3IiCisgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tMTYvaW5mZWN0b3IuZ2lmIgorICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9JbmZlY3RvcldpemFyZF9sYWJlbCIKKyAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfSW5mZWN0b3JXaXphcmRfZGVzY3JpcHRpb24iPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KKyAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdEaXNlYXNlV2l6YXJkJE5ld0Rpc2Vhc2VXaXphcmRDb21tYW5kSGFuZGxlciIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IiVfVUlfTW9kZWxNb2RlbFdpemFyZF9kZXNjcmlwdGlvbiIKKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5jb21tYW5kLndpei5kaXNlYXNlIgorICAgICAgICAgICBuYW1lPSIlX1VJX0Rpc2Vhc2VNb2RlbFdpemFyZF9sYWJlbCI+CisgICAgIDwvY29tbWFuZD4KKyAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJbmZlY3RvcldpemFyZCROZXdJbmZlY3RvcldpemFyZENvbW1hbmRIYW5kbGVyIgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iJV9VSV9JbmZlY3RvcldpemFyZF9kZXNjcmlwdGlvbiIKKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5jb21tYW5kLndpei5pbmZlY3RvciIKKyAgICAgICAgICAgbmFtZT0iJV9VSV9JbmZlY3RvcldpemFyZF9sYWJlbCI+CisgICAgIDwvY29tbWFuZD4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29sb3Jwcm92aWRlcnMiPgorICAgICA8Y29sb3Byb3ZpZGVyCisgICAgICAgICAgIGZhY3Rvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuSW50ZW5zaXR5Q29sb3JzTGFiZWxzTWFwcGluZ0NvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKKyAgICAgICAgICAgbmFtZT0iTGFiZWxzIENvbG9ycyBNYXBwaW5nIgorICAgICAgICAgICBwcm92aWRlcj0ib3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5JbnRlbnNpdHlDb2xvcnNMYWJlbHNNYXBwaW5nQ29sb3JQcm92aWRlciI+CisgICAgIDwvY29sb3Byb3ZpZGVyPgorICAgICA8Y29sb3Byb3ZpZGVyCisgICAgICAgICAgIGZhY3Rvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuU0VJUlJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCisgICAgICAgICAgIG5hbWU9IiZxdW90O1JhaW5ib3cmcXVvdDsgUmVsYXRpdmUgVmFsdWVzIgorICAgICAgICAgICBwcm92aWRlcj0ib3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5TRUlSUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXIiPgorICAgICA8L2NvbG9wcm92aWRlcj4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXIiPgorICAgICAgICA8dmlld2VyCisgICAgICAgICAgIHZpZXdlcklkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIj4KKyAgICAgPC92aWV3ZXI+CisgICAgIDx2aWV3ZXJDb250ZW50QmluZGluZworICAgICAgICAgICB2aWV3ZXJJZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciI+CisgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgCisgICAgICAgICAgIAorICAgICAgICAgICA8Y29udGVudEV4dGVuc2lvbgorICAgICAgICAgICAgICAgICBwYXR0ZXJuPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLnJlY29yZGVkY3N2aW5zdGFuY2VzIj4KKyAgICAgICAgICAgPC9jb250ZW50RXh0ZW5zaW9uPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICA8L3ZpZXdlckNvbnRlbnRCaW5kaW5nPgorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLm5hdmlnYXRvckNvbnRlbnQiPgorICAgICA8bmF2aWdhdG9yQ29udGVudAorICAgICAgICAgICBjb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuRGlzZWFzZU1vZGVsVHJlZU5vZGVDb250ZW50UHJvdmlkZXIiCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLmRpc2Vhc2Vtb2RlbHMiCisgICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuRGlzZWFzZU1vZGVsVHJlZU5vZGVMYWJlbFByb3ZpZGVyIgorICAgICAgICAgICBuYW1lPSIlX1VJX0Rpc2Vhc2VfTW9kZWxzIj4KKyAgICAgICAgPHRyaWdnZXJQb2ludHM+CisgICAgICAgICAgIDxhZGFwdAorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+CisgICAgICAgICAgIDwvYWRhcHQ+CisgICAgICAgIDwvdHJpZ2dlclBvaW50cz4KKyAgICAgICAgPHBvc3NpYmxlQ2hpbGRyZW4+CisgICAgICAgICAgIDxpbnN0YW5jZW9mCisgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZVRyZWVOb2RlIj4KKyAgICAgICAgICAgPC9pbnN0YW5jZW9mPgorICAgICAgICA8L3Bvc3NpYmxlQ2hpbGRyZW4+CisgICAgIDwvbmF2aWdhdG9yQ29udGVudD4KKyAgICAgPG5hdmlnYXRvckNvbnRlbnQKKyAgICAgICAgICAgY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLkRpc2Vhc2VNb2RlbEluc3RhbmNlVHJlZU5vZGVDb250ZW50UHJvdmlkZXIiCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLmRpc2Vhc2Vtb2RlbHNpbnN0YW5jZXMiCisgICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuRGlzZWFzZU1vZGVsSW5zdGFuY2VUcmVlTm9kZUxhYmVsUHJvdmlkZXIiCisgICAgICAgICAgIG5hbWU9IiVfVUlfRE1fSW5zdGFuY2VzIj4KKyAgICAgICAgPHRyaWdnZXJQb2ludHM+CisgICAgICAgICAgIDxhZGFwdAorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLkRpc2Vhc2VNb2RlbFRyZWVOb2RlIj4KKyAgICAgICAgICAgPC9hZGFwdD4KKyAgICAgICAgPC90cmlnZ2VyUG9pbnRzPgorICAgICAgICA8cG9zc2libGVDaGlsZHJlbj4KKyAgICAgICAgICAgPGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlVHJlZU5vZGUiPgorICAgICAgICAgICA8L2luc3RhbmNlb2Y+CisgICAgICAgIDwvcG9zc2libGVDaGlsZHJlbj4KKyAgICAgPC9uYXZpZ2F0b3JDb250ZW50PgorICAgICA8bmF2aWdhdG9yQ29udGVudAorICAgICAgICAgICBjb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuUmVjb3JkZWRDU1ZJbnN0YW5jZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5yZWNvcmRlZGNzdmluc3RhbmNlcyIKKyAgICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5SZWNvcmRlZENTVkluc3RhbmNlVHJlZU5vZGVMYWJlbFByb3ZpZGVyIgorICAgICAgICAgICBuYW1lPSIlX1VJX1JlY29yZGVkX0NTViAiPgorICAgICAgICA8dHJpZ2dlclBvaW50cz4KKyAgICAgICAgICAgPGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuUmVjb3JkZWRUcmVlTm9kZSI+CisgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KKyAgICAgICAgPC90cmlnZ2VyUG9pbnRzPgorICAgICAgICA8cG9zc2libGVDaGlsZHJlbj4KKyAgICAgICAgICAgPGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuUmVjb3JkZWRDU1ZJbnN0YW5jZVRyZWVOb2RlIj4KKyAgICAgICAgICAgPC9pbnN0YW5jZW9mPgorICAgICAgICA8L3Bvc3NpYmxlQ2hpbGRyZW4+CisgICAgIDwvbmF2aWdhdG9yQ29udGVudD4KKyAgPC9leHRlbnNpb24+ICAgIAorPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcmVzZW50YXRpb24vRGlzZWFzZW1vZGVsc0VkaXRvckFkdmlzb3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3ByZXNlbnRhdGlvbi9EaXNlYXNlbW9kZWxzRWRpdG9yQWR2aXNvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMTc0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcmVzZW50YXRpb24vRGlzZWFzZW1vZGVsc0VkaXRvckFkdmlzb3IuamF2YQpAQCAtMCwwICsxLDU5NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLmFjdGlvbi5Xb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJlc2VudGF0aW9uLkRpc2Vhc2Vtb2RlbHNFZGl0b3JQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcmVzZW50YXRpb24uQ29tbW9uRWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcmVzZW50YXRpb24uR3JhcGhFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByZXNlbnRhdGlvbi5Nb2RlbEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJlc2VudGF0aW9uLlNjZW5hcmlvRWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnByZXNlbnRhdGlvbi5MYWJlbHNFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkdyb3VwTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZvbGRlckxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQ29udHJpYnV0aW9uSXRlbUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uQWN0aW9uQmFyQWR2aXNvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JQWN0aW9uQmFyQ29uZmlndXJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoQ29uZmlndXJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoV2luZG93Q29uZmlndXJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaFdpbmRvd0Fkdmlzb3I7CisKKworLyoqCisgKiBDdXN0b21pemVkIHtAbGluayBXb3JrYmVuY2hBZHZpc29yfSBmb3IgdGhlIFJDUCBhcHBsaWNhdGlvbi4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERpc2Vhc2Vtb2RlbHNFZGl0b3JBZHZpc29yIGV4dGVuZHMgV29ya2JlbmNoQWR2aXNvciB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgZmlsZSBleHRlbnNpb24gZmlsdGVycyBmb3IgdXNlIGluIGRpYWxvZ3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRklMRV9FWFRFTlNJT05fRklMVEVSUyA9IGdldEZpbGVFeHRlbnNpb25GaWx0ZXJzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGZpbGUgZXh0ZW5zaW9uIGZpbHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgI0ZJTEVfRVhURU5TSU9OX0ZJTFRFUlN9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRGaWxlRXh0ZW5zaW9uRmlsdGVycygpIHsKKwkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBVbmlxdWVFTGlzdDxTdHJpbmc+KCk7CisJCXJlc3VsdC5hZGRBbGwoU3RhbmRhcmRFZGl0b3IuRklMRV9FWFRFTlNJT05fRklMVEVSUyk7CisJCXJldHVybiByZXN1bHQudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHRoZSBwbHVnaW4ncyBwbHVnaW4ucHJvcGVydGllcyBmaWxlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQlyZXR1cm4gRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHBsdWdpbi5wcm9wZXJ0aWVzLCBtYWtpbmcgYSBzdWJzdGl0dXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcmVzZW50YXRpb24uRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5LCBuZXcgT2JqZWN0IFtdIHsgczEgfSk7CisJfQorCisJLyoqCisJICogUkNQJ3MgYXBwbGljYXRpb24KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEFwcGxpY2F0aW9uIGltcGxlbWVudHMgSUFwcGxpY2F0aW9uIHsKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uI3N0YXJ0KG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQpCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgT2JqZWN0IHN0YXJ0KElBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQlXb3JrYmVuY2hBZHZpc29yIHdvcmtiZW5jaEFkdmlzb3IgPSBuZXcgRGlzZWFzZW1vZGVsc0VkaXRvckFkdmlzb3IoKTsKKwkJCURpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuY3JlYXRlRGlzcGxheSgpOworCQkJdHJ5IHsKKwkJCQlpbnQgcmV0dXJuQ29kZSA9IFBsYXRmb3JtVUkuY3JlYXRlQW5kUnVuV29ya2JlbmNoKGRpc3BsYXksIHdvcmtiZW5jaEFkdmlzb3IpOworCQkJCWlmIChyZXR1cm5Db2RlID09IFBsYXRmb3JtVUkuUkVUVVJOX1JFU1RBUlQpIHsKKwkJCQkJcmV0dXJuIElBcHBsaWNhdGlvbi5FWElUX1JFU1RBUlQ7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlyZXR1cm4gSUFwcGxpY2F0aW9uLkVYSVRfT0s7CisJCQkJfQorCQkJfQorCQkJZmluYWxseSB7CisJCQkJZGlzcGxheS5kaXNwb3NlKCk7CisJCQl9CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb24jc3RvcCgpCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgdm9pZCBzdG9wKCkgeworCQkJLy8gRG8gbm90aGluZy4KKwkJfQorCX0KKworCS8qKgorCSAqIFJDUCdzIHBlcnNwZWN0aXZlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBQZXJzcGVjdGl2ZSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgeworCQkvKioKKwkJICogUGVyc3BlY3RpdmUgSUQKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1BFUlNQRUNUSVZFID0gIm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcmVzZW50YXRpb24uRGlzZWFzZW1vZGVsc0VkaXRvckFkdmlzb3JQZXJzcGVjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5I2NyZWF0ZUluaXRpYWxMYXlvdXQob3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQpCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgeworCQkJbGF5b3V0LnNldEVkaXRvckFyZWFWaXNpYmxlKHRydWUpOworCQkJbGF5b3V0LmFkZFBlcnNwZWN0aXZlU2hvcnRjdXQoSURfUEVSU1BFQ1RJVkUpOworCisJCQlJRm9sZGVyTGF5b3V0IHJpZ2h0ID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigicmlnaHQiLCBJUGFnZUxheW91dC5SSUdIVCwgKGZsb2F0KTAuNjYsIGxheW91dC5nZXRFZGl0b3JBcmVhKCkpOyAvLyROT04tTkxTLTEkCisJCQlyaWdodC5hZGRWaWV3KElQYWdlTGF5b3V0LklEX09VVExJTkUpOworCisJCQlJRm9sZGVyTGF5b3V0IGJvdHRvblJpZ2h0ID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigiYm90dG9uUmlnaHQiLCBJUGFnZUxheW91dC5CT1RUT00sIChmbG9hdCkwLjYwLCAicmlnaHQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlib3R0b25SaWdodC5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1BST1BfU0hFRVQpOworCQl9CisJfQorCQorCS8qKgorCSAqIFJDUCdzIHdpbmRvdyBhZHZpc29yCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBXaW5kb3dBZHZpc29yIGV4dGVuZHMgV29ya2JlbmNoV2luZG93QWR2aXNvciB7CisJCS8qKgorCQkgKiBAc2VlIFdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IjV29ya2JlbmNoV2luZG93QWR2aXNvcihvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoV2luZG93Q29uZmlndXJlcikKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBXaW5kb3dBZHZpc29yKElXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKKwkJCXN1cGVyKGNvbmZpZ3VyZXIpOworCQl9CisJCQorCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hXaW5kb3dBZHZpc29yI3ByZVdpbmRvd09wZW4oKQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHByZVdpbmRvd09wZW4oKSB7CisJCQlJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyID0gZ2V0V2luZG93Q29uZmlndXJlcigpOworCQkJY29uZmlndXJlci5zZXRJbml0aWFsU2l6ZShuZXcgUG9pbnQoNjAwLCA0NTApKTsKKwkJCWNvbmZpZ3VyZXIuc2V0U2hvd0Nvb2xCYXIoZmFsc2UpOworCQkJY29uZmlndXJlci5zZXRTaG93U3RhdHVzTGluZSh0cnVlKTsKKwkJCWNvbmZpZ3VyZXIuc2V0VGl0bGUoZ2V0U3RyaW5nKCJfVUlfQXBwbGljYXRpb25fdGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQkKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoV2luZG93QWR2aXNvciNjcmVhdGVBY3Rpb25CYXJBZHZpc29yKG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklBY3Rpb25CYXJDb25maWd1cmVyKQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBY3Rpb25CYXJBZHZpc29yIGNyZWF0ZUFjdGlvbkJhckFkdmlzb3IoSUFjdGlvbkJhckNvbmZpZ3VyZXIgY29uZmlndXJlcikgeworCQkJcmV0dXJuIG5ldyBXaW5kb3dBY3Rpb25CYXJBZHZpc29yKGNvbmZpZ3VyZXIpOworCQl9CisJfQorCisJLyoqCisJICogUkNQJ3MgYWN0aW9uIGJhciBhZHZpc29yCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBXaW5kb3dBY3Rpb25CYXJBZHZpc29yIGV4dGVuZHMgQWN0aW9uQmFyQWR2aXNvciB7CisJCS8qKgorCQkgKiBAc2VlIEFjdGlvbkJhckFkdmlzb3IjQWN0aW9uQmFyQWR2aXNvcihvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JQWN0aW9uQmFyQ29uZmlndXJlcikKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBXaW5kb3dBY3Rpb25CYXJBZHZpc29yKElBY3Rpb25CYXJDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKKwkJCXN1cGVyKGNvbmZpZ3VyZXIpOworCQl9CisJCQorCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5BY3Rpb25CYXJBZHZpc29yI2ZpbGxNZW51QmFyKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZmlsbE1lbnVCYXIoSU1lbnVNYW5hZ2VyIG1lbnVCYXIpIHsKKwkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gZ2V0QWN0aW9uQmFyQ29uZmlndXJlcigpLmdldFdpbmRvd0NvbmZpZ3VyZXIoKS5nZXRXaW5kb3coKTsKKwkJCW1lbnVCYXIuYWRkKGNyZWF0ZUZpbGVNZW51KHdpbmRvdykpOworCQkJbWVudUJhci5hZGQoY3JlYXRlRWRpdE1lbnUod2luZG93KSk7CisJCQltZW51QmFyLmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKwkJCW1lbnVCYXIuYWRkKGNyZWF0ZVdpbmRvd01lbnUod2luZG93KSk7CisJCQltZW51QmFyLmFkZChjcmVhdGVIZWxwTWVudSh3aW5kb3cpKTsJCQkJCQorCQl9CisJCQorCQkvKioKKwkJICogQ3JlYXRlcyB0aGUgJ0ZpbGUnIG1lbnUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZUZpbGVNZW51KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7CisJCQlJTWVudU1hbmFnZXIgbWVudSA9IG5ldyBNZW51TWFuYWdlcihnZXRTdHJpbmcoIl9VSV9NZW51X0ZpbGVfbGFiZWwiKSwgLy8kTk9OLU5MUy0xJAorCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0ZJTEUpOyAgICAKKwkJCW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkZJTEVfU1RBUlQpKTsKKwkKKwkJCUlNZW51TWFuYWdlciBuZXdNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKGdldFN0cmluZygiX1VJX01lbnVfTmV3X2xhYmVsIiksICJuZXciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQluZXdNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKwkKKwkJCW1lbnUuYWRkKG5ld01lbnUpOworCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKKwkJCW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOworCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKKwkJCWFkZFRvTWVudUFuZFJlZ2lzdGVyKG1lbnUsIEFjdGlvbkZhY3RvcnkuQ0xPU0UuY3JlYXRlKHdpbmRvdykpOworCQkJYWRkVG9NZW51QW5kUmVnaXN0ZXIobWVudSwgQWN0aW9uRmFjdG9yeS5DTE9TRV9BTEwuY3JlYXRlKHdpbmRvdykpOworCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKKwkJCWFkZFRvTWVudUFuZFJlZ2lzdGVyKG1lbnUsIEFjdGlvbkZhY3RvcnkuU0FWRS5jcmVhdGUod2luZG93KSk7CisJCQlhZGRUb01lbnVBbmRSZWdpc3RlcihtZW51LCBBY3Rpb25GYWN0b3J5LlNBVkVfQVMuY3JlYXRlKHdpbmRvdykpOworCQkJYWRkVG9NZW51QW5kUmVnaXN0ZXIobWVudSwgQWN0aW9uRmFjdG9yeS5TQVZFX0FMTC5jcmVhdGUod2luZG93KSk7CisJCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQkJYWRkVG9NZW51QW5kUmVnaXN0ZXIobWVudSwgQWN0aW9uRmFjdG9yeS5RVUlULmNyZWF0ZSh3aW5kb3cpKTsKKwkJCW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkZJTEVfRU5EKSk7CisJCQlyZXR1cm4gbWVudTsKKwkJfQorCisJCS8qKgorCQkgKiBDcmVhdGVzIHRoZSAnRWRpdCcgbWVudS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlRWRpdE1lbnUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKKwkJCUlNZW51TWFuYWdlciBtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKGdldFN0cmluZygiX1VJX01lbnVfRWRpdF9sYWJlbCIpLCAvLyROT04tTkxTLTEkCisJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCk7CisJCQltZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5FRElUX1NUQVJUKSk7CisJCisJCQlhZGRUb01lbnVBbmRSZWdpc3RlcihtZW51LCBBY3Rpb25GYWN0b3J5LlVORE8uY3JlYXRlKHdpbmRvdykpOworCQkJYWRkVG9NZW51QW5kUmVnaXN0ZXIobWVudSwgQWN0aW9uRmFjdG9yeS5SRURPLmNyZWF0ZSh3aW5kb3cpKTsKKwkJCW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlVORE9fRVhUKSk7CisJCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQorCQkJYWRkVG9NZW51QW5kUmVnaXN0ZXIobWVudSwgQWN0aW9uRmFjdG9yeS5DVVQuY3JlYXRlKHdpbmRvdykpOworCQkJYWRkVG9NZW51QW5kUmVnaXN0ZXIobWVudSwgQWN0aW9uRmFjdG9yeS5DT1BZLmNyZWF0ZSh3aW5kb3cpKTsKKwkJCWFkZFRvTWVudUFuZFJlZ2lzdGVyKG1lbnUsIEFjdGlvbkZhY3RvcnkuUEFTVEUuY3JlYXRlKHdpbmRvdykpOworCQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ1VUX0VYVCkpOworCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKKwkKKwkJCWFkZFRvTWVudUFuZFJlZ2lzdGVyKG1lbnUsIEFjdGlvbkZhY3RvcnkuREVMRVRFLmNyZWF0ZSh3aW5kb3cpKTsKKwkJCWFkZFRvTWVudUFuZFJlZ2lzdGVyKG1lbnUsIEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5jcmVhdGUod2luZG93KSk7CisJCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQorCQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQUREX0VYVCkpOworCQorCQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuRURJVF9FTkQpKTsKKwkJCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKwkJCXJldHVybiBtZW51OworCQl9CisJCisJCS8qKgorCQkgKiBDcmVhdGVzIHRoZSAnV2luZG93JyBtZW51LgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVXaW5kb3dNZW51KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7CisJCQlJTWVudU1hbmFnZXIgbWVudSA9IG5ldyBNZW51TWFuYWdlcihnZXRTdHJpbmcoIl9VSV9NZW51X1dpbmRvd19sYWJlbCIpLCAvLyROT04tTkxTLTEkCisJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fV0lORE9XKTsKKwkKKwkJCWFkZFRvTWVudUFuZFJlZ2lzdGVyKG1lbnUsIEFjdGlvbkZhY3RvcnkuT1BFTl9ORVdfV0lORE9XLmNyZWF0ZSh3aW5kb3cpKTsKKwkJCW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOworCQkJbWVudS5hZGQoQ29udHJpYnV0aW9uSXRlbUZhY3RvcnkuT1BFTl9XSU5ET1dTLmNyZWF0ZSh3aW5kb3cpKTsKKwkKKwkJCXJldHVybiBtZW51OworCQl9CisJCisJCS8qKgorCQkgKiBDcmVhdGVzIHRoZSAnSGVscCcgbWVudS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlSGVscE1lbnUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKKwkJCUlNZW51TWFuYWdlciBtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKGdldFN0cmluZygiX1VJX01lbnVfSGVscF9sYWJlbCIpLCBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fSEVMUCk7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIFdlbGNvbWUgb3IgaW50cm8gcGFnZSB3b3VsZCBnbyBoZXJlCisJCQkvLyBIZWxwIGNvbnRlbnRzIHdvdWxkIGdvIGhlcmUKKwkJCS8vIFRpcHMgYW5kIHRyaWNrcyBwYWdlIHdvdWxkIGdvIGhlcmUKKwkJCW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkhFTFBfU1RBUlQpKTsKKwkJCW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkhFTFBfRU5EKSk7CisJCQltZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKwkJCXJldHVybiBtZW51OworCQl9CisJCQorCQkvKioKKwkJICogQWRkcyB0aGUgc3BlY2lmaWVkIGFjdGlvbiB0byB0aGUgZ2l2ZW4gbWVudSBhbmQgYWxzbyByZWdpc3RlcnMgdGhlIGFjdGlvbiB3aXRoIHRoZQorCQkgKiBhY3Rpb24gYmFyIGNvbmZpZ3VyZXIsIGluIG9yZGVyIHRvIGFjdGl2YXRlIGl0cyBrZXkgYmluZGluZy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXByb3RlY3RlZCB2b2lkIGFkZFRvTWVudUFuZFJlZ2lzdGVyKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwgSUFjdGlvbiBhY3Rpb24pIHsKKwkJCW1lbnVNYW5hZ2VyLmFkZChhY3Rpb24pOworCQkJZ2V0QWN0aW9uQmFyQ29uZmlndXJlcigpLnJlZ2lzdGVyR2xvYmFsQWN0aW9uKGFjdGlvbik7CisJCX0JCQorCX0KKworCS8qKgorCSAqIEFib3V0IGFjdGlvbiBmb3IgdGhlIFJDUCBhcHBsaWNhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEFib3V0QWN0aW9uIGV4dGVuZHMgV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgeworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7CisJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihnZXRXaW5kb3coKS5nZXRTaGVsbCgpLCBnZXRTdHJpbmcoIl9VSV9BYm91dF90aXRsZSIpLCAvLyROT04tTkxTLTEkCisJCQlnZXRTdHJpbmcoIl9VSV9BYm91dF90ZXh0IikpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwkvKioKKwkgKiBPcGVuIGFjdGlvbiBmb3IgdGhlIG9iamVjdHMgZnJvbSB0aGUgRGlzZWFzZW1vZGVscyBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE9wZW5BY3Rpb24gZXh0ZW5kcyBXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7CisJCS8qKgorCQkgKiBPcGVucyB0aGUgZWRpdG9ycyBmb3IgdGhlIGZpbGVzIHNlbGVjdGVkIHVzaW5nIHRoZSBmaWxlIGRpYWxvZy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgeworCQkJU3RyaW5nW10gZmlsZVBhdGhzID0gb3BlbkZpbGVQYXRoRGlhbG9nKGdldFdpbmRvdygpLmdldFNoZWxsKCksIFNXVC5PUEVOLCBudWxsKTsKKwkJCWlmIChmaWxlUGF0aHMubGVuZ3RoID4gMCkgeworCQkJCW9wZW5FZGl0b3IoZ2V0V2luZG93KCkuZ2V0V29ya2JlbmNoKCksIFVSSS5jcmVhdGVGaWxlVVJJKGZpbGVQYXRoc1swXSkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogT3BlbiBVUkkgYWN0aW9uIGZvciB0aGUgb2JqZWN0cyBmcm9tIHRoZSBEaXNlYXNlbW9kZWxzIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgT3BlblVSSUFjdGlvbiBleHRlbmRzIFdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKKwkJLyoqCisJCSAqIE9wZW5zIHRoZSBlZGl0b3JzIGZvciB0aGUgZmlsZXMgc2VsZWN0ZWQgdXNpbmcgdGhlIExvYWRSZXNvdXJjZURpYWxvZy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgeworCQkJTG9hZFJlc291cmNlQWN0aW9uLkxvYWRSZXNvdXJjZURpYWxvZyBsb2FkUmVzb3VyY2VEaWFsb2cgPSBuZXcgTG9hZFJlc291cmNlQWN0aW9uLkxvYWRSZXNvdXJjZURpYWxvZyhnZXRXaW5kb3coKS5nZXRTaGVsbCgpKTsKKwkJCWlmIChXaW5kb3cuT0sgPT0gbG9hZFJlc291cmNlRGlhbG9nLm9wZW4oKSkgeworCQkJCWZvciAoVVJJIHVyaSA6IGxvYWRSZXNvdXJjZURpYWxvZy5nZXRVUklzKCkpIHsKKwkJCQkJb3BlbkVkaXRvcihnZXRXaW5kb3coKS5nZXRXb3JrYmVuY2goKSwgdXJpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIG9wZW5GaWxlUGF0aERpYWxvZyhTaGVsbCBzaGVsbCwgaW50IHN0eWxlLCBTdHJpbmdbXSBmaWxlRXh0ZW5zaW9uRmlsdGVycykgeworCQlyZXR1cm4gb3BlbkZpbGVQYXRoRGlhbG9nKHNoZWxsLCBzdHlsZSwgZmlsZUV4dGVuc2lvbkZpbHRlcnMsIChzdHlsZSAmIFNXVC5PUEVOKSAhPSAwLCAoc3R5bGUgJiBTV1QuT1BFTikgIT0gMCwgKHN0eWxlICYgU1dULlNBVkUpICE9IDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gb3BlbkZpbGVQYXRoRGlhbG9nKFNoZWxsIHNoZWxsLCBpbnQgc3R5bGUsIFN0cmluZ1tdIGZpbGVFeHRlbnNpb25GaWx0ZXJzLCBib29sZWFuIGluY2x1ZGVHcm91cEZpbHRlciwgYm9vbGVhbiBpbmNsdWRlQWxsRmlsdGVyLCBib29sZWFuIGFkZEV4dGVuc2lvbikgeworCQlGaWxlRGlhbG9nIGZpbGVEaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgc3R5bGUpOworCQlpZiAoZmlsZUV4dGVuc2lvbkZpbHRlcnMgPT0gbnVsbCkgeworCQkJZmlsZUV4dGVuc2lvbkZpbHRlcnMgPSBGSUxFX0VYVEVOU0lPTl9GSUxURVJTOworCQl9CisJCQorCQkvLyBJZiByZXF1ZXN0ZWQsIGF1Z21lbnQgdGhlIGZpbGUgZXh0ZW5zaW9uIGZpbHRlcnMgYnkgYWRkaW5nIGEgZ3JvdXAgb2YgYWxsIHRoZSBvdGhlciBmaWx0ZXJzICgqLmV4dDE7Ki5leHQyOy4uLikKKwkJLy8gYXQgdGhlIGJlZ2lubmluZyBhbmQvb3IgYW4gYWxsIGZpbGVzIHdpbGRjYXJkICgqLiopIGF0IHRoZSBlbmQuCisJCS8vCisJCWluY2x1ZGVHcm91cEZpbHRlciAmPSBmaWxlRXh0ZW5zaW9uRmlsdGVycy5sZW5ndGggPiAxOworCQlpbnQgb2Zmc2V0ID0gaW5jbHVkZUdyb3VwRmlsdGVyID8gMSA6IDA7CisJCQorCQlpZiAoaW5jbHVkZUdyb3VwRmlsdGVyIHx8IGluY2x1ZGVBbGxGaWx0ZXIpIHsKKwkJCWludCBzaXplID0gZmlsZUV4dGVuc2lvbkZpbHRlcnMubGVuZ3RoICsgb2Zmc2V0ICsgKGluY2x1ZGVBbGxGaWx0ZXIgPyAxIDogMCk7CisJCQlTdHJpbmdbXSBhbGxGaWx0ZXJzID0gbmV3IFN0cmluZ1tzaXplXTsKKwkJCVN0cmluZ0J1aWxkZXIgZ3JvdXAgPSBpbmNsdWRlR3JvdXBGaWx0ZXIgPyBuZXcgU3RyaW5nQnVpbGRlcigpIDogbnVsbDsKKwkJCQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlRXh0ZW5zaW9uRmlsdGVycy5sZW5ndGg7IGkrKykgeworCQkJCWlmIChpbmNsdWRlR3JvdXBGaWx0ZXIpIHsKKwkJCQkJaWYgKGkgIT0gMCkgeworCQkJCQkJZ3JvdXAuYXBwZW5kKCc7Jyk7CisJCQkJCX0KKwkJCQkJZ3JvdXAuYXBwZW5kKGZpbGVFeHRlbnNpb25GaWx0ZXJzW2ldKTsKKwkJCQl9CisJCQkJYWxsRmlsdGVyc1tpICsgb2Zmc2V0XSA9IGZpbGVFeHRlbnNpb25GaWx0ZXJzW2ldOworCQkJfQorCQkJCisJCQlpZiAoaW5jbHVkZUdyb3VwRmlsdGVyKSB7CisJCQkJYWxsRmlsdGVyc1swXSA9IGdyb3VwLnRvU3RyaW5nKCk7CisJCQl9CisJCQlpZiAoaW5jbHVkZUFsbEZpbHRlcikgeworCQkJCWFsbEZpbHRlcnNbYWxsRmlsdGVycy5sZW5ndGggLSAxXSA9ICIqLioiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQkKKwkJCWZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhhbGxGaWx0ZXJzKTsKKwkJfQorCQllbHNlIHsKKwkJCWZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhmaWxlRXh0ZW5zaW9uRmlsdGVycyk7CisJCX0KKwkJZmlsZURpYWxvZy5vcGVuKCk7CisJCQorCQlTdHJpbmdbXSBmaWxlbmFtZXMgPSBmaWxlRGlhbG9nLmdldEZpbGVOYW1lcygpOworCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2ZpbGVuYW1lcy5sZW5ndGhdOworCQlTdHJpbmcgcGF0aCA9IGZpbGVEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpICsgRmlsZS5zZXBhcmF0b3I7CisJCVN0cmluZyBleHRlbnNpb24gPSBudWxsOworCQkKKwkJLy8gSWYgZXh0ZW5zaW9uIGFkZGluZyByZXF1ZXN0ZWQsIGdldCB0aGUgZG90dGVkIGV4dGVuc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWxlY3RlZCBmaWx0ZXIuCisJCS8vCisJCWlmIChhZGRFeHRlbnNpb24pIHsKKwkJCWludCBpID0gZmlsZURpYWxvZy5nZXRGaWx0ZXJJbmRleCgpOworCQkJaWYgKGkgIT0gLTEgJiYgKCFpbmNsdWRlQWxsRmlsdGVyIHx8IGkgIT0gZmlsZUV4dGVuc2lvbkZpbHRlcnMubGVuZ3RoKSkgeworCQkJCWkgPSBpbmNsdWRlR3JvdXBGaWx0ZXIgJiYgaSA9PSAwID8gMCA6IGkgLSBvZmZzZXQ7CisJCQkJU3RyaW5nIGZpbHRlciA9IGZpbGVFeHRlbnNpb25GaWx0ZXJzW2ldOworCQkJCWludCBkb3QgPSBmaWx0ZXIubGFzdEluZGV4T2YoJy4nKTsKKwkJCQlpZiAoZG90ID09IDEgJiYgZmlsdGVyLmNoYXJBdCgwKSA9PSAnKicpIHsKKwkJCQkJZXh0ZW5zaW9uID0gZmlsdGVyLnN1YnN0cmluZyhkb3QpOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJLy8gQnVpbGQgdGhlIHJlc3VsdCBieSBhZGRpbmcgdGhlIHNlbGVjdGVkIHBhdGggYW5kLCBpZiBuZWVkZWQsIGF1dG8tYXBwZW5kaW5nIHRoZSBleHRlbnNpb24uCisJCS8vCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZW5hbWVzLmxlbmd0aDsgaSsrKSB7CisJCQlTdHJpbmcgZmlsZW5hbWUgPSBwYXRoICsgZmlsZW5hbWVzW2ldOworCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7CisJCQkJaW50IGRvdCA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJyk7CisJCQkJU3RyaW5nQnVpbGRlciBzdHIgPSBuZXcgU3RyaW5nQnVpbGRlcihmaWxlbmFtZSk7CisJCQkJaWYgKGRvdCA9PSAtMSB8fCAhQXJyYXlzLmFzTGlzdChmaWxlRXh0ZW5zaW9uRmlsdGVycykuY29udGFpbnMoIioiICsgZmlsZW5hbWUuc3Vic3RyaW5nKGRvdCkpKSAvLyROT04tTkxTLTEkCisJCQkJeworCQkJCQlzdHIuYXBwZW5kKGV4dGVuc2lvbik7CisJCQkJCS8vZmlsZW5hbWUgKz0gZXh0ZW5zaW9uOworCQkJCX0KKwkJCQlmaWxlbmFtZSA9IHN0ci50b1N0cmluZygpOworCQkJfQorCQkJcmVzdWx0W2ldID0gZmlsZW5hbWU7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlbkVkaXRvcihJV29ya2JlbmNoIHdvcmtiZW5jaCwgVVJJIHVyaSkgeworCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKKwkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7CisJCQorCQlJRWRpdG9yRGVzY3JpcHRvciBlZGl0b3JEZXNjcmlwdG9yID0gRWRpdFVJVXRpbC5nZXREZWZhdWx0RWRpdG9yKHVyaSwgbnVsbCk7CisJCWlmIChlZGl0b3JEZXNjcmlwdG9yID09IG51bGwpIHsKKwkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKAorCQkJCXdvcmtiZW5jaFdpbmRvdy5nZXRTaGVsbCgpLAorCQkJCWdldFN0cmluZygiX1VJX0Vycm9yX3RpdGxlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQlnZXRTdHJpbmcoIl9XQVJOX05vX0VkaXRvciIsIHVyaS5sYXN0U2VnbWVudCgpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQllbHNlIHsKKwkJCXRyeSB7CisJCQkJcGFnZS5vcGVuRWRpdG9yKG5ldyBVUklFZGl0b3JJbnB1dCh1cmkpLCBlZGl0b3JEZXNjcmlwdG9yLmdldElkKCkpOworCQkJfQorCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKAorCQkJCQl3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKSwKKwkJCQkJZ2V0U3RyaW5nKCJfVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkJZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNnZXRJbml0aWFsV2luZG93UGVyc3BlY3RpdmVJZCgpCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRJbml0aWFsV2luZG93UGVyc3BlY3RpdmVJZCgpIHsKKwkJcmV0dXJuIFBlcnNwZWN0aXZlLklEX1BFUlNQRUNUSVZFOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNpbml0aWFsaXplKG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklXb3JrYmVuY2hDb25maWd1cmVyKQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVdvcmtiZW5jaENvbmZpZ3VyZXIgY29uZmlndXJlcikgeworCQlzdXBlci5pbml0aWFsaXplKGNvbmZpZ3VyZXIpOworCQljb25maWd1cmVyLnNldFNhdmVBbmRSZXN0b3JlKHRydWUpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjY3JlYXRlV29ya2JlbmNoV2luZG93QWR2aXNvcihvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoV2luZG93Q29uZmlndXJlcikKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgV29ya2JlbmNoV2luZG93QWR2aXNvciBjcmVhdGVXb3JrYmVuY2hXaW5kb3dBZHZpc29yKElXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKKwkJcmV0dXJuIG5ldyBXaW5kb3dBZHZpc29yKGNvbmZpZ3VyZXIpOworCX0JCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcmVzZW50YXRpb24vRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJlc2VudGF0aW9uL0Rpc2Vhc2Vtb2RlbHNFZGl0b3JQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2U2Mzc5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJlc2VudGF0aW9uL0Rpc2Vhc2Vtb2RlbHNFZGl0b3JQbHVnaW4uamF2YQpAQCAtMCwwICsxLDE1MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuRWNsaXBzZVVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRWNvcmVFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db3JlRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmVkZ2VzLnByb3ZpZGVyLkRlZmluaXRpb25zRWRpdFBsdWdpbjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnByb3ZpZGVyLkRlZmluaXRpb25zRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RhbmRhcmRFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubmV3bW9kaWZpZXJwYWdlLkRpc2Vhc2VOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuSVNoYXJlZEltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuU3RhbmRhcmREaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5TdGFuZGFyZFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBjZW50cmFsIHNpbmdsZXRvbiBmb3IgdGhlIERpc2Vhc2Vtb2RlbHMgZWRpdG9yIHBsdWdpbi4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERpc2Vhc2Vtb2RlbHNFZGl0b3JQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4geworCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIERpc2Vhc2Vtb2RlbHNFZGl0b3JQbHVnaW4gSU5TVEFOQ0UgPSBuZXcgRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbigpOworCisJLyoqCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyBEaXNlYXNlbW9kZWxzRWRpdG9yUGx1Z2luKCkgeworCQlzdXBlcgorCQkJKG5ldyBSZXNvdXJjZUxvY2F0b3IgW10geworCQkJCUNvcmVFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkJCS8qRWNvcmVFZGl0UGx1Z2luLklOU1RBTkNFLCovCisJCQkJRGVmaW5pdGlvbnNFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkJfSk7CisJfQorCisJCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4geworCQkKKwkJLyoqCisJCSAqIFRoZSBzeW1ib2xpYyBpZGVudGlmaWVyIGZvciB0aGlzIHBsdWctaW4KKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMiOyAvLyROT04tTkxTLTEkCisJCQorCQkvKioKKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKKwkJCXN1cGVyKCk7CisJCisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgorCQkJLy8KKwkJCXBsdWdpbiA9IHRoaXM7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQkJc3VwZXIuc3RhcnQoY29udGV4dCk7CisJCQluZXcgU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKKwkJCW5ldyBTdGFuZGFyZERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkoKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI2luaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnkpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUltYWdlUmVnaXN0cnkoSW1hZ2VSZWdpc3RyeSByZWdpc3RyeSkgeworCQkJc3VwZXIuaW5pdGlhbGl6ZUltYWdlUmVnaXN0cnkocmVnaXN0cnkpOworCQkJCisJCQlmaW5hbCBTdHJpbmcgSUNPTl9QQVRIX1BSRUZJWCA9ICJpY29ucy9mdWxsL29iajE2LyI7IC8vJE5PTi1OTFMtMSQKKwkJCWZpbmFsIFN0cmluZyBDVVNUT01fSUNPTl9QQVRIX1BSRUZJWCA9ICJpY29ucy9mdWxsL2N1c3RvbTE2LyI7IC8vJE5PTi1OTFMtMSRDCisJCQkKKwkJCXJlZ2lzdHJ5LnB1dChJU2hhcmVkSW1hZ2VzLkRJU0VBU0VfSUNPTiwgaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKKwkJCQkJUExVR0lOX0lELCBDVVNUT01fSUNPTl9QQVRIX1BSRUZJWCArICJkaXNlYXNlLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5JTkZFQ1RPUl9JQ09OLCBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKAorCQkJCQlQTFVHSU5fSUQsIENVU1RPTV9JQ09OX1BBVEhfUFJFRklYICsgImluZmVjdG9yLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5SRUNPUkRFRF9DU1ZfSUNPTiwgaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKKwkJCQkJUExVR0lOX0lELCBDVVNUT01fSUNPTl9QQVRIX1BSRUZJWCArICJyZWNvcmRlZGNzdi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKworCQkJCisJCX0gLy8gaW5pdGlhbGl6ZUltYWdlUmVnaXN0cnkKKworCX0gLy8gSW1wbGVtZW50YXRpb24KKworfSAvLyBEaXNlYXNlbW9kZWxzRWRpdG9yUGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcmVzZW50YXRpb24vU3RhbmRhcmRBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJlc2VudGF0aW9uL1N0YW5kYXJkQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmE2ZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJlc2VudGF0aW9uL1N0YW5kYXJkQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpAQCAtMCwwICsxLDQ2MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisvL2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLmFjdGlvbi5Xb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbnRyb2xBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkxvYWRSZXNvdXJjZUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJDb250cmlidXRpb25JdGVtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZvciB0aGUgU3RhbmRhcmQgbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRBY3Rpb25CYXJDb250cmlidXRvcgorCWV4dGVuZHMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yCisJaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKKwkvKioKKwkgKiBBY3Rpb24gdG8gY3JlYXRlIG9iamVjdHMgZnJvbSB0aGUgU3RhbmRhcmQgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBOZXdBY3Rpb24gZXh0ZW5kcyBXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7CisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKKwkJCVN0YW5kYXJkTW9kZWxXaXphcmQgd2l6YXJkID0gbmV3IFN0YW5kYXJkTW9kZWxXaXphcmQoKTsKKwkJCXdpemFyZC5pbml0KGdldFdpbmRvdygpLmdldFdvcmtiZW5jaCgpLCBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKKwkJCVdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFdpbmRvdygpLmdldFNoZWxsKCksIHdpemFyZCk7CisJCQl3aXphcmREaWFsb2cub3BlbigpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yUGFydDsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGFjdGlvbiBvcGVucyB0aGUgUHJvcGVydGllcyB2aWV3LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQWN0aW9uIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbiA9CisJCW5ldyBBY3Rpb24oRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtIikpIC8vJE5PTi1OTFMtMSQKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJdHJ5IHsKKwkJCQkJZ2V0UGFnZSgpLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlEaXNlYXNlbW9kZWxzRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgYWN0aW9uIHJlZnJlc2hlcyB0aGUgdmlld2VyIG9mIHRoZSBjdXJyZW50IGVkaXRvciBpZiB0aGUgZWRpdG9yCisJICogaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUFjdGlvbiByZWZyZXNoVmlld2VyQWN0aW9uID0KKwkJbmV3IEFjdGlvbihEaXNlYXNlbW9kZWxzRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtIikpIC8vJE5PTi1OTFMtMSQKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisJCQkJcmV0dXJuIGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWlmIChhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7CisJCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRWaWV3ZXIoKTsKKwkJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7CisJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyB3aWxsIGNvbnRhaW4gb25lIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlQ2hpbGRBY3Rpb25zOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVDaGlsZCBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlU2libGluZ0FjdGlvbnM7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZVNpYmxpbmcgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgY29udHJpYnV0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0YW5kYXJkQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7CisJCXN1cGVyKEFERElUSU9OU19MQVNUX1NUWUxFKTsKKwkJbG9hZFJlc291cmNlQWN0aW9uID0gbmV3IExvYWRSZXNvdXJjZUFjdGlvbigpOworCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBWYWxpZGF0ZUFjdGlvbigpOworCQljb250cm9sQWN0aW9uID0gbmV3IENvbnRyb2xBY3Rpb24oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgU2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucyB0byB0aGUgdG9vbCBiYXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInN0YW5kYXJkLXNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzdGFuZGFyZC1hZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgdG8gdGhlIG1lbnUgYmFyIGEgbWVudSBhbmQgc29tZSBzZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zLAorCSAqIGFzIHdlbGwgYXMgdGhlIHN1Yi1tZW51cyBmb3Igb2JqZWN0IGNyZWF0aW9uIGl0ZW1zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudU1hbmFnZXIpOworCisJCUlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihEaXNlYXNlbW9kZWxzRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1N0YW5kYXJkRWRpdG9yX21lbnUiKSwgIm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZE1lbnVJRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigic2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIFByZXBhcmUgZm9yIENyZWF0ZUNoaWxkIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KKwkJLy8KKwkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihEaXNlYXNlbW9kZWxzRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlU2libGluZyBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCisJCS8vCisJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihEaXNlYXNlbW9kZWxzRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEZvcmNlIGFuIHVwZGF0ZSBiZWNhdXNlIEVjbGlwc2UgaGlkZXMgZW1wdHkgbWVudXMgbm93LgorCQkvLworCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIKKwkJCShuZXcgSU1lbnVMaXN0ZW5lcigpIHsKKwkJCQkgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQkJCQkgbWVudU1hbmFnZXIudXBkYXRlQWxsKHRydWUpOworCQkJCSB9CisJCQkgfSk7CisKKwkJYWRkR2xvYmFsQWN0aW9ucyhzdWJtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogV2hlbiB0aGUgYWN0aXZlIGVkaXRvciBjaGFuZ2VzLCB0aGlzIHJlbWVtYmVycyB0aGUgY2hhbmdlIGFuZCByZWdpc3RlcnMgd2l0aCBpdCBhcyBhIHNlbGVjdGlvbiBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkgeworCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IocGFydCk7CisJCWFjdGl2ZUVkaXRvclBhcnQgPSBwYXJ0OworCisJCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KKwkJLy8KKwkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKwkJfQorCQlpZiAocGFydCA9PSBudWxsKSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7CisJCX0KKwkJZWxzZSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7CisJCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisKKwkJCS8vIEZha2UgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCB0byB1cGRhdGUgdGhlIG1lbnVzLgorCQkJLy8KKwkJCWlmIChzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSAhPSBudWxsKSB7CisJCQkJc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNlbGVjdGlvblByb3ZpZGVyLCBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LAorCSAqIGhhbmRsaW5nIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH1zIGJ5IHF1ZXJ5aW5nIGZvciB0aGUgY2hpbGRyZW4gYW5kIHNpYmxpbmdzCisJICogdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGVkIG9iamVjdCBhbmQgdXBkYXRpbmcgdGhlIG1lbnVzIGFjY29yZGluZ2x5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCS8vIFJlbW92ZSBhbnkgbWVudSBpdGVtcyBmb3Igb2xkIHNlbGVjdGlvbi4KKwkJLy8KKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMpOworCQl9CisKKwkJLy8gUXVlcnkgdGhlIG5ldyBzZWxlY3Rpb24gZm9yIGFwcHJvcHJpYXRlIG5ldyBjaGlsZC9zaWJsaW5nIGRlc2NyaXB0b3JzCisJCS8vCisJCUNvbGxlY3Rpb248Pz4gbmV3Q2hpbGREZXNjcmlwdG9ycyA9IG51bGw7CisJCUNvbGxlY3Rpb248Pz4gbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gbnVsbDsKKworCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOworCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnNpemUoKSA9PSAxKSB7CisJCQlPYmplY3Qgb2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOworCisJCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7CisKKwkJCW5ld0NoaWxkRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhvYmplY3QsIG51bGwpOworCQkJbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobnVsbCwgb2JqZWN0KTsKKwkJfQorCisJCS8vIEdlbmVyYXRlIGFjdGlvbnMgZm9yIHNlbGVjdGlvbjsgcG9wdWxhdGUgYW5kIHJlZHJhdyB0aGUgbWVudXMuCisJCS8vCisJCWNyZWF0ZUNoaWxkQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKG5ld0NoaWxkRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7CisJCWNyZWF0ZVNpYmxpbmdBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhuZXdTaWJsaW5nRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7CisKKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7CisJCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKKwkJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7CisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7CisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlQ2hpbGRBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCisJLyoqCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgeworCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVTaWJsaW5nQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwgZGVzY3JpcHRvcikpOworCQkJfQorCQl9CisJCXJldHVybiBhY3Rpb25zOworCX0KKworCS8qKgorCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gd2l0aCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cworCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sCisJICogYnkgaW5zZXJ0aW5nIHRoZW0gYmVmb3JlIHRoZSBzcGVjaWZpZWQgY29udHJpYnV0aW9uIGl0ZW0gPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+LgorCSAqIElmIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgc2ltcGx5IGFkZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zLCBTdHJpbmcgY29udHJpYnV0aW9uSUQpIHsKKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChJQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMpIHsKKwkJCQlpZiAoY29udHJpYnV0aW9uSUQgIT0gbnVsbCkgeworCQkJCQltYW5hZ2VyLmluc2VydEJlZm9yZShjb250cmlidXRpb25JRCwgYWN0aW9uKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCW1hbmFnZXIuYWRkKGFjdGlvbik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQkKKwkvKioKKwkgKiBUaGlzIHJlbW92ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cworCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucykgeworCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7CisJCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgeworCQkJCS8vIExvb2sgaW50byBTdWJDb250cmlidXRpb25JdGVtcworCQkJCS8vCisJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uSXRlbSA9IGl0ZW1zW2ldOworCQkJCXdoaWxlIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCQljb250cmlidXRpb25JdGVtID0gKChTdWJDb250cmlidXRpb25JdGVtKWNvbnRyaWJ1dGlvbkl0ZW0pLmdldElubmVySXRlbSgpOworCQkJCX0KKworCQkJCS8vIERlbGV0ZSB0aGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbXMgd2l0aCBtYXRjaGluZyBhY3Rpb24uCisJCQkJLy8KKwkJCQlpZiAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKKwkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0QWN0aW9uKCk7CisJCQkJCWlmIChhY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsKKwkJCQkJCW1hbmFnZXIucmVtb3ZlKGNvbnRyaWJ1dGlvbkl0ZW0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHBvcC11cCBtZW51IGJlZm9yZSBpdCBhcHBlYXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKKwkJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBudWxsOworCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKERpc2Vhc2Vtb2RlbHNFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisKKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBpbnNlcnRzIGdsb2JhbCBhY3Rpb25zIGJlZm9yZSB0aGUgImFkZGl0aW9ucy1lbmQiIHNlcGFyYXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRHbG9iYWxBY3Rpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zLWVuZCIsIG5ldyBTZXBhcmF0b3IoInVpLWFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKKworCQlyZWZyZXNoVmlld2VyQWN0aW9uLnNldEVuYWJsZWQocmVmcmVzaFZpZXdlckFjdGlvbi5pc0VuYWJsZWQoKSk7CQkKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCByZWZyZXNoVmlld2VyQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAorCisJCXN1cGVyLmFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgZW5zdXJlcyB0aGF0IGEgZGVsZXRlIGFjdGlvbiB3aWxsIGNsZWFuIHVwIGFsbCByZWZlcmVuY2VzIHRvIGRlbGV0ZWQgb2JqZWN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVBbGxSZWZlcmVuY2VzT25EZWxldGUoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJlc2VudGF0aW9uL1N0YW5kYXJkRWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcmVzZW50YXRpb24vU3RhbmRhcmRFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjRmNjYzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQvcHJlc2VudGF0aW9uL1N0YW5kYXJkRWRpdG9yLmphdmEKQEAgLTAsMCArMSwxOTc1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOworLy8KKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKKy8vCisvL2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlZpZXdlclBhbmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLmVkaXRvci5Qcm9ibGVtRWRpdG9yUGFydDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlJdGVtRGVsZWdhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5jZWxsZWRpdG9yLkFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkxvY2FsVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLlZpZXdlckRyYWdBZGFwdGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuVW53cmFwcGluZ1NlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJVXRpbDsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJTWFya2VySGVscGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudmlldy5FeHRlbmRlZFByb3BlcnR5U2hlZXRQYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLkdyYXBoSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5wcm92aWRlci5Nb2RpZmllckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5wcm92aWRlci5TY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIucHJvdmlkZXIuU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5wcm92aWRlci5Tb2x2ZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5wcm92aWRlci5MYWJlbHNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247CisKKworLyoqCisgKiBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBTdGFuZGFyZCBtb2RlbCBlZGl0b3IuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTdGFuZGFyZEVkaXRvcgorCWV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydAorCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5Qcm92aWRlciwgSVNlbGVjdGlvblByb3ZpZGVyLCBJTWVudUxpc3RlbmVyLCBJVmlld2VyUHJvdmlkZXIgeworCS8qKgorCSAqIFRoZSBmaWx0ZXJzIGZvciBmaWxlIGV4dGVuc2lvbnMgc3VwcG9ydGVkIGJ5IHRoZSBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gRklMRV9FWFRFTlNJT05fRklMVEVSUyA9IHByZWZpeEV4dGVuc2lvbnMoU3RhbmRhcmRNb2RlbFdpemFyZC5GSUxFX0VYVEVOU0lPTlMsICIqLiIpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyB1bm1vZGlmaWFibGUgbGlzdCBjb250YWluaW5nIHByZWZpeGVkIHZlcnNpb25zIG9mIHRoZSBleHRlbnNpb25zIGluIHRoZSBnaXZlbiBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBwcmVmaXhFeHRlbnNpb25zKExpc3Q8U3RyaW5nPiBleHRlbnNpb25zLCBTdHJpbmcgcHJlZml4KSB7CisJCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZm9yIChTdHJpbmcgZXh0ZW5zaW9uIDogZXh0ZW5zaW9ucykgeworCQkJcmVzdWx0LmFkZChwcmVmaXggKyBleHRlbnNpb24pOworCQl9CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJlc3VsdCk7CisJfQorCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgZWRpdGluZyBkb21haW4gdGhhdCBpcyB1c2VkIHRvIHRyYWNrIGFsbCBjaGFuZ2VzIHRvIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBvbmUgYWRhcHRlciBmYWN0b3J5IHVzZWQgZm9yIHByb3ZpZGluZyB2aWV3cyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNvbnRlbnRPdXRsaW5lUGFnZSBjb250ZW50T3V0bGluZVBhZ2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIGEga2x1ZGdlLi4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBjb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UncyB2aWV3ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgY29udGVudE91dGxpbmVWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBwcm9wZXJ0eSBzaGVldCBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQcm9wZXJ0eVNoZWV0UGFnZSBwcm9wZXJ0eVNoZWV0UGFnZTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHZpZXdlciB0aGF0IHNoYWRvd3MgdGhlIHNlbGVjdGlvbiBpbiB0aGUgY29udGVudCBvdXRsaW5lLgorCSAqIFRoZSBwYXJlbnQgcmVsYXRpb24gbXVzdCBiZSBjb3JyZWN0bHkgZGVmaW5lZCBmb3IgdGhpcyB0byB3b3JrLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmVlVmlld2VyIHNlbGVjdGlvblZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgaW52ZXJ0cyB0aGUgcm9sbCBvZiBwYXJlbnQgYW5kIGNoaWxkIGluIHRoZSBjb250ZW50IHByb3ZpZGVyIGFuZCBzaG93IHBhcmVudHMgYXMgYSB0cmVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmVlVmlld2VyIHBhcmVudFZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgc2hvd3MgaG93IGEgdHJlZSB2aWV3IHdvcmtzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIHNob3dzIGhvdyBhIGxpc3QgdmlldyB3b3Jrcy4KKwkgKiBBIGxpc3Qgdmlld2VyIGRvZXNuJ3Qgc3VwcG9ydCBpY29ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdFZpZXdlciBsaXN0Vmlld2VyOworCisJLyoqCisJICogVGhpcyBzaG93cyBob3cgYSB0YWJsZSB2aWV3IHdvcmtzLgorCSAqIEEgdGFibGUgY2FuIGJlIHVzZWQgYXMgYSBsaXN0IHdpdGggaWNvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOworCisJLyoqCisJICogVGhpcyBzaG93cyBob3cgYSB0cmVlIHZpZXcgd2l0aCBjb2x1bW5zIHdvcmtzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmVlVmlld2VyIHRyZWVWaWV3ZXJXaXRoQ29sdW1uczsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSB2aWV3ZXIgcGFuZSwgaW4gdGhlIGJvb2suCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFZpZXdlclBhbmUgY3VycmVudFZpZXdlclBhbmU7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgY29udGVudCB2aWV3ZXIsIHdoaWNoIG1heSBiZSBlaXRoZXIgb25lIG9mIHRoZSB2aWV3ZXJzIGluIHRoZSBwYWdlcyBvciB0aGUgY29udGVudCBvdXRsaW5lIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVmlld2VyIGN1cnJlbnRWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgdG8gd2hpY2ggZXZlciB2aWV3ZXIgaXMgYWN0aXZlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfXMgdGhhdCBhcmUgbGlzdGVuaW5nIHRvIHRoaXMgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+KCk7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGVkaXRvciBhcyBhIHdob2xlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uIGVkaXRvclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdoZW4gdGhlIG91dGxpbmUgYmVjb21lcyBhY3RpdmUKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPQorCQluZXcgSVBhcnRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCWlmIChwIGluc3RhbmNlb2YgQ29udGVudE91dGxpbmUpIHsKKwkJCQkJaWYgKCgoQ29udGVudE91dGxpbmUpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBjb250ZW50T3V0bGluZVBhZ2UpIHsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKFN0YW5kYXJkRWRpdG9yLnRoaXMpOworCisJCQkJCQlzZXRDdXJyZW50Vmlld2VyKGNvbnRlbnRPdXRsaW5lVmlld2VyKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChwIGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgeworCQkJCQlpZiAoKChQcm9wZXJ0eVNoZWV0KXApLmdldEN1cnJlbnRQYWdlKCkgPT0gcHJvcGVydHlTaGVldFBhZ2UpIHsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKFN0YW5kYXJkRWRpdG9yLnRoaXMpOworCQkJCQkJaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChwID09IFN0YW5kYXJkRWRpdG9yLnRoaXMpIHsKKwkJCQkJaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQl9CisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIHNpbmNlIGxhc3QgYWN0aXZhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHNhdmVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBzYXZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBNYXAgdG8gc3RvcmUgdGhlIGRpYWdub3N0aWMgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4gcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4oKTsKKworCS8qKgorCSAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiBzaG91bGQgYmUgdXBkYXRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisKKwkvKioKKwkgKiBBZGFwdGVyIHVzZWQgdG8gdXBkYXRlIHRoZSBwcm9ibGVtIGluZGljYXRpb24gd2hlbiByZXNvdXJjZXMgYXJlIGRlbWFuZGVkIGxvYWRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUNvbnRlbnRBZGFwdGVyIHByb2JsZW1JbmRpY2F0aW9uQWRhcHRlciA9IAorCQluZXcgRUNvbnRlbnRBZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBSZXNvdXJjZSkgeworCQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVzb3VyY2UuY2xhc3MpKSB7CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQ6CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19FUlJPUlM6CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19XQVJOSU5HUzogeworCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOworCQkJCQkJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBudWxsKTsKKwkJCQkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBkaWFnbm9zdGljKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnJlbW92ZShyZXNvdXJjZSk7CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKSB7CisJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCQkJCQkJCQkJIH0KKwkJCQkJCQkJCSB9KTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJCQl9CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VGFyZ2V0KFJlc291cmNlIHRhcmdldCkgeworCQkJCWJhc2ljU2V0VGFyZ2V0KHRhcmdldCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgdW5zZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7CisJCQkJYmFzaWNVbnNldFRhcmdldCh0YXJnZXQpOworCQkJfQorCQl9OworCisJLyoqCisJICogSGFuZGxlcyBhY3RpdmF0aW9uIG9mIHRoZSBlZGl0b3Igb3IgaXQncyBhc3NvY2lhdGVkIHZpZXdzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFjdGl2YXRlKCkgeworCQkvLyBSZWNvbXB1dGUgdGhlIHJlYWQgb25seSBzdGF0ZS4KKwkJLy8KKwkJaWYgKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkgIT0gbnVsbCkgeworCQkgIGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkuY2xlYXIoKTsKKworCQkgIC8vIFJlZnJlc2ggYW55IGFjdGlvbnMgdGhhdCBtYXkgYmVjb21lIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisJCSAgLy8KKwkJICBzZXRTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpOworCQl9CisKKwkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgeworCQkJaWYgKGhhbmRsZURpcnR5Q29uZmxpY3QoKSkgeworCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoU3RhbmRhcmRFZGl0b3IudGhpcywgZmFsc2UpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVtb3ZlZFJlc291cmNlcy5jbGVhcigpOworCQkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgeworCQkJY2hhbmdlZFJlc291cmNlcy5yZW1vdmVBbGwoc2F2ZWRSZXNvdXJjZXMpOworCQkJaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpOworCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOworCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEhhbmRsZXMgd2hhdCB0byBkbyB3aXRoIGNoYW5nZWQgcmVzb3VyY2VzIG9uIGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpIHsKKwkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSAmJiAoIWlzRGlydHkoKSB8fCBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpKSB7CisJCQlpZiAoaXNEaXJ0eSgpKSB7CisJCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsKKwkJCX0KKwkJCWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZmx1c2goKTsKKworCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKwkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7CisJCQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKKwkJCQkJcmVzb3VyY2UudW5sb2FkKCk7CisJCQkJCXRyeSB7CisJCQkJCQlyZXNvdXJjZS5sb2FkKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJaWYgKCFyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5jb250YWluc0tleShyZXNvdXJjZSkpIHsKKwkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbi5pc1N0YWxlKGVkaXRvclNlbGVjdGlvbikpIHsKKwkJCQlzZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7CisJCQl9CisKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCX0KKwl9CisgIAorCS8qKgorCSAqIFVwZGF0ZXMgdGhlIHByb2JsZW1zIGluZGljYXRpb24gd2l0aCB0aGUgaW5mb3JtYXRpb24gZGVzY3JpYmVkIGluIHRoZSBzcGVjaWZpZWQgZGlhZ25vc3RpYy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpIHsKKwkJaWYgKHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKSB7CisJCQlCYXNpY0RpYWdub3N0aWMgZGlhZ25vc3RpYyA9CisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5PSywKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZWRpdG9yIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkgMCwKKwkJCQkJIG51bGwsCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpIH0pOworCQkJZm9yIChEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA6IHJlc291cmNlVG9EaWFnbm9zdGljTWFwLnZhbHVlcygpKSB7CisJCQkJaWYgKGNoaWxkRGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJZGlhZ25vc3RpYy5hZGQoY2hpbGREaWFnbm9zdGljKTsKKwkJCQl9CisJCQl9CisKKwkJCWludCBsYXN0RWRpdG9yUGFnZSA9IGdldFBhZ2VDb3VudCgpIC0gMTsKKwkJCWlmIChsYXN0RWRpdG9yUGFnZSA+PSAwICYmIGdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkgaW5zdGFuY2VvZiBQcm9ibGVtRWRpdG9yUGFydCkgeworCQkJCSgoUHJvYmxlbUVkaXRvclBhcnQpZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSkuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQlQcm9ibGVtRWRpdG9yUGFydCBwcm9ibGVtRWRpdG9yUGFydCA9IG5ldyBQcm9ibGVtRWRpdG9yUGFydCgpOworCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7CisJCQkJdHJ5IHsKKwkJCQkJYWRkUGFnZSgrK2xhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydCwgZ2V0RWRpdG9ySW5wdXQoKSk7CisJCQkJCXNldFBhZ2VUZXh0KGxhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydC5nZXRQYXJ0TmFtZSgpKTsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJCXNob3dUYWJzKCk7CisJCQkJfQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBTaG93cyBhIGRpYWxvZyB0aGF0IGFza3MgaWYgY29uZmxpY3RpbmcgY2hhbmdlcyBzaG91bGQgYmUgZGlzY2FyZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZURpcnR5Q29uZmxpY3QoKSB7CisJCXJldHVybgorCQkJTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24KKwkJCQkoZ2V0U2l0ZSgpLmdldFNoZWxsKCksCisJCQkJIGdldFN0cmluZygiX1VJX0ZpbGVDb25mbGljdF9sYWJlbCIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1dBUk5fRmlsZUNvbmZsaWN0IikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGEgbW9kZWwgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdGFuZGFyZEVkaXRvcigpIHsKKwkJc3VwZXIoKTsKKwkJaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdXAgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgc3RhbmRhcmQgZWRpdG9yLiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKSB7CisJCWluaXRpYWxpemVFZGl0aW5nRG9tYWluR2VuKCk7CisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpCisJCQkJLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgiKiIsCisJCQkJCQlTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbC5JTlNUQU5DRSk7CisKKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkKKwkJCQkuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKS5wdXQoInBsYXRmb3JtIiwKKwkJCQkJCVNURU1YTUlSZXNvdXJjZUZhY3RvcnlJbXBsLklOU1RBTkNFKTsKKwl9IC8vIGluaXRpYWxpemVFZGl0aW5nRG9tYWluCisJCisJLyoqCisJICogVGhpcyBzZXRzIHVwIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1vZGVsIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWRpdGluZ0RvbWFpbkdlbigpIHsKKwkJLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlpZWxkcyBpdGVtIHByb3ZpZGVycy4KKwkJLy8KKwkJYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOworCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEdyYXBoSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RpZmllckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IExhYmVsc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU29sdmVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKworCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUgZXhlY3V0ZWQuCisJCS8vCisJCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOworCisJCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCisJCS8vCisJCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcgorCQkJKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKKwkJCQkgcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgeworCQkJCQkgZ2V0Q29udGFpbmVyKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJIChuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJICBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCSAgZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworCisJCQkJCQkJCSAgLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KKwkJCQkJCQkJICAvLworCQkJCQkJCQkgIENvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaylldmVudC5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsKKwkJCQkJCQkJICBpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgeworCQkJCQkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihtb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7CisJCQkJCQkJCSAgfQorCQkJCQkJCQkgIGlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsICYmICFwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQkJCQkgIHByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsKKwkJCQkJCQkJICB9CisJCQkJCQkJICB9CisJCQkJCQkgIH0pOworCQkJCSB9CisJCQkgfSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgorCQkvLworCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgQm9vbGVhbj4oKSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBoZXJlIGZvciB0aGUgbGlzdGVuZXIgdG8gYmUgYWJsZSB0byBjYWxsIGl0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgYWN0aW9uKSB7CisJCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShhY3Rpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgc2V0cyB0aGUgc2VsZWN0aW9uIGludG8gd2hpY2hldmVyIHZpZXdlciBpcyBhY3RpdmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisJCWZpbmFsIENvbGxlY3Rpb248Pz4gdGhlU2VsZWN0aW9uID0gY29sbGVjdGlvbjsKKwkJLy8gTWFrZSBzdXJlIGl0J3Mgb2theS4KKwkJLy8KKwkJaWYgKHRoZVNlbGVjdGlvbiAhPSBudWxsICYmICF0aGVTZWxlY3Rpb24uaXNFbXB0eSgpKSB7CisJCQlSdW5uYWJsZSBydW5uYWJsZSA9CisJCQkJbmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBpdGVtcyBpbiB0aGUgY3VycmVudCBjb250ZW50IHZpZXdlciBvZiB0aGUgZWRpdG9yLgorCQkJCQkJLy8KKwkJCQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKKwkJCQkJCQljdXJyZW50Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0aGVTZWxlY3Rpb24udG9BcnJheSgpKSwgdHJ1ZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9OworCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGVkaXRpbmcgZG9tYWluIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSUVkaXRpbmdEb21haW5Qcm92aWRlcn0gaW50ZXJmYWNlLgorCSAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBpbXBsZW1lbnRpbmcgdGhlIHN0YXRpYyBtZXRob2RzIG9mIHtAbGluayBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW59CisJICogYW5kIGZvciBzdXBwb3J0aW5nIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKKwkJcmV0dXJuIGVkaXRpbmdEb21haW47CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGNsYXNzIFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsKKwkJcHVibGljIFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCQl9CisKKwkJcHVibGljIE9iamVjdCBbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7CisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7CisJCQlyZXR1cm4gKHBhcmVudCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhcmVudCkpLnRvQXJyYXkoKTsKKwkJfQorCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7CisJCQlyZXR1cm4gcGFyZW50ICE9IG51bGw7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRWaWV3ZXJQYW5lKFZpZXdlclBhbmUgdmlld2VyUGFuZSkgeworCQlpZiAoY3VycmVudFZpZXdlclBhbmUgIT0gdmlld2VyUGFuZSkgeworCQkJaWYgKGN1cnJlbnRWaWV3ZXJQYW5lICE9IG51bGwpIHsKKwkJCQljdXJyZW50Vmlld2VyUGFuZS5zaG93Rm9jdXMoZmFsc2UpOworCQkJfQorCQkJY3VycmVudFZpZXdlclBhbmUgPSB2aWV3ZXJQYW5lOworCQl9CisJCXNldEN1cnJlbnRWaWV3ZXIoY3VycmVudFZpZXdlclBhbmUuZ2V0Vmlld2VyKCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG9uZSBjb250ZW50IHZpZXdlciwgZWl0aGVyIGZvciB0aGUgY3VycmVudCBwYWdlIG9yIHRoZSBvdXRsaW5lIHZpZXcsIGlmIGl0IGhhcyBmb2N1cywKKwkgKiBpcyB0aGUgY3VycmVudCBvbmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q3VycmVudFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7CisJCS8vIElmIGl0IGlzIGNoYW5naW5nLi4uCisJCS8vCisJCWlmIChjdXJyZW50Vmlld2VyICE9IHZpZXdlcikgeworCQkJaWYgKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7CisJCQkJLy8gQ3JlYXRlIHRoZSBsaXN0ZW5lciBvbiBkZW1hbmQuCisJCQkJLy8KKwkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPQorCQkJCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCQkJCS8vIFRoaXMganVzdCBub3RpZmllcyB0aG9zZSB0aGluZ3MgdGhhdCBhcmUgYWZmZWN0ZWQgYnkgdGhlIHNlY3Rpb24uCisJCQkJCQkvLworCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgc2VsZWN0aW9uQ2hhbmdlZEV2ZW50KSB7CisJCQkJCQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkNoYW5nZWRFdmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCQl9CisJCQkJCX07CisJCQl9CisKKwkJCS8vIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBvbGQgb25lLgorCQkJLy8KKwkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKKwkJCQljdXJyZW50Vmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOworCQkJfQorCisJCQkvLyBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG5ldyBvbmUuCisJCQkvLworCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7CisJCQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOworCQkJfQorCisJCQkvLyBSZW1lbWJlciBpdC4KKwkJCS8vCisJCQljdXJyZW50Vmlld2VyID0gdmlld2VyOworCisJCQkvLyBTZXQgdGhlIGVkaXRvcnMgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdlcidzIHNlbGVjdGlvbi4KKwkJCS8vCisJCQlzZXRTZWxlY3Rpb24oY3VycmVudFZpZXdlciA9PSBudWxsID8gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSA6IGN1cnJlbnRWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSB2aWV3ZXIgYXMgcmVxdWlyZWQgYnkgdGhlIHtAbGluayBJVmlld2VyUHJvdmlkZXJ9IGludGVyZmFjZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKKwkJcmV0dXJuIGN1cnJlbnRWaWV3ZXI7CisJfQorCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGEgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyIGFuZCBhZGRzIGEgbGlzdGVuZXIgYXMgd2VsbCByZWdpc3RlcmluZyB0aGUgbWVudSBmb3IgZXh0ZW5zaW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7CisJCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsgLy8kTk9OLU5MUy0xJAorCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKKwkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKHRoaXMpOworCQlNZW51IG1lbnU9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOworCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7CisJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGNvbnRleHRNZW51LCBuZXcgVW53cmFwcGluZ1NlbGVjdGlvblByb3ZpZGVyKHZpZXdlcikpOworCisJCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LOworCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07CisJCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKKwkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgY2FsbGVkIHRvIGxvYWQgYSByZXNvdXJjZSBpbnRvIHRoZSBlZGl0aW5nIGRvbWFpbidzIHJlc291cmNlIHNldCBiYXNlZCBvbiB0aGUgZWRpdG9yJ3MgaW5wdXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlTW9kZWwoKSB7CisJCVVSSSByZXNvdXJjZVVSSSA9IEVkaXRVSVV0aWwuZ2V0VVJJKGdldEVkaXRvcklucHV0KCkpOworCQlFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworCQl0cnkgeworCQkJLy8gTG9hZCB0aGUgcmVzb3VyY2UgdGhyb3VnaCB0aGUgZWRpdGluZyBkb21haW4uCisJCQkvLworCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIHRydWUpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZXhjZXB0aW9uID0gZTsKKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCBmYWxzZSk7CisJCX0KKworCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKTsKKwkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsICBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCX0KKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBkaWFnbm9zdGljIGRlc2NyaWJpbmcgdGhlIGVycm9ycyBhbmQgd2FybmluZ3MgbGlzdGVkIGluIHRoZSByZXNvdXJjZQorCSAqIGFuZCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiAoaWYgYW55KS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGlhZ25vc3RpYyBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhSZXNvdXJjZSByZXNvdXJjZSwgRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQlpZiAoIXJlc291cmNlLmdldEVycm9ycygpLmlzRW1wdHkoKSB8fCAhcmVzb3VyY2UuZ2V0V2FybmluZ3MoKS5pc0VtcHR5KCkpIHsKKwkJCUJhc2ljRGlhZ25vc3RpYyBiYXNpY0RpYWdub3N0aWMgPQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMKKwkJCQkJKERpYWdub3N0aWMuRVJST1IsCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmVkaXRvciIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJIDAsCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksIC8vJE5PTi1OTFMtMSQKKwkJCQkJIG5ldyBPYmplY3QgW10geyBleGNlcHRpb24gPT0gbnVsbCA/IChPYmplY3QpcmVzb3VyY2UgOiBleGNlcHRpb24gfSk7CisJCQliYXNpY0RpYWdub3N0aWMubWVyZ2UoRWNvcmVVdGlsLmNvbXB1dGVEaWFnbm9zdGljKHJlc291cmNlLCB0cnVlKSk7CisJCQlyZXR1cm4gYmFzaWNEaWFnbm9zdGljOworCQl9CisJCWVsc2UgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQlyZXR1cm4KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5lZGl0b3IiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCSBuZXcgT2JqZWN0W10geyBleGNlcHRpb24gfSk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gRGlhZ25vc3RpYy5PS19JTlNUQU5DRTsKKwkJfQorCX0KKworCQorCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gaW5zdGFsbCB5b3VyIG93biBjb250cm9scy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlUGFnZXMoKSB7CisJCS8vIENyZWF0ZXMgdGhlIG1vZGVsIGZyb20gdGhlIGVkaXRvciBpbnB1dAorCQkvLworCQljcmVhdGVNb2RlbCgpOworCisJCS8vIE9ubHkgY3JlYXRlcyB0aGUgb3RoZXIgcGFnZXMgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGVkaXRlZAorCQkvLworCQlpZiAoIWdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJLy8gQ3JlYXRlIGEgcGFnZSBmb3IgdGhlIHNlbGVjdGlvbiB0cmVlIHZpZXcuCisJCQkvLworCQkJeworCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9CisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIFN0YW5kYXJkRWRpdG9yLnRoaXMpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQkJCQkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGNvbXBvc2l0ZSwgU1dULk1VTFRJKTsKKwkJCQkJCQlUcmVlVmlld2VyIG5ld1RyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKKwkJCQkJCQlyZXR1cm4gbmV3VHJlZVZpZXdlcjsKKwkJCQkJCX0KKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7CisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsKKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOworCisJCQkJc2VsZWN0aW9uVmlld2VyID0gKFRyZWVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsKKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCisJCQkJc2VsZWN0aW9uVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCS8vc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisJCQkJc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpOworCQkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCQkJCXZpZXdlclBhbmUuc2V0VGl0bGUoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKworCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3Ioc2VsZWN0aW9uVmlld2VyLmdldFRyZWUoKSwgYWRhcHRlckZhY3RvcnkpOworCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Ioc2VsZWN0aW9uVmlld2VyKTsKKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7CisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisKKwkJCS8vIENyZWF0ZSBhIHBhZ2UgZm9yIHRoZSBwYXJlbnQgdHJlZSB2aWV3LgorCQkJLy8KKwkJCXsKKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBTdGFuZGFyZEVkaXRvci50aGlzKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKwkJCQkJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShjb21wb3NpdGUsIFNXVC5NVUxUSSk7CisJCQkJCQkJVHJlZVZpZXdlciBuZXdUcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7CisJCQkJCQkJcmV0dXJuIG5ld1RyZWVWaWV3ZXI7CisJCQkJCQl9CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgeworCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7CisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7CisJCQkJCQl9CisJCQkJCX07CisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsKKworCQkJCXBhcmVudFZpZXdlciA9IChUcmVlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7CisJCQkJcGFyZW50Vmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbCgzMCk7CisJCQkJcGFyZW50Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJcGFyZW50Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IocGFyZW50Vmlld2VyKTsKKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7CisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9QYXJlbnRQYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisKKwkJCS8vIFRoaXMgaXMgdGhlIHBhZ2UgZm9yIHRoZSBsaXN0IHZpZXdlcgorCQkJLy8KKwkJCXsKKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBTdGFuZGFyZEVkaXRvci50aGlzKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKwkJCQkJCQlyZXR1cm4gbmV3IExpc3RWaWV3ZXIoY29tcG9zaXRlKTsKKwkJCQkJCX0KKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7CisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsKKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOworCQkJCWxpc3RWaWV3ZXIgPSAoTGlzdFZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOworCQkJCWxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCWxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisKKwkJCQljcmVhdGVDb250ZXh0TWVudUZvcihsaXN0Vmlld2VyKTsKKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7CisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9MaXN0UGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgdHJlZSB2aWV3ZXIKKwkJCS8vCisJCQl7CisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgU3RhbmRhcmRFZGl0b3IudGhpcykgeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7CisJCQkJCQkJcmV0dXJuIG5ldyBUcmVlVmlld2VyKGNvbXBvc2l0ZSk7CisJCQkJCQl9CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgeworCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7CisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7CisJCQkJCQl9CisJCQkJCX07CisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsKKwkJCQl0cmVlVmlld2VyID0gKFRyZWVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsKKwkJCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCisJCQkJbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcih0cmVlVmlld2VyLmdldFRyZWUoKSwgYWRhcHRlckZhY3RvcnkpOworCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IodHJlZVZpZXdlcik7CisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOworCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfVHJlZVBhZ2VfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKworCQkJLy8gVGhpcyBpcyB0aGUgcGFnZSBmb3IgdGhlIHRhYmxlIHZpZXdlci4KKwkJCS8vCisJCQl7CisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgU3RhbmRhcmRFZGl0b3IudGhpcykgeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7CisJCQkJCQkJcmV0dXJuIG5ldyBUYWJsZVZpZXdlcihjb21wb3NpdGUpOworCQkJCQkJfQorCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsKKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOworCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOworCQkJCQkJfQorCQkJCQl9OworCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7CisJCQkJdGFibGVWaWV3ZXIgPSAoVGFibGVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsKKworCQkJCVRhYmxlIHRhYmxlID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKKwkJCQlUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKKwkJCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOworCQkJCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKKworCQkJCVRhYmxlQ29sdW1uIG9iamVjdENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOworCQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDMsIDEwMCwgdHJ1ZSkpOworCQkJCW9iamVjdENvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX09iamVjdENvbHVtbl9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCW9iamVjdENvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7CisKKwkJCQlUYWJsZUNvbHVtbiBzZWxmQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7CisJCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMiwgMTAwLCB0cnVlKSk7CisJCQkJc2VsZkNvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX1NlbGZDb2x1bW5fbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlzZWxmQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKKworCQkJCXRhYmxlVmlld2VyLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZyBbXSB7ImEiLCAiYiJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IodGFibGVWaWV3ZXIpOworCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsKKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1RhYmxlUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgdGFibGUgdHJlZSB2aWV3ZXIuCisJCQkvLworCQkJeworCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9CisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIFN0YW5kYXJkRWRpdG9yLnRoaXMpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQkJCQkJCXJldHVybiBuZXcgVHJlZVZpZXdlcihjb21wb3NpdGUpOworCQkJCQkJfQorCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsKKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOworCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOworCQkJCQkJfQorCQkJCQl9OworCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7CisKKwkJCQl0cmVlVmlld2VyV2l0aENvbHVtbnMgPSAoVHJlZVZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOworCisJCQkJVHJlZSB0cmVlID0gdHJlZVZpZXdlcldpdGhDb2x1bW5zLmdldFRyZWUoKTsKKwkJCQl0cmVlLnNldExheW91dERhdGEobmV3IEZpbGxMYXlvdXQoKSk7CisJCQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOworCQkJCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOworCisJCQkJVHJlZUNvbHVtbiBvYmplY3RDb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7CisJCQkJb2JqZWN0Q29sdW1uLnNldFRleHQoZ2V0U3RyaW5nKCJfVUlfT2JqZWN0Q29sdW1uX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQkJb2JqZWN0Q29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKKwkJCQlvYmplY3RDb2x1bW4uc2V0V2lkdGgoMjUwKTsKKworCQkJCVRyZWVDb2x1bW4gc2VsZkNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKKwkJCQlzZWxmQ29sdW1uLnNldFRleHQoZ2V0U3RyaW5nKCJfVUlfU2VsZkNvbHVtbl9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCXNlbGZDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOworCQkJCXNlbGZDb2x1bW4uc2V0V2lkdGgoMjAwKTsKKworCQkJCXRyZWVWaWV3ZXJXaXRoQ29sdW1ucy5zZXRDb2x1bW5Qcm9wZXJ0aWVzKG5ldyBTdHJpbmcgW10geyJhIiwgImIifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCXRyZWVWaWV3ZXJXaXRoQ29sdW1ucy5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJdHJlZVZpZXdlcldpdGhDb2x1bW5zLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IodHJlZVZpZXdlcldpdGhDb2x1bW5zKTsKKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7CisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9UcmVlV2l0aENvbHVtbnNQYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisKKwkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJIHNldEFjdGl2ZVBhZ2UoMCk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJLy8gRW5zdXJlcyB0aGF0IHRoaXMgZWRpdG9yIHdpbGwgb25seSBkaXNwbGF5IHRoZSBwYWdlJ3MgdGFiCisJCS8vIGFyZWEgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgcGFnZQorCQkvLworCQlnZXRDb250YWluZXIoKS5hZGRDb250cm9sTGlzdGVuZXIKKwkJCShuZXcgQ29udHJvbEFkYXB0ZXIoKSB7CisJCQkJYm9vbGVhbiBndWFyZCA9IGZhbHNlOworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBldmVudCkgeworCQkJCQlpZiAoIWd1YXJkKSB7CisJCQkJCQlndWFyZCA9IHRydWU7CisJCQkJCQloaWRlVGFicygpOworCQkJCQkJZ3VhcmQgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCSB9KTsKKworCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQkJCSB9CisJCQkgfSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBpbnN0YWxsIHlvdXIgb3duIGNvbnRyb2xzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VzR2VuKCkgeworCQkvLyBDcmVhdGVzIHRoZSBtb2RlbCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQKKwkJLy8KKwkJY3JlYXRlTW9kZWwoKTsKKworCQkvLyBPbmx5IGNyZWF0ZXMgdGhlIG90aGVyIHBhZ2VzIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBlZGl0ZWQKKwkJLy8KKwkJaWYgKCFnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCS8vIENyZWF0ZSBhIHBhZ2UgZm9yIHRoZSBzZWxlY3Rpb24gdHJlZSB2aWV3LgorCQkJLy8KKwkJCXsKKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBTdGFuZGFyZEVkaXRvci50aGlzKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKwkJCQkJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShjb21wb3NpdGUsIFNXVC5NVUxUSSk7CisJCQkJCQkJVHJlZVZpZXdlciBuZXdUcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7CisJCQkJCQkJcmV0dXJuIG5ld1RyZWVWaWV3ZXI7CisJCQkJCQl9CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgeworCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7CisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7CisJCQkJCQl9CisJCQkJCX07CisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsKKworCQkJCXNlbGVjdGlvblZpZXdlciA9IChUcmVlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7CisJCQkJc2VsZWN0aW9uVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKworCQkJCXNlbGVjdGlvblZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKwkJCQl2aWV3ZXJQYW5lLnNldFRpdGxlKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisKKwkJCQluZXcgQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yKHNlbGVjdGlvblZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsKKworCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHNlbGVjdGlvblZpZXdlcik7CisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOworCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgcGFyZW50IHRyZWUgdmlldy4KKwkJCS8vCisJCQl7CisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgU3RhbmRhcmRFZGl0b3IudGhpcykgeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7CisJCQkJCQkJVHJlZSB0cmVlID0gbmV3IFRyZWUoY29tcG9zaXRlLCBTV1QuTVVMVEkpOworCQkJCQkJCVRyZWVWaWV3ZXIgbmV3VHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOworCQkJCQkJCXJldHVybiBuZXdUcmVlVmlld2VyOworCQkJCQkJfQorCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsKKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOworCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOworCQkJCQkJfQorCQkJCQl9OworCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7CisKKwkJCQlwYXJlbnRWaWV3ZXIgPSAoVHJlZVZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOworCQkJCXBhcmVudFZpZXdlci5zZXRBdXRvRXhwYW5kTGV2ZWwoMzApOworCQkJCXBhcmVudFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCXBhcmVudFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKworCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHBhcmVudFZpZXdlcik7CisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOworCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfUGFyZW50UGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgbGlzdCB2aWV3ZXIKKwkJCS8vCisJCQl7CisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgU3RhbmRhcmRFZGl0b3IudGhpcykgeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7CisJCQkJCQkJcmV0dXJuIG5ldyBMaXN0Vmlld2VyKGNvbXBvc2l0ZSk7CisJCQkJCQl9CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgeworCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7CisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7CisJCQkJCQl9CisJCQkJCX07CisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsKKwkJCQlsaXN0Vmlld2VyID0gKExpc3RWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsKKwkJCQlsaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQlsaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IobGlzdFZpZXdlcik7CisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOworCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfTGlzdFBhZ2VfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKworCQkJLy8gVGhpcyBpcyB0aGUgcGFnZSBmb3IgdGhlIHRyZWUgdmlld2VyCisJCQkvLworCQkJeworCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9CisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIFN0YW5kYXJkRWRpdG9yLnRoaXMpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQkJCQkJCXJldHVybiBuZXcgVHJlZVZpZXdlcihjb21wb3NpdGUpOworCQkJCQkJfQorCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsKKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOworCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOworCQkJCQkJfQorCQkJCQl9OworCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7CisJCQkJdHJlZVZpZXdlciA9IChUcmVlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7CisJCQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKworCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3IodHJlZVZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsKKworCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRyZWVWaWV3ZXIpOworCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsKKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1RyZWVQYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisKKwkJCS8vIFRoaXMgaXMgdGhlIHBhZ2UgZm9yIHRoZSB0YWJsZSB2aWV3ZXIuCisJCQkvLworCQkJeworCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9CisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIFN0YW5kYXJkRWRpdG9yLnRoaXMpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQkJCQkJCXJldHVybiBuZXcgVGFibGVWaWV3ZXIoY29tcG9zaXRlKTsKKwkJCQkJCX0KKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7CisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsKKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOworCQkJCXRhYmxlVmlld2VyID0gKFRhYmxlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7CisKKwkJCQlUYWJsZSB0YWJsZSA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCk7CisJCQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7CisJCQkJdGFibGUuc2V0TGF5b3V0KGxheW91dCk7CisJCQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKKwkJCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7CisKKwkJCQlUYWJsZUNvbHVtbiBvYmplY3RDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKKwkJCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgzLCAxMDAsIHRydWUpKTsKKwkJCQlvYmplY3RDb2x1bW4uc2V0VGV4dChnZXRTdHJpbmcoIl9VSV9PYmplY3RDb2x1bW5fbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlvYmplY3RDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOworCisJCQkJVGFibGVDb2x1bW4gc2VsZkNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOworCQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDIsIDEwMCwgdHJ1ZSkpOworCQkJCXNlbGZDb2x1bW4uc2V0VGV4dChnZXRTdHJpbmcoIl9VSV9TZWxmQ29sdW1uX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQkJc2VsZkNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7CisKKwkJCQl0YWJsZVZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKG5ldyBTdHJpbmcgW10geyJhIiwgImIifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKworCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRhYmxlVmlld2VyKTsKKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7CisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9UYWJsZVBhZ2VfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKworCQkJLy8gVGhpcyBpcyB0aGUgcGFnZSBmb3IgdGhlIHRhYmxlIHRyZWUgdmlld2VyLgorCQkJLy8KKwkJCXsKKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBTdGFuZGFyZEVkaXRvci50aGlzKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKwkJCQkJCQlyZXR1cm4gbmV3IFRyZWVWaWV3ZXIoY29tcG9zaXRlKTsKKwkJCQkJCX0KKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7CisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsKKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOworCisJCQkJdHJlZVZpZXdlcldpdGhDb2x1bW5zID0gKFRyZWVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsKKworCQkJCVRyZWUgdHJlZSA9IHRyZWVWaWV3ZXJXaXRoQ29sdW1ucy5nZXRUcmVlKCk7CisJCQkJdHJlZS5zZXRMYXlvdXREYXRhKG5ldyBGaWxsTGF5b3V0KCkpOworCQkJCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKKwkJCQl0cmVlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKKworCQkJCVRyZWVDb2x1bW4gb2JqZWN0Q29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOworCQkJCW9iamVjdENvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX09iamVjdENvbHVtbl9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCW9iamVjdENvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7CisJCQkJb2JqZWN0Q29sdW1uLnNldFdpZHRoKDI1MCk7CisKKwkJCQlUcmVlQ29sdW1uIHNlbGZDb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7CisJCQkJc2VsZkNvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX1NlbGZDb2x1bW5fbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlzZWxmQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKKwkJCQlzZWxmQ29sdW1uLnNldFdpZHRoKDIwMCk7CisKKwkJCQl0cmVlVmlld2VyV2l0aENvbHVtbnMuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nIFtdIHsiYSIsICJiIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQl0cmVlVmlld2VyV2l0aENvbHVtbnMuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCXRyZWVWaWV3ZXJXaXRoQ29sdW1ucy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKworCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRyZWVWaWV3ZXJXaXRoQ29sdW1ucyk7CisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOworCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfVHJlZVdpdGhDb2x1bW5zUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCSBzZXRBY3RpdmVQYWdlKDApOworCQkJCQkgfQorCQkJCSB9KTsKKwkJfQorCisJCS8vIEVuc3VyZXMgdGhhdCB0aGlzIGVkaXRvciB3aWxsIG9ubHkgZGlzcGxheSB0aGUgcGFnZSdzIHRhYgorCQkvLyBhcmVhIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHBhZ2UKKwkJLy8KKwkJZ2V0Q29udGFpbmVyKCkuYWRkQ29udHJvbExpc3RlbmVyCisJCQkobmV3IENvbnRyb2xBZGFwdGVyKCkgeworCQkJCWJvb2xlYW4gZ3VhcmQgPSBmYWxzZTsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsKKwkJCQkJaWYgKCFndWFyZCkgeworCQkJCQkJZ3VhcmQgPSB0cnVlOworCQkJCQkJaGlkZVRhYnMoKTsKKwkJCQkJCWd1YXJkID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkgfSk7CisKKwkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkgfQorCQkJIH0pOworCX0KKwkKKwkvKioKKwkgKiBJZiB0aGVyZSBpcyBqdXN0IG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LAorCSAqIHRoaXMgaGlkZXMgdGhlIHNpbmdsZSB0YWIgYXQgdGhlIGJvdHRvbS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoaWRlVGFicygpIHsKKwkJaWYgKGdldFBhZ2VDb3VudCgpIDw9IDEpIHsKKwkJCXNldFBhZ2VUZXh0KDAsICIiKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgeworCQkJCSgoQ1RhYkZvbGRlcilnZXRDb250YWluZXIoKSkuc2V0VGFiSGVpZ2h0KDEpOworCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOworCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSArIDYpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LAorCSAqIHRoaXMgc2hvd3MgdGhlIHRhYnMgYXQgdGhlIGJvdHRvbS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzaG93VGFicygpIHsKKwkJaWYgKGdldFBhZ2VDb3VudCgpID4gMSkgeworCQkJc2V0UGFnZVRleHQoMCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgeworCQkJCSgoQ1RhYkZvbGRlcilnZXRDb250YWluZXIoKSkuc2V0VGFiSGVpZ2h0KFNXVC5ERUZBVUxUKTsKKwkJCQlQb2ludCBwb2ludCA9IGdldENvbnRhaW5lcigpLmdldFNpemUoKTsKKwkJCQlnZXRDb250YWluZXIoKS5zZXRTaXplKHBvaW50LngsIHBvaW50LnkgLSA2KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdXNlZCB0byB0cmFjayB0aGUgYWN0aXZlIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBwYWdlSW5kZXgpIHsKKwkJc3VwZXIucGFnZUNoYW5nZShwYWdlSW5kZXgpOworCisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgIT0gbnVsbCkgeworCQkJaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oY29udGVudE91dGxpbmVQYWdlLmdldFNlbGVjdGlvbigpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgaG93IHRoZSBmcmFtZXdvcmsgZGV0ZXJtaW5lcyB3aGljaCBpbnRlcmZhY2VzIHdlIGltcGxlbWVudC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgeworCQlpZiAoa2V5LmVxdWFscyhJQ29udGVudE91dGxpbmVQYWdlLmNsYXNzKSkgeworCQkJcmV0dXJuIHNob3dPdXRsaW5lVmlldygpID8gZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgOiBudWxsOworCQl9CisJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzKSkgeworCQkJcmV0dXJuIGdldFByb3BlcnR5U2hlZXRQYWdlKCk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IG91dGxpbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQ29udGVudE91dGxpbmVQYWdlIGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIHsKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSA9PSBudWxsKSB7CisJCQkvLyBUaGUgY29udGVudCBvdXRsaW5lIGlzIGp1c3QgYSB0cmVlLgorCQkJLy8KKwkJCWNsYXNzIE15Q29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgQ29udGVudE91dGxpbmVQYWdlIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCQkJCS8vIFNldCB1cCB0aGUgdHJlZSB2aWV3ZXIuCisJCQkJCS8vCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisKKwkJCQkJLy8gTWFrZSBzdXJlIG91ciBwb3B1cHMgd29yay4KKwkJCQkJLy8KKwkJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IoY29udGVudE91dGxpbmVWaWV3ZXIpOworCisJCQkJCWlmICghZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkgIC8vIFNlbGVjdCB0aGUgcm9vdCBvYmplY3QgaW4gdGhlIHZpZXcuCisJCQkJCSAgLy8KKwkJCQkJICBjb250ZW50T3V0bGluZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCQkJCQl9CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgbWFrZUNvbnRyaWJ1dGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlcikgeworCQkJCQlzdXBlci5tYWtlQ29udHJpYnV0aW9ucyhtZW51TWFuYWdlciwgdG9vbEJhck1hbmFnZXIsIHN0YXR1c0xpbmVNYW5hZ2VyKTsKKwkJCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsKKwkJCQl9CisJCQl9CisKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZSA9IG5ldyBNeUNvbnRlbnRPdXRsaW5lUGFnZSgpOworCisJCQkvLyBMaXN0ZW4gdG8gc2VsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBpdCBpcyBhIHNwZWNpYWwgd2F5LgorCQkJLy8KKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKKwkJCQkobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQkJCSAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBoYW5kbGUgc2VsZWN0aW9ucyBjb3JyZWN0bHkuCisJCQkJCSAvLworCQkJCQkgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQkJCSBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJcmV0dXJuIGNvbnRlbnRPdXRsaW5lUGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIHByb3BlcnR5IHNoZWV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7CisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZSA9CisJCQkJbmV3IEV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2UoZWRpdGluZ0RvbWFpbikgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoTGlzdDw/PiBzZWxlY3Rpb24pIHsKKwkJCQkJCVN0YW5kYXJkRWRpdG9yLnRoaXMuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0aW9uKTsKKwkJCQkJCVN0YW5kYXJkRWRpdG9yLnRoaXMuc2V0Rm9jdXMoKTsKKwkJCQkJfQorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKKwkJCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7CisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsKKwkJCQkJfQorCQkJCX07CisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQl9CisKKwkJcmV0dXJuIHByb3BlcnR5U2hlZXRQYWdlOworCX0KKworCS8qKgorCSAqIFRoaXMgZGVhbHMgd2l0aCBob3cgd2Ugd2FudCBzZWxlY3Rpb24gaW4gdGhlIG91dGxpbmVyIHRvIGFmZmVjdCB0aGUgb3RoZXIgdmlld3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJaWYgKGN1cnJlbnRWaWV3ZXJQYW5lICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCUl0ZXJhdG9yPD8+IHNlbGVjdGVkRWxlbWVudHMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuaXRlcmF0b3IoKTsKKwkJCWlmIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgeworCQkJCS8vIEdldCB0aGUgZmlyc3Qgc2VsZWN0ZWQgZWxlbWVudC4KKwkJCQkvLworCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzLm5leHQoKTsKKworCQkJCS8vIElmIGl0J3MgdGhlIHNlbGVjdGlvbiB2aWV3ZXIsIHRoZW4gd2Ugd2FudCBpdCB0byBzZWxlY3QgdGhlIHNhbWUgc2VsZWN0aW9uIGFzIHRoaXMgc2VsZWN0aW9uLgorCQkJCS8vCisJCQkJaWYgKGN1cnJlbnRWaWV3ZXJQYW5lLmdldFZpZXdlcigpID09IHNlbGVjdGlvblZpZXdlcikgeworCQkJCQlBcnJheUxpc3Q8T2JqZWN0PiBzZWxlY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisJCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudCk7CisJCQkJCXdoaWxlIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgeworCQkJCQkJc2VsZWN0aW9uTGlzdC5hZGQoc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCkpOworCQkJCQl9CisKKwkJCQkJLy8gU2V0IHRoZSBzZWxlY3Rpb24gdG8gdGhlIHdpZGdldC4KKwkJCQkJLy8KKwkJCQkJc2VsZWN0aW9uVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb25MaXN0KSk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQkvLyBTZXQgdGhlIGlucHV0IHRvIHRoZSB3aWRnZXQuCisJCQkJCS8vCisJCQkJCWlmIChjdXJyZW50Vmlld2VyUGFuZS5nZXRWaWV3ZXIoKS5nZXRJbnB1dCgpICE9IHNlbGVjdGVkRWxlbWVudCkgeworCQkJCQkJY3VycmVudFZpZXdlclBhbmUuZ2V0Vmlld2VyKCkuc2V0SW5wdXQoc2VsZWN0ZWRFbGVtZW50KTsKKwkJCQkJCWN1cnJlbnRWaWV3ZXJQYW5lLnNldFRpdGxlKHNlbGVjdGVkRWxlbWVudCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHRlc3RzIHRoZSBjb21tYW5kIHN0YWNrLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7CisJCXJldHVybiAoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLmlzU2F2ZU5lZWRlZCgpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSUVkaXRvclBhcnR9IGFuZCBzaW1wbHkgc2F2ZXMgdGhlIG1vZGVsIGZpbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisJCS8vIFNhdmUgb25seSByZXNvdXJjZXMgdGhhdCBoYXZlIGFjdHVhbGx5IGNoYW5nZWQuCisJCS8vCisJCWZpbmFsIE1hcDxPYmplY3QsIE9iamVjdD4gc2F2ZU9wdGlvbnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKKwkJc2F2ZU9wdGlvbnMucHV0KFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRCwgUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOworCisJCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtiZW5jaC4KKwkJLy8KKwkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9CisJCQluZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgeworCQkJCS8vIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IGdldHMgaW52b2tlZCB3aGVuIHRoZSBvcGVyYXRpb24gcnVucy4KKwkJCQkvLworCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQkJLy8gU2F2ZSB0aGUgcmVzb3VyY2VzIHRvIHRoZSBmaWxlIHN5c3RlbS4KKwkJCQkJLy8KKwkJCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7CisJCQkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpIHsKKwkJCQkJCWlmICgoZmlyc3QgfHwgIXJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpIHx8IGlzUGVyc2lzdGVkKHJlc291cmNlKSkgJiYgIWVkaXRpbmdEb21haW4uaXNSZWFkT25seShyZXNvdXJjZSkpIHsKKwkJCQkJCQl0cnkgeworCQkJCQkJCQlsb25nIHRpbWVTdGFtcCA9IHJlc291cmNlLmdldFRpbWVTdGFtcCgpOworCQkJCQkJCQlyZXNvdXJjZS5zYXZlKHNhdmVPcHRpb25zKTsKKwkJCQkJCQkJaWYgKHJlc291cmNlLmdldFRpbWVTdGFtcCgpICE9IHRpbWVTdGFtcCkgeworCQkJCQkJCQkJc2F2ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJCQkJCQl9CisJCQkJCQkJZmlyc3QgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX07CisKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCS8vIFRoaXMgcnVucyB0aGUgb3B0aW9ucywgYW5kIHNob3dzIHByb2dyZXNzLgorCQkJLy8KKwkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpLnJ1bih0cnVlLCBmYWxzZSwgb3BlcmF0aW9uKTsKKworCQkJLy8gUmVmcmVzaCB0aGUgbmVjZXNzYXJ5IHN0YXRlLgorCQkJLy8KKwkJCSgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuc2F2ZUlzRG9uZSgpOworCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZyB0aGF0IHNob3VsZG4ndC4KKwkJCS8vCisJCQlEaXNlYXNlbW9kZWxzRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgd2hldGhlciBzb21ldGhpbmcgaGFzIGJlZW4gcGVyc2lzdGVkIHRvIHRoZSBVUkkgb2YgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgVVJJIGNvbnZlcnRlciBmcm9tIHRoZSBlZGl0b3IncyByZXNvdXJjZSBzZXQgdG8gdHJ5IHRvIG9wZW4gYW4gaW5wdXQgc3RyZWFtLiAKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BlcnNpc3RlZChSZXNvdXJjZSByZXNvdXJjZSkgeworCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQl0cnkgeworCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKHJlc291cmNlLmdldFVSSSgpKTsKKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgeworCQkJCXJlc3VsdCA9IHRydWU7CisJCQkJc3RyZWFtLmNsb3NlKCk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElnbm9yZQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogVGhpcyBhbHdheXMgcmV0dXJucyB0cnVlIGJlY2F1c2UgaXQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFsc28gY2hhbmdlcyB0aGUgZWRpdG9yJ3MgaW5wdXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7CisJCVN0cmluZ1tdIGZpbHRlcnMgPSBGSUxFX0VYVEVOU0lPTl9GSUxURVJTLnRvQXJyYXkobmV3IFN0cmluZ1tGSUxFX0VYVEVOU0lPTl9GSUxURVJTLnNpemUoKV0pOworCQlTdHJpbmdbXSBmaWxlcyA9IERpc2Vhc2Vtb2RlbHNFZGl0b3JBZHZpc29yLm9wZW5GaWxlUGF0aERpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSwgU1dULlNBVkUsIGZpbHRlcnMpOworCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkgeworCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKGZpbGVzWzBdKTsKKwkJCWRvU2F2ZUFzKHVyaSwgbmV3IFVSSUVkaXRvcklucHV0KHVyaSkpOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZG9TYXZlQXMoVVJJIHVyaSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisJCShlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKS5zZXRVUkkodXJpKTsKKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKKwkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPQorCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgIT0gbnVsbCA/CisJCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgOgorCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisJCWRvU2F2ZShwcm9ncmVzc01vbml0b3IpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBzdGFydHVwLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisJCXNldFNpdGUoc2l0ZSk7CisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7CisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7CisJCXNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7CisJCXNpdGUuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgeworCQlpZiAoY3VycmVudFZpZXdlclBhbmUgIT0gbnVsbCkgeworCQkJY3VycmVudFZpZXdlclBhbmUuc2V0Rm9jdXMoKTsKKwkJfQorCQllbHNlIHsKKwkJCWdldENvbnRyb2woZ2V0QWN0aXZlUGFnZSgpKS5zZXRGb2N1cygpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byByZXR1cm4gdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7CisJCXJldHVybiBlZGl0b3JTZWxlY3Rpb247CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gc2V0IHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCisJICogQ2FsbGluZyB0aGlzIHJlc3VsdCB3aWxsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQllZGl0b3JTZWxlY3Rpb24gPSBzZWxlY3Rpb247CisKKwkJZm9yIChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyIDogc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycykgeworCQkJbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOworCQl9CisJCXNldFN0YXR1c0xpbmVNYW5hZ2VyKHNlbGVjdGlvbik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZU1hbmFnZXIoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyID0gY3VycmVudFZpZXdlciAhPSBudWxsICYmIGN1cnJlbnRWaWV3ZXIgPT0gY29udGVudE91dGxpbmVWaWV3ZXIgPworCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA6IGdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOworCisJCWlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKSB7CisJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCQlDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikudG9MaXN0KCk7CisJCQkJc3dpdGNoIChjb2xsZWN0aW9uLnNpemUoKSkgeworCQkJCQljYXNlIDA6IHsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTm9PYmplY3RTZWxlY3RlZCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAxOiB7CisJCQkJCQlTdHJpbmcgdGV4dCA9IG5ldyBBZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3IoYWRhcHRlckZhY3RvcnkpLmdldFRleHQoY29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkIiwgdGV4dCkpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlkZWZhdWx0OiB7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQiLCBJbnRlZ2VyLnRvU3RyaW5nKGNvbGxlY3Rpb24uc2l6ZSgpKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoIiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHRoZSBwbHVnaW4ncyBwbHVnaW4ucHJvcGVydGllcyBmaWxlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQlyZXR1cm4gRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHBsdWdpbi5wcm9wZXJ0aWVzLCBtYWtpbmcgYSBzdWJzdGl0dXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEpIHsKKwkJcmV0dXJuIERpc2Vhc2Vtb2RlbHNFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSwgbmV3IE9iamVjdCBbXSB7IHMxIH0pOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXJ9IHRvIGhlbHAgZmlsbCB0aGUgY29udGV4dCBtZW51cyB3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgRWRpdCBtZW51LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJKChJTWVudUxpc3RlbmVyKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpKS5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7CisJCXJldHVybiAoRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgeworCQlyZXR1cm4gZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3Rpb25CYXJzKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKworCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworCisJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKKworCQlpZiAoZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSB0aGlzKSB7CisJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihudWxsKTsKKwkJfQorCisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBvdXRsaW5lIHZpZXcgc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93T3V0bGluZVZpZXcoKSB7CisJCXJldHVybiB0cnVlOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkL3ByZXNlbnRhdGlvbi9TdGFuZGFyZE1vZGVsV2l6YXJkLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcmVzZW50YXRpb24vU3RhbmRhcmRNb2RlbFdpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNzViMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC9wcmVzZW50YXRpb24vU3RhbmRhcmRNb2RlbFdpemFyZC5qYXZhCkBAIC0wLDAgKzEsNjA3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworLy9pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworLy9pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247CisvLworLy9pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOworLy8KKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OworLy9pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5EaXNlYXNlbW9kZWxzRWRpdFBsdWdpbjsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKKy8qKgorICogVGhpcyBpcyBhIHNpbXBsZSB3aXphcmQgZm9yIGNyZWF0aW5nIGEgbmV3IG1vZGVsIGZpbGUuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTdGFuZGFyZE1vZGVsV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7CisJLyoqCisJICogVGhlIHN1cHBvcnRlZCBleHRlbnNpb25zIGZvciBjcmVhdGVkIGZpbGVzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IEZJTEVfRVhURU5TSU9OUyA9CisJCUNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChEaXNlYXNlbW9kZWxzRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1N0YW5kYXJkRWRpdG9yRmlsZW5hbWVFeHRlbnNpb25zIikuc3BsaXQoIlxccyosXFxzKiIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJLyoqCisJICogQSBmb3JtYXR0ZWQgbGlzdCBvZiBzdXBwb3J0ZWQgZmlsZSBleHRlbnNpb25zLCBzdWl0YWJsZSBmb3IgZGlzcGxheS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURURfRklMRV9FWFRFTlNJT05TID0KKwkJRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9ucyIpLnJlcGxhY2VBbGwoIlxccyosXFxzKiIsICIsICIpOworCisJLyoqCisJICogVGhpcyBjYWNoZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFN0YW5kYXJkUGFja2FnZSBzdGFuZGFyZFBhY2thZ2UgPSBTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFOworCisJLyoqCisJICogVGhpcyBjYWNoZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFN0YW5kYXJkRmFjdG9yeSBzdGFuZGFyZEZhY3RvcnkgPSBzdGFuZGFyZFBhY2thZ2UuZ2V0U3RhbmRhcmRGYWN0b3J5KCk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBpbml0aWFsIG9iamVjdCBjcmVhdGlvbiBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTdGFuZGFyZE1vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSBpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlOworCisJLyoqCisJICogUmVtZW1iZXIgdGhlIHNlbGVjdGlvbiBkdXJpbmcgaW5pdGlhbGl6YXRpb24gZm9yIHBvcHVsYXRpbmcgdGhlIGRlZmF1bHQgY29udGFpbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247CisKKwkvKioKKwkgKiBSZW1lbWJlciB0aGUgd29ya2JlbmNoIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVdvcmtiZW5jaCB3b3JrYmVuY2g7CisKKwkvKioKKwkgKiBDYWNoZXMgdGhlIG5hbWVzIG9mIHRoZSB0eXBlcyB0aGF0IGNhbiBiZSBjcmVhdGVkIGFzIHRoZSByb290IG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGluaXRpYWxPYmplY3ROYW1lczsKKworCS8qKgorCSAqIFRoaXMganVzdCByZWNvcmRzIHRoZSBpbmZvcm1hdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7CisJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOworCQlzZXRXaW5kb3dUaXRsZShEaXNlYXNlbW9kZWxzRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1dpemFyZF9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihFeHRlbmRlZEltYWdlUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0SW1hZ2VEZXNjcmlwdG9yKERpc2Vhc2Vtb2RlbHNFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvd2l6YmFuL05ld1N0YW5kYXJkIikpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSB0eXBlcyB0aGF0IGNhbiBiZSBjcmVhdGVkIGFzIHRoZSByb290IG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEluaXRpYWxPYmplY3ROYW1lcygpIHsKKwkJaWYgKGluaXRpYWxPYmplY3ROYW1lcyA9PSBudWxsKSB7CisJCQlpbml0aWFsT2JqZWN0TmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCWZvciAoRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgOiBzdGFuZGFyZFBhY2thZ2UuZ2V0RUNsYXNzaWZpZXJzKCkpIHsKKwkJCQlpZiAoZUNsYXNzaWZpZXIgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKKwkJCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpZUNsYXNzaWZpZXI7CisJCQkJCWlmICghZUNsYXNzLmlzQWJzdHJhY3QoKSkgeworCQkJCQkJaW5pdGlhbE9iamVjdE5hbWVzLmFkZChlQ2xhc3MuZ2V0TmFtZSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCUNvbGxlY3Rpb25zLnNvcnQoaW5pdGlhbE9iamVjdE5hbWVzLCBqYXZhLnRleHQuQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKSk7CisJCX0KKwkJcmV0dXJuIGluaXRpYWxPYmplY3ROYW1lczsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEVPYmplY3QgY3JlYXRlSW5pdGlhbE1vZGVsKCkgeworCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcylzdGFuZGFyZFBhY2thZ2UuZ2V0RUNsYXNzaWZpZXIoaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5nZXRJbml0aWFsT2JqZWN0TmFtZSgpKTsKKwkJRU9iamVjdCByb290T2JqZWN0ID0gc3RhbmRhcmRGYWN0b3J5LmNyZWF0ZShlQ2xhc3MpOworCQlyZXR1cm4gcm9vdE9iamVjdDsKKwl9CisKKwkvKioKKwkgKiBEbyB0aGUgd29yayBhZnRlciBldmVyeXRoaW5nIGlzIHNwZWNpZmllZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgeworCQl0cnkgeworCQkJLy8gR2V0IHRoZSBVUkkgb2YgdGhlIG1vZGVsIGZpbGUuCisJCQkvLworCQkJZmluYWwgVVJJIGZpbGVVUkkgPSBnZXRNb2RlbFVSSSgpOworCQkJaWYgKG5ldyBGaWxlKGZpbGVVUkkudG9GaWxlU3RyaW5nKCkpLmV4aXN0cygpKSB7CisJCQkJaWYgKCFNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbgorCQkJCQkJKGdldFNoZWxsKCksCisJCQkJCQkgRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9RdWVzdGlvbl90aXRsZSIpLCAvLyROT04tTkxTLTEkCisJCQkJCQkgRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9XQVJOX0ZpbGVDb25mbGljdCIsIG5ldyBTdHJpbmcgW117IGZpbGVVUkkudG9GaWxlU3RyaW5nKCkgfSkpKSAvLyROT04tTkxTLTEkCisJCQkJeworCQkJCQlpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlLnNlbGVjdEZpbGVGaWVsZCgpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQkJCisJCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uLgorCQkJLy8KKwkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgeworCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworCQkJCQkJdHJ5IHsKKwkJCQkJCQkvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQKKwkJCQkJCQkvLworCQkJCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOworCisJCQkJCQkJLy8gQ3JlYXRlIGEgcmVzb3VyY2UgZm9yIHRoaXMgZmlsZS4KKwkJCQkJCQkvLworCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoZmlsZVVSSSk7CisKKwkJCQkJCQkvLyBBZGQgdGhlIGluaXRpYWwgbW9kZWwgb2JqZWN0IHRvIHRoZSBjb250ZW50cy4KKwkJCQkJCQkvLworCQkJCQkJCUVPYmplY3Qgcm9vdE9iamVjdCA9IGNyZWF0ZUluaXRpYWxNb2RlbCgpOworCQkJCQkJCWlmIChyb290T2JqZWN0ICE9IG51bGwpIHsKKwkJCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQocm9vdE9iamVjdCk7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gU2F2ZSB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlIHRvIHRoZSBmaWxlIHN5c3RlbS4KKwkJCQkJCQkvLworCQkJCQkJCU1hcDxPYmplY3QsIE9iamVjdD4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOworCQkJCQkJCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5nZXRFbmNvZGluZygpKTsKKwkJCQkJCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOworCQkJCQkJfQorCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCQlEaXNlYXNlbW9kZWxzRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCQkJfQorCQkJCQkJZmluYWxseSB7CisJCQkJCQkJcHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX07CisKKwkJCWdldENvbnRhaW5lcigpLnJ1bihmYWxzZSwgZmFsc2UsIG9wZXJhdGlvbik7CisKKwkJCXJldHVybiBEaXNlYXNlbW9kZWxzRWRpdG9yQWR2aXNvci5vcGVuRWRpdG9yKHdvcmtiZW5jaCwgZmlsZVVSSSk7CQkJCisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCURpc2Vhc2Vtb2RlbHNFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBwYWdlIHdoZXJlIHRoZSB0eXBlIG9mIG9iamVjdCB0byBjcmVhdGUgaXMgc2VsZWN0ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGNsYXNzIFN0YW5kYXJkTW9kZWxXaXphcmRJbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7CisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIFRleHQgZmlsZUZpZWxkOworCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIENvbWJvIGluaXRpYWxPYmplY3RGaWVsZDsKKworCQkvKioKKwkJICogQGdlbmVyYXRlZAorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICovCisJCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gZW5jb2RpbmdzOworCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIENvbWJvIGVuY29kaW5nRmllbGQ7CisKKwkJLyoqCisJCSAqIFBhc3MgaW4gdGhlIHNlbGVjdGlvbi4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBTdGFuZGFyZE1vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZShTdHJpbmcgcGFnZUlkKSB7CisJCQlzdXBlcihwYWdlSWQpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOyB7CisJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQkJCWxheW91dC5udW1Db2x1bW5zID0gMTsKKwkJCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTI7CisJCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7CisJCQl9CisJCQkKKwkJCUxhYmVsIHJlc291cmNlVVJJTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7CisJCQl7CisJCQkJcmVzb3VyY2VVUklMYWJlbC5zZXRUZXh0KERpc2Vhc2Vtb2RlbHNFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRmlsZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJcmVzb3VyY2VVUklMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJfQorCisJCQlDb21wb3NpdGUgZmlsZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCQl7CisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkVORDsKKwkJCQlmaWxlQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7CisKKwkJCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQkJCWxheW91dC5udW1Db2x1bW5zID0gMjsKKwkJCQlmaWxlQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCQkJfQorCisJCQlmaWxlRmllbGQgPSBuZXcgVGV4dChmaWxlQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKKwkJCXsKKwkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOworCQkJCWZpbGVGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJfQorCisJCQlmaWxlRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodmFsaWRhdG9yKTsKKworCQkJQnV0dG9uIHJlc291cmNlVVJJQnJvd3NlRmlsZVN5c3RlbUJ1dHRvbiA9IG5ldyBCdXR0b24oZmlsZUNvbXBvc2l0ZSwgU1dULlBVU0gpOworCQkJcmVzb3VyY2VVUklCcm93c2VGaWxlU3lzdGVtQnV0dG9uLnNldFRleHQoRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Ccm93c2VfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKworCQkJcmVzb3VyY2VVUklCcm93c2VGaWxlU3lzdGVtQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyCisJCQkJKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCQkgQE92ZXJyaWRlCisJCQkJCSBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQkJCQkJIFN0cmluZ1tdIGZpbHRlcnMgPSBTdGFuZGFyZEVkaXRvci5GSUxFX0VYVEVOU0lPTl9GSUxURVJTLnRvQXJyYXkobmV3IFN0cmluZ1tTdGFuZGFyZEVkaXRvci5GSUxFX0VYVEVOU0lPTl9GSUxURVJTLnNpemUoKV0pOworCQkJCQkJIFN0cmluZ1tdIGZpbGVzID0gRGlzZWFzZW1vZGVsc0VkaXRvckFkdmlzb3Iub3BlbkZpbGVQYXRoRGlhbG9nKGdldFNoZWxsKCksIFNXVC5TQVZFLCBmaWx0ZXJzKTsKKwkJCQkJCSBpZiAoZmlsZXMubGVuZ3RoID4gMCkgeworCQkJCQkJCSBmaWxlRmllbGQuc2V0VGV4dChmaWxlc1swXSk7CisJCQkJCQkgfQorCQkJCQkgfQorCQkJCSB9KTsKKwkJCUxhYmVsIGNvbnRhaW5lckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOworCQkJeworCQkJCWNvbnRhaW5lckxhYmVsLnNldFRleHQoRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Nb2RlbE9iamVjdCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJY29udGFpbmVyTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCX0KKworCQkJaW5pdGlhbE9iamVjdEZpZWxkID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJCQl7CisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJCQlpbml0aWFsT2JqZWN0RmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCX0KKworCQkJZm9yIChTdHJpbmcgb2JqZWN0TmFtZSA6IGdldEluaXRpYWxPYmplY3ROYW1lcygpKSB7CisJCQkJaW5pdGlhbE9iamVjdEZpZWxkLmFkZChnZXRMYWJlbChvYmplY3ROYW1lKSk7CisJCQl9CisKKwkJCWlmIChpbml0aWFsT2JqZWN0RmllbGQuZ2V0SXRlbUNvdW50KCkgPT0gMSkgeworCQkJCWluaXRpYWxPYmplY3RGaWVsZC5zZWxlY3QoMCk7CisJCQl9CisJCQlpbml0aWFsT2JqZWN0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodmFsaWRhdG9yKTsKKworCQkJTGFiZWwgZW5jb2RpbmdMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKKwkJCXsKKwkJCQllbmNvZGluZ0xhYmVsLnNldFRleHQoRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9YTUxFbmNvZGluZyIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJZW5jb2RpbmdMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJfQorCQkJZW5jb2RpbmdGaWVsZCA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5CT1JERVIpOworCQkJeworCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCQkJZW5jb2RpbmdGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJfQorCisJCQlmb3IgKFN0cmluZyBlbmNvZGluZyA6IGdldEVuY29kaW5ncygpKSB7CisJCQkJZW5jb2RpbmdGaWVsZC5hZGQoZW5jb2RpbmcpOworCQkJfQorCisJCQllbmNvZGluZ0ZpZWxkLnNlbGVjdCgwKTsKKwkJCWVuY29kaW5nRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodmFsaWRhdG9yKTsKKworCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKKwkJCXNldENvbnRyb2woY29tcG9zaXRlKTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIHZhbGlkYXRvciA9CisJCQluZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisJCQkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7CisJCQkJfQorCQkJfTsKKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKKwkJCVVSSSBmaWxlVVJJID0gZ2V0RmlsZVVSSSgpOworCQkJaWYgKGZpbGVVUkkgPT0gbnVsbCB8fCBmaWxlVVJJLmlzRW1wdHkoKSkgeworCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCVN0cmluZyBleHRlbnNpb24gPSBmaWxlVVJJLmZpbGVFeHRlbnNpb24oKTsKKwkJCWlmIChleHRlbnNpb24gPT0gbnVsbCB8fCAhRklMRV9FWFRFTlNJT05TLmNvbnRhaW5zKGV4dGVuc2lvbikpIHsKKwkJCQlTdHJpbmcga2V5ID0gRklMRV9FWFRFTlNJT05TLnNpemUoKSA+IDEgPyAiX1dBUk5fRmlsZW5hbWVFeHRlbnNpb25zIiA6ICJfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCXNldEVycm9yTWVzc2FnZShEaXNlYXNlbW9kZWxzRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXksIG5ldyBPYmplY3QgW10geyBGT1JNQVRURURfRklMRV9FWFRFTlNJT05TIH0pKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKKwkJCXJldHVybiBnZXRJbml0aWFsT2JqZWN0TmFtZSgpICE9IG51bGwgJiYgZ2V0RW5jb2RpbmdzKCkuY29udGFpbnMoZW5jb2RpbmdGaWVsZC5nZXRUZXh0KCkpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKwkJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7CisJCQlpZiAodmlzaWJsZSkgeworCQkJCWluaXRpYWxPYmplY3RGaWVsZC5jbGVhclNlbGVjdGlvbigpOworCQkJCWVuY29kaW5nRmllbGQuY2xlYXJTZWxlY3Rpb24oKTsKKwkJCQlmaWxlRmllbGQuc2V0Rm9jdXMoKTsKKwkJCX0KKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRJbml0aWFsT2JqZWN0TmFtZSgpIHsKKwkJCVN0cmluZyBsYWJlbCA9IGluaXRpYWxPYmplY3RGaWVsZC5nZXRUZXh0KCk7CisKKwkJCWZvciAoU3RyaW5nIG5hbWUgOiBnZXRJbml0aWFsT2JqZWN0TmFtZXMoKSkgeworCQkJCWlmIChnZXRMYWJlbChuYW1lKS5lcXVhbHMobGFiZWwpKSB7CisJCQkJCXJldHVybiBuYW1lOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgeworCQkJcmV0dXJuIGVuY29kaW5nRmllbGQuZ2V0VGV4dCgpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgVVJJIGdldEZpbGVVUkkoKSB7CisJCQl0cnkgeworCQkJCXJldHVybiBVUkkuY3JlYXRlRmlsZVVSSShmaWxlRmllbGQuZ2V0VGV4dCgpKTsKKwkJCX0KKwkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJLy8gSWdub3JlCisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHZvaWQgc2VsZWN0RmlsZUZpZWxkKCkgeworCQkJCWluaXRpYWxPYmplY3RGaWVsZC5jbGVhclNlbGVjdGlvbigpOworCQkJCWVuY29kaW5nRmllbGQuY2xlYXJTZWxlY3Rpb24oKTsKKwkJCQlmaWxlRmllbGQuc2VsZWN0QWxsKCk7CisJCQkJZmlsZUZpZWxkLnNldEZvY3VzKCk7CisJCX0JCQorCisJCS8qKgorCQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIG5hbWUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKFN0cmluZyB0eXBlTmFtZSkgeworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gRGlzZWFzZW1vZGVsc0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfIiArIHR5cGVOYW1lICsgIl90eXBlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJfQorCQkJY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkgeworCQkJCURpc2Vhc2Vtb2RlbHNFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKG1yZSk7CisJCQl9CisJCQlyZXR1cm4gdHlwZU5hbWU7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0RW5jb2RpbmdzKCkgeworCQkJaWYgKGVuY29kaW5ncyA9PSBudWxsKSB7CisJCQkJZW5jb2RpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihEaXNlYXNlbW9kZWxzRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1hNTEVuY29kaW5nQ2hvaWNlcyIpKTsgc3RyaW5nVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgKSAvLyROT04tTkxTLTEkCisJCQkJeworCQkJCQllbmNvZGluZ3MuYWRkKHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKSk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGVuY29kaW5nczsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoZSBmcmFtZXdvcmsgY2FsbHMgdGhpcyB0byBjcmVhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSB3aXphcmQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7CisJCWluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UgPSBuZXcgU3RhbmRhcmRNb2RlbFdpemFyZEluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UoIldoYXRldmVyMiIpOyAvLyROT04tTkxTLTEkCisJCWluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2Uuc2V0VGl0bGUoRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZE1vZGVsV2l6YXJkX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCWluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2Uuc2V0RGVzY3JpcHRpb24oRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkUGFnZShpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlKTsKKwl9CisKKwkJLyoqCisJICogR2V0IHRoZSBVUkkgZnJvbSB0aGUgcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJCXB1YmxpYyBVUkkgZ2V0TW9kZWxVUkkoKSB7CisJCXJldHVybiBpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlLmdldEZpbGVVUkkoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9JbnRlbnNpdHlDb2xvcnNMYWJlbHNNYXBwaW5nQ29sb3JQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL0ludGVuc2l0eUNvbG9yc0xhYmVsc01hcHBpbmdDb2xvclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczNTk3YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9JbnRlbnNpdHlDb2xvcnNMYWJlbHNNYXBwaW5nQ29sb3JQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8vIEludGVuc2l0eUNvbG9yc0xhYmVsc01hcHBpbmdDb2xvclByb3ZpZGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHdpbGwgcHJvdmlkZSBhbiBTRUlSIHJlbGF0aXZlCisgKiB2YWx1ZSBmb3IgYSBzcGVjaWZpYyBhZGFwdGVkIG9iamVjdCAodXN1YWxseQorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlfSkuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSW50ZW5zaXR5Q29sb3JzTGFiZWxzTWFwcGluZ0NvbG9yUHJvdmlkZXIgZXh0ZW5kcworCQlSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlciB7CisJLy8gTWFya2VyIGludGVyZmFjZQorfS8vIEludGVuc2l0eUNvbG9yc0xhYmVsc01hcHBpbmdDb2xvclByb3ZpZGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvSW50ZW5zaXR5Q29sb3JzTGFiZWxzTWFwcGluZ0NvbG9yUHJvdmlkZXJBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvSW50ZW5zaXR5Q29sb3JzTGFiZWxzTWFwcGluZ0NvbG9yUHJvdmlkZXJBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkOGIwNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9JbnRlbnNpdHlDb2xvcnNMYWJlbHNNYXBwaW5nQ29sb3JQcm92aWRlckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLy8gSW50ZW5zaXR5Q29sb3JzTGFiZWxzTWFwcGluZ0NvbG9yUHJvdmlkZXJBZGFwdGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY05vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucG9wdWxhdGlvbi5Qb3B1bGF0aW9uRW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnBvcHVsYXRpb24uUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucG9wdWxhdGlvbi5Qb3B1bGF0aW9uRW51bWVyYXRvckFkYXB0ZXJGYWN0b3J5LlBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlckZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5EZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWxMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLkFic3RyYWN0UmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5Qcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7CisKKy8qKgorICogVGhpcyBjbGFzcyBhZGFwdHMge0BsaW5rIE5vZGV9IG9iamVjdHMgdG8KKyAqIHtAbGluayBJbnRlbnNpdHlDb2xvcnNMYWJlbHNNYXBwaW5nQ29sb3JQcm92aWRlcn0gb2JqZWN0LgorICovCitwdWJsaWMgY2xhc3MgSW50ZW5zaXR5Q29sb3JzTGFiZWxzTWFwcGluZ0NvbG9yUHJvdmlkZXJBZGFwdGVyIGV4dGVuZHMKKwkJQWJzdHJhY3RSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyeworCS8qKgorCSAqIGRlZmF1bHQge0BsaW5rIEFscGhhQ29tcG9zaXRlfQorCSAqLworCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWxwaGFDb21wb3NpdGUgT05FX0NPTVBPU0lURSA9IG1ha2VDb21wb3NpdGUoMSk7CisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBDb2xvcj4gY29sb3JNYXAgPSBWaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UuZ2V0Q29sb3JNYXBwaW5nKCk7CisJcHJpdmF0ZSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHNlbGVjdGVkUHJvcGVydHk7CisKKwkvKioKKwkgKiAgQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgSW50ZW5zaXR5Q29sb3JzTGFiZWxzTWFwcGluZ0NvbG9yUHJvdmlkZXJBZGFwdGVyKCkgeworCQlzdXBlcigpOworCX0gLy8gSW50ZW5zaXR5Q29sb3JzTGFiZWxzTWFwcGluZ0NvbG9yUHJvdmlkZXJBZGFwdGVyCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuQWJzdHJhY3RSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIjZ2V0UmVsYXRpdmVWYWx1ZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGZsb2F0IGdldFJlbGF0aXZlVmFsdWUoKSB7CisJCQorCQlmaW5hbCBOb2RlIG5vZGUgPSAoTm9kZSkgZ2V0VGFyZ2V0KCk7CisJCQorCQlmb3IgKGZpbmFsIE5vZGVMYWJlbCBsYWJlbCA6IG5vZGUuZ2V0TGFiZWxzKCkpIHsKKwkJCWlmIChsYWJlbCBpbnN0YW5jZW9mIER5bmFtaWNOb2RlTGFiZWwpIHsKKwkJCQlEeW5hbWljTm9kZUxhYmVsIG5vZGVMYWJlbCA9IChEeW5hbWljTm9kZUxhYmVsKWxhYmVsOworCQkJCWlmIChub2RlTGFiZWwuZ2V0RGVjb3JhdG9yKCkgPT0gc2VsZWN0ZWREZWNvcmF0b3IpIHsKKwkJCQkJaWYoc2VsZWN0ZWREZWNvcmF0b3IgaW5zdGFuY2VvZiBEaXNlYXNlTW9kZWwpIHsKKwkJCQkJCWlmKG5vZGVMYWJlbCBpbnN0YW5jZW9mIERpc2Vhc2VNb2RlbExhYmVsKSB7CisJCQkJCQkJaWYoISgoRGlzZWFzZU1vZGVsTGFiZWwpbm9kZUxhYmVsKS5nZXRQb3B1bGF0aW9uTW9kZWxMYWJlbCgpLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkuZXF1YWxzKHNlbGVjdGVkUG9wdWxhdGlvbklkZW50aWZpZXIpKQorCQkJCQkJCQljb250aW51ZTsgLy8gd3JvbmcgcG9wdWxhdGlvbiBpZGVudGlmaWVyCQkJCisJCQkJCQl9CisJCQkJCX0gCisJCQkJCWVsc2UgaWYoc2VsZWN0ZWREZWNvcmF0b3IgaW5zdGFuY2VvZiBQb3B1bGF0aW9uTW9kZWwpIHsKKwkJCQkJCVN0cmluZyBwb3BJZCA9IHNlbGVjdGVkUG9wdWxhdGlvbklkZW50aWZpZXI7CisJCQkJCQlpZihub2RlTGFiZWwgaW5zdGFuY2VvZiBQb3B1bGF0aW9uTW9kZWxMYWJlbCkgeworCQkJCQkJCWlmKCEgKChQb3B1bGF0aW9uTW9kZWxMYWJlbClub2RlTGFiZWwpLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkuZXF1YWxzKHBvcElkKSkKKwkJCQkJCQkJY29udGludWU7IC8vIHdyb25nIHBvcHVsYXRpb24gaWRlbnRpZmllcgorCQkJCQkJfQorCQkJCQl9CisJCQkJCXNldFJWUFRhcmdldChub2RlTGFiZWwpOworCQkJCQlyZXR1cm4gKGZsb2F0KSBydnAuZ2V0UmVsYXRpdmVWYWx1ZShzZWxlY3RlZFByb3BlcnR5KTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gMDsgLy8gV2Ugc2hvdWxkbid0IHJlYWNoIHRoaXMgcG9pbnQKKwl9IC8vIGdldFJlbGF0aXZlVmFsdWUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5BYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlciN1cGRhdGVHQyhHQywgZmxvYXQsIGJvb2xlYW4pCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlR0MoZmluYWwgR0MgZ2NUb1VwZGF0ZSwKKwkJCWZpbmFsIGZsb2F0IGdhaW5GYWN0b3IsIGZpbmFsIGJvb2xlYW4gdXNlTG9nU2NhbGluZykgeworCisJCWZpbmFsIFN0cmluZyBzZWxlY3RlZFByb3BlcnR5TmFtZSA9IHNlbGVjdGVkUHJvcGVydHkuZ2V0RGlzcGxheU5hbWUobnVsbCk7CisKKwkJLy8gR2V0IHRoZSBjb2xvciBmb3IgdGhlIHNlbGVjdGVkIHByb3BlcnR5IChsYWJlbCkKKwkJaWYgKGNvbG9yTWFwLmNvbnRhaW5zS2V5KHNlbGVjdGVkUHJvcGVydHlOYW1lKSkgeworCQkJZm9yZWdyb3VuZEZpbGxDb2xvciA9IGNvbG9yTWFwLmdldChzZWxlY3RlZFByb3BlcnR5TmFtZSk7CisJCX0KKworCQkvLyBVcGRhdGUgdGhlIEcyRCBvYmplY3Qgd2l0aCB0aGUgYXBwcm9wcmlhdGUgaW50ZW5zaXR5IG9mIHRoZSBjb2xvcgorCQlmbG9hdCBhbHBoYSA9IGdldFJlbGF0aXZlVmFsdWUoKTsKKwkJYWxwaGEgKj0gZ2FpbkZhY3RvcjsKKwkJLy8gU0VEIDgvNC8yMDA5LiBNYWtlIHN1cmUgYWxwaGEgaXMgYmV0d2VlbiAwIGFuZCAxCisJCWlmKGFscGhhID4gMS4wKSBhbHBoYSA9IDEuMGY7CisJCWlmKGFscGhhIDwgMC4wKSBhbHBoYSA9IDAuMGY7IC8vIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJaWYgKGFscGhhIDwgWkVST19SRUxBVElWRV9WQUxVRV9USFJFU0hPTEQpIHsKKwkJCWdjVG9VcGRhdGUuc2V0QWxwaGEoMjU1KTsKKwkJCS8vIE5PVEU6IHRoaXMgYWxsb3dzIGEgYmFja2dyb3VuZCBjb2xvciBkaWZmZXJlbnQgZnJvbSB0aGUgb2NlYW4gY29sb3IgKEpISykKKwkJCWdjVG9VcGRhdGUuc2V0QmFja2dyb3VuZCh6ZXJvX0ZpbGxDb2xvcik7CisJCQkvL2djVG9VcGRhdGUuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kRmlsbENvbG9yKTsKKworCQl9IGVsc2UgeworCQkJaWYgKHVzZUxvZ1NjYWxpbmcgPT0gdHJ1ZSkgeworCQkJCWFscGhhID0gcGVyZm9ybUxvZ1NjYWxpbmcoYWxwaGEpOworCQkJfSAKKwkJCS8vVE9ETyBUYWtlIGNhcmUgb2YgZ2FpbiBmYWN0b3IKKwkJCWdjVG9VcGRhdGUuc2V0QWxwaGEoKGludCkoYWxwaGEgKiAyNTUpKTsKKwkJCWdjVG9VcGRhdGUuc2V0QmFja2dyb3VuZChmb3JlZ3JvdW5kRmlsbENvbG9yKTsKKwkJfQorCX0gLy8gc2V0RzJEQ29sb3IKKworLy8JLyoqCisvLwkgKiBAcGFyYW0gYWxwaGEKKy8vCSAqIEByZXR1cm4KKy8vCSAqLworLy8JcHJpdmF0ZSBzdGF0aWMgQWxwaGFDb21wb3NpdGUgbWFrZUNvbXBvc2l0ZShmaW5hbCBmbG9hdCBhbHBoYSkgeworLy8JCXJldHVybiAoQWxwaGFDb21wb3NpdGUuZ2V0SW5zdGFuY2UoQWxwaGFDb21wb3NpdGUuU1JDX09WRVIsIGFscGhhKSk7CisvLwl9IC8vIG1ha2VDb21wb3NpdGUKKworCS8qKgorCSAqIEBwYXJhbSB2CisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgZmxvYXQgcGVyZm9ybUxvZ1NjYWxpbmcoZmluYWwgZmxvYXQgdikgeworCQlkb3VibGUgdkRvdWJsZSA9IHY7CisJCS8vIG1ha2Ugc3VyZSBvdXIgbGluZWFyIHNjYWxlIGlzIGEgZnJhY3Rpb24gYmV0d2VlbiAwLjAgYW5kIDEuMAorCQlpZiAodkRvdWJsZSA+IDEuMCkgeworCQkJdkRvdWJsZSA9IDEuMDsgLy8gc2F0dXJhdGlvbgorCQl9IGVsc2UgaWYgKHYgPCAwLjApIHsKKwkJCXZEb3VibGUgPSAwLjA7IC8vIHNob3VsZCBub3QgaGFwcGVuCisJCX0KKworCQkvLyBsb2dhcml0aG1pYyBjb2xvciBkaXNwbGF5CisJCS8vIHNldCBzY2FsZSAxLjAgdG8gMTAwLjAKKwkJZG91YmxlIHZTY2FsZWQxMDAgPSB2RG91YmxlICogOTkuMDsKKwkJLy8gYWRkIDEuMCBzbyB3ZSBoYXZlIG5vIHplcm9zCisJCXZTY2FsZWQxMDAgKz0gMS4wOworCQkvLyB0YWtlIHRoZSBsb2cgYmFzZSAxMC4wCisJCWRvdWJsZSBuZXdWID0gTWF0aC5sb2cxMCh2U2NhbGVkMTAwKTsKKwkJLy8gd2Ugbm93IGhhdmUgYSBudW1iZXIgYmV0d2VlbiAxIGFuZCAyIHNvIGRpdmlkZSBieSAyCisJCW5ld1YgLz0gMi4wOworCisJCXJldHVybiAoZmxvYXQpIG5ld1Y7CisJfSAvLyBwZXJmb3JtTG9nU2NhbGluZworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLkludGVuc2l0eUNvbG9yc0xhYmVsc01hcHBpbmdDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkuUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lciNwcm9wZXJ0eVNlbGVjdGVkKG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpCisJICovCisJcHVibGljIHZvaWQgcHJvcGVydHlTZWxlY3RlZChJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHNlbGVjdGVkUHJvcGVydHkpIHsKKwkJdGhpcy5zZWxlY3RlZFByb3BlcnR5ID0gc2VsZWN0ZWRQcm9wZXJ0eTsJCQorCX0KKworfSAvLyBJbnRlbnNpdHlDb2xvcnNMYWJlbHNNYXBwaW5nQ29sb3JQcm92aWRlckFkYXB0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9JbnRlbnNpdHlDb2xvcnNMYWJlbHNNYXBwaW5nQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvSW50ZW5zaXR5Q29sb3JzTGFiZWxzTWFwcGluZ0NvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTc1OTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvSW50ZW5zaXR5Q29sb3JzTGFiZWxzTWFwcGluZ0NvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvLyBJbnRlbnNpdHlDb2xvcnNMYWJlbHNNYXBwaW5nQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2lkZ2V0cy5Db2xvclByb3ZpZGVyUHJvcGVydGllc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuQ29sb3JQcm92aWRlclByb3BlcnRpZXNDb21wb3NpdGUuUHJvcGVydHlTZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBmYWN0b3J5IGNyZWF0ZSBhZGFwdGVycyB0aGF0IGFkYXB0CisgKiB7QGxpbmsgIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlfXMgdG8KKyAqIHtAbGluayBJbnRlbnNpdHlDb2xvcnNMYWJlbHNNYXBwaW5nQ29sb3JQcm92aWRlcn1zLgorICovCitwdWJsaWMgY2xhc3MgSW50ZW5zaXR5Q29sb3JzTGFiZWxzTWFwcGluZ0NvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCUFic3RyYWN0UmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudXRpbC5HcmFwaEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZU5vZGVBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVOb2RlQWRhcHRlcigpIHsKKwkJZmluYWwgSW50ZW5zaXR5Q29sb3JzTGFiZWxzTWFwcGluZ0NvbG9yUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAKKwkJCW5ldyBJbnRlbnNpdHlDb2xvcnNMYWJlbHNNYXBwaW5nQ29sb3JQcm92aWRlckFkYXB0ZXIoKTsKKwkJYWRkUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcihhZGFwdGVyKTsKKwkJYWRhcHRlci5wcm9wZXJ0eVNlbGVjdGVkKHNlbGVjdGVkUHJvcGVydHkpOworCQlyZXR1cm4gYWRhcHRlcjsKKwl9IC8vIGNyZWF0ZU5vZGVBZGFwdGVyCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuQWJzdHJhY3RSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKGZpbmFsIE9iamVjdCB0eXBlKSB7CisJCXJldHVybiB0eXBlID09IEludGVuc2l0eUNvbG9yc0xhYmVsc01hcHBpbmdDb2xvclByb3ZpZGVyLmNsYXNzOworCX0gLy8gaXNGYWN0b3J5Rm9yVHlwZQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5JQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb3BlcnRpZXNDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBpbnQsIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IpCisJICovCisJcHVibGljIENvbXBvc2l0ZSBjcmVhdGVQcm9wZXJ0aWVzQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIGludCBzdHlsZSwgZmluYWwgRGVjb3JhdG9yIHNlbGVjdGVkRGVjb3JhdG9yKQorCXsJCisJCWZpbmFsIENvbG9yUHJvdmlkZXJQcm9wZXJ0aWVzQ29tcG9zaXRlIHByb3BlcnRpZXNDb21wb3NpdGUgPSBuZXcgQ29sb3JQcm92aWRlclByb3BlcnRpZXNDb21wb3NpdGUoCisJCQkJcGFyZW50LCBzdHlsZSk7CisJCXByb3BlcnRpZXNDb21wb3NpdGUuc2V0SW5pdGlhbFByb3BlcnR5TmFtZShnZXRQcmVmZXJlbmNlVmFsdWUoUHJlZmVyZW5jZUNvbnN0YW50cy5JTklUSUFMX0FUVFJJQlVURV9OQU1FX1NUUklOR19QUkVGRVJFTkNFKSk7CisJCXByb3BlcnRpZXNDb21wb3NpdGUuaW5pdGlhbGl6ZShzZWxlY3RlZERlY29yYXRvcik7CisJCXNlbGVjdGVkUHJvcGVydHkgPSBwcm9wZXJ0aWVzQ29tcG9zaXRlLmdldFNlbGVjdGVkUHJvcGVydHkoKTsKKwkJcHJvcGVydGllc0NvbXBvc2l0ZQorCQkJCS5hZGRQcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyKG5ldyBDb2xvclByb3ZpZGVyUHJvcGVydGllc0NvbXBvc2l0ZS5Qcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVNlbGVjdGVkKAorCQkJCQkJCWZpbmFsIFByb3BlcnR5U2VsZWN0aW9uRXZlbnQgcHJvcGVydHlTZWxlY3Rpb25FdmVudCkgeworCQkJCQkJZmlyZVByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIocHJvcGVydHlTZWxlY3Rpb25FdmVudC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJfQorCQkJCX0pOworCQl0aGlzLnByb3BlcnRpZXNDb21wb3NpdGUgPSBwcm9wZXJ0aWVzQ29tcG9zaXRlOworCQlyZXR1cm4gcHJvcGVydGllc0NvbXBvc2l0ZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuQWJzdHJhY3RSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUNvbG9yc0xlZ2VuZENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCisJICogICAgICBpbnQpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb2xvcnNMZWdlbmRDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwKKwkJCWZpbmFsIGludCBzdHlsZSkgeworCQlmaW5hbCBDb2xvcnNMZWdlbmRDb21wb3NpdGUgY29sb3JzTGVnZW5kQ29tcG9zaXRlID0gbmV3IENvbG9yc0xlZ2VuZENvbXBvc2l0ZSgKKwkJCQlwYXJlbnQsIHN0eWxlKTsKKwkJY29sb3JzTGVnZW5kQ29tcG9zaXRlLmFkZENvbG9yRW50cnkoCisJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5GT1JFR1JPVU5EX0NPTE9SX0xBQkVMXzEsCisJCQkJVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlLkZPUkVHUk9VTkRfQVRUUklCVVRFX05BTUVfMV9TVFJJTkcpOworCQljb2xvcnNMZWdlbmRDb21wb3NpdGUuYWRkQ29sb3JFbnRyeSgKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfQ09MT1JfTEFCRUxfMiwKKwkJCQlWaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UuRk9SRUdST1VORF9BVFRSSUJVVEVfTkFNRV8yX1NUUklORyk7CisJCWNvbG9yc0xlZ2VuZENvbXBvc2l0ZS5hZGRDb2xvckVudHJ5KAorCQkJCVByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9DT0xPUl9MQUJFTF8zLAorCQkJCVZpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZS5GT1JFR1JPVU5EX0FUVFJJQlVURV9OQU1FXzNfU1RSSU5HKTsKKwkJY29sb3JzTGVnZW5kQ29tcG9zaXRlLmFkZENvbG9yRW50cnkoCisJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5GT1JFR1JPVU5EX0NPTE9SX0xBQkVMXzQsCisJCQkJVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlLkZPUkVHUk9VTkRfQVRUUklCVVRFX05BTUVfNF9TVFJJTkcpOworCQljb2xvcnNMZWdlbmRDb21wb3NpdGUuYWRkQ29sb3JFbnRyeSgKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfQ09MT1JfTEFCRUxfNSwKKwkJCQlWaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UuRk9SRUdST1VORF9BVFRSSUJVVEVfTkFNRV81X1NUUklORyk7CisJCWNvbG9yc0xlZ2VuZENvbXBvc2l0ZS5hZGRDb2xvckVudHJ5KAorCQkJCVByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9DT0xPUl9MQUJFTF82LAorCQkJCVZpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZS5GT1JFR1JPVU5EX0FUVFJJQlVURV9OQU1FXzZfU1RSSU5HKTsKKwkJcmV0dXJuIGNvbG9yc0xlZ2VuZENvbXBvc2l0ZTsKKwl9IC8vIGNyZWF0ZUNvbG9yc0xlZ2VuZENvbXBvc2l0ZQorCit9IC8vIEludGVuc2l0eUNvbG9yc0xhYmVsc01hcHBpbmdDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9TRUlSUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9TRUlSUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2YxNTNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL1NFSVJSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8vIFNFSVJSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCB3aWxsIHByb3ZpZGUgYW4gU0VJUiByZWxhdGl2ZQorICogdmFsdWUgZm9yIGEgc3BlY2lmaWMgYWRhcHRlZCBvYmplY3QgKHVzdWFsbHkKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZX0pLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFNFSVJSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlciBleHRlbmRzCisJCVJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyIHsKKwkvLyBNYXJrZXIgaW50ZXJmYWNlCit9Ly8gU0VJUlJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvU0VJUlJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL1NFSVJSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjY4Y2IzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL1NFSVJSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDgxIEBACisvLyBTRUlSUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5BYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkuUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOworCisvKioKKyAqIFRoaXMgY2xhc3MgYWRhcHRzIHtAbGluayBOb2RlfSBvYmplY3RzIHRvCisgKiB7QGxpbmsgU0VJUlJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyfSBvYmplY3QuCisgKi8KK3B1YmxpYyBjbGFzcyBTRUlSUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyIGV4dGVuZHMKKwkJQWJzdHJhY3RSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIgIGltcGxlbWVudHMgUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcnsKKwkKKwlwcml2YXRlIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3Igc2VsZWN0ZWRQcm9wZXJ0eTsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICogQHBhcmFtIHNlbGVjdGVkUHJvcGVydHkKKwkgKi8KKwlwdWJsaWMgU0VJUlJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlcihJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHNlbGVjdGVkUHJvcGVydHkpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5zZWxlY3RlZFByb3BlcnR5ID0gc2VsZWN0ZWRQcm9wZXJ0eTsKKwl9IC8vIFNFSVJSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5BYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlciNnZXRSZWxhdGl2ZVZhbHVlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgZmxvYXQgZ2V0UmVsYXRpdmVWYWx1ZSgpIHsKKworCQlmaW5hbCBOb2RlIG5vZGUgPSAoTm9kZSkgZ2V0VGFyZ2V0KCk7CisJCQorCQlmb3IgKGZpbmFsIE5vZGVMYWJlbCBsYWJlbCA6IG5vZGUuZ2V0TGFiZWxzKCkpIHsKKwkJCWlmIChsYWJlbCBpbnN0YW5jZW9mIER5bmFtaWNOb2RlTGFiZWwpIHsKKwkJCQlEeW5hbWljTm9kZUxhYmVsIG5vZGVMYWJlbCA9IChEeW5hbWljTm9kZUxhYmVsKWxhYmVsOworCQkJCWlmIChub2RlTGFiZWwuZ2V0RGVjb3JhdG9yKCkgPT0gc2VsZWN0ZWREZWNvcmF0b3IpIHsKKwkJCQkJc2V0UlZQVGFyZ2V0KG5vZGVMYWJlbCk7CisJCQkJCXJldHVybiAoZmxvYXQpIHJ2cC5nZXRSZWxhdGl2ZVZhbHVlKHNlbGVjdGVkUHJvcGVydHkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiAwOyAvLyBXZSBzaG91bGRuJ3QgcmVhY2ggdGhpcyBwb2ludAorCX0gLy8gZ2V0UmVsYXRpdmVWYWx1ZQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5BYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlciN1cGRhdGVHQyhvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsIGZsb2F0LCBib29sZWFuKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZUdDKEdDIGdjVG9VcGRhdGUsIGZsb2F0IGdhaW5GYWN0b3IsIGJvb2xlYW4gdXNlTG9nU2NhbGluZykgeworCQlkZXZpY2UgPSBnY1RvVXBkYXRlLmdldERldmljZSgpOworCQlkb3VibGUgcmVsYXRpdmVWYWx1ZSA9IGdldFJlbGF0aXZlVmFsdWUoKTsKKwkJZG91YmxlIGdhaW5lZFJlbGF0aXZlVmFsdWUgPSBnYWluRmFjdG9yICogcmVsYXRpdmVWYWx1ZTsKKwkJQ29sb3IgZm9yZWdyb3VuZCA9IGdldENvbG9yRm9yUmVsYXRpdmVWYWx1ZShnYWluZWRSZWxhdGl2ZVZhbHVlKTsKKwkJZ2NUb1VwZGF0ZS5zZXRCYWNrZ3JvdW5kKGZvcmVncm91bmQpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuSW50ZW5zaXR5Q29sb3JzTGFiZWxzTWFwcGluZ0NvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5Qcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyI3Byb3BlcnR5U2VsZWN0ZWQob3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcm9wZXJ0eVNlbGVjdGVkKEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3Igc2VsZWN0ZWRQcm9wZXJ0eSkgeworCQl0aGlzLnNlbGVjdGVkUHJvcGVydHkgPSBzZWxlY3RlZFByb3BlcnR5OwkJCisJfQorCit9IC8vIFNFSVJSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9TRUlSUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL1NFSVJSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiMjkzMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9TRUlSUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvLyBTRUlSUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuQ29sb3JQcm92aWRlclByb3BlcnRpZXNDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aWRnZXRzLkNvbG9yUHJvdmlkZXJQcm9wZXJ0aWVzQ29tcG9zaXRlLlByb3BlcnR5U2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgZmFjdG9yeSBjcmVhdGUgYWRhcHRlcnMgdGhhdCBhZGFwdCB7QGxpbmsgIE5vZGV9cyB0bworICoge0BsaW5rIFNFSVJSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlcn1zLgorICovCitwdWJsaWMgY2xhc3MgU0VJUlJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcworCQlBYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkgeyAKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnV0aWwuR3JhcGhBZGFwdGVyRmFjdG9yeSNjcmVhdGVOb2RlQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTm9kZUFkYXB0ZXIoKSB7CisJCWZpbmFsIFNFSVJSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IAorCQkJbmV3IFNFSVJSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIoc2VsZWN0ZWRQcm9wZXJ0eSk7CisJCWFkZFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIoYWRhcHRlcik7CisJCWFkYXB0ZXIucHJvcGVydHlTZWxlY3RlZChzZWxlY3RlZFByb3BlcnR5KTsKKwkJcmV0dXJuIGFkYXB0ZXI7CisJfSAvLyBjcmVhdGVOb2RlQWRhcHRlcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLkFic3RyYWN0UmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShmaW5hbCBPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gdHlwZSA9PSBTRUlSUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXIuY2xhc3M7CisJfSAvLyBpc0ZhY3RvcnlGb3JUeXBlCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLklDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvcGVydGllc0NvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIGludCwgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcikKKwkgKi8KKwlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZVByb3BlcnRpZXNDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgaW50IHN0eWxlLCBmaW5hbCBEZWNvcmF0b3Igc2VsZWN0ZWREZWNvcmF0b3IpCisJewkKKwkJZmluYWwgQ29sb3JQcm92aWRlclByb3BlcnRpZXNDb21wb3NpdGUgcHJvcGVydGllc0NvbXBvc2l0ZSA9IG5ldyBDb2xvclByb3ZpZGVyUHJvcGVydGllc0NvbXBvc2l0ZSgKKwkJCQlwYXJlbnQsIHN0eWxlKTsKKwkJcHJvcGVydGllc0NvbXBvc2l0ZS5zZXRJbml0aWFsUHJvcGVydHlOYW1lKGdldFByZWZlcmVuY2VWYWx1ZShQcmVmZXJlbmNlQ29uc3RhbnRzLklOSVRJQUxfQVRUUklCVVRFX05BTUVfU1RSSU5HX1BSRUZFUkVOQ0UpKTsKKwkJcHJvcGVydGllc0NvbXBvc2l0ZS5pbml0aWFsaXplKHNlbGVjdGVkRGVjb3JhdG9yKTsKKwkJc2VsZWN0ZWRQcm9wZXJ0eSA9IHByb3BlcnRpZXNDb21wb3NpdGUuZ2V0U2VsZWN0ZWRQcm9wZXJ0eSgpOworCQlwcm9wZXJ0aWVzQ29tcG9zaXRlCisJCQkJLmFkZFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIobmV3IENvbG9yUHJvdmlkZXJQcm9wZXJ0aWVzQ29tcG9zaXRlLlByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5U2VsZWN0ZWQoCisJCQkJCQkJZmluYWwgUHJvcGVydHlTZWxlY3Rpb25FdmVudCBwcm9wZXJ0eVNlbGVjdGlvbkV2ZW50KSB7CisJCQkJCQlmaXJlUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcihwcm9wZXJ0eVNlbGVjdGlvbkV2ZW50LmdldFByb3BlcnR5KCkpOworCQkJCQl9CisJCQkJfSk7CisJCXRoaXMucHJvcGVydGllc0NvbXBvc2l0ZSA9IHByb3BlcnRpZXNDb21wb3NpdGU7CisJCXJldHVybiBwcm9wZXJ0aWVzQ29tcG9zaXRlOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5BYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQ29sb3JzTGVnZW5kQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKKwkgKiAgICAgIGludCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbG9yc0xlZ2VuZENvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50LAorCQkJZmluYWwgaW50IHN0eWxlKSB7CisJCWZpbmFsIENvbG9yc0xlZ2VuZENvbXBvc2l0ZSBjb2xvcnNMZWdlbmRDb21wb3NpdGUgPSBuZXcgQ29sb3JzTGVnZW5kQ29tcG9zaXRlKAorCQkJCXBhcmVudCwgc3R5bGUpOworCQljb2xvcnNMZWdlbmRDb21wb3NpdGUKKwkJCQkuYWRkQ29sb3JFbnRyeSgKKwkJCQkJCVJlbGF0aXZlVmFsdWVDb2xvclByZWZlcmVuY2VzLkZPUkVHUk9VTkRfQ09MT1JfWkVST19SRUxBVElWRV9WQUxVRV9JRCwKKwkJCQkJCSJSZWxhdGl2ZSB2YWx1ZSBpcyAwIik7CisJCWNvbG9yc0xlZ2VuZENvbXBvc2l0ZS5hZGRDb2xvckVudHJ5KAorCQkJCVJlbGF0aXZlVmFsdWVDb2xvclByZWZlcmVuY2VzLkZPUkVHUk9VTkRfQ09MT1JfUkFOR0VfMV9JRCwKKwkJCQkiUmVsYXRpdmUgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjIiKTsKKwkJY29sb3JzTGVnZW5kQ29tcG9zaXRlLmFkZENvbG9yRW50cnkoCisJCQkJUmVsYXRpdmVWYWx1ZUNvbG9yUHJlZmVyZW5jZXMuRk9SRUdST1VORF9DT0xPUl9SQU5HRV8yX0lELAorCQkJCSJSZWxhdGl2ZSB2YWx1ZSBiZXR3ZWVuIDAuMiBhbmQgMC40Iik7CisJCWNvbG9yc0xlZ2VuZENvbXBvc2l0ZS5hZGRDb2xvckVudHJ5KAorCQkJCVJlbGF0aXZlVmFsdWVDb2xvclByZWZlcmVuY2VzLkZPUkVHUk9VTkRfQ09MT1JfUkFOR0VfM19JRCwKKwkJCQkiUmVsYXRpdmUgdmFsdWUgYmV0d2VlbiAwLjQgYW5kIDAuNiIpOworCQljb2xvcnNMZWdlbmRDb21wb3NpdGUuYWRkQ29sb3JFbnRyeSgKKwkJCQlSZWxhdGl2ZVZhbHVlQ29sb3JQcmVmZXJlbmNlcy5GT1JFR1JPVU5EX0NPTE9SX1JBTkdFXzRfSUQsCisJCQkJIlJlbGF0aXZlIHZhbHVlIGJldHdlZW4gMC42IGFuZCAwLjgiKTsKKwkJY29sb3JzTGVnZW5kQ29tcG9zaXRlLmFkZENvbG9yRW50cnkoCisJCQkJUmVsYXRpdmVWYWx1ZUNvbG9yUHJlZmVyZW5jZXMuRk9SRUdST1VORF9DT0xPUl9SQU5HRV81X0lELAorCQkJCSJSZWxhdGl2ZSB2YWx1ZSBiZXR3ZWVuIDAuOCBhbmQgMSIpOworCQljb2xvcnNMZWdlbmRDb21wb3NpdGUKKwkJCQkuYWRkQ29sb3JFbnRyeSgKKwkJCQkJCVJlbGF0aXZlVmFsdWVDb2xvclByZWZlcmVuY2VzLkZPUkVHUk9VTkRfQ09MT1JfTUFYSU1VTV9SRUxBVElWRV9WQUxVRV9JRCwKKwkJCQkJCSJSZWxhdGl2ZSB2YWx1ZSBpcyAxIChtYXhpbXVtKSIpOworCQlyZXR1cm4gY29sb3JzTGVnZW5kQ29tcG9zaXRlOworCX0gLy8gY3JlYXRlQ29sb3JzTGVnZW5kQ29tcG9zaXRlCisKK30gLy8gU0VJUlJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9kaXNlYXNlbW9kZWxwcm9wZXJ0eWVkaXRvci9EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2Rpc2Vhc2Vtb2RlbHByb3BlcnR5ZWRpdG9yL0Rpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyZjgzYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9kaXNlYXNlbW9kZWxwcm9wZXJ0eWVkaXRvci9EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvci5qYXZhCkBAIC0wLDAgKzEsMjMyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZGlzZWFzZW1vZGVscHJvcGVydHllZGl0b3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TRUlSOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU0lSOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZERpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFN0b2NoYXN0aWNEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0b2NoYXN0aWNEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5lZGl0b3JzLkdlbmVyaWNQcm9wZXJ0eUVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuTWF0cml4RWRpdG9yV2lkZ2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5EaXNlYXNlV2l6YXJkTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworYWJzdHJhY3QgcHVibGljIGNsYXNzIERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yIGV4dGVuZHMgR2VuZXJpY1Byb3BlcnR5RWRpdG9yIHsKKworCS8qKgorCSAqIEBwYXJhbSBmZWF0dXJlCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmVhdHVyZSBpcyBhIGR1YmxpbiBjb3JlIGZlYXR1cmUgdGhhdAorCSAqICAgICAgICAgaXMgc3BlY2lmaWVkIGJ5IGEgdXNlci4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1VzZXJTcGVjaWZpZWRQcm9wZXJ0eShmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisJCWZpbmFsIEVDbGFzcyBjb250YWluaW5nQ2xhc3MgPSBmZWF0dXJlLmdldEVDb250YWluaW5nQ2xhc3MoKTsKKwkJLy8gSXMgaXQgYSBkaXNlYXNlIG1vZGVsIHByb3BlcnR5PworCQlpZiAoY29udGFpbmluZ0NsYXNzLmVxdWFscyhTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2Vhc2VNb2RlbCgpKQorCQkJCXx8IGNvbnRhaW5pbmdDbGFzcy5nZXRFQWxsU3VwZXJUeXBlcygpLmNvbnRhaW5zKAorCQkJCQkJU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNlYXNlTW9kZWwoKSkpIHsKKwkJCS8vIERlcHJlY2F0ZWQsIGRvbid0IHVzZSEKKwkJCWlmKGZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygiZmluaXRlRGlmZmVyZW5jZSIpCisJCQkJCXx8IGZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygicmVsYXRpdmVUb2xlcmFuY2UiKSkgcmV0dXJuIGZhbHNlOworCQkJLy8gWWVzCisJCQlyZXRWYWx1ZSA9IHRydWU7CisJCX0gLy8gaWYgYSBkaXNlYXNlIG1vZGVsIHByb3BlcnR5CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGlzVXNlclNwZWNpZmllZERpc2Vhc2VNb2RlbFByb3BlcnR5CisKKworCXB1YmxpYyBEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIElQcm9qZWN0IHByb2plY3QpIHsKKwkJc3VwZXIocGFyZW50LHN0eWxlLCBwcm9qZWN0KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGNvbXBvc2l0ZQorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gc3R5bGUKKwkgKiBAcGFyYW0gcHJvamVjdFZhbGlkYXRvcgorCSAqLworCXB1YmxpYyBEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcihmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBpbnQgc3R5bGUsCisJCQlmaW5hbCBEaXNlYXNlTW9kZWwgZGlzZWFzZU1vZGVsLAorCQkJZmluYWwgTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcihwYXJlbnQsIHN0eWxlLCBkaXNlYXNlTW9kZWwsIHByb2plY3RWYWxpZGF0b3IsIHByb2plY3QpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBwb3B1bGF0ZShEaXNlYXNlTW9kZWwgZGlzZWFzZU1vZGVsKSB7CisJCWZvciAoZmluYWwgTWFwLkVudHJ5PEVTdHJ1Y3R1cmFsRmVhdHVyZSwgVGV4dD4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgeworCQkJc3dpdGNoIChlbnRyeS5nZXRLZXkoKS5nZXRGZWF0dXJlSUQoKSkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FOgorCQkJCWRpc2Vhc2VNb2RlbC5zZXREaXNlYXNlTmFtZShlbnRyeS5nZXRWYWx1ZSgpLmdldFRleHQoKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVI6CisJCQkJZGlzZWFzZU1vZGVsCisJCQkJCQkuc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoZW50cnkuZ2V0VmFsdWUoKS5nZXRUZXh0KCkpOworCQkJCWJyZWFrOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fVElNRV9QRVJJT0Q6CisJCQkJZGlzZWFzZU1vZGVsLnNldFRpbWVQZXJpb2QoTG9uZy5wYXJzZUxvbmcoZW50cnkuZ2V0VmFsdWUoKQorCQkJCQkJLmdldFRleHQoKSkpOworCQkJCWJyZWFrOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9fQkFDS0dST1VORF9NT1JUQUxJVFlfUkFURToKKwkJCQlkaXNlYXNlTW9kZWwuc2V0QmFja2dyb3VuZE1vcnRhbGl0eVJhdGUoRG91YmxlCisJCQkJCQkucGFyc2VEb3VibGUoZW50cnkuZ2V0VmFsdWUoKS5nZXRUZXh0KCkpKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0gLy8gc3dpdGNoCisJCX0gLy8gZm9yIGVhY2ggTWFwLmVudHJ5CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOworCQkvLyBEaXNlYXNlIG5hbWU/CisJCWlmIChyZXRWYWx1ZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBUZXh0IHRleHQgPSBtYXAKKwkJCQkJLmdldChTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuRElTRUFTRV9NT0RFTF9fRElTRUFTRV9OQU1FKTsKKwkJCXJldFZhbHVlID0gIXRleHQuZ2V0VGV4dCgpLmVxdWFscygiIik7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIG5vdGhpbmc/CisJCQlpZiAoIXJldFZhbHVlKSB7CisJCQkJLy8gWWVzCisJCQkJZXJyb3JNZXNzYWdlID0gRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkRpeldpekVycjAiKTsgLy8kTk9OLU5MUy0xJAorCQkJfSAvLyBpZgorCQl9IC8vIGlmCisKKwkJLy8gUG9wdWxhdGlvbj8KKwkJaWYgKHJldFZhbHVlKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIFRleHQgdGV4dCA9IG1hcAorCQkJCQkuZ2V0KFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5ESVNFQVNFX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVIpOworCQkJcmV0VmFsdWUgPSAhdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJLy8gbm90aGluZz8KKwkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkvLyBZZXMKKwkJCQllcnJvck1lc3NhZ2UgPSBEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJORGl6V2l6RXJyMSIpOyAvLyROT04tTkxTLTEkCisJCQl9IC8vIGlmCisJCX0gLy8gaWYKKworCQkvLyBUaW1lIFBlcmlvZAorCQkvLyBSaWdodCBub3cgaXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcworCQlpZiAocmV0VmFsdWUpIHsKKwkJCS8vIFllcworCQkJZmluYWwgVGV4dCB0ZXh0ID0gbWFwCisJCQkJCS5nZXQoU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLkRJU0VBU0VfTU9ERUxfX1RJTUVfUEVSSU9EKTsKKwkJCXJldFZhbHVlID0gIXRleHQuZ2V0VGV4dCgpLmVxdWFscygiIik7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIG5vdGhpbmc/CisJCQlpZiAoIXJldFZhbHVlKSB7CisJCQkJLy8gWWVzCisJCQkJZXJyb3JNZXNzYWdlID0gRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkRpeldpekVycjIiKTsgLy8kTk9OLU5MUy0xJAorCQkJfSAvLyBpZgorCQkJZWxzZSB7CisJCQkJLy8gTm8KKwkJCQkvLyBJcyBpdCBhIHZhbGlkIHZhbHVlPworCQkJCXJldFZhbHVlID0gaXNWYWxpZExvbmdWYWx1ZSh0ZXh0LmdldFRleHQoKSwgMSk7CisJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQkvLyBObworCQkJCQllcnJvck1lc3NhZ2UgPSBEaXNlYXNlV2l6YXJkTWVzc2FnZXMKKwkJCQkJCQkuZ2V0U3RyaW5nKCJORGl6V2l6RXJyMyIpOyAvLyROT04tTkxTLTEkCisJCQkJfSAvLyBpZgorCQkJfQorCQl9IC8vIGlmIHRpbWUgcGVyaW9kCisKKwkJLyoqCisJCSAqIFRoZXNlIGZpZWxkcyBoYXMgYmVlbiBtb3ZlZCB0byBQb3B1bGF0aW9uIE1vZGVsCisJCSAqLworCQkKKwkJLy8gQmFja2dyb3VuZCBtb3J0YWxpdHkgcmF0ZT8KKy8qCQlpZiAocmV0VmFsdWUpIHsKKwkJCS8vIFllcworCQkJZmluYWwgVGV4dCB0ZXh0ID0gbWFwCisJCQkJCS5nZXQoU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLkRJU0VBU0VfTU9ERUxfX0JBQ0tHUk9VTkRfTU9SVEFMSVRZX1JBVEUpOworCQkJcmV0VmFsdWUgPSAhdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJLy8gbm90aGluZz8KKwkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkvLyBZZXMKKwkJCQllcnJvck1lc3NhZ2UgPSBEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJORGl6V2l6RXJyNCIpOyAvLyROT04tTkxTLTEkCisJCQl9IC8vIGlmCisJCQllbHNlIHsKKwkJCQkvLyBObworCQkJCS8vIElzIGl0IGEgdmFsaWQgdmFsdWUgPiAwPworCQkJCXJldFZhbHVlID0gaXNWYWxpZFZhbHVlKHRleHQuZ2V0VGV4dCgpLCAwLjApOworCQkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkJLy8gTm8KKwkJCQkJZXJyb3JNZXNzYWdlID0gRGlzZWFzZVdpemFyZE1lc3NhZ2VzCisJCQkJCQkJLmdldFN0cmluZygiTkRpeldpekVycjUiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0gLy8gaWYKKwkJCX0KKwkJfSAvLyBpZiBCYWNrZ3JvdW5kIG1vcnRhbGl0eSByYXRlCisqLwkJCisJCQorCQkvKioKKwkJICogTUFEIDcvMTUvMjAwOQorCQkgKiBSZWxhdGl2ZSB0b2xlcmFuY2UgaXMgbm8gbG9uZ2VyIG5lZWRlZCBpbiB0aGUgZGlzZWFzZSBtb2RlbCBlZGl0b3IKKwkJICovCisvLwkJLy8gUmVsYXRpdmUgdG9sZXJhbmNlCisvLwkJaWYgKHJldFZhbHVlKSB7CisvLwkJCS8vIFllcworLy8JCQlmaW5hbCBUZXh0IHRleHQgPSBtYXAKKy8vCQkJCQkuZ2V0KFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5ESVNFQVNFX01PREVMX19SRUxBVElWRV9UT0xFUkFOQ0UpOworLy8JCQlyZXRWYWx1ZSA9ICF0ZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpOyAvLyROT04tTkxTLTEkCisvLwkJCS8vIG5vdGhpbmc/CisvLwkJCWlmICghcmV0VmFsdWUpIHsKKy8vCQkJCS8vIFllcworLy8JCQkJZXJyb3JNZXNzYWdlID0gRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkRpeldpekVycjIyIik7IC8vJE5PTi1OTFMtMSQKKy8vCQkJfSAvLyBpZgorLy8JCQllbHNlIHsKKy8vCQkJCS8vIE5vCisvLwkJCQkvLyBJcyBpdCBhIHZhbGlkIHZhbHVlIDwgMC4xIGFuZCA+IDA/CisvLwkJCQlyZXRWYWx1ZSA9IGlzVmFsaWRSZWxhdGl2ZVRvbGVyYW5jZSh0ZXh0LmdldFRleHQoKSwgMC4xKTsKKy8vCQkJCWlmICghcmV0VmFsdWUpIHsKKy8vCQkJCQkvLyBObworLy8JCQkJCWVycm9yTWVzc2FnZSA9IERpc2Vhc2VXaXphcmRNZXNzYWdlcworLy8JCQkJCQkJLmdldFN0cmluZygiTkRpeldpekVycjIzIik7IC8vJE5PTi1OTFMtMSQKKy8vCQkJCX0gLy8gaWYKKy8vCQkJfQorLy8JCX0gLy8gaWYgQmFja2dyb3VuZCBtb3J0YWxpdHkgcmF0ZQorCQkKKwkJLyoqCisJCSAqIEVuZCByZW1vdmUgcmVsYXRpdmUgdG9sZXJhbmNlIGZyb20gZGlzZWFzZSBtb2RlbCBlZGl0b3IKKwkJICovCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHZhbGlkYXRlCisKKwkKKwkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tTdWJjbGFzcygpIHsKKwkJLy8gRGlzYWJsZSB0aGUgY2hlY2sgdGhhdCBwcmV2ZW50cyBzdWItY2xhc3Npbmcgb2YgU1dUIGNvbXBvbmVudHMKKwl9CisKKworfSAvLyBEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2Rpc2Vhc2Vtb2RlbHByb3BlcnR5ZWRpdG9yL0Rpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2Rpc2Vhc2Vtb2RlbHByb3BlcnR5ZWRpdG9yL0Rpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YTU3YzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvZGlzZWFzZW1vZGVscHJvcGVydHllZGl0b3IvRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmRpc2Vhc2Vtb2RlbHByb3BlcnR5ZWRpdG9yOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5EaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwKKwkJaW1wbGVtZW50cyBBZGFwdGVyIHsKKworCWFic3RyYWN0IHB1YmxpYyBEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvciBjcmVhdGVEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcigKKwkJCURpc2Vhc2VNb2RlbFByb3BlcnR5Q29tcG9zaXRlIGRpc2Vhc2VNb2RlbFByb3BlcnR5Q29tcG9zaXRlLAorCQkJaW50IHN0eWxlLCBNb2RpZnlMaXN0ZW5lciBwcm9qZWN0VmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0KTsKK30gLy8gRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvZGlzZWFzZW1vZGVscHJvcGVydHllZGl0b3IvRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2Rpc2Vhc2Vtb2RlbHByb3BlcnR5ZWRpdG9yL0Rpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjM1OTBhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2Rpc2Vhc2Vtb2RlbHByb3BlcnR5ZWRpdG9yL0Rpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM3IEBACisvLyBEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5kaXNlYXNlbW9kZWxwcm9wZXJ0eWVkaXRvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuU3RhbmRhcmREaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeSB7CisKKwlEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5SW1wbCBJTlNUQU5DRSA9IG5ldyBEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5SW1wbCgpOworCisJcHVibGljIGNsYXNzIERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnlJbXBsIGV4dGVuZHMKKwkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cworCQkJRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeSB7CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJCXJldHVybiB0eXBlID09IERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlci5jbGFzczsKKwkJfQorCisJfSAvLyBEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5SW1wbAorfSAvLyBEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvbmV3bW9kaWZpZXJwYWdlL0Rpc2Vhc2VOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL25ld21vZGlmaWVycGFnZS9EaXNlYXNlTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTViYzY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL25ld21vZGlmaWVycGFnZS9EaXNlYXNlTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLy8gRGlzZWFzZU5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5uZXdtb2RpZmllcnBhZ2U7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC51dGlsLlN0YW5kYXJkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLlN0YW5kYXJkRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLkRpc2Vhc2VXaXphcmRNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3TW9kaWZpZXJQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdGFydHVwOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4ge0BsaW5rIE5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5fSB0aGF0IGFkYXB0cworICoge0BsaW5rIERpc2Vhc2VNb2RlbH1zIHRvIHtAbGluayBOZXdNb2RpZmllclBhZ2V9cy4KKyAqLworcHVibGljIGNsYXNzIERpc2Vhc2VOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCVN0YW5kYXJkQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeSwgSVN0YXJ0dXAgeworCisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgRGlzZWFzZU5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5KCkgeworCQlzdXBlcigpOworCQlOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGRBZGFwdGVyRmFjdG9yeSh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTdGFydHVwI2Vhcmx5U3RhcnR1cCgpCisJICovCisJcHVibGljIHZvaWQgZWFybHlTdGFydHVwKCkgeworCQkvLyBOb3RoaW5nIHRvIGRvIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGRvIGV2ZXJ5dGhpbmcuCQkKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby51dGlsLlNjZW5hcmlvQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoZmluYWwgT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gTmV3TW9kaWZpZXJQYWdlQWRhcHRlci5jbGFzcyB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnV0aWwuU3RhbmRhcmRBZGFwdGVyRmFjdG9yeSNjcmVhdGVEaXNlYXNlTW9kZWxBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNlYXNlTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IERpc2Vhc2VOZXdNb2RpZmllclBhZ2VBZGFwdGVyKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudXRpbC5TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURpc2Vhc2VNb2RlbEFkYXB0ZXIoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNJSW5mZWN0b3JBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IFNJSW5mZWN0b3JOZXdNb2RpZmllclBhZ2VBZGFwdGVyKCk7CisJfQorCisJLyoqCisJICogVGhpcyBjbGFzcyBhZGFwdHMge0BsaW5rIERpc2Vhc2VNb2RlbH1zIHRvIHtAbGluayBOZXdNb2RpZmllclBhZ2V9cworCSAqLworCXByaXZhdGUgc3RhdGljIGNsYXNzIERpc2Vhc2VOZXdNb2RpZmllclBhZ2VBZGFwdGVyIGV4dGVuZHMKKwkJCU5ld01vZGlmaWVyUGFnZUFkYXB0ZXIgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubmV3bW9kaWZpZXJwYWdlLk5ld01vZGlmaWVyUGFnZUFkYXB0ZXIjY3JlYXRlTmV3TW9kaWZpZXJQYWdlKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgTmV3TW9kaWZpZXJQYWdlIGNyZWF0ZU5ld01vZGlmaWVyUGFnZSgpIHsKKwkJCXJldHVybiBuZXcgTmV3TW9kaWZpZXJQYWdlKChJZGVudGlmaWFibGUpIGdldFRhcmdldCgpKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNVc2VyU3BlY2lmaWVkUHJvcGVydHkoCisJCQkJCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQkJCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisJCQkJCWZpbmFsIEVDbGFzcyBjb250YWluaW5nQ2xhc3MgPSBmZWF0dXJlLmdldEVDb250YWluaW5nQ2xhc3MoKTsKKwkJCQkJLy8gSXMgaXQgYSBkaXNlYXNlIG1vZGVsIHByb3BlcnR5PworCQkJCQlpZiAoY29udGFpbmluZ0NsYXNzLmVxdWFscyhTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2Vhc2VNb2RlbCgpKQorCQkJCQkJCXx8IGNvbnRhaW5pbmdDbGFzcy5nZXRFQWxsU3VwZXJUeXBlcygpLmNvbnRhaW5zKAorCQkJCQkJCQkJU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNlYXNlTW9kZWwoKSkpIHsKKwkJCQkJCS8vIERlcHJlY2F0ZWQsIGRvbid0IHVzZSEKKwkJCQkJCWlmKGZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygiZmluaXRlRGlmZmVyZW5jZSIpCisJCQkJCQkJCXx8IGZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygicmVsYXRpdmVUb2xlcmFuY2UiKSkgcmV0dXJuIGZhbHNlOworCQkJCQkJLy8gWWVzCisJCQkJCQlyZXRWYWx1ZSA9IHRydWU7CisJCQkJCX0gLy8gaWYgYSBkaXNlYXNlIG1vZGVsIHByb3BlcnR5CisJCQkJCXJldHVybiByZXRWYWx1ZTsKKwkJCQl9IC8vIGlzVXNlclNwZWNpZmllZFByb3BlcnR5CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJvdHRvbVRleHQoKSB7CisJCQkJCXJldHVybiBEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJQTVRQX0RlZiIpOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBib29sZWFuIGlzTW9kaWZpYWJsZVByb3BlcnR5KAorCQkJCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJCQkJYm9vbGVhbiByZXRWYWx1ZSA9IHN1cGVyLmlzTW9kaWZpYWJsZVByb3BlcnR5KGZlYXR1cmUpOworCisJCQkJCXJldFZhbHVlID0gcmV0VmFsdWUKKwkJCQkJCQkmJiAhZmVhdHVyZS5lcXVhbHMoU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRQorCQkJCQkJCQkJLmdldERpc2Vhc2VNb2RlbF9EaXNlYXNlTmFtZSgpKTsKKwkJCQkJcmV0VmFsdWUgPSByZXRWYWx1ZQorCQkJCQkJCSYmICFmZWF0dXJlLmVxdWFscyhTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFCisJCQkJCQkJCQkuZ2V0RGlzZWFzZU1vZGVsX1BvcHVsYXRpb25JZGVudGlmaWVyKCkpOworCisJCQkJCXJldHVybiByZXRWYWx1ZTsKKwkJCQl9IC8vIGlzTW9kaWZpYWJsZVByb3BlcnR5CisJCQl9OworCQl9IC8vIGNyZWF0ZU5ld01vZGlmaWVyUGFnZQorCisJfSAvLyBEaXNlYXNlTmV3TW9kaWZpZXJQYWdlQWRhcHRlcgorCisJLyoqCisJICogVGhpcyBjbGFzcyBhZGFwdHMge0BsaW5rIFNJSW5mZWN0b3J9cyB0byB7QGxpbmsgTmV3TW9kaWZpZXJQYWdlfXMKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBTSUluZmVjdG9yTmV3TW9kaWZpZXJQYWdlQWRhcHRlciBleHRlbmRzCisJCQlOZXdNb2RpZmllclBhZ2VBZGFwdGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLm5ld21vZGlmaWVycGFnZS5OZXdNb2RpZmllclBhZ2VBZGFwdGVyI2NyZWF0ZU5ld01vZGlmaWVyUGFnZSgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE5ld01vZGlmaWVyUGFnZSBjcmVhdGVOZXdNb2RpZmllclBhZ2UoKSB7CisJCQlyZXR1cm4gbmV3IE5ld01vZGlmaWVyUGFnZSgoSWRlbnRpZmlhYmxlKSBnZXRUYXJnZXQoKSkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBib29sZWFuIGlzVXNlclNwZWNpZmllZFByb3BlcnR5KAorCQkJCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJCQkJYm9vbGVhbiByZXRWYWx1ZSA9IHN1cGVyLmlzVXNlclNwZWNpZmllZFByb3BlcnR5KGZlYXR1cmUpOworCQkJCQkKKwkJCQkJcmV0VmFsdWUgPSByZXRWYWx1ZSAmJiAhZmVhdHVyZS5lcXVhbHMoU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbmZlY3Rvcl9UYXJnZXRVUkkoKSk7CisJCQkJCQorCQkJCQlyZXR1cm4gcmV0VmFsdWU7CisJCQkJfSAvLyBpc1VzZXJTcGVjaWZpZWRQcm9wZXJ0eQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRCb3R0b21UZXh0KCkgeworCQkJCQlyZXR1cm4gIiI7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNNb2RpZmlhYmxlUHJvcGVydHkoCisJCQkJCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQkJCQlib29sZWFuIHJldFZhbHVlID0gc3VwZXIuaXNNb2RpZmlhYmxlUHJvcGVydHkoZmVhdHVyZSk7CisKKwkJCQkJcmV0VmFsdWUgPSByZXRWYWx1ZQorCQkJCQkJCSYmICFmZWF0dXJlLmVxdWFscyhTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFLmdldEluZmVjdG9yX1BvcHVsYXRpb25JZGVudGlmaWVyKCkpOworCisJCQkJCXJldHVybiByZXRWYWx1ZTsKKwkJCQl9IC8vIGlzTW9kaWZpYWJsZVByb3BlcnR5CisJCQl9OworCQl9IC8vIGNyZWF0ZU5ld01vZGlmaWVyUGFnZQorCisJfSAvLyBEaXNlYXNlTmV3TW9kaWZpZXJQYWdlQWRhcHRlcgorfSAvLyBEaXNlYXNlTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL0lTaGFyZWRJbWFnZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9kaXNlYXNlbW9kZWxzL0lTaGFyZWRJbWFnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTcyNDExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2Rpc2Vhc2Vtb2RlbHMvSVNoYXJlZEltYWdlcy5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8vIElTaGFyZWRJbWFnZXMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5SZWNvcmRlZENTVkluc3RhbmNlVHJlZU5vZGU7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgaWRlbnRpZmllcnMgdXNlZCB0byBtYXJrIGltYWdlcyBhZGRlZCB0byB0aGlzCisgKiBwbHVnLWluJ3MgaW1hZ2UgcmVnaXN0cnkuIFRoaXMgaW1hZ2VzIGFyZSBpbnRlbmRlZCB0byBiZSBzaGFyZWQgYnkKKyAqIHJlZmVyZW5jaW5nIHRoZSByZWdpc3RyeSBhbmQgdXNpbmcgdGhlIGlkZW50aWZpZXJzIGRlZmluZWQgaGVyZSB0byBzZWxlY3QgdGhlCisgKiBhcHByb3ByaWF0ZSBpbWFnZS4KKyAqLworcHVibGljIGludGVyZmFjZSBJU2hhcmVkSW1hZ2VzIHsKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdG8gcmVwcmVzZW50IGEge0BsaW5rIERpc2Vhc2VNb2RlbH0KKwkgKi8KKwlTdHJpbmcgRElTRUFTRV9JQ09OID0gImRpc2Vhc2VfaWNvbi5pbWFnZSI7CisKKwkvKioKKwkgKiBUaGlzIGltYWdlIGlzIHRoZSBpY29uIHRvIHJlcHJlc2VudCBhIHtAbGluayBJbmZlY3Rvcn0KKwkgKi8KKwlTdHJpbmcgSU5GRUNUT1JfSUNPTiA9ICJpbmZlY3Rvcl9pY29uLmltYWdlIjsKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdG8gcmVwcmVzZW50IGEge0BsaW5rIFJlY29yZGVkQ1NWSW5zdGFuY2VUcmVlTm9kZX0KKwkgKi8KKwlTdHJpbmcgUkVDT1JERURfQ1NWX0lDT04gPSAicmVjb3JkZWRfY3ZzX2ljb24uaW1hZ2UiOworCit9IC8vIElTaGFyZWRJbWFnZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZGlzZWFzZS9EaXNlYXNlVmlldy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2Rpc2Vhc2UvRGlzZWFzZVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTM0ZDNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2Rpc2Vhc2UvRGlzZWFzZVZpZXcuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLy8gRGlzZWFzZU1vZGVsVmlldy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZGlzZWFzZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLklkZW50aWZpYWJsZURlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSWRlbnRpZmlhYmxlUGx1Z2luVmlldzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CisKKy8qKgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgdmlldyBvZiB0aGUgcGx1Z2dlZCBpbiBEaXNlYXNlcy4KKyAqLworcHVibGljIGNsYXNzIERpc2Vhc2VWaWV3IGV4dGVuZHMgSWRlbnRpZmlhYmxlUGx1Z2luVmlldyB7CisKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgU2VxdWVuY2VycyBWaWV3CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRElTRUFTRV9NT0RFTF9WSUVXID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZGlzZWFzZXMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisJICovCisJcHVibGljIERpc2Vhc2VWaWV3KCkgeworCQlzdXBlcigpOworCX0gLy8gRGlzZWFzZVZpZXcKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5FeGVjdXRhYmxlUGx1Z2luVmlldyNnZXRJbnB1dCgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElkZW50aWZpYWJsZVZpZXdNb2RlbCBnZXRJbnB1dCgpIHsKKwkJcmV0dXJuIERpc2Vhc2VWaWV3TW9kZWwuZ2V0TW9kZWwoKTsKKwl9IC8vIGdldElucHV0CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSWRlbnRpZmlhYmxlUGx1Z2luVmlldyNnZXRJZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIgZ2V0SWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyKCkgeworCQlyZXR1cm4gbmV3IERpc2Vhc2VWaWV3VHJlZUNvbnRlbnRQcm92aWRlcigpOworCX0gLy8gZ2V0SWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIHRoZSBtb2RlbCBvZiB0aGUgcGx1Z2dlZCBpbiA8Y29kZT5EaXNlYXNlTW9kZWw8L2NvZGU+CisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBEaXNlYXNlVmlld01vZGVsIGV4dGVuZHMgSWRlbnRpZmlhYmxlVmlld01vZGVsIHsKKworCQlwcml2YXRlIHN0YXRpYyBEaXNlYXNlVmlld01vZGVsIG1vZGVsID0gbnVsbDsKKworCQkvKioKKwkJICogQHBhcmFtIGV4dGVuc2lvblBvaW50SUQKKwkJICovCisJCXByaXZhdGUgRGlzZWFzZVZpZXdNb2RlbChTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJRCkgeworCQkJc3VwZXIoZXh0ZW5zaW9uUG9pbnRJRCk7CisJCX0gLy8gRGlzZWFzZU1vZGVsVmlld01vZGVsCisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgRGlzZWFzZVZpZXdNb2RlbCBnZXRNb2RlbCgpIHsKKwkJCS8vIERvIHdlIG5lZWQgdG8gbWFrZSB0aGUgbW9kZWw/CisJCQlpZiAobW9kZWwgPT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCW1vZGVsID0gbmV3IERpc2Vhc2VWaWV3TW9kZWwoCisJCQkJCQlDb25zdGFudHMuSURfRElTRUFTRV9FWFRFTlNJT05fUE9JTlQpOworCQkJfQorCQkJcmV0dXJuIG1vZGVsOworCQl9IC8vIGdldE1vZGVsCisKKwl9IC8vIERpc2Vhc2VWaWV3TW9kZWwKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgdGhlIGNvbnRlbnQgcHJvdmlkZXIgb2YgdGhlIGRpc2Vhc2Ugdmlldy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBEaXNlYXNlVmlld1RyZWVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcworCQkJSWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyIHsKKworCQkvLyBUaGlzIGlzIHRoZSBpbWFnZSB1c2VkIHRvIHJlcHJlc2VudCBkaXNlYXNlcyBpbiB0aGUgZGlzZWFzZSB2aWV3CisJCXN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZGlzZWFzZUljb24gPSBudWxsOworCisJCS8vIElmIHRydWUgdGhlbiB3ZSd2ZSBuZXZlciB0cmllZCB0byBnZXQgdGhlIGljb24KKwkJc3RhdGljIGJvb2xlYW4gZGlzZWFzZUljb25GaXJzdFRpbWUgPSB0cnVlOworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSWRlbnRpZmlhYmxlUGx1Z2luVmlldy5JZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgeworCQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlRGVsZWdhdGUpID8gZ2V0RGlzZWFzZUljb24oKQorCQkJCQk6IHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOworCQl9IC8vIGdldEltYWdlCisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIGljb24gdG8gYmUgdXNlZCB0byByZXByZXNlbnQgZGlzZWFzZXMsIG9yIG51bGwgaWYgaXQKKwkJICogICAgICAgICBjYW4ndCBiZSBsb2FkZWQuCisJCSAqLworCQlwcml2YXRlIEltYWdlIGdldERpc2Vhc2VJY29uKCkgeworCQkJLy8gU2hvdWxkIHdlIHRyeSB0byBsb2FkIHRoZSBpY29uPworCQkJaWYgKGRpc2Vhc2VJY29uRmlyc3RUaW1lICYmIGRpc2Vhc2VJY29uID09IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQlkaXNlYXNlSWNvbkZpcnN0VGltZSA9IGZhbHNlOworCQkJCWRpc2Vhc2VJY29uID0gCisJCQkJQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKAorCQkJCQkib3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzIgksICJpY29ucy9mdWxsL2N1c3RvbTE2LyIgKyAiZGlzZWFzZS5naWYiKTsKKwkJCX0gLy8gaWYgd2Ugc2hvdWxkIGxvYWQgdGhlIGljb24KKwkJCXJldHVybiBkaXNlYXNlSWNvbi5jcmVhdGVJbWFnZSgpOworCQl9IC8vIGdldGRpc2Vhc2VJY29uCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5JZGVudGlmaWFibGVQbHVnaW5WaWV3LklkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkJc3VwZXIuZGlzcG9zZSgpOworCQkJLy8gVE9ETyBkaXNwb3NlIG9mIHRoZSBpbWFnZQorCQl9CisKKwl9IC8vIERpc2Vhc2VNb2RlbFZpZXdUcmVlQ29udGVudFByb3ZpZGVyCit9IC8vIERpc2Vhc2VWaWV3CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvRGlzZWFzZU1vZGVsSW5zdGFuY2VUcmVlTm9kZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL0Rpc2Vhc2VNb2RlbEluc3RhbmNlVHJlZU5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTc4NjdiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL0Rpc2Vhc2VNb2RlbEluc3RhbmNlVHJlZU5vZGUuamF2YQpAQCAtMCwwICsxLDMzIEBACisvLyBEaXNlYXNlTW9kZWxJbnN0YW5jZVRyZWVOb2RlLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3JlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBpbnN0YW5jZSBvZiBhIHNlcmlhbGl6ZWQge0BsaW5rIERpc2Vhc2VNb2RlbH0uCisgKi8KK3B1YmxpYyBjbGFzcyBEaXNlYXNlTW9kZWxJbnN0YW5jZVRyZWVOb2RlIGV4dGVuZHMgSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZSB7CisKKwkvKioKKwkgKiBAcGFyYW0gaXRuCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gZXh0ZW5zaW9uCisJICogCQl0aGUgZmlsZSBuYW1lIGV4dGVuc2lvbiBvZiB0aGUgc2VyaWFsaXplZCBmaWxlLgorCSAqLworCXB1YmxpYyBEaXNlYXNlTW9kZWxJbnN0YW5jZVRyZWVOb2RlKGZpbmFsIElkZW50aWZpYWJsZVRyZWVOb2RlIGl0biwKKwkJCWZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZXh0ZW5zaW9uKSB7CisJCXN1cGVyKGl0biwgbmFtZSwgZXh0ZW5zaW9uKTsKKwl9CisKK30gLy8gRGlzZWFzZU1vZGVsSW5zdGFuY2VUcmVlTm9kZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9EaXNlYXNlTW9kZWxJbnN0YW5jZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvRGlzZWFzZU1vZGVsSW5zdGFuY2VUcmVlTm9kZUNvbnRlbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZWY0NmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvRGlzZWFzZU1vZGVsSW5zdGFuY2VUcmVlTm9kZUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8vIERpc2Vhc2VNb2RlbEluc3RhbmNlVHJlZU5vZGVDb250ZW50UHJvdmlkZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbk5hdmlnYXRvcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGVDb250ZW50UHJvdmlkZXJ9IGZvcgorICoge0BsaW5rIERpc2Vhc2VNb2RlbEluc3RhbmNlVHJlZU5vZGV9cyB3aGljaCBhcHBlYXIgaW4gdGhlIHtAbGluaworICogQ29tbW9uTmF2aWdhdG9yfSBmcmFtZXdvcmsgdGhhdCBpcyB1c2VkIHRvIGV4cGxvcmUgU1RFTSBQcm9qZWN0cy4KKyAqIAorICogQHNlZSBEaXNlYXNlTW9kZWxJbnN0YW5jZVRyZWVOb2RlTGFiZWxQcm92aWRlcgorICovCitwdWJsaWMgY2xhc3MgRGlzZWFzZU1vZGVsSW5zdGFuY2VUcmVlTm9kZUNvbnRlbnRQcm92aWRlciBleHRlbmRzCisJCUlkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGVDb250ZW50UHJvdmlkZXIgeworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLgorCSAqIAlJZGVudGlmaWFibGVJbnN0YW5jZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyCisJICogCSNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihmaW5hbCBPYmplY3QgcGFyZW50RWxlbWVudCkgeworCQlPYmplY3RbXSByZXRWYWx1ZSA9IG51bGw7CisJCS8vIFJpZ2h0IGtpbmQgb2YgcGFyZW50PworCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElkZW50aWZpYWJsZVRyZWVOb2RlKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIElkZW50aWZpYWJsZVRyZWVOb2RlIGl0biA9IChJZGVudGlmaWFibGVUcmVlTm9kZSkgcGFyZW50RWxlbWVudDsKKworCQkJZmluYWwgSUZvbGRlciBmb2xkZXIgPSBpdG4uZ2V0UHJvamVjdCgpLmdldEZvbGRlcigKKwkJCQkJaXRuLmdldEZvbGRlck5hbWUoKSk7CisKKwkJCWZpbmFsIExpc3Q8SWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZT4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8SWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZT4oKTsKKworCQkJdHJ5IHsKKwkJCQlmb3IgKGZpbmFsIElSZXNvdXJjZSBpZGVudGlmaWFibGVGaWxlIDogZm9sZGVyLm1lbWJlcnMoKSkgeworCQkJCQkvLyBBIGRpc2Vhc2UgbW9kZWw/CisJCQkJCWlmIChpc0Rpc2Vhc2VNb2RlbChpZGVudGlmaWFibGVGaWxlKSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQlmaW5hbCBTdHJpbmcgaWRlbnRpZmlhYmxlTmFtZSA9IGlkZW50aWZpYWJsZUZpbGUKKwkJCQkJCQkJLmdldE5hbWUoKTsKKwkJCQkJCWZpbmFsIFN0cmluZyBleHRlbnNpb24gPSBpZGVudGlmaWFibGVGaWxlCisJCQkJCQkJCS5nZXRGaWxlRXh0ZW5zaW9uKCk7CisJCQkJCQlmaW5hbCBTdHJpbmcgbmFtZVdpdGhvdXRFeHRlbnNpb24gPSBpZGVudGlmaWFibGVOYW1lCisJCQkJCQkJCS5zdWJzdHJpbmcoMCwgaWRlbnRpZmlhYmxlTmFtZQorCQkJCQkJCQkJCS5pbmRleE9mKGV4dGVuc2lvbikgLSAxKTsKKwkJCQkJCXRlbXAuYWRkKG5ldyBJZGVudGlmaWFibGVJbnN0YW5jZVRyZWVOb2RlKGl0biwKKwkJCQkJCQkJbmFtZVdpdGhvdXRFeHRlbnNpb24sIGV4dGVuc2lvbikpOworCQkJCQl9IC8vIGlmIGRpc2Vhc2UgbW9kZWwKKwkJCQl9IC8vIGZvcgorCQkJfSBjYXRjaCAoZmluYWwgQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCIiLCBlKTsKKwkJCX0gLy8gZm9yIGVhY2ggSVJlc291cmNlIGZvbGRlci5tZW1iZXJzKCkKKworCQkJcmV0VmFsdWUgPSB0ZW1wLnRvQXJyYXkoKTsKKworCQl9IC8vIGlmIElkZW50aWZpYWJsZVRyZWVOb2RlCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0Q2hpbGRyZW4KKworCS8qKgorCSAqIEBwYXJhbSBpZGVudGlmaWFibGVGaWxlCisJICogCQlhIGZpbGUgaG9sZGluZyBhIHNlcmlhbGl6ZWQge0BsaW5rIElkZW50aWZpYWJsZX0uCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmlsZSBob2xkcyBhIHNlcmlhbGl6ZWQge0BsaW5rCisJICogCURpc2Vhc2VNb2RlbH0KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Rpc2Vhc2VNb2RlbChmaW5hbCBJUmVzb3VyY2UgaWRlbnRpZmlhYmxlRmlsZSkgeworCQlyZXR1cm4gaWRlbnRpZmlhYmxlRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZW5kc1dpdGgoCisJCQkJU3RhbmRhcmRQYWNrYWdlLmVOQU1FKTsKKwl9IC8vIGlzRGlzZWFzZU1vZGVsCisKK30gLy8gRGlzZWFzZU1vZGVsSW5zdGFuY2VUcmVlTm9kZUNvbnRlbnRQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9EaXNlYXNlTW9kZWxJbnN0YW5jZVRyZWVOb2RlTGFiZWxQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL0Rpc2Vhc2VNb2RlbEluc3RhbmNlVHJlZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkMmVhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9EaXNlYXNlTW9kZWxJbnN0YW5jZVRyZWVOb2RlTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8vIERpc2Vhc2VNb2RlbEluc3RhbmNlVHJlZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3JlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcmVzZW50YXRpb24uRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbk5hdmlnYXRvcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIElMYWJlbFByb3ZpZGVyfSBmb3Ige0BsaW5rCisgKiBEaXNlYXNlTW9kZWxJbnN0YW5jZVRyZWVOb2RlfXMgd2hpY2ggYXBwZWFyIGluIHRoZSB7QGxpbmsgQ29tbW9uTmF2aWdhdG9yfQorICogZnJhbWV3b3JrIHRoYXQgaXMgdXNlZCB0byBleHBsb3JlIFNURU0gUHJvamVjdHMuCisgKiAKKyAqIEBzZWUgRGlzZWFzZU1vZGVsSW5zdGFuY2VUcmVlTm9kZUNvbnRlbnRQcm92aWRlcgorICovCitwdWJsaWMgY2xhc3MgRGlzZWFzZU1vZGVsSW5zdGFuY2VUcmVlTm9kZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcworCQlJZGVudGlmaWFibGVJbnN0YW5jZVRyZWVOb2RlTGFiZWxQcm92aWRlciB7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuCisJICogCUlkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGVMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEltYWdlIGdldEltYWdlKGZpbmFsIE9iamVjdCBlbGVtZW50KSB7CisJCUltYWdlIHJldFZhbHVlID0gbnVsbDsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJZGVudGlmaWFibGVJbnN0YW5jZVRyZWVOb2RlKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGUgaWl0biA9IChJZGVudGlmaWFibGVJbnN0YW5jZVRyZWVOb2RlKSBlbGVtZW50OworCisJCQlyZXRWYWx1ZSA9IERpc2Vhc2Vtb2RlbHNFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpCisJCQkJCS5nZXQoaWl0bi5nZXRQYXJlbnQoKS5nZXRJbWFnZUtleSgpKTsKKworCQl9IC8vIGlmIElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGUKKwkJcmV0dXJuIHJldFZhbHVlOworCX0KKworfSAvLyBEaXNlYXNlTW9kZWxJbnN0YW5jZVRyZWVOb2RlTGFiZWxQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9EaXNlYXNlTW9kZWxUcmVlTm9kZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL0Rpc2Vhc2VNb2RlbFRyZWVOb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5YzFhYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9EaXNlYXNlTW9kZWxUcmVlTm9kZS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8vIERpc2Vhc2VNb2RlbFRyZWVOb2RlLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3JlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5JU2hhcmVkSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdTVEVNUHJvamVjdFdpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uTmF2aWdhdG9yOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCBpbiB0aGUge0BsaW5rIENvbW1vbk5hdmlnYXRvcn0gYmFzZWQgU1RFTSBQcm9qZWN0IEV4cGxvcmVyCisgKiB2aWV3IHRvIHJlcHJlc2VudCBhIGdyb3VwIG9mIHtAbGluayBEaXNlYXNlTW9kZWx9cyB0aGF0IGJlbG9uZyB0byBhCisgKiBwYXJ0aWN1bGFyIFNURU0gUHJvamVjdCBpbnN0YW5jZS4KKyAqLworcHVibGljIGNsYXNzIERpc2Vhc2VNb2RlbFRyZWVOb2RlIGV4dGVuZHMgSWRlbnRpZmlhYmxlVHJlZU5vZGUgeworCisJLyoqCisJICogQHBhcmFtIHByb2plY3QKKwkgKi8KKwlwdWJsaWMgRGlzZWFzZU1vZGVsVHJlZU5vZGUoZmluYWwgSVByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcihwcm9qZWN0LCAiRGlzZWFzZSBNb2RlbHMiLAorCQkJCU5ld1NURU1Qcm9qZWN0V2l6YXJkLkRFQ09SQVRPUlNfRk9MREVSX05BTUUsCisJCQkJSVNoYXJlZEltYWdlcy5ESVNFQVNFX0lDT04pOworCX0gLy8gRGlzZWFzZU1vZGVsVHJlZU5vZGUKKworfSAvLyBEaXNlYXNlTW9kZWxUcmVlTm9kZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9EaXNlYXNlTW9kZWxUcmVlTm9kZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL0Rpc2Vhc2VNb2RlbFRyZWVOb2RlQ29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0MzI5YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9EaXNlYXNlTW9kZWxUcmVlTm9kZUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8vIERpc2Vhc2VNb2RlbFRyZWVOb2RlQ29udGVudFByb3ZpZGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3JlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3I7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBJZGVudGlmaWFibGVUcmVlTm9kZUNvbnRlbnRQcm92aWRlcn0gZm9yIHtAbGluaworICogRGlzZWFzZU1vZGVsVHJlZU5vZGV9cyB3aGljaCBhcHBlYXIgaW4gdGhlIHtAbGluayBDb21tb25OYXZpZ2F0b3J9IGZyYW1ld29yaworICogdGhhdCBpcyB1c2VkIHRvIGV4cGxvcmUgU1RFTSBQcm9qZWN0cy4KKyAqIAorICogQHNlZSBEaXNlYXNlTW9kZWxUcmVlTm9kZUxhYmVsUHJvdmlkZXIKKyAqLworcHVibGljIGNsYXNzIERpc2Vhc2VNb2RlbFRyZWVOb2RlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMKKwkJSWRlbnRpZmlhYmxlVHJlZU5vZGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuCisJICogCUlkZW50aWZpYWJsZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKGZpbmFsIE9iamVjdCBwYXJlbnRFbGVtZW50KSB7CisJCU9iamVjdFtdIHJldFZhbHVlID0gbnVsbDsKKwkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgeworCQkJLy8gWWVzCisJCQlyZXRWYWx1ZSA9IG5ldyBPYmplY3RbXSB7IG5ldyBEaXNlYXNlTW9kZWxUcmVlTm9kZSgKKwkJCQkJKElQcm9qZWN0KSBwYXJlbnRFbGVtZW50KSB9OyAvLyBuZXcgT2JqZWN0CisJCX0gLy8gaWYgSVByb2plY3QKKwkJcmV0dXJuIHJldFZhbHVlOworCX0KKworfSAvLyBEaXNlYXNlTW9kZWxUcmVlTm9kZUNvbnRlbnRQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9EaXNlYXNlTW9kZWxUcmVlTm9kZUxhYmVsUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9EaXNlYXNlTW9kZWxUcmVlTm9kZUxhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGU0MDU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL0Rpc2Vhc2VNb2RlbFRyZWVOb2RlTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8vIERpc2Vhc2VNb2RlbFRyZWVOb2RlTGFiZWxQcm92aWRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQucHJlc2VudGF0aW9uLkRpc2Vhc2Vtb2RlbHNFZGl0b3JQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3I7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBJTGFiZWxQcm92aWRlcn0gZm9yIHtAbGluayBEaXNlYXNlTW9kZWxUcmVlTm9kZX1zCisgKiB3aGljaCBhcHBlYXIgaW4gdGhlIHtAbGluayBDb21tb25OYXZpZ2F0b3J9IGZyYW1ld29yayB0aGF0IGlzIHVzZWQgdG8gZXhwbG9yZQorICogU1RFTSBQcm9qZWN0cy4KKyAqIAorICogQHNlZSBEaXNlYXNlTW9kZWxUcmVlTm9kZUNvbnRlbnRQcm92aWRlcgorICovCitwdWJsaWMgY2xhc3MgRGlzZWFzZU1vZGVsVHJlZU5vZGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMKKwkJSWRlbnRpZmlhYmxlVHJlZU5vZGVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIgeworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLgorCSAqIAlJZGVudGlmaWFibGVJbnN0YW5jZVRyZWVOb2RlTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShmaW5hbCBPYmplY3QgZWxlbWVudCkgeworCQlJbWFnZSByZXRWYWx1ZSA9IG51bGw7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGlzZWFzZU1vZGVsVHJlZU5vZGUpIHsKKwkJCS8vIFllcworCQkJZmluYWwgRGlzZWFzZU1vZGVsVHJlZU5vZGUgZG10biA9IChEaXNlYXNlTW9kZWxUcmVlTm9kZSkgZWxlbWVudDsKKworCQkJcmV0VmFsdWUgPSBEaXNlYXNlbW9kZWxzRWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlUmVnaXN0cnkoKQorCQkJCQkuZ2V0KGRtdG4uZ2V0SW1hZ2VLZXkoKSk7CisKKwkJfSAvLyBpZiBJZGVudGlmaWFibGVJbnN0YW5jZVRyZWVOb2RlCisJCXJldHVybiByZXRWYWx1ZTsKKwl9Cit9IC8vIERpc2Vhc2VNb2RlbFRyZWVOb2RlTGFiZWxQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9SZWNvcmRlZENTVkluc3RhbmNlVHJlZU5vZGUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9SZWNvcmRlZENTVkluc3RhbmNlVHJlZU5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGMzYTFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL1JlY29yZGVkQ1NWSW5zdGFuY2VUcmVlTm9kZS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8vIFJlY29yZGVkQ1NWSW5zdGFuY2VUcmVlTm9kZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBzaW11bGF0aW9uIHJ1bnMgc2VyaWFsaXplZCB1c2luZyBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzCisgKiAoQ1NWKS4KKyAqLworcHVibGljIGNsYXNzIFJlY29yZGVkQ1NWSW5zdGFuY2VUcmVlTm9kZSBleHRlbmRzIFJlY29yZGVkSW5zdGFuY2VUcmVlTm9kZSB7CisKKwlwcml2YXRlIGZpbmFsIElSZXNvdXJjZSBmaWxlOworCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBmaWxlCisJICovCisJcHVibGljIFJlY29yZGVkQ1NWSW5zdGFuY2VUcmVlTm9kZShmaW5hbCBSZWNvcmRlZFRyZWVOb2RlIHBhcmVudCwKKwkJCWZpbmFsIElSZXNvdXJjZSBmaWxlKSB7CisJCXN1cGVyKHBhcmVudCwgZmlsZS5nZXROYW1lKCkpOworCQl0aGlzLmZpbGUgPSBmaWxlOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gZmlsZQorCSAqLworCXB1YmxpYyBSZWNvcmRlZENTVkluc3RhbmNlVHJlZU5vZGUoZmluYWwgUmVjb3JkZWRJbnN0YW5jZVRyZWVOb2RlIHBhcmVudCwKKwkJCWZpbmFsIElSZXNvdXJjZSBmaWxlKSB7CisJCXN1cGVyKHBhcmVudCwgZmlsZS5nZXROYW1lKCkpOworCQl0aGlzLmZpbGUgPSBmaWxlOworCX0KKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBmaWxlCisJICovCisJcHVibGljIElSZXNvdXJjZSBnZXRGaWxlKCkgeworCQlyZXR1cm4gZmlsZTsKKwl9CisKK30gLy8gUmVjb3JkZWRDU1ZJbnN0YW5jZVRyZWVOb2RlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL1JlY29yZGVkQ1NWSW5zdGFuY2VUcmVlTm9kZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL1JlY29yZGVkQ1NWSW5zdGFuY2VUcmVlTm9kZUNvbnRlbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YjYxOWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvUmVjb3JkZWRDU1ZJbnN0YW5jZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8vIFJlY29yZGVkQ1NWSW5zdGFuY2VUcmVlTm9kZUNvbnRlbnRQcm92aWRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5wcmVzZW50YXRpb24uRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3U1RFTVByb2plY3RXaXphcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbk5hdmlnYXRvcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIFJlY29yZGVkSW5zdGFuY2VUcmVlTm9kZUNvbnRlbnRQcm92aWRlcn0gZm9yIHtAbGluaworICogUmVjb3JkZWRDU1ZJbnN0YW5jZVRyZWVOb2RlfXMgd2hpY2ggYXBwZWFyIGluIHRoZSB7QGxpbmsgQ29tbW9uTmF2aWdhdG9yfQorICogZnJhbWV3b3JrIHRoYXQgaXMgdXNlZCB0byBleHBsb3JlIFNURU0gUHJvamVjdHMuCisgKiAKKyAqIEBzZWUgUmVjb3JkZWRDU1ZJbnN0YW5jZVRyZWVOb2RlTGFiZWxQcm92aWRlcgorICovCitwdWJsaWMgY2xhc3MgUmVjb3JkZWRDU1ZJbnN0YW5jZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMKKwkJUmVjb3JkZWRJbnN0YW5jZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyIHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci4KKwkgKiAJUmVjb3JkZWRJbnN0YW5jZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKGZpbmFsIE9iamVjdCBwYXJlbnRFbGVtZW50KSB7CisJCU9iamVjdFtdIHJldFZhbHVlID0gbnVsbDsKKwkJLy8gUmlnaHQgcGFyZW50PworCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY29yZGVkVHJlZU5vZGUpIHsKKwkJCS8vIFllcworCQkJZmluYWwgUmVjb3JkZWRUcmVlTm9kZSBwYXJlbnQgPSAoUmVjb3JkZWRUcmVlTm9kZSkgcGFyZW50RWxlbWVudDsKKwkJCWZpbmFsIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkKKwkJCS5nZXRSb290KCk7CisJCQkKKwkJCUlQYXRoIHByb2plY3RQYXRoID0gcGFyZW50LmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpOworCQkJSUZvbGRlciBjc3ZGb2xkZXIgPSByb290LmdldEZvbGRlcihwcm9qZWN0UGF0aC5hcHBlbmQoTmV3U1RFTVByb2plY3RXaXphcmQuUkVDT1JERURfU0lNVUxBVElPTlNfRk9MREVSX05BTUUpKTsKKworCQkJLy8gSXMgdGhlIGNzdkZvbGRlciBhIHJlYWRhYmxlIGRpcmVjdG9yeT8KKwkJCXRyeSB7CisJCQkJaWYgKGNzdkZvbGRlci5leGlzdHMoKSkgeworCQkJCQkvLyBZZXMKKwkJCQkJZmluYWwgSVJlc291cmNlW10gY3N2U3ViRm9sZGVycyA9IGNzdkZvbGRlci5tZW1iZXJzKCk7CisJCisJCQkJCS8vIENyZWF0ZSB0aGUgbm9kZXMgdGhhdCB3aWxsIHJlcHJlc2VudCB0aGUgZmlsZXMgaW4gdGhlIGNvbW1vbgorCQkJCQkvLyBuYXZpZ2F0b3IgZnJhbWV3b3JrCisJCQkJCWZpbmFsIExpc3Q8T2JqZWN0PiB0ZW1wID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisJCQkJCWZvciAoSVJlc291cmNlIGZpbGUgOiBjc3ZTdWJGb2xkZXJzKSB7CisvLwkJCQkJCWlmKGZpbGUgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQorLy8JCQkJCQkJdGVtcC5hZGQobmV3IFJlY29yZGVkQ1NWSW5zdGFuY2VUcmVlTm9kZShwYXJlbnQsIGZpbGUpKTsKKy8vCQkJCQkJZWxzZSB0ZW1wLmFkZChmaWxlKTsKKwkJCQkJCXRlbXAuYWRkKGZpbGUpOworCQkJCQl9IC8vIGZvciBlYWNoIEZpbGUKKwkJCQkJcmV0VmFsdWUgPSB0ZW1wLnRvQXJyYXkoKTsKKwkJCQl9IC8vIGlmIHJlYWRhYmxlIGRpcmVjdG9yeQorCQkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJY2UucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0gLy8gaWYgUmVjb3JkZWRUcmVlTm9kZQorCQllbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvcmRlZENTVkluc3RhbmNlVHJlZU5vZGUpIHsKKwkJCS8vIFllcworCQkJZmluYWwgUmVjb3JkZWRDU1ZJbnN0YW5jZVRyZWVOb2RlIHBhcmVudCA9IChSZWNvcmRlZENTVkluc3RhbmNlVHJlZU5vZGUpIHBhcmVudEVsZW1lbnQ7CisJCQkvL2ZpbmFsIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOworCQkJCisJCQlJUmVzb3VyY2UgZmlsZSA9IHBhcmVudC5nZXRGaWxlKCk7CisJCQlpZihmaWxlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgeworCQkJCUlDb250YWluZXIgY29udCA9IChJQ29udGFpbmVyKWZpbGU7CisJCQkJCQkvLyBJcyB0aGUgY3N2Rm9sZGVyIGEgcmVhZGFibGUgZGlyZWN0b3J5PworCQkJCXRyeSB7CisJCQkJCWlmIChjb250LmV4aXN0cygpKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCWZpbmFsIElSZXNvdXJjZVtdIGNzdlN1YkZvbGRlcnMgPSBjb250Lm1lbWJlcnMoKTsKKwkJCisJCQkJCQkvLyBDcmVhdGUgdGhlIG5vZGVzIHRoYXQgd2lsbCByZXByZXNlbnQgdGhlIGZpbGVzIGluIHRoZSBjb21tb24KKwkJCQkJCS8vIG5hdmlnYXRvciBmcmFtZXdvcmsKKwkJCQkJCWZpbmFsIExpc3Q8T2JqZWN0PiB0ZW1wID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisJCQkJCQlmb3IgKElSZXNvdXJjZSBmMiA6IGNzdlN1YkZvbGRlcnMpIHsKKwkJCQkJCQlpZihmMiBpbnN0YW5jZW9mIElDb250YWluZXIpCisJCQkJCQkJCXRlbXAuYWRkKG5ldyBSZWNvcmRlZENTVkluc3RhbmNlVHJlZU5vZGUocGFyZW50LCBmMikpOworCQkJCQkJCWVsc2UgdGVtcC5hZGQoZjIpOworCQkJCQkJfSAvLyBmb3IgZWFjaCBGaWxlCisJCQkJCQlyZXRWYWx1ZSA9IHRlbXAudG9BcnJheSgpOworCQkJCQl9IC8vIGlmIHJlYWRhYmxlIGRpcmVjdG9yeQorCQkJCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCQljZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07CisJCX0KKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0Q2hpbGRyZW4KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci4KKwkgKiAJUmVjb3JkZWRJbnN0YW5jZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oZmluYWwgT2JqZWN0IGVsZW1lbnQpIHsKKwkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihlbGVtZW50KTsKKwkJcmV0dXJuIGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMDsKKwl9CisKK30gLy8gUmVjb3JkZWRDU1ZJbnN0YW5jZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL1JlY29yZGVkQ1NWSW5zdGFuY2VUcmVlTm9kZUxhYmVsUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9SZWNvcmRlZENTVkluc3RhbmNlVHJlZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzZjk0YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9SZWNvcmRlZENTVkluc3RhbmNlVHJlZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLy8gUmVjb3JkZWRDU1ZJbnN0YW5jZVRyZWVOb2RlTGFiZWxQcm92aWRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByZXNlbnRhdGlvbi5EaXNlYXNlbW9kZWxzRWRpdG9yUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uTmF2aWdhdG9yOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgSUxhYmVsUHJvdmlkZXJ9IGZvciB7QGxpbmsgUmVjb3JkZWRDU1ZJbnN0YW5jZVRyZWVOb2RlCisgKiB9cyB3aGljaCBhcHBlYXIgaW4gdGhlIHtAbGluayBDb21tb25OYXZpZ2F0b3J9IGZyYW1ld29yayB0aGF0IGlzIHVzZWQgdG8KKyAqIGV4cGxvcmUgU1RFTSBQcm9qZWN0cy4KKyAqIAorICogQHNlZSBSZWNvcmRlZENTVkluc3RhbmNlVHJlZU5vZGVDb250ZW50UHJvdmlkZXIKKyAqLworcHVibGljIGNsYXNzIFJlY29yZGVkQ1NWSW5zdGFuY2VUcmVlTm9kZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcworCQlSZWNvcmRlZEluc3RhbmNlVHJlZU5vZGVMYWJlbFByb3ZpZGVyIHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci4KKwkgKiAJUmVjb3JkZWRJbnN0YW5jZVRyZWVOb2RlTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShmaW5hbCBPYmplY3QgZWxlbWVudCkgeworCQlJbWFnZSByZXRWYWx1ZSA9IG51bGw7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVjb3JkZWRDU1ZJbnN0YW5jZVRyZWVOb2RlKSB7CisJCQkvLyBZZXMKKwkJCXJldFZhbHVlID0gRGlzZWFzZW1vZGVsc0VkaXRvclBsdWdpbgorCQkJCQkuZ2V0UGx1Z2luKCkKKwkJCQkJLmdldEltYWdlUmVnaXN0cnkoKQorCQkJCQkuZ2V0KG9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy5JU2hhcmVkSW1hZ2VzLlJFQ09SREVEX0NTVl9JQ09OKTsKKworCQl9IC8vIGlmIElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGUKKwkJcmV0dXJuIHJldFZhbHVlOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci4KKwkgKiAJUmVjb3JkZWRJbnN0YW5jZVRyZWVOb2RlTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUZXh0KGZpbmFsIE9iamVjdCBlbGVtZW50KSB7CisJCVN0cmluZyByZXRWYWx1ZSA9ICJub3RoaW5nIjsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvcmRlZENTVkluc3RhbmNlVHJlZU5vZGUpIHsKKwkJCS8vIFllcworCQkJZmluYWwgUmVjb3JkZWRDU1ZJbnN0YW5jZVRyZWVOb2RlIG5vZGUgPSAoUmVjb3JkZWRDU1ZJbnN0YW5jZVRyZWVOb2RlKSBlbGVtZW50OworCQkJcmV0VmFsdWUgPSBub2RlLmdldE5hbWUoKTsKKwkJfSAvLyBpZiBSZWNvcmRlZENTVkluc3RhbmNlVHJlZU5vZGUKKwkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7CisJCQlyZXRWYWx1ZSA9ICgoSVJlc291cmNlKWVsZW1lbnQpLmdldE5hbWUoKTsKKwkJfQorCQkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0KKworfSAvLyBSZWNvcmRlZENTVkluc3RhbmNlVHJlZU5vZGVMYWJlbFByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvRGlzZWFzZURlZmluaXRpb25Db250cm9sLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9EaXNlYXNlRGVmaW5pdGlvbkNvbnRyb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2MyMDQzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvRGlzZWFzZURlZmluaXRpb25Db250cm9sLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8vIERpc2Vhc2VEZWZpbml0aW9uQ29udHJvbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5EaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBTV1QgY29udHJvbCBmb3IgZGVmaW5pbmcgYSBkaXNlYXNlLgorICovCitwdWJsaWMgY2xhc3MgRGlzZWFzZURlZmluaXRpb25Db250cm9sIGV4dGVuZHMgQ29tcG9zaXRlIHsKKworCXByaXZhdGUgc3RhdGljIERpc2Vhc2VNb2RlbFtdIGRpc2Vhc2VNb2RlbHMgPSBudWxsOworCisJcHJpdmF0ZSBmaW5hbCBDb21ibyBjb21ibzsKKworCXByaXZhdGUgZmluYWwgRGlzZWFzZU1vZGVsUHJvcGVydHlDb21wb3NpdGUgZGlzZWFzZU1vZGVsUHJvcGVydHlDb21wb3NpdGU7CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGNvbXBvc2l0ZQorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gc3R5bGUKKwkgKiBAcGFyYW0gcHJvamVjdFZhbGlkYXRvcgorCSAqLworCXB1YmxpYyBEaXNlYXNlRGVmaW5pdGlvbkNvbnRyb2woZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgaW50IHN0eWxlLAorCQkJTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKKwkJZmluYWwgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCXNldExheW91dChncmlkTGF5b3V0KTsKKworCQlmaW5hbCBMYWJlbCBkaXNlYXNlTW9kZWxMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7CisJCWZpbmFsIEdyaWREYXRhIGdkX2Rpc2Vhc2VNb2RlbExhYmVsID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7CisJCWdkX2Rpc2Vhc2VNb2RlbExhYmVsLndpZHRoSGludCA9IDEwMDsKKwkJZGlzZWFzZU1vZGVsTGFiZWwuc2V0TGF5b3V0RGF0YShnZF9kaXNlYXNlTW9kZWxMYWJlbCk7CisJCWRpc2Vhc2VNb2RlbExhYmVsLnNldFRleHQoRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiRERDLjAiKSk7IC8vJE5PTi1OTFMtMSQKKworCQljb21ibyA9IG5ldyBDb21ibyh0aGlzLCBTV1QuUkVBRF9PTkxZKTsKKwkJY29tYm8uc2V0VGV4dExpbWl0KDMwKTsKKwkJZmluYWwgR3JpZERhdGEgZ2RfY29tYm8gPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsCisJCQkJZmFsc2UpOworCQlnZF9jb21iby53aWR0aEhpbnQgPSAzMDM7CisJCWNvbWJvLnNldExheW91dERhdGEoZ2RfY29tYm8pOworCisJCWNvbWJvLnNldFRvb2xUaXBUZXh0KERpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIkREQy4xIikpOyAvLyROT04tTkxTLTEkCisJCS8vIEluaXRpYWxpemUgdGhlIGxpc3Qgb2YgZGlzZWFzZSBtb2RlbHMgYXZhaWxhYmxlCisJCWNvbWJvLnNldEl0ZW1zKGdldERpc2Vhc2VNb2RlbE5hbWVzKGdldERpc2Vhc2VNb2RlbHMoKSkpOworCQljb21iby5zZWxlY3QoMCk7CisJCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKHByb2plY3RWYWxpZGF0b3IpOworCisJCQorCQlkaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZSA9IG5ldyBEaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZSh0aGlzLAorCQkJCVNXVC5OT05FLCBnZXREaXNlYXNlTW9kZWxzKCksIHByb2plY3RWYWxpZGF0b3IsIHByb2plY3QpOworCQlmaW5hbCBHcmlkRGF0YSBnZF9kaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbnRyb2wgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsCisJCQkJU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDIsIDEpOworCQlkaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZQorCQkJCS5zZXRMYXlvdXREYXRhKGdkX2Rpc2Vhc2VNb2RlbFByb3BlcnR5Q29udHJvbCk7CisKKwkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlkaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZQorCQkJCQkJLmRpc3BsYXlEaXNlYXNlTW9kZWwoZ2V0RGlzZWFzZU1vZGVscygpW2NvbWJvCisJCQkJCQkJCS5nZXRTZWxlY3Rpb25JbmRleCgpXSk7CisJCQkJLy8gbGF5b3V0KCk7CisJCQl9IC8vIHdpZGdldFNlbGVjdGVkCisKKwkJfSk7CisJCS8vZmluYWwgRGlzZWFzZURlZmluaXRpb25Db250cm9sIHNlbGYgPSB0aGlzOworCQkKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsICJvcmcuZWNsaXBzZS5zdGVtLmRvYy5uZXdkaXNlYXNlX2NvbnRleHRpZCIpOworCX0vLyBEaXNlYXNlRGVmaW5pdGlvbkNvbnRyb2wKKworCS8qKgorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHtAbGluayBEaXNlYXNlTW9kZWxzfXMgZGVmaW5lZCBpbiB0aGUgc3lzdGVtLgorCSAqLworCXByaXZhdGUgRGlzZWFzZU1vZGVsW10gZ2V0RGlzZWFzZU1vZGVscygpIHsKKwkJaWYgKGRpc2Vhc2VNb2RlbHMgPT0gbnVsbCkgeworCQkJZmluYWwgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKKwkJCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGRpc2Vhc2VNb2RlbENvbmZpZ0VsZW1lbnRzID0gcmVnaXN0cnkKKwkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuQ29uc3RhbnRzLklEX0RJU0VBU0VfTU9ERUxfRVhURU5TSU9OX1BPSU5UKTsKKworCQkJZmluYWwgTGlzdDxEaXNlYXNlTW9kZWw+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PERpc2Vhc2VNb2RlbD4oKTsKKworCQkJZGlzZWFzZU1vZGVscyA9IG5ldyBEaXNlYXNlTW9kZWxbZGlzZWFzZU1vZGVsQ29uZmlnRWxlbWVudHMubGVuZ3RoXTsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXNlYXNlTW9kZWxDb25maWdFbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZGlzZWFzZU1vZGVsQ29uZmlnRWxlbWVudHNbaV07CisJCQkJLy8gRG9lcyB0aGUgZWxlbWVudCBzcGVjaWZ5IHRoZSBjbGFzcyBvZiB0aGUgZGlzZWFzZSBtb2RlbD8KKwkJCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKENvbnN0YW50cy5ESVNFQVNFX01PREVMX0VMRU1FTlQpKSB7CisJCQkJCS8vIFllcworCQkJCQl0cnkgeworCQkJCQkJdGVtcC5hZGQoKERpc2Vhc2VNb2RlbCkgZWxlbWVudAorCQkJCQkJCQkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJEREMuMiIpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfSBjYXRjaCAoZmluYWwgQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoCisJCQkJCQkJCURpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIkREQy4zIiksIGUpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQl9IC8vIGlmCisJCQl9IC8vIGZvciBlYWNoIGNvbmZpZ3VyYXRpb24gZWxlbWVudAorCisJCQlkaXNlYXNlTW9kZWxzID0gdGVtcC50b0FycmF5KG5ldyBEaXNlYXNlTW9kZWxbXSB7fSk7CisJCX0gLy8gaWYgZGlzZXNhZU1vZGVscyBub3QgY3JlYXRlZAorCisJCXJldHVybiBkaXNlYXNlTW9kZWxzOworCX0gLy8gZ2V0RGlzZWFzZU1vZGVscworCisJLyoqCisJICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGRpc2Vhc2UgbW9kZWxzCisJICovCisJcHJpdmF0ZSBTdHJpbmdbXSBnZXREaXNlYXNlTW9kZWxOYW1lcyhmaW5hbCBEaXNlYXNlTW9kZWxbXSBkaXNlYXNlTW9kZWxzKSB7CisJCWZpbmFsIFN0cmluZ1tdIHJldFZhbHVlID0gbmV3IFN0cmluZ1tkaXNlYXNlTW9kZWxzLmxlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlzZWFzZU1vZGVscy5sZW5ndGg7IGkrKykgeworCQkJU3RyaW5nIG5hbWUgPSBkaXNlYXNlTW9kZWxzW2ldLmdldER1YmxpbkNvcmUoKS5nZXRUaXRsZSgpOworCQkJLy8gV2FzIGEgbmFtZSBzcGVjaWZpZWQ/CisJCQlpZiAoKG5hbWUgPT0gbnVsbCkgfHwgbmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkvLyBObworCQkJCW5hbWUgPSBkaXNlYXNlTW9kZWxzW2ldLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOworCQkJfSAvLyBpZgorCisJCQlyZXRWYWx1ZVtpXSA9IG5hbWU7CisJCX0gLy8gZm9yIGkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0RGlzZWFzZU1vZGVsTmFtZXMKKworCQorCURpc2Vhc2VNb2RlbCBnZXRTZWxlY3RlZERpc2Vhc2VNb2RlbCgpIHsKKwkJZmluYWwgRGlzZWFzZU1vZGVsIHJldFZhbHVlID0gKERpc2Vhc2VNb2RlbClFY29yZVV0aWwKKwkJCQkuY29weShnZXREaXNlYXNlTW9kZWxzKClbY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV0pOworCQlkaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZS5wb3B1bGF0ZURpc2Vhc2VNb2RlbChyZXRWYWx1ZSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldFNlbGVjdGVkRGlzZWFzZU1vZGVsCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tTdWJjbGFzcygpIHsKKwkJLy8gRGlzYWJsZSB0aGUgY2hlY2sgdGhhdCBwcmV2ZW50cyBzdWItY2xhc3Npbmcgb2YgU1dUIGNvbXBvbmVudHMKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50cyBvZiB0aGUgY29udHJvbCBhcmUgdmFsaWQsCisJICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgeworCQlyZXR1cm4gZGlzZWFzZU1vZGVsUHJvcGVydHlDb21wb3NpdGUudmFsaWRhdGUoKTsKKwl9IC8vIHZhbGlkYXRlCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlIHNldCBieSB7QGxpbmsgI3ZhbGlkYXRlKCl9CisJICovCisJcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7CisJCXJldHVybiBkaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZS5nZXRFcnJvck1lc3NhZ2UoKTsKKwl9CisKK30gLy8gRGlzZWFzZURlZmluaXRpb25Db250cm9sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9EaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvRGlzZWFzZU1vZGVsUHJvcGVydHlDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTljOGFiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvRGlzZWFzZU1vZGVsUHJvcGVydHlDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLy8gRGlzZWFzZU1vZGVsUHJvcGVydHlDb21wb3NpdGUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5kaXNlYXNlbW9kZWxwcm9wZXJ0eWVkaXRvci5EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmRpc2Vhc2Vtb2RlbHByb3BlcnR5ZWRpdG9yLkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmRpc2Vhc2Vtb2RlbHByb3BlcnR5ZWRpdG9yLkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cworICovCitwdWJsaWMgY2xhc3MgRGlzZWFzZU1vZGVsUHJvcGVydHlDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgeworCisJcHJpdmF0ZSBNYXA8RGlzZWFzZU1vZGVsLCBEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcj4gbW9kZWxNYXAgPSBuZXcgSGFzaE1hcDxEaXNlYXNlTW9kZWwsIERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yPigpOworCisJcHJpdmF0ZSBTdGFja0xheW91dCBzdGFja0xheW91dCA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGNvbXBvc2l0ZQorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gc3R5bGUKKwkgKiBAcGFyYW0gcHJvamVjdFZhbGlkYXRvcgorCSAqLworCXB1YmxpYyBEaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50LAorCQkJZmluYWwgaW50IHN0eWxlLCBmaW5hbCBEaXNlYXNlTW9kZWxbXSBkaXNlYXNlTW9kZWxzLAorCQkJTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKKwkJc3RhY2tMYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKTsKKwkJc2V0TGF5b3V0KHN0YWNrTGF5b3V0KTsKKworCQlMYWJlbCBsYWJlbDsKKwkJbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KERpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIkRNUEMxIikpOyAvLyROT04tTkxTLTEkCisJCURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yIGZpcnN0T25lID0gbnVsbDsKKwkJLy8gQW55IGRpc2Vhc2UgbW9kZWxzPworCQlpZiAoZGlzZWFzZU1vZGVscyAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlzZWFzZU1vZGVscy5sZW5ndGg7IGkrKykgeworCisJCQkJRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyIGRtcGVhID0gKERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlcikgRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkJLmFkYXB0KGRpc2Vhc2VNb2RlbHNbaV0sCisJCQkJCQkJCURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlci5jbGFzcyk7CisKKwkJCQlmaW5hbCBEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvciBkbXBlID0gZG1wZWEKKwkJCQkJCS5jcmVhdGVEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcih0aGlzLCBTV1QuTk9ORSwKKwkJCQkJCQkJcHJvamVjdFZhbGlkYXRvciwgcHJvamVjdCk7CisKKwkJCQltb2RlbE1hcC5wdXQoZGlzZWFzZU1vZGVsc1tpXSwgZG1wZSk7CisJCQkJaWYgKGZpcnN0T25lID09IG51bGwpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWZpcnN0T25lID0gZG1wZTsKKwkJCQl9IC8vIGlmCisJCQl9IC8vIGZvciBpCisJCX0gLy8gaWYgYW55IGRpc2Vhc2UgbW9kZWxzPworCisJCXN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBmaXJzdE9uZTsKKwl9IC8vIERpc2Vhc2VNb2RlbFByb3BlcnR5Q29tcG9zaXRlCisKKwl2b2lkIGRpc3BsYXlEaXNlYXNlTW9kZWwoZmluYWwgRGlzZWFzZU1vZGVsIGRpc2Vhc2VNb2RlbCkgeworCQlmaW5hbCBEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvciBkbXBlID0gbW9kZWxNYXAuZ2V0KGRpc2Vhc2VNb2RlbCk7CisJCS8vIERpZCB3ZSBmaW5kIGl0PworCQlpZiAoZG1wZSAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBkbXBlOworCQkJbGF5b3V0KCk7CisJCX0gLy8gaWYKKwkJZWxzZSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiRE1QQzIiKSAvLyROT04tTkxTLTEkCisJCQkJCSsgZGlzZWFzZU1vZGVsLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIlwiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0gLy8gZGlzcGxheURpc2Vhc2VNb2RlbAorCQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjaGVja1N1YmNsYXNzKCkgeworCQkvLyBEaXNhYmxlIHRoZSBjaGVjayB0aGF0IHByZXZlbnRzIHN1Yi1jbGFzc2luZyBvZiBTV1QgY29tcG9uZW50cworCX0KKworCS8qKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb21wb3NpdGUgYXJlIHZhbGlkLAorCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKKwkJcmV0dXJuICgoRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IpIChzdGFja0xheW91dC50b3BDb250cm9sKSkKKwkJCQkudmFsaWRhdGUoKTsKKwl9IC8vIHZhbGlkYXRlCisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7CisJCXJldHVybiAoKERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yKSAoc3RhY2tMYXlvdXQudG9wQ29udHJvbCkpCisJCQkJLmdldEVycm9yTWVzc2FnZSgpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBkaXNlYXNlTW9kZWwKKwkgKi8KKwlwdWJsaWMgdm9pZCBwb3B1bGF0ZURpc2Vhc2VNb2RlbChEaXNlYXNlTW9kZWwgZGlzZWFzZU1vZGVsKSB7CisJCSgoRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IpIChzdGFja0xheW91dC50b3BDb250cm9sKSkKKwkJCQkucG9wdWxhdGUoZGlzZWFzZU1vZGVsKTsKKwl9IC8vIHBvcHVsYXRlRGlzZWFzZU1vZGVsCisKK30gLy8gRGlzZWFzZU1vZGVsUHJvcGVydHlDb21wb3NpdGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL0Rpc2Vhc2VXaXphcmRNZXNzYWdlcy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1NTY2YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL0Rpc2Vhc2VXaXphcmRNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8vIERpc2Vhc2VXaXphcmRNZXNzYWdlcy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0aGUgUmVzb3VyY2UgQnVuZGxlIGZvciB0aGlzIHBhY2thZ2UuCisgKi8KK3B1YmxpYyBjbGFzcyBEaXNlYXNlV2l6YXJkTWVzc2FnZXMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IENvbnN0YW50cy5JRF9ST09UCisJCQkrICIudWkud2l6YXJkcy5kaXNlYXNld2l6YXJkbWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQorCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7CisKKwlwcml2YXRlIERpc2Vhc2VXaXphcmRNZXNzYWdlcygpIHsKKwkJLy8gZW1wdHkKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0ga2V5CisJICogICAgICAgICAgICB0aGUga2V5IGZvciB0aGUgbWVzc2FnZQorCSAqIEByZXR1cm4gdGhlIHN0cmluZyB0aGF0IG1hdGNoZXMgdGhlIGtleQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhmaW5hbCBTdHJpbmcga2V5KSB7CisJCXRyeSB7CisJCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOworCQl9IGNhdGNoIChmaW5hbCBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuICchJyArIGtleSArICchJzsKKwkJfQorCX0gLy8gZ2V0U3RyaW5nCit9IC8vIERpc2Vhc2VXaXphcmRNZXNzYWdlcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvSVNPS2V5UGlja2VkRXZlbnQuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL0lTT0tleVBpY2tlZEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkMjcwZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL0lTT0tleVBpY2tlZEV2ZW50LmphdmEKQEAgLTAsMCArMSw0MSBAQAorLy8gSVNPS2V5UGlja2VkRXZlbnQuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgZXZlbnQgb2YgYW4gSVNPa2V5IGJlaW5nIHNlbGVjdGVkIHVzaW5nIGFuCisgKiB7QGxpbmsgSVNPS2V5UGlja2VyfS4KKyAqLworcHVibGljIGNsYXNzIElTT0tleVBpY2tlZEV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCXByaXZhdGUgU3RyaW5nIGlzb0tleTsKKworCS8qKgorCSAqIEBwYXJhbSBzb3VyY2UKKwkgKiBAcGFyYW0gaXNvS2V5CisJICovCisJcHVibGljIElTT0tleVBpY2tlZEV2ZW50KE9iamVjdCBzb3VyY2UsIFN0cmluZyBpc29LZXkpIHsKKwkJc3VwZXIoc291cmNlKTsKKwkJdGhpcy5pc29LZXkgPSBpc29LZXk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgaXNvS2V5CisJICovCisJcHVibGljIGZpbmFsIFN0cmluZyBnZXRJc29LZXkoKSB7CisJCXJldHVybiBpc29LZXk7CisJfQorCit9IC8vIElTT0tleVBpY2tlZEV2ZW50CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9JU09LZXlQaWNrZWRFdmVudExpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9JU09LZXlQaWNrZWRFdmVudExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3YTBjNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL0lTT0tleVBpY2tlZEV2ZW50TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkczsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgd2FudCB0byBiZSBpbmZvcm1lZCB3aGVuIGFuIElTTworICoga2V5IGlzIHNlbGVjdGVkIGZyb20gdGhlIHtAbGluayBJU09LZXlQaWNrZXJ9OworICovCitwdWJsaWMgaW50ZXJmYWNlIElTT0tleVBpY2tlZEV2ZW50TGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKKwl2b2lkIGlzb0tleVBpY2tlZChJU09LZXlQaWNrZWRFdmVudCBpa3BlKTsKK30gLy8gSVNPS2V5UGlja2VkRXZlbnRMaXN0ZW5lcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvSVNPS2V5UGlja2VyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9JU09LZXlQaWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWUwNmE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvSVNPS2V5UGlja2VyLmphdmEKQEAgLTAsMCArMSwxNTcgQEAKKy8vIElTT0tleVBpY2tlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5Lkdlb2dyYXBoaWNOYW1lczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5GaWx0ZXJlZExpc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIFNXVCBDb21wb3NpdGUgdGhhdCBhbGxvd3MgYSB1c2VyIHRvIHNwZWNpZnkgYW4gSVNPIGtleSBieQorICogcGlja2luZyBmcm9tIGFuIGV4cGFuZGFibGUgaGllcmFyY2h5IG9mIGNvdW50cnkgbmFtZXMgYW5kIHRoZWlyCisgKiBzdWItZGl2aXNpb25zLgorICovCitwdWJsaWMgY2xhc3MgSVNPS2V5UGlja2VyIGV4dGVuZHMgQ29tcG9zaXRlIHsKKworCXByaXZhdGUgZmluYWwgTGlzdDxJU09LZXlQaWNrZWRFdmVudExpc3RlbmVyPiBsaXN0ZW5lcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8SVNPS2V5UGlja2VkRXZlbnRMaXN0ZW5lcj4oKTsKKworCXByaXZhdGUgZmluYWwgTGFiZWwgaXNvS2V5TGV2ZWxEZXNjcmlwdGlvbjsKKwlwcml2YXRlIGZpbmFsIEZpbHRlcmVkTGlzdCBmaWx0ZXJlZExpc3Q7CisJcHJpdmF0ZSBmaW5hbCBUZXh0IHRleHQ7CisJcHJpdmF0ZSBpbnQgaXNvS2V5TGV2ZWw7CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGNvbXBvc2l0ZQorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gc3R5bGUKKwkgKi8KKwlwdWJsaWMgSVNPS2V5UGlja2VyKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIGludCBzdHlsZSwKKwkJCWZpbmFsIGludCBpc29LZXlMZXZlbCkgeworCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKKwkJdGhpcy5pc29LZXlMZXZlbCA9IGlzb0tleUxldmVsOworCQlzZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7CisKKwkJdGV4dCA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOworCQlmaW5hbCBGb3JtRGF0YSBmZF90ZXh0ID0gbmV3IEZvcm1EYXRhKCk7CisJCWZkX3RleHQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlmZF90ZXh0LmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMjUsIDApOworCQlmZF90ZXh0LnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCXRleHQuc2V0TGF5b3V0RGF0YShmZF90ZXh0KTsKKwkJdGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBuZXcgTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChmaW5hbCBFdmVudCBldmVudCkgeworCQkJCWZpbHRlcmVkTGlzdC5zZXRGaWx0ZXIodGV4dC5nZXRUZXh0KCkpOworCQkJfQorCQl9KTsKKwkJaXNvS2V5TGV2ZWxEZXNjcmlwdGlvbiA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7CisJCWlzb0tleUxldmVsRGVzY3JpcHRpb24uc2V0VGV4dCgiTGFiZWwiKTsKKwkJRm9ybURhdGEgZmRfaXNvS2V5TGV2ZWxEZXNjcmlwdGlvbjsKKwkJZmRfaXNvS2V5TGV2ZWxEZXNjcmlwdGlvbiA9IG5ldyBGb3JtRGF0YSgpOworCQlmZF9pc29LZXlMZXZlbERlc2NyaXB0aW9uLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0ZXh0LCAyLCBTV1QuVE9QKTsKKwkJZmRfaXNvS2V5TGV2ZWxEZXNjcmlwdGlvbi5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgyNSwgMCk7CisJCWZkX2lzb0tleUxldmVsRGVzY3JpcHRpb24ubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJdGhpcy5pc29LZXlMZXZlbERlc2NyaXB0aW9uLnNldExheW91dERhdGEoZmRfaXNvS2V5TGV2ZWxEZXNjcmlwdGlvbik7CisKKwkJZmlsdGVyZWRMaXN0ID0gbmV3IEZpbHRlcmVkTGlzdCh0aGlzLCBTV1QuQk9SREVSLCBudWxsLCBmYWxzZSwgZmFsc2UsCisJCQkJdHJ1ZSk7CisJCWZpbmFsIEZvcm1EYXRhIGZkX2ZpbHRlcmVkTGlzdCA9IG5ldyBGb3JtRGF0YSgpOworCQlmZF9maWx0ZXJlZExpc3QudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRleHQsIDUsIFNXVC5ERUZBVUxUKTsKKwkJZmRfZmlsdGVyZWRMaXN0LmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQlmZF9maWx0ZXJlZExpc3QubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCh0ZXh0LCAwLCBTV1QuTEVGVCk7CisJCWZkX2ZpbHRlcmVkTGlzdC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCh0ZXh0LCAwLCBTV1QuUklHSFQpOworCQlmaWx0ZXJlZExpc3Quc2V0TGF5b3V0RGF0YShmZF9maWx0ZXJlZExpc3QpOworCQlmaWx0ZXJlZExpc3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKGZpbmFsIFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlmaW5hbCBPYmplY3RbXSBzZWxlY3RlZCA9IGZpbHRlcmVkTGlzdC5nZXRTZWxlY3Rpb24oKTsKKwkJCQkvLyBBbnl0aGluZyBzZWxlY3RlZD8KKwkJCQlpZiAoc2VsZWN0ZWQubGVuZ3RoID09IDEpIHsKKwkJCQkJZmluYWwgU3RyaW5nIGlzb0tleSA9IChTdHJpbmcpIHNlbGVjdGVkWzBdOworCQkJCQlmaXJlSVNPS2V5UGlja2VkKGlzb0tleSk7CisJCQkJfQorCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChmaW5hbCBTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7CisJCQl9CisJCX0pOworCisJCWZpbHRlcmVkTGlzdC5zZXRJZ25vcmVDYXNlKHRydWUpOworCQlmaWx0ZXJlZExpc3Quc2V0RmlsdGVyKCIiKTsKKwkJZmlsdGVyZWRMaXN0LnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChmaW5hbCBPYmplY3QgZWxlbWVudCkgeworCQkJCXJldHVybiBnZXROYW1lKChTdHJpbmcpIGVsZW1lbnQsIGlzb0tleUxldmVsKTsKKwkJCX0KKwkJfSk7CisJCWZpbHRlcmVkTGlzdC5zZXRFbGVtZW50cyhuZXcgT2JqZWN0W10ge30pOworCisJCXBhY2soKTsKKwl9IC8vIElTT0tleVBpY2tlcgorCisJcHVibGljIHZvaWQgc2V0SVNPS2V5cyhmaW5hbCBPYmplY3RbXSBpc29LZXlzKSB7CisJCWZpbHRlcmVkTGlzdC5zZXRFbGVtZW50cyhpc29LZXlzKTsKKwkJdGV4dC5zZXRUZXh0KCIiKTsKKwl9IC8vIHNldElTT0tleXMKKworCXB1YmxpYyB2b2lkIHNldElTT0tleUxldmVsRGVzY3JpcHRpb24oZmluYWwgU3RyaW5nIGlzb0tleUxldmVsRGVzY3JpcHRpb24pIHsKKwkJdGhpcy5pc29LZXlMZXZlbERlc2NyaXB0aW9uLnNldFRleHQoaXNvS2V5TGV2ZWxEZXNjcmlwdGlvbik7CisJfSAvLyBzZXRJU09LZXlMZXZlbERlc2NyaXB0aW9uCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBpc28ga2V5IGxldmVsCisJICovCisJcHVibGljIGludCBnZXRJU09LZXlMZXZlbCgpIHsKKwkJcmV0dXJuIGlzb0tleUxldmVsOworCX0KKworCXB1YmxpYyB2b2lkIHNldElTT0tleUxldmVsKGZpbmFsIGludCBpc29LZXlMZXZlbCkgeworCQl0aGlzLmlzb0tleUxldmVsID0gaXNvS2V5TGV2ZWw7CisJfSAvLyBzZXRMZXZlbAorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZShmaW5hbCBTdHJpbmcgaXNvS2V5LCBmaW5hbCBpbnQgbGV2ZWwpIHsKKwkJcmV0dXJuIEdlb2dyYXBoaWNOYW1lcy5nZXROYW1lKGlzb0tleSwgbGV2ZWwpOworCX0gLy8gZ2V0TmFtZQorCisJcHVibGljIHZvaWQgYWRkSVNPS2V5UGlja2VkTGlzdGVuZXIoZmluYWwgSVNPS2V5UGlja2VkRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwl9IC8vIGFkZElTT0tleVBpY2tlZExpc3RlbmVyCisKKwlwdWJsaWMgdm9pZCByZW1vdmVJU09LZXlQaWNrZWRMaXN0ZW5lcigKKwkJCWZpbmFsIElTT0tleVBpY2tlZEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfSAvLyByZW1vdmVJU09LZXlQaWNrZWRMaXN0ZW5lcgorCisJcHJpdmF0ZSB2b2lkIGZpcmVJU09LZXlQaWNrZWQoZmluYWwgU3RyaW5nIGlzb0tleSkgeworCQlmaW5hbCBJU09LZXlQaWNrZWRFdmVudCBpc29LZXlQaWNrZWRFdmVudCA9IG5ldyBJU09LZXlQaWNrZWRFdmVudCh0aGlzLAorCQkJCWlzb0tleSk7CisJCWZvciAoZmluYWwgSVNPS2V5UGlja2VkRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgeworCQkJbGlzdGVuZXIuaXNvS2V5UGlja2VkKGlzb0tleVBpY2tlZEV2ZW50KTsKKwkJfSAvLyBmb3IgZWFjaCBJU09LZXlQaWNrZWRFdmVudExpc3RlbmVyCisJfQorfSAvLyBJU09LZXlQaWNrZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL0luZmVjdG9yRGVmaW5pdGlvbkNvbXBvc2l0ZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvSW5mZWN0b3JEZWZpbml0aW9uQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0ZjEyNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL0luZmVjdG9yRGVmaW5pdGlvbkNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNzQ4IEBACisvLyBJbmZlY3RvckRlZmluaXRpb25Db250cm9sLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5Lkdlb2dyYXBoaWNNYXBwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5HZW9ncmFwaGljTmFtZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aWRnZXRzLkxvY2F0aW9uUGlja2VyRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBTV1QgY29tcG9zaXRlIHRoYXQgcHJvdmlkZXMgdGhlIEdVSSBmb3IgZGVmaW5pbmcgYW4KKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3J9IGluIHRoZQorICoge0BsaW5rIE5ld0luZmVjdG9yV2l6YXJkfS4KKyAqLworcHVibGljIGNsYXNzIEluZmVjdG9yRGVmaW5pdGlvbkNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7CisKKwkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgTEVWRUxfMF9JU09fTkFNRV9GSUxFX1VSSSA9IFVSSQorCS8vIC5jcmVhdGVVUkkoInBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvY291bnRyeS9aWlovbGV2ZWwwSVNPTmFtZXMucHJvcGVydGllcyIpOworCisJcHJpdmF0ZSBTdHJpbmcgaXNvS2V5ID0gIiI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIFVSSSB0YXJnZXRVUkkgPSBudWxsOworCQorCXByaXZhdGUgVGV4dCBudW1iZXJPZkluZmVjdGlvbnNUZXh0OworCisJcHJpdmF0ZSBmaW5hbCBUZXh0IHBvcHVsYXRpb25UZXh0OworCisJcHJpdmF0ZSBmaW5hbCBUZXh0IGRpc2Vhc2VOYW1lVGV4dDsKKwkKKwlwcml2YXRlIExhYmVsIG51bWJlck9mSW5mZWN0aW9uc0xhYmVsOworCisJcHJpdmF0ZSBMYWJlbCBsb2dEaXJMYWJlbDsKKwlwcml2YXRlIFRleHQgbG9nRGlyVGV4dDsKKwkKKwlwcml2YXRlIFN0cmluZyBlcnJvck1lc3NhZ2U7CisJCisJLyoqCisJICogUmFkaW8gYnV0dG9ucyB0byBzcGVjaWZ5IGlmIHRoZSB3aXphcmQgd2lsbCBjcmVhdGUgYW4gaW5mZWN0b3IKKwkgKiBvciBhbiBpbm9jdWxhdG9yLgorCSAqLworCXByaXZhdGUgQnV0dG9uW10gaW5mZWN0b3JNb2RlUmFkaW9CdXR0b25zID0gbmV3IEJ1dHRvblsyXTsKKwlwcml2YXRlIEJ1dHRvbltdIGltcG9ydFJhZGlvQnV0dG9ucyA9IG5ldyBCdXR0b25bMl07CisJCisJcHJpdmF0ZSBCdXR0b24gdXNlQWJzb2x1dGVOdW1iZXJCdXR0b24gPSBudWxsOworCXByaXZhdGUgQnV0dG9uIHVzZVBlcmNlbnRhZ2VCdXR0b24gPSBudWxsOworCXByaXZhdGUgQnV0dG9uIGxvY2F0aW9uQnV0dG9uID0gbnVsbDsKKwkKKwlwcml2YXRlIEJ1dHRvbltdIHJvd0J1dHRvbnMgPSBuZXcgQnV0dG9uWzNdOworCUNvbXBvc2l0ZSByb3dDb21wb3NpdGUgPSBudWxsOworCQorCXByaXZhdGUgQnV0dG9uIGltcG9ydEZpbGVCdXR0b24gPSBudWxsOworCXByaXZhdGUgYm9vbGVhbiBpbXBvcnRGcm9tRmlsZSA9IGZhbHNlOworCXByaXZhdGUgYm9vbGVhbiB1c2VGaXJzdFJvdyA9IHRydWU7CisJcHJpdmF0ZSBib29sZWFuIHVzZUxhc3RSb3cgPSBmYWxzZTsKKwlwcml2YXRlIGJvb2xlYW4gdXNlU2VsZWN0ZWRSb3cgPSBmYWxzZTsKKwkKKwlUZXh0IHJvd3R4dCA9IG51bGw7CisJCisJTGFiZWwgaXNva2V5VmFsdWVMYWJlbCA9IG51bGw7CisJCisJLyoqIAorCSAqIGtlZXAgdHJhY2sgb2YgdGhlIG1vZGUuCisJICogaW5mZWN0b3IgYnkgZGVmYXVsdAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpbmZlY3Rvck1vZGUgPSB0cnVlOworCQorCS8qKgorCSAqIGtlZXAgdHJhY2sgb2YgcGVyY2VudGFnZSBvciBhYnNvbHV0ZSBudW1iZXIKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gcGVyY2VudGFnZSA9IGZhbHNlOworCisJLyoqCisJICogVGhlIHByb2plY3QgKGZvciBsb2NhdGlvbiBwaWNrZXIpCisJICovCisJCisJcHVibGljIElQcm9qZWN0IGN1cnJlbnRQcm9qZWN0OworCQorCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqLworCXB1YmxpYyBJbmZlY3RvckRlZmluaXRpb25Db21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgaW50IHN0eWxlLAorCQkJZmluYWwgTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvciwgZmluYWwgSVByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKKwkJCisJCXRoaXMuY3VycmVudFByb2plY3QgPSBwcm9qZWN0OworCQkKKwkJc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOworCQkKKwkJZmluYWwgaW50IG1hcmdpbjEgPSAzNTsKKwkJZmluYWwgaW50IG1hcmdpbjIgPSAyNTsKKwkJCisJCS8vIHJhZGlvIGJ1dHRvbnMgdG8gc2V0IHRoZSBtb2RlCisJCUNvbXBvc2l0ZSBpbmZlY3Rvck1vZGVDb21wb3NpdGUgPSBjcmVhdGVJbmZlY3Rvck1vZGVSYWRpb0J1dHRvbnNDb21wb3NpdGUodGhpcywgcHJvamVjdFZhbGlkYXRvcik7CisJCWZpbmFsIEZvcm1EYXRhIGZkX2luZmVjdG9yTW9kZSA9IG5ldyBGb3JtRGF0YSgpOworCQlmZF9pbmZlY3Rvck1vZGUudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlmZF9pbmZlY3Rvck1vZGUuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDUsIDApOworCQlmZF9pbmZlY3Rvck1vZGUubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJZmRfaW5mZWN0b3JNb2RlLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCWluZmVjdG9yTW9kZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGZkX2luZmVjdG9yTW9kZSk7CisKKwkJCisJCS8vIERpc2Vhc2UgTmFtZQorCQlmaW5hbCBMYWJlbCBkaXNlYXNlTmFtZUxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKKwkJZmluYWwgRm9ybURhdGEgZmRfZGlzZWFzZU5hbWVMYWJlbCA9IG5ldyBGb3JtRGF0YSgpOworCQlmZF9kaXNlYXNlTmFtZUxhYmVsLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWZkX2Rpc2Vhc2VOYW1lTGFiZWwucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWFyZ2luMSwgMCk7CisJCWZkX2Rpc2Vhc2VOYW1lTGFiZWwudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGluZmVjdG9yTW9kZUNvbXBvc2l0ZSwgNSwgU1dULkJPVFRPTSk7CisJCWRpc2Vhc2VOYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShmZF9kaXNlYXNlTmFtZUxhYmVsKTsKKwkJZGlzZWFzZU5hbWVMYWJlbC5zZXRUZXh0KERpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5JbmZXaXpETiIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQorCQlkaXNlYXNlTmFtZVRleHQgPSBuZXcgVGV4dCh0aGlzLCBTV1QuQk9SREVSKTsKKwkJZGlzZWFzZU5hbWVUZXh0LnNldFRvb2xUaXBUZXh0KERpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5JbmZXaXpETlRUIikpOyAvLyROT04tTkxTLTEkCisJCWRpc2Vhc2VOYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihwcm9qZWN0VmFsaWRhdG9yKTsKKwkJCisJCWZpbmFsIEZvcm1EYXRhIGZkX2Rpc2Vhc2VOYW1lVGV4dCA9IG5ldyBGb3JtRGF0YSgpOworCQlmZF9kaXNlYXNlTmFtZVRleHQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChkaXNlYXNlTmFtZUxhYmVsLCAwKTsKKwkJZmRfZGlzZWFzZU5hbWVUZXh0LnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCWZkX2Rpc2Vhc2VOYW1lVGV4dC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoaW5mZWN0b3JNb2RlQ29tcG9zaXRlLCA1LCBTV1QuQk9UVE9NKTsKKwkJZGlzZWFzZU5hbWVUZXh0LnNldExheW91dERhdGEoZmRfZGlzZWFzZU5hbWVUZXh0KTsKKwkJCisKKwkJLy8gUG9wdWxhdGlvbgorCQlmaW5hbCBMYWJlbCBwb3B1bGF0aW9uTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOworCQlmaW5hbCBGb3JtRGF0YSBmZF9wb3B1bGF0aW9uTGFiZWwgPSBuZXcgRm9ybURhdGEoKTsKKwkJZmRfcG9wdWxhdGlvbkxhYmVsLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWZkX3BvcHVsYXRpb25MYWJlbC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChtYXJnaW4xLCAwKTsKKwkJZmRfcG9wdWxhdGlvbkxhYmVsLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChkaXNlYXNlTmFtZUxhYmVsLCA1LCBTV1QuQk9UVE9NKTsKKwkJcG9wdWxhdGlvbkxhYmVsLnNldExheW91dERhdGEoZmRfcG9wdWxhdGlvbkxhYmVsKTsKKwkJcG9wdWxhdGlvbkxhYmVsLnNldFRleHQoRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkluZldpelBPUCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCXBvcHVsYXRpb25UZXh0ID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7CisJCXBvcHVsYXRpb25UZXh0LnNldFRleHQoU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLkRJU0VBU0VfTU9ERUxfX1BPUFVMQVRJT05fSURFTlRJRklFUi5nZXREZWZhdWx0VmFsdWVMaXRlcmFsKCkpOworCQlwb3B1bGF0aW9uVGV4dC5zZXRUb29sVGlwVGV4dChEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSW5mV2l6UE9QVFQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJcG9wdWxhdGlvblRleHQuYWRkTW9kaWZ5TGlzdGVuZXIocHJvamVjdFZhbGlkYXRvcik7CisJCQorCQlmaW5hbCBGb3JtRGF0YSBmZF9wb3B1bGF0aW9uVGV4dCA9IG5ldyBGb3JtRGF0YSgpOworCQlmZF9wb3B1bGF0aW9uVGV4dC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZGlzZWFzZU5hbWVMYWJlbCwgNSwgU1dULkJPVFRPTSk7CisJCWZkX3BvcHVsYXRpb25UZXh0LmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocG9wdWxhdGlvbkxhYmVsLCAwKTsKKwkJZmRfcG9wdWxhdGlvblRleHQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJcG9wdWxhdGlvblRleHQuc2V0TGF5b3V0RGF0YShmZF9wb3B1bGF0aW9uVGV4dCk7CisJCQorCQkvLyBKSyBUaGUgTnVtYmVyIHRvIGluZmVjdCBpcyBub3cgYWRkZWQgaW5zaWRlIHRoZSBmb2xsb3dpbmcgY29tcG9zaXRlIAorCQlDb21wb3NpdGUgbnVtYmVyUGVyY2VudElucHV0Q29tcG9zaXRlID0gY3JlYXRlTnVtYmVyUGVyY2VudElucHV0Q29tcG9zaXRlKHRoaXMsIHByb2plY3RWYWxpZGF0b3IsIG1hcmdpbjEsIG1hcmdpbjIpOworCQlmaW5hbCBGb3JtRGF0YSBmZF9wZXJjZW50TW9kZSA9IG5ldyBGb3JtRGF0YSgpOworCQlmZF9wZXJjZW50TW9kZS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocG9wdWxhdGlvbkxhYmVsLCAxMCwgU1dULkJPVFRPTSk7CisJCWZkX3BlcmNlbnRNb2RlLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWZkX3BlcmNlbnRNb2RlLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCW51bWJlclBlcmNlbnRJbnB1dENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGZkX3BlcmNlbnRNb2RlKTsKKwkJLy8gVE9ETyBhZGQgaXQgaGVyZQorCQkKKwkJCisJCQorCQkKKwkJCisJCQorCQkvLyByYWRpbyBidXR0b25zIHRvIHNldCB0aGUgaW1wb3J0IAorCQlDb21wb3NpdGUgaW1wb3J0TW9kZUNvbXBvc2l0ZSA9IGNyZWF0ZUltcG9ydFJhZGlvQnV0dG9uc0NvbXBvc2l0ZSh0aGlzLCBwcm9qZWN0VmFsaWRhdG9yKTsKKwkJZmluYWwgRm9ybURhdGEgZmRfaW1wb3J0TW9kZSA9IG5ldyBGb3JtRGF0YSgpOworCQlmZF9pbXBvcnRNb2RlLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChudW1iZXJQZXJjZW50SW5wdXRDb21wb3NpdGUsIDEwLCBTV1QuQk9UVE9NKTsKKwkJZmRfaW1wb3J0TW9kZS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlmZF9pbXBvcnRNb2RlLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCWltcG9ydE1vZGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShmZF9pbXBvcnRNb2RlKTsKKwkJCisJCWltcG9ydEZpbGVCdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5CT1JERVIpOworCQlpbXBvcnRGaWxlQnV0dG9uLnNldFRleHQoRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkluZldpekltcG9ydCIpKTsKKwkJZmluYWwgRm9ybURhdGEgZmRfaW1wb3J0QnV0dG9uPSBuZXcgRm9ybURhdGEoKTsKKwkJZmRfaW1wb3J0QnV0dG9uLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWZkX2ltcG9ydEJ1dHRvbi5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQlmZF9pbXBvcnRCdXR0b24udG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGltcG9ydE1vZGVDb21wb3NpdGUsIDUsIFNXVC5CT1RUT00pOworCQlpbXBvcnRGaWxlQnV0dG9uLnNldExheW91dERhdGEoZmRfaW1wb3J0QnV0dG9uKTsKKwkJaW1wb3J0RmlsZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCisJCS8vIExvZyBmaWxlIGxvY2F0aW9uCisJCWxvZ0RpckxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKKwkJbG9nRGlyTGFiZWwuc2V0VGV4dChEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSW5mV2l6TG9nRGlyTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlmaW5hbCBGb3JtRGF0YSBmZF9sb2dEaXJMYWJlbCA9IG5ldyBGb3JtRGF0YSgpOworCQlmZF9sb2dEaXJMYWJlbC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoaW1wb3J0RmlsZUJ1dHRvbiw1LCBTV1QuQk9UVE9NKTsKKwkJZmRfbG9nRGlyTGFiZWwubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJZmRfbG9nRGlyTGFiZWwucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWFyZ2luMSwgMCk7CisJCWxvZ0RpckxhYmVsLnNldExheW91dERhdGEoZmRfbG9nRGlyTGFiZWwpOworCQkKKwkJbG9nRGlyVGV4dCA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOworCQlsb2dEaXJUZXh0LnNldFRleHQoIiIpOworCQlsb2dEaXJUZXh0LnNldEVkaXRhYmxlKHRydWUpOworCQlsb2dEaXJUZXh0LnNldEVuYWJsZWQoZmFsc2UpOworCQlsb2dEaXJUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHByb2plY3RWYWxpZGF0b3IpOworCQorCQlmaW5hbCBGb3JtRGF0YSBmZF9sb2dEaXJUZXh0ID0gbmV3IEZvcm1EYXRhKCk7CisJCWZkX2xvZ0RpclRleHQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChsb2dEaXJMYWJlbCwgMCk7CisJCWZkX2xvZ0RpclRleHQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJZmRfbG9nRGlyVGV4dC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoaW1wb3J0RmlsZUJ1dHRvbiwgNSwgU1dULkJPVFRPTSk7CisJCWxvZ0RpclRleHQuc2V0TGF5b3V0RGF0YShmZF9sb2dEaXJUZXh0KTsKKwkJCQorCQkvLyByYWRpbyBidXR0b25zIHRvIHNldCB0aGUgcm93CisJCXJvd0NvbXBvc2l0ZSA9IGNyZWF0ZVJvd1JhZGlvQnV0dG9uc0NvbXBvc2l0ZSh0aGlzLCBwcm9qZWN0VmFsaWRhdG9yKTsKKwkJZmluYWwgRm9ybURhdGEgZmRfcm93ID0gbmV3IEZvcm1EYXRhKCk7CisJCWZkX3Jvdy50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobG9nRGlyTGFiZWwsIDEwLCBTV1QuQk9UVE9NKTsKKwkJZmRfcm93LmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWZkX3Jvdy5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQlyb3dDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShmZF9yb3cpOworCQlyb3dDb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7CisJCQorCQkJCQkJCQkKKwkJZmluYWwgU2hlbGwgc2hlbGwgPSB0aGlzLmdldFNoZWxsKCk7CisJCWltcG9ydEZpbGVCdXR0b24KKwkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCgKKwkJCQkJCQlmaW5hbCBTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCQlmaW5hbCBEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKAorCQkJCQkJCQlzaGVsbCwgU1dULk9QRU4pOworCQkJCQkJZGQKKwkJCQkJCQkJLnNldFRleHQoRGlzZWFzZVdpemFyZE1lc3NhZ2VzCisJCQkJCQkJCQkJLmdldFN0cmluZygiTkluZldpekxvZ0RpckRlc2MiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWZpbmFsIFN0cmluZyBzZWxlY3RlZCA9IGRkLm9wZW4oKTsKKwkJCQkJCWxvZ0RpclRleHQuc2V0VGV4dChzZWxlY3RlZCk7CisJCQkJCQlwcm9qZWN0VmFsaWRhdG9yLm1vZGlmeVRleHQobnVsbCk7CisJCQkJCX0gLy8gd2lkZ2V0U2VsZWN0ZWQKKwkJCQl9IC8vIFNlbGVjdGlvbkFkYXB0ZXIKKwkJCQkpOworCQkKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsICJvcmcuZWNsaXBzZS5zdGVtLmRvYy5uZXdpbmZlY3Rvcmlub2N1bGF0b3JfY29udGV4dGlkIik7CisKKwl9Ly8gSW5mZWN0b3JEZWZpbml0aW9uQ29udHJvbAorCisJCisJLyoqCisJICogY3JlYXRlcyBhIHNldCBvZiByYWRpbyBidXR0b25zIGFuZCB0aGVpciBjb21wb3NpdGUgY29udGFpbmVyIGZvciB0aGUgdXNlciB0byBzcGVjaWZ5CisJICogdGhlIGNyZWF0aW9uIG9mIGFuIGluZmVjdG9yIE9SIGFuIGlub2N1bGF0b3IKKwkgKiBAcGFyYW0gcGFyZW50CisJICogQHJldHVybiB0aGUgY29tcG9zaXRlCisJICovCisJQ29tcG9zaXRlIGNyZWF0ZUluZmVjdG9yTW9kZVJhZGlvQnV0dG9uc0NvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBNb2RpZnlMaXN0ZW5lciBwcm9qZWN0VmFsaWRhdG9yKSB7CisJCUNvbXBvc2l0ZSByYWRpb0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuQk9SREVSKTsKKwkgICAgRmlsbExheW91dCBmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoKTsKKwkgICAgZmlsbExheW91dC50eXBlID0gU1dULlZFUlRJQ0FMOworCSAgICByYWRpb0NvbXBvc2l0ZS5zZXRMYXlvdXQoZmlsbExheW91dCk7CisJICAgIAorCSAgICBpbmZlY3Rvck1vZGVSYWRpb0J1dHRvbnNbMF0gPSBuZXcgQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBTV1QuUkFESU8pOworCSAgICBpbmZlY3Rvck1vZGVSYWRpb0J1dHRvbnNbMF0uc2V0U2VsZWN0aW9uKHRydWUpOworCSAgICBpbmZlY3Rvck1vZGVSYWRpb0J1dHRvbnNbMF0uc2V0VGV4dChEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSW5mZWN0b3JXaXouaW5mZWN0IikpOy8vJE5PTi1OTFMtMSQKKwkgICAgCisJICAgIGluZmVjdG9yTW9kZVJhZGlvQnV0dG9uc1sxXSA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7CisJICAgIGluZmVjdG9yTW9kZVJhZGlvQnV0dG9uc1sxXS5zZXRUZXh0KERpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5JbmZlY3Rvcldpei5pbm9jdWxhdGUiKSk7Ly8kTk9OLU5MUy0xJAorCSAgICAJICAgIAorCSAgICBMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKKwkgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJICAgICAgICAgIGlmIChldmVudC53aWRnZXQgPT0gaW5mZWN0b3JNb2RlUmFkaW9CdXR0b25zWzBdKSB7CisJICAgICAgICAJaW5mZWN0b3JNb2RlID0gaW5mZWN0b3JNb2RlUmFkaW9CdXR0b25zWzBdLmdldFNlbGVjdGlvbigpOworCSAgICAgICAgICB9CisJICAgICAgICAgIGlmKCFpc1BlcmNlbnRhZ2UoKSkgCisJICAgICAgICAJICBpZihpc0luZmVjdG9yTW9kZSgpKSBudW1iZXJPZkluZmVjdGlvbnNMYWJlbC5zZXRUZXh0KERpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5JbmZXaXpOSUlORiIpKTsgLy8kTk9OLU5MUy0xJAorCSAgICAgICAgCSAgZWxzZSBudW1iZXJPZkluZmVjdGlvbnNMYWJlbC5zZXRUZXh0KERpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5JbmZXaXpOSUlOTyIpKTsgLy8kTk9OLU5MUy0xJAorCSAgICAgICAgICBlbHNlIGlmKGlzSW5mZWN0b3JNb2RlKCkpCisJICAgICAgICAJICBudW1iZXJPZkluZmVjdGlvbnNMYWJlbC5zZXRUZXh0KERpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5JbmZXaXpQSUlORiIpKTsgLy8kTk9OLU5MUy0xJAorCSAgICAgICAgICBlbHNlIG51bWJlck9mSW5mZWN0aW9uc0xhYmVsLnNldFRleHQoRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkluZldpelBJSU5PIikpOyAvLyROT04tTkxTLTEkCisKKwkgICAgICAgICAgcHJvamVjdFZhbGlkYXRvci5tb2RpZnlUZXh0KG51bGwpOworCSAgICAgICAgfQorCSAgICAgIH07CisJICAgICAgLy8gdGhlc2UgYXJlIHJhZGlvIGJ1dHRvbnMgc28gd2Ugb25seSBuZWVkIHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gb25lIG9mIHRoZW0uCisJICAgICAgaW5mZWN0b3JNb2RlUmFkaW9CdXR0b25zWzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKKwkgICAgICAKKwkgICAgcmV0dXJuIHJhZGlvQ29tcG9zaXRlOworCX0vL2dldGluZmVjdG9yTW9kZVJhZGlvQnV0dG9uc0NvbXBvc2l0ZQorCQorCS8qKgorCSAqIENyZWF0ZSByYWRpbyBidXR0b25zIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGltcG9ydCBmcm9tIGZpbGUgb3Igbm90CisJICogCisJICogQHBhcmFtIHBhcmVudAorCSAqIEByZXR1cm4gdGhlIGNvbXBvc2l0ZQorCSAqLworCUNvbXBvc2l0ZSBjcmVhdGVJbXBvcnRSYWRpb0J1dHRvbnNDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvcikgeworCQlDb21wb3NpdGUgcmFkaW9Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULkJPUkRFUik7CisJICAgIEZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7CisJICAgIGZpbGxMYXlvdXQudHlwZSA9IFNXVC5WRVJUSUNBTDsKKwkgICAgcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0KGZpbGxMYXlvdXQpOworCSAgICAKKwkgICAgaW1wb3J0UmFkaW9CdXR0b25zWzBdID0gbmV3IEJ1dHRvbihyYWRpb0NvbXBvc2l0ZSwgU1dULlJBRElPKTsKKwkgICAgaW1wb3J0UmFkaW9CdXR0b25zWzBdLnNldFNlbGVjdGlvbih0cnVlKTsKKwkgICAgaW1wb3J0UmFkaW9CdXR0b25zWzBdLnNldFRleHQoRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkluZmVjdG9yV2l6LmVudGVyIikpOy8vJE5PTi1OTFMtMSQKKwkgICAgCisJICAgIGltcG9ydFJhZGlvQnV0dG9uc1sxXSA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7CisJICAgIGltcG9ydFJhZGlvQnV0dG9uc1sxXS5zZXRUZXh0KERpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5JbmZlY3Rvcldpei5pbXBvcnQiKSk7Ly8kTk9OLU5MUy0xJAorCSAgICAJICAgIAorCSAgICBMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKKwkgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJICAgICAgICAgIGlmIChldmVudC53aWRnZXQgPT0gaW1wb3J0UmFkaW9CdXR0b25zWzBdKSB7CisJICAgICAgICAJaW1wb3J0RnJvbUZpbGUgPSAhaW1wb3J0UmFkaW9CdXR0b25zWzBdLmdldFNlbGVjdGlvbigpOworCSAgICAgICAgCWlmKGltcG9ydEZyb21GaWxlKSB7CisJICAgICAgICAJCWltcG9ydEZpbGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKwkgICAgICAgIAkJbnVtYmVyT2ZJbmZlY3Rpb25zVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKKwkgICAgICAgIAkJbG9nRGlyVGV4dC5zZXRFbmFibGVkKHRydWUpOworCSAgICAgICAgCQlyb3dDb21wb3NpdGUuc2V0RW5hYmxlZCh0cnVlKTsKKwkgICAgICAgIAkJbG9jYXRpb25CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJICAgICAgICAJfSBlbHNlIHsKKwkgICAgICAgIAkJaW1wb3J0RmlsZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkgICAgICAgIAkJbnVtYmVyT2ZJbmZlY3Rpb25zVGV4dC5zZXRFbmFibGVkKHRydWUpOworCSAgICAgICAgCQlsb2dEaXJUZXh0LnNldEVuYWJsZWQoZmFsc2UpOworCSAgICAgICAgCQlyb3dDb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7CisJICAgICAgICAJCWxvY2F0aW9uQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisJICAgICAgICAJfQorCSAgICAgICAgICB9CisJICAgICAgICAgIHByb2plY3RWYWxpZGF0b3IubW9kaWZ5VGV4dChudWxsKTsKKwkgICAgICAgIH0KKwkgICAgICB9OworCSAgICAgIC8vIHRoZXNlIGFyZSByYWRpbyBidXR0b25zIHNvIHdlIG9ubHkgbmVlZCB0byBhZGQgdGhlIGxpc3RlbmVyIHRvIG9uZSBvZiB0aGVtLgorCSAgICAgIGltcG9ydFJhZGlvQnV0dG9uc1swXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7CisJICAgICAgCisJICAgIHJldHVybiByYWRpb0NvbXBvc2l0ZTsKKwl9Ly8KKwkKKwkvKioKKwkgKiBDcmVhdGUgcmFkaW8gYnV0dG9ucyB0byBkZXRlcm1pbmUgd2hhdCByb3cgdG8gdXNlIHdoZW4gaW1wb3J0aW5nCisJICogCisJICogQHBhcmFtIHBhcmVudAorCSAqIEByZXR1cm4gdGhlIGNvbXBvc2l0ZQorCSAqLworCUNvbXBvc2l0ZSBjcmVhdGVSb3dSYWRpb0J1dHRvbnNDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvcikgeworCQlDb21wb3NpdGUgcmFkaW9Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULkJPUkRFUik7CisJICAgIEZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7CisJICAgIGZpbGxMYXlvdXQudHlwZSA9IFNXVC5IT1JJWk9OVEFMOworCSAgICByYWRpb0NvbXBvc2l0ZS5zZXRMYXlvdXQoZmlsbExheW91dCk7CisJICAgIAorCSAgICByb3dCdXR0b25zWzBdID0gbmV3IEJ1dHRvbihyYWRpb0NvbXBvc2l0ZSwgU1dULlJBRElPKTsKKwkgICAgcm93QnV0dG9uc1swXS5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJICAgIHJvd0J1dHRvbnNbMF0uc2V0VGV4dChEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSW5mZWN0b3JXaXouZmlyc3Ryb3ciKSk7Ly8kTk9OLU5MUy0xJAorCSAgICAKKwkgICAgcm93QnV0dG9uc1sxXSA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7CisJICAgIHJvd0J1dHRvbnNbMV0uc2V0VGV4dChEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSW5mZWN0b3JXaXoubGFzdHJvdyIpKTsvLyROT04tTkxTLTEkCisJICAgIAkKKwkgICAgcm93QnV0dG9uc1syXSA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7CisJICAgIHJvd0J1dHRvbnNbMl0uc2V0VGV4dChEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSW5mZWN0b3JXaXouc2VsZWN0ZWRyb3ciKSk7Ly8kTk9OLU5MUy0xJAorCSAgICAKKwkgICAgcm93dHh0ID0gbmV3IFRleHQocmFkaW9Db21wb3NpdGUsIFNXVC5OT05FKTsKKwkgICAgcm93dHh0LnNldFRleHQoIjAiKTsKKwkgICAgcm93dHh0LnNldEVkaXRhYmxlKGZhbHNlKTsKKwkgICAgcm93dHh0LmFkZE1vZGlmeUxpc3RlbmVyKHByb2plY3RWYWxpZGF0b3IpOworCSAgICAKKwkgICAgTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7CisJICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCSAgICAgICAgCXVzZUZpcnN0Um93ID0gcm93QnV0dG9uc1swXS5nZXRTZWxlY3Rpb24oKTsKKwkgICAgICAgIAl1c2VMYXN0Um93ID0gcm93QnV0dG9uc1sxXS5nZXRTZWxlY3Rpb24oKTsKKwkgICAgICAgIAl1c2VTZWxlY3RlZFJvdyA9IHJvd0J1dHRvbnNbMl0uZ2V0U2VsZWN0aW9uKCk7CisJICAgICAgICAJaWYodXNlRmlyc3RSb3cgfHwgdXNlTGFzdFJvdykgeworCSAgICAgICAgCQlyb3d0eHQuc2V0RWRpdGFibGUoZmFsc2UpOworCSAgICAgICAgCX0gZWxzZSB7CisJICAgICAgICAJCXJvd3R4dC5zZXRFZGl0YWJsZSh0cnVlKTsKKwkgICAgICAgIAl9CisJICAgICAgICAJIHByb2plY3RWYWxpZGF0b3IubW9kaWZ5VGV4dChudWxsKTsKKwkgICAgICAgIH0KKwkgICAgICB9OworCSAgICAgIC8vIHRoZXNlIGFyZSByYWRpbyBidXR0b25zIHNvIHdlIG9ubHkgbmVlZCB0byBhZGQgdGhlIGxpc3RlbmVyIHRvIG9uZSBvZiB0aGVtLgorCSAgICAgIHJvd0J1dHRvbnNbMF0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOworCSAgICAgIHJvd0J1dHRvbnNbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOworCSAgICAgIHJvd0J1dHRvbnNbMl0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOworCSAgICByZXR1cm4gcmFkaW9Db21wb3NpdGU7CisJfS8vCisJCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqIEByZXR1cm4gdGhlIGNvbXBvc2l0ZQorCSAqLworCUNvbXBvc2l0ZSBjcmVhdGVOdW1iZXJQZXJjZW50SW5wdXRDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvciwgZmluYWwgaW50IG1hcmdpbjEsIGZpbmFsIGludCBtYXJnaW4yKSB7CisJICAgIENvbXBvc2l0ZSByYWRpbzJDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULkJPUkRFUik7CisJICAgIAorCSAgICByYWRpbzJDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOworCSAgICAKKwkgICAgCisJICAgIHVzZUFic29sdXRlTnVtYmVyQnV0dG9uID0gbmV3IEJ1dHRvbihyYWRpbzJDb21wb3NpdGUsIFNXVC5SQURJTyk7CisJICAgIHVzZUFic29sdXRlTnVtYmVyQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKKwkgICAgdXNlQWJzb2x1dGVOdW1iZXJCdXR0b24uc2V0VGV4dChEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSW5mV2l6LmFic251bWJlciIpKTsKKwkgICAgZmluYWwgRm9ybURhdGEgZmRfbnVtYmVyQnV0dG9uID0gbmV3IEZvcm1EYXRhKCk7CisJCWZkX251bWJlckJ1dHRvbi50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWZkX251bWJlckJ1dHRvbi5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlmZF9udW1iZXJCdXR0b24ucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobWFyZ2luMSwgMCk7CisJCXVzZUFic29sdXRlTnVtYmVyQnV0dG9uLnNldExheW91dERhdGEoZmRfbnVtYmVyQnV0dG9uKTsKKwkgICAgCisJICAgIHVzZVBlcmNlbnRhZ2VCdXR0b24gPSBuZXcgQnV0dG9uKHJhZGlvMkNvbXBvc2l0ZSwgU1dULlJBRElPKTsKKwkgICAgdXNlUGVyY2VudGFnZUJ1dHRvbi5zZXRUZXh0KERpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5JbmZXaXoucGVyY2VudGFnZSIpKTsKKwkgICAgZmluYWwgRm9ybURhdGEgZmRfcGVyY2VudEJ1dHRvbiA9IG5ldyBGb3JtRGF0YSgpOworCQlmZF9wZXJjZW50QnV0dG9uLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh1c2VBYnNvbHV0ZU51bWJlckJ1dHRvbiwgMCk7CisJCWZkX3BlcmNlbnRCdXR0b24ubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJZmRfcGVyY2VudEJ1dHRvbi5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChtYXJnaW4xLCAwKTsKKwkJdXNlUGVyY2VudGFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGZkX3BlcmNlbnRCdXR0b24pOworCSAgICAKKwkgICAgCisJICAgIC8vIFNUQVJUIGFkZGluZyBOdW1iZXIgb2YgSW5mZWN0aW9ucworCQludW1iZXJPZkluZmVjdGlvbnNMYWJlbCA9IG5ldyBMYWJlbChyYWRpbzJDb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJbnVtYmVyT2ZJbmZlY3Rpb25zTGFiZWwuc2V0VGV4dChEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSW5mV2l6TklJTkYiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlmaW5hbCBGb3JtRGF0YSBmZF9udW1iZXJPZkluZmVjdGlvbnNMYWJlbCA9IG5ldyBGb3JtRGF0YSgpOworCQlmZF9udW1iZXJPZkluZmVjdGlvbnNMYWJlbC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodXNlUGVyY2VudGFnZUJ1dHRvbiwgMCk7CisJCWZkX251bWJlck9mSW5mZWN0aW9uc0xhYmVsLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWZkX251bWJlck9mSW5mZWN0aW9uc0xhYmVsLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1hcmdpbjEsIDApOworCQludW1iZXJPZkluZmVjdGlvbnNMYWJlbC5zZXRMYXlvdXREYXRhKGZkX251bWJlck9mSW5mZWN0aW9uc0xhYmVsKTsKKwkJCisJCW51bWJlck9mSW5mZWN0aW9uc1RleHQgPSBuZXcgVGV4dChyYWRpbzJDb21wb3NpdGUsIFNXVC5CT1JERVIpOworCQludW1iZXJPZkluZmVjdGlvbnNUZXh0LnNldFRleHQoU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNJX0lORkVDVE9SX19JTkZFQ1RJT1VTX0NPVU5ULmdldERlZmF1bHRWYWx1ZUxpdGVyYWwoKSk7CisJCW51bWJlck9mSW5mZWN0aW9uc1RleHQuc2V0VG9vbFRpcFRleHQoRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkluZldpek5JVFQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJbnVtYmVyT2ZJbmZlY3Rpb25zVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihwcm9qZWN0VmFsaWRhdG9yKTsKKwkJCisJCWZpbmFsIEZvcm1EYXRhIGZkX251bWJlck9mSW5mZWN0aW9uc1RleHQgPSBuZXcgRm9ybURhdGEoKTsKKwkJZmRfbnVtYmVyT2ZJbmZlY3Rpb25zVGV4dC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodXNlUGVyY2VudGFnZUJ1dHRvbiwgMCk7CisJCWZkX251bWJlck9mSW5mZWN0aW9uc1RleHQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChudW1iZXJPZkluZmVjdGlvbnNMYWJlbCwgMCk7CisJCWZkX251bWJlck9mSW5mZWN0aW9uc1RleHQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJCisJCW51bWJlck9mSW5mZWN0aW9uc1RleHQuc2V0TGF5b3V0RGF0YShmZF9udW1iZXJPZkluZmVjdGlvbnNUZXh0KTsKKwkJLy8gRW5kIGFkZGluZyBOdW1iZXIgb2YgSW5mZWN0aW9ucworCQkKKwkJLy8gTG9jYXRpb24gQnV0dG9uCisJCWxvY2F0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbihyYWRpbzJDb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJbG9jYXRpb25CdXR0b24uc2V0VGV4dChEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSW5mV2l6UGlja0xvYyIpKTsKKwkJZmluYWwgRm9ybURhdGEgZmRfbG9jQnV0dG9uID0gbmV3IEZvcm1EYXRhKCk7CisJCWZkX2xvY0J1dHRvbi50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobnVtYmVyT2ZJbmZlY3Rpb25zTGFiZWwsIDApOworCQlmZF9sb2NCdXR0b24ubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLDApOworCQlsb2NhdGlvbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGZkX2xvY0J1dHRvbik7CisJCQorCQkvLyBJU08gS2V5CisJCWZpbmFsIExhYmVsIGlzb0tleUxhYmVsID0gbmV3IExhYmVsKHJhZGlvMkNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlpc29LZXlMYWJlbC5zZXRUZXh0KERpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5JbmZXaXpJU09LIikpOyAvLyROT04tTkxTLTEkCisJCQorCQlmaW5hbCBGb3JtRGF0YSBmZF9pc29LZXlMYWJlbCA9IG5ldyBGb3JtRGF0YSgpOworCQlmZF9pc29LZXlMYWJlbC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobG9jYXRpb25CdXR0b24sIDApOworCQlmZF9pc29LZXlMYWJlbC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlmZF9pc29LZXlMYWJlbC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChtYXJnaW4yLCAwKTsKKwkJaXNvS2V5TGFiZWwuc2V0TGF5b3V0RGF0YShmZF9pc29LZXlMYWJlbCk7CisJCQorCQlpc29rZXlWYWx1ZUxhYmVsID0gbmV3IExhYmVsKHJhZGlvMkNvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJCWlzb2tleVZhbHVlTGFiZWwuc2V0VGV4dChpc29LZXkpOworCQlmaW5hbCBGb3JtRGF0YSBmZF9pc29rZXlWYWx1ZUxhYmVsID0gbmV3IEZvcm1EYXRhKCk7CisJCWZkX2lzb2tleVZhbHVlTGFiZWwudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGxvY2F0aW9uQnV0dG9uLCAwKTsKKwkJZmRfaXNva2V5VmFsdWVMYWJlbC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGlzb0tleUxhYmVsLCAwKTsKKwkJZmRfaXNva2V5VmFsdWVMYWJlbC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQlpc29rZXlWYWx1ZUxhYmVsLnNldExheW91dERhdGEoZmRfaXNva2V5VmFsdWVMYWJlbCk7CisJCQorCQkvLyBJU08gS2V5CisJCWZpbmFsIExhYmVsIHNwYWNlckxhYmVsID0gbmV3IExhYmVsKHJhZGlvMkNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlzcGFjZXJMYWJlbC5zZXRUZXh0KCIgIik7IC8vJE5PTi1OTFMtMSQKKwkJCisJCWZpbmFsIEZvcm1EYXRhIGZkX3NwYWNlckxhYmVsID0gbmV3IEZvcm1EYXRhKCk7CisJCWZkX3NwYWNlckxhYmVsLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChpc29LZXlMYWJlbCwgMCk7CisJCWZkX3NwYWNlckxhYmVsLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWZkX3NwYWNlckxhYmVsLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG1hcmdpbjIsIDApOworCQlzcGFjZXJMYWJlbC5zZXRMYXlvdXREYXRhKGZkX3NwYWNlckxhYmVsKTsKKworCQkKKwkJCisJCS8vLy8vLy8vLy8vLy8vLy8KKwkJLy8KKwkJLy8gTGlzdGVuZXJzCisJCS8vCisJCS8vCisJCWxvY2F0aW9uQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKKwkJCQlMb2NhdGlvblBpY2tlckRpYWxvZyBscERpYWxvZyA9IG5ldyBMb2NhdGlvblBpY2tlckRpYWxvZyhJbmZlY3RvckRlZmluaXRpb25Db21wb3NpdGUudGhpcy5nZXRTaGVsbCgpLCBTV1QuTk9ORSwgRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkluZldpelBpY2tMb2NUaXRsZSIpLCBJbmZlY3RvckRlZmluaXRpb25Db21wb3NpdGUudGhpcy5pc29LZXksIGN1cnJlbnRQcm9qZWN0KTsKKwkJCQlPYmplY3QgW10gcmV0ID0gbHBEaWFsb2cub3BlbigpOworCQkJCWlmKHJldCAhPSBudWxsKSB7CisJCQkJCWlzb0tleSA9IChTdHJpbmcpcmV0WzBdOworCQkJCQl0YXJnZXRVUkkgPSAoVVJJKXJldFsxXTsKKwkJCQkJaXNva2V5VmFsdWVMYWJlbC5zZXRUZXh0KGlzb0tleSk7CisJCQkJCXByb2plY3RWYWxpZGF0b3IubW9kaWZ5VGV4dChudWxsKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7CisJCQkJCisJCQl9CisJCX0pOworCQkKKwkJCisJICAgIAorCSAgICAKKwkgICAgCisJICAgIExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgeworCSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkgICAgICAgICAgaWYoZXZlbnQud2lkZ2V0ID09IHVzZUFic29sdXRlTnVtYmVyQnV0dG9uIHx8IGV2ZW50LndpZGdldCA9PSB1c2VQZXJjZW50YWdlQnV0dG9uKSB7CisJCSAgICAgICAgICAvLyB0b2dnbGUgdGhlIHdpemFyZAorCSAgICAgICAgCSAgcGVyY2VudGFnZSA9IHVzZVBlcmNlbnRhZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCk7CisJCSAgICAgICAgICBpZighcGVyY2VudGFnZSkgCisJCSAgICAgICAgCSAgaWYoaXNJbmZlY3Rvck1vZGUoKSkgbnVtYmVyT2ZJbmZlY3Rpb25zTGFiZWwuc2V0VGV4dChEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSW5mV2l6TklJTkYiKSk7IC8vJE5PTi1OTFMtMSQKKwkJICAgICAgICAJICBlbHNlIG51bWJlck9mSW5mZWN0aW9uc0xhYmVsLnNldFRleHQoRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkluZldpek5JSU5PIikpOyAvLyROT04tTkxTLTEkCisJCSAgICAgICAgICBlbHNlIGlmKGlzSW5mZWN0b3JNb2RlKCkpCisJCSAgICAgICAgCSAgbnVtYmVyT2ZJbmZlY3Rpb25zTGFiZWwuc2V0VGV4dChEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSW5mV2l6UElJTkYiKSk7IC8vJE5PTi1OTFMtMSQKKwkJICAgICAgICAgIGVsc2UgbnVtYmVyT2ZJbmZlY3Rpb25zTGFiZWwuc2V0VGV4dChEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSW5mV2l6UElJTk8iKSk7IC8vJE5PTi1OTFMtMSQKKwkJICAgICAgICAgIC8vIGNsZWFyIHRoZSB0ZXh0IGJlY2F1c2Ugd2UgbmVlZCB0byByZXZhbGlkYXRlCisJICAgICAgICAgIH0KKwkgICAgICAgICAgcHJvamVjdFZhbGlkYXRvci5tb2RpZnlUZXh0KG51bGwpOworCSAgICAgICAgfQorCSAgICAgIH07CisJICAgICAgLy8gdGhlc2UgYXJlIHJhZGlvIGJ1dHRvbnMgc28gd2Ugb25seSBuZWVkIHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gb25lIG9mIHRoZW0uCisJICAgICAgdXNlQWJzb2x1dGVOdW1iZXJCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOworCSAgICAgIAorCSAgICByZXR1cm4gcmFkaW8yQ29tcG9zaXRlOworCX0vL2dldGluZmVjdG9yTW9kZVJhZGlvQnV0dG9uc0NvbXBvc2l0ZQorCisKKwkvKioKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50cyBvZiB0aGUgY29udHJvbCBhcmUgdmFsaWQsCisJICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgeworCQlib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKKwkJLy8gRGlzZWFzZSBOYW1lPworCQlpZiAoZ2V0RGlzZWFzZU5hbWUoKSA9PSBudWxsIHx8IGdldERpc2Vhc2VOYW1lKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkvLyBZZXMKKwkJCWVycm9yTWVzc2FnZSA9IERpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5JbmZXaXpFcnJvci4xIik7IC8vJE5PTi1OTFMtMSQKKwkJCXJldFZhbHVlID0gZmFsc2U7CisJCX0gLy8gaWYKKworCQkvLyBQb3B1bGF0aW9uCisJCWlmIChyZXRWYWx1ZSkgeworCQkJLy8gWWVzCisJCQlpZiAoZ2V0UG9wdWxhdGlvbigpID09IG51bGwgfHwgZ2V0UG9wdWxhdGlvbigpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCS8vIFllcworCQkJCWVycm9yTWVzc2FnZSA9IERpc2Vhc2VXaXphcmRNZXNzYWdlcworCQkJCQkJLmdldFN0cmluZygiTkluZldpekVycm9yLjIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldFZhbHVlID0gZmFsc2U7CisJCQl9IC8vIGlmCisJCX0gLy8gaWYKKworCQkvLyBOdW1iZXIgb2YgaW5mZWN0aW9ucworCQlpZiAodGhpcy5pbXBvcnRGcm9tRmlsZSA9PSBmYWxzZSAmJiByZXRWYWx1ZSkgeworCQkJLy8gWWVzCisJCQlpZiAobnVtYmVyT2ZJbmZlY3Rpb25zVGV4dC5nZXRUZXh0KCkgPT0gbnVsbAorCQkJCQl8fCBudW1iZXJPZkluZmVjdGlvbnNUZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkvLyBZZXMKKwkJCQllcnJvck1lc3NhZ2UgPSBEaXNlYXNlV2l6YXJkTWVzc2FnZXMKKwkJCQkJCS5nZXRTdHJpbmcoIk5JbmZXaXpFcnJvci4zIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJfSAvLyBpZgorCQl9CisJCWlmICh0aGlzLmltcG9ydEZyb21GaWxlID09IGZhbHNlICYmIHJldFZhbHVlKSB7CisJCQlmaW5hbCBkb3VibGUgdGVtcCA9IERvdWJsZQorCQkJCQkucGFyc2VEb3VibGUobnVtYmVyT2ZJbmZlY3Rpb25zVGV4dC5nZXRUZXh0KCkpOworCQkJCS8vID4gMD8KKwkJCQlpZiAodGVtcCA8PSAwLjApIHsKKwkJCQkJLy8gTm8KKwkJCQkJZXJyb3JNZXNzYWdlID0gRGlzZWFzZVdpemFyZE1lc3NhZ2VzCisJCQkJCQkJLmdldFN0cmluZygiTkluZldpekVycm9yLjQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCX0gLy8gaWYKKwkJfQorCQlpZiAodGhpcy5pbXBvcnRGcm9tRmlsZSA9PSBmYWxzZSAmJiByZXRWYWx1ZSkgeworCQkJZmluYWwgZG91YmxlIHRlbXAgPSBEb3VibGUKKwkJCS5wYXJzZURvdWJsZShudW1iZXJPZkluZmVjdGlvbnNUZXh0LmdldFRleHQoKSk7CisJCQkJaWYoaXNQZXJjZW50YWdlKCkpIHsKKwkJCQkJLy8geWVzLCB0aGVuIHRoaXMgbXVzdCBiZSBhIHBlcmNlbnRhZ2UKKwkJCQkJCWlmKHRlbXAgPiAxMDAuMCkgeworCQkJCQkJCWVycm9yTWVzc2FnZSA9IERpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5JbmZXaXpFcnJvci44Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCQkJfQkJCQkJCisJCQkJCX0KKwkJfQorCQkKKworCQkvLyBJU08gS2V5CisJCWlmIChyZXRWYWx1ZSkgeworCQkJLy8gWWVzCisJCQlpZiAoIXRoaXMuaXNGcm9tRmlsZSgpICYmIChnZXRJc29LZXkoKSA9PSBudWxsIHx8IGdldElzb0tleSgpLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkvLyBZZXMKKwkJCQllcnJvck1lc3NhZ2UgPSBEaXNlYXNlV2l6YXJkTWVzc2FnZXMKKwkJCQkJCS5nZXRTdHJpbmcoIk5JbmZXaXpFcnJvci42Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJfSAvLyBpZgorCQl9IC8vIGlmCisKKwkJLy8gTG9jYXRpb24KKwkJaWYgKHJldFZhbHVlKSB7CisJCQkvLyBZZXMKKwkJCWlmICh0aGlzLmlzRnJvbUZpbGUoKSAmJiAoZ2V0SW1wb3J0Rm9sZGVyKCkgPT0gbnVsbCB8fCBnZXRJbXBvcnRGb2xkZXIoKS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCisJCQkJLy8gWWVzCisJCQkJZXJyb3JNZXNzYWdlID0gRGlzZWFzZVdpemFyZE1lc3NhZ2VzCisJCQkJCQkuZ2V0U3RyaW5nKCJOSW5mV2l6RXJyb3IuOSIpOyAvLyROT04tTkxTLTEkCisJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCX0gLy8gaWYKKwkJfSAvLyBpZgorCQkvLyBMb2NhdGlvbgorCQlpZiAocmV0VmFsdWUpIHsKKwkJCS8vIFllcworCQkJaWYgKHRoaXMuaXNGcm9tRmlsZSgpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlGaWxlIGYgPSBuZXcgRmlsZShnZXRJbXBvcnRGb2xkZXIoKSk7CisJCQkJaWYoIWYuZXhpc3RzKCkpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWVycm9yTWVzc2FnZSA9IERpc2Vhc2VXaXphcmRNZXNzYWdlcworCQkJCQkJCS5nZXRTdHJpbmcoIk5JbmZXaXpFcnJvci4xMCIpOyAvLyROT04tTkxTLTEkCisJCQkJCXJldFZhbHVlID0gZmFsc2U7CisJCQkJfQorCQkJCQorCQkJfSAvLyBpZgorCQl9IC8vIGlmCisJCWlmKHJldFZhbHVlICYmIHRoaXMuaXNGcm9tRmlsZSgpICYmIGlzU2VsZWN0ZWRSb3coKSkgeworCQkJU3RyaW5nIHZhbCA9IHJvd3R4dC5nZXRUZXh0KCk7CisJCQl0cnkgeworCQkJCWludCB2ID0gSW50ZWdlci5wYXJzZUludCh2YWwpOworCQkJCWlmKHYgPCAwKSB7CisJCQkJCWVycm9yTWVzc2FnZSA9IERpc2Vhc2VXaXphcmRNZXNzYWdlcworCQkJCQkuZ2V0U3RyaW5nKCJOSW5mV2l6RXJyb3IuMTEiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCX0KKwkJCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKwkJCQllcnJvck1lc3NhZ2UgPSBEaXNlYXNlV2l6YXJkTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJOSW5mV2l6RXJyb3IuMTEiKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldFZhbHVlID0gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gdmFsaWRhdGUKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2Ugc2V0IGJ5IHtAbGluayAjdmFsaWRhdGUoKX0KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKKwkJcmV0dXJuIGVycm9yTWVzc2FnZTsKKwl9CisKKwkvLyBwcml2YXRlIFN0cmluZyBnZXROYW1lKFN0cmluZyBpc29LZXksIGludCBsZXZlbCkgeworCS8vIHJldHVybiBHZW9ncmFwaGljTmFtZXMuZ2V0TmFtZShpc29LZXksIGxldmVsKTsKKwkvLyB9IC8vIGdldE5hbWUKKworCQorCisJLyoqCisJICogYWNjZXNzIHRoZSBpbmZlY3Rvck1vZGUKKwkgKiBpZiB0cnVlIGNyZWF0ZSBhbmQgaW5mZWN0b3IKKwkgKiBpZiBmYWxzZSBjcmVhdGVzIGFuZCBpbm9jdWxhdG9yCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbmZlY3Rvck1vZGUoKSB7CisJCXJldHVybiBpbmZlY3Rvck1vZGU7CisJfQorCQorCS8qKgorCSAqIEFyZSB3ZSByZWFkaW5nIGZyb20gYSBmaWxlCisJICovCisJCisJcHVibGljIGJvb2xlYW4gaXNGcm9tRmlsZSgpIHsKKwkJcmV0dXJuIGltcG9ydEZyb21GaWxlOworCX0KKwkKKwkvKioKKwkgKiBBcmUgd2UgcmVhZGluZyBmcm9tIGEgZmlsZQorCSAqLworCQorCXB1YmxpYyBTdHJpbmcgZ2V0SW1wb3J0Rm9sZGVyKCkgeworCQlyZXR1cm4gbG9nRGlyVGV4dC5nZXRUZXh0KCk7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGlzb0tleSB0aGF0IHNwZWNpZmllcyB0aGUgbG9jYXRpb24gdG8gYmUgaW5mZWN0ZWQuCisJICovCisJcHVibGljIGZpbmFsIFN0cmluZyBnZXRJc29LZXkoKSB7CisJCXJldHVybiBpc29LZXk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgaXNvS2V5IHRoYXQgc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiB0byBiZSBpbmZlY3RlZC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgVVJJIGdldFRhcmdldFVSSSgpIHsKKwkJcmV0dXJuIHRhcmdldFVSSTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgTkxTJ2QgbmFtZSBvZiB0aGUgbG9jYXRpb24gc2VsZWN0ZWQgYXMgdGhlIHBvaW50IG9mIGluZmVjdGlvbgorCSAqLworCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TG9jYXRpb25OYW1lKCkgeworCQkvLyBUT0RPIG5lZWQgdG8gcmV0dXJuIHRoZSBOTFMgc3RyaW5nIGhlcmUuCisJCXJldHVybiBnZXRJc29LZXkoKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBkaXNlYXNlCisJICovCisJcHVibGljIGZpbmFsIFN0cmluZyBnZXREaXNlYXNlTmFtZSgpIHsKKwkJcmV0dXJuIGRpc2Vhc2VOYW1lVGV4dC5nZXRUZXh0KCk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcG9wdWxhdGlvbiBiZWluZyBpbmZlY3RlZAorCSAqLworCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UG9wdWxhdGlvbigpIHsKKwkJcmV0dXJuIHBvcHVsYXRpb25UZXh0LmdldFRleHQoKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgaW5mZWN0aW9ucworCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0TnVtYmVyKCkgeworCQl0cnkgeworCQkJcmV0dXJuIERvdWJsZS5wYXJzZURvdWJsZShudW1iZXJPZkluZmVjdGlvbnNUZXh0LmdldFRleHQoKSk7CisJCX0gY2F0Y2ggKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoRGlzZWFzZVdpemFyZE1lc3NhZ2VzCisJCQkJCS5nZXRTdHJpbmcoIk5JbmZXaXpFcnJvci43IiksIGUpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gMC4wOworCQl9IC8vIGNhdGNoIE51bWJlckZvcm1hdEV4Y2VwdGlvbgorCX0KKwkKKworCisJcHVibGljIGJvb2xlYW4gaXNQZXJjZW50YWdlKCkgeworCQlyZXR1cm4gcGVyY2VudGFnZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0Um93KCkge3JldHVybiB1c2VGaXJzdFJvdzt9CisJcHVibGljIGJvb2xlYW4gaXNMYXN0Um93KCkge3JldHVybiB1c2VMYXN0Um93O30KKwlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkUm93KCkge3JldHVybiB1c2VTZWxlY3RlZFJvdzt9CisJcHVibGljIGludCBnZXRTZWxlY3RlY1JvdygpIHtyZXR1cm4gSW50ZWdlci5wYXJzZUludChyb3d0eHQuZ2V0VGV4dCgpKTt9CisJCisJcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwKSB7dGhpcy5jdXJyZW50UHJvamVjdD1wO30KKwkKK30gLy8gSW5mZWN0b3JEZWZpbml0aW9uQ29tcG9zaXRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdEaXNlYXNlV2l6YXJkLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdEaXNlYXNlV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJkZjVjMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL05ld0Rpc2Vhc2VXaXphcmQuamF2YQpAQCAtMCwwICsxLDE4MSBAQAorLy8gTmV3RGlzZWFzZVdpemFyZC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgV2l6YXJkIGZvciBtYWtpbmcgbmV3IFNURU0ge0BsaW5rIERpc2Vhc2VNb2RlbH0gaW5zdGFuY2VzLgorICovCitwdWJsaWMgY2xhc3MgTmV3RGlzZWFzZVdpemFyZCBleHRlbmRzIE5ld0lkZW50aWZpYWJsZVdpemFyZCB7CisKKwlwcml2YXRlIE5ld0Rpc2Vhc2VQYWdlIG5kcCA9IG51bGw7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjZ2V0V2l6YXJkVGl0bGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0V2l6YXJkVGl0bGUoKSB7CisJCXJldHVybiBEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJORGlzZWFzZVdpei53aXphcmRfdGl0bGUiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTmV3SWRlbnRpZmlhYmxlUGFnZSBjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlKCkgeworCQluZHAgPSBuZXcgTmV3RGlzZWFzZVBhZ2UoRGlzZWFzZVdpemFyZE1lc3NhZ2VzCisJCQkJLmdldFN0cmluZygiTkRpc2Vhc2VXaXoucGFnZV90aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQluZHAuc2V0VGl0bGUoRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkRpc2Vhc2VXaXoucGFnZV90aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQluZHAuc2V0RGVzY3JpcHRpb24oRGlzZWFzZVdpemFyZE1lc3NhZ2VzCisJCQkJLmdldFN0cmluZygiTkRpc2Vhc2VXaXoucGFnZV9kZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJdGhpcy5zZXRIZWxwQ29udGV4dElkKCJvcmcuZWNsaXBzZS5zdGVtLmRvYy5uZXdkaXNlYXNlX2NvbnRleHRpZCIpOworCisJCXJldHVybiBuZHA7CisJfSAvLyBjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjY3JlYXRlRHVibGluQ29yZVBhZ2UoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBEdWJsaW5Db3JlUGFnZSBjcmVhdGVEdWJsaW5Db3JlUGFnZSgpIHsKKwkJcmV0dXJuIG5ldyBEdWJsaW5Db3JlUGFnZSgpIHsKKwkJCS8qKgorCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkLkR1YmxpbkNvcmVQYWdlI2luaXRpYWxpemVEQ0ZpZWxkcygpCisJCQkgKi8KKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURDQXR0cmlidXRlcygpIHsKKwkJCQlzdXBlci5pbml0aWFsaXplRENBdHRyaWJ1dGVzKCk7CisJCQkJZm9ybWF0LnNldFRleHQoU3RhbmRhcmRQYWNrYWdlLmVOU19VUkkpOworCQkJCWZvcm1hdC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQl0eXBlLnNldFRleHQoU1RFTVVSSS5jcmVhdGVUeXBlVVJJKAorCQkJCQkJRGlzZWFzZU1vZGVsLlVSSV9UWVBFX0RJU0VBU0VNT0RFTF9TRUdNRU5UKS50b1N0cmluZygpKTsKKwkJCQl0eXBlLnNldEVuYWJsZWQoZmFsc2UpOworCQkJfQorCQl9OyAvLyBEdWJsaW5Db3JlUGFnZQorCX0gLy8gY3JlYXRlRHVibGluQ29yZVBhZ2UKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNjcmVhdGVJZGVudGlmaWFibGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJZGVudGlmaWFibGUgY3JlYXRlSWRlbnRpZmlhYmxlKCkgeworCQlmaW5hbCBEaXNlYXNlTW9kZWwgcmV0VmFsdWUgPSBuZHAuZ2V0U2VsZWN0ZWREaXNlYXNlTW9kZWwoKTsKKwkJcmV0VmFsdWUuc2V0RHVibGluQ29yZShuZXdEdWJsaW5Db3JlUGFnZS5jcmVhdGVEdWJsaW5Db3JlKCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVTcGVjaWZpY0lkZW50aWZpYWJsZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2dldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkgeworCQlyZXR1cm4gTmV3U1RFTVByb2plY3RXaXphcmQuREVDT1JBVE9SU19GT0xERVJfTkFNRTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lRXh0ZW5zaW9uKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25GaWxlTmFtZUV4dGVuc2lvbigpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5lTkFNRTsKKwl9IC8vIGdldElkZW50aWZpYWJsZVNlcmlhbGl6YXRpb25GaWxlRXh0ZW5zaW9uCisKKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5ld0Rpc2Vhc2VQYWdlIGV4dGVuZHMgTmV3SWRlbnRpZmlhYmxlUGFnZSB7CisKKwkJRGlzZWFzZURlZmluaXRpb25Db250cm9sIGRkYyA9IG51bGw7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBwYWdlTmFtZQorCQkgKi8KKwkJcHJvdGVjdGVkIE5ld0Rpc2Vhc2VQYWdlKGZpbmFsIFN0cmluZyBwYWdlTmFtZSkgeworCQkJc3VwZXIocGFnZU5hbWUpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZC5OZXdJZGVudGlmaWFibGVQYWdlI2dldERDRGVzY3JpcHRpb24oKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RENEZXNjcmlwdGlvbigpIHsKKwkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChEaXNlYXNlV2l6YXJkTWVzc2FnZXMKKwkJCQkJLmdldFN0cmluZygiTkRpc2Vhc2VXaXouRENfREVTQ1JJUFRJT04iKSwgLy8kTk9OLU5MUy0xJAorCQkJCQluZXcgT2JqZWN0W10geyBzZXJpYWxpemF0aW9uRmlsZU5hbWVGaWVsZC5nZXRUZXh0KCkgfSk7CisJCX0gLy8gZ2V0RENEZXNjcmlwdGlvbgorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVNwZWNpZmljQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCWRkYyA9IG5ldyBEaXNlYXNlRGVmaW5pdGlvbkNvbnRyb2wocGFyZW50LCBTV1QuTk9ORSwKKwkJCQkJcHJvamVjdFZhbGlkYXRvciwgdGhpcy5nZXRTZWxlY3RlZFByb2plY3QoKSk7CisJCQlyZXR1cm4gZGRjOworCQl9IC8vIGNyZWF0ZVNwZWNpZmljQ29tcG9zaXRlCisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKKwkJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci52YWxpZGF0ZVBhZ2UoKTsKKwkJCWlmIChyZXRWYWx1ZSkgeworCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKKwkJCQlyZXRWYWx1ZSA9IGRkYy52YWxpZGF0ZSgpOworCQkJCS8vIEVycm9yPworCQkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkJLy8gWWVzCisJCQkJCXNldEVycm9yTWVzc2FnZShkZGMuZ2V0RXJyb3JNZXNzYWdlKCkpOworCQkJCX0gLy8gaWYKKwkJCX0KKwkJCXJldHVybiByZXRWYWx1ZTsKKwkJfSAvLyB2YWxpZGF0ZVBhZ2UKKworCQlEaXNlYXNlTW9kZWwgZ2V0U2VsZWN0ZWREaXNlYXNlTW9kZWwoKSB7CisJCQlyZXR1cm4gZGRjLmdldFNlbGVjdGVkRGlzZWFzZU1vZGVsKCk7CisJCX0gLy8gZ2V0U2VsZWN0ZWREaXNlYXNlTW9kZWwKKworCX0gLy8gTmV3RGlzZWFzZVBhZ2UKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgSUhhbmRsZXJ9IGZvciB0aGUgY29tbWFuZCB0aGF0IGNyZWF0ZXMgYQorCSAqIHtAbGluayBOZXdEaXNlYXNlV2l6YXJkfQorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTmV3RGlzZWFzZVdpemFyZENvbW1hbmRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyCisJCQlpbXBsZW1lbnRzIElIYW5kbGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlciNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQpCisJCSAqLworCQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgZXhlY3V0aW9uRXZlbnQpCisJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisJCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IEhhbmRsZXJVdGlsCisJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3dDaGVja2VkKGV4ZWN1dGlvbkV2ZW50KTsKKwkJCWZpbmFsIE5ld0Rpc2Vhc2VXaXphcmQgd2l6YXJkID0gbmV3IE5ld0Rpc2Vhc2VXaXphcmQoKTsKKwkJCXdpemFyZC5pbml0KHdpbmRvdy5nZXRXb3JrYmVuY2goKSwgU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7CisJCQlmaW5hbCBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFNURU1XaXphcmREaWFsb2cod2luZG93CisJCQkJCS5nZXRTaGVsbCgpLCB3aXphcmQpOworCQkJd2l6YXJkRGlhbG9nLm9wZW4oKTsKKwkJCXJldHVybiBudWxsOworCQl9IC8vIGV4ZWN1dGUKKwl9IC8vIE5ld0Rpc2Vhc2VXaXphcmRDb21tYW5kSGFuZGxlcgorfSAvLyBOZXdEaXNlYXNlV2l6YXJkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdJbmZlY3RvcldpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvTmV3SW5mZWN0b3JXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjA5NjUyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvTmV3SW5mZWN0b3JXaXphcmQuamF2YQpAQCAtMCwwICsxLDM0MCBAQAorLy8gTmV3SW5mZWN0b3JXaXphcmQuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5TY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMudXRpbC5DU1ZzY2VuYXJpb0xvYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTm9kZURlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuSW5mZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJSW5mZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJUklub2N1bGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5pbXBsLlNJUklub2N1bGF0b3JJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuR2VvZ3JhcGhpY05hbWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBOZXdJbmZlY3RvcldpemFyZCBleHRlbmRzIE5ld0lkZW50aWZpYWJsZVdpemFyZCB7CisKKwlwcml2YXRlIE5ld0luZmVjdG9yUGFnZSBuaXAgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgTmV3SW5mZWN0b3JXaXphcmQoKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjZ2V0V2l6YXJkVGl0bGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0V2l6YXJkVGl0bGUoKSB7CisJCXJldHVybiBEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSW5mZWN0b3JXaXoud2l6YXJkX3RpdGxlIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjY3JlYXRlTmV3SWRlbnRpZmlhYmxlUGFnZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE5ld0lkZW50aWZpYWJsZVBhZ2UgY3JlYXRlTmV3SWRlbnRpZmlhYmxlUGFnZSgpIHsKKwkJbmlwID0gbmV3IE5ld0luZmVjdG9yUGFnZShEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSW5mZWN0b3JXaXoucGFnZV90aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQluaXAuc2V0VGl0bGUoRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkluZmVjdG9yV2l6LnBhZ2VfdGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJbmlwLnNldERlc2NyaXB0aW9uKERpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5JbmZlY3Rvcldpei5wYWdlX2Rlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCisJCQorCQl0aGlzLnNldEhlbHBDb250ZXh0SWQoIm9yZy5lY2xpcHNlLnN0ZW0uZG9jLm5ld2luZmVjdG9yaW5vY3VsYXRvcl9jb250ZXh0aWQiKTsKKworCQlyZXR1cm4gbmlwOworCX0gLy8gY3JlYXRlTmV3SWRlbnRpZmlhYmxlUGFnZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2NyZWF0ZUR1YmxpbkNvcmVQYWdlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRHVibGluQ29yZVBhZ2UgY3JlYXRlRHVibGluQ29yZVBhZ2UoKSB7CisJCXJldHVybiBuZXcgRHVibGluQ29yZVBhZ2UoKSB7CisJCQkvKioKKwkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZC5EdWJsaW5Db3JlUGFnZSNpbml0aWFsaXplRENGaWVsZHMoKQorCQkJICovCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEQ0F0dHJpYnV0ZXMoKSB7CisJCQkJc3VwZXIuaW5pdGlhbGl6ZURDQXR0cmlidXRlcygpOworCQkJCWZvcm1hdC5zZXRUZXh0KFN0YW5kYXJkUGFja2FnZS5lTlNfVVJJKTsKKwkJCQlmb3JtYXQuc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJLy8gdHlwZS5zZXRUZXh0KCJ1bmRlZmluZWQiKTsKKwkJCQkvLyB0eXBlLnNldFRleHQoU1RFTVVSSS5TQ0VOQVJJT19UWVBFX1VSSS50b1N0cmluZygpKTsKKwkJCQl0eXBlLnNldEVuYWJsZWQoZmFsc2UpOworCQkJfQorCQl9OyAvLyBEdWJsaW5Db3JlUGFnZQorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNjcmVhdGVJZGVudGlmaWFibGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJZGVudGlmaWFibGUgY3JlYXRlSWRlbnRpZmlhYmxlKCkgeworCQlmaW5hbCBOb2RlRGVjb3JhdG9yIHJldFZhbHVlID0gbmlwLmdldEluZmVjdG9yKCk7CisJCXJldFZhbHVlLnNldER1YmxpbkNvcmUobmV3RHVibGluQ29yZVBhZ2UuY3JlYXRlRHVibGluQ29yZSgpKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlU3BlY2lmaWNJZGVudGlmaWFibGUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNnZXRTZXJpYWxpemF0aW9uRm9sZGVyTmFtZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJpYWxpemF0aW9uRm9sZGVyTmFtZSgpIHsKKwkJcmV0dXJuIE5ld1NURU1Qcm9qZWN0V2l6YXJkLkRFQ09SQVRPUlNfRk9MREVSX05BTUU7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2dldFNlcmlhbGl6YXRpb25GaWxlTmFtZUV4dGVuc2lvbigpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJpYWxpemF0aW9uRmlsZU5hbWVFeHRlbnNpb24oKSB7CisJCXJldHVybiBTdGFuZGFyZFBhY2thZ2UuZU5BTUU7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBOZXdJbmZlY3RvclBhZ2UgZXh0ZW5kcyBOZXdJZGVudGlmaWFibGVQYWdlIHsKKworCQlwcml2YXRlIEluZmVjdG9yRGVmaW5pdGlvbkNvbXBvc2l0ZSBpZGM7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBwYWdlTmFtZQorCQkgKi8KKwkJcHJvdGVjdGVkIE5ld0luZmVjdG9yUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKKwkJCXN1cGVyKHBhZ2VOYW1lKTsKKwkJfQorCisJCS8qKgorCQkgKiBAcmV0dXJuCisJCSAqLworCQlwdWJsaWMgTm9kZURlY29yYXRvciBnZXRJbmZlY3RvcigpIHsKKwkJCWlmKCFpZGMuaXNGcm9tRmlsZSgpKSB7CisJCQkJU0lJbmZlY3RvciByZXRWYWx1ZSA9IG51bGw7CisJCQkJaWYoaWRjLmlzSW5mZWN0b3JNb2RlKCkpIHsKKwkJCQkJcmV0VmFsdWUgPSBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNJSW5mZWN0b3IoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXRWYWx1ZSA9IFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0lSSW5vY3VsYXRvcigpOworCQkJCX0KKwkJCQlyZXRWYWx1ZS5zZXREaXNlYXNlTmFtZShpZGMuZ2V0RGlzZWFzZU5hbWUoKSk7CisJCQkJcmV0VmFsdWUuc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoaWRjLmdldFBvcHVsYXRpb24oKSk7CisJCQkJcmV0VmFsdWUuc2V0VGFyZ2V0SVNPS2V5KGlkYy5nZXRJc29LZXkoKSk7CisJCQkJcmV0VmFsdWUuc2V0VGFyZ2V0VVJJKGlkYy5nZXRUYXJnZXRVUkkoKSk7CisJCQkJaWYoaWRjLmlzSW5mZWN0b3JNb2RlKCkgJiYgaWRjLmlzUGVyY2VudGFnZSgpKSB7CisJCQkJCXJldFZhbHVlLnNldEluZmVjdFBlcmNlbnRhZ2UodHJ1ZSk7CisJCQkJCXJldFZhbHVlLnNldEluZmVjdGlvdXNDb3VudChpZGMuZ2V0TnVtYmVyKCkpOworCQkJCX0gZWxzZSBpZihpZGMuaXNJbmZlY3Rvck1vZGUoKSAmJiAhaWRjLmlzUGVyY2VudGFnZSgpKSB7CisJCQkJCXJldFZhbHVlLnNldEluZmVjdFBlcmNlbnRhZ2UoZmFsc2UpOworCQkJCQlyZXRWYWx1ZS5zZXRJbmZlY3Rpb3VzQ291bnQoaWRjLmdldE51bWJlcigpKTsKKwkJCQl9IGVsc2UgaWYoIGlkYy5pc1BlcmNlbnRhZ2UoKSl7CisJCQkJCSgoU0lSSW5vY3VsYXRvckltcGwpIHJldFZhbHVlKS5zZXRJbm9jdWxhdGVkUGVyY2VudGFnZShpZGMuZ2V0TnVtYmVyKCkpOworCQkJCQkKKwkJCQkJKChTSVJJbm9jdWxhdG9ySW1wbCkgcmV0VmFsdWUpLnNldElub2N1bGF0ZVBlcmNlbnRhZ2UodHJ1ZSk7CisJCQkJCS8vIGp1c3QgdG8gYmUgc3VyZSAtIHNpbmNlIHRoaXMgaXMgTk9UIGFuZCBJbmZlY3RvcgorCQkJCQlyZXRWYWx1ZS5zZXRJbmZlY3Rpb3VzQ291bnQoMC4wKTsKKwkJCQl9IGVsc2UgeworCQkJCQkoKFNJUklub2N1bGF0b3JJbXBsKSByZXRWYWx1ZSkuc2V0SW5vY3VsYXRlZFBlcmNlbnRhZ2UoaWRjLmdldE51bWJlcigpKTsKKwkJCQkJKChTSVJJbm9jdWxhdG9ySW1wbCkgcmV0VmFsdWUpLnNldElub2N1bGF0ZVBlcmNlbnRhZ2UoZmFsc2UpOworCQkJCQkvLyBqdXN0IHRvIGJlIHN1cmUgLSBzaW5jZSB0aGlzIGlzIE5PVCBhbmQgSW5mZWN0b3IKKwkJCQkJcmV0VmFsdWUuc2V0SW5mZWN0aW91c0NvdW50KDAuMCk7CisJCQkJfQorCQkJCXJldHVybiByZXRWYWx1ZTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gV2UgbmVlZCB0byBjcmVhdGUgYSBJbmZlY3Rvcklub2N1bGF0b3JMaXN0IG9iamVjdAorCQkJCS8vIGFuZCByZWFkIHRoZSBkYXRhIGZyb20gZmlsZQorCQkJCQorCQkJCVN0cmluZyBmb2xkZXIgPSBpZGMuZ2V0SW1wb3J0Rm9sZGVyKCk7CisJCQkJUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCAgbWFwID0gbnVsbDsKKwkJCQlMaXN0PEludGVnZXI+cmVzb2x1dGlvbnMgPSBudWxsOworCQkJCXRyeSB7CisJCQkJCUNTVnNjZW5hcmlvTG9hZGVyIGxvYWRlciA9IG5ldyBDU1ZzY2VuYXJpb0xvYWRlcihmb2xkZXIpOworCQkJCQkvL3Jlc29sdXRpb25zID0gbG9hZGVyLmdldFJlc29sdXRpb25zKCk7CisJCQkJCWxvYWRlci5nZXRSZXNvbHV0aW9ucygpOworCQkJCQltYXAgPSBsb2FkZXIucGFyc2VBbGxGaWxlcygpOworCQkJCX0gY2F0Y2goU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiBzaWUpIHsKKwkJCQkJb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLkFjdGl2YXRvci5sb2dFcnJvcihzaWUuZ2V0TWVzc2FnZSgpLCBzaWUpOworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJSW5mZWN0b3JJbm9jdWxhdG9yQ29sbGVjdGlvbiBpaWMgPSBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluZmVjdG9ySW5vY3VsYXRvckNvbGxlY3Rpb24oKTsKKwkJCQlpaWMuc2V0SW1wb3J0Rm9sZGVyKGZvbGRlcik7CisJCQkJZm9yKFN0cmluZyBsb2NhdGlvbiA6IG1hcC5nZXRMb2NhdGlvbnMoKSkgeworCQkJCQlSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBpbnN0YW5jZSA9IG1hcC5nZXRMb2NhdGlvbihsb2NhdGlvbik7CisJCQkJCUxpc3Q8U3RyaW5nPmNvdW50cyA9IG51bGw7CisJCQkJCUxpc3Q8U3RyaW5nPmRlbm9tID0gbnVsbDsKKwkJCQkJaWYoaWRjLmlzSW5mZWN0b3JNb2RlKCkpIAorCQkJCQkJY291bnRzID0gaW5zdGFuY2UuZ2V0RGF0YShDU1ZzY2VuYXJpb0xvYWRlci5JX0tFWSk7CisJCQkJCWVsc2UKKwkJCQkJCWNvdW50cyA9IGluc3RhbmNlLmdldERhdGEoQ1NWc2NlbmFyaW9Mb2FkZXIuUl9LRVkpOworCQkJCQlpZihpZGMuaXNQZXJjZW50YWdlKCkpCisJCQkJCQlkZW5vbSA9IGluc3RhbmNlLmdldERhdGEoQ1NWc2NlbmFyaW9Mb2FkZXIuUE9QX0NPVU5UX0tFWSk7CisJCQkJCQorCQkJCQkvLyBVc2UgZmlyc3Qgcm93IG9ubHkgCisJCQkJCWRvdWJsZSBkY291bnQgPSAwLjA7CisJCQkJCQkKKwkJCQkJaWYoaWRjLmlzRmlyc3RSb3coKSkJCisJCQkJCQlkY291bnQgPSBEb3VibGUucGFyc2VEb3VibGUoY291bnRzLmdldCgwKSk7CisJCQkJCWVsc2UgaWYoaWRjLmlzTGFzdFJvdygpKQorCQkJCQkJZGNvdW50ID0gRG91YmxlLnBhcnNlRG91YmxlKGNvdW50cy5nZXQoY291bnRzLnNpemUoKS0xKSk7CisJCQkJCWVsc2UKKwkJCQkJCWRjb3VudCA9IERvdWJsZS5wYXJzZURvdWJsZShjb3VudHMuZ2V0KGlkYy5nZXRTZWxlY3RlY1JvdygpKSk7CisJCQkJCQorCQkJCQlkb3VibGUgZGRlbm9tID0gMS4wOworCQkJCQlpZihpZGMuaXNQZXJjZW50YWdlKCkpCisJCQkJCQlpZihpZGMuaXNGaXJzdFJvdygpKQorCQkJCQkJCWRkZW5vbSA9IChEb3VibGUucGFyc2VEb3VibGUoZGVub20uZ2V0KDApKSAvIDEwMC4wKTsKKwkJCQkJCWVsc2UgaWYoaWRjLmlzTGFzdFJvdygpKQorCQkJCQkJCWRkZW5vbSA9IChEb3VibGUucGFyc2VEb3VibGUoZGVub20uZ2V0KGNvdW50cy5zaXplKCktMSkpIC8gMTAwLjApOworCQkJCQkJZWxzZQorCQkJCQkJCWRkZW5vbSA9IChEb3VibGUucGFyc2VEb3VibGUoZGVub20uZ2V0KGlkYy5nZXRTZWxlY3RlY1JvdygpKSkgLyAxMDAuMCk7CisJCQkJCQorCQkJCQlTSUluZmVjdG9yIGluZmVjdG9yID0gbnVsbDsKKwkJCQkJaWYoaWRjLmlzSW5mZWN0b3JNb2RlKCkpIHsKKwkJCQkJCWluZmVjdG9yID0gU3RhbmRhcmRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTSUluZmVjdG9yKCk7CisJCQkJCQlpbmZlY3Rvci5zZXRJbmZlY3RQZXJjZW50YWdlKGlkYy5pc1BlcmNlbnRhZ2UoKSk7CisJCQkJCQlpbmZlY3Rvci5zZXRJbmZlY3Rpb3VzQ291bnQoZGNvdW50L2RkZW5vbSk7CisJCQkJCQlpbmZlY3Rvci5zZXRVUkkoU1RFTVVSSS5jcmVhdGVVUkkoU1RFTVVSSS5nZW5lcmF0ZVVuaXF1ZVBhcnQoKSsiL2luZmVjdF8iK2xvY2F0aW9uKSk7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQlpbmZlY3RvciA9IFN0YW5kYXJkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU0lSSW5vY3VsYXRvcigpOworCQkJCQkJKChTSVJJbm9jdWxhdG9yKWluZmVjdG9yKS5zZXRJbm9jdWxhdGVQZXJjZW50YWdlKGlkYy5pc1BlcmNlbnRhZ2UoKSk7CisJCQkJCQkoKFNJUklub2N1bGF0b3IpaW5mZWN0b3IpLnNldElub2N1bGF0ZWRQZXJjZW50YWdlKGRjb3VudC9kZGVub20pOworCQkJCQkJaW5mZWN0b3Iuc2V0VVJJKFNURU1VUkkuY3JlYXRlVVJJKFNURU1VUkkuZ2VuZXJhdGVVbmlxdWVQYXJ0KCkrIi9pbm9jdWxhdGVfIitsb2NhdGlvbikpOworCQkJCQl9CisJCQkJCWluZmVjdG9yLnNldERpc2Vhc2VOYW1lKGlkYy5nZXREaXNlYXNlTmFtZSgpKTsKKwkJCQkJaW5mZWN0b3Iuc2V0UG9wdWxhdGlvbklkZW50aWZpZXIoaWRjLmdldFBvcHVsYXRpb24oKSk7CisJCQkJCWluZmVjdG9yLnNldFRhcmdldElTT0tleShsb2NhdGlvbik7CisJCQkJCWlpYy5nZXRMaXN0KCkuYWRkKGluZmVjdG9yKTsKKwkJCQl9CisJCQkJcmV0dXJuIGlpYzsKKwkJCX0KKwkJfSAvLyBnZXRJbmZlY3RvcgorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQuTmV3SWRlbnRpZmlhYmxlUGFnZSNnZXREQ0Rlc2NyaXB0aW9uKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERDRGVzY3JpcHRpb24oKSB7CisJCQlpZighaWRjLmlzRnJvbUZpbGUoKSkgeworCQkJCWlmKGlkYy5pc0luZmVjdG9yTW9kZSgpKSB7CisJCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSW5mZWN0b3JXaXouRENfREVTQ1JJUFRJT04iKSwgLy8kTk9OLU5MUy0xJAorCQkJCQkJCW5ldyBPYmplY3RbXSB7IERvdWJsZS52YWx1ZU9mKGlkYy5nZXROdW1iZXIoKSksCisJCQkJCQkJCQkJCWlkYy5nZXRQb3B1bGF0aW9uKCksIAorCQkJCQkJCQkJCQlpZGMuZ2V0RGlzZWFzZU5hbWUoKSwKKwkJCQkJCQkJCQkJR2VvZ3JhcGhpY05hbWVzLmdldFJldmVyc2VIaWVyYXJjaHlOYW1lKGlkYy5nZXRJc29LZXkoKSksIGlkYy5nZXRJc29LZXkoKSAKKwkJCQkJCQkJCQkJfSk7CisJCQkJfSAKKwkJCQkvLyBlbHNlIGlub2N1bGF0b3IKKwkJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkluZmVjdG9yV2l6LkRDX0RFU0NSSVBUSU9OMiIpLCAvLyROT04tTkxTLTEkCisJCQkJCQluZXcgT2JqZWN0W10geyBEb3VibGUudmFsdWVPZihpZGMuZ2V0TnVtYmVyKCkpLAorCQkJCQkJCQkJCWlkYy5nZXRQb3B1bGF0aW9uKCksIAorCQkJCQkJCQkJCWlkYy5nZXREaXNlYXNlTmFtZSgpLAorCQkJCQkJCQkJCUdlb2dyYXBoaWNOYW1lcy5nZXRSZXZlcnNlSGllcmFyY2h5TmFtZShpZGMuZ2V0SXNvS2V5KCkpLCBpZGMuZ2V0SXNvS2V5KCkgCisJCQkJCQkJCQkJfSk7CisJCQl9IGVsc2UgeworCQkJCWlmKGlkYy5pc0luZmVjdG9yTW9kZSgpKSB7CisJCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSW5mZWN0b3JXaXouRENfREVTQ1JJUFRJT05fRlJPTV9GSUxFIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQluZXcgT2JqZWN0W10geyBpZGMuZ2V0SW1wb3J0Rm9sZGVyKCkgCisJCQkJCQkJCQkJCX0pOworCQkJCX0gCisJCQkJLy8gZWxzZSBpbm9jdWxhdG9yCisJCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KERpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5JbmZlY3Rvcldpei5EQ19ERVNDUklQVElPTjJfRlJPTV9GSUxFIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkJCW5ldyBPYmplY3RbXSB7IGlkYy5nZXRJbXBvcnRGb2xkZXIoKSAgCisJCQkJCQkJCQkJfSk7CisJCQl9CisJCX0gLy8gZ2V0RENEZXNjcmlwdGlvbgorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVNwZWNpZmljQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCWlkYyA9IG5ldyBJbmZlY3RvckRlZmluaXRpb25Db21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSwKKwkJCQkJcHJvamVjdFZhbGlkYXRvciwgc3VwZXIuZ2V0U2VsZWN0ZWRQcm9qZWN0KCkpOworCQkJCisJCQlmaW5hbCBOZXdJbmZlY3RvcldpemFyZC5OZXdJbmZlY3RvclBhZ2Ugc2VsZiA9IHRoaXM7CisJCQkKKwkJCXRoaXMucHJvamVjdE5hbWVzQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJCQorCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKKwkJCQkJaWRjLnNldFByb2plY3Qoc2VsZi5nZXRTZWxlY3RlZFByb2plY3QoKSk7CisJCQkJfQorCQkJCQorCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7CisJCQkJCQorCQkJCX0KKwkJCX0pOworCQkJCisJCQlyZXR1cm4gaWRjOworCQl9IC8vIGNyZWF0ZVNwZWNpZmljQ29tcG9zaXRlCisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKKwkJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci52YWxpZGF0ZVBhZ2UoKTsKKwkJCWlmIChyZXRWYWx1ZSkgeworCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKKwkJCQlyZXRWYWx1ZSA9IGlkYy52YWxpZGF0ZSgpOworCQkJCS8vIEVycm9yPworCQkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkJLy8gWWVzCisJCQkJCXNldEVycm9yTWVzc2FnZShpZGMuZ2V0RXJyb3JNZXNzYWdlKCkpOworCQkJCX0gLy8gaWYKKwkJCX0KKwkJCXJldHVybiByZXRWYWx1ZTsKKwkJfSAvLyB2YWxpZGF0ZVBhZ2UKKwl9IC8vIE5ld0luZmVjdG9yUGFnZQorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBJSGFuZGxlcn0gZm9yIHRoZSBjb21tYW5kIHRoYXQgY3JlYXRlcyBhCisJICoge0BsaW5rIE5ld0luZmVjdG9yV2l6YXJkfQorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTmV3SW5mZWN0b3JXaXphcmRDb21tYW5kSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlcgorCQkJaW1wbGVtZW50cyBJSGFuZGxlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXIjZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50KQorCQkgKi8KKwkJcHVibGljIE9iamVjdCBleGVjdXRlKGZpbmFsIEV4ZWN1dGlvbkV2ZW50IGV4ZWN1dGlvbkV2ZW50KQorCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBIYW5kbGVyVXRpbAorCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93Q2hlY2tlZChleGVjdXRpb25FdmVudCk7CisJCQlmaW5hbCBOZXdJbmZlY3RvcldpemFyZCB3aXphcmQgPSBuZXcgTmV3SW5mZWN0b3JXaXphcmQoKTsKKwkJCXdpemFyZC5pbml0KHdpbmRvdy5nZXRXb3JrYmVuY2goKSwgU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7CisJCQlmaW5hbCBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFNURU1XaXphcmREaWFsb2cod2luZG93CisJCQkJCS5nZXRTaGVsbCgpLCB3aXphcmQpOworCQkJd2l6YXJkRGlhbG9nLm9wZW4oKTsKKwkJCXJldHVybiBudWxsOworCQl9IC8vIGV4ZWN1dGUKKwl9IC8vIE5ld0luZmVjdG9yV2l6YXJkQ29tbWFuZEhhbmRsZXIKK30gLy8gTmV3SW5mZWN0b3JXaXphcmQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL1N0YW5kYXJkRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL1N0YW5kYXJkRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2RkY2YxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvU3RhbmRhcmREaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvci5qYXZhCkBAIC0wLDAgKzEsMzMxIEBACisvLyBTdGFuZGFyZERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNFSVI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlNJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TSVI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuU3RvY2hhc3RpY0Rpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmRpc2Vhc2Vtb2RlbHByb3BlcnR5ZWRpdG9yLkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3MuUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3MuUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2lkZ2V0cy5NYXRyaXhFZGl0b3JEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aWRnZXRzLk1hdHJpeEVkaXRvcldpZGdldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuTWF0cml4RWRpdG9yV2lkZ2V0Lk1hdHJpeEVkaXRvclZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgQ29tcG9zaXRlfSB0aGF0IHByZXNlbnRzIHRoZSBwcm9wZXJ0aWVzIG9mIGEKKyAqIHtAbGluayBEaXNlYXNlTW9kZWx9IGZvciBlZGl0aW5nLgorICovCitwdWJsaWMgY2xhc3MgU3RhbmRhcmREaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvciBleHRlbmRzIERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yIHsKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgY29tcG9zaXRlCisJICogCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqIEBwYXJhbSBwcm9qZWN0VmFsaWRhdG9yCisJICovCisJcHVibGljIFN0YW5kYXJkRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgaW50IHN0eWxlLAorCQkJZmluYWwgRGlzZWFzZU1vZGVsIGRpc2Vhc2VNb2RlbCwKKwkJCWZpbmFsIE1vZGlmeUxpc3RlbmVyIHByb2plY3RWYWxpZGF0b3IsIElQcm9qZWN0IHByb2plY3QpIHsKKwkJc3VwZXIocGFyZW50LCBzdHlsZSwgZGlzZWFzZU1vZGVsLCBwcm9qZWN0VmFsaWRhdG9yLCBwcm9qZWN0KTsKKworCX0gLy8gU3RhbmRhcmREaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcgorCisJCisKKwkvKioKKwkgKiBAcGFyYW0gZGlzZWFzZU1vZGVsCisJICogICAgICAgICAgICB0aGUge0BsaW5rIERpc2Vhc2VNb2RlbH0gaW5zdGFuY2UgdG8gcG9wdWxhdGUuCisJICovCisJcHVibGljIHZvaWQgcG9wdWxhdGUoZmluYWwgRGlzZWFzZU1vZGVsIGRpc2Vhc2VNb2RlbCkgeworCQlzdXBlci5wb3B1bGF0ZShkaXNlYXNlTW9kZWwpOworCQkKKwkJZm9yIChmaW5hbCBNYXAuRW50cnk8RVN0cnVjdHVyYWxGZWF0dXJlLCBUZXh0PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7CisJCQlzd2l0Y2ggKGVudHJ5LmdldEtleSgpLmdldEZlYXR1cmVJRCgpKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9ESVNFQVNFX01PREVMX19SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZOgorCQkJCSgoU3RhbmRhcmREaXNlYXNlTW9kZWwpIGRpc2Vhc2VNb2RlbCkKKwkJCQkJCS5zZXRSZWZlcmVuY2VQb3B1bGF0aW9uRGVuc2l0eShEb3VibGUucGFyc2VEb3VibGUoZW50cnkKKwkJCQkJCQkJLmdldFZhbHVlKCkuZ2V0VGV4dCgpKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYoZGlzZWFzZU1vZGVsIGluc3RhbmNlb2YgU0kpCisJCQlmb3IgKGZpbmFsIE1hcC5FbnRyeTxFU3RydWN0dXJhbEZlYXR1cmUsIFRleHQ+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpIHsKKwkJCXN3aXRjaCAoZW50cnkuZ2V0S2V5KCkuZ2V0RmVhdHVyZUlEKCkpIHsJCisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVE9DSEFTVElDX0RJU0VBU0VfTU9ERUxfX1NFRUQ6CisJCQkJKChTdG9jaGFzdGljRGlzZWFzZU1vZGVsKSBkaXNlYXNlTW9kZWwpLnNldFNlZWQoTG9uZworCQkJCQkJLnBhcnNlTG9uZyhlbnRyeS5nZXRWYWx1ZSgpLmdldFRleHQoKSkpOworCQkJCWJyZWFrOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfU1RPQ0hBU1RJQ19ESVNFQVNFX01PREVMX19HQUlOOgorCQkJCSgoU3RhbmRhcmRTdG9jaGFzdGljRGlzZWFzZU1vZGVsKSBkaXNlYXNlTW9kZWwpLnNldEdhaW4oRG91YmxlCisJCQkJCQkucGFyc2VEb3VibGUoZW50cnkuZ2V0VmFsdWUoKS5nZXRUZXh0KCkpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX19UUkFOU01JU1NJT05fUkFURToKKwkJCQkoKFNJKSBkaXNlYXNlTW9kZWwpLnNldFRyYW5zbWlzc2lvblJhdGUoRG91YmxlCisJCQkJCQkucGFyc2VEb3VibGUoZW50cnkuZ2V0VmFsdWUoKS5nZXRUZXh0KCkpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UOgorCQkJCSgoU0kpIGRpc2Vhc2VNb2RlbCkuc2V0Tm9uTGluZWFyaXR5Q29lZmZpY2llbnQoRG91YmxlCisJCQkJCQkucGFyc2VEb3VibGUoZW50cnkuZ2V0VmFsdWUoKS5nZXRUZXh0KCkpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNJX19SRUNPVkVSWV9SQVRFOgorCQkJCSgoU0kpIGRpc2Vhc2VNb2RlbCkuc2V0UmVjb3ZlcnlSYXRlKERvdWJsZS5wYXJzZURvdWJsZShlbnRyeQorCQkJCQkJLmdldFZhbHVlKCkuZ2V0VGV4dCgpKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9fSU5GRUNUSU9VU19NT1JUQUxJVFlfUkFURToKKwkJCQkoKFNJKSBkaXNlYXNlTW9kZWwpLnNldEluZmVjdGlvdXNNb3J0YWxpdHlSYXRlKERvdWJsZQorCQkJCQkJLnBhcnNlRG91YmxlKGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpKSk7CisJCQkJYnJlYWs7CisvLwkgRGVwcmVjYXRlZAorLy8JCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9fUEhZU0lDQUxMWV9BREpBQ0VOVF9JTkZFQ1RJT1VTX1BST1BPUlRJT046CisvLwkJCQkoKFNJKSBkaXNlYXNlTW9kZWwpCisvLwkJCQkJCS5zZXRQaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvbihEb3VibGUKKy8vCQkJCQkJCQkucGFyc2VEb3VibGUoZW50cnkuZ2V0VmFsdWUoKS5nZXRUZXh0KCkpKTsKKy8vCQkJCWJyZWFrOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0lfX0NIQVJBQ1RFUklTVElDX01JWElOR19ESVNUQU5DRToKKwkJCQkoKFNJKSBkaXNlYXNlTW9kZWwpCisJCQkJCQkuc2V0Q2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZShEb3VibGUKKwkJCQkJCQkJLnBhcnNlRG91YmxlKGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSV9fUk9BRF9ORVRXT1JLX0lORkVDVElPVVNfUFJPUE9SVElPTjoKKwkJCQkoKFNJKSBkaXNlYXNlTW9kZWwpCisJCQkJCQkuc2V0Um9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvbihEb3VibGUKKwkJCQkJCQkJLnBhcnNlRG91YmxlKGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TSVJfX0lNTVVOSVRZX0xPU1NfUkFURToKKwkJCQkoKFNJUikgZGlzZWFzZU1vZGVsKS5zZXRJbW11bml0eUxvc3NSYXRlKERvdWJsZQorCQkJCQkJLnBhcnNlRG91YmxlKGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TRUlSX19JTkNVQkFUSU9OX1JBVEU6CisJCQkJKChTRUlSKSBkaXNlYXNlTW9kZWwpLnNldEluY3ViYXRpb25SYXRlKERvdWJsZQorCQkJCQkJLnBhcnNlRG91YmxlKGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpKSk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9IC8vIHN3aXRjaAorCQl9IC8vIGZvciBlYWNoIE1hcC5lbnRyeQorCX0gLy8gcG9wdWxhdGUKKworCS8qKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRlbnRzIGFyZSB2YWxpZCwgPGNvZGU+ZmFsc2U8L2NvZGU+CisJICogICAgICAgICBvdGhlcndpc2UuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci52YWxpZGF0ZSgpOworCisJCS8vIFRyYW5zbWlzc2lvbiBSYXRlCisJCWlmIChyZXRWYWx1ZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBUZXh0IHRleHQgPSBtYXAKKwkJCQkJLmdldChTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU0lfX1RSQU5TTUlTU0lPTl9SQVRFKTsKKwkJCWlmICh0ZXh0ICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQlyZXRWYWx1ZSA9ICF0ZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpOyAvLyROT04tTkxTLTEkCisJCQkJLy8gbm90aGluZz8KKwkJCQlpZiAoIXJldFZhbHVlKSB7CisJCQkJCS8vIFllcworCQkJCQllcnJvck1lc3NhZ2UgPSBEaXNlYXNlV2l6YXJkTWVzc2FnZXMKKwkJCQkJCQkuZ2V0U3RyaW5nKCJORGl6V2l6RXJyNiIpOyAvLyROT04tTkxTLTEkCisJCQkJfSAvLyBpZgorCQkJCWVsc2UgeworCQkJCQkvLyBObworCQkJCQkvLyBJcyBpdCBhIHZhbGlkIHZhbHVlPworCQkJCQlyZXRWYWx1ZSA9IGlzVmFsaWRWYWx1ZSh0ZXh0LmdldFRleHQoKSwgMC4wKTsKKwkJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQkJLy8gTm8KKwkJCQkJCWVycm9yTWVzc2FnZSA9IERpc2Vhc2VXaXphcmRNZXNzYWdlcworCQkJCQkJCQkuZ2V0U3RyaW5nKCJORGl6V2l6RXJyNyIpOyAvLyROT04tTkxTLTEkCisJCQkJCX0gLy8gaWYKKwkJCQl9CisJCQl9IC8vIGlmIHRleHQgIT0gbnVsbAorCQl9IC8vIGlmIFRyYW5zbWlzc2lvbiBSYXRlCisKKwkJLy8gTm9uLUxpbmVhcml0eSBDb2VmZmljaWVudAorCQlpZiAocmV0VmFsdWUpIHsKKwkJCS8vIFllcworCQkJZmluYWwgVGV4dCB0ZXh0ID0gbWFwCisJCQkJCS5nZXQoU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNJX19OT05fTElORUFSSVRZX0NPRUZGSUNJRU5UKTsKKwkJCWlmICh0ZXh0ICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKworCQkJCXJldFZhbHVlID0gIXRleHQuZ2V0VGV4dCgpLmVxdWFscygiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkvLyBub3RoaW5nPworCQkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWVycm9yTWVzc2FnZSA9IERpc2Vhc2VXaXphcmRNZXNzYWdlcworCQkJCQkJCS5nZXRTdHJpbmcoIk5EaXpXaXpFcnI4Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9IC8vIGlmCisJCQkJZWxzZSB7CisJCQkJCS8vIE5vCisJCQkJCS8vIElzIGl0IGEgdmFsaWQgdmFsdWU/CisJCQkJCXJldFZhbHVlID0gaXNWYWxpZFZhbHVlKHRleHQuZ2V0VGV4dCgpLCAwLjApOworCQkJCQlpZiAoIXJldFZhbHVlKSB7CisJCQkJCQkvLyBObworCQkJCQkJZXJyb3JNZXNzYWdlID0gRGlzZWFzZVdpemFyZE1lc3NhZ2VzCisJCQkJCQkJCS5nZXRTdHJpbmcoIk5EaXpXaXpFcnI5Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfSAvLyBpZgorCQkJCX0KKwkJCX0gLy8gaWYgdGV4dCAhPSBudWxsCisJCX0gLy8gaWYgTm9uLUxpbmVhcml0eSBDb2VmZmljaWVudAorCisJCS8vIEluZmVjdGlvdXMgUmVjb3ZlcnkgUmF0ZQorCQlpZiAocmV0VmFsdWUpIHsKKwkJCS8vIFllcworCQkJZmluYWwgVGV4dCB0ZXh0ID0gbWFwCisJCQkJCS5nZXQoU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNJX19SRUNPVkVSWV9SQVRFKTsKKwkJCWlmICh0ZXh0ICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQlyZXRWYWx1ZSA9ICF0ZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpOyAvLyROT04tTkxTLTEkCisJCQkJLy8gbm90aGluZz8KKwkJCQlpZiAoIXJldFZhbHVlKSB7CisJCQkJCS8vIFllcworCQkJCQllcnJvck1lc3NhZ2UgPSBEaXNlYXNlV2l6YXJkTWVzc2FnZXMKKwkJCQkJCQkuZ2V0U3RyaW5nKCJORGl6V2l6RXJyMTAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0gLy8gaWYKKwkJCQllbHNlIHsKKwkJCQkJLy8gTm8KKwkJCQkJLy8gSXMgaXQgYSB2YWxpZCB2YWx1ZT8KKwkJCQkJcmV0VmFsdWUgPSBpc1ZhbGlkVmFsdWUodGV4dC5nZXRUZXh0KCksIDAuMCk7CisJCQkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkJCS8vIE5vCisJCQkJCQllcnJvck1lc3NhZ2UgPSBEaXNlYXNlV2l6YXJkTWVzc2FnZXMKKwkJCQkJCQkJLmdldFN0cmluZygiTkRpeldpekVycjExIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfSAvLyBpZgorCQkJCX0KKwkJCX0gLy8gaWYKKwkJfSAvLyBpZiBJbmZlY3Rpb3VzIFJlY292ZXJ5IFJhdGUKKworCQkvLyBJbmZlY3Rpb3VzIE1vcnRhbGl0eSBSYXRlCisJCWlmIChyZXRWYWx1ZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBUZXh0IHRleHQgPSBtYXAKKwkJCQkJLmdldChTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU0lfX0lORkVDVElPVVNfTU9SVEFMSVRZX1JBVEUpOworCQkJaWYgKHRleHQgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCXJldFZhbHVlID0gIXRleHQuZ2V0VGV4dCgpLmVxdWFscygiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkvLyBub3RoaW5nPworCQkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWVycm9yTWVzc2FnZSA9IERpc2Vhc2VXaXphcmRNZXNzYWdlcworCQkJCQkJCS5nZXRTdHJpbmcoIk5EaXpXaXpFcnIxMiIpOyAvLyROT04tTkxTLTEkCisJCQkJfSAvLyBpZgorCQkJCWVsc2UgeworCQkJCQkvLyBObworCQkJCQkvLyBJcyBpdCBhIHZhbGlkIHZhbHVlPworCQkJCQlyZXRWYWx1ZSA9IGlzVmFsaWRWYWx1ZSh0ZXh0LmdldFRleHQoKSwgMC4wKTsKKwkJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQkJLy8gTm8KKwkJCQkJCWVycm9yTWVzc2FnZSA9IERpc2Vhc2VXaXphcmRNZXNzYWdlcworCQkJCQkJCQkuZ2V0U3RyaW5nKCJORGl6V2l6RXJyMTMiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9IC8vIGlmCisJCQkJfQorCQkJfSAvLyBpZgorCQl9IC8vIGlmIEluZmVjdGlvdXMgTW9ydGFsaXR5IFJhdGUKKworCQkvLyBJbW11bml0eSBMb3NzIFJhdGUKKwkJaWYgKHJldFZhbHVlKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIFRleHQgdGV4dCA9IG1hcAorCQkJCQkuZ2V0KFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TSVJfX0lNTVVOSVRZX0xPU1NfUkFURSk7CisJCQkvLyBzcGVjaWZpZWQ/CisJCQlpZiAodGV4dCAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJcmV0VmFsdWUgPSAhdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCS8vIG5vdGhpbmc/CisJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQkvLyBZZXMKKwkJCQkJZXJyb3JNZXNzYWdlID0gRGlzZWFzZVdpemFyZE1lc3NhZ2VzCisJCQkJCQkJLmdldFN0cmluZygiTkRpeldpekVycjE2Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9IC8vIGlmCisJCQkJZWxzZSB7CisJCQkJCS8vIE5vCisJCQkJCS8vIElzIGl0IGEgdmFsaWQgdmFsdWU/CisJCQkJCXJldFZhbHVlID0gaXNWYWxpZFZhbHVlKHRleHQuZ2V0VGV4dCgpLCAwLjApOworCQkJCQlpZiAoIXJldFZhbHVlKSB7CisJCQkJCQkvLyBObworCQkJCQkJZXJyb3JNZXNzYWdlID0gRGlzZWFzZVdpemFyZE1lc3NhZ2VzCisJCQkJCQkJCS5nZXRTdHJpbmcoIk5EaXpXaXpFcnIxNyIpOyAvLyROT04tTkxTLTEkCisJCQkJCX0gLy8gaWYKKwkJCQl9CisJCQl9IC8vIGlmCisJCX0gLy8gaWYgSW1tdW5pdHkgTG9zcyBSYXRlCisKKwkJLy8gSW5jdWJhdGlvbiBSYXRlCisJCWlmIChyZXRWYWx1ZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBUZXh0IHRleHQgPSBtYXAKKwkJCQkJLmdldChTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU0VJUl9fSU5DVUJBVElPTl9SQVRFKTsKKwkJCWlmICh0ZXh0ICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKworCQkJCXJldFZhbHVlID0gIXRleHQuZ2V0VGV4dCgpLmVxdWFscygiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkvLyBub3RoaW5nPworCQkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWVycm9yTWVzc2FnZSA9IERpc2Vhc2VXaXphcmRNZXNzYWdlcworCQkJCQkJCS5nZXRTdHJpbmcoIk5EaXpXaXpFcnIxOCIpOyAvLyROT04tTkxTLTEkCisJCQkJfSAvLyBpZgorCQkJCWVsc2UgeworCQkJCQkvLyBObworCQkJCQkvLyBJcyBpdCBhIHZhbGlkIHZhbHVlPworCQkJCQlyZXRWYWx1ZSA9IGlzVmFsaWRWYWx1ZSh0ZXh0LmdldFRleHQoKSwgMC4wKTsKKwkJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQkJLy8gTm8KKwkJCQkJCWVycm9yTWVzc2FnZSA9IERpc2Vhc2VXaXphcmRNZXNzYWdlcworCQkJCQkJCQkuZ2V0U3RyaW5nKCJORGl6V2l6RXJyMTkiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9IC8vIGlmCisJCQkJfQorCQkJfSAvLyBpZgorCQl9IC8vIGlmIEluY3ViYXRpb24gUmF0ZQorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHZhbGlkYXRlCisKK30gLy8gU3RhbmRhcmREaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvU3RhbmRhcmREaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL1N0YW5kYXJkRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5NTQ3YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL1N0YW5kYXJkRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5kaXNlYXNlbW9kZWxwcm9wZXJ0eWVkaXRvci5EaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmRpc2Vhc2Vtb2RlbHByb3BlcnR5ZWRpdG9yLkRpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CisKK3B1YmxpYyBjbGFzcyBTdGFuZGFyZERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlciBleHRlbmRzCisJCURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlciB7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IgY3JlYXRlRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IoCisJCQlmaW5hbCBEaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZSBkaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZSwKKwkJCWZpbmFsIGludCBzdHlsZSwgZmluYWwgTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCkgeworCQlyZXR1cm4gbmV3IFN0YW5kYXJkRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3IoCisJCQkJZGlzZWFzZU1vZGVsUHJvcGVydHlDb21wb3NpdGUsIHN0eWxlLAorCQkJCShEaXNlYXNlTW9kZWwpIGdldFRhcmdldCgpLCBwcm9qZWN0VmFsaWRhdG9yLCBwcm9qZWN0KTsKKwl9IC8vIGNyZWF0ZURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yCisKK30gLy8gU3RhbmRhcmREaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL1N0YW5kYXJkRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvU3RhbmRhcmREaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhNGMzMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL1N0YW5kYXJkRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLmltcGwuU3RhbmRhcmRGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudXRpbC5TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZGlzZWFzZW1vZGVscHJvcGVydHllZGl0b3IuRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZGlzZWFzZW1vZGVscHJvcGVydHllZGl0b3IuRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgU3RhbmRhcmREaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKKwkJU3RhbmRhcmRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzCisJCURpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkgeworCisJcHVibGljIFN0YW5kYXJkRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCS5hZGRBZGFwdGVyRmFjdG9yeSh0aGlzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGFuZGFyZERpc2Vhc2VNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgU3RhbmRhcmREaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXIoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCXJldHVybiB0eXBlID09IERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlci5jbGFzcworCQkJCXx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CisJfQorCit9IC8vIFN0YW5kYXJkRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL1N0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwNjdlNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL1N0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8vIFN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnV0aWwuU3RhbmRhcmRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gTkxTJ2Qgc3RyaW5ncyBmb3Ige0BsaW5rIERpc2Vhc2VNb2RlbH0gcHJvcGVydGllcy4gCisgKi8KK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCVN0YW5kYXJkQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkgeworCisJCisJUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IG51bGw7CisKKwkvKioKKwkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisJICovCisJcHVibGljIFN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgeworCQlzdXBlcigpOworCQlQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRkQWRhcHRlckZhY3RvcnkodGhpcyk7CisJfQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGwjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuICBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpIHx8IHR5cGUgPT0gUHJvcGVydHlTdHJpbmdQcm92aWRlci5jbGFzczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC51dGlsLlN0YW5kYXJkQWRhcHRlckZhY3RvcnkjY3JlYXRlRGlzZWFzZU1vZGVsQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzZWFzZU1vZGVsQWRhcHRlcigpIHsKKwkJLy8gSGF2ZSB3ZSBjcmVhdGVkIG9uZSBiZWZvcmU/CisJCWlmIChhZGFwdGVyID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQlhZGFwdGVyID0gbmV3IFN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIoKTsKKwkJfSAvLyBpZiB3ZSBkaWRuJ3QgY3JlYXRlIG9uZSBiZWZvcmUKKwkJcmV0dXJuIGFkYXB0ZXI7CisJfSAvLyBjcmVhdGVEaXNlYXNlTW9kZWxBZGFwdGVyCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudXRpbC5TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUluZmVjdG9yQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5mZWN0b3JBZGFwdGVyKCkgeworCQkvLyBIYXZlIHdlIGNyZWF0ZWQgb25lIGJlZm9yZT8KKwkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgeworCQkJLy8gTm8KKwkJCWFkYXB0ZXIgPSBuZXcgU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlcigpOworCQl9IC8vIGlmIHdlIGRpZG4ndCBjcmVhdGUgb25lIGJlZm9yZQorCQlyZXR1cm4gYWRhcHRlcjsKKwl9IC8vIGNyZWF0ZURpc2Vhc2VNb2RlbEFkYXB0ZXIKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIgZXh0ZW5kcworCQkJUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIgeworCisJCS8qKgorCQkgKiBAcGFyYW0gZGVzY3JpcHRvcgorCQkgKiBAcmV0dXJuIHRoZSBOTFMnZCBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZShJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisJCQlyZXR1cm4gRGlzZWFzZVdpemFyZE1lc3NhZ2VzCisJCQkJCS5nZXRTdHJpbmcoKChFU3RydWN0dXJhbEZlYXR1cmUpIGRlc2NyaXB0b3IKKwkJCQkJCQkuZ2V0RmVhdHVyZShudWxsKSkuZ2V0TmFtZSgpKTsKKwkJfSAvLyBnZXRQcm9wZXJ0eU5hbWUKKworCQkvKioKKwkJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkJICogQHJldHVybiB0aGUgTkxTJ2QgdG9vbCB0aXAgdGV4dCB0aGF0IGRlc2NyaWJlcyB0aGUgcHJvcGVydHkKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlUb29sVGlwKAorCQkJCUlJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKwkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZGVzY3JpcHRvcgorCQkJCQkuZ2V0RmVhdHVyZShudWxsKTsKKwkJCXJldHVybiBEaXNlYXNlV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKGZlYXR1cmUuZ2V0TmFtZSgpCisJCQkJCSsgVFRfU1VGRklYKTsKKwkJfSAvLyBnZXRQcm9wZXJ0eVRvb2xUaXAKKworCQkvKioKKwkJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkJICogQHJldHVybiB0aGUgTkxTJ2QgdGV4dCB0aGF0IHJlcHJlc2VudHMgdGhlIHVuaXRzIG9mIHRoZQorCQkgKiAgICAgICAgIHByb3BlcnR5CisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VW5pdHMoCisJCQkJSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBkZXNjcmlwdG9yCisJCQkJCS5nZXRGZWF0dXJlKG51bGwpOworCQkJcmV0dXJuIERpc2Vhc2VXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoZmVhdHVyZS5nZXROYW1lKCkKKwkJCQkJKyBVTklUX1NVRkZJWCk7CisJCX0gLy8gZ2V0UHJvcGVydHlVbml0cworCisJfSAvLyBTdGFuZGFyZFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyCit9IC8vIFN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9kaXNlYXNld2l6YXJkbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL2Rpc2Vhc2V3aXphcmRtZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZWYzNGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9kaXNlYXNld2l6YXJkbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDE5OCBAQAorIyBkaXNlYXNld2l6YXJkbWVzc2FnZXMucHJvcGVydGllcworIworIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjIE5ldyBEaXNlYXNlIFdpemFyZAorCitORGlzZWFzZVdpei53aXphcmRfdGl0bGUgPSBOZXcgRGlzZWFzZQorTkRpc2Vhc2VXaXoucGFnZV90aXRsZSA9IERpc2Vhc2UKK05EaXNlYXNlV2l6LnBhZ2VfZGVzY3JpcHRpb24gPSBEZWZpbmUgYSBuZXcgZGlzZWFzZSBpbiBhIHByb2plY3QuCitORGlzZWFzZVdpei5EQ19ERVNDUklQVElPTiA9IERpc2Vhc2UgInswfSIKKworIyBOZXcgSW5mZWN0b3IgV2l6YXJkCitOSW5mZWN0b3JXaXoud2l6YXJkX3RpdGxlID0gTmV3IEluZmVjdGlvbi9Jbm9jdWxhdGlvbiBQb2ludAorTkluZmVjdG9yV2l6LnBhZ2VfdGl0bGUgPSBJbmZlY3Rvci9Jbm9jdWxhdG9yCitOSW5mZWN0b3JXaXoucGFnZV9kZXNjcmlwdGlvbiA9IERlZmluZSBhIG5ldyBpbmZlY3Rpb24gb3IgaW5vY3VsYXRpb24gcG9pbnQgaW4gYSBwcm9qZWN0LgorTkluZmVjdG9yV2l6LkRDX0RFU0NSSVBUSU9OID0gSW5mZWN0IHswfSAiezF9IiBwb3B1bGF0aW9uIG1lbWJlcnMgd2l0aCB0aGUgZGlzZWFzZSAiezJ9IiBhdCB0aGUgbG9jYXRpb24gInszfSIgKHs0fSkuCitOSW5mZWN0b3JXaXouRENfREVTQ1JJUFRJT04yID0gSW5vY3VsYXRlIHswfSAiezF9IiBwZXJjZW50IG9mIHBvcHVsYXRpb24gYWdhaW5zdCB0aGUgZGlzZWFzZSAiezJ9IiBhdCB0aGUgbG9jYXRpb24gInszfSIgKHs0fSkuCitOSW5mZWN0b3JXaXouRENfREVTQ1JJUFRJT05fRlJPTV9GSUxFID0gSW5mZWN0IGZyb20gbG9nIGZpbGVzIGF0IHswfQorTkluZmVjdG9yV2l6LkRDX0RFU0NSSVBUSU9OMl9GUk9NX0ZJTEUgPSBJbm9jdWxhdGUgZnJvbSBsb2cgZmlsZXMgYXQgezB9CitOSW5mZWN0b3JXaXouaW5mZWN0ID0gQ3JlYXRlIGEgTmV3IEluZmVjdG9yCitOSW5mZWN0b3JXaXouaW5vY3VsYXRlID0gQ3JlYXRlIGEgTmV3IElub2N1bGF0b3IKKworTkRpc2Vhc2VXaXouZGlzZWFzZV9mb2xkZXIgPSBEaXNlYXNlcworCitQTVRQX0RlZiA9ICpQTS9UUCA9IFBvcHVsYXRpb24gTWVtYmVyL1RpbWUgUGVyaW9kCisKK3BvcHVsYXRpb25JZGVudGlmaWVyID0gUG9wdWxhdGlvbgorcG9wdWxhdGlvbklkZW50aWZpZXJUVCA9IFRoZSBuYW1lIG9mIHRoZSBwb3B1bGF0aW9uIGluZmVjdGVkIGJ5IHRoaXMgZGlzZWFzZS4gKGUuZy4sIGh1bWFuKQorcG9wdWxhdGlvbklkZW50aWZpZXJVTklUID0gCisKKyNkZXByZWNhdGVkIQorI3BoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uID0gUGh5cy5BZGouSW5mLlByb3BvcnRpb24KKyNwaHlzaWNhbGx5QWRqYWNlbnRJbmZlY3Rpb3VzUHJvcG9ydGlvblRUID0gUGh5c2ljYWxseSBBZGphY2VudCBJbmZlY3Rpb3VzIFByb3BvcnRpb24gcmVmZXJlbmNlZCB0byA0NSBrbSByYW5nZQorI3BoeXNpY2FsbHlBZGphY2VudEluZmVjdGlvdXNQcm9wb3J0aW9uVU5JVCA9IHNjYWxlZCBieSA0NWttIC8gYXZnLiBsaW5lYXIgZXh0ZW50IFtrbV0KKworY2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZSA9IENoYXJhY3RlcmlzdGljIE1peGluZyBEaXN0YW5jZQorY2hhcmFjdGVyaXN0aWNNaXhpbmdEaXN0YW5jZVRUID0gVGhlIGN1dC1vZmYgZGlzdGFuY2UgYXQgd2hpY2ggdHdvIHJlZ2lvbnMgYXJlIGZ1bGx5IG1peGVkCitjaGFyYWN0ZXJpc3RpY01peGluZ0Rpc3RhbmNlVU5JVCA9IGttCisKK3JvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb24gPSBSb2FkLk5ldC5JbmYuUHJvcG9ydGlvbgorcm9hZE5ldHdvcmtJbmZlY3Rpb3VzUHJvcG9ydGlvblRUID0gVGhlIFJvYWQgTmV0d29yayBJbmZlY3Rpb3VzIFByb3BvcnRpb24KK3JvYWROZXR3b3JrSW5mZWN0aW91c1Byb3BvcnRpb25VTklUID0gZnJhY3Rpb24gcGVyIFJvYWQKKwordGltZVBlcmlvZCA9IFRpbWUgUGVyaW9kIChUUCkKK3RpbWVQZXJpb2RUVCA9IFRoZSB0aW1lIHBlcmlvZCBmb3IgdGhlIHJhdGVzIChlLmcuLCA4NjQwMDAwMG1zID0gMSBkYXkpLgorI3RpbWVQZXJpb2RVTklUID0gRGF5KHMpCit0aW1lUGVyaW9kVU5JVCA9IG1zCisKK2Rpc2Vhc2VOYW1lID0gRGlzZWFzZSBOYW1lCitkaXNlYXNlTmFtZVRUID0gVGhlIG5hbWUgb2YgdGhlIGRpc2Vhc2UuIChlLmcuLCBJbmZsdWVuemEpCitkaXNlYXNlTmFtZVVOSVQgPQorCitzZWVkID0gUmFuZG9tIFNlZWQKK3NlZWRUVCA9IFNlZWQgZm9yIHRoZSBSYW5kb20gTnVtYmVyIEdlbmVyYXRvcgorc2VlZFVOSVQgPQorCityYW5kb21HZW5lcmF0b3IgPSBSYW5kb20gR2VuZXJhdG9yCityYW5kb21HZW5lcmF0b3JUVCA9IAorcmFuZG9tR2VuZXJhdG9yVU5JVCA9IAorCitnYWluID0gUmFuZG9tIE5vaXNlIEdhaW4KK2dhaW5UVCA9IE5vaXNlIGFtcGxpdHVkZSAoc2hvdWxkIGJlIDx+IC4wMSkKK2dhaW5VTklUID0gCisKK2luZmVjdGlvdXNNb3J0YWxpdHkgPSBJbmZlY3Rpb3VzIE1vcnRhbGl0eSAoeCkKK2luZmVjdGlvdXNNb3J0YWxpdHlUVCA9IFRoZSBmcmFjdGlvbiBvZiBwb3B1bGF0aW9uIG1lbWJlcnMgaW4gdGhlIEluZmVjdGlvdXMgc3RhdGUgdGhhdCB3aWxsIHVsdGltYXRlbHkgZGllLiAoZS5nLiwgMikKK2luZmVjdGlvdXNNb3J0YWxpdHlVTklUID0gZnJhY3Rpb24KKwordHJhbnNtaXNzaW9uUmF0ZSA9IFRyYW5zbWlzc2lvbiBSYXRlIChcdTAzYjIpCit0cmFuc21pc3Npb25SYXRlVFQgPSBUaGUgbnVtYmVyIG9mIHBvcHVsYXRpb24gbWVtYmVycyBpbiB0aGUgU3VzY2VwdGlibGUgc3RhdGUgdGhhdCBiZWNvbWUgZXhwb3NlZCBwZXIgcG9wdWxhdGlvbiBtZW1iZXIgaW4gdGhlIEluZmVjdGlvdXMgc3RhdGUuCit0cmFuc21pc3Npb25SYXRlVU5JVCA9ICAKKworCityZWZlcmVuY2VQb3B1bGF0aW9uRGVuc2l0eSA9IFJlZmVyZW5jZSBQb3AgRGVuc2l0eQorcmVmZXJlbmNlUG9wdWxhdGlvbkRlbnNpdHlUVCA9IFBvcCBEZW5zaXR5IHdoZXJlIHRyYW5zbWlzc2lvbiByYXRlIG1lYXN1cmVkCityZWZlcmVuY2VQb3B1bGF0aW9uRGVuc2l0eVVOSVQgPSBQTS9TUSBLTQorCitub25MaW5lYXJpdHlDb2VmZmljaWVudCA9IE5vbi1MaW5lYXJpdHkgQ29lZmZpY2llbnQKK25vbkxpbmVhcml0eUNvZWZmaWNpZW50VFQgPSBJbiBhIG5vbmxpbmVhciBtb2RlbCwgdXN1YWxseSA+IDEuMCAod2hpY2ggY2FwdHVyZXMgc2F0dXJhdGlvbiBvZiB0aGUgaW1tdW5lIHN5c3RlbSBmb3IgU3VzY2VwdGlibGUgcG9wdWxhdGlvbiBtZW1iZXJzKSwgdGhlIEluZmVjdGlvdXMgdGVybSBpcyByYWlzZWQgdG8gdGhpcyBwb3dlci4gIAorbm9uTGluZWFyaXR5Q29lZmZpY2llbnRVTklUID0gXHUyMjY1IDAuMCAKKworcmVjb3ZlcnlSYXRlID0gSW5mZWN0aW91cyBSZWNvdmVyeSBSYXRlIChcdTAzYjMpCityZWNvdmVyeVJhdGVUVCA9IFRoZSByYXRlIGF0IHdoaWNoIHBvcHVsYXRpb24gbWVtYmVycyBpbiB0aGUgSW5mZWN0aW91cyBzdGF0ZSwgd2hvIGRvIG5vdCBkaWUsIHdpbGwgcmVjb3Zlci4KK3JlY292ZXJ5UmF0ZVVOSVQgPSBQTS9UUCoKKworaW5mZWN0aW91c01vcnRhbGl0eVJhdGUgPSBJbmZlY3Rpb3VzIE1vcnRhbGl0eSBSYXRlIChcdTAzYmMgaSkKK2luZmVjdGlvdXNNb3J0YWxpdHlSYXRlVFQgPSBUaGUgcmF0ZSBhdCB3aGljaCBwb3B1bGF0aW9uIG1lbWJlcnMgaW4gdGhlIEluZmVjdGlvdXMgc3RhdGUsIHdobyB3aWxsIGV2ZW50dWFsbHkgZGllLCBkbyBkaWUuCitpbmZlY3Rpb3VzTW9ydGFsaXR5UmF0ZVVOSVQgPSBQTS9UUCoKKworaW1tdW5pdHlMb3NzUmF0ZSA9IEltbXVuaXR5IExvc3MgUmF0ZSAoXHUwM2MzKQoraW1tdW5pdHlMb3NzUmF0ZVRUID0gVGhhdCByYXRlIGF0IHdoaWNoIHBvcHVsYXRpb24gbWVtYmVycyBpbiB0aGUgUmVjb3ZlcmVkIHN0YXRlIGxvc2UgdGhlaXIgaW1tdW5pdHkgYW5kIGVudGVyIHRoZSBTdXNjZXB0aWJsZSBzdGF0ZS4KK2ltbXVuaXR5TG9zc1JhdGVVTklUID0gUE0vVFAqCisKK2luY3ViYXRpb25SYXRlID0gSW5jdWJhdGlvbiBSYXRlIChcdTAzYzYpCitpbmN1YmF0aW9uUmF0ZVRUID0gVGhlIHJhdGUgYXQgd2hpY2ggcG9wdWxhdGlvbiBtZW1iZXJzIGluIHRoZSBFeHBvc2VkIHN0YXRlIGVudGVyIHRoZSBJbmZlY3Rpb3VzIHN0YXRlLgoraW5jdWJhdGlvblJhdGVVTklUID0gUE0vVFAqCisKKworcmVsYXRpdmVUb2xlcmFuY2UgPSBSZWxhdGl2ZSBUb2xlcmFuY2UKK3JlbGF0aXZlVG9sZXJhbmNlVFQgPSBUaGUgcmVsYXRpdmUgdG9sZXJhbmNlIHVzZWQgYnkgdGhlIFJ1bmdlIEt1dHRhIGFkYXB0aXZlIHN0ZXBzaXplIGFsZ29yaXRobS4KK3JlbGF0aXZlVG9sZXJhbmNlVU5JVCA9IAorCitmaW5pdGVEaWZmZXJlbmNlID0gRmluaXRlIERpZmZlcmVuY2UKK2Zpbml0ZURpZmZlcmVuY2VUVCA9IFVzZSBhIHNpbXBsaWZpZWQgbWV0aG9kIChmaW5pdGUgZGlmZmVyZW5jZSkgc29sdmluZyB0aGUgZGlmZmVyZW50aWFsIGVxdWF0aW9ucyBpbnN0ZWFkIG9mIFJ1bmdlIEt1dHRhICAKK2Zpbml0ZURpZmZlcmVuY2VVTklUID0gCisKK2ZyZXF1ZW5jeURlcGVuZGVudCA9IEZyZXF1ZW5jeSBEZXBlbmRlbnQKK2ZyZXF1ZW5jeURlcGVuZGVudFRUID0gSWYgc2V0LCBhIGZyZXF1ZW5jeSBkZXBlbmRlbnQgZGlzZWFzZSBtb2RlbCBpcyB1c2VkIGluc3RlYWQgb2YgYSBkZW5zaXR5IGRlcGVuZGVudCAgCitmcmVxdWVuY3lEZXBlbmRlbnRVTklUID0gCisKK3RhcmdldElTT0tleSA9IFRhcmdldCBrZXkKK3RhcmdldElTT0tleVRUID0gVGhlIHRhcmdldCBJU08ga2V5Cit0YXJnZXRJU09VTklUID0gCisKK2luZmVjdGlvdXNDb3VudCA9IEluZmVjdGlvdXMgY291bnQKK2luZmVjdGlvdXNDb3VudFRUID0gSW5mZWN0aW91cyBjb3VudCB0b29sdGlwCitpbmZlY3Rpb3VzQ291bnRVTklUID0gCisKK2lub2N1bGF0ZWRQZXJjZW50YWdlID0gSW5vY3VsYXRlZCBwZXJjZW50YWdlCitpbm9jdWxhdGVkUGVyY2VudGFnZVRUID0gVGhlIGlub2N1bGF0ZWQgcGVyY2VudGFnZQoraW5vY3VsYXRlZFBlcmNlbnRhZ2VVTklUID0gJQorCitORGl6V2l6RXJyMD1NaXNzaW5nIERpc2Vhc2UgTmFtZS4KK05EaXpXaXpFcnIxPU1pc3NpbmcgUG9wdWxhdGlvbiBpZGVudGlmaWVyLgorTkRpeldpekVycjI9TWlzc2luZyBUaW1lIFBlcmlvZC4KK05EaXpXaXpFcnIzPVRoZSBUaW1lIFBlcmlvZCBpcyBpbnZhbGlkLgorTkRpeldpekVycjQ9TWlzc2luZyBCYWNrZ3JvdW5kIE1vcnRhbGl0eSBSYXRlLgorTkRpeldpekVycjU9QmFja2dyb3VuZCBtb3J0YWxpdHkgcmF0ZSBpcyBpbnZhbGlkLgorTkRpeldpekVycjY9TWlzc2luZyBUcmFuc21pc3Npb24gUmF0ZS4KK05EaXpXaXpFcnI3PVRoZSBUcmFuc21pc3Npb24gUmF0ZSBpcyBpbnZhbGlkLgorTkRpeldpekVycjg9TWlzc2luZyBOb24tTGluZWFyaXR5IENvZWZmaWNpZW50LgorTkRpeldpekVycjk9VGhlIE5vbi1MaW5lYXJpdHkgQ29lZmZpY2llbnQgaXMgaW52YWxpZC4KK05EaXpXaXpFcnIxMD1NaXNzaW5nIEluZmVjdGlvdXMgUmVjb3ZlcnkgUmF0ZS4KK05EaXpXaXpFcnIxMT1UaGUgSW5mZWN0aW91cyBSZWNvdmVyeSBSYXRlIGlzIGludmFsaWQuCitORGl6V2l6RXJyMTI9TWlzc2luZyBJbmZlY3Rpb3VzIE1vcnRhbGl0eSBSYXRlLgorTkRpeldpekVycjEzPVRoZSBJbmZlY3Rpb3VzIE1vcnRhbGl0eSBSYXRlIGlzIGludmFsaWQuCitORGl6V2l6RXJyMTY9TWlzc2luZyBJbW11bml0eSBMb3NzIFJhdGUuCitORGl6V2l6RXJyMTc9VGhlIEltbXVuaXR5IExvc3MgUmF0ZSBpcyBpbnZhbGlkLgorTkRpeldpekVycjE4PU1pc3NpbmcgSW5jdWJhdGlvbiBSYXRlLgorTkRpeldpekVycjE5PVRoZSBJbmN1YmF0aW9uIFJhdGUgUmF0ZSBpcyBpbnZhbGlkLgorTkRpeldpekVycjIwPURpcmVjdG9yeSBvciBGaWxlIGRvZXMgbm90IGV4aXN0LgorTkRpeldpekVycjIxPUludmFsaWQgRGF0YSBUeXBlLgorTkRpeldpekVycjIyPU1pc3NpbmcgcmVsYXRpdmUgdG9sZXJhbmNlCitORGl6V2l6RXJyMjM9UmVsYXRpdmUgdG9sZXJhbmNlIGlzIGxlc3Mgb3IgZXF1YWwgdG8gMCBvciB0b28gbGFyZ2UKK0RNUEMxPURpc2Vhc2UgTW9kZWwgUHJvcGVydHkgQ29udHJvbAorRE1QQzI9TWlzc2luZyBEaXNlYXNlIFByb3BlcnR5IEVkaXRvciBmb3IgIgorRERDLjA9RGlzZWFzZSBNb2RlbDoKK0REQy4xPVVuZGVybHlpbmcgTWF0aGVtYXRpY2FsIERpc2Vhc2UgTW9kZWwKK0REQy4yPWNsYXNzCitEREMuMz1Qcm9ibGVtIGNyZWF0aW5nIERpc2Vhc2UgTW9kZWwgaW5zdGFuY2UKK05JbmZXaXpFcnJvci4xPU1pc3NpbmcgdGhlIG5hbWUgb2YgdGhlIGRpc2Vhc2UgY2F1c2luZyB0aGUgaW5mZWN0aW9uLgorTkluZldpekVycm9yLjI9TWlzc2luZyB0aGUgbmFtZSBvZiB0aGUgcG9wdWxhdGlvbiB0byBpbmZlY3QuCitOSW5mV2l6RXJyb3IuMz1UaGUgbnVtYmVyIG9mIGluZmVjdGlvbnMgaXMgbWlzc2luZy4KK05JbmZXaXpFcnJvci40PVRoZSBudW1iZXIgb2YgaW5mZWN0aW9ucyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLgorTkluZldpekVycm9yLjU9VGhlIG51bWJlciBvZiBpbmZlY3Rpb25zIGlzIGludmFsaWQuCitOSW5mV2l6RXJyb3IuNj1NaXNzaW5nIHRoZSBsb2NhdGlvbiBzcGVjaWZpY2F0aW9uCitOSW5mV2l6RXJyb3IuNz1UaGUgbnVtYmVyIG9mIGluZmVjdGlvbnMgd2FzIG5vdCBhIHZhbGlkIG51bWJlcgorTkluZldpekVycm9yLjg9UGVyY2VudGFnZSBub3QgVmFsaWQuIE11c3QgYmUgPCAxMDAuMCUKK05JbmZXaXpFcnJvci45PUVudGVyIGEgZm9sZGVyIGNvbnRhaW5pbmcgU1RFTSBsb2cgZmlsZXMKK05JbmZXaXpFcnJvci4xMD1Gb2xkZXIgZG9lcyBub3QgZXhpc3QhCitOSW5mV2l6RXJyb3IuMTE9QmFkIHJvdyBudW1iZXIKKworTkluZldpekROPURpc2Vhc2UgTmFtZToKK05JbmZXaXpETlRUPVRoZSBuYW1lIG9mIHRoZSBEaXNlYXNlIHRvIHRoYXQgaW5mZWN0cyAoZS5nLiwgSW5mbHVlbnphKS4KK05JbmZXaXpQT1A9UG9wdWxhdGlvbjoKK05JbmZXaXpQT1BUVD1UaGUgbmFtZSBvZiB0aGUgcG9wdWxhdGlvbiBpbmZlY3RlZCAoZS5nLiwgaHVtYW4pLgorTkluZldpek5JSU5GPU51bWJlciB0byBpbmZlY3Q6CitOSW5mV2l6TklJTk89TnVtYmVyIHRvIGlub2N1bGF0ZToKK05JbmZXaXpQSUlORj1QZXJjZW50IHRvIGluZmVjdDoKK05JbmZXaXpQSUlOTz1QZXJjZW50IHRvIGlub2N1bGF0ZToKK05JbmZXaXouYWJzbnVtYmVyPVVzZSBhbiBhYnNvbHV0ZSBudW1iZXIKK05JbmZXaXoucGVyY2VudGFnZT1Vc2UgYSBwZXJjZW50YWdlCitOSW5mV2l6TklUVD1UaGUgbnVtYmVyIG9mIHBvcHVsYXRpb24gbWVtYmVycyB0byBiZSBpbmZlY3RlZC4KK05JbmZXaXpQaWNrTG9jPVNlbGVjdCBMb2NhdGlvbgorTkluZldpelBpY2tMb2NUaXRsZT1TZWxlY3QgYSBsb2NhdGlvbiB0byBpbmZlY3QgKG9yIGlub2N1bGF0ZSkKK05JbmZXaXpJU09LPUxvY2F0aW9uIElTTyBLZXk6CitOSW5mZWN0b3JXaXouZW50ZXI9RW50ZXIgbWFudWFsbHkgKGFib3ZlKQorTkluZmVjdG9yV2l6LmltcG9ydD1JbXBvcnQgZnJvbSBTVEVNIGxvZyBmaWxlcyAoYmVsb3cpCitOSW5mV2l6SW1wb3J0PVNlbGVjdCBTVEVNIExvZyBGb2xkZXIKK05JbmZXaXpMb2dEaXJMYWJlbD1Mb2cgRm9sZGVyCitOSW5mV2l6TG9nRGlyRGVzYz1TZWxlY3QgYSBTVEVNIGxvZyBmaWxlIGZvbGRlcgorTkluZmVjdG9yV2l6LmZpcnN0cm93PUZpcnN0IHJvdworTkluZmVjdG9yV2l6Lmxhc3Ryb3c9TGFzdCByb3cKK05JbmZlY3Rvcldpei5zZWxlY3RlZHJvdz1TZWxlY3RlZCByb3cKKworQUxHLjA9U29sdmVyIGFsZ29yaXRobToKK0FMRy4xPVVuZGVybHlpbmcgZGlmZmVyZW50aWFsIGVxdWF0aW9uIHNvbHZlciBhbGdvcml0aG0KK0FMRy4yPUZpbml0ZSBEaWZmZXJlbmNlCitBTEcuMz1SdW5nZSBLdXR0YSBBZGFwdGl2ZSBTdGVwIFNpemUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRlODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjI4MmE2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLnVpLmdlPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg0YzA3ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCkBAIC0wLDAgKzEsMyBAQAorI01vbiBPY3QgMTYgMTI6NTY6MzIgUERUIDIwMDYKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitlbmNvZGluZy8vc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvdmlld3MvbWVzc2FnZXMucHJvcGVydGllcz04ODU5XzEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJiYTA5MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsNzQgQEAKKyNUdWUgU2VwIDE5IDE1OjQzOjQ3IFBEVCAyMDA2CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1vcHRpbWl6ZSBvdXQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTY1MDg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDM5IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS51aS5nZTtzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuQWN0aXZhdG9yCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlcjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMsCisgb3JnLmVjbGlwc2Uuc3RlbS51aSwKKyBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5CitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2U7CisgIHVzZXM6PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLAorICAgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5rbWwsCisgICBvcmcub3NnaS5mcmFtZXdvcmssCisgICBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnZpZXdzLAorICAgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlbywKKyAgIG9yZy5lY2xpcHNlLnVpLnBsdWdpbiwKKyAgIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLAorICAgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5pbXBsLAorICAgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLAorICAgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UiLAorIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uua21sO3VzZXM6PSJvcmcudzNjLmRvbSxvcmcuZWNsaXBzZS5zdGVtLnVpLmdlIiwKKyBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnNlcnZsZXQ7dXNlczo9ImphdmF4LnNlcnZsZXQuaHR0cCxqYXZheC5zZXJ2bGV0IiwKKyBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnZpZXdzOworICB1c2VzOj0ib3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncywKKyAgIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UsCisgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cywKKyAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcywKKyAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMsCisgICBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLAorICAgb3JnLmVjbGlwc2Uuc3d0LmxheW91dCwKKyAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcywKKyAgIG9yZy5lY2xpcHNlLnVpLnBhcnQsCisgICBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbiwKKyAgIG9yZy5lY2xpcHNlLnVpIgorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL1dFQi1JTkYvLmN2c2lnbm9yZSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvV0VCLUlORi8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjA3ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL1dFQi1JTkYvLmN2c2lnbm9yZQpAQCAtMCwwICsxIEBACitjbGFzc2VzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL1dFQi1JTkYvc3RhcnQuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvV0VCLUlORi9zdGFydC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNzE2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL1dFQi1JTkYvc3RhcnQuaHRtbApAQCAtMCwwICsxLDM3IEBACis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPlN0YXJ0IFNURU0gLSBHb29nbGVFYXJ0aCBEaXNwbGF5PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgyPjxjZW50ZXI+U1RFTSAtIEdvb2dsZUVhcnRoIERpc3BsYXk8L2NlbnRlcj48L2gyPgorPGhyPjxicj4KK1RoaXMgd2lsbCBjYXVzZSBhIHJlcXVlc3QgdG8gYmUgc2VudCB0byBHb29nbGVFYXJ0aCB0byByZWFkIAordGhlIG5leHQgS01MIGZpbGUgZnJvbSB0aGUgc3BlY2lmaWVkIGZvbGRlciBvbmNlIAorZXZlcnkgTiBzZWNvbmRzLiAgSWYgbm8gbW9yZSBLTUwgZmlsZXMgZXhpc3QsIGl0IHdpbGwgZWl0aGVyCit3YWl0IG9yIHN0YXJ0IG92ZXIgZnJvbSB0aGUgYmVnaW5uaW5nLgorPGhyPjxicj4gIAorPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPSIvU1RFTS9zdGFydCI+CitLTUwgRm9sZGVyOiAKKzxpbnB1dCB0eXBlPXRleHQgbmFtZT1mb2xkZXIgdmFsdWU9Ii90bXAvZ2UiICAKKyAgICAgICBzaXplPTMwIG1heGxlbmd0aD00MCA+IDxicj4KKzxwPgorT3B0aW9uczo8YnI+CitXYWl0IGZvciBuZXcgZmlsZXM6IAorPGlucHV0IHR5cGU9dGV4dCBuYW1lPXdhaXQgdmFsdWU9InkiIHNpemU9MSBtYXhsZW5ndGg9MT4KKzxwPgorCitXYWl0IGludGVydmFsIChzZWNvbmRzKTogCis8aW5wdXQgdHlwZT10ZXh0IG5hbWU9aW50ZXJ2YWwgdmFsdWU9IjIiIHNpemU9MSBtYXhsZW5ndGg9Mj4KKzxwPgorPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJTdGFydCIgPgorPC9mb3JtPgorPGJyPgorPGhyPgorPHA+U3BlY2lmeSB0aGUgZm9sZGVyIHRoYXQgY29udGFpbnMgdGhlIEtNTCBmaWxlcyBnZW5lcmF0ZWQgCitieSBTVEVNLiBUaGUgZm9sZGVyIG11c3QgYmUgYWNjZXNzYWJsZSBmcm9tIHRoZSBXZWIgc2VydmVyLgorPHA+CitZb3UgbXVzdCBoYXZlIHByZXZpb3VzbHkgaW5zdGFsbGVkIEdvb2dsZUVhcnRoIG9uIHlvdXIgV2luZG93cyBYUCBzeXN0ZW0uCisgPGEgaHJlZj0iaHR0cDovL2VhcnRoLmdvb2dsZS5jb20vIj5odHRwOi8vZWFydGguZ29vZ2xlLmNvbS88L2E+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvV0VCLUlORi93ZWIueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyMmUxYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNjMgQEAKKyA8IURPQ1RZUEUgd2ViLWFwcCBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vLworRFREIFdlYkFwcGxpY2F0aW9uIDIuMi8vRU4iCisiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvd2ViLWFwcF8yLjIuZHRkIj4KKworCis8d2ViLWFwcD4KKyAgPGRpc3BsYXktbmFtZT5TVEVNLUdvb2dsZUVhcnRoPC9kaXNwbGF5LW5hbWU+CisgIDxkZXNjcmlwdGlvbj5TVEVNLUdvb2dsZUVhcnRoIFNlcnZsZXRzPC9kZXNjcmlwdGlvbj4KKyAgCisgIAorICA8IS0tIFByaW1hcnkgc2VydmxldCB0byBzZW5kIEtNTCB0byBHRSAtLT4gIAorICA8c2VydmxldD4KKwk8c2VydmxldC1uYW1lPlNsaWRlU2hvdzwvc2VydmxldC1uYW1lPgorCTxzZXJ2bGV0LWNsYXNzPm9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uuc2VydmxldC5TbGlkZVNob3dTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgkKKyAgPC9zZXJ2bGV0PgorICA8IS0tIFNlcnZsZXQgdG8gc2VuZCBhIG5ldHdvcmtsaW5rIEtNTCB0byBHRSAtLT4KKyAgPHNlcnZsZXQ+CisJPHNlcnZsZXQtbmFtZT5TdGFydDwvc2VydmxldC1uYW1lPgorCTxzZXJ2bGV0LWNsYXNzPm9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uuc2VydmxldC5TdGFydFNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CQorICA8L3NlcnZsZXQ+CisgIDwhLS0gU2VydmxldCB0byBjcmVhdGUgYW4gaW1hZ2Ugd2l0aCBkZXNpcmVkIHRleHQgLS0+CisgIDxzZXJ2bGV0PgorCTxzZXJ2bGV0LW5hbWU+SW1hZ2U8L3NlcnZsZXQtbmFtZT4KKwk8c2VydmxldC1jbGFzcz5vcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnNlcnZsZXQuSW1hZ2VTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICA8L3NlcnZsZXQ+CisgIDwhLS0gU2VydmxldCB0byB2ZXJpZnkgdGhhdCB0aGUgd2Vic2VydmVyIGlzIHVwIGFuZCBzZXJ2bGV0cyBkZXBsb3llZCAtLT4KKyA8c2VydmxldD4KKwk8c2VydmxldC1uYW1lPlZlcmlmeTwvc2VydmxldC1uYW1lPgorCTxzZXJ2bGV0LWNsYXNzPm9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uuc2VydmxldC5WZXJpZnlTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorCTwvc2VydmxldD4KKyAgPCEtLSBTZXJ2bGV0IHRvIGhhbmRsZSBHRSBCQk9YIGZlZWRiYWNrIC0tPgorICA8c2VydmxldD4gIAorICAgPHNlcnZsZXQtbmFtZT5CQm94PC9zZXJ2bGV0LW5hbWU+CisJPHNlcnZsZXQtY2xhc3M+b3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5zZXJ2bGV0LkJCb3hTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgkKKyAgPC9zZXJ2bGV0PgorICAKKyAgPCEtLSBzZXJ2bGV0IGluc3RhbmNlcyBtdXN0IGdvIGJlZm9yZSBhbGwgb2YgdGhlIHNlcnZsZXQ9bWFwcGluZyAtLT4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgIDxzZXJ2bGV0LW5hbWU+U2xpZGVTaG93PC9zZXJ2bGV0LW5hbWU+CisgICAgICA8dXJsLXBhdHRlcm4+L3NsaWRlc2hvdzwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPiAgCisgICAgCisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICA8c2VydmxldC1uYW1lPlN0YXJ0PC9zZXJ2bGV0LW5hbWU+CisgICAgICA8dXJsLXBhdHRlcm4+L3N0YXJ0PC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+ICAKKyAgCisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICA8c2VydmxldC1uYW1lPkltYWdlPC9zZXJ2bGV0LW5hbWU+CisgICAgICA8dXJsLXBhdHRlcm4+L2ltYWdlPC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+ICAKKyAgCisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICA8c2VydmxldC1uYW1lPlZlcmlmeTwvc2VydmxldC1uYW1lPgorICAgICAgPHVybC1wYXR0ZXJuPi92ZXJpZnk8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4gIAorICAKKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgIDxzZXJ2bGV0LW5hbWU+QkJveDwvc2VydmxldC1uYW1lPgorICAgICAgPHVybC1wYXR0ZXJuPi9iYm94PC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisgIAorPC93ZWItYXBwPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvYWJvdXQuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvYWJvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjAyMzMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9hYm91dC5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Cis8dGl0bGU+QWJvdXQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CisgCis8cD5KdW5lIDIsIDIwMDY8L3A+CQorPGgzPkxpY2Vuc2U8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKK2luZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKK2JlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKK2FwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKK3Byb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQoraW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1YmFlNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDIwIEBACitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLworYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICBpY29ucy8sXAorICAgICAgICAgICAgICAgV0VCLUlORi8sXAorICAgICAgICAgICAgICAgZXh0bGliLyxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAorICAgICAgICAgICAgICAgbm90aWNlLmh0bWwKK2phcnMuY29tcGlsZS5vcmRlciA9IC4sXAorICAgICAgICAgICAgICAgICAgICAgZXh0bGliL3NlcnZsZXQtYXBpLmphcgorc3JjLmluY2x1ZGVzID0gaWNvbnMvLFwKKyAgICAgICAgICAgICAgIGRvYy8sXAorICAgICAgICAgICAgICAgZXh0bGliLworamFycy5leHRyYS5jbGFzc3BhdGggPSBleHRsaWIvc2VydmxldC1hcGkuamFyCisKKyAgICAgICAgICAgICAgIAorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL2RvYy9leGFtcGxlLmttbCBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvZG9jL2V4YW1wbGUua21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOTM3MjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL2RvYy9leGFtcGxlLmttbApAQCAtMCwwICsxLDEzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxrbWwgeG1sbnM9Imh0dHA6Ly9lYXJ0aC5nb29nbGUuY29tL2ttbC8yLjAiPgorPERvY3VtZW50PgorPFN0eWxlIGlkPSJTdHlsZTAiPgorPExpbmVTdHlsZT4KKzx3aWR0aD4xLjA8L3dpZHRoPgorPC9MaW5lU3R5bGU+Cis8UG9seVN0eWxlPgorPGZpbGw+MDwvZmlsbD4KKzwvUG9seVN0eWxlPgorPC9TdHlsZT4KKzxTdHlsZSBpZD0iU3R5bGUxIj4KKzxMaW5lU3R5bGU+Cis8d2lkdGg+MS4wPC93aWR0aD4KKzwvTGluZVN0eWxlPgorPFBvbHlTdHlsZT4KKzxmaWxsPjE8L2ZpbGw+Cis8Y29sb3I+ODAwMDAwMzM8L2NvbG9yPgorPC9Qb2x5U3R5bGU+Cis8L1N0eWxlPgorPFN0eWxlIGlkPSJTdHlsZTIiPgorPExpbmVTdHlsZT4KKzx3aWR0aD4xLjA8L3dpZHRoPgorPC9MaW5lU3R5bGU+Cis8UG9seVN0eWxlPgorPGZpbGw+MTwvZmlsbD4KKzxjb2xvcj44MDAwMDA2NjwvY29sb3I+Cis8L1BvbHlTdHlsZT4KKzwvU3R5bGU+Cis8U3R5bGUgaWQ9IlN0eWxlMyI+Cis8TGluZVN0eWxlPgorPHdpZHRoPjEuMDwvd2lkdGg+Cis8L0xpbmVTdHlsZT4KKzxQb2x5U3R5bGU+Cis8ZmlsbD4xPC9maWxsPgorPGNvbG9yPjgwMDAwMDk5PC9jb2xvcj4KKzwvUG9seVN0eWxlPgorPC9TdHlsZT4KKzxTdHlsZSBpZD0iU3R5bGU0Ij4KKzxMaW5lU3R5bGU+Cis8d2lkdGg+MS4wPC93aWR0aD4KKzwvTGluZVN0eWxlPgorPFBvbHlTdHlsZT4KKzxmaWxsPjE8L2ZpbGw+Cis8Y29sb3I+ODAwMDAwY2M8L2NvbG9yPgorPC9Qb2x5U3R5bGU+Cis8L1N0eWxlPgorPFN0eWxlIGlkPSJTdHlsZTUiPgorPExpbmVTdHlsZT4KKzx3aWR0aD4xLjA8L3dpZHRoPgorPC9MaW5lU3R5bGU+Cis8UG9seVN0eWxlPgorPGZpbGw+MTwvZmlsbD4KKzxjb2xvcj5jMDAwMDBmZjwvY29sb3I+Cis8L1BvbHlTdHlsZT4KKzwvU3R5bGU+Cis8UGxhY2VtYXJrPgorPGRlc2NyaXB0aW9uPlNURU0gbWFwPC9kZXNjcmlwdGlvbj4KKzxuYW1lPlNURU0wPC9uYW1lPgorPHN0eWxlVXJsPiNTdHlsZTA8L3N0eWxlVXJsPgorPE11bHRpR2VvbWV0cnkvPgorPC9QbGFjZW1hcms+Cis8UGxhY2VtYXJrPgorPGRlc2NyaXB0aW9uPlNURU0gbWFwPC9kZXNjcmlwdGlvbj4KKzxuYW1lPlNURU0xPC9uYW1lPgorPHN0eWxlVXJsPiNTdHlsZTE8L3N0eWxlVXJsPgorPE11bHRpR2VvbWV0cnk+Cis8UG9seWdvbj4KKzxuYW1lPk5vcmZvbGsgQ291bnR5PC9uYW1lPgorPG91dGVyQm91bmRhcnlJcz4KKzxMaW5lYXJSaW5nPgorPGNvb3JkaW5hdGVzPi03MS4zODEzMDEsNDEuOTg0OTk4LDI1IC03MS4zMjY5OTksNDEuOTk5Njk4LDI1IC03MS4yODMzOTgsNDIuMDE2MTk5LDI1IC03MS4yNjIyOTcsNDIuMDI0Mzk5LDI1IC03MS4yNjA3OTcsNDIuMDI0ODk5LDI1IC03MS4yNjA3OTcsNDIuMDI0ODk5LDI1IC03MS4yNTU4OTcsNDIuMDI2ODk5LDI1IC03MS4yNTU2MTEsNDIuMDI3MDIxLDI1IC03MS4yNTUyOTQsNDIuMDI3MTU3LDI1IC03MS4yNTQ0OTcsNDIuMDI3NDk5LDI1IC03MS4yNTQ0OTcsNDIuMDI3NDk5LDI1IC03MS4yNDAyMzYsNDIuMDMzNDE4LDI1IC03MS4yMzc1NjksNDIuMDM0NTAzLDI1IC03MS4yMzY4NCw0Mi4wMzQ3OTksMjUgLTcxLjIzNTU2Niw0Mi4wMzUzMTgsMjUgLTcxLjIzNTU2Niw0Mi4wMzUzMTgsMjUgLTcxLjE5MDA4NSw0Mi4wNTMxMjYsMjUgLTcxLjEzODE4MSw0Mi4wNzMyNDUsMjUgLTcxLjA5Mjg5Miw0Mi4wOTA1OTksMjUgLTcxLjA4MDE5Miw0Mi4wOTU2OTksMjUgLTcxLjA4MDE5Miw0Mi4wOTU2OTksMjUgLTcxLjA2NzY5MSw0Mi4xMDExOTksMjUgLTcxLjA2NDI5MSw0Mi4xMDI0OTksMjUgLTcxLjA2MTk5MSw0Mi4xMDMzOTksMjUgLTcxLjA1ODc5MSw0Mi4xMDQ1OTksMjUgLTcxLjA1ODc5MSw0Mi4xMDQ1OTksMjUgLTcwLjk1NDM5LDQyLjE0NTgwMSwyNSAtNzAuOTMxMDE1LDQyLjI0Njk4MSwyNSAtNzAuOTE0MDkxLDQyLjI4ODgsMjUgLTcwLjk2MDE5Miw0Mi4yOTk0OTgsMjUgLTcwLjk2MDE5Miw0Mi4yOTk0OTgsMjUgLTcxLjAwOTc5Myw0Mi4zMDUxOTgsMjUgLTcxLjAzNzg5NCw0Mi4yODQ4OTgsMjUgLTcxLjA0Mjc5NCw0Mi4yNzY5OTgsMjUgLTcxLjA0ODc5NCw0Mi4yNzc2OTgsMjUgLTcxLjA0ODc5NCw0Mi4yNzc2OTgsMjUgLTcxLjA1Mjk5NCw0Mi4yNzcxOTgsMjUgLTcxLjA5Mzc5NSw0Mi4yNjY4OTgsMjUgLTcxLjE0NTM1NCw0Mi4yNDk1OTksMjUgLTcxLjE5MTE5OCw0Mi4yODI2OTcsMjUgLTcxLjE5MTE5OCw0Mi4yODI2OTcsMjUgLTcxLjE5NDE5OCw0Mi4yODc5OTcsMjUgLTcxLjE5NjE5OCw0Mi4yODYwOTcsMjUgLTcxLjIwODA5OCw0Mi4yOTcwOTcsMjUgLTcxLjI0OTEwMSw0Mi4zMjM0OTgsMjUgLTcxLjI0OTEwMSw0Mi4zMjM0OTgsMjUgLTcxLjMwNDQwMSw0Mi4zMTkzOTYsMjUgLTcxLjMwNTkwMiw0Mi4yNjI0OTgsMjUgLTcxLjM3NTMwMyw0Mi4xOTM3MzUsMjUgLTcxLjQ3Nzg3OSw0Mi4xNTY2OSwyNSAtNzEuNDc3ODc5LDQyLjE1NjY5LDI1IC03MS40Nzc4OTYsNDIuMTUzOTEsMjUgLTcxLjQ3NzkyNSw0Mi4xNDk0MzUsMjUgLTcxLjQ3Nzk0MSw0Mi4xNDY4ODEsMjUgLTcxLjQ3Nzg5NCw0Mi4xMzM0NDIsMjUgLTcxLjQ3Nzg5NCw0Mi4xMzM0NDIsMjUgLTcxLjQ3Nzk2Myw0Mi4xMzE4NjQsMjUgLTcxLjQ5NTQxMSw0Mi4xMjE0MDEsMjUgLTcxLjQ5ODIwNiw0Mi4wNjQ2OTcsMjUgLTcxLjQ5ODAwNSw0Mi4wMTcxOTgsMjUgLTcxLjQ5ODAwNSw0Mi4wMTcxOTgsMjUgLTcxLjQ0MTMwMyw0Mi4wMTgwOTgsMjUgLTcxLjM4NzMwMSw0Mi4wMTg3OTgsMjUgLTcxLjM4MTQwMSw0Mi4wMTg3OTgsMjUgLTcxLjM4MTMwMSw0MS45ODQ5OTgsMjUgLTcxLjEwNjc5Niw0Mi4zNDg5OTcsMjUgLTcxLjEwNjY5Niw0Mi4zNDkyOTcsMjUgLTcxLjEwNjU5Niw0Mi4zNDk2OTcsMjUgLTcxLjEwNjg5Niw0Mi4zNDk3OTcsMjUgLTcxLjEwOTYyMyw0Mi4zNTAwODQsMjUgLTcxLjEwOTYyMyw0Mi4zNTAwODQsMjUgLTcxLjExMDY5Niw0Mi4zNTAxOTcsMjUgLTcxLjExMDY5Niw0Mi4zNTAxOTcsMjUgLTcxLjExMTA5Niw0Mi4zNTAxOTcsMjUgLTcxLjExMTIyOCw0Mi4zNTAyNjMsMjUgLTcxLjExMTI5Niw0Mi4zNTAyOTcsMjUgLTcxLjExMTI5Niw0Mi4zNTAyOTcsMjUgLTcxLjExNDA5Niw0Mi4zNTA0OTcsMjUgLTcxLjExNjA5Niw0Mi4zNTA4OTcsMjUgLTcxLjExODU5Niw0Mi4zNTExOTcsMjUgLTcxLjE1Njk5Nyw0Mi4zMzAwOTcsMjUgLTcxLjE1Njk5Nyw0Mi4zMzAwOTcsMjUgLTcxLjE2MjE5Nyw0Mi4zMjY0OTcsMjUgLTcxLjE2MjU5Nyw0Mi4zMjYwOTcsMjUgLTcxLjE2MzQ5Nyw0Mi4zMjU0OTcsMjUgLTcxLjE2NDY5Nyw0Mi4zMDM2OTcsMjUgLTcxLjE2NDY5Nyw0Mi4zMDM2OTcsMjUgLTcxLjExNDc5Niw0Mi4zMjgzOTcsMjUgLTcxLjEwNjg5Niw0Mi4zNDg0OTcsMjUgLTcxLjEwNjg5Niw0Mi4zNDg3OTcsMjUgLTcxLjEwNjc5Niw0Mi4zNDg5OTcsMjUgLTcwLjY3NTY5LDQyLjM3NTA5OCwyNSAtNzAuNzQ5NDg3LDQyLjI5NTM2MiwyNSAtNzAuODMyOTExLDQyLjIwNTkzMiwyNSAtNzAuODQ0Nzk4LDQyLjI1OTc4MiwyNSAtNzAuNzI5MjEyLDQyLjM3Mzg0OCwyNSAtNzAuNzI5MjEyLDQyLjM3Mzg0OCwyNSAtNzAuNjc1NjksNDIuMzc1MDk4LDI1IDwvY29vcmRpbmF0ZXM+Cis8L0xpbmVhclJpbmc+Cis8L291dGVyQm91bmRhcnlJcz4KKzwvUG9seWdvbj4KKzxQb2x5Z29uPgorPG5hbWU+UGx5bW91dGggQ291bnR5PC9uYW1lPgorPG91dGVyQm91bmRhcnlJcz4KKzxMaW5lYXJSaW5nPgorPGNvb3JkaW5hdGVzPi03MC43MjkyMTIsNDIuMzczODQ4LDI1IC03MC43NDk0ODcsNDIuMzczMzQ5LDI1IC03MC44NTExOTEsNDIuMzcyNDk5LDI1IC03MC45MDU2OTIsNDIuMzE2OTk5LDI1IC03MC45NjAxOTIsNDIuMjk5NDk4LDI1IC03MC45NjAxOTIsNDIuMjk5NDk4LDI1IC03MC45MTQwOTEsNDIuMjg4OCwyNSAtNzAuOTMxMDE1LDQyLjI0Njk4MSwyNSAtNzAuOTU0MzksNDIuMTQ1ODAxLDI1IC03MS4wNTg3OTEsNDIuMTA0NTk5LDI1IC03MS4wNTg3OTEsNDIuMTA0NTk5LDI1IC03MS4wNjE5OTEsNDIuMTAzMzk5LDI1IC03MS4wNjQyOTEsNDIuMTAyNDk5LDI1IC03MS4wNjc2OTEsNDIuMTAxMTk5LDI1IC03MS4wODAxOTIsNDIuMDk1Njk5LDI1IC03MS4wODAxOTIsNDIuMDk1Njk5LDI1IC03MS4wNjc2OSw0Mi4wNDExLDI1IC03MS4wNTU0ODksNDEuOTg1NSwyNSAtNzEuMDQyNjg4LDQxLjk1OTQsMjUgLTcxLjAzNDc4OCw0MS45NTQ2LDI1IC03MS4wMzQ3ODgsNDEuOTU0NiwyNSAtNzEuMDI2MTg4LDQxLjk0OTQsMjUgLTcxLjAyNDc4OCw0MS45NDg2LDI1IC03MS4wMjQ3ODgsNDEuOTQ4NiwyNSAtNzEuMDIzODg3LDQxLjk0OCwyNSAtNzEuMDIzODg3LDQxLjk0OCwyNSAtNzEuMDIxNTg3LDQxLjk0NjUsMjUgLTcxLjAyMTU4Nyw0MS45NDY1LDI1IC03MS4wMTk3ODcsNDEuOTQ1MywyNSAtNzEuMDE5Nzg3LDQxLjk0NTMsMjUgLTcxLjAwMzg4Nyw0MS45MzMxMDEsMjUgLTcwLjk5OTk4Nyw0MS45Mjk2MDEsMjUgLTcwLjk5OTk0OCw0MS45Mjk1NjIsMjUgLTcwLjk5NjY1NCw0MS45MjM5NzMsMjUgLTcwLjk5NjY1NCw0MS45MjM5NzMsMjUgLTcwLjk5NjUxLDQxLjkyMTc2NSwyNSAtNzAuOTk0NTc2LDQxLjkwNjY2NywyNSAtNzAuOTczNjI5LDQxLjg2MTM5NywyNSAtNzAuOTc2MjcsNDEuODU5MDc3LDI1IC03MC45NzYyNyw0MS44NTkwNzcsMjUgLTcxLjAxNzg4Niw0MS43OTM0NjIsMjUgLTcwLjkxNDYyLDQxLjc3NzI3LDI1IC03MC44NzA4MSw0MS43MTU4OTUsMjUgLTcwLjg1MTk0NSw0MS42NjQyNjQsMjUgLTcwLjg1MTk0NSw0MS42NjQyNjQsMjUgLTcwLjgyOTUwOCw0MS42MTIyMzgsMjUgLTcwLjgxMzI3NCw0MS42MDc5NiwyNSAtNzAuNzUyNSw0MS41NjU4OTgsMjUgLTcwLjc1MjQyNCw0MS41NjU4NTEsMjUgLTcwLjc1MjQyNCw0MS41NjU4NTEsMjUgLTcwLjcwOTE3Miw0MS42MjUxMDYsMjUgLTcwLjY1MjkxNSw0MS43MDkxMDMsMjUgLTcwLjYzMjUzMiw0MS43NjI4NCwyNSAtNzAuNTkxOTQ1LDQxLjc3ODIwMywyNSAtNzAuNTkxOTQ1LDQxLjc3ODIwMywyNSAtNzAuNDk5NDczLDQxLjg0NDExNywyNSAtNzAuMzU1MDA1LDQyLjAwMDEwMywyNSAtNzAuMzMyMzY5LDQyLjA3MDYyNSwyNSAtNzAuMzIyNTIyLDQyLjExNzkxNSwyNSAtNzAuMzIyNTIyLDQyLjExNzkxNSwyNSAtNzAuMzc0NDc0LDQyLjEyMTU1LDI1IC03MC42MjQ0ODEsNDIuMTU3MjQ4LDI1IC03MC42NzYwNTcsNDIuMjUwMTAxLDI1IC03MC42NTg3MjMsNDIuMzc1MDk4LDI1IC03MC42NTg3MjMsNDIuMzc1MDk4LDI1IC03MC42NzU2OSw0Mi4zNzUwOTgsMjUgLTcwLjk2MDE5Miw0Mi4yOTk0OTgsMjUgLTcwLjkwNTY5Miw0Mi4zMTY5OTksMjUgLTcwLjg1MTE5MSw0Mi4zNzI0OTksMjUgLTcwLjc0OTQ4Nyw0Mi4zNzMzNDksMjUgLTcwLjcyOTIxMiw0Mi4zNzM4NDgsMjUgLTcwLjcyOTIxMiw0Mi4zNzM4NDgsMjUgLTcwLjg0NDc5OCw0Mi4yNTk3ODIsMjUgLTcwLjgzMjkxMSw0Mi4yMDU5MzIsMjUgLTcwLjc0OTQ4Nyw0Mi4yOTUzNjIsMjUgLTcwLjY3NTY5LDQyLjM3NTA5OCwyNSAtNzAuOTYwMTkyLDQyLjI5OTQ5OCwyNSAtNzAuOTA1NjkyLDQyLjMxNjk5OSwyNSAtNzAuODUxMTkxLDQyLjM3MjQ5OSwyNSAtNzAuNzQ5NDg3LDQyLjM3MzM0OSwyNSAtNzAuNzI5MjEyLDQyLjM3Mzg0OCwyNSAtNzAuNzI5MjEyLDQyLjM3Mzg0OCwyNSAtNzAuNjc1NjksNDIuMzc1MDk4LDI1IC03MC42NzU2OSw0Mi4zNzUwOTgsMjUgLTcwLjc0OTQ4Nyw0Mi4yOTUzNjIsMjUgLTcwLjgzMjkxMSw0Mi4yMDU5MzIsMjUgLTcwLjg0NDc5OCw0Mi4yNTk3ODIsMjUgLTcwLjcyOTIxMiw0Mi4zNzM4NDgsMjUgLTcwLjcyOTIxMiw0Mi4zNzM4NDgsMjUgLTcwLjY3NTY5LDQyLjM3NTA5OCwyNSAtNzAuNzI5MjEyLDQyLjM3Mzg0OCwyNSAtNzAuODQ0Nzk4LDQyLjI1OTc4MiwyNSAtNzAuODMyOTExLDQyLjIwNTkzMiwyNSAtNzAuNzQ5NDg3LDQyLjI5NTM2MiwyNSAtNzAuNjc1NjksNDIuMzc1MDk4LDI1IC03MC42NzU2OSw0Mi4zNzUwOTgsMjUgLTcwLjY1ODcyMyw0Mi4zNzUwOTgsMjUgLTcwLjcyOTIxMiw0Mi4zNzM4NDgsMjUgLTcwLjY3NTY5LDQyLjM3NTA5OCwyNSAtNzAuNjc1NjksNDIuMzc1MDk4LDI1IC03MC42NTg3MjMsNDIuMzc1MDk4LDI1IDwvY29vcmRpbmF0ZXM+Cis8L0xpbmVhclJpbmc+Cis8L291dGVyQm91bmRhcnlJcz4KKzwvUG9seWdvbj4KKzxQb2x5Z29uPgorPG5hbWU+TWlkZGxlc2V4IENvdW50eTwvbmFtZT4KKzxvdXRlckJvdW5kYXJ5SXM+Cis8TGluZWFyUmluZz4KKzxjb29yZGluYXRlcz4tNzEuMjU1OTU0LDQyLjczNjEwMiwyNSAtNzEuMjQxOTM3LDQyLjY4NTg3NSwyNSAtNzEuMjM5MDc2LDQyLjY0OTAxNSwyNSAtNzEuMjM1ODAzLDQyLjY0NzM5MSwyNSAtNzEuMjI4OTAyLDQyLjY0Mzk5MSwyNSAtNzEuMjI4OTAyLDQyLjY0Mzk5MSwyNSAtNzEuMTgzODAxLDQyLjYyMjM5MiwyNSAtNzEuMTgyNzAxLDQyLjYyMTc5MiwyNSAtNzEuMTgyNTM4LDQyLjYyMTcxNCwyNSAtNzEuMTc1NjAxLDQyLjYxODM5MiwyNSAtNzEuMTc1NjAxLDQyLjYxODM5MiwyNSAtNzEuMTc0MjAxLDQyLjYxNzY5MiwyNSAtNzEuMTcxNDAxLDQyLjYxNjE5MiwyNSAtNzEuMTcyOTAxLDQyLjYxNDY5MiwyNSAtNzEuMTc0MzgxLDQyLjYxNDc4LDI1IC03MS4xNzQzODEsNDIuNjE0NzgsMjUgLTcxLjE3NTAwNSw0Mi42MTQ5NTYsMjUgLTcxLjE3ODYwMiw0Mi42MDY0OTcsMjUgLTcxLjE3NzIwMSw0Mi42MDU2OTIsMjUgLTcxLjE3MDMwMSw0Mi42MDE1OTIsMjUgLTcxLjE3MDMwMSw0Mi42MDE1OTIsMjUgLTcxLjE2NTAxNyw0Mi41OTc5NjUsMjUgLTcxLjE1NDMzNiw0Mi42MTUyNzcsMjUgLTcxLjEzNTI5LDQyLjU5OTA2MSwyNSAtNzEuMTMxNTA3LDQyLjU5OTM3MiwyNSAtNzEuMTMxNTA3LDQyLjU5OTM3MiwyNSAtNzEuMDc1OTYxLDQyLjYwNDA5MiwyNSAtNzEuMDcxMDM1LDQyLjU1NTcxNCwyNSAtNzEuMDcwMzg2LDQyLjUyNjk2LDI1IC03MS4wNjk4NDksNDIuNTI2NTA0LDI1IC03MS4wNjk4NDksNDIuNTI2NTA0LDI1IC03MS4wNjY3OTgsNDIuNTI0NTk1LDI1IC03MS4wNjU4OTgsNDIuNTI0Mzk1LDI1IC03MS4wNjUyMzUsNDIuNTI0Mzk1LDI1IC03MS4wNjIwOTgsNDIuNTI0Mzk1LDI1IC03MS4wNjIwOTgsNDIuNTI0Mzk1LDI1IC03MS4wNTU0OTcsNDIuNTI0Mjk0LDI1IC03MS4wNDQ2OTgsNDIuNTI1NTk1LDI1IC03MS4wNDExOTcsNDIuNTI1ODk1LDI1IC03MS4wMzczOTcsNDIuNTEyNzk2LDI1IC03MS4wMzczOTcsNDIuNTEyNzk2LDI1IC03MS4wMzY3OTcsNDIuNTExNTk2LDI1IC03MS4wNDM5OTYsNDIuNTAwNjk1LDI1IC03MS4wNDIwOTYsNDIuNDk3OTk1LDI1IC03MS4wMjUyOTUsNDIuNDQ0ODk2LDI1IC03MS4wMjUyOTUsNDIuNDQ0ODk2LDI1IC03MS4wMjQ2OTUsNDIuNDQzNzk2LDI1IC03MS4wMjMyOTUsNDIuNDQyMDk2LDI1IC03MS4wMzA3OTYsNDIuNDE4Njk3LDI1IC03MS4wNzcxOTYsNDIuMzg2Mjk2LDI1IC03MS4wNzcxOTYsNDIuMzg2Mjk2LDI1IC03MS4wNzc5OTYsNDIuMzgwNTk3LDI1IC03MS4wNzc1OTYsNDIuMzgwNTk3LDI1IC03MS4wNzc1OTYsNDIuMzgwNDk3LDI1IC03MS4wNzcyOTYsNDIuMzgwNDk3LDI1IC03MS4wNzcyOTYsNDIuMzgwNDk3LDI1IC03MS4wNzYzOTYsNDIuMzgwMjk3LDI1IC03MS4wNzQzOTcsNDIuMzc3Mjk4LDI1IC03MS4wNzQzOTYsNDIuMzc3MDk3LDI1IC03MS4wNzQxOTYsNDIuMzc2Mzk3LDI1IC03MS4wNzQxOTYsNDIuMzc2Mzk3LDI1IC03MS4xMTY5MjksNDIuMzU4NzE2LDI1IC03MS4xNjc5OTgsNDIuMzYwMTk2LDI1IC03MS4xNjk2OTgsNDIuMzU4Mzk2LDI1IC03MS4xNjk2OTgsNDIuMzU4MDk2LDI1IC03MS4xNjk2OTgsNDIuMzU4MDk2LDI1IC03MS4xNjk5OTksNDIuMzU3Mzk3LDI1IC03MS4xNzExOTgsNDIuMzU2Mzk2LDI1IC03MS4xNzI3OTgsNDIuMzU0Njk2LDI1IC03MS4xNTY5OTcsNDIuMzMwMDk3LDI1IC03MS4xNTY5OTcsNDIuMzMwMDk3LDI1IC03MS4xNjIxOTcsNDIuMzI2NDk3LDI1IC03MS4xNjI1OTcsNDIuMzI2MDk3LDI1IC03MS4xNjM0OTcsNDIuMzI1NDk3LDI1IC03MS4xNjQ2OTcsNDIuMzAzNjk3LDI1IC03MS4xNjQ2OTcsNDIuMzAzNjk3LDI1IC03MS4xNjQ5OTcsNDIuMzAzMjk3LDI1IC03MS4xNjU5OTcsNDIuMzAyNDk3LDI1IC03MS4xNjY3OTcsNDIuMzAyMDk3LDI1IC03MS4xOTExOTgsNDIuMjgyNjk3LDI1IC03MS4xOTExOTgsNDIuMjgyNjk3LDI1IC03MS4xOTQxOTgsNDIuMjg3OTk3LDI1IC03MS4xOTYxOTgsNDIuMjg2MDk3LDI1IC03MS4yMDgwOTgsNDIuMjk3MDk3LDI1IC03MS4yNDkxMDEsNDIuMzIzNDk4LDI1IC03MS4yNDkxMDEsNDIuMzIzNDk4LDI1IC03MS4zMDQ0MDEsNDIuMzE5Mzk2LDI1IC03MS4zMDU5MDIsNDIuMjYyNDk4LDI1IC03MS4zNzUzMDMsNDIuMTkzNzM1LDI1IC03MS40Nzc4NzksNDIuMTU2NjksMjUgLTcxLjQ3Nzg3OSw0Mi4xNTY2OSwyNSAtNzEuNDc3ODU5LDQyLjE1ODQ0NCwyNSAtNzEuNDc5NjM1LDQyLjE2NTc5NCwyNSAtNzEuNTAyNDE4LDQyLjE5MTI4OSwyNSAtNzEuNTMzNyw0Mi4xODkyMTUsMjUgLTcxLjUzMzcsNDIuMTg5MjE1LDI1IC03MS41NTE2NjgsNDIuMTgzODg3LDI1IC03MS41NTY4MzYsNDIuMTkxODcxLDI1IC03MS41NzI3ODksNDIuMTkyMjM5LDI1IC03MS41OTM0Myw0Mi4yNDMxMzQsMjUgLTcxLjU5MzQzLDQyLjI0MzEzNCwyNSAtNzEuNTcxODkzLDQyLjI2NDUxLDI1IC03MS41NzE2NTMsNDIuMjY0NTU4LDI1IC03MS41NjkyNjksNDIuMjY1Mzc0LDI1IC03MS41NjQ5MTcsNDIuMjY2ODk0LDI1IC03MS41NjQ5MTcsNDIuMjY2ODk0LDI1IC03MS41NjM1NzMsNDIuMjY3MjYyLDI1IC03MS41NjM1NzMsNDIuMjY3MjYyLDI1IC03MS41NjMwMjksNDIuMjY3NTAyLDI1IC03MS41NjMwMjksNDIuMjY3NTAyLDI1IC03MS41MzY3ODgsNDIuMjY0NTU4LDI1IC03MS41MzE4Niw0Mi4yNjYxNTgsMjUgLTcxLjUyNTQwMiw0Mi4yNjU5NTUsMjUgLTcxLjUyMjE2LDQyLjI2NjM0MiwyNSAtNzEuNTIyMTYsNDIuMjY2MzQyLDI1IC03MS41MDE5NTMsNDIuMjc5ODY0LDI1IC03MS41MDA5Niw0Mi4yODE3NTgsMjUgLTcxLjQ5OTk1NCw0Mi4yODM2MDQsMjUgLTcxLjQ5OTMyNyw0Mi4yODQ5MjIsMjUgLTcxLjQ5OTMyNyw0Mi4yODQ5MjIsMjUgLTcxLjQ5ODc5OCw0Mi4yODYwMzQsMjUgLTcxLjQ5NjgzMyw0Mi4yODk4NDEsMjUgLTcxLjUxODI4Nyw0Mi4zMzAxNDMsMjUgLTcxLjU3MDcxLDQyLjMxOTY3OCwyNSAtNzEuNTcwNzEsNDIuMzE5Njc4LDI1IC03MS41NzgwMDYsNDIuMzE1NTUsMjUgLTcxLjU3ODUxOCw0Mi4zMTUyNDYsMjUgLTcxLjU4MjA3LDQyLjMxMzE2NiwyNSAtNzEuNjIzMTc1LDQyLjM0NzMwOSwyNSAtNzEuNjIzMTc1LDQyLjM0NzMwOSwyNSAtNzEuNjI0MTk5LDQyLjM0ODE4OSwyNSAtNzEuNjI0ODU1LDQyLjM0ODc0OSwyNSAtNzEuNjI1NjM5LDQyLjM0OTQ4NSwyNSAtNzEuNTk4Mjk1LDQyLjM3NTk5NywyNSAtNzEuNTk4Mjk1LDQyLjM3NTk5NywyNSAtNzEuNTkzODQ2LDQyLjM3ODY4NSwyNSAtNzEuNTg5NzgyLDQyLjM4MTI2MSwyNSAtNzEuNTU1NzM0LDQyLjQyMzExNiwyNSAtNzEuNTU1ODQ3LDQyLjQ3MjMxOCwyNSAtNzEuNTU1ODQ3LDQyLjQ3MjMxOCwyNSAtNzEuNTU2NjE5LDQyLjQ3MjY4NSwyNSAtNzEuNTU2NjE5LDQyLjQ3MjY4NSwyNSAtNzEuNTU4MDc3LDQyLjQ3MzM3OSwyNSAtNzEuNTYwMDU2LDQyLjQ3NDM4MSwyNSAtNzEuNTUwNzY4LDQyLjQ4OTA4NSwyNSAtNzEuNTMzODUyLDQyLjUyNzY4OCwyNSAtNzEuNTMzODUyLDQyLjUyNzY4OCwyNSAtNzEuNjM1ODEyLDQyLjUyNDA5MSwyNSAtNzEuNjk0MDE1LDQyLjYyMDI4OSwyNSAtNzEuODMwMTE4LDQyLjYzNzU4OCwyNSAtNzEuODk4NzE2LDQyLjcxMTQxOCwyNSAtNzEuODk4NzE2LDQyLjcxMTQxOCwyNSAtNzEuNjk5MjE2LDQyLjcwNjI4OCwyNSAtNzEuNDg3OTEsNDIuNzAxMzg5LDI1IC03MS4zODM2NjcsNDIuNjk4ODA5LDI1IC03MS4yNTU5NTQsNDIuNzM2MTAyLDI1IDwvY29vcmRpbmF0ZXM+Cis8L0xpbmVhclJpbmc+Cis8L291dGVyQm91bmRhcnlJcz4KKzwvUG9seWdvbj4KKzxQb2x5Z29uPgorPG5hbWU+RXNzZXggQ291bnR5PC9uYW1lPgorPG91dGVyQm91bmRhcnlJcz4KKzxMaW5lYXJSaW5nPgorPGNvb3JkaW5hdGVzPi03MS4yMjg5MDIsNDIuNjQzOTkxLDI1IC03MS4xODM4MDEsNDIuNjIyMzkyLDI1IC03MS4xODI3MDEsNDIuNjIxNzkyLDI1IC03MS4xODI1MzgsNDIuNjIxNzE0LDI1IC03MS4xNzU2MDEsNDIuNjE4MzkyLDI1IC03MS4xNzU2MDEsNDIuNjE4MzkyLDI1IC03MS4xNzQyMDEsNDIuNjE3NjkyLDI1IC03MS4xNzE0MDEsNDIuNjE2MTkyLDI1IC03MS4xNzI5MDEsNDIuNjE0NjkyLDI1IC03MS4xNzQzODEsNDIuNjE0NzgsMjUgLTcxLjE3NDM4MSw0Mi42MTQ3OCwyNSAtNzEuMTc1MDA1LDQyLjYxNDk1NiwyNSAtNzEuMTc4NjAyLDQyLjYwNjQ5NywyNSAtNzEuMTc3MjAxLDQyLjYwNTY5MiwyNSAtNzEuMTcwMzAxLDQyLjYwMTU5MiwyNSAtNzEuMTcwMzAxLDQyLjYwMTU5MiwyNSAtNzEuMTY1MDE3LDQyLjU5Nzk2NSwyNSAtNzEuMTU0MzM2LDQyLjYxNTI3NywyNSAtNzEuMTM1MjksNDIuNTk5MDYxLDI1IC03MS4xMzE1MDcsNDIuNTk5MzcyLDI1IC03MS4xMzE1MDcsNDIuNTk5MzcyLDI1IC03MS4wNzU5NjEsNDIuNjA0MDkyLDI1IC03MS4wNzEwMzUsNDIuNTU1NzE0LDI1IC03MS4wNzAzODYsNDIuNTI2OTYsMjUgLTcxLjA2OTg0OSw0Mi41MjY1MDQsMjUgLTcxLjA2OTg0OSw0Mi41MjY1MDQsMjUgLTcxLjA2Njc5OCw0Mi41MjQ1OTUsMjUgLTcxLjA2NTg5OCw0Mi41MjQzOTUsMjUgLTcxLjA2NTIzNSw0Mi41MjQzOTUsMjUgLTcxLjA2MjA5OCw0Mi41MjQzOTUsMjUgLTcxLjA2MjA5OCw0Mi41MjQzOTUsMjUgLTcxLjA1NTQ5Nyw0Mi41MjQyOTQsMjUgLTcxLjA0NDY5OCw0Mi41MjU1OTUsMjUgLTcxLjA0MTE5Nyw0Mi41MjU4OTUsMjUgLTcxLjAzNzM5Nyw0Mi41MTI3OTYsMjUgLTcxLjAzNzM5Nyw0Mi41MTI3OTYsMjUgLTcxLjAzNjc5Nyw0Mi41MTE1OTYsMjUgLTcxLjA0Mzk5Niw0Mi41MDA2OTUsMjUgLTcxLjA0MjA5Niw0Mi40OTc5OTUsMjUgLTcxLjAyNTI5NSw0Mi40NDQ4OTYsMjUgLTcxLjAyNTI5NSw0Mi40NDQ4OTYsMjUgLTcwLjk1OTQ5NCw0Mi40MDc0OTgsMjUgLTcwLjg1MTQzNiw0Mi4zOTMyMDksMjUgLTcwLjc0OTQ4OCw0Mi40MDA4MiwyNSAtNzAuNjQ4MDcyLDQyLjQwNTYyOCwyNSAtNzAuNjQ4MDcyLDQyLjQwNTYyOCwyNSAtNzAuNjE3MzM5LDQyLjUwMDA5NiwyNSAtNzAuNzE5MjcyLDQyLjc1MDA5MywyNSAtNzAuNzM1MDA1LDQyLjg3NDY4NSwyNSAtNzAuNzM1MDA1LDQyLjg3NDY4NSwyNSAtNzAuNzQ3MjY2LDQyLjg3NDY5OCwyNSAtNzAuNzkyNDk1LDQyLjg3MzI5MSwyNSAtNzAuODMyODQ0LDQyLjg2Nzc4OCwyNSAtNzAuODgzNjk4LDQyLjg4MTI5LDI1IC03MC44ODM2OTgsNDIuODgxMjksMjUgLTcwLjk0Nzk5OSw0Mi44NzY2ODksMjUgLTcxLjA0NzUwMSw0Mi44NDQwODksMjUgLTcxLjE0MzUwMyw0Mi44MTc2ODksMjUgLTcxLjIwODYwNCw0Mi43NDMzOSwyNSAtNzEuMjA4NjA0LDQyLjc0MzM5LDI1IC03MS4yMTAyMDQsNDIuNzQzNjksMjUgLTcxLjIxNjIwNCw0Mi43NDQ5ODksMjUgLTcxLjIyNjUwMSw0Mi43NDYzNjEsMjUgLTcxLjI0NTUwNCw0Mi43NDI1ODksMjUgLTcxLjI0NTUwNCw0Mi43NDI1ODksMjUgLTcxLjI0ODcwNCw0Mi43NDA1ODksMjUgLTcxLjI1MTUyLDQyLjczOTEyOSwyNSAtNzEuMjU1NjA1LDQyLjczNjM4OSwyNSAtNzEuMjU1OTU0LDQyLjczNjEwMiwyNSAtNzEuMjU1OTU0LDQyLjczNjEwMiwyNSAtNzEuMjQxOTM3LDQyLjY4NTg3NSwyNSAtNzEuMjM5MDc2LDQyLjY0OTAxNSwyNSAtNzEuMjM1ODAzLDQyLjY0NzM5MSwyNSAtNzEuMjI4OTAyLDQyLjY0Mzk5MSwyNSA8L2Nvb3JkaW5hdGVzPgorPC9MaW5lYXJSaW5nPgorPC9vdXRlckJvdW5kYXJ5SXM+Cis8L1BvbHlnb24+Cis8L011bHRpR2VvbWV0cnk+Cis8L1BsYWNlbWFyaz4KKzxQbGFjZW1hcms+Cis8ZGVzY3JpcHRpb24+U1RFTSBtYXA8L2Rlc2NyaXB0aW9uPgorPG5hbWU+U1RFTTI8L25hbWU+Cis8c3R5bGVVcmw+I1N0eWxlMjwvc3R5bGVVcmw+Cis8TXVsdGlHZW9tZXRyeS8+Cis8L1BsYWNlbWFyaz4KKzxQbGFjZW1hcms+Cis8ZGVzY3JpcHRpb24+U1RFTSBtYXA8L2Rlc2NyaXB0aW9uPgorPG5hbWU+U1RFTTM8L25hbWU+Cis8c3R5bGVVcmw+I1N0eWxlMzwvc3R5bGVVcmw+Cis8TXVsdGlHZW9tZXRyeT4KKzxQb2x5Z29uPgorPG5hbWU+U3VmZm9sayBDb3VudHk8L25hbWU+Cis8b3V0ZXJCb3VuZGFyeUlzPgorPExpbmVhclJpbmc+Cis8Y29vcmRpbmF0ZXM+LTcxLjA0ODc5NCw0Mi4yNzc2OTgsMjUgLTcxLjA0Mjc5NCw0Mi4yNzY5OTgsMjUgLTcxLjAzNzg5NCw0Mi4yODQ4OTgsMjUgLTcxLjAwOTc5Myw0Mi4zMDUxOTgsMjUgLTcwLjk2MDE5Miw0Mi4yOTk0OTgsMjUgLTcwLjk2MDE5Miw0Mi4yOTk0OTgsMjUgLTcwLjkwNTY5Miw0Mi4zMTY5OTksMjUgLTcwLjg1MTE5MSw0Mi4zNzI0OTksMjUgLTcwLjc0OTQ4Nyw0Mi4zNzMzNDksMjUgLTcwLjcyOTIxMiw0Mi4zNzM4NDgsMjUgLTcwLjcyOTIxMiw0Mi4zNzM4NDgsMjUgLTcwLjY3NTY5LDQyLjM3NTA5OCwyNSAtNzAuNjc1NjksNDIuMzc1MDk4LDI1IC03MC42NTg3MjMsNDIuMzc1MDk4LDI1IC03MC42NTg3MjMsNDIuMzc1MDk4LDI1IC03MC42NDgwNzIsNDIuNDA1NjI4LDI1IC03MC42NDgwNzIsNDIuNDA1NjI4LDI1IC03MC43NDk0ODgsNDIuNDAwODIsMjUgLTcwLjg1MTQzNiw0Mi4zOTMyMDksMjUgLTcwLjk1OTQ5NCw0Mi40MDc0OTgsMjUgLTcxLjAyNTI5NSw0Mi40NDQ4OTYsMjUgLTcxLjAyNTI5NSw0Mi40NDQ4OTYsMjUgLTcxLjAyNDY5NSw0Mi40NDM3OTYsMjUgLTcxLjAyMzI5NSw0Mi40NDIwOTYsMjUgLTcxLjAzMDc5Niw0Mi40MTg2OTcsMjUgLTcxLjA3NzE5Niw0Mi4zODYyOTYsMjUgLTcxLjA3NzE5Niw0Mi4zODYyOTYsMjUgLTcxLjA3Nzk5Niw0Mi4zODA1OTcsMjUgLTcxLjA3NzU5Niw0Mi4zODA1OTcsMjUgLTcxLjA3NzU5Niw0Mi4zODA0OTcsMjUgLTcxLjA3NzI5Niw0Mi4zODA0OTcsMjUgLTcxLjA3NzI5Niw0Mi4zODA0OTcsMjUgLTcxLjA3NjM5Niw0Mi4zODAyOTcsMjUgLTcxLjA3NDM5Nyw0Mi4zNzcyOTgsMjUgLTcxLjA3NDM5Niw0Mi4zNzcwOTcsMjUgLTcxLjA3NDE5Niw0Mi4zNzYzOTcsMjUgLTcxLjA3NDE5Niw0Mi4zNzYzOTcsMjUgLTcxLjExNjkyOSw0Mi4zNTg3MTYsMjUgLTcxLjE2Nzk5OCw0Mi4zNjAxOTYsMjUgLTcxLjE2OTY5OCw0Mi4zNTgzOTYsMjUgLTcxLjE2OTY5OCw0Mi4zNTgwOTYsMjUgLTcxLjE2OTY5OCw0Mi4zNTgwOTYsMjUgLTcxLjE2OTk5OSw0Mi4zNTczOTcsMjUgLTcxLjE3MTE5OCw0Mi4zNTYzOTYsMjUgLTcxLjE3Mjc5OCw0Mi4zNTQ2OTYsMjUgLTcxLjE1Njk5Nyw0Mi4zMzAwOTcsMjUgLTcxLjE1Njk5Nyw0Mi4zMzAwOTcsMjUgLTcxLjExODU5Niw0Mi4zNTExOTcsMjUgLTcxLjExNjA5Niw0Mi4zNTA4OTcsMjUgLTcxLjExNDA5Niw0Mi4zNTA0OTcsMjUgLTcxLjExMTI5Niw0Mi4zNTAyOTcsMjUgLTcxLjExMTI5Niw0Mi4zNTAyOTcsMjUgLTcxLjExMTIyOCw0Mi4zNTAyNjMsMjUgLTcxLjExMTA5Niw0Mi4zNTAxOTcsMjUgLTcxLjExMDY5Niw0Mi4zNTAxOTcsMjUgLTcxLjExMDY5Niw0Mi4zNTAxOTcsMjUgLTcxLjEwOTYyMyw0Mi4zNTAwODQsMjUgLTcxLjEwOTYyMyw0Mi4zNTAwODQsMjUgLTcxLjEwNjg5Niw0Mi4zNDk3OTcsMjUgLTcxLjEwNjU5Niw0Mi4zNDk2OTcsMjUgLTcxLjEwNjY5Niw0Mi4zNDkyOTcsMjUgLTcxLjEwNjc5Niw0Mi4zNDg5OTcsMjUgLTcxLjEwNjc5Niw0Mi4zNDg5OTcsMjUgLTcxLjEwNjg5Niw0Mi4zNDg3OTcsMjUgLTcxLjEwNjg5Niw0Mi4zNDg0OTcsMjUgLTcxLjExNDc5Niw0Mi4zMjgzOTcsMjUgLTcxLjE2NDY5Nyw0Mi4zMDM2OTcsMjUgLTcxLjE2NDY5Nyw0Mi4zMDM2OTcsMjUgLTcxLjE2NDk5Nyw0Mi4zMDMyOTcsMjUgLTcxLjE2NTk5Nyw0Mi4zMDI0OTcsMjUgLTcxLjE2Njc5Nyw0Mi4zMDIwOTcsMjUgLTcxLjE5MTE5OCw0Mi4yODI2OTcsMjUgLTcxLjE5MTE5OCw0Mi4yODI2OTcsMjUgLTcxLjE0NTM1NCw0Mi4yNDk1OTksMjUgLTcxLjA5Mzc5NSw0Mi4yNjY4OTgsMjUgLTcxLjA1Mjk5NCw0Mi4yNzcxOTgsMjUgLTcxLjA0ODc5NCw0Mi4yNzc2OTgsMjUgPC9jb29yZGluYXRlcz4KKzwvTGluZWFyUmluZz4KKzwvb3V0ZXJCb3VuZGFyeUlzPgorPC9Qb2x5Z29uPgorPC9NdWx0aUdlb21ldHJ5PgorPC9QbGFjZW1hcms+Cis8UGxhY2VtYXJrPgorPGRlc2NyaXB0aW9uPlNURU0gbWFwPC9kZXNjcmlwdGlvbj4KKzxuYW1lPlNURU00PC9uYW1lPgorPHN0eWxlVXJsPiNTdHlsZTQ8L3N0eWxlVXJsPgorPE11bHRpR2VvbWV0cnkvPgorPC9QbGFjZW1hcms+Cis8UGxhY2VtYXJrPgorPGRlc2NyaXB0aW9uPlNURU0gbWFwPC9kZXNjcmlwdGlvbj4KKzxuYW1lPlNURU01PC9uYW1lPgorPHN0eWxlVXJsPiNTdHlsZTU8L3N0eWxlVXJsPgorPE11bHRpR2VvbWV0cnkvPgorPC9QbGFjZW1hcms+Cis8L0RvY3VtZW50PgorPC9rbWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL2RvYy9yZWFkbWUudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9kb2MvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmZjNzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9kb2MvcmVhZG1lLnR4dApAQCAtMCwwICsxLDExOCBAQAorTm90ZXMgYWJvdXQgdGhlIFNURU0gLSBHb29nbGVFYXJ0aCBpbnRlcmZhY2UKKyAgb3JnLmVjbGlwc2Uuc3RlbS5nZQorICAKK1RoaXMgZmlsZSBoYXMgbm90ZXMgdGhhdCBkb2N1bWVudCBpbnRlcmVzdGluZyB0aGluZ3MgcmVsYXRpbmcgdG8gdGhlIFNURU0gR29vZ2xlRWFydGggaW50ZXJmYWNlIGNvZGUgdGhhdCBzaG91bGQgYmUgcHJlc2VydmVkIGZvciBmdXR1cmUgZ2VuZXJhdGlvbi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ3JlYXRpbmcgQU5UIGJ1aWxkLnhtbCAgKGluIHByb2dyZXNzKQorICAgcmlnaHRjbGljayBwbHVnaW4ueG1sIC0+UERFIFRvb2xzIC0+IENyZWF0ZSBBbnQgQnVpbGQgZmlsZQorCitDaGFuZ2UgCisgICAgPHByb3BlcnR5IG5hbWU9ImphdmFjU291cmNlIiB2YWx1ZT0iMS41Ii8+CisJPHByb3BlcnR5IG5hbWU9ImphdmFjVGFyZ2V0IiB2YWx1ZT0iMS41Ii8+CisJCisgY2QgIEM6XHN0ZW1cb3JnLmVjbGlwc2Uuc3RlbS5nZQorIGFudCB6aXAucGx1Z2luIAkKKyAKKyBOb3RlIHRoZSBhYm92ZSBpcyBpbmNvbXBsZXRlLi4uLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisKK1J1bm5pbmcgdGhlIEdvb2dsZUVhcnRoIGludGVyZmFjZSB1bmRlciBTVEVNIAorIAorLSBJbnN0YWxsIGFuZCB0ZXN0IEdvb2dsZUVhcnRoIAorLSB1cGRhdGUgdG8gdGhlIGxhdGVzdCBjb2RlIGFuZCBlbnN1cmUgaXQgaXMgcmVmcmVzaGVkIGFuZCByZWJ1aWx0CistIFVwZGF0ZSB0aGUgbGF1bmNoIHNjcmlwdCB0byBzcGVjaWZ5IFZNIGFyZ3VtZW50cyAgIC1YbXg1MTJNIAorLSBGcm9tIEVjbGlwc2UsIFJ1biBTdGVtIHVzaW5nIHN0ZW0ucHJvZHVjdAorICAKKyAgSW4gdGhlIG5ldyBTVEVNIHdvcmtzcGFjZSB3aW5kb3cgICAKKyAgIC0gV2luZG93cy0+T3BlbiBQZXJzcGVjdGl2ZS0+U2ltdWxhdGlvbiAKKyAgIC0gV2luZG93cy0+U2hvdyBWaWV3LT5PdGhlci0+U3RlbS0+R29vZ2xlRWFydGggCisgICAtIFdpbmRvd3MtPlByZWZlcmVuY2VzLT5Hb29nbGVFYXJ0aAorICAgICAgU3BlY2lmeSBhbnkgcHJlZmVyZW5jZXMgdGhhdCB5b3Ugd2FudCB0byB1c2UKKyAgIC0gU2NlbmFyaW9zOiBzZWxlY3QgU1RFTS0+UGFuZGVtaWMgRGVtbworICAgLSBGcm9tIHRoZSB0b29sYmFyIFNURU0gaWNvbnMsIHNlbGVjdCAiQWR2YW5jZSIKKyAgIC0gU2VsZWN0IEdvb2dsZUVhcnRoIFZpZXcgd2luZG93CisgICAtIFNlbGVjdCB0aGUgU2ltdWxhdGlvbiB0aGVuIHJpZ2h0IGNsaWNrIGZvciBwb3B1cCBtZW51CisgICAtIHNlbGVjdCBEaXNwbGF5TWFwIHRvIHNlbmQgYSBtYXAgdG8gR29vZ2xlRWFydGggCisgICAgCisgIAorICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitVc2luZyBTV1QgUHJvZ3JhbS5sYXVuY2goZm4pIAorCitUaGlzIHVzZXMgIHRoZSBTV1QgUHJvZ3JhbSB1dGlsaXR5IGNsYXNzIHRvIGxhdW5jaCB0aGUgS01MIGZpbGUgdG8gdGhlIEdvb2dsZUVhcnRoIGFwcGxpY2F0aW9uLiAgCitGb3Igc29tZSByZWFzb24sIGFsdGhvdWdoIGl0IGNvbXBpbGVzIHdpdGggbm8gcHJvYmxlbSwgYXQgcnVudGltZSBpdCBmYWlscyBiZWNhdXNlIGl0IG5lZWRzIHBsYXRmb3JtIGRlcGVuZGVudCBKTkkgbWV0aG9kcy4gIAorT24gV2luZG93cyBpdCBuZWVkcyB0aGUgZGxsIGZpbGUgIAorICAgc3d0LXdpbjMyLTMyMzIuZGxsCisgICAKK0FmdGVyIG1hbnkgZnJ1aXRsZXNzIGF0dGVtcHRzIHRvIGdldCB0aGlzIHRvIHdvcmsgSSB1c2VkIHRoZSBmb2xsb3dpbmcgaGFjayB0byBieXBhc3MgdGhlIHByb2JsZW0uCisgICBHbyB0bzoKKyAgICBodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvZWNsaXBzZS9kb3dubG9hZHMvZHJvcHMvUi0zLjItMjAwNjA2MjkxOTA1L2luZGV4LnBocAorICAgRG93bmxvYWQ6ICAgIAorICAgIHN3dC0zLjItd2luMzItd2luMzIteDg2LnppcAorICAgZXh0cmFjdCAgCisgICAgc3d0LXdpbjMyLTMyMzIuZGxsIAorICAgcHV0IGl0IGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgZ2UgcHJvamVjdC4gCisgICBJdCBpcyB0aGVuIGNoZWNrZWQgaW50byBTVk4KKyAgIAorVGhpcyBzZWVtcyB0byB3b3JrIGJ1dCB3b3VsZCBoYXZlIHRvIGJlIHNsaWdodGx5IHJlZG9uZSB0byBzdXBwb3J0IG90aGVyIHBsYXRmb3Jtcy4KKworSWYgc29tZW9uZSBmaWd1cmVzIG91dCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIGNyb3NzcGxhdGZvcm0gc3VwcG9ydCBmb3IgU1dULCBwbGVhc2UgZG9jdW1lbnQgaXQgaGVyZS4KKyAKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgRW1iZWRlZCBXZWIgU2VydmVyCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlZSB0aGUgZm9sbG93aW5nIFVSTCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgdGhlIHdlYiBzZXJ2ZXIgCisgdGhhdCBpcyBlbWJlZGVkIGluIEVjbGlwc2UuCisgICBodHRwOi8vd3d3LmVjbGlwc2V6b25lLmNvbS9lY2xpcHNlL2ZvcnVtcy90NjI4NTIuaHRtbD9zdGFydD0wCisgCisgV2UgdXNlIHRoaXMgYW5kIGl0IGlzIHN0YXJ0ZWQgaW4gU3RlbUttbC5qYXZhCisgCisgVGhlcmUgYXJlIHNwZWNpYWwgY29uc2lkZXJhdGlvbiB0byBtYWtlIHRoZSBlbWJlZGRlZCB3ZWIgc2VydmVyIHJ1bgorIGluIGEgc3RhbmRhbG9uZSBFY2xpcHNlIFJDUC4gIFRoZSBiYXNpYyBwcm9ibGVtIGlzIHRoYXQgdGhlIGVtYmVkZGVkIFRvbWNhdCBzZXJ2ZXIgCisgY2Fubm90IHJlYWQgZnJvbSBqYXIgZmlsZXMgYW5kIHRoZSBkZWZhdWx0IHdoZW4gZXhwb3J0aW5nIHBsdWdpbnMgZnJvbQorIEVjbGlwc2UgaXMgdG8gcGFja2FnZSBpdCBpbiBhIGphci4gIAorIEEgaGFjayB0byBieXBhc3MgdGhpcyBpcyB0byBkbyB0aGUgZm9sbG93aW5nOgorICAgLSBNb2RpZnkgYnVpbGQucHJvcGVydGllcyBzbyB0aGF0ICJiaW4vIiBpcyBpbmNsdWRlZCBpbgorICAgICB0aGUgYmluLmluY2x1ZGVzIHN0YXRlbWVudC4KKyAgIC0gTW9kaWZ5IG1hbmlmZXN0Lm1mIHRvIGluY2x1ZGUKKyAgICAgIEJ1bmRsZS1DbGFzc1BhdGg6IGJpbi8KK1RoZW4gcnVuIHRoZSBleHBvcnQgd2l6YXJkIGZyb20gb3JnLmVjbGlwc2Uuc3RlbS51aS9zdGVtLnByb2R1Y3QKKworIFRoZXJlIG11c3QgYmUgYmV0dGVyIHdheXMgdG8gZG8gdGhpcyBidXQgYXQgbGVhc3QgCisgaW4gMy4yLjEsIHRoZSBhYm92ZSB3b3Jrcy4KKyAgICAgIAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBleGFtcGxlLmttbAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgCisgRmlsZSBleGFtcGxlLmttbCBpcyBhbiBleGFtcGxlIG9mIHRoZSBLTUwgdGhhdCBpcyBnZW5lcmF0ZWQgYnkgdGhlIFN0ZW0gdG8gR29vZ2xlRWFydGggaW50ZXJmYWNlIChhY3R1YWxseSB0aGlzIHdhcyBmcm9tIFN0ZW0gMSBidXQgc2hvdWxkIGJlIHRoZSBzYW1lIG9mIHNpbWlsYXIgZm9yIFN0ZW0gMikgIAorIAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIAorIAorIFJ1bm5pbmcgb24gMiBwcm9jZXNzb3JzIHdpdGggbmV0d29yayBhdHRhY2hlZCBmaWxlcworIAorICAgU3lzdGVtMSAKKyAgICAgIFNURU0gCisgICAgICAgIEZvbGRlciAgbmV0bGluayBcXHN5c3RlbTFcYy50bXBcZ2UKKyAgICAgICAgICAgCisgICAgICAgICAgIAorICAgU3lzdGVtMiAKKyAgICAgICAgIEZvbGRlciBjOi90bXAvZ2UgCisgICAgICAgICAgIFNoYXJlIGM6XHRtcCBhcyBjLnRtcAorICAgICAgICBUb21jYXQgCisgICAgICAgICAgIAorICAgICAgICBHb29nbGVFYXJ0aAorICAgICAgICAKKyAgICAgICAgaHR0cDovL3N5c3RlbTE6ODA4MC9zbGlkZXNob3cuaHRtbCAKKyAgICAgICAgCisgICAgICAgIGNkICVDQVRBTElOQV9IT01FJQorICAgICAgICBiaW5cdG9tY2F0NS5leGUKKyAgICAgICAgCisgICAgQW4gWFAgc2VydmljZSBjYW5ub3QgcmVhZCBuZXR3b3JrIGZpbGVzIHNvIHlvdSBoYXZlIAorICAgIHRvIHN0YXJ0IFRvbWNhdCBhcyBhIG5vcm1hbCBhcHBsaWNhdGlvbiBpZiBUb21jYXQgaXMgb24gdGhlIHN5c3RlbQorICAgIHRoYXQgcmVhZHMgdGhlIG5ldHdvcmsgZmlsZS4gIFByb2JhYmx5IGJlc3QgdGhpbmcgdG8gZG8gaXMgCisgICAgcnVuIFRvbWNhdCBhbmQgR0Ugb24gdGhlIHN5c3RlbSB0aGF0IGhhcyB0aGUgbmF0aXZlIGZpbGVzIGFuZCBsZXQgCisgICAgU1RFTSB3cml0ZSB0byB0aGUgbmV0d29yayBhdHRhY2hlZCBkaXJlY3RvcnkuCisgCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvZG9jL3JlYWRtZV9zZXJ2bGV0LnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvZG9jL3JlYWRtZV9zZXJ2bGV0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmNiMTM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9kb2MvcmVhZG1lX3NlcnZsZXQudHh0CkBAIC0wLDAgKzEsMTY1IEBACitvcmcuZWNsaXBzZS5zdGVtLmdlLnNlcnZsZXQKKworT3ZlcnZpZXc6CisKK1RoaXMgcGx1Z2luIHByb3ZpZGVzIGEgc2VydmxldCBiYXNlZCBpbnRlcmZhY2UgZm9yIGRpc3BsYXlpbmcgdGhlIAorU1RFTSBtYXAgYXMgYW4gb3ZlcmxheSBvbiBHb29nbGVFYXJ0aC4KKworVGhlcmUgYXJlIDIgcGFydHMuICBVc2luZyB0aGUgU1RFTSBHb29nbGVFYXJ0aCBpbnRlcmZhY2UgVmlldywgCitTVEVNIGNhbiBiZSBpbnN0cnVjdGVkIG9uIGVhY2ggY3ljbGUgKG9yIG9uIGV2ZXJ5IE50aCAKK2N5Y2xlKSB0byB3cml0ZSB0aGUgbWFwIGRhdGEgdG8gYSBzcGVjaWZpZWQgZGlyZWN0b3J5IGFzIGEgS01MIGZpbGUuCisKK0FzIFNURU0gaXMgcHJvZHVjaW5nIEtNTCBmaWxlcyBvciBhcyBhIGxhdGVyIHN0ZXAsIG9uZSBzdGFydHMgdGhlIAorcHJvY2VzcyB0byBkaXNwbGF5IHRoZSBTVEVNIHJlc3VsdHMgb24gR29vZ2xlRWFydGguCitUaGUgU2VydmxldCBpbnRlcmZhY2UgaW5jbHVkZXMgYSBIVE1MIGZpbGUgYW5kIFN0YXJ0U2VydmxldCB0aGF0IHdpbGwKK3NlbmQgYSBOZXR3b3JrTGluayBmaWxlIHRvIEdvb2dsZUVhcnRoIHRoYXQgdGVsbHMgaXQgdG8gZXZlcnkgTiBzZWNvbmRzCit0byBpc3N1ZSBhIHJlcXVlc3QgdG8gU2xpZGVTaG93U2VydmxldCB0byBnZXQgdGhlIEtNTCBmaWxlIGZvciB0aGUgbmV4dCBjeWNsZS4KKworU2xpZGVTaG93U2VydmxldC5qYXZhCisgIFRoaXMgaXMgYSBKYXZhIFNlcnZsZXQgdG8gaW50ZXJmYWNlIHRvIEdvb2dsZUVhcnRoIAorICB0byBkaXNwbGF5IEtNTCBmaWxlcyBnZW5lcmF0ZWQgYnkgU1RFTS4KKworU3RhcnRTZXJ2bGV0LmphdmEgCisgIFRoaXMgaXMgYSBTZXJ2bGV0IHRoYXQgYmFzZWQgb24gdXNlciBpbnB1dCB3aWxsIHNlbmQgYSAKKyAgTmV0d29ya0xpbmsua21sIGZpbGUgdG8gR29vZ2xlRWFydGguCisKK0ltYWdlU2VydmxldC5qYXZhIAorICBUaGlzIGlzIGEgU2VydmxldCB0aGF0IGJhc2VkIG9uIHVzZXIgaW5wdXQgd2lsbCBjcmVhdGUgYW4gaW1hZ2UgCisgIGZpbGUgdGhhdCBjYW4gYmUgc2VudCB0byBHb29nbGVFYXJ0aC4gIFRoZSBpbWFnZSB3aWxsIGhhdmUgCisgIHdoYXRldmVyIHRleHQgaXMgc3BlY2lmaWVkLgorICBUaGlzIGlzIHVzZWQgdG8gZGlzcGxheSB0ZXh0IG1lc3NhZ2VzIG9uIHRoZSBHb29nbGVFYXJ0aCBzY3JlZW4uICAKKyAKK1ZlcmlmeVNlcnZsZXQuamF2YSAKKyAgVGhpcyBpcyBhIHNlcnZsZXQgdGhhdCBpcyB1c2VkIGJ5IFZlcmlmeUNsaWVudCB0byBwcm92aWRlIAorICBhIHdheSBmb3IgdGhlIGNsaWVudCB0byB2ZXJpZnkgdGhhdCB0aGUgd2ViIHNlcnZlciBpcyBhY3RpdmUgCisgIGFuZCB0aGF0IHRoZSBzZXJ2bGV0IGludGVyZmFjZSBpcyBkZXBsb3llZCBjb3JyZWN0bHkuCisgIAorVmVyaWZ5Q2xpZW50IAorICBUaGlzIHV0aWxpdHkgY2xhc3MgaG9sZHMgYSB2ZXJpZnkgbWV0aG9kIHRoYXQgd2lsbCB0cnkgdG8gCisgIGFjY2VzcyB0aGUgVmVyaWZ5U2VydmxldCB0byBjaGVjayB0aGF0IGl0IGlzIHVwIGFuZCBydW5uaW5nLgorICAgICBTdHJpbmcgdXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9TbGlkZVNob3cvdmVyaWZ5IgorICAgICBWZXJpZnlDbGllbnQgdmMgPSBuZXcgVmVyaWZ5Q2xpZW50KCk7CisgICAgIGJvb2xlYW4gb2sgPSB2Yy52ZXJpZnkodXJsKQorICAgICBpZiAoISBvaykgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odmMuZ2V0RXJyb3IoKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgfSAgCisgICAgIAorICAgICAKKyAgICAgICAgCitUaGUgaW5zdGFsbGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIGludm9sdmVzIHRoZSBmb2xsb3dpbmc6CisgIC0gSW5zdGFsbGluZyB0aGUgVG9tQ2F0IHdlYiBzZXJ2ZXIuCisgIC0gSW5zdGFsbGluZyB0aGUgc2VydmxldHMgb24gVG9tY2F0CisgIC0gSW5zdGFsbGluZyBHb29nbGUgRWFydGgKKyAgLSBJbnN0YWxsaW5nIGFuZCBydW5uaW5nIFNURU0KKyAgLSBJbnZva2luZyB0aGUgU2xpZGVTaG93Lmh0bWwgCisgIAorVGhlc2Ugc3RlcHMgYXJlIGRlc2NyaWJlZCBpbiBkZXRhaWwgYmVsb3cuCisKKyAKKworICBUbyBpbnN0YWxsIHRoaXMgc2VydmxldCBzbyBpdCB3aWxsIHJ1biBvbiB5b3VyIG93biBXaW5kb3dzIFBDLAorICBkbyB0aGUgZm9sbG93aW5nIHdpdGg6CisgICA8cGF0aD49eW91ciBzdGVtIHdvcmtzcGFjZSBmb2xkZXIuCisgICA8cHJvamVjdD49PHBhdGg+Lm9yZy5lY2xpcHNlLnN0ZW0uZ2Uuc2VydmxldAorICAgVGhpcyBpcyBmb3IgV2luZG93cyBzeXN0ZW1zIG9ubHkgYXQgdGhlIGN1cnJlbnQgdGltZS4KKyAgIExpbnV4IGluc3RhdGFsbGF0aW9uIHdpbGwgYmUgZG9jdW1lbnRlZCB3aGVuIGl0IGlzIGF2YWlsYWJsZS4KKyAgCisgIC0gQ2hlY2tvdXQgdGhlIG9yZy5lY2xpcHNlLnN0ZW0gcHJvamVjdHMgZnJvbQorICAgICAgc3ZuLm9wZW5zb3VyY2UuaWJtLmNvbS9zdm4vc3RlbS90cnVuaworICAgICAgCisgIC0gSW5zdGFsbCBUb21jYXQgKHZlcnNpb24gNSkgb24geW91ciBXaW5kb3dzIFBDLgorICAgICAgaHR0cDovL3RvbWNhdC5hcGFjaGUub3JnCisgICAgICAKKyAgICAgLSBkb3dubG9hZCBjdXJyZW50IDUuNSBleGVjdXRhYmxlIGFuZCBpbnZva2UgaXQuCisgICAgIC0gVGFrZSB0aGUgZGVmYXVsdHMgYW5kIGFzc2lnbiBhIHVzZXIgYW5kIHBhc3N3b3JkIGZvciBhZG1pbi4KKyAgICAgLSBBZnRlciBpdCBzdGFydHMsIGNsaWNrIG9uIHRoZSBUb21jYXQgdHJheSBpY29uIGFuZAorICAgICAgIHNwZWNpZnkgInN0YXJ0IHNlcnZpY2UiIAorICAgICAtIEZyb20geW91ciBicm93c2VyIGdvdG8gaHR0cDovL2xvY2FsaG9zdDo4MDgwIAorICAgICAgIGFuZCBzZWxlY3QgIlRvbWNhdCBNYW5hZ2VyIiBmcm9tIEFkbWluaXN0cmF0aW9uLgorICAtICBBbHRlcm5hdGl2ZSBpcyB0byB1c2UgdGhlIFRvbWNhdCBzZXJ2ZXIgZW1iZWRkZWQgaW4gRWNsaXBzZS4KKyAgCisgICAgIFRoZSBwcmVmZXJlbmNlcyBmb3IgZ0UgaGF2ZSBhIGNoZWNrYm94IHRoYXQgY2FuIGJlIHNldAorICAgICB0byB1c2UgdGhlIGVtYmVkZGVkIHNlcnZlci4gIFRoaXMgd29ya3MgZmluZSBmb3IgcnVubmluZyAKKyAgICAgR29vZ2xlRWFydGggYW5kIFNURU0gdG9nZXRoZXIgYnV0IGNhbiBub3QgYmUgdXNlZCBmb3IgCisgICAgIG9mZmxpbmUgZGlzcGxheSBvZiBTVEVNIGRhdGEuCisgICAgICAgICAgICAgIAorICAtICBSdW4gYW50IHRvIGdlbmVyYXRlIGEgV0FSIGZpbGUuCisgICAgICAgY2QgPHByb2plY3Q+CisgICAgICAgYW50IHdhcgorICAgICBUaGlzIGJ1aWxkcyB0aGUgd2FyIGZpbGUgaW4gCisgICAgICAgPHByb2plY3Q+L1dFQi1JTkYvU2xpZGVTaG93LndhcgorICAgICAgIAorICAtICBVc2UgdGhlIFRvbWNhdCBNYW5hZ2VyIHRvIGRlcGxveSBTbGlkZVNob3cud2FyCisgICAgICBVUkwgaHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZXIvaHRtbC91cGxvYWQgIAorICAgICAgIC0gY2xpY2sgInVuZGVwbG95IiBmb3IgZXhpc3Rpbmcgc2xpZGVzaG93IChpZiBwcmVzZW50KQorICAgICAgIC0gVW5kZXIgIldBUiBmaWxlIHRvIGRlcGxveSIKKyAgICAgICAgIC0gYnJvd3NlIHRvIDxwcm9qZWN0Pi9idWlsZC93YXIvU2xpZGVTaG93LndhcgorICAgICAgICAgLSBjbGljayAiZGVwbG95IgorICAKKyAgLSBUbyB2ZXJpZnkgdGhlIGluc3RhbGxhdGlvbiwgZW50ZXIgdGhlIGZvbGxvd2luZyBVUkwgaW4geW91ciBicm93c2VyIgorICAgICAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9TbGlkZVNob3cvaW1hZ2UKKyAgICBZb3Ugc2hvdWxkIGdldCBhIHNtYWxsIGltYWdlIHdpdGggdGV4dCAiZGVmYXVsdCIgZGlzcGxheWVkIGluIHlvdXIgYnJvd3NlciAKKyAgICAKKyAgLSAgQ29weSA8cHJvamVjdD5zbGlkZXNob3cuaHRtbCB0byA8VG9tY2F0Plx3ZWJhcHBzXFJPT1QgICAgIAorICAgICAgICAgCisgICAgICAgCisgIFRvIHJ1biB0aGlzIHNlcnZsZXQgeW91IG5lZWQgdG8gZG8gdGhlIGZvbGxvd2luZzoKKyAgCisgIC0gSW5zdGFsbCBHb29nbGVFYXJ0aCAgIGh0dHA6Ly9lYXJ0aC5nb29nbGUuY29tLyAKKyAgICAgSW5zdXJlIHRoYXQgR29vZ2xlRWFydGggcnVucyBvbiB5b3VyIHN5c3RlbS4gIFRoZXJlIG1heSBiZSBpc3N1ZXMgd2l0aCAKKyAgICAgZmlyZXdhbGxzIG9yIDNEIHZpZGVvIGRyaXZlcnMgdGhhdCB3aWxsIHByZXZlbnQgR29vZ2xlRWFydGggZnJvbQorICAgICBydW5uaW5nLiAgVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBHRVNsaWRlU2hvdyBydW5zIHdpdGggCisgICAgIEdvb2dsZUVhcnRoIFY0IGJldGEuIAorICAKKyAgLSBUbyBydW4gdGhlIGV4aXN0aW5nIFNURU0gZGVtbyBvbiBISUkwMDMuYWxtYWRlbi5pYm0uY29tLCAKKyAgICBzZWxlY3QgdGhlIGZvbGxvd2luZyB1cmwuCisgICAgIGh0dHA6Ly9oaWkwMDMuYWxtYWRlbi5pYm0uY29tOjgwODAvc2xpZGVzaG93Lmh0bWwKKyAgICAgVGhlbiBwcmVzcyAic3RhcnQiCisgICAgIFRoaXMgd2lsbCBydW4gYSBwcmV2aW91c2x5IGdlbmVyYXRlZCBzY3JpcHQgb2YgdGhlIHNwcmVhZCBvZiAKKyAgICAgYSBmbHUgdmlydXMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgc2hvd2luZyAiSW5mZWN0aW91cyIgaW5kaXZpZHVhbHMuCisgICAgIAorICAKKyAgLSAgVG8gY3JlYXRlIGEgbmV3IHNldCBvZiBTVEVNL0tNTCBmaWxlIHlvdSBtdXN0IHJ1biBTVEVNIGFuZCAKKyAgICAgdXNlIHRoZSBHb29nbGVFYXJ0aCBWaWV3ZXIgdG8gZW5hYmxlIHRoZSBsb2dnaW5nIG9mIEtNTCBmaWxlcyAKKyAgICAgYW5kIHRoZW4gcnVuIGEgc2ltdWxhdGlvbi4gIFRoaXMgd2lsbCBiZSBkb2N1bWVudGVkIGVsc2V3aGVyZS4gIAorICAgICAKKyAgICAgIAorICAtICAgVXNlIHRoZSBmb2xsb3dpbmcgVVJMIHRvIHJ1biB0aGUgYWJvdmUgc2xpZGVzaG93IGVpdGVyIGNvbmN1cnJlbnRseSAKKyAgICAgIG9yIGFmdGVyd2FyZHMuCisgICAgICAgaHR0cDovL2xvY2FsaG9zdDo4MDgwL3NsaWRlc2hvdy5odG1sCisgICAgICAgV2hlbiBwcm9tcHRlZDogc3BlY2lmeSB0aGUgZm9sZGVyIHRoYXQgeW91IGNyZWF0ZWQgYWJvdmUuCisgICAgIAorICAgIC0gQW4gYWx0ZXJuYXRpdmUgaXMgdG8gdXBkYXRlIHRoZSA8cHJvamVjdD5zbGlkZXNob3cua21sIGZpbGUgd2l0aCAgCisgICAgICB0aGUgZm9sZGVyIHRoYXQgeW91IGNyZWF0ZWQgYWJvdmUuCisgICAgICAgaHR0cDovL2xvY2FsaG9zdDo4MDgwL1NsaWRlU2hvdy9zbGlkZXNob3c/Zm9sZGVyPWU6L3RtcC9nZQorICAgIAorICAgICAgYW5kIHRoZW4gbGF1bmNoIHRoZSBzbGlkZXNob3cua21sIGZpbGUgYnkgZG91YmxlY2xpY2tpbmcgCisgICAgICBvbiB0aGUgZmlsZSBpbiBGaWxlRXhwbG9yZXIuCisgIAorICAKKyAgQXQgdGhpcyBwb2ludCwgdGhlIHNsaWRlc2hvdy5rbWwgZmlsZSB3aWxsIGJlIHJlYWQgYnkgR29vZ2xlRWFydGgoR0UpIAorICBhbmQgaXQgd2lsbCB0ZWxsIEdFIHRoYXQgaXQgc2hvdWxkIHJlYWQgS01MIGZpbGVzIGZyb20gdGhlIHNwZWNpZmllZCAKKyAgVVJMIGF0IHRoZSBzcGVjaWZpZWQgaW50ZXJ2YWwuICAKKyAgVGhlIFVSTCB3aWxsIGludm9rZSB0aGUgZG9HZXQoKSBtZXRob2Qgb2YgU2xpZGVTaG93U2VydmxldCB3aGljaCAKKyAgd2lsbCBzZW5kIHRoZSBLTUwgZmlsZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGZvbGRlciBvbmUgYnkgb25lIAorICBiYXNlZCBvbiBhIGNvdW50ZXIga2V5ZWQgYnkgdGhlIGlkPSBwYXJhbWV0ZXIuICAKKyAgCisgIElmIHRoZSAid2FpdCIgb3B0aW9uIGlzIHNwZWNpZmllZCBhcyAieSIgdGhlbiB3aGVuIHRoZSBsYXN0IEtNTCBmaWxlIAorICBpcyByZWFkLCByYXRoZXIgdGhhbiBzdGFydGluZyBvdmVyLCBpdCB3aWxsIHdhaXQgZm9yIG1vcmUgZmlsZXMgdG8gCisgIGFwcGVhciBpbiB0aGUgZm9sZGVyIGFuZCBzaG93IGVhY2ggbmV3IGZpbGUgYXMgaXQgYXBwZWFycy4KKyAgCisgIFRoZSBhYm92ZSBpbnN0cnVjdGlvbiBhc3N1bWUgdGhhdCB5b3UgYXJlIGRvaW5nIGV2ZXJ5dGhpbmcgb24geW91ciBsb2NhbCBzeXN0ZW0uIAorICBPYnZpb3VzbHksIHRoaXMgY291bGQgYWxsIHJ1biBvbiBhbm90aGVyIHN5c3RlbSBieSByZXBsYWNpbmcgdGhlIHVzZSBvZiAKKyAgbG9jYWxob3N0IHdpdGggdGhlIGV4dGVybmFsIHN5c3RlbSBuYW1lLiBIb3dldmVyIHRoZSBmb2xkZXIgY29udGFpbmluZyAKKyAgdGhlIEtNTCBmaWxlcyBtdXN0IGJlIGFjY2Vzc2FibGUgZnJvbSB0aGUgd2Vic2VydmVyIHBlcmhhcHMgdmlhIG5ldHdvcmsKKyAgc2hhcmluZy4gIEhvd2V2ZXIgdGhlcmUgaXMgYSByZXN0cmljdGlvbi4gIFdpdGggWFAsIGEgc3lzdGVtIHNlcnZpY2UgY2Fubm90CisgIG5ldHdvcmsgYXR0YWNoZWQgZmlsZXMgc28geW91IG5lZWQgdG8gcnVuIFRvbWNhdCBhcyBhbiBhcHBsaWNhdGlvbiBhbmQgbm90IAorICBhcyBhIHNlcnZpY2UuCisgICAKK1BsZWFzZSBsZXQgbWUga25vdyBpZiBhbnkgb2YgdGhlIGFib3ZlIGluc3RydWN0aW9ucyBhcmUgd3Jvbmcgb3IgY29uZnVzaW5nIQorCitKb2huIAorCitqdGhvbWFzQHNlYWJyaWdodGJlYWNoLmNvbQorICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9kb2Mvc2xpZGVzaG93LmttbCBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvZG9jL3NsaWRlc2hvdy5rbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwZDk5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvZG9jL3NsaWRlc2hvdy5rbWwKQEAgLTAsMCArMSwxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxrbWwgeG1sbnM9Imh0dHA6Ly9lYXJ0aC5nb29nbGUuY29tL2ttbC8yLjAiPgorPEZvbGRlcj4KKyAgIDxkZXNjcmlwdGlvbj5TbGlkZVNob3cgTmV0d29ya0xpbms8L2Rlc2NyaXB0aW9uPgorICAgPG5hbWU+TmV0d29yayBMaW5rczwvbmFtZT4KKzxOZXR3b3JrTGluaz4KKzxVcmw+Cis8aHJlZj5odHRwOi8vbG9jYWxob3N0OjgwODAvU2xpZGVTaG93L3NsaWRlc2hvdz9pZD1qdGhvbWFzMiZhbXA7Zm9sZGVyPWM6L3RtcC9nZTE8L2hyZWY+Cis8cmVmcmVzaEludGVydmFsPjI8L3JlZnJlc2hJbnRlcnZhbD4KKzxyZWZyZXNoTW9kZT5vbkludGVydmFsPC9yZWZyZXNoTW9kZT4KKzwvVXJsPgorPGZseVRvVmlldz4wPC9mbHlUb1ZpZXc+Cis8L05ldHdvcmtMaW5rPgorPC9Gb2xkZXI+Cis8L2ttbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNGIxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoreG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKK3htbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPGxpbmsgcmVsPUZpbGUtTGlzdAoraHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOkRvY3VtZW50UHJvcGVydGllcz4KKyAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KKyAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgorICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+CisgIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+CisgIDxvOlBhZ2VzPjQ8L286UGFnZXM+CisgIDxvOldvcmRzPjE2MjY8L286V29yZHM+CisgIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgorICAgPG86TGluZXM+Nzc8L286TGluZXM+CisgIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KKyAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+CisgIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+CisgPC9vOkRvY3VtZW50UHJvcGVydGllcz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OldvcmREb2N1bWVudD4KKyAgPHc6VHJhY2tSZXZpc2lvbnMvPgorIDwvdzpXb3JkRG9jdW1lbnQ+Cis8L3htbD48IVtlbmRpZl0tLT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlRhaG9tYTsKKwlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKKwltc28tZm9udC1jaGFyc2V0OjA7CisJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7CisJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7CisJbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KK3AuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bXNvLXN0eWxlLXBhcmVudDoiIjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwCisJe21hcmdpbi1yaWdodDowaW47CisJbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CisJbWFyZ2luLWxlZnQ6MGluOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKKwl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZTo4LjBwdDsKKwlmb250LWZhbWlseTpUYWhvbWE7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorQHBhZ2UgU2VjdGlvbjEKKwl7c2l6ZTo4LjVpbiAxMS4waW47CisJbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47CisJbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKKwltc28tZm9vdGVyLW1hcmdpbjouNWluOworCW1zby1wYXBlci1zb3VyY2U6MDt9CitkaXYuU2VjdGlvbjEKKwl7cGFnZTpTZWN0aW9uMTt9CistLT4KKzwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgorPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCitUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAorUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCitPRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCithZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKK3N1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKK2J5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgoraWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KK3N1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCit3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKK2VudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKK2NsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCitvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucworZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KK3JlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50CithIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KK3N0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5CitkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCitSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAorYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCitjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgorb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKK2J5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCit0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCithbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCitSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCitDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgordGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Citmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQordG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKK2lmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKK3RoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQorRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKK3JpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KK3RoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Cis8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK2l0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAorY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQorYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKK2FuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCitlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAoraW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAorYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCitzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0CitDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCitzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCitpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCitjb2RlIGZvcm06PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQorY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQorY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCitvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQorYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycworYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKK29mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAorbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCitDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKK2Nvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCit0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCitjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKK3RvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK3RvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCithbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQoraW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCit3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcworc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCitvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCitjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKK1dJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKK01FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQorUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcworQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKK2VxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgorVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgorVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKK29yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKK2Z1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgorYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAorb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCitzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCitwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQorY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKK3RoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKK0FncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCitzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAorZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCitTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCitBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKK0FncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKK2l0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9leHRsaWIvc2VydmxldC1hcGkuamFyIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9leHRsaWIvc2VydmxldC1hcGkuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMTg2ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL2V4dGxpYi9zZXJ2bGV0LWFwaS5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9pY29ucy9nZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL2ljb25zL2dlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDFmYTUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9pY29ucy9nZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9ub3RpY2UuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvbm90aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhZjk2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvbm90aWNlLmh0bWwKQEAgLTAsMCArMSw3OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5NYXJjaCAxNywgMjAwNTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisgICAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKKyAgIAorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCisgICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKyAgIAorPHVsPgorCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucworICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPiAgIAorIAorPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisJCQorPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisJPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQorCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisgICAKKzxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyMjc1OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxOSBAQAorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3BsdWdpbk5hbWUgPSBTVEVNIEdvb2dsZSBFYXJ0aCBVSQorcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKKworZ2VQUGFnZSA9IEdvb2dsZSBFYXJ0aAorZ2VBZHZQUGFnZSA9IEFkdmFuY2VkCitnZVVudXNlZFBQYWdlID0gR29vZ2xlRWFydGhJbnRlcmZhY2UKK2dlVmlldyA9IEdvb2dsZUVhcnRoX1ZpZXcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2UvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDc2NzVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Cis8cGx1Z2luPgorCisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgorICAgICAgPHZpZXcKKyAgICAgICAgICAgIG5hbWU9IiVnZVZpZXciCisgICAgICAgICAgICBpY29uPSJpY29ucy9nZS5naWYiCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnZpZXdzLkdFVmlldyIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlIj4KKyAgICAgIDwvdmlldz4KKyAgICAgIAorICAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KKyAgICAgIDxwYWdlCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5WaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5nZS52aWV3cy5HRVByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uudmlld3MuR0VQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIG5hbWU9IiVnZVBQYWdlIi8+CisgICAgICA8cGFnZQorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uudmlld3MuR0VQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnZpZXdzLkdFQWR2YW5jZWRQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnZpZXdzLkdFQWR2YW5jZWRQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIG5hbWU9IiVnZUFkdlBQYWdlIi8+CisgICA8L2V4dGVuc2lvbj4KKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgorICAgICAgPGluaXRpYWxpemVyIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnZpZXdzLlByZWZlcmVuY2VJbml0aWFsaXplciIvPgorICAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5nZSIKKyAgICAgICAgIG5hbWU9IiVnZVVudXNlZFBQYWdlIgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+CisgICA8L2V4dGVuc2lvbj4KKyAgIAorCis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc2VydmxldC54bWwgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NlcnZsZXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMDY5MjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NlcnZsZXQueG1sCkBAIC0wLDAgKzEsNzYgQEAKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKzwhLS0gQW50IGJ1aWxkIHNjcmlwdCB0byBidWlsZCB0aGUgR0Ugc2VydmxldCB3YXIgZmlsZSAgICAgICAtLT4KKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKzxwcm9qZWN0IG5hbWU9IlNURU0iIGRlZmF1bHQ9IndhciIgPgorCisJCisJPCEtLSBDb25maWd1cmUgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSB3ZWIgYXBwbGljYXRpb24gaXMgYnVpbHQgLS0+CisJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgICAgdmFsdWU9IiR7YmFzZWRpcn0iLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Indhci5uYW1lIiAgICB2YWx1ZT0iU1RFTSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGliLnNlcnZsZXQiICAgIHZhbHVlPSJleHRsaWIvc2VydmxldC1hcGkuamFyIi8+CisJPCEtLSBHZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyAtLT4KKwkJPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiIC8+CisKKwkJPHByb3BlcnR5IG5hbWU9ImNhdGFsaW5hIiB2YWx1ZT0iJHtlbnYuQ0FUQUxJTkFfSE9NRX0iIC8+CisKKworIAkKKwk8IS0tIEV4ZWN1dGFibGUgVGFyZ2V0cyAtLT4KKwkJCisJPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249InJlbW92ZXMgcHJldmlvdXMgYnVpbGQiPgkJCisJCTxkZWxldGUgZGlyPSIke2Jhc2VkaXJ9L1dFQi1JTkYvY2xhc3Nlcy8qKi8qIiAvPgkKKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iaW5pdCIgZGVzY3JpcHRpb249Im1ha2VzIGJ1aWxkIHN0cnVjdHVyZSIgPgkJCisJCTxta2RpciBkaXI9IiR7YmFzZWRpcn0vV0VCLUlORi9jbGFzc2VzIiAvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJjbGVhbixpbml0IiBkZXNjcmlwdGlvbj0iQ29tcGlsZSB3ZWIgYXBwbGljYXRpb24iPgorCQk8IS0tIC4uLiAKKwkJCWNvbXBpbGUgdGhlIHNlcnZsZXRzIGludG8gV0VCLUlORi9jbGFzc2VzCisJCQkgICAgICAgICAgICAuLi4gLS0+CisJCQorCQk8amF2YWMgZGVidWc9Im9uIiBzcmNkaXI9InNyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlIiAKKwkJCWluY2x1ZGVzPSJzZXJ2bGV0LyouamF2YSIKKwkJCWV4Y2x1ZGVzPSJzZXJ2bGV0L1ZlcmlmeUNsaWVudC5qYXZhIgorCQkJZGVzdGRpcj0iJHtidWlsZC5kaXJ9L1dFQi1JTkYvY2xhc3NlcyIgPgorCQkJPGNsYXNzcGF0aCByZWZpZD0iY2xhc3NwYXRoIiAvPgkJCSAgCSAgICAgCisJCTwvamF2YWM+CisJCQorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0iaHRtbCIgZGVzY3JpcHRpb249IkNvcHkgc3RhcnQuaHRtbCB0byBzZXJ2ZXIiPgkJCisJCTxjb3B5IHRvZGlyPSIke2NhdGFsaW5hfS93ZWJhcHBzL1NURU0vIiBvdmVyd3JpdGU9InRydWUiPgorCQkJCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vV0VCLUlORi8iPgorCQkJCQkJPGluY2x1ZGUgbmFtZT0iKi5odG1sIiAvPgorCQkJCQk8L2ZpbGVzZXQ+CisJCTwvY29weT4KKwk8L3RhcmdldD4KKwkKKwkKKwkKKwk8IS0tIAorCQkqIEJ1aWxkIHRoZSB3YXIgZmlsZSAgU1RFTS53YXIKKwkJKiAgIGNvbnRhaW5zCisJCSogICAgIAorCQkqICAgICBXRUItSU5GLworCQkqICAgICAgIHdlYi54bWwJCSogICAgICAgCisJCSogICAgICAgL2NsYXNzZXMvLi4uIAorCQkqICAgICAgIGxpYi9zZXJ2bGV0LWFwaS5qYXIKKwkJKiAKKwkJLS0+CisJPHRhcmdldCBuYW1lPSJ3YXIiIGRlcGVuZHM9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJjcmVhdGVzIHRoZSB3YXIgZmlsZSI+CisKKwkJPHBhdGggaWQ9ImNsYXNzcGF0aCI+CisJCQk8cGF0aCBsb2NhdGlvbj0iJHtsaWIuc2VydmxldH0iIC8+CisJCTwvcGF0aD4KKworCQkJCQorCQk8d2FyIGRlc3RmaWxlPSIke2Jhc2VkaXJ9L1dFQi1JTkYvJHt3YXIubmFtZX0ud2FyIiB3ZWJ4bWw9IiR7YmFzZWRpcn0vV0VCLUlORi93ZWIueG1sIj4KKwkJCTxjbGFzc2VzIGRpcj0iJHtiYXNlZGlyfS9XRUItSU5GL2NsYXNzZXMiICAvPiAgICAgICAgICAgCisJCQk8bGliIGRpcj0iJHtiYXNlZGlyfS9leHRsaWIvIiBpbmNsdWRlcz0ic2VydmxldC1hcGkuamFyIiAvPgorCQk8L3dhcj4KKwk8L3RhcmdldD4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL0FjdGl2YXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjhkYmJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9BY3RpdmF0b3IuamF2YQpAQCAtMCwwICsxLDExMSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCisvKioKKyAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQorICovCitwdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7CisKKwkvKioKKwkgKiBUaGUgcGx1Zy1pbiBJRAorCSAqLyAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS5nZSI7CisKKwkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCisJcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsKKwkKKwkvKioKKwkgKiBUaGUgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgQWN0aXZhdG9yKCkgeworCQlwbHVnaW4gPSB0aGlzOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc3RhcnQoY29udGV4dCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcGx1Z2luID0gbnVsbDsKKwkJc3VwZXIuc3RvcChjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKKwkgKgorCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KKwkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGgKKwkgKgorCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCisJICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgeworCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIHBhdGgpOworCX0KKwkKKwkvKioKKwkgKiBMb2cgYW4gZXJyb3IgdG8gdGhlIElMb2cgZm9yIHRoaXMgcGx1Z2luCisJICogCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiAgICAgICAgICAgIHRoZSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB0ZXh0CisJICogQHBhcmFtIGV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgdGhlIGFzc29jaWF0ZWQgZXhjZXB0aW9uLCBvciBudWxsCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisJCWlmIChwbHVnaW4gIT0gbnVsbCkgeworCQkJcGx1Z2luLmdldExvZygpLmxvZygKKwkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKKwkJCQkJCTAsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOworCSAgICB9CisJfSAvLyBsb2dFcnJvcgorCisJLyoqCisJICogTG9nIGluZm9ybWF0aW9uIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIGluZm9ybWF0aW9uIG1lc3NhZ2UgdGV4dAorCSAqIEBwYXJhbSBleGNlcHRpb24KKwkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dJbmZvKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisJCWlmIChwbHVnaW4gIT0gbnVsbCkgeworCQlwbHVnaW4uZ2V0TG9nKCkubG9nKAorCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCisJCQkJCQkwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKKwkJfQorCX0gLy8gbG9nSW5mb3JtYXRpb24KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9Bc3BlY3QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2UvQXNwZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIzOGFmOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2UvQXNwZWN0LmphdmEKQEAgLTAsMCArMSw2MzYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5nZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKKy8qKgorICogQXNwZWN0IAorICogCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIEFzcGVjdHMgb2YgYSBkaXNlYXNlIHRoYXQgCisgKiB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4gIFRoZSBjb21tb24gb25lcyBhcmU6IFMsIEUgSSxhbmQgUiBmb3IgCisgKiBTdXNjZXB0aWJsZSwgRXhwb3NlZCwgSW5mZWN0aW91cywgYW5kIFJlY292ZXJhYmxlLiAgSG93ZXZlciAKKyAqIHRoZXJlIGNvdWxkIGJlIG90aGVycyBvciBzb21lIGRpc2Vhc2VzIG1heSBoYXZlIGxlc3MuCisgKiAKKyAqIFRoZSB2YWxpZCBBc3BlY3RzIGFyZSBkZXNjcmliZWQgYnkgYSBwcm9wZXJ0eSBmaWxlLiAgCisgKiBUaGUgZGVmYXVsdCBpcyBhc3BlY3RzLnByb3BlcnRpZXMgd2hpY2ggd291bGQgYmUgZm91bmQgaW4gdGhlIAorICogb3JnLmVjbGlwc2Uuc3RlbS51aS5nZSBwYWNrYWdlLiBUaGUgZGVmYXVsdCBpZiBubyBwcm9wZXJ0aWVzCisgKiBmaWxlIGlzIGZvdW5kIGlzIFMsRSxJLFIgd2l0aCBkZWZhdWx0IHZhbHVlcyBmb3IgZWFjaCBhc3BlY3QuCisgKiAKKyAqIEVhY2ggdmFsaWQgQXNwZWN0IGlzIGRlc2NyaWJlZCBieSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFuZCAKKyAqIHRoZSBzZXQgb2YgQXNwZWN0cyBhcmUgc3RvcmVkIGluIGEgSGFzaE1hcCB0aGF0IGNhbiBiZSBhY2Nlc3NlZCAKKyAqIGFzIGEgc3RhdGljIHZhbHVlIGZvciBBc3BlY3QuIAorICogPHByZT4KKyAqIEVhY2ggQXNwZWN0IGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisgKgorICogICAgY29kZSAgICAgLSB0aGUgU3RyaW5nIGNvZGUgYnkgd2hpY2ggaXQgaXMgYWNjZXNzZWQgKGUuZyAiUyIpCisgKiAgICBuYW1lICAgICAtIFRoZSBTdHJpbmcgdGhhdCB0aGUgdXNlciB3b3VsZCB1bmRlcnN0YW5kCisgKiAgICAgICAgICAgICAgIChlLmcgIlN1c2NlcHRpcGxlIgorICogICAgZGVzY3JpcHRpb24gLSBUaGUgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgYXNwZWN0LgorICogICAgcmFuZ2UgICAgLSBBIGxpc3Qgb2YgZG91YmxlIHZhbHVlcyB0aGF0IGRlc2NyaWJlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICAgb2YgdmFsdWVzIHRoYXQgdGhlIGFzcGVjdCBtaWdodCBoYXZlLiAKKyAqICAgICAgICAgICAgICAgRm9yIGEgcmVsYXRpdmUgYXNwZWN0LCB0aGVzZSB3b3VsZCByYW5nZSBmcm9tIDAuMCB0byAxLjAKKyAqICAgICAgICAgICAgICAgKGUuZyAgMC4xLCAwLjMzLCAwLjY2LCAwLjkpCisgKiAgICByZWQgICAgICAgIFRoZSB2YWx1ZSAoMCB0byAyNTUpIGZvciB0aGUgY29sb3IgIlJlZCIgaWYgdGhlIHZhbHVlIAorICogICAgICAgICAgICAgICBpcyBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiAKKyAqICAgICAgICAgICAgICAgKGUuZyAgMCwyNTUsMjU1LDI1NSB3b3VsZCBjYXVzZSBhbiBhc3BlY3Qgd2l0aCBhIHZhbHVlIG9mIDAKKyAqICAgICAgICAgICAgICAgdG8gaGF2ZSByZWQ9MDsgd2l0aCBhIHZhbHVlIGdyZWF0ZXIgdGhhbiAwIHRoZW4gcmVkPTI1NQorICogICAgICAgICAgICAgICBBc3N1bWluZyB0aGUgZ3JlZW4gYW5kIGJsdWUgdmFsdWVzIHdlcmUgMCwwLDAsMCB0aGVuIHRoZQorICogICAgICAgICAgICAgICBhc3BlY3Qgd291bGQgYmUgc2hvd24gYXMgcmVkLiBFcXVhbCB2YWx1ZXMgZm9yIHJlZCBhbmQgZ3JlZW4KKyAqICAgICAgICAgICAgICAgd291bGQgcmVzdWx0IGluIHllbGxvdyBldGMuIAorICogICAgZ3JlZW4gICAgICBTYW1lIGFzIGFib3ZlIGJ1dCBmb3IgdGhlIGNvbG9yIGdyZWVuLgorICogICAgYmx1ZSAgICAgICBTYW1lIGFzIGFib3ZlIGJ1dCBmb3IgdGhlIGNvbG9yIGJsdWUuCisgKiAgICBvcGFjaXR5ICAgIFRoZSB2YWx1ZSAoMCB0byAyNTUpIHRoYXQgZGVzY3JpcGVzIHRoZSB0cmFucGFyZW5jeSAKKyAqICAgICAJCQkgdXNlZCBieSBHb29nbGVFYXJ0aCB3aGVuIGRyYXdpbmcgYSBwb2x5Z29uIHRvIAorICogICAgICAgICAgICAgICByZXByZXNlbnQgdGhlIHZhbHVlIG9mIHRoZSBhc3BlY3QuICAKKyAqICAgICAgICAgICAgICAgKGUuZyAwLDEyOCwxNjAsMTkyIHdpdGggdGhlIHJhbmdlIGFib3ZlIHdvdWxkIGNhdXNlIGFuIGFyZWEKKyAqICAgICAgICAgICAgICAgIHdpdGggYSBhc3BlY3QgdmFsdWUgb2YgMCB0byAwLjEgdG8gbm90IGJlIGZpbGxlZCBpbiBhdCBhbGwsIAorICogICAgICAgICAgICAgICAgd2l0aCBhIHZhbHVlIGxlc3Mgb3IgZXF1YWwgdG8gMC4zMyB0byBoYXZlIGFuIG9wYWNpdHkKKyAqICAgICAgICAgICAgICAgIG9mIDEyOCBhbmQgdmFsdWVzIGdyZWF0ZXIgdGhhdG4gMC45IGFuIG9wYWNpdHkgb2YgMTkyKSAKKyAqIAorICogPC9wcmU+CisgKi8KK3B1YmxpYyBjbGFzcyBBc3BlY3QgeworICAgIC8qKgorICAgICAqIEFzcGVjdCBjb2RlIAorICAgICAqICAgRXhhbXBsZSAiRSIKKyAgICAgKi8KKwlwcml2YXRlIFN0cmluZyBjb2RlID0gbnVsbDsKKwkKKwkvKioKKwkgKiBBc3BlY3QgTmFtZQorCSAqICAgRXhhbXBsZSAiRXhwb3NlZCIKKwkgKiAgIAorCSAqICAgCisJICovCisJcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisJCisJCisJLyoqCisJICogRGVzY3JpcHRpb24gb2YgdGhlIHZhbHVlLiAgCisJICogCisJICovCisJLy8gVE9ETyAgaG93IGRvIHdlIG1ha2UgdGhpcyB0cmFuc2xhdGFibGU/CisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOworCS8qKgorCSAqIGZpbGVuYW1lIGZvciBwcm9wZXJ0aWVzIGZpbGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX05BTUUgPSAiYXNwZWN0LnByb3BlcnRpZXMiOworCS8qKiBkZWZhdWx0IHJhbmdlICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGVbXSBERUZBVUxUX1JBTkdFID0gezAuMCwgMC4zMywgMC42NiwgMS4wfTsKKwkvKiogZGVmYXVsdCBvcGFjaXR5ICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBERUZBVUxUX09QQUNJVFkgPSB7MCwxMjgsMTYwLDE5Mn07CisJCisJLyoqCisJICogcmFuZ2Ugb2YgdmFsdWVzIHRoYXQgd2lsbCBiZSBzaG93bi4gIAorCSAqIFRoaXMgcmFuZ2Ugd2lsbCBiZSB1c2VkIHRvIHNlbGVjdCB0aGUgdmFsdWUKKwkgKiBvZiBvcGFjaXR5LHJlZCxncmVlbiBhbmQgYmx1ZSBpbiB0aGUgZGlzcGxheS4KKwkgKiBGb3IgRXhhbXBsZSwgaWYgdGhlIEV4cG9zZWQgcmVsYXRpdmUgdmFsdWUgaXMgMC41IHRoZW4gCisJICogdGhpcyBpcyB0aGUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSAzcmQgZW50cnkgaW4gcmFuZ2UgKDAuNjYpIAorCSAqIHNvIHRoZSAzcmQgZW50cnkgaW4gdGhlIGxpc3Qgb2YgT3BhY2l0eSgxNjApIHdpbGwgYmUgdXNlZCBhbmQgCisJICogdGhlIDNyZCBlbnRyeSBpbiB0aGUgIHJlZCxncmVlbiBhbmQgYmx1ZSBsaXN0cyB3b3VsZCBiZSB1c2VkLgorCSAqIAorCSAqLworCXByaXZhdGUgZG91YmxlW10gcmFuZ2UgPSBERUZBVUxUX1JBTkdFOworCQorCQorCXByaXZhdGUgaW50W10gb3BhY2l0eSA9IERFRkFVTFRfT1BBQ0lUWTsKKwkvKioKKwkgKiBUaGUgYXJyYXkgb2YgY29sb3IgZW50cmllcy4gIAorCSAqIEZvciBleGFtcGxlLCB0aGUgYXNwZWN0IEV4cG9zZWQgaXMgZGlzcGxheWVkIGFzIHllbGxvdy4KKwkgKiBzbyB0aGUgYmx1ZSBhcnJheSBpcyBhbGwgMCBhbmQgdGhlIHJlZCBhbmQgZ3JlZW4gYXJyYXlzCisJICogYXJlIGFsbCAyNTUuICBCdXQgdGhpcyBjb3VsZCBiZSBvdGhlcndpc2Ugc3BlY2lmaWVkIGluIAorCSAqIHRoZSBwcm9wZXJ0aWVzIGZpbGUuICAgIAorCSAqICAgCisJICovCisJcHJpdmF0ZSBpbnRbXSByZWQgPSBudWxsIDsKKwlwcml2YXRlIGludFtdIGdyZWVuID0gbnVsbDsKKwlwcml2YXRlIGludFtdIGJsdWUgPSBudWxsOworCS8qKgorCSAqIHJlbGF0aXZlIG9yIGFic29sdXRlCisJICovCisJcHJpdmF0ZSBTdHJpbmcgdHlwZSA9ICJyZWxhdGl2ZSI7CisJCisJLyoqCisJICogSWYgc3BlY2lmaWVkIGNvdWxkIGJlIHNvbWV0aGluZyBsaWtlICJwb3B1bGF0aW9uL3NxIGttIgorCSAqIEN1cnJlbnRseSBub3QgdXNlZC4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyB1bml0ID0gbnVsbDsKKwkKKwkvKioKKwkgKiBNYXAgb2YgQXNwZWN0cyB0aGF0IGFyZSB1c2VkIAorCSAqIAorCSAqIFRoZSBLZXkgaXMgYSBTdHJpbmcgY2RvZGUgdmFsdWUgKGxpa2UgIlMiKSAKKwkgKiBUaGUgZW50cmllcyBhcmUgQXNwZWN0IGluc3RhbmNlcy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLEFzcGVjdD4gbWFwID0gbnVsbDsKKwkvKioKKwkgKiBkZWZhdWx0IEFzcGVjdCB0byBiZSBkaXNwbGF5ZWQgCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRBc3BlY3QgPSAiIjsKKwkvKioKKwkgKiBDbGFzcyB0aGF0IGlzIGNhbGxlZCB0byBnZW5lcmF0ZSB0aGUgS01MIGZpbGUgCisJICogdG8gZGlzcGxheSB0aGUgYXNwZWN0cy4gIAorCSAqIFNlZSBJS01MRGlzcGxheS5qYXZhIGZvciByZXF1aXJlbWVudHMgb2YgdGhlIGNsYXNzLgorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBrbWxEaXNwbGF5Q2xhc3MgPSAKKwkJIm9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uua21sLkttbERpc3BsYXkiOworCQorCS8qKgorCSAqIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydGllcyBpbnN0YW5jZSB1c2VkIAorCSAqIHRvIGRldGVybWluZSB0aGUgQXNwZWN0cyB1c2VkIGluIHRoaXMgaW1wbGVtZW50YXRpb24KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcyAoKTsKKwkvKioKKwkgKiBJbml0aWFsaXphdGlvbiBjb2RlLgorCSAqIEl0IHJlYWRzIHRoZSBwcm9wZXJ0eSBmaWxlIGFuZCBjcmVhdGVzIHRoZSBBc3BlY3RzIAorCSAqIGFuZCB0aGVuIHN0b3JlcyBlYWNoIG9uZSBpbiBhIGhhc2htYXAuCisJICogCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgeworCQkKKwkJCisJCXRyeSB7CisJCQlJbnB1dFN0cmVhbSBpbiA9IEFzcGVjdC5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtIChQUk9QRVJUSUVTX05BTUUpOworCQkJIGlmIChpbiAhPSBudWxsKSB7CQkJCQorCQkJCSBwcm9wZXJ0aWVzLmxvYWQgKGluKTsgLy8gQ2FuIHRocm93IElPRXhjZXB0aW9uCisJCQkJIEFzcGVjdC5tYXAgPSBudWxsOworCQkJCSBnZXRBc3BlY3RzKHByb3BlcnRpZXMpOworCQkJIH0gZWxzZSB7CisJCQkJIEdFTG9nLmVycm9yKCJGYWlsZWQgcmVhZGluZyBBc3BlY3QgcHJvcGVydGllcy4gIisKKwkJCQkJCSBQUk9QRVJUSUVTX05BTUUgLCBudWxsKTsKKwkJCQkvLyB1c2UgdGhlIG1hcCB0aGF0IHRoYXQgd2FzIGNvbnN0cnVjdGVkIAorCQkJCSAvLyBkdXJpbmcgY2xhc3MgaW5pdGlhbGl6YXRpb24KKwkJCQkgaWYgKEFzcGVjdC5tYXAgPT0gbnVsbCkgeworCQkJCQkJbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLEFzcGVjdD4oNSk7CQorCQkJCX0KKwkJCQkKKwkJCSB9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKwkvKioKKwkgKiBSZWFkIHRoZSBQcm9wZXJ0aWVzIGZyb20gdGhlIFByb3BlcnRpZXMgaW5zdGFuY2UgdGhhdAorCSAqIHdhcyByZWFkIGZyb20gdGhlIGFzcGVjdC5wcm9wZXJ0aWVzIGZpbGUgYW5kIGNyZWF0ZSBhCisJICogIE1hcCBvZiBBc3BlY3RzLgorCSAqIAorCSAqIEBwYXJhbSBwcm9wZXJ0aWVzICBjb2xsZXRpb24gb2YgcHJvcGVydGllcworCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0QXNwZWN0cyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKKwkJU3RyaW5nIGxpc3QgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJBc3BlY3RzIiwiUyxFLEksUiIpOworCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaXN0LCIsIik7CisJCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7CisJCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7CisJCQlpZiAoZGVmYXVsdEFzcGVjdCA9PSBudWxsIHx8IGRlZmF1bHRBc3BlY3QubGVuZ3RoKCk9PTApIHsKKwkJCQkvLyBtYWtlIDFzdCBBc3BlY3QgdGhlIGRlZmF1bHQgZGVmYXVsdAorCQkJCWRlZmF1bHRBc3BlY3QgPSB0b2tlbjsKKwkJCX0KKwkJCVN0cmluZyBuYW1lID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eSh0b2tlbisiLm5hbWUiLG51bGwpOworCQkJQXNwZWN0IGFzcGVjdCA9IG5ldyBBc3BlY3QodG9rZW4sbmFtZSk7CisJCQkKKwkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IAorCQkJCXByb3BlcnRpZXMuZ2V0UHJvcGVydHkodG9rZW4rIi5kZXNjcmlwdGlvbiIsbnVsbCk7CQkJCisJCQlhc3BlY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOworCQkJU3RyaW5nIHJhbmdlID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eSh0b2tlbisiLnJhbmdlIixudWxsKTsKKwkJCWFzcGVjdC5zZXRSYW5nZShyYW5nZSk7CisJCQlTdHJpbmcgb3BhY2l0eSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkodG9rZW4rIi5vcGFjaXR5IixudWxsKTsKKwkJCWFzcGVjdC5zZXRPcGFjaXR5KG9wYWNpdHkpOworCQkJU3RyaW5nIGNvbG9yID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eSh0b2tlbisiLnJlZCIsIjAiKTsKKwkJCWFzcGVjdC5zZXRSZWQoY29sb3IpOworCQkJY29sb3IgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KHRva2VuKyIuZ3JlZW4iLCIwIik7CisJCQlhc3BlY3Quc2V0R3JlZW4oY29sb3IpOworCQkJY29sb3IgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KHRva2VuKyIuYmx1ZSIsIjAiKTsKKwkJCWFzcGVjdC5zZXRCbHVlKGNvbG9yKTsKKy8vCQkJR0VMb2cuZGVidWcoQXNwZWN0LmNsYXNzLHRva2VuKyI6IisKKy8vCQkJCQkiICIrYXNwZWN0LmdldENvZGUoKSsiICIrYXNwZWN0LmdldE5hbWUoKSsKKy8vCQkJCQkiICIrYXNwZWN0LmdldFJhbmdlKCkrIiAiK2FzcGVjdC5nZXRPcGFjaXR5KCkpOworCQl9CisJCWRlZmF1bHRBc3BlY3QgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJEZWZhdWx0IixkZWZhdWx0QXNwZWN0KTsKKwkJa21sRGlzcGxheUNsYXNzID0gCisJCQlwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJrbWxEaXNwbGF5IixrbWxEaXNwbGF5Q2xhc3MpOworCX0KKwkvKioKKwkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgQXNwZWN0IGFuZCBwbGFjZSBpdCBpbnRvIHRoZSBIYXNobWFwLgorCSAqIAorCSAqIEBwYXJhbSBjb2RlCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gaWQgCisJICovCisJcHVibGljIEFzcGVjdChTdHJpbmcgY29kZSwgU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5jb2RlID0gY29kZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsJCQorCQkvLyBzZXQgc29tZSBkZWZhdWx0cworCQlpZiAocmVkID09IG51bGwpCisJCQlzZXRSZWQoIjAiKTsKKwkJaWYgKGdyZWVuID09IG51bGwpCisJCQlzZXRHcmVlbigiMCIpOworCQlpZiAoYmx1ZSA9PSBudWxsKQorCQkJc2V0Qmx1ZSgiMCIpOworCQlpZiAoQXNwZWN0Lm1hcCA9PSBudWxsKSB7CisJCQltYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsQXNwZWN0Pig1KTsJCisJCX0KKwkJQXNwZWN0Lm1hcC5wdXQoY29kZSx0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgdGhhdCB0aGlzIGluc3RhbmNlIG9mIEFzcGVjdCBtYWtlcyBnb29kIHNlbnNlCisJICogYW5kIGZvbGxvd3MgYWxsIG9mIHRoZSBydWxlcy4gCisJICogCisJICogQHJldHVybiB0cnVlIGlmIG5vIHByb2JsZW1zIGZvdW5kCisJICogICAgICAgICBmYWxzZSBpZiBub3QgIAorCSAqICAgICAgICAgCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTYW5lKCkgeworCQkKKwkJdHJ5IHsKKwkJCUFzc2VydC5pc05vdE51bGwocmFuZ2UpOworCQkJaW50IG4gPSByYW5nZS5sZW5ndGg7CisJCQlBc3NlcnQuaXNUcnVlKG9wYWNpdHkubGVuZ3RoID09IG4sIkludmFsaWQgT3BhY2l0eSBkaW1lbnNpb24iKTsKKwkJCUFzc2VydC5pc1RydWUocmVkLmxlbmd0aCA9PSBuLCJJbnZhbGlkIENvbG9yIFJlZCBkaW1lbnNpb24iKTsKKwkJCUFzc2VydC5pc1RydWUoZ3JlZW4ubGVuZ3RoID09IG4sIkludmFsaWQgQ29sb3IgQmx1ZSBkaW1lbnNpb24iKTsKKwkJCUFzc2VydC5pc1RydWUoYmx1ZS5sZW5ndGggPT0gbiwiSW52YWxpZCBDb2xvciBHcmVlbiBkaW1lbnNpb24iKTsKKwkJCQorCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsJCQkKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCS8qKgorCSAqIFJldHVybiB0aGUgQXNwZWN0IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKKwkgKiBjb2RlLiAgUmV1cm4gZGVmYXVsdEFzcGVjdCBpZiB1bmtub3duLgorCSAqIAorCSAqIEBwYXJhbSBjb2RlCisJICogQHJldHVybiBzcGVjaWZpZWQgYXNwZWN0CisJICovCisJcHVibGljIHN0YXRpYyBBc3BlY3QgZ2V0QXNwZWN0KFN0cmluZyBjb2RlKSB7CisJCUFzcGVjdCBhc3BlY3QgPSBudWxsOworCQlpZiAobWFwID09IG51bGwpIHsKKwkJCXNldHVwKCk7CisJCX0KKwkJaWYgKG1hcCAhPSBudWxsKSB7CisJCQlhc3BlY3QgPSBtYXAuZ2V0KGNvZGUpOworCQkJaWYgKGFzcGVjdCA9PSBudWxsKSB7CisJCQkJYXNwZWN0ID0gbWFwLmdldChkZWZhdWx0QXNwZWN0KTsKKwkJCX0KKwkJfSBlbHNlIHsJCQkKKwkJCUdFTG9nLmVycm9yKCJJbnZhbGlkIGNvbmRpdGlvbi4gQXNwZWN0IG1hcCBpcyBudWxsIixudWxsKTsKKwkJfQorCQlyZXR1cm4gYXNwZWN0OworCX0KKwkvKioKKwkgKiBUZXN0IGlmIHNwZWNpZmllZCBhc3BlY3QgY29kZSBpcyBpbiB0aGUgbWFwIG9mIGFzcGVjdHMuCisJICoKKwkgKiAKKwkgKiBAcGFyYW0gYXNwZWN0Q29kZSAgCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgYXNwZWN0IGNvZGUgaXMgaW4gdGhlIG1hcAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGlzdHMoU3RyaW5nIGFzcGVjdENvZGUpIHsKKwkJcmV0dXJuIG1hcC5jb250YWluc0tleShhc3BlY3RDb2RlKTsKKwl9CisJLyoqCisJICogQHJldHVybiB0aGUgbWFwCisJICovCisJcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBBc3BlY3Q+IGdldE1hcCgpIHsKKwkJcmV0dXJuIG1hcDsKKwl9CisJLyoqCisJICogQHBhcmFtIG1hcCB0aGUgbWFwIHRvIHNldAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNYXAoTWFwPFN0cmluZywgQXNwZWN0PiBtYXApIHsKKwkJQXNwZWN0Lm1hcCA9IG1hcDsKKwl9CisKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjb2RlCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb2RlKCkgeworCQlyZXR1cm4gY29kZTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbmV3Y29kZSB0aGUgY29kZSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb2RlKFN0cmluZyBuZXdjb2RlKSB7CisJCW1hcC5yZW1vdmUodGhpcy5jb2RlKTsKKwkJdGhpcy5jb2RlID0gbmV3Y29kZTsKKwkJbWFwLnB1dChuZXdjb2RlLCB0aGlzKTsKKwl9CisKKwkKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG5hbWUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBjb2RlIHRoYXQgdGhpcyBBc3BlY3QgcmVwcmVzZW50cy4KKwkgKiAgIEZvciBFeGFtcGxlICJFIiBmb3IgRXhwb3NlZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gY29kZTsKKwl9CisKKwkKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uCisJICovCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIAorCQkJcmV0dXJuIG5hbWU7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24gdGhlIGRlc2NyaXB0aW9uIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgcmFuZ2UKKwkgKi8KKwlwdWJsaWMgZG91YmxlW10gZ2V0UmFuZ2UoKSB7CisJCXJldHVybiByYW5nZTsKKwl9CisJLyoqCisJICogR2V0IGEgc3BlY2lmaWMgZW50cnkgaW4gdGhlIGFycmF5IG9mIHJhbmdlIHZhbHVlcworCSAqIEBwYXJhbSBuICBlbnRyeSB3aXRoaW4gdGhlIGFycmF5IAorCSAqIEByZXR1cm4gdGhlIHJhbmdlIGVudHJ5IGluIGxpc3QKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFJhbmdlKGludCBuKSB7CisJCXJldHVybiByYW5nZVtuXTsKKwl9CisJLyoqCisJICogU2V0IHRoZSByYW5nZSBvZiB2YWx1ZXMgdXNlZCB0byBkaXNwbGF5IHZhbHVlLgorCSAqIEl0IGlzIGdpdmVuIGFzIGEgU3RyaW5nIG9mICwgc2VwYXJhdGVkIHZhbHVlcworCSAqIGFuZCBjb252ZXJ0ZWQgdG8gYW4gYXJyYXkgb2YgZG91YmxlcworCSAqIAorCSAqIEBwYXJhbSByYW5nZSB0aGUgcmFuZ2UgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0UmFuZ2UoU3RyaW5nIHJhbmdlKSB7CisJCWlmIChyYW5nZSA9PSBudWxsKSB7CisJCQl0aGlzLnJhbmdlID0gREVGQVVMVF9SQU5HRTsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihyYW5nZSwiLCIpOworCQkKKwkJaW50IG4gPSB0b2tlbnMuY291bnRUb2tlbnMoKTsKKwkJdGhpcy5yYW5nZSA9IG5ldyBkb3VibGVbbl07CisJCWZvciAoaW50IGk9MDsgaTxuOyBpKyspIHsKKwkJCWRvdWJsZSB2YWx1ZSA9IERvdWJsZS5wYXJzZURvdWJsZSh0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpKTsKKwkJCXRoaXMucmFuZ2VbaV0gPSB2YWx1ZTsKKwkJCQorCQl9CisJCQorCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBvcGFjaXR5IGFycmF5CisJICovCisJcHVibGljIGludFtdIGdldE9wYWNpdHkoKSB7CisJCXJldHVybiBvcGFjaXR5OworCX0KKwkvKioKKwkgKiBAcGFyYW0gbiBlbnRyeSB0aGUgbGlzdCB0byBnZXQKKwkgKiBAcmV0dXJuIHRoZSBvcGFjaXR5CisJICovCisJcHVibGljIGludCBnZXRPcGFjaXR5KGludCBuKSB7CisJCXJldHVybiBvcGFjaXR5W25dOworCX0KKwkvKioKKwkgKiBTZXQgdGhlIE9wYWNpdHkgb2YgdGhlIGRpc3BsYXllZCBwb2x5Z29ucworCSAqIGJhc2VkIG9uIHRoZSByYW5nZSBvZiB2YWx1ZXMuICAKKwkgKiBJdCBpcyBnaXZlbiBhcyBhIFN0cmluZyBhbmQgY29udmVydGVkIHRvIAorCSAqIGFuIGFycmF5IG9mIGludHMgdGhhdCBpcyB0aGUgc2FtZSBzaXplIGFzIAorCSAqIHJhbmdlLiAgSWYgTGVzcyB2YWx1ZXMgc3BlY2lmaWVkLCB0aGVuIGxhc3QgCisJICogdmFsdWUgd2lsbCBiZSByZXBlYXRlZC4KKwkgKiBAcGFyYW0gb3BhY2l0eSBjb21tYSBzZXBhcmF0ZWQgbGlzdAorCSAqLworCXB1YmxpYyB2b2lkIHNldE9wYWNpdHkoU3RyaW5nIG9wYWNpdHkpIHsKKwkJaW50IG4gPSBnZXRSYW5nZSgpLmxlbmd0aDsKKwkJdGhpcy5vcGFjaXR5ID0gbmV3IGludFtuXTsKKwkJaWYgKG9wYWNpdHkgPT0gbnVsbCkgewkKKwkJCXRoaXMub3BhY2l0eVswXSA9IDA7CisJCQlmb3IgKGludCBpPTE7aTxuO2krKykgeworCQkJCXRoaXMub3BhY2l0eVtpXSA9IERFRkFVTFRfT1BBQ0lUWVtpXTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfSAKKwkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIob3BhY2l0eSwiLCIpOwkJCisJCQorCQlpbnQgdmFsdWUgPSAwOworCQlmb3IgKGludCBpPTA7IGk8bjsgaSsrKSB7CisJCQlpZiAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworCQkJICB2YWx1ZSA9IEludGVnZXIucGFyc2VJbnQodG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKSk7CisJCQl9CisJCQl0aGlzLm9wYWNpdHlbaV0gPSB2YWx1ZTsJCQkKKwkJfQorCQkKKwl9CisKKworCS8qKgorCSAqIFNldCB0aGUgQ29sb3Igb2YgdGhlIGRpc3BsYXllZCBwb2x5Z29ucworCSAqIGJhc2VkIG9uIHRoZSByYW5nZSBvZiB2YWx1ZXMuICAKKwkgKiBJdCBpcyBnaXZlbiBhcyBhIFN0cmluZyBhbmQgY29udmVydGVkIHRvIAorCSAqIGFuIGFycmF5IG9mIGludHMgdGhhdCBpcyB0aGUgc2FtZSBzaXplIGFzIAorCSAqIHJhbmdlLiAgSWYgTGVzcyB2YWx1ZXMgc3BlY2lmaWVkLCB0aGVuIGxhc3QgCisJICogdmFsdWUgd2lsbCBiZSByZXBlYXRlZC4KKwkgKiBAcGFyYW0gY29sb3IgcmFuZ2Ugb2YgY29sb3JzIAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlZChTdHJpbmcgY29sb3IpIHsKKwkJaW50IG4gPSBnZXRSYW5nZSgpLmxlbmd0aDsKKwkJdGhpcy5yZWQgPSBuZXcgaW50W25dOworCQlpZiAoY29sb3IgPT0gbnVsbCkgewkJCQorCQkJZm9yIChpbnQgaT0wO2k8bjtpKyspIHsKKwkJCQl0aGlzLnJlZFtpXSA9IDA7CisJCQl9CisJCQlyZXR1cm47CisJCX0gCisJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbG9yLCIsIik7CQkKKwkJaW50IHZhbHVlID0gMDsKKwkJZm9yIChpbnQgaT0wOyBpPG47IGkrKykgeworCQkJaWYgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCSAgdmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCkpOworCQkJfQorCQkJdGhpcy5yZWRbaV0gPSB2YWx1ZTsJCQkKKwkJfQkJCisJfQorCS8qKgorCSAqIFNldCB0aGUgQ29sb3Igb2YgdGhlIGRpc3BsYXllZCBwb2x5Z29ucworCSAqIGJhc2VkIG9uIHRoZSByYW5nZSBvZiB2YWx1ZXMuICAKKwkgKiBJdCBpcyBnaXZlbiBhcyBhIFN0cmluZyBhbmQgY29udmVydGVkIHRvIAorCSAqIGFuIGFycmF5IG9mIGludHMgdGhhdCBpcyB0aGUgc2FtZSBzaXplIGFzIAorCSAqIHJhbmdlLiAgSWYgTGVzcyB2YWx1ZXMgc3BlY2lmaWVkLCB0aGVuIGxhc3QgCisJICogdmFsdWUgd2lsbCBiZSByZXBlYXRlZC4KKwkgKiBAcGFyYW0gY29sb3IgcmFuZ2Ugb2YgY29sb3JzIAorCSAqLworCXB1YmxpYyB2b2lkIHNldEdyZWVuKFN0cmluZyBjb2xvcikgeworCQlpbnQgbiA9IGdldFJhbmdlKCkubGVuZ3RoOworCQl0aGlzLmdyZWVuID0gbmV3IGludFtuXTsKKwkJaWYgKGNvbG9yID09IG51bGwpIHsJCQkKKwkJCWZvciAoaW50IGk9MDtpPG47aSsrKSB7CisJCQkJdGhpcy5ncmVlbltpXSA9IDA7CisJCQl9CisJCQlyZXR1cm47CisJCX0gCisJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbG9yLCIsIik7CQkKKwkJaW50IHZhbHVlID0gMDsKKwkJZm9yIChpbnQgaT0wOyBpPG47IGkrKykgeworCQkJaWYgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCSAgdmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCkpOworCQkJfQorCQkJdGhpcy5ncmVlbltpXSA9IHZhbHVlOwkJCQorCQl9CQkKKwl9CisJCisJLyoqCisJICogU2V0IHRoZSBDb2xvciBvZiB0aGUgZGlzcGxheWVkIHBvbHlnb25zCisJICogYmFzZWQgb24gdGhlIHJhbmdlIG9mIHZhbHVlcy4gIAorCSAqIEl0IGlzIGdpdmVuIGFzIGEgU3RyaW5nIGFuZCBjb252ZXJ0ZWQgdG8gCisJICogYW4gYXJyYXkgb2YgaW50cyB0aGF0IGlzIHRoZSBzYW1lIHNpemUgYXMgCisJICogcmFuZ2UuICBJZiBMZXNzIHZhbHVlcyBzcGVjaWZpZWQsIHRoZW4gbGFzdCAKKwkgKiB2YWx1ZSB3aWxsIGJlIHJlcGVhdGVkLgorCSAqIEBwYXJhbSBjb2xvciByYW5nZSBvZiBjb2xvcnMgCisJICovCisJcHVibGljIHZvaWQgc2V0Qmx1ZShTdHJpbmcgY29sb3IpIHsKKwkJaW50IG4gPSBnZXRSYW5nZSgpLmxlbmd0aDsKKwkJdGhpcy5ibHVlID0gbmV3IGludFtuXTsKKwkJaWYgKGNvbG9yID09IG51bGwpIHsJCQkKKwkJCWZvciAoaW50IGk9MDtpPG47aSsrKSB7CisJCQkJdGhpcy5ibHVlW2ldID0gMDsKKwkJCX0KKwkJCXJldHVybjsKKwkJfSAKKwkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY29sb3IsIiwiKTsJCQorCQlpbnQgdmFsdWUgPSAwOworCQlmb3IgKGludCBpPTA7IGk8bjsgaSsrKSB7CisJCQlpZiAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworCQkJICB2YWx1ZSA9IEludGVnZXIucGFyc2VJbnQodG9rZW5zLm5leHRUb2tlbigpKTsKKwkJCX0KKwkJCXRoaXMuYmx1ZVtpXSA9IHZhbHVlOwkJCQorCQl9CQkKKwl9CisJCisJLyoqCisJICogQHBhcmFtIG4gbGlzdCBlbnRyeQorCSAqIEByZXR1cm4gdGhlIGNvbG9yIGVudHJ5CisJICovCisJCisJcHVibGljIGludCBnZXRSZWQoaW50IG4pIHsKKwkJcmV0dXJuIHJlZFtuXTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIG4gbGlzdCBlbnRyeQorCSAqIEByZXR1cm4gdGhlIGNvbG9yIGVudHJ5CisJICovCisJCisJcHVibGljIGludCBnZXRHcmVlbihpbnQgbikgeworCQlyZXR1cm4gZ3JlZW5bbl07CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBuIGxpc3QgZW50cnkKKwkgKiBAcmV0dXJuIHRoZSBjb2xvciBlbnRyeQorCSAqLworCQorCXB1YmxpYyBpbnQgZ2V0Qmx1ZShpbnQgbikgeworCQlyZXR1cm4gYmx1ZVtuXTsKKwl9CisJLyoqCisJICogQHBhcmFtIHJhbmdlIHRoZSByYW5nZSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSYW5nZShkb3VibGVbXSByYW5nZSkgeworCQl0aGlzLnJhbmdlID0gcmFuZ2U7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgdHlwZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJLyoqCisJICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IEFzcGVjdAorCSAqLworCXB1YmxpYyBzdGF0aWMgQXNwZWN0IGdldERlZmF1bHQoKSB7CisJCVN0cmluZyBjb2RlID0gZ2V0RGVmYXVsdENvZGUoKTsJCQorCQlyZXR1cm4gZ2V0QXNwZWN0KGNvZGUpOworCX0KKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IEFzcGVjdCBjb2RlCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdENvZGUoKSB7CisJCXJldHVybiBkZWZhdWx0QXNwZWN0OworCX0KKwkvKioKKwkgKiBAcGFyYW0gZGVmYXVsdEFzcGVjdENvZGUgdGhlIGFzcGVjdCB0byBzZXQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdENvZGUoU3RyaW5nIGRlZmF1bHRBc3BlY3RDb2RlKSB7CisJCWRlZmF1bHRBc3BlY3QgPSBkZWZhdWx0QXNwZWN0Q29kZTsKKwl9CisJLyoqCisJICogQHJldHVybiB0aGUgdW5pdAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pdCgpIHsKKwkJcmV0dXJuIHVuaXQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIHVuaXQgdGhlIHVuaXQgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0VW5pdChTdHJpbmcgdW5pdCkgeworCQl0aGlzLnVuaXQgPSB1bml0OworCX0KKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBrbWxEaXNwbGF5Q2xhc3MKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRLbWxEaXNwbGF5Q2xhc3MoKSB7CisJCXJldHVybiBrbWxEaXNwbGF5Q2xhc3M7CisJfQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9HRURhdGEuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2UvR0VEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg2MWNjMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2UvR0VEYXRhLmphdmEKQEAgLTAsMCArMSwzNTIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5nZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAoraW1wb3J0IGphdmEuYXd0LlBvbHlnb247CitpbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOworaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmcuU2VnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmc7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS52aWV3cy5HRVByZWZlcmVuY2VQYWdlOworCisKKworLyoqCisgKiBTdG9yZSBpbmZvIGFib3V0IGEgZ2VvZ3JhcGhpYyBsb2NhdGlvbiBhbmQgU0VJUiBzdGF0dXMgaW4gU1RFTS4KKyAqIEl0IHdvdWxkIHJlcHJlc2VudCBhbiBhcmVhIHN1Y2ggYXMgYSBVUyBjb3VudHkgYW5kCisgKiBjb250YWlucyBhbiBpZCBhbmQgdGhlIGJvcmRlciBleHByZXNzZWQgYXMgb25lIG9yIG1vcmUKKyAqIGxpc3Qgb2YgcG9pbnRzLiAgVGhlIHBvaW50cyBhcmUgTG9uZ2l0dWRlIGFuZCBsYXRpdHVkZS4KKyAqIAorICogTm90ZSB0aGF0IChwZXJoYXBzIGZvciBhbiBpc2xhbmQgZ3JvdXApIHRoZXJlIG1heSBiZSAKKyAqIG1vcmUgdGhhbiAxIGxpc3Qgb2YgcG9pbnRzLgorICogCisgKiBJdCBhbHNvIGNvbnRhaW5zIHRoZSB2YWx1ZXMgZm9yIHZhcmlvdXMgYXNwZWN0cyByZWxhdGl2ZSB0byBQb3B1bGF0aW9uCisgKiBGb3IgU0VJUiBkaWNlYXNlcywgdGhlc2UgYXNwZWN0cyB3b3VsZCBiZSBTdXNjZXB0aWJsZSxFeHBvc2VkLAorICogSW5mZWN0aW91cywgYW5kIFJlY292ZXJlZCAgVGhlcmUgbWF5IGJlIG1vcmUgb3IgbGVzcyBhc3BlY3RzLgorICogVGhlc2UgYXJlIHN0b3JlZCBpbiBhIE1hcCBrZXllZCBieSBhc3BlY3QgY29kZS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBHRURhdGEgeworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIEFkbWluIGFyZWEgaW52b2x2ZWQKKyAgICAgKi8KKwlwcml2YXRlIFN0cmluZyBuYW1lID0gIiI7CisJLyoqCisJICogQ2FuIGJlIHNldCBieSB0aGUgY3JlYXRlciB3aXRoIHNldERlc2NyaXB0aW9uLgorCSAqIFVzdWFsbHkgdXNlZCBmb3IgdGhlIGxpc3Qgb2YgcmVsYXRpdmUgdmFsdWVzCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb24gPSAiIjsKKwkKKwkvKioKKwkgKiB1c2VkIHRvIHNldCB0aGUga21sIGlkCisJICovCisJcHJpdmF0ZSBTdHJpbmcgaWQgPSAiIjsKKwkvKiogCisJICogdXNlZCB0byBmb3JtYXQgdGhlIGxvbmdpdHVkZS9sYXRpdHVkZSB2YWx1ZXMKKwkgKiBkZWZhdWx0IG9mIERlY2ltYWxGb3JtYXQoKSB3b3VsZCByZXN1bHQgaW4gMyBkaWdpdCBwcmVjaXNpb24gCisJICovCisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjaW1hbEZvcm1hdCBkZiA9IG5ldyBEZWNpbWFsRm9ybWF0KCIjIyMjLiMjIik7CisJCisgICAgLyoqCisgICAgICogQSBMYXRMb25nIGluc3RhbmNlIGlzIGEgY29sbGVjdGlvbiBvZiBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YSBwYWlycyBwYXJ0aXRpdGlvbmVkCisgICAgICogaW50byBvbmUgb3IgbW9yZSAic2VnbWVudHMiLiBFYWNoIHNlZ21lbnQgaXMgYSBzZXF1ZW5jZSBvZiBsYXRpdHVkZS9sb25naXR1ZGUKKyAgICAgKiBkYXRhIHBhaXJzLiBBIHNlZ21lbnQgY291bGQgZm9ybSBhIGNsb3NlZCBwb2x5Z29uIG9yIGl0IGNvdWxkIGJlIGEgcGF0aC4KKyAgICAgKiBJbiBvdXIgY2FzZSB0aGlzIHNob3VsZCBhbHdheXMgYmUgYSBjbG9zZWQgcG9seWdvbi4KKyAgICAgKiA8cHJlPgorICAgICAqIEVhY2ggTGF0TG9uZyBkZXNjcmliZXMgMSBvciBtb3JlIHBvbHlnb24gYm9yZGVyLiBUaGVyZSBtYXkgYmUgCisgICAgICogICBtb3JlIHRoYW4gb25lIHBvbHlnb24gaW4gdGhlIGNhc2Ugb2YgYW4gaXNsYW5kIG9yIC4uLgorICAgICAqIAorICAgICAqICA8L3ByZT4KKyAgICAgKi8JCisgICAgcHJpdmF0ZSBMYXRMb25nIHBvbHlnb25zID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb250YWlucyB0aGUgYXNwZWN0IHZhbHVlcyBmb3IgdGhlIGFyZWEKKyAgICAgKiBLZXllZCBieSB0aGUgYXNwZWN0IGNvZGUuIAorICAgICAqIEZvciBFeGFtcGxlLiB3aXRoIGFuIFNFSVIgZGlzZWFzZSB5b3Ugd291bGQgaGF2ZQorICAgICAqIGtleWVkIGVudHJpZXMgZm9yICJTIiwgIkUiLCAiSSIgYW5kICJSIiAgIAorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxEb3VibGU+IHZhbHVlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLERvdWJsZT4oOCk7IAorICAgIC8qKgorICAgICAqIEJvdW5kaW5nIEJveCBmb3IgdGhpcyBMYXRMb25nIHBvbHlnb24uICAKKyAgICAgKiBJZiBMYXRMb25nIGNvbnRhaW5zIG1vcmUgdGhhbiAxIHBvbHlnb24gdGhpcyBpcyB0aGUgCisgICAgICogdW5pb24gb2YgdGhlIEJvdW5kaW5nQm94IGZvciBlYWNoIHBvbHlnb24KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlY3RhbmdsZSBiQm94ID0gbnVsbDsKKyAgICAKKyAgICBwcml2YXRlIGRvdWJsZVtdIHBsYWNlbWFyayA9IG51bGw7CisgICAgCisJLyoqCisJICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIEdFRGF0YSB3aXRoIExhdExvbmcKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBhcmVhcworCSAqLworCXB1YmxpYyBHRURhdGEoU3RyaW5nIG5hbWUsIExhdExvbmcgYXJlYXMpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5pZCA9IG5hbWU7CisJCXRoaXMucG9seWdvbnMgPSBhcmVhczsKKwkJLy9pZiAoYXJlYXMuc2l6ZSgpID4gMSkgeworCQkvLwlHRUxvZy5kZWJ1Zyh0aGlzLG5hbWUrIjogIithcmVhcy5zaXplKCkpOworCQkvL30KKwkJaWYgKEdFUHJlZmVyZW5jZVBhZ2UuaXNCQk9YKCkpIHsKKwkJCXRoaXMuYkJveCA9IGdldEJCb3goYXJlYXMpOworCQl9CisJCQorCX0gCisJLyoqCisJICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIEdFRGF0YSB3aXRoIExhdExvbmcKKwkgKiBAcGFyYW0gaWQgICAgYWRtaW4gYXJlYSBpZAorCSAqIEBwYXJhbSBuYW1lICBhZG1pbiBhcmVhIG5hbWUKKwkgKiBAcGFyYW0gYXJlYXMgbGF0L2xvbmcgYm9yZGVyIG9mIDEgb2YgbW9yZSBwb2x5Z29ucworCSAqLworCXB1YmxpYyBHRURhdGEoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgTGF0TG9uZyBhcmVhcykgeworCQlzdXBlcigpOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmlkID0gaWQ7CisJCXRoaXMucG9seWdvbnMgPSBhcmVhczsKKwkJLy9pZiAoYXJlYXMuc2l6ZSgpID4gMSkgeworCQkvLwlHRUxvZy5kZWJ1Zyh0aGlzLG5hbWUrIjogIithcmVhcy5zaXplKCkpOworCQkvL30KKwkJaWYgKEdFUHJlZmVyZW5jZVBhZ2UuaXNCQk9YKCkpIHsKKwkJCXRoaXMuYkJveCA9IGdldEJCb3goYXJlYXMpOworCQl9CisJCQorCX0gCisJLyoqCisJICogCisJICogZm9ybWF0IG5lZWRlZCBieSBLTUwgCisJICogICAgbG9uZyxsYXQgbG9uZyxsYXQgLi4uCisJICogICAgCisJICogQnkgZGVmYXVsdCBEZWNpbWFsRm9ybWF0IHdpbGwgcmV0dXJuIAorCSAqIGRvdWJsZXMgYXMgbm5ubi5kZGQgCisJICogICAgCisJICogQHBhcmFtIG51bUFyZWEgTm9ybWFsbHkgMCBpZiBqdXN0IDEgY29udGFnaW91cyBhcmVhIAorCSAqICAgICAgICAgICAgICAgIGJ1dCBpdCBjb3VsZCBiZSBhIHNldCBvZiBpc2xhbmRzIG9yCisJICogICAgICAgICAgICAgICAgb3RoZXIgbXVsdGlwbGUgYXJlYXMuIAorCSAqIEByZXR1cm4gdGhlIGNvb3JkaW5hdGVzIGFzIGEgU3RyaW5nIGluIHRoZSBmb3JtCisJICogICBsb25nMSxsYXQxIGxvbmcyLGxhdDIgLi4uCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb29yZGluYXRlc0FzU3RyaW5nKGludCBudW1BcmVhKSB7CisJCVNlZ21lbnQgc2VnbWVudCA9IHBvbHlnb25zLmdldFNlZ21lbnRzKCkuZ2V0KG51bUFyZWEpOwkJCisJCS8vIHdlIGRvbid0IGNhcmUgYWJvdXQgYWx0aXR1ZGUgCisJCQorCQlTdHJpbmdCdWZmZXIgc3RyYnVmID0gbmV3IFN0cmluZ0J1ZmZlcig0MDApOwkKKwkJZmluYWwgaW50IHNpemUgPSBzZWdtZW50LnNpemUoKTsKKwkJZm9yIChpbnQgaT0wOyBpPCBzaXplOyBpKyspIHsJCQkKKwkJCXN0cmJ1Zi5hcHBlbmQoZGYuZm9ybWF0KHNlZ21lbnQubG9uZ2l0dWRlKGkpKSk7CisJCQlzdHJidWYuYXBwZW5kKCIsIik7CisJCQlzdHJidWYuYXBwZW5kKGRmLmZvcm1hdChzZWdtZW50LmxhdGl0dWRlKGkpICkpOworCQkJc3RyYnVmLmFwcGVuZCgiICIpOworCQl9CisJCXJldHVybiBzdHJidWYudG9TdHJpbmcoKTsKKwl9CisJLyoqCisJICogCisJICpHZXQgdGhlIGFzcGVjdCB2YWx1ZXMgYXMgYSBTdHJpbmcKKwkgKiAgICAgICAgCisJICogCisJICogQHJldHVybiB0aGUgdmFsdWVzIGFzIGEgU3RyaW5nIGluIHRoZSBmb3JtCisJICogICBhMTogdjEgYTI6djIgLi4uCisJICovCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZXNBc1N0cmluZygpIHsKKwkJCQkKKwkJU3RyaW5nQnVmZmVyIHN0cmJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoNjQpOworCQlmb3IoTWFwLkVudHJ5PFN0cmluZywgRG91YmxlPiBlbnRyeTogdmFsdWVNYXAuZW50cnlTZXQoKSApIHsKKwkJICAgIHN0cmJ1Zi5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpOworCQkJc3RyYnVmLmFwcGVuZCgiOiIpOworCQkJc3RyYnVmLmFwcGVuZChkZi5mb3JtYXQoZW50cnkuZ2V0VmFsdWUoKSkpOworCQkJc3RyYnVmLmFwcGVuZCgiICIpOworCQl9CisJCQorCQkKKwkJcmV0dXJuIHN0cmJ1Zi50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIGdldCB0aGUgbnVtYmVyIG9mIGFyZWFzIGRlc2NyaWJlZCBieSB0aGUgZ2VvZ3JhcGhpYyBwb2ludHMuCisJICogCisJICogQHJldHVybiBudW1iZXIgb2YgcG9seWdvbnMgZGVzY3JpYmVkCisJICovCisgICAgcHVibGljIGludCBnZXROdW1BcmVhcygpIHsKKyAgICAJaWYgKHBvbHlnb25zICE9IG51bGwpCisgICAgCSAgcmV0dXJuIHBvbHlnb25zLnNpemUoKTsKKyAgICAJZWxzZSAKKyAgICAJICByZXR1cm4gMDsKKyAgICB9CisJLyoqCisJICogQHJldHVybiB0aGUgbmFtZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGJCb3ggcmVjdGFuZ2xlCisJICovCisJcHVibGljIFJlY3RhbmdsZSBnZXRCQm94KCkgeworCQlyZXR1cm4gYkJveDsKKwl9CisJLyoqCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQl0aGlzLm5hbWUgPSBuYW1lOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGlkCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGlkOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpZCB0aGUgaWQgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7CisJCXRoaXMuaWQgPSBpZDsKKwl9CisJCisJLyoqCisJICogc2V0IHRoZSBjb29yZGluYXRlcyBvZiBhIHBvaW50IHdpdGhpbiBhIHBvbHlnb24KKwkgKiBAcGFyYW0gbGF0aXR1ZGUKKwkgKiBAcGFyYW0gbG9uZ2l0dWRlCisJICovCisJcHVibGljIHZvaWQgc2V0UG9pbnQoZG91YmxlIGxhdGl0dWRlLCBkb3VibGUgbG9uZ2l0dWRlKSB7CisJCXBsYWNlbWFyayA9IG5ldyBkb3VibGVbMl07CisJCXBsYWNlbWFya1swXSA9IGxhdGl0dWRlOworCQlwbGFjZW1hcmtbMV0gPSBsb25naXR1ZGU7CisJfQorCS8qKgorCSAqIFJldHVybiB0aGUgY29vcmRpYW50ZXMgb2YgYSBwb2ludCAKKwkgKiAKKwkgKiBAcmV0dXJuIERvdWJsZVtdIG9yIG51bGwKKwkgKi8KKwlwdWJsaWMgZG91YmxlW10gZ2V0UG9pbnQoKSB7CisJCXJldHVybiBwbGFjZW1hcms7CisJfQorCQorCS8qKgorCSAqIEdpdmVuIGEgTGF0TG9uZywgZ2VuZXJhdGUgdGhlIG92ZXJhbGwgQm91bmRpbmdCb3hlcy4KKwkgKiAKKwkgKiBAcGFyYW0gbGF0TG9uZworCSAqIEByZXR1cm4gUmVjdGFuZ2xlCisJICovCisJcHJpdmF0ZSBzdGF0aWMgUmVjdGFuZ2xlIGdldEJCb3goTGF0TG9uZyBsYXRMb25nKSB7CisJCQorCQlMaXN0PFNlZ21lbnQ+IGxpc3QgPSBsYXRMb25nLmdldFNlZ21lbnRzKCk7CisJCWludCBudW1hcmVhcyA9IGxpc3Quc2l6ZSgpOworCQlSZWN0YW5nbGUgYkJveCA9IG51bGw7CisJCWZvciAoaW50IGk9MDsgaTxudW1hcmVhczsgaSsrKSB7CisJCQlmaW5hbCBQb2x5Z29uIHBvbHlnb24gPSBuZXcgUG9seWdvbigpOworCQkJZmluYWwgU2VnbWVudCBzZWdtZW50ID0gbGlzdC5nZXQoaSk7CisJCQlmaW5hbCBpbnQgc2l6ZSA9IHNlZ21lbnQuc2l6ZSgpOworCQkJZm9yIChpbnQgcD0wOyBwPCBzaXplOyBwKyspIHsKKwkJCQlkb3VibGUgeCA9IHNlZ21lbnQubG9uZ2l0dWRlKHApOworCQkJCWRvdWJsZSB5ID0gc2VnbWVudC5sYXRpdHVkZShwKTsKKwkJCQlpbnQgeGludCA9IChpbnQpKCh4KzE4MCkqMTAwMCk7CisJCQkJaW50IHlpbnQgPSAoaW50KSgoeSs5MCkqMTAwMCk7CisJCQkJcG9seWdvbi5hZGRQb2ludCh4aW50LCB5aW50KTsKKwkJCX0gLy8gZm9yCisJCQkKKwkJCWlmIChiQm94ID09IG51bGwpCisJCQkJYkJveCA9IHBvbHlnb24uZ2V0Qm91bmRzKCk7CisJCQllbHNlIAorCQkJCWJCb3ggPSBiQm94LnVuaW9uKHBvbHlnb24uZ2V0Qm91bmRzKCkpOworCQl9CisJCSAgIAorCQlyZXR1cm4gYkJveDsKKwl9CisJCisJCisJLyoqCisJICogZGVidWcgaGVscGVyCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlzYi5hcHBlbmQoIkdFRGF0YTogIik7CisJCXNiLmFwcGVuZCh0aGlzLmdldFZhbHVlc0FzU3RyaW5nKCkpOworCQlzYi5hcHBlbmQoIiBCQm94OiIrYkJveCk7CisJCXNiLmFwcGVuZCgiIDogIik7CisJCWZvciAoaW50IGk9MDsgaTwgcG9seWdvbnMuc2l6ZSgpOyBpKyspIHsJCQkKKwkJCXNiLmFwcGVuZCh0aGlzLmdldENvb3JkaW5hdGVzQXNTdHJpbmcoaSkpOworCQl9CisJCQkJCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHZhbHVlTWFwIGZvciB0aGUgc3BlY2lmaWVkIGFyZWEgc28gCisJICogd2UgY2FuIHN0b3JlIHZhbHVlcyBpbnRvIGl0LgorCSAqLworCXB1YmxpYyBNYXA8U3RyaW5nLERvdWJsZT4gZ2V0VmFsdWVNYXAoKSB7CisJCXJldHVybiB2YWx1ZU1hcDsKKwl9CisJLyoqCisJICogQHBhcmFtIGFzcGVjdCAKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBhbHBlY3QKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFZhbHVlKEFzcGVjdCBhc3BlY3QpIHsKKwkJcmV0dXJuIHZhbHVlTWFwLmdldChhc3BlY3QuZ2V0Q29kZSgpKTsKKwl9CisJCisJLyoqCisJICogU3RvcmUgdGhlIHZhbHVlIGluIHRoZSBkYXRhIHN0b3JlIGZvciB0aGUgYXJlYS4KKwkgKiAKKwkgKiBAcGFyYW0gYXNwZWN0ICBUaGUgYXNwZWN0IHRoYXQgdGhpcyB2YWx1ZSBpcyBmb3IuIAorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgYXNwZWN0CisJICovCisJcHVibGljIHZvaWQgc2V0VmFsdWUoQXNwZWN0IGFzcGVjdCwgZG91YmxlIHZhbHVlKSB7CisJCXZhbHVlTWFwLnB1dChhc3BlY3QuZ2V0Q29kZSgpLHZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjZW50ZXIgb2YgdGhlIEJCb3ggYXMgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZS4KKwkgKi8KKwlwdWJsaWMgZG91YmxlW10gZ2V0QkJveENlbnRlcigpIHsKKwkJCisJCWlmIChiQm94ID09IG51bGwpIHsKKwkJCWJCb3ggPSBnZXRCQm94KHBvbHlnb25zKTsKKwkJfQorCQlpZiAoYkJveCAhPSBudWxsICkgeworICAgIAkJLy8gY29udmVydCBiYWNrIHRvIGRvdWJsZSB2YWx1ZS4KKyAgICAJCWRvdWJsZSBsb25naXR1ZGUgPSBiQm94LmdldENlbnRlclgoKTsKKyAgICAJCWxvbmdpdHVkZSA9IChsb25naXR1ZGUtMTgwMDAwKS8xMDAwOworICAgIAkJZG91YmxlIGxhdGl0dWRlICA9IGJCb3guZ2V0Q2VudGVyWSgpOworICAgIAkJbGF0aXR1ZGUgPSAobGF0aXR1ZGUtOTAwMDApLzEwMDA7CisgICAgCQkKKyAgICAJCWRvdWJsZVtdIGNlbnRlciA9IG5ldyBkb3VibGVbXSB7bG9uZ2l0dWRlLGxhdGl0dWRlfTsKKyAgICAJCXJldHVybiBjZW50ZXI7CisgICAgCX0gCisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uCisJICovCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiB0aGUgZGVzY3JpcHRpb24gdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2UvR0VJbnRlcmZhY2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2UvR0VJbnRlcmZhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODMwNzBlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9HRUludGVyZmFjZS5qYXZhCkBAIC0wLDAgKzEsMTg2OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkR1YmxpbkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmdQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmdQcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLlBsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmcuU2VnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLmltcGwuUmVnaW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5Lkdlb2dyYXBoaWNOYW1lczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uTWFuYWdlckV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25TdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLmttbC5LbWxEaXNwbGF5U2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uua21sLlN0ZW1LbWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS52aWV3cy5HRVByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uudmlld3MuR0VWaWV3OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuR2VvZ3JhcGhpY1NlbGVjdGlvbkVsZW1lbnRzOworCisKKworLyoqCisgKiBUaGlzIGlzIHRoZSBTVEVNIGhhbGYgb2YgdGhlIGludGVyZmFjZSBiZXR3ZWVuIAorICogU1RFTSBhbmQgR29vZ2xlRWFydGguCisgKiAKKyAqIEl0IGxpc3RlbnMgZm9yIFNpbXVsYXRpb25zIHRvIGJlIGFkZGVkIG9yIGRlbGV0ZWQgYW5kIG1haW50YWlucyBhIAorICogbGlzdCBvZiBzaW11bGF0aW9ucy4gIFdoZW4gYSBzaW11bGF0aW9uIGJlY29tZXMgYWN0aXZlIGl0IHRoZW4gCisgKiBsaXN0ZW5zIGZvciBTaW11bGF0aW9uIGV2ZW50cy4gICAKKyAqIDxwPgorICogV2hlbiBhIHNpbXVsYXRpb24gY3ljbGUgY29tcGxldGVzLCB3ZSBhcmUgbm90aWZpZWQgYW5kIAorICogaXQgd2lsbCB0YWtlIHRoZSBTVEVNIGRhdGEgYW5kIGNhbGwgU3RlbUttbCB0byBjb252ZXJ0IAorICogaXQgdG8gS01MIGFuZCBlaXRoZXIgbG9nIGl0IHRvIGEgc2V0IG9mIGZpbGVzIGZvciBsYXRlciBkaXNwbGF5IAorICogb3Igc2VuZCBpdCBkaXJlY3RseSB0byBHb29nbGVFYXJ0aC4KKyAqIDxwPgorICogVGhlIG92ZXJhbGwgcHJvY2VzcyBmbG93IGlzIHRoZSBmb2xsb3dpbmc6CisgKiA8cHJlPgorICogICA8Yj5zaW11bGF0aW9uc0NoYW5nZWQ6PC9iPiBOb3RpZmllZCB3aGVuIGEgbmV3IFNpbXVsYXRpb24gaXMgYWRkZWQKKyAqICAgb3IgcmVtb3ZlZC4gIElmIGFkZGVkIHRoZW4gc2V0QWN0aXZlKCkgaXMgY2FsbGVkIHRvIGFkZCBpdCB0byAKKyAqICAgdGhlIGxpc3Qgb2YgU2ltdWxhdGlvbnMgYmVpbmcgaGFuZGxlZC4KKyAqICAgCisgKiAgIDxiPnNpbXVsYXRpb25DaGFuZ2VkOjwvYj4gTm90aWZpZWQgd2hlbiBhIGN5Y2xlIGVuZHMuIEl0IGNhbGxzIAorICogICB0aGUgcHJvY2Vzc0N5Y2xlIG1ldGhvZC4KKyAqICAgCisgKiAgIDxiPnByb2Nlc3NDeWNsZTwvYj5NYWluIHByb2Nlc3Mgd2hlbiBhIHByb2Nlc3NpbmcgY3ljbGUgZW5kcy4KKyAqICAgICAKKyAqICAgICA8Yj5idWlsZE1hcCgpPC9iPiBjYWxsZWQgb24gMXN0IGN5Y2xlIHRvIGJ1aWxkIGEgbWFwIG9mICAKKyAqICAgICBHRURhdGEgaW5zdGFuY2VzIHRoYXQgY29udGFpbnMgdGhlIGdlb2dyYXBoaWMgZGVzY3JpcHRpb24gCisgKiAgICAgb2YgZWFjaCBjb3VudHkvYXJlYWlkCisgKiAgICAgCisgKiAgICAgSXQgdGhlbiB1c2VzIHRoZSBQcmVmZXJlbmNlUGFnZSBvcHRpb24gdG8gZGVjaWRlIGhvdyB0byAKKyAqICAgICBjb211bmljYXRlIHdpdGggR29vZ2xlRWFydGguICAKKyAqICAgICAKKyAqICAgICAgPGI+c3RvcmVTRUlSKCk8L2I+IFRoaXMgdXBkYXRlcyB0aGUgR0VEYXRhIGluc3RhbmNlcyB3aXRoIHRoZSAKKyAqICAgICAgcmVsYXRpdmUgZGlzZWFzZSBzdGF0aXN0aWNzLgorICogICAgICAKKyAqICAgICAgPGI+Z2VuZXJhdGVLTUwoKTwvYj4gVGhpcyBzZW5kcyBhbGwgdGhlIGluZm9ybWF0aW9uIHRvIHRoZSAKKyAqICAgICAgR0VKb2IgaW5zdGFuY2Ugd2hlcmUgYSBLTUwgZmlsZSBmb3IgdGhpcyBjeWRsZSBpcyB3cml0dGVuLgorICogICAgICAKKyAqIDwvcHJlPgorICogICAgCisgKi8KKworcHVibGljIGNsYXNzIEdFSW50ZXJmYWNlIAorICAgICAgICAgICBpbXBsZW1lbnRzIElTaW11bGF0aW9uTGlzdGVuZXIsIElTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyeworCQkKKwkgLyoqCisgICAgICogdGVtcGxhdGUgZm9yIHRoZSBLTUwgZmlsZW5hbWUgd3JpdHRlbiBvbiB0aGUgCisgICAgICogTnRoIGN5Y2xlIGZvciB0eXBlIFQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29udHJvbFRlbXBsYXRlID0gImNvbnRyb2xfJk5fJlQua21sIjsKKyAgICAKKyAgICAKKwkvKioKKwkgKiBMaXN0IG9mIGFjdGl2ZSBzaW11bGF0aW9ucyBrZXllZCBieSBOYW1lCisJICogCisJICogVGhlIGxpc3QgaXMgdXBkYXRlZCBieSBTaW11bGF0aW9uTWFuYWdlciBldmVudHMKKwkgKiB0aGF0IGFkZCBvciByZW1vdmUgc2ltdWxhdGlvbnMuCisJICovCisJcHJpdmF0ZSBNYXA8U3RyaW5nLEdFU2ltRW50cnk+IGFjdGl2ZVNpbXVsYXRpb25zID0gbnVsbDsKKwkKKwkKKwkvKioKKwkgKiBtYXAgb2YgZ2VvZ3JhcGhpYyBkYXRhIGtleWVkIGJ5IGFyZWEgaWQKKwkgKi8KKwlwcml2YXRlIE1hcDxTdHJpbmcsIEdFRGF0YT4gc3RlbU1hcCA9IG51bGw7CisJCisJLyoqCisJICogR0VWaWV3IGhhbmRsZXMgYWxsIHRoZSBndWkgdWkgZm9yIHVzCisJICovCisJcHJpdmF0ZSBHRVZpZXcgZ2VWaWV3ID0gbnVsbDsKKwkKKwkvKioKKwkgKiBUaGlzIHdpbGwgY29udGFpbiB0aGUgc2ltdWxhdGlvbiBpZCB3aGVuIHRoYXQgc2ltdWxhdGlvbiAKKwkgKiBpcyBzZW5kaW5nIGl0cyBLTUwgdG8gR29vZ2xlRWFydGguICBXaGVuIGl0IGlzIGZpbGxlZAorCSAqIGluIGFueSBzdWJzZXF1ZW50IHJlcXVlc3RzIHRvIGxvZyBhbmQgdmlldyB3aWxsIG9ubHkgZG8gbG9nZ2luZy4KKwkgKiBJdCBpcyBjbGVhcmVkIHdoZW4gdGhlIHNpbXVsYXRpb24gaXMgcmVtb3ZlZC4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBhY3RpdmVWaWV3ID0gbnVsbDsKKwkKKwkvKioKKwkgKiB3aGVuIHNldCB0byBhIG5vZGUgbmFtZSB0aGVuIHRoZSBkaXNwbGF5TWFwIG1ldGhvZAorCSAqIHdpbGwgb25seSBkaXNwbGF5IHRoYXQgbm9kZS4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBkaXNwbGF5Tm9kZSA9IG51bGw7CisJLyoqCisJICogQ3ljbGUgYmVpbmcgcHJvY2Vzc2VkLgorCSAqLworCS8vcHJpdmF0ZSBpbnQgY3ljbGUgPSAwOworCS8qKgorCSAqIFRoaXMgbWFwIGlzIHVzZWQgdG8gY29sbGVjdCBub2RlcyB0aGF0IGhhdmUgYmVlbiAKKwkgKiBkaXNwbGF5ZWQgYnkgcHJldmlvdXMgcmVxdWVzdHMgc28gdGhhdCB0aGlzIGNhbiAKKwkgKiBiZSBhbiBhY2N1bXVsYXRpdmUgZGlzcGxheS4gIAorCSAqLworCXByaXZhdGUgTWFwPFN0cmluZyxHRURhdGE+IHN0ZW1NYXBOb2RlID0gbnVsbDsKKwkvKioKKwkgKiBkZWZhdWx0IEFzcGVjdCB0byBiZSBkaXNwbGF5ZWQgZm9yIHNpbXVsYXRpb25zLgorCSAqIFNldCBieSBHRVZpZXcgY29udGV4dCBtZW51IHRvIG92ZXJyaWRlIAorCSAqIHRoZSBkZWZhdWx0QXNwZWN0IHNwZWNpZmllZCBpbiBBc3BlY3QucHJvcGVydGllcworCSAqLworCXByaXZhdGUgQXNwZWN0IGRlZmF1bHRBc3BlY3QgPSBudWxsOworCQorCS8qKiAKKwkgKiBwbGFjZSB0byBzdG9yZSBhbiBlcnJvciBtZXNzYWdlIHNvIHRoZSBjYWxsZXIgY2FuIGdldCBpdC4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOworCS8qKgorCSAqIHdoZW4gdXNlciByZXF1ZXN0cyBhIG1hbnVhbCBkaXNwbGF5IG9mIG1hcAorCSAqIHNldCB0aGlzIHRydWUgCisJICovCisJcHJpdmF0ZSBib29sZWFuIG1hbnVhbFJlcXVlc3QgPSBmYWxzZTsKKwkKKwkvKioKKwkgKiBSZWZlcmVuY2UgdG8gdGhlIGRpc3BsYXkgbW9kdWxlIHRoYXQgCisJICogZGlzcGxheXMgdGhlIGluZm8gYmFzZWQgb24gYSBzZWxlY3Rpb24gYnkKKwkgKiB0aGUgbWFwdmlldyB2aWV3IAorCSAqLworCXByaXZhdGUgZmluYWwgS21sRGlzcGxheVNlbGVjdGlvbiBkaXNwbGF5U2VsZWN0aW9uID0gCisJCW5ldyBLbWxEaXNwbGF5U2VsZWN0aW9uKCk7CisJLyoqCisJICogcmVtZW1iZXIgaWYgd2UgaGF2ZSBpc3NzdWVkIGEgZGlzcGxheUFyZWEgY21kCisJICogc28gd2UgY2FuIGNsZWFuIGl0IHVwLgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBkaWREaXNwbGF5QXJlYSA9IGZhbHNlOworCS8qKgorCSAqIAorCSAqIENvbnN0cnVjdG9yLiAKKwkgKiAKKwkgKiAtIHNldHVwIHRvIGxpc3RlbiBmb3IgU2ltdWxhdGlvbk1hbmFnZXIgZXZlbnRzCisJICogLSBjaGVjayBpZiBleGlzdGluZyBzaW11bGF0aW9ucy4KKwkgKiBAcGFyYW0gZ2VWaWV3ICBHVUkgY2xhc3MgdGhhdCBpcyBpbnZva2luZyB1cy4KKwkgKi8KKwlwdWJsaWMgR0VJbnRlcmZhY2UoR0VWaWV3IGdlVmlldykgeworCQkKKwkJR0VMb2cuZGVidWcodGhpcywiY29uc3RydWN0b3I6ICIpOworCQkKKwkJdGhpcy5nZVZpZXcgPSBnZVZpZXc7CisJCUFzcGVjdC5zZXR1cCgpOworCQlhY3RpdmVTaW11bGF0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZyxHRVNpbUVudHJ5PigxKTsKKwkJCisJCQorCQkKKwl9CisKKwkvKioKKwkgKiBjYWxsZWQgYnkgR0VWaWV3IHRvIGRvIGFueSBpbml0aWFsaXphdGlvbiAKKwkgKiBhZnRlciB3ZSBoYXZlIHNldHVwIHRoZSBHVUkgZW52aXJvbm1lbnQKKwkgKgorCSAqIEl0IHdpbGwgc3RhcnR1cCB0aGUgc2VydmxldCB3ZWIgc2VydmVyIGlmIHBvc3NpYmxlCisJICogCisJICogQHJldHVybiB0cnVlIGlmIGluaXRpYWxpemF0aW9uIGlzIHN1Y2Nlc3NmdWwKKwkgKiAKKwkgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpbml0KCkgeworICAgIAlib29sZWFuIG9rID0gdHJ1ZTsKKyAgICAJYm9vbGVhbiBva0tNTCA9IHRydWU7CisgICAgCVNpbXVsYXRpb25NYW5hZ2VyIHNpbXVsYXRpb25NYW5hZ2VyID0gU2ltdWxhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpOworCQlzaW11bGF0aW9uTWFuYWdlci5hZGRTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyKHRoaXMpOworCQlMaXN0PElTaW11bGF0aW9uPmxpc3QgPSBzaW11bGF0aW9uTWFuYWdlci5nZXRBY3RpdmVTaW11bGF0aW9ucygpOworCQlib29sZWFuIGF1dG9sb2cgPSBHRVByZWZlcmVuY2VQYWdlLmlzQXV0b0xvZ2dpbmcoKTsKKwkJZm9yIChJU2ltdWxhdGlvbiBzaW06IGxpc3QpIHsKKwkJCVN0cmluZyBuYW1lID0gZ2V0U2ltdWxhdGlvbklkKHNpbSk7CisJCSAgICBHRUxvZy5kZWJ1Zyh0aGlzLCJzaW11bGF0aW9uQWRkZWQ6ICIrbmFtZSsiICIrc2ltKTsJCQkKKwkJCXNldEFjdGl2ZShzaW0sYXV0b2xvZyk7CQkJCisJCX0KKyAgICAJLy8gY2hlY2sgZm9yIHZhbGlkIHdlYiBzZXJ2ZXIKKwkJU3RyaW5nIHVybCA9IFN0ZW1LbWwuaW5pdFdlYlNlcnZlcigpOworCQlHRUxvZy5kZWJ1Zyh0aGlzLCJXZWIgc2VydmVyIFVSTDogIit1cmwpOworCQlpZiAodXJsID09IG51bGwgKSB7CisJCQlzZXRFcnJvck1lc3NhZ2UoIlVuYWJsZSB0byBhY2Nlc3MgV2ViU2VydmVyIik7CisJCQlvayA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJb2tLTUwgPSBTdGVtS21sLnZlcmlmeUdFKCk7CQkJCisJCQkvLyBoYW5kbGUgdW5kZWZpbmVkIEtNTAorCQkJaWYgKCEgb2tLTUwpIHsJCisJCQkJc2V0RXJyb3JNZXNzYWdlKCJHb29nbGVFYXJ0aCBLTUwgZmlsZXMgYXJlIG5vdCBkZWZpbmVkIik7CisJCQkJCisJCQl9CisJCX0KKwkJaWYgKCFvayB8fCAhb2tLTUwpIHsKKwkJCS8vIGNoZWNrIGlmIHByZWZlcmVuY2VzIHdpbGwgd29yayB3aXRoIG5vIHdlYiAKKwkJCS8vIHNlcnZlciBvciBubyBLTkwgZmlsZSBkZWZpbml0aW9uCisJCQlvayA9IGNoZWNrUHJlZmVyZW5jZXModXJsLG9rS01MKTsKKwkJCWlmICghb2spIHsKKwkJCQlHRUxvZy5kZWJ1ZyhnZXRFcnJvck1lc3NhZ2UoKSk7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBvazsKKwkJCisJfQorCisgICAgLyoqCisgICAgICogdmVyaWZ5IChhbmQgY2hhbmdlKSB0aGUgcHJlZmVyZW5jZXMgYmFzZWQgb24gdGhlIAorICAgICAqIGVudmlyb25tZW50LiAgCisgICAgICogCisgICAgICogSWYgYSB3ZWJzZXJ2ZXIgaXMgbm90IGF2YWlsYWJsZSBvciBpZiBnb29nbGVlYXJ0aCAKKyAgICAgKiBoYXMgbm90IGJlZW4gaW5zdGFsbGVkIHRoZW4gaXQgd2lsbCBsaW1pdCB0aGUgCisgICAgICogY29tbXVuaWNhdGlvbiBtZXRob2RzIHRvIG5vdCB1c2UgYSB3ZWJzZXJ2ZSBvciAKKyAgICAgKiBub3QgdHJ5IHRvIGxhdW5jaCB0aGUga21sIGZpbGUuCisgICAgICogCisgICAgICogQHBhcmFtIHVybCBVUkwgZm9yIHdlYiBzZXJ2ZXIgb3IgbnVsbAorICAgICAqIEBwYXJhbSBva0dFIGZhbHNlIGlmIGdvb2dsZUVhcnRoIG5vdCBpbnN0YWxsZWQKKyAgICAgKiBAcmV0dXJuIGZhbHNlIGlmIG5vdCBPSyBhbmQgY2hhbmdlcyBoYWQgdG8gYmUgbWFkZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1ByZWZlcmVuY2VzKFN0cmluZyB1cmwsYm9vbGVhbiBva0dFKSB7CisgICAgCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisgICAgCWludCBtZXRob2QgPSBHRVByZWZlcmVuY2VQYWdlLmdldE1ldGhvZCgpOworICAgIAlpbnQgbmV3TWV0aG9kID0gLTE7CisJCXN3aXRjaCAobWV0aG9kKSB7CQkJCQorCQkJY2FzZSBHRVByZWZlcmVuY2VQYWdlLk1fTE9HX09OTFk6CisJCQkJLy8gdGhpcyBtZXRob2QgYWx3YXkgd29ya3MKKwkJCQlyZXN1bHQgPSB0cnVlOworCQkgICAgICAgIGJyZWFrOworCQkJY2FzZSBHRVByZWZlcmVuY2VQYWdlLk1fTE9HX1NFUlZMRVQ6CisJCQkJLy8gdGhpcyBtZXRob2Qgd2lsbCBub3Qgd29yayBpZiBubyBzZXJ2ZXIKKwkJCQlyZXN1bHQgPSBmYWxzZTsgCisJCQkJCisJCQkJaWYgKCB1cmwgPT0gbnVsbCAmJiBva0dFKSB7CisJCQkJCW5ld01ldGhvZCA9IEdFUHJlZmVyZW5jZVBhZ2UuTV9BVVRPX0xBVU5DSDsKKwkJCQkJZXJyb3JNZXNzYWdlID0gIk5vIFdlYlNlcnZlcjogQ2hhbmdlZCB0byBkaXJlY3RseSBsYXVuY2ggS01MIjsKKwkJCQkJCisJCQkJfSBlbHNlIHsKKwkJCQkJbmV3TWV0aG9kID0gR0VQcmVmZXJlbmNlUGFnZS5NX0xPR19PTkxZOworCQkJCQllcnJvck1lc3NhZ2UgPSAiS01MIGlzIG5vdCByZWNvZ25pemVkLCBDaGFuZ2VkIHRvIG9ubHkgTG9nIGZpbGVzIjsKKwkJCQl9CQkJCQkKKwkJCQkKKwkJICAgICAgICBicmVhazsKKwkJCWNhc2UgR0VQcmVmZXJlbmNlUGFnZS5NX0FTWU5DX1NFUlZMRVQ6CisvLwkJCQkgdGhpcyBtZXRob2Qgd2lsbCBub3Qgd29yayBpZiBubyBzZXJ2ZXIKKwkJCQkJCQkJCisJCQkJaWYgKCB1cmwgPT0gbnVsbCAmJiBva0dFKSB7CisJCQkJCW5ld01ldGhvZCA9IEdFUHJlZmVyZW5jZVBhZ2UuTV9BVVRPX0xBVU5DSDsKKwkJCQkJZXJyb3JNZXNzYWdlID0gIk5vIFdlYlNlcnZlcjogQ2hhbmdlZCB0byBkaXJlY3RseSBsYXVuY2ggS01MIjsKKwkJCQkJCisJCQkJfSBlbHNlIHsKKwkJCQkJbmV3TWV0aG9kID0gR0VQcmVmZXJlbmNlUGFnZS5NX0xPR19PTkxZOworCQkJCQllcnJvck1lc3NhZ2UgPSAiS01MIGlzIG5vdCByZWNvZ25pemVkLCBDaGFuZ2VkIHRvIG9ubHkgTG9nIGZpbGVzIjsKKwkJCQl9CQkJCQkKKwkJCQkKKwkJICAgICAgICBicmVhazsKKwkJCWNhc2UgR0VQcmVmZXJlbmNlUGFnZS5NX0FVVE9fTEFVTkNIOgorICAgICAgICAgICAgICAgICAvLwkgdGhpcyBtZXRob2Qgd2lsbCBub3Qgd29yayBpZiBLTUwgaXMgdW5rbm93bgorCQkJCSAgaWYgKCEgb2tHRSkgeworCQkJCQkgIG5ld01ldGhvZCA9IEdFUHJlZmVyZW5jZVBhZ2UuTV9MT0dfT05MWTsKKwkJCQkJCWVycm9yTWVzc2FnZSA9ICJLTUwgaXMgbm90IHJlY29nbml6ZWQsIENoYW5nZWQgdG8gb25seSBMb2cgZmlsZXMiOworCQkJCSAgfQorCQkgIAkJYnJlYWs7CQorCQkJY2FzZSBHRVByZWZlcmVuY2VQYWdlLk1fTUFOVUFMX0RJU1BMQVk6CisJCQkJLy8gdGhpcyBtZXRob2QgaXMgYWx3YXlzIE9LCisJCQkJYnJlYWs7CisKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgICAgCQorCQl9CisJCWlmIChuZXdNZXRob2QgIT0gLTEpIHsKKwkJCUdFUHJlZmVyZW5jZVBhZ2Uuc2V0TWV0aG9kKG5ld01ldGhvZCk7CisJCQlyZXN1bHQgPSBmYWxzZTsgIC8vIHRlbGwgYWJvdXQgY2hhbmdlCisJCX0KKyAgICAJcmV0dXJuIHJlc3VsdDsKKyAgICB9CisJLyoqCisJICogV2UgZ2V0IGhlcmUgYmVjYXVzZSB3ZSBhcmUgbGlzdGVuaW5nIGZvciBTaW11bGF0aW9uc0NoYW5nZWQgCisJICogZXZlbnRzIGZyb20gdGhlIFNpbXVsYXRpb24gTWFuYWdlciBhbmQgb25lIG9jY3VyZWQuIAorCSAqIFdlIHdpbGwgY2hlY2sgZm9yIGEgU2ltdWxhdGlvbiBiZWluZyByZW1vdmVkIGFuZCBpZiBzbyBjaGVjayBpZiAKKwkgKiBpdCBpcyBvbmUgb2Ygb3VyIGFjdGl2ZSBzaW11bGF0aW9uIGFuZCBpZiBzbyByZW1vdmUgaXQuCisJICogSWYgYSBzaW11bGF0aW9uIGlzIGJlaW5nIGFkZGVkLCBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mCisJICogYWN0aXZlIHNpbXVsYXRpb25zLgorCSAqIAkgCisJICovCisJcHVibGljIHZvaWQgc2ltdWxhdGlvbnNDaGFuZ2VkKFNpbXVsYXRpb25NYW5hZ2VyRXZlbnQgZXZlbnQpIHsKKwkJR0VMb2cuZGVidWcodGhpcy5nZXRDbGFzcygpLCAic2ltdWxhdGlvbnNDaGFuZ2VkOiAiKTsKKwkJLy8gR0VMb2cubWVtb3J5KCk7CisJCWlmIChldmVudC5nZXRTaW11bGF0aW9uc1JlbW92ZWQoKS5sZW5ndGggPiAwKSB7CisJCQlmb3IgKElTaW11bGF0aW9uIHNpbSA6IGV2ZW50LmdldFNpbXVsYXRpb25zUmVtb3ZlZCgpKSB7CisKKwkJCQlTdHJpbmcgaWQgPSBnZXRTaW11bGF0aW9uSWQoc2ltKTsKKwkJCQlHRUxvZy5kZWJ1Zyh0aGlzLmdldENsYXNzKCksICJzaW11bGF0aW9uUmVtb3ZlZDogIiArIGlkICsgIiAiCisJCQkJCQkrIHNpbSk7CisKKwkJCQlHRVNpbUVudHJ5IGV4aXN0aW5nID0gYWN0aXZlU2ltdWxhdGlvbnMuZ2V0KGlkKTsKKwkJCQlpZiAoZXhpc3RpbmcgIT0gbnVsbCkgeworCQkJCQlib29sZWFuIGFjdGl2ZSA9IGlzQWN0aXZlVmlldyhzaW0pOworCQkJCQlzZXRBY3RpdmUoc2ltLCBmYWxzZSk7CisJCQkJCWFjdGl2ZVNpbXVsYXRpb25zLnJlbW92ZShpZCk7CisJCQkJCWlmIChhY3RpdmUpIHsKKwkJCQkJCXN0b3BHRSgpOworCQkJCQl9CisJCQkJCUdFTG9nLmRlYnVnKHRoaXMsICJBY3RpdmUgc2ltdWxhdGlvbiByZW1vdmVkOiAiICsgaWQpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChldmVudC5nZXRTaW11bGF0aW9uc0FkZGVkKCkubGVuZ3RoID4gMCkgeworCQkJYm9vbGVhbiBhdXRvbG9nID0gR0VQcmVmZXJlbmNlUGFnZS5pc0F1dG9Mb2dnaW5nKCk7CisJCQlmb3IgKElTaW11bGF0aW9uIHNpbSA6IGV2ZW50LmdldFNpbXVsYXRpb25zQWRkZWQoKSkgeworCQkJCVN0cmluZyBuYW1lID0gZ2V0U2ltdWxhdGlvbklkKHNpbSk7CisJCQkJR0VMb2cuZGVidWcodGhpcywgInNpbXVsYXRpb25BZGRlZDogIiArIG5hbWUgKyAiICIgKyBzaW0pOworCQkJCUdFU2ltRW50cnkgZXhpc3RpbmcgPSBhY3RpdmVTaW11bGF0aW9ucy5nZXQobmFtZSk7CisJCQkJaWYgKGV4aXN0aW5nID09IG51bGwpIHsKKwkJCQkJYm9vbGVhbiBvayA9IHNldEFjdGl2ZShzaW0sIGF1dG9sb2cpOworCQkJCQlpZiAoIW9rKSB7CisJCQkJCQlpZiAoIWF1dG9sb2cpIHsKKwkJCQkJCQlnZVZpZXcuc2hvd01lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKKwkJCQkJCX0gCisJCQkJCX0KKwkJCQl9CisKKwkJCX0KKwkJfQorCX0gLy8gc2ltdWxhdGlvbnNDaGFuZ2VkCisgICAgCisJLyoqCisJICogQ2FsbGVkIGJ5IEdFVmlldy5kaXNwb3NlKCkKKwkgKiAKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlTaW11bGF0aW9uTWFuYWdlciBzaW11bGF0aW9uTWFuYWdlciA9IFNpbXVsYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKTsKKwkJTGlzdDxJU2ltdWxhdGlvbj4gbGlzdCA9c2ltdWxhdGlvbk1hbmFnZXIuZ2V0QWN0aXZlU2ltdWxhdGlvbnMoKTsKKwkJZm9yIChJU2ltdWxhdGlvbiBzaW06bGlzdCkgeworCQkJc2ltLnJlbW92ZVNpbXVsYXRpb25MaXN0ZW5lcih0aGlzKTsKKwkJfQorCQlzaW11bGF0aW9uTWFuYWdlci5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKKwkJaWYgKGFjdGl2ZVZpZXcgIT0gbnVsbCkgeworCQkJLy8gR0UgaXMgdGFsa2luZyB0byB1cworCQkJc3RvcEdFKCk7CisJCQkvLyB3YWl0IGEgYml0IGJlZm9yZSB3ZSBjb250aW51ZSAKKwkJCS8vIGJlY2F1c2UgdGhpcyB3aWxsIGtpbGwgdGhlIHdlYnNlcnZlciAKKwkJCS8vIHRoYXQgR29vZ2xlRWFydGggaXMgdGFsa2luZyB0by4KKwkJCXRyeSB7CisJCQkJVGhyZWFkLnNsZWVwKDUwMDApOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJfQorCX0KKyAgICAvKioKKwkgKiBMaXN0ZW5lciBmb3IgZXZlbnRzIHRoYXQgaGFwcGVuIGluIGEgc3BlY2lmaWMgU2ltdWxhdGlvbi4KKwkgKiAKKwkgKiA8Y29kZT4KKwkgKiBUaGlzIGdldHMgY2FsbGVkIGZvciB0aGUgZm9sbG93aW5nIGV2ZW50IHN0YXRlcworCSAqICAgIFNpbXVsYXRpb25TdGF0ZTogUlVOTklORworCSAqICAgICAgICAgICAgICAgICAgICAgQ09NUExFVEVEX0NZQ0xFCisJICogICAgICAgICAgICAgICAgICAgICBQQVVTRUQgIAorCSAqIFdlIGFyZSBpbnRlcmVzdGVkIGluIENvbXBsZXRlZF9DeWNsZSAKKwkgKiAKKwkgKiBAcGFyYW0gZXZlbnQKKwkgKiAgICAgICAgICAgIHRoZSBldmVudCB0aGF0IHJlY29yZHMgd2hhdCBoYXBwZW5lZCB0byB0aGUgbWFuYWdlci4KKwkgKi8KKwkKKwlwdWJsaWMgdm9pZCBzaW11bGF0aW9uQ2hhbmdlZChTaW11bGF0aW9uRXZlbnQgZXZlbnQpIHsKKwkJCisJCQorCQl0cnkgeworCQkJSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IGV2ZW50LmdldFNpbXVsYXRpb24oKTsKKwkJCVNpbXVsYXRpb25TdGF0ZSBzdGF0ZSA9IGV2ZW50LmdldFNpbXVsYXRpb25TdGF0ZSgpOworCQkJU3RyaW5nIGlkID0gZ2V0U2ltdWxhdGlvbklkKHNpbXVsYXRpb24pOworCQkJR0VTaW1FbnRyeSBleGlzdGluZyA9IGFjdGl2ZVNpbXVsYXRpb25zLmdldChpZCk7CisgICAgICAgICAgICBTZXF1ZW5jZXIgc2VxID0gc2ltdWxhdGlvbi5nZXRTY2VuYXJpbygpLmdldFNlcXVlbmNlcigpOworCQkJICAgICAgICAgIAorICAgICAgICAgICAgCisJCQlpZiAoc3RhdGUgPT0gU2ltdWxhdGlvblN0YXRlLkNPTVBMRVRFRF9DWUNMRSkgewkJCQkKKwkJCQlpZiAoZXhpc3RpbmcgPT0gbnVsbCApIHsKKwkJCQkJR0VMb2cuZGVidWcodGhpcywiU2ltdWxhdGlvbiAiK2lkKyIgbm90IGFjdGl2ZSBmb3IgR0UuIik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJLy9leGlzdGluZy5jeWNsZSsrOworCQkJCWludCBjeWNsZSA9IHNlcS5nZXRDeWNsZSgpOworCQkJCUdFTG9nLmRlYnVnKHRoaXMsaWQrIiBTdGF0ZT0iK3N0YXRlKyIgY3ljbGU9IitjeWNsZSk7IAorCQkJCXByb2Nlc3NDeWNsZShzaW11bGF0aW9uLHN0YXRlKTsKKwkJCQlnZVZpZXcucmVmcmVzaCgpOworCQkJfSBlbHNlIHsKKwkJCQlHRUxvZy5kZWJ1Zyh0aGlzLGlkKyIgU3RhdGU9IitzdGF0ZSk7IAorCQkJfQorCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlHRUxvZy5lcnJvcigic2ltdWxhdGlvbkNoYW5nZWQ6IEZhaWx1cmUgIiwgZSk7CisJCX0KKwl9CisJCisJLyoqCisJICogSGFuZGxlIHRoZSBzaW11bGF0aW9uIGV2ZW50IHRoYXQganVzdCBvY2N1cmVkCisJICogVGhpcyBpcyB3aGVyZSB0aGUgcmVhbCBwcm9jZXNzaW5nIHN0YXJ0cy4KKwkgKiBJZiB3ZSBoYXZlbid0IGFscmVhZHksIHdlIGJ1aWxkIGEgbWFwIG9mIHRoZSAKKwkgKiBnZW9ncmFwaGljYWwgaW5mb3JtYXRpb24uCisJICogVGhlbiBkZXRlcm1pbmUgaWYgd2Ugd2FudCB0byBkbyBhbnl0aGluZyBvbiB0aGlzIGN5Y2xlIGFuZCAKKwkgKiBkZXRlcm1pbmUgaG93IHdlIHdhbnQgdG8gY29tdW5pY2F0ZSB3aXRoIEdFLiAgCisJICogTmV4dCB3ZSBydW4gdGhydSB0aGUgc2NlbmFyaW8gbm9kZXMgYW5kIHBpY2sgdXAKKwkgKiB0aGUgY3VycmVudCBkaXNlYXNlIHN0YXRlIGZvciBlYWNoIG5vZGUuICAKKwkgKiBGaW5hbGx5IGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gaXMgc2VudCB0byBhIAorCSAqIGJhY2tncm91bmQgbWV0aG9kIHRoYXQgYnVpbGRzIHRoZSBLTUwgZmlsZSB0aGF0IGlzCisJICogc2VudCB0byBHb29nbGVFYXJ0aC4gICAKKwkgKiAgCisJICogQHBhcmFtIHNpbXVsYXRpb24gdGhhdCBldmVudCBpcyBmb3IKKwkgKiBAcGFyYW0gc3RhdGUgIEN1cnJlbnQgc3RhdGUgYmVpbmcgcHJvY2Vzc2VkCisJICogCisJICovCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NDeWNsZShJU2ltdWxhdGlvbiBzaW11bGF0aW9uLCBTaW11bGF0aW9uU3RhdGUgc3RhdGUgKSB7CisJCQorCQlTdHJpbmcga21sZm4gPSBudWxsOwkJCisJCWJvb2xlYW4gZG9pdCA9IGZhbHNlOworCQlpbnQgbnRoID0gR0VQcmVmZXJlbmNlUGFnZS5nZXRXaGljaEN5Y2xlKCk7CisJCQorCQkKKwkJCQorCQlTdHJpbmcgaWQgPSBnZXRTaW11bGF0aW9uSWQoc2ltdWxhdGlvbik7CisJCUdFU2ltRW50cnkgZXhpc3RpbmcgPSBhY3RpdmVTaW11bGF0aW9ucy5nZXQoaWQpOworCQlpZiAoZXhpc3RpbmcgPT0gbnVsbCkgeworCQkJR0VMb2cuZGVidWcodGhpcywiU2ltdWxhdGlvbiAiK2lkKyIgbm90IGFjdGl2ZSBmb3IgR0UuIik7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCQorCQlpbnQgbWV0aG9kID0gZXhpc3RpbmcuZ2V0TWV0aG9kKCk7CisJCVN0cmluZyBlbnRyeUZvbGRlciA9IGV4aXN0aW5nLmdldExvZ0ZvbGRlcigpOworCQlTY2VuYXJpbyBzY2VuYXJpbyA9IHNpbXVsYXRpb24uZ2V0U2NlbmFyaW8oKTsKKwkJU2VxdWVuY2VyIHNlcSA9IHNjZW5hcmlvLmdldFNlcXVlbmNlcigpOworLy8JCSBnZXQgY3ljbGUgZnJvbSBzaW11bGF0aW9uCisJCWludCBjeWNsZSA9IHNlcS5nZXRDeWNsZSgpOworCQlpZiAoR0VMb2cubWVtb3J5Q2hlY2soMC44KSApIHsKKwkJCUdFTG9nLmRlYnVnKHRoaXMsIlByb2Nlc3MgZm9yIGN5Y2xlICIrCisJCQkJCWN5Y2xlKyIgc2tpcHBlZC4gTWVtb3J5IGxvdyIpOworCQkJcmV0dXJuOworCQl9CQkKKwkJLy9pZiB3ZSBoYXZlbid0IHlldCwgdGhlbiBidWlsZCBnZW8gbWFwCisJCWlmICgoc3RlbU1hcCA9IGV4aXN0aW5nLmdldFN0ZW1NYXAoKSkgPT0gbnVsbCApIHsKKwkJCWlmICghIEdFTG9nLm1lbW9yeUNoZWNrKDAuOCkgKSB7CisJCQkJc3RlbU1hcCA9IGJ1aWxkTWFwKHNpbXVsYXRpb24pOworCQkJfQorCQkJaWYgKHN0ZW1NYXAgPT0gbnVsbCkgeworCQkJCUdFTG9nLmRlYnVnKHRoaXMuZ2V0Q2xhc3MoKSwiVW5hYmxlIHRvIGJ1aWxkIHN0ZW1NYXAiKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlkb2l0ID0gdHJ1ZTsKKwkJCWV4aXN0aW5nLnNldFN0ZW1NYXAoc3RlbU1hcCk7CQkJCisJCX0KKwkJCisJCVN0ZW1LbWwgc3RlbUttbCA9IGV4aXN0aW5nLmdldFN0ZW1LbWwoKTsKKwkJaWYgKHN0ZW1LbWwgPT0gbnVsbCkgeworCQkJc3RlbUttbCA9IG5ldyBTdGVtS21sKCk7CisJCQlleGlzdGluZy5zZXRTdGVtS21sKHN0ZW1LbWwpOwkJCQorCQkJc3RlbUttbC5pbml0KCk7CisJCX0KKwkgICAgLy8gaWYgTWFudWFsRGlzcGxheSBhbmQgbm8gdXNlciByZXF1ZXN0CisJCWlmIChtZXRob2QgPT0gR0VQcmVmZXJlbmNlUGFnZS5NX01BTlVBTF9ESVNQTEFZICYmCisJCQkJISBtYW51YWxSZXF1ZXN0ICkgeworCQkJcmV0dXJuOworCQl9CisgICAgICAgIAorCQlpZiAoY3ljbGUgPT0gMCB8fCBudGggPT0gMSApIHsKKwkJCWRvaXQgPSB0cnVlOworCQl9IGVsc2UgaWYgKG50aCA+IDEgJiYgY3ljbGUlbnRoID09IDAgKSB7CisJCQlkb2l0ID0gdHJ1ZTsKKwkJfQorCisJCS8vIEdldCBhc3BlY3QgdGhhdCB3ZSB3YW50IHZpZXcgb2YKKwkJQXNwZWN0IGFzcGVjdCA9IGdldEFzcGVjdFRvRGlzcGxheShzaW11bGF0aW9uKTsKKwkJaWYgKG1hbnVhbFJlcXVlc3QpIAorCQkJZG9pdCA9IHRydWU7CisJCS8vIGRlY2lkZSBob3cgd2Ugd2FudCB0byBwcm9jZXNzIGl0CisJCWlmIChkb2l0KSB7CQorCQkJdHJ5IHsJCQkJCisJCQkJYm9vbGVhbiBsYXVuY2ggPSBmYWxzZTsJCisJCQkJYm9vbGVhbiByZW5hbWUgPSBmYWxzZTsKKwkJCQlzd2l0Y2ggKG1ldGhvZCkgewkJCQkKKwkJCQkJY2FzZSBHRVByZWZlcmVuY2VQYWdlLk1fTE9HX09OTFk6CisJCQkJCQkvLyBsb2cgdGhlIGZpbGUgYnV0IG5vIGxhdW5jaCBvciBuZXRsaW5rCQkJCQkJCisJCQkJCQlpZiAoZW50cnlGb2xkZXIgIT0gbnVsbCkgeworCQkJCQkJCWttbGZuID0gU3RlbUttbC5nZXRDb250cm9sRk4oZW50cnlGb2xkZXIsCisJCQkJCQkJCQljb250cm9sVGVtcGxhdGUsYXNwZWN0LCBjeWNsZSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWRvaXQgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkgICAgICAgIGJyZWFrOworCQkJCQljYXNlIEdFUHJlZmVyZW5jZVBhZ2UuTV9MT0dfU0VSVkxFVDoKKwkJCQkJCS8vIGxvZyBmaWxlIGFuZCBsYXVuY2ggYSBuZXRsaW5rIHRvIGRpc3BsYXkKKwkJCQkJCWlmICggbWFudWFsUmVxdWVzdCApIHsKKwkJCQkJCQlkb2l0ID0gdHJ1ZTsJCQkJCQkJCisJCQkJCQkJaWYgKGFjdGl2ZVZpZXcgPT0gbnVsbCkgewkJCQkJCQkJCQorCQkJCQkJCQlsYXVuY2ggPSB0cnVlOworCQkJCQkJCQlrbWxmbiA9IFN0ZW1LbWwuZ2V0Q29udHJvbEZpbGUoKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlrbWxmbiA9IFN0ZW1LbWwuZ2V0Q29udHJvbEZOKGVudHJ5Rm9sZGVyLAorCQkJCQkJCQkJCWNvbnRyb2xUZW1wbGF0ZSxhc3BlY3QsIGN5Y2xlKTsJCisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmICghIGlkLmVxdWFscyhhY3RpdmVWaWV3KSkgeyAKKwkJCQkJCQlkb2l0ID0gZmFsc2U7CisJCQkJCQkJR0VMb2cuZGVidWcodGhpcywiVW5hYmxlIHRvIGRpc3BsYXkgaWQgIitpZCk7CisJCQkJCQl9IGVsc2UgaWYgKGVudHJ5Rm9sZGVyICE9IG51bGwpIHsKKwkJCQkJCQlrbWxmbiA9IFN0ZW1LbWwuZ2V0Q29udHJvbEZOKGVudHJ5Rm9sZGVyLAorCQkJCQkJCQkJY29udHJvbFRlbXBsYXRlLGFzcGVjdCwgY3ljbGUpOwkJCQkJCQkKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZG9pdCA9IGZhbHNlOworCQkJCQkJCUdFTG9nLmRlYnVnKHRoaXMsIlVuYWJsZSB0byBkaXNwbGF5LiBJbnZhbGlkIGZvbGRlciIpOworCQkJCQkJfQorCQkJCSAgICAgICAgYnJlYWs7CisJCQkJCWNhc2UgR0VQcmVmZXJlbmNlUGFnZS5NX0FTWU5DX1NFUlZMRVQ6CQkJCQkJCisKKwkJCQkJCWlmICggbWFudWFsUmVxdWVzdCApIHsKKwkJCQkJCQlpZiAoYWN0aXZlVmlldyAhPSBudWxsKSB7CisJCQkJCQkJCWRvaXQgPSBmYWxzZTsKKwkJCQkJCQkJR0VMb2cuZGVidWcodGhpcywiVW5hYmxlIHRvIGRvIG1hbnVhbCBkaXNwbGF5Iik7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJbGF1bmNoID0gdHJ1ZTsKKwkJCQkJCQkJa21sZm4gPSBTdGVtS21sLmdldENvbnRyb2xGaWxlKCk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAoISBpZC5lcXVhbHMoYWN0aXZlVmlldykpIHsgCQkJCQkJCisJCQkJCQkJICAgZG9pdCA9IGZhbHNlOworCQkJCQkJCSAgIEdFTG9nLmRlYnVnKHRoaXMsIk5vdCBhbiBhY3RpdmUgU2ltdWxhdGlvbiBpZDogIitpZCsiIGFjdGl2ZVZpZXc6ICIrCisJCQkJCQkJCQkgICBhY3RpdmVWaWV3KTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlrbWxmbiA9IFN0ZW1LbWwuZ2V0Q29udHJvbEZpbGUoKTsKKwkJCQkJCQkJcmVuYW1lID0gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJICAgICAgICBicmVhazsKKwkJCQkJY2FzZSBHRVByZWZlcmVuY2VQYWdlLk1fQVVUT19MQVVOQ0g6CisJCQkJICAJCS8vIGJ1aWxkIGNvbnRyb2wua21sIGFuZCBsYXVuY2ggaXQKKwkJCQkJCWxhdW5jaCA9IHRydWU7CisJCQkJCQlrbWxmbiA9IFN0ZW1LbWwuZ2V0Q29udHJvbEZpbGUoKTsKKwkJCQkJCWlmICggISBtYW51YWxSZXF1ZXN0ICYmICghIGlkLmVxdWFscyhhY3RpdmVWaWV3KSkgKSB7CQkJCQkJCQorCQkJCQkJCWRvaXQgPSBmYWxzZTsKKwkJCQkJCQlHRUxvZy5kZWJ1Zyh0aGlzLCJJbnZhbGlkLiBpZDogIitpZCsKKwkJCQkJCQkJCSAgICAgICAgICAiIGFjdGl2ZVZpZXc6ICIrYWN0aXZlVmlldyk7CisJCQkJCQl9IAorCQkJCSAgCQlicmVhazsJCisJCQkJCWNhc2UgR0VQcmVmZXJlbmNlUGFnZS5NX01BTlVBTF9ESVNQTEFZOgorCQkJCQkJaWYgKG1hbnVhbFJlcXVlc3QpIHsKKwkJCQkJCQlHRUxvZy5kZWJ1Zyh0aGlzLCJEbyBtYW51YWwgZGlzcGxheSIpOworCQkJCQkJCWxhdW5jaCA9IHRydWU7CisJCQkJCQkJa21sZm4gPSBTdGVtS21sLmdldENvbnRyb2xGaWxlKCk7CisJCQkJCQkJZG9pdCA9IHRydWU7CisJCQkJCQkJCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWRvaXQgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQorCQkJCSAgICBkZWZhdWx0OgorCQkJCSAgICAgICAgCQorCQkJCX0KKwkJCQltYW51YWxSZXF1ZXN0ID0gZmFsc2U7CisJCQkJaWYgKGRvaXQpIHsKKwkJCQkJLy8JIHN0b3JlIHRoZSBjdXJyZW50IFNFSVIgZGF0YSBpbnRvIEdFRGF0YQorCQkJCQlzdG9yZUFzcGVjdHMoc2ltdWxhdGlvbiwgc3RlbU1hcCk7CisJCQkJCQorCQkJCQkvLyBnZW5lcmF0ZSB0aGUgS01MIGZpbGUKKwkJCQkJR0VMb2cuZGVidWcodGhpcy5nZXRDbGFzcygpLCJHZW5lcmF0ZUtNTCBmb3IgaWQ6ICIrCisJCQkJCQkJaWQgKyAiIGFzcGVjdCAiK2FzcGVjdC50b1N0cmluZygpKTsKKwkJCQkKKwkJCQkJZ2VuZXJhdGVLTUwoa21sZm4sIHN0ZW1LbWwsc3RlbU1hcCwgYXNwZWN0LCBjeWNsZSxsYXVuY2gscmVuYW1lKTsKKwkJCQkJCisJCQkJCQorCQkJCX0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CQkJCQorCQkJCUdFTG9nLmVycm9yKCJwcm9jZXNzQ3ljbGUoKTogRmFpbHVyZSBjcmVhdGluZyBLTUwgIixlKTsKKwkJCQlhY3RpdmVTaW11bGF0aW9ucy5yZW1vdmUoaWQpOworCQkJfQorCQl9CisJCQorCQkvL0dFTG9nLmRlYnVnKHRoaXMuZ2V0Q2xhc3MoKSwiRG9uZS4gY3ljbGU9IitjeWNsZSk7CisJfQorCQorCQorCS8qKgorCSAqICBjYWxsZWQgYnkgR0VWaWV3IHRvIGRpc3BsYXkgdGhlIGN1cnJlbnQgbWFwIGZvciAKKwkgKiAgYSBzcGVjaWZpYyBhZG1pbiBhcmVhLgorCSAqIAorCSAqIEBwYXJhbSBhZG1pbkZpbGUgIEZpbGUgdGhhdCBjb250YWlucyBkZXNpcmVkIGRhdGEKKwkgKiBAcGFyYW0gc2VhcmNoICAgU3RyaW5nIHRoYXQgaXMgbWF0Y2hlZCBhZ2FpbnN0IGFyZWEgaWQKKwkgKiBAcGFyYW0gY2xlYXIgICAgSWYgdHJ1ZSB0aGVuIGNsZWFyIHRoZSBleGlzdGluZyBtYXAKKwkgKiBAcmV0dXJuICB0cnVlIGlmIGFibGUgdG8gZGlzcGxheSBtYXAgb3IgZmFsc2UgaWYgY291bGQgbm90LgorCSAqLwkKKwlwdWJsaWMgYm9vbGVhbiBkaXNwbGF5QXJlYSggU3RyaW5nIGFkbWluRmlsZSxTdHJpbmcgc2VhcmNoLCBib29sZWFuIGNsZWFyKSB7CisJCWRpc3BsYXlOb2RlID0gc2VhcmNoOworCQlkaWREaXNwbGF5QXJlYSA9IHRydWU7CisJCWVycm9yTWVzc2FnZSA9IG51bGw7CisJCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKKwkJdHJ5IHsKKyAgICAgICAgICAgIGlmIChjbGVhcikgCisgICAgICAgICAgICAJc3RlbU1hcE5vZGUgPSBudWxsOworICAgICAgICAgICAgCisJCQlHRUxvZy5kZWJ1Zyh0aGlzLCJkaXNwbGF5TWFwKCkgIithZG1pbkZpbGUrIiBzZWFyY2g6ICIrc2VhcmNoKTsKKwkJCWlmIChhZG1pbkZpbGUgPT0gbnVsbCkgewkJCQkKKwkJCQllcnJvck1lc3NhZ2UgPSAiQWRtaW5GaWxlIGFyZ3VtZW50IGlzIG51bGwiOworCQkJCUdFTG9nLmRlYnVnKHRoaXMsZXJyb3JNZXNzYWdlKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlTdHJpbmcgZm4gPSBTdGVtS21sLmdldERpc3BsYXlBcmVhRmlsZSgpOworCQkJCisJCQlTdGVtS21sIHN0ZW1LbWwgPSBuZXcgU3RlbUttbCgpOwkJCQkKKwkJCXN0ZW1LbWwuaW5pdCgpOwkJCQkKKwkJCS8vIHRoaXMgd2lsbCBjcmVhdGUgR0VEYXRhIGluc3RhbmNlcyB3aXRoIExhdExvbmcgZGF0YQorICAgICAgICAgICAgLy8gVGhlIExhdExvbmcgY29tZXMgZnJvbSBmaWxlIHJhdGhlciB0aGFuIHNpbXVsYXRpb24KKwkJCU1hcDxTdHJpbmcsR0VEYXRhPiBzdGVtTWFwID0gYnVpbGRNYXAoYWRtaW5GaWxlLHNlYXJjaCk7CisgICAgICAgICAgICBpZiAoc3RlbU1hcC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgCWVycm9yTWVzc2FnZSA9ICJTZWFyY2ggYXJndW1lbnQgIitzZWFyY2grCisgICAgICAgICAgICAJICAgICAgICIgZGlkIG5vdCBtYXRjaCBhbnkgYWRtaW4gYXJlYSBuYW1lLiI7CisgICAgICAgICAgICAJcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCQkJaWYgKHN0ZW1NYXBOb2RlID09IG51bGwpIHsKKwkJCQlzdGVtTWFwTm9kZSA9IHN0ZW1NYXA7CisJCQl9IGVsc2UgeworCQkJCXN0ZW1NYXBOb2RlLnB1dEFsbChzdGVtTWFwKTsKKwkJCX0KKworLy8JCQkgR2V0IGFzcGVjdCB0aGF0IHdlIHdhbnQgdmlldyBvZgorCQkJQXNwZWN0IGFzcGVjdCA9IEFzcGVjdC5nZXRBc3BlY3QoIlMiKTsgIAorCQkJLy8gZ2VuZXJhdGUgdGhlIEtNTCBmaWxlCQorCQkJYm9vbGVhbiByZW5hbWUgPSBmYWxzZTsKKyAgICAgICAgICAgIGludCBjeWNsZSA9IDA7CisJCQlib29sZWFuIGxhdW5jaCA9IHRydWU7CQkJCQorCQkJZ2VuZXJhdGVLTUwoZm4sc3RlbUttbCxzdGVtTWFwTm9kZSwgYXNwZWN0LAorCQkJCQljeWNsZSxsYXVuY2gscmVuYW1lKTsKKworCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKwkJCXJlc3VsdCA9IGZhbHNlOworCQkJR0VMb2cuZXJyb3IoIkRpc3BsYXlBcmVhIGZhaWx1cmUiLCBlKTsKKwkJfQorCisJCWRpc3BsYXlOb2RlID0gbnVsbDsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJLyoqCisJICogIGNhbGxlZCBieSBHRVZpZXcgdG8gZGlzcGxheSB0aGUgc3BlY2lmaWVkIGFyZWEKKwkgKiAgd2hlbiBhIFNlbGVjdGlvbiBldmVudCBpcyByZWNlaXZlZCBmcm9tIG1hcHZpZXcKKwkgKiAKKwkgKiBAcGFyYW0gcmVnaW9uIFRoZSBJZGVudGlmaWFibGUgZGVzY3JpYmluZyB0aGUgYWRtaW4gYXJlYSB0aGF0IAorCSAqICAgICAgICAgICAgICAgd2FzIHNlbGVjdGVkLgorCSAqIEBwYXJhbSBnc2UgIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhYm91dCB0aGUgc2VsZWN0aW9uCisJICogCisJICogQHJldHVybiAgdHJ1ZSBpZiBhYmxlIHRvIGRpc3BsYXkgbWFwIG9yIGZhbHNlIGlmIGNvdWxkIG5vdC4KKwkgKi8JCisJcHVibGljIGJvb2xlYW4gZGlzcGxheVNlbGVjdGlvbiggUmVnaW9uSW1wbCByZWdpb24sR2VvZ3JhcGhpY1NlbGVjdGlvbkVsZW1lbnRzIGdzZSkgeworICAgICAgICBkaWREaXNwbGF5QXJlYSA9IHRydWU7CisJCWVycm9yTWVzc2FnZSA9IG51bGw7CisJCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKKwkJdHJ5IHsgICAgICAgICAgIAorCQkJCisJCQlTdHJpbmcgZm4gPSBTdGVtS21sLmdldERpc3BsYXlBcmVhRmlsZSgpOworCQkJCisJCQlTdGVtS21sIHN0ZW1LbWwgPSBuZXcgU3RlbUttbCgpOwkJCQkKKwkJCXN0ZW1LbWwuaW5pdCgpOwkJCQkKKwkJCQorCQkJTWFwPFN0cmluZyxHRURhdGE+IHN0ZW1NYXAgPSBidWlsZFNlbGVjdGlvbk1hcChyZWdpb24sZ3NlKTsKKyAgICAgICAgICAgIGlmIChzdGVtTWFwID09IG51bGwgfHwgc3RlbU1hcC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgCXJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKwkJCWlmIChzdGVtTWFwTm9kZSA9PSBudWxsKSB7CisJCQkJc3RlbU1hcE5vZGUgPSBzdGVtTWFwOworCQkJfSBlbHNlIHsKKwkJCQkvL3N0ZW1NYXBOb2RlLnB1dEFsbChzdGVtTWFwKTsKKwkJCQlzdGVtTWFwTm9kZSA9IHN0ZW1NYXA7IC8vIGNsZWFyPz8/CisJCQl9CisKKy8vCQkJIEFzcGVjdCBub3QgdXNlZAorCQkJQXNwZWN0IGFzcGVjdCA9IG51bGw7ICAKKwkJCS8vIGdlbmVyYXRlIHRoZSBLTUwgZmlsZQorCQkJZGlzcGxheVNlbGVjdGlvbi5nZW5lcmF0ZVBvbHlnb25zKGZuLCBzdGVtTWFwTm9kZSxhc3BlY3QpOworCisvLwkJCSBsYXVuY2ggdGhlIGZpbGUgZm9yIEdvb2dsZUVhcnRoCQkJICAKKwkJCVN0ZW1LbWwubGF1bmNoKGZuKTsKKwkJCUdFTG9nLmRlYnVnKHRoaXMsIkdvb2dsZUVhcnRoIE1hcCAgc3VibWl0dGVkIik7CisgICAgICAgICAgICAKKwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXN1bHQgPSBmYWxzZTsKKwkJCUdFTG9nLmVycm9yKCJEaXNwbGF5QXJlYSBmYWlsdXJlIiwgZSk7CisJCX0KKworCQlkaXNwbGF5Tm9kZSA9IG51bGw7CisJCXJldHVybiByZXN1bHQ7CisJfQorCS8qKgorCSAqICBjYWxsZWQgYnkgR0VWaWV3IHRvIGRpc3BsYXkgdGhlIGN1cnJlbnQgbWFwIAorCSAqIFRoaXMgdmVyc2lvbiBzZXRzIGEgc3dpdGNoIHRvIGNhdXNlIAorCSAqIGEgZGlzcGxheSBvbiB0aGUgbmV4dCBjeWNsZSBpZiBzaW11bGF0aW9uIG9yCisJICogbm93IGlmIHBhdXNlZC4gCisJICogCisJICogCisJICogQHBhcmFtIHNpbXVsYXRpb24gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBTaW11bGF0aW9uCisJICogQHJldHVybiAgdHJ1ZSBpZiBhYmxlIHRvIGRpc3BsYXkgbWFwIG9yIGZhbHNlIGlmIGNvdWxkIG5vdC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBkaXNwbGF5TWFwKElTaW11bGF0aW9uIHNpbXVsYXRpb24pIHsKKwkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOworCQlTaW11bGF0aW9uU3RhdGUgc3RhdGUgPSAgIHNpbXVsYXRpb24uZ2V0U2ltdWxhdGlvblN0YXRlKCk7CisJCUdFTG9nLmRlYnVnKHRoaXMsIkRpc3BsYXlNYXAgcmVxdWVzdCIpOworCQltYW51YWxSZXF1ZXN0ID0gdHJ1ZTsKKwkJaWYgKHN0YXRlICE9IFNpbXVsYXRpb25TdGF0ZS5SVU5OSU5HKSB7CQorCQkJLy8gcHJvY2VzcyBpdCBpZiBub3QgcnVubmluZy4KKwkJCXByb2Nlc3NDeWNsZShzaW11bGF0aW9uLHNpbXVsYXRpb24uZ2V0U2ltdWxhdGlvblN0YXRlKCkpOworCQl9CisJICAgIC8vIGlmIGl0IHdhcyBydW5uaW5nIGl0IHdpbGwgZG8gaXQgYXQgZW5kIG9mIGN5Y2xlCisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCisJLyoqCisJICogIGNhbGxlZCBieSBHRVZpZXcgdG8gZGlzcGxheSB0aGUgS01MIGZpbGVzIG9uIEdFCisJICogIHZpYSB0aGUgU2VydmxldCBBUEkKKwkgKiAgCisJICogQHBhcmFtIGZvbGRlciAKKwkgKiBAcmV0dXJuICB0cnVlIGlmIGFibGUgdG8gZGlzcGxheSBtYXAgb3IgZmFsc2UgaWYgY291bGQgbm90LgorCSAqLworCXB1YmxpYyBib29sZWFuIHJ1bkdFKFN0cmluZyBmb2xkZXIpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOworCQlHRUxvZy5kZWJ1Zyh0aGlzLCJHb29nbGVFYXJ0aCBydW4gcmVxdWVzdCIpOworCQlpZiAoYWN0aXZlVmlldyA9PSBudWxsKSB7CQorCSAgICAgICAgCisJICAgICAgICBhY3RpdmVWaWV3ID0gInJ1bkdFIjsKKwkgICAgICAgIAorCSAgICAgICAgU3RlbUttbC5zZXRXYWl0Rm9yS01MKGZhbHNlKTsKKwkgICAgICAgIFN0ZW1LbWwubGF1bmNoTmV0d29ya0xpbmsoZm9sZGVyLCBudWxsKTsKKwkJfSBlbHNlIHsKKwkJCWVycm9yTWVzc2FnZSA9ICJHb29nbGVFYXJ0aCBpcyBidXN5IjsKKwkJCUdFTG9nLmRlYnVnKHRoaXMsZXJyb3JNZXNzYWdlKTsKKwkJCXJlc3VsdCA9IGZhbHNlOworCQkJCisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJLyoqCisJICogIGNhbGxlZCBieSBHRVZpZXcgdG8gc3RhcnQgdGhlIEdvb2dsZUVhcnRoIAorCSAqICBhcHBsaWNhdGlvbiBpZiBub3QgYWxyZWFkeSBzdGFydGVkCisJICogCisJICogCisJICogCisJICogQHJldHVybiAgdHJ1ZSBpZiBhYmxlIHRvIGRpc3BsYXkgbWFwIG9yIGZhbHNlIGlmIGNvdWxkIG5vdC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdGFydEdFKCkgeworCQlib29sZWFuIHJlc3VsdCA9IHRydWU7CQorCQlHRUxvZy5kZWJ1Zyh0aGlzLCJHb29nbGVFYXJ0aCBTdGFydCByZXF1ZXN0Iik7CisJICAgIFN0ZW1LbWwubGF1bmNoR0UoKTsKKwkJCisJCXJldHVybiByZXN1bHQ7CisJfQorCS8qKgorCSAqICBjYWxsZWQgYnkgR0VWaWV3IHdoZW4gdGhlIEdvb2dsZUVhcnRoIAorCSAqICBhcHBsaWNhdGlvbiBpcyBiZWluZyByZXN0YXJ0ZWQuCisJICogCisJICogCisJICogCisJICogQHJldHVybiAgdHJ1ZSBpZiBhYmxlIHRvIHJlc2V0IG9yIGZhbHNlIGlmIGNvdWxkIG5vdC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiByZXN0YXJ0R0UoKSB7CisJCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsJCisJCUdFTG9nLmRlYnVnKHRoaXMsIkdvb2dsZUVhcnRoIFJlc3RhcnQgcmVxdWVzdCIpOworCSAgICBTdGVtS21sLmxhdW5jaEdFKCk7CisJICAgIGludCBtZXRob2QgPSAwOworCQkKKwkJLy8gVE9ETyAKKwkgICAgLy8gcmVlc3RhYmxpc2ggdGhlIGNvbW11bmljYXRpb24gZW52aXJvbm1lbnQuCisJICAgIC8vIElmIGEgbmV0d29ya2xpbmsgd2FzIGFjdGl2ZSwgcmVlc3RhYmxpc2ggaXQuCisJICAgIGlmIChhY3RpdmVWaWV3ICE9IG51bGwpICB7CisJICAgIAlHRVNpbUVudHJ5IGV4aXN0aW5nID0gYWN0aXZlU2ltdWxhdGlvbnMuZ2V0KGFjdGl2ZVZpZXcpOworCQkJaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKKwkJCQltZXRob2QgPSBleGlzdGluZy5nZXRNZXRob2QoKTsKKwkJCQlJU2ltdWxhdGlvbiBzaW0gPSBleGlzdGluZy5nZXRTaW11bGF0aW9uKCk7CisJCQkJaWYgKHNpbS5nZXRTaW11bGF0aW9uU3RhdGUoKSA9PSBTaW11bGF0aW9uU3RhdGUuUlVOTklORyl7CisJCQkJCWVycm9yTWVzc2FnZSA9IAorCQkJCQkJIlNpbXVsYXRpb24gc2hvdWxkIGJlIHBhdXNlZCB3aGlsZSByZXN0YXJ0aW5nIEdvb2dsZUVhcnRoIjsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJCisJCQkJfQorCQkJCVN0cmluZyBmb2xkZXIgPSBleGlzdGluZy5nZXRMb2dGb2xkZXIoKTsKKwkJCSAgICBpZiAobWV0aG9kID09IEdFUHJlZmVyZW5jZVBhZ2UuTV9BU1lOQ19TRVJWTEVUIHx8CisJCQkgICAgCW1ldGhvZCA9PSBHRVByZWZlcmVuY2VQYWdlLk1fTE9HX1NFUlZMRVQpCXsgICAgICAgIAorCQkJICAgIAlTdGVtS21sLmxhdW5jaE5ldHdvcmtMaW5rKGZvbGRlciwgbnVsbCk7CisJCQkgICAgfQorCSAgICAgICAgfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCS8qKgorCSAqICBjYWxsZWQgYnkgR0VWaWV3IHRvIHN0b3AgdGhlIGN1cnJlbnQKKwkgKiAgZGlzcGxheSB0aGUgS01MIGZpbGVzIG9uIEdFCisJICogIHZpYSB0aGUgU2VydmxldCBBUEkKKwkgKiAKKwkgKiAKKwkgKiBAcmV0dXJuICB0cnVlIAorCSAqLworCXB1YmxpYyBib29sZWFuIHN0b3BHRSgpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwkKKwkJR0VMb2cuZGVidWcodGhpcywiR29vZ2xlRWFydGggU3RvcCByZXF1ZXN0Iik7CisJCS8vU3RlbUttbC5sYXVuY2hHRSgpOworCQlpZiAoZGlkRGlzcGxheUFyZWEpIHsKKwkJCVN0ZW1LbWwuY2xlYXJEaXNwbGF5QXJlYSgpOworCQl9CisJCWFjdGl2ZVZpZXcgPSBudWxsOworCQkvLyBmb3Igc29tZSByZWFzb24gaXQgYXBwZWFycyB0aGF0IHNvbWV0aW1lcyAKKwkJLy8gaXQgdGFrZXMgdG8gd3JpdGluZyBvZiBhbiBlbXB0eSBjb250cm9sIGZpbGUKKwkJLy8gdG8gc3RvcCB0aGUgY3VycmVudCBOZXR3b3JrTGluayBzbyBkbyBpdCBhZ2FpbgorCQlTdGVtS21sLmxhdW5jaEdFKCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCS8qKgorCSAqIFNjaGVkdWxlIHRoZSBiYWNrZ3JvdW5kIGpvYiB0aGF0IHdpbGwgYnVpbGQgdGhlIC5rbWwgZmlsZSAKKwkgKiB0aGF0IHdpbGwgYmUgc2VudCB0byBHb29nbGVFYXJ0aCAKKwkgKiAKKwkgKiBAcGFyYW0gZm4gICAgICAgRnVsbHkgcXVhbGlmaWVkIEZpbGVuYW1lIHdoZXJlIHdlIHdyaXRlIHRoZSBrbWwKKwkgKiBAcGFyYW0gc3RlbUttbCAgT2JqZWN0IGNvbnRhaW5pbmcgaW5mbyBhYm91dCB3aGVyZSBhbmQKKwkgKiAgICAgICAgICAgICAgICAgaG93IHRvIGdlbmVyYXRlIHRoZSBLTUwuCisJICogQHBhcmFtIHN0ZW1NYXAgIE1hcCBvZiBQb2x5Z29ucyB3aXRoIFNFSVIgZGF0YSBhbmQgUG9wRGVuc2l0eQorCSAqIAorCSAqIEBwYXJhbSBhc3BlY3QgICBTRUlSIFR5cGUgdG8gYmUgZGlzcGxheWVkCisJICogQHBhcmFtIGN5Y2xlICAgIGN1cnJlbnQgY3ljbGUgbnVtYmVyCisJICogQHBhcmFtIGxhdW5jaCAgIHRydWUgaWYgZmlsZSBzaG91bGQgYmUgc2VudCB0byBHb29nbGVFYXJ0aAorCSAqIEBwYXJhbSByZW5hbWUgICB0cnVlIGlmIGZpbGUgc2hvdWxkIGJlIHdyaXR0ZW4gdGhlbiByZW5hbWVkCisJICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgS01MCisJICovCQorCQorCXByaXZhdGUgU3RlbUttbCBnZW5lcmF0ZUtNTChTdHJpbmcgZm4sU3RlbUttbCBzdGVtS21sLCBNYXA8U3RyaW5nLEdFRGF0YT4gc3RlbU1hcCwKKwkJCUFzcGVjdCBhc3BlY3QsbG9uZyBjeWNsZSxib29sZWFuIGxhdW5jaCxib29sZWFuIHJlbmFtZSkgewkKKwkJdHJ5IHsKKwkJCUdFSm9iIGpvYiA9IG5ldyBHRUpvYigiR2VuZXJhdGUgS01MIik7CisJCQlqb2IuZ2VuZXJhdGVLTUwoZm4sc3RlbUttbCwgc3RlbU1hcCwgYXNwZWN0LCBjeWNsZSxsYXVuY2gscmVuYW1lKTsKKwkJCQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewkJCQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQlyZXR1cm4gc3RlbUttbDsKKwl9CisJCisJCisJLyoqCisJICogb2J0YWluIHRoZSBjdXJyZW50IGFzcGVjdCB2YWx1ZXMgYW5kIHN0b3JlIHRoZW0gaW4gdGhlIAorCSAqIEdFRGF0YSBpbnN0YW5jZQorCSAqIAorCSAqIEBwYXJhbSBzaW0KKwkgKiBAcGFyYW0gc3RlbU1hcAorCSAqLworCQorCXByaXZhdGUgdm9pZCBzdG9yZUFzcGVjdHMoSVNpbXVsYXRpb24gc2ltLE1hcDxTdHJpbmcsR0VEYXRhPiBzdGVtTWFwKSB7CisJCQorCQlTY2VuYXJpbyBzY2VuYXJpbyA9IHNpbS5nZXRTY2VuYXJpbygpOwkJCisJCS8vCQkgV2UgZ2V0IHRoZSBkZWNvcmF0b3JzIGZyb20gdGhlIHNjZW5hcmlvIC4uLgkJCQorCQlHcmFwaCBnID0gc2NlbmFyaW8uZ2V0Q2Fub25pY2FsR3JhcGgoKTsKKwkJRGVjb3JhdG9yW10gZGVjb3JhdG9ycyA9IGcuZ2V0RGVjb3JhdG9ycygpLnRvQXJyYXkobmV3IERlY29yYXRvcltnLmdldERlY29yYXRvcnMoKS5zaXplKCldKTsKKwkJaW50IGVycjFjdHIgPSAwOyAgLy8gbm8gbGF0bG9uZyBkYXRhCisJCWludCBlcnIyY3RyID0gMDsgIC8vIG5vIGFzcGVjdCBkYXRhCisJCWZvciAoRGVjb3JhdG9yIGRlY29yYXRvciA6IGRlY29yYXRvcnMpIHsKKwkKKwkJCU9iamVjdFtdIGxhYmVscyA9IGRlY29yYXRvci5nZXRMYWJlbHNUb1VwZGF0ZSgpLnRvQXJyYXkoKTsKKwkJCWZvciAoT2JqZWN0IGVsZW1lbnQ6IGxhYmVscyl7CisJCQkJCisJCQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgTm9kZUxhYmVsKSB7CisJCQkJCU5vZGVMYWJlbCBub2RlTGFiZWwgPSAoTm9kZUxhYmVsKWVsZW1lbnQ7CisJCQkJCU5vZGUgbm9kZSA9IG5vZGVMYWJlbC5nZXROb2RlKCk7CisJCQkJCQorCQkJCQlTdHJpbmcga2V5ID0gbm9kZS5nZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKTsKKwkJCQkJCisJCQkJCUdFRGF0YSBkYXRhID0gc3RlbU1hcC5nZXQoa2V5KTsKKwkJCQkJCisJCQkJCWlmIChkYXRhID09IG51bGwpIHsJICAvLyBmaWx0ZXJlZCBwcmV2aW91c2x5CQorCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJYm9vbGVhbiBrZWVwID0gZmlsdGVyKG5vZGUsa2V5LGRhdGEpOworCQkJCQlpZiAoIWtlZXApIAorCQkJCQkJY29udGludWU7CisJCQkJCS8vaWYgKG5vZGVMYWJlbCBpbnN0YW5jZW9mIFNFSVJMYWJlbEltcGwpIHsKKwkJCQkJCS8vIFRPRE8gd2UgbmVlZCBhIHdheSB0byBnZXQgUG9wRGVuc2l0eQorCQkJCQkJLy9TRUlSTGFiZWxJbXBsIGxhYmVsID0gKFNFSVJMYWJlbEltcGwpbm9kZUxhYmVsOworCQkJCQkJLy9EaXNlYXNlTW9kZWxTdGF0ZSBzdGF0ZSA9IChEaXNlYXNlTW9kZWxTdGF0ZSlsYWJlbC5nZXREaXNlYXNlTW9kZWxTdGF0ZSgpOwkJCQkJCQkKKwkJCQkJLy8JcG9wRGVuc2l0eSA9NTAqTWF0aC5yYW5kb20oKTsgLy9zdGF0ZS5nZXRQb3B1bGF0aW9uRGVuc2l0eSgpOworCQkJCQkvLwlkYXRhLnNldFBvcERlbnNpdHkocG9wRGVuc2l0eSk7CisJCQkJCS8vfQorCQkJCQlSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyIHJ2cCA9IChSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyKSBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkuYWRhcHQoZWxlbWVudCwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyLmNsYXNzKTsKKwkJCQkJcnZwLnNldFRhcmdldCgoTm90aWZpZXIpZWxlbWVudCk7CisJCQkJCQorCQkJCQkvLyBEb2VzIHRoZSBsYWJlbCBoYXZlIHJlbGF0aXZlIHZhbHVlcz8KKwkJCQkJCisJCQkJCWlmIChydnAgIT0gbnVsbCkgewkKKwkJCQkJCU1hcDxTdHJpbmcsRG91YmxlPiBtYXAgPSBkYXRhLmdldFZhbHVlTWFwKCk7CisJCQkJCQlmb3IgKEl0ZXJhdG9yIHByb3BlcnR5SXRlciA9IAorCQkJCQkJCXJ2cC5nZXRQcm9wZXJ0aWVzKCkuaXRlcmF0b3IoKTsgcHJvcGVydHlJdGVyLmhhc05leHQoKTspIHsKKwkJCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5ID0gCisJCQkJCQkJCShJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSBwcm9wZXJ0eUl0ZXIubmV4dCgpOworCisJCQkJCQkJU3RyaW5nIHAgPSBwcm9wZXJ0eS5nZXREaXNwbGF5TmFtZShwcm9wZXJ0eSk7CisJCQkJCQkJZG91YmxlIHYgPSBydnAuZ2V0UmVsYXRpdmVWYWx1ZShwcm9wZXJ0eSk7CisJCQkJCQkJLy8gVE9ETyBkZWJ1ZyBpbnNlcnQgb2YgSW5mZWN0aW91cyB2YWx1ZQorLy8JCQkJCQkJaWYgKGtleS5zdGFydHNXaXRoKCJNIikgJiYgcC5lcXVhbHMoIkkiKSkgeworLy8JCQkJCQkJCXYgPSBNYXRoLnJhbmRvbSgpOworLy8JCQkJCQkJfQorCQkJCQkJCS8vIGlmIHdlIGFyZSBrZWVwaW5nIHRyYWNrIG9mIHRoaXMgYXNwZWN0CisJCQkJCQkJaWYgKEFzcGVjdC5leGlzdHMocCkpIHsKKwkJCQkJCQkJbWFwLnB1dChwLHYpOworCQkJCQkJCX0KKwkJCQkJCX0gLy8gZm9yIGVhY2ggcHJvcGVydHkKKwkJCQkJCS8vICByZW1vdmUgZGVidWcgY29kZQorCQkJCQkJLy8gVG8gZGVidWcgdGhpcyB0aGVuIG1ha2UgdGhlIGluZmVjdGlvdXMgdmFsdWUgcmFuZG9tCisvLwkJCQkJCWlmIChrZXkuc3RhcnRzV2l0aCgiTWlkZGxlc2V4IikgJiYga2V5LmNvbnRhaW5zKCJNQSIpKSB7CQkJCQkJCQorLy8JCQkJCQkJR0VMb2cuZGVidWcodGhpcyxrZXkrIiBBc3BlY3RzOiAiK2RhdGEuZ2V0VmFsdWVzQXNTdHJpbmcoKSk7CisvLwkJCQkJCQkvL0dFTG9nLmRlYnVnKHRoaXMsIkJCb3g6IitkYXRhLmdldEJCb3goKSk7CisvLwkJCQkJCX0KKy8vCQkJCQkJaWYgKGtleS5jb250YWlucygiRzIyMDAxMCIpICkgewkJCQkJCQkKKy8vCQkJCQkJCUdFTG9nLmRlYnVnKHRoaXMsa2V5KyIgQXNwZWN0czogIitkYXRhLmdldFZhbHVlc0FzU3RyaW5nKCkpOworLy8JCQkJCQkJLy9HRUxvZy5kZWJ1Zyh0aGlzLCJCQm94OiIrZGF0YS5nZXRCQm94KCkpOworLy8JCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvL2lmIChlcnIyY3RyID09IDApIAorCQkJCQkJLy9HRUxvZy5kZWJ1Zyh0aGlzLCJOb2RlOiAiK2tleSsiIGhhcyBubyBhc3BlY3QgZGF0YSIpOworCQkJCQkJZXJyMmN0cisrOworCQkJCQl9CisKKwkJCQl9CisJCQl9ICAvLyBmb3IKKwkJfQorCQkKKwkJaWYgKGVycjFjdHIgPiAwKSAKKwkJCUdFTG9nLmRlYnVnKHRoaXMsIk5vZGVzIHdpdGggbm8gTGF0TG9uZyBkYXRhLiBjb3VudD0iK2VycjFjdHIpOworCQlpZiAoZXJyMmN0ciA+IDApCisJCSAgICBHRUxvZy5kZWJ1Zyh0aGlzLCJOb2RlcyB3aXRoIG5vIGFzcGVjdCB2YWx1ZXMuIGNvdW50PSIrZXJyMmN0cik7CisJfQorCQorCS8qKgorCSAqIEJ1aWxkIGEgU3RlbU1hcCBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBTaW11bGF0aW9uCisJICogCisJICogVGhlIFN0ZW1NYXAgaXMgYSBIYXNoTWFwIGNvbnRhaW5pbmcgR0VEYXRhIG9iamVjdHMgCisJICoga2V5ZWQgYnkgYXJlYWlkLiAgVGhlIGxvY2F0aW9uIG9iamVjdCBjb250YWlucyB0aGUgCisJICogZ2VvZ3JhcGhpYyBib3JkZXJzIGZvciB0aGUgYXJlYWlkLgorCSAqIAorCSAqIEBwYXJhbSBzaW11bGF0aW9uIHRoYXQgd2lsbCBiZSBzaG93bgorCSAqIEByZXR1cm4gTWFwIEtleSBpcyBub2RlLCBlbGVtZW50IGlzIEdFRGF0YSBpbnN0YW5jZQorCSAqIAorCSAqLworCQorCXByaXZhdGUgTWFwPFN0cmluZyxHRURhdGE+IGJ1aWxkTWFwKElTaW11bGF0aW9uIHNpbXVsYXRpb24pIHsKKwkJdHJ5IHsKKwkJCXN0ZW1NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsR0VEYXRhPigpOworCQkJCisJCQkKKwkJCVNjZW5hcmlvIHNjZW5hcmlvID0gc2ltdWxhdGlvbi5nZXRTY2VuYXJpbygpOworCQkJLy9TdHJpbmcgdGl0bGUgPSBzY2VuYXJpby5wcm9kdWNlVGl0bGUoKTsKKwkJCS8vRHVibGluQ29yZSBkYyA9IHNjZW5hcmlvLmdldER1YmxpbkNvcmUoKTsKKwkJCS8vR0VMb2cuZGVidWcodGhpcywiYnVpbGRNYXAoKTogdGl0bGU9Iit0aXRsZSk7CisJCQkvL0dFTG9nLmRlYnVnKHRoaXMsImJ1aWxkTWFwKCk6IER1YmxpbkNvcmU9IitkYyk7CisJCQkKKwkJCQorCQkJLy8JCSBXZSBnZXQgdGhlIGdyYXBoLi4uCisJCQlmaW5hbCBHcmFwaCBjYW5vbmljYWxHcmFwaCA9IHNjZW5hcmlvLmdldENhbm9uaWNhbEdyYXBoKCk7CisJCQkvL0dFTG9nLmRlYnVnKHRoaXMsImJ1aWxkTWFwKCk6IGNhbm9uaWNhbEdyYXBoPSIrY2Fub25pY2FsR3JhcGgpOworCQkJaWYgKGNhbm9uaWNhbEdyYXBoID09IG51bGwpIHsKKwkJCQlHRUxvZy5kZWJ1Zyh0aGlzLCJidWlsZE1hcCgpOiBjYW5vbmljYWxHcmFwaCBpcyBudWxsIik7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQkvLyAuLi5hbmQgY2FuIG5vdyBpdGVyYXRlIHRocm91Z2ggdGhlIG5vZGVzLiBOb3RlIHRoYXQgdGhlIG1ldGhvZAorCQkJLy8gImdldE5vZGVzIiByZXR1cm5zIGEgbWFwIGluZGV4ZWQgYnkgdGhlIFVSSSBvZiBlYWNoIG9mIHRoZSBub2RlcywKKwkJCS8vIHRodXMgd2UgbmVlZCB0byBnZXQgdGhlIHZhbHVlcyBvZiB0aGUgbWFwIHRvIGhhdmUgYW4gYWN0dWFsIGxpc3QgdG8KKwkJCS8vIGl0ZXJhdG9yIG92ZXIuCQkJCQorCQkJaW50IGVycmN0ciA9IDA7CisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yIG5vZGVJdGVyID0gY2Fub25pY2FsR3JhcGguZ2V0Tm9kZXMoKS52YWx1ZXMoKQorCQkJCQkuaXRlcmF0b3IoKTsgbm9kZUl0ZXIuaGFzTmV4dCgpOykgeworCQkJCWZpbmFsIE5vZGUgbm9kZSA9IChOb2RlKSBub2RlSXRlci5uZXh0KCk7CisJCQkgICAgU3RyaW5nIG5vZGVUaXRsZSA9IG5vZGUuZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCk7CisJCQkgICAgLy9HRUxvZy5kZWJ1Zyh0aGlzLCBub2RlKyIgOiAiKyBub2RlVGl0bGUpOworCQkJICAgIGJvb2xlYW4ga2VlcCA9IGZpbHRlcihub2RlLG5vZGVUaXRsZSxudWxsKTsKKwkJCSAgICBpZiAoISBrZWVwKSAKKwkJCSAgICAJY29udGludWU7CisJCQkgICAKKyAgICAgICAgICAgICAgICAvLyBUaGUgbm9kZSBtYXkgb3IgbWF5IG5vdCBoYXZlIGxhdC9sb25nIGRhdGEgYXNzb2NpYXRlZCB3aXRoCisJCQkJLy8gaXQsIGlmIGl0IGRvZXNuJ3QgdGhlIExhdExvbmcgdGhhdCdzIHJldHVybmVkIHdpbGwgYmUgZW1wdHkuCisJCQkJZmluYWwgTGF0TG9uZyBsYXRMb25nRGF0YSA9IGdldExhdExvbmcobm9kZSk7CisJCQkJaWYgKGxhdExvbmdEYXRhICE9IG51bGwgJiYgbGF0TG9uZ0RhdGEuc2l6ZSgpID4gMCkgeworCisJCQkJICAgIEdFRGF0YSBkYXRhID0gbmV3IEdFRGF0YShub2RlVGl0bGUsbGF0TG9uZ0RhdGEpOworCQkJCSAgICBzdGVtTWFwLnB1dChub2RlVGl0bGUsZGF0YSk7CisJCQkJCQkJICAKKwkJCQl9IGVsc2UgewkJCQkJCisvLwkJCQkJaWYgKGVycmN0ciA8PSAyKSB7CisvLwkJCQkJICBHRUxvZy5kZWJ1Zyh0aGlzLCJidWlsZE1hcCgpOiBObyBzcGFjaWFsIGRhdGFcbiIrCisvLwkJCQkJCQkgICJOYW1lPSIrbm9kZVRpdGxlKyIgTm9kZT0iK25vZGUpOworLy8JCQkJCX0KKwkJCQkJZXJyY3RyKys7CisJCQkJfQorCQkJCQorCQkJfSAvLyBmb3IgZWFjaCBub2RlCisJCQkKKwkJCWlmIChlcnJjdHIgPiAwKQorCQkJCSAgIEdFTG9nLmRlYnVnKHRoaXMsIlRvdGFsIGJ1aWxkbWFwIGVycm9ycyA9ICIrZXJyY3RyKTsJCisJCQkKKwkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKwkJCQorCQkJR0VMb2cuZXJyb3IoIkZhaWx1cmUgYnVpbGRpbmcgYXJlYSBtYXAiLCBlKTsKKwkJCXN0ZW1NYXAgPSBudWxsOworCQl9CisJCQorCQkKKwkJcmV0dXJuIHN0ZW1NYXA7CQorCX0KKwkvKioKKwkgKiBGaWx0ZXIgb3V0IG5vZGVzIHRoYXQgd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIAorCSAqIE5vdGU6IFRoZSBpbXBvcnRhbnQgZmlsdGVyaW5nIGlzIGRvbmUgaW4gdGhlIAorCSAqIGZpbHRlciBtZXRob2QgaW4gU3RlbUttbC4gIFRoaXMganVzdCBhZmZlY3RzIGdhdGhlcmluZyBvZiAKKwkgKiBhc3BlY3QgZGF0YSAuCisJICogCQorCSAqIEBwYXJhbSBub2RlCisJICogQHBhcmFtIG5vZGVUaXRsZQorCSAqIEBwYXJhbiBkYXRhIEdFRGF0YSBpbnN0YW5jZSBmb3IgdGhlIG5vZGUKKwkgKiBAcmV0dXJuIHRydWUgaWYgd2Ugc2hvdWxkIGtlZXAgdGhlIG5vZGUsIGZhbHNlIHRvIGlnbm9yZSBpdAorCSAqLworCWJvb2xlYW4gZmlsdGVyKE5vZGUgbm9kZSxTdHJpbmcgbm9kZVRpdGxlLCBHRURhdGEgZGF0YSkgeworLy8JCSBpZiAoR0VQcmVmZXJlbmNlUGFnZS5pc1Rlc3QoKSkgeworLy8JCQkJaWYgKG5vZGVUaXRsZS5pbmRleE9mKCIgVVMtIik8IDAgKSB7CQkJCQkKKy8vCQkJCQlyZXR1cm4gZmFsc2U7CisvLwkJCQl9CisvLwkJIH0KKy8vCQkJCS8vIGlnbm9yZSBhbGFza2EKKy8vCQlpZiAobm9kZVRpdGxlLmluZGV4T2YoIiBVUy1BSyIpPiAwICkgewkJCQkJCisvLwkJCQkJcmV0dXJuIGZhbHNlOworLy8JCX0KKy8vLy8JCQkJIGlnbm9yZSBoYXdhaWkKKy8vCQlpZiAobm9kZVRpdGxlLmluZGV4T2YoIiBVUy1ISSIpPiAwICkgewkJCQkJCisvLwkJCQkJcmV0dXJuIGZhbHNlOworLy8JCQorCQkvLyBmaWx0ZXIgb3V0IEFkbWluQXJlYSAwIGJlY2F1c2UgdGhleSAibWF5IiBiZSBjb250YWluZXIgZW50cmllcworCQlpbnQgYWRtaW5hcmVhID0gZ2V0QXJlYVR5cGUobm9kZSk7CisJCWlmIChhZG1pbmFyZWEgPD0gMCkgeworCQkJR0VMb2cuZGVidWcodGhpcywiU2tpcCBBZG1pbkFyZWEgMDogIitub2RlKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkvLyBkZWJ1ZyBzdHVmZgorCQlpZiAoZGlzcGxheU5vZGUgIT0gbnVsbCkgeworCQkJZGlzcGxheU5vZGUgPSBkaXNwbGF5Tm9kZS50b0xvd2VyQ2FzZSgpOwkJCQorCQkJaWYgKG5vZGVUaXRsZS50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKGRpc3BsYXlOb2RlKSApIHsKKwkJCQlHRUxvZy5kZWJ1Zyh0aGlzLCJEaXNwbGF5OiAiK25vZGVUaXRsZSk7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9IGVsc2UgeworCQkJCS8vR0VMb2cuZGVidWcodGhpcywiRG8gbm90IERpc3BsYXk6ICIrbm9kZVRpdGxlKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQkKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGlkIG9mIHRoZSBhcmVhIGZyb20gdGhlIER1YmxpbkNvcmUgaW5zdGFuY2UKKwkgKiBAcGFyYW0gcmVnaW9uIE5vZGUgcmVwcmVzZW50aW5nIGFuIEFkbWluQXJlYQorCSAqIEByZXR1cm4gMyBDaGFyIElTTyBpZCBvZiBDb3VudHJ5CisJICovCisKKwlwcml2YXRlIFN0cmluZyBnZXRBcmVhSUQoTm9kZSByZWdpb24pIHsKKwkJZmluYWwgRHVibGluQ29yZSBkYyA9IHJlZ2lvbi5nZXREdWJsaW5Db3JlKCk7CisJCWZpbmFsIFN0cmluZyBkY0lkZW50aWZpZXIgPSBkYy5nZXRJZGVudGlmaWVyKCk7CisKKwkJZmluYWwgU3RyaW5nIGlzb0tleSA9IGRjSWRlbnRpZmllci5zdWJzdHJpbmcoZGNJZGVudGlmaWVyCisJCQkJLmxhc3RJbmRleE9mKCIvIikrMSk7CisJICAgIHJldHVybiBpc29LZXk7CisJfQorCS8qKgorCSAqIEdldCB0aGUgbmFtZSBvZiB0aGUgYXJlYSBmcm9tIHRoZSBEdWJsaW5Db3JlIGluc3RhbmNlCisJICogQHBhcmFtIHJlZ2lvbiBOb2RlIHJlcHJlc2VudGluZyBhbiBBZG1pbkFyZWEKKwkgKiBAcmV0dXJuIE5hbWUgb2YgdGhlIEFkbWluQXJlYQorCSAqLworCisJcHJpdmF0ZSBTdHJpbmcgZ2V0QXJlYU5hbWUoTm9kZSByZWdpb24pIHsKKwkJZmluYWwgRHVibGluQ29yZSBkYyA9IHJlZ2lvbi5nZXREdWJsaW5Db3JlKCk7CisJCWZpbmFsIFN0cmluZyBkY0lkZW50aWZpZXIgPSBkYy5nZXRJZGVudGlmaWVyKCk7CisKKwkJZmluYWwgU3RyaW5nIGlzb0tleSA9IGRjSWRlbnRpZmllci5zdWJzdHJpbmcoZGNJZGVudGlmaWVyCisJCQkJLmxhc3RJbmRleE9mKCIvIikrMSk7CisJCS8vIERpZCB3ZSBnZXQgaXQ/CisJCWlmIChpc29LZXkgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGlzb0tleSkpIHsKKwkJCS8vIFllcworCQkJZmluYWwgU3RyaW5nIGdlb2dyYXBoaWNOYW1lID0gCisJCQkJR2VvZ3JhcGhpY05hbWVzLmdldE5hbWUoaXNvS2V5KTsKKwkJCXJldHVybiBnZW9ncmFwaGljTmFtZTsKKy8vCQkJZmluYWwgU3RyaW5nQnVpbGRlciBzYj0gbmV3IFN0cmluZ0J1aWxkZXIoZ2VvZ3JhcGhpY05hbWUpOworLy8JCQlzYi5hcHBlbmQoIiAoIik7CisvLwkJCXNiLmFwcGVuZChpc29LZXkpOworLy8JCQlzYi5hcHBlbmQoIikiKTsKKy8vCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZGMuZ2V0VGl0bGUoKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBHZXQgdGhlIHR5cGUgb2YgdGhlIEFkbWluIGFyZWEgZnJvbSB0aGUgRHVibGluQ29yZSBpbnN0YW5jZQorCSAqIEBwYXJhbSByZWdpb24KKwkgKiBAcmV0dXJuIDAgMSBvciAyICgtMSBpZiBwcm9ibGVtKQorCSAqLworCisJcHJpdmF0ZSBpbnQgZ2V0QXJlYVR5cGUoTm9kZSBub2RlKSB7CisJCWludCBhcmVhdHlwZSA9IC0xOworCQlmaW5hbCBEdWJsaW5Db3JlIGRjID0gbm9kZS5nZXREdWJsaW5Db3JlKCk7CisJCWZpbmFsIFN0cmluZyBzcGF0aWFsID0gZGMuZ2V0U3BhdGlhbCgpOworICAgIAorCQlpZiAoc3BhdGlhbCAhPSBudWxsKSB7CisJCQlTdHJpbmcgbWFwaWQgPSBzcGF0aWFsLnN1YnN0cmluZyhzcGF0aWFsLmxhc3RJbmRleE9mKCIvIikgKyAxKTsKKwkJCS8vIERpZCB3ZSBnZXQgaXQ/CisJCQlpZiAobWFwaWQgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKG1hcGlkKSkgeworCQkJCS8vICAgWFhYXzBfTUFQLnhtbCNYWFgKKwkJCQltYXBpZCA9IG1hcGlkLnN1YnN0cmluZygwLCBtYXBpZC5pbmRleE9mKCIjIikpOworCQkJCW1hcGlkID0gbWFwaWQuc3Vic3RyaW5nKDQsIDUpOworCQkJCWFyZWF0eXBlID0gSW50ZWdlci5wYXJzZUludChtYXBpZCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFyZWF0eXBlOworCX0KKwkvKioKKwkgKiBCdWlsZCBhIFN0ZW1NYXAgaW5zdGFuY2UgZm9yIGEgc3BlY2lmaWVkIFNwYXRpYWwgbG9jYXRpb24KKwkgKiBiYXNlZCBvbiBhIFNlbGVjdGlvbiBldmVudCBmcm9tIE1hcFZpZXcKKwkgKiAKKwkgKiBUaGUgU3RlbU1hcCBpcyBhIEhhc2hNYXAgY29udGFpbmluZyBHRURhdGEgb2JqZWN0cyAKKwkgKiBrZXllZCBieSBhcmVhaWQuICBUaGUgbG9jYXRpb24gb2JqZWN0IGNvbnRhaW5zIHRoZSAKKwkgKiBnZW9ncmFwaGljIGJvcmRlcnMgZm9yIHRoZSBhcmVhaWQuCisJICogCisJICogQHBhcmFtIHJlZ2lvbiBUaGUgSWRlbnRpZmlhYmxlIGRlc2NyaWJpbmcgdGhlIGFkbWluIGFyZWEgdGhhdCAKKwkgKiAgICAgICAgICAgICAgIHdhcyBzZWxlY3RlZC4KKwkgKiBAcGFyYW0gZ3NlICBJbnN0YWNlIG9mIEdlb2dyYXBoaWNTZWxlY3Rpb25FbGVtZW50cyB0aGF0IHdhcworCSAqICAgICAgICAgICAgIHBhc3NlZCBmcm9tIE1hcFZpZXcgd2hlbiBtb3VzZXVwIG9jY3VycmVkLgorCSAqIAorCSAqIEByZXR1cm4gTWFwIEtleSBpcyBub2RlLCBlbGVtZW50IGlzIEdFRGF0YSBpbnN0YW5jZQorCSAqIAorCSAqLworCQorCXByaXZhdGUgTWFwPFN0cmluZywgR0VEYXRhPiBidWlsZFNlbGVjdGlvbk1hcChSZWdpb25JbXBsIHJlZ2lvbiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICBHZW9ncmFwaGljU2VsZWN0aW9uRWxlbWVudHMgZ3NlKSB7CisJCQorCQl0cnkgeworCQkJCisJCQlEdWJsaW5Db3JlIGRjID0gcmVnaW9uLmdldER1YmxpbkNvcmUoKTsKKwkJCVN0cmluZyBzcGF0aWFsID0gZGMuZ2V0U3BhdGlhbCgpOworCQkJCisgICAgICAgICAgICBTdHJpbmcgdXJpU3RyaW5nID0gc3BhdGlhbC5yZXBsYWNlKCJzdGVtc3BhdGlhbDoiLCIiKTsKKyAgICAgICAgICAgIAorCQkJc3RlbU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgR0VEYXRhPigpOworCQkJUGxhdGZvcm1MYXRMb25nRGF0YVByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFBsYXRmb3JtTGF0TG9uZ0RhdGFQcm92aWRlcigpOworCisJCQlVUkkgdXJpTm9kZSA9IFVSSS5jcmVhdGVVUkkodXJpU3RyaW5nKTsgICAgICAgICAgICAgICAgCisJCSAgICBMYXRMb25nIGxhdExvbmcgPSBwcm92aWRlci5nZXRMYXRMb25nKHVyaU5vZGUpOworCQkgLy8gZ2V0IGlkIG9mIHRoZSBhcmVhCisJCQlTdHJpbmcgaWQgPSBnZXRBcmVhSUQocmVnaW9uKTsKKwkJCVN0cmluZyBuYW1lID0gZ2V0QXJlYU5hbWUocmVnaW9uKTsKKwkgICAgCUdFRGF0YSBkYXRhID0gbmV3IEdFRGF0YShpZCxuYW1lLCBsYXRMb25nKTsJICAgIAkvLyBVc2UgUyBqdXN0IHRvIGdldCBpdCB0byB3b3JrCisJICAgIAlkYXRhLnNldFZhbHVlKEFzcGVjdC5nZXRBc3BlY3QoIlMiKSwgMDEuMCk7CisJICAgIAlTdHJpbmcgZGVzY3JpcHRpb24gPSBmb3JtYXREZXNjcmlwdGlvbihyZWdpb24sZ3NlKTsKKwkgICAgCWRhdGEuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOworCSAgICAJZG91YmxlIGxvbmdpdHVkZSA9IGdzZS5nZXRMb25naXR1ZGUoKTsKKwkgICAgCWRvdWJsZSBsYXRpdHVkZSA9IGdzZS5nZXRMYXRpdHVkZSgpOworCSAgICAJR0VMb2cuZGVidWcobG9uZ2l0dWRlKyI6IitsYXRpdHVkZSk7CisJICAgIAkvL2RvdWJsZVtdIGNlbnRlciA9IGRhdGEuZ2V0QkJveENlbnRlcigpOworCSAgICAJLy9HRUxvZy5kZWJ1ZyhjZW50ZXJbMF0rIjoiK2NlbnRlclsxXSk7CisJICAgIAkvLyBzZXQgdGhlIHRodW1idGFjayBvbiB0aGUgcG9pbnQgY2xpY2tlZCBieSB1c2VyCisJICAgIAlkYXRhLnNldFBvaW50KGxvbmdpdHVkZSwgbGF0aXR1ZGUpOworCSAgICAJCisJICAgIAlzdGVtTWFwLnB1dChpZCwgZGF0YSk7CisJCQkKKwkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKwkJCUdFTG9nLmVycm9yKCJGYWlsdXJlIGJ1aWxkaW5nIGFyZWEgbWFwIiwgZSk7CisJCQlzdGVtTWFwID0gbnVsbDsKKwkJCWVycm9yTWVzc2FnZSA9ICJFeGNlcHRpb24gd2hpbGUgYnVpbGRpbmcgTWFwIjsKKwkJfQorCisJCXJldHVybiBzdGVtTWFwOworCX0KKwkvKioKKwkgKiBCdWlsZCBhIFN0ZW1NYXAgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgU2ltdWxhdGlvbgorCSAqIAorCSAqIFRoZSBTdGVtTWFwIGlzIGEgSGFzaE1hcCBjb250YWluaW5nIEdFRGF0YSBvYmplY3RzIAorCSAqIGtleWVkIGJ5IGFyZWFpZC4gIFRoZSBsb2NhdGlvbiBvYmplY3QgY29udGFpbnMgdGhlIAorCSAqIGdlb2dyYXBoaWMgYm9yZGVycyBmb3IgdGhlIGFyZWFpZC4KKwkgKiAKKwkgKiBAcGFyYW0gYWRtaW5GaWxlIGZpbGUgbmFtZSB0byB1c2UgaW4gc2VhcmNoCisJICogQHBhcmFtIHNlYXJjaCBzdHJpbmcgdG8gbG9vayBmb3IgCisJICogQHJldHVybiBNYXAgS2V5IGlzIG5vZGUsIGVsZW1lbnQgaXMgR0VEYXRhIGluc3RhbmNlCisJICogCisJICovCisJCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBHRURhdGE+IGJ1aWxkTWFwKFN0cmluZyBhZG1pbkZpbGUsIFN0cmluZyBzZWFyY2gpIHsKKwkJCisJCVN0cmluZyBiYXNlVVJJID0gCisJCQkicGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeS8iICsgCisJCQkicmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvIjsKKwkJCisJCXRyeSB7CisgICAgICAgICAgICBTdHJpbmcgdXJpU3RyaW5nID0gYmFzZVVSSSthZG1pbkZpbGU7CisJCQlzdGVtTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBHRURhdGE+KCk7CisJCQlQbGF0Zm9ybUxhdExvbmdEYXRhUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgUGxhdGZvcm1MYXRMb25nRGF0YVByb3ZpZGVyKCk7CisKKwkJCWZpbmFsIFVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaVN0cmluZyk7CisJCQlmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gaWRzID0gcHJvdmlkZXIuZ2V0SWRzKHVyaSk7CisJCQlpZiAoaWRzLnNpemUoKSA9PSAwKSB7CisJCQkJZXJyb3JNZXNzYWdlID0gIkludmFsaWQgQ291bnRyeSBjb2RlIHNwZWNpZmllZCI7CisJCQkJcmV0dXJuIHN0ZW1NYXA7CisJCQl9CisJCQlTdHJpbmcgbWF0Y2ggPSBzZWFyY2gudG9Mb3dlckNhc2UoKTsKKwkJCWZvciAoU3RyaW5nIGlkIDogaWRzKSB7CisJCQkJaWYgKGlkLnRvTG93ZXJDYXNlKCkuY29udGFpbnMobWF0Y2gpKSB7CisgICAgICAgICAgICAgICAgICAgIFVSSSB1cmlOb2RlID0gVVJJLmNyZWF0ZVVSSSh1cmlTdHJpbmcgKyAiIyIgKyBpZCk7ICAgICAgICAgICAgICAgIAorCQkJCSAgICBMYXRMb25nIGxhdExvbmcgPSBwcm92aWRlci5nZXRMYXRMb25nKHVyaU5vZGUpOworCQkJCSAgICBpZiAobGF0TG9uZyAhPSBudWxsICYmIGxhdExvbmcuc2l6ZSgpID4gMCkgeworCisJCQkJICAgIAlHRURhdGEgZGF0YSA9IG5ldyBHRURhdGEoaWQsIGxhdExvbmcpOworCQkJCSAgICAJLy8gVXNlIFMganVzdCB0byBnZXQgaXQgdG8gd29yaworCQkJCSAgICAJZGF0YS5zZXRWYWx1ZShBc3BlY3QuZ2V0QXNwZWN0KCJTIiksIDEuMCk7CisJCQkJICAgIAlzdGVtTWFwLnB1dChpZCwgZGF0YSk7CisJCQkJICAgIH0gZWxzZSB7CisJCQkJICAgIAlHRUxvZy5kZWJ1Zyh0aGlzLCAiTm8gc3BhY2lhbCBkYXRhIiArICIgTmFtZT0iICsgaWQpOworCQkJCSAgICB9CisJCQkJfQorCisJCQl9IC8vIGZvciBlYWNoIGlkCisJCQlpZiAoaWRzLnNpemUoKSA9PSAwKSB7CisJCQkJZXJyb3JNZXNzYWdlID0gIk5vIE1hdGNoaW5nIGludGVybmFsIEFkbWluaXN0cmF0aW9uIGFyZWEgZm91bmQiOworCQkJfQorCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCisJCQlHRUxvZy5lcnJvcigiRmFpbHVyZSBidWlsZGluZyBhcmVhIG1hcCIsIGUpOworCQkJc3RlbU1hcCA9IG51bGw7CisJCQllcnJvck1lc3NhZ2UgPSAiRXhjZXB0aW9uIHdoaWxlIGJ1aWxkaW5nIE1hcCI7CisJCX0KKworCQlyZXR1cm4gc3RlbU1hcDsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlIGEgZm9ybWF0ZWQgZGlzcGxheSB0byB1c2UgZm9yIGRlc2NyaXB0aW9uIAorCSAqIDxwcmU+CisJICogICBTOiAgIDI1LjMlIAorCSAqICAgSTogICAxMC4yJQorCSAqICAgLi4KKwkgKiAgIFI6ICAgIDAuMCUKKwkgKiA8L3ByZT4KKwkgKiBAcmV0dXJuIGZvcm1hdHRlZCBkZXNjcmlwdGlvbgorCSAqLworCXByaXZhdGUgU3RyaW5nIGZvcm1hdERlc2NyaXB0aW9uKFJlZ2lvbkltcGwgcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW9ncmFwaGljU2VsZWN0aW9uRWxlbWVudHMgZ3NlKSB7CisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMTI4KTsKKwkJTWFwPFN0cmluZyxEb3VibGU+IHJlbFZhbHVlcyA9IGdldFJlbFZhbHVlcyhyZWdpb24pOworCQlTZXQ8U3RyaW5nPiBhc3BlY3RzID0gcmVsVmFsdWVzLmtleVNldCgpOworCQlzYi5hcHBlbmQoIiZsdDtwcmUmZ3Q7Iik7CisJCXNiLmFwcGVuZChnZXRBcmVhSUQocmVnaW9uKSk7CisJCXNiLmFwcGVuZCgiICZsdDticiZndDsiKTsKKwkJZm9yKFN0cmluZyBhc3BlY3Q6YXNwZWN0cykgewkJCQorCQkJRG91YmxlIHJlbFZhbHVlID0gcmVsVmFsdWVzLmdldChhc3BlY3QpKjEwMDsKKwkJCS8vIGZvcm1hdCBhcyAiICAgICBTOiAxNS4xJSIKKwkJCVN0cmluZyByZXN1bHQ9IFN0cmluZy5mb3JtYXQoIiU4czogJTUuMWYlJSIsYXNwZWN0LHJlbFZhbHVlKTsKKwkJCXNiLmFwcGVuZChyZXN1bHQpOworCQkJLy8gYWRkIHRoZSBodG1sIGZvcm1hdHRpbmcgCisJCQlzYi5hcHBlbmQoIiAmbHQ7YnImZ3Q7Iik7CisJCX0KKwkJc2IuYXBwZW5kKCImbHQ7cHJlJmd0OyIpOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisJCisJLyoqCisJICogR2V0IHJlbGF0aXZlIHZhbHVlcyBmcm9tIHRoZSBHcmFwaC4KKwkgKiBXZSBhcmUgZ2l2ZW4gdGhlIFJlZ2lvbkltcGwgZm9yIHRoZSBBZG1pbiBBcmVhLgorCSAqIFdlIHdpbGwgZ2V0IHRoZSBsYWJsZSBmcm9tIGl0IHRoYXQgY29udGFpbnMgCisJICogcmVsYXRpdmUgdmFsdWVzIGFuZCBwdXQgdGhlbiBpbiBhIE1hcCB3aXRoIAorCSAqIHRoZSB2YWx1ZSBuYW1lIGFzIHRoZSBrZXkuCisJICogCisJICogQHBhcmFtIHJlZ2lvbgorCSAqIEByZXR1cm4gTWFwIGNvbnRhaW5pbmcgPG5hbWU6VmFsdWU+CisJICovCisJcHJpdmF0ZSBNYXA8U3RyaW5nLERvdWJsZT4gZ2V0UmVsVmFsdWVzKFJlZ2lvbkltcGwgcmVnaW9uKSB7CisJCU1hcDxTdHJpbmcsRG91YmxlPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERvdWJsZT4oKTsKKwkJCisJCUxpc3Q8Tm9kZUxhYmVsPiBub2RlcyA9IHJlZ2lvbi5nZXRMYWJlbHMoKTsKKwkJZm9yKE5vZGVMYWJlbCBub2RlOm5vZGVzKSB7CQkgCisJCQlSZWxhdGl2ZVZhbHVlUHJvdmlkZXIgcnZwID0gCisJCQkJKFJlbGF0aXZlVmFsdWVQcm92aWRlcikgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkJLmFkYXB0KG5vZGUsIFJlbGF0aXZlVmFsdWVQcm92aWRlci5jbGFzcyk7CisJCQkvLyBEb2VzIHRoZSBsYWJlbCBoYXZlIHJlbGF0aXZlIHZhbHVlcz8KKwkJCWlmIChydnAgIT0gbnVsbCkgewkJCQkJCisJCQkJZm9yIChJdGVyYXRvciBwcm9wZXJ0eUl0ZXIgPSAKKwkJCQkJICBydnAuZ2V0UHJvcGVydGllcygpLml0ZXJhdG9yKCk7IHByb3BlcnR5SXRlci5oYXNOZXh0KCk7KSB7CisJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkgPSAKKwkJCQkJCShJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSBwcm9wZXJ0eUl0ZXIubmV4dCgpOwkJCQorCQkJCQlTdHJpbmcgbmFtZSA9IHByb3BlcnR5LmdldERpc3BsYXlOYW1lKHByb3BlcnR5KTsJCQkJCQorCQkJCQlEb3VibGUgdmFsdWUgPSBydnAuZ2V0UmVsYXRpdmVWYWx1ZShwcm9wZXJ0eSk7CisJCQkJICAgIG1hcC5wdXQobmFtZSwgdmFsdWUpOwkJCQkJCQkJCisJCQkgICAgfSAvLyBmb3IJCQkJCisJCQl9CQkJCisJCX0gLy8gZm9yCisgICAgICAgIHJldHVybiBtYXA7CisJfQorCS8qKgorCSAqIEdldCBnZW9ncmFwaGljYWwgYm9yZGVyIG9mIHRoZSBub2RlLiBXZSdkIGxpa2UgdG8gaGF2ZSBhY2Nlc3MgdG8gbGF0L2xvbmcKKwkgKiBkYXRhIG9mIHRoZSBub2RlIGlmIHRoZXJlIGlzIGFueSwgdG8gZG8gdGhhdCB3ZSB1c2UgYSBmYWN0b3J5IHRvIGNyZWF0ZQorCSAqIGFuIGFkYXB0ZXIgdGhhdCBrbm93cyBhYm91dCB0aGUgaW5uZXIgZGV0YWlscyBvZiBub2RlcyAoaXQgcmVhbGx5IGtub3dzCisJICogYWJvdXQgYWxsIElkZW50aWZpYWJsZXMpIGFuZCBpbXBsZW1lbnRzIHRoZSBMYXRMb25nUHJvdmlkZXIgaW50ZXJmYWNlLgorCSAqIAorCSAqIEBwYXJhbSBub2RlCisJICogQHJldHVybiBib3JkZXIgb2YgdGhlIG5vZGUgZXNwcmVzc2VkIGFzIGFuIGFycmF5IG9mIGxvbmcvbGF0aXR1ZGUgcG9pbnRzLgorCSAqLworCUxhdExvbmcgZ2V0TGF0TG9uZyhmaW5hbCBOb2RlIG5vZGUpIHsJCQorCisJCS8vIFRoZSBub2RlIG1heSBvciBtYXkgbm90IGhhdmUgbGF0L2xvbmcgZGF0YSBhc3NvY2lhdGVkIHdpdGgKKwkJLy8gaXQsIGlmIGl0IGRvZXNuJ3QgdGhlIGxpc3QgdGhhdCdzIHJldHVybmVkIHdpbGwgYmUgZW1wdHkuCisKKwkJdHJ5IHsKKwkJCWZpbmFsIExhdExvbmdQcm92aWRlckFkYXB0ZXIgbGF0TG9uZ1Byb3ZpZGVyID0gCisJCQkJKExhdExvbmdQcm92aWRlckFkYXB0ZXIpIExhdExvbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkgICAgLmFkYXB0KG5vZGUsIExhdExvbmdQcm92aWRlci5jbGFzcyk7CisJCQlsYXRMb25nUHJvdmlkZXIuc2V0VGFyZ2V0KG5vZGUpOworCQkJcmV0dXJuIGxhdExvbmdQcm92aWRlci5nZXRMYXRMb25nKCk7CisJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworCQkJR0VMb2cuZGVidWcodGhpcyxlLmdldE1lc3NhZ2UoKSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKwkKKwkKKyAgICAvKioKKwkgKiBDaGVjayBpZiB0aGUgc3BlY2lmaWVkIHNpbXVsYXRpb24gaXMgYWN0aXZlbHkgCisJICogYmVpbmcgbGlzdGVuZWQgdG8uIEEgc2ltdWxhdGlvbiBpcyBhY3RpdmUgaWYKKwkgKiBpdCBpcyBsaXN0ZWQgaW4gdGhlIG1hcCBvZiBhY3RpdmUgc2ltdWxhdGlvbnMKKwkgKiBhbmQgY2FuIHRoZXJlZm9yZSBiZSBtYW51YWxseSBkaXNwbGF5ZWQuCisJICogCisJICogQHBhcmFtIHNpbQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWN0aXZlLCA8Y29kZT5mYWxzZTwvY29kZT4gaW4gbm90IGFjdGl2ZSBvciBub24gZXhpc3RlbnQKKwkgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiAgaXNBY3RpdmUoSVNpbXVsYXRpb24gc2ltKSB7CisgICAgCQorICAgICAgICBTdHJpbmcgbmFtZSA9IGdldFNpbXVsYXRpb25JZChzaW0pOwkJCisJCUdFU2ltRW50cnkgZXhpc3RpbmcgPSBhY3RpdmVTaW11bGF0aW9ucy5nZXQobmFtZSk7CisJCXJldHVybiAoZXhpc3RpbmcgPT0gbnVsbCkgPyBmYWxzZSA6IGV4aXN0aW5nLmFjdGl2ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisJICogQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBzaW11bGF0aW9uIGlzIHRoZSBzaW11bGF0aW9uCisJICogYmVpbmcgdmlld2VkIGJ5IEdvb2dsZUVhcnRoCisJICogCisJICogQHBhcmFtIHNpbQorCSAqIEByZXR1cm4gdHJ1ZSBpZiBhY3RpdmVWaWV3CisJICovCisgICAgcHVibGljIGJvb2xlYW4gIGlzQWN0aXZlVmlldyhJU2ltdWxhdGlvbiBzaW0pIHsKKyAgICAJCisgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0U2ltdWxhdGlvbklkKHNpbSk7CQkKKwkJcmV0dXJuIG5hbWUuZXF1YWxzKGFjdGl2ZVZpZXcpOworICAgIH0KKwkvKioKKwkgKiBTZXQgdGhlIGxvZ2dpbmcgZm9yIHRoZSBzcGVjaWZpZWQgc2ltdWxhdGlvbi4KKwkgKiBUaGlzIGNyZWF0ZXMgdGhlIEdFU2ltRW50cnkgd2hpY2ggaXMgdXNlZCB0byBjb2xsZWN0IAorCSAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBJU2ltdWxhdGlvbiBpbnN0YW5jZSB0byB1c2VkIAorCSAqIHRvIGJ1aWxkIEtNTCBmaWxlcy4KKwkgKiAKKwkgKiBAcGFyYW0gc2ltICBTaW11bGF0aW9uIGluc3RhbmNlIGJlaW5nIGFjdGl2YXRlZCAKKwkgKiAgICAgICAgICAgICAob3IgZGVhY3RpdmF0ZWQpIAorCSAqIEBwYXJhbSBhY3RpdmUgIHNldCB0cnVlIHRvIHdyaXRlIGZpbGUsIAorCSAqICAgICAgICAgICAgICAgIHNldCBmYWxzZSB0byBieXBhc3Mgd3JpdGUKKwkgKiBAcmV0dXJuIHRydWUgaWYgb2ssIGZhbHNlIGluIGZhaWxlZCB3aXRoCisJICogICAgICAgICAgIGVycm9yTWVzc2FnZQorCSAqLworCXB1YmxpYyBib29sZWFuIHNldEFjdGl2ZShJU2ltdWxhdGlvbiBzaW0sIGJvb2xlYW4gYWN0aXZlKSB7CisJCQorCQlTdHJpbmcgbmFtZSA9IGdldFNpbXVsYXRpb25JZChzaW0pOwkJCisJCUdFU2ltRW50cnkgZXhpc3RpbmcgPSBhY3RpdmVTaW11bGF0aW9ucy5nZXQobmFtZSk7CisJCUdFTG9nLmRlYnVnKHRoaXMuZ2V0Q2xhc3MoKSwic2V0QWN0aXZlOiAiK25hbWUrIiAgIithY3RpdmUpOworCQlpZiAoZXhpc3RpbmcgIT0gbnVsbCkgeworCQkJLy8gaWYgYWxyZWFkeSBrbm93biBhYm91dAorCQkJaWYgKGV4aXN0aW5nLmFjdGl2ZSA9PSBhY3RpdmUpIHsKKwkJCQkvLyBubyBjaGFuZ2UgaW4gc3RhdGUgZG8gbm90aGluZworCQkJCXJldHVybiB0cnVlOworCQkJfSBlbHNlIAl7CisJCQkJZXhpc3RpbmcuYWN0aXZlID0gYWN0aXZlOworCQkJCWlmICghZXhpc3RpbmcuYWN0aXZlKSB7CQorLy8JCQkJCSBkbyBhbnl0aGluZyBpZiBkZWFjdGl2YXRlZD8/Pz8KKwkJCQkJaWYgKG5hbWUuZXF1YWxzKGFjdGl2ZVZpZXcpKQorCQkJCQkJYWN0aXZlVmlldyA9IG51bGw7CQkJCSAgCisJCQkJfSAgCisJCQl9CQkJCisJCX0gZWxzZSB7CisJCQkvLyBuZXcgZW50cnkJCQkKKwkJCWV4aXN0aW5nID0gbmV3IEdFU2ltRW50cnkobmFtZSxzaW0pOworCQkJZXhpc3RpbmcuYWN0aXZlID0gYWN0aXZlOworCQkJYWN0aXZlU2ltdWxhdGlvbnMucHV0KG5hbWUsIGV4aXN0aW5nKTsKKwkJCWV4aXN0aW5nLnNldEFzcGVjdFRvRGlzcGxheShHRVByZWZlcmVuY2VQYWdlLmdldEFzcGVjdCgpKTsKKwkJCQorCQkJLy9IYW5kbCB0aGlzIGJhc2VkIG9uIGNvbW11bmljYXRpb24gbWV0aG9kCisJCQlpZiAoYWN0aXZlKSB7CisJCQkJU3RyaW5nIGVudHJ5Rm9sZGVyID0gZXhpc3RpbmcuZ2V0TG9nRm9sZGVyKCk7CisJCQkJaW50IG1ldGhvZCA9IEdFUHJlZmVyZW5jZVBhZ2UuZ2V0TWV0aG9kKCk7CisJCQkJCisJCQkJc3dpdGNoIChtZXRob2QpIHsJCQkJCisJCQkJY2FzZSBHRVByZWZlcmVuY2VQYWdlLk1fTE9HX09OTFk6CisJCQkJCS8vIGxvZyB0aGUgZmlsZSBidXQgbm8gbGF1bmNoIG9yIG5ldGxpbmsKKwkJCQkJaWYgKGdlVmlldyAhPSBudWxsKSB7CisJCQkJCQllbnRyeUZvbGRlciA9IEdFUHJlZmVyZW5jZVBhZ2UuZ2V0Rm9sZGVyKCk7CisJCQkJCQllbnRyeUZvbGRlciA9IGdlVmlldy52ZXJpZnlGb2xkZXIoZW50cnlGb2xkZXIpOworCQkJCQkJZXhpc3Rpbmcuc2V0TG9nRm9sZGVyKGVudHJ5Rm9sZGVyKTsKKwkJCQkJCWV4aXN0aW5nLnNldE1ldGhvZChtZXRob2QpOworCQkJCQl9IAorCQkJCQlzaW0uYWRkU2ltdWxhdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEdFUHJlZmVyZW5jZVBhZ2UuTV9MT0dfU0VSVkxFVDoKKwkJCQkJLy8gbG9nIGZpbGUgYW5kIGxhdW5jaCBhIG5ldGxpbmsgdG8gZGlzcGxheQkJCQkKKwkJCQkJaWYgKGdlVmlldyAhPSBudWxsKSB7CisJCQkJCQllbnRyeUZvbGRlciA9IEdFUHJlZmVyZW5jZVBhZ2UuZ2V0Rm9sZGVyKCk7CisJCQkJCQllbnRyeUZvbGRlciA9IGdlVmlldy52ZXJpZnlGb2xkZXIoZW50cnlGb2xkZXIpOworCQkJCQkJZXhpc3Rpbmcuc2V0TG9nRm9sZGVyKGVudHJ5Rm9sZGVyKTsKKwkJCQkJfSAKKwkJCQkJaWYgKGVudHJ5Rm9sZGVyICE9IG51bGwpIHsJCQkJCQorCQkJCQkJaWYgKGFjdGl2ZVZpZXcgPT0gbnVsbCkgeworCQkJCQkJCVN0ZW1LbWwuc2V0V2FpdEZvcktNTCh0cnVlKTsKKwkJCQkJCQlTdGVtS21sLmxhdW5jaE5ldHdvcmtMaW5rKGVudHJ5Rm9sZGVyLG51bGwpOworCQkJCQkJCWFjdGl2ZVZpZXcgPSBuYW1lOworCQkJCQkJCXNpbS5hZGRTaW11bGF0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJCQkJZXhpc3Rpbmcuc2V0TWV0aG9kKG1ldGhvZCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWVycm9yTWVzc2FnZSA9IlNpbXVsYXRpb24gIisKKwkJCQkJCQkJYWN0aXZlVmlldysKKwkJCQkJCQkJIiBhbHJlYWR5IGFjdGl2ZSBvbiBHb29nbGVFYXJ0aC4iOworCQkJCQkJCUdFTG9nLmRlYnVnKHRoaXMsZXJyb3JNZXNzYWdlKTsKKwkJCQkJCQlleGlzdGluZy5hY3RpdmUgPSBmYWxzZTsKKwkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQl9CisJCQkJCX0gCisJCQkJCWJyZWFrOworCQkJCWNhc2UgR0VQcmVmZXJlbmNlUGFnZS5NX0FTWU5DX1NFUlZMRVQ6CisKKwkJCQkJLy8gd3JpdGUgY29udHJvbC5rbWwgYW5kIAorCQkJCQkvLyBsYXVuY2ggbmV0bGluayB0byBkaXNwbGF5IGNvbnRyb2wua21sCisJCQkJCS8vIGV2ZXJ5IG4gc2Vjb25kcworCQkJCQlTdHJpbmcga21sZm4gPSBTdGVtS21sLmdldENvbnRyb2xGaWxlKCk7CisJCQkJCUZpbGUgZiA9IG5ldyBGaWxlKGttbGZuKTsKKwkJCQkJU3RyaW5nIHBhcmVudCA9IGYuZ2V0UGFyZW50KCkrRmlsZS5zZXBhcmF0b3I7CisJCQkJCWttbGZuID0gZi5nZXROYW1lKCk7CisJCQkJCWttbGZuID0gcGFyZW50KyBrbWxmbi5yZXBsYWNlKCIuIiwiX0N1cnJlbnQuIik7CisJCQkJCWlmIChhY3RpdmVWaWV3ID09IG51bGwpIHsKKwkJCQkJCVN0ZW1LbWwuc2V0V2FpdEZvcktNTCh0cnVlKTsKKwkJCQkJCVN0ZW1LbWwubGF1bmNoTmV0d29ya0xpbmsoZW50cnlGb2xkZXIsa21sZm4pOworCQkJCQkJYWN0aXZlVmlldyA9IG5hbWU7CisJCQkJCQlzaW0uYWRkU2ltdWxhdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJCQkJZXhpc3Rpbmcuc2V0TWV0aG9kKG1ldGhvZCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQllcnJvck1lc3NhZ2UgPSJTaW11bGF0aW9uICIrCisJCQkJCQkJYWN0aXZlVmlldysKKwkJCQkJCQkiIGFscmVhZHkgYWN0aXZlIG9uIEdvb2dsZUVhcnRoLiI7CisJCQkJCQlHRUxvZy5kZWJ1Zyh0aGlzLGVycm9yTWVzc2FnZSk7CisJCQkJCQlleGlzdGluZy5hY3RpdmUgPSBmYWxzZTsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCWNhc2UgR0VQcmVmZXJlbmNlUGFnZS5NX0FVVE9fTEFVTkNIOgorCQkJCQlpZiAoYWN0aXZlVmlldyA9PSBudWxsICkgewkJCQkJCisJCQkJCQlhY3RpdmVWaWV3ID0gbmFtZTsKKwkJCQkJCXNpbS5hZGRTaW11bGF0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJCQlleGlzdGluZy5zZXRNZXRob2QobWV0aG9kKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWVycm9yTWVzc2FnZSA9IlNpbXVsYXRpb24gIisKKwkJCQkJCQkJYWN0aXZlVmlldysKKwkJCQkJCSIgYWxyZWFkeSBhY3RpdmUgb24gR29vZ2xlRWFydGguIjsKKwkJCQkJCUdFTG9nLmRlYnVnKHRoaXMsZXJyb3JNZXNzYWdlKTsKKwkJCQkJCWV4aXN0aW5nLmFjdGl2ZSA9IGZhbHNlOworCQkJCQkJc2ltLmFkZFNpbXVsYXRpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJYnJlYWs7CQorCQkJCWNhc2UgR0VQcmVmZXJlbmNlUGFnZS5NX01BTlVBTF9ESVNQTEFZOgorCQkJCQlzaW0uYWRkU2ltdWxhdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJCQlleGlzdGluZy5zZXRNZXRob2QobWV0aG9kKTsKKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCisJCQkJfS8vIHN3aXRjaAorCQkJfQorCQl9CisJCXJldHVybiB0cnVlOwkJCisJfQorCS8qKgorCSAqIFNldCB0aGUgU0VJUiB2YWx1ZSB0aGF0IHd3ZSB3YW50IGRpc3BsYXllZC4KKwkgKiAKKwkgKiBAcGFyYW0gc2ltICBTaW11bGF0aW9uIGluc3RhbmNlCisJICogQHBhcmFtIGFzcGVjdCB0aGUgc0VJUlZhbHVlIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldEFzcGVjdFRvRGlzcGxheShJU2ltdWxhdGlvbiBzaW0sIEFzcGVjdCBhc3BlY3QpIHsKKwkJaWYgKHNpbSA9PSBudWxsKSB7CisJCQlzZXREZWZhdWx0QXNwZWN0KGFzcGVjdCk7CisJCX0gZWxzZSB7CisJCQlTdHJpbmcgbmFtZSA9IGdldFNpbXVsYXRpb25JZChzaW0pOworCQkJR0VTaW1FbnRyeSBleGlzdGluZyA9IGFjdGl2ZVNpbXVsYXRpb25zLmdldChuYW1lKTsKKworCQkJaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKKwkJCQkvLyBpZiBhbHJlYWR5IGtub3duIGFib3V0CisJCQkJZXhpc3Rpbmcuc2V0QXNwZWN0VG9EaXNwbGF5KGFzcGVjdCk7CisJCQl9IGVsc2UgeworCQkJCXNldERlZmF1bHRBc3BlY3QoYXNwZWN0KTsKKwkJCX0KKwkJfQorCX0KKwkvKioKKwkgKiBHZXQgdGhlIFNFSVIgdmFsdWUgdG8gYmUgZGlzcGxheWVkIGZyb20gdXNlci4KKwkgKiAKKwkgKiBAcGFyYW0gc2ltCisJICogICAgICAgICAgICBTaW11bGF0aW9uIGluc3RhbmNlCisJICogQHJldHVybiB0aGUgc0VJUlZhbHVlIHRvIGRpc3BsYXkKKwkgKi8KKwlwdWJsaWMgQXNwZWN0IGdldEFzcGVjdFRvRGlzcGxheShJU2ltdWxhdGlvbiBzaW0pIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRTaW11bGF0aW9uSWQoc2ltKTsJCQorCQlHRVNpbUVudHJ5IGV4aXN0aW5nID0gYWN0aXZlU2ltdWxhdGlvbnMuZ2V0KG5hbWUpOworCQlBc3BlY3QgdmFsdWUgPSBudWxsOworCQlpZiAoZXhpc3RpbmcgIT0gbnVsbCkgeworCQkJLy8gaWYgYWxyZWFkeSBrbm93biBhYm91dAorCQkJdmFsdWUgPSBleGlzdGluZy5nZXRBc3BlY3RUb0Rpc3BsYXkoKTsKKwkJCQorCQl9IGVsc2UgeworCQkJdmFsdWUgPSBnZXREZWZhdWx0QXNwZWN0KCk7CisJCX0KKwkJcmV0dXJuIHZhbHVlOworCX0KKwkvKioKKwkgKiBkaXNwbGF5IHN0YXR1cy4KKwkgKiAKKwkgKiBUaGlzIHdpbGwgZGlzcGxheSBvbiB0aGUgY29uc29sZSBhIGxvdCBvZiAKKwkgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZW52aXJvbm1lbnQuIAorCSAqIEN1cnJlbnRseSBpdCBkaXNwbGF5cyB0aGUgc3RhdHVzIG9uIHRoZSBjb25zb2xlLgorCSAqIEF0IHNvbWUgcG9pbnQgdGhlIGltcG9ydGFudCBzdGF0dXMgbWF5IGJlIAorCSAqIHBsYWNlZCBpbnRvIGEgZGlhbG9nIGJveCBhbmQgZGlzcGxheWVkLgorCSAqVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGlzIHRvIGhhdmUgYSB3YXkgdG8gCisJICpkaXNwbGF5IGludGVyZXN0aW5nIHN0dWZmLiAKKwkgKiBJdCBjYW4gYmUgdXNlZCBhcyBhIHByb2JsZW0gcmVwb3J0aW5nIGFpZCAKKwkgKiBzaW5jZSBvbmUgY2FuIHRha2UgdGhlIG91dHB1dCBhbmQgdXNlIGl0IGluIHRoZSAKKwkgKiBwcm9ibGVtIGRlc2NyaXB0aW9uLiAgU28gaXQgaXMgaW1wb3J0YW50IHRoYXQgaW5mb3JtYXRpb24KKwkgKiB0aGF0IGlzIG5lZWRlZCBpbiBkaWFnbm9zaW5nIHByb2JsZW1zIHdpdGggdGhlIAorCSAqIFNURU0tR0UgaW50ZXJmYWNlIGJlIGRpc3BsYXllZCBoZXJlLgorCSAqCisJICoKKwkgKgkgCisJICovCisJcHVibGljIHZvaWQgZGlzcGxheVN0YXR1cygpIHsKKwkJYm9vbGVhbiBzYXZlRGVidWcgPSBHRUxvZy5ERUJVRzsKKwkJR0VMb2cuREVCVUcgPSB0cnVlOworCQkvLyBkaXNwbGF5IFByZWZlcmVuY2VzCisJCUdFTG9nLmRlYnVnKHRoaXMsR0VQcmVmZXJlbmNlUGFnZS5kaXNwbGF5KCkpOworCQlmaW5hbCBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IAorCQkJb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLkFjdGl2YXRvci5nZXREZWZhdWx0KCkKKwkJCQkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJYm9vbGVhbiBzaW11bGF0aW9uU2xlZXAgPSBwcmVmZXJlbmNlcworCQkJCS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuU0lNVUxBVElPTl9TTEVFUF9CT09MRUFOKTsKKwkgICAgLy8gZGlzcGxheSBhbiBpbXBvcnRhbnQgZGVsYXkgdmFsdWUuICBHRSBuZWVkcyBpdCAgIAorCQlpbnQgc2ltdWxhdGlvblNsZWVwU2Vjb25kcyA9IHByZWZlcmVuY2VzCisJCQkJLmdldEludChQcmVmZXJlbmNlQ29uc3RhbnRzLlNJTVVMQVRJT05fU0xFRVBfTUlMTElTRUNPTkRTX0lOVEVHRVIpICogMTAwMDsKKwkJR0VMb2cuZGVidWcodGhpcywiU0lNVUxBVElPTl9TTEVFUDogIgorCQkJCSAgICAgICAgICAgICtzaW11bGF0aW9uU2xlZXApOworCQlHRUxvZy5kZWJ1Zyh0aGlzLCJTSU1VTEFUSU9OX1NMRUVQX1NFQ09ORFM6ICIKKwkJCQkgICAgICAgICAgICArc2ltdWxhdGlvblNsZWVwU2Vjb25kcyk7CisJCUdFTG9nLmRlYnVnKHRoaXMsImFjdGl2ZVZpZXc6ICIrYWN0aXZlVmlldyk7CisJCWlmIChhY3RpdmVTaW11bGF0aW9ucy5zaXplKCkgPT0gMCkgeworCQkJR0VMb2cuZGVidWcodGhpcywiTm8gYWN0aXZlIFNpbXVsYXRpb25zIik7CisKKwkJfSBlbHNlIHsKKwkJCUdFTG9nLmRlYnVnKHRoaXMsIkFjdGl2ZSBTaW11bGF0aW9uczogIithY3RpdmVTaW11bGF0aW9ucy5zaXplKCkpOworCQkJZm9yIChNYXAuRW50cnkgZW50cnkgOiBhY3RpdmVTaW11bGF0aW9ucy5lbnRyeVNldCgpKSB7CisJCQkJR0VTaW1FbnRyeSBnZVNpbSA9IChHRVNpbUVudHJ5KWVudHJ5LmdldFZhbHVlKCk7CisJCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWVudHJ5LmdldEtleSgpOworCQkJCUlTaW11bGF0aW9uIHNpbSA9IGdlU2ltLmdldFNpbXVsYXRpb24oKTsKKwkJCQl0cnkgeworCQkJCQlHRUxvZy5kZWJ1Zyh0aGlzLCIgIFNpbXVsYXRpb246ICIrCQkJCQkJCQorCQkJCQkJCSIgIitnZVNpbS50b1N0cmluZygpKTsKKwkJCQkJCisJCQkJCUdFTG9nLmRlYnVnKHRoaXMsIiAgU3RhdGU6ICIrc2ltLmdldFNpbXVsYXRpb25TdGF0ZSgpKTsKKwkJCQkJCQkKKwkJCQkJR0VTaW1FbnRyeSBleGlzdGluZyA9IGFjdGl2ZVNpbXVsYXRpb25zLmdldChuYW1lKTsKKwkJCQkJR0VMb2cuZGVidWcodGhpcywiICBHRVNpbUVudHJ5OiAiK2V4aXN0aW5nKTsJCQorCQkJCQlTY2VuYXJpbyBzY2VuYXJpbyA9IHNpbS5nZXRTY2VuYXJpbygpOworCQkJCQlHRUxvZy5kZWJ1Zyh0aGlzLCIgIFNjZW5hcmlvOiAiK3NjZW5hcmlvKTsKKwkJCQkJRHVibGluQ29yZSBkYyA9IHNjZW5hcmlvLmdldER1YmxpbkNvcmUoKTsKKwkJCQkJR0VMb2cuZGVidWcodGhpcywiICBTY2VuYXJpbyBEdWJsaW5Db3JlOiAiK2RjKTsKKwkJCQkJU2VxdWVuY2VyIHNlcXVlbmNlciA9IHNjZW5hcmlvLmdldFNlcXVlbmNlcigpOworCQkJCQlHRUxvZy5kZWJ1Zyh0aGlzLCIgIFNlcXVlbmNlcjogIitzZXF1ZW5jZXIpOworCQkJCQlNb2RlbCBtb2RlbCA9IHNjZW5hcmlvLmdldE1vZGVsKCk7CisJCQkJCUdFTG9nLmRlYnVnKHRoaXMsIiAgTW9kZWw6ICIrbW9kZWwpOworCQkJCQkvL0dFTG9nLmRlYnVnKHRoaXMsIiAgTG9uZ0xhdDogIitkaXNwbGF5TGF0TG9uZyhzaW0pKTsKKwkJCQkJLy9HRUxvZy5kZWJ1Zyh0aGlzLCIgIEFzcGVjdDogIitkaXNwbGF5QXNwZWN0KHNpbSkpOworCQkJCQkKKwkJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCQkJCQlHRUxvZy5lcnJvcigiRGlzcGxheSBTdGF0dXMgZmFpbHVyZSIsIHQpOworCisJCQkJfQorCQkJfQorCQl9CisJCUdFTG9nLkRFQlVHID0gc2F2ZURlYnVnOworCX0KKwkvKioKKwkgKiBkaXNwbGF5IHRoZSBMYXRMb25nIGRhdGEuCisJICogVGhpcyBpcyBtb3N0bHkgZm9yIGRlYnVnIHVzYWdlLgorCSAqIAorCSAqIAorCSAqIEBwYXJhbSBzaW11bGF0aW9uIHRoYXQgd2lsbCBiZSBzaG93bgorCSAqIEByZXR1cm4gZGlzcGxheSBzdHJpbmcgb2YgbGF0bG9uZyBkYXRhCisJICogCisJICovCisJCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHJpdmF0ZSBTdHJpbmcgZGlzcGxheUxhdExvbmcoSVNpbXVsYXRpb24gc2ltdWxhdGlvbikgeworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJaW50IGNvdW50ZXIgPSAwOworCQl0cnkgeworCQkJc2IuYXBwZW5kKCJMYXRMb25nIGRhdGE6ICIpOwkJCQorCQkJU2NlbmFyaW8gc2NlbmFyaW8gPSBzaW11bGF0aW9uLmdldFNjZW5hcmlvKCk7CisJCQkKKwkJCS8vCQkgV2UgZ2V0IHRoZSBncmFwaC4uLgorCQkJZmluYWwgR3JhcGggY2Fub25pY2FsR3JhcGggPSBzY2VuYXJpby5nZXRDYW5vbmljYWxHcmFwaCgpOworCQkJR0VMb2cuZGVidWcodGhpcywiZGlzcGxheUxhdExvbmcoKTogY2Fub25pY2FsR3JhcGg9IitjYW5vbmljYWxHcmFwaCk7CisJCQlpZiAoY2Fub25pY2FsR3JhcGggPT0gbnVsbCkgeworCQkJCUdFTG9nLmRlYnVnKHRoaXMsImRpc3BsYXlMYXRMb25nKCk6IGNhbm9uaWNhbEdyYXBoIGlzIG51bGwiKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCS8vIC4uLmFuZCBjYW4gbm93IGl0ZXJhdGUgdGhyb3VnaCB0aGUgbm9kZXMuIE5vdGUgdGhhdCB0aGUgbWV0aG9kCisJCQkvLyAiZ2V0Tm9kZXMiIHJldHVybnMgYSBtYXAgaW5kZXhlZCBieSB0aGUgVVJJIG9mIGVhY2ggb2YgdGhlIG5vZGVzLAorCQkJLy8gdGh1cyB3ZSBuZWVkIHRvIGdldCB0aGUgdmFsdWVzIG9mIHRoZSBtYXAgdG8gaGF2ZSBhbiBhY3R1YWwgbGlzdCB0bworCQkJLy8gaXRlcmF0b3Igb3Zlci4JCQkJCisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yIG5vZGVJdGVyID0gY2Fub25pY2FsR3JhcGguZ2V0Tm9kZXMoKS52YWx1ZXMoKQorCQkJCQkuaXRlcmF0b3IoKTsgbm9kZUl0ZXIuaGFzTmV4dCgpOykgeworCQkJCWNvdW50ZXIrKzsKKwkJCQlpZiAoY291bnRlcj4xMDApIHsKKwkJCQkJc2IuYXBwZW5kKCJcbiBMaW1pdCBvZiAxMDAgcmVhY2hlZCIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZmluYWwgTm9kZSBub2RlID0gKE5vZGUpIG5vZGVJdGVyLm5leHQoKTsKKwkJCSAgICBTdHJpbmcgbm9kZVRpdGxlID0gbm9kZS5nZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKTsKKwkJCSAgICBzYi5hcHBlbmQoIlxuIisiTm9kZTogIitub2RlVGl0bGUpOworCQkJICAgIGZpbmFsIExhdExvbmdQcm92aWRlckFkYXB0ZXIgbGF0TG9uZ1Byb3ZpZGVyID0gKExhdExvbmdQcm92aWRlckFkYXB0ZXIpIExhdExvbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJICAgICAgICAgICAgIC5hZGFwdChub2RlLCBMYXRMb25nUHJvdmlkZXIuY2xhc3MpOworCQkJICAgbGF0TG9uZ1Byb3ZpZGVyLnNldFRhcmdldChub2RlKTsKKwkJCSAgIAorICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIG1heSBvciBtYXkgbm90IGhhdmUgbGF0L2xvbmcgZGF0YSBhc3NvY2lhdGVkIHdpdGgKKwkJCQkvLyBpdCwgaWYgaXQgZG9lc24ndCB0aGUgbGlzdCB0aGF0J3MgcmV0dXJuZWQgd2lsbCBiZSBlbXB0eS4KKwkJCQlmaW5hbCBMYXRMb25nIGxhdExvbmdEYXRhID0gbGF0TG9uZ1Byb3ZpZGVyLmdldExhdExvbmcoKTsKKwkJCQlpZiAobGF0TG9uZ0RhdGEgIT0gbnVsbCAmJiBsYXRMb25nRGF0YS5zaXplKCkgPiAwKSB7CisJCQkJCS8vR0VMb2cuZGVidWcodGhpcywiZGlzcGxheUxhdExvbmcoKTogTm9kZT0iK25vZGVUaXRsZSk7CisgICAgICAgICAgICAgICAgICAgIC8vCU5vdyB3ZSBqdXN0IGdvIHRocm91Z2ggZWFjaCBzZWdtZW50IGFuZCBjcmVhdGUgYSBzdHJpbmcuCisJCQkJCWZvciAoU2VnbWVudCBzZWdtZW50IDogbGF0TG9uZ0RhdGEuZ2V0U2VnbWVudHMoKSkgeworCQkJCQkJU3RyaW5nIGRhdGEgPSBjcmVhdGVTdHJpbmdPZkxhdExvbmdEYXRhKHNlZ21lbnQpOworCQkJCQkJc2IuYXBwZW5kKCJMYXRMb25nOiAiK2RhdGEpOworCQkJCQl9IC8vIGZvcgorCQkJCSAgICAJCQkJCQkJICAKKwkJCQl9IGVsc2UgeworCQkJCQlHRUxvZy5kZWJ1Zyh0aGlzLCJidWlsZE1hcCgpKCk6IE5vIHNwYWNpYWwgZGF0YSBmb3IgTm9kZT0iK25vZGVUaXRsZSk7CisJCQkJfQorCQkJCQorCQkJfSAvLyBmb3IgZWFjaCBub2RlCisJCQkKKwkJCQkKKwkJCQorCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJCisJCQlHRUxvZy5lcnJvcigiRmFpbHVyZSBidWlsZGluZyBhcmVhIG1hcCIsIGUpOworCQkJCisJCX0KKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CQorCX0KKwkKKwkvKioKKwkgKiBkaXNwbGF5IHRoZSBBc3BlY3QgZGF0YS4KKwkgKiBUaGlzIGlzIG1vc3RseSBmb3IgZGVidWcKKwkgKiAKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbiB0aGF0IHdpbGwgYmUgc2hvd24KKwkgKiBAcmV0dXJuIERpc3BsYXkgc3RyaW5nIGNvbnRhaW5pbmcgaW5mbyBhYm91dCBTRUlSIHZhbHVlZAorCSAqIAorCSAqLworCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHJpdmF0ZSBTdHJpbmcgZGlzcGxheUFzcGVjdChJU2ltdWxhdGlvbiBzaW11bGF0aW9uKSB7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQl0cnkgeworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAwOworCQkJU2NlbmFyaW8gc2NlbmFyaW8gPSBzaW11bGF0aW9uLmdldFNjZW5hcmlvKCk7CQkKKwkJCQkJCisJCQkvLwkJIFdlIGdldCB0aGUgZGVjb3JhdG9ycyBmcm9tIHRoZSBzY2VuYXJpbyAuLi4JCQkKKworCQkJCisJCQlHcmFwaCBnID0gc2NlbmFyaW8uZ2V0Q2Fub25pY2FsR3JhcGgoKTsKKwkJCQorCQkJRGVjb3JhdG9yW10gZGVjb3JhdG9ycyA9IGcuZ2V0RGVjb3JhdG9ycygpLnRvQXJyYXkobmV3IERlY29yYXRvcltnLmdldERlY29yYXRvcnMoKS5zaXplKCldKTsKKwkJCWZvciAoRGVjb3JhdG9yIGRlY29yYXRvciA6IGRlY29yYXRvcnMpIHsKKwkJCQlHRUxvZy5kZWJ1Zyh0aGlzLCJkZWNvcmF0b3I6ICIrZGVjb3JhdG9yLnRvU3RyaW5nKCkpOworCQkJCQorCQkJCU9iamVjdFtdIGxhYmVscyA9IGRlY29yYXRvci5nZXRMYWJlbHNUb1VwZGF0ZSgpLnRvQXJyYXkoKTsKKwkJCQlmb3IgKE9iamVjdCBlbGVtZW50OiBsYWJlbHMpeworCQkJCQljb3VudGVyKys7CisJCQkJCWlmIChjb3VudGVyPjEwMCkgeworCQkJCQkJc2IuYXBwZW5kKCJcbiBMaW1pdCBvZiAxMDAgcmVhY2hlZCIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgTm9kZUxhYmVsKSB7CisJCQkJCQlOb2RlTGFiZWwgbm9kZUxhYmVsID0gKE5vZGVMYWJlbCllbGVtZW50OworCQkJCQkJTm9kZSBub2RlID0gbm9kZUxhYmVsLmdldE5vZGUoKTsKKwkJCQkJCVN0cmluZyB0aXRsZSA9IG5vZGUuZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlxuTm9kZTogIit0aXRsZSsiICIpOworCQkJCQkJUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciBydnAgPSAoUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcikgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkJCS5hZGFwdChlbGVtZW50LCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIuY2xhc3MpOworCQkJCQkJcnZwLnNldFRhcmdldCgoTm90aWZpZXIpZWxlbWVudCk7CisJCQkJCQkKKwkJCQkJCS8vIERvZXMgdGhlIGxhYmVsIGhhdmUgcmVsYXRpdmUgdmFsdWVzPworCQkJCQkJaWYgKHJ2cCAhPSBudWxsKSB7CQkJCQkJCQorCQkJCQkJCWZvciAoSXRlcmF0b3IgcHJvcGVydHlJdGVyID0gcnZwLmdldFByb3BlcnRpZXMoKS5pdGVyYXRvcigpOyBwcm9wZXJ0eUl0ZXIKKwkJCQkJCQkuaGFzTmV4dCgpOykgeworCQkJCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5ID0gKEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIHByb3BlcnR5SXRlcgorCQkJCQkJCQkubmV4dCgpOworCQkJCQkJCQlzYi5hcHBlbmQocHJvcGVydHkuZ2V0RGlzcGxheU5hbWUocHJvcGVydHkpKTsKKwkJCQkJCQkJc2IuYXBwZW5kKCI6ICIpOworCisJCQkJCQkJCXNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlLjJmIiwgcnZwLmdldFJlbGF0aXZlVmFsdWUocHJvcGVydHkpKSk7CisKKwkJCQkJCQkJaWYgKHByb3BlcnR5SXRlci5oYXNOZXh0KCkpIHsKKwkJCQkJCQkJCXNiLmFwcGVuZCgiLCAiKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0gLy8gZm9yIGVhY2ggcHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkJCX0gLy8gaWYKKwkJCQkJCQorCQkJCQl9CisJCQkJfSAgLy8gZm9yCisJCQl9CisKKworCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJR0VMb2cuZXJyb3IoIkZhaWx1cmUgZ2V0dGluZyBTRUlSIGRhdGEiLCBlKTsKKwkJfQorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsJCisKKwl9CisJLyoqIAorCSAqIEdldCB0aGUgSUQgdG8gdXNlIGZvciBnZXR0aW5nIHRoZSBHRVNpbUVudHJ5IGluc3RhbmNlCisJICogQHBhcmFtIHNpbXVsYXRpb24KKwkgKiBAcmV0dXJuICJTSU1bc2VxdWVuY2VOdW1iZXIiXSIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTaW11bGF0aW9uSWQoSVNpbXVsYXRpb24gc2ltdWxhdGlvbikgeworCQlpZiAoc2ltdWxhdGlvbiAhPSBudWxsKQorCQkgIHJldHVybiAiU0lNWyIrCisJCSAgICAgIEludGVnZXIudG9TdHJpbmcoc2ltdWxhdGlvbi5nZXRTZXF1ZW5jZU51bWJlcigpKSsKKwkJICAgIAkJICAiXSI7CisJCWVsc2UgCisJCSAgcmV0dXJuIG51bGw7CisJfQorCQorCS8qKgorCSAqIERpc3BsYXkgdGhlIGxhdGxvbmcgZGF0YSBmcm9tIGEgTGF0TG9uZyBzZWdtZW50CisJICogQSBzZWdtZW50IGlzIGEgbGluZSBvciBwb2x5Z29uLgorCSAqIAorCSAqIEBwYXJhbSBzZWdtZW50CisJICogQHJldHVybiBhIHN0cmluZyBvZiB0aGUgbGF0L2xvbmcgcG9pbnRzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyZWF0ZVN0cmluZ09mTGF0TG9uZ0RhdGEoZmluYWwgU2VnbWVudCBzZWdtZW50KSB7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlmaW5hbCBpbnQgc2l6ZSA9IHNlZ21lbnQuc2l6ZSgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJc2IuYXBwZW5kKCIoIik7CisJCQlzYi5hcHBlbmQoc2VnbWVudC5sYXRpdHVkZShpKSk7CisJCQlzYi5hcHBlbmQoIiwgIik7CisJCQlzYi5hcHBlbmQoc2VnbWVudC5sb25naXR1ZGUoaSkpOworCQkJc2IuYXBwZW5kKCIpIik7CisJCX0gLy8gZm9yIGVhY2ggbGF0L2xvbmcgcGFpcgorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9IC8vIGNyZWF0ZVN0cmluZ09mTGF0TG9uZ0RhdGEKKworCisKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGRlZmF1bHRBc3BlY3QKKwkgKi8KKwlwdWJsaWMgQXNwZWN0IGdldERlZmF1bHRBc3BlY3QoKSB7CisJCWlmIChkZWZhdWx0QXNwZWN0ID09IG51bGwpIAorCQkJZGVmYXVsdEFzcGVjdCA9IEFzcGVjdC5nZXREZWZhdWx0KCk7CisJCXJldHVybiBkZWZhdWx0QXNwZWN0OworCX0KKworCisKKworCS8qKgorCSAqIEBwYXJhbSBkZWZhdWx0QXNwZWN0IHRoZSBkZWZhdWx0QXNwZWN0IHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlZmF1bHRBc3BlY3QoQXNwZWN0IGRlZmF1bHRBc3BlY3QpIHsKKwkJdGhpcy5kZWZhdWx0QXNwZWN0ID0gZGVmYXVsdEFzcGVjdDsKKwl9CisKKworCisJLyoqCisJICogU2V0IGFuIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheQorCSAqIEBwYXJhbSBtc2cgCisJICogCisJICovCisJcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBtc2cpIHsKKwkJZXJyb3JNZXNzYWdlID0gbXNnOworCX0KKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBlcnJvck1lc3NhZ2UKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKKwkJaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsKSAKKwkJCXJldHVybiAiIjsKKwkJZWxzZSAKKwkJCXJldHVybiBlcnJvck1lc3NhZ2U7CisJfQorCisJLyoqCisJICogQHBhcmFtIHNpbSBTaW11bGF0aW9uIHRoYXQgaXMgYmVpbmcgcHJvY2Vzc2VkLgorCSAqIEByZXR1cm4gdGhlIGN5Y2xlCisJICovCisJcHVibGljIGludCBnZXRDeWNsZShJU2ltdWxhdGlvbiBzaW0pIHsKKwkJU2NlbmFyaW8gc2NlbmFyaW8gPSBzaW0uZ2V0U2NlbmFyaW8oKTsJCQorCQlTZXF1ZW5jZXIgc2VxID0gc2NlbmFyaW8uZ2V0U2VxdWVuY2VyKCk7CisJCWludCBjeWNsZSA9IHNlcS5nZXRDeWNsZSgpOworCQlyZXR1cm4gY3ljbGU7CisJfQorCQorCQorfSAvLyBjbGFzcyBHRUludGVyZmFjZQorCQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL0dFSm9iLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL0dFSm9iLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1YzMxNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2UvR0VKb2IuamF2YQpAQCAtMCwwICsxLDE5NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAorCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uua21sLlN0ZW1LbWw7CisKKworCisvKioKKyAqIERvIHNvbWUgb2YgdGhlIHdvcmsgaW4gdGhlIGJhY2tncm91bmQKKyAqIAorICogVGhpcyBpcyBjYWxsZWQgYnkgR0VJbnRlcmZhY2UgdG8gdGFrZSAKKyAqIHRoZSBjb2xsZWN0ZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFNpbXVsYXRpb24gCisgKiBhbmQgd3JpdGUgaXQgYXMgYSBLTUwgZmlsZS4gCisgKi8KK3B1YmxpYyBjbGFzcyBHRUpvYiBleHRlbmRzIFRocmVhZCB7CisKKwlwcml2YXRlIFN0cmluZyAgZm4gPSBudWxsOworCXByaXZhdGUgU3RlbUttbCBzdGVtS21sID0gbnVsbDsKKwkvKioKKwkgKiB0aGlzIGlzIGEgY29weSBvZiB0aGUgbWFwIHBhc3NlZCB0byBtZQorCSAqLworCXByaXZhdGUgTWFwPFN0cmluZyxHRURhdGE+IHN0ZW1NYXAgPSBudWxsOworCQorCXByaXZhdGUgQXNwZWN0IGFzcGVjdCA9IG51bGw7IAorCXByaXZhdGUgbG9uZyBjeWNsZSA9IDA7CisJcHJpdmF0ZSBib29sZWFuIGxhdW5jaCA9IGZhbHNlOworCXByaXZhdGUgYm9vbGVhbiByZW5hbWUgPSBmYWxzZTsKKwkJCisJcHJpdmF0ZSBzdGF0aWMgVGhyZWFkIHdvcmsgPSBudWxsOworCQorCS8qKgorCSAqIENvbnN0cnVjdCBhIHN1YmNsYXNzIG9mIEpvYiB0aGF0IHdpbGwgZG8gCisJICogdGhlIGxvbmdydW5uaW5nIHBhcnQgb2YgdGhlIGludGVyZmFjZSBpbgorCSAqIHRoZSBiYWNrZ3JvdW5kLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIE5hbWUgYXNzb2NpYXRlZCB3aXRoIGpvYgorCSAqLworCXB1YmxpYyBHRUpvYihTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwkJCisJfQorCisJLyoqIAorCSAqIHJ1biBtZXRob2QgZm9yIHRoZSBuZXcgVGhyZWFkCisJICogSXQgd2lsbCB3cml0ZSB0aGUgS01MIGZpbGUgZm9yIEdvb2dsZUVhcnRoIAorCSAqIGFuZCBwZXJoYXBzIGxhdW5jaCBpdCB0byBHRS4gCisJICogCisJICogIEFsdGhvdWdoIGl0IGhhcyBubyBwYXJhbWV0ZXJzIGluIHRoZSBjYWxsCisJICogIHRoZSBmb2xsb3dpbmcgYXJlIGFzc3VtZWQgdG8gYmUgc2V0IGJ5IAorCSAqICBwcmV2aW91cyBjYWxsIHRvIHRoaXMuZ2VuZXJhdGVLTUwoKQorCSAqICAKKwkgKiAgZm4gLSBGaWxlIG5hbWUgdGhhdCBjb250YWlucyB0aGUga21sCisJICogIHN0ZW1NYXAKKwkgKiAgYXNwZWN0CisJICogIGN5Y2xlCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcnVuKCkgeworCQkKKwkJR0VMb2cuZGVidWcodGhpcyxmbisiICIrYXNwZWN0KyIgIgorCQkJCStjeWNsZSsiICIrbGF1bmNoKyIgIityZW5hbWUpOworCQl0cnkgeworCQkJaWYgKHJlbmFtZSkgeworCQkJCUZpbGUgZiA9IG5ldyBGaWxlKGZuKTsKKwkJCQlTdHJpbmcgcGFyZW50ID0gZi5nZXRQYXJlbnQoKStGaWxlLnNlcGFyYXRvcjsKKwkJCQlmbiA9IGYuZ2V0TmFtZSgpOworCQkJCVN0cmluZyBuZXdGaWxlID0gcGFyZW50KyBmbi5yZXBsYWNlKCIuIiwiX05ldy4iKTsKKwkJCQlTdHJpbmcgY3VycmVudEZpbGUgPSBwYXJlbnQrIGZuLnJlcGxhY2UoIi4iLCJfQ3VycmVudC4iKTsKKwkJCQlTdHJpbmcgb2xkRmlsZSA9IHBhcmVudCtmbi5yZXBsYWNlKCIuIiwiLl9PbGQiKTsKKwkJCQl0cnkgeworCQkJCQkKKwkJCQkJRmlsZSBmaWxlTiA9IG5ldyBGaWxlKG5ld0ZpbGUpOwkJCQkJCisJCQkJCUZpbGUgZmlsZU8gPSBuZXcgRmlsZShvbGRGaWxlKTsKKwkJCQkJRmlsZSBmaWxlQyA9IG5ldyBGaWxlKGN1cnJlbnRGaWxlKTsKKwkJCQkJc3RlbUttbC5nZW5lcmF0ZVBvbHlnb25zKG5ld0ZpbGUsIHN0ZW1NYXAsIGFzcGVjdCwgY3ljbGUpOworCQkJCQkKKwkJCQkJaWYgKGZpbGVPLmV4aXN0cygpKSB7CisJCQkJCQlmaWxlTy5kZWxldGUoKTsKKwkJCQkJfSAKKwkJCQkJaWYgKGZpbGVDLmV4aXN0cygpKQorCQkJCQkgIGZpbGVDLnJlbmFtZVRvKGZpbGVPKTsKKwkJCQkJZmlsZU4ucmVuYW1lVG8oZmlsZUMpOworCQkJCQkKKwkJCQkJLy9HRUxvZy5kZWJ1Zyh0aGlzLCJDdXJyZW50IGZpbGU6ICIrZmlsZUMrIiAiK2ZpbGVDLmV4aXN0cygpKTsKKwkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKwkJCQkJCisJCQkJCUdFTG9nLmVycm9yKCJGYWlsdXJlIGNyZWF0aW5nIEtNTCBmaWxlcy4gIisKKwkJCQkJCQkgICAgIiBuZXdGaWxlOiAiKyBuZXdGaWxlCSxlKTsKKwkJCQl9CisJCQkJCisJCQl9IGVsc2UgeworCQkJCXN0ZW1LbWwuZ2VuZXJhdGVQb2x5Z29ucyhmbiwgc3RlbU1hcCwgYXNwZWN0LCBjeWNsZSk7CQkKKwkJCSAgICAgICAgICAgICAgICAgIAorCQkJCWlmIChsYXVuY2gpIHsKKwkJCQkJLy8JIGxhdW5jaCB0aGUgZmlsZSBmb3IgR29vZ2xlRWFydGgJCQkgIAorCQkJCQlTdGVtS21sLmxhdW5jaChmbik7CisJCQkJCUdFTG9nLmRlYnVnKHRoaXMsIkdvb2dsZUVhcnRoIE1hcCAgc3VibWl0dGVkIik7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJCisJCQlHRUxvZy5lcnJvcigiRmFpbHVyZSBpbiBpbnRlcmZhY2UgdG8gR29vZ2xlRWFydGguICIsZSk7CisJCX0KKwkJCisJCXJldHVybjsKKwl9CisJLyoqCisJICogQnVpbGQgdGhlIC5rbWwgZmlsZSB0aGFuIHdpbGwgYmUgc2VudCB0byBHb29nbGVFYXJ0aCAKKwkgKiBXZSB3aWxsIHJlY2lldmUgdGhlIGluZm9ybWF0aW9uIGZyb20gR0VJbnRlcmZhY2UgYW5kIHRoZW4gCisJICogc2NoZWR1bGUgdGhlIGpvYiB0byBiZSBydW4uCisJICogCisJICogQHBhcmFtIGZuIEZpbGUgd2hlcmUgd2Ugd3JpdGUgdGhlIGttbAorCSAqIEBwYXJhbSBzdGVtS21sICBPYmplY3QgY29udGFpbmluZyBpbmZvIGFib3V0IHdoZXJlIGFuZAorCSAqICAgICAgICAgICAgICAgICBob3cgdG8gZ2VuZXJhdGUgdGhlIEtNTC4KKwkgKiBAcGFyYW0gc3RlbU1hcCAgTWFwIG9mIFBvbHlnb25zCisJICogCisJICogQHBhcmFtIGFzcGVjdCAgIFNFSVIgVHlwZSB0byBiZSBkaXNwbGF5ZWQKKwkgKiBAcGFyYW0gY3ljbGUgICAgY3VycmVudCBjeWNsZSBudW1iZXIKKwkgKiBAcGFyYW0gbGF1bmNoICAgdHJ1ZSBpZiBmaWxlIHNob3VsZCBiZSBzZW50IHRvIEdvb2dsZUVhcnRoCisJICogQHBhcmFtIHJlbmFtZSAgIHRydWUgaWYgZmlsZSBzaG91bGQgYmUgd3JpdHRlbiB0aGVuIHJlbmFtZWQKKwkgKi8JCisJCisJcHVibGljIHZvaWQgZ2VuZXJhdGVLTUwoU3RyaW5nIGZuLCBTdGVtS21sIHN0ZW1LbWwsIE1hcDxTdHJpbmcsR0VEYXRhPiBzdGVtTWFwLAorCQkJQXNwZWN0IGFzcGVjdCxsb25nIGN5Y2xlLCBib29sZWFuIGxhdW5jaCxib29sZWFuIHJlbmFtZSkgeworCQkKKwkJdGhpcy5mbiA9IGZuOworCQl0aGlzLnN0ZW1LbWwgPSBzdGVtS21sOworCQl0aGlzLmFzcGVjdCA9IGFzcGVjdDsKKwkJdGhpcy5jeWNsZSA9IGN5Y2xlOworCQl0aGlzLmxhdW5jaCA9IGxhdW5jaDsKKwkJdGhpcy5yZW5hbWUgPSByZW5hbWU7CisJCQorCQlpZiAoY3ljbGUgPT0gMCkKKwkJICAgIGNoZWNrUHJlZmVyZW5jZXMoKTsKKwkJCisJCS8vIGNvcHkgc3RlbU1hcCAKKwkJLy8gVE9ETyBhcmUgdGhlcmUgd2F5cyB0byBhdm9pZCB0aGlzIGNvcHkgCisJCS8vIG1heWJlIHdlIGNvdWxkIHN5bmNocm9uaXplIG9uIGl0Li4uCisJCWludCBuID0gc3RlbU1hcC5zaXplKCk7CisJCXRoaXMuc3RlbU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxHRURhdGE+KG4pOworCQl0aGlzLnN0ZW1NYXAucHV0QWxsKHN0ZW1NYXApOwkJCisJCQkJCisJCS8vR0VMb2cuZGVidWcodGhpcywiU2NoZWR1bGluZyBnZW5lcmF0aW9uIG9mIEtNTCBmaWxlICIrZm4pOworCQl0cnkgeworCQkJLy8gaWYgcHJvY2Vzc2luZyBiYWNrbG9nCisJCQlpZiAod29yayAhPSBudWxsICYmIAorCQkJCXdvcmsuZ2V0U3RhdGUoKSAhPSBUaHJlYWQuU3RhdGUuVEVSTUlOQVRFRCkgewkJCQorCQkJCS8vIFRPRE8gc2tpcCBwcm9jZXNzaW5nIGlmIGJhY2tsb2dnZWQgPworCQkJCUdFTG9nLmRlYnVnKHRoaXMsIlNraXAgS01MIGdlbmVyYXRpb24gZm9yIGN5Y2xlICIrY3ljbGUpOworCQkJCXJldHVybjsJCQkJCQkJCQorCQkJfQorCQkJd29yayA9IG5ldyBUaHJlYWQodGhpcywiSm9iXyIrY3ljbGUpOworCQkJd29yay5zdGFydCgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCisJCQlHRUxvZy5lcnJvcigiRmFpbHVyZSBzY2hlZHVsaW5nIEtNTCBGaWxlIGdlbmVyYXRpb24iLGUpOworCQl9CisJfQorCQkvKioKKwkJICogQ2hlY2sgdGhlIFNURU0gc3lzdGVtIGRlbGF5IGFuZCB3YXJuIGlmIG5vdCBzZXQuCisJCSAqIAkKKwkJICovCisJCXByb3RlY3RlZCB2b2lkIGNoZWNrUHJlZmVyZW5jZXMoKSB7CisJCQlmaW5hbCBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IAorCQkJCW9yZy5lY2xpcHNlLnN0ZW0uam9icy5BY3RpdmF0b3IuZ2V0RGVmYXVsdCgpCisJCQkJCS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCQkJYm9vbGVhbiBzaW11bGF0aW9uU2xlZXAgPSBwcmVmZXJlbmNlcworCQkJCQkuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlNJTVVMQVRJT05fU0xFRVBfQk9PTEVBTik7CisJCSAgICAgICAKKwkJCWludCBzbGVlcE1pbGxpc2Vjb25kcyA9IHByZWZlcmVuY2VzCisJCQkJCS5nZXRJbnQoUHJlZmVyZW5jZUNvbnN0YW50cy5TSU1VTEFUSU9OX1NMRUVQX01JTExJU0VDT05EU19JTlRFR0VSKTsKKworCQkJaWYgKCEgc2ltdWxhdGlvblNsZWVwIHx8IHNsZWVwTWlsbGlzZWNvbmRzIDw9IDEpIHsKKwkJCQlHRUxvZy5pbmZvKCJHRUpvYjogU3BlY2lmaWVkIFNsZWVwIGludGVydmFsIG5vdCBzcGVjaWZpZWQgXG4iKyAgICAgICAgCisJCQkJICAgICAgICAgICAib3IgbWF5IGJlIHRvbyBzaG9ydCBmb3IgR29vZ2xlRWFydGggb3BlcmF0aW9uLlxuIisKKwkJCQkgICAgICAgICAgICJDaGVjayBwcmVmZXJlbmNlcy4iKTsKKwkJCX0KKwkJfSAvLyBzZXRQZXJmZXJlbmNlcwkKKwkJCisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL0dFTG9nLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL0dFTG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzODI5NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2UvR0VMb2cuamF2YQpAQCAtMCwwICsxLDI1MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnZpZXdzLkdFUHJlZmVyZW5jZVBhZ2U7CisKKworLyoqCisgKiBkZWJ1ZyBVdGlsaXR5IG1ldGhvZHMgZm9yIEdvb2dsZUVhcnRoIEludGVyZmFjZQorICogIDxwPgorICogICAqIFRoZSBtYWluIHVzZSBvZiB0aGlzIGNsYXNzIGlzIHRvIHByb3ZpZGUgYWRkaXRpb25hbCAKKwkgKiBkZWJ1Z2dpbmcgb3V0cHV0IHdoZW4gaW4gZGVidWcgbW9kZSBvbiB0aGUgcHJpbWFyeSAKKwkgKiBlY2xpcHNlIGNvbnNvbGUgYW5kIHN0aWxsIHByb3ZpZGUgbG9nZ2luZyBvZiBleGNlcHRpb25zIAorCSAqIHRvIHRoZSBlY2xpcHNlIElMb2cgZXJyb3IgbG9nIGZhY2lsaXR5LiAgCisJICogQWx0aG91Z2ggRWNsaXBzZSBwcm92aWRlcyBhbiBFcnJvciBsb2cgZmFjaWxpdHkgaW4gdGhlIAorCSAqIGFwcGxpY2F0aW9uIHdvcmtiZW5jaCBiZWluZyB0ZXN0ZWQsICBpdCBpcyBtb3JlIGNvbnZpZW5lbnQKKwkgKiB0byBnZXQgeW91ciBkZWJ1ZyBtZXNzYWdlcyBhbmQgdW5leHBlY3RlZCBleGNlcHRpb24gaW4gdGhlCisJICogRWNsaXBzZSBDb25zb2xlIHRoYXQgaXMgY29udHJvbGluZyB0aGUgdGVzdCBlbnZpcm9ubWVudC4KKyAqIDxwPgorICogVHlwaWNhbCB1c2Ugb2YgdGhpcyBjbGFzczoKKyAqIDxwcmU+CisgKiAgIC8vIGVhcmx5IGluIHN0YXJ0dXAuIAorICogICAvLyBpbiB2aWV3IGNvbnN0cnVjdG9yIG9yIGp1bml0IHRlc3QgY2xhc3MKKyAqICAgR0VMb2cuREVCVUcgPSB0cnVlOyAKKyAqICAgLi4uCisgKiAgIEdFTG9nLmRlYnVnKHRoaXMsIkN1cnJlbnQgc2ltdWxhdGlvbjogIitzaW11bGF0aW9uKTsKKyAqICAgdHJ5IHsKKyAqICAgICAuLi4KKyAqICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAqICAgICAgR0VMT0cuZXJyb3IoInN0cmFuZ2UgZmFpbHVyZSIsZSk7CisgKiAgIH0KKyAqICAgPC9wcmU+CisgKiAgIFdoZW4gREVCVUcgaXMgdHJ1ZSB0aGVuIGJvdGggdGhlIEVjbGlwc2UgY29uc29sZSBhbmQgCisgKiAgIHRoZSBFY2xpcHNlIGxvZyB3aWxsIGdldCB0aGUgZGVidWcgbXNnIGFuZCB0aGUgZXhjZXB0aW9uCisgKiAgIHN0YWNrdHJhY2UgYnV0IGlmIERFQlVHIGlzIGZhbHNlIHRoZW4gdGhlIGRlYnVnIG1lc3NhZ2UgCisgKiAgIHdpbGwgbm90IGFwcGVhciBhbnl3aGVyZSBhbmQgdGhlIEV4Y2VwdGlvbiBzdGFja3RyYWNlIAorICogICB3aWxsIG9ubHkgYXBwZWFyIGluIHRoZSBlY2xpcHNlIGxvZy4KKyAqICAgICAKKyAqICAgCisgKi8KK3B1YmxpYyBjbGFzcyBHRUxvZyB7CisJLyoqCisJICogaWYgdHJ1ZSB0aGVuIEdFbG9nIG1ldGhvZHMgcHJvZHVjZXMgb3V0cHV0CisJICogCisJICogSXQgd291bGQgYmUgc2V0IHRydWUgbm9ybWFsbHkgaW4gdGhlIEdFVmlldyBjb25zdHJ1Y3RvciAKKwkgKiBiYXNlZCBvbiB0aGUgUHJlZmVyZWVuY2VQYWdlIHNldHRpbmcuIAorCSAqIEl0IGNvdWxkIGJlIGFsc28gc2V0IGluIGFueSBqdW5pdCB0ZXN0cyB3aGVyZSB3ZSAKKwkgKiB3YW50IHRvIGhhdmUgYWRkaXRpb25hbCBkZWJ1ZyBvdXRwdXQuCisJICogVGhpcyBjb3VsZCBiZSBjaGFuZ2VkIHRvICJzdGF0aWMgZmluYWwiIHRvIGNvbXBpbGUgCisJICogb3V0IHRoZSBleGVjdXRpb24gb2YgdGhlIGlmIChERUJVRykgc3RhdGVtZW50LgkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKworCS8qKgorCSAqIHRlbXBvcmFyeSBkZWJ1ZyBzdGF0ZW1lbnRzLgorCSAqIENhbGxzIHRvIHRoaXMgbWV0aG9kIGFyZSBpbnRlbmRlZCBmb3IgZGVidWdnaW5nIGFuZCAKKwkgKiBjb3VsZCBiZSByZW1vdmVkIGJlZm9yZSBwdWJsaXNoaW5nIHRoZSBjb2RlLgorCSAqIFRoZXkgYXJlIGRpc3BsYXllZCBvbiB0aGUgRWNsaXBzZSBDb25zb2xlIG9ubHkgaWYKKwkgKiB0aGUgREVCVUcgdmFyaWFibGUgaXMgdHJ1ZS4KKwkgKiBAcGFyYW0gbXNnIFRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWJ1ZyhTdHJpbmcgbXNnKSB7CisJCWlmIChHRUxvZy5ERUJVRykgeworCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiR0U6ICIrbXNnKTsKKwkJICBTeXN0ZW0ub3V0LmZsdXNoKCk7CisJCX0KKwl9CisJLyoqCisJICogdGVtcG9yYXJ5IGRlYnVnIHN0YXRlbWVudHMuCisJICogQ2FsbHMgdG8gdGhpcyBtZXRob2QgYXJlIGludGVuZGVkIGZvciBkZWJ1Z2dpbmcgYW5kIAorCSAqIGNvdWxkIGJlIHJlbW92ZWQgYmVmb3JlIHB1Ymxpc2hpbmcgdGhlIGNvZGUuCisJICogVGhleSBhcmUgZGlzcGxheWVkIG9uIHRoZSBFY2xpcHNlIENvbnNvbGUgb25seSBpZgorCSAqIHRoZSBERUJVRyB2YXJpYWJsZSBpcyB0cnVlLgorCSAqIDxjb2RlPgorCSAqIEV4YW1wbGU6CisJICogICAgR0VMb2cuZGVidWcodGhpcywiYSBtc2cgdG8gaGVscCBkZWJ1Z2dpbmciKTsKKwkgKiAgLS0+PgorCSAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFjbGFzc05hbWU6IGEgbXNnIHRvIGhlbHAgZGVidWdnaW5nIik7IAorCSAqICAgICAgIAorCSAqIDwvY29kZT4gICAKKwkgKiBAcGFyYW0gd2hlcmUgLSBJbmRpY2F0b3Igb2YgY2xhc3Mgd2hlcmUgbXNnIGdlbmVyYXRlZAorCSAqICAgICBDYW4gYmUgU3RyaW5nLCBjbGFzcyBvciBpbnN0YW5jZQorCSAqIEBwYXJhbSBtc2cgVGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGRlYnVnKE9iamVjdCB3aGVyZSxTdHJpbmcgbXNnKSB7CisJCWlmIChHRUxvZy5ERUJVRykgeworCQkJCisJCQlTdHJpbmcgY2xhc3NuYW1lID0gIiI7CisJCQlpZiAod2hlcmUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQljbGFzc25hbWUgPSAoU3RyaW5nKXdoZXJlOworCQkJfSBlbHNlIGlmICh3aGVyZSBpbnN0YW5jZW9mIENsYXNzKSB7CisJCQkJY2xhc3NuYW1lID0gKChDbGFzcyl3aGVyZSkuZ2V0U2ltcGxlTmFtZSgpOworCQkJfSBlbHNlIHsKKwkJCQljbGFzc25hbWUgPSB3aGVyZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKKwkJCQkvLyBoYW5kbGUgR0VMb2cuZGVidWcodGhpcyxtc2cpCisJCQkJVGhyZWFkIHQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworCQkJCVN0YWNrVHJhY2VFbGVtZW50W10gc3QgPSB0LmdldFN0YWNrVHJhY2UoKTsKKwkJCQlpZiAoc3RbM10uZ2V0Q2xhc3NOYW1lKCkuY29udGFpbnMoY2xhc3NuYW1lKSkgeworCQkJCQljbGFzc25hbWUgPSBjbGFzc25hbWUrIi4iKworCQkJCSAgICAgICAgICAgIHN0WzNdLmdldE1ldGhvZE5hbWUoKTsKKwkJCQl9CisJCQl9CisJCQlTdHJpbmcgcHJlZml4ID0gY2xhc3NuYW1lKyI6ICI7CisJCQkvLyBhZGQgZXh0cmEgZGVidWcgaW5mbyBpcyBQX1RFU1QKKwkJCWlmIChBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpICE9IG51bGwpIHsKKwkJCQlpZiAoR0VQcmVmZXJlbmNlUGFnZS5pc1Rlc3QoKSkgeworCQkJCQlTdHJpbmcgdCA9IGdldFRocmVhZCgpOworCQkJCQlTdHJpbmcgY2xvY2sgPSBnZXRDbG9jaygpOworCQkJCQlwcmVmaXggPSBjbG9jaysiICIrdCsiLSIrcHJlZml4OworCQkJCX0KKwkJCX0KKwkJICAKKwkJICBTeXN0ZW0ub3V0LnByaW50bG4ocHJlZml4ICsgbXNnKTsKKwkJICBTeXN0ZW0ub3V0LmZsdXNoKCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRocmVhZCgpIHsKKwkJcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2xvY2soKSB7CisJCWxvbmcgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCktc3RhcnQ7CisJCXJldHVybiBMb25nLnRvU3RyaW5nKG5vdyk7CisJfQorCS8qKgorCSAqIGhhbmRsZXIgZm9yIGV4Y2VwdGlvbnMgdGhhdCBvY2N1cgorCSAqIAorCSAqIEBwYXJhbSBjdXJyZW50IENsYXNzIHRoYXQgcHJvZHVjZWQgbXNnCisJICogQHBhcmFtIG1zZyBNZXNzc2FnZSB0byBiZSBkaXNwbGF5ZWQgKGlmIG5vdCBudWxsKQorCSAqIAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBpbmZvKENsYXNzIGN1cnJlbnQsU3RyaW5nIG1zZykgeworCQlpbmZvKGN1cnJlbnQuZ2V0U2ltcGxlTmFtZSgpKyI6ICIrbXNnKTsKKwl9CisJLyoqCisJICogSGFuZGxlciBmb3IgaW5mbyBtZXNzYWdlcy4gIAorCSAqIFdpbGwgYmUgcHJvZHVjZWQgZXZlbiBpZiBkZWJ1ZyBvcHRpb24gbm90IG9uCisJICogCisJICogQHBhcmFtIG1zZworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBpbmZvKFN0cmluZyBtc2cpIHsKKwkJaWYgKEdFTG9nLkRFQlVHKSB7CisJCSAgU3lzdGVtLmVyci5wcmludGxuKG1zZyk7CisJCX0gIAorCQkvLyBub3cgZG8gdGhlIGNvcnJlY3QgT1NHSSB0aGluZworCQkKKwkJQWN0aXZhdG9yLmxvZ0luZm8obXNnLG51bGwpOworCQlyZXR1cm47CisJCQorCX0KKwkvKioKKwkgKiBoYW5kbGVyIGZvciBleGNlcHRpb25zIHRoYXQgb2NjdXIKKwkgKiAKKwkgKiBAcGFyYW0gbXNnIE1lc3NzYWdlIHRvIGJlIGRpc3BsYXllZCAoaWYgbm90IG51bGwpCisJICogQHBhcmFtIHQgIEV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGlzIGlmIG5vdCBudWxsCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGVycm9yKFN0cmluZyBtc2csVGhyb3dhYmxlIHQpIHsKKwkJaWYgKEdFTG9nLkRFQlVHKSB7CisJCSAgU3lzdGVtLmVyci5wcmludGxuKG1zZyk7CisJCSAgaWYgKHQgIT0gbnVsbCkKKwkJICAgIHQucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwkJU3lzdGVtLmVyci5mbHVzaCgpOworCQkvLyBub3cgZG8gdGhlIGNvcnJlY3QgT1NHSSB0aGluZworCQkKKwkJQWN0aXZhdG9yLmxvZ0Vycm9yKG1zZywgdCk7CisJCXJldHVybjsKKwl9CisKKwkKKwkKKwkvKioKKwkgKiBDYWxsIGdhcmJhZ2UgY29sbGVjdCBhbmQgZGlzcGxheSBtZW1vcnkgc3RhdHMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWVtb3J5KCl7CisJCisJCVJ1bnRpbWUgcnQgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKKwkJLy9ydC5nYygpOworCQl0cnkgeworCQkJVGhyZWFkLnNsZWVwKDIwMDApOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CQkJCisJCX0KKwkJR0VMb2cuZGVidWcoIk1lbW9yeSBUb3RhbDogIitydC50b3RhbE1lbW9yeSgpLzEwMjQrIksiKTsKKwkJR0VMb2cuZGVidWcoIk1lbW9yeSBGcmVlOiAgIitydC5mcmVlTWVtb3J5KCkvMTAyNCsiSyIpOworCQlHRUxvZy5kZWJ1ZygiTWVtb3J5IE1heDogICAiK3J0Lm1heE1lbW9yeSgpLzEwMjQrIksiKTsKKwl9CisJCisJLyoqCisJICogdGVzdCBpZiBwZXJjZW50IG9mIHVzZWQgbWVtb3J5IGlzIGdyZWF0ZXIgdGhhbiBzcGVjaWZpZWQKKwkgKiBwZXJjZW50LiAgCisJICogCisJICogIEBwYXJhbSBwZXJjZW50IHRvIGNoZWNrIGFnYWluc3QuCisJICogICAgIEV4YW1wbGU6IDAuOSA9IDkwJQorCSAqICAKKwkgKiAgQHJldHVybiB0cnVlIGlmICUgbWVtZW9yeSB1c2VkIGlzIGdyZWF0ZXIgCisJICogICAgdGhhbiBzcGVjaWZpZWQgcGVyY2VudC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWVtb3J5Q2hlY2soZG91YmxlIHBlcmNlbnQpeworCSAgIAorCQlSdW50aW1lIHJ0ID0gUnVudGltZS5nZXRSdW50aW1lKCk7CisJCQorCQlHRUxvZy5kZWJ1ZygiTWVtb3J5IE1heDogICAiK3J0Lm1heE1lbW9yeSgpLzEwMjQrIksiKTsKKwkJbG9uZyB1c2VkID0gcnQudG90YWxNZW1vcnkoKS1ydC5mcmVlTWVtb3J5KCk7CQkKKwkJZG91YmxlIGN1cnJlbnRQZXJjZW50ID0gKChkb3VibGUpdXNlZCkvKChkb3VibGUpcnQubWF4TWVtb3J5KCkpOworCQlHRUxvZy5kZWJ1ZygiTWVtb3J5IFVzZWQ6ICAiK3VzZWQvMTAyNCsiSyIpOwkJCisJCUdFTG9nLmRlYnVnKCJQZXJjZW50IFVzZWQ6ICIrY3VycmVudFBlcmNlbnQpOworCQlpZiAoY3VycmVudFBlcmNlbnQgPiBwZXJjZW50ICkgeworCQkJLy9ydC5nYygpOyAgIC8vIENoZWNrIGFmdGVyIEdhcmJhZ2UgY29sbGVjdG9yIHJ1bnMKKwkJCXRyeSB7CisJCQkJVGhyZWFkLnNsZWVwKDEwMDApOworCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewkJCQorCQkJfQkJCQorCQkJCisJCQl1c2VkID0gcnQudG90YWxNZW1vcnkoKS1ydC5mcmVlTWVtb3J5KCk7CisJCQljdXJyZW50UGVyY2VudCA9ICgoZG91YmxlKXVzZWQpLygoZG91YmxlKXJ0Lm1heE1lbW9yeSgpKTsKKwkJCUdFTG9nLmRlYnVnKCJNZW1vcnkgdXNlZCBhZnRlciBHQzogICIrdXNlZC8xMDI0KyJLIik7CQorCQkJR0VMb2cuZGVidWcoIlBlcmNlbnQgVXNlZDogIitjdXJyZW50UGVyY2VudCk7CisJCQlyZXR1cm4gKGN1cnJlbnRQZXJjZW50ID4gcGVyY2VudCApIDsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qKgorCSAqIG1haW4oKSBtZXRob2QgZm9yIHRlc3RpbmcuCisJICogQHBhcmFtIGFyZ3MKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCUdFTG9nLkRFQlVHID0gdHJ1ZTsKKwkJCisJCUdFTG9nLmRlYnVnKCJtc2cgd2l0aCBubyBjbGFzcy4iKTsKKwkJCisJCUdFTG9nLmRlYnVnKEdFTG9nLmNsYXNzLCJtc2cgd2l0aCBjbGFzcyBzcGVjaWZpZWQiKTsKKwkJdHJ5IHsKKwkJCU9iamVjdCBhID0gbnVsbDsKKwkJCWEuZ2V0Q2xhc3MoKTsKKwkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKwkJCUdFTG9nLmVycm9yKCJFeHBlY3RlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiIsdCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL0dFU2ltRW50cnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2UvR0VTaW1FbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZjYzNzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL0dFU2ltRW50cnkuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAoraW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkFzcGVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLmttbC5TdGVtS21sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uudmlld3MuR0VQcmVmZXJlbmNlUGFnZTsKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvL1NpbUVudHJ5CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyogU2ltRW50cnkgaXMgc3BlY2lhbCBlbnRyeSB0byBkZXNjcmliZSBhIFNpbXVsYXRpb24gdGhhdCB3ZSAKKyogYXJlIG9yIHdlcmUgYWN0aXZlbHkgbG9nZ2luZy4KKyogCisqIEl0IGhvbGRzIGluZm9ybWF0aW9uIHRoYXQgaXMgdW5pcXVlIHRvIHRoZSBnZW5lcmF0aW9uIAorKiBvZiBLTUwgZmlsZXMgZm9yIGEgc3BlY2lmaWMgc2ltdWxhdGlvbi4KKyogCisqIAorKi8KK3B1YmxpYyBjbGFzcyBHRVNpbUVudHJ5IHsKKwkKKwkvKioKKwkgKiBOYW1lIGFzc2lnbmVkIHRvIHRoaXMgU2ltdWxhdGlvbiBlbnRyeSAKKwkgKiAgIFNJTW4gd2hlcmUgbiBpcyB0aGUgc2ltdWxhdGlvbi5nZXRTZXF1ZW5jZU51bWJlcigpCisJICovCisJcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisJCisJLyoqCisJICogU2ltdWxhdGlvbiBiZWluZyB3YXRjaGVkCisJICovCisJcHJpdmF0ZSBJU2ltdWxhdGlvbiBzaW11bGF0aW9uID0gbnVsbDsKKwkKKwkvKioKKwkgKiBTRUlSIHZhbHVlIGJlaW5nIG1hcHBlZAorCSAqLworCXByaXZhdGUgQXNwZWN0IGFzcGVjdFZhbHVlOworCS8qKiAKKwkgKiB3aWxsIEdFIGZpbGVzIGJlIHdyaXR0ZW4KKwkgKi8KKwlib29sZWFuIGFjdGl2ZSA9IGZhbHNlOworCQorCS8qKgorCSAqIFN0ZW1LbWwgY29udHJvbCBpbnN0YW5jZQorCSAqLworCXByaXZhdGUgU3RlbUttbCBzdGVtS21sID0gbnVsbDsKKwkKKwkvKioKKwkgKiBtYXAgb2YgZ2VvZ3JhcGhpYyBkYXRhIGtleWVkIGJ5IGFyZWEgaWQKKwkgKi8KKwlwcml2YXRlIE1hcDxTdHJpbmcsIEdFRGF0YT4gc3RlbU1hcCA9IG51bGw7CisJLyoqCisJICogZGlyZWN0b3J5IHdoZXJlIEtNTCBmaWxlcyBhcmUgd3JpdHRlbi4KKwkgKiBOb3RlOiB0aGVyZSBjb3VsZCBiZSBkaWZmZXJlbnQgbG9nIGZpbGVzIGJlaW5nIHVzZWQgCisJICogZm9yIHNpbXVsYXRpb25zIHRoYXQgcnVuIGNvbmN1cmVudGx5LiAgCisJICovCQorCXByaXZhdGUgU3RyaW5nIGxvZ0ZvbGRlciA9IG51bGw7CisJCisJLyoqCisJICogTWV0aG9kIHVzZWQgdG8gZGlzcGxheSBvbiBHRQorCSAqICAgRGVmYXVsdHMgdG8gTWFudWFsCisJICovCisJcHJpdmF0ZSBpbnQgbWV0aG9kID0gR0VQcmVmZXJlbmNlUGFnZS5NX01BTlVBTF9ESVNQTEFZOworCQorCS8vaW50IGN5Y2xlID0gLTE7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqIAorCSAqIEBwYXJhbSBuYW1lICBVbmlxdWUgbmFtZSBmb3IgYSBTaW11bGF0aW9uCisJICogQHBhcmFtIHNpbXVsYXRpb24gIEluc3RhbmNlIG9mIFNpbXVsYXRpb24gaW1wbGVtZW50YXRpb24KKwkgKi8KKwlwdWJsaWMgR0VTaW1FbnRyeShTdHJpbmcgbmFtZSxJU2ltdWxhdGlvbiBzaW11bGF0aW9uKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMuc2ltdWxhdGlvbiA9IHNpbXVsYXRpb247CisJCXRoaXMuYWN0aXZlID0gZmFsc2U7CisJfQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGFjdGl2ZQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgeworCQlyZXR1cm4gYWN0aXZlOworCX0KKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzdGVtS21sCisJICovCisJcHVibGljIFN0ZW1LbWwgZ2V0U3RlbUttbCgpIHsKKwkJcmV0dXJuIHN0ZW1LbWw7CisJfQorCS8qKgorCSAqIEBwYXJhbSBzdGVtS21sIHRoZSBzdGVtS21sIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0ZW1LbWwoU3RlbUttbCBzdGVtS21sKSB7CisJCXRoaXMuc3RlbUttbCA9IHN0ZW1LbWw7CisJfQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHN0ZW1NYXAKKwkgKi8KKwlwdWJsaWMgTWFwPFN0cmluZywgR0VEYXRhPiBnZXRTdGVtTWFwKCkgeworCQlyZXR1cm4gc3RlbU1hcDsKKwl9CisJLyoqCisJICogQHBhcmFtIHN0ZW1NYXAgdGhlIHN0ZW1NYXAgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0U3RlbU1hcChNYXA8U3RyaW5nLCBHRURhdGE+IHN0ZW1NYXApIHsKKwkJdGhpcy5zdGVtTWFwID0gc3RlbU1hcDsKKwl9IAorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGxvZ0ZvbGRlcgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TG9nRm9sZGVyKCkgeworCQlyZXR1cm4gbG9nRm9sZGVyOworCX0KKwkvKioKKwkgKiBAcGFyYW0gbG9nRm9sZGVyIHRoZSBsb2dGb2xkZXIgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0TG9nRm9sZGVyKFN0cmluZyBsb2dGb2xkZXIpIHsKKwkJdGhpcy5sb2dGb2xkZXIgPSBsb2dGb2xkZXI7CisJfQorCQorCS8qKgorCSAqIGZvciBkZWJ1ZyBpbmZvCisJICovCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlzYi5hcHBlbmQoIkdFU2ltRW50cnk6ICIpOworCQlzYi5hcHBlbmQobmFtZSk7CisJCXNiLmFwcGVuZCgiIGFjdGl2ZTogIithY3RpdmUpOworCQlzYi5hcHBlbmQoIiB0bzogIitsb2dGb2xkZXIpOworCQlzYi5hcHBlbmQoIiBtZXRob2Q6ICIrbWV0aG9kKTsKKwkJLy9zYi5hcHBlbmQoIiBOYW1lOiAiK3NpbXVsYXRpb24uZ2V0TmFtZSgpKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfQorCS8qKgorCSAqIEdldCB0aGUgYXNwZWN0IHRoYXQgd2Ugd2FudCB0byBkaXNwbGF5CisJICogCisJICogQHJldHVybiB0aGUgc0VJUlZhbHVlCisJICovCisJcHVibGljIEFzcGVjdCBnZXRBc3BlY3RUb0Rpc3BsYXkoKSB7CisJCS8vR0VMb2cuZGVidWcodGhpcy5nZXRDbGFzcygpLCJnZXRBc3BlY3RUb0Rpc3BsYXk6ICIrYXNwZWN0VmFsdWUpOworCQlyZXR1cm4gYXNwZWN0VmFsdWU7CisJfQorCS8qKgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgYXNwZWN0IHRoYXQgd2Ugd2FudCBkaXNwbGF5ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBc3BlY3RUb0Rpc3BsYXkoQXNwZWN0IHZhbHVlKSB7CisJCWFzcGVjdFZhbHVlID0gdmFsdWU7CisJfQorCS8qKgorCSAqIEByZXR1cm4gdGhlIHNpbXVsYXRpb24KKwkgKi8KKwlwdWJsaWMgSVNpbXVsYXRpb24gZ2V0U2ltdWxhdGlvbigpIHsKKwkJcmV0dXJuIHNpbXVsYXRpb247CisJfQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG1ldGhvZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0TWV0aG9kKCkgeworCQlyZXR1cm4gbWV0aG9kOworCX0KKwkvKioKKwkgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2QgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0TWV0aG9kKGludCBtZXRob2QpIHsKKwkJdGhpcy5tZXRob2QgPSBtZXRob2Q7CisJfQorfSAgLy8gY2xhc3MgU2ltRW50cnkKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9hc3BlY3QucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2UvYXNwZWN0LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjOTdhZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2UvYXNwZWN0LnByb3BlcnRpZXMKQEAgLTAsMCArMSw3MiBAQAorIyBBc3BlY3RzIGZvciBTRUlSIERpc2Vhc2VzCisjCisjICJBc3BlY3RzIiBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIEFzcGVjdCBjb2Rlcy4KKyMgQWxsIG9mIHRoZSB2YWxpZCBhc3BlY3RzIGhhdmUgdG8gYmUgbGlzdGVkLgorIyBUaGUgRGVmYXVsdCBBc3BlY3QgZGlzcGxheWVkIGlmIG5vdCBvdGhlcndpc2Ugc3BlY2lmaWVkIAorIyBpcyBzcGVjaWZpZWQgYnkgdGhlIERlZmF1bHQgc3RhdGVtZW50LgorQXNwZWN0cyA9IFMsRSxJLFIKK0RlZmF1bHQgPSBJCisjCisjIFRoZSBLTUxEaXNwbGF5Q2xhc3MgcHJvcGVydHkgbmFtZXMgdGhlIGNsYXNzIHRoYXQgaXMgCisjIGNhbGxlZCB0byBnZW5lcmF0ZSB0aGUgS01MIGZpbGUgdXNlIHRvIGRpc3BsYXkgU1RFTSAKKyMgYXNwZWN0cyBvbiB0aGUgR29vZ2xlRWFydGggbWFwLiAKKyMgVGhlIGRlZmF1bHQgY2xhc3MgS21sRGlzcGxheSBzcGVjaWZpZWQgYmVsb3cgdXNlcyB0aGUgQXNwZWN0IHByb3BlcnRpZXMgCisjIHRvIGdlbmVyYXRlIHRoZSBLTUwgYW5kIG5ldyBEaXNlYXNlIGFzcGVjdHMgY2FuIGJlIGFkZGVkCisjIHNpbXBseSBieSBhZGRpbmcgdGhlbSB0byB0aGlzIHByb3BlcnRpZXMgZmlsZS4KKyMgS21sRGlzcGxheUN1c3RvbSBpcyBjdXN0b21pemVkIHRvIG9ubHkgd29yayB3aXRoIFNFSVIgZGlzZWFzZXMuCisjIE5ldyBEaXNwbGF5IGltcGxlbWVudGF0aW9ucyBtYXkgYmUgY3JlYXRlZCBlYXNpbHkuCisjIAorS21sRGlzcGxheSA9IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uua21sLkttbERpc3BsYXkKKyNrbWxEaXNwbGF5ID0gb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5rbWwuS21sRGlzcGxheUN1c3RvbQorIworIyBGb2xsb3dpbmcgdGhlIEFzcGVjdHMgc3RhdGVtZW50cyBhcmUgZ3JvdXBzIG9mIAorIyBzcGVjaWZpY2F0aW9ucyBmb3IgZWFjaCBvZiB0aGUgYXNwZWN0cyBsaXN0ZWQgYWJvdmUuCisjIGVhY2ggc3BlY2lmaWNhdGlvbiBpcyB0aGUgYXNwZWN0IGNvZGUgKyAiLiIgKyB0aGUKKyMgc3BlY2lmaWNhdGlvbiBuYW1lICsgIj0iICsgdGhlIHZhbHVlLiAKKyMgVGhlIGZvbGxvd2luZyBhcmUgcmVxdWlyZWQ6CisjICAgYXNwZWN0Lm5hbWUgPQorIyAgIGFzcGVjdC5kZXNjcmlwdGlvbiA9CisjICAgYXNwZWN0LmNvbG9yID0gICggd2hlcmUgY29sb3IgaXMgW3JlZCBibHVlIG9yIGdyZWVuXSApIAorIyAgIAorIyBUaGUgZm9sbG93aW5nIGFyZSBvcHRpb25hbCBhbmQgdGhlIGRlZmF1bHRzIGFyZSB1c2VkCisjIGlmIG5vdCBzcGVjaWZpZWQuCisjICAgIGFzcGVjdC5yYW5nZSA9IENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGRvdWJsZSB2YWx1ZXMKKyMgICAgICAgIERFRkFVTFRfUkFOR0UgPSB7MC4wLCAwLjMzLCAwLjY2LCAxLjB9OworIyAgICBhc3BlY3Qub3BhY2l0eSA9IENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHZhbHVlcyAwLTI1NQorIyAgICAgICAgREVGQVVMVF9PUEFDSVRZID0gezAsMTI4LDE2MCwxOTJ9OworIyAgICBhc3BlY3QucmVkID0gIENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHZhbHVlcyAwLTI1NQorIyAgICBhc3BlY3QuZ3JlZW4gPSAgQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdmFsdWVzIDAtMjU1CisjICAgIGFzcGVjdC5ibHVlID0gIENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHZhbHVlcyAwLTI1NQorIyBTZWUgQXNwZWN0IGphdmFkb2MgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUyBpcyBTdXNjZXB0aWJsZQorUy5uYW1lID0gU3VzY2VwdGlibGUKK1MuZGVzY3JpcHRpb24gPSBQZXJjZW50YWdlIG9mIHBlb3BsZSB3aG8gYXJlIHN1c2VwdGlibGUgdG8gdGhlIGRpc2Vhc2UuCitTLnJhbmdlID0gMC4wMDEsMC4yLDAuNCwwLjYsMC44LDEuMAorUy5vcGFjaXR5ID0gMCw5NiwxMjgsMTI4LDE2MCwxNjAKK1MuYmx1ZSA9IDAsMjQwLDI0MCwyNDAsMjQwLDI0MAorUy5yZWQgPSAwCitTLmdyZWVuID0gMAorIworIyBFIGlzIGV4cG9zZWQKK0UubmFtZSA9IEV4cG9zZWQKK0UuRGVzY3JpcHRpb24gPSBQZXJjZW50YWdlIG9mIHBlb3BsZSB3aG8gYXJlIGV4cG9zZWQgdG8gdGhlIGRpc2Vhc2UuCitFLnJhbmdlID0gMC4wMDAxLDAuMDEsMC4xLDAuMywwLjYsMS4wCitFLm9wYWNpdHkgPSAwLCAgICAgOTYsMTI4LDE0NCwxNjAsMTc2CitFLnJlZCA9IDI0MAorRS5ncmVlbiA9IDI0MAorIworIyBJIGlzIEluZmVjdGlvdXMKK0kubmFtZSA9IEluZmVjdGlvdXMKK0kuRGVzY3JpcHRpb24gPSBQZXJjZW50YWdlIG9mIHBlb3BsZSB3aG8gYXJlIGluZmVjdGVkIGJ5IHRoZSBkaXNlYXNlLgorSS5yYW5nZSA9IDAuMDAwMDEsMC4wMSwwLjEsMC4zLDAuNiwxLjAKK0kub3BhY2l0eSA9IDAsICAgICAgOTYsMTI4LDE0NCwxNjAsMTc2CitJLnJlZCA9IDI0MAorCisjCisjIFIgaXMgUmVjb3ZlcmVkCitSLm5hbWUgPSBSZWNvdmVyZWQKK1IuRGVzY3JpcHRpb24gPSBQZXJjZW50YWdlIG9mIHBlb3BsZSB3aG8gYXJlIHJlY292ZXJlZCBmcm9tIHRoZSBkaXNlYXNlLgorUi5yYW5nZSA9IDAuMDAwMSwwLjAxLDAuMSwwLjMsMC42LDEuMAorUi5vcGFjaXR5ID0gMCwgICAgIDk2LDEyOCwxMjgsMTYwLDE2MAorUi5ncmVlbiA9IDI0MApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uva21sL0JCb3hJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9CQm94SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOWU2YmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9CQm94SW5mby5qYXZhCkBAIC0wLDAgKzEsMjY3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uua21sOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ltcG9ydCBqYXZhLmF3dC5Qb2x5Z29uOworaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuR0VMb2c7CisKKy8qKgorICogT2J0YWluIHRoZSBCb3VuZGluZ0JveCBpbmZvIGZvciBHb29nbGVFYXJ0aCAKKyAqIGZyb20gdGhlIFNlcnZsZXQuICAKKyAqIEdvb2dsZUVhcnRoIHNlbmRzIHRoZSBjdXJyZW50IFNjcmVlbiB2aWV3aW5nIGFyZWEgdG8gdGhlIHNlcnZsZXQgCisgKiBhcyBhIEJCT1ggcGFyYW1ldGVyLiAgVGhlIFNsaWRlU2hvd1NlcnZsZXQgc2F2ZXMgdGhpcyBCQk9YIHN0cmluZworICogZWFjaCB0aW1lIGl0IGlzIHNlbnQuICAKKyAqIAorICogVGhpcyBjbGFzcyBydW5zIGFzIGEgdGhyZWFkIGFuZCBldmVyeSBOIHNlY29uZHMgbWFrZXMgYSByZXF1ZXN0IHRvIHRoZQorICogIEJCb3hTZXJ2bGV0IHRvIGFjY2VzcyB0aGUgbGF0ZXN0IEJCT1ggc3RyaW5nIGFuZCByZXR1cm4gaXQuCisgKiAgV2UgdGhlbiBjb252ZXJ0IGl0IHRvIGEgYm91bmRpbmcgYm94IHJlY3RhbmdsZSBhbmQgbWFrZSBpdCBhdmFpbGFibGUgCisgKiAgZm9yIGFjY2Vzcy4gIEtNTERpc3BsYXkgd2lsbCBhY2Nlc3MgaXQgYW5kIHVzZSBpdCB0byBmaWx0ZXIgb3V0IAorICogIGRpc3BsYXkgb2YgQWRtaW4gYXJlYXMgdGhhdCBhcmUgbm90IHdpdGhpbiB0aGUgc2NyZWVuIEJvdW5kaW5nIGJveC4KKyAqIAorICoKKyAqLworcHVibGljIGNsYXNzIEJCb3hJbmZvIGltcGxlbWVudHMgUnVubmFibGUgeworICAgIAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0xFRVBUSU1FID0gMTAqMTAwMDsKKwkKKwkvKioKKwkgKiBpZCB1c2VkIHRvIGFjY2VzcyB0aGUgc2Vzc2lvbiBkYXRhIGluIHNlcnZsZXQKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBzZXJ2bGV0SWQgPSBudWxsOworCS8qKgorCSAqIHVybCB0byBhY2Nlc3MgdGhlIHNlcnZsZXQKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBzZXJ2bGV0VXJsID0gbnVsbDsKKwkKKwkvKioKKwkgKiBCb3VuZGluZ0JveCBsYXN0IGdvdHRlbiBmcm9tIHNlcnZsZXQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBSZWN0YW5nbGUgYkJveCA9IG51bGw7CisJCisJcHJpdmF0ZSBTdHJpbmcgYmJveE9sZCA9IG51bGw7CisJLyoqCisJICogY29uc3RydWN0b3IKKwkgKiBAcGFyYW0gdXJsICBVUkwgZm9yIHRoZSBzZXJ2bGV0IHNlcnZlcgorCSAqIEBwYXJhbSBpZCBJZCB0byBpZGVudGlmeSB0aGUgc2VydmxldCBzZXNzaW9uLgorCSAqLworCXB1YmxpYyBCQm94SW5mbyhTdHJpbmcgdXJsLFN0cmluZyBpZCkgeworCQlzZXJ2bGV0SWQgPSBpZDsKKwkJc2VydmxldFVybCA9IHVybDsKKwl9CisJCisJCisJLyoqCisJICogVGhpcyB0aHJlYWQgd2lsbCBzaXQgaW4gYSBsb29wIGFuZCBldmVyeSBOIHNlY29uZHMgaXQgCisJICogd2lsbCBzZW5kIGEgcmVxdWVzdCB0byB0aGUgU2xpZGVTaG93U2VydmxldCB0byBnaXZlIGl0CisJICogdGhlIGxhdGVzdCBCQm94IGluZm8gdGhhdCB3YXMgc2VudCBmcm9tIEdvb2dsZUVhcnRoCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQkKKwkJd2hpbGUgKHRydWUpIHsKKwkJCXRyeSB7CisJCQkJUmVjdGFuZ2xlIGJib3ggPSByZWFkQkJveCgpOworCQkJCWlmIChiYm94ICE9IG51bGwpIAorCQkJCQlzZXRCQm94KGJib3gpOworCQkJCVRocmVhZC5zbGVlcChTTEVFUFRJTUUpOworCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJCQorCQkJfQorCQl9CisKKwl9CisJLyoqCisJICogcmVhZEJCb3ggCisJICogICByZWFkIHRoZSBHb29nbGVFYXJ0aCBCQm94IGluZm8gZnJvbSB0aGUgc2VydmxldC4KKwkgKiAgIEdvb2dsZUVhcnRoIHNlbmRzIHRoZSB2aWV3cG9ydCBib3VuZGluZyBib3ggdG8gdGhlIAorCSAqICAgc2VydmxldCB3aGljaCBzdG9yZXMgaXQuICBUaGlzIHdpbGwgcmVxdWVzdCB0aGUgc2VydmVsZXQKKwkgKiAgIHRvIGZvcndhcmQgaXQgdG8gdXMuCisJICogICAKKwkgKgorCSAqIEByZXR1cm4gQkJveCBSZWN0YW5nbGUgCisJICovCisJcHVibGljICBSZWN0YW5nbGUgIHJlYWRCQm94KCkgeworCQlSZWN0YW5nbGUgYmJveCA9IG51bGw7CisJCQorCQl0cnkgeworCQkJVVJMIHVybCA9IG5ldyBVUkwoc2VydmxldFVybCk7CisJCQlVUkxDb25uZWN0aW9uIGNvbm5lY3QgPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKwkJCWNvbm5lY3Quc2V0VXNlQ2FjaGVzKGZhbHNlKTsKKwkJCWNvbm5lY3Quc2V0RG9JbnB1dCh0cnVlKTsKKwkJCWNvbm5lY3Quc2V0RG9PdXRwdXQodHJ1ZSk7CisJCQljb25uZWN0LnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC10eXBlIiwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworCQkJCisJCQkgIC8vIHVzZSBCeXRlQXJyYXkgb3V0cHV0CisJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZU91dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCURhdGFPdXRwdXRTdHJlYW0gb3V0cHV0ID0KKwkJCQluZXcgRGF0YU91dHB1dFN0cmVhbShieXRlT3V0cHV0KTsKKwkJCS8vIHRlbGwgaXQgd2hhdCB3ZSB3YW50IGFuZCBnaXZlIGtleSB0byBpbmZvCisJCQlvdXRwdXQud3JpdGVVVEYoIkJCT1ggIitzZXJ2bGV0SWQpOworCQkJCisJCQlvdXRwdXQuZmx1c2goKTsKKwkJCWJ5dGVbXSBidWYgPSBieXRlT3V0cHV0LnRvQnl0ZUFycmF5KCk7CisJCQkKKwkJCWNvbm5lY3Quc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LWxlbmd0aCIsICIiK2J1Zi5sZW5ndGgpOworCQkJRGF0YU91dHB1dFN0cmVhbSBkYXRhT3V0cHV0ID0KKwkJCQluZXcgRGF0YU91dHB1dFN0cmVhbShjb25uZWN0LmdldE91dHB1dFN0cmVhbSgpKTsKKwkJCWRhdGFPdXRwdXQud3JpdGUoYnVmKTsKKwkJCWRhdGFPdXRwdXQuZmx1c2goKTsKKwkJCWRhdGFPdXRwdXQuY2xvc2UoKTsKKwkJCQorCQkJRGF0YUlucHV0U3RyZWFtIGluID0gCisJCQkJbmV3IERhdGFJbnB1dFN0cmVhbShjb25uZWN0LmdldElucHV0U3RyZWFtKCkpOworCQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gaW4ucmVhZFVURigpOworCQkJCisJCQlpbi5jbG9zZSgpOworCQkJCisJCQkKKwkJCS8vIFRPRE8gY29udmVydCBzdHJpbmcgdG8gcmVjdGFuZ2xlCisJCQlTdHJpbmcgYmJveHN0ciA9IHN0cmluZ1ZhbHVlLnN1YnN0cmluZyg1KTsKKwkJCWlmICghIGJib3hzdHIuZXF1YWxzKGJib3hPbGQpKSB7CisJCQkgICBHRUxvZy5kZWJ1Zyh0aGlzLCJCQk9YOiAiK2Jib3hzdHIpOworCQkJICAgLy8gY29udmVydCB0byBCb3VuZGluZyBib3ggcmVjdGFuZ2xlCisJCQkgICBiYm94ID0gZ2V0QkJveChiYm94c3RyKTsKKwkJCSAgIEdFTG9nLmRlYnVnKHRoaXMsImJib3g6ICIrYmJveCk7CisJCQkgICBiYm94T2xkID0gYmJveHN0cjsKKwkJCX0KKwkJCQorCQkJCisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CQorCQkJCisJCQlHRUxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSk7CisJCQorCQkJLy9lcnJvciA9IkVSUk9SIEludmFsaWQgVVJMICIrdXJsc3RyOworCQkJCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsJCQkKKwkJCUdFTG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpKTsKKwkJCQorCQl9CisJCQorCQlyZXR1cm4gYmJveDsKKwl9CisJLyoqCisJICogR2l2ZW4gYSBCQk9YIHN0cmluZyByZXR1cm5lZCBmcm9tIEdvb2dsZUVhcnRoIAorCSAqIGdlbmVyYXRlIHRoZSBCb3VuZGluZ0JveCByZWN0YW5nbGUuCisJICogR29vZ2xlRWFydGggcmV0dXJucyB0aGUgQkJPWCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdC4KKwkgKiAgQkJPWCB4MSx5MSx4Mix5MgorCSAqICB3aGVyZSB4MSx5MSBhcmUgbGF0aXR1ZGUvbG9uZ2l0dWRlIG9mIGJvdHRvbSBsZWZ0IHBvaW50IAorCSAqICBhbmQgeDIseTIgYXJlIGxhdGl0dWRlL2xvbmdpdHVkZSBvZiB0b3AgcmlnaHQgcG9pbnQKKwkgKiAgVmFsdWVzIGFyZSBkb3VibGVzIGxpa2UgLTExNC4xNDU3ODkzNAorCSAqICAgCisJICogTm90ZSB0aGF0IHRoZSBSZWN0YW5nbGUgY29vcmRpbmF0ZSBzeXN0ZW0gdXNlcyB0aGUgb3JpZ2luICAKKwkgKiAoMCwwKSBhcyB0aGUgdG9wIGxlZnQgb2YgdGhlIHNjcmVlbiwgCisJICogIHdpdGggdGhlIHggYW5kIHkgdmFsdWVzIGluY3JlYXNpbmcgYXMgdGhleSBtb3ZlIHRvIHRoZSByaWdodCAKKwkgKiAgYW5kIGRvd24gcmVzcGVjdGl2ZWx5LgorCSAqICAKKwkgKiBAcGFyYW0gU3RyaW5nIGNvbnRhaW5pbmcgQkJPWCBpbmZvIGZyb20gR0UKKwkgKiBAcmV0dXJuIFJlY3RhbmdsZQorCSAqLworCXByaXZhdGUgc3RhdGljIFJlY3RhbmdsZSBnZXRCQm94KFN0cmluZyBiYm94U3RyaW5nKSB7CisKKwkJUmVjdGFuZ2xlIGJCb3ggPSBudWxsOworCisJCVBvbHlnb24gcG9seWdvbiA9IG5ldyBQb2x5Z29uKCk7CisJCS8vR0VMb2cuZGVidWcoQkJveEluZm8uY2xhc3MsICJCQk9YOiAiICsgYmJveFN0cmluZyk7CisKKwkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihiYm94U3RyaW5nLCAiLCIpOworCQlpZiAoc3QuY291bnRUb2tlbnMoKSA9PSA0KSB7CisJCQkvLyBHRSByZXR1cm5zIHRoZSBCQm94IGFzIGJvdHRvbSBsZWZ0LCB0b3AgcmlnaHQgY29vcmRpbmF0ZXMKKwkJCS8vIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRvIHRvcCBsZWZ0ICsgd2lkdGgraGVpZ2h0CisJCQlkb3VibGUgeDEgPSBEb3VibGUucGFyc2VEb3VibGUoc3QubmV4dFRva2VuKCkpOworCQkJZG91YmxlIHkxID0gRG91YmxlLnBhcnNlRG91YmxlKHN0Lm5leHRUb2tlbigpKTsKKwkJCWRvdWJsZSB4MiA9IERvdWJsZS5wYXJzZURvdWJsZShzdC5uZXh0VG9rZW4oKSk7CisJCQlkb3VibGUgeTIgPSBEb3VibGUucGFyc2VEb3VibGUoc3QubmV4dFRva2VuKCkpOworCQkJZG91YmxlW10gbG9uZ2l0dWRlcyA9IHsgeDEsIHgxLCB4MiwgeDIsIHgxIH07CisJCQlkb3VibGVbXSBsYXRpdHVkZXMgPSB7IHkxLCB5MiwgeTIsIHkyLCB5MSB9OworICAgICAgICAgICAgLy8gaWdub3JlIGlmIGVudGlyZSBnbG9iZQorCQkJaWYgKHgxID09IC0xODAgJiYgeDIgPT0gMTgwKSB7CisJCQkJLy94MSA9IC0xODA7CisJCQkJeDIgPSAwOworCQkJCUdFTG9nLmRlYnVnKEJCb3hJbmZvLmNsYXNzLCIqKioqKiogbW9kaWZ5IEJCT1ggdG8gMTgwLDAgKioqKioqIik7CisJCQl9CisJCQkJCisJCQkKKwkJCWZvciAoaW50IHAgPSAwOyBwIDwgbG9uZ2l0dWRlcy5sZW5ndGg7IHArKykgeworCQkJCWRvdWJsZSB4ID0gbG9uZ2l0dWRlc1twXTsKKwkJCQlkb3VibGUgeSA9IGxhdGl0dWRlc1twXTsKKwkJCQlpbnQgeGludCA9IChpbnQpICgoeCArIDE4MCkgKiAxMDAwKTsKKwkJCQlpbnQgeWludCA9IChpbnQpICgoeSArIDkwKSAqIDEwMDApOworCisJCQkJcG9seWdvbi5hZGRQb2ludCh4aW50LCB5aW50KTsKKwkJCX0KKwkJfQorCQorCQkKKwkJYkJveCA9IHBvbHlnb24uZ2V0Qm91bmRzKCk7CisJCQorCQlyZXR1cm4gYkJveDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBiQm94CisJICovCisJcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgUmVjdGFuZ2xlIGdldEJCb3goKSB7CisJCXJldHVybiBiQm94OworCX0KKworCisJLyoqCisJICogQHBhcmFtIGJveCB0aGUgYkJveCB0byBzZXQKKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNldEJCb3goUmVjdGFuZ2xlIGJveCkgeworCQliQm94ID0gYm94OworCX0KKwkKKwkvKioKKwkgKiBUZXN0ICBjb250YWlubWVudCBvZiBib3VuZGluZyBib3ggMSBpbiBCb3VuZGluZyBib3ggMgorCSAqIElmIGFueSBjb3JuZXIgb2YgQkJveCAxIGlzIGNvbnRhaW5lZCBpbiBCQm94IDIgb3IgYW55IGNvcm5lcgorCSAqIG9mIEJCb3ggMiBpcyBjb250YWluZWQgaW4gQkJveCAxIHRoZW4gdGhleSBhcmUgYWRqYWNlbnQuCisJICogCisJICogQHBhcmFtIHIxICBib3VuZGluZyBib3ggMQorCSAqIEBwYXJhbSByMiAgYm91bmRpbmcgYm94IDIKKwkgKiBAcmV0dXJuIHRydWUgaWYgYWRqYWNlbnQgb3IgY29udGFpbm1lbnQgdHJ1ZQorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0Q29udGFpbm1lbnQgKFJlY3RhbmdsZSByMSwgUmVjdGFuZ2xlIHIyKSB7CisJCQorCQkvLyBjb29yZHMgb2YgY29ybmVycyBvZiBmaXJzdCBib3VuZGluZyBib3gKKwkJaW50IHhNaW4xID0gcjEueDsKKwkJaW50ICB4TWF4MSA9IHIxLngrcjEud2lkdGg7CisJCWludCAgeU1pbjEgPSByMS55LXIxLmhlaWdodDsKKwkJaW50ICB5TWF4MSA9IHIxLnk7CisJCS8vIHRlc3Qgb3ZlcmxhcAorCQlpZiAocjIuY29udGFpbnMoeE1pbjEseU1pbjEpKSByZXR1cm4gdHJ1ZTsKKwkJaWYgKHIyLmNvbnRhaW5zKHhNaW4xLHlNYXgxKSkgcmV0dXJuIHRydWU7CisJCWlmIChyMi5jb250YWlucyh4TWF4MSx5TWF4MSkpIHJldHVybiB0cnVlOworCQlpZiAocjIuY29udGFpbnMoeE1heDEseU1pbjEpKSByZXR1cm4gdHJ1ZTsKKwkJCisgICAgICAgIC8vIGNvb3JkcyBvZiBjb3JuZXJzIG9mIHNlY29uZCBib3VuZGluZyBib3gKKwkJaW50ICB4TWluMiA9IHIyLng7CisJCWludCAgeE1heDIgPSByMi54K3IyLndpZHRoOworCQlpbnQgIHlNaW4yID0gcjIueS1yMi5oZWlnaHQ7CisJCWludCAgeU1heDIgPSByMi55OworICAgICAgICAvLyB0ZXN0IG92ZXJsYXAKKwkJaWYgKHIxLmNvbnRhaW5zKHhNaW4yLHlNaW4yKSkgcmV0dXJuIHRydWU7CisJCWlmIChyMS5jb250YWlucyh4TWluMix5TWF4MikpIHJldHVybiB0cnVlOworCQlpZiAocjEuY29udGFpbnMoeE1heDIseU1heDIpKSByZXR1cm4gdHJ1ZTsKKwkJaWYgKHIxLmNvbnRhaW5zKHhNYXgyLHlNaW4yKSkgcmV0dXJuIHRydWU7CisJCSAKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uva21sL0Nvb3JkaW5hdGVzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9Db29yZGluYXRlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MDU3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9Db29yZGluYXRlcy5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uua21sOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAorCisvKioKKyAqIEJ1aWxkIGEgY29vcmRpbmF0ZXMgYXR0cmlidXRlIGZvciBhIEtNTCBkb2N1bWVudC4KKyAqIDxwcmU+CisgKiAgICAKKyAqIDwvcHJlPgorICogCisgKgorICovCisgIAorICAKKy8qCis8Y29vcmRpbmF0ZXM+CisgICAgMzIuNTY3LC0xMjIuMDk4LDUwIAorICA8L2Nvb3JkaW5hdGVzPgorCisqLyAgIAorcHVibGljIGNsYXNzIENvb3JkaW5hdGVzIHsKKyAgIAorICAgIHByaXZhdGUgZG91YmxlIF9sb25naXR1ZGU7CisgICAgCisgICAgcHJpdmF0ZSBkb3VibGUgX2xhdGl0dWRlOworICAgIAorICAgIHByaXZhdGUgZG91YmxlIF9hbHRpdHVkZTsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gX2lzQWx0aXR1ZGVTcGVjaWZpZWQ7CisgICAgLyoqCisgICAgICogQ29vcmRpbmF0ZXMgY29uc3RydWN0b3Igd2l0aG91dCBhbHRpdHVkZS4KKyAgICAgKiAgICAKKyAgICAgKiBDcmVhdGUgYSBjb29yZGluYXRlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBsb25naXR1ZGUKKyAgICAgKiBAcGFyYW0gbGF0aXR1ZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29vcmRpbmF0ZXMoZG91YmxlIGxvbmdpdHVkZSwKKyAgICAgICAgICAgIGRvdWJsZSBsYXRpdHVkZSkgeworICAgICAgICBfbG9uZ2l0dWRlID0gbG9uZ2l0dWRlOworICAgICAgICBfbGF0aXR1ZGUgPSBsYXRpdHVkZTsgICAgICAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvb3JkaW5hdGVzIGNvbnN0cnVjdG9yIHdpdGggYWx0aXR1ZGUuCisgICAgICogICAgCisgICAgICogQ3JlYXRlIGEgY29vcmRpbmF0ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbG9uZ2l0dWRlCisgICAgICogQHBhcmFtIGxhdGl0dWRlCisgICAgICogQHBhcmFtIGFsdGl0dWRlCisgICAgICovCisgICAgcHVibGljIENvb3JkaW5hdGVzKGRvdWJsZSBsb25naXR1ZGUsCisgICAgICAgICAgICBkb3VibGUgbGF0aXR1ZGUsCisgICAgICAgICAgICBkb3VibGUgYWx0aXR1ZGUpIHsKKyAgICAgICAgdGhpcyhsb25naXR1ZGUsbGF0aXR1ZGUpOyAgICAgICAgCisgICAgICAgIF9pc0FsdGl0dWRlU3BlY2lmaWVkID0gdHJ1ZTsKKyAgICAgICAgX2FsdGl0dWRlID0gYWx0aXR1ZGU7CisgICAgfQorICAgIC8qKgorICAgICAqIAorICAgICAqIEByZXR1cm4gU3RyaW5nIHdpdGggbG9uZ2l0dWRlLGxhdGl0dWRlWyxhbHRpdHVkZV0gKSAKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvb3JkaW5hdGVzKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBzdHIuYXBwZW5kKERvdWJsZS50b1N0cmluZyhfbG9uZ2l0dWRlKSk7CisgICAgICAgIHN0ci5hcHBlbmQoIiwiKTsKKyAgICAgICAgc3RyLmFwcGVuZChEb3VibGUudG9TdHJpbmcoX2xhdGl0dWRlKSk7CisgICAgICAgIGlmIChfaXNBbHRpdHVkZVNwZWNpZmllZCkgeworICAgICAgICAgICAgc3RyLmFwcGVuZCgiLCIpOworICAgICAgICAgICAgc3RyLmFwcGVuZChEb3VibGUudG9TdHJpbmcoX2FsdGl0dWRlKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0ci50b1N0cmluZygpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGxvbmdpdHVkZSAKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgZG91YmxlIGdldExvbmdpdHVkZSgpIHsKKyAgICAgICAgcmV0dXJuIF9sb25naXR1ZGU7CisgICAgfQorICAgIC8qKgorICAgICAqIAorICAgICAqIEByZXR1cm4gbGF0aXR1ZGUgCisgICAgICovCisgICAgCisgICAgcHVibGljIGRvdWJsZSBnZXRMYXRpdHVkZSgpIHsKKyAgICAgICAgcmV0dXJuIF9sYXRpdHVkZTsKKyAgICB9CisgICAgLyoqCisgICAgICogCisgICAgICogQHJldHVybiBhbHRpdHVkZSAKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgZG91YmxlIGdldEFsdGl0dWRlICgpIHsKKyAgICAgICAgcmV0dXJuIF9hbHRpdHVkZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQWRkIGNvb3JkaW5hdGVzIHRvIHRoZSBDb29yZGluYXRlcyBzZWN0aW9uCisgICAgICogICAgICAKKyAgICAgKiBAcGFyYW0gbG9uZ2l0dWRlCisgICAgICogQHBhcmFtIGxhdGl0dWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29vcmRpbmF0ZXMoZG91YmxlIGxvbmdpdHVkZSxkb3VibGUgbGF0aXR1ZGUpIHsKKyAgICAgICAgX2xvbmdpdHVkZSA9IGxvbmdpdHVkZTsKKyAgICAgICAgX2xhdGl0dWRlID0gbGF0aXR1ZGU7ICAgIAorICAgIH0KKyAgICAvKioKKyAgICAgKiBBZGQgY29vcmRpbmF0ZXMgdG8gdGhlIENvb3JkaW5hdGVzIHNlY3Rpb24gKHdpdGggYWx0aXR1ZGUpCisgICAgICogICAgICAKKyAgICAgKiBAcGFyYW0gbG9uZ2l0dWRlCisgICAgICogQHBhcmFtIGxhdGl0dWRlCisgICAgICogQHBhcmFtIGFsdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvb3JkaW5hdGVzKGRvdWJsZSBsb25naXR1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxhdGl0dWRlLGludCBhbHQpIHsKKyAgICAgICAgX2xvbmdpdHVkZSA9IGxvbmdpdHVkZTsKKyAgICAgICAgX2xhdGl0dWRlID0gbGF0aXR1ZGU7ICAgCisgICAgICAgIF9hbHRpdHVkZSA9IGFsdDsKKyAgICB9CisgICAgLyoqCisgICAgICogcmV0dXJuIGEgc2V0IG9mIGNvb3JkaW5hdGVzIGFzIGEgU3RyaW5nLgorICAgICAqIAorICAgICAqICBUaGlzIGlzIG5lZWRlZCB0byBidWlsZCBhIHBvbHlnb24gZnJvbSBhCisgICAgICogIGxpc3Qgb2YgcG9pbnRzLgorICAgICAqICAKKyAgICAgKiAgIGxvbmcxLGxhdDEsYWx0MSBsb25nMixsYXQyLGFsdDIgLi4uCisgICAgICogQHBhcmFtIGNvcm5lcnMKKyAgICAgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKENvb3JkaW5hdGVzW10gY29ybmVycykgeworICAgICAgICAKKyAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNvcm5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpIT0wKQorICAgICAgICAgICAgICAgIHN0cmJ1Zi5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgIFN0cmluZyB2ID0gRG91YmxlLnRvU3RyaW5nKGNvcm5lcnNbaV0uZ2V0TG9uZ2l0dWRlKCkpOworICAgICAgICAgICAgc3RyYnVmLmFwcGVuZCh2KTsKKyAgICAgICAgICAgIHN0cmJ1Zi5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgIHYgPSBEb3VibGUudG9TdHJpbmcoY29ybmVyc1tpXS5nZXRMYXRpdHVkZSgpKTsKKyAgICAgICAgICAgIHN0cmJ1Zi5hcHBlbmQodik7CisgICAgICAgICAgICBzdHJidWYuYXBwZW5kKCIsIik7CisgICAgICAgICAgICBpZiAoY29ybmVyc1tpXS5faXNBbHRpdHVkZVNwZWNpZmllZCkgeworICAgICAgICAgICAgICAgIHYgPSBEb3VibGUudG9TdHJpbmcoY29ybmVyc1tpXS5nZXRMYXRpdHVkZSgpKTsKKyAgICAgICAgICAgICAgICBzdHJidWYuYXBwZW5kKHYpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisJLyoqCisJICogQHJldHVybiB0aGUgX2lzQWx0aXR1ZGVTcGVjaWZpZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0FsdGl0dWRlU3BlY2lmaWVkKCkgeworCQlyZXR1cm4gX2lzQWx0aXR1ZGVTcGVjaWZpZWQ7CisJfQorICAgIAorICAgIAorfSAvLyBlbmQgY2xhc3MKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uva21sL0lLbWxEaXNwbGF5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9JS21sRGlzcGxheS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNjhmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9JS21sRGlzcGxheS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5rbWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5Bc3BlY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5HRURhdGE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIElLTUxEaXNwbGF5IGRlZmluZXMgdGhlIGludGVyZmFjZSBmb3IgY2xhc3NlcyB0aGF0IGltcGxlbWVudAorICogdGhlIGdlbmVyYXRpb24gb2YgS01MIGZpbGVzIHRoYXQgd2lsbCBkaXNwbGF5IHRoZSBTVEVNCisgKiBkaXNlYXNlIGFzcGVjdCBvbiB0aGUgR29vZ2xlRWFydGggbWFwLiAgCisgKiAKKyAqIEltcGxlbWVudGF0aW9ucyBvZiBJS21sRGlzcGxheSBoYXZlIGEgc2luZ2xlIG1ldGhvZCAKKyAqICJnZW5lcmF0ZVBvbHlnb25zIiB3aGljaCBpcyBwYXNzZWQgYWxsIG9mIHRoZSBpbmZvcm1hdGlvbiAKKyAqIG5lZWRlZCB0byB3cml0ZSB0aGUgZGVzaXJlZCBLTUwuIAorICoKKyAqLworcHVibGljIGludGVyZmFjZSBJS21sRGlzcGxheSB7CisJCisKKwkgLyoqCisgICAgICogQ3JlYXRlIHRoZSBLTUwgY29udHJvbCBmaWxlIHRvIGRpc3BsYXkgYWxsIG9mIHRoZSAKKyAgICAgKiBwb2x5Z29uIChjb3VudHkpIGFyZWFzCisgICAgICoKKyAgICAgKiA8cHJlPgorICAgICAqIEluZm9ybWF0aW9uIHBhc3NlZDoKKyAgICAgKiAKKyAgICAgKiBjb250cm9sRmlsZW5hbWU6ICBUaGUgZmlsZW5hbWUgd2hlcmUgdGhlIHJlc3VsdGluZyBLTUwgaXMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiAgICAKKyAgICAgKiBnZURhdGE6ICBBIEhhc2hNYXAgY29udGFpbmluZyBhbiBlbnRyeSBmb3IgZWFjaCBnZW9ncmFwaGljYWwKKyAgICAgKiAgICAgICAgICBhcmVhIGJlaW5nIG1hcHBlZCBieSB0aGlzIHNpbXVsYXRpb24uIEl0IGNvbnRhaW5zIHRoZSAKKyAgICAgKiAgICAgICAgICBnZW9ncmFwaGljYWwgYm9yZGVycyAobGF0bG9uZykgYW5kIHZhbHVlcyBmb3IgCisgICAgICogICAgICAgICAgZWFjaCBBc3BlY3QuIAorICAgICAqICAgICAgICAgIAorICAgICAqIGFzcGVjdDogIFRoZSBBc3BlY3QgdGhhdCB0aGUgdXNlciB3YW50cyBkaXNwbGF5ZWQuIAorICAgICAqIAorICAgICAqIAorICAgICAqIDwvcHJlPgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250cm9sRmlsZU5hbWUgRmlsZSB3aGVyZSBLTUwgd2lsbCBiZSB3cml0dGVuIAorICAgICAqIEBwYXJhbSBnZURhdGEgTWFwIG9mIEdFRGF0YSBvYmplY3RzIAorICAgICAqIEBwYXJhbSBhc3BlY3QgIHdoaWNoIHR5cGUgb2YgbWFwIChwb3B1bGF0aW9uLHN1c2NlcHRpcGxlLi4uCisgICAgICogCisgICAgICovCisgICAgCisJcHVibGljIHZvaWQgZ2VuZXJhdGVQb2x5Z29ucyhTdHJpbmcgY29udHJvbEZpbGVOYW1lLCAKKwkJCU1hcDxTdHJpbmcsR0VEYXRhPiBnZURhdGEsIEFzcGVjdCBhc3BlY3QpOworCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9rbWwvS21sRGlzcGxheS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9rbWwvS21sRGlzcGxheS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZTE4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9LbWxEaXNwbGF5LmphdmEKQEAgLTAsMCArMSwyODQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5rbWw7CisKK2ltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuQXNwZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuR0VEYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuR0VMb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS52aWV3cy5HRVByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFN0YW5kYXJkIERJU1BMQVkgT0YgU0VJUiBhc3BlY3RzLiAKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBLbWxEaXNwbGF5IGltcGxlbWVudHMgSUttbERpc3BsYXkgICB7CisKKwkvKioKKyAgICAgKiBpbml0aWFsaXphdGlvbgorICAgICAqIAorICAgICAqIGN1cnJlbnRseSB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8KKyAgICAgKiAKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgIAkgICAgICAgIAorICAgIH0KKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIEtNTCBjb250cm9sIGZpbGUgdG8gZGlzcGxheSBhbGwgb2YgdGhlIAorICAgICAqIHBvbHlnb24gKGNvdW50eSkgYXJlYXMKKyAgICAgKgorICAgICAqIFdlIHdpbGwgaGF2ZSBOIFBsYWNlTWFya3MsIGVhY2ggb2Ygd2hpY2ggd2lsbCAKKyAgICAgKiBiZSBhc3NvY2lhdGVkIHdpdGggYSBkaWZmZXJudCBTdHlsZSAoZm9yIGNvbG9yKSAKKyAgICAgKiBUaGUgcG9seWdvbnMgd2lsbCBiZSBwbGFjZWQgaW4gYSBwbGFjZW1hcmsgYmFzZWQKKyAgICAgKiBvbiB0aGUgY29sb3Igc2VsZWN0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250cm9sRmlsZU5hbWUgRmlsZSB3aGVyZSBLTUwgd2lsbCBiZSB3cml0dGVuIAorICAgICAqIEBwYXJhbSBnZURhdGEgTWFwIG9mIEdFRGF0YSBvYmplY3RzIAorICAgICAqIEBwYXJhbSBhc3BlY3QgIHdoaWNoIHR5cGUgb2YgbWFwIChwb3B1bGF0aW9uLHN1c2NlcHRpcGxlLi4uCisgICAgICogQHBhcmFtIGN5Y2xlIGN1cnJlbnQgbnVtYmVyIG9mIGN5Y2xlIGJlaW5nIGRpc3BsYXllZAorICAgICAqLworICAgIAorCXB1YmxpYyB2b2lkIGdlbmVyYXRlUG9seWdvbnMoU3RyaW5nIGNvbnRyb2xGaWxlTmFtZSwgCisJCQlNYXA8U3RyaW5nLEdFRGF0YT4gZ2VEYXRhLCBBc3BlY3QgYXNwZWN0KSB7CisgICAgICAgIGludCB3cml0dGVuID0gMDsKKwkJLy9HRUxvZy5kZWJ1Zyh0aGlzLCJhc3BlY3Q9Iithc3BlY3QrIiBudW1iZXI9IitnZURhdGEuc2l6ZSgpKTsKKwkJCisJCUttbERvYyBrbWwgPSBuZXcgS21sRG9jKCk7CisJCURvY3VtZW50IGRvYyA9IGttbC5nZXREb2N1bWVudCgpOworCQlFbGVtZW50IHJvb3QgPSBrbWwuc2V0Um9vdChudWxsKTsKKwkJRWxlbWVudCBkb2N1bWVudCA9IGttbC5hcHBlbmRFbGVtZW50KHJvb3QsIkRvY3VtZW50Iik7CisJCVN0eWxlW10gc3R5bGVzID0gc2V0dXBTdHlsZXMoa21sLGRvY3VtZW50LGFzcGVjdCk7CisJCWludCBtYXggPSBhc3BlY3QuZ2V0UmFuZ2UoKS5sZW5ndGg7CisJCQorCQkvL1NldHVwIHRoZSBwbGFjZW1hcmtzIGZvciBwb2x5Z29ucyB3aXRoIHNhbWUgYXR0cmlidXRlCisJCVBsYWNlTWFya1tdIHBsYWNlTWFyayA9IG5ldyBQbGFjZU1hcmtbbWF4XTsKKwkJRWxlbWVudFtdIG11bHRpR2VvbWV0cnkgPSBuZXcgRWxlbWVudFttYXhdOworCQlmb3IgKGludCBqPTA7ajxtYXg7aisrKSB7CisJCQlwbGFjZU1hcmtbal0gPSBuZXcgUGxhY2VNYXJrKGRvYyk7CisJCQlkb2N1bWVudC5hcHBlbmRDaGlsZChwbGFjZU1hcmtbal0uZ2V0RWxlbWVudCgpKTsKKwkJCXBsYWNlTWFya1tqXS5zZXREZXNjcmlwdGlvbigiU1RFTSBtYXAiKTsKKworCQkJcGxhY2VNYXJrW2pdLnNldE5hbWUoIlNURU0iK2opOworCQkJcGxhY2VNYXJrW2pdLnNldFN0eWxlVXJsKHN0eWxlc1tqXSk7ICAgCisJCQltdWx0aUdlb21ldHJ5W2pdID0gZG9jLmNyZWF0ZUVsZW1lbnQoIk11bHRpR2VvbWV0cnkiKTsKKwkJCXBsYWNlTWFya1tqXS5hcHBlbmRDaGlsZChtdWx0aUdlb21ldHJ5W2pdKTsKKwkJfSAKKwkJCisJCS8vIG5vdyB3ZSBnZW5lcmF0ZSBhIHBvbHlnb24gZm9yIGVhY2ggY291bnR5CisvLwkJaW50IGRlYnVnY291bnRlciA9MDsKKwkJLy8gR2V0IGxhdGVzdCBCQm94IGluZm8gZnJvbSBHb29nbGVFYXJ0aAorCQlSZWN0YW5nbGUgYmJveFZpZXcgPSBCQm94SW5mby5nZXRCQm94KCk7CisJCUl0ZXJhdG9yIGl0ID0gZ2VEYXRhLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJYm9vbGVhbiBiYm94RmlsdGVyID0gR0VQcmVmZXJlbmNlUGFnZS5pc0JCT1goKTsgCisJCXdoaWxlKGl0Lmhhc05leHQoKSkgeworCQkJaW50IHR5cGUgPSAwOworCQkJTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKKwkJCUdFRGF0YSBkYXRhID0gKEdFRGF0YSllLmdldFZhbHVlKCk7CisKKwkJCVN0cmluZyBjb3VudHkgPSBkYXRhLmdldE5hbWUoKTsJCisJCQkvLyBjaGVjayBpZiB3ZSBhcmUgZmlsdGVyaW5nIG91dCBzb21lIGFyZWFzCisJCQlpZiAoYmJveEZpbHRlciAmJiBmaWx0ZXIoZGF0YSxiYm94VmlldykpICB7CisJCQkJdHlwZSA9IDA7CQorCQkJfSBlbHNlIHsJCQkJCisJCQkJdHlwZSA9IHNlbGVjdEJ5VmFsdWUoYXNwZWN0LGRhdGEpOworCQkJfQorCQkJCisvLwkJCSBERUJVRyB0ZW1wCisvLwkJCVN0cmluZyBsb2NpZCA9IGxvYy5nZXRJZCgpLnRvU3RyaW5nKCk7CQorLy8JCQlpZiAoY291bnR5LnN0YXJ0c1dpdGgoIk1pZGRsZXNleCIpKSB7CQkJCQkJCQkgCisvLwkJCQlHRUxvZy5kZWJ1Zyh0aGlzLCJnZW5lcmF0ZVBvbHlnb25zOiAiK2krIjogIitjb3VudHkrIjoiK2xvY2lkKworLy8JCQkJCQkiOiAiK3R5cGUrIjogIitjb29yZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8vCQkJfQorCQkJaWYgKHR5cGUgPiAwKSB7CisJCQkJLy9HRUxvZy5kZWJ1Zyh0aGlzLGNvdW50eSk7IAorCQkJCWludCBuID0gZGF0YS5nZXROdW1BcmVhcygpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQkJCQorCQkJCQlTdHJpbmcgY29vcmQgPSBkYXRhLmdldENvb3JkaW5hdGVzQXNTdHJpbmcoaSk7CisJCQkJCS8vaWYgKGkgPiAwKQorCQkJCQkvLyAgIEdFTG9nLmRlYnVnKHRoaXMsaSsiOiAiK2NvdW50eSsiICIrY29vcmQpOworCQkJCQlQb2x5Z29uIHBvbHlnb24gPSBuZXcgUG9seWdvbihkb2MpOworCQkJCQlrbWwuYXBwZW5kVGV4dChwb2x5Z29uLmdldEVsZW1lbnQoKSwgIm5hbWUiLCBjb3VudHkpOworCQkJCQlwb2x5Z29uLnNldENvb3JkaW5hdGVzKGNvb3JkKTsKKwkJCQkJbXVsdGlHZW9tZXRyeVt0eXBlXS5hcHBlbmRDaGlsZChwb2x5Z29uLmdldEVsZW1lbnQoKSk7CisJCQkJfQorCQkJCXdyaXR0ZW4rKzsKKwkJCX0KKworCQl9CisKKwkJR0VMb2cuZGVidWcodGhpcywid3JpdGUgIitjb250cm9sRmlsZU5hbWUrCisJCQkJIiB3aXRoICIrd3JpdHRlbisiIGVudHJpZXMuIik7CisJCWttbC53cml0ZUZpbGUoY29udHJvbEZpbGVOYW1lKTsKKwkJLy9HRUxvZy5kZWJ1Zyh0aGlzLCJlbmQgd3JpdGUgb2YgIitjb250cm9sRmlsZU5hbWUpOyAKKwkJcmV0dXJuOworCX0KKworCS8qKgorCSAqIGNoZWNrIGlmIHRoaXMgZW50cnkgc2hvdWxkIGJlIGZpbHRlcmVkIG91dCAKKwkgKiAKKwkgKiBAcGFyYW0gZGF0YSAgSW5zdGFuY2UgdGhhdCBjb250YWlucyBpbmZvIGZvciB0aGlzIGFkbWluIGFyZWEKKwkgKiBAcGFyYW0gYmJveFZpZXcgU2NyZWVuIGJvdW5kYXJ5IGJveCBmcm9tIEdvb2dsZUVhcnRoIAorCSAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBzaG91bGQgYmUgZmlsdGVyZWQgb3V0LgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBmaWx0ZXIoR0VEYXRhIGRhdGEsUmVjdGFuZ2xlIGJib3hWaWV3KSB7CisJCWJvb2xlYW4gZmlsdGVyZWQgPSBmYWxzZTsgIC8vIGRlZmF1bHQgLSBub3QgZmlsdGVyZWQKKwkJaWYgKGJib3hWaWV3ICE9IG51bGwgKSB7CQkJCQorCQkJUmVjdGFuZ2xlIGJib3ggPSBkYXRhLmdldEJCb3goKTsKKwkJCWZpbHRlcmVkID0gISBCQm94SW5mby50ZXN0Q29udGFpbm1lbnQoYmJveCxiYm94Vmlldyk7CisJCQlyZXR1cm4gZmlsdGVyZWQ7CisJCX0gCisvLwkJCQlpZiAoY291bnR5LmluZGV4T2YoIiBNQSAiKT49MCAgfHwKKy8vCQkJCSAgICBjb3VudHkuaW5kZXhPZigiIE1UICIpPj0wICAgICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvLwkJCSAgICAgICAgZmlsdGVyZWQgPSAhIHRlc3RDb250YWlubWVudChiYm94LGJib3hWaWV3KTsJCQkgICAgCQorLy8JCQkgICAgCUdFTG9nLmRlYnVnKHRoaXMsIiBiYm94OiAgICAiK2Jib3gpOworLy8JCQkgICAgCUdFTG9nLmRlYnVnKHRoaXMsIiBiYm94VmlldzoiK2Jib3hWaWV3KTsKKy8vCQkJCX0KKy8vCQlpZiAoR0VQcmVmZXJlbmNlUGFnZS5pc1Rlc3QoKSkgewkJCisvLwkJCVN0cmluZyBjb3VudHkgPSBkYXRhLmdldE5hbWUoKTsJCisvLwkJCWlmIChjb3VudHkuaW5kZXhPZigiIFVTLSIpPj0gMCApIHsJCQkJCQorLy8JCQkJZmlsdGVyZWQgPSBmYWxzZTsKKy8vCQkJCisvLwkJCX0gZWxzZSBpZiAoY291bnR5LmluZGV4T2YoIiBNRVgiKT49IDAgKSB7CQkJCQkKKy8vCQkJCWZpbHRlcmVkID0gZmFsc2U7CisvLwkJCX0gZWxzZSB7CisvLwkJCQlmaWx0ZXJlZCA9IHRydWU7CisvLwkJCX0KKy8vCQkJCisvLwkJCS8vR0VMb2cuZGVidWcodGhpcyxjb3VudHkrIiAiK2ZpbHRlcmVkKTsKKy8vCQl9CisJCXJldHVybiBmaWx0ZXJlZDsKKwl9CisJCisJCisvLwk8U3R5bGUgaWQ9IlN0eWxlMSI+CisvLwkgIDxMaW5lU3R5bGU+CisvLwkgICAgIDx3aWR0aD4wLjM8L3dpZHRoPgorLy8JICA8L0xpbmVTdHlsZT4KKy8vCSAgPFBvbHlTdHlsZT4KKy8vCSAgICA8b3V0bGluZT4wPC9vdXRsaW5lPgorLy8JICAgIDxmaWxsPjE8L2ZpbGw+CisvLwkgICAgPGNvbG9yPjgwMDAwMGYwPC9jb2xvcj4KKy8vCSAgPC9Qb2x5U3R5bGU+CisvLwk8L1N0eWxlPgorICAvKioKKyAgICogQnVpbGQgdGhlIFN0eWxlIHN0YXRlbWVudHMgdGhhdCB3aWxsIGJlIHJlZmVyZWRlZCB0byAKKyAgICogYnkgdGhlIHBvbHlnb25zIGxpc3RlZCBsYXRlci4gIAorICAgKiAKKyAgICogQHBhcmFtIGttbAorICAgKiBAcGFyYW0gZG9jdW1lbnQKKyAgICogQHBhcmFtIGFzcGVjdAorICAgKiBAcmV0dXJuIFN0eWxlW10gYXJyYXkgb2YgS01MIFN0eWxlIGluc3RhbmNlcworICAgKi8KKyAgcHJpdmF0ZSBTdHlsZVtdIHNldHVwU3R5bGVzKEttbERvYyBrbWwsRWxlbWVudCBkb2N1bWVudCwgQXNwZWN0IGFzcGVjdCkgeworCURvY3VtZW50IGRvYyA9IGttbC5nZXREb2N1bWVudCgpOwkKKwlpbnQgbWF4ID0gYXNwZWN0LmdldFJhbmdlKCkubGVuZ3RoOworCS8vIGRlZmluZSB0aGUgU3R5bGUgc2VjdGlvbnMKKwlTdHlsZVtdIHN0eWxlcyA9IG5ldyBTdHlsZVttYXhdOworCWZvciAoaW50IGs9MDtrPG1heDtrKyspIHsgCisJCXN0eWxlc1trXSA9IG5ldyBTdHlsZShkb2MsIlN0eWxlIitrKTsKKwkJc3R5bGVzW2tdLnNldExpbmVTdHlsZSgwLjMpOworCQlkb2N1bWVudC5hcHBlbmRDaGlsZChzdHlsZXNba10uZ2V0RWxlbWVudCgpKTsKKwkJLyogc2V0IHRoZSBQb2x5U3R5bGUgdmFsdWUgd2l0aCBjb2xvciBpbiBoZXggZm9ybWF0OgorCQkgKiAgICAgICAgICBvb2JiZ2diYiAgCisJCSAqICAgICAgICAgICAgMDAgT3BhY2l0eSAoMDAgdG8gZmYpCisJCSAqICAgICAgICAgICAgYmIgQmx1ZSAoMDAgdG8gZmYpCisJCSAqICAgICAgICAgICAgZ2cgZ3JlZW4gKDAwIHRvIGZmKQorCQkgKiAgICAgICAgICAgIHJyIHJlZCAgKDAwIHRvIGZmKQorCQkgKi8gCisJCWludCBvbyA9IDA7CisJCWludCBibHVlID0gMDsKKwkJaW50IHJlZCA9IDA7CisJCWludCBncmVlbiA9IDA7CisJCS8qKgorCQkgKiBVc2Ugb3VyIHByZWZlcmVuY2UgdG8gb3V0bGluZSB0aGUgYm9yZGVycworCQkgKi8gCisJCWJvb2xlYW4gb3V0bGluZSA9IEdFUHJlZmVyZW5jZVBhZ2UuaXNTaG93Qm9yZGVyKCk7CQkJCQorCQkKKwkJaWYgKGs9PTApIHsKKwkJCS8vIFN0eWxlMCBkb2VzIG5vdCBzaG93IHRoZSBwb2x5Z29uCQkJCisJCQlzdHlsZXNbMF0uc2V0UG9seVN0eWxlKCIwIiwgb3V0bGluZSk7CisJCX0gZWxzZSB7CisJCQlibHVlID0gYXNwZWN0LmdldEJsdWUoayk7CisJCQlyZWQgPSBhc3BlY3QuZ2V0UmVkKGspOworCQkJZ3JlZW4gPSBhc3BlY3QuZ2V0R3JlZW4oayk7CisJCQlvbyA9IGFzcGVjdC5nZXRPcGFjaXR5KGspOworCQkJCisJCQlTdHJpbmcgaGV4ID0gU3RlbUttbC5nZXRIZXgob28pKworCQkJICAgICAgICAgICAgIFN0ZW1LbWwuZ2V0SGV4KGJsdWUpKworCQkJICAgICAgICAgICAgIFN0ZW1LbWwuZ2V0SGV4KGdyZWVuKSsKKwkJCSAgICAgICAgICAgICBTdGVtS21sLmdldEhleChyZWQpOworCQkJc3R5bGVzW2tdLnNldFBvbHlTdHlsZShoZXgsb3V0bGluZSk7CisJCX0KKwl9CisJcmV0dXJuIHN0eWxlczsKKyAgfQorICAKKyAgCisgIC8qKgorICAgKiBTZWxlY3QgdGhlIGNvbG9yIHRvIGJlIHVzZWQgYnkgdGhlIEdvb2dsZUVhcnRoIFBvbHlnb24KKyAgICogYmFzZWQgb24gdGhlIHJlbGF0aXZlIHZhbHVlIGZvciB0aGUgcHJvcGVydHkKKyAgICogCisgICAqIEBwYXJhbSBhc3BlY3QgIGVudW0gdmFsdWUgc3BlY2lmaW5nIHdoaWNoIHR5cGUgb2YKKyAgICogICAgICAgICAgICAgICAgZGlzcGxheSBpcyBzaG93biAocG9wdWxhdGlvbiwgc3VzY2VwdGlibGUsIAorICAgKiAgICAgICAgICAgICAgICBleHBvc2VkLGluZmVjdGlvdXMscmVjb3ZlcmVkKQorICAgKiBAcGFyYW0gZ2VEYXRhCisgICAqIAorICAgKiBAcmV0dXJuICB2YWx1ZSAwIHRvIE1BWCB0aGF0IGRldGVybWluZXMgd2hpY2ggZ3JvdXBpbmcKKyAgICogICBvZiBwb2x5Z29ucyB0aGlzIGFyZWEgd2lsbCBiZSBkaXNwbGF5ZWQgd2l0aC4KKyAgICovCisgIAorICBwdWJsaWMgaW50IHNlbGVjdEJ5VmFsdWUoQXNwZWN0IGFzcGVjdCwgR0VEYXRhIGdlRGF0YSkgeworIAorICAJaW50IHR5cGUgPSAwOworCisgIAl0cnkgeworICAJCVN0cmluZyBjb2RlID0gYXNwZWN0LmdldENvZGUoKTsKKyAgCQlBc3NlcnQuaXNOb3ROdWxsKGNvZGUsICJBc3BlY3QgY29kZSBpcyBudWxsIik7CisgIAkJaWYgKGNvZGUgPT0gbnVsbCkKKyAgCQkJcmV0dXJuIDA7CisgIAkJTWFwPFN0cmluZyxEb3VibGU+IG1hcCA9IGdlRGF0YS5nZXRWYWx1ZU1hcCgpOworICAJCUFzc2VydC5pc05vdE51bGwobWFwLCAiQXNwZWN0IG1hcCBpcyBudWxsIik7ICAJCQkJCQorICAJCWRvdWJsZSB2YWx1ZSA9IDAuMDsKKyAgCQlpZiAobWFwICE9IG51bGwpIHsKKyAgCQkJRG91YmxlIGQgPSBtYXAuZ2V0KGNvZGUpOworICAJCQlpZiAoZCAhPSBudWxsKQorICAJCQkgICAgdmFsdWUgPSBkOworICAJCX0gZWxzZSB7IAorICAJCQlyZXR1cm4gMDsKKyAgCQl9CisgIAkJCisgIAkJZG91YmxlW10gcmFuZ2UgPSBhc3BlY3QuZ2V0UmFuZ2UoKTsJCisgIAkJZm9yIChpbnQgaT0wOyBpPHJhbmdlLmxlbmd0aDsgaSsrKSB7CisgIAkJCWlmICh2YWx1ZSA8PSByYW5nZVtpXSkgeworICAJCQkJdHlwZSA9IGk7CisgIAkJCQlicmVhazsKKyAgCQkJfQorICAJCX0KKyAgCQkKKyAgCQkKKyAgCQkKKyAgCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZTEpIHsKKworICAJCUdFTG9nLmVycm9yKCJzZWxlY3RCeVZhbHVlIixlMSk7CisgIAl9CisgIAlyZXR1cm4gdHlwZTsgIAorICB9CisgIAorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9rbWwvS21sRGlzcGxheUN1c3RvbS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9rbWwvS21sRGlzcGxheUN1c3RvbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MjYyNmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9LbWxEaXNwbGF5Q3VzdG9tLmphdmEKQEAgLTAsMCArMSwzMDAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5rbWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuQXNwZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuR0VEYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuR0VMb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS52aWV3cy5HRVByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEN1c3RvbSBkaXNwbGF5IE9GIFNFSVIgYXNwZWN0cy4gCisgKiAgIAorICovCitwdWJsaWMgY2xhc3MgS21sRGlzcGxheUN1c3RvbSBpbXBsZW1lbnRzIElLbWxEaXNwbGF5ICAgeworCisJCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBLTUwgY29udHJvbCBmaWxlIHRvIGRpc3BsYXkgYWxsIG9mIHRoZSAKKyAgICAgKiBwb2x5Z29uIChjb3VudHkpIGFyZWFzCisgICAgICoKKyAgICAgKiBXZSB3aWxsIGhhdmUgTiBQbGFjZU1hcmtzLCBlYWNoIG9mIHdoaWNoIHdpbGwgCisgICAgICogYmUgYXNzb2NpYXRlZCB3aXRoIGEgZGlmZmVybnQgU3R5bGUgKGZvciBjb2xvcikgCisgICAgICogVGhlIHBvbHlnb25zIHdpbGwgYmUgcGxhY2VkIGluIGEgcGxhY2VtYXJrIGJhc2VkCisgICAgICogb24gdGhlIGNvbG9yIHNlbGVjdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udHJvbEZpbGVOYW1lIEZpbGUgd2hlcmUgS01MIHdpbGwgYmUgd3JpdHRlbiAKKyAgICAgKiBAcGFyYW0gZ2VEYXRhIE1hcCBvZiBHRURhdGEgb2JqZWN0cyAKKyAgICAgKiBAcGFyYW0gYXNwZWN0ICB3aGljaCB0eXBlIG9mIG1hcCAocG9wdWxhdGlvbixzdXNjZXB0aXBsZS4uLgorICAgICAqIAorICAgICAqLworICAgIAorCXB1YmxpYyB2b2lkIGdlbmVyYXRlUG9seWdvbnMoU3RyaW5nIGNvbnRyb2xGaWxlTmFtZSwgCisJCQlNYXA8U3RyaW5nLEdFRGF0YT4gZ2VEYXRhLCBBc3BlY3QgYXNwZWN0KSB7CisgICAgICAgIAorCQlHRUxvZy5kZWJ1Zyh0aGlzLCJnZW5lcmF0ZVBvbHlnb25zOiBhc3BlY3Q9IisKKwkJCQlhc3BlY3QgKyIgbnVtYmVyPSIrZ2VEYXRhLnNpemUoKSk7CisJCQorCQlLbWxEb2Mga21sID0gbmV3IEttbERvYygpOworCQlEb2N1bWVudCBkb2MgPSBrbWwuZ2V0RG9jdW1lbnQoKTsKKwkJRWxlbWVudCByb290ID0ga21sLnNldFJvb3QobnVsbCk7CisJCUVsZW1lbnQgZG9jdW1lbnQgPSBrbWwuYXBwZW5kRWxlbWVudChyb290LCJEb2N1bWVudCIpOworCQlTdHlsZVtdIHN0eWxlcyA9IHNldHVwU3R5bGVzKGttbCxkb2N1bWVudCxhc3BlY3QpOworCQlpbnQgbWF4ID0gc3R5bGVzLmxlbmd0aDsKKwkJCisJCS8vU2V0dXAgdGhlIHBsYWNlbWFya3MgZm9yIHBvbHlnb25zIHdpdGggc2FtZSBhdHRyaWJ1dGUKKwkJUGxhY2VNYXJrW10gcGxhY2VNYXJrID0gbmV3IFBsYWNlTWFya1ttYXhdOworCQlFbGVtZW50W10gbXVsdGlHZW9tZXRyeSA9IG5ldyBFbGVtZW50W21heF07CisJCWZvciAoaW50IGo9MDtqPG1heDtqKyspIHsKKwkJCXBsYWNlTWFya1tqXSA9IG5ldyBQbGFjZU1hcmsoZG9jKTsKKwkJCWRvY3VtZW50LmFwcGVuZENoaWxkKHBsYWNlTWFya1tqXS5nZXRFbGVtZW50KCkpOworCQkJcGxhY2VNYXJrW2pdLnNldERlc2NyaXB0aW9uKCJTVEVNIG1hcCIpOworCisJCQlwbGFjZU1hcmtbal0uc2V0TmFtZSgiU1RFTSIraik7CisJCQlwbGFjZU1hcmtbal0uc2V0U3R5bGVVcmwoc3R5bGVzW2pdKTsgICAKKwkJCW11bHRpR2VvbWV0cnlbal0gPSBkb2MuY3JlYXRlRWxlbWVudCgiTXVsdGlHZW9tZXRyeSIpOworCQkJcGxhY2VNYXJrW2pdLmFwcGVuZENoaWxkKG11bHRpR2VvbWV0cnlbal0pOworCQl9IAorCQkKKwkJLy8gbm93IHdlIGdlbmVyYXRlIGEgcG9seWdvbiBmb3IgZWFjaCBjb3VudHkKKy8vCQlpbnQgZGVidWdjb3VudGVyID0wOworCQlJdGVyYXRvciBpdCA9IGdlRGF0YS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJCXdoaWxlKGl0Lmhhc05leHQoKSkgeworCQkJaW50IHR5cGUgPSAwOworCQkJTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKKwkJCUdFRGF0YSBkYXRhID0gKEdFRGF0YSllLmdldFZhbHVlKCk7CisJCQlTdHJpbmcgY291bnR5ID0gZGF0YS5nZXROYW1lKCk7CQorLy8JCQkgY2hlY2sgaWYgd2UgYXJlIGZpbHRlcmluZyBvdXQgc29tZSBhcmVhcworCQkJaWYgKGZpbHRlcihkYXRhKSkgIHsKKwkJCQl0eXBlID0gMDsJCisJCQl9IGVsc2UgeworCQkJCXR5cGUgPSBzZWxlY3RCeVZhbHVlKGRhdGEpOworCQkJfQorCisJCQkvLyBpZ25vcmUgcmV0dXJuIHR5cGUgLTEKKyAgICAgICAgICAgIAorCQkJaWYgKHR5cGUgPj0wKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmdldE51bUFyZWFzKCk7IGkrKykgeworCQkJCQlTdHJpbmcgY29vcmQgPSBkYXRhLmdldENvb3JkaW5hdGVzQXNTdHJpbmcoaSk7CisJCQkJCQorCQkJCQlQb2x5Z29uIHBvbHlnb24gPSBuZXcgUG9seWdvbihkb2MpOworCQkJCQlrbWwuYXBwZW5kVGV4dChwb2x5Z29uLmdldEVsZW1lbnQoKSwgIm5hbWUiLCBjb3VudHkpOworCQkJCQlwb2x5Z29uLnNldENvb3JkaW5hdGVzKGNvb3JkKTsKKwkJCQkJbXVsdGlHZW9tZXRyeVt0eXBlXS5hcHBlbmRDaGlsZChwb2x5Z29uLmdldEVsZW1lbnQoKSk7CisJCQkJfQorCQkJfQorCisJCX0KKworCQkvL0dFTG9nLmRlYnVnKHRoaXMsInN0YXJ0IHdyaXRlIG9mICIrY29udHJvbEZpbGVOYW1lKTsKKwkJa21sLndyaXRlRmlsZShjb250cm9sRmlsZU5hbWUpOworCQkvL0dFTG9nLmRlYnVnKHRoaXMsImVuZCB3cml0ZSBvZiAiK2NvbnRyb2xGaWxlTmFtZSk7IAorCQlyZXR1cm47CisJfQorCQorCS8qKgorCSAqIGNoZWNrIGlmIHRoaXMgZW50cnkgc2hvdWxkIGJlIGZpbHRlcmVkIG91dCAKKwkgKiAKKwkgKiBAcGFyYW0gZGF0YSAgSW5zdGFuY2UgdGhhdCBjb250YWlucyBpbmZvIGZvciB0aGlzIGFkbWluIGFyZWEKKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgaXQgc2hvdWxkIGJlIGZpbHRlcmVkIG91dC4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gZmlsdGVyKEdFRGF0YSBkYXRhKSB7CisJCWJvb2xlYW4gZmlsdGVyZWQgPSBmYWxzZTsKKwkJaWYgKEdFUHJlZmVyZW5jZVBhZ2UuaXNUZXN0KCkpIHsJCQkKKwkJCVN0cmluZyBjb3VudHkgPSBkYXRhLmdldE5hbWUoKTsJCisJCQlpZiAoY291bnR5LmluZGV4T2YoIiBVUy0iKT49IDAgKSB7CQkJCQkKKwkJCQlmaWx0ZXJlZCA9IGZhbHNlOworCQkJCisJCQl9IGVsc2UgaWYgKGNvdW50eS5pbmRleE9mKCIgTUVYIik+PSAwICkgewkJCQkJCisJCQkJZmlsdGVyZWQgPSBmYWxzZTsKKwkJCX0gZWxzZSB7CisJCQkJZmlsdGVyZWQgPSB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmaWx0ZXJlZDsKKwl9CisKKy8vCTxTdHlsZSBpZD0iU3R5bGUxIj4KKy8vCSAgPExpbmVTdHlsZT4KKy8vCSAgICAgPHdpZHRoPjAuMzwvd2lkdGg+CisvLwkgIDwvTGluZVN0eWxlPgorLy8JICA8UG9seVN0eWxlPgorLy8JICAgIDxvdXRsaW5lPjA8L291dGxpbmU+CisvLwkgICAgPGZpbGw+MTwvZmlsbD4KKy8vCSAgICA8Y29sb3I+ODAwMDAwZjA8L2NvbG9yPgorLy8JICA8L1BvbHlTdHlsZT4KKy8vCTwvU3R5bGU+CisgIC8qKgorICAgKiBCdWlsZCB0aGUgU3R5bGUgc3RhdGVtZW50cyB0aGF0IHdpbGwgYmUgcmVmZXJlZGVkIHRvIAorICAgKiBieSB0aGUgcG9seWdvbnMgbGlzdGVkIGxhdGVyLiAgCisgICAqIAorICAgKiBAcGFyYW0ga21sCisgICAqIEBwYXJhbSBkb2N1bWVudAorICAgKiBAcGFyYW0gYXNwZWN0CisgICAqIEByZXR1cm4gU3R5bGVbXSBhcnJheSBvZiBLTUwgU3R5bGUgaW5zdGFuY2VzCisgICAqLworICBwcml2YXRlIFN0eWxlW10gc2V0dXBTdHlsZXMoS21sRG9jIGttbCxFbGVtZW50IGRvY3VtZW50LCBBc3BlY3QgYXNwZWN0KSB7CisJRG9jdW1lbnQgZG9jID0ga21sLmdldERvY3VtZW50KCk7CQorCS8qKgorCSAqIERvIG5vdCBvdXRsaW5lIHRoZSBib3JkZXJzCisJICovIAkJCisJYm9vbGVhbiBvdXRsaW5lID0gZmFsc2U7CisJaW50IG1heCA9IDk7CisJLy8gZGVmaW5lIHRoZSBTdHlsZSBzZWN0aW9ucworCVN0eWxlW10gc3R5bGVzID0gbmV3IFN0eWxlW21heF07CisJZm9yIChpbnQgaz0wO2s8bWF4O2srKykgeyAKKwkJc3R5bGVzW2tdID0gbmV3IFN0eWxlKGRvYywiU3R5bGUiK2spOworCQlzdHlsZXNba10uc2V0TGluZVN0eWxlKDAuMyk7CisJCWRvY3VtZW50LmFwcGVuZENoaWxkKHN0eWxlc1trXS5nZXRFbGVtZW50KCkpOworCQkvKiBzZXQgdGhlIFBvbHlTdHlsZSB2YWx1ZSB3aXRoIGNvbG9yIGluIGhleCBmb3JtYXQ6CisJCSAqICAgICAgICAgIG9vYmJnZ2JiICAKKwkJICogICAgICAgICAgICAwMCBPcGFjaXR5ICgwMCB0byBmZikKKwkJICogICAgICAgICAgICBiYiBCbHVlICgwMCB0byBmZikKKwkJICogICAgICAgICAgICBnZyBncmVlbiAoMDAgdG8gZmYpCisJCSAqICAgICAgICAgICAgcnIgcmVkICAoMDAgdG8gZmYpCisJCSAqLyAKKwkJaW50IG9vID0gMTYwOworCQlpbnQgYmx1ZSA9IDA7CisJCWludCByZWQgPSAwOworCQlpbnQgZ3JlZW4gPSAwOwkJCisJCQorCQlzd2l0Y2ggKGspIHsKKwkJY2FzZSAwOiAgLy9yZWQKKwkJCXJlZCA9IDB4ZjA7CisJCQlicmVhazsKKwkJY2FzZSAxOiAgLy8gb3JhbmdlCisJCQlyZWQgPSAweGYwOworCQkJZ3JlZW4gPSAweGEwOworCQkJYnJlYWs7CQorCQljYXNlIDI6ICAgLy8gbHQgZ3JlZW4KKwkJCXJlZCA9IDB4ZDA7CisJCQlncmVlbiA9IDB4ZjA7CisJCQlicmVhazsKKwkJY2FzZSAzOiAgLy9vcmFuZ2UKKwkJCXJlZCA9IDB4ZDA7CisJCQlncmVlbiA9IDB4YjA7CisJCQlicmVhazsKKwkJY2FzZSA0OiAgLy8gbHQgZ3JlZW4KKwkJCXJlZCA9IDB4YjA7CisJCQlncmVlbiA9IDB4ZjA7CisJCQlicmVhazsKKwkJY2FzZSA1OiAgIC8vb3JhbmdlCisJCQlyZWQgPSAweGYwOworCQkJZ3JlZW4gPSAweGMwOworCQkJYnJlYWs7CisJCWNhc2UgNjogIC8vIGx0IGdyZWVuCisJCQlyZWQgPSAweGMwOworCQkJZ3JlZW4gPSAweGYwOworCQkJYnJlYWs7CisJCWNhc2UgNzogIC8vIHllbGxvdworCQkJcmVkID0gMHhmMDsKKwkJCWdyZWVuID0gMHhmMDsKKwkJCWJyZWFrOworCQljYXNlIDg6IC8vIGdyZWVuCisJCQlyZWQgPSAweDAwOworCQkJZ3JlZW4gPSAweGYwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQkJCisJCVN0cmluZyBoZXggPSBTdGVtS21sLmdldEhleChvbykrCisJCQkgICAgICAgICAgICAgU3RlbUttbC5nZXRIZXgoYmx1ZSkrCisJCQkgICAgICAgICAgICAgU3RlbUttbC5nZXRIZXgoZ3JlZW4pKworCQkJICAgICAgICAgICAgIFN0ZW1LbWwuZ2V0SGV4KHJlZCk7CisJCXN0eWxlc1trXS5zZXRQb2x5U3R5bGUoaGV4LG91dGxpbmUpOworCQkKKwl9CisJcmV0dXJuIHN0eWxlczsKKyAgfQorICAKKyAgCisgIC8qKgorICAgKiBTZWxlY3QgdGhlIGNvbG9yIHRvIGJlIHVzZWQgYnkgdGhlIEdvb2dsZUVhcnRoIFBvbHlnb24KKyAgICogYmFzZWQgb24gdGhlIHJlbGF0aXZlIHZhbHVlIGZvciB0aGUgcHJvcGVydHkKKyAgICogPHByZT4KKyAgICogIFMgICAgRSAgICBJICAgICBSICAgUmVkIEdyZWVuIEJsdWUgICBUeXBlIAorICAgKiAgIDEgICAwICAgIDAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgLTEKKyAgICogICAtICAgLSAgID4uOCAgICAtICAgIEYwICAgMDAgICAgICAgICAgICAwCisgICAqICAgLSAgPlIgICA+LjYgICAgLSAgICBGMCAgIEEwICAgICAgICAgICAgMQorICAgKiAgIC0gICAtICAgPi42ICAgPkkgICAgRDAgICBGMCAgICAgICAgICAgIDIgCisgICAqICAgLSAgPlIgICA+LjQgICAgLSAgICBEMCAgIEIwICAgICAgICAgICAgMworICAgKiAgIC0gICAwICAgPi40ICAgPkkgICAgQjAgICBGMCAgICAgICAgICAgIDQKKyAgICogICAtICA+UiAgID4uMiAgICAtICAgIEYwICAgQzAgICAgICAgICAgICA1CisgICAqICAgLSAgIC0gICA+LjIgICA+SSAgICBDMCAgIEYwICAgICAgICAgICAgNgorICAgKiAgIC0gID5SICAgPC4yICAgIC0gICAgRjAgICBGMCAgICAgICAgICAgIDcKKyAgICogICAtICAgLSAgIDwuMiAgID5JICAgIDAwICAgRjAgICAgICAgICAgICA4CisgICAqICAgICAgICAgCisgICAqIDwvcHJlPgorICAgKiAKKyAgICogQHBhcmFtIGdlRGF0YSBJbnN0YW5jZSB0aGF0IGhvZHMgaW5mbyBhYm91dCBhcmVhIGluY2x1ZGluZyAKKyAgICogICAgICAgICAgICAgICB0aGUgbGF0ZXN0IGRpc2Vhc2Ugc3RhdGUuCisgICAqIAorICAgKiBAcmV0dXJuICB2YWx1ZSAwIHRvIE1BWCB0aGF0IGRldGVybWluZXMgd2hpY2ggZ3JvdXBpbmcKKyAgICogICBvZiBwb2x5Z29ucyB0aGlzIGFyZWEgd2lsbCBiZSBkaXNwbGF5ZWQgd2l0aC4KKyAgICogICAtMSB3aWxsIGluZGljYXRlIG5vdCB0byBkaXNwbGF5IHRoZSBwb2x5Z29uCisgICAqLworICAKKyAgICBwdWJsaWMgaW50IHNlbGVjdEJ5VmFsdWUoR0VEYXRhIGdlRGF0YSkgeworCisJCWludCB0eXBlID0gMDsKKworCQlkb3VibGUgcyA9IGdlRGF0YS5nZXRWYWx1ZU1hcCgpLmdldCgiUyIpOworCQlkb3VibGUgZSA9IGdlRGF0YS5nZXRWYWx1ZU1hcCgpLmdldCgiRSIpOworCQlkb3VibGUgaSA9IGdlRGF0YS5nZXRWYWx1ZU1hcCgpLmdldCgiSSIpOworCQlkb3VibGUgciA9IGdlRGF0YS5nZXRWYWx1ZU1hcCgpLmdldCgiUiIpOworCisJCWlmIChzID09IDEuMCAmJiBlID09IDAuMCAmJiBpID09IDAuMCAmJiByID09IDAuMCkgeworCQkJdHlwZSA9IC0xOyAvLyB1bmluaXRpYWxpemVkCisJCX0gZWxzZSBpZiAoaSA+PSAwLjIpIHsKKwkJCXR5cGUgPSAwOyAvLyByZWQKKwkJfSBlbHNlIGlmIChpID49IDAuMSApIHsKKwkJCWlmICggZSA+PSByKSB7CisJCQkJdHlwZSA9IDE7ICAvLyBvcmFuZ2UKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHIgPiAwLjkpCisJCQkJICAgIHR5cGUgPSA4OyAgLy8gbHQgZ3JlZW4KKwkJCQllbHNlIAorCQkJCQl0eXBlID0gMDsgIC8vIHJlZAorCQkJfQorLy8JCX0gZWxzZSBpZiAoaSA+PSAwLjQgKSB7CisvLwkJCWlmICggZSA+PSByKSB7CisvLwkJCQl0eXBlID0gMzsgIC8vICByZWQgZ3JlZW4gIAorLy8JCQl9IGVsc2UgeworLy8JCQkJdHlwZSA9IDQ7ICAvLyBncmVlbiByZWQKKy8vCQkJfQorCQl9IGVsc2UgaWYgKGkgPiAwLjAxICkgeworCQkJaWYgKCBlID49IHIpIHsKKwkJCQl0eXBlID0gMTsgIC8vIG9yYW5nZQorCQkJfSBlbHNlIHsKKwkJCQl0eXBlID0gODsgIC8vIGdyZWVuIHJlZAorCQkJfQorCQl9IGVsc2UgaWYgKGUgPj0gcikgewkJCQorCQkJdHlwZSA9IDc7IC8vICAgLy8geWVsbG93CisJCX0gZWxzZSB7CisJCQl0eXBlID0gODsgICAgICAvLyBncmVlbgorCQkJCisJCX0KKwkJaWYgKGdlRGF0YS5nZXROYW1lKCkuY29udGFpbnMoIiAyNTAxNyIpKSB7CisJCQlHRUxvZy5kZWJ1Zyh0aGlzLCBnZURhdGEuZ2V0TmFtZSgpICsgIiAiCisJCQkJCSsgZ2VEYXRhLmdldFZhbHVlc0FzU3RyaW5nKCkgKyAiICIgKyB0eXBlKTsKKwkJfQorCQlyZXR1cm4gdHlwZTsKKwl9CisgIAorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9rbWwvS21sRGlzcGxheVNlbGVjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9rbWwvS21sRGlzcGxheVNlbGVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYmMwM2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9LbWxEaXNwbGF5U2VsZWN0aW9uLmphdmEKQEAgLTAsMCArMSwyNDQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5rbWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5Bc3BlY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5HRURhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5HRUxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnZpZXdzLkdFUHJlZmVyZW5jZVBhZ2U7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRGlzcGxheSB0aGUgcG9seWdvbiBhbmQgcGxhY2VtYXJrIGFzIHRoZSByZXN1bHQgb2YgYSAKKyAqIFNlbGVjdGlvbiBldmVudCBmcm9tIGEgTWFwVmlldyBtb3VzZSBjbGljay4gCisgKgorICovCitwdWJsaWMgY2xhc3MgS21sRGlzcGxheVNlbGVjdGlvbiBpbXBsZW1lbnRzIElLbWxEaXNwbGF5ICAgeworCisJLyoqCisgICAgICogaW5pdGlhbGl6YXRpb24KKyAgICAgKiAKKyAgICAgKiBjdXJyZW50bHkgd2UgaGF2ZSBub3RoaW5nIHRvIGRvCisgICAgICogCisgICAgICogCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICAJICAgICAgICAKKyAgICB9CisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBLTUwgY29udHJvbCBmaWxlIHRvIGRpc3BsYXkgYQorICAgICAqIHNlbGVjdGVkIGFkbWluIGFyZWEgYW5kIHBsYWNlbWFyayBpY29uLgorICAgICAqIFRoZSBHRURhdGEgb2JqZWN0cyBpbiB0aGUgTWFwIHRoYXQgaXMgcGFzc2VkIAorICAgICAqIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcG9seWdvbiBhbmQgCisgICAgICogdGhlIHBvaW50cyB3aGVyZSB0aGUgcGxhY2VtYXJrIGljb25zIGFyZSB0byBiZSAKKyAgICAgKiBwbGFjZWQuCisgICAgICogICAgICAqIAorICAgICAqIEBwYXJhbSBjb250cm9sRmlsZU5hbWUgRmlsZSB3aGVyZSBLTUwgd2lsbCBiZSB3cml0dGVuIAorICAgICAqIEBwYXJhbSBnZURhdGEgTWFwIG9mIEdFRGF0YSBvYmplY3RzIAorICAgICAqIAorICAgICAqLworICAgIAorCXB1YmxpYyB2b2lkIGdlbmVyYXRlUG9seWdvbnMoU3RyaW5nIGNvbnRyb2xGaWxlTmFtZSwKKwkJCU1hcDxTdHJpbmcsIEdFRGF0YT4gZ2VEYXRhLCBBc3BlY3QgdW51c2VkKSB7CisJCQorCQlHRUxvZy5kZWJ1Zyh0aGlzLCAiZmlsZT0iICsgY29udHJvbEZpbGVOYW1lICsgIiBudW1iZXI9IgorCQkJCSsgZ2VEYXRhLnNpemUoKSk7CisKKwkJS21sRG9jIGttbCA9IG5ldyBLbWxEb2MoKTsKKwkJRG9jdW1lbnQgZG9jID0ga21sLmdldERvY3VtZW50KCk7CisJCUVsZW1lbnQgcm9vdCA9IGttbC5zZXRSb290KG51bGwpOworCQlFbGVtZW50IGRvY3VtZW50ID0ga21sLmFwcGVuZEVsZW1lbnQocm9vdCwgIkRvY3VtZW50Iik7CisJCQorCQkvLyBnZW5lcmF0ZSB0aGUgS01MIFN0eWxlIGluZm8gdGhhdCB3aWxsIGJlIHVzZWQgYnkgCisJCS8vIHRoZSBmb2xsb3dpZyBwbGFjZW1hcmtzCisJCVN0eWxlIHN0eWxlcyA9IHNldHVwU3R5bGVzKGttbCwgZG9jdW1lbnQpOworCQkKKwkJCisgICAgICAgIC8vIFRoZXJlIGlzIG5vcm1hbGx5IG9ubHkgb25lIGVudHJ5IGluIGdlRGF0YQorCQkvLyBidXQgaGFuZGxlIG1vcmUKKwkJCisJCUl0ZXJhdG9yIGl0ID0gZ2VEYXRhLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQlNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKKwkJCUdFRGF0YSBkYXRhID0gKEdFRGF0YSkgZS5nZXRWYWx1ZSgpOworCQkJLy8gZ2VuZXJhdGUgcGxhY21hcmsgZm9yIHBvaW50CisJCQlQbGFjZU1hcmsgcGxhY2VNYXJrID0gbmV3IFBsYWNlTWFyayhkb2MpOworCQkJCisJCQlwbGFjZU1hcmsuc2V0RGVzY3JpcHRpb24oZGF0YS5nZXREZXNjcmlwdGlvbigpKTsKKworCQkJcGxhY2VNYXJrLnNldE5hbWUoZGF0YS5nZXROYW1lKCkpOworCQkKKwkJCXBsYWNlTWFyay5zZXRTdHlsZVVybChzdHlsZXMpOworCQkJUG9pbnQgcG9pbnQgPSBuZXcgUG9pbnQoZG9jKTsKKwkJCWRvdWJsZVtdIHB0cyA9IGRhdGEuZ2V0UG9pbnQoKTsKKwkJCXBvaW50LnNldENvb3JkaW5hdGVzKHB0c1swXSxwdHNbMV0pOworCQkJcGxhY2VNYXJrLmFwcGVuZENoaWxkKHBvaW50LmdldEVsZW1lbnQoKSk7CisJCQlkb2N1bWVudC5hcHBlbmRDaGlsZChwbGFjZU1hcmsuZ2V0RWxlbWVudCgpKTsKKwkJCS8vIFNldHVwIHRoZSBwbGFjZW1hcmtzIGZvciBwb2x5Z29uCQorCQkJcGxhY2VNYXJrID0gbmV3IFBsYWNlTWFyayhkb2MpOworCQkJRWxlbWVudCBtdWx0aUdlb21ldHJ5ID0gbnVsbDsKKwkJCXBsYWNlTWFyay5zZXREZXNjcmlwdGlvbigicG9seWdvbiBkZXNjcmlwdGlvbiIpOworCisJCQlwbGFjZU1hcmsuc2V0TmFtZShkYXRhLmdldE5hbWUoKSk7CisJCQorCQkJcGxhY2VNYXJrLnNldFN0eWxlVXJsKHN0eWxlcyk7CisJCQkKKwkJCWRvY3VtZW50LmFwcGVuZENoaWxkKHBsYWNlTWFyay5nZXRFbGVtZW50KCkpOworCQkJCisJCQltdWx0aUdlb21ldHJ5ID0gZG9jLmNyZWF0ZUVsZW1lbnQoIk11bHRpR2VvbWV0cnkiKTsKKwkJCXBsYWNlTWFyay5hcHBlbmRDaGlsZChtdWx0aUdlb21ldHJ5KTsKKworCQkJaW50IG4gPSBkYXRhLmdldE51bUFyZWFzKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworCisJCQkJU3RyaW5nIGNvb3JkID0gZGF0YS5nZXRDb29yZGluYXRlc0FzU3RyaW5nKGkpOworCQkJCVN0cmluZyBjb3VudHkgPSBkYXRhLmdldE5hbWUoKTsKKwkJCQkvLyBpZiAoaSA+IDApCisJCQkJR0VMb2cuZGVidWcodGhpcyxpKyI6ICIrY291bnR5KyIgIitjb29yZCk7CisJCQkJUG9seWdvbiBwb2x5Z29uID0gbmV3IFBvbHlnb24oZG9jKTsKKwkJCQlrbWwuYXBwZW5kVGV4dChwb2x5Z29uLmdldEVsZW1lbnQoKSwgIm5hbWUiLGNvdW50eSApOworCQkJCXBvbHlnb24uc2V0Q29vcmRpbmF0ZXMoY29vcmQpOworCQkJCW11bHRpR2VvbWV0cnkuYXBwZW5kQ2hpbGQocG9seWdvbi5nZXRFbGVtZW50KCkpOworCQkJfQorCQkJCisJCX0KKworCQlrbWwud3JpdGVGaWxlKGNvbnRyb2xGaWxlTmFtZSk7CisJCS8vIEdFTG9nLmRlYnVnKHRoaXMsImVuZCB3cml0ZSBvZiAiK2NvbnRyb2xGaWxlTmFtZSk7CisJCWttbC5kaXNwbGF5KCk7CisJCXJldHVybjsKKwl9CisKKwkKKwkKKwkKKy8vCTxTdHlsZSBpZD0iU3R5bGUiPgorLy8JICA8TGluZVN0eWxlPgorLy8JICAgICA8d2lkdGg+MC4zPC93aWR0aD4KKy8vCSAgPC9MaW5lU3R5bGU+CisvLwkgIDxQb2x5U3R5bGU+CisvLwkgICAgPG91dGxpbmU+MDwvb3V0bGluZT4KKy8vCSAgICA8ZmlsbD4xPC9maWxsPgorLy8JICAgIDxjb2xvcj44MDAwMDBmMDwvY29sb3I+CisvLwkgIDwvUG9seVN0eWxlPgorLy8JCisvLyAgICA8QmFsbG9vblN0eWxlPiAgICAgIAorLy8gICAgICA8YmdDb2xvcj5mZmZmZmZiYjwvYmdDb2xvcj4gICAgICAKKy8vICAgICAgPHRleHQ+PCFbQ0RBVEFbCisvLyAgICAgIDxiPjxmb250IGNvbG9yPSIjQ0MwMDAwIiBzaXplPSIrMyI+JFtuYW1lXTwvZm9udD48L2I+CisvLyAgICAgIDxici8+PGJyLz4KKy8vICAgICAgPGZvbnQgZmFjZT0iQ291cmllciI+JFtkZXNjcmlwdGlvbl08L2ZvbnQ+CisvLyAgICAgIDxici8+PGJyLz4gICAgCisvLyAgICAgIF1dPjwvdGV4dD4KKy8vICAgIDwvQmFsbG9vblN0eWxlPgorLy8gIDwvU3R5bGU+CisgIC8qKgorICAgKiBCdWlsZCB0aGUgU3R5bGUgc3RhdGVtZW50cyB0aGF0IHdpbGwgYmUgcmVmZXJlZGVkIHRvIAorICAgKiBieSB0aGUgcG9seWdvbnMgbGlzdGVkIGxhdGVyLiAgCisgICAqIAorICAgKiBAcGFyYW0ga21sCisgICAqIEBwYXJhbSBkb2N1bWVudAorICAgKiAKKyAgICogQHJldHVybiBTdHlsZSAgS01MIFN0eWxlIGluc3RhbmNlcworICAgKi8KKwlwcml2YXRlIFN0eWxlIHNldHVwU3R5bGVzKEttbERvYyBrbWwsRWxlbWVudCBkb2N1bWVudCkgeworCQlEb2N1bWVudCBkb2MgPSBrbWwuZ2V0RG9jdW1lbnQoKTsJCisKKwkJU3R5bGUgc3R5bGVzID0gbmV3IFN0eWxlKGRvYywiU3R5bGVTZWxlY3QiKTsKKwkJc3R5bGVzLnNldExpbmVTdHlsZSgwLjMpOworCQlkb2N1bWVudC5hcHBlbmRDaGlsZChzdHlsZXMuZ2V0RWxlbWVudCgpKTsKKwkJLyogc2V0IHRoZSBQb2x5U3R5bGUgdmFsdWUgd2l0aCBjb2xvciBpbiBoZXggZm9ybWF0OgorCQkgKiAgICAgICAgICBvb2JiZ2diYiAgCisJCSAqICAgICAgICAgICAgMDAgT3BhY2l0eSAoMDAgdG8gZmYpCisJCSAqICAgICAgICAgICAgYmIgQmx1ZSAoMDAgdG8gZmYpCisJCSAqICAgICAgICAgICAgZ2cgZ3JlZW4gKDAwIHRvIGZmKQorCQkgKiAgICAgICAgICAgIHJyIHJlZCAgKDAwIHRvIGZmKQorCQkgKi8gCisJCWludCBvbyA9IDEyODsKKwkJaW50IGJsdWUgPSAxMjg7CisJCWludCByZWQgPSAwOworCQlpbnQgZ3JlZW4gPSAxMjg7CisJCS8qKgorCQkgKiBVc2Ugb3VyIHByZWZlcmVuY2UgdG8gb3V0bGluZSB0aGUgYm9yZGVycworCQkgKi8gCisJCWJvb2xlYW4gb3V0bGluZSA9IEdFUHJlZmVyZW5jZVBhZ2UuaXNTaG93Qm9yZGVyKCk7CQkJCQorCisKKwkJU3RyaW5nIGhleCA9IFN0ZW1LbWwuZ2V0SGV4KG9vKSsKKwkJU3RlbUttbC5nZXRIZXgoYmx1ZSkrCisJCVN0ZW1LbWwuZ2V0SGV4KGdyZWVuKSsKKwkJU3RlbUttbC5nZXRIZXgocmVkKTsKKwkJc3R5bGVzLnNldFBvbHlTdHlsZShoZXgsb3V0bGluZSk7CisgICAgICAgIAorCQlzdHlsZXMuc2V0QmFsbG9vblN0eWxlKCk7CisKKwkJcmV0dXJuIHN0eWxlczsKKwl9CisKKyAgCisgIC8qKgorICAgKiBTZWxlY3QgdGhlIGNvbG9yIHRvIGJlIHVzZWQgYnkgdGhlIEdvb2dsZUVhcnRoIFBvbHlnb24KKyAgICogYmFzZWQgb24gdGhlIHJlbGF0aXZlIHZhbHVlIGZvciB0aGUgcHJvcGVydHkKKyAgICogCisgICAqIEBwYXJhbSBhc3BlY3QgIGVudW0gdmFsdWUgc3BlY2lmaW5nIHdoaWNoIHR5cGUgb2YKKyAgICogICAgICAgICAgICAgICAgZGlzcGxheSBpcyBzaG93biAocG9wdWxhdGlvbiwgc3VzY2VwdGlibGUsIAorICAgKiAgICAgICAgICAgICAgICBleHBvc2VkLGluZmVjdGlvdXMscmVjb3ZlcmVkKQorICAgKiBAcGFyYW0gZ2VEYXRhCisgICAqIAorICAgKiBAcmV0dXJuICB2YWx1ZSAwIHRvIE1BWCB0aGF0IGRldGVybWluZXMgd2hpY2ggZ3JvdXBpbmcKKyAgICogICBvZiBwb2x5Z29ucyB0aGlzIGFyZWEgd2lsbCBiZSBkaXNwbGF5ZWQgd2l0aC4KKyAgICovCisgIAorICBwdWJsaWMgaW50IHNlbGVjdEJ5VmFsdWUoQXNwZWN0IGFzcGVjdCwgR0VEYXRhIGdlRGF0YSkgeworIAorICAJaW50IHR5cGUgPSAwOworCisgIAl0cnkgeworICAJCVN0cmluZyBjb2RlID0gYXNwZWN0LmdldENvZGUoKTsKKyAgCQlBc3NlcnQuaXNOb3ROdWxsKGNvZGUsICJBc3BlY3QgY29kZSBpcyBudWxsIik7CisgIAkJaWYgKGNvZGUgPT0gbnVsbCkKKyAgCQkJcmV0dXJuIDA7CisgIAkJTWFwPFN0cmluZyxEb3VibGU+IG1hcCA9IGdlRGF0YS5nZXRWYWx1ZU1hcCgpOworICAJCUFzc2VydC5pc05vdE51bGwobWFwLCAiQXNwZWN0IG1hcCBpcyBudWxsIik7ICAJCQkJCQorICAJCWRvdWJsZSB2YWx1ZSA9IDAuMDsKKyAgCQlpZiAobWFwICE9IG51bGwpIHsKKyAgCQkJRG91YmxlIGQgPSBtYXAuZ2V0KGNvZGUpOworICAJCQlpZiAoZCAhPSBudWxsKQorICAJCQkgICAgdmFsdWUgPSBkOworICAJCX0gZWxzZSB7IAorICAJCQlyZXR1cm4gMDsKKyAgCQl9CisgIAkJCisgIAkJZG91YmxlW10gcmFuZ2UgPSBhc3BlY3QuZ2V0UmFuZ2UoKTsJCisgIAkJZm9yIChpbnQgaT0wOyBpPHJhbmdlLmxlbmd0aDsgaSsrKSB7CisgIAkJCWlmICh2YWx1ZSA8PSByYW5nZVtpXSkgeworICAJCQkJdHlwZSA9IGk7CisgIAkJCQlicmVhazsKKyAgCQkJfQorICAJCX0KKyAgCQkKKyAgCQkKKyAgCQkKKyAgCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZTEpIHsKKworICAJCUdFTG9nLmVycm9yKCJzZWxlY3RCeVZhbHVlIixlMSk7CisgIAl9CisgIAlyZXR1cm4gdHlwZTsgIAorICB9CisgIAorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9rbWwvS21sRG9jLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9LbWxEb2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDM0NGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9rbWwvS21sRG9jLmphdmEKQEAgLTAsMCArMSw0NTUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5rbWw7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5HRUxvZzsKK2ltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5UZXh0OworCisKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHVzZWQgZm9yIEdvb2dsZSBFYXJ0aCBLTUwgc3VwcG9ydC4KKyAqIAorICogIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBidWlsZCBhIEtNTCBmaWxlIHRvIGJlIHBhc3NlZCB0bworICogIEdvb2dsZSBFYXJ0aC4gIAorICogIAorICogIEl0IGJhc2ljYWxseSBjcmVhdGVzIGFuIFhNTCBmaWxlIHVzaW5nIEtNTCByZWxhdGVkIGFyZ3VtZW50cy4KKyAqICAKKyAqICBTZWUgdGhlIGV4YW1wbGUgaW4gdGhlICJtYWluKCkiIG1ldGhvZCBmb3IgYW4gZXhhbXBsZSBvZiAKKyAqICBob3cgdG8gdXNlIHRoZSBjbGFzcy4KKyAqIAorICoKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBLbWxEb2MgeworCisgICAgCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIG5hbWUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX2NsYXNzTmFtZSA9ICJLbWxEb2MiOworCisgICAgCisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBBIEtNTCBkb2N1bWVudAorICAgICAqLworICAgIHByaXZhdGUgRG9jdW1lbnQgX2RvYzsKKyAgICAKKyAgICAvL3ByaXZhdGUgRWxlbWVudCBfcm9vdCA9IG51bGw7CisgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgS21sRG9jLgorICAgICAqIAorICAgICAqIFRoZSBEb2N1bWVudCBvYmplY3QgaXMgY3JlYXRlZCBidXQgbm90aGluZyBpcyBwdXQKKyAgICAgKiBpbnRvIGl0LgorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyBLbWxEb2MoKSB7CisgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gX2NsYXNzTmFtZSArICIuS21sVXRpbChjb25zdHJ1Y3RvcikgIjsKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHBhcnNlciB1c2luZyB0aGUgSkFYUCBBUEkgKGphdmF4LnhtbC5wYXJzZXIpCisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY0J1aWxkZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZG9jQnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgICAgICBpZiAoZG9jQnVpbGRlciAhPSBudWxsKQorICAgICAgICAgICAgICBfZG9jID0gZG9jQnVpbGRlci5uZXdEb2N1bWVudCgpOworICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSkgeworICAgICAgICAgICAgZGVidWcobWV0aG9kTmFtZSsgIiBFcnJvciBjb25maWd1cmluZyB4bWwgZG9jdW1lbnQgYnVpbGRlciIKKyAgICAgICAgICAgICAgICAgICAgKyBwY2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfS8vIHRyeQorCisgICAgICAgICAgICAgICAgCisKKyAgICB9IC8vIGNvbnN0cnVjdG9yCisKKyAgICAvKioKKyAgICAgKiBTZXR1cCB0aGUgcm9vdCBvZiB0aGUgS01MIGRvY3VtZW50LgorICAgICAqIAorICAgICAqIAorICAgICAqIEBwYXJhbSB4bWxucyBWYWx1ZSBmb3IgeG1sbnMgCisgICAgICogKGlmIG51bGwsICB1c2UgZGVmYXVsdCAiaHR0cDovL2VhcnRoLmdvb2dsZS5jb20va21sLzIuMCIpCisgICAgICogQHJldHVybiB4bWwgZWxlbWVudAorICAgICAqLworICAgIAorICAgIHB1YmxpYyBFbGVtZW50IHNldFJvb3QoU3RyaW5nIHhtbG5zKSB7CisgICAgICAgIC8vU3RyaW5nIG1ldGhvZE5hbWUgPSBfY2xhc3NOYW1lICsgIi5zZXRSb290ICI7CisgICAgICAgIGlmICh4bWxucyA9PSBudWxsKQorICAgICAgICAgIHhtbG5zPSJodHRwOi8vZWFydGguZ29vZ2xlLmNvbS9rbWwvMi4xIjsgICAgIAorICAgICAgICAKKyAgICAgICAgRWxlbWVudCByb290ID0gX2RvYy5jcmVhdGVFbGVtZW50KCJrbWwiKTsKKyAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGUoInhtbG5zIix4bWxucyk7CisgICAgICAgIF9kb2MuYXBwZW5kQ2hpbGQocm9vdCk7CisgICAgICAgIHJldHVybiByb290OworICAgIH0gLy8gCisKKyAgICAKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBXcml0ZSBhbiBYbWwgZG9jdW1lbnQgdG8gYW4gb3V0cHV0U3RyZWFtCisgICAgICogCisgICAgICoKKyAgICAgKiBAcGFyYW0geG1sRmlsZU5hbWVfCisgICAgICovCisKKyAgICBwdWJsaWMgIHZvaWQgd3JpdGVGaWxlKFN0cmluZyB4bWxGaWxlTmFtZV8pIHsKKworICAgICAgICB0cnkgeyAKKworICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh4bWxGaWxlTmFtZV8pOyAgCisgICAgICAgICAgICB3cml0ZShvdXRwdXRTdHJlYW0pOworICAgICAgICAgICAgCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIAlkZWJ1ZyhlKTsKKyAgICAgICAgfQorICAgfQorICAgIC8qKgorICAgICAqIAorICAgICAqIFdyaXRlIGFuIFhtbCBkb2N1bWVudCB0byBhbiBvdXRwdXRTdHJlYW0KKyAgICAgKiAKKyAgICAgKgorICAgICAqIEBwYXJhbSBvcyBBbGxvY2F0ZWQgb3V0cHV0IFN0cmVhbQorICAgICAqLworCisgICAgcHVibGljICB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gVXNlIGEgVHJhbnNmb3JtZXIgZm9yIG91dHB1dAorICAgICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CisgICAgICAgICAgICAvLyB0dXJuIG9uIGluZGVudGF0aW9ucworICAgICAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKKyAgICAgICAgICAKKyAgICAgICAgICAgIC8vIHRoZSBkb2N1bWVudCBzb3VyY2UKKyAgICAgICAgICAgIERPTVNvdXJjZSBkb2NTb3VyY2UgPSBuZXcgRE9NU291cmNlKF9kb2MpOworICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvcyk7CisKKyAgICAgICAgICAgIC8vIG91dHB1dCB0aGUgZG9jCisgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oZG9jU291cmNlLCByZXN1bHQpOworCisgICAgICAgICAgICBvcy5mbHVzaCgpOworCisgICAgICAgICAgICBvcy5jbG9zZSgpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBkZWJ1ZyhlKTsKKyAgICAgICAgfQorICAgIH0gLy8gZW5kIHdyaXRlCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogRGlzcGxheSB0aGUgY3VycmVudCBLbWwgZG9jdW1lbnQgb24gc3RkT3V0LgorICAgICAqICAgPGJyPgorICAgICAqICAgICAgKiAKKyAgICAgKiAKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGRpc3BsYXkoKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gVXNlIGEgVHJhbnNmb3JtZXIgZm9yIG91dHB1dAorICAgICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CisgICAgICAgICAgICAvLyB0dXJuIG9uIGluZGVudGF0aW9ucworICAgICAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoImluZGVudCIsICJ5ZXMiKTsKKworICAgICAgICAgIAorICAgICAgICAgICAgLy8gdGhlIGRvY3VtZW50IHNvdXJjZQorICAgICAgICAgICAgRE9NU291cmNlIGRvY1NvdXJjZSA9IG5ldyBET01Tb3VyY2UoX2RvYyk7CisKKyAgICAgICAgICAgIC8vIHRoZSBzdHJlYW0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoU3lzdGVtLm91dCk7CisKKyAgICAgICAgICAgIC8vIG91dHB1dCB0aGUgZG9jCisgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oZG9jU291cmNlLCByZXN1bHQpOworCisgICAgICAgICAgICAKKyAgICAgICAgICAgCisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGRlYnVnKGUpOworICAgICAgICB9CisgICAgfSAvLyBlbmQgZGlzcGxheQorICAgIAorICAgIC8qKgorICAgICAqIGRlYnVnIG91dHB1dCBtZXRob2QgCisgICAgICogQHBhcmFtIG1zZyAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWJ1ZyhTdHJpbmcgbXNnKSB7CisgICAgICAgIEdFTG9nLmRlYnVnKHRoaXMsbXNnKTsKKyAgICAgICAgCisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogZGVidWcgb3V0cHV0IG1ldGhvZCAKKyAgICAgKiBAcGFyYW0gbWV0aG9kIAorICAgICAqIEBwYXJhbSBtc2cgCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVidWcoU3RyaW5nIG1ldGhvZCxTdHJpbmcgbXNnKSB7CisgICAgICAgIEdFTG9nLmRlYnVnKHRoaXMsbWV0aG9kK21zZyk7CisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIGRlYnVnIG91dHB1dCBtZXRob2QgCisgICAgICogQHBhcmFtIHQgCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVidWcoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgR0VMb2cuZXJyb3IoIkttbERvYyBmYWlsdXJlIix0KTsKKyAgICAgICAgCisgICAgfQorICAgIC8qKgorICAgICAqIGRlYnVnIG91dHB1dCBtZXRob2QgCisgICAgICogQHBhcmFtIG1zZyAKKyAgICAgKiBAcGFyYW0gdCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWJ1ZyhTdHJpbmcgbXNnLFRocm93YWJsZSB0KSB7CisgICAgCUdFTG9nLmVycm9yKCJLbWxEb2M6ICIrbXNnLHQpOworICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIF9kb2MuCisgICAgICovCisgICAgcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkgeworICAgICAgICByZXR1cm4gX2RvYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gX2RvYyBUaGUgX2RvYyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoRG9jdW1lbnQgX2RvYykgeworICAgICAgICB0aGlzLl9kb2MgPSBfZG9jOworICAgIH0KKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBDcmVhdGUgYW4gZWxlbWVudCB0aGF0IGhhcyAKKyAgICAgKiBhIG5hbWUgYW5kIHZhbHVlIG9ubHkuIAorICAgICAqIDxwcmU+CisgICAgICogVGhlcmUgaXMgcHJvYmFibHkgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMgYnV0IC4uLgorICAgICAqICAKKyAgICAgKiAgIAorICAgICAqICAgCisgICAgICogKiBAcGFyYW0gZG9jIERvY3VtZW50CisgICAgICogQHBhcmFtIHRhZyAgeG1sIHRhZworICAgICAqIEBwYXJhbSB2YWx1ZSAgc3RyaW5nIHZhbHVlIG9mIHRhZworICAgICAqIEByZXR1cm4gWE1MIGVsZW1lbnQKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlQXR0cihEb2N1bWVudCBkb2MsU3RyaW5nIHRhZyxTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAKKyAgICAgICAgRWxlbWVudCBubSA9IGRvYy5jcmVhdGVFbGVtZW50KHRhZyk7CisgICAgICAgIFRleHQgdCA9IGRvYy5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7CisgICAgICAgIG5tLmFwcGVuZENoaWxkKHQpOyAgICAgICAgCisgICAgICAgIHJldHVybiBubTsKKyAgICB9CisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdG8gQ3JlYXRlIGFuIGVsZW1lbnQgdGhhdCBoYXMgCisgICAgICogYSBuYW1lIGFuZCBDRGF0YSB2YWx1ZSBvbmx5LiAKKyAgICAgKiA8cHJlPgorICAgICAqIFRoZXJlIGlzIHByb2JhYmx5IGEgYmV0dGVyIHdheSB0byBkbyB0aGlzIGJ1dCAuLi4KKyAgICAgKiAgCisgICAgICogICAKKyAgICAgKiAgIAorICAgICAqICogQHBhcmFtIGRvYyBEb2N1bWVudAorICAgICAqIEBwYXJhbSB0YWcgIHhtbCB0YWcKKyAgICAgKiBAcGFyYW0gdmFsdWUgIHN0cmluZyB2YWx1ZSBvZiB0YWcKKyAgICAgKiBAcmV0dXJuIFhNTCBlbGVtZW50CisgICAgICovCisgICAgCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUNEYXRhQXR0cihEb2N1bWVudCBkb2MsU3RyaW5nIHRhZyxTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAKKyAgICAgICAgRWxlbWVudCBubSA9IGRvYy5jcmVhdGVFbGVtZW50KHRhZyk7CisgICAgICAgIFRleHQgdCA9IGRvYy5jcmVhdGVDREFUQVNlY3Rpb24odmFsdWUpOworICAgICAgICBubS5hcHBlbmRDaGlsZCh0KTsgICAgICAgIAorICAgICAgICByZXR1cm4gbm07CisgICAgfQorICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGFwcGVuZCBhbiBlbGVtZW50IHRoYXQgaGFzIAorICAgICAqIG5vIHZhbHVlcy4gCisgICAgICogPHByZT4gICAgIAorICAgICAqICBDcmVhdGVzIGFuIFhNTCB0YWcgYW5kCisgICAgICogIHBsYWNlcyBpdCBpbiB0aGUgZG9jdW1lbnQgYXMgYSBjaGlsZCBvZiB0aGUgCisgICAgICogIHNwZWNpZmllZCBlbGVtZW50LgorICAgICAqICAKKyAgICAgKiAgIENyZWF0ZXMgPHRhZz52YWx1ZTwvdGFnPiAKKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZWxlbWVudCBleGlzdGluZyBlbGVtZW50IHdoZXJlIG5ldyB0YWcgaXMgdG8gZ28KKyAgICAgKiBAcGFyYW0gdGFnIFhNTCB0YWcKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFhNTCBlbGVtZW50CisgICAgICovCisgICAgIAorICAgIHB1YmxpYyBFbGVtZW50IGFwcGVuZEVsZW1lbnQoRWxlbWVudCBlbGVtZW50LFN0cmluZyB0YWcpIHsKKyAgICAgICAgCisgICAgICAgIEVsZW1lbnQgbmV3dGFnID0gX2RvYy5jcmVhdGVFbGVtZW50KHRhZyk7ICAgICAgIAorICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKG5ld3RhZyk7CisgICAgICAgIHJldHVybiBuZXd0YWc7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIENyZWF0ZSBhbiBlbGVtZW50IHRoYXQgaGFzIAorICAgICAqIGEgbmFtZSBhbmQgVGV4dCB2YWx1ZSBvbmx5LiAKKyAgICAgKiA8cHJlPiAgICAgCisgICAgICogIENyZWF0ZXMgYW4gWE1MIHRhZyB3aXRoIGEgdGV4dCB2YWx1ZSAgYW5kCisgICAgICogIHBsYWNlcyBpdCBpbiB0aGUgZG9jdW1lbnQgYXMgYSBjaGlsZCBvZiB0aGUgCisgICAgICogIHNwZWNpZmllZCBlbGVtZW50LgorICAgICAqICAgQ3JlYXRlcyA8dGFnPnZhbHVlPC90YWc+IAorICAgICAqIDwvcHJlPgorICAgICAqIAorICAgICAqIAorICAgICAqIEBwYXJhbSBlbGVtZW50IGV4aXN0aW5nIGVsZW1lbnQgd2hlcmUgbmV3IHRhZyBpcyB0byBnbworICAgICAqIEBwYXJhbSB0YWcgWE1MIHRhZworICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSBvZiB0YWcKKyAgICAgKiBAcmV0dXJuIFhNTCBlbGVtZW50CisgICAgICovCisgICAgIAorICAgIHB1YmxpYyBFbGVtZW50IGFwcGVuZFRleHQoRWxlbWVudCBlbGVtZW50LFN0cmluZyB0YWcsU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIC8vIGlmIG9idmlvdXMgWE1MIHRhZyB0aGVuIHRyZWF0IGl0IHNwZWNpYWwKKyAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoIjwiKT49MCB8fCAKKyAgICAgICAgICAgIHZhbHVlLmluZGV4T2YoIj4iKT49MCApIHsKKyAgICAgICAgICAgIHJldHVybiBhcHBlbmRDREFUQShlbGVtZW50LHRhZyx2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgRWxlbWVudCBubSA9IF9kb2MuY3JlYXRlRWxlbWVudCh0YWcpOworICAgICAgICBUZXh0IHQgPSBfZG9jLmNyZWF0ZVRleHROb2RlKHZhbHVlKTsKKyAgICAgICAgbm0uYXBwZW5kQ2hpbGQodCk7ICAgICAgICAKKyAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChubSk7CisgICAgICAgIHJldHVybiBubTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdG8gYXBwZW5kIGFuIGVsZW1lbnQgdGhhdCBoYXMgCisgICAgICogYSBuYW1lIGFuZCBDRGF0YSB2YWx1ZSBvbmx5LiAKKyAgICAgKiA8cHJlPgorICAgICAqIAorICAgICAqICAKKyAgICAgKiAgIDx0YWc+dmFsdWUgb2YgdGFnIHdpdGggIGh0bWwgaW4gaXQ8L3RhZz4KKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZWxlbWVudCBleGlzdGluZyBlbGVtZW50IHdoZXJlIG5ldyB0YWcgaXMgdG8gZ28KKyAgICAgKiBAcGFyYW0gdGFnIFhNTCB0YWcKKyAgICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgb2YgdGFnCisgICAgICogQHJldHVybiBYTUwgZWxlbWVudAorICAgICAqLworICAgIHB1YmxpYyBFbGVtZW50IGFwcGVuZENEQVRBKEVsZW1lbnQgZWxlbWVudCxTdHJpbmcgdGFnLFN0cmluZyB2YWx1ZSkgeworICAgICAgIAorICAgICAgICBFbGVtZW50IG5tID0gX2RvYy5jcmVhdGVFbGVtZW50KHRhZyk7CisgICAgICAgIENEQVRBU2VjdGlvbiBjZGF0YSA9IF9kb2MuY3JlYXRlQ0RBVEFTZWN0aW9uKHZhbHVlKTsKKyAgICAgICAgbm0uYXBwZW5kQ2hpbGQoY2RhdGEpOyAgICAgICAgCisgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobm0pOworICAgICAgICByZXR1cm4gbm07CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIENyZWF0ZSBhbiBlbGVtZW50IHRoYXQgaGFzIAorICAgICAqIGEgbmFtZSBhbmQgYm9vbGVhbiB2YWx1ZSBvbmx5LiAKKyAgICAgKiA8cHJlPiAKKyAgICAgKiAgPHRhZz4xPC90YWc+IG9yIDx0YWc+MDwvdGFnPgorICAgICAqICAgCisgICAgICogPC9wcmU+CisgICAgICogCisgICAgICogQHBhcmFtIGRvYyByb290IGRvY3VtZW50CisgICAgICogQHBhcmFtIGVsZW1lbnQgZXhpc3RpbmcgZWxlbWVudCB3aGVyZSBuZXcgdGFnIGlzIHRvIGdvCisgICAgICogQHBhcmFtIHRhZyBYTUwgdGFnCisgICAgICogQHBhcmFtIHZhbHVlIHRydWUgb3IgZmFsc2UKKyAgICAgKiBAcmV0dXJuIFhNTCBlbGVtZW50CisgICAgICovCisgICAgCisgICAgcHVibGljIEVsZW1lbnQgYXBwZW5kQXR0cihFbGVtZW50IGVsZW1lbnQsU3RyaW5nIHRhZyxib29sZWFuIHZhbHVlKSB7CisgICAgICAgCisgICAgICAgIEVsZW1lbnQgbm0gPSBfZG9jLmNyZWF0ZUVsZW1lbnQodGFnKTsKKyAgICAgICAgU3RyaW5nIHN0clZhbHVlID0gKHZhbHVlKT8gIjEiIDogIjAiOworICAgICAgICAgCisgICAgICAgIFRleHQgdCA9IF9kb2MuY3JlYXRlVGV4dE5vZGUoc3RyVmFsdWUpOworICAgICAgICBubS5hcHBlbmRDaGlsZCh0KTsgICAgICAgIAorICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKG5tKTsKKyAgICAgICAgcmV0dXJuIG5tOworICAgIH0KKyAgICAvKioKKyAgICAgKiBtYWluIGNsYXNzIHVzZWQgZm9yIGRlYnVnCisgICAgICogQHBhcmFtIGFyZ3MKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgS21sRG9jIGttbCA9IG5ldyBLbWxEb2MoKTsKKyAgICAgICBEb2N1bWVudCBkb2MgPSBrbWwuZ2V0RG9jdW1lbnQoKTsKKyAgICAgICBFbGVtZW50IHJvb3QgPSBrbWwuc2V0Um9vdChudWxsKTsKKyAgICAgICBFbGVtZW50IGZvbGRlckEgPSBkb2MuY3JlYXRlRWxlbWVudCgiRm9sZGVyIik7CisgICAgICAgcm9vdC5hcHBlbmRDaGlsZChmb2xkZXJBKTsKKyAgICAgICBFbGVtZW50IGZvbGRlckExID0gZG9jLmNyZWF0ZUVsZW1lbnQoIkZvbGRlciIpOworICAgICAgIGZvbGRlckEuYXBwZW5kQ2hpbGQoZm9sZGVyQTEpOworICAgICAgIFBsYWNlTWFyayBwbGFjZU1hcmsgPSBuZXcgUGxhY2VNYXJrKGRvYyk7CisgICAgICAgZm9sZGVyQTEuYXBwZW5kQ2hpbGQocGxhY2VNYXJrLmdldEVsZW1lbnQoKSk7CisgICAgICAgLy9wbGFjZU1hcmsuc2V0RGVzY3JpcHRpb24oIkhvbWViYXNlIik7CisgICAgICAga21sLmFwcGVuZFRleHQocGxhY2VNYXJrLmdldEVsZW1lbnQoKSwiZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgIkhvbWUgYXQ8YnI+MTE5IFRoaXJkIik7CisgICAgICAgcGxhY2VNYXJrLnNldE5hbWUoIkhvbWUiKTsKKyAgICAgICAKKyAgICAgICBMb29rQXQgbG9va2F0ID0gbmV3IExvb2tBdChkb2MpOworICAgICAgIGxvb2thdC5zZXRDb29yZGluYXRlcygtMTIyLjAwNTksMzYuOTYzOSk7CisgICAgICAgbG9va2F0LnNldFJhbmdlKDMwNS44ODgwNzkyMjk0NTY4KTsKKyAgICAgICBsb29rYXQuc2V0VGlsdCg0Ni43MjQyNTY5OTY2MjY0NSk7CisgICAgICAgbG9va2F0LnNldEhlYWRpbmcoNDkuMDYxMzM0MzkxNzEyMzMpOworICAgICAgIHBsYWNlTWFyay5hcHBlbmRDaGlsZChsb29rYXQuZ2V0RWxlbWVudCgpKTsKKyAgICAgICAKKyAgICAgICAvL3BsYWNlTWFyay5zZXRWaXNpYmlsaXR5KCIwIik7CisgICAgICAga21sLmFwcGVuZEF0dHIocGxhY2VNYXJrLmdldEVsZW1lbnQoKSwidmlzaWJpbGl0eSIsZmFsc2UpOworICAgICAgIFBvaW50IHBvaW50ID0gbmV3IFBvaW50KGRvYyk7CisgICAgICAgcG9pbnQuc2V0Q29vcmRpbmF0ZXMoLTEyMi4wMDU5LDM2Ljk2MzkpOworICAgICAgIHBsYWNlTWFyay5hcHBlbmRDaGlsZChwb2ludC5nZXRFbGVtZW50KCkpOworICAgICAgIAorICAgICAgIEVsZW1lbnQgZm9sZGVyQTIgPSBkb2MuY3JlYXRlRWxlbWVudCgiRm9sZGVyIik7CisgICAgICAgZm9sZGVyQS5hcHBlbmRDaGlsZChmb2xkZXJBMik7CisgICAgICAgCisgICAgICAgUG9seWdvbiBwb2x5Z29uID0gbmV3IFBvbHlnb24oZG9jKTsKKyAgICAgICBDb29yZGluYXRlc1tdIGNvcm5lcnMgPSBuZXcgQ29vcmRpbmF0ZXNbNF07CisgICAgICAgY29ybmVyc1swXSA9IG5ldyBDb29yZGluYXRlcygtMTIyLjAwNTksMzYuOTYzOSk7CisgICAgICAgY29ybmVyc1sxXSA9IG5ldyBDb29yZGluYXRlcygtMTIyLjAwNDksMzYuOTYzOSk7CisgICAgICAgY29ybmVyc1syXSA9IG5ldyBDb29yZGluYXRlcygtMTIyLjAwNDksMzYuOTkpOworICAgICAgIGNvcm5lcnNbMl0gPSBuZXcgQ29vcmRpbmF0ZXMoLTEyMi4wMDU5LDM2Ljk2MzkpOworICAgICAgIHBvbHlnb24uc2V0Q29vcmRpbmF0ZXMoY29ybmVycyk7CisgICAgICAgZm9sZGVyQTIuYXBwZW5kQ2hpbGQocG9seWdvbi5nZXRFbGVtZW50KCkpOworICAgICAgIAorICAgICAgIEVsZW1lbnQgZm9sZGVyQTMgPSBkb2MuY3JlYXRlRWxlbWVudCgiRm9sZGVyIik7CisgICAgICAgZm9sZGVyQS5hcHBlbmRDaGlsZChmb2xkZXJBMyk7CisgICAgICAgCisgICAgICAgTmV0d29ya0xpbmsgbmV0TGluayA9IG5ldyBOZXR3b3JrTGluayhkb2MpOworICAgICAgIFN0cmluZyB1cmxmaWxlID0gImM6L3RtcC90ZXN0LmttbCI7CisgICAgICAgaW50IGludGVydmFsID0gNjsKKyAgICAgICBuZXRMaW5rLnNldFVybCh1cmxmaWxlLCBpbnRlcnZhbCxudWxsKTsKKyAgICAgICBmb2xkZXJBMy5hcHBlbmRDaGlsZChuZXRMaW5rLmdldEVsZW1lbnQoKSk7CisgICAgICAgCisgICAgICAga21sLmRpc3BsYXkoKTsKKyAgICAgICBrbWwud3JpdGVGaWxlKCJ0ZXN0MS5rbWwiKTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9Mb29rQXQuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uva21sL0xvb2tBdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDY0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9Mb29rQXQuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLmttbDsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqIEJ1aWxkIHRoZSBMb29rQXQgc2VjdGlvbiBvZiBhIEtNTCBkb2N1bWVudC4KKyAqIDxwcmU+CisgKiAgICAKKyAqIDwvcHJlPgorICogCisgKgorICovCisvKiAgICAKKzxMb29rQXQ+Cis8bG9uZ2l0dWRlPi0xMjIuMDg1NjM3NTM1NjYzMTwvbG9uZ2l0dWRlPgorPGxhdGl0dWRlPjM3LjQyMjQwNTUxMjI3MjgyPC9sYXRpdHVkZT4KKzxyYW5nZT4zMDUuODg4MDc5MjI5NDU2ODwvcmFuZ2U+Cis8dGlsdD40Ni43MjQyNTY5OTY2MjY0NTwvdGlsdD4KKzxoZWFkaW5nPjQ5LjA2MTMzNDM5MTcxMjMzPC9oZWFkaW5nPgorPC9Mb29rQXQ+CisKKyovICAgCitwdWJsaWMgY2xhc3MgTG9va0F0IHsKKyAgIAorICAgIHByaXZhdGUgRWxlbWVudCBfbG9va2F0ID0gbnVsbDsKKyAgICAKKyAgICBwcml2YXRlIERvY3VtZW50IF9kb2MgPSBudWxsOworICAgIC8qKgorICAgICAqIExvb2tBdCBjb25zdHJ1Y3RvcgorICAgICAqIAorICAgICAqIEBwYXJhbSBkb2MgRG9jdW1lbnQgYmVpbmcgYnVpbHQKKyAgICAgKi8KKyAgICBwdWJsaWMgTG9va0F0KERvY3VtZW50IGRvYykgeworICAgICAgICBfZG9jID0gZG9jOworICAgICAgICBfbG9va2F0ID0gX2RvYy5jcmVhdGVFbGVtZW50KCJMb29rQXQiKTsKKyAgICAgICAgICAKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gTG9va0F0IEVsZW1lbnQgCisgICAgICovCisgICAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIF9sb29rYXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGNvb3JkaW5hdGVzIHRvIHRoZSBMb29rQXQgc2VjdGlvbgorICAgICAqIEBwYXJhbSBsb25naXR1ZGUKKyAgICAgKiBAcGFyYW0gbGF0aXR1ZGUgCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29vcmRpbmF0ZXMoZG91YmxlIGxvbmdpdHVkZSwKKyAgICAgICAgICAgIGRvdWJsZSBsYXRpdHVkZSkgeworICAgICAgICAgICAKKyAgICAgICAgRWxlbWVudCBlID0gS21sRG9jLmNyZWF0ZUF0dHIoX2RvYywibG9uZ2l0dWRlIixEb3VibGUudG9TdHJpbmcobG9uZ2l0dWRlKSk7ICAgICAgICAgICAgIAorICAgICAgICBfbG9va2F0LmFwcGVuZENoaWxkKGUpOworICAgICAgICBlID0gS21sRG9jLmNyZWF0ZUF0dHIoX2RvYywibGF0aXR1ZGUiLERvdWJsZS50b1N0cmluZyhsYXRpdHVkZSkpOyAgICAgICAgICAgICAKKyAgICAgICAgX2xvb2thdC5hcHBlbmRDaGlsZChlKTsKKworICAgIH0KKyAgICAvKioKKyAgICAgKiBBZGQgYSBhdHRyaWJ1dGVzIHRvIHRoZSBMb29rQXQgc2VjdGlvbgorICAgICAqIEBwYXJhbSBjb29yZHMgYXMgImxvbmdpdHVkZSxsYXRpdHVkZSxhbHRpdHVkZSIKKyAgICAgKiAgCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29vcmRpbmF0ZXMoU3RyaW5nIGNvb3JkcykgeworICAgICAgICBpbnQgaTEgPSBjb29yZHMuaW5kZXhPZigiLCIpOworICAgICAgICBpbnQgaTIgPSBjb29yZHMubGFzdEluZGV4T2YoIiwiKTsKKyAgICAgICAgU3RyaW5nIGxvbmdpdHVkZSA9IGNvb3Jkcy5zdWJzdHJpbmcoMCxpMSk7CisgICAgICAgIFN0cmluZyBsYXRpdHVkZSA9IGNvb3Jkcy5zdWJzdHJpbmcoaTErMSxpMik7ICAgCisgICAgICAgIEVsZW1lbnQgZSA9IEttbERvYy5jcmVhdGVBdHRyKF9kb2MsImxvbmdpdHVkZSIsbG9uZ2l0dWRlKTsgICAgICAgICAgICAgCisgICAgICAgIF9sb29rYXQuYXBwZW5kQ2hpbGQoZSk7CisgICAgICAgIGUgPSBLbWxEb2MuY3JlYXRlQXR0cihfZG9jLCJsYXRpdHVkZSIsbGF0aXR1ZGUpOyAgICAgICAgICAgICAKKyAgICAgICAgX2xvb2thdC5hcHBlbmRDaGlsZChlKTsKKworICAgIH0KKyAgICAvKioKKyAgICAgKiBBZGQgYSBhdHRyaWJ1dGVzIHRvIHRoZSBMb29rQXQgc2VjdGlvbgorICAgICAqIEBwYXJhbSByYW5nZSAgQWx0aXR1ZGUgb2YgdGhlIGV5ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJhbmdlKGRvdWJsZSByYW5nZSkgeworICAgICAgICAgICAKKyAgICAgICAgRWxlbWVudCBlID0gS21sRG9jLmNyZWF0ZUF0dHIoX2RvYywicmFuZ2UiLERvdWJsZS50b1N0cmluZyhyYW5nZSkpOyAgICAgICAgICAgICAKKyAgICAgICAgX2xvb2thdC5hcHBlbmRDaGlsZChlKTsKKworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgYSBhdHRyaWJ1dGVzIHRvIHRoZSBMb29rQXQgc2VjdGlvbgorICAgICAqIEBwYXJhbSB0aWx0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGlsdChkb3VibGUgdGlsdCkgeworICAgICAgICAgICAKKyAgICAgICAgRWxlbWVudCBlID0gS21sRG9jLmNyZWF0ZUF0dHIoX2RvYywidGlsdCIsRG91YmxlLnRvU3RyaW5nKHRpbHQpKTsgICAgICAgICAgICAgCisgICAgICAgIF9sb29rYXQuYXBwZW5kQ2hpbGQoZSk7CisKKyAgICB9IAorICAgIAorICAgIC8qKgorICAgICAqIEFkZCBhIGF0dHJpYnV0ZXMgdG8gdGhlIExvb2tBdCBzZWN0aW9uCisgICAgICogQHBhcmFtIGhlYWRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIZWFkaW5nKGRvdWJsZSBoZWFkaW5nKSB7CisgICAgICAgICAgIAorICAgICAgICBFbGVtZW50IGUgPSBLbWxEb2MuY3JlYXRlQXR0cihfZG9jLCJoZWFkaW5nIixEb3VibGUudG9TdHJpbmcoaGVhZGluZykpOyAgICAgICAgICAgICAKKyAgICAgICAgX2xvb2thdC5hcHBlbmRDaGlsZChlKTsKKyAgICB9CisKKyAgICAKK30gLy8gZW5kIGNsYXNzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9OZXR3b3JrTGluay5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9rbWwvTmV0d29ya0xpbmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTMyMjFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9rbWwvTmV0d29ya0xpbmsuamF2YQpAQCAtMCwwICsxLDk1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uua21sOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAoraW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKy8qKgorICogQnVpbGQgdGhlIE5ldHdvcmtMaW5rIHNlY3Rpb24gb2YgYSBLTUwgZG9jdW1lbnQuCisgKiA8cHJlPgorICogICAgCisgKiA8L3ByZT4KKyAqIAorICoKKyAqLworLyogICAgCis8TmV0d29ya0xpbms+CisgIDxuYW1lPk5ldHdvcmtMaW5rIDwvbmFtZT4KKyA8Zmx5VG9WaWV3PjE8L2ZseVRvVmlldz4gCisgIDxVcmw+CisgICAgIDxocmVmPkU6L3RtcC90ZXN0MS5rbWw8L2hyZWY+ICAKKyAgICAgPHJlZnJlc2hJbnRlcnZhbD4xMDwvcmVmcmVzaEludGVydmFsPiAgIAorICAgICA8cmVmcmVzaE1vZGU+b25JbnRlcnZhbDwvcmVmcmVzaE1vZGU+ICAgICAgICAgIAorICA8L1VybD4KKzwvTmV0d29ya0xpbms+CisqLyAgIAorcHVibGljIGNsYXNzIE5ldHdvcmtMaW5rIHsKKyAgIAorICAgIHByaXZhdGUgRWxlbWVudCBfbmV0d29ya0xpbmsgPSBudWxsOworICAgIAorICAgIAorICAgIAorICAgIHByaXZhdGUgRG9jdW1lbnQgX2RvYyA9IG51bGw7CisgICAgLyoqCisgICAgICogTmV0d29ya0xpbmsgY29uc3RydWN0b3IKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZG9jIERvY3VtZW50CisgICAgICovCisgICAgcHVibGljIE5ldHdvcmtMaW5rKERvY3VtZW50IGRvYykgeworICAgICAgICBfZG9jID0gZG9jOworICAgICAgICBfbmV0d29ya0xpbmsgPSBfZG9jLmNyZWF0ZUVsZW1lbnQoIk5ldHdvcmtMaW5rIik7ICAgICAgICAgIAorICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiAgRWxlbWVudCAKKyAgICAgKi8KKyAgICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KCkgeworICAgICAgICByZXR1cm4gX25ldHdvcmtMaW5rOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBVcmwgd2l0aCBocmVmIGF0dHJpYnV0ZQorICAgICAqIAorICAgICAqIDxwcmU+CisgICAgICogTm90ZTogVGhlIHVybCBjYW4gaGF2ZSBvbmUgb2YgdGhlIHRoZSBmb3JtczoKKyAgICAgKiAgIGh0dHA6Ly9ub2RlOnBvcnQvYWRkcmVzcworICAgICAqICAgYzovcGF0aC9maWxlLmttbAorICAgICAqICAKKyAgICAgKiBUaGUgdmFsaWQgVVJMIG9mICJmaWxlOi8vL2M6L3BhdGgvZmlsZS5rbWwgCisgICAgICogZG9lcyBub3Qgd29yayB3aXRoIEdvb2dsZUVhcnRoIE5ldHdvcmtMaW5rLiAgIAorICAgICAqIDwvcHJlPgorICAgICAqIEBwYXJhbSB1cmwgVVJMIHRvIGJlIGRvd25sb2FkZWQKKyAgICAgKiBAcGFyYW0gaW50ZXJ2YWwgc2Vjb25kcyBiZXR3ZWVuIHJlZnJlc2gKKyAgICAgKiBAcGFyYW0gbW9kZSAKKyAgICAgKiBAcGFyYW0gcmVmcmVzaCBtb2RlIAorICAgICAqICAgICAgICAgSWYgbnVsbCB0aGVuICJvbkludGVydmFsIgorICAgICAqIEByZXR1cm4gWE1MIGVsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgRWxlbWVudCBzZXRVcmwoU3RyaW5nIHVybCxpbnQgaW50ZXJ2YWwsU3RyaW5nIG1vZGUpIHsKKyAgICAJRWxlbWVudCBsaW5rID0gbnVsbDsKKyAgICAgICAgbGluayA9IF9kb2MuY3JlYXRlRWxlbWVudCgiTGluayIpOyAgICAgICAgICAgICAKKyAgICAgICAgX25ldHdvcmtMaW5rLmFwcGVuZENoaWxkKGxpbmspOyAgIAorICAgICAgICBFbGVtZW50IGUgPSBLbWxEb2MuY3JlYXRlQXR0cihfZG9jLCJocmVmIix1cmwpOyAgICAgICAgICAgICAKKyAgICAgICAgbGluay5hcHBlbmRDaGlsZChlKTsKKyAgICAgICAgZSA9IEttbERvYy5jcmVhdGVBdHRyKF9kb2MsInJlZnJlc2hJbnRlcnZhbCIsSW50ZWdlci50b1N0cmluZyhpbnRlcnZhbCkpOyAgICAgICAgICAgICAKKyAgICAgICAgbGluay5hcHBlbmRDaGlsZChlKTsKKyAgICAgICAgZSA9IEttbERvYy5jcmVhdGVBdHRyKF9kb2MsInJlZnJlc2hNb2RlIixtb2RlKTsgICAgICAgICAgICAgCisgICAgICAgIGxpbmsuYXBwZW5kQ2hpbGQoZSk7CisgICAgICAgIGUgPSBLbWxEb2MuY3JlYXRlQXR0cihfZG9jLCJ2aWV3UmVmcmVzaE1vZGUiLCJvblN0b3AiKTsgICAgICAgICAgICAgCisgICAgICAgIGxpbmsuYXBwZW5kQ2hpbGQoZSk7CisgICAgICAgIGUgPSBLbWxEb2MuY3JlYXRlQXR0cihfZG9jLCJ2aWV3UmVmcmVzaFRpbWUiLCIyIik7ICAgICAgICAgICAgIAorICAgICAgICBsaW5rLmFwcGVuZENoaWxkKGUpOworICAgICAgICByZXR1cm4gbGluazsKKyAgICB9CisgICAKKyAgICAKK30gLy8gZW5kIGNsYXNzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9QbGFjZU1hcmsuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uva21sL1BsYWNlTWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MDE5MjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9QbGFjZU1hcmsuamF2YQpAQCAtMCwwICsxLDk0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uua21sOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAoraW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKKworLyoqCisgKiBCdWlsZCB0aGUgUGxhY2VNYXJrIHNlY3Rpb24gb2YgYSBLTUwgZG9jdW1lbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBQbGFjZU1hcmsgeworICAgCisgICAgcHJpdmF0ZSBFbGVtZW50IF9wbGFjZW1hcmsgPSBudWxsOworICAgIAorICAgIHByaXZhdGUgRG9jdW1lbnQgX2RvYyA9IG51bGw7CisgICAgLyoqCisgICAgICogUGxhY2VNYXJrIGNvbnN0cnVjdG9yCisgICAgICogQHBhcmFtIGRvYyAKKyAgICAgKi8KKyAgICBwdWJsaWMgUGxhY2VNYXJrKERvY3VtZW50IGRvYykgeworICAgICAgICBfZG9jID0gZG9jOworICAgICAgICBfcGxhY2VtYXJrID0gX2RvYy5jcmVhdGVFbGVtZW50KCJQbGFjZW1hcmsiKTsKKyAgICAgICAKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUGxhY2VNYXJrIEVsZW1lbnQgCisgICAgICovCisgICAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIF9wbGFjZW1hcms7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEFkZCBhIGRlc2NyaXB0aW9uIHRhZyB0byB0aGUgUGxhY2VNYXJrCisgICAgICogQHBhcmFtIGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgCisgICAgICAgIEVsZW1lbnQgZGVzYyA9IF9kb2MuY3JlYXRlRWxlbWVudCgiZGVzY3JpcHRpb24iKTsKKyAgICAgICAgVGV4dCB0ID0gX2RvYy5jcmVhdGVUZXh0Tm9kZShkZXNjcmlwdGlvbik7CisgICAgICAgIGRlc2MuYXBwZW5kQ2hpbGQodCk7ICAgICAgICAKKyAgICAgICAgX3BsYWNlbWFyay5hcHBlbmRDaGlsZChkZXNjKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQWRkIGEgZGVzY3JpcHRpb24gdGFnIHRvIHRoZSBQbGFjZU1hcmsKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAKKyAgICAgICAgRWxlbWVudCBubSA9IF9kb2MuY3JlYXRlRWxlbWVudCgibmFtZSIpOworICAgICAgICBUZXh0IHQgPSBfZG9jLmNyZWF0ZVRleHROb2RlKG5hbWUpOworICAgICAgICBubS5hcHBlbmRDaGlsZCh0KTsgICAgICAgIAorICAgICAgICBfcGxhY2VtYXJrLmFwcGVuZENoaWxkKG5tKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQWRkIGEgdmlzaWJpbGl0eSB0YWcgdG8gdGhlIFBsYWNlTWFyaworICAgICAqIEBwYXJhbSB2YWx1ZSAgIFVzdWFsbHkgIjAiCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmlzaWJpbGl0eShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgCisgICAgICAgIEVsZW1lbnQgdiA9IEttbERvYy5jcmVhdGVBdHRyKF9kb2MsInZpc2liaWxpdHkiLCIwIik7ICAgICAKKyAgICAgICAgX3BsYWNlbWFyay5hcHBlbmRDaGlsZCh2KTsKKyAgICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQWRkIGEgc3R5bGVVcmwgcG9pbnRpbmcgdG8gYW4gZXhpc3RpbmcgU3R5bGUgCisgICAgICogQHBhcmFtIHN0eWxlIFN0eWxlIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlVXJsKFN0eWxlIHN0eWxlKSB7CisgICAgICAgU3RyaW5nIGlkID0gc3R5bGUuZ2V0SWQoKTsKKyAgICAgICBFbGVtZW50IHVybCA9IEttbERvYy5jcmVhdGVBdHRyKF9kb2MsInN0eWxlVXJsIiwiIyIraWQpOyAgICAgICAgICAgIAorICAgICAgIF9wbGFjZW1hcmsuYXBwZW5kQ2hpbGQodXJsKTsKKyAgICAgICAKKyAgICB9CisgICAgLyoqCisgICAgICogQWRkIGEgc2VjdGlvbiAoaS5lLiBMb29rQXQpIHRvIHRoZSBQbGFjZU1hcmsKKyAgICAgKiBAcGFyYW0gZWxlbWVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFwcGVuZENoaWxkKEVsZW1lbnQgZWxlbWVudCkgeyAgICAgICAgICAgIAorICAgICAgICBfcGxhY2VtYXJrLmFwcGVuZENoaWxkKGVsZW1lbnQpOworICAgIH0KK30gLy8gZW5kIGNsYXNzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9Qb2ludC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9rbWwvUG9pbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGY1NWE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9rbWwvUG9pbnQuamF2YQpAQCAtMCwwICsxLDkwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uua21sOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAoraW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKy8qKgorICogQnVpbGQgdGhlIHBvaW50IHNlY3Rpb24gb2YgYSBLTUwgZG9jdW1lbnQuCisgKi8KKyAgCisgIAorLyoKKzxQb2ludD4gICAgCisgICAgPGNvb3JkaW5hdGVzPi0xMjIuMDg1NjIwNDU0MTc4NiwzNy40MjI0NDAxNTMyMTY4OCw1MDwvY29vcmRpbmF0ZXM+CisgIDwvUG9pbnQ+CisKKyovICAgCitwdWJsaWMgY2xhc3MgUG9pbnQgeworICAgCisgICAgcHJpdmF0ZSBFbGVtZW50IF9wb2ludCA9IG51bGw7CisgICAgCisgICAgcHJpdmF0ZSBEb2N1bWVudCBfZG9jID0gbnVsbDsKKyAgICAvKioKKyAgICAgKiBQb2ludCBjb25zdHJ1Y3RvcgorICAgICAqIEBwYXJhbSBkb2MgCisgICAgICovCisgICAgcHVibGljIFBvaW50KERvY3VtZW50IGRvYykgeworICAgICAgICBfZG9jID0gZG9jOworICAgICAgICBfcG9pbnQgPSBfZG9jLmNyZWF0ZUVsZW1lbnQoIlBvaW50Iik7CisgICAgICAgICAgCisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFBvaW50IEVsZW1lbnQgCisgICAgICovCisgICAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIF9wb2ludDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgY29vcmRpbmF0ZXMgdG8gdGhlIFBvaW50IHNlY3Rpb24KKyAgICAgKiAgICAgIAorICAgICAqIEBwYXJhbSBsb25naXR1ZGUKKyAgICAgKiBAcGFyYW0gbGF0aXR1ZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb29yZGluYXRlcyhkb3VibGUgbG9uZ2l0dWRlLGRvdWJsZSBsYXRpdHVkZSkgeworICAgICAgICBTdHJpbmcgY29vcmQgPSAgRG91YmxlLnRvU3RyaW5nKGxvbmdpdHVkZSkrIiwiKworICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlLnRvU3RyaW5nKGxhdGl0dWRlKTsKKyAgICAgICAgRWxlbWVudCBlID0gS21sRG9jLmNyZWF0ZUF0dHIoX2RvYywiY29vcmRpbmF0ZXMiLGNvb3JkKTsgICAgICAgICAgICAgCisgICAgICAgIF9wb2ludC5hcHBlbmRDaGlsZChlKTsKKyAgICAgICAKKyAgICB9CisgICAgLyoqCisgICAgICogQWRkIGNvb3JkaW5hdGVzIHRvIHRoZSBQb2ludCBzZWN0aW9uICh3aXRoIGFsdGl0dWRlKQorICAgICAqICAgICAgCisgICAgICogQHBhcmFtIGxvbmdpdHVkZQorICAgICAqIEBwYXJhbSBsYXRpdHVkZQorICAgICAqIEBwYXJhbSBhbHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb29yZGluYXRlcyhkb3VibGUgbG9uZ2l0dWRlLGRvdWJsZSBsYXRpdHVkZSxpbnQgYWx0KSB7CisgICAgICAgIFN0cmluZyBjb29yZCA9ICBEb3VibGUudG9TdHJpbmcobG9uZ2l0dWRlKSsiLCIrCisgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGUudG9TdHJpbmcobGF0aXR1ZGUpKyIsIitJbnRlZ2VyLnRvU3RyaW5nKGFsdCk7CisgICAgICAgIEVsZW1lbnQgZSA9IEttbERvYy5jcmVhdGVBdHRyKF9kb2MsImNvb3JkaW5hdGVzIixjb29yZCk7ICAgICAgICAgICAgIAorICAgICAgICBfcG9pbnQuYXBwZW5kQ2hpbGQoZSk7CisgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEFkZCBjb29yZGluYXRlcyBhcyBhIFN0cmluZyB0byB0aGUgUG9pbnQgc2VjdGlvbiAKKyAgICAgKiAgICAgIAorICAgICAqIEBwYXJhbSBjb29yZCBMYXRMb25nIGNvb3JkaW5hdGVzCisgICAgICogCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29vcmRpbmF0ZXMoU3RyaW5nIGNvb3JkKSB7CisgICAgICAgCisgICAgICAgIEVsZW1lbnQgZSA9IEttbERvYy5jcmVhdGVBdHRyKF9kb2MsImNvb3JkaW5hdGVzIixjb29yZCk7ICAgICAgICAgICAgIAorICAgICAgICBfcG9pbnQuYXBwZW5kQ2hpbGQoZSk7CisgICAgICAgCisgICAgfQorICAgIAorfSAvLyBlbmQgY2xhc3MKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uva21sL1BvbHlnb24uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uva21sL1BvbHlnb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjBhNmI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9rbWwvUG9seWdvbi5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uua21sOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAoraW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKy8qCisgKiA8UG9seWdvbj4KKyAqIAorICogICA8b3V0ZXJCb3VuZGFyeUlzPgorICogCisgKiAgICAgPExpbmVhclJpbmc+CisgKiAKKyAqICAgICAgICA8Y29vcmRpbmF0ZXM+CisgKiAKKyAqIC04OC4zMDY1MzQsIDMwLjIyNzg1MiwgMC4wMDAwMDAKKyAqIAorICogLi4uCisgKiAKKyAqIDg4LjMwNjUzNCwgMzAuMjI3ODUyLCAwLjAwMDAwMAorICogCisgKiAgICAgICAgPC9jb29yZGluYXRlcz4KKyAqIAorICogICAgPC9MaW5lYXJSaW5nPgorICogCisgKiAgIDwvb3V0ZXJCb3VuZGFyeUlzPgorICogCisgKiA8L1BvbHlnb24+CisgKiAKKyAqLyAgIAorLyoqCisgKiBCdWlsZCB0aGUgUG9seWdvbiBzZWN0aW9uIG9mIGEgS01MIGRvY3VtZW50LgorICovCisgIAorICAKKworCitwdWJsaWMgY2xhc3MgUG9seWdvbiB7CisgICAKKyAgICBwcml2YXRlIEVsZW1lbnQgX3BvbHlnb24gPSBudWxsOworICAgIAorICAgIHByaXZhdGUgRWxlbWVudCBfb3V0ZXJCb3VuZGFyeUlzID0gbnVsbDsKKyAgICAKKyAgICAKKyAgICBwcml2YXRlIERvY3VtZW50IF9kb2MgPSBudWxsOworICAgIC8qKgorICAgICAqIFBvbHlnb24gY29uc3RydWN0b3IKKyAgICAgKiBAcGFyYW0gZG9jIAorICAgICAqLworICAgIHB1YmxpYyBQb2x5Z29uKERvY3VtZW50IGRvYykgeworICAgICAgICBfZG9jID0gZG9jOworICAgICAgICBfcG9seWdvbiA9IF9kb2MuY3JlYXRlRWxlbWVudCgiUG9seWdvbiIpOyAgICAgICAgICAKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUG9seWdvbiBFbGVtZW50IAorICAgICAqLworICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKSB7CisgICAgICAgIHJldHVybiBfcG9seWdvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgY29vcmRpbmF0ZXMgdG8gdGhlIFBvbHlnb24gc2VjdGlvbi4KKyAgICAgKiAKKyAgICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yIGNyZWF0aW5nIGEgTGluZWFyUmluZyAKKyAgICAgKiBpbnNpZGUgb2YgYW4gb3V0ZXJCb3VuZGFyeUlzLgorICAgICAqICAgICAgCisgICAgICogQHBhcmFtIGNvcm5lcnMgIGNvb3JkaW5hdGVzIG9mIHRoZSBjb3JuZXJzIAorICAgICAqICAgIGZvciB0aGUgb3V0ZXJSaW5nIAorICAgICAqIEByZXR1cm4geG1sIGVsZW1lbnQKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgRWxlbWVudCBzZXRDb29yZGluYXRlcyhDb29yZGluYXRlc1tdIGNvcm5lcnMpIHsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBjb29yZHMgPSBDb29yZGluYXRlcy50b1N0cmluZyhjb3JuZXJzKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBzZXRDb29yZGluYXRlcyhjb29yZHMpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgY29vcmRpbmF0ZXMgdG8gdGhlIFBvbHlnb24gc2VjdGlvbi4KKyAgICAgKiAKKyAgICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yIGNyZWF0aW5nIGEgTGluZWFyUmluZyAKKyAgICAgKiBpbnNpZGUgb2YgYW4gb3V0ZXJCb3VuZGFyeUlzLgorICAgICAqICAgICAgCisgICAgICogQHBhcmFtIGNvb3JkcyAgY29vcmRpbmF0ZXMgb2YgdGhlIGNvcm5lcnMgCisgICAgICogICAgZm9yIHRoZSBvdXRlclJpbmcgCisgICAgICogQHJldHVybiB4bWwgZWxlbWVudAorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyBFbGVtZW50IHNldENvb3JkaW5hdGVzKFN0cmluZyBjb29yZHMpIHsgICAgICAgIAorICAgICAgICAKKyAgICAgICAgRWxlbWVudCBlID0gS21sRG9jLmNyZWF0ZUF0dHIoX2RvYywiY29vcmRpbmF0ZXMiLGNvb3Jkcyk7CisgICAgICAgIEVsZW1lbnQgbGluZWFyUmluZyA9IF9kb2MuY3JlYXRlRWxlbWVudCgiTGluZWFyUmluZyIpOyAgICAgICAgCisgICAgICAgIGxpbmVhclJpbmcuYXBwZW5kQ2hpbGQoZSk7CisgICAgICAgIF9vdXRlckJvdW5kYXJ5SXMgPSBfZG9jLmNyZWF0ZUVsZW1lbnQoIm91dGVyQm91bmRhcnlJcyIpOworICAgICAgICBfb3V0ZXJCb3VuZGFyeUlzLmFwcGVuZENoaWxkKGxpbmVhclJpbmcpOworICAgICAgICBfcG9seWdvbi5hcHBlbmRDaGlsZChfb3V0ZXJCb3VuZGFyeUlzKTsKKyAgICAgICAgcmV0dXJuIF9vdXRlckJvdW5kYXJ5SXM7CisgICAgfQorICAgIAorCisgICAgCit9IC8vIGVuZCBjbGFzcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9rbWwvU3RlbUttbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9rbWwvU3RlbUttbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MWZkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9TdGVtS21sLmphdmEKQEAgLTAsMCArMSw2MzAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5rbWw7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5oZWxwLmludGVybmFsLmFwcHNlcnZlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuR0VEYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuR0VMb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5Bc3BlY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnNlcnZsZXQuVmVyaWZ5Q2xpZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uudmlld3MuR0VQcmVmZXJlbmNlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS5Qcm9ncmFtOworCitpbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKworCisKKy8qKgorICogU3RlbUtNTCB3b3JrcyB3aXRoIEdFSW50ZXJmYWNlIHRvIGhhbmRsZSB0aGUgCisgKiBLTUwgc2lkZSBvZiB0aGUgaW50ZXJmYWNlIGJldHdlZW4gU1RFTSBhbmQgR29vZ2xlRWFydGguCisgKiBSZWZlciB0byBHRUludGVyZmFjZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqIDxwcmU+CisgKiAgICAgCisgKiAgCisgKiAgLSBQb2x5Z29uTWFwICBNYXA8U3RyaW5nLEdFRGF0YT4gCisgKiAgICAgICBNYXAgb2YgaW5mbyB0byBnZW5lcmF0ZSBhIHNldCBvZiBQb2x5Z29ucworICogICAgICAgVGhlIGtleSBpcyB0aGUgYXJlYSAKKyAqICAgICAgIAorICogIC0gYXNwZWN0ICAgU0VJUiB2YWx1ZQorICogIC0gY3ljbGUgICAgTnRoIHRpbWUgaW50ZXJ2YWwKKyAqICAKKyAqIAorICogRHVyaW5nIG9wZXJhdGlvbiwgd2hlbiBhcHByb3ByaWF0ZSBUaGUgImNvbnRyb2x4eHh4LmttbCIgZmlsZSAKKyAqIHdpbGwgYmUgcmV3cml0ZW4gd2l0aCBuZXcgaW5zdHJ1Y3Rpb25zLgorICogU3RlbVZpZXcgd2lsbCBjYWxsIGdlbmVyYXRlUG9seWdvbnMoKSB0byBnZW5lcmF0ZSBhIGNvbnRyb2wgZmlsZQorICogdGhhdCB3aWxsIGRpc3BsYXkgYWxsIG9mIHRoZSBjb3VudHkvYXJlYXMgb2YgdGhlIG1hcCB3aXRoIHRoZSAKKyAqIGFwcHJvcHJpYXRlIGNvbG9yIGZpbGwgdG8gbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgU3RlbSBtYXAuCisgKiAKKyAqIFdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhIHNwZWNpZmljIGNvdW50eS9hcmVhIG9uIHRoZSBtYXAsCisgKiB0aGVuIFN0ZW1WaWV3IHdpbGwgY2FsbCB0aGUgZ2VuZXJhdGVQb2x5Z29uIG1ldGhvZC4KKyAqIAorICoKKyAqLworQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKK3B1YmxpYyBjbGFzcyBTdGVtS21sIHsKKwkvKioKKyAgICAgKiBTZXJ2bGV0IGNvbnRleHQuICAKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUID0gIlNURU0iOworICAgICAgIAorICAgIC8qKgorICAgICAqIElmIGludGVybmFsIHdlYiBzZXJ2ZXIgc3RhcnRlZCB0aGVuIHRoaXMgaXMgc2V0IHRydWUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIF9zdGFydGVkID0gZmFsc2U7CisgICAgLyoqIAorICAgICAqIElmIGludGVybmFsIHNlcnZlciBmYWlscyB0byBzdGFydCB0aGVuIHRoaXMgaXMgc2V0IHRydWUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIF9mYWlsZWQgPSBmYWxzZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBVUkwgZm9yIGVpdGhlciB0aGUgZW1iZWRlZCB3ZWIgc2VydmVyIG9yIAorICAgICAqIGFuIGFzc2lnbmVkIHdlYiBzZXJ2ZXIuICAKKyAgICAgKiBJZiB0aGlzIHdlYnNlcnZlciB3YXMgaW5vcGVyYXRpdmUgdGhlbiB0aGlzCisgICAgICogaXMgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgX2Jhc2V1cmwgPSBudWxsOworICAgIC8qKgorICAgICAqIFN5c3RlbSB0ZW1wIGRpcmVjdG9yeS4gCisgICAgICogY2FsY3VsYXRlZCBvbmNlIGFuZCBzYXZlZAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0bXBGb2xkZXIgPSBudWxsOworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBpbnRlbnNpdGllcyBvZiBjb2xvcgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFYID0gNTsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1JTiA9IDA7CisgICAgCisgICAgLyoqCisgICAgICogICB1bmlxdWUgaWQgdXNlZCBmb3Igc2VydmxldCBjb21tdW5pY2F0aW9uCisgICAgICovCisgICAgc3RhdGljIFN0cmluZyBzZXJ2bGV0SWQgPSBudWxsOworICAgIC8qKgorICAgICAqIEZpbGVOYW1lIGZvciBLTUwgY29udHJvbCBmaWxlLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJPTF9GTiA9ICJjb250cm9sLmttbCI7CisgICAgLyoqCisgICAgICogRmlsZU5hbWUgZm9yIEtNTCBjb250cm9sIGZpbGUgdXNlZCB0byBkaXNwbGF5CisgICAgICogYSBuYW1lZCBhZG1pbiBhcmVhLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUExBWUFSRUFfRk4gPSAiZGlzcGxheWFyZWEua21sIjsKKyAgICAvKioKKyAgICAgKiBpZiB0cnVlIHRoZW4gc2VydmxldCB3aWxsIHdhaXQgd2hlbiAKKyAgICAgKiBzZW5kaW5nIGZpbGVzIHRvIEdFIGFuZCBpdCBoYXMgcnVuIAorICAgICAqIG91dCBvZiBmaWxlcyB0byBzZW5kLiAgCisgICAgICogCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB3YWl0Rm9yS01MID0gdHJ1ZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBJbnRlcnZhbCBpbiBzZWNvbmRzIGJldHdlZW4gcmVxdWVzdHMKKyAgICAgKiBmb3IgcmVmcmVzaC4gIEZpbGxlZCBpbnRvIHRoZSAKKyAgICAgKiBOZXR3b3JrTGluayByZXF1ZXN0LgorICAgICAqLworCXN0YXRpYyBpbnQgaW50ZXJ2YWwgPSAyOworICAgIAorCS8qKgorCSAqIEluZGljYXRlIGlmIEtNTCBpcyBhIHZhbGlkIGZpbGV0eXBlLgorCSAqIElmIG5vdCB0aGVuIEdvb2dsZUVhcnRoIGhhcyBwcm9iYWJseSAKKwkgKiBub3QgYmVlbiBpbnN0YWxsZWQgYW5kIHdlIGNhbm5vdCAKKwkgKiBzaW1wbHkgbGF1bmNoIGEgLmttbCBmaWxlLgorCSAqLworCXN0YXRpYyBib29sZWFuIHZhbGlkS01MID0gdHJ1ZTsKKwkvKioKKwkgKiBpbXBsZW1lbnRhdGlvbiBvZiBJS21sRGlzcGxheSB0aGF0IHdpbGwgY3JlYXRlIGFuZCB3cml0ZQorCSAqIHRoZSBLTUwgZmlsZSB0aGF0IGlzIHNlbnQgdG8gR29vZ2xlRWFydGguCisJICovCisJcHJpdmF0ZSBJS21sRGlzcGxheSBkaXNwbGF5ID0gbnVsbDsKKwkKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yICAKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdGVtS21sKCkgeworICAgIAkKKyAgICAJCisgICAgICAgdHJ5IHsKKwkJICAgU3RyaW5nIGttbERpc3BsYXlDbGFzcyA9IEFzcGVjdC5nZXRLbWxEaXNwbGF5Q2xhc3MoKTsKKworCQkgICBkaXNwbGF5ID0gKElLbWxEaXNwbGF5KUNsYXNzLmZvck5hbWUoa21sRGlzcGxheUNsYXNzKS5uZXdJbnN0YW5jZSgpOworCSAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CQkKKwkJICAgR0VMb2cuZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgaW5zdGFuY2UgZm9yIEttbERpc3BsYXkiLCB0KTsKKwkgICB9CisJCSAgCQorICAgICAgCisgICAgfQorICAgICAgICAKKyAgICAvKioKKyAgICAgKiBpbml0aWFsaXphdGlvbgorICAgICAqIAorICAgICAqIGN1cnJlbnRseSB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8KKyAgICAgKiAKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgIAkgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IEdvb2dsZUVhcnRoIGlzIGluc3RhbGxlZCBieSAKKyAgICAgKiBjaGVja2luZyB0aGF0IHRoZSBLTUwgZmlsZXR5cGUgaXMga25vd24uCisgICAgICogCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBLTUwgZmlsZSB0eXBlIGlzIGtub3duLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJpZnlHRSgpIHsKKyAgICAJCisgICAgCVN0cmluZyBleHRlbnNpb24gPSAiLmttbCI7CisgICAgCVByb2dyYW0gcCA9IFByb2dyYW0uZmluZFByb2dyYW0oZXh0ZW5zaW9uKTsKKyAgICAJaWYgKHAgIT0gbnVsbCkgeworICAgIAkJR0VMb2cuZGVidWcoIlN0ZW1LbWwudmVyaWZ5R0UiLCJLTUwgaGFuZGxlcjogIitwLmdldE5hbWUoKSk7CisgICAgCQkgICAJCQkKKyAgICAJfSBlbHNlIHsKKyAgICAJCXZhbGlkS01MID0gZmFsc2U7CisgICAgCX0KKyAgICAJCisgICAgCXJldHVybiB2YWxpZEtNTDsKKyAgICAJCisgICAgfQorCS8qKgorCSAqIAorICAgICAqIENyZWF0ZSBhIEdvb2dsZUVhcnRoIGVtcHR5IGNvbnRyb2wgZmlsZXMgYW5kIGxhdW5jaCBpdCAKKyAgICAgKiBzbyB0aGF0IGdvb2dsZUVhcnRoIHN0YXJ0cyB1cC4KKyAgICAgKgorCSAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxhdW5jaEdFKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CisJCQorCQl0cnkgeworCQkJCisJCQlTdHJpbmcgZm4gPSBnZXRDb250cm9sRmlsZSgpOworCQkJCisJCQorCQkJLy8gd3JpdGUgYW4gZW1wdHkgY29udHJvbCBmaWxlIHNvIHRoYXQgCisJCQkvLyB0byBiZWdpbiB3aXRoLCBub3RoaW5nIGhhcHBlbnMgYnV0IAorCQkJLy8gR29vZ2xlRWFydGggZ2V0cyBhIGhlYWRzdGFydCBvbiBpbml0aWFsaXphdGlvbgorCQkJCisJCQlLbWxEb2Mga21sID0gbmV3IEttbERvYygpOworCQkJa21sLnNldFJvb3QobnVsbCk7CisJCQlrbWwuZ2V0RG9jdW1lbnQoKTsKKwkJCWttbC53cml0ZUZpbGUoZm4pOworCQkJR0VMb2cuZGVidWcoIlN0ZW1LbWwubGF1bmNoR0UiLGZuKTsKKwkJCS8vIGxhdW5jaCB0aGUgZmlsZQorCQkJLy8gCisJCQlsYXVuY2goZm4pOworCQkJVGhyZWFkLnNsZWVwKDEqMTAwMCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlTdHJpbmcgbXNnID0gIkVycm9yIGxhdW5jaGluZyBpbml0aWFsIEdvb2dsZUVhcnRoIGNvbnRyb2wgZmlsZS4iOworCQkJR0VMb2cuZXJyb3IobXNnLGUpOworCQl9CisJfQorCQorCQorCS8qKgorCSAqIEdlbmVyYXRlIHRoZSBuYW1lIHVzZWQgZm9yIEtNTCBDb250cm9sLgorCSAqIAorCSAqIEByZXR1cm4gRnVsbHkgcXVhbGlmaWVkIGZpbGVuYW1lIChlLmcuIGM6L3RtcC9jb250cm9sLmttbCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb250cm9sRmlsZSgpIHsJCisJCVN0cmluZyBmbiA9IG51bGw7CisJCWlmICh0bXBGb2xkZXIgPT0gbnVsbCkgeworCQkJdG1wRm9sZGVyID0gZ2V0VG1wRm9sZGVyKCk7CisJCX0KKwkJaWYgKHRtcEZvbGRlciA9PSBudWxsKSB7CisJCQlHRUxvZy5lcnJvcigiVW5hYmxlIHRvIGdlbmVyYXRlIEtNTCBDb250cm9sIGZpbGUuIixudWxsKTsKKwkJfSBlbHNlIHsKKwkJCisJCSAgICBmbiA9IHRtcEZvbGRlcitGaWxlLnNlcGFyYXRvcitDT05UUk9MX0ZOOworCQl9CisJCQorCQlyZXR1cm4gZm47CisJfQorCS8qKgorCSAqIG9idGFpbiB0aGUgc3lzdGVtIHRlbXBvcmFyeSBmb2xkZXIuCisJICogCisJICogQHJldHVybiBGdWxseSBxdWFsaWZpZWQgcGF0aCAoZS5nLiBjOi90bXAgb3IgL3RtcCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUbXBGb2xkZXIoKSB7CQorCQlTdHJpbmcgdG1wID0gbnVsbDsKKwkJU3RyaW5nIHNsYXNoID0gRmlsZS5zZXBhcmF0b3I7CQkKKwkJdHJ5IHsKKwkJCUZpbGUgdG1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImNvbnRyb2wiLCIua21sIixudWxsKTsKKwkJCXRtcCA9IHRtcEZpbGUuZ2V0UGFyZW50KCk7CisJCQl0bXBGaWxlLmRlbGV0ZSgpOwkJCisJCQkKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewkJCQorCQkJR0VMb2cuZXJyb3IoIlN5c3RlbSBUZW1wb3JhcnkgRGlyZWN0b3J5IG5vdCBkZWZpbmVkOiAiLG51bGwpOworCQkJLy8gaWYgbm8gc3lzdGVtIHRlbXAgZm9sZGVyLCB1c2Ugb3VyIGxvZyBmb2xkZXIKKwkJCXRtcCA9IGdldExvZ0ZvbGRlcigpOworCQkJdG1wID0gdG1wK3NsYXNoKyJ0bXAiOworCQkJRmlsZSB0bXBGaWxlID0gbmV3IEZpbGUodG1wKTsKKwkJCXRtcEZpbGUubWtkaXJzKCk7CisJCQkKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsJCQkKKwkJCUdFTG9nLmVycm9yKCJGYWlsdXJlIGdldHRpbmcgVE1QIGZvbGRlci4iLGUpOworCQkJCisJCX0KKwkJcmV0dXJuIHRtcDsKKwl9CisJLyoqCisJICogb2J0YWluIHRoZSB1c2VycyBwcmVmZXJlbmNlIGZvciB0aGUgZm9sZGVyCisJICogdXNlZCB0byBnZW5lcmF0ZSBLTUwgZmlsZXMuCisJICogCisJICogQHJldHVybiBGdWxseSBxdWFsaWZpZWQgcGF0aCAoZS5nLiBjOi90bXAgb3IgL3RtcCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2dGb2xkZXIoKSB7CQorCQlTdHJpbmcgbG9nID0gbnVsbDsKKwkJCQkKKwkJdHJ5IHsKKwkJCWxvZyA9IEdFUHJlZmVyZW5jZVBhZ2UuZ2V0Rm9sZGVyKCk7CisJCQlGaWxlIGxvZ0ZvbGRlciA9IG5ldyBGaWxlKGxvZyk7CisJCQlpZiAobG9nRm9sZGVyLmV4aXN0cygpKSB7CisJCQkJaWYgKGxvZ0ZvbGRlci5pc0RpcmVjdG9yeSgpKSB7CisJCQkJCXJldHVybiBsb2c7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkxvZyBGb2xkZXIgIisKKwkJCQkJCQlsb2crICIgaXMgbm90IHZhbGlkIik7CisJCQkJfQorCQkJfSAgZWxzZSB7CisJCQkJYm9vbGVhbiBvayA9IGxvZ0ZvbGRlci5ta2RpcnMoKTsKKwkJCQlpZiAob2spCisJCQkJCXJldHVybiBsb2c7IAorCQkJCWVsc2UgCisJCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJMb2cgRm9sZGVyICIrCisJCQkJCQkJbG9nKyAiIGNhbm5vdCBiZSBjcmVhdGVkICIpOworCQkJfQorCQkJCisJCQkKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsJCQkKKwkJCUdFTG9nLmVycm9yKCJGYWlsZWQgdG8gZ2V0IExPRyBmb2xkZXI6ICIrbG9nLGUpOworCQkJbG9nID0gbnVsbDsKKwkJfSAKKwkJcmV0dXJuIGxvZzsKKwl9CisJLyoqCisJICogR2VuZXJhdGUgdGhlIG5hbWUgdXNlZCBmb3IgS01MIHdoZW4gdXNpbmcKKwkgKiB0aGUgRGlzcGxheUFyZWEgdXRpbGl0eSBmdW5jdGlvbgorCSAqIAorCSAqIEByZXR1cm4gRnVsbHkgcXVhbGlmaWVkIGZpbGVuYW1lIChlLmcuIGM6L3RtcC9jb250cm9sLmttbCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaXNwbGF5QXJlYUZpbGUoKSB7CQorCQlTdHJpbmcgZm4gPSBudWxsOworCQl0cnkgeworCQkJaWYgKHRtcEZvbGRlciA9PSBudWxsKSB7CisJCQkJRmlsZSB0bXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZGlzcGxheWFyZWEiLCIua21sIik7CisJCQkJdG1wRm9sZGVyID0gdG1wRmlsZS5nZXRQYXJlbnQoKTsKKwkJCQl0bXBGaWxlLmRlbGV0ZSgpOworCQkJfQorCQkJZm4gPSB0bXBGb2xkZXIrIi8iK0RJU1BMQVlBUkVBX0ZOOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CQkJCisJCQlHRUxvZy5lcnJvcigiVW5hYmxlIHRvIGdlbmVyYXRlIEtNTCBEaXNwbGF5QXJlYSBmaWxlLiIsZSk7CisJCX0KKwkJcmV0dXJuIGZuOworCX0KKwkvKioKKwkgKiAgd3JpdGUgYW4gZW1wdHkgY29udHJvbCBmaWxlIHNvIHRoYXQgCisJICogIGl0IGNsZWFycyB0aGUgY3VycmVudCBkaXNwbGF5CisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyRGlzcGxheUFyZWEoKSB7CisJCVN0cmluZyBmbiA9IHRtcEZvbGRlcisiLyIrRElTUExBWUFSRUFfRk47CQorCQkKKwkJS21sRG9jIGttbCA9IG5ldyBLbWxEb2MoKTsKKwkJa21sLnNldFJvb3QobnVsbCk7CisJCWttbC5nZXREb2N1bWVudCgpOworCQlrbWwud3JpdGVGaWxlKGZuKTsKKwkJCisJCS8vIGxhdW5jaCB0aGUgZmlsZQorCQkvLyAKKwkJbGF1bmNoKGZuKTsKKwl9CisgICAgLyoqCisJICogY3JlYXRlIGFuZCBsYXVuY2ggYSBuZXR3b3JrIGxpbmsgZmlsZSB0aGF0IHdpbGwgcmVhZCB0aGUgCisJICoga21sIGZpbGVzIHRoYXQgd2Ugd2lsbCBiZSBnZW5lcmF0aW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGZvbGRlciBGb2xkZXIgdGhhdCBjb250YWlucyBLTUwgZmlsZXMKKyAgICAgKiBAcGFyYW0gZmlsZSAgIElmIG5vdCBudWxsIHRoZW4gcGFzcyB0aGlzIG5hbWUgdG8gdGhlIHNlcnZsZXQuICAKKyAgICAgKiBAcmV0dXJuIFVSTCB1c2VkCisJICoKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBsYXVuY2hOZXR3b3JrTGluaygJU3RyaW5nIGZvbGRlciwgU3RyaW5nIGZpbGUpIHsKKwkJCQkJCisJCVN0cmluZyB1cmwgPSBudWxsOworCQkvLyBjbGVhciBpZiBuZWVkZWQKKwkJU3RlbUttbC5sYXVuY2hHRSgpOworCisJCXRyeSB7CisJCQkKKwkJCVN0cmluZyBmbiA9IGdldENvbnRyb2xGaWxlKCk7CisJCQkKKwkJCWxvbmcgdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOworCQkJc2VydmxldElkID0gTG9uZy50b0hleFN0cmluZyh0aW1lKTsKKwkJCVN0cmluZyB3YWl0ID0gIm4iOworCQkJaWYgKHdhaXRGb3JLTUwpIAorCQkJCXdhaXQgPSAieSI7CisgICAgICAgICAgICAKKwkJCXVybCA9IF9iYXNldXJsKworCQkJCSIvIitDT05URVhUKyIvc2xpZGVzaG93P2lkPSIrc2VydmxldElkKworCQkJCSImZm9sZGVyPSIrZm9sZGVyKworCQkJCSImd2FpdD0iK3dhaXQ7CisJCQlpZiAoZmlsZSAhPSBudWxsKSB7CisJCQkJdXJsID0gdXJsKyImZmlsZT0iK2ZpbGU7CisJCQl9CisJCQlHRUxvZy5kZWJ1ZyhTdGVtS21sLmNsYXNzLCJsYXVuY2hOZXR3b3JrTGluayB1cmw9Iit1cmwpOworCQkJCisJCQlTdGVtS21sLndyaXRlTmV0TGluayhmbiwgaW50ZXJ2YWwsIHVybCk7CisJCQkKKwkJCVN0cmluZyBiYm94dXJsID0gX2Jhc2V1cmwrCisJCQkgICAgICAgIi8iK0NPTlRFWFQrIi9iYm94P2lkPSIrc2VydmxldElkOworCQkJCisJCQkvLyBzdGFydCBUaHJlYWQgdG8gYWNjZXNzIEJCb3ggaW5mbyBmcm9tIEdFCisJCQlpZiAoR0VQcmVmZXJlbmNlUGFnZS5pc0JCT1goKSkgeworCQkJCUJCb3hJbmZvIGJib3ggPSBuZXcgQkJveEluZm8oYmJveHVybCxzZXJ2bGV0SWQpOworCQkJCVRocmVhZCB0ID0gKG5ldyBUaHJlYWQoYmJveCkpOworCQkJCXQuc3RhcnQoKTsKKwkJCX0KKwkJCXRyeSB7CisJCQkJUHJvZ3JhbS5sYXVuY2goZm4pOworCQkJCUdFTG9nLmRlYnVnKFN0ZW1LbWwuY2xhc3MsIkxhdW5jaGVkIG5ldHdvcmtMaW5rIGZpbGUgIitmbik7CisJCQkJVGhyZWFkLnNsZWVwKDUqMTAwMCk7CisJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKwkJCQlHRUxvZy5lcnJvcigiTGF1bmNoIGZhaWx1cmUiLCBlKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUdFTG9nLmVycm9yKCJGYWlsdXJlIGxhdW5jaGluZyBOZXR3b3JrTGluay5rbWwgZmlsZSIsZSk7CisJCQkKKwkJfQorCQlyZXR1cm4gdXJsOworICAgIH0KKwkvKioKKwkgKiAKKwkgKiBXcml0ZSB0aGUgbmV0d29yayBMaW5rIGZpbGUgdGhhdCB3aWxsIHRlbGwgR29vZ2xlRWFydGggaG93IAorCSAqIHRvIG1ha2UgY2FsbGJhY2tzIHRvIHRoZSBzZXJ2bGV0LgorCSAqIAorCSAqIEBwYXJhbSBmbiAgZm9sZGVyICsgZm4gdG8gd3JpdGUgIAorCSAqIEBwYXJhbSBpbnRlcnZhbCAgSG93IG9mdGVuIHRvIGNhbGwgYmFjayAoc2Vjb25kcykKKwkgKiBAcGFyYW0gdXJsICAgICBXaGVyZSB0byBjYWxsIGJhY2sgKyBwYXJtcworCSAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlTmV0TGluayhTdHJpbmcgZm4sIGludCBpbnRlcnZhbCwgU3RyaW5nIHVybCkgCisJICB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKKwkJS21sRG9jIGttbDsKKwkJLy8gd3JpdGUgYSBmaWxlIHVzaW5nIG5ldHdvcmtsaW5rIHRoYXQgdGVsbHMgCisJCS8vIGdvb2dsZSBlYXJ0aCB0byByZWFkIHRoZSBjb250cm9sIGZpbGUgCisJCS8vIGV2ZXJ5IE4gc2Vjb25kcyBhbmQgZG8gd2hhdGV2ZXIgaXQgc2F5cy4KKwkJa21sID0gbmV3IEttbERvYygpOyAgICAgICAgCisJCURvY3VtZW50IGRvYyA9IGttbC5nZXREb2N1bWVudCgpOworCQlFbGVtZW50IHJvb3QgPSBrbWwuc2V0Um9vdChudWxsKTsKKwkJTmV0d29ya0xpbmsgbmV0TGluayA9IG5ldyBOZXR3b3JrTGluayhkb2MpOyAgICAgICAgCisKKwkJU3RyaW5nIG1vZGUgPSAib25JbnRlcnZhbCI7CisJCW5ldExpbmsuc2V0VXJsKHVybCwgaW50ZXJ2YWwsbW9kZSk7CisJCS8vIGFkZCA8Zmx5VG9WaWV3PjE8L2ZseVRvVmlldz4gCisJCWttbC5hcHBlbmRBdHRyKG5ldExpbmsuZ2V0RWxlbWVudCgpLCJmbHlUb1ZpZXciLGZhbHNlKTsKKwkJcm9vdC5hcHBlbmRDaGlsZChuZXRMaW5rLmdldEVsZW1lbnQoKSk7CisKKwkJLy9rbWwuZGlzcGxheSgpOyAgLy8gZGVidWcKKwkJa21sLndyaXRlRmlsZShmbik7CisJfQorCQorCQorICAvKioKKyAgKiBDcmVhdGUgdGhlIEtNTCBjb250cm9sIGZpbGUgdG8gZGlzcGxheSBhbGwgb2YgdGhlIAorICAqIHBvbHlnb24gKGNvdW50eSkgYXJlYXMKKyAgKgorICAqIENhbGwgdGhlIGltcGxlbWVudGF0aW9uIG9mIElLbWxEaXNwbGF5IHRvIGNyZWF0ZSBhbmQgCisgICogd3JpdGUgdGhlIGttbCBmaWxlLgorICAqIAorICAqIEBwYXJhbSBjb250cm9sRmlsZU5hbWUgRmlsZSB3aGVyZSBLTUwgd2lsbCBiZSB3cml0dGVuIAorICAqIEBwYXJhbSBnZURhdGEgTWFwIG9mIEdFRGF0YSBvYmplY3RzIAorICAqIEBwYXJhbSBhc3BlY3QgIHdoaWNoIHR5cGUgb2YgbWFwIChwb3B1bGF0aW9uLHN1c2NlcHRpcGxlLi4uCisgICogQHBhcmFtIGN5Y2xlIGN1cnJlbnQgbnVtYmVyIG9mIGN5Y2xlIGJlaW5nIGRpc3BsYXllZAorICAqLworICAgIAorCXB1YmxpYyB2b2lkIGdlbmVyYXRlUG9seWdvbnMoU3RyaW5nIGNvbnRyb2xGaWxlTmFtZSwgCisJCQlNYXA8U3RyaW5nLEdFRGF0YT4gZ2VEYXRhLCBBc3BlY3QgYXNwZWN0LGxvbmcgY3ljbGUpIHsKKyAJCisJICAgIAorCSAgICBkaXNwbGF5LmdlbmVyYXRlUG9seWdvbnMoY29udHJvbEZpbGVOYW1lLCBnZURhdGEsIGFzcGVjdCk7CisJfQorCQkKKyAKKworICAgICAgCisKKyAgICAvKioKKwkgKiBnZXQgdGhlIEhleCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGFuIGludCB2YWx1ZS4gCisJICogVGhpcyBoYXMgbGVhZGluZyB6ZXJvcy4KKwkgKiAKKwkgKiBAcGFyYW0gdiAgICAgIHZhbHVlIHRvIHRyYW5zbGF0ZS4KKwkgKiBAcmV0dXJuIEhleCBTdHJpbmcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIZXgoaW50IHYpIHsKKwkJU3RyaW5nIGhleCA9IEludGVnZXIudG9IZXhTdHJpbmcodik7CisJCWlmICgoaGV4Lmxlbmd0aCgpICUgMikgIT0gMCkgeworCQkJaGV4ID0gIjAiICsgaGV4OworCQl9CisJCXJldHVybiBoZXg7CisJfQorCisvKioKKyAqIExhdW5jaCB0aGUgS01MIGZpbGUgdG8gR29vZ2xlRWFydGgKKyAqIAorICogQHBhcmFtIGNvbnRyb2xGaWxlTmFtZQorICogICAgICAgICAgICBhYnNvbHV0ZSBmaWxlIHBhdGggb3IgYSB1cmwKKyAqIAorICovCitwdWJsaWMgc3RhdGljIHZvaWQgbGF1bmNoKFN0cmluZyBjb250cm9sRmlsZU5hbWUpIHsKKwl0cnkgeworCQlpZiAoIXZhbGlkS01MKSB7CisJCQlHRUxvZy5kZWJ1ZygibGF1bmNoOiBLTUwgaXMgdW5rbm93biBmaWxldHlwZSIpOworCQkJcmV0dXJuOworCQl9CisJCUZpbGUgY29udHJvbEZpbGUgPSBuZXcgRmlsZShjb250cm9sRmlsZU5hbWUpOworCQkKKwkJCisJCVByb2dyYW0ubGF1bmNoKGNvbnRyb2xGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKwkJR0VMb2cuZGVidWcoIlN0ZW1LbWwubGF1bmNoIiwiTGF1bmNoZWQgZmlsZSAiK2NvbnRyb2xGaWxlTmFtZSk7CisJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKwkJR0VMb2cuZXJyb3IoIlN0ZW1LbWw6IExhdW5jaCBmYWlsdXJlIiwgZSk7CisJfQorfQorCisvKiogCisgKiBTdGFydHVwIGFuZCB2ZXJpZnkgYSB3ZWIgc2VydmVyIHRvIHJ1biB0aGUgCisgKiBHRVNlcnZsZXQgc2VydmxldHMuCisgKiAKKyAqIElmIHNwZWNpZmllZCBpdCB3aWxsIHRyeSB0byBzdGFydCB0aGUgZW1iZWRkZWQgd2ViIHNlcnZlcgorICogSWYgbm90IG9yIGl0IGZhaWxlZCB0aGVuIGl0IHdpbGwgY2hlY2sgaWYgYW4gCisgKiBleHRlcm5hbCBzZXJ2ZXIgd2FzIHNwZWNpZmllZCBhbmQgdHJ5IHRvIGFjY2VzcyBpdC4KKyAqIAorICogQHJldHVybiB1cmwgZm9yIGhvc3QgYW5kIHBvcnQgCisgKiAgICAgICBleGFtcGxlOiBodHRwOi8vMTI3LjAuMC4xOjU0MzQ1LworICogICAgICAgSXQgd2lsbCByZXR1cm4gbnVsbCBpZiB1bmFibGUgdG8gc3RhcnQgc2VydmVyIG9yIAorICogICAgICAgaWYgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgb3VyIHNlcnZsZXRzCisgKi8JIAorcHVibGljIHN0YXRpYyBTdHJpbmcgaW5pdFdlYlNlcnZlcigpIHsKKwkKKwlpZiAoR0VQcmVmZXJlbmNlUGFnZS5pc0ludGVybmFsU2VydmVyKCkpewkJCisJCV9iYXNldXJsID0gc3RhcnRXZWJTZXJ2ZXIoKTsJCQorCX0KKwkKKwlpZiAoX2Jhc2V1cmwgPT0gbnVsbCApIHsKKwkJU3RyaW5nIGhvc3QgPUdFUHJlZmVyZW5jZVBhZ2UuZ2V0U2VydmVySG9zdCgpOworCQlpZiAoaG9zdCAhPSBudWxsICYmIGhvc3QubGVuZ3RoKCkgPiAwKQorCQkJX2Jhc2V1cmwgPSAiaHR0cDovLyIraG9zdDsKKwl9IAorCWlmIChfYmFzZXVybCAhPSBudWxsKSB7CisJCUdFTG9nLmRlYnVnKFN0ZW1LbWwuY2xhc3MsIlZlcmlmeUNsaWVudCAiK19iYXNldXJsKTsKKwkJLy8gdmVyaWZ5IHRoYXQgd2UgaGF2ZSBhIHdvcmtpbmcgd2ViIHNlcnZlcgorCQlWZXJpZnlDbGllbnQgdmMgPSBuZXcgVmVyaWZ5Q2xpZW50KCk7CisJCWJvb2xlYW4gdGVzdCA9IHZjLnZlcmlmeShfYmFzZXVybCsKKwkJCSAgICAgICAgICAgIAkiLyIrQ09OVEVYVCsiL3ZlcmlmeSIpOworCQlpZiAoISB0ZXN0KSB7CisJCQlHRUxvZy5pbmZvKHZjLmdldEVycm9yKCkpOworCQkJR0VMb2cuZXJyb3IoIlN0ZW1LbWw6IFVuYWJsZSB0byBjb21tdW5pY2F0ZSB3aXRoIHdlYiBzZXJ2ZXIgQCAiCisJCQkJCStfYmFzZXVybCxudWxsKTsKKwkJCWlmIChHRVByZWZlcmVuY2VQYWdlLmlzSW50ZXJuYWxTZXJ2ZXIoKSl7CisJCQkJX2ZhaWxlZCA9IHRydWU7CisJCQl9CisJCQlfYmFzZXVybCA9IG51bGw7CisJCX0gCisJfQorCWlmIChfYmFzZXVybCA9PSBudWxsKSB7CisJCUdFTG9nLmVycm9yKCJHb29nbGVFYXJ0aCBTZXJ2bGV0IHN1cHBvcnQgZGlzYWJsZWQiLG51bGwpOworCX0KKwlyZXR1cm4gX2Jhc2V1cmw7Cit9CisKKy8qKiAKKyAqIFN0YXJ0dXAgYW4gaW50ZXJuYWwgd2ViIHNlcnZlciB0byBydW4gdGhlIAorICogR0VTZXJ2bGV0IHNlcnZsZXRzLgorICogQHJldHVybiB1cmwgZm9yIGhvc3QgYW5kIHBvcnQgCisgKiAgICAgICBleGFtcGxlOiBodHRwOi8vMTI3LjAuMC4xOjU0MzQ1LworICogICAgICAgSXQgd2lsbCByZXR1cm4gbnVsbCBpZiB1bmFibGUgdG8gc3RhcnQgc2VydmVyCisgKi8JCitAU3VwcHJlc3NXYXJuaW5ncyh7ICJkZXByZWNhdGlvbiIgfSkgCitwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFydFdlYlNlcnZlcigpIHsKKwlTdHJpbmcgdXJsID0gbnVsbDsKKwlpZiAoIV9zdGFydGVkICYmICFfZmFpbGVkKQkgIHsKKwkgICAgdHJ5IHsKKwkgICAgCUdFTG9nLmRlYnVnKFN0ZW1LbWwuY2xhc3MsIlN0YXJ0IHdlYlNlcnZlciIpOworCQkJV2ViYXBwTWFuYWdlci5zdGFydChDT05URVhULCBBY3RpdmF0b3IuUExVR0lOX0lELCBQYXRoLkVNUFRZKTsKKwkJCQorCQkJU3RyaW5nIGludGVybmFsSG9zdCA9IFdlYmFwcE1hbmFnZXIuZ2V0SG9zdCgpICsgIjoiICsgV2ViYXBwTWFuYWdlci5nZXRQb3J0KCk7CisJCQkgdXJsID0gImh0dHA6Ly8iICsgIGludGVybmFsSG9zdDsKKwkJCSBHRUxvZy5kZWJ1ZyhTdGVtS21sLmNsYXNzLCJTdGFydGVkIHdlYlNlcnZlciAiK3VybCk7CisJCQkgCisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJR0VMb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOworCQkJX2ZhaWxlZCA9IHRydWU7CisJCQl1cmwgPSBudWxsOworCQl9CisJICB9IGVsc2UgaWYgKCFfZmFpbGVkICkgeworCQkgIFN0cmluZyBpbnRlcm5hbEhvc3QgPSBXZWJhcHBNYW5hZ2VyLmdldEhvc3QoKSArICI6IiArIFdlYmFwcE1hbmFnZXIuZ2V0UG9ydCgpOworCQkJIHVybCA9ICJodHRwOi8vIiArICBpbnRlcm5hbEhvc3Q7IAorCSAgfQorCUdFTG9nLmRlYnVnKFN0ZW1LbWwuY2xhc3MsImVtYmVkZGVkIHdlYiBzZXJ2ZXIgYXQ6ICIrdXJsKTsKKwlpZiAoISBfZmFpbGVkKSAKKwkJX3N0YXJ0ZWQgPSB0cnVlOworCXJldHVybiB1cmw7Cit9CisKKy8qKgorICogb2J0YWluIHRoZSBVUkwgdXNlZCB0byBhY2Nlc3MgdGhlIEdFIFNlcnZsZXRzLgorICogCisgKiBAcmV0dXJuIFRoZSBVUkwgYXMgYSBzdHJpbmcsIG51bGwgaWYgdW5hYmxlIHRvIAorICogICBhY2Nlc3MgYSB2YWxpZCB3ZWIgc2VydmVyLgorICovCitzdGF0aWMgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJVcmwoKSB7CisJcmV0dXJuIF9iYXNldXJsOworfQorCisvKioKKyAqIFNldCB0aGUgZmlsZW5hbWUgYmFzZWQgb24gdGhlIFRlbXBsYXRlIGFuZCAKKyAqIHRoZSBjdXJyZW50IGFzcGVjdCBhbmQgY3ljbGUgbnVtYmVyLgorICogCisgKiBAcGFyYW0gZm9sZGVyIEZvbGRlciB3aGVyZSBrbWwgZmlsZXMgYXJlIHdyaXR0ZW4KKyAqIEBwYXJhbSB0ZW1wbGF0ZSAKKyAqIEBwYXJhbSBhc3BlY3QgYXNwZWN0IHRvIGJlIGRpc3BsYXllZAorICogQHBhcmFtIGN5Y2xlCisgKiAKKyAqIEByZXR1cm4gcmVzdWx0aW5nIGFic29sdXRlIGZpbGVuYW1lCisgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb250cm9sRk4oU3RyaW5nIGZvbGRlciwgU3RyaW5nIHRlbXBsYXRlLAorCQkJQXNwZWN0IGFzcGVjdCwgbG9uZyBjeWNsZSkgeworICAgICAgICBTdHJpbmcgY29udHJvbEZOID0gIiI7CisJCVN0cmluZyBzZXEgPSAiMDAwMCIgKyBjeWNsZTsKKwkJaWYgKGN5Y2xlID4gOSkKKwkJCXNlcSA9ICIwMDAiICsgY3ljbGU7CisJCWlmIChjeWNsZSA+IDk5KQorCQkJc2VxID0gIjAwIiArIGN5Y2xlOworCQlpZiAoY3ljbGUgPiA5OTkpCisJCQlzZXEgPSAiMCIgKyBjeWNsZTsKKwkJaWYgKGN5Y2xlID4gOTk5OSkKKwkJCXNlcSA9ICIiICsgY3ljbGU7CisJCS8vIHdlIHdvbid0IHdvcnJ5IGFib3V0IGN5Y2xlID4gOTksOTk5CisJCQorCQljb250cm9sRk4gPSBmb2xkZXIgKyAiLyIgKyB0ZW1wbGF0ZTsKKwkJY29udHJvbEZOID0gY29udHJvbEZOLnJlcGxhY2VBbGwoIiZUIiwgYXNwZWN0LnRvU3RyaW5nKCkpOworCQljb250cm9sRk4gPSBjb250cm9sRk4ucmVwbGFjZUFsbCgiJk4iLCBzZXEpOworCQlHRUxvZy5kZWJ1ZyhTdGVtS21sLmNsYXNzLCJPdXRwdXQgZmlsZT0iK2NvbnRyb2xGTik7CisJCXJldHVybiBjb250cm9sRk47CisKKwl9CisvKioKKyAqIAorICogQHJldHVybiB0cnVlIGlmIHNlcnZsZXQgc2hvdWxkIHdhaXQgd2hlbiBpdCBoYXMKKyAqICBzZW50IGFsbCBvZiB0aGUgYXZhaWxhYmxlIGttbCBmaWxlcyB0byBHRQorICovCitwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXYWl0Rm9yS01MKCkgeworCXJldHVybiB3YWl0Rm9yS01MOworfQorLyoqCisgKiBTZXQgdHJ1ZSBpZiBzZXJ2bGV0IHNob3VsZCB3YWl0CisgKiBAcGFyYW0gd2FpdEZvcktNTAorICovCitwdWJsaWMgc3RhdGljIHZvaWQgc2V0V2FpdEZvcktNTChib29sZWFuIHdhaXRGb3JLTUwpIHsKKwlTdGVtS21sLndhaXRGb3JLTUwgPSB3YWl0Rm9yS01MOworfQorIAorfS8vIGNsYXNzCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uva21sL1N0eWxlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9TdHlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzODE4YTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL2ttbC9TdHlsZS5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uua21sOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAoraW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKy8qKgorICogQnVpbGQgdGhlIFN0eWxlIHNlY3Rpb24gb2YgYSBLTUwgZG9jdW1lbnQuCisgKiA8cHJlPgorICogICAgCisgKiA8L3ByZT4KKyAqIAorICoKKyAqLworICAKKyAgCisvKgorICAgIDxTdHlsZT4gCisgICAgICAgICAgPExpbmVTdHlsZSA+CisgICAgICAgICAgICA8d2lkdGg+My4wPC93aWR0aD4KKyAgICAgICAgICAgIDxjb2xvcj43ZDAwZmZmZjwvY29sb3I+CisgICAgICAgICAgPC9MaW5lU3R5bGU+CisgICAgICAgICAgPFBvbHlTdHlsZT4KKyAgICAgICAgICAgPGZpbGw+MDwvZmlsbD4KKyAgICAgICAgICAgPG91dGxpbmU+MDwvb3V0bGluZT4KKyAgICAgICAgICA8L1BvbHlTdHlsZT4KKyAgICAgICAKKyAgICAgPC9TdHlsZT4KKyovICAgCitwdWJsaWMgY2xhc3MgU3R5bGUgeworICAgCisgICAgcHJpdmF0ZSBFbGVtZW50IF9zdHlsZSA9IG51bGw7CisgICAgCisgICAgcHJpdmF0ZSBEb2N1bWVudCBfZG9jID0gbnVsbDsKKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyAgX2lkID0gIlN0eWxlVVJMIjsKKyAgICAvKioKKyAgICAgKiBTdHlsZSBjb25zdHJ1Y3RvcgorICAgICAqIEBwYXJhbSBkb2MgCisgICAgICovCisgICAgcHVibGljIFN0eWxlKERvY3VtZW50IGRvYykgeworICAgICAgICBfZG9jID0gZG9jOworICAgICAgICBfc3R5bGUgPSBfZG9jLmNyZWF0ZUVsZW1lbnQoIlN0eWxlIik7CisgICAgICAgICAgCisgICAgICAgIAorICAgIH0KKyAgICAvKioKKyAgICAgKiBTdHlsZSBjb25zdHJ1Y3RvcgorICAgICAqIEBwYXJhbSBkb2MgCisgICAgICogQHBhcmFtIGlkIAorICAgICAqLworICAgIHB1YmxpYyBTdHlsZShEb2N1bWVudCBkb2MsU3RyaW5nIGlkKSB7CisgICAgICAgIF9kb2MgPSBkb2M7CisgICAgICAgIF9pZCA9IGlkOworICAgICAgICBfc3R5bGUgPSBfZG9jLmNyZWF0ZUVsZW1lbnQoIlN0eWxlIik7CisgICAgICAgIF9zdHlsZS5zZXRBdHRyaWJ1dGUoImlkIixfaWQpOyAgCisgICAgICAgIAorICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFN0eWxlIEVsZW1lbnQgCisgICAgICovCisgICAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIF9zdHlsZTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBpZCAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICByZXR1cm4gX2lkOworICAgIH0KKyAgICAvKioKKyAgICAgKiBBZGQgTGluZVN0eWxlIHRvIHRoZSBTdHlsZSBzZWN0aW9uCisgICAgICogICAgICAKKyAgICAgKiBDb2xvciBpcyBvZiBoZXhpZGVjaW1hbCBmb3JtIG9vYmJnZ3JyIHdoZXJlOgorICAgICAqICAgb28gaXMgMDAtZmYgb3BhY2l0eSB2YWx1ZQorICAgICAqICAgYmIgaXMgMDAtZmYgYmx1ZQorICAgICAqICAgZ2cgaXMgMDAtZmYgZ3JlZW4KKyAgICAgKiAgIHJyIGlzIDAwLWZmIHJlZCAKKyAgICAgKiAgc28gN2ZmZjAwMDAgaXMgQmx1ZSB3aXRoIDUwJSAgb3BhY2l0eQorICAgICAqICAgICAgIAorICAgICAqIEBwYXJhbSB3aWR0aCBsaW5lIHdpZHRoIChlLmcuIDMuMCkgCisgICAgICogQHBhcmFtIGNvbG9yIGxpbmUgY29sb3IgKGUuZy4gN2QwMGZmZmYpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGluZVN0eWxlKGZsb2F0IHdpZHRoLFN0cmluZyBjb2xvcikgeworICAgICAgICBFbGVtZW50IGxpbmVTdHlsZSA9IF9kb2MuY3JlYXRlRWxlbWVudCgiTGluZVN0eWxlIik7ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIF9zdHlsZS5hcHBlbmRDaGlsZChsaW5lU3R5bGUpOworICAgICAgICBFbGVtZW50IGUgPSBLbWxEb2MuY3JlYXRlQXR0cihfZG9jLCJ3aWR0aCIsRmxvYXQudG9TdHJpbmcod2lkdGgpKTsgCisgICAgICAgIGxpbmVTdHlsZS5hcHBlbmRDaGlsZChlKTsKKyAgICAgICAgZSA9IEttbERvYy5jcmVhdGVBdHRyKF9kb2MsImNvbG9yIixjb2xvcik7IAorICAgICAgICBsaW5lU3R5bGUuYXBwZW5kQ2hpbGQoZSk7CisgICAgfQorICAgCisgICAgLyoqCisgICAgICogQWRkIExpbmVTdHlsZSB0byB0aGUgU3R5bGUgc2VjdGlvbgorICAgICAqICAgICAgCisgICAgICogQHBhcmFtIHdpZHRoIGxpbmUgd2lkdGggKGUuZy4gMy4wKSAKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaW5lU3R5bGUoZG91YmxlIHdpZHRoKSB7CisgICAgICAgIEVsZW1lbnQgbGluZVN0eWxlID0gX2RvYy5jcmVhdGVFbGVtZW50KCJMaW5lU3R5bGUiKTsgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgX3N0eWxlLmFwcGVuZENoaWxkKGxpbmVTdHlsZSk7CisgICAgICAgIEVsZW1lbnQgZSA9IEttbERvYy5jcmVhdGVBdHRyKF9kb2MsIndpZHRoIixEb3VibGUudG9TdHJpbmcod2lkdGgpKTsgCisgICAgICAgIGxpbmVTdHlsZS5hcHBlbmRDaGlsZChlKTsKKyAgICAgICAgCisgICAgfQorICAgIC8qKgorICAgICAqIEFkZCBQb2x5U3R5bGUgdG8gdGhlIFN0eWxlIHNlY3Rpb24KKyAgICAgKiBAcGFyYW0gY29sb3IgIEtNTCBjb2xvcgorICAgICAqIEBwYXJhbSBvdXRsaW5lIHRydWUgaWYgb3V0bGluZSBvcHRpb24gdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb2x5U3R5bGUoU3RyaW5nIGNvbG9yLCBib29sZWFuIG91dGxpbmUpIHsKKyAgICAgICAgRWxlbWVudCBwb2x5U3R5bGUgPSBfZG9jLmNyZWF0ZUVsZW1lbnQoIlBvbHlTdHlsZSIpOyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBfc3R5bGUuYXBwZW5kQ2hpbGQocG9seVN0eWxlKTsKKyAgICAgICAgRWxlbWVudCBlID0gbnVsbDsKKyAgICAgICAgaWYgKCEgb3V0bGluZSkgeyAvLyBkZWZhdWx0IGlzIHRydWUKKyAgICAgICAgICAgIGUgPSBLbWxEb2MuY3JlYXRlQXR0cihfZG9jLCJvdXRsaW5lIiwiMCIpOworICAgICAgICAgICAgcG9seVN0eWxlLmFwcGVuZENoaWxkKGUpOyAKKyAgICAgICAgfSAKKyAgICAgICAgaWYgKGNvbG9yLmVxdWFscygiMCIpKSB7CisgICAgICAgICAgICBlID0gS21sRG9jLmNyZWF0ZUF0dHIoX2RvYywiZmlsbCIsIjAiKTsKKyAgICAgICAgICAgIHBvbHlTdHlsZS5hcHBlbmRDaGlsZChlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGUgPSBLbWxEb2MuY3JlYXRlQXR0cihfZG9jLCJmaWxsIiwiMSIpOworICAgICAgICAgICAgcG9seVN0eWxlLmFwcGVuZENoaWxkKGUpOworICAgICAgICAgICAgZSA9IEttbERvYy5jcmVhdGVBdHRyKF9kb2MsImNvbG9yIixjb2xvcik7ICAgICAgICAKKyAgICAgICAgICAgIHBvbHlTdHlsZS5hcHBlbmRDaGlsZChlKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQWRkIEJhbG9vblN0eWxlIHRvIHRoZSBTdHlsZSBzZWN0aW9uCisgICAgICogPHByZT4KKyAgICAgKiAgICA8QmFsbG9vblN0eWxlPiAgICAgIAorICAgICAgICAgICAgPGJnQ29sb3I+ZmZmZmZmYmI8L2JnQ29sb3I+ICAgICAgCisgICAgICAgICAgICA8dGV4dD48IVtDREFUQVsKKyAgICAgICAgICAgICAgIDxiPjxmb250IGNvbG9yPSIjQ0MwMDAwIiBzaXplPSIrMyI+JFtuYW1lXTwvZm9udD48L2I+CisgICAgICAgICAgICAgICA8YnIvPjxici8+CisgICAgICAgICAgICAgICA8Zm9udCBmYWNlPSJDb3VyaWVyIj4kW2Rlc2NyaXB0aW9uXTwvZm9udD4KKyAgICAgICAgICAgICAgIDxici8+PGJyLz4gICAgCisgICAgICAgICAgICAgICBdXT4KKyAgICAgICAgICAgICA8L3RleHQ+CisgICAgICAgICA8L0JhbGxvb25TdHlsZT4KKyAgICAgKiA8L3ByZT4KKyAgICAgKiBAcGFyYW0gY29sb3IgIEtNTCBjb2xvcgorICAgICAqIEBwYXJhbSBvdXRsaW5lIHRydWUgaWYgb3V0bGluZSBvcHRpb24gdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYWxsb29uU3R5bGUoKSB7CisgICAgICAgIEVsZW1lbnQgYmFsbG9vblN0eWxlID0gX2RvYy5jcmVhdGVFbGVtZW50KCJCYWxsb29uU3R5bGUiKTsgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgX3N0eWxlLmFwcGVuZENoaWxkKGJhbGxvb25TdHlsZSk7CisgICAgICAgIEVsZW1lbnQgZSA9IG51bGw7CisgCisgICAgICAgIFN0cmluZyB0ZXh0ID0gIjxiPjxmb250IGNvbG9yPVwiI0NDMDAwMFwiIHNpemU9XCIrM1wiPiRbbmFtZV08L2ZvbnQ+PC9iPiBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICI8YnIvPjxici8+IFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgIjxmb250IGZhY2U9XCJDb3VyaWVyXCI+JFtkZXNjcmlwdGlvbl08L2ZvbnQ+IFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgIjxici8+PGJyLz4gIjsgCisKKyAgICAgICBlID0gS21sRG9jLmNyZWF0ZUNEYXRhQXR0cihfZG9jLCJ0ZXh0Iix0ZXh0KTsKKyAgICAgICBiYWxsb29uU3R5bGUuYXBwZW5kQ2hpbGQoZSk7CisgICAgfQorfSAvLyBlbmQgY2xhc3MKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvc2VydmxldC9CQm94U2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9zZXJ2bGV0L0JCb3hTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3YzM5NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvc2VydmxldC9CQm94U2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uuc2VydmxldDsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworCisvKioKKyAqIFNlcnZsZXQgdGhhdCBwcm92aWRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGFsbG93cyB0aGUgY2xpZW50IHRvIAorICogZ2V0IHRoZSBCQm94IGluZm8gdGhhdCB3YXMgc2VudCB0byBTbGlkZVNob3dTZXJ2bGV0IGJ5IEdvb2dsZUVhcnRoLiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBCQm94U2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKwkKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX0JCT1ggPSAKKwkJICAgICItNzUuMjA2Mzc4NjU3NzU4MDgsNDAuMTk0NTM4NTk2ODI2NjEsIiArCisJCQkiLTY4Ljc2OTkyMDc5NTUxMyw0My45NDkzMDkxNDY5NDQ2NCI7CQorICAvKioKKyAgKiBTZXJ2aWNlIGludGVyZmFjZS4gCisgICogLSBCQm94IC0gU2VuZCBiYWNrIHRoZSBHRSBCQm94IGluZm8KKyAgKiAKKyAgKiAKKyAgKiBAc2VlIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldCNzZXJ2aWNlKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QsIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlKQorICAqLworIHByb3RlY3RlZCB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgCisgICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworIAkKKwkJRGF0YUlucHV0U3RyZWFtIGluID0gCisJCQluZXcgRGF0YUlucHV0U3RyZWFtKHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKSk7CisJCXJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi9vY3Rlci1zdHJlYW0iKTsKKwkJLy8gdXNlIEJ5dGVBcnJheSBvdXRwdXQKKwkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQorCQlEYXRhT3V0cHV0U3RyZWFtIG91dHB1dCA9CisJCQluZXcgRGF0YU91dHB1dFN0cmVhbShieXRlT3V0cHV0KTsKKwkJLy8KKwkJLy8gcmVhZCB0aGUgaW5wdXQgZnJvbSB0aGUgY2xpZW50CisJCS8vCisJCVN0cmluZyBjb21tYW5kID0gaW4ucmVhZFVURigpOworCQkvLyBCQk9YIHNlcnZsZXRJRCAKKwkJCisJCWlmIChjb21tYW5kLnN0YXJ0c1dpdGgoIkJCT1ggIikpIHsKKwkJCVN0cmluZyBpZCA9IGNvbW1hbmQuc3Vic3RyaW5nKDUpLnRyaW0oKTsKKwkJCVNsaWRlU2hvd0luZm8gaW5mbyA9IFNsaWRlU2hvd1NlcnZsZXQuZ2V0SW5mbyhpZCk7CisJCQkvL1NsaWRlU2hvd1NlcnZsZXQuZGVidWcoImlkOiAiK2lkKyIgaW5mbzogIitpbmZvKTsKKwkJCQorCQkJaWYgKGluZm8gIT0gbnVsbCkKKwkJCSAgICBvdXRwdXQud3JpdGVVVEYoIkJCT1g6ICIraW5mby5nZXRCQk9YKCkpOworCQkJZWxzZSAKKwkJCQlvdXRwdXQud3JpdGVVVEYoIkJCT1g6ICIrREVGQVVMVF9CQk9YKTsKKwkJCisJCX0gZWxzZSB7CisJCQlTdHJpbmcgZXJybXNnID0gIkVycm9yOiBSZWNlaXZlZDogIitjb21tYW5kOworCQkJLy9TbGlkZVNob3dTZXJ2bGV0LmRlYnVnKGVycm1zZyk7CisJCQlvdXRwdXQud3JpdGVVVEYoZXJybXNnKTsKKwkJfQorCQlvdXRwdXQuZmx1c2goKTsKKwkJYnl0ZVtdIGJ1ZiA9IGJ5dGVPdXRwdXQudG9CeXRlQXJyYXkoKTsKKwkJcmVzcG9uc2Uuc2V0Q29udGVudExlbmd0aChidWYubGVuZ3RoKTsKKwkJU2VydmxldE91dHB1dFN0cmVhbSBzZXJ2bGV0T3V0cHV0ID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7CisJCXNlcnZsZXRPdXRwdXQud3JpdGUoYnVmKTsKKwkJc2VydmxldE91dHB1dC5jbG9zZSgpOworCQkKKwl9CisJCisgICAgCisJCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHJpdmF0ZSB2b2lkIGVyckh0bWwoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIG1zZykKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKKwkJUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyKHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKTsKKwkJb3V0LnByaW50bG4oIjxodG1sPiIpOworCQlvdXQucHJpbnRsbigiPGhlYWQ+PHRpdGxlPkJCb3hTZXJ2bGV0IEVycm9yPC90aXRsZT48L2hlYWQ+Iik7CisJCW91dC5wcmludGxuKCI8Ym9keT4iKTsKKwkJb3V0LnByaW50bG4oIjxwPiIgKyBtc2cgKyAiPC9wPiIpOworCQlvdXQucHJpbnRsbigiPC9ib2R5PjwvaHRtbD4iKTsKKwkJb3V0LmZsdXNoKCk7CisJfQorCQorCisKK30KKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3NlcnZsZXQvSW1hZ2VTZXJ2bGV0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3NlcnZsZXQvSW1hZ2VTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0NGIzNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvc2VydmxldC9JbWFnZVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnNlcnZsZXQ7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CitpbXBvcnQgamF2YS5hd3QuRm9udDsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOworaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7CitpbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKKy8qKgorICogU2VydmxldCB0aGF0IHJldHVybnMgYSBwbmcgaW1hZ2UgY29udGFpbmluZyB0aGUgCisgKiBzcGVjaWZpZWQgdGV4dCBzdHJpbmcuIAorICogVGhpcyBidWlsZHMgYSBQTkcgaW1hZ2UgYmFzZWQgb24gc3BlY2lmaWVkIHBhcmFtZXRlcnM6CisgKiAgIHRleHQ9CisgKiAgIAorICogV29ya3MgZm9yIFRvbWNhdCBvbiBXaW5kb3dzIGJ1dCBvbiBvdGhlciBwbGF0Zm9ybXMKKyAqIEl0IG1heSByZXF1aXJlIHRoZSBmb2xsb3dpbmcgZm9yIHRoZSB3ZWJzZXJ2ZXIKKyAqICAtRGphdmEuYXd0LmhlYWRsZXNzPXRydWUKKyAqCisgKgorICovCitwdWJsaWMgY2xhc3MgSW1hZ2VTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCQorCQorICAgIC8vCSBnZXQgdGhlIHBhcm1zIGZyb20gdGhlIFVSTCBwYXJhbWV0ZXJzLgorCS8vIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbWFnZT90ZXh0PXN0cmluZworCXByaXZhdGUgU3RyaW5nIHRleHQ9IkRFRkFVTFQiOworCXByaXZhdGUgaW50IHRleHRzaXplID0gMTQ7CisJcHJpdmF0ZSBTdHJpbmcgZmMgPSAiI2ZmZmZmZiI7CisJcHJpdmF0ZSBTdHJpbmcgYmMgPSAiIzAwMDAwMCI7CisJcHJpdmF0ZSBpbnQgaCA9IDMyOworICAgIGludCB3ID0gMDsKKyAgICBwcml2YXRlIFN0cmluZyBmb250TmFtZSA9ICJTYW5zLXNlcmlmIjsKKyAgICAKKyAgICAvKiogCisgICAgICogaGFuZGxlIGRvUG9zdCBzYW1lIGFzIGRvR2V0CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIAorICAgICAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAJZG9HZXQocmVxdWVzdCxyZXNwb25zZSk7CisgICAgfQorCS8qKgorCSAqICBQcm9jZXNzIHRoZSBVUkwgY29tbWFuZCAKKwkgKiAgCisJICogIFRoZSBmb2xsb3dpbmcgYXJlIHBpY2tlZCB1cCBmcm9tIHRoZSBVUkwKKwkgKiAgIGh0dHA6Ly9zeXN0ZW0vU2xpZGVTaG93L2ltYWdlP3RleHQ9QSUyMFN0cmluZyZoPWhlaWdodCZ3PXdpZHRoCisJICogIAorCSAqICB0ZXh0ICBUaGUgU3RyaW5nIHRvIGJlIHNob3duIGluIHJlc3VsdGluZyBpbWFnZQorCSAqICBoICAgICBIZWlnaHQgb2YgaW1hZ2UgaW4gcGl4ZWxzCisJICogIHcgICAgIFdpZHRoIG9mIGltYWdlIGluIHBpeGVscworCSAqICBiYyAgICAgQmFja2dyb3VuZCBjb2xvciAgIChibGFjaykKKwkgKiAgZmMgICAgIEZvcmVncm91bmQgKHRleHQpIGNvbG9yICh3aGl0ZSkKKwkgKiAgCisJICogIC0gY291bGQgYmUgZW5oYW5jZWQgdG8gYWxzbyBkbyB0aGUgZm9sbG93aW5nCisJIAorCSAqICBmb250ICAgRm9udCBuYW1lICggU2FuLVNhcmlmICkKKwkgKiAgc2l6ZSAgIFRleHRTaXNlIGZvciBmb250ICgxNCkgCisJICogIHR5cGUgICBJbWFnZSBUeXBlIChwbmcpCisJICogIAorCSAqICAKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKwkJCUh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgCisJCUVudW1lcmF0aW9uIGUgPSByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7CisJCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOworCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZylyZXF1ZXN0LmdldFBhcmFtZXRlcihuYW1lKTsKKwkJCS8vZGVidWcobmFtZSsiPSIrdmFsdWUpOworCQkJaWYgKG5hbWUuZXF1YWxzKCJ0ZXh0IikpIHsKKwkJCQl0ZXh0ID0gdmFsdWU7CisJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJ3IikpIHsKKwkJCQl3ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CQkJCQorCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFscygiaCIpKSB7CisJCQkJaCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworCQkJCQorCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFscygiYmMiKSkgeworCQkJCWJjID0gdmFsdWU7CisJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJmYyIpKSB7CisJCQkJZmMgPSB2YWx1ZTsKKwkJCX0KKwkJfQorCQlCdWZmZXJlZEltYWdlIGltYWdlID0gZ2V0SW1hZ2UoKTsKKwkJaWYgKGltYWdlID09IG51bGwpIHsKKwkJCWVyckh0bWwocmVzcG9uc2UsICJVbmFibGUgdG8gY3JlYXRlIGltYWdlLiIpOworCQl9CisJCXJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJpbWFnZS9wbmciKTsKKwkJT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOworCQlJbWFnZUlPLndyaXRlKGltYWdlLCAicG5nIiwgb3V0cHV0U3RyZWFtKTsKKwkJb3V0cHV0U3RyZWFtLmNsb3NlKCk7CisJfQorCQorCS8qKgorCSAqIGNyZWF0ZSBhIEJ1ZmZlcmVkIEltYWdlIGJhc2VkIG9uIHRoZSAKKwkgKiBwYXJhbWV0ZXJzIGdhdGhlcmVkIGZyb20gdGhlIHJlcXVlc3QuCisJICogCisJICogQHJldHVybiAgcG5nIGltYWdlCisJICovCisJcHVibGljIEJ1ZmZlcmVkSW1hZ2UgZ2V0SW1hZ2UoKSB7CQorCQlCdWZmZXJlZEltYWdlIGltYWdlID0gbnVsbDsKKwkJLy8gc2V0IGRlZmF1bHRzCisJCUZvbnQgZm9udCA9IG5ldyBGb250KGZvbnROYW1lLCBGb250LkJPTEQsIHRleHRzaXplKTsKKyAgICAgICAgLy8JIGRlZmF1bHQgd2lkdGggaXMgOCBwaXhlbHMgcGVyIGNoYXIgKyBtYXJnaW4KKwkJaWYgKHcgPT0gMCkKKwkJICAgIHcgPSAodGV4dC5sZW5ndGgoKSsyKSo4OworCQkKKwkJaW50IHRleHRDb2xvciA9IDA7CisJCWludCBpbWFnZUNvbG9yID0gMDsKKwkJdHJ5IHsgCisJICAgICAgICAgaWYgKGZjLnN0YXJ0c1dpdGgoIiMiKSkgCisJICAgICAgICAJIGZjID0gZmMuc3Vic3RyaW5nKDEpOworCSAgICAgICAgIHRleHRDb2xvciA9IChpbnQpKExvbmcucGFyc2VMb25nKGZjLCAxNikgJiAweDBmZmZmZmZmKTsKKwkgICAgICAgICBpZiAoYmMuc3RhcnRzV2l0aCgiIyIpKSAKKwkgICAgICAgIAkgYmMgPSBiYy5zdWJzdHJpbmcoMSk7CisJICAgICAgICAgaW1hZ2VDb2xvciA9IChpbnQpKExvbmcucGFyc2VMb25nKGJjLCAxNikgJiAweDBmZmZmZmZmKTsKKwkgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwKSB7IAorCSAgICAJZGVidWcoInRleHRDb2xvcj0iK3RleHRDb2xvcik7CisJCSAgICBkZWJ1ZygiaW1hZ2VDb2xvcj0iK2ltYWdlQ29sb3IpOworCSAgICAJZGVidWcoIkludmFsaWQgdGV4dCBvciBpbWFnZSBjb2xvci4iLGV4Y2VwKTsKKwkgICAgCXJldHVybiBudWxsOworCSAgICB9CisJICAgIAorCQl0cnkgeworCQkJaW1hZ2UgPSBuZXcgQnVmZmVyZWRJbWFnZSh3LCBoLAorCQkJCQlCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQik7CisJCQlmb3IgKGludCBpPTA7aTx3O2krKykgeworCQkJCWZvciAoaW50IGo9MDtqPGg7aisrKSB7CisJCQkJCWltYWdlLnNldFJHQihpLGosaW1hZ2VDb2xvcik7CisJCQkJfQorCQkJfQorCQkJR3JhcGhpY3MyRCBnID0gaW1hZ2UuY3JlYXRlR3JhcGhpY3MoKTsKKwkJCS8vIGFkZCB0ZXh0IHN0cmluZworCQkJQ29sb3IgYyA9IG5ldyBDb2xvcih0ZXh0Q29sb3IsICgoKHRleHRDb2xvciA+PiAyNCkgJiAweGZmKSAhPSAwKSk7CisJCQlnLnNldENvbG9yKGMpOwkJCisJCQlnLnNldEZvbnQoZm9udCk7CisJCQlnLmRyYXdTdHJpbmcodGV4dCwgdGV4dHNpemUgLyAyLCAodGV4dHNpemUgKiA1KSAvIDQpOworCisJCQlnLmRpc3Bvc2UoKTsKKwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCQkKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gaW1hZ2U7CisJfQorCQorCXByaXZhdGUgdm9pZCBlcnJIdG1sKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIFN0cmluZyBtc2cpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7CisJCVByaW50V3JpdGVyIG91dCA9IG5ldyBQcmludFdyaXRlcihyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSk7CisJCW91dC5wcmludGxuKCI8aHRtbD4iKTsKKwkJb3V0LnByaW50bG4oIjxoZWFkPjx0aXRsZT5LTUwgU2xpZGVTaG93IEVycm9yPC90aXRsZT48L2hlYWQ+Iik7CisJCW91dC5wcmludGxuKCI8Ym9keT4iKTsKKwkJb3V0LnByaW50bG4oIjxwPiIgKyBtc2cgKyAiPC9wPiIpOworCQlvdXQucHJpbnRsbigiPC9ib2R5PjwvaHRtbD4iKTsKKwkJb3V0LmZsdXNoKCk7CisJfQorCQorICAgIC8qKgorICAgICAqIHByaW50IGRlYnVnIG1lc3NhZ2VzIHRvIHRoZSBzZXJ2ZXIgbG9nLgorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKi8KKwlwcml2YXRlIHZvaWQgZGVidWcoU3RyaW5nIG1zZykgeworCQlpZiAoU2xpZGVTaG93U2VydmxldC5ERUJVRykgeworCQkgIAorCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiSW1hZ2VTZXJ2bGV0OiAiK21zZyk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGRlYnVnKFN0cmluZyBtc2csVGhyb3dhYmxlIGUpIHsKKwkJCisJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOworCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkKKwl9Cit9CisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9zZXJ2bGV0L1NsaWRlU2hvd0luZm8uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvc2VydmxldC9TbGlkZVNob3dJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1YTY3ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvc2VydmxldC9TbGlkZVNob3dJbmZvLmphdmEKQEAgLTAsMCArMSwyMTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5zZXJ2bGV0OworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworLyoqCisgKiBDbGFzcyB0byBob2xkIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IGEgCisgKiBTbGlkZVNob3dTZXJ2bGV0IHNlc3Npb24KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTbGlkZVNob3dJbmZvIHsKKyAgIAorCXByaXZhdGUgU3RyaW5nIF9rZXkgPSAiS2V5IjsKKwkKKwlwcml2YXRlIGludCBfY291bnRlciA9IDA7CisJCisJLyoqCisJICogYnVpbHQgaW4gZGVsYXkgb24gcmVxdWVzdHMKKwkgKi8KKwlwcml2YXRlIGxvbmcgX2RlbGF5ID0gMjAwMDsKKwkKKwlwcml2YXRlIEZpbGVbXSBfZmlsZXMgPSBudWxsOworCQorCXByaXZhdGUgYm9vbGVhbiBfd2FpdEZvcktNTCA9IGZhbHNlOworCQorCXByaXZhdGUgU3RyaW5nIF9mb2xkZXJOYW1lID0gIiI7CisJCisJcHJpdmF0ZSBib29sZWFuIHBhdXNlID0gZmFsc2U7CisJCisJcHJpdmF0ZSBTdHJpbmdbXSBpbnNlcnQgPSBudWxsOworCQorCXByaXZhdGUgU3RyaW5nICAgX2ZpbGVOYW1lID0gbnVsbDsKKwkKKwlwcml2YXRlIFN0cmluZyAgIF9CQk9YID0gbnVsbDsKKwkvKioKKwkgKiB1c2UgZm9yIGNsZWFudXAgLSBmdXR1cmUKKwkgKi8KKwlwcml2YXRlIGxvbmcgdGltZUxhc3RVc2VkID0gMDsKKwkvKioKKwkgKiBjcmVhdGUgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgdmFsdWVzIHB1bGxlZCBmcm9tIFVSTAorCSAqIAorCSAqIEBwYXJhbSBrZXkgIHBzZXVkbyBzZXNzaW9uIGtleQorCSAqIEBwYXJhbSBmb2xkZXIgZm9sZGVyIG5hbWUgY29udGFpbmluZyBLTUwgZmlsZXMKKwkgKiBAcGFyYW0gd2FpdCBpZiB0cnVlIHRoZW4gd2FpdCBmb3IgbmV3IEtNTCB3aGVuIAorCSAqICAgICAgICBubyBtb3JlIGZpbGVzIGluIGxpc3QuCisJICogQHBhcmFtIGZpbGUgU2luZ2xlIGZpbGUgdG8gYmUgcmVwZWF0YWJseSBwcm9jZXNzZWQKKwkgKiBAcGFyYW0gZGVsYXkgaW4gc2Vjb25kcyBiZXR3ZWVuIHJlcXVlc3QgcHJvY2Vzc2luZworCSAqLworCXB1YmxpYyBTbGlkZVNob3dJbmZvKFN0cmluZyBrZXksIFN0cmluZyBmb2xkZXIsIGJvb2xlYW4gd2FpdCwgCisJCQkgICAgICAgICAgICAgU3RyaW5nIGZpbGUsIFN0cmluZyBkZWxheSkgeworCQlfa2V5ID0ga2V5OworCQlfY291bnRlciA9IC0xOyAgLy8gc28gZmlyc3QgZmlsZSB3aWxsIGJlIDAKKwkJX2ZpbGVzID0gbnVsbDsKKwkJX2ZvbGRlck5hbWUgPSBmb2xkZXI7CisJCV93YWl0Rm9yS01MID0gd2FpdDsKKwkJX2ZpbGVOYW1lID0gZmlsZTsKKwkJX2RlbGF5ID0gTG9uZy5wYXJzZUxvbmcoZGVsYXkpKjEwMDA7CisJCXRpbWVMYXN0VXNlZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOworCX0KKworCS8qKgorCSAqIGNhbGxlZCB0byBjaGVjayBpZiBpdCBzaG91bGQgYmUgZXhwaXJlZCBhbmQgZGVsZXRlZAorCSAqIGZyb20gdGhlIG1hcCBvZiBvdXRzdGFuZGluZyBlbnRyaWVzCisJICogCisJICogQHJldHVybiB0cnVlIGlmIHNlc3Npb24gc2hvdWxkIGJlIGV4cGlyZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0V4cGlyZWQoKSB7CisJCWxvbmcgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CisJCWxvbmcgdGltZVRvTGl2ZSA9IDI0KjYwKjYwKjEwMDA7ICAvLyAyNCBob3VycworCQlpZiAoKG5vdy10aW1lTGFzdFVzZWQpPnRpbWVUb0xpdmUpIHsKKwkJCXJldHVybiB0cnVlOwkJCQorCQl9CisJCXJldHVybiBmYWxzZTsJCQorCX0KKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBrZXkgdXNlZCB0byBzdG9yZSB0aGlzIGluZm8uCisJICovCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXRpbWVMYXN0VXNlZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOworCQlyZXR1cm4gX2tleTsKKwl9CisJLyoqCisJICogQHJldHVybiB0aGUgX2NvdW50ZXIKKwkgKi8KKwlwdWJsaWMgaW50IGdldENvdW50ZXIoKSB7CisJCQorCQl0aW1lTGFzdFVzZWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKwkJCisJCXJldHVybiBfY291bnRlcjsKKwl9CisJLyoqCisJICogRG8gYSBidWlsdCBpbiBkZWxheSBpZiBuZWVkZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWxheSgpIHsKKwkJbG9uZyBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKwkJaWYgKG5vdyA8IHRpbWVMYXN0VXNlZCtfZGVsYXkpIHsKKwkJCXRyeSB7CisJCQkJVGhyZWFkLnNsZWVwKF9kZWxheSk7CisJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkJCisJCQl9CQkJCisJCX0KKwkJdGltZUxhc3RVc2VkID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CQkKKwkJcmV0dXJuIDsKKwl9CisJLyoqCisJICogQHBhcmFtIF9jb3VudGVyIHRoZSBfY291bnRlciB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb3VudGVyKGludCBfY291bnRlcikgeworCQl0aGlzLl9jb3VudGVyID0gX2NvdW50ZXI7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgX2ZpbGVzCisJICovCisJcHVibGljIEZpbGVbXSBnZXRGaWxlcygpIHsKKwkJcmV0dXJuIF9maWxlczsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gX2ZpbGVzIHRoZSBfZmlsZXMgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0RmlsZXMoRmlsZVtdIF9maWxlcykgeworCQl0aGlzLl9maWxlcyA9IF9maWxlczsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBfZm9sZGVyTmFtZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Rm9sZGVyTmFtZSgpIHsKKwkJcmV0dXJuIF9mb2xkZXJOYW1lOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBuYW1lIHRoZSBfZm9sZGVyTmFtZSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGb2xkZXJOYW1lKFN0cmluZyBuYW1lKSB7CisJCV9mb2xkZXJOYW1lID0gbmFtZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBfd2FpdEZvcktNTAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzV2FpdEZvcktNTCgpIHsKKwkJcmV0dXJuIF93YWl0Rm9yS01MOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBmb3JLTUwgdGhlIF93YWl0Rm9yS01MIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldFdhaXRGb3JLTUwoYm9vbGVhbiBmb3JLTUwpIHsKKwkJX3dhaXRGb3JLTUwgPSBmb3JLTUw7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgcGF1c2UKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1BhdXNlKCkgeworCQlyZXR1cm4gcGF1c2U7CisJfQorCisJLyoqCisJICogQHBhcmFtIHBhdXNlIHRoZSBwYXVzZSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQYXVzZShib29sZWFuIHBhdXNlKSB7CisJCXRoaXMucGF1c2UgPSBwYXVzZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBpbnNlcnQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nW10gZ2V0SW5zZXJ0KCkgeworCQlyZXR1cm4gaW5zZXJ0OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbnNlcnQgdGhlIGluc2VydCB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbnNlcnQoU3RyaW5nW10gaW5zZXJ0KSB7CisJCXRoaXMuaW5zZXJ0ID0gaW5zZXJ0OworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIF9maWxlTmFtZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7CisJCXJldHVybiBfZmlsZU5hbWU7CisJfQorCisJLyoqCisJICogQHBhcmFtIG5hbWUgdGhlIF9maWxlTmFtZSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgbmFtZSkgeworCQlfZmlsZU5hbWUgPSBuYW1lOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIF9CQk9YCisJICovCisJcHVibGljIFN0cmluZyBnZXRCQk9YKCkgeworCQlyZXR1cm4gX0JCT1g7CisJfQorCisJLyoqCisJICogQHBhcmFtIGJib3ggdGhlIF9CQk9YIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJCT1goU3RyaW5nIGJib3gpIHsKKwkJX0JCT1ggPSBiYm94OworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvc2VydmxldC9TbGlkZVNob3dTZXJ2bGV0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3NlcnZsZXQvU2xpZGVTaG93U2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYWQ2YmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3NlcnZsZXQvU2xpZGVTaG93U2VydmxldC5qYXZhCkBAIC0wLDAgKzEsNzYwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uuc2VydmxldDsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworCisvKioKKyAqIFNsaWRlU2hvd1NlcnZsZXQgc2VuZHMgYmFjayBhIHZhbGlkIEtNTCBmaWxlIGZvciBhIEdFVCBvciBQT1NUCisgKiBhY3Rpb24KKyAqIDxwcmU+CisgKiBUaGUgd2F5IHRoYXQgaXQgd29ya3MgaXMgdGhpczoKKyAqICAKKyAqICAgIEEgS01MIGZpbGUgaXMgbGF1bmNoZWQgdG8gR29vZ2xlRWFydGggdGhhdCAKKyAqICAgIGhhcyBhIG5ldHdvcmsgbGluayB3aXRoIHRoZSBmb2xsb3dpbmcgVVJMCisgKiAgICBodHRwOi8vbG9jYWxob3N0OjgwODAvU2xpZGVTaG93L3NsaWRlc2hvdz9pZD08aWQ+JmFtcDtmb2xkZXI9PHBhdGg+CisgKiAgICB3aGVyZSA8aWQ+IGlzIGEgdW5pcXVlIGlkCisgKiAgICAgICAgICA8cGF0aD4gaXMgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAKKyAqICAgICAgICAgICAga21sIGZpbGVzIGdlbmVyYXRlZCBieSBTVEVNLgorICogICAgCisgKiAgICAgR29vZ2xlRWFydGggd2lsbCB0aGVuIGlzc3VlIGh0dHAgR0VUIHJlcXVlc3RzIHdpdGggCisgKiAgICAgdGhlIHNwZWNpZmllZCBVUkwgd2hpY2ggd2lsbCBjYXVzZSB0aGlzIHNlcnZsZXQncyAKKyAqICAgICBkb0dldCgpIG1ldGhvZCB0byBiZSBpbnZva2VkLiAgCisgKiAgICAgCisgKiAgICAgSXQgcmV0cmlldmVzIHRoZSBjb3JyZWN0IGZpbGUgaW4gb25lIG9mIDIgd2F5czoKKyAqICAgICAKKyAqICAgICBUaGUgc2VydmxldCBrZWVwcyBhIG1hcCBvZiBpbmZvIGtleWVkIGJ5IHRoZSA8aWQ+IHRoYXQKKyAqICAgICBoYXMgYSBsaXN0IG9mIGZpbGVzIHRoYXQgd2FzIGZvdW5kIGluIHRoZSBmb2xkZXIgCisgKiAgICAgYW5kIGEgY291bnRlciB0aGF0IGlzIHVzZWQgdG8gc2VuZCBiYWNrIHRoZSBOJ3RoIGZpbGUuCisgKiAgICAgYW5kIGluY3JlbWVudCBOLgorICogICAgIAorICogICAgIElmIGEgZmlsZW5hbWUgd2FzIHNwZWNpZmllZCBpbiB0aGUgVVJMIAorICogICAgICAgaHR0cDovL2xvY2FsaG9zdDo4MDgwL1NURU0vc2xpZGVzaG93Py4uLmZpbGU9PGZpbGVuYW1lPgorICogICAgIHRoZW4gdGhhdCBmaWxlIHdpbGwgYmUgcmVhZCBhbmQgcmV0dXJuZWQgdG8gR0UuCisgKiAgICAgVGhpcyBmaWxlIHdpbGwgYWx3YXlzIGJlIHRoZSBtb3N0IHJlY2VudGx5IGdlbmVyYXRlZCAKKyAqICAgICBLTUwgZmlsZS4gIFRoaXMgd2lsbCBoZWxwIGVuc3VyZSB0aGF0IEdFIGRvZXMgbm90IGZhbGwKKyAqICAgICBiZWhpbmQgdGhlIFNURU0gc2ltdWxhdGlvbi4gIAorICogPC9wcmU+ICAgICAgCisgKiAgICAgICAgICAgICAKKyAqLworcHVibGljIGNsYXNzIFNsaWRlU2hvd1NlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisgICAgLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisgICAKKwkvKioKKwkgKiBVc2VkIGJ5IHRoaXMgYW5kIG90aGVyIHNlcnZsZXRzIHRvIGNvbnRyb2wgZGVidWcgb3V0cHV0CisJICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7CisgICAgCisgICAgLy9wdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUcgPSB0cnVlOworICAgIC8qKgorICAgICAqIGNoYW5nZSB0byB0cnVlIHRvIGNhdXNlIG91dHB1dCB0byBiZSBzZW50IHRvIGNvbnNvbGUgaW5zdGVhZCAKKyAgICAgKiBvZiBHRQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVEVTVCA9IGZhbHNlOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKyAgICAvKioKKyAgICAgKiBTZXJ2bGV0IGNvbnRleHQuICAKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUID0gIlNURU0iOworICAgIC8qKgorICAgICAqIGRlZmF1bHQgZm9sZGVyIGZvciBLTUwgZmlsZXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVNX0ZPTERFUiA9ICJjOlxcdG1wXFxnZSI7CisgICAgCisgICAgLyoqCisgICAgICogY29sbGVjdGlvbiBvZiBpbmZvcm1hdGlvbiBhYm91dCBhIHNlc3Npb24KKyAgICAgKiBLZXkgPSBpZCBwYXNzZWQgdG8gc2VydmxldCAKKyAgICAgKiAKKyAgICAgKi8gICAgICAgCisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsU2xpZGVTaG93SW5mbz4gX2luZm9NYXAgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIHNldCB0cnVlIHdoZW4gd2UgZ2V0IGEgcmVxdWVzdCB0aGF0IG9ubHkgc2V0cyB0aGUgQkJveCBpbmZvCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGJib3hTZXQgPSBmYWxzZTsgICAgCisgICAgLyoqCisgICAgICogIEhhbmRsZSB0aGUgaW5pdGlhbCBzZXR1cCAKKyAgICAgKi8KKwlwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisJCSAgICBzdXBlci5pbml0KGNvbmZpZyk7CisJCSAgICAvL2RlYnVnKCJpbml0OiBEZWZhdWx0IGZvbGRlcj0iK1NURU1fRk9MREVSKTsJCSAKKwkJICAgCisJCSAgICBfaW5mb01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxTbGlkZVNob3dJbmZvPigpOwkJICAgIAorCQkgICAgCisJIH0KKyAgICAKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQjZG9HZXQoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCwgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UpCisJICovCisJcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQkKKwkJZG9Qb3N0KHJlcXVlc3QsIHJlc3BvbnNlKTsKK30KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldCNkb1Bvc3QoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCwgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIAorICAgICAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAJCQkKKwkJaW50IGNvdW50ZXIgPSAwOworCQkJICAgIAorCSAgICBTdHJpbmcgZmlsZU5hbWUgPSBudWxsOworCQlTbGlkZVNob3dJbmZvIGluZm8gPSBudWxsOworCQkKKwkJRmlsZVtdIGZpbGVzID0gbnVsbDsKKwkJCisJCXRyeSB7CisJCQkvLyBnZXQgaW5mbyBmcm9tIHVybAorCQkJaW5mbyA9IGdldFBhcmFtZXRlcnMocmVxdWVzdCk7CisJCQlTdHJpbmcga2V5ID0gaW5mby5nZXRLZXkoKTsKKwkJCWlmIChiYm94U2V0KSB7CisJCQkJLy8gVGhpcyB3YXMgYSByZXF1ZXN0IHRvIHJldHVybiBCQk9YIG9ubHkKKwkJCQlwcm9jZXNzTm9PcChyZXF1ZXN0LHJlc3BvbnNlKTsKKwkJCX0KKwkJCS8vIG1ha2Ugc3VyZSB0aGVyZSBpcyBzb21lIGRlbGF5IGJldHdlZW4gcmVxdWVzdHMKKwkJCWluZm8uZGVsYXkoKTsJCQkKKwkJCWZpbGVOYW1lID0gaW5mby5nZXRGaWxlTmFtZSgpOworCQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsJCisJCQkJLy8gZ2V0IGEgc3BlY2lmaWMgZmlsZQorCQkJCQorCQkJCXByb2Nlc3NGaWxlKHJlcXVlc3QscmVzcG9uc2UsaW5mbyxmaWxlTmFtZSk7IAorCQkJCXJldHVybjsKKwkJCX0gZWxzZSB7CisJCQkgIC8vIGdldCBzYXZlZCBsaXN0IG9mIGZpbGVzCQorCQkJICBmaWxlcyA9IGluZm8uZ2V0RmlsZXMoKTsKKwkJCSAgLy8gaWYgbmV2ZXIgZmlsbGVkIGluCisJCQkgIGlmIChmaWxlcyA9PSBudWxsKSB7CisJCQkJICAvLyBnZXQgdXBkYXRlZCBsaXN0IG9mIGZpbGVzCisJCQkJIGZpbGVzID0gZ2V0RmlsZXMoaW5mbyk7CisJCQkgIH0KKwkJCQorCQkJfSAKKwkJCWNvdW50ZXIgPSBnZXRDb3VudGVyKHJlcXVlc3QscmVzcG9uc2UsaW5mbyk7CisJCQkvLyBnZXRDb3VudGVyIHdpbGwgaGF2ZSB1cGRhdGVkIGluZm8uZ2V0RmlsZXMKKwkJCWZpbGVzID0gaW5mby5nZXRGaWxlcygpOyAvLyBhZGRlZCBmaWxlcwkJCQorCQkJaWYgKGZpbGVzLmxlbmd0aCA9PSAwKSB7CisJCQkJLy8gaWYgbm8gLmttbCBmaWxlcyBpbiBmb2xkZXIKKwkJCQlpZiAoaW5mby5pc1dhaXRGb3JLTUwoKSkgeworCQkJCQlzZW5kU2NyZWVuT3ZlcmxheShyZXF1ZXN0LCByZXNwb25zZSwgIldhaXRpbmcgdG8gU3RhcnQiKTsKKworCQkJCX0gZWxzZSB7CisJCQkJCXJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULAorCQkJCQkiTm8gS01MIGZpbGVzIGluIHNwZWNpZmllZCBmb2xkZXIuIik7CisJCQkJfQorCQkJCXJldHVybjsKKwkJCX0JCisJCQlGaWxlIGttbEZpbGUgPSBmaWxlc1tjb3VudGVyXTsKKy8vCQkJU3RyaW5nIHByaW50ID0gImtleTogIitrZXkrIiBDb3VudGVyOiAiICsgY291bnRlciArCisvLwkJCSIgYWRkcjogIiArIHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpICsgIjoiK3JlcXVlc3QuZ2V0U2VydmVyUG9ydCgpKworLy8JCQkiICNmaWxlczogIitmaWxlcy5sZW5ndGggKworLy8JCQkiIGttbEZpbGU6ICIra21sRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKwkJCS8vZGVidWcocHJpbnQpOworCQkJZGVidWcoIlNlbmQgdG8gR0U6ICIra21sRmlsZSk7CisJCQkKKwkJCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGttbEZpbGUpOworCQkJLy8gaW5zZXJ0IGlzIGFkZGl0aW9hbCBLTUwgdG8gYmUgc2VudCB3aXRoIG91dHB1dAorCQkJU3RyaW5nW10gaW5zZXJ0ID0gaW5mby5nZXRJbnNlcnQoKTsKKwkJCQorCQkJc2VuZE91dHB1dChyZXF1ZXN0LHJlc3BvbnNlLCBmaXMsaW5zZXJ0ICk7CisJCQlpbmZvLnNldENvdW50ZXIoY291bnRlcik7CisJCQlfaW5mb01hcC5wdXQoa2V5LCBpbmZvKTsKKwkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsJCQkKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisJCQkJCWUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKworCQorICAgIC8qKgorICAgICAqIEdldCB0aGUgY291bnRlciB0aGF0IGtlZXBzIHRyYWNrIG9mIHdoaWNoIGZpbGUKKyAgICAgKiBpcyB0byBiZSBwcm9jZXNzZWQgbmV4dC4KKyAgICAgKiAKKyAgICAgKiBJdCBkb2VzIG1vcmUgdGhhdG4ganVzdCBnZXQgdGhlIG5leHQgdmFsdWUgZm9yIHRoZSBjb3VudGVyLAorICAgICAqIGl0IHdpbGwgY2hlY2sgaWYgdGhlcmUgYXJlIG1vcmUgZmlsZXMgdG8gcHJvY2VzcyBhbmQgaWYgbm90CisgICAgICogZG8gdGhlIGhhbmRsaW5nIG9mIHRoaXMgY2FzZS4gIAorICAgICAqIAorICAgICAqIEBwYXJhbSByZXF1ZXN0ICBTZXJ2bGV0UmVxdWVzdAorICAgICAqIEBwYXJhbSByZXNwb25zZSBTZXJ2bGV0UmVzcG9uc2UKKyAgICAgKiBAcGFyYW0gaW5mbyAgIGluc3RhbmNlIG9mIGluZm9ybWF0aW9uIHNhdmVkIGZyb20gc3RlcCB0byBzdGVwCisgICAgICogQHJldHVybiBOIHdoZXJlIHdlIHdhbnQgdG8gZGlzcGxheSB0aGUgTnRoIGZpbGUKKyAgICAgKiAgICAgICAgICAgZnJvbSB0aGUgc3BlY2lmaWVkIGZvbGRlci4gIAorICAgICAqICAgICAgICAgICAwIGlmIHN0YXJ0aW5nIG92ZXIgCisgICAgICogICAgICAgICAgIAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgc3luY2hyb25pemVkIAorICAgIHByaXZhdGUgaW50IGdldENvdW50ZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgCQkgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgIAkJICAgICAgICAgICAgICAgU2xpZGVTaG93SW5mbyBpbmZvKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9ueworCQkKKwkJaW50IGNvdW50ZXIgPSBpbmZvLmdldENvdW50ZXIoKTsKKwkJY291bnRlcisrOworCQkKKwkJLy8gaWYgZG9uZSBhbGwgb2YgZmlsZXMgY3VycmVudGx5IGluIGxpc3QKKwkJaW50IHdhaXRzID0gMTA7IC8vIHdhaXQgZm9yIDEwIHNlY29uZHMKKwkJaW50IG1heCA9IGluZm8uZ2V0RmlsZXMoKS5sZW5ndGg7CisJCXdoaWxlICh0cnVlKSB7CisJCSAgCisJCSAgaWYgKGNvdW50ZXIgPj0gbWF4KSB7CisgCQkJIC8vIHJlYWNoZWQgZW5kIG9mIGZpbGVsaXN0CisJCQkKKwkJCWlmIChpbmZvLmlzV2FpdEZvcktNTCgpKSB7CisJCQkJVGhyZWFkLnNsZWVwKDEqMTAwMCk7CisJCQkgICAgaW5mby5zZXRGaWxlcyhudWxsKTsKKwkJCSAgICBnZXRGaWxlcyhpbmZvKTsKKwkJCSAgICBtYXggPSBpbmZvLmdldEZpbGVzKCkubGVuZ3RoOworCQkJICAgIAorCQkJICAgIHdhaXRzLS07CisJCQkgICAgaWYgKHdhaXRzID4gMCkgCisJCQkgICAgCWNvbnRpbnVlOworCQkJICAgIC8vIHdhaXRlZCBhbmQgc3RpbGwgbm8gbW9yZSBmaWxlcworCQkJICAgIC8vIGluZGljYXRlIHRvIHVzZXIgd2UgYXJlIHBhdXNlZAorCQkJICAgIGNvdW50ZXIgPSBtYXgtMTsKKwkJCSAgICBpZiAoISBpbmZvLmlzUGF1c2UoKSkgeworCQkJCQkvLyBpZiB3ZSBoYXZlIG5vdCB5ZXQgY2xhaW1lZCB0byBiZSBwYXVzaW5nCisJCQkgICAgICAgIC8vZGVidWcoInBhdXNlOiAiKTsJCQkJCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgaW5mby5zZXRQYXVzZSh0cnVlKTsJICAgICAgICAKKwkJCSAgICAgICAgLy8gc2VuZCBwYXVzZSBhcyBpY29uIHRvIEdFCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBob3N0ID0gZ2V0SG9zdChyZXF1ZXN0KTsJCQkKKyAgICAJCSAgICAJU3RyaW5nIHVybCA9ICJodHRwOi8vIitob3N0KyIvIisKKyAgICAJCQkJICAgIENPTlRFWFQrIi9pbWFnZT90ZXh0PSIrCisgICAgCQkJCSAgICBVUkxFbmNvZGVyLmVuY29kZSgiUGF1c2VkIiwiVVRGLTgiKTsKKyAgICAJCQkJU3RyaW5nW10gaW5zZXJ0ID0gYnVpbGRTY3JlZW5PdmVybGF5KHVybCk7CisgICAgCQkJCWluZm8uc2V0SW5zZXJ0KGluc2VydCk7CisJCQkgICAgfQorCQkJICAgIGJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQkvLyBwYXVzZSBiZWZvcmUgcmVzdGFydGluZworCQkJCS8vIFRPRE8gcmVtb3ZlIGRlYnVnCisJCQkJZGVidWcoIlBhdXNlIDEwIHNlY29uZHMgYmVmb3JlIHJlc3RhcnRpbmciKTsKKwkJCQlUaHJlYWQuc2xlZXAoMTAqMTAwMCk7CisJCQkJY291bnRlciA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCSAgfSBlbHNlIHsKKwkJCWlmIChpbmZvLmlzUGF1c2UoKSkgeworCQkJCS8vZGVidWcoIkNoYW5nZSBwYXVzZSB0byBhY3RpdmUiKTsKKwkJCQkvLyB3ZSB3ZXJlIHBhdXNlZCBzbyBjaGFuZ2UgaW1hZ2UgdG8gYWN0aXZlCisJCQkJaW5mby5zZXRQYXVzZShmYWxzZSk7CisJCQkJVGhyZWFkLnNsZWVwKDIqMTAwMCk7CisJCQkJU3RyaW5nIGhvc3QgPSBnZXRIb3N0KHJlcXVlc3QpOwkJCQorCQkgICAgCVN0cmluZyB1cmwgPSAiaHR0cDovLyIraG9zdCsiLyIrCisJCQkJICAgIENPTlRFWFQrIi9pbWFnZT90ZXh0PSIrCisJCQkJICAgIFVSTEVuY29kZXIuZW5jb2RlKCJBY3RpdmUiLCJVVEYtOCIpOworCQkgICAgCQorCQkJCVN0cmluZ1tdIGluc2VydCA9IGJ1aWxkU2NyZWVuT3ZlcmxheSh1cmwpOworCQkJCWluZm8uc2V0SW5zZXJ0KGluc2VydCk7CisJCQkgICAgCisJCQl9IAorCQkJYnJlYWs7CisJCSAgfSAKKwkJfSAvLyB3aGlsZSh0cnVlKQorCQkKKwkJcmV0dXJuIGNvdW50ZXI7CQorCQkKKyAgICB9CisgICAgLyoqCisgICAgICogc2VuZCBiYWNrIGFuIGVtcHR5IHJlc3BvbnNlCisgICAgICogCisgICAgICogQHBhcmFtIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UKKyAgICAgKgorICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKwkKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc05vT3AoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisJCQlIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSAKKwkgICAgICAgICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb257CisJCXRyeSB7CisJCQkKKwkJCVByaW50V3JpdGVyIG9zID0gbmV3IFByaW50V3JpdGVyKHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKTsKKwkJCS8vUHJpbnRTdHJlYW0gb3MgPSBTeXN0ZW0ub3V0OworCQkJcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL2tleWhvbGUiKTsKKworCQkJb3MucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+Iik7CisJCQlvcy5wcmludGxuKCI8a21sIHhtbG5zPVwiaHR0cDovL2VhcnRoLmdvb2dsZS5jb20va21sLzIuMFwiPiIpOworCQkJb3MucHJpbnRsbigiPERvY3VtZW50PiIpOwkJCQorCQkJb3MucHJpbnRsbigiPC9Eb2N1bWVudD4iKTsKKwkJCW9zLnByaW50bG4oIjwva21sPiIpOworCisJCQlvcy5mbHVzaCgpOyAKKwkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsJCQkKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsZS5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSByZXF1ZXN0IHRvIHNlcnZlIHVwIGEgc3BlY2lmaWMgZmlsZQorICAgICAqIAorICAgICAqIEBwYXJhbSByZXF1ZXN0CisgICAgICogQHBhcmFtIHJlc3BvbnNlCisgICAgICogQHBhcmFtIGZpbGVOYW1lCisgICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworCQorCXByaXZhdGUgdm9pZCBwcm9jZXNzRmlsZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKwkJCUh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisJCQlTbGlkZVNob3dJbmZvIGluZm8sIFN0cmluZyBmaWxlTmFtZSkgCisJICAgICAgICAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9ueworCQl0cnkgeworCQkJCisJCQlGaWxlIGttbEZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7CQorCQkJU3RyaW5nIG9sZEZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZSgiX0N1cnJlbnQiLCJfT2xkIik7CisJCQlGaWxlIG9sZEZpbGUgPSBuZXcgRmlsZShvbGRGaWxlTmFtZSk7CisJCQlTdHJpbmdbXSBpbnNlcnQgPSBpbmZvLmdldEluc2VydCgpOwkKKwkJCUZpbGVJbnB1dFN0cmVhbSBmaXMgID0gbnVsbDsKKwkJCWludCBjb3VudGVyID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7ICAgICAgICAgICAgCisJCQkgICAgdHJ5IHsKKwkJCSAgICAJaWYgKCEga21sRmlsZS5leGlzdHMoKSApIHsJCQkgICAgCQkKKwkJCSAgICAJCVRocmVhZC5zbGVlcCgyKjEwMDApOworCQkJICAgIAkJY291bnRlcisrOworCQkJICAgIAkJLy8gYWZ0ZXIgMjAgc2Vjb25kcyB1c2Ugb2xkIGZpbGUKKwkJCSAgICAJCWlmIChjb3VudGVyID4gMTApIHsKKwkJCSAgICAJCQlyZW5hbWUob2xkRmlsZSxrbWxGaWxlKTsJCQkgICAgCQkJCisJCQkgICAgCQl9IAorCQkJICAgIAkJY29udGludWU7CisJCQkgICAgCX0KKwkJCQkJZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShrbWxGaWxlKTsJCisJCQkJCS8vZGVidWcoIiBrbWxGaWxlOiAiK2ttbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQkJCQlicmVhazsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewkJCQkJCisJCQkJCWVycm9yKCJwcm9jZXNzRmlsZSBmYWlsZWQiLGUpOworCQkJCQlyZXR1cm47CisJCQkJfQkJCQkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlYnVnKCJTZW5kIHRvIEdFOiAiK2ttbEZpbGUpOworICAgICAgICAgICAgc2VuZE91dHB1dChyZXF1ZXN0LHJlc3BvbnNlLCBmaXMsaW5zZXJ0ICk7CisgICAgICAgICAgIAorICAgICAgICAgICAgcmVuYW1lKGttbEZpbGUsb2xkRmlsZSk7CisgICAgICAgICAgICAKKwkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsJCQkKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsZS5nZXRNZXNzYWdlKCkpOworCQl9CisJfSAgCisJCisJCisJLyoqCisJICogc3dpdGNoIGZpbGVzIGJ5IHJlbmFtaW5nCisJICovCisJcHJpdmF0ZSBib29sZWFuIHJlbmFtZShGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgeworCQl0cnkgeworCQkJaWYgKG5ld0ZpbGUuZXhpc3RzKCkpIAorCQkJCW5ld0ZpbGUuZGVsZXRlKCk7CisgICAKKwkJCW9sZEZpbGUucmVuYW1lVG8obmV3RmlsZSk7CisJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwkvKioKKwkgKiBAcGFyYW0gcmVxdWVzdAorCSAqLworCXByaXZhdGUgU3RyaW5nIGdldEhvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJaW50IHBvcnQgPSByZXF1ZXN0LmdldFNlcnZlclBvcnQoKTsJCSAgICAJCisJCVN0cmluZyBob3N0ID0gcmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCkrIjoiK3BvcnQ7CisJCXJldHVybiBob3N0OworCX0KKwkKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgZmlsZXMgaW4gdGhlIGZvbGRlcgorICAgICAqICAgICAgCisgICAgICogIAorICAgICAqIEBwYXJhbSBpbmZvICBpbnN0YW5jZSB0aGF0IGhvbGRzIG1pc2MgaW5mbyBhYm91dCBzZXNzaW9uCisgICAgICogQHJldHVybiBhcnJheSBvZiBGaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlcgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBGaWxlW10gZ2V0RmlsZXMoU2xpZGVTaG93SW5mbyBpbmZvKSB7CisJCUZpbGVbXSBmaWxlcyA9IG51bGw7CisJCUZpbGUgZm9sZGVyID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWZpbGVzID0gaW5mby5nZXRGaWxlcygpOworCQkJCisJCQlpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5sZW5ndGggPT0gMCkgeworCQkJCWZvbGRlciA9IG5ldyBGaWxlKGluZm8uZ2V0Rm9sZGVyTmFtZSgpKTsJCQkJCisJCQkgICAgZmlsZXMgPSBmaWxlTGlzdChmb2xkZXIpOworCQkJICAgIGlmIChmaWxlcyA9PSBudWxsKQorCQkJCQlmaWxlcyA9IG5ldyBGaWxlWzBdOworCQkJICAgIGluZm8uc2V0RmlsZXMoZmlsZXMpOworCQkJfQorCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKwkJCQorCQkJZXJyb3IoImdldEZpbGVzKCkgZmFpbGVkLiAiLGUpOworCQkJZmlsZXMgPSBuZXcgRmlsZVswXTsKKwkJfSAJCisJCQorCQlyZXR1cm4gZmlsZXM7CQkJCisgICAgfQorICAgIAorLyoqCisgKiBnZXQgdGhlIGxpc3Qgb2YgZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBmb2xkZXIuCisgKiBUaGUgZmlsZXMgd2lsbCBvbmx5IGJlIGZpbGVzIHdpdGggdGhlICIua21sIiAKKyAqIGV4dGVuc2lvbiBhbmQgd2lsbCBiZSBzb3J0ZWQgYnkgZmlsZW5hbWUuCisgKiBBbHNvIG5ldGxpbmsgZmlsZXMgd2lsbCBiZSBmaWx0ZXJlZCBvdXQKKyAqIAorICogQHBhcmFtIGZvbGRlciBEaXJlY3RvcnkgdGhhdCBjb250YWlucyBLTUwgZmlsZXMgdG8gZGlzcGxheQorICogQHJldHVybiBhcnJheSBvZiBzb3J0ZWQgZmlsZW5hbWVzCisgKi8KKyAgIAorICBwcml2YXRlIEZpbGVbXSBmaWxlTGlzdChGaWxlIGZvbGRlcikgeworICAgIAorICAgIEZpbGVGaWx0ZXIgZmYgPSBuZXcgRmlsZUZpbHRlcigpIHsKKwkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZil7CisJCQlpZiAoZi5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJuZXQiKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWlmIChmLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIua21sIikpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX07CQorCQorCUNvbXBhcmF0b3I8PyBzdXBlciBGaWxlPiBjb21wYXJlID0gbmV3IENvbXBhcmF0b3I8RmlsZT4oKSB7CisJCXB1YmxpYyBpbnQgY29tcGFyZShGaWxlIG8xLCBGaWxlIG8yKSB7CisJCQlGaWxlIGYxID0gKEZpbGUpbzE7CisJCQlGaWxlIGYyID0gKEZpbGUpbzI7CisJCQlpbnQgYW5zd2VyID0gZjEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhmMi5nZXROYW1lKCkpOworCQkJcmV0dXJuIGFuc3dlcjsKKwkJfQorCisJfTsKKwkKKwl0cnkgewkJCQkJCQorCQlGaWxlW10gZmlsZXMgPSBmb2xkZXIubGlzdEZpbGVzKGZmKTsKKwkJaWYgKGZpbGVzID09IG51bGwpIHsKKwkJCXJldHVybiBuZXcgRmlsZVswXTsKKwkJfQkJCisJCUFycmF5cy5zb3J0KGZpbGVzLDAsZmlsZXMubGVuZ3RoLGNvbXBhcmUpOworCQlyZXR1cm4gZmlsZXM7CisJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsJCQorCQllLnByaW50U3RhY2tUcmFjZSgpOworCQlyZXR1cm4gbnVsbDsKKwl9CisgIH0KKyAgLyoqCisJICogT2J0YWluIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBmcm9tIHRoZSBVUkwuCisJICogPHByZT4KKwkgKiAgaWQ6ICBBIGtleSB0aGF0IG1ha2VzIHRoaXMgc2Vzc2lvbiB1bmlxdWUKKwkgKiAgICBCZWNhdXNlIEdvb2dsZUVhcnRoIHNldHMgdXAgYSBuZXcgc2Vzc2lvbiBmb3IgZWFjaCAKKyAgICAgKiAgIHJlcXVlc3QsIHdlIGNhbm5vdCB1c2UgdGhlIG5vcm1hbCBTZXJ2bGV0IHNlc3Npb24gCisgICAgICogICBwcm90b2NvbC4gIAorICAgICAqICAgV2Uga2VlcCBhIGhhc2htYXAgb2Ygc2Vzc2lvbiBpbmZvIGtleWVkIGJ5IGFuIElEIHRoYXQgCisgICAgICogICBpcyBwYXNzZWQgaW4gdGhlIFVSTCAKKyAgICAgKiAgCisgICAgICogIGZvbGRlcjogIFdoZXJlIHRvIGZpbmQgdGhlIEtNTCBmaWxlcworICAgICAqICAKKyAgICAgKiAgZGVsYXk6ICAgVGltZSB0byBkZWxheSBiZXR3ZWVuIHJldHVybmluZyBkYXRhCisgICAgICogIAorICAgICAqICB3YWl0OiAgICBJZiAieSIgdGhlbSBpZiBub3cgbmV3IGZpbGVzIHNlbmQgYSAicGF1c2UiIGljb24KKyAgICAgKiAgCisgICAgICogIGZpbGU6ICAgIElmIHNwY2lmaWVkIHRoZW4gcmV0dXJuIHRoZSBzcGVjaWZpZWQgZmlsZQorICAgICAqICAgCisJICogIEJCT1g6ICAgIElmIGZvdW5kIHRoZW4gR0UgaGFzIHJldHVybiB0aGUgY3VycmVudCB2aWV3IGNvb3JkaW5hdGVzCisJICogIAorCSAqICBCQm94U2V0OiBJZiBmb3VuZCB0aGVuIEdFIGhhcyByZXR1cm5lZCBCQk9YIGFuZCBubyBhbnN3ZXIgaXMgCisJICogICAgICAgICAgIHJlcXVpcmVkLiAKKwkgKiAgICAgICAgICAgCisJICogIGlkIGlzIHRoZW4gdXNlZCB0byBhY2Nlc3MgaW5mb01hcCBhbmQKKwkgKiAgYW5kIHJldHVybiBhbiBpbnN0YW5jZSBvZiBTbGlkZVNob3dJbmZvIHdoaWNoIGNvbnRhaW5zIGN1cnJlbnQgCisJICogIGN5Y2xlIGNvdW50ZXIsIGFycmF5IG9mIGZpbGVzIGFuZCBib29sZWFuIHdhaXQgaW5kaWNhdG9yLgorCSAqICBJZiB0aGVyZSBpcyBubyBleGlzdGluZyBlbnRyeSB0aGVuIGl0IGJ1aWxkcyBhIG5ldyAKKwkgKiAgU2xpZGVTaG93SW5mbyBpbnN0YW5jZSBmcm9tIHRoZSB1cmwgcGFyYW1ldGVycyBhbmQgc3RvcmVzIAorCSAqICBpdCBpbiB0aGUgaW5mb01hcC4KKwkgKiAgCisJICogQHBhcmFtIHJlcXVlc3QgIFNlcnZsZXQgcmVxdWVzdCBpbnN0YW5jZS4KKwkgKiBAcmV0dXJuIGluc3RhbmNlIG9mIFNsaWRlU2hvd0luZm8gCisJICovCisJcHJpdmF0ZSBTbGlkZVNob3dJbmZvIGdldFBhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJLy8gZ2V0IHRoZSBpZCBmcm9tIHRoZSBVUkwgcGFyYW1ldGVycy4KKwkJLy8gaHR0cDovL2xvY2FsaG9zdDo4MDgwL3NsaWRlc2hvdz9pZD11c2VyaWRrZXkKKwkJU3RyaW5nIG15a2V5PSJERUZBVUxUIjsKKwkgICAgU3RyaW5nIGZvbGRlck5hbWUgPSBTVEVNX0ZPTERFUjsKKwkgICAgYm9vbGVhbiB3YWl0Rm9yS01MID0gZmFsc2U7CisJICAgIFN0cmluZyBmaWxlTmFtZSA9IG51bGw7CisJICAgIFN0cmluZyBkZWxheSA9ICIyIjsKKwkgICAgU3RyaW5nIGJib3ggPSBudWxsOworCSAgICBiYm94U2V0ID0gZmFsc2U7CisJCUVudW1lcmF0aW9uIGUgPSByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7CisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCVN0cmluZyBuYW1lID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7CisJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKXJlcXVlc3QuZ2V0UGFyYW1ldGVyKG5hbWUpOworCQkJc2IuYXBwZW5kKG5hbWUrIjogIit2YWx1ZSsiICIpOworCQkJaWYgKG5hbWUuZXF1YWxzKCJpZCIpKSB7CisJCQkJbXlrZXkgPSB2YWx1ZTsKKwkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImZvbGRlciIpKSB7CisJCQkJZm9sZGVyTmFtZSA9IHZhbHVlOwkKKwkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImRlbGF5IikpIHsKKwkJCQlkZWxheSA9IHZhbHVlOworCQkJCQorCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFscygid2FpdCIpKSB7CisJCQkJaWYgKHZhbHVlLmVxdWFscygieSIpKSB7CisJCQkJCXdhaXRGb3JLTUwgPSB0cnVlOworCQkJCX0KKwkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImZpbGUiKSkgeworCQkJCWZpbGVOYW1lID0gdmFsdWU7CisJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJCQk9YIikpIHsKKwkJCQliYm94ID0gdmFsdWU7CisJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJiYm94U2V0IikpIHsKKwkJCQliYm94U2V0ID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQkvL2RlYnVnKCJnZXRQYXJhbWV0ZXJzOiAiK3NiLnRvU3RyaW5nKCkpOworCQlTbGlkZVNob3dJbmZvIGluZm8gPSBfaW5mb01hcC5nZXQobXlrZXkpOworCQlpZiAoaW5mbyA9PSBudWxsKSB7CisJCQlpbmZvID0gbmV3IFNsaWRlU2hvd0luZm8obXlrZXksZm9sZGVyTmFtZSx3YWl0Rm9yS01MLAorCQkJCQkgICAgICAgICAgICAgICAgIGZpbGVOYW1lLGRlbGF5KTsJCQkKKwkJfSAKKwkJaWYgKGJib3ggIT0gbnVsbCkKKwkJCWluZm8uc2V0QkJPWChiYm94KTsKKwkJX2luZm9NYXAucHV0KG15a2V5LGluZm8pOworCQlyZXR1cm4gaW5mbzsKKwkJCisJfQorCS8qKgorCSAqIFNlbmQgdGhlIEtNTCBmaWxlIHRvIHRoZSBjYWxsZXIgKEdvb2dsZUVhcnRoKQorCSAqIAorCSAqIElmIFRFU1Q9dHJ1ZSB0aGVuIGl0IHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgYnJvd3NlciAKKwkgKiBmb3IgdGVzdGluZy4KKwkgKiAJCisgICAgICogQHBhcmFtIHJlcXVlc3QgICAKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UKKyAgICAgKiBAcGFyYW0ga21sICBJbnB1dFN0cmVhbSBob2xkaW5nIGZpbGUgY29udGVudHMKKyAgICAgKiBAcGFyYW0gaW5zZXJ0ICBLTUwgdG8gYmUgaW5zZXJ0ZWQgaW4gb3V0cHV0CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHN5bmNocm9uaXplZCAKKyAgICBwcml2YXRlIHZvaWQgc2VuZE91dHB1dChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKwkJCSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCAKKwkJCSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSAga21sLCBTdHJpbmdbXSBpbnNlcnQpIAorCSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgCS8vIHNldCBURVNUPXRydWUgdG8gZ2V0IHJlYWRhYmxlIG91dHB1dCBpbnN0ZWFkIG9mIAorICAgIAkvLyBsYXVuY2hpbmcgYSBLTUwgZmlsZQorICAgIAkgICAgICAKKwkJcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL2tleWhvbGUiKTsKKyAgICAJCisJCQkJCisJCXRyeSB7CisJCQlPdXRwdXRTdHJlYW0gb3MgPSByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKTsJCQkKKwkJCWlmIChURVNUKSB7CisJCQkJb3MgPSBTeXN0ZW0ub3V0OworCQkJfQorCQkJY29weShrbWwsb3MsaW5zZXJ0KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVN0cmluZyBtc2cgPSAiU2xpZGVTaG93U2VydmxldC5zZW5kT3V0cHV0KCkgZmFpbGVkIHdoaWxlIHNlbmRpbmcga21sRmlsZSI7CisJCQllcnJvcihtc2crIlxuIitlLmdldE1lc3NhZ2UoKSxudWxsKTsKKwkJCQorCQl9CisJCQorCX0KKyAgICAvKioKKyAgICAgKiBidWlsZCBhIHNlZ21lbnQgb2YgS01MIHRvIGJlIGluc2VydGVkIGludG8gdGhlIAorICAgICAqIG91dHB1dCB3cml0dGVuIHRvIEdvb2dsZUVhcnRoLgorICAgICAqIAorICAgICAqIEBwYXJhbSB1cmwKKyAgICAgKiBAcmV0dXJuIEtNTCB0byBiZSBpbnNlcnRlZCAKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ1tdIGJ1aWxkU2NyZWVuT3ZlcmxheSggU3RyaW5nIHVybCkgeworCQlTdHJpbmdbXSBpbnNlcnQgPSBuZXcgU3RyaW5nW10gCisJCQl7IjxTY3JlZW5PdmVybGF5IGlkPVwiU3RhdHVzXCI+IiwKKwkJCSAiICAgPGRlc2NyaXB0aW9uPlNURU0gc3RhdHVzPC9kZXNjcmlwdGlvbj4iLAorCQkJICIgICA8bmFtZT5TdGF0dXM8L25hbWU+XG4iLAorCQkJICI8aWNvbj4iLAorCQkJICI8aHJlZj4iLAkJCQorCQkJIHVybCwKKwkJCSAiPC9ocmVmPiIsCisJCQkgIjwvaWNvbj5cbiIsCisJCQkgLy8gZm9sbG93aW5nIHBvc2l0aW9ucyBpbWFnZSB0byBsb29wIGxlZnQKKwkJCSAiPG92ZXJsYXlYWSB4PVwiMFwiIHk9XCIxXCIgeHVuaXRzPVwiZnJhY3Rpb25cIiB5dW5pdHM9XCJmcmFjdGlvblwiLz5cbiIsCisJCQkgIjxzY3JlZW5YWSB4PVwiMFwiIHk9XCIxXCIgeHVuaXRzPVwiZnJhY3Rpb25cIiB5dW5pdHM9XCJmcmFjdGlvblwiLz5cbiIsCisJCQkgLy8gdXNlIGFjdHVhbCBzaXplIG9mIGltYWdlCisJCQkgIjxzaXplIHg9XCIwXCIgeT1cIjBcIiB4dW5pdHM9XCJmcmFjdGlvblwiIHl1bml0cz1cImZyYWN0aW9uXCIvPlxuIiwKKwkJCSAiPC9TY3JlZW5PdmVybGF5PlxuIgkJCQorCQkJIH07CisJCQorCQlyZXR1cm4gaW5zZXJ0OworCX0KKwkvKioKKwkgKiBTZW5kIHRoZSBLTUwgZmlsZSB0byB0aGUgY2FsbGVyIChHb29nbGVFYXJ0aCkKKwkgKiAKKwkgKiAKKwkgKiBAcGFyYW0gcmVzcG9uc2UKKwkgKiBAcGFyYW0gaW5mbworCSAqIEBwYXJhbSBtc2cgQSBzdHJpbmcgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCAKKwkgKiAgICAgIHRvIGFuIGltYWdlIGFuZCBkaXNwbGF5ZWQgYnkgR29vZ2xlRWFydGgKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRTY3JlZW5PdmVybGF5KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorCQkJICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIAorCQkJICAgICAgICAgICAgICAgIFN0cmluZyBtc2cpIAorCSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgCSAgICAJICAgICAgCisJCXJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi9rZXlob2xlIik7CisgICAgCQorCQkJCQorCQl0cnkgeworCQkJU3RyaW5nIGhvc3QgPSBnZXRIb3N0KHJlcXVlc3QpOwkJCQorCQkJU3RyaW5nIHVybCA9ICJodHRwOi8vIitob3N0KyIvIisKKwkJCSAgICAgQ09OVEVYVCsiL2ltYWdlP3RleHQ9IisKKwkJCVVSTEVuY29kZXIuZW5jb2RlKG1zZywiVVRGLTgiKTsKKworCQkJU3RyaW5nW10gaW5zZXJ0ID0gYnVpbGRTY3JlZW5PdmVybGF5KHVybCk7CisKKwkJCVByaW50V3JpdGVyIG9zID0gbmV3IFByaW50V3JpdGVyKHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKTsKKwkJCS8vUHJpbnRTdHJlYW0gb3MgPSBTeXN0ZW0ub3V0OworCQkJcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL2tleWhvbGUiKTsKKworCQkJb3MucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+Iik7CisJCQlvcy5wcmludGxuKCI8a21sIHhtbG5zPVwiaHR0cDovL2VhcnRoLmdvb2dsZS5jb20va21sLzIuMFwiPiIpOworCQkJb3MucHJpbnRsbigiPERvY3VtZW50PiIpOworCQkJZm9yIChpbnQgaT0wOyBpPGluc2VydC5sZW5ndGg7IGkrKykgewkJCQkJCisJCQkJb3MucHJpbnRsbihpbnNlcnRbaV0pOworCQkJfQorCQkJb3MucHJpbnRsbigiPC9Eb2N1bWVudD4iKTsKKwkJCW9zLnByaW50bG4oIjwva21sPiIpOworCisJCQlvcy5mbHVzaCgpOyAKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVN0cmluZyBlbXNnID0gIlNsaWRlU2hvd1NlcnZsZXQuc2VuZFNjcmVlbk92ZXJsYXkoKSBmYWlsZWQgd2hpbGUgd3JpdGluZyBrbWxGaWxlIjsKKwkJCWVycm9yKGVtc2crIlxuIitlLmdldE1lc3NhZ2UoKSxudWxsKTsKKworCQl9CisJCQorCX0KKyAgCisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2xvY2soKSB7CisJCWxvbmcgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCktc3RhcnQ7CisJCXJldHVybiBMb25nLnRvU3RyaW5nKG5vdyk7CisJfQorCisJLyoqCisJICogcmV0dXJuIHRoZSBpbmZvIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleQorCSAqIEBwYXJhbSBrZXkgCisJICogQHJldHVybiBpbnN0YW5jZSBvZiBTbGlkZVNob3dJbmZvCisJICovCisJcHVibGljIHN0YXRpYyBTbGlkZVNob3dJbmZvIGdldEluZm8oU3RyaW5nIGtleSkgeworCQlTbGlkZVNob3dJbmZvIGluZm8gPSBfaW5mb01hcC5nZXQoa2V5KTsKKwkJcmV0dXJuIGluZm87CisJfQorCS8qKgorCSAqIGNvcHkgYSBLTUwgZmlsZSB0byB0aGUgc2VydmxldCByZXNwb25zZSBvdXRwdXQgc3RyZWFtCisJICogYW5kIHBlcmhhcHMgaW5zZXJ0IGFkZGl0aW9uYWwgS01MIHN0YXRlbWVudHMKKwkgKiAKKwkgKiBAcGFyYW0gaXMgS01MIGZpbGUgaW5wdXQKKwkgKiBAcGFyYW0gb3MgU2VydmxldCByZXNwb25zZSBvdXRwdXQgc3RyZWFtCisJICogQHBhcmFtIGluc2VydCBvcHRpb25hbCBzdGF0ZW1lbnRzIHRvIGJlIGluc2VydGVkCisJICogICAgICAgICAgICAgICBhZnRlciB0aGUgPGRvY3VtZW50PiBzdGF0ZW1lbnQuCisJICovCisJcHJpdmF0ZSB2b2lkIGNvcHkoSW5wdXRTdHJlYW0gaXMsIE91dHB1dFN0cmVhbSBvcywgU3RyaW5nW10gaW5zZXJ0KSAKKwkgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCisJCUlucHV0U3RyZWFtUmVhZGVyIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcyk7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzcik7IAorCQlTdHJpbmcgbGluZSA9IG51bGw7CisJCQorICAgICAgICAKKwkJdHJ5IHsKKwkJCQorCQkJd2hpbGUgKHRydWUpIHsKKwkJCQlsaW5lID0gYnIucmVhZExpbmUoKTsKKwkJCQlpZiAobGluZSA9PSBudWxsKQorCQkJCQlicmVhazsKKwkJCQkKKwkJCQlieXRlW10gYnVmZmVyID0gbGluZS5nZXRCeXRlcygpOworCQkJCW9zLndyaXRlKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CisJCQkJaWYgKGluc2VydCE9bnVsbCAmJiAKKwkJCQkJCWxpbmUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCI8ZG9jdW1lbnQ+IikpIHsKKwkJCQkJZm9yIChpbnQgaT0wOyBpPGluc2VydC5sZW5ndGg7IGkrKykgewkJCQkJCQorCQkJCQkJYnVmZmVyID0gaW5zZXJ0W2ldLmdldEJ5dGVzKCk7CisJCQkJCQlvcy53cml0ZShidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJb3MuZmx1c2goKTsKKwkJCW9zLmNsb3NlKCk7CisJCQlpcy5jbG9zZSgpOworCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJCisJCQllcnJvcigiU2xpZGVTaG93U2VydmxldC5jb3B5KCk6IEVycm9yIHdoaWxlIGNvcHlpbmcgS01MIGZpbGUuICIKKwkJCQkJK2UudG9TdHJpbmcoKSxudWxsKTsKKwkJCXRyeSB7CisJCQkJaXMuY2xvc2UoKTsKKwkJCQlvcy5jbG9zZSgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7CisJCQkJLy8gYWxyZWFkeSByZXBvcnRlZCBpdAorCQkJfQorCQl9CisKKyAgICB9CisJCisJICAvKioKKyAgICAgKiBwcmludCBkZWJ1ZyBtZXNzYWdlcyB0byB0aGUgc2VydmVyIGxvZy4KKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICovCisJcHVibGljIHN0YXRpYyB2b2lkIGRlYnVnKFN0cmluZyBtc2cpIHsKKwkJaWYgKERFQlVHKSB7CQkgCisJCSAgU3lzdGVtLm91dC5wcmludGxuKGdldENsb2NrKCkrIiBHRVNlcnZsZXQ6ICIrbXNnKTsKKwkJfQorCX0KKwkgCisJLyoqCisJICogZGVidWcgb3V0cHV0IGZvciBleGNlcHRpb25zCisJICogQHBhcmFtIG1zZworCSAqIEBwYXJhbSBlCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGVycm9yKFN0cmluZyBtc2csVGhyb3dhYmxlIGUpIHsKKwkJLy9sb2cobXNnLGUpOworCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKKwkJaWYgKGUgIT0gbnVsbCkKKwkJCWlmIChERUJVRykJCQkJCisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCWVsc2UgCisJCQkJU3lzdGVtLm91dC5wcmludGxuKGUudG9TdHJpbmcoKSk7CisJCQorCX0KK30gIC8vIGNsYXNzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9zZXJ2bGV0L1N0YXJ0U2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9zZXJ2bGV0L1N0YXJ0U2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjY2I5NDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3NlcnZsZXQvU3RhcnRTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwyNTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5zZXJ2bGV0OworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworCisKKy8qKgorICogU3RhcnRTZXJ2bGV0IHNlbmRzIGJhY2sgYSB2YWxpZCBLTUwgZmlsZSBmb3IgYSBHRVQgb3IgUE9TVAorICogYWN0aW9uIHRoYXQgd2lsbCBnaXZlIEdvb2dsZUVhcnRoIHRoZSBOZXR3b3JrTGluayB0byAKKyAqIHN0YXJ0IHVwIHRoZSBTVEVNIFNsaWRlU2hvdworICogPHByZT4KKyAqIFRoZSB3YXkgdGhhdCBpdCB3b3JrcyBpcyB0aGlzOgorICogICAgVGhlIGludm9raW5nIEhUTUwgd2lsbCBpbnZva2UgdGhpcyBTZXJ2bGV0IHdpdGggdGhlIGZvbGxvd2luZworICogICAgcGFyYW1ldGVyczoKKyAqICAgICAgZm9sZGVyIDxwYXRoPgorICogICAgICB3YWl0ICAgPHkvbj4KKyAqICAgICAgIAorICogICAgVGhlIHNlcnZsZXQgYnVpbGRzIGEgS01MIGZpbGUgdGhhdCBpcyBsYXVuY2hlZCB0byBHb29nbGVFYXJ0aCB0aGF0IAorICogICAgaGFzIGEgbmV0d29ya2xpbmsgd2l0aCB0aGUgZm9sbG93aW5nIFVSTAorICogICAgaHR0cDovL2xvY2FsaG9zdDo4MDgwL1NURU0vc2xpZGVzaG93P2lkPTxpZD4mZm9sZGVyPTxwYXRoPiZ3YWl0PTx3YWl0PgorICogICAgd2hlcmUgPGlkPiBpcyBhIHVuaXF1ZSBpZAorICogICAgICAgICAgPHBhdGg+IGlzIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgCisgKiAgICAgICAgICAgIGttbCBmaWxlcyBnZW5lcmF0ZWQgYnkgU1RFTS4KKyAqICAgICAgICAgIDx3YWl0PiBpcyAieSIgaWYgaXQgc2hvdWxkIHdhaXQgZm9yIG5ldyBmaWxlcyAKKyAqICAgICAgICAgIHRvIGJlIGdlbmVyYXRlZCAgICAKKyAqICAgICBHb29nbGVFYXJ0aCB3aWxsIHRoZW4gaXNzdWUgaHR0cCBHRVQgcmVxdWVzdHMgd2l0aCAKKyAqICAgICB0aGUgc3BlY2lmaWVkIFVSTCAKKyAqICAgICAKKyAqICAgICAgICAgICAgIAorICovCitwdWJsaWMgY2xhc3MgU3RhcnRTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworICAgIC8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCS8qKgorICAgICAqIFNlcnZsZXQgY29udGV4dC4gIAorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFQgPSAiL1NURU0iOworCQorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWJ1ZyA9ICJuIjsKKyAgICAvKioKKyAgICAgKiBpZiBzZXQgdHJ1ZSwgdGhpcyB3aWxsIGNyZWF0ZSByZWFkYWJsZSBvdXRwdXQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIFRFU1QgPSBmYWxzZTsKKyAgICAKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNURU1fRk9MREVSID0gImM6XFx0bXBcXGdlIjsKKyAgICAKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAiMS4wLjEiOworICAgIC8qKgorICAgICAqICBIYW5kbGUgdGhlIGluaXRpYWwgc2V0dXAgCisgICAgICovCisJcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCQkgICAgc3VwZXIuaW5pdChjb25maWcpOworCQkgICAgZGVidWcoImluaXQ6ICIrVkVSU0lPTisiIGludm9rZWQgYXQgc3RhcnR1cCBvciBkZXBsb3kiKTsJCisJCSAgICAKKwkgfQorICAgIAorCXByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJZGVidWcoImRvR2V0Iik7CisJCWRvUG9zdChyZXF1ZXN0LCByZXNwb25zZSk7Cit9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgCisgICAgICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIAlkZWJ1ZygiZG9Qb3N0Iik7CQkKKwkJCisJCVN0cmluZyBmb2xkZXJOYW1lID0gU1RFTV9GT0xERVI7CisJCVN0cmluZyB3YWl0Rm9yS01MID0gIm4iOworCQlTdHJpbmcgaW50ZXJ2YWwgPSAiMiI7ICAvLyBldmVyeSAyIHNlY29uZHMKKwkJRmlsZSBmb2xkZXIgPSBudWxsOworCQkKKwkJdHJ5IHsKKwkJCS8vIGdldCB0aGUgZm9sZGVyIGZyb20gdGhlIFVSTCBwYXJhbWV0ZXJzLgorCQkJLy8gaHR0cDovL2xvY2FsaG9zdDo4MDgwL3NsaWRlc2hvdz9mb2xkZXI9cGF0aAorCQkJRW51bWVyYXRpb24gZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKKwkJCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKKwkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKXJlcXVlc3QuZ2V0UGFyYW1ldGVyKG5hbWUpOworCQkJCWRlYnVnKG5hbWUrIj0iK3ZhbHVlKTsKKwkJCQlpZiAobmFtZS5lcXVhbHMoImZvbGRlciIpKSB7CisJCQkJCWZvbGRlck5hbWUgPSB2YWx1ZTsJCQkJCisJCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFscygid2FpdCIpKSB7CisJCQkJCXdhaXRGb3JLTUwgPSB2YWx1ZTsJCQkJCQorCQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImludGVydmFsIikpIHsKKwkJCQkJaW50ZXJ2YWwgPSB2YWx1ZTsJCQkJCQorCQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImRlYnVnIikpIHsKKwkJCQkJZGVidWcgPSB2YWx1ZTsJCQkJCQorCQkJCX0KKwkJCQkKKwkJCX0KKwkJCWlmIChkZWJ1Zy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoInkiKSkgeworCQkJCVNsaWRlU2hvd1NlcnZsZXQuREVCVUcgPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlTbGlkZVNob3dTZXJ2bGV0LkRFQlVHID0gZmFsc2U7CisJCQl9CisJCQlmb2xkZXIgPSBuZXcgRmlsZShmb2xkZXJOYW1lKTsKKwkJCWRlYnVnKCJmb2xkZXI6ICIrZm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsKKwkJCQorCQkJCisJCQlsb25nIHRpbWUgPSAwOworCQkJU3RyaW5nIGluZm8gPSAiSVBhZGRyOiAiICsgcmVxdWVzdC5nZXRSZW1vdGVBZGRyKCkgKyAKKwkgICAgICAgICIgZm9sZGVyOiAiK2ZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSArCisJICAgICAgICAiIHRpbWU6ICIgKyB0aW1lOworCSAgICAgICAgZGVidWcoaW5mbyk7CisJCQlzZW5kT3V0cHV0KHJlcXVlc3QscmVzcG9uc2UsIGZvbGRlck5hbWUsIAorCQkJCQl3YWl0Rm9yS01MLGludGVydmFsKTsKKwkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKwkJCQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKyAgIAorCisJLyoqCisJICogU2VuZCB0aGUgS01MIGZpbGUgdG8gdGhlIGNhbGxlciAoR29vZ2xlRWFydGgpCisJICogCisJICogSWYgVEVTVD10cnVlIHRoZW4gaXQgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBicm93c2VyIAorCSAqIGZvciB0ZXN0aW5nLiBOb3RlIHRoYXQgYmVjYXN1c2UgaXQgaXMgWE1MIHRoZSBvdXRwdXQgCisJICogd2lsbCBiZSBnYXJibGVkIGFuZCB5b3UgbmVlZCB0byB1c2UgdGhlIGJyb3dzZXIgdG8gCisJICogbG9vayBhdCB0aGUgcGFnZSBzb3VyY2UuCisJICogCisJICogQHBhcmFtIHJlcXVlc3QKKwkgKiBAcGFyYW0gcmVzcG9uc2UKKwkgKiBAcGFyYW0gZm9sZGVyTmFtZQorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKyAgICBzeW5jaHJvbml6ZWQgCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRPdXRwdXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisJCQlIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCAKKwkJCVN0cmluZyBmb2xkZXJOYW1lLCBTdHJpbmcgd2FpdEZvcktNTCwgU3RyaW5nIGludGVydmFsKSAKKwkgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIAkKKyAgICAJCisgICAgCWludCBwb3J0ID0gcmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCk7CisgICAgCQorICAgIAlTdHJpbmcgaG9zdCA9IHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpKyI6Iitwb3J0OworCQkKKwkJbG9uZyB0aW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CisJCVN0cmluZyBpZCA9IExvbmcudG9IZXhTdHJpbmcodGltZSk7CisJCVByaW50V3JpdGVyIG9zID0gbmV3IFByaW50V3JpdGVyKHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKTsKKyAgICAJLy8gc2V0IFRFU1Q9dHJ1ZSB0byBnZXQgcmVhZGFibGUgb3V0cHV0IGluc3RlYWQgb2YgCisgICAgCS8vIGxhdW5jaGluZyBhIEtNTCBmaWxlCisgICAgCQorICAgIAlpZiAoVEVTVCkgeworICAgIAkJU3RyaW5nIG1zZyA9ICIgS01MIE5ldHdvcmtMaW5rIGZpbGU6ICI7CisgICAgCQlyZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7CisgICAgCQkKKyAgICAJCW9zLnByaW50bG4oIjxodG1sPiIpOworICAgIAkJb3MucHJpbnRsbigiPGhlYWQ+PHRpdGxlPlN0YXJ0IFNsaWRlc2hvdzwvdGl0bGU+PC9oZWFkPiIpOworICAgIAkJb3MucHJpbnRsbigiPGJvZHk+Iik7CisgICAgCQlvcy5wcmludGxuKCI8cD4iK21zZysiPC9wPiIpOworICAgIAkJICAgIAkJICAgIAkJCisgICAgCX0gIGVsc2UgeyAgICAgICAgCisJCSAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24va2V5aG9sZSIpOworICAgIAl9CisJCQkJCisJCXRyeSB7CisJCQkKKwkJCW9zLnByaW50bG4oIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIpOworCQkJb3MucHJpbnRsbigiPGttbCB4bWxucz1cImh0dHA6Ly9lYXJ0aC5nb29nbGUuY29tL2ttbC8yLjBcIj4iKTsKKwkJCW9zLnByaW50bG4oIjxGb2xkZXI+Iik7CisJCQlvcy5wcmludGxuKCIgICA8ZGVzY3JpcHRpb24+U2xpZGVTaG93IE5ldHdvcmtMaW5rPC9kZXNjcmlwdGlvbj4iKTsKKwkJCW9zLnByaW50bG4oIiAgIDxuYW1lPk5ldHdvcmsgTGlua3M8L25hbWU+Iik7CisJCQlvcy5wcmludGxuKCI8TmV0d29ya0xpbms+Iik7CisJCQlvcy5wcmludGxuKCI8VXJsPiIpOworCQkJLy8gVGhlIGltcG9ydCBpbmZvIGdvZXMgaGVyZQorCQkJU3RyaW5nIHVybCA9ICI8aHJlZj5odHRwOi8vIitob3N0KworCQkJCQlDT05URVhUKyIvc2xpZGVzaG93P2lkPSIraWQrCisJCQkJCSImYW1wO2ZvbGRlcj0iK2ZvbGRlck5hbWUrCisJCQkJCSImYW1wO3dhaXQ9Iit3YWl0Rm9yS01MKworCQkJCQkiPC9ocmVmPiI7CisJCQlvcy5wcmludGxuKHVybCk7CisJCQlkZWJ1Zyh1cmwpOworCQkJCisJCQlvcy5wcmludGxuKCI8cmVmcmVzaEludGVydmFsPiIraW50ZXJ2YWwrIjwvcmVmcmVzaEludGVydmFsPiIpOworCQkJb3MucHJpbnRsbigiPHJlZnJlc2hNb2RlPm9uSW50ZXJ2YWw8L3JlZnJlc2hNb2RlPiIpOworCQkJb3MucHJpbnRsbigiPC9Vcmw+Iik7CisJCQlvcy5wcmludGxuKCI8Zmx5VG9WaWV3PjA8L2ZseVRvVmlldz4iKTsKKwkJCW9zLnByaW50bG4oIjwvTmV0d29ya0xpbms+Iik7CisJCQlvcy5wcmludGxuKCI8L0ZvbGRlcj4iKTsKKwkJCW9zLnByaW50bG4oIjwva21sPiIpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJU3RyaW5nIG1zZyA9ICJTbGlkZVNob3cgc3RhcnR1cCBmYWlsdXJlIjsKKwkJCWRlYnVnKG1zZyxlKTsKKwkJCWVyckh0bWwocmVzcG9uc2UsbXNnK2UuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCQlpZiAoVEVTVCkgeyAgICAJCQorICAgIAkJIAkJCisgICAgCQlvcy5wcmludGxuKCI8L2JvZHk+PC9odG1sPiIpOworICAgIAkJICAgCQkgICAgCQkKKyAgICAJfSAKKwkJb3MuZmx1c2goKTsgCisJfQorICAgIAorICAgIC8qKgorICAgICAqIHByaW50IGRlYnVnIG1lc3NhZ2VzIHRvIHRoZSBzZXZlciBsb2cuCisgICAgICogQHBhcmFtIG1zZworICAgICAqLworCXByaXZhdGUgdm9pZCBkZWJ1ZyhTdHJpbmcgbXNnKSB7CisJCWlmIChTbGlkZVNob3dTZXJ2bGV0LkRFQlVHKSB7CisJCSAgLy9nZXRTZXJ2bGV0Q29udGV4dCgpLmxvZyhtc2cpOworCQkgIC8vbG9nKCJsb2c6ICIrbXNnKTsKKwkJICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0U2VydmxldDogIittc2cpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBkZWJ1ZyhTdHJpbmcgbXNnLFRocm93YWJsZSBlKSB7CisJCVN5c3RlbS5lcnIucHJpbnRsbihtc2cpOworCQllLnByaW50U3RhY2tUcmFjZSgpOworCX0KKwkvKioKKwkgKiBwdXQgb3V0IGFuIGVycm9yIG1lc3NhZ2UgYXMgaHRtbAorCSAqIAorCSAqIEBwYXJhbSByZXNwb25zZQorCSAqIEBwYXJhbSBtc2cKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIGVyckh0bWwoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSxTdHJpbmcgbXNnKSAKKwkgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKKwkJUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyKHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKTsKKwkJb3V0LnByaW50bG4oIjxodG1sPiIpOworCQlvdXQucHJpbnRsbigiPGhlYWQ+PHRpdGxlPktNTCBTbGlkZVNob3cgRXJyb3I8L3RpdGxlPjwvaGVhZD4iKTsKKwkJb3V0LnByaW50bG4oIjxib2R5PiIpOworCQlvdXQucHJpbnRsbigiPHA+Iittc2crIjwvcD4iKTsKKwkJb3V0LnByaW50bG4oIjwvYm9keT48L2h0bWw+Iik7CisJCW91dC5mbHVzaCgpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3NlcnZsZXQvVmVyaWZ5Q2xpZW50LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3NlcnZsZXQvVmVyaWZ5Q2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyMjc5OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvc2VydmxldC9WZXJpZnlDbGllbnQuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnNlcnZsZXQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5HRUxvZzsKKworCisvKioKKyAqIEhvbGRlciBmb3IgdGhlIHZlcmlmeSBtZXRob2QgdGhhdAorICogd2lsbCB2ZXJpZnkgdGhhdCB0aGUgc3BlY2lmaWVkIHdlYnNlcnZlciAKKyAqIGlzIGF2YWlsYWJsZSBhbmQgdGhhdCB0aGUgU3RlbS1Hb29nbGVFYXJ0aCBzZXJ2bGV0cworICogYXJlIGRlcGxveWVkLgorICogCisgKiBJdCB3aWxsIGFsc28gc2VuZCB0aGUgc2V0dGluZyBvZiB0aGUgREVCVUcgZmxhZworICogdG8gdGhlIHNlcnZsZXQgY29kZWJhc2Ugc28gaXQgY2FuIGJlIHVzZWQgdGhlcmUuCisgKiAKKyAqIDxjb2RlPgorICogICAgU3RyaW5nIHVybCA9ICJodHRwOi8vbG9jYWxob3N0OjgwODAvU1RFTS92ZXJpZnkiCisgKiAgICBWZXJpZnlDbGllbnQgdmMgPSBuZXcgVmVyaWZ5Q2xpZW50KCk7CisgKiAgICBib29sZWFuIG9rID0gdmMudmVyaWZ5KHVybCkKKyAqICAgIGlmICghIG9rKSB7CisgKiAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odmMuZ2V0RXJyb3IoKSk7CisgKiAgICAgICByZXR1cm47CisgKiAgICB9CisgKiAgICAuLi4KKyAqIDwvY29kZT4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBWZXJpZnlDbGllbnQgeworCisJOworCS8qKgorICAgICAqIFN0cmluZyB0aGF0IHdlIHdpbGwgc2VuZCB0aGUgY2xpZW50CisgICAgICovCisgCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dHB1dFRleHQ9IlZlcmlmeUNsaWVudCAiKworIAkJCVZlcnNpb24udmVyc2lvbjsKKyAJLyoqCisgCSAqIFN0cmluZyB0aGF0IGNsaWVudCBzaG91bGQgc2VuZCB1cy4KKyAJICovCisgCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cGVjdGVkVGV4dD0iVmVyaWZ5U2VydmxldCAiKworIAkJCVZlcnNpb24udmVyc2lvbjsJCisgICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3IgPSAiIjsKKwkvKioKKwkgKiBWZXJpZnk6IAorCSAqICAgKDEpIHRoYXQgdGhlIHdlYiBzZXJ2ZXIgaXMgYWN0aXZlIAorCSAqICAgKDIpIHRoYXQgdGhlIHNlcnZsZXRzIGFyZSBkZXBsb3llZAorCSAqICAgCisJICogQHBhcmFtIHVybHN0ciAgVVJMIGxpa2UgLy9sb2NhbGhvc3Q6ODA4MC9TVEVNL3ZlcmlmeQorCSAqIEByZXR1cm4gT0siIG9yIGFuIGVycm9yIG1lc3NhZ2UKKwkgKi8KKwlwdWJsaWMgIGJvb2xlYW4gdmVyaWZ5KFN0cmluZyB1cmxzdHIpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOworCQllcnJvciA9ICIiOworCQl0cnkgeworCQkJLy9HRUxvZy5ERUJVRz10cnVlOworCQkJVVJMIHVybCA9IG5ldyBVUkwodXJsc3RyKTsKKwkJCVVSTENvbm5lY3Rpb24gY29ubmVjdCA9IHVybC5vcGVuQ29ubmVjdGlvbigpOworCQkJY29ubmVjdC5zZXRVc2VDYWNoZXMoZmFsc2UpOworCQkJY29ubmVjdC5zZXREb0lucHV0KHRydWUpOworCQkJY29ubmVjdC5zZXREb091dHB1dCh0cnVlKTsKKwkJCWNvbm5lY3Quc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LXR5cGUiLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisJCQkKKwkJCSAgLy8gdXNlIEJ5dGVBcnJheSBvdXRwdXQKKwkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlT3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJRGF0YU91dHB1dFN0cmVhbSBvdXRwdXQgPQorCQkJCW5ldyBEYXRhT3V0cHV0U3RyZWFtKGJ5dGVPdXRwdXQpOworCQkJU3RyaW5nIG91dHB1dFN0cmluZyA9IG91dHB1dFRleHQ7CisJCQlpZiAoR0VMb2cuREVCVUcpIHsKKwkJCQlvdXRwdXRTdHJpbmcgPSBvdXRwdXRUZXh0KyIgREVCVUcgIjsKKwkJCX0KKwkJCUdFTG9nLmRlYnVnKHRoaXMsIlNlbmRpbmc6ICIrb3V0cHV0U3RyaW5nKTsKKwkJCW91dHB1dC53cml0ZVVURihvdXRwdXRTdHJpbmcpOworCQkJCisJCQlvdXRwdXQuZmx1c2goKTsKKwkJCWJ5dGVbXSBidWYgPSBieXRlT3V0cHV0LnRvQnl0ZUFycmF5KCk7CisJCQkKKwkJCWNvbm5lY3Quc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LWxlbmd0aCIsICIiK2J1Zi5sZW5ndGgpOworCQkJRGF0YU91dHB1dFN0cmVhbSBkYXRhT3V0cHV0ID0KKwkJCQluZXcgRGF0YU91dHB1dFN0cmVhbShjb25uZWN0LmdldE91dHB1dFN0cmVhbSgpKTsKKwkJCWRhdGFPdXRwdXQud3JpdGUoYnVmKTsKKwkJCWRhdGFPdXRwdXQuZmx1c2goKTsKKwkJCWRhdGFPdXRwdXQuY2xvc2UoKTsKKwkJCQorCQkJRGF0YUlucHV0U3RyZWFtIGluID0gCisJCQkJbmV3IERhdGFJbnB1dFN0cmVhbShjb25uZWN0LmdldElucHV0U3RyZWFtKCkpOworCQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gaW4ucmVhZFVURigpOworCQkJCisJCQlpbi5jbG9zZSgpOworCQkJCisJCQlpZiAoc3RyaW5nVmFsdWUuZXF1YWxzKGV4cGVjdGVkVGV4dCkpIHsKKwkJCQlTdHJpbmcgbXNnID0gIk9LOiAiKyAgICAgICAgICAgICAgCisJICAgICAgICAgICAgIiBSZWNlaXZlZDogIitzdHJpbmdWYWx1ZTsKKwkgICAgICAgICAgICBHRUxvZy5kZWJ1Zyh0aGlzLG1zZyk7CisJCQl9IGVsc2UgeworCQkJCWVycm9yID0gIkVSUk9SICIrCisJCQkJCSAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6ICIrZXhwZWN0ZWRUZXh0KworCQkJCQkgICAgICAgICAgICAgICAgIiBSZWNlaXZlZDogIitzdHJpbmdWYWx1ZTsKKwkJCQlHRUxvZy5kZWJ1Zyh0aGlzLGVycm9yKTsKKwkJCQlyZXN1bHQ9ZmFsc2U7CQorCQkJfQorCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewkKKwkJCQorCQkJR0VMb2cuZGVidWcoZS5nZXRNZXNzYWdlKCkpOworCQkKKwkJCWVycm9yID0iRVJST1IgSW52YWxpZCBVUkwgIit1cmxzdHI7CisJCQlyZXN1bHQgPSBmYWxzZTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewkJCQorCQkJR0VMb2cuZGVidWcoZSsiOiAiK2UuZ2V0TWVzc2FnZSgpKTsKKwkJCQorCQkJZXJyb3I9IkVYQ0VQVElPTiAgIitlKyI6ICIrZS5nZXRNZXNzYWdlKCk7CisJCQlyZXN1bHQgPSBmYWxzZTsKKwkJfQorCQlBY3RpdmF0b3IubG9nRXJyb3IoZXJyb3IsIG51bGwpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgbGFzdCBjaGVjay4KKwkgKiAKKwkgKiBAcmV0dXJuIEVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgcHJldmlvdXMgY2FsbCAKKwkgKiB0byBWZXJpZnlDbGllbnQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRFcnJvcigpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwkvKioKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJCisKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3NlcnZsZXQvVmVyaWZ5U2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9zZXJ2bGV0L1ZlcmlmeVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzRkNGM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS9zZXJ2bGV0L1ZlcmlmeVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnNlcnZsZXQ7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKworLyoqCisgKiBTZXJ2bGV0IHRoYXQgYWxsb3dzIHRoZSBjbGllbnQgdG8gdmVyaWZ5IHRoYXQgdGhlIAorICogd2ViIHNlcnZlciBpcyBzdGFydGVkIGFuZCB0aGUgU1RFTS1Hb29nbGVFYXJ0aCBzZXJ2bGV0cyAKKyAqIGFyZSBkZXBsb3llZC4KKyAqIAorICogSWYgaXQgZ2V0cyBhIFN0cmluZyAiVmVyaWZ5Q2xpZW50IHYudi52IgorICogSXQgcmV0dXJucyBhIFN0cmluZyAiVmVyaWZ5U2VydmxldCB2LnYudiIKKyAqIAorICovCitwdWJsaWMgY2xhc3MgVmVyaWZ5U2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKwkKKwkKKwkgIC8qKgorICAgICAqIFN0cmluZyB0aGF0IHdlIHdpbGwgc2VuZCB0aGUgY2xpZW50CisgICAgICovCisgCXByaXZhdGUgc3RhdGljIFN0cmluZyBvdXRwdXRUZXh0PSJWZXJpZnlTZXJ2bGV0ICIrCisgCQkJVmVyc2lvbi52ZXJzaW9uOworIAkvKioKKyAJICogU3RyaW5nIHRoYXQgY2xpZW50IHNob3VsZCBzZW5kIHVzLgorIAkgKi8KKyAJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4cGVjdGVkVGV4dD0iVmVyaWZ5Q2xpZW50ICIrCisgCSAJCVZlcnNpb24udmVyc2lvbjsKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAc2VlIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldCNzZXJ2aWNlKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QsIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgCisgICAgICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIAkKKwkJRGF0YUlucHV0U3RyZWFtIGluID0gCisJCQluZXcgRGF0YUlucHV0U3RyZWFtKHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKSk7CisJCXJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi9vY3Rlci1zdHJlYW0iKTsKKwkJLy8gdXNlIEJ5dGVBcnJheSBvdXRwdXQKKwkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCURhdGFPdXRwdXRTdHJlYW0gb3V0cHV0ID0KKwkJCW5ldyBEYXRhT3V0cHV0U3RyZWFtKGJ5dGVPdXRwdXQpOworCQkvLworCQkvLyByZWFkIHRoZSBpbnB1dCBmcm9tIHRoZSBjbGllbnQKKwkJLy8KKwkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gaW4ucmVhZFVURigpOworCQlpZiAoc3RyaW5nVmFsdWUuc3RhcnRzV2l0aChleHBlY3RlZFRleHQpKSB7CisJCQlvdXRwdXQud3JpdGVVVEYob3V0cHV0VGV4dCk7CisJCQlpZiAoc3RyaW5nVmFsdWUuY29udGFpbnMoIkRFQlVHIikpIHsKKwkJCQlTbGlkZVNob3dTZXJ2bGV0LkRFQlVHID0gdHJ1ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVN0cmluZyBlcnJtc2cgPSAiRXJyb3I6ICIrCisJCQkgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAiK2V4cGVjdGVkVGV4dCsKKwkJCSAgICAgICAgICAgICAgICAiIFJlY2VpdmVkOiAiK3N0cmluZ1ZhbHVlOworCQkJZGVidWcoZXJybXNnKTsKKwkJCW91dHB1dC53cml0ZVVURihlcnJtc2cpOworCQl9CisJCW91dHB1dC5mbHVzaCgpOworCQlieXRlW10gYnVmID0gYnl0ZU91dHB1dC50b0J5dGVBcnJheSgpOworCQlyZXNwb25zZS5zZXRDb250ZW50TGVuZ3RoKGJ1Zi5sZW5ndGgpOworCQlTZXJ2bGV0T3V0cHV0U3RyZWFtIHNlcnZsZXRPdXRwdXQgPSByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKTsKKwkJc2VydmxldE91dHB1dC53cml0ZShidWYpOworCQlzZXJ2bGV0T3V0cHV0LmNsb3NlKCk7CisJCQorCX0KKwkKKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwlwcml2YXRlIHZvaWQgZXJySHRtbChIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgbXNnKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOworCQlQcmludFdyaXRlciBvdXQgPSBuZXcgUHJpbnRXcml0ZXIocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkpOworCQlvdXQucHJpbnRsbigiPGh0bWw+Iik7CisJCW91dC5wcmludGxuKCI8aGVhZD48dGl0bGU+VmVyaWZ5U2VydmxldCBFcnJvcjwvdGl0bGU+PC9oZWFkPiIpOworCQlvdXQucHJpbnRsbigiPGJvZHk+Iik7CisJCW91dC5wcmludGxuKCI8cD4iICsgbXNnICsgIjwvcD4iKTsKKwkJb3V0LnByaW50bG4oIjwvYm9keT48L2h0bWw+Iik7CisJCW91dC5mbHVzaCgpOworCX0KKwkKKworCisgICAgLyoqCisgICAgICogcHJpbnQgZGVidWcgbWVzc2FnZXMgdG8gdGhlIHNlcnZlciBsb2cuCisgICAgICogQHBhcmFtIG1zZworICAgICAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgZGVidWcoU3RyaW5nIG1zZykgeworCQlpZiAoU2xpZGVTaG93U2VydmxldC5ERUJVRykgewkJICAKKwkJICBTeXN0ZW0ub3V0LnByaW50bG4oIlZlcmlmeVNlcnZsZXQ6ICIrbXNnKTsKKwkJfQorCX0KKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGRlYnVnKFN0cmluZyBtc2csVGhyb3dhYmxlIGUpIHsKKwkJLy9sb2cobXNnLGUpOworCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKKwkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCisJfQorfQorCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvc2VydmxldC9WZXJzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3NlcnZsZXQvVmVyc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmODQ3MDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3NlcnZsZXQvVmVyc2lvbi5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5zZXJ2bGV0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2NyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogU3VwcGx5IGEgVmVyc2lvbiBudW1iZXIgZm9yIHRoZSBzZXZsZXRzIAorICogTXVzdCBiZSBhIHNlcGFyYXRlIGNsYXNzIGZvciBjb21waWxlIHJlYXNvbnMKKyAqLworcHVibGljIGNsYXNzIFZlcnNpb24geworICAvKioKKyAgICogVmVyc2lvbgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdmVyc2lvbiA9ICIwLjEuMSI7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3ZpZXdzL0Rpc3BsYXlBcmVhRGlhbG9nLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3ZpZXdzL0Rpc3BsYXlBcmVhRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkYWM2MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvdmlld3MvRGlzcGxheUFyZWFEaWFsb2cuamF2YQpAQCAtMCwwICsxLDE5MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnZpZXdzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuR0VMb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogIExldCB0aGUgdXNlciBlbnRlciB0aGUgaW5mbyBuZWVkZWQgdG8gZGlzcGxheSAKKyAqICBvbiBHb29nbGVFYXJ0aCB0aGUgc2VsZWN0ZWQgQWRtaW4gYXJlYS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBEaXNwbGF5QXJlYURpYWxvZyBleHRlbmRzIFRpdGxlQXJlYURpYWxvZyB7CisKKwlwcml2YXRlIENvbWJvIGNvdW50cnkgPSBudWxsOworCXByaXZhdGUgQ29tYm8gbGV2ZWwgPSBudWxsOworCXByaXZhdGUgVGV4dCAgc2VhcmNoID0gbnVsbDsKKwlCdXR0b24gY2xlYXJCdXR0b24gPSBudWxsOzsKKwkKKwkKKwlib29sZWFuIHJDbGVhciA9IGZhbHNlOworCQorCS8qKgorCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAorCSAqLworCXB1YmxpYyBEaXNwbGF5QXJlYURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgeworCQlzdXBlcihwYXJlbnRTaGVsbCk7CisJCQorCX0KKyAgICAKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50ICBwYXJlbnQKKwkgKi8JCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb250cm9sIGNvbnRlbnRzID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKKwkJc2V0TWVzc2FnZSgiRW50ZXIgQWRtaW4gQXJlYSBpbmZvLiIpOworCQlzZXRUaXRsZSgiRGlzcGxheUFyZWEiKTsKKwkJcmV0dXJuIGNvbnRlbnRzOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRpdGxlQXJlYURpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkgKi8KKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOworCQkvL2NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNixmYWxzZSkpOworCQlHcm91cCBncm91cDEgPSBuZXcgR3JvdXAoY29tcG9zaXRlLFNXVC5TSEFET1dfSU4pOworCQlncm91cDEuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoU1dULkhPUklaT05UQUwpKTsKKwkJTGFiZWwgY291bnRyeUxhYmVsID0gbmV3IExhYmVsKGdyb3VwMSxTV1QuTk9ORSk7CisJCWNvdW50cnlMYWJlbC5zZXRUZXh0KCJDb3VudHJ5OiAiKTsKKwkJY291bnRyeSA9IG5ldyBDb21ibyhncm91cDEsU1dULkRST1BfRE9XTik7CQkKKwkJY291bnRyeS5zZXRUZXh0TGltaXQoMyk7CQkKKwkJU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW10geyJVU0EiLCJDQU4iLCJNRVgifTsKKwkJY291bnRyeS5zZXRJdGVtcyhpdGVtcyk7CisJCQorCQlpZiAoRGlzcGxheUFyZWFEYXRhLnJDb3VudHJ5ICE9IG51bGwpIHsKKwkJCWNvdW50cnkuc2V0VGV4dChEaXNwbGF5QXJlYURhdGEuckNvdW50cnkpOworCQl9IGVsc2UgeworCQkJY291bnRyeS5zZWxlY3QoMCk7CisJCX0KKwkJTGFiZWwgbGV2ZWxMYWJlbCA9IG5ldyBMYWJlbChncm91cDEsU1dULk5PTkUpOworCQlsZXZlbExhYmVsLnNldFRleHQoIkxldmVsOiAiKTsKKwkJbGV2ZWwgPSBuZXcgQ29tYm8oZ3JvdXAxLFNXVC5EUk9QX0RPV04rU1dULlJFQURfT05MWSk7CQkKKwkJaXRlbXMgPSBuZXcgU3RyaW5nW10geyIwIiwiMSIsIjIifTsKKwkJbGV2ZWwuc2V0VGV4dExpbWl0KDEpOwkJCisJCWxldmVsLnNldEl0ZW1zKGl0ZW1zKTsKKwkJCisJCWxldmVsLnNlbGVjdChJbnRlZ2VyLnBhcnNlSW50KERpc3BsYXlBcmVhRGF0YS5yTGV2ZWwpKTsKKwkJCisJCUxhYmVsIHNlYXJjaExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSxTV1QuTk9ORSk7CisJCXNlYXJjaExhYmVsLnNldFRleHQoIlNlYXJjaCB0ZXh0OiAiKTsKKwkJc2VhcmNoID0gbmV3IFRleHQoY29tcG9zaXRlLFNXVC5CT1JERVIpOworCQlzZWFyY2guc2V0VGV4dExpbWl0KDQ4KTsKKwkKKwkJaWYgKERpc3BsYXlBcmVhRGF0YS5yU2VhcmNoICE9IG51bGwpIHsKKwkJCVN0cmluZyBzZWFyY2hhcmcgPSBEaXNwbGF5QXJlYURhdGEuclNlYXJjaDsKKwkJCWlmIChzZWFyY2hhcmcubGVuZ3RoKCkgPDEwKSAKKwkJCQlzZWFyY2hhcmcgPSBzZWFyY2hhcmcrIiAgICAgICAgICI7CisJCQlzZWFyY2guc2V0VGV4dChzZWFyY2hhcmcpOworCQl9CQkJCisJCQorCQlHcm91cCBncm91cDIgPSBuZXcgR3JvdXAoY29tcG9zaXRlLFNXVC5TSEFET1dfSU4pOworCQlncm91cDIuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoU1dULkhPUklaT05UQUwpKTsKKwkJY2xlYXJCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwMixTV1QuQ0hFQ0spOworCQljbGVhckJ1dHRvbi5zZXRUZXh0KCJDbGVhciBNYXAiKTsKKwkJcmV0dXJuIGNvbXBvc2l0ZTsKKwl9CisJCisJLyoqCisJICogY3JlYXRlcyBBcHBseSwgT0sgYW5kIENhbmNlbCBidXR0b25zLgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7CisJCWNyZWF0ZUJ1dHRvbihwYXJlbnQsSURpYWxvZ0NvbnN0YW50cy5QUk9DRUVEX0lELAorCQkJCSJBcHBseSIsZmFsc2UpOworCQljcmVhdGVCdXR0b24ocGFyZW50LElEaWFsb2dDb25zdGFudHMuT0tfSUQsCisJCQkJSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCx0cnVlKTsKKwkJY3JlYXRlQnV0dG9uKHBhcmVudCxJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKKwkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCxmYWxzZSk7CisJfQorCQorCS8qKgorCSAqIGdldHMgY29udHJvbCB3aGVuIHVzZXIgcHJlc3NlcyBBcHBseSwgT0sgb3IgQ2FuY2VsLgorCSAqIEl0IHNldHMgdGhlIHJjIHRvIGJ1dHRvbiBpZCwgY2FsbHMgY2xvc2UgYW5kIHJldHVybnMuCisJICogCisJICogIAorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjYnV0dG9uUHJlc3NlZChpbnQpCisJICogQHBhcmFtIGlkIGZvciB0aGUgYnV0dG9uIHRoYXQgd2FzIHByZXNzZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBpZCkgeworCQlzZXRSZXR1cm5Db2RlKGlkKTsKKwkJR0VMb2cuZGVidWcodGhpcywiIitpZCk7CisJCS8vaWYgKCBpZCAhPSBJRGlhbG9nQ29uc3RhbnRzLlBST0NFRURfSUQpCisJCWNsb3NlKCk7CisJCXJldHVybjsKKwl9CisJLyoqCisJICogVGhpcyBnZXRzIHRoZSB2YWx1ZXMgZnJvbSB0aGUgZGlhbG9nIGFuZCBzYXZlcyB0aGVtIAorCSAqIHNvIHRoYXQgdGhlIGNhbGxlciBvZiB0aGlzIGRpYWxvZyBjYW4gZ2V0IHRoZW0gbGF0ZXIuCisJICogCisJICogQHJldHVybiB0cnVlIGlmIGNsb3NlIGRpYWxvZyBpcyBPSworCSAqLworCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgeworCQkKKwkJRGlzcGxheUFyZWFEYXRhLnJDb3VudHJ5ID0gY291bnRyeS5nZXRUZXh0KCk7CisJCURpc3BsYXlBcmVhRGF0YS5yTGV2ZWwgPSBsZXZlbC5nZXRUZXh0KCk7CisJCURpc3BsYXlBcmVhRGF0YS5yU2VhcmNoID0gc2VhcmNoLmdldFRleHQoKTsKKwkJckNsZWFyID0gY2xlYXJCdXR0b24uZ2V0U2VsZWN0aW9uKCk7CisJCXJldHVybiBzdXBlci5jbG9zZSgpOworCX0KKwkvKioKKwkgKiBAcmV0dXJuIG5hbWUgb2YgZmlsZSBjb250YWluaW5nIEdNTCBmb3IgYXJlYSBib3JkZXIKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEFkbWluRmlsZSgpIHsKKwkJU3RyaW5nIHJDb3VudHJ5ID0gRGlzcGxheUFyZWFEYXRhLnJDb3VudHJ5OworCQlHRUxvZy5kZWJ1Zyh0aGlzLHJDb3VudHJ5KTsKKwkJU3RyaW5nIGFkbWluRmlsZSA9ckNvdW50cnkrIi8iK3JDb3VudHJ5KyJfIisKKwkJICAgRGlzcGxheUFyZWFEYXRhLnJMZXZlbCsiX01BUC54bWwiOworCQlyZXR1cm4gIGFkbWluRmlsZTsKKwl9CisJCisJLyoqCisJICogCisJICogQHJldHVybiBTZWFyY2ggYXJndW1lbnQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFNlYXJjaCgpIHsKKwkJcmV0dXJuIERpc3BsYXlBcmVhRGF0YS5yU2VhcmNoOworCX0KKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdXNlciB3YW50cyB0byBjbGVhciB0aGUgZXhpc3RpbmcgbWFwIGRpc3BsYXkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NsZWFyKCkgeworCQlyZXR1cm4gckNsZWFyOworCX0KKwkvKioKKwkgKiBTaW1wbGUgY2xhc3MgdG8gc3RvcmUgdGhlIGRpYWxvZ3MgbGFzdCB1c2VkIHZhbHVlcworCSAqCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBEaXNwbGF5QXJlYURhdGEgeworCQkvKiogc2F2ZSBhZG1pbiBsZXZlbCAqLworCQlwdWJsaWMgc3RhdGljIFN0cmluZyByTGV2ZWwgPSAiMiI7CisJCS8qKiBzYXZlIGNvdW50cnkgKi8KKwkJcHVibGljIHN0YXRpYyBTdHJpbmcgckNvdW50cnkgPSAiVVNBIjsKKwkJLyoqIHNhdmUgc2VhcmNoIHRleHQgZm9yIGFkbWluIGFyZWEgKi8KKwkJcHVibGljIHN0YXRpYyBTdHJpbmcgclNlYXJjaCA9IG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS92aWV3cy9HRUFkdmFuY2VkUHJlZmVyZW5jZVBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvdmlld3MvR0VBZHZhbmNlZFByZWZlcmVuY2VQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmYWUwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvdmlld3MvR0VBZHZhbmNlZFByZWZlcmVuY2VQYWdlLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS52aWV3czsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Cb29sZWFuRmllbGRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkdFTG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VzLlNjb3BlZFByZWZlcmVuY2VTdG9yZTsKKworCisvKioKKyAqIEhhbmRsZSBBZHZhbmNlZCBQcmVmZXJlbmNlcyBmb3IgdGhlIAorICogU1RFTSAtIEdvb2dsZUVhcnRoIGludGVyZmFjZS4KKyAqIAorICogVGhpcyBjbGFzcyB3YXMgY29waWVkIGZyb20gR0VQcmVmZXJlbmNlUGFnZS5qYXZhCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwcmVmZXJlbmNlIHBhZ2UgdGhhdAorICogaXMgY29udHJpYnV0ZWQgdG8gdGhlIFByZWZlcmVuY2VzIGRpYWxvZy4gQnkgCisgKiBzdWJjbGFzc2luZyA8c2FtcD5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlPC9zYW1wPiwgd2UKKyAqIGNhbiB1c2UgdGhlIGZpZWxkIHN1cHBvcnQgYnVpbHQgaW50byBKRmFjZSB0aGF0IGFsbG93cworICogdXMgdG8gY3JlYXRlIGEgcGFnZSB0aGF0IGlzIHNtYWxsIGFuZCBrbm93cyBob3cgdG8gCisgKiBzYXZlLCByZXN0b3JlIGFuZCBhcHBseSBpdHNlbGYuCisgKiA8cD4KKyAqIFRoaXMgcGFnZSBpcyB1c2VkIHRvIG1vZGlmeSBwcmVmZXJlbmNlcyBvbmx5LiBUaGV5CisgKiBhcmUgc3RvcmVkIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlIHRoYXQgYmVsb25ncyB0bworICogdGhlIG1haW4gcGx1Zy1pbiBjbGFzcy4gVGhhdCB3YXksIHByZWZlcmVuY2VzIGNhbgorICogYmUgYWNjZXNzZWQgZGlyZWN0bHkgdmlhIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgorICogCisgKiBUaGlzIHVzZXMgdGhlIGpmYWNlIFByZWZlcmVuY2VzIEFQSSByYXRoZXIgdGhhbgorICogIHRoZSBuZXcgU1dUIFByZWZlcmVuY2VzIEFQSSAgYmVjYXVzZSBpdCBpcyBzaW1wbGVyIAorICogIHRvIGltcGxlbWVudC4gCisgKiAgCisgKiAgVGhlIHN0YXRpYyB2YWx1ZXMgdXNlZCB0byBhY2Nlc3MgdGhlIHByZWZlcmVuY2VzIAorICogIGFuZCB0aGUgbWV0aG9kcyB1c2VkIHRvIGFjY2VzcyB0aGVtIGFyZSAKKyAqICBmb3VuZCBpbiBHRVByZWZlcmVuY2VQYWdlIHNvIHRoYXQgd2UgY2FuIG1vdmUgdGhlIAorICogIEdVSSBpbnRlcmZhY2UgZnJvbSBwYWdlIHRvIHBhZ2Ugd2l0aG91dCBjaGFuZ2luZyB0aGUgCisgKiAgY29kZSB0aGF0IHVzZXMgdGhlIHByZWZlcmVuY2UuIAorICogIEZvciBFeGFtcGxlLCB0aGUgUF9TSE9XX0JPUkRFUiB2YXJpYWJsZSBhbmQgdGhlIAorICogIGlzU2hvd0JvcmRlcigpIG1ldGhvZCBpcyBmb3VuZCBpbiBHRVBlcmZvcm1hbmNlUGFnZSAKKyAqICBldmVuIHRob3VnaCB0aGUgY29kZSB0byBzZXQgaXQgaXMgZm91bmQgaW4gCisgKiAgR0VBZHZhbmNlZFBlcmZvcm1hbmNlUGFnZS4KKyAqLworCitwdWJsaWMgY2xhc3MgR0VBZHZhbmNlZFByZWZlcmVuY2VQYWdlCisJZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlCisJaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgeworICAgIAorCQorCQorCQorCQorCQorCQorCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlcyA9IAorCQlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOworCSAgICAKKwkKKwkvKioKKwkgKiBjb25zdHJ1Y3QgdGhlIFByZWZlcmVuY2UgcGFnZSBmb3IgR29vZ2xlRWFydGggaW50ZXJmYWNlLgorCSAqIAorCSAqLworCXB1YmxpYyBHRUFkdmFuY2VkUHJlZmVyZW5jZVBhZ2UoKSB7CisJCXN1cGVyKEdSSUQpOworCQlzZXRQcmVmZXJlbmNlU3RvcmUocHJlZmVyZW5jZXMpOworCQlzZXREZXNjcmlwdGlvbigiQWR2YW5jZWQgUHJlZmVyZW5jZXMgZm9yIHRoZSBTVEVNIC0gR29vZ2xlRWFydGggaW50ZXJmYWNlXG4gIik7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgdGhlIGZpZWxkIGVkaXRvcnMuIEZpZWxkIGVkaXRvcnMgYXJlIGFic3RyYWN0aW9ucyBvZgorCSAqIHRoZSBjb21tb24gR1VJIGJsb2NrcyBuZWVkZWQgdG8gbWFuaXB1bGF0ZSB2YXJpb3VzIHR5cGVzCisJICogb2YgcHJlZmVyZW5jZXMuIEVhY2ggZmllbGQgZWRpdG9yIGtub3dzIGhvdyB0byBzYXZlIGFuZAorCSAqIHJlc3RvcmUgaXRzZWxmLgorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKKwkJCisJCS8vIFR1cm4gdGhlIGRlYnVnIG9wdGlvbiBvbiBvciBvZmYKKwkJYWRkRmllbGQoCisJCQkJbmV3IEJvb2xlYW5GaWVsZEVkaXRvcigKKwkJCQkJR0VQcmVmZXJlbmNlUGFnZS5QX0RFQlVHLAorCQkJCQkiJkFsbG93IGRlYnVnIG91dHB1dCBvbiBDb25zb2xlIiwKKwkJCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkpOworCQkKKwkJLy8gZW5hYmxlIGZlYXR1cmUgdG8gdXNlIGJvdW5kaW5nIGJveCB0byBvbmx5IAorCQkvLyBnZW5lcmF0ZSBwb2x5Z29ucyB3aXRoaW4gdGhlIHVzZXJzIHZpZXcKKwkJYWRkRmllbGQoCisJCQkJbmV3IEJvb2xlYW5GaWVsZEVkaXRvcigKKwkJCQkJR0VQcmVmZXJlbmNlUGFnZS5QX0JCT1gsCisJCQkJCSJVc2UgR29vZ2xlRWFydGggQm91bmRpbmcgQm94IHRvIGZpbHRlciBvdXRwdXQiLCAKKwkJCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkpOworICAgICAgICAvLyBTZWUgR0VQZXJmb3JtYW5jZVBhZ2UgaXNTaG93Qm9yZGVyKCkgbWV0aG9kCisJCWFkZEZpZWxkKAorCQkJCW5ldyBCb29sZWFuRmllbGRFZGl0b3IoCisJCQkJCUdFUHJlZmVyZW5jZVBhZ2UuUF9TSE9XX0JPUkRFUiwKKwkJCQkJIlNob3cgQWRtaW4gQXJlYSBCb3JkZXJzIiwKKwkJCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkpOworCQkKKworICAgICAgICAvLyBTZWUgR0VQZXJmb3JtYW5jZVBhZ2UgaXNUZXN0KCkgbWV0aG9kCisJCWFkZEZpZWxkKAorCQkJCW5ldyBCb29sZWFuRmllbGRFZGl0b3IoCisJCQkJCUdFUHJlZmVyZW5jZVBhZ2UuUF9URVNULAorCQkJCQkiRXhwZXJpbWVudGFsIE9wdGlvbiIsCisJCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKKwl9CisgICAgCisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKKwkJdHJ5IHsKKwkJCWlmIChwcmVmZXJlbmNlcyBpbnN0YW5jZW9mIFNjb3BlZFByZWZlcmVuY2VTdG9yZSkgeworCQkJICAgIFNjb3BlZFByZWZlcmVuY2VTdG9yZSBwID0gKFNjb3BlZFByZWZlcmVuY2VTdG9yZSlwcmVmZXJlbmNlczsKKwkJCSAgICBwLnNhdmUoKTsKKwkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewkJCQorCQkgICAgR0VMb2cuZXJyb3IoIkZhaWx1cmUgc2F2aW5nIFByZWZlcmVuY2VzIixlKTsJCisJCX0KKwkJR0VMb2cuZGVidWcodGhpcywic2F2ZWQgcHJlZmVyZW5jZXMiKTsKKwkJCisJCS8vR0VMb2cuZGVidWcodGhpcywiUF9URVNUPSIrR0VQcmVmZXJlbmNlUGFnZS5pc1Rlc3QoKSk7CisJCQorCQkKKwkJcmV0dXJuIHN1cGVyLnBlcmZvcm1PaygpOworCX0KKwkKKy8vcHVibGljIHN0YXRpYyBib29sZWFuIGlzVGVzdCgpIHsKKy8vCQkKKy8vCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkKKy8vCQkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oR0VQcmVmZXJlbmNlUGFnZS5QX1RFU1QpOworLy8JCWVsc2UgCisvLwkJCXJldHVybiB0cnVlOworLy8JfQorfSAvLyBjbGFzcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvdmlld3MvR0VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS92aWV3cy9HRVByZWZlcmVuY2VQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFkM2NiNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvdmlld3MvR0VQcmVmZXJlbmNlUGFnZS5qYXZhCkBAIC0wLDAgKzEsNjc5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uudmlld3M7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkJvb2xlYW5GaWVsZEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkRpcmVjdG9yeUZpZWxkRWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JbnRlZ2VyRmllbGRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5SYWRpb0dyb3VwRmllbGRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5TdHJpbmdGaWVsZEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkFzcGVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkdFTG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5TY29wZWRQcmVmZXJlbmNlU3RvcmU7CisKKworLyoqCisgKiBIYW5kbGUgUHJlZmVyZW5jZXMgZm9yIHRoZSBTVEVNIC0gR29vZ2xlRWFydGggaW50ZXJmYWNlLgorICogPHByZT4KKyAqIFRoaXMgY2xhc3MgY29udGFpbnMgdGhlIGZvbGxvd2luZzoKKyAqICAgLSBjb2RlIHRvIHByZXNlbnQgdGhlIHNldHRpbmcgb2YgdGhlIHByZWZlcmVuY2VzIAorICogICAgIGJ5IHRoZSB1c2VyLiAgVGhlIGd1aSBmb3Igc29tZSBwcmVmZXJlbmNlcyBhcmUgCisgKiAgICAgaGFuZGxlZCBieSBHRUFkdmFuY2VkUHJlZmVyZW5jZVBhZ2UKKyAqICAgICAKKyAqICAgLSBnZXR0ZXIvc2V0dGVyIGNvZGUgZm9yIGFsbCBvZiB0aGUgcHJlZmVyZW5jZXMuIAorICogICAgIG1vc3RseSBnZXR0ZXIuCisgKiAgIAorICogICAtIGNvZGUgdG8gcGljayB1cCB0aGUgYXNwZWN0IHByZWZlcmVuY2UgZnJvbSB0aGUgCisgKiAgICAgdmlzdWFsaXphdGlvbiBwYWdlLgorICogCisgKiBUaGlzIGNsYXNzIHdhcyBpbml0aWFseSBnZW5lcmF0ZWQgYnkgdGhlIFByZWZlcmVuY2VQYWdlIHdpemFyZCBhbmQgCisgKiB0aGVuIG1vZGlmaWVkIGFzIGRlc2NyaWJlZCBpbiAKKyAqICJCdWlsZGluZyBDb21lcmNpYWwtUXVhbGl0eSBQbHVnaW5zIiAKKyAqIAorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcHJlZmVyZW5jZSBwYWdlIHRoYXQKKyAqIGlzIGNvbnRyaWJ1dGVkIHRvIHRoZSBQcmVmZXJlbmNlcyBkaWFsb2cuIEJ5IAorICogc3ViY2xhc3NpbmcgPHNhbXA+RmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTwvc2FtcD4sIHdlCisgKiBjYW4gdXNlIHRoZSBmaWVsZCBzdXBwb3J0IGJ1aWx0IGludG8gSkZhY2UgdGhhdCBhbGxvd3MKKyAqIHVzIHRvIGNyZWF0ZSBhIHBhZ2UgdGhhdCBpcyBzbWFsbCBhbmQga25vd3MgaG93IHRvIAorICogc2F2ZSwgcmVzdG9yZSBhbmQgYXBwbHkgaXRzZWxmLgorICogPHA+CisgKiBUaGlzIHBhZ2UgaXMgdXNlZCB0byBtb2RpZnkgcHJlZmVyZW5jZXMgb25seS4gVGhleQorICogYXJlIHN0b3JlZCBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZSB0aGF0IGJlbG9uZ3MgdG8KKyAqIHRoZSBtYWluIHBsdWctaW4gY2xhc3MuIFRoYXQgd2F5LCBwcmVmZXJlbmNlcyBjYW4KKyAqIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IHZpYSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KKyAqIAorICogVGhpcyB1c2VzIHRoZSBqZmFjZSBQcmVmZXJlbmNlcyBBUEkgcmF0aGVyIHRoYW4KKyAqICB0aGUgbmV3IFNXVCBQcmVmZXJlbmNlcyBBUEkgIGJlY2F1c2UgaXQgaXMgc2ltcGxlciAKKyAqICB0byBpbXBsZW1lbnQuIAorICogIDwvcHJlPgorICovCisKK3B1YmxpYyBjbGFzcyBHRVByZWZlcmVuY2VQYWdlCisJZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlCisJaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgeworICAgIAorCS8qKgorCSAqIEZvbGRlciB1c2VkIHRvIHN0b3JlIEtNTCBmaWxlcworCSAqLworCXN0YXRpYyBmaW5hbCBTdHJpbmcgUF9GT0xERVIgPSAiZm9sZGVyUHJlZmVyZW5jZSI7CisJLyoqCisJICogU2VydmVyOnBvcnQgdXNlZCBmb3IgV2ViIHNlcnZlciB0aGF0IHdpbGwgZmVlZCB0aGUgCisJICogS01MIGZpbGVzIHRvIEdvb2dsZUVhcnRoLgorCSAqLworCXN0YXRpYyBmaW5hbCBTdHJpbmcgUF9TRVJWRVJfSE9TVCA9ICJTZXJ2ZXJIb3N0UHJlZmVyZW5jZSI7CisJLyoqCisJICogTGF1bmNoIEdvb2dsZUVhcnRoIGF0IHN0YXJ0dXAgZmxhZy4KKwkgKiAgIElmIHRydWUgdGhlbiBhdXRvbWF0aWNhbGx5IGxhdW5jaCBhbiBlbXB0eSBmaWxlIAorCSAqICAgdG8gR0UgYXQgc3RhcnR1cAorCSAqICAgCisJICovCisJCisJc3RhdGljIGZpbmFsIFN0cmluZyBQX0FVVE9fTEFVTkNIID0gIkF1dG9MYXVuY2hQcmVmZXJlbmNlIjsKKwkKKwkvKioKKwkgKiBVc2UgSW50ZXJuYWxTZXJ2ZXIgZmxhZworCSAqIGlmIHRydWUgdGhlbiBzdGFydCB0aGUgRWNscHNlIGJ1aWx0IGluIHdlYiBzZXJ2ZXIKKwkgKi8KKwlzdGF0aWMgZmluYWwgU3RyaW5nIFBfSU5URVJOQUxfU0VSVkVSID0gIkludGVybmFsU2VydmVyIjsKKwkvKioKKwkgKiBBdXRvbWF0aWNhbGx5IGxhdW5jaCBOZXR3b3JrTGluay5LTUwgZmlsZQorCSAqIAorCSAqLworCS8vc3RhdGljIGZpbmFsIFN0cmluZyBQX0FVVE9fTkVUTElOSyA9ICJBdXRvTmV0TGluayI7CisJCisJLyoqCisJICogV3JpdGUgS01MIGZpbGVzIGV2ZXJ5IE50aCBjeWNsZS4KKwkgKiAKKwkgKiBGb3IgZXhhbXBsZSAxIHdvdWxkIHdyaXRlIGV2ZXJ5IGN5Y2xlIGFuZAorCSAqIDMgd291bGQgd3JpdGUgZXZlcnkgM3JkIGN5Y2xlLiAKKwkgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZXJlIGlzIG5vdCBtdWNoIGNoYW5nZSAKKwkgKiBiZXR3ZWVuIGN5Y2xlcyBhbmQgc2F2ZXMgdGhlIG92ZXJoZWFkIG9mIGJvdGgKKwkgKiB3cml0aW5nIHRoZSBmaWxlIGFuZCBtb3JlIGltcG9ydGFudGx5IGhhdmluZyAKKwkgKiBHb29nbGVFYXJ0aCByZWFkIGFuZCBwcm9jZXNzIGl0LgorCSAqIE5vdGUgPC0gMCB3b3VsZCBvbmx5IHdyaXRlIHRoZSBmaXJzdCBhbmQgbGFzdC4KKwkgKi8KKwlzdGF0aWMgZmluYWwgU3RyaW5nIFBfV0hJQ0hfQ1lDTEUgPSAid2hpY2hDeWNsZSI7CisJCisJCisJLyoqCisJICogRGVidWcgZGlzcGxheSBvcHRpb24KKwkgKi8KKwlzdGF0aWMgZmluYWwgU3RyaW5nIFBfREVCVUcgPSAiRGVidWdQcmVmZXJlbmNlIjsKKwkKKwkKKwkvKioKKwkgKiBVc2UgR29vZ2xlRWFydGggQkJveCBpbmZvIHRvIGZpbHRlciBLTUwgCisJICogQWNjZXNzIHZpYSB0aGUgaXNCQk9YKCkgbWV0aG9kCisJICovCisJc3RhdGljIGZpbmFsIFN0cmluZyBQX0JCT1ggPSAiQkJPWFByZWZlcmVuY2UiOworCS8qKgorCSAqIEFzcGVjdCAoU0VJUikgdG8gYmUgZGlzcGxheWVkICAob3IgTG9nZ2VkKQorCSAqIAorCSAqLworCXN0YXRpYyBmaW5hbCBTdHJpbmcgUF9BU1BFQ1QgPSAiQXNwZWN0UHJlZmVyZW5jZSI7CisJCisJLyoqCisJICogaWYgdHJ1ZSB0aGVuIHRoaXMgd2lsbCBkbyBhdXRvbG9nZ2luZyBvZiBldmVyeSBzaW11bGF0aW9uIAorCSAqIGFzc3VtaW5nIHRoYXQgdGhlIEdvb2dsZUVhcnRoIGludGVyZmFjZSBpcyBhY3RpdmUuCisJICovCisJc3RhdGljIGZpbmFsIFN0cmluZyBQX0FVVE9fTE9HR0lORyA9ICJBdXRvTG9nZ2luZ1ByZWZlcmVuY2UiOworCQorCS8qKgorCSAqIFRlc3Qgb3B0aW9uCisJICogVGhlIFRlc3Qgb3B0aW9uIGlzIHVzZWQgYXJiaXRyYXJpbHkgdG8gCisJICogdGVzdCBuZXdseSBpbXBsZW1lbnRlZCBmZWF0dXJlcyBvciBzZXR1cAorCSAqIGEgdGVtcG9yYXJ5IHRlc3QgZW52aXJvbm1lbnQuICBJdCBpcyBhIHRvb2wKKwkgKiBmb3IgdGhlIGRldmVsb3BlciBhbmQgd291bGQgbm90IG5vcm1hbHkgYmUKKwkgKiBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgZXhjZXB0IG9uIHJlcXVlc3Qgb2YgCisJICogYSBkZXZlbG9wZXIuICAKKwkgKiBBbiBleGFtcGxlIG9mIHVzZSB3b3VsZCBiZSB0byB0dXJuIG9uIHNvbWUgCisJICogYWRkaXRpb25hbCBkZWJ1ZyBjb2RlIHRvIGhlbHAgZmluZCBhIGJ1Zy4KKwkgKi8KKwlzdGF0aWMgZmluYWwgU3RyaW5nIFBfVEVTVCA9ICJUZXN0UHJlZmVyZW5jZSI7CisJCisJLyoqCisJICogT3B0aW9uIHRvIGNvbnRyb2wgdGhlIGRpc3BsYXkgb2YgYm9yZGVycyBvbiB0aGUgbWFwCisJICovCisJc3RhdGljIGZpbmFsIFN0cmluZyBQX1NIT1dfQk9SREVSID0gIlNob3dCb3JkZXJQcmVmZXJlbmNlIjsKKwkKKwkvKioKKwkgKiBNZXRob2QgdXNlZCB0byBkaXNwbGF5IFNURU0gcmVzdWx0cyBvbiBHb29nbGVFYXJ0aAorCSAqIDxwcmU+CisJICogCisJICogMT1Mb2dPbmx5ICAgIC0gS01MIGZpbGVzIHdpbGwgYmUgbG9nZ2VkIGZvciBsYXRlciBkaXNwbGF5IHZpYSBTZXJ2bGV0CisJICogCisJICogMj1Mb2crU2VydmxldCAtIEtNTCBmaWxlcyBsb2dnZWQgYW5kIE5ldGxpbmsgZmlsZSBsYXVuY2hlZCB0byBjYXVzZSAKKwkgKiAgICAgICAgICAgICAgR0UgdG8gcmVxdWVzdCBsb2dnZWQgZmlsZXMgdmlhIFNlcnZsZXQuICAKKwkgKiAKKwkgKiAzPUFTeW5jaC1TZXJ2bGV0IC0gS01MIHdyaXR0ZW4gdG8gQ29udHJvbC5rbWwgZXZlcnkgTnRoIGN5Y2xlCisJICogICAgICAgICAgICAgIGFuZCBOZXRsaW5rIGZpbGUgbGF1bmNoZWQgdG8gY2F1c2UgR0UgdG8gcmVyZWFkIAorCSAqICAgICAgICAgICAgICBjb250cm9sLmttbCBldmVyeSBOIHNlY29uZHMgICAgICAgICAgICAgCisJICogND1BdXRvTGF1bmNoIC0gQXQgZWFjaCBOdGggY3ljbGUsIGRpcmVjdGx5IGxhdW5jaCB0aGUgZmlsZSB0byBHRSAgICAgICAgICAgICAKKwkgKi8KKwlzdGF0aWMgZmluYWwgU3RyaW5nIFBfTUVUSE9EID0gIk1ldGhvZFByZWZlcmVuY2UiOworCS8qKiAKKwkgKiBPbmx5IExvZyBLTUwgZm9yIGxhdGVyIGRpc3BsYXkgCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTV9MT0dfT05MWSA9IDE7CisJLyoqIAorCSAqIExvZyB0aGUgS01MIGZpbGVzIGFuZCAKKwkgKiBzdGFydCB0aGUgbmV0d29ya0xpbmsgcHJvY2VzcyAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNX0xPR19TRVJWTEVUID0gMjsKKwkvKiogCisJICogYWx3YXlzIHdyaXRlIHRoZSBjb250cm9sLmttbCBmaWxlIGFuZCAKKwkgKiBzdGFydCBhIHNlcnZsZXQgdG8gcmVhZCB0aGUgbGF0ZXN0IHZlcnNpb24uCisJICogQWR2YW50YWdlIGlzIHRoYXQgR29vZ2xlRWFydGggaXMgYWx3YXlzIHJlYWRpbmcKKwkgKiB0aGUgbGF0ZXN0IHZlcnNpb24gYW5kIHdpbGwgbm90IGZhbGwgYmVoaW5kLiAgCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTV9BU1lOQ19TRVJWTEVUID0gMzsKKwkKKwkvKiogCisJICogQnVpbGQgYSBLTUwgZmlsZSBhbmQgbGF1bmNoIGl0IGRpcmVjdGx5IAorCSAqIHRvIEdvb2dsZUVhcnRoCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTV9BVVRPX0xBVU5DSCA9IDQ7CisJLyoqIAorCSAqIERvIG5vdCBkbyBhbnl0aGluZyBhdXRvbWF0aWNhbGx5LgorCSAqIE9ubHkgZ2VuZXJhdGUgYSBLTUwgZmlsZSBhdCByZXF1ZXN0IG9mIHVzZXIuCisJICogCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTV9NQU5VQUxfRElTUExBWSA9IDU7CisJLyoqCisJICogCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2VzID0gCisJCUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CisJCisJCisJLyoqCisJICogY29uc3RydWN0IHRoZSBQcmVmZXJlbmNlIHBhZ2UgZm9yIEdvb2dsZUVhcnRoIGludGVyZmFjZS4KKwkgKiAKKwkgKi8KKwlwdWJsaWMgR0VQcmVmZXJlbmNlUGFnZSgpIHsKKwkJc3VwZXIoR1JJRCk7CisJCS8vc3VwZXIoRkxBVCk7CisJCS8vIFRvIHVzZSBHRUxvZyBJbiBwcmVmZXJlbmNlcyB5b3UgaGF2ZSB0byBtYW51YWxseQorCQkvLyB0dXJuIGl0IG9uIGJlZm9yZSB0aGUgcHJlZmVyZW5jZSBpcyB1c2VkIHRvIHNldCBpdC4KKwkJLy8gb2J2aW91c2x5ISA6LSkgICBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyAKKwkJLy9HRUxvZy5ERUJVRyA9IHRydWU7CisJCS8vcHJlZmVyZW5jZXMgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOworCQlzZXRQcmVmZXJlbmNlU3RvcmUocHJlZmVyZW5jZXMpOworCQlzZXREZXNjcmlwdGlvbigiUHJlZmVyZW5jZXMgZm9yIHRoZSBTVEVNIC0gR29vZ2xlRWFydGggaW50ZXJmYWNlXG4gIik7CisJCS8vZ2V0VmlzdWFsaXphdGlvblByZWZlcmVuY2VzKCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCisJICovCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgeworCX0KKwkKKwkKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBmaWVsZCBlZGl0b3JzLiBGaWVsZCBlZGl0b3JzIGFyZSBhYnN0cmFjdGlvbnMgb2YKKwkgKiB0aGUgY29tbW9uIEdVSSBibG9ja3MgbmVlZGVkIHRvIG1hbmlwdWxhdGUgdmFyaW91cyB0eXBlcworCSAqIG9mIHByZWZlcmVuY2VzLiBFYWNoIGZpZWxkIGVkaXRvciBrbm93cyBob3cgdG8gc2F2ZSBhbmQKKwkgKiByZXN0b3JlIGl0c2VsZi4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7CisJCQorCQkKKwkJCisJCWFkZEZpZWxkKG5ldyBSYWRpb0dyb3VwRmllbGRFZGl0b3IoCisJCQkJUF9NRVRIT0QsCisJCQkiJkNob29zZSB0aGUgbWV0aG9kIHVzZWQgdG8gZGlzcGxheSBTVEVNIHJlc3VsdHMuIiwKKwkJCTEsbmV3IFN0cmluZ1tdW10geyAKKwkJCQl7IkxvZ09ubHkgICAgLSBLTUwgZmlsZXMgd2lsbCBiZSBsb2dnZWQgZm9yIGxhdGVyIGRpc3BsYXkiLCAiMSIgfSwgCisJCQkJeyJMb2crU2VydmxldCAtIEtNTCBmaWxlcyBsb2dnZWQgYW5kIGRpc3BsYXllZCBieSBHb29nbGVFYXJ0aCIsICIyIiB9LAorCQkJCXsiQXN5bmNTZXJ2bGV0IC0gS01MIHdyaXR0ZW4gdG8gQ29udHJvbC5rbWwgYW5kIEFzeW5jIHJlYWQgYnkgU2VydmxldCAiLCAiMyIgfSwKKwkJCQl7IkRpcmVjdExhdW5jaCAtIEF0IGVhY2ggTnRoIGN5Y2xlLCBkaXJlY3RseSBsYXVuY2ggdGhlIGZpbGUgdG8gR0UgIiwgIjQiIH0sCisJCQkJeyJNYW51YWxEaXNwbGF5IC0gVXNlIERpc3BsYXlNYXAgY29tbWFuZCB0byBkaXNwbGF5IiwgIjUifQorCQkJIH0sIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKKwkJCisJCWFkZEZpZWxkKG5ldyBEaXJlY3RvcnlGaWVsZEVkaXRvcihQX0ZPTERFUiwgCisJCQkJIiZGb2xkZXIgZm9yIEtNTCBsb2dnaW5nOiIsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKKwkJCisJCWFkZEZpZWxkKAorCQkJCW5ldyBCb29sZWFuRmllbGRFZGl0b3IoCisJCQkJCVBfSU5URVJOQUxfU0VSVkVSLAorCQkJCQkiJlVzZSBpbnRlcm5hbCB3ZWJzZXJ2ZXIiLAorCQkJCQlnZXRGaWVsZEVkaXRvclBhcmVudCgpKSk7CisJCQorCQlhZGRGaWVsZCgKKwkJCQluZXcgU3RyaW5nRmllbGRFZGl0b3IoUF9TRVJWRVJfSE9TVCwKKwkJCQkJCSJIb3N0bmFtZTpwb3J0IGZvciBleHRlcm5hbCB3ZWJzZXJ2ZXI6IiwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkpOworCQkJCisJCWFkZEZpZWxkKAorCQkJCW5ldyBCb29sZWFuRmllbGRFZGl0b3IoCisJCQkJCVBfQVVUT19MQVVOQ0gsCisJCQkJCSImQXV0b21hdGljYWxseSBzdGFydHVwIEdvb2dsZUVhcnRoIiwgCisJCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKKwkJYWRkRmllbGQoCisJCQkJbmV3IEJvb2xlYW5GaWVsZEVkaXRvcigKKwkJCQkJUF9BVVRPX0xPR0dJTkcsCisJCQkJCSImQXV0b21hdGljYWxseSBwcm9jZXNzIGV2ZXJ5IHNpbXVsYXRpb24iLCAKKwkJCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkpOworCQkKKwkJYWRkRmllbGQoCisJCQkJbmV3IEludGVnZXJGaWVsZEVkaXRvcigKKwkJCQkJUF9XSElDSF9DWUNMRSwKKwkJCQkJIldyaXRlIEtNTCBmaWxlcyBvbmx5IGV2ZXJ5IE4gdGggY3ljbGUiLCAKKwkJCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSwyKSk7CisJCS8vIGlmIGFzcGVjdCB1bmluaXRpYWxpemVkLCB0aGVuIGdldCBmcm9tIFZpc3VhbGl6YXRpb24gcGFnZQorCQlTdHJpbmcgYSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhQX0FTUEVDVCk7IAorCQlpZiAoIiIuZXF1YWxzKGEpKSB7CisJCQlnZXRWaXN1YWxpemF0aW9uUHJlZmVyZW5jZXMoKTsKKwkJCS8vYSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhQX0FTUEVDVCk7CisJCX0KKwkJCisJCS8vR0VMb2cuZGVidWcodGhpcywiSW5pdGlhbCB2aXN1YWxpemF0aW9uQXNwZWN0PSIrYSk7CisJICAgIC8vIGlmIHdlIGhhdmUgaW5pdGlhbGl6ZWQgdGhlIGFzcGVjdHMgLSBzaG93IHNlbGVjdGlvbgorCQlTdHJpbmdbXVtdIGFzcGVjdExpc3QgPSBhc3BlY3RzKCk7CisJCWlmIChhc3BlY3RMaXN0ICE9IG51bGwpIHsKKwkJCQorCQkJYWRkRmllbGQoCisJCQkJbmV3IFJhZGlvR3JvdXBGaWVsZEVkaXRvcigKKwkJCQkJUF9BU1BFQ1QsCisJCQkJCSImQ2hvb3NlIHRoZSBTVEVNIEFzcGVjdCB0byBiZSBMb2dnZWQuIiwKKwkJCQkJMixhc3BlY3RzKCksCisJCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKKwkJfQorCQkJCQorCisKKwl9CisgICAgCisJLyoqCisJICogR2V0IHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBBc3BlY3RzCisJICogCisJICogQHJldHVybiBBcnJheSBvZiBBc3BlY3RzLiBFYWNoIGVudHJ5IGluIGFycmF5IAorCSAqICAgY29uc2lzdHMgb2YgdGhlIEFzcGVjdCBOYW1lIGFuZCBDb2RlCisJICovCisJcHJpdmF0ZSBTdHJpbmdbXVtdIGFzcGVjdHMoKSB7CisJCQorCQlNYXA8U3RyaW5nLEFzcGVjdD4gYXNwZWN0TWFwID0gQXNwZWN0LmdldE1hcCgpOworCQlpZiAoYXNwZWN0TWFwID09IG51bGwgfHwgYXNwZWN0TWFwLnNpemUoKSA9PSAwKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpbnQgbiA9IGFzcGVjdE1hcC5zaXplKCk7CisJCVN0cmluZ1tdW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tuXVsyXTsKKwkJaW50IGkgPSAwOworCQlmb3IoTWFwLkVudHJ5IGVudHJ5OiBhc3BlY3RNYXAuZW50cnlTZXQoKSkgeworCQkJU3RyaW5nIGNvZGUgPSAoU3RyaW5nKWVudHJ5LmdldEtleSgpOworCQkJQXNwZWN0IGFzcGVjdCAgPSAoQXNwZWN0KWVudHJ5LmdldFZhbHVlKCk7CisJCQlyZXN1bHRbaV1bMF0gPSBhc3BlY3QuZ2V0TmFtZSgpOworCQkJcmVzdWx0W2ldWzFdID0gY29kZTsKKwkJCWkrKzsKKwkJfQkJCQorCQkKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgeworCQl1cGRhdGUoKTsKKwkJdHJ5IHsKKwkJCWlmIChwcmVmZXJlbmNlcyBpbnN0YW5jZW9mIFNjb3BlZFByZWZlcmVuY2VTdG9yZSkgeworCQkJICAgIFNjb3BlZFByZWZlcmVuY2VTdG9yZSBwID0gKFNjb3BlZFByZWZlcmVuY2VTdG9yZSlwcmVmZXJlbmNlczsKKwkJCSAgICBwLnNhdmUoKTsKKwkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewkJCQorCQkgICAgR0VMb2cuZXJyb3IoIkZhaWx1cmUgc2F2aW5nIFByZWZlcmVuY2VzIixlKTsJCisJCX0KKwkJR0VMb2cuZGVidWcodGhpcywic2F2ZWQgcHJlZmVyZW5jZXMiKTsKKwkJcmV0dXJuIHN1cGVyLnBlcmZvcm1PaygpOworCX0KKwkKKwkvKioKKwkgKiBNYWtlIGFueSBuZWVkZWQgYXBwbGljYXRpb24gdXBkYXRlcworCSAqCisJICovCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZSgpIHsKKwkJaWYgKGlzRGVidWcoKSAhPSBHRUxvZy5ERUJVRykgeworCQkJR0VMb2cuREVCVUcgPSBpc0RlYnVnKCk7CisJCQlpZiAoaXNEZWJ1ZygpICkgeworCQkJCUdFTG9nLmRlYnVnKCJTZXQgREVCVUcgdG8gIitpc0RlYnVnKCkpOworCQkJfQorCQl9CisJfQorCQorCisJLyoqCisJICogR2V0IHRoZSBhc3BlY3QgdG8gZGlzcGxheSBmcm9tIHRoZSBWaXN1YWxpemF0aW9uIAorCSAqIHByZWZlcmVuY2UgcGFnZS4gCisJICogV2Ugb25seSB1c2UgdGhlIHZpc3VhbGl6YXRpb24gdmFsdWUgaWYgd2UgZG9uJ3QgCisJICogaGF2ZSBhbnkgdmFsdWUgc3BlY2lmaWZpZWQgc28gdGhhdCB3ZSBjYW4gc3BlY2lmeSAKKwkgKiBhIGRpZmZlcmVudCB2YWx1ZSBmcm9tIHRoZSBpbnRlcm5hbCBtYXAgaWYgd2Ugd2FudC4KKwkgKiAKKwkgKgorCSAqLworCXByaXZhdGUgdm9pZCBnZXRWaXN1YWxpemF0aW9uUHJlZmVyZW5jZXMoKSB7CisJCW9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yIHVpUGx1Z2luID0gbnVsbDsKKwkJdHJ5IHsKKwkJCQorCQkJLy8gSVByZWZlcmVuY2VTdG9yZQorCQkJdWlQbHVnaW4gPSBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvci5nZXREZWZhdWx0KCk7CisJCQlmaW5hbCBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IHVpUGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCk7CisJCQlTdHJpbmcgdmlzdWFsaXphdGlvbkFzcGVjdCA9IHByZWZlcmVuY2VzCisJCQkJCS5nZXRTdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5JTklUSUFMX0FUVFJJQlVURV9OQU1FX1NUUklOR19QUkVGRVJFTkNFKTsKKyAgICAgICAgICAgIGlmIChwcmVmZXJlbmNlcy5nZXRTdHJpbmcoUF9BU1BFQ1QpID09ICIiKSB7CisgICAgICAgICAgICAJLy8gVE9ETyB0ZW1wIGZpeCBmb3IgYmFkIHZpc3VhbGl6YXRpb24gZGVmYXVsdAorICAgICAgICAgICAgCUdFTG9nLmRlYnVnKHRoaXMsIlVzZSB2aXN1YWxpemF0aW9uQXNwZWN0PSIrdmlzdWFsaXphdGlvbkFzcGVjdCk7CisgICAgICAgICAgICAJaWYgKHZpc3VhbGl6YXRpb25Bc3BlY3QuZXF1YWxzKCJTIikpCisgICAgICAgICAgICAJCXZpc3VhbGl6YXRpb25Bc3BlY3QgPSAiSSI7CisgICAgICAgICAgICAJc2V0QXNwZWN0KHZpc3VhbGl6YXRpb25Bc3BlY3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKwkJCSAgR0VMb2cuZGVidWcodGhpcywiSWdub3JlIHZpc3VhbGl6YXRpb25Bc3BlY3Q9Iit2aXN1YWxpemF0aW9uQXNwZWN0KTsKKyAgICAgICAgICAgIH0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUdFTG9nLmVycm9yKCJGYWlsdXJlIGdldHRpbmcgVmlzdWFsaXphdGlvbiBwcmVmZXJlbmNlcyIsZSk7CisJCX0gCisJCS8vIGxpc3RlbiBmb3IgY2hhbmdlcyBpbiB0aGUgVmlzdWFsaXphdGlvbiBwcmVmZXJlbmNlcworCQl0cnkgeworCQkJLy8gTGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSBwcmVmZXJlbmNlcyBhbmQgY2hhbmdlIHRoZSB2YWx1ZSB3ZQorCQkJLy8gdXNlIGlmIHRoZSB1c2VyIGNoYW5nZXMgdGhlIHZhbHVlIG9uIHRoZSBwcmVmZXJlbmNlIHBhZ2UuCisJCQl1aVBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworCQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCQkJCXNldFZpc3VsaXphdGlvblByZWZlcmVuY2VzKGV2ZW50KTsKKwkJCQkJCX0gLy8gcHJvcGVydHlDaGFuZ2UKKwkJCQkJfSAvLyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgorCQkJCQkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gSWdub3JlCisJCX0gLy8gY2F0Y2ggRXhjZXB0aW9uCisJfQorCS8qKgorCSAqIENoZWNrIGlmIHRoZSBhc3BlY3Qgd2FzIGNoYW5nZWQgb24gdGhlIHZpc3VhbGl6YXRpb24gcHJlZmVyZW5jZXMKKwkgKiBhbmQgaWYgc28gdGhlbiB1c2UgaXQgZm9yIHVzIGFsc28uCisJICogQHBhcmFtIGV2ZW50CisJICovCisJcHJpdmF0ZSB2b2lkIHNldFZpc3VsaXphdGlvblByZWZlcmVuY2VzKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCisJCVN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7CisJCWlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLklOSVRJQUxfQVRUUklCVVRFX05BTUVfU1RSSU5HX1BSRUZFUkVOQ0UgPT0gcHJvcGVydHkpIHsKKwkJCVN0cmluZyB2aXN1YWxpemF0aW9uQXNwZWN0ID0gKFN0cmluZylldmVudC5nZXROZXdWYWx1ZSgpOworCQkJR0VMb2cuZGVidWcodGhpcywiQ2hhbmdlZCB2aXN1YWxpemF0aW9uQXNwZWN0PSIrdmlzdWFsaXphdGlvbkFzcGVjdCk7CisJCQlzZXRBc3BlY3QodmlzdWFsaXphdGlvbkFzcGVjdCk7CQorCQkJcGVyZm9ybU9rKCk7CisJCX0KKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgbG9nRm9sZGVyCisJICovCisJcHVibGljIHN0YXRpYyAgU3RyaW5nIGdldEZvbGRlcigpIHsKKwkJCisJCXJldHVybiBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoUF9GT0xERVIpOworCX0KKwkvKioKKwkgKiBAcGFyYW0gbG9nRm9sZGVyIHRoZSBsb2dGb2xkZXIgdG8gc2V0CisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbGRlcihTdHJpbmcgbG9nRm9sZGVyKSB7CisJCXByZWZlcmVuY2VzLnNldFZhbHVlKFBfRk9MREVSLCBsb2dGb2xkZXIpOworCX0KKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXJIb3N0CisJICovCisJcHVibGljIHN0YXRpYyAgU3RyaW5nIGdldFNlcnZlckhvc3QoKSB7CisJCQorCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFBfU0VSVkVSX0hPU1QpOworCX0KKworCS8qKgorCSAqIFRoaXMgd2lsbCByZXR1cm4gYSBjb2RlIDEgdG8gNSBpbmRpY2F0aW5nIHRoZSAKKwkgKiBtZXRob2QgdXNlZCB0byBkaXNwbGF5IEtNTC4gIAorCSAqIAorCSAqICBNX0xPR19PTkxZID0gMTsKKwkgKiAgTV9MT0dfU0VSVkxFVCA9IDI7CisJICogIE1fQVNZTkNfU0VSVkxFVCA9IDM7CisJICogIE1fQVVUT19MQVVOQ0ggPSA0OworCSAqICBNX01BTlVBTF9ESVNQTEFZID0gNTsKKwkgKiAKKwkgKiBJZiB0aGVyZSBpcyBubyBTZXJ2bGV0IHN1cHBvcnQsIGl0IHdpbGwgbW9kaWZ5IHdoYXQKKwkgKiBpcyByZXR1cm5lZCB0byBhdm9pZCBiZWluZyBkZXBlbmRlbnQgb24gYSBzZXJ2bGV0LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBjb2RlIHRvIGJlIHVzZWQgdG8gZGlzcGxheSBLTUwgCisJICogICAgCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgZ2V0TWV0aG9kKCkgeworCQlTdHJpbmcgcyA9ICBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoUF9NRVRIT0QpOworCQlpbnQgdHlwZSA9IEludGVnZXIucGFyc2VJbnQocyk7CisvLyBUaGUgdGVzdCBpcyBub3cgbWFkZSBpbiBTdGVtS01MCisvLwkJaWYgKFN0ZW1LbWwuZ2V0U2VydmVyVXJsKCkgPT0gbnVsbCkgeworLy8JCQlpZiAodHlwZSA9PSBNX0xPR19TRVJWTEVUKSAKKy8vCQkJCXR5cGUgPSBNX0xPR19PTkxZOworLy8JCQllbHNlIGlmICh0eXBlID09IE1fQVNZTkNfU0VSVkxFVCkKKy8vCQkJCXR5cGUgPSBNX0FVVE9fTEFVTkNIOworLy8JCX0KKwkJcmV0dXJuIHR5cGU7CisJfQorCisKKworCS8qKgorCSAqIFNldCB0aGUgTWV0aG9kIHRoYXQgU1RFTSBjb3VtbWljYXRlcyB3aXRoIEdFCisJICoKKwkgKiBAcGFyYW0gbmV3TWV0aG9kICBOZXcgbWV0aG9kIHRvIHNldAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNZXRob2QoaW50IG5ld01ldGhvZCkgeworCQlTdHJpbmcgbSA9ICIiK25ld01ldGhvZDsKKwkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUF9NRVRIT0QsIG0pOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGludGVybmFsU2VydmVyIGZsYWcKKwkgKiAKKwkgKiBJZiB0cnVlIHRoZW4gdGhlIGluZm8gYWJvdXQgdGhlIHN0YXR1cyBvZiAKKwkgKiB0aGUgc2VydmVyIGlzIGhhbmRsZWQgYnkgdGhlIFN0ZW1LTUwgY29kZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnRlcm5hbFNlcnZlcigpIHsKKwkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oUF9JTlRFUk5BTF9TRVJWRVIpOworCX0KKworCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBhdXRvTGF1bmNoIGZsYWcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdXRvTGF1bmNoKCkgeworCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihQX0FVVE9fTEFVTkNIKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBhdXRvTG9nZ2luZworCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1dG9Mb2dnaW5nKCkgeworCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihQX0FVVE9fTE9HR0lORyk7CisJfQorCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB3aGljaEN5Y2xlCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgZ2V0V2hpY2hDeWNsZSgpIHsKKwkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEludChQX1dISUNIX0NZQ0xFKTsKKwl9CisgICAgCisJLyoqCisJICogZ2V0IHRoZSBzcGVjaWZpZWQgQXNwZWN0IHRoYXQgd2lsbCBiZSBsb2dnZWQgb3IgZGlzcGxheWVkCisJICogQHJldHVybiBBc3BlY3QgaW5zdGFuY2Ugb3IgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgQXNwZWN0IGdldEFzcGVjdCgpIHsKKwkJQXNwZWN0IGFzcGVjdCA9IG51bGw7CQkKKwkJU3RyaW5nIGEgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoUF9BU1BFQ1QpOworCQlpZiAoYS5sZW5ndGgoKSA9PSAwKSAKKwkJCWFzcGVjdCA9IEFzcGVjdC5nZXREZWZhdWx0KCk7CisJCWVsc2UKKwkJCWFzcGVjdCA9IEFzcGVjdC5nZXRBc3BlY3QoYSk7CisJCWlmIChhc3BlY3QgPT0gbnVsbCkgeworCQkgICAgR0VMb2cuZGVidWcoIkdFUHJlZmVyZW5jZVBhZ2UuZ2V0QXNwZWN0OiAiLGErIiByZXR1cm5lZCBudWxsLCB1c2UgZGVmYXVsdCBhc3BlY3QiKTsKKwkJICAgIGFzcGVjdCA9IEFzcGVjdC5nZXREZWZhdWx0KCk7CisJCX0KKwkJcmV0dXJuIGFzcGVjdDsKKwl9CisJLyoqCisJICogc2V0IHRoZSBBc3BlY3QgdGhhdCB3aWxsIGJlIGRpc3BsYXllZAorCSAqIEBwYXJhbSBhc3BlY3RTdHIgTmFtZSBvZiB0aGUgZGVzaXJlZCBBc3BlY3QuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNldEFzcGVjdChTdHJpbmcgYXNwZWN0U3RyKSB7CisJCU1hcDxTdHJpbmcsQXNwZWN0PiBhc3BlY3RNYXAgPSBBc3BlY3QuZ2V0TWFwKCk7CisJCWlmIChhc3BlY3RNYXAgIT0gbnVsbCAmJiBhc3BlY3RNYXAuc2l6ZSgpID4gMCkgeworCQkJCisJCQlBc3BlY3QgYXNwZWN0ID0gbnVsbDsJCisJCQlhc3BlY3QgPSBBc3BlY3QuZ2V0QXNwZWN0KGFzcGVjdFN0cik7CisJCQlpZiAoYXNwZWN0ID09IG51bGwgKSB7CisJCQkJR0VMb2cuZGVidWcoR0VQcmVmZXJlbmNlUGFnZS5jbGFzcywKKwkJCQkJIkludmFsaWQgYXNwZWN0IGlnbm9yZWQ6ICIrYXNwZWN0U3RyKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUF9BU1BFQ1QsYXNwZWN0U3RyKTsKKwkJCisJCUdFTG9nLmRlYnVnKEdFUHJlZmVyZW5jZVBhZ2UuY2xhc3MsCisJCQkJIkFzcGVjdCBzZXQ6ICIrYXNwZWN0U3RyKTsKKwkJcmV0dXJuOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBCQm94IGZpbHRlciBmbGFnCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzQkJPWCgpIHsKKwkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpCisJCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihQX0JCT1gpOworCQllbHNlIAorCQkJcmV0dXJuIGZhbHNlOworCX0KKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBEZWJ1ZyBmbGFnCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWcoKSB7CisJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKQorCQkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oUF9ERUJVRyk7CisJCWVsc2UgCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJLyoqCisJICogQHJldHVybiB0aGUgVGVzdCBmbGFnCisJICogPHByZT4KKwkgKiBVc2VzOgorCSAqICAtIEVuaGFuY2VkIERlYnVnIG91dHB1dCAodGltZSBhbmQgdGhyZWFkKQorCSAqICAtIEZpbHRlciBvdXQgbm9kZXMKKwkgKiAgICAtIEttbERpc3BsYXkgLSBpZiBub3QgQkJveCBmaWx0ZXIgdGhlbiBub3QgVVMgb3IgTWV4aWNvCisJICogICAgLSBLbWxEaXNwbGF5Q3VzdG9tIC0gbm90IFVTCisJICogVG8gc2VlIHdoZXJlIGVsc2UgdGhpcyBpcyB1c2VkIGFzayB0byBzZWUgY2FsbCBoaWVyYXJjaHkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUZXN0KCkgeworCQkKKwkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpCisJCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihQX1RFU1QpOworCQllbHNlIAorCQkJcmV0dXJuIHRydWU7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIFNob3dCb3JkZXIgZmxhZworCSAqIDxwcmU+CisJICogV2l0aCBLTUwgeW91IGNhbiBlaXRoZXIgc2hvdyB0aGUgcG9seWdvbiBib3JkZXJzIG9yIG5vdC4KKwkgKiBUaGlzIGZsYWcgd2lsbCBjb250cm9sIHdoZXRoZXIgdGhleSBhcmUgc2hvd24gb3Igbm90LgorCSAqIFRoZSBkZWZhdWx0IGlzIHRvIG5vdCBzaG93IHRoZW0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTaG93Qm9yZGVyKCkgeworCQkKKwkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpCisJCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihQX1NIT1dfQk9SREVSKTsKKwkJZWxzZSAKKwkJCXJldHVybiB0cnVlOworCX0KKwkvLyBUT0RPIGtlZXAgdGhpcyB1cCB0byBkYXRlCisJLyoqCisJICogVG8gZGlzcGxheSBhbGwgb2YgdGhlIFByZWZlcmVuY2VzLgorCSAqIAorCSAqIFBsZWFzZSBrZWVwIHRoaXMgdXAgdG8gZGF0ZS4gCisJICogCisJICogQHJldHVybiBzdHJpbmcgZGVzY3JpYmluZyB0aGUgY3VycmVudCBwcmVmZXJlbmNlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNwbGF5KCkgeworCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgIFN0cmluZ0J1ZmZlcigyMDApOworCQkKKwkJc2IuYXBwZW5kKCJTVEVNLUdvb2dsZUVhcnRoIFByZWZlcmVuY2VzOlxuIik7CisJCQorCQlzYi5hcHBlbmQoIlBfTUVUSE9EOiAiKTsKKwkJc3dpdGNoIChnZXRNZXRob2QoKSkgeworCQljYXNlIE1fTE9HX09OTFk6CisJCQlzYi5hcHBlbmQoIk1fTE9HX09OTFkgIik7CisJCQlicmVhazsKKwkJY2FzZSBNX0xPR19TRVJWTEVUOgorCQkJc2IuYXBwZW5kKCJNX0xPR19TRVJWTEVUICIpOworCQkJYnJlYWs7CisJCWNhc2UgTV9BU1lOQ19TRVJWTEVUOgorCQkJc2IuYXBwZW5kKCJNX0FTWU5DX1NFUlZMRVQgIik7CisJCQlicmVhazsKKwkJY2FzZSBNX0FVVE9fTEFVTkNIOgorCQkJc2IuYXBwZW5kKCJNX0FVVE9fTEFVTkNIICIpOworCQkJYnJlYWs7CisJCWNhc2UgTV9NQU5VQUxfRElTUExBWToKKwkJCXNiLmFwcGVuZCgiTV9NQU5VQUxfRElTUExBWSAiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc2IuYXBwZW5kKCJVbmtub3duICIpOworCQl9CisJCXNiLmFwcGVuZCgiXG4iKTsKKwkJCisJCQorCQlzYi5hcHBlbmQoIlBfRk9MREVSOiAiKTsKKwkJc2IuYXBwZW5kKGdldEZvbGRlcigpKyJcbiIpOworCisJCXNiLmFwcGVuZCgiUF9TRVJWRVJfSE9TVDogIik7CisJCXNiLmFwcGVuZChnZXRTZXJ2ZXJIb3N0KCkrIlxuIik7CQkKKworCQlzYi5hcHBlbmQoIlBfSU5URVJOQUxfU0VSVkVSOiAiKTsKKwkJc2IuYXBwZW5kKGlzSW50ZXJuYWxTZXJ2ZXIoKSsiXG4iKTsKKwkJCisJCXNiLmFwcGVuZCgiUF9BVVRPX0xBVU5DSDogIik7CisJCXNiLmFwcGVuZChpc0F1dG9MYXVuY2goKSsiXG4iKTsKKworCQlzYi5hcHBlbmQoIlBfQVVUT19MT0dHSU5HOiAiKTsKKwkJc2IuYXBwZW5kKGlzQXV0b0xvZ2dpbmcoKSsiXG4iKTsKKworCQlzYi5hcHBlbmQoIlBfV0hJQ0hfQ1lDTEU6ICIpOworCQlzYi5hcHBlbmQoZ2V0V2hpY2hDeWNsZSgpKyJcbiIpOworCQkKKwkJc2IuYXBwZW5kKCJQX0FTUEVDVDogIik7CisJCXNiLmFwcGVuZChnZXRBc3BlY3QoKS50b1N0cmluZygpKyJcbiIpOworCQkKKwkJc2IuYXBwZW5kKCJQX0JCT1g6ICIpOworCQlzYi5hcHBlbmQoaXNCQk9YKCkrIlxuIik7CisKKwkJc2IuYXBwZW5kKCJQX0RFQlVHOiAiKTsKKwkJc2IuYXBwZW5kKGlzRGVidWcoKSsiXG4iKTsKKyAgLy8gCisgIC8vICBUaGUgZm9sbG93aW5nIGFyZSBmb3VuZCBpbiBHRUFkdmFuY2VkUHJlZmVyZW5jZVBhZ2UKKyAgLy8KKwkJc2IuYXBwZW5kKCJQX1RFU1Q6ICIpOworCQlzYi5hcHBlbmQoaXNUZXN0KCkrIlxuIik7CisJCQorCQlzYi5hcHBlbmQoIlBfU0hPV19CT1JERVI6ICIpOworCQlzYi5hcHBlbmQoaXNTaG93Qm9yZGVyKCkrIlxuIik7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3ZpZXdzL0dFVmlldy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS92aWV3cy9HRVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzE2NjljCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS92aWV3cy9HRVZpZXcuamF2YQpAQCAtMCwwICsxLDczMiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnZpZXdzOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29sb3JSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkFzcGVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkdFSW50ZXJmYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuR0VMb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5rbWwuU3RlbUttbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnZpZXdzLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7CisKKworLyoqCisgKiBHRVZpZXc6IE9wZW5zIGEgdmlldyBvZiBTVEVNIHRoYXQgY29udHJvbHMgdGhlIAorICogaW50ZXJmYWNlIHRvIEdvb2dsZUVhcnRoLiA8cD4gCisgKiBUaGUgYWN0dWFsIGludGVyZmFjZSB0byBHb29nbGVFYXJ0aCBpcyBoYW5kbGVkIGJ5IEdFSW50ZXJmYWNlIGNsYXNzCisgKiBUaGlzIEdVSSB2aWV3IG9ubHkgaGFuZGxlcyB0aGUgZGlyZWN0IFVzZXIgaW50ZXJmYWNlLiAgCisgKiA8cD4gCisgKiBJdCBkaXNwbGF5cyBhIHdpbmRvdyB3aXRoIGEgbGlzdCBvZiBhY3RpdmUgc2ltdWxhdGlvbnMgYW5kIAorICogc3VwcG9ydHMgYSBwb3B1cCBjb250ZXh0IHdpbmRvdyB0aGF0IGFsbG93cyBhIHNldCBvZiBhY3Rpb25zIAorICogZWl0aGVyIGdsb2JhbCBhY3Rpb25zIG9yIGFjdGlvbnMgb24gYSBzcGVjaWZpYyBzaW11bGF0aW9uCisgKiAgIAorICogCisgKiA8cD4KKyAqLworCitwdWJsaWMgY2xhc3MgR0VWaWV3IGV4dGVuZHMgVmlld1BhcnQgIHsKKwkKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgR29vZ2xlRWFydGggVmlldworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0dFX1ZJRVcgPSBDb25zdGFudHMuSURfUk9PVAorCQkJKyAiLnVpLnZpZXdzLmdlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQSBMaXN0Vmlld2VyIHRoYXQgd2lsbCBsaXN0IHNpbXVsYXRpb25zIHRoYXQgd2UgCisJICogY2FuIHdhdGNoLiAKKwkgKi8KKwlwcml2YXRlIExpc3RWaWV3ZXIgdmlld2VyID0gbnVsbDsKKwkKKwkKKworCS8qKgorCSAqIEFjdGl2YXRvciBmb3IgdGhlIHVpIHByb2plY3QuCisJICogVGhpcyBpcyBoZXJlIHRvIG1ha2UgaXQgY2xlYXIgd2hpY2ggQWN0aXZhdG9yIHdlIAorCSAqIGFyZSByZWZlcmluZyB0by4KKwkgKi8KKwlwcml2YXRlIG9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yIHVpQWN0aXZhdG9yID0gbnVsbDsKKwkvKioKKwkgKiBUaGUgY29sb3IgcmVnaXN0cnkgbWFuYWdlcyBTV1QgY29sb3JzLCBjcmVhdGVzIHRoZW0gb24tZGVtYW5kLCBhbmQgdGFrZXMKKwkgKiBjYXJlIG9mIGRpc3Bvc2FsLgorCSAqLworCXByaXZhdGUgc3RhdGljIENvbG9yUmVnaXN0cnkgY29sb3JSZWdpc3RyeSA9IG51bGw7CisJLyoqCisJICogcmVmZXJlbmNlIHRvIGNvbnRlbnRwcm92aWRlciBmb3IgdGhlIExpc3RWaWV3ZXIKKwkgKi8KKwlwcml2YXRlIEdFVmlld0NvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBudWxsOworCS8qKgorCSAqIHJlZmVyZW5jZSB0byB0aGUgaW50ZXJmYWNlIGNsYXNzCisJICovCisJcHJpdmF0ZSBHRUludGVyZmFjZSBnZWkgPSBudWxsOworCisJCisKKwkKKwkvKioKKwkgKiBzZXQgdG8gdHJ1ZSB3ZW4gR29vZ2xlRWFydGggdmlldyBzdGFydHMKKwkgKiBVc2VkIHRvIHByZXZlbnQgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGFjdGl2ZSA9IGZhbHNlOworCQorCS8qKgorCSAqIFNvbWUgY29uc3RhbnRzIHdlIG5lZWQgdG8gc2V0IHByZWZlcnJlZCBzaXplcyBvZiBTV1QgY29udHJvbHMgYW5kCisJICogY29udGFpbmVycy4KKwkgKi8KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFOREFSRF9MRU5HVEggPSAzNzA7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBTkRBUkRfSEVJR0hUID0gMTU7CisKKwkKKwkvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisJICogQ29uc3RydWN0b3IKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyoqCisJICogVGhlIEdFVmlldyBjb25zdHJ1Y3RvciBnZXRzIGNvbnRyb2wgd2hlbiB0aGUgdXNlciBvcGVucyAKKwkgKiB0aGUgIlZpZXciIGluIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlLgorCSAqIAorCSAqIEluIHRoZSBHRVZpZXcgY29uc3RydWN0b3Igd2Ugd2lsbCBjcmVhdGUgYW4KKwkgKiBpbnN0YW5jZSBvZiBHRUludGVyZmFjZSB3aGljaCBkb2VzIGFsbCB0aGUgd29yay4KKwkgKiAKKwkgKiAKKwkgKi8KKwlwdWJsaWMgR0VWaWV3KCkgeworCQlpZiAoYWN0aXZlKSB7CisJCQlHRUxvZy5lcnJvcigiU1RFTSAtIEdvb2dsZUVhcnRoIGludGVyZmFjZSBhbHJlYWR5IGFjdGl2ZSIsbnVsbCk7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRHVwbGljYXRlIik7CisJCX0KKwkJYWN0aXZlID0gdHJ1ZTsKKwkJZ2VpID0gbmV3IEdFSW50ZXJmYWNlKHRoaXMpOwkJCQorCQlHRUxvZy5kZWJ1ZyhHRVZpZXcuY2xhc3MsImdlaT0iK2dlaSk7CQorLy8JCSBTZXQgdGhlIGNvbG9yIHJlZ2lzdHJ5CisJCWlmIChjb2xvclJlZ2lzdHJ5ID09IG51bGwpIHsKKwkJCXVpQWN0aXZhdG9yID0gb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3IuZ2V0RGVmYXVsdCgpOworCQkJY29sb3JSZWdpc3RyeSA9IHVpQWN0aXZhdG9yLmdldENvbG9yUmVnaXN0cnkoKTsKKwkJfQorCQkKKwkJCQkJCisJfQorCisKKwkKKwkvKioKKwkgKiBUaGlzIGlzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGFsbG93IHVzCisJICogdG8gY3JlYXRlIHRoZSB2aWV3ZXIgYW5kIGluaXRpYWxpemUgaXQuCisJICogV2UgYWxzbyBhZGQgc29tZSB1c2VmdWwgYnV0dG9ucyB0byB0aGUgdmlldworCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQgQ29tcG9zaXRlIHRvIHdvcmsgd2l0aAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQkvLwkgZ2V0IG91ciBwcmVmZXJlbmNlcyAKKyAgICAgICAgCisJCWJvb2xlYW4gZGVidWcgPSBHRVByZWZlcmVuY2VQYWdlLmlzRGVidWcoKTsKKwkJaWYgKGRlYnVnKSB7CisJCQlHRUxvZy5ERUJVRyA9IHRydWU7CisJCQlHRUxvZy5kZWJ1Zyh0aGlzLCJEZWJ1ZyBvcHRpb24gdHVybmVkIG9uLiIpOworCQl9IGVsc2UgeworCQkJR0VMb2cuZGVidWcodGhpcywiRGVidWcgb3B0aW9uIGJlaW5nIHR1cm5lZCBvZmYuIik7CisJCQlHRUxvZy5ERUJVRyA9IGZhbHNlOworCQl9CisJCUdFTG9nLmRlYnVnKCJHRVZpZXcuY3JlYXRlUGFydENvbnRyb2w6Iik7CisJCQorCSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOworCSAgICAKKyAgICAgICAgLy8JIHNldHVwIHRoZSBhc3BlY3QgZGlzcGxheSBidXR0b25zICAKKworCQlwYXJlbnQuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOworCQlTdHJpbmcgYXNwZWN0ID0gQXNwZWN0LmdldERlZmF1bHRDb2RlKCk7CisJCWNyZWF0ZUNvbnRyb2xCdXR0b25zKHBhcmVudCxhc3BlY3QpOworCQkKKwkJCisgICAgICAgIC8vIHNldHVwIHRoZSBMaXN0IG9mIFNpbXVsYXRpb25zCQkKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkgICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJICAgIGdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCSAgICBDb21wb3NpdGUgY29udHJvbCA9IGdldFNjcm9sbGFibGUocGFyZW50LGdyaWREYXRhKTsKKwkJY29udHJvbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7CisKKwkJdmlld2VyID0gbmV3IExpc3RWaWV3ZXIoY29udHJvbCk7CisJCS8vIHdlIHByb3ZpZGUgdGhlIENvbnRlbnRQcm92aWRlciBhbmQgTGFiZWxQcm92aWRlciBjbGFzc2VzCisJCQorCQljb250ZW50UHJvdmlkZXIgPSBuZXcgR0VWaWV3Q29udGVudFByb3ZpZGVyKGdlaSk7IAorCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7CisJCUdFVmlld0xhYmVsUHJvdmlkZXIgbHAgPSBuZXcgR0VWaWV3TGFiZWxQcm92aWRlcigpOworCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihscCApOworCQlscC5zZXRHRUkoZ2VpKTsKKwkJLy8gZGVmaW5lIHRoZSBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgdGhlIHBhcmVudCAKKwkJLy8gcGFzc2VkIHRvIHRoZSBnZXRFbGVtZW50cyBtZXRob2QKKwkJdmlld2VyLnNldElucHV0KFNpbXVsYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKSk7CisgICAgICAgIC8vV2UgYWxzbyB3YW50IHRvIGJlIGFibGUgdG8gaGF2ZSBhIHVzZXIgc2VsZWN0IGEgc2ltbHVhdGlvbiBmcm9tIG91cgorCQkvLyB2aWV3IGFuZCBoYXZlIHRoYXQgYmVlbiBzZWVuIGJ5IG90aGVycy4gU28gd2UgcmVnaXN0ZXIgdGhlIExpc3RWaWV3ZXIKKwkJLy8gaW5zdGFuY2UgYXMgdGhlIHZpZXcncyBzZWxlY3Rpb24gcHJvdmlkZXIuIFdoZW4geW91IGNsaWNrIG9uIHRoZSBHVUkKKwkJLy8gaXQgZmluZHMgdGhlIHVuZGVybHlpbmcgT2JqZWN0IChpLmUuLCBJU2ltdWxhdGlvbikgeW91IHNlbGVjdGVkIGFuZAorCQkvLyBwYXNzZXMgaXQgdG8gdGhlIHNlbGVjdGlvbiBzZXJ2aWNlLgorCQlnZXRTaXRlKCkuc2V0U2VsZWN0aW9uUHJvdmlkZXIodmlld2VyKTsKKwkJCisJCQorCQkvLyBpZiB3ZSB3YW50ZWQgdG8gbGlzdGVuIHRvIGFsbCBzZWxlY3Rpb24gZXZlbnRzIAorCQlJV29ya2JlbmNoV2luZG93IHd3ID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpOworCQlJU2VsZWN0aW9uU2VydmljZSBzcyA9IHd3LmdldFNlbGVjdGlvblNlcnZpY2UoKTsKKwkJc3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIoY29udGVudFByb3ZpZGVyKTsKKwkJLy8gKGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuYWRkU2VsZWN0aW9uTGlzdGVuZXIoY29udGVudFByb3ZpZGVyKTsKKwkJCisJCQorCQlib29sZWFuIG9rID0gZ2VpLmluaXQoKTsgCisJCWlmICggISBvayApIHsKKwkJCUdFTG9nLmRlYnVnKHRoaXMsZ2VpLmdldEVycm9yTWVzc2FnZSgpKTsKKwkJCXNob3dNZXNzYWdlKGdlaS5nZXRFcnJvck1lc3NhZ2UoKSk7CisJCSAgICBnZWkuc2V0RXJyb3JNZXNzYWdlKG51bGwpOworCQl9CisJCS8vIG1ha2UgdGhlIHBvcHVwIG1lbnUgYWN0aW9ucworCQlHRVZpZXdBY3Rpb25zIGFjdGlvbnMgPSBuZXcgR0VWaWV3QWN0aW9ucyh0aGlzLGdlaSk7CisJCWlmIChhY3Rpb25zID09IG51bGwpIHsKKwkJCUdFTG9nLmVycm9yKCJVbmFibGUgdG8gc2V0dXAgY29udGV4dCBtZW51IixudWxsKTsKKwkJfQorCQkKKwkJYm9vbGVhbiBhdXRvTGF1bmNoID0gR0VQcmVmZXJlbmNlUGFnZS5pc0F1dG9MYXVuY2goKTsKKwkJaWYgKGF1dG9MYXVuY2gpIHsKKwkJCVN0ZW1LbWwubGF1bmNoR0UoKTsKKwkJfQkJCisJfQorCS8qKgorCSAqIGNhbGwgdGhlIHJlZnJlc2ggbWV0aG9kIGZvciB0aGUgdmlld2VyCisJICoKKwkgKi8KKwlwdWJsaWMgdm9pZCByZWZyZXNoKCkgeworCQl2aWV3ZXIucmVmcmVzaCgpOworCX0KKwkvKioKKwkgKiBQdXQgdXAgYSBkaWFsb2cgYm94IHdpdGggYW4gaW5mb3JtYXRpb25hbCBtc2cKKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqLworCXB1YmxpYyB2b2lkIHNob3dNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CisJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKAorCQkJdmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLAorCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJHRVZpZXcuMjciKSwgLy8kTk9OLU5MUy0xJAorCQkJbWVzc2FnZSk7CisJfQorCS8qKgorCSAqIFB1dCB1cCBhIGRpYWxvZyBib3ggd2l0aCBhIHdhcm5pbmcgbXNnCisJICogCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKi8KKwkKKy8vCXByaXZhdGUgdm9pZCBzaG93V2FybmluZyhTdHJpbmcgbWVzc2FnZSkgeworLy8JCU1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoCisvLwkJCXZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwKKy8vCQkJIkdFVmlldzogR29vZ2xlRWFydGggVmlldyIsCisvLwkJCW1lc3NhZ2UpOworLy8JfQorCQorCQorCS8qKgorCSAqIFZlcmlmeSB0aGF0IHdlIGNhbiB1c2UgdGhlIGZvbGRlciB0byBzdG9yZSBLTUwKKwkgKiBAcGFyYW0gZm9sZGVyCisJICogQHJldHVybiB2ZXJpZmllZCBmb2xkZXIKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHZlcmlmeUZvbGRlcihTdHJpbmcgZm9sZGVyKSB7CisJCWZvbGRlciA9IGZvbGRlckRpYWxvZyhmb2xkZXIpOworCQlHRUxvZy5kZWJ1Zyh0aGlzLCJ2ZXJpZnlGb2xkZXI9Iitmb2xkZXIpOworCQlpZiAoZm9sZGVyICE9IG51bGwpCisJCSAgICBHRVByZWZlcmVuY2VQYWdlLnNldEZvbGRlcihmb2xkZXIpOworCQlyZXR1cm4gZm9sZGVyOworCX0KKwkKKworCisJCisJCisJLyoqCisJICogZGlhbG9nIHRvIGNob29zZSBhIGZvbGRlciB0byBzdG9yZSBmaWxlcyBpbnRvLgorCSAqIAorCSAqIElmIERlZmF1bHQgZm9sZGVyIGV4aXN0LCBpdCB3aWxsIGJlIHVzZWQuCisJICogaWYgZGVmYXVsdCBmb2xkZXIgaXMgbnVsbCBvciBkb2VzIG5vdCBleGlzdCwKKwkgKiB0aGVuIHN5c3RlbSB0ZW1wb3JhcnkgZm9sZGVyIHdpbGwgYmUgdXNlZCBhcyBkZWZhdWx0CisJICogYW5kIGEgZGlhbG9nIHdpbGwgYmUgc2hvd24uCisJICogPHA+CisJICogSWYgdGhlcmUgYXJlIGV4aXN0aW5nIEtNTCBmaWxlcyBpbiB0aGUgZm9sZGVyCisJICogYSBwcm9tcHQgd2lsbCBiZSBwcm9kdWNlZCBhc2tpbmcgaWYgdGhleSBzaG91bGQgYmUgcmVtb3ZlZC4KKwkgKiAKKwkgKiBAcGFyYW0gZGVmbHQgRGVmYXVsdCBmb2xkZXIuCisJICogQHJldHVybiBmb2xkZXIgcGF0aC4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBmb2xkZXJEaWFsb2coU3RyaW5nIGRlZmx0KSB7CisJCVN0cmluZyBmb2xkZXIgPSBudWxsOworCQl0cnkgeworCQkJaWYgKGRlZmx0ICE9IG51bGwpIHsKKwkJCQlGaWxlIGRlZmF1bHRmID0gbmV3IEZpbGUoZGVmbHQpOworCQkJCWlmIChkZWZhdWx0Zi5leGlzdHMoKSAmJiBkZWZhdWx0Zi5pc0RpcmVjdG9yeSgpKSB7CisJCQkJCWZvbGRlciA9IGRlZmx0OworCQkJCX0gZWxzZSB7CisJCQkJCWZvbGRlciA9IG51bGw7CisJCQkJfQorCQkJfQorCQkJd2hpbGUgKHRydWUpIHsKKwkJCQlpZiAoZm9sZGVyID09IG51bGwpIHsKKwkJCQkJLy8gZ2V0IHRtcCBmaWxlIGZvbGRlcgorCQkJCQlGaWxlIHRtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJYWFgiLCJ0bXAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCWZvbGRlciA9IHRtcEZpbGUuZ2V0UGFyZW50KCk7CisJCQkJCVNoZWxsIHNoZWxsID0gdmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpOworCQkJCQlpbnQgc3R5bGUgPSBTV1QuQVBQTElDQVRJT05fTU9EQUw7CisJCQkJCURpcmVjdG9yeURpYWxvZyBmZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsc3R5bGUpOworCQkJCQlmZC5zZXRGaWx0ZXJQYXRoKGZvbGRlcik7CisJCQkJCWZkLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJHRVZpZXcuMzAiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJZmQuc2V0TWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIkdFVmlldy4zMSIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJCXdoaWxlICh0cnVlKSB7CisJCQkJCQlmb2xkZXIgPSBmZC5vcGVuKCk7CisJCQkJCQlpZiAoZm9sZGVyID09IG51bGwpIHsKKwkJCQkJCQkvLyB1c2VyIHByZXNzZWQgY2FuY2VsCisJCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCQl9IGVsc2UgewkJICAgIAorCQkJCQkJCUZpbGUgZGlyID0gbmV3IEZpbGUoZm9sZGVyKTsKKwkJCQkJCQlpZiAoZGlyLmV4aXN0cygpICYmIGRpci5pc0RpcmVjdG9yeSgpKSB7CisJCQkJCQkJCWJvb2xlYW4gb2sgPSBjaGVja0NvbnRlbnRzKGZvbGRlcik7CisJCQkJCQkJCWlmIChvaykgCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9IGlmICghZGlyLmV4aXN0cygpKSB7CisJCQkJCQkJCWRpci5ta2RpcnMoKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0gIC8vIHdoaWxlKHRydWUpCisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7IAorCQkJCQkvLyB1c2luZyB0aGUgc3BlY2lmaWVkIGZvbGRlci4gIAorCQkJCQkvLyBjaGVjayBpZiBLTUwgZmlsaWVzIHRvIGJlIGRlbGV0ZWQuCisJCQkJCWJvb2xlYW4gb2sgPSBjaGVja0NvbnRlbnRzKGZvbGRlcik7CisJCQkJCWlmIChvaykgCisJCQkJCQlicmVhazsKKwkJCQkJZWxzZSAKKwkJCQkJCWZvbGRlciA9IG51bGw7CisJCQkJfQorCQkJfQorCQkJCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiB0KSB7CisJCQkKKwkJCUdFTG9nLmVycm9yKCJGb2xkZXIgRGlhbG9nIiwgdCk7CisJCX0KKwkJcmV0dXJuIGZvbGRlcjsKKwl9CisKKworCS8qKgorCSAqIGRpYWxvZyB0byBjaG9vc2UgYSBmb2xkZXIgdG8gZGlzcGxheSBmaWxlcyBmcm9tLgorCSAqIAorCSAqIEl0IGlzIGV4cGVjdGVkIHRvIGhhdmUgS01MIGZpbGVzIGluIGl0IGFscmVhZHkKKwkgKiAKKwkgKiBAcGFyYW0gZm9sZGVyIERlZmF1bHQgZm9sZGVyLgorCSAqIEByZXR1cm4gZm9sZGVyIHBhdGggb3IgbnVsbCBpZiBubyBkaXNwbGF5IGRlc2lyZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGRpc3BsYXlGb2xkZXJEaWFsb2coU3RyaW5nIGZvbGRlcikgeworCQlTdHJpbmcgZGlzcGxheUZvbGRlciA9IG51bGw7CisJCXRyeSB7CisJCQlpZiAoZm9sZGVyICE9IG51bGwpIHsKKwkJCQlGaWxlIGRlZmF1bHRmID0gbmV3IEZpbGUoZm9sZGVyKTsKKwkJCQlpZiAoZGVmYXVsdGYuZXhpc3RzKCkgJiYgZGVmYXVsdGYuaXNEaXJlY3RvcnkoKSkgeworCQkJCQlkaXNwbGF5Rm9sZGVyID0gZm9sZGVyOworCQkJCX0gZWxzZSB7CisJCQkJCWRpc3BsYXlGb2xkZXIgPSBudWxsOworCQkJCX0KKwkJCX0KKwkJCXdoaWxlICh0cnVlKSB7CisKKwkJCQlTaGVsbCBzaGVsbCA9IHZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKTsKKwkJCQlpbnQgc3R5bGUgPSBTV1QuQVBQTElDQVRJT05fTU9EQUw7CisJCQkJRGlyZWN0b3J5RGlhbG9nIGZkID0gbmV3IERpcmVjdG9yeURpYWxvZyhzaGVsbCxzdHlsZSk7CisJCQkJZmQuc2V0RmlsdGVyUGF0aChkaXNwbGF5Rm9sZGVyKTsKKwkJCQlmZC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiR0VWaWV3LjMwIikpOyAvLyROT04tTkxTLTEkCisJCQkJZmQuc2V0TWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIkdFVmlldy4zNCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJZGlzcGxheUZvbGRlciA9IGZkLm9wZW4oKTsKKwkJCQlpZiAoZGlzcGxheUZvbGRlciAhPSAgbnVsbCkgeworCQkJCQlpZiAodmFsaWRGb2xkZXIoZGlzcGxheUZvbGRlcikpIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gdXNlciBjYW5jZWxlZCAgb3V0CisJCQkJCWRpc3BsYXlGb2xkZXIgPSBudWxsOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9ICAvLyB3aGlsZSh0cnVlKQorCQl9IGNhdGNoIChFeGNlcHRpb24gdCkgeworCQkJR0VMb2cuZXJyb3IoIkdFVmlldzogZGlzcGxheUZvbGRlckRpYWxvZyIsIHQpOworCQkJZGlzcGxheUZvbGRlciA9IG51bGw7CisJCX0KKwkJcmV0dXJuIGRpc3BsYXlGb2xkZXI7CisJfQorCisJCisJLyoqCisJICogVmVyaWZ5IGlmIGZvbGRlciBjb250YWlucyBLTUwgZmlsZXMKKwkgKiAKKwkgKiBAcGFyYW0gZm9sZGVyCisJICogQHJldHVybiB0cnVlIGlmIGNvbnRhaW5zIEtNTCBmaWxlcyBvciB1c2VyIG9rcyBpdAorCSAqLworCXByaXZhdGUgYm9vbGVhbiB2YWxpZEZvbGRlcihTdHJpbmcgZm9sZGVyKSB7CisJCWJvb2xlYW4gb2sgPSBmYWxzZTsKKwkJRmlsZSBkaXIgPSBuZXcgRmlsZShmb2xkZXIpOworCQlpZiAoZGlyLmV4aXN0cygpICYmIGRpci5pc0RpcmVjdG9yeSgpKSB7CisKKwkJCUZpbGVbXSBjb250ZW50cyA9IGZpbGVMaXN0KGRpcik7CisJCQlpZiAoY29udGVudHMubGVuZ3RoID4gMCkgeworCQkJCW9rID10cnVlOworCQkJfSBlbHNlIHsKKwkJCQkvLyBpZiBubyBleGlzdGluZyBmaWxlcyBhc2sKKwkJCQlTaGVsbCBzaGVsbCA9IHZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKTsKKwkJCQlpbnQgc3R5bGUgPSBTV1QuQVBQTElDQVRJT05fTU9EQUx8CisJCQkJU1dULklDT05fUVVFU1RJT058U1dULllFU3xTV1QuTk87CisJCQkJTWVzc2FnZUJveCBxdWVzdGlvbiA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLHN0eWxlKTsKKworCQkJCVN0cmluZyB0ZW1wbGF0ZSA9IE1lc3NhZ2VzLmdldFN0cmluZygiR0VWaWV3LjMzIik7CSAgLy8kTk9OLU5MUy0xJAorCQkJCVN0cmluZyBvdXRwdXQgPSBTdHJpbmcuZm9ybWF0KHRlbXBsYXRlLGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisJCQkJcXVlc3Rpb24uc2V0TWVzc2FnZShvdXRwdXQpOworCisJCQkJaW50IGFucyA9IHF1ZXN0aW9uLm9wZW4oKTsKKwkJCQlpZiAoYW5zPT1TV1QuWUVTKSB7CisJCQkJCW9rID0gdHJ1ZTsJCQkJCisJCQkJfQorCQkJfQkJCQkJCQkKKwkJfQorCisJCXJldHVybiBvazsKKwl9CisgICAgCisJLyoqCisJICogQ2hlY2sgdGhlIHNwZWNpZmllZCBmb2xkZXIgZm9yIGV4aXN0aW5nIEtNTCBmaWxlcworCSAqIGFuZCBpZiBzbyBhc2sgaWYgdGhleSBzaG91bGQgYmUgcmVtb3ZlZC4KKwkgKiAKKwkgKiBAcGFyYW0gZm9sZGVyCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBmb2xkZXIgY2FuIGJlIHVzZWQuCisJICogICBmYWxzZSBpZiBhIG5ldyBmb2xkZXIgc2hvdWxkIGJlIGNob3Nlbi4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tDb250ZW50cyhTdHJpbmcgZm9sZGVyKSB7CisJCWJvb2xlYW4gb2sgPSBmYWxzZTsKKwkJRmlsZSBkaXIgPSBuZXcgRmlsZShmb2xkZXIpOworCQlGaWxlW10gY29udGVudHMgPSBmaWxlTGlzdChkaXIpOworCQlpZiAoY29udGVudHMubGVuZ3RoID09IDApIHsKKwkJCW9rID10cnVlOworCQl9IGVsc2UgeworCQkJLy8gaWYgZXhpc3RpbmcgZmlsZXMgYXNrCisJCQlTaGVsbCBzaGVsbCA9IHZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKTsKKwkJCWludCBzdHlsZSA9IFNXVC5BUFBMSUNBVElPTl9NT0RBTHwKKwkJCVNXVC5JQ09OX1FVRVNUSU9OfFNXVC5ZRVN8U1dULk5PfFNXVC5DQU5DRUw7CisJCQlNZXNzYWdlQm94IHF1ZXN0aW9uID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsc3R5bGUpOworCisJCQlTdHJpbmcgdGVtcGxhdGUgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIkdFVmlldy4zMiIpOwkJCQkJICAgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nIG91dHB1dCA9IFN0cmluZy5mb3JtYXQodGVtcGxhdGUsZGlyLmdldEFic29sdXRlUGF0aCgpKTsKKwkJCXF1ZXN0aW9uLnNldE1lc3NhZ2Uob3V0cHV0KTsKKworCQkJaW50IGFucyA9IHF1ZXN0aW9uLm9wZW4oKTsKKwkJCWlmIChhbnM9PVNXVC5ZRVMpIHsKKworCQkJCXRyeSB7CisJCQkJCWZvciAoRmlsZSBmOmNvbnRlbnRzKSB7CQkJCQkJCQorCQkJCQkJZi5kZWxldGUoKTsKKwkJCQkJfQorCQkJCQlvayA9IHRydWU7OworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCUdFTG9nLmVycm9yKCJVbmFibGUgdG8gZGVsZXRlIEtNTCBmaWxlcyIsIGUpOworCisJCQkJfQorCQkJfSBlbHNlIGlmIChhbnM9PVNXVC5OTykgeworCQkJCS8vIHVzZXIgc2FpZCBpdCB3YXMgb2sgdG8gbm90IGRlbGV0ZSBmaWxlcworCQkJCW9rID0gdHJ1ZTsKKwkJCX0gCisJCX0JCQorCQlyZXR1cm4gb2s7CisJfQorCQkKKwkvKioKKwkgKiBnZXQgdGhlIGxpc3Qgb2YgZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBmb2xkZXIuCisJICogVGhlIGZpbGVzIHdpbGwgb25seSBiZSBmaWxlcyB3aXRoIHRoZSAua21sIAorCSAqIGV4dGVuc2lvbiBhbmQgd2lsbCBiZSBzb3J0ZWQgYnkgZmlsZW5hbWUuCisJICogQWxzbyBuZXRsaW5rIGZpbGVzIHdpbGwgYmUgZmlsdGVyZWQgb3V0CisJICogCisJICogQHBhcmFtIGZvbGRlciBEaXJlY3RvcnkgdGhhdCBjb250YWlucyBLTUwgZmlsZXMgdG8gZGlzcGxheQorCSAqIEByZXR1cm4gYXJyYXkgb2YgZmlsZW5hbWVzCisJICovCisKKwlwcml2YXRlIEZpbGVbXSBmaWxlTGlzdChGaWxlIGZvbGRlcikgeworCisJCUZpbGVGaWx0ZXIgZmYgPSBuZXcgRmlsZUZpbHRlcigpIHsKKwkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpeworCQkJCWlmIChmLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoIm5ldCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlpZiAoZi5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmttbCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfTsJCQkKKworCQl0cnkgewkJCQkJCQorCQkJRmlsZVtdIGZpbGVzID0gZm9sZGVyLmxpc3RGaWxlcyhmZik7CisJCQlpZiAoZmlsZXMgPT0gbnVsbCkgeworCQkJCXJldHVybiBuZXcgRmlsZVswXTsKKwkJCX0JCQkKKwkJCXJldHVybiBmaWxlczsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsJCQorCQkJR0VMb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwkvKioKKwkgKiBQYXNzaW5nIHRoZSBmb2N1cyByZXF1ZXN0IHRvIHRoZSB2aWV3ZXIncyBjb250cm9sLgorCSAqLworCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgeworCQkvL2xvZygic2V0Rm9jdXMoKTogIik7CisJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB2aWV3ZXIKKwkgKi8KKwlwdWJsaWMgTGlzdFZpZXdlciBnZXRWaWV3ZXIoKSB7CisJCXJldHVybiB2aWV3ZXI7CisJfQorCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJR0VMb2cuZGVidWcodGhpcywiRGlzcG9zZSgpIik7CisJCWdlaS5kaXNwb3NlKCk7CisJCWFjdGl2ZSA9IGZhbHNlOworCX0KKworCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjb250ZW50UHJvdmlkZXIKKwkgKi8KKwlwdWJsaWMgR0VWaWV3Q29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpIHsKKwkJcmV0dXJuIGNvbnRlbnRQcm92aWRlcjsKKwl9CisJCisgLyoqCisgICAqIHNldHVwIHRoZSBDb21wb3NpdGUgdGhhdCB3aWxsIGFsbG93IHNjcm9sbGluZyAKKyAgICogCisgICAqIEBwYXJhbSBwYXJlbnQgIENvbXBvc2l0ZSB0byB1c2UgYXMgcGFyZW50CisgICAqIEByZXR1cm4gdGhlIGNvbXBvc2l0ZSB0aGF0IGhvbGRzIHNjcm9sbGFibGUgc3R1ZmYuCisgICAqLworCXByaXZhdGUgQ29tcG9zaXRlIGdldFNjcm9sbGFibGUoQ29tcG9zaXRlIHBhcmVudCxHcmlkRGF0YSBncmlkRGF0YSkgeworCQkKKwkJLyoqCisJCSAqIFNvbWUgY29uc3RhbnRzIHdlIG5lZWQgdG8gc2V0IHByZWZlcnJlZCBzaXplcyBvZiBTV1QgY29udHJvbHMKKwkJICovCSAKKwkJZmluYWwgaW50IFNDUk9MTF9NSU5fTEVOR1RIID0gMzAwMDsKKworCQlmaW5hbCBpbnQgU0NST0xMX01JTl9IRUlHVEggPSAxMDAwMDsKKwkJCisJCVNjcm9sbGVkQ29tcG9zaXRlIHNjcm9sbENvbXBvc2l0ZSA9CisJCQluZXcgU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50LCBTV1QuVl9TQ1JPTEwKKwkJCQl8IFNXVC5IX1NDUk9MTCk7CisJCXNjcm9sbENvbXBvc2l0ZS5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOworCQlzY3JvbGxDb21wb3NpdGUuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7CisJCXNjcm9sbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKwkJc2Nyb2xsQ29tcG9zaXRlLnNldE1pblNpemUoU0NST0xMX01JTl9MRU5HVEgsIFNDUk9MTF9NSU5fSEVJR1RIKTsKKwkJQ29tcG9zaXRlIGNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHNjcm9sbENvbXBvc2l0ZSwgU1dULk5PTkUpOworCQkKKwkJc2Nyb2xsQ29tcG9zaXRlLnNldENvbnRlbnQoY29udHJvbCk7CisJCXJldHVybiBjb250cm9sOworCQkKKwl9CisJCQkKKwkvLyBUT0RPIG1vZGlmeSB0aGlzIHRvIGNyZWF0ZSBwdXR0b25zIGJhc2VkIG9uIEFzcGVjdCBjbGFzcworCS8vIGluc3RlYWQgb2YgaGFyZGNvZGluZyBTRUlSICAgCisJLyoqCisJICogQ3JlYXRlcyB0aGUgYXJyYXkgb2YgU1dUIHB1c2ggYnV0dG9ucyBmb3IgY2hvb3NpbmcgCisJICogdGhlIGFzcGVjdCB0byBkaXNwbGF5LiAKKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50IFBhcmVudCBDb21wb3NpdGUKKwkgKiBAcGFyYW0gY3VycmVudCAgY3VycmVudCB2YWx1ZSBvZiBBc3BlY3QKKwkgKiBAcmV0dXJuIENvbXBvc2l0IHRoYXQgaG9sZHMgdGhlIGJ1dHRvbnMuCisJICovCisJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb250cm9sQnV0dG9ucyhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgY3VycmVudCkgeworICAgICAgICAKKwkJQnV0dG9uIGRpc3BsYXkgPSBuZXcgQnV0dG9uKHBhcmVudCxTV1QuUFVTSCk7CisgICAgICAgIGRpc3BsYXkuc2V0VGV4dCgiRGlzcGxheSIpOworICAgICAgICBkaXNwbGF5LnNldFRvb2xUaXBUZXh0KCJEaXNwbGF5IGN1cnJlbnQgbWFwIik7CisgICAgICAgIGRpc3BsYXkuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgeworCQkJCXN3aXRjaCAoZS50eXBlKSB7CisJCQkJY2FzZSBTV1QuU2VsZWN0aW9uOgorCQkJCQlJU2ltdWxhdGlvbiBzaW0gPSBjb250ZW50UHJvdmlkZXIuZ2V0Q3VycmVudFNpbXVsYXRpb24oKTsKKwkJCQkJaWYgKHNpbSAhPSBudWxsKSB7CisJCQkJCQlib29sZWFuIG9rID0gZ2VpLmRpc3BsYXlNYXAoc2ltKTsKKwkJCQkJCWlmICghb2spIHsKKwkJCQkJCQlzaG93TWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIkdFVmlldy4xNSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJc2hvd01lc3NhZ2UoIk5vIGFjdGl2ZSBTaW11bGF0aW9uIik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9KTsKKyAgICAgICAgCisJCUdyb3VwIGJ0bkNvbnRhaW5lciA9IG51bGw7CisJCWZpbmFsIGludCBPRkZTRVQgPSAxNjsKKwkJYnRuQ29udGFpbmVyID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULlNIQURPV19JTik7CisgICAgICAgIGJ0bkNvbnRhaW5lci5zZXRUZXh0KCJTZWxlY3QgQXNwZWN0IHRvIGJlIGRpc3BsYXllZCIpOworCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSA0OworCQlncmlkTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7CisJCWJ0bkNvbnRhaW5lci5zZXRMYXlvdXQoZ3JpZExheW91dCk7CisKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOworCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOworCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gU1RBTkRBUkRfSEVJR0hUICsgT0ZGU0VUOworCQlncmlkRGF0YS5taW5pbXVtSGVpZ2h0ID0gU1RBTkRBUkRfSEVJR0hUICsgT0ZGU0VUOworCQlncmlkRGF0YS53aWR0aEhpbnQgPSBTVEFOREFSRF9MRU5HVEg7CisJCWdyaWREYXRhLm1pbmltdW1XaWR0aCA9IFNUQU5EQVJEX0xFTkdUSDsKKwkJYnRuQ29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOworCisJCS8vIGNyZWF0ZSB0aGUgc2ltdWxhdGlvbiBjb250cm9sIGJ1dHRvbnMKKwkJLy8gTm90ZTogdGhlc2UgYXJlIFJhZGlvIGJ1dHRvbnMgZXZlbiB0aG91IFB1c2ggQnV0dG9ucyB3b3VsZCBiZSBiZXR0ZXIKKwkJLy8gYnV0IHN0dXBpZCBlY2xpcHNlIGRvZXMgbm90IGFsbG93IHNldHRpbmcgb2YgYmFja2dyb3VuZCBjb2xvciAKKwkJLy8gZm9yIHB1c2hidXR0b25zLgorCQlCdXR0b24gYl9zID0gbmV3IEJ1dHRvbihidG5Db250YWluZXIsIFNXVC5SQURJTyk7CisJCUJ1dHRvbiBiX2UgPSBuZXcgQnV0dG9uKGJ0bkNvbnRhaW5lciwgU1dULlJBRElPKTsKKwkJQnV0dG9uIGJfaSA9IG5ldyBCdXR0b24oYnRuQ29udGFpbmVyLCBTV1QuUkFESU8pOworCQlCdXR0b24gYl9yID0gbmV3IEJ1dHRvbihidG5Db250YWluZXIsIFNXVC5SQURJTyk7CisJCQorCQkKKwkJLy8gc2V0IGFsaWdubWVudCBhbmQgYmFja2dyb3VuZCBjb2xvcgorICAgICAgICBiX3Muc2V0VGV4dCgiUyIpOyAgICAgICAgCisgICAgICAgIGJfcy5zZXRTZWxlY3Rpb24oICJTIi5lcXVhbHMoY3VycmVudCkgKTsKKyAgICAgICAgYl9zLnNldEJhY2tncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcigKKwkJCQlTV1QuQ09MT1JfQkxVRSkpOworICAgICAgICBiX3Muc2V0Rm9yZWdyb3VuZChwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKAorCQkJCVNXVC5DT0xPUl9XSElURSkpOwkJCQkKKwkJYl9zLnNldFRvb2xUaXBUZXh0KCJTdWNlcHRpcGxlIik7IC8vJE5PTi1OTFMtMSQKKwkJYl9zLnNldExheW91dERhdGEoZ2V0QnV0dG9uR3JpZERhdGEoKSk7CisKKwkJYl9lLnNldFRleHQoIkUiKTsKKwkJYl9lLnNldFNlbGVjdGlvbiggIkUiLmVxdWFscyhjdXJyZW50KSApOworCQliX2Uuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKAorCQkJCQkJU1dULkNPTE9SX1lFTExPVykpOwkKKwkJYl9lLnNldFRvb2xUaXBUZXh0KCJFeHBvc2VkIik7IC8vJE5PTi1OTFMtMSQKKwkJYl9lLnNldExheW91dERhdGEoZ2V0QnV0dG9uR3JpZERhdGEoKSk7CisKKwkJYl9pLnNldFRleHQoIkkiKTsKKwkJYl9pLnNldFNlbGVjdGlvbiggIkkiLmVxdWFscyhjdXJyZW50KSApOworCQliX2kuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKAorCQkJCQkJU1dULkNPTE9SX1JFRCkpOworCQliX2kuc2V0VG9vbFRpcFRleHQoIkluZmVjdGlvdXMiKTsgLy8kTk9OLU5MUy0xJAorCQliX2kuc2V0TGF5b3V0RGF0YShnZXRCdXR0b25HcmlkRGF0YSgpKTsKKworCQliX3Iuc2V0VGV4dCgiUiIpOworCQliX3Iuc2V0U2VsZWN0aW9uKCAiUiIuZXF1YWxzKGN1cnJlbnQpICk7CisJCWJfci5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7CisJCWJfci5zZXRUb29sVGlwVGV4dCgiUmVjb3ZlcmVkIik7IC8vJE5PTi1OTFMtMSQKKwkJYl9yLnNldExheW91dERhdGEoZ2V0QnV0dG9uR3JpZERhdGEoKSk7CisgICAgICAgIAorCQkKKwkJCisJCS8vIHNldCBldmVudCBsaXN0ZW5lcnMgZm9yIGJ1dHRvbnMKKwkJYl9zLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKKwkJCQlzd2l0Y2ggKGUudHlwZSkgeworCQkJCWNhc2UgU1dULlNlbGVjdGlvbjoJCQkJCQorCQkJCQlHRVZpZXcudGhpcy5zZXRBc3BlY3QoIlMiKTsJCQkJCQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0pOworCQliX2UuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgeworCQkJCXN3aXRjaCAoZS50eXBlKSB7CisJCQkJY2FzZSBTV1QuU2VsZWN0aW9uOgorCQkJCQlHRVZpZXcudGhpcy5zZXRBc3BlY3QoIkUiKTsJCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCWJfaS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7CisJCQkJc3dpdGNoIChlLnR5cGUpIHsKKwkJCQljYXNlIFNXVC5TZWxlY3Rpb246CisJCQkJCUdFVmlldy50aGlzLnNldEFzcGVjdCgiSSIpOwkKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJYl9yLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKKwkJCQlzd2l0Y2ggKGUudHlwZSkgeworCQkJCWNhc2UgU1dULlNlbGVjdGlvbjoKKwkJCQkJR0VWaWV3LnRoaXMuc2V0QXNwZWN0KCJSIik7CQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0pOworCQlHcmlkRGF0YSBidG5ncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlidG5ncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJYnRuZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJICAgIGJ0bkNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGJ0bmdyaWREYXRhKTsKKwkJcmV0dXJuIGJ0bkNvbnRhaW5lcjsKKwl9CisJLyoqCisJICogVXNlciBzZWxlY3RlZCBhbiBBc3BlY3QgcmFkaW8gYnV0dG9uCisJICogCisJICogQHBhcmFtIGFzcGVjdENvZGUKKwkgKi8KKwlwcml2YXRlIHZvaWQgc2V0QXNwZWN0KFN0cmluZyBhc3BlY3RDb2RlKSB7CisJCUdFTG9nLmRlYnVnKHRoaXMsYXNwZWN0Q29kZSk7CisJCUFzcGVjdCBhc3BlY3QgPSBBc3BlY3QuZ2V0QXNwZWN0KGFzcGVjdENvZGUpOworCQlJU2ltdWxhdGlvbiBzaW0gPSBjb250ZW50UHJvdmlkZXIuZ2V0Q3VycmVudFNpbXVsYXRpb24oKTsKKwkJLy8gT0sgaWYgc2ltIGlzIG51bGwKKwkJZ2VpLnNldEFzcGVjdFRvRGlzcGxheShzaW0sYXNwZWN0KTsKKwkJCisJfQorCQorCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBncmlkIGRhdGEgY3VzdG9taXplZCBmb3IgdGhlIHB1c2ggYnV0dG9ucy4KKwkgKiAKKwkgKiBAcmV0dXJuIGdyaWREYXRhIHRoZSBuZXcgZ3JpZCBkYXRhIG9iamVjdAorCSAqLworCXByb3RlY3RlZCBHcmlkRGF0YSBnZXRCdXR0b25HcmlkRGF0YSgpIHsKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKKwkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOworCQlyZXR1cm4gZ3JpZERhdGE7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvdmlld3MvR0VWaWV3QWN0aW9ucy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS92aWV3cy9HRVZpZXdBY3Rpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjNGQxMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvdmlld3MvR0VWaWV3QWN0aW9ucy5qYXZhCkBAIC0wLDAgKzEsNDY3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5Bc3BlY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5HRUludGVyZmFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkdFTG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKKworCisvKioKKyAqIEdFVmlld0FjdGlvbnM6IERlZmluZXMgYW5kIGhhbmRsZXMgdGhlIGFjdGlvbnMuCisgKiAgCisgKiA8cD4gCisgKiBJdCBzdXBwb3J0cyBhIHBvcHVwIGNvbnRleHQgd2luZG93IHRoYXQgYWxsb3dzIAorICogYSBzZXQgb2YgYWN0aW9ucyAKKyAqIGVpdGhlciBnbG9iYWwgYWN0aW9ucyBvciBhY3Rpb25zIG9uIGEgc3BlY2lmaWMgc2ltdWxhdGlvbgorICogICAKKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBHRVZpZXdBY3Rpb25zICB7CisJCisJLyoqCisJICogcmVmZXJlbmNlIHRvIHRoZSBjYWxsZXIgR0VWaWV3IGNsYXNzCisJICovCisJcHJpdmF0ZSBHRVZpZXcgZ2VWaWV3ID0gbnVsbDsKKwkKKwkvKioKKwkgKiByZWZlcmVuY2UgdG8gdGhlIGludGVyZmFjZSBjbGFzcworCSAqLworCXByaXZhdGUgR0VJbnRlcmZhY2UgZ2VpID0gbnVsbDsKKwkvKioKKwkgKiBBIExpc3RWaWV3ZXIgdGhhdCB3aWxsIGxpc3Qgc2ltdWxhdGlvbnMgdGhhdCB3ZSAKKwkgKiBjYW4gd2F0Y2guIAorCSAqLworCXByaXZhdGUgTGlzdFZpZXdlciB2aWV3ZXIgPSBudWxsOworCS8qKgorCSAqIHJlZmVyZW5jZSB0byBjb250ZW50cHJvdmlkZXIgZm9yIHRoZSBMaXN0Vmlld2VyCisJICovCisJcHJpdmF0ZSBHRVZpZXdDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbnVsbDsKKwkvKiogCisJICogYWN0aW9ucyB0aGF0IHdlIGNhbiB0YWtlIG9uIHNlbGVjdGVkCisJICogZWxlbWVudHMgaW4gdGhlIGxpc3QuCisJICovCisJCisJcHJpdmF0ZSBBY3Rpb24gYWN0aW9uU3RvcDsKKwlwcml2YXRlIEFjdGlvbiBhY3Rpb25TdGFydDsKKwlwcml2YXRlIEFjdGlvbiBhY3Rpb25NYXA7CisJcHJpdmF0ZSBBY3Rpb24gYWN0aW9uTWFwTm9kZTsKKwlwcml2YXRlIEFjdGlvbiBhY3Rpb25TdGF0dXM7CisJLyoqCisJICogYWN0aW9ucyB0aGF0IGFyZSBub3QgZm9yIGEgc2VsZWN0ZWQKKwkgKiBzaW11bGF0aW9uLgorCSAqLworCXByaXZhdGUgQWN0aW9uIGFjdGlvbkdFU3RhcnQ7CisJcHJpdmF0ZSBBY3Rpb24gYWN0aW9uR0VSZXN0YXJ0OworCXByaXZhdGUgQWN0aW9uIGFjdGlvbkdFUnVuOworCXByaXZhdGUgQWN0aW9uIGFjdGlvbkdFU3RvcDsKKwkKKwkKKwlwcml2YXRlIEFjdGlvbiBhY3Rpb25EZWJ1ZzsKKwkvKioKKwkgKiBhY3Rpb24gaW52b2tlZCBvbiBkb3VibGUgY2xpY2sKKwkgKi8KKwlwcml2YXRlIGZpbmFsIEFjdGlvbiBkb3VibGVDbGlja0FjdGlvbj0gbnVsbDsKKworCQkKKwkvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisJICogQ29uc3RydWN0b3IKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyoqCisJICogVGhlIEdFVmlldyBjb25zdHJ1Y3RvciBnZXRzIGNvbnRyb2wgd2hlbiB0aGUgdXNlciBvcGVucyAKKwkgKiB0aGUgIlZpZXciIGluIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlLgorCSAqIAorCSAqIEluIHRoZSBHRVZpZXcgY29uc3RydWN0b3Igd2Ugd2lsbCBjcmVhdGUgYW4KKwkgKiBpbnN0YW5jZSBvZiBHRUludGVyZmFjZSB3aGljaCBkb2VzIGFsbCB0aGUgd29yay4KKwkgKiBAcGFyYW0gZ2VWaWV3IHJlZmVyZW5jZSB0byBjYWxsZXIKKwkgKiBAcGFyYW0gZ2VpIHJlZmVyZW5jZSB0byBHRSBpbnRlcmZhY2UgCisJICogCisJICogCisJICovCisJcHVibGljIEdFVmlld0FjdGlvbnMoR0VWaWV3IGdlVmlldywgR0VJbnRlcmZhY2UgZ2VpKSB7CisJCXRoaXMuZ2VWaWV3ID0gZ2VWaWV3OworCQl0aGlzLmdlaSA9IGdlaTsJCQkKKwkJdGhpcy52aWV3ZXIgPSBnZVZpZXcuZ2V0Vmlld2VyKCk7CQkKKwkgICAgdGhpcy5jb250ZW50UHJvdmlkZXIgPSBnZVZpZXcuZ2V0Q29udGVudFByb3ZpZGVyKCk7CisJCisJCisJCS8vIG1ha2UgdGhlIHBvcHVwIG1lbnUgYWN0aW9ucworCQkvL21ha2VBY3Rpb25zKCk7CQorCQkvLyBhY3RpdmF0ZSB0aGUgY29udGV4dCBtZW51IAorCQlob29rQ29udGV4dE1lbnUoKTsKKwkJLy8gYWN0aXZhdGUgZG91YmxlY2xpY2sgYWN0aW9uCisJCS8vaG9va0RvdWJsZUNsaWNrQWN0aW9uKCk7CisJCQorCQkKKwl9CisKKwkgLyoqCisgICAgICogTWFrZSBhbGwgb2YgdGhlIHBvcHVwIGFjdGlvbnMuCisgICAgICogCisgICAgICogYWN0aW9uU3RvcCAtIHR1cm4gb2ZmIGxvZ2dpbmcgZm9yIGN1cnJlbnQgc2ltdWxhdGlvbgorICAgICAqIGFjdGlvblN0YXJ0IC0gdHVybiBvZmYgbG9nZ2luZyBmb3IgY3VycmVudCBzaW11bGF0aW9uCisgICAgICogYWN0aW9uTWFwIC0gU2VuZCB0aGUgS01MIHRvIGRpc3BsYXkgdGhlIG1hcCBmb3IgdGhlCisgICAgICogICAgICAgICAgIGN1cnJlbnQgc2ltdWxhdGlvbi4KKyAgICAgKiBhY3Rpb25TdGF0dXMgLSBkaXNwbGF5IHN0YXR1cworICAgICAqLworCXByaXZhdGUgdm9pZCBtYWtlQWN0aW9ucygpIHsKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIGFjdGlvblN0b3AgLSB0dXJuIE9GRiBsb2dnaW5nCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlhY3Rpb25TdG9wID0gbmV3IEFjdGlvbigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgewkJCQkKKwkJCQlnZWkuc2V0QWN0aXZlKGNvbnRlbnRQcm92aWRlci5nZXRDdXJyZW50U2ltdWxhdGlvbigpLGZhbHNlKTsKKwkJCQlnZVZpZXcuc2hvd01lc3NhZ2UoTWVzc2FnZXMuZ2V0U3RyaW5nKCJHRVZpZXcuNCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OworCQlhY3Rpb25TdG9wLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJHRVZpZXcuNSIpKTsgLy8kTk9OLU5MUy0xJAorCQlhY3Rpb25TdG9wLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiR0VWaWV3LjYiKSk7IC8vJE5PTi1OTFMtMSQKKwkJYWN0aW9uU3RvcC5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS4KKwkJCWdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0lORk9fVFNLKSk7CisvLwkJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLwlhY3Rpb25TdGFydCAtIHR1cm4gT04gbG9nZ2luZworLy8JCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJYWN0aW9uU3RhcnQgPSBuZXcgQWN0aW9uKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CQkJCQkJCQkKKwkJCQlTdHJpbmcgbG9nRm9sZGVyID0gZ2VWaWV3LnZlcmlmeUZvbGRlcihHRVByZWZlcmVuY2VQYWdlLmdldEZvbGRlcigpKTsKKwkJCQlpZiAobG9nRm9sZGVyICA9PSBudWxsKSAKKwkJCQkJcmV0dXJuOworCQkJCWVsc2UgCisJCQkJCUdFUHJlZmVyZW5jZVBhZ2Uuc2V0Rm9sZGVyKGxvZ0ZvbGRlcik7CisJCQkJCisJCQkJLy9zaG93TWVzc2FnZShTdHJpbmcuZm9ybWF0KCJHb29nbGVFYXJ0aCBsb2dnaW5nIE9OLiBUbzogJXMiLGZuKTsKKwkJCQlib29sZWFuIG9rID0gZ2VpLnNldEFjdGl2ZShjb250ZW50UHJvdmlkZXIuZ2V0Q3VycmVudFNpbXVsYXRpb24oKSx0cnVlKTsKKwkJCQlpZiAoIW9rKSB7CisJCQkJCWdlVmlldy5zaG93TWVzc2FnZShnZWkuZ2V0RXJyb3JNZXNzYWdlKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCWdlVmlldy5zaG93TWVzc2FnZShTdHJpbmcuZm9ybWF0KCJHb29nbGVFYXJ0aCBsb2dnaW5nIE9OLiBUbzogJXMiLGxvZ0ZvbGRlcikpOworCQkJCX0KKwkJCX0KKwkJfTsKKwkJYWN0aW9uU3RhcnQuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkdFVmlldy43IikpOyAvLyROT04tTkxTLTEkCisJCWFjdGlvblN0YXJ0LnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiR0VWaWV3LjgiKSk7IC8vJE5PTi1OTFMtMSQKKwkJYWN0aW9uU3RhcnQuc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuCisJCQlnZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19JTkZPX1RTSykpOworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCQkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLwkJYWN0aW9uR0VTdGFydCAtIGxhdW5jaCBhbiBlbXB0eSBjb250cm9sLmttbCB0byBzdGFydCBHRQorLy8JCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJYWN0aW9uR0VTdGFydCA9IG5ldyBBY3Rpb24oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlnZWkuc3RhcnRHRSgpOworCQkJCQorCQkJfQorCQl9OworCQlhY3Rpb25HRVN0YXJ0LnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJHRVZpZXcuOSIpKTsgLy8kTk9OLU5MUy0xJAorCQlhY3Rpb25HRVN0YXJ0LnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiR0VWaWV3LjEwIikpOyAvLyROT04tTkxTLTEkCisJCWFjdGlvbkdFU3RhcnQuc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuCisJCQlnZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19JTkZPX1RTSykpOworLy8JCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCQlhY3Rpb25HRVJlc3RhcnQgLSBwcm9jZXNzIGEgcmVzdGFydCBvZiB0aGUgR0UgYXBwCisvLwkJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlhY3Rpb25HRVJlc3RhcnQgPSBuZXcgQWN0aW9uKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJZ2VpLnJlc3RhcnRHRSgpOworCQkJCQorCQkJfQorCQl9OworCQlhY3Rpb25HRVJlc3RhcnQuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkdFVmlldy45YSIpKTsgLy8kTk9OLU5MUy0xJAorCQlhY3Rpb25HRVJlc3RhcnQuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJHRVZpZXcuMTBhIikpOyAvLyROT04tTkxTLTEkCisJCWFjdGlvbkdFUmVzdGFydC5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS4KKwkJCWdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0lORk9fVFNLKSk7CisKKy8vCQkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLwkJYWN0aW9uR0VSdW4gLSBsYXVuY2ggY29udHJvbC5rbWwgdG8gc3RhcnQgR0UgcmVhZGluZyBLTUwKKy8vCQkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWFjdGlvbkdFUnVuID0gbmV3IEFjdGlvbigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCVN0cmluZyBmb2xkZXIgPSBHRVByZWZlcmVuY2VQYWdlLmdldEZvbGRlcigpOworCQkJCWZvbGRlciA9IGdlVmlldy5kaXNwbGF5Rm9sZGVyRGlhbG9nKGZvbGRlcik7CisJCQkJaWYgKGZvbGRlciAhPSBudWxsKSB7CisJCQkJCWJvb2xlYW4gb2sgPSBnZWkucnVuR0UoZm9sZGVyKTsKKwkJCQkJaWYgKCFvaykgewkJCQkJCQorCQkJCQkJZ2VWaWV3LnNob3dNZXNzYWdlKGdlaS5nZXRFcnJvck1lc3NhZ2UoKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQl9CisJCX07CisJCWFjdGlvbkdFUnVuLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJHRVZpZXcuMTEiKSk7IC8vJE5PTi1OTFMtMSQKKwkJYWN0aW9uR0VSdW4uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJHRVZpZXcuMTIiKSk7IC8vJE5PTi1OTFMtMSQKKwkJYWN0aW9uR0VSdW4uc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuCisJCQlnZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19JTkZPX1RTSykpOworLy8JCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8JYWN0aW9uR0VTdG9wIC0gc3RvcCBhbnkgYWN0aXZlIEdvb2dsZUVhcnRoIG5ldHdvcmtsaW5rCisJCS8vICBJdCB3aWxsIG5vdCBhY3R1YWxseSBzdG9wIEdFIAorLy8JCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJYWN0aW9uR0VTdG9wID0gbmV3IEFjdGlvbigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWdlaS5zdG9wR0UoKTsKKwkJCQkKKwkJCX0KKwkJfTsKKwkJYWN0aW9uR0VTdG9wLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJHRVZpZXcuMTMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJYWN0aW9uR0VTdG9wLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiR0VWaWV3LjE0IikpOyAvLyROT04tTkxTLTEkCisJCWFjdGlvbkdFU3RvcC5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS4KKwkJCWdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0lORk9fVFNLKSk7CQkKKwkJCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIGFjdGlvbk1hcCAtIGRpc3BsYXkgY3VycmVudCBtYXAgaW4gR29vZ2xlRWFydGggCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWFjdGlvbk1hcCA9IG5ldyBBY3Rpb24oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKworCQkJCWJvb2xlYW4gb2sgPSBnZWkuZGlzcGxheU1hcChjb250ZW50UHJvdmlkZXIuZ2V0Q3VycmVudFNpbXVsYXRpb24oKSk7CisJCQkJaWYgKCFvaykgeworCQkJCQlnZVZpZXcuc2hvd01lc3NhZ2UoTWVzc2FnZXMuZ2V0U3RyaW5nKCJHRVZpZXcuMTUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9CisJCX07CisJCQorCQlhY3Rpb25NYXAuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkdFVmlldy4xNiIpKTsgLy8kTk9OLU5MUy0xJAorCQlhY3Rpb25NYXAuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJHRVZpZXcuMTciKSk7IC8vJE5PTi1OTFMtMSQKKwkJYWN0aW9uTWFwLnNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLgorCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfSU5GT19UU0spKTsKKworLy8JCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCQkgYWN0aW9uTWFwTm9kZSAtIGRpc3BsYXkgTm9kZSBpbiBjdXJyZW50IG1hcCBpbiBHb29nbGVFYXJ0aAorLy8JCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJYWN0aW9uTWFwTm9kZSA9IG5ldyBBY3Rpb24oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlTdHJpbmcgYXJlYSA9IG51bGw7CisJCQkJU3RyaW5nIGFkbWluRmlsZSA9IG51bGw7CisJCQkJU3RyaW5nIHNlYXJjaCA9IG51bGw7CisKKwkJCQlEaXNwbGF5QXJlYURpYWxvZyBpbnB1dCA9IG5ldyBEaXNwbGF5QXJlYURpYWxvZygKKwkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCkpOworICAgICAgICAgICAgICAgIAorCQkJCQorICAgICAgICAgICAgICAgIGJvb2xlYW4gZG9uZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHdoaWxlICghZG9uZSkgeworICAgICAgICAgICAgICAgIAlpbnQgcmMgPSBpbnB1dC5vcGVuKCk7CisgICAgICAgICAgICAgICAgCWlmIChyYyA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEIHx8CisgICAgICAgICAgICAgICAgCQkgIHJjID09IElEaWFsb2dDb25zdGFudHMuUFJPQ0VFRF9JRAkpIHsKKyAgICAgICAgICAgICAgICAJCWFkbWluRmlsZSA9IGlucHV0LmdldEFkbWluRmlsZSgpOworICAgICAgICAgICAgICAgIAkJc2VhcmNoID0gaW5wdXQuZ2V0U2VhcmNoKCkudHJpbSgpOworICAgICAgICAgICAgICAgIAkJYm9vbGVhbiBjbGVhciA9IGlucHV0LmlzQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICAJCUFzcGVjdCBhID0gZ2VpLmdldEFzcGVjdFRvRGlzcGxheShjb250ZW50UHJvdmlkZXIuZ2V0Q3VycmVudFNpbXVsYXRpb24oKSk7CisgICAgICAgIAkJCQlHRUxvZy5kZWJ1Zyh0aGlzLCJEaXNwbGF5OiAiK2FyZWErICIgYXNwZWN0OiAiK2EudG9TdHJpbmcoKSk7CisgICAgICAgIAkJCQlib29sZWFuIG9rID0gZ2VpLmRpc3BsYXlBcmVhKGFkbWluRmlsZSxzZWFyY2gsY2xlYXIpOworICAgICAgICAJCQkJaWYgKCFvaykgeworICAgICAgICAJCQkJCWdlVmlldy5zaG93TWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIkdFVmlldy4xNW4iKSsiXG4iKworICAgICAgICAJCQkJCQkJZ2VpLmdldEVycm9yTWVzc2FnZSgpKTsgCisgICAgICAgIAkJCQkJCisgICAgICAgIAkJCQl9IGVsc2UgaWYgKHJjID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsgICAgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICAgICAgICAgIAkJZG9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgCX0gZWxzZSBpZiAocmMgPT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpIHsKKyAgICAgICAgICAgICAgICAJCWRvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCQkJCQorCQkJfQorCQl9OworCQkJCisJCWFjdGlvbk1hcE5vZGUuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkdFVmlldy4xNm4iKSk7IC8vJE5PTi1OTFMtMSQKKwkJYWN0aW9uTWFwTm9kZS5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkdFVmlldy4xN24iKSk7IC8vJE5PTi1OTFMtMSQKKwkJYWN0aW9uTWFwTm9kZS5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS4KKwkJCWdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0lORk9fVFNLKSk7CisJCQorLy8JCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCQkgYWN0aW9uU3RhdHVzIC0gZGlzcGxheSBzdGF0dXMKKy8vCQkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWFjdGlvblN0YXR1cyA9IG5ldyBBY3Rpb24oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlib29sZWFuIHNhdmUgPSBHRUxvZy5ERUJVRzsKKwkJCQlHRUxvZy5ERUJVRyA9IHRydWU7CisJCQkJZ2VpLmRpc3BsYXlTdGF0dXMoKTsKKwkJCQlHRUxvZy5ERUJVRyA9IHNhdmU7CisJCQl9CisJCX07CisJCWFjdGlvblN0YXR1cy5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiR0VWaWV3LjE4IikpOyAvLyROT04tTkxTLTEkCisJCWFjdGlvblN0YXR1cy5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkdFVmlldy4xOSIpICk7IC8vJE5PTi1OTFMtMSQKKwkJYWN0aW9uU3RhdHVzLnNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLgorCQkJCWdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0lORk9fVFNLKSk7CisvLwkJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLwkJIGFjdGlvbkRlYnVnIC0gRmxpcCBERUJVRyBzdGF0dXMgCisvLwkJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlhY3Rpb25EZWJ1ZyA9IG5ldyBBY3Rpb24oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJICAgICAgaWYgKEdFTG9nLkRFQlVHKSB7CQkJCQorCQkJCSAgR0VMb2cuZGVidWcodGhpcywgIlR1cm5pbmcgREVCVUcgb2ZmIik7CisJCQkJICBHRUxvZy5ERUJVRyA9IGZhbHNlOyAvLyBmbGlwIHN0YXR1cworCQkgICAgICB9IGVsc2UgeworCQkgICAgCSAgR0VMb2cuREVCVUcgPSB0cnVlOyAvLyBmbGlwIHN0YXR1cyAgCisJCSAgICAJICBHRUxvZy5kZWJ1Zyh0aGlzLCAiVHVybmVkIERFQlVHIG9uIik7CisJCSAgICAgIH0KKwkJCX0KKwkJfTsKKwkJLy8gc2hvdyB3aGF0IGl0IHdpbGwgYmUgY2hhbmdlZCB0by4KKwkJaWYgKEdFTG9nLkRFQlVHKSB7CisJCSAgICBhY3Rpb25EZWJ1Zy5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiR0VWaWV3LjIwT2ZmIikpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlhY3Rpb25EZWJ1Zy5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiR0VWaWV3LjIwT24iKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlhY3Rpb25EZWJ1Zy5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkdFVmlldy4yMSIpICk7IC8vJE5PTi1OTFMtMSQKKwkJYWN0aW9uRGVidWcuc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuCisJCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfSU5GT19UU0spKTsKKyAgICAgICAgLy8gYWN0aW9uRGlzcGxheSogLSBzcGVjaWZ5IGlmIHdlIHNob3VsZCBkaXNwbGF5IFMgRSBJIFIKKyAgICAgICAgLy8gICAgICAgIChzdXNjZXB0aWJsZSAsIEV4cG9zZWQsIEluZmVjdGlvdXMsIFJlY292ZXJlZCAgCisKKwl9CisJCisJCisJCisJLyoqCisJICogVGhlIGZvbGxvd2luZyBzZXRzIHVwIGEgcG9wdXAgbWVudSB0aGF0IGNhbiAKKwkgKiBiZSB1c2VkIHRvIHR1cm4gb24gYW5kIG9mZiB0aGUgZ2VuZXJhdGlvbiBvZgorCSAqIEtNTCBmaWxlcyBhbmQgZGlzcGxheSB0aGUgc3RhdHVzICAKKwkgKiBJbiB0aGUgZnV0dXJlLCBvdGhlciBjb21tYW5kcyBjb3VsZCBiZSBpbXBsZW1lbnRlZC4KKwkgKiAKKwkgKgorCSAqLworCXByaXZhdGUgdm9pZCBob29rQ29udGV4dE1lbnUoKSB7CisJCU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoIkdvb2dsZUVhcnRoIik7IC8vJE5PTi1OTFMtMSQKKwkJbWVudU1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7CisJCW1lbnVNZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7CisJCQkJbWFrZUFjdGlvbnMoKTsKKwkJCQlmaWxsQ29udGV4dE1lbnUobWFuYWdlcik7CisJCQl9CisJCX0pOworCQkvL1NoZWxsIHNoZWxsID0gdmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpOworCQkKKwkJTWVudSBtZW51ID0gbWVudU1nci5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKKwkJbWVudU1nci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOworCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7CisJCWdlVmlldy5nZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShtZW51TWdyLCB2aWV3ZXIpOworCX0KKworCisgICAgLyoqCisgICAgICogc2V0dXAgdGhlIFBvcHVwIGFjdGlvbnMgCisgICAgICogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIHRpbWUgdGhlIHBvcHVwIGlzIHJlcXVlc3RlZAorICAgICAqIHNvIHRoZSByZXN1bHRpbmcgcG9wdXAgaXMgY3VzdG9taXplZCBiYXNlZCBvbiB0aGUgc3RhdHVzLiAKKyAgICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIExvZ2dpbmcgb3B0aW9uIGlzIE9OIHRoZW4gdGhlIAorICAgICAqIGFjdGlvbiBnZW5lcmF0ZWQgd2lsbCB0dXJuIGl0IE9GRi4gCisgICAgICogCisgICAgICogQHBhcmFtIG1hbmFnZXIKKyAgICAgKi8KKwlwcml2YXRlIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7CisJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKwkJSVNpbXVsYXRpb24gc2ltID0gY29udGVudFByb3ZpZGVyLmdldEN1cnJlbnRTaW11bGF0aW9uKCk7CisJCWlmICggc2ltICE9IG51bGwpIHsKKwkJCWlmIChnZWkuaXNBY3RpdmUoc2ltKSkgeworCQkJCWFjdGlvblN0b3Auc2V0RW5hYmxlZCh0cnVlKTsKKwkJICAgICAgICBtYW5hZ2VyLmFkZChhY3Rpb25TdG9wKTsgIC8vIHN0b3AKKwkJICAgICAgICBhY3Rpb25TdGFydC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJICAgICAgICBtYW5hZ2VyLmFkZChhY3Rpb25TdGFydCk7CisJCSAgICAgICAgCisJCSAgICAgICAKKwkJCX0gZWxzZSB7IAorCQkJCWFjdGlvblN0b3Auc2V0RW5hYmxlZChmYWxzZSk7CisJCSAgICAgICAgbWFuYWdlci5hZGQoYWN0aW9uU3RvcCk7ICAvLyBzdG9wCisJCSAgICAgICAgYWN0aW9uU3RhcnQuc2V0RW5hYmxlZCh0cnVlKTsKKwkJICAgICAgICBtYW5hZ2VyLmFkZChhY3Rpb25TdGFydCk7ICAvLyBzdGFydAorCQkJfQorCQkJbWFuYWdlci5hZGQoYWN0aW9uTWFwKTsgIC8vIG1hcAorCQkJCisJCX0KKwkJbWFuYWdlci5hZGQoYWN0aW9uTWFwTm9kZSk7ICAvLyBtYXAKKwkJbWFuYWdlci5hZGQoYWN0aW9uU3RhdHVzKTsgIC8vIHN0YXR1cworCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQltYW5hZ2VyLmFkZChhY3Rpb25EZWJ1Zyk7ICAvLyBEaXNwbGF5IERlYnVnCisJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CisJCW1hbmFnZXIuYWRkKGFjdGlvbkdFU3RhcnQpOyAgLy8gU3RhcnQgR0UKKwkJbWFuYWdlci5hZGQoYWN0aW9uR0VSZXN0YXJ0KTsgIC8vIFJlU3RhcnQgR0UKKwkJbWFuYWdlci5hZGQoYWN0aW9uR0VSdW4pOyAgLy8gRGlzcGxheSBLTUwgaW4gR0UKKwkJbWFuYWdlci5hZGQoYWN0aW9uR0VTdG9wKTsgIC8vIFN0b3AgR0UgZGlzcGxheQorLy8JCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CisvLwkJTWVudU1hbmFnZXIgZGlzcGxheU1lbnUgPSBuZXcgTWVudU1hbmFnZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJHRVZpZXcuMiIpLAorLy8JCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJHRVZpZXcuMyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisvLwkJTWFwPFN0cmluZyxBc3BlY3Q+IG1hcEFzcGVjdHMgPSBBc3BlY3QuZ2V0TWFwKCk7CisvLwkJZm9yIChNYXAuRW50cnk8U3RyaW5nLEFzcGVjdD4gZW50cnkgOiBtYXBBc3BlY3RzLmVudHJ5U2V0KCkgKSB7CisvLwkJCWRpc3BsYXlNZW51LmFkZChhY3Rpb25Bc3BlY3REaXNwbGF5KHNpbSxlbnRyeS5nZXRWYWx1ZSgpKSApOworLy8JCX0KKy8vCisvLworLy8JCW1hbmFnZXIuYWRkKGRpc3BsYXlNZW51KTsKKwkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOworCX0KKwkKKy8vCS8qKgorLy8JICogCisvLwkgKiBAcGFyYW0gYXNwZWN0CisvLwkgKiBAcmV0dXJuIEFjdGlvbiB0byBiZSBhZGRlZCB0byBwb3B1cCBtZW51CisvLwkgKi8KKy8vcHJpdmF0ZSBBY3Rpb24gYWN0aW9uQXNwZWN0RGlzcGxheShJU2ltdWxhdGlvbiBzaW0sZmluYWwgQXNwZWN0IGFzcGVjdCkgeworLy8JIAorLy8JICBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigpIHsKKy8vCQkJcHVibGljIHZvaWQgcnVuKCkgewkJCQkJCQkJCisvLwkJCQlnZWkuc2V0QXNwZWN0VG9EaXNwbGF5KGNvbnRlbnRQcm92aWRlci5nZXRDdXJyZW50U2ltdWxhdGlvbigpLGFzcGVjdCk7CQkJCQorLy8JCQl9CisvLwkJfTsKKy8vCQlTdHJpbmcgdGVtcGxhdGUgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIkdFVmlldy4yMiIpOy8vJE5PTi1OTFMtMSQKKy8vCQlhY3Rpb24uc2V0VGV4dChTdHJpbmcuZm9ybWF0KHRlbXBsYXRlLCBhc3BlY3QuZ2V0TmFtZSgpICkpOyAKKy8vCQlhY3Rpb24uc2V0Q2hlY2tlZChmYWxzZSk7CisvLwkJaWYgKHNpbSAhPSBudWxsKSB7CisvLwkJCWlmICggZ2VpLmdldEFzcGVjdFRvRGlzcGxheShzaW0pPT1hc3BlY3QpCisvLwkJCQlhY3Rpb24uc2V0Q2hlY2tlZCh0cnVlKTsKKy8vCQl9IGVsc2UgeworLy8JCQlpZiAoZ2VpLmdldERlZmF1bHRBc3BlY3QoKT09YXNwZWN0KSAJCQorLy8JCQkJYWN0aW9uLnNldENoZWNrZWQodHJ1ZSk7CisvLwkJfQorLy8JCQkKKy8vCSAgcmV0dXJuIGFjdGlvbjsKKy8vCX0JCisgICAKKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgdm9pZCBob29rRG91YmxlQ2xpY2tBY3Rpb24oKSB7CisJCXZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKKwkJCQlkb3VibGVDbGlja0FjdGlvbi5ydW4oKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCisKKworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS92aWV3cy9HRVZpZXdDb250ZW50UHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvdmlld3MvR0VWaWV3Q29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhMjhjMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvdmlld3MvR0VWaWV3Q29udGVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyNTYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS52aWV3czsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5pbXBsLlJlZ2lvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXJFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkdFSW50ZXJmYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuR0VMb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5HZW9ncmFwaGljU2VsZWN0aW9uRWxlbWVudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OworCisvKioqKioqKioqKioqIEdFVmlld0NvbnRlbnRQcm92aWRlciAqKioqKioqKioqKi8KKy8qCisgKiBUaGUgY29udGVudCBwcm92aWRlciBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IKKyAqIHByb3ZpZGluZyBvYmplY3RzIHRvIHRoZSB2aWV3LiBJdCBjYW4gd3JhcAorICogZXhpc3Rpbmcgb2JqZWN0cyBpbiBhZGFwdGVycyBvciBzaW1wbHkgcmV0dXJuCisgKiBvYmplY3RzIGFzLWlzLiBUaGVzZSBvYmplY3RzIG1heSBiZSBzZW5zaXRpdmUKKyAqIHRvIHRoZSBjdXJyZW50IGlucHV0IG9mIHRoZSB2aWV3LCBvciBpZ25vcmUKKyAqIGl0IGFuZCBhbHdheXMgc2hvdyB0aGUgc2FtZSBjb250ZW50IAorICogKGxpa2UgVGFzayBMaXN0LCBmb3IgZXhhbXBsZSkuCisgKi8KKyAKK3B1YmxpYyBjbGFzcyBHRVZpZXdDb250ZW50UHJvdmlkZXIgCisgICAgICBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCAKKyAgICAgIElTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyLCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLAorICAgICAgSVNlbGVjdGlvbkxpc3RlbmVyIHsKKwkKKwkvKioKKwkgKiBBIExpc3RWaWV3ZXIgdGhhdCB3aWxsIGxpc3Qgc2ltdWxhdGlvbnMgdGhhdCB3ZSAKKwkgKiBjYW4gd2F0Y2guIAorCSAqLworCXByaXZhdGUgTGlzdFZpZXdlciB2aWV3ZXI7CisJLyoqCisJICogVGhpcyBpcyB0aGUgc2VsZWN0ZWQgU2ltdWxhdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgCisJICogZm9yIGFjdGlvbnMgaW4gdGhlIGNvbnRleHQgbWVudS4KKwkgKi8KKwlwcml2YXRlIElTaW11bGF0aW9uIGN1cnJlbnRTaW11bGF0aW9uID0gbnVsbDsKKwlwcml2YXRlIFNpbXVsYXRpb25NYW5hZ2VyIHNpbXVsYXRpb25NYW5hZ2VyID0gbnVsbDsKKwkvKioKKwkgKiB0aGUgaW50ZXJmYWNlIHRvIHRoZSByZXN0IG9mIEdFIGludGVyZmFjZSBjb2RlCisJICovCisJcHJpdmF0ZSBHRUludGVyZmFjZSBnZWkgPSBudWxsOworCS8qKiAKKwkgKiAgY29uc3RydWN0b3IKKwkgKgorCSAqIEBwYXJhbSBnZWkgIFJlZmVyZW5jZSB0byB0aGUgR0UgSW50ZXJmYWNlIG9iamVjdC4KKwkgKi8KKwlwdWJsaWMgR0VWaWV3Q29udGVudFByb3ZpZGVyKEdFSW50ZXJmYWNlIGdlaSkgeworCQl0aGlzLmdlaSA9IGdlaTsKKwl9CisJCisJLyoqCisJICogVGhpcyBpcyBnaXZlbiBjb250cm9sIHdoZW4gdGhlIGlucHV0IHBhcmVudCBjaGFuZ2VzLgorCSAqIEluIG91ciBjYXNlLCBTaW11bGF0aW9uTWFuYWdlciBpcyB0aGUgcGFyZW50KE1vZGVsKSAKKwkgKiBhbmQgaXQgbmV2ZXIgY2hhbmdlcyBhZnRlciB0aGUgaW5pdGlhbCBzdGFydHVwLiAKKwkgKiBAcGFyYW0gdiAgVmlld2VyIHJlcG9ydGluZyBjaGFuZ2UKKwkgKiBAcGFyYW0gb2xkSW5wdXQgIG9sZCBTaW11bGF0aW9uTWFuYWdlciBvciBudWxsCisJICogQHBhcmFtIG5ld0lucHV0ICBuZXcgaW5wdXQgc291cmNlKG5ldyBTaW11bGF0aW9uTWFuYWdlcikKKwkgKi8KKwkKKwlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHYsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7CisJCUdFTG9nLmRlYnVnKHRoaXMsImlucHV0Q2hhbmdlZDogb2xkPSIrb2xkSW5wdXQrIiBuZXc9IituZXdJbnB1dCk7CisgICAgICAgIHRoaXMudmlld2VyID0gKExpc3RWaWV3ZXIpdjsKKwkJaWYgKG9sZElucHV0ICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJKChTaW11bGF0aW9uTWFuYWdlcilvbGRJbnB1dCkucmVtb3ZlTGlzdGVuZXIodGhpcyk7CisJCX0KKwkJc2ltdWxhdGlvbk1hbmFnZXIgPSAoU2ltdWxhdGlvbk1hbmFnZXIpIG5ld0lucHV0OworCisJCS8vIERvIHdlIGhhdmUgYSBuZXcgc2ltdWxhdGlvbiBtYW5hZ2VyIHRvIGxpc3RlbiB0bz8KKwkJaWYgKHNpbXVsYXRpb25NYW5hZ2VyICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJc2ltdWxhdGlvbk1hbmFnZXIuYWRkU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lcih0aGlzKTsKKwkJfQorCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCQkKKwkJLy8gIHJlZ2lzdGVyIG5ldyBpbnB1dCBtb2RlbAorCX0KKwkKKwkvKioKKwkgKiBDbGVhbnVwIHdoZW4gdXNlciB3YW50cyB0byB0ZXJtaW5hdGUgdGhlIHZpZXcKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlHRUxvZy5kZWJ1Zyh0aGlzLmdldENsYXNzKCksImRpc3Bvc2UoKTogIik7CisJCWlmIChzaW11bGF0aW9uTWFuYWdlciAhPSBudWxsKQorCQkgIHNpbXVsYXRpb25NYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKHRoaXMpOworCQlpZiAodmlld2VyICE9IG51bGwpCisJCSAgdmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKwl9CisJLyoqCisJICogUHJvdmlkZSB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGluIGEgbGlzdAorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQgIFNldCB0byByZWZlciB0byB0aGUgU2ltdWxhdGlvbk1hbmFnZXIgc2luZ2xldG9uCisJICovCisJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBwYXJlbnQpIHsKKwkJLy9HRUxvZy5kZWJ1Zyh0aGlzLCJwYXJlbnQ9IitwYXJlbnQpOworCQlTaW11bGF0aW9uTWFuYWdlciBzbSA9IChTaW11bGF0aW9uTWFuYWdlcilwYXJlbnQ7CisJCUxpc3Q8SVNpbXVsYXRpb24+IHNpbXVsYXRpb25zID0gc20uZ2V0QWN0aXZlU2ltdWxhdGlvbnMoKTsKKwkJaW50IG4gPSBzaW11bGF0aW9ucy5zaXplKCk7CisJCU9iamVjdFtdIHJldHVybkFycmF5ID0gbmV3IE9iamVjdFtuXTsKKwkJZm9yIChpbnQgaT0wO2k8bjtpKyspIHsKKwkJCUlTaW11bGF0aW9uIHNpbXVsYXRpb24gPSBzaW11bGF0aW9ucy5nZXQoaSk7CisJCQkvL1N0cmluZyBuYW1lID1zaW11bGF0aW9uLmdldE5hbWUoKTsKKwkJCS8vU2NlbmFyaW8gc2NlbmFyaW8gPSBzaW11bGF0aW9uLmdldFNjZW5hcmlvKCk7CisJCQkKKwkJCS8vR0VMb2cuZGVidWcodGhpcywiIitpKyIgIituYW1lKTsKKwkJCXJldHVybkFycmF5W2ldID0gc2ltdWxhdGlvbjsJCQkJCisJCX0KKwkJLy8gaWYgb25seSBvbmUgc2ltdWxhdGlvbiAtIGFzc3VtZSBzZWxlY3RlZAorCQlpZiAobj09MSAmJiBjdXJyZW50U2ltdWxhdGlvbiA9PSBudWxsKQorCQkJY3VycmVudFNpbXVsYXRpb24gPSBzaW11bGF0aW9ucy5nZXQoMCk7CisJCQorCQlyZXR1cm4gcmV0dXJuQXJyYXk7CisJfQorCQorCS8qKgorCSAqIFdlIGdldCBoZXJlIGJlY2F1c2Ugd2UgYXJlIGxpc3RlbmluZyBmb3IgU2ltdWxhdGlvbkNoYW5nZWQgCisJICogZXZlbnRzIGFuZCBvbmUgb2NjdXJlZC4gCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lciNzaW11bGF0aW9uc0NoYW5nZWQob3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXJFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzaW11bGF0aW9uc0NoYW5nZWQoU2ltdWxhdGlvbk1hbmFnZXJFdmVudCBldmVudCkgeworCQlHRUxvZy5kZWJ1Zyh0aGlzLmdldENsYXNzKCksInNpbXVsYXRpb25zQ2hhbmdlOiAiKTsKKworCisJCXZpZXdlci5yZW1vdmUoZXZlbnQuZ2V0U2ltdWxhdGlvbnNSZW1vdmVkKCkpOworCQl2aWV3ZXIuYWRkKGV2ZW50LmdldFNpbXVsYXRpb25zQWRkZWQoKSk7CisJCWlmICh0aGlzLmN1cnJlbnRTaW11bGF0aW9uID09IG51bGwgJiYgCisJCQkJZXZlbnQuZ2V0U2ltdWxhdGlvbnNBZGRlZCgpLmxlbmd0aCA+IDApICB7CisJCQljdXJyZW50U2ltdWxhdGlvbiA9IGV2ZW50LmdldFNpbXVsYXRpb25zQWRkZWQoKVswXTsKKwkJCUdFTG9nLmRlYnVnKHRoaXMsImN1cnJlbnRTaW11bGF0aW9uOiAiKworCQkJCQljdXJyZW50U2ltdWxhdGlvbi5nZXROYW1lKCkpOworCQl9IAorCQlpZiAodGhpcy5jdXJyZW50U2ltdWxhdGlvbiAhPSBudWxsICYmICAKKwkJCQlldmVudC5nZXRTaW11bGF0aW9uc1JlbW92ZWQoKS5sZW5ndGggPiAwKSAgeworCQkJZm9yKElTaW11bGF0aW9uIHNpbTpldmVudC5nZXRTaW11bGF0aW9uc1JlbW92ZWQoKSkgeworCQkJICAgIGlmIChjdXJyZW50U2ltdWxhdGlvbiA9PSBzaW0pIHsKKwkJCSAgICAJY3VycmVudFNpbXVsYXRpb24gPSBudWxsOworCQkJICAgICAgICBHRUxvZy5kZWJ1Zyh0aGlzLCJjdXJyZW50U2ltdWxhdGlvbiBpcyBub3cgbnVsbCAiKTsKKwkJCSAgICB9CisJICAgIAl9CQkJCisJCX0gCisJfQkgLy8gc2ltdWxhdGlvbnNDaGFuZ2VkCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIEFOWVRISU5HIGlzIHNlbGVjdGVkIGluIHRoZSBFY2xpcHNlCisJICogd29ya2JlbmNoLiBJdCdzIGpvYiBpcyB0byBmaWx0ZXIgb3V0IHNlbGVjdGlvbnMgb2YgSVNpbXVsYXRpb24KKwkgKiBpbnN0YW5jZXMgc2VlIGlmIGl0IGlzIG9uZSB3ZSBhcmUgd2FpdGluZyBmb3IKKwkgKiAKKyAgICAgKiByZXF1aXJlZCBtZXRob2QgZm9yIElTZWxlY3Rpb25MaXN0ZW5lciAgCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwKKwkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0KSB7CisJCWlmICghIChzZWxlY3QgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKSApIAorCQkJcmV0dXJuOwkKKwkJLy8gVmVyaWZ5IGlmIHdlIGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgc2VsZWN0aW9uIGV2ZW50CisJCU9iamVjdFtdIGVsZW1lbnRzID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdCkudG9BcnJheSgpOworCQlpZiAoIChlbGVtZW50cy5sZW5ndGggIT0gMikgfHwgCisJCSAgICghIChlbGVtZW50c1sxXSBpbnN0YW5jZW9mIEdlb2dyYXBoaWNTZWxlY3Rpb25FbGVtZW50cykpKSB7ICAKKwkJCQlyZXR1cm47CisJCX0KKwkJUmVnaW9uSW1wbCByZWdpb24gPSAoUmVnaW9uSW1wbCllbGVtZW50c1swXTsKKwkJR2VvZ3JhcGhpY1NlbGVjdGlvbkVsZW1lbnRzIGdzZSA9IAorCQkJKEdlb2dyYXBoaWNTZWxlY3Rpb25FbGVtZW50cyllbGVtZW50c1sxXTsJCQorCQkKKwkJLy8gaWYgd2UgZ2V0IGhlcmUgaXQgaXMgYSBtYXAgc2VsZWN0aW9uIGJ5IHNvbWVib2R5CisJCUdFTG9nLmRlYnVnKHRoaXMsIk1hcFZpZXcgU2VsZWN0aW9uOiAiK3JlZ2lvbik7CisJCWdlaS5kaXNwbGF5U2VsZWN0aW9uKHJlZ2lvbixnc2UpOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgQU5ZVEhJTkcgaXMgc2VsZWN0ZWQgaW4gdGhlIHZpZXdlci4KKwkgKiBJdCdzIGpvYiBpcyB0byBmaWx0ZXIgb3V0IHNlbGVjdGlvbnMgb2YgSVNpbXVsYXRpb24KKwkgKiBpbnN0YW5jZXMgYW5kIG1hcmsgdGhlIFNpbXVsYXRpb24gdGhhdCB3ZSB3YW50IHRvIGludGVyZmFjZSB0by4KKwkgKiAKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LAorCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCUdFTG9nLmRlYnVnKHRoaXMsInNlbGVjdGlvbkNoYW5nZTogIitldmVudCk7CisJCS8vIElzIHRoaXMgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgY29taW5nIGZyb20gb3VyIHZpZXc/CisJCWlmIChldmVudC5nZXRTb3VyY2UoKSA9PSB2aWV3ZXIpIHsKKwkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7CisJCQkvLyBUaGlzIHdpbGwgaG9sZCB0aGUgbmV3IHNpbXVsYXRpb25zIHRoYXQgaGF2ZSBiZWVuIHNlbGVjdGVkCisJCQlmaW5hbCBMaXN0PElTaW11bGF0aW9uPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxJU2ltdWxhdGlvbj4oKTsKKworCQkJLy8gSXMgaXQgYSBzdHJ1Y3R1cmVkIHNlbGVjdGlvbj8KKwkJCWlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQkJLy8gWWVzCisJCQkJZmluYWwgTGlzdCBsaXN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQorCQkJCQkJLnRvTGlzdCgpOworCisJCQkJLy8gR28gdGhyb3VnaCBldmVyeXRoaW5nIGluIHRoZSBsaXN0IG9mIHRoaW5ncyB0aGF0IHdlcmUKKwkJCQkvLyBzZWxlY3RlZCBhbmQgcGljayBvdXQgdGhlIG9uZXMgdGhhdCBhcmUgSVNpbXVsYXRpb25zLgorCQkJCWZvciAoZmluYWwgSXRlcmF0b3Igc2VsZWN0aW9uSXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgc2VsZWN0aW9uSXRlcgorCQkJCQkJLmhhc05leHQoKTspIHsKKwkJCQkJZmluYWwgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbkl0ZXIubmV4dCgpOworCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVNpbXVsYXRpb24pIHsKKwkJCQkJCXRlbXAuYWRkKChJU2ltdWxhdGlvbikgb2JqKTsKKwkJCQkJCS8vR0VWaWV3LmxvZyh0aGlzLmdldENsYXNzKCksb2JqLnRvU3RyaW5nKCkpOworCQkJCQl9CisJCQkJfSAvLyBmb3IgZWFjaCBzZWxlY3RlZCBpdGVtCisJCQl9IC8vIGlmIHN0cnVjdHVyZWQgc2VsZWN0aW9uCisKKwkJCS8vIERpZCB3ZSBmaW5kIGFueSBuZXcgc2ltdWxhdGlvbnMgdGhhdCB3ZXJlIHNlbGVjdGVkPworCQkJaWYgKHRlbXAuc2l6ZSgpID4gMCkgeworCQkJCS8vIFllcyBVc2UgdGhlIDFzdCBvbmUgCisJCQkJLy9JU2ltdWxhdGlvbiBvbGQgPSBjdXJyZW50U2ltdWxhdGlvbjsKKwkJCQljdXJyZW50U2ltdWxhdGlvbiA9IHRlbXAuZ2V0KDApOworCQkJCS8vR0VMb2cuZGVidWcodGhpcy5nZXRDbGFzcygpLCJTZWxlY3RlZD0iK2N1cnJlbnRTaW11bGF0aW9uLnRvU3RyaW5nKCkpOworCQkJCUdFVmlld0xhYmVsUHJvdmlkZXIgbHAgPShHRVZpZXdMYWJlbFByb3ZpZGVyKXZpZXdlci5nZXRMYWJlbFByb3ZpZGVyKCk7CisJCQkJCisJCQkJbHAuc2V0U2VsZWN0ZWQoY3VycmVudFNpbXVsYXRpb24pOworCQkJfSAvLyBpZiBhbnkgbmV3IHNpbXVsYXRpb25zIHNlbGVjdGVkCisJCX0gLy8gaWYgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgY29taW5nIGZyb20gb3VyIHZpZXc/CisJfSAvLyBzZWxlY3Rpb25DaGFuZ2VkCisKKwkvKioKKwkgKiBzdXBwbHkgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzaW11bGF0aW9uICAoaWYgYW55KQorCSAqIEdFVmlldyBkb2VzIG5vdCBzYXZlIHRoZSBjdXJyZW50IFNpbXVsYXRpb24gdGhhdCAKKwkgKiB3YXMgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuICBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCBpdC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50U2ltdWxhdGlvbgorCSAqLworCXB1YmxpYyBJU2ltdWxhdGlvbiBnZXRDdXJyZW50U2ltdWxhdGlvbigpIHsKKwkJcmV0dXJuIGN1cnJlbnRTaW11bGF0aW9uOworCX0KKworCQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3ZpZXdzL0dFVmlld0xhYmVsUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvdmlld3MvR0VWaWV3TGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwY2ExY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3ZpZXdzL0dFVmlld0xhYmVsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLnZpZXdzOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS5HRUludGVyZmFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdlLkdFTG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisKKworLyoqCisgKiBwcm92aWRlIHRleHQgYW5kIGltYWdlIGxhYmVscyBmb3IgdGhlIGxpc3QgCisgKiAKKyAqIFdlIGluc2VydCBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzaW11bGF0aW9uIGlkIAorICogYW5kIHdoZXRoZXIgaXQgaXMgc2xlY3RlZAorICogd2UgY291bGQgY2hhbmdlIHRoZSBnZXRJbWFnZSB0byByZXR1cm4gYSAKKyAqIGRpZmZlcmVudCBpbWFnZSBpZiBHb29nbGVFYXJ0aCBpcyBhY3RpdmUgb3IgaW5hY3RpdmUgCisgKiBmb3IgdGhlIHNwZWNpZmllZCBzaW11bGF0aW9uIAorICoKKyAqLworcHVibGljIGNsYXNzIEdFVmlld0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUJhc2VMYWJlbFByb3ZpZGVyIHsKKwkKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjbGFzcyB0aGF0IGhhbmRsZXMgdGhlIGludGVyZmFjZQorCSAqICBiZXR3ZWVuIG91ciB2aWV3IGFuZCBHb29nbGVFYXJ0aAorCSAqLworCQorCQorCXByaXZhdGUgR0VJbnRlcmZhY2UgZ2VpID0gbnVsbDsKKwkKKwkJCisJCisJLyoqCisgICAgICogR2V0IHRleHQgdG8gYmUgZGlzcGxheWVkCisgICAgICogCisgICAgICogQHBhcmFtIG9iaiBpbnN0YW5jZSBiZWluZyBkaXNwbGF5ZWQKKyAgICAgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgeworICAgICAgICAvL0dFTG9nLmRlYnVnKHRoaXMsImdldFRleHQ6IG9iaj0iK29iaik7CisgICAgICAgIFN0cmluZyBmbGFnID0gIiI7CisgICAgICAgIFN0cmluZyB0ZW1wbGF0ZSA9ICIlcyAlcyAlcyAlcyI7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKwkJCWlmIChvYmogIT0gbnVsbCkgeworCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU2ltdWxhdGlvbikgeworCQkJCQlJU2ltdWxhdGlvbiBzaW0gPSAoSVNpbXVsYXRpb24pb2JqOworCQkJCQkKKwkJCQkJU3RyaW5nICBjeWNsZSA9ICIiOworCQkJCQlTdHJpbmcgbmFtZSA9IEdFSW50ZXJmYWNlLmdldFNpbXVsYXRpb25JZChzaW0pOworCQkJCQlpZiAoZ2VpLmlzQWN0aXZlKHNpbSkpIHsKKwkJCQkJCWN5Y2xlID0gIlsiK0ludGVnZXIudG9TdHJpbmcoZ2VpLmdldEN5Y2xlKHNpbSkpKyJdIjsKKwkJCQkJCWZsYWcgPSAiKiI7CisJCQkJCX0KKwkJCQkJaWYgKGdlaS5pc0FjdGl2ZVZpZXcoc2ltKSkgeworCQkJCQkKKwkJCQkJCWZsYWcgPSAiKkdFIjsKKwkJCQkJfQorCQkJCQl0ZXh0ID0gU3RyaW5nLmZvcm1hdCh0ZW1wbGF0ZSwKKwkJCQkJCQlmbGFnLCBuYW1lLCBjeWNsZSwgc2ltLnRvU3RyaW5nKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCXRleHQgPSAiIitvYmo7ICAvLyBzbyBudWxsIHdpbGwgZGlzcGxheQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdGV4dCA9ICJudWxsIjsgIC8vIGZvciBkZWJ1ZworCQkJfQorCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsJCQkKKwkJCUdFTG9nLmVycm9yKCJGYWlsdXJlIixlKTsKKwkJfQorICAgICAgICAvL0dFTG9nLmRlYnVnKHRoaXMsInRleHQ9Iit0ZXh0KTsgCisgICAgICAgcmV0dXJuIHRleHQ7CisJfQorCS8qKgorICAgICAqIEdldCBJbWFnZSB0byBiZSBkaXNwbGF5ZWQKKyAgICAgKiBUaGlzIGFwcHBlYXJzIHRvIG5vdCBiZSBjYWxsZWQuICBQZXJoYXBzIGl0IGlzIG5vdCAKKyAgICAgKiBzdXBwb3J0ZWQgZm9yIExpc3RWaWV3ZXIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqIGluc3RhbmNlIGJlaW5nIGRpc3BsYXllZAorICAgICAqLworCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7CisgICAgICAgIEdFTG9nLmRlYnVnKHRoaXMuZ2V0Q2xhc3MoKSwiZ2V0SW1hZ2U6IG9iaj0iK29iai50b1N0cmluZygpKTsKKwkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuCisJCQkJZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKX0VMRU1FTlQpOworCX0KKwkvKioKKwkgKiBAcGFyYW0gZ2VpIHJlZmVyZW5jZSB0byBHRSBpbnRlcmZhY2UgY2xhc3MKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRHRUkoR0VJbnRlcmZhY2UgZ2VpKSB7CisJCXRoaXMuZ2VpID0gZ2VpOworCX0KKwkvKioKKwkgKiBTZXQgdGhlIHNlbGVjdGVkIHNpbXVsYXRpb24gCisJICogQ2FsbGVkIGJ5IEdFSW50ZXJmYWNlIHRvIHByb3ZpZGUgdGhpcyBuZWVkZWQgaW5mbworCSAqIAorCSAqIEBwYXJhbSBzZWxlY3Rpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChJU2ltdWxhdGlvbiBzZWxlY3Rpb24pIHsKKwkJR0VMb2cuZGVidWcodGhpcy5nZXRDbGFzcygpLCJzZXRTZWxlY3RlZCIpOworCQkJCQorCQlMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQodGhpcyk7CisJCXRoaXMuZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKGV2ZW50KTsKKwl9Cit9CisKKworCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvdmlld3MvTWVzc2FnZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvdmlld3MvTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmM4MzIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS92aWV3cy9NZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKy8qKgorICogQ2xhc3MgZ2VuZXJhdGVkIGJ5IHRoZSBleHRlcm5hbGl6ZVN0cmluZ3Mgb3B0aW9uLgorICogCisgKiAKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlcyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uudmlld3MubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQorCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7CisKKwlwcml2YXRlIE1lc3NhZ2VzKCkgeworCX0KKworCS8qKgorCSAqIEBwYXJhbSBrZXkKKwkgKiBAcmV0dXJuIFN0cmluZyBhc3NpZ25lZCB0byB0aGUgc3BlY2lmaWVkIGtleSBpbiBwcm9wZXJ0aWVzIGZpbGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdlL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dlL3ZpZXdzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS92aWV3cy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWM4Yzg1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS92aWV3cy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDc3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uudmlld3M7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UuR0VMb2c7CisKKworCisvKioKKyAqIENsYXNzIHVzZWQgdG8gaW5pdGlhbGl6ZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgorICogCisgKiBCZSBzdXJlIHRvIHVwZGF0ZSB3aGF0ZXZlciBkb2N1bWVudGF0aW9uIHRoZXJlIGlzIAorICogdG8gbWF0Y2ggd2hhdCB3ZSBzcGVjaWZ5IGJlbG93LgorICovCitwdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgeworCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKKwkJUHJlZmVyZW5jZXMgc3RvcmUgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpCisJCQkJLmdldFBsdWdpblByZWZlcmVuY2VzKCk7CisJCS8vIHNldCBkZWZhdWx0IHRvIE1hbnVhbCBtb2RlCisJCXN0b3JlLnNldERlZmF1bHQoR0VQcmVmZXJlbmNlUGFnZS5QX01FVEhPRCwKKwkJCQlHRVByZWZlcmVuY2VQYWdlLk1fTUFOVUFMX0RJU1BMQVkpOworCisJCVN0cmluZyBkZWZhdWx0Rm9sZGVyID0gZ2V0RGVmYXVsdEZvbGRlcigpOworCQlzdG9yZS5zZXREZWZhdWx0KEdFUHJlZmVyZW5jZVBhZ2UuUF9GT0xERVIsZGVmYXVsdEZvbGRlcik7CisJCXN0b3JlLnNldERlZmF1bHQoR0VQcmVmZXJlbmNlUGFnZS5QX0lOVEVSTkFMX1NFUlZFUix0cnVlKTsKKwkJc3RvcmUuc2V0RGVmYXVsdChHRVByZWZlcmVuY2VQYWdlLlBfU0VSVkVSX0hPU1QsImxvY2FsaG9zdDo4MDgwIik7CisJCXN0b3JlLnNldERlZmF1bHQoR0VQcmVmZXJlbmNlUGFnZS5QX0FTUEVDVCwgIiIpOworCQlzdG9yZS5zZXREZWZhdWx0KEdFUHJlZmVyZW5jZVBhZ2UuUF9XSElDSF9DWUNMRSwxKTsKKwkJc3RvcmUuc2V0RGVmYXVsdChHRVByZWZlcmVuY2VQYWdlLlBfQVVUT19MQVVOQ0gsdHJ1ZSk7CisJCXN0b3JlLnNldERlZmF1bHQoR0VQcmVmZXJlbmNlUGFnZS5QX0FVVE9fTE9HR0lORyx0cnVlKTsKKwkJc3RvcmUuc2V0RGVmYXVsdChHRVByZWZlcmVuY2VQYWdlLlBfQkJPWCxmYWxzZSk7CisJCXN0b3JlLnNldERlZmF1bHQoR0VQcmVmZXJlbmNlUGFnZS5QX0RFQlVHLCBmYWxzZSk7CisJCXN0b3JlLnNldERlZmF1bHQoR0VQcmVmZXJlbmNlUGFnZS5QX1NIT1dfQk9SREVSLCBmYWxzZSk7CisJCXN0b3JlLnNldERlZmF1bHQoR0VQcmVmZXJlbmNlUGFnZS5QX1RFU1QsIGZhbHNlKTsKKwl9CisKKwkvKioKKwkgKiBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgZm9sZGVyCisJICogCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdEZvbGRlcigpIHsKKwkJU3RyaW5nIGZvbGRlciA9ICIvdG1wL2dlIjsKKwkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZm9sZGVyKTsKKwkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisJCQlyZXR1cm4gZm9sZGVyOworCQl9CQkKKwkJdHJ5IHsKKwkJCUZpbGUgdG1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlc3QiLCAiLmttbCIpOworCQkJZm9sZGVyID0gdG1wRmlsZS5nZXRQYXJlbnQoKTsKKwkJCXRtcEZpbGUuZGVsZXRlKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCUdFTG9nLmVycm9yKCJVbmFibGUgdG8gZ2VuZXJhdGUgS01MIERpc3BsYXlBcmVhIGZpbGUuIiwgZSk7CisJCQlmb2xkZXIgPSBudWxsOworCQl9CisJCQorCQlyZXR1cm4gZm9sZGVyOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvdmlld3MvbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ2Uvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ2Uvdmlld3MvbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTNiZGEwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5nZS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9nZS92aWV3cy9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzMgQEAKK0dFVmlldy4yPVNlbGVjdCBBc3BlY3QgRGlzcGxheQorR0VWaWV3LjM9QXNwZWN0IERpc3BsYXkKK0dFVmlldy40PVNpbXVsYXRpb24gUHJvY2Vzc2luZyBPRkYKK0dFVmlldy41PVNldCBQcm9jZXNzaW5nIE9GRgorR0VWaWV3LjY9VGhpcyB3aWxsIHN0b3AgcHJvY2Vzc2luZyBvZiBTVEVNIGN5Y2xlIHJlc3VsdHMgc28gcmVzdWx0cyBhcmUgc2VudCB0byBHb29nbGVFYXJ0aAorR0VWaWV3Ljc9U2V0IFByb2Nlc3NpbmcgT04KK0dFVmlldy44PVRoaXMgd2lsbCBzdGFydCBwcm9jZXNzaW5nIG9mIFNURU0gY3ljbGUgcmVzdWx0cyBzbyByZXN1bHRzIGFyZSBzZW50IHRvIEdvb2dsZUVhcnRoCitHRVZpZXcuOT1Hb29nbGVFYXJ0aCBTdGFydAorR0VWaWV3LjEwPVN0YXJ0IEdvb2dsZUVhcnRoIGlmIG5vdCBhbHJlYWR5IHN0YXJ0ZWQKK0dFVmlldy45YT1Hb29nbGVFYXJ0aCBSZXN0YXJ0CitHRVZpZXcuMTBhPVJlc3RhcnQgR29vZ2xlRWFydGggd2l0aCBjdXJyZW50IHN0YXR1cworR0VWaWV3LjExPUdvb2dsZUVhcnRoIFJ1bgorR0VWaWV3LjEyPVJ1biBHb29nbGVFYXJ0aCB3aXRoIGV4aXN0aW5nIEtNTCBmaWxlcworR0VWaWV3LjEzPUdvb2dsZUVhcnRoIFN0b3AKK0dFVmlldy4xND1EZWFjdGl2YXRlIHRoZSBjdXJyZW50IEdvb2dsZUVhcnRoIGRpc3BsYXkgb2YgU1RFTSByZXN1bHRzCitHRVZpZXcuMTU9VW5hYmxlIHRvIERpc3BsYXkgTWFwCitHRVZpZXcuMTY9RGlzcGxheSBNYXAKK0dFVmlldy4xNz1UaGlzIHdpbGwgd3JpdGUgS01MIGZvciB0aGUgY3VycmVudCBzaW11bGF0aW9uIHNvIGl0IGNhbiBiZSBkaXNwbGF5ZWQgYnkgR29vZ2xlRWFydGgKK0dFVmlldy4xNW49VW5hYmxlIHRvIERpc3BsYXkgTWFwIGZvciBBZG1pbmlzdHJhdGlvbiBBcmVhCitHRVZpZXcuMTZuPURpc3BsYXkgQWRtaW4gQXJlYQorR0VWaWV3LjE3bj1UaGlzIHdpbGwgd3JpdGUgS01MIGZvciBhIHNwZWNpZmljIEFkbWluaXN0cmF0aW9uIGFyZWEgc28gaXQgY2FuIGJlIGRpc3BsYXllZCBieSBHb29nbGVFYXJ0aAorR0VWaWV3LjE4PURpc3BsYXkgU3RhdHVzCitHRVZpZXcuMTk9RGlzcGxheSBzdGF0dXMgb2YgdGhpcyBhcHBsaWNhdGlvbgorR0VWaWV3LjIwT2ZmPURlYnVnIG9mZgorR0VWaWV3LjIwT249RGVidWcgb24KK0dFVmlldy4yMT1EaXNwbGF5IGRlYnVnIGluZm8gb24gRWNsaXBzZSBjb25zb2xlCitHRVZpZXcuMjI9RGlzcGxheSAlcyBTdGF0dXMKK0dFVmlldy4yNz1HRVZpZXc6IEdvb2dsZUVhcnRoIFZpZXcKK0dFVmlldy4zMD1Hb29nbGVFYXJ0aCBjb250cm9sIEZvbGRlcgorR0VWaWV3LjMxPVNlbGVjdCBhIGZvbGRlciB0byBzdG9yZSBHb29nbGVFYXJ0aCBLTUwgY29udHJvbCBmaWxlcworR0VWaWV3LjMyPVJlbW92ZSBleGlzdGluZyBLTUwgZmlsZXMgaW4gJXMKK0dFVmlldy4zMz1UaGVyZSBhcmUgbm8gZXhpc3RpbmcgS01MIGZpbGVzIGluICVzLCBcbiBDb250aW51ZToKK0dFVmlldy4zND1TZWxlY3QgYSBmb2xkZXIgY29udGFpbmluZyBHb29nbGVFYXJ0aCBLTUwgY29udHJvbCBmaWxlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGU4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy8ucHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMzRjNWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9yczwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMjE3ODQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDIzIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnM7c2luZ2xldG9uOj10cnVlCitCdW5kbGUtVmVyc2lvbjogMS4wLjEKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzLnByZXNlbnRhdGlvbi5HcmFwaGdlbmVyYXRvckVkaXRvclBsdWdpbiRJbXBsZW1lbnRhdGlvbgorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5wcmVzZW50YXRpb24sCisgb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMucHJlc2VudGF0aW9uCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UudWkuaWRlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5zdGVtLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnM7dmlzaWJpbGl0eTo9cmVleHBvcnQKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWEzYjJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE0IEBACisKKyMgPGNvcHlyaWdodD4KKyMgPC9jb3B5cmlnaHQ+CisjCisjICRJZCQKKworYmluLmluY2x1ZGVzID0gLixcCisgICAgICAgICAgICAgICBpY29ucy8sXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKK2phcnMuY29tcGlsZS5vcmRlciA9IC4KK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0dyYXBoLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvR3JhcGguZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MGIzNTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0dyYXBoLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9pY29ucy9mdWxsL29iajE2L0dyYXBoZ2VuZXJhdG9yc01vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9pY29ucy9mdWxsL29iajE2L0dyYXBoZ2VuZXJhdG9yc01vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1ZDQwMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhnZW5lcmF0b3JzTW9kZWxGaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9pY29ucy9mdWxsL3dpemJhbi9OZXdHcmFwaGdlbmVyYXRvcnMuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMvaWNvbnMvZnVsbC93aXpiYW4vTmV3R3JhcGhnZW5lcmF0b3JzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWM2NDU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMvaWNvbnMvZnVsbC93aXpiYW4vTmV3R3JhcGhnZW5lcmF0b3JzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllN2QxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDU5IEBACisKKyMgPGNvcHlyaWdodD4KKyMgPC9jb3B5cmlnaHQ+CisjCisjICRJZCQKKworcGx1Z2luTmFtZSA9IEdyYXBoZ2VuZXJhdG9yIEVkaXRvcgorcHJvdmlkZXJOYW1lID0gd3d3LmV4YW1wbGUub3JnCisKK19VSV9HcmFwaGdlbmVyYXRvcnNFZGl0b3JfbWVudSA9ICZHcmFwaGdlbmVyYXRvcnMgRWRpdG9yCisKK19VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0gPSAmTmV3IENoaWxkCitfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0gPSBOJmV3IFNpYmxpbmcKKworX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW0gPSBTaG93ICZQcm9wZXJ0aWVzIFZpZXcKK19VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbSA9ICZSZWZyZXNoCisKK19VSV9TZWxlY3Rpb25QYWdlX2xhYmVsID0gU2VsZWN0aW9uCitfVUlfUGFyZW50UGFnZV9sYWJlbCA9IFBhcmVudAorX1VJX0xpc3RQYWdlX2xhYmVsID0gTGlzdAorX1VJX1RyZWVQYWdlX2xhYmVsID0gVHJlZQorX1VJX1RhYmxlUGFnZV9sYWJlbCA9IFRhYmxlCitfVUlfVHJlZVdpdGhDb2x1bW5zUGFnZV9sYWJlbCA9IFRyZWUgd2l0aCBDb2x1bW5zCitfVUlfT2JqZWN0Q29sdW1uX2xhYmVsID0gT2JqZWN0CitfVUlfU2VsZkNvbHVtbl9sYWJlbCA9IFNlbGYKKworX1VJX05vT2JqZWN0U2VsZWN0ZWQgPSBTZWxlY3RlZCBOb3RoaW5nCitfVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQgPSBTZWxlY3RlZCBPYmplY3Q6IHswfQorX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQgPSBTZWxlY3RlZCB7MH0gT2JqZWN0cworCitfVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsID0gT3BlbiBFZGl0b3IKKworX1VJX1dpemFyZF9jYXRlZ29yeSA9IEV4YW1wbGUgRU1GIE1vZGVsIENyZWF0aW9uIFdpemFyZHMKKworX1VJX0NyZWF0ZU1vZGVsRXJyb3JfbWVzc2FnZSA9IFByb2JsZW1zIGVuY291bnRlcmVkIGluIGZpbGUgInswfSIKKworX1VJX0dyYXBoZ2VuZXJhdG9yc01vZGVsV2l6YXJkX2xhYmVsID0gR3JhcGhnZW5lcmF0b3JzIE1vZGVsCitfVUlfR3JhcGhnZW5lcmF0b3JzTW9kZWxXaXphcmRfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgR3JhcGhnZW5lcmF0b3JzIG1vZGVsCisKK19VSV9HcmFwaGdlbmVyYXRvcnNFZGl0b3JfbGFiZWwgPSBHcmFwaGdlbmVyYXRvcnMgTW9kZWwgRWRpdG9yCisKK19VSV9HcmFwaGdlbmVyYXRvcnNFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlID0gTXkKK19VSV9HcmFwaGdlbmVyYXRvcnNFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbnMgPSBncmFwaGdlbmVyYXRvcnMKKworX1VJX1dpemFyZF9sYWJlbCA9IE5ldworCitfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbiA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gJycuezB9JycKK19XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9ucyA9IFRoZSBmaWxlIG5hbWUgbXVzdCBoYXZlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGV4dGVuc2lvbnM6IHswfQorCitfVUlfTW9kZWxPYmplY3QgPSAmTW9kZWwgT2JqZWN0CitfVUlfWE1MRW5jb2RpbmcgPSAmWE1MIEVuY29kaW5nCitfVUlfWE1MRW5jb2RpbmdDaG9pY2VzID0gVVRGLTggQVNDSUkgVVRGLTE2IFVURi0xNkJFIFVURi0xNkxFIElTTy04ODU5LTEKK19VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb24gPSBTZWxlY3QgYSBtb2RlbCBvYmplY3QgdG8gY3JlYXRlCisKK19VSV9GaWxlQ29uZmxpY3RfbGFiZWwgPSBGaWxlIENvbmZsaWN0CitfV0FSTl9GaWxlQ29uZmxpY3QgPSBUaGVyZSBhcmUgdW5zYXZlZCBjaGFuZ2VzIHRoYXQgY29uZmxpY3Qgd2l0aCBjaGFuZ2VzIG1hZGUgb3V0c2lkZSB0aGUgZWRpdG9yLiAgRG8geW91IHdpc2ggdG8gZGlzY2FyZCB0aGlzIGVkaXRvcidzIGNoYW5nZXM/CisKK19VSV9HcmFwaE1vZGVsV2l6YXJkX2xhYmVsID0gR3JhcGgKK19VSV9HcmFwaE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uID0gRGVmaW5lIGEgbmV3IGdyYXBoCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDFkYThmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMvcGx1Z2luLnhtbApAQCAtMCwwICsxLDg3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgorCis8IS0tCisgPGNvcHlyaWdodD4KKyA8L2NvcHlyaWdodD4KKworICRJZCQKKy0tPgorCis8cGx1Z2luPgorCisKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgorICAgICAgPGNhdGVnb3J5IAorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5zdGVtY2F0ZWdvcnkiCisgICAgICAgICAgICBuYW1lPSIlX1VJX1NURU0iCisgICAgICAgICAgICBwYXJlbnRDYXRlZ29yeT0iLyIvPgorICAgICAgPHdpemFyZAorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLnByZXNlbnRhdGlvbi5HcmFwaGdlbmVyYXRvcnNNb2RlbFdpemFyZElEIgorICAgICAgICAgICAgbmFtZT0iJV9VSV9HcmFwaGdlbmVyYXRvcnNNb2RlbFdpemFyZF9sYWJlbCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5wcmVzZW50YXRpb24uR3JhcGhnZW5lcmF0b3JzTW9kZWxXaXphcmQiCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLldpemFyZC5jYXRlZ29yeS5JRCIKKyAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvR3JhcGhnZW5lcmF0b3JzTW9kZWxGaWxlLmdpZiI+CisgICAgICAgICA8ZGVzY3JpcHRpb24+JV9VSV9HcmFwaGdlbmVyYXRvcnNNb2RlbFdpemFyZF9kZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+CisgICAgICAgICA8c2VsZWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4KKyAgICAgIDwvd2l6YXJkPgorICAgPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgorICAgICAgPGVkaXRvcgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLnByZXNlbnRhdGlvbi5HcmFwaGdlbmVyYXRvcnNFZGl0b3JJRCIKKyAgICAgICAgICAgIG5hbWU9IiVfVUlfR3JhcGhnZW5lcmF0b3JzRWRpdG9yX2xhYmVsIgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9HcmFwaGdlbmVyYXRvcnNNb2RlbEZpbGUuZ2lmIgorICAgICAgICAgICAgZXh0ZW5zaW9ucz0iZ3JhcGhnZW5lcmF0b3JzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLnByZXNlbnRhdGlvbi5HcmFwaGdlbmVyYXRvcnNFZGl0b3IiCisgICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5wcmVzZW50YXRpb24uR3JhcGhnZW5lcmF0b3JzQWN0aW9uQmFyQ29udHJpYnV0b3IiPgorICAgICAgPC9lZGl0b3I+CisgICA8L2V4dGVuc2lvbj4KKworICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisgICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgbG9jYXRpb25VUkk9Im1lbnU6b3JnLmVjbGlwc2UudWkubWFpbi5tZW51P2FmdGVyPWVkaXQiPgorICAgICAgICAgPG1lbnUKKyAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLm1lbnUubmV3d2l6YXJkcyIKKyAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1NURU1fTmV3QWN0aW9uU2V0X01lbnUiPgorICAgICAgICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5jb21tYW5kLndpei5ncmFwaCIKKyAgICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvR3JhcGguZ2lmIgorICAgICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfR3JhcGhNb2RlbFdpemFyZF9sYWJlbCIKKyAgICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgorICAgICAgICAgICAgICAgICAgdG9vbHRpcD0iJV9VSV9HcmFwaE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPC9tZW51PgorICAgICA8L21lbnVDb250cmlidXRpb24+CisgICAgICAgICAgIDxtZW51Q29udHJpYnV0aW9uCisgICAgICAgICAgICBsb2NhdGlvblVSST0idG9vbGJhcjpvcmcuZWNsaXBzZS51aS5tYWluLnRvb2xiYXI/YWZ0ZXI9YWRkaXRpb25zIj4KKyAgICAgICAgIDx0b29sYmFyCisgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS50b29sYmFyLm5ld3dpemFyZHMiPgorICAgICAgICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5jb21tYW5kLndpei5ncmFwaCIKKyAgICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvR3JhcGguZ2lmIgorICAgICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfR3JhcGhNb2RlbFdpemFyZF9sYWJlbCIKKyAgICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgorICAgICAgICAgICAgICAgICAgdG9vbHRpcD0iJV9VSV9HcmFwaE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPC90b29sYmFyPgorICAgICA8L21lbnVDb250cmlidXRpb24+CisgIDwvZXh0ZW5zaW9uPgorICAKKyAgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KKyAgICAgPGNhdGVnb3J5CisgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlX1VJX1NURU1fV2l6Q21kX0NhdF9EZXNjIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzIgorICAgICAgICAgICBuYW1lPSIlX1VJX1NURU1fV2l6Q21kX0NhdF9OYW1lIj4KKyAgICAgPC9jYXRlZ29yeT4KKyAgICAgIDxjb21tYW5kCisgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcyIKKyAgICAgICAgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzLndpemFyZHMuTmV3R3JhcGhXaXphcmQkTmV3R3JhcGhXaXphcmRDb21tYW5kSGFuZGxlciIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IiVfVUlfR3JhcGhNb2RlbFdpemFyZF9kZXNjcmlwdGlvbiIKKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29tbWFuZC53aXouZ3JhcGgiCisgICAgICAgICAgIG5hbWU9IiVfVUlfR3JhcGhNb2RlbFdpemFyZF9sYWJlbCI+CisgICAgIDwvY29tbWFuZD4KKyAgIDwvZXh0ZW5zaW9uPgorPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvcHJlc2VudGF0aW9uL0dyYXBoZ2VuZXJhdG9yc0FjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9ncmFwaGdlbmVyYXRvcnMvcHJlc2VudGF0aW9uL0dyYXBoZ2VuZXJhdG9yc0FjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhMzU1NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9wcmVzZW50YXRpb24vR3JhcGhnZW5lcmF0b3JzQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpAQCAtMCwwICsxLDQyOSBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLnByZXNlbnRhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db250cm9sQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Mb2FkUmVzb3VyY2VBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlZhbGlkYXRlQWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uSXRlbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzLnByZXNlbnRhdGlvbi5HcmFwaGdlbmVyYXRvckVkaXRvclBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGFjdGlvbiBiYXIgY29udHJpYnV0b3IgZm9yIHRoZSBHcmFwaGdlbmVyYXRvcnMgbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR3JhcGhnZW5lcmF0b3JzQWN0aW9uQmFyQ29udHJpYnV0b3IKKwlleHRlbmRzIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcgorCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yUGFydDsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGFjdGlvbiBvcGVucyB0aGUgUHJvcGVydGllcyB2aWV3LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQWN0aW9uIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbiA9CisJCW5ldyBBY3Rpb24oR3JhcGhnZW5lcmF0b3JFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbSIpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQl0cnkgeworCQkJCQlnZXRQYWdlKCkuc2hvd1ZpZXcoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiKTsKKwkJCQl9CisJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlHcmFwaGdlbmVyYXRvckVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIGFjdGlvbiByZWZyZXNoZXMgdGhlIHZpZXdlciBvZiB0aGUgY3VycmVudCBlZGl0b3IgaWYgdGhlIGVkaXRvcgorCSAqIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElBY3Rpb24gcmVmcmVzaFZpZXdlckFjdGlvbiA9CisJCW5ldyBBY3Rpb24oR3JhcGhnZW5lcmF0b3JFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0iKSkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisJCQkJcmV0dXJuIGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWlmIChhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7CisJCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRWaWV3ZXIoKTsKKwkJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7CisJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyB3aWxsIGNvbnRhaW4gb25lIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlQ2hpbGRBY3Rpb25zOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVDaGlsZCBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlU2libGluZ0FjdGlvbnM7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZVNpYmxpbmcgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgY29udHJpYnV0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEdyYXBoZ2VuZXJhdG9yc0FjdGlvbkJhckNvbnRyaWJ1dG9yKCkgeworCQlzdXBlcihBRERJVElPTlNfTEFTVF9TVFlMRSk7CisJCWxvYWRSZXNvdXJjZUFjdGlvbiA9IG5ldyBMb2FkUmVzb3VyY2VBY3Rpb24oKTsKKwkJdmFsaWRhdGVBY3Rpb24gPSBuZXcgVmFsaWRhdGVBY3Rpb24oKTsKKwkJY29udHJvbEFjdGlvbiA9IG5ldyBDb250cm9sQWN0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIFNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMgdG8gdGhlIHRvb2wgYmFyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7CisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJncmFwaGdlbmVyYXRvcnMtc2V0dGluZ3MiKSk7CisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJncmFwaGdlbmVyYXRvcnMtYWRkaXRpb25zIikpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB0byB0aGUgbWVudSBiYXIgYSBtZW51IGFuZCBzb21lIHNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMsCisJICogYXMgd2VsbCBhcyB0aGUgc3ViLW1lbnVzIGZvciBvYmplY3QgY3JlYXRpb24gaXRlbXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51TWFuYWdlcik7CisKKwkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKEdyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0dyYXBoZ2VuZXJhdG9yc0VkaXRvcl9tZW51IiksICJvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9yc01lbnVJRCIpOworCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOworCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigic2V0dGluZ3MiKSk7CisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhY3Rpb25zIikpOworCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOworCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsKKworCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVDaGlsZCBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCisJCS8vCisJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoR3JhcGhnZW5lcmF0b3JFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOworCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIpOworCisJCS8vIFByZXBhcmUgZm9yIENyZWF0ZVNpYmxpbmcgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgorCQkvLworCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoR3JhcGhnZW5lcmF0b3JFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7CisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsKKworCQkvLyBGb3JjZSBhbiB1cGRhdGUgYmVjYXVzZSBFY2xpcHNlIGhpZGVzIGVtcHR5IG1lbnVzIG5vdy4KKwkJLy8KKwkJc3VibWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyCisJCQkobmV3IElNZW51TGlzdGVuZXIoKSB7CisJCQkJIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJCQkJIG1lbnVNYW5hZ2VyLnVwZGF0ZUFsbCh0cnVlKTsKKwkJCQkgfQorCQkJIH0pOworCisJCWFkZEdsb2JhbEFjdGlvbnMoc3VibWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIFdoZW4gdGhlIGFjdGl2ZSBlZGl0b3IgY2hhbmdlcywgdGhpcyByZW1lbWJlcnMgdGhlIGNoYW5nZSBhbmQgcmVnaXN0ZXJzIHdpdGggaXQgYXMgYSBzZWxlY3Rpb24gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHBhcnQpIHsKKwkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOworCQlhY3RpdmVFZGl0b3JQYXJ0ID0gcGFydDsKKworCQkvLyBTd2l0Y2ggdG8gdGhlIG5ldyBzZWxlY3Rpb24gcHJvdmlkZXIuCisJCS8vCisJCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCX0KKwkJaWYgKHBhcnQgPT0gbnVsbCkgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOworCQl9CisJCWVsc2UgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBwYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOworCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCQkvLyBGYWtlIGEgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgdG8gdXBkYXRlIHRoZSBtZW51cy4KKwkJCS8vCisJCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkgeworCQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfSwKKwkgKiBoYW5kbGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnR9cyBieSBxdWVyeWluZyBmb3IgdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncworCSAqIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZWxlY3RlZCBvYmplY3QgYW5kIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uCisJCS8vCisJCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7CisJCX0KKwkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsKKwkJfQorCisJCS8vIFF1ZXJ5IHRoZSBuZXcgc2VsZWN0aW9uIGZvciBhcHByb3ByaWF0ZSBuZXcgY2hpbGQvc2libGluZyBkZXNjcmlwdG9ycworCQkvLworCQlDb2xsZWN0aW9uPD8+IG5ld0NoaWxkRGVzY3JpcHRvcnMgPSBudWxsOworCQlDb2xsZWN0aW9uPD8+IG5ld1NpYmxpbmdEZXNjcmlwdG9ycyA9IG51bGw7CisKKwkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5zaXplKCkgPT0gMSkgeworCQkJT2JqZWN0IG9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKKworCQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpYWN0aXZlRWRpdG9yUGFydCkuZ2V0RWRpdGluZ0RvbWFpbigpOworCisJCQluZXdDaGlsZERlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMob2JqZWN0LCBudWxsKTsKKwkJCW5ld1NpYmxpbmdEZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG51bGwsIG9iamVjdCk7CisJCX0KKworCQkvLyBHZW5lcmF0ZSBhY3Rpb25zIGZvciBzZWxlY3Rpb247IHBvcHVsYXRlIGFuZCByZWRyYXcgdGhlIG1lbnVzLgorCQkvLworCQljcmVhdGVDaGlsZEFjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhuZXdDaGlsZERlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOworCQljcmVhdGVTaWJsaW5nQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMobmV3U2libGluZ0Rlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOworCisJCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOworCQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7CisJCX0KKwkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7CisJCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LAorCSAqIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMoQ29sbGVjdGlvbjw/PiBkZXNjcmlwdG9ycywgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJQ29sbGVjdGlvbjxJQWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOworCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgeworCQkJZm9yIChPYmplY3QgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7CisJCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZUNoaWxkQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwgZGVzY3JpcHRvcikpOworCQkJfQorCQl9CisJCXJldHVybiBhY3Rpb25zOworCX0KKworCS8qKgorCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LAorCSAqIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7CisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7CisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlU2libGluZ0FjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYWN0aW9uczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IHdpdGgge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMKKwkgKiBiYXNlZCBvbiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLAorCSAqIGJ5IGluc2VydGluZyB0aGVtIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGNvbnRyaWJ1dGlvbiBpdGVtIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPi4KKwkgKiBJZiA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZXkgYXJlIHNpbXBseSBhZGRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucywgU3RyaW5nIGNvbnRyaWJ1dGlvbklEKSB7CisJCWlmIChhY3Rpb25zICE9IG51bGwpIHsKKwkJCWZvciAoSUFjdGlvbiBhY3Rpb24gOiBhY3Rpb25zKSB7CisJCQkJaWYgKGNvbnRyaWJ1dGlvbklEICE9IG51bGwpIHsKKwkJCQkJbWFuYWdlci5pbnNlcnRCZWZvcmUoY29udHJpYnV0aW9uSUQsIGFjdGlvbik7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQltYW5hZ2VyLmFkZChhY3Rpb24pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkJCisJLyoqCisJICogVGhpcyByZW1vdmVzIGZyb20gdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMKKwkgKiBiYXNlZCBvbiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGRlcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248PyBleHRlbmRzIElBY3Rpb24+IGFjdGlvbnMpIHsKKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgeworCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0SXRlbXMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKKwkJCQkvLyBMb29rIGludG8gU3ViQ29udHJpYnV0aW9uSXRlbXMKKwkJCQkvLworCQkJCUlDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbkl0ZW0gPSBpdGVtc1tpXTsKKwkJCQl3aGlsZSAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIHsKKwkJCQkJY29udHJpYnV0aW9uSXRlbSA9ICgoU3ViQ29udHJpYnV0aW9uSXRlbSljb250cmlidXRpb25JdGVtKS5nZXRJbm5lckl0ZW0oKTsKKwkJCQl9CisKKwkJCQkvLyBEZWxldGUgdGhlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1zIHdpdGggbWF0Y2hpbmcgYWN0aW9uLgorCQkJCS8vCisJCQkJaWYgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7CisJCQkJCUlBY3Rpb24gYWN0aW9uID0gKChBY3Rpb25Db250cmlidXRpb25JdGVtKWNvbnRyaWJ1dGlvbkl0ZW0pLmdldEFjdGlvbigpOworCQkJCQlpZiAoYWN0aW9ucy5jb250YWlucyhhY3Rpb24pKSB7CisJCQkJCQltYW5hZ2VyLnJlbW92ZShjb250cmlidXRpb25JdGVtKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBwb3AtdXAgbWVudSBiZWZvcmUgaXQgYXBwZWFycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7CisJCU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbnVsbDsKKworCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihHcmFwaGdlbmVyYXRvckVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7CisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOworCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKEdyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOworCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW5zZXJ0cyBnbG9iYWwgYWN0aW9ucyBiZWZvcmUgdGhlICJhZGRpdGlvbnMtZW5kIiBzZXBhcmF0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucy1lbmQiLCBuZXcgU2VwYXJhdG9yKCJ1aS1hY3Rpb25zIikpOworCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbik7CisKKwkJcmVmcmVzaFZpZXdlckFjdGlvbi5zZXRFbmFibGVkKHJlZnJlc2hWaWV3ZXJBY3Rpb24uaXNFbmFibGVkKCkpOwkJCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgcmVmcmVzaFZpZXdlckFjdGlvbik7CisKKwkJc3VwZXIuYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogVGhpcyBlbnN1cmVzIHRoYXQgYSBkZWxldGUgYWN0aW9uIHdpbGwgY2xlYW4gdXAgYWxsIHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBvYmplY3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUFsbFJlZmVyZW5jZXNPbkRlbGV0ZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL3ByZXNlbnRhdGlvbi9HcmFwaGdlbmVyYXRvcnNFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9wcmVzZW50YXRpb24vR3JhcGhnZW5lcmF0b3JzRWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI1NTMwNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9wcmVzZW50YXRpb24vR3JhcGhnZW5lcmF0b3JzRWRpdG9yLmphdmEKQEAgLTAsMCArMSwxODQyIEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMucHJlc2VudGF0aW9uOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuTWFya2VySGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVmlld2VyUGFuZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuZWRpdG9yLlByb2JsZW1FZGl0b3JQYXJ0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5SZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmNlbGxlZGl0b3IuQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuTG9jYWxUcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuVmlld2VyRHJhZ0FkYXB0ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuVW53cmFwcGluZ1NlbGVjdGlvblByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlNYXJrZXJIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlVdGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudmlldy5FeHRlbmRlZFByb3BlcnR5U2hlZXRQYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMucHJvdmlkZXIuR3JhcGhnZW5lcmF0b3JzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcm92aWRlci5Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByb3ZpZGVyLk1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJvdmlkZXIuU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIucHJvdmlkZXIuU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLnByb3ZpZGVyLlNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMucHJlc2VudGF0aW9uLkdyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247CisKKworLyoqCisgKiBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBHcmFwaGdlbmVyYXRvcnMgbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR3JhcGhnZW5lcmF0b3JzRWRpdG9yCisJZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0CisJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpblByb3ZpZGVyLCBJU2VsZWN0aW9uUHJvdmlkZXIsIElNZW51TGlzdGVuZXIsIElWaWV3ZXJQcm92aWRlciwgSUdvdG9NYXJrZXIgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGVkaXRpbmcgZG9tYWluIHRoYXQgaXMgdXNlZCB0byB0cmFjayBhbGwgY2hhbmdlcyB0byB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgb25lIGFkYXB0ZXIgZmFjdG9yeSB1c2VkIGZvciBwcm92aWRpbmcgdmlld3Mgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElDb250ZW50T3V0bGluZVBhZ2UgY29udGVudE91dGxpbmVQYWdlOworCisJLyoqCisJICogVGhpcyBpcyBhIGtsdWRnZS4uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlJ3Mgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmVlVmlld2VyIGNvbnRlbnRPdXRsaW5lVmlld2VyOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgcHJvcGVydHkgc2hlZXQgcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB2aWV3ZXIgdGhhdCBzaGFkb3dzIHRoZSBzZWxlY3Rpb24gaW4gdGhlIGNvbnRlbnQgb3V0bGluZS4KKwkgKiBUaGUgcGFyZW50IHJlbGF0aW9uIG11c3QgYmUgY29ycmVjdGx5IGRlZmluZWQgZm9yIHRoaXMgdG8gd29yay4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBzZWxlY3Rpb25WaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGludmVydHMgdGhlIHJvbGwgb2YgcGFyZW50IGFuZCBjaGlsZCBpbiB0aGUgY29udGVudCBwcm92aWRlciBhbmQgc2hvdyBwYXJlbnRzIGFzIGEgdHJlZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBwYXJlbnRWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIHNob3dzIGhvdyBhIHRyZWUgdmlldyB3b3Jrcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyOworCisJLyoqCisJICogVGhpcyBzaG93cyBob3cgYSBsaXN0IHZpZXcgd29ya3MuCisJICogQSBsaXN0IHZpZXdlciBkb2Vzbid0IHN1cHBvcnQgaWNvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIExpc3RWaWV3ZXIgbGlzdFZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgc2hvd3MgaG93IGEgdGFibGUgdmlldyB3b3Jrcy4KKwkgKiBBIHRhYmxlIGNhbiBiZSB1c2VkIGFzIGEgbGlzdCB3aXRoIGljb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgc2hvd3MgaG93IGEgdHJlZSB2aWV3IHdpdGggY29sdW1ucyB3b3Jrcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyV2l0aENvbHVtbnM7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgdmlld2VyIHBhbmUsIGluIHRoZSBib29rLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBWaWV3ZXJQYW5lIGN1cnJlbnRWaWV3ZXJQYW5lOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGNvbnRlbnQgdmlld2VyLCB3aGljaCBtYXkgYmUgZWl0aGVyIG9uZSBvZiB0aGUgdmlld2VycyBpbiB0aGUgcGFnZXMgb3IgdGhlIGNvbnRlbnQgb3V0bGluZSB2aWV3ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFZpZXdlciBjdXJyZW50Vmlld2VyOworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIHRvIHdoaWNoIGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn1zIHRoYXQgYXJlIGxpc3RlbmluZyB0byB0aGlzIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPigpOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgc2VsZWN0aW9uIG9mIHRoZSBlZGl0b3IgYXMgYSB3aG9sZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBlZGl0b3JTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOworCisJLyoqCisJICogVGhlIE1hcmtlckhlbHBlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgd29ya3NwYWNlIHJlc291cmNlIG1hcmtlcnMgcHJlc2VudGVkCisJICogaW4gRWNsaXBzZSdzIFByb2JsZW1zIFZpZXcuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1hcmtlckhlbHBlciBtYXJrZXJIZWxwZXIgPSBuZXcgRWRpdFVJTWFya2VySGVscGVyKCk7CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdoZW4gdGhlIG91dGxpbmUgYmVjb21lcyBhY3RpdmUKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPQorCQluZXcgSVBhcnRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCWlmIChwIGluc3RhbmNlb2YgQ29udGVudE91dGxpbmUpIHsKKwkJCQkJaWYgKCgoQ29udGVudE91dGxpbmUpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBjb250ZW50T3V0bGluZVBhZ2UpIHsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKEdyYXBoZ2VuZXJhdG9yc0VkaXRvci50aGlzKTsKKworCQkJCQkJc2V0Q3VycmVudFZpZXdlcihjb250ZW50T3V0bGluZVZpZXdlcik7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAocCBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpIHsKKwkJCQkJaWYgKCgoUHJvcGVydHlTaGVldClwKS5nZXRDdXJyZW50UGFnZSgpID09IHByb3BlcnR5U2hlZXRQYWdlKSB7CisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihHcmFwaGdlbmVyYXRvcnNFZGl0b3IudGhpcyk7CisJCQkJCQloYW5kbGVBY3RpdmF0ZSgpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHAgPT0gR3JhcGhnZW5lcmF0b3JzRWRpdG9yLnRoaXMpIHsKKwkJCQkJaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQl9CisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIHNpbmNlIGxhc3QgYWN0aXZhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHNhdmVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBzYXZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBNYXAgdG8gc3RvcmUgdGhlIGRpYWdub3N0aWMgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4gcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4oKTsKKworCS8qKgorCSAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiBzaG91bGQgYmUgdXBkYXRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisKKwkvKioKKwkgKiBBZGFwdGVyIHVzZWQgdG8gdXBkYXRlIHRoZSBwcm9ibGVtIGluZGljYXRpb24gd2hlbiByZXNvdXJjZXMgYXJlIGRlbWFuZGVkIGxvYWRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUNvbnRlbnRBZGFwdGVyIHByb2JsZW1JbmRpY2F0aW9uQWRhcHRlciA9IAorCQluZXcgRUNvbnRlbnRBZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBSZXNvdXJjZSkgeworCQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVzb3VyY2UuY2xhc3MpKSB7CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQ6CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19FUlJPUlM6CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19XQVJOSU5HUzogeworCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOworCQkJCQkJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBudWxsKTsKKwkJCQkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBkaWFnbm9zdGljKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnJlbW92ZShyZXNvdXJjZSk7CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKSB7CisJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCQkJCQkJCQkJIH0KKwkJCQkJCQkJCSB9KTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJCQl9CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VGFyZ2V0KFJlc291cmNlIHRhcmdldCkgeworCQkJCWJhc2ljU2V0VGFyZ2V0KHRhcmdldCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgdW5zZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7CisJCQkJYmFzaWNVbnNldFRhcmdldCh0YXJnZXQpOworCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIGZvciB3b3Jrc3BhY2UgY2hhbmdlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9CisJCW5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKKwkJCQl0cnkgeworCQkJCQljbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7CisJCQkJCQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7CisJCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisJCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CisJCQkJCQkJaWYgKGRlbHRhLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7CisJCQkJCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCB8fAorCQkJCQkJCQkgICAgZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgZGVsdGEuZ2V0RmxhZ3MoKSAhPSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSB7CisJCQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGRlbHRhLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIGZhbHNlKTsKKwkJCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisJCQkJCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7CisJCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJZWxzZSBpZiAoIXNhdmVkUmVzb3VyY2VzLnJlbW92ZShyZXNvdXJjZSkpIHsKKwkJCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJfQorCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsKKwkJCQkJCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlczsKKwkJCQkJCX0KKworCQkJCQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlbW92ZWRSZXNvdXJjZXMoKSB7CisJCQkJCQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlmaW5hbCBSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpdG9yKCk7CisJCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKKworCQkJCQlpZiAoIXZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkgcmVtb3ZlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkpOworCQkJCQkJCQkJIGlmICghaXNEaXJ0eSgpKSB7CisJCQkJCQkJCQkJIGdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoR3JhcGhnZW5lcmF0b3JzRWRpdG9yLnRoaXMsIGZhbHNlKTsKKwkJCQkJCQkJCSB9CisJCQkJCQkJCSB9CisJCQkJCQkJIH0pOworCQkJCQl9CisKKwkJCQkJaWYgKCF2aXNpdG9yLmdldENoYW5nZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJIGNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKKwkJCQkJCQkJCSBpZiAoZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSBHcmFwaGdlbmVyYXRvcnNFZGl0b3IudGhpcykgeworCQkJCQkJCQkJCSBoYW5kbGVBY3RpdmF0ZSgpOworCQkJCQkJCQkJIH0KKwkJCQkJCQkJIH0KKwkJCQkJCQkgfSk7CisJCQkJCX0KKwkJCQl9CisJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCUdyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIEhhbmRsZXMgYWN0aXZhdGlvbiBvZiB0aGUgZWRpdG9yIG9yIGl0J3MgYXNzb2NpYXRlZCB2aWV3cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0ZSgpIHsKKwkJLy8gUmVjb21wdXRlIHRoZSByZWFkIG9ubHkgc3RhdGUuCisJCS8vCisJCWlmIChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpICE9IG51bGwpIHsKKwkJICBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpLmNsZWFyKCk7CisKKwkJICAvLyBSZWZyZXNoIGFueSBhY3Rpb25zIHRoYXQgbWF5IGJlY29tZSBlbmFibGVkIG9yIGRpc2FibGVkLgorCQkgIC8vCisJCSAgc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKKwkJfQorCisJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCWlmIChoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpIHsKKwkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKEdyYXBoZ2VuZXJhdG9yc0VkaXRvci50aGlzLCBmYWxzZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZW1vdmVkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOworCQkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7CisJCQljaGFuZ2VkUmVzb3VyY2VzLnJlbW92ZUFsbChzYXZlZFJlc291cmNlcyk7CisJCQloYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCk7CisJCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOworCQl9CisJfQorCisJLyoqCisJICogSGFuZGxlcyB3aGF0IHRvIGRvIHdpdGggY2hhbmdlZCByZXNvdXJjZXMgb24gYWN0aXZhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCkgeworCQlpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpICYmICghaXNEaXJ0eSgpIHx8IGhhbmRsZURpcnR5Q29uZmxpY3QoKSkpIHsKKwkJCWlmIChpc0RpcnR5KCkpIHsKKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpOworCQkJfQorCQkJZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOworCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOworCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGNoYW5nZWRSZXNvdXJjZXMpIHsKKwkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgeworCQkJCQlyZXNvdXJjZS51bmxvYWQoKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKKwkJCQkJfQorCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQlpZiAoIXJlc291cmNlVG9EaWFnbm9zdGljTWFwLmNvbnRhaW5zS2V5KHJlc291cmNlKSkgeworCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluLmlzU3RhbGUoZWRpdG9yU2VsZWN0aW9uKSkgeworCQkJCXNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKKwkJCX0KKworCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOworCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJfQorCX0KKyAgCisJLyoqCisJICogVXBkYXRlcyB0aGUgcHJvYmxlbXMgaW5kaWNhdGlvbiB3aXRoIHRoZSBpbmZvcm1hdGlvbiBkZXNjcmliZWQgaW4gdGhlIHNwZWNpZmllZCBkaWFnbm9zdGljLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCkgeworCQlpZiAodXBkYXRlUHJvYmxlbUluZGljYXRpb24pIHsKKwkJCUJhc2ljRGlhZ25vc3RpYyBkaWFnbm9zdGljID0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLk9LLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzIiwKKwkJCQkJIDAsCisJCQkJCSBudWxsLAorCQkJCQkgbmV3IE9iamVjdCBbXSB7IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSB9KTsKKwkJCWZvciAoRGlhZ25vc3RpYyBjaGlsZERpYWdub3N0aWMgOiByZXNvdXJjZVRvRGlhZ25vc3RpY01hcC52YWx1ZXMoKSkgeworCQkJCWlmIChjaGlsZERpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCWRpYWdub3N0aWMuYWRkKGNoaWxkRGlhZ25vc3RpYyk7CisJCQkJfQorCQkJfQorCisJCQlpbnQgbGFzdEVkaXRvclBhZ2UgPSBnZXRQYWdlQ291bnQoKSAtIDE7CisJCQlpZiAobGFzdEVkaXRvclBhZ2UgPj0gMCAmJiBnZXRFZGl0b3IobGFzdEVkaXRvclBhZ2UpIGluc3RhbmNlb2YgUHJvYmxlbUVkaXRvclBhcnQpIHsKKwkJCQkoKFByb2JsZW1FZGl0b3JQYXJ0KWdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkpLnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7CisJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCXNldEFjdGl2ZVBhZ2UobGFzdEVkaXRvclBhZ2UpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJUHJvYmxlbUVkaXRvclBhcnQgcHJvYmxlbUVkaXRvclBhcnQgPSBuZXcgUHJvYmxlbUVkaXRvclBhcnQoKTsKKwkJCQlwcm9ibGVtRWRpdG9yUGFydC5zZXREaWFnbm9zdGljKGRpYWdub3N0aWMpOworCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldE1hcmtlckhlbHBlcihtYXJrZXJIZWxwZXIpOworCQkJCXRyeSB7CisJCQkJCWFkZFBhZ2UoKytsYXN0RWRpdG9yUGFnZSwgcHJvYmxlbUVkaXRvclBhcnQsIGdldEVkaXRvcklucHV0KCkpOworCQkJCQlzZXRQYWdlVGV4dChsYXN0RWRpdG9yUGFnZSwgcHJvYmxlbUVkaXRvclBhcnQuZ2V0UGFydE5hbWUoKSk7CisJCQkJCXNldEFjdGl2ZVBhZ2UobGFzdEVkaXRvclBhZ2UpOworCQkJCQlzaG93VGFicygpOworCQkJCX0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCUdyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKworCQkJaWYgKG1hcmtlckhlbHBlci5oYXNNYXJrZXJzKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSkpIHsKKwkJCQltYXJrZXJIZWxwZXIuZGVsZXRlTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQl0cnkgeworCQkJCQkJbWFya2VySGVscGVyLmNyZWF0ZU1hcmtlcnMoZGlhZ25vc3RpYyk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQlHcmFwaGdlbmVyYXRvckVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFNob3dzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsKKwkJcmV0dXJuCisJCQlNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbgorCQkJCShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRmlsZUNvbmZsaWN0X2xhYmVsIiksCisJCQkJIGdldFN0cmluZygiX1dBUk5fRmlsZUNvbmZsaWN0IikpOworCX0KKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhIG1vZGVsIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR3JhcGhnZW5lcmF0b3JzRWRpdG9yKCkgeworCQlzdXBlcigpOworCQlpbml0aWFsaXplRWRpdGluZ0RvbWFpbigpOworCX0KKworCS8qKgorCSAqIFRoaXMgc2V0cyB1cCB0aGUgZWRpdGluZyBkb21haW4gZm9yIHRoZSBtb2RlbCBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKSB7CisJCS8vIENyZWF0ZSBhbiBhZGFwdGVyIGZhY3RvcnkgdGhhdCB5aWVsZHMgaXRlbSBwcm92aWRlcnMuCisJCS8vCisJCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5EZXNjcmlwdG9yLlJlZ2lzdHJ5LklOU1RBTkNFKTsKKworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEdyYXBoZ2VuZXJhdG9yc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBFY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RpZmllckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNlcXVlbmNlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU29sdmVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlIGV4ZWN1dGVkLgorCQkvLworCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKKworCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLgorCQkvLworCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIKKwkJCShuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7CisJCQkJIHB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsKKwkJCQkJIGdldENvbnRhaW5lcigpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCSAobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCSAgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkgIGZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKKworCQkJCQkJCQkgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuCisJCQkJCQkJCSAgLy8KKwkJCQkJCQkJICBDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spZXZlbnQuZ2V0U291cmNlKCkpLmdldE1vc3RSZWNlbnRDb21tYW5kKCk7CisJCQkJCQkJCSAgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKKwkJCQkJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOworCQkJCQkJCQkgIH0KKwkJCQkJCQkJICBpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCAmJiAhcHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgeworCQkJCQkJCQkJICBwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7CisJCQkJCQkJCSAgfQorCQkJCQkJCSAgfQorCQkJCQkJICB9KTsKKwkJCQkgfQorCQkJIH0pOworCisJCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KKwkJLy8KKwkJZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywgbmV3IEhhc2hNYXA8UmVzb3VyY2UsIEJvb2xlYW4+KCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgaGVyZSBmb3IgdGhlIGxpc3RlbmVyIHRvIGJlIGFibGUgdG8gY2FsbCBpdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwkJCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgYWN0aW9uKSB7CisJCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShhY3Rpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgc2V0cyB0aGUgc2VsZWN0aW9uIGludG8gd2hpY2hldmVyIHZpZXdlciBpcyBhY3RpdmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisJCWZpbmFsIENvbGxlY3Rpb248Pz4gdGhlU2VsZWN0aW9uID0gY29sbGVjdGlvbjsKKwkJLy8gTWFrZSBzdXJlIGl0J3Mgb2theS4KKwkJLy8KKwkJaWYgKHRoZVNlbGVjdGlvbiAhPSBudWxsICYmICF0aGVTZWxlY3Rpb24uaXNFbXB0eSgpKSB7CisJCQlSdW5uYWJsZSBydW5uYWJsZSA9CisJCQkJbmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBpdGVtcyBpbiB0aGUgY3VycmVudCBjb250ZW50IHZpZXdlciBvZiB0aGUgZWRpdG9yLgorCQkJCQkJLy8KKwkJCQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKKwkJCQkJCQljdXJyZW50Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0aGVTZWxlY3Rpb24udG9BcnJheSgpKSwgdHJ1ZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9OworCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGVkaXRpbmcgZG9tYWluIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSUVkaXRpbmdEb21haW5Qcm92aWRlcn0gaW50ZXJmYWNlLgorCSAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBpbXBsZW1lbnRpbmcgdGhlIHN0YXRpYyBtZXRob2RzIG9mIHtAbGluayBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW59CisJICogYW5kIGZvciBzdXBwb3J0aW5nIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKKwkJcmV0dXJuIGVkaXRpbmdEb21haW47CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGNsYXNzIFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0IFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE9iamVjdCBbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7CisJCQlyZXR1cm4gKHBhcmVudCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhcmVudCkpLnRvQXJyYXkoKTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiBwYXJlbnQgIT0gbnVsbDsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q3VycmVudFZpZXdlclBhbmUoVmlld2VyUGFuZSB2aWV3ZXJQYW5lKSB7CisJCWlmIChjdXJyZW50Vmlld2VyUGFuZSAhPSB2aWV3ZXJQYW5lKSB7CisJCQlpZiAoY3VycmVudFZpZXdlclBhbmUgIT0gbnVsbCkgeworCQkJCWN1cnJlbnRWaWV3ZXJQYW5lLnNob3dGb2N1cyhmYWxzZSk7CisJCQl9CisJCQljdXJyZW50Vmlld2VyUGFuZSA9IHZpZXdlclBhbmU7CisJCX0KKwkJc2V0Q3VycmVudFZpZXdlcihjdXJyZW50Vmlld2VyUGFuZS5nZXRWaWV3ZXIoKSk7CisJfQorCisJLyoqCisJICogVGhpcyBtYWtlcyBzdXJlIHRoYXQgb25lIGNvbnRlbnQgdmlld2VyLCBlaXRoZXIgZm9yIHRoZSBjdXJyZW50IHBhZ2Ugb3IgdGhlIG91dGxpbmUgdmlldywgaWYgaXQgaGFzIGZvY3VzLAorCSAqIGlzIHRoZSBjdXJyZW50IG9uZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vmlld2VyKFZpZXdlciB2aWV3ZXIpIHsKKwkJLy8gSWYgaXQgaXMgY2hhbmdpbmcuLi4KKwkJLy8KKwkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gdmlld2VyKSB7CisJCQlpZiAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsKKwkJCQkvLyBDcmVhdGUgdGhlIGxpc3RlbmVyIG9uIGRlbWFuZC4KKwkJCQkvLworCQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9CisJCQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJCQkJLy8gVGhpcyBqdXN0IG5vdGlmaWVzIHRob3NlIHRoaW5ncyB0aGF0IGFyZSBhZmZlY3RlZCBieSB0aGUgc2VjdGlvbi4KKwkJCQkJCS8vCisJCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBzZWxlY3Rpb25DaGFuZ2VkRXZlbnQpIHsKKwkJCQkJCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCX0KKworCQkJLy8gU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG9sZCBvbmUuCisJCQkvLworCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgeworCQkJCWN1cnJlbnRWaWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7CisJCQl9CisKKwkJCS8vIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmV3IG9uZS4KKwkJCS8vCisJCQlpZiAodmlld2VyICE9IG51bGwpIHsKKwkJCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7CisJCQl9CisKKwkJCS8vIFJlbWVtYmVyIGl0LgorCQkJLy8KKwkJCWN1cnJlbnRWaWV3ZXIgPSB2aWV3ZXI7CisKKwkJCS8vIFNldCB0aGUgZWRpdG9ycyBzZWxlY3Rpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgdmlld2VyJ3Mgc2VsZWN0aW9uLgorCQkJLy8KKwkJCXNldFNlbGVjdGlvbihjdXJyZW50Vmlld2VyID09IG51bGwgPyBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZIDogY3VycmVudFZpZXdlci5nZXRTZWxlY3Rpb24oKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHZpZXdlciBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElWaWV3ZXJQcm92aWRlcn0gaW50ZXJmYWNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgeworCQlyZXR1cm4gY3VycmVudFZpZXdlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIgYW5kIGFkZHMgYSBsaXN0ZW5lciBhcyB3ZWxsIHJlZ2lzdGVyaW5nIHRoZSBtZW51IGZvciBleHRlbnNpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKKwkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOworCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOworCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7CisJCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKKwkJTWVudSBtZW51PSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKKwkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOworCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgbmV3IFVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcih2aWV3ZXIpKTsKKworCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSzsKKwkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OworCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgVmlld2VyRHJhZ0FkYXB0ZXIodmlld2VyKSk7CisJCXZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIGNhbGxlZCB0byBsb2FkIGEgcmVzb3VyY2UgaW50byB0aGUgZWRpdGluZyBkb21haW4ncyByZXNvdXJjZSBzZXQgYmFzZWQgb24gdGhlIGVkaXRvcidzIGlucHV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZU1vZGVsKCkgeworCQlVUkkgcmVzb3VyY2VVUkkgPSBFZGl0VUlVdGlsLmdldFVSSShnZXRFZGl0b3JJbnB1dCgpKTsKKwkJRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCS8vIExvYWQgdGhlIHJlc291cmNlIHRocm91Z2ggdGhlIGVkaXRpbmcgZG9tYWluLgorCQkJLy8KKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCB0cnVlKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWV4Y2VwdGlvbiA9IGU7CisJCQlyZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgZmFsc2UpOworCQl9CisKKwkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbik7CisJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCAgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQl9CisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5hZGQocHJvYmxlbUluZGljYXRpb25BZGFwdGVyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgZGlhZ25vc3RpYyBkZXNjcmliaW5nIHRoZSBlcnJvcnMgYW5kIHdhcm5pbmdzIGxpc3RlZCBpbiB0aGUgcmVzb3VyY2UKKwkgKiBhbmQgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gKGlmIGFueSkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERpYWdub3N0aWMgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMoUmVzb3VyY2UgcmVzb3VyY2UsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJaWYgKCFyZXNvdXJjZS5nZXRFcnJvcnMoKS5pc0VtcHR5KCkgfHwgIXJlc291cmNlLmdldFdhcm5pbmdzKCkuaXNFbXB0eSgpKSB7CisJCQlCYXNpY0RpYWdub3N0aWMgYmFzaWNEaWFnbm9zdGljID0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzIiwKKwkJCQkJIDAsCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZXhjZXB0aW9uID09IG51bGwgPyAoT2JqZWN0KXJlc291cmNlIDogZXhjZXB0aW9uIH0pOworCQkJYmFzaWNEaWFnbm9zdGljLm1lcmdlKEVjb3JlVXRpbC5jb21wdXRlRGlhZ25vc3RpYyhyZXNvdXJjZSwgdHJ1ZSkpOworCQkJcmV0dXJuIGJhc2ljRGlhZ25vc3RpYzsKKwkJfQorCQllbHNlIGlmIChleGNlcHRpb24gIT0gbnVsbCkgeworCQkJcmV0dXJuCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycyIsCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLAorCQkJCQkgbmV3IE9iamVjdFtdIHsgZXhjZXB0aW9uIH0pOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIERpYWdub3N0aWMuT0tfSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGluc3RhbGwgeW91ciBvd24gY29udHJvbHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3JlYXRlUGFnZXMoKSB7CisJCS8vIENyZWF0ZXMgdGhlIG1vZGVsIGZyb20gdGhlIGVkaXRvciBpbnB1dAorCQkvLworCQljcmVhdGVNb2RlbCgpOworCisJCS8vIE9ubHkgY3JlYXRlcyB0aGUgb3RoZXIgcGFnZXMgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGVkaXRlZAorCQkvLworCQlpZiAoIWdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJLy8gQ3JlYXRlIGEgcGFnZSBmb3IgdGhlIHNlbGVjdGlvbiB0cmVlIHZpZXcuCisJCQkvLworCQkJeworCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9CisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIEdyYXBoZ2VuZXJhdG9yc0VkaXRvci50aGlzKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKwkJCQkJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShjb21wb3NpdGUsIFNXVC5NVUxUSSk7CisJCQkJCQkJVHJlZVZpZXdlciBuZXdUcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7CisJCQkJCQkJcmV0dXJuIG5ld1RyZWVWaWV3ZXI7CisJCQkJCQl9CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgeworCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7CisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7CisJCQkJCQl9CisJCQkJCX07CisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsKKworCQkJCXNlbGVjdGlvblZpZXdlciA9IChUcmVlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7CisJCQkJc2VsZWN0aW9uVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKworCQkJCXNlbGVjdGlvblZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKwkJCQl2aWV3ZXJQYW5lLnNldFRpdGxlKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisKKwkJCQluZXcgQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yKHNlbGVjdGlvblZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsKKworCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHNlbGVjdGlvblZpZXdlcik7CisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOworCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsKKwkJCX0KKworCQkJLy8gQ3JlYXRlIGEgcGFnZSBmb3IgdGhlIHBhcmVudCB0cmVlIHZpZXcuCisJCQkvLworCQkJeworCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9CisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIEdyYXBoZ2VuZXJhdG9yc0VkaXRvci50aGlzKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKwkJCQkJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShjb21wb3NpdGUsIFNXVC5NVUxUSSk7CisJCQkJCQkJVHJlZVZpZXdlciBuZXdUcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7CisJCQkJCQkJcmV0dXJuIG5ld1RyZWVWaWV3ZXI7CisJCQkJCQl9CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgeworCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7CisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7CisJCQkJCQl9CisJCQkJCX07CisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsKKworCQkJCXBhcmVudFZpZXdlciA9IChUcmVlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7CisJCQkJcGFyZW50Vmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbCgzMCk7CisJCQkJcGFyZW50Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJcGFyZW50Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IocGFyZW50Vmlld2VyKTsKKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7CisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9QYXJlbnRQYWdlX2xhYmVsIikpOworCQkJfQorCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgbGlzdCB2aWV3ZXIKKwkJCS8vCisJCQl7CisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgR3JhcGhnZW5lcmF0b3JzRWRpdG9yLnRoaXMpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQkJCQkJCXJldHVybiBuZXcgTGlzdFZpZXdlcihjb21wb3NpdGUpOworCQkJCQkJfQorCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsKKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOworCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOworCQkJCQkJfQorCQkJCQl9OworCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7CisJCQkJbGlzdFZpZXdlciA9IChMaXN0Vmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7CisJCQkJbGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJbGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKworCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKGxpc3RWaWV3ZXIpOworCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsKKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX0xpc3RQYWdlX2xhYmVsIikpOworCQkJfQorCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgdHJlZSB2aWV3ZXIKKwkJCS8vCisJCQl7CisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgR3JhcGhnZW5lcmF0b3JzRWRpdG9yLnRoaXMpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQkJCQkJCXJldHVybiBuZXcgVHJlZVZpZXdlcihjb21wb3NpdGUpOworCQkJCQkJfQorCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsKKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOworCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOworCQkJCQkJfQorCQkJCQl9OworCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7CisJCQkJdHJlZVZpZXdlciA9IChUcmVlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7CisJCQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKworCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3IodHJlZVZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsKKworCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRyZWVWaWV3ZXIpOworCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsKKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1RyZWVQYWdlX2xhYmVsIikpOworCQkJfQorCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgdGFibGUgdmlld2VyLgorCQkJLy8KKwkJCXsKKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBHcmFwaGdlbmVyYXRvcnNFZGl0b3IudGhpcykgeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7CisJCQkJCQkJcmV0dXJuIG5ldyBUYWJsZVZpZXdlcihjb21wb3NpdGUpOworCQkJCQkJfQorCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsKKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOworCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOworCQkJCQkJfQorCQkJCQl9OworCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7CisJCQkJdGFibGVWaWV3ZXIgPSAoVGFibGVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsKKworCQkJCVRhYmxlIHRhYmxlID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKKwkJCQlUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKKwkJCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOworCQkJCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKKworCQkJCVRhYmxlQ29sdW1uIG9iamVjdENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOworCQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDMsIDEwMCwgdHJ1ZSkpOworCQkJCW9iamVjdENvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX09iamVjdENvbHVtbl9sYWJlbCIpKTsKKwkJCQlvYmplY3RDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOworCisJCQkJVGFibGVDb2x1bW4gc2VsZkNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOworCQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDIsIDEwMCwgdHJ1ZSkpOworCQkJCXNlbGZDb2x1bW4uc2V0VGV4dChnZXRTdHJpbmcoIl9VSV9TZWxmQ29sdW1uX2xhYmVsIikpOworCQkJCXNlbGZDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOworCisJCQkJdGFibGVWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nIFtdIHsiYSIsICJiIn0pOworCQkJCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKworCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRhYmxlVmlld2VyKTsKKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7CisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9UYWJsZVBhZ2VfbGFiZWwiKSk7CisJCQl9CisKKwkJCS8vIFRoaXMgaXMgdGhlIHBhZ2UgZm9yIHRoZSB0YWJsZSB0cmVlIHZpZXdlci4KKwkJCS8vCisJCQl7CisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgR3JhcGhnZW5lcmF0b3JzRWRpdG9yLnRoaXMpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQkJCQkJCXJldHVybiBuZXcgVHJlZVZpZXdlcihjb21wb3NpdGUpOworCQkJCQkJfQorCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsKKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOworCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOworCQkJCQkJfQorCQkJCQl9OworCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7CisKKwkJCQl0cmVlVmlld2VyV2l0aENvbHVtbnMgPSAoVHJlZVZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOworCisJCQkJVHJlZSB0cmVlID0gdHJlZVZpZXdlcldpdGhDb2x1bW5zLmdldFRyZWUoKTsKKwkJCQl0cmVlLnNldExheW91dERhdGEobmV3IEZpbGxMYXlvdXQoKSk7CisJCQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOworCQkJCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOworCisJCQkJVHJlZUNvbHVtbiBvYmplY3RDb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7CisJCQkJb2JqZWN0Q29sdW1uLnNldFRleHQoZ2V0U3RyaW5nKCJfVUlfT2JqZWN0Q29sdW1uX2xhYmVsIikpOworCQkJCW9iamVjdENvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7CisJCQkJb2JqZWN0Q29sdW1uLnNldFdpZHRoKDI1MCk7CisKKwkJCQlUcmVlQ29sdW1uIHNlbGZDb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7CisJCQkJc2VsZkNvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX1NlbGZDb2x1bW5fbGFiZWwiKSk7CisJCQkJc2VsZkNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7CisJCQkJc2VsZkNvbHVtbi5zZXRXaWR0aCgyMDApOworCisJCQkJdHJlZVZpZXdlcldpdGhDb2x1bW5zLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZyBbXSB7ImEiLCAiYiJ9KTsKKwkJCQl0cmVlVmlld2VyV2l0aENvbHVtbnMuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCXRyZWVWaWV3ZXJXaXRoQ29sdW1ucy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKworCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRyZWVWaWV3ZXJXaXRoQ29sdW1ucyk7CisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOworCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfVHJlZVdpdGhDb2x1bW5zUGFnZV9sYWJlbCIpKTsKKwkJCX0KKworCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkgc2V0QWN0aXZlUGFnZSgwKTsKKwkJCQkJIH0KKwkJCQkgfSk7CisJCX0KKworCQkvLyBFbnN1cmVzIHRoYXQgdGhpcyBlZGl0b3Igd2lsbCBvbmx5IGRpc3BsYXkgdGhlIHBhZ2UncyB0YWIKKwkJLy8gYXJlYSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBwYWdlCisJCS8vCisJCWdldENvbnRhaW5lcigpLmFkZENvbnRyb2xMaXN0ZW5lcgorCQkJKG5ldyBDb250cm9sQWRhcHRlcigpIHsKKwkJCQlib29sZWFuIGd1YXJkID0gZmFsc2U7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7CisJCQkJCWlmICghZ3VhcmQpIHsKKwkJCQkJCWd1YXJkID0gdHJ1ZTsKKwkJCQkJCWhpZGVUYWJzKCk7CisJCQkJCQlndWFyZCA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJIH0pOworCisJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCQkJIH0KKwkJCSB9KTsKKwl9CisKKwkvKioKKwkgKiBJZiB0aGVyZSBpcyBqdXN0IG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LAorCSAqIHRoaXMgaGlkZXMgdGhlIHNpbmdsZSB0YWIgYXQgdGhlIGJvdHRvbS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoaWRlVGFicygpIHsKKwkJaWYgKGdldFBhZ2VDb3VudCgpIDw9IDEpIHsKKwkJCXNldFBhZ2VUZXh0KDAsICIiKTsKKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsKKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodCgxKTsKKwkJCQlQb2ludCBwb2ludCA9IGdldENvbnRhaW5lcigpLmdldFNpemUoKTsKKwkJCQlnZXRDb250YWluZXIoKS5zZXRTaXplKHBvaW50LngsIHBvaW50LnkgKyA2KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGFnZSBpbiB0aGUgbXVsdGktcGFnZSBlZGl0b3IgcGFydCwKKwkgKiB0aGlzIHNob3dzIHRoZSB0YWJzIGF0IHRoZSBib3R0b20uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2hvd1RhYnMoKSB7CisJCWlmIChnZXRQYWdlQ291bnQoKSA+IDEpIHsKKwkJCXNldFBhZ2VUZXh0KDAsIGdldFN0cmluZygiX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwiKSk7CisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7CisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoU1dULkRFRkFVTFQpOworCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOworCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSAtIDYpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIHRyYWNrIHRoZSBhY3RpdmUgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IHBhZ2VJbmRleCkgeworCQlzdXBlci5wYWdlQ2hhbmdlKHBhZ2VJbmRleCk7CisKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7CisJCQloYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihjb250ZW50T3V0bGluZVBhZ2UuZ2V0U2VsZWN0aW9uKCkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBob3cgdGhlIGZyYW1ld29yayBkZXRlcm1pbmVzIHdoaWNoIGludGVyZmFjZXMgd2UgaW1wbGVtZW50LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKKwkJaWYgKGtleS5lcXVhbHMoSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcykpIHsKKwkJCXJldHVybiBzaG93T3V0bGluZVZpZXcoKSA/IGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIDogbnVsbDsKKwkJfQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykpIHsKKwkJCXJldHVybiBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOworCQl9CisJCWVsc2UgaWYgKGtleS5lcXVhbHMoSUdvdG9NYXJrZXIuY2xhc3MpKSB7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGtleSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIGNvbnRlbnQgb3V0bGluZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElDb250ZW50T3V0bGluZVBhZ2UgZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgeworCQlpZiAoY29udGVudE91dGxpbmVQYWdlID09IG51bGwpIHsKKwkJCS8vIFRoZSBjb250ZW50IG91dGxpbmUgaXMganVzdCBhIHRyZWUuCisJCQkvLworCQkJY2xhc3MgTXlDb250ZW50T3V0bGluZVBhZ2UgZXh0ZW5kcyBDb250ZW50T3V0bGluZVBhZ2UgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQkJCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyID0gZ2V0VHJlZVZpZXdlcigpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisKKwkJCQkJLy8gU2V0IHVwIHRoZSB0cmVlIHZpZXdlci4KKwkJCQkJLy8KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKworCQkJCQkvLyBNYWtlIHN1cmUgb3VyIHBvcHVwcyB3b3JrLgorCQkJCQkvLworCQkJCQljcmVhdGVDb250ZXh0TWVudUZvcihjb250ZW50T3V0bGluZVZpZXdlcik7CisKKwkJCQkJaWYgKCFlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCSAgLy8gU2VsZWN0IHRoZSByb290IG9iamVjdCBpbiB0aGUgdmlldy4KKwkJCQkJICAvLworCQkJCQkgIGNvbnRlbnRPdXRsaW5lVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBtYWtlQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyKSB7CisJCQkJCXN1cGVyLm1ha2VDb250cmlidXRpb25zKG1lbnVNYW5hZ2VyLCB0b29sQmFyTWFuYWdlciwgc3RhdHVzTGluZU1hbmFnZXIpOworCQkJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyID0gc3RhdHVzTGluZU1hbmFnZXI7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisJCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7CisJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOworCQkJCX0KKwkJCX0KKworCQkJY29udGVudE91dGxpbmVQYWdlID0gbmV3IE15Q29udGVudE91dGxpbmVQYWdlKCk7CisKKwkJCS8vIExpc3RlbiB0byBzZWxlY3Rpb24gc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGl0IGlzIGEgc3BlY2lhbCB3YXkuCisJCQkvLworCQkJY29udGVudE91dGxpbmVQYWdlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgorCQkJCShuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCQkJIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGhhbmRsZSBzZWxlY3Rpb25zIGNvcnJlY3RseS4KKwkJCQkJIC8vCisJCQkJCSBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCQkJIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKKwkJCQkJIH0KKwkJCQkgfSk7CisJCX0KKworCQlyZXR1cm4gY29udGVudE91dGxpbmVQYWdlOworCX0KKworCS8qKgorCSAqIFRoaXMgYWNjZXNzZXMgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUgcHJvcGVydHkgc2hlZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElQcm9wZXJ0eVNoZWV0UGFnZSBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKKwkJaWYgKHByb3BlcnR5U2hlZXRQYWdlID09IG51bGwpIHsKKwkJCXByb3BlcnR5U2hlZXRQYWdlID0KKwkJCQluZXcgRXh0ZW5kZWRQcm9wZXJ0eVNoZWV0UGFnZShlZGl0aW5nRG9tYWluKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihMaXN0PD8+IHNlbGVjdGlvbikgeworCQkJCQkJR3JhcGhnZW5lcmF0b3JzRWRpdG9yLnRoaXMuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0aW9uKTsKKwkJCQkJCUdyYXBoZ2VuZXJhdG9yc0VkaXRvci50aGlzLnNldEZvY3VzKCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisJCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7CisJCQkJCX0KKwkJCQl9OworCQkJcHJvcGVydHlTaGVldFBhZ2Uuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJfQorCisJCXJldHVybiBwcm9wZXJ0eVNoZWV0UGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGRlYWxzIHdpdGggaG93IHdlIHdhbnQgc2VsZWN0aW9uIGluIHRoZSBvdXRsaW5lciB0byBhZmZlY3QgdGhlIG90aGVyIHZpZXdzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWlmIChjdXJyZW50Vmlld2VyUGFuZSAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQlJdGVyYXRvcjw/PiBzZWxlY3RlZEVsZW1lbnRzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLml0ZXJhdG9yKCk7CisJCQlpZiAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsKKwkJCQkvLyBHZXQgdGhlIGZpcnN0IHNlbGVjdGVkIGVsZW1lbnQuCisJCQkJLy8KKwkJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCk7CisKKwkJCQkvLyBJZiBpdCdzIHRoZSBzZWxlY3Rpb24gdmlld2VyLCB0aGVuIHdlIHdhbnQgaXQgdG8gc2VsZWN0IHRoZSBzYW1lIHNlbGVjdGlvbiBhcyB0aGlzIHNlbGVjdGlvbi4KKwkJCQkvLworCQkJCWlmIChjdXJyZW50Vmlld2VyUGFuZS5nZXRWaWV3ZXIoKSA9PSBzZWxlY3Rpb25WaWV3ZXIpIHsKKwkJCQkJQXJyYXlMaXN0PE9iamVjdD4gc2VsZWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCQkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnQpOworCQkJCQl3aGlsZSAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsKKwkJCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudHMubmV4dCgpKTsKKwkJCQkJfQorCisJCQkJCS8vIFNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSB3aWRnZXQuCisJCQkJCS8vCisJCQkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uTGlzdCkpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJLy8gU2V0IHRoZSBpbnB1dCB0byB0aGUgd2lkZ2V0LgorCQkJCQkvLworCQkJCQlpZiAoY3VycmVudFZpZXdlclBhbmUuZ2V0Vmlld2VyKCkuZ2V0SW5wdXQoKSAhPSBzZWxlY3RlZEVsZW1lbnQpIHsKKwkJCQkJCWN1cnJlbnRWaWV3ZXJQYW5lLmdldFZpZXdlcigpLnNldElucHV0KHNlbGVjdGVkRWxlbWVudCk7CisJCQkJCQljdXJyZW50Vmlld2VyUGFuZS5zZXRUaXRsZShzZWxlY3RlZEVsZW1lbnQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSB0ZXN0cyB0aGUgY29tbWFuZCBzdGFjay4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgeworCQlyZXR1cm4gKChCYXNpY0NvbW1hbmRTdGFjayllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5pc1NhdmVOZWVkZWQoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHNhdmVzIHRoZSBtb2RlbCBmaWxlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworCQkvLyBTYXZlIG9ubHkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBhY3R1YWxseSBjaGFuZ2VkLgorCQkvLworCQlmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7CisJCXNhdmVPcHRpb25zLnB1dChSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRUQsIFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRF9NRU1PUllfQlVGRkVSKTsKKworCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guCisJCS8vCisJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPQorCQkJbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKKwkJCQkvLyBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBnZXRzIGludm9rZWQgd2hlbiB0aGUgb3BlcmF0aW9uIHJ1bnMuCisJCQkJLy8KKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJCQkvLyBTYXZlIHRoZSByZXNvdXJjZXMgdG8gdGhlIGZpbGUgc3lzdGVtLgorCQkJCQkvLworCQkJCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwkJCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSkgeworCQkJCQkJaWYgKChmaXJzdCB8fCAhcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkgfHwgaXNQZXJzaXN0ZWQocmVzb3VyY2UpKSAmJiAhZWRpdGluZ0RvbWFpbi5pc1JlYWRPbmx5KHJlc291cmNlKSkgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCWxvbmcgdGltZVN0YW1wID0gcmVzb3VyY2UuZ2V0VGltZVN0YW1wKCk7CisJCQkJCQkJCXJlc291cmNlLnNhdmUoc2F2ZU9wdGlvbnMpOworCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VGltZVN0YW1wKCkgIT0gdGltZVN0YW1wKSB7CisJCQkJCQkJCQlzYXZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQkJCQkJCX0KKwkJCQkJCQlmaXJzdCA9IGZhbHNlOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfTsKKworCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOworCQl0cnkgeworCQkJLy8gVGhpcyBydW5zIHRoZSBvcHRpb25zLCBhbmQgc2hvd3MgcHJvZ3Jlc3MuCisJCQkvLworCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSkucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOworCisJCQkvLyBSZWZyZXNoIHRoZSBuZWNlc3Nhcnkgc3RhdGUuCisJCQkvLworCQkJKChCYXNpY0NvbW1hbmRTdGFjayllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5zYXZlSXNEb25lKCk7CisJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCS8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHRoYXQgc2hvdWxkbid0LgorCQkJLy8KKwkJCUdyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgd2hldGhlciBzb21ldGhpbmcgaGFzIGJlZW4gcGVyc2lzdGVkIHRvIHRoZSBVUkkgb2YgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgVVJJIGNvbnZlcnRlciBmcm9tIHRoZSBlZGl0b3IncyByZXNvdXJjZSBzZXQgdG8gdHJ5IHRvIG9wZW4gYW4gaW5wdXQgc3RyZWFtLiAKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BlcnNpc3RlZChSZXNvdXJjZSByZXNvdXJjZSkgeworCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQl0cnkgeworCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKHJlc291cmNlLmdldFVSSSgpKTsKKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgeworCQkJCXJlc3VsdCA9IHRydWU7CisJCQkJc3RyZWFtLmNsb3NlKCk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElnbm9yZQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogVGhpcyBhbHdheXMgcmV0dXJucyB0cnVlIGJlY2F1c2UgaXQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFsc28gY2hhbmdlcyB0aGUgZWRpdG9yJ3MgaW5wdXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7CisJCVNhdmVBc0RpYWxvZyBzYXZlQXNEaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKKwkJc2F2ZUFzRGlhbG9nLm9wZW4oKTsKKwkJSVBhdGggcGF0aCA9IHNhdmVBc0RpYWxvZy5nZXRSZXN1bHQoKTsKKwkJaWYgKHBhdGggIT0gbnVsbCkgeworCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKKwkJCWlmIChmaWxlICE9IG51bGwpIHsKKwkJCQlkb1NhdmVBcyhVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZG9TYXZlQXMoVVJJIHVyaSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisJCShlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKS5zZXRVUkkodXJpKTsKKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKKwkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPQorCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgIT0gbnVsbCA/CisJCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgOgorCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisJCWRvU2F2ZShwcm9ncmVzc01vbml0b3IpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKKwkJdHJ5IHsKKwkJCWlmIChtYXJrZXIuZ2V0VHlwZSgpLmVxdWFscyhFVmFsaWRhdG9yLk1BUktFUikpIHsKKwkJCQlTdHJpbmcgdXJpQXR0cmlidXRlID0gbWFya2VyLmdldEF0dHJpYnV0ZShFVmFsaWRhdG9yLlVSSV9BVFRSSUJVVEUsIG51bGwpOworCQkJCWlmICh1cmlBdHRyaWJ1dGUgIT0gbnVsbCkgeworCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSSh1cmlBdHRyaWJ1dGUpOworCQkJCQlFT2JqZWN0IGVPYmplY3QgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0RU9iamVjdCh1cmksIHRydWUpOworCQkJCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7CisJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGVkaXRpbmdEb21haW4uZ2V0V3JhcHBlcihlT2JqZWN0KSkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJR3JhcGhnZW5lcmF0b3JFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgc3RhcnR1cC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgeworCQlzZXRTaXRlKHNpdGUpOworCQlzZXRJbnB1dFdpdGhOb3RpZnkoZWRpdG9ySW5wdXQpOworCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOworCQlzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKHRoaXMpOworCQlzaXRlLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgeworCQlpZiAoY3VycmVudFZpZXdlclBhbmUgIT0gbnVsbCkgeworCQkJY3VycmVudFZpZXdlclBhbmUuc2V0Rm9jdXMoKTsKKwkJfQorCQllbHNlIHsKKwkJCWdldENvbnRyb2woZ2V0QWN0aXZlUGFnZSgpKS5zZXRGb2N1cygpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byByZXR1cm4gdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7CisJCXJldHVybiBlZGl0b3JTZWxlY3Rpb247CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gc2V0IHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCisJICogQ2FsbGluZyB0aGlzIHJlc3VsdCB3aWxsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQllZGl0b3JTZWxlY3Rpb24gPSBzZWxlY3Rpb247CisKKwkJZm9yIChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyIDogc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycykgeworCQkJbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOworCQl9CisJCXNldFN0YXR1c0xpbmVNYW5hZ2VyKHNlbGVjdGlvbik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZU1hbmFnZXIoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyID0gY3VycmVudFZpZXdlciAhPSBudWxsICYmIGN1cnJlbnRWaWV3ZXIgPT0gY29udGVudE91dGxpbmVWaWV3ZXIgPworCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA6IGdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOworCisJCWlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKSB7CisJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCQlDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikudG9MaXN0KCk7CisJCQkJc3dpdGNoIChjb2xsZWN0aW9uLnNpemUoKSkgeworCQkJCQljYXNlIDA6IHsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTm9PYmplY3RTZWxlY3RlZCIpKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNhc2UgMTogeworCQkJCQkJU3RyaW5nIHRleHQgPSBuZXcgQWRhcHRlckZhY3RvcnlJdGVtRGVsZWdhdG9yKGFkYXB0ZXJGYWN0b3J5KS5nZXRUZXh0KGNvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkpOworCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZCIsIHRleHQpKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWRlZmF1bHQ6IHsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTXVsdGlPYmplY3RTZWxlY3RlZCIsIEludGVnZXIudG9TdHJpbmcoY29sbGVjdGlvbi5zaXplKCkpKSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoIiIpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBsb29rcyB1cCBhIHN0cmluZyBpbiB0aGUgcGx1Z2luJ3MgcGx1Z2luLnByb3BlcnRpZXMgZmlsZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJcmV0dXJuIEdyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXkpOworCX0KKworCS8qKgorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gcGx1Z2luLnByb3BlcnRpZXMsIG1ha2luZyBhIHN1YnN0aXR1dGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgeworCQlyZXR1cm4gR3JhcGhnZW5lcmF0b3JFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSwgbmV3IE9iamVjdCBbXSB7IHMxIH0pOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXJ9IHRvIGhlbHAgZmlsbCB0aGUgY29udGV4dCBtZW51cyB3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgRWRpdCBtZW51LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJKChJTWVudUxpc3RlbmVyKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpKS5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7CisJCXJldHVybiAoRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgeworCQlyZXR1cm4gZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3Rpb25CYXJzKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKKworCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworCisJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKKworCQlpZiAoZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSB0aGlzKSB7CisJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihudWxsKTsKKwkJfQorCisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBvdXRsaW5lIHZpZXcgc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93T3V0bGluZVZpZXcoKSB7CisJCXJldHVybiB0cnVlOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9wcmVzZW50YXRpb24vR3JhcGhnZW5lcmF0b3JzTW9kZWxXaXphcmQuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2dyYXBoZ2VuZXJhdG9ycy9wcmVzZW50YXRpb24vR3JhcGhnZW5lcmF0b3JzTW9kZWxXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjk0ZjBkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vZ3JhcGhnZW5lcmF0b3JzL3ByZXNlbnRhdGlvbi9HcmFwaGdlbmVyYXRvcnNNb2RlbFdpemFyZC5qYXZhCkBAIC0wLDAgKzEsNjMzIEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMucHJlc2VudGF0aW9uOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTZXRTZWxlY3Rpb25UYXJnZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkdyYXBoZ2VuZXJhdG9yc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMucHJvdmlkZXIuR3JhcGhnZW5lcmF0b3JFZGl0UGx1Z2luOworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy5wcmVzZW50YXRpb24uR3JhcGhnZW5lcmF0b3JFZGl0b3JQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworCisKKy8qKgorICogVGhpcyBpcyBhIHNpbXBsZSB3aXphcmQgZm9yIGNyZWF0aW5nIGEgbmV3IG1vZGVsIGZpbGUuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBHcmFwaGdlbmVyYXRvcnNNb2RlbFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgeworCS8qKgorCSAqIFRoZSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyBmb3IgY3JlYXRlZCBmaWxlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBGSUxFX0VYVEVOU0lPTlMgPQorCQlDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoR3JhcGhnZW5lcmF0b3JFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR3JhcGhnZW5lcmF0b3JzRWRpdG9yRmlsZW5hbWVFeHRlbnNpb25zIikuc3BsaXQoIlxccyosXFxzKiIpKSk7CisKKwkvKioKKwkgKiBBIGZvcm1hdHRlZCBsaXN0IG9mIHN1cHBvcnRlZCBmaWxlIGV4dGVuc2lvbnMsIHN1aXRhYmxlIGZvciBkaXNwbGF5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFRF9GSUxFX0VYVEVOU0lPTlMgPQorCQlHcmFwaGdlbmVyYXRvckVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9HcmFwaGdlbmVyYXRvcnNFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbnMiKS5yZXBsYWNlQWxsKCJcXHMqLFxccyoiLCAiLCAiKTsKKworCS8qKgorCSAqIFRoaXMgY2FjaGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlIGdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UgPSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLmVJTlNUQU5DRTsKKworCS8qKgorCSAqIFRoaXMgY2FjaGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBHcmFwaGdlbmVyYXRvcnNGYWN0b3J5IGdyYXBoZ2VuZXJhdG9yc0ZhY3RvcnkgPSBncmFwaGdlbmVyYXRvcnNQYWNrYWdlLmdldEdyYXBoZ2VuZXJhdG9yc0ZhY3RvcnkoKTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGZpbGUgY3JlYXRpb24gcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgR3JhcGhnZW5lcmF0b3JzTW9kZWxXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIG5ld0ZpbGVDcmVhdGlvblBhZ2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBpbml0aWFsIG9iamVjdCBjcmVhdGlvbiBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBHcmFwaGdlbmVyYXRvcnNNb2RlbFdpemFyZEluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UgaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZTsKKworCS8qKgorCSAqIFJlbWVtYmVyIHRoZSBzZWxlY3Rpb24gZHVyaW5nIGluaXRpYWxpemF0aW9uIGZvciBwb3B1bGF0aW5nIHRoZSBkZWZhdWx0IGNvbnRhaW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOworCisJLyoqCisJICogUmVtZW1iZXIgdGhlIHdvcmtiZW5jaCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElXb3JrYmVuY2ggd29ya2JlbmNoOworCisJLyoqCisJICogQ2FjaGVzIHRoZSBuYW1lcyBvZiB0aGUgdHlwZXMgdGhhdCBjYW4gYmUgY3JlYXRlZCBhcyB0aGUgcm9vdCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBpbml0aWFsT2JqZWN0TmFtZXM7CisKKwkvKioKKwkgKiBUaGlzIGp1c3QgcmVjb3JkcyB0aGUgaW5mb3JtYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCXRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOworCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKwkJc2V0V2luZG93VGl0bGUoR3JhcGhnZW5lcmF0b3JFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV2l6YXJkX2xhYmVsIikpOworCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihFeHRlbmRlZEltYWdlUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEdyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL3dpemJhbi9OZXdHcmFwaGdlbmVyYXRvcnMiKSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSB0eXBlcyB0aGF0IGNhbiBiZSBjcmVhdGVkIGFzIHRoZSByb290IG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEluaXRpYWxPYmplY3ROYW1lcygpIHsKKwkJaWYgKGluaXRpYWxPYmplY3ROYW1lcyA9PSBudWxsKSB7CisJCQlpbml0aWFsT2JqZWN0TmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCWZvciAoRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgOiBncmFwaGdlbmVyYXRvcnNQYWNrYWdlLmdldEVDbGFzc2lmaWVycygpKSB7CisJCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7CisJCQkJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKWVDbGFzc2lmaWVyOworCQkJCQlpZiAoIWVDbGFzcy5pc0Fic3RyYWN0KCkpIHsKKwkJCQkJCWluaXRpYWxPYmplY3ROYW1lcy5hZGQoZUNsYXNzLmdldE5hbWUoKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlDb2xsZWN0aW9ucy5zb3J0KGluaXRpYWxPYmplY3ROYW1lcywgQ29tbW9uUGx1Z2luLklOU1RBTkNFLmdldENvbXBhcmF0b3IoKSk7CisJCX0KKwkJcmV0dXJuIGluaXRpYWxPYmplY3ROYW1lczsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEVPYmplY3QgY3JlYXRlSW5pdGlhbE1vZGVsKCkgeworCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcylncmFwaGdlbmVyYXRvcnNQYWNrYWdlLmdldEVDbGFzc2lmaWVyKGluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UuZ2V0SW5pdGlhbE9iamVjdE5hbWUoKSk7CisJCUVPYmplY3Qgcm9vdE9iamVjdCA9IGdyYXBoZ2VuZXJhdG9yc0ZhY3RvcnkuY3JlYXRlKGVDbGFzcyk7CisJCXJldHVybiByb290T2JqZWN0OworCX0KKworCS8qKgorCSAqIERvIHRoZSB3b3JrIGFmdGVyIGV2ZXJ5dGhpbmcgaXMgc3BlY2lmaWVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7CisJCXRyeSB7CisJCQkvLyBSZW1lbWJlciB0aGUgZmlsZS4KKwkJCS8vCisJCQlmaW5hbCBJRmlsZSBtb2RlbEZpbGUgPSBnZXRNb2RlbEZpbGUoKTsKKworCQkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbi4KKwkJCS8vCisJCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0KKwkJCQluZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworCQkJCQkJdHJ5IHsKKwkJCQkJCQkvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQKKwkJCQkJCQkvLworCQkJCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOworCisJCQkJCQkJLy8gR2V0IHRoZSBVUkkgb2YgdGhlIG1vZGVsIGZpbGUuCisJCQkJCQkJLy8KKwkJCQkJCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKG1vZGVsRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpOworCisJCQkJCQkJLy8gQ3JlYXRlIGEgcmVzb3VyY2UgZm9yIHRoaXMgZmlsZS4KKwkJCQkJCQkvLworCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoZmlsZVVSSSk7CisKKwkJCQkJCQkvLyBBZGQgdGhlIGluaXRpYWwgbW9kZWwgb2JqZWN0IHRvIHRoZSBjb250ZW50cy4KKwkJCQkJCQkvLworCQkJCQkJCUVPYmplY3Qgcm9vdE9iamVjdCA9IGNyZWF0ZUluaXRpYWxNb2RlbCgpOworCQkJCQkJCWlmIChyb290T2JqZWN0ICE9IG51bGwpIHsKKwkJCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQocm9vdE9iamVjdCk7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gU2F2ZSB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlIHRvIHRoZSBmaWxlIHN5c3RlbS4KKwkJCQkJCQkvLworCQkJCQkJCU1hcDxPYmplY3QsIE9iamVjdD4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOworCQkJCQkJCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5nZXRFbmNvZGluZygpKTsKKwkJCQkJCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOworCQkJCQkJfQorCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCQlHcmFwaGdlbmVyYXRvckVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQkJCX0KKwkJCQkJCWZpbmFsbHkgeworCQkJCQkJCXByb2dyZXNzTW9uaXRvci5kb25lKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9OworCisJCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIGZhbHNlLCBvcGVyYXRpb24pOworCisJCQkvLyBTZWxlY3QgdGhlIG5ldyBmaWxlIHJlc291cmNlIGluIHRoZSBjdXJyZW50IHZpZXcuCisJCQkvLworCQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7CisJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKKwkJCWZpbmFsIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBwYWdlLmdldEFjdGl2ZVBhcnQoKTsKKwkJCWlmIChhY3RpdmVQYXJ0IGluc3RhbmNlb2YgSVNldFNlbGVjdGlvblRhcmdldCkgeworCQkJCWZpbmFsIElTZWxlY3Rpb24gdGFyZ2V0U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obW9kZWxGaWxlKTsKKwkJCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJICgoSVNldFNlbGVjdGlvblRhcmdldClhY3RpdmVQYXJ0KS5zZWxlY3RSZXZlYWwodGFyZ2V0U2VsZWN0aW9uKTsKKwkJCQkJCSB9CisJCQkJCSB9KTsKKwkJCX0KKworCQkJLy8gT3BlbiBhbiBlZGl0b3Igb24gdGhlIG5ldyBmaWxlLgorCQkJLy8KKwkJCXRyeSB7CisJCQkJcGFnZS5vcGVuRWRpdG9yCisJCQkJCShuZXcgRmlsZUVkaXRvcklucHV0KG1vZGVsRmlsZSksCisJCQkJCSB3b3JrYmVuY2guZ2V0RWRpdG9yUmVnaXN0cnkoKS5nZXREZWZhdWx0RWRpdG9yKG1vZGVsRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLmdldElkKCkpOworCQkJfQorCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHdvcmtiZW5jaFdpbmRvdy5nZXRTaGVsbCgpLCBHcmFwaGdlbmVyYXRvckVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9PcGVuRWRpdG9yRXJyb3JfbGFiZWwiKSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJR3JhcGhnZW5lcmF0b3JFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBvbmUgcGFnZSBvZiB0aGUgd2l6YXJkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBjbGFzcyBHcmFwaGdlbmVyYXRvcnNNb2RlbFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsKKwkJLyoqCisJCSAqIFBhc3MgaW4gdGhlIHNlbGVjdGlvbi4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBHcmFwaGdlbmVyYXRvcnNNb2RlbFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UoU3RyaW5nIHBhZ2VJZCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCQlzdXBlcihwYWdlSWQsIHNlbGVjdGlvbik7CisJCX0KKworCQkvKioKKwkJICogVGhlIGZyYW1ld29yayBjYWxscyB0aGlzIHRvIHNlZSBpZiB0aGUgZmlsZSBpcyBjb3JyZWN0LgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKKwkJCWlmIChzdXBlci52YWxpZGF0ZVBhZ2UoKSkgeworCQkJCVN0cmluZyBleHRlbnNpb24gPSBuZXcgUGF0aChnZXRGaWxlTmFtZSgpKS5nZXRGaWxlRXh0ZW5zaW9uKCk7CisJCQkJaWYgKGV4dGVuc2lvbiA9PSBudWxsIHx8ICFGSUxFX0VYVEVOU0lPTlMuY29udGFpbnMoZXh0ZW5zaW9uKSkgeworCQkJCQlTdHJpbmcga2V5ID0gRklMRV9FWFRFTlNJT05TLnNpemUoKSA+IDEgPyAiX1dBUk5fRmlsZW5hbWVFeHRlbnNpb25zIiA6ICJfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbiI7CisJCQkJCXNldEVycm9yTWVzc2FnZShHcmFwaGdlbmVyYXRvckVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5LCBuZXcgT2JqZWN0IFtdIHsgRk9STUFUVEVEX0ZJTEVfRVhURU5TSU9OUyB9KSk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBJRmlsZSBnZXRNb2RlbEZpbGUoKSB7CisJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGdldENvbnRhaW5lckZ1bGxQYXRoKCkuYXBwZW5kKGdldEZpbGVOYW1lKCkpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHBhZ2Ugd2hlcmUgdGhlIHR5cGUgb2Ygb2JqZWN0IHRvIGNyZWF0ZSBpcyBzZWxlY3RlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgY2xhc3MgR3JhcGhnZW5lcmF0b3JzTW9kZWxXaXphcmRJbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7CisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIENvbWJvIGluaXRpYWxPYmplY3RGaWVsZDsKKworCQkvKioKKwkJICogQGdlbmVyYXRlZAorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICovCisJCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gZW5jb2RpbmdzOworCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIENvbWJvIGVuY29kaW5nRmllbGQ7CisKKwkJLyoqCisJCSAqIFBhc3MgaW4gdGhlIHNlbGVjdGlvbi4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBHcmFwaGdlbmVyYXRvcnNNb2RlbFdpemFyZEluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UoU3RyaW5nIHBhZ2VJZCkgeworCQkJc3VwZXIocGFnZUlkKTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsgeworCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7CisJCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEyOworCQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKworCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJfQorCisJCQlMYWJlbCBjb250YWluZXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKKwkJCXsKKwkJCQljb250YWluZXJMYWJlbC5zZXRUZXh0KEdyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX01vZGVsT2JqZWN0IikpOworCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJY29udGFpbmVyTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCX0KKworCQkJaW5pdGlhbE9iamVjdEZpZWxkID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJCQl7CisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJCQlpbml0aWFsT2JqZWN0RmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCX0KKworCQkJZm9yIChTdHJpbmcgb2JqZWN0TmFtZSA6IGdldEluaXRpYWxPYmplY3ROYW1lcygpKSB7CisJCQkJaW5pdGlhbE9iamVjdEZpZWxkLmFkZChnZXRMYWJlbChvYmplY3ROYW1lKSk7CisJCQl9CisKKwkJCWlmIChpbml0aWFsT2JqZWN0RmllbGQuZ2V0SXRlbUNvdW50KCkgPT0gMSkgeworCQkJCWluaXRpYWxPYmplY3RGaWVsZC5zZWxlY3QoMCk7CisJCQl9CisJCQlpbml0aWFsT2JqZWN0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodmFsaWRhdG9yKTsKKworCQkJTGFiZWwgZW5jb2RpbmdMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKKwkJCXsKKwkJCQllbmNvZGluZ0xhYmVsLnNldFRleHQoR3JhcGhnZW5lcmF0b3JFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfWE1MRW5jb2RpbmciKSk7CisKKwkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJCQllbmNvZGluZ0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCQl9CisJCQllbmNvZGluZ0ZpZWxkID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJCQl7CisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJCQllbmNvZGluZ0ZpZWxkLnNldExheW91dERhdGEoZGF0YSk7CisJCQl9CisKKwkJCWZvciAoU3RyaW5nIGVuY29kaW5nIDogZ2V0RW5jb2RpbmdzKCkpIHsKKwkJCQllbmNvZGluZ0ZpZWxkLmFkZChlbmNvZGluZyk7CisJCQl9CisKKwkJCWVuY29kaW5nRmllbGQuc2VsZWN0KDApOworCQkJZW5jb2RpbmdGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih2YWxpZGF0b3IpOworCisJCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOworCQkJc2V0Q29udHJvbChjb21wb3NpdGUpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgdmFsaWRhdG9yID0KKwkJCW5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKKwkJCQl9CisJCQl9OworCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgeworCQkJcmV0dXJuIGdldEluaXRpYWxPYmplY3ROYW1lKCkgIT0gbnVsbCAmJiBnZXRFbmNvZGluZ3MoKS5jb250YWlucyhlbmNvZGluZ0ZpZWxkLmdldFRleHQoKSk7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeworCQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKKwkJCWlmICh2aXNpYmxlKSB7CisJCQkJaWYgKGluaXRpYWxPYmplY3RGaWVsZC5nZXRJdGVtQ291bnQoKSA9PSAxKSB7CisJCQkJCWluaXRpYWxPYmplY3RGaWVsZC5jbGVhclNlbGVjdGlvbigpOworCQkJCQllbmNvZGluZ0ZpZWxkLnNldEZvY3VzKCk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQllbmNvZGluZ0ZpZWxkLmNsZWFyU2VsZWN0aW9uKCk7CisJCQkJCWluaXRpYWxPYmplY3RGaWVsZC5zZXRGb2N1cygpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRJbml0aWFsT2JqZWN0TmFtZSgpIHsKKwkJCVN0cmluZyBsYWJlbCA9IGluaXRpYWxPYmplY3RGaWVsZC5nZXRUZXh0KCk7CisKKwkJCWZvciAoU3RyaW5nIG5hbWUgOiBnZXRJbml0aWFsT2JqZWN0TmFtZXMoKSkgeworCQkJCWlmIChnZXRMYWJlbChuYW1lKS5lcXVhbHMobGFiZWwpKSB7CisJCQkJCXJldHVybiBuYW1lOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgeworCQkJcmV0dXJuIGVuY29kaW5nRmllbGQuZ2V0VGV4dCgpOworCQl9CisKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIGxhYmVsIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgbmFtZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoU3RyaW5nIHR5cGVOYW1lKSB7CisJCQl0cnkgeworCQkJCXJldHVybiBHcmFwaGdlbmVyYXRvckVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfIiArIHR5cGVOYW1lICsgIl90eXBlIik7CisJCQl9CisJCQljYXRjaChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7CisJCQkJR3JhcGhnZW5lcmF0b3JFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKG1yZSk7CisJCQl9CisJCQlyZXR1cm4gdHlwZU5hbWU7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0RW5jb2RpbmdzKCkgeworCQkJaWYgKGVuY29kaW5ncyA9PSBudWxsKSB7CisJCQkJZW5jb2RpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihHcmFwaGdlbmVyYXRvckVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9YTUxFbmNvZGluZ0Nob2ljZXMiKSk7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgeworCQkJCQllbmNvZGluZ3MuYWRkKHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKSk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGVuY29kaW5nczsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoZSBmcmFtZXdvcmsgY2FsbHMgdGhpcyB0byBjcmVhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSB3aXphcmQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgeworCQkvLyBDcmVhdGUgYSBwYWdlLCBzZXQgdGhlIHRpdGxlLCBhbmQgdGhlIGluaXRpYWwgbW9kZWwgZmlsZSBuYW1lLgorCQkvLworCQluZXdGaWxlQ3JlYXRpb25QYWdlID0gbmV3IEdyYXBoZ2VuZXJhdG9yc01vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSgiV2hhdGV2ZXIiLCBzZWxlY3Rpb24pOworCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldFRpdGxlKEdyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0dyYXBoZ2VuZXJhdG9yc01vZGVsV2l6YXJkX2xhYmVsIikpOworCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldERlc2NyaXB0aW9uKEdyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0dyYXBoZ2VuZXJhdG9yc01vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uIikpOworCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldEZpbGVOYW1lKEdyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0dyYXBoZ2VuZXJhdG9yc0VkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2UiKSArICIuIiArIEZJTEVfRVhURU5TSU9OUy5nZXQoMCkpOworCQlhZGRQYWdlKG5ld0ZpbGVDcmVhdGlvblBhZ2UpOworCisJCS8vIFRyeSBhbmQgZ2V0IHRoZSByZXNvdXJjZSBzZWxlY3Rpb24gdG8gZGV0ZXJtaW5lIGEgY3VycmVudCBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlIGRpYWxvZy4KKwkJLy8KKwkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7CisJCQkvLyBHZXQgdGhlIHJlc291cmNlLi4uCisJCQkvLworCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKTsKKwkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKKwkJCQkvLyBHZXQgdGhlIHJlc291cmNlIHBhcmVudCwgaWYgaXRzIGEgZmlsZS4KKwkJCQkvLworCQkJCUlSZXNvdXJjZSBzZWxlY3RlZFJlc291cmNlID0gKElSZXNvdXJjZSlzZWxlY3RlZEVsZW1lbnQ7CisJCQkJaWYgKHNlbGVjdGVkUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7CisJCQkJCXNlbGVjdGVkUmVzb3VyY2UgPSBzZWxlY3RlZFJlc291cmNlLmdldFBhcmVudCgpOworCQkJCX0KKworCQkJCS8vIFRoaXMgZ2l2ZXMgdXMgYSBkaXJlY3RvcnkuLi4KKwkJCQkvLworCQkJCWlmIChzZWxlY3RlZFJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlciB8fCBzZWxlY3RlZFJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKKwkJCQkJLy8gU2V0IHRoaXMgZm9yIHRoZSBjb250YWluZXIuCisJCQkJCS8vCisJCQkJCW5ld0ZpbGVDcmVhdGlvblBhZ2Uuc2V0Q29udGFpbmVyRnVsbFBhdGgoc2VsZWN0ZWRSZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKKworCQkJCQkvLyBNYWtlIHVwIGEgdW5pcXVlIG5ldyBuYW1lIGhlcmUuCisJCQkJCS8vCisJCQkJCVN0cmluZyBkZWZhdWx0TW9kZWxCYXNlRmlsZW5hbWUgPSBHcmFwaGdlbmVyYXRvckVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9HcmFwaGdlbmVyYXRvcnNFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlIik7CisJCQkJCVN0cmluZyBkZWZhdWx0TW9kZWxGaWxlbmFtZUV4dGVuc2lvbiA9IEZJTEVfRVhURU5TSU9OUy5nZXQoMCk7CisJCQkJCVN0cmluZyBtb2RlbEZpbGVuYW1lID0gZGVmYXVsdE1vZGVsQmFzZUZpbGVuYW1lICsgIi4iICsgZGVmYXVsdE1vZGVsRmlsZW5hbWVFeHRlbnNpb247CisJCQkJCWZvciAoaW50IGkgPSAxOyAoKElDb250YWluZXIpc2VsZWN0ZWRSZXNvdXJjZSkuZmluZE1lbWJlcihtb2RlbEZpbGVuYW1lKSAhPSBudWxsOyArK2kpIHsKKwkJCQkJCW1vZGVsRmlsZW5hbWUgPSBkZWZhdWx0TW9kZWxCYXNlRmlsZW5hbWUgKyBpICsgIi4iICsgZGVmYXVsdE1vZGVsRmlsZW5hbWVFeHRlbnNpb247CisJCQkJCX0KKwkJCQkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXRGaWxlTmFtZShtb2RlbEZpbGVuYW1lKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSA9IG5ldyBHcmFwaGdlbmVyYXRvcnNNb2RlbFdpemFyZEluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UoIldoYXRldmVyMiIpOworCQlpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlLnNldFRpdGxlKEdyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0dyYXBoZ2VuZXJhdG9yc01vZGVsV2l6YXJkX2xhYmVsIikpOworCQlpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlLnNldERlc2NyaXB0aW9uKEdyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbiIpKTsKKwkJYWRkUGFnZShpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlKTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGZpbGUgZnJvbSB0aGUgcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSUZpbGUgZ2V0TW9kZWxGaWxlKCkgeworCQlyZXR1cm4gbmV3RmlsZUNyZWF0aW9uUGFnZS5nZXRNb2RlbEZpbGUoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dyYXBoZ2VuZXJhdG9ycy9hZGFwdGVycy9ncmFwaGdlbmVyYXRvcnByb3BlcnR5ZWRpdG9yL0dyYXBoR2VuZXJhdG9yUHJvcGVydHlFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dyYXBoZ2VuZXJhdG9ycy9hZGFwdGVycy9ncmFwaGdlbmVyYXRvcnByb3BlcnR5ZWRpdG9yL0dyYXBoR2VuZXJhdG9yUHJvcGVydHlFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWM5Y2U2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ3JhcGhnZW5lcmF0b3JzL2FkYXB0ZXJzL2dyYXBoZ2VuZXJhdG9ycHJvcGVydHllZGl0b3IvR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvci5qYXZhCkBAIC0wLDAgKzEsNDAzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzLmFkYXB0ZXJzLmdyYXBoZ2VuZXJhdG9ycHJvcGVydHllZGl0b3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGF0dGljZS5pbXBsLkxhdHRpY2VHZW5lcmF0b3JVdGlsaXR5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaGdlbmVyYXRvcnNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkxhdHRpY2VHcmFwaEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5NaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuUGFqZWtOZXRHcmFwaEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5QbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzLndpemFyZHMuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworcHVibGljIGNsYXNzIEdyYXBoR2VuZXJhdG9yUHJvcGVydHlFZGl0b3IgZXh0ZW5kcyBvcmcuZWNsaXBzZS5zdGVtLnVpLmVkaXRvcnMuR2VuZXJpY1Byb3BlcnR5RWRpdG9yIHsKKworCXB1YmxpYyBHcmFwaEdlbmVyYXRvclByb3BlcnR5RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgSVByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcihwYXJlbnQsc3R5bGUsIHByb2plY3QpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSB0aGUgY29tcG9zaXRlCisJICogCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqIEBwYXJhbSBwcm9qZWN0VmFsaWRhdG9yCisJICovCisJcHVibGljIEdyYXBoR2VuZXJhdG9yUHJvcGVydHlFZGl0b3IoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgaW50IHN0eWxlLAorCQkJZmluYWwgR3JhcGhHZW5lcmF0b3IgZ3JhcGhHZW5lcmF0b3IsCisJCQlmaW5hbCBNb2RpZnlMaXN0ZW5lciBwcm9qZWN0VmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB7CisJCXN1cGVyKHBhcmVudCwgc3R5bGUsIChJZGVudGlmaWFibGUpZ3JhcGhHZW5lcmF0b3IsIHByb2plY3RWYWxpZGF0b3IsIHByb2plY3QpOworCX0gLy8gR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvcgorCisKKworCS8qKgorCSAqIEBwYXJhbSBncmFwaEdlbmVyYXRvcgorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBHcmFwaEdlbmVyYXRvcn0gaW5zdGFuY2UgdG8gcG9wdWxhdGUuCisJICovCisJcHVibGljIEdyYXBoIGdldEdyYXBoKGZpbmFsIEdyYXBoR2VuZXJhdG9yIGdyYXBoR2VuZXJhdG9yKSB7CisJCWZvciAoZmluYWwgTWFwLkVudHJ5PEVTdHJ1Y3R1cmFsRmVhdHVyZSwgVGV4dD4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgeworCQkJaWYoZW50cnkuZ2V0S2V5KCkuZ2V0RUNvbnRhaW5pbmdDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpID09IEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SIHx8CisJCQkJCWVudHJ5LmdldEtleSgpLmdldEVDb250YWluaW5nQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSA9PSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxBVFRJQ0VfR1JBUEhfR0VORVJBVE9SKSB7CisJCQkJc3dpdGNoIChlbnRyeS5nZXRLZXkoKS5nZXRGZWF0dXJlSUQoKSkgeworCQkJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19YU0laRToKKwkJCQkJCSgoU3F1YXJlTGF0dGljZUdyYXBoR2VuZXJhdG9yKWdyYXBoR2VuZXJhdG9yKS5zZXRYU2l6ZShJbnRlZ2VyLnBhcnNlSW50KGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpKSk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlNRVUFSRV9MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fWVNJWkU6CisJCQkJCQkoKFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcilncmFwaEdlbmVyYXRvcikuc2V0WVNpemUoSW50ZWdlci5wYXJzZUludChlbnRyeS5nZXRWYWx1ZSgpLmdldFRleHQoKSkpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5TUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX0FSRUE6CisJCQkJCQkoKFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcilncmFwaEdlbmVyYXRvcikuc2V0QXJlYShEb3VibGUucGFyc2VEb3VibGUoZW50cnkuZ2V0VmFsdWUoKS5nZXRUZXh0KCkpKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSBpZihlbnRyeS5nZXRLZXkoKS5nZXRFQ29udGFpbmluZ0NsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkgPT0gR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5QTEFURV9DQVJSRUVfR0xPQkVfR1JBUEhfR0VORVJBVE9SKSB7CisJCQkJc3dpdGNoIChlbnRyeS5nZXRLZXkoKS5nZXRGZWF0dXJlSUQoKSkgeworCQkJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuUExBVEVfQ0FSUkVFX0dMT0JFX0dSQVBIX0dFTkVSQVRPUl9fQU5HVUxBUl9TVEVQOgorCQkJCQkJKChQbGF0ZUNhcnJlZUdsb2JlR3JhcGhHZW5lcmF0b3IpZ3JhcGhHZW5lcmF0b3IpLnNldEFuZ3VsYXJTdGVwKEludGVnZXIucGFyc2VJbnQoZW50cnkuZ2V0VmFsdWUoKS5nZXRUZXh0KCkpKTsKKwkJCQkJCWJyZWFrOwkKKwkJCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlBMQVRFX0NBUlJFRV9HTE9CRV9HUkFQSF9HRU5FUkFUT1JfX1JBRElVUzoKKwkJCQkJCSgoUGxhdGVDYXJyZWVHbG9iZUdyYXBoR2VuZXJhdG9yKWdyYXBoR2VuZXJhdG9yKS5zZXRSYWRpdXMoRG91YmxlLnBhcnNlRG91YmxlKGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpKSk7CisJCQkJCQlicmVhazsJCisJCQkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5TUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX0FSRUE6CisJCQkJCQkoKFNxdWFyZUxhdHRpY2VHcmFwaEdlbmVyYXRvcilncmFwaEdlbmVyYXRvcikuc2V0QXJlYShEb3VibGUucGFyc2VEb3VibGUoZW50cnkuZ2V0VmFsdWUoKS5nZXRUZXh0KCkpKTsKKwkJCQkJCWJyZWFrOworCQkJCX0gLy8gc3dpdGNoCisJCQl9IGVsc2UgaWYoZW50cnkuZ2V0S2V5KCkuZ2V0RUNvbnRhaW5pbmdDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpID09IEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfR1JBUEhfR0VORVJBVE9SKSB7CisJCQkJc3dpdGNoIChlbnRyeS5nZXRLZXkoKS5nZXRGZWF0dXJlSUQoKSkgeworCQkJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTUlHUkFUSU9OX0VER0VfR1JBUEhfR0VORVJBVE9SX19MT0NBVElPTjoKKwkJCQkJCVN0cmluZyBsb2MgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldFRleHQoKTsKKwkJCQkJCWlmKGxvYyAhPSBudWxsICYmICFsb2MudHJpbSgpLmVxdWFscygiIikpCisJCQkJCQkJKChNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IpZ3JhcGhHZW5lcmF0b3IpLnNldExvY2F0aW9uKFNURU1VUkkuY3JlYXRlVVJJKGxvYykpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5NSUdSQVRJT05fRURHRV9HUkFQSF9HRU5FUkFUT1JfX01JR1JBVElPTl9SQVRFOgorCQkJCQkJCSgoTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yKWdyYXBoR2VuZXJhdG9yKS5zZXRNaWdyYXRpb25SYXRlKERvdWJsZS5wYXJzZURvdWJsZShlbnRyeS5nZXRWYWx1ZSgpLmdldFRleHQoKSkpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5NSUdSQVRJT05fRURHRV9HUkFQSF9HRU5FUkFUT1JfX1BPUFVMQVRJT046CisJCQkJCQlTdHJpbmcgcG9wID0gZW50cnkuZ2V0VmFsdWUoKS5nZXRUZXh0KCk7CisJCQkJCQlpZihwb3AgIT0gbnVsbCAmJiAhcG9wLnRyaW0oKS5lcXVhbHMoIiIpKQorCQkJCQkJCSgoTWlncmF0aW9uRWRnZUdyYXBoR2VuZXJhdG9yKWdyYXBoR2VuZXJhdG9yKS5zZXRQb3B1bGF0aW9uKHBvcCk7CisJCQkJCQlicmVhazsKKwkJCQkJCQorCQkJCX0gLy8gc3dpdGNoCisJCQl9IGVsc2UgaWYoZW50cnkuZ2V0S2V5KCkuZ2V0RUNvbnRhaW5pbmdDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpID09IEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuUEFKRUtfTkVUX0dSQVBIX0dFTkVSQVRPUikgeworCQkJCXN3aXRjaCAoZW50cnkuZ2V0S2V5KCkuZ2V0RmVhdHVyZUlEKCkpIHsKKwkJCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLlBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX0RBVEFfRklMRV9ORVQ6CisJCQkJCQlTdHJpbmcgZmlsZW5hbWUgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldFRleHQoKTsKKwkJCQkJCWlmIChmaWxlbmFtZSAhPSBudWxsICYmIGZpbGVuYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKKwkJCQkJCQkoKFBhamVrTmV0R3JhcGhHZW5lcmF0b3IpZ3JhcGhHZW5lcmF0b3IpLnNldERhdGFGaWxlX25ldChmaWxlbmFtZSk7CisJCQkJCQl9CisJCQkJCQlicmVhazsJCQkJCQorCQkJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuUEFKRUtfTkVUX0dSQVBIX0dFTkVSQVRPUl9fQVJFQToKKwkJCQkJCSgoUGFqZWtOZXRHcmFwaEdlbmVyYXRvcilncmFwaEdlbmVyYXRvcikuc2V0QXJlYShEb3VibGUucGFyc2VEb3VibGUoZW50cnkuZ2V0VmFsdWUoKS5nZXRUZXh0KCkpKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuUEFKRUtfTkVUX0dSQVBIX0dFTkVSQVRPUl9fWk9PTV9GQUNUT1I6CisJCQkJCQkoKFBhamVrTmV0R3JhcGhHZW5lcmF0b3IpZ3JhcGhHZW5lcmF0b3IpLnNldFpvb21GYWN0b3IoSW50ZWdlci5wYXJzZUludChlbnRyeS5nZXRWYWx1ZSgpLmdldFRleHQoKSkpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5QQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SX19DT0xfQVJFQToKKwkJCQkJCVN0cmluZyBudW1iZXIgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldFRleHQoKTsKKwkJCQkJCWlmIChudW1iZXIgIT0gbnVsbCAmJiBudW1iZXIudHJpbSgpLmxlbmd0aCgpID4gMCkgeworCQkJCQkJCWludCBjb2wgPSAwOworCQkJCQkJCXRyeSB7Y29sID0gSW50ZWdlci5wYXJzZUludChudW1iZXIpO30KKwkJCQkJCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHt9CisJCQkJCQkJKChQYWpla05ldEdyYXBoR2VuZXJhdG9yKWdyYXBoR2VuZXJhdG9yKS5zZXRDb2xBcmVhKGNvbCk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQl9IC8vIHN3aXRjaAorCQkJfQorCQl9CisKKwkJZm9yIChmaW5hbCBNYXAuRW50cnk8RVN0cnVjdHVyYWxGZWF0dXJlLCBCb29sZWFuPiBlbnRyeSA6IGJvb2xlYW5NYXAuZW50cnlTZXQoKSkgeworCisJCQlzd2l0Y2ggKGVudHJ5LmdldEtleSgpLmdldEZlYXR1cmVJRCgpKSB7CisJCQljYXNlIEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX1VTRV9ORUFSRVNUX05FSUdIQk9SUzoKKwkJCQkoKExhdHRpY2VHcmFwaEdlbmVyYXRvcilncmFwaEdlbmVyYXRvcikuc2V0VXNlTmVhcmVzdE5laWdoYm9ycyhlbnRyeS5nZXRWYWx1ZSgpLmJvb2xlYW5WYWx1ZSgpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fVVNFX05FWFRfTkVBUkVTVF9ORUlHSEJPUlM6CisJCQkJKChMYXR0aWNlR3JhcGhHZW5lcmF0b3IpZ3JhcGhHZW5lcmF0b3IpLnNldFVzZU5leHROZWFyZXN0TmVpZ2hib3JzKGVudHJ5LmdldFZhbHVlKCkuYm9vbGVhblZhbHVlKCkpOworCQkJCWJyZWFrOworCQkJY2FzZSBHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19QRVJJT0RJQ19CT1VOREFSSUVTOgorCQkJCSgoTGF0dGljZUdyYXBoR2VuZXJhdG9yKWdyYXBoR2VuZXJhdG9yKS5zZXRQZXJpb2RpY0JvdW5kYXJpZXMoZW50cnkuZ2V0VmFsdWUoKS5ib29sZWFuVmFsdWUoKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKyAKKwkgaWYoZ3JhcGhHZW5lcmF0b3IuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkgPT0gR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5NSUdSQVRJT05fRURHRV9HUkFQSF9HRU5FUkFUT1IpIAorCQkgKChNaWdyYXRpb25FZGdlR3JhcGhHZW5lcmF0b3IpZ3JhcGhHZW5lcmF0b3IpLnNldFByb2plY3QocHJvamVjdCk7CisJCS8vIERvIGl0IQorCQlyZXR1cm4gZ3JhcGhHZW5lcmF0b3IuZ2V0R3JhcGgoKTsKKwl9IC8vIHBvcHVsYXRlCisKKwkvKioKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50cyBhcmUgdmFsaWQsIDxjb2RlPmZhbHNlPC9jb2RlPgorCSAqICAgICAgICAgb3RoZXJ3aXNlLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgeworCQlib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKKwkJaWYgKHJldFZhbHVlKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIFRleHQgdGV4dCA9IG1hcAorCQkJCQkuZ2V0KEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTGl0ZXJhbHMuU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19YU0laRSk7CisJCQlpZiAodGV4dCAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJcmV0VmFsdWUgPSAhdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCS8vIG5vdGhpbmc/CisJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQkvLyBZZXMKKwkJCQkJZXJyb3JNZXNzYWdlID0gTWVzc2FnZXMKKwkJCQkJCQkuZ2V0U3RyaW5nKCJOR0dXaXpFcnIxIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9IC8vIGlmCisJCQkJZWxzZSB7CisJCQkJCS8vIE5vCisJCQkJCS8vIElzIGl0IGEgdmFsaWQgdmFsdWU/CisJCQkJCXJldFZhbHVlID0gaXNWYWxpZEludFZhbHVlKHRleHQuZ2V0VGV4dCgpLCAxKTsKKwkJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQkJLy8gTm8KKwkJCQkJCWVycm9yTWVzc2FnZSA9IE1lc3NhZ2VzCisJCQkJCQkJCS5nZXRTdHJpbmcoIk5HR1dpekVycjIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9IC8vIGlmCisJCQkJfQorCQkJfSAvLyBpZiB0ZXh0ICE9IG51bGwKKwkJfSAvLyBpZiBUcmFuc21pc3Npb24gUmF0ZQorCisJCWlmIChyZXRWYWx1ZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBUZXh0IHRleHQgPSBtYXAKKwkJCQkJLmdldChHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxpdGVyYWxzLlNRVUFSRV9MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fWVNJWkUpOworCQkJaWYgKHRleHQgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCXJldFZhbHVlID0gIXRleHQuZ2V0VGV4dCgpLmVxdWFscygiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkvLyBub3RoaW5nPworCQkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWVycm9yTWVzc2FnZSA9IE1lc3NhZ2VzCisJCQkJCQkJLmdldFN0cmluZygiTkdHV2l6RXJyMyIpOyAvLyROT04tTkxTLTEkCisJCQkJfSAvLyBpZgorCQkJCWVsc2UgeworCQkJCQkvLyBObworCQkJCQkvLyBJcyBpdCBhIHZhbGlkIHZhbHVlPworCQkJCQlyZXRWYWx1ZSA9IGlzVmFsaWRJbnRWYWx1ZSh0ZXh0LmdldFRleHQoKSwgMSk7CisJCQkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkJCS8vIE5vCisJCQkJCQllcnJvck1lc3NhZ2UgPSBNZXNzYWdlcworCQkJCQkJCQkuZ2V0U3RyaW5nKCJOR0dXaXpFcnI0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfSAvLyBpZgorCQkJCX0KKwkJCX0gLy8gaWYgdGV4dCAhPSBudWxsCisJCX0gLy8gCisJCQorCQlpZiAocmV0VmFsdWUpIHsKKwkJCS8vIFllcworCQkJZmluYWwgVGV4dCB0ZXh0ID0gbWFwCisJCQkJCS5nZXQoR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MaXRlcmFscy5TUVVBUkVfTEFUVElDRV9HUkFQSF9HRU5FUkFUT1JfX0FSRUEpOworCQkJaWYgKHRleHQgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCXJldFZhbHVlID0gIXRleHQuZ2V0VGV4dCgpLmVxdWFscygiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkvLyBub3RoaW5nPworCQkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWVycm9yTWVzc2FnZSA9IE1lc3NhZ2VzCisJCQkJCQkJLmdldFN0cmluZygiTkdHV2l6RXJyOCIpOyAvLyROT04tTkxTLTEkCisJCQkJfSAvLyBpZgorCQkJCWVsc2UgeworCQkJCQkvLyBObworCQkJCQkvLyBJcyBpdCBhIHZhbGlkIHZhbHVlPworCQkJCQlyZXRWYWx1ZSA9IGlzVmFsaWRWYWx1ZSh0ZXh0LmdldFRleHQoKSwgMCk7CisJCQkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkJCS8vIE5vCisJCQkJCQllcnJvck1lc3NhZ2UgPSBNZXNzYWdlcworCQkJCQkJCQkuZ2V0U3RyaW5nKCJOR0dXaXpFcnI5Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfSAvLyBpZgorCQkJCX0KKwkJCX0gLy8gaWYgdGV4dCAhPSBudWxsCisJCX0gLy8gaWYgTm9uLUxpbmVhcml0eSBDb2VmZmljaWVudAorCisKKwkJaWYgKHJldFZhbHVlKSB7CisJCQkvLyBZZXMKKwkJCVRleHQgdGV4dCA9IG1hcAorCQkJCQkuZ2V0KEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTGl0ZXJhbHMuU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19YU0laRSk7CisJCQlpZih0ZXh0ICE9IG51bGwpIHsKKwkJCQlpbnQgeHNpemUgPSBJbnRlZ2VyLnBhcnNlSW50KHRleHQuZ2V0VGV4dCgpKTsKKwkJCQl0ZXh0ID0gbWFwLmdldChHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxpdGVyYWxzLlNRVUFSRV9MQVRUSUNFX0dSQVBIX0dFTkVSQVRPUl9fWVNJWkUpOworCQkJCWludCB5c2l6ZSA9IEludGVnZXIucGFyc2VJbnQodGV4dC5nZXRUZXh0KCkpOworCQkJCXRleHQgPSBtYXAuZ2V0KEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTGl0ZXJhbHMuU1FVQVJFX0xBVFRJQ0VfR1JBUEhfR0VORVJBVE9SX19BUkVBKTsKKwkJCQlkb3VibGUgYXJlYSA9IERvdWJsZS5wYXJzZURvdWJsZSh0ZXh0LmdldFRleHQoKSk7CisJCQkJCisJCQkJZG91YmxlIHNjYWxlID0gTWF0aC5zcXJ0KGFyZWEpOworCQkJCWlmKHhzaXplICogc2NhbGUgLyBMYXR0aWNlR2VuZXJhdG9yVXRpbGl0eUltcGwuS01fUEVSX0RFR19MT04gPiAzNjAuMCB8fAorCQkJCQl5c2l6ZSAqIHNjYWxlIC8gTGF0dGljZUdlbmVyYXRvclV0aWxpdHlJbXBsLktNX1BFUl9ERUdfTEFUID4gMTgwLjApIHsKKwkJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQkJLy8gWWVzCisJCQkJCWVycm9yTWVzc2FnZSA9IE1lc3NhZ2VzCisJCQkJCQkuZ2V0U3RyaW5nKCJOR0dXaXpFcnIxMCIpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfQorCQl9CisJCWlmKHJldFZhbHVlKSB7CisJCQlmaW5hbCBUZXh0IHRleHQgPSBtYXAuZ2V0KEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTGl0ZXJhbHMuTUlHUkFUSU9OX0VER0VfR1JBUEhfR0VORVJBVE9SX19QT1BVTEFUSU9OKTsKKwkJCWlmICh0ZXh0ICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQlyZXRWYWx1ZSA9ICF0ZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpOyAvLyROT04tTkxTLTEkCisJCQkJLy8gbm90aGluZz8KKwkJCQlpZiAoIXJldFZhbHVlKSB7CisJCQkJCS8vIFllcworCQkJCQllcnJvck1lc3NhZ2UgPSBNZXNzYWdlcworCQkJCQkJLmdldFN0cmluZygiTkdHV2l6RXJyNSIpOyAvLyROT04tTkxTLTEkCisJCQkJfSAvLyBpZgorCQkJfQorCQl9CisJCQorCQkKKwkJaWYocmV0VmFsdWUpIHsKKwkJCWZpbmFsIFRleHQgdGV4dCA9IG1hcC5nZXQoR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MaXRlcmFscy5QTEFURV9DQVJSRUVfR0xPQkVfR1JBUEhfR0VORVJBVE9SX19BTkdVTEFSX1NURVApOworCQkJLy8gSXMgaXQgYSB2YWxpZCB2YWx1ZT8KKwkJCWlmKHRleHQhPW51bGwpIHsKKwkJCQlyZXRWYWx1ZSA9IGlzVmFsaWRJbnRWYWx1ZSh0ZXh0LmdldFRleHQoKSwgMSk7CisJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQkvLyBObworCQkJCQllcnJvck1lc3NhZ2UgPSBNZXNzYWdlcworCQkJCQkJCS5nZXRTdHJpbmcoIk5HR1dpekVycjExIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9IC8vIGlmCisJCQl9CisJCX0KKwkJaWYocmV0VmFsdWUpIHsKKwkJCWZpbmFsIFRleHQgdGV4dCA9IG1hcC5nZXQoR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MaXRlcmFscy5QTEFURV9DQVJSRUVfR0xPQkVfR1JBUEhfR0VORVJBVE9SX19SQURJVVMpOworCQkJLy8gSXMgaXQgYSB2YWxpZCB2YWx1ZT8KKwkJCWlmKHRleHQhPW51bGwpIHsKKwkJCQlyZXRWYWx1ZSA9IGlzVmFsaWREb3VibGVWYWx1ZSh0ZXh0LmdldFRleHQoKSwgMSk7CisJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQkvLyBObworCQkJCQllcnJvck1lc3NhZ2UgPSBNZXNzYWdlcworCQkJCQkJCS5nZXRTdHJpbmcoIk5HR1dpekVycjEyIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9IC8vIGlmCisJCQl9CisJCX0KKwkJCisJCWlmKHJldFZhbHVlKSB7CisJCQlmaW5hbCBUZXh0IHRleHQgPSBtYXAuZ2V0KEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTGl0ZXJhbHMuTUlHUkFUSU9OX0VER0VfR1JBUEhfR0VORVJBVE9SX19QT1BVTEFUSU9OKTsKKwkJCWlmICh0ZXh0ICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQlyZXRWYWx1ZSA9ICF0ZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpOyAvLyROT04tTkxTLTEkCisJCQkJLy8gbm90aGluZz8KKwkJCQlpZiAoIXJldFZhbHVlKSB7CisJCQkJCS8vIFllcworCQkJCQllcnJvck1lc3NhZ2UgPSBNZXNzYWdlcworCQkJCQkJLmdldFN0cmluZygiTkdHV2l6RXJyNSIpOyAvLyROT04tTkxTLTEkCisJCQkJfSAvLyBpZgorCQkJfQorCQl9CisJCWlmKHJldFZhbHVlKSB7CisJCQlmaW5hbCBUZXh0IHRleHQgPSBtYXAuZ2V0KEdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuTGl0ZXJhbHMuTUlHUkFUSU9OX0VER0VfR1JBUEhfR0VORVJBVE9SX19NSUdSQVRJT05fUkFURSk7CisJCQlpZiAodGV4dCAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJdHJ5IHsKKwkJCQkJZG91YmxlIHJhdGUgPSBEb3VibGUucGFyc2VEb3VibGUodGV4dC5nZXRUZXh0KCkpOworCQkJCQlpZihyYXRlIDwgMC4wKSB7CisJCQkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCQkJZXJyb3JNZXNzYWdlID0gTWVzc2FnZXMKKwkJCQkJCS5nZXRTdHJpbmcoIk5HR1dpekVycjciKTsKKwkJCQkJfQorCQkJCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKwkJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQkJZXJyb3JNZXNzYWdlID0gTWVzc2FnZXMKKwkJCQkJLmdldFN0cmluZygiTkdHV2l6RXJyNiIpOworCQkJCX0KKwkJCQlyZXRWYWx1ZSA9ICF0ZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpOyAvLyROT04tTkxTLTEkCisJCQkJLy8gbm90aGluZz8KKwkJCQlpZiAoIXJldFZhbHVlKSB7CisJCQkJCS8vIFllcworCQkJCQllcnJvck1lc3NhZ2UgPSBNZXNzYWdlcworCQkJCQkJLmdldFN0cmluZygiTkdHV2l6RXJyNSIpOyAvLyROT04tTkxTLTEkCisJCQkJfSAvLyBpZgorCQkJfQorCQl9CisJCWlmIChyZXRWYWx1ZSkgeworCQkJZmluYWwgVGV4dCB0ZXh0ID0gbWFwLmdldChHcmFwaGdlbmVyYXRvcnNQYWNrYWdlLkxpdGVyYWxzLlBBSkVLX05FVF9HUkFQSF9HRU5FUkFUT1JfX0RBVEFfRklMRV9ORVQpOworCQkJaWYgKHRleHQgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHRleHQuZ2V0VGV4dCgpKTsKKwkJICAgICAgICByZXRWYWx1ZSA9IGZpbGUgIT0gbnVsbCAmJiAhZmlsZS5pc0RpcmVjdG9yeSgpICYmIGZpbGUuZXhpc3RzKCk7CQorCQkgICAgICAgIGlmICghcmV0VmFsdWUpIGVycm9yTWVzc2FnZSA9IE1lc3NhZ2VzLmdldFN0cmluZygiTkdHV2l6RXJyMTMiKTsKKwkJCX0KKwkJfQorCQlpZiAocmV0VmFsdWUpIHsKKwkJCWZpbmFsIFRleHQgdGV4dCA9IG1hcC5nZXQoR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5MaXRlcmFscy5QQUpFS19ORVRfR1JBUEhfR0VORVJBVE9SX19BUkVBKTsKKwkJCWlmICh0ZXh0ICE9IG51bGwpIHsKKwkJCQlyZXRWYWx1ZSA9IHRleHQuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMDsgLy8kTk9OLU5MUy0xJAorCQkJCS8vIG5vdGhpbmc/CisJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQllcnJvck1lc3NhZ2UgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIk5HR1dpekVycjE0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9IC8vIGlmCisJCQkJZWxzZSB7CisJCQkJCXRyeSB7CisJCQkJCQlkb3VibGUgcmF0ZSA9IERvdWJsZS5wYXJzZURvdWJsZSh0ZXh0LmdldFRleHQoKSk7CisJCQkJCQlpZihyYXRlIDwgMC4wKSB7CisJCQkJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQkJCQllcnJvck1lc3NhZ2UgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIk5HR1dpekVycjkiKTsKKwkJCQkJCX0KKwkJCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgeworCQkJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQkJCWVycm9yTWVzc2FnZSA9IE1lc3NhZ2VzLmdldFN0cmluZygiTkdHV2l6RXJyOSIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHZhbGlkYXRlCisKKworCS8qKgorCSAqIEBwYXJhbSBmZWF0dXJlCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmVhdHVyZSBpcyBhIGR1YmxpbiBjb3JlIGZlYXR1cmUgdGhhdAorCSAqICAgICAgICAgaXMgc3BlY2lmaWVkIGJ5IGEgdXNlci4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1VzZXJTcGVjaWZpZWRQcm9wZXJ0eShmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisJCWZpbmFsIEVDbGFzcyBjb250YWluaW5nQ2xhc3MgPSBmZWF0dXJlLmdldEVDb250YWluaW5nQ2xhc3MoKTsKKwkJaWYgKGNvbnRhaW5pbmdDbGFzcy5lcXVhbHMoR3JhcGhnZW5lcmF0b3JzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3JhcGhHZW5lcmF0b3IoKSkKKwkJCQl8fCBjb250YWluaW5nQ2xhc3MuZ2V0RUFsbFN1cGVyVHlwZXMoKS5jb250YWlucygKKwkJCQkJCUdyYXBoZ2VuZXJhdG9yc1BhY2thZ2UuZUlOU1RBTkNFLmdldEdyYXBoR2VuZXJhdG9yKCkpKSB7CisJCQkvLyBZZXMKKwkJCXJldFZhbHVlID0gdHJ1ZTsKKwkJfSAvLyAKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gaXNVc2VyU3BlY2lmaWVkR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjaGVja1N1YmNsYXNzKCkgeworCQkvLyBEaXNhYmxlIHRoZSBjaGVjayB0aGF0IHByZXZlbnRzIHN1Yi1jbGFzc2luZyBvZiBTV1QgY29tcG9uZW50cworCX0KKworfSAvLyBHcmFwaEdlbmVyYXRvclByb3BlcnR5RWRpdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9ncmFwaGdlbmVyYXRvcnMvYWRhcHRlcnMvZ3JhcGhnZW5lcmF0b3Jwcm9wZXJ0eWVkaXRvci9HcmFwaEdlbmVyYXRvclByb3BlcnR5RWRpdG9yQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ3JhcGhnZW5lcmF0b3JzL2FkYXB0ZXJzL2dyYXBoZ2VuZXJhdG9ycHJvcGVydHllZGl0b3IvR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQzMzE2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ3JhcGhnZW5lcmF0b3JzL2FkYXB0ZXJzL2dyYXBoZ2VuZXJhdG9ycHJvcGVydHllZGl0b3IvR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzLmFkYXB0ZXJzLmdyYXBoZ2VuZXJhdG9ycHJvcGVydHllZGl0b3I7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuR3JhcGhHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMud2l6YXJkcy5HcmFwaEdlbmVyYXRvclByb3BlcnR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CisKK3B1YmxpYyBjbGFzcyBHcmFwaEdlbmVyYXRvclByb3BlcnR5RWRpdG9yQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsCisJCWltcGxlbWVudHMgQWRhcHRlciB7CisKKwlwdWJsaWMgR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvciBjcmVhdGVHcmFwaEdlbmVyYXRvclByb3BlcnR5RWRpdG9yKAorCQkJZmluYWwgR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUNvbXBvc2l0ZSBncmFwaEdlbmVyYXRvclByb3BlcnR5Q29tcG9zaXRlLAorCQkJZmluYWwgaW50IHN0eWxlLCBmaW5hbCBNb2RpZnlMaXN0ZW5lciBwcm9qZWN0VmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB7CisJCXJldHVybiBuZXcgR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvcigKKwkJCQlncmFwaEdlbmVyYXRvclByb3BlcnR5Q29tcG9zaXRlLCBzdHlsZSwKKwkJCQkoR3JhcGhHZW5lcmF0b3IpIGdldFRhcmdldCgpLCBwcm9qZWN0VmFsaWRhdG9yLCBwcm9qZWN0KTsKKwl9IC8vIGNyZWF0ZUdyYXBoR2VuZXJhdG9yUHJvcGVydHlFZGl0b3IKKwkKK30gLy8gR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvckFkYXB0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dyYXBoZ2VuZXJhdG9ycy9hZGFwdGVycy9ncmFwaGdlbmVyYXRvcnByb3BlcnR5ZWRpdG9yL0dyYXBoR2VuZXJhdG9yUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ3JhcGhnZW5lcmF0b3JzL2FkYXB0ZXJzL2dyYXBoZ2VuZXJhdG9ycHJvcGVydHllZGl0b3IvR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1MDJiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dyYXBoZ2VuZXJhdG9ycy9hZGFwdGVycy9ncmFwaGdlbmVyYXRvcnByb3BlcnR5ZWRpdG9yL0dyYXBoR2VuZXJhdG9yUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMuYWRhcHRlcnMuZ3JhcGhnZW5lcmF0b3Jwcm9wZXJ0eWVkaXRvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy51dGlsLkdyYXBoZ2VuZXJhdG9yc0FkYXB0ZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKKwkJR3JhcGhnZW5lcmF0b3JzQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cworCQlJR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5IHsKKworCXB1YmxpYyBHcmFwaEdlbmVyYXRvclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJCUdyYXBoR2VuZXJhdG9yUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCS5hZGRBZGFwdGVyRmFjdG9yeSh0aGlzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaEdlbmVyYXRvckFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvckFkYXB0ZXIoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCXJldHVybiB0eXBlID09IEdyYXBoR2VuZXJhdG9yUHJvcGVydHlFZGl0b3JBZGFwdGVyLmNsYXNzCisJCQkJfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9CisKK30gLy8gU3RhbmRhcmRHcmFwaEdlbmVyYXRvclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dyYXBoZ2VuZXJhdG9ycy9hZGFwdGVycy9ncmFwaGdlbmVyYXRvcnByb3BlcnR5ZWRpdG9yL0lHcmFwaEdlbmVyYXRvclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dyYXBoZ2VuZXJhdG9ycy9hZGFwdGVycy9ncmFwaGdlbmVyYXRvcnByb3BlcnR5ZWRpdG9yL0lHcmFwaEdlbmVyYXRvclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzBkZmFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ3JhcGhnZW5lcmF0b3JzL2FkYXB0ZXJzL2dyYXBoZ2VuZXJhdG9ycHJvcGVydHllZGl0b3IvSUdyYXBoR2VuZXJhdG9yUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8vIERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy5hZGFwdGVycy5ncmFwaGdlbmVyYXRvcnByb3BlcnR5ZWRpdG9yOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMKKyAqLworcHVibGljIGludGVyZmFjZSBJR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5IHsKKworCUdyYXBoR2VuZXJhdG9yUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeUltcGwgSU5TVEFOQ0UgPSBuZXcgR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5SW1wbCgpOworCisJcHVibGljIGNsYXNzIEdyYXBoR2VuZXJhdG9yUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeUltcGwgZXh0ZW5kcworCQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzCisJCQlJR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5IHsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQkJcmV0dXJuIHR5cGUgPT0gR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuY2xhc3M7CisJCX0KKworCX0gLy8gR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5SW1wbAorfSAvLyBJR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9ncmFwaGdlbmVyYXRvcnMvcHJlc2VudGF0aW9uL0dyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9ncmFwaGdlbmVyYXRvcnMvcHJlc2VudGF0aW9uL0dyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0ZDI2YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dyYXBoZ2VuZXJhdG9ycy9wcmVzZW50YXRpb24vR3JhcGhnZW5lcmF0b3JFZGl0b3JQbHVnaW4uamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzLnByZXNlbnRhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5FY2xpcHNlVUlQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlRWRpdFBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47CisKKy8qKgorICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBHcmFwaGdlbmVyYXRvciBlZGl0b3IgcGx1Z2luLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgR3JhcGhnZW5lcmF0b3JFZGl0b3JQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4geworCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEdyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luIElOU1RBTkNFID0gbmV3IEdyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luKCk7CisJCisJLyoqCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEdyYXBoZ2VuZXJhdG9yRWRpdG9yUGx1Z2luKCkgeworCQlzdXBlcgorCQkJKG5ldyBSZXNvdXJjZUxvY2F0b3IgW10geworCQkJCUNvcmVFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkJCUVjb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwKKwkJCX0pOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisJCisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4geworCQkvKioKKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQgIE5PVAorCQkgKi8KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgeworCQkJc3VwZXIoKTsKKwkKKwkJCS8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuCisJCQkvLworCQkJcGx1Z2luID0gdGhpczsKKwkJCQorCQkJLy8gUmVnaXN0ZXIKKwkJCW5ldyBvcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy53aXphcmRzLkdyYXBoR2VuZXJhdG9yUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7CisJCQluZXcgb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMuYWRhcHRlcnMuZ3JhcGhnZW5lcmF0b3Jwcm9wZXJ0eWVkaXRvci5HcmFwaEdlbmVyYXRvclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkoKTsKKworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9ncmFwaGdlbmVyYXRvcnMvd2l6YXJkcy9HcmFwaEdlbmVyYXRvckRlZmluaXRpb25Db250cm9sLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9ncmFwaGdlbmVyYXRvcnMvd2l6YXJkcy9HcmFwaEdlbmVyYXRvckRlZmluaXRpb25Db250cm9sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI3ZGEyNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dyYXBoZ2VuZXJhdG9ycy93aXphcmRzL0dyYXBoR2VuZXJhdG9yRGVmaW5pdGlvbkNvbnRyb2wuamF2YQpAQCAtMCwwICsxLDE5NiBAQAorLy8gRGlzZWFzZURlZmluaXRpb25Db250cm9sLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMud2l6YXJkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBTV1QgY29udHJvbCBmb3IgZGVmaW5pbmcgYSBkaXNlYXNlLgorICovCitwdWJsaWMgY2xhc3MgR3JhcGhHZW5lcmF0b3JEZWZpbml0aW9uQ29udHJvbCBleHRlbmRzIENvbXBvc2l0ZSB7CisKKwlwcml2YXRlIHN0YXRpYyBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaEdlbmVyYXRvcltdIGdyYXBoR2VuZXJhdG9ycyA9IG51bGw7CisKKwlwcml2YXRlIGZpbmFsIENvbWJvIGNvbWJvOworCisJcHJpdmF0ZSBmaW5hbCBHcmFwaEdlbmVyYXRvclByb3BlcnR5Q29tcG9zaXRlIGdyYXBoR2VuZXJhdG9yUHJvcGVydHlDb21wb3NpdGU7CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGNvbXBvc2l0ZQorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gc3R5bGUKKwkgKiBAcGFyYW0gcHJvamVjdFZhbGlkYXRvcgorCSAqLworCXB1YmxpYyBHcmFwaEdlbmVyYXRvckRlZmluaXRpb25Db250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIGludCBzdHlsZSwKKwkJCU1vZGlmeUxpc3RlbmVyIHByb2plY3RWYWxpZGF0b3IsIElQcm9qZWN0IHByb2plY3QpIHsKKwkJc3VwZXIocGFyZW50LCBzdHlsZSk7CisJCWZpbmFsIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQlzZXRMYXlvdXQoZ3JpZExheW91dCk7CisKKwkJZmluYWwgTGFiZWwgZ3JhcGhHZW5lcmF0b3JMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7CisJCWZpbmFsIEdyaWREYXRhIGdkX2dyYXBoR2VuZXJhdG9yTGFiZWwgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKKwkJZ2RfZ3JhcGhHZW5lcmF0b3JMYWJlbC53aWR0aEhpbnQgPSAxMDA7CisJCWdyYXBoR2VuZXJhdG9yTGFiZWwuc2V0TGF5b3V0RGF0YShnZF9ncmFwaEdlbmVyYXRvckxhYmVsKTsKKwkJZ3JhcGhHZW5lcmF0b3JMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiR0dEQy4wIikpOyAvLyROT04tTkxTLTEkCisKKwkJY29tYm8gPSBuZXcgQ29tYm8odGhpcywgU1dULlJFQURfT05MWSk7CisJCWNvbWJvLnNldFRleHRMaW1pdCgzMCk7CisJCWZpbmFsIEdyaWREYXRhIGdkX2NvbWJvID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLAorCQkJCWZhbHNlKTsKKwkJZ2RfY29tYm8ud2lkdGhIaW50ID0gMzAzOworCQljb21iby5zZXRMYXlvdXREYXRhKGdkX2NvbWJvKTsKKworCQljb21iby5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkdHREMuMSIpKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBJbml0aWFsaXplIHRoZSBsaXN0IG9mIGRpc2Vhc2UgbW9kZWxzIGF2YWlsYWJsZQorCQljb21iby5zZXRJdGVtcyhnZXRHcmFwaEdlbmVyYXRvck5hbWVzKGdldEdyYXBoR2VuZXJhdG9ycygpKSk7CisJCWNvbWJvLnNlbGVjdCgwKTsKKwkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIocHJvamVjdFZhbGlkYXRvcik7CisJCQorCQkKKwkJZ3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUNvbXBvc2l0ZSA9IG5ldyBHcmFwaEdlbmVyYXRvclByb3BlcnR5Q29tcG9zaXRlKHRoaXMsCisJCQkJU1dULk5PTkUsIGdldEdyYXBoR2VuZXJhdG9ycygpLCBwcm9qZWN0VmFsaWRhdG9yLCBwcm9qZWN0KTsKKwkJZmluYWwgR3JpZERhdGEgZ2RfZ3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUNvbnRyb2wgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsCisJCQkJU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDIsIDEpOworCQlncmFwaEdlbmVyYXRvclByb3BlcnR5Q29tcG9zaXRlCisJCQkJLnNldExheW91dERhdGEoZ2RfZ3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUNvbnRyb2wpOworCisJCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJZ3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUNvbXBvc2l0ZQorCQkJCQkJLmRpc3BsYXlHcmFwaEdlbmVyYXRvcihnZXRHcmFwaEdlbmVyYXRvcnMoKVtjb21ibworCQkJCQkJCQkuZ2V0U2VsZWN0aW9uSW5kZXgoKV0pOworCQkJCS8vIGxheW91dCgpOworCQkJfSAvLyB3aWRnZXRTZWxlY3RlZAorCisJCX0pOworCQkvL2ZpbmFsIEdyYXBoR2VuZXJhdG9yRGVmaW5pdGlvbkNvbnRyb2wgc2VsZiA9IHRoaXM7CisJCQorCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgIm9yZy5lY2xpcHNlLnN0ZW0uZG9jLm5ld2dyYXBoX2NvbnRleHRpZCIpOworCisJfSAvLyBEaXNlYXNlRGVmaW5pdGlvbkNvbnRyb2wKKworCS8qKgorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHtAbGluayBHcmFwaEdlbmVyYXRvcnN9cyBkZWZpbmVkIGluIHRoZSBzeXN0ZW0uCisJICovCisJcHJpdmF0ZSBHcmFwaEdlbmVyYXRvcltdIGdldEdyYXBoR2VuZXJhdG9ycygpIHsKKwkJaWYgKGdyYXBoR2VuZXJhdG9ycyA9PSBudWxsKSB7CisJCQlmaW5hbCBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOworCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ3JhcGhHZW5lcmF0b3JDb25maWdFbGVtZW50cyA9IHJlZ2lzdHJ5CisJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoQ29uc3RhbnRzLklEX0dSQVBIX0dFTkVSQVRPUl9FWFRFTlNJT05fUE9JTlQpOworCisJCQlmaW5hbCBMaXN0PEdyYXBoR2VuZXJhdG9yPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxHcmFwaEdlbmVyYXRvcj4oKTsKKworCQkJZ3JhcGhHZW5lcmF0b3JzID0gbmV3IEdyYXBoR2VuZXJhdG9yW2dyYXBoR2VuZXJhdG9yQ29uZmlnRWxlbWVudHMubGVuZ3RoXTsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBncmFwaEdlbmVyYXRvckNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBncmFwaEdlbmVyYXRvckNvbmZpZ0VsZW1lbnRzW2ldOworCQkJCS8vIERvZXMgdGhlIGVsZW1lbnQgc3BlY2lmeSB0aGUgY2xhc3Mgb2YgdGhlIGRpc2Vhc2UgbW9kZWw/CisJCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhDb25zdGFudHMuR1JBUEhfR0VORVJBVE9SX0VMRU1FTlQpKSB7CisJCQkJCS8vIFllcworCQkJCQl0cnkgeworCQkJCQkJdGVtcC5hZGQoKEdyYXBoR2VuZXJhdG9yKSBlbGVtZW50CisJCQkJCQkJCS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKE1lc3NhZ2VzLmdldFN0cmluZygiR0dEQy4yIikpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9IGNhdGNoIChmaW5hbCBDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCUFjdGl2YXRvci5sb2dFcnJvcigKKwkJCQkJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJHR0RDLjMiKSwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCX0gLy8gaWYKKwkJCX0gLy8gZm9yIGVhY2ggY29uZmlndXJhdGlvbiBlbGVtZW50CisKKwkJCWdyYXBoR2VuZXJhdG9ycyA9IHRlbXAudG9BcnJheShuZXcgR3JhcGhHZW5lcmF0b3JbXSB7fSk7CisJCX0gLy8gaWYgZGlzZXNhZU1vZGVscyBub3QgY3JlYXRlZAorCisJCXJldHVybiBncmFwaEdlbmVyYXRvcnM7CisJfSAvLyBnZXRHcmFwaEdlbmVyYXRvcnMKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBkaXNlYXNlIG1vZGVscworCSAqLworCXByaXZhdGUgU3RyaW5nW10gZ2V0R3JhcGhHZW5lcmF0b3JOYW1lcyhmaW5hbCBHcmFwaEdlbmVyYXRvcltdIGdyYXBoR2VuZXJhdG9ycykgeworCQlmaW5hbCBTdHJpbmdbXSByZXRWYWx1ZSA9IG5ldyBTdHJpbmdbZ3JhcGhHZW5lcmF0b3JzLmxlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZ3JhcGhHZW5lcmF0b3JzLmxlbmd0aDsgaSsrKSB7CisJCQlTdHJpbmcgbmFtZSA9IGdyYXBoR2VuZXJhdG9yc1tpXS5nZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKTsKKwkJCS8vIFdhcyBhIG5hbWUgc3BlY2lmaWVkPworCQkJaWYgKChuYW1lID09IG51bGwpIHx8IG5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJLy8gTm8KKwkJCQluYW1lID0gZ3JhcGhHZW5lcmF0b3JzW2ldLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOworCQkJfSAvLyBpZgorCisJCQlyZXRWYWx1ZVtpXSA9IG5hbWU7CisJCX0gLy8gZm9yIGkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0R3JhcGhHZW5lcmF0b3JOYW1lcworCisJCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tTdWJjbGFzcygpIHsKKwkJLy8gRGlzYWJsZSB0aGUgY2hlY2sgdGhhdCBwcmV2ZW50cyBzdWItY2xhc3Npbmcgb2YgU1dUIGNvbXBvbmVudHMKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50cyBvZiB0aGUgY29udHJvbCBhcmUgdmFsaWQsCisJICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgeworCQlyZXR1cm4gZ3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUNvbXBvc2l0ZS52YWxpZGF0ZSgpOworCX0gLy8gdmFsaWRhdGUKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2Ugc2V0IGJ5IHtAbGluayAjdmFsaWRhdGUoKX0KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKKwkJcmV0dXJuIGdyYXBoR2VuZXJhdG9yUHJvcGVydHlDb21wb3NpdGUuZ2V0RXJyb3JNZXNzYWdlKCk7CisJfQorCisJLyoqCisJICogcmV0dXJuIHRoZSBuZXcgZ3JhcGgKKwkgKi8KKwlwdWJsaWMgR3JhcGggZ2V0R3JhcGgoKSB7CisJCWZpbmFsIEdyYXBoR2VuZXJhdG9yIGdnID0gKEdyYXBoR2VuZXJhdG9yKUVjb3JlVXRpbAorCQkJLmNvcHkoZ2V0R3JhcGhHZW5lcmF0b3JzKClbY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV0pOworCQlHcmFwaCByZXRWYWx1ZSA9IGdyYXBoR2VuZXJhdG9yUHJvcGVydHlDb21wb3NpdGUuZ2V0R3JhcGgoZ2cpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfQorfSAvLyBHcmFwaEdlbmVyYXRvckRlZmluaXRpb25Db250cm9sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9ncmFwaGdlbmVyYXRvcnMvd2l6YXJkcy9HcmFwaEdlbmVyYXRvclByb3BlcnR5Q29tcG9zaXRlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9ncmFwaGdlbmVyYXRvcnMvd2l6YXJkcy9HcmFwaEdlbmVyYXRvclByb3BlcnR5Q29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI3YjliMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dyYXBoZ2VuZXJhdG9ycy93aXphcmRzL0dyYXBoR2VuZXJhdG9yUHJvcGVydHlDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLy8gRGlzZWFzZU1vZGVsUHJvcGVydHlDb21wb3NpdGUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5ncmFwaGdlbmVyYXRvcnMuR3JhcGhHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMuYWRhcHRlcnMuZ3JhcGhnZW5lcmF0b3Jwcm9wZXJ0eWVkaXRvci5HcmFwaEdlbmVyYXRvclByb3BlcnR5RWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzLmFkYXB0ZXJzLmdyYXBoZ2VuZXJhdG9ycHJvcGVydHllZGl0b3IuR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMuYWRhcHRlcnMuZ3JhcGhnZW5lcmF0b3Jwcm9wZXJ0eWVkaXRvci5HcmFwaEdlbmVyYXRvclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cworICovCitwdWJsaWMgY2xhc3MgR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7CisKKwlwcml2YXRlIE1hcDxvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy5HcmFwaEdlbmVyYXRvciwgR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvcj4gbW9kZWxNYXAgPSBuZXcgSGFzaE1hcDxHcmFwaEdlbmVyYXRvciwgR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvcj4oKTsKKworCXByaXZhdGUgU3RhY2tMYXlvdXQgc3RhY2tMYXlvdXQgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlIHRoZSBjb21wb3NpdGUKKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50CisJICogQHBhcmFtIHN0eWxlCisJICogQHBhcmFtIHByb2plY3RWYWxpZGF0b3IKKwkgKi8KKwlwdWJsaWMgR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUNvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50LAorCQkJZmluYWwgaW50IHN0eWxlLCBmaW5hbCBHcmFwaEdlbmVyYXRvcltdIGdyYXBoR2VuZXJhdG9ycywKKwkJCU1vZGlmeUxpc3RlbmVyIHByb2plY3RWYWxpZGF0b3IsIElQcm9qZWN0IHByb2plY3QpIHsKKwkJc3VwZXIocGFyZW50LCBzdHlsZSk7CisJCXN0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7CisJCXNldExheW91dChzdGFja0xheW91dCk7CisKKwkJTGFiZWwgbGFiZWw7CisJCWxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkdHUEMxIikpOyAvLyROT04tTkxTLTEkCisJCUdyYXBoR2VuZXJhdG9yUHJvcGVydHlFZGl0b3IgZmlyc3RPbmUgPSBudWxsOworCQkvLyBBbnkgZGlzZWFzZSBtb2RlbHM/CisJCWlmIChncmFwaEdlbmVyYXRvcnMgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGdyYXBoR2VuZXJhdG9ycy5sZW5ndGg7IGkrKykgeworCisJCQkJR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvckFkYXB0ZXIgZG1wZWEgPSAoR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvckFkYXB0ZXIpIEdyYXBoR2VuZXJhdG9yUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkJLmFkYXB0KGdyYXBoR2VuZXJhdG9yc1tpXSwKKwkJCQkJCQkJR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuY2xhc3MpOworCisJCQkJZmluYWwgR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUVkaXRvciBkbXBlID0gZG1wZWEKKwkJCQkJCS5jcmVhdGVHcmFwaEdlbmVyYXRvclByb3BlcnR5RWRpdG9yKHRoaXMsIFNXVC5OT05FLAorCQkJCQkJCQlwcm9qZWN0VmFsaWRhdG9yLCBwcm9qZWN0KTsKKworCQkJCW1vZGVsTWFwLnB1dChncmFwaEdlbmVyYXRvcnNbaV0sIGRtcGUpOworCQkJCWlmIChmaXJzdE9uZSA9PSBudWxsKSB7CisJCQkJCS8vIFllcworCQkJCQlmaXJzdE9uZSA9IGRtcGU7CisJCQkJfSAvLyBpZgorCQkJfSAvLyBmb3IgaQorCQl9IC8vIGlmIGFueSBkaXNlYXNlIG1vZGVscz8KKworCQlzdGFja0xheW91dC50b3BDb250cm9sID0gZmlyc3RPbmU7CisJfSAvLyBHcmFwaEdlbmVyYXRvclByb3BlcnR5Q29tcG9zaXRlCisKKwl2b2lkIGRpc3BsYXlHcmFwaEdlbmVyYXRvcihmaW5hbCBHcmFwaEdlbmVyYXRvciBncmFwaEdlbmVyYXRvcikgeworCQlmaW5hbCBHcmFwaEdlbmVyYXRvclByb3BlcnR5RWRpdG9yIGRtcGUgPSBtb2RlbE1hcC5nZXQoZ3JhcGhHZW5lcmF0b3IpOworCQkvLyBEaWQgd2UgZmluZCBpdD8KKwkJaWYgKGRtcGUgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlzdGFja0xheW91dC50b3BDb250cm9sID0gZG1wZTsKKwkJCWxheW91dCgpOworCQl9IC8vIGlmCisJCWVsc2UgeworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKE1lc3NhZ2VzLmdldFN0cmluZygiR0dQQzIiKSAvLyROT04tTkxTLTEkCisJCQkJCSsgZ3JhcGhHZW5lcmF0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXCIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfSAvLyBkaXNwbGF5R3JhcGhHZW5lcmF0b3IKKwkKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tTdWJjbGFzcygpIHsKKwkJLy8gRGlzYWJsZSB0aGUgY2hlY2sgdGhhdCBwcmV2ZW50cyBzdWItY2xhc3Npbmcgb2YgU1dUIGNvbXBvbmVudHMKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50cyBvZiB0aGUgY29tcG9zaXRlIGFyZSB2YWxpZCwKKwkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisJICovCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7CisJCXJldHVybiAoKEdyYXBoR2VuZXJhdG9yUHJvcGVydHlFZGl0b3IpIChzdGFja0xheW91dC50b3BDb250cm9sKSkKKwkJCQkudmFsaWRhdGUoKTsKKwl9IC8vIHZhbGlkYXRlCisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7CisJCXJldHVybiAoKEdyYXBoR2VuZXJhdG9yUHJvcGVydHlFZGl0b3IpIChzdGFja0xheW91dC50b3BDb250cm9sKSkKKwkJCQkuZ2V0RXJyb3JNZXNzYWdlKCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGdyYXBoR2VuZXJhdG9yCisJICovCisJcHVibGljIEdyYXBoIGdldEdyYXBoKEdyYXBoR2VuZXJhdG9yIGdnKSB7CisJCXJldHVybiAoKEdyYXBoR2VuZXJhdG9yUHJvcGVydHlFZGl0b3IpIChzdGFja0xheW91dC50b3BDb250cm9sKSkKKwkJCQkuZ2V0R3JhcGgoZ2cpOworCX0gLy8gCisKK30gLy8gR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eUNvbXBvc2l0ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ3JhcGhnZW5lcmF0b3JzL3dpemFyZHMvR3JhcGhHZW5lcmF0b3JQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dyYXBoZ2VuZXJhdG9ycy93aXphcmRzL0dyYXBoR2VuZXJhdG9yUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYzNGUzMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dyYXBoZ2VuZXJhdG9ycy93aXphcmRzL0dyYXBoR2VuZXJhdG9yUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8vIFN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMud2l6YXJkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmdyYXBoZ2VuZXJhdG9ycy51dGlsLkdyYXBoZ2VuZXJhdG9yc0FkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3MuUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3MuUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBOTFMnZCBzdHJpbmdzIGZvciBHcmFwaCBHZW5lcmF0b3IgcHJvcGVydGllcy4gCisgKi8KK3B1YmxpYyBjbGFzcyBHcmFwaEdlbmVyYXRvclByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCUdyYXBoZ2VuZXJhdG9yc0FkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKKworCQorCVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOworCisJLyoqCisJICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBHcmFwaEdlbmVyYXRvclByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkZEFkYXB0ZXJGYWN0b3J5KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsI2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCXJldHVybiAgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSB8fCB0eXBlID09IFByb3BlcnR5U3RyaW5nUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudXRpbC5TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURpc2Vhc2VNb2RlbEFkYXB0ZXIoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoR2VuZXJhdG9yQWRhcHRlcigpIHsKKwkJLy8gSGF2ZSB3ZSBjcmVhdGVkIG9uZSBiZWZvcmU/CisJCWlmIChhZGFwdGVyID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQlhZGFwdGVyID0gbmV3IEdyYXBoR2VuZXJhdG9yUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIoKTsKKwkJfSAvLyBpZiB3ZSBkaWRuJ3QgY3JlYXRlIG9uZSBiZWZvcmUKKwkJcmV0dXJuIGFkYXB0ZXI7CisJfSAvLyBjcmVhdGVEaXNlYXNlTW9kZWxBZGFwdGVyCisJCisJcHVibGljIHN0YXRpYyBjbGFzcyBHcmFwaEdlbmVyYXRvclByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyIGV4dGVuZHMKKwkJCVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyIHsKKworCQkvKioKKwkJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkJICogQHJldHVybiB0aGUgTkxTJ2QgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZGlzcGxheSB0byB0aGUgdXNlcgorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQkJcmV0dXJuIE1lc3NhZ2VzCisJCQkJCS5nZXRTdHJpbmcoKChFU3RydWN0dXJhbEZlYXR1cmUpIGRlc2NyaXB0b3IKKwkJCQkJCQkuZ2V0RmVhdHVyZShudWxsKSkuZ2V0TmFtZSgpKTsKKwkJfSAvLyBnZXRQcm9wZXJ0eU5hbWUKKworCQkvKioKKwkJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkJICogQHJldHVybiB0aGUgTkxTJ2QgdG9vbCB0aXAgdGV4dCB0aGF0IGRlc2NyaWJlcyB0aGUgcHJvcGVydHkKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlUb29sVGlwKAorCQkJCUlJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKwkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZGVzY3JpcHRvcgorCQkJCQkuZ2V0RmVhdHVyZShudWxsKTsKKwkJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoZmVhdHVyZS5nZXROYW1lKCkKKwkJCQkJKyBUVF9TVUZGSVgpOworCQl9IC8vIGdldFByb3BlcnR5VG9vbFRpcAorCisJCS8qKgorCQkgKiBAcGFyYW0gZGVzY3JpcHRvcgorCQkgKiBAcmV0dXJuIHRoZSBOTFMnZCB0ZXh0IHRoYXQgcmVwcmVzZW50cyB0aGUgdW5pdHMgb2YgdGhlCisJCSAqICAgICAgICAgcHJvcGVydHkKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlVbml0cygKKwkJCQlJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisJCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGRlc2NyaXB0b3IKKwkJCQkJLmdldEZlYXR1cmUobnVsbCk7CisJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKGZlYXR1cmUuZ2V0TmFtZSgpCisJCQkJCSsgVU5JVF9TVUZGSVgpOworCQl9IC8vIGdldFByb3BlcnR5VW5pdHMKKworCX0gCit9IApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ3JhcGhnZW5lcmF0b3JzL3dpemFyZHMvTWVzc2FnZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dyYXBoZ2VuZXJhdG9ycy93aXphcmRzL01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJkMjYzNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dyYXBoZ2VuZXJhdG9ycy93aXphcmRzL01lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLy8gTWVzc2FnZXMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50czsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIFJlc291cmNlIEJ1bmRsZSBmb3IgdGhpcyBwYWNrYWdlLgorICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZXMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IENvbnN0YW50cy5JRF9ST09UCisJCQkrICIudWkuZ3JhcGhnZW5lcmF0b3JzLndpemFyZHMubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQorCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7CisKKwlwcml2YXRlIE1lc3NhZ2VzKCkgeworCQkvLyBlbXB0eQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBrZXkKKwkgKiAgICAgICAgICAgIHRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlCisJICogQHJldHVybiB0aGUgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUga2V5CisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7CisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOworCQl9CisJfSAvLyBnZXRTdHJpbmcKK30gLy8gV2l6YXJkTWVzc2FnZXMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2dyYXBoZ2VuZXJhdG9ycy93aXphcmRzL05ld0dyYXBoV2l6YXJkLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9ncmFwaGdlbmVyYXRvcnMvd2l6YXJkcy9OZXdHcmFwaFdpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNzFiODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9ncmFwaGdlbmVyYXRvcnMvd2l6YXJkcy9OZXdHcmFwaFdpemFyZC5qYXZhCkBAIC0wLDAgKzEsMjExIEBACisvLyBOZXdHcmFwaFdpemFyZC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZ3JhcGhnZW5lcmF0b3JzLndpemFyZHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGhQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5EdWJsaW5Db3JlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdTVEVNUHJvamVjdFdpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuU1RFTVdpemFyZERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgTmV3SWRlbnRpZmlhYmxlV2l6YXJkfSBmb3IgdGhhdCBjcmVhdGVzIG5ldyBTVEVNCisgKiB7QGxpbmsgR3JhcGh9cy4KKyAqLworcHVibGljIGNsYXNzIE5ld0dyYXBoV2l6YXJkIGV4dGVuZHMgTmV3SWRlbnRpZmlhYmxlV2l6YXJkIHsKKworCXByaXZhdGUgTmV3R3JhcGhQYWdlIG5ncCA9IG51bGw7CisKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjZ2V0V2l6YXJkVGl0bGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0V2l6YXJkVGl0bGUoKSB7CisJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIk5HcmFwaFdpei53aXphcmRfdGl0bGUiKTsgLy8kTk9OLU5MUy0xJAorCX0gLy8gZ2V0V2l6YXJkVGl0bGUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTmV3SWRlbnRpZmlhYmxlUGFnZSBjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlKCkgeworCQluZ3AgPSBuZXcgTmV3R3JhcGhQYWdlKE1lc3NhZ2VzCisJCQkJLmdldFN0cmluZygiTkdyYXBoV2l6LnBhZ2VfdGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJbmdwLnNldFRpdGxlKE1lc3NhZ2VzLmdldFN0cmluZygiTkdyYXBoV2l6LnBhZ2VfdGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJbmdwLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzCisJCQkJLmdldFN0cmluZygiTkdyYXBoV2l6LnBhZ2VfZGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKKworCQl0aGlzLnNldEhlbHBDb250ZXh0SWQoIm9yZy5lY2xpcHNlLnN0ZW0uZG9jLm5ld2dyYXBoX2NvbnRleHRpZCIpOworCQlyZXR1cm4gbmdwOworCisJfSAvLyBjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjY3JlYXRlRHVibGluQ29yZVBhZ2UoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBEdWJsaW5Db3JlUGFnZSBjcmVhdGVEdWJsaW5Db3JlUGFnZSgpIHsKKwkJcmV0dXJuIG5ldyBEdWJsaW5Db3JlUGFnZSgpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURDQXR0cmlidXRlcygpIHsKKwkJCQlzdXBlci5pbml0aWFsaXplRENBdHRyaWJ1dGVzKCk7CisJCQkJZm9ybWF0LnNldFRleHQoR3JhcGhQYWNrYWdlLmVOU19VUkkpOworCQkJCWZvcm1hdC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQl0eXBlLnNldFRleHQoU1RFTVVSSS5HUkFQSF9UWVBFX1VSSS50b1N0cmluZygpKTsKKwkJCQl0eXBlLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCQorCQkJCUNhbGVuZGFyIGMgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworCQkgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIik7IAorCQkgICAgICAgIFN0cmluZyBkYXRlU3RyID0gZGF0ZUZvcm1hdHRlci5mb3JtYXQoYy5nZXRUaW1lKCkpOworCQkKKwkJCQl0aXRsZS5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiTkdHV2l6LkRDX1NRX1RJVExFIikpOworCQkJCXRpdGxlLnNldEVuYWJsZWQodHJ1ZSk7CisJCQkJCisJCQkJZGVzY3JpcHRpb24uc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIk5HR1dpei5EQ19ERVNDUklQVElPTiIpKTsKKwkJCQlkZXNjcmlwdGlvbi5zZXRFbmFibGVkKHRydWUpOworCQkJCQorCQkJCS8vIFRPRE8gdGhlIFNPVVJDRSBzaG91bGQgcmVhbGx5IHJldHVybiB0aGUgc3BlY2lmaWMgZ2VuZXJhdG9yIENMQVNTIGUuZy4sIFNxdWFyZSBmb3IgU3F1YXJlCisJCQkJc291cmNlLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJOR0dXaXouRENfU09VUkNFIikpOworCQkJCXNvdXJjZS5zZXRFbmFibGVkKHRydWUpOworCQkJCWRhdGUuc2V0VGV4dChkYXRlU3RyKTsKKwkJCQlkYXRlLnNldEVuYWJsZWQodHJ1ZSk7CisJCQkJCisJCQl9CisJCX07CisJfSAvLyBjcmVhdGVEdWJsaW5Db3JlUGFnZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2NyZWF0ZUlkZW50aWZpYWJsZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElkZW50aWZpYWJsZSBjcmVhdGVJZGVudGlmaWFibGUoKSB7CisJCWZpbmFsIEdyYXBoIHJldFZhbHVlID0gbmdwLmdldEdyYXBoKCk7CisJCXJldFZhbHVlLnNldER1YmxpbkNvcmUobmV3RHVibGluQ29yZVBhZ2UuY3JlYXRlRHVibGluQ29yZSgpKTsKKwkJCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUlkZW50aWZpYWJsZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2dldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkgeworCQlyZXR1cm4gTmV3U1RFTVByb2plY3RXaXphcmQuR1JBUEhTX0ZPTERFUl9OQU1FOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNnZXRTZXJpYWxpemF0aW9uRmlsZU5hbWVFeHRlbnNpb24oKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lRXh0ZW5zaW9uKCkgeworCQlyZXR1cm4gR3JhcGhQYWNrYWdlLmVOQU1FOworCX0gLy8gZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lRXh0ZW5zaW9uCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIE5ld0lkZW50aWZpYWJsZVBhZ2V9IHRoYXQgY29udGFpbnMgdGhlIGludGVyZmFjZQorCSAqIGNvbXBvbmVudHMgbmVlZGVkIHRvIGRlZmluZSBhIG5ldyB7QGxpbmsgR3JhcGh9LgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTmV3R3JhcGhQYWdlIGV4dGVuZHMgTmV3SWRlbnRpZmlhYmxlUGFnZSB7CisKKwkJR3JhcGhHZW5lcmF0b3JEZWZpbml0aW9uQ29udHJvbCBnZ2RjID0gbnVsbDsKKworCQkvKioKKwkJICogQHBhcmFtIHBhZ2VOYW1lCisJCSAqLworCQlwcm90ZWN0ZWQgTmV3R3JhcGhQYWdlKGZpbmFsIFN0cmluZyBwYWdlTmFtZSkgeworCQkJc3VwZXIocGFnZU5hbWUpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZC5OZXdJZGVudGlmaWFibGVQYWdlI2dldERDRGVzY3JpcHRpb24oKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RENEZXNjcmlwdGlvbigpIHsKKwkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChNZXNzYWdlcworCQkJCQkuZ2V0U3RyaW5nKCJOR0dXaXouRENfREVTQ1JJUFRJT04iKSwgLy8kTk9OLU5MUy0xJAorCQkJCQluZXcgT2JqZWN0W10geyBzZXJpYWxpemF0aW9uRmlsZU5hbWVGaWVsZC5nZXRUZXh0KCkgfSk7CisJCX0gLy8gZ2V0RENEZXNjcmlwdGlvbgorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVNwZWNpZmljQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCWdnZGMgPSBuZXcgR3JhcGhHZW5lcmF0b3JEZWZpbml0aW9uQ29udHJvbChwYXJlbnQsIFNXVC5OT05FLAorCQkJCQlwcm9qZWN0VmFsaWRhdG9yLCB0aGlzLmdldFNlbGVjdGVkUHJvamVjdCgpKTsKKwkJCXJldHVybiBnZ2RjOworCQl9IC8vIGNyZWF0ZVNwZWNpZmljQ29tcG9zaXRlCisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKKwkJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci52YWxpZGF0ZVBhZ2UoKTsKKwkJCWlmIChyZXRWYWx1ZSkgeworCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKKwkJCQlyZXRWYWx1ZSA9IGdnZGMudmFsaWRhdGUoKTsKKwkJCQkvLyBFcnJvcj8KKwkJCQlpZiAoIXJldFZhbHVlKSB7CisJCQkJCS8vIFllcworCQkJCQlzZXRFcnJvck1lc3NhZ2UoZ2dkYy5nZXRFcnJvck1lc3NhZ2UoKSk7CisJCQkJfSAvLyBpZgorCQkJfQorCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIHZhbGlkYXRlUGFnZQorCisJCUdyYXBoIGdldEdyYXBoKCkgeworCQkJcmV0dXJuIGdnZGMuZ2V0R3JhcGgoKTsKKwkJfSAvLyBnZXRTZWxlY3RlZERpc2Vhc2VNb2RlbAorCisJfSAvLyBOZXdHcmFwaFBhZ2UKKworCQorCQorCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgSUhhbmRsZXJ9IGZvciB0aGUgY29tbWFuZCB0aGF0IGNyZWF0ZXMgYQorCSAqIHtAbGluayBOZXdHcmFwaFdpemFyZH0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE5ld0dyYXBoV2l6YXJkQ29tbWFuZEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIKKwkJCWltcGxlbWVudHMgSUhhbmRsZXIgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudCkKKwkJICovCisJCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBleGVjdXRpb25FdmVudCkKKwkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gSGFuZGxlclV0aWwKKwkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvd0NoZWNrZWQoZXhlY3V0aW9uRXZlbnQpOworCQkJZmluYWwgTmV3R3JhcGhXaXphcmQgd2l6YXJkID0gbmV3IE5ld0dyYXBoV2l6YXJkKCk7CisJCQl3aXphcmQuaW5pdCh3aW5kb3cuZ2V0V29ya2JlbmNoKCksIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOworCQkJZmluYWwgV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBTVEVNV2l6YXJkRGlhbG9nKHdpbmRvdworCQkJCQkuZ2V0U2hlbGwoKSwgd2l6YXJkKTsKKwkJCXdpemFyZERpYWxvZy5vcGVuKCk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSAvLyBleGVjdXRlCisJfSAvLyBOZXdHcmFwaFdpemFyZENvbW1hbmRIYW5kbGVyCisKK30gLy8gTmV3R3JhcGhXaXphcmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9ncmFwaGdlbmVyYXRvcnMvd2l6YXJkcy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ3JhcGhnZW5lcmF0b3JzL3dpemFyZHMvbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGY3ODlmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ncmFwaGdlbmVyYXRvcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZ3JhcGhnZW5lcmF0b3JzL3dpemFyZHMvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDEwMyBAQAorIyBXaXphcmRNZXNzYWdlcy5wcm9wZXJ0aWVzCisjCisjLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyMgR3JhcGggV2l6YXJkCitOR3JhcGhXaXoud2l6YXJkX3RpdGxlID0gTmV3IEdyYXBoCitOR3JhcGhXaXoucGFnZV90aXRsZSA9IEdyYXBoCitOR3JhcGhXaXoucGFnZV9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBTVEVNIEdyYXBoIGluIGEgcHJvamVjdC4KK05HcmFwaFdpei5EQ19ERVNDUklQVElPTiA9IEdyYXBoICJ7MH0iCitOR0dXaXouRENfREVTQ1JJUFRJT04gPSBHZW5lcmF0ZWQgTGF0dGljZQorTkdHV2l6LkRDX1NRX1RJVExFID0gU3F1YXJlIExhdHRpY2UKK05HR1dpei5EQ19TT1VSQ0UgPSBHZW5lcmF0ZWQKK05HRldpei5EQ19ERVNDUklQVElPTiA9IEdlbmVyYXRlZCBMYXR0aWNlCisKKworIyBHcmFwaCBHZW5lcmF0b3JzCitHR0RDLjA9U291cmNlCitHR0RDLjI9Y2xhc3MKK0dHREMuMz1Qcm9ibGVtIGNyZWF0aW5nIEdyYXBoIEdlbmVyYXRvciBpbnN0YW5jZQorWUVTID0gWWVzCitOTyA9IE5vCisKKworCisjIExhdHRpY2UgZ3JhcGggZ2VuZXJhdG9yCit4U2l6ZSA9IFggU2l6ZQoreVNpemUgPSBZIFNpemUKK3hTaXplVU5JVCA9IFVuaXRzCit5U2l6ZVVOSVQgPSBVbml0cworeFNpemVUVCA9IE51bWJlciBvZiBncmlkcyBhbG9uZyBYIGF4aXMKK3lTaXplVFQgPSBOdW1iZXIgb2YgZ3JpZHMgYWxvbmcgWSBheGlzCit1c2VOZWFyZXN0TmVpZ2hib3JzID0gTmVhcmVzdCBOZWlnaGJvcnMKK3VzZU5lYXJlc3ROZWlnaGJvcnNVTklUID0gCit1c2VOZWFyZXN0TmVpZ2hib3JzVFQgPSBDb25uZWN0IGdyaWRzIHdpdGggbmVhcmVzdCBuZWlnaGJvciBlZGdlcwordXNlTmV4dE5lYXJlc3ROZWlnaGJvcnMgPSBOZXh0IE5lYXJlc3QgTmVpZ2hib3JzCit1c2VOZXh0TmVhcmVzdE5laWdoYm9yc1VOSVQgPSAKK3VzZU5leHROZWFyZXN0TmVpZ2hib3JzVFQgPSBDb25uZWN0IGdyaWRzIHVzaW5nIG5leHQgbmVhcmVzdCBuZWlnaGJvciBlZGdlcworcGVyaW9kaWNCb3VuZGFyaWVzID0gUGVyaW9kaWMgQm91bmRhcmllcworcGVyaW9kaWNCb3VuZGFyaWVzVU5JVCA9IAorcGVyaW9kaWNCb3VuZGFyaWVzVFQgPSBVc2UgUGVyaW9kaWMgQm91bmRhcmllcworYXJlYSA9IEFyZWEKK2FyZWFVTklUID0ga21eMgorYXJlYVRUID0gVGhlIGFyZWEgKGluIGttXjIpIG9mIGVhY2ggZ3JpZAorCisjUGxhdGVDYXJyZWUgZ2VuZXJhdG9yCithbmd1bGFyU3RlcCA9IEFuZ2x1bGFyIEludGVydmFsCithbmd1bGFyU3RlcFVOSVQgPSBkZWdyZWVzCithbmd1bGFyU3RlcFRUID0gRXF1aS1hbmd1bGFyIHN0ZXAgKGludGVnZXIgZGVncmVlcykKKworcmFkaXVzID0gUmFkaXVzIG9mIFNwaGVyZQorcmFkaXVzVU5JVCA9IGttCityYWRpdXNUVCA9IGUuZy4sIEVhcnRoIFJhZGl1cworCisjTWlncmF0aW9uIGVkZ2UgZ2VuZXJhdG9yCitsb2NhdGlvbiA9IExvY2F0aW9uCittaWdyYXRpb25SYXRlID0gTWlncmF0aW9uIFJhdGUKK21pZ3JhdGlvblJhdGVVTklUPUZyYWN0aW9uIG9mIHBvcHVsYXRpb24vVFAKK21pZ3JhdGlvblJhdGVUVD1TcGVjaWZ5IGEgbWlncmF0aW9uIHJhdGUgZm9yIHRoZSBlZGdlcyBnZW5lcmF0ZWQKK3BvcHVsYXRpb249UG9wdWxhdGlvbgorcG9wdWxhdGlvblVOSVQ9Citwb3B1bGF0aW9uVFQ9VGhlIHBvcHVsYXRpb24gdG8gbWlncmF0ZQorCisjUGFqZWtOZXQgZ2VuZXJhdG9yCitkYXRhRmlsZV9uZXQgPSBQYWplayBGaWxlCitkYXRhRmlsZV9uZXRUVCA9IENob29zZSBhIGZpbGUgaW4gUGFqZWsgZm9ybWF0CithcmVhID0gRGVmYXVsdCBBcmVhCithcmVhVFQgPSBEZWZhdWx0IEFyZWEgb2YgZWFjaCBub2RlIGlmIHVuZGVmaW5lZAorYXJlYVVOSVQgPSBrbV4yCit6b29tRmFjdG9yID0gWm9vbSBGYWN0b3IKK3pvb21GYWN0b3JUVCA9IEZhY3Rvcml6aW5nIHRoZSBpbml0aWFsIGNvb3JkaW5hdGVzIG9mIHRoZSBQYWplayBORVQKK3pvb21GYWN0b3JVTklUID0gCitjb2xBcmVhID0gQXJlYQorY29sQXJlYVRUID0gRmllbGQgdGhhdCBkZWZpbmVzIHRoZSBpbmRpdmlkdWFsIGFyZWEgZm9yIGVhY2ggbm9kZS4gSWYgbWlzc2luZyB0aGUgZGVmYXVsdCBhcmVhIGlzIHVzZWQuIFZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQgYXMgdGhlIGZpcnN0IGZvdXIgY29sdW1ucyBhcmUgcHJlZGVmaW5lZC4KK2NvbEFyZWFVTklUID0gCisKKworI0Vycm9ycworTkdHV2l6RXJyMSA9IFhTaXplIGNhbm5vdCBiZSBlbXB0eQorTkdHV2l6RXJyMiA9IEludmFsaWQgWFNpemUgdmFsdWUKK05HR1dpekVycjMgPSBZU2l6ZSBjYW5ub3QgYmUgZW1wdHkKK05HR1dpekVycjQgPSBJbnZhbGlkIFlTaXplIHZhbHVlCitOR0dXaXpFcnI1ID0gTWlzc2luZyBwb3B1bGF0aW9uIGlkZW50aWZpZXIKK05HR1dpekVycjYgPSBJbnZhbGlkIHJhdGUKK05HR1dpekVycjcgPSBSYXRlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAKK05HR1dpekVycjggPSBBcmVhIHJlcXVpcmVkCitOR0dXaXpFcnI5ID0gSW52YWxpZCBhcmVhCitOR0dXaXpFcnIxMCA9IFRoZSB0b3RhbCBhcmVhIG9mIHRoZSBncmFwaCBpcyB0b28gbGFyZ2UsIHJlZHVjZSB0aGUgc2l6ZSBvciBhcmVhCitOR0dXaXpFcnIxMSA9IEludmFsaWQgTm9uemVybyBJbnRlZ2VyIFZhbHVlCitOR0dXaXpFcnIxMiA9IEludmFsaWQgTm9uemVybyBEb3VibGUgVmFsdWUKK05HR1dpekVycjEzID0gRmlsZSBjYW5ub3QgYmUgZm91bmQKK05HR1dpekVycjE0ID0gRGVmYXVsdCBBcmVhIHJlcXVpcmVkCisKKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRlODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTJiMTA2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uuc3RlbS51aS5ubDE8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MWJhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw3IEBACisjTW9uIEphbiAyMSAxMjo1MjozOCBFU1QgMjAwOAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YWI2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDE0IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKK0ZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLnN0ZW0udWkKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorQnVuZGxlLUNsYXNzUGF0aDogLiwKKyBiaW4vCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cywKKyBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLm1hcCwKKyBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMKK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4NTAzYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMyBAQAorc291cmNlLi4gPSBzcmMvCitvdXRwdXQuLiA9IGJpbi8KK2Jpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICAuLFwKKyAgICAgICAgICAgICAgIHBsdWdpbl9lbl9DQS5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIHBsdWdpbl9lbl9VU19DQS5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIHBsdWdpbl9lcy5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIHBsdWdpbl9oZS5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIHBsdWdpbl90YS5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIHBsdWdpbl96aC5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIGJpbi8sXAorICAgICAgICAgICAgICAgbm90aWNlLmh0bWwsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YjE5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoreG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKK3htbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPGxpbmsgcmVsPUZpbGUtTGlzdAoraHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOkRvY3VtZW50UHJvcGVydGllcz4KKyAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KKyAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgorICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+CisgIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+CisgIDxvOlBhZ2VzPjQ8L286UGFnZXM+CisgIDxvOldvcmRzPjE2MjY8L286V29yZHM+CisgIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgorICAgPG86TGluZXM+Nzc8L286TGluZXM+CisgIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KKyAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+CisgIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+CisgPC9vOkRvY3VtZW50UHJvcGVydGllcz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OldvcmREb2N1bWVudD4KKyAgPHc6VHJhY2tSZXZpc2lvbnMvPgorIDwvdzpXb3JkRG9jdW1lbnQ+Cis8L3htbD48IVtlbmRpZl0tLT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlRhaG9tYTsKKwlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKKwltc28tZm9udC1jaGFyc2V0OjA7CisJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7CisJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7CisJbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KK3AuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bXNvLXN0eWxlLXBhcmVudDoiIjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwCisJe21hcmdpbi1yaWdodDowaW47CisJbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CisJbWFyZ2luLWxlZnQ6MGluOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKKwl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZTo4LjBwdDsKKwlmb250LWZhbWlseTpUYWhvbWE7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorQHBhZ2UgU2VjdGlvbjEKKwl7c2l6ZTo4LjVpbiAxMS4waW47CisJbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47CisJbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKKwltc28tZm9vdGVyLW1hcmdpbjouNWluOworCW1zby1wYXBlci1zb3VyY2U6MDt9CitkaXYuU2VjdGlvbjEKKwl7cGFnZTpTZWN0aW9uMTt9CistLT4KKzwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgorPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCitUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAorUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCitPRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCithZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKK3N1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKK2J5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgoraWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KK3N1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCit3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKK2VudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKK2NsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCitvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucworZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KK3JlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50CithIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KK3N0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5CitkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCitSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAorYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCitjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgorb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKK2J5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCit0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCithbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCitSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCitDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgordGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Citmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQordG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKK2lmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKK3RoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQorRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKK3JpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KK3RoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Cis8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK2l0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAorY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQorYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKK2FuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCitlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAoraW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAorYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCitzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0CitDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCitzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCitpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCitjb2RlIGZvcm06PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQorY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQorY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCitvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQorYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycworYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKK29mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAorbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCitDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKK2Nvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCit0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCitjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKK3RvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK3RvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCithbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQoraW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCit3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcworc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCitvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCitjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKK1dJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKK01FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQorUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcworQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKK2VxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgorVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgorVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKK29yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKK2Z1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgorYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAorb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCitzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCitwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQorY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKK3RoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKK0FncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCitzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAorZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCitTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCitBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKK0FncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKK2l0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvbm90aWNlLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9ub3RpY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFmOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvbm90aWNlLmh0bWwKQEAgLTAsMCArMSw3OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5NYXJjaCAxNywgMjAwNTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisgICAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKKyAgIAorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCisgICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKyAgIAorPHVsPgorCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucworICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPiAgIAorIAorPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisJCQorPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisJPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQorCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisgICAKKzxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWVhOTA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNSBAQAorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3BsdWdpbk5hbWUgPSBTVEVNIFVJIE5sMSBGcmFnbWVudAorcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvcGx1Z2luX2VuX0NBLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9wbHVnaW5fZW5fQ0EucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTZiZTIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvcGx1Z2luX2VuX0NBLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1OSBAQAorIyBDYW5hZGlhbiBFbmdsaXNoCisjCisjIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgICoKKyMgICogQ29udHJpYnV0b3JzOgorIyAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgVG8gY29kZSBkZXZlbG9wZXI6CisjICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCisjICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KKyMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKKyMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3BsdWdpbk5hbWUgPSBTVEVNIFVJCisKKyMgQ29tbW9uIEtleXMKK19VSV9Db21tb25fU1RFTSA9IFNURU0KKworIyBTVEVNIE5ldyBQcm9qZWN0IFdpemFyZAorX1VJX05ld19TVEVNX1Byb2plY3RfV2l6YXJkID0gU1RFTSBQcm9qZWN0CisKKyMgVmlld3MKK19VSV9HcmFwaHNfVmlldyA9IEdyYXBocworX1VJX01vZGVsc19WaWV3ID0gTW9kZWxzCitfVUlfU2NlbmFyaW9zX1ZpZXcgPSBTY2VuYXJpb3MgZWg/CitfVUlfT2JzZXJ2ZXJzX1ZpZXcgPSBPYnNlcnZlcnMKK19VSV9TZXF1ZW5jZXJzX1ZpZXcgPSBTZXF1ZW5jZXJzCitfVUlfRGVjb3JhdG9yc19WaWV3ID0gRGVjb3JhdG9ycworX1VJX1NURU1fUHJvamVjdF9FeHBsb3JlciA9IFNURU0gUHJvamVjdCBFeHBsb3JlcgorX1VJX0FjdGl2ZV9TaW11bGF0aW9uc19WaWV3ID0gQWN0aXZlIFNpbXVsYXRpb25zCisKKyMgTWVudQorX1VJX1NURU1fV29ya0JlbmNoX01lbnUgPSBTVEVNCitfVUlfU1RFTV9BY3Rpb25fUnVuID0gUnVuCitfVUlfU1RFTV9BY3Rpb25fUnVuX1RUID0gU3RhcnQgZXhlY3V0aW9uIG9mIHRoZSBzaW11bGF0aW9uCitfVUlfU1RFTV9BY3Rpb25fU3RvcCA9IFN0b3AKK19VSV9TVEVNX0FjdGlvbl9TdG9wX1RUID0gU3RvcCB0aGUgc2ltdWxhdGlvbiBhbmQgbWFrZSBpdCBpbmFjdGl2ZQorX1VJX1NURU1fQWN0aW9uX1BhdXNlID0gUGF1c2UKK19VSV9TVEVNX0FjdGlvbl9QYXVzZV9UVCA9IFBhdXNlIHRoZSBzaW11bGF0aW9uCitfVUlfU1RFTV9BY3Rpb25fU3RlcCA9IFN0ZXAgCitfVUlfU1RFTV9BY3Rpb25fU3RlcF9UVCA9IEFkdmFuY2UgdGhlIHNpbXVsYXRpb24gYnkgb25lIHRpbWUgc3RlcAorX1VJX1NURU1fQWN0aW9uX1Jlc2V0ID0gUmVzZXQKK19VSV9TVEVNX0FjdGlvbl9SZXNldF9UVCA9IFJlc3RvcmUgdGhlIHNpbXVsYXRpb24gdG8gaXRzIHN0YXJ0aW5nIHN0YXRlCisKKworCisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvcGx1Z2luX2VuX1VTX0NBLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9wbHVnaW5fZW5fVVNfQ0EucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzE4Y2M5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvcGx1Z2luX2VuX1VTX0NBLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1OSBAQAorIyBDYWxpZm9ybmlhbiBFbmdsaXNoCisjCisjIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgICoKKyMgICogQ29udHJpYnV0b3JzOgorIyAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgVG8gY29kZSBkZXZlbG9wZXI6CisjICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCisjICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KKyMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKKyMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3BsdWdpbk5hbWUgPSBTVEVNIFVJCisKKyMgQ29tbW9uIEtleXMKK19VSV9Db21tb25fU1RFTSA9IFNURU0KKworIyBTVEVNIE5ldyBQcm9qZWN0IFdpemFyZAorX1VJX05ld19TVEVNX1Byb2plY3RfV2l6YXJkID0gU1RFTSBQcm9qZWN0CisKKyMgVmlld3MKK19VSV9HcmFwaHNfVmlldyA9IEdyYXBocworX1VJX01vZGVsc19WaWV3ID0gTW9kZWxzCitfVUlfU2NlbmFyaW9zX1ZpZXcgPSBTY2VuYXJpb3MKK19VSV9PYnNlcnZlcnNfVmlldyA9IE9ic2VydmVycworX1VJX1NlcXVlbmNlcnNfVmlldyA9IFNlcXVlbmNlcnMKK19VSV9EZWNvcmF0b3JzX1ZpZXcgPSBEZWNvcmF0b3JzCitfVUlfU1RFTV9Qcm9qZWN0X0V4cGxvcmVyID0gU1RFTSBQcm9qZWN0IEV4cGxvcmVyCitfVUlfQWN0aXZlX1NpbXVsYXRpb25zX1ZpZXcgPSBUb3RhbGx5IFN0b2tlZCBTaW11bGF0aW9ucworCisjIE1lbnUKK19VSV9TVEVNX1dvcmtCZW5jaF9NZW51ID0gU1RFTQorX1VJX1NURU1fQWN0aW9uX1J1biA9IFJ1bgorX1VJX1NURU1fQWN0aW9uX1J1bl9UVCA9IER1ZGUsIHN0YXJ0IHRoZSBzaW11bGF0aW9uCitfVUlfU1RFTV9BY3Rpb25fU3RvcCA9IFN0b3AKK19VSV9TVEVNX0FjdGlvbl9TdG9wX1RUID0gV2lwZSBvdXQhCitfVUlfU1RFTV9BY3Rpb25fUGF1c2UgPSBQYXVzZQorX1VJX1NURU1fQWN0aW9uX1BhdXNlX1RUID0gQ2hpbGwKK19VSV9TVEVNX0FjdGlvbl9TdGVwID0gU3RlcCAKK19VSV9TVEVNX0FjdGlvbl9TdGVwX1RUID0gTGlrZSwgc2xvb293IG1vdGlvbiwgeW91IGtub3cuCitfVUlfU1RFTV9BY3Rpb25fUmVzZXQgPSBSZXNldAorX1VJX1NURU1fQWN0aW9uX1Jlc2V0X1RUID0gTGlrZSwgUmVzZXQsIHlvdSBrbm93LgorCisKKworCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvcGx1Z2luX2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUzNDYwOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3BsdWdpbl9lcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNTUgQEAKKyMgU3BhbmlzaAorIworIyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICAqCisjICAqIENvbnRyaWJ1dG9yczoKKyMgICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFRvIGNvZGUgZGV2ZWxvcGVyOgorIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQorIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCisjICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCisjICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitwbHVnaW5OYW1lID0gU1RFTSBVSQorCisjIENvbW1vbiBLZXlzCitfVUlfQ29tbW9uX1NURU0gPSBTVEVNCisKKyMgU1RFTSBOZXcgUHJvamVjdCBXaXphcmQKK19VSV9OZXdfU1RFTV9Qcm9qZWN0X1dpemFyZCA9IFByb3llY3RvIFNURU0KKworIyBWaWV3cworX1VJX0dyYXBoc19WaWV3ID0gR3JhZm9zCitfVUlfTW9kZWxzX1ZpZXcgPSBNb2RlbG9zCitfVUlfU2NlbmFyaW9zX1ZpZXcgPSBFc2NlbmFyaW9zCitfVUlfT2JzZXJ2ZXJzX1ZpZXcgPSBFc3BlY3RhZG9yZXMgKE9ic2VydmVycykKK19VSV9TZXF1ZW5jZXJzX1ZpZXcgPSBTZWN1ZW5jaWFkb3JlcworX1VJX0RlY29yYXRvcnNfVmlldyA9IE1vZGlmaWNhZG9yZXMgZGUgR3JhZm9zIChEZWNvcmF0b3JzKQorX1VJX1NURU1fUHJvamVjdF9FeHBsb3JlciA9IEV4cGxvcmFkb3IgZGUgUHJveWVjdG9zCitfVUlfQWN0aXZlX1NpbXVsYXRpb25zX1ZpZXcgPSBTaW11bGFjaW9uZXMgQWN0aXZhcworCisjIE1lbnUKK19VSV9TVEVNX1dvcmtCZW5jaF9NZW51ID0gU1RFTQorX1VJX1NURU1fQWN0aW9uX1J1biA9IENvcnJlcgorX1VJX1NURU1fQWN0aW9uX1J1bl9UVCA9IENvcnJlciBzaW11bGFjafNuCitfVUlfU1RFTV9BY3Rpb25fU3RvcCA9IERldGVuZXIKK19VSV9TVEVNX0FjdGlvbl9TdG9wX1RUID0gRGV0ZW5lciBzaW11bGFjafNuCitfVUlfU1RFTV9BY3Rpb25fUGF1c2UgPSBQYXVzYQorX1VJX1NURU1fQWN0aW9uX1BhdXNlX1RUID0gUG9uZXIgc2ltdWxhY2nzbiBlbiBwYXVzYQorX1VJX1NURU1fQWN0aW9uX1N0ZXAgPSBDb3JyZXIgcG9yIHVuaWRhZCAKK19VSV9TVEVNX0FjdGlvbl9TdGVwX1RUID0gQXZhbnphciBzaW11bGFjafNuIHVuYSB1bmlkYWQgZGUgdGllbXBvCitfVUlfU1RFTV9BY3Rpb25fUmVzZXQgPSBSZWluaWNpYXIKK19VSV9TVEVNX0FjdGlvbl9SZXNldF9UVCA9IFJlc3RhdXJhciBzaW11bGFjafNuIGEgc3UgZXN0YWRvIGluaWNpYWwKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvcGx1Z2luX2hlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9wbHVnaW5faGUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTZmYmNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvcGx1Z2luX2hlLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1OSBAQAorIyBIZWJyZXcKKyMKKyMgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAgKgorIyAgKiBDb250cmlidXRvcnM6CisjICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBUbyBjb2RlIGRldmVsb3BlcjoKKyMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKKyMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgorIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQorIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworcGx1Z2luTmFtZSA9IFNURU0gVUkKKworIyBDb21tb24gS2V5cworX1VJX0NvbW1vbl9TVEVNID0gU1RFTQorCisjIFNURU0gTmV3IFByb2plY3QgV2l6YXJkCitfVUlfTmV3X1NURU1fUHJvamVjdF9XaXphcmQgPSBTVEVNIFByb2plY3QKKworIyBWaWV3cworX1VJX0dyYXBoc19WaWV3ID0gR3JhcGhzCitfVUlfTW9kZWxzX1ZpZXcgPSBNb2RlbHMKK19VSV9TY2VuYXJpb3NfVmlldyA9IFNjZW5hcmlvcworX1VJX09ic2VydmVyc19WaWV3ID0gT2JzZXJ2ZXJzCitfVUlfU2VxdWVuY2Vyc19WaWV3ID0gU2VxdWVuY2VycworX1VJX0RlY29yYXRvcnNfVmlldyA9IERlY29yYXRvcnMKK19VSV9TVEVNX1Byb2plY3RfRXhwbG9yZXIgPSBTVEVNIFByb2plY3QgRXhwbG9yZXIKK19VSV9BY3RpdmVfU2ltdWxhdGlvbnNfVmlldyA9IEFjdGl2ZSBTaW11bGF0aW9ucworCisjIE1lbnUKK19VSV9TVEVNX1dvcmtCZW5jaF9NZW51ID0gU1RFTQorX1VJX1NURU1fQWN0aW9uX1J1biA9IFJ1bgorX1VJX1NURU1fQWN0aW9uX1J1bl9UVCA9IFN0YXJ0IGV4ZWN1dGlvbiBvZiB0aGUgc2ltdWxhdGlvbgorX1VJX1NURU1fQWN0aW9uX1N0b3AgPSBTdG9wCitfVUlfU1RFTV9BY3Rpb25fU3RvcF9UVCA9IFN0b3AgdGhlIHNpbXVsYXRpb24gYW5kIG1ha2UgaXQgaW5hY3RpdmUKK19VSV9TVEVNX0FjdGlvbl9QYXVzZSA9IFBhdXNlCitfVUlfU1RFTV9BY3Rpb25fUGF1c2VfVFQgPSBQYXVzZSB0aGUgc2ltdWxhdGlvbgorX1VJX1NURU1fQWN0aW9uX1N0ZXAgPSBTdGVwIAorX1VJX1NURU1fQWN0aW9uX1N0ZXBfVFQgPSBBZHZhbmNlIHRoZSBzaW11bGF0aW9uIGJ5IG9uZSB0aW1lIHN0ZXAKK19VSV9TVEVNX0FjdGlvbl9SZXNldCA9IFJlc2V0CitfVUlfU1RFTV9BY3Rpb25fUmVzZXRfVFQgPSBSZXN0b3JlIHRoZSBzaW11bGF0aW9uIHRvIGl0cyBzdGFydGluZyBzdGF0ZQorCisKKworCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3BsdWdpbl90YS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvcGx1Z2luX3RhLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJlZTZlNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3BsdWdpbl90YS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNTggQEAKKyMgVGFtaWwKKyMKKyMgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAgKgorIyAgKiBDb250cmlidXRvcnM6CisjICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBUbyBjb2RlIGRldmVsb3BlcjoKKyMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKKyMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgorIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQorIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworcGx1Z2luTmFtZSA9IFNURU0gVUkKKworIyBDb21tb24gS2V5cworX1VJX0NvbW1vbl9TVEVNID0gU1RFTYqnvPUKKworIyBTVEVNIE5ldyBQcm9qZWN0IFdpemFyZAorX1VJX05ld19TVEVNX1Byb2plY3RfV2l6YXJkID0giqe89SC+ovC89QorCisjIFZpZXdzCitfVUlfR3JhcGhzX1ZpZXcgPSDFqMP0wLztuPsKK19VSV9Nb2RlbHNfVmlldyA9IMGhvqGiuPsKK19VSV9TY2VuYXJpb3NfVmlldyA9IKe4ob3tuPsKK19VSV9PYnNlcnZlcnNfVmlldyA9ILjxuKHJovTAxfe4+worX1VJX1NlcXVlbmNlcnNfVmlldyA9IMWhoqi69MDO8tDAxfe4+worX1VJX0RlY29yYXRvcnNfVmlldyA9IKvE7bihovTAxfe4+worX1VJX1NURU1fUHJvamVjdF9FeHBsb3JlciA9IIqnvPUgvqLwvCCsw6H2xaH9CitfVUlfQWN0aXZlX1NpbXVsYXRpb25zX1ZpZXcgPSCuzsDwzvuqIKfAocSiuPsKKworIyBNZW51CitfVUlfU1RFTV9Xb3JrQmVuY2hfTWVudSA9IIqnvPUKK19VSV9TVEVNX0FjdGlvbl9SdW4gPSC18M4KK19VSV9TVEVNX0FjdGlvbl9SdW5fVFQgPSCnwKHEoiCmuvbFqL4grMP1wKIKK19VSV9TVEVNX0FjdGlvbl9TdG9wID0gv6La8tAgCitfVUlfU1RFTV9BY3Rpb25fU3RvcF9UVCA9IKfAocSiIKa69sWoviC/otryvqIgq6i+IKa6wsSixuy47iCmuvYKK19VSV9TVEVNX0FjdGlvbl9QYXVzZSA9IL6hwb7vIKa69gorX1VJX1NURU1fQWN0aW9uX1BhdXNlX1RUID0gp8ChxKIgprr2xai+IL6hwb7vIKa69gorX1VJX1NURU1fQWN0aW9uX1N0ZXAgPSCrzvK+IMDKCitfVUlfU1RFTV9BY3Rpb25fU3RlcF9UVCA9IKfAocSiIKa69sWoviC0kCDAyiDT/afJ/NoKK19VSV9TVEVNX0FjdGlvbl9SZXNldCA9INK+or6huCCrqMEKK19VSV9TVEVNX0FjdGlvbl9SZXNldF9UVCA9IKfAocSiqMIgrMP1wCC/oqjE7Mwg0tD0wKIKKworCisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvcGx1Z2luX3poLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9wbHVnaW5femgucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjlmYjZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvcGx1Z2luX3poLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1OSBAQAorIyBDaGluZXNlCisjCisjIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgICoKKyMgICogQ29udHJpYnV0b3JzOgorIyAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgVG8gY29kZSBkZXZlbG9wZXI6CisjICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCisjICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KKyMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKKyMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3BsdWdpbk5hbWUgPSBTVEVNIFVJCisKKyMgQ29tbW9uIEtleXMKK19VSV9Db21tb25fU1RFTSA9IFNURU0KKworIyBTVEVNIE5ldyBQcm9qZWN0IFdpemFyZAorX1VJX05ld19TVEVNX1Byb2plY3RfV2l6YXJkID0gU1RFTSBQcm9qZWN0CisKKyMgVmlld3MKK19VSV9HcmFwaHNfVmlldyA9IEdyYXBocworX1VJX01vZGVsc19WaWV3ID0gTW9kZWxzCitfVUlfU2NlbmFyaW9zX1ZpZXcgPSBTY2VuYXJpb3MKK19VSV9PYnNlcnZlcnNfVmlldyA9IE9ic2VydmVycworX1VJX1NlcXVlbmNlcnNfVmlldyA9IFNlcXVlbmNlcnMKK19VSV9EZWNvcmF0b3JzX1ZpZXcgPSBEZWNvcmF0b3JzCitfVUlfU1RFTV9Qcm9qZWN0X0V4cGxvcmVyID0gU1RFTSBQcm9qZWN0IEV4cGxvcmVyCitfVUlfQWN0aXZlX1NpbXVsYXRpb25zX1ZpZXcgPSBBY3RpdmUgU2ltdWxhdGlvbnMKKworIyBNZW51CitfVUlfU1RFTV9Xb3JrQmVuY2hfTWVudSA9IFNURU0KK19VSV9TVEVNX0FjdGlvbl9SdW4gPSBSdW4KK19VSV9TVEVNX0FjdGlvbl9SdW5fVFQgPSBTdGFydCBleGVjdXRpb24gb2YgdGhlIHNpbXVsYXRpb24KK19VSV9TVEVNX0FjdGlvbl9TdG9wID0gU3RvcAorX1VJX1NURU1fQWN0aW9uX1N0b3BfVFQgPSBTdG9wIHRoZSBzaW11bGF0aW9uIGFuZCBtYWtlIGl0IGluYWN0aXZlCitfVUlfU1RFTV9BY3Rpb25fUGF1c2UgPSBQYXVzZQorX1VJX1NURU1fQWN0aW9uX1BhdXNlX1RUID0gUGF1c2UgdGhlIHNpbXVsYXRpb24KK19VSV9TVEVNX0FjdGlvbl9TdGVwID0gU3RlcCAKK19VSV9TVEVNX0FjdGlvbl9TdGVwX1RUID0gQWR2YW5jZSB0aGUgc2ltdWxhdGlvbiBieSBvbmUgdGltZSBzdGVwCitfVUlfU1RFTV9BY3Rpb25fUmVzZXQgPSBSZXNldAorX1VJX1NURU1fQWN0aW9uX1Jlc2V0X1RUID0gUmVzdG9yZSB0aGUgc2ltdWxhdGlvbiB0byBpdHMgc3RhcnRpbmcgc3RhdGUKKworCisKKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9tYXAvbWVzc2FnZXNfZW5fVVNfQ0EucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL21hcC9tZXNzYWdlc19lbl9VU19DQS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNGJjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9tYXAvbWVzc2FnZXNfZW5fVVNfQ0EucHJvcGVydGllcwpAQCAtMCwwICsxLDQ4IEBACisjIG1lc3NhZ2VzX2VuX1VTX0NBLnByb3BlcnRpZXMKKyMgQ2FsaWZvcm5pYW4KKyMgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0NvbW1vbi5BSVRPRkY9QWl0b2ZmCitDb21tb24uU0FOU09OX0ZMQU1TVEVFRD1TYW5zb24tRmxhbXN0ZWVkCitDb21tb24uQ2hvb3NlX1Byb2plY3Rpb249PCBDaG9vc2UgUHJvamVjdGlvbiA+CisKKyMgU3RlbSBQb2x5Z29uCisjIE5vdGhpbmcsIGFsbCBjb21tb24KKworIyBJbnRlcm5hbCBNYXAgVmlldworSU1WaWV3LkNob29zZV9Qcm9wZXJ0eT08IENob29zZSBQcm9wZXJ0eSA+CitJTVZpZXcuQ2hvb3NlX0RlY29yYXRvcj08IENob29zZSBEZWNvcmF0b3IgPgorSU1WaWV3LkdhaW5fRmFjdG9yPTwgR2FpbiBGYWN0b3IgPiAKKworSU1WaWV3LlBvbHlnb25fQm9yZGVycz1EcmF3IFBvbHlnb25zIEJvcmRlcnMKK0lNVmlldy5Qb2x5Z29uX0NlbnRlcnM9Q29ubmVjdCBQb2x5Z29ucyBDZW50ZXJzCisKK0lNVmlldy5Mb2dyaXRobWljX1NjYWxpbmc9TG9nYXJpdGhtaWMgU2NhbGluZworSU1WaWV3Lk9ORV9USE9VU0FORD0wLjAwMQorSU1WaWV3Lk9ORV9IVU5EUkVEVEg9MC4wMQorSU1WaWV3Lk9ORV9URU5USD0wLjEKK0lNVmlldy5PTkU9MQorSU1WaWV3LlRFTj0xMAorSU1WaWV3Lk9ORV9IVU5EUkVEPTEwMAorSU1WaWV3Lk9ORV9USE9VU0FORD0xMDAwCisKK0lNVmlldy5GR0NvbG9yPUZvcmVncm91bmQgQ29sb3IKK0lNVmlldy5CR0NvbG9yPUJhY2tncm91bmQgQ29sb3IKKworSU1WaWV3LlByb1Byb3A9UHJvamVjdGlvbiBQcm9wZXJ0aWVzCitJTVZpZXcuR1Byb3A9R2VuZXJhbCBQcm9wZXJ0aWVzCitJTVZpZXcuUFByb3A9UG9seWdvbnMgUHJvcGVydGllcworSU1WaWV3Lk1Qcm9wPU1vZGVsIFByb3BlcnRpZXMKKworCitJTVZpZXcuQ2VudGVyX01hcD1DZW50ZXIgTWFwCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL21hcC9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvbWFwL21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhYzdkNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL21hcC9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDggQEAKKyMgbWVzc2FnZXNfZXMucHJvcGVydGllcworIworIyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqCisjICogQ29udHJpYnV0b3JzOgorIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQ29tbW9uLkFJVE9GRj1BaXRvZmYKK0NvbW1vbi5TQU5TT05fRkxBTVNURUVEPVNhbnNvbi1GbGFtc3RlZWQKK0NvbW1vbi5DaG9vc2VfUHJvamVjdGlvbj08IFNlbGVjY2lvbmFyIE3pdG9kbyBkZSBQcm95ZWNjafNuID4KKworIyBTdGVtIFBvbHlnb24KKyMgTm90aGluZywgYWxsIGNvbW1vbgorCisjIEludGVybmFsIE1hcCBWaWV3CitJTVZpZXcuQ2hvb3NlX1Byb3BlcnR5PTwgU2VsZWNjaW9uYXIgQXRyaWJ1dG8gPgorSU1WaWV3LkNob29zZV9EZWNvcmF0b3I9PCBTZWxlY2Npb25hciBEZWNvcmFkb3IgPgorSU1WaWV3LkdhaW5fRmFjdG9yPTwgRmFjdG9yIGRlIEdhbmFuY2lhID4gCisKK0lNVmlldy5Qb2x5Z29uX0JvcmRlcnM9TW9zdHJhciBCb3JkZXMgZGUgUG9s7Wdvbm9zCitJTVZpZXcuUG9seWdvbl9DZW50ZXJzPUNvbmVjdGFyIENlbnRyb3MgZGUgUG9s7Wdvbm9zCisKK0lNVmlldy5Mb2dyaXRobWljX1NjYWxpbmc9RXNjYWxhIExvZ2Fy7XRtaWNhCitJTVZpZXcuT05FX1RIT1VTQU5EPTAuMDAxCitJTVZpZXcuT05FX0hVTkRSRURUSD0wLjAxCitJTVZpZXcuT05FX1RFTlRIPTAuMQorSU1WaWV3Lk9ORT0xCitJTVZpZXcuVEVOPTEwCitJTVZpZXcuT05FX0hVTkRSRUQ9MTAwCitJTVZpZXcuT05FX1RIT1VTQU5EPTEwMDAKKworSU1WaWV3LkZHQ29sb3I9Q29sb3IgZGUgUHJpbWVyIFBsYW5vCitJTVZpZXcuQkdDb2xvcj1Db2xvciBkZSBGb25kbworCitJTVZpZXcuUHJvUHJvcD1BdHJpYnV0b3MgZGUgUHJveWVjY2nzbgorSU1WaWV3LkdQcm9wPUF0cmlidXRvcyBHZW5lcmFsZXMKK0lNVmlldy5QUHJvcD1BdHJpYnV0b3MgZGUgUG9s7Wdvbm9zCitJTVZpZXcuTVByb3A9QXRyaWJ1dG9zIGRlIE1vZGVsb3MKKworCitJTVZpZXcuQ2VudGVyX01hcD1Nb3N0cmFyIENlbnRybworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9tYXAvbWVzc2FnZXNfaGUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL21hcC9tZXNzYWdlc19oZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMDUyNTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9tYXAvbWVzc2FnZXNfaGUucHJvcGVydGllcwpAQCAtMCwwICsxLDQ4IEBACisjIG1lc3NhZ2VzX2hlLnByb3BlcnRpZXMKKyMKKyMgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0NvbW1vbi5BSVRPRkY9QWl0b2ZmCitDb21tb24uU0FOU09OX0ZMQU1TVEVFRD1TYW5zb24tRmxhbXN0ZWVkCitDb21tb24uQ2hvb3NlX1Byb2plY3Rpb249PCBDaG9vc2UgUHJvamVjdGlvbiA+CisKKyMgU3RlbSBQb2x5Z29uCisjIE5vdGhpbmcsIGFsbCBjb21tb24KKworIyBJbnRlcm5hbCBNYXAgVmlldworSU1WaWV3LkNob29zZV9Qcm9wZXJ0eT08IENob29zZSBQcm9wZXJ0eSA+CitJTVZpZXcuQ2hvb3NlX0RlY29yYXRvcj08IENob29zZSBEZWNvcmF0b3IgPgorSU1WaWV3LkdhaW5fRmFjdG9yPTwgR2FpbiBGYWN0b3IgPiAKKworSU1WaWV3LlBvbHlnb25fQm9yZGVycz1EcmF3IFBvbHlnb25zIEJvcmRlcnMKK0lNVmlldy5Qb2x5Z29uX0NlbnRlcnM9Q29ubmVjdCBQb2x5Z29ucyBDZW50ZXJzCisKK0lNVmlldy5Mb2dyaXRobWljX1NjYWxpbmc9TG9nYXJpdGhtaWMgU2NhbGluZworSU1WaWV3Lk9ORV9USE9VU0FORD0wLjAwMQorSU1WaWV3Lk9ORV9IVU5EUkVEVEg9MC4wMQorSU1WaWV3Lk9ORV9URU5USD0wLjEKK0lNVmlldy5PTkU9MQorSU1WaWV3LlRFTj0xMAorSU1WaWV3Lk9ORV9IVU5EUkVEPTEwMAorSU1WaWV3Lk9ORV9USE9VU0FORD0xMDAwCisKK0lNVmlldy5GR0NvbG9yPUZvcmVncm91bmQgQ29sb3IKK0lNVmlldy5CR0NvbG9yPUJhY2tncm91bmQgQ29sb3IKKworSU1WaWV3LlByb1Byb3A9UHJvamVjdGlvbiBQcm9wZXJ0aWVzCitJTVZpZXcuR1Byb3A9R2VuZXJhbCBQcm9wZXJ0aWVzCitJTVZpZXcuUFByb3A9UG9seWdvbnMgUHJvcGVydGllcworSU1WaWV3Lk1Qcm9wPU1vZGVsIFByb3BlcnRpZXMKKworCitJTVZpZXcuQ2VudGVyX01hcD1DZW50ZXIgTWFwCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL21hcC9tZXNzYWdlc190YS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvbWFwL21lc3NhZ2VzX3RhLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI2MTBiYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL21hcC9tZXNzYWdlc190YS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDggQEAKKyMgbWVzc2FnZXNfdGEucHJvcGVydGllcworIworIyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqCisjICogQ29udHJpYnV0b3JzOgorIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQ29tbW9uLkFJVE9GRj1BaXRvZmYKK0NvbW1vbi5TQU5TT05fRkxBTVNURUVEPVNhbnNvbi1GbGFtc3RlZWQKK0NvbW1vbi5DaG9vc2VfUHJvamVjdGlvbj08IENob29zZSBQcm9qZWN0aW9uID4KKworIyBTdGVtIFBvbHlnb24KKyMgTm90aGluZywgYWxsIGNvbW1vbgorCisjIEludGVybmFsIE1hcCBWaWV3CitJTVZpZXcuQ2hvb3NlX1Byb3BlcnR5PTwgQ2hvb3NlIFByb3BlcnR5ID4KK0lNVmlldy5DaG9vc2VfRGVjb3JhdG9yPTwgQ2hvb3NlIERlY29yYXRvciA+CitJTVZpZXcuR2Fpbl9GYWN0b3I9PCBHYWluIEZhY3RvciA+IAorCitJTVZpZXcuUG9seWdvbl9Cb3JkZXJzPURyYXcgUG9seWdvbnMgQm9yZGVycworSU1WaWV3LlBvbHlnb25fQ2VudGVycz1Db25uZWN0IFBvbHlnb25zIENlbnRlcnMKKworSU1WaWV3LkxvZ3JpdGhtaWNfU2NhbGluZz1Mb2dhcml0aG1pYyBTY2FsaW5nCitJTVZpZXcuT05FX1RIT1VTQU5EPTAuMDAxCitJTVZpZXcuT05FX0hVTkRSRURUSD0wLjAxCitJTVZpZXcuT05FX1RFTlRIPTAuMQorSU1WaWV3Lk9ORT0xCitJTVZpZXcuVEVOPTEwCitJTVZpZXcuT05FX0hVTkRSRUQ9MTAwCitJTVZpZXcuT05FX1RIT1VTQU5EPTEwMDAKKworSU1WaWV3LkZHQ29sb3I9Rm9yZWdyb3VuZCBDb2xvcgorSU1WaWV3LkJHQ29sb3I9QmFja2dyb3VuZCBDb2xvcgorCitJTVZpZXcuUHJvUHJvcD1Qcm9qZWN0aW9uIFByb3BlcnRpZXMKK0lNVmlldy5HUHJvcD1HZW5lcmFsIFByb3BlcnRpZXMKK0lNVmlldy5QUHJvcD1Qb2x5Z29ucyBQcm9wZXJ0aWVzCitJTVZpZXcuTVByb3A9TW9kZWwgUHJvcGVydGllcworCisKK0lNVmlldy5DZW50ZXJfTWFwPUNlbnRlciBNYXAKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvbWFwL21lc3NhZ2VzX3poLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9tYXAvbWVzc2FnZXNfemgucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2UzYzBmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvbWFwL21lc3NhZ2VzX3poLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0OCBAQAorIyBtZXNzYWdlc196aC5wcm9wZXJ0aWVzCisjCisjIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitDb21tb24uQUlUT0ZGPUFpdG9mZgorQ29tbW9uLlNBTlNPTl9GTEFNU1RFRUQ9U2Fuc29uLUZsYW1zdGVlZAorQ29tbW9uLkNob29zZV9Qcm9qZWN0aW9uPTwgQ2hvb3NlIFByb2plY3Rpb24gPgorCisjIFN0ZW0gUG9seWdvbgorIyBOb3RoaW5nLCBhbGwgY29tbW9uCisKKyMgSW50ZXJuYWwgTWFwIFZpZXcKK0lNVmlldy5DaG9vc2VfUHJvcGVydHk9PCBDaG9vc2UgUHJvcGVydHkgPgorSU1WaWV3LkNob29zZV9EZWNvcmF0b3I9PCBDaG9vc2UgRGVjb3JhdG9yID4KK0lNVmlldy5HYWluX0ZhY3Rvcj08IEdhaW4gRmFjdG9yID4gCisKK0lNVmlldy5Qb2x5Z29uX0JvcmRlcnM9RHJhdyBQb2x5Z29ucyBCb3JkZXJzCitJTVZpZXcuUG9seWdvbl9DZW50ZXJzPUNvbm5lY3QgUG9seWdvbnMgQ2VudGVycworCitJTVZpZXcuTG9ncml0aG1pY19TY2FsaW5nPUxvZ2FyaXRobWljIFNjYWxpbmcKK0lNVmlldy5PTkVfVEhPVVNBTkQ9MC4wMDEKK0lNVmlldy5PTkVfSFVORFJFRFRIPTAuMDEKK0lNVmlldy5PTkVfVEVOVEg9MC4xCitJTVZpZXcuT05FPTEKK0lNVmlldy5URU49MTAKK0lNVmlldy5PTkVfSFVORFJFRD0xMDAKK0lNVmlldy5PTkVfVEhPVVNBTkQ9MTAwMAorCitJTVZpZXcuRkdDb2xvcj1Gb3JlZ3JvdW5kIENvbG9yCitJTVZpZXcuQkdDb2xvcj1CYWNrZ3JvdW5kIENvbG9yCisKK0lNVmlldy5Qcm9Qcm9wPVByb2plY3Rpb24gUHJvcGVydGllcworSU1WaWV3LkdQcm9wPUdlbmVyYWwgUHJvcGVydGllcworSU1WaWV3LlBQcm9wPVBvbHlnb25zIFByb3BlcnRpZXMKK0lNVmlldy5NUHJvcD1Nb2RlbCBQcm9wZXJ0aWVzCisKKworSU1WaWV3LkNlbnRlcl9NYXA9Q2VudGVyIE1hcAorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9tZXNzYWdlc19lbl9VU19DQS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvbWVzc2FnZXNfZW5fVVNfQ0EucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzI2MTk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvbWVzc2FnZXNfZW5fVVNfQ0EucHJvcGVydGllcwpAQCAtMCwwICsxLDIzIEBACisjIG1lc3NhZ2VzX2VuX1VTX0NBLnByb3BlcnRpZXMKKyMgQ2FsaWZvcm5pYW4gRW5nbGlzaAorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitOU1RFTVByb1dpei5jcmVhdGluZ19kaXJlY3RvcmllcyA9IENyZWF0aW5nIHByb2plY3QgZGlyZWN0b3JpZXMKK05TVEVNUHJvV2l6LmNyZWF0aW5nX3Byb2plY3QgPSBDcmVhdGluZyBuZXcgU1RFTSBwcm9qZWN0CitOU1RFTVByb1dpei5wYWdlX3RpdGxlID0gU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgbmV3IFNURU0gUHJvamVjdAorTlNURU1Qcm9XaXoudGl0bGUgPSBDcmVhdGUgYSBTVEVNIHByb2plY3QKK05TVEVNUHJvV2l6LnBhZ2VfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgU1RFTSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2Ugb3IgaW4gYW4gZXh0ZXJuYWwgbG9jYXRpb24uCisKK05TVEVNUHJvV2l6LmdyYXBoX2ZvbGRlciA9IEdyYXBocworTlNURU1Qcm9XaXoubW9kZWxfZm9sZGVyID0gTW9kZWxzCitOU1RFTVByb1dpei5zY2VuYXJpb19mb2xkZXIgPSBTY2VuYXJpb3MKK05TVEVNUHJvV2l6LmRlY29yYXRvcl9mb2xkZXIgPSBEZWNvcmF0b3JzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvbWVzc2FnZXNfZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2QxZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvbWVzc2FnZXNfZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDIzIEBACisjIG1lc3NhZ2VzX2VzLnByb3BlcnRpZXMKKyMgU3BhbmlzaAorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitOU1RFTVByb1dpei5jcmVhdGluZ19kaXJlY3RvcmllcyA9IENvbW8gY3JlYXIgZGlyZWN0b3Jpb3MgZGUgcHJveWVjdG8KK05TVEVNUHJvV2l6LmNyZWF0aW5nX3Byb2plY3QgPSBDb21vIGNyZWFyIHVuIG51ZXZvIHByb3llY3RvCitOU1RFTVByb1dpei5wYWdlX3RpdGxlID0gTm9tYnJlIGRlbCBwcm95ZWN0bworTlNURU1Qcm9XaXoudGl0bGUgPSBDcmVhciB1biBudWV2byBwcm95ZWN0bworTlNURU1Qcm9XaXoucGFnZV9kZXNjcmlwdGlvbiA9IENyZWFyIHVuIHByb3llY3RvIG51ZXZvIGVuIGVsIOFyZWEgZGUgdHJhYmFqbyBvIGVuIG90cmEgdWJpY2FjafNuIAorCitOU1RFTVByb1dpei5ncmFwaF9mb2xkZXIgPSBHcmFmb3MKK05TVEVNUHJvV2l6Lm1vZGVsX2ZvbGRlciA9IE1vZGVsb3MKK05TVEVNUHJvV2l6LnNjZW5hcmlvX2ZvbGRlciA9IEVzY2VuYXJpb3MKK05TVEVNUHJvV2l6LmRlY29yYXRvcl9mb2xkZXIgPSBNb2RpZmljYWRvcmVzIGRlIEdyYWZvcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL21lc3NhZ2VzX2hlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9tZXNzYWdlc19oZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDM5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9tZXNzYWdlc19oZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjMgQEAKKyMgbWVzc2FnZXNfaGUucHJvcGVydGllcworIyBIZWJyZXcKKyMvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqCisjICogQ29udHJpYnV0b3JzOgorIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTlNURU1Qcm9XaXouY3JlYXRpbmdfZGlyZWN0b3JpZXMgPSBDcmVhdGluZyBwcm9qZWN0IGRpcmVjdG9yaWVzCitOU1RFTVByb1dpei5jcmVhdGluZ19wcm9qZWN0ID0gQ3JlYXRpbmcgbmV3IFNURU0gcHJvamVjdAorTlNURU1Qcm9XaXoucGFnZV90aXRsZSA9IFNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIG5ldyBTVEVNIFByb2plY3QKK05TVEVNUHJvV2l6LnRpdGxlID0gQ3JlYXRlIGEgU1RFTSBwcm9qZWN0CitOU1RFTVByb1dpei5wYWdlX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IFNURU0gcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlIG9yIGluIGFuIGV4dGVybmFsIGxvY2F0aW9uLgorCitOU1RFTVByb1dpei5ncmFwaF9mb2xkZXIgPSBHcmFwaHMKK05TVEVNUHJvV2l6Lm1vZGVsX2ZvbGRlciA9IE1vZGVscworTlNURU1Qcm9XaXouc2NlbmFyaW9fZm9sZGVyID0gU2NlbmFyaW9zCitOU1RFTVByb1dpei5kZWNvcmF0b3JfZm9sZGVyID0gRGVjb3JhdG9ycwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvbWVzc2FnZXNfdGEucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL21lc3NhZ2VzX3RhLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3MTk4YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL21lc3NhZ2VzX3RhLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMyBAQAorIyBtZXNzYWdlc190YS5wcm9wZXJ0aWVzCisjIFRhbWlsCisjLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK05TVEVNUHJvV2l6LmNyZWF0aW5nX2RpcmVjdG9yaWVzID0gQ3JlYXRpbmcgcHJvamVjdCBkaXJlY3RvcmllcworTlNURU1Qcm9XaXouY3JlYXRpbmdfcHJvamVjdCA9IENyZWF0aW5nIG5ldyBTVEVNIHByb2plY3QKK05TVEVNUHJvV2l6LnBhZ2VfdGl0bGUgPSBTcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBuZXcgU1RFTSBQcm9qZWN0CitOU1RFTVByb1dpei50aXRsZSA9IENyZWF0ZSBhIFNURU0gcHJvamVjdAorTlNURU1Qcm9XaXoucGFnZV9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBTVEVNIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZSBvciBpbiBhbiBleHRlcm5hbCBsb2NhdGlvbi4KKworTlNURU1Qcm9XaXouZ3JhcGhfZm9sZGVyID0gR3JhcGhzCitOU1RFTVByb1dpei5tb2RlbF9mb2xkZXIgPSBNb2RlbHMKK05TVEVNUHJvV2l6LnNjZW5hcmlvX2ZvbGRlciA9IFNjZW5hcmlvcworTlNURU1Qcm9XaXouZGVjb3JhdG9yX2ZvbGRlciA9IERlY29yYXRvcnMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL21lc3NhZ2VzX3poLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9tZXNzYWdlc196aC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhY2M1NTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9tZXNzYWdlc196aC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjMgQEAKKyMgbWVzc2FnZXMucHJvcGVydGllcworIyBDaGluZXNlCisjLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK05TVEVNUHJvV2l6LmNyZWF0aW5nX2RpcmVjdG9yaWVzID0gQ3JlYXRpbmcgcHJvamVjdCBkaXJlY3RvcmllcworTlNURU1Qcm9XaXouY3JlYXRpbmdfcHJvamVjdCA9IENyZWF0aW5nIG5ldyBTVEVNIHByb2plY3QKK05TVEVNUHJvV2l6LnBhZ2VfdGl0bGUgPSBTcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBuZXcgU1RFTSBQcm9qZWN0CitOU1RFTVByb1dpei50aXRsZSA9IENyZWF0ZSBhIFNURU0gcHJvamVjdAorTlNURU1Qcm9XaXoucGFnZV9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBTVEVNIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZSBvciBpbiBhbiBleHRlcm5hbCBsb2NhdGlvbi4KKworTlNURU1Qcm9XaXouZ3JhcGhfZm9sZGVyID0gR3JhcGhzCitOU1RFTVByb1dpei5tb2RlbF9mb2xkZXIgPSBNb2RlbHMKK05TVEVNUHJvV2l6LnNjZW5hcmlvX2ZvbGRlciA9IFNjZW5hcmlvcworTlNURU1Qcm9XaXouZGVjb3JhdG9yX2ZvbGRlciA9IERlY29yYXRvcnMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvbWVzc2FnZXNfZW5fQ0EucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvbWVzc2FnZXNfZW5fQ0EucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTNhZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9tZXNzYWdlc19lbl9DQS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjQgQEAKKyMgV2l6YXJkTWVzc2FnZXNfZW5fQ0EucHJvcGVydGllcworIyBDYW5hZGlhbiBFbmdsaXNoCisjLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK05TVEVNUHJvV2l6LmNyZWF0aW5nX2RpcmVjdG9yaWVzID0gQ3JlYXRpbmcgcHJvamVjdCBkaXJlY3RvcmllcworTlNURU1Qcm9XaXouY3JlYXRpbmdfcHJvamVjdCA9IENyZWF0aW5nIG5ldyBTVEVNIHByb2plY3QKK05TVEVNUHJvV2l6LnBhZ2VfdGl0bGUgPSBTcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBuZXcgU1RFTSBQcm9qZWN0CitOU1RFTVByb1dpei50aXRsZSA9IENyZWF0ZSBhIFNURU0gcHJvamVjdAorTlNURU1Qcm9XaXoucGFnZV9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBTVEVNIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZSBvciBpbiBhbiBleHRlcm5hbCBsb2NhdGlvbi4KKworTlNURU1Qcm9XaXouZ3JhcGhfZm9sZGVyID0gR3JhcGhzCitOU1RFTVByb1dpei5tb2RlbF9mb2xkZXIgPSBNb2RlbHMKK05TVEVNUHJvV2l6LnNjZW5hcmlvX2ZvbGRlciA9IFNjZW5hcmlvcworTlNURU1Qcm9XaXouZGVjb3JhdG9yX2ZvbGRlciA9IERlY29yYXRvcnMKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9tZXNzYWdlc19lbl9VU19DQS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9tZXNzYWdlc19lbl9VU19DQS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzkwNWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL21lc3NhZ2VzX2VuX1VTX0NBLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMyBAQAorIyBXaXphcmRNZXNzYWdlc19lbl9VU19DQS5wcm9wZXJ0aWVzCisjIENhbGlmb3JuaWFuCisjLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK05TVEVNUHJvV2l6LmNyZWF0aW5nX2RpcmVjdG9yaWVzID0gQ3JlYXRpbmcgc29tZSBrbmFybGV5IHByb2plY3QgZGlyZWN0b3JpZXMsIER1ZGUhCitOU1RFTVByb1dpei5jcmVhdGluZ19wcm9qZWN0ID0gQ3JlYXRpbmcgYSB0b3RhbGx5IGF3ZXNvbWUgU1RFTSBwcm9qZWN0LCBEdWRlIQorTlNURU1Qcm9XaXoucGFnZV90aXRsZSA9IExpa2UsIHdoYXQncyB0aGUgbmFtZSBvZiB0aGUgbmV3IFNURU0gUHJvamVjdAorTlNURU1Qcm9XaXoudGl0bGUgPSBDcmVhdGUgb25lIHRvdGFsbHkgYXdlc29tZSBTVEVNIHByb2plY3QhCitOU1RFTVByb1dpei5wYWdlX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IFNURU0gcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlIG9yIGluIGFuIGV4dGVybmFsIGxvY2F0aW9uLgorCitOU1RFTVByb1dpei5ncmFwaF9mb2xkZXIgPSBHcmFwaHMKK05TVEVNUHJvV2l6Lm1vZGVsX2ZvbGRlciA9IE1vZGVscworTlNURU1Qcm9XaXouc2NlbmFyaW9fZm9sZGVyID0gU2NlbmFyaW9zCitOU1RFTVByb1dpei5kZWNvcmF0b3JfZm9sZGVyID0gRGVjb3JhdG9ycwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczN2FlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNCBAQAorIyBXaXphcmRNZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisjIFNwYW5pc2gKKyMvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqCisjICogQ29udHJpYnV0b3JzOgorIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTlNURU1Qcm9XaXouY3JlYXRpbmdfZGlyZWN0b3JpZXMgPSBDb21vIGNyZWFyIGRpcmVjdG9yaW9zIGRlIHByb3llY3RvCitOU1RFTVByb1dpei5jcmVhdGluZ19wcm9qZWN0ID0gQ29tbyBjcmVhciB1biBudWV2byBwcm95ZWN0bworTlNURU1Qcm9XaXoucGFnZV90aXRsZSA9IE5vbWJyZSBkZWwgcHJveWVjdG8KK05TVEVNUHJvV2l6LnRpdGxlID0gQ3JlYXIgdW4gbnVldm8gcHJveWVjdG8KK05TVEVNUHJvV2l6LnBhZ2VfZGVzY3JpcHRpb24gPSBDcmVhciB1biBwcm95ZWN0byBudWV2byBlbiBlbCDhcmVhIGRlIHRyYWJham8gbyBlbiBvdHJhIHViaWNhY2nzbgorCitOU1RFTVByb1dpei5ncmFwaF9mb2xkZXIgPSBHcmFmb3MKK05TVEVNUHJvV2l6Lm1vZGVsX2ZvbGRlciA9IE1vZGVsb3MKK05TVEVNUHJvV2l6LnNjZW5hcmlvX2ZvbGRlciA9IEVzY2VuYXJpb3MKK05TVEVNUHJvV2l6LmRlY29yYXRvcl9mb2xkZXIgPSBNb2RpZmljYWRvcmVzIGRlIEdyYWZvcworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL21lc3NhZ2VzX2hlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL21lc3NhZ2VzX2hlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ1ZmYzMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvbWVzc2FnZXNfaGUucHJvcGVydGllcwpAQCAtMCwwICsxLDIzIEBACisjIFdpemFyZE1lc3NhZ2VzX2hlLnByb3BlcnRpZXMKKyMgSGVicmV3CisjLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK05TVEVNUHJvV2l6LmNyZWF0aW5nX2RpcmVjdG9yaWVzID0gQ3JlYXRpbmcgcHJvamVjdCBkaXJlY3RvcmllcworTlNURU1Qcm9XaXouY3JlYXRpbmdfcHJvamVjdCA9IENyZWF0aW5nIG5ldyBTVEVNIHByb2plY3QKK05TVEVNUHJvV2l6LnBhZ2VfdGl0bGUgPSBTcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBuZXcgU1RFTSBQcm9qZWN0CitOU1RFTVByb1dpei50aXRsZSA9IENyZWF0ZSBhIFNURU0gcHJvamVjdAorTlNURU1Qcm9XaXoucGFnZV9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBTVEVNIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZSBvciBpbiBhbiBleHRlcm5hbCBsb2NhdGlvbi4KKworTlNURU1Qcm9XaXouZ3JhcGhfZm9sZGVyID0gR3JhcGhzCitOU1RFTVByb1dpei5tb2RlbF9mb2xkZXIgPSBNb2RlbHMKK05TVEVNUHJvV2l6LnNjZW5hcmlvX2ZvbGRlciA9IFNjZW5hcmlvcworTlNURU1Qcm9XaXouZGVjb3JhdG9yX2ZvbGRlciA9IERlY29yYXRvcnMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvbWVzc2FnZXNfdGEucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvbWVzc2FnZXNfdGEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWY4MGI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9tZXNzYWdlc190YS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjQgQEAKKyMgbWVzc2FnZXNfdGEucHJvcGVydGllcworIyBUYW1pbAorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitOU1RFTVByb1dpei5jcmVhdGluZ19kaXJlY3RvcmllcyA9IL6i8LzyvqL9IKuovNe4+yCv1cWh7Lj0wM64osjQCitOU1RFTVByb1dpei5jcmVhdGluZ19wcm9qZWN0ID0g0r6iwiCKp7z1IL6i8Lz1IK/VxaHsuPTAzriiyNAKK05TVEVNUHJvV2l6LnBhZ2VfdGl0bGUgPSDSvqLCIIqnvPUgvqLwvPK+ov0gpsDCqMMgzMii9MCizgorTlNURU1Qcm9XaXoudGl0bGUgPSDSvqLCIIqnvPUgvqLwvPKoviCv1cWh7MwKK05TVEVNUHJvV2l6LnBhZ2VfZGVzY3JpcHRpb24gPSDSvqLCIIqnvPUgvqLwvPKoviDAvaLCovQgwMP0wKL4IKv4xNAg0sjForzyvqL4IK/VxaHszAorCitOU1RFTVByb1dpei5ncmFwaF9mb2xkZXIgPSDFqMPAvO24+worTlNURU1Qcm9XaXoubW9kZWxfZm9sZGVyID0gwaG+oaK4+worTlNURU1Qcm9XaXouc2NlbmFyaW9fZm9sZGVyID0gp7ihve24+worTlNURU1Qcm9XaXouZGVjb3JhdG9yX2ZvbGRlciA9IKvE7bihovTAxfe4+worCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL21lc3NhZ2VzX3poLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLm5sMS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL21lc3NhZ2VzX3poLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4ZjgzZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkubmwxL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvbWVzc2FnZXNfemgucHJvcGVydGllcwpAQCAtMCwwICsxLDI0IEBACisjIFdpemFyZE1lc3NhZ2VzX3poLnByb3BlcnRpZXMKKyMgQ2hpbmVzZQorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitOU1RFTVByb1dpei5jcmVhdGluZ19kaXJlY3RvcmllcyA9IENyZWF0aW5nIHByb2plY3QgZGlyZWN0b3JpZXMKK05TVEVNUHJvV2l6LmNyZWF0aW5nX3Byb2plY3QgPSBDcmVhdGluZyBuZXcgU1RFTSBwcm9qZWN0CitOU1RFTVByb1dpei5wYWdlX3RpdGxlID0gU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgbmV3IFNURU0gUHJvamVjdAorTlNURU1Qcm9XaXoudGl0bGUgPSBDcmVhdGUgYSBTVEVNIHByb2plY3QKK05TVEVNUHJvV2l6LnBhZ2VfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgU1RFTSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2Ugb3IgaW4gYW4gZXh0ZXJuYWwgbG9jYXRpb24uCisKK05TVEVNUHJvV2l6LmdyYXBoX2ZvbGRlciA9IEdyYXBocworTlNURU1Qcm9XaXoubW9kZWxfZm9sZGVyID0gTW9kZWxzCitOU1RFTVByb1dpei5zY2VuYXJpb19mb2xkZXIgPSBTY2VuYXJpb3MKK05TVEVNUHJvV2l6LmRlY29yYXRvcl9mb2xkZXIgPSBEZWNvcmF0b3JzCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZTg2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkODhmNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxwcm9qZWN0RGVzY3JpcHRpb24+DQorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVsczwvbmFtZT4NCisJPGNvbW1lbnQ+PC9jb21tZW50Pg0KKwk8cHJvamVjdHM+DQorCTwvcHJvamVjdHM+DQorCTxidWlsZFNwZWM+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJPC9idWlsZFNwZWM+DQorCTxuYXR1cmVzPg0KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCisJPC9uYXR1cmVzPg0KKzwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZDU4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsMTUgQEAKKyNUdWUgU2VwIDAxIDE2OjU1OjE1IEVEVCAyMDA5CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb249cmV0dXJuX3RhZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzk4NmYzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMjMgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMA0KK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUNCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHM7c2luZ2xldG9uOj10cnVlDQorQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcg0KK0J1bmRsZS1DbGFzc1BhdGg6IC4NCitCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuQWN0aXZhdG9yDQorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQ0KK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbg0KK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQ0KK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJlc2VudGF0aW9uDQorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCisgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7dmlzaWJpbGl0eTo9cmVleHBvcnQsDQorIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVsczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsDQorIG9yZy5lY2xpcHNlLnVpLmlkZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LA0KKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2Uuc3RlbS51aSwNCisgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucywNCisgb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeQ0KK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzQ5NGNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNSBAQAorDQorIyA8Y29weXJpZ2h0Pg0KKyMgPC9jb3B5cmlnaHQ+DQorIw0KKyMgJElkJA0KKw0KK2Jpbi5pbmNsdWRlcyA9IC4sXA0KKyAgICAgICAgICAgICAgIGljb25zLyxcDQorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcDQorICAgICAgICAgICAgICAgYmluLw0KK2phcnMuY29tcGlsZS5vcmRlciA9IC4NCitzb3VyY2UuLiA9IHNyYy8NCitvdXRwdXQuLiA9IGJpbi8NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9jdXN0b20xNi9wb3B1bGF0aW9uaW5pdGlhbGl6ZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvcG9wdWxhdGlvbmluaXRpYWxpemVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOWJmOGMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvcG9wdWxhdGlvbmluaXRpYWxpemVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9jdXN0b20xNi9wb3B1bGF0aW9ubW9kZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvcG9wdWxhdGlvbm1vZGVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDZmOTMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvcG9wdWxhdGlvbm1vZGVsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9jdXN0b20xNi9wb3B1bGF0aW9ubW9kZWwucHNkIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvcG9wdWxhdGlvbm1vZGVsLnBzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2ZjY2YwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvY3VzdG9tMTYvcG9wdWxhdGlvbm1vZGVsLnBzZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9MYWJlbHNNb2RlbEZpbGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvTGFiZWxzTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjUxNzkyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvb2JqMTYvTGFiZWxzTW9kZWxGaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9TdGFuZGFyZE1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC9vYmoxNi9TdGFuZGFyZE1vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlMmY4YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL29iajE2L1N0YW5kYXJkTW9kZWxGaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC93aXpiYW4vTmV3TGFiZWxzLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9pY29ucy9mdWxsL3dpemJhbi9OZXdMYWJlbHMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZmQxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC93aXpiYW4vTmV3TGFiZWxzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvaWNvbnMvZnVsbC93aXpiYW4vTmV3U3RhbmRhcmQuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvd2l6YmFuL05ld1N0YW5kYXJkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWYzMTJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL2ljb25zL2Z1bGwvd2l6YmFuL05ld1N0YW5kYXJkLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5YWQxMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9wbHVnaW4ucHJvcGVydGllcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNmE5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvcGx1Z2luLnhtbApAQCAtMCwwICsxLDE0OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+DQorDQorPCEtLQ0KKyA8Y29weXJpZ2h0Pg0KKyA8L2NvcHlyaWdodD4NCisNCisgJElkJA0KKy0tPg0KKw0KKzxwbHVnaW4+DQorDQorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+DQorICAgICAgPGNhdGVnb3J5DQorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5XaXphcmQuY2F0ZWdvcnkuSUQiDQorICAgICAgICAgICAgbmFtZT0iJV9VSV9XaXphcmRfY2F0ZWdvcnkiLz4NCisgICAgICA8d2l6YXJkDQorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5wcmVzZW50YXRpb24uU3RhbmRhcmRNb2RlbFdpemFyZElEIg0KKyAgICAgICAgICAgIG5hbWU9IiVfVUlfU3RhbmRhcmRNb2RlbFdpemFyZF9sYWJlbCINCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByZXNlbnRhdGlvbi5TdGFuZGFyZE1vZGVsV2l6YXJkIg0KKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuV2l6YXJkLmNhdGVnb3J5LklEIg0KKyAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tMTYvcG9wdWxhdGlvbm1vZGVsLmdpZiI+DQorICAgICAgICAgPGRlc2NyaXB0aW9uPiVfVUlfU3RhbmRhcmRNb2RlbFdpemFyZF9kZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+DQorICAgICAgICAgPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIi8+DQorICAgICAgPC93aXphcmQ+DQorICAgIDx3aXphcmQNCisgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5zdGVtY2F0ZWdvcnkiDQorICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQud2l6YXJkcy5OZXdQb3B1bGF0aW9uTW9kZWxXaXphcmQiDQorICAgICAgICAgIGhhc1BhZ2VzPSJ0cnVlIg0KKyAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbTE2L3BvcHVsYXRpb25tb2RlbC5naWYiDQorICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJlc2VudGF0aW9uLlN0YW5kYXJkTW9kZWxXaXphcmRJRCINCisgICAgICAgICAgbmFtZT0iJV9VSV9OZXdfUG9wdWxhdGlvbl9Nb2RlbCIvPg0KKyAgICA8d2l6YXJkDQorICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuc3RlbWNhdGVnb3J5Ig0KKyAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLndpemFyZHMuTmV3UG9wdWxhdGlvbkluaXRpYWxpemVyV2l6YXJkIg0KKyAgICAgICAgICBoYXNQYWdlcz0idHJ1ZSINCisgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdXN0b20xNi9wb3B1bGF0aW9uaW5pdGlhbGl6ZXIuZ2lmIg0KKyAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByZXNlbnRhdGlvbi5TdGFuZGFyZE1vZGVsV2l6YXJkSUQiDQorICAgICAgICAgIG5hbWU9IiVfVUlfTmV3X1BvcHVsYXRpb25fSW5pdGlhbGl6ZXIiLz4gICAgICANCisgICA8L2V4dGVuc2lvbj4NCisNCisJPGV4dGVuc2lvbg0KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4NCisgICAgIDx2aWV3DQorICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cyINCisgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnBvcHVsYXRpb25tb2RlbC5Qb3B1bGF0aW9uTW9kZWxWaWV3Ig0KKyAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdXN0b20xNi9wb3B1bGF0aW9ubW9kZWwuZ2lmIg0KKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MucG9wdWxhdGlvbm1vZGVscyINCisgICAgICAgICAgIG5hbWU9IiVfVUlfUFZpZXdfTmFtZSIvPg0KKyAgICAgPHZpZXcNCisgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzIg0KKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MucG9wdWxhdGlvbm1vZGVsLlBvcHVsYXRpb25Jbml0aWFsaXplclZpZXciDQorICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbTE2L3BvcHVsYXRpb25pbml0aWFsaXplci5naWYiDQorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5wb3B1bGF0aW9uaW5pdGlhbGl6ZXIiDQorICAgICAgICAgICBuYW1lPSIlX1VJX1BJVmlld19OYW1lIi8+ICAgICAgDQorICA8L2V4dGVuc2lvbj4NCisgIA0KKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPg0KKyAgICAgIDxlZGl0b3INCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByZXNlbnRhdGlvbi5TdGFuZGFyZEVkaXRvcklEIg0KKyAgICAgICAgICAgIG5hbWU9IiVfVUlfU3RhbmRhcmRFZGl0b3JfbGFiZWwiDQorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdXN0b20xNi9wb3B1bGF0aW9ubW9kZWwuZ2lmIg0KKyAgICAgICAgICAgIGV4dGVuc2lvbnM9InN0YW5kYXJkIg0KKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJlc2VudGF0aW9uLlN0YW5kYXJkRWRpdG9yIg0KKyAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5wcmVzZW50YXRpb24uU3RhbmRhcmRBY3Rpb25CYXJDb250cmlidXRvciI+DQorICAgICAgPC9lZGl0b3I+DQorICAgPC9leHRlbnNpb24+DQorDQorCTxleHRlbnNpb24NCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+DQorICAgICA8bWVudUNvbnRyaWJ1dGlvbg0KKyAgICAgICAgICAgbG9jYXRpb25VUkk9Im1lbnU6b3JnLmVjbGlwc2Uuc3RlbS51aS5tZW51Lm5ld3dpemFyZHM/YWZ0ZXI9YWRkaXRpb25zIj4NCisgICAgICAgIDxjb21tYW5kDQorICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5jb21tYW5kLndpei5wb3B1bGF0aW9ubW9kZWwiDQorICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbTE2L3BvcHVsYXRpb25tb2RlbC5naWYiDQorICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qb3B1bGF0aW9uTW9kZWxXaXphcmRfbGFiZWwiDQorICAgICAgICAgICAgICBzdHlsZT0icHVzaCINCisgICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfUG9wdWxhdGlvbk1vZGVsX2Rlc2NyaXB0aW9uIj4NCisgICAgICAgIDwvY29tbWFuZD4NCisgICAgICAgICA8Y29tbWFuZA0KKyAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuY29tbWFuZC53aXoucG9wdWxhdGlvbmluaXRpYWxpemVyIg0KKyAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdXN0b20xNi9wb3B1bGF0aW9uaW5pdGlhbGl6ZXIuZ2lmIg0KKyAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUG9wdWxhdGlvbkluaXRpYWxpemVyV2l6YXJkX2xhYmVsIg0KKyAgICAgICAgICAgICAgc3R5bGU9InB1c2giDQorICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX1BvcHVsYXRpb25Jbml0aWFsaXplcl9kZXNjcmlwdGlvbiI+DQorICAgICAgICA8L2NvbW1hbmQ+DQorICAgICA8L21lbnVDb250cmlidXRpb24+DQorICAgICA8bWVudUNvbnRyaWJ1dGlvbg0KKyAgICAgICAgICAgbG9jYXRpb25VUkk9InRvb2xiYXI6b3JnLmVjbGlwc2Uuc3RlbS51aS50b29sYmFyLm5ld3dpemFyZHM/YWZ0ZXI9YWRkaXRpb25zIj4NCisgICAgICAgIDxjb21tYW5kDQorICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5jb21tYW5kLndpei5wb3B1bGF0aW9ubW9kZWwiDQorICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbTE2L3BvcHVsYXRpb25tb2RlbC5naWYiDQorICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qb3B1bGF0aW9uTW9kZWxXaXphcmRfbGFiZWwiDQorICAgICAgICAgICAgICBzdHlsZT0icHVzaCINCisgICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfUG9wdWxhdGlvbk1vZGVsX2Rlc2NyaXB0aW9uIj4NCisgICAgICAgIDwvY29tbWFuZD4NCisgICAgICAgIDxjb21tYW5kDQorICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5jb21tYW5kLndpei5wb3B1bGF0aW9uaW5pdGlhbGl6ZXIiDQorICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbTE2L3BvcHVsYXRpb25pbml0aWFsaXplci5naWYiDQorICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qb3B1bGF0aW9uSW5pdGlhbGl6ZXJXaXphcmRfbGFiZWwiDQorICAgICAgICAgICAgICBzdHlsZT0icHVzaCINCisgICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfUG9wdWxhdGlvbkluaXRpYWxpemVyX2Rlc2NyaXB0aW9uIj4NCisgICAgICAgIDwvY29tbWFuZD4NCisgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4NCisgIDwvZXh0ZW5zaW9uPg0KKyAgDQorICA8ZXh0ZW5zaW9uDQorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPg0KKyAgICAgPGNvbW1hbmQNCisgICAgICAgICAgIGRlZmF1bHRIYW5kbGVyPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQud2l6YXJkcy5OZXdQb3B1bGF0aW9uTW9kZWxXaXphcmQkTmV3UG9wdWxhdGlvbk1vZGVsV2l6YXJkQ29tbWFuZEhhbmRsZXIiDQorICAgICAgICAgICBkZXNjcmlwdGlvbj0iJV9VSV9Qb3B1bGF0aW9uTW9kZWxfZGVzY3JpcHRpb24iDQorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLmNvbW1hbmQud2l6LnBvcHVsYXRpb25tb2RlbCINCisgICAgICAgICAgIG5hbWU9IiVfVUlfUG9wdWxhdGlvbk1vZGVsV2l6YXJkX2xhYmVsIj4NCisgICAgIDwvY29tbWFuZD4NCisgICAgICA8Y29tbWFuZA0KKyAgICAgICAgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC53aXphcmRzLk5ld1BvcHVsYXRpb25Jbml0aWFsaXplcldpemFyZCROZXdQb3B1bGF0aW9uSW5pdGlhbGl6ZXJXaXphcmRDb21tYW5kSGFuZGxlciINCisgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlX1VJX1BvcHVsYXRpb25Jbml0aWFsaXplcl9kZXNjcmlwdGlvbiINCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuY29tbWFuZC53aXoucG9wdWxhdGlvbmluaXRpYWxpemVyIg0KKyAgICAgICAgICAgbmFtZT0iJV9VSV9Qb3B1bGF0aW9uSW5pdGlhbGl6ZXJXaXphcmRfbGFiZWwiPg0KKyAgICAgPC9jb21tYW5kPg0KKyAgPC9leHRlbnNpb24+DQorICANCisgIDxleHRlbnNpb24NCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4NCisgICAgICA8cGFnZQ0KKyAgICAgIAkgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlIg0KKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMucHJlZmVyZW5jZXMuUG9wdWxhdGlvblByZWZlcmVuY2VQYWdlIg0KKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnByZWZlcmVuY2VzLlBvcHVsYXRpb25QcmVmZXJlbmNlUGFnZSINCisgICAgICAgICAgICBuYW1lPSIlX1VJX1BvcHVsYXRpb25QUGFnZSIvPg0KKyAgIDwvZXh0ZW5zaW9uPg0KKyAgIDxleHRlbnNpb24NCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4NCisgICAgICA8aW5pdGlhbGl6ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiLz4NCisgICA8L2V4dGVuc2lvbj4NCisgICANCisgICA8ZXh0ZW5zaW9uDQorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3RhcnR1cCI+DQorICAgICA8c3RhcnR1cA0KKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5hZGFwdGVycy5TdGFuZGFyZFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij48L3N0YXJ0dXA+DQorICA8L2V4dGVuc2lvbj4NCisgIA0KKyAgPGV4dGVuc2lvbg0KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnN0YXJ0dXAiPg0KKyAgICAgPHN0YXJ0dXANCisgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuYWRhcHRlcnMuUG9wdWxhdGlvbk1vZGVsTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkiPjwvc3RhcnR1cD4NCisgIDwvZXh0ZW5zaW9uPg0KKyAgDQorPC9wbHVnaW4+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJlc2VudGF0aW9uL1N0YW5kYXJkQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3ByZXNlbnRhdGlvbi9TdGFuZGFyZEFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwZjk5YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3ByZXNlbnRhdGlvbi9TdGFuZGFyZEFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKQEAgLTAsMCArMSw0MzIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByZXNlbnRhdGlvbjsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29udHJvbEFjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkxvYWRSZXNvdXJjZUFjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlZhbGlkYXRlQWN0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uSXRlbTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZvciB0aGUgU3RhbmRhcmQgbW9kZWwgZWRpdG9yLg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTdGFuZGFyZEFjdGlvbkJhckNvbnRyaWJ1dG9yDQorCWV4dGVuZHMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yDQorCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7DQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgZWRpdG9yLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvclBhcnQ7DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBwcm92aWRlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGFjdGlvbiBvcGVucyB0aGUgUHJvcGVydGllcyB2aWV3Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElBY3Rpb24gc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uID0NCisJCW5ldyBBY3Rpb24oU3RhbmRhcmRFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbSIpKSB7DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQl0cnkgew0KKwkJCQkJZ2V0UGFnZSgpLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7DQorCQkJCX0NCisJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQkJU3RhbmRhcmRFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQkJCX0NCisJCQl9DQorCQl9Ow0KKw0KKwkvKioNCisJICogVGhpcyBhY3Rpb24gcmVmcmVzaGVzIHRoZSB2aWV3ZXIgb2YgdGhlIGN1cnJlbnQgZWRpdG9yIGlmIHRoZSBlZGl0b3INCisJICogaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJQWN0aW9uIHJlZnJlc2hWaWV3ZXJBY3Rpb24gPQ0KKwkJbmV3IEFjdGlvbihTdGFuZGFyZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbSIpKSB7DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgew0KKwkJCQlyZXR1cm4gYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcjsNCisJCQl9DQorDQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQlpZiAoYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgew0KKwkJCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldFZpZXdlcigpOw0KKwkJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7DQorCQkJCQkJdmlld2VyLnJlZnJlc2goKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX07DQorDQorCS8qKg0KKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gY29ycmVzcG9uZGluZyB0byBlYWNoIGRlc2NyaXB0b3INCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBjcmVhdGVDaGlsZEFjdGlvbnM7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZUNoaWxkIGFjdGlvbnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcg0KKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZVNpYmxpbmdBY3Rpb25zOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVTaWJsaW5nIGFjdGlvbnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgY29udHJpYnV0b3IuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RhbmRhcmRBY3Rpb25CYXJDb250cmlidXRvcigpIHsNCisJCXN1cGVyKEFERElUSU9OU19MQVNUX1NUWUxFKTsNCisJCWxvYWRSZXNvdXJjZUFjdGlvbiA9IG5ldyBMb2FkUmVzb3VyY2VBY3Rpb24oKTsNCisJCXZhbGlkYXRlQWN0aW9uID0gbmV3IFZhbGlkYXRlQWN0aW9uKCk7DQorCQljb250cm9sQWN0aW9uID0gbmV3IENvbnRyb2xBY3Rpb24oKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIFNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMgdG8gdGhlIHRvb2wgYmFyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7DQorCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigic3RhbmRhcmQtc2V0dGluZ3MiKSk7DQorCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigic3RhbmRhcmQtYWRkaXRpb25zIikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgdG8gdGhlIG1lbnUgYmFyIGEgbWVudSBhbmQgc29tZSBzZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zLA0KKwkgKiBhcyB3ZWxsIGFzIHRoZSBzdWItbWVudXMgZm9yIG9iamVjdCBjcmVhdGlvbiBpdGVtcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgew0KKwkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51TWFuYWdlcik7DQorDQorCQlJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoU3RhbmRhcmRFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRFZGl0b3JfbWVudSIpLCAib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkTWVudUlEIik7DQorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOw0KKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInNldHRpbmdzIikpOw0KKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFjdGlvbnMiKSk7DQorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOw0KKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucy1lbmQiKSk7DQorDQorCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVDaGlsZCBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuDQorCQkvLw0KKwkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihTdGFuZGFyZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7DQorCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIpOw0KKw0KKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlU2libGluZyBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuDQorCQkvLw0KKwkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKFN0YW5kYXJkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOw0KKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIpOw0KKw0KKwkJLy8gRm9yY2UgYW4gdXBkYXRlIGJlY2F1c2UgRWNsaXBzZSBoaWRlcyBlbXB0eSBtZW51cyBub3cuDQorCQkvLw0KKwkJc3VibWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyDQorCQkJKG5ldyBJTWVudUxpc3RlbmVyKCkgew0KKwkJCQkgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgew0KKwkJCQkJIG1lbnVNYW5hZ2VyLnVwZGF0ZUFsbCh0cnVlKTsNCisJCQkJIH0NCisJCQkgfSk7DQorDQorCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsNCisJfQ0KKw0KKwkvKioNCisJICogV2hlbiB0aGUgYWN0aXZlIGVkaXRvciBjaGFuZ2VzLCB0aGlzIHJlbWVtYmVycyB0aGUgY2hhbmdlIGFuZCByZWdpc3RlcnMgd2l0aCBpdCBhcyBhIHNlbGVjdGlvbiBwcm92aWRlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkgew0KKwkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOw0KKwkJYWN0aXZlRWRpdG9yUGFydCA9IHBhcnQ7DQorDQorCQkvLyBTd2l0Y2ggdG8gdGhlIG5ldyBzZWxlY3Rpb24gcHJvdmlkZXIuDQorCQkvLw0KKwkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsNCisJCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7DQorCQl9DQorCQlpZiAocGFydCA9PSBudWxsKSB7DQorCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBwYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOw0KKwkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsNCisNCisJCQkvLyBGYWtlIGEgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgdG8gdXBkYXRlIHRoZSBtZW51cy4NCisJCQkvLw0KKwkJCWlmIChzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSAhPSBudWxsKSB7DQorCQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfSwNCisJICogaGFuZGxpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50fXMgYnkgcXVlcnlpbmcgZm9yIHRoZSBjaGlsZHJlbiBhbmQgc2libGluZ3MNCisJICogdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGVkIG9iamVjdCBhbmQgdXBkYXRpbmcgdGhlIG1lbnVzIGFjY29yZGluZ2x5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsNCisJCS8vIFJlbW92ZSBhbnkgbWVudSBpdGVtcyBmb3Igb2xkIHNlbGVjdGlvbi4NCisJCS8vDQorCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7DQorCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zKTsNCisJCX0NCisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgew0KKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMpOw0KKwkJfQ0KKw0KKwkJLy8gUXVlcnkgdGhlIG5ldyBzZWxlY3Rpb24gZm9yIGFwcHJvcHJpYXRlIG5ldyBjaGlsZC9zaWJsaW5nIGRlc2NyaXB0b3JzDQorCQkvLw0KKwkJQ29sbGVjdGlvbjw/PiBuZXdDaGlsZERlc2NyaXB0b3JzID0gbnVsbDsNCisJCUNvbGxlY3Rpb248Pz4gbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gbnVsbDsNCisNCisJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7DQorCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnNpemUoKSA9PSAxKSB7DQorCQkJT2JqZWN0IG9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsNCisNCisJCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7DQorDQorCQkJbmV3Q2hpbGREZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgbnVsbCk7DQorCQkJbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobnVsbCwgb2JqZWN0KTsNCisJCX0NCisNCisJCS8vIEdlbmVyYXRlIGFjdGlvbnMgZm9yIHNlbGVjdGlvbjsgcG9wdWxhdGUgYW5kIHJlZHJhdyB0aGUgbWVudXMuDQorCQkvLw0KKwkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMobmV3Q2hpbGREZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsNCisJCWNyZWF0ZVNpYmxpbmdBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhuZXdTaWJsaW5nRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7DQorDQorCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7DQorCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7DQorCQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7DQorCQl9DQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsNCisJCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7DQorCQkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LA0KKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMoQ29sbGVjdGlvbjw/PiBkZXNjcmlwdG9ycywgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsNCisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7DQorCQkJZm9yIChPYmplY3QgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7DQorCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVDaGlsZEFjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gYWN0aW9uczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sDQorCSAqIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7DQorCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgew0KKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgew0KKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlU2libGluZ0FjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gYWN0aW9uczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiB3aXRoIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zDQorCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sDQorCSAqIGJ5IGluc2VydGluZyB0aGVtIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGNvbnRyaWJ1dGlvbiBpdGVtIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPi4NCisJICogSWYgPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGV5IGFyZSBzaW1wbHkgYWRkZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucywgU3RyaW5nIGNvbnRyaWJ1dGlvbklEKSB7DQorCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7DQorCQkJZm9yIChJQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMpIHsNCisJCQkJaWYgKGNvbnRyaWJ1dGlvbklEICE9IG51bGwpIHsNCisJCQkJCW1hbmFnZXIuaW5zZXJ0QmVmb3JlKGNvbnRyaWJ1dGlvbklELCBhY3Rpb24pOw0KKwkJCQl9DQorCQkJCWVsc2Ugew0KKwkJCQkJbWFuYWdlci5hZGQoYWN0aW9uKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKwkJDQorCS8qKg0KKwkgKiBUaGlzIHJlbW92ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cw0KKwkgKiBiYXNlZCBvbiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucykgew0KKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgew0KKwkJCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtYW5hZ2VyLmdldEl0ZW1zKCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgew0KKwkJCQkvLyBMb29rIGludG8gU3ViQ29udHJpYnV0aW9uSXRlbXMNCisJCQkJLy8NCisJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uSXRlbSA9IGl0ZW1zW2ldOw0KKwkJCQl3aGlsZSAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIHsNCisJCQkJCWNvbnRyaWJ1dGlvbkl0ZW0gPSAoKFN1YkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0SW5uZXJJdGVtKCk7DQorCQkJCX0NCisNCisJCQkJLy8gRGVsZXRlIHRoZSBBY3Rpb25Db250cmlidXRpb25JdGVtcyB3aXRoIG1hdGNoaW5nIGFjdGlvbi4NCisJCQkJLy8NCisJCQkJaWYgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7DQorCQkJCQlJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSljb250cmlidXRpb25JdGVtKS5nZXRBY3Rpb24oKTsNCisJCQkJCWlmIChhY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsNCisJCQkJCQltYW5hZ2VyLnJlbW92ZShjb250cmlidXRpb25JdGVtKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHBvcC11cCBtZW51IGJlZm9yZSBpdCBhcHBlYXJzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsNCisJCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7DQorCQlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG51bGw7DQorDQorCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihTdGFuZGFyZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7DQorCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7DQorCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7DQorDQorCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihTdGFuZGFyZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsNCisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOw0KKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGluc2VydHMgZ2xvYmFsIGFjdGlvbnMgYmVmb3JlIHRoZSAiYWRkaXRpb25zLWVuZCIgc2VwYXJhdG9yLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7DQorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zLWVuZCIsIG5ldyBTZXBhcmF0b3IoInVpLWFjdGlvbnMiKSk7DQorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbik7DQorDQorCQlyZWZyZXNoVmlld2VyQWN0aW9uLnNldEVuYWJsZWQocmVmcmVzaFZpZXdlckFjdGlvbi5pc0VuYWJsZWQoKSk7CQkNCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgcmVmcmVzaFZpZXdlckFjdGlvbik7DQorDQorCQlzdXBlci5hZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBlbnN1cmVzIHRoYXQgYSBkZWxldGUgYWN0aW9uIHdpbGwgY2xlYW4gdXAgYWxsIHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBvYmplY3RzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUFsbFJlZmVyZW5jZXNPbkRlbGV0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3ByZXNlbnRhdGlvbi9TdGFuZGFyZEVkaXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJlc2VudGF0aW9uL1N0YW5kYXJkRWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc3N2QyOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3ByZXNlbnRhdGlvbi9TdGFuZGFyZEVkaXRvci5qYXZhCkBAIC0wLDAgKzEsMTg0OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJlc2VudGF0aW9uOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TYXZlQXNEaWFsb2c7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lUGFnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5WaWV3ZXJQYW5lOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLmVkaXRvci5Qcm9ibGVtRWRpdG9yUGFydDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVmFsaWRhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlJdGVtRGVsZWdhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5SZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmNlbGxlZGl0b3IuQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuTG9jYWxUcmFuc2ZlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLlZpZXdlckRyYWdBZGFwdGVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5VbndyYXBwaW5nU2VsZWN0aW9uUHJvdmlkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJTWFya2VySGVscGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSVV0aWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnZpZXcuRXh0ZW5kZWRQcm9wZXJ0eVNoZWV0UGFnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByb3ZpZGVyLk1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5wcm92aWRlci5Nb2RpZmllckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJvdmlkZXIuU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5wcm92aWRlci5TZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5wcm92aWRlci5Tb2x2ZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMucHJvdmlkZXIuTGFiZWxzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOw0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIFN0YW5kYXJkIG1vZGVsIGVkaXRvci4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikgDQorcHVibGljIGNsYXNzIFN0YW5kYXJkRWRpdG9yDQorCWV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydA0KKwlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluUHJvdmlkZXIsIElTZWxlY3Rpb25Qcm92aWRlciwgSU1lbnVMaXN0ZW5lciwgSVZpZXdlclByb3ZpZGVyLCBJR290b01hcmtlciB7DQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBlZGl0aW5nIGRvbWFpbiB0aGF0IGlzIHVzZWQgdG8gdHJhY2sgYWxsIGNoYW5nZXMgdG8gdGhlIG1vZGVsLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgb25lIGFkYXB0ZXIgZmFjdG9yeSB1c2VkIGZvciBwcm92aWRpbmcgdmlld3Mgb2YgdGhlIG1vZGVsLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJQ29udGVudE91dGxpbmVQYWdlIGNvbnRlbnRPdXRsaW5lUGFnZTsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgYSBrbHVkZ2UuLi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlJ3Mgdmlld2VyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgY29udGVudE91dGxpbmVWaWV3ZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBwcm9wZXJ0eSBzaGVldCBwYWdlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFByb3BlcnR5U2hlZXRQYWdlIHByb3BlcnR5U2hlZXRQYWdlOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgdmlld2VyIHRoYXQgc2hhZG93cyB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb250ZW50IG91dGxpbmUuDQorCSAqIFRoZSBwYXJlbnQgcmVsYXRpb24gbXVzdCBiZSBjb3JyZWN0bHkgZGVmaW5lZCBmb3IgdGhpcyB0byB3b3JrLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgc2VsZWN0aW9uVmlld2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBpbnZlcnRzIHRoZSByb2xsIG9mIHBhcmVudCBhbmQgY2hpbGQgaW4gdGhlIGNvbnRlbnQgcHJvdmlkZXIgYW5kIHNob3cgcGFyZW50cyBhcyBhIHRyZWUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBwYXJlbnRWaWV3ZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIHNob3dzIGhvdyBhIHRyZWUgdmlldyB3b3Jrcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIHNob3dzIGhvdyBhIGxpc3QgdmlldyB3b3Jrcy4NCisJICogQSBsaXN0IHZpZXdlciBkb2Vzbid0IHN1cHBvcnQgaWNvbnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGlzdFZpZXdlciBsaXN0Vmlld2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBzaG93cyBob3cgYSB0YWJsZSB2aWV3IHdvcmtzLg0KKwkgKiBBIHRhYmxlIGNhbiBiZSB1c2VkIGFzIGEgbGlzdCB3aXRoIGljb25zLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBzaG93cyBob3cgYSB0cmVlIHZpZXcgd2l0aCBjb2x1bW5zIHdvcmtzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcldpdGhDb2x1bW5zOw0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIHZpZXdlciBwYW5lLCBpbiB0aGUgYm9vay4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBWaWV3ZXJQYW5lIGN1cnJlbnRWaWV3ZXJQYW5lOw0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGNvbnRlbnQgdmlld2VyLCB3aGljaCBtYXkgYmUgZWl0aGVyIG9uZSBvZiB0aGUgdmlld2VycyBpbiB0aGUgcGFnZXMgb3IgdGhlIGNvbnRlbnQgb3V0bGluZSB2aWV3ZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVmlld2VyIGN1cnJlbnRWaWV3ZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGxpc3RlbnMgdG8gd2hpY2ggZXZlciB2aWV3ZXIgaXMgYWN0aXZlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOw0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9cyB0aGF0IGFyZSBsaXN0ZW5pbmcgdG8gdGhpcyBlZGl0b3IuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPigpOw0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgc2VsZWN0aW9uIG9mIHRoZSBlZGl0b3IgYXMgYSB3aG9sZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJU2VsZWN0aW9uIGVkaXRvclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7DQorDQorCS8qKg0KKwkgKiBUaGUgTWFya2VySGVscGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB3b3Jrc3BhY2UgcmVzb3VyY2UgbWFya2VycyBwcmVzZW50ZWQNCisJICogaW4gRWNsaXBzZSdzIFByb2JsZW1zIFZpZXcuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTWFya2VySGVscGVyIG1hcmtlckhlbHBlciA9IG5ldyBFZGl0VUlNYXJrZXJIZWxwZXIoKTsNCisNCisJLyoqDQorCSAqIFRoaXMgbGlzdGVucyBmb3Igd2hlbiB0aGUgb3V0bGluZSBiZWNvbWVzIGFjdGl2ZQ0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyID0NCisJCW5ldyBJUGFydExpc3RlbmVyKCkgew0KKwkJCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcCkgew0KKwkJCQlpZiAocCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSB7DQorCQkJCQlpZiAoKChDb250ZW50T3V0bGluZSlwKS5nZXRDdXJyZW50UGFnZSgpID09IGNvbnRlbnRPdXRsaW5lUGFnZSkgew0KKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKFN0YW5kYXJkRWRpdG9yLnRoaXMpOw0KKw0KKwkJCQkJCXNldEN1cnJlbnRWaWV3ZXIoY29udGVudE91dGxpbmVWaWV3ZXIpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWVsc2UgaWYgKHAgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSB7DQorCQkJCQlpZiAoKChQcm9wZXJ0eVNoZWV0KXApLmdldEN1cnJlbnRQYWdlKCkgPT0gcHJvcGVydHlTaGVldFBhZ2UpIHsNCisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihTdGFuZGFyZEVkaXRvci50aGlzKTsNCisJCQkJCQloYW5kbGVBY3RpdmF0ZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWVsc2UgaWYgKHAgPT0gU3RhbmRhcmRFZGl0b3IudGhpcykgew0KKwkJCQkJaGFuZGxlQWN0aXZhdGUoKTsNCisJCQkJfQ0KKwkJCX0NCisJCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHApIHsNCisJCQkJLy8gSWdub3JlLg0KKwkJCX0NCisJCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHApIHsNCisJCQkJLy8gSWdub3JlLg0KKwkJCX0NCisJCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcCkgew0KKwkJCQkvLyBJZ25vcmUuDQorCQkJfQ0KKwkJCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcCkgew0KKwkJCQkvLyBJZ25vcmUuDQorCQkJfQ0KKwkJfTsNCisNCisJLyoqDQorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIHNpbmNlIGxhc3QgYWN0aXZhdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsNCisNCisJLyoqDQorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkIHNpbmNlIGxhc3QgYWN0aXZhdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsNCisNCisJLyoqDQorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBzYXZlZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBzYXZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7DQorDQorCS8qKg0KKwkgKiBNYXAgdG8gc3RvcmUgdGhlIGRpYWdub3N0aWMgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTWFwPFJlc291cmNlLCBEaWFnbm9zdGljPiByZXNvdXJjZVRvRGlhZ25vc3RpY01hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFJlc291cmNlLCBEaWFnbm9zdGljPigpOw0KKw0KKwkvKioNCisJICogQ29udHJvbHMgd2hldGhlciB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHNob3VsZCBiZSB1cGRhdGVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOw0KKw0KKwkvKioNCisJICogQWRhcHRlciB1c2VkIHRvIHVwZGF0ZSB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHdoZW4gcmVzb3VyY2VzIGFyZSBkZW1hbmRlZCBsb2FkZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRUNvbnRlbnRBZGFwdGVyIHByb2JsZW1JbmRpY2F0aW9uQWRhcHRlciA9IA0KKwkJbmV3IEVDb250ZW50QWRhcHRlcigpIHsNCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsNCisJCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZXNvdXJjZS5jbGFzcykpIHsNCisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQ6DQorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fRVJST1JTOg0KKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX1dBUk5JTkdTOiB7DQorCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOw0KKwkJCQkJCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgbnVsbCk7DQorCQkJCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgew0KKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBkaWFnbm9zdGljKTsNCisJCQkJCQkJfQ0KKwkJCQkJCQllbHNlIHsNCisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnJlbW92ZShyZXNvdXJjZSk7DQorCQkJCQkJCX0NCisNCisJCQkJCQkJaWYgKHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKSB7DQorCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjDQorCQkJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsNCisJCQkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOw0KKwkJCQkJCQkJCQkgfQ0KKwkJCQkJCQkJCSB9KTsNCisJCQkJCQkJfQ0KKwkJCQkJCQlicmVhazsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZWxzZSB7DQorCQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCQkJCX0NCisJCQl9DQorDQorCQkJQE92ZXJyaWRlDQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VGFyZ2V0KFJlc291cmNlIHRhcmdldCkgew0KKwkJCQliYXNpY1NldFRhcmdldCh0YXJnZXQpOw0KKwkJCX0NCisNCisJCQlAT3ZlcnJpZGUNCisJCQlwcm90ZWN0ZWQgdm9pZCB1bnNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsNCisJCQkJYmFzaWNVbnNldFRhcmdldCh0YXJnZXQpOw0KKwkJCX0NCisJCX07DQorDQorCS8qKg0KKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdvcmtzcGFjZSBjaGFuZ2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPQ0KKwkJbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgew0KKwkJCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgew0KKwkJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7DQorCQkJCXRyeSB7DQorCQkJCQljbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7DQorCQkJCQkJcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpOw0KKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsNCisJCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7DQorDQorCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsNCisJCQkJCQkJaWYgKGRlbHRhLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7DQorCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgfHwNCisJCQkJCQkJCSAgICBkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiBkZWx0YS5nZXRGbGFncygpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMpIHsNCisJCQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGRlbHRhLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIGZhbHNlKTsNCisJCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgew0KKwkJCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsNCisJCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsNCisJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQllbHNlIGlmICghc2F2ZWRSZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlKSkgew0KKwkJCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOw0KKwkJCQkJCQkJCQl9DQorCQkJCQkJCQkJfQ0KKwkJCQkJCQkJfQ0KKwkJCQkJCQl9DQorDQorCQkJCQkJCXJldHVybiB0cnVlOw0KKwkJCQkJCX0NCisNCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsNCisJCQkJCQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7DQorCQkJCQkJfQ0KKw0KKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRSZW1vdmVkUmVzb3VyY2VzKCkgew0KKwkJCQkJCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlczsNCisJCQkJCQl9DQorCQkJCQl9DQorDQorCQkJCQlmaW5hbCBSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpdG9yKCk7DQorCQkJCQlkZWx0YS5hY2NlcHQodmlzaXRvcik7DQorDQorCQkJCQlpZiAoIXZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgew0KKwkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMNCisJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsNCisJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJIHJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsNCisJCQkJCQkJCQkgaWYgKCFpc0RpcnR5KCkpIHsNCisJCQkJCQkJCQkJIGdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoU3RhbmRhcmRFZGl0b3IudGhpcywgZmFsc2UpOw0KKwkJCQkJCQkJCSB9DQorCQkJCQkJCQkgfQ0KKwkJCQkJCQkgfSk7DQorCQkJCQl9DQorDQorCQkJCQlpZiAoIXZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgew0KKwkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMNCisJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsNCisJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJIGNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsNCisJCQkJCQkJCQkgaWYgKGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gU3RhbmRhcmRFZGl0b3IudGhpcykgew0KKwkJCQkJCQkJCQkgaGFuZGxlQWN0aXZhdGUoKTsNCisJCQkJCQkJCQkgfQ0KKwkJCQkJCQkJIH0NCisJCQkJCQkJIH0pOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQkJU3RhbmRhcmRFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQkJCX0NCisJCQl9DQorCQl9Ow0KKw0KKwkvKioNCisJICogSGFuZGxlcyBhY3RpdmF0aW9uIG9mIHRoZSBlZGl0b3Igb3IgaXQncyBhc3NvY2lhdGVkIHZpZXdzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoKSB7DQorCQkvLyBSZWNvbXB1dGUgdGhlIHJlYWQgb25seSBzdGF0ZS4NCisJCS8vDQorCQlpZiAoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKSAhPSBudWxsKSB7DQorCQkgIGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkuY2xlYXIoKTsNCisNCisJCSAgLy8gUmVmcmVzaCBhbnkgYWN0aW9ucyB0aGF0IG1heSBiZWNvbWUgZW5hYmxlZCBvciBkaXNhYmxlZC4NCisJCSAgLy8NCisJCSAgc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsNCisJCX0NCisNCisJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsNCisJCQlpZiAoaGFuZGxlRGlydHlDb25mbGljdCgpKSB7DQorCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoU3RhbmRhcmRFZGl0b3IudGhpcywgZmFsc2UpOw0KKwkJCX0NCisJCQllbHNlIHsNCisJCQkJcmVtb3ZlZFJlc291cmNlcy5jbGVhcigpOw0KKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7DQorCQkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZSBpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7DQorCQkJY2hhbmdlZFJlc291cmNlcy5yZW1vdmVBbGwoc2F2ZWRSZXNvdXJjZXMpOw0KKwkJCWhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKTsNCisJCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7DQorCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogSGFuZGxlcyB3aGF0IHRvIGRvIHdpdGggY2hhbmdlZCByZXNvdXJjZXMgb24gYWN0aXZhdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKSB7DQorCQlpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpICYmICghaXNEaXJ0eSgpIHx8IGhhbmRsZURpcnR5Q29uZmxpY3QoKSkpIHsNCisJCQlpZiAoaXNEaXJ0eSgpKSB7DQorCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSk7DQorCQkJfQ0KKwkJCWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZmx1c2goKTsNCisNCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOw0KKwkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7DQorCQkJCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKSB7DQorCQkJCQlyZXNvdXJjZS51bmxvYWQoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOw0KKwkJCQkJfQ0KKwkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQkJCWlmICghcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAuY29udGFpbnNLZXkocmVzb3VyY2UpKSB7DQorCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisNCisJCQlpZiAoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluLmlzU3RhbGUoZWRpdG9yU2VsZWN0aW9uKSkgew0KKwkJCQlzZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7DQorCQkJfQ0KKw0KKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsNCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOw0KKwkJfQ0KKwl9DQorICANCisJLyoqDQorCSAqIFVwZGF0ZXMgdGhlIHByb2JsZW1zIGluZGljYXRpb24gd2l0aCB0aGUgaW5mb3JtYXRpb24gZGVzY3JpYmVkIGluIHRoZSBzcGVjaWZpZWQgZGlhZ25vc3RpYy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCkgew0KKwkJaWYgKHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKSB7DQorCQkJQmFzaWNEaWFnbm9zdGljIGRpYWdub3N0aWMgPQ0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljDQorCQkJCQkoRGlhZ25vc3RpYy5PSywNCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzIiwNCisJCQkJCSAwLA0KKwkJCQkJIG51bGwsDQorCQkJCQkgbmV3IE9iamVjdCBbXSB7IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSB9KTsNCisJCQlmb3IgKERpYWdub3N0aWMgY2hpbGREaWFnbm9zdGljIDogcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAudmFsdWVzKCkpIHsNCisJCQkJaWYgKGNoaWxkRGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsNCisJCQkJCWRpYWdub3N0aWMuYWRkKGNoaWxkRGlhZ25vc3RpYyk7DQorCQkJCX0NCisJCQl9DQorDQorCQkJaW50IGxhc3RFZGl0b3JQYWdlID0gZ2V0UGFnZUNvdW50KCkgLSAxOw0KKwkJCWlmIChsYXN0RWRpdG9yUGFnZSA+PSAwICYmIGdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkgaW5zdGFuY2VvZiBQcm9ibGVtRWRpdG9yUGFydCkgew0KKwkJCQkoKFByb2JsZW1FZGl0b3JQYXJ0KWdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkpLnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7DQorCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgew0KKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7DQorCQkJCX0NCisJCQl9DQorCQkJZWxzZSBpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsNCisJCQkJUHJvYmxlbUVkaXRvclBhcnQgcHJvYmxlbUVkaXRvclBhcnQgPSBuZXcgUHJvYmxlbUVkaXRvclBhcnQoKTsNCisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsNCisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0TWFya2VySGVscGVyKG1hcmtlckhlbHBlcik7DQorCQkJCXRyeSB7DQorCQkJCQlhZGRQYWdlKCsrbGFzdEVkaXRvclBhZ2UsIHByb2JsZW1FZGl0b3JQYXJ0LCBnZXRFZGl0b3JJbnB1dCgpKTsNCisJCQkJCXNldFBhZ2VUZXh0KGxhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydC5nZXRQYXJ0TmFtZSgpKTsNCisJCQkJCXNldEFjdGl2ZVBhZ2UobGFzdEVkaXRvclBhZ2UpOw0KKwkJCQkJc2hvd1RhYnMoKTsNCisJCQkJfQ0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJCQlTdGFuZGFyZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQlpZiAobWFya2VySGVscGVyLmhhc01hcmtlcnMoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKSkgew0KKwkJCQltYXJrZXJIZWxwZXIuZGVsZXRlTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOw0KKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsNCisJCQkJCXRyeSB7DQorCQkJCQkJbWFya2VySGVscGVyLmNyZWF0ZU1hcmtlcnMoZGlhZ25vc3RpYyk7DQorCQkJCQl9DQorCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCQlTdGFuZGFyZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogU2hvd3MgYSBkaWFsb2cgdGhhdCBhc2tzIGlmIGNvbmZsaWN0aW5nIGNoYW5nZXMgc2hvdWxkIGJlIGRpc2NhcmRlZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZURpcnR5Q29uZmxpY3QoKSB7DQorCQlyZXR1cm4NCisJCQlNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbg0KKwkJCQkoZ2V0U2l0ZSgpLmdldFNoZWxsKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9GaWxlQ29uZmxpY3RfbGFiZWwiKSwNCisJCQkJIGdldFN0cmluZygiX1dBUk5fRmlsZUNvbmZsaWN0IikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYSBtb2RlbCBlZGl0b3IuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RhbmRhcmRFZGl0b3IoKSB7DQorCQlzdXBlcigpOw0KKwkJaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBzZXRzIHVwIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1vZGVsIGVkaXRvci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFZGl0aW5nRG9tYWluKCkgew0KKwkJLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlpZWxkcyBpdGVtIHByb3ZpZGVycy4NCisJCS8vDQorCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkuRGVzY3JpcHRvci5SZWdpc3RyeS5JTlNUQU5DRSk7DQorDQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTdGFuZGFyZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IENvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEdyYXBoSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RpZmllckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU29sdmVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTGFiZWxzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorDQorCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUgZXhlY3V0ZWQuDQorCQkvLw0KKwkJQmFzaWNDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrID0gbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCk7DQorDQorCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLg0KKwkJLy8NCisJCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcg0KKwkJCShuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7DQorCQkJCSBwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGZpbmFsIEV2ZW50T2JqZWN0IGV2ZW50KSB7DQorCQkJCQkgZ2V0Q29udGFpbmVyKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYw0KKwkJCQkJCSAobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJCQkgIHB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCSAgZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOw0KKw0KKwkJCQkJCQkJICAvLyBUcnkgdG8gc2VsZWN0IHRoZSBhZmZlY3RlZCBvYmplY3RzLg0KKwkJCQkJCQkJICAvLw0KKwkJCQkJCQkJICBDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spZXZlbnQuZ2V0U291cmNlKCkpLmdldE1vc3RSZWNlbnRDb21tYW5kKCk7DQorCQkJCQkJCQkgIGlmIChtb3N0UmVjZW50Q29tbWFuZCAhPSBudWxsKSB7DQorCQkJCQkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihtb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7DQorCQkJCQkJCQkgIH0NCisJCQkJCQkJCSAgaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwgJiYgIXByb3BlcnR5U2hlZXRQYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsNCisJCQkJCQkJCQkgIHByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsNCisJCQkJCQkJCSAgfQ0KKwkJCQkJCQkgIH0NCisJCQkJCQkgIH0pOw0KKwkJCQkgfQ0KKwkJCSB9KTsNCisNCisJCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4NCisJCS8vDQorCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgQm9vbGVhbj4oKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgaGVyZSBmb3IgdGhlIGxpc3RlbmVyIHRvIGJlIGFibGUgdG8gY2FsbCBpdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCQkJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgYWN0aW9uKSB7DQorCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UoYWN0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBzZXRzIHRoZSBzZWxlY3Rpb24gaW50byB3aGljaGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgew0KKwkJZmluYWwgQ29sbGVjdGlvbjw/PiB0aGVTZWxlY3Rpb24gPSBjb2xsZWN0aW9uOw0KKwkJLy8gTWFrZSBzdXJlIGl0J3Mgb2theS4NCisJCS8vDQorCQlpZiAodGhlU2VsZWN0aW9uICE9IG51bGwgJiYgIXRoZVNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCisJCQlSdW5uYWJsZSBydW5uYWJsZSA9DQorCQkJCW5ldyBSdW5uYWJsZSgpIHsNCisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBpdGVtcyBpbiB0aGUgY3VycmVudCBjb250ZW50IHZpZXdlciBvZiB0aGUgZWRpdG9yLg0KKwkJCQkJCS8vDQorCQkJCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgew0KKwkJCQkJCQljdXJyZW50Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0aGVTZWxlY3Rpb24udG9BcnJheSgpKSwgdHJ1ZSk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9Ow0KKwkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMocnVubmFibGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGVkaXRpbmcgZG9tYWluIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSUVkaXRpbmdEb21haW5Qcm92aWRlcn0gaW50ZXJmYWNlLg0KKwkgKiBUaGlzIGlzIGltcG9ydGFudCBmb3IgaW1wbGVtZW50aW5nIHRoZSBzdGF0aWMgbWV0aG9kcyBvZiB7QGxpbmsgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWlufQ0KKwkgKiBhbmQgZm9yIHN1cHBvcnRpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9ufS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7DQorCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciB7DQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlAT3ZlcnJpZGUNCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgew0KKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsNCisJCQlyZXR1cm4gKHBhcmVudCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhcmVudCkpLnRvQXJyYXkoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlAT3ZlcnJpZGUNCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgew0KKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsNCisJCQlyZXR1cm4gKHBhcmVudCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhcmVudCkpLnRvQXJyYXkoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlAT3ZlcnJpZGUNCisJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsNCisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7DQorCQkJcmV0dXJuIHBhcmVudCAhPSBudWxsOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0Q3VycmVudFZpZXdlclBhbmUoVmlld2VyUGFuZSB2aWV3ZXJQYW5lKSB7DQorCQlpZiAoY3VycmVudFZpZXdlclBhbmUgIT0gdmlld2VyUGFuZSkgew0KKwkJCWlmIChjdXJyZW50Vmlld2VyUGFuZSAhPSBudWxsKSB7DQorCQkJCWN1cnJlbnRWaWV3ZXJQYW5lLnNob3dGb2N1cyhmYWxzZSk7DQorCQkJfQ0KKwkJCWN1cnJlbnRWaWV3ZXJQYW5lID0gdmlld2VyUGFuZTsNCisJCX0NCisJCXNldEN1cnJlbnRWaWV3ZXIoY3VycmVudFZpZXdlclBhbmUuZ2V0Vmlld2VyKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIG1ha2VzIHN1cmUgdGhhdCBvbmUgY29udGVudCB2aWV3ZXIsIGVpdGhlciBmb3IgdGhlIGN1cnJlbnQgcGFnZSBvciB0aGUgb3V0bGluZSB2aWV3LCBpZiBpdCBoYXMgZm9jdXMsDQorCSAqIGlzIHRoZSBjdXJyZW50IG9uZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRWaWV3ZXIoVmlld2VyIHZpZXdlcikgew0KKwkJLy8gSWYgaXQgaXMgY2hhbmdpbmcuLi4NCisJCS8vDQorCQlpZiAoY3VycmVudFZpZXdlciAhPSB2aWV3ZXIpIHsNCisJCQlpZiAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsNCisJCQkJLy8gQ3JlYXRlIHRoZSBsaXN0ZW5lciBvbiBkZW1hbmQuDQorCQkJCS8vDQorCQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9DQorCQkJCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsNCisJCQkJCQkvLyBUaGlzIGp1c3Qgbm90aWZpZXMgdGhvc2UgdGhpbmdzIHRoYXQgYXJlIGFmZmVjdGVkIGJ5IHRoZSBzZWN0aW9uLg0KKwkJCQkJCS8vDQorCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgc2VsZWN0aW9uQ2hhbmdlZEV2ZW50KSB7DQorCQkJCQkJCXNldFNlbGVjdGlvbihzZWxlY3Rpb25DaGFuZ2VkRXZlbnQuZ2V0U2VsZWN0aW9uKCkpOw0KKwkJCQkJCX0NCisJCQkJCX07DQorCQkJfQ0KKw0KKwkJCS8vIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBvbGQgb25lLg0KKwkJCS8vDQorCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgew0KKwkJCQljdXJyZW50Vmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOw0KKwkJCX0NCisNCisJCQkvLyBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG5ldyBvbmUuDQorCQkJLy8NCisJCQlpZiAodmlld2VyICE9IG51bGwpIHsNCisJCQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOw0KKwkJCX0NCisNCisJCQkvLyBSZW1lbWJlciBpdC4NCisJCQkvLw0KKwkJCWN1cnJlbnRWaWV3ZXIgPSB2aWV3ZXI7DQorDQorCQkJLy8gU2V0IHRoZSBlZGl0b3JzIHNlbGVjdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCB2aWV3ZXIncyBzZWxlY3Rpb24uDQorCQkJLy8NCisJCQlzZXRTZWxlY3Rpb24oY3VycmVudFZpZXdlciA9PSBudWxsID8gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSA6IGN1cnJlbnRWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHZpZXdlciBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElWaWV3ZXJQcm92aWRlcn0gaW50ZXJmYWNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7DQorCQlyZXR1cm4gY3VycmVudFZpZXdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGEgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyIGFuZCBhZGRzIGEgbGlzdGVuZXIgYXMgd2VsbCByZWdpc3RlcmluZyB0aGUgbWVudSBmb3IgZXh0ZW5zaW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsNCisJCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsNCisJCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7DQorCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7DQorCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7DQorCQlNZW51IG1lbnU9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOw0KKwkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOw0KKwkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUsIG5ldyBVbndyYXBwaW5nU2VsZWN0aW9uUHJvdmlkZXIodmlld2VyKSk7DQorDQorCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSzsNCisJCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsNCisJCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsNCisJCXZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCBjYWxsZWQgdG8gbG9hZCBhIHJlc291cmNlIGludG8gdGhlIGVkaXRpbmcgZG9tYWluJ3MgcmVzb3VyY2Ugc2V0IGJhc2VkIG9uIHRoZSBlZGl0b3IncyBpbnB1dC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGNyZWF0ZU1vZGVsKCkgew0KKwkJVVJJIHJlc291cmNlVVJJID0gRWRpdFVJVXRpbC5nZXRVUkkoZ2V0RWRpdG9ySW5wdXQoKSk7DQorCQlFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCisJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsNCisJCXRyeSB7DQorCQkJLy8gTG9hZCB0aGUgcmVzb3VyY2UgdGhyb3VnaCB0aGUgZWRpdGluZyBkb21haW4uDQorCQkJLy8NCisJCQlyZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgdHJ1ZSk7DQorCQl9DQorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsNCisJCQlleGNlcHRpb24gPSBlOw0KKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCBmYWxzZSk7DQorCQl9DQorDQorCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKTsNCisJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgew0KKwkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsNCisJCX0NCisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5hZGQocHJvYmxlbUluZGljYXRpb25BZGFwdGVyKTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyBhIGRpYWdub3N0aWMgZGVzY3JpYmluZyB0aGUgZXJyb3JzIGFuZCB3YXJuaW5ncyBsaXN0ZWQgaW4gdGhlIHJlc291cmNlDQorCSAqIGFuZCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiAoaWYgYW55KS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBEaWFnbm9zdGljIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKFJlc291cmNlIHJlc291cmNlLCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQlpZiAoIXJlc291cmNlLmdldEVycm9ycygpLmlzRW1wdHkoKSB8fCAhcmVzb3VyY2UuZ2V0V2FybmluZ3MoKS5pc0VtcHR5KCkpIHsNCisJCQlCYXNpY0RpYWdub3N0aWMgYmFzaWNEaWFnbm9zdGljID0NCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYw0KKwkJCQkJKERpYWdub3N0aWMuRVJST1IsDQorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscyIsDQorCQkJCQkgMCwNCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksDQorCQkJCQkgbmV3IE9iamVjdCBbXSB7IGV4Y2VwdGlvbiA9PSBudWxsID8gKE9iamVjdClyZXNvdXJjZSA6IGV4Y2VwdGlvbiB9KTsNCisJCQliYXNpY0RpYWdub3N0aWMubWVyZ2UoRWNvcmVVdGlsLmNvbXB1dGVEaWFnbm9zdGljKHJlc291cmNlLCB0cnVlKSk7DQorCQkJcmV0dXJuIGJhc2ljRGlhZ25vc3RpYzsNCisJCX0NCisJCWVsc2UgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7DQorCQkJcmV0dXJuDQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMNCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLA0KKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMiLA0KKwkJCQkJIDAsDQorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLA0KKwkJCQkJIG5ldyBPYmplY3RbXSB7IGV4Y2VwdGlvbiB9KTsNCisJCX0NCisJCWVsc2Ugew0KKwkJCXJldHVybiBEaWFnbm9zdGljLk9LX0lOU1RBTkNFOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGluc3RhbGwgeW91ciBvd24gY29udHJvbHMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgY3JlYXRlUGFnZXMoKSB7DQorCQkvLyBDcmVhdGVzIHRoZSBtb2RlbCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQNCisJCS8vDQorCQljcmVhdGVNb2RlbCgpOw0KKw0KKwkJLy8gT25seSBjcmVhdGVzIHRoZSBvdGhlciBwYWdlcyBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhhdCBjYW4gYmUgZWRpdGVkDQorCQkvLw0KKwkJaWYgKCFnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsNCisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgc2VsZWN0aW9uIHRyZWUgdmlldy4NCisJCQkvLw0KKwkJCXsNCisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0NCisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIFN0YW5kYXJkRWRpdG9yLnRoaXMpIHsNCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7DQorCQkJCQkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGNvbXBvc2l0ZSwgU1dULk1VTFRJKTsNCisJCQkJCQkJVHJlZVZpZXdlciBuZXdUcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7DQorCQkJCQkJCXJldHVybiBuZXdUcmVlVmlld2VyOw0KKwkJCQkJCX0NCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsNCisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsNCisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsNCisNCisJCQkJc2VsZWN0aW9uVmlld2VyID0gKFRyZWVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsNCisJCQkJc2VsZWN0aW9uVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisNCisJCQkJc2VsZWN0aW9uVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsNCisJCQkJc2VsZWN0aW9uVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7DQorCQkJCXZpZXdlclBhbmUuc2V0VGl0bGUoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsNCisNCisJCQkJbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcihzZWxlY3Rpb25WaWV3ZXIuZ2V0VHJlZSgpLCBhZGFwdGVyRmFjdG9yeSk7DQorDQorCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHNlbGVjdGlvblZpZXdlcik7DQorCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsNCisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOw0KKwkJCX0NCisNCisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgcGFyZW50IHRyZWUgdmlldy4NCisJCQkvLw0KKwkJCXsNCisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0NCisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIFN0YW5kYXJkRWRpdG9yLnRoaXMpIHsNCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7DQorCQkJCQkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGNvbXBvc2l0ZSwgU1dULk1VTFRJKTsNCisJCQkJCQkJVHJlZVZpZXdlciBuZXdUcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7DQorCQkJCQkJCXJldHVybiBuZXdUcmVlVmlld2VyOw0KKwkJCQkJCX0NCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsNCisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsNCisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsNCisNCisJCQkJcGFyZW50Vmlld2VyID0gKFRyZWVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsNCisJCQkJcGFyZW50Vmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbCgzMCk7DQorCQkJCXBhcmVudFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQlwYXJlbnRWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorDQorCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHBhcmVudFZpZXdlcik7DQorCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsNCisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9QYXJlbnRQYWdlX2xhYmVsIikpOw0KKwkJCX0NCisNCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgbGlzdCB2aWV3ZXINCisJCQkvLw0KKwkJCXsNCisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0NCisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIFN0YW5kYXJkRWRpdG9yLnRoaXMpIHsNCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7DQorCQkJCQkJCXJldHVybiBuZXcgTGlzdFZpZXdlcihjb21wb3NpdGUpOw0KKwkJCQkJCX0NCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsNCisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsNCisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsNCisJCQkJbGlzdFZpZXdlciA9IChMaXN0Vmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7DQorCQkJCWxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQlsaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKw0KKwkJCQljcmVhdGVDb250ZXh0TWVudUZvcihsaXN0Vmlld2VyKTsNCisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOw0KKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX0xpc3RQYWdlX2xhYmVsIikpOw0KKwkJCX0NCisNCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgdHJlZSB2aWV3ZXINCisJCQkvLw0KKwkJCXsNCisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0NCisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIFN0YW5kYXJkRWRpdG9yLnRoaXMpIHsNCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7DQorCQkJCQkJCXJldHVybiBuZXcgVHJlZVZpZXdlcihjb21wb3NpdGUpOw0KKwkJCQkJCX0NCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsNCisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsNCisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsNCisJCQkJdHJlZVZpZXdlciA9IChUcmVlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7DQorCQkJCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKw0KKwkJCQluZXcgQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yKHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLCBhZGFwdGVyRmFjdG9yeSk7DQorDQorCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRyZWVWaWV3ZXIpOw0KKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7DQorCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfVHJlZVBhZ2VfbGFiZWwiKSk7DQorCQkJfQ0KKw0KKwkJCS8vIFRoaXMgaXMgdGhlIHBhZ2UgZm9yIHRoZSB0YWJsZSB2aWV3ZXIuDQorCQkJLy8NCisJCQl7DQorCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9DQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBTdGFuZGFyZEVkaXRvci50aGlzKSB7DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgew0KKwkJCQkJCQlyZXR1cm4gbmV3IFRhYmxlVmlld2VyKGNvbXBvc2l0ZSk7DQorCQkJCQkJfQ0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgew0KKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOw0KKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsNCisJCQkJCQl9DQorCQkJCQl9Ow0KKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOw0KKwkJCQl0YWJsZVZpZXdlciA9IChUYWJsZVZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOw0KKw0KKwkJCQlUYWJsZSB0YWJsZSA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCk7DQorCQkJCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOw0KKwkJCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsNCisJCQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsNCisJCQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOw0KKw0KKwkJCQlUYWJsZUNvbHVtbiBvYmplY3RDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsNCisJCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMywgMTAwLCB0cnVlKSk7DQorCQkJCW9iamVjdENvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX09iamVjdENvbHVtbl9sYWJlbCIpKTsNCisJCQkJb2JqZWN0Q29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsNCisNCisJCQkJVGFibGVDb2x1bW4gc2VsZkNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOw0KKwkJCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyLCAxMDAsIHRydWUpKTsNCisJCQkJc2VsZkNvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX1NlbGZDb2x1bW5fbGFiZWwiKSk7DQorCQkJCXNlbGZDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOw0KKw0KKwkJCQl0YWJsZVZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKG5ldyBTdHJpbmcgW10geyJhIiwgImIifSk7DQorCQkJCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorDQorCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRhYmxlVmlld2VyKTsNCisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOw0KKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1RhYmxlUGFnZV9sYWJlbCIpKTsNCisJCQl9DQorDQorCQkJLy8gVGhpcyBpcyB0aGUgcGFnZSBmb3IgdGhlIHRhYmxlIHRyZWUgdmlld2VyLg0KKwkJCS8vDQorCQkJew0KKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQ0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgU3RhbmRhcmRFZGl0b3IudGhpcykgew0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsNCisJCQkJCQkJcmV0dXJuIG5ldyBUcmVlVmlld2VyKGNvbXBvc2l0ZSk7DQorCQkJCQkJfQ0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgew0KKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOw0KKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsNCisJCQkJCQl9DQorCQkJCQl9Ow0KKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOw0KKw0KKwkJCQl0cmVlVmlld2VyV2l0aENvbHVtbnMgPSAoVHJlZVZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOw0KKw0KKwkJCQlUcmVlIHRyZWUgPSB0cmVlVmlld2VyV2l0aENvbHVtbnMuZ2V0VHJlZSgpOw0KKwkJCQl0cmVlLnNldExheW91dERhdGEobmV3IEZpbGxMYXlvdXQoKSk7DQorCQkJCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsNCisJCQkJdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7DQorDQorCQkJCVRyZWVDb2x1bW4gb2JqZWN0Q29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOw0KKwkJCQlvYmplY3RDb2x1bW4uc2V0VGV4dChnZXRTdHJpbmcoIl9VSV9PYmplY3RDb2x1bW5fbGFiZWwiKSk7DQorCQkJCW9iamVjdENvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7DQorCQkJCW9iamVjdENvbHVtbi5zZXRXaWR0aCgyNTApOw0KKw0KKwkJCQlUcmVlQ29sdW1uIHNlbGZDb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7DQorCQkJCXNlbGZDb2x1bW4uc2V0VGV4dChnZXRTdHJpbmcoIl9VSV9TZWxmQ29sdW1uX2xhYmVsIikpOw0KKwkJCQlzZWxmQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsNCisJCQkJc2VsZkNvbHVtbi5zZXRXaWR0aCgyMDApOw0KKw0KKwkJCQl0cmVlVmlld2VyV2l0aENvbHVtbnMuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nIFtdIHsiYSIsICJiIn0pOw0KKwkJCQl0cmVlVmlld2VyV2l0aENvbHVtbnMuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQl0cmVlVmlld2VyV2l0aENvbHVtbnMuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorDQorCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRyZWVWaWV3ZXJXaXRoQ29sdW1ucyk7DQorCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsNCisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9UcmVlV2l0aENvbHVtbnNQYWdlX2xhYmVsIikpOw0KKwkJCX0NCisNCisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjDQorCQkJCShuZXcgUnVubmFibGUoKSB7DQorCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCSBzZXRBY3RpdmVQYWdlKDApOw0KKwkJCQkJIH0NCisJCQkJIH0pOw0KKwkJfQ0KKw0KKwkJLy8gRW5zdXJlcyB0aGF0IHRoaXMgZWRpdG9yIHdpbGwgb25seSBkaXNwbGF5IHRoZSBwYWdlJ3MgdGFiDQorCQkvLyBhcmVhIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHBhZ2UNCisJCS8vDQorCQlnZXRDb250YWluZXIoKS5hZGRDb250cm9sTGlzdGVuZXINCisJCQkobmV3IENvbnRyb2xBZGFwdGVyKCkgew0KKwkJCQlib29sZWFuIGd1YXJkID0gZmFsc2U7DQorCQkJCUBPdmVycmlkZQ0KKwkJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsNCisJCQkJCWlmICghZ3VhcmQpIHsNCisJCQkJCQlndWFyZCA9IHRydWU7DQorCQkJCQkJaGlkZVRhYnMoKTsNCisJCQkJCQlndWFyZCA9IGZhbHNlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJIH0pOw0KKw0KKwkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYw0KKwkJCShuZXcgUnVubmFibGUoKSB7DQorCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsNCisJCQkJIH0NCisJCQkgfSk7DQorCX0NCisNCisJLyoqDQorCSAqIElmIHRoZXJlIGlzIGp1c3Qgb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsDQorCSAqIHRoaXMgaGlkZXMgdGhlIHNpbmdsZSB0YWIgYXQgdGhlIGJvdHRvbS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhpZGVUYWJzKCkgew0KKwkJaWYgKGdldFBhZ2VDb3VudCgpIDw9IDEpIHsNCisJCQlzZXRQYWdlVGV4dCgwLCAiIik7DQorCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgew0KKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodCgxKTsNCisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7DQorCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSArIDYpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LA0KKwkgKiB0aGlzIHNob3dzIHRoZSB0YWJzIGF0IHRoZSBib3R0b20uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzaG93VGFicygpIHsNCisJCWlmIChnZXRQYWdlQ291bnQoKSA+IDEpIHsNCisJCQlzZXRQYWdlVGV4dCgwLCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOw0KKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsNCisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoU1dULkRFRkFVTFQpOw0KKwkJCQlQb2ludCBwb2ludCA9IGdldENvbnRhaW5lcigpLmdldFNpemUoKTsNCisJCQkJZ2V0Q29udGFpbmVyKCkuc2V0U2l6ZShwb2ludC54LCBwb2ludC55IC0gNik7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHVzZWQgdG8gdHJhY2sgdGhlIGFjdGl2ZSB2aWV3ZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgcGFnZUluZGV4KSB7DQorCQlzdXBlci5wYWdlQ2hhbmdlKHBhZ2VJbmRleCk7DQorDQorCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsNCisJCQloYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihjb250ZW50T3V0bGluZVBhZ2UuZ2V0U2VsZWN0aW9uKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIGhvdyB0aGUgZnJhbWV3b3JrIGRldGVybWluZXMgd2hpY2ggaW50ZXJmYWNlcyB3ZSBpbXBsZW1lbnQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsNCisJCWlmIChrZXkuZXF1YWxzKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpKSB7DQorCQkJcmV0dXJuIHNob3dPdXRsaW5lVmlldygpID8gZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgOiBudWxsOw0KKwkJfQ0KKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7DQorCQkJcmV0dXJuIGdldFByb3BlcnR5U2hlZXRQYWdlKCk7DQorCQl9DQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgew0KKwkJCXJldHVybiB0aGlzOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoa2V5KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IG91dGxpbmVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50T3V0bGluZVBhZ2UgZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgew0KKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSA9PSBudWxsKSB7DQorCQkJLy8gVGhlIGNvbnRlbnQgb3V0bGluZSBpcyBqdXN0IGEgdHJlZS4NCisJCQkvLw0KKwkJCWNsYXNzIE15Q29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgQ29udGVudE91dGxpbmVQYWdlIHsNCisJCQkJQE92ZXJyaWRlDQorCQkJCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KKwkJCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOw0KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7DQorCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7DQorDQorCQkJCQkvLyBTZXQgdXAgdGhlIHRyZWUgdmlld2VyLg0KKwkJCQkJLy8NCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsNCisNCisJCQkJCS8vIE1ha2Ugc3VyZSBvdXIgcG9wdXBzIHdvcmsuDQorCQkJCQkvLw0KKwkJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IoY29udGVudE91dGxpbmVWaWV3ZXIpOw0KKw0KKwkJCQkJaWYgKCFlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7DQorCQkJCQkgIC8vIFNlbGVjdCB0aGUgcm9vdCBvYmplY3QgaW4gdGhlIHZpZXcuDQorCQkJCQkgIC8vDQorCQkJCQkgIGNvbnRlbnRPdXRsaW5lVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJQE92ZXJyaWRlDQorCQkJCXB1YmxpYyB2b2lkIG1ha2VDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwgSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLCBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsNCisJCQkJCXN1cGVyLm1ha2VDb250cmlidXRpb25zKG1lbnVNYW5hZ2VyLCB0b29sQmFyTWFuYWdlciwgc3RhdHVzTGluZU1hbmFnZXIpOw0KKwkJCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOw0KKwkJCQl9DQorDQorCQkJCUBPdmVycmlkZQ0KKwkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsNCisJCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7DQorCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQljb250ZW50T3V0bGluZVBhZ2UgPSBuZXcgTXlDb250ZW50T3V0bGluZVBhZ2UoKTsNCisNCisJCQkvLyBMaXN0ZW4gdG8gc2VsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBpdCBpcyBhIHNwZWNpYWwgd2F5Lg0KKwkJCS8vDQorCQkJY29udGVudE91dGxpbmVQYWdlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcg0KKwkJCQkobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7DQorCQkJCQkgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2UgaGFuZGxlIHNlbGVjdGlvbnMgY29ycmVjdGx5Lg0KKwkJCQkJIC8vDQorCQkJCQkgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsNCisJCQkJCQkgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOw0KKwkJCQkJIH0NCisJCQkJIH0pOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIGNvbnRlbnRPdXRsaW5lUGFnZTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBwcm9wZXJ0eSBzaGVldC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7DQorCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgPT0gbnVsbCkgew0KKwkJCXByb3BlcnR5U2hlZXRQYWdlID0NCisJCQkJbmV3IEV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2UoZWRpdGluZ0RvbWFpbikgew0KKwkJCQkJQE92ZXJyaWRlDQorCQkJCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihMaXN0PD8+IHNlbGVjdGlvbikgew0KKwkJCQkJCVN0YW5kYXJkRWRpdG9yLnRoaXMuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0aW9uKTsNCisJCQkJCQlTdGFuZGFyZEVkaXRvci50aGlzLnNldEZvY3VzKCk7DQorCQkJCQl9DQorDQorCQkJCQlAT3ZlcnJpZGUNCisJCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgew0KKwkJCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7DQorCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7DQorCQkJCQl9DQorCQkJCX07DQorCQkJcHJvcGVydHlTaGVldFBhZ2Uuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCX0NCisNCisJCXJldHVybiBwcm9wZXJ0eVNoZWV0UGFnZTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBkZWFscyB3aXRoIGhvdyB3ZSB3YW50IHNlbGVjdGlvbiBpbiB0aGUgb3V0bGluZXIgdG8gYWZmZWN0IHRoZSBvdGhlciB2aWV3cy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQlpZiAoY3VycmVudFZpZXdlclBhbmUgIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgew0KKwkJCUl0ZXJhdG9yPD8+IHNlbGVjdGVkRWxlbWVudHMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuaXRlcmF0b3IoKTsNCisJCQlpZiAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsNCisJCQkJLy8gR2V0IHRoZSBmaXJzdCBzZWxlY3RlZCBlbGVtZW50Lg0KKwkJCQkvLw0KKwkJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCk7DQorDQorCQkJCS8vIElmIGl0J3MgdGhlIHNlbGVjdGlvbiB2aWV3ZXIsIHRoZW4gd2Ugd2FudCBpdCB0byBzZWxlY3QgdGhlIHNhbWUgc2VsZWN0aW9uIGFzIHRoaXMgc2VsZWN0aW9uLg0KKwkJCQkvLw0KKwkJCQlpZiAoY3VycmVudFZpZXdlclBhbmUuZ2V0Vmlld2VyKCkgPT0gc2VsZWN0aW9uVmlld2VyKSB7DQorCQkJCQlBcnJheUxpc3Q8T2JqZWN0PiBzZWxlY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQorCQkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnQpOw0KKwkJCQkJd2hpbGUgKHNlbGVjdGVkRWxlbWVudHMuaGFzTmV4dCgpKSB7DQorCQkJCQkJc2VsZWN0aW9uTGlzdC5hZGQoc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCkpOw0KKwkJCQkJfQ0KKw0KKwkJCQkJLy8gU2V0IHRoZSBzZWxlY3Rpb24gdG8gdGhlIHdpZGdldC4NCisJCQkJCS8vDQorCQkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbkxpc3QpKTsNCisJCQkJfQ0KKwkJCQllbHNlIHsNCisJCQkJCS8vIFNldCB0aGUgaW5wdXQgdG8gdGhlIHdpZGdldC4NCisJCQkJCS8vDQorCQkJCQlpZiAoY3VycmVudFZpZXdlclBhbmUuZ2V0Vmlld2VyKCkuZ2V0SW5wdXQoKSAhPSBzZWxlY3RlZEVsZW1lbnQpIHsNCisJCQkJCQljdXJyZW50Vmlld2VyUGFuZS5nZXRWaWV3ZXIoKS5zZXRJbnB1dChzZWxlY3RlZEVsZW1lbnQpOw0KKwkJCQkJCWN1cnJlbnRWaWV3ZXJQYW5lLnNldFRpdGxlKHNlbGVjdGVkRWxlbWVudCk7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSUVkaXRvclBhcnR9IGFuZCBzaW1wbHkgdGVzdHMgdGhlIGNvbW1hbmQgc3RhY2suDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsNCisJCXJldHVybiAoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLmlzU2F2ZU5lZWRlZCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHNhdmVzIHRoZSBtb2RlbCBmaWxlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KKwkJLy8gU2F2ZSBvbmx5IHJlc291cmNlcyB0aGF0IGhhdmUgYWN0dWFsbHkgY2hhbmdlZC4NCisJCS8vDQorCQlmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQorCQlzYXZlT3B0aW9ucy5wdXQoUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VELCBSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRURfTUVNT1JZX0JVRkZFUik7DQorDQorCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guDQorCQkvLw0KKwkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9DQorCQkJbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsNCisJCQkJLy8gVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBydW5zLg0KKwkJCQkvLw0KKwkJCQlAT3ZlcnJpZGUNCisJCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCisJCQkJCS8vIFNhdmUgdGhlIHJlc291cmNlcyB0byB0aGUgZmlsZSBzeXN0ZW0uDQorCQkJCQkvLw0KKwkJCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7DQorCQkJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKSB7DQorCQkJCQkJaWYgKChmaXJzdCB8fCAhcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkgfHwgaXNQZXJzaXN0ZWQocmVzb3VyY2UpKSAmJiAhZWRpdGluZ0RvbWFpbi5pc1JlYWRPbmx5KHJlc291cmNlKSkgew0KKwkJCQkJCQl0cnkgew0KKwkJCQkJCQkJbG9uZyB0aW1lU3RhbXAgPSByZXNvdXJjZS5nZXRUaW1lU3RhbXAoKTsNCisJCQkJCQkJCXJlc291cmNlLnNhdmUoc2F2ZU9wdGlvbnMpOw0KKwkJCQkJCQkJaWYgKHJlc291cmNlLmdldFRpbWVTdGFtcCgpICE9IHRpbWVTdGFtcCkgew0KKwkJCQkJCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7DQorCQkJCQkJCQl9DQorCQkJCQkJCX0NCisJCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOw0KKwkJCQkJCQl9DQorCQkJCQkJCWZpcnN0ID0gZmFsc2U7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfTsNCisNCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7DQorCQl0cnkgew0KKwkJCS8vIFRoaXMgcnVucyB0aGUgb3B0aW9ucywgYW5kIHNob3dzIHByb2dyZXNzLg0KKwkJCS8vDQorCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSkucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOw0KKw0KKwkJCS8vIFJlZnJlc2ggdGhlIG5lY2Vzc2FyeSBzdGF0ZS4NCisJCQkvLw0KKwkJCSgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuc2F2ZUlzRG9uZSgpOw0KKwkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsNCisJCX0NCisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgdGhhdCBzaG91bGRuJ3QuDQorCQkJLy8NCisJCQlTdGFuZGFyZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCX0NCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsNCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB3aGV0aGVyIHNvbWV0aGluZyBoYXMgYmVlbiBwZXJzaXN0ZWQgdG8gdGhlIFVSSSBvZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlLg0KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgVVJJIGNvbnZlcnRlciBmcm9tIHRoZSBlZGl0b3IncyByZXNvdXJjZSBzZXQgdG8gdHJ5IHRvIG9wZW4gYW4gaW5wdXQgc3RyZWFtLiANCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzUGVyc2lzdGVkKFJlc291cmNlIHJlc291cmNlKSB7DQorCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOw0KKwkJdHJ5IHsNCisJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0ocmVzb3VyY2UuZ2V0VVJJKCkpOw0KKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgew0KKwkJCQlyZXN1bHQgPSB0cnVlOw0KKwkJCQlzdHJlYW0uY2xvc2UoKTsNCisJCQl9DQorCQl9DQorCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KKwkJCS8vIElnbm9yZQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhbHdheXMgcmV0dXJucyB0cnVlIGJlY2F1c2UgaXQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgew0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWxzbyBjaGFuZ2VzIHRoZSBlZGl0b3IncyBpbnB1dC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsNCisJCVNhdmVBc0RpYWxvZyBzYXZlQXNEaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsNCisJCXNhdmVBc0RpYWxvZy5vcGVuKCk7DQorCQlJUGF0aCBwYXRoID0gc2F2ZUFzRGlhbG9nLmdldFJlc3VsdCgpOw0KKwkJaWYgKHBhdGggIT0gbnVsbCkgew0KKwkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7DQorCQkJaWYgKGZpbGUgIT0gbnVsbCkgew0KKwkJCQlkb1NhdmVBcyhVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSkpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvU2F2ZUFzKFVSSSB1cmksIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgew0KKwkJKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLnNldFVSSSh1cmkpOw0KKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsNCisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7DQorCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9DQorCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgIT0gbnVsbCA/DQorCQkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpIDoNCisJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsNCisJCWRvU2F2ZShwcm9ncmVzc01vbml0b3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgew0KKwkJdHJ5IHsNCisJCQlpZiAobWFya2VyLmdldFR5cGUoKS5lcXVhbHMoRVZhbGlkYXRvci5NQVJLRVIpKSB7DQorCQkJCVN0cmluZyB1cmlBdHRyaWJ1dGUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKEVWYWxpZGF0b3IuVVJJX0FUVFJJQlVURSwgbnVsbCk7DQorCQkJCWlmICh1cmlBdHRyaWJ1dGUgIT0gbnVsbCkgew0KKwkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpQXR0cmlidXRlKTsNCisJCQkJCUVPYmplY3QgZU9iamVjdCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7DQorCQkJCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7DQorCQkJCQkgIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zLnNpbmdsZXRvbihlZGl0aW5nRG9tYWluLmdldFdyYXBwZXIoZU9iamVjdCkpKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCVN0YW5kYXJkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgc3RhcnR1cC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgew0KKwkJc2V0U2l0ZShzaXRlKTsNCisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7DQorCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOw0KKwkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsNCisJCXNpdGUuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOw0KKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgew0KKwkJaWYgKGN1cnJlbnRWaWV3ZXJQYW5lICE9IG51bGwpIHsNCisJCQljdXJyZW50Vmlld2VyUGFuZS5zZXRGb2N1cygpOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJZ2V0Q29udHJvbChnZXRBY3RpdmVQYWdlKCkpLnNldEZvY3VzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsNCisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgew0KKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byByZXR1cm4gdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsNCisJCXJldHVybiBlZGl0b3JTZWxlY3Rpb247DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHNldCB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLg0KKwkgKiBDYWxsaW5nIHRoaXMgcmVzdWx0IHdpbGwgbm90aWZ5IHRoZSBsaXN0ZW5lcnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCWVkaXRvclNlbGVjdGlvbiA9IHNlbGVjdGlvbjsNCisNCisJCWZvciAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA6IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMpIHsNCisJCQlsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7DQorCQl9DQorCQlzZXRTdGF0dXNMaW5lTWFuYWdlcihzZWxlY3Rpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZU1hbmFnZXIoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciA9IGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCAmJiBjdXJyZW50Vmlld2VyID09IGNvbnRlbnRPdXRsaW5lVmlld2VyID8NCisJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyIDogZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7DQorDQorCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgew0KKwkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgew0KKwkJCQlDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikudG9MaXN0KCk7DQorCQkJCXN3aXRjaCAoY29sbGVjdGlvbi5zaXplKCkpIHsNCisJCQkJCWNhc2UgMDogew0KKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTm9PYmplY3RTZWxlY3RlZCIpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJCWNhc2UgMTogew0KKwkJCQkJCVN0cmluZyB0ZXh0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcihhZGFwdGVyRmFjdG9yeSkuZ2V0VGV4dChjb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsNCisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkIiwgdGV4dCkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQkJZGVmYXVsdDogew0KKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTXVsdGlPYmplY3RTZWxlY3RlZCIsIEludGVnZXIudG9TdHJpbmcoY29sbGVjdGlvbi5zaXplKCkpKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJZWxzZSB7DQorCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoIiIpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBsb29rcyB1cCBhIHN0cmluZyBpbiB0aGUgcGx1Z2luJ3MgcGx1Z2luLnByb3BlcnRpZXMgZmlsZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgew0KKwkJcmV0dXJuIFN0YW5kYXJkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHBsdWdpbi5wcm9wZXJ0aWVzLCBtYWtpbmcgYSBzdWJzdGl0dXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgew0KKwkJcmV0dXJuIFN0YW5kYXJkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXksIG5ldyBPYmplY3QgW10geyBzMSB9KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcn0gdG8gaGVscCBmaWxsIHRoZSBjb250ZXh0IG1lbnVzIHdpdGggY29udHJpYnV0aW9ucyBmcm9tIHRoZSBFZGl0IG1lbnUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7DQorCQkoKElNZW51TGlzdGVuZXIpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkpLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgew0KKwkJcmV0dXJuIChFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsNCisJCXJldHVybiBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGlvbkJhcnMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsNCisJCXJldHVybiBhZGFwdGVyRmFjdG9yeTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsNCisNCisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOw0KKw0KKwkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsNCisNCisJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsNCisNCisJCWlmIChnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGl2ZUVkaXRvcigpID09IHRoaXMpIHsNCisJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihudWxsKTsNCisJCX0NCisNCisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7DQorCQkJcHJvcGVydHlTaGVldFBhZ2UuZGlzcG9zZSgpOw0KKwkJfQ0KKw0KKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7DQorCQkJY29udGVudE91dGxpbmVQYWdlLmRpc3Bvc2UoKTsNCisJCX0NCisNCisJCXN1cGVyLmRpc3Bvc2UoKTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBvdXRsaW5lIHZpZXcgc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHNob3dPdXRsaW5lVmlldygpIHsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3ByZXNlbnRhdGlvbi9TdGFuZGFyZEVkaXRvclBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvcHJlc2VudGF0aW9uL1N0YW5kYXJkRWRpdG9yUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5MDcwZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3ByZXNlbnRhdGlvbi9TdGFuZGFyZEVkaXRvclBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5wcmVzZW50YXRpb247DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLkVjbGlwc2VVSVBsdWdpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlRWRpdFBsdWdpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db3JlRWRpdFBsdWdpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5lZGdlcy5wcm92aWRlci5EZWZpbml0aW9uc0VkaXRQbHVnaW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5hZGFwdGVycy5TdGFuZGFyZFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQud2l6YXJkcy5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC53aXphcmRzLlN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgU3RhbmRhcmQgZWRpdG9yIHBsdWdpbi4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitAU3VwcHJlc3NXYXJuaW5ncygic3ludGhldGljLWFjY2VzcyIpDQorcHVibGljIGZpbmFsIGNsYXNzIFN0YW5kYXJkRWRpdG9yUGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIHsNCisJLyoqDQorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RhbmRhcmRFZGl0b3JQbHVnaW4gSU5TVEFOQ0UgPSBuZXcgU3RhbmRhcmRFZGl0b3JQbHVnaW4oKTsNCisJDQorCS8qKg0KKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47DQorDQorCS8qKg0KKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0YW5kYXJkRWRpdG9yUGx1Z2luKCkgew0KKwkJc3VwZXINCisJCQkobmV3IFJlc291cmNlTG9jYXRvciBbXSB7DQorCQkJCUNvcmVFZGl0UGx1Z2luLklOU1RBTkNFLA0KKwkJCQlEZWZpbml0aW9uc0VkaXRQbHVnaW4uSU5TVEFOQ0UsDQorCQkJCUVjb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwNCisJCQl9KTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgew0KKwkJcmV0dXJuIHBsdWdpbjsNCisJfQ0KKwkNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgew0KKwkJcmV0dXJuIHBsdWdpbjsNCisJfQ0KKwkNCisJLyoqDQorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4gew0KKwkJLyoqDQorCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZCBOT1QNCisJCSAqLw0KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgew0KKwkJCXN1cGVyKCk7DQorCQ0KKwkJCS8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuDQorCQkJLy8NCisJCQlwbHVnaW4gPSB0aGlzOw0KKwkJCW5ldyBTdGFuZGFyZFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOw0KKwkJCW5ldyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkoKTsNCisJCQluZXcgU3RhbmRhcmRFZGl0b3IoKTsNCisJCQkvLyBBZGQgdG8gUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UNCisJCQluZXcgU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3ByZXNlbnRhdGlvbi9TdGFuZGFyZE1vZGVsV2l6YXJkLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcmVzZW50YXRpb24vU3RhbmRhcmRNb2RlbFdpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MGM3ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC9wcmVzZW50YXRpb24vU3RhbmRhcmRNb2RlbFdpemFyZC5qYXZhCkBAIC0wLDAgKzEsNjM2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5wcmVzZW50YXRpb247DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTZXRTZWxlY3Rpb25UYXJnZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZEZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5wcm92aWRlci5TdGFuZGFyZEVkaXRQbHVnaW47DQorDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsNCisNCisNCisvKioNCisgKiBUaGlzIGlzIGEgc2ltcGxlIHdpemFyZCBmb3IgY3JlYXRpbmcgYSBuZXcgbW9kZWwgZmlsZS4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRNb2RlbFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgew0KKwkvKioNCisJICogVGhlIHN1cHBvcnRlZCBleHRlbnNpb25zIGZvciBjcmVhdGVkIGZpbGVzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gRklMRV9FWFRFTlNJT05TID0NCisJCUNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChTdGFuZGFyZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9ucyIpLnNwbGl0KCJcXHMqLFxccyoiKSkpOw0KKw0KKwkvKioNCisJICogQSBmb3JtYXR0ZWQgbGlzdCBvZiBzdXBwb3J0ZWQgZmlsZSBleHRlbnNpb25zLCBzdWl0YWJsZSBmb3IgZGlzcGxheS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFRF9GSUxFX0VYVEVOU0lPTlMgPQ0KKwkJU3RhbmRhcmRFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbnMiKS5yZXBsYWNlQWxsKCJcXHMqLFxccyoiLCAiLCAiKTsNCisNCisJLyoqDQorCSAqIFRoaXMgY2FjaGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCBwYWNrYWdlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0YW5kYXJkUGFja2FnZSBzdGFuZGFyZFBhY2thZ2UgPSBTdGFuZGFyZFBhY2thZ2UuZUlOU1RBTkNFOw0KKw0KKwkvKioNCisJICogVGhpcyBjYWNoZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIGZhY3RvcnkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RhbmRhcmRGYWN0b3J5IHN0YW5kYXJkRmFjdG9yeSA9IHN0YW5kYXJkUGFja2FnZS5nZXRTdGFuZGFyZEZhY3RvcnkoKTsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIGZpbGUgY3JlYXRpb24gcGFnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdGFuZGFyZE1vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSBuZXdGaWxlQ3JlYXRpb25QYWdlOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgaW5pdGlhbCBvYmplY3QgY3JlYXRpb24gcGFnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdGFuZGFyZE1vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSBpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlOw0KKw0KKwkvKioNCisJICogUmVtZW1iZXIgdGhlIHNlbGVjdGlvbiBkdXJpbmcgaW5pdGlhbGl6YXRpb24gZm9yIHBvcHVsYXRpbmcgdGhlIGRlZmF1bHQgY29udGFpbmVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsNCisNCisJLyoqDQorCSAqIFJlbWVtYmVyIHRoZSB3b3JrYmVuY2ggZHVyaW5nIGluaXRpYWxpemF0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElXb3JrYmVuY2ggd29ya2JlbmNoOw0KKw0KKwkvKioNCisJICogQ2FjaGVzIHRoZSBuYW1lcyBvZiB0aGUgdHlwZXMgdGhhdCBjYW4gYmUgY3JlYXRlZCBhcyB0aGUgcm9vdCBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGluaXRpYWxPYmplY3ROYW1lczsNCisNCisJLyoqDQorCSAqIFRoaXMganVzdCByZWNvcmRzIHRoZSBpbmZvcm1hdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7DQorCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsNCisJCXNldFdpbmRvd1RpdGxlKFN0YW5kYXJkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1dpemFyZF9sYWJlbCIpKTsNCisJCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5JTlNUQU5DRS5nZXRJbWFnZURlc2NyaXB0b3IoU3RhbmRhcmRFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvd2l6YmFuL05ld1N0YW5kYXJkIikpKTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIHR5cGVzIHRoYXQgY2FuIGJlIGNyZWF0ZWQgYXMgdGhlIHJvb3Qgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbml0aWFsT2JqZWN0TmFtZXMoKSB7DQorCQlpZiAoaW5pdGlhbE9iamVjdE5hbWVzID09IG51bGwpIHsNCisJCQlpbml0aWFsT2JqZWN0TmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCisJCQlmb3IgKEVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyIDogc3RhbmRhcmRQYWNrYWdlLmdldEVDbGFzc2lmaWVycygpKSB7DQorCQkJCWlmIChlQ2xhc3NpZmllciBpbnN0YW5jZW9mIEVDbGFzcykgew0KKwkJCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpZUNsYXNzaWZpZXI7DQorCQkJCQlpZiAoIWVDbGFzcy5pc0Fic3RyYWN0KCkpIHsNCisJCQkJCQlpbml0aWFsT2JqZWN0TmFtZXMuYWRkKGVDbGFzcy5nZXROYW1lKCkpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCUNvbGxlY3Rpb25zLnNvcnQoaW5pdGlhbE9iamVjdE5hbWVzLCBDb21tb25QbHVnaW4uSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpKTsNCisJCX0NCisJCXJldHVybiBpbml0aWFsT2JqZWN0TmFtZXM7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZSBhIG5ldyBtb2RlbC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGNyZWF0ZUluaXRpYWxNb2RlbCgpIHsNCisJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKXN0YW5kYXJkUGFja2FnZS5nZXRFQ2xhc3NpZmllcihpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlLmdldEluaXRpYWxPYmplY3ROYW1lKCkpOw0KKwkJRU9iamVjdCByb290T2JqZWN0ID0gc3RhbmRhcmRGYWN0b3J5LmNyZWF0ZShlQ2xhc3MpOw0KKwkJcmV0dXJuIHJvb3RPYmplY3Q7DQorCX0NCisNCisJLyoqDQorCSAqIERvIHRoZSB3b3JrIGFmdGVyIGV2ZXJ5dGhpbmcgaXMgc3BlY2lmaWVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7DQorCQl0cnkgew0KKwkJCS8vIFJlbWVtYmVyIHRoZSBmaWxlLg0KKwkJCS8vDQorCQkJZmluYWwgSUZpbGUgbW9kZWxGaWxlID0gZ2V0TW9kZWxGaWxlKCk7DQorDQorCQkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbi4NCisJCQkvLw0KKwkJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPQ0KKwkJCQluZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgew0KKwkJCQkJQE92ZXJyaWRlDQorCQkJCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7DQorCQkJCQkJdHJ5IHsNCisJCQkJCQkJLy8gQ3JlYXRlIGEgcmVzb3VyY2Ugc2V0DQorCQkJCQkJCS8vDQorCQkJCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOw0KKw0KKwkJCQkJCQkvLyBHZXQgdGhlIFVSSSBvZiB0aGUgbW9kZWwgZmlsZS4NCisJCQkJCQkJLy8NCisJCQkJCQkJVVJJIGZpbGVVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShtb2RlbEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKTsNCisNCisJCQkJCQkJLy8gQ3JlYXRlIGEgcmVzb3VyY2UgZm9yIHRoaXMgZmlsZS4NCisJCQkJCQkJLy8NCisJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShmaWxlVVJJKTsNCisNCisJCQkJCQkJLy8gQWRkIHRoZSBpbml0aWFsIG1vZGVsIG9iamVjdCB0byB0aGUgY29udGVudHMuDQorCQkJCQkJCS8vDQorCQkJCQkJCUVPYmplY3Qgcm9vdE9iamVjdCA9IGNyZWF0ZUluaXRpYWxNb2RlbCgpOw0KKwkJCQkJCQlpZiAocm9vdE9iamVjdCAhPSBudWxsKSB7DQorCQkJCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChyb290T2JqZWN0KTsNCisJCQkJCQkJfQ0KKw0KKwkJCQkJCQkvLyBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgcmVzb3VyY2UgdG8gdGhlIGZpbGUgc3lzdGVtLg0KKwkJCQkJCQkvLw0KKwkJCQkJCQlNYXA8T2JqZWN0LCBPYmplY3Q+IG9wdGlvbnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsNCisJCQkJCQkJb3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCBpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlLmdldEVuY29kaW5nKCkpOw0KKwkJCQkJCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOw0KKwkJCQkJCX0NCisJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQkJCQlTdGFuZGFyZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCQkJCQl9DQorCQkJCQkJZmluYWxseSB7DQorCQkJCQkJCXByb2dyZXNzTW9uaXRvci5kb25lKCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9Ow0KKw0KKwkJCWdldENvbnRhaW5lcigpLnJ1bihmYWxzZSwgZmFsc2UsIG9wZXJhdGlvbik7DQorDQorCQkJLy8gU2VsZWN0IHRoZSBuZXcgZmlsZSByZXNvdXJjZSBpbiB0aGUgY3VycmVudCB2aWV3Lg0KKwkJCS8vDQorCQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7DQorCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7DQorCQkJZmluYWwgSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydCA9IHBhZ2UuZ2V0QWN0aXZlUGFydCgpOw0KKwkJCWlmIChhY3RpdmVQYXJ0IGluc3RhbmNlb2YgSVNldFNlbGVjdGlvblRhcmdldCkgew0KKwkJCQlmaW5hbCBJU2VsZWN0aW9uIHRhcmdldFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vZGVsRmlsZSk7DQorCQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYw0KKwkJCQkJKG5ldyBSdW5uYWJsZSgpIHsNCisJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkgKChJU2V0U2VsZWN0aW9uVGFyZ2V0KWFjdGl2ZVBhcnQpLnNlbGVjdFJldmVhbCh0YXJnZXRTZWxlY3Rpb24pOw0KKwkJCQkJCSB9DQorCQkJCQkgfSk7DQorCQkJfQ0KKw0KKwkJCS8vIE9wZW4gYW4gZWRpdG9yIG9uIHRoZSBuZXcgZmlsZS4NCisJCQkvLw0KKwkJCXRyeSB7DQorCQkJCXBhZ2Uub3BlbkVkaXRvcg0KKwkJCQkJKG5ldyBGaWxlRWRpdG9ySW5wdXQobW9kZWxGaWxlKSwNCisJCQkJCSB3b3JrYmVuY2guZ2V0RWRpdG9yUmVnaXN0cnkoKS5nZXREZWZhdWx0RWRpdG9yKG1vZGVsRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLmdldElkKCkpOw0KKwkJCX0NCisJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHdvcmtiZW5jaFdpbmRvdy5nZXRTaGVsbCgpLCBTdGFuZGFyZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9PcGVuRWRpdG9yRXJyb3JfbGFiZWwiKSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7DQorCQkJCXJldHVybiBmYWxzZTsNCisJCQl9DQorDQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCVN0YW5kYXJkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgb25lIHBhZ2Ugb2YgdGhlIHdpemFyZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBTdGFuZGFyZE1vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2Ugew0KKwkJLyoqDQorCQkgKiBQYXNzIGluIHRoZSBzZWxlY3Rpb24uDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTdGFuZGFyZE1vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZShTdHJpbmcgcGFnZUlkLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCQlzdXBlcihwYWdlSWQsIHNlbGVjdGlvbik7DQorCQl9DQorDQorCQkvKioNCisJCSAqIFRoZSBmcmFtZXdvcmsgY2FsbHMgdGhpcyB0byBzZWUgaWYgdGhlIGZpbGUgaXMgY29ycmVjdC4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJQE92ZXJyaWRlDQorCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7DQorCQkJaWYgKHN1cGVyLnZhbGlkYXRlUGFnZSgpKSB7DQorCQkJCVN0cmluZyBleHRlbnNpb24gPSBuZXcgUGF0aChnZXRGaWxlTmFtZSgpKS5nZXRGaWxlRXh0ZW5zaW9uKCk7DQorCQkJCWlmIChleHRlbnNpb24gPT0gbnVsbCB8fCAhRklMRV9FWFRFTlNJT05TLmNvbnRhaW5zKGV4dGVuc2lvbikpIHsNCisJCQkJCVN0cmluZyBrZXkgPSBGSUxFX0VYVEVOU0lPTlMuc2l6ZSgpID4gMSA/ICJfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbnMiIDogIl9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uIjsNCisJCQkJCXNldEVycm9yTWVzc2FnZShTdGFuZGFyZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5LCBuZXcgT2JqZWN0IFtdIHsgRk9STUFUVEVEX0ZJTEVfRVhURU5TSU9OUyB9KSk7DQorCQkJCQlyZXR1cm4gZmFsc2U7DQorCQkJCX0NCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgSUZpbGUgZ2V0TW9kZWxGaWxlKCkgew0KKwkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5hcHBlbmQoZ2V0RmlsZU5hbWUoKSkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBwYWdlIHdoZXJlIHRoZSB0eXBlIG9mIG9iamVjdCB0byBjcmVhdGUgaXMgc2VsZWN0ZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgU3RhbmRhcmRNb2RlbFdpemFyZEluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgQ29tYm8gaW5pdGlhbE9iamVjdEZpZWxkOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKi8NCisJCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gZW5jb2RpbmdzOw0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBDb21ibyBlbmNvZGluZ0ZpZWxkOw0KKw0KKwkJLyoqDQorCQkgKiBQYXNzIGluIHRoZSBzZWxlY3Rpb24uDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTdGFuZGFyZE1vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZShTdHJpbmcgcGFnZUlkKSB7DQorCQkJc3VwZXIocGFnZUlkKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCisJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsgew0KKwkJCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7DQorCQkJCWxheW91dC5udW1Db2x1bW5zID0gMTsNCisJCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEyOw0KKwkJCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7DQorDQorCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsNCisJCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQorCQkJCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOw0KKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsNCisJCQl9DQorDQorCQkJTGFiZWwgY29udGFpbmVyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7DQorCQkJew0KKwkJCQljb250YWluZXJMYWJlbC5zZXRUZXh0KFN0YW5kYXJkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX01vZGVsT2JqZWN0IikpOw0KKw0KKwkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7DQorCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQorCQkJCWNvbnRhaW5lckxhYmVsLnNldExheW91dERhdGEoZGF0YSk7DQorCQkJfQ0KKw0KKwkJCWluaXRpYWxPYmplY3RGaWVsZCA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5CT1JERVIpOw0KKwkJCXsNCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOw0KKwkJCQlpbml0aWFsT2JqZWN0RmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsNCisJCQl9DQorDQorCQkJZm9yIChTdHJpbmcgb2JqZWN0TmFtZSA6IGdldEluaXRpYWxPYmplY3ROYW1lcygpKSB7DQorCQkJCWluaXRpYWxPYmplY3RGaWVsZC5hZGQoZ2V0TGFiZWwob2JqZWN0TmFtZSkpOw0KKwkJCX0NCisNCisJCQlpZiAoaW5pdGlhbE9iamVjdEZpZWxkLmdldEl0ZW1Db3VudCgpID09IDEpIHsNCisJCQkJaW5pdGlhbE9iamVjdEZpZWxkLnNlbGVjdCgwKTsNCisJCQl9DQorCQkJaW5pdGlhbE9iamVjdEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHZhbGlkYXRvcik7DQorDQorCQkJTGFiZWwgZW5jb2RpbmdMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsNCisJCQl7DQorCQkJCWVuY29kaW5nTGFiZWwuc2V0VGV4dChTdGFuZGFyZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9YTUxFbmNvZGluZyIpKTsNCisNCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJCQllbmNvZGluZ0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7DQorCQkJfQ0KKwkJCWVuY29kaW5nRmllbGQgPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSKTsNCisJCQl7DQorCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsNCisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCisJCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsNCisJCQkJZW5jb2RpbmdGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOw0KKwkJCX0NCisNCisJCQlmb3IgKFN0cmluZyBlbmNvZGluZyA6IGdldEVuY29kaW5ncygpKSB7DQorCQkJCWVuY29kaW5nRmllbGQuYWRkKGVuY29kaW5nKTsNCisJCQl9DQorDQorCQkJZW5jb2RpbmdGaWVsZC5zZWxlY3QoMCk7DQorCQkJZW5jb2RpbmdGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih2YWxpZGF0b3IpOw0KKw0KKwkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7DQorCQkJc2V0Q29udHJvbChjb21wb3NpdGUpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciB2YWxpZGF0b3IgPQ0KKwkJCW5ldyBNb2RpZnlMaXN0ZW5lcigpIHsNCisJCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7DQorCQkJCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7DQorCQkJcmV0dXJuIGdldEluaXRpYWxPYmplY3ROYW1lKCkgIT0gbnVsbCAmJiBnZXRFbmNvZGluZ3MoKS5jb250YWlucyhlbmNvZGluZ0ZpZWxkLmdldFRleHQoKSk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJQE92ZXJyaWRlDQorCQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgew0KKwkJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7DQorCQkJaWYgKHZpc2libGUpIHsNCisJCQkJaWYgKGluaXRpYWxPYmplY3RGaWVsZC5nZXRJdGVtQ291bnQoKSA9PSAxKSB7DQorCQkJCQlpbml0aWFsT2JqZWN0RmllbGQuY2xlYXJTZWxlY3Rpb24oKTsNCisJCQkJCWVuY29kaW5nRmllbGQuc2V0Rm9jdXMoKTsNCisJCQkJfQ0KKwkJCQllbHNlIHsNCisJCQkJCWVuY29kaW5nRmllbGQuY2xlYXJTZWxlY3Rpb24oKTsNCisJCQkJCWluaXRpYWxPYmplY3RGaWVsZC5zZXRGb2N1cygpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbE9iamVjdE5hbWUoKSB7DQorCQkJU3RyaW5nIGxhYmVsID0gaW5pdGlhbE9iamVjdEZpZWxkLmdldFRleHQoKTsNCisNCisJCQlmb3IgKFN0cmluZyBuYW1lIDogZ2V0SW5pdGlhbE9iamVjdE5hbWVzKCkpIHsNCisJCQkJaWYgKGdldExhYmVsKG5hbWUpLmVxdWFscyhsYWJlbCkpIHsNCisJCQkJCXJldHVybiBuYW1lOw0KKwkJCQl9DQorCQkJfQ0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7DQorCQkJcmV0dXJuIGVuY29kaW5nRmllbGQuZ2V0VGV4dCgpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIG5hbWUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoU3RyaW5nIHR5cGVOYW1lKSB7DQorCQkJdHJ5IHsNCisJCQkJcmV0dXJuIFN0YW5kYXJkRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV8iICsgdHlwZU5hbWUgKyAiX3R5cGUiKTsNCisJCQl9DQorCQkJY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkgew0KKwkJCQlTdGFuZGFyZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2cobXJlKTsNCisJCQl9DQorCQkJcmV0dXJuIHR5cGVOYW1lOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0RW5jb2RpbmdzKCkgew0KKwkJCWlmIChlbmNvZGluZ3MgPT0gbnVsbCkgew0KKwkJCQllbmNvZGluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCisJCQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihTdGFuZGFyZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9YTUxFbmNvZGluZ0Nob2ljZXMiKSk7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgew0KKwkJCQkJZW5jb2RpbmdzLmFkZChzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCkpOw0KKwkJCQl9DQorCQkJfQ0KKwkJCXJldHVybiBlbmNvZGluZ3M7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoZSBmcmFtZXdvcmsgY2FsbHMgdGhpcyB0byBjcmVhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSB3aXphcmQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwkJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgew0KKwkJLy8gQ3JlYXRlIGEgcGFnZSwgc2V0IHRoZSB0aXRsZSwgYW5kIHRoZSBpbml0aWFsIG1vZGVsIGZpbGUgbmFtZS4NCisJCS8vDQorCQluZXdGaWxlQ3JlYXRpb25QYWdlID0gbmV3IFN0YW5kYXJkTW9kZWxXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlKCJXaGF0ZXZlciIsIHNlbGVjdGlvbik7DQorCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldFRpdGxlKFN0YW5kYXJkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1N0YW5kYXJkTW9kZWxXaXphcmRfbGFiZWwiKSk7DQorCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldERlc2NyaXB0aW9uKFN0YW5kYXJkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1N0YW5kYXJkTW9kZWxXaXphcmRfZGVzY3JpcHRpb24iKSk7DQorCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldEZpbGVOYW1lKFN0YW5kYXJkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1N0YW5kYXJkRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZSIpICsgIi4iICsgRklMRV9FWFRFTlNJT05TLmdldCgwKSk7DQorCQlhZGRQYWdlKG5ld0ZpbGVDcmVhdGlvblBhZ2UpOw0KKw0KKwkJLy8gVHJ5IGFuZCBnZXQgdGhlIHJlc291cmNlIHNlbGVjdGlvbiB0byBkZXRlcm1pbmUgYSBjdXJyZW50IGRpcmVjdG9yeSBmb3IgdGhlIGZpbGUgZGlhbG9nLg0KKwkJLy8NCisJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgew0KKwkJCS8vIEdldCB0aGUgcmVzb3VyY2UuLi4NCisJCQkvLw0KKwkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCk7DQorCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgew0KKwkJCQkvLyBHZXQgdGhlIHJlc291cmNlIHBhcmVudCwgaWYgaXRzIGEgZmlsZS4NCisJCQkJLy8NCisJCQkJSVJlc291cmNlIHNlbGVjdGVkUmVzb3VyY2UgPSAoSVJlc291cmNlKXNlbGVjdGVkRWxlbWVudDsNCisJCQkJaWYgKHNlbGVjdGVkUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7DQorCQkJCQlzZWxlY3RlZFJlc291cmNlID0gc2VsZWN0ZWRSZXNvdXJjZS5nZXRQYXJlbnQoKTsNCisJCQkJfQ0KKw0KKwkJCQkvLyBUaGlzIGdpdmVzIHVzIGEgZGlyZWN0b3J5Li4uDQorCQkJCS8vDQorCQkJCWlmIChzZWxlY3RlZFJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlciB8fCBzZWxlY3RlZFJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsNCisJCQkJCS8vIFNldCB0aGlzIGZvciB0aGUgY29udGFpbmVyLg0KKwkJCQkJLy8NCisJCQkJCW5ld0ZpbGVDcmVhdGlvblBhZ2Uuc2V0Q29udGFpbmVyRnVsbFBhdGgoc2VsZWN0ZWRSZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsNCisNCisJCQkJCS8vIE1ha2UgdXAgYSB1bmlxdWUgbmV3IG5hbWUgaGVyZS4NCisJCQkJCS8vDQorCQkJCQlTdHJpbmcgZGVmYXVsdE1vZGVsQmFzZUZpbGVuYW1lID0gU3RhbmRhcmRFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlIik7DQorCQkJCQlTdHJpbmcgZGVmYXVsdE1vZGVsRmlsZW5hbWVFeHRlbnNpb24gPSBGSUxFX0VYVEVOU0lPTlMuZ2V0KDApOw0KKwkJCQkJU3RyaW5nIG1vZGVsRmlsZW5hbWUgPSBkZWZhdWx0TW9kZWxCYXNlRmlsZW5hbWUgKyAiLiIgKyBkZWZhdWx0TW9kZWxGaWxlbmFtZUV4dGVuc2lvbjsNCisJCQkJCWZvciAoaW50IGkgPSAxOyAoKElDb250YWluZXIpc2VsZWN0ZWRSZXNvdXJjZSkuZmluZE1lbWJlcihtb2RlbEZpbGVuYW1lKSAhPSBudWxsOyArK2kpIHsNCisJCQkJCQltb2RlbEZpbGVuYW1lID0gZGVmYXVsdE1vZGVsQmFzZUZpbGVuYW1lICsgaSArICIuIiArIGRlZmF1bHRNb2RlbEZpbGVuYW1lRXh0ZW5zaW9uOw0KKwkJCQkJfQ0KKwkJCQkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXRGaWxlTmFtZShtb2RlbEZpbGVuYW1lKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCWluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UgPSBuZXcgU3RhbmRhcmRNb2RlbFdpemFyZEluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UoIldoYXRldmVyMiIpOw0KKwkJaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5zZXRUaXRsZShTdGFuZGFyZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZE1vZGVsV2l6YXJkX2xhYmVsIikpOw0KKwkJaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5zZXREZXNjcmlwdGlvbihTdGFuZGFyZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb24iKSk7DQorCQlhZGRQYWdlKGluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBHZXQgdGhlIGZpbGUgZnJvbSB0aGUgcGFnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlsZSBnZXRNb2RlbEZpbGUoKSB7DQorCQlyZXR1cm4gbmV3RmlsZUNyZWF0aW9uUGFnZS5nZXRNb2RlbEZpbGUoKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9BY3RpdmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL0FjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNWFjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9BY3RpdmF0b3IuamF2YQpAQCAtMCwwICsxLDExNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5wcmVzZW50YXRpb24uU3RhbmRhcmRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLmFkYXB0ZXJzLlBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLmFkYXB0ZXJzLlN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLndpemFyZHMuU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC53aXphcmRzLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQud2l6YXJkcy5TdGFuZGFyZFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworLyoqCisgKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KKyAqLworcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4geworCisJLyoqCisJICogVGhlIHN5bWJvbGljIGlkZW50aWZpZXIgZm9yIHRoaXMgcGx1Zy1pbgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMiOyAvLyROT04tTkxTLTEkCisKKwkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgorCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47CisKKwkvKioKKwkgKiBUaGUgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIEFjdGl2YXRvcigpIHsKKwkJc3VwZXIoKTsKKwkJcGx1Z2luID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KKwkgKiAKKwkgKiBAcGFyYW0gY29udGV4dAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc3RhcnQoY29udGV4dCk7CisJCW5ldyBTdGFuZGFyZFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOworCQluZXcgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5KCk7CisJCW5ldyBTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkoKTsKKwkJbmV3IFN0YW5kYXJkRWRpdG9yKCk7CisJCS8vIEFkZCB0byBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQluZXcgU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOworCisJCQorCX0gLy8gc3RhcnQKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKKwkgKiAKKwkgKiBAcGFyYW0gY29udGV4dAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdG9wKGNvbnRleHQpOworCQlwbHVnaW4gPSBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UuCisJICovCisJcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKKworCS8qKgorCSAqIExvZyBhbiBlcnJvciB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4KKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqICAgICAgICAgICAgdGhlIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIHRleHQKKwkgKiBAcGFyYW0gZXhjZXB0aW9uCisJICogICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJcGx1Z2luLmdldExvZygpLmxvZygKKwkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKKwkJCQkJCTAsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOworCX0gLy8gbG9nRXJyb3IKKworCS8qKgorCSAqIExvZyBpbmZvcm1hdGlvbiB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4KKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqICAgICAgICAgICAgdGhlIGxvY2FsaXplZCBpbmZvcm1hdGlvbiBtZXNzYWdlIHRleHQKKwkgKiBAcGFyYW0gZXhjZXB0aW9uCisJICogICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW5mb3JtYXRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJcGx1Z2luLmdldExvZygpLmxvZygKKwkJCQluZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAorCQkJCQkJMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7CisJfSAvLyBsb2dJbmZvcm1hdGlvbgorCit9IC8vIEFjdGl2YXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvYWRhcHRlcnMvUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL2FkYXB0ZXJzL1BvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzZGNkNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL2FkYXB0ZXJzL1BvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yLmphdmEKQEAgLTAsMCArMSw4NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuYWRhcHRlcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmVkaXRvcnMuR2VuZXJpY1Byb3BlcnR5RWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorYWJzdHJhY3QgcHVibGljIGNsYXNzIFBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yIGV4dGVuZHMgR2VuZXJpY1Byb3BlcnR5RWRpdG9yIHsKKworCS8qKgorCSAqIEBwYXJhbSBmZWF0dXJlCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmVhdHVyZSBpcyBhIGR1YmxpbiBjb3JlIGZlYXR1cmUgdGhhdAorCSAqICAgICAgICAgaXMgc3BlY2lmaWVkIGJ5IGEgdXNlci4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1VzZXJTcGVjaWZpZWRQcm9wZXJ0eShmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisJCWlmKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgPT0gU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fSU5JVElBTElaRVJfX1RBUkdFVF9JU09fS0VZKQorCQkJcmV0dXJuIGZhbHNlOworCQlmaW5hbCBFQ2xhc3MgY29udGFpbmluZ0NsYXNzID0gZmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCk7CisJCS8vIElzIGl0IGEgZGlzZWFzZSBtb2RlbCBwcm9wZXJ0eT8KKwkJaWYgKGNvbnRhaW5pbmdDbGFzcy5lcXVhbHMoU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKSkKKwkJCQl8fCBjb250YWluaW5nQ2xhc3MuZ2V0RUFsbFN1cGVyVHlwZXMoKS5jb250YWlucygKKwkJCQkJCVN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9wdWxhdGlvbkluaXRpYWxpemVyKCkpKSB7CisJCQkvLyBZZXMKKwkJCXJldFZhbHVlID0gdHJ1ZTsKKwkJfSAvLyBpZiBhIGRpc2Vhc2UgbW9kZWwgcHJvcGVydHkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gaXNVc2VyU3BlY2lmaWVkRGlzZWFzZU1vZGVsUHJvcGVydHkKKworCXB1YmxpYyBQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIElQcm9qZWN0IHByb2plY3QpIHsKKwkJc3VwZXIocGFyZW50LHN0eWxlLCBwcm9qZWN0KTsKKwl9CisKKwlwdWJsaWMgUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3IoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgaW50IHN0eWxlLAorCQkJZmluYWwgUG9wdWxhdGlvbkluaXRpYWxpemVyIHBvcHVsYXRpb25Jbml0aWFsaXplciwKKwkJCWZpbmFsIE1vZGlmeUxpc3RlbmVyIHByb2plY3RWYWxpZGF0b3IsIElQcm9qZWN0IHByb2plY3QpIHsKKwkJc3VwZXIocGFyZW50LCBzdHlsZSwgcG9wdWxhdGlvbkluaXRpYWxpemVyLCBwcm9qZWN0VmFsaWRhdG9yLCBwcm9qZWN0KTsKKwl9CisJCisJcHVibGljIHZvaWQgcG9wdWxhdGUoUG9wdWxhdGlvbkluaXRpYWxpemVyIHBvcHVsYXRpb25Jbml0aWFsaXplcikgeworCQkKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKKwkJCisJCQorCQlyZXR1cm4gdHJ1ZTsKKwl9IC8vIHZhbGlkYXRlCisKKwkJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNoZWNrU3ViY2xhc3MoKSB7CisJCS8vIERpc2FibGUgdGhlIGNoZWNrIHRoYXQgcHJldmVudHMgc3ViLWNsYXNzaW5nIG9mIFNXVCBjb21wb25lbnRzCisJfQorCisKK30gLy8gUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL2FkYXB0ZXJzL1BvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvYWRhcHRlcnMvUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3JBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzZWNhOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL2FkYXB0ZXJzL1BvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLmFkYXB0ZXJzOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC53aXphcmRzLlBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CisKK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbAorCQlpbXBsZW1lbnRzIEFkYXB0ZXIgeworCisJYWJzdHJhY3QgcHVibGljIFBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yIGNyZWF0ZVBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yKAorCQkJUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlDb21wb3NpdGUgcG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlDb21wb3NpdGUsCisJCQlpbnQgc3R5bGUsIE1vZGlmeUxpc3RlbmVyIHByb2plY3RWYWxpZGF0b3IsIElQcm9qZWN0IHByb2plY3QpOworfSAvLyBQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL2FkYXB0ZXJzL1BvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL2FkYXB0ZXJzL1BvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzlkMDM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvYWRhcHRlcnMvUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8vIERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuYWRhcHRlcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cworICovCitwdWJsaWMgaW50ZXJmYWNlIFBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkgeworCisJUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeUltcGwgSU5TVEFOQ0UgPSBuZXcgUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeUltcGwoKTsKKworCXB1YmxpYyBjbGFzcyBQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzCisJCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMKKwkJCVBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkgeworCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCQlyZXR1cm4gdHlwZSA9PSBQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuY2xhc3M7CisJCX0KKworCX0gCit9IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL2FkYXB0ZXJzL1BvcHVsYXRpb25Nb2RlbE5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9hZGFwdGVycy9Qb3B1bGF0aW9uTW9kZWxOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OTAxZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9hZGFwdGVycy9Qb3B1bGF0aW9uTW9kZWxOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvLyBEaXNlYXNlTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuYWRhcHRlcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQudXRpbC5TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubmV3bW9kaWZpZXJwYWdlLk5ld01vZGlmaWVyUGFnZUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5uZXdtb2RpZmllcnBhZ2UuTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLndpemFyZHMuUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld01vZGlmaWVyUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGFuIHtAbGluayBOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeX0gdGhhdCBhZGFwdHMKKyAqIHtAbGluayBQb3B1bGF0aW9uTW9kZWx9cyBhbmQge0BsaW5rIFBvcHVsYXRpb25Jbml0aWFsaXplcn1zIHRvIHtAbGluayBOZXdNb2RpZmllclBhZ2V9cy4KKyAqLworcHVibGljIGNsYXNzIFBvcHVsYXRpb25Nb2RlbE5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKKwkJU3RhbmRhcmRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIE5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5LCBJU3RhcnR1cCB7CisKKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBQb3B1bGF0aW9uTW9kZWxOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRkQWRhcHRlckZhY3RvcnkodGhpcyk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cCNlYXJseVN0YXJ0dXAoKQorCSAqLworCXB1YmxpYyB2b2lkIGVhcmx5U3RhcnR1cCgpIHsKKwkJLy8gTm90aGluZyB0byBkbyB0aGUgY29uc3RydWN0b3Igd2lsbCBkbyBldmVyeXRoaW5nLgkJCisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8udXRpbC5TY2VuYXJpb0FkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKGZpbmFsIE9iamVjdCB0eXBlKSB7CisJCXJldHVybiB0eXBlID09IE5ld01vZGlmaWVyUGFnZUFkYXB0ZXIuY2xhc3MgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3B1bGF0aW9uTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IFBvcHVsYXRpb25Nb2RlbE5ld01vZGlmaWVyUGFnZUFkYXB0ZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgUG9wdWxhdGlvbk1vZGVsTmV3TW9kaWZpZXJQYWdlQWRhcHRlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0b2NoYXN0aWNTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgUG9wdWxhdGlvbk1vZGVsTmV3TW9kaWZpZXJQYWdlQWRhcHRlcigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWFzb25hbFBvcHVsYXRpb25Nb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgUG9wdWxhdGlvbk1vZGVsTmV3TW9kaWZpZXJQYWdlQWRhcHRlcigpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3B1bGF0aW9uSW5pdGlhbGl6ZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IFBvcHVsYXRpb25Nb2RlbE5ld01vZGlmaWVyUGFnZUFkYXB0ZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplckFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgUG9wdWxhdGlvbk1vZGVsTmV3TW9kaWZpZXJQYWdlQWRhcHRlcigpOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGFkYXB0cyB7QGxpbmsgUG9wdWxhdGlvbk1vZGVsfXMgdG8ge0BsaW5rIE5ld01vZGlmaWVyUGFnZX1zCisJICovCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUG9wdWxhdGlvbk1vZGVsTmV3TW9kaWZpZXJQYWdlQWRhcHRlciBleHRlbmRzCisJCQlOZXdNb2RpZmllclBhZ2VBZGFwdGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLm5ld21vZGlmaWVycGFnZS5OZXdNb2RpZmllclBhZ2VBZGFwdGVyI2NyZWF0ZU5ld01vZGlmaWVyUGFnZSgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE5ld01vZGlmaWVyUGFnZSBjcmVhdGVOZXdNb2RpZmllclBhZ2UoKSB7CisJCQlyZXR1cm4gbmV3IE5ld01vZGlmaWVyUGFnZSgoSWRlbnRpZmlhYmxlKSBnZXRUYXJnZXQoKSkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBib29sZWFuIGlzVXNlclNwZWNpZmllZFByb3BlcnR5KAorCQkJCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJCQkJYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOworCQkJCQlmaW5hbCBFQ2xhc3MgY29udGFpbmluZ0NsYXNzID0gZmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCk7CisJCQkJCS8vIElzIGl0IGEgZGlzZWFzZSBtb2RlbCBwcm9wZXJ0eT8KKwkJCQkJaWYgKGNvbnRhaW5pbmdDbGFzcy5lcXVhbHMoU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3B1bGF0aW9uTW9kZWwoKSkKKwkJCQkJCQl8fCBjb250YWluaW5nQ2xhc3MuZ2V0RUFsbFN1cGVyVHlwZXMoKS5jb250YWlucygKKwkJCQkJCQkJCVN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9wdWxhdGlvbk1vZGVsKCkpIHx8CisJCQkJCQkJCQljb250YWluaW5nQ2xhc3MuZXF1YWxzKFN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9wdWxhdGlvbkluaXRpYWxpemVyKCkpIHx8CisJCQkJCQkJCQkJCWNvbnRhaW5pbmdDbGFzcy5nZXRFQWxsU3VwZXJUeXBlcygpLmNvbnRhaW5zKAorCQkJCQkJCQkJCQkJCVN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9wdWxhdGlvbkluaXRpYWxpemVyKCkpKSB7CisJCQkJCQkKKwkJCQkJCWlmKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgPT0gU3RhbmRhcmRQYWNrYWdlLkRFTU9HUkFQSElDX1BPUFVMQVRJT05fTU9ERUxfX1BPUFVMQVRJT05fR1JPVVBTKQorCQkJCQkJCXJldHVybiBmYWxzZTsKKworCQkJCQkJLy8gWWVzCisJCQkJCQlyZXRWYWx1ZSA9IHRydWU7CisJCQkJCX0gLy8gaWYgYSBwb3B1bGF0aW9uIG1vZGVsIHByb3BlcnR5CisJCQkJCXJldHVybiByZXRWYWx1ZTsKKwkJCQl9IC8vIGlzVXNlclNwZWNpZmllZFByb3BlcnR5CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJvdHRvbVRleHQoKSB7CisJCQkJCXJldHVybiBQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIlBNVFBfRGVmIik7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNNb2RpZmlhYmxlUHJvcGVydHkoCisJCQkJCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQkJCQlib29sZWFuIHJldFZhbHVlID0gc3VwZXIuaXNNb2RpZmlhYmxlUHJvcGVydHkoZmVhdHVyZSk7CisKKwkJCQkJcmV0dXJuIHJldFZhbHVlOworCQkJCX0gLy8gaXNNb2RpZmlhYmxlUHJvcGVydHkKKwkJCX07CisJCX0gLy8gY3JlYXRlTmV3TW9kaWZpZXJQYWdlCisKKwl9IC8vIAorfSAvLyAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL2FkYXB0ZXJzL1BvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9hZGFwdGVycy9Qb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NTM3MzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9hZGFwdGVycy9Qb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvci5qYXZhCkBAIC0wLDAgKzEsODcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLmFkYXB0ZXJzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuZWRpdG9ycy5HZW5lcmljUHJvcGVydHlFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3IgZXh0ZW5kcyBHZW5lcmljUHJvcGVydHlFZGl0b3IgeworCisJLyoqCisJICogQHBhcmFtIGZlYXR1cmUKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmZWF0dXJlIGlzIGEgZHVibGluIGNvcmUgZmVhdHVyZSB0aGF0CisJICogICAgICAgICBpcyBzcGVjaWZpZWQgYnkgYSB1c2VyLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzVXNlclNwZWNpZmllZFByb3BlcnR5KGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKKwkJaWYoZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSA9PSBTdGFuZGFyZFBhY2thZ2UuREVNT0dSQVBISUNfUE9QVUxBVElPTl9NT0RFTF9fUE9QVUxBVElPTl9HUk9VUFMpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgPT0gU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fTU9ERUxfX1RBUkdFVF9JU09fS0VZKQorCQkJcmV0dXJuIGZhbHNlOworCQlmaW5hbCBFQ2xhc3MgY29udGFpbmluZ0NsYXNzID0gZmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCk7CisJCS8vIElzIGl0IGEgZGlzZWFzZSBtb2RlbCBwcm9wZXJ0eT8KKwkJaWYgKGNvbnRhaW5pbmdDbGFzcy5lcXVhbHMoU3RhbmRhcmRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3B1bGF0aW9uTW9kZWwoKSkKKwkJCQl8fCBjb250YWluaW5nQ2xhc3MuZ2V0RUFsbFN1cGVyVHlwZXMoKS5jb250YWlucygKKwkJCQkJCVN0YW5kYXJkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9wdWxhdGlvbk1vZGVsKCkpKSB7CisJCQkvLyBZZXMKKwkJCXJldFZhbHVlID0gdHJ1ZTsKKwkJfSAvLyBpZiBhIGRpc2Vhc2UgbW9kZWwgcHJvcGVydHkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gaXNVc2VyU3BlY2lmaWVkRGlzZWFzZU1vZGVsUHJvcGVydHkKKworCisJcHVibGljIFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgSVByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcihwYXJlbnQsc3R5bGUsIHByb2plY3QpOworCX0KKworCXB1YmxpYyBQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvcihmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBpbnQgc3R5bGUsCisJCQlmaW5hbCBQb3B1bGF0aW9uTW9kZWwgcG9wdWxhdGlvbk1vZGVsLAorCQkJZmluYWwgTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcihwYXJlbnQsIHN0eWxlLCBwb3B1bGF0aW9uTW9kZWwsIHByb2plY3RWYWxpZGF0b3IsIHByb2plY3QpOworCisJfQorCQkKKwlwdWJsaWMgdm9pZCBwb3B1bGF0ZShQb3B1bGF0aW9uTW9kZWwgcG9wdWxhdGlvbk1vZGVsKSB7CisJCQorCX0KKworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgeworCQkKKwkJCisJCXJldHVybiB0cnVlOworCX0gLy8gdmFsaWRhdGUKKworCQkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tTdWJjbGFzcygpIHsKKwkJLy8gRGlzYWJsZSB0aGUgY2hlY2sgdGhhdCBwcmV2ZW50cyBzdWItY2xhc3Npbmcgb2YgU1dUIGNvbXBvbmVudHMKKwl9CisKK30gLy8gUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL2FkYXB0ZXJzL1BvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvYWRhcHRlcnMvUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA3ZTBiNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL2FkYXB0ZXJzL1BvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLmFkYXB0ZXJzOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC53aXphcmRzLlBvcHVsYXRpb25Nb2RlbFByb3BlcnR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CisKK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbAorCQlpbXBsZW1lbnRzIEFkYXB0ZXIgeworCisJYWJzdHJhY3QgcHVibGljIFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yIGNyZWF0ZVBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yKAorCQkJUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlDb21wb3NpdGUgZGlzZWFzZU1vZGVsUHJvcGVydHlDb21wb3NpdGUsCisJCQlpbnQgc3R5bGUsIE1vZGlmeUxpc3RlbmVyIHByb2plY3RWYWxpZGF0b3IsIElQcm9qZWN0IHByb2plY3QpOworfSAvLyBQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL2FkYXB0ZXJzL1BvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL2FkYXB0ZXJzL1BvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjAwODY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvYWRhcHRlcnMvUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8vIERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuYWRhcHRlcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cworICovCitwdWJsaWMgaW50ZXJmYWNlIFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkgeworCisJUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeUltcGwgSU5TVEFOQ0UgPSBuZXcgUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeUltcGwoKTsKKworCXB1YmxpYyBjbGFzcyBQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzCisJCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMKKwkJCVBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkgeworCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCQlyZXR1cm4gdHlwZSA9PSBQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuY2xhc3M7CisJCX0KKworCX0gLy8gUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeUltcGwKK30gLy8gUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvYWRhcHRlcnMvU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvYWRhcHRlcnMvU3RhbmRhcmRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNWNhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9hZGFwdGVycy9TdGFuZGFyZFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzNTMgQEAKKy8vIFN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuYWRhcHRlcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQudXRpbC5TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlSW5pdGlhbGl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIGZhY3RvcnkgZm9yIHRoaXMgbW9kZWwgdGhhdCBjcmVhdGVzCisgKiB7QGxpbmsgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyfSdzIGZvciBjbGFzc2VzIGluIHRoZSBtb2RlbC4KKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcworCQlTdGFuZGFyZEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnksIElTdGFydHVwIHsKKwkKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzCisJICogYWRhcHRlciBmYWN0b3J5LgorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LgorCSAqLworCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKKworCS8qKgorCSAqIFRoaXMgZmFjdG9yeSBpcyB1c2VkIHRvIGNyZWF0ZSBpdGVtIHByb3ZpZGVycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3Nlcy4KKwkgKiBUaGUgaXRlbSBwcm92aWRlcnMgYXJlIHVzZWQgYXMgcHJvcGVydHkgc291cmNlcyB0byBnZXQgdGhlIHByb3BlcnRpZXMKKwkgKiB0aGF0IGNhbiBoYXZlIHJlbGF0aXZlIHZhbHVlcy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdGFuZGFyZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGl0ZW1Qcm92aWRlckZhY3Rvcnk7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBTdGFuZGFyZFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgeworCQlzdXBlcigpOworCQlSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGRBZGFwdGVyRmFjdG9yeSh0aGlzKTsKKwl9IC8vIFN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUge0BsaW5rIFN0YW5kYXJkU3dpdGNofSBpbnN0YW5jZSBpbiB0aGUKKwkgKiBwYXJlbnQge0BsaW5rIFN0YW5kYXJkQWRhcHRlckZhY3Rvcnl9IGZvciBhbGwgY2FzZXMgZm9yIGNsYXNzZXMgZGVyaXZlZAorCSAqIGZyb20ge0BsaW5rIERpc2Vhc2VNb2RlbExhYmVsfSAoZS5nLiwge0BsaW5rIFNJTGFiZWx9LCB7QGxpbmsgU0lSTGFiZWx9LAorCSAqIHtAbGluayBTRUlSTGFiZWx9KS4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC51dGlsLlN0YW5kYXJkQWRhcHRlckZhY3RvcnkjY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWxBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsQWRhcHRlcigpIHsKKwkJLy8gSXQgc2VlbXMgdGhhdCB5b3UgY2FuJ3QgaGF2ZSBzaW5nbGV0b24gYWRhcHRlcnMgdGhhdCBwcm92aWRlCisJCS8vIGJlaGF2aW9yYWwgZXh0ZW5zaW9ucyB3aXRob3V0IGV4cGxpY2l0bHkgc2V0dGluZyB0aGUgdGFyZ2V0CisJCS8vIGVhY2ggdGltZSBpdCBpcyBhZGFwdGVkCisJCXJldHVybiBuZXcgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFJlbGF0aXZlVmFsdWVQcm92aWRlcigpOworCX0gLy8gY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWxBZGFwdGVyCisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHtAbGluayBTdGFuZGFyZFN3aXRjaH0gaW5zdGFuY2UgaW4gdGhlCisJICogcGFyZW50IHtAbGluayBTdGFuZGFyZEFkYXB0ZXJGYWN0b3J5fSBmb3IgYWxsIGNhc2VzIGZvciBjbGFzc2VzIGRlcml2ZWQKKwkgKiBmcm9tIHtAbGluayBEaXNlYXNlTW9kZWxMYWJlbFZhbHVlfSAoZS5nLiwge0BsaW5rIFNJTGFiZWxWYWx1ZX0sCisJICoge0BsaW5rIFNJUkxhYmVsVmFsdWV9LCB7QGxpbmsgU0VJUkxhYmVsVmFsdWV9KS4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC51dGlsLlN0YW5kYXJkQWRhcHRlckZhY3RvcnkjY3JlYXRlRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZUFkYXB0ZXIoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZUFkYXB0ZXIoKSB7CisJCS8vIEl0IHNlZW1zIHRoYXQgeW91IGNhbid0IGhhdmUgc2luZ2xldG9uIGFkYXB0ZXJzIHRoYXQgcHJvdmlkZQorCQkvLyBiZWhhdmlvcmFsIGV4dGVuc2lvbnMgd2l0aG91dCBleHBsaWNpdGx5IHNldHRpbmcgdGhlIHRhcmdldAorCQkvLyBlYWNoIHRpbWUgaXQgaXMgYWRhcHRlZAorCQlyZXR1cm4gbmV3IFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVSZWxhdGl2ZVZhbHVlUHJvdmlkZXIoKTsKKwl9IC8vIGNyZWF0ZURpc2Vhc2VNb2RlbExhYmVsVmFsdWVBZGFwdGVyCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfSAvLyBhZGRMaXN0ZW5lcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXIjZmlyZU5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKKwkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCX0KKwl9IC8vIGZpcmVOb3RpZnlDaGFuZ2VkCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisJCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisJfSAvLyByZW1vdmVMaXN0ZW5lcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5I2dldFJvb3RBZGFwdGVyRmFjdG9yeSgpCisJICovCisJcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeQorCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKKwl9IC8vIGdldFJvb3RBZGFwdGVyRmFjdG9yeQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5I3NldFBhcmVudEFkYXB0ZXJGYWN0b3J5KG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3RvcnkpCisJICovCisJcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoCisJCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7CisJCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKKwl9IC8vIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC51dGlsLlN0YW5kYXJkQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gUmVsYXRpdmVWYWx1ZVByb3ZpZGVyLmNsYXNzCisJCQkJfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9IC8vIGlzRmFjdG9yeUZvclR5cGUKKworCS8qKgorCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlI2Rpc3Bvc2UoKQorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCS8vIE5vdGhpbmcKKwl9IC8vIGRpc3Bvc2UKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoZSBSZWxhdGl2ZSBWYWx1ZSBQcm92aWRlciBBZGFwdGVyIEZhY3RvcnkKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBnZXRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFOworCX0gLy8gZ2V0UmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoZSBTdGFuZGFyZCBJdGVtIFByb3ZpZGVyIGZhY3RvcnkuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBnZXRJdGVtUHJvdmlkZXJGYWN0b3J5KCkgeworCQlpZiAoaXRlbVByb3ZpZGVyRmFjdG9yeSA9PSBudWxsKSB7CisJCQlpdGVtUHJvdmlkZXJGYWN0b3J5ID0gbmV3IFN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKKwkJfQorCQlyZXR1cm4gaXRlbVByb3ZpZGVyRmFjdG9yeTsKKwl9IC8vIGdldEl0ZW1Qcm92aWRlckZhY3RvcnkKKworCS8qKgorCSAqIAorCSAqIAorCSAqIEBzZWUgRGlzZWFzZU1vZGVsTGFiZWxWYWx1ZVJlbGF0aXZlVmFsdWVQcm92aWRlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxMYWJlbFJlbGF0aXZlVmFsdWVQcm92aWRlciBleHRlbmRzCisJCQlSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciNnZXRQcm9wZXJ0aWVzKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydGllcygpIHsKKwkJCWZpbmFsIFBvcHVsYXRpb25Nb2RlbExhYmVsIHBvcCA9IChQb3B1bGF0aW9uTW9kZWxMYWJlbCkgZ2V0VGFyZ2V0KCk7CisJCQlmaW5hbCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIgcnZwID0gKFJlbGF0aXZlVmFsdWVQcm92aWRlcikgZ2V0UmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKQorCQkJCQkuYWRhcHQocG9wLmdldEN1cnJlbnRWYWx1ZSgpLCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIuY2xhc3MpOworCQkJcmV0dXJuIHJ2cC5nZXRQcm9wZXJ0aWVzKCk7CisJCX0gLy8gZ2V0UHJvcGVydGllcworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyI2dldFJlbGF0aXZlVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgZG91YmxlIGdldFJlbGF0aXZlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJCWZpbmFsIFBvcHVsYXRpb25Nb2RlbExhYmVsIHBvcCA9IChQb3B1bGF0aW9uTW9kZWxMYWJlbCkgZ2V0VGFyZ2V0KCk7CisJCQlmaW5hbCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIgcnZwID0gKFJlbGF0aXZlVmFsdWVQcm92aWRlcikgZ2V0UmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKQorCQkJCQkuYWRhcHQocG9wLmdldEN1cnJlbnRWYWx1ZSgpLCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIuY2xhc3MpOworCQkJcmV0dXJuIHJ2cC5nZXRSZWxhdGl2ZVZhbHVlKGZlYXR1cmUpOworCQl9IC8vIGdldFJlbGF0aXZlVmFsdWUKKwkJCisJCS8qKgorCQkgKiB0aGlzIGhlbHBlciBtZXRob2QgcmV0dXJucyB0aGUgYWJzb2x1dGUgdG90YWwgcG9wdWxhdGlvbi4KKwkJICogSXQgaXMgcmVxdWlyZWQgd2hlbmV2ZXIgd2UgbmVlZCB0byBzd2l0Y2ggYmV0d2VlbiByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgdmFsdWVzCisJCSAqIEByZXR1cm4gdGhlIHRvdGFsIGN1cnJlbnQgcG9wdWxhdGlvbiBjb3VudCAoYWJzb2x1dGUpCisJCSAqLworCQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIGRvdWJsZSBnZXREZW5vbWluYXRvcihmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQkJU3RyaW5nIF9wb3BSZWYgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuUkVGRVJFTkNFX1BPUFVMQVRJT04pOworCQkJU3RyaW5nIF9kZW5zUmVmID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLlJFRkVSRU5DRV9ERU5TSVRZKTsKKwkKKwkJCWRvdWJsZSBwb3BSZWYgPSBEb3VibGUucGFyc2VEb3VibGUoX3BvcFJlZik7CisJCQlkb3VibGUgZGVuc1JlZiA9IERvdWJsZS5wYXJzZURvdWJsZShfZGVuc1JlZik7CisJCQkKKwkJCWlmKHBvcFJlZiA9PSAwKSBwb3BSZWYgPSBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuREVGQVVMVF9SRUZFUkVOQ0VfUE9QVUxBVElPTjsKKwkJCWlmKGRlbnNSZWYgPT0gMCkgcG9wUmVmID0gUHJlZmVyZW5jZUluaXRpYWxpemVyLkRFRkFVTFRfUkVGRVJFTkNFX0RFTlNJVFk7CisJCQorCQkJaWYoZmVhdHVyZSAhPSBudWxsICYmIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgPT0gU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0RFTlNJVFkpCisJCQkJcmV0dXJuIGRlbnNSZWY7CisJCQllbHNlCisJCQkJcmV0dXJuIHBvcFJlZjsKKwkJfQorCQkKKwkJCisJCQorCisJfSAvLyBEaXNlYXNlTW9kZWxMYWJlbFJlbGF0aXZlVmFsdWVQcm92aWRlcgorCisJLyoqCisJICoKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWVSZWxhdGl2ZVZhbHVlUHJvdmlkZXIgZXh0ZW5kcworCQkJUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIFJlbGF0aXZlVmFsdWVQcm92aWRlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXIjZ2V0UHJvcGVydGllcygpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnRpZXMoKSB7CisJCQlmaW5hbCBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+KCk7CisJCQlmaW5hbCBTdGFuZGFyZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGl0ZW1Qcm92aWRlckZhY3RvcnkgPSBnZXRJdGVtUHJvdmlkZXJGYWN0b3J5KCk7CisJCQlmaW5hbCBQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlIHBvcHYgPSAoUG9wdWxhdGlvbk1vZGVsTGFiZWxWYWx1ZSkgZ2V0VGFyZ2V0KCk7CisJCQlmaW5hbCBJSXRlbVByb3BlcnR5U291cmNlIHByb3BlcnR5U291cmNlID0gKElJdGVtUHJvcGVydHlTb3VyY2UpIGl0ZW1Qcm92aWRlckZhY3RvcnkKKwkJCQkJLmFkYXB0KHBvcHYsIFByb3BlcnR5U291cmNlLmNsYXNzKTsKKwkJCWZpbmFsIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BlcnRpZXMgPSBwcm9wZXJ0eVNvdXJjZQorCQkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhudWxsKTsKKwkJCS8vIFRoZSBsaXN0IG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzIGluY2x1ZGVzIG9uZXMgdGhhdCBkbyBub3QgaGF2ZQorCQkJLy8gcmVsYXRpdmUgdmFsdWVzLiBXZSBmaWx0ZXIgdGhvc2Ugb3V0IGhlcmUgYW5kIHJldHVybiB0aGUgcmVzdC4KKwkJCWZvciAoSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA6IHByb3BlcnRpZXMpIHsKKwkJCQkvLyBEb2VzIHRoaXMgcHJvcGVydHkgaGF2ZSBhIHJlbGF0aXZlIHZhbHVlPworCQkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZGVzY3JpcHRvcgorCQkJCQkJLmdldEZlYXR1cmUobnVsbCk7CisJCQkJZmluYWwgaW50IGZlYXR1cmVJZCA9IGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCk7CisJCQkJCisJCQkJCisJCQkJLy8gbmV3CisJCQkJaWYgKCEoZmVhdHVyZUlkID09IFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX0xBQkVMX1ZBTFVFX19CSVJUSFMgCisJCQkJCQl8fCBmZWF0dXJlSWQgPT0gU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0RFQVRIUyAKKwkJCQkJCXx8IGZlYXR1cmVJZCA9PSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRV9fSU5DSURFTkNFKSkgeworCQkJCQkvLyBZZXMKKwkJCQkKKwkJCQkJcmV0VmFsdWUuYWRkKGRlc2NyaXB0b3IpOworCQkJCQorCQkJCX0gLy8gaWYgaGFzIHJlbGF0aXZlIHZhbHVlCisJCQkJLy8gT2xkCisJCQkJLyoKKwkJCQlpZiAoIShmZWF0dXJlSWQgPT0gU3RhbmRhcmRQYWNrYWdlLkRJU0VBU0VfTU9ERUxfTEFCRUxfVkFMVUVfX0JJUlRIUworCQkJCQkJfHwgZmVhdHVyZUlkID09IFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19ERUFUSFMKKwkJCQkJCXx8IGZlYXR1cmVJZCA9PSBTdGFuZGFyZFBhY2thZ2UuRElTRUFTRV9NT0RFTF9MQUJFTF9WQUxVRV9fRElTRUFTRV9ERUFUSFMgfHwgZmVhdHVyZUlkID09IFN0YW5kYXJkUGFja2FnZS5ESVNFQVNFX01PREVMX0xBQkVMX1ZBTFVFX19QT1BVTEFUSU9OX0NPVU5UKSkgeworCQkJCQkvLyBZZXMKKwkJCQkJcmV0VmFsdWUuYWRkKGRlc2NyaXB0b3IpOworCQkJCX0gLy8gaWYgaGFzIHJlbGF0aXZlIHZhbHVlCisJCQkJKi8KKwkJCQkKKwkJCX0gLy8gZm9yCisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gZ2V0UHJvcGVydGllcworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXIjZ2V0UmVsYXRpdmVWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUpCisJCSAqLworCQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIGRvdWJsZSBnZXRSZWxhdGl2ZVZhbHVlKGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCQlmaW5hbCBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUgcG9wdiA9IChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbExhYmVsVmFsdWUpIGdldFRhcmdldCgpOworCQkJZmluYWwgZG91YmxlIGNvdW50ID0gKChEb3VibGUpIHBvcHYuZUdldChmZWF0dXJlKSkKKwkJCQkJLmRvdWJsZVZhbHVlKCk7CisJCQkKKwkJCVN0cmluZyBfcG9wUmVmID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLlJFRkVSRU5DRV9QT1BVTEFUSU9OKTsKKwkJCVN0cmluZyBfZGVuc1JlZiA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5SRUZFUkVOQ0VfREVOU0lUWSk7CisJCisJCQlpZigoX3BvcFJlZj09bnVsbCl8fChfcG9wUmVmLmxlbmd0aCgpPD0wKSkgeworCQkJCV9wb3BSZWYgPSAiMCI7CisJCQl9CisJCQlpZigoX2RlbnNSZWY9PW51bGwpfHwoX2RlbnNSZWYubGVuZ3RoKCk8PTApKSB7CisJCQkJX2RlbnNSZWYgPSAiMCI7CisJCQl9CisJCQlkb3VibGUgcG9wUmVmID0gRG91YmxlLnBhcnNlRG91YmxlKF9wb3BSZWYpOworCQkJZG91YmxlIGRlbnNSZWYgPSBEb3VibGUucGFyc2VEb3VibGUoX2RlbnNSZWYpOworCQkJCisJCQlpZihwb3BSZWYgPT0gMCkgcG9wUmVmID0gUHJlZmVyZW5jZUluaXRpYWxpemVyLkRFRkFVTFRfUkVGRVJFTkNFX1BPUFVMQVRJT047CisJCQlpZihkZW5zUmVmID09IDApIGRlbnNSZWYgPSBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuREVGQVVMVF9SRUZFUkVOQ0VfREVOU0lUWTsKKwkJCQorCQkJZG91YmxlIHJldFZhbHVlOworCQkJaWYoZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSA9PSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9MQUJFTF9WQUxVRV9fREVOU0lUWSkKKwkJCQlyZXRWYWx1ZSA9IChjb3VudCAvIGRlbnNSZWYpOworCQkJZWxzZQorCQkJCXJldFZhbHVlID0gKGNvdW50IC8gcG9wUmVmKTsKKwkJCXJldHVybiAocmV0VmFsdWUgPjEuMCkgPyAxLjA6cmV0VmFsdWU7CisJCX0gLy8gZ2V0UmVsYXRpdmVWYWx1ZQorCQkKKwkJLyoqCisJCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGRlbm9taW5hdG9yIG9yIHNjYWxlIHVzZWQgdG8gY29udmVydCB0byByZWxhdGl2ZQorCQkgKiB2YWx1ZXMgaW4gdGhlIHJhbmdlIDAtMS4gRm9yIGV4YW1wbGUsIGluIGFuIEVwaWRlbWljIENvbXBhcnRtZW50IG1vZGVsCisJCSAqIHRoZSBzdGF0ZSB2YWx1ZXMgYXJlIG5vcm1hbGl6ZWQgYnkgcG9wdWxhdGlvbi4KKwkJICogSXQgaXMgcmVxdWlyZWQgd2hlbmV2ZXIgd2UgbmVlZCB0byBzd2l0Y2ggYmV0d2VlbiByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgdmFsdWVzCisJCSAqIG9yIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGxhYmVsIHNob3dpbmcgdGhlIG1heGltdW0gc2NhbGUgZm9yIGFueSByZWxhdGl2ZSB2YWx1ZS4KKwkJICogQHJldHVybiB0aGUgZGVub21pbmF0b3Igb3Igc2NhbGUgdXNlZCB0byBub3JtYWxpemUgdGhlIHJlbGF0aXZlIHZhbHVlCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGRvdWJsZSBnZXREZW5vbWluYXRvcihmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQkJbG9uZyBwb3BSZWYgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0TG9uZyhQcmVmZXJlbmNlQ29uc3RhbnRzLlJFRkVSRU5DRV9QT1BVTEFUSU9OKTsKKwkJCWxvbmcgZGVuc1JlZiA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRMb25nKFByZWZlcmVuY2VDb25zdGFudHMuUkVGRVJFTkNFX0RFTlNJVFkpOworCQorCQkJaWYocG9wUmVmID09IDApIHBvcFJlZiA9IFByZWZlcmVuY2VJbml0aWFsaXplci5ERUZBVUxUX1JFRkVSRU5DRV9QT1BVTEFUSU9OOworCQkJaWYoZGVuc1JlZiA9PSAwKSBwb3BSZWYgPSBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuREVGQVVMVF9SRUZFUkVOQ0VfREVOU0lUWTsKKwkKKwkJCWlmKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgPT0gU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfTEFCRUxfVkFMVUVfX0RFTlNJVFkpCisJCQkJcmV0dXJuIGRlbnNSZWY7CisJCQllbHNlCisJCQkJcmV0dXJuIHBvcFJlZjsKKwkJCisJCX0KKwkJCisJfSAvLyBQb3B1bGF0aW9uTW9kZWxMYWJlbFZhbHVlUmVsYXRpdmVWYWx1ZVByb3ZpZGVyCisKKwlwdWJsaWMgdm9pZCBlYXJseVN0YXJ0dXAoKSB7CisJCS8vIERvbmUKKwl9Cit9IC8vIFN0YW5kYXJkUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3ByZWZlcmVuY2VzL1BvcHVsYXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvcHJlZmVyZW5jZXMvUG9wdWxhdGlvblByZWZlcmVuY2VQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJmYWMyMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3ByZWZlcmVuY2VzL1BvcHVsYXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhCkBAIC0wLDAgKzEsODAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLnByZWZlcmVuY2VzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5TdHJpbmdGaWVsZEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQud2l6YXJkcy5Qb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwcmVmZXJlbmNlIHBhZ2UgdGhhdCBpcyBjb250cmlidXRlZCB0byB0aGUKKyAqIFByZWZlcmVuY2VzIGRpYWxvZy4gQnkgc3ViLWNsYXNzaW5nIDxzYW1wPkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U8L3NhbXA+LAorICogd2UgY2FuIHVzZSB0aGUgZmllbGQgc3VwcG9ydCBidWlsdCBpbnRvIEpGYWNlIHRoYXQgYWxsb3dzIHVzIHRvIGNyZWF0ZSBhIHBhZ2UKKyAqIHRoYXQgaXMgc21hbGwgYW5kIGtub3dzIGhvdyB0byBzYXZlLCByZXN0b3JlIGFuZCBhcHBseSBpdHNlbGYuCisgKiA8cD4KKyAqIFRoaXMgcGFnZSBpcyB1c2VkIHRvIG1vZGlmeSBwcmVmZXJlbmNlcyBvbmx5LiBUaGV5IGFyZSBzdG9yZWQgaW4gdGhlCisgKiBwcmVmZXJlbmNlIHN0b3JlIHRoYXQgYmVsb25ncyB0byB0aGUgbWFpbiBwbHVnLWluIGNsYXNzLiBUaGF0IHdheSwKKyAqIHByZWZlcmVuY2VzIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSB2aWEgdGhlIHByZWZlcmVuY2Ugc3RvcmUuCisgKi8KKworcHVibGljIGNsYXNzIFBvcHVsYXRpb25QcmVmZXJlbmNlUGFnZSBleHRlbmRzCisJCUZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgeworCisJCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgUG9wdWxhdGlvblByZWZlcmVuY2VQYWdlKCkgeworCQlzdXBlcihHUklEKTsKKwkJc2V0UHJlZmVyZW5jZVN0b3JlKEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOworCQlzZXREZXNjcmlwdGlvbihQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIlBvcHVsYXRpb25QUGFnZVRJVExFIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgZmllbGQgZWRpdG9ycy4gRmllbGQgZWRpdG9ycyBhcmUgYWJzdHJhY3Rpb25zIG9mIHRoZSBjb21tb24KKwkgKiBHVUkgYmxvY2tzIG5lZWRlZCB0byBtYW5pcHVsYXRlIHZhcmlvdXMgdHlwZXMgb2YgcHJlZmVyZW5jZXMuIEVhY2ggZmllbGQKKwkgKiBlZGl0b3Iga25vd3MgaG93IHRvIHNhdmUgYW5kIHJlc3RvcmUgaXRzZWxmLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKKworCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKKwkJbG9uZyByZWZQb3AgPSBzdG9yZS5nZXRMb25nKFByZWZlcmVuY2VDb25zdGFudHMuUkVGRVJFTkNFX1BPUFVMQVRJT04pOworCQlsb25nIHJlZkRlbnMgPSBzdG9yZS5nZXRMb25nKFByZWZlcmVuY2VDb25zdGFudHMuUkVGRVJFTkNFX0RFTlNJVFkpOworCQkKKwkJZmluYWwgU3RyaW5nRmllbGRFZGl0b3IgcmVmZXJlbmNlUG9wdWxhdGlvblRocmVhZHNGaWVsZEVkaXRvciA9IG5ldyBTdHJpbmdGaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlJFRkVSRU5DRV9QT1BVTEFUSU9OLAorCQkJCVBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiUmVmZXJlbmNlUG9wdWxhdGlvbiIpLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJcmVmZXJlbmNlUG9wdWxhdGlvblRocmVhZHNGaWVsZEVkaXRvci5zZXRTdHJpbmdWYWx1ZSgiIityZWZQb3ApOworCQlhZGRGaWVsZChyZWZlcmVuY2VQb3B1bGF0aW9uVGhyZWFkc0ZpZWxkRWRpdG9yKTsKKwkJCisJCWZpbmFsIFN0cmluZ0ZpZWxkRWRpdG9yIHJlZmVyZW5jZURlbnNpdHlUaHJlYWRzRmllbGRFZGl0b3IgPSBuZXcgU3RyaW5nRmllbGRFZGl0b3IoCisJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5SRUZFUkVOQ0VfREVOU0lUWSwKKwkJCQlQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIlJlZmVyZW5jZURlbnNpdHkiKSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7IC8vJE5PTi1OTFMtMSQKKwkJcmVmZXJlbmNlUG9wdWxhdGlvblRocmVhZHNGaWVsZEVkaXRvci5zZXRTdHJpbmdWYWx1ZSgiIityZWZEZW5zKTsKKwkJYWRkRmllbGQocmVmZXJlbmNlRGVuc2l0eVRocmVhZHNGaWVsZEVkaXRvcik7CisJCQorCX0gLy8gY3JlYXRlRmllbGRFZGl0b3JzCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCisJICovCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgeworCQkvLyBOb3RoaW5nCisJfQorCit9IC8vIFBvcHVsYXRpb25QcmVmZXJlbmNlUGFnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZjQyMzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwyOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMucHJlZmVyZW5jZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIENvbnN0YW50IGRlZmluaXRpb25zIGZvciBwbHVnLWluIHByZWZlcmVuY2VzCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVmZXJlbmNlQ29uc3RhbnRzIHsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHByZWZlcmVuY2UgZm9yIHRoZSByZWZlcmVuY2UgcG9wdWxhdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRV9QT1BVTEFUSU9OID0gInJlZmVyZW5jZVBvcHVsYXRpb24iOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBwcmVmZXJlbmNlIGZvciB0aGUgcmVmZXJlbmNlIGRlbnNpdHkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VfREVOU0lUWSA9ICJyZWZlcmVuY2VEZW5zaXR5IjsgLy8kTk9OLU5MUy0xJAorCit9IC8vIFByZWZlcmVuY2VDb25zdGFudHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1ODEzOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLnByZWZlcmVuY2VzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CisKKy8qKgorICogQ2xhc3MgdXNlZCB0byBpbml0aWFsaXplIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7CisKKwlwdWJsaWMgc3RhdGljIGxvbmcgREVGQVVMVF9SRUZFUkVOQ0VfUE9QVUxBVElPTiA9IDE2MDAwMDAwOworCXB1YmxpYyBzdGF0aWMgbG9uZyBERUZBVUxUX1JFRkVSRU5DRV9ERU5TSVRZID0gMjUwMDA7CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKKwkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CisJCXN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5SRUZFUkVOQ0VfUE9QVUxBVElPTiwKKwkJCQkJCURFRkFVTFRfUkVGRVJFTkNFX1BPUFVMQVRJT04rIiIpOworCQlzdG9yZS5zZXREZWZhdWx0KFByZWZlcmVuY2VDb25zdGFudHMuUkVGRVJFTkNFX0RFTlNJVFksCisJCQkJREVGQVVMVF9SRUZFUkVOQ0VfREVOU0lUWSsiIik7CisJfQkKK30gLy8gUHJlZmVyZW5jZUluaXRpYWxpemVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC93aXphcmRzL05ld1BvcHVsYXRpb25Jbml0aWFsaXplcldpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvd2l6YXJkcy9OZXdQb3B1bGF0aW9uSW5pdGlhbGl6ZXJXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWQwNDI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvd2l6YXJkcy9OZXdQb3B1bGF0aW9uSW5pdGlhbGl6ZXJXaXphcmQuamF2YQpAQCAtMCwwICsxLDE4NSBAQAorLy8gTmV3RGlzZWFzZVdpemFyZC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uSW5pdGlhbGl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5EdWJsaW5Db3JlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdTVEVNUHJvamVjdFdpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuU1RFTVdpemFyZERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBXaXphcmQgZm9yIG1ha2luZyBuZXcgU1RFTSB7QGxpbmsgRGlzZWFzZU1vZGVsfSBpbnN0YW5jZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBOZXdQb3B1bGF0aW9uSW5pdGlhbGl6ZXJXaXphcmQgZXh0ZW5kcyBOZXdJZGVudGlmaWFibGVXaXphcmQgeworCisJcHJpdmF0ZSBOZXdQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQYWdlIG5kcCA9IG51bGw7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjZ2V0V2l6YXJkVGl0bGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0V2l6YXJkVGl0bGUoKSB7CisJCXJldHVybiBQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5Qb3B1bGF0aW9uSW5pdGlhbGl6ZXJXaXoud2l6YXJkX3RpdGxlIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjY3JlYXRlTmV3SWRlbnRpZmlhYmxlUGFnZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE5ld0lkZW50aWZpYWJsZVBhZ2UgY3JlYXRlTmV3SWRlbnRpZmlhYmxlUGFnZSgpIHsKKwkJbmRwID0gbmV3IE5ld1BvcHVsYXRpb25Jbml0aWFsaXplclBhZ2UoUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJOUG9wdWxhdGlvbkluaXRpYWxpeHplcldpei5wYWdlX3RpdGxlIikpOyAvLyROT04tTkxTLTEkCisJCW5kcC5zZXRUaXRsZShQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5Qb3B1bGF0aW9uSW5pdGlhbGl6ZXJXaXoucGFnZV90aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQluZHAuc2V0RGVzY3JpcHRpb24oUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJOUG9wdWxhdGlvbkluaXRpYWxpemVyV2l6LnBhZ2VfZGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKKwkJdGhpcy5zZXRIZWxwQ29udGV4dElkKCJvcmcuZWNsaXBzZS5zdGVtLmRvYy5uZXdwb3B1bGF0aW9uaW5pdGlhbGl6ZXJfY29udGV4dGlkIik7CisJCXJldHVybiBuZHA7CisJfSAvLyBjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjY3JlYXRlRHVibGluQ29yZVBhZ2UoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBEdWJsaW5Db3JlUGFnZSBjcmVhdGVEdWJsaW5Db3JlUGFnZSgpIHsKKwkJcmV0dXJuIG5ldyBEdWJsaW5Db3JlUGFnZSgpIHsKKwkJCS8qKgorCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkLkR1YmxpbkNvcmVQYWdlI2luaXRpYWxpemVEQ0ZpZWxkcygpCisJCQkgKi8KKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURDQXR0cmlidXRlcygpIHsKKwkJCQlzdXBlci5pbml0aWFsaXplRENBdHRyaWJ1dGVzKCk7CisJCQkJZm9ybWF0LnNldFRleHQoU3RhbmRhcmRQYWNrYWdlLmVOU19VUkkpOworCQkJCWZvcm1hdC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQl0eXBlLnNldFRleHQoU1RFTVVSSS5jcmVhdGVUeXBlVVJJKAorCQkJCQkJUG9wdWxhdGlvbk1vZGVsLlVSSV9UWVBFX1BPUFVMQVRJT05NT0RFTF9TRUdNRU5UKS50b1N0cmluZygpKTsKKwkJCQl0eXBlLnNldEVuYWJsZWQoZmFsc2UpOworCQkJfQorCQl9OyAvLyBEdWJsaW5Db3JlUGFnZQorCX0gLy8gY3JlYXRlRHVibGluQ29yZVBhZ2UKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNjcmVhdGVJZGVudGlmaWFibGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJZGVudGlmaWFibGUgY3JlYXRlSWRlbnRpZmlhYmxlKCkgeworCQlmaW5hbCBQb3B1bGF0aW9uSW5pdGlhbGl6ZXIgcmV0VmFsdWUgPSBuZHAuZ2V0U2VsZWN0ZWRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKTsKKwkJcmV0VmFsdWUuc2V0RHVibGluQ29yZShuZXdEdWJsaW5Db3JlUGFnZS5jcmVhdGVEdWJsaW5Db3JlKCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVTcGVjaWZpY0lkZW50aWZpYWJsZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2dldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkgeworCQlyZXR1cm4gTmV3U1RFTVByb2plY3RXaXphcmQuREVDT1JBVE9SU19GT0xERVJfTkFNRTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lRXh0ZW5zaW9uKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25GaWxlTmFtZUV4dGVuc2lvbigpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5lTkFNRTsKKwl9IC8vIGdldElkZW50aWZpYWJsZVNlcmlhbGl6YXRpb25GaWxlRXh0ZW5zaW9uCisKKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5ld1BvcHVsYXRpb25Jbml0aWFsaXplclBhZ2UgZXh0ZW5kcyBOZXdJZGVudGlmaWFibGVQYWdlIHsKKworCQlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJEZWZpbml0aW9uQ29udHJvbCBkZGMgPSBudWxsOworCisJCS8qKgorCQkgKiBAcGFyYW0gcGFnZU5hbWUKKwkJICovCisJCXByb3RlY3RlZCBOZXdQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQYWdlKGZpbmFsIFN0cmluZyBwYWdlTmFtZSkgeworCQkJc3VwZXIocGFnZU5hbWUpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZC5OZXdJZGVudGlmaWFibGVQYWdlI2dldERDRGVzY3JpcHRpb24oKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RENEZXNjcmlwdGlvbigpIHsKKwkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcworCQkJCQkuZ2V0U3RyaW5nKCJOUG9wdWxhdGlvbkluaXRpYWxpemVyV2l6LkRDX0RFU0NSSVBUSU9OIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkJbmV3IE9iamVjdFtdIHsgc2VyaWFsaXphdGlvbkZpbGVOYW1lRmllbGQuZ2V0VGV4dCgpIH0pOworCQl9IC8vIGdldERDRGVzY3JpcHRpb24KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVTcGVjaWZpY0NvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisJCQlkZGMgPSBuZXcgUG9wdWxhdGlvbkluaXRpYWxpemVyRGVmaW5pdGlvbkNvbnRyb2wocGFyZW50LCBTV1QuTk9ORSwKKwkJCQkJcHJvamVjdFZhbGlkYXRvciwgc3VwZXIuZ2V0U2VsZWN0ZWRQcm9qZWN0KCkpOworCQkJcmV0dXJuIGRkYzsKKwkJfSAvLyBjcmVhdGVTcGVjaWZpY0NvbXBvc2l0ZQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7CisJCQlib29sZWFuIHJldFZhbHVlID0gc3VwZXIudmFsaWRhdGVQYWdlKCk7CisJCQlpZiAocmV0VmFsdWUpIHsKKwkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7CisJCQkJcmV0VmFsdWUgPSBkZGMudmFsaWRhdGUoKTsKKwkJCQkvLyBFcnJvcj8KKwkJCQlpZiAoIXJldFZhbHVlKSB7CisJCQkJCS8vIFllcworCQkJCQlzZXRFcnJvck1lc3NhZ2UoZGRjLmdldEVycm9yTWVzc2FnZSgpKTsKKwkJCQl9IC8vIGlmCisJCQl9CisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gdmFsaWRhdGVQYWdlCisKKwkJUG9wdWxhdGlvbkluaXRpYWxpemVyIGdldFNlbGVjdGVkUG9wdWxhdGlvbkluaXRpYWxpemVyKCkgeworCQkJcmV0dXJuIGRkYy5nZXRTZWxlY3RlZFBvcHVsYXRpb25Jbml0aWFsaXplcigpOworCQl9IC8vIGdldFNlbGVjdGVkRGlzZWFzZU1vZGVsCisKKwl9IC8vIE5ld0Rpc2Vhc2VQYWdlCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIElIYW5kbGVyfSBmb3IgdGhlIGNvbW1hbmQgdGhhdCBjcmVhdGVzIGEKKwkgKiB7QGxpbmsgTmV3UG9wdWxhdGlvbk1vZGVsV2l6YXJkfQorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTmV3UG9wdWxhdGlvbkluaXRpYWxpemVyV2l6YXJkQ29tbWFuZEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIKKwkJCWltcGxlbWVudHMgSUhhbmRsZXIgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudCkKKwkJICovCisJCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBleGVjdXRpb25FdmVudCkKKwkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gSGFuZGxlclV0aWwKKwkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvd0NoZWNrZWQoZXhlY3V0aW9uRXZlbnQpOworCQkJZmluYWwgTmV3UG9wdWxhdGlvbkluaXRpYWxpemVyV2l6YXJkIHdpemFyZCA9IG5ldyBOZXdQb3B1bGF0aW9uSW5pdGlhbGl6ZXJXaXphcmQoKTsKKwkJCXdpemFyZC5pbml0KHdpbmRvdy5nZXRXb3JrYmVuY2goKSwgU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7CisJCQlmaW5hbCBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFNURU1XaXphcmREaWFsb2cod2luZG93CisJCQkJCS5nZXRTaGVsbCgpLCB3aXphcmQpOworCQkJd2l6YXJkRGlhbG9nLm9wZW4oKTsKKwkJCXJldHVybiBudWxsOworCQl9IC8vIGV4ZWN1dGUKKwl9IC8vIE5ld0Rpc2Vhc2VXaXphcmRDb21tYW5kSGFuZGxlcgorfSAvLyBOZXdEaXNlYXNlV2l6YXJkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC93aXphcmRzL05ld1BvcHVsYXRpb25Nb2RlbFdpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvd2l6YXJkcy9OZXdQb3B1bGF0aW9uTW9kZWxXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDMxMGY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvd2l6YXJkcy9OZXdQb3B1bGF0aW9uTW9kZWxXaXphcmQuamF2YQpAQCAtMCwwICsxLDE4NCBAQAorLy8gTmV3RGlzZWFzZVdpemFyZC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuRHVibGluQ29yZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3U1RFTVByb2plY3RXaXphcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLlNURU1XaXphcmREaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgV2l6YXJkIGZvciBtYWtpbmcgbmV3IFNURU0ge0BsaW5rIERpc2Vhc2VNb2RlbH0gaW5zdGFuY2VzLgorICovCitwdWJsaWMgY2xhc3MgTmV3UG9wdWxhdGlvbk1vZGVsV2l6YXJkIGV4dGVuZHMgTmV3SWRlbnRpZmlhYmxlV2l6YXJkIHsKKworCXByaXZhdGUgTmV3UG9wdWxhdGlvbk1vZGVsUGFnZSBuZHAgPSBudWxsOworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2dldFdpemFyZFRpdGxlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFdpemFyZFRpdGxlKCkgeworCQlyZXR1cm4gUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOUG9wdWxhdGlvbk1vZGVsV2l6LndpemFyZF90aXRsZSIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2NyZWF0ZU5ld0lkZW50aWZpYWJsZVBhZ2UoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBOZXdJZGVudGlmaWFibGVQYWdlIGNyZWF0ZU5ld0lkZW50aWZpYWJsZVBhZ2UoKSB7CisJCW5kcCA9IG5ldyBOZXdQb3B1bGF0aW9uTW9kZWxQYWdlKFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzCisJCQkJLmdldFN0cmluZygiTlBvcHVsYXRpb25Nb2RlbFdpei5wYWdlX3RpdGxlIikpOyAvLyROT04tTkxTLTEkCisJCW5kcC5zZXRUaXRsZShQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5Qb3B1bGF0aW9uTW9kZWxXaXoucGFnZV90aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQluZHAuc2V0RGVzY3JpcHRpb24oUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJOUG9wdWxhdGlvbk1vZGVsV2l6LnBhZ2VfZGVzY3JpcHRpb24iKSk7IAorCQl0aGlzLnNldEhlbHBDb250ZXh0SWQoIm9yZy5lY2xpcHNlLnN0ZW0uZG9jLm5ld3BvcHVsYXRpb25fY29udGV4dGlkIik7CisJCXJldHVybiBuZHA7CisJfSAvLyBjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjY3JlYXRlRHVibGluQ29yZVBhZ2UoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBEdWJsaW5Db3JlUGFnZSBjcmVhdGVEdWJsaW5Db3JlUGFnZSgpIHsKKwkJcmV0dXJuIG5ldyBEdWJsaW5Db3JlUGFnZSgpIHsKKwkJCS8qKgorCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkLkR1YmxpbkNvcmVQYWdlI2luaXRpYWxpemVEQ0ZpZWxkcygpCisJCQkgKi8KKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURDQXR0cmlidXRlcygpIHsKKwkJCQlzdXBlci5pbml0aWFsaXplRENBdHRyaWJ1dGVzKCk7CisJCQkJZm9ybWF0LnNldFRleHQoU3RhbmRhcmRQYWNrYWdlLmVOU19VUkkpOworCQkJCWZvcm1hdC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQl0eXBlLnNldFRleHQoU1RFTVVSSS5jcmVhdGVUeXBlVVJJKAorCQkJCQkJUG9wdWxhdGlvbk1vZGVsLlVSSV9UWVBFX1BPUFVMQVRJT05NT0RFTF9TRUdNRU5UKS50b1N0cmluZygpKTsKKwkJCQl0eXBlLnNldEVuYWJsZWQoZmFsc2UpOworCQkJfQorCQl9OyAvLyBEdWJsaW5Db3JlUGFnZQorCX0gLy8gY3JlYXRlRHVibGluQ29yZVBhZ2UKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNjcmVhdGVJZGVudGlmaWFibGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJZGVudGlmaWFibGUgY3JlYXRlSWRlbnRpZmlhYmxlKCkgeworCQlmaW5hbCBQb3B1bGF0aW9uTW9kZWwgcmV0VmFsdWUgPSBuZHAuZ2V0U2VsZWN0ZWRQb3B1bGF0aW9uTW9kZWwoKTsKKwkJcmV0VmFsdWUuc2V0RHVibGluQ29yZShuZXdEdWJsaW5Db3JlUGFnZS5jcmVhdGVEdWJsaW5Db3JlKCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVTcGVjaWZpY0lkZW50aWZpYWJsZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2dldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkgeworCQlyZXR1cm4gTmV3U1RFTVByb2plY3RXaXphcmQuREVDT1JBVE9SU19GT0xERVJfTkFNRTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lRXh0ZW5zaW9uKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25GaWxlTmFtZUV4dGVuc2lvbigpIHsKKwkJcmV0dXJuIFN0YW5kYXJkUGFja2FnZS5lTkFNRTsKKwl9IC8vIGdldElkZW50aWZpYWJsZVNlcmlhbGl6YXRpb25GaWxlRXh0ZW5zaW9uCisKKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5ld1BvcHVsYXRpb25Nb2RlbFBhZ2UgZXh0ZW5kcyBOZXdJZGVudGlmaWFibGVQYWdlIHsKKworCQlQb3B1bGF0aW9uTW9kZWxEZWZpbml0aW9uQ29udHJvbCBkZGMgPSBudWxsOworCisJCS8qKgorCQkgKiBAcGFyYW0gcGFnZU5hbWUKKwkJICovCisJCXByb3RlY3RlZCBOZXdQb3B1bGF0aW9uTW9kZWxQYWdlKGZpbmFsIFN0cmluZyBwYWdlTmFtZSkgeworCQkJc3VwZXIocGFnZU5hbWUpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZC5OZXdJZGVudGlmaWFibGVQYWdlI2dldERDRGVzY3JpcHRpb24oKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RENEZXNjcmlwdGlvbigpIHsKKwkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcworCQkJCQkuZ2V0U3RyaW5nKCJOUG9wdWxhdGlvbldpei5EQ19ERVNDUklQVElPTiIpLCAvLyROT04tTkxTLTEkCisJCQkJCW5ldyBPYmplY3RbXSB7IHNlcmlhbGl6YXRpb25GaWxlTmFtZUZpZWxkLmdldFRleHQoKSB9KTsKKwkJfSAvLyBnZXREQ0Rlc2NyaXB0aW9uCisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlU3BlY2lmaWNDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQkJZGRjID0gbmV3IFBvcHVsYXRpb25Nb2RlbERlZmluaXRpb25Db250cm9sKHBhcmVudCwgU1dULk5PTkUsCisJCQkJCXByb2plY3RWYWxpZGF0b3IsIHN1cGVyLmdldFNlbGVjdGVkUHJvamVjdCgpKTsKKwkJCXJldHVybiBkZGM7CisJCX0gLy8gY3JlYXRlU3BlY2lmaWNDb21wb3NpdGUKKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgeworCQkJYm9vbGVhbiByZXRWYWx1ZSA9IHN1cGVyLnZhbGlkYXRlUGFnZSgpOworCQkJaWYgKHJldFZhbHVlKSB7CisJCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOworCQkJCXJldFZhbHVlID0gZGRjLnZhbGlkYXRlKCk7CisJCQkJLy8gRXJyb3I/CisJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQkvLyBZZXMKKwkJCQkJc2V0RXJyb3JNZXNzYWdlKGRkYy5nZXRFcnJvck1lc3NhZ2UoKSk7CisJCQkJfSAvLyBpZgorCQkJfQorCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIHZhbGlkYXRlUGFnZQorCisJCVBvcHVsYXRpb25Nb2RlbCBnZXRTZWxlY3RlZFBvcHVsYXRpb25Nb2RlbCgpIHsKKwkJCXJldHVybiBkZGMuZ2V0U2VsZWN0ZWRQb3B1bGF0aW9uTW9kZWwoKTsKKwkJfSAvLyBnZXRTZWxlY3RlZERpc2Vhc2VNb2RlbAorCisJfSAvLyBOZXdEaXNlYXNlUGFnZQorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBJSGFuZGxlcn0gZm9yIHRoZSBjb21tYW5kIHRoYXQgY3JlYXRlcyBhCisJICoge0BsaW5rIE5ld1BvcHVsYXRpb25Nb2RlbFdpemFyZH0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE5ld1BvcHVsYXRpb25Nb2RlbFdpemFyZENvbW1hbmRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyCisJCQlpbXBsZW1lbnRzIElIYW5kbGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlciNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQpCisJCSAqLworCQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgZXhlY3V0aW9uRXZlbnQpCisJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisJCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IEhhbmRsZXJVdGlsCisJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3dDaGVja2VkKGV4ZWN1dGlvbkV2ZW50KTsKKwkJCWZpbmFsIE5ld1BvcHVsYXRpb25Nb2RlbFdpemFyZCB3aXphcmQgPSBuZXcgTmV3UG9wdWxhdGlvbk1vZGVsV2l6YXJkKCk7CisJCQl3aXphcmQuaW5pdCh3aW5kb3cuZ2V0V29ya2JlbmNoKCksIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOworCQkJZmluYWwgV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBTVEVNV2l6YXJkRGlhbG9nKHdpbmRvdworCQkJCQkuZ2V0U2hlbGwoKSwgd2l6YXJkKTsKKwkJCXdpemFyZERpYWxvZy5vcGVuKCk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSAvLyBleGVjdXRlCisJfSAvLyBOZXdEaXNlYXNlV2l6YXJkQ29tbWFuZEhhbmRsZXIKK30gLy8gTmV3RGlzZWFzZVdpemFyZApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvd2l6YXJkcy9Qb3B1bGF0aW9uSW5pdGlhbGl6ZXJEZWZpbml0aW9uQ29udHJvbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvd2l6YXJkcy9Qb3B1bGF0aW9uSW5pdGlhbGl6ZXJEZWZpbml0aW9uQ29udHJvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MTQ4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC93aXphcmRzL1BvcHVsYXRpb25Jbml0aWFsaXplckRlZmluaXRpb25Db250cm9sLmphdmEKQEAgLTAsMCArMSwyNDIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLndpemFyZHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Jbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2lkZ2V0cy5Mb2NhdGlvblBpY2tlckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBTV1QgY29udHJvbCBmb3IgZGVmaW5pbmcgYSBkaXNlYXNlLgorICovCitwdWJsaWMgY2xhc3MgUG9wdWxhdGlvbkluaXRpYWxpemVyRGVmaW5pdGlvbkNvbnRyb2wgZXh0ZW5kcyBDb21wb3NpdGUgeworCisJcHJpdmF0ZSBzdGF0aWMgUG9wdWxhdGlvbkluaXRpYWxpemVyW10gcG9wdWxhdGlvbkluaXRpYWxpemVycyA9IG51bGw7CisKKwlwcml2YXRlIGZpbmFsIENvbWJvIGNvbWJvOworCisJcHJpdmF0ZSBmaW5hbCBQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUNvbXBvc2l0ZSBwb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUNvbXBvc2l0ZTsKKworCXByaXZhdGUgU3RyaW5nIGlzb0tleT0iIjsKKwkKKwlwcml2YXRlIFVSSSB0YXJnZXRVUkkgPSBudWxsOworCQorCS8qKgorCSAqIENyZWF0ZSB0aGUgY29tcG9zaXRlCisJICogCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqIEBwYXJhbSBwcm9qZWN0VmFsaWRhdG9yCisJICovCisJcHVibGljIFBvcHVsYXRpb25Jbml0aWFsaXplckRlZmluaXRpb25Db250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIGludCBzdHlsZSwKKwkJCU1vZGlmeUxpc3RlbmVyIHByb2plY3RWYWxpZGF0b3IsIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKKwkJc3VwZXIocGFyZW50LCBzdHlsZSk7CisJCWZpbmFsIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQlzZXRMYXlvdXQoZ3JpZExheW91dCk7CisKKwkJZmluYWwgTGFiZWwgcG9wdWxhdGlvbkluaXRpYWxpemVyTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOworCQlmaW5hbCBHcmlkRGF0YSBnZF9wb3B1bGF0aW9uSW5pdGlhbGl6ZXJMYWJlbCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOworCQlnZF9wb3B1bGF0aW9uSW5pdGlhbGl6ZXJMYWJlbC53aWR0aEhpbnQgPSAxMDA7CisJCXBvcHVsYXRpb25Jbml0aWFsaXplckxhYmVsLnNldExheW91dERhdGEoZ2RfcG9wdWxhdGlvbkluaXRpYWxpemVyTGFiZWwpOworCQlwb3B1bGF0aW9uSW5pdGlhbGl6ZXJMYWJlbC5zZXRUZXh0KFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiRERDLjUiKSk7IC8vJE5PTi1OTFMtMSQKKworCQljb21ibyA9IG5ldyBDb21ibyh0aGlzLCBTV1QuUkVBRF9PTkxZKTsKKwkJY29tYm8uc2V0VGV4dExpbWl0KDMwKTsKKwkJZmluYWwgR3JpZERhdGEgZ2RfY29tYm8gPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsCisJCQkJZmFsc2UpOworCQlnZF9jb21iby53aWR0aEhpbnQgPSAzMDM7CisJCWNvbWJvLnNldExheW91dERhdGEoZ2RfY29tYm8pOworCisJCWNvbWJvLnNldFRvb2xUaXBUZXh0KFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiRERDLjEiKSk7IC8vJE5PTi1OTFMtMSQKKwkJLy8gSW5pdGlhbGl6ZSB0aGUgbGlzdCBvZiBkaXNlYXNlIG1vZGVscyBhdmFpbGFibGUKKwkJY29tYm8uc2V0SXRlbXMoZ2V0UG9wdWxhdGlvbkluaXRpYWxpemVyTmFtZXMoZ2V0UG9wdWxhdGlvbkluaXRpYWxpemVycygpKSk7CisJCWNvbWJvLnNlbGVjdCgwKTsKKwkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIocHJvamVjdFZhbGlkYXRvcik7CisKKwkJCisJCXBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5Q29tcG9zaXRlID0gbmV3IFBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5Q29tcG9zaXRlKHRoaXMsCisJCQkJU1dULk5PTkUsIGdldFBvcHVsYXRpb25Jbml0aWFsaXplcnMoKSwgcHJvamVjdFZhbGlkYXRvciwgcHJvamVjdCk7CisJCWZpbmFsIEdyaWREYXRhIGdkX3BvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5Q29udHJvbCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwKKwkJCQlTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMiwgMSk7CisJCXBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5Q29tcG9zaXRlCisJCQkJLnNldExheW91dERhdGEoZ2RfcG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlDb250cm9sKTsKKworCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5Q29tcG9zaXRlCisJCQkJCQkuZGlzcGxheVBvcHVsYXRpb25Jbml0aWFsaXplcihnZXRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJzKClbY29tYm8KKwkJCQkJCQkJLmdldFNlbGVjdGlvbkluZGV4KCldKTsKKwkJCQkvLyBsYXlvdXQoKTsKKwkJCX0gLy8gd2lkZ2V0U2VsZWN0ZWQKKworCQl9KTsKKwkJLy9maW5hbCBQb3B1bGF0aW9uSW5pdGlhbGl6ZXJEZWZpbml0aW9uQ29udHJvbCBzZWxmID0gdGhpczsKKworCQkvLyBMb2NhdGlvbiBwaWNrZXIKKwkJLy8gSVNPIEtleQorCQlmaW5hbCBMYWJlbCBpc29LZXlMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7CisJCWlzb0tleUxhYmVsLnNldFRleHQoUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOUG9wV2l6SVNPSyIpKTsgLy8kTk9OLU5MUy0xJAorCQlmaW5hbCBHcmlkRGF0YSBnZF9pc29LZXlMYWJlbCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOworCQlpc29LZXlMYWJlbC5zZXRMYXlvdXREYXRhKGdkX2lzb0tleUxhYmVsKTsKKwkJCisJCWZpbmFsIExhYmVsIGlzb2tleVZhbHVlTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOworCQlpc29rZXlWYWx1ZUxhYmVsLnNldFRleHQoaXNvS2V5KTsKKworCQlmaW5hbCBHcmlkRGF0YSBnZF9pc29LZXlMYWJlbFZhbHVlID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7CisJCWlzb2tleVZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShnZF9pc29LZXlMYWJlbFZhbHVlKTsKKwkJCisJCWZpbmFsIEJ1dHRvbiBsb2NhdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcywgU1dULk5PTkUpOworCQlsb2NhdGlvbkJ1dHRvbi5zZXRUZXh0KFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTlBvcFdpelBpY2tMb2MiKSk7CisJCWZpbmFsIEdyaWREYXRhIGxiX2lzb0tleUxhYmVsID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7CisJCWxvY2F0aW9uQnV0dG9uLnNldExheW91dERhdGEobGJfaXNvS2V5TGFiZWwpOworCQkKKwkJbG9jYXRpb25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7CisJCQkJTG9jYXRpb25QaWNrZXJEaWFsb2cgbHBEaWFsb2cgPSBuZXcgTG9jYXRpb25QaWNrZXJEaWFsb2coUG9wdWxhdGlvbkluaXRpYWxpemVyRGVmaW5pdGlvbkNvbnRyb2wudGhpcy5nZXRTaGVsbCgpLCBTV1QuTk9ORSwgUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJOUG9wV2l6UGlja0xvY1RpdGxlIiksIFBvcHVsYXRpb25Jbml0aWFsaXplckRlZmluaXRpb25Db250cm9sLnRoaXMuaXNvS2V5LCBwcm9qZWN0KTsKKwkJCQlPYmplY3QgW10gcmV0ID0gbHBEaWFsb2cub3BlbigpOworCQkJCWlmKHJldCAhPSBudWxsKSB7CisJCQkJCWlzb2tleVZhbHVlTGFiZWwuc2V0VGV4dCgoU3RyaW5nKXJldFswXSk7CisJCQkJCWlzb0tleSA9IChTdHJpbmcpcmV0WzBdOworCQkJCQl0YXJnZXRVUkkgPSAoVVJJKXJldFsxXTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7CisJCQkJCisJCQl9CisJCX0pOworCQkKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsICJvcmcuZWNsaXBzZS5zdGVtLmRvYy5uZXdwb3B1bGF0aW9uaW5pdGlhbGl6ZXJfY29udGV4dGlkIik7CisKKwl9IC8vIERpc2Vhc2VEZWZpbml0aW9uQ29udHJvbAorCisJLyoqCisJICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUge0BsaW5rIERpc2Vhc2VNb2RlbHN9cyBkZWZpbmVkIGluIHRoZSBzeXN0ZW0uCisJICovCisJcHJpdmF0ZSBQb3B1bGF0aW9uSW5pdGlhbGl6ZXJbXSBnZXRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJzKCkgeworCQlpZiAocG9wdWxhdGlvbkluaXRpYWxpemVycyA9PSBudWxsKSB7CisJCQlmaW5hbCBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOworCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcG9wdWxhdGlvbkluaXRpYWxpemVyQ29uZmlnRWxlbWVudHMgPSByZWdpc3RyeQorCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5Db25zdGFudHMuSURfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9FWFRFTlNJT05fUE9JTlQpOworCisJCQlmaW5hbCBMaXN0PFBvcHVsYXRpb25Jbml0aWFsaXplcj4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8UG9wdWxhdGlvbkluaXRpYWxpemVyPigpOworCisJCQlwb3B1bGF0aW9uSW5pdGlhbGl6ZXJzID0gbmV3IFBvcHVsYXRpb25Jbml0aWFsaXplcltwb3B1bGF0aW9uSW5pdGlhbGl6ZXJDb25maWdFbGVtZW50cy5sZW5ndGhdOworCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBvcHVsYXRpb25Jbml0aWFsaXplckNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBwb3B1bGF0aW9uSW5pdGlhbGl6ZXJDb25maWdFbGVtZW50c1tpXTsKKwkJCQkvLyBEb2VzIHRoZSBlbGVtZW50IHNwZWNpZnkgdGhlIGNsYXNzIG9mIHRoZSBwb3B1bGF0aW9uIG1vZGVsPworCQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMob3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLkNvbnN0YW50cy5QT1BVTEFUSU9OX0lOSVRJQUxJWkVSX0VMRU1FTlQpKSB7CisJCQkJCS8vIFllcworCQkJCQl0cnkgeworCQkJCQkJdGVtcC5hZGQoKFBvcHVsYXRpb25Jbml0aWFsaXplcikgZWxlbWVudAorCQkJCQkJCQkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIkREQy4yIikpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9IGNhdGNoIChmaW5hbCBDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCUFjdGl2YXRvci5sb2dFcnJvcigKKwkJCQkJCQkJUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJEREMuNCIpLCBlKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfSAvLyBpZgorCQkJfSAvLyBmb3IgZWFjaCBjb25maWd1cmF0aW9uIGVsZW1lbnQKKworCQkJcG9wdWxhdGlvbkluaXRpYWxpemVycyA9IHRlbXAudG9BcnJheShuZXcgUG9wdWxhdGlvbkluaXRpYWxpemVyW10ge30pOworCQl9IC8vIGlmIHBvcHVsYXRpb25Nb2RlbHMgbm90IGNyZWF0ZWQKKworCQlyZXR1cm4gcG9wdWxhdGlvbkluaXRpYWxpemVyczsKKwl9IC8vIGdldFBvcHVsYXRpb25Nb2RlbHMKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBkaXNlYXNlIG1vZGVscworCSAqLworCXByaXZhdGUgU3RyaW5nW10gZ2V0UG9wdWxhdGlvbkluaXRpYWxpemVyTmFtZXMoZmluYWwgUG9wdWxhdGlvbkluaXRpYWxpemVyW10gcG9wdWxhdGlvbk1vZGVscykgeworCQlmaW5hbCBTdHJpbmdbXSByZXRWYWx1ZSA9IG5ldyBTdHJpbmdbcG9wdWxhdGlvbkluaXRpYWxpemVycy5sZW5ndGhdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHBvcHVsYXRpb25Jbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHsKKwkJCVN0cmluZyBuYW1lID0gcG9wdWxhdGlvbkluaXRpYWxpemVyc1tpXS5nZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKTsKKwkJCS8vIFdhcyBhIG5hbWUgc3BlY2lmaWVkPworCQkJaWYgKChuYW1lID09IG51bGwpIHx8IG5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJLy8gTm8KKwkJCQluYW1lID0gcG9wdWxhdGlvbkluaXRpYWxpemVyc1tpXS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKKwkJCX0gLy8gaWYKKworCQkJcmV0VmFsdWVbaV0gPSBuYW1lOworCQl9IC8vIGZvciBpCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldFBvcHVsYXRpb25Nb2RlbE5hbWVzCisKKwkKKwlQb3B1bGF0aW9uSW5pdGlhbGl6ZXIgZ2V0U2VsZWN0ZWRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoKSB7CisJCWZpbmFsIFBvcHVsYXRpb25Jbml0aWFsaXplciByZXRWYWx1ZSA9IChQb3B1bGF0aW9uSW5pdGlhbGl6ZXIpRWNvcmVVdGlsCisJCQkJLmNvcHkoZ2V0UG9wdWxhdGlvbkluaXRpYWxpemVycygpW2NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldKTsKKwkJcG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlDb21wb3NpdGUucG9wdWxhdGVQb3B1bGF0aW9uSW5pdGlhbGl6ZXIocmV0VmFsdWUpOworCQlyZXRWYWx1ZS5zZXRUYXJnZXRJU09LZXkodGhpcy5nZXRJc29LZXkoKSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldFNlbGVjdGVkUG9wdWxhdGlvbk1vZGVsCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tTdWJjbGFzcygpIHsKKwkJLy8gRGlzYWJsZSB0aGUgY2hlY2sgdGhhdCBwcmV2ZW50cyBzdWItY2xhc3Npbmcgb2YgU1dUIGNvbXBvbmVudHMKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50cyBvZiB0aGUgY29udHJvbCBhcmUgdmFsaWQsCisJICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgeworCQlyZXR1cm4gcG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlDb21wb3NpdGUudmFsaWRhdGUoKTsKKwl9IC8vIHZhbGlkYXRlCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlIHNldCBieSB7QGxpbmsgI3ZhbGlkYXRlKCl9CisJICovCisJcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7CisJCXJldHVybiBwb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUNvbXBvc2l0ZS5nZXRFcnJvck1lc3NhZ2UoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldElzb0tleSgpIHsKKwkJcmV0dXJuIGlzb0tleTsKKwl9CisJCisJcHVibGljIFVSSSBnZXRUYXJnZXRVUkkoKSB7CisJCXJldHVybiB0YXJnZXRVUkk7CisJfQorfSAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3dpemFyZHMvUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlDb21wb3NpdGUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3dpemFyZHMvUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDcwMDRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvd2l6YXJkcy9Qb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLmFkYXB0ZXJzLlBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5hZGFwdGVycy5Qb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLmFkYXB0ZXJzLlBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLmFkYXB0ZXJzLlBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5hZGFwdGVycy5Qb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLmFkYXB0ZXJzLlBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cworICovCitwdWJsaWMgY2xhc3MgUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgeworCisJcHJpdmF0ZSBmaW5hbCBNYXA8UG9wdWxhdGlvbkluaXRpYWxpemVyLCBQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvcj4gaW5pdGlhbGl6ZXJNYXAgPSBuZXcgSGFzaE1hcDxQb3B1bGF0aW9uSW5pdGlhbGl6ZXIsIFBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yPigpOworCisJcHJpdmF0ZSBTdGFja0xheW91dCBzdGFja0xheW91dCA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGNvbXBvc2l0ZQorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gc3R5bGUKKwkgKiBAcGFyYW0gcHJvamVjdFZhbGlkYXRvcgorCSAqLworCXB1YmxpYyBQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUNvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50LAorCQkJZmluYWwgaW50IHN0eWxlLCBmaW5hbCBQb3B1bGF0aW9uSW5pdGlhbGl6ZXJbXSBwb3B1bGF0aW9uSW5pdGlhbGl6ZXJzLAorCQkJTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKKwkJc3RhY2tMYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKTsKKwkJc2V0TGF5b3V0KHN0YWNrTGF5b3V0KTsKKworCQlMYWJlbCBsYWJlbDsKKwkJbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiRE1QQzMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3IgZmlyc3RPbmUgPSBudWxsOworCQkvLyBBbnkgZGlzZWFzZSBtb2RlbHM/CisJCWlmIChwb3B1bGF0aW9uSW5pdGlhbGl6ZXJzICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3B1bGF0aW9uSW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7CisKKwkJCQlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXIgZG1wZWEgPSAoUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3JBZGFwdGVyKSBQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJCQkuYWRhcHQocG9wdWxhdGlvbkluaXRpYWxpemVyc1tpXSwKKwkJCQkJCQkJUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3JBZGFwdGVyLmNsYXNzKTsKKworCQkJCWZpbmFsIFBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yIGRtcGUgPSBkbXBlYQorCQkJCQkJLmNyZWF0ZVBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yKHRoaXMsIFNXVC5OT05FLAorCQkJCQkJCQlwcm9qZWN0VmFsaWRhdG9yLCBwcm9qZWN0KTsKKworCQkJCWluaXRpYWxpemVyTWFwLnB1dChwb3B1bGF0aW9uSW5pdGlhbGl6ZXJzW2ldLCBkbXBlKTsKKwkJCQlpZiAoZmlyc3RPbmUgPT0gbnVsbCkgeworCQkJCQkvLyBZZXMKKwkJCQkJZmlyc3RPbmUgPSBkbXBlOworCQkJCX0gLy8gaWYKKwkJCX0gLy8gZm9yIGkKKwkJfSAvLyBpZiBhbnkgZGlzZWFzZSBtb2RlbHM/CisKKwkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGZpcnN0T25lOworCX0gLy8gRGlzZWFzZU1vZGVsUHJvcGVydHlDb21wb3NpdGUKKworCXZvaWQgZGlzcGxheVBvcHVsYXRpb25Jbml0aWFsaXplcihmaW5hbCBQb3B1bGF0aW9uSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpIHsKKwkJZmluYWwgUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3IgZG1wZSA9IGluaXRpYWxpemVyTWFwLmdldChpbml0aWFsaXplcik7CisJCS8vIERpZCB3ZSBmaW5kIGl0PworCQlpZiAoZG1wZSAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBkbXBlOworCQkJbGF5b3V0KCk7CisJCX0gLy8gaWYKKwkJZWxzZSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJETVBDNCIpIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyBpbml0aWFsaXplci5nZXRDbGFzcygpLmdldE5hbWUoKSArICJcIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9IC8vIGRpc3BsYXlEaXNlYXNlTW9kZWwKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tTdWJjbGFzcygpIHsKKwkJLy8gRGlzYWJsZSB0aGUgY2hlY2sgdGhhdCBwcmV2ZW50cyBzdWItY2xhc3Npbmcgb2YgU1dUIGNvbXBvbmVudHMKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50cyBvZiB0aGUgY29tcG9zaXRlIGFyZSB2YWxpZCwKKwkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisJICovCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7CisJCXJldHVybiAoKFBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yKSAoc3RhY2tMYXlvdXQudG9wQ29udHJvbCkpCisJCQkJLnZhbGlkYXRlKCk7CisJfSAvLyB2YWxpZGF0ZQorCisJLyoqCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgeworCQlyZXR1cm4gKChQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvcikgKHN0YWNrTGF5b3V0LnRvcENvbnRyb2wpKQorCQkJCS5nZXRFcnJvck1lc3NhZ2UoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZGlzZWFzZU1vZGVsCisJICovCisJcHVibGljIHZvaWQgcG9wdWxhdGVQb3B1bGF0aW9uSW5pdGlhbGl6ZXIoUG9wdWxhdGlvbkluaXRpYWxpemVyIHBvcHVsYXRpb25Jbml0aWFsaXplcikgeworCQkoKFBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yKSAoc3RhY2tMYXlvdXQudG9wQ29udHJvbCkpCisJCQkJLnBvcHVsYXRlKHBvcHVsYXRpb25Jbml0aWFsaXplcik7CisJfSAvLyBwb3B1bGF0ZVBvcHVsYXRpb25Jbml0aWFsaXplcgorCit9IApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvd2l6YXJkcy9Qb3B1bGF0aW9uTW9kZWxEZWZpbml0aW9uQ29udHJvbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvd2l6YXJkcy9Qb3B1bGF0aW9uTW9kZWxEZWZpbml0aW9uQ29udHJvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMjVhZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC93aXphcmRzL1BvcHVsYXRpb25Nb2RlbERlZmluaXRpb25Db250cm9sLmphdmEKQEAgLTAsMCArMSwyNDQgQEAKKy8vIERpc2Vhc2VEZWZpbml0aW9uQ29udHJvbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aWRnZXRzLkxvY2F0aW9uUGlja2VyRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIFNXVCBjb250cm9sIGZvciBkZWZpbmluZyBhIGRpc2Vhc2UuCisgKi8KK3B1YmxpYyBjbGFzcyBQb3B1bGF0aW9uTW9kZWxEZWZpbml0aW9uQ29udHJvbCBleHRlbmRzIENvbXBvc2l0ZSB7CisKKwlwcml2YXRlIHN0YXRpYyBQb3B1bGF0aW9uTW9kZWxbXSBwb3B1bGF0aW9uTW9kZWxzID0gbnVsbDsKKworCXByaXZhdGUgZmluYWwgQ29tYm8gY29tYm87CisKKwlwcml2YXRlIGZpbmFsIFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5Q29tcG9zaXRlIHBvcHVsYXRpb25Nb2RlbFByb3BlcnR5Q29tcG9zaXRlOworCisJcHJpdmF0ZSBTdHJpbmcgaXNvS2V5PSIiOworCisJcHJpdmF0ZSBVUkkgdGFyZ2V0VVJJID0gbnVsbDsKKwkKKwkKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGNvbXBvc2l0ZQorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gc3R5bGUKKwkgKiBAcGFyYW0gcHJvamVjdFZhbGlkYXRvcgorCSAqLworCXB1YmxpYyBQb3B1bGF0aW9uTW9kZWxEZWZpbml0aW9uQ29udHJvbChmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBpbnQgc3R5bGUsCisJCQlNb2RpZnlMaXN0ZW5lciBwcm9qZWN0VmFsaWRhdG9yLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7CisJCXN1cGVyKHBhcmVudCwgc3R5bGUpOworCQlmaW5hbCBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKKwkJc2V0TGF5b3V0KGdyaWRMYXlvdXQpOworCisJCWZpbmFsIExhYmVsIHBvcHVsYXRpb25Nb2RlbExhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKKwkJZmluYWwgR3JpZERhdGEgZ2RfcG9wdWxhdGlvbk1vZGVsTGFiZWwgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKKwkJZ2RfcG9wdWxhdGlvbk1vZGVsTGFiZWwud2lkdGhIaW50ID0gMTAwOworCQlwb3B1bGF0aW9uTW9kZWxMYWJlbC5zZXRMYXlvdXREYXRhKGdkX3BvcHVsYXRpb25Nb2RlbExhYmVsKTsKKwkJcG9wdWxhdGlvbk1vZGVsTGFiZWwuc2V0VGV4dChQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIkREQy4wIikpOyAvLyROT04tTkxTLTEkCisKKwkJY29tYm8gPSBuZXcgQ29tYm8odGhpcywgU1dULlJFQURfT05MWSk7CisJCWNvbWJvLnNldFRleHRMaW1pdCgzMCk7CisJCWZpbmFsIEdyaWREYXRhIGdkX2NvbWJvID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLAorCQkJCWZhbHNlKTsKKwkJZ2RfY29tYm8ud2lkdGhIaW50ID0gMzAzOworCQljb21iby5zZXRMYXlvdXREYXRhKGdkX2NvbWJvKTsKKworCQljb21iby5zZXRUb29sVGlwVGV4dChQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIkREQy4xIikpOyAvLyROT04tTkxTLTEkCisJCS8vIEluaXRpYWxpemUgdGhlIGxpc3Qgb2YgZGlzZWFzZSBtb2RlbHMgYXZhaWxhYmxlCisJCWNvbWJvLnNldEl0ZW1zKGdldFBvcHVsYXRpb25Nb2RlbE5hbWVzKGdldFBvcHVsYXRpb25Nb2RlbHMoKSkpOworCQljb21iby5zZWxlY3QoMCk7CisJCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKHByb2plY3RWYWxpZGF0b3IpOworCisJCQorCQlwb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZSA9IG5ldyBQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZSh0aGlzLAorCQkJCVNXVC5OT05FLCBnZXRQb3B1bGF0aW9uTW9kZWxzKCksIHByb2plY3RWYWxpZGF0b3IsIHByb2plY3QpOworCQlmaW5hbCBHcmlkRGF0YSBnZF9wb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUNvbnRyb2wgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsCisJCQkJU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDIsIDEpOworCQlwb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZQorCQkJCS5zZXRMYXlvdXREYXRhKGdkX3BvcHVsYXRpb25Nb2RlbFByb3BlcnR5Q29udHJvbCk7CisKKwkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlwb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZQorCQkJCQkJLmRpc3BsYXlEaXNlYXNlTW9kZWwoZ2V0UG9wdWxhdGlvbk1vZGVscygpW2NvbWJvCisJCQkJCQkJCS5nZXRTZWxlY3Rpb25JbmRleCgpXSk7CisJCQkJLy8gbGF5b3V0KCk7CisJCQl9IC8vIHdpZGdldFNlbGVjdGVkCisKKwkJfSk7CisJCS8vZmluYWwgUG9wdWxhdGlvbk1vZGVsRGVmaW5pdGlvbkNvbnRyb2wgc2VsZiA9IHRoaXM7CisKKwkJLy8gTG9jYXRpb24gcGlja2VyCisJCS8vIElTTyBLZXkKKwkJZmluYWwgTGFiZWwgaXNvS2V5TGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOworCQlpc29LZXlMYWJlbC5zZXRUZXh0KFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTlBvcFdpeklTT0siKSk7IC8vJE5PTi1OTFMtMSQKKwkJZmluYWwgR3JpZERhdGEgZ2RfaXNvS2V5TGFiZWwgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKKwkJaXNvS2V5TGFiZWwuc2V0TGF5b3V0RGF0YShnZF9pc29LZXlMYWJlbCk7CisJCQorCQlmaW5hbCBMYWJlbCBpc29rZXlWYWx1ZUxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKKwkJaXNva2V5VmFsdWVMYWJlbC5zZXRUZXh0KGlzb0tleSk7CisKKwkJZmluYWwgR3JpZERhdGEgZ2RfaXNvS2V5TGFiZWxWYWx1ZSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOworCQlpc29rZXlWYWx1ZUxhYmVsLnNldExheW91dERhdGEoZ2RfaXNvS2V5TGFiZWxWYWx1ZSk7CisJCQorCQlmaW5hbCBCdXR0b24gbG9jYXRpb25CdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5OT05FKTsKKwkJbG9jYXRpb25CdXR0b24uc2V0VGV4dChQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5Qb3BXaXpQaWNrTG9jIikpOworCQlmaW5hbCBHcmlkRGF0YSBsYl9pc29LZXlMYWJlbCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOworCQlsb2NhdGlvbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGxiX2lzb0tleUxhYmVsKTsKKwkJCisJCWxvY2F0aW9uQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgYXJnMCkgeworCQkJCUxvY2F0aW9uUGlja2VyRGlhbG9nIGxwRGlhbG9nID0gbmV3IExvY2F0aW9uUGlja2VyRGlhbG9nKFBvcHVsYXRpb25Nb2RlbERlZmluaXRpb25Db250cm9sLnRoaXMuZ2V0U2hlbGwoKSwgU1dULk5PTkUsIFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTlBvcFdpelBpY2tMb2NUaXRsZSIpLCBQb3B1bGF0aW9uTW9kZWxEZWZpbml0aW9uQ29udHJvbC50aGlzLmlzb0tleSwgcHJvamVjdCk7CisJCQkJCisJCQkJT2JqZWN0IFtdIHJldCAgPSBscERpYWxvZy5vcGVuKCk7CisJCQkJaWYocmV0ICE9IG51bGwpIHsgCisJCQkJCWlzb2tleVZhbHVlTGFiZWwuc2V0VGV4dCgoU3RyaW5nKXJldFswXSk7CisJCQkJCWlzb0tleSA9IChTdHJpbmcpcmV0WzBdOworCQkJCQl0YXJnZXRVUkkgPSAoVVJJKXJldFsxXTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7CisJCQkJCisJCQl9CisJCX0pOworCQkKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsICJvcmcuZWNsaXBzZS5zdGVtLmRvYy5uZXdwb3B1bGF0aW9uX2NvbnRleHRpZCIpOworCisJfSAvLyBEaXNlYXNlRGVmaW5pdGlvbkNvbnRyb2wKKworCS8qKgorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHtAbGluayBEaXNlYXNlTW9kZWxzfXMgZGVmaW5lZCBpbiB0aGUgc3lzdGVtLgorCSAqLworCXByaXZhdGUgUG9wdWxhdGlvbk1vZGVsW10gZ2V0UG9wdWxhdGlvbk1vZGVscygpIHsKKwkJaWYgKHBvcHVsYXRpb25Nb2RlbHMgPT0gbnVsbCkgeworCQkJZmluYWwgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKKwkJCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudFtdIHBvcHVsYXRpb25Nb2RlbENvbmZpZ0VsZW1lbnRzID0gcmVnaXN0cnkKKwkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuQ29uc3RhbnRzLklEX1BPUFVMQVRJT05fTU9ERUxfRVhURU5TSU9OX1BPSU5UKTsKKworCQkJZmluYWwgTGlzdDxQb3B1bGF0aW9uTW9kZWw+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PFBvcHVsYXRpb25Nb2RlbD4oKTsKKworCQkJcG9wdWxhdGlvbk1vZGVscyA9IG5ldyBQb3B1bGF0aW9uTW9kZWxbcG9wdWxhdGlvbk1vZGVsQ29uZmlnRWxlbWVudHMubGVuZ3RoXTsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3B1bGF0aW9uTW9kZWxDb25maWdFbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gcG9wdWxhdGlvbk1vZGVsQ29uZmlnRWxlbWVudHNbaV07CisJCQkJLy8gRG9lcyB0aGUgZWxlbWVudCBzcGVjaWZ5IHRoZSBjbGFzcyBvZiB0aGUgcG9wdWxhdGlvbiBtb2RlbD8KKwkJCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5Db25zdGFudHMuUE9QVUxBVElPTl9NT0RFTF9FTEVNRU5UKSkgeworCQkJCQkvLyBZZXMKKwkJCQkJdHJ5IHsKKwkJCQkJCXRlbXAuYWRkKChQb3B1bGF0aW9uTW9kZWwpIGVsZW1lbnQKKwkJCQkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJEREMuMiIpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfSBjYXRjaCAoZmluYWwgQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoCisJCQkJCQkJCVBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiRERDLjMiKSwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCX0gLy8gaWYKKwkJCX0gLy8gZm9yIGVhY2ggY29uZmlndXJhdGlvbiBlbGVtZW50CisKKwkJCXBvcHVsYXRpb25Nb2RlbHMgPSB0ZW1wLnRvQXJyYXkobmV3IFBvcHVsYXRpb25Nb2RlbFtdIHt9KTsKKwkJfSAvLyBpZiBwb3B1bGF0aW9uTW9kZWxzIG5vdCBjcmVhdGVkCisKKwkJcmV0dXJuIHBvcHVsYXRpb25Nb2RlbHM7CisJfSAvLyBnZXRQb3B1bGF0aW9uTW9kZWxzCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZGlzZWFzZSBtb2RlbHMKKwkgKi8KKwlwcml2YXRlIFN0cmluZ1tdIGdldFBvcHVsYXRpb25Nb2RlbE5hbWVzKGZpbmFsIFBvcHVsYXRpb25Nb2RlbFtdIHBvcHVsYXRpb25Nb2RlbHMpIHsKKwkJZmluYWwgU3RyaW5nW10gcmV0VmFsdWUgPSBuZXcgU3RyaW5nW3BvcHVsYXRpb25Nb2RlbHMubGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3B1bGF0aW9uTW9kZWxzLmxlbmd0aDsgaSsrKSB7CisJCQlTdHJpbmcgbmFtZSA9IHBvcHVsYXRpb25Nb2RlbHNbaV0uZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCk7CisJCQkvLyBXYXMgYSBuYW1lIHNwZWNpZmllZD8KKwkJCWlmICgobmFtZSA9PSBudWxsKSB8fCBuYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCS8vIE5vCisJCQkJbmFtZSA9IHBvcHVsYXRpb25Nb2RlbHNbaV0uZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7CisJCQl9IC8vIGlmCisKKwkJCXJldFZhbHVlW2ldID0gbmFtZTsKKwkJfSAvLyBmb3IgaQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRQb3B1bGF0aW9uTW9kZWxOYW1lcworCisJCisJUG9wdWxhdGlvbk1vZGVsIGdldFNlbGVjdGVkUG9wdWxhdGlvbk1vZGVsKCkgeworCQlmaW5hbCBQb3B1bGF0aW9uTW9kZWwgcmV0VmFsdWUgPSAoUG9wdWxhdGlvbk1vZGVsKUVjb3JlVXRpbAorCQkJCS5jb3B5KGdldFBvcHVsYXRpb25Nb2RlbHMoKVtjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpXSk7CisJCXBvcHVsYXRpb25Nb2RlbFByb3BlcnR5Q29tcG9zaXRlLnBvcHVsYXRlUG9wdWxhdGlvbk1vZGVsKHJldFZhbHVlKTsKKwkJcmV0VmFsdWUuc2V0VGFyZ2V0SVNPS2V5KHRoaXMuZ2V0SXNvS2V5KCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRTZWxlY3RlZFBvcHVsYXRpb25Nb2RlbAorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNoZWNrU3ViY2xhc3MoKSB7CisJCS8vIERpc2FibGUgdGhlIGNoZWNrIHRoYXQgcHJldmVudHMgc3ViLWNsYXNzaW5nIG9mIFNXVCBjb21wb25lbnRzCisJfQorCisJLyoqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRyb2wgYXJlIHZhbGlkLAorCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKKwkJcmV0dXJuIHBvcHVsYXRpb25Nb2RlbFByb3BlcnR5Q29tcG9zaXRlLnZhbGlkYXRlKCk7CisJfSAvLyB2YWxpZGF0ZQorCisJLyoqCisJICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZSBzZXQgYnkge0BsaW5rICN2YWxpZGF0ZSgpfQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgeworCQlyZXR1cm4gcG9wdWxhdGlvbk1vZGVsUHJvcGVydHlDb21wb3NpdGUuZ2V0RXJyb3JNZXNzYWdlKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJc29LZXkoKSB7CisJCXJldHVybiBpc29LZXk7CisJfQorCQorCXB1YmxpYyBVUkkgZ2V0VGFyZ2V0VVJJKCkgeworCQlyZXR1cm4gdGFyZ2V0VVJJOworCX0KK30gLy8gUG9wdWxhdGlvbkRlZmluaXRpb25Db250cm9sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC93aXphcmRzL1BvcHVsYXRpb25Nb2RlbFByb3BlcnR5Q29tcG9zaXRlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC93aXphcmRzL1BvcHVsYXRpb25Nb2RlbFByb3BlcnR5Q29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyYjRlNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3dpemFyZHMvUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLy8gRGlzZWFzZU1vZGVsUHJvcGVydHlDb21wb3NpdGUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQud2l6YXJkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuYWRhcHRlcnMuUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLmFkYXB0ZXJzLlBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuYWRhcHRlcnMuUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3RhY2tMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7CisKKwlwcml2YXRlIGZpbmFsIE1hcDxQb3B1bGF0aW9uTW9kZWwsIFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yPiBtb2RlbE1hcCA9IG5ldyBIYXNoTWFwPFBvcHVsYXRpb25Nb2RlbCwgUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3I+KCk7CisKKwlwcml2YXRlIFN0YWNrTGF5b3V0IHN0YWNrTGF5b3V0ID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgY29tcG9zaXRlCisJICogCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqIEBwYXJhbSBwcm9qZWN0VmFsaWRhdG9yCisJICovCisJcHVibGljIFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5Q29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsCisJCQlmaW5hbCBpbnQgc3R5bGUsIGZpbmFsIFBvcHVsYXRpb25Nb2RlbFtdIHBvcHVsYXRpb25Nb2RlbHMsCisJCQlNb2RpZnlMaXN0ZW5lciBwcm9qZWN0VmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB7CisJCXN1cGVyKHBhcmVudCwgc3R5bGUpOworCQlzdGFja0xheW91dCA9IG5ldyBTdGFja0xheW91dCgpOworCQlzZXRMYXlvdXQoc3RhY2tMYXlvdXQpOworCisJCUxhYmVsIGxhYmVsOworCQlsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJETVBDMSIpKTsgLy8kTk9OLU5MUy0xJAorCQlQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvciBmaXJzdE9uZSA9IG51bGw7CisJCS8vIEFueSBkaXNlYXNlIG1vZGVscz8KKwkJaWYgKHBvcHVsYXRpb25Nb2RlbHMgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBvcHVsYXRpb25Nb2RlbHMubGVuZ3RoOyBpKyspIHsKKworCQkJCVBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlciBkbXBlYSA9IChQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXIpIFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkJCS5hZGFwdChwb3B1bGF0aW9uTW9kZWxzW2ldLAorCQkJCQkJCQlQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuY2xhc3MpOworCisJCQkJZmluYWwgUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3IgZG1wZSA9IGRtcGVhCisJCQkJCQkuY3JlYXRlUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3IodGhpcywgU1dULk5PTkUsCisJCQkJCQkJCXByb2plY3RWYWxpZGF0b3IsIHByb2plY3QpOworCisJCQkJbW9kZWxNYXAucHV0KHBvcHVsYXRpb25Nb2RlbHNbaV0sIGRtcGUpOworCQkJCWlmIChmaXJzdE9uZSA9PSBudWxsKSB7CisJCQkJCS8vIFllcworCQkJCQlmaXJzdE9uZSA9IGRtcGU7CisJCQkJfSAvLyBpZgorCQkJfSAvLyBmb3IgaQorCQl9IC8vIGlmIGFueSBkaXNlYXNlIG1vZGVscz8KKworCQlzdGFja0xheW91dC50b3BDb250cm9sID0gZmlyc3RPbmU7CisJfSAvLyBEaXNlYXNlTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZQorCisJdm9pZCBkaXNwbGF5RGlzZWFzZU1vZGVsKGZpbmFsIFBvcHVsYXRpb25Nb2RlbCBkaXNlYXNlTW9kZWwpIHsKKwkJZmluYWwgUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3IgZG1wZSA9IG1vZGVsTWFwLmdldChkaXNlYXNlTW9kZWwpOworCQkvLyBEaWQgd2UgZmluZCBpdD8KKwkJaWYgKGRtcGUgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlzdGFja0xheW91dC50b3BDb250cm9sID0gZG1wZTsKKwkJCWxheW91dCgpOworCQl9IC8vIGlmCisJCWVsc2UgeworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiRE1QQzIiKSAvLyROT04tTkxTLTEkCisJCQkJCSsgZGlzZWFzZU1vZGVsLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIlwiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0gLy8gZGlzcGxheURpc2Vhc2VNb2RlbAorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjaGVja1N1YmNsYXNzKCkgeworCQkvLyBEaXNhYmxlIHRoZSBjaGVjayB0aGF0IHByZXZlbnRzIHN1Yi1jbGFzc2luZyBvZiBTV1QgY29tcG9uZW50cworCX0KKworCS8qKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb21wb3NpdGUgYXJlIHZhbGlkLAorCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKKwkJcmV0dXJuICgoUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3IpIChzdGFja0xheW91dC50b3BDb250cm9sKSkKKwkJCQkudmFsaWRhdGUoKTsKKwl9IC8vIHZhbGlkYXRlCisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7CisJCXJldHVybiAoKFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yKSAoc3RhY2tMYXlvdXQudG9wQ29udHJvbCkpCisJCQkJLmdldEVycm9yTWVzc2FnZSgpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBkaXNlYXNlTW9kZWwKKwkgKi8KKwlwdWJsaWMgdm9pZCBwb3B1bGF0ZVBvcHVsYXRpb25Nb2RlbChQb3B1bGF0aW9uTW9kZWwgcG9wdWxhdGlvbk1vZGVsKSB7CisJCSgoUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3IpIChzdGFja0xheW91dC50b3BDb250cm9sKSkKKwkJCQkucG9wdWxhdGUocG9wdWxhdGlvbk1vZGVsKTsKKwl9IC8vIHBvcHVsYXRlUG9wdWxhdGlvbk1vZGVsCisKK30gLy8gUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlDb21wb3NpdGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3dpemFyZHMvUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3dpemFyZHMvUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTg3ZWMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvd2l6YXJkcy9Qb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8vIERpc2Vhc2VXaXphcmRNZXNzYWdlcy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50czsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRoZSBSZXNvdXJjZSBCdW5kbGUgZm9yIHRoaXMgcGFja2FnZS4KKyAqLworcHVibGljIGNsYXNzIFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSBDb25zdGFudHMuSURfUk9PVAorCQkJKyAiLnVpLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQud2l6YXJkcy5wb3B1bGF0aW9ubW9kZWx3aXphcmRtZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCisJCQkuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKKworCXByaXZhdGUgUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMoKSB7CisJCS8vIGVtcHR5CisJfQorCisJLyoqCisJICogQHBhcmFtIGtleQorCSAqICAgICAgICAgICAgdGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UKKwkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSBrZXkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoZmluYWwgU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoZmluYWwgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9IC8vIGdldFN0cmluZworfSAvLyBEaXNlYXNlV2l6YXJkTWVzc2FnZXMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3dpemFyZHMvU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvd2l6YXJkcy9TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMwNmZmYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3dpemFyZHMvU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvci5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvLyBTdGFuZGFyZERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLndpemFyZHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Jbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuYWRhcHRlcnMuUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIENvbXBvc2l0ZX0gdGhhdCBwcmVzZW50cyB0aGUgcHJvcGVydGllcyBvZiBhCisgKiB7QGxpbmsgUG9wdWxhdGlvbkluaXRpYWxpemVyfSBmb3IgZWRpdGluZy4KKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3IgZXh0ZW5kcyBQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvciB7CisJCisJLyoqCisJICogQ3JlYXRlIHRoZSBjb21wb3NpdGUKKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50CisJICogQHBhcmFtIHN0eWxlCisJICogQHBhcmFtIHByb2plY3RWYWxpZGF0b3IKKwkgKi8KKwlwdWJsaWMgU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvcihmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBpbnQgc3R5bGUsCisJCQlmaW5hbCBQb3B1bGF0aW9uSW5pdGlhbGl6ZXIgcG9wdWxhdGlvbkluaXRpYWxpemVyLAorCQkJZmluYWwgTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcihwYXJlbnQsIHN0eWxlLCBwb3B1bGF0aW9uSW5pdGlhbGl6ZXIsIHByb2plY3RWYWxpZGF0b3IsIHByb2plY3QpOworCQkKKwl9IC8vIFN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3IKKworCS8qKgorCSAqIEBwYXJhbSBkaXNlYXNlTW9kZWwKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgRGlzZWFzZU1vZGVsfSBpbnN0YW5jZSB0byBwb3B1bGF0ZS4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwb3B1bGF0ZShmaW5hbCBQb3B1bGF0aW9uSW5pdGlhbGl6ZXIgcG9wdWxhdGlvbkluaXRpYWxpemVyKSB7CisJCXN1cGVyLnBvcHVsYXRlKHBvcHVsYXRpb25Jbml0aWFsaXplcik7CisJCQorCQlmb3IgKGZpbmFsIE1hcC5FbnRyeTxFU3RydWN0dXJhbEZlYXR1cmUsIFRleHQ+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpIHsKKwkJCXN3aXRjaCAoZW50cnkuZ2V0S2V5KCkuZ2V0RmVhdHVyZUlEKCkpIHsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlBPUFVMQVRJT05fSU5JVElBTElaRVJfX1BPUFVMQVRJT05fSURFTlRJRklFUjoKKwkJCQkoKFBvcHVsYXRpb25Jbml0aWFsaXplcilwb3B1bGF0aW9uSW5pdGlhbGl6ZXIpLnNldFBvcHVsYXRpb25JZGVudGlmaWVyKGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fSU5JVElBTElaRVJfX0lORElWSURVQUxTOgorCQkJCSgoU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXIpcG9wdWxhdGlvbkluaXRpYWxpemVyKQorCQkJCQkJLnNldEluZGl2aWR1YWxzKChEb3VibGUucGFyc2VEb3VibGUoZW50cnkuZ2V0VmFsdWUoKS5nZXRUZXh0KCkudHJpbSgpKSkpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0gLy8gc3dpdGNoCisJCX0gLy8gZm9yIGVhY2ggTWFwLmVudHJ5CisKKwkJZm9yIChmaW5hbCBNYXAuRW50cnk8RVN0cnVjdHVyYWxGZWF0dXJlLCBCb29sZWFuPiBlbnRyeSA6IGJvb2xlYW5NYXAuZW50cnlTZXQoKSkgeworCQkJc3dpdGNoIChlbnRyeS5nZXRLZXkoKS5nZXRGZWF0dXJlSUQoKSkgeworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fVVNFX0RFTlNJVFk6CisJCQkJKChTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplcilwb3B1bGF0aW9uSW5pdGlhbGl6ZXIpLnNldFVzZURlbnNpdHkoZW50cnkuZ2V0VmFsdWUoKSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfSAvLyBzd2l0Y2gKKwkJfSAvLyBmb3IgZWFjaCBNYXAuZW50cnkKKworCX0gLy8gcG9wdWxhdGUKKworCS8qKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRlbnRzIGFyZSB2YWxpZCwgPGNvZGU+ZmFsc2U8L2NvZGU+CisJICogICAgICAgICBvdGhlcndpc2UuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci52YWxpZGF0ZSgpOworCisJCWlmIChyZXRWYWx1ZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBUZXh0IHRleHQgPSBtYXAKKwkJCQkJLmdldChTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fUE9QVUxBVElPTl9JREVOVElGSUVSKTsKKwkJCXJldFZhbHVlID0gIXRleHQuZ2V0VGV4dCgpLmVxdWFscygiIik7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIG5vdGhpbmc/CisJCQlpZiAoIXJldFZhbHVlKSB7CisJCQkJLy8gWWVzCisJCQkJZXJyb3JNZXNzYWdlID0gUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJORGl6V2l6RXJyMTUiKTsgLy8kTk9OLU5MUy0xJAorCQkJfSAvLyBpZgorCQl9IC8vIGlmCisKKwkJLy8gCisJCWlmIChyZXRWYWx1ZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBUZXh0IHRleHQgPSBtYXAKKwkJCQkJLmdldChTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RBTkRBUkRfUE9QVUxBVElPTl9JTklUSUFMSVpFUl9fSU5ESVZJRFVBTFMpOworCQkJaWYodGV4dCAhPSBudWxsKSB7CisJCQkJcmV0VmFsdWUgPSAhdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCS8vIG5vdGhpbmc/CisJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQkvLyBZZXMKKwkJCQkJZXJyb3JNZXNzYWdlID0gUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJORGl6V2l6RXJyMTYiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0gLy8gaWYKKwkJCQllbHNlIHsKKwkJCQkJLy8gTm8KKwkJCQkJLy8gSXMgaXQgYSB2YWxpZCB2YWx1ZSA+IDA/CisJCQkJCXJldFZhbHVlID0gaXNWYWxpZFZhbHVlKHRleHQuZ2V0VGV4dCgpLCAwLjApOworCQkJCQlpZiAoIXJldFZhbHVlKSB7CisJCQkJCQkvLyBObworCQkJCQkJZXJyb3JNZXNzYWdlID0gUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMKKwkJCQkJCQkJLmdldFN0cmluZygiTkRpeldpekVycjE3Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfSAvLyBpZgorCQkJCX0KKwkJCX0KKwkJfSAKKwkJCQkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gdmFsaWRhdGUKKworfSAvLyBTdGFuZGFyZFByb3BlcnR5TW9kZWxQcm9wZXJ0eUVkaXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvd2l6YXJkcy9TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvd2l6YXJkcy9TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOWNhZGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC93aXphcmRzL1N0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3JBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQud2l6YXJkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Jbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5hZGFwdGVycy5Qb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuYWRhcHRlcnMuUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3JBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5hZGFwdGVycy5Qb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuYWRhcHRlcnMuUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CisKK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yQWRhcHRlciBleHRlbmRzCisJCVBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yQWRhcHRlciB7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3IgY3JlYXRlUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3IoCisJCQlmaW5hbCBQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUNvbXBvc2l0ZSBwb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUNvbXBvc2l0ZSwKKwkJCWZpbmFsIGludCBzdHlsZSwgZmluYWwgTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCkgeworCQlyZXR1cm4gbmV3IFN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3IoCisJCQkJcG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlDb21wb3NpdGUsIHN0eWxlLAorCQkJCShQb3B1bGF0aW9uSW5pdGlhbGl6ZXIpIGdldFRhcmdldCgpLCBwcm9qZWN0VmFsaWRhdG9yLCBwcm9qZWN0KTsKKwl9IAorCit9IApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvd2l6YXJkcy9TdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3dpemFyZHMvU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFiYmY4MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3dpemFyZHMvU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQud2l6YXJkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQudXRpbC5TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5hZGFwdGVycy5Qb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLmFkYXB0ZXJzLlBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkgZXh0ZW5kcworCQlTdGFuZGFyZEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMKKwkJUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeSB7CisKKwlwdWJsaWMgU3RhbmRhcmRQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5KCkgeworCQlzdXBlcigpOworCQlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJLmFkZEFkYXB0ZXJGYWN0b3J5KHRoaXMpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBTdGFuZGFyZFBvcHVsYXRpb25Jbml0aWFsaXplclByb3BlcnR5RWRpdG9yQWRhcHRlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVlldGlQb3B1bGF0aW9uSW5pdGlhbGl6ZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IFN0YW5kYXJkUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3JBZGFwdGVyKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gUG9wdWxhdGlvbkluaXRpYWxpemVyUHJvcGVydHlFZGl0b3JBZGFwdGVyLmNsYXNzCisJCQkJfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9CisKK30gLy8gU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC93aXphcmRzL1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3dpemFyZHMvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMTM0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC93aXphcmRzL1N0YW5kYXJkUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3IuamF2YQpAQCAtMCwwICsxLDQ2OCBAQAorLy8gU3RhbmRhcmREaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLkRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU2Vhc29uYWxQb3B1bGF0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlN0YW5kYXJkRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuU3RhbmRhcmRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuYWRhcHRlcnMuUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBDb21wb3NpdGV9IHRoYXQgcHJlc2VudHMgdGhlIHByb3BlcnRpZXMgb2YgYQorICoge0BsaW5rIERpc2Vhc2VNb2RlbH0gZm9yIGVkaXRpbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yIGV4dGVuZHMgUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3IgeworCisJcHJpdmF0ZSBBcnJheUxpc3Q8Q29tcG9zaXRlPmdyb3VwQ29tcG9zaXRlcyA9IG5ldyBBcnJheUxpc3Q8Q29tcG9zaXRlPigpOworCXByaXZhdGUgQXJyYXlMaXN0PFRleHQ+Z3JvdXBJRENvbXBvc2l0ZXMgPSBuZXcgQXJyYXlMaXN0PFRleHQ+KCk7CisJcHJpdmF0ZSBBcnJheUxpc3Q8VGV4dD5ncm91cEZyYWNDb21wb3NpdGVzID0gbmV3IEFycmF5TGlzdDxUZXh0PigpOworCQorCXByaXZhdGUgc3RhdGljIFN0cmluZyBERUZBVUxUX1BPUFVMQVRJT05fSURfUFJFRklYID0gImdyb3VwIjsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9QT1BVTEFUSU9OX0ZSQUNUSU9OID0gIjEuMCI7CisJCisJR3JvdXAgYWxsR3JvdXBzOworCQorCS8qKgorCSAqIENyZWF0ZSB0aGUgY29tcG9zaXRlCisJICogCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqIEBwYXJhbSBwcm9qZWN0VmFsaWRhdG9yCisJICovCisJcHVibGljIFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3IoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgaW50IHN0eWxlLAorCQkJZmluYWwgUG9wdWxhdGlvbk1vZGVsIHBvcHVsYXRpb25Nb2RlbCwKKwkJCWZpbmFsIE1vZGlmeUxpc3RlbmVyIHByb2plY3RWYWxpZGF0b3IsIElQcm9qZWN0IHByb2plY3QpIHsKKwkJc3VwZXIocGFyZW50LCBzdHlsZSwgcG9wdWxhdGlvbk1vZGVsLCBwcm9qZWN0VmFsaWRhdG9yLCBwcm9qZWN0KTsKKwkKKwkJaWYocG9wdWxhdGlvbk1vZGVsIGluc3RhbmNlb2YgRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwpIHsKKwkJCWFsbEdyb3VwcyA9IG5ldyBHcm91cCh0aGlzLCBTV1QuTk9ORSk7CisJCQlHcmlkTGF5b3V0IHNpbmdsZUNvbEdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQkJc2luZ2xlQ29sR3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKKwkJCWFsbEdyb3Vwcy5zZXRMYXlvdXQoc2luZ2xlQ29sR3JpZExheW91dCk7CisJCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKTsKKwkJCWdkLmhvcml6b250YWxTcGFuID0gMzsKKwkJCWFsbEdyb3Vwcy5zZXRMYXlvdXREYXRhKGdkKTsKKwkJCQorCQkJYWRkUG9wdWxhdGlvbkdyb3VwRmllbGQoYWxsR3JvdXBzLCBwcm9qZWN0VmFsaWRhdG9yKTsKKwkJCQorCQkJZmluYWwgQnV0dG9uIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcywgU1dULk5PTkUpOworCQkJZmluYWwgR3JpZERhdGEgYnV0dG9uR0QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKKwkJCWFkZEJ1dHRvbi5zZXRUZXh0KFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiYWRkR3JvdXAiKSk7CisJCQlhZGRCdXR0b24uc2V0VG9vbFRpcFRleHQoUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJhZGRHcm91cFRUIikpOworCQkJYnV0dG9uR0QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCQlidXR0b25HRC5ob3Jpem9udGFsU3BhbiA9IDM7CisJCQlhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HRCk7CisJCQlmaW5hbCBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yIHNlbGYgPSB0aGlzOworCQkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQkKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7CisJCQkJCWFkZFBvcHVsYXRpb25Hcm91cEZpZWxkKGFsbEdyb3VwcywgcHJvamVjdFZhbGlkYXRvcik7CisJCQkJCXNlbGYuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOworCQkJCX0KKwkJCQkKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgYXJnMCkgeworCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJCQorCQkJCX0KKwkJCX0pOworCQl9CisJfSAvLyBTdGFuZGFyZERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yCisKKwlwcml2YXRlIHZvaWQgYWRkUG9wdWxhdGlvbkdyb3VwRmllbGQoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvcikgeworCQkKKwkJR3JvdXAgZ3JvdXBJbmZvID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULkJPUkRFUik7CisJCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDU7CisJCWdyb3VwSW5mby5zZXRMYXlvdXQoZ3JpZExheW91dCk7CisJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOworCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7CisJCWdyb3VwSW5mby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKwkJCisJCWdyb3VwQ29tcG9zaXRlcy5hZGQoZ3JvdXBJbmZvKTsKKwkKKwkJZmluYWwgQnV0dG9uIHJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXBJbmZvLCBTV1QuTk9ORSk7CisJCXJlbW92ZUJ1dHRvbi5zZXRUZXh0KFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygicmVtb3ZlR3JvdXAiKSk7CisJCXJlbW92ZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoInJlbW92ZUdyb3VwVFQiKSk7CisJCQorCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkKKwkJCisJCQkKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKKwkJCQlpbnQgaW5kID0gZ3JvdXBDb21wb3NpdGVzLmluZGV4T2YocmVtb3ZlQnV0dG9uLmdldFBhcmVudCgpKTsKKwkJCQlpZihpbmQgPT0gLTEpIHsKKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJFcnJvciwgZ3JvdXAgY29tcG9zaXRlIG5vdCBmb3VuZCEiLCBuZXcgRXhjZXB0aW9uKCkpOworCQkJCX0KKwkJCQlncm91cENvbXBvc2l0ZXMucmVtb3ZlKGluZCk7CisJCQkJZ3JvdXBGcmFjQ29tcG9zaXRlcy5yZW1vdmUoaW5kKTsKKwkJCQlncm91cElEQ29tcG9zaXRlcy5yZW1vdmUoaW5kKTsKKwkJCQkKKwkJCQlyZW1vdmVCdXR0b24uZ2V0UGFyZW50KCkuZGlzcG9zZSgpOworCQkJCXBhcmVudC5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7CisJCQkJaWYoZ3JvdXBJRENvbXBvc2l0ZXMuc2l6ZSgpID4gMCkKKwkJCQkJZ3JvdXBJRENvbXBvc2l0ZXMuZ2V0KDApLnNldFRleHQoZ3JvdXBJRENvbXBvc2l0ZXMuZ2V0KDApLmdldFRleHQoKSk7IC8vIGZvcmNlIHZhbGlkYXRpb24KKwkJCX0KKwkJCQorCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJCisJCQl9CisJCX0pOworCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7CisJCQorCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChncm91cEluZm8sIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0VGV4dChQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoInBvcHVsYXRpb25JZCIpKTsKKwkJR3JpZERhdGEgbGFiZWxHRCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQpOworCQlsYWJlbEdELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQlsYWJlbEdELmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5FTkQ7CisJCWxhYmVsR0QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7CisJCWxhYmVsR0QuaG9yaXpvbnRhbEluZGVudCA9IDA7CisJCWxhYmVsLnNldExheW91dERhdGEobGFiZWxHRCk7CisJCQorCQlUZXh0IHRleHQgPSBuZXcgVGV4dChncm91cEluZm8sIFNXVC5CT1JERVJ8U1dULlRSQUlMKTsKKwkJU3RyaW5nIGlkID0gREVGQVVMVF9QT1BVTEFUSU9OX0lEX1BSRUZJWCsoZ3JvdXBDb21wb3NpdGVzLnNpemUoKSk7CisJCXRleHQuc2V0VGV4dChpZCk7CisJCUdyaWREYXRhIHRleHRHRCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKKwkJdGV4dEdELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQl0ZXh0R0QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCXRleHRHRC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKKwkJdGV4dC5zZXRMYXlvdXREYXRhKHRleHRHRCk7CisJCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIocHJvamVjdFZhbGlkYXRvcik7CisJCWdyb3VwSURDb21wb3NpdGVzLmFkZCh0ZXh0KTsKKwkJCisJCWxhYmVsID0gbmV3IExhYmVsKGdyb3VwSW5mbywgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygicG9wdWxhdGlvbklkRnJhY3Rpb24iKSk7CisJCWxhYmVsR0QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5EKTsKKwkJbGFiZWxHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJbGFiZWxHRC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRU5EOworCQlsYWJlbEdELnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOworCQlsYWJlbEdELmhvcml6b250YWxJbmRlbnQgPSAwOworCQlsYWJlbC5zZXRMYXlvdXREYXRhKGxhYmVsR0QpOworCQkKKwkJdGV4dCA9IG5ldyBUZXh0KGdyb3VwSW5mbywgU1dULkJPUkRFUnxTV1QuVFJBSUwpOworCQkKKwkJZG91YmxlIGZyYWMgPSBEb3VibGUucGFyc2VEb3VibGUoREVGQVVMVF9QT1BVTEFUSU9OX0ZSQUNUSU9OKTsKKwkJZG91YmxlIHN1bT0wO2ZvcihUZXh0IHQ6Z3JvdXBGcmFjQ29tcG9zaXRlcykgeworCQkJdHJ5IHsKKwkJCXN1bSs9RG91YmxlLnBhcnNlRG91YmxlKHQuZ2V0VGV4dCgpKTsKKwkJCX0gY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHBlKSB7CisJCQkJLy8gSWdub3JlIHBhZ2Ugd2lsbCBiZSBpbnZhbGlkYXRlZAorCQkJfQorCQl9CisJCWlmKGZyYWMrc3VtID4gMS4wKWZyYWMgPSAxLjAtc3VtOworCQlpZiAoZnJhYyA8MClmcmFjID0gMC4wOworCQl0ZXh0LnNldFRleHQoZnJhYysiIik7CisJCQorCQl0ZXh0R0QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7CisJCXRleHRHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJdGV4dEdELmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQl0ZXh0R0QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7CisJCXRleHQuc2V0TGF5b3V0RGF0YSh0ZXh0R0QpOworCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHByb2plY3RWYWxpZGF0b3IpOworCQlncm91cEZyYWNDb21wb3NpdGVzLmFkZCh0ZXh0KTsKKwkJZ3JvdXBJbmZvLnBhY2soKTsKKwkJCisvLwkJdGhpcy5yZW1vdmVBbGxHcm91cHMoKTsKKy8vCQl0aGlzLmxheW91dEFsbEdyb3VwcygpOworCX0KKwkvKioKKwkgKiBAcGFyYW0gZGlzZWFzZU1vZGVsCisJICogICAgICAgICAgICB0aGUge0BsaW5rIERpc2Vhc2VNb2RlbH0gaW5zdGFuY2UgdG8gcG9wdWxhdGUuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcG9wdWxhdGUoZmluYWwgUG9wdWxhdGlvbk1vZGVsIHBvcHVsYXRpb25Nb2RlbCkgeworCQlzdXBlci5wb3B1bGF0ZShwb3B1bGF0aW9uTW9kZWwpOworCQkKKwkJZm9yIChmaW5hbCBNYXAuRW50cnk8RVN0cnVjdHVyYWxGZWF0dXJlLCBUZXh0PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7CisJCQlzd2l0Y2ggKGVudHJ5LmdldEtleSgpLmdldEZlYXR1cmVJRCgpKSB7CisJCQljYXNlIFN0YW5kYXJkUGFja2FnZS5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19QT1BVTEFUSU9OX0lERU5USUZJRVI6CisJCQkJKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbClwb3B1bGF0aW9uTW9kZWwpLnNldFBvcHVsYXRpb25JZGVudGlmaWVyKGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX05BTUU6CisJCQkJKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbClwb3B1bGF0aW9uTW9kZWwpLnNldE5hbWUoZW50cnkuZ2V0VmFsdWUoKS5nZXRUZXh0KCkpOworCQkJCWJyZWFrOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fQklSVEhfUkFURToKKwkJCQkoKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKXBvcHVsYXRpb25Nb2RlbCkKKwkJCQkJCS5zZXRCaXJ0aFJhdGUoRG91YmxlLnBhcnNlRG91YmxlKGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpLnRyaW0oKSkpOworCQkJCWJyZWFrOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fREVBVEhfUkFURToKKwkJCQkoKFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsKXBvcHVsYXRpb25Nb2RlbCkKKwkJCQkuc2V0RGVhdGhSYXRlKERvdWJsZS5wYXJzZURvdWJsZShlbnRyeS5nZXRWYWx1ZSgpLmdldFRleHQoKS50cmltKCkpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU3RhbmRhcmRQYWNrYWdlLlNUQU5EQVJEX1BPUFVMQVRJT05fTU9ERUxfX1RJTUVfUEVSSU9EOgorCQkJCSgoU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwpcG9wdWxhdGlvbk1vZGVsKQorCQkJCS5zZXRUaW1lUGVyaW9kKExvbmcucGFyc2VMb25nKGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpLnRyaW0oKSkpOworCQkJCWJyZWFrOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTF9fTU9EVUxBVElPTl9BTVBMSVRVREU6CisJCQkJKChTZWFzb25hbFBvcHVsYXRpb25Nb2RlbClwb3B1bGF0aW9uTW9kZWwpCisJCQkJLnNldE1vZHVsYXRpb25BbXBsaXR1ZGUoRG91YmxlLnBhcnNlRG91YmxlKGVudHJ5LmdldFZhbHVlKCkuZ2V0VGV4dCgpLnRyaW0oKSkpOworCQkJCWJyZWFrOworCQkJY2FzZSBTdGFuZGFyZFBhY2thZ2UuU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTF9fUEhBU0U6CisJCQkJKChTZWFzb25hbFBvcHVsYXRpb25Nb2RlbClwb3B1bGF0aW9uTW9kZWwpCisJCQkJLnNldFBoYXNlKERvdWJsZS5wYXJzZURvdWJsZShlbnRyeS5nZXRWYWx1ZSgpLmdldFRleHQoKS50cmltKCkpKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9IC8vIHN3aXRjaAorCQl9IC8vIGZvciBlYWNoIE1hcC5lbnRyeQorCQkKKwkJaWYocG9wdWxhdGlvbk1vZGVsIGluc3RhbmNlb2YgRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwpIHsKKwkJCURlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsIGRwbSA9IChEZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbClwb3B1bGF0aW9uTW9kZWw7CisJCQkKKwkJCS8vIEFkZCBncm91cHMJCisJCQlmb3IoaW50IGk9MDtpPGdyb3VwSURDb21wb3NpdGVzLnNpemUoKTsrK2kpIHsKKwkJCQlQb3B1bGF0aW9uR3JvdXAgbmV3R3JvdXAgPSBTdGFuZGFyZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvcHVsYXRpb25Hcm91cCgpOworCQkJCVN0cmluZyBpZCA9IGdyb3VwSURDb21wb3NpdGVzLmdldChpKS5nZXRUZXh0KCk7CisJCQkJZG91YmxlIGZyID0gRG91YmxlLnBhcnNlRG91YmxlKGdyb3VwRnJhY0NvbXBvc2l0ZXMuZ2V0KGkpLmdldFRleHQoKSk7CisJCQkJbmV3R3JvdXAuc2V0SWRlbnRpZmllcihpZCk7CisJCQkJbmV3R3JvdXAuc2V0RnJhY3Rpb24oZnIpOworCQkJCWRwbS5nZXRQb3B1bGF0aW9uR3JvdXBzKCkuYWRkKG5ld0dyb3VwKTsKKwkJCX0KKwkJfQorCX0gLy8gcG9wdWxhdGUKKworCS8qKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRlbnRzIGFyZSB2YWxpZCwgPGNvZGU+ZmFsc2U8L2NvZGU+CisJICogICAgICAgICBvdGhlcndpc2UuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci52YWxpZGF0ZSgpOworCisJCWlmIChyZXRWYWx1ZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBUZXh0IHRleHQgPSBtYXAKKwkJCQkJLmdldChTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuUE9QVUxBVElPTl9NT0RFTF9fUE9QVUxBVElPTl9JREVOVElGSUVSKTsKKwkJCXJldFZhbHVlID0gIXRleHQuZ2V0VGV4dCgpLmVxdWFscygiIik7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIG5vdGhpbmc/CisJCQlpZiAoIXJldFZhbHVlKSB7CisJCQkJLy8gWWVzCisJCQkJZXJyb3JNZXNzYWdlID0gUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJORGl6V2l6RXJyMCIpOyAvLyROT04tTkxTLTEkCisJCQl9IC8vIGlmCisJCX0gLy8gaWYKKworCQkvLyAKKwkJLy8gQmFja2dyb3VuZCBtb3J0YWxpdHkgcmF0ZT8KKwkJaWYgKHJldFZhbHVlKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIFRleHQgdGV4dCA9IG1hcAorCQkJCQkuZ2V0KFN0YW5kYXJkUGFja2FnZS5MaXRlcmFscy5TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19ERUFUSF9SQVRFKTsKKwkJCXJldFZhbHVlID0gIXRleHQuZ2V0VGV4dCgpLmVxdWFscygiIik7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIG5vdGhpbmc/CisJCQlpZiAoIXJldFZhbHVlKSB7CisJCQkJLy8gWWVzCisJCQkJZXJyb3JNZXNzYWdlID0gUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJORGl6V2l6RXJyNCIpOyAvLyROT04tTkxTLTEkCisJCQl9IC8vIGlmCisJCQllbHNlIHsKKwkJCQkvLyBObworCQkJCS8vIElzIGl0IGEgdmFsaWQgdmFsdWUgPiAwPworCQkJCXJldFZhbHVlID0gaXNWYWxpZFZhbHVlKHRleHQuZ2V0VGV4dCgpLCAwLjApOworCQkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkJLy8gTm8KKwkJCQkJZXJyb3JNZXNzYWdlID0gUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMKKwkJCQkJCQkuZ2V0U3RyaW5nKCJORGl6V2l6RXJyNSIpOyAvLyROT04tTkxTLTEkCisJCQkJfSAvLyBpZgorCQkJfQorCQl9IC8vIGlmIEJhY2tncm91bmQgbW9ydGFsaXR5IHJhdGUKKwkJCisJCS8vIAorCQkvLyBiaXJ0aCByYXRlCisJCWlmIChyZXRWYWx1ZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBUZXh0IHRleHQgPSBtYXAKKwkJCQkJLmdldChTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fQklSVEhfUkFURSk7CisJCQlyZXRWYWx1ZSA9ICF0ZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpOyAvLyROT04tTkxTLTEkCisJCQkvLyBub3RoaW5nPworCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCS8vIFllcworCQkJCWVycm9yTWVzc2FnZSA9IFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkRpeldpekVycjYiKTsgLy8kTk9OLU5MUy0xJAorCQkJfSAvLyBpZgorCQkJZWxzZSB7CisJCQkJLy8gTm8KKwkJCQkvLyBJcyBpdCBhIHZhbGlkIHZhbHVlID4gMD8KKwkJCQlyZXRWYWx1ZSA9IGlzVmFsaWRWYWx1ZSh0ZXh0LmdldFRleHQoKSwgMC4wKTsKKwkJCQlpZiAoIXJldFZhbHVlKSB7CisJCQkJCS8vIE5vCisJCQkJCWVycm9yTWVzc2FnZSA9IFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzCisJCQkJCQkJLmdldFN0cmluZygiTkRpeldpekVycjciKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0gLy8gaWYKKwkJCX0KKwkJfSAvLyBpZiBCYWNrZ3JvdW5kIG1vcnRhbGl0eSByYXRlCisKKwkJLy8gCisJCS8vIHRpbWUgcGVyaW9kCisJCWlmIChyZXRWYWx1ZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBUZXh0IHRleHQgPSBtYXAKKwkJCQkJLmdldChTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RBTkRBUkRfUE9QVUxBVElPTl9NT0RFTF9fVElNRV9QRVJJT0QpOworCQkJcmV0VmFsdWUgPSAhdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJLy8gbm90aGluZz8KKwkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkvLyBZZXMKKwkJCQllcnJvck1lc3NhZ2UgPSBQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5EaXpXaXpFcnI4Iik7IC8vJE5PTi1OTFMtMSQKKwkJCX0gLy8gaWYKKwkJCWVsc2UgeworCQkJCS8vIE5vCisJCQkJLy8gSXMgaXQgYSB2YWxpZCB2YWx1ZSA+IDA/CisJCQkJcmV0VmFsdWUgPSBpc1ZhbGlkTG9uZ1ZhbHVlKHRleHQuZ2V0VGV4dCgpLCAwTCk7CisJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQkvLyBObworCQkJCQllcnJvck1lc3NhZ2UgPSBQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcworCQkJCQkJCS5nZXRTdHJpbmcoIk5EaXpXaXpFcnI5Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9IC8vIGlmCisJCQl9CisJCX0gLy8gaWYgIHRpbWUgcGVyaW9kCisJCQorCQkvLyBiaXJ0aCByYXRlCisJCWlmIChyZXRWYWx1ZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBUZXh0IHRleHQgPSBtYXAKKwkJCQkJLmdldChTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU1RPQ0hBU1RJQ19TVEFOREFSRF9QT1BVTEFUSU9OX01PREVMX19HQUlOKTsKKwkJCWlmKHRleHQgIT0gbnVsbCkgeworCQkJCXJldFZhbHVlID0gIXRleHQuZ2V0VGV4dCgpLmVxdWFscygiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkvLyBub3RoaW5nPworCQkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWVycm9yTWVzc2FnZSA9IFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkRpeldpekVycjEwIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9IC8vIGlmCisJCQkJZWxzZSB7CisJCQkJCS8vIE5vCisJCQkJCS8vIElzIGl0IGEgdmFsaWQgdmFsdWUgPiAwPworCQkJCQlyZXRWYWx1ZSA9IGlzVmFsaWRWYWx1ZSh0ZXh0LmdldFRleHQoKSwgMC4wKTsKKwkJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQkJLy8gTm8KKwkJCQkJCWVycm9yTWVzc2FnZSA9IFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzCisJCQkJCQkJCS5nZXRTdHJpbmcoIk5EaXpXaXpFcnIxMCIpOyAvLyROT04tTkxTLTEkCisJCQkJCX0gLy8gaWYKKwkJCQl9CisJCQl9CisJCX0gLy8gaWYgYmlydGggcmF0ZQorCQkKKwkJCisJCS8vIG1vZHVsYXRpb24gYW1wbGl0dWRlCisJCWlmIChyZXRWYWx1ZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBUZXh0IHRleHQgPSBtYXAKKwkJCQkJLmdldChTdGFuZGFyZFBhY2thZ2UuTGl0ZXJhbHMuU0VBU09OQUxfUE9QVUxBVElPTl9NT0RFTF9fTU9EVUxBVElPTl9BTVBMSVRVREUpOworCQkJaWYodGV4dCAhPSBudWxsKSB7CisJCQkJcmV0VmFsdWUgPSAhdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCS8vIG5vdGhpbmc/CisJCQkJaWYgKCFyZXRWYWx1ZSkgeworCQkJCQkvLyBZZXMKKwkJCQkJZXJyb3JNZXNzYWdlID0gUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJORGl6V2l6RXJyMTgiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0gLy8gaWYKKwkJCQllbHNlIHsKKwkJCQkJLy8gTm8KKwkJCQkJLy8gSXMgaXQgYSB2YWxpZCBkb3VibGUgdmFsdWUgYmV0d2VlbiAwIGFuZCAxCisJCQkJCWRvdWJsZSB0ZXN0RG91YmxlID0gLTE7CisJCQkJCXRyeSB7CisJCQkJCQl0ZXN0RG91YmxlID0gKG5ldyBEb3VibGUodGV4dC5nZXRUZXh0KCkpKS5kb3VibGVWYWx1ZSgpOworCQkJCQkJaWYoKHRlc3REb3VibGUgPCAwLjApfHwodGVzdERvdWJsZSA+MS4wKSkgeworCQkJCQkJCWVycm9yTWVzc2FnZSA9IFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkRpeldpekVycjE4Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCX0KKwkJCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgeworCQkJCQkJZXJyb3JNZXNzYWdlID0gUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJORGl6V2l6RXJyMTgiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IC8vIG1vZHVsYXRpb24gYW1wbGl0dWRlCisJCQorCQkvLyBwaGFzZQorCQlpZiAocmV0VmFsdWUpIHsKKwkJCS8vIFllcworCQkJZmluYWwgVGV4dCB0ZXh0ID0gbWFwCisJCQkJCS5nZXQoU3RhbmRhcmRQYWNrYWdlLkxpdGVyYWxzLlNFQVNPTkFMX1BPUFVMQVRJT05fTU9ERUxfX1BIQVNFKTsKKwkJCWlmKHRleHQgIT0gbnVsbCkgeworCQkJCXJldFZhbHVlID0gIXRleHQuZ2V0VGV4dCgpLmVxdWFscygiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkvLyBub3RoaW5nPworCQkJCWlmICghcmV0VmFsdWUpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWVycm9yTWVzc2FnZSA9IFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkRpeldpekVycjE5Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9IC8vIGlmCisJCQkJZWxzZSB7CisJCQkJCS8vIE5vCisJCQkJCS8vIElzIGl0IGEgdmFsaWQgZG91YmxlIChhbnkgdmFsdWUgaXMgb2spCisJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQkJCQlkb3VibGUgdGVzdERvdWJsZSA9IC0xOworCQkJCQl0cnkgeworCQkJCQkJdGVzdERvdWJsZSA9IChuZXcgRG91YmxlKHRleHQuZ2V0VGV4dCgpKSkuZG91YmxlVmFsdWUoKTsKKwkJCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgeworCQkJCQkJZXJyb3JNZXNzYWdlID0gUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJORGl6V2l6RXJyMTkiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IC8vIHBoYXNlCisJCQorCQkvLyBDaGVjayB0aGF0IHRoZSBncm91cCBmcmFjdGlvbnMgYWRkIHVwIHRvIDwgMS4wCisJCQorCQlpZihyZXRWYWx1ZSkgeworCQkJZG91YmxlIHN1bSA9IDA7CisJCQlmb3IoVGV4dCB0Omdyb3VwRnJhY0NvbXBvc2l0ZXMpIHsKKwkJCQlpZighaXNWYWxpZFZhbHVlKHQuZ2V0VGV4dCgpLCAwKSkgeworCQkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCQllcnJvck1lc3NhZ2UgPSBQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoIk5EaXpXaXpFcnIxMyIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlzdW0rPURvdWJsZS5wYXJzZURvdWJsZSh0LmdldFRleHQoKSk7CisJCQl9CisJCQlpZihzdW0gPiAxLjApIHsKKwkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCWVycm9yTWVzc2FnZSA9IFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZygiTkRpeldpekVycjExIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQkvLyBDaGVjayBncm91cCBJRHMKKwkJCisJCWlmKHJldFZhbHVlKSB7CisJCQlmb3IoVGV4dCB0Omdyb3VwSURDb21wb3NpdGVzKSB7CisJCQkJaWYodC5nZXRUZXh0KCkudHJpbSgpLmVxdWFscygiIikpIHsKKwkJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQkJZXJyb3JNZXNzYWdlID0gUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMuZ2V0U3RyaW5nKCJORGl6V2l6RXJyMTIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHZhbGlkYXRlCisKK30gLy8gU3RhbmRhcmRQcm9wZXJ0eU1vZGVsUHJvcGVydHlFZGl0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3dpemFyZHMvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3dpemFyZHMvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmMxZTIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvd2l6YXJkcy9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLndpemFyZHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLmFkYXB0ZXJzLlBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5hZGFwdGVycy5Qb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKKworcHVibGljIGNsYXNzIFN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyIGV4dGVuZHMKKwkJUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyIHsKKworCUBPdmVycmlkZQorCXB1YmxpYyBQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvciBjcmVhdGVQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvcigKKwkJCWZpbmFsIFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5Q29tcG9zaXRlIHBvcHVsYXRpb25Nb2RlbFByb3BlcnR5Q29tcG9zaXRlLAorCQkJZmluYWwgaW50IHN0eWxlLCBmaW5hbCBNb2RpZnlMaXN0ZW5lciBwcm9qZWN0VmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB7CisJCXJldHVybiBuZXcgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvcigKKwkJCQlwb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUNvbXBvc2l0ZSwgc3R5bGUsCisJCQkJKFBvcHVsYXRpb25Nb2RlbCkgZ2V0VGFyZ2V0KCksIHByb2plY3RWYWxpZGF0b3IsIHByb2plY3QpOworCX0gLy8gY3JlYXRlUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3IKKworfSAvLyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BvcHVsYXRpb25tb2RlbHMvc3RhbmRhcmQvd2l6YXJkcy9TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3dpemFyZHMvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRmM2UxNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3dpemFyZHMvU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQud2l6YXJkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQudXRpbC5TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy5hZGFwdGVycy5Qb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzLmFkYXB0ZXJzLlBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkgZXh0ZW5kcworCQlTdGFuZGFyZEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMKKwkJUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeSB7CisKKwlwdWJsaWMgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5KCkgeworCQlzdXBlcigpOworCQlQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJLmFkZEFkYXB0ZXJGYWN0b3J5KHRoaXMpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0YW5kYXJkUG9wdWxhdGlvbk1vZGVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gUG9wdWxhdGlvbk1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyLmNsYXNzCisJCQkJfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9CisKK30gLy8gU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC93aXphcmRzL1N0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC93aXphcmRzL1N0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkYjU2MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3dpemFyZHMvU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLy8gU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQud2l6YXJkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQudXRpbC5TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3MuUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3MuUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBOTFMnZCBzdHJpbmdzIGZvciB7QGxpbmsgRGlzZWFzZU1vZGVsfSBwcm9wZXJ0aWVzLiAKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKKwkJU3RhbmRhcmRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7CisKKwkKKwlQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKKworCS8qKgorCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJCVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGRBZGFwdGVyRmFjdG9yeSh0aGlzKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbCNpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gIHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSkgfHwgdHlwZSA9PSBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyLmNsYXNzOworCX0KKworCS8qKgorCSAqCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9wdWxhdGlvbk1vZGVsQWRhcHRlcigpIHsKKwkJLy8gSGF2ZSB3ZSBjcmVhdGVkIG9uZSBiZWZvcmU/CisJCWlmIChhZGFwdGVyID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQlhZGFwdGVyID0gbmV3IFN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIoKTsKKwkJfSAvLyBpZiB3ZSBkaWRuJ3QgY3JlYXRlIG9uZSBiZWZvcmUKKwkJcmV0dXJuIGFkYXB0ZXI7CisJfSAvLyBjcmVhdGVEaXNlYXNlTW9kZWxBZGFwdGVyCisKKwkvKioKKwkgKiAKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3B1bGF0aW9uSW5pdGlhbGl6ZXJBZGFwdGVyKCkgeworCQkvLyBIYXZlIHdlIGNyZWF0ZWQgb25lIGJlZm9yZT8KKwkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgeworCQkJLy8gTm8KKwkJCWFkYXB0ZXIgPSBuZXcgU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlcigpOworCQl9IC8vIGlmIHdlIGRpZG4ndCBjcmVhdGUgb25lIGJlZm9yZQorCQlyZXR1cm4gYWRhcHRlcjsKKwl9IC8vIGNyZWF0ZURpc2Vhc2VNb2RlbEFkYXB0ZXIKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIgZXh0ZW5kcworCQkJUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIgeworCisJCS8qKgorCQkgKiBAcGFyYW0gZGVzY3JpcHRvcgorCQkgKiBAcmV0dXJuIHRoZSBOTFMnZCBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZShJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisJCQlyZXR1cm4gUG9wdWxhdGlvbk1vZGVsV2l6YXJkTWVzc2FnZXMKKwkJCQkJLmdldFN0cmluZygoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZGVzY3JpcHRvcgorCQkJCQkJCS5nZXRGZWF0dXJlKG51bGwpKS5nZXROYW1lKCkpOworCQl9IC8vIGdldFByb3BlcnR5TmFtZQorCisJCS8qKgorCQkgKiBAcGFyYW0gZGVzY3JpcHRvcgorCQkgKiBAcmV0dXJuIHRoZSBOTFMnZCB0b29sIHRpcCB0ZXh0IHRoYXQgZGVzY3JpYmVzIHRoZSBwcm9wZXJ0eQorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVRvb2xUaXAoCisJCQkJSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBkZXNjcmlwdG9yCisJCQkJCS5nZXRGZWF0dXJlKG51bGwpOworCQkJcmV0dXJuIFBvcHVsYXRpb25Nb2RlbFdpemFyZE1lc3NhZ2VzLmdldFN0cmluZyhmZWF0dXJlLmdldE5hbWUoKQorCQkJCQkrIFRUX1NVRkZJWCk7CisJCX0gLy8gZ2V0UHJvcGVydHlUb29sVGlwCisKKwkJLyoqCisJCSAqIEBwYXJhbSBkZXNjcmlwdG9yCisJCSAqIEByZXR1cm4gdGhlIE5MUydkIHRleHQgdGhhdCByZXByZXNlbnRzIHRoZSB1bml0cyBvZiB0aGUKKwkJICogICAgICAgICBwcm9wZXJ0eQorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVVuaXRzKAorCQkJCUlJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKwkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZGVzY3JpcHRvcgorCQkJCQkuZ2V0RmVhdHVyZShudWxsKTsKKwkJCXJldHVybiBQb3B1bGF0aW9uTW9kZWxXaXphcmRNZXNzYWdlcy5nZXRTdHJpbmcoZmVhdHVyZS5nZXROYW1lKCkKKwkJCQkJKyBVTklUX1NVRkZJWCk7CisJCX0gLy8gZ2V0UHJvcGVydHlVbml0cworCisJfSAvLyBTdGFuZGFyZFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyCit9IC8vIFN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC93aXphcmRzL3BvcHVsYXRpb25tb2RlbHdpemFyZG1lc3NhZ2VzLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcG9wdWxhdGlvbm1vZGVscy9zdGFuZGFyZC93aXphcmRzL3BvcHVsYXRpb25tb2RlbHdpemFyZG1lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU5ODI3YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wb3B1bGF0aW9ubW9kZWxzL3N0YW5kYXJkL3dpemFyZHMvcG9wdWxhdGlvbm1vZGVsd2l6YXJkbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDEyOCBAQAorIyBkaXNlYXNld2l6YXJkbWVzc2FnZXMucHJvcGVydGllcworIworIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjIE5ldyBEaXNlYXNlIFdpemFyZAorCitOUG9wdWxhdGlvbk1vZGVsV2l6LndpemFyZF90aXRsZSA9IE5ldyBQb3B1bGF0aW9uIE1vZGVsCitOUG9wdWxhdGlvbk1vZGVsV2l6LnBhZ2VfdGl0bGUgPSBDcmVhdGUgYSBuZXcgcG9wdWxhdGlvbiBtb2RlbAorTlBvcHVsYXRpb25Nb2RlbFdpei5wYWdlX2Rlc2NyaXB0aW9uID0gRGVmaW5lIGEgbmV3IHBvcHVsYXRpb24gbW9kZWwgaW4gYSBwcm9qZWN0CisKK05Qb3B1bGF0aW9uSW5pdGlhbGl6ZXJXaXoud2l6YXJkX3RpdGxlID0gTmV3IFBvcHVsYXRpb24gSW5pdGlhbGl6ZXIKK05Qb3B1bGF0aW9uSW5pdGlhbGl6ZXJXaXoucGFnZV90aXRsZSA9IENyZWF0ZSBhIG5ldyBwb3B1bGF0aW9uIGluaXRpYWxpemVyCitOUG9wdWxhdGlvbkluaXRpYWxpemVyV2l6LnBhZ2VfZGVzY3JpcHRpb24gPSAgRGVmaW5lIGEgbmV3IHBvcHVsYXRpb24gaW5pdGlhbGl6ZXIgaW4gYSBwcm9qZWN0CisKK05Qb3B1bGF0aW9uV2l6LkRDX0RFU0NSSVBUSU9OID0gU3RhbmRhcmQgUG9wdWxhdGlvbiBNb2RlbCB7MH0KK05Qb3B1bGF0aW9uSW5pdGlhbGl6ZXJXaXouRENfREVTQ1JJUFRJT04gPSBTdGFuZGFyZCBQb3B1bGF0aW9uIEluaXRpYWxpemVyIHswfQorCitQTVRQX0RlZiA9ICpQTS9UUCA9IFBvcHVsYXRpb24gTWVtYmVyL1RpbWUgUGVyaW9kCisKK2RlYXRoUmF0ZSA9IEJhY2tncm91bmQgTW9ydGFsaXR5IFJhdGUgKFx1MDNiYykKK2RlYXRoUmF0ZVRUID0gVGhlIHJhdGUgYXQgd2hpY2ggcG9wdWxhdGlvbiBtZW1iZXJzIGRpZSBmcm9tIGNhdXNlcyBvdGhlciB0aGFuIHRoZSBkaXNlYXNlLgorZGVhdGhSYXRlVU5JVCA9IFBNL1RQKgorCitiaXJ0aFJhdGUgPSBCYWNrZ3JvdW5kIEJpcnRoIFJhdGUKK2JpcnRoUmF0ZVRUID0gVGhlIHJhdGUgYXQgd2hpY2ggcG9wdWxhdGlvbiBtZW1iZXJzIGFyZSBib3JuLgorYmlydGhSYXRlVU5JVCA9IFBNL1RQKgorCitwb3B1bGF0aW9uSWRlbnRpZmllciA9IFBvcHVsYXRpb24KK3BvcHVsYXRpb25JZGVudGlmaWVyVFQgPSBUaGUgbmFtZSBvZiB0aGUgcG9wdWxhdGlvbiBpbmZlY3RlZCBieSB0aGlzIGRpc2Vhc2UuIChlLmcuLCBodW1hbikKK3BvcHVsYXRpb25JZGVudGlmaWVyVU5JVCA9IAorCit0aW1lUGVyaW9kID0gVGltZSBQZXJpb2QgKFRQKQordGltZVBlcmlvZFRUID0gVGhlIHRpbWUgcGVyaW9kIGZvciB0aGUgcmF0ZXMgKGUuZy4sIDg2NDAwMDAwbXMgPSAxIGRheSkuCit0aW1lUGVyaW9kVU5JVCA9IG1zCisKK25hbWUgPSBNb2RlbCBuYW1lCituYW1lVFQgPSBTcGVjaWZ5IGEgbmFtZSBmb3IgdGhlIHBvcHVsYXRpb24gbW9kZWwKK25hbWVVTklUID0gCisKK2dhaW4gPSBSYW5kb20gbm9pc2UgZ2FpbgorZ2FpblRUID0gU3BlY2lmeSB0aGUgcmFuZG9tIG5vaXNlIGdhaW4gZm9yIHRoZSBwb3B1bGF0aW9uIG1vZGVsCitnYWluVU5JVCA9IAorCittb2R1bGF0aW9uQW1wbGl0dWRlID0gRnJhY3Rpb24gb2YgYmFzZSBCaXJ0aC9EZWF0aCByYXRlcyB0byBtb2R1bGF0ZSAoMC4wLT4xLjApCittb2R1bGF0aW9uQW1wbGl0dWRlVFQgPSBTcGVjaWZ5IHRoZSBzZWFzb25hbCBtb2R1bGF0aW9uIGFtcGxpdHVkZQorbW9kdWxhdGlvbkFtcGxpdHVkZVVOSVQgPSAKKworcGhhc2UgPSBQaGFzZQorcGhhc2VUVCA9IFNwZWNpZnkgdGhlIHNlYXNvbmFsIHBoYXNlICgwLT4ycGkpCitwaGFzZVVOSVQgPSAKKworcGVyaW9kID0gU2Vhb25hbCBQZXJpb2QKK3BlcmlvZFRUID0gU3BlY2lmeSB0aGUgc2Vhc29uYWwgcGVyaW9kCitwZXJpb2RVTklUID0gW3RpbWVdIAorCit1c2VMYXRpdHVkZSA9IHVzZSBsYXRpdHVkZQordXNlTGF0aXR1ZGUgPSB1c2UgbGF0aXR1ZGUgZnVuY3Rpb24/Cit1c2VMYXRpdHVkZVVOSVQgPSAKKworTkRpeldpekVycjA9TWlzc2luZyBQb3B1bGF0aW9uIElkZW50aWZpZXIKK05EaXpXaXpFcnI0PU1pc3NpbmcgQmFja2dyb3VuZCBNb3J0YWxpdHkgUmF0ZS4KK05EaXpXaXpFcnI1PUJhY2tncm91bmQgbW9ydGFsaXR5IHJhdGUgaXMgaW52YWxpZC4KK05EaXpXaXpFcnI2PU1pc3NpbmcgQmFja2dyb3VuZCBCaXJ0aCBSYXRlLgorTkRpeldpekVycjc9QmFja2dyb3VuZCBiaXJ0aCByYXRlIGlzIGludmFsaWQuCitORGl6V2l6RXJyOD1NaXNzaW5nIFRpbWUgUGVyaW9kCitORGl6V2l6RXJyOT1UaW1lIHBlcmlvZCBpcyBpbnZhbGlkCitORGl6V2l6RXJyMTA9R2FpbiBpcyBpbnZhbGlkCitORGl6V2l6RXJyMTE9VGhlIGdyb3VwIGZyYWN0aW9ucyBhZGQgdXAgdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gMS4KK05EaXpXaXpFcnIxMj1NaXNzaW5nIGdyb3VwIGlkCitORGl6V2l6RXJyMTM9SW52YWxpZCBmcmFjdGlvbgorIAorTkRpeldpekVycjE1PU1pc3NpbmcgcG9wdWxhdGlvbiBpZGVudGlmaWVyCitORGl6V2l6RXJyMTY9TWlzc2luZyBpbmRpdmlkdWFscyBjb3VudAorTkRpeldpekVycjE3PUludmFsaWQgaW5kaXZpZHVhbCBjb3VudC4gTXVzdCBiZSBncmVhdGVyIHRoYW4gMAorCitORGl6V2l6RXJyMTg9TW9kdWxhdGlvbiBBbXBsaXR1ZGUgaXMgSW52YWxpZAorTkRpeldpekVycjE5PVBoYXNlIGlzIEludmFsaWQKKyAKK0RNUEMxPVBvcHVsYXRpb24gTW9kZWwgUHJvcGVydHkgQ29udHJvbAorRE1QQzI9TWlzc2luZyBQb3B1bGF0aW9uIFByb3BlcnR5IEVkaXRvciBmb3IgIgorRE1QQzM9UG9wdWxhdGlvbiBJbml0aWFsaXplciBQcm9wZXJ0eSBDb250cm9sCitETVBDND1NaXNzaW5nIFBvcHVsYXRpb24gSW5pdGlhbGl6ZXIgUHJvcGVydHkgRWRpdG9yIGZvciAiCisKK0REQy4wPVBvcHVsYXRpb24gTW9kZWw6CitEREMuMT1VbmRlcmx5aW5nIE1hdGhlbWF0aWNhbCBQb3B1bGF0aW9uIE1vZGVsCitEREMuMj1jbGFzcworRERDLjM9UHJvYmxlbSBjcmVhdGluZyBQb3B1bGF0aW9uIE1vZGVsIGluc3RhbmNlCitEREMuND1Qcm9ibGVtIGNyZWF0aW5nIFBvcHVsYXRpb24gSW5pdGlhbGl6ZXIgaW5zdGFuY2UKK0REQy41PVBvcHVsYXRpb24gSW5pdGlhbGl6ZXI6CisKKyMgUHJlZmVyZW5jZXMKK1BvcHVsYXRpb25QUGFnZVRJVExFPVBvcHVsYXRpb24gTW9kZWxpbmcKK1JlZmVyZW5jZVBvcHVsYXRpb249UmVmZXJlbmNlIHBvcHVsYXRpb24gKGluZGl2aWR1YWxzKQorUmVmZXJlbmNlRGVuc2l0eT1SZWZlcmVuY2UgcG9wdWxhdGlvbiBkZW5zaXR5IChpbmRpdmlkdWFscy9zcSBrbSkKKworI1BvcHVsYXRpb24gZ3JvdXBzCithZGRHcm91cD0rCithZGRHcm91cFRUPUFkZCBhIG5ldyBwb3B1bGF0aW9uIGdyb3VwCisKK3JlbW92ZUdyb3VwPS0KK3JlbW92ZUdyb3VwVFQ9UmVtb3ZlIHBvcHVsYXRpb24gZ3JvdXAKKworcG9wdWxhdGlvbklkID0gSWRlbnRpZmllcgorcG9wdWxhdGlvbklkRnJhY3Rpb24gPSBGcmFjdGlvbgorCitOUG9wV2l6SVNPSyA9IExvY2F0aW9uIElTTyBLZXkKK05Qb3BXaXpQaWNrTG9jID0gUGljayBMb2NhdGlvbgorTlBvcFdpelBpY2tMb2NUaXRsZSA9IFBpY2sgTG9jYXRpb24KKworaW5kaXZpZHVhbHMgPSBJbmRpdmlkdWFscworaW5kaXZpZHVhbHNUVCA9IE51bWJlciBvZiBpbmRpdmlkdWFscworaW5kaXZpZHVhbHNVTklUPSBDb3VudCBvciBDb3VudCAvIGttXjIKKwordXNlRGVuc2l0eSA9IFVzZSBkZW5zaXR5Cit1c2VEZW5zaXR5VFQgPSBVc2UgaW5kaXZpZHVhbHMgcGVyIHNxdWFyZSBraWxvbWV0ZXIKK3VzZURlbnNpdHlVTklUID0gCisKK1lFUyA9IFllcworTk8gPSBObwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL3BvcHVsYXRpb25tb2RlbC9Qb3B1bGF0aW9uTW9kZWxWaWV3LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvcG9wdWxhdGlvbm1vZGVsL1BvcHVsYXRpb25Nb2RlbFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjk3ZTZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5wb3B1bGF0aW9ubW9kZWxzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL3BvcHVsYXRpb25tb2RlbC9Qb3B1bGF0aW9uTW9kZWxWaWV3LmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8vIFBvcHVsYXRpb25Nb2RlbFZpZXcuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnBvcHVsYXRpb25tb2RlbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLklkZW50aWZpYWJsZURlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSWRlbnRpZmlhYmxlUGx1Z2luVmlldzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CisKKy8qKgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgdmlldyBvZiB0aGUgcGx1Z2dlZCBpbiBwb3B1bGFpdG9uIG1vZGVsLgorICovCitwdWJsaWMgY2xhc3MgUG9wdWxhdGlvbk1vZGVsVmlldyBleHRlbmRzIElkZW50aWZpYWJsZVBsdWdpblZpZXcgeworCisJLyoqCisJICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIFNlcXVlbmNlcnMgVmlldworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1BPUFVMQVRJT05fTU9ERUxfVklFVyA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnBvcHVsYXRpb25tb2RlbHMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisJICovCisJcHVibGljIFBvcHVsYXRpb25Nb2RlbFZpZXcoKSB7CisJCXN1cGVyKCk7CisJfSAvLyBQb3B1bGF0aW9uVmlldworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLkV4ZWN1dGFibGVQbHVnaW5WaWV3I2dldElucHV0KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSWRlbnRpZmlhYmxlVmlld01vZGVsIGdldElucHV0KCkgeworCQlyZXR1cm4gUG9wdWxhdGlvblZpZXdNb2RlbC5nZXRNb2RlbCgpOworCX0gLy8gZ2V0SW5wdXQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5JZGVudGlmaWFibGVQbHVnaW5WaWV3I2dldElkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlciBnZXRJZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIoKSB7CisJCXJldHVybiBuZXcgUG9wdWxhdGlvblZpZXdUcmVlQ29udGVudFByb3ZpZGVyKCk7CisJfSAvLyBnZXRJZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgdGhlIG1vZGVsIG9mIHRoZSBwbHVnZ2VkIGluIDxjb2RlPlBvcHVsYXRpb25Nb2RlbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFBvcHVsYXRpb25WaWV3TW9kZWwgZXh0ZW5kcyBJZGVudGlmaWFibGVWaWV3TW9kZWwgeworCisJCXByaXZhdGUgc3RhdGljIFBvcHVsYXRpb25WaWV3TW9kZWwgbW9kZWwgPSBudWxsOworCisJCS8qKgorCQkgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnRJRAorCQkgKi8KKwkJcHJpdmF0ZSBQb3B1bGF0aW9uVmlld01vZGVsKFN0cmluZyBleHRlbnNpb25Qb2ludElEKSB7CisJCQlzdXBlcihleHRlbnNpb25Qb2ludElEKTsKKwkJfSAvLyBQb3B1bGF0aW9uTW9kZWxWaWV3TW9kZWwKKworCQkvKioKKwkJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBtb2RlbAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBQb3B1bGF0aW9uVmlld01vZGVsIGdldE1vZGVsKCkgeworCQkJLy8gRG8gd2UgbmVlZCB0byBtYWtlIHRoZSBtb2RlbD8KKwkJCWlmIChtb2RlbCA9PSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJbW9kZWwgPSBuZXcgUG9wdWxhdGlvblZpZXdNb2RlbCgKKwkJCQkJCUNvbnN0YW50cy5JRF9QT1BVTEFUSU9OX01PREVMX0VYVEVOU0lPTl9QT0lOVCk7CisJCQl9CisJCQlyZXR1cm4gbW9kZWw7CisJCX0gLy8gZ2V0TW9kZWwKKworCX0gLy8gUG9wdWxhaXRvblZpZXdNb2RlbAorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyB0aGUgY29udGVudCBwcm92aWRlciBvZiB0aGUgcG9wdWxhdGlvbiB2aWV3LgorCSAqLworCXByaXZhdGUgc3RhdGljIGNsYXNzIFBvcHVsYXRpb25WaWV3VHJlZUNvbnRlbnRQcm92aWRlciBleHRlbmRzCisJCQlJZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIgeworCisJCS8vIFRoaXMgaXMgdGhlIGltYWdlIHVzZWQgdG8gcmVwcmVzZW50IHBvcHVsYXRpb24gbW9kZWxzIGluIHRoZSBwb3B1bGF0aW9uIHZpZXcKKwkJc3RhdGljIEltYWdlRGVzY3JpcHRvciBwb3B1bGF0aW9uSWNvbiA9IG51bGw7CisKKwkJLy8gSWYgdHJ1ZSB0aGVuIHdlJ3ZlIG5ldmVyIHRyaWVkIHRvIGdldCB0aGUgaWNvbgorCQlzdGF0aWMgYm9vbGVhbiBwb3B1bGF0aW9uSWNvbkZpcnN0VGltZSA9IHRydWU7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5JZGVudGlmaWFibGVQbHVnaW5WaWV3LklkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7CisJCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBJZGVudGlmaWFibGVEZWxlZ2F0ZSkgPyBnZXRQb3B1bGF0aW9uSWNvbigpCisJCQkJCTogc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7CisJCX0gLy8gZ2V0SW1hZ2UKKworCQkvKioKKwkJICogQHJldHVybiB0aGUgaWNvbiB0byBiZSB1c2VkIHRvIHJlcHJlc2VudCBwb3B1bGF0aW9uIG1vZGVscywgb3IgbnVsbCBpZiBpdAorCQkgKiAgICAgICAgIGNhbid0IGJlIGxvYWRlZC4KKwkJICovCisJCXByaXZhdGUgSW1hZ2UgZ2V0UG9wdWxhdGlvbkljb24oKSB7CisJCQkvLyBTaG91bGQgd2UgdHJ5IHRvIGxvYWQgdGhlIGljb24/CisJCQlpZiAocG9wdWxhdGlvbkljb25GaXJzdFRpbWUgJiYgcG9wdWxhdGlvbkljb24gPT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCXBvcHVsYXRpb25JY29uRmlyc3RUaW1lID0gZmFsc2U7CisJCQkJcG9wdWxhdGlvbkljb24gPSAKKwkJCQlBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCisJCQkJCSJvcmcuZWNsaXBzZS5zdGVtLnVpLnBvcHVsYXRpb25tb2RlbHMiCSwgImljb25zL2Z1bGwvY3VzdG9tMTYvIiArICJwb3B1bGF0aW9ubW9kZWwuZ2lmIik7CisJCQl9IC8vIGlmIHdlIHNob3VsZCBsb2FkIHRoZSBpY29uCisJCQlyZXR1cm4gcG9wdWxhdGlvbkljb24uY3JlYXRlSW1hZ2UoKTsKKwkJfSAvLyBnZXRQb3B1bGF0aW9uSWNvbgorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSWRlbnRpZmlhYmxlUGx1Z2luVmlldy5JZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJCXN1cGVyLmRpc3Bvc2UoKTsKKwkJCS8vIFRPRE8gZGlzcG9zZSBvZiB0aGUgaW1hZ2UKKwkJfQorCisJfSAvLyBQb3B1bGF0aW9uTW9kZWxWaWV3VHJlZUNvbnRlbnRQcm92aWRlcgorfSAvLyBQb3B1bGF0aW9uVmlldwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLy5jZHRwcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLy5jZHRwcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMmVhODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvLmNkdHByb2plY3QKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlLWNkdCB2ZXJzaW9uPSIyLjAiPz4KKworPGNkdHByb2plY3QvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRlODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy8uY3Byb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvLmNwcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MTljNTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvLmNwcm9qZWN0CkBAIC0wLDAgKzEsMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2ZpbGVWZXJzaW9uIDQuMC4wPz4KKworPGNwcm9qZWN0PgorPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnNldHRpbmdzIj4KKzxjY29uZmlndXJhdGlvbiBpZD0iY29udmVydGVkLmNvbmZpZy45MDc4NDUyNjQiPgorPHN0b3JhZ2VNb2R1bGUgYnVpbGRTeXN0ZW1JZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZGVmYXVsdENvbmZpZ0RhdGFQcm92aWRlciIgaWQ9ImNvbnZlcnRlZC5jb25maWcuOTA3ODQ1MjY0IiBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiIG5hbWU9ImNvbnZlcnRlZENvbmZpZyI+Cis8ZXh0ZXJuYWxTZXR0aW5ncy8+Cis8ZXh0ZW5zaW9ucy8+Cis8L3N0b3JhZ2VNb2R1bGU+Cis8L2Njb25maWd1cmF0aW9uPgorPC9zdG9yYWdlTW9kdWxlPgorPC9jcHJvamVjdD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy8ucHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTQ4NDY5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0czwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTJhZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDc0IEBACisjTW9uIEphbiAyMSAxMjo1MzowNSBFU1QgMjAwOAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjOTQ4NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0wLDAgKzEsNTAgQEAKKyNUaHUgTm92IDAxIDE0OjUwOjUzIEVEVCAyMDA3CitjbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9dHJ1ZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQorY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKK2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQorY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQorY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKK2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQorY2xlYW51cC51c2VfYmxvY2tzPXRydWUKK2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitjbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXBfcHJvZmlsZT1fY2xlYW51cAorY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFkNWJiNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDIwIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLkFjdGl2YXRvcgorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuYmlydC5jaGFydC5lbmdpbmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5lbmdpbmUuZXh0ZW5zaW9uLAorIG9yZy5lY2xpcHNlLmJpcnQuY29yZS51aSwKKyBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmRldmljZS5zd3QsCisgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucywKKyBvcmcuZWNsaXBzZS5zdGVtLnVpLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscywKKyBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLAorIG9yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy52aWV3cworQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1N2JhMTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDkgQEAKK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCitiaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICAuLFwKKyAgICAgICAgICAgICAgIGljb25zLyxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICBub3RpY2UuaHRtbCxcCisgICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNGIxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvZXBsLXYxMC5odG1sCkBAIC0wLDAgKzEsMzI4IEBACis8aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCit4bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoreG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgorPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgorPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Cis8bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Cis8bGluayByZWw9RmlsZS1MaXN0CitocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KKzx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgorPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+CisgPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgorICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgorICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+CisgIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KKyAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KKyAgPG86UGFnZXM+NDwvbzpQYWdlcz4KKyAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KKyAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+CisgICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KKyAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgorICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KKyAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KKyA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgorPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+CisgPHc6V29yZERvY3VtZW50PgorICA8dzpUcmFja1JldmlzaW9ucy8+CisgPC93OldvcmREb2N1bWVudD4KKzwveG1sPjwhW2VuZGlmXS0tPgorPHN0eWxlPgorPCEtLQorIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KK0Bmb250LWZhY2UKKwl7Zm9udC1mYW1pbHk6VGFob21hOworCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OworCW1zby1mb250LWNoYXJzZXQ6MDsKKwltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKKwltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKKwltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KKyAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLworcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAorCXttc28tc3R5bGUtcGFyZW50OiIiOworCW1hcmdpbjowaW47CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AKKwl7bWFyZ2luLXJpZ2h0OjBpbjsKKwltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKKwltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKKwltYXJnaW4tbGVmdDowaW47CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAorCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjguMHB0OworCWZvbnQtZmFtaWx5OlRhaG9tYTsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitAcGFnZSBTZWN0aW9uMQorCXtzaXplOjguNWluIDExLjBpbjsKKwltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKKwltc28taGVhZGVyLW1hcmdpbjouNWluOworCW1zby1mb290ZXItbWFyZ2luOi41aW47CisJbXNvLXBhcGVyLXNvdXJjZTowO30KK2Rpdi5TZWN0aW9uMQorCXtwYWdlOlNlY3Rpb24xO30KKy0tPgorPC9zdHlsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgorCis8ZGl2IGNsYXNzPVNlY3Rpb24xPgorCis8cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Cis8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKK1RIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCitSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKK09GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgorZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgorYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCitjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKK2FkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQorc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAorYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCitpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgorc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCitQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KK3dpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKK3dvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgorZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAorY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKK29yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCitkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobworcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQorU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKK2Egbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgorc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKK2Rpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCitDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKK2Zvcm0uPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKK1JlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCitwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0CithbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKK2NvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCitvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAorYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KK3RvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KK2FueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKK2xpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKK1JlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKK0NvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCit0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5CityaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKK2ZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKK2xpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Cit0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAoraWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQordGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQorZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCitFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAorcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgordGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KKzwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2l0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQoraXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCitlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCitjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCithbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQorYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKK2VmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCitpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCithcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKK3N0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKK0NvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKK3N0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKK2luZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKK2NvZGUgZm9ybTo8L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2l0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCitjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Citjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKK29yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCitzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5CithY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCithbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQorb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCitsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQorUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAorQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKK0NvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAorY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgorbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KK3RoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KK2Nvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0CitvZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKK3JlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgordG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgordG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKK2FueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCitpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQorUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQorQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKK2NsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKK3dhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCitzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKK290aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKK2NvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAorV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKK3Jlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCitQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCitBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCitjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgorZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKK0FHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKK05FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCitUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCitUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAorb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKK2VuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAorZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKK21pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCithZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCithbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCitvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKK1JlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKK3N1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKK3NoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCitjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKK3BlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCityaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCitSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKK1JlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCitjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKK2NvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAorU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCit0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwordGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAorQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KK3NlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgorb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KKyhpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKK2luIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KK3RoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCitleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90CitleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKK1N0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKK0FtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcworQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcworaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+CisKKzwvZGl2PgorCis8L2JvZHk+CisKKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvaWNvbnMvc2FtcGxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9pY29ucy9zYW1wbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZmIzYzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvaWNvbnMvc2FtcGxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvbm90aWNlLmh0bWwgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvbm90aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhZjk2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9ub3RpY2UuaHRtbApAQCAtMCwwICsxLDc5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Cis8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPk1hcmNoIDE3LCAyMDA1PC9wPgorCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisKKzxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKyAgIAorPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAorICAgCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKKyAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorICAgCis8dWw+CisJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKzwvdWw+ICAgCisgCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKworPHVsPgorCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKwkJCis8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCitpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KK3RoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KKwk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCisJPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKwk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCis8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKworPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKyAgIAorPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2MzAyYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDE4IEBACisjLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworcGx1Z2luTmFtZSA9IFNURU0gQ2hhcnRzIGFuZCBSZXBvcnRzIFVJCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZworCitUU19WaWV3ID0gVGltZSBTZXJpZXMKK1BTX1ZpZXcgPSBQaGFzZSBTcGFjZQorQVNfVmlldyA9IEFnZ3JlZ2F0ZSBUaW1lIFNlcmllcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNmZjNmMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsNjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Cis8cGx1Z2luPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuU1RFTVBlcnNwZWN0aXZlIgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcyI+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KKyAgICAgIDx2aWV3CisgICAgICAgICAgICBhbGxvd011bHRpcGxlPSJ0cnVlIgorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzLlRpbWVTZXJpZXNWaWV3IgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvc2FtcGxlLmdpZiIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnJlcG9ydHMiCisgICAgICAgICAgICBuYW1lPSIlVFNfVmlldyI+CisgICAgICAgICBSZXBvcnRzCisgICAgICA8L3ZpZXc+CisgICAgICA8dmlldworICAgICAgICAgICAgYWxsb3dNdWx0aXBsZT0idHJ1ZSIKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy52aWV3cy5QaGFzZVNwYWNlVmlldyIKKyAgICAgICAgICAgIGljb249Imljb25zL3NhbXBsZS5naWYiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5yZXBvcnRzLnBoYXNlU3BhY2UiCisgICAgICAgICAgICBuYW1lPSIlUFNfVmlldyI+CisgICAgICA8L3ZpZXc+CisgICAgICA8dmlldworICAgICAgCQlhbGxvd011bHRpcGxlPSJ0cnVlIgorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzLkFnZ3JlZ2F0ZVRpbWVTZXJpZXNWaWV3IgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvc2FtcGxlLmdpZiIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnJlcG9ydHMuYWdncmVnYXRlIgorICAgICAgICAgICAgbmFtZT0iJUFTX1ZpZXciPgorICAgICAgPC92aWV3PgorICAgPC9leHRlbnNpb24+CisgICAKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgorCQk8dmlld2VyQ29udHJpYnV0aW9uCisgICAgICAgIAlpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzIgorICAgICAgICAJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuY29udGV4dCI+CisJICAgIAk8YWN0aW9uIAorCQkgICAgCWlkPSJUaW1lU2VyaWVzIgorCQkgICAgCXN0YXRlPSJ0cnVlIgorCSAgICAgICAJCWxhYmVsPSIlVFNfVmlldyIJICAgICAgIAkJCisJICAgICAgIAkJbWVudWJhclBhdGg9InJlcG9ydHMvYWRkaXRpb25zIgorCSAgICAgICAJCWNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMudmlld3MuUmVwb3J0c0NvbnRleHRNZW51QWN0aW9uIj4JCisJICAgIAk8L2FjdGlvbj4KKwkgICAgCTxhY3Rpb24gCisJCSAgICAJaWQ9IlBoYXNlU3BhY2UiCisJCSAgICAJc3RhdGU9InRydWUiCisJICAgICAgIAkJbGFiZWw9IiVQU19WaWV3IgorCSAgICAgICAJCW1lbnViYXJQYXRoPSJyZXBvcnRzL2FkZGl0aW9ucyIKKwkgICAgICAgCQljbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzLlJlcG9ydHNDb250ZXh0TWVudUFjdGlvbiI+CQorCSAgICAJPC9hY3Rpb24+CisJICAgIAk8YWN0aW9uIAorCQkgICAgCWlkPSJBZ2dyZWdhdGVUaW1lU2VyaWVzIgorCQkgICAgCXN0YXRlPSJ0cnVlIgorCSAgICAgICAJCWxhYmVsPSIlQVNfVmlldyIKKwkgICAgICAgCQltZW51YmFyUGF0aD0icmVwb3J0cy9hZGRpdGlvbnMiCisJICAgICAgIAkJY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy52aWV3cy5SZXBvcnRzQ29udGV4dE1lbnVBY3Rpb24iPgkKKwkgICAgCTwvYWN0aW9uPgorICAgICAgIDwvdmlld2VyQ29udHJpYnV0aW9uPgorICA8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy9BY3RpdmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL0FjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjQxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy9BY3RpdmF0b3IuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CisKKy8qKgorICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKKworCS8qKgorCSAqIFRoZSBwbHVnLWluIElECisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cyI7IC8vJE5PTi1OTFMtMSQKKworCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKKwlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOworCisJLyoqCisJICogVGhlIGNvbnN0cnVjdG9yCisJICovCisJcHVibGljIEFjdGl2YXRvcigpIHsKKwkJcGx1Z2luID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXBsdWdpbiA9IG51bGw7CisJCXN1cGVyLnN0b3AoY29udGV4dCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCisJICogCisJICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbiBwbHVnLWluCisJICogcmVsYXRpdmUgcGF0aAorCSAqIAorCSAqIEBwYXJhbSBwYXRoCisJICogICAgICAgICAgICB0aGUgcGF0aAorCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKKwkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBwYXRoKTsKKwl9CisKKwkvKioKKwkgKiBMb2cgYW4gZXJyb3IgdG8gdGhlIElMb2cgZm9yIHRoaXMgcGx1Z2luCisJICogCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiAgICAgICAgICAgIHRoZSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB0ZXh0CisJICogQHBhcmFtIGV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgdGhlIGFzc29jaWF0ZWQgZXhjZXB0aW9uLCBvciBudWxsCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisJCS8vIERvIHdlIGhhdmUgYSBwbHVnaW4/CisJCWlmIChwbHVnaW4gIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlwbHVnaW4uZ2V0TG9nKCkubG9nKAorCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbi5nZXRCdW5kbGUoKQorCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7CisJCX0gZWxzZSB7CisJCQkvLyBObworCQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOworCQkJLy8gRXhjZXB0aW9uPworCQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJU3lzdGVtLm91dC5wcmludGxuKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworCQkJfSAvLyBpZgorCQl9CisJfSAvLyBsb2dFcnJvcgorCisJLyoqCisJICogTG9nIGluZm9ybWF0aW9uIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIGluZm9ybWF0aW9uIG1lc3NhZ2UgdGV4dAorCSAqIEBwYXJhbSBleGNlcHRpb24KKwkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dJbmZvcm1hdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQkvLyBEbyB3ZSBoYXZlIGEgcGx1Z2luPworCQlpZiAocGx1Z2luICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJcGx1Z2luLmdldExvZygpLmxvZygKKwkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIHBsdWdpbi5nZXRCdW5kbGUoKQorCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7CisJCX0gZWxzZSB7CisJCQkvLyBObworCQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOworCQkJLy8gRXhjZXB0aW9uPworCQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJU3lzdGVtLm91dC5wcmludGxuKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworCQkJfSAvLyBpZgorCQl9CisJfSAvLyBsb2dJbmZvcm1hdGlvbgorfSAvLyBBY3RpdmF0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL01vbml0b3JQcmVmZXJlbmNlcy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvTW9uaXRvclByZWZlcmVuY2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5MjVhYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL01vbml0b3JQcmVmZXJlbmNlcy5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBNb25pdG9yUHJlZmVyZW5jZXMgeworCisJUGx1Z2luIHBsdWdpbiA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCk7CisKKwkvKioKKwkgKiB0aGUgdXNlcnMgcHJlZmVyZW5jZXMKKwkgKi8KKwlQcmVmZXJlbmNlcyBwcmVmcyA9IHBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCisJLyoqCisJICogVGhpcyBpcyBhIGxpc3Qgb2YgbG9jYXRpb24gSURzIGZyb20gdGhlIHVzZXIgcnVudGltZSBwcmVmZXJlbmNlcyB0aGF0CisJICogcmVtZW1iZXIgd2hhdCBsb2NhdGlvbnMgdGhlIHVzZXIgd2FudHMgdG8gbW9uaXRvci4gSWYgbm8gcHJlZmVyZW5jZXMKKwkgKiBleGlzdCBpdCB3aWxsIGNyZWF0ZSBvbmUgZm9yIHRoZSBhZ2dyZWdhdGVkIGRhdGEgYXQgdGhlIHdvcmxkIGxldmVsCisJICovCisJcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtb25pdG9yTG9jYXRpb25QcmVmZXJlbmNlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworCS8qKgorCSAqIHRoZSBJRCBvZiB0aGUgZGVmYXVsdCBsb2NhdGlvbiB0aGUgbG9jYXRpb24gSUQgZm9yIHRoZSBhZ2dyZWdhdGVkIGRhdGEgYXQKKwkgKiB0aGUgd29ybGQgbGV2ZWwKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MT0NBVElPTl9JRCA9ICJzdGVtOi8vb3JnLmVjbGlwc2Uuc3RlbS9ub2RlL2dlby9yZWdpb24vWlpaIjsKKworCS8qKgorCSAqIFByZWZpeCB0byBhbGwgbm9kZSBVUkkncworCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfUFJFRklYID0gInN0ZW06Ly9vcmcuZWNsaXBzZS5zdGVtL25vZGUvZ2VvL3JlZ2lvbi8iOworCisJLyoqCisJICogYW55IHByZWZlcmVuY2UgbG9jYXRpb24ga2V5IG11c3QgY29udGFpbiB0aGlzIHN1YnN0cmluZworCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9LRVlfU1VCU1RSSU5HID0gImxvY2F0aW9uLiI7CisKKwkvKioKKwkgKiB0aGUga2V5IHRvIHRoZSBkZWZhdWx0IGxvY2F0aW9uIHNob3VsZCBhbHdheXMgYmUgZGVmaW5lZCBhbmQgc2hvdWxkIHBvaW50CisJICogdG8gdGhlIGxvY2F0aW9uIElEIGZvciB0aGUgYWdncmVnYXRlZCBkYXRhIGF0IHRoZSB3b3JsZCBsZXZlbAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xPQ0FUSU9OX0tFWSA9ICJkZWZhdWx0LmxvY2F0aW9uSUQiOworCisJLyoqCisJICogVGhlIGtleSB0byB0aGUgcmVmZXJlbmNlIGZpbGUgbmFtZSBmb3IgdGhlIGFnZ3JlZ2F0ZSB2aWV3IHJlcG9ydAorCSAqLworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRV9GSUxFX0tFWSA9ICJyZWZlcmVuY2UuZmlsZSI7CisJCisJLyoqCisJICogCisJICovCisJcHVibGljIE1vbml0b3JQcmVmZXJlbmNlcygpIHsKKworCQlpZiAocHJlZnMuY29udGFpbnMoREVGQVVMVF9MT0NBVElPTl9LRVkpKSB7CisJCQlTdHJpbmcgdXJpID0gcHJlZnMuZ2V0U3RyaW5nKERFRkFVTFRfTE9DQVRJT05fS0VZKTsKKwkJCWlmICh1cmkgIT0gREVGQVVMVF9MT0NBVElPTl9JRCkgeworCQkJCXNldERlZmF1bHRMb2NhdGlvbigpOworCQkJfSBlbHNlIHsKKwkJCQltb25pdG9yTG9jYXRpb25QcmVmZXJlbmNlcy5hZGQodXJpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIHNldCB0aGUgZGVmYXVsdCBJRAorCQkJc2V0RGVmYXVsdExvY2F0aW9uKCk7CisJCX0KKworCQkvLyBub3cgY2hlY2sgdGhlIG90aGVyIFVSSSdzCisJCVN0cmluZ1tdIGFsbEtleXMgPSBwcmVmcy5wcm9wZXJ0eU5hbWVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsS2V5cy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGFsbEtleXNbaV0uY29udGFpbnMoTE9DQVRJT05fS0VZX1NVQlNUUklORykKKwkJCQkJfHwgYWxsS2V5c1tpXS5jb250YWlucyhERUZBVUxUX0xPQ0FUSU9OX0tFWSkpIHsKKwkJCQlTdHJpbmcgbmV4dElEID0gcHJlZnMuZ2V0U3RyaW5nKGFsbEtleXNbaV0pOworCQkJCW1vbml0b3JMb2NhdGlvblByZWZlcmVuY2VzLmFkZChuZXh0SUQpOworCQkJfQorCQl9IC8vIGZvciBhbGwga2V5cworCisJfSAvLyBjb25zdHJ1Y3RvcgorCisJLyoqCisJICogCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdExvY2F0aW9uKCkgeworCQlwcmVmcy5zZXRWYWx1ZShERUZBVUxUX0xPQ0FUSU9OX0tFWSwgREVGQVVMVF9MT0NBVElPTl9JRCk7CisJCW1vbml0b3JMb2NhdGlvblByZWZlcmVuY2VzLmFkZChERUZBVUxUX0xPQ0FUSU9OX0lEKTsKKwkJcGx1Z2luLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOworCX0KKworCS8qKgorCSAqIAorCSAqIEByZXR1cm4gYSBzZXQgb2YgcHJlZmVycmVkIGxvY2F0aW9ucyB0byBtb25pdG9yCisJICovCisJcHVibGljIFNldDxTdHJpbmc+IGdldE1vbml0b3JMb2NhdGlvblByZWZlcmVuY2VzKCkgeworCQlyZXR1cm4gbW9uaXRvckxvY2F0aW9uUHJlZmVyZW5jZXM7CisJfQorCisJLyoqCisJICogQHBhcmFtIG1vbml0b3JMb2NhdGlvblByZWZlcmVuY2VzCisJICovCisJcHVibGljIHZvaWQgc2V0TW9uaXRvckxvY2F0aW9uUHJlZmVyZW5jZXMoCisJCQlTZXQ8U3RyaW5nPiBtb25pdG9yTG9jYXRpb25QcmVmZXJlbmNlcykgeworCQl0aGlzLm1vbml0b3JMb2NhdGlvblByZWZlcmVuY2VzID0gbW9uaXRvckxvY2F0aW9uUHJlZmVyZW5jZXM7CisJfQorCisJLyoqCisJICogQHBhcmFtIG5ld0lECisJICovCisJcHVibGljIHZvaWQgYWRkTG9jYXRpb25QcmVmKFN0cmluZyBuZXdJRCkgeworCQlpZiAocHJlZnMgIT0gbnVsbCkgeworCQkJLy8gaXMgaXQgcmVhbGx5IG5ldz8KKworCQkJaWYgKCFtb25pdG9yTG9jYXRpb25QcmVmZXJlbmNlcy5jb250YWlucyhuZXdJRCkpIHsKKwkJCQkvLyB3ZSB1c2UgdGhlIHVyaSBiZWluZyBhZGRlZCB0byBnZW5lcmF0ZSBhIHVuaXF1ZSBrZXkKKwkJCQkvLyBieSBjb25jYXRlbmF0aW5nICJsb2NhdGlvbi4iK25ld1VSSQorCQkJCS8vIHByZWZlcmVuY2VzIGtleXMgbXVzdCBiZSB1bmlxdWUKKwkJCQkvLyB0aGlzIGFsc28gZ3VhcmFudGVlcyB3ZSBuZXZlciBkdXBsaWNhdGUgdGhlIHNhbWUgbG9jYXRpb24KKwkJCQlwcmVmcy5zZXRWYWx1ZShMT0NBVElPTl9LRVlfU1VCU1RSSU5HICsgbmV3SUQsIG5ld0lEKTsKKwkJCQl0aGlzLm1vbml0b3JMb2NhdGlvblByZWZlcmVuY2VzLmFkZChuZXdJRCk7CisJCQkJcGx1Z2luLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOworCQkJfSAvLyBpdCBJRCBpcyByZWFsbHkgbmV3CisJCX0gLy8gaWYgcHJlZnMgbm90IG51bGwKKwl9IC8vIGFkZExvY2F0aW9uUHJlZgorCisJLyoqCisJICogQHBhcmFtIG9sZElECisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlTG9jYXRpb25QcmVmKFN0cmluZyBvbGRJRCkgeworCQlpZiAocHJlZnMgIT0gbnVsbCkgeworCQkJLy8gaXMgaXQgcmVhbGx5IG5ldz8KKwkJCWlmICghbW9uaXRvckxvY2F0aW9uUHJlZmVyZW5jZXMuY29udGFpbnMob2xkSUQpKQorCQkJCXRoaXMubW9uaXRvckxvY2F0aW9uUHJlZmVyZW5jZXMucmVtb3ZlKG9sZElEKTsKKworCQkJLy8gZG9lcyBub3Qgd29yay4gTm8gcmVtb3ZlIG1ldGhvZD8KKwkJCS8vIHByZWZzLnNldFRvRGVmYXVsdChvbGRJRCk7CisJCQkvLyBwcmVmcy5zZXRWYWx1ZShvbGRJRCwgIiIpOworCQkJcGx1Z2luLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOworCQl9IC8vIGlmIHByZWZzIG5vdCBudWxsCisJfSAvLyByZW1vdmVMb2NhdGlvblByZWYKKworCS8qKgorCSAqIHJlbW92ZXMgdGhlIHVyaSBwcmVmaXggZnJvbSBhbiBzdHJpbmcgSUQKKwkgKiAKKwkgKiBAcGFyYW0gdXJpCisJICogQHJldHVybiBVUklzdWZmaXggLSB0aGUgZ2VvZ3JhcGhpYyBjb2RlIHBhcnQgb2YgdGhlIHVyaQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVSSXN1ZmZpeChTdHJpbmcgdXJpKSB7CisJCVN0cmluZyByZXRWYWwgPSB1cmkucmVwbGFjZUFsbChVUklfUFJFRklYLCAiIik7CisJCXJldHVybiByZXRWYWw7CisJfS8vIGdldCB1cmkgc3VmZml4CisKKwkvKioKKwkgKiByZXR1cm5zIHRoZSBkZWZhdWx0IGxvY2F0aW9uIElEIGFzIGEgVVJJCisJICogCisJICogQHJldHVybiB0aGUgVVJJCisJICovCisJcHVibGljIHN0YXRpYyBVUkkgZ2V0RGVmYXVsdFVSSSgpIHsKKwkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoREVGQVVMVF9MT0NBVElPTl9JRCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvQWdncmVnYXRlRmlsZUluaXRpYWxpemF0aW9uRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9BZ2dyZWdhdGVGaWxlSW5pdGlhbGl6YXRpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmNhNzczCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvQWdncmVnYXRlRmlsZUluaXRpYWxpemF0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMudmlld3M7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBUaHJvd24gd2hlbiB3ZSBmYWlsIHRvIGxvYWQgYSBzY2VuYXJpbyBmb3IgYW55IHJlYXNvbgorICovCisKK3B1YmxpYyBjbGFzcyBBZ2dyZWdhdGVGaWxlSW5pdGlhbGl6YXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqLworCXB1YmxpYyBBZ2dyZWdhdGVGaWxlSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHtzdXBlcihtZXNzYWdlKTt9CisJCisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqIAorCSAqIEBwYXJhbSB0CisJICovCisJcHVibGljIEFnZ3JlZ2F0ZUZpbGVJbml0aWFsaXphdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgdCkge3N1cGVyKHQpO30KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvQWdncmVnYXRlUmVmZXJlbmNlRmlsZUxvYWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvQWdncmVnYXRlUmVmZXJlbmNlRmlsZUxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MTA1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9BZ2dyZWdhdGVSZWZlcmVuY2VGaWxlTG9hZGVyLmphdmEKQEAgLTAsMCArMSwzMTcgQEAKKy8qKgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLkFjdGl2YXRvcjsKKworCisvKioKKyAqIEBhdXRob3IgamFtZXMKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBBZ2dyZWdhdGVSZWZlcmVuY2VGaWxlTG9hZGVyIHsKKworCXByaXZhdGUgU3RyaW5nIGRhdGFGaWxlPSIiOworCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NWX0VYVEVOU0lPTiA9ICIuY3N2IjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFhUX0VYVEVOU0lPTiA9ICIudHh0IjsKKwlwcml2YXRlIExpc3Q8RG91YmxlPiBhZ2dyZWdhdGVEYXRhID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJcHJpdmF0ZSBTZXQ8U3RyaW5nPiBpZFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwlwcml2YXRlIEZpbGUgc2NlbmFyaW9EYXRhID0gbnVsbDsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpZ25vcmVLZXlzID0geyJ0aW1lIiwiaXRlcmF0aW9uIn07CisKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgbG9hZHMgZGF0YSBmcm9tIGEgZm9sZGVyIGNvbnRhaW5pbmcgYSBzYXZlZCBzY2VuYXJpbyBydW4gZGF0YS4KKwkgKiBUaGUgZGF0YSBpbiB0aGUgZm9sZGVyIGlzIGEgc2V0IG9mIGNzdiBmaWxlcywgb25lIHBlciBsb2NhdGlvbi4KKwkgKiBAcGFyYW0gc2NlbmFyaW9GaWxlIAorCSAqIEB0aHJvd3MgQWdncmVnYXRlRmlsZUluaXRpYWxpemF0aW9uRXhjZXB0aW9uIAorCSAqIAorCSAqLworCXB1YmxpYyBBZ2dyZWdhdGVSZWZlcmVuY2VGaWxlTG9hZGVyKFN0cmluZyBzY2VuYXJpb0ZpbGUpIHRocm93cyAgQWdncmVnYXRlRmlsZUluaXRpYWxpemF0aW9uRXhjZXB0aW9uIHsKKwkJZGF0YUZpbGUgPSBzY2VuYXJpb0ZpbGU7CisJCXNjZW5hcmlvRGF0YSA9IG5ldyBGaWxlKGRhdGFGaWxlKTsKKwkJaWYoIWlzRGF0YUZpbGUoc2NlbmFyaW9EYXRhKSkgeworCQkJdGhyb3cgbmV3IEFnZ3JlZ2F0ZUZpbGVJbml0aWFsaXphdGlvbkV4Y2VwdGlvbigiTm90IGEgdmFsaWQgZGF0YSBmaWxlLCBtdXN0IGJlIC5jc3Ygb3IgLnR4dCAiK2RhdGFGaWxlKTsKKwkJfSAKKwkJYWdncmVnYXRlRGF0YSA9IHByb2Nlc3NGaWxlKCk7CisJfQorCisKKworCisKKwkvKioKKwkgKiB0ZXN0IGZpbGUgbmFtZSB0byBzZWUgaWYgaXQgaXMgYSBkYXRhIGZpbGUuIE11c3QgaGF2ZSBleHRlbnNpb24gLnR4dCBvciAuY3N2CisJICogCisJICogQHBhcmFtIGZpbGUKKwkgKiBAcmV0dXJuIHRydWUgaWYgZGF0YSBmaWxlCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzRGF0YUZpbGUoRmlsZSBmaWxlKSB7CisJCWJvb2xlYW4gcmV0VmFsID0gdHJ1ZTsKKwkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKKwkJaWYoKG5hbWUuaW5kZXhPZihUWFRfRVhURU5TSU9OKSA8IDApICYmIChuYW1lLmluZGV4T2YoQ1NWX0VYVEVOU0lPTikgPCAwKSkgcmV0VmFsID0gZmFsc2U7CisJCXJldHVybiByZXRWYWw7CisJfQorCisKKworCS8qKgorCSAqIHByb2Nlc3MgdGhlIGlucHV0IGZpbGUKKwkgKiBAcmV0dXJuIGEgbWFwIG9mIHNjZW5hcmlvIGRhdGEga2V5ZWQgYnkgbG9jYXRpb24gSUQKKwkgKiBAdGhyb3dzIEFnZ3JlZ2F0ZUZpbGVJbml0aWFsaXphdGlvbkV4Y2VwdGlvbiAKKwkgKi8KKwlwdWJsaWMgTGlzdDxEb3VibGU+IHByb2Nlc3NGaWxlKCkgdGhyb3dzIEFnZ3JlZ2F0ZUZpbGVJbml0aWFsaXphdGlvbkV4Y2VwdGlvbiB7CisKKwkJaW50IG1heFRpbWUgPSAwOworCQlIYXNoTWFwPFN0cmluZywgTGlzdDxEb3VibGU+PiBkYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLExpc3Q8RG91YmxlPj4oKTsKKworCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOworCQl0cnkgeworCQkJU3RyaW5nIHJlY29yZDsgIAorCQkJU3RyaW5nIGhlYWRlcjsKKwkJCWludCByZWNDb3VudCA9IDA7CisJCQlMaXN0PFN0cmluZz4gaGVhZGVyRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCS8vRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc2NlbmFyaW9EYXRhKTsgCisJCQlyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoc2NlbmFyaW9EYXRhKSk7CisKKwkJCS8vCisJCQkvLyBSZWFkIHRoZSBmaWxlIGhlYWRlcgorCQkJLy8KKwkJCWlmICggKGhlYWRlcj1yZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCApIHsgCisKKwkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGhlYWRlciApOworCisJCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworCQkJCQlTdHJpbmcgdmFsID0gc3QubmV4dFRva2VuKCIsIik7CisJCQkJCWhlYWRlckVsZW1lbnRzLmFkZCh2YWwudHJpbSgpKTsKKwkJCQl9CisJCQl9IC8vIHJlYWQgdGhlIGhlYWRlcgorCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkJCS8vIHNldCB1cCB0aGUgZW1wdHkgbGlzdHMKKwkJCWludCBudW1Db2x1bW5zID0gaGVhZGVyRWxlbWVudHMuc2l6ZSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpICsrKSB7CisJCQkJU3RyaW5nIGtleSA9IGhlYWRlckVsZW1lbnRzLmdldChpKTsKKwkJCQlpZih2YWxpZGF0ZShrZXkpKSB7CisJCQkJCWRhdGEucHV0KGtleSwgbmV3IEFycmF5TGlzdDxEb3VibGU+KCkpOworCQkJCX0KKworCQkJfQorCisJCQkvLyBIZXJlIHdlIGNoZWNrIHRoZSB0eXBlIG9mIHRoZSBkYXRhIGZpbGUKKwkJCS8vIGJ5IGNoZWNraW5nIHRoZSBoZWFkZXIgZWxlbWVudHMKKworCisKKwkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCS8vIFJlYWQgdGhlIGRhdGEKKwkJCS8vCisJCQl3aGlsZSAoIChyZWNvcmQ9cmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwgKSB7IAorCQkJCXJlY0NvdW50Kys7IAorCisJCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihyZWNvcmQgKTsKKwkJCQlpbnQgdGNvdW50ID0gMDsKKwkJCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisJCQkJCVN0cmluZyB2YWwgPSBzdC5uZXh0VG9rZW4oIiwiKTsKKwkJCQkJU3RyaW5nIGtleSA9IGhlYWRlckVsZW1lbnRzLmdldCh0Y291bnQpOworCQkJCQlpZih2YWxpZGF0ZShrZXkpKSB7CisJCQkJCQlpZFNldC5hZGQoa2V5KTsKKwkJCQkJCUxpc3Q8RG91YmxlPiBkYXRhTGlzdCA9IGRhdGEuZ2V0KGtleSk7CisJCQkJCQl0cnkgeworCQkJCQkJCURvdWJsZSBkVmFsID0gbmV3IERvdWJsZSh2YWwudHJpbSgpKTsKKwkJCQkJCQlkYXRhTGlzdC5hZGQoZFZhbCk7CisJCQkJCQkJaWYgKGRhdGFMaXN0LnNpemUoKSA+PSBtYXhUaW1lKSBtYXhUaW1lID0gZGF0YUxpc3Quc2l6ZSgpOworCQkJCQkJCWRhdGEucHV0KGtleSxkYXRhTGlzdCk7CisJCQkJCQl9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKwkJCQkJCQlkYXRhLnJlbW92ZShrZXkpOworCQkJCQkJCWlkU2V0LnJlbW92ZShrZXkpOworCQkJCQkJCUFjdGl2YXRvci5sb2dJbmZvcm1hdGlvbigiTm90IGEgdmFsaWQgbnVtYmVyICgiK3ZhbCsiKSAuLi4gUmVtb3Zpbmcga2V5ICIra2V5LCBudWxsKTsKKwkJCQkJCX0KKwkJCQkJfQkJCQorCQkJCQl0Y291bnQgKys7CisJCQkJfQorCQkJfSAvLyB3aGlsZSBmaWxlIGhhcyBkYXRhCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgCisJCQkvLyBjYXRjaCBpbyBlcnJvcnMgZnJvbSBGaWxlSW5wdXRTdHJlYW0gb3IgcmVhZExpbmUoKQorCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCIgSU9FeGNlcHRpb24gZXJyb3IhIiwgZSk7CisJCQl0aHJvdyBuZXcgQWdncmVnYXRlRmlsZUluaXRpYWxpemF0aW9uRXhjZXB0aW9uKGUpOworCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlyZWFkZXIuY2xvc2UoKTsKKwkJCX0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gSWdub3JlIGV4Y2VwdGlvbiBvbiByZXNvdXJjZSBjbG9zZQorCQkJfQorCQl9CisKKwkJTGlzdDxEb3VibGU+IGFnZ3JlZ2F0ZSA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1heFRpbWU7IGkgKyspIHsKKwkJCWFnZ3JlZ2F0ZS5hZGQoaSwgbmV3IERvdWJsZSgwLjApKTsKKwkJfQorCQkvLyBsb29wIG92ZXIgYWxsIGxvY2F0aW9uIGlkcworCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBpZFNldC5pdGVyYXRvcigpOworCQl3aGlsZSgoaXRlciE9bnVsbCkmJihpdGVyLmhhc05leHQoKSkpIHsKKwkJCVN0cmluZyBrZXkgPSBpdGVyLm5leHQoKTsKKwkJCUxpc3Q8RG91YmxlPiBkYXRhTGlzdCA9IGRhdGEuZ2V0KGtleSk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG1heFRpbWU7IGkgKyspIHsKKwkJCQlkb3VibGUgdmFsID0gYWdncmVnYXRlLmdldChpKS5kb3VibGVWYWx1ZSgpOworCQkJCXZhbCArPSBkYXRhTGlzdC5nZXQoaSkuZG91YmxlVmFsdWUoKTsKKwkJCQlhZ2dyZWdhdGUuc2V0KGksbmV3IERvdWJsZSh2YWwpKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBhZ2dyZWdhdGU7CisJfSAvLyBwcm9jZXNzIGZpbGUKKworCisJLyoqCisJICogcHJvY2VzcyBhbiBpbmNpZGVuY2UgZmlsZQorCSAqIEFuIGluY2lkZW5jZSBmaWxlIGRvZXMgbm90IGNvbnRhaW4gU0kgZGF0YSBzbyBpdCBjYW4gbm90IHJldHVybiAKKwkgKiBhIFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIChpdCBpcyBub3QgdXNlZCB0byBlc3RpbWF0ZSBwYXJhbWV0ZXJzKS4KKwkgKiBJbnN0ZWFkIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHJhdyBkYXRhIGluIGEgbWFwCisJICogCisJICogQHBhcmFtIGZpbGVOYW1lCisJICogQHJldHVybiBhIG1hcCBvZiBzY2VuYXJpbyBkYXRhIGtleWVkIGJ5IGxvY2F0aW9uIElECisJICogQHRocm93cyBBZ2dyZWdhdGVGaWxlSW5pdGlhbGl6YXRpb25FeGNlcHRpb24gCisJICovCisJcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gcHJvY2Vzc0luY2lkZW5jZUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgQWdncmVnYXRlRmlsZUluaXRpYWxpemF0aW9uRXhjZXB0aW9uIHsKKwkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOworCQlIYXNoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBkYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLExpc3Q8U3RyaW5nPj4oKTsKKwkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVN0cmluZyByZWNvcmQ7ICAKKwkJCVN0cmluZyBoZWFkZXI7CisJCQlpbnQgcmVjQ291bnQgPSAwOworCQkJTGlzdDxTdHJpbmc+IGhlYWRlckVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQkvL0ZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOyAKKwkJCXJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlKSk7CisKKwkJCS8vCisJCQkvLyBSZWFkIHRoZSBmaWxlIGhlYWRlcgorCQkJLy8KKwkJCWlmICggKGhlYWRlcj1yZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCApIHsgCisKKwkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGhlYWRlciApOworCisJCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworCQkJCQlTdHJpbmcgdmFsID0gc3QubmV4dFRva2VuKCIsIik7CisJCQkJCWhlYWRlckVsZW1lbnRzLmFkZCh2YWwudHJpbSgpKTsKKwkJCQl9CisJCQl9IC8vIHJlYWQgdGhlIGhlYWRlcgorCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkJCS8vIHNldCB1cCB0aGUgZW1wdHkgbGlzdHMKKwkJCWludCBudW1Db2x1bW5zID0gaGVhZGVyRWxlbWVudHMuc2l6ZSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpICsrKSB7CisJCQkJU3RyaW5nIGtleSA9IGhlYWRlckVsZW1lbnRzLmdldChpKTsKKwkJCQlkYXRhLnB1dChrZXksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKKwkJCX0KKworCQkJLy8gSGVyZSB3ZSBjaGVjayB0aGUgdHlwZSBvZiB0aGUgZGF0YSBmaWxlCisJCQkvLyBieSBjaGVja2luZyB0aGUgaGVhZGVyIGVsZW1lbnRzCisKKworCisKKwkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCS8vIFJlYWQgdGhlIGRhdGEKKwkJCS8vCisJCQl3aGlsZSAoIChyZWNvcmQ9cmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwgKSB7IAorCQkJCXJlY0NvdW50Kys7IAorCisJCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihyZWNvcmQgKTsKKwkJCQlpbnQgdGNvdW50ID0gMDsKKwkJCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisJCQkJCVN0cmluZyB2YWwgPSBzdC5uZXh0VG9rZW4oIiwiKTsKKwkJCQkJU3RyaW5nIGtleSA9IGhlYWRlckVsZW1lbnRzLmdldCh0Y291bnQpOworCQkJCQkoZGF0YS5nZXQoa2V5KSkuYWRkKHZhbC50cmltKCkpOworCQkJCQl0Y291bnQgKys7CisJCQkJfQorCQkJfSAvLyB3aGlsZSBmaWxlIGhhcyBkYXRhCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgCisJCQkvLyBjYXRjaCBpbyBlcnJvcnMgZnJvbSBGaWxlSW5wdXRTdHJlYW0gb3IgcmVhZExpbmUoKQorCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCIgSU9FeGNlcHRpb24gZXJyb3IhIiwgZSk7CisJCQl0aHJvdyBuZXcgQWdncmVnYXRlRmlsZUluaXRpYWxpemF0aW9uRXhjZXB0aW9uKGUpOworCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlyZWFkZXIuY2xvc2UoKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gSWdub3JlIGV4Y2VwdGlvbiBvbiByZXNvdXJjZSBjbG9zZQorCQkJfQorCQl9CisJCXJldHVybiBkYXRhOworCX0KKworCS8qKgorCSAqIGNlcnRhaW4ga2V5cyB3ZSBtdXN0IGlnbm9yZQorCSAqIEBwYXJhbSBrZXkKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlKFN0cmluZyBrZXkpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZ25vcmVLZXlzLmxlbmd0aDsgaSArKykgeworCQkJU3RyaW5nIHRlc3QgPSBrZXkudHJpbSgpOworCQkJaWYodGVzdC5lcXVhbHNJZ25vcmVDYXNlKGlnbm9yZUtleXNbaV0pKSByZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisKKwkvKioKKwkgKiBJbmRpY2F0ZSBFbmQtT2YtRmlsZQorCSAqIAorCSAqIEBwYXJhbSBidWZmZXIKKwkgKiAgICAgICAgICAgIEEgYnVmZmVyIG9mIGRpdmEgZGF0YQorCSAqIAorCSAqIEByZXR1cm4gVHJ1ZSBpZiB3ZSBoYXZlIHJlYWNoZWQgRW5kLU9mLUZpbGUKKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIGJvb2xlYW4gRU9GKFN0cmluZyBidWZmZXIpIHsKKwkJaWYgKGJ1ZmZlciA9PSBudWxsIHx8IGJ1ZmZlci5sZW5ndGgoKSA9PSAwKQorCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcmV0dXJuIGFnZ3JlZ2F0ZSBkYXRhIGFzIGFycmF5CisJICovCisJcHVibGljIExpc3Q8RG91YmxlPiBnZXRBZ2dyZWdhdGVEYXRhKCkgeworCQlyZXR1cm4gYWdncmVnYXRlRGF0YTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcmV0dXJuIGlkcyBvZiBsb2NhdGlvbnMgdGhhdCB3ZXJlIGFnZ3JlZ2F0ZWQKKwkgKi8KKwlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0SWRTZXQoKSB7CisJCXJldHVybiBpZFNldDsKKwl9CisKKworCit9IC8vIEFnZ3JlZ2F0ZVJlZmVyZW5jZUZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL3ZpZXdzL0FnZ3JlZ2F0ZVNlcmllc0ZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL3ZpZXdzL0FnZ3JlZ2F0ZVNlcmllc0ZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDU5ZjFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvQWdncmVnYXRlU2VyaWVzRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8vIFRpbWVTZXJpZXNGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIFJlcG9ydENvbnRyb2x9IGluc3RhbmNlcy4KKyAqLworcHVibGljIGNsYXNzIEFnZ3JlZ2F0ZVNlcmllc0ZhY3RvcnkgaW1wbGVtZW50cyBSZXBvcnRDb250cm9sRmFjdG9yeSB7CisKKwlzdGF0aWMgQWdncmVnYXRlU2VyaWVzRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBBZ2dyZWdhdGVTZXJpZXNGYWN0b3J5KCk7CisKKwkvKioKKwkgKiBDb25zdGFudHMgZm9yIHNhdmluZyBSZXBvcnRWaWV3UHJlZmVyZW5jZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBR0dSRUdBVEVfU0VSSUVTX1RZUEUgPSAiQWdncmVnYXRlVGltZVNlcmllcyI7CisKKwkvKioKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICB0aGUgcGFyZW50IG9mIHRoZSB7QGxpbmsgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQbG90dGVyfQorCSAqIEByZXR1cm4gYSB7QGxpbmsgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQbG90dGVyfQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLkdlb2dyYXBoaWNDb250cm9sRmFjdG9yeSNjcmVhdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQorCSAqLworCXB1YmxpYyBSZXBvcnRDb250cm9sIGNyZWF0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisJCXJldHVybiBuZXcgQWdncmVnYXRlVmFsdWVIaXN0b3J5UGxvdHRlcihwYXJlbnQpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gVE9ETyBKRksKKwkgKiAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUNvbnRyb2xOYW1lKCkgeworCQlyZXR1cm4gQUdHUkVHQVRFX1NFUklFU19UWVBFOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIEZhY3RvcnkgY3JlYXRlcyBhIGNvbnRyb2wgYXNzb2NpYXRlZCB3aXRoIGFuIFNpbXVsYXRpb24KKwkgKiBAcmV0dXJuIHR5cGUgb2YgZmFjdG9yeQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeVR5cGUoKSB7CisJCXJldHVybiBTSU1VTEFUSU9OX1RZUEU7CisJfQorCit9IC8vIFRpbWVTZXJpZXNGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9BZ2dyZWdhdGVUaW1lU2VyaWVzQ2FudmFzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9BZ2dyZWdhdGVUaW1lU2VyaWVzQ2FudmFzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ2MjIxNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL3ZpZXdzL0FnZ3JlZ2F0ZVRpbWVTZXJpZXNDYW52YXMuamF2YQpAQCAtMCwwICsxLDEwOTYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmRldmljZS5JRGV2aWNlUmVuZGVyZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5leGNlcHRpb24uQ2hhcnRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5mYWN0b3J5LkdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLkNoYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuQ2hhcnRXaXRoQXhlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5BbmNob3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuQXhpc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuQm91bmRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkNvbG9yRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5JbnRlcnNlY3Rpb25UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkxpbmVBdHRyaWJ1dGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkxpbmVTdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5NYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuUG9zaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuVGlja1N0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLmltcGwuQm91bmRzSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5pbXBsLkNvbG9yRGVmaW5pdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5jb21wb25lbnQuQXhpczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmNvbXBvbmVudC5TZXJpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5jb21wb25lbnQuaW1wbC5TZXJpZXNJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuZGF0YS5OdW1iZXJEYXRhU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuZGF0YS5TZXJpZXNEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuZGF0YS5pbXBsLk51bWJlckRhdGFFbGVtZW50SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuaW1wbC5OdW1iZXJEYXRhU2V0SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuaW1wbC5TZXJpZXNEZWZpbml0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmltcGwuQ2hhcnRXaXRoQXhlc0ltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5sYXlvdXQuTGVnZW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwubGF5b3V0LlBsb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC50eXBlLkxpbmVTZXJpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC50eXBlLmltcGwuU2NhdHRlclNlcmllc0ltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC51dGlsLlBsdWdpblNldHRpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5WaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7CisKKy8qKgorICogQWdncmVnYXRlVGltZVNlcmllc0NhbnZhcyBpcyBhIHN1YmNsYXNzIG9mIHtAbGluayBDYW52YXN9IHN1aXRhYmxlIGZvciBjaGFydCBkcmF3aW5ncy4KKyAqLworcHVibGljIGNsYXNzIEFnZ3JlZ2F0ZVRpbWVTZXJpZXNDYW52YXMgZXh0ZW5kcyBDYW52YXMgeworCisJcHJvdGVjdGVkIElEZXZpY2VSZW5kZXJlciBpZHIgPSBudWxsOworCisJLyoqCisJICogVGhpcyBpcyB0aGUge0BsaW5rIENoYXJ0fSB0aGF0IHBsb3RzIHRoZSByZWxhdGl2ZSB2YWx1ZXMuCisJICovCisJcHJvdGVjdGVkIENoYXJ0IGNtID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBwcm92aWRlciBvZiByZWxhdGl2ZSB2YWx1ZXMuCisJICovCisJLy9wcml2YXRlIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIgcnZocDsKKworCXByaXZhdGUgQWdncmVnYXRlVmFsdWVIaXN0b3J5UGxvdHRlciBjb250cm9sID0gbnVsbDsKKwkKKyAgICAvLyBUT0RPIGdldCByaWQgb2YgdGhpcworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZhdWx0S2V5ID0gQWdncmVnYXRlVmFsdWVIaXN0b3J5UGxvdHRlci5SRUZFUkVOQ0VfUFJPUEVSVFk7CisKKwkvKioKKwkgKiBTdGFydCB3aXRoIHRoaXMgdmlzaWJsZQorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BST1BFUlRZID0gIkkiOworCS8qKgorCSAqIHVzZWQgaWYgd2UgbmVlZCB0byBvdmVybGF5IHRyYWNlcyBpbiBkaWZmZXJlbnQgY29sb3JzCisJICovCisJcHJpdmF0ZSBib29sZWFuIG92ZXJsYXlNb2RlID0gZmFsc2U7CisJCQorCisJLyoqCisJICogQSBjb250ZXh0IG1lbnUgZm9yIHRoaXMgdmlldworCSAqLworCU1lbnUgcG9wVXBNZW51ID0gbnVsbDsKKwkKKwkvKioKKwkgKiBzZXQgeSBheGlzIHRvIGEgbGluZWFyIHNjYWxlCisJICovCisJcHJpdmF0ZSBMaW5lYXJTY2FsZUFjdGlvbiBsaW5lYXJUaW1lQWN0aW9uOworCS8qKgorCSAqIHNldCB5IGF4aXMgdG8gYSBsb2cgc2NhbGUKKwkgKi8KKwlwcml2YXRlIExvZ1NjYWxlQWN0aW9uIGxvZ1RpbWVBY3Rpb247CisJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTGluZWFyVGltZVNjYWxlID0gdHJ1ZTsKKwkKKworCS8qKgorCSAqIHNob3cgdGhlIGxlZ2VuZCAodHJ1ZSBieSBkZWZhdWx0KQorCSAqLworCXByaXZhdGUgTGVnZW5kVmlld0FjdGlvbiB2aWV3TGVnZW5kOworCisJLyoqCisJICogaGlkZSB0aGUgbGVnZW5kIAorCSAqLworCXByaXZhdGUgTGVnZW5kSGlkZUFjdGlvbiBoaWRlTGVnZW5kOworCXByb3RlY3RlZCBib29sZWFuIHNob3dMZWdlbmQgPSB0cnVlOworCisJcHJvdGVjdGVkIExlZ2VuZCBsZWdlbmQgPSBudWxsOworCQorCisJLyoqCisJICogdGhpcyBpcyBhIG1hcCBvZiB0aGUgRGF0YVNlcmllcyBvYmplY3QgKGtleWVkIGJ5IHByb3BlcnR5IG5hbWUpCisJICovCisJcHJvdGVjdGVkIGZpbmFsIE1hcDxTdHJpbmcsRGF0YVNlcmllcz4gZGF0YVNlcmllc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxEYXRhU2VyaWVzPigpOworCQorCisJLyoqCisJICogVGhlc2UgYXJlIHRoZSBjeWNsZSBudW1iZXJzIHRoYXQgbWF0Y2ggdGhlIHJlbGF0aXZlIHZhbHVlcyB0aGF0IHdpbGwgYmUKKwkgKiBwbG90dGVkCisJICogCisJICogQHNlZSAjcmVsYXRpdmVWYWx1ZXMKKwkgKi8KKwlwcml2YXRlIGZpbmFsIExpc3Q8SW50ZWdlcj4gY3ljbGVOdW1iZXJzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCisJLyoqCisJICogQ2hhcnQgZ2VuZXJhdG9yIGluc3RhbmNlIChyZWZlcmVuY2UgdG8gYSBzaW5nbGV0b24pCisJICovCisJR2VuZXJhdG9yIGdyOworCisJQXhpcyB5QXhpc1ByaW1hcnk7CisJQXhpcyB4QXhpc1ByaW1hcnk7CisJLyoqCisJICogdGhlIG1heFkgdmFsdWUgZm9yIHNjYWxpbmcKKwkgKi8KKwlkb3VibGUgbWF4WSA9IC0xLjA7CisKKwkvKioKKwkgKiBMb2cgb2YgemVybyBpcyBuZWdhdGl2ZSBpbmZpbml0eSBzbyBmb3IgZWFjaCBsb2NhdGlvbiB3ZSB3aWxsIGN1dCBvZmYgdGhlIG1pbmltdW0gCisJICogYXQgdGhlIG1pbiBOT05aRVJPIFkgdmFsdWUKKwkgKi8KKwlwcml2YXRlIGRvdWJsZSBtaW5Zc2NhbGUgPSAwLjAwMDAwMDE7CisJCisJCisKKworCS8qKgorCSAqIExhYmVsIGZvciBsaW5lIHNlcmllcyBMRUdFTkQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIE9yZGluYXRlX0xFR0VORCA9ICJZIjsKKwkKKwkvKioKKwkgKiBMYWJlbCBmb3IgbGluZSBzZXJpZXMgWSBheGlzIGxhYmVsCisJICoqLworCXB1YmxpYyBTdHJpbmcgT3JkaW5hdGVfQVhJUyA9ICJZIjsKKwkKKwkvKiogCisJICogY3VzdG9taXphYmxlIGNvbG9yIGRlZmluaXRpb25zCisJICovCisJcHJpdmF0ZSBDb2xvckRlZmluaXRpb24gZm9yZUdyb3VuZCA9IENvbG9yRGVmaW5pdGlvbkltcGwuV0hJVEUoKTsKKwlwcml2YXRlIENvbG9yRGVmaW5pdGlvbiBiYWNrZ3JvdW5kR3JvdW5kID0gQ29sb3JEZWZpbml0aW9uSW1wbC5CTEFDSygpOworCXByaXZhdGUgQ29sb3JEZWZpbml0aW9uIGZyYW1lQ29sb3IgPSBDb2xvckRlZmluaXRpb25JbXBsLmNyZWF0ZSgxODAsIDE4MCwgMjAwKTsKKworCUltYWdlIGltZ0NoYXJ0ID0gbnVsbDsKKwkKKwkKKwkvKioKKwkgKiBUaGlzIENvbnN0cnVjdG9yIGlzIHVzZWQgd2hlbiB3ZSB3YW50IHRvIHBsYWNlIHRoZSB0aW1lIHNlcmllcyBpbiBhIGNvbnRhaW5lcgorCSAqIHdoaWNoIGlzIGEgc3ViIGNvbXBvbmVudCBvZiB0aGUgYWN0dWFsIFJlcG9ydENvbnRyb2wKKwkgKiBAcGFyYW0gcmVwb3J0Q29udHJvbCAKKwkgKi8KKwlwdWJsaWMgQWdncmVnYXRlVGltZVNlcmllc0NhbnZhcyhmaW5hbCBBZ2dyZWdhdGVWYWx1ZUhpc3RvcnlQbG90dGVyIHJlcG9ydENvbnRyb2wpIHsKKwkJCisJCXN1cGVyKHJlcG9ydENvbnRyb2wsIFNXVC5ET1VCTEVfQlVGRkVSRUQgfCBTV1QuQk9SREVSKTsKKwkJT3JkaW5hdGVfTEVHRU5EID0gIlRpbWUiOyAvLyBUT0RPIE5MUworCQlPcmRpbmF0ZV9BWElTID0gIiI7CisJCWZvcmVHcm91bmQgCQkJPSBDb2xvckRlZmluaXRpb25JbXBsLldISVRFKCk7CisJCWJhY2tncm91bmRHcm91bmQgCT0gQ29sb3JEZWZpbml0aW9uSW1wbC5CTEFDSygpOworCQlmcmFtZUNvbG9yIAkJCT0gQ29sb3JEZWZpbml0aW9uSW1wbC5HUkVZKCk7CisJCXRoaXMub3ZlcmxheU1vZGUgPSBmYWxzZTsKKwkJCisJCWdyID0gR2VuZXJhdG9yLmluc3RhbmNlKCk7CisKKwkJdHJ5IHsKKwkJCWlkciA9IFBsdWdpblNldHRpbmdzLmluc3RhbmNlKCkuZ2V0RGV2aWNlKCJkdi5TV1QiKTsgLy8kTk9OLU5MUy0xJAkJCQorCQl9IGNhdGNoIChmaW5hbCBDaGFydEV4Y2VwdGlvbiBwZXgpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiUHJvYmxlbSBpbml0aWFsaXppbmcgY2hhcnQiLCBwZXgpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCX0KKworCQljb250cm9sID0gcmVwb3J0Q29udHJvbDsJCisJCWNtID0gY3JlYXRlU2ltcGxlTGluZUNoYXJ0KGRhdGFTZXJpZXNNYXAsIGN5Y2xlTnVtYmVycywgTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJDQy50aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJcmVzZXREYXRhKCk7CisJCQorCQlhZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKGZpbmFsIFBhaW50RXZlbnQgcGUpIHsKKworCQkJCWZpbmFsIENvbXBvc2l0ZSBzb3VyY2UgPSAoQ29tcG9zaXRlKSBwZS5nZXRTb3VyY2UoKTsKKwkJCQlmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlIGQgPSBzb3VyY2UKKwkJCQkJCS5nZXRDbGllbnRBcmVhKCk7CisKKwkJCQlpZihpbWdDaGFydCAhPSBudWxsKSBpbWdDaGFydC5kaXNwb3NlKCk7CisJCQkJaW1nQ2hhcnQgPSBuZXcgSW1hZ2Uoc291cmNlLmdldERpc3BsYXkoKSwgZCk7CisJCQkJCisJCQkJaWRyLnNldFByb3BlcnR5KElEZXZpY2VSZW5kZXJlci5HUkFQSElDU19DT05URVhULCBuZXcgR0MoCisJCQkJCQlpbWdDaGFydCkpOworCQkJCWZpbmFsIEJvdW5kcyBib3VuZHMgPSBCb3VuZHNJbXBsLmNyZWF0ZShkLngsIGQueSwgZC53aWR0aCwKKwkJCQkJCWQuaGVpZ2h0KTsKKwkJCQlib3VuZHMuc2NhbGUoNzJkIC8gaWRyLmdldERpc3BsYXlTZXJ2ZXIoKS5nZXREcGlSZXNvbHV0aW9uKCkpOworCQkJCS8vIEJPVU5EUyBNVVNUIEJFIFNQRUNJRklFRCBJTiBQT0lOVFMKKworCQkJCXRyeSB7CisJCQkJCWdyLnJlbmRlcihpZHIsIGdyLmJ1aWxkKGlkci5nZXREaXNwbGF5U2VydmVyKCksIGNtLCBib3VuZHMsCisJCQkJCQkJbnVsbCwgbnVsbCwgbnVsbCkpOworCQkJCQlwZS5nYy5kcmF3SW1hZ2UoaW1nQ2hhcnQsIGQueCwgZC55KTsKKwkJCQl9IGNhdGNoIChmaW5hbCBDaGFydEV4Y2VwdGlvbiBjZSkgeworCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlByb2JsZW0gcmVuZGVyaW5nIGNoYXJ0IiwgY2UpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfSAvLyBwYWludENvbnRyb2wKKwkJfSAvLyBQYWludExpc3RlbmVyCisJCSk7CisJCQorCQkvL0NyZWF0ZSBhIGNvbnRleHQgbWVudSBmb3IgdGhlIGNhbnZhcworCQljcmVhdGVDb250ZXh0TWVudSh0aGlzKTsKKwl9IC8vIGNvbnN0cnVjdG9yIDEKKwkKKwkKKwkKKwkKKwkvKioKKwkgKiBUaGUgbWV0aG9kIHdoaWNoIGdldHMgdGhlIHtAbGluayBBZ2dyZWdhdGVUaW1lU2VyaWVzQ2FudmFzfScgcmVwb3J0cyBsaXN0LCBhbmQKKwkgKiBkcmF3cyBpdCBvbiB0aGUge0BsaW5rIEFnZ3JlZ2F0ZVRpbWVTZXJpZXNDYW52YXN9LgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIGRyYXcoKSB7CisJCQorCQlpbnQgbWF4TGluZXMgPSBjb250cm9sLmdldE51bVByb3BlcnRpZXMoKTsKKwkJCisJCS8vIGFkZCBhbGwgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgc2VyaWVzIG5vdworCQlmb3IgKGludCBpID0gMDsgaSA8IG1heExpbmVzOyBpICsrKSB7CisJCQlTdHJpbmcgcHJvcGVydHkgPSBjb250cm9sLmdldFByb3BlcnR5KGkpOworCQkJCisJCQlpZighZGF0YVNlcmllc01hcC5jb250YWluc0tleShwcm9wZXJ0eSkpIHsKKwkJCQkvLyBuZXcgcHJvcGVydHkKKwkJCQlEYXRhU2VyaWVzIHNlcmllcyA9IG5ldyBEYXRhU2VyaWVzKHByb3BlcnR5LCBvdmVybGF5TW9kZSk7CisJCQkJZGF0YVNlcmllc01hcC5wdXQocHJvcGVydHksIHNlcmllcyk7CisJCQl9CisJCQlEYXRhU2VyaWVzIHNlcmllcyA9IGRhdGFTZXJpZXNNYXAuZ2V0KHByb3BlcnR5KTsKKwkJCWlmKHNlcmllcy5pc1Zpc2libGUoKSkgeworCQkJCXNlcmllcy5zaG93KCk7CisJCQl9IGVsc2UgeworCQkJCXNlcmllcy5oaWRlKCk7CisJCQl9CisJCX0KKwkJcmVzZXREYXRhKCk7CisJCS8vIHVwZGF0ZSB0aGUgY29udGV4dCBtZW51IHdpdGggdGhlIG5ldyBwcm9wZXJ0aWVzIHRvIHBsb3QKKwkJdXBkYXRlQ29udGV4dE1lbnUodGhpcyk7CisJCW1heFkgPSAtMS4wOworCQkJYm9vbGVhbiBzZXRDeWNsZXMgPSBmYWxzZTsKKwkJCS8vIEdldCB0aGUgdmFsdWVzIGZvciB0aGUgcHJvcGVydHkgdG8gYmUgcGxvdHRlZAorCQkJaW50IG1heFBvaW50cyA9IDA7CisJCQkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4TGluZXM7IGkrKykgeworCQkJCVN0cmluZyBwcm9wZXJ0eSA9IGNvbnRyb2wuZ2V0UHJvcGVydHkoaSk7CisJCQkKKwkJCQlmaW5hbCBkb3VibGVbXSBkb3VibGVWYWx1ZXMgPSBjb250cm9sLmdldFZhbHVlcyhwcm9wZXJ0eSk7CisJCQkJCisJCQkJRGF0YVNlcmllcyBzZXJpZXMgPSBkYXRhU2VyaWVzTWFwLmdldChwcm9wZXJ0eSk7CisJCQkJCisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkb3VibGVWYWx1ZXMubGVuZ3RoOyBqKyspIHsKKwkJCQkJCisJCQkJCWlmKGRvdWJsZVZhbHVlc1tqXSA8PSBtaW5Zc2NhbGUpIHsKKwkJCQkJCWlmKGRvdWJsZVZhbHVlc1tqXSA+IDAuMCkgbWluWXNjYWxlID0gZG91YmxlVmFsdWVzW2pdOworCQkJCQl9CisJCQkJCQorCQkJCQlpZihkb3VibGVWYWx1ZXNbal0gPj0gbWF4WSkgeworCQkJCQkJaWYoc2VyaWVzLmlzVmlzaWJsZSgpKSBtYXhZID0gZG91YmxlVmFsdWVzW2pdOworCQkJCQkJZG91YmxlIGxvZyA9IE1hdGguZmxvb3IoTWF0aC5sb2cxMChtYXhZKSk7CisJCQkJCQlkb3VibGUgYWRqdXN0ZWRNYXggPSAoTWF0aC5jZWlsKG1heFkvTWF0aC5wb3coMTAsIGxvZykpKSpNYXRoLnBvdygxMCwgbG9nKTsKKwkJCQkJICAvLyAgaWYoYWRqdXN0ZWRNYXggPD0gMS4wKSBhZGp1c3RlZE1heCA9IDEuMDsKKwkJCQkJCWlmICh1c2VMaW5lYXJUaW1lU2NhbGUpIHsKKwkJCQkJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNYXgoTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZShhZGp1c3RlZE1heCkpOworCQkJCQkJCWRvdWJsZSBzdGVwID0gYWRqdXN0ZWRNYXggLyAxMC4wOworCQkJCQkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldFN0ZXAoc3RlcCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIGtlZXAgMiBzaWduaWZpY2FudCBmaWd1cmVzIG9uIHNjYWxlIGF4aXMKKwkJCQkJCQlkb3VibGUgeW1heCA9IE1hdGgubG9nKGFkanVzdGVkTWF4KTsKKwkJCQkJCQlpZihhZGp1c3RlZE1heCA+IDEuMCkgeworCQkJCQkJCQl5bWF4ICs9IDAuNDk5OworCQkJCQkJCQlsb25nIGltYXggPSBNYXRoLnJvdW5kKHltYXgpOworCQkJCQkJCQl5bWF4ID0gaW1heDsKKwkJCQkJCQl9CisJCQkJCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWF4KE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoeW1heCkpOworCQkJCQkJCWRvdWJsZSBzdGVwID0geW1heC8xMC4wOworCQkJCQkJCWlmIChzdGVwID4gMC4wKSB5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRTdGVwKHN0ZXApOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQkKKwkJCQkJfQorCQkJCX0KKwkJCQorCQkJCQkvLyBBbnkgdmFsdWVzPworCQkJCQlpZiAoZG91YmxlVmFsdWVzLmxlbmd0aCA+IDApIHsKKwkJCQkJCWlmIChtYXhQb2ludHMgPCBkb3VibGVWYWx1ZXMubGVuZ3RoKSB7CisJCQkJCQkJbWF4UG9pbnRzID0gZG91YmxlVmFsdWVzLmxlbmd0aDsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJZm9yIChpbnQgY3ljbGVOdW1iZXIgPSAwOyBjeWNsZU51bWJlciA8IG1heFBvaW50czsgY3ljbGVOdW1iZXIrKykgeworCQkJCQkJCQorCQkJCQkJCURvdWJsZSB2YWx1ZTsKKwkJCQkJCQlkb3VibGUgZGlzcGxheVZhbHVlID0gZG91YmxlVmFsdWVzW2N5Y2xlTnVtYmVyXTsKKwkJCQkJCQlpZiAoZGlzcGxheVZhbHVlIDw9IG1pbllzY2FsZSkgeworCQkJCQkJCQkvLyBMb2coMC4wKSBpcyBuZWdhdGl2ZSBpbmZpbml0eSBzbyBmb3IgZGlzcGxheSBwdXJwb3NlcyBvbmx5CisJCQkJCQkJCS8vIHdlIHNldCB0aGUgbWluaW11bSBheGlzIHZhbHVlIGF0IDAuMS9QT1BVTEFUSU9OCisJCQkJCQkJCWRpc3BsYXlWYWx1ZSA9IG1pbllzY2FsZTsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKHVzZUxpbmVhclRpbWVTY2FsZSkgeworCQkJCQkJCQl2YWx1ZSA9IG5ldyBEb3VibGUoZGlzcGxheVZhbHVlKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQl2YWx1ZSA9IG5ldyBEb3VibGUoTWF0aC5sb2coZGlzcGxheVZhbHVlKSk7CisJCQkJCQkJfQorCQkJCQkJCQorCisJCQkJCQkJc2VyaWVzLmFkZFZhbHVlKHZhbHVlKTsKKwkJCQkJCQkKKwkJCQkJCQkvLyBvbmx5IGRvIG9uY2UgZm9yIGZpcnN0IGxpbmUgc2VyaWVzCisJCQkJCQkJaWYgKCFzZXRDeWNsZXMpIHsKKwkJCQkJCQkJY3ljbGVOdW1iZXJzLmFkZChJbnRlZ2VyLnZhbHVlT2YoY3ljbGVOdW1iZXIpKTsJCisJCQkJCQkJCX0KKwkJCQkJCX0gLy8gZm9yIGN5Y2xlTnVtYmVyCisJCQkJCQkKKwkJCQkJCQorCQkJCQkJCisJCQkJCQlzZXRDeWNsZXMgPSB0cnVlOyAvLyB3ZSBzZXQgdGhlbSBvbmx5IG9uY2UKKwkJCQkJCQorCQkJCQl9IGVsc2UgeworCQkJCQkJLy9yZXNldERhdGEoKTsKKwkJCQkJfQorCQkJfSAvLyBmb3IgaSBwcm9wZXJ0aWVzCisKKworCQlpZiAoIXRoaXMuaXNEaXNwb3NlZCgpKSB7CisJCQlyZWRyYXcoKTsKKwkJfQorCQkKKwkJcmV0dXJuIDsKKwl9IC8vIHBhaW50Q29udHJvbAorCisJLyoqCisJICogQHBhcmFtIGRhdGFTZXJpZXNNYXAKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgTGlzdH0gdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHJlbGF0aXZlIHZhbHVlcworCSAqICAgICAgICAgICAgKDAuMC0xLjApIHRvIHBsb3QKKwkgKiBAcGFyYW0gY3ljbGVOdW1iZXJzCisJICogICAgICAgICAgICB0aGUge0BsaW5rIExpc3R9IG9mIHNpbXVsYXRpb24gY3ljbGUgbnVtYmVycyB0aGF0IG1hdGNoIHRoZQorCSAqICAgICAgICAgICAgcmVsYXRpdmUgdmFsdWVzCisJICogQHBhcmFtIHNlcmllc0lkZW50aWZpZXIKKwkgKiAgICAgICAgICAgIHRoZSB0aXRsZSBvZiB0aGUgY2hhcnQKKwkgKiBAcmV0dXJuIGEgPGNvZGU+Q2hhcnQ8L2NvZGU+CisJICovCisJcHVibGljIGZpbmFsIENoYXJ0IGNyZWF0ZVNpbXBsZUxpbmVDaGFydCgKKwkJCWZpbmFsIE1hcDxTdHJpbmcsIERhdGFTZXJpZXM+IGRhdGFTZXJpZXNNYXAsCisJCQlmaW5hbCBMaXN0PEludGVnZXI+IGN5Y2xlTnVtYmVycywgZmluYWwgU3RyaW5nIHNlcmllc0lkZW50aWZpZXIpIHsKKwkJCisJCWZpbmFsIENoYXJ0V2l0aEF4ZXMgcmV0VmFsdWUgPSBDaGFydFdpdGhBeGVzSW1wbC5jcmVhdGUoKTsKKworCQkKKwkJLy8gUGxvdAorCQlyZXRWYWx1ZS5nZXRCbG9jaygpLnNldEJhY2tncm91bmQoZnJhbWVDb2xvcik7CisJCWZpbmFsIFBsb3QgcCA9IHJldFZhbHVlLmdldFBsb3QoKTsKKwkJcC5nZXRDbGllbnRBcmVhKCkuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kR3JvdW5kKTsKKworCQkvLyBUaXRsZQorCQkvLyBjd2FMaW5lLmdldFRpdGxlKCApLmdldExhYmVsKCApLmdldENhcHRpb24oICkuc2V0VmFsdWUoICJMaW5lIENoYXJ0IgorCQkvLyApOy8vJE5PTi1OTFMtMSQKKwkJcmV0VmFsdWUuZ2V0VGl0bGUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKKworCQkvLyBMZWdlbmQKKwkJbGVnZW5kID0gcmV0VmFsdWUuZ2V0TGVnZW5kKCk7CisJCWZpbmFsIExpbmVBdHRyaWJ1dGVzIGxpYSA9IGxlZ2VuZC5nZXRPdXRsaW5lKCk7CisJCWxlZ2VuZC5nZXRUZXh0KCkuZ2V0Rm9udCgpLnNldFNpemUoOCk7CisJCWxpYS5zZXRTdHlsZShMaW5lU3R5bGUuU09MSURfTElURVJBTCk7CisJCWxlZ2VuZC5nZXRJbnNldHMoKS5zZXQoMTAsIDUsIDAsIDApOworCQlsZWdlbmQuZ2V0T3V0bGluZSgpLnNldFZpc2libGUoZmFsc2UpOworCQlsZWdlbmQuc2V0QW5jaG9yKEFuY2hvci5OT1JUSF9MSVRFUkFMKTsKKwkJbGVnZW5kLnNldFBvc2l0aW9uKFBvc2l0aW9uLkJFTE9XX0xJVEVSQUwpOworCQlsZWdlbmQuZ2V0VGV4dCgpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQlsZWdlbmQuZ2V0T3V0bGluZSgpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQkKKwkJLy8gY3dhTGluZS5nZXRMZWdlbmQoICkuZ2V0VGV4dCgpLmdldEZvbnQoKS5zZXRTaXplKDE2KTs7CisJCS8vIGN3YUxpbmUuZ2V0TGVnZW5kKCApLnNldFZpc2libGUoIHRydWUgKTsKKworCQkvLyAvLy8vLy8vLy8KKwkJLy8gWC1BeGlzCisJCXhBeGlzUHJpbWFyeSA9IHJldFZhbHVlLmdldFByaW1hcnlCYXNlQXhlcygpWzBdOworCQl4QXhpc1ByaW1hcnkuc2V0VHlwZShBeGlzVHlwZS5URVhUX0xJVEVSQUwpOworCQl4QXhpc1ByaW1hcnkuZ2V0TWFqb3JHcmlkKCkuc2V0VGlja1N0eWxlKFRpY2tTdHlsZS5CRUxPV19MSVRFUkFMKTsKKwkJeEF4aXNQcmltYXJ5LmdldE9yaWdpbigpLnNldFR5cGUoSW50ZXJzZWN0aW9uVHlwZS5WQUxVRV9MSVRFUkFMKTsKKwkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuc2V0VmlzaWJsZShmYWxzZSk7CisJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLmdldENhcHRpb24oKS5nZXRGb250KCkuc2V0U2l6ZSg5KTsKKwkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuZ2V0Q2FwdGlvbigpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQl4QXhpc1ByaW1hcnkuZ2V0TGFiZWwoKS5nZXRDYXB0aW9uKCkuc2V0Q29sb3IoZm9yZUdyb3VuZCk7CisKKwkJZmluYWwgU2VyaWVzIHhBeGlzU2VyaWVzID0gU2VyaWVzSW1wbC5jcmVhdGUoKTsKKworCQkvLyBuZXcgY29sb3JzCisJCXhBeGlzU2VyaWVzLmdldExhYmVsKCkuZ2V0Q2FwdGlvbigpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQl4QXhpc1Nlcmllcy5nZXRMYWJlbCgpLmdldE91dGxpbmUoKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJLy8JCisKKwkJZmluYWwgTnVtYmVyRGF0YVNldCB4VmFsdWVzID0gTnVtYmVyRGF0YVNldEltcGwuY3JlYXRlKGN5Y2xlTnVtYmVycyk7CisJCXhBeGlzU2VyaWVzLnNldERhdGFTZXQoeFZhbHVlcyk7CisJCWZpbmFsIFNlcmllc0RlZmluaXRpb24gc2RYID0gU2VyaWVzRGVmaW5pdGlvbkltcGwuY3JlYXRlKCk7CisKKwkJeEF4aXNQcmltYXJ5LmdldFNlcmllc0RlZmluaXRpb25zKCkuYWRkKHNkWCk7CisJCXNkWC5nZXRTZXJpZXMoKS5hZGQoeEF4aXNTZXJpZXMpOworCisJCS8vIC8vLy8vLy8vCisJCS8vIFktQXhpcworCQl5QXhpc1ByaW1hcnkgPSByZXRWYWx1ZS5nZXRQcmltYXJ5T3J0aG9nb25hbEF4aXMoeEF4aXNQcmltYXJ5KTsKKwkJeUF4aXNQcmltYXJ5LmdldE1ham9yR3JpZCgpLnNldFRpY2tTdHlsZShUaWNrU3R5bGUuTEVGVF9MSVRFUkFMKTsKKworCQkvLyBOdW1iZXJEYXRhU2V0W10gb3J0aG9WYWx1ZXMgPSBuZXcgTnVtYmVyRGF0YVNldFtNQVhfTElORVNdOworCQkvLyBTZXJpZXNEZWZpbml0aW9uW10gc2RZID0gbmV3IFNlcmllc0RlZmluaXRpb25bTUFYX0xJTkVTXTsKKworCQkvLyBlbmQgWS1TZXJpZXMKKworCQl4QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNaW4oTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZSgwLjApKTsKKwkJLy8geEF4aXNQcmltYXJ5LmdldFNjYWxlKCApLnNldE1heCggTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZSggMTAuMCApCisJCS8vICk7CisJCS8vIHhBeGlzUHJpbWFyeS5nZXRTY2FsZSggKS5zZXRTdGVwKCAxICk7CisJCXhBeGlzUHJpbWFyeS5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5nZXRGb250KCkuc2V0U2l6ZSg5KTsKKwkJeEF4aXNQcmltYXJ5LmdldExhYmVsKCkuZ2V0Q2FwdGlvbigpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQl4QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5zZXRWaXNpYmxlKHRydWUpOworCQl4QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5nZXRDYXB0aW9uKCkuc2V0VmFsdWUoTWVzc2FnZXMuZ2V0U3RyaW5nKCJUUy5USU1FTEFCRUwiKSk7CisKKwkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWluKE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoMC4wKSk7CisJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDEuMCkpOworCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRTdGVwKDAuMjUpOworCQl5QXhpc1ByaW1hcnkuZ2V0TGFiZWwoKS5nZXRDYXB0aW9uKCkuZ2V0Rm9udCgpLnNldFNpemUoOSk7CisJCXlBeGlzUHJpbWFyeS5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJeUF4aXNQcmltYXJ5LmdldFRpdGxlKCApLmdldENhcHRpb24oICkuc2V0VmFsdWUoIE9yZGluYXRlX0FYSVMgKTsKKwkJeUF4aXNQcmltYXJ5LmdldFRpdGxlKCApLnNldFZpc2libGUodHJ1ZSk7CisJCS8vIHlBeGlzUHJpbWFyeS5nZXRNYWpvckdyaWQoKS5nZXRMaW5lQXR0cmlidXRlcygpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQkKKwkJLy8gZm9yIG5vdyBnZXQgcmVhZHkgdG8gY3JlYXRlIG9ubHkgb25lIGxpbmUgLSB3ZSBoYXZlIG5vIGRhdGEgeWV0LgorCQkvLyB3ZSB3aWxsIGFkZCBtb3JlIGxpbmVzIGFzIHdlIG5lZWQgdGhlbQorCQkvLyBoYW5kbGUgbnVsbAorCQlpZighZGF0YVNlcmllc01hcC5jb250YWluc0tleShkZWZhdWx0S2V5KSkgeworCQkJRGF0YVNlcmllcyBzZXJpZXMgPSBuZXcgRGF0YVNlcmllcyhkZWZhdWx0S2V5LCBvdmVybGF5TW9kZSk7CisJCQlkYXRhU2VyaWVzTWFwLnB1dChkZWZhdWx0S2V5LCBzZXJpZXMpOworCQl9CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlU2ltcGxlTGluZUNoYXJ0CisKKwkKKwkvKioKKwkgKiBDcmVhdGUgdGhlIHZpZXcncyBjb250ZXh0IG1lbnUgYW5kIGFkZCB0aGUgYWN0aW9uIGhhbmRsZXJzIHRvIGl0LgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRleHRNZW51KGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQkvLyBJbml0IGEgQ29udGV4dCBNZW51IE1hbmFnZXIKKwkJZmluYWwgTWVudU1hbmFnZXIgY29udGV4dE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCk7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJbGluZWFyVGltZUFjdGlvbiA9IG5ldyBMaW5lYXJTY2FsZUFjdGlvbigpOworCQlsb2dUaW1lQWN0aW9uID0gbmV3IExvZ1NjYWxlQWN0aW9uKCk7CisJCWNvbnRleHRNZW51TWFuYWdlci5hZGQobGluZWFyVGltZUFjdGlvbik7CisJCWNvbnRleHRNZW51TWFuYWdlci5hZGQobG9nVGltZUFjdGlvbik7CisKKworCQkKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCisJCXZpZXdMZWdlbmQgPSBuZXcgTGVnZW5kVmlld0FjdGlvbigpOworCQloaWRlTGVnZW5kID0gbmV3IExlZ2VuZEhpZGVBY3Rpb24oKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZCh2aWV3TGVnZW5kKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChoaWRlTGVnZW5kKTsKKwkJCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkKKwkJCisJCS8vIFBsYWNlIEhvbGRlciBmb3IgTWVudSBBZGRpdGlvbnMKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKAorCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CisKKwkJcG9wVXBNZW51ID0gY29udGV4dE1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KHBhcmVudCk7CisKKwkJLy8gU2V0IHRoZSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIKKwkJcGFyZW50LnNldE1lbnUocG9wVXBNZW51KTsKKworCX0gLy8gY3JlYXRlQ29udGV4dE1lbnUKKwkKKwkvKioKKwkgKiBVcGRhdGUgdGhlIHZpZXcncyBjb250ZXh0IG1lbnUgYW5kIGFkZCB0aGUgYWN0aW9uIGhhbmRsZXJzIHRvIGl0LgorCSAqLworCXByaXZhdGUgdm9pZCB1cGRhdGVDb250ZXh0TWVudShmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJaWYgKHBvcFVwTWVudSAhPSBudWxsKSB7CisJCQlwb3BVcE1lbnUuZGlzcG9zZSgpOworCQl9IGVsc2UgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gSW5pdCBhIENvbnRleHQgTWVudSBNYW5hZ2VyCisJCWZpbmFsIE1lbnVNYW5hZ2VyIGNvbnRleHRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCWxpbmVhclRpbWVBY3Rpb24gPSBuZXcgTGluZWFyU2NhbGVBY3Rpb24oKTsKKwkJbG9nVGltZUFjdGlvbiA9IG5ldyBMb2dTY2FsZUFjdGlvbigpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGxpbmVhclRpbWVBY3Rpb24pOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGxvZ1RpbWVBY3Rpb24pOworCQkKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCQkvLyBQbGFjZSBIb2xkZXIgZm9yIE1lbnUgQWRkaXRpb25zCisJCWNvbnRleHRNZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigKKwkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkKKwkJdmlld0xlZ2VuZCA9IG5ldyBMZWdlbmRWaWV3QWN0aW9uKCk7CisJCWhpZGVMZWdlbmQgPSBuZXcgTGVnZW5kSGlkZUFjdGlvbigpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKHZpZXdMZWdlbmQpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGhpZGVMZWdlbmQpOworCQkKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQorCQkKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQkKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIGFkZCB0aGUgZGlzcGxheWFibGUgcHJvcGVydGllcworCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2wuZ2V0TnVtUHJvcGVydGllcygpOyBpICsrKSB7CisJCQkKKwkJCVN0cmluZyBuZXh0UHJvcCA9IGNvbnRyb2wuZ2V0UHJvcGVydHkoaSk7CisJCQlEYXRhU2VyaWVzIHNlcmllcyA9IGRhdGFTZXJpZXNNYXAuZ2V0KG5leHRQcm9wKTsKKwkJCURpc3BsYXlhYmxlUHJvcGVydHkgcHJvcGVydHkgPSBuZXcgRGlzcGxheWFibGVQcm9wZXJ0eShuZXh0UHJvcCwgc2VyaWVzLmlzVmlzaWJsZSgpKTsKKwkJCWNvbnRleHRNZW51TWFuYWdlci5hZGQocHJvcGVydHkpOworCQl9CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlmaW5hbCBNZW51IHBvcFVwTWVudSA9IGNvbnRleHRNZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShwYXJlbnQpOworCisJCS8vIFNldCB0aGUgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyCisJCXBhcmVudC5zZXRNZW51KHBvcFVwTWVudSk7CisKKworCX0gLy8gdXBkYXRlQ29udGV4dE1lbnUKKworCisJCisJLyoqCisJICogU2V0cyB0aGUgY29sb3JzIGZvciBhIG4gYXJyYXkgb2YgTGluZVNlcmllcyBnaXZlbiB0aGUgcHJvcGVydHkgdG8gUGxvdAorCSAqIGZvciBlYWNoLiBUcnkgdG8gc2V0IGNvbG9yIGZyb20gdGhlIHByZWZlcmVuY2VzIChpZiBzcGVjaWZpZWQgZm9yIHRoYXQKKwkgKiBwcm9wZXJ0eSkgb3RoZXJ3aXNlIHNldHMgbGluZSBjb2xvciB0byB3aGl0ZS4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvcGVydGllc1RvUGxvdAorCSAqIEBwYXJhbSBsc0xpc3QKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29sb3JEZWZzKAorCQkJZmluYWwgTGlzdDxTdHJpbmc+IHByb3BlcnRpZXNUb1Bsb3QsCisJCQlmaW5hbCBMaXN0PExpbmVTZXJpZXM+IGxzTGlzdCkgeworCQkvLyB0aGUgZGVmYXVsdCBsaW5lIGNvbG9yCisKKwkJLy8gaWYgcG9zc2libGUgZ2V0IGNvbG9yIGZyb20gcHJlZmVyZW5jZXMKKwkJZmluYWwgTWFwPFN0cmluZywgQ29sb3I+IGNvbG9yTWFwID0gVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlCisJCQkJLmdldENvbG9yTWFwcGluZygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxzTGlzdC5zaXplKCk7IGkrKykgeworCQkJQ29sb3JEZWZpbml0aW9uIGNvbG9yID0gQ29sb3JEZWZpbml0aW9uSW1wbC5XSElURSgpOworCisJCQlpZiAoKHByb3BlcnRpZXNUb1Bsb3QgIT0gbnVsbCkgJiYgKHByb3BlcnRpZXNUb1Bsb3Quc2l6ZSgpID4gaSkpIHsKKwkJCQlmaW5hbCBTdHJpbmcga2V5ID0gcHJvcGVydGllc1RvUGxvdC5nZXQoaSk7CisJCQkJLy8gbG9vayBvciB0aGUgcHJlZmVyZW5jZSBjb2xvciBieSBuYW1lCisJCQkJaWYgKGNvbG9yTWFwLmNvbnRhaW5zS2V5KGtleSkpIHsKKwkJCQkJZmluYWwgQ29sb3IgYyA9IGNvbG9yTWFwLmdldChrZXkpOworCQkJCQljb2xvciA9IENvbG9yRGVmaW5pdGlvbkltcGwuY3JlYXRlKGMuZ2V0UmVkKCksCisJCQkJCQkJYy5nZXRHcmVlbigpLCBjLmdldEJsdWUoKSk7CisJCQkJfQorCQkJCWxzTGlzdC5nZXQoaSkuc2V0U2VyaWVzSWRlbnRpZmllcihrZXkpOworCQkJCWxzTGlzdC5nZXQoaSkuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRDb2xvcihjb2xvcik7CisJCQl9IGVsc2UgeworCisJCQkJaWYgKGxzTGlzdC5nZXQoaSkgIT0gbnVsbCkgeworCQkJCQlsc0xpc3QuZ2V0KGkpLnNldFNlcmllc0lkZW50aWZpZXIoIiAiKTsKKwkJCQkJbHNMaXN0LmdldChpKS5nZXRMaW5lQXR0cmlidXRlcygpLnNldENvbG9yKGNvbG9yKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuOworCX0vLyBnZXRDb2xvckRlZgorCisKKwkKKworCS8qKgorCSAqIERpc3Bvc2VzIHRoZSBDb2xvciBvYmplY3RzCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCS8qKgorCSAqIHJlc2V0CisJICovCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCXJlc2V0RGF0YSgpOworCQlyZWRyYXcoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZXNldERhdGEoKSB7CisJCWNsZWFyRGF0YSgpOworCQorCQljeWNsZU51bWJlcnMuYWRkKEludGVnZXIudmFsdWVPZigwKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNsZWFyRGF0YSgpIHsKKwkJCisJCUl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGRhdGFTZXJpZXNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUoKGl0ZXIhPW51bGwpJiYoaXRlci5oYXNOZXh0KCkpKSB7CisJCQlTdHJpbmcga2V5ID0gaXRlci5uZXh0KCk7CisJCQlEYXRhU2VyaWVzIHNlcmllcyA9IGRhdGFTZXJpZXNNYXAuZ2V0KGtleSk7CisJCQlzZXJpZXMucmVsYXRpdmVWYWx1ZXMuY2xlYXIoKTsKKwkJCXNlcmllcy5hZGRWYWx1ZShuZXcgRG91YmxlKDAuMCkpOworCQl9CisJCWN5Y2xlTnVtYmVycy5jbGVhcigpOworCX0KKworCQorCS8qKgorCSAqIHRvZ2dsZSB0aGUgc2NhbGUgZnJvbSBsb2dhcml0aG1pYyB0byBsaW5lYXIKKwkgKi8KKwl2b2lkIHRvZ2dsZUF4aXNTY2FsZSgpIHsKKwkJaWYgKHVzZUxpbmVhclRpbWVTY2FsZSkgeyAvL1N3aXRjaCB0byBsb2dhcml0aG1pYyBzY2FsZQorCQkJbG9nVGltZUFjdGlvbi5zZXRDaGVja2VkKHRydWUpOworCQkJbGluZWFyVGltZUFjdGlvbi5zZXRDaGVja2VkKGZhbHNlKTsKKwkJCS8vSnVzdCB1c2luZyB0aGUgZm9sbG93aW5nIGF4aXMgdHlwZSwgdG8gbW92ZSB0byBsb2cgc2NhbGUsIGRpZG4ndCB3b3JrCisJCQkvL3lBeGlzUHJpbWFyeS5zZXRUeXBlKEF4aXNUeXBlLkxPR0FSSVRITUlDX0xJVEVSQUwpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWluKG51bGwpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWF4KG51bGwpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkudW5zZXRTdGVwKCk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS51bnNldFN0ZXBOdW1iZXIoKTsKKwkJfQorCQllbHNlIHsgLy9Td2l0Y2ggdG8gbGluZWFyIHNjYWxlCisJCQlsb2dUaW1lQWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOworCQkJbGluZWFyVGltZUFjdGlvbi5zZXRDaGVja2VkKHRydWUpOworCQkJLy95QXhpc1ByaW1hcnkuc2V0VHlwZShBeGlzVHlwZS5MSU5FQVJfTElURVJBTCk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNaW4oTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZSgwLjApKTsKKwkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDEuMCkpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0U3RlcCgwLjI1KTsKKwkJfQorCQl1c2VMaW5lYXJUaW1lU2NhbGUgPSAhdXNlTGluZWFyVGltZVNjYWxlOworCQlkcmF3KCk7CisJfQorCQorCisJLyoqCisJICogdG9nZ2xlIHRoZSBzY2FsZSBmcm9tIGxvZ2FyaXRobWljIHRvIGxpbmVhcgorCSAqLworCXZvaWQgdG9nZ2xlTGVnZW5kKCkgeworCQlpZiAoc2hvd0xlZ2VuZCkgeyAvL1N3aXRjaCB0byBoaWRlCisJCQl2aWV3TGVnZW5kLnNldENoZWNrZWQoZmFsc2UpOworCQkJaGlkZUxlZ2VuZC5zZXRDaGVja2VkKHRydWUpOworCQkJbGVnZW5kLnNldFZpc2libGUoZmFsc2UpOworCQl9CisJCWVsc2UgeyAvL1N3aXRjaCB0byB2aWV3CisJCQl2aWV3TGVnZW5kLnNldENoZWNrZWQodHJ1ZSk7CisJCQloaWRlTGVnZW5kLnNldENoZWNrZWQoZmFsc2UpOworCQkJbGVnZW5kLnNldFZpc2libGUodHJ1ZSk7CisJCX0KKwkJc2hvd0xlZ2VuZCA9ICFzaG93TGVnZW5kOworCQlkcmF3KCk7CisJfQorCQorCS8qKgorCSAqIAorCSAqIEBwYXJhbSBtaW5Zc2NhbGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNaW5Zc2NhbGUoZG91YmxlIG1pbllzY2FsZSkgeworCQl0aGlzLm1pbllzY2FsZSA9IG1pbllzY2FsZTsKKwl9CisKKworCS8qKgorCSAqIEFjdGlvbiB0byBzaG93IHRoZSBsZWdlbmQKKwkgKi8KKwlwcm90ZWN0ZWQgY2xhc3MgTGVnZW5kVmlld0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJCXB1YmxpYyBMZWdlbmRWaWV3QWN0aW9uKCkKKwkJeworCQkJc3VwZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5TaG93TGVnZW5kIiksIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKKwkJCXNldENoZWNrZWQoc2hvd0xlZ2VuZCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI2dldFRleHQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbnRleHRNZW51LlNob3dMZWdlbmQiKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQlpZiAoc2hvd0xlZ2VuZCkgeworCQkJCXNldENoZWNrZWQodHJ1ZSk7CisJCQkJLy9Ob3RoaW5nIHRvIGRvLiBJdCdzIGFscmVhZHkgbGluZWFyLXRpbWUuCisJCQl9CisJCQllbHNlIHsKKwkJCQl0b2dnbGVMZWdlbmQoKTsKKwkJCX0KKwkJCWRyYXcoKTsKKwkJfQorCX0gLy9MZWdlbmRWaWV3QWN0aW9uCisJCisJLyoqCisJICogQWN0aW9uIHRvIGhpZGUgdGhlIGxlZ2VuZAorCSAqLworCWNsYXNzIExlZ2VuZEhpZGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gCXsKKwkJcHVibGljIExlZ2VuZEhpZGVBY3Rpb24oKQorCQl7CisJCQlzdXBlcihNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbnRleHRNZW51LkhpZGVMZWdlbmQiKSwgSUFjdGlvbi5BU19DSEVDS19CT1gpOworCQkJc2V0Q2hlY2tlZCghc2hvd0xlZ2VuZCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI2dldFRleHQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbnRleHRNZW51LkhpZGVMZWdlbmQiKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQlpZiAoIXNob3dMZWdlbmQpIHsKKwkJCQlzZXRDaGVja2VkKHRydWUpOworCQkJCS8vTm90aGluZyB0byBkby4gSXQncyBhbHJlYWR5IGxvZy10aW1lLgorCQkJfQorCQkJZWxzZSB7CisJCQkJdG9nZ2xlTGVnZW5kKCk7CisJCQl9CisJCQlkcmF3KCk7CisJCX0KKwl9Ly9MZWdlbmRIaWRlQWN0aW9uCisKKwkKKwkvKioKKwkgKiBzd2l0Y2ggdG8gbGluZWFyIHBsb3QgCisJICogCisJICovCisJcHJvdGVjdGVkIGNsYXNzIExpbmVhclNjYWxlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKwkJcHVibGljIExpbmVhclNjYWxlQWN0aW9uKCkKKwkJeworCQkJc3VwZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5MaW5lYXJUaW1lU2NhbGUiKSwgSUFjdGlvbi5BU19DSEVDS19CT1gpOworCQkJc2V0Q2hlY2tlZCh1c2VMaW5lYXJUaW1lU2NhbGUpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5MaW5lYXJUaW1lU2NhbGUiKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQlpZiAodXNlTGluZWFyVGltZVNjYWxlKSB7CisJCQkJc2V0Q2hlY2tlZCh0cnVlKTsKKwkJCQkvL05vdGhpbmcgdG8gZG8uIEl0J3MgYWxyZWFkeSBsaW5lYXItdGltZS4KKwkJCX0KKwkJCWVsc2UgeworCQkJCXRvZ2dsZUF4aXNTY2FsZSgpOworCQkJfQorCQkJZHJhdygpOworCQl9CisJfSAvL0xpbmVhclNjYWxlQWN0aW9uCisKKwkvKioKKwkgKiBzd2l0Y2ggdG8gc2VtaS1sb2cgcGxvdCAobG9nIHNjYWxlIG9uIHkgYXhpcykKKwkgKiAKKwkgKi8KKwljbGFzcyBMb2dTY2FsZUFjdGlvbiBleHRlbmRzIEFjdGlvbiAJeworCQlwdWJsaWMgTG9nU2NhbGVBY3Rpb24oKQorCQl7CisJCQlzdXBlcihNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbnRleHRNZW51LkxvZ1RpbWVTY2FsZSIpLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7CisJCQlzZXRDaGVja2VkKCF1c2VMaW5lYXJUaW1lU2NhbGUpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5Mb2dUaW1lU2NhbGUiKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQlpZiAoIXVzZUxpbmVhclRpbWVTY2FsZSkgeworCQkJCXNldENoZWNrZWQodHJ1ZSk7CisJCQkJLy9Ob3RoaW5nIHRvIGRvLiBJdCdzIGFscmVhZHkgbG9nLXRpbWUuCisJCQl9CisJCQllbHNlIHsKKwkJCQl0b2dnbGVBeGlzU2NhbGUoKTsKKwkJCX0KKwkJCWRyYXcoKTsKKwkJfQorCX0vL0xvZ1NjYWxlQWN0aW9uCisJCisJLyoqCisJICogRGlzcGxheWFibGVQcm9wZXJ0eQorCSAqCisJICovCisJcHJvdGVjdGVkIGNsYXNzIERpc3BsYXlhYmxlUHJvcGVydHkgZXh0ZW5kcyBBY3Rpb24KKwl7CisJCVN0cmluZyBwcm9wZXJ0eSA9IG51bGw7CisJCXB1YmxpYyBEaXNwbGF5YWJsZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSwgYm9vbGVhbiB2aXNpYmlsaXR5KQorCQl7CisJCQkJCXN1cGVyKHByb3BlcnR5LCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7CisJCQkJCXRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKwkJCQkJc2V0Q2hlY2tlZCh2aXNpYmlsaXR5KTsKKwkJfQorCQkKKwkKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI2dldFRleHQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJCXJldHVybiBwcm9wZXJ0eTsKKwkJfQorCisJCS8qKgorCQkgKiBUb2dnbGUgdGhlIHN0YXRlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlEYXRhU2VyaWVzIHNlcmllcyA9IGRhdGFTZXJpZXNNYXAuZ2V0KHByb3BlcnR5KTsKKwkJCQlzZXJpZXMudG9nZ2xlVmlzaWJsZSgpOworCQkJCWRhdGFTZXJpZXNNYXAucHV0KHByb3BlcnR5LHNlcmllcyk7CisJCQkJc2V0Q2hlY2tlZChzZXJpZXMuaXNWaXNpYmxlKCkpOworCQkJCWRyYXcoKTsKKwkJfQorCX0vLyBEaXNwbGF5YWJsZVByb3BlcnR5CisJCisJCisJLyoqCisJICogSW5uZXIgY2xhc3MgRGF0YVNlcmllcworCSAqIGFsbCB0aGUgZGF0YSBvYmplY3RzIGZvciBhIHBsb3QKKwkgKgorCSAqLworCXByb3RlY3RlZCBjbGFzcyBEYXRhU2VyaWVzIAorCXsKKwkJcHVibGljIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSAiIjsKKwkJCisJCXB1YmxpYyBMaXN0PERvdWJsZT4gcmVsYXRpdmVWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJcHVibGljIFNlcmllcyBsaW5lU2VyaWVzID0gbnVsbDsKKwkJcHJpdmF0ZSBib29sZWFuIHZpc2libGUgPSB0cnVlOworCQlwcml2YXRlIFNlcmllc0RlZmluaXRpb24gc2RZID0gbnVsbDsKKwkJcHJpdmF0ZSBib29sZWFuIG92ZXJsYXlNb2RlID0gZmFsc2U7CisJCQorCQkKKwkJcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworCQkJcmV0dXJuIHZpc2libGU7CisJCX0KKwkJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHN0YXRlKSB7CisJCQl2aXNpYmxlID0gc3RhdGU7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIHRvZ2dsZVZpc2libGUoKSB7CisJCQl2aXNpYmxlID0gIXZpc2libGU7CisJCX0KKworCQkvKioKKwkJICogCisJCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKwkJICogQHBhcmFtIG92ZXJsYXkgCisJCSAqLworCQlwdWJsaWMgRGF0YVNlcmllcyhTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIG92ZXJsYXkpIHsKKwkJCXRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworCQkJdGhpcy5vdmVybGF5TW9kZSA9IG92ZXJsYXk7CisJCQlyZWxhdGl2ZVZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJcmVsYXRpdmVWYWx1ZXMuYWRkKG5ldyBEb3VibGUoMC4wKSk7CisJCQlhZGRMaW5lU2VyaWVzKHByb3BlcnR5TmFtZSk7CisJCQkvLyBmb3IgdGhlIEFnZ3JlZ2F0ZVRpbWVTZXJpZXMgQ2FudmFzLCBieSBkZWZhdWx0CisJCQkvLyB3ZSB3aWxsIHN0YXJ0IHdpdGggb25seSB0aGUgcmVmZXJlbmNlIHNlcmllcyBhbmQgdGhlIEkgc2VyaWVzIHZpc2libGUKKwkJCWlmKCghKHRoaXMucHJvcGVydHlOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQWdncmVnYXRlVmFsdWVIaXN0b3J5UGxvdHRlci5SRUZFUkVOQ0VfUFJPUEVSVFkpKSkmJighdGhpcy5wcm9wZXJ0eU5hbWUuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1BST1BFUlRZKSkpIHsKKwkJCQl2aXNpYmxlID0gZmFsc2U7CisJCQl9CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIGFkZFZhbHVlKERvdWJsZSB2YWwpIHsKKwkJCWlmKHJlbGF0aXZlVmFsdWVzPT1udWxsKSByZWxhdGl2ZVZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJcmVsYXRpdmVWYWx1ZXMuYWRkKHZhbCk7CisJCX0KKwkJCisJCQorCQlwdWJsaWMgdm9pZCBhZGRWYWx1ZShpbnQgdGltZSwgRG91YmxlIHZhbCkgeworCQkJaWYocmVsYXRpdmVWYWx1ZXM9PW51bGwpIHJlbGF0aXZlVmFsdWVzID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQlyZWxhdGl2ZVZhbHVlcy5hZGQodGltZSwgdmFsKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKwkJICogCisJCSAqLworCQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorCQlwdWJsaWMgdm9pZCBhZGRMaW5lU2VyaWVzKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJCQorCQkJZmluYWwgTnVtYmVyRGF0YVNldCBvcnRob1ZhbHVlcyA9IE51bWJlckRhdGFTZXRJbXBsCisJCQkJCS5jcmVhdGUocmVsYXRpdmVWYWx1ZXMpOworCQkJaWYobGluZVNlcmllcyA9PSBudWxsKSB7CisJCQkJbGluZVNlcmllcyA9IFNjYXR0ZXJTZXJpZXNJbXBsLmNyZWF0ZSgpOworCQkJCS8qCisJCQkJICogCisJCQkJICogQmFyIGNoYXJ0IHN0eWxlIGlzIHRvbyBzbG93IGZvciBnZW5lcmF0aW9uIG9mIGEgZmlsbAorCQkJCSAqIGlmIHdlIHdhbnQgYSBmaWxsIHdlIGNhbiB0cnkgdXNpbmcgdGhlIGRpZmZlcmVuY2UgcGxvdAorCQkJCSAqIHRvIGEgc3RyYWlnaHQgbGluZSBhdCB5PTAKKwkJCQkgKiAKKwkJCQkKKwkJCQlpZihwcm9wZXJ0eU5hbWUuaW5kZXhPZigiKiIpPj0xKSB7CisJCQkJCS8vIGJhcnNlcmllcyBtZXRob2RzCisJCQkJCWxpbmVTZXJpZXMgPSAoQmFyU2VyaWVzKSBCYXJTZXJpZXNJbXBsLmNyZWF0ZSgpOworCQkJCX0gZWxzZSB7CisJCQkJCWxpbmVTZXJpZXMgPSAoU2NhdHRlclNlcmllcykgU2NhdHRlclNlcmllc0ltcGwuY3JlYXRlKCk7CisJCQkJfQorCQkJCQorCQkJCSoKKwkJCQkqLworCQkJfSAvLyBpZiBsaW5lU2VyaWVzPT1udWxsCisJCQlsaW5lU2VyaWVzLnNldERhdGFTZXQob3J0aG9WYWx1ZXMpOworCQkJKChMaW5lU2VyaWVzKSBsaW5lU2VyaWVzKS5nZXRMaW5lQXR0cmlidXRlcygpLnNldFZpc2libGUodHJ1ZSk7CisJCQkKKwkJCS8vIHJlcGxhY2VzIGRlcHJlY2F0ZWQgY29kZTogbGluZVNlcmllcy5nZXRNYXJrZXIoKS5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCWlmICghKChMaW5lU2VyaWVzKSBsaW5lU2VyaWVzKS5nZXRNYXJrZXJzKCkuaXNFbXB0eSgpKSB7CisJCQkJTWFya2VyIG1hcmtlciA9ICgoTGluZVNlcmllcykgbGluZVNlcmllcykuZ2V0TWFya2VycygpLmdldCgwKTsKKwkJCQltYXJrZXIuc2V0VmlzaWJsZShmYWxzZSk7CisJCQl9CisJCQkKKwkJCS8vIEFzc2lnbiB0aGUgbGluZSBjb2xvcgorCQkJLy8gYmFzZWQgb24gc2VsZWN0ZWQgcHJvcGVydHkuIERlZmF1bHQgaXMgQmx1ZQorCQkJc2V0Q29sb3JEZWZzKHByb3BlcnR5TmFtZSk7CisJCQkvLyBJZiB0aGlzIGlzIHRoZSAic2VsZWN0ZWQiIHJlZ2lvbiBvZiBhIGdyYXBoIHNldCB0aGUgbWFya2VyIHR5cGUKKwkJCisJCQkvLyB0aGUgc2VyaWVzIGRlZgorCQkJc2RZID0gU2VyaWVzRGVmaW5pdGlvbkltcGwuY3JlYXRlKCk7CisJCQlzZFkuZ2V0U2VyaWVzUGFsZXR0ZSgpLnVwZGF0ZSgtMik7CisJCQlzZFkuZ2V0U2VyaWVzKCkuYWRkKGxpbmVTZXJpZXMpOworCQkJeUF4aXNQcmltYXJ5LmdldFNlcmllc0RlZmluaXRpb25zKCkuYWRkKHNkWSk7CisJCQkKKwkJCXJldHVybjsKKwkJfS8vIGFkZExpbmVTZXJpZXMKKwkJCisJCS8qKiAKKwkJICogaW4gcmVzcG9uc2UgdG8gdXNlciBhY3Rpb24gdGVtcG9yYXJpbHkgcmVtb3ZlIHRoZSBsaW5lIHNlcmllcyBmcm9tIHRoZSBncmFwaAorCQkgKi8KKwkJcHVibGljIHZvaWQgaGlkZSgpIHsKKwkJCWxpbmVTZXJpZXMuc2V0VmlzaWJsZShmYWxzZSk7CisJCQl2aXNpYmxlID0gZmFsc2U7CisJCX0vLyBoaWRlCisJCQorCQkvKiogCisJCSAqIGluIHJlc3BvbnNlIHRvIHVzZXIgYWN0aW9uIGFkZCBiYWNrIHRoZSBsaW5lIHNlcmllcyB0byB0aGUgZ3JhcGgKKwkJICovCisJCXB1YmxpYyB2b2lkIHNob3coKSB7CisJCQlsaW5lU2VyaWVzLnNldFZpc2libGUodHJ1ZSk7CisJCQl2aXNpYmxlID0gdHJ1ZTsKKwkJfS8vIHNob3cKKwkJCisKKwkJLyoqCisJCSAqIFNldHMgdGhlIGNvbG9ycyBmb3IgYSBuIGFycmF5IG9mIExpbmVTZXJpZXMgZ2l2ZW4gdGhlIHByb3BlcnR5IHRvIFBsb3QKKwkJICogZm9yIGVhY2guIFRyeSB0byBzZXQgY29sb3IgZnJvbSB0aGUgcHJlZmVyZW5jZXMgKGlmIHNwZWNpZmllZCBmb3IgdGhhdAorCQkgKiBwcm9wZXJ0eSkgb3RoZXJ3aXNlIHNldHMgbGluZSBjb2xvciB0byBibHVlLgorCQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIAorCQkgKgorCQkgKi8KKwkJcHVibGljIHZvaWQgc2V0Q29sb3JEZWZzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJCS8vIHRoZSBkZWZhdWx0IGxpbmUgY29sb3IKKworCQkJLy8gaWYgcG9zc2libGUgZ2V0IGNvbG9yIGZyb20gcHJlZmVyZW5jZXMKKwkJCWZpbmFsIE1hcDxTdHJpbmcsIENvbG9yPiBjb2xvck1hcCA9IFZpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZS5nZXRDb2xvck1hcHBpbmcoKTsKKworCQkJLy8gZGVmYXVsdCBjb2xvcgorCQkJQ29sb3JEZWZpbml0aW9uIGNvbG9yID0gQ29sb3JEZWZpbml0aW9uSW1wbC5XSElURSgpOworCisJCQkvLyBwcmVmZXJyZWQgY29sb3IgYnkgbmFtZQorCQkJU3RyaW5nIGtleSA9IHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwxKTsKKwkJCQorCQkJaWYgKGNvbG9yTWFwLmNvbnRhaW5zS2V5KGtleSkpIHsKKwkJCQlmaW5hbCBDb2xvciBjID0gY29sb3JNYXAuZ2V0KGtleSk7CisJCQkJY29sb3IgPSBDb2xvckRlZmluaXRpb25JbXBsLmNyZWF0ZShjLmdldFJlZCgpLCBjLmdldEdyZWVuKCksIGMuZ2V0Qmx1ZSgpKTsKKwkJCX0KKwkJCQorCQkJdGhpcy5saW5lU2VyaWVzLnNldFNlcmllc0lkZW50aWZpZXIocHJvcGVydHlOYW1lKTsKKwkJCWlmIChvdmVybGF5TW9kZSkgeworCQkJCWlmKHByb3BlcnR5TmFtZS5pbmRleE9mKCIqIik+PTEpIHsKKwkJCQkJLy8gYmFyc2VyaWVzIG1ldGhvZHMKKwkJCQkJKChMaW5lU2VyaWVzKXRoaXMubGluZVNlcmllcykuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRDb2xvcihjb2xvcik7CisJCQkJfSBlbHNlIHsKKwkJCQkJKChMaW5lU2VyaWVzKXRoaXMubGluZVNlcmllcykuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRDb2xvcihDb2xvckRlZmluaXRpb25JbXBsLkdSRVkoKSk7CisJCQkJCSgoTGluZVNlcmllcyl0aGlzLmxpbmVTZXJpZXMpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0U3R5bGUoTGluZVN0eWxlLkRPVFRFRF9MSVRFUkFMKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCSgoTGluZVNlcmllcyl0aGlzLmxpbmVTZXJpZXMpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoY29sb3IpOworCQkJfQorCQkJCisJCQkKKwkJfS8vIGdldENvbG9yRGVmcworCisJCS8qKgorCQkgKiBsZW5ndGggb2YgdGhlIHNlcmllcworCQkgKiBAcmV0dXJuIG51bWJlciBvZiBkYXRhIHBvaW50cworCQkgKi8KKwkJcHVibGljIGludCBnZXREYXRhU2l6ZSgpIHsKKwkJCXJldHVybiByZWxhdGl2ZVZhbHVlcy5zaXplKCk7CisJCX0KKwkJLy8gQWNjZXNzb3JzCisJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgeworCQkJcmV0dXJuIHByb3BlcnR5TmFtZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKwkJfQorCisJCXB1YmxpYyBMaXN0PERvdWJsZT4gZ2V0UmVsYXRpdmVWYWx1ZXMoKSB7CisJCQlyZXR1cm4gcmVsYXRpdmVWYWx1ZXM7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRSZWxhdGl2ZVZhbHVlcyhMaXN0PERvdWJsZT4gcmVsYXRpdmVWYWx1ZXMpIHsKKwkJCXRoaXMucmVsYXRpdmVWYWx1ZXMgPSByZWxhdGl2ZVZhbHVlczsKKwkJfQorCisJCQorCisJCXB1YmxpYyB2b2lkIHNldExpbmVTZXJpZXMoTGluZVNlcmllcyBsaW5lU2VyaWVzKSB7CisJCQl0aGlzLmxpbmVTZXJpZXMgPSBsaW5lU2VyaWVzOworCQl9CisJfS8vIERhdGFTZXJpZXMKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQorfSAvLyBBZ2dyZWdhdGVUaW1lU2VyaWVzQ2FudmFzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9BZ2dyZWdhdGVUaW1lU2VyaWVzVmlldy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvQWdncmVnYXRlVGltZVNlcmllc1ZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTJhMmI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvQWdncmVnYXRlVGltZVNlcmllc1ZpZXcuamF2YQpAQCAtMCwwICsxLDk5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKKworLyoqCisgKiBUaGlzIHZpZXcgY29udGFpbnMgQklSVCBvdXRwdXQgdGhhdCBwbG90cyB2YWx1ZXMgb2YgdmFyaWFibGVzIGluIFNURU0KKyAqIHNpbXVsYXRpb25zLgorICovCisKK3B1YmxpYyBjbGFzcyBBZ2dyZWdhdGVUaW1lU2VyaWVzVmlldyBleHRlbmRzIFZpZXdQYXJ0IGltcGxlbWVudHMgSVNlbGVjdGlvbkxpc3RlbmVyIHsKKworCS8qKgorCSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBUaW1lIFNlcmllcyBWaWV3CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQUdHUkVHQVRFX1ZJRVcgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzLkFnZ3JlZ2F0ZVRpbWVTZXJpZXNWaWV3IjsgLy8kTk9OLU5MUy0xJAorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCS8vcHJpdmF0ZSBMaXN0PElkZW50aWZpYWJsZT4gc2VsZWN0ZWRJZGVudGlmaWFibGVzID0gbnVsbDsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGRlY29yYXRvciB0aGF0IGhhcyBiZWVuIHNlbGVjdGVkIGJ5IHRoZSBjb21ibyBib3guCisJICovCisJcHJvdGVjdGVkIERlY29yYXRvciBzZWxlY3RlZERlY29yYXRvcjsKKworCXByaXZhdGUgUmVwb3J0Vmlld2VyIHJlcG9ydFZpZXdlcjsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJcmVwb3J0Vmlld2VyID0gbmV3IFJlcG9ydFZpZXdlcihwYXJlbnQsIEFnZ3JlZ2F0ZVNlcmllc0ZhY3RvcnkuSU5TVEFOQ0UpOworCQlyZXBvcnRWaWV3ZXIuc2V0SW5wdXQoU2ltdWxhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpKTsKKworCQlnZXRTaXRlKCkuc2V0U2VsZWN0aW9uUHJvdmlkZXIocmVwb3J0Vmlld2VyKTsKKworCQkvLyBSZWdpc3RlciB3aXRoIHRoZSBTZWxlY3Rpb25TZXJ2aWNlCisJCWdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkKKwkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7CisKKwl9IC8vIGNyZWF0ZVBhcnRDb250cm9sCisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgQU5ZVEhJTkcgaXMgc2VsZWN0ZWQgaW4gdGhlIEVjbGlwc2UKKwkgKiB3b3JrYmVuY2guIEl0J3Mgam9iIGlzIHRvIGZpbHRlciBvdXQgc2VsZWN0aW9ucyBvZiBJU2ltdWxhdGlvbiBpbnN0YW5jZXMKKwkgKiBhbmQgdXBkYXRlIHRoZSBjaGFydCBpbiB0aGUgVGltZVNlcmllc0NhbnZhcworCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsCisJICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgSVdvcmtiZW5jaFBhcnQgcGFydCwKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQkvLyBOb3RoaW5nCisJfSAvLyBzZWxlY3Rpb25DaGFuZ2VkCisKKwkKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkKKwkJCQkucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7CisJfSAvLyBkaXNwb3NlCisKKwkvKioKKwkgKiBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBpbnRlcmZhY2UsIGJ1dCB3ZSdyZSBub3QgdXNpbmcgaXQuCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgeworCQkvLyBOb3RoaW5nCisJfSAvLyBzZXRGb2N1cworCit9IC8vIFRpbWVTZXJpZXNWaWV3CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9BZ2dyZWdhdGVWYWx1ZUhpc3RvcnlQbG90dGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9BZ2dyZWdhdGVWYWx1ZUhpc3RvcnlQbG90dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwNzQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL3ZpZXdzL0FnZ3JlZ2F0ZVZhbHVlSGlzdG9yeVBsb3R0ZXIuamF2YQpAQCAtMCwwICsxLDc2MiBAQAorLy8gUmVsYXRpdmVWYWx1ZUhpc3RvcnlQbG90dGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLmhpc3RvcnkuUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25MaXN0ZW5lclN5bmM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvblN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLk1vbml0b3JQcmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuUHJvcGVydHlTZWxlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuUHJvcGVydHlTZWxlY3Rvci5Qcm9wZXJ0eVNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIFNXVCBHVUkgY29tcG9uZW50IHRoYXQgdXNlcyBCSVJUIHRvIHBsb3QKKyAqLworcHVibGljIGNsYXNzIEFnZ3JlZ2F0ZVZhbHVlSGlzdG9yeVBsb3R0ZXIgZXh0ZW5kcyBSZXBvcnRDb250cm9sIGltcGxlbWVudHMgSVNpbXVsYXRpb25MaXN0ZW5lclN5bmMgeworCisJQWdncmVnYXRlVGltZVNlcmllc0NhbnZhcyBhZ2dyZWdhdGVTZXJpZXNDYW52YXM7CisJUHJvcGVydHlTZWxlY3RvciBwcm9wZXJ0eVNlbGVjdG9yOworCUxpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gc2VsZWN0ZWRQcm9wZXJ0aWVzOworCVNldDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBhbGxQcm9wZXJ0aWVzID0gbmV3IEhhc2hTZXQ8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4oKTsKKwlNYXA8U3RyaW5nLExpc3Q8RG91YmxlPj4gZGF0YU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxMaXN0PERvdWJsZT4+KCk7CisJCisJTGlzdDxEb3VibGU+IGFnZ3JlZ2F0ZVJlZmVyZW5jZSA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCVNldDxTdHJpbmc+IHJlZmVyZW5jZUlEcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwkKKwlTdHJpbmcgc2VsZWN0ZWRSZWZlcmVuY2VGaWxlOworCQorCUhhc2hNYXA8U3RyaW5nLCBTZXQ8UmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcj4+IHJlbGF0aXZlVmFsdWVQcm92aWRlclNldCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2V0PFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXI+PigpOworCUhhc2hNYXA8U3RyaW5nLCBEb3VibGU+IHRvdGFsUG9wdWxhdGlvbiA9IG5ldyBIYXNoTWFwPFN0cmluZywgRG91YmxlPigpOyAvLyBrZXkgaXMgcG9wdWxhdGlvbiBpZAorCS8qKgorCSAqIHRoaXMgc2ltdWxhdGlvbnMgZ3JhcGgKKwkgKi8KKwlHcmFwaCBncmFwaCA9IG51bGw7CisJaW50IHRpbWVDb3VudCA9IDA7CisJCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFX1BST1BFUlRZID0icmVmIjsKKwlTZXQ8SVNpbXVsYXRpb24+IGFjdGl2ZVNpbXVsYXRpb25zID0gbmV3IEhhc2hTZXQ8SVNpbXVsYXRpb24+KCk7CisJCisJU3RyaW5nIHBvcHVsYXRpb25JZDsKKwkKKwkvKioKKwkgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgc2VsZWN0IG91dCB0aGUgcHJvcGVydGllcworCSAqIHRvIGJlIGRpc3BsYXllZC4KKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5U2lldmUgeworCQkvKioKKwkJICogQHBhcmFtIGR5bmFtaWNMYWJlbAorCQkgKiAgICAgICAgICAgIHRoZSBsYWJlbCB0aGF0IGNvbnRhaW5zIHRoZSBjYW5kaWRhdGUgcHJvcGVydGllcyB0byBiZQorCQkgKiAgICAgICAgICAgIGRpc3BsYXllZC4KKwkJICogQHJldHVybiBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHRoZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlCisJCSAqICAgICAgICAgZGlzcGxheWVkIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgc2hvdWxkIGJlIGRpc3BsYXllZC4KKwkJICovCisJCUxpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gc2lldmUoZmluYWwgRHluYW1pY0xhYmVsIGR5bmFtaWNMYWJlbCk7CisJfSAvLyBQcm9wZXJ0eVNpZXZlCisKKwkvKioKKwkgKiBUaGlzIHNpZXZlIHNlbGVjdHMgYWxsIG9mIHRob3NlIHByb3BlcnRpZXMgdGhhdCBoYXZlIHJlbGF0aXZlIHZhbHVlcy4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIFByb3BlcnR5U2lldmUgcHJvcGVydHlTaWV2ZSA9IG5ldyBQcm9wZXJ0eVNpZXZlKCkgeworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuUHJvcGVydHlTZWxlY3Rvci5Qcm9wZXJ0eVNpZXZlI3NpZXZlKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWwpCisJCSAqLworCQlwdWJsaWMgTGlzdDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBzaWV2ZSgKKwkJCQlmaW5hbCBEeW5hbWljTGFiZWwgZHluYW1pY0xhYmVsKSB7CisJCQlmaW5hbCBMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yPigpOworCQkJZmluYWwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciBydnAgPSAoUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcikgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkJLmFkYXB0KGR5bmFtaWNMYWJlbCwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyLmNsYXNzKTsKKworCQkJLy8gRG9lcyB0aGUgbGFiZWwgaGF2ZSByZWxhdGl2ZSB2YWx1ZXM/CisJCQlpZiAocnZwICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQlydnAuc2V0VGFyZ2V0KGR5bmFtaWNMYWJlbCk7CisKKwkJCQlmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogcnZwLmdldFByb3BlcnRpZXMoKSkgeworCQkJCQlmaW5hbCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5ID0gKEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIGVsZW1lbnQ7CisJCQkJCXJldFZhbHVlLmFkZChwcm9wZXJ0eSk7CisJCQkJfSAvLyBmb3IgZWFjaCBwcm9wZXJ0eQorCQkJfSAvLyBpZiB0aGUgbGFiZWwgaGFzIHJlbGF0aXZlIHZhbHVlcworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIHNpZXZlCisJfTsKKworCS8qKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKi8KKwlwdWJsaWMgQWdncmVnYXRlVmFsdWVIaXN0b3J5UGxvdHRlcihmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgU1dULk5vbmUpOworCQlzaW11bGF0aW9uID0gbnVsbDsKKwkJZGF0YU1hcC5wdXQoUkVGRVJFTkNFX1BST1BFUlRZLCBhZ2dyZWdhdGVSZWZlcmVuY2UpOyAvLyBwdXQgemVyb3MgZm9yIG5vdworCQljcmVhdGVDb250ZW50cygpOworCX0gLy8gUmVsYXRpdmVWYWx1ZUhpc3RvcnlQbG90dGVyCisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBwbG90dGVyCisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgeworCQlzZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7CisJCXRpbWVDb3VudCA9IDA7CisJCWlkZW50aWZpYWJsZVRpdGxlID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKKwkJYWdncmVnYXRlU2VyaWVzQ2FudmFzID0gbmV3IEFnZ3JlZ2F0ZVRpbWVTZXJpZXNDYW52YXModGhpcyk7CisJCWFnZ3JlZ2F0ZVNlcmllc0NhbnZhcy5yZXNldCgpOworCQlwcm9wZXJ0eVNlbGVjdG9yID0gbmV3IFByb3BlcnR5U2VsZWN0b3IodGhpcywgU1dULk5PTkUsIHRydWUpOworCisJCQorCQlyZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5OT05FKTsKKwkJcmVtb3ZlQnV0dG9uLnNldFRleHQoUkVNT1ZFX1RFWFQpOworCQkKKwkJYWRkUmVmZXJlbmNlTGFiZWwgPSBuZXcgTGFiZWwodGhpcyxTV1QuQk9SREVSKTsKKwkJU3RyaW5nIHJlZkZpbGUgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhNb25pdG9yUHJlZmVyZW5jZXMuUkVGRVJFTkNFX0ZJTEVfS0VZKTsKKwkJaWYocmVmRmlsZSA9PSBudWxsKSByZWZGaWxlID0gIiI7CisJCXRoaXMuc2VsZWN0ZWRSZWZlcmVuY2VGaWxlID0gcmVmRmlsZTsKKwkJYWRkUmVmZXJlbmNlTGFiZWwuc2V0VGV4dChyZWZGaWxlKTsKKwkJCisJCWFkZFJlZmVyZW5jZUJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcywgU1dULk5PTkUpOworCQlhZGRSZWZlcmVuY2VCdXR0b24uc2V0VGV4dChBRERfUkVGRVJFTkNFX1RFWFQpOworCQlmaW5hbCBTaGVsbCBzaGVsbCA9IHRoaXMuZ2V0U2hlbGwoKTsKKwkJZmluYWwgQWdncmVnYXRlVmFsdWVIaXN0b3J5UGxvdHRlciBzZWxmID0gdGhpczsKKwkgICAgYWRkUmVmZXJlbmNlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJCWZpbmFsIFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlmaW5hbCBGaWxlRGlhbG9nIGRkID0gbmV3IEZpbGVEaWFsb2coCisJCQkJCQlzaGVsbCwgU1dULk9QRU4pOworCQkJCQlkZC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUkVQT1JUVklFVy5TRUxFQ1RSRUZFTkNFRk9MREVSIikpOyAvLyROT04tTkxTLTEkCisJCQkJCWRkLnNldEZpbHRlclBhdGgoYWRkUmVmZXJlbmNlTGFiZWwuZ2V0VGV4dCgpKTsKKwkJCQkJZmluYWwgU3RyaW5nIHNlbGVjdGVkID0gZGQub3BlbigpOworCQkJCQlzZWxmLnNlbGVjdGVkUmVmZXJlbmNlRmlsZSA9IHNlbGVjdGVkOworCQkJCQlhZGRSZWZlcmVuY2VMYWJlbC5zZXRUZXh0KHNlbGVjdGVkKTsKKwkJCQkJQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShNb25pdG9yUHJlZmVyZW5jZXMuUkVGRVJFTkNFX0ZJTEVfS0VZLCBzZWxlY3RlZCk7CisJCQkJCXRyeSB7CisJCQkJCQlBZ2dyZWdhdGVSZWZlcmVuY2VGaWxlTG9hZGVyIHJlZkxvYWRlciA9IG5ldyBBZ2dyZWdhdGVSZWZlcmVuY2VGaWxlTG9hZGVyKHNlbGVjdGVkKTsKKwkJCQkJCWFnZ3JlZ2F0ZVJlZmVyZW5jZSA9IHJlZkxvYWRlci5nZXRBZ2dyZWdhdGVEYXRhKCk7CisJCQkJCQlkYXRhTWFwLnB1dChSRUZFUkVOQ0VfUFJPUEVSVFksIGFnZ3JlZ2F0ZVJlZmVyZW5jZSk7CisJCQkJCQkvL3JlZmVyZW5jZUlEcyA9IHJlZkxvYWRlci5nZXRJZFNldCgpOworCQkJCQkJCisJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJlcnJvciAiK2V4KTsKKwkJCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOworCQkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKGV4LmdldE1lc3NhZ2UoKSwgZXgpOworCQkJCQl9CQorCQkJfQorCQl9KTsKKwkJCisJCQorCQlmaW5hbCBGb3JtRGF0YSB0aXRsZUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCWlkZW50aWZpYWJsZVRpdGxlLnNldExheW91dERhdGEodGl0bGVGb3JtRGF0YSk7CisJCXRpdGxlRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQl0aXRsZUZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXRpdGxlRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKworCQlmaW5hbCBGb3JtRGF0YSBjaGFydEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCWFnZ3JlZ2F0ZVNlcmllc0NhbnZhcy5zZXRMYXlvdXREYXRhKGNoYXJ0Rm9ybURhdGEpOworCQljaGFydEZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChpZGVudGlmaWFibGVUaXRsZSwgMCk7CisJCWNoYXJ0Rm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KHByb3BlcnR5U2VsZWN0b3IsIDApOworCQljaGFydEZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWNoYXJ0Rm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKworCQkvLyBQcm9wZXJ0eSBTZWxlY3RvcgorCQlmaW5hbCBGb3JtRGF0YSBwcm9wZXJ0eVNlbGVjdG9yRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJLy8gcHJvcGVydHlTZWxlY3RvckZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChhZ2dyZWdhdGVTZXJpZXNDYW52YXMsCisJCS8vIDApOworCQlwcm9wZXJ0eVNlbGVjdG9yRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCXByb3BlcnR5U2VsZWN0b3JGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlwcm9wZXJ0eVNlbGVjdG9yRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMzAsIDApOworCQlwcm9wZXJ0eVNlbGVjdG9yLnNldExheW91dERhdGEocHJvcGVydHlTZWxlY3RvckZvcm1EYXRhKTsKKworCQkvLyBSZW1vdmVCdXR0b24KKwkJZmluYWwgRm9ybURhdGEgcmVtb3ZlQnV0dG9uRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJcmVtb3ZlQnV0dG9uRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCXJlbW92ZUJ1dHRvbkZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHJvcGVydHlTZWxlY3RvciwgMCk7CisJCXJlbW92ZUJ1dHRvbkZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDYwLCAwKTsKKwkJcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEocmVtb3ZlQnV0dG9uRm9ybURhdGEpOworCQkKKwkJLy8gQWRkUmVmZXJlbmNlQnV0dG9uCisJCWZpbmFsIEZvcm1EYXRhIGFkZFJlZmVyZW5jZUJ1dHRvbkZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCWFkZFJlZmVyZW5jZUJ1dHRvbkZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChyZW1vdmVCdXR0b24sIDApOworCQlhZGRSZWZlcmVuY2VCdXR0b25Gb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHJlbW92ZUJ1dHRvbiwgMCk7CisJCWFkZFJlZmVyZW5jZUJ1dHRvbkZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCWFkZFJlZmVyZW5jZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGFkZFJlZmVyZW5jZUJ1dHRvbkZvcm1EYXRhKTsKKwkJCisJCS8vIEFkZFJlZmVyZW5jZUxhYmVsCisJCWZpbmFsIEZvcm1EYXRhIGFkZFJlZmVyZW5jZUxhYmVsRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJYWRkUmVmZXJlbmNlTGFiZWxGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkUmVmZXJlbmNlQnV0dG9uLCAwKTsKKwkJYWRkUmVmZXJlbmNlTGFiZWxGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHJlbW92ZUJ1dHRvbiwgMCk7CisJCWFkZFJlZmVyZW5jZUxhYmVsRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJYWRkUmVmZXJlbmNlTGFiZWwuc2V0TGF5b3V0RGF0YShhZGRSZWZlcmVuY2VMYWJlbEZvcm1EYXRhKTsKKworCQlwcm9wZXJ0eVNlbGVjdG9yCisJCQkJLmFkZFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIobmV3IFByb3BlcnR5U2VsZWN0b3IuUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKworCQkJCQkvKioKKwkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuUHJvcGVydHlTZWxlY3Rvci5Qcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyI3Byb3BlcnR5U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3RlbS51aS53aWRnZXRzLlByb3BlcnR5U2VsZWN0b3IuUHJvcGVydHlTZWxlY3Rpb25FdmVudCkKKwkJCQkJICovCisJCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5U2VsZWN0ZWQoCisJCQkJCQkJZmluYWwgUHJvcGVydHlTZWxlY3Rpb25FdmVudCBwcm9wZXJ0eVNlbGVjdGlvbkV2ZW50KSB7CisJCQkJCQlzZWxlY3RlZERlY29yYXRvciA9IHByb3BlcnR5U2VsZWN0aW9uRXZlbnQKKwkJCQkJCQkJLmdldERlY29yYXRvcigpOworCisJCQkJCQlzZWxlY3RlZFByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzVG9EaXNwbGF5KHNlbGVjdGVkRGVjb3JhdG9yKTsKKwkJCQkJCXBvcHVsYXRpb25JZCA9IHByb3BlcnR5U2VsZWN0aW9uRXZlbnQuZ2V0SWQoKTsKKwkJCQkJCQorCQkJCQl9CisJCQkJfSk7CisKKwkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCgKKwkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlmaXJlUmVtb3ZlRXZlbnQoaWRlbnRpZmlhYmxlKTsKKwkJCQlyZW1vdmUoKTsKKwkJCX0KKwkJfSk7CisKKwl9IC8vIGNyZWF0ZUNvbnRlbnRzCisKKwkvKioKKwkgKiB0byByZW1vdmUgdGhlIGNvbnRyb2wgZS5nLiBieSBhIHJlbW92ZSBidXR0b24gZXZlbnQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlAU3VwcHJlc3NXYXJuaW5ncygiY2FzdCIpCisJcHVibGljIHZvaWQgcmVtb3ZlKCkgeworCQlyZW1vdmVMaXN0ZW5lcnMuY2xlYXIoKTsKKwkJc3dpdGNoVG9SVkhQKG51bGwpOworCQlyZWxhdGl2ZVZhbHVlSGlzdG9yeUV4dGVuZGVkKG51bGwpOworCQlpZGVudGlmaWFibGVUaXRsZS5zZXRUZXh0KCIiKTsKKwkJcHJvcGVydHlTZWxlY3RvcgorCQkJCS5zZXREZWNvcmF0b3JzKChMaXN0PERlY29yYXRvcj4pIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOworCQlkaXNwb3NlKCk7CisJfQorCisJLyoqCisJICogU2V0dGluZyB0aGUge0BsaW5rIFNpbXVsYXRpb259IGhhcyB0aGUgc2lkZS1lZmZlY3Qgb2YgY2F1c2luZyB0aGUgY29udHJvbAorCSAqIHRvIHJlbW92ZSBpdHNlbGYgYXMgYSBsaXN0ZW5lciBmcm9tIGFueSBwcmV2aW91c2x5IHNldCB7QGxpbmsgU2ltdWxhdGlvbn0KKwkgKiBhbmQgYWRkaW5nIGl0c2VsZiBhcyBhIGxpc3RlbmVyIHRvIHRoZSBuZXcgb25lLiBJdCB3aWxsIGFsc28gY2F1c2UgdGhlCisJICogaW1hZ2UgdG8gYmUgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIG5ldyB7QGxpbmsgU2ltdWxhdGlvbn0KKwkgKiBhcyBhcHByb3ByaWF0ZS4KKwkgKiAKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbiB0aGUgc2ltdWxhdGlvbiB3aG9zZSBhZ2dyZWdhdGUgd2Ugd2lsbCBwbG90LgorCSAqLworCXB1YmxpYyBmaW5hbCB2b2lkIHNldFNpbXVsYXRpb24oZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbikgeworCQkvLyBBbnkgbmVlZCB0byBzd2l0Y2g/CisJCWlmICh0aGlzLnNpbXVsYXRpb24gPT0gc2ltdWxhdGlvbikgeworCQkJLy8gTm8KKwkJCXJldHVybjsKKwkJfSAvLyBpZiBubyBuZWVkIHRvIHN3aXRjaD8KKworCQkvLyBTaG91bGQgd2UgcmVtb3ZlIG91cnNlbHZlcyBhcyBsaXN0ZW5lcnMgZnJvbSB0aGUgY3VycmVudCBzaW11bGF0aW9uPworCQlpZiAodGhpcy5zaW11bGF0aW9uICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJdGhpcy5zaW11bGF0aW9uLnJlbW92ZVNpbXVsYXRpb25MaXN0ZW5lclN5bmModGhpcyk7CisJCX0KKworCQl0aGlzLnNpbXVsYXRpb24gPSBzaW11bGF0aW9uOworCisJCXNlbGVjdGlvbiA9IG51bGw7CisJCS8vIFdhcyB0aGVyZSBhIG5ldyBzaW11bGF0aW9uIHRvIHN3aXRjaCB0bz8KKwkJaWYgKHRoaXMuc2ltdWxhdGlvbiAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXRoaXMuc2ltdWxhdGlvbi5hZGRTaW11bGF0aW9uTGlzdGVuZXJTeW5jKHRoaXMpOworCQkJaW5pdGlhbGl6ZUZyb21TaW11bGF0aW9uKHRoaXMuc2ltdWxhdGlvbik7CisKKwkJCUFycmF5TGlzdDxEZWNvcmF0b3I+ZGVjb3JhdG9ycyA9IG5ldyBBcnJheUxpc3Q8RGVjb3JhdG9yPigpOworCQkJZm9yKERlY29yYXRvciBkOmdyYXBoLmdldERlY29yYXRvcnMoKSkKKwkJCQlpZihkIGluc3RhbmNlb2YgRGlzZWFzZU1vZGVsKWRlY29yYXRvcnMuYWRkKGQpOworCQkJcHJvcGVydHlTZWxlY3Rvci5zZXREZWNvcmF0b3JzKGRlY29yYXRvcnMpOworCQkJCisJCQkvLyBjb2xsZWN0IHRoZSBzZXQgb2YgcmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcnMgZnJvbSB0aGlzCisJCQkvLyBzaW11bGF0aW9uCisJCQkvLyAxLiBnZXQgdGhlIG5vZGVzCisJCQlNYXA8Tm9kZSwgSW50ZWdlcj4gbm9kZUxldmVsc01hcCA9IGdldE5vZGVMZXZlbHMoc2ltdWxhdGlvbik7CisKKwkJCS8vIDIuIGdldCB0aGUgbGV2ZWwgdG8gc3VtCisJCQlpbnQgbGV2ZWwgPSBnZXRIaWdoZXN0UmVzb2x1dGlvbihub2RlTGV2ZWxzTWFwKTsKKwkJCQorCQkJLy8gMy4gaXRlcmF0ZSBvdmVyIGFsbCB0aGUgbm9kZXMgYXQgdGhpcyBsZXZlbCBpbiB0aGUgbWFwIGFuZCBnZXQgYQorCQkJLy8gc2V0IG9mIHJlbGF0aXZlIHZhbHVlIHByb3ZpZGVycworCQkJSXRlcmF0b3I8Tm9kZT4gaXRlciA9IGdldE5vZGVJdGVyYXRvcihsZXZlbCwgbm9kZUxldmVsc01hcCk7CisJCQl3aGlsZSAoKGl0ZXIgIT0gbnVsbCkgJiYgKGl0ZXIuaGFzTmV4dCgpKSkgeworCQkJCU5vZGUgbm9kZSA9IGl0ZXIubmV4dCgpOworCQkJCUVMaXN0PE5vZGVMYWJlbD4gbGFiZWxzID0gbm9kZS5nZXRMYWJlbHMoKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxhYmVscy5zaXplKCk7ICsraSkgeworCQkJCQlOb2RlTGFiZWwgbGFiZWwgPSBsYWJlbHMuZ2V0KGkpOworCisJCQkJCWlmIChsYWJlbCBpbnN0YW5jZW9mIERpc2Vhc2VNb2RlbExhYmVsKSB7CisJCQkJCQlEaXNlYXNlTW9kZWxMYWJlbCBkeW5hbWljTGFiZWwgPSAoRGlzZWFzZU1vZGVsTGFiZWwpIGxhYmVsOworCQkJCQkJZmluYWwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciBydnAgPSAoUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcikgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkJCQkJLmFkYXB0KGR5bmFtaWNMYWJlbCwKKwkJCQkJCQkJCQlSZWxhdGl2ZVZhbHVlUHJvdmlkZXIuY2xhc3MpOworCQkJCQkJCisJCQkJCQkKKwkJCQkJCS8vIERvZXMgdGhlIGxhYmVsIGhhdmUgcmVsYXRpdmUgdmFsdWVzPworCQkJCQkJaWYgKHJ2cCAhPSBudWxsKSB7CisJCQkJCQkJLy8gWWVzCisJCQkJCQkJcnZwLnNldFRhcmdldChkeW5hbWljTGFiZWwpOworCQkJCQkJCQorCQkJCQkJCS8vIEdldCB0aGUgcG9wdWxhdGlvbiBpZGVudGlmaWVyIGZvciB0aGUgbGFiZWwKKwkJCQkJCQlTdHJpbmcgcG9wdWxhdGlvbklkZW50aWZpZXIgPSBkeW5hbWljTGFiZWwuZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpOworCQkJCQkJCWlmKHRvdGFsUG9wdWxhdGlvbi5nZXQocG9wdWxhdGlvbklkZW50aWZpZXIpICE9IG51bGwpCisJCQkJCQkJCXRvdGFsUG9wdWxhdGlvbi5wdXQocG9wdWxhdGlvbklkZW50aWZpZXIsIHRvdGFsUG9wdWxhdGlvbi5nZXQocG9wdWxhdGlvbklkZW50aWZpZXIpK3J2cC5nZXREZW5vbWluYXRvcihudWxsKSk7CisJCQkJCQkJZWxzZSB0b3RhbFBvcHVsYXRpb24ucHV0KHBvcHVsYXRpb25JZGVudGlmaWVyLCBydnAuZ2V0RGVub21pbmF0b3IobnVsbCkpOworCQkJCQkJCS8vIHJlbWVtYmVyIHRoaXMgcnZwIHRvIHVzZSBmb3IgYWdncmVnYXRpb24gbGF0ZXIKKwkJCQkJCQlpZihyZWxhdGl2ZVZhbHVlUHJvdmlkZXJTZXQuY29udGFpbnNLZXkocG9wdWxhdGlvbklkZW50aWZpZXIpKQorCQkJCQkJCQlyZWxhdGl2ZVZhbHVlUHJvdmlkZXJTZXQuZ2V0KHBvcHVsYXRpb25JZGVudGlmaWVyKS5hZGQocnZwKTsKKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJcmVsYXRpdmVWYWx1ZVByb3ZpZGVyU2V0LnB1dChwb3B1bGF0aW9uSWRlbnRpZmllciwgbmV3IEhhc2hTZXQ8UmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcj4oKSk7CisJCQkJCQkJCXJlbGF0aXZlVmFsdWVQcm92aWRlclNldC5nZXQocG9wdWxhdGlvbklkZW50aWZpZXIpLmFkZChydnApOworCQkJCQkJCX0KKwkJCQkJCQlmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogcnZwLmdldFByb3BlcnRpZXMoKSkgeworCQkJCQkJCQlmaW5hbCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5ID0gKEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIGVsZW1lbnQ7CisJCQkJCQkJCWFsbFByb3BlcnRpZXMuYWRkKHByb3BlcnR5KTsKKwkJCQkJCQl9IC8vIGZvciBlYWNoIHByb3BlcnR5CisKKwkJCQkJCX0vLyBpZiBydnAgIW51bGwKKworCQkJCQl9IC8vIGlmIGR5YW5taWNMYWJlbAorCQkJCX0vLyBGb3IgZWFjaCBub2RlIGxhYmVsCisJCQl9IC8vIHdoaWxlIGhhdmUgbm9kZXMKKwkJCQorCQkJZm9yKFN0cmluZyBwOnRvdGFsUG9wdWxhdGlvbi5rZXlTZXQoKSkKKwkJCQlpZih0b3RhbFBvcHVsYXRpb24uZ2V0KHApIDw9IDAuMCkgeworCQkJCQl0b3RhbFBvcHVsYXRpb24ucHV0KHAsIDEuMCk7CisJCQkJfQorCQl9IGVsc2UgeworCQkJLy8gTm8KKwkJCS8vIEp1c3QgZGlzcGxheSBhIGJsYW5rIHNjcmVlbgorCQkJLy9pbml0aWFsaXplRnJvbVNpbXVsYXRpb24obnVsbCk7CisJCQlyZWxhdGl2ZVZhbHVlUHJvdmlkZXJTZXQuY2xlYXIoKTsKKwkJCWFsbFByb3BlcnRpZXMuY2xlYXIoKTsKKwkJfQorCisJfSAvLyBzZXRTaW11bGF0aW9uCisKKwkKKwkvKioKKwkgKiBAcGFyYW0gaWRlbnRpZmlhYmxlCisJICogICAgICAgICAgICB0aGUge0BsaW5rIElkZW50aWZpYWJsZX0gdG8gYmUgdGhlIHNvdXJjZSBvZiB0aGUgZGF0YSB0byBiZQorCSAqICAgICAgICAgICAgcGxvdHRlZC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRJZGVudGlmaWFibGUoZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50aWZpYWJsZSkgeworCisJCS8vICBkbyBub3RoaW5nLiBBZ2dyZWdhdGUgdmFsdWVzIGFnZ3JlZ2F0ZSBvdmVyIGEgc2V0IG9mIGlkZW50aWZpYWJsZXMuCisJCS8vICBTZWUgc2ltdWxhdGlvbkNoYW5nZWRTeW5jCisJfSAvLyBzZXRJZGVudGlmaWFibGUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLmhpc3RvcnkuUmVsYXRpdmVWYWx1ZUhpc3RvcnlFeHRlbmRlZExpc3RlbmVyI3JlbGF0aXZlVmFsdWVIaXN0b3J5RXh0ZW5kZWQob3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLmhpc3RvcnkuUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXIpCisJICovCisJcHVibGljIHZvaWQgcmVsYXRpdmVWYWx1ZUhpc3RvcnlFeHRlbmRlZCgKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlciBydmhwKSB7CisJCS8vbm90IHVzZWQKKwl9IC8vIHJlbGF0aXZlVmFsdWVIaXN0b3J5RXh0ZW5kZWQKKworCS8qKgorCSAqIEluaXRpYWxpemUgdGhlIGNvbnRyb2wgZnJvbSBhCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259IGluc3RhbmNlLgorCSAqIAorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogICAgICAgICAgICB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259CisJICogICAgICAgICAgICB3aG9zZSBzdGF0ZSB3aWxsIGJlIHZpc3VhbGl6ZWQgaW4gdGhlIGNvbnRyb2wuCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb21TaW11bGF0aW9uKGZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb24pIHsKKwkJZ3JhcGggPSBzaW11bGF0aW9uLmdldFNjZW5hcmlvKCkuZ2V0Q2Fub25pY2FsR3JhcGgoKTsKKwkJLy90aW1lUHJvdmlkZXIgPSAoVGltZVByb3ZpZGVyKSBUaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChncmFwaCwgVGltZVByb3ZpZGVyLmNsYXNzKTsKKwkJdGltZUNvdW50ID0gMDsKKwkJcmVkcmF3KCk7CisJfSAvLyBpbml0aWFsaXplRnJvbVNpbXVsYXRpb24KKworCS8qKgorCSAqIAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlZnJlc2gyKCkgeworCQkvLyBub3RoaW5nCisJfSAvLyByZWZyZXNoMgorCQorCS8qKgorCSAqIFRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0byBwbG90CisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHByb3BlcnRpZXMKKwkgKi8KKwlwdWJsaWMgaW50IGdldE51bVByb3BlcnRpZXMoKSB7CisJCXJldHVybiBkYXRhTWFwLmtleVNldCgpLnNpemUoKTsKKwl9CisKKwkvKioKKwkgKiBUT0RPIGltcGxlbWVudCB0aGlzCisJICogQHBhcmFtIGluZGV4IAorCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHRvIHBsb3QKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KGludCBpbmRleCkgeworCQlPYmplY3RbXSBrZXlzID0gZGF0YU1hcC5rZXlTZXQoKS50b0FycmF5KCk7CisJCUFycmF5cy5zb3J0KGtleXMpOworCQlyZXR1cm4gKFN0cmluZykga2V5c1tpbmRleF07CisJfQorCQorCS8qKgorCSAqIFRPRE8gaW1wbGVtZW50IHRoaXMKKwkgKiBAcGFyYW0gcHJvcGVydHkgCisJICogQHJldHVybiB0aGUgYWdncmVnYXRlIHZhbHVlcyB0byBwbG90IGFzIGFuIGFycmF5IG9mIGRvdWJsZQorCSAqLworCXB1YmxpYyBkb3VibGVbXSBnZXRWYWx1ZXMoU3RyaW5nIHByb3BlcnR5KSB7CisJCWlmKHBvcHVsYXRpb25JZCA9PSBudWxsKSB7CisJCQlkb3VibGUgW10gcmV0ID0gbmV3IGRvdWJsZVsxXTsKKwkJCXJldFswXT0xOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlMaXN0PERvdWJsZT4gdmFsTGlzdCA9IGRhdGFNYXAuZ2V0KHByb3BlcnR5KTsKKwkJZG91YmxlW10gZGF0YSA9IG5ldyBkb3VibGVbdGltZUNvdW50XTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aW1lQ291bnQ7IGkgKyspIHsKKwkJCWlmICgodmFsTGlzdCE9bnVsbCkmJihpIDwgdmFsTGlzdC5zaXplKCkpICl7CisJCQkJZGF0YVtpXSA9IHZhbExpc3QuZ2V0KGkpLmRvdWJsZVZhbHVlKCk7CisJCQkJaWYocHJvcGVydHkuZXF1YWxzSWdub3JlQ2FzZShSRUZFUkVOQ0VfUFJPUEVSVFkpKSB7CQorCQkJCQlkYXRhW2ldIC89IHRvdGFsUG9wdWxhdGlvbi5nZXQocG9wdWxhdGlvbklkKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIG5ldmVyIGFkZCB6ZXJvIChuZWVkIG1pbiBub256ZXJvIHZhbHVlIGZvciBsb2cgZGlzcGxheSkKKwkJCQlkYXRhW2ldID0gMS4wL3RvdGFsUG9wdWxhdGlvbi5nZXQocG9wdWxhdGlvbklkKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZGF0YTsKKwl9CisKKwkKKwkvKioKKwkgKiBAcGFyYW0gZGVjb3JhdG9yCisJICogICAgICAgICAgICBhIHtAbGluayBEZWNvcmF0b3J9IHRoYXQgbW9kaWZpZXMgdGhlIHN0YXRlIG9mIHRoZSBjYW5vbmljYWwKKwkgKiAgICAgICAgICAgIHtAbGluayBHcmFwaH0gaW4gdGhlCisJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn0uCisJICogQHBhcmFtIHNpbXVsYXRpb24KKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn0KKwkgKiBAcmV0dXJuIGEge0BsaW5rIExpc3R9IG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB7QGxpbmsgRGVjb3JhdG9yfSB0aGF0CisJICogICAgICAgICBjYW4gc2hvdWxkIGJlIGRpc3BsYXllZC4KKwkgKi8KKwlMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnRpZXNUb0Rpc3BsYXkoCisJCQlmaW5hbCBEZWNvcmF0b3IgZGVjb3JhdG9yKSB7CisJCWZpbmFsIExpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcmV0VmFsdWUgPSBuZXcgQXJyYXlMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+KCk7CisJCS8vIEdvdCBEZWNvcmF0b3I/CisJCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQkvLyBBcmUgdGhlcmUgYW55IGxhYmVscyB0byB1cGRhdGU/CisJCQlpZiAoIWRlY29yYXRvci5nZXRMYWJlbHNUb1VwZGF0ZSgpLmlzRW1wdHkoKSkgeworCQkJCS8vIFllcworCQkJCS8vIFRoZSBmaXJzdCBvbmUgaXMgZ29vZCBlbm91Z2gKKwkJCQlyZXRWYWx1ZS5hZGRBbGwocHJvcGVydHlTaWV2ZS5zaWV2ZShkZWNvcmF0b3IKKwkJCQkJCS5nZXRMYWJlbHNUb1VwZGF0ZSgpLmdldCgwKSkpOworCQkJfSAvLyBpZiBsYWJlbHMgdG8gdXBkYXRlCisJCX0gLy8gaWYgZ290IGRlY29yYXRvcgorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRQcm9wZXJ0aWVzVG9EaXNwbGF5CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gbm9kZQorCSAqIEByZXR1cm4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwlwcml2YXRlIEdyYXBoIGdldEdyYXBoKGZpbmFsIE5vZGUgbm9kZSkgeworCQlyZXR1cm4gKEdyYXBoKSBub2RlLmVDb250YWluZXIoKS5lQ29udGFpbmVyKCk7CisJfSAvLyBnZXRHcmFwaAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbkxpc3RlbmVyU3luYyNzaW11bGF0aW9uQ2hhbmdlZFN5bmMob3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbkV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIHNpbXVsYXRpb25DaGFuZ2VkU3luYyhmaW5hbCBTaW11bGF0aW9uRXZlbnQgZXZlbnQpIHsKKwkJLy8gRGF0YSB0byBsb2cgPworCQkKKwkJaWYgKGV2ZW50LmdldFNpbXVsYXRpb25TdGF0ZSgpID09IFNpbXVsYXRpb25TdGF0ZS5SVU5OSU5HKSB7CisJCQkvLyBUaGUgc2ltdWxhdGlvbiBqdXN0IHN0YXJ0ZWQuIE1ha2Ugc3VyZSB3ZSBoYXZlIGRhdGEuIElmIG5vdCwgcmVsb2FkIGFnYWluCisJCQlpZih0aGlzLnNlbGVjdGVkUmVmZXJlbmNlRmlsZSA9PSBudWxsKQorCQkJCXRoaXMuc2VsZWN0ZWRSZWZlcmVuY2VGaWxlID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoTW9uaXRvclByZWZlcmVuY2VzLlJFRkVSRU5DRV9GSUxFX0tFWSk7CisJCQlpZihhZ2dyZWdhdGVSZWZlcmVuY2UgPT0gbnVsbCB8fCBhZ2dyZWdhdGVSZWZlcmVuY2Uuc2l6ZSgpID09IDApIHsgCisJCQkJdHJ5IHsgCisJCQkJCUFnZ3JlZ2F0ZVJlZmVyZW5jZUZpbGVMb2FkZXIgcmVmTG9hZGVyID0gbmV3IEFnZ3JlZ2F0ZVJlZmVyZW5jZUZpbGVMb2FkZXIodGhpcy5zZWxlY3RlZFJlZmVyZW5jZUZpbGUpOworCQkJCQlhZ2dyZWdhdGVSZWZlcmVuY2UgPSByZWZMb2FkZXIuZ2V0QWdncmVnYXRlRGF0YSgpOworCQkJCQlkYXRhTWFwLnB1dChSRUZFUkVOQ0VfUFJPUEVSVFksIGFnZ3JlZ2F0ZVJlZmVyZW5jZSk7CisJCQkJCXJlZmVyZW5jZUlEcyA9IHJlZkxvYWRlci5nZXRJZFNldCgpOworCQkJCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCQl9CisJCQl9CisvLwkJCWlmICgobG9nV3JpdGVyICE9IG51bGwpICYmIChsb2dXcml0ZXIubmVlZHNIZWFkZXIpKSB7CisvLwkJCQkvLyBUaGlzIHdpbGwgd3JpdGUgdGhlIGhlYWRlcnMgYW5kIHRoZSBmaXJzdCBsaW5lIG9mIGRhdGEgYmVmb3JlIGZpcnN0IGN5Y2xlCisvLwkJCQlsb2dXcml0ZXIubG9nSGVhZGVyKHRoaXMuc2ltdWxhdGlvbiwgdGhpcy5kaXNlYXNlTW9kZWwsIHRoaXMubm9kZUxldmVscywgdGltZVByb3ZpZGVyKTsKKy8vCQkJfQorCQl9IGVsc2UgaWYoZXZlbnQuZ2V0U2ltdWxhdGlvblN0YXRlKCkgPT0gU2ltdWxhdGlvblN0YXRlLkNPTVBMRVRFRF9DWUNMRSkgeworCQkJLy8gY3ljbGUgY29tcGxldGUKKwkJCXN1bURhdGEoKTsKKwkJCWFnZ3JlZ2F0ZVNlcmllc0NhbnZhcy5kcmF3KCk7CisJCQlyZWRyYXcoKTsKKwkJCXRpbWVDb3VudCArKzsKKwkJfSBlbHNlIAorCQkvLyBJcyB0aGUgU2ltdWxhdGlvbiBzdG9wcGluZyAoaS5lLiBiZWluZyBkZWxldGVkPykKKwkJaWYgKGV2ZW50LmdldFNpbXVsYXRpb25TdGF0ZSgpID09IFNpbXVsYXRpb25TdGF0ZS5TVE9QUEVEKSB7CisJCQkvLyBZZXMKKwkJCWlmKHNpbXVsYXRpb249PWV2ZW50LmdldFNpbXVsYXRpb24oKSkgeworCQkJCWFjdGl2ZVNpbXVsYXRpb25zLnJlbW92ZShzaW11bGF0aW9uKTsKKwkJCQlzaW11bGF0aW9uLnJlbW92ZVNpbXVsYXRpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQlzaW11bGF0aW9uLnJlbW92ZVNpbXVsYXRpb25MaXN0ZW5lclN5bmModGhpcyk7CisJCQkJc2ltdWxhdGlvbiA9IG51bGw7CisJCQkJaWRlbnRpZmlhYmxlVGl0bGUuc2V0VGV4dCgiIik7CisJCQkJcHJvcGVydHlTZWxlY3Rvci5zZXREZWNvcmF0b3JzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOworCQkJCXRpbWVDb3VudCA9IDA7CisJCQl9CisvLwkJCWRpc3Bvc2UoKTsKKwkJfSBlbHNlIGlmICgoc2ltdWxhdGlvbiA9PSBldmVudC5nZXRTaW11bGF0aW9uKCkpJiYoZXZlbnQuZ2V0U2ltdWxhdGlvblN0YXRlKCkgPT0gU2ltdWxhdGlvblN0YXRlLlJFU0VUKSkgeworCQkJLy8gWWVzCisJCQlhZ2dyZWdhdGVTZXJpZXNDYW52YXMucmVzZXREYXRhKCk7CisJCQl0aW1lQ291bnQgPSAwOworCQl9IC8vIGlmCisKKwl9IC8vIHNpbXVsYXRpb25DaGFuZ2VkU3luYworCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25MaXN0ZW5lciNzaW11bGF0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uRXZlbnQpCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoImNhc3QiKQorCXB1YmxpYyB2b2lkIHNpbXVsYXRpb25DaGFuZ2VkKGZpbmFsIFNpbXVsYXRpb25FdmVudCBldmVudCkgeworCQlpZiAoKHNpbXVsYXRpb24gPT0gZXZlbnQuZ2V0U2ltdWxhdGlvbigpKSYmKGV2ZW50LmdldFNpbXVsYXRpb25TdGF0ZSgpID09IFNpbXVsYXRpb25TdGF0ZS5SRVNFVCkpIHsKKwkJCS8vIFllcworCQkJYWdncmVnYXRlU2VyaWVzQ2FudmFzLnJlc2V0RGF0YSgpOworCQkJdGltZUNvdW50ID0gMDsKKwkJfSAvLyBpZgorCQkvLyBJcyB0aGUgU2ltdWxhdGlvbiBzdG9wcGluZyAoaS5lLiBiZWluZyBkZWxldGVkPykKKwkJaWYgKGV2ZW50LmdldFNpbXVsYXRpb25TdGF0ZSgpID09IFNpbXVsYXRpb25TdGF0ZS5TVE9QUEVEKSB7CisJCQkvLyBZZXMKKwkJCWlmKHNpbXVsYXRpb249PWV2ZW50LmdldFNpbXVsYXRpb24oKSkgeworCQkJCWFjdGl2ZVNpbXVsYXRpb25zLnJlbW92ZShzaW11bGF0aW9uKTsKKwkJCQlzaW11bGF0aW9uLnJlbW92ZVNpbXVsYXRpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQlzaW11bGF0aW9uLnJlbW92ZVNpbXVsYXRpb25MaXN0ZW5lclN5bmModGhpcyk7CisJCQkJc2ltdWxhdGlvbiA9IG51bGw7CisJCQkJaWRlbnRpZmlhYmxlVGl0bGUuc2V0VGV4dCgiIik7CisJCQkJcHJvcGVydHlTZWxlY3Rvci5zZXREZWNvcmF0b3JzKChMaXN0PERlY29yYXRvcj4pIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOworCQkJCXRpbWVDb3VudCA9IDA7CisJCQl9CisJCQkKKwkJfSAvLyBpZgorCQkKKwkJaWYgKGV2ZW50LmdldFNpbXVsYXRpb25TdGF0ZSgpID09IFNpbXVsYXRpb25TdGF0ZS5TVE9QUEVEKSB7CisJCQkvLyBZZXMKKwkJCWlmKHNpbXVsYXRpb249PWV2ZW50LmdldFNpbXVsYXRpb24oKSkgeworCQkJCWFjdGl2ZVNpbXVsYXRpb25zLnJlbW92ZShzaW11bGF0aW9uKTsKKwkJCQlzaW11bGF0aW9uLnJlbW92ZVNpbXVsYXRpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQlzaW11bGF0aW9uLnJlbW92ZVNpbXVsYXRpb25MaXN0ZW5lclN5bmModGhpcyk7CisJCQkJc2ltdWxhdGlvbiA9IG51bGw7CisJCQkJaWRlbnRpZmlhYmxlVGl0bGUuc2V0VGV4dCgiIik7CisJCQkJcHJvcGVydHlTZWxlY3Rvci5zZXREZWNvcmF0b3JzKChMaXN0PERlY29yYXRvcj4pIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOworCQkJCXRpbWVDb3VudCA9IDA7CisJCQl9CisJCQkKKwkJfSAvLyBpZgorCisJfSAvLyBzaW11bGF0aW9uQ2hhbmdlZAorCisKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0I2Rpc3Bvc2UoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwkJaWYgKHRoaXMucnZocCAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXJ2aHAucmVtb3ZlRXh0ZW5zaW9uTGlzdGVuZXIodGhpcyk7CisJCX0gLy8gaWYKKwkJaWYgKHNpbXVsYXRpb24gIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlzaW11bGF0aW9uLnJlbW92ZVNpbXVsYXRpb25MaXN0ZW5lcih0aGlzKTsKKwkJfSAvLyBpZgorCX0gLy8gZGlzcG9zZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMudmlld3MuUmVwb3J0Q29udHJvbCNnZXRJZGVudGlmaWFibGUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJZGVudGlmaWFibGUgZ2V0SWRlbnRpZmlhYmxlKCkgeworCQkvLyBUaGlzIHJlcG9ydCBjb250cm9sIGlzIGxpbmtlZCB0byBhIHNpbXVsYXRpb24gTk9UIHRvIGFuIGlkZW50aWZpYWJsZQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIENvbnRyb2wgaXMgYXNzb2NpYXRlZCB3aXRoIGEgU2ltdWxhdGlvbgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzLlJlcG9ydENvbnRyb2wjZ2V0Q29udHJvbFR5cGUoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29udHJvbFR5cGUoKSB7CisJCXJldHVybiBSZXBvcnRDb250cm9sRmFjdG9yeS5TSU1VTEFUSU9OX1RZUEU7CisJfQorCQorCQorCisJLyoqCisJICogTXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWdncmVnYXRlIGRhdGEgaW4gcnVuIHRocmVhZAorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHN1bURhdGEoKSB7CisJCQorCQlJdGVyYXRvcjxJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBpdGVyID0gYWxsUHJvcGVydGllcy5pdGVyYXRvcigpOworCQl3aGlsZSgoaXRlciE9bnVsbCkmJihpdGVyLmhhc05leHQoKSkpIHsKKwkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkgPSBpdGVyLm5leHQoKTsKKwkJCVN0cmluZyBwcm9wZXJ0eUtleSA9IHByb3BlcnR5LmdldERpc3BsYXlOYW1lKHByb3BlcnR5KTsKKwkJCWlmKCFkYXRhTWFwLmNvbnRhaW5zS2V5KHByb3BlcnR5S2V5KSkgeworCQkJCUxpc3Q8RG91YmxlPiBuZXdEYXRhID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQkJLy8ganVzdCBpbiBjYXNlLCBwb3B1bGF0ZSB0aGUgZGF0YSBsaXN0CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aW1lQ291bnQ7IGkgKyspIHsKKwkJCQkJbmV3RGF0YS5hZGQoaSxuZXcgRG91YmxlKDAuMCkpOworCQkJCX0KKwkJCQlkYXRhTWFwLnB1dChwcm9wZXJ0eUtleSxuZXdEYXRhKTsKKwkJCX0KKwkJCQorCQkJLy8gbm93IGxvb3AgdGhyb3VnaCBhbGwgbm9kZXMgYW5kIGludGVncmF0ZSB0aGUgZGF0YSBmb3IgdGhpcyBwcm9wZXJ0eQorCQkJZG91YmxlIHRvdFBvcCA9IDAuMDsKKwkJCWRvdWJsZSBzdW0gPSAwLjA7CisJCQlpZihyZWxhdGl2ZVZhbHVlUHJvdmlkZXJTZXQuZ2V0KHBvcHVsYXRpb25JZCkgIT0gbnVsbCkgeworCQkJCUl0ZXJhdG9yPFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXI+IGl0ZXIyID0gcmVsYXRpdmVWYWx1ZVByb3ZpZGVyU2V0LmdldChwb3B1bGF0aW9uSWQpLml0ZXJhdG9yKCk7CisJCQkJd2hpbGUoKGl0ZXIyICE9bnVsbCkgJiYgKGl0ZXIyLmhhc05leHQoKSkpIHsKKwkJCQkJUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciBydnAgPSBpdGVyMi5uZXh0KCk7CisJCQkJCWRvdWJsZSBub2RlUG9wdWxhdGlvbiA9IHJ2cC5nZXREZW5vbWluYXRvcihudWxsKTsKKwkJCQkJdG90UG9wICs9IG5vZGVQb3B1bGF0aW9uOworCQkJCQlzdW0gKz0gKG5vZGVQb3B1bGF0aW9uICogcnZwLmdldFJlbGF0aXZlVmFsdWUocHJvcGVydHkpKTsKKwkJCQl9CisJCQl9CisJCQlpZih0b3RQb3A8PSAwLjApIHRvdFBvcCA9IDEuMDsgLy8gYXZvaWQgZGl2aWRlIGJ5IHplcm9zCisJCQl0b3RhbFBvcHVsYXRpb24ucHV0KHBvcHVsYXRpb25JZCwgdG90UG9wKTsKKwkJCWFnZ3JlZ2F0ZVNlcmllc0NhbnZhcy5zZXRNaW5Zc2NhbGUoMS4wL3RvdGFsUG9wdWxhdGlvbi5nZXQocG9wdWxhdGlvbklkKSk7CisJCQlzdW0gLz0gdG90UG9wOworCQkJTGlzdDxEb3VibGU+IGFnZ3JlZ2F0ZUxpc3QgPSBkYXRhTWFwLmdldChwcm9wZXJ0eUtleSk7CisJCQkvLyBhZGQgdGhlIG5ldyBkYXRhIHBvaW50CisJCQlhZ2dyZWdhdGVMaXN0LmFkZCh0aW1lQ291bnQsbmV3IERvdWJsZShzdW0pKTsKKwkJCWRhdGFNYXAucHV0KHByb3BlcnR5S2V5LCBhZ2dyZWdhdGVMaXN0KTsKKwkJfQorCX0vLyBzdW1kYXRhCisJCisJCisJCisJLyoqCisJICogCisJICogQHBhcmFtIG5vZGVMZXZlbHMKKwkgKiBAcmV0dXJuIGhpZ2hlc3QgcmVzb2x1dGlvbiBsZXZlbCBpbiBtYXAKKwkgKi8KKwlwcml2YXRlIGludCBnZXRIaWdoZXN0UmVzb2x1dGlvbihNYXA8Tm9kZSwgSW50ZWdlcj5ub2RlTGV2ZWxzKSB7CisJCWludCByZXRWYWwgPSAtMTsKKwkJQ29sbGVjdGlvbjxJbnRlZ2VyPnZhbHMgPSBub2RlTGV2ZWxzLnZhbHVlcygpOworCQlmb3IoaW50IGxldmVsOnZhbHMpIHsKKwkJCWlmKGxldmVsID49IHJldFZhbCkgcmV0VmFsID0gbGV2ZWw7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisKKwkKKwkvKgorCSAqIFJldHVybiBhbGwgbm9kZXMgYXQgdGhlIHNhbWUgbGV2ZWwKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKKwlwcml2YXRlIEl0ZXJhdG9yPE5vZGU+IGdldE5vZGVJdGVyYXRvcihpbnQgbGV2ZWwsIE1hcDxOb2RlLCBJbnRlZ2VyPm5vZGVMZXZlbHMpIHsKKwkJQXJyYXlMaXN0PE5vZGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCS8vU2V0PE5vZGU+bnMgPSBub2RlTGV2ZWxzLmtleVNldCgpOworCQkvL2ZvcihOb2RlIG46bnMpIHsKKwkJZm9yIChFbnRyeTxOb2RlLEludGVnZXI+IGVudHJ5IDogbm9kZUxldmVscy5lbnRyeVNldCgpKSB7CisJCQlpZihlbnRyeS5nZXRWYWx1ZSgpID09IGxldmVsKSB7CisJCQkJbGlzdC5hZGQoZW50cnkuZ2V0S2V5KCkpOworCQkJfQorCQl9CisJCXJldHVybiBsaXN0Lml0ZXJhdG9yKCk7CisJfQorCQorCQorCQorCS8qKgorCSAqIFJldHVybiBhbGwgbm9kZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgbGV2ZWwuIFdlIHVzZSB0aGlzIHRvIGxvZyBkYXRhIHVzaW5nIAorCSAqIGRpZmZlcmVudCByZXNvbHV0aW9ucy4KKwkgKiAKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbgorCSAqIEByZXR1cm4gTWFwIHdpdGggbm9kZSBhbmQgbGV2ZWwKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKKwlwdWJsaWMgTWFwPE5vZGUsIEludGVnZXI+IGdldE5vZGVMZXZlbHMoSVNpbXVsYXRpb24gc2ltdWxhdGlvbikgeworCQlNYXA8Tm9kZSwgSW50ZWdlcj4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8Tm9kZSwgSW50ZWdlcj4oKTsKKwkJZmluYWwgR3JhcGggZ3JhcGggPSBzaW11bGF0aW9uLmdldFNjZW5hcmlvKCkuZ2V0Q2Fub25pY2FsR3JhcGgoKTsKKwkJaWYgKGdyYXBoICE9IG51bGwpIHsKKwkJCWZpbmFsIEVNYXA8VVJJLE5vZGU+IGFsbE5vZGVzID0gZ3JhcGguZ2V0Tm9kZXMoKTsKKwkJCWZpbmFsIFNldDxVUkk+IGFsbEdyYXBoVVJJcyA9IGFsbE5vZGVzLmtleVNldCgpOworCQkgICAgSXRlcmF0b3I8VVJJPiBncmFwaEl0ZXIyID0gYWxsR3JhcGhVUklzLml0ZXJhdG9yKCk7CisJCSAgCisJCSAgICB3aGlsZSgoZ3JhcGhJdGVyMiE9bnVsbCkmJihncmFwaEl0ZXIyLmhhc05leHQoKSkpIHsKKwkJICAgIAlVUkkgdXJpID0gZ3JhcGhJdGVyMi5uZXh0KCk7CisJCSAgICAJTm9kZSBub2RlID0gYWxsTm9kZXMuZ2V0KHVyaSk7CisJCSAgICAJU3RyaW5nIGlkID0gIG5vZGUuZ2V0VVJJKCkudG9TdHJpbmcoKTsKKwkJICAgIAlpbnQgbGV2ZWwgPSBnZXRBZG1pbkxldmVsKGlkKTsKKwkJICAgIAlyZXN1bHQucHV0KG5vZGUsIGxldmVsKTsKKwkJICAgIH0KKwkJfSAvLyBncmFwaCBub3QgbnVsbAorCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKworCXByaXZhdGUgaW50IGdldEFkbWluTGV2ZWwoU3RyaW5nIHVyaUtleSkgeworCQlpbnQgcmV0VmFsID0gMDsKKwkJU3RyaW5nIHRlc3QgPSB1cmlLZXk7CisJCXdoaWxlKHRlc3QuY29udGFpbnMoIi0iKSkgeworCQkJcmV0VmFsICsrOworCQkJaW50IGlkeDEgPSB0ZXN0LmluZGV4T2YoIi0iKTsKKwkJCVN0cmluZyB0ZXN0MiA9IHRlc3Quc3Vic3RyaW5nKGlkeDErMSwgdGVzdC5sZW5ndGgoKSk7CisJCQl0ZXN0ID0gdGVzdDI7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCit9IC8vIFJlbGF0aXZlVmFsdWVIaXN0b3J5UGxvdHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvSVJlbW92ZUxpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9JUmVtb3ZlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2M4Y2QxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvSVJlbW92ZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwyOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CisKKy8qKgorICogV2hlbiB0aGUgcmVtb3ZlIGJ1dHRvbiBpcyBwcmVzc2VkIGJ5IHRoZSB1c2VyCisgKiBAYXV0aG9yIEphbWVzCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIElSZW1vdmVMaXN0ZW5lciB7CisJLyoqCisJICogCisJICogQHBhcmFtIGlkZW50aWZpYWJsZQorCSAqLworCXZvaWQgaWRlbnRpZmlhYmxlUmVtb3ZlZChJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlKSA7CisJCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL3ZpZXdzL01lc3NhZ2VzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9NZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MGIxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9NZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8vIE1lc3NhZ2VzLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cworICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZXMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMudmlld3MubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQorCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7CisKKwlwcml2YXRlIE1lc3NhZ2VzKCkgeworCQkvLyBOb3RoaW5nCisJfQorCisJLyoqCisJICogQHBhcmFtIGtleQorCSAqIEByZXR1cm4gdGhlIHN0cmluZyBtYXRjaGluZyB0aGUga2V5CisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKGZpbmFsIFN0cmluZyBrZXkpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7CisJCX0gY2F0Y2ggKGZpbmFsIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOworCQl9CisJfQorfSAvLyBNZXNzYWdlcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvUGhhc2VTcGFjZUNhbnZhcy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvUGhhc2VTcGFjZUNhbnZhcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNjJiNWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9QaGFzZVNwYWNlQ2FudmFzLmphdmEKQEAgLTAsMCArMSw2MzAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmRldmljZS5JRGV2aWNlUmVuZGVyZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5leGNlcHRpb24uQ2hhcnRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5mYWN0b3J5LkdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLkNoYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuQ2hhcnRXaXRoQXhlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5BeGlzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5Cb3VuZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuSW50ZXJzZWN0aW9uVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5NYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuVGlja1N0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLmltcGwuQm91bmRzSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5pbXBsLkNvbG9yRGVmaW5pdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5jb21wb25lbnQuQXhpczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmNvbXBvbmVudC5TZXJpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5jb21wb25lbnQuaW1wbC5TZXJpZXNJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuZGF0YS5OdW1iZXJEYXRhU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuZGF0YS5TZXJpZXNEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuZGF0YS5pbXBsLk51bWJlckRhdGFFbGVtZW50SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuaW1wbC5OdW1iZXJEYXRhU2V0SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuaW1wbC5TZXJpZXNEZWZpbml0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmltcGwuQ2hhcnRXaXRoQXhlc0ltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5sYXlvdXQuTGVnZW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwubGF5b3V0LlBsb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC50eXBlLlNjYXR0ZXJTZXJpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC50eXBlLmltcGwuU2NhdHRlclNlcmllc0ltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC51dGlsLlBsdWdpblNldHRpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLmhpc3RvcnkuUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeS5SZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOworCisvKioKKyAqIFRpbWVTZXJpZXNDYW52YXMgaXMgYSBzdWJjbGFzcyBvZiBDYW52YXMgc3VpdGFibGUgZm9yIGNoYXJ0IGRyYXdpbmdzLgorICovCitwdWJsaWMgY2xhc3MgUGhhc2VTcGFjZUNhbnZhcyBleHRlbmRzIENhbnZhcyB7CisKKwlwcm90ZWN0ZWQgSURldmljZVJlbmRlcmVyIGlkciA9IG51bGw7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSA8Y29kZT5DaGFydDwvY29kZT4gdGhhdCBwbG90cyB0aGUgcmVsYXRpdmUgdmFsdWVzLgorCSAqLworCXByb3RlY3RlZCBDaGFydCBjbSA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgcHJvdmlkZXIgb2YgcmVsYXRpdmUgdmFsdWVzLgorCSAqLworCXByaXZhdGUgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlciBydmhwOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgcHJvcGVydHkgb2YgdGhlIGxhYmVsIHVwZGF0ZWQgYnkgdGhlIHNlbGVjdGVkIGRlY29yYXRvciB3aG9zZQorCSAqIHJlbGF0aXZlIHZhbHVlIHdpbGwgYmUgcGxvdHRlZCBhbG9uZyBYCisJICovCisJcHJpdmF0ZSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5VG9QbG90WDsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHByb3BlcnR5IG9mIHRoZSBsYWJlbCB1cGRhdGVkIGJ5IHRoZSBzZWxlY3RlZCBkZWNvcmF0b3Igd2hvc2UKKwkgKiByZWxhdGl2ZSB2YWx1ZSB3aWxsIGJlIHBsb3R0ZWQgYWxvbmcgWQorCSAqLworCXByaXZhdGUgSXRlbVByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eVRvUGxvdFk7CisKKwkvKioKKwkgKiBUaGVzZSBhcmUgdGhlIHZhbHVlcyB0aGF0IHdpbGwgYmUgcGxvdHRlZCBpbiBYCisJICogCisJICovCisJcHJpdmF0ZSBmaW5hbCBMaXN0PERvdWJsZT4gcmVsYXRpdmVWYWx1ZXNYID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisKKwkvKioKKwkgKiBUaGVzZSBhcmUgdGhlIHZhbHVlcyB0aGF0IHdpbGwgYmUgcGxvdHRlZCBpbiBZCisJICogCisJICovCisJcHJpdmF0ZSBmaW5hbCBMaXN0PERvdWJsZT4gcmVsYXRpdmVWYWx1ZXNZID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCisJLyoqCisJICogTG9nIG9mIHplcm8gaXMgbmVnYXRpdmUgaW5maW5pdHkgc28gZm9yIGVhY2ggbG9jYXRpb24gd2Ugd2lsbCBjdXQgb2ZmIHRoZSBtaW5pbXVtIHZhbHVlCisJICogb2YgbG9nKHkpIG9yIGxvZyh4KSBhdCAwLjUvUE9QVUxBVElPTiBmb3IgZGlzcGxheSBwdXJwb3NlcyBvbmx5CisJICovCisJcHJpdmF0ZSBkb3VibGUgbWluTG9nU2NhbGVWYWx1ZSA9IDEuMDsKKworCisJLyoqCisJICogQ2hhcnQgZ2VuZXJhdG9yIGluc3RhbmNlIChyZWZlcmVuY2UgdG8gYSBzaW5nbGV0b24pCisJICovCisJR2VuZXJhdG9yIGdyOworCQorCS8qKgorCSAqIFRoZSB4QXhpcyBpbiB0aGUgUGhhc2UgU3BhY2UgUGxvdAorCSAqLworCXByaXZhdGUgQXhpcyB4QXhpc1ByaW1hcnk7CisJCisJLyoqCisJICogVGhlIHlBeGlzIGluIHRoZSBQaGFzZSBTcGFjZSBQbG90CisJICovCisJcHJpdmF0ZSBBeGlzIHlBeGlzUHJpbWFyeTsKKwkKKwkvKioKKwkgKiBkZWZhdWx0IHkgYXhpcyBsYWJlbC4gVGhpcyB2YWx1ZSBpcyByZWFkIGZyb20KKwkgKiBtZXNzYWdlcy5wcm9wZXJ0aWVzIChOTFMpCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRBeGlzTGFiZWxfWT0iWSBBeGlzIjsKKwkKKwkvKioKKwkgKiBkZWZhdWx0IHggYXhpcyBsYWJlbC4gVGhpcyB2YWx1ZSBpcyByZWFkIGZyb20KKwkgKiBtZXNzYWdlcy5wcm9wZXJ0aWVzIChOTFMpCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRBeGlzTGFiZWxfWD0iWCBBeGlzIjsKKwkKKwlib29sZWFuIHVzZUxpbmVhclNjYWxlcyA9IHRydWU7CisKKwlwcml2YXRlIExpbmVhclNjYWxlc0FjdGlvbiBsaW5lYXJTY2FsZXNBY3Rpb247CisKKwlwcml2YXRlIExvZ2FyaXRobWljU2NhbGVzQWN0aW9uIGxvZ1RpbWVTY2FsZXNBY3Rpb247CisKKwlwcml2YXRlIFN0cmluZyB4QXhpc0xhYmVsOworCisJcHJpdmF0ZSBTdHJpbmcgeUF4aXNMYWJlbDsKKwkKKwlJbWFnZSBpbWdDaGFydCA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICB0aGUgU1dUIHBhcmVudCBvZiB0aGUgV2lkZ2V0CisJICovCisJcHVibGljIFBoYXNlU3BhY2VDYW52YXMoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQsIFNXVC5ET1VCTEVfQlVGRkVSRUQgfCBTV1QuQk9SREVSKTsKKworCQlnciA9IEdlbmVyYXRvci5pbnN0YW5jZSgpOworCisJCXRyeSB7CisJCQlpZHIgPSBQbHVnaW5TZXR0aW5ncy5pbnN0YW5jZSgpLmdldERldmljZSgiZHYuU1dUIik7IC8vJE5PTi1OTFMtMSQJCQkKKwkJfSBjYXRjaCAoZmluYWwgQ2hhcnRFeGNlcHRpb24gcGV4KSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlByb2JsZW0gaW5pdGlhbGl6aW5nIGNoYXJ0IiwgcGV4KTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CisKKwkJcmVzZXREYXRhKCk7CisJCWNtID0gY3JlYXRlUGhhc2VTcGFjZUxpbmVDaGFydChyZWxhdGl2ZVZhbHVlc1gsIHJlbGF0aXZlVmFsdWVzWSwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIlBILnRpdGxlIikpOyAvLyROT04tTkxTLTEkCisKKwkJCisJCWFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woZmluYWwgUGFpbnRFdmVudCBwZSkgeworCisJCQkJZmluYWwgQ29tcG9zaXRlIHNvdXJjZSA9IChDb21wb3NpdGUpIHBlLmdldFNvdXJjZSgpOworCQkJCWZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUgZCA9IHNvdXJjZQorCQkJCQkJLmdldENsaWVudEFyZWEoKTsKKworCQkJCWlmKGltZ0NoYXJ0ICE9IG51bGwpIGltZ0NoYXJ0LmRpc3Bvc2UoKTsKKwkJCQlpbWdDaGFydCA9IG5ldyBJbWFnZShzb3VyY2UuZ2V0RGlzcGxheSgpLCBkKTsKKwkJCQlpZHIuc2V0UHJvcGVydHkoSURldmljZVJlbmRlcmVyLkdSQVBISUNTX0NPTlRFWFQsIG5ldyBHQygKKwkJCQkJCWltZ0NoYXJ0KSk7CisJCQkJZmluYWwgQm91bmRzIGJvdW5kcyA9IEJvdW5kc0ltcGwuY3JlYXRlKGQueCwgZC55LCBkLndpZHRoLAorCQkJCQkJZC5oZWlnaHQpOworCQkJCWJvdW5kcy5zY2FsZSg3MmQgLyBpZHIuZ2V0RGlzcGxheVNlcnZlcigpLmdldERwaVJlc29sdXRpb24oKSk7CisJCQkJLy8gQk9VTkRTIE1VU1QgQkUgU1BFQ0lGSUVEIElOIFBPSU5UUworCisJCQkJdHJ5IHsKKwkJCQkJZ3IucmVuZGVyKGlkciwgZ3IuYnVpbGQoaWRyLmdldERpc3BsYXlTZXJ2ZXIoKSwgY20sIGJvdW5kcywKKwkJCQkJCQludWxsLCBudWxsLCBudWxsKSk7CisJCQkJCXBlLmdjLmRyYXdJbWFnZShpbWdDaGFydCwgZC54LCBkLnkpOworCQkJCX0gY2F0Y2ggKGZpbmFsIENoYXJ0RXhjZXB0aW9uIGNlKSB7CisJCQkJCUFjdGl2YXRvci5sb2dFcnJvcigiUHJvYmxlbSByZW5kZXJpbmcgY2hhcnQiLCBjZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisKKwkJCX0gLy8gcGFpbnRDb250cm9sCisJCX0gLy8gUGFpbnRMaXN0ZW5lcgorCisJCSk7CisJCQorCQkvL0NyZWF0ZSBhIGNvbnRleHQgbWVudSBmb3IgdGhlIGNhbnZhcworCQljcmVhdGVDb250ZXh0TWVudSh0aGlzKTsKKworCX0gLy8gVGltZVNlcmllc0NhbnZhcworCisJLyoqCisJICogVGhlIG1ldGhvZCB3aGljaCBnZXRzIHRoZSBUaW1lU2VyaWVzQ2FudmFzJyByZXBvcnRzIGxpc3QsIGFuZCBkcmF3cyBpdCBvbgorCSAqIHRoZSBUaW1lU2VyaWVzQ2FudmFzLgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIGRyYXcoKSB7CisJCS8vIEhhcyBhIHJlbGF0aXZlIHZhbHVlIHByb3ZpZGVyIGJlZW4gcHJvdmlkZWQ/CisJCWlmIChydmhwICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJCisJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCQkvLyBMb2coMC4wKSBpcyBuZWdhdGl2ZSBpbmZpbml0eSBzbyBmb3IgZGlzcGxheSBwdXJwb3NlcyBvbmx5CisJCQkvLyB3ZSBzZXQgdGhlIG1pbmltdW0gYXhpcyB2YWx1ZSBhdCAwLjUvUE9QVUxBVElPTgorCQkJZG91YmxlIGRlbm9tID0gcnZocC5nZXREZW5vbWluYXRvcihudWxsKTsKKwkJCWlmKGRlbm9tIDw9MC4wKSBkZW5vbSA9IDEuMDsKKwkJCW1pbkxvZ1NjYWxlVmFsdWUgPSAwLjUvZGVub207CisJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCQkKKwkJCWlmKHByb3BlcnR5VG9QbG90WCA9PSBudWxsIHx8IHByb3BlcnR5VG9QbG90WT09bnVsbCkgcmV0dXJuOworCQkJLy8gdGltZQorCQkJU1RFTVRpbWVbXSB0aW1lID0gcnZocC5nZXRBbGxIaXN0b3JpY1RpbWVWYWx1ZXMoKTsKKwkJCS8vIEdldCB0aGUgdmFsdWVzIGZvciB0aGUgcHJvcGVydHkgdG8gYmUgcGxvdHRlZAorCQkJZmluYWwgZG91YmxlW10gcmVsYXRpdmVWYWx1ZXNYID0gcnZocAorCQkJCQkuZ2V0SGlzdG9yaWNJbnN0YW5jZXMocHJvcGVydHlUb1Bsb3RYLHRpbWUpOworCQkJZmluYWwgZG91YmxlW10gcmVsYXRpdmVWYWx1ZXNZID0gcnZocAorCQkJCQkuZ2V0SGlzdG9yaWNJbnN0YW5jZXMocHJvcGVydHlUb1Bsb3RZLHRpbWUpOworCQkJLy8gQW55IHZhbHVlcz8KKwkJCWlmICgocmVsYXRpdmVWYWx1ZXNYLmxlbmd0aCA+IDApICYmICgocmVsYXRpdmVWYWx1ZXNZLmxlbmd0aCA+IDApKSkgeworCQkJCS8vIFllcworCQkJCWNsZWFyRGF0YSgpOworCQkJCWZvciAoaW50IGN5Y2xlTnVtYmVyID0gMDsgY3ljbGVOdW1iZXIgPCByZWxhdGl2ZVZhbHVlc1gubGVuZ3RoOyBjeWNsZU51bWJlcisrKSB7CisJCQkJCURvdWJsZSB2YWx1ZVggPSBudWxsLCB2YWx1ZVkgPSBudWxsOworCQkJCQlkb3VibGUgZGlzcGxheVZhbHVlWCA9IHJlbGF0aXZlVmFsdWVzWFtjeWNsZU51bWJlcl07CisJCQkJCWRvdWJsZSBkaXNwbGF5VmFsdWVZID0gcmVsYXRpdmVWYWx1ZXNZW2N5Y2xlTnVtYmVyXTsKKwkJCQkJCisJCQkJCWlmIChkaXNwbGF5VmFsdWVYIDw9IG1pbkxvZ1NjYWxlVmFsdWUpIHsKKwkJCQkJCS8vIExvZygwLjApIGlzIG5lZ2F0aXZlIGluZmluaXR5IHNvIGZvciBkaXNwbGF5IHB1cnBvc2VzIG9ubHkKKwkJCQkJCS8vIHdlIHNldCB0aGUgbWluaW11bSBheGlzIHZhbHVlIGF0IDAuNS9QT1BVTEFUSU9OCisJCQkJCQlkaXNwbGF5VmFsdWVYID0gbWluTG9nU2NhbGVWYWx1ZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJaWYgKGRpc3BsYXlWYWx1ZVkgPD0gbWluTG9nU2NhbGVWYWx1ZSkgeworCQkJCQkJLy8gTG9nKDAuMCkgaXMgbmVnYXRpdmUgaW5maW5pdHkgc28gZm9yIGRpc3BsYXkgcHVycG9zZXMgb25seQorCQkJCQkJLy8gd2Ugc2V0IHRoZSBtaW5pbXVtIGF4aXMgdmFsdWUgYXQgMC41L1BPUFVMQVRJT04KKwkJCQkJCWRpc3BsYXlWYWx1ZVkgPSBtaW5Mb2dTY2FsZVZhbHVlOworCQkJCQl9CisJCQkJCQorCQkJCQkKKwkJCQkJaWYgKHVzZUxpbmVhclNjYWxlcykgeworCQkJCQkJdmFsdWVYID0gbmV3IERvdWJsZShkaXNwbGF5VmFsdWVYKTsKKwkJCQkJCXZhbHVlWSA9IG5ldyBEb3VibGUoZGlzcGxheVZhbHVlWSk7CisJCQkJCX0KKwkJCQkJZWxzZSB7IAorCQkJCQkJCXZhbHVlWCA9IG5ldyBEb3VibGUoTWF0aC5sb2coZGlzcGxheVZhbHVlWCkpOworCQkJCQkJCXZhbHVlWSA9IG5ldyBEb3VibGUoTWF0aC5sb2coZGlzcGxheVZhbHVlWSkpOworCQkJCQl9CisJCQkJCXRoaXMucmVsYXRpdmVWYWx1ZXNYLmFkZCh2YWx1ZVgpOworCQkJCQl0aGlzLnJlbGF0aXZlVmFsdWVzWS5hZGQodmFsdWVZKTsKKwkJCQl9IC8vIGZvcgorCQkJfSAvLyBpZgorCQkJZWxzZSB7CisJCQkJcmVzZXREYXRhKCk7CisJCQl9CisJCQlpZiAoIXRoaXMuaXNEaXNwb3NlZCgpKSByZWRyYXcoKTsKKwkJfSAvLyBpZiBhIHJlbGF0aXZlIHZhbHVlIHByb3ZpZGVyIGhhcyBiZWVuIHByb3ZpZGVkCisKKwl9IC8vIHBhaW50Q29udHJvbAorCQorCS8qKgorCSAqIENyZWF0ZSB0aGUgdmlldydzIGNvbnRleHQgbWVudSBhbmQgYWRkIHRoZSBhY3Rpb24gaGFuZGxlcnMgdG8gaXQuCisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRleHRNZW51KGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQkvLyBDb250ZXh0IE1lbnUKKwkJZmluYWwgTWVudU1hbmFnZXIgY29udGV4dE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCk7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJbGluZWFyU2NhbGVzQWN0aW9uID0gbmV3IExpbmVhclNjYWxlc0FjdGlvbigpOworCQlsb2dUaW1lU2NhbGVzQWN0aW9uID0gbmV3IExvZ2FyaXRobWljU2NhbGVzQWN0aW9uKCk7CisJCWNvbnRleHRNZW51TWFuYWdlci5hZGQobGluZWFyU2NhbGVzQWN0aW9uKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChsb2dUaW1lU2NhbGVzQWN0aW9uKTsKKwkJCisKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlmaW5hbCBNZW51IHBvcFVwTWVudSA9IGNvbnRleHRNZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShwYXJlbnQpOworCisJCS8vIFNldCB0aGUgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyCisJCXBhcmVudC5zZXRNZW51KHBvcFVwTWVudSk7CisKKwl9IC8vIGNyZWF0ZUNvbnRleHRNZW51CisKKwkvKioKKwkgKiBAcGFyYW0gcmVsYXRpdmVWYWx1ZXNYCisJICogICAgICAgICAgICB0aGUgPGNvZGU+TGlzdDwvY29kZT4gdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHJlbGF0aXZlIFggYXhpcworCSAqICAgICAgICAgICAgdmFsdWVzICgwLjAtMS4wKSB0byBwbG90CisJICogQHBhcmFtIHJlbGF0aXZlVmFsdWVzWQorCSAqICAgICAgICAgICAgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHJlbGF0aXZlIFkgYXhpcyB2YWx1ZXMgKDAuMC0xLjApIHRvIHBsb3QKKwkgKiBAcGFyYW0gc2VyaWVzSWRlbnRpZmllcgorCSAqICAgICAgICAgICAgdGhlIHRpdGxlIG9mIHRoZSBncmFwaAorCSAqIEByZXR1cm4gYSA8Y29kZT5DaGFydDwvY29kZT4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorCXB1YmxpYyBmaW5hbCBDaGFydCBjcmVhdGVQaGFzZVNwYWNlTGluZUNoYXJ0KAorCQkJZmluYWwgTGlzdDxEb3VibGU+IHJlbGF0aXZlVmFsdWVzWCwKKwkJCWZpbmFsIExpc3Q8RG91YmxlPiByZWxhdGl2ZVZhbHVlc1ksIGZpbmFsIFN0cmluZyBzZXJpZXNJZGVudGlmaWVyKSB7CisJCWZpbmFsIENoYXJ0V2l0aEF4ZXMgcmV0VmFsdWUgPSBDaGFydFdpdGhBeGVzSW1wbC5jcmVhdGUoKTsKKworICAgICAgICAvLyBnZXQgdGhlIE5MUyBkZWZhdWx0IGxhYmVscworCQlkZWZhdWx0QXhpc0xhYmVsX1ggPSBNZXNzYWdlcy5nZXRTdHJpbmcoIlhBWElTREVGLnRpdGxlIik7CisJCWRlZmF1bHRBeGlzTGFiZWxfWSA9IE1lc3NhZ2VzLmdldFN0cmluZygiWUFYSVNERUYudGl0bGUiKTsKKwkJLy8gUGxvdAorCQlyZXRWYWx1ZS5nZXRCbG9jaygpLnNldEJhY2tncm91bmQoQ29sb3JEZWZpbml0aW9uSW1wbC5XSElURSgpKTsKKwkJZmluYWwgUGxvdCBwID0gcmV0VmFsdWUuZ2V0UGxvdCgpOworCQlwLmdldENsaWVudEFyZWEoKS5zZXRCYWNrZ3JvdW5kKAorCQkJCUNvbG9yRGVmaW5pdGlvbkltcGwuY3JlYXRlKDI1NSwgMjU1LCAyMjUpKTsKKworCQkvLyBUaXRsZQorCQkvLyBjd2FMaW5lLmdldFRpdGxlKCApLmdldExhYmVsKCApLmdldENhcHRpb24oICkuc2V0VmFsdWUoICJMaW5lIENoYXJ0IgorCQkvLyApOy8vJE5PTi1OTFMtMSQKKwkJcmV0VmFsdWUuZ2V0VGl0bGUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKKworCQkvLyBMZWdlbmQKKwkJZmluYWwgTGVnZW5kIGxnID0gcmV0VmFsdWUuZ2V0TGVnZW5kKCk7CisJCWxnLnNldFZpc2libGUoZmFsc2UpOworCQkvKgorCQlmaW5hbCBMaW5lQXR0cmlidXRlcyBsaWEgPSBsZy5nZXRPdXRsaW5lKCk7CisJCWxnLmdldFRleHQoKS5nZXRGb250KCkuc2V0U2l6ZSg4KTsKKwkJbGlhLnNldFN0eWxlKExpbmVTdHlsZS5TT0xJRF9MSVRFUkFMKTsKKwkJbGcuZ2V0SW5zZXRzKCkuc2V0KDEwLCA1LCAwLCAwKTsKKwkJbGcuZ2V0T3V0bGluZSgpLnNldFZpc2libGUoZmFsc2UpOworCQlsZy5zZXRBbmNob3IoQW5jaG9yLk5PUlRIX0xJVEVSQUwpOworCQlsZy5zZXRQb3NpdGlvbihQb3NpdGlvbi5CRUxPV19MSVRFUkFMKTsKKwkJKi8KKwkJLy8gY3dhTGluZS5nZXRMZWdlbmQoICkuZ2V0VGV4dCgpLmdldEZvbnQoKS5zZXRTaXplKDE2KTs7CisJCS8vIGN3YUxpbmUuZ2V0TGVnZW5kKCApLnNldFZpc2libGUoIHRydWUgKTsKKworCQkvLyBYLUF4aXMKKwkJeEF4aXNQcmltYXJ5ID0gcmV0VmFsdWUuZ2V0UHJpbWFyeUJhc2VBeGVzKClbMF07CisJCXhBeGlzUHJpbWFyeS5zZXRUeXBlKEF4aXNUeXBlLkxJTkVBUl9MSVRFUkFMKTsKKwkJLy8gWS1BeGlzCisJCXlBeGlzUHJpbWFyeSA9IHJldFZhbHVlLmdldFByaW1hcnlPcnRob2dvbmFsQXhpcyh4QXhpc1ByaW1hcnkpOworCisJCS8vIHhBeGlzUHJpbWFyeS5zZXRUeXBlKEF4aXNUeXBlLlRFWFRfTElURVJBTCk7CisKKwkJeEF4aXNQcmltYXJ5LmdldE1ham9yR3JpZCgpLnNldFRpY2tTdHlsZShUaWNrU3R5bGUuQkVMT1dfTElURVJBTCk7CisJCXlBeGlzUHJpbWFyeS5nZXRNYWpvckdyaWQoKS5zZXRUaWNrU3R5bGUoVGlja1N0eWxlLkxFRlRfTElURVJBTCk7CisKKwkJeEF4aXNQcmltYXJ5LmdldE9yaWdpbigpLnNldFR5cGUoSW50ZXJzZWN0aW9uVHlwZS5WQUxVRV9MSVRFUkFMKTsKKworCisJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSggKS5nZXRDYXB0aW9uKCApLmdldEZvbnQoICkuc2V0U2l6ZSggOCApOworCQl4QXhpc0xhYmVsID0gZGVmYXVsdEF4aXNMYWJlbF9YOworCQlpZiAocHJvcGVydHlUb1Bsb3RYIT0gbnVsbCkgeworCQkJeEF4aXNMYWJlbCA9IHRoaXMucHJvcGVydHlUb1Bsb3RYLmdldERpc3BsYXlOYW1lKHByb3BlcnR5VG9QbG90WCk7CisJCX0KKwkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCApLmdldENhcHRpb24oICkuc2V0VmFsdWUoIHhBeGlzTGFiZWwgKTsKKwkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCApLnNldFZpc2libGUodHJ1ZSk7CisJCQorCisJCXlBeGlzUHJpbWFyeS5nZXRUaXRsZSggKS5nZXRDYXB0aW9uKCApLmdldEZvbnQoICkuc2V0U2l6ZSggOCApOworCQl5QXhpc0xhYmVsID0gZGVmYXVsdEF4aXNMYWJlbF9ZOworCQlpZiAocHJvcGVydHlUb1Bsb3RZIT0gbnVsbCkgeworCQkJeUF4aXNMYWJlbCA9IHRoaXMucHJvcGVydHlUb1Bsb3RZLmdldERpc3BsYXlOYW1lKHByb3BlcnR5VG9QbG90WSk7CisJCX0KKwkJeUF4aXNQcmltYXJ5LmdldFRpdGxlKCApLmdldENhcHRpb24oICkuc2V0VmFsdWUoIHlBeGlzTGFiZWwgKTsKKwkJeUF4aXNQcmltYXJ5LmdldFRpdGxlKCApLnNldFZpc2libGUodHJ1ZSk7CisKKwkJZmluYWwgTnVtYmVyRGF0YVNldCBvcnRob1ZhbHVlc1ggPSBOdW1iZXJEYXRhU2V0SW1wbAorCQkJCS5jcmVhdGUocmVsYXRpdmVWYWx1ZXNYKTsKKwkJZmluYWwgTnVtYmVyRGF0YVNldCBvcnRob1ZhbHVlc1kgPSBOdW1iZXJEYXRhU2V0SW1wbAorCQkJCS5jcmVhdGUocmVsYXRpdmVWYWx1ZXNZKTsKKworCQkvLyBYLVNlcmllcworCQlmaW5hbCBTZXJpZXMgbHN4ID0gU2VyaWVzSW1wbC5jcmVhdGUoKTsKKwkJLy8gZmluYWwgTGluZVNlcmllcyBsc3ggPSAoU2NhdHRlclNlcmllcykgU2NhdHRlclNlcmllc0ltcGwuY3JlYXRlKCk7CisJCS8vIHNlQ2F0ZWdvcnkuc2V0RGF0YVNldChvcnRob1ZhbHVlc1gpOworCQlsc3guc2V0RGF0YVNldChvcnRob1ZhbHVlc1gpOworCisJCS8vIFktU2VyaWVzCisJCWZpbmFsIFNjYXR0ZXJTZXJpZXMgbHN5ID0gKFNjYXR0ZXJTZXJpZXMpIFNjYXR0ZXJTZXJpZXNJbXBsLmNyZWF0ZSgpOworCQlsc3kuc2V0RGF0YVNldChvcnRob1ZhbHVlc1kpOworCQlsc3kuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRWaXNpYmxlKHRydWUpOworCQlsc3kuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRDb2xvcihDb2xvckRlZmluaXRpb25JbXBsLkJMVUUoKSk7CisJCWxzeS5zZXRTZXJpZXNJZGVudGlmaWVyKHNlcmllc0lkZW50aWZpZXIpOworCQkKKwkJLy9sc3kuZ2V0TWFya2VyKCkuc2V0VmlzaWJsZShmYWxzZSk7CisJCS8vIHJlcGxhY2VzIGRlcHJlY2F0ZWQgY29kZTogbGluZVNlcmllcy5nZXRNYXJrZXIoKS5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJaWYgKCFsc3kuZ2V0TWFya2VycygpLmlzRW1wdHkoKSkgeworCQkJTWFya2VyIG1hcmtlciA9IGxzeS5nZXRNYXJrZXJzKCkuZ2V0KDApOworCQkJbWFya2VyLnNldFZpc2libGUoZmFsc2UpOworCQl9CisJCQorCQlmaW5hbCBTZXJpZXNEZWZpbml0aW9uIHNkWCA9IFNlcmllc0RlZmluaXRpb25JbXBsLmNyZWF0ZSgpOworCQlmaW5hbCBTZXJpZXNEZWZpbml0aW9uIHNkWSA9IFNlcmllc0RlZmluaXRpb25JbXBsLmNyZWF0ZSgpOworCisJCXNkWS5nZXRTZXJpZXNQYWxldHRlKCkudXBkYXRlKC0yKTsKKworCQl4QXhpc1ByaW1hcnkuZ2V0U2VyaWVzRGVmaW5pdGlvbnMoKS5hZGQoc2RYKTsKKwkJeUF4aXNQcmltYXJ5LmdldFNlcmllc0RlZmluaXRpb25zKCkuYWRkKHNkWSk7CisKKwkJLy8gc2RYLmdldFNlcmllcygpLmFkZChzZUNhdGVnb3J5KTsKKwkJc2RYLmdldFNlcmllcygpLmFkZChsc3gpOworCQlzZFkuZ2V0U2VyaWVzKCkuYWRkKGxzeSk7CisKKwkJeEF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWluKE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoMC4wKSk7CisJCXhBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDEuMCkpOworCQl4QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRTdGVwKDAuMjUpOworCQl4QXhpc1ByaW1hcnkuZ2V0TGFiZWwoKS5nZXRDYXB0aW9uKCkuZ2V0Rm9udCgpLnNldFNpemUoOSk7CisKKwkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWluKE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoMC4wKSk7CisJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDEuMCkpOworCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRTdGVwKDAuMjUpOworCQl5QXhpc1ByaW1hcnkuZ2V0TGFiZWwoKS5nZXRDYXB0aW9uKCkuZ2V0Rm9udCgpLnNldFNpemUoOSk7CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlUGhhc2VTcGFjZUxpbmVDaGFydAorCisJLyoqCisJICogQHBhcmFtIHJ2aHAKKwkgKiBAcGFyYW0gcHJvcGVydHlUb1Bsb3RYCisJICogQHBhcmFtIHByb3BlcnR5VG9QbG90WQorCSAqLworCXB1YmxpYyB2b2lkIHNldERhdGFTb3VyY2VBbmRSZWRyYXcoCisJCQlmaW5hbCBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlciBydmhwLAorCQkJZmluYWwgSXRlbVByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eVRvUGxvdFgsCisJCQlmaW5hbCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5VG9QbG90WSkgeworCQl0aGlzLnJ2aHAgPSBydmhwOworCQl0aGlzLnByb3BlcnR5VG9QbG90WCA9IHByb3BlcnR5VG9QbG90WDsKKwkJdGhpcy5wcm9wZXJ0eVRvUGxvdFkgPSBwcm9wZXJ0eVRvUGxvdFk7CisJCQorCQl4QXhpc0xhYmVsID0gZGVmYXVsdEF4aXNMYWJlbF9YOworCQlpZiAocHJvcGVydHlUb1Bsb3RYIT0gbnVsbCkgeworCQkJeEF4aXNMYWJlbCA9IHRoaXMucHJvcGVydHlUb1Bsb3RYLmdldERpc3BsYXlOYW1lKHByb3BlcnR5VG9QbG90WCk7CisJCQlpZighdXNlTGluZWFyU2NhbGVzKSB4QXhpc0xhYmVsID0gIkxvZygiK3hBeGlzTGFiZWwrIikiOworCQl9CisJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSggKS5nZXRDYXB0aW9uKCApLnNldFZhbHVlKCB4QXhpc0xhYmVsICk7CisJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSggKS5zZXRWaXNpYmxlKHRydWUpOworCQkJCisJCXlBeGlzUHJpbWFyeS5nZXRUaXRsZSggKS5nZXRDYXB0aW9uKCApLmdldEZvbnQoICkuc2V0U2l6ZSggOCApOworCQl5QXhpc0xhYmVsID0gZGVmYXVsdEF4aXNMYWJlbF9ZOworCQlpZiAocHJvcGVydHlUb1Bsb3RZIT0gbnVsbCkgeworCQkJeUF4aXNMYWJlbCA9IHRoaXMucHJvcGVydHlUb1Bsb3RZLmdldERpc3BsYXlOYW1lKHByb3BlcnR5VG9QbG90WSk7CisJCQlpZighdXNlTGluZWFyU2NhbGVzKSB5QXhpc0xhYmVsID0gIkxvZygiK3lBeGlzTGFiZWwrIikiOworCQl9CisJCXlBeGlzUHJpbWFyeS5nZXRUaXRsZSggKS5nZXRDYXB0aW9uKCApLnNldFZhbHVlKCB5QXhpc0xhYmVsICk7CisJCXlBeGlzUHJpbWFyeS5nZXRUaXRsZSggKS5zZXRWaXNpYmxlKHRydWUpOworCQkKKwkJZHJhdygpOworCX0gLy8gc2V0RGF0YVNvdXJjZUFuZFJlZHJhdworCisJLyoqCisJICogU2V0IHRoZSBwcm92aWRlciBvZiByZWxhdGl2ZSB2YWx1ZXMuIEl0IHdpbGwgYmUgY29uc3VsdGVkIHRvIHByb2R1Y2UgYQorCSAqIHNlcXVlbmNlIG9mIHJlbGF0aXZlIHZhbHVlcyAoMC4wIHRvIDEuMCkgdGhhdCB3aWxsIGJlIHBsb3R0ZWQuCisJICogCisJICogQHBhcmFtIHJ2aHAKKwkgKiAgICAgICAgICAgIHRoZSBwcm92aWRlciBvZiByZWxhdGl2ZSB2YWx1ZXMuCisJICovCisJcHVibGljIHZvaWQgc2V0UmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlcigKKwkJCWZpbmFsIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIgcnZocCkgeworCQl0aGlzLnJ2aHAgPSBydmhwOworCX0gLy8gc2V0UmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlcgorCisJLyoqCisJICogQHJldHVybiB0aGUgcHJvcGVydHlUb1Bsb3RYCisJICovCisJcHVibGljIGZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlUb1Bsb3RYKCkgeworCQlyZXR1cm4gcHJvcGVydHlUb1Bsb3RYOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5VG9QbG90WQorCSAqLworCXB1YmxpYyBmaW5hbCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5VG9QbG90WSgpIHsKKwkJcmV0dXJuIHByb3BlcnR5VG9QbG90WTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gcHJvcGVydHlUb1Bsb3RYCisJICogICAgICAgICAgICB0aGUgcHJvcGVydHlUb1Bsb3RYIHRvIHNldAorCSAqLworCXB1YmxpYyBmaW5hbCB2b2lkIHNldFByb3BlcnR5VG9QbG90WCgKKwkJCWZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlUb1Bsb3RYKSB7CisJCXRoaXMucHJvcGVydHlUb1Bsb3RYID0gcHJvcGVydHlUb1Bsb3RYOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBwcm9wZXJ0eVRvUGxvdFkKKwkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eVRvUGxvdFkgdG8gc2V0CisJICovCisJcHVibGljIGZpbmFsIHZvaWQgc2V0UHJvcGVydHlUb1Bsb3RZKAorCQkJZmluYWwgSXRlbVByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eVRvUGxvdFkpIHsKKwkJdGhpcy5wcm9wZXJ0eVRvUGxvdFkgPSBwcm9wZXJ0eVRvUGxvdFk7CisJfQorCisJLyoqCisJICogRGlzcG9zZXMgdGhlIENvbG9yIG9iamVjdHMKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJLyoqCisJICogcmVzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJcmVzZXREYXRhKCk7CisJCXJ2aHAgPSBudWxsOworCQlyZWRyYXcoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZXNldERhdGEoKSB7CisJCWNsZWFyRGF0YSgpOworCQlyZWxhdGl2ZVZhbHVlc1guYWRkKG5ldyBEb3VibGUoMS4wKSk7CisJCXJlbGF0aXZlVmFsdWVzWS5hZGQobmV3IERvdWJsZSgwLjApKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2xlYXJEYXRhKCkgeworCQlyZWxhdGl2ZVZhbHVlc1guY2xlYXIoKTsKKwkJcmVsYXRpdmVWYWx1ZXNZLmNsZWFyKCk7CisJfQorCQorCXZvaWQgdG9nZ2xlU2NhbGVzKCkgeworCQlpZiAodXNlTGluZWFyU2NhbGVzKSB7IC8vU3dpdGNoIHRvIGxvZ2FyaXRobWljIHNjYWxlCisJCQlsb2dUaW1lU2NhbGVzQWN0aW9uLnNldENoZWNrZWQodHJ1ZSk7CisJCQlsaW5lYXJTY2FsZXNBY3Rpb24uc2V0Q2hlY2tlZChmYWxzZSk7CisJCQkKKwkJCXhBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1pbihudWxsKTsKKwkJCXhBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChudWxsKTsKKwkJCXhBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnVuc2V0U3RlcCgpOworCQkJeEF4aXNQcmltYXJ5LmdldFNjYWxlKCkudW5zZXRTdGVwTnVtYmVyKCk7CQkJCisJCQl4QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5nZXRDYXB0aW9uKCkuc2V0VmFsdWUoIkxvZygiICsgeEF4aXNMYWJlbCArICIpIik7CQkJCisJCQkKKwkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1pbihudWxsKTsKKwkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChudWxsKTsKKwkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnVuc2V0U3RlcCgpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkudW5zZXRTdGVwTnVtYmVyKCk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5nZXRDYXB0aW9uKCkuc2V0VmFsdWUoIkxvZygiICsgeUF4aXNMYWJlbCArICIpIik7CisJCX0KKwkJZWxzZSB7IC8vU3dpdGNoIHRvIGxpbmVhciBzY2FsZQkJCQorCQkJbG9nVGltZVNjYWxlc0FjdGlvbi5zZXRDaGVja2VkKGZhbHNlKTsKKwkJCWxpbmVhclNjYWxlc0FjdGlvbi5zZXRDaGVja2VkKHRydWUpOworCQkJCisJCQl4QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNaW4oTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZSgwLjApKTsKKwkJCXhBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDEuMCkpOworCQkJeEF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0U3RlcCgwLjI1KTsKKwkJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLmdldENhcHRpb24oKS5zZXRWYWx1ZSh4QXhpc0xhYmVsKTsKKworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWluKE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoMC4wKSk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNYXgoTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZSgxLjApKTsKKwkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldFN0ZXAoMC4yNSk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5nZXRDYXB0aW9uKCkuc2V0VmFsdWUoeUF4aXNMYWJlbCk7CQkJCisJCX0JCQorCQl1c2VMaW5lYXJTY2FsZXMgPSAhdXNlTGluZWFyU2NhbGVzOworCQlyZWRyYXcoKTsKKwl9CisJCisJcHJvdGVjdGVkIGNsYXNzIExpbmVhclNjYWxlc0FjdGlvbiBleHRlbmRzIEFjdGlvbgorCXsKKwkJcHVibGljIExpbmVhclNjYWxlc0FjdGlvbigpCisJCXsKKwkJCXN1cGVyKE1lc3NhZ2VzLmdldFN0cmluZygiQ29udGV4dE1lbnUuTGluZWFyU2NhbGluZyIpLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7CisJCQlzZXRDaGVja2VkKHVzZUxpbmVhclNjYWxlcyk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZ2V0VGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewkJCQorCQkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiQ29udGV4dE1lbnUuTGluZWFyU2NhbGluZyIpOworCQl9CisJCQorCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJaWYgKHVzZUxpbmVhclNjYWxlcykgeworCQkJCXNldENoZWNrZWQodHJ1ZSk7CisJCQkJLy9Ob3RoaW5nIHRvIGRvLiBJdCdzIGFscmVhZHkgbGluZWFyLXRpbWUuCisJCQl9CisJCQllbHNlIHsKKwkJCQl0b2dnbGVTY2FsZXMoKTsKKwkJCX0KKwkJfQorCX0KKwkKKwljbGFzcyBMb2dhcml0aG1pY1NjYWxlc0FjdGlvbiBleHRlbmRzIEFjdGlvbgorCXsKKwkJcHVibGljIExvZ2FyaXRobWljU2NhbGVzQWN0aW9uKCkKKwkJeworCQkJc3VwZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5Mb2dTY2FsaW5nIiksIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKKwkJCXNldENoZWNrZWQoIXVzZUxpbmVhclNjYWxlcyk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZ2V0VGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewkJCQorCQkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiQ29udGV4dE1lbnUuTG9nU2NhbGluZyIpOworCQl9CisJCQorCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJaWYgKCF1c2VMaW5lYXJTY2FsZXMpIHsKKwkJCQlzZXRDaGVja2VkKHRydWUpOworCQkJCS8vTm90aGluZyB0byBkby4gSXQncyBhbHJlYWR5IGxvZy10aW1lLgorCQkJfQorCQkJZWxzZSB7CisJCQkJdG9nZ2xlU2NhbGVzKCk7CisJCQl9CisJCX0KKwl9Cit9IC8vIFBoYXNlU3BhY2VDYW52YXMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL3ZpZXdzL1BoYXNlU3BhY2VGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9QaGFzZVNwYWNlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NTRjOGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9QaGFzZVNwYWNlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8vIFBoYXNlU3BhY2VGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIFJlcG9ydENvbnRyb2x9IGluc3RhbmNlcy4KKyAqLworcHVibGljIGNsYXNzIFBoYXNlU3BhY2VGYWN0b3J5IGltcGxlbWVudHMgUmVwb3J0Q29udHJvbEZhY3RvcnkgeworCisJc3RhdGljIFBoYXNlU3BhY2VGYWN0b3J5IElOU1RBTkNFID0gbmV3IFBoYXNlU3BhY2VGYWN0b3J5KCk7CisKKwkvKioKKwkgKiBDb25zdGFudHMgZm9yIHNhdmluZyBSZXBvcnRWaWV3UHJlZmVyZW5jZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSEFTRV9TUEFDRV9UWVBFID0gIlBoYXNlU3BhY2UiOworCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvZiB0aGUge0BsaW5rIFBoYXNlU3BhY2VIaXN0b3J5UGxvdHRlcn0KKwkgKiBAcmV0dXJuIGEge0BsaW5rIFBoYXNlU3BhY2VIaXN0b3J5UGxvdHRlcn0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5HZW9ncmFwaGljQ29udHJvbEZhY3RvcnkjY3JlYXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkgKi8KKwlwdWJsaWMgUmVwb3J0Q29udHJvbCBjcmVhdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IFBoYXNlU3BhY2VIaXN0b3J5UGxvdHRlcihwYXJlbnQpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gVE9ETyBKRksKKwkgKiAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUNvbnRyb2xOYW1lKCkgeworCQlyZXR1cm4gUEhBU0VfU1BBQ0VfVFlQRTsKKwl9CisJCisJLyoqCisJICogVGhpcyBGYWN0b3J5IGNyZWF0ZXMgYSBjb250cm9sIGFzc29jaWF0ZWQgd2l0aCBhbiBJZGVuZmlhYmxlCisJICogQHJldHVybiB0eXBlIG9mIGZhY3RvcnkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlUeXBlKCkgeworCQlyZXR1cm4gSURFTlRJRkFCTEVfVFlQRTsKKwl9CisKK30gLy8gUGhhc2VTcGFjZUZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL3ZpZXdzL1BoYXNlU3BhY2VIaXN0b3J5UGxvdHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvUGhhc2VTcGFjZUhpc3RvcnlQbG90dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkYTA0ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL3ZpZXdzL1BoYXNlU3BhY2VIaXN0b3J5UGxvdHRlci5qYXZhCkBAIC0wLDAgKzEsNDI1IEBACisvLyBSZWxhdGl2ZVZhbHVlSGlzdG9yeVBsb3R0ZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeS5SZWxhdGl2ZVZhbHVlSGlzdG9yeUV4dGVuZGVkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLmhpc3RvcnkuUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeS5SZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeS5SZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25TdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnByZWZlcmVuY2VzLlByZWZlcmVuY2VDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuUHJvcGVydHlTZWxlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuUHJvcGVydHlTZWxlY3Rvci5Qcm9wZXJ0eVNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBQaGFzZVNwYWNlSGlzdG9yeVBsb3R0ZXIgZXh0ZW5kcyBSZXBvcnRDb250cm9sIGltcGxlbWVudHMKKwkJUmVsYXRpdmVWYWx1ZUhpc3RvcnlFeHRlbmRlZExpc3RlbmVyLCBJU2ltdWxhdGlvbkxpc3RlbmVyIHsKKworCVBoYXNlU3BhY2VDYW52YXMgcGhhc2VTcGFjZUNhbnZhczsKKwlQcm9wZXJ0eVNlbGVjdG9yIHByb3BlcnR5U2VsZWN0b3JYOworCVByb3BlcnR5U2VsZWN0b3IgcHJvcGVydHlTZWxlY3Rvclk7CisKKwlJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHNlbGVjdGVkUHJvcGVydHkxOworCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3Igc2VsZWN0ZWRQcm9wZXJ0eTI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWF9BWElTX0xBQkVMID0gIlggQXhpcyI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWV9BWElTX0xBQkVMID0gIlkgQXhpcyI7CisKKwkvKioKKwkgKiBAcGFyYW0gcGFyZW50CisJICovCisJcHVibGljIFBoYXNlU3BhY2VIaXN0b3J5UGxvdHRlcihmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgU1dULk5vbmUpOworCQljcmVhdGVDb250ZW50cygpOworCX0gLy8gUmVsYXRpdmVWYWx1ZUhpc3RvcnlQbG90dGVyCisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBwbG90dGVyCisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgeworCQlzZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7CisKKwkJaWRlbnRpZmlhYmxlVGl0bGUgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOworCQlwaGFzZVNwYWNlQ2FudmFzID0gbmV3IFBoYXNlU3BhY2VDYW52YXModGhpcyk7CisJCXByb3BlcnR5U2VsZWN0b3JYID0gbmV3IFByb3BlcnR5U2VsZWN0b3IodGhpcywgU1dULk5PTkUsIHRydWUpOworCQlwcm9wZXJ0eVNlbGVjdG9yWC5zZXREaXNwbGF5TGFiZWwoWF9BWElTX0xBQkVMKTsKKwkJcHJvcGVydHlTZWxlY3RvclkgPSBuZXcgUHJvcGVydHlTZWxlY3Rvcih0aGlzLCBTV1QuTk9ORSwgdHJ1ZSk7CisJCXByb3BlcnR5U2VsZWN0b3JZLnNldERpc3BsYXlMYWJlbChZX0FYSVNfTEFCRUwpOworCisJCXJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcywgU1dULk5PTkUpOworCQlyZW1vdmVCdXR0b24uc2V0VGV4dChSRU1PVkVfVEVYVCk7CisKKwkJZmluYWwgRm9ybURhdGEgdGl0bGVGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlpZGVudGlmaWFibGVUaXRsZS5zZXRMYXlvdXREYXRhKHRpdGxlRm9ybURhdGEpOworCQl0aXRsZUZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJdGl0bGVGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQl0aXRsZUZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisKKwkJZmluYWwgRm9ybURhdGEgY2hhcnRGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlwaGFzZVNwYWNlQ2FudmFzLnNldExheW91dERhdGEoY2hhcnRGb3JtRGF0YSk7CisJCWNoYXJ0Rm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGlkZW50aWZpYWJsZVRpdGxlLCAwKTsKKwkJY2hhcnRGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQocHJvcGVydHlTZWxlY3RvclksIDApOworCQljaGFydEZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWNoYXJ0Rm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKworCQkvLyBQcm9wZXJ0eSBTZWxlY3RvcgorCQlmaW5hbCBGb3JtRGF0YSBwcm9wZXJ0eVNlbGVjdG9yRm9ybURhdGFZID0gbmV3IEZvcm1EYXRhKCk7CisJCS8vIHByb3BlcnR5U2VsZWN0b3JGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGltZVNlcmllc0NhbnZhcywKKwkJLy8gMCk7CisJCXByb3BlcnR5U2VsZWN0b3JGb3JtRGF0YVkuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCXByb3BlcnR5U2VsZWN0b3JGb3JtRGF0YVkubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJcHJvcGVydHlTZWxlY3RvckZvcm1EYXRhWS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgzMCwgMCk7CisJCXByb3BlcnR5U2VsZWN0b3JZLnNldExheW91dERhdGEocHJvcGVydHlTZWxlY3RvckZvcm1EYXRhWSk7CisKKwkJLy8gUHJvcGVydHkgU2VsZWN0b3IKKwkJZmluYWwgRm9ybURhdGEgcHJvcGVydHlTZWxlY3RvckZvcm1EYXRhWCA9IG5ldyBGb3JtRGF0YSgpOworCQkvLyBwcm9wZXJ0eVNlbGVjdG9yRm9ybURhdGFYLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwcm9wZXJ0eVNlbGVjdG9yWSwKKwkJLy8gMCk7CisJCXByb3BlcnR5U2VsZWN0b3JGb3JtRGF0YVguYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCXByb3BlcnR5U2VsZWN0b3JGb3JtRGF0YVgubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChwcm9wZXJ0eVNlbGVjdG9yWSwKKwkJCQkwKTsKKwkJcHJvcGVydHlTZWxlY3RvckZvcm1EYXRhWC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCg2MCwgMCk7CisJCXByb3BlcnR5U2VsZWN0b3JYLnNldExheW91dERhdGEocHJvcGVydHlTZWxlY3RvckZvcm1EYXRhWCk7CisKKwkJLy8gUmVtb3ZlQnV0dG9uCisJCWZpbmFsIEZvcm1EYXRhIHJlbW92ZUJ1dHRvbkZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCS8vIHByb3BlcnR5U2VsZWN0b3JGb3JtRGF0YVgudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHByb3BlcnR5U2VsZWN0b3JZLAorCQkvLyAwKTsKKwkJcmVtb3ZlQnV0dG9uRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCXJlbW92ZUJ1dHRvbkZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHJvcGVydHlTZWxlY3RvclgsIDApOworCQlyZW1vdmVCdXR0b25Gb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCg5MCwgMCk7CisJCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKHJlbW92ZUJ1dHRvbkZvcm1EYXRhKTsKKworCQlmaW5hbCBQaGFzZVNwYWNlSGlzdG9yeVBsb3R0ZXIgc2VsZiA9IHRoaXM7CisJCQorCQkvLyBYIGxpc3RlbmVyCisJCXByb3BlcnR5U2VsZWN0b3JYCisJCQkJLmFkZFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIobmV3IFByb3BlcnR5U2VsZWN0b3IuUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKworCQkJCQkvKioKKwkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuUHJvcGVydHlTZWxlY3Rvci5Qcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyI3Byb3BlcnR5U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3RlbS51aS53aWRnZXRzLlByb3BlcnR5U2VsZWN0b3IuUHJvcGVydHlTZWxlY3Rpb25FdmVudCkKKwkJCQkJICovCisJCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5U2VsZWN0ZWQoCisJCQkJCQkJZmluYWwgUHJvcGVydHlTZWxlY3Rpb25FdmVudCBwcm9wZXJ0eVNlbGVjdGlvbkV2ZW50KSB7CisJCQkJCQlzZWxlY3RlZERlY29yYXRvciA9IHByb3BlcnR5U2VsZWN0aW9uRXZlbnQKKwkJCQkJCQkJLmdldERlY29yYXRvcigpOworCisJCQkJCQkvLyBnZXQgdGhlIFggcHJvcGVydHkgZnJvbSB0aGUgZXZlbnQKKwkJCQkJCXNlbGVjdGVkUHJvcGVydHkyID0gcHJvcGVydHlTZWxlY3Rpb25FdmVudAorCQkJCQkJCQkuZ2V0UHJvcGVydHkoKTsKKworCQkJCQkJU3RyaW5nIHNlbGVjdGVkSWQgPSBwcm9wZXJ0eVNlbGVjdGlvbkV2ZW50LmdldElkKCk7CisJCQkJCQkKKwkJCQkJCUxpc3Q8RHluYW1pY0xhYmVsPmFsbExhYmVscyA9IGRlY29yYXRvclRvTGFiZWxzTWFwLmdldChzZWxlY3RlZERlY29yYXRvcik7CisJCQkJCQlmb3IoRHluYW1pY0xhYmVsIGxhYjphbGxMYWJlbHMpIHsKKwkJCQkJCQlpZihsYWIgaW5zdGFuY2VvZiBEaXNlYXNlTW9kZWxMYWJlbCAmJgorCQkJCQkJCQkJKChEaXNlYXNlTW9kZWxMYWJlbClsYWIpLmdldFBvcHVsYXRpb25Nb2RlbExhYmVsKCkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKS5lcXVhbHMoc2VsZWN0ZWRJZCkpCisJCQkJCQkJe3NlbGVjdGVkRHluYW1pY0xhYmVsID0gbGFiO2JyZWFrO30KKwkJCQkJCX0KKwkJCQkKKwkJCQkJCWlmKHNlbGVjdGVkRHluYW1pY0xhYmVsICE9IG51bGwpIHsKKwkJCQkJCQlSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlciByaHZwID0gKFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyKSBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkJCQkuYWRhcHQoc2VsZWN0ZWREeW5hbWljTGFiZWwsUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlci5jbGFzcyk7CisJCQkJCQkJc3dpdGNoVG9SVkhQKHJodnApOworCQkJCQkJCXNlbGYucGhhc2VTcGFjZUNhbnZhcy5zZXREYXRhU291cmNlQW5kUmVkcmF3KHJodnAsIHNlbGVjdGVkUHJvcGVydHkyLCBzZWxlY3RlZFByb3BlcnR5MSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9KTsKKworCQkvLyBZIGxpc3RlbmVyCisJCXByb3BlcnR5U2VsZWN0b3JZCisJCQkJLmFkZFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIobmV3IFByb3BlcnR5U2VsZWN0b3IuUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKworCQkJCQkvKioKKwkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuUHJvcGVydHlTZWxlY3Rvci5Qcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyI3Byb3BlcnR5U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3RlbS51aS53aWRnZXRzLlByb3BlcnR5U2VsZWN0b3IuUHJvcGVydHlTZWxlY3Rpb25FdmVudCkKKwkJCQkJICovCisJCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5U2VsZWN0ZWQoCisJCQkJCQkJZmluYWwgUHJvcGVydHlTZWxlY3Rpb25FdmVudCBwcm9wZXJ0eVNlbGVjdGlvbkV2ZW50KSB7CisJCQkJCQlzZWxlY3RlZERlY29yYXRvciA9IHByb3BlcnR5U2VsZWN0aW9uRXZlbnQKKwkJCQkJCQkJLmdldERlY29yYXRvcigpOworCisJCQkJCQkvLyBnZXQgdGhlIFkgcHJvcGVydHkgZnJvbSB0aGUgZXZlbnQKKwkJCQkJCXNlbGVjdGVkUHJvcGVydHkxID0gcHJvcGVydHlTZWxlY3Rpb25FdmVudAorCQkJCQkJCQkuZ2V0UHJvcGVydHkoKTsKKworCQkJCQkJU3RyaW5nIHNlbGVjdGVkSWQgPSBwcm9wZXJ0eVNlbGVjdGlvbkV2ZW50LmdldElkKCk7CisJCQkJCQkKKwkJCQkJCQorCQkJCQkJTGlzdDxEeW5hbWljTGFiZWw+YWxsTGFiZWxzID0gZGVjb3JhdG9yVG9MYWJlbHNNYXAuZ2V0KHNlbGVjdGVkRGVjb3JhdG9yKTsKKwkJCQkJCWZvcihEeW5hbWljTGFiZWwgbGFiOmFsbExhYmVscykgeworCQkJCQkJCWlmKGxhYiBpbnN0YW5jZW9mIERpc2Vhc2VNb2RlbExhYmVsICYmCisJCQkJCQkJCQkoKERpc2Vhc2VNb2RlbExhYmVsKWxhYikuZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpLmVxdWFscyhzZWxlY3RlZElkKSkKKwkJCQkJCQl7c2VsZWN0ZWREeW5hbWljTGFiZWwgPSBsYWI7YnJlYWs7fQorCQkJCQkJfQorCQkJCQorCQkJCQkJaWYoc2VsZWN0ZWREeW5hbWljTGFiZWwgIT0gbnVsbCkgeworCQkJCQkJCVJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyIHJodnAgPSAoUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXIpIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkJCS5hZGFwdChzZWxlY3RlZER5bmFtaWNMYWJlbCwKKwkJCQkJCQkJCVJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIuY2xhc3MpOworCQkJCQkJCXN3aXRjaFRvUlZIUChyaHZwKTsKKwkJCQkJCQlzZWxmLnBoYXNlU3BhY2VDYW52YXMuc2V0RGF0YVNvdXJjZUFuZFJlZHJhdyhyaHZwLCBzZWxlY3RlZFByb3BlcnR5Miwgc2VsZWN0ZWRQcm9wZXJ0eTEpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSk7CisKKwkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKAorCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCisJCQkJZmlyZVJlbW92ZUV2ZW50KGlkZW50aWZpYWJsZSk7CisJCQkJcmVtb3ZlKCk7CisJCQl9CisJCX0pOworCisJfSAvLyBjcmVhdGVDb250ZW50cworCisJLyoqCisJICogdG8gcmVtb3ZlIHRoZSBjb250cm9sIGUuZy4gYnkgYSByZW1vdmUgYnV0dG9uIGV2ZW50CisJICovCisJQE92ZXJyaWRlCisJQFN1cHByZXNzV2FybmluZ3MoImNhc3QiKQorCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKwkJcmVtb3ZlTGlzdGVuZXJzLmNsZWFyKCk7CisJCXN3aXRjaFRvUlZIUChudWxsKTsKKwkJcmVsYXRpdmVWYWx1ZUhpc3RvcnlFeHRlbmRlZChudWxsKTsKKwkJaWRlbnRpZmlhYmxlVGl0bGUuc2V0VGV4dCgiIik7CisJCXByb3BlcnR5U2VsZWN0b3JYCisJCQkJLnNldERlY29yYXRvcnMoKExpc3Q8RGVjb3JhdG9yPikgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7CisJCXByb3BlcnR5U2VsZWN0b3JZCisJCQkJLnNldERlY29yYXRvcnMoKExpc3Q8RGVjb3JhdG9yPikgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7CisJCWRpc3Bvc2UoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaWRlbnRpZmlhYmxlCisJICogICAgICAgICAgICB0aGUge0BsaW5rIElkZW50aWZpYWJsZX0gdG8gYmUgdGhlIHNvdXJjZSBvZiB0aGUgZGF0YSB0byBiZQorCSAqICAgICAgICAgICAgcGxvdHRlZC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRJZGVudGlmaWFibGUoZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50aWZpYWJsZSkgeworCisJCS8vIFNhbWUgSWRlbnRpZmlhYmxlPworCQlpZiAodGhpcy5pZGVudGlmaWFibGUgPT0gaWRlbnRpZmlhYmxlKSB7CisJCQkvLyBZZXMKKwkJCXJldHVybjsKKwkJfSAvLyBpZgorCisJCXRoaXMuaWRlbnRpZmlhYmxlID0gaWRlbnRpZmlhYmxlOworCisJCWZpbmFsIExpc3Q8RGVjb3JhdG9yPiBkZWNvcmF0b3JzID0gbmV3IEFycmF5TGlzdDxEZWNvcmF0b3I+KCk7CisJCWRlY29yYXRvclRvTGFiZWxzTWFwID0gbmV3IEhhc2hNYXA8RGVjb3JhdG9yLCBMaXN0PER5bmFtaWNMYWJlbD4+KCk7CisKKwkJaWRlbnRpZmlhYmxlVGl0bGUuc2V0VGV4dChpZGVudGlmaWFibGUuZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCkpOworCQkvLyBHZXQgdGhlIGR5bmFtaWMgbGFiZWxzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIElkZW50aWZpYWJsZQorCQkvLyBBIG5vZGU/CisJCWlmIChpZGVudGlmaWFibGUgaW5zdGFuY2VvZiBOb2RlKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIE5vZGUgbm9kZSA9IChOb2RlKSBpZGVudGlmaWFibGU7CisJCQlmb3IgKGZpbmFsIE5vZGVMYWJlbCBub2RlTGFiZWwgOiBub2RlLmdldExhYmVscygpKSB7CisJCQkJLy8gVXBkYXRlZCBieSBhIGRlY29yYXRvcj8KKwkJCQlpZiAobm9kZUxhYmVsIGluc3RhbmNlb2YgRHluYW1pY05vZGVMYWJlbCkgeworCQkJCQkvLyBZZXMKKwkJCQkJZmluYWwgRHluYW1pY05vZGVMYWJlbCBkeW5hbWljTm9kZUxhYmVsID0gKER5bmFtaWNOb2RlTGFiZWwpIG5vZGVMYWJlbDsKKwkJCQkJLy8gQ2FuIGl0IHByb3ZpZGUgcmVsYXRpdmUgdmFsdWVzPworCQkJCQlmaW5hbCBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlciBydmhwID0gKFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyKSBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkJCQkuYWRhcHQobm9kZUxhYmVsLAorCQkJCQkJCQkJUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlci5jbGFzcyk7CisJCQkJCWlmIChydmhwICE9IG51bGwpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJZmluYWwgRGVjb3JhdG9yIGRlY29yYXRvciA9IGR5bmFtaWNOb2RlTGFiZWwKKwkJCQkJCQkJLmdldERlY29yYXRvcigpOworCQkJCQkJaWYgKGRlY29yYXRvciAhPSBudWxsKSB7CisJCQkJCQkJaWYoZGVjb3JhdG9yVG9MYWJlbHNNYXAuZ2V0KGRlY29yYXRvcikhPW51bGwpIHsKKwkJCQkJCQkJTGlzdDxEeW5hbWljTGFiZWw+bGlzdCA9IGRlY29yYXRvclRvTGFiZWxzTWFwLmdldChkZWNvcmF0b3IpOworCQkJCQkJCQlsaXN0LmFkZChkeW5hbWljTm9kZUxhYmVsKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlBcnJheUxpc3Q8RHluYW1pY0xhYmVsPm5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PER5bmFtaWNMYWJlbD4oKTsKKwkJCQkJCQkJbmV3TGlzdC5hZGQoZHluYW1pY05vZGVMYWJlbCk7CisJCQkJCQkJCWRlY29yYXRvclRvTGFiZWxzTWFwLnB1dChkZWNvcmF0b3IsIG5ld0xpc3QpOworCQkJCQkJCX0KKwkJCQkJCQlkZWNvcmF0b3JzLmFkZChkZWNvcmF0b3IpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkR5bmFtaWNMYWJlbCBcIiIKKwkJCQkJCQkJCSsgZHluYW1pY05vZGVMYWJlbC5nZXREdWJsaW5Db3JlKCkKKwkJCQkJCQkJCQkJLmdldFRpdGxlKCkKKwkJCQkJCQkJCSsgIlwiIGRvZXMgbm90IGhhdmUgYSBEZWNvcmF0b3IiLCBudWxsKTsKKwkJCQkJCX0KKworCQkJCQl9IC8vIGlmIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyCisJCQkJfSAvLyBpZiBEeW5hbWljTm9kZUxhYmVsCisJCQl9IC8vIGZvciBlYWNoIE5vZGVMYWJlbAorCQl9IC8vIGlmIE5vZGUKKworCQkvLyBuZXcgbm9kZS4uLiB1cGRhdGUgdGhlIGRlY29yYXRvcnMKKwkJcHJvcGVydHlTZWxlY3Rvclguc2V0RGVjb3JhdG9ycyhkZWNvcmF0b3JzKTsKKwkJcHJvcGVydHlTZWxlY3Rvclkuc2V0RGVjb3JhdG9ycyhkZWNvcmF0b3JzKTsKKworCQl0cnkgeworCQkJLy8gdHJ5IHRvIHNldCB0aGUgZGlzcGxheWVkIGRlY29yYXRvciBieSB0aGUgdXNlcnMgdWkgbGFiZWwKKwkJCS8vIHByZWZlcmVuY2VzCisJCQlmaW5hbCBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IG9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yCisJCQkJCS5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJCWZpbmFsIFN0cmluZyB5UHJlZmVyZW5jZSA9IHByZWZlcmVuY2VzCisJCQkJCS5nZXRTdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5JTklUSUFMX0FUVFJJQlVURV9OQU1FX1NUUklOR19QUkVGRVJFTkNFKTsKKwkJCWZpbmFsIFN0cmluZyB4UHJlZmVyZW5jZSA9IHByZWZlcmVuY2VzCisJCQkJCS5nZXRTdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5JTklUSUFMX0FUVFJJQlVURV9OQU1FX1NUUklOR19QUkVGRVJFTkNFMik7CisKKwkJCS8vIHdlIGRvIG5vdCBjYXJlIGFib3V0IHRoZSByZXR1cm4gdmFsdWUsIGl0J3Mgb2sgaWYgdGhlIHByZWZlcmVuY2UKKwkJCS8vIGlzIG5vdCB0aGVyZS4KKwkJCXByb3BlcnR5U2VsZWN0b3JZLnNldERpc3BsYXllZFByb3BlcnR5KHlQcmVmZXJlbmNlKTsKKwkJCXByb3BlcnR5U2VsZWN0b3JYLnNldERpc3BsYXllZFByb3BlcnR5KHhQcmVmZXJlbmNlKTsKKworCQl9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworCQkJLy8gaWYgaXQgZmFpbHMgZG8gbm90aGluZworCQl9CisKKwl9IC8vIHNldElkZW50aWZpYWJsZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeS5SZWxhdGl2ZVZhbHVlSGlzdG9yeUV4dGVuZGVkTGlzdGVuZXIjcmVsYXRpdmVWYWx1ZUhpc3RvcnlFeHRlbmRlZChvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeS5SZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZWxhdGl2ZVZhbHVlSGlzdG9yeUV4dGVuZGVkKAorCQkJZmluYWwgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXIgcnZocCkgeworCQkvLyBUaGUgZXZlbnQgbm90aWZpY2F0aW9uIGRvZXNuJ3QgY29tZSBmcm9tIHRoZSBVSSB0aHJlYWQgc28gd2UgbmVlZCB0bworCQkvLyBhZGQgYSBSdW5uYWJsZSB0byB0aGUgVUkgdGhyZWFkJ3MgZXhlY3V0aW9uIHF1ZXVlIHRvIGdpdmUgdGhlIG5ldworCQkvLyBzb3VyY2UgdG8gdGhlIGNoYXJ0CisJCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOworCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7CisJCQkvLyBZZXMKKwkJCXRyeSB7CisJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQlwaGFzZVNwYWNlQ2FudmFzLnNldERhdGFTb3VyY2VBbmRSZWRyYXcocnZocCwKKwkJCQkJCQkJc2VsZWN0ZWRQcm9wZXJ0eTIsIHNlbGVjdGVkUHJvcGVydHkxKTsKKwkJCQkJfSAvLyBydW4KKwkJCQl9KTsgLy8gZGlzcGxheS5hc3luY0V4ZWMKKwkJCX0gLy8gdHJ5CisJCQljYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBJZ25vcmUgdGhlcmUgY291bGQgYmUgYSByYWNlIGNvbmRpdGlvbiB3aXRoIHRoZSBkaXNwbGF5IGJlaW5nCisJCQkJLy8gZGlzcG9zZWQgd2hlbiB0aGUgc3lzdGVtIGlzIHNodXQgZG93biB3aXRoIGEgcnVubmluZworCQkJCS8vIHNpbXVsYXRpb24uCisJCQl9IC8vIGNhdGNoIEV4Y2VwdGlvbgorCQl9IC8vIGlmCisJfS8vIHJlbGF0aXZlVmFsdWVIaXN0b3J5RXh0ZW5kZWQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25MaXN0ZW5lciNzaW11bGF0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uRXZlbnQpCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoImNhc3QiKQorCXB1YmxpYyB2b2lkIHNpbXVsYXRpb25DaGFuZ2VkKGZpbmFsIFNpbXVsYXRpb25FdmVudCBldmVudCkgeworCQkvLyByZXNldCBldmVudAorCQlpZiAoZXZlbnQuZ2V0U2ltdWxhdGlvblN0YXRlKCkgPT0gU2ltdWxhdGlvblN0YXRlLlJFU0VUKSB7CisJCQkvLyBZZXMKKwkJCXBoYXNlU3BhY2VDYW52YXMucmVzZXREYXRhKCk7CisJCX0gLy8gaWYKKwkJLy8gSXMgdGhlIFNpbXVsYXRpb24gc3RvcHBpbmcgKGkuZS4gYmVpbmcgZGVsZXRlZD8pCisJCWlmIChldmVudC5nZXRTaW11bGF0aW9uU3RhdGUoKSA9PSBTaW11bGF0aW9uU3RhdGUuU1RPUFBFRCkgeworCQkJLy8gWWVzCisJCQlzaW11bGF0aW9uLnJlbW92ZVNpbXVsYXRpb25MaXN0ZW5lcih0aGlzKTsKKwkJCXNpbXVsYXRpb24gPSBudWxsOworCQkJc3dpdGNoVG9SVkhQKG51bGwpOworCQkJcmVsYXRpdmVWYWx1ZUhpc3RvcnlFeHRlbmRlZChudWxsKTsKKwkJCWlkZW50aWZpYWJsZVRpdGxlLnNldFRleHQoIiIpOworCQkJcHJvcGVydHlTZWxlY3RvclgKKwkJCQkJLnNldERlY29yYXRvcnMoKExpc3Q8RGVjb3JhdG9yPikgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7CisJCQlwcm9wZXJ0eVNlbGVjdG9yWQorCQkJCQkuc2V0RGVjb3JhdG9ycygoTGlzdDxEZWNvcmF0b3I+KSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKKworCQl9IC8vIGlmCisJfSAvLyBzaW11bGF0aW9uQ2hhbmdlZAorCisJLyoqCisJICogSW5pdGlhbGl6ZSB0aGUgY29udHJvbCBmcm9tIGEKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn0gaW5zdGFuY2UuCisJICogCisJICogQHBhcmFtIHNpbXVsYXRpb24KKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn0KKwkgKiAgICAgICAgICAgIHdob3NlIHN0YXRlIHdpbGwgYmUgdmlzdWFsaXplZCBpbiB0aGUgY29udHJvbC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbVNpbXVsYXRpb24oZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbikgeworCQlzaW11bGF0aW9uTmFtZUxhYmVsLnNldFRleHQoc2ltdWxhdGlvbi5nZXROYW1lKCkpOworCQlwcm9wZXJ0eVNlbGVjdG9yWC5zZXRTaW11bGF0aW9uKHNpbXVsYXRpb24pOworCQlwcm9wZXJ0eVNlbGVjdG9yWS5zZXRTaW11bGF0aW9uKHNpbXVsYXRpb24pOworCX0gLy8gaW5pdGlhbGl6ZUZyb21TaW11bGF0aW9uCisKKwkvKioKKwkgKiAKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZWZyZXNoMigpIHsKKwkJLy8gbm90aGluZworCX0gLy8gcmVmcmVzaDIKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0I2Rpc3Bvc2UoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwkJaWYgKHRoaXMucnZocCAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXJ2aHAucmVtb3ZlRXh0ZW5zaW9uTGlzdGVuZXIodGhpcyk7CisJCX0gLy8gaWYKKwl9IC8vIGRpc3Bvc2UKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzLlJlcG9ydENvbnRyb2wjZ2V0SWRlbnRpZmlhYmxlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSWRlbnRpZmlhYmxlIGdldElkZW50aWZpYWJsZSgpIHsKKwkJcmV0dXJuIGlkZW50aWZpYWJsZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIENvbnRyb2wgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIElkZW50aWZpYWJsZQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzLlJlcG9ydENvbnRyb2wjZ2V0Q29udHJvbFR5cGUoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29udHJvbFR5cGUoKSB7CisJCXJldHVybiBSZXBvcnRDb250cm9sRmFjdG9yeS5JREVOVElGQUJMRV9UWVBFOworCX0KKwkKK30gLy8gUmVsYXRpdmVWYWx1ZUhpc3RvcnlQbG90dGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9QaGFzZVNwYWNlVmlldy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvUGhhc2VTcGFjZVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjY1Y2M0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvUGhhc2VTcGFjZVZpZXcuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuU2VsZWN0ZWRSZXBvcnRzTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7CisKKy8qKgorICogVGhpcyB2aWV3IGNvbnRhaW5zIEJJUlQgb3V0cHV0IHRoYXQgcGxvdHMgdmFsdWVzIG9mIHZhcmlhYmxlcyBpbiBTVEVNCisgKiBzaW11bGF0aW9ucy4KKyAqLworCitwdWJsaWMgY2xhc3MgUGhhc2VTcGFjZVZpZXcgZXh0ZW5kcyBWaWV3UGFydCBpbXBsZW1lbnRzIElTZWxlY3Rpb25MaXN0ZW5lciB7CisKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgUGhhc2UgU3BhY2UgVmlldworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1BIQVNFX1NQQUNFX1ZJRVcgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzLlBoYXNlU3BhY2UiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIExpc3Q8SWRlbnRpZmlhYmxlPiBzZWxlY3RlZElkZW50aWZpYWJsZXMgPSBudWxsOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgZGVjb3JhdG9yIHRoYXQgaGFzIGJlZW4gc2VsZWN0ZWQgYnkgdGhlIGNvbWJvIGJveC4KKwkgKi8KKwlwcm90ZWN0ZWQgRGVjb3JhdG9yIHNlbGVjdGVkRGVjb3JhdG9yOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgY29tYm8gYm94IHRoYXQgZGlzcGxheXMgdGhlIERlY29yYXRvcnMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tYm8gZGVjb3JhdG9yQ29tYm87CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb21ibyBib3ggdGhhdCBkaXNwbGF5cyB0aGUgWCBheGlzIHByb3BlcnRpZXMgb2YgdGhlIHNlbGVjdGVkCisJICogRGVjb3JhdG9yCisJICovCisJcHJvdGVjdGVkIENvbWJvIHByb3BlcnRpZXNDb21ib1g7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb21ibyBib3ggdGhhdCBkaXNwbGF5cyB0aGUgWSBheGlzIHByb3BlcnRpZXMgb2YgdGhlIHNlbGVjdGVkCisJICogRGVjb3JhdG9yCisJICovCisJcHJvdGVjdGVkIENvbWJvIHByb3BlcnRpZXNDb21ib1k7CisKKwlwcml2YXRlIFJlcG9ydFZpZXdlciByZXBvcnRWaWV3ZXI7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCS8vIHBoYXNlU3BhY2VIaXN0b3J5UGxvdHRlciA9IG5ldyBQaGFzZVNwYWNlSGlzdG9yeVBsb3R0ZXIocGFyZW50KTsKKworCQlyZXBvcnRWaWV3ZXIgPSBuZXcgUmVwb3J0Vmlld2VyKHBhcmVudCwgUGhhc2VTcGFjZUZhY3RvcnkuSU5TVEFOQ0UpOworCQlyZXBvcnRWaWV3ZXIuc2V0SW5wdXQoU2ltdWxhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpKTsKKworCQlnZXRTaXRlKCkuc2V0U2VsZWN0aW9uUHJvdmlkZXIocmVwb3J0Vmlld2VyKTsKKworCQkvLyBSZWdpc3RlciB3aXRoIHRoZSBTZWxlY3Rpb25TZXJ2aWNlCisJCWdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkKKwkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7CisKKwl9IC8vIGNyZWF0ZVBhcnRDb250cm9sCisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgQU5ZVEhJTkcgaXMgc2VsZWN0ZWQgaW4gdGhlIEVjbGlwc2UKKwkgKiB3b3JrYmVuY2guIEl0J3Mgam9iIGlzIHRvIGZpbHRlciBvdXQgc2VsZWN0aW9ucyBvZiBJU2ltdWxhdGlvbiBpbnN0YW5jZXMKKwkgKiBhbmQgdXBkYXRlIHRoZSBjaGFydCBpbiB0aGUgVGltZVNlcmllc0NhbnZhcworCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsCisJICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChmaW5hbCBJV29ya2JlbmNoUGFydCBwYXJ0LAorCQkJZmluYWwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKworCQkvLyBJcyB0aGlzIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IGNvbWluZyBmcm9tIG91ciB2aWV3PworCQlpZiAocGFydCAhPSBQaGFzZVNwYWNlVmlldy50aGlzKSB7CisJCQkvLyBObworCQkJaWYgKHNlbGVjdGVkSWRlbnRpZmlhYmxlcyA9PSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJc2VsZWN0ZWRJZGVudGlmaWFibGVzID0gbmV3IEFycmF5TGlzdDxJZGVudGlmaWFibGU+KCk7CisJCQl9IC8vIGlmCisJCQlzZWxlY3RlZElkZW50aWZpYWJsZXMuY2xlYXIoKTsKKworCQkJLy8gSXMgaXQgYSBzdHJ1Y3R1cmVkIHNlbGVjdGlvbj8KKwkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJCS8vIFllcworCQkJCWZpbmFsIExpc3QgbGlzdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikudG9MaXN0KCk7CisKKwkJCQkvLyBHbyB0aHJvdWdoIGV2ZXJ5dGhpbmcgaW4gdGhlIGxpc3Qgb2YgdGhpbmdzIHRoYXQgd2VyZQorCQkJCS8vIHNlbGVjdGVkIGFuZCBwaWNrIG91dCB0aGUgb25lcyB0aGF0IGFyZSBJU2ltdWxhdGlvbnMuCisJCQkJZm9yIChmaW5hbCBJdGVyYXRvciBzZWxlY3Rpb25JdGVyID0gbGlzdC5pdGVyYXRvcigpOyBzZWxlY3Rpb25JdGVyCisJCQkJCQkuaGFzTmV4dCgpOykgeworCQkJCQlmaW5hbCBPYmplY3Qgb2JqID0gc2VsZWN0aW9uSXRlci5uZXh0KCk7CisKKwkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElkZW50aWZpYWJsZSkgeworCQkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJlcG9ydCBpcyBpbmRlZWQgZW5hYmxlZCBpbiB0aGUgY29udGV4dCBtZW51CQkJCQkJCisJCQkJCQlpZiAoU2VsZWN0ZWRSZXBvcnRzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmlzUmVwb3J0RW5hYmxlZChQaGFzZVNwYWNlRmFjdG9yeS5QSEFTRV9TUEFDRV9UWVBFKSkgeworCQkJCQkJCXJlcG9ydFZpZXdlci5hZGRNb25pdG9yKChJZGVudGlmaWFibGUpb2JqKTsKKwkJCQkJCX0KKwkJCQkJfSAvLyBpZgorCQkJCX0gLy8gZm9yIGVhY2ggc2VsZWN0ZWQgaXRlbQorCQkJfSAvLyBpZiBzdHJ1Y3R1cmVkIHNlbGVjdGlvbgorCisJCX0gLy8gaWYgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgY29taW5nIGZyb20gb3VyIHZpZXc/CisJfSAvLyBzZWxlY3Rpb25DaGFuZ2VkCisKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpCisJCQkJLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOworCX0gLy8gZGlzcG9zZQorCisJLyoqCisJICogVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgaW50ZXJmYWNlLCBidXQgd2UncmUgbm90IHVzaW5nIGl0LgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJLy8gTm90aGluZworCX0gLy8gc2V0Rm9jdXMKKworfSAvLyBQaGFzZVNwYWNlVmlldwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvUmVsYXRpdmVWYWx1ZUhpc3RvcnlQbG90dGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9SZWxhdGl2ZVZhbHVlSGlzdG9yeVBsb3R0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGM4NWJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvUmVsYXRpdmVWYWx1ZUhpc3RvcnlQbG90dGVyLmphdmEKQEAgLTAsMCArMSw0MzggQEAKKy8vIFJlbGF0aXZlVmFsdWVIaXN0b3J5UGxvdHRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY05vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGVMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5oaXN0b3J5LlJlbGF0aXZlVmFsdWVIaXN0b3J5RXh0ZW5kZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeS5SZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5oaXN0b3J5LlJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5oaXN0b3J5LlJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbExhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvblN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2lkZ2V0cy5EZWNvcmF0b3JTZWxlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuRGVjb3JhdG9yU2VsZWN0b3IuRGVjb3JhdG9yU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgU1dUIEdVSSBjb21wb25lbnQgdGhhdCB1c2VzIEJJUlQgdG8gcGxvdAorICovCitwdWJsaWMgY2xhc3MgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQbG90dGVyIGV4dGVuZHMgUmVwb3J0Q29udHJvbCBpbXBsZW1lbnRzCisJCVJlbGF0aXZlVmFsdWVIaXN0b3J5RXh0ZW5kZWRMaXN0ZW5lciwgSVNpbXVsYXRpb25MaXN0ZW5lciB7CisKKwlUaW1lU2VyaWVzQ2FudmFzIHRpbWVTZXJpZXNDYW52YXM7CisJRGVjb3JhdG9yU2VsZWN0b3IgZGVjb3JhdG9yU2VsZWN0b3I7CisJTGlzdDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBzZWxlY3RlZFByb3BlcnRpZXM7CisKKwkvKioKKwkgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgc2VsZWN0IG91dCB0aGUgcHJvcGVydGllcworCSAqIHRvIGJlIGRpc3BsYXllZC4KKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5U2lldmUgeworCQkvKioKKwkJICogQHBhcmFtIGR5bmFtaWNMYWJlbAorCQkgKiAgICAgICAgICAgIHRoZSBsYWJlbCB0aGF0IGNvbnRhaW5zIHRoZSBjYW5kaWRhdGUgcHJvcGVydGllcyB0byBiZQorCQkgKiAgICAgICAgICAgIGRpc3BsYXllZC4KKwkJICogQHJldHVybiBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHRoZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlCisJCSAqICAgICAgICAgZGlzcGxheWVkIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgc2hvdWxkIGJlIGRpc3BsYXllZC4KKwkJICovCisJCUxpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gc2lldmUoZmluYWwgRHluYW1pY0xhYmVsIGR5bmFtaWNMYWJlbCk7CisJfSAvLyBQcm9wZXJ0eVNpZXZlCisKKwkvKioKKwkgKiBUaGlzIHNpZXZlIHNlbGVjdHMgYWxsIG9mIHRob3NlIHByb3BlcnRpZXMgdGhhdCBoYXZlIHJlbGF0aXZlIHZhbHVlcy4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIFByb3BlcnR5U2lldmUgcHJvcGVydHlTaWV2ZSA9IG5ldyBQcm9wZXJ0eVNpZXZlKCkgeworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuRGVjb3JhdG9yU2VsZWN0b3IuUHJvcGVydHlTaWV2ZSNzaWV2ZShvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRHluYW1pY0xhYmVsKQorCQkgKi8KKwkJcHVibGljIExpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gc2lldmUoCisJCQkJZmluYWwgRHluYW1pY0xhYmVsIGR5bmFtaWNMYWJlbCkgeworCQkJZmluYWwgTGlzdDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4oKTsKKwkJCWZpbmFsIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXIgcnZwID0gKFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXIpIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJCS5hZGFwdChkeW5hbWljTGFiZWwsIFJlbGF0aXZlVmFsdWVQcm92aWRlci5jbGFzcyk7CisKKwkJCS8vIERvZXMgdGhlIGxhYmVsIGhhdmUgcmVsYXRpdmUgdmFsdWVzPworCQkJaWYgKHJ2cCAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJcnZwLnNldFRhcmdldChkeW5hbWljTGFiZWwpOworCisJCQkJZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IHJ2cC5nZXRQcm9wZXJ0aWVzKCkpIHsKKwkJCQkJZmluYWwgSXRlbVByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSA9IChJdGVtUHJvcGVydHlEZXNjcmlwdG9yKSBlbGVtZW50OworCQkJCQlyZXRWYWx1ZS5hZGQocHJvcGVydHkpOworCQkJCX0gLy8gZm9yIGVhY2ggcHJvcGVydHkKKwkJCX0gLy8gaWYgdGhlIGxhYmVsIGhhcyByZWxhdGl2ZSB2YWx1ZXMKKwkJCXJldHVybiByZXRWYWx1ZTsKKwkJfSAvLyBzaWV2ZQorCX07CisKKwkvKioKKwkgKiBAcGFyYW0gcGFyZW50CisJICovCisJcHVibGljIFJlbGF0aXZlVmFsdWVIaXN0b3J5UGxvdHRlcihmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgU1dULk5vbmUpOworCQljcmVhdGVDb250ZW50cygpOworCX0gLy8gUmVsYXRpdmVWYWx1ZUhpc3RvcnlQbG90dGVyCisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBwbG90dGVyCisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgeworCQlzZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7CisKKwkJaWRlbnRpZmlhYmxlVGl0bGUgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOworCQl0aW1lU2VyaWVzQ2FudmFzID0gbmV3IFRpbWVTZXJpZXNDYW52YXModGhpcyk7CisJCWRlY29yYXRvclNlbGVjdG9yID0gbmV3IERlY29yYXRvclNlbGVjdG9yKHRoaXMsIFNXVC5OT05FLCB0cnVlKTsKKworCQlyZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5OT05FKTsKKwkJcmVtb3ZlQnV0dG9uLnNldFRleHQoUkVNT1ZFX1RFWFQpOworCisJCWZpbmFsIEZvcm1EYXRhIHRpdGxlRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJaWRlbnRpZmlhYmxlVGl0bGUuc2V0TGF5b3V0RGF0YSh0aXRsZUZvcm1EYXRhKTsKKwkJdGl0bGVGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXRpdGxlRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJdGl0bGVGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCisJCWZpbmFsIEZvcm1EYXRhIGNoYXJ0Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJdGltZVNlcmllc0NhbnZhcy5zZXRMYXlvdXREYXRhKGNoYXJ0Rm9ybURhdGEpOworCQljaGFydEZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChpZGVudGlmaWFibGVUaXRsZSwgMCk7CisJCWNoYXJ0Rm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGRlY29yYXRvclNlbGVjdG9yLCAwKTsKKwkJY2hhcnRGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQljaGFydEZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisKKwkJLy8gUHJvcGVydHkgU2VsZWN0b3IKKwkJZmluYWwgRm9ybURhdGEgZGVjb3JhdG9yU2VsZWN0b3JGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQkvLyBkZWNvcmF0b3JTZWxlY3RvckZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0aW1lU2VyaWVzQ2FudmFzLAorCQkvLyAwKTsKKwkJZGVjb3JhdG9yU2VsZWN0b3JGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJZGVjb3JhdG9yU2VsZWN0b3JGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlkZWNvcmF0b3JTZWxlY3RvckZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDMwLCAwKTsKKwkJZGVjb3JhdG9yU2VsZWN0b3Iuc2V0TGF5b3V0RGF0YShkZWNvcmF0b3JTZWxlY3RvckZvcm1EYXRhKTsKKworCQkvLyBSZW1vdmVCdXR0b24KKwkJZmluYWwgRm9ybURhdGEgcmVtb3ZlQnV0dG9uRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJLy8gZGVjb3JhdG9yU2VsZWN0b3JGb3JtRGF0YVgudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGRlY29yYXRvclNlbGVjdG9yWSwKKwkJLy8gMCk7CisJCXJlbW92ZUJ1dHRvbkZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQlyZW1vdmVCdXR0b25Gb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGRlY29yYXRvclNlbGVjdG9yLCAwKTsKKwkJcmVtb3ZlQnV0dG9uRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNjAsIDApOworCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShyZW1vdmVCdXR0b25Gb3JtRGF0YSk7CisKKwkJZGVjb3JhdG9yU2VsZWN0b3IKKwkJCQkuYWRkRGVjb3JhdG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IERlY29yYXRvclNlbGVjdG9yLkRlY29yYXRvclNlbGVjdGlvbkxpc3RlbmVyKCkgeworCisJCQkJCS8qKgorCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2lkZ2V0cy5EZWNvcmF0b3JTZWxlY3Rvci5Qcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyI3Byb3BlcnR5U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3RlbS51aS53aWRnZXRzLkRlY29yYXRvclNlbGVjdG9yLlByb3BlcnR5U2VsZWN0aW9uRXZlbnQpCisJCQkJCSAqLworCQkJCQlwdWJsaWMgdm9pZCBkZWNvcmF0b3JTZWxlY3RlZCgKKwkJCQkJCQlmaW5hbCBEZWNvcmF0b3JTZWxlY3Rpb25FdmVudCBkZWNvcmF0b3JTZWxlY3Rpb25FdmVudCkgeworCQkJCQkJc2VsZWN0ZWREZWNvcmF0b3IgPSBkZWNvcmF0b3JTZWxlY3Rpb25FdmVudAorCQkJCQkJCQkuZ2V0RGVjb3JhdG9yKCk7CisJCQkJCQlpZihzZWxlY3RlZERlY29yYXRvciE9bnVsbCkgeworCQkJCQkJCXNlbGVjdGVkUHJvcGVydGllcyA9IGdldFByb3BlcnRpZXNUb0Rpc3BsYXkoc2VsZWN0ZWREZWNvcmF0b3IpOworCQkJCQkJCVN0cmluZyBzZWxlY3RlZFBvcElkID0gZGVjb3JhdG9yU2VsZWN0aW9uRXZlbnQuZ2V0SWQoKTsKKwkJCQkJCQlMaXN0PER5bmFtaWNMYWJlbD5hbGxMYWJlbHMgPSBkZWNvcmF0b3JUb0xhYmVsc01hcC5nZXQoc2VsZWN0ZWREZWNvcmF0b3IpOworCQkJCQkJCWlmKGFsbExhYmVscyAhPSBudWxsKSAKKwkJCQkJCQkJZm9yKER5bmFtaWNMYWJlbCBsYWI6YWxsTGFiZWxzKSB7CisJCQkJCQkJCWlmKGxhYiBpbnN0YW5jZW9mIERpc2Vhc2VNb2RlbExhYmVsICYmCisJCQkJCQkJCQkJKChEaXNlYXNlTW9kZWxMYWJlbClsYWIpLmdldFBvcHVsYXRpb25Nb2RlbExhYmVsKCkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKS5lcXVhbHMoc2VsZWN0ZWRQb3BJZCkpCisJCQkJCQkJCXtzZWxlY3RlZER5bmFtaWNMYWJlbCA9IGxhYjticmVhazt9CisJCQkJCQkJfQorCQkJCQkJCWlmKHNlbGVjdGVkRHluYW1pY0xhYmVsICE9IG51bGwpCisJCQkJCQkJCXN3aXRjaFRvUlZIUCgoUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXIpIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkJCQkJLmFkYXB0KHNlbGVjdGVkRHluYW1pY0xhYmVsLAorCQkJCQkJCQkJCQlSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyLmNsYXNzKSk7CisJCQkJCQkJdGltZVNlcmllc0NhbnZhcy5zZXREYXRhU291cmNlQW5kUmVkcmF3KHJ2aHAsIHNlbGVjdGVkUHJvcGVydGllcyk7CisJCQkJCQl9Ly8gaWYgZGVjb3JhdG9yIG5vdCBudWxsCisJCQkJCX0KKwkJCQl9KTsKKworCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKAorCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWZpcmVSZW1vdmVFdmVudChpZGVudGlmaWFibGUpOworCQkJCXJlbW92ZSgpOworCQkJfQorCQl9KTsKKworCX0gLy8gY3JlYXRlQ29udGVudHMKKworCS8qKgorCSAqIHRvIHJlbW92ZSB0aGUgY29udHJvbCBlLmcuIGJ5IGEgcmVtb3ZlIGJ1dHRvbiBldmVudAorCSAqLworCUBPdmVycmlkZQorCUBTdXBwcmVzc1dhcm5pbmdzKCJjYXN0IikKKwlwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisJCXJlbW92ZUxpc3RlbmVycy5jbGVhcigpOworCQlzd2l0Y2hUb1JWSFAobnVsbCk7CisJCXJlbGF0aXZlVmFsdWVIaXN0b3J5RXh0ZW5kZWQobnVsbCk7CisJCWlkZW50aWZpYWJsZVRpdGxlLnNldFRleHQoIiIpOworCQlkZWNvcmF0b3JTZWxlY3RvcgorCQkJCS5zZXREZWNvcmF0b3JzKChMaXN0PERlY29yYXRvcj4pIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOworCQlkaXNwb3NlKCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGlkZW50aWZpYWJsZQorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBJZGVudGlmaWFibGV9IHRvIGJlIHRoZSBzb3VyY2Ugb2YgdGhlIGRhdGEgdG8gYmUKKwkgKiAgICAgICAgICAgIHBsb3R0ZWQuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0SWRlbnRpZmlhYmxlKGZpbmFsIElkZW50aWZpYWJsZSBpZGVudGlmaWFibGUpIHsKKworCQkvLyBTYW1lIElkZW50aWZpYWJsZT8KKwkJaWYgKHRoaXMuaWRlbnRpZmlhYmxlID09IGlkZW50aWZpYWJsZSkgeworCQkJLy8gWWVzCisJCQlyZXR1cm47CisJCX0gLy8gaWYKKworCQl0aGlzLmlkZW50aWZpYWJsZSA9IGlkZW50aWZpYWJsZTsKKworCQlmaW5hbCBMaXN0PERlY29yYXRvcj4gZGVjb3JhdG9ycyA9IG5ldyBBcnJheUxpc3Q8RGVjb3JhdG9yPigpOworCQlkZWNvcmF0b3JUb0xhYmVsc01hcCA9IG5ldyBIYXNoTWFwPERlY29yYXRvciwgTGlzdDxEeW5hbWljTGFiZWw+PigpOworCisJCWlkZW50aWZpYWJsZVRpdGxlLnNldFRleHQoaWRlbnRpZmlhYmxlLmdldER1YmxpbkNvcmUoKS5nZXRUaXRsZSgpKTsKKwkJLy8gR2V0IHRoZSBkeW5hbWljIGxhYmVscyBhc3NvY2lhdGVkIHdpdGggdGhpcyBJZGVudGlmaWFibGUKKwkJLy8gQSBub2RlPworCQlpZiAoaWRlbnRpZmlhYmxlIGluc3RhbmNlb2YgTm9kZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBOb2RlIG5vZGUgPSAoTm9kZSkgaWRlbnRpZmlhYmxlOworCQkJZm9yIChmaW5hbCBOb2RlTGFiZWwgbm9kZUxhYmVsIDogbm9kZS5nZXRMYWJlbHMoKSkgeworCQkJCS8vIFVwZGF0ZWQgYnkgYSBkZWNvcmF0b3I/CisJCQkJaWYgKG5vZGVMYWJlbCBpbnN0YW5jZW9mIER5bmFtaWNOb2RlTGFiZWwpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWZpbmFsIER5bmFtaWNOb2RlTGFiZWwgZHluYW1pY05vZGVMYWJlbCA9IChEeW5hbWljTm9kZUxhYmVsKSBub2RlTGFiZWw7CisJCQkJCS8vIENhbiBpdCBwcm92aWRlIHJlbGF0aXZlIHZhbHVlcz8KKwkJCQkJZmluYWwgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXIgcnZocCA9IChSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlcikgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJCQkJLmFkYXB0KG5vZGVMYWJlbCwKKwkJCQkJCQkJCVJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIuY2xhc3MpOworCQkJCQlpZiAocnZocCAhPSBudWxsKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCWZpbmFsIERlY29yYXRvciBkZWNvcmF0b3IgPSBkeW5hbWljTm9kZUxhYmVsCisJCQkJCQkJCS5nZXREZWNvcmF0b3IoKTsKKwkJCQkJCQorCQkJCQkJaWYoZGVjb3JhdG9yICE9IG51bGwpIHsKKwkJCQkJCQlpZihkZWNvcmF0b3JUb0xhYmVsc01hcC5nZXQoZGVjb3JhdG9yKSE9bnVsbCkgeworCQkJCQkJCQlMaXN0PER5bmFtaWNMYWJlbD5saXN0ID0gZGVjb3JhdG9yVG9MYWJlbHNNYXAuZ2V0KGRlY29yYXRvcik7CisJCQkJCQkJCWxpc3QuYWRkKGR5bmFtaWNOb2RlTGFiZWwpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCUFycmF5TGlzdDxEeW5hbWljTGFiZWw+bmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8RHluYW1pY0xhYmVsPigpOworCQkJCQkJCQluZXdMaXN0LmFkZChkeW5hbWljTm9kZUxhYmVsKTsKKwkJCQkJCQkJZGVjb3JhdG9yVG9MYWJlbHNNYXAucHV0KGRlY29yYXRvciwgbmV3TGlzdCk7CisJCQkJCQkJfQorCQkJCQkJCWRlY29yYXRvcnMuYWRkKGRlY29yYXRvcik7CisJCQkJCQl9CisJCQkJCX0gLy8gaWYKKwkJCQl9IC8vIGlmIER5bmFtaWNOb2RlTGFiZWwKKwkJCX0gLy8gZm9yIGVhY2ggTm9kZUxhYmVsCisKKwkJCS8vIEFyZSB0aGVyZSBhbnkgRGVjb3JhdG9ycyB0aGF0IHdlJ2xsIHBsb3Q/CisJCQlpZiAoZGVjb3JhdG9ycy5zaXplKCkgPiAwKSB7CisJCQkJLy8gWWVzCisJCQkJLy8gV2UgbmVlZCB0byBsaXN0ZW4gdG8gdGhlIGxpZmUtY3ljbGUgb2YgdGhlIFNpbXVsYXRpb24KKwkJCQkvLyBhc3NvY2lhdGVkIHdpdGggdGhlIEdyYXBoIHRoYXQgY29udGFpbnMgdGhlIElkZW50aWZhYmxlIHRoYXQKKwkJCQkvLyB3YXMgcGFzc2VkIGluLiBXaGVuIGl0IGRpc2FwcGVhcnMsIHdlIG5lZWQgdG8gInVuLWhvb2siCisJCQkJLy8gb3Vyc2VsdmVzIGZyb20gdGhlIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyCisJCQkJLy8gaW5zdGFuY2Ugc28gdGhhdCB0aGUgR3JhcGggdGhhdCBpdCBpcyBhdHRhY2hlZCB0byBjYW4gYmUKKwkJCQkvLyBnYXJiYWdlIGNvbGxlY3RlZCBhbmQgd2UgbmVlZCB0byByZXNldCBvdXJzZWx2ZXMgc28gdGhhdCB3ZQorCQkJCS8vIGRvbid0IGRpc3BsYXkgYSBwbG90IGZvciBhIFNpbXVsYXRpb24gdGhhdCBkb2Vzbid0IGV4aXN0IGFueQorCQkJCS8vIG1vcmUuCisJCQkJZmluYWwgSVNpbXVsYXRpb24gbmV3U2ltdWxhdGlvbiA9IFNpbXVsYXRpb25NYW5hZ2VyCisJCQkJCQkuZ2V0TWFuYWdlcigpLm1hcEdyYXBoVG9TaW11bGF0aW9uKGdldEdyYXBoKG5vZGUpKTsKKworCQkJCS8vIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBvbGQgb25lPworCQkJCWlmIChzaW11bGF0aW9uICE9IG51bGwpIHsKKwkJCQkJLy8gWWVzCisJCQkJCXNpbXVsYXRpb24ucmVtb3ZlU2ltdWxhdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJCX0gLy8gaWYKKwkJCQlzaW11bGF0aW9uID0gbmV3U2ltdWxhdGlvbjsKKworCQkJCS8vIExpc3RlbiB0byB0aGUgbmV3IG9uZT8KKwkJCQlpZiAoc2ltdWxhdGlvbiAhPSBudWxsKSB7CisJCQkJCS8vIFllcworCQkJCQlzaW11bGF0aW9uLmFkZFNpbXVsYXRpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQl9IC8vIGlmCisJCQl9IC8vIGlmIGFueSBEZWNvcmF0b3JzIHRvIHBsb3QKKworCQl9IC8vIGlmIE5vZGUKKwkJZGVjb3JhdG9yU2VsZWN0b3Iuc2V0RGVjb3JhdG9ycyhkZWNvcmF0b3JzKTsKKwl9IC8vIHNldElkZW50aWZpYWJsZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeS5SZWxhdGl2ZVZhbHVlSGlzdG9yeUV4dGVuZGVkTGlzdGVuZXIjcmVsYXRpdmVWYWx1ZUhpc3RvcnlFeHRlbmRlZChvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeS5SZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZWxhdGl2ZVZhbHVlSGlzdG9yeUV4dGVuZGVkKAorCQkJZmluYWwgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXIgcnZocCkgeworCQkvLyBUaGUgZXZlbnQgbm90aWZpY2F0aW9uIGRvZXNuJ3QgY29tZSBmcm9tIHRoZSBVSSB0aHJlYWQgc28gd2UgbmVlZCB0bworCQkvLyBhZGQgYSBSdW5uYWJsZSB0byB0aGUgVUkgdGhyZWFkJ3MgZXhlY3V0aW9uIHF1ZXVlIHRvIGdpdmUgdGhlIG5ldworCQkvLyBzb3VyY2UgdG8gdGhlIGNoYXJ0CisJCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOworCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7CisJCQkvLyBZZXMKKwkJCXRyeSB7CisJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQlpZiAoIXRpbWVTZXJpZXNDYW52YXMuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQkJdGltZVNlcmllc0NhbnZhcy5zZXREYXRhU291cmNlQW5kUmVkcmF3KHJ2aHAsCisJCQkJCQkJCQlzZWxlY3RlZFByb3BlcnRpZXMpOworCQkJCQkJfQorCQkJCQl9IC8vIHJ1bgorCQkJCX0pOyAvLyBkaXNwbGF5LmFzeW5jRXhlYworCQkJfSAvLyB0cnkKKwkJCWNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworCQkJCS8vIElnbm9yZSB0aGVyZSBjb3VsZCBiZSBhIHJhY2UgY29uZGl0aW9uIHdpdGggdGhlIGRpc3BsYXkgYmVpbmcKKwkJCQkvLyBkaXNwb3NlZCB3aGVuIHRoZSBzeXN0ZW0gaXMgc2h1dCBkb3duIHdpdGggYSBydW5uaW5nCisJCQkJLy8gc2ltdWxhdGlvbi4KKwkJCX0gLy8gY2F0Y2ggRXhjZXB0aW9uCisJCX0gLy8gaWYKKwl9IC8vIHJlbGF0aXZlVmFsdWVIaXN0b3J5RXh0ZW5kZWQKKworCS8qKgorCSAqIEluaXRpYWxpemUgdGhlIGNvbnRyb2wgZnJvbSBhCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259IGluc3RhbmNlLgorCSAqIAorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogICAgICAgICAgICB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259CisJICogICAgICAgICAgICB3aG9zZSBzdGF0ZSB3aWxsIGJlIHZpc3VhbGl6ZWQgaW4gdGhlIGNvbnRyb2wuCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb21TaW11bGF0aW9uKGZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb24pIHsKKwkJc2ltdWxhdGlvbk5hbWVMYWJlbC5zZXRUZXh0KHNpbXVsYXRpb24uZ2V0TmFtZSgpKTsKKwkJZGVjb3JhdG9yU2VsZWN0b3Iuc2V0U2ltdWxhdGlvbihzaW11bGF0aW9uKTsKKworCX0gLy8gaW5pdGlhbGl6ZUZyb21TaW11bGF0aW9uCisKKwkvKioKKwkgKiAKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZWZyZXNoMigpIHsKKwkJLy8gbm90aGluZworCX0gLy8gcmVmcmVzaDIKKworCS8qKgorCSAqIEBwYXJhbSBkZWNvcmF0b3IKKwkgKiAgICAgICAgICAgIGEge0BsaW5rIERlY29yYXRvcn0gdGhhdCBtb2RpZmllcyB0aGUgc3RhdGUgb2YgdGhlIGNhbm9uaWNhbAorCSAqICAgICAgICAgICAge0BsaW5rIEdyYXBofSBpbiB0aGUKKwkgKiAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9ufS4KKwkgKiBAcGFyYW0gc2ltdWxhdGlvbgorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9ufQorCSAqIEByZXR1cm4gYSB7QGxpbmsgTGlzdH0gb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHtAbGluayBEZWNvcmF0b3J9IHRoYXQKKwkgKiAgICAgICAgIGNhbiBzaG91bGQgYmUgZGlzcGxheWVkLgorCSAqLworCUxpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydGllc1RvRGlzcGxheSgKKwkJCWZpbmFsIERlY29yYXRvciBkZWNvcmF0b3IpIHsKKwkJZmluYWwgTGlzdDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4oKTsKKwkJLy8gR290IERlY29yYXRvcj8KKwkJaWYgKGRlY29yYXRvciAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCS8vIEFyZSB0aGVyZSBhbnkgbGFiZWxzIHRvIHVwZGF0ZT8KKwkJCWlmICghZGVjb3JhdG9yLmdldExhYmVsc1RvVXBkYXRlKCkuaXNFbXB0eSgpKSB7CisJCQkJLy8gWWVzCisJCQkJLy8gVGhlIGZpcnN0IG9uZSBpcyBnb29kIGVub3VnaAorCQkJCXJldFZhbHVlLmFkZEFsbChwcm9wZXJ0eVNpZXZlLnNpZXZlKGRlY29yYXRvcgorCQkJCQkJLmdldExhYmVsc1RvVXBkYXRlKCkuZ2V0KDApKSk7CisJCQl9IC8vIGlmIGxhYmVscyB0byB1cGRhdGUKKwkJfSAvLyBpZiBnb3QgZGVjb3JhdG9yCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldFByb3BlcnRpZXNUb0Rpc3BsYXkKKworCXByaXZhdGUgR3JhcGggZ2V0R3JhcGgoZmluYWwgTm9kZSBub2RlKSB7CisJCXJldHVybiAoR3JhcGgpIG5vZGUuZUNvbnRhaW5lcigpLmVDb250YWluZXIoKTsKKwl9IC8vIGdldEdyYXBoCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uTGlzdGVuZXIjc2ltdWxhdGlvbkNoYW5nZWQob3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbkV2ZW50KQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJjYXN0IikKKwlwdWJsaWMgdm9pZCBzaW11bGF0aW9uQ2hhbmdlZChmaW5hbCBTaW11bGF0aW9uRXZlbnQgZXZlbnQpIHsKKwkJaWYgKGV2ZW50LmdldFNpbXVsYXRpb25TdGF0ZSgpID09IFNpbXVsYXRpb25TdGF0ZS5SRVNFVCkgeworCQkJLy8gWWVzCisJCQl0aW1lU2VyaWVzQ2FudmFzLnJlc2V0RGF0YSgpOworCQl9IC8vIGlmCisJCS8vIElzIHRoZSBTaW11bGF0aW9uIHN0b3BwaW5nIChpLmUuIGJlaW5nIGRlbGV0ZWQ/KQorCQlpZiAoZXZlbnQuZ2V0U2ltdWxhdGlvblN0YXRlKCkgPT0gU2ltdWxhdGlvblN0YXRlLlNUT1BQRUQpIHsKKwkJCS8vIFllcworCQkJc2ltdWxhdGlvbi5yZW1vdmVTaW11bGF0aW9uTGlzdGVuZXIodGhpcyk7CisJCQlzaW11bGF0aW9uID0gbnVsbDsKKwkJCXN3aXRjaFRvUlZIUChudWxsKTsKKwkJCXJlbGF0aXZlVmFsdWVIaXN0b3J5RXh0ZW5kZWQobnVsbCk7CisJCQlpZGVudGlmaWFibGVUaXRsZS5zZXRUZXh0KCIiKTsKKwkJCWRlY29yYXRvclNlbGVjdG9yCisJCQkJCS5zZXREZWNvcmF0b3JzKChMaXN0PERlY29yYXRvcj4pIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOworCQl9IC8vIGlmCisKKwl9IC8vIHNpbXVsYXRpb25DaGFuZ2VkCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJCWlmICh0aGlzLnJ2aHAgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlydmhwLnJlbW92ZUV4dGVuc2lvbkxpc3RlbmVyKHRoaXMpOworCQl9IC8vIGlmCisJCWlmIChzaW11bGF0aW9uICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJc2ltdWxhdGlvbi5yZW1vdmVTaW11bGF0aW9uTGlzdGVuZXIodGhpcyk7CisJCX0gLy8gaWYKKwl9IC8vIGRpc3Bvc2UKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzLlJlcG9ydENvbnRyb2wjZ2V0SWRlbnRpZmlhYmxlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSWRlbnRpZmlhYmxlIGdldElkZW50aWZpYWJsZSgpIHsKKwkJcmV0dXJuIGlkZW50aWZpYWJsZTsKKwl9CisJCisJLyoqCisJICogVGhpcyBDb250cm9sIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBJZGVudGlmaWFibGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy52aWV3cy5SZXBvcnRDb250cm9sI2dldENvbnRyb2xUeXBlKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENvbnRyb2xUeXBlKCkgeworCQlyZXR1cm4gUmVwb3J0Q29udHJvbEZhY3RvcnkuSURFTlRJRkFCTEVfVFlQRTsKKwl9CisKK30gLy8gUmVsYXRpdmVWYWx1ZUhpc3RvcnlQbG90dGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9SZXBvcnRDb250cm9sLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9SZXBvcnRDb250cm9sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkNDQxMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL3ZpZXdzL1JlcG9ydENvbnRyb2wuamF2YQpAQCAtMCwwICsxLDMyMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5oaXN0b3J5LlJlbGF0aXZlVmFsdWVIaXN0b3J5RXh0ZW5kZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeS5SZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworCisvKioKKyAqIFJlcG9ydENvbnRyb2wgaXMgYSBzdWJjbGFzcyBvZiBDYW52YXMgc3VpdGFibGUgZm9yIGNoYXJ0IGRyYXdpbmdzLgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgUmVwb3J0Q29udHJvbCBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzCisJCVJlbGF0aXZlVmFsdWVIaXN0b3J5RXh0ZW5kZWRMaXN0ZW5lciwgSVNpbXVsYXRpb25MaXN0ZW5lciwKKwkJSVNlbGVjdGlvblByb3ZpZGVyIHsKKworCXByb3RlY3RlZCBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlciBydmhwOworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX1RFWFQgPSAicmVtb3ZlIjsKKwkKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfUkVGRVJFTkNFX1RFWFQgPSAiQWRkIFJlZmVyZW5jZSI7CisKKwlwcm90ZWN0ZWQgTGFiZWwgc2ltdWxhdGlvbk5hbWVMYWJlbDsKKworCS8qKgorCSAqIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn0gYXNzb2NpYXRlZAorCSAqIHdpdGggdGhlIHZhbHVlcyBiZWluZyBwbG90dGVkLgorCSAqLworCXByb3RlY3RlZCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfSB0aGF0IHdlJ3JlIHBsb3R0aW5nLgorCSAqLworCXByb3RlY3RlZCBJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlOworCXByb3RlY3RlZCBEZWNvcmF0b3Igc2VsZWN0ZWREZWNvcmF0b3I7CisJcHJvdGVjdGVkIER5bmFtaWNMYWJlbCBzZWxlY3RlZER5bmFtaWNMYWJlbDsKKwlwcm90ZWN0ZWQgTWFwPERlY29yYXRvciwgTGlzdDxEeW5hbWljTGFiZWw+PiBkZWNvcmF0b3JUb0xhYmVsc01hcDsKKworCS8qKgorCSAqIGJ1dHRvbiB0byByZW1vdmUgdGhpcyBjb250cm9sbGVyIGFuZCB2aWV3CisJICovCisJcHJvdGVjdGVkIEJ1dHRvbiByZW1vdmVCdXR0b24gPSBudWxsOworCQorCS8qKgorCSAqIGJ1dHRvbiB0byBhZGQgYSByZWZlcmVuY2UgZGF0YSBzZXQgdG8gdGhpcyB2aWV3CisJICovCisJcHJvdGVjdGVkIEJ1dHRvbiBhZGRSZWZlcmVuY2VCdXR0b24gPSBudWxsOworCQorCS8qKgorCSAqIGJ1dHRvbiB0byBhZGQgYSByZWZlcmVuY2UgZGF0YSBzZXQgdG8gdGhpcyB2aWV3CisJICovCisJcHJvdGVjdGVkIExhYmVsIGFkZFJlZmVyZW5jZUxhYmVsID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjb2xsZWN0aW9uIG9mIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgd2FpdGluZyB0byBiZSB0b2xkIGFib3V0CisJICogc2VsZWN0aW9ucy4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPiBsaXN0ZW5lcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKKworCS8qKgorCSAqIFRoZSBjb2xsZWN0aW9uIG9mIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgd2FpdGluZyB0byBiZSB0b2xkIGFib3V0CisJICogc2VsZWN0aW9ucy4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxJUmVtb3ZlTGlzdGVuZXI+IHJlbW92ZUxpc3RlbmVycyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxJUmVtb3ZlTGlzdGVuZXI+KCk7CisKKwkvKioKKwkgKiBUaGUgPGNvZGU+SWRlbnRpZmlhYmxlPC9jb2RlPiB0aGF0IHdhcyBtb3N0IHJlY2VudGx5IHNlbGVjdGVkLCBvcgorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaGFzIGJlZW4gc2VsZWN0ZWQuCisJICovCisJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOworCisJcHJvdGVjdGVkIExhYmVsIGlkZW50aWZpYWJsZVRpdGxlOworCisJLyoqCisJICogVGhlIHdpZHRoIG9mIHRoZSBsYXlvdXQgbWFyZ2luLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BUkdJTl9XSURUSCA9IDU7CisKKwkvKioKKwkgKiBUaGUgaGVpZ2h0IG9mIHRoZSBsYXlvdXQgbWFyZ2luLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BUkdJTl9IRUlHSFQgPSA1OworCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqLworCXB1YmxpYyBSZXBvcnRDb250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIGludCBzdHlsZSkgeworCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKKworCQl0aGlzLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgeworCQkJLyoqCisJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyI3dpZGdldERpc3Bvc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50KQorCQkJICovCisJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJCWZpbmFsIERpc3Bvc2VFdmVudCBlKSB7CisJCQkJZGlzcG9zZSgpOworCQkJfQorCQl9KTsKKworCQlmaW5hbCBGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSBNQVJHSU5fSEVJR0hUOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSBNQVJHSU5fV0lEVEg7CisJCXNldExheW91dChsYXlvdXQpOworCisJfSAvLyBSZXBvcnRDb250cm9sCisKKwkvKioKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICB0aGUgcGFyZW50IFNXVCBjb250cm9sIHRoYXQgdGhpcyBjb21wb3NpdGUgd2lsbCBiZSBhIGNoaWxkIG9mCisJICogQHJldHVybiB0aGUgU1dUIENvbXBvc2l0ZSB0byBiZSBkaXNwbGF5ZWQgYWJvdmUgdGhlIE1hcENhbnZhcyBpbiB0aGUKKwkgKiAgICAgICAgIGNvbnRyb2wKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcENvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisJCWZpbmFsIENvbXBvc2l0ZSB0b3BDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCisJCWZpbmFsIEZpbGxMYXlvdXQgdG9wQ29tcG9zaXRlTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoU1dULlZFUlRJQ0FMKTsKKwkJdG9wQ29tcG9zaXRlLnNldExheW91dCh0b3BDb21wb3NpdGVMYXlvdXQpOworCisJCXNpbXVsYXRpb25OYW1lTGFiZWwgPSBuZXcgTGFiZWwodG9wQ29tcG9zaXRlLCBTV1QuQ0VOVEVSKTsKKwkJc2ltdWxhdGlvbk5hbWVMYWJlbC5zZXRUZXh0KCIiKTsKKworCQlyZXR1cm4gdG9wQ29tcG9zaXRlOworCX0gLy8gY3JlYXRlVG9wQ29tcG9zaXRlCisKKwlwcm90ZWN0ZWQgdm9pZCBzd2l0Y2hUb1JWSFAoZmluYWwgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlckFkYXB0ZXIgcnZocCkgeworCQkvLyBJcyB0aGVyZSBhbiBleGlzdGluZyBSVkhQIHRvIHN0b3AgbGlzdGVuaW5nIHRvPworCQlpZiAodGhpcy5ydmhwICE9IG51bGwgJiYgdGhpcy5ydmhwICE9IHJ2aHApIHsKKwkJCS8vIFllcworCQkJdGhpcy5ydmhwLnJlbW92ZUV4dGVuc2lvbkxpc3RlbmVyKHRoaXMpOworCQl9IC8vIGlmCisKKwkJLy8gU2hvdWxkIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmV3IG9uZT8KKwkJaWYgKHRoaXMucnZocCAhPSBydmhwICYmIHJ2aHAgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlydmhwLmFkZEV4dGVuc2lvbkxpc3RlbmVyKHRoaXMpOworCQl9IC8vIGlmCisKKwkJdGhpcy5ydmhwID0gcnZocDsKKwl9IC8vIHN3aXRjaFRvUlZIUAorCisJLyoqCisJICogQWxsIGNvbnRyb2xsZXJzIG11c3QgaW1wbGVtZW50IHRoaXMgdG8gcmVtb3ZlIHRoZSBjb250cm9sIGUuZy4gYnkgYQorCSAqIHJlbW92ZSBidXR0b24gZXZlbnQKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmUoKTsKKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqLworCXB1YmxpYyB2b2lkIGFkZElSZW1vdmVMaXN0ZW5lcihmaW5hbCBJUmVtb3ZlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJcmVtb3ZlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIGxpc3RlbmVyCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlSVJlbW92ZUxpc3RlbmVyKGZpbmFsIElSZW1vdmVMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlyZW1vdmVMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gaWRlbnQKKwkgKi8KKwlwdWJsaWMgdm9pZCBmaXJlUmVtb3ZlRXZlbnQoZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50KSB7CisJCWZvciAoZmluYWwgSVJlbW92ZUxpc3RlbmVyIGxpc3RlbmVyIDogcmVtb3ZlTGlzdGVuZXJzKSB7CisJCQlsaXN0ZW5lci5pZGVudGlmaWFibGVSZW1vdmVkKGlkZW50KTsKKwkJfSAvLyBmb3IgZWFjaCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCisJfQorCisJLyoqCisJICogU2V0dGluZyB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259IGhhcworCSAqIHRoZSBzaWRlLWVmZmVjdCBvZiBjYXVzaW5nIHRoZSBjb250cm9sIHRvIHJlbW92ZSBpdHNlbGYgYXMgYSBsaXN0ZW5lcgorCSAqIGZyb20gYW55IHByZXZpb3VzbHkgc2V0CisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259IGFuZCBhZGRpbmcgaXRzZWxmCisJICogYXMgYSBsaXN0ZW5lciB0byB0aGUgbmV3IG9uZS4gSXQgd2lsbCBhbHNvIGNhdXNlIHRoZSBpbWFnZSB0byBiZQorCSAqIGluaXRpYWxpemVkIGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoZSBuZXcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn0gYXMgYXBwcm9wcmlhdGUuCisJICogCisJICogQHBhcmFtIHNpbXVsYXRpb24KKwkgKiAgICAgICAgICAgIHRoZSBzaW11bGF0aW9uIHdob3NlIExhdC9Mb25nIGRhdGEgd2lsbCBiZSByZW5kZXJlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTaW11bGF0aW9uKGZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb24pIHsKKwkJLy8gQW55IG5lZWQgdG8gc3dpdGNoPworCQlpZiAodGhpcy5zaW11bGF0aW9uID09IHNpbXVsYXRpb24pIHsKKwkJCS8vIE5vCisJCQlyZXR1cm47CisJCX0gLy8gaWYgbm8gbmVlZCB0byBzd2l0Y2g/CisKKwkJLy8gU2hvdWxkIHdlIHJlbW92ZSBvdXJzZWx2ZXMgYXMgbGlzdGVuZXJzIGZyb20gdGhlIGN1cnJlbnQgc2ltdWxhdGlvbj8KKwkJaWYgKHRoaXMuc2ltdWxhdGlvbiAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXRoaXMuc2ltdWxhdGlvbi5yZW1vdmVTaW11bGF0aW9uTGlzdGVuZXIodGhpcyk7CisJCX0KKworCQl0aGlzLnNpbXVsYXRpb24gPSBzaW11bGF0aW9uOworCQlzZWxlY3Rpb24gPSBudWxsOworCQkvLyBXYXMgdGhlcmUgYSBuZXcgc2ltdWxhdGlvbiB0byBzd2l0Y2ggdG8/CisJCWlmICh0aGlzLnNpbXVsYXRpb24gIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQl0aGlzLnNpbXVsYXRpb24uYWRkU2ltdWxhdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJaW5pdGlhbGl6ZUZyb21TaW11bGF0aW9uKHRoaXMuc2ltdWxhdGlvbik7CisJCX0gZWxzZSB7CisJCQkvLyBObworCQkJLy8gSnVzdCBkaXNwbGF5IGEgYmxhbmsgc2NyZWVuCisJCQlpbml0aWFsaXplRnJvbVNpbXVsYXRpb24obnVsbCk7CisJCX0KKworCQlyZWZyZXNoMigpOworCX0gLy8gc2V0U2ltdWxhdGlvbgorCisJLyoqCisJICogCisJICogQHBhcmFtIHNpbXVsYXRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplRnJvbVNpbXVsYXRpb24oCisJCQlmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uKTsKKworCS8qKgorCSAqIAorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJlZnJlc2gyKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24KKwkgKi8KKwlwdWJsaWMgZmluYWwgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7CisJCXJldHVybiBzZWxlY3Rpb247CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNzZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKwkJZmlyZVNlbGVjdGlvbihzZWxlY3Rpb24pOworCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBpZGVudGlmaWFibGUKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJZGVudGlmaWFibGUoSWRlbnRpZmlhYmxlIGlkZW50aWZpYWJsZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBJZGVudGlmaWFibGUgYmVpbmcgZGlzcGxheWVkCisJICogCisJICogQHJldHVybiBUaGUgaWRlbnRpZmlhYmxlIHRvIGJlIG1vbml0b3JlZAorCSAqIAorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBJZGVudGlmaWFibGUgZ2V0SWRlbnRpZmlhYmxlKCk7CisKKwkvKioKKwkgKiBQYXNzIGEge0BsaW5rIFNlbGVjdGlvbkNoYW5nZWRFdmVudH0gYWxvbmcgdG8gbGlzdGVuZXJzLgorCSAqIAorCSAqIEBwYXJhbSBzZWxlY3Rpb24KKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgSVNlbGVjdGlvbn0gdG8gYmUgZ2l2aW5nIHRvIHRoZSBsaXN0ZW5lcnMuCisJICovCisJcHVibGljIHZvaWQgZmlyZVNlbGVjdGlvbihmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCisJCWZpbmFsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywKKwkJCQlzZWxlY3Rpb24pOworCQlmb3IgKGZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKKwkJCWxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOworCQl9IC8vIGZvciBlYWNoIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKKworCX0gLy8gZmlyZVNlbGVjdGlvbgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKKwkJCWZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNyZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKKwkJCWZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfQorCQorCS8qKgorCSAqIE9uZSBvZiB0d28gQ29udHJvbCB0eXBlcy4gQ29udHJvbHMgYXJlIGFzc29jaWF0ZWQgd2l0aCBlaXRoZXIgYW4gaW5kaXZpZHVhbAorCSAqIElkZW50aWZpYWJsZSBvciBhIFNpbXVsYXRpb24KKwkgKiBAcmV0dXJuIHRoZSBjb250cm9sIHR5cGUKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldENvbnRyb2xUeXBlKCkgOworCit9IC8vIFJlcG9ydENvbnRyb2wKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL3ZpZXdzL1JlcG9ydENvbnRyb2xGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9SZXBvcnRDb250cm9sRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMTBhNjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9SZXBvcnRDb250cm9sRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8vIFJlcG9ydENvbnRyb2xGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGZhY3RvcmllcyB0aGF0IGNyZWF0ZSBpbnN0YW5jZXMgb2YKKyAqIHtAbGluayBSZXBvcnRDb250cm9sfS4KKyAqLworcHVibGljIGludGVyZmFjZSBSZXBvcnRDb250cm9sRmFjdG9yeSB7CisJCisJLyoqCisJICogT25lIG9mIHR3byBmYWN0b3J5IHR5cGVzLiBUaGlzIGZhY3RvcnkgdHlwZSBjcmVhdGVzIGEgY29udHJvbCBhc3NvY2lhdGVkIHdpdGggYW4gaW5kaXZpZHVhbAorCSAqIGlkZW50aWZpYWJsZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZBQkxFX1RZUEUgPSAiSURFTlRJRklBQkxFX0NPTlRST0xfRkFDVE9SWSI7CisJLyoqCisJICogT25lIG9mIHR3byBmYWN0b3J5IHR5cGVzLiBUaGlzIGZhY3RvcnkgdHlwZSBjcmVhdGVzIGEgY29udHJvbCBhc3NvY2lhdGVkIHdpdGggYW4gaW5kaXZpZHVhbAorCSAqIFNpbXVsYXRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSU1VTEFUSU9OX1RZUEUgPSAiU0lNVUxBVElPTl9DT05UUk9MX0ZBQ1RPUlkiOworCQorCQorCS8qKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2YgdGhlIGNvbnRyb2wKKwkgKiBAcmV0dXJuIGEgbmV3IHtAbGluayBSZXBvcnRDb250cm9sfSBpbnN0YW5jZS4KKwkgKi8KKwlSZXBvcnRDb250cm9sIGNyZWF0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50KTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHVuaXF1ZSB0eXBlIG9mIGNvbnRyb2wKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUNvbnRyb2xOYW1lKCk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgdW5pcXVlIGZhY3RvcnkgdHlwZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeVR5cGUoKTsKKworfSAvLyBSZXBvcnRDb250cm9sRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvUmVwb3J0Vmlld2VyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9SZXBvcnRWaWV3ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWU3OTAyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvUmVwb3J0Vmlld2VyLmphdmEKQEAgLTAsMCArMSw5NjIgQEAKKy8vIFJlcG9ydFZpZXdlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dTZXR0aW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLk1hcENvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CisKKy8qKgorICogVGhpcyBjbGFzcyBwcmVzZW50cyAidmlld3MiIG9mIHRoZSBydW5uaW5nIHNpbXVsYXRpb25zLgorICovCitwdWJsaWMgY2xhc3MgUmVwb3J0Vmlld2VyIGV4dGVuZHMgVmlld2VyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwKKwkJSVNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXIgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgSWRlbnRpZmlhYmxlfXMgdG8gZGlzcGxheSAoCisJICoge0BsaW5rIE5vZGV9cyBmb3Igbm93KQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9ufXMgdGhhdCBzaG91bGQgYmUKKwkgKiBkaXNwbGF5ZWQuCisJICovCisJcHJpdmF0ZSBmaW5hbCBTZXQ8SWRlbnRpZmlhYmxlPiBpZGVudGlmaWFibGVzVG9EaXNwbGF5ID0gbmV3IExpbmtlZEhhc2hTZXQ8SWRlbnRpZmlhYmxlPigpOworCisJLyoqCisJICogVGhpcyBpcyB0aGUge0BsaW5rIFNpbXVsYXRpb25NYW5hZ2VyfSB0aGF0IGlzIHRoZSBpbnB1dCB0byB0aGUgdmlld2VyLiBJdAorCSAqIG1haW50YWlucyBhIGNvbGxlY3Rpb24gb2YgYWN0aXZlCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259cyBpbiB0aGUgc3lzdGVtLgorCSAqIFRoaXMgdmlld2VyIGxpc3RlbnMgdG8gaXQgdG8gZGlzY292ZXIgd2hlbiBuZXcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn1zIGFyZSBjcmVhdGVkIGFuZAorCSAqIG9sZCBvbmVzIGRpc2FwcGVhci4KKwkgKiAKKwkgKiBAc2VlICNzaW11bGF0aW9uc0NoYW5nZWQoU2ltdWxhdGlvbk1hbmFnZXJFdmVudCkKKwkgKi8KKwlwcml2YXRlIFNpbXVsYXRpb25NYW5hZ2VyIHNpbXVsYXRpb25NYW5hZ2VyOworCisJLyoqCisJICogVGhlIHtAbGluayBJZGVudGlmaWFibGV9IHRoYXQgd2FzIG1vc3QgcmVjZW50bHkgc2VsZWN0ZWQgYnkgYSB1c2VyCisJICogY2xpY2tpbmcgb24gb25lIG9mIHRoZQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLk1hcENvbnRyb2x9cywgb3IKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGhhcyBiZWVuIHNlbGVjdGVkLgorCSAqLworCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdG9wLWxldmVsIGNvbnRyb2wgb2YgdGhlIHZpZXdlci4gSXQgY29udGFpbnMgdGhlCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuTWFwQ29udHJvbH1zIHRoYXQKKwkgKiBkaXNwbGF5IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9ufXMuCisJICovCisJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKKworCS8qKgorCSAqIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZXMgYXJlIHN0b3JlZCBpbiB7QGxpbmsgRGlhbG9nU2V0dGluZ3N9CisJICovCisJcHJpdmF0ZSBEaWFsb2dTZXR0aW5ncyBtYXN0ZXJTZXR0aW5ncyA9IG51bGw7CisKKwkvKioKKwkgKiBTZXQgb2YgcHJlZmVycmVkIExvY2F0aW9ucyB0byBtb25pdG9yIHJlYWQgZnJvbSB0aGUKKwkgKiB7QGxpbmsgRGlhbG9nU2V0dGluZ3N9CisJICovCisJcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBtb25pdG9yU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCisJLyoqCisJICogcm9vdCBrZXkgZWxlbWVudCBmb3IgdGhlIHtAbGluayBEaWFsb2dTZXR0aW5nc30geG1sIGZpbGUKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9LRVkgPSAicm9vdCI7CisKKwkvKioKKwkgKiBDb25zdGFudHMgZm9yIHNhdmluZyBSZXBvcnRWaWV3UHJlZmVyZW5jZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRWSUVXUFJFRkVSRU5DRVNfRklMRU5BTUUgPSAiUHJlZmVyZW5jZXMudHh0IjsKKworCS8qKgorCSAqIFRPRE8gSkZLCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fUFJFRkVSRU5DRV9LRVkgPSAibG9jYXRpb24uaWRzIjsKKworCS8vIGdldCB0aGUgcGF0aAorCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIFBBVEggPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKTsKKworCS8qKgorCSAqIFRoaXMgZmFjdG9yeSBpcyB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2Yge0BsaW5rIFJlcG9ydENvbnRyb2x9IGluIHRoZQorCSAqIG1ldGhvZCB7QGxpbmsgI3BvcHVsYXRlVmlldygpfQorCSAqLworCXByaXZhdGUgZmluYWwgUmVwb3J0Q29udHJvbEZhY3RvcnkgcmNmOworCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgdGhlIFNXVCBwYXJlbnQgb2YgdGhlIGNvbnRyb2wgdGhhdCBtYWtlcyB1cCB0aGUgdmlld2VyCisJICogQHBhcmFtIHJjZgorCSAqICAgICAgICAgICAgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIGluc3RhbmNlIG9mIHtAbGluayBSZXBvcnRDb250cm9sfQorCSAqLworCXB1YmxpYyBSZXBvcnRWaWV3ZXIoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgUmVwb3J0Q29udHJvbEZhY3RvcnkgcmNmKSB7CisKKwkJY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJZmluYWwgRmlsbExheW91dCBjb21wb3NpdGVMYXlvdXQgPSBuZXcgRmlsbExheW91dChTV1QuSE9SSVpPTlRBTCk7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXQoY29tcG9zaXRlTGF5b3V0KTsKKworCQkvLyBSZW1lbWJlciB0aGUgZmFjdG9yeSB0aGF0IHdlJ2xsIHVzZSB0byBjcmVhdGUgaW5zdGFuY2VzIG9mCisJCS8vIFJlcG9ydENvbnRyb2wKKwkJdGhpcy5yY2YgPSByY2Y7CisJCXJlZnJlc2goKTsKKwkJY29tcG9zaXRlLnBhY2soKTsKKworCX0gLy8gUmVwb3J0Vmlld2VyCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyI2dldENvbnRyb2woKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7CisJCXJldHVybiBjb21wb3NpdGU7CisJfSAvLyBnZXRDb250cm9sCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyI2dldFNlbGVjdGlvbigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgeworCQlyZXR1cm4gc2VsZWN0aW9uOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIjcmVmcmVzaCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKKwkJaWYgKHNpbXVsYXRpb25NYW5hZ2VyICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJTGlzdDxJU2ltdWxhdGlvbj4gYWxsU2ltdWxhdGlvbnMgPSBudWxsOworCQkJTGlzdDxJU2ltdWxhdGlvbj4gYWN0aXZlU2ltdWxhdGlvbnMgPSBzaW11bGF0aW9uTWFuYWdlci5nZXRBY3RpdmVTaW11bGF0aW9ucygpOworCQkJaWYoKGFjdGl2ZVNpbXVsYXRpb25zIT1udWxsKSYmKGFjdGl2ZVNpbXVsYXRpb25zLnNpemUoKT49MSkpIHsKKwkJCQlmb3IgKGludCBpPTAgOyBpIDwgYWN0aXZlU2ltdWxhdGlvbnMuc2l6ZSgpOyBpICsrKSB7CisJCQkJCUlTaW11bGF0aW9uIHNpbSA9IGFjdGl2ZVNpbXVsYXRpb25zLmdldChpKTsKKwkJCQkJdXBkYXRlUHJlZmVyZW5jZVN0YXRlKHNpbSk7CisJCQkJfQorCQkJfQorCQkJCisJCQlhbGxTaW11bGF0aW9ucyA9IHNpbXVsYXRpb25NYW5hZ2VyLmdldEFjdGl2ZVNpbXVsYXRpb25zKCk7CisJCQlhZGRUb0Rpc3BsYXllZElkZW50aWZpYWJsZVNldChhbGxTaW11bGF0aW9ucyk7CisKKwkJCWlkZW50aWZpYWJsZXNUb0Rpc3BsYXkuY2xlYXIoKTsKKwkJCWlkZW50aWZpYWJsZXNUb0Rpc3BsYXkuYWRkQWxsKGdldElkZW50aWZpYWJsZXNJblNpbXVsYXRpb24oYWxsU2ltdWxhdGlvbnMpKTsKKwkJfSAvLyBpZgorCQkvLyBjYWxsaW5nIHdpdGggbnVsbCBtZWFucyB0aGlzIGlzIGEgbmV3IGlkZW50aWZpYWJsZSBmb3IgYW4gCisJCS8vIGFjdGl2ZSBzaW11bGF0aW9uIGJ1dCBub3QgYSBuZXcgc2ltdWxhdGlvbgorCQlpZihyY2YuZ2V0RmFjdG9yeVR5cGUoKS5lcXVhbHMoUmVwb3J0Q29udHJvbEZhY3RvcnkuSURFTlRJRkFCTEVfVFlQRSkpeworCQkJcG9wdWxhdGVWaWV3KCk7CisJCX0gZWxzZSB7CisJCQlwb3B1bGF0ZVZpZXcobnVsbCk7CisJCX0KKwkJCisJfSAvLyByZWZyZXNoCisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gaWRlbnQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRNb25pdG9yKGZpbmFsIElkZW50aWZpYWJsZSBpZGVudCkgeworCisJCS8vIHRoaXMgZml4ZXMgYSBidWcgd2hlcmUgY2xpY2tzIGluIHRoZQorCQkvLyBEZXNpZ25lciBwZXJzcGVjdGl2ZSB3ZXJlIGNyZWF0aW5nIG5ldyBSZXBvcnRWaWV3cworCQlpZiAoIShpZGVudCBpbnN0YW5jZW9mIE5vZGUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWRlbnRpZmlhYmxlc1RvRGlzcGxheS5hZGQoaWRlbnQpOworCQlwb3B1bGF0ZVZpZXcoKTsKKwkJLy8gcHJlZmVyZW5jZSBzdGF0ZSBoYXMgY2hhbmdlZAorCQlzYXZlUHJlZmVyZW5jZVN0YXRlKCk7CisJfSAvLyBhZGRNb25pdG9yCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyI2dldElucHV0KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldElucHV0KCkgeworCQlyZXR1cm4gc2ltdWxhdGlvbk1hbmFnZXI7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciNzZXRJbnB1dChqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldElucHV0KGZpbmFsIE9iamVjdCBpbnB1dCkgeworCQlmaW5hbCBPYmplY3Qgb2xkSW5wdXQgPSBzaW11bGF0aW9uTWFuYWdlcjsKKwkJc2ltdWxhdGlvbk1hbmFnZXIgPSAoU2ltdWxhdGlvbk1hbmFnZXIpIGlucHV0OworCQlpbnB1dENoYW5nZWQoaW5wdXQsIG9sZElucHV0KTsKKwl9IC8vIHNldElucHV0CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyI2lucHV0Q2hhbmdlZChqYXZhLmxhbmcuT2JqZWN0LAorCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbnB1dENoYW5nZWQoZmluYWwgT2JqZWN0IGlucHV0LCBmaW5hbCBPYmplY3Qgb2xkSW5wdXQpIHsKKwkJLy8gSXMgdGhlcmUgYWxyZWFkeSBhIHNpbXVsYXRpb24gbWFuYWdlcj8KKwkJaWYgKG9sZElucHV0ICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJKChTaW11bGF0aW9uTWFuYWdlcikgb2xkSW5wdXQpLnJlbW92ZUxpc3RlbmVyKHRoaXMpOworCQl9IC8vIGlmCisKKwkJLy8gUmVnaXN0ZXIgd2l0aCB0aGUgU2ltdWxhdGlvbk1hbmFnZXIgdG8gbGlzdGVuIGZvciBjaGFuZ2VzIGluIHRoZSBzZXQKKwkJLy8gb2YgYWN0aXZlIFNpbXVsYXRpb25zLgorCQkvLyBHb3QgaW5wdXQ/CisJCWlmIChpbnB1dCAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCSgoU2ltdWxhdGlvbk1hbmFnZXIpIGlucHV0KS5hZGRTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyKHRoaXMpOworCQl9IC8vIGlmCisKKwkJLy8gVXBkYXRlIHRoZSB2aWV3ZXIgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIG5ldyBpbnB1dCBzb3VyY2UKKwkJcmVmcmVzaCgpOworCX0gLy8gaW5wdXRDaGFuZ2VkCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyI3NldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24sCisJICogICAgICBib29sZWFuKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbiwKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBib29sZWFuIHJldmVhbCkgeworCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoZmluYWwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisKKwkJLy8gRGlkIHRoZSBldmVudCBjb21lIGZyb20gYSBSZXBvcnRDb250cm9sPworCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSBpbnN0YW5jZW9mIFJlcG9ydENvbnRyb2wpIHsKKwkJCS8vIFllcworCQkJLy8gSnVzdCBwYXNzIGl0IGFsb25nCisJCQlzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKKwkJCWZpcmVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKKwkJfSAvLyBpZgorCX0gLy8gc2VsZWN0aW9uQ2hhbmdlZAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lciNzaW11bGF0aW9uc0NoYW5nZWQob3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXJFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzaW11bGF0aW9uc0NoYW5nZWQoZmluYWwgU2ltdWxhdGlvbk1hbmFnZXJFdmVudCBldmVudCkgeworCQkKKwkJLy8gSW5pdCB0aGUgcHJlZmVyZW5jZQorCQlyZW1vdmVGcm9tRGlzcGxheWVkU2ltdWxhdGlvblNldChBcnJheXMuYXNMaXN0KGV2ZW50LmdldFNpbXVsYXRpb25zUmVtb3ZlZCgpKSk7CisJCUxpc3Q8SVNpbXVsYXRpb24+IG5ld1NpbXVsYXRpb25MaXN0ID0gQXJyYXlzLmFzTGlzdChldmVudC5nZXRTaW11bGF0aW9uc0FkZGVkKCkpOworCQlpZigobmV3U2ltdWxhdGlvbkxpc3QhPW51bGwpJiYobmV3U2ltdWxhdGlvbkxpc3Quc2l6ZSgpID49MSkpIHsKKwkJCWZvciAoaW50IGkgPSAwOyAgaSA8IG5ld1NpbXVsYXRpb25MaXN0LnNpemUoKTsgaSArKykgeworCQkJCUlTaW11bGF0aW9uIHNpbSA9IG5ld1NpbXVsYXRpb25MaXN0LmdldChpKTsKKwkJCQl1cGRhdGVQcmVmZXJlbmNlU3RhdGUoc2ltKTsKKwkJCQlhZGRUb0Rpc3BsYXllZElkZW50aWZpYWJsZVNldChzaW0pOworCQkJCXBvcHVsYXRlVmlldygpOyAvLyB0aGUgdGltZSBzZXJpZXMgY2hhcnRzCisJCQkJLy8gbmV3IHNpbXVsYXRpb24gISEKKwkJCQlwb3B1bGF0ZVZpZXcoc2ltKTsvLyB0aGUgYWdncmVnYXRlIGNoYXJ0cworCQkJfQorCQl9CisJCQorCX0gLy8gc2ltdWxhdGlvbnNDaGFuZ2VkCisKKwkvKioKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbnMKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn1zCisJICogICAgICAgICAgICB0byBhZGQgdG8gdGhlIHNldCBiZWluZyBkaXNwbGF5ZWQuCisJICovCisJcHJpdmF0ZSB2b2lkIGFkZFRvRGlzcGxheWVkSWRlbnRpZmlhYmxlU2V0KAorCQkJZmluYWwgTGlzdDxJU2ltdWxhdGlvbj4gc2ltdWxhdGlvbnMpIHsKKwkJLy8gQW55IHNpbXVsYXRpb25zIHRvIGFkZD8KKwkJaWYgKCFzaW11bGF0aW9ucy5pc0VtcHR5KCkpIHsKKwkJCS8vIFllcworCQkJaWRlbnRpZmlhYmxlc1RvRGlzcGxheQorCQkJCQkuYWRkQWxsKGdldElkZW50aWZpYWJsZXNJblNpbXVsYXRpb24oc2ltdWxhdGlvbnMpKTsKKwkJfSAvLyBpZiBhbnkgc2ltdWxhdGlvbnMKKwl9IC8vIGFkZFRvRGlzcGxheWVkU2ltdWxhdGlvblNldAorCisJLyoqCisJICogQHBhcmFtIHNpbXVsYXRpb25zCisJICogICAgICAgICAgICB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259cworCSAqICAgICAgICAgICAgdG8gYWRkIHRvIHRoZSBzZXQgYmVpbmcgZGlzcGxheWVkLgorCSAqLworCXByaXZhdGUgdm9pZCBhZGRUb0Rpc3BsYXllZElkZW50aWZpYWJsZVNldChJU2ltdWxhdGlvbiBzaW0pIHsJCQorCQkJaWRlbnRpZmlhYmxlc1RvRGlzcGxheS5hZGRBbGwoZ2V0SWRlbnRpZmlhYmxlc0luU2ltdWxhdGlvbihzaW0pKTsKKwl9IC8vIGFkZFRvRGlzcGxheWVkU2ltdWxhdGlvblNldAorCisJCisJLyoqCisJICogQHBhcmFtIHNpbXVsYXRpb25zCisJICogICAgICAgICAgICB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259cworCSAqICAgICAgICAgICAgdG8gcmVtb3ZlIGZyb20gdGhlIHNldCBiZWluZyBkaXNwbGF5ZWQuCisJICovCisJcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21EaXNwbGF5ZWRTaW11bGF0aW9uU2V0KAorCQkJZmluYWwgTGlzdDxJU2ltdWxhdGlvbj4gc2ltdWxhdGlvbnMpIHsKKwkJLy8gQW55IHNpbXVsYXRpb25zIHRvIHJlbW92ZT8KKwkJaWYgKCFzaW11bGF0aW9ucy5pc0VtcHR5KCkpIHsKKwkJCS8vIFllcworCQkJZmluYWwgU2V0PElkZW50aWZpYWJsZT4gZGVmdW5jdElkZW50aWZpYWJsZXMgPSBnZXRJZGVudGlmaWFibGVzSW5TaW11bGF0aW9uKHNpbXVsYXRpb25zKTsKKwkJCWlkZW50aWZpYWJsZXNUb0Rpc3BsYXkucmVtb3ZlQWxsKGRlZnVuY3RJZGVudGlmaWFibGVzKTsKKwkJCWNsZWFudXAoZGVmdW5jdElkZW50aWZpYWJsZXMpOworCQl9IC8vIGlmCisJfSAvLyByZW1vdmVGcm9tRGlzcGxheWVkU2ltdWxhdGlvblNldAorCisJLyoqCisJICogY2xlYW5zIHVwIG9sZCBkaXNwbGF5cworCSAqIAorCSAqIEBwYXJhbSBkZWZ1bmN0SWRlbnRpZmlhYmxlcworCSAqLworCXByaXZhdGUgdm9pZCBjbGVhbnVwKGZpbmFsIFNldDxJZGVudGlmaWFibGU+IGRlZnVuY3RJZGVudGlmaWFibGVzKSB7CisJCWlmIChkZWZ1bmN0SWRlbnRpZmlhYmxlcyAhPSBudWxsKSB7CisJCQlmaW5hbCBJdGVyYXRvcjxJZGVudGlmaWFibGU+IGl0ZXIgPSBkZWZ1bmN0SWRlbnRpZmlhYmxlcy5pdGVyYXRvcigpOworCQkJd2hpbGUgKChpdGVyICE9IG51bGwpICYmIChpdGVyLmhhc05leHQoKSkpIHsKKwkJCQlmaW5hbCBJZGVudGlmaWFibGUgaWRlbnQgPSBpdGVyLm5leHQoKTsKKwkJCQltb25pdG9yU2V0LnJlbW92ZShpZGVudC5nZXRVUkkoKS50b1N0cmluZygpKTsKKwkJCX0gLy8gd2hpbGUKKworCQkJZmluYWwgQ29udHJvbFtdIGFsbENvbnRyb2xzID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7CisJCQkKKwkJCWZvciAoZmluYWwgQ29udHJvbCBlbGVtZW50IDogYWxsQ29udHJvbHMpIHsKKwkJCQlmaW5hbCBSZXBvcnRDb250cm9sIHJlcG9ydENvbnRyb2wgPSAoUmVwb3J0Q29udHJvbCkgZWxlbWVudDsKKwkJCQl0cnkgeworCQkJCQlmaW5hbCBJZGVudGlmaWFibGUgdGVzdElkZW50aWZpYWJsZSA9IHJlcG9ydENvbnRyb2wKKwkJCQkJCQkuZ2V0SWRlbnRpZmlhYmxlKCk7CisJCQkJCWlmICgodGVzdElkZW50aWZpYWJsZSA9PSBudWxsKQorCQkJCQkJCXx8ICghaWRlbnRpZmlhYmxlc1RvRGlzcGxheQorCQkJCQkJCQkJLmNvbnRhaW5zKHRlc3RJZGVudGlmaWFibGUpKSkgeworCQkJCQkJLy8gZGlzcG9zZSBpZiB3ZSBrbm93IGl0IGlzIGRlZnVuY3QKKwkJCQkJCXJlcG9ydENvbnRyb2wucmVtb3ZlKCk7CisJCQkJCX0gLy8gaWYKKwkJCQl9IGNhdGNoIChvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIHN3dGUpIHsKKwkJCQkJLy8gaWYgV2lkZ2V0IGlzIGFscmVhZHkgZGlzcG9zZWQganVzdCBkbyBub3RoaW5nCisJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic3d0ZTogIitzd3RlLmdldE1lc3NhZ2UoKSk7CisJCQkJfQorCisJCQl9IC8vIGZvciBlYWNoIFJlcG9ydENvbnRyb2wKKworCQl9Ly8gaWYgc2V0IG5vdCBudWxsCisJfS8vIGNsZWFudXAKKworCXByb3RlY3RlZCB2b2lkIHJlbW92ZUlkZW50aWZpYWJsZShmaW5hbCBJZGVudGlmaWFibGUgaWRlbnQpIHsKKwkJLy8gQW55IHNpbXVsYXRpb25zIHRvIHJlbW92ZT8KKwkJaWYgKGlkZW50ICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJaWRlbnRpZmlhYmxlc1RvRGlzcGxheS5yZW1vdmUoaWRlbnQpOworCisJCQkvLyBwcmVmZXJlbmNlIHN0YXRlIGhhcyBjaGFuZ2VkCisJCQlzYXZlUHJlZmVyZW5jZVN0YXRlKCk7CisKKwkJfSAvLyBpZgorCX0gLy8gcmVtb3ZlRnJvbURpc3BsYXllZFNpbXVsYXRpb25TZXQKKworCS8qKgorCSAqIENyZWF0ZSBhbmQgZGlzcG9zZSBvZiB7QGxpbmsgTWFwQ29udHJvbH1zIGFzIG5lY2Vzc2FyeSB0byBkaXNwbGF5IHRoZQorCSAqIHNlbGVjdGVkIHtAbGluayBTaW11bGF0aW9ufXMuCisJICovCisJcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVmlldyhJU2ltdWxhdGlvbiBzaW0pIHsKKwkJLy8gVEhFIEFnZ3JlZ2F0ZSBjb250cm9sIGlzIGEgc3BlY2lhbCBjYXNlLiBBbGwgb3RoZXJzIGhhbmRsZWQgYnkgdGhlIG90aGVyIHBvcHVsYXRlVmlldyBtZXRob2QKKwkJaWYoICEgKHRoaXMucmNmLmdldEZhY3RvcnlUeXBlKCkuZXF1YWxzKFJlcG9ydENvbnRyb2xGYWN0b3J5LlNJTVVMQVRJT05fVFlQRSkpKSByZXR1cm47CisJCWJvb2xlYW4gZm91bmRDb250cm9sID0gZmFsc2U7CisJCS8vIHByb2JsZW0gaGVyZSB3aGVuIHdlIHN0YXJ0IHVwCisJCS8vIEFyZSB3ZSBkb25lPworCQlpZiAoY29tcG9zaXRlLmlzRGlzcG9zZWQoKSkgeworCQkJLy8gWWVzCisJCQlyZXR1cm47CisJCX0gLy8gaWYKKworCQlzZWxlY3Rpb24gPSBudWxsOworCQkKKwkJTGlzdDxJU2ltdWxhdGlvbj4gYWN0aXZlU2ltTGlzdCA9IFNpbXVsYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRBY3RpdmVTaW11bGF0aW9ucygpOworCQlTZXQ8SVNpbXVsYXRpb24+IGFjdGl2ZVNpbVNldCA9IG5ldyBIYXNoU2V0PElTaW11bGF0aW9uPigpOworCQlhY3RpdmVTaW1TZXQuYWRkQWxsKGFjdGl2ZVNpbUxpc3QpOworCisJCWlmKHNpbSAhPSBudWxsKSB7CisJCQkvLyBHbyB0aHJvdWdoIHRoZSBjdXJyZW50IHNldCBvZiBDb250cm9scyBsb29raW5nIGZvciBvbmVzIHRoYXQKKwkJCS8vIHdlIGNhbiByZWFzc2lnbgorCQkJZmluYWwgQ29udHJvbFtdIGNvbnRyb2xzID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7CisJCQlmb3IgKGZpbmFsIENvbnRyb2wgZWxlbWVudCA6IGNvbnRyb2xzKSB7CisJCQkJLy8gRG9lcyB0aGlzIFJlcG9ydENvbnRyb2wgaGF2ZSBhIHNpbXVsYXRpb24gdGhhdCBpcyBzdGlsbCB2YWxpZAorCQkJCS8vIHRvIGRpc3BsYXk/CisJCQkJZmluYWwgUmVwb3J0Q29udHJvbCByZXBvcnRDb250cm9sID0gKFJlcG9ydENvbnRyb2wpIGVsZW1lbnQ7CisJCQkJLy8gVEhFIEFnZ3JlZ2F0ZSBjb250cm9sIGlzIGEgc3BlY2lhbCBjYXNlCisJCQkJaWYocmVwb3J0Q29udHJvbC5nZXRDb250cm9sVHlwZSgpLmVxdWFscyhSZXBvcnRDb250cm9sRmFjdG9yeS5TSU1VTEFUSU9OX1RZUEUpKSB7CisJCQkJCWlmKHJlcG9ydENvbnRyb2wuc2ltdWxhdGlvbj09bnVsbCkgeworCQkJCQkJcmVwb3J0Q29udHJvbC5zZXRTaW11bGF0aW9uKHNpbSk7CisJCQkJCQlyZXBvcnRDb250cm9sLnJlZHJhdygpOworCQkJCQkJZm91bmRDb250cm9sID0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0gCisJCQl9IC8vIGZvciBlYWNoIE1hcENvbnRyb2wKKworCQkJLy8gQXQgdGhpcyBwb2ludCB3ZSBzdGlsbCBjb3VsZCBoYXZlIG1hcCBjb250cm9scyB3aXRoIGludmFsaWQKKwkJCS8vIGlkZW50aWZpYWJsZXMsIGxldCdzIGdldCByaWQgb2YgdGhlbQorCQkJZm9yIChmaW5hbCBDb250cm9sIGVsZW1lbnQgOiBjb250cm9scykgeworCQkJCWZpbmFsIFJlcG9ydENvbnRyb2wgcmVwb3J0Q29udHJvbCA9IChSZXBvcnRDb250cm9sKSBlbGVtZW50OworCQkJCQorCQkJCWlmKHJlcG9ydENvbnRyb2wuZ2V0Q29udHJvbFR5cGUoKS5lcXVhbHMoUmVwb3J0Q29udHJvbEZhY3RvcnkuU0lNVUxBVElPTl9UWVBFKSkgeworCQkJCQkvLyBEb2VzIHRoaXMgTWFwQ29udHJvbCBoYXZlIGEgc2ltdWxhdGlvbiB0aGF0IGlzIHN0aWxsIHZhbGlkIHRvCisJCQkJCS8vIGRpc3BsYXk/CisJCQkJCS8vIFRIRSBBZ2dyZWdhdGUgY29udHJvbCBpcyBhIHNwZWNpYWwgY2FzZQorCQkJCQlpZihyZXBvcnRDb250cm9sLnNpbXVsYXRpb24hPW51bGwpIHsKKwkJCQkJCWlmKCFhY3RpdmVTaW1TZXQuY29udGFpbnMocmVwb3J0Q29udHJvbC5zaW11bGF0aW9uKSkgeworCQkJCQkJCXJlcG9ydENvbnRyb2wucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCQkJCQkJCXJlcG9ydENvbnRyb2wuZGlzcG9zZSgpOworCQkJCQkJfQorCQkJCQl9CQorCQkJCX0gCisJCQl9Ly8gZm9yIGVhY2ggTWFwQ29udHJvbAorCQkJCisJCQlpZighZm91bmRDb250cm9sKSB7CisJCQkJLy8gV2UgbmVlZCBhIG5ldyBjb250cm9sIGZvciB0aGlzIHNpbXVsYXRpb24KKwkJCQlmaW5hbCBSZXBvcnRDb250cm9sIHJlcG9ydENvbnRyb2wgPSByY2YuY3JlYXRlKGNvbXBvc2l0ZSk7CisJCQkJcmVwb3J0Q29udHJvbC5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCQkJcmVwb3J0Q29udHJvbC5zZXRTaW11bGF0aW9uKHNpbSk7CisJCQkJCisJCQkJLy8gbXVzdCBsaXN0ZW4gLSB3aGVuIHRoZSBjaGlsZHJlbiBnbyBhd2F5IHdlIG5vIGxvbmdlciB3YW50IHRvCisJCQkJLy8gbW9uaXRvciB0aGVtCisKKwkJCQkvKioKKwkJCQkgKiBjYWxsZWQgd2hlbiBhIHJlbW92ZSB3aWRnZXQgaXMgcHJlc3NlZAorCQkJCSAqLworCQkJCXJlcG9ydENvbnRyb2wuYWRkSVJlbW92ZUxpc3RlbmVyKG5ldyBJUmVtb3ZlTGlzdGVuZXIoKSB7CisJCQkJCS8qKgorCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyI3dpZGdldERpc3Bvc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50KQorCQkJCQkgKi8KKwkJCQkJcHVibGljIHZvaWQgaWRlbnRpZmlhYmxlUmVtb3ZlZChmaW5hbCBJZGVudGlmaWFibGUgaWRlbnQpIHsKKwkJCQkJCXJlbW92ZUlkZW50aWZpYWJsZShpZGVudCk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCQlyZXBvcnRDb250cm9sLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgeworCQkJCQkvKioKKwkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lciN3aWRnZXREaXNwb3NlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudCkKKwkJCQkJICovCisJCQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKAorCQkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBEaXNwb3NlRXZlbnQgZSkgeworCQkJCQkJY29tcG9zaXRlLmxheW91dCh0cnVlLCB0cnVlKTsKKwkJCQkJCWNvbXBvc2l0ZS5yZWRyYXcoKTsKKwkJCQkJfQorCQkJCX0pOworCQkJfSAvLyBub3QgZm91bmQgY29udHJvbAorCQl9IC8vIHNpbSBub3QgbnVsbAorCQllbHNlIHsKKwkJCS8vIElmIHRoZXJlIGFyZSBubyBzaW11bGF0aW9ucyB0byBkaXNwbGF5LCB3ZSBqdXN0IHB1dCB1cCBhICJibGFuayIKKwkJCS8vIFJlcG9ydENvbnRyb2wKKwkJCWlmIChjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPT0gMCkgeworCQkJCS8vIFllcworCQkJCWZpbmFsIFJlcG9ydENvbnRyb2wgcmVwb3J0Q29udHJvbCA9IHJjZi5jcmVhdGUoY29tcG9zaXRlKTsKKwkJCQlyZXBvcnRDb250cm9sLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKworCQkJCS8qKgorCQkJCSAqIGNhbGxlZCB3aGVuIGEgcmVtb3ZlIHdpZGdldCBpcyBwcmVzc2VkCisJCQkJICovCisJCQkJcmVwb3J0Q29udHJvbC5hZGRJUmVtb3ZlTGlzdGVuZXIobmV3IElSZW1vdmVMaXN0ZW5lcigpIHsKKwkJCQkJLyoqCisJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIjd2lkZ2V0RGlzcG9zZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQpCisJCQkJCSAqLworCQkJCQlwdWJsaWMgdm9pZCBpZGVudGlmaWFibGVSZW1vdmVkKGZpbmFsIElkZW50aWZpYWJsZSBpZGVudCkgeworCQkJCQkJcmVtb3ZlSWRlbnRpZmlhYmxlKGlkZW50KTsKKwkJCQkJfQorCQkJCX0pOworCQkJCXJlcG9ydENvbnRyb2wuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisJCQkJCS8qKgorCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyI3dpZGdldERpc3Bvc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50KQorCQkJCQkgKi8KKwkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoCisJCQkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIERpc3Bvc2VFdmVudCBlKSB7CisJCQkJCQljb21wb3NpdGUubGF5b3V0KHRydWUsIHRydWUpOworCQkJCQkJY29tcG9zaXRlLnJlZHJhdygpOworCQkJCQl9CisJCQkJfSk7CisJCQl9IC8vIGlmCisJCX0KKwkJCisJCQorCQljb21wb3NpdGUubGF5b3V0KHRydWUsIHRydWUpOworCQljb21wb3NpdGUucmVkcmF3KCk7CisJfSAvLyBwb3B1bGF0ZVZpZXcoSVNpbXVsYXRpb24pCisJCisJCisJCisJCisJCisJCisJCisJCisJCisJLyoqCisJICogQ3JlYXRlIGFuZCBkaXNwb3NlIG9mIHtAbGluayBNYXBDb250cm9sfXMgYXMgbmVjZXNzYXJ5IHRvIGRpc3BsYXkgdGhlCisJICogc2VsZWN0ZWQge0BsaW5rIFNpbXVsYXRpb259cy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgcG9wdWxhdGVWaWV3KCkgeworCQkvLyBUSEUgQWdncmVnYXRlIGNvbnRyb2wgaXMgYSBzcGVjaWFsIGNhc2UgaGFuZGxlZCBieSB0aGUgb3RoZXIgcG9wdWxhdGVWaWV3IG1ldGhvZAorCQkKKwkJaWYodGhpcy5yY2YuZ2V0RmFjdG9yeVR5cGUoKS5lcXVhbHMoUmVwb3J0Q29udHJvbEZhY3RvcnkuU0lNVUxBVElPTl9UWVBFKSApIHJldHVybjsKKwkJCisJCS8vIHByb2JsZW0gaGVyZSB3aGVuIHdlIHN0YXJ0IHVwCisJCS8vIEFyZSB3ZSBkb25lPworCQlpZiAoY29tcG9zaXRlLmlzRGlzcG9zZWQoKSkgeworCQkJLy8gWWVzCisJCQlyZXR1cm47CisJCX0gLy8gaWYKKworCQlzZWxlY3Rpb24gPSBudWxsOworCQkKKwkJLy8gRmluZCB0aGUgU2ltdWxhdGlvbnMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBiZWluZyBkaXNwbGF5ZWQgYW5kIHB1dAorCQkvLyB0aGVtIGludG8gdGhlIFNldCB1bmRpc3BsYXllZFNpbXVsYXRpb25zLgorCQlmaW5hbCBTZXQ8SWRlbnRpZmlhYmxlPiB1bmRpc3BsYXllZElkZW50aWZpYWJsZXMgPSBuZXcgSGFzaFNldDxJZGVudGlmaWFibGU+KCk7CisJCWZvciAoZmluYWwgSWRlbnRpZmlhYmxlIG5vZGUgOiBpZGVudGlmaWFibGVzVG9EaXNwbGF5KSB7CisJCQkvLyBJcyB0aGlzIG9uZSBhc3NvY2lhdGVkIHdpdGggYSBSZXBvcnRDb250cm9sIGFscmVhZHk/CisJCQlpZiAoIWlzRGlzcGxheWVkKG5vZGUpKSB7CisJCQkJLy8gTm8KKwkJCQl1bmRpc3BsYXllZElkZW50aWZpYWJsZXMuYWRkKG5vZGUpOworCQkJfSAvLyBpZiBub3QgZGlzcGxheWVkCisJCX0gLy8gZm9yIGVhY2ggSVNpbXVsYXRpb24KKworCQkvLyBHbyB0aHJvdWdoIHRoZSBjdXJyZW50IHNldCBvZiBDb250cm9scyBsb29raW5nIGZvciBvbmVzIHRoYXQKKwkJLy8gd2UgY2FuIHJlYXNzaWduCisJCWZpbmFsIENvbnRyb2xbXSBjb250cm9scyA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOworCQlmb3IgKGZpbmFsIENvbnRyb2wgZWxlbWVudCA6IGNvbnRyb2xzKSB7CisJCQkvLyBEb2VzIHRoaXMgUmVwb3J0Q29udHJvbCBoYXZlIGEgc2ltdWxhdGlvbiB0aGF0IGlzIHN0aWxsIHZhbGlkCisJCQkvLyB0byBkaXNwbGF5PworCQkJZmluYWwgUmVwb3J0Q29udHJvbCByZXBvcnRDb250cm9sID0gKFJlcG9ydENvbnRyb2wpIGVsZW1lbnQ7CisJCQlpZihyZXBvcnRDb250cm9sLmdldENvbnRyb2xUeXBlKCkuZXF1YWxzKFJlcG9ydENvbnRyb2xGYWN0b3J5LklERU5USUZBQkxFX1RZUEUpKSB7CisJCQkJLy8gYWxsIG90aGVyIGNvbnRyb2xzCisJCQkJaWYgKCF1bmRpc3BsYXllZElkZW50aWZpYWJsZXMuaXNFbXB0eSgpCisJCQkJCQkmJiAhaWRlbnRpZmlhYmxlc1RvRGlzcGxheS5jb250YWlucyhyZXBvcnRDb250cm9sCisJCQkJCQkJCS5nZXRJZGVudGlmaWFibGUoKSkpIHsKKwkJCQkJLy8gTm8KKwkJCQkJLy8gUmVhc3NpZ24gaXQgdG8gb25lIHRoYXQgaXMgdmFsaWQKKwkJCQkJZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50ID0gKElkZW50aWZpYWJsZSkgdW5kaXNwbGF5ZWRJZGVudGlmaWFibGVzCisJCQkJCQkJLnRvQXJyYXkoKVswXTsKKwkJCQkJcmVwb3J0Q29udHJvbC5zZXRJZGVudGlmaWFibGUoaWRlbnQpOworCQkJCQl1bmRpc3BsYXllZElkZW50aWZpYWJsZXMucmVtb3ZlKGlkZW50KTsKKwkJCQl9CisJCQl9CisJCX0gLy8gZm9yIGVhY2ggTWFwQ29udHJvbAorCisKKwkJLy8gQXQgdGhpcyBwb2ludCB3ZSBzdGlsbCBjb3VsZCBoYXZlIG1hcCBjb250cm9scyB3aXRoIGludmFsaWQKKwkJLy8gaWRlbnRpZmlhYmxlcywgbGV0J3MgZ2V0IHJpZCBvZiB0aGVtCisJCWZvciAoZmluYWwgQ29udHJvbCBlbGVtZW50IDogY29udHJvbHMpIHsKKwkJCWZpbmFsIFJlcG9ydENvbnRyb2wgcmVwb3J0Q29udHJvbCA9IChSZXBvcnRDb250cm9sKSBlbGVtZW50OworCQkJaWYocmVwb3J0Q29udHJvbC5nZXRDb250cm9sVHlwZSgpLmVxdWFscyhSZXBvcnRDb250cm9sRmFjdG9yeS5JREVOVElGQUJMRV9UWVBFKSkgeworCQkJCS8vIERvZXMgdGhpcyBNYXBDb250cm9sIGhhdmUgYSBpZGVudGlmaWFibGUgdGhhdCBpcyBzdGlsbCB2YWxpZCB0bworCQkJCS8vIGRpc3BsYXk/CisJCQkJZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50ID0gcmVwb3J0Q29udHJvbC5nZXRJZGVudGlmaWFibGUoKTsKKwkJCQlpZiAoaWRlbnQgIT0gbnVsbCAmJiAhaWRlbnRpZmlhYmxlc1RvRGlzcGxheS5jb250YWlucyhpZGVudCkpIHsKKwkJCQkJLy8gTm8KKwkJCQkJcmVwb3J0Q29udHJvbC5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCQkJCXJlcG9ydENvbnRyb2wuZGlzcG9zZSgpOworCQkJCX0KKwkJCX0KKwkJfS8vIGZvciBlYWNoIE1hcENvbnRyb2wKKwkJCisJCS8vIElmIHRoZXJlJ3JlIGFueSBOb2RlcyBub3QgYXNzaWduZWQgdG8gYSBSZXBvcnRDb250cm9sLAorCQkvLyBsZXQncyB0YWtlIGNhcmUgb2YgdGhhdCBub3cuCisJCisJCWZvciAoZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50IDogdW5kaXNwbGF5ZWRJZGVudGlmaWFibGVzKSB7CisJCQlpZihpZGVudCE9IG51bGwpIHsKKwkJCQlmaW5hbCBSZXBvcnRDb250cm9sIHJlcG9ydENvbnRyb2wgPSByY2YuY3JlYXRlKGNvbXBvc2l0ZSk7CisJCQkJcmVwb3J0Q29udHJvbC5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCQkJcmVwb3J0Q29udHJvbC5zZXRJZGVudGlmaWFibGUoaWRlbnQpOworCQkJCS8vIG11c3QgbGlzdGVuIC0gd2hlbiB0aGUgY2hpbGRyZW4gZ28gYXdheSB3ZSBubyBsb25nZXIgd2FudCB0bworCQkJCS8vIG1vbml0b3IgdGhlbQorCisJCQkJLyoqCisJCQkJICogY2FsbGVkIHdoZW4gYSByZW1vdmUgd2lkZ2V0IGlzIHByZXNzZWQKKwkJCQkgKi8KKwkJCQlyZXBvcnRDb250cm9sLmFkZElSZW1vdmVMaXN0ZW5lcihuZXcgSVJlbW92ZUxpc3RlbmVyKCkgeworCQkJCQkvKioKKwkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lciN3aWRnZXREaXNwb3NlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudCkKKwkJCQkJICovCisJCQkJCXB1YmxpYyB2b2lkIGlkZW50aWZpYWJsZVJlbW92ZWQoZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50KSB7CisJCQkJCQlyZW1vdmVJZGVudGlmaWFibGUoaWRlbnQpOworCQkJCQl9CisJCQkJfSk7CisJCQkJcmVwb3J0Q29udHJvbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJCQkJLyoqCisJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIjd2lkZ2V0RGlzcG9zZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQpCisJCQkJCSAqLworCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZCgKKwkJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgRGlzcG9zZUV2ZW50IGUpIHsKKwkJCQkJCWNvbXBvc2l0ZS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7CisJCQkJCQljb21wb3NpdGUucmVkcmF3KCk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0vLyBub3QgbnVsbAorCQl9IC8vIGZvciBlYWNoIElkZW50aWZpYWJsZQorCisJCS8vIElmIHRoZXJlIGFyZSBubyBzaW11bGF0aW9ucyB0byBkaXNwbGF5LCB3ZSBqdXN0IHB1dCB1cCBhICJibGFuayIKKwkJLy8gUmVwb3J0Q29udHJvbAorCQlpZiAoY29tcG9zaXRlLmdldENoaWxkcmVuKCkubGVuZ3RoID09IDApIHsKKwkJCS8vIFllcworCQkJZmluYWwgUmVwb3J0Q29udHJvbCByZXBvcnRDb250cm9sID0gcmNmLmNyZWF0ZShjb21wb3NpdGUpOworCQkJcmVwb3J0Q29udHJvbC5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisKKwkJCS8qKgorCQkJICogY2FsbGVkIHdoZW4gYSByZW1vdmUgd2lkZ2V0IGlzIHByZXNzZWQKKwkJCSAqLworCQkJcmVwb3J0Q29udHJvbC5hZGRJUmVtb3ZlTGlzdGVuZXIobmV3IElSZW1vdmVMaXN0ZW5lcigpIHsKKwkJCQkvKioKKwkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyI3dpZGdldERpc3Bvc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50KQorCQkJCSAqLworCQkJCXB1YmxpYyB2b2lkIGlkZW50aWZpYWJsZVJlbW92ZWQoZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50KSB7CisJCQkJCXJlbW92ZUlkZW50aWZpYWJsZShpZGVudCk7CisJCQkJfQorCQkJfSk7CisJCQlyZXBvcnRDb250cm9sLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgeworCQkJCS8qKgorCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIjd2lkZ2V0RGlzcG9zZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQpCisJCQkJICovCisJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoCisJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgRGlzcG9zZUV2ZW50IGUpIHsKKwkJCQkJY29tcG9zaXRlLmxheW91dCh0cnVlLCB0cnVlKTsKKwkJCQkJY29tcG9zaXRlLnJlZHJhdygpOworCQkJCX0KKwkJCX0pOworCisJCX0gLy8gaWYKKwkJY29tcG9zaXRlLmxheW91dCh0cnVlLCB0cnVlKTsKKwkJY29tcG9zaXRlLnJlZHJhdygpOworCQkKKwl9IC8vIHBvcHVsYXRlVmlldygpCisJCisJCisJCisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbnMKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBTZXQ8SWRlbnRpZmlhYmxlPiBnZXRJZGVudGlmaWFibGVzSW5TaW11bGF0aW9uKAorCQkJZmluYWwgTGlzdDxJU2ltdWxhdGlvbj4gc2ltdWxhdGlvbkxpc3QpIHsKKwkJZmluYWwgU2V0PElkZW50aWZpYWJsZT4gcmV0VmFsID0gbmV3IExpbmtlZEhhc2hTZXQ8SWRlbnRpZmlhYmxlPigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpbXVsYXRpb25MaXN0LnNpemUoKTsgaSsrKSB7CisJCQlmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uID0gc2ltdWxhdGlvbkxpc3QuZ2V0KGkpOworCQkJLyoKKwkJCSAqIFRoZSBkZWZhdWx0IG1vbml0b3IgbG9jYXRpb25zIGFsd2F5cyBjb250YWlucyB0aGUgd29ya3MKKwkJCSAqIChVUklzdWZmaXggPSBaWlosIG9yIE1vbml0b3JQcmVmZXJlbmNlcy5ERUZBVUxUX0xPQ0FUSU9OX0lECisJCQkgKiBIb3dldmVyLCBpZiBhIHNjZW5hcmlvIGNvbnRhaW5zIG9ubHkgb25lIGNvdW50cnkgdGhlbiB0aGUgWlpaCisJCQkgKiBub2RlcyBkb2VzIG5vdCBleGlzdCBhbmQgdGhlIHRvcCBsZXZlbCBub2RlIHdpbGwgYmUgdGhlIGNvdW50cnkKKwkJCSAqIGNvZGUuIFNvIGhlcmUgd2UgY2hlY2sgdGhhdCB0aGUgWlpaIG5vZGUgZXhpc3RzLiBJZiBpdCBkb2VzIG5vdAorCQkJICogZXhpc3Qgd2UgbG9vayBmb3IgdGhyZWUgbGV0dGVyIGNvdW50cnkgY29kZShzKSBhbmQgYWRkIHRoYXQKKwkJCSAqICh0aG9zZSAtIGJ1dCB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUpIHRvIHRoZSBsaXN0LgorCQkJICovCisJCQlmaW5hbCBHcmFwaCBncmFwaCA9IHNpbXVsYXRpb24uZ2V0U2NlbmFyaW8oKS5nZXRDYW5vbmljYWxHcmFwaCgpOworCQkJLyoKKwkJCSAqIHRoaXMgY29kZSB3YXMgdXNlZCB0byBhdm9pZCBhIGJ1ZyB0aGF0IHNob3VsZCBub3cgYmUgZml4ZWQKKwkJCSAqIAorCQkJICogaWYgKGdyYXBoID09IG51bGwpIHsgU3lzdGVtLm91dC5wcmludGxuKCJncmFwaCBpcyBudWxsIik7IC8vIHRyeQorCQkJICogc2V2ZXJhbCB0aW1lcyBmb3IgKGludCBpaSA9IDAgOyBpaSA8IDUwOyBpaSArKykgeyB0cnkgeworCQkJICogVGhyZWFkLnNsZWVwKDEwMCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IC8vIG5vdGhpbmcgfSBncmFwaCA9CisJCQkgKiBzaW11bGF0aW9uLmdldFNjZW5hcmlvKCkuZ2V0Q2Fub25pY2FsR3JhcGgoKTsgaWYgKGdyYXBoICE9IG51bGwpCisJCQkgKiBicmVhazsgfS8vIGZvciAxMCB0cmllcyB9IC8vaWYgZ3JhcGggbnVsbAorCQkJICovCisKKwkJCWlmIChncmFwaCAhPSBudWxsKSB7CisJCQkJLy8gZmluYWwgRU1hcDxVUkksIE5vZGU+IGFsbE5vZGVzID0gZ3JhcGguZ2V0Tm9kZXMoKTsKKwkJCQkvLyBmaW5hbCBTZXQ8VVJJPiBhbGxHcmFwaFVSSXMgPSBhbGxOb2Rlcy5rZXlTZXQoKTsKKwkJCQkvLyBmaW5hbCBVUkkgZGVmYXVsdFVSSSA9IE1vbml0b3JQcmVmZXJlbmNlcy5nZXREZWZhdWx0VVJJKCk7CisKKwkJCQkvKgorCQkJCSAqIFdlIHdvbid0IHVzZSB0aGUgZm9sbG93aW5nIGNvZGUuIEl0IGNyZWF0ZXMgdG9vIG1hbnkKKwkJCQkgKiBjb3VudHJpZXMgd2hlbiBzY2VuYXJpbyBpbmNsdWRlcyBhbiBlbnRpcmUgY29udGluZW50CisJCQkJICogIC8vIGlmIHRoZSB3b3JsZCBVUkk9Li5aWlogZG9lcyBOT1QgZXhpc3QgaWYKKwkJCQkgKiAoIWFsbEdyYXBoVVJJcy5jb250YWlucyhkZWZhdWx0VVJJKSkgeyBmaW5hbCBJdGVyYXRvcjxVUkk+CisJCQkJICogaXRlciA9IGFsbEdyYXBoVVJJcy5pdGVyYXRvcigpOyB3aGlsZSAoKGl0ZXIgIT0gbnVsbCkgJiYKKwkJCQkgKiAoaXRlci5oYXNOZXh0KCkpKSB7IGZpbmFsIFN0cmluZyB1cmlTdHJpbmcgPQorCQkJCSAqIChpdGVyLm5leHQoKSkudG9TdHJpbmcoKTsgZmluYWwgU3RyaW5nIHN1ZiA9CisJCQkJICogTW9uaXRvclByZWZlcmVuY2VzIC5nZXRVUklzdWZmaXgodXJpU3RyaW5nKTsgaWYKKwkJCQkgKiAoKHN1Zi5sZW5ndGgoKSA9PSAzKSAmJiAoc3VmLmluZGV4T2YoIi0iKSA9PSAtMSkpIHsgLy8gYWRkCisJCQkJICogdGhlIG5vZGUgbW9uaXRvclNldC5hZGQodXJpU3RyaW5nKTsgfSAvLyBpZiBhZG1pbjA9Y291bnRyeQorCQkJCSAqIGxldmVsIDMgbGV0dGVyIHVyaSB9IC8vIGFsbCB1cmkncyBpbiBHcmFwaCB9IC8vIGlmIHdvcmxkIHVyaQorCQkJCSAqIGRvZXMgbm90IGV4aXN0CisJCQkJICovCisKKwkJCQlmaW5hbCBJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBtb25pdG9yU2V0Lml0ZXJhdG9yKCk7CisJCQkJd2hpbGUgKChpdGVyICE9IG51bGwpICYmIChpdGVyLmhhc05leHQoKSkpIHsKKwkJCQkJZmluYWwgU3RyaW5nIGtleSA9IGl0ZXIubmV4dCgpOworCQkJCQlJZGVudGlmaWFibGUgbm9kZSA9IG51bGw7CisJCQkJCVVSSSBsb2NVUkkgPSBudWxsOworCQkJCQl0cnkgeworCQkJCQkJbG9jVVJJID0gVVJJLmNyZWF0ZVVSSShrZXkpOworCQkJCQkJbm9kZSA9IGdyYXBoLmdldE5vZGUobG9jVVJJKTsKKwkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKKwkJCQkJCQlyZXRWYWwuYWRkKG5vZGUpOworCQkJCQkJfQorCQkJCQl9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworCQkJCQkJb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzLkFjdGl2YXRvci5sb2dFcnJvcigKKwkJCQkJCQkJIlJlcG9ydFZpZXdlci5nZXRJZGVudGlmaWFibGVzSW5TaW11bGF0aW9uKCkgRXJyb3Igc2V0dGluZyBJZGVudGlmaWFibGUgdG8gIgorCQkJCQkJCQkJCSsga2V5ICsgIiAiLCBlKTsKKwkJCQkJfQorCQkJCX0vLyB3aGlsZSBsb2NhdGlvbnMgdG8gbW9uaXRvcgorCisJCQl9Ly8gZ3JhcGggbm90IG51bGwKKworCQl9IC8vIGZvciBhbGwgc2ltdWxhdGlvbnMKKworCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbiBvbmUgc2ltdWxhdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIFNldDxJZGVudGlmaWFibGU+IGdldElkZW50aWZpYWJsZXNJblNpbXVsYXRpb24oSVNpbXVsYXRpb24gc2ltdWxhdGlvbikgeworCQlmaW5hbCBTZXQ8SWRlbnRpZmlhYmxlPiByZXRWYWwgPSBuZXcgTGlua2VkSGFzaFNldDxJZGVudGlmaWFibGU+KCk7CisJCQkvKgorCQkJICogVGhlIGRlZmF1bHQgbW9uaXRvciBsb2NhdGlvbnMgYWx3YXlzIGNvbnRhaW5zIHRoZSB3b3JrcworCQkJICogKFVSSXN1ZmZpeCA9IFpaWiwgb3IgTW9uaXRvclByZWZlcmVuY2VzLkRFRkFVTFRfTE9DQVRJT05fSUQKKwkJCSAqIEhvd2V2ZXIsIGlmIGEgc2NlbmFyaW8gY29udGFpbnMgb25seSBvbmUgY291bnRyeSB0aGVuIHRoZSBaWloKKwkJCSAqIG5vZGVzIGRvZXMgbm90IGV4aXN0IGFuZCB0aGUgdG9wIGxldmVsIG5vZGUgd2lsbCBiZSB0aGUgY291bnRyeQorCQkJICogY29kZS4gU28gaGVyZSB3ZSBjaGVjayB0aGF0IHRoZSBaWlogbm9kZSBleGlzdHMuIElmIGl0IGRvZXMgbm90CisJCQkgKiBleGlzdCB3ZSBsb29rIGZvciB0aHJlZSBsZXR0ZXIgY291bnRyeSBjb2RlKHMpIGFuZCBhZGQgdGhhdAorCQkJICogKHRob3NlIC0gYnV0IHRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSkgdG8gdGhlIGxpc3QuCisJCQkgKi8KKwkJCWZpbmFsIEdyYXBoIGdyYXBoID0gc2ltdWxhdGlvbi5nZXRTY2VuYXJpbygpLmdldENhbm9uaWNhbEdyYXBoKCk7CisJCQkvKgorCQkJICogdGhpcyBjb2RlIHdhcyB1c2VkIHRvIGF2b2lkIGEgYnVnIHRoYXQgc2hvdWxkIG5vdyBiZSBmaXhlZAorCQkJICogCisJCQkgKiBpZiAoZ3JhcGggPT0gbnVsbCkgeyBTeXN0ZW0ub3V0LnByaW50bG4oImdyYXBoIGlzIG51bGwiKTsgLy8gdHJ5CisJCQkgKiBzZXZlcmFsIHRpbWVzIGZvciAoaW50IGlpID0gMCA7IGlpIDwgNTA7IGlpICsrKSB7IHRyeSB7CisJCQkgKiBUaHJlYWQuc2xlZXAoMTAwKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgLy8gbm90aGluZyB9IGdyYXBoID0KKwkJCSAqIHNpbXVsYXRpb24uZ2V0U2NlbmFyaW8oKS5nZXRDYW5vbmljYWxHcmFwaCgpOyBpZiAoZ3JhcGggIT0gbnVsbCkKKwkJCSAqIGJyZWFrOyB9Ly8gZm9yIDEwIHRyaWVzIH0gLy9pZiBncmFwaCBudWxsCisJCQkgKi8KKworCQkJaWYgKGdyYXBoICE9IG51bGwpIHsKKwkJCQkvLyBmaW5hbCBFTWFwPFVSSSwgTm9kZT4gYWxsTm9kZXMgPSBncmFwaC5nZXROb2RlcygpOworCQkJCS8vIGZpbmFsIFNldDxVUkk+IGFsbEdyYXBoVVJJcyA9IGFsbE5vZGVzLmtleVNldCgpOworCQkJCS8vIGZpbmFsIFVSSSBkZWZhdWx0VVJJID0gTW9uaXRvclByZWZlcmVuY2VzLmdldERlZmF1bHRVUkkoKTsKKworCQkJCS8qCisJCQkJICogV2Ugd29uJ3QgdXNlIHRoZSBmb2xsb3dpbmcgY29kZS4gSXQgY3JlYXRlcyB0b28gbWFueQorCQkJCSAqIGNvdW50cmllcyB3aGVuIHNjZW5hcmlvIGluY2x1ZGVzIGFuIGVudGlyZSBjb250aW5lbnQKKwkJCQkgKiAgLy8gaWYgdGhlIHdvcmxkIFVSST0uLlpaWiBkb2VzIE5PVCBleGlzdCBpZgorCQkJCSAqICghYWxsR3JhcGhVUklzLmNvbnRhaW5zKGRlZmF1bHRVUkkpKSB7IGZpbmFsIEl0ZXJhdG9yPFVSST4KKwkJCQkgKiBpdGVyID0gYWxsR3JhcGhVUklzLml0ZXJhdG9yKCk7IHdoaWxlICgoaXRlciAhPSBudWxsKSAmJgorCQkJCSAqIChpdGVyLmhhc05leHQoKSkpIHsgZmluYWwgU3RyaW5nIHVyaVN0cmluZyA9CisJCQkJICogKGl0ZXIubmV4dCgpKS50b1N0cmluZygpOyBmaW5hbCBTdHJpbmcgc3VmID0KKwkJCQkgKiBNb25pdG9yUHJlZmVyZW5jZXMgLmdldFVSSXN1ZmZpeCh1cmlTdHJpbmcpOyBpZgorCQkJCSAqICgoc3VmLmxlbmd0aCgpID09IDMpICYmIChzdWYuaW5kZXhPZigiLSIpID09IC0xKSkgeyAvLyBhZGQKKwkJCQkgKiB0aGUgbm9kZSBtb25pdG9yU2V0LmFkZCh1cmlTdHJpbmcpOyB9IC8vIGlmIGFkbWluMD1jb3VudHJ5CisJCQkJICogbGV2ZWwgMyBsZXR0ZXIgdXJpIH0gLy8gYWxsIHVyaSdzIGluIEdyYXBoIH0gLy8gaWYgd29ybGQgdXJpCisJCQkJICogZG9lcyBub3QgZXhpc3QKKwkJCQkgKi8KKworCQkJCWZpbmFsIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IG1vbml0b3JTZXQuaXRlcmF0b3IoKTsKKwkJCQl3aGlsZSAoKGl0ZXIgIT0gbnVsbCkgJiYgKGl0ZXIuaGFzTmV4dCgpKSkgeworCQkJCQlmaW5hbCBTdHJpbmcga2V5ID0gaXRlci5uZXh0KCk7CisJCQkJCUlkZW50aWZpYWJsZSBub2RlID0gbnVsbDsKKwkJCQkJVVJJIGxvY1VSSSA9IG51bGw7CisJCQkJCXRyeSB7CisJCQkJCQlsb2NVUkkgPSBVUkkuY3JlYXRlVVJJKGtleSk7CisJCQkJCQlub2RlID0gZ3JhcGguZ2V0Tm9kZShsb2NVUkkpOworCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgeworCQkJCQkJCXJldFZhbC5hZGQobm9kZSk7CisJCQkJCQl9CisJCQkJCX0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisJCQkJCQlvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMuQWN0aXZhdG9yLmxvZ0Vycm9yKAorCQkJCQkJCQkiUmVwb3J0Vmlld2VyLmdldElkZW50aWZpYWJsZXNJblNpbXVsYXRpb24oKSBFcnJvciBzZXR0aW5nIElkZW50aWZpYWJsZSB0byAiCisJCQkJCQkJCQkJKyBrZXkgKyAiICIsIGUpOworCQkJCQl9CisJCQkJfS8vIHdoaWxlIGxvY2F0aW9ucyB0byBtb25pdG9yCisJCQl9Ly8gZ3JhcGggbm90IG51bGwKKwkJcmV0dXJuIHJldFZhbDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNEaXNwbGF5ZWQoZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50aWZpYWJsZSkgeworCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisJCWZpbmFsIENvbnRyb2xbXSBhbGxDb250cm9scyA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOworCQlmb3IgKGZpbmFsIENvbnRyb2wgZWxlbWVudCA6IGFsbENvbnRyb2xzKSB7CisJCQlmaW5hbCBSZXBvcnRDb250cm9sIHJlcG9ydENvbnRyb2wgPSAoUmVwb3J0Q29udHJvbCkgZWxlbWVudDsKKwkJCWZpbmFsIElkZW50aWZpYWJsZSB0ZXN0SWRlbnRpZmlhYmxlID0gcmVwb3J0Q29udHJvbAorCQkJCQkuZ2V0SWRlbnRpZmlhYmxlKCk7CisJCQlpZiAodGVzdElkZW50aWZpYWJsZSAhPSBudWxsCisJCQkJCSYmIHRlc3RJZGVudGlmaWFibGUuZXF1YWxzKGlkZW50aWZpYWJsZSkpIHsKKwkJCQlyZXRWYWx1ZSA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9IC8vIGlmCisJCX0gLy8gZm9yIGVhY2ggUmVwb3J0Q29udHJvbAorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBpc0Rpc3BsYXllZAorCisJLyoqCisJICogc2F2ZSB0aGUgc3RhdGUgb2YgcHJlZmVycmVkIGxvY2F0aW9ucyB0byBtb25pdG9yCisJICovCisJcHJpdmF0ZSB2b2lkIHNhdmVQcmVmZXJlbmNlU3RhdGUoKSB7CisKKwkJLy8gd2UgbmVlZCB0byB3cml0ZSBwcmVmZXJlbmNlcyBieSBhY3RpdmUgc2ltdWxhdGlvbgorCQlMaXN0PElTaW11bGF0aW9uPiBhbGxTaW11bGF0aW9ucyA9IG51bGw7CisJCWZpbmFsIFNldDxTdHJpbmc+IG5vZGVzSW5TaW11bGF0aW9uID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCQlpZiAoc2ltdWxhdGlvbk1hbmFnZXIgIT0gbnVsbCkgeworCQkJYWxsU2ltdWxhdGlvbnMgPSBzaW11bGF0aW9uTWFuYWdlci5nZXRBY3RpdmVTaW11bGF0aW9ucygpOworCQl9CisJCWlmICgoYWxsU2ltdWxhdGlvbnMgIT0gbnVsbCkgJiYgKGFsbFNpbXVsYXRpb25zLnNpemUoKSA+PSAxKSkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxTaW11bGF0aW9ucy5zaXplKCk7IGkrKykgeworCQkJCW5vZGVzSW5TaW11bGF0aW9uLmNsZWFyKCk7CisJCQkJZmluYWwgSVNpbXVsYXRpb24gc2ltID0gYWxsU2ltdWxhdGlvbnMuZ2V0KGkpOworCQkJCWZpbmFsIFN0cmluZyBzY2VuYXJpb05hbWUgPSBzaW0uZ2V0U2NlbmFyaW8oKS5nZXRVUkkoKQorCQkJCQkJLnRvU3RyaW5nKCk7CisKKwkJCQkvLyByZWNyZWF0ZSB0aGUgc3Vic2VjdGlvbiBmb3IgdGhpcyBzY2VuYXJpbyB1c2luZyB0aGUgbG9jYXRpb25zCisJCQkJLy8gbm93IGJlaW5nIG1vbml0b3JlZAorCQkJCWZpbmFsIElEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gbmV3IERpYWxvZ1NldHRpbmdzKHNjZW5hcmlvTmFtZSk7CisKKwkJCQlmaW5hbCBHcmFwaCBncmFwaCA9IHNpbS5nZXRTY2VuYXJpbygpLmdldENhbm9uaWNhbEdyYXBoKCk7CisJCQkJZmluYWwgSXRlcmF0b3I8SWRlbnRpZmlhYmxlPiBpdGVyID0gaWRlbnRpZmlhYmxlc1RvRGlzcGxheQorCQkJCQkJLml0ZXJhdG9yKCk7CisJCQkJd2hpbGUgKChpdGVyICE9IG51bGwpICYmIChpdGVyLmhhc05leHQoKSkpIHsKKwkJCQkJZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50ID0gaXRlci5uZXh0KCk7CisJCQkJCWlmIChpZGVudCAhPSBudWxsKSB7CisJCQkJCQkvLyBpcyB0aGlzIG5vZGUgaW4gdGhpcyBzaW11bGF0aW9uPworCQkJCQkJZmluYWwgSWRlbnRpZmlhYmxlIG5vZGUgPSBncmFwaC5nZXROb2RlKGlkZW50LmdldFVSSSgpKTsKKwkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKKwkJCQkJCQlmaW5hbCBTdHJpbmcgaWQgPSBpZGVudC5nZXRVUkkoKS50b1N0cmluZygpOworCQkJCQkJCWlmIChpZCAhPSBudWxsKSB7CisJCQkJCQkJCW5vZGVzSW5TaW11bGF0aW9uLmFkZChpZCk7CisJCQkJCQkJfQorCQkJCQkJfSAvLyBpZiBub2RlIGluIHNpbXVsYXRpb24KKwkJCQkJfQorCisJCQkJfS8vIGFsbCBjdXJyZW50bHkgZGlzcGxheWVkIG5vZGVzCisKKwkJCQlmaW5hbCBTdHJpbmdbXSBuZXdQcmVmcyA9IG5ldyBTdHJpbmdbbm9kZXNJblNpbXVsYXRpb24uc2l6ZSgpXTsKKwkJCQlmaW5hbCBJdGVyYXRvcjxTdHJpbmc+IGl0ZXIyID0gbm9kZXNJblNpbXVsYXRpb24uaXRlcmF0b3IoKTsKKwkJCQlpbnQgaWNvdW50ID0gMDsKKwkJCQl3aGlsZSAoKGl0ZXIyICE9IG51bGwpICYmIChpdGVyMi5oYXNOZXh0KCkpKSB7CisJCQkJCW5ld1ByZWZzW2ljb3VudF0gPSBpdGVyMi5uZXh0KCk7CisJCQkJCWljb3VudCsrOworCQkJCX0KKworCQkJCXNlY3Rpb24ucHV0KExPQ0FUSU9OX1BSRUZFUkVOQ0VfS0VZLCBuZXdQcmVmcyk7CisJCQkJaWYgKG1hc3RlclNldHRpbmdzID09IG51bGwpIHsKKwkJCQkJbWFzdGVyU2V0dGluZ3MgPSBuZXcgRGlhbG9nU2V0dGluZ3MoUk9PVF9LRVkpOworCQkJCX0KKwkJCQltYXN0ZXJTZXR0aW5ncy5hZGRTZWN0aW9uKHNlY3Rpb24pOworCQkJCXRyeSB7CisJCQkJCW1hc3RlclNldHRpbmdzLnNhdmUoZ2V0UHJlZkZpbGVOYW1lKCkpOworCQkJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgeworCQkJCQlvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMuQWN0aXZhdG9yCisJCQkJCQkJLmxvZ0Vycm9yKCJleGNlcHRpb24gd3JpdGluZyBmaWxlIFsiCisJCQkJCQkJCQkrIGlvZS5nZXRNZXNzYWdlKCkgKyAiXSIsIGlvZSk7CisJCQkJfQorCisJCQl9IC8vIGZvciBhbGwgc2ltdWxhdGlvbnMKKwkJfS8vIGlmIG5vdCBudWxsCisKKwl9Ly8gc2F2ZVByZWZlcmVuY2VTdGF0ZQorCisJLyoqCisJICogVGhpcyBtZXRob2QgdXNlcyB7QGxpbmsgRGlhbG9nU2V0dGluZ3N9IHRvIGxvYWQgYW5kIHVwZGF0ZSB0aGUgbW9uaXRvclNldAorCSAqIHdoaWNoIGNvbnRhaW5zIChmaWx0ZXJzKSB0aGUgdmFsaWQgbGlzdCBvZiBwcmVmZXJyZWQge0BsaW5rIElkZW50aWZpYWJsZX1zCisJICogdG8gZGlzcGxheSBmcm9tIHRoZSB0aGUgc3RhdGUgb2YgdGhlIHByZXZpb3VzbHkgc2F2ZWQgcHJlZmVyZW5jZSBzdGF0ZS4KKwkgKiBmb3Ige0BsaW5rIFNpbXVsYXRpb259cyB0aGF0IGFyZSBydW5uaW5nCisJICogCisJICogQHBhcmFtIHJ1bm5pbmdTaW11bGF0aW9ucworCSAqLworCXByaXZhdGUgdm9pZCB1cGRhdGVQcmVmZXJlbmNlU3RhdGUoSVNpbXVsYXRpb24gc2ltKSB7CisJCS8vIHdoYXQgdHlwZSBvZiB2aWV3ZXI/IFRpbWVTZXJpZXMsIFBoYXNlU3BhY2UgZXRjCisJCWlmIChtYXN0ZXJTZXR0aW5ncyA9PSBudWxsKSB7CisJCQlyZWFkTWFzdGVyU2V0dGluZ3NGcm9tRmlsZSgpOworCQl9CisJCWZpbmFsIFN0cmluZyBzY2VuYXJpb05hbWUgPSBzaW0uZ2V0U2NlbmFyaW8oKS5nZXRVUkkoKS50b1N0cmluZygpOworCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IG1hc3RlclNldHRpbmdzLmdldFNlY3Rpb24oc2NlbmFyaW9OYW1lKTsKKwkJaWYgKHNlY3Rpb24gPT0gbnVsbCkgeworCQkJc2VjdGlvbiA9IG5ldyBEaWFsb2dTZXR0aW5ncyhzY2VuYXJpb05hbWUpOworCQkJbWFzdGVyU2V0dGluZ3MuYWRkU2VjdGlvbihzZWN0aW9uKTsKKwkJfQorCQkvLyBub3cgYWRkIHRoZSBwcmVmZXJlbmNlcyB0byB0aGUgbW9uaXRvclNldAorCQlmaW5hbCBTdHJpbmdbXSBhbGxJRHMgPSBzZWN0aW9uLmdldEFycmF5KExPQ0FUSU9OX1BSRUZFUkVOQ0VfS0VZKTsKKwkJaWYgKGFsbElEcyAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFN0cmluZyBlbGVtZW50IDogYWxsSURzKSB7CisJCQkJbW9uaXRvclNldC5hZGQoZWxlbWVudCk7CisJCQl9Ly8gZm9yIGFsbElEcworCisJCX0vLyBub3QgbnVsbAorCX0vLyB1cGRhdGVQcmVmZXJlbmNlU3RhdGUKKworCS8qKgorCSAqIGdldCB0aGUge0BsaW5rIERpYWxvZ1NldHRpbmdzfSBmcm9tIHRoZSBmaWxlCisJICovCisJcHVibGljIHZvaWQgcmVhZE1hc3RlclNldHRpbmdzRnJvbUZpbGUoKSB7CisJCW1hc3RlclNldHRpbmdzID0gbmV3IERpYWxvZ1NldHRpbmdzKFJPT1RfS0VZKTsKKworCQlmaW5hbCBTdHJpbmcgZmlsZW5hbWUgPSBnZXRQcmVmRmlsZU5hbWUoKTsKKwkJZmluYWwgRmlsZSBmID0gbmV3IEZpbGUoZmlsZW5hbWUpOworCQlpZiAoZi5leGlzdHMoKSkgeworCQkJdHJ5IHsKKwkJCQltYXN0ZXJTZXR0aW5ncy5sb2FkKGZpbGVuYW1lKTsKKwkJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgeworCQkJCW9yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy5BY3RpdmF0b3IubG9nRXJyb3IoCisJCQkJCQkiZXhjZXB0aW9uIGxvYWRpbmcgZmlsZSBbIiArIGlvZS5nZXRNZXNzYWdlKCkgKyAiXSIsCisJCQkJCQlpb2UpOworCQkJfQorCQl9IGVsc2UgeworCQkJLy8gZWxzZSBjcmVhdGUgaXQKKwkJCXRyeSB7CisJCQkJbWFzdGVyU2V0dGluZ3Muc2F2ZShmaWxlbmFtZSk7CisJCQl9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQlvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMuQWN0aXZhdG9yLmxvZ0Vycm9yKAorCQkJCQkJImV4Y2VwdGlvbiBjcmVhdGluZyBmaWxlIFsiICsgaW9lLmdldE1lc3NhZ2UoKSArICJdIiwKKwkJCQkJCWlvZSk7CisJCQl9CisJCX0gLy8gZWxzZSBpZiBmICFleGlzdHMKKwl9Ly8gcmVhZCBtYXN0ZXIgc2V0dHRpbmdzCisKKwkvKioKKwkgKiBnZXRzIHRoZSBwcmVmZXJlbmNlcyBmaWxlIG5hbWUKKwkgKiAKKwkgKiBAcmV0dXJuIGZpbGUgbmFtZSBjb250YWluaW5nIHRoZSB1c2VycyBwcmVmZXJlbmNlcworCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZkZpbGVOYW1lKCkgeworCQlmaW5hbCBTdHJpbmcgY29udHJvbENhdGVnb3J5ID0gcmNmLmdldFVuaXF1ZUNvbnRyb2xOYW1lKCk7CisJCS8vIEdldCB0aGUgcmlnaHQgcHJlZmVyZW5jZSBmaWxlCisJCWZpbmFsIFN0cmluZyBmaWxlbmFtZSA9IFBBVEguYXBwZW5kKAorCQkJCWNvbnRyb2xDYXRlZ29yeSArICJfIiArIFJFUE9SVFZJRVdQUkVGRVJFTkNFU19GSUxFTkFNRSkKKwkJCQkudG9PU1N0cmluZygpOworCQlyZXR1cm4gZmlsZW5hbWU7CisJfQorCit9IC8vIFJlcG9ydFZpZXdlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvUmVwb3J0c0NvbnRleHRNZW51QWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9SZXBvcnRzQ29udGV4dE1lbnVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjZhNDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvUmVwb3J0c0NvbnRleHRNZW51QWN0aW9uLmphdmEKQEAgLTAsMCArMSw2MyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5TZWxlY3RlZFJlcG9ydHNNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OworCisvKioKKyAqIFRoZSBjbGFzcyBpcyBhIGRlbGVnYXRpb24gZm9yIHRoZSBwb3B1cCBtZW51IG9mIHRoZQorICogPGNvZGU+R2VvZ3JhcGhpY1JlbmRlcmVyPC9jb2RlPi4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBoYW5kbGUKKyAqIHRoZSBhY3Rpdml0eSBpbiB0aGUgcmVwb3J0cyBjb250ZXh0IG1lbnUgYW5kIGtlZXAgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYWxsCisgKiBlbmFibGVkL2Rpc2FibGVkIHJlcG9ydHMgZnJvbSB0aGF0IG1lbnUuIFRoZSByZXBvcnQncyA8Y29kZT5WaWV3UGFydDwvY29kZT4KKyAqIG9iamVjdCB3aWxsIHVzZSB0aGlzIGNsYXNzIGZvciBjaGVja2luZyB3aGV0aGVyIHRvIGdlbmVyYXRlIGEgcmVwb3J0IG9yIG5vdC4KKyAqLworcHVibGljIGNsYXNzIFJlcG9ydHNDb250ZXh0TWVudUFjdGlvbiAKKwlpbXBsZW1lbnRzIElWaWV3QWN0aW9uRGVsZWdhdGUgeworCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24gYWN0aW9uKSB7CisJCVN0cmluZyByZXBvcnRJZCA9IGFjdGlvbi5nZXRJZCgpOworCQkKKwkJaWYgKFNlbGVjdGVkUmVwb3J0c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc1JlcG9ydEVuYWJsZWQocmVwb3J0SWQpKSB7IC8vIFRoZSByZXBvcnQgd2FzIHByZXZpb3VzbHkgZW5hYmxlZCBzbyBkaXNhYmxlIGl0CisJCQlTZWxlY3RlZFJlcG9ydHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZGlzYWJsZVJlcG9ydEZvcklkZW50aWZpYWJsZShyZXBvcnRJZCk7CisJCQlhY3Rpb24uc2V0Q2hlY2tlZChmYWxzZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlTZWxlY3RlZFJlcG9ydHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZW5hYmxlUmVwb3J0Rm9ySWRlbnRpZmlhYmxlKHJlcG9ydElkKTsKKwkJCWFjdGlvbi5zZXRDaGVja2VkKHRydWUpOworCQl9CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKKwkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCW9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uIGFjdGlvbiwKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQkJb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQkvLyBEbyBOb3RoaW5nCisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQorCSAqLworCXB1YmxpYyB2b2lkIGluaXQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJSVZpZXdQYXJ0IGFyZzApIHsKKwkJLy8gRG8gTm90aGluZworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL3ZpZXdzL1RpbWVTZXJpZXNDYW52YXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL3ZpZXdzL1RpbWVTZXJpZXNDYW52YXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDQ4MzNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvVGltZVNlcmllc0NhbnZhcy5qYXZhCkBAIC0wLDAgKzEsMTIxNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5kZXZpY2UuSURldmljZVJlbmRlcmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQuZXhjZXB0aW9uLkNoYXJ0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQuZmFjdG9yeS5HZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5DaGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLkNoYXJ0V2l0aEF4ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuQW5jaG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkF4aXNUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkJvdW5kczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5Db2xvckRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuSW50ZXJzZWN0aW9uVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5MaW5lQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5MaW5lU3R5bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLlBvc2l0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLlRpY2tTdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5pbXBsLkJvdW5kc0ltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuaW1wbC5Db2xvckRlZmluaXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuY29tcG9uZW50LkF4aXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5jb21wb25lbnQuU2VyaWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuY29tcG9uZW50LmltcGwuU2VyaWVzSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuTnVtYmVyRGF0YVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuU2VyaWVzRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuaW1wbC5OdW1iZXJEYXRhRWxlbWVudEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5kYXRhLmltcGwuTnVtYmVyRGF0YVNldEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5kYXRhLmltcGwuU2VyaWVzRGVmaW5pdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5pbXBsLkNoYXJ0V2l0aEF4ZXNJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwubGF5b3V0LkxlZ2VuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmxheW91dC5QbG90OworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwudHlwZS5MaW5lU2VyaWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwudHlwZS5TY2F0dGVyU2VyaWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwudHlwZS5pbXBsLlNjYXR0ZXJTZXJpZXNJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQudXRpbC5QbHVnaW5TZXR0aW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLmhpc3RvcnkuUmVsYXRpdmVWYWx1ZUhpc3RvcnlQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuaGlzdG9yeS5SZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnByZWZlcmVuY2VzLlZpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7CisKKy8qKgorICogVGltZVNlcmllc0NhbnZhcyBpcyBhIHN1YmNsYXNzIG9mIHtAbGluayBDYW52YXN9IHN1aXRhYmxlIGZvciBjaGFydCBkcmF3aW5ncy4KKyAqLworcHVibGljIGNsYXNzIFRpbWVTZXJpZXNDYW52YXMgZXh0ZW5kcyBDYW52YXMgeworCisJcHJvdGVjdGVkIElEZXZpY2VSZW5kZXJlciBpZHIgPSBudWxsOworCisJLyoqCisJICogVGhpcyBpcyB0aGUge0BsaW5rIENoYXJ0fSB0aGF0IHBsb3RzIHRoZSByZWxhdGl2ZSB2YWx1ZXMuCisJICovCisJcHJvdGVjdGVkIENoYXJ0IGNtID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBwcm92aWRlciBvZiByZWxhdGl2ZSB2YWx1ZXMuCisJICovCisJcHJpdmF0ZSBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyIHJ2aHA7CisKKwlwcml2YXRlIFJlcG9ydENvbnRyb2wgY29udHJvbCA9IG51bGw7CisJCisJLyoqCisJICogc29tZSBleHRyYSBjb2xvcnMKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbG9yRGVmaW5pdGlvbltdIGNvbG9yRGVmYXVsdCA9IHsKKwkJCQkJCQkJCQkJCQkJCUNvbG9yRGVmaW5pdGlvbkltcGwuQkxVRSgpLCAKKwkJCQkJCQkJCQkJCQkJCUNvbG9yRGVmaW5pdGlvbkltcGwuQkxBQ0soKSwgCisJCQkJCQkJCQkJCQkJCQlDb2xvckRlZmluaXRpb25JbXBsLkdSRVkoKSwKKwkJCQkJCQkJCQkJCQkJCUNvbG9yRGVmaW5pdGlvbkltcGwuQ1lBTigpLAorCQkJCQkJCQkJCQkJCQkJQ29sb3JEZWZpbml0aW9uSW1wbC5PUkFOR0UoKSAKKwkJCQkJCQkJCQkJCQkJCX07CisJCisJLyoqCisJICogdXNlZCB0byBpbmRleCB0aGUgbGluZSBzZXJpZXMgc28gd2UgY2FuIHN0ZXAgdGhyb3VnaCBkZWZhdWx0IGNvbG9ycworCSAqIHdoZW4gYSB1c2VyIGN1c3RvbSBjb2xvciBpcyBub3QgeWV0IGFzc2lnbmVkCisJICovCisJcHJvdGVjdGVkIGludCBzZXJpZXNDb3VudCAgPSAwOworCisJLyoqCisJICogTG9nIG9mIHplcm8gaXMgbmVnYXRpdmUgaW5maW5pdHkgc28gZm9yIGVhY2ggbG9jYXRpb24gd2Ugd2lsbCBjdXQgb2ZmIHRoZSBtaW5pbXVtIHZhbHVlCisJICogb2YgbG9nKHkpIGF0IDAuMS9QT1BVTEFUSU9OIGZvciBkaXNwbGF5IHB1cnBvc2VzIG9ubHkKKwkgKi8KKwlwcml2YXRlIGRvdWJsZSBtaW5Mb2dTY2FsZVZhbHVlID0gMS4wOworCQorCS8qKgorCSAqIG9uY2UgdGltZSA+IERFRkFVTFRfQVVUT0FYSVNfVEhSRVNIT0xEIHdlIHN0YXJ0IHRvIGF1dG9yZXNldCB0aGUgdGltZSBheGlzIAorCSAqIHRpY2sgbWFya3MgYW5kIHNjYWxlIHNvIHdlIGRvbid0IGhhdmUgdG9vIG1hbnkgdGljayBtYXJrcworCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0FVVE9BWElTX1RIUkVTSE9MRCA9IDU7CisJCisJLyoqCisJICogdGhlIG1heCB2YWx1ZSBmb3IgdGhlIHRpbWUgKHgpIGF4aXMKKwkgKi8KKwlwcml2YXRlIGludCBtYXhUaW1lQXhpc1ZhbHVlID0gREVGQVVMVF9BVVRPQVhJU19USFJFU0hPTEQ7CisJCisJLyoqCisJICogdGhlIG1pbmltdW0gbnVtYmVyIG9mIHRpbWUgYXhpcyB0aWNrcyAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1RJQ0tTID0gNTsKKwkKKwkvKioKKwkgKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGltZSBheGlzIHRpY2tzICBhZnRlciB0aW1lPURFRkFVTFRfQVVUT0FYSVNfVEhSRVNIT0xEOworCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVElDS1MgPSAxMDsKKwkKKwkvKioKKwkgKiB1c2VkIHRvIHNldCB0aGUgYXV0b2F4aXMgdGljaworCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSUNLX1RSSUdHRVIgPSBNQVhfVElDS1MvTUlOX1RJQ0tTOworCisJLyoqCisJICogVGhpcyBpcyBhIG1hcCBvZiBwcm9wZXJ0aWVzIG9mIHRoZSBsYWJlbCB1cGRhdGVkIGJ5IHRoZSBzZWxlY3RlZAorCSAqIHtAbGluayBEZWNvcmF0b3J9IHdob3NlIHJlbGF0aXZlIHZhbHVlIG1pZ2h0IGJlIHBsb3R0ZWQgKGNvbnRleHQgbWVudSBhbGxvd3MgdXMgdG8gdG9nZ2xlIHRoZSBpbmRpdmlkdWFsCisJICogcHJvcGVydGllcyB0byBwbG90CisJICovCisJcHJvdGVjdGVkIE1hcDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yLEJvb2xlYW4+IHByb3BlcnRpZXNUb1Bsb3QgPSBuZXcgSGFzaE1hcDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yLEJvb2xlYW4+KCk7CisKKwkvKioKKwkgKiBUT0RPIHRoaXMgaXMgdGVtcG9yYXJ5IGNvZGUgYW5kIHNob3VsZCBiZSBpbiB1c2VyIHByZWZlcmVuY2VzCisJICogd2Ugd2FudCB0byBoaWRlIGEgZmV3IG9mIHRoZSBwb3NzaWJsZSBsaW5lLXNlcmllcyBvbiBzdGFydCB1cAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhJREVfT05fU1RBUlRVUCA9IHsiSVIiLCJJRiIsIkluY2lkZW5jZSIsIkJpcnRocyIsIkRlYXRocyJ9OworCXByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IGRlZmF1bHRIaWRlU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCisJLyoqCisJICogdGhpcyBpcyBhIG1hcCBvZiB0aGUgRGF0YVNlcmllcyBvYmplY3QgKGtleWVkIGJ5IHByb3BlcnR5IG5hbWUpCisJICovCisJcHJvdGVjdGVkIGZpbmFsIE1hcDxTdHJpbmcsRGF0YVNlcmllcz4gZGF0YVNlcmllc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxEYXRhU2VyaWVzPigpOworCQorCQorCS8qKgorCSAqIFRoZXNlIGFyZSB0aGUgY3ljbGUgbnVtYmVycyB0aGF0IG1hdGNoIHRoZSByZWxhdGl2ZSB2YWx1ZXMgdGhhdCB3aWxsIGJlCisJICogcGxvdHRlZAorCSAqCisJICogQHNlZSAjcmVsYXRpdmVWYWx1ZXMKKwkgKi8KKwlwcml2YXRlIGZpbmFsIExpc3Q8SW50ZWdlcj4gY3ljbGVOdW1iZXJzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCisJLyoqCisJICogQ2hhcnQgZ2VuZXJhdG9yIGluc3RhbmNlIChyZWZlcmVuY2UgdG8gYSBzaW5nbGV0b24pCisJICovCisJR2VuZXJhdG9yIGdyOworCisJCisJQXhpcyB5QXhpc1ByaW1hcnk7CisJQXhpcyB4QXhpc1ByaW1hcnk7CisKKwkKKwkvKioKKwkgKiBBIGNvbnRleHQgbWVudSBmb3IgdGhpcyB2aWV3CisJICovCisJTWVudSBwb3BVcE1lbnUgPSBudWxsOworCisJLyoqCisJICogc2V0IHkgYXhpcyB0byBhIGxpbmVhciBzY2FsZQorCSAqLworCXByaXZhdGUgTGluZWFyU2NhbGVBY3Rpb24gbGluZWFyVGltZUFjdGlvbjsKKwkvKioKKwkgKiBzZXQgeSBheGlzIHRvIGEgbG9nIHNjYWxlCisJICovCisJcHJpdmF0ZSBMb2dTY2FsZUFjdGlvbiBsb2dUaW1lQWN0aW9uOworCXByb3RlY3RlZCBib29sZWFuIHVzZUxpbmVhclRpbWVTY2FsZSA9IHRydWU7CisJCisJLyoqCisJICogc2hvdyB0aGUgbGVnZW5kICh0cnVlIGJ5IGRlZmF1bHQpCisJICovCisJcHJpdmF0ZSBMZWdlbmRWaWV3QWN0aW9uIHZpZXdMZWdlbmQ7CisKKwkvKioKKwkgKiBoaWRlIHRoZSBsZWdlbmQgCisJICovCisJcHJpdmF0ZSBMZWdlbmRIaWRlQWN0aW9uIGhpZGVMZWdlbmQ7CisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0xlZ2VuZCA9IHRydWU7CisJCisJcHJvdGVjdGVkIExlZ2VuZCBsZWdlbmQgPSBudWxsOworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZhdWx0S2V5ID0gIlMiOworCisJSW1hZ2UgaW1nQ2hhcnQgPSBudWxsOworCQorCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgdGhlIFNXVCBwYXJlbnQgb2YgdGhlIHtAbGluayBXaWRnZXR9CisJICovCisJcHVibGljIFRpbWVTZXJpZXNDYW52YXMoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQsIFNXVC5ET1VCTEVfQlVGRkVSRUQgfCBTV1QuQk9SREVSKTsKKwkJCisJCS8vIGluaXQKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBISURFX09OX1NUQVJUVVAubGVuZ3RoOyBpICsrKSB7CisJCQlkZWZhdWx0SGlkZVNldC5hZGQoSElERV9PTl9TVEFSVFVQW2ldKTsKKwkJfQorCQorCisJCWdyID0gR2VuZXJhdG9yLmluc3RhbmNlKCk7CisKKwkJdHJ5IHsKKwkJCWlkciA9IFBsdWdpblNldHRpbmdzLmluc3RhbmNlKCkuZ2V0RGV2aWNlKCJkdi5TV1QiKTsgLy8kTk9OLU5MUy0xJAorCQl9IGNhdGNoIChmaW5hbCBDaGFydEV4Y2VwdGlvbiBwZXgpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiUHJvYmxlbSBpbml0aWFsaXppbmcgY2hhcnQiLCBwZXgpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCX0KKworCQljb250cm9sID0gKFJlcG9ydENvbnRyb2wpIHBhcmVudDsKKwkJcnZocCA9IGNvbnRyb2wucnZocDsKKwkJCisJCWNtID0gY3JlYXRlU2ltcGxlTGluZUNoYXJ0KGRhdGFTZXJpZXNNYXAsIGN5Y2xlTnVtYmVycywgTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJDQy50aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQlyZXNldERhdGEoKTsKKwkJYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChmaW5hbCBQYWludEV2ZW50IHBlKSB7CisJCQkJZmluYWwgQ29tcG9zaXRlIHNvdXJjZSA9IChDb21wb3NpdGUpIHBlLmdldFNvdXJjZSgpOworCQkJCWZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUgZCA9IHNvdXJjZQorCQkJCQkJLmdldENsaWVudEFyZWEoKTsKKwkJCQkKKwkJCQlpZihpbWdDaGFydCAhPSBudWxsKSBpbWdDaGFydC5kaXNwb3NlKCk7CisJCQkJaW1nQ2hhcnQgPSBuZXcgSW1hZ2Uoc291cmNlLmdldERpc3BsYXkoKSwgZCk7CisJCQkJaWRyLnNldFByb3BlcnR5KElEZXZpY2VSZW5kZXJlci5HUkFQSElDU19DT05URVhULCBuZXcgR0MoCisJCQkJCQlpbWdDaGFydCkpOworCQkJCWZpbmFsIEJvdW5kcyBib3VuZHMgPSBCb3VuZHNJbXBsLmNyZWF0ZShkLngsIGQueSwgZC53aWR0aCwKKwkJCQkJCWQuaGVpZ2h0KTsKKwkJCQlib3VuZHMuc2NhbGUoNzJkIC8gaWRyLmdldERpc3BsYXlTZXJ2ZXIoKS5nZXREcGlSZXNvbHV0aW9uKCkpOworCQkJCS8vIEJPVU5EUyBNVVNUIEJFIFNQRUNJRklFRCBJTiBQT0lOVFMKKworCQkJCXRyeSB7CisJCQkJCWdyLnJlbmRlcihpZHIsIGdyLmJ1aWxkKGlkci5nZXREaXNwbGF5U2VydmVyKCksIGNtLCBib3VuZHMsCisJCQkJCQkJbnVsbCwgbnVsbCwgbnVsbCkpOworCQkJCQlwZS5nYy5kcmF3SW1hZ2UoaW1nQ2hhcnQsIGQueCwgZC55KTsKKwkJCQl9IGNhdGNoIChmaW5hbCBDaGFydEV4Y2VwdGlvbiBjZSkgeworCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlByb2JsZW0gcmVuZGVyaW5nIGNoYXJ0IiwgY2UpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCisJCQl9IC8vIHBhaW50Q29udHJvbAorCQl9IC8vIFBhaW50TGlzdGVuZXIKKworCQkpOworCisJCS8vQ3JlYXRlIGEgY29udGV4dCBtZW51IGZvciB0aGUgY2FudmFzCisJCWNyZWF0ZUNvbnRleHRNZW51KHRoaXMpOworCisJfSAvLyBUaW1lU2VyaWVzQ2FudmFzCisKKwkvKioKKwkgKiBUaGUgbWV0aG9kIHdoaWNoIGdldHMgdGhlIHtAbGluayBUaW1lU2VyaWVzQ2FudmFzfScgcmVwb3J0cyBsaXN0LCBhbmQKKwkgKiBkcmF3cyBpdCBvbiB0aGUge0BsaW5rIFRpbWVTZXJpZXNDYW52YXN9LgorCSAqCisJICovCisJcHVibGljIHZvaWQgZHJhdygpIHsKKworCQkvLyBIYXMgYSByZWxhdGl2ZSB2YWx1ZSBwcm92aWRlciBiZWVuIHByb3ZpZGVkPworCQlpZiAocnZocCAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCS8vIGJ1aWxkIHVwIHRoZSBzZXQgb2YgcHJvcGVydGllcyB0byBwbG90CisJCQkKKwkJCS8vIEZpcnN0IHdlIGRpc2FibGUgYWxsIHNlcmllcyBzbyB0aGF0IHdlIG9ubHkgdHVybiBvbiB0aGUgb25lcyB0aGF0IGFyZSBlbmFibGVkLgorCQkJZm9yKERhdGFTZXJpZXMgZDogZGF0YVNlcmllc01hcC52YWx1ZXMoKSkKKwkJCQlkLmhpZGUoKTsKKwkJCQkKKwkJCUl0ZXJhdG9yPEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGl0ZXIgPSBwcm9wZXJ0aWVzVG9QbG90LmtleVNldCgpLml0ZXJhdG9yKCk7CisJCQlMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGRpc3BsYXllZFByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4oKTsKKwkJCXdoaWxlKChpdGVyIT1udWxsKSYmKGl0ZXIuaGFzTmV4dCgpKSApeworCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkgPSBpdGVyLm5leHQoKTsKKwkJCQlib29sZWFuIHZpc2libGUgPSBwcm9wZXJ0aWVzVG9QbG90LmdldChwcm9wZXJ0eSkuYm9vbGVhblZhbHVlKCk7CisJCQkJZGlzcGxheWVkUHJvcGVydHlMaXN0LmFkZChwcm9wZXJ0eSk7CisJCQkJaWYodmlzaWJsZSkgeworCQkJCQlpZihkYXRhU2VyaWVzTWFwLmNvbnRhaW5zS2V5KHByb3BlcnR5LmdldERpc3BsYXlOYW1lKHByb3BlcnR5KSkpIHsKKwkJCQkJCURhdGFTZXJpZXMgc2VyaWVzID0gZGF0YVNlcmllc01hcC5nZXQocHJvcGVydHkuZ2V0RGlzcGxheU5hbWUocHJvcGVydHkpKTsKKwkJCQkJCS8vIHJlbW92ZSBpdAorCQkJCQkJaWYoIXNlcmllcy5pc1Zpc2libGUoKSkgeworCQkJCQkJCXNlcmllcy5zaG93KCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZihkYXRhU2VyaWVzTWFwLmNvbnRhaW5zS2V5KHByb3BlcnR5LmdldERpc3BsYXlOYW1lKHByb3BlcnR5KSkpIHsKKwkJCQkJCURhdGFTZXJpZXMgc2VyaWVzID0gZGF0YVNlcmllc01hcC5nZXQocHJvcGVydHkuZ2V0RGlzcGxheU5hbWUocHJvcGVydHkpKTsKKwkJCQkJCS8vIHJlbW92ZSBpdAorCQkJCQkJaWYoc2VyaWVzLmlzVmlzaWJsZSgpKSB7CisJCQkJCQkJc2VyaWVzLmhpZGUoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0vLyB2aXNpYmxlPworCQkJfS8vIGFsbCBkaXNwbGF5ZWRQcm9wZXJ0aWVzCisKKworCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkJLy8gTG9nKDAuMCkgaXMgbmVnYXRpdmUgaW5maW5pdHkgc28gZm9yIGRpc3BsYXkgcHVycG9zZXMgb25seQorCQkJLy8gd2Ugc2V0IHRoZSBtaW5pbXVtIGF4aXMgdmFsdWUgYXQgMC4xL1BPUFVMQVRJT04KKwkJCWRvdWJsZSBkZW5vbSA9IHJ2aHAuZ2V0RGVub21pbmF0b3IobnVsbCk7CisJCQlpZihkZW5vbSA8PTAuMCkgZGVub20gPSAxLjA7CisJCQltaW5Mb2dTY2FsZVZhbHVlID0gMC4xL2Rlbm9tOworCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJCQkvLyBjbGVhcgorCQkJcmVzZXREYXRhKCk7CisJCQkKKwkJCQorCQkJCisJCQlib29sZWFuIHNldEN5Y2xlcyA9IGZhbHNlOworCQkJLy8gR2V0IHRoZSB2YWx1ZXMgZm9yIHRoZSBwcm9wZXJ0eSB0byBiZSBwbG90dGVkCisJCQlpbnQgbWF4UG9pbnRzID0gMDsKKwkJCVNURU1UaW1lW10gdGltZSA9IHJ2aHAuZ2V0QWxsSGlzdG9yaWNUaW1lVmFsdWVzKCk7CisJCQljeWNsZU51bWJlcnMuY2xlYXIoKTsKKwkJCWN5Y2xlTnVtYmVycy5hZGQoSW50ZWdlci52YWx1ZU9mKDApKTsKKwkJCQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXNwbGF5ZWRQcm9wZXJ0eUxpc3Quc2l6ZSgpOyBpKyspIHsKKwkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5ID0gZGlzcGxheWVkUHJvcGVydHlMaXN0LmdldChpKTsKKwkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gcHJvcGVydHkuZ2V0RGlzcGxheU5hbWUocHJvcGVydHkpOworCQkJCQorCQkJCWZpbmFsIGRvdWJsZVtdIGRvdWJsZVZhbHVlcyA9IHJ2aHAuZ2V0SGlzdG9yaWNJbnN0YW5jZXMocHJvcGVydHksdGltZSk7CisKKworCQkJCS8vIEFueSB2YWx1ZXM/CisJCQkJaWYgKGRvdWJsZVZhbHVlcy5sZW5ndGggPiAwKSB7CisJCQkJCWlmIChtYXhQb2ludHMgPCBkb3VibGVWYWx1ZXMubGVuZ3RoKSB7CisJCQkJCQltYXhQb2ludHMgPSBkb3VibGVWYWx1ZXMubGVuZ3RoOworCQkJCQl9CisKKwkJCQkJLy8gdGhpcyBtaWdodCBiZSBhIG5ldyBkaXNwbGF5CisJCQkJCS8vIHNvIHdlIGhhdmUgdG8gZmlsbCBhbnkgZW1wdHkgZGF0YSBzZXQKKwkJCQkJaWYgKCFkYXRhU2VyaWVzTWFwLmNvbnRhaW5zS2V5KHByb3BlcnR5LmdldERpc3BsYXlOYW1lKHByb3BlcnR5KSkpIHsKKwkJCQkJCQorCQkJCQkJRGF0YVNlcmllcyBzZXJpZXMgPSBuZXcgRGF0YVNlcmllcyhwcm9wZXJ0eU5hbWUsIHNlcmllc0NvdW50KTsKKwkJCQkJCS8vIHdlIGFyZSBvdXQgb2YgZGF0YSAocHJvcGVydGllcykgc28gd2UgbmVlZCB0byBmaWxsIGluCisJCQkJCQkvLyB6ZXJvcyBmb3IgYW55IHVudXNlZCBsaW5lcworCQkJCQkJLy8gZmlsbCBpbiB0aGUgZW1wdHkgYXJyYXlzCisJCQkJCQlpZihkb3VibGVWYWx1ZXMubGVuZ3RoIDwgbWF4UG9pbnRzKSB7CisJCQkJCQkJZm9yKGludCBpaSA9IGRvdWJsZVZhbHVlcy5sZW5ndGg7IGlpIDwgbWF4UG9pbnRzLTE7IGlpICsrKSB7CisJCQkJCQkJCS8vIHBhZCB3aXRoIHplcm9zCisJCQkJCQkJCXNlcmllcy5hZGRWYWx1ZShuZXcgRG91YmxlKDAuMCkpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJCisJCQkJCQkKKwkJCQkJCWRhdGFTZXJpZXNNYXAucHV0KHByb3BlcnR5TmFtZSwgc2VyaWVzKTsKKwkJCQkJfQorCisJCQkJCWZpbmFsIGludCBlYXJsaWVzdEN5Y2xlTnVtYmVyID0gcnZocC5nZXRFYXJsaWVzdEN5Y2xlTnVtYmVyKCk7CisJCQkJCURhdGFTZXJpZXMgc2VyaWVzID0gZGF0YVNlcmllc01hcC5nZXQocHJvcGVydHkuZ2V0RGlzcGxheU5hbWUocHJvcGVydHkpKTsKKwkJCQkJc2VyaWVzLnNldENvbG9yRGVmcyhwcm9wZXJ0eS5nZXREaXNwbGF5TmFtZShwcm9wZXJ0eSkpOworCQkJCQkKKwkJCQkJCisJCQkJCWZvciAoaW50IGN5Y2xlTnVtYmVyID0gMDsgY3ljbGVOdW1iZXIgPCBkb3VibGVWYWx1ZXMubGVuZ3RoOyBjeWNsZU51bWJlcisrKSB7CisJCQkJCQlEb3VibGUgdmFsdWU7CisJCQkJCQlkb3VibGUgZGlzcGxheVZhbHVlID0gZG91YmxlVmFsdWVzW2N5Y2xlTnVtYmVyXTsKKwkJCQkJCWlmIChkaXNwbGF5VmFsdWUgPD0gbWluTG9nU2NhbGVWYWx1ZSkgeworCQkJCQkJCS8vIExvZygwLjApIGlzIG5lZ2F0aXZlIGluZmluaXR5IHNvIGZvciBkaXNwbGF5IHB1cnBvc2VzIG9ubHkKKwkJCQkJCQkvLyB3ZSBzZXQgdGhlIG1pbmltdW0gYXhpcyB2YWx1ZSBhdCAwLjEvUE9QVUxBVElPTgorCQkJCQkJCWRpc3BsYXlWYWx1ZSA9IG1pbkxvZ1NjYWxlVmFsdWU7CisJCQkJCQl9CisJCQkJCQlpZiAodXNlTGluZWFyVGltZVNjYWxlKSB7CisJCQkJCQkJdmFsdWUgPSBuZXcgRG91YmxlKGRpc3BsYXlWYWx1ZSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXZhbHVlID0gbmV3IERvdWJsZShNYXRoLmxvZyhkaXNwbGF5VmFsdWUpKTsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkKKwkJCQkJCXNlcmllcy5hZGRWYWx1ZSh2YWx1ZSk7CisJCQkJCQkKKwkJCQkJCWlmICghc2V0Q3ljbGVzKSB7CisJCQkJCQkJdGhpcy5jeWNsZU51bWJlcnMuYWRkKEludGVnZXIudmFsdWVPZigKKwkJCQkJCQkJCWVhcmxpZXN0Q3ljbGVOdW1iZXIgKyBjeWNsZU51bWJlciArIDEpKTsKKwkJCQkJCQkKKwkJCQkJCQkvKgorCQkJCQkJCSAqIFdlIGRvbid0IHdhbnQgdG8gYWRkIHggKHRpbWUpIGF4aXMgdGlja3MgYWQgaW5maW5pdHVtIHNvIHdlIHdlIG5lZWQgdG8gZHluYW1pY2FsbHkKKwkJCQkJCQkgKiBjaGFuZ2UgdGhlIHNjYWxlLiBUaGlzIHdpbGwgdG9nZ2xlIGJldHdlZW4gNS0xMCB0aWNrcyBldmVyeSB0aW1lIHRoZSBtYXggdGltZSBkb3VibGVzCisJCQkJCQkJICogcGFzdCBhbiBpbml0aWFsIHZhbHVlIG9mIG1heFRpbWVBeGlzVmFsdWUgPSBERUZBVUxUX0FVVE9BWElTX1RIUkVTSE9MRCAoPSAyNSkKKwkJCQkJCQkgKi8KKwkJCQkJCQlpZih0aGlzLmN5Y2xlTnVtYmVycy5zaXplKCk+VElDS19UUklHR0VSKm1heFRpbWVBeGlzVmFsdWUpIHsKKwkJCQkJCQkJbWF4VGltZUF4aXNWYWx1ZSA9IHRoaXMuY3ljbGVOdW1iZXJzLnNpemUoKSsxIDsKKwkJCQkJCQkJaW50IHN0ZXBYID0gbWF4VGltZUF4aXNWYWx1ZSAvIE1JTl9USUNLUzsKKwkJCQkJCQkJeEF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0U3RlcChzdGVwWCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJCisJCQkJCQkKKwkJCQkJfSAvLyBmb3IgY3ljbGVOdW1iZXIKKwkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIiAgIitzZXJpZXMucHJvcGVydHlOYW1lKyJjeWNsZXMgPSAiK3RoaXMuY3ljbGVOdW1iZXJzLnNpemUoKSsiIGRhdGFzaXplID0gIitzZXJpZXMuZ2V0RGF0YVNpemUoKSk7CisJCQkJCXNldEN5Y2xlcyA9IHRydWU7IC8vIHdlIHNldCB0aGVtIG9ubHkgb25jZQorCQkJCX0gZWxzZSB7CisJCQkJCXJlc2V0RGF0YSgpOworCQkJCX0KKworCQkJCQorCQkJfSAvLyBmb3IgaSBwcm9wZXJ0aWVzCisKKwkJfSAvLyBpZiBhIHJlbGF0aXZlIHZhbHVlIHByb3ZpZGVyIGhhcyBiZWVuIHByb3ZpZGVkCisJCWVsc2UgeworCQkJLy8gTm8KKwkJCS8vIE5lZWQgdG8gY2xlYXIgZXZlcnl0aGluZworCQkJcmVzZXREYXRhKCk7CisJCX0KKworCQkvLyBDaGVjayBlYWNoIGRhdGEgc2VyaWVzIGluIHRoZSBtYXAgdG8gbWFrZSBzdXJlIHRoZXkgaGF2ZSBlbm91Z2ggWSB2YWx1ZXMgaW4gdGhlbSAKKwkJZm9yKERhdGFTZXJpZXMgZHM6dGhpcy5kYXRhU2VyaWVzTWFwLnZhbHVlcygpKSB7CisJCQlpZihkcy5yZWxhdGl2ZVZhbHVlcy5zaXplKCkgPCB0aGlzLmN5Y2xlTnVtYmVycy5zaXplKCkpIHsKKwkJCQlkcy5yZWxhdGl2ZVZhbHVlcy5jbGVhcigpOworCQkJCWZvcihpbnQgbj0wO248dGhpcy5jeWNsZU51bWJlcnMuc2l6ZSgpOysrbikgZHMuYWRkVmFsdWUobmV3IERvdWJsZSgwLjApKTsKKwkJCX0KKwkJfQorCQlpZiAoIXRoaXMuaXNEaXNwb3NlZCgpKSB7CisJCQlyZWRyYXcoKTsKKwkJfQorCX0gLy8gcGFpbnRDb250cm9sCisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIHZpZXcncyBjb250ZXh0IG1lbnUgYW5kIGFkZCB0aGUgYWN0aW9uIGhhbmRsZXJzIHRvIGl0LgorCSAqLworCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZXh0TWVudShmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJLy8gSW5pdCBhIENvbnRleHQgTWVudSBNYW5hZ2VyCisJCWZpbmFsIE1lbnVNYW5hZ2VyIGNvbnRleHRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCWxpbmVhclRpbWVBY3Rpb24gPSBuZXcgTGluZWFyU2NhbGVBY3Rpb24oKTsKKwkJbG9nVGltZUFjdGlvbiA9IG5ldyBMb2dTY2FsZUFjdGlvbigpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGxpbmVhclRpbWVBY3Rpb24pOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGxvZ1RpbWVBY3Rpb24pOworCisKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCisJCXZpZXdMZWdlbmQgPSBuZXcgTGVnZW5kVmlld0FjdGlvbigpOworCQloaWRlTGVnZW5kID0gbmV3IExlZ2VuZEhpZGVBY3Rpb24oKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZCh2aWV3TGVnZW5kKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChoaWRlTGVnZW5kKTsKKwkJCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkKKwkJCisJCS8vIFBsYWNlIEhvbGRlciBmb3IgTWVudSBBZGRpdGlvbnMKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKAorCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CisKKwkJcG9wVXBNZW51ID0gY29udGV4dE1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KHBhcmVudCk7CisKKwkJLy8gU2V0IHRoZSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIKKwkJcGFyZW50LnNldE1lbnUocG9wVXBNZW51KTsKKworCX0gLy8gY3JlYXRlQ29udGV4dE1lbnUKKworCisJLyoqCisJICogVXBkYXRlIHRoZSB2aWV3J3MgY29udGV4dCBtZW51IGFuZCBhZGQgdGhlIGFjdGlvbiBoYW5kbGVycyB0byBpdC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlQ29udGV4dE1lbnUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXBvcFVwTWVudS5kaXNwb3NlKCk7CisKKwkJLy8gSW5pdCBhIENvbnRleHQgTWVudSBNYW5hZ2VyCisJCWZpbmFsIE1lbnVNYW5hZ2VyIGNvbnRleHRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCWxpbmVhclRpbWVBY3Rpb24gPSBuZXcgTGluZWFyU2NhbGVBY3Rpb24oKTsKKwkJbG9nVGltZUFjdGlvbiA9IG5ldyBMb2dTY2FsZUFjdGlvbigpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGxpbmVhclRpbWVBY3Rpb24pOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGxvZ1RpbWVBY3Rpb24pOworCQkKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCisJCXZpZXdMZWdlbmQgPSBuZXcgTGVnZW5kVmlld0FjdGlvbigpOworCQloaWRlTGVnZW5kID0gbmV3IExlZ2VuZEhpZGVBY3Rpb24oKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZCh2aWV3TGVnZW5kKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChoaWRlTGVnZW5kKTsKKwkJCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkKKwkJCisJCS8vIFBsYWNlIEhvbGRlciBmb3IgTWVudSBBZGRpdGlvbnMKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKAorCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CisKKwkJCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBhZGQgdGhlIGRpc3BsYXlhYmxlIHByb3BlcnRpZXMKKwkJaWYocnZocCE9IG51bGwpIHsKKwkJCQkJTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gIHByb3BlcnRpZXMgPSBydmhwLmdldFByb3BlcnRpZXMoKTsKKwkJCQkJZm9yKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpICsrKSB7CisJCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yIG5leHRQcm9wID0gKEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpcHJvcGVydGllcy5nZXQoaSk7CisJCQkJCQlEaXNwbGF5YWJsZVByb3BlcnR5IHByb3BlcnR5ID0gbmV3IERpc3BsYXlhYmxlUHJvcGVydHkobmV4dFByb3ApOworCQkJCQkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChwcm9wZXJ0eSk7CisJCQkJCX0vLyBmb3IgYWxsIHByb3BlcnRpZXMKKwkJCQl9Ly8gcnZocCBub3QgbnVsbAorCQkKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlmaW5hbCBNZW51IHBvcFVwTWVudSA9IGNvbnRleHRNZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShwYXJlbnQpOworCisJCS8vIFNldCB0aGUgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyCisJCXBhcmVudC5zZXRNZW51KHBvcFVwTWVudSk7CisKKworCX0gLy8gdXBkYXRlQ29udGV4dE1lbnUKKworCisJLyoqCisJICogQHBhcmFtIGRhdGFTZXJpZXNNYXAgdGhlIHtAbGluayBNYXB9IHRoYXQgd2lsbCBjb250YWluIHRoZSByZWxhdGl2ZSB2YWx1ZXMKKwkgKiAgICAgICAgICAgICgwLjAtMS4wKSB0byBwbG90CisJICogQHBhcmFtIGN5Y2xlTnVtYmVycworCSAqICAgICAgICAgICAgdGhlIHtAbGluayBMaXN0fSBvZiBzaW11bGF0aW9uIGN5Y2xlIG51bWJlcnMgdGhhdCBtYXRjaCB0aGUKKwkgKiAgICAgICAgICAgIHJlbGF0aXZlIHZhbHVlcworCSAqIEBwYXJhbSBzZXJpZXNJZGVudGlmaWVyCisJICogICAgICAgICAgICB0aGUgdGl0bGUgb2YgdGhlIGNoYXJ0CisJICogQHJldHVybiBhIDxjb2RlPkNoYXJ0PC9jb2RlPgorCSAqLworCXB1YmxpYyBmaW5hbCBDaGFydCBjcmVhdGVTaW1wbGVMaW5lQ2hhcnQoCisJCQlmaW5hbCBNYXA8U3RyaW5nLCBEYXRhU2VyaWVzPiBkYXRhU2VyaWVzTWFwLAorCQkJZmluYWwgTGlzdDxJbnRlZ2VyPiBjeWNsZU51bWJlcnMsIGZpbmFsIFN0cmluZyBzZXJpZXNJZGVudGlmaWVyKSB7CisJCQorCQlmaW5hbCBDaGFydFdpdGhBeGVzIHJldFZhbHVlID0gQ2hhcnRXaXRoQXhlc0ltcGwuY3JlYXRlKCk7CisKKwkJZmluYWwgQ29sb3JEZWZpbml0aW9uIGZvcmVHcm91bmQgPSBDb2xvckRlZmluaXRpb25JbXBsLldISVRFKCk7CisJCWZpbmFsIENvbG9yRGVmaW5pdGlvbiBiYWNrZ3JvdW5kR3JvdW5kID0gQ29sb3JEZWZpbml0aW9uSW1wbC5CTEFDSygpOworCQlmaW5hbCBDb2xvckRlZmluaXRpb24gZnJhbWVDb2xvciA9IENvbG9yRGVmaW5pdGlvbkltcGwuY3JlYXRlKDUwLCA1MCwKKwkJCQk1MCk7CisKKwkJCisJCQorCisJCS8vIFBsb3QKKwkJcmV0VmFsdWUuZ2V0QmxvY2soKS5zZXRCYWNrZ3JvdW5kKGZyYW1lQ29sb3IpOworCQlmaW5hbCBQbG90IHAgPSByZXRWYWx1ZS5nZXRQbG90KCk7CisJCXAuZ2V0Q2xpZW50QXJlYSgpLnNldEJhY2tncm91bmQoYmFja2dyb3VuZEdyb3VuZCk7CisKKwkJLy8gVGl0bGUKKwkJLy8gY3dhTGluZS5nZXRUaXRsZSggKS5nZXRMYWJlbCggKS5nZXRDYXB0aW9uKCApLnNldFZhbHVlKCAiTGluZSBDaGFydCIKKwkJLy8gKTsvLyROT04tTkxTLTEkCisJCXJldFZhbHVlLmdldFRpdGxlKCkuc2V0VmlzaWJsZShmYWxzZSk7CisKKwkJLy8gTGVnZW5kCisJCWxlZ2VuZCA9IHJldFZhbHVlLmdldExlZ2VuZCgpOworCQlmaW5hbCBMaW5lQXR0cmlidXRlcyBsaWEgPSBsZWdlbmQuZ2V0T3V0bGluZSgpOworCQlsZWdlbmQuZ2V0VGV4dCgpLmdldEZvbnQoKS5zZXRTaXplKDgpOworCQlsaWEuc2V0U3R5bGUoTGluZVN0eWxlLlNPTElEX0xJVEVSQUwpOworCQlsZWdlbmQuZ2V0SW5zZXRzKCkuc2V0KDEwLCA1LCAwLCAwKTsKKwkJbGVnZW5kLmdldE91dGxpbmUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJbGVnZW5kLnNldEFuY2hvcihBbmNob3IuTk9SVEhfTElURVJBTCk7CisJCWxlZ2VuZC5zZXRQb3NpdGlvbihQb3NpdGlvbi5CRUxPV19MSVRFUkFMKTsKKwkJbGVnZW5kLmdldFRleHQoKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJbGVnZW5kLmdldE91dGxpbmUoKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKworCQkvLyAvLy8vLy8vLy8KKwkJLy8gWC1BeGlzCisJCXhBeGlzUHJpbWFyeSA9IHJldFZhbHVlLmdldFByaW1hcnlCYXNlQXhlcygpWzBdOworCQl4QXhpc1ByaW1hcnkuZ2V0TWFqb3JHcmlkKCkuc2V0VGlja1N0eWxlKFRpY2tTdHlsZS5CRUxPV19MSVRFUkFMKTsKKwkJeEF4aXNQcmltYXJ5LmdldE9yaWdpbigpLnNldFR5cGUoSW50ZXJzZWN0aW9uVHlwZS5WQUxVRV9MSVRFUkFMKTsKKwkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuc2V0VmlzaWJsZShmYWxzZSk7CisJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLmdldENhcHRpb24oKS5nZXRGb250KCkuc2V0U2l6ZSg5KTsKKwkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuZ2V0Q2FwdGlvbigpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQl4QXhpc1ByaW1hcnkuZ2V0TGFiZWwoKS5nZXRDYXB0aW9uKCkuc2V0Q29sb3IoZm9yZUdyb3VuZCk7CisJCXhBeGlzUHJpbWFyeS5zZXRUeXBlKEF4aXNUeXBlLkxJTkVBUl9MSVRFUkFMKTsKKworCQlmaW5hbCBTZXJpZXMgc2VDYXRlZ29yeSA9IFNlcmllc0ltcGwuY3JlYXRlKCk7CisKKwkJLy8gbmV3IGNvbG9ycworCQlzZUNhdGVnb3J5LmdldExhYmVsKCkuZ2V0Q2FwdGlvbigpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQlzZUNhdGVnb3J5LmdldExhYmVsKCkuZ2V0T3V0bGluZSgpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQkvLworCisJCWZpbmFsIE51bWJlckRhdGFTZXQgY2F0ZWdvcnlWYWx1ZXMgPSBOdW1iZXJEYXRhU2V0SW1wbAorCQkJCS5jcmVhdGUoY3ljbGVOdW1iZXJzKTsKKwkJc2VDYXRlZ29yeS5zZXREYXRhU2V0KGNhdGVnb3J5VmFsdWVzKTsKKwkJZmluYWwgU2VyaWVzRGVmaW5pdGlvbiBzZFggPSBTZXJpZXNEZWZpbml0aW9uSW1wbC5jcmVhdGUoKTsKKworCQl4QXhpc1ByaW1hcnkuZ2V0U2VyaWVzRGVmaW5pdGlvbnMoKS5hZGQoc2RYKTsKKwkJc2RYLmdldFNlcmllcygpLmFkZChzZUNhdGVnb3J5KTsKKworCQkvLyAvLy8vLy8vLworCQkvLyBZLUF4aXMKKwkJdGhpcy55QXhpc1ByaW1hcnkgPSByZXRWYWx1ZS5nZXRQcmltYXJ5T3J0aG9nb25hbEF4aXMoeEF4aXNQcmltYXJ5KTsKKwkJeUF4aXNQcmltYXJ5LmdldE1ham9yR3JpZCgpLnNldFRpY2tTdHlsZShUaWNrU3R5bGUuTEVGVF9MSVRFUkFMKTsKKwkJLy8gZW5kIFktU2VyaWVzCisKKwkJeEF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWluKE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoMC4wKSk7CisJCXhBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldFN0ZXAoMSk7CisJCQorCQkvL3hBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKFRJQ0tfVFJJR0dFUipERUZBVUxUX0FVVE9BWElTX1RIUkVTSE9MRCkpOworCQkvL2ludCBudW1UaWNrcyA9IFRJQ0tfVFJJR0dFUipERUZBVUxUX0FVVE9BWElTX1RIUkVTSE9MRC9NSU5fVElDS1M7CisJCS8vCisJCQorCQkKKwkJCisJCXhBeGlzUHJpbWFyeS5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5nZXRGb250KCkuc2V0U2l6ZSg5KTsKKwkJeEF4aXNQcmltYXJ5LmdldExhYmVsKCkuZ2V0Q2FwdGlvbigpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQlzZXRUaW1lTGFiZWwoKTsKKworCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNaW4oTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZSgwLjApKTsKKwkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWF4KE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoMS4wKSk7CisJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldFN0ZXAoMC4yNSk7CisJCXlBeGlzUHJpbWFyeS5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5nZXRGb250KCkuc2V0U2l6ZSg5KTsKKwkJeUF4aXNQcmltYXJ5LmdldExhYmVsKCkuZ2V0Q2FwdGlvbigpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQkvLyB5QXhpc1ByaW1hcnkuZ2V0TWFqb3JHcmlkKCkuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJCisJCS8vIGZvciBub3cgZ2V0IHJlYWR5IHRvIGNyZWF0ZSBvbmx5IG9uZSBsaW5lIC0gd2UgaGF2ZSBubyBkYXRhIHlldC4KKwkJLy8gd2Ugd2lsbCBhZGQgbW9yZSBsaW5lcyBhcyB3ZSBuZWVkIHRoZW0KKwkJLy8gaGFuZGxlIG51bGwKKwkJaWYoIWRhdGFTZXJpZXNNYXAuY29udGFpbnNLZXkoZGVmYXVsdEtleSkpIHsKKwkJCURhdGFTZXJpZXMgc2VyaWVzID0gbmV3IERhdGFTZXJpZXMoZGVmYXVsdEtleSwgc2VyaWVzQ291bnQpOworCQkJZGF0YVNlcmllc01hcC5wdXQoZGVmYXVsdEtleSwgc2VyaWVzKTsKKwkJfQorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZVNpbXBsZUxpbmVDaGFydAorCisJdm9pZCBzZXRUaW1lTGFiZWwoKSB7CisJCVN0cmluZyB2YWwgPSAiIjsKKwkJaWYgKGNvbnRyb2wgIT0gbnVsbCkgeworCQkJZmluYWwgSVNpbXVsYXRpb24gc2ltID0gY29udHJvbC5zaW11bGF0aW9uOworCQkJaWYgKHNpbSAhPSBudWxsKSB7CisJCQkJZmluYWwgbG9uZyB0aW1lRGVsdGEgPSBzaW0uZ2V0U2NlbmFyaW8oKS5nZXRTZXF1ZW5jZXIoKQorCQkJCQkJLmdldFRpbWVEZWx0YSgpOworCisJCQkJaWYgKHRpbWVEZWx0YSA8IFNURU1UaW1lLlVuaXRzLk1JTlVURS5nZXRNaWxsaXNlY29uZHMoKSkgeworCQkJCQl2YWwgPSAic2VjcyI7CisJCQkJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLnNldFZpc2libGUodHJ1ZSk7CisJCQkJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLmdldENhcHRpb24oKS5zZXRWYWx1ZSh2YWwpOworCQkJCQlyZXR1cm47CisJCQkJfSBlbHNlIGlmICh0aW1lRGVsdGEgPCBTVEVNVGltZS5Vbml0cy5IT1VSLmdldE1pbGxpc2Vjb25kcygpKSB7CisJCQkJCXZhbCA9ICJtaW5zIjsKKwkJCQkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCQkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuZ2V0Q2FwdGlvbigpLnNldFZhbHVlKHZhbCk7CisJCQkJCXJldHVybjsKKwkJCQl9IGVsc2UgaWYgKHRpbWVEZWx0YSA8IFNURU1UaW1lLlVuaXRzLkRBWS5nZXRNaWxsaXNlY29uZHMoKSkgeworCQkJCQl2YWwgPSAiaHJzIjsKKwkJCQkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCQkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuZ2V0Q2FwdGlvbigpLnNldFZhbHVlKHZhbCk7CisJCQkJCXJldHVybjsKKworCQkJCX0gZWxzZSBpZiAodGltZURlbHRhIDw9IFNURU1UaW1lLlVuaXRzLldFRUsuZ2V0TWlsbGlzZWNvbmRzKCkpIHsKKwkJCQkJdmFsID0gImRheXMiOworCQkJCQl4QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5zZXRWaXNpYmxlKHRydWUpOworCQkJCQl4QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5nZXRDYXB0aW9uKCkuc2V0VmFsdWUodmFsKTsKKwkJCQkJcmV0dXJuOworCisJCQkJfSBlbHNlIGlmICh0aW1lRGVsdGEgPCA0ICogU1RFTVRpbWUuVW5pdHMuV0VFSworCQkJCQkJLmdldE1pbGxpc2Vjb25kcygpKSB7CisJCQkJCXZhbCA9ICJ3ZWVrcyI7CisJCQkJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLnNldFZpc2libGUodHJ1ZSk7CisJCQkJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLmdldENhcHRpb24oKS5zZXRWYWx1ZSh2YWwpOworCQkJCQlyZXR1cm47CisJCQkJfSBlbHNlIGlmICh0aW1lRGVsdGEgPCBTVEVNVGltZS5Vbml0cy5ZRUFSLmdldE1pbGxpc2Vjb25kcygpKSB7CisJCQkJCXZhbCA9ICJtb250aHMiOworCQkJCQl4QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5zZXRWaXNpYmxlKHRydWUpOworCQkJCQl4QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5nZXRDYXB0aW9uKCkuc2V0VmFsdWUodmFsKTsKKwkJCQkJcmV0dXJuOworCQkJCX0gZWxzZSB7CisJCQkJCXZhbCA9ICJ5ZWFycyI7CisJCQkJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLnNldFZpc2libGUodHJ1ZSk7CisJCQkJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLmdldENhcHRpb24oKS5zZXRWYWx1ZSh2YWwpOworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQl9IC8vIHNpbSAhIG51bGwKKwkJfS8vIGNvbnRyb2wgISBudWxsCisKKwl9IC8vIHNldFRpbWVMYWJlbCgpCisKKwkKKworCS8qKgorCSAqIEBwYXJhbSBydmhwCisJICogQHBhcmFtIHByb3BlcnRpZXNUb1Bsb3RMaXN0CisJICovCisJcHVibGljIHZvaWQgc2V0RGF0YVNvdXJjZUFuZFJlZHJhdygKKwkJCWZpbmFsIFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXJBZGFwdGVyIHJ2aHAsCisJCQlmaW5hbCBMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BlcnRpZXNUb1Bsb3RMaXN0KSB7CisKKwkJdGhpcy5wcm9wZXJ0aWVzVG9QbG90ID0gYWRkUHJvcGVydGllcyhwcm9wZXJ0aWVzVG9QbG90TGlzdCk7CisJCWlmKHJ2aHAhPXRoaXMucnZocCkgeworCQkJcHJvcGVydGllc1RvUGxvdC5jbGVhcigpOworCQkJdGhpcy5wcm9wZXJ0aWVzVG9QbG90ID0gYWRkUHJvcGVydGllcyhwcm9wZXJ0aWVzVG9QbG90TGlzdCk7CisJCQl0aGlzLnJ2aHA9IHJ2aHA7CisJCQkvL3RoaXMucHJvcGVydGllc1RvUGxvdCA9IGZpbHRlclByZWZlcnJlZFByb3BlcnRpZXMocHJvcGVydGllc1RvUGxvdCk7CisJCQl1cGRhdGVDb250ZXh0TWVudSh0aGlzKTsKKwkJfQorCisJCWRyYXcoKTsKKwl9IC8vIHNldERhdGFTb3VyY2VBbmRSZWRyYXcKKworCS8qKgorCSAqIEZpbHRlcnMgYSBsaXN0IG9mIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzIHRvIHNob3cgcHJlZmVycmVkIHByb3BlcnRpZXMgaWYKKwkgKiBhdCBsZWFzdCBvbmUgZXhpc3RzLiBJZiBub3QsIGp1c3QgcmV0dXJucyB0aGUgZW50aXJlIGxpc3QuCisJICoKKwkgKiBAcmV0dXJuIGZpbHRlcmVkTGlzdDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yPgorCSAqLworCXByb3RlY3RlZCBMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGZpbHRlclByZWZlcnJlZFByb3BlcnRpZXMoCisJCQlmaW5hbCBMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGZ1bGxMaXN0KSB7CisJCWZpbmFsIExpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yPigpOworCQkvLyBBcmUgYW55IG9mIHRoZSBsYWJlbHMgaW4gdGhlIHByZWZlcmVuY2Ugc2V0PworCQlmaW5hbCBTZXQ8U3RyaW5nPiBwcmVmU2V0ID0gVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlCisJCQkJLmdldFByZWZlcmVuY2VTZXQoKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGZ1bGxMaXN0LnNpemUoKTsgaSsrKSB7CisJCQlmaW5hbCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5ID0gZnVsbExpc3QuZ2V0KGkpOworCQkJaWYgKHByZWZTZXQuY29udGFpbnMocHJvcGVydHkuZ2V0RGlzcGxheU5hbWUocHJvcGVydHkpKSkgeworCQkJCXByb3BlcnR5TGlzdC5hZGQocHJvcGVydHkpOworCQkJfQorCQl9CisJCS8vIGlmIHdlIGRpZG4ndCBmaW5kIGFueSBpbiB0aGUgcHJlZmVyZW5jZXMgdGhlbiBqdXN0IGFkZCB0aGVtIGFsbAorCQlpZiAocHJvcGVydHlMaXN0LnNpemUoKSA9PSAwKSB7CisJCQlwcm9wZXJ0eUxpc3QuYWRkQWxsKGZ1bGxMaXN0KTsKKwkJfQorCQlyZXR1cm4gcHJvcGVydHlMaXN0OworCX0KKworCisJLyoqCisJICogRmlsdGVycyBhIGxpc3Qgb2YgSXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgdG8gc2hvdyBwcmVmZXJyZWQgcHJvcGVydGllcyBpZgorCSAqIGF0IGxlYXN0IG9uZSBleGlzdHMuIElmIG5vdCwganVzdCByZXR1cm5zIHRoZSBlbnRpcmUgbGlzdC4KKwkgKgorCSAqIEByZXR1cm4gZmlsdGVyZWRMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+CisJICovCisJcHJvdGVjdGVkIE1hcDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yLEJvb2xlYW4+IGFkZFByb3BlcnRpZXMoZmluYWwgTGlzdDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wZXJ0aWVzVG9QbG90TGlzdCkgeworCisJCQorCisJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllc1RvUGxvdExpc3Quc2l6ZSgpOyBpKyspIHsKKwkJCWZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkgPSBwcm9wZXJ0aWVzVG9QbG90TGlzdC5nZXQoaSk7CisJCQlpZighcHJvcGVydGllc1RvUGxvdC5jb250YWluc0tleShwcm9wZXJ0eSkpIHsKKwkJCQlib29sZWFuIHZpc2libGUgPSB0cnVlOworCQkJCWlmKGRlZmF1bHRIaWRlU2V0LmNvbnRhaW5zKHByb3BlcnR5LmdldERpc3BsYXlOYW1lKHByb3BlcnR5KSkpIHZpc2libGUgPSBmYWxzZTsKKwkJCQlCb29sZWFuIGJPYmogPSBCb29sZWFuLnZhbHVlT2YodmlzaWJsZSk7IC8vZGVmYXVsdCB2aXNpYmlsaXR5CisJCQkJdGhpcy5wcm9wZXJ0aWVzVG9QbG90LnB1dChwcm9wZXJ0eSxiT2JqKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiB0aGlzLnByb3BlcnRpZXNUb1Bsb3Q7CisJfQorCisKKwkvKioKKwkgKiBTZXQgdGhlIHByb3ZpZGVyIG9mIHJlbGF0aXZlIHZhbHVlcy4gSXQgd2lsbCBiZSBjb25zdWx0ZWQgdG8gcHJvZHVjZSBhCisJICogc2VxdWVuY2Ugb2YgcmVsYXRpdmUgdmFsdWVzICgwLjAgdG8gMS4wKSB0aGF0IHdpbGwgYmUgcGxvdHRlZC4KKwkgKgorCSAqIEBwYXJhbSBydmhwCisJICogICAgICAgICAgICB0aGUgcHJvdmlkZXIgb2YgcmVsYXRpdmUgdmFsdWVzLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIoCisJCQlmaW5hbCBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyIHJ2aHApIHsKKwkJdGhpcy5ydmhwID0gcnZocDsKKwl9IC8vIHNldFJlbGF0aXZlVmFsdWVIaXN0b3J5UHJvdmlkZXIKKworCisKKworCisKKwkvKioKKwkgKiBEaXNwb3NlcyB0aGUgQ29sb3Igb2JqZWN0cworCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9CisKKwkvKioKKwkgKiByZXNldAorCSAqLworCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlyZXNldERhdGEoKTsKKwkJcnZocCA9IG51bGw7CisJCXJlZHJhdygpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHJlc2V0RGF0YSgpIHsKKwkJY2xlYXJEYXRhKCk7CisJCS8vIGZvciBub3cgZ2V0IHJlYWR5IHRvIGNyZWF0ZSBvbmx5IG9uZSBsaW5lIC0gd2UgaGF2ZSBubyBkYXRhIHlldC4KKwkJLy8gd2Ugd2lsbCBhZGQgbW9yZSBsaW5lcyBhcyB3ZSBuZWVkIHRoZW0KKwkJCisJCWlmKCFkYXRhU2VyaWVzTWFwLmNvbnRhaW5zS2V5KGRlZmF1bHRLZXkpKSB7CisJCQlEYXRhU2VyaWVzIHNlcmllcyA9IG5ldyBEYXRhU2VyaWVzKGRlZmF1bHRLZXksIHNlcmllc0NvdW50KTsKKwkJCQorCQkJZGF0YVNlcmllc01hcC5wdXQoZGVmYXVsdEtleSwgc2VyaWVzKTsKKwkJfSAKKwkJLy8gaGFuZGxlIG51bGwKKwkJCisJCWN5Y2xlTnVtYmVycy5hZGQoSW50ZWdlci52YWx1ZU9mKDApKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2xlYXJEYXRhKCkgeworCQkKKwkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gZGF0YVNlcmllc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworCQl3aGlsZSgoaXRlciE9bnVsbCkmJihpdGVyLmhhc05leHQoKSkpIHsKKwkJCVN0cmluZyBrZXkgPSBpdGVyLm5leHQoKTsKKwkJCURhdGFTZXJpZXMgc2VyaWVzID0gZGF0YVNlcmllc01hcC5nZXQoa2V5KTsKKwkJCXNlcmllcy5yZWxhdGl2ZVZhbHVlcy5jbGVhcigpOworCQkJc2VyaWVzLmFkZFZhbHVlKG5ldyBEb3VibGUoMC4wKSk7CisJCQl4QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNaW4oTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZSgwLjApKTsKKwkJCW1heFRpbWVBeGlzVmFsdWUgPSBERUZBVUxUX0FVVE9BWElTX1RIUkVTSE9MRDsKKwkJCS8veEF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWF4KE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoVElDS19UUklHR0VSKkRFRkFVTFRfQVVUT0FYSVNfVEhSRVNIT0xEKSk7CisJCQkvL2ludCBudW1UaWNrcyA9IFRJQ0tfVFJJR0dFUipERUZBVUxUX0FVVE9BWElTX1RIUkVTSE9MRC9NSU5fVElDS1M7CisJCQl4QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRTdGVwKDEpOworCQl9CisJCWN5Y2xlTnVtYmVycy5jbGVhcigpOworCX0KKworCS8qKgorCSAqIHRvZ2dsZSB0aGUgc2NhbGUgZnJvbSBsb2dhcml0aG1pYyB0byBsaW5lYXIKKwkgKi8KKwl2b2lkIHRvZ2dsZUF4aXNTY2FsZSgpIHsKKwkJaWYgKHVzZUxpbmVhclRpbWVTY2FsZSkgeyAvL1N3aXRjaCB0byBsb2dhcml0aG1pYyBzY2FsZQorCQkJbG9nVGltZUFjdGlvbi5zZXRDaGVja2VkKHRydWUpOworCQkJbGluZWFyVGltZUFjdGlvbi5zZXRDaGVja2VkKGZhbHNlKTsKKwkJCS8vSnVzdCB1c2luZyB0aGUgZm9sbG93aW5nIGF4aXMgdHlwZSwgdG8gbW92ZSB0byBsb2cgc2NhbGUsIGRpZG4ndCB3b3JrCisJCQkvL3lBeGlzUHJpbWFyeS5zZXRUeXBlKEF4aXNUeXBlLkxPR0FSSVRITUlDX0xJVEVSQUwpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWluKG51bGwpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWF4KG51bGwpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkudW5zZXRTdGVwKCk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS51bnNldFN0ZXBOdW1iZXIoKTsKKwkJfQorCQllbHNlIHsgLy9Td2l0Y2ggdG8gbGluZWFyIHNjYWxlCisJCQlsb2dUaW1lQWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOworCQkJbGluZWFyVGltZUFjdGlvbi5zZXRDaGVja2VkKHRydWUpOworCQkJLy95QXhpc1ByaW1hcnkuc2V0VHlwZShBeGlzVHlwZS5MSU5FQVJfTElURVJBTCk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNaW4oTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZSgwLjApKTsKKwkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDEuMCkpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0U3RlcCgwLjI1KTsKKwkJfQorCQl1c2VMaW5lYXJUaW1lU2NhbGUgPSAhdXNlTGluZWFyVGltZVNjYWxlOworCQl0aGlzLmRyYXcoKTsKKwl9CisJCisJCisJLyoqCisJICogdG9nZ2xlIHRoZSBzY2FsZSBmcm9tIGxvZ2FyaXRobWljIHRvIGxpbmVhcgorCSAqLworCXZvaWQgdG9nZ2xlTGVnZW5kKCkgeworCQlpZiAoc2hvd0xlZ2VuZCkgeyAvL1N3aXRjaCB0byBoaWRlCisJCQl2aWV3TGVnZW5kLnNldENoZWNrZWQoZmFsc2UpOworCQkJaGlkZUxlZ2VuZC5zZXRDaGVja2VkKHRydWUpOworCQkJbGVnZW5kLnNldFZpc2libGUoZmFsc2UpOworCQl9CisJCWVsc2UgeyAvL1N3aXRjaCB0byB2aWV3CisJCQl2aWV3TGVnZW5kLnNldENoZWNrZWQodHJ1ZSk7CisJCQloaWRlTGVnZW5kLnNldENoZWNrZWQoZmFsc2UpOworCQkJbGVnZW5kLnNldFZpc2libGUodHJ1ZSk7CisJCX0KKwkJc2hvd0xlZ2VuZCA9ICFzaG93TGVnZW5kOworCQl0aGlzLmRyYXcoKTsKKwl9CisKKwkvKioKKwkgKiBzd2l0Y2ggdG8gbGluZWFyIHBsb3QgCisJICogCisJICovCisJcHJvdGVjdGVkIGNsYXNzIExpbmVhclNjYWxlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKwkJcHVibGljIExpbmVhclNjYWxlQWN0aW9uKCkKKwkJeworCQkJc3VwZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5MaW5lYXJUaW1lU2NhbGUiKSwgSUFjdGlvbi5BU19DSEVDS19CT1gpOworCQkJc2V0Q2hlY2tlZCh1c2VMaW5lYXJUaW1lU2NhbGUpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5MaW5lYXJUaW1lU2NhbGUiKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQlpZiAodXNlTGluZWFyVGltZVNjYWxlKSB7CisJCQkJc2V0Q2hlY2tlZCh0cnVlKTsKKwkJCQkvL05vdGhpbmcgdG8gZG8uIEl0J3MgYWxyZWFkeSBsaW5lYXItdGltZS4KKwkJCX0KKwkJCWVsc2UgeworCQkJCXRvZ2dsZUF4aXNTY2FsZSgpOworCQkJfQorCQl9CisJfSAvL0xpbmVhclNjYWxlQWN0aW9uCisKKwkvKioKKwkgKiBzd2l0Y2ggdG8gc2VtaS1sb2cgcGxvdCAobG9nIHNjYWxlIG9uIHkgYXhpcykKKwkgKiAKKwkgKi8KKwljbGFzcyBMb2dTY2FsZUFjdGlvbiBleHRlbmRzIEFjdGlvbiAJeworCQlwdWJsaWMgTG9nU2NhbGVBY3Rpb24oKQorCQl7CisJCQlzdXBlcihNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbnRleHRNZW51LkxvZ1RpbWVTY2FsZSIpLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7CisJCQlzZXRDaGVja2VkKCF1c2VMaW5lYXJUaW1lU2NhbGUpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5Mb2dUaW1lU2NhbGUiKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQlpZiAoIXVzZUxpbmVhclRpbWVTY2FsZSkgeworCQkJCXNldENoZWNrZWQodHJ1ZSk7CisJCQkJLy9Ob3RoaW5nIHRvIGRvLiBJdCdzIGFscmVhZHkgbG9nLXRpbWUuCisJCQl9CisJCQllbHNlIHsKKwkJCQl0b2dnbGVBeGlzU2NhbGUoKTsKKwkJCX0KKwkJfQorCX0vL0xvZ1NjYWxlQWN0aW9uCisKKwkvKioKKwkgKiBBY3Rpb24gdG8gc2hvdyB0aGUgbGVnZW5kCisJICovCisJcHJvdGVjdGVkIGNsYXNzIExlZ2VuZFZpZXdBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCQlwdWJsaWMgTGVnZW5kVmlld0FjdGlvbigpCisJCXsKKwkJCXN1cGVyKE1lc3NhZ2VzLmdldFN0cmluZygiQ29udGV4dE1lbnUuU2hvd0xlZ2VuZCIpLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7CisJCQlzZXRDaGVja2VkKHNob3dMZWdlbmQpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5TaG93TGVnZW5kIik7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJaWYgKHNob3dMZWdlbmQpIHsKKwkJCQlzZXRDaGVja2VkKHRydWUpOworCQkJCS8vTm90aGluZyB0byBkby4gSXQncyBhbHJlYWR5IGxpbmVhci10aW1lLgorCQkJfQorCQkJZWxzZSB7CisJCQkJdG9nZ2xlTGVnZW5kKCk7CisJCQl9CisJCX0KKwl9IC8vTGVnZW5kVmlld0FjdGlvbgorCQorCS8qKgorCSAqIEFjdGlvbiB0byBoaWRlIHRoZSBsZWdlbmQKKwkgKi8KKwljbGFzcyBMZWdlbmRIaWRlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIAl7CisJCXB1YmxpYyBMZWdlbmRIaWRlQWN0aW9uKCkKKwkJeworCQkJc3VwZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5IaWRlTGVnZW5kIiksIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKKwkJCXNldENoZWNrZWQoIXNob3dMZWdlbmQpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5IaWRlTGVnZW5kIik7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJaWYgKCFzaG93TGVnZW5kKSB7CisJCQkJc2V0Q2hlY2tlZCh0cnVlKTsKKwkJCQkvL05vdGhpbmcgdG8gZG8uIEl0J3MgYWxyZWFkeSBsb2ctdGltZS4KKwkJCX0KKwkJCWVsc2UgeworCQkJCXRvZ2dsZUxlZ2VuZCgpOworCQkJfQorCQl9CisJfS8vTGVnZW5kSGlkZUFjdGlvbgorCisKKwkvKioKKwkgKiBEaXNwbGF5YWJsZVByb3BlcnR5CisJICoKKwkgKi8KKwlwcm90ZWN0ZWQgY2xhc3MgRGlzcGxheWFibGVQcm9wZXJ0eSBleHRlbmRzIEFjdGlvbgorCXsKKwkJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSA9IG51bGw7CisJCXB1YmxpYyBEaXNwbGF5YWJsZVByb3BlcnR5KEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkpCisJCXsKKwkJCQkJc3VwZXIocHJvcGVydHkuZ2V0RGlzcGxheU5hbWUocHJvcGVydHkpLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7CisJCQkJCXRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKwkJCQkJc2V0Q2hlY2tlZChwcm9wZXJ0aWVzVG9QbG90LmdldChwcm9wZXJ0eSkuYm9vbGVhblZhbHVlKCkpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gcHJvcGVydHkuZ2V0RGlzcGxheU5hbWUocHJvcGVydHkpOworCQl9CisKKwkJLyoqCisJCSAqIFRvZ2dsZSB0aGUgc3RhdGUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJICAgIGJvb2xlYW4gc3RhdGUgPSAhcHJvcGVydGllc1RvUGxvdC5nZXQocHJvcGVydHkpLmJvb2xlYW5WYWx1ZSgpOworCQkJICAgIHByb3BlcnRpZXNUb1Bsb3QucHV0KHByb3BlcnR5LCBCb29sZWFuLnZhbHVlT2Yoc3RhdGUpKTsKKwkJCQlzZXRDaGVja2VkKHN0YXRlKTsKKwkJCQlkcmF3KCk7CisJCX0KKwl9Ly8gRGlzcGxheWFibGVQcm9wZXJ0eQorCQorCisKKwlwcm90ZWN0ZWQgY2xhc3MgRGF0YVNlcmllcyAKKwl7CisJCXB1YmxpYyBTdHJpbmcgcHJvcGVydHlOYW1lID0gIiI7CisJCQorCisJCXB1YmxpYyBMaXN0PERvdWJsZT4gcmVsYXRpdmVWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJcHVibGljIExpbmVTZXJpZXMgbGluZVNlcmllcyA9IG51bGw7CisJCXByaXZhdGUgYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsKKwkJcHJpdmF0ZSBTZXJpZXNEZWZpbml0aW9uIHNkWSA9IG51bGw7CisJCQorCQlwcml2YXRlIGludCBzZXJpZXNJbmRleCA9IDA7CisJCQorCQkKKwkJcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworCQkJcmV0dXJuIHZpc2libGU7CisJCX0KKworCQkvKioKKwkJICogCisJCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKwkJICogQHBhcmFtIGluZGV4CisJCSAqLworCQlwdWJsaWMgRGF0YVNlcmllcyhTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgaW5kZXgpIHsKKwkJCXRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworCQkJdGhpcy5zZXJpZXNJbmRleCA9IGluZGV4OworCQkJc2VyaWVzQ291bnQgKys7CisJCQlyZWxhdGl2ZVZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJcmVsYXRpdmVWYWx1ZXMuYWRkKG5ldyBEb3VibGUoMC4wKSk7CisJCQlhZGRMaW5lU2VyaWVzKHByb3BlcnR5TmFtZSk7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIGFkZFZhbHVlKERvdWJsZSB2YWwpIHsKKwkJCWlmKHJlbGF0aXZlVmFsdWVzPT1udWxsKSByZWxhdGl2ZVZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJcmVsYXRpdmVWYWx1ZXMuYWRkKHZhbCk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCisJCSAqIAorCQkgKi8KKwkJQFN1cHByZXNzV2FybmluZ3MoImNhc3QiKQorCQlwdWJsaWMgdm9pZCBhZGRMaW5lU2VyaWVzKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJCWZpbmFsIE51bWJlckRhdGFTZXQgb3J0aG9WYWx1ZXMgPSBOdW1iZXJEYXRhU2V0SW1wbAorCQkJCQkuY3JlYXRlKHJlbGF0aXZlVmFsdWVzKTsKKwkJCWlmKGxpbmVTZXJpZXMgPT0gbnVsbCkgbGluZVNlcmllcyA9IChTY2F0dGVyU2VyaWVzKSBTY2F0dGVyU2VyaWVzSW1wbC5jcmVhdGUoKTsKKwkJCWxpbmVTZXJpZXMuc2V0RGF0YVNldChvcnRob1ZhbHVlcyk7CisKKwkJCWxpbmVTZXJpZXMuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRWaXNpYmxlKHRydWUpOworCQkJCisJCQkvLyBBc3NpZ24gdGhlIGxpbmUgY29sb3IKKwkJCS8vIGJhc2VkIG9uIHNlbGVjdGVkIHByb3BlcnR5LiBEZWZhdWx0IGlzIEJsdWUKKwkJCXNldENvbG9yRGVmcyhwcm9wZXJ0eU5hbWUpOworCQkJCisJCQkvLyByZXBsYWNlcyBkZXByZWNhdGVkIGNvZGU6IGxpbmVTZXJpZXMuZ2V0TWFya2VyKCkuc2V0VmlzaWJsZShmYWxzZSk7CisJCQlpZiAoIWxpbmVTZXJpZXMuZ2V0TWFya2VycygpLmlzRW1wdHkoKSkgeworCQkJCU1hcmtlciBtYXJrZXIgPSAoTWFya2VyKWxpbmVTZXJpZXMuZ2V0TWFya2VycygpLmdldCgwKTsKKwkJCQltYXJrZXIuc2V0VmlzaWJsZShmYWxzZSk7CisJCQl9CisJCQkKKwkJCS8vIHRoZSBzZXJpZXMgZGVmCisJCQlzZFkgPSBTZXJpZXNEZWZpbml0aW9uSW1wbC5jcmVhdGUoKTsKKwkJCS8vc2RZLmdldFNlcmllc1BhbGV0dGUoKS51cGRhdGUoLTIpOworCQkJc2RZLmdldFNlcmllcygpLmFkZChsaW5lU2VyaWVzKTsKKwkJCXlBeGlzUHJpbWFyeS5nZXRTZXJpZXNEZWZpbml0aW9ucygpLmFkZChzZFkpOworCQkJc2V0VGltZUxhYmVsKCk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCS8qKiAKKwkJICogaW4gcmVzcG9uc2UgdG8gdXNlciBhY3Rpb24gdGVtcG9yYXJpbHkgcmVtb3ZlIHRoZSBsaW5lIHNlcmllcyBmcm9tIHRoZSBncmFwaAorCQkgKi8KKwkJcHVibGljIHZvaWQgaGlkZSgpIHsKKwkJCWxpbmVTZXJpZXMuc2V0VmlzaWJsZShmYWxzZSk7CisJCQl2aXNpYmxlID0gZmFsc2U7CisJCX0vLyBoaWRlCisJCQorCQkvKiogCisJCSAqIGluIHJlc3BvbnNlIHRvIHVzZXIgYWN0aW9uIGFkZCBiYWNrIHRoZSBsaW5lIHNlcmllcyB0byB0aGUgZ3JhcGgKKwkJICovCisJCXB1YmxpYyB2b2lkIHNob3coKSB7CisJCQlsaW5lU2VyaWVzLnNldFZpc2libGUodHJ1ZSk7CisJCQl2aXNpYmxlID0gdHJ1ZTsKKwkJfS8vIHNob3cKKwkJCisKKwkJLyoqCisJCSAqIFNldHMgdGhlIGNvbG9ycyBmb3IgYSBuIGFycmF5IG9mIExpbmVTZXJpZXMgZ2l2ZW4gdGhlIHByb3BlcnR5IHRvIFBsb3QKKwkJICogZm9yIGVhY2guIFRyeSB0byBzZXQgY29sb3IgZnJvbSB0aGUgcHJlZmVyZW5jZXMgKGlmIHNwZWNpZmllZCBmb3IgdGhhdAorCQkgKiBwcm9wZXJ0eSkgb3RoZXJ3aXNlIHNldHMgbGluZSBjb2xvciB0byBibHVlLgorCQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIAorCQkgKgorCQkgKi8KKwkJcHVibGljIHZvaWQgc2V0Q29sb3JEZWZzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJCS8vIHRoZSBkZWZhdWx0IGxpbmUgY29sb3IKKworCQkJLy8gaWYgcG9zc2libGUgZ2V0IGNvbG9yIGZyb20gcHJlZmVyZW5jZXMKKwkJCWZpbmFsIE1hcDxTdHJpbmcsIENvbG9yPiBjb2xvck1hcCA9IFZpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZS5nZXRDb2xvck1hcHBpbmcoKTsKKwkJCS8vIHBpY2sgYSBkZWZhdWx0IGNvbG9yCisJCQlpbnQgY29sb3JJbmRleCA9IHNlcmllc0luZGV4ICUgY29sb3JEZWZhdWx0Lmxlbmd0aDsKKwkJCUNvbG9yRGVmaW5pdGlvbiBjb2xvciA9IGNvbG9yRGVmYXVsdFtjb2xvckluZGV4XTsKKworCQkJLy8gcHJlZmVycmVkIGNvbG9yIGJ5IG5hbWUKKwkJCWlmIChjb2xvck1hcC5jb250YWluc0tleShwcm9wZXJ0eU5hbWUpKSB7CisJCQkJZmluYWwgQ29sb3IgYyA9IGNvbG9yTWFwLmdldChwcm9wZXJ0eU5hbWUpOworCQkJCWNvbG9yID0gQ29sb3JEZWZpbml0aW9uSW1wbC5jcmVhdGUoYy5nZXRSZWQoKSwgYy5nZXRHcmVlbigpLCBjLmdldEJsdWUoKSk7CisJCQl9CisJCQl0aGlzLmxpbmVTZXJpZXMuc2V0U2VyaWVzSWRlbnRpZmllcihwcm9wZXJ0eU5hbWUpOworCQkJdGhpcy5saW5lU2VyaWVzLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoY29sb3IpOworCQkJcmV0dXJuOworCQl9Ly8gZ2V0Q29sb3JEZWYKKworCQkvKioKKwkJICogbGVuZ3RoIG9mIHRoZSBzZXJpZXMKKwkJICogQHJldHVybiBudW1iZXIgb2YgZGF0YSBwb2ludHMKKwkJICovCisJCXB1YmxpYyBpbnQgZ2V0RGF0YVNpemUoKSB7CisJCQlyZXR1cm4gcmVsYXRpdmVWYWx1ZXMuc2l6ZSgpOworCQl9CisJCS8vIEFjY2Vzc29ycworCQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKKwkJCXJldHVybiBwcm9wZXJ0eU5hbWU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eU5hbWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQkJdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7CisJCX0KKworCQlwdWJsaWMgTGlzdDxEb3VibGU+IGdldFJlbGF0aXZlVmFsdWVzKCkgeworCQkJcmV0dXJuIHJlbGF0aXZlVmFsdWVzOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0UmVsYXRpdmVWYWx1ZXMoTGlzdDxEb3VibGU+IHJlbGF0aXZlVmFsdWVzKSB7CisJCQl0aGlzLnJlbGF0aXZlVmFsdWVzID0gcmVsYXRpdmVWYWx1ZXM7CisJCX0KKworCQlwdWJsaWMgTGluZVNlcmllcyBnZXRMaW5lU2VyaWVzKCkgeworCQkJcmV0dXJuIGxpbmVTZXJpZXM7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRMaW5lU2VyaWVzKExpbmVTZXJpZXMgbGluZVNlcmllcykgeworCQkJdGhpcy5saW5lU2VyaWVzID0gbGluZVNlcmllczsKKwkJfQorCisJCisJfS8vIERhdGFTZXJpZXMKKwkKK30gLy8gVGltZVNlcmllc0NhbnZhcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvVGltZVNlcmllc0ZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL3ZpZXdzL1RpbWVTZXJpZXNGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFmNmI2YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL3ZpZXdzL1RpbWVTZXJpZXNGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLy8gVGltZVNlcmllc0ZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBmYWN0b3J5IGZvciBjcmVhdGluZyB7QGxpbmsgUmVwb3J0Q29udHJvbH0gaW5zdGFuY2VzLgorICovCitwdWJsaWMgY2xhc3MgVGltZVNlcmllc0ZhY3RvcnkgaW1wbGVtZW50cyBSZXBvcnRDb250cm9sRmFjdG9yeSB7CisKKwlzdGF0aWMgVGltZVNlcmllc0ZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgVGltZVNlcmllc0ZhY3RvcnkoKTsKKworCS8qKgorCSAqIENvbnN0YW50cyBmb3Igc2F2aW5nIFJlcG9ydFZpZXdQcmVmZXJlbmNlcworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVfU0VSSUVTX1RZUEUgPSAiVGltZVNlcmllcyI7CisKKwkvKioKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICB0aGUgcGFyZW50IG9mIHRoZSB7QGxpbmsgUmVsYXRpdmVWYWx1ZUhpc3RvcnlQbG90dGVyfSAKKwkgKiBAcmV0dXJuIGEge0BsaW5rIFJlbGF0aXZlVmFsdWVIaXN0b3J5UGxvdHRlcn0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5HZW9ncmFwaGljQ29udHJvbEZhY3RvcnkjY3JlYXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkgKi8KKwlwdWJsaWMgUmVwb3J0Q29udHJvbCBjcmVhdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IFJlbGF0aXZlVmFsdWVIaXN0b3J5UGxvdHRlcihwYXJlbnQpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gVE9ETyBKRksKKwkgKiAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUNvbnRyb2xOYW1lKCkgeworCQlyZXR1cm4gVElNRV9TRVJJRVNfVFlQRTsKKwl9CisJCisJLyoqCisJICogVGhpcyBGYWN0b3J5IGNyZWF0ZXMgYSBjb250cm9sIGFzc29jaWF0ZWQgd2l0aCBhbiBJZGVuZmlhYmxlCisJICogQHJldHVybiB0eXBlIG9mIGZhY3RvcnkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlUeXBlKCkgeworCQlyZXR1cm4gSURFTlRJRkFCTEVfVFlQRTsKKwl9CisKK30gLy8gVGltZVNlcmllc0ZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL3ZpZXdzL1RpbWVTZXJpZXNWaWV3LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9UaW1lU2VyaWVzVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZDQwNGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcmVwb3J0cy92aWV3cy9UaW1lU2VyaWVzVmlldy5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5TZWxlY3RlZFJlcG9ydHNNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKKworLyoqCisgKiBUaGlzIHZpZXcgY29udGFpbnMgQklSVCBvdXRwdXQgdGhhdCBwbG90cyB2YWx1ZXMgb2YgdmFyaWFibGVzIGluIFNURU0KKyAqIHNpbXVsYXRpb25zLgorICovCisKK3B1YmxpYyBjbGFzcyBUaW1lU2VyaWVzVmlldyBleHRlbmRzIFZpZXdQYXJ0IGltcGxlbWVudHMgSVNlbGVjdGlvbkxpc3RlbmVyIHsKKworCS8qKgorCSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBUaW1lIFNlcmllcyBWaWV3CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfVElNRV9TRVJJRVNfVklFVyA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnJlcG9ydHMudmlld3MuVGltZVNlcmllcyI7IC8vJE5PTi1OTFMtMSQKKwkKKwlwcml2YXRlIExpc3Q8SWRlbnRpZmlhYmxlPiBzZWxlY3RlZElkZW50aWZpYWJsZXMgPSBudWxsOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2V0IG9mIGRlY29yYXRvcnMgZXh0cmFjdGVkIGZyb20gdGhlIGN1cnJlbnQKKwkgKiBTY2VuYXJpby9TaW11bGF0aW9uIHVwZGF0ZSBsYWJlbHMgdGhhdCBjYW4gYmUgYWRhcHRlZCB0byBwcm9kdWNlIGEKKwkgKiBoaXN0b3J5IG9mIHJlbGF0aXZlIHZhbHVlcyB0aGF0IGNhbiBiZSBwbG90dGVkLgorCSAqLworCS8vIHByaXZhdGUgZmluYWwgTGlzdDxEZWNvcmF0b3I+IGRlY29yYXRvcnNXaXRoSGlzdG9yeU9mUmVsYXRpdmVWYWx1ZXMgPSBuZXcKKwkvLyBBcnJheUxpc3Q8RGVjb3JhdG9yPigpOworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGRlY29yYXRvciB0aGF0IGhhcyBiZWVuIHNlbGVjdGVkIGJ5IHRoZSBjb21ibyBib3guCisJICovCisJcHJvdGVjdGVkIERlY29yYXRvciBzZWxlY3RlZERlY29yYXRvcjsKKworCXByaXZhdGUgUmVwb3J0Vmlld2VyIHJlcG9ydFZpZXdlcjsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJcmVwb3J0Vmlld2VyID0gbmV3IFJlcG9ydFZpZXdlcihwYXJlbnQsIFRpbWVTZXJpZXNGYWN0b3J5LklOU1RBTkNFKTsKKwkJcmVwb3J0Vmlld2VyLnNldElucHV0KFNpbXVsYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKSk7CisKKwkJZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKHJlcG9ydFZpZXdlcik7CisKKwkJLy8gUmVnaXN0ZXIgd2l0aCB0aGUgU2VsZWN0aW9uU2VydmljZQorCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpCisJCQkJLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOworCisJfSAvLyBjcmVhdGVQYXJ0Q29udHJvbAorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIEFOWVRISU5HIGlzIHNlbGVjdGVkIGluIHRoZSBFY2xpcHNlCisJICogd29ya2JlbmNoLiBJdCdzIGpvYiBpcyB0byBmaWx0ZXIgb3V0IHNlbGVjdGlvbnMgb2YgSVNpbXVsYXRpb24gaW5zdGFuY2VzCisJICogYW5kIHVwZGF0ZSB0aGUgY2hhcnQgaW4gdGhlIFRpbWVTZXJpZXNDYW52YXMKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LAorCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoZmluYWwgSVdvcmtiZW5jaFBhcnQgcGFydCwKKwkJCWZpbmFsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisKKwkJLy8gSXMgdGhpcyBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCBjb21pbmcgZnJvbSBvdXIgdmlldz8KKwkJaWYgKHBhcnQgIT0gVGltZVNlcmllc1ZpZXcudGhpcykgeworCQkJLy8gTm8KKwkJCWlmIChzZWxlY3RlZElkZW50aWZpYWJsZXMgPT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCXNlbGVjdGVkSWRlbnRpZmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8SWRlbnRpZmlhYmxlPigpOworCQkJfSAvLyBpZgorCQkJc2VsZWN0ZWRJZGVudGlmaWFibGVzLmNsZWFyKCk7CisKKwkJCS8vIElzIGl0IGEgc3RydWN0dXJlZCBzZWxlY3Rpb24/CisJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCQkvLyBZZXMKKwkJCQlmaW5hbCBMaXN0IGxpc3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvTGlzdCgpOworCisJCQkJLy8gR28gdGhyb3VnaCBldmVyeXRoaW5nIGluIHRoZSBsaXN0IG9mIHRoaW5ncyB0aGF0IHdlcmUKKwkJCQkvLyBzZWxlY3RlZCBhbmQgcGljayBvdXQgdGhlIG9uZXMgdGhhdCBhcmUgSVNpbXVsYXRpb25zLgorCQkJCWZvciAoZmluYWwgSXRlcmF0b3Igc2VsZWN0aW9uSXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgc2VsZWN0aW9uSXRlcgorCQkJCQkJLmhhc05leHQoKTspIHsKKwkJCQkJZmluYWwgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbkl0ZXIubmV4dCgpOworCisJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJZGVudGlmaWFibGUpIHsKKwkJCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXBvcnQgaXMgaW5kZWVkIGVuYWJsZWQgaW4gdGhlIGNvbnRleHQgbWVudQkJCQkJCQorCQkJCQkJaWYgKFNlbGVjdGVkUmVwb3J0c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc1JlcG9ydEVuYWJsZWQoVGltZVNlcmllc0ZhY3RvcnkuVElNRV9TRVJJRVNfVFlQRSkpIHsKKwkJCQkJCQlyZXBvcnRWaWV3ZXIuYWRkTW9uaXRvcigoSWRlbnRpZmlhYmxlKW9iaik7CisJCQkJCQl9CisJCQkJCX0gLy8gaWYKKwkJCQl9IC8vIGZvciBlYWNoIHNlbGVjdGVkIGl0ZW0KKwkJCX0gLy8gaWYgc3RydWN0dXJlZCBzZWxlY3Rpb24KKworCQl9IC8vIGlmIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IGNvbWluZyBmcm9tIG91ciB2aWV3PworCX0gLy8gc2VsZWN0aW9uQ2hhbmdlZAorCisJCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpCisJCQkJLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOworCX0gLy8gZGlzcG9zZQorCisJLyoqCisJICogVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgaW50ZXJmYWNlLCBidXQgd2UncmUgbm90IHVzaW5nIGl0LgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJLy8gTm90aGluZworCX0gLy8gc2V0Rm9jdXMKKworfSAvLyBUaW1lU2VyaWVzVmlldwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5yZXBvcnRzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3JlcG9ydHMvdmlld3MvbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL3ZpZXdzL21lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJmNzJiNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9yZXBvcnRzL3ZpZXdzL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzNiBAQAorIyBtZXNzYWdlcy5wcm9wZXJ0aWVzCisjCisjIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjIENoYXJ0IENhbnZhcworQ0MudGl0bGU9UmVsYXRpdmUgVmFsdWUKKworIyBQaGFzZSBTcGFjZQorUEgudGl0bGU9UGhhc2UgU3BhY2UKKworIyBUaW1lIFNlcmllcyBhbmQgQWdncmVnYXRlIFRpbWUgU2VyaWVzCitUUy5USU1FTEFCRUw9dGltZQorCisjIEF4aXMgbGFiZWxzCitYQVhJU0RFRi50aXRsZT1YIEF4aXMKK1lBWElTREVGLnRpdGxlPVkgQXhpcworCisjIENvbnRleHQgbWVudSBlbnRyaWVzCitDb250ZXh0TWVudS5MaW5lYXJUaW1lU2NhbGU9TGluZWFyIFNjYWxlCitDb250ZXh0TWVudS5Mb2dUaW1lU2NhbGU9TG9nIFNjYWxlCitDb250ZXh0TWVudS5MaW5lYXJTY2FsaW5nPUxpbmVhciBTY2FsZQorQ29udGV4dE1lbnUuTG9nU2NhbGluZz1Mb2cgU2NhbGUKK0NvbnRleHRNZW51LlNob3dMZWdlbmQ9U2hvdyBMZWdlbmQKK0NvbnRleHRNZW51LkhpZGVMZWdlbmQ9SGlkZSBMZWdlbmQKKyMgbGFiZWxzCitSRVBPUlRWSUVXLlNFTEVDVFJFRkVOQ0VGT0xERVI9U2VsZWN0IFJlZmVyZW5jZSBGb2xkZXIKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWYwMjRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxjbGFzc3BhdGg+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCis8L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkNzg5NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxwcm9qZWN0RGVzY3JpcHRpb24+DQorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZDwvbmFtZT4NCisJPGNvbW1lbnQ+PC9jb21tZW50Pg0KKwk8cHJvamVjdHM+DQorCTwvcHJvamVjdHM+DQorCTxidWlsZFNwZWM+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJPC9idWlsZFNwZWM+DQorCTxuYXR1cmVzPg0KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCisJPC9uYXR1cmVzPg0KKzwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZjUzOTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsMjEgQEAKKyNUdWUgU2VwIDAxIDE2OjU1OjM1IEVEVCAyMDA5CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb249cmV0dXJuX3RhZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjEyZGMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMjEgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMA0KK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUNCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQ7c2luZ2xldG9uOj10cnVlDQorQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcg0KK0J1bmRsZS1DbGFzc1BhdGg6IC4NCitCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQuQWN0aXZhdG9yDQorQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQ0KK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbg0KK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQ0KK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQucHJlc2VudGF0aW9uDQorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCisgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7dmlzaWJpbGl0eTo9cmVleHBvcnQsDQorIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsDQorIG9yZy5lY2xpcHNlLnVpLmlkZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LA0KKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2Uuc3RlbS51aQ0KK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDBiMjBhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNCBAQAorDQorIyA8Y29weXJpZ2h0Pg0KKyMgPC9jb3B5cmlnaHQ+DQorIw0KKyMgJElkJA0KKw0KK2Jpbi5pbmNsdWRlcyA9IC4sXA0KKyAgICAgICAgICAgICAgIGljb25zLyxcDQorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcw0KK2phcnMuY29tcGlsZS5vcmRlciA9IC4NCitzb3VyY2UuLiA9IHNyYy8NCitvdXRwdXQuLiA9IGJpbi8NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvaWNvbnMvZnVsbC9vYmoxNi9GZE1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvaWNvbnMvZnVsbC9vYmoxNi9GZE1vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZhODhmOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC9pY29ucy9mdWxsL29iajE2L0ZkTW9kZWxGaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvaWNvbnMvZnVsbC93aXpiYW4vTmV3RmQuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL2ljb25zL2Z1bGwvd2l6YmFuL05ld0ZkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjYwMTA2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL2ljb25zL2Z1bGwvd2l6YmFuL05ld0ZkLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExMzM4NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDc2IEBACisNCisjLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisjICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyMgKg0KKyMgKiBDb250cmlidXRvcnM6DQorIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyMgVG8gY29kZSBkZXZlbG9wZXI6DQorIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KKyMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KKyMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCisjICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCisNCitwbHVnaW5OYW1lID0gU1RFTSBGaW5pdGUgRGlmZmVyZW5jZSBTb2x2ZXIgVUkNCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KKw0KK19VSV9GZEVkaXRvcl9tZW51ID0gJkZkIEVkaXRvcg0KKw0KK19VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0gPSAmTmV3IENoaWxkDQorX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtID0gTiZldyBTaWJsaW5nDQorDQorX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW0gPSBTaG93ICZQcm9wZXJ0aWVzIFZpZXcNCitfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0gPSAmUmVmcmVzaA0KKw0KK19VSV9TZWxlY3Rpb25QYWdlX2xhYmVsID0gU2VsZWN0aW9uDQorX1VJX1BhcmVudFBhZ2VfbGFiZWwgPSBQYXJlbnQNCitfVUlfTGlzdFBhZ2VfbGFiZWwgPSBMaXN0DQorX1VJX1RyZWVQYWdlX2xhYmVsID0gVHJlZQ0KK19VSV9UYWJsZVBhZ2VfbGFiZWwgPSBUYWJsZQ0KK19VSV9UcmVlV2l0aENvbHVtbnNQYWdlX2xhYmVsID0gVHJlZSB3aXRoIENvbHVtbnMNCitfVUlfT2JqZWN0Q29sdW1uX2xhYmVsID0gT2JqZWN0DQorX1VJX1NlbGZDb2x1bW5fbGFiZWwgPSBTZWxmDQorDQorX1VJX05vT2JqZWN0U2VsZWN0ZWQgPSBTZWxlY3RlZCBOb3RoaW5nDQorX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkID0gU2VsZWN0ZWQgT2JqZWN0OiB7MH0NCitfVUlfTXVsdGlPYmplY3RTZWxlY3RlZCA9IFNlbGVjdGVkIHswfSBPYmplY3RzDQorDQorX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbCA9IE9wZW4gRWRpdG9yDQorDQorX1VJX1dpemFyZF9jYXRlZ29yeSA9IEV4YW1wbGUgRU1GIE1vZGVsIENyZWF0aW9uIFdpemFyZHMNCisNCitfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlID0gUHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gZmlsZSAiezB9Ig0KKw0KK19VSV9GZE1vZGVsV2l6YXJkX2xhYmVsID0gRmQgTW9kZWwNCitfVUlfRmRNb2RlbFdpemFyZF9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBGZCBtb2RlbA0KKw0KK19VSV9GZEVkaXRvcl9sYWJlbCA9IEZkIE1vZGVsIEVkaXRvcg0KKw0KK19VSV9GZEVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2UgPSBNeQ0KK19VSV9GZEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9ucyA9IGZkDQorDQorX1VJX1dpemFyZF9sYWJlbCA9IE5ldw0KKw0KK19XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uID0gVGhlIGZpbGUgbmFtZSBtdXN0IGVuZCBpbiAnJy57MH0nJw0KK19XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9ucyA9IFRoZSBmaWxlIG5hbWUgbXVzdCBoYXZlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGV4dGVuc2lvbnM6IHswfQ0KKw0KK19VSV9Nb2RlbE9iamVjdCA9ICZNb2RlbCBPYmplY3QNCitfVUlfWE1MRW5jb2RpbmcgPSAmWE1MIEVuY29kaW5nDQorX1VJX1hNTEVuY29kaW5nQ2hvaWNlcyA9IFVURi04IEFTQ0lJIFVURi0xNiBVVEYtMTZCRSBVVEYtMTZMRSBJU08tODg1OS0xDQorX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbiA9IFNlbGVjdCBhIG1vZGVsIG9iamVjdCB0byBjcmVhdGUNCisNCitfVUlfRmlsZUNvbmZsaWN0X2xhYmVsID0gRmlsZSBDb25mbGljdA0KK19XQVJOX0ZpbGVDb25mbGljdCA9IFRoZXJlIGFyZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCBjb25mbGljdCB3aXRoIGNoYW5nZXMgbWFkZSBvdXRzaWRlIHRoZSBlZGl0b3IuICBEbyB5b3Ugd2lzaCB0byBkaXNjYXJkIHRoaXMgZWRpdG9yJ3MgY2hhbmdlcz8NCisNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NWRiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvcGx1Z2luLnhtbApAQCAtMCwwICsxLDQ0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4NCisNCis8IS0tDQorIDxjb3B5cmlnaHQ+DQorIDwvY29weXJpZ2h0Pg0KKw0KKyAkSWQkDQorLS0+DQorDQorPHBsdWdpbj4NCisNCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4NCisgICAgICA8Y2F0ZWdvcnkNCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLldpemFyZC5jYXRlZ29yeS5JRCINCisgICAgICAgICAgICBuYW1lPSIlX1VJX1dpemFyZF9jYXRlZ29yeSIvPg0KKyAgICAgIDx3aXphcmQNCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLnByZXNlbnRhdGlvbi5GZE1vZGVsV2l6YXJkSUQiDQorICAgICAgICAgICAgbmFtZT0iJV9VSV9GZE1vZGVsV2l6YXJkX2xhYmVsIg0KKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQucHJlc2VudGF0aW9uLkZkTW9kZWxXaXphcmQiDQorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5XaXphcmQuY2F0ZWdvcnkuSUQiDQorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9GZE1vZGVsRmlsZS5naWYiPg0KKyAgICAgICAgIDxkZXNjcmlwdGlvbj4lX1VJX0ZkTW9kZWxXaXphcmRfZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPg0KKyAgICAgICAgIDxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIvPg0KKyAgICAgIDwvd2l6YXJkPg0KKyAgIDwvZXh0ZW5zaW9uPg0KKw0KKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPg0KKyAgICAgIDxlZGl0b3INCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLnByZXNlbnRhdGlvbi5GZEVkaXRvcklEIg0KKyAgICAgICAgICAgIG5hbWU9IiVfVUlfRmRFZGl0b3JfbGFiZWwiDQorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9GZE1vZGVsRmlsZS5naWYiDQorICAgICAgICAgICAgZXh0ZW5zaW9ucz0iZmQiDQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5wcmVzZW50YXRpb24uRmRFZGl0b3IiDQorICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLnByZXNlbnRhdGlvbi5GZEFjdGlvbkJhckNvbnRyaWJ1dG9yIj4NCisgICAgICA8L2VkaXRvcj4NCisgICA8L2V4dGVuc2lvbj4NCisgPGV4dGVuc2lvbg0KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnN0YXJ0dXAiPg0KKyAgICAgPHN0YXJ0dXANCisgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQucHJlc2VudGF0aW9uLkZkU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeSI+DQorICAgICA8L3N0YXJ0dXA+DQorICA8L2V4dGVuc2lvbj4NCis8L3BsdWdpbj4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9wcmVzZW50YXRpb24vRmRBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvcHJlc2VudGF0aW9uL0ZkQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzVlYTNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvcHJlc2VudGF0aW9uL0ZkQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpAQCAtMCwwICsxLDQzMiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQucHJlc2VudGF0aW9uOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db250cm9sQWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJDb250cmlidXRpb25JdGVtOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGFjdGlvbiBiYXIgY29udHJpYnV0b3IgZm9yIHRoZSBGZCBtb2RlbCBlZGl0b3IuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEZkQWN0aW9uQmFyQ29udHJpYnV0b3INCisJZXh0ZW5kcyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3INCisJaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBlZGl0b3IuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yUGFydDsNCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHByb3ZpZGVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgYWN0aW9uIG9wZW5zIHRoZSBQcm9wZXJ0aWVzIHZpZXcuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUFjdGlvbiBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24gPQ0KKwkJbmV3IEFjdGlvbihGZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtIikpIHsNCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCXRyeSB7DQorCQkJCQlnZXRQYWdlKCkuc2hvd1ZpZXcoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiKTsNCisJCQkJfQ0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJCQlGZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCQkJfQ0KKwkJCX0NCisJCX07DQorDQorCS8qKg0KKwkgKiBUaGlzIGFjdGlvbiByZWZyZXNoZXMgdGhlIHZpZXdlciBvZiB0aGUgY3VycmVudCBlZGl0b3IgaWYgdGhlIGVkaXRvcg0KKwkgKiBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXJ9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElBY3Rpb24gcmVmcmVzaFZpZXdlckFjdGlvbiA9DQorCQluZXcgQWN0aW9uKEZkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtIikpIHsNCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7DQorCQkJCXJldHVybiBhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyOw0KKwkJCX0NCisNCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCWlmIChhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7DQorCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpYWN0aXZlRWRpdG9yUGFydCkuZ2V0Vmlld2VyKCk7DQorCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsNCisJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfTsNCisNCisJLyoqDQorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcg0KKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZUNoaWxkQWN0aW9uczsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCBmb3IgQ3JlYXRlQ2hpbGQgYWN0aW9ucy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yDQorCSAqIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlU2libGluZ0FjdGlvbnM7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZVNpYmxpbmcgYWN0aW9ucy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBjb250cmlidXRvci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBGZEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgew0KKwkJc3VwZXIoQURESVRJT05TX0xBU1RfU1RZTEUpOw0KKwkJbG9hZFJlc291cmNlQWN0aW9uID0gbmV3IExvYWRSZXNvdXJjZUFjdGlvbigpOw0KKwkJdmFsaWRhdGVBY3Rpb24gPSBuZXcgVmFsaWRhdGVBY3Rpb24oKTsNCisJCWNvbnRyb2xBY3Rpb24gPSBuZXcgQ29udHJvbEFjdGlvbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgU2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucyB0byB0aGUgdG9vbCBiYXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsNCisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJmZC1zZXR0aW5ncyIpKTsNCisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJmZC1hZGRpdGlvbnMiKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB0byB0aGUgbWVudSBiYXIgYSBtZW51IGFuZCBzb21lIHNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMsDQorCSAqIGFzIHdlbGwgYXMgdGhlIHN1Yi1tZW51cyBmb3Igb2JqZWN0IGNyZWF0aW9uIGl0ZW1zLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7DQorCQlzdXBlci5jb250cmlidXRlVG9NZW51KG1lbnVNYW5hZ2VyKTsNCisNCisJCUlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihGZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9GZEVkaXRvcl9tZW51IiksICJvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmRNZW51SUQiKTsNCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7DQorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigic2V0dGluZ3MiKSk7DQorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWN0aW9ucyIpKTsNCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7DQorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsNCisNCisJCS8vIFByZXBhcmUgZm9yIENyZWF0ZUNoaWxkIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4NCisJCS8vDQorCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKEZkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsNCisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcik7DQorDQorCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVTaWJsaW5nIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4NCisJCS8vDQorCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoRmRFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7DQorCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcik7DQorDQorCQkvLyBGb3JjZSBhbiB1cGRhdGUgYmVjYXVzZSBFY2xpcHNlIGhpZGVzIGVtcHR5IG1lbnVzIG5vdy4NCisJCS8vDQorCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXINCisJCQkobmV3IElNZW51TGlzdGVuZXIoKSB7DQorCQkJCSBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7DQorCQkJCQkgbWVudU1hbmFnZXIudXBkYXRlQWxsKHRydWUpOw0KKwkJCQkgfQ0KKwkJCSB9KTsNCisNCisJCWFkZEdsb2JhbEFjdGlvbnMoc3VibWVudU1hbmFnZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBXaGVuIHRoZSBhY3RpdmUgZWRpdG9yIGNoYW5nZXMsIHRoaXMgcmVtZW1iZXJzIHRoZSBjaGFuZ2UgYW5kIHJlZ2lzdGVycyB3aXRoIGl0IGFzIGEgc2VsZWN0aW9uIHByb3ZpZGVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBwYXJ0KSB7DQorCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IocGFydCk7DQorCQlhY3RpdmVFZGl0b3JQYXJ0ID0gcGFydDsNCisNCisJCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4NCisJCS8vDQorCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgew0KKwkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsNCisJCX0NCisJCWlmIChwYXJ0ID09IG51bGwpIHsNCisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7DQorCQl9DQorCQllbHNlIHsNCisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7DQorCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOw0KKw0KKwkJCS8vIEZha2UgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCB0byB1cGRhdGUgdGhlIG1lbnVzLg0KKwkJCS8vDQorCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpICE9IG51bGwpIHsNCisJCQkJc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNlbGVjdGlvblByb3ZpZGVyLCBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LA0KKwkgKiBoYW5kbGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnR9cyBieSBxdWVyeWluZyBmb3IgdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncw0KKwkgKiB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZCB1cGRhdGluZyB0aGUgbWVudXMgYWNjb3JkaW5nbHkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgew0KKwkJLy8gUmVtb3ZlIGFueSBtZW51IGl0ZW1zIGZvciBvbGQgc2VsZWN0aW9uLg0KKwkJLy8NCisJCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsNCisJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7DQorCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucyk7DQorCQl9DQorDQorCQkvLyBRdWVyeSB0aGUgbmV3IHNlbGVjdGlvbiBmb3IgYXBwcm9wcmlhdGUgbmV3IGNoaWxkL3NpYmxpbmcgZGVzY3JpcHRvcnMNCisJCS8vDQorCQlDb2xsZWN0aW9uPD8+IG5ld0NoaWxkRGVzY3JpcHRvcnMgPSBudWxsOw0KKwkJQ29sbGVjdGlvbjw/PiBuZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBudWxsOw0KKw0KKwkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsNCisJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsNCisJCQlPYmplY3Qgb2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOw0KKw0KKwkJCUVkaXRpbmdEb21haW4gZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsNCisNCisJCQluZXdDaGlsZERlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMob2JqZWN0LCBudWxsKTsNCisJCQluZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhudWxsLCBvYmplY3QpOw0KKwkJfQ0KKw0KKwkJLy8gR2VuZXJhdGUgYWN0aW9ucyBmb3Igc2VsZWN0aW9uOyBwb3B1bGF0ZSBhbmQgcmVkcmF3IHRoZSBtZW51cy4NCisJCS8vDQorCQljcmVhdGVDaGlsZEFjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhuZXdDaGlsZERlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOw0KKwkJY3JlYXRlU2libGluZ0FjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKG5ld1NpYmxpbmdEZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsNCisNCisJCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsNCisJCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsNCisJCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsNCisJCX0NCisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgew0KKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsNCisJCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sDQorCSAqIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJQ29sbGVjdGlvbjxJQWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOw0KKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsNCisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsNCisJCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZUNoaWxkQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwgZGVzY3JpcHRvcikpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBhY3Rpb25zOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwNCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoQ29sbGVjdGlvbjw/PiBkZXNjcmlwdG9ycywgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsNCisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7DQorCQkJZm9yIChPYmplY3QgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7DQorCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVTaWJsaW5nQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwgZGVzY3JpcHRvcikpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBhY3Rpb25zOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IHdpdGgge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMNCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbiwNCisJICogYnkgaW5zZXJ0aW5nIHRoZW0gYmVmb3JlIHRoZSBzcGVjaWZpZWQgY29udHJpYnV0aW9uIGl0ZW0gPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+Lg0KKwkgKiBJZiA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZXkgYXJlIHNpbXBseSBhZGRlZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zLCBTdHJpbmcgY29udHJpYnV0aW9uSUQpIHsNCisJCWlmIChhY3Rpb25zICE9IG51bGwpIHsNCisJCQlmb3IgKElBY3Rpb24gYWN0aW9uIDogYWN0aW9ucykgew0KKwkJCQlpZiAoY29udHJpYnV0aW9uSUQgIT0gbnVsbCkgew0KKwkJCQkJbWFuYWdlci5pbnNlcnRCZWZvcmUoY29udHJpYnV0aW9uSUQsIGFjdGlvbik7DQorCQkJCX0NCisJCQkJZWxzZSB7DQorCQkJCQltYW5hZ2VyLmFkZChhY3Rpb24pOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9DQorCQkNCisJLyoqDQorCSAqIFRoaXMgcmVtb3ZlcyBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gYWxsIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zDQorCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkZXBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zKSB7DQorCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7DQorCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0SXRlbXMoKTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7DQorCQkJCS8vIExvb2sgaW50byBTdWJDb250cmlidXRpb25JdGVtcw0KKwkJCQkvLw0KKwkJCQlJQ29udHJpYnV0aW9uSXRlbSBjb250cmlidXRpb25JdGVtID0gaXRlbXNbaV07DQorCQkJCXdoaWxlIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uSXRlbSkgew0KKwkJCQkJY29udHJpYnV0aW9uSXRlbSA9ICgoU3ViQ29udHJpYnV0aW9uSXRlbSljb250cmlidXRpb25JdGVtKS5nZXRJbm5lckl0ZW0oKTsNCisJCQkJfQ0KKw0KKwkJCQkvLyBEZWxldGUgdGhlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1zIHdpdGggbWF0Y2hpbmcgYWN0aW9uLg0KKwkJCQkvLw0KKwkJCQlpZiAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsNCisJCQkJCUlBY3Rpb24gYWN0aW9uID0gKChBY3Rpb25Db250cmlidXRpb25JdGVtKWNvbnRyaWJ1dGlvbkl0ZW0pLmdldEFjdGlvbigpOw0KKwkJCQkJaWYgKGFjdGlvbnMuY29udGFpbnMoYWN0aW9uKSkgew0KKwkJCQkJCW1hbmFnZXIucmVtb3ZlKGNvbnRyaWJ1dGlvbkl0ZW0pOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgcG9wLXVwIG1lbnUgYmVmb3JlIGl0IGFwcGVhcnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgew0KKwkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsNCisJCU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbnVsbDsNCisNCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKEZkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsNCisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsNCisJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZWRpdCIsIHN1Ym1lbnVNYW5hZ2VyKTsNCisNCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKEZkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOw0KKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7DQorCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW5zZXJ0cyBnbG9iYWwgYWN0aW9ucyBiZWZvcmUgdGhlICJhZGRpdGlvbnMtZW5kIiBzZXBhcmF0b3IuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsNCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMtZW5kIiwgbmV3IFNlcGFyYXRvcigidWktYWN0aW9ucyIpKTsNCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uKTsNCisNCisJCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsJCQ0KKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCByZWZyZXNoVmlld2VyQWN0aW9uKTsNCisNCisJCXN1cGVyLmFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGVuc3VyZXMgdGhhdCBhIGRlbGV0ZSBhY3Rpb24gd2lsbCBjbGVhbiB1cCBhbGwgcmVmZXJlbmNlcyB0byBkZWxldGVkIG9iamVjdHMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlQWxsUmVmZXJlbmNlc09uRGVsZXRlKCkgew0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvcHJlc2VudGF0aW9uL0ZkRWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9wcmVzZW50YXRpb24vRmRFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDU1NWNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvcHJlc2VudGF0aW9uL0ZkRWRpdG9yLmphdmEKQEAgLTAsMCArMSwxODUxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5wcmVzZW50YXRpb247DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorDQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNhdmVBc0RpYWxvZzsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVQYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuTWFya2VySGVscGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlZpZXdlclBhbmU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuZWRpdG9yLlByb2JsZW1FZGl0b3JQYXJ0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuY2VsbGVkaXRvci5BZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5Mb2NhbFRyYW5zZmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuVmlld2VyRHJhZ0FkYXB0ZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLlVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlNYXJrZXJIZWxwZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJVXRpbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudmlldy5FeHRlbmRlZFByb3BlcnR5U2hlZXRQYWdlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQucHJvdmlkZXIuRmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlci5HcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByb3ZpZGVyLk1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5wcm92aWRlci5TY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLnByb3ZpZGVyLlNlcXVlbmNlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLnByb3ZpZGVyLlNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsNCisNCisNCisvKioNCisgKiBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBGZCBtb2RlbCBlZGl0b3IuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIA0KK3B1YmxpYyBjbGFzcyBGZEVkaXRvcg0KKwlleHRlbmRzIE11bHRpUGFnZUVkaXRvclBhcnQNCisJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpblByb3ZpZGVyLCBJU2VsZWN0aW9uUHJvdmlkZXIsIElNZW51TGlzdGVuZXIsIElWaWV3ZXJQcm92aWRlciwgSUdvdG9NYXJrZXIgew0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgZWRpdGluZyBkb21haW4gdGhhdCBpcyB1c2VkIHRvIHRyYWNrIGFsbCBjaGFuZ2VzIHRvIHRoZSBtb2RlbC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIG9uZSBhZGFwdGVyIGZhY3RvcnkgdXNlZCBmb3IgcHJvdmlkaW5nIHZpZXdzIG9mIHRoZSBtb2RlbC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5Ow0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUNvbnRlbnRPdXRsaW5lUGFnZSBjb250ZW50T3V0bGluZVBhZ2U7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIGEga2x1ZGdlLi4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVN0YXR1c0xpbmVNYW5hZ2VyIGNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZSdzIHZpZXdlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBUcmVlVmlld2VyIGNvbnRlbnRPdXRsaW5lVmlld2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgcHJvcGVydHkgc2hlZXQgcGFnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBQcm9wZXJ0eVNoZWV0UGFnZSBwcm9wZXJ0eVNoZWV0UGFnZTsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIHZpZXdlciB0aGF0IHNoYWRvd3MgdGhlIHNlbGVjdGlvbiBpbiB0aGUgY29udGVudCBvdXRsaW5lLg0KKwkgKiBUaGUgcGFyZW50IHJlbGF0aW9uIG11c3QgYmUgY29ycmVjdGx5IGRlZmluZWQgZm9yIHRoaXMgdG8gd29yay4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBUcmVlVmlld2VyIHNlbGVjdGlvblZpZXdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgaW52ZXJ0cyB0aGUgcm9sbCBvZiBwYXJlbnQgYW5kIGNoaWxkIGluIHRoZSBjb250ZW50IHByb3ZpZGVyIGFuZCBzaG93IHBhcmVudHMgYXMgYSB0cmVlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgcGFyZW50Vmlld2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBzaG93cyBob3cgYSB0cmVlIHZpZXcgd29ya3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBzaG93cyBob3cgYSBsaXN0IHZpZXcgd29ya3MuDQorCSAqIEEgbGlzdCB2aWV3ZXIgZG9lc24ndCBzdXBwb3J0IGljb25zLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExpc3RWaWV3ZXIgbGlzdFZpZXdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgc2hvd3MgaG93IGEgdGFibGUgdmlldyB3b3Jrcy4NCisJICogQSB0YWJsZSBjYW4gYmUgdXNlZCBhcyBhIGxpc3Qgd2l0aCBpY29ucy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgc2hvd3MgaG93IGEgdHJlZSB2aWV3IHdpdGggY29sdW1ucyB3b3Jrcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBUcmVlVmlld2VyIHRyZWVWaWV3ZXJXaXRoQ29sdW1uczsNCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSB2aWV3ZXIgcGFuZSwgaW4gdGhlIGJvb2suDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVmlld2VyUGFuZSBjdXJyZW50Vmlld2VyUGFuZTsNCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBjb250ZW50IHZpZXdlciwgd2hpY2ggbWF5IGJlIGVpdGhlciBvbmUgb2YgdGhlIHZpZXdlcnMgaW4gdGhlIHBhZ2VzIG9yIHRoZSBjb250ZW50IG91dGxpbmUgdmlld2VyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFZpZXdlciBjdXJyZW50Vmlld2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBsaXN0ZW5zIHRvIHdoaWNoIGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsNCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfXMgdGhhdCBhcmUgbGlzdGVuaW5nIHRvIHRoaXMgZWRpdG9yLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsNCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZWRpdG9yIGFzIGEgd2hvbGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBlZGl0b3JTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOw0KKw0KKwkvKioNCisJICogVGhlIE1hcmtlckhlbHBlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgd29ya3NwYWNlIHJlc291cmNlIG1hcmtlcnMgcHJlc2VudGVkDQorCSAqIGluIEVjbGlwc2UncyBQcm9ibGVtcyBWaWV3Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE1hcmtlckhlbHBlciBtYXJrZXJIZWxwZXIgPSBuZXcgRWRpdFVJTWFya2VySGVscGVyKCk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdoZW4gdGhlIG91dGxpbmUgYmVjb21lcyBhY3RpdmUNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9DQorCQluZXcgSVBhcnRMaXN0ZW5lcigpIHsNCisJCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsNCisJCQkJaWYgKHAgaW5zdGFuY2VvZiBDb250ZW50T3V0bGluZSkgew0KKwkJCQkJaWYgKCgoQ29udGVudE91dGxpbmUpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBjb250ZW50T3V0bGluZVBhZ2UpIHsNCisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihGZEVkaXRvci50aGlzKTsNCisNCisJCQkJCQlzZXRDdXJyZW50Vmlld2VyKGNvbnRlbnRPdXRsaW5lVmlld2VyKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQllbHNlIGlmIChwIGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgew0KKwkJCQkJaWYgKCgoUHJvcGVydHlTaGVldClwKS5nZXRDdXJyZW50UGFnZSgpID09IHByb3BlcnR5U2hlZXRQYWdlKSB7DQorCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoRmRFZGl0b3IudGhpcyk7DQorCQkJCQkJaGFuZGxlQWN0aXZhdGUoKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQllbHNlIGlmIChwID09IEZkRWRpdG9yLnRoaXMpIHsNCisJCQkJCWhhbmRsZUFjdGl2YXRlKCk7DQorCQkJCX0NCisJCQl9DQorCQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwKSB7DQorCQkJCS8vIElnbm9yZS4NCisJCQl9DQorCQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwKSB7DQorCQkJCS8vIElnbm9yZS4NCisJCQl9DQorCQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsNCisJCQkJLy8gSWdub3JlLg0KKwkJCX0NCisJCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHApIHsNCisJCQkJLy8gSWdub3JlLg0KKwkJCX0NCisJCX07DQorDQorCS8qKg0KKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7DQorDQorCS8qKg0KKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7DQorDQorCS8qKg0KKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gc2F2ZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gc2F2ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOw0KKw0KKwkvKioNCisJICogTWFwIHRvIHN0b3JlIHRoZSBkaWFnbm9zdGljIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4gcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4oKTsNCisNCisJLyoqDQorCSAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiBzaG91bGQgYmUgdXBkYXRlZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsNCisNCisJLyoqDQorCSAqIEFkYXB0ZXIgdXNlZCB0byB1cGRhdGUgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiB3aGVuIHJlc291cmNlcyBhcmUgZGVtYW5kZWQgbG9hZGVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVDb250ZW50QWRhcHRlciBwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIgPSANCisJCW5ldyBFQ29udGVudEFkYXB0ZXIoKSB7DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7DQorCQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVzb3VyY2UuY2xhc3MpKSB7DQorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEOg0KKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0VSUk9SUzoNCisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19XQVJOSU5HUzogew0KKwkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsNCisJCQkJCQkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIG51bGwpOw0KKwkJCQkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsNCisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgZGlhZ25vc3RpYyk7DQorCQkJCQkJCX0NCisJCQkJCQkJZWxzZSB7DQorCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5yZW1vdmUocmVzb3VyY2UpOw0KKwkJCQkJCQl9DQorDQorCQkJCQkJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgew0KKwkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYw0KKwkJCQkJCQkJCShuZXcgUnVubmFibGUoKSB7DQorCQkJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsNCisJCQkJCQkJCQkJIH0NCisJCQkJCQkJCQkgfSk7DQorCQkJCQkJCX0NCisJCQkJCQkJYnJlYWs7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWVsc2Ugew0KKwkJCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJCUBPdmVycmlkZQ0KKwkJCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsNCisJCQkJYmFzaWNTZXRUYXJnZXQodGFyZ2V0KTsNCisJCQl9DQorDQorCQkJQE92ZXJyaWRlDQorCQkJcHJvdGVjdGVkIHZvaWQgdW5zZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7DQorCQkJCWJhc2ljVW5zZXRUYXJnZXQodGFyZ2V0KTsNCisJCQl9DQorCQl9Ow0KKw0KKwkvKioNCisJICogVGhpcyBsaXN0ZW5zIGZvciB3b3Jrc3BhY2UgY2hhbmdlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0NCisJCW5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsNCisJCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsNCisJCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOw0KKwkJCQl0cnkgew0KKwkJCQkJY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3Igew0KKwkJCQkJCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsNCisJCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7DQorCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOw0KKw0KKwkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7DQorCQkJCQkJCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgew0KKwkJCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIHx8DQorCQkJCQkJCQkgICAgZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgZGVsdGEuZ2V0RmxhZ3MoKSAhPSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSB7DQorCQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShVUkkuY3JlYXRlVVJJKGRlbHRhLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSksIGZhbHNlKTsNCisJCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgew0KKwkJCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsNCisJCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsNCisJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQllbHNlIGlmICghc2F2ZWRSZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlKSkgew0KKwkJCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOw0KKwkJCQkJCQkJCQl9DQorCQkJCQkJCQkJfQ0KKwkJCQkJCQkJfQ0KKwkJCQkJCQl9DQorDQorCQkJCQkJCXJldHVybiB0cnVlOw0KKwkJCQkJCX0NCisNCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsNCisJCQkJCQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7DQorCQkJCQkJfQ0KKw0KKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRSZW1vdmVkUmVzb3VyY2VzKCkgew0KKwkJCQkJCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlczsNCisJCQkJCQl9DQorCQkJCQl9DQorDQorCQkJCQlSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpdG9yKCk7DQorCQkJCQlkZWx0YS5hY2NlcHQodmlzaXRvcik7DQorDQorCQkJCQlpZiAoIXZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgew0KKwkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsNCisJCQkJCQlpZiAoIWlzRGlydHkoKSkgew0KKwkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjDQorCQkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKEZkRWRpdG9yLnRoaXMsIGZhbHNlKTsNCisJCQkJCQkJCQkgfQ0KKwkJCQkJCQkJIH0pOw0KKwkJCQkJCX0NCisJCQkJCX0NCisNCisJCQkJCWlmICghdmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7DQorCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOw0KKwkJCQkJCWlmIChnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpID09IEZkRWRpdG9yLnRoaXMpIHsNCisJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYw0KKwkJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsNCisJCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkgaGFuZGxlQWN0aXZhdGUoKTsNCisJCQkJCQkJCQkgfQ0KKwkJCQkJCQkJIH0pOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCUZkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJCQl9DQorCQkJfQ0KKwkJfTsNCisNCisJLyoqDQorCSAqIEhhbmRsZXMgYWN0aXZhdGlvbiBvZiB0aGUgZWRpdG9yIG9yIGl0J3MgYXNzb2NpYXRlZCB2aWV3cy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFjdGl2YXRlKCkgew0KKwkJLy8gUmVjb21wdXRlIHRoZSByZWFkIG9ubHkgc3RhdGUuDQorCQkvLw0KKwkJaWYgKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkgIT0gbnVsbCkgew0KKwkJICBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpLmNsZWFyKCk7DQorDQorCQkgIC8vIFJlZnJlc2ggYW55IGFjdGlvbnMgdGhhdCBtYXkgYmVjb21lIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQorCQkgIC8vDQorCQkgIHNldFNlbGVjdGlvbihnZXRTZWxlY3Rpb24oKSk7DQorCQl9DQorDQorCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7DQorCQkJaWYgKGhhbmRsZURpcnR5Q29uZmxpY3QoKSkgew0KKwkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKEZkRWRpdG9yLnRoaXMsIGZhbHNlKTsNCisJCQl9DQorCQkJZWxzZSB7DQorCQkJCXJlbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsNCisJCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOw0KKwkJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOw0KKwkJCX0NCisJCX0NCisJCWVsc2UgaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgew0KKwkJCWNoYW5nZWRSZXNvdXJjZXMucmVtb3ZlQWxsKHNhdmVkUmVzb3VyY2VzKTsNCisJCQloYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCk7DQorCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOw0KKwkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEhhbmRsZXMgd2hhdCB0byBkbyB3aXRoIGNoYW5nZWQgcmVzb3VyY2VzIG9uIGFjdGl2YXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCkgew0KKwkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSAmJiAoIWlzRGlydHkoKSB8fCBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpKSB7DQorCQkJaWYgKGlzRGlydHkoKSkgew0KKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpOw0KKwkJCX0NCisJCQllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7DQorDQorCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsNCisJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgew0KKwkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgew0KKwkJCQkJcmVzb3VyY2UudW5sb2FkKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsNCisJCQkJCX0NCisJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCQlpZiAoIXJlc291cmNlVG9EaWFnbm9zdGljTWFwLmNvbnRhaW5zS2V5KHJlc291cmNlKSkgew0KKwkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorDQorCQkJaWYgKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbi5pc1N0YWxlKGVkaXRvclNlbGVjdGlvbikpIHsNCisJCQkJc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOw0KKwkJCX0NCisNCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7DQorCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsNCisJCX0NCisJfQ0KKyAgDQorCS8qKg0KKwkgKiBVcGRhdGVzIHRoZSBwcm9ibGVtcyBpbmRpY2F0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWVkIGRpYWdub3N0aWMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpIHsNCisJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgew0KKwkJCUJhc2ljRGlhZ25vc3RpYyBkaWFnbm9zdGljID0NCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYw0KKwkJCQkJKERpYWdub3N0aWMuT0ssDQorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5lZGl0b3IiLA0KKwkJCQkJIDAsDQorCQkJCQkgbnVsbCwNCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpIH0pOw0KKwkJCWZvciAoRGlhZ25vc3RpYyBjaGlsZERpYWdub3N0aWMgOiByZXNvdXJjZVRvRGlhZ25vc3RpY01hcC52YWx1ZXMoKSkgew0KKwkJCQlpZiAoY2hpbGREaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgew0KKwkJCQkJZGlhZ25vc3RpYy5hZGQoY2hpbGREaWFnbm9zdGljKTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQlpbnQgbGFzdEVkaXRvclBhZ2UgPSBnZXRQYWdlQ291bnQoKSAtIDE7DQorCQkJaWYgKGxhc3RFZGl0b3JQYWdlID49IDAgJiYgZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSBpbnN0YW5jZW9mIFByb2JsZW1FZGl0b3JQYXJ0KSB7DQorCQkJCSgoUHJvYmxlbUVkaXRvclBhcnQpZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSkuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsNCisJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7DQorCQkJCQlzZXRBY3RpdmVQYWdlKGxhc3RFZGl0b3JQYWdlKTsNCisJCQkJfQ0KKwkJCX0NCisJCQllbHNlIGlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgew0KKwkJCQlQcm9ibGVtRWRpdG9yUGFydCBwcm9ibGVtRWRpdG9yUGFydCA9IG5ldyBQcm9ibGVtRWRpdG9yUGFydCgpOw0KKwkJCQlwcm9ibGVtRWRpdG9yUGFydC5zZXREaWFnbm9zdGljKGRpYWdub3N0aWMpOw0KKwkJCQlwcm9ibGVtRWRpdG9yUGFydC5zZXRNYXJrZXJIZWxwZXIobWFya2VySGVscGVyKTsNCisJCQkJdHJ5IHsNCisJCQkJCWFkZFBhZ2UoKytsYXN0RWRpdG9yUGFnZSwgcHJvYmxlbUVkaXRvclBhcnQsIGdldEVkaXRvcklucHV0KCkpOw0KKwkJCQkJc2V0UGFnZVRleHQobGFzdEVkaXRvclBhZ2UsIHByb2JsZW1FZGl0b3JQYXJ0LmdldFBhcnROYW1lKCkpOw0KKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7DQorCQkJCQlzaG93VGFicygpOw0KKwkJCQl9DQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCUZkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJCWlmIChtYXJrZXJIZWxwZXIuaGFzTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpKSB7DQorCQkJCW1hcmtlckhlbHBlci5kZWxldGVNYXJrZXJzKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7DQorCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgew0KKwkJCQkJdHJ5IHsNCisJCQkJCQltYXJrZXJIZWxwZXIuY3JlYXRlTWFya2VycyhkaWFnbm9zdGljKTsNCisJCQkJCX0NCisJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQkJCUZkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBTaG93cyBhIGRpYWxvZyB0aGF0IGFza3MgaWYgY29uZmxpY3RpbmcgY2hhbmdlcyBzaG91bGQgYmUgZGlzY2FyZGVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsNCisJCXJldHVybg0KKwkJCU1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uDQorCQkJCShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX0ZpbGVDb25mbGljdF9sYWJlbCIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfV0FSTl9GaWxlQ29uZmxpY3QiKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhIG1vZGVsIGVkaXRvci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBGZEVkaXRvcigpIHsNCisJCXN1cGVyKCk7DQorCQlpbml0aWFsaXplRWRpdGluZ0RvbWFpbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHNldHMgdXAgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgbW9kZWwgZWRpdG9yLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKSB7DQorCQkvLyBDcmVhdGUgYW4gYWRhcHRlciBmYWN0b3J5IHRoYXQgeWllbGRzIGl0ZW0gcHJvdmlkZXJzLg0KKwkJLy8NCisJCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5EZXNjcmlwdG9yLlJlZ2lzdHJ5LklOU1RBTkNFKTsNCisNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEZkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTb2x2ZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBFY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisNCisJCS8vIENyZWF0ZSB0aGUgY29tbWFuZCBzdGFjayB0aGF0IHdpbGwgbm90aWZ5IHRoaXMgZWRpdG9yIGFzIGNvbW1hbmRzIGFyZSBleGVjdXRlZC4NCisJCS8vDQorCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsNCisNCisJCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuDQorCQkvLw0KKwkJY29tbWFuZFN0YWNrLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyDQorCQkJKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsNCisJCQkJIHB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsNCisJCQkJCSBnZXRDb250YWluZXIoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjDQorCQkJCQkJIChuZXcgUnVubmFibGUoKSB7DQorCQkJCQkJCSAgcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJICBmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7DQorDQorCQkJCQkJCQkgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuDQorCQkJCQkJCQkgIC8vDQorCQkJCQkJCQkgIENvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaylldmVudC5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsNCisJCQkJCQkJCSAgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsNCisJCQkJCQkJCQkgIHNldFNlbGVjdGlvblRvVmlld2VyKG1vc3RSZWNlbnRDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpKTsNCisJCQkJCQkJCSAgfQ0KKwkJCQkJCQkJICBpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCAmJiAhcHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgew0KKwkJCQkJCQkJCSAgcHJvcGVydHlTaGVldFBhZ2UucmVmcmVzaCgpOw0KKwkJCQkJCQkJICB9DQorCQkJCQkJCSAgfQ0KKwkJCQkJCSAgfSk7DQorCQkJCSB9DQorCQkJIH0pOw0KKw0KKwkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLg0KKwkJLy8NCisJCWVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKGFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2ssIG5ldyBIYXNoTWFwPFJlc291cmNlLCBCb29sZWFuPigpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyBoZXJlIGZvciB0aGUgbGlzdGVuZXIgdG8gYmUgYWJsZSB0byBjYWxsIGl0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJCQlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGludCBhY3Rpb24pIHsNCisJCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShhY3Rpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHNldHMgdGhlIHNlbGVjdGlvbiBpbnRvIHdoaWNoZXZlciB2aWV3ZXIgaXMgYWN0aXZlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7DQorCQlmaW5hbCBDb2xsZWN0aW9uPD8+IHRoZVNlbGVjdGlvbiA9IGNvbGxlY3Rpb247DQorCQkvLyBNYWtlIHN1cmUgaXQncyBva2F5Lg0KKwkJLy8NCisJCWlmICh0aGVTZWxlY3Rpb24gIT0gbnVsbCAmJiAhdGhlU2VsZWN0aW9uLmlzRW1wdHkoKSkgew0KKwkJCS8vIEkgZG9uJ3Qga25vdyBpZiB0aGlzIHNob3VsZCBiZSBydW4gdGhpcyBkZWZlcnJlZA0KKwkJCS8vIGJlY2F1c2Ugd2UgbWlnaHQgaGF2ZSB0byBnaXZlIHRoZSBlZGl0b3IgYSBjaGFuY2UgdG8gcHJvY2VzcyB0aGUgdmlld2VyIHVwZGF0ZSBldmVudHMNCisJCQkvLyBhbmQgaGVuY2UgdG8gdXBkYXRlIHRoZSB2aWV3cyBmaXJzdC4NCisJCQkvLw0KKwkJCS8vDQorCQkJUnVubmFibGUgcnVubmFibGUgPQ0KKwkJCQluZXcgUnVubmFibGUoKSB7DQorCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgY29udGVudCB2aWV3ZXIgb2YgdGhlIGVkaXRvci4NCisJCQkJCQkvLw0KKwkJCQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsNCisJCQkJCQkJY3VycmVudFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhlU2VsZWN0aW9uLnRvQXJyYXkoKSksIHRydWUpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfTsNCisJCQlydW5uYWJsZS5ydW4oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBlZGl0aW5nIGRvbWFpbiBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElFZGl0aW5nRG9tYWluUHJvdmlkZXJ9IGludGVyZmFjZS4NCisJICogVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGltcGxlbWVudGluZyB0aGUgc3RhdGljIG1ldGhvZHMgb2Yge0BsaW5rIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbn0NCisJICogYW5kIGZvciBzdXBwb3J0aW5nIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbn0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgew0KKwkJcmV0dXJuIGVkaXRpbmdEb21haW47DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgew0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCisJCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJQE92ZXJyaWRlDQorCQlwdWJsaWMgT2JqZWN0IFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsNCisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7DQorCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJQE92ZXJyaWRlDQorCQlwdWJsaWMgT2JqZWN0IFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsNCisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7DQorCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJQE92ZXJyaWRlDQorCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7DQorCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOw0KKwkJCXJldHVybiBwYXJlbnQgIT0gbnVsbDsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlAT3ZlcnJpZGUNCisJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRWaWV3ZXJQYW5lKFZpZXdlclBhbmUgdmlld2VyUGFuZSkgew0KKwkJaWYgKGN1cnJlbnRWaWV3ZXJQYW5lICE9IHZpZXdlclBhbmUpIHsNCisJCQlpZiAoY3VycmVudFZpZXdlclBhbmUgIT0gbnVsbCkgew0KKwkJCQljdXJyZW50Vmlld2VyUGFuZS5zaG93Rm9jdXMoZmFsc2UpOw0KKwkJCX0NCisJCQljdXJyZW50Vmlld2VyUGFuZSA9IHZpZXdlclBhbmU7DQorCQl9DQorCQlzZXRDdXJyZW50Vmlld2VyKGN1cnJlbnRWaWV3ZXJQYW5lLmdldFZpZXdlcigpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBtYWtlcyBzdXJlIHRoYXQgb25lIGNvbnRlbnQgdmlld2VyLCBlaXRoZXIgZm9yIHRoZSBjdXJyZW50IHBhZ2Ugb3IgdGhlIG91dGxpbmUgdmlldywgaWYgaXQgaGFzIGZvY3VzLA0KKwkgKiBpcyB0aGUgY3VycmVudCBvbmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vmlld2VyKFZpZXdlciB2aWV3ZXIpIHsNCisJCS8vIElmIGl0IGlzIGNoYW5naW5nLi4uDQorCQkvLw0KKwkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gdmlld2VyKSB7DQorCQkJaWYgKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7DQorCQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgb24gZGVtYW5kLg0KKwkJCQkvLw0KKwkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPQ0KKwkJCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7DQorCQkJCQkJLy8gVGhpcyBqdXN0IG5vdGlmaWVzIHRob3NlIHRoaW5ncyB0aGF0IGFyZSBhZmZlY3RlZCBieSB0aGUgc2VjdGlvbi4NCisJCQkJCQkvLw0KKwkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHNlbGVjdGlvbkNoYW5nZWRFdmVudCkgew0KKwkJCQkJCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsNCisJCQkJCQl9DQorCQkJCQl9Ow0KKwkJCX0NCisNCisJCQkvLyBTdG9wIGxpc3RlbmluZyB0byB0aGUgb2xkIG9uZS4NCisJCQkvLw0KKwkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsNCisJCQkJY3VycmVudFZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsNCisJCQl9DQorDQorCQkJLy8gU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXcgb25lLg0KKwkJCS8vDQorCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7DQorCQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsNCisJCQl9DQorDQorCQkJLy8gUmVtZW1iZXIgaXQuDQorCQkJLy8NCisJCQljdXJyZW50Vmlld2VyID0gdmlld2VyOw0KKw0KKwkJCS8vIFNldCB0aGUgZWRpdG9ycyBzZWxlY3Rpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgdmlld2VyJ3Mgc2VsZWN0aW9uLg0KKwkJCS8vDQorCQkJc2V0U2VsZWN0aW9uKGN1cnJlbnRWaWV3ZXIgPT0gbnVsbCA/IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkgOiBjdXJyZW50Vmlld2VyLmdldFNlbGVjdGlvbigpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSB2aWV3ZXIgYXMgcmVxdWlyZWQgYnkgdGhlIHtAbGluayBJVmlld2VyUHJvdmlkZXJ9IGludGVyZmFjZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgew0KKwkJcmV0dXJuIGN1cnJlbnRWaWV3ZXI7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlciBhbmQgYWRkcyBhIGxpc3RlbmVyIGFzIHdlbGwgcmVnaXN0ZXJpbmcgdGhlIG1lbnUgZm9yIGV4dGVuc2lvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7DQorCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7DQorCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOw0KKwkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOw0KKwkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKHRoaXMpOw0KKwkJTWVudSBtZW51PSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsNCisJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsNCisJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGNvbnRleHRNZW51LCBuZXcgVW53cmFwcGluZ1NlbGVjdGlvblByb3ZpZGVyKHZpZXdlcikpOw0KKw0KKwkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTks7DQorCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07DQorCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgVmlld2VyRHJhZ0FkYXB0ZXIodmlld2VyKSk7DQorCQl2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyKGVkaXRpbmdEb21haW4sIHZpZXdlcikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgY2FsbGVkIHRvIGxvYWQgYSByZXNvdXJjZSBpbnRvIHRoZSBlZGl0aW5nIGRvbWFpbidzIHJlc291cmNlIHNldCBiYXNlZCBvbiB0aGUgZWRpdG9yJ3MgaW5wdXQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBjcmVhdGVNb2RlbCgpIHsNCisJCVVSSSByZXNvdXJjZVVSSSA9IEVkaXRVSVV0aWwuZ2V0VVJJKGdldEVkaXRvcklucHV0KCkpOw0KKwkJRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7DQorCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7DQorCQl0cnkgew0KKwkJCS8vIExvYWQgdGhlIHJlc291cmNlIHRocm91Z2ggdGhlIGVkaXRpbmcgZG9tYWluLg0KKwkJCS8vDQorCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIHRydWUpOw0KKwkJfQ0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorCQkJZXhjZXB0aW9uID0gZTsNCisJCQlyZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgZmFsc2UpOw0KKwkJfQ0KKw0KKwkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbik7DQorCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsNCisJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsICBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7DQorCQl9DQorCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkuYWRkKHByb2JsZW1JbmRpY2F0aW9uQWRhcHRlcik7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBkaWFnbm9zdGljIGRlc2NyaWJpbmcgdGhlIGVycm9ycyBhbmQgd2FybmluZ3MgbGlzdGVkIGluIHRoZSByZXNvdXJjZQ0KKwkgKiBhbmQgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gKGlmIGFueSkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRGlhZ25vc3RpYyBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhSZXNvdXJjZSByZXNvdXJjZSwgRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJaWYgKCFyZXNvdXJjZS5nZXRFcnJvcnMoKS5pc0VtcHR5KCkgfHwgIXJlc291cmNlLmdldFdhcm5pbmdzKCkuaXNFbXB0eSgpKSB7DQorCQkJQmFzaWNEaWFnbm9zdGljIGJhc2ljRGlhZ25vc3RpYyA9DQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMNCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLA0KKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuZWRpdG9yIiwNCisJCQkJCSAwLA0KKwkJCQkJIGdldFN0cmluZygiX1VJX0NyZWF0ZU1vZGVsRXJyb3JfbWVzc2FnZSIsIHJlc291cmNlLmdldFVSSSgpKSwNCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZXhjZXB0aW9uID09IG51bGwgPyAoT2JqZWN0KXJlc291cmNlIDogZXhjZXB0aW9uIH0pOw0KKwkJCWJhc2ljRGlhZ25vc3RpYy5tZXJnZShFY29yZVV0aWwuY29tcHV0ZURpYWdub3N0aWMocmVzb3VyY2UsIHRydWUpKTsNCisJCQlyZXR1cm4gYmFzaWNEaWFnbm9zdGljOw0KKwkJfQ0KKwkJZWxzZSBpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsNCisJCQlyZXR1cm4NCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYw0KKwkJCQkJKERpYWdub3N0aWMuRVJST1IsDQorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5lZGl0b3IiLA0KKwkJCQkJIDAsDQorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLA0KKwkJCQkJIG5ldyBPYmplY3RbXSB7IGV4Y2VwdGlvbiB9KTsNCisJCX0NCisJCWVsc2Ugew0KKwkJCXJldHVybiBEaWFnbm9zdGljLk9LX0lOU1RBTkNFOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGluc3RhbGwgeW91ciBvd24gY29udHJvbHMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgY3JlYXRlUGFnZXMoKSB7DQorCQkvLyBDcmVhdGVzIHRoZSBtb2RlbCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQNCisJCS8vDQorCQljcmVhdGVNb2RlbCgpOw0KKw0KKwkJLy8gT25seSBjcmVhdGVzIHRoZSBvdGhlciBwYWdlcyBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhhdCBjYW4gYmUgZWRpdGVkDQorCQkvLw0KKwkJaWYgKCFnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsNCisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgc2VsZWN0aW9uIHRyZWUgdmlldy4NCisJCQkvLw0KKwkJCXsNCisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0NCisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIEZkRWRpdG9yLnRoaXMpIHsNCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7DQorCQkJCQkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGNvbXBvc2l0ZSwgU1dULk1VTFRJKTsNCisJCQkJCQkJVHJlZVZpZXdlciBuZXdUcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7DQorCQkJCQkJCXJldHVybiBuZXdUcmVlVmlld2VyOw0KKwkJCQkJCX0NCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsNCisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsNCisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsNCisNCisJCQkJc2VsZWN0aW9uVmlld2VyID0gKFRyZWVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsNCisJCQkJc2VsZWN0aW9uVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisNCisJCQkJc2VsZWN0aW9uVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsNCisJCQkJc2VsZWN0aW9uVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7DQorCQkJCXZpZXdlclBhbmUuc2V0VGl0bGUoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsNCisNCisJCQkJbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcihzZWxlY3Rpb25WaWV3ZXIuZ2V0VHJlZSgpLCBhZGFwdGVyRmFjdG9yeSk7DQorDQorCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHNlbGVjdGlvblZpZXdlcik7DQorCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsNCisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOw0KKwkJCX0NCisNCisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgcGFyZW50IHRyZWUgdmlldy4NCisJCQkvLw0KKwkJCXsNCisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0NCisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIEZkRWRpdG9yLnRoaXMpIHsNCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7DQorCQkJCQkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGNvbXBvc2l0ZSwgU1dULk1VTFRJKTsNCisJCQkJCQkJVHJlZVZpZXdlciBuZXdUcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7DQorCQkJCQkJCXJldHVybiBuZXdUcmVlVmlld2VyOw0KKwkJCQkJCX0NCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsNCisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsNCisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsNCisNCisJCQkJcGFyZW50Vmlld2VyID0gKFRyZWVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsNCisJCQkJcGFyZW50Vmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbCgzMCk7DQorCQkJCXBhcmVudFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQlwYXJlbnRWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorDQorCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHBhcmVudFZpZXdlcik7DQorCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsNCisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9QYXJlbnRQYWdlX2xhYmVsIikpOw0KKwkJCX0NCisNCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgbGlzdCB2aWV3ZXINCisJCQkvLw0KKwkJCXsNCisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0NCisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIEZkRWRpdG9yLnRoaXMpIHsNCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7DQorCQkJCQkJCXJldHVybiBuZXcgTGlzdFZpZXdlcihjb21wb3NpdGUpOw0KKwkJCQkJCX0NCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsNCisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsNCisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsNCisJCQkJbGlzdFZpZXdlciA9IChMaXN0Vmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7DQorCQkJCWxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQlsaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKw0KKwkJCQljcmVhdGVDb250ZXh0TWVudUZvcihsaXN0Vmlld2VyKTsNCisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOw0KKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX0xpc3RQYWdlX2xhYmVsIikpOw0KKwkJCX0NCisNCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgdHJlZSB2aWV3ZXINCisJCQkvLw0KKwkJCXsNCisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0NCisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIEZkRWRpdG9yLnRoaXMpIHsNCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7DQorCQkJCQkJCXJldHVybiBuZXcgVHJlZVZpZXdlcihjb21wb3NpdGUpOw0KKwkJCQkJCX0NCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsNCisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsNCisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsNCisJCQkJdHJlZVZpZXdlciA9IChUcmVlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7DQorCQkJCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKw0KKwkJCQluZXcgQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yKHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLCBhZGFwdGVyRmFjdG9yeSk7DQorDQorCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRyZWVWaWV3ZXIpOw0KKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7DQorCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfVHJlZVBhZ2VfbGFiZWwiKSk7DQorCQkJfQ0KKw0KKwkJCS8vIFRoaXMgaXMgdGhlIHBhZ2UgZm9yIHRoZSB0YWJsZSB2aWV3ZXIuDQorCQkJLy8NCisJCQl7DQorCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9DQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBGZEVkaXRvci50aGlzKSB7DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgew0KKwkJCQkJCQlyZXR1cm4gbmV3IFRhYmxlVmlld2VyKGNvbXBvc2l0ZSk7DQorCQkJCQkJfQ0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgew0KKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOw0KKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsNCisJCQkJCQl9DQorCQkJCQl9Ow0KKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOw0KKwkJCQl0YWJsZVZpZXdlciA9IChUYWJsZVZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOw0KKw0KKwkJCQlUYWJsZSB0YWJsZSA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCk7DQorCQkJCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOw0KKwkJCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsNCisJCQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsNCisJCQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOw0KKw0KKwkJCQlUYWJsZUNvbHVtbiBvYmplY3RDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsNCisJCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMywgMTAwLCB0cnVlKSk7DQorCQkJCW9iamVjdENvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX09iamVjdENvbHVtbl9sYWJlbCIpKTsNCisJCQkJb2JqZWN0Q29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsNCisNCisJCQkJVGFibGVDb2x1bW4gc2VsZkNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOw0KKwkJCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyLCAxMDAsIHRydWUpKTsNCisJCQkJc2VsZkNvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX1NlbGZDb2x1bW5fbGFiZWwiKSk7DQorCQkJCXNlbGZDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOw0KKw0KKwkJCQl0YWJsZVZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKG5ldyBTdHJpbmcgW10geyJhIiwgImIifSk7DQorCQkJCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorDQorCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRhYmxlVmlld2VyKTsNCisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOw0KKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1RhYmxlUGFnZV9sYWJlbCIpKTsNCisJCQl9DQorDQorCQkJLy8gVGhpcyBpcyB0aGUgcGFnZSBmb3IgdGhlIHRhYmxlIHRyZWUgdmlld2VyLg0KKwkJCS8vDQorCQkJew0KKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQ0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgRmRFZGl0b3IudGhpcykgew0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsNCisJCQkJCQkJcmV0dXJuIG5ldyBUcmVlVmlld2VyKGNvbXBvc2l0ZSk7DQorCQkJCQkJfQ0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgew0KKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOw0KKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsNCisJCQkJCQl9DQorCQkJCQl9Ow0KKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOw0KKw0KKwkJCQl0cmVlVmlld2VyV2l0aENvbHVtbnMgPSAoVHJlZVZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOw0KKw0KKwkJCQlUcmVlIHRyZWUgPSB0cmVlVmlld2VyV2l0aENvbHVtbnMuZ2V0VHJlZSgpOw0KKwkJCQl0cmVlLnNldExheW91dERhdGEobmV3IEZpbGxMYXlvdXQoKSk7DQorCQkJCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsNCisJCQkJdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7DQorDQorCQkJCVRyZWVDb2x1bW4gb2JqZWN0Q29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOw0KKwkJCQlvYmplY3RDb2x1bW4uc2V0VGV4dChnZXRTdHJpbmcoIl9VSV9PYmplY3RDb2x1bW5fbGFiZWwiKSk7DQorCQkJCW9iamVjdENvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7DQorCQkJCW9iamVjdENvbHVtbi5zZXRXaWR0aCgyNTApOw0KKw0KKwkJCQlUcmVlQ29sdW1uIHNlbGZDb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7DQorCQkJCXNlbGZDb2x1bW4uc2V0VGV4dChnZXRTdHJpbmcoIl9VSV9TZWxmQ29sdW1uX2xhYmVsIikpOw0KKwkJCQlzZWxmQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsNCisJCQkJc2VsZkNvbHVtbi5zZXRXaWR0aCgyMDApOw0KKw0KKwkJCQl0cmVlVmlld2VyV2l0aENvbHVtbnMuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nIFtdIHsiYSIsICJiIn0pOw0KKwkJCQl0cmVlVmlld2VyV2l0aENvbHVtbnMuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQl0cmVlVmlld2VyV2l0aENvbHVtbnMuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorDQorCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRyZWVWaWV3ZXJXaXRoQ29sdW1ucyk7DQorCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsNCisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9UcmVlV2l0aENvbHVtbnNQYWdlX2xhYmVsIikpOw0KKwkJCX0NCisNCisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjDQorCQkJCShuZXcgUnVubmFibGUoKSB7DQorCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCSBzZXRBY3RpdmVQYWdlKDApOw0KKwkJCQkJIH0NCisJCQkJIH0pOw0KKwkJfQ0KKw0KKwkJLy8gRW5zdXJlcyB0aGF0IHRoaXMgZWRpdG9yIHdpbGwgb25seSBkaXNwbGF5IHRoZSBwYWdlJ3MgdGFiDQorCQkvLyBhcmVhIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHBhZ2UNCisJCS8vDQorCQlnZXRDb250YWluZXIoKS5hZGRDb250cm9sTGlzdGVuZXINCisJCQkobmV3IENvbnRyb2xBZGFwdGVyKCkgew0KKwkJCQlib29sZWFuIGd1YXJkID0gZmFsc2U7DQorCQkJCUBPdmVycmlkZQ0KKwkJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsNCisJCQkJCWlmICghZ3VhcmQpIHsNCisJCQkJCQlndWFyZCA9IHRydWU7DQorCQkJCQkJaGlkZVRhYnMoKTsNCisJCQkJCQlndWFyZCA9IGZhbHNlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJIH0pOw0KKw0KKwkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYw0KKwkJCShuZXcgUnVubmFibGUoKSB7DQorCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsNCisJCQkJIH0NCisJCQkgfSk7DQorCX0NCisNCisJLyoqDQorCSAqIElmIHRoZXJlIGlzIGp1c3Qgb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsDQorCSAqIHRoaXMgaGlkZXMgdGhlIHNpbmdsZSB0YWIgYXQgdGhlIGJvdHRvbS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhpZGVUYWJzKCkgew0KKwkJaWYgKGdldFBhZ2VDb3VudCgpIDw9IDEpIHsNCisJCQlzZXRQYWdlVGV4dCgwLCAiIik7DQorCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgew0KKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodCgxKTsNCisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7DQorCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSArIDYpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LA0KKwkgKiB0aGlzIHNob3dzIHRoZSB0YWJzIGF0IHRoZSBib3R0b20uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzaG93VGFicygpIHsNCisJCWlmIChnZXRQYWdlQ291bnQoKSA+IDEpIHsNCisJCQlzZXRQYWdlVGV4dCgwLCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOw0KKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsNCisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoU1dULkRFRkFVTFQpOw0KKwkJCQlQb2ludCBwb2ludCA9IGdldENvbnRhaW5lcigpLmdldFNpemUoKTsNCisJCQkJZ2V0Q29udGFpbmVyKCkuc2V0U2l6ZShwb2ludC54LCBwb2ludC55IC0gNik7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHVzZWQgdG8gdHJhY2sgdGhlIGFjdGl2ZSB2aWV3ZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgcGFnZUluZGV4KSB7DQorCQlzdXBlci5wYWdlQ2hhbmdlKHBhZ2VJbmRleCk7DQorDQorCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsNCisJCQloYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihjb250ZW50T3V0bGluZVBhZ2UuZ2V0U2VsZWN0aW9uKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIGhvdyB0aGUgZnJhbWV3b3JrIGRldGVybWluZXMgd2hpY2ggaW50ZXJmYWNlcyB3ZSBpbXBsZW1lbnQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsNCisJCWlmIChrZXkuZXF1YWxzKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpKSB7DQorCQkJcmV0dXJuIHNob3dPdXRsaW5lVmlldygpID8gZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgOiBudWxsOw0KKwkJfQ0KKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7DQorCQkJcmV0dXJuIGdldFByb3BlcnR5U2hlZXRQYWdlKCk7DQorCQl9DQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgew0KKwkJCXJldHVybiB0aGlzOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoa2V5KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IG91dGxpbmVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50T3V0bGluZVBhZ2UgZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgew0KKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSA9PSBudWxsKSB7DQorCQkJLy8gVGhlIGNvbnRlbnQgb3V0bGluZSBpcyBqdXN0IGEgdHJlZS4NCisJCQkvLw0KKwkJCWNsYXNzIE15Q29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgQ29udGVudE91dGxpbmVQYWdlIHsNCisJCQkJQE92ZXJyaWRlDQorCQkJCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KKwkJCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOw0KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7DQorCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7DQorDQorCQkJCQkvLyBTZXQgdXAgdGhlIHRyZWUgdmlld2VyLg0KKwkJCQkJLy8NCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsNCisNCisJCQkJCS8vIE1ha2Ugc3VyZSBvdXIgcG9wdXBzIHdvcmsuDQorCQkJCQkvLw0KKwkJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IoY29udGVudE91dGxpbmVWaWV3ZXIpOw0KKw0KKwkJCQkJaWYgKCFlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7DQorCQkJCQkgIC8vIFNlbGVjdCB0aGUgcm9vdCBvYmplY3QgaW4gdGhlIHZpZXcuDQorCQkJCQkgIC8vDQorCQkJCQkgIGNvbnRlbnRPdXRsaW5lVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJQE92ZXJyaWRlDQorCQkJCXB1YmxpYyB2b2lkIG1ha2VDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwgSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLCBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsNCisJCQkJCXN1cGVyLm1ha2VDb250cmlidXRpb25zKG1lbnVNYW5hZ2VyLCB0b29sQmFyTWFuYWdlciwgc3RhdHVzTGluZU1hbmFnZXIpOw0KKwkJCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOw0KKwkJCQl9DQorDQorCQkJCUBPdmVycmlkZQ0KKwkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsNCisJCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7DQorCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQljb250ZW50T3V0bGluZVBhZ2UgPSBuZXcgTXlDb250ZW50T3V0bGluZVBhZ2UoKTsNCisNCisJCQkvLyBMaXN0ZW4gdG8gc2VsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBpdCBpcyBhIHNwZWNpYWwgd2F5Lg0KKwkJCS8vDQorCQkJY29udGVudE91dGxpbmVQYWdlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcg0KKwkJCQkobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7DQorCQkJCQkgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2UgaGFuZGxlIHNlbGVjdGlvbnMgY29ycmVjdGx5Lg0KKwkJCQkJIC8vDQorCQkJCQkgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsNCisJCQkJCQkgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOw0KKwkJCQkJIH0NCisJCQkJIH0pOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIGNvbnRlbnRPdXRsaW5lUGFnZTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBwcm9wZXJ0eSBzaGVldC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7DQorCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgPT0gbnVsbCkgew0KKwkJCXByb3BlcnR5U2hlZXRQYWdlID0NCisJCQkJbmV3IEV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2UoZWRpdGluZ0RvbWFpbikgew0KKwkJCQkJQE92ZXJyaWRlDQorCQkJCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihMaXN0PD8+IHNlbGVjdGlvbikgew0KKwkJCQkJCUZkRWRpdG9yLnRoaXMuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0aW9uKTsNCisJCQkJCQlGZEVkaXRvci50aGlzLnNldEZvY3VzKCk7DQorCQkJCQl9DQorDQorCQkJCQlAT3ZlcnJpZGUNCisJCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgew0KKwkJCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7DQorCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7DQorCQkJCQl9DQorCQkJCX07DQorCQkJcHJvcGVydHlTaGVldFBhZ2Uuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCX0NCisNCisJCXJldHVybiBwcm9wZXJ0eVNoZWV0UGFnZTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBkZWFscyB3aXRoIGhvdyB3ZSB3YW50IHNlbGVjdGlvbiBpbiB0aGUgb3V0bGluZXIgdG8gYWZmZWN0IHRoZSBvdGhlciB2aWV3cy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQlpZiAoY3VycmVudFZpZXdlclBhbmUgIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgew0KKwkJCUl0ZXJhdG9yPD8+IHNlbGVjdGVkRWxlbWVudHMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuaXRlcmF0b3IoKTsNCisJCQlpZiAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsNCisJCQkJLy8gR2V0IHRoZSBmaXJzdCBzZWxlY3RlZCBlbGVtZW50Lg0KKwkJCQkvLw0KKwkJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCk7DQorDQorCQkJCS8vIElmIGl0J3MgdGhlIHNlbGVjdGlvbiB2aWV3ZXIsIHRoZW4gd2Ugd2FudCBpdCB0byBzZWxlY3QgdGhlIHNhbWUgc2VsZWN0aW9uIGFzIHRoaXMgc2VsZWN0aW9uLg0KKwkJCQkvLw0KKwkJCQlpZiAoY3VycmVudFZpZXdlclBhbmUuZ2V0Vmlld2VyKCkgPT0gc2VsZWN0aW9uVmlld2VyKSB7DQorCQkJCQlBcnJheUxpc3Q8T2JqZWN0PiBzZWxlY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQorCQkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnQpOw0KKwkJCQkJd2hpbGUgKHNlbGVjdGVkRWxlbWVudHMuaGFzTmV4dCgpKSB7DQorCQkJCQkJc2VsZWN0aW9uTGlzdC5hZGQoc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCkpOw0KKwkJCQkJfQ0KKw0KKwkJCQkJLy8gU2V0IHRoZSBzZWxlY3Rpb24gdG8gdGhlIHdpZGdldC4NCisJCQkJCS8vDQorCQkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbkxpc3QpKTsNCisJCQkJfQ0KKwkJCQllbHNlIHsNCisJCQkJCS8vIFNldCB0aGUgaW5wdXQgdG8gdGhlIHdpZGdldC4NCisJCQkJCS8vDQorCQkJCQlpZiAoY3VycmVudFZpZXdlclBhbmUuZ2V0Vmlld2VyKCkuZ2V0SW5wdXQoKSAhPSBzZWxlY3RlZEVsZW1lbnQpIHsNCisJCQkJCQljdXJyZW50Vmlld2VyUGFuZS5nZXRWaWV3ZXIoKS5zZXRJbnB1dChzZWxlY3RlZEVsZW1lbnQpOw0KKwkJCQkJCWN1cnJlbnRWaWV3ZXJQYW5lLnNldFRpdGxlKHNlbGVjdGVkRWxlbWVudCk7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSUVkaXRvclBhcnR9IGFuZCBzaW1wbHkgdGVzdHMgdGhlIGNvbW1hbmQgc3RhY2suDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsNCisJCXJldHVybiAoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLmlzU2F2ZU5lZWRlZCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHNhdmVzIHRoZSBtb2RlbCBmaWxlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KKwkJLy8gU2F2ZSBvbmx5IHJlc291cmNlcyB0aGF0IGhhdmUgYWN0dWFsbHkgY2hhbmdlZC4NCisJCS8vDQorCQlmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQorCQlzYXZlT3B0aW9ucy5wdXQoUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VELCBSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRURfTUVNT1JZX0JVRkZFUik7DQorDQorCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guDQorCQkvLw0KKwkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9DQorCQkJbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsNCisJCQkJLy8gVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBydW5zLg0KKwkJCQkvLw0KKwkJCQlAT3ZlcnJpZGUNCisJCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCisJCQkJCS8vIFNhdmUgdGhlIHJlc291cmNlcyB0byB0aGUgZmlsZSBzeXN0ZW0uDQorCQkJCQkvLw0KKwkJCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7DQorCQkJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKSB7DQorCQkJCQkJaWYgKChmaXJzdCB8fCAhcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkgfHwgaXNQZXJzaXN0ZWQocmVzb3VyY2UpKSAmJiAhZWRpdGluZ0RvbWFpbi5pc1JlYWRPbmx5KHJlc291cmNlKSkgew0KKwkJCQkJCQl0cnkgew0KKwkJCQkJCQkJbG9uZyB0aW1lU3RhbXAgPSByZXNvdXJjZS5nZXRUaW1lU3RhbXAoKTsNCisJCQkJCQkJCXJlc291cmNlLnNhdmUoc2F2ZU9wdGlvbnMpOw0KKwkJCQkJCQkJaWYgKHJlc291cmNlLmdldFRpbWVTdGFtcCgpICE9IHRpbWVTdGFtcCkgew0KKwkJCQkJCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7DQorCQkJCQkJCQl9DQorCQkJCQkJCX0NCisJCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOw0KKwkJCQkJCQl9DQorCQkJCQkJCWZpcnN0ID0gZmFsc2U7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfTsNCisNCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7DQorCQl0cnkgew0KKwkJCS8vIFRoaXMgcnVucyB0aGUgb3B0aW9ucywgYW5kIHNob3dzIHByb2dyZXNzLg0KKwkJCS8vDQorCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSkucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOw0KKw0KKwkJCS8vIFJlZnJlc2ggdGhlIG5lY2Vzc2FyeSBzdGF0ZS4NCisJCQkvLw0KKwkJCSgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuc2F2ZUlzRG9uZSgpOw0KKwkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsNCisJCX0NCisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgdGhhdCBzaG91bGRuJ3QuDQorCQkJLy8NCisJCQlGZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCX0NCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsNCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB3aGV0aGVyIHNvbWV0aGluZyBoYXMgYmVlbiBwZXJzaXN0ZWQgdG8gdGhlIFVSSSBvZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlLg0KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgVVJJIGNvbnZlcnRlciBmcm9tIHRoZSBlZGl0b3IncyByZXNvdXJjZSBzZXQgdG8gdHJ5IHRvIG9wZW4gYW4gaW5wdXQgc3RyZWFtLiANCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzUGVyc2lzdGVkKFJlc291cmNlIHJlc291cmNlKSB7DQorCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOw0KKwkJdHJ5IHsNCisJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0ocmVzb3VyY2UuZ2V0VVJJKCkpOw0KKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgew0KKwkJCQlyZXN1bHQgPSB0cnVlOw0KKwkJCQlzdHJlYW0uY2xvc2UoKTsNCisJCQl9DQorCQl9DQorCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KKwkJCS8vIElnbm9yZQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhbHdheXMgcmV0dXJucyB0cnVlIGJlY2F1c2UgaXQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgew0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWxzbyBjaGFuZ2VzIHRoZSBlZGl0b3IncyBpbnB1dC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsNCisJCVNhdmVBc0RpYWxvZyBzYXZlQXNEaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsNCisJCXNhdmVBc0RpYWxvZy5vcGVuKCk7DQorCQlJUGF0aCBwYXRoID0gc2F2ZUFzRGlhbG9nLmdldFJlc3VsdCgpOw0KKwkJaWYgKHBhdGggIT0gbnVsbCkgew0KKwkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7DQorCQkJaWYgKGZpbGUgIT0gbnVsbCkgew0KKwkJCQlkb1NhdmVBcyhVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSkpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvU2F2ZUFzKFVSSSB1cmksIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgew0KKwkJKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLnNldFVSSSh1cmkpOw0KKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsNCisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7DQorCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9DQorCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgIT0gbnVsbCA/DQorCQkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpIDoNCisJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsNCisJCWRvU2F2ZShwcm9ncmVzc01vbml0b3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgew0KKwkJdHJ5IHsNCisJCQlpZiAobWFya2VyLmdldFR5cGUoKS5lcXVhbHMoRVZhbGlkYXRvci5NQVJLRVIpKSB7DQorCQkJCVN0cmluZyB1cmlBdHRyaWJ1dGUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKEVWYWxpZGF0b3IuVVJJX0FUVFJJQlVURSwgbnVsbCk7DQorCQkJCWlmICh1cmlBdHRyaWJ1dGUgIT0gbnVsbCkgew0KKwkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpQXR0cmlidXRlKTsNCisJCQkJCUVPYmplY3QgZU9iamVjdCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7DQorCQkJCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7DQorCQkJCQkgIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zLnNpbmdsZXRvbihlZGl0aW5nRG9tYWluLmdldFdyYXBwZXIoZU9iamVjdCkpKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCUZkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgc3RhcnR1cC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgew0KKwkJc2V0U2l0ZShzaXRlKTsNCisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7DQorCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOw0KKwkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsNCisJCXNpdGUuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOw0KKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgew0KKwkJaWYgKGN1cnJlbnRWaWV3ZXJQYW5lICE9IG51bGwpIHsNCisJCQljdXJyZW50Vmlld2VyUGFuZS5zZXRGb2N1cygpOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJZ2V0Q29udHJvbChnZXRBY3RpdmVQYWdlKCkpLnNldEZvY3VzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsNCisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgew0KKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byByZXR1cm4gdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsNCisJCXJldHVybiBlZGl0b3JTZWxlY3Rpb247DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHNldCB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLg0KKwkgKiBDYWxsaW5nIHRoaXMgcmVzdWx0IHdpbGwgbm90aWZ5IHRoZSBsaXN0ZW5lcnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCWVkaXRvclNlbGVjdGlvbiA9IHNlbGVjdGlvbjsNCisNCisJCWZvciAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA6IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMpIHsNCisJCQlsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7DQorCQl9DQorCQlzZXRTdGF0dXNMaW5lTWFuYWdlcihzZWxlY3Rpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZU1hbmFnZXIoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciA9IGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCAmJiBjdXJyZW50Vmlld2VyID09IGNvbnRlbnRPdXRsaW5lVmlld2VyID8NCisJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyIDogZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7DQorDQorCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgew0KKwkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgew0KKwkJCQlDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikudG9MaXN0KCk7DQorCQkJCXN3aXRjaCAoY29sbGVjdGlvbi5zaXplKCkpIHsNCisJCQkJCWNhc2UgMDogew0KKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTm9PYmplY3RTZWxlY3RlZCIpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJCWNhc2UgMTogew0KKwkJCQkJCVN0cmluZyB0ZXh0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcihhZGFwdGVyRmFjdG9yeSkuZ2V0VGV4dChjb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsNCisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkIiwgdGV4dCkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQkJZGVmYXVsdDogew0KKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTXVsdGlPYmplY3RTZWxlY3RlZCIsIEludGVnZXIudG9TdHJpbmcoY29sbGVjdGlvbi5zaXplKCkpKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJZWxzZSB7DQorCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoIiIpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBsb29rcyB1cCBhIHN0cmluZyBpbiB0aGUgcGx1Z2luJ3MgcGx1Z2luLnByb3BlcnRpZXMgZmlsZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgew0KKwkJcmV0dXJuIEZkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHBsdWdpbi5wcm9wZXJ0aWVzLCBtYWtpbmcgYSBzdWJzdGl0dXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgew0KKwkJcmV0dXJuIEZkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXksIG5ldyBPYmplY3QgW10geyBzMSB9KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcn0gdG8gaGVscCBmaWxsIHRoZSBjb250ZXh0IG1lbnVzIHdpdGggY29udHJpYnV0aW9ucyBmcm9tIHRoZSBFZGl0IG1lbnUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7DQorCQkoKElNZW51TGlzdGVuZXIpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkpLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgew0KKwkJcmV0dXJuIChFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsNCisJCXJldHVybiBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGlvbkJhcnMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsNCisJCXJldHVybiBhZGFwdGVyRmFjdG9yeTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsNCisNCisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOw0KKw0KKwkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsNCisNCisJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsNCisNCisJCWlmIChnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGl2ZUVkaXRvcigpID09IHRoaXMpIHsNCisJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihudWxsKTsNCisJCX0NCisNCisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7DQorCQkJcHJvcGVydHlTaGVldFBhZ2UuZGlzcG9zZSgpOw0KKwkJfQ0KKw0KKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7DQorCQkJY29udGVudE91dGxpbmVQYWdlLmRpc3Bvc2UoKTsNCisJCX0NCisNCisJCXN1cGVyLmRpc3Bvc2UoKTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBvdXRsaW5lIHZpZXcgc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHNob3dPdXRsaW5lVmlldygpIHsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkL3ByZXNlbnRhdGlvbi9GZEVkaXRvclBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvcHJlc2VudGF0aW9uL0ZkRWRpdG9yUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxYjE5MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkL3ByZXNlbnRhdGlvbi9GZEVkaXRvclBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5wcmVzZW50YXRpb247DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLkVjbGlwc2VVSVBsdWdpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlRWRpdFBsdWdpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db3JlRWRpdFBsdWdpbjsNCisNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBjZW50cmFsIHNpbmdsZXRvbiBmb3IgdGhlIEZkIGVkaXRvciBwbHVnaW4uDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQ0KK3B1YmxpYyBmaW5hbCBjbGFzcyBGZEVkaXRvclBsdWdpbiBleHRlbmRzIEVNRlBsdWdpbiB7DQorCS8qKg0KKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEZkRWRpdG9yUGx1Z2luIElOU1RBTkNFID0gbmV3IEZkRWRpdG9yUGx1Z2luKCk7DQorCQ0KKwkvKioNCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gcGx1Z2luOw0KKw0KKwkvKioNCisJICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBGZEVkaXRvclBsdWdpbigpIHsNCisJCXN1cGVyDQorCQkJKG5ldyBSZXNvdXJjZUxvY2F0b3IgW10gew0KKwkJCQlDb3JlRWRpdFBsdWdpbi5JTlNUQU5DRSwNCisJCQkJRWNvcmVFZGl0UGx1Z2luLklOU1RBTkNFLA0KKwkJCX0pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7DQorCQlyZXR1cm4gcGx1Z2luOw0KKwl9DQorCQ0KKwkvKioNCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7DQorCQlyZXR1cm4gcGx1Z2luOw0KKwl9DQorCQ0KKwkvKioNCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbiBleHRlbmRzIEVjbGlwc2VVSVBsdWdpbiB7DQorCQkvKioNCisJCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsNCisJCQlzdXBlcigpOw0KKwkNCisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLg0KKwkJCS8vDQorCQkJcGx1Z2luID0gdGhpczsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9wcmVzZW50YXRpb24vRmRNb2RlbFdpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvcHJlc2VudGF0aW9uL0ZkTW9kZWxXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzU3NzMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvcHJlc2VudGF0aW9uL0ZkTW9kZWxXaXphcmQuamF2YQpAQCAtMCwwICsxLDYzNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQucHJlc2VudGF0aW9uOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQoraW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQoraW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuRmRGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuRmRQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQucHJvdmlkZXIuRmRFZGl0UGx1Z2luOw0KKw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247DQorDQorDQorLyoqDQorICogVGhpcyBpcyBhIHNpbXBsZSB3aXphcmQgZm9yIGNyZWF0aW5nIGEgbmV3IG1vZGVsIGZpbGUuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEZkTW9kZWxXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsNCisJLyoqDQorCSAqIFRoZSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyBmb3IgY3JlYXRlZCBmaWxlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IEZJTEVfRVhURU5TSU9OUyA9DQorCQlDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoRmRFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRmRFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbnMiKS5zcGxpdCgiXFxzKixcXHMqIikpKTsNCisNCisJLyoqDQorCSAqIEEgZm9ybWF0dGVkIGxpc3Qgb2Ygc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9ucywgc3VpdGFibGUgZm9yIGRpc3BsYXkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURURfRklMRV9FWFRFTlNJT05TID0NCisJCUZkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0ZkRWRpdG9yRmlsZW5hbWVFeHRlbnNpb25zIikucmVwbGFjZUFsbCgiXFxzKixcXHMqIiwgIiwgIik7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNhY2hlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgcGFja2FnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBGZFBhY2thZ2UgZmRQYWNrYWdlID0gRmRQYWNrYWdlLmVJTlNUQU5DRTsNCisNCisJLyoqDQorCSAqIFRoaXMgY2FjaGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEZkRmFjdG9yeSBmZEZhY3RvcnkgPSBmZFBhY2thZ2UuZ2V0RmRGYWN0b3J5KCk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBmaWxlIGNyZWF0aW9uIHBhZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRmRNb2RlbFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgbmV3RmlsZUNyZWF0aW9uUGFnZTsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIGluaXRpYWwgb2JqZWN0IGNyZWF0aW9uIHBhZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRmRNb2RlbFdpemFyZEluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UgaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZTsNCisNCisJLyoqDQorCSAqIFJlbWVtYmVyIHRoZSBzZWxlY3Rpb24gZHVyaW5nIGluaXRpYWxpemF0aW9uIGZvciBwb3B1bGF0aW5nIHRoZSBkZWZhdWx0IGNvbnRhaW5lci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247DQorDQorCS8qKg0KKwkgKiBSZW1lbWJlciB0aGUgd29ya2JlbmNoIGR1cmluZyBpbml0aWFsaXphdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJV29ya2JlbmNoIHdvcmtiZW5jaDsNCisNCisJLyoqDQorCSAqIENhY2hlcyB0aGUgbmFtZXMgb2YgdGhlIHR5cGVzIHRoYXQgY2FuIGJlIGNyZWF0ZWQgYXMgdGhlIHJvb3Qgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBpbml0aWFsT2JqZWN0TmFtZXM7DQorDQorCS8qKg0KKwkgKiBUaGlzIGp1c3QgcmVjb3JkcyB0aGUgaW5mb3JtYXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCXRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOw0KKwkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247DQorCQlzZXRXaW5kb3dUaXRsZShGZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9XaXphcmRfbGFiZWwiKSk7DQorCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihFeHRlbmRlZEltYWdlUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEZkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL3dpemJhbi9OZXdGZCIpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSB0eXBlcyB0aGF0IGNhbiBiZSBjcmVhdGVkIGFzIHRoZSByb290IG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0SW5pdGlhbE9iamVjdE5hbWVzKCkgew0KKwkJaWYgKGluaXRpYWxPYmplY3ROYW1lcyA9PSBudWxsKSB7DQorCQkJaW5pdGlhbE9iamVjdE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQorCQkJZm9yIChFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA6IGZkUGFja2FnZS5nZXRFQ2xhc3NpZmllcnMoKSkgew0KKwkJCQlpZiAoZUNsYXNzaWZpZXIgaW5zdGFuY2VvZiBFQ2xhc3MpIHsNCisJCQkJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKWVDbGFzc2lmaWVyOw0KKwkJCQkJaWYgKCFlQ2xhc3MuaXNBYnN0cmFjdCgpKSB7DQorCQkJCQkJaW5pdGlhbE9iamVjdE5hbWVzLmFkZChlQ2xhc3MuZ2V0TmFtZSgpKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlDb2xsZWN0aW9ucy5zb3J0KGluaXRpYWxPYmplY3ROYW1lcywgQ29tbW9uUGx1Z2luLklOU1RBTkNFLmdldENvbXBhcmF0b3IoKSk7DQorCQl9DQorCQlyZXR1cm4gaW5pdGlhbE9iamVjdE5hbWVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGUgYSBuZXcgbW9kZWwuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBjcmVhdGVJbml0aWFsTW9kZWwoKSB7DQorCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcylmZFBhY2thZ2UuZ2V0RUNsYXNzaWZpZXIoaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5nZXRJbml0aWFsT2JqZWN0TmFtZSgpKTsNCisJCUVPYmplY3Qgcm9vdE9iamVjdCA9IGZkRmFjdG9yeS5jcmVhdGUoZUNsYXNzKTsNCisJCXJldHVybiByb290T2JqZWN0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBEbyB0aGUgd29yayBhZnRlciBldmVyeXRoaW5nIGlzIHNwZWNpZmllZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgew0KKwkJdHJ5IHsNCisJCQkvLyBSZW1lbWJlciB0aGUgZmlsZS4NCisJCQkvLw0KKwkJCWZpbmFsIElGaWxlIG1vZGVsRmlsZSA9IGdldE1vZGVsRmlsZSgpOw0KKw0KKwkJCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24uDQorCQkJLy8NCisJCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0NCisJCQkJbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsNCisJCQkJCUBPdmVycmlkZQ0KKwkJCQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KKwkJCQkJCXRyeSB7DQorCQkJCQkJCS8vIENyZWF0ZSBhIHJlc291cmNlIHNldA0KKwkJCQkJCQkvLw0KKwkJCQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsNCisNCisJCQkJCQkJLy8gR2V0IHRoZSBVUkkgb2YgdGhlIG1vZGVsIGZpbGUuDQorCQkJCQkJCS8vDQorCQkJCQkJCVVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkobW9kZWxGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSk7DQorDQorCQkJCQkJCS8vIENyZWF0ZSBhIHJlc291cmNlIGZvciB0aGlzIGZpbGUuDQorCQkJCQkJCS8vDQorCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoZmlsZVVSSSk7DQorDQorCQkJCQkJCS8vIEFkZCB0aGUgaW5pdGlhbCBtb2RlbCBvYmplY3QgdG8gdGhlIGNvbnRlbnRzLg0KKwkJCQkJCQkvLw0KKwkJCQkJCQlFT2JqZWN0IHJvb3RPYmplY3QgPSBjcmVhdGVJbml0aWFsTW9kZWwoKTsNCisJCQkJCQkJaWYgKHJvb3RPYmplY3QgIT0gbnVsbCkgew0KKwkJCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQocm9vdE9iamVjdCk7DQorCQkJCQkJCX0NCisNCisJCQkJCQkJLy8gU2F2ZSB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlIHRvIHRoZSBmaWxlIHN5c3RlbS4NCisJCQkJCQkJLy8NCisJCQkJCQkJTWFwPE9iamVjdCwgT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQorCQkJCQkJCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5nZXRFbmNvZGluZygpKTsNCisJCQkJCQkJcmVzb3VyY2Uuc2F2ZShvcHRpb25zKTsNCisJCQkJCQl9DQorCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCQkJRmRFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQkJCQkJfQ0KKwkJCQkJCWZpbmFsbHkgew0KKwkJCQkJCQlwcm9ncmVzc01vbml0b3IuZG9uZSgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfTsNCisNCisJCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIGZhbHNlLCBvcGVyYXRpb24pOw0KKw0KKwkJCS8vIFNlbGVjdCB0aGUgbmV3IGZpbGUgcmVzb3VyY2UgaW4gdGhlIGN1cnJlbnQgdmlldy4NCisJCQkvLw0KKwkJCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOw0KKwkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOw0KKwkJCWZpbmFsIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBwYWdlLmdldEFjdGl2ZVBhcnQoKTsNCisJCQlpZiAoYWN0aXZlUGFydCBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpIHsNCisJCQkJZmluYWwgSVNlbGVjdGlvbiB0YXJnZXRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb2RlbEZpbGUpOw0KKwkJCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMNCisJCQkJCShuZXcgUnVubmFibGUoKSB7DQorCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJICgoSVNldFNlbGVjdGlvblRhcmdldClhY3RpdmVQYXJ0KS5zZWxlY3RSZXZlYWwodGFyZ2V0U2VsZWN0aW9uKTsNCisJCQkJCQkgfQ0KKwkJCQkJIH0pOw0KKwkJCX0NCisNCisJCQkvLyBPcGVuIGFuIGVkaXRvciBvbiB0aGUgbmV3IGZpbGUuDQorCQkJLy8NCisJCQl0cnkgew0KKwkJCQlwYWdlLm9wZW5FZGl0b3INCisJCQkJCShuZXcgRmlsZUVkaXRvcklucHV0KG1vZGVsRmlsZSksDQorCQkJCQkgd29ya2JlbmNoLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdEVkaXRvcihtb2RlbEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS5nZXRJZCgpKTsNCisJCQl9DQorCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcih3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKSwgRmRFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsIiksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOw0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQlGZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIG9uZSBwYWdlIG9mIHRoZSB3aXphcmQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgRmRNb2RlbFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsNCisJCS8qKg0KKwkJICogUGFzcyBpbiB0aGUgc2VsZWN0aW9uLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgRmRNb2RlbFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UoU3RyaW5nIHBhZ2VJZCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQkJc3VwZXIocGFnZUlkLCBzZWxlY3Rpb24pOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBUaGUgZnJhbWV3b3JrIGNhbGxzIHRoaXMgdG8gc2VlIGlmIHRoZSBmaWxlIGlzIGNvcnJlY3QuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgew0KKwkJCWlmIChzdXBlci52YWxpZGF0ZVBhZ2UoKSkgew0KKwkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gbmV3IFBhdGgoZ2V0RmlsZU5hbWUoKSkuZ2V0RmlsZUV4dGVuc2lvbigpOw0KKwkJCQlpZiAoZXh0ZW5zaW9uID09IG51bGwgfHwgIUZJTEVfRVhURU5TSU9OUy5jb250YWlucyhleHRlbnNpb24pKSB7DQorCQkJCQlTdHJpbmcga2V5ID0gRklMRV9FWFRFTlNJT05TLnNpemUoKSA+IDEgPyAiX1dBUk5fRmlsZW5hbWVFeHRlbnNpb25zIiA6ICJfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbiI7DQorCQkJCQlzZXRFcnJvck1lc3NhZ2UoRmRFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSwgbmV3IE9iamVjdCBbXSB7IEZPUk1BVFRFRF9GSUxFX0VYVEVOU0lPTlMgfSkpOw0KKwkJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCQl9DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIElGaWxlIGdldE1vZGVsRmlsZSgpIHsNCisJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGdldENvbnRhaW5lckZ1bGxQYXRoKCkuYXBwZW5kKGdldEZpbGVOYW1lKCkpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgcGFnZSB3aGVyZSB0aGUgdHlwZSBvZiBvYmplY3QgdG8gY3JlYXRlIGlzIHNlbGVjdGVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIEZkTW9kZWxXaXphcmRJbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7DQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJvdGVjdGVkIENvbWJvIGluaXRpYWxPYmplY3RGaWVsZDsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICovDQorCQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGVuY29kaW5nczsNCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgQ29tYm8gZW5jb2RpbmdGaWVsZDsNCisNCisJCS8qKg0KKwkJICogUGFzcyBpbiB0aGUgc2VsZWN0aW9uLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgRmRNb2RlbFdpemFyZEluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UoU3RyaW5nIHBhZ2VJZCkgew0KKwkJCXN1cGVyKHBhZ2VJZCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7DQorCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7IHsNCisJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOw0KKwkJCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7DQorCQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxMjsNCisJCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOw0KKw0KKwkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7DQorCQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsNCisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCisJCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7DQorCQkJfQ0KKw0KKwkJCUxhYmVsIGNvbnRhaW5lckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOw0KKwkJCXsNCisJCQkJY29udGFpbmVyTGFiZWwuc2V0VGV4dChGZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Nb2RlbE9iamVjdCIpKTsNCisNCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJCQljb250YWluZXJMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOw0KKwkJCX0NCisNCisJCQlpbml0aWFsT2JqZWN0RmllbGQgPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSKTsNCisJCQl7DQorCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsNCisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCisJCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsNCisJCQkJaW5pdGlhbE9iamVjdEZpZWxkLnNldExheW91dERhdGEoZGF0YSk7DQorCQkJfQ0KKw0KKwkJCWZvciAoU3RyaW5nIG9iamVjdE5hbWUgOiBnZXRJbml0aWFsT2JqZWN0TmFtZXMoKSkgew0KKwkJCQlpbml0aWFsT2JqZWN0RmllbGQuYWRkKGdldExhYmVsKG9iamVjdE5hbWUpKTsNCisJCQl9DQorDQorCQkJaWYgKGluaXRpYWxPYmplY3RGaWVsZC5nZXRJdGVtQ291bnQoKSA9PSAxKSB7DQorCQkJCWluaXRpYWxPYmplY3RGaWVsZC5zZWxlY3QoMCk7DQorCQkJfQ0KKwkJCWluaXRpYWxPYmplY3RGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih2YWxpZGF0b3IpOw0KKw0KKwkJCUxhYmVsIGVuY29kaW5nTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7DQorCQkJew0KKwkJCQllbmNvZGluZ0xhYmVsLnNldFRleHQoRmRFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfWE1MRW5jb2RpbmciKSk7DQorDQorCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsNCisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCisJCQkJZW5jb2RpbmdMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOw0KKwkJCX0NCisJCQllbmNvZGluZ0ZpZWxkID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7DQorCQkJew0KKwkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7DQorCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQorCQkJCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7DQorCQkJCWVuY29kaW5nRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsNCisJCQl9DQorDQorCQkJZm9yIChTdHJpbmcgZW5jb2RpbmcgOiBnZXRFbmNvZGluZ3MoKSkgew0KKwkJCQllbmNvZGluZ0ZpZWxkLmFkZChlbmNvZGluZyk7DQorCQkJfQ0KKw0KKwkJCWVuY29kaW5nRmllbGQuc2VsZWN0KDApOw0KKwkJCWVuY29kaW5nRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodmFsaWRhdG9yKTsNCisNCisJCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOw0KKwkJCXNldENvbnRyb2woY29tcG9zaXRlKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgdmFsaWRhdG9yID0NCisJCQluZXcgTW9kaWZ5TGlzdGVuZXIoKSB7DQorCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgew0KKwkJCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgew0KKwkJCXJldHVybiBnZXRJbml0aWFsT2JqZWN0TmFtZSgpICE9IG51bGwgJiYgZ2V0RW5jb2RpbmdzKCkuY29udGFpbnMoZW5jb2RpbmdGaWVsZC5nZXRUZXh0KCkpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsNCisJCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOw0KKwkJCWlmICh2aXNpYmxlKSB7DQorCQkJCWlmIChpbml0aWFsT2JqZWN0RmllbGQuZ2V0SXRlbUNvdW50KCkgPT0gMSkgew0KKwkJCQkJaW5pdGlhbE9iamVjdEZpZWxkLmNsZWFyU2VsZWN0aW9uKCk7DQorCQkJCQllbmNvZGluZ0ZpZWxkLnNldEZvY3VzKCk7DQorCQkJCX0NCisJCQkJZWxzZSB7DQorCQkJCQllbmNvZGluZ0ZpZWxkLmNsZWFyU2VsZWN0aW9uKCk7DQorCQkJCQlpbml0aWFsT2JqZWN0RmllbGQuc2V0Rm9jdXMoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxPYmplY3ROYW1lKCkgew0KKwkJCVN0cmluZyBsYWJlbCA9IGluaXRpYWxPYmplY3RGaWVsZC5nZXRUZXh0KCk7DQorDQorCQkJZm9yIChTdHJpbmcgbmFtZSA6IGdldEluaXRpYWxPYmplY3ROYW1lcygpKSB7DQorCQkJCWlmIChnZXRMYWJlbChuYW1lKS5lcXVhbHMobGFiZWwpKSB7DQorCQkJCQlyZXR1cm4gbmFtZTsNCisJCQkJfQ0KKwkJCX0NCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgew0KKwkJCXJldHVybiBlbmNvZGluZ0ZpZWxkLmdldFRleHQoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZSBuYW1lLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKFN0cmluZyB0eXBlTmFtZSkgew0KKwkJCXRyeSB7DQorCQkJCXJldHVybiBGZEVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfIiArIHR5cGVOYW1lICsgIl90eXBlIik7DQorCQkJfQ0KKwkJCWNhdGNoKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUpIHsNCisJCQkJRmRFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKG1yZSk7DQorCQkJfQ0KKwkJCXJldHVybiB0eXBlTmFtZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEVuY29kaW5ncygpIHsNCisJCQlpZiAoZW5jb2RpbmdzID09IG51bGwpIHsNCisJCQkJZW5jb2RpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQorCQkJCWZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoRmRFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfWE1MRW5jb2RpbmdDaG9pY2VzIikpOyBzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpOyApIHsNCisJCQkJCWVuY29kaW5ncy5hZGQoc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpKTsNCisJCQkJfQ0KKwkJCX0NCisJCQlyZXR1cm4gZW5jb2RpbmdzOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGUgZnJhbWV3b3JrIGNhbGxzIHRoaXMgdG8gY3JlYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgd2l6YXJkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsNCisJCS8vIENyZWF0ZSBhIHBhZ2UsIHNldCB0aGUgdGl0bGUsIGFuZCB0aGUgaW5pdGlhbCBtb2RlbCBmaWxlIG5hbWUuDQorCQkvLw0KKwkJbmV3RmlsZUNyZWF0aW9uUGFnZSA9IG5ldyBGZE1vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSgiV2hhdGV2ZXIiLCBzZWxlY3Rpb24pOw0KKwkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXRUaXRsZShGZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9GZE1vZGVsV2l6YXJkX2xhYmVsIikpOw0KKwkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXREZXNjcmlwdGlvbihGZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9GZE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uIikpOw0KKwkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXRGaWxlTmFtZShGZEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9GZEVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2UiKSArICIuIiArIEZJTEVfRVhURU5TSU9OUy5nZXQoMCkpOw0KKwkJYWRkUGFnZShuZXdGaWxlQ3JlYXRpb25QYWdlKTsNCisNCisJCS8vIFRyeSBhbmQgZ2V0IHRoZSByZXNvdXJjZSBzZWxlY3Rpb24gdG8gZGV0ZXJtaW5lIGEgY3VycmVudCBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlIGRpYWxvZy4NCisJCS8vDQorCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCisJCQkvLyBHZXQgdGhlIHJlc291cmNlLi4uDQorCQkJLy8NCisJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpOw0KKwkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsNCisJCQkJLy8gR2V0IHRoZSByZXNvdXJjZSBwYXJlbnQsIGlmIGl0cyBhIGZpbGUuDQorCQkJCS8vDQorCQkJCUlSZXNvdXJjZSBzZWxlY3RlZFJlc291cmNlID0gKElSZXNvdXJjZSlzZWxlY3RlZEVsZW1lbnQ7DQorCQkJCWlmIChzZWxlY3RlZFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgew0KKwkJCQkJc2VsZWN0ZWRSZXNvdXJjZSA9IHNlbGVjdGVkUmVzb3VyY2UuZ2V0UGFyZW50KCk7DQorCQkJCX0NCisNCisJCQkJLy8gVGhpcyBnaXZlcyB1cyBhIGRpcmVjdG9yeS4uLg0KKwkJCQkvLw0KKwkJCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIgfHwgc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7DQorCQkJCQkvLyBTZXQgdGhpcyBmb3IgdGhlIGNvbnRhaW5lci4NCisJCQkJCS8vDQorCQkJCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldENvbnRhaW5lckZ1bGxQYXRoKHNlbGVjdGVkUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7DQorDQorCQkJCQkvLyBNYWtlIHVwIGEgdW5pcXVlIG5ldyBuYW1lIGhlcmUuDQorCQkJCQkvLw0KKwkJCQkJU3RyaW5nIGRlZmF1bHRNb2RlbEJhc2VGaWxlbmFtZSA9IEZkRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0ZkRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZSIpOw0KKwkJCQkJU3RyaW5nIGRlZmF1bHRNb2RlbEZpbGVuYW1lRXh0ZW5zaW9uID0gRklMRV9FWFRFTlNJT05TLmdldCgwKTsNCisJCQkJCVN0cmluZyBtb2RlbEZpbGVuYW1lID0gZGVmYXVsdE1vZGVsQmFzZUZpbGVuYW1lICsgIi4iICsgZGVmYXVsdE1vZGVsRmlsZW5hbWVFeHRlbnNpb247DQorCQkJCQlmb3IgKGludCBpID0gMTsgKChJQ29udGFpbmVyKXNlbGVjdGVkUmVzb3VyY2UpLmZpbmRNZW1iZXIobW9kZWxGaWxlbmFtZSkgIT0gbnVsbDsgKytpKSB7DQorCQkJCQkJbW9kZWxGaWxlbmFtZSA9IGRlZmF1bHRNb2RlbEJhc2VGaWxlbmFtZSArIGkgKyAiLiIgKyBkZWZhdWx0TW9kZWxGaWxlbmFtZUV4dGVuc2lvbjsNCisJCQkJCX0NCisJCQkJCW5ld0ZpbGVDcmVhdGlvblBhZ2Uuc2V0RmlsZU5hbWUobW9kZWxGaWxlbmFtZSk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlID0gbmV3IEZkTW9kZWxXaXphcmRJbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlKCJXaGF0ZXZlcjIiKTsNCisJCWluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2Uuc2V0VGl0bGUoRmRFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRmRNb2RlbFdpemFyZF9sYWJlbCIpKTsNCisJCWluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2Uuc2V0RGVzY3JpcHRpb24oRmRFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV2l6YXJkX2luaXRpYWxfb2JqZWN0X2Rlc2NyaXB0aW9uIikpOw0KKwkJYWRkUGFnZShpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlKTsNCisJfQ0KKw0KKwkvKioNCisJICogR2V0IHRoZSBmaWxlIGZyb20gdGhlIHBhZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpbGUgZ2V0TW9kZWxGaWxlKCkgew0KKwkJcmV0dXJuIG5ld0ZpbGVDcmVhdGlvblBhZ2UuZ2V0TW9kZWxGaWxlKCk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvcHJlc2VudGF0aW9uL0ZkU29sdmVyQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvcHJlc2VudGF0aW9uL0ZkU29sdmVyQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMjQ4ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9wcmVzZW50YXRpb24vRmRTb2x2ZXJBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQucHJlc2VudGF0aW9uOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclByb3BlcnR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUHJvcGVydHlFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKKworLyoqCisgKiAgCisgKiBBZGFwdGVyIGZvciBQcm9wZXJ0eSBFZGl0b3IKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGZFNvbHZlckFkYXB0ZXIgZXh0ZW5kcworCQlTb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXIgeworCisJLyoqCisJICogCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFNvbHZlclByb3BlcnR5RWRpdG9yIGNyZWF0ZVNvbHZlclByb3BlcnR5RWRpdG9yKAorCQkJU29sdmVyUHJvcGVydHlDb21wb3NpdGUgc29sdmVyUHJvcGVydHlDb21wb3NpdGUsCisJCQlpbnQgc3R5bGUsIE1vZGlmeUxpc3RlbmVyIHByb2plY3RWYWxpZGF0b3IpIHsKKwkJcmV0dXJuIG5ldyBGZFNvbHZlclByb3BlcnR5RWRpdG9yKAorCQkJCXNvbHZlclByb3BlcnR5Q29tcG9zaXRlLCBzdHlsZSwKKwkJCQkoU29sdmVyKSBnZXRUYXJnZXQoKSwgcHJvamVjdFZhbGlkYXRvcik7CisJfSAvLyBjcmVhdGVTb2x2ZXJQcm9wZXJ0eUVkaXRvcgorCit9IC8vIEZkU29sdmVyQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvcHJlc2VudGF0aW9uL0ZkU29sdmVyUHJvcGVydHlFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkL3ByZXNlbnRhdGlvbi9GZFNvbHZlclByb3BlcnR5RWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFiYTg0YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkL3ByZXNlbnRhdGlvbi9GZFNvbHZlclByb3BlcnR5RWRpdG9yLmphdmEKQEAgLTAsMCArMSwxNzMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuRmRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5GZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLkZpbml0ZURpZmZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3MuUHJvcGVydHlTdHJpbmdQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworCitwdWJsaWMgY2xhc3MgRmRTb2x2ZXJQcm9wZXJ0eUVkaXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUHJvcGVydHlFZGl0b3IgeworCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqIEBwYXJhbSBkaXNlYXNlTW9kZWwKKwkgKiBAcGFyYW0gcHJvamVjdFZhbGlkYXRvcgorCSAqLworCXB1YmxpYyBGZFNvbHZlclByb3BlcnR5RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsCisJCQlpbnQgc3R5bGUsIFNvbHZlciBzb2x2ZXIsCisJCQlNb2RpZnlMaXN0ZW5lciBwcm9qZWN0VmFsaWRhdG9yKSB7CisJCXN1cGVyKHBhcmVudCwgc3R5bGUpOworCQlmaW5hbCBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOworCQlzZXRMYXlvdXQoZ3JpZExheW91dCk7CisKKwkJLy8gR2V0IHRoZSBhZGFwdGVyIHRoYXQgd2lsbCBwcm92aWRlIE5MUydkIG5hbWVzIGZvciB0aGUKKwkJLy8gcHJvcGVydGllcyBvZiB0aGUgZGlzZWFzZSBtb2RlbAorCQlmaW5hbCBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlciBwc3BhID0gKFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyKSBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkuYWRhcHQoc29sdmVyLCBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyLmNsYXNzKTsKKworCQlmaW5hbCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGl0ZW1Qcm92aWRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgKKwkJCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOworCQkKKwkJZmluYWwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSBwcm9wZXJ0eVNvdXJjZSA9IChJSXRlbVByb3BlcnR5U291cmNlKSBpdGVtUHJvdmlkZXJGYWN0b3J5CisJCQkJLmFkYXB0KHNvbHZlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7CisJCQorCQlmaW5hbCBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wZXJ0aWVzID0gcHJvcGVydHlTb3VyY2UKKwkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhzb2x2ZXIpOworCisJCWZvciAoZmluYWwgSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA6IHByb3BlcnRpZXMpIHsKKwkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZGVzY3JpcHRvcgorCQkJCQkuZ2V0RmVhdHVyZShudWxsKTsKKwkJCS8vIElzIHRoaXMgYSBkaXNlYXNlIG1vZGVsIHByb3BlcnR5IHRoYXQgdGhlIHVzZXIgc2hvdWxkIHNwZWNpZnk/CisJCQlpZiAoaXNVc2VyU3BlY2lmaWVkU29sdmVyUHJvcGVydHkoZmVhdHVyZSkpIHsKKwkJCQkvLyBZZXMKKwkJCQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7CisJCQkJbGFiZWwuc2V0VGV4dChwc3BhLmdldFByb3BlcnR5TmFtZShkZXNjcmlwdG9yKSk7CisKKwkJCQlmaW5hbCBHcmlkRGF0YSBsYWJlbEdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7CisJCQkJbGFiZWxHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJCQlsYWJlbEdELmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKKwkJCQlsYWJlbEdELmhvcml6b250YWxJbmRlbnQgPSAwOworCQkJCWxhYmVsLnNldExheW91dERhdGEobGFiZWxHRCk7CisKKwkJCQkvLyBHZXQgYSBzdHJpbmcgdmFsdWUgZm9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmZWF0dXJlCisKKwkJCQlmaW5hbCBTdHJpbmcgZGVmYXVsdFZhbHVlU3RyaW5nID0gZ2V0UHJvcGVydHlEZWZhdWx0VmFsdWVTdHJpbmcoZGVzY3JpcHRvcik7CisKKwkJCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dCh0aGlzLCBTV1QuQk9SREVSIHwgU1dULlRSQUlMKTsKKwkJCQl0ZXh0LnNldFRleHQoZGVmYXVsdFZhbHVlU3RyaW5nKTsKKwkJCQl0ZXh0LnNldFRvb2xUaXBUZXh0KHBzcGEuZ2V0UHJvcGVydHlUb29sVGlwKGRlc2NyaXB0b3IpKTsKKwkJCQltYXAucHV0KGZlYXR1cmUsIHRleHQpOworCisJCQkJZmluYWwgR3JpZERhdGEgdGV4dEdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCk7CisJCQkJdGV4dEdELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQkJCXRleHRHRC5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCQkJdGV4dC5zZXRMYXlvdXREYXRhKHRleHRHRCk7CisKKwkJCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHByb2plY3RWYWxpZGF0b3IpOworCisJCQkJZmluYWwgTGFiZWwgdW5pdExhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKKwkJCQl1bml0TGFiZWwuc2V0VGV4dChwc3BhLmdldFByb3BlcnR5VW5pdHMoZGVzY3JpcHRvcikpOworCQkJCWZpbmFsIEdyaWREYXRhIHVuaXRMYWJlbEdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCk7CisJCQkJdW5pdExhYmVsR0QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7CisJCQkJdW5pdExhYmVsLnNldExheW91dERhdGEodW5pdExhYmVsR0QpOworCisJCQl9IC8vIGlmIHVzZXIgc3BlY2lmaWVkCisJCX0gLy8gZm9yIGVhY2ggc29sdmVyIHByb3BlcnR5CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBmZWF0dXJlCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmVhdHVyZSBpcyBhIGR1YmxpbiBjb3JlIGZlYXR1cmUgCisJICogdGhhdCBpcyBzcGVjaWZpZWQgYnkgYSB1c2VyLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VzZXJTcGVjaWZpZWRTb2x2ZXJQcm9wZXJ0eShmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisJCWZpbmFsIEVDbGFzcyBjb250YWluaW5nQ2xhc3MgPSBmZWF0dXJlLmdldEVDb250YWluaW5nQ2xhc3MoKTsKKwkJLy8gSXMgaXQgYSBkaXNlYXNlIG1vZGVsIHByb3BlcnR5PworCQlpZiAoY29udGFpbmluZ0NsYXNzLmVxdWFscyhGZFBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbml0ZURpZmZlcmVuY2UoKSkpIHsKKwkJCXJldFZhbHVlID0gdHJ1ZTsKKwkJfSAvLyBpZiBhIGRpc2Vhc2UgbW9kZWwgcHJvcGVydHkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gaXNVc2VyU3BlY2lmaWVkRGlzZWFzZU1vZGVsUHJvcGVydHkKKworCXByb3RlY3RlZCBmaW5hbCBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBUZXh0PiBtYXAgPSBuZXcgSGFzaE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIFRleHQ+KCk7CisJcHJvdGVjdGVkIFN0cmluZyBlcnJvck1lc3NhZ2U7CisKKwlwdWJsaWMgRmRTb2x2ZXJQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKKwkJc3VwZXIocGFyZW50LHN0eWxlKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5TdGFuZGFyZERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yI3BvcHVsYXRlKG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcG9wdWxhdGUoU29sdmVyIHNvbHZlcikgeworCQlzdXBlci5wb3B1bGF0ZShzb2x2ZXIpOworCQlmb3IgKGZpbmFsIE1hcC5FbnRyeTxFU3RydWN0dXJhbEZlYXR1cmUsIFRleHQ+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpIHsKKwkJCisJCQlzd2l0Y2ggKGVudHJ5LmdldEtleSgpLmdldEZlYXR1cmVJRCgpKSB7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfSAvLyBzd2l0Y2gKKwkJfSAvLyBmb3IgZWFjaCBNYXAuZW50cnkKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHZhbGlkYXRlCisKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tTdWJjbGFzcygpIHsKKwkJLy8gRGlzYWJsZSB0aGUgY2hlY2sgdGhhdCBwcmV2ZW50cyBzdWItY2xhc3Npbmcgb2YgU1dUIGNvbXBvbmVudHMKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU29sdmVyIGNyZWF0ZUFuZFBvcHVsYXRlU29sdmVyKCkgeworCQlTb2x2ZXIgcmV0VmFsdWUgPSBGZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbml0ZURpZmZlcmVuY2UoKTsKKwkJcmV0VmFsdWUuc2V0VVJJKFNURU1VUkkuY3JlYXRlVVJJKEZpbml0ZURpZmZlcmVuY2UuVVJJX1RZUEVfU09MVkVSX1NFR01FTlQrIi8iK1NURU1VUkkuZ2VuZXJhdGVVbmlxdWVQYXJ0KCkpKTsKKwkJdGhpcy5wb3B1bGF0ZShyZXRWYWx1ZSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9CisKKworfSAvLyBSa1NvbHZlclByb3BlcnR5RWRpdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9wcmVzZW50YXRpb24vRmRTb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkL3ByZXNlbnRhdGlvbi9GZFNvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZGIxMzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9wcmVzZW50YXRpb24vRmRTb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDMzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5wcmVzZW50YXRpb247CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUHJvcGVydHlDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXJQcm9wZXJ0eUVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworCitwdWJsaWMgY2xhc3MgRmRTb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlcgorCQlpbXBsZW1lbnRzIEFkYXB0ZXIgeworCisJLyoqCisJICogCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFNvbHZlclByb3BlcnR5RWRpdG9yIGNyZWF0ZVNvbHZlclByb3BlcnR5RWRpdG9yKAorCQkJU29sdmVyUHJvcGVydHlDb21wb3NpdGUgc29sdmVyUHJvcGVydHlDb21wb3NpdGUsCisJCQlpbnQgc3R5bGUsIE1vZGlmeUxpc3RlbmVyIHByb2plY3RWYWxpZGF0b3IpIHsKKwkJcmV0dXJuIG5ldyBGZFNvbHZlclByb3BlcnR5RWRpdG9yKAorCQkJCXNvbHZlclByb3BlcnR5Q29tcG9zaXRlLCBzdHlsZSwKKwkJCQkoU29sdmVyKSBnZXRUYXJnZXQoKSwgcHJvamVjdFZhbGlkYXRvcik7CisJfSAvLyBjcmVhdGVTb2x2ZXJQcm9wZXJ0eUVkaXRvcgorCit9IC8vIFNvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvcHJlc2VudGF0aW9uL0ZkU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvZmQvcHJlc2VudGF0aW9uL0ZkU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZGY4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9wcmVzZW50YXRpb24vRmRTb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLy8gRGlzZWFzZU1vZGVsUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5mZC5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQudXRpbC5GZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdGFydHVwOworCisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGZFNvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBGZEFkYXB0ZXJGYWN0b3J5IAorCWltcGxlbWVudHMgU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeSwgSVN0YXJ0dXAgeworCisJLyoqCisJICogCisJICovCisJcHVibGljIEZkU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCS5hZGRBZGFwdGVyRmFjdG9yeSh0aGlzKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cCNlYXJseVN0YXJ0dXAoKQorCSAqLworCXB1YmxpYyB2b2lkIGVhcmx5U3RhcnR1cCgpIHsKKwkJLy8gTm90aGluZyB0byBkbyBoZXJlLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGNvbnN0cnVjdG9yIGhhcworCQkvLyBydW4gd2hpY2ggaXMgdGhlIGVudGlyZSBwb2ludCBvZiBlYXJseSBhY3RpdmF0aW9uIHdoaWNoIGNhdXNlcyB0aGUKKwkJLy8gZmFjdG9yeSB0byBiZSBhZGRlZCB0byB0aGUgUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJfQorCisJLyoqCisJICogCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRmluaXRlRGlmZmVyZW5jZUFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgRmRTb2x2ZXJBZGFwdGVyKCk7CisJfQorCisJLyoqCisJICogCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gdHlwZSA9PSBTb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuY2xhc3MKKwkJCQl8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOworCX0KK30gCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9wcmVzZW50YXRpb24vRmRTb2x2ZXJQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL2ZkL3ByZXNlbnRhdGlvbi9GZFNvbHZlclByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNTYzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9mZC9wcmVzZW50YXRpb24vRmRTb2x2ZXJQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLy8gU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIudXRpbC5Tb2x2ZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuRmRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3MuUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3MuUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC5Tb2x2ZXJNZXNzYWdlczsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gTkxTJ2Qgc3RyaW5ncyBmb3Ige0BsaW5rIERpc2Vhc2VNb2RlbH0gcHJvcGVydGllcy4gCisgKi8KK3B1YmxpYyBjbGFzcyBGZFNvbHZlclByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJIFNvbHZlckFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKKworCQorCVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOworCisJLyoqCisJICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBGZFNvbHZlclByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkZEFkYXB0ZXJGYWN0b3J5KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsI2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCWlmKHR5cGUgPT0gRmRQYWNrYWdlLmVJTlNUQU5DRSkgcmV0dXJuIHRydWU7CisJCXJldHVybiAgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSB8fCB0eXBlID09IFByb3BlcnR5U3RyaW5nUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQudXRpbC5TdGFuZGFyZEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURpc2Vhc2VNb2RlbEFkYXB0ZXIoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNvbHZlckFkYXB0ZXIoKSB7CisJCS8vIEhhdmUgd2UgY3JlYXRlZCBvbmUgYmVmb3JlPworCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7CisJCQkvLyBObworCQkJYWRhcHRlciA9IG5ldyBTb2x2ZXJQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlcigpOworCQl9IC8vIGlmIHdlIGRpZG4ndCBjcmVhdGUgb25lIGJlZm9yZQorCQlyZXR1cm4gYWRhcHRlcjsKKwl9IC8vIGNyZWF0ZURpc2Vhc2VNb2RlbEFkYXB0ZXIKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFNvbHZlclByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyIGV4dGVuZHMKKwkJCVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyIHsKKworCQkvKioKKwkJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkJICogQHJldHVybiB0aGUgTkxTJ2QgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZGlzcGxheSB0byB0aGUgdXNlcgorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewkKKwkJCXJldHVybiBTb2x2ZXJNZXNzYWdlcworCQkJCQkuZ2V0U3RyaW5nKCgoRVN0cnVjdHVyYWxGZWF0dXJlKSBkZXNjcmlwdG9yCisJCQkJCQkJLmdldEZlYXR1cmUobnVsbCkpLmdldE5hbWUoKSk7CisJCX0gLy8gZ2V0UHJvcGVydHlOYW1lCisKKwkJLyoqCisJCSAqIEBwYXJhbSBkZXNjcmlwdG9yCisJCSAqIEByZXR1cm4gdGhlIE5MUydkIHRvb2wgdGlwIHRleHQgdGhhdCBkZXNjcmliZXMgdGhlIHByb3BlcnR5CisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VG9vbFRpcCgKKwkJCQlJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisJCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGRlc2NyaXB0b3IKKwkJCQkJLmdldEZlYXR1cmUobnVsbCk7CisJCQlyZXR1cm4gU29sdmVyTWVzc2FnZXMuZ2V0U3RyaW5nKGZlYXR1cmUuZ2V0TmFtZSgpCisJCQkJCSsgVFRfU1VGRklYKTsKKwkJfSAvLyBnZXRQcm9wZXJ0eVRvb2xUaXAKKworCQkvKioKKwkJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkJICogQHJldHVybiB0aGUgTkxTJ2QgdGV4dCB0aGF0IHJlcHJlc2VudHMgdGhlIHVuaXRzIG9mIHRoZQorCQkgKiAgICAgICAgIHByb3BlcnR5CisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VW5pdHMoCisJCQkJSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBkZXNjcmlwdG9yCisJCQkJCS5nZXRGZWF0dXJlKG51bGwpOworCQkJcmV0dXJuIFNvbHZlck1lc3NhZ2VzLmdldFN0cmluZyhmZWF0dXJlLmdldE5hbWUoKQorCQkJCQkrIFVOSVRfU1VGRklYKTsKKwkJfSAvLyBnZXRQcm9wZXJ0eVVuaXRzCisKKwl9IC8vIFN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIKK30gLy8gU3RhbmRhcmRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9zb2x2ZXJzL2ZkL0FjdGl2YXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3NvbHZlcnMvZmQvQWN0aXZhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjZjA2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9zb2x2ZXJzL2ZkL0FjdGl2YXRvci5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkLnByZXNlbnRhdGlvbi5GZEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQucHJlc2VudGF0aW9uLkZkU29sdmVyUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKgorICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCisgKi8KK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKKworCS8qKgorCSAqIFRoZSBzeW1ib2xpYyBpZGVudGlmaWVyIGZvciB0aGlzIHBsdWctaW4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXIuZmQiOyAvLyROT04tTkxTLTEkCisKKwkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgorCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47CisKKwkvKioKKwkgKiBUaGUgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIEFjdGl2YXRvcigpIHsKKwkJc3VwZXIoKTsKKwkJcGx1Z2luID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KKwkgKiAKKwkgKiBAcGFyYW0gY29udGV4dAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc3RhcnQoY29udGV4dCk7CisJCW5ldyBGZFNvbHZlclByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOworCQluZXcgRmRFZGl0b3IoKTsKKwl9IC8vIHN0YXJ0CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCisJICogCisJICogQHBhcmFtIGNvbnRleHQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc3RvcChjb250ZXh0KTsKKwkJcGx1Z2luID0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCisJICogCisJICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJCisJLyoqCisJICogTG9nIGFuIGVycm9yIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgdGV4dAorCSAqIEBwYXJhbSBleGNlcHRpb24KKwkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQlwbHVnaW4uZ2V0TG9nKCkubG9nKAorCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAorCQkJCQkJMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7CisJfSAvLyBsb2dFcnJvcgorCisJLyoqCisJICogTG9nIGluZm9ybWF0aW9uIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIGluZm9ybWF0aW9uIG1lc3NhZ2UgdGV4dAorCSAqIEBwYXJhbSBleGNlcHRpb24KKwkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dJbmZvcm1hdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQlwbHVnaW4uZ2V0TG9nKCkubG9nKAorCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCisJCQkJCQkwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKKwl9IC8vIGxvZ0luZm9ybWF0aW9uCisKK30gLy8gQWN0aXZhdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvc29sdmVycy9mZC9Tb2x2ZXJNZXNzYWdlcy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3NvbHZlcnMvZmQvU29sdmVyTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDlhNWFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3NvbHZlcnMvZmQvU29sdmVyTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvLyBEaXNlYXNlV2l6YXJkTWVzc2FnZXMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMuZmQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29uc3RhbnRzOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIFJlc291cmNlIEJ1bmRsZSBmb3IgdGhpcyBwYWNrYWdlLgorICovCitwdWJsaWMgY2xhc3MgU29sdmVyTWVzc2FnZXMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IENvbnN0YW50cy5JRF9ST09UCisJCQkrICIudWkuc29sdmVycy5mZC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCisJCQkuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKKworCXByaXZhdGUgU29sdmVyTWVzc2FnZXMoKSB7CisJCS8vIGVtcHR5CisJfQorCisJLyoqCisJICogQHBhcmFtIGtleQorCSAqICAgICAgICAgICAgdGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UKKwkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSBrZXkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoZmluYWwgU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoZmluYWwgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9IC8vIGdldFN0cmluZworfSAvLyBTb2x2ZXJNZXNzYWdlcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLmZkL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3NvbHZlcnMvZmQvbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9zb2x2ZXJzL2ZkL21lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2MGNkZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZC9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9zb2x2ZXJzL2ZkL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMCBAQAorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorIyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisjICoNCisjICogQ29udHJpYnV0b3JzOg0KKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmMDI0ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8Y2xhc3NwYXRoPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQorPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNzI5NmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8cHJvamVjdERlc2NyaXB0aW9uPg0KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucms8L25hbWU+DQorCTxjb21tZW50PjwvY29tbWVudD4NCisJPHByb2plY3RzPg0KKwk8L3Byb2plY3RzPg0KKwk8YnVpbGRTcGVjPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCTwvYnVpbGRTcGVjPg0KKwk8bmF0dXJlcz4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQorCTwvbmF0dXJlcz4NCis8L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTQ3ZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDIxIEBACisjVHVlIFNlcCAwMSAxNjo1Mjo1OCBFRFQgMjAwOQorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uPXJldHVybl90YWcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyMDZmNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDE4IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjANCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQorQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yayBQbHVnLWluDQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrO3NpbmdsZXRvbjo9dHJ1ZQ0KK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXINCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZW1mLmVjb3JlLA0KKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUsDQorIG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yazt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQ7YnVuZGxlLXZlcnNpb249IjIuNC4xIiwNCisgb3JnLmVjbGlwc2Uub3NnaTtidW5kbGUtdmVyc2lvbj0iMy40LjMiLA0KKyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwNCisgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IjMuNC4yIiwNCisgb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSIzLjQuMiIsDQorIG9yZy5lY2xpcHNlLnN0ZW0udWkNCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQ0KK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay5BY3RpdmF0b3INCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUNCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLnByZXNlbnRhdGlvbg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwYjIwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTQgQEAKKw0KKyMgPGNvcHlyaWdodD4NCisjIDwvY29weXJpZ2h0Pg0KKyMNCisjICRJZCQNCisNCitiaW4uaW5jbHVkZXMgPSAuLFwNCisgICAgICAgICAgICAgICBpY29ucy8sXA0KKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQorICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcDQorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMNCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuDQorc291cmNlLi4gPSBzcmMvDQorb3V0cHV0Li4gPSBiaW4vDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL2ljb25zL2Z1bGwvb2JqMTYvUmtNb2RlbEZpbGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL2ljb25zL2Z1bGwvb2JqMTYvUmtNb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNGZhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsvaWNvbnMvZnVsbC9vYmoxNi9Sa01vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL2ljb25zL2Z1bGwvd2l6YmFuL05ld1JrLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9pY29ucy9mdWxsL3dpemJhbi9OZXdSay5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUyY2I5MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9pY29ucy9mdWxsL3dpemJhbi9OZXdSay5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZmEzODUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSw3NiBAQAorDQorIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorIyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisjICoNCisjICogQ29udHJpYnV0b3JzOg0KKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjIFRvIGNvZGUgZGV2ZWxvcGVyOg0KKyMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUNCisjICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4NCisjICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlDQorIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5Lg0KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorDQorcGx1Z2luTmFtZSA9IFNURU0gUnVuZ2UgS3V0dGEgU29sdmVyIFVJDQorcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCisNCitfVUlfUmtFZGl0b3JfbWVudSA9ICZSayBFZGl0b3INCisNCitfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtID0gJk5ldyBDaGlsZA0KK19VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSA9IE4mZXcgU2libGluZw0KKw0KK19VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtID0gU2hvdyAmUHJvcGVydGllcyBWaWV3DQorX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtID0gJlJlZnJlc2gNCisNCitfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCA9IFNlbGVjdGlvbg0KK19VSV9QYXJlbnRQYWdlX2xhYmVsID0gUGFyZW50DQorX1VJX0xpc3RQYWdlX2xhYmVsID0gTGlzdA0KK19VSV9UcmVlUGFnZV9sYWJlbCA9IFRyZWUNCitfVUlfVGFibGVQYWdlX2xhYmVsID0gVGFibGUNCitfVUlfVHJlZVdpdGhDb2x1bW5zUGFnZV9sYWJlbCA9IFRyZWUgd2l0aCBDb2x1bW5zDQorX1VJX09iamVjdENvbHVtbl9sYWJlbCA9IE9iamVjdA0KK19VSV9TZWxmQ29sdW1uX2xhYmVsID0gU2VsZg0KKw0KK19VSV9Ob09iamVjdFNlbGVjdGVkID0gU2VsZWN0ZWQgTm90aGluZw0KK19VSV9TaW5nbGVPYmplY3RTZWxlY3RlZCA9IFNlbGVjdGVkIE9iamVjdDogezB9DQorX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQgPSBTZWxlY3RlZCB7MH0gT2JqZWN0cw0KKw0KK19VSV9PcGVuRWRpdG9yRXJyb3JfbGFiZWwgPSBPcGVuIEVkaXRvcg0KKw0KK19VSV9XaXphcmRfY2F0ZWdvcnkgPSBFeGFtcGxlIEVNRiBNb2RlbCBDcmVhdGlvbiBXaXphcmRzDQorDQorX1VJX0NyZWF0ZU1vZGVsRXJyb3JfbWVzc2FnZSA9IFByb2JsZW1zIGVuY291bnRlcmVkIGluIGZpbGUgInswfSINCisNCitfVUlfUmtNb2RlbFdpemFyZF9sYWJlbCA9IFJrIE1vZGVsDQorX1VJX1JrTW9kZWxXaXphcmRfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgUmsgbW9kZWwNCisNCitfVUlfUmtFZGl0b3JfbGFiZWwgPSBSayBNb2RlbCBFZGl0b3INCisNCitfVUlfUmtFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlID0gTXkNCitfVUlfUmtFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbnMgPSByaw0KKw0KK19VSV9XaXphcmRfbGFiZWwgPSBOZXcNCisNCitfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbiA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gJycuezB9JycNCitfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbnMgPSBUaGUgZmlsZSBuYW1lIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zOiB7MH0NCisNCitfVUlfTW9kZWxPYmplY3QgPSAmTW9kZWwgT2JqZWN0DQorX1VJX1hNTEVuY29kaW5nID0gJlhNTCBFbmNvZGluZw0KK19VSV9YTUxFbmNvZGluZ0Nob2ljZXMgPSBVVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQ0KK19VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb24gPSBTZWxlY3QgYSBtb2RlbCBvYmplY3QgdG8gY3JlYXRlDQorDQorX1VJX0ZpbGVDb25mbGljdF9sYWJlbCA9IEZpbGUgQ29uZmxpY3QNCitfV0FSTl9GaWxlQ29uZmxpY3QgPSBUaGVyZSBhcmUgdW5zYXZlZCBjaGFuZ2VzIHRoYXQgY29uZmxpY3Qgd2l0aCBjaGFuZ2VzIG1hZGUgb3V0c2lkZSB0aGUgZWRpdG9yLiAgRG8geW91IHdpc2ggdG8gZGlzY2FyZCB0aGlzIGVkaXRvcidzIGNoYW5nZXM/DQorDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWFhNjU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL3BsdWdpbi54bWwKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPCEtLQorIDxjb3B5cmlnaHQ+CisgPC9jb3B5cmlnaHQ+CisKKyAkSWQ6IHBsdWdpbi54bWwsdiAxLjQgMjAwOS8wMy8xMSAwMzo0NToyNiBzZWRsdW5kIEV4cCAkCistLT4KKworPHBsdWdpbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5zdGFydHVwIj4KKyAgICAgPHN0YXJ0dXAKKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5wcmVzZW50YXRpb24uUmtTb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5Ij4KKyAgICAgPC9zdGFydHVwPgorICA8L2V4dGVuc2lvbj4KKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvcHJlc2VudGF0aW9uL1JrQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL3ByZXNlbnRhdGlvbi9Sa0FjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgyYmQwNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL3ByZXNlbnRhdGlvbi9Sa0FjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKQEAgLTAsMCArMSw0MzIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLnByZXNlbnRhdGlvbjsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29udHJvbEFjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkxvYWRSZXNvdXJjZUFjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlZhbGlkYXRlQWN0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uSXRlbTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZvciB0aGUgUmsgbW9kZWwgZWRpdG9yLg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBSa0FjdGlvbkJhckNvbnRyaWJ1dG9yDQorCWV4dGVuZHMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yDQorCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7DQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgZWRpdG9yLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvclBhcnQ7DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBwcm92aWRlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGFjdGlvbiBvcGVucyB0aGUgUHJvcGVydGllcyB2aWV3Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElBY3Rpb24gc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uID0NCisJCW5ldyBBY3Rpb24oUmtFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbSIpKSB7DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQl0cnkgew0KKwkJCQkJZ2V0UGFnZSgpLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7DQorCQkJCX0NCisJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQkJUmtFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQkJCX0NCisJCQl9DQorCQl9Ow0KKw0KKwkvKioNCisJICogVGhpcyBhY3Rpb24gcmVmcmVzaGVzIHRoZSB2aWV3ZXIgb2YgdGhlIGN1cnJlbnQgZWRpdG9yIGlmIHRoZSBlZGl0b3INCisJICogaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJQWN0aW9uIHJlZnJlc2hWaWV3ZXJBY3Rpb24gPQ0KKwkJbmV3IEFjdGlvbihSa0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbSIpKSB7DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgew0KKwkJCQlyZXR1cm4gYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcjsNCisJCQl9DQorDQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQlpZiAoYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgew0KKwkJCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldFZpZXdlcigpOw0KKwkJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7DQorCQkJCQkJdmlld2VyLnJlZnJlc2goKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX07DQorDQorCS8qKg0KKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gY29ycmVzcG9uZGluZyB0byBlYWNoIGRlc2NyaXB0b3INCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBjcmVhdGVDaGlsZEFjdGlvbnM7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZUNoaWxkIGFjdGlvbnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcg0KKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZVNpYmxpbmdBY3Rpb25zOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVTaWJsaW5nIGFjdGlvbnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgY29udHJpYnV0b3IuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUmtBY3Rpb25CYXJDb250cmlidXRvcigpIHsNCisJCXN1cGVyKEFERElUSU9OU19MQVNUX1NUWUxFKTsNCisJCWxvYWRSZXNvdXJjZUFjdGlvbiA9IG5ldyBMb2FkUmVzb3VyY2VBY3Rpb24oKTsNCisJCXZhbGlkYXRlQWN0aW9uID0gbmV3IFZhbGlkYXRlQWN0aW9uKCk7DQorCQljb250cm9sQWN0aW9uID0gbmV3IENvbnRyb2xBY3Rpb24oKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIFNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMgdG8gdGhlIHRvb2wgYmFyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7DQorCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigicmstc2V0dGluZ3MiKSk7DQorCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigicmstYWRkaXRpb25zIikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgdG8gdGhlIG1lbnUgYmFyIGEgbWVudSBhbmQgc29tZSBzZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zLA0KKwkgKiBhcyB3ZWxsIGFzIHRoZSBzdWItbWVudXMgZm9yIG9iamVjdCBjcmVhdGlvbiBpdGVtcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgew0KKwkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51TWFuYWdlcik7DQorDQorCQlJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoUmtFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUmtFZGl0b3JfbWVudSIpLCAib3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrTWVudUlEIik7DQorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOw0KKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInNldHRpbmdzIikpOw0KKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFjdGlvbnMiKSk7DQorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOw0KKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucy1lbmQiKSk7DQorDQorCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVDaGlsZCBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuDQorCQkvLw0KKwkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihSa0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7DQorCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIpOw0KKw0KKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlU2libGluZyBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuDQorCQkvLw0KKwkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKFJrRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOw0KKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIpOw0KKw0KKwkJLy8gRm9yY2UgYW4gdXBkYXRlIGJlY2F1c2UgRWNsaXBzZSBoaWRlcyBlbXB0eSBtZW51cyBub3cuDQorCQkvLw0KKwkJc3VibWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyDQorCQkJKG5ldyBJTWVudUxpc3RlbmVyKCkgew0KKwkJCQkgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgew0KKwkJCQkJIG1lbnVNYW5hZ2VyLnVwZGF0ZUFsbCh0cnVlKTsNCisJCQkJIH0NCisJCQkgfSk7DQorDQorCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsNCisJfQ0KKw0KKwkvKioNCisJICogV2hlbiB0aGUgYWN0aXZlIGVkaXRvciBjaGFuZ2VzLCB0aGlzIHJlbWVtYmVycyB0aGUgY2hhbmdlIGFuZCByZWdpc3RlcnMgd2l0aCBpdCBhcyBhIHNlbGVjdGlvbiBwcm92aWRlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkgew0KKwkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOw0KKwkJYWN0aXZlRWRpdG9yUGFydCA9IHBhcnQ7DQorDQorCQkvLyBTd2l0Y2ggdG8gdGhlIG5ldyBzZWxlY3Rpb24gcHJvdmlkZXIuDQorCQkvLw0KKwkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsNCisJCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7DQorCQl9DQorCQlpZiAocGFydCA9PSBudWxsKSB7DQorCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBwYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOw0KKwkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsNCisNCisJCQkvLyBGYWtlIGEgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgdG8gdXBkYXRlIHRoZSBtZW51cy4NCisJCQkvLw0KKwkJCWlmIChzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSAhPSBudWxsKSB7DQorCQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfSwNCisJICogaGFuZGxpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50fXMgYnkgcXVlcnlpbmcgZm9yIHRoZSBjaGlsZHJlbiBhbmQgc2libGluZ3MNCisJICogdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGVkIG9iamVjdCBhbmQgdXBkYXRpbmcgdGhlIG1lbnVzIGFjY29yZGluZ2x5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsNCisJCS8vIFJlbW92ZSBhbnkgbWVudSBpdGVtcyBmb3Igb2xkIHNlbGVjdGlvbi4NCisJCS8vDQorCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7DQorCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zKTsNCisJCX0NCisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgew0KKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMpOw0KKwkJfQ0KKw0KKwkJLy8gUXVlcnkgdGhlIG5ldyBzZWxlY3Rpb24gZm9yIGFwcHJvcHJpYXRlIG5ldyBjaGlsZC9zaWJsaW5nIGRlc2NyaXB0b3JzDQorCQkvLw0KKwkJQ29sbGVjdGlvbjw/PiBuZXdDaGlsZERlc2NyaXB0b3JzID0gbnVsbDsNCisJCUNvbGxlY3Rpb248Pz4gbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gbnVsbDsNCisNCisJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7DQorCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnNpemUoKSA9PSAxKSB7DQorCQkJT2JqZWN0IG9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsNCisNCisJCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7DQorDQorCQkJbmV3Q2hpbGREZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgbnVsbCk7DQorCQkJbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobnVsbCwgb2JqZWN0KTsNCisJCX0NCisNCisJCS8vIEdlbmVyYXRlIGFjdGlvbnMgZm9yIHNlbGVjdGlvbjsgcG9wdWxhdGUgYW5kIHJlZHJhdyB0aGUgbWVudXMuDQorCQkvLw0KKwkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMobmV3Q2hpbGREZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsNCisJCWNyZWF0ZVNpYmxpbmdBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhuZXdTaWJsaW5nRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7DQorDQorCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7DQorCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7DQorCQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7DQorCQl9DQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsNCisJCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7DQorCQkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LA0KKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMoQ29sbGVjdGlvbjw/PiBkZXNjcmlwdG9ycywgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsNCisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7DQorCQkJZm9yIChPYmplY3QgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7DQorCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVDaGlsZEFjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gYWN0aW9uczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sDQorCSAqIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7DQorCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgew0KKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgew0KKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlU2libGluZ0FjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gYWN0aW9uczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiB3aXRoIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zDQorCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sDQorCSAqIGJ5IGluc2VydGluZyB0aGVtIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGNvbnRyaWJ1dGlvbiBpdGVtIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPi4NCisJICogSWYgPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGV5IGFyZSBzaW1wbHkgYWRkZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucywgU3RyaW5nIGNvbnRyaWJ1dGlvbklEKSB7DQorCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7DQorCQkJZm9yIChJQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMpIHsNCisJCQkJaWYgKGNvbnRyaWJ1dGlvbklEICE9IG51bGwpIHsNCisJCQkJCW1hbmFnZXIuaW5zZXJ0QmVmb3JlKGNvbnRyaWJ1dGlvbklELCBhY3Rpb24pOw0KKwkJCQl9DQorCQkJCWVsc2Ugew0KKwkJCQkJbWFuYWdlci5hZGQoYWN0aW9uKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKwkJDQorCS8qKg0KKwkgKiBUaGlzIHJlbW92ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cw0KKwkgKiBiYXNlZCBvbiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucykgew0KKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgew0KKwkJCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtYW5hZ2VyLmdldEl0ZW1zKCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgew0KKwkJCQkvLyBMb29rIGludG8gU3ViQ29udHJpYnV0aW9uSXRlbXMNCisJCQkJLy8NCisJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uSXRlbSA9IGl0ZW1zW2ldOw0KKwkJCQl3aGlsZSAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIHsNCisJCQkJCWNvbnRyaWJ1dGlvbkl0ZW0gPSAoKFN1YkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0SW5uZXJJdGVtKCk7DQorCQkJCX0NCisNCisJCQkJLy8gRGVsZXRlIHRoZSBBY3Rpb25Db250cmlidXRpb25JdGVtcyB3aXRoIG1hdGNoaW5nIGFjdGlvbi4NCisJCQkJLy8NCisJCQkJaWYgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7DQorCQkJCQlJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSljb250cmlidXRpb25JdGVtKS5nZXRBY3Rpb24oKTsNCisJCQkJCWlmIChhY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsNCisJCQkJCQltYW5hZ2VyLnJlbW92ZShjb250cmlidXRpb25JdGVtKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHBvcC11cCBtZW51IGJlZm9yZSBpdCBhcHBlYXJzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsNCisJCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7DQorCQlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG51bGw7DQorDQorCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihSa0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7DQorCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7DQorCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7DQorDQorCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihSa0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsNCisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOw0KKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGluc2VydHMgZ2xvYmFsIGFjdGlvbnMgYmVmb3JlIHRoZSAiYWRkaXRpb25zLWVuZCIgc2VwYXJhdG9yLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7DQorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zLWVuZCIsIG5ldyBTZXBhcmF0b3IoInVpLWFjdGlvbnMiKSk7DQorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbik7DQorDQorCQlyZWZyZXNoVmlld2VyQWN0aW9uLnNldEVuYWJsZWQocmVmcmVzaFZpZXdlckFjdGlvbi5pc0VuYWJsZWQoKSk7CQkNCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgcmVmcmVzaFZpZXdlckFjdGlvbik7DQorDQorCQlzdXBlci5hZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBlbnN1cmVzIHRoYXQgYSBkZWxldGUgYWN0aW9uIHdpbGwgY2xlYW4gdXAgYWxsIHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBvYmplY3RzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUFsbFJlZmVyZW5jZXNPbkRlbGV0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL3ByZXNlbnRhdGlvbi9Sa0VkaXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvcHJlc2VudGF0aW9uL1JrRWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhY2NhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL3ByZXNlbnRhdGlvbi9Sa0VkaXRvci5qYXZhCkBAIC0wLDAgKzEsMTg1MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsucHJlc2VudGF0aW9uOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TYXZlQXNEaWFsb2c7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lUGFnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5WaWV3ZXJQYW5lOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLmVkaXRvci5Qcm9ibGVtRWRpdG9yUGFydDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVmFsaWRhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlJdGVtRGVsZWdhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5SZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmNlbGxlZGl0b3IuQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuTG9jYWxUcmFuc2ZlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLlZpZXdlckRyYWdBZGFwdGVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5VbndyYXBwaW5nU2VsZWN0aW9uUHJvdmlkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJTWFya2VySGVscGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSVV0aWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnZpZXcuRXh0ZW5kZWRQcm9wZXJ0eVNoZWV0UGFnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLnByb3ZpZGVyLlJrSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByb3ZpZGVyLk1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5wcm92aWRlci5Nb2RpZmllckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJvdmlkZXIuU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5wcm92aWRlci5TZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5wcm92aWRlci5Tb2x2ZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247DQorDQorDQorLyoqDQorICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgUmsgbW9kZWwgZWRpdG9yLg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK0BTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSANCitwdWJsaWMgY2xhc3MgUmtFZGl0b3INCisJZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0DQorCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5Qcm92aWRlciwgSVNlbGVjdGlvblByb3ZpZGVyLCBJTWVudUxpc3RlbmVyLCBJVmlld2VyUHJvdmlkZXIsIElHb3RvTWFya2VyIHsNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGVkaXRpbmcgZG9tYWluIHRoYXQgaXMgdXNlZCB0byB0cmFjayBhbGwgY2hhbmdlcyB0byB0aGUgbW9kZWwuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBvbmUgYWRhcHRlciBmYWN0b3J5IHVzZWQgZm9yIHByb3ZpZGluZyB2aWV3cyBvZiB0aGUgbW9kZWwuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElDb250ZW50T3V0bGluZVBhZ2UgY29udGVudE91dGxpbmVQYWdlOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyBhIGtsdWRnZS4uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBjb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UncyB2aWV3ZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBjb250ZW50T3V0bGluZVZpZXdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIHByb3BlcnR5IHNoZWV0IHBhZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSB2aWV3ZXIgdGhhdCBzaGFkb3dzIHRoZSBzZWxlY3Rpb24gaW4gdGhlIGNvbnRlbnQgb3V0bGluZS4NCisJICogVGhlIHBhcmVudCByZWxhdGlvbiBtdXN0IGJlIGNvcnJlY3RseSBkZWZpbmVkIGZvciB0aGlzIHRvIHdvcmsuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBzZWxlY3Rpb25WaWV3ZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGludmVydHMgdGhlIHJvbGwgb2YgcGFyZW50IGFuZCBjaGlsZCBpbiB0aGUgY29udGVudCBwcm92aWRlciBhbmQgc2hvdyBwYXJlbnRzIGFzIGEgdHJlZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBUcmVlVmlld2VyIHBhcmVudFZpZXdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgc2hvd3MgaG93IGEgdHJlZSB2aWV3IHdvcmtzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgc2hvd3MgaG93IGEgbGlzdCB2aWV3IHdvcmtzLg0KKwkgKiBBIGxpc3Qgdmlld2VyIGRvZXNuJ3Qgc3VwcG9ydCBpY29ucy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMaXN0Vmlld2VyIGxpc3RWaWV3ZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIHNob3dzIGhvdyBhIHRhYmxlIHZpZXcgd29ya3MuDQorCSAqIEEgdGFibGUgY2FuIGJlIHVzZWQgYXMgYSBsaXN0IHdpdGggaWNvbnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIHNob3dzIGhvdyBhIHRyZWUgdmlldyB3aXRoIGNvbHVtbnMgd29ya3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyV2l0aENvbHVtbnM7DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgdmlld2VyIHBhbmUsIGluIHRoZSBib29rLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFZpZXdlclBhbmUgY3VycmVudFZpZXdlclBhbmU7DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgY29udGVudCB2aWV3ZXIsIHdoaWNoIG1heSBiZSBlaXRoZXIgb25lIG9mIHRoZSB2aWV3ZXJzIGluIHRoZSBwYWdlcyBvciB0aGUgY29udGVudCBvdXRsaW5lIHZpZXdlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBWaWV3ZXIgY3VycmVudFZpZXdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgbGlzdGVucyB0byB3aGljaCBldmVyIHZpZXdlciBpcyBhY3RpdmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn1zIHRoYXQgYXJlIGxpc3RlbmluZyB0byB0aGlzIGVkaXRvci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+KCk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGVkaXRvciBhcyBhIHdob2xlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElTZWxlY3Rpb24gZWRpdG9yU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsNCisNCisJLyoqDQorCSAqIFRoZSBNYXJrZXJIZWxwZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHdvcmtzcGFjZSByZXNvdXJjZSBtYXJrZXJzIHByZXNlbnRlZA0KKwkgKiBpbiBFY2xpcHNlJ3MgUHJvYmxlbXMgVmlldy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNYXJrZXJIZWxwZXIgbWFya2VySGVscGVyID0gbmV3IEVkaXRVSU1hcmtlckhlbHBlcigpOw0KKw0KKwkvKioNCisJICogVGhpcyBsaXN0ZW5zIGZvciB3aGVuIHRoZSBvdXRsaW5lIGJlY29tZXMgYWN0aXZlDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPQ0KKwkJbmV3IElQYXJ0TGlzdGVuZXIoKSB7DQorCQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7DQorCQkJCWlmIChwIGluc3RhbmNlb2YgQ29udGVudE91dGxpbmUpIHsNCisJCQkJCWlmICgoKENvbnRlbnRPdXRsaW5lKXApLmdldEN1cnJlbnRQYWdlKCkgPT0gY29udGVudE91dGxpbmVQYWdlKSB7DQorCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoUmtFZGl0b3IudGhpcyk7DQorDQorCQkJCQkJc2V0Q3VycmVudFZpZXdlcihjb250ZW50T3V0bGluZVZpZXdlcik7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZWxzZSBpZiAocCBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpIHsNCisJCQkJCWlmICgoKFByb3BlcnR5U2hlZXQpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBwcm9wZXJ0eVNoZWV0UGFnZSkgew0KKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKFJrRWRpdG9yLnRoaXMpOw0KKwkJCQkJCWhhbmRsZUFjdGl2YXRlKCk7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZWxzZSBpZiAocCA9PSBSa0VkaXRvci50aGlzKSB7DQorCQkJCQloYW5kbGVBY3RpdmF0ZSgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcCkgew0KKwkJCQkvLyBJZ25vcmUuDQorCQkJfQ0KKwkJCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcCkgew0KKwkJCQkvLyBJZ25vcmUuDQorCQkJfQ0KKwkJCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7DQorCQkJCS8vIElnbm9yZS4NCisJCQl9DQorCQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwKSB7DQorCQkJCS8vIElnbm9yZS4NCisJCQl9DQorCQl9Ow0KKw0KKwkvKioNCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOw0KKw0KKwkvKioNCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOw0KKw0KKwkvKioNCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHNhdmVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHNhdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsNCisNCisJLyoqDQorCSAqIE1hcCB0byBzdG9yZSB0aGUgZGlhZ25vc3RpYyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+IHJlc291cmNlVG9EaWFnbm9zdGljTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+KCk7DQorDQorCS8qKg0KKwkgKiBDb250cm9scyB3aGV0aGVyIHRoZSBwcm9ibGVtIGluZGljYXRpb24gc2hvdWxkIGJlIHVwZGF0ZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7DQorDQorCS8qKg0KKwkgKiBBZGFwdGVyIHVzZWQgdG8gdXBkYXRlIHRoZSBwcm9ibGVtIGluZGljYXRpb24gd2hlbiByZXNvdXJjZXMgYXJlIGRlbWFuZGVkIGxvYWRlZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFQ29udGVudEFkYXB0ZXIgcHJvYmxlbUluZGljYXRpb25BZGFwdGVyID0gDQorCQluZXcgRUNvbnRlbnRBZGFwdGVyKCkgew0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBSZXNvdXJjZSkgew0KKwkJCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJlc291cmNlLmNsYXNzKSkgew0KKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRDoNCisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19FUlJPUlM6DQorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fV0FSTklOR1M6IHsNCisJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2Upbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7DQorCQkJCQkJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBudWxsKTsNCisJCQkJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7DQorCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGRpYWdub3N0aWMpOw0KKwkJCQkJCQl9DQorCQkJCQkJCWVsc2Ugew0KKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucmVtb3ZlKHJlc291cmNlKTsNCisJCQkJCQkJfQ0KKw0KKwkJCQkJCQlpZiAodXBkYXRlUHJvYmxlbUluZGljYXRpb24pIHsNCisJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMNCisJCQkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7DQorCQkJCQkJCQkJCSB9DQorCQkJCQkJCQkJIH0pOw0KKwkJCQkJCQl9DQorCQkJCQkJCWJyZWFrOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCQllbHNlIHsNCisJCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQlAT3ZlcnJpZGUNCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7DQorCQkJCWJhc2ljU2V0VGFyZ2V0KHRhcmdldCk7DQorCQkJfQ0KKw0KKwkJCUBPdmVycmlkZQ0KKwkJCXByb3RlY3RlZCB2b2lkIHVuc2V0VGFyZ2V0KFJlc291cmNlIHRhcmdldCkgew0KKwkJCQliYXNpY1Vuc2V0VGFyZ2V0KHRhcmdldCk7DQorCQkJfQ0KKwkJfTsNCisNCisJLyoqDQorCSAqIFRoaXMgbGlzdGVucyBmb3Igd29ya3NwYWNlIGNoYW5nZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9DQorCQluZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7DQorCQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7DQorCQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsNCisJCQkJdHJ5IHsNCisJCQkJCWNsYXNzIFJlc291cmNlRGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsNCisJCQkJCQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7DQorCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOw0KKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsNCisNCisJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgew0KKwkJCQkJCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsNCisJCQkJCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCB8fA0KKwkJCQkJCQkJICAgIGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIGRlbHRhLmdldEZsYWdzKCkgIT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUykgew0KKwkJCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSShkZWx0YS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLCBmYWxzZSk7DQorCQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsNCisJCQkJCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7DQorCQkJCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7DQorCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJZWxzZSBpZiAoIXNhdmVkUmVzb3VyY2VzLnJlbW92ZShyZXNvdXJjZSkpIHsNCisJCQkJCQkJCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsNCisJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCX0NCisJCQkJCQkJCX0NCisJCQkJCQkJfQ0KKw0KKwkJCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJCQl9DQorDQorCQkJCQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldENoYW5nZWRSZXNvdXJjZXMoKSB7DQorCQkJCQkJCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOw0KKwkJCQkJCX0NCisNCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsNCisJCQkJCQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKw0KKwkJCQkJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOw0KKwkJCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOw0KKw0KKwkJCQkJaWYgKCF2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsNCisJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKSk7DQorCQkJCQkJaWYgKCFpc0RpcnR5KCkpIHsNCisJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYw0KKwkJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsNCisJCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkgZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihSa0VkaXRvci50aGlzLCBmYWxzZSk7DQorCQkJCQkJCQkJIH0NCisJCQkJCQkJCSB9KTsNCisJCQkJCQl9DQorCQkJCQl9DQorDQorCQkJCQlpZiAoIXZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgew0KKwkJCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsNCisJCQkJCQlpZiAoZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSBSa0VkaXRvci50aGlzKSB7DQorCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMNCisJCQkJCQkJCShuZXcgUnVubmFibGUoKSB7DQorCQkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJIGhhbmRsZUFjdGl2YXRlKCk7DQorCQkJCQkJCQkJIH0NCisJCQkJCQkJCSB9KTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJCQlSa0VkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCQkJfQ0KKwkJCX0NCisJCX07DQorDQorCS8qKg0KKwkgKiBIYW5kbGVzIGFjdGl2YXRpb24gb2YgdGhlIGVkaXRvciBvciBpdCdzIGFzc29jaWF0ZWQgdmlld3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0ZSgpIHsNCisJCS8vIFJlY29tcHV0ZSB0aGUgcmVhZCBvbmx5IHN0YXRlLg0KKwkJLy8NCisJCWlmIChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpICE9IG51bGwpIHsNCisJCSAgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKS5jbGVhcigpOw0KKw0KKwkJICAvLyBSZWZyZXNoIGFueSBhY3Rpb25zIHRoYXQgbWF5IGJlY29tZSBlbmFibGVkIG9yIGRpc2FibGVkLg0KKwkJICAvLw0KKwkJICBzZXRTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpOw0KKwkJfQ0KKw0KKwkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgew0KKwkJCWlmIChoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpIHsNCisJCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihSa0VkaXRvci50aGlzLCBmYWxzZSk7DQorCQkJfQ0KKwkJCWVsc2Ugew0KKwkJCQlyZW1vdmVkUmVzb3VyY2VzLmNsZWFyKCk7DQorCQkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsNCisJCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsNCisJCQl9DQorCQl9DQorCQllbHNlIGlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsNCisJCQljaGFuZ2VkUmVzb3VyY2VzLnJlbW92ZUFsbChzYXZlZFJlc291cmNlcyk7DQorCQkJaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpOw0KKwkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsNCisJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBIYW5kbGVzIHdoYXQgdG8gZG8gd2l0aCBjaGFuZ2VkIHJlc291cmNlcyBvbiBhY3RpdmF0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpIHsNCisJCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkgJiYgKCFpc0RpcnR5KCkgfHwgaGFuZGxlRGlydHlDb25mbGljdCgpKSkgew0KKwkJCWlmIChpc0RpcnR5KCkpIHsNCisJCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsNCisJCQl9DQorCQkJZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOw0KKw0KKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7DQorCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGNoYW5nZWRSZXNvdXJjZXMpIHsNCisJCQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsNCisJCQkJCXJlc291cmNlLnVubG9hZCgpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlyZXNvdXJjZS5sb2FkKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7DQorCQkJCQl9DQorCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJCQkJaWYgKCFyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5jb250YWluc0tleShyZXNvdXJjZSkpIHsNCisJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJCWlmIChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4uaXNTdGFsZShlZGl0b3JTZWxlY3Rpb24pKSB7DQorCQkJCXNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsNCisJCQl9DQorDQorCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOw0KKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7DQorCQl9DQorCX0NCisgIA0KKwkvKioNCisJICogVXBkYXRlcyB0aGUgcHJvYmxlbXMgaW5kaWNhdGlvbiB3aXRoIHRoZSBpbmZvcm1hdGlvbiBkZXNjcmliZWQgaW4gdGhlIHNwZWNpZmllZCBkaWFnbm9zdGljLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKSB7DQorCQlpZiAodXBkYXRlUHJvYmxlbUluZGljYXRpb24pIHsNCisJCQlCYXNpY0RpYWdub3N0aWMgZGlhZ25vc3RpYyA9DQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMNCisJCQkJCShEaWFnbm9zdGljLk9LLA0KKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuZWRpdG9yIiwNCisJCQkJCSAwLA0KKwkJCQkJIG51bGwsDQorCQkJCQkgbmV3IE9iamVjdCBbXSB7IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSB9KTsNCisJCQlmb3IgKERpYWdub3N0aWMgY2hpbGREaWFnbm9zdGljIDogcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAudmFsdWVzKCkpIHsNCisJCQkJaWYgKGNoaWxkRGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsNCisJCQkJCWRpYWdub3N0aWMuYWRkKGNoaWxkRGlhZ25vc3RpYyk7DQorCQkJCX0NCisJCQl9DQorDQorCQkJaW50IGxhc3RFZGl0b3JQYWdlID0gZ2V0UGFnZUNvdW50KCkgLSAxOw0KKwkJCWlmIChsYXN0RWRpdG9yUGFnZSA+PSAwICYmIGdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkgaW5zdGFuY2VvZiBQcm9ibGVtRWRpdG9yUGFydCkgew0KKwkJCQkoKFByb2JsZW1FZGl0b3JQYXJ0KWdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkpLnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7DQorCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgew0KKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7DQorCQkJCX0NCisJCQl9DQorCQkJZWxzZSBpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsNCisJCQkJUHJvYmxlbUVkaXRvclBhcnQgcHJvYmxlbUVkaXRvclBhcnQgPSBuZXcgUHJvYmxlbUVkaXRvclBhcnQoKTsNCisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsNCisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0TWFya2VySGVscGVyKG1hcmtlckhlbHBlcik7DQorCQkJCXRyeSB7DQorCQkJCQlhZGRQYWdlKCsrbGFzdEVkaXRvclBhZ2UsIHByb2JsZW1FZGl0b3JQYXJ0LCBnZXRFZGl0b3JJbnB1dCgpKTsNCisJCQkJCXNldFBhZ2VUZXh0KGxhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydC5nZXRQYXJ0TmFtZSgpKTsNCisJCQkJCXNldEFjdGl2ZVBhZ2UobGFzdEVkaXRvclBhZ2UpOw0KKwkJCQkJc2hvd1RhYnMoKTsNCisJCQkJfQ0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJCQlSa0VkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQlpZiAobWFya2VySGVscGVyLmhhc01hcmtlcnMoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKSkgew0KKwkJCQltYXJrZXJIZWxwZXIuZGVsZXRlTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOw0KKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsNCisJCQkJCXRyeSB7DQorCQkJCQkJbWFya2VySGVscGVyLmNyZWF0ZU1hcmtlcnMoZGlhZ25vc3RpYyk7DQorCQkJCQl9DQorCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCQlSa0VkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogU2hvd3MgYSBkaWFsb2cgdGhhdCBhc2tzIGlmIGNvbmZsaWN0aW5nIGNoYW5nZXMgc2hvdWxkIGJlIGRpc2NhcmRlZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZURpcnR5Q29uZmxpY3QoKSB7DQorCQlyZXR1cm4NCisJCQlNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbg0KKwkJCQkoZ2V0U2l0ZSgpLmdldFNoZWxsKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9GaWxlQ29uZmxpY3RfbGFiZWwiKSwNCisJCQkJIGdldFN0cmluZygiX1dBUk5fRmlsZUNvbmZsaWN0IikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYSBtb2RlbCBlZGl0b3IuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUmtFZGl0b3IoKSB7DQorCQlzdXBlcigpOw0KKwkJaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBzZXRzIHVwIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1vZGVsIGVkaXRvci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFZGl0aW5nRG9tYWluKCkgew0KKwkJLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlpZWxkcyBpdGVtIHByb3ZpZGVycy4NCisJCS8vDQorCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkuRGVzY3JpcHRvci5SZWdpc3RyeS5JTlNUQU5DRSk7DQorDQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSa0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IENvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEdyYXBoSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RpZmllckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU29sdmVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorDQorCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUgZXhlY3V0ZWQuDQorCQkvLw0KKwkJQmFzaWNDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrID0gbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCk7DQorDQorCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLg0KKwkJLy8NCisJCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcg0KKwkJCShuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7DQorCQkJCSBwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGZpbmFsIEV2ZW50T2JqZWN0IGV2ZW50KSB7DQorCQkJCQkgZ2V0Q29udGFpbmVyKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYw0KKwkJCQkJCSAobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJCQkgIHB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCSAgZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOw0KKw0KKwkJCQkJCQkJICAvLyBUcnkgdG8gc2VsZWN0IHRoZSBhZmZlY3RlZCBvYmplY3RzLg0KKwkJCQkJCQkJICAvLw0KKwkJCQkJCQkJICBDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spZXZlbnQuZ2V0U291cmNlKCkpLmdldE1vc3RSZWNlbnRDb21tYW5kKCk7DQorCQkJCQkJCQkgIGlmIChtb3N0UmVjZW50Q29tbWFuZCAhPSBudWxsKSB7DQorCQkJCQkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihtb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7DQorCQkJCQkJCQkgIH0NCisJCQkJCQkJCSAgaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwgJiYgIXByb3BlcnR5U2hlZXRQYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsNCisJCQkJCQkJCQkgIHByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsNCisJCQkJCQkJCSAgfQ0KKwkJCQkJCQkgIH0NCisJCQkJCQkgIH0pOw0KKwkJCQkgfQ0KKwkJCSB9KTsNCisNCisJCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4NCisJCS8vDQorCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgQm9vbGVhbj4oKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgaGVyZSBmb3IgdGhlIGxpc3RlbmVyIHRvIGJlIGFibGUgdG8gY2FsbCBpdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCQkJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgYWN0aW9uKSB7DQorCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UoYWN0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBzZXRzIHRoZSBzZWxlY3Rpb24gaW50byB3aGljaGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgew0KKwkJZmluYWwgQ29sbGVjdGlvbjw/PiB0aGVTZWxlY3Rpb24gPSBjb2xsZWN0aW9uOw0KKwkJLy8gTWFrZSBzdXJlIGl0J3Mgb2theS4NCisJCS8vDQorCQlpZiAodGhlU2VsZWN0aW9uICE9IG51bGwgJiYgIXRoZVNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCisJCQkvLyBJIGRvbid0IGtub3cgaWYgdGhpcyBzaG91bGQgYmUgcnVuIHRoaXMgZGVmZXJyZWQNCisJCQkvLyBiZWNhdXNlIHdlIG1pZ2h0IGhhdmUgdG8gZ2l2ZSB0aGUgZWRpdG9yIGEgY2hhbmNlIHRvIHByb2Nlc3MgdGhlIHZpZXdlciB1cGRhdGUgZXZlbnRzDQorCQkJLy8gYW5kIGhlbmNlIHRvIHVwZGF0ZSB0aGUgdmlld3MgZmlyc3QuDQorCQkJLy8NCisJCQkvLw0KKwkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0NCisJCQkJbmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGl0ZW1zIGluIHRoZSBjdXJyZW50IGNvbnRlbnQgdmlld2VyIG9mIHRoZSBlZGl0b3IuDQorCQkJCQkJLy8NCisJCQkJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7DQorCQkJCQkJCWN1cnJlbnRWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoZVNlbGVjdGlvbi50b0FycmF5KCkpLCB0cnVlKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX07DQorCQkJcnVubmFibGUucnVuKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgZWRpdGluZyBkb21haW4gYXMgcmVxdWlyZWQgYnkgdGhlIHtAbGluayBJRWRpdGluZ0RvbWFpblByb3ZpZGVyfSBpbnRlcmZhY2UuDQorCSAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBpbXBsZW1lbnRpbmcgdGhlIHN0YXRpYyBtZXRob2RzIG9mIHtAbGluayBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW59DQorCSAqIGFuZCBmb3Igc3VwcG9ydGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb259Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsNCisJCXJldHVybiBlZGl0aW5nRG9tYWluOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHVibGljIE9iamVjdCBbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7DQorCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOw0KKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHVibGljIE9iamVjdCBbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7DQorCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOw0KKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgew0KKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsNCisJCQlyZXR1cm4gcGFyZW50ICE9IG51bGw7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJQE92ZXJyaWRlDQorCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vmlld2VyUGFuZShWaWV3ZXJQYW5lIHZpZXdlclBhbmUpIHsNCisJCWlmIChjdXJyZW50Vmlld2VyUGFuZSAhPSB2aWV3ZXJQYW5lKSB7DQorCQkJaWYgKGN1cnJlbnRWaWV3ZXJQYW5lICE9IG51bGwpIHsNCisJCQkJY3VycmVudFZpZXdlclBhbmUuc2hvd0ZvY3VzKGZhbHNlKTsNCisJCQl9DQorCQkJY3VycmVudFZpZXdlclBhbmUgPSB2aWV3ZXJQYW5lOw0KKwkJfQ0KKwkJc2V0Q3VycmVudFZpZXdlcihjdXJyZW50Vmlld2VyUGFuZS5nZXRWaWV3ZXIoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG9uZSBjb250ZW50IHZpZXdlciwgZWl0aGVyIGZvciB0aGUgY3VycmVudCBwYWdlIG9yIHRoZSBvdXRsaW5lIHZpZXcsIGlmIGl0IGhhcyBmb2N1cywNCisJICogaXMgdGhlIGN1cnJlbnQgb25lLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0Q3VycmVudFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7DQorCQkvLyBJZiBpdCBpcyBjaGFuZ2luZy4uLg0KKwkJLy8NCisJCWlmIChjdXJyZW50Vmlld2VyICE9IHZpZXdlcikgew0KKwkJCWlmIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgew0KKwkJCQkvLyBDcmVhdGUgdGhlIGxpc3RlbmVyIG9uIGRlbWFuZC4NCisJCQkJLy8NCisJCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0NCisJCQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgew0KKwkJCQkJCS8vIFRoaXMganVzdCBub3RpZmllcyB0aG9zZSB0aGluZ3MgdGhhdCBhcmUgYWZmZWN0ZWQgYnkgdGhlIHNlY3Rpb24uDQorCQkJCQkJLy8NCisJCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBzZWxlY3Rpb25DaGFuZ2VkRXZlbnQpIHsNCisJCQkJCQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkNoYW5nZWRFdmVudC5nZXRTZWxlY3Rpb24oKSk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQl9DQorDQorCQkJLy8gU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG9sZCBvbmUuDQorCQkJLy8NCisJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7DQorCQkJCWN1cnJlbnRWaWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7DQorCQkJfQ0KKw0KKwkJCS8vIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmV3IG9uZS4NCisJCQkvLw0KKwkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgew0KKwkJCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7DQorCQkJfQ0KKw0KKwkJCS8vIFJlbWVtYmVyIGl0Lg0KKwkJCS8vDQorCQkJY3VycmVudFZpZXdlciA9IHZpZXdlcjsNCisNCisJCQkvLyBTZXQgdGhlIGVkaXRvcnMgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdlcidzIHNlbGVjdGlvbi4NCisJCQkvLw0KKwkJCXNldFNlbGVjdGlvbihjdXJyZW50Vmlld2VyID09IG51bGwgPyBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZIDogY3VycmVudFZpZXdlci5nZXRTZWxlY3Rpb24oKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgdmlld2VyIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSVZpZXdlclByb3ZpZGVyfSBpbnRlcmZhY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsNCisJCXJldHVybiBjdXJyZW50Vmlld2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIgYW5kIGFkZHMgYSBsaXN0ZW5lciBhcyB3ZWxsIHJlZ2lzdGVyaW5nIHRoZSBtZW51IGZvciBleHRlbnNpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgew0KKwkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOw0KKwkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsNCisJCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsNCisJCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsNCisJCU1lbnUgbWVudT0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7DQorCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7DQorCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgbmV3IFVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcih2aWV3ZXIpKTsNCisNCisJCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LOw0KKwkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9Ow0KKwkJdmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyYWdBZGFwdGVyKHZpZXdlcikpOw0KKwkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIGNhbGxlZCB0byBsb2FkIGEgcmVzb3VyY2UgaW50byB0aGUgZWRpdGluZyBkb21haW4ncyByZXNvdXJjZSBzZXQgYmFzZWQgb24gdGhlIGVkaXRvcidzIGlucHV0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgY3JlYXRlTW9kZWwoKSB7DQorCQlVUkkgcmVzb3VyY2VVUkkgPSBFZGl0VUlVdGlsLmdldFVSSShnZXRFZGl0b3JJbnB1dCgpKTsNCisJCUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOw0KKwkJdHJ5IHsNCisJCQkvLyBMb2FkIHRoZSByZXNvdXJjZSB0aHJvdWdoIHRoZSBlZGl0aW5nIGRvbWFpbi4NCisJCQkvLw0KKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCB0cnVlKTsNCisJCX0NCisJCWNhdGNoIChFeGNlcHRpb24gZSkgew0KKwkJCWV4Y2VwdGlvbiA9IGU7DQorCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIGZhbHNlKTsNCisJCX0NCisNCisJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pOw0KKwkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7DQorCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCAgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOw0KKwkJfQ0KKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgZGlhZ25vc3RpYyBkZXNjcmliaW5nIHRoZSBlcnJvcnMgYW5kIHdhcm5pbmdzIGxpc3RlZCBpbiB0aGUgcmVzb3VyY2UNCisJICogYW5kIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIChpZiBhbnkpLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIERpYWdub3N0aWMgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMoUmVzb3VyY2UgcmVzb3VyY2UsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCWlmICghcmVzb3VyY2UuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpIHx8ICFyZXNvdXJjZS5nZXRXYXJuaW5ncygpLmlzRW1wdHkoKSkgew0KKwkJCUJhc2ljRGlhZ25vc3RpYyBiYXNpY0RpYWdub3N0aWMgPQ0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljDQorCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwNCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLmVkaXRvciIsDQorCQkJCQkgMCwNCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksDQorCQkJCQkgbmV3IE9iamVjdCBbXSB7IGV4Y2VwdGlvbiA9PSBudWxsID8gKE9iamVjdClyZXNvdXJjZSA6IGV4Y2VwdGlvbiB9KTsNCisJCQliYXNpY0RpYWdub3N0aWMubWVyZ2UoRWNvcmVVdGlsLmNvbXB1dGVEaWFnbm9zdGljKHJlc291cmNlLCB0cnVlKSk7DQorCQkJcmV0dXJuIGJhc2ljRGlhZ25vc3RpYzsNCisJCX0NCisJCWVsc2UgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7DQorCQkJcmV0dXJuDQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMNCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLA0KKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuZWRpdG9yIiwNCisJCQkJCSAwLA0KKwkJCQkJIGdldFN0cmluZygiX1VJX0NyZWF0ZU1vZGVsRXJyb3JfbWVzc2FnZSIsIHJlc291cmNlLmdldFVSSSgpKSwNCisJCQkJCSBuZXcgT2JqZWN0W10geyBleGNlcHRpb24gfSk7DQorCQl9DQorCQllbHNlIHsNCisJCQlyZXR1cm4gRGlhZ25vc3RpYy5PS19JTlNUQU5DRTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBpbnN0YWxsIHlvdXIgb3duIGNvbnRyb2xzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VzKCkgew0KKwkJLy8gQ3JlYXRlcyB0aGUgbW9kZWwgZnJvbSB0aGUgZWRpdG9yIGlucHV0DQorCQkvLw0KKwkJY3JlYXRlTW9kZWwoKTsNCisNCisJCS8vIE9ubHkgY3JlYXRlcyB0aGUgb3RoZXIgcGFnZXMgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGVkaXRlZA0KKwkJLy8NCisJCWlmICghZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7DQorCQkJLy8gQ3JlYXRlIGEgcGFnZSBmb3IgdGhlIHNlbGVjdGlvbiB0cmVlIHZpZXcuDQorCQkJLy8NCisJCQl7DQorCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9DQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBSa0VkaXRvci50aGlzKSB7DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgew0KKwkJCQkJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShjb21wb3NpdGUsIFNXVC5NVUxUSSk7DQorCQkJCQkJCVRyZWVWaWV3ZXIgbmV3VHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOw0KKwkJCQkJCQlyZXR1cm4gbmV3VHJlZVZpZXdlcjsNCisJCQkJCQl9DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7DQorCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7DQorCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOw0KKwkJCQkJCX0NCisJCQkJCX07DQorCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7DQorDQorCQkJCXNlbGVjdGlvblZpZXdlciA9IChUcmVlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7DQorCQkJCXNlbGVjdGlvblZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorDQorCQkJCXNlbGVjdGlvblZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7DQorCQkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOw0KKwkJCQl2aWV3ZXJQYW5lLnNldFRpdGxlKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7DQorDQorCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3Ioc2VsZWN0aW9uVmlld2VyLmdldFRyZWUoKSwgYWRhcHRlckZhY3RvcnkpOw0KKw0KKwkJCQljcmVhdGVDb250ZXh0TWVudUZvcihzZWxlY3Rpb25WaWV3ZXIpOw0KKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7DQorCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsNCisJCQl9DQorDQorCQkJLy8gQ3JlYXRlIGEgcGFnZSBmb3IgdGhlIHBhcmVudCB0cmVlIHZpZXcuDQorCQkJLy8NCisJCQl7DQorCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9DQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBSa0VkaXRvci50aGlzKSB7DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgew0KKwkJCQkJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShjb21wb3NpdGUsIFNXVC5NVUxUSSk7DQorCQkJCQkJCVRyZWVWaWV3ZXIgbmV3VHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOw0KKwkJCQkJCQlyZXR1cm4gbmV3VHJlZVZpZXdlcjsNCisJCQkJCQl9DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7DQorCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7DQorCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOw0KKwkJCQkJCX0NCisJCQkJCX07DQorCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7DQorDQorCQkJCXBhcmVudFZpZXdlciA9IChUcmVlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7DQorCQkJCXBhcmVudFZpZXdlci5zZXRBdXRvRXhwYW5kTGV2ZWwoMzApOw0KKwkJCQlwYXJlbnRWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJcGFyZW50Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKw0KKwkJCQljcmVhdGVDb250ZXh0TWVudUZvcihwYXJlbnRWaWV3ZXIpOw0KKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7DQorCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfUGFyZW50UGFnZV9sYWJlbCIpKTsNCisJCQl9DQorDQorCQkJLy8gVGhpcyBpcyB0aGUgcGFnZSBmb3IgdGhlIGxpc3Qgdmlld2VyDQorCQkJLy8NCisJCQl7DQorCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9DQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBSa0VkaXRvci50aGlzKSB7DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgew0KKwkJCQkJCQlyZXR1cm4gbmV3IExpc3RWaWV3ZXIoY29tcG9zaXRlKTsNCisJCQkJCQl9DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7DQorCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7DQorCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOw0KKwkJCQkJCX0NCisJCQkJCX07DQorCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7DQorCQkJCWxpc3RWaWV3ZXIgPSAoTGlzdFZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOw0KKwkJCQlsaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJbGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisNCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IobGlzdFZpZXdlcik7DQorCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsNCisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9MaXN0UGFnZV9sYWJlbCIpKTsNCisJCQl9DQorDQorCQkJLy8gVGhpcyBpcyB0aGUgcGFnZSBmb3IgdGhlIHRyZWUgdmlld2VyDQorCQkJLy8NCisJCQl7DQorCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9DQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBSa0VkaXRvci50aGlzKSB7DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgew0KKwkJCQkJCQlyZXR1cm4gbmV3IFRyZWVWaWV3ZXIoY29tcG9zaXRlKTsNCisJCQkJCQl9DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7DQorCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7DQorCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOw0KKwkJCQkJCX0NCisJCQkJCX07DQorCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7DQorCQkJCXRyZWVWaWV3ZXIgPSAoVHJlZVZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOw0KKwkJCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisNCisJCQkJbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcih0cmVlVmlld2VyLmdldFRyZWUoKSwgYWRhcHRlckZhY3RvcnkpOw0KKw0KKwkJCQljcmVhdGVDb250ZXh0TWVudUZvcih0cmVlVmlld2VyKTsNCisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOw0KKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1RyZWVQYWdlX2xhYmVsIikpOw0KKwkJCX0NCisNCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgdGFibGUgdmlld2VyLg0KKwkJCS8vDQorCQkJew0KKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQ0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgUmtFZGl0b3IudGhpcykgew0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsNCisJCQkJCQkJcmV0dXJuIG5ldyBUYWJsZVZpZXdlcihjb21wb3NpdGUpOw0KKwkJCQkJCX0NCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsNCisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsNCisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsNCisJCQkJdGFibGVWaWV3ZXIgPSAoVGFibGVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsNCisNCisJCQkJVGFibGUgdGFibGUgPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpOw0KKwkJCQlUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsNCisJCQkJdGFibGUuc2V0TGF5b3V0KGxheW91dCk7DQorCQkJCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7DQorCQkJCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsNCisNCisJCQkJVGFibGVDb2x1bW4gb2JqZWN0Q29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7DQorCQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDMsIDEwMCwgdHJ1ZSkpOw0KKwkJCQlvYmplY3RDb2x1bW4uc2V0VGV4dChnZXRTdHJpbmcoIl9VSV9PYmplY3RDb2x1bW5fbGFiZWwiKSk7DQorCQkJCW9iamVjdENvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7DQorDQorCQkJCVRhYmxlQ29sdW1uIHNlbGZDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsNCisJCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMiwgMTAwLCB0cnVlKSk7DQorCQkJCXNlbGZDb2x1bW4uc2V0VGV4dChnZXRTdHJpbmcoIl9VSV9TZWxmQ29sdW1uX2xhYmVsIikpOw0KKwkJCQlzZWxmQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsNCisNCisJCQkJdGFibGVWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nIFtdIHsiYSIsICJiIn0pOw0KKwkJCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorCQkJCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKw0KKwkJCQljcmVhdGVDb250ZXh0TWVudUZvcih0YWJsZVZpZXdlcik7DQorCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsNCisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9UYWJsZVBhZ2VfbGFiZWwiKSk7DQorCQkJfQ0KKw0KKwkJCS8vIFRoaXMgaXMgdGhlIHBhZ2UgZm9yIHRoZSB0YWJsZSB0cmVlIHZpZXdlci4NCisJCQkvLw0KKwkJCXsNCisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0NCisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIFJrRWRpdG9yLnRoaXMpIHsNCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7DQorCQkJCQkJCXJldHVybiBuZXcgVHJlZVZpZXdlcihjb21wb3NpdGUpOw0KKwkJCQkJCX0NCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsNCisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsNCisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsNCisNCisJCQkJdHJlZVZpZXdlcldpdGhDb2x1bW5zID0gKFRyZWVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsNCisNCisJCQkJVHJlZSB0cmVlID0gdHJlZVZpZXdlcldpdGhDb2x1bW5zLmdldFRyZWUoKTsNCisJCQkJdHJlZS5zZXRMYXlvdXREYXRhKG5ldyBGaWxsTGF5b3V0KCkpOw0KKwkJCQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7DQorCQkJCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOw0KKw0KKwkJCQlUcmVlQ29sdW1uIG9iamVjdENvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsNCisJCQkJb2JqZWN0Q29sdW1uLnNldFRleHQoZ2V0U3RyaW5nKCJfVUlfT2JqZWN0Q29sdW1uX2xhYmVsIikpOw0KKwkJCQlvYmplY3RDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOw0KKwkJCQlvYmplY3RDb2x1bW4uc2V0V2lkdGgoMjUwKTsNCisNCisJCQkJVHJlZUNvbHVtbiBzZWxmQ29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOw0KKwkJCQlzZWxmQ29sdW1uLnNldFRleHQoZ2V0U3RyaW5nKCJfVUlfU2VsZkNvbHVtbl9sYWJlbCIpKTsNCisJCQkJc2VsZkNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7DQorCQkJCXNlbGZDb2x1bW4uc2V0V2lkdGgoMjAwKTsNCisNCisJCQkJdHJlZVZpZXdlcldpdGhDb2x1bW5zLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZyBbXSB7ImEiLCAiYiJ9KTsNCisJCQkJdHJlZVZpZXdlcldpdGhDb2x1bW5zLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJdHJlZVZpZXdlcldpdGhDb2x1bW5zLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKw0KKwkJCQljcmVhdGVDb250ZXh0TWVudUZvcih0cmVlVmlld2VyV2l0aENvbHVtbnMpOw0KKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7DQorCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfVHJlZVdpdGhDb2x1bW5zUGFnZV9sYWJlbCIpKTsNCisJCQl9DQorDQorCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYw0KKwkJCQkobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkgc2V0QWN0aXZlUGFnZSgwKTsNCisJCQkJCSB9DQorCQkJCSB9KTsNCisJCX0NCisNCisJCS8vIEVuc3VyZXMgdGhhdCB0aGlzIGVkaXRvciB3aWxsIG9ubHkgZGlzcGxheSB0aGUgcGFnZSdzIHRhYg0KKwkJLy8gYXJlYSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBwYWdlDQorCQkvLw0KKwkJZ2V0Q29udGFpbmVyKCkuYWRkQ29udHJvbExpc3RlbmVyDQorCQkJKG5ldyBDb250cm9sQWRhcHRlcigpIHsNCisJCQkJYm9vbGVhbiBndWFyZCA9IGZhbHNlOw0KKwkJCQlAT3ZlcnJpZGUNCisJCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7DQorCQkJCQlpZiAoIWd1YXJkKSB7DQorCQkJCQkJZ3VhcmQgPSB0cnVlOw0KKwkJCQkJCWhpZGVUYWJzKCk7DQorCQkJCQkJZ3VhcmQgPSBmYWxzZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCSB9KTsNCisNCisJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMNCisJCQkobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkgcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7DQorCQkJCSB9DQorCQkJIH0pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBJZiB0aGVyZSBpcyBqdXN0IG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LA0KKwkgKiB0aGlzIGhpZGVzIHRoZSBzaW5nbGUgdGFiIGF0IHRoZSBib3R0b20uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoaWRlVGFicygpIHsNCisJCWlmIChnZXRQYWdlQ291bnQoKSA8PSAxKSB7DQorCQkJc2V0UGFnZVRleHQoMCwgIiIpOw0KKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsNCisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoMSk7DQorCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOw0KKwkJCQlnZXRDb250YWluZXIoKS5zZXRTaXplKHBvaW50LngsIHBvaW50LnkgKyA2KTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGFnZSBpbiB0aGUgbXVsdGktcGFnZSBlZGl0b3IgcGFydCwNCisJICogdGhpcyBzaG93cyB0aGUgdGFicyBhdCB0aGUgYm90dG9tLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2hvd1RhYnMoKSB7DQorCQlpZiAoZ2V0UGFnZUNvdW50KCkgPiAxKSB7DQorCQkJc2V0UGFnZVRleHQoMCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsNCisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7DQorCQkJCSgoQ1RhYkZvbGRlcilnZXRDb250YWluZXIoKSkuc2V0VGFiSGVpZ2h0KFNXVC5ERUZBVUxUKTsNCisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7DQorCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSAtIDYpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyB1c2VkIHRvIHRyYWNrIHRoZSBhY3RpdmUgdmlld2VyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IHBhZ2VJbmRleCkgew0KKwkJc3VwZXIucGFnZUNoYW5nZShwYWdlSW5kZXgpOw0KKw0KKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7DQorCQkJaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oY29udGVudE91dGxpbmVQYWdlLmdldFNlbGVjdGlvbigpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyBob3cgdGhlIGZyYW1ld29yayBkZXRlcm1pbmVzIHdoaWNoIGludGVyZmFjZXMgd2UgaW1wbGVtZW50Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7DQorCQlpZiAoa2V5LmVxdWFscyhJQ29udGVudE91dGxpbmVQYWdlLmNsYXNzKSkgew0KKwkJCXJldHVybiBzaG93T3V0bGluZVZpZXcoKSA/IGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIDogbnVsbDsNCisJCX0NCisJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzKSkgew0KKwkJCXJldHVybiBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOw0KKwkJfQ0KKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhJR290b01hcmtlci5jbGFzcykpIHsNCisJCQlyZXR1cm4gdGhpczsNCisJCX0NCisJCWVsc2Ugew0KKwkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGtleSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWNjZXNzZXMgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUgY29udGVudCBvdXRsaW5lci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudE91dGxpbmVQYWdlIGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIHsNCisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgPT0gbnVsbCkgew0KKwkJCS8vIFRoZSBjb250ZW50IG91dGxpbmUgaXMganVzdCBhIHRyZWUuDQorCQkJLy8NCisJCQljbGFzcyBNeUNvbnRlbnRPdXRsaW5lUGFnZSBleHRlbmRzIENvbnRlbnRPdXRsaW5lUGFnZSB7DQorCQkJCUBPdmVycmlkZQ0KKwkJCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCisJCQkJCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsNCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyID0gZ2V0VHJlZVZpZXdlcigpOw0KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOw0KKw0KKwkJCQkJLy8gU2V0IHVwIHRoZSB0cmVlIHZpZXdlci4NCisJCQkJCS8vDQorCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7DQorDQorCQkJCQkvLyBNYWtlIHN1cmUgb3VyIHBvcHVwcyB3b3JrLg0KKwkJCQkJLy8NCisJCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKGNvbnRlbnRPdXRsaW5lVmlld2VyKTsNCisNCisJCQkJCWlmICghZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgew0KKwkJCQkJICAvLyBTZWxlY3QgdGhlIHJvb3Qgb2JqZWN0IGluIHRoZSB2aWV3Lg0KKwkJCQkJICAvLw0KKwkJCQkJICBjb250ZW50T3V0bGluZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCUBPdmVycmlkZQ0KKwkJCQlwdWJsaWMgdm9pZCBtYWtlQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyKSB7DQorCQkJCQlzdXBlci5tYWtlQ29udHJpYnV0aW9ucyhtZW51TWFuYWdlciwgdG9vbEJhck1hbmFnZXIsIHN0YXR1c0xpbmVNYW5hZ2VyKTsNCisJCQkJCWNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXIgPSBzdGF0dXNMaW5lTWFuYWdlcjsNCisJCQkJfQ0KKw0KKwkJCQlAT3ZlcnJpZGUNCisJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7DQorCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOw0KKwkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7DQorCQkJCX0NCisJCQl9DQorDQorCQkJY29udGVudE91dGxpbmVQYWdlID0gbmV3IE15Q29udGVudE91dGxpbmVQYWdlKCk7DQorDQorCQkJLy8gTGlzdGVuIHRvIHNlbGVjdGlvbiBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgaXQgaXMgYSBzcGVjaWFsIHdheS4NCisJCQkvLw0KKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXINCisJCQkJKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgew0KKwkJCQkJIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGhhbmRsZSBzZWxlY3Rpb25zIGNvcnJlY3RseS4NCisJCQkJCSAvLw0KKwkJCQkJIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7DQorCQkJCQkJIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsNCisJCQkJCSB9DQorCQkJCSB9KTsNCisJCX0NCisNCisJCXJldHVybiBjb250ZW50T3V0bGluZVBhZ2U7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWNjZXNzZXMgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUgcHJvcGVydHkgc2hlZXQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVByb3BlcnR5U2hlZXRQYWdlIGdldFByb3BlcnR5U2hlZXRQYWdlKCkgew0KKwkJaWYgKHByb3BlcnR5U2hlZXRQYWdlID09IG51bGwpIHsNCisJCQlwcm9wZXJ0eVNoZWV0UGFnZSA9DQorCQkJCW5ldyBFeHRlbmRlZFByb3BlcnR5U2hlZXRQYWdlKGVkaXRpbmdEb21haW4pIHsNCisJCQkJCUBPdmVycmlkZQ0KKwkJCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoTGlzdDw/PiBzZWxlY3Rpb24pIHsNCisJCQkJCQlSa0VkaXRvci50aGlzLnNldFNlbGVjdGlvblRvVmlld2VyKHNlbGVjdGlvbik7DQorCQkJCQkJUmtFZGl0b3IudGhpcy5zZXRGb2N1cygpOw0KKwkJCQkJfQ0KKw0KKwkJCQkJQE92ZXJyaWRlDQorCQkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsNCisJCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOw0KKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOw0KKwkJCQkJfQ0KKwkJCQl9Ow0KKwkJCXByb3BlcnR5U2hlZXRQYWdlLnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorCQl9DQorDQorCQlyZXR1cm4gcHJvcGVydHlTaGVldFBhZ2U7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgZGVhbHMgd2l0aCBob3cgd2Ugd2FudCBzZWxlY3Rpb24gaW4gdGhlIG91dGxpbmVyIHRvIGFmZmVjdCB0aGUgb3RoZXIgdmlld3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJaWYgKGN1cnJlbnRWaWV3ZXJQYW5lICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsNCisJCQlJdGVyYXRvcjw/PiBzZWxlY3RlZEVsZW1lbnRzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLml0ZXJhdG9yKCk7DQorCQkJaWYgKHNlbGVjdGVkRWxlbWVudHMuaGFzTmV4dCgpKSB7DQorCQkJCS8vIEdldCB0aGUgZmlyc3Qgc2VsZWN0ZWQgZWxlbWVudC4NCisJCQkJLy8NCisJCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHMubmV4dCgpOw0KKw0KKwkJCQkvLyBJZiBpdCdzIHRoZSBzZWxlY3Rpb24gdmlld2VyLCB0aGVuIHdlIHdhbnQgaXQgdG8gc2VsZWN0IHRoZSBzYW1lIHNlbGVjdGlvbiBhcyB0aGlzIHNlbGVjdGlvbi4NCisJCQkJLy8NCisJCQkJaWYgKGN1cnJlbnRWaWV3ZXJQYW5lLmdldFZpZXdlcigpID09IHNlbGVjdGlvblZpZXdlcikgew0KKwkJCQkJQXJyYXlMaXN0PE9iamVjdD4gc2VsZWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KKwkJCQkJc2VsZWN0aW9uTGlzdC5hZGQoc2VsZWN0ZWRFbGVtZW50KTsNCisJCQkJCXdoaWxlIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgew0KKwkJCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudHMubmV4dCgpKTsNCisJCQkJCX0NCisNCisJCQkJCS8vIFNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSB3aWRnZXQuDQorCQkJCQkvLw0KKwkJCQkJc2VsZWN0aW9uVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb25MaXN0KSk7DQorCQkJCX0NCisJCQkJZWxzZSB7DQorCQkJCQkvLyBTZXQgdGhlIGlucHV0IHRvIHRoZSB3aWRnZXQuDQorCQkJCQkvLw0KKwkJCQkJaWYgKGN1cnJlbnRWaWV3ZXJQYW5lLmdldFZpZXdlcigpLmdldElucHV0KCkgIT0gc2VsZWN0ZWRFbGVtZW50KSB7DQorCQkJCQkJY3VycmVudFZpZXdlclBhbmUuZ2V0Vmlld2VyKCkuc2V0SW5wdXQoc2VsZWN0ZWRFbGVtZW50KTsNCisJCQkJCQljdXJyZW50Vmlld2VyUGFuZS5zZXRUaXRsZShzZWxlY3RlZEVsZW1lbnQpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHRlc3RzIHRoZSBjb21tYW5kIHN0YWNrLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7DQorCQlyZXR1cm4gKChCYXNpY0NvbW1hbmRTdGFjayllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5pc1NhdmVOZWVkZWQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSBzYXZlcyB0aGUgbW9kZWwgZmlsZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsNCisJCS8vIFNhdmUgb25seSByZXNvdXJjZXMgdGhhdCBoYXZlIGFjdHVhbGx5IGNoYW5nZWQuDQorCQkvLw0KKwkJZmluYWwgTWFwPE9iamVjdCwgT2JqZWN0PiBzYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOw0KKwkJc2F2ZU9wdGlvbnMucHV0KFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRCwgUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOw0KKw0KKwkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbiBiZWNhdXNlIHRoaXMgaXMgYSBsb25nIHJ1bm5pbmcgYWN0aXZpdHkgdGhhdCBtb2RpZmllcyB0aGUgd29ya2JlbmNoLg0KKwkJLy8NCisJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPQ0KKwkJCW5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7DQorCQkJCS8vIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IGdldHMgaW52b2tlZCB3aGVuIHRoZSBvcGVyYXRpb24gcnVucy4NCisJCQkJLy8NCisJCQkJQE92ZXJyaWRlDQorCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQorCQkJCQkvLyBTYXZlIHRoZSByZXNvdXJjZXMgdG8gdGhlIGZpbGUgc3lzdGVtLg0KKwkJCQkJLy8NCisJCQkJCWJvb2xlYW4gZmlyc3QgPSB0cnVlOw0KKwkJCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSkgew0KKwkJCQkJCWlmICgoZmlyc3QgfHwgIXJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpIHx8IGlzUGVyc2lzdGVkKHJlc291cmNlKSkgJiYgIWVkaXRpbmdEb21haW4uaXNSZWFkT25seShyZXNvdXJjZSkpIHsNCisJCQkJCQkJdHJ5IHsNCisJCQkJCQkJCWxvbmcgdGltZVN0YW1wID0gcmVzb3VyY2UuZ2V0VGltZVN0YW1wKCk7DQorCQkJCQkJCQlyZXNvdXJjZS5zYXZlKHNhdmVPcHRpb25zKTsNCisJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUaW1lU3RhbXAoKSAhPSB0aW1lU3RhbXApIHsNCisJCQkJCQkJCQlzYXZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQl9DQorCQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsNCisJCQkJCQkJfQ0KKwkJCQkJCQlmaXJzdCA9IGZhbHNlOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX07DQorDQorCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOw0KKwkJdHJ5IHsNCisJCQkvLyBUaGlzIHJ1bnMgdGhlIG9wdGlvbnMsIGFuZCBzaG93cyBwcm9ncmVzcy4NCisJCQkvLw0KKwkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpLnJ1bih0cnVlLCBmYWxzZSwgb3BlcmF0aW9uKTsNCisNCisJCQkvLyBSZWZyZXNoIHRoZSBuZWNlc3Nhcnkgc3RhdGUuDQorCQkJLy8NCisJCQkoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLnNhdmVJc0RvbmUoKTsNCisJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7DQorCQl9DQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCS8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHRoYXQgc2hvdWxkbid0Lg0KKwkJCS8vDQorCQkJUmtFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQl9DQorCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7DQorCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgd2hldGhlciBzb21ldGhpbmcgaGFzIGJlZW4gcGVyc2lzdGVkIHRvIHRoZSBVUkkgb2YgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4NCisJICogVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIFVSSSBjb252ZXJ0ZXIgZnJvbSB0aGUgZWRpdG9yJ3MgcmVzb3VyY2Ugc2V0IHRvIHRyeSB0byBvcGVuIGFuIGlucHV0IHN0cmVhbS4gDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BlcnNpc3RlZChSZXNvdXJjZSByZXNvdXJjZSkgew0KKwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsNCisJCXRyeSB7DQorCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKHJlc291cmNlLmdldFVSSSgpKTsNCisJCQlpZiAoc3RyZWFtICE9IG51bGwpIHsNCisJCQkJcmVzdWx0ID0gdHJ1ZTsNCisJCQkJc3RyZWFtLmNsb3NlKCk7DQorCQkJfQ0KKwkJfQ0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCisJCQkvLyBJZ25vcmUNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgdHJ1ZSBiZWNhdXNlIGl0IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFsc28gY2hhbmdlcyB0aGUgZWRpdG9yJ3MgaW5wdXQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7DQorCQlTYXZlQXNEaWFsb2cgc2F2ZUFzRGlhbG9nID0gbmV3IFNhdmVBc0RpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7DQorCQlzYXZlQXNEaWFsb2cub3BlbigpOw0KKwkJSVBhdGggcGF0aCA9IHNhdmVBc0RpYWxvZy5nZXRSZXN1bHQoKTsNCisJCWlmIChwYXRoICE9IG51bGwpIHsNCisJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOw0KKwkJCWlmIChmaWxlICE9IG51bGwpIHsNCisJCQkJZG9TYXZlQXMoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpLCBuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVBcyhVUkkgdXJpLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsNCisJCShlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKS5zZXRVUkkodXJpKTsNCisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7DQorCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOw0KKwkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPQ0KKwkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpICE9IG51bGwgPw0KKwkJCQlnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5nZXRQcm9ncmVzc01vbml0b3IoKSA6DQorCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7DQorCQlkb1NhdmUocHJvZ3Jlc3NNb25pdG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsNCisJCXRyeSB7DQorCQkJaWYgKG1hcmtlci5nZXRUeXBlKCkuZXF1YWxzKEVWYWxpZGF0b3IuTUFSS0VSKSkgew0KKwkJCQlTdHJpbmcgdXJpQXR0cmlidXRlID0gbWFya2VyLmdldEF0dHJpYnV0ZShFVmFsaWRhdG9yLlVSSV9BVFRSSUJVVEUsIG51bGwpOw0KKwkJCQlpZiAodXJpQXR0cmlidXRlICE9IG51bGwpIHsNCisJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaUF0dHJpYnV0ZSk7DQorCQkJCQlFT2JqZWN0IGVPYmplY3QgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0RU9iamVjdCh1cmksIHRydWUpOw0KKwkJCQkJaWYgKGVPYmplY3QgIT0gbnVsbCkgew0KKwkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9ucy5zaW5nbGV0b24oZWRpdGluZ0RvbWFpbi5nZXRXcmFwcGVyKGVPYmplY3QpKSk7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQlSa0VkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHN0YXJ0dXAuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsNCisJCXNldFNpdGUoc2l0ZSk7DQorCQlzZXRJbnB1dFdpdGhOb3RpZnkoZWRpdG9ySW5wdXQpOw0KKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsNCisJCXNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7DQorCQlzaXRlLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsNCisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsNCisJCWlmIChjdXJyZW50Vmlld2VyUGFuZSAhPSBudWxsKSB7DQorCQkJY3VycmVudFZpZXdlclBhbmUuc2V0Rm9jdXMoKTsNCisJCX0NCisJCWVsc2Ugew0KKwkJCWdldENvbnRyb2woZ2V0QWN0aXZlUGFnZSgpKS5zZXRGb2N1cygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7DQorCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsNCisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gcmV0dXJuIHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7DQorCQlyZXR1cm4gZWRpdG9yU2VsZWN0aW9uOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byBzZXQgdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4NCisJICogQ2FsbGluZyB0aGlzIHJlc3VsdCB3aWxsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQllZGl0b3JTZWxlY3Rpb24gPSBzZWxlY3Rpb247DQorDQorCQlmb3IgKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgOiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzKSB7DQorCQkJbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOw0KKwkJfQ0KKwkJc2V0U3RhdHVzTGluZU1hbmFnZXIoc2VsZWN0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFN0YXR1c0xpbmVNYW5hZ2VyKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBjdXJyZW50Vmlld2VyICE9IG51bGwgJiYgY3VycmVudFZpZXdlciA9PSBjb250ZW50T3V0bGluZVZpZXdlciA/DQorCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA6IGdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOw0KKw0KKwkJaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsNCisJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsNCisJCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnRvTGlzdCgpOw0KKwkJCQlzd2l0Y2ggKGNvbGxlY3Rpb24uc2l6ZSgpKSB7DQorCQkJCQljYXNlIDA6IHsNCisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX05vT2JqZWN0U2VsZWN0ZWQiKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCQljYXNlIDE6IHsNCisJCQkJCQlTdHJpbmcgdGV4dCA9IG5ldyBBZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3IoYWRhcHRlckZhY3RvcnkpLmdldFRleHQoY29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7DQorCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZCIsIHRleHQpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJCWRlZmF1bHQ6IHsNCisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQiLCBJbnRlZ2VyLnRvU3RyaW5nKGNvbGxlY3Rpb24uc2l6ZSgpKSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWVsc2Ugew0KKwkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKCIiKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gdGhlIHBsdWdpbidzIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsNCisJCXJldHVybiBSa0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBsb29rcyB1cCBhIHN0cmluZyBpbiBwbHVnaW4ucHJvcGVydGllcywgbWFraW5nIGEgc3Vic3RpdHV0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEpIHsNCisJCXJldHVybiBSa0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5LCBuZXcgT2JqZWN0IFtdIHsgczEgfSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXJ9IHRvIGhlbHAgZmlsbCB0aGUgY29udGV4dCBtZW51cyB3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgRWRpdCBtZW51Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgew0KKwkJKChJTWVudUxpc3RlbmVyKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpKS5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpIHsNCisJCXJldHVybiAoRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKSB7DQorCQlyZXR1cm4gZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3Rpb25CYXJzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7DQorCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7DQorDQorCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsNCisNCisJCWdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7DQorDQorCQlhZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7DQorDQorCQlpZiAoZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSB0aGlzKSB7DQorCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IobnVsbCk7DQorCQl9DQorDQorCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgew0KKwkJCXByb3BlcnR5U2hlZXRQYWdlLmRpc3Bvc2UoKTsNCisJCX0NCisNCisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgIT0gbnVsbCkgew0KKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5kaXNwb3NlKCk7DQorCQl9DQorDQorCQlzdXBlci5kaXNwb3NlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgd2hldGhlciB0aGUgb3V0bGluZSB2aWV3IHNob3VsZCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93T3V0bGluZVZpZXcoKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yay9wcmVzZW50YXRpb24vUmtFZGl0b3JQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL3ByZXNlbnRhdGlvbi9Sa0VkaXRvclBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NWY4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yay9wcmVzZW50YXRpb24vUmtFZGl0b3JQbHVnaW4uamF2YQpAQCAtMCwwICsxLDExOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsucHJlc2VudGF0aW9uOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5FY2xpcHNlVUlQbHVnaW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUVkaXRQbHVnaW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29yZUVkaXRQbHVnaW47DQorDQoraW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0Ow0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgUmsgZWRpdG9yIHBsdWdpbi4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitAU3VwcHJlc3NXYXJuaW5ncygic3ludGhldGljLWFjY2VzcyIpDQorcHVibGljIGZpbmFsIGNsYXNzIFJrRWRpdG9yUGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIHsNCisJLyoqDQorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgUmtFZGl0b3JQbHVnaW4gSU5TVEFOQ0UgPSBuZXcgUmtFZGl0b3JQbHVnaW4oKTsNCisJDQorCS8qKg0KKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47DQorDQorCS8qKg0KKwkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFJrRWRpdG9yUGx1Z2luKCkgew0KKwkJc3VwZXINCisJCQkobmV3IFJlc291cmNlTG9jYXRvciBbXSB7DQorCQkJCUNvcmVFZGl0UGx1Z2luLklOU1RBTkNFLA0KKwkJCQlFY29yZUVkaXRQbHVnaW4uSU5TVEFOQ0UsDQorCQkJfSk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsNCisJCXJldHVybiBwbHVnaW47DQorCX0NCisJDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsNCisJCXJldHVybiBwbHVnaW47DQorCX0NCisJDQorCS8qKg0KKwkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlBsdWdpbjwvYj4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVVJUGx1Z2luIHsNCisJCS8qKg0KKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgew0KKwkJCXN1cGVyKCk7DQorCQ0KKwkJCS8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuDQorCQkJLy8NCisJCQlwbHVnaW4gPSB0aGlzOw0KKwkJfQ0KKwkJDQorCQkvKioNCisJCSAqIA0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCisJCSAqLw0KKwkJQE92ZXJyaWRlDQorCQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KKwkJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOw0KKwkJCW5ldyBSa1NvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkoKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yay9wcmVzZW50YXRpb24vUmtNb2RlbFdpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvcHJlc2VudGF0aW9uL1JrTW9kZWxXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTkwMGFiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvcHJlc2VudGF0aW9uL1JrTW9kZWxXaXphcmQuamF2YQpAQCAtMCwwICsxLDYzNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsucHJlc2VudGF0aW9uOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQoraW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQoraW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuUmtGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuUmtQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsucHJvdmlkZXIuUmtFZGl0UGx1Z2luOw0KKw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247DQorDQorDQorLyoqDQorICogVGhpcyBpcyBhIHNpbXBsZSB3aXphcmQgZm9yIGNyZWF0aW5nIGEgbmV3IG1vZGVsIGZpbGUuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFJrTW9kZWxXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsNCisJLyoqDQorCSAqIFRoZSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyBmb3IgY3JlYXRlZCBmaWxlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IEZJTEVfRVhURU5TSU9OUyA9DQorCQlDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoUmtFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUmtFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbnMiKS5zcGxpdCgiXFxzKixcXHMqIikpKTsNCisNCisJLyoqDQorCSAqIEEgZm9ybWF0dGVkIGxpc3Qgb2Ygc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9ucywgc3VpdGFibGUgZm9yIGRpc3BsYXkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURURfRklMRV9FWFRFTlNJT05TID0NCisJCVJrRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JrRWRpdG9yRmlsZW5hbWVFeHRlbnNpb25zIikucmVwbGFjZUFsbCgiXFxzKixcXHMqIiwgIiwgIik7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNhY2hlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgcGFja2FnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBSa1BhY2thZ2UgcmtQYWNrYWdlID0gUmtQYWNrYWdlLmVJTlNUQU5DRTsNCisNCisJLyoqDQorCSAqIFRoaXMgY2FjaGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFJrRmFjdG9yeSBya0ZhY3RvcnkgPSBya1BhY2thZ2UuZ2V0UmtGYWN0b3J5KCk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBmaWxlIGNyZWF0aW9uIHBhZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgUmtNb2RlbFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgbmV3RmlsZUNyZWF0aW9uUGFnZTsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIGluaXRpYWwgb2JqZWN0IGNyZWF0aW9uIHBhZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgUmtNb2RlbFdpemFyZEluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UgaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZTsNCisNCisJLyoqDQorCSAqIFJlbWVtYmVyIHRoZSBzZWxlY3Rpb24gZHVyaW5nIGluaXRpYWxpemF0aW9uIGZvciBwb3B1bGF0aW5nIHRoZSBkZWZhdWx0IGNvbnRhaW5lci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247DQorDQorCS8qKg0KKwkgKiBSZW1lbWJlciB0aGUgd29ya2JlbmNoIGR1cmluZyBpbml0aWFsaXphdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJV29ya2JlbmNoIHdvcmtiZW5jaDsNCisNCisJLyoqDQorCSAqIENhY2hlcyB0aGUgbmFtZXMgb2YgdGhlIHR5cGVzIHRoYXQgY2FuIGJlIGNyZWF0ZWQgYXMgdGhlIHJvb3Qgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBpbml0aWFsT2JqZWN0TmFtZXM7DQorDQorCS8qKg0KKwkgKiBUaGlzIGp1c3QgcmVjb3JkcyB0aGUgaW5mb3JtYXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCXRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOw0KKwkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247DQorCQlzZXRXaW5kb3dUaXRsZShSa0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9XaXphcmRfbGFiZWwiKSk7DQorCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihFeHRlbmRlZEltYWdlUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0SW1hZ2VEZXNjcmlwdG9yKFJrRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL3dpemJhbi9OZXdSayIpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSB0eXBlcyB0aGF0IGNhbiBiZSBjcmVhdGVkIGFzIHRoZSByb290IG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0SW5pdGlhbE9iamVjdE5hbWVzKCkgew0KKwkJaWYgKGluaXRpYWxPYmplY3ROYW1lcyA9PSBudWxsKSB7DQorCQkJaW5pdGlhbE9iamVjdE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQorCQkJZm9yIChFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA6IHJrUGFja2FnZS5nZXRFQ2xhc3NpZmllcnMoKSkgew0KKwkJCQlpZiAoZUNsYXNzaWZpZXIgaW5zdGFuY2VvZiBFQ2xhc3MpIHsNCisJCQkJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKWVDbGFzc2lmaWVyOw0KKwkJCQkJaWYgKCFlQ2xhc3MuaXNBYnN0cmFjdCgpKSB7DQorCQkJCQkJaW5pdGlhbE9iamVjdE5hbWVzLmFkZChlQ2xhc3MuZ2V0TmFtZSgpKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlDb2xsZWN0aW9ucy5zb3J0KGluaXRpYWxPYmplY3ROYW1lcywgQ29tbW9uUGx1Z2luLklOU1RBTkNFLmdldENvbXBhcmF0b3IoKSk7DQorCQl9DQorCQlyZXR1cm4gaW5pdGlhbE9iamVjdE5hbWVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGUgYSBuZXcgbW9kZWwuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBjcmVhdGVJbml0aWFsTW9kZWwoKSB7DQorCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcylya1BhY2thZ2UuZ2V0RUNsYXNzaWZpZXIoaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5nZXRJbml0aWFsT2JqZWN0TmFtZSgpKTsNCisJCUVPYmplY3Qgcm9vdE9iamVjdCA9IHJrRmFjdG9yeS5jcmVhdGUoZUNsYXNzKTsNCisJCXJldHVybiByb290T2JqZWN0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBEbyB0aGUgd29yayBhZnRlciBldmVyeXRoaW5nIGlzIHNwZWNpZmllZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgew0KKwkJdHJ5IHsNCisJCQkvLyBSZW1lbWJlciB0aGUgZmlsZS4NCisJCQkvLw0KKwkJCWZpbmFsIElGaWxlIG1vZGVsRmlsZSA9IGdldE1vZGVsRmlsZSgpOw0KKw0KKwkJCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24uDQorCQkJLy8NCisJCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0NCisJCQkJbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsNCisJCQkJCUBPdmVycmlkZQ0KKwkJCQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KKwkJCQkJCXRyeSB7DQorCQkJCQkJCS8vIENyZWF0ZSBhIHJlc291cmNlIHNldA0KKwkJCQkJCQkvLw0KKwkJCQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsNCisNCisJCQkJCQkJLy8gR2V0IHRoZSBVUkkgb2YgdGhlIG1vZGVsIGZpbGUuDQorCQkJCQkJCS8vDQorCQkJCQkJCVVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkobW9kZWxGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSk7DQorDQorCQkJCQkJCS8vIENyZWF0ZSBhIHJlc291cmNlIGZvciB0aGlzIGZpbGUuDQorCQkJCQkJCS8vDQorCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoZmlsZVVSSSk7DQorDQorCQkJCQkJCS8vIEFkZCB0aGUgaW5pdGlhbCBtb2RlbCBvYmplY3QgdG8gdGhlIGNvbnRlbnRzLg0KKwkJCQkJCQkvLw0KKwkJCQkJCQlFT2JqZWN0IHJvb3RPYmplY3QgPSBjcmVhdGVJbml0aWFsTW9kZWwoKTsNCisJCQkJCQkJaWYgKHJvb3RPYmplY3QgIT0gbnVsbCkgew0KKwkJCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQocm9vdE9iamVjdCk7DQorCQkJCQkJCX0NCisNCisJCQkJCQkJLy8gU2F2ZSB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlIHRvIHRoZSBmaWxlIHN5c3RlbS4NCisJCQkJCQkJLy8NCisJCQkJCQkJTWFwPE9iamVjdCwgT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQorCQkJCQkJCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5nZXRFbmNvZGluZygpKTsNCisJCQkJCQkJcmVzb3VyY2Uuc2F2ZShvcHRpb25zKTsNCisJCQkJCQl9DQorCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCQkJUmtFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQkJCQkJfQ0KKwkJCQkJCWZpbmFsbHkgew0KKwkJCQkJCQlwcm9ncmVzc01vbml0b3IuZG9uZSgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfTsNCisNCisJCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIGZhbHNlLCBvcGVyYXRpb24pOw0KKw0KKwkJCS8vIFNlbGVjdCB0aGUgbmV3IGZpbGUgcmVzb3VyY2UgaW4gdGhlIGN1cnJlbnQgdmlldy4NCisJCQkvLw0KKwkJCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOw0KKwkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOw0KKwkJCWZpbmFsIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBwYWdlLmdldEFjdGl2ZVBhcnQoKTsNCisJCQlpZiAoYWN0aXZlUGFydCBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpIHsNCisJCQkJZmluYWwgSVNlbGVjdGlvbiB0YXJnZXRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb2RlbEZpbGUpOw0KKwkJCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMNCisJCQkJCShuZXcgUnVubmFibGUoKSB7DQorCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJICgoSVNldFNlbGVjdGlvblRhcmdldClhY3RpdmVQYXJ0KS5zZWxlY3RSZXZlYWwodGFyZ2V0U2VsZWN0aW9uKTsNCisJCQkJCQkgfQ0KKwkJCQkJIH0pOw0KKwkJCX0NCisNCisJCQkvLyBPcGVuIGFuIGVkaXRvciBvbiB0aGUgbmV3IGZpbGUuDQorCQkJLy8NCisJCQl0cnkgew0KKwkJCQlwYWdlLm9wZW5FZGl0b3INCisJCQkJCShuZXcgRmlsZUVkaXRvcklucHV0KG1vZGVsRmlsZSksDQorCQkJCQkgd29ya2JlbmNoLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdEVkaXRvcihtb2RlbEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS5nZXRJZCgpKTsNCisJCQl9DQorCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcih3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKSwgUmtFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsIiksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOw0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQlSa0VkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIG9uZSBwYWdlIG9mIHRoZSB3aXphcmQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgUmtNb2RlbFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsNCisJCS8qKg0KKwkJICogUGFzcyBpbiB0aGUgc2VsZWN0aW9uLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmtNb2RlbFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UoU3RyaW5nIHBhZ2VJZCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQkJc3VwZXIocGFnZUlkLCBzZWxlY3Rpb24pOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBUaGUgZnJhbWV3b3JrIGNhbGxzIHRoaXMgdG8gc2VlIGlmIHRoZSBmaWxlIGlzIGNvcnJlY3QuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgew0KKwkJCWlmIChzdXBlci52YWxpZGF0ZVBhZ2UoKSkgew0KKwkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gbmV3IFBhdGgoZ2V0RmlsZU5hbWUoKSkuZ2V0RmlsZUV4dGVuc2lvbigpOw0KKwkJCQlpZiAoZXh0ZW5zaW9uID09IG51bGwgfHwgIUZJTEVfRVhURU5TSU9OUy5jb250YWlucyhleHRlbnNpb24pKSB7DQorCQkJCQlTdHJpbmcga2V5ID0gRklMRV9FWFRFTlNJT05TLnNpemUoKSA+IDEgPyAiX1dBUk5fRmlsZW5hbWVFeHRlbnNpb25zIiA6ICJfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbiI7DQorCQkJCQlzZXRFcnJvck1lc3NhZ2UoUmtFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSwgbmV3IE9iamVjdCBbXSB7IEZPUk1BVFRFRF9GSUxFX0VYVEVOU0lPTlMgfSkpOw0KKwkJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCQl9DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIElGaWxlIGdldE1vZGVsRmlsZSgpIHsNCisJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGdldENvbnRhaW5lckZ1bGxQYXRoKCkuYXBwZW5kKGdldEZpbGVOYW1lKCkpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgcGFnZSB3aGVyZSB0aGUgdHlwZSBvZiBvYmplY3QgdG8gY3JlYXRlIGlzIHNlbGVjdGVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFJrTW9kZWxXaXphcmRJbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7DQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJvdGVjdGVkIENvbWJvIGluaXRpYWxPYmplY3RGaWVsZDsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICovDQorCQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGVuY29kaW5nczsNCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgQ29tYm8gZW5jb2RpbmdGaWVsZDsNCisNCisJCS8qKg0KKwkJICogUGFzcyBpbiB0aGUgc2VsZWN0aW9uLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmtNb2RlbFdpemFyZEluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UoU3RyaW5nIHBhZ2VJZCkgew0KKwkJCXN1cGVyKHBhZ2VJZCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7DQorCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7IHsNCisJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOw0KKwkJCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7DQorCQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxMjsNCisJCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOw0KKw0KKwkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7DQorCQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsNCisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCisJCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7DQorCQkJfQ0KKw0KKwkJCUxhYmVsIGNvbnRhaW5lckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOw0KKwkJCXsNCisJCQkJY29udGFpbmVyTGFiZWwuc2V0VGV4dChSa0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Nb2RlbE9iamVjdCIpKTsNCisNCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJCQljb250YWluZXJMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOw0KKwkJCX0NCisNCisJCQlpbml0aWFsT2JqZWN0RmllbGQgPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSKTsNCisJCQl7DQorCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsNCisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCisJCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsNCisJCQkJaW5pdGlhbE9iamVjdEZpZWxkLnNldExheW91dERhdGEoZGF0YSk7DQorCQkJfQ0KKw0KKwkJCWZvciAoU3RyaW5nIG9iamVjdE5hbWUgOiBnZXRJbml0aWFsT2JqZWN0TmFtZXMoKSkgew0KKwkJCQlpbml0aWFsT2JqZWN0RmllbGQuYWRkKGdldExhYmVsKG9iamVjdE5hbWUpKTsNCisJCQl9DQorDQorCQkJaWYgKGluaXRpYWxPYmplY3RGaWVsZC5nZXRJdGVtQ291bnQoKSA9PSAxKSB7DQorCQkJCWluaXRpYWxPYmplY3RGaWVsZC5zZWxlY3QoMCk7DQorCQkJfQ0KKwkJCWluaXRpYWxPYmplY3RGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih2YWxpZGF0b3IpOw0KKw0KKwkJCUxhYmVsIGVuY29kaW5nTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7DQorCQkJew0KKwkJCQllbmNvZGluZ0xhYmVsLnNldFRleHQoUmtFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfWE1MRW5jb2RpbmciKSk7DQorDQorCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsNCisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCisJCQkJZW5jb2RpbmdMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOw0KKwkJCX0NCisJCQllbmNvZGluZ0ZpZWxkID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7DQorCQkJew0KKwkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7DQorCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQorCQkJCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7DQorCQkJCWVuY29kaW5nRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsNCisJCQl9DQorDQorCQkJZm9yIChTdHJpbmcgZW5jb2RpbmcgOiBnZXRFbmNvZGluZ3MoKSkgew0KKwkJCQllbmNvZGluZ0ZpZWxkLmFkZChlbmNvZGluZyk7DQorCQkJfQ0KKw0KKwkJCWVuY29kaW5nRmllbGQuc2VsZWN0KDApOw0KKwkJCWVuY29kaW5nRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodmFsaWRhdG9yKTsNCisNCisJCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOw0KKwkJCXNldENvbnRyb2woY29tcG9zaXRlKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgdmFsaWRhdG9yID0NCisJCQluZXcgTW9kaWZ5TGlzdGVuZXIoKSB7DQorCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgew0KKwkJCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgew0KKwkJCXJldHVybiBnZXRJbml0aWFsT2JqZWN0TmFtZSgpICE9IG51bGwgJiYgZ2V0RW5jb2RpbmdzKCkuY29udGFpbnMoZW5jb2RpbmdGaWVsZC5nZXRUZXh0KCkpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsNCisJCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOw0KKwkJCWlmICh2aXNpYmxlKSB7DQorCQkJCWlmIChpbml0aWFsT2JqZWN0RmllbGQuZ2V0SXRlbUNvdW50KCkgPT0gMSkgew0KKwkJCQkJaW5pdGlhbE9iamVjdEZpZWxkLmNsZWFyU2VsZWN0aW9uKCk7DQorCQkJCQllbmNvZGluZ0ZpZWxkLnNldEZvY3VzKCk7DQorCQkJCX0NCisJCQkJZWxzZSB7DQorCQkJCQllbmNvZGluZ0ZpZWxkLmNsZWFyU2VsZWN0aW9uKCk7DQorCQkJCQlpbml0aWFsT2JqZWN0RmllbGQuc2V0Rm9jdXMoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxPYmplY3ROYW1lKCkgew0KKwkJCVN0cmluZyBsYWJlbCA9IGluaXRpYWxPYmplY3RGaWVsZC5nZXRUZXh0KCk7DQorDQorCQkJZm9yIChTdHJpbmcgbmFtZSA6IGdldEluaXRpYWxPYmplY3ROYW1lcygpKSB7DQorCQkJCWlmIChnZXRMYWJlbChuYW1lKS5lcXVhbHMobGFiZWwpKSB7DQorCQkJCQlyZXR1cm4gbmFtZTsNCisJCQkJfQ0KKwkJCX0NCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgew0KKwkJCXJldHVybiBlbmNvZGluZ0ZpZWxkLmdldFRleHQoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZSBuYW1lLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKFN0cmluZyB0eXBlTmFtZSkgew0KKwkJCXRyeSB7DQorCQkJCXJldHVybiBSa0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfIiArIHR5cGVOYW1lICsgIl90eXBlIik7DQorCQkJfQ0KKwkJCWNhdGNoKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUpIHsNCisJCQkJUmtFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKG1yZSk7DQorCQkJfQ0KKwkJCXJldHVybiB0eXBlTmFtZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEVuY29kaW5ncygpIHsNCisJCQlpZiAoZW5jb2RpbmdzID09IG51bGwpIHsNCisJCQkJZW5jb2RpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQorCQkJCWZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoUmtFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfWE1MRW5jb2RpbmdDaG9pY2VzIikpOyBzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpOyApIHsNCisJCQkJCWVuY29kaW5ncy5hZGQoc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpKTsNCisJCQkJfQ0KKwkJCX0NCisJCQlyZXR1cm4gZW5jb2RpbmdzOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGUgZnJhbWV3b3JrIGNhbGxzIHRoaXMgdG8gY3JlYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgd2l6YXJkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsNCisJCS8vIENyZWF0ZSBhIHBhZ2UsIHNldCB0aGUgdGl0bGUsIGFuZCB0aGUgaW5pdGlhbCBtb2RlbCBmaWxlIG5hbWUuDQorCQkvLw0KKwkJbmV3RmlsZUNyZWF0aW9uUGFnZSA9IG5ldyBSa01vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSgiV2hhdGV2ZXIiLCBzZWxlY3Rpb24pOw0KKwkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXRUaXRsZShSa0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Sa01vZGVsV2l6YXJkX2xhYmVsIikpOw0KKwkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXREZXNjcmlwdGlvbihSa0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Sa01vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uIikpOw0KKwkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXRGaWxlTmFtZShSa0VkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Sa0VkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2UiKSArICIuIiArIEZJTEVfRVhURU5TSU9OUy5nZXQoMCkpOw0KKwkJYWRkUGFnZShuZXdGaWxlQ3JlYXRpb25QYWdlKTsNCisNCisJCS8vIFRyeSBhbmQgZ2V0IHRoZSByZXNvdXJjZSBzZWxlY3Rpb24gdG8gZGV0ZXJtaW5lIGEgY3VycmVudCBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlIGRpYWxvZy4NCisJCS8vDQorCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCisJCQkvLyBHZXQgdGhlIHJlc291cmNlLi4uDQorCQkJLy8NCisJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpOw0KKwkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsNCisJCQkJLy8gR2V0IHRoZSByZXNvdXJjZSBwYXJlbnQsIGlmIGl0cyBhIGZpbGUuDQorCQkJCS8vDQorCQkJCUlSZXNvdXJjZSBzZWxlY3RlZFJlc291cmNlID0gKElSZXNvdXJjZSlzZWxlY3RlZEVsZW1lbnQ7DQorCQkJCWlmIChzZWxlY3RlZFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgew0KKwkJCQkJc2VsZWN0ZWRSZXNvdXJjZSA9IHNlbGVjdGVkUmVzb3VyY2UuZ2V0UGFyZW50KCk7DQorCQkJCX0NCisNCisJCQkJLy8gVGhpcyBnaXZlcyB1cyBhIGRpcmVjdG9yeS4uLg0KKwkJCQkvLw0KKwkJCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIgfHwgc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7DQorCQkJCQkvLyBTZXQgdGhpcyBmb3IgdGhlIGNvbnRhaW5lci4NCisJCQkJCS8vDQorCQkJCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldENvbnRhaW5lckZ1bGxQYXRoKHNlbGVjdGVkUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7DQorDQorCQkJCQkvLyBNYWtlIHVwIGEgdW5pcXVlIG5ldyBuYW1lIGhlcmUuDQorCQkJCQkvLw0KKwkJCQkJU3RyaW5nIGRlZmF1bHRNb2RlbEJhc2VGaWxlbmFtZSA9IFJrRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JrRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZSIpOw0KKwkJCQkJU3RyaW5nIGRlZmF1bHRNb2RlbEZpbGVuYW1lRXh0ZW5zaW9uID0gRklMRV9FWFRFTlNJT05TLmdldCgwKTsNCisJCQkJCVN0cmluZyBtb2RlbEZpbGVuYW1lID0gZGVmYXVsdE1vZGVsQmFzZUZpbGVuYW1lICsgIi4iICsgZGVmYXVsdE1vZGVsRmlsZW5hbWVFeHRlbnNpb247DQorCQkJCQlmb3IgKGludCBpID0gMTsgKChJQ29udGFpbmVyKXNlbGVjdGVkUmVzb3VyY2UpLmZpbmRNZW1iZXIobW9kZWxGaWxlbmFtZSkgIT0gbnVsbDsgKytpKSB7DQorCQkJCQkJbW9kZWxGaWxlbmFtZSA9IGRlZmF1bHRNb2RlbEJhc2VGaWxlbmFtZSArIGkgKyAiLiIgKyBkZWZhdWx0TW9kZWxGaWxlbmFtZUV4dGVuc2lvbjsNCisJCQkJCX0NCisJCQkJCW5ld0ZpbGVDcmVhdGlvblBhZ2Uuc2V0RmlsZU5hbWUobW9kZWxGaWxlbmFtZSk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlID0gbmV3IFJrTW9kZWxXaXphcmRJbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlKCJXaGF0ZXZlcjIiKTsNCisJCWluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2Uuc2V0VGl0bGUoUmtFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUmtNb2RlbFdpemFyZF9sYWJlbCIpKTsNCisJCWluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2Uuc2V0RGVzY3JpcHRpb24oUmtFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV2l6YXJkX2luaXRpYWxfb2JqZWN0X2Rlc2NyaXB0aW9uIikpOw0KKwkJYWRkUGFnZShpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlKTsNCisJfQ0KKw0KKwkvKioNCisJICogR2V0IHRoZSBmaWxlIGZyb20gdGhlIHBhZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpbGUgZ2V0TW9kZWxGaWxlKCkgew0KKwkJcmV0dXJuIG5ld0ZpbGVDcmVhdGlvblBhZ2UuZ2V0TW9kZWxGaWxlKCk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvcHJlc2VudGF0aW9uL1JrU29sdmVyQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvcHJlc2VudGF0aW9uL1JrU29sdmVyQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYTVlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yay9wcmVzZW50YXRpb24vUmtTb2x2ZXJBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsucHJlc2VudGF0aW9uOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclByb3BlcnR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUHJvcGVydHlFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKKworLyoqCisgKiAgCisgKiBBZGFwdGVyIGZvciBQcm9wZXJ0eSBFZGl0b3IKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBSa1NvbHZlckFkYXB0ZXIgZXh0ZW5kcworCQlTb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXIgeworCisJLyoqCisJICogCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFNvbHZlclByb3BlcnR5RWRpdG9yIGNyZWF0ZVNvbHZlclByb3BlcnR5RWRpdG9yKAorCQkJU29sdmVyUHJvcGVydHlDb21wb3NpdGUgc29sdmVyUHJvcGVydHlDb21wb3NpdGUsCisJCQlpbnQgc3R5bGUsIE1vZGlmeUxpc3RlbmVyIHByb2plY3RWYWxpZGF0b3IpIHsKKwkJcmV0dXJuIG5ldyBSa1NvbHZlclByb3BlcnR5RWRpdG9yKAorCQkJCXNvbHZlclByb3BlcnR5Q29tcG9zaXRlLCBzdHlsZSwKKwkJCQkoU29sdmVyKSBnZXRUYXJnZXQoKSwgcHJvamVjdFZhbGlkYXRvcik7CisJfSAvLyBjcmVhdGVTb2x2ZXJQcm9wZXJ0eUVkaXRvcgorCit9IC8vIFJrU29sdmVyQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvcHJlc2VudGF0aW9uL1JrU29sdmVyUHJvcGVydHlFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL3ByZXNlbnRhdGlvbi9Sa1NvbHZlclByb3BlcnR5RWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2ZTc1MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL3ByZXNlbnRhdGlvbi9Sa1NvbHZlclByb3BlcnR5RWRpdG9yLmphdmEKQEAgLTAsMCArMSwxNzYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsuUmtGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5Sa1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLlJ1bmdlS3V0dGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3MuUHJvcGVydHlTdHJpbmdQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworCitwdWJsaWMgY2xhc3MgUmtTb2x2ZXJQcm9wZXJ0eUVkaXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUHJvcGVydHlFZGl0b3IgeworCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqIEBwYXJhbSBkaXNlYXNlTW9kZWwKKwkgKiBAcGFyYW0gcHJvamVjdFZhbGlkYXRvcgorCSAqLworCXB1YmxpYyBSa1NvbHZlclByb3BlcnR5RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsCisJCQlpbnQgc3R5bGUsIFNvbHZlciBzb2x2ZXIsCisJCQlNb2RpZnlMaXN0ZW5lciBwcm9qZWN0VmFsaWRhdG9yKSB7CisJCXN1cGVyKHBhcmVudCwgc3R5bGUpOworCQlmaW5hbCBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOworCQlzZXRMYXlvdXQoZ3JpZExheW91dCk7CisKKwkJLy8gR2V0IHRoZSBhZGFwdGVyIHRoYXQgd2lsbCBwcm92aWRlIE5MUydkIG5hbWVzIGZvciB0aGUKKwkJLy8gcHJvcGVydGllcyBvZiB0aGUgZGlzZWFzZSBtb2RlbAorCQlmaW5hbCBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlciBwc3BhID0gKFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyKSBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkuYWRhcHQoc29sdmVyLCBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyLmNsYXNzKTsKKworCQlmaW5hbCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGl0ZW1Qcm92aWRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgKKwkJCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOworCQkKKwkJZmluYWwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSBwcm9wZXJ0eVNvdXJjZSA9IChJSXRlbVByb3BlcnR5U291cmNlKSBpdGVtUHJvdmlkZXJGYWN0b3J5CisJCQkJLmFkYXB0KHNvbHZlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7CisJCQorCQlmaW5hbCBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wZXJ0aWVzID0gcHJvcGVydHlTb3VyY2UKKwkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhzb2x2ZXIpOworCisJCWZvciAoZmluYWwgSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA6IHByb3BlcnRpZXMpIHsKKwkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZGVzY3JpcHRvcgorCQkJCQkuZ2V0RmVhdHVyZShudWxsKTsKKwkJCS8vIElzIHRoaXMgYSBkaXNlYXNlIG1vZGVsIHByb3BlcnR5IHRoYXQgdGhlIHVzZXIgc2hvdWxkIHNwZWNpZnk/CisJCQlpZiAoaXNVc2VyU3BlY2lmaWVkU29sdmVyUHJvcGVydHkoZmVhdHVyZSkpIHsKKwkJCQkvLyBZZXMKKwkJCQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7CisJCQkJbGFiZWwuc2V0VGV4dChwc3BhLmdldFByb3BlcnR5TmFtZShkZXNjcmlwdG9yKSk7CisKKwkJCQlmaW5hbCBHcmlkRGF0YSBsYWJlbEdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7CisJCQkJbGFiZWxHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJCQlsYWJlbEdELmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKKwkJCQlsYWJlbEdELmhvcml6b250YWxJbmRlbnQgPSAwOworCQkJCWxhYmVsLnNldExheW91dERhdGEobGFiZWxHRCk7CisKKwkJCQkvLyBHZXQgYSBzdHJpbmcgdmFsdWUgZm9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmZWF0dXJlCisKKwkJCQlmaW5hbCBTdHJpbmcgZGVmYXVsdFZhbHVlU3RyaW5nID0gZ2V0UHJvcGVydHlEZWZhdWx0VmFsdWVTdHJpbmcoZGVzY3JpcHRvcik7CisKKwkJCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dCh0aGlzLCBTV1QuQk9SREVSIHwgU1dULlRSQUlMKTsKKwkJCQl0ZXh0LnNldFRleHQoZGVmYXVsdFZhbHVlU3RyaW5nKTsKKwkJCQl0ZXh0LnNldFRvb2xUaXBUZXh0KHBzcGEuZ2V0UHJvcGVydHlUb29sVGlwKGRlc2NyaXB0b3IpKTsKKwkJCQltYXAucHV0KGZlYXR1cmUsIHRleHQpOworCisJCQkJZmluYWwgR3JpZERhdGEgdGV4dEdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCk7CisJCQkJdGV4dEdELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQkJCXRleHRHRC5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCQkJdGV4dC5zZXRMYXlvdXREYXRhKHRleHRHRCk7CisKKwkJCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHByb2plY3RWYWxpZGF0b3IpOworCisJCQkJZmluYWwgTGFiZWwgdW5pdExhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKKwkJCQl1bml0TGFiZWwuc2V0VGV4dChwc3BhLmdldFByb3BlcnR5VW5pdHMoZGVzY3JpcHRvcikpOworCQkJCWZpbmFsIEdyaWREYXRhIHVuaXRMYWJlbEdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCk7CisJCQkJdW5pdExhYmVsR0QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7CisJCQkJdW5pdExhYmVsLnNldExheW91dERhdGEodW5pdExhYmVsR0QpOworCisJCQl9IC8vIGlmIHVzZXIgc3BlY2lmaWVkCisJCX0gLy8gZm9yIGVhY2ggc29sdmVyIHByb3BlcnR5CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBmZWF0dXJlCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmVhdHVyZSBpcyBhIGR1YmxpbiBjb3JlIGZlYXR1cmUgCisJICogdGhhdCBpcyBzcGVjaWZpZWQgYnkgYSB1c2VyLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VzZXJTcGVjaWZpZWRTb2x2ZXJQcm9wZXJ0eShmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisJCWZpbmFsIEVDbGFzcyBjb250YWluaW5nQ2xhc3MgPSBmZWF0dXJlLmdldEVDb250YWluaW5nQ2xhc3MoKTsKKwkJLy8gSXMgaXQgYSBkaXNlYXNlIG1vZGVsIHByb3BlcnR5PworCQlpZiAoY29udGFpbmluZ0NsYXNzLmVxdWFscyhSa1BhY2thZ2UuZUlOU1RBTkNFLmdldFJ1bmdlS3V0dGEoKSkpIHsKKwkJCXJldFZhbHVlID0gdHJ1ZTsKKwkJfSAvLyBpZiBhIGRpc2Vhc2UgbW9kZWwgcHJvcGVydHkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gaXNVc2VyU3BlY2lmaWVkRGlzZWFzZU1vZGVsUHJvcGVydHkKKworCXByb3RlY3RlZCBmaW5hbCBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBUZXh0PiBtYXAgPSBuZXcgSGFzaE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIFRleHQ+KCk7CisJcHJvdGVjdGVkIFN0cmluZyBlcnJvck1lc3NhZ2U7CisKKwlwdWJsaWMgUmtTb2x2ZXJQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKKwkJc3VwZXIocGFyZW50LHN0eWxlKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5TdGFuZGFyZERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yI3BvcHVsYXRlKG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWwpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcG9wdWxhdGUoU29sdmVyIHNvbHZlcikgeworCQlzdXBlci5wb3B1bGF0ZShzb2x2ZXIpOworCQkKKwkJZm9yIChmaW5hbCBNYXAuRW50cnk8RVN0cnVjdHVyYWxGZWF0dXJlLCBUZXh0PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7CisJCQlkb3VibGUgZFZhbCA9IDAuMDsKKwkJCisJCQlzd2l0Y2ggKGVudHJ5LmdldEtleSgpLmdldEZlYXR1cmVJRCgpKSB7CisJCQljYXNlIFJrUGFja2FnZS5SVU5HRV9LVVRUQV9fUkVMQVRJVkVfVE9MRVJBTkNFOgorCQkJCWRWYWwgPSAobmV3IERvdWJsZShlbnRyeS5nZXRWYWx1ZSgpLmdldFRleHQoKSkpLmRvdWJsZVZhbHVlKCk7CisJCQkJKChSdW5nZUt1dHRhKSBzb2x2ZXIpLnNldFJlbGF0aXZlVG9sZXJhbmNlKGRWYWwpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0gLy8gc3dpdGNoCisJCX0gLy8gZm9yIGVhY2ggTWFwLmVudHJ5CisJfQorCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyB2YWxpZGF0ZQorCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNoZWNrU3ViY2xhc3MoKSB7CisJCS8vIERpc2FibGUgdGhlIGNoZWNrIHRoYXQgcHJldmVudHMgc3ViLWNsYXNzaW5nIG9mIFNXVCBjb21wb25lbnRzCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFNvbHZlciBjcmVhdGVBbmRQb3B1bGF0ZVNvbHZlcigpIHsKKwkJU29sdmVyIHJldFZhbHVlID0gUmtGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSdW5nZUt1dHRhKCk7CisJCXJldFZhbHVlLnNldFVSSShTVEVNVVJJLmNyZWF0ZVVSSShSdW5nZUt1dHRhLlVSSV9UWVBFX1NPTFZFUl9TRUdNRU5UKyIvIitTVEVNVVJJLmdlbmVyYXRlVW5pcXVlUGFydCgpKSk7CisJCXBvcHVsYXRlKHJldFZhbHVlKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0KK30gLy8gUmtTb2x2ZXJQcm9wZXJ0eUVkaXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvcHJlc2VudGF0aW9uL1JrU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yay9wcmVzZW50YXRpb24vUmtTb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODIxMDI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvcHJlc2VudGF0aW9uL1JrU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsucHJlc2VudGF0aW9uOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclByb3BlcnR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyUHJvcGVydHlFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKKworcHVibGljIGNsYXNzIFJrU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyIGV4dGVuZHMgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXIKKwkJaW1wbGVtZW50cyBBZGFwdGVyIHsKKworCS8qKgorCSAqIAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTb2x2ZXJQcm9wZXJ0eUVkaXRvciBjcmVhdGVTb2x2ZXJQcm9wZXJ0eUVkaXRvcigKKwkJCVNvbHZlclByb3BlcnR5Q29tcG9zaXRlIHNvbHZlclByb3BlcnR5Q29tcG9zaXRlLAorCQkJaW50IHN0eWxlLCBNb2RpZnlMaXN0ZW5lciBwcm9qZWN0VmFsaWRhdG9yKSB7CisJCXJldHVybiBuZXcgUmtTb2x2ZXJQcm9wZXJ0eUVkaXRvcigKKwkJCQlzb2x2ZXJQcm9wZXJ0eUNvbXBvc2l0ZSwgc3R5bGUsCisJCQkJKFNvbHZlcikgZ2V0VGFyZ2V0KCksIHByb2plY3RWYWxpZGF0b3IpOworCX0gLy8gY3JlYXRlU29sdmVyUHJvcGVydHlFZGl0b3IKKworfSAvLyBTb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL3ByZXNlbnRhdGlvbi9Sa1NvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9zb2x2ZXJzL3JrL3ByZXNlbnRhdGlvbi9Sa1NvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTNiNTljCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvcHJlc2VudGF0aW9uL1JrU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8vIERpc2Vhc2VNb2RlbFByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMucmsucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLnV0aWwuUmtBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cDsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgUmtTb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgUmtBZGFwdGVyRmFjdG9yeSAKKwlpbXBsZW1lbnRzIFNvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnksIElTdGFydHVwIHsKKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBSa1NvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJCVNvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkuYWRkQWRhcHRlckZhY3RvcnkodGhpcyk7CisJfQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXAjZWFybHlTdGFydHVwKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBlYXJseVN0YXJ0dXAoKSB7CisJCS8vIE5vdGhpbmcgdG8gZG8gaGVyZS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBoYXMKKwkJLy8gcnVuIHdoaWNoIGlzIHRoZSBlbnRpcmUgcG9pbnQgb2YgZWFybHkgYWN0aXZhdGlvbiB3aGljaCBjYXVzZXMgdGhlCisJCS8vIGZhY3RvcnkgdG8gYmUgYWRkZWQgdG8gdGhlIFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCX0KKworCS8qKgorCSAqIAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJ1bmdlS3V0dGFBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IFJrU29sdmVyQWRhcHRlcigpOworCX0KKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyLmNsYXNzCisJCQkJfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9Cit9IApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvcHJlc2VudGF0aW9uL1JrU29sdmVyUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vc29sdmVycy9yay9wcmVzZW50YXRpb24vUmtTb2x2ZXJQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWMyOGVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3NvbHZlcnMvcmsvcHJlc2VudGF0aW9uL1JrU29sdmVyUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8vIFN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLnV0aWwuU29sdmVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLlJrUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsuU29sdmVyTWVzc2FnZXM7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIE5MUydkIHN0cmluZ3MgZm9yIHtAbGluayBEaXNlYXNlTW9kZWx9IHByb3BlcnRpZXMuIAorICovCitwdWJsaWMgY2xhc3MgUmtTb2x2ZXJQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcworCSBTb2x2ZXJBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7CisKKwkKKwlQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKKworCS8qKgorCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgUmtTb2x2ZXJQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJCVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGRBZGFwdGVyRmFjdG9yeSh0aGlzKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbCNpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlpZih0eXBlID09IFJrUGFja2FnZS5lSU5TVEFOQ0UpIHJldHVybiB0cnVlOworCQlyZXR1cm4gIHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSkgfHwgdHlwZSA9PSBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyLmNsYXNzOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnV0aWwuU3RhbmRhcmRBZGFwdGVyRmFjdG9yeSNjcmVhdGVEaXNlYXNlTW9kZWxBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTb2x2ZXJBZGFwdGVyKCkgeworCQkvLyBIYXZlIHdlIGNyZWF0ZWQgb25lIGJlZm9yZT8KKwkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgeworCQkJLy8gTm8KKwkJCWFkYXB0ZXIgPSBuZXcgU29sdmVyUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIoKTsKKwkJfSAvLyBpZiB3ZSBkaWRuJ3QgY3JlYXRlIG9uZSBiZWZvcmUKKwkJcmV0dXJuIGFkYXB0ZXI7CisJfSAvLyBjcmVhdGVEaXNlYXNlTW9kZWxBZGFwdGVyCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBTb2x2ZXJQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlciBleHRlbmRzCisJCQlQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlciB7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBkZXNjcmlwdG9yCisJCSAqIEByZXR1cm4gdGhlIE5MUydkIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsJCisJCQlyZXR1cm4gU29sdmVyTWVzc2FnZXMKKwkJCQkJLmdldFN0cmluZygoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZGVzY3JpcHRvcgorCQkJCQkJCS5nZXRGZWF0dXJlKG51bGwpKS5nZXROYW1lKCkpOworCQl9IC8vIGdldFByb3BlcnR5TmFtZQorCisJCS8qKgorCQkgKiBAcGFyYW0gZGVzY3JpcHRvcgorCQkgKiBAcmV0dXJuIHRoZSBOTFMnZCB0b29sIHRpcCB0ZXh0IHRoYXQgZGVzY3JpYmVzIHRoZSBwcm9wZXJ0eQorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVRvb2xUaXAoCisJCQkJSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBkZXNjcmlwdG9yCisJCQkJCS5nZXRGZWF0dXJlKG51bGwpOworCQkJcmV0dXJuIFNvbHZlck1lc3NhZ2VzLmdldFN0cmluZyhmZWF0dXJlLmdldE5hbWUoKQorCQkJCQkrIFRUX1NVRkZJWCk7CisJCX0gLy8gZ2V0UHJvcGVydHlUb29sVGlwCisKKwkJLyoqCisJCSAqIEBwYXJhbSBkZXNjcmlwdG9yCisJCSAqIEByZXR1cm4gdGhlIE5MUydkIHRleHQgdGhhdCByZXByZXNlbnRzIHRoZSB1bml0cyBvZiB0aGUKKwkJICogICAgICAgICBwcm9wZXJ0eQorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVVuaXRzKAorCQkJCUlJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKwkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZGVzY3JpcHRvcgorCQkJCQkuZ2V0RmVhdHVyZShudWxsKTsKKwkJCXJldHVybiBTb2x2ZXJNZXNzYWdlcy5nZXRTdHJpbmcoZmVhdHVyZS5nZXROYW1lKCkKKwkJCQkJKyBVTklUX1NVRkZJWCk7CisJCX0gLy8gZ2V0UHJvcGVydHlVbml0cworCisJfSAvLyBTdGFuZGFyZFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyCit9IC8vIFN0YW5kYXJkUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvc29sdmVycy9yay9BY3RpdmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9zb2x2ZXJzL3JrL0FjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMmVjMjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvc29sdmVycy9yay9BY3RpdmF0b3IuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucms7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uc29sdmVycy5yay5wcmVzZW50YXRpb24uUmtFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrLnByZXNlbnRhdGlvbi5Sa1NvbHZlclByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworCisvKioKKyAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgorICovCitwdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7CisKKwkvKioKKwkgKiBUaGUgc3ltYm9saWMgaWRlbnRpZmllciBmb3IgdGhpcyBwbHVnLWluCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVyLnJrIjsgLy8kTk9OLU5MUy0xJAorCisJLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KKwlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOworCisJLyoqCisJICogVGhlIGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBBY3RpdmF0b3IoKSB7CisJCXN1cGVyKCk7CisJCXBsdWdpbiA9IHRoaXM7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCisJICogCisJICogQHBhcmFtIGNvbnRleHQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCQluZXcgUmtTb2x2ZXJQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKKwkJbmV3IFJrRWRpdG9yKCk7CisJfSAvLyBzdGFydAorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAorCSAqIAorCSAqIEBwYXJhbSBjb250ZXh0CisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0b3AoY29udGV4dCk7CisJCXBsdWdpbiA9IG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKworCQorCS8qKgorCSAqIExvZyBhbiBlcnJvciB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4KKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqICAgICAgICAgICAgdGhlIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIHRleHQKKwkgKiBAcGFyYW0gZXhjZXB0aW9uCisJICogICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJcGx1Z2luLmdldExvZygpLmxvZygKKwkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKKwkJCQkJCTAsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOworCX0gLy8gbG9nRXJyb3IKKworCS8qKgorCSAqIExvZyBpbmZvcm1hdGlvbiB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4KKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqICAgICAgICAgICAgdGhlIGxvY2FsaXplZCBpbmZvcm1hdGlvbiBtZXNzYWdlIHRleHQKKwkgKiBAcGFyYW0gZXhjZXB0aW9uCisJICogICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW5mb3JtYXRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJcGx1Z2luLmdldExvZygpLmxvZygKKwkJCQluZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAorCQkJCQkJMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7CisJfSAvLyBsb2dJbmZvcm1hdGlvbgorCit9IC8vIEFjdGl2YXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3NvbHZlcnMvcmsvU29sdmVyTWVzc2FnZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9zb2x2ZXJzL3JrL1NvbHZlck1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1OWY2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9zb2x2ZXJzL3JrL1NvbHZlck1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLy8gRGlzZWFzZVdpemFyZE1lc3NhZ2VzLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5zb2x2ZXJzLnJrOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50czsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRoZSBSZXNvdXJjZSBCdW5kbGUgZm9yIHRoaXMgcGFja2FnZS4KKyAqLworcHVibGljIGNsYXNzIFNvbHZlck1lc3NhZ2VzIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSBDb25zdGFudHMuSURfUk9PVAorCQkJKyAiLnVpLnNvbHZlcnMucmsubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQorCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7CisKKwlwcml2YXRlIFNvbHZlck1lc3NhZ2VzKCkgeworCQkvLyBlbXB0eQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBrZXkKKwkgKiAgICAgICAgICAgIHRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlCisJICogQHJldHVybiB0aGUgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUga2V5CisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKGZpbmFsIFN0cmluZyBrZXkpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7CisJCX0gY2F0Y2ggKGZpbmFsIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOworCQl9CisJfSAvLyBnZXRTdHJpbmcKK30gLy8gU29sdmVyTWVzc2FnZXMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yay9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9zb2x2ZXJzL3JrL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvc29sdmVycy9yay9tZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNDY3ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLnNvbHZlcnMucmsvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvc29sdmVycy9yay9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTQgQEAKKyMvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorIyAqDQorIyAqIENvbnRyaWJ1dG9yczoNCisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCityZWxhdGl2ZVRvbGVyYW5jZT1SZWxhdGl2ZSBUb2xlcmFuY2UNCityZWxhdGl2ZVRvbGVyYW5jZVVOSVQ9DQorcmVsYXRpdmVUb2xlcmFuY2VUVD1TcGVjaWZ5IHRoZSByZWxhdGl2ZSB0b2xlcmFuY2UgZm9yIHRoZSBSdW5nZSBLdXR0YSBzb2x2ZXINCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5zdGVtLnVpLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZTg2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS8uY3ZzaWdub3JlIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NWU4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLy5jdnNpZ25vcmUKQEAgLTAsMCArMSBAQAorVGh1bWJzLmRiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLy5mYnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS8uZmJwcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2E5OWNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS8uZmJwcmVmcwpAQCAtMCwwICsxLDE0NyBAQAorI0ZpbmRCdWdzIFVzZXIgUHJlZmVyZW5jZXMKKyNUdWUgTWF5IDI3IDE2OjEwOjU4IEVEVCAyMDA4CitkZXRlY3RvckFwcGVuZGluZ1RvQW5PYmplY3RPdXRwdXRTdHJlYW09QXBwZW5kaW5nVG9Bbk9iamVjdE91dHB1dFN0cmVhbXx0cnVlCitkZXRlY3RvckJDUE1ldGhvZFJldHVybkNoZWNrPUJDUE1ldGhvZFJldHVybkNoZWNrfGZhbHNlCitkZXRlY3RvckJhZEFwcGxldENvbnN0cnVjdG9yPUJhZEFwcGxldENvbnN0cnVjdG9yfGZhbHNlCitkZXRlY3RvckJhZFJlc3VsdFNldEFjY2Vzcz1CYWRSZXN1bHRTZXRBY2Nlc3N8dHJ1ZQorZGV0ZWN0b3JCYWRTeW50YXhGb3JSZWd1bGFyRXhwcmVzc2lvbj1CYWRTeW50YXhGb3JSZWd1bGFyRXhwcmVzc2lvbnx0cnVlCitkZXRlY3RvckJhZFVzZU9mUmV0dXJuVmFsdWU9QmFkVXNlT2ZSZXR1cm5WYWx1ZXx0cnVlCitkZXRlY3RvckJhZGx5T3ZlcnJpZGRlbkFkYXB0ZXI9QmFkbHlPdmVycmlkZGVuQWRhcHRlcnx0cnVlCitkZXRlY3RvckJvb2xlYW5SZXR1cm5OdWxsPUJvb2xlYW5SZXR1cm5OdWxsfHRydWUKK2RldGVjdG9yQ2FsbGVkTWV0aG9kcz1DYWxsZWRNZXRob2RzfHRydWUKK2RldGVjdG9yQ2hlY2tDYWxscz1DaGVja0NhbGxzfGZhbHNlCitkZXRlY3RvckNoZWNrSW1tdXRhYmxlQW5ub3RhdGlvbj1DaGVja0ltbXV0YWJsZUFubm90YXRpb258dHJ1ZQorZGV0ZWN0b3JDaGVja1R5cGVRdWFsaWZpZXJzPUNoZWNrVHlwZVF1YWxpZmllcnN8dHJ1ZQorZGV0ZWN0b3JDbG9uZUlkaW9tPUNsb25lSWRpb218dHJ1ZQorZGV0ZWN0b3JDb21wYXJhdG9ySWRpb209Q29tcGFyYXRvcklkaW9tfHRydWUKK2RldGVjdG9yQ29uZnVzZWRJbmhlcml0YW5jZT1Db25mdXNlZEluaGVyaXRhbmNlfHRydWUKK2RldGVjdG9yQ29uZnVzaW9uQmV0d2VlbkluaGVyaXRlZEFuZE91dGVyTWV0aG9kPUNvbmZ1c2lvbkJldHdlZW5Jbmhlcml0ZWRBbmRPdXRlck1ldGhvZHx0cnVlCitkZXRlY3RvckNyb3NzU2l0ZVNjcmlwdGluZz1Dcm9zc1NpdGVTY3JpcHRpbmd8dHJ1ZQorZGV0ZWN0b3JEb0luc2lkZURvUHJpdmlsZWdlZD1Eb0luc2lkZURvUHJpdmlsZWdlZHx0cnVlCitkZXRlY3RvckRvbnRDYXRjaElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb249RG9udENhdGNoSWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbnx0cnVlCitkZXRlY3RvckRvbnRVc2VFbnVtPURvbnRVc2VFbnVtfHRydWUKK2RldGVjdG9yRHJvcHBlZEV4Y2VwdGlvbj1Ecm9wcGVkRXhjZXB0aW9ufHRydWUKK2RldGVjdG9yRHVtYk1ldGhvZEludm9jYXRpb25zPUR1bWJNZXRob2RJbnZvY2F0aW9uc3x0cnVlCitkZXRlY3RvckR1bWJNZXRob2RzPUR1bWJNZXRob2RzfHRydWUKK2RldGVjdG9yRHVwbGljYXRlQnJhbmNoZXM9RHVwbGljYXRlQnJhbmNoZXN8dHJ1ZQorZGV0ZWN0b3JFbXB0eVppcEZpbGVFbnRyeT1FbXB0eVppcEZpbGVFbnRyeXx0cnVlCitkZXRlY3RvckVxU3RyaW5nVGVzdD1FcVN0cmluZ1Rlc3R8ZmFsc2UKK2RldGVjdG9yRmllbGRJdGVtU3VtbWFyeT1GaWVsZEl0ZW1TdW1tYXJ5fHRydWUKK2RldGVjdG9yRmluYWxpemVyTnVsbHNGaWVsZHM9RmluYWxpemVyTnVsbHNGaWVsZHN8dHJ1ZQorZGV0ZWN0b3JGaW5kQmFkQ2FzdD1GaW5kQmFkQ2FzdHxmYWxzZQorZGV0ZWN0b3JGaW5kQmFkQ2FzdDI9RmluZEJhZENhc3QyfHRydWUKK2RldGVjdG9yRmluZEJhZEVxdWFsc0ltcGxlbWVudGF0aW9uPUZpbmRCYWRFcXVhbHNJbXBsZW1lbnRhdGlvbnxmYWxzZQorZGV0ZWN0b3JGaW5kQmFkRm9yTG9vcD1GaW5kQmFkRm9yTG9vcHx0cnVlCitkZXRlY3RvckZpbmRCdWdzU3VtbWFyeVN0YXRzPUZpbmRCdWdzU3VtbWFyeVN0YXRzfHRydWUKK2RldGVjdG9yRmluZENpcmN1bGFyRGVwZW5kZW5jaWVzPUZpbmRDaXJjdWxhckRlcGVuZGVuY2llc3xmYWxzZQorZGV0ZWN0b3JGaW5kRGVhZExvY2FsU3RvcmVzPUZpbmREZWFkTG9jYWxTdG9yZXN8dHJ1ZQorZGV0ZWN0b3JGaW5kRG91YmxlQ2hlY2s9RmluZERvdWJsZUNoZWNrfHRydWUKK2RldGVjdG9yRmluZEVtcHR5U3luY2hyb25pemVkQmxvY2s9RmluZEVtcHR5U3luY2hyb25pemVkQmxvY2t8dHJ1ZQorZGV0ZWN0b3JGaW5kRmllbGRTZWxmQXNzaWdubWVudD1GaW5kRmllbGRTZWxmQXNzaWdubWVudHx0cnVlCitkZXRlY3RvckZpbmRGaW5hbGl6ZUludm9jYXRpb25zPUZpbmRGaW5hbGl6ZUludm9jYXRpb25zfHRydWUKK2RldGVjdG9yRmluZEZsb2F0RXF1YWxpdHk9RmluZEZsb2F0RXF1YWxpdHl8dHJ1ZQorZGV0ZWN0b3JGaW5kRmxvYXRNYXRoPUZpbmRGbG9hdE1hdGh8ZmFsc2UKK2RldGVjdG9yRmluZEhFbWlzbWF0Y2g9RmluZEhFbWlzbWF0Y2h8dHJ1ZQorZGV0ZWN0b3JGaW5kSW5jb25zaXN0ZW50U3luYzI9RmluZEluY29uc2lzdGVudFN5bmMyfHRydWUKK2RldGVjdG9yRmluZEpTUjE2NkxvY2tNb25pdG9yZW50ZXI9RmluZEpTUjE2NkxvY2tNb25pdG9yZW50ZXJ8dHJ1ZQorZGV0ZWN0b3JGaW5kTG9jYWxTZWxmQXNzaWdubWVudDI9RmluZExvY2FsU2VsZkFzc2lnbm1lbnQyfHRydWUKK2RldGVjdG9yRmluZE1hc2tlZEZpZWxkcz1GaW5kTWFza2VkRmllbGRzfHRydWUKK2RldGVjdG9yRmluZE1pc21hdGNoZWRXYWl0T3JOb3RpZnk9RmluZE1pc21hdGNoZWRXYWl0T3JOb3RpZnl8dHJ1ZQorZGV0ZWN0b3JGaW5kTmFrZWROb3RpZnk9RmluZE5ha2VkTm90aWZ5fHRydWUKK2RldGVjdG9yRmluZE5vblNlcmlhbGl6YWJsZVN0b3JlSW50b1Nlc3Npb249RmluZE5vblNlcmlhbGl6YWJsZVN0b3JlSW50b1Nlc3Npb258dHJ1ZQorZGV0ZWN0b3JGaW5kTm9uU2VyaWFsaXphYmxlVmFsdWVQYXNzZWRUb1dyaXRlT2JqZWN0PUZpbmROb25TZXJpYWxpemFibGVWYWx1ZVBhc3NlZFRvV3JpdGVPYmplY3R8dHJ1ZQorZGV0ZWN0b3JGaW5kTm9uU2hvcnRDaXJjdWl0PUZpbmROb25TaG9ydENpcmN1aXR8dHJ1ZQorZGV0ZWN0b3JGaW5kTnVsbERlcmVmPUZpbmROdWxsRGVyZWZ8dHJ1ZQorZGV0ZWN0b3JGaW5kT3BlblN0cmVhbT1GaW5kT3BlblN0cmVhbXx0cnVlCitkZXRlY3RvckZpbmRQdXp6bGVycz1GaW5kUHV6emxlcnN8dHJ1ZQorZGV0ZWN0b3JGaW5kUmVmQ29tcGFyaXNvbj1GaW5kUmVmQ29tcGFyaXNvbnx0cnVlCitkZXRlY3RvckZpbmRSZXR1cm5SZWY9RmluZFJldHVyblJlZnx0cnVlCitkZXRlY3RvckZpbmRSdW5JbnZvY2F0aW9ucz1GaW5kUnVuSW52b2NhdGlvbnN8dHJ1ZQorZGV0ZWN0b3JGaW5kU2VsZkNvbXBhcmlzb249RmluZFNlbGZDb21wYXJpc29ufHRydWUKK2RldGVjdG9yRmluZFNlbGZDb21wYXJpc29uMj1GaW5kU2VsZkNvbXBhcmlzb24yfHRydWUKK2RldGVjdG9yRmluZFNsZWVwV2l0aExvY2tIZWxkPUZpbmRTbGVlcFdpdGhMb2NrSGVsZHx0cnVlCitkZXRlY3RvckZpbmRTcGluTG9vcD1GaW5kU3Bpbkxvb3B8dHJ1ZQorZGV0ZWN0b3JGaW5kU3FsSW5qZWN0aW9uPUZpbmRTcWxJbmplY3Rpb258dHJ1ZQorZGV0ZWN0b3JGaW5kVHdvTG9ja1dhaXQ9RmluZFR3b0xvY2tXYWl0fHRydWUKK2RldGVjdG9yRmluZFVuY2FsbGVkUHJpdmF0ZU1ldGhvZHM9RmluZFVuY2FsbGVkUHJpdmF0ZU1ldGhvZHN8dHJ1ZQorZGV0ZWN0b3JGaW5kVW5jb25kaXRpb25hbFdhaXQ9RmluZFVuY29uZGl0aW9uYWxXYWl0fHRydWUKK2RldGVjdG9yRmluZFVuaW5pdGlhbGl6ZWRHZXQ9RmluZFVuaW5pdGlhbGl6ZWRHZXR8dHJ1ZQorZGV0ZWN0b3JGaW5kVW5yZWxhdGVkVHlwZXNJbkdlbmVyaWNDb250YWluZXI9RmluZFVucmVsYXRlZFR5cGVzSW5HZW5lcmljQ29udGFpbmVyfHRydWUKK2RldGVjdG9yRmluZFVucmVsZWFzZWRMb2NrPUZpbmRVbnJlbGVhc2VkTG9ja3x0cnVlCitkZXRlY3RvckZpbmRVbnNhdGlzZmllZE9ibGlnYXRpb249RmluZFVuc2F0aXNmaWVkT2JsaWdhdGlvbnxmYWxzZQorZGV0ZWN0b3JGaW5kVW5zeW5jR2V0PUZpbmRVbnN5bmNHZXR8dHJ1ZQorZGV0ZWN0b3JGaW5kVXNlbGVzc0NvbnRyb2xGbG93PUZpbmRVc2VsZXNzQ29udHJvbEZsb3d8dHJ1ZQorZGV0ZWN0b3JIdWdlU2hhcmVkU3RyaW5nQ29uc3RhbnRzPUh1Z2VTaGFyZWRTdHJpbmdDb25zdGFudHN8dHJ1ZQorZGV0ZWN0b3JJRGl2UmVzdWx0Q2FzdFRvRG91YmxlPUlEaXZSZXN1bHRDYXN0VG9Eb3VibGV8dHJ1ZQorZGV0ZWN0b3JJbmNvbXBhdE1hc2s9SW5jb21wYXRNYXNrfHRydWUKK2RldGVjdG9ySW5lZmZpY2llbnRNZW1iZXJBY2Nlc3M9SW5lZmZpY2llbnRNZW1iZXJBY2Nlc3N8ZmFsc2UKK2RldGVjdG9ySW5lZmZpY2llbnRUb0FycmF5PUluZWZmaWNpZW50VG9BcnJheXx0cnVlCitkZXRlY3RvckluZmluaXRlTG9vcD1JbmZpbml0ZUxvb3B8dHJ1ZQorZGV0ZWN0b3JJbmZpbml0ZVJlY3Vyc2l2ZUxvb3A9SW5maW5pdGVSZWN1cnNpdmVMb29wfHRydWUKK2RldGVjdG9ySW5maW5pdGVSZWN1cnNpdmVMb29wMj1JbmZpbml0ZVJlY3Vyc2l2ZUxvb3AyfGZhbHNlCitkZXRlY3RvckluaGVyaXRhbmNlVW5zYWZlR2V0UmVzb3VyY2U9SW5oZXJpdGFuY2VVbnNhZmVHZXRSZXNvdXJjZXx0cnVlCitkZXRlY3RvckluaXRpYWxpemF0aW9uQ2hhaW49SW5pdGlhbGl6YXRpb25DaGFpbnxmYWxzZQorZGV0ZWN0b3JJbnN0YW50aWF0ZVN0YXRpY0NsYXNzPUluc3RhbnRpYXRlU3RhdGljQ2xhc3N8dHJ1ZQorZGV0ZWN0b3JJbnZhbGlkSlVuaXRUZXN0PUludmFsaWRKVW5pdFRlc3R8dHJ1ZQorZGV0ZWN0b3JJdGVyYXRvcklkaW9tcz1JdGVyYXRvcklkaW9tc3x0cnVlCitkZXRlY3RvckxhenlJbml0PUxhenlJbml0fHRydWUKK2RldGVjdG9yTG9hZE9mS25vd25OdWxsVmFsdWU9TG9hZE9mS25vd25OdWxsVmFsdWV8dHJ1ZQorZGV0ZWN0b3JMb2NrZWRGaWVsZHM9TG9ja2VkRmllbGRzfGZhbHNlCitkZXRlY3Rvck1ldGhvZFJldHVybkNoZWNrPU1ldGhvZFJldHVybkNoZWNrfHRydWUKK2RldGVjdG9yTWV0aG9kcz1NZXRob2RzfHRydWUKK2RldGVjdG9yTXVsdGl0aHJlYWRlZEluc3RhbmNlQWNjZXNzPU11bHRpdGhyZWFkZWRJbnN0YW5jZUFjY2Vzc3x0cnVlCitkZXRlY3Rvck11dGFibGVMb2NrPU11dGFibGVMb2NrfHRydWUKK2RldGVjdG9yTXV0YWJsZVN0YXRpY0ZpZWxkcz1NdXRhYmxlU3RhdGljRmllbGRzfHRydWUKK2RldGVjdG9yTmFtaW5nPU5hbWluZ3x0cnVlCitkZXRlY3Rvck5vdGVBbm5vdGF0aW9uUmV0ZW50aW9uPU5vdGVBbm5vdGF0aW9uUmV0ZW50aW9ufHRydWUKK2RldGVjdG9yTm90ZUNoZWNrUmV0dXJuVmFsdWU9Tm90ZUNoZWNrUmV0dXJuVmFsdWV8dHJ1ZQorZGV0ZWN0b3JOb3RlQ2hlY2tSZXR1cm5WYWx1ZUFubm90YXRpb25zPU5vdGVDaGVja1JldHVyblZhbHVlQW5ub3RhdGlvbnN8dHJ1ZQorZGV0ZWN0b3JOb3RlRGlyZWN0bHlSZWxldmFudFR5cGVRdWFsaWZpZXJzPU5vdGVEaXJlY3RseVJlbGV2YW50VHlwZVF1YWxpZmllcnN8dHJ1ZQorZGV0ZWN0b3JOb3RlSkNJUEFubm90YXRpb249Tm90ZUpDSVBBbm5vdGF0aW9ufHRydWUKK2RldGVjdG9yTm90ZU5vbk51bGxBbm5vdGF0aW9ucz1Ob3RlTm9uTnVsbEFubm90YXRpb25zfHRydWUKK2RldGVjdG9yTm90ZU5vbm51bGxSZXR1cm5WYWx1ZXM9Tm90ZU5vbm51bGxSZXR1cm5WYWx1ZXN8dHJ1ZQorZGV0ZWN0b3JOb3RlU3VwcHJlc3NlZFdhcm5pbmdzPU5vdGVTdXBwcmVzc2VkV2FybmluZ3N8dHJ1ZQorZGV0ZWN0b3JOb3RlVW5jb25kaXRpb25hbFBhcmFtRGVyZWZzPU5vdGVVbmNvbmRpdGlvbmFsUGFyYW1EZXJlZnN8dHJ1ZQorZGV0ZWN0b3JOdW1iZXJDb25zdHJ1Y3Rvcj1OdW1iZXJDb25zdHJ1Y3Rvcnx0cnVlCitkZXRlY3Rvck92ZXJyaWRpbmdFcXVhbHNOb3RTeW1tZXRyaWNhbD1PdmVycmlkaW5nRXF1YWxzTm90U3ltbWV0cmljYWx8dHJ1ZQorZGV0ZWN0b3JQcmVmZXJaZXJvTGVuZ3RoQXJyYXlzPVByZWZlclplcm9MZW5ndGhBcnJheXN8dHJ1ZQorZGV0ZWN0b3JQdWJsaWNTZW1hcGhvcmVzPVB1YmxpY1NlbWFwaG9yZXN8ZmFsc2UKK2RldGVjdG9yUXVlc3Rpb25hYmxlQm9vbGVhbkFzc2lnbm1lbnQ9UXVlc3Rpb25hYmxlQm9vbGVhbkFzc2lnbm1lbnR8dHJ1ZQorZGV0ZWN0b3JSZWFkUmV0dXJuU2hvdWxkQmVDaGVja2VkPVJlYWRSZXR1cm5TaG91bGRCZUNoZWNrZWR8dHJ1ZQorZGV0ZWN0b3JSZWR1bmRhbnRJbnRlcmZhY2VzPVJlZHVuZGFudEludGVyZmFjZXN8dHJ1ZQorZGV0ZWN0b3JSZWZsZWN0aXZlQ2xhc3Nlcz1SZWZsZWN0aXZlQ2xhc3Nlc3x0cnVlCitkZXRlY3RvclJlc29sdmVBbGxSZWZlcmVuY2VzPVJlc29sdmVBbGxSZWZlcmVuY2VzfGZhbHNlCitkZXRlY3RvclJ1bnRpbWVFeGNlcHRpb25DYXB0dXJlPVJ1bnRpbWVFeGNlcHRpb25DYXB0dXJlfHRydWUKK2RldGVjdG9yU2VyaWFsaXphYmxlSWRpb209U2VyaWFsaXphYmxlSWRpb218dHJ1ZQorZGV0ZWN0b3JTdGFydEluQ29uc3RydWN0b3I9U3RhcnRJbkNvbnN0cnVjdG9yfHRydWUKK2RldGVjdG9yU3RhdGljQ2FsZW5kYXJEZXRlY3Rvcj1TdGF0aWNDYWxlbmRhckRldGVjdG9yfHRydWUKK2RldGVjdG9yU3RyaW5nQ29uY2F0ZW5hdGlvbj1TdHJpbmdDb25jYXRlbmF0aW9ufHRydWUKK2RldGVjdG9yU3VwZXJmbHVvdXNJbnN0YW5jZU9mPVN1cGVyZmx1b3VzSW5zdGFuY2VPZnx0cnVlCitkZXRlY3RvclN1c3BpY2lvdXNUaHJlYWRJbnRlcnJ1cHRlZD1TdXNwaWNpb3VzVGhyZWFkSW50ZXJydXB0ZWR8dHJ1ZQorZGV0ZWN0b3JTd2l0Y2hGYWxsdGhyb3VnaD1Td2l0Y2hGYWxsdGhyb3VnaHx0cnVlCitkZXRlY3RvclN5bmNocm9uaXphdGlvbk9uU2hhcmVkQnVpbHRpbkNvbnN0YW50PVN5bmNocm9uaXphdGlvbk9uU2hhcmVkQnVpbHRpbkNvbnN0YW50fHRydWUKK2RldGVjdG9yU3luY2hyb25pemVBbmROdWxsQ2hlY2tGaWVsZD1TeW5jaHJvbml6ZUFuZE51bGxDaGVja0ZpZWxkfHRydWUKK2RldGVjdG9yU3luY2hyb25pemVPbkNsYXNzTGl0ZXJhbE5vdEdldENsYXNzPVN5bmNocm9uaXplT25DbGFzc0xpdGVyYWxOb3RHZXRDbGFzc3x0cnVlCitkZXRlY3RvclN5bmNocm9uaXppbmdPbkNvbnRlbnRzT2ZGaWVsZFRvUHJvdGVjdEZpZWxkPVN5bmNocm9uaXppbmdPbkNvbnRlbnRzT2ZGaWVsZFRvUHJvdGVjdEZpZWxkfHRydWUKK2RldGVjdG9yVGVzdEFTTT1UZXN0QVNNfGZhbHNlCitkZXRlY3RvclRlc3REYXRhZmxvd0FuYWx5c2lzPVRlc3REYXRhZmxvd0FuYWx5c2lzfGZhbHNlCitkZXRlY3RvclRlc3RpbmdHcm91bmQ9VGVzdGluZ0dyb3VuZHxmYWxzZQorZGV0ZWN0b3JUcmFpbkZpZWxkU3RvcmVUeXBlcz1UcmFpbkZpZWxkU3RvcmVUeXBlc3x0cnVlCitkZXRlY3RvclRyYWluTm9uTnVsbEFubm90YXRpb25zPVRyYWluTm9uTnVsbEFubm90YXRpb25zfHRydWUKK2RldGVjdG9yVHJhaW5VbmNvbmRpdGlvbmFsRGVyZWZQYXJhbXM9VHJhaW5VbmNvbmRpdGlvbmFsRGVyZWZQYXJhbXN8dHJ1ZQorZGV0ZWN0b3JVUkxQcm9ibGVtcz1VUkxQcm9ibGVtc3x0cnVlCitkZXRlY3RvclVuY2FsbGFibGVNZXRob2RPZkFub255bW91c0NsYXNzPVVuY2FsbGFibGVNZXRob2RPZkFub255bW91c0NsYXNzfHRydWUKK2RldGVjdG9yVW5uZWNlc3NhcnlNYXRoPVVubmVjZXNzYXJ5TWF0aHx0cnVlCitkZXRlY3RvclVucmVhZEZpZWxkcz1VbnJlYWRGaWVsZHN8dHJ1ZQorZGV0ZWN0b3JVc2VPYmplY3RFcXVhbHM9VXNlT2JqZWN0RXF1YWxzfGZhbHNlCitkZXRlY3RvclVzZWxlc3NTdWJjbGFzc01ldGhvZD1Vc2VsZXNzU3ViY2xhc3NNZXRob2R8ZmFsc2UKK2RldGVjdG9yVmFyQXJnc1Byb2JsZW1zPVZhckFyZ3NQcm9ibGVtc3x0cnVlCitkZXRlY3RvclZvbGF0aWxlVXNhZ2U9Vm9sYXRpbGVVc2FnZXx0cnVlCitkZXRlY3RvcldhaXRJbkxvb3A9V2FpdEluTG9vcHx0cnVlCitkZXRlY3Rvcldyb25nTWFwSXRlcmF0b3I9V3JvbmdNYXBJdGVyYXRvcnx0cnVlCitkZXRlY3RvclhNTEZhY3RvcnlCeXBhc3M9WE1MRmFjdG9yeUJ5cGFzc3x0cnVlCitkZXRlY3Rvcl90aHJlc2hvbGQ9MgorZWZmb3J0PWRlZmF1bHQKK2V4Y2x1ZGVmaWx0ZXIwPS5zZXR0aW5ncy9maW5kYnVncy5leGNsdWRlLnhtbAorZmlsdGVyX3NldHRpbmdzPU1lZGl1bXxCQURfUFJBQ1RJQ0UsQ09SUkVDVE5FU1MsSTE4TixNQUxJQ0lPVVNfQ09ERSxNVF9DT1JSRUNUTkVTUyxQRVJGT1JNQU5DRSxTRUNVUklUWSxTVFlMRXxmYWxzZQorZmlsdGVyX3NldHRpbmdzX25lZz18CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS51aS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTMyN2YwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS8ucHJvamVjdApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLnVpPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5lZHUudW1kLmNzLmZpbmRidWdzLnBsdWdpbi5lY2xpcHNlLmZpbmRidWdzQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5lZHUudW1kLmNzLmZpbmRidWdzLnBsdWdpbi5lY2xpcHNlLmZpbmRidWdzTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLy5zZXR0aW5ncy9maW5kYnVncy5leGNsdWRlLnhtbCBiL29yZy5lY2xpcHNlLnN0ZW0udWkvLnNldHRpbmdzL2ZpbmRidWdzLmV4Y2x1ZGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NDE5OTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLy5zZXR0aW5ncy9maW5kYnVncy5leGNsdWRlLnhtbApAQCAtMCwwICsxLDE4IEBACis8RmluZEJ1Z3NGaWx0ZXI+CisgICAgPE1hdGNoPgorICAgICAgICA8UGFja2FnZSBuYW1lPSJ+b3JnXC5lY2xpcHNlXC5zdGVtXC51aS4qIiAvPgorICAgICAgICA8QnVnIGNvZGU9IlNUIiAvPgorICAgIDwvTWF0Y2g+CisgICAgPE1hdGNoPgorICAgICAgICA8UGFja2FnZSBuYW1lPSJ+b3JnXC5lY2xpcHNlXC5zdGVtXC5jb3JlLioiIC8+CisgICAgICAgIDxCdWcgY29kZT0iU0lDIiAvPgorICAgIDwvTWF0Y2g+CisgICAgPE1hdGNoPgorICAgICAgICA8Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3IiIC8+CisgICAgICAgIDxCdWcgY29kZT0iTEkiIC8+CisgICAgPC9NYXRjaD4KKyAgICAgPE1hdGNoPgorICAgICAgICA8Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2Uuc3RlbS51aS5lZGl0b3JzLklkZW50aWZpYWJsZUVkaXRvciIgLz4KKyAgICAgICAgPEJ1ZyBjb2RlPSJETFMiIC8+CisgICAgPC9NYXRjaD4KKzwvRmluZEJ1Z3NGaWx0ZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzc3YTllCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKQEAgLTAsMCArMSw1IEBACisjRnJpIFNlcCAwNyAwNzoyMTo0MSBFRFQgMjAwNworZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK2VuY29kaW5nLy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzPTg4NTlfMQorZW5jb2RpbmcvL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvbWFwL21lc3NhZ2VzLnByb3BlcnRpZXM9ODg1OV8xCitpbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MTlmODYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDgyIEBACisjVHVlIFNlcCAwMSAxNjo1MjowMyBFRFQgMjAwOQorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uPXJldHVybl90YWcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGJmZWFiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0wLDAgKzEsNTQgQEAKKyNUaHUgSmFuIDMxIDEzOjM4OjIxIEVTVCAyMDA4CitjbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9dHJ1ZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQorY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKK2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQorY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQorY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKK2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQorY2xlYW51cC51c2VfYmxvY2tzPXRydWUKK2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitjbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXBfcHJvZmlsZT1fY2xlYW51cAorY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPWphdmE7amF2YXg7b3JnO2NvbTsKK29yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD05OQorb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTk5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2I5NDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDQ2IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uuc3RlbS51aTtzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5zdGVtLmpvYnM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucywKKyBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LAorIG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkucG9wdWxhdGlvbi5odW1hbiwKKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMsCisgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLAorIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0LAorIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmxvZywKKyBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLAorIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvciwKKyBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLAorIG9yZy5lY2xpcHNlLnVpLmludHJvLAorIG9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbCwKKyBvcmcuZWNsaXBzZS5oZWxwCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJlc2VudGF0aW9uLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcmVzZW50YXRpb24sCisgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByZXNlbnRhdGlvbiwKKyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJlc2VudGF0aW9uLAorIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIsCisgb3JnLmVjbGlwc2Uuc3RlbS51aSwKKyBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLAorIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubmV3bW9kaWZpZXJwYWdlLAorIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLAorIG9yZy5lY2xpcHNlLnN0ZW0udWkuZWRpdG9ycywKKyBvcmcuZWNsaXBzZS5zdGVtLnVpLnBlcnNwZWN0aXZlcywKKyBvcmcuZWNsaXBzZS5zdGVtLnVpLnByZWZlcmVuY2VzLAorIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MsCisgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3JlciwKKyBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMsCisgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcCwKKyBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLAorIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5wcmVmZXJlbmNlcywKKyBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMsCisgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzCitCdW5kbGUtQ2xhc3NQYXRoOiAuLAorIGJpbi8KK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGYxMjhfMTI4XzMyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmMTI4XzEyOF8zMi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3NWQyZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmMTI4XzEyOF8zMi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGYxNl8xNl8zMi5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2JyYW5kaW5nL29oZjE2XzE2XzMyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWY5ZjAzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGYxNl8xNl8zMi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGYxNl8xNl84LmJtcCBiL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmMTZfMTZfOC5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JiNDNhZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmMTZfMTZfOC5ibXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGYyNF8yNF84LmJtcCBiL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmMjRfMjRfOC5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY1NjAyNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmMjRfMjRfOC5ibXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGYzMl8zMl8zMi5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2JyYW5kaW5nL29oZjMyXzMyXzMyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzRiYmZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGYzMl8zMl8zMi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGYzMl8zMl84LmJtcCBiL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmMzJfMzJfOC5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwYTliZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmMzJfMzJfOC5ibXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGY0OF80OF8zMi5ibXAgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2JyYW5kaW5nL29oZjQ4XzQ4XzMyLmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjA5OTNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGY0OF80OF8zMi5ibXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGY0OF80OF8zMi5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2JyYW5kaW5nL29oZjQ4XzQ4XzMyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWExZTlhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGY0OF80OF8zMi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGY0OF80OF84LmJtcCBiL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmNDhfNDhfOC5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0MDExZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmNDhfNDhfOC5ibXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGY2NF82NF8zMi5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2JyYW5kaW5nL29oZjY0XzY0XzMyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmI4Y2MwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGY2NF82NF8zMi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9zcGxhc2guYm1wIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9zcGxhc2guYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOTMxZmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2JyYW5kaW5nL3NwbGFzaC5ibXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9zcGxhc2gueHBtIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9zcGxhc2gueHBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZjdlOTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2JyYW5kaW5nL3NwbGFzaC54cG0KQEAgLTAsMCArMSwzOTAgQEAKKy8qIFhQTSAqLworc3RhdGljIGNoYXIgKnNwbGFzaFtdID0geworLyogY29sdW1ucyByb3dzIGNvbG9ycyBjaGFycy1wZXItcGl4ZWwgKi8KKyIxMjggMTI4IDI1NiAyIiwKKyIgICBjICMwQzU3ODgiLAorIi4gIGMgIzBDNjI5NSIsCisiWCAgYyAjMTE1MDc5IiwKKyJvICBjICMxNDE1MTYiLAorIk8gIGMgIzE0NTc4OCIsCisiKyAgYyAjMTYxOTE5IiwKKyJAICBjICMxNzU4OEEiLAorIiMgIGMgIzE5MUIxRCIsCisiJCAgYyAjMTk0ODQ4IiwKKyIlICBjICMxOTQ5NzYiLAorIiYgIGMgIzFBMUMyNCIsCisiKiAgYyAjMUIyNTI5IiwKKyI9ICBjICMxQjQzNkMiLAorIi0gIGMgIzFDMzUzOCIsCisiOyAgYyAjMUM2MTNDIiwKKyI6ICBjICMxQzY0OTYiLAorIj4gIGMgIzFEMUQyQiIsCisiLCAgYyAjMUQyQTMyIiwKKyI8ICBjICMxRDMzNDgiLAorIjEgIGMgIzFEM0EyQyIsCisiMiAgYyAjMUUyMjMyIiwKKyIzICBjICMxRjJCM0EiLAorIjQgIGMgIzFGM0I2NSIsCisiNSAgYyAjMjAxRjMwIiwKKyI2ICBjICMyMDMzM0YiLAorIjcgIGMgIzIxMUUzOCIsCisiOCAgYyAjMjIyNDM2IiwKKyI5ICBjICMyMzM5NjUiLAorIjAgIGMgIzI0MjMzRCIsCisicSAgYyAjMjQ2NzlEIiwKKyJ3ICBjICMyNTFENDYiLAorImUgIGMgIzI1MzQ1OSIsCisiciAgYyAjMjU2REEzIiwKKyJ0ICBjICMyNjI2NDgiLAorInkgIGMgIzI2NDg0QyIsCisidSAgYyAjMjcyQTU3IiwKKyJpICBjICMyNzc0QTciLAorInAgIGMgIzI4MzY0NiIsCisiYSAgYyAjMkE3NUFBIiwKKyJzICBjICMyQjNEODMiLAorImQgIGMgIzJDMUU1OSIsCisiZiAgYyAjMkMyNjY4IiwKKyJnICBjICMyRDI5NzUiLAorImggIGMgIzJFMUU3MiIsCisiaiAgYyAjMkU1MDZFIiwKKyJrICBjICMyRjFENjkiLAorImwgIGMgIzMwMUQ2MyIsCisieiAgYyAjMzA0OTUxIiwKKyJ4ICBjICMzMTFDNkEiLAorImMgIGMgIzMxMzc3MSIsCisidiAgYyAjMzIyMjc2IiwKKyJiICBjICMzMjI0NzciLAorIm4gIGMgIzMyNjA4MyIsCisibSAgYyAjMzMyNzc4IiwKKyJNICBjICMzMzI3NzkiLAorIk4gIGMgIzMzMjg3OSIsCisiQiAgYyAjMzMyODdBIiwKKyJWICBjICMzMzI5N0EiLAorIkMgIGMgIzMzMkI3QiIsCisiWiAgYyAjMzMyRDdEIiwKKyJBICBjICMzMzMwN0UiLAorIlMgIGMgIzMzMzQ4MSIsCisiRCAgYyAjMzM4MUFGIiwKKyJGICBjICMzNDJBN0IiLAorIkcgIGMgIzM0MkI3QiIsCisiSCAgYyAjMzQyQzdDIiwKKyJKICBjICMzNDNDNTUiLAorIksgIGMgIzM0N0FBQyIsCisiTCAgYyAjMzUyOTdBIiwKKyJQICBjICMzNTJBN0IiLAorIkkgIGMgIzM1MkM3QyIsCisiVSAgYyAjMzUyRDdDIiwKKyJZICBjICMzNTJEN0QiLAorIlQgIGMgIzM1MkU3RCIsCisiUiAgYyAjMzUzMTdGIiwKKyJFICBjICMzNTNGODgiLAorIlcgIGMgIzM1NDQ1NiIsCisiUSAgYyAjMzYyQzdDIiwKKyIhICBjICMzNjJEN0QiLAorIn4gIGMgIzM2MkY3RSIsCisiXiAgYyAjMzYzMDdFIiwKKyIvICBjICMzNjMxN0YiLAorIiggIGMgIzM2Mzk4NCIsCisiKSAgYyAjMzY3OUFGIiwKKyJfICBjICMzNzJEN0MiLAorImAgIGMgIzM3MkY3RSIsCisiJyAgYyAjMzczMTdGIiwKKyJdICBjICMzNzMyODAiLAorIlsgIGMgIzM3MzU4MSIsCisieyAgYyAjMzgzMzgwIiwKKyJ9ICBjICMzODQ4OEUiLAorInwgIGMgIzM5MkM3QyIsCisiIC4gYyAjMzkyRTdEIiwKKyIuLiBjICMzOTMwN0YiLAorIlguIGMgIzM5MzQ4MSIsCisiby4gYyAjMzkzNjgyIiwKKyJPLiBjICMzQTMxN0YiLAorIisuIGMgIzNBMzQ4MSIsCisiQC4gYyAjM0EzNjgyIiwKKyIjLiBjICMzQTM5ODQiLAorIiQuIGMgIzNCMzM4MCIsCisiJS4gYyAjM0IzNDgxIiwKKyImLiBjICMzQjM2ODIiLAorIiouIGMgIzNCM0E4NSIsCisiPS4gYyAjM0I1OTlCIiwKKyItLiBjICMzQjgzQjYiLAorIjsuIGMgIzNDNDM4QiIsCisiOi4gYyAjM0QzMzgwIiwKKyI+LiBjICMzRDM2ODIiLAorIiwuIGMgIzNEMzk4NCIsCisiPC4gYyAjM0QzRjg4IiwKKyIxLiBjICMzRDREOTIiLAorIjIuIGMgIzNFM0Q4NyIsCisiMy4gYyAjM0U1Mjk1IiwKKyI0LiBjICMzRjNBODUiLAorIjUuIGMgIzQxM0E4NSIsCisiNi4gYyAjNDEzRDg3IiwKKyI3LiBjICM0MTU2OTkiLAorIjguIGMgIzQyM0Y4OCIsCisiOS4gYyAjNDI0Mjg5IiwKKyIwLiBjICM0MjUzOTYiLAorInEuIGMgIzQzM0Q3MSIsCisidy4gYyAjNDM0NThDIiwKKyJlLiBjICM0MzREOTIiLAorInIuIGMgIzQ0M0E4NSIsCisidC4gYyAjNDQ1QjlDIiwKKyJ5LiBjICM0NTQyOEEiLAorInUuIGMgIzQ1NDg4QyIsCisiaS4gYyAjNDU1Nzk5IiwKKyJwLiBjICM0NjQ0OEIiLAorImEuIGMgIzQ2NTE1QyIsCisicy4gYyAjNDY4NEI5IiwKKyJkLiBjICM0ODUzNjgiLAorImYuIGMgIzQ4NUZBMCIsCisiZy4gYyAjNDg2NkE1IiwKKyJoLiBjICM0ODc4QjUiLAorImouIGMgIzRBNDU4QiIsCisiay4gYyAjNEI0OThFIiwKKyJsLiBjICM0QjREOTEiLAorInouIGMgIzRCODNCQSIsCisieC4gYyAjNEI5MEMzIiwKKyJjLiBjICM0QzU2OTgiLAorInYuIGMgIzRDNUM5RCIsCisiYi4gYyAjNEM2MkEyIiwKKyJuLiBjICM0RDUzOTUiLAorIm0uIGMgIzRENzQ4OCIsCisiTS4gYyAjNEY1Qzg0IiwKKyJOLiBjICM0RjY5NzMiLAorIkIuIGMgIzUyNEQ5MSIsCisiVi4gYyAjNTI1Mzk1IiwKKyJDLiBjICM1MzY3OTAiLAorIlouIGMgIzUzNzFBRCIsCisiQS4gYyAjNTM4RUMyIiwKKyJTLiBjICM1NDU3OTkiLAorIkQuIGMgIzU0NUM5QyIsCisiRi4gYyAjNTQ2NEEyIiwKKyJHLiBjICM1NDc3OEMiLAorIkguIGMgIzU0ODdCRCIsCisiSi4gYyAjNTU0NjhEIiwKKyJLLiBjICM1NTdDOTMiLAorIkwuIGMgIzU3NzlCNCIsCisiUC4gYyAjNTc5N0M3IiwKKyJJLiBjICM1ODY5QTciLAorIlUuIGMgIzVCNTM5NiIsCisiWS4gYyAjNUI1QzlDIiwKKyJULiBjICM1QzY5N0IiLAorIlIuIGMgIzVDNkRBOSIsCisiRS4gYyAjNUM3MkFEIiwKKyJXLiBjICM1RjZBNzIiLAorIlEuIGMgIzYwQTFDQyIsCisiIS4gYyAjNjE1QzlDIiwKKyJ+LiBjICM2MzY1QTIiLAorIl4uIGMgIzYzNkVBOSIsCisiLy4gYyAjNjQ2QUE2IiwKKyIoLiBjICM2NDczQUUiLAorIikuIGMgIzY0N0JCNSIsCisiXy4gYyAjNjU3Mzc5IiwKKyJgLiBjICM2NjYzOUMiLAorIicuIGMgIzY2ODJCQSIsCisiXS4gYyAjNjY5ODU4IiwKKyJbLiBjICM2NjlDQ0MiLAorInsuIGMgIzY3NzhCMSIsCisifS4gYyAjNjc3QThGIiwKKyJ8LiBjICM2NzgzOTgiLAorIiBYIGMgIzZBNzJBQyIsCisiLlggYyAjNkE4NUJDIiwKKyJYWCBjICM2QjZCQTciLAorIm9YIGMgIzZFODc5MCIsCisiT1ggYyAjNkU4RUFDIiwKKyIrWCBjICM3MDkwQzQiLAorIkBYIGMgIzczNzNBQiIsCisiI1ggYyAjNzVBOEQ1IiwKKyIkWCBjICM3NUFDRDciLAorIiVYIGMgIzc2OTRDNyIsCisiJlggYyAjNzc3Q0IyIiwKKyIqWCBjICM3OTg1QkEiLAorIj1YIGMgIzc5OTdBQyIsCisiLVggYyAjN0RCQkU0IiwKKyI7WCBjICM4NDgyN0UiLAorIjpYIGMgIzg0OEZDMSIsCisiPlggYyAjODVBOEQ2IiwKKyIsWCBjICM4Nzg4QkEiLAorIjxYIGMgIzg3OTVDNSIsCisiMVggYyAjODhCM0REIiwKKyIyWCBjICM4OTdGOTkiLAorIjNYIGMgIzg5QkJFMiIsCisiNFggYyAjOEFBNUI3IiwKKyI1WCBjICM4QjkzOTMiLAorIjZYIGMgIzhEOTJBRiIsCisiN1ggYyAjOERDMEU1IiwKKyI4WCBjICM5MUEyQUUiLAorIjlYIGMgIzkyQkNFMiIsCisiMFggYyAjOTZCMEQ0IiwKKyJxWCBjICM5N0ExOTciLAorIndYIGMgIzk3QTdCNyIsCisiZVggYyAjOTdBQUQ0IiwKKyJyWCBjICM5ODlBQzciLAorInRYIGMgIzk4QzNFNiIsCisieVggYyAjOTlBM0NDIiwKKyJ1WCBjICM5QUI0QzQiLAorImlYIGMgI0EzQkRFMSIsCisicFggYyAjQTRDOEU3IiwKKyJhWCBjICNBNjhEQkIiLAorInNYIGMgI0E3OTdDMyIsCisiZFggYyAjQTdBRUI1IiwKKyJmWCBjICNBOEEzQ0IiLAorImdYIGMgI0E5QUNEMiIsCisiaFggYyAjQUFCNUQ2IiwKKyJqWCBjICNBQkM3RDQiLAorImtYIGMgI0FFRDJFQSIsCisibFggYyAjQjFCMUNBIiwKKyJ6WCBjICNCNEI1RDkiLAorInhYIGMgI0I4RDhFQSIsCisiY1ggYyAjQjhEQ0FBIiwKKyJ2WCBjICNCOUNBREMiLAorImJYIGMgI0JCQkNEQyIsCisiblggYyAjQkJDM0UyIiwKKyJtWCBjICNDNEJDREEiLAorIk1YIGMgI0M0QzZEQyIsCisiTlggYyAjQzVDRUREIiwKKyJCWCBjICNDNURBRTkiLAorIlZYIGMgI0M2QzhFMiIsCisiQ1ggYyAjQ0JFMERBIiwKKyJaWCBjICNEMkU1RUIiLAorIkFYIGMgI0QzQ0RFMyIsCisiU1ggYyAjRDlEQkU3IiwKKyJEWCBjICNEQUU1RUIiLAorIkZYIGMgI0UzRTlFQyIsCisiR1ggYyAjRTdFQ0YxIiwKKyJIWCBjICNFQUYzRUUiLAorIkpYIGMgI0VERjRGMyIsCisiS1ggYyAjRjJGNEY1IiwKKyJMWCBjICNGNUY5RjkiLAorIlBYIGMgI0Y5RkNGQyIsCisiSVggYyAjRkVGRUZFIiwKKyJVWCBjIGdyYXkxMDAiLAorLyogcGl4ZWxzICovCisiWSBZIFkgWSBZIFkgWSBZIH4gLi5IIFkgWSBZIFkgWiBfIF8gWSAhIFkgXyAhIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEkgSSBJIFUgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiWSBZIFkgWSBZIFkgWSBVIH4gLi5IIFkgWSBZIFkgVSBfIF8gWSAgLlkgXyAhIFkgWSBZIFkgWSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgSSBJIEkgSSBJIEkgWSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiWSBZIFkgWSBZIFkgWSBVIH4gXSBIIFkgWSBZIFkgISBRIFkgIC4gLlkgXyBfIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiWSBZIFkgWSBZIFkgWSBVIH4gXSBIIFkgWSBZICEgISBZIC4uYCAgLiEgUSBfIFkgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSSBJIFkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiWSBZIFkgWSBZIFkgWSBaIH4gXSBIIFkgISAhICEgWSAuLmAgIC5gIC4uWSAhIFkgWSBZIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiWSBZIFkgWSBZICEgISAhIFEgWC5RICEgISAhICEgXyBgIGAgIC5gICAuWSAhICEgWSBZIFkgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiISAhICEgISAhICEgISAhIFEgeyBJICEgISAhIFkgIC5gICAuIC5gICAuSCAhICEgWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgSSBJIEkgSSBJIFkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiISAhICEgISAhICEgISBVICcgJyBVICEgISBZICAuYCBgICAuIC5gIGAgUSB7ICEgISBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiVSBVIFUgVSBVIFUgVSBHIF0gYCBJIFUgSSAgLmAgYCAhICAuIC5gIGAgXSBRICEgISBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSSBZIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiXiBeIF4gXiBeIF4gXiB+IF0gYCB+IGAgXSAvIFIgTy4gLiAuIC5gICAueyBJICEgISAhIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgSSBJIEkgSSBJIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisifiB+IGAgYCBgIGAgYCAgLlgueyAvIC8gLyAvIGAgLi4uLk8uLi5gICcgJyBJICEgISAhICEgISBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiLyAvIC8gLyAvIC8gLyBSICQuXSAvIC8gLyBgIC4uLi4uLi4uLi4uLnsgLyB+IFEgISAhICEgISAhICEgWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiLyAvIC8gLyAvIC8gLyBeIE8uXSBeIC8gYCAuLi4uYCA6Li4uLi4uLisuUiB7IH4gXiBVICEgISAhICEgISBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBVIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiLyAvIC8gLyAvIC8geyB+IE8uXSAnIC8gXSBgIC4uLi46Li4uLi4uLisuUiAvIC8gfiB+ICEgVSAhICEgISAhIFUgLyAvIFkgWSBZIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBVIFUgSSBJIEkgSSBJIFkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiJyAnICcgJyAnICcgeyAvICYuXSAnICcgXSAuLmAgTy46Li4uYCAlLk8uUiAvIC8gLyBgIH4gXiAhIFUgISAhIFUgXSBIIFkgWSBZIFkgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiJyAnICcgJyAnICcgXSBeIEAuXiAnICcgYCAuLi4uOi46Li4uYCBYLi8gLyAvIC8gLyAvIGAgfiB+IF4gVSBVIHsgVSAhIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBVIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiJyAnIC8gLyAvIF0geyAvID4uLyAuLi4uLi5gIE8uJS46Li4uLi5YLicgJyAvIC8gLyAvIC8gLyBgIH4gfiBgIGAgVSAhICEgISBZIFkgWSBZIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisieyB7IHsgKy4lLlguKy4rLiwuKy5YLkAuTy5PLiUuJC46LiAuJC5PLicgJyAnICcgLyAvIC8gLyAvIC8gYCB7IH4gVSAhICEgISAhIFkgWSBZIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBVIFUgSSBJIEkgSSBJIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiKy4rLisuKy4lLlguJS5dICwueyAuLi4uLi4lLiQuJC4kLk8uPi4gLi8gJyAnICcgJyAvIC8gLyAvIC8gWC5gIH4gXiBVICEgISAhICEgWSBZIFkgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIFkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiKy4rLisuJS4lLisuJi5PLjQuJC4lLisuJC4kLiQuJC4mLj4uJS5YLnsgLyAnICcgJyAnICcgLyBeIHsgLyAvIGAgfiBeICEgISAhICEgISBZIFkgWSBZIFkgWSBZIFkgWSBVIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiJS4lLiUuJS4rLiUuJi4uLjQuTy4lLiUuTy4kLj4uPi4+LiUuJS4rLlguKy57IF0gJyAnICcgJyBdIHsgLyAvIC8gYCB+IF4gVSAhICEgISAhIFkgWSBZIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiJC4kLiQuJS4mLiYuJi4rLjIuJC4lLiUuJC5PLjUuPi5PLiwuJS4uLisuKy4rLisueyAvICcgJyArLicgLyAvIC8gLyBgIH4gfiAhICEgISAhICEgWSBZIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiJi4mLiYuJi4mLiYuJi4kLjYuKy4mLiYuby4sLjUuPi4+LiYuJC4lLiUuKy4rLisuWC57IFIgKy4vICcgJyAvIC8gLyAvIC8gfiBeIFUgISAhICEgWSBZIFkgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIFUgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiJi4mLiYuJi4mLiYuNC5ALjIuWC4mLlguPi5yLnIuLC4yLkAuJS4kLiUuJS4lLisuKy4rLiUuKy4vICcgJyAnIC8gLyAvIC8gYCB+IF4gVSAhICEgISBZIFkgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiJi4mLiYuQC5YLj4uLC5YLjQueyAsLj4uLC5yLnIuLC40LisuJi4mLiUuJC4lLiUuJS4lLiYuKy57IC8gJyAnICcgLyAvIC8gLyBgIH4gXiBVICEgISAhIFkgWSBZIFkgWSBZIFkgWSBVIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIFkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiWC5YLiYuPi40LjQuNC4sLnkuNC40LjQuNS5yLjUuNC4sLkAuJi4mLiYuJi4rLiQuJC5ALlguKy5YLnsgLyAnICcgJyAvIC8gLyAvIGAgfiAhICEgISAhICEgWSBZIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiNC40LjYuNC40LjQuMi4sLjYuLC40Liwuci5yLnIuMi4sLiUuQC4mLiYuJi4mLisuJi4lLiUuKy4rLlgueyAvICcgJyAnIC8gLyAvIC8gfiB+ICEgISAhICEgWSBZIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgWSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiNC40LjQuNC4sLjYuNi41LjguNC41LjQuci5yLjYueS40LjQuQC5ALiYuJi4lLiYuNC5PLiUuJS4lLisuWC57IC8gJyAnICcgLyAvIC8gLyB+IF4gVSAhICEgISBZIFkgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiLC41LjUuOC44LjgucC44LnAuNi44LjYuai55LjYuNi4sLjQuNC40LlguQC5ALjIuKy4mLisuJS4lLiUuKy5YLnsgLyAnICcgLyAvIC8gLyBgIH4gISAhICEgISBZIFkgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIFUgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiNi42LjYuNi44LnkueS42LncuOC44Lnkuai5wLncuNi40LjUuNC40LjQuPi40LiYuJi4mLiYuJS4lLiUuKy4rLlgueyAnICcgJyAvIC8gLyAvIH4gfiBVICEgISAhIFkgWSBZIFkgWSBZIFkgWSBVIFUgVSBVIFUgVSBVIFUgSSBJIEkgSSBZIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiai4yLjYueS55LncucC55LmsuOS55LnkuSi5qLnAuOC44LjYuNS40LjQuOC40LlguJi4mLiYuJi4lLiUuJS4rLisuWC5dICcgJyAnIC8gLyAvIC8gfiBeIFUgISAhIFkgWSBZIFkgWSBZIFkgWSBVIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiQi5rLnkucC5wLnAuay5rLmsueS5wLkIuSi5wLnkuOC44LjYuOC41LiwuOC40LjQuWC4mLiYuJi4mLisuJS4lLisuKy4rLi8gJyAnICcgLyAvIC8gYCB+ICEgISAhICEgWSBZIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisibi5WLnAueS55LnUuai5rLnUueS5rLkouQi5sLnkudy53LjYuNi42LnkuNS40LjQuNC4lLiYuJi4mLiYuJC4lLiUuKy4rLnsgJyAnICcgLyAvIC8gYCB+IF4gVSAhICEgWSBZIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIFkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisibC5uLmwuay5rLmwuay5rLkIuay5rLkouQi5rLnkucC5wLnAuOS55LjguOC41LjQuNC40LlguJi4mLiYuJi4kLiUuKy4rLisuXSAnICcgJyAvIC8gLyBgIH4gVSAhICEgISBZIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisibC5CLlUubC5sLmwubi5WLkIuay5WLlUuQi5CLmsucC5qLmouai5wLjYuNi44LjUuNC40LjQuWC4mLiYuJi4lLiUuJS4rLisueyAvICcgJyAvIC8gLyAvIH4gISAhICEgISBZIFkgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgWSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiQi5VLlUuVS5uLmMuVS5WLlYuQi5VLlUuUy5sLmsuay55Lnkuay5wLncuOC42LjguNS40LjQuNC5ALiYuJi4mLisuJS4lLisuKy5dICcgJyAnIC8gLyAvIH4gXiBVICEgISBZIFkgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiVS5ZLlkuWS5CLlYuWS4hLiEuVS4hLiEuVi5sLmwubC5CLmwueS5qLnAudy44LjYuOC4sLjQuNC4rLiYuJi4mLiYuJC4lLisuKy57IC8gJyAnIC8gLyAvIGAgfiAhICEgISAhIFkgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiWS5ZLlkuYC4hLlMuIS5+LlkuWS5YWGAuVS5VLm4ubi5CLm4uay55LmoueS5wLjYuNi44LjUuNC40Lm8uJi4mLiYuJC4lLiUuKy4rLl0gJyAnIC8gLyAvIC8gfiBeIFUgISAhIFkgWSBZIFkgWSBZIFkgWSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSSBJIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiYC5gLlhYQFgvLlkuLy5YWH4uYC5gLn4uWS5ZLlUuVS5TLmwuQi5sLnUucC53LnkuOS44LjUuLC40Lj4uQC4mLiYuJi4kLiUuKy4rLnsgJyAnICcgLyAvIC8gYCBeIFUgISAhIFkgWSBZIFkgWSBZIFkgWSBVIFUgVSBVIFUgVSBVIFUgSSBJIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiWFhAWF4uXi5eLi8uXi57Ll4uWFhAWC8uIS5ZLlkuWS5TLm4ubi5sLmsuay5wLncudy45LncuOC40LiwuQC5ALiYuJi4rLiUuKy4rLisuLyAnICcgLyAvIC8gYCB+IFUgISAhICEgWSBZIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgSSBJIEkgSSBJIEkgSSBJIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGICIsCisiWFheLl4uLFhzWGFYYVhzWGFYYVhhWEBYXi4vLl4uWS5ZLlMubi5uLlYuQi5sLnkucC5wLncueS44LjQuLC40LlguJi4lLiQuJS4rLlguXSAnICcgLyAvIC8gLyB+IF4gISAhICEgISBZIFkgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgSSBJIEkgSSBJIEkgSSBJIEkgSSBIIFkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHICIsCisiXi4mWHNYc1hyWCxYKlgqWCZYLFhzWGFYYVggWF4uLy5+LlkuIS5jLm4ubi5sLmwuZS55LncuOS45LncuNi42LiwuJi4mLiUuJS4rLisueyAnICcgJyAvIC8gLyAvIH4gVSAhIFUgVSBRIEggXiB+IFkgWSBZIFkgWSBZIFUgVSBVIFUgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIFkgWSBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHICIsCisiYVhmWCxYKlg8WDpYPFhyWDxYc1g6WCpYLFhzWEBYLy5YWEkuWS5ZLmMubi5uLmwubC51LnkucC53LjkueS48LiwuLC4mLiYueyAkLisuKy4vICcgJyAnIFIgUiBSICAuRyBRICcgeyBdIF0gLi5+IFkgWSBZIFkgWSBZIFkgWSBVIFUgVSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSCBIIFkgWSBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHICIsCisiYVgqWDxYclh6WGhYZ1hiWGdYYlh5WDxYOlgsWGFYJlgvLiBYUi5ZLlkuRC5uLm4uQi5sLmwudy5wLncuOS53LjwuOC4sLjQuQC4lLlguKy4uLi8gLyAvIE8uJC4mLiYuJS4nIFUgXyBJIFUgVSAhIFEgWiBZIFkgWSBZIFkgWSBZIFkgVCBRIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSCBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHICIsCisiKlg8WHpYYlhWWFZYblhOWFZYQVh6WGdYeVg6WDpYc1gmWCBYIFhSLn4uWS5ELmMuYy5WLmUuZS5lLnkudy45LnkuOC4sLiwuLC4mLkAuLC4mLiQuWC5YLiQuTy5gIF4gUiAgLlUgISBZIFkgISBfIF8gXyBfIFUgVSBaIFkgWSBZIFkgVCBRIFEgUSBRIFEgUSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBHIEcgRyBHIEcgUCBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBGICIsCisiclhnWFZYVlhTWERYRlhIWExYRlhWWG5YelhyWDpYclhzWCguIFhYWFIuWS5ZLkQubi5jLkIubC5lLmUudy53LnkueS53LjwuNi48LjQuJi4lLi4uIC5+IC4uLi4uLi4uYCBgIGAgIC4gLi4uISAhIF8gXyBfIF8gXyBfIF8gISAhICEgVSBRIFEgUSBRIFEgUSBRIFEgUSBRIFEgUSBRIFEgSSBJIEkgSSBJIEkgSSBJIEkgSSBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBGIEYgRiBGICIsCisibFhiWE5YRFhJWFVYVVhVWFVYVVhKWFNYblhiWHlYOlhmWCZYKC5YWF4uSS5ZLkQuYy5uLm4uQi5sLmMubC5rLmwudS53LjkuLC4sLiwuWyAlLiUuTy5gIC4uLi4uLi4uLi4gLmAgYCBgIGAgYCAhICEgISBZICEgISBfIF8gXyBfIF8gXyBfIF8gIC5RIFEgUSBRIFEgUSBRIFEgUSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSCBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGICIsCisiYlhBWEdYSVhVWFVYVVhVWFVYVVhVWEpYU1huWGdYPFhyWHNYKC4gWFhYUi5SLiEuRi5GLkQuUy5jLm4uay5qLjkudy45LnkuNi4sLjQuNC4mLiUuJS5PLk8uTy4uLi4uTy4gLiAuIC4gLiAuYCAgLiAuYCAhICEgISAhIF8gXyBfIF8gXyBfIFEgUSBRIFEgUSBRIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgWSBZIEggSCBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiaFhWWElYVVhVWFVYVVhVWFVYVVhVWFVYR1hWWGJYclg8WGZYey4mWCBYQFhYWH4uWS5ZLlUuQi5CLmwuay5sLmouai55LmouOC5yLj4uNS40Lj4uTy4gLk8uTy4gLiAuYCAgLnwgfCB8ICAuIC5HIFAgUSB8IHwgfCB8IHwgWSBQIFogUSBQIFAgUSBRIFEgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSCBZIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiYlhTWFVYVVhVWFVYVVhVWFVYVVhVWFVYUFhTWFZYYlhyWHpYclg6WCZYey4mWEBYQFhYWFhYLy5+Ln4uIS5TLm4ubC5CLm4ubC5lLmsucC53LjguLC4sLkAuby5vLkAuKy4vIC8gXSAnICcgJyBdIF4gVCAvIC8gfiBeIFkgVCBUIFQgVCBHIFAgUCBGIEYgRiBMIEwgUCBQIFAgTCBQIFAgUCBJIEYgRiBGIEYgRyBHIEcgRyBQIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiYlhEWFVYVVhVWFVYVVhVWFVYVVhVWFVYVVhIWEFYVlhmWGJYclg6WCpYKC4vLl4uIFggWF4uKC4oLiguKC5eLkQudi5ELkQubi4wLjAuMC4wLmUudS4qLjwuOy59IDEuZS5lLmUuZS53Lncudy47LjsuMi4qLiouKi4jLi8gUiAyLjwuPC48LjwuOS45LjwuOy4qLiouUyBIIFMgKCAoICggKCBbIFsgWyBbIC8gLyBUIFUgVSBVIE4gTiBOIE4gTiBtIG0gTiBWIEggRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiYlhEWFVYVVhVWFVYVVhVWFVYVVhVWFVYVVhGWFZYblhyWHpYKlggWHsuOlhlWDxYJlh+LmMubC5sLm4ubi5ELkkuSS5GLmIuUy5lLmUuMC5pLmkuOS5ELmMuUSAuLiAuISBMIEwgbSBiIEwgUCBRIGIgMi4yLjIuMi5YLkYuNi5rIHggdiB4IGwgbCBsIHggeCB4IGQgbSAvLmQgdCB3IHQgdyB3IHcgMCA3IDcgNyA1IDUgPiA+ID4gJiAjICMgIyAjICsgIyB2IGAgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisielhEWFVYVVhVWFVYVVhVWFVYVVhVWFVYVVhEWE1YelgsWHNYPFhTWFBYU1hyWCxYeVh6WGlYaVhlWDxYKS5uLjwuOC5VLkQuZS5lLmUuZS51Lncuby5nWHpYWFh6WHpYU1hWWG1YbVhWWE1YZlhyWGYgUCAjLiUuPi5VIE1YMlh9LiZYLFhyWDpYOlgqWCxYJlh9Lk4uSiBGWDggTi5qIG0uTi5qIGogaiAkICQgJCAtICogKiAqICYgJiAjICsgIyBvIG8gKyB4ICcgRyBHIEcgViBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiZ1h2WEtYVVhVWFVYVVhVWFVYVVhVWFVYS1hOWHpYZlhyWFBYSVhJWHdYMFhLWFBYSFhEWEJYcFh0WDNYMVgjWEgubiA5ICggQi53LjkuOC48LjIuIy5rLlhYdCBjIGQub1hQWElYSVhHWHAgOCAwIHggfiB+IH4gVCAhIGoubC41IEogeiBULnZYalhqWG9YNSA+ID4gbSBAWHQgNSBXIDYgRy5LLkcueSArICYgJiA+ID4gPiA+ICMgIyA1ICMgbyAjIG8gKyBoIFYgRiBDIFYgViBWIFYgViBWIFYgViBWIFYgQyBDIFYgViBWIFYgViBWIFYgViBWIFYgViBWICIsCisiSVhJWFVYVVhVWFVYVVhVWFVYVVhVWFVYVVhJWEpYa1hEWElYclhkWElYSVhVWFVYWlhCWGtYa1gzWCRYWy5QLkEuQS5LID0gcyApLikuKS4pLikuKS5MLlouKS5oLktYVyBNWElYUFhULkUgey4pLikuKS57LkUuRS5FLmcuZy5nLmguSlh6IHVYalhoWDMgfSBGLmIuZy49LmIuMS52WHFYcCBLLm0uMyBnIGIuZi5iLmIuYi5mLnQuNy5aLkFYNiBvIG8gbyBFIHYudC43LjcuNy43LjcuNy43LjcuNy43LjcuNy43LjcuMC4wLjAuMC4wLjAuMC4wLjAuMS59ICIsCisiS1hJWElYSVhVWFVYVVhVWFVYVVhVWElYUFhIWFVYVVhJWDxYS1hJWFVYVVhVWFVYTFhaWGtYeFg3WDFYI1hRLkgucy5EICkgJSA5ICguRS5FLkUuRS5FLkUuRS5pLkJYXy49WElYUFhqLj0uXi5aLkkuWi5aLkkuZy5iLmcuZy5nLjEuS1hXLj1Yalh1WDggdi5iLmIuZi50LmYufSByWEZYNiB9LkcuLCBnIGIudC50LnQudC50LmkuNy5FIGdYTlhvICsgbyBTIGkuMy4zLjMuMy4zLjMuMy4zLjMuMy4zLjMuMS4xLjEuMS47LjsuOy47LjsuOy47LjsuOy59ICIsCisiYVhmWGhYYlhNWEZYS1hQWExYSVhEWGJYeVhVWFVYVVhVWFVYVVhVWFVYVVhVWFVYTFhEWEJYQlhwWDNYJFhRLkguei4pIGkgciBYIHUgLC4yLiouIy5vLnsgJyAhIGdYcVhvWElYTFhxLk4gQSBUIFQgVCBBIFIgVCBHIEcgRyBDIEwgVlhfLj1Ydlh3WD4gbSBGIEYgRiBDIFYgTiB+LkZYcCB8LkcuLCBkIEMgRiBDIEMgQyBDIFYgViBNIEIuSlgrIG8gKyBoIE4gViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWICIsCisiKlg6WGdYZ1hoWGJYYlhNWFZYTVhBWHlYU1hVWFVYVVhVWFVYVVhVWFVYVVhVWFVYTFhaWGtYeFg3WDNYJFhbLkEuei5LIHIgOiAuID0gZiBqLiwuJi5YLl0gYCBJIGdYOFg9WElYTFhxLm0gWiBIIEggSCBIIFogWiBDIFogWiBGIEwgTVhXLj1Ydlh3WCYgYiBCIEIgQiBCIEIgbSAvLkZYcCB8LkcuLCBkIGAgQiBCIEIgQiBOIE0gTSBtID4uSlgsIG8gKyBoIFAgbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIE0gTSBNIE0gTSBNICIsCisiZlh5WHlYeVh6WG5YblhuWFZYTVhBWGVYSVhJWElYRlhVWFVYVVhVWFVYVVhVWFVYSlhEWHhYa1g5WDNYI1hRLkEuei5EIGEgOiBAICAgPCBSIGkudy47LjsuPC4qLnpYNlg2WElYTFhxLlIgMi4qLiouKi4qLjIuOy48LjIuMi4qLlsgQVhXLj1Ydlh3WD4gLyBvLm8uby5vLm8uXSB7LkZYcCB8LkcuLCBrICYuWyBbIF0gXSBdIC8gXSAvIF0gU1hXLm8gKyB2IFIgUiBSIFIgUiBSIEEgQSBBIF4gXiBeIF4gXiBeIF4gQSBBIEEgQSBBIFQgVCBUIFQgVCBUICIsCisiS1hQWEhYRFhIWExYTFhMWExYSFhMWEZYQlhGWDxYSVhVWFVYVVhVWFVYVVhVWExYSlhaWHhYcFg5WDNYI1hRLkguei5LIGkgOiBAICAgWCB1ICkuJy4nLicuJy5oLkJYNVg1WElYTFhxLkUuJy4pLikuJy4nLicuJy4nLikuKS4pLkwuS1g7WDRYdlh3WDIgUi5FLkUuRS5SLlIuPS5lWEZYcCB8LkcuLCBzIFIuUi5SLlIuZy50LnQudi5GLj0uZy4gWGYgZyBiLmIuYi5mLmYuZi5mLnYudi52LnYudi52LnYudi52LnYudi50LmkuaS5pLmkuaS5pLmkuaS43LiIsCisiPlhlWHpYbVh6WGhYeVh5WGhYeVhnWElYVVhLWGhYSVhVWFVYVVhVWFVYVVhVWExYR1hCWEJYdFh0WDFYWy5RLkgucy5LIHIgOiBPIFggJSAzIFMgdi5lLmUuZS47LmJYNVg4WElYTFhxLiggOy47LjsuOy47Ln0gMS47LjsuOy4xLmwuRlg7WGxYTlh1WD4gWyAjLiMuIy4jLiMuWyAmWEZYcCB8LksuLCBoIDwuKCAoIG8uMi5yWHQgKyA1IFsgWyBSIDwuOS4rLlsgWyBbIFsgWyBbIFsgWyBbIFsgUiBSIF0gXSBdIFIgUiBSIFIgUiBSIFIgUiBSIFIgLyBSICIsCisifi5+Li8uQFgsWHNYc1hmWGdYLFhtWFVYSVhNWElYVVhVWFVYVVhVWFVYVVhMWEpYRFh4WGtYOVh0WCRYUS5QLngucy5hIGkgOiBPIFggJSBlIDAgNi5vLlsgKy4hIGdYNVh3WElYTFhxLm0gWiBIIEggSCBIIEEgQSBaIFogWiBvLjQuQVg7WGxYQ1hjWD4gYiBCIEIgQiBCIEIgbSAvLkZYcCBAWEsuLCBkICEgQiBCIE0gNC5HWCwgKiAjIG0gTSBNIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBOIEYgSCBGIE4gbSBtIG0gbSBtIG0gbSBtIG0gbSBtICIsCisiWS5ZLmAufi4vLl4uIFggWEBYIFhTWElYSVg4WElYVVhVWFVYVVhVWFVYTFhKWEZYQlh4WHBYOVgzWCNYUS5BLnouRCBpIHEgOiAgICUgNCA0IDcgQSBvLlsgXSBUIGdYcVh3WElYUFhyLk4gQSBaIFogQSBBIEEgQSBSIFIgQSBBID4uU1g7WHdYTlh1WD4gYiBWIFYgViBWIFYgTiB+LkdYcS4mWCZYMyBkIFAgViBWIE0gbC5KWCYgLSAjIG0gTiBOIE0gTSBNIE0gTSBtIE0gbSBtIG0gbSBNIFYgKy55Lmsuay5rLnAuTy5WIE0gbSBtIG0gbSBtIG0gbSBOICIsCisiPlg+WGVYZVhlWDBYMFhlWDBYPlh4WEZYblh1WElYVVhVWFVYVVhJWExYSlhGWHhYeFhrWDdYdFgkWFsuUS5BLnMuSyBpIDogQCAgICUgPSA0IDIgcyBeLkYuRi4wLm5YNVh3WElYUFh5LiggNy4zLjMuMy4xLn0gRSBFIH0gfSB9IFMgTVhXLjRYdlh1WDUgMC43LjcuNy4zLjcuRSAlWEtYcS4mWCZYMyBnIEQuaS5jLkUgZ1g4WCYgLCA+IDEufSB9IH0gfSB9IDsuMS43LjsuKi47LjsuRSA7LkkuUi5ELkQuYy5jLkQuUi5GLjwuKCA8LjwuPC48LjwuPC4jLiIsCisiaVhpWGlYaVh0WHRYdFh0WHBYcFg3WC1YKlh2WEtYSlhMWEtYRlhHWEZYWlh4WHhYa1g5WHRYMVgjWFEuUC56Li0uYSByIDogTyBPID0gNCA5IDIgcyAnLicuJy5nLkJYNVh3WElYUFhfLnEuai5rLmoucS5KIHAgSiBwIHAgcCBwIHAgcCBwIHVYdlh1WDIgSS5SLlIuUi5JLkkuNy55WEdYcS4mWCZYMyA+IGYgZiAzLmYgVyAqIDsgKiAyIEYuZi5mLmYuZi50Ll4uKC4oLiguUi50LnQuPS57LnsuUi5SLlIuUi5SLlIuUi4gWCguMS4wLjcuNy43LjcuNy4zLiIsCisiUy5TLkQuWS5GLkkuSS4vLi8uIFhTWEZYNlh2WERYWlhEWEZYRFhCWGtYa1hCWHBYOVh0WDNYI1hbLlEuQS5zLksgYSBxIEAgICAlID0gNCB1IDggdCA4LiouIy57IHpYcVh3WElYUFhEWGRYZFhkWGRYZFh3WDhYOFg4WDVYNVg1WG9YfS58LmpYdlh1WD4gViBUIFQgVCBUIFQgQyBYWEZYcCBAWEsuaiAtIC0gLSAtICogMiA7IF0uMSAjIEcgVSBIIEggRiAlLjUuPi4+Lj4uOC5YLkMgNC5rLjYuNC4sLiYuJi4sLiwuNC42LmwuPi5GIFYgViBWIFYgViBWICIsCisiay5sLlYubi5VLlMuRi5GLkQuLy5WWFNYLFh2WFpYeFh4WEJYQlh4WEJYQlhwWDlYN1gzWCNYWy5RLkEuei4tLmEgciA6IE8gICAlIDQgZSB1IDUgNSA2LnsgJyBJIGdYNVg4WElYUFhKIDUgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDggQy5wIHdYdlh1WCYgbSBQIFYgViBWIFAgbSBeLkZYcCB8LksuLCAjID4gPiA+IDUgVyAmICQgKiAjIG0gTiBNIE0gTiA4LjouLi4gLi4uPi4+LkYgQi42Lj4uJS5PLi4uLi5PLk8uJS4mLjgubi5WIG0gTiBOIG0gViBWICIsCisibC5uLmMuUy5TLkQuRC5ZLlkuLy5NWEFYJlgwWEJYa1h4WGtYcFhrWHRYdFgzWDdYMVgkWFsuUS5QLnouLS5EIHIgcSA6ICAgWCA9IDkgdSB0ID4gMCA2Liouby4vIGhYNVg4WElYTFhXIG0gUiBSIEEgQSBBIEEgQSBBIEEgQSBBIF8gQVhfLjRYdlh1WD4gViBUIFQgVCBUIFQgViBYWEZYcCB8LksuLCBsIEEgVCBIIFUgZ1g4WCMgLSAjIEcgRiBGIEYgSCByLj4uJS4rLiQuNC40Llguay42LiwuJi4rLlgueyBYLisuLC42LjYuay57IFQgJyAnIFQgSCBWICIsCisiPlg+WDFYMVgxWDFYMVgxWDFYMVgkWDFYWi5bLmtYdFgzWDlYM1g3WDNYM1gtWCRYI1hRLlEuUC56LnMuSyBhIHEgOiBPICAgJSA0IDQgdSB0ICogYyAnLikuKS5nLkJYNVg2WElYTFhXIEYuKS57LiguKC4oLiguKC4oLiguKC5FLmkuR1hXLj1Ydlh3WDIgSS5SLlIuSS5JLkkuMy55WEZYcCB8LkcuLCBBIEkuRi5GLjMuKS5KWCYgLSA4IHYuZi5mLnYudC4oLiguSS5GLkkuKC5GLkkuKS5JLkkuRi5iLkYuYi5mLkYuIFgmWEBYKC5iLmYuKS4pLlouMy43LiIsCisiLlgrWCtYK1glWCVYK1grWCtYK1g+WGlYJlhLLjlYdFgtWDFYLVgtWCRYJFgjWFsuUS5QLkEuei5zLksgYSBxIDogTyAgICUgPSA5IGUgdCAwICMgQSAoLlouYi4zLm5YNVg9WElYTFhXIH0gYi5mLnQuZi50LnQuZi5mLnQudC50LjEuU1hXLj1Ydlh3WDUgNy43LjcuNy4zLjAuOy46WEZYcCB8LkcuLCBnIGkuMS4zLjsubi5KWCwgKiAmIDMuMS59IH0gfSB9IEkuRi5GLkYuYi48LmkuXi52LmkuNy4wLjMuZS4xLkQufi5JLiBYXi5pLkwuPlg+WEwuYi59ICIsCisiOC45Lncuai5rLmsubC5sLmwubi4sWEFYYlhNLj5YMVgkWCNYI1hbLlsuUS5RLlAuQS5ILnouLS5LIGEgciA6IE8gICBYICUgNCBlIHUgMCA+ICMgQyBbIF0gfiBRIGdYcVhPWFBYTFhKIHYgRiBGIEMgQyBDIEMgQyBDIEMgQyBWIEwgTVhXLj1Ydlh3WCYgYiBWIFYgViBWIFYgbSB+LkZYcCB8LkcuLCBkIFAgViBWIE4gISB6WEogKyA+IG0gTSBNIE0gTSBNIEYgYCBPLiAuViBtIH4gay40LiYuTy4uLmAgYCBgIDQuSi5qLkIuSi48LloueVh5WEwuMy5TICIsCisiNi42LjYueS53LnAudS5rLmsubC5ZLm1YQVhDLnguI1gjWFEuUS5RLlAuQS5ILkguei4tLikgSyBhIHEgOiBAICAgWCA9IDQgOSB1IHQgMCAjICMgJC57IF4gVCBQIGdYcVhvWFBYTFhKIHYgViBWIFYgViBWIFYgViBWIFYgViBWIEwgTVhXLj1Yalh3WCYgYiBCIEIgQiBCIEIgbSAvLkZYcCB9LkcuLCBkICEgQiBCIE4gViBtIG0gdiBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIFYgay5yLj4uTy5PLicgJyAnIE8uNi5rLmsucC4jLkkuJVglWEwufSBSICIsCisidi52LkQuRi5ELkYuRi5JLkkuRi5JLmVYYlgmWG4gWy5QLkEuQS5BLnouei56Li0uLS5LIGkgciA6IDogTyAgIFggJSA9IDQgZSB0IDAgJiArIGcgMC59IDsuOy48LnpYcVhvWFBYTFhKIFIgPC4yLjIuMi4yLjIuMi4yLiouKi4qLiMuU1hXLj1Yalh3WD4gWyAqLiMuIy4jLiMuWyB7LkZYcCB9LkcuLCBrIDwuKCAoIG8uby5bIFsgWyBbIFsgWyBbIFsgWyBbIFsgWyBdIF0gXSBdIF0gOS5ELnUucC45LjkuPC48LjkuOS53LmMuMi4jLjEuTC5MLmYuMS5vLiIsCisiPlg+WD5YPlg+WD5YPlg+WD5YPlg+WFsuUS5bLmogLS5ILkguLS4tLi0uRCBLIEsgYSBpIHIgOiA6IEAgICBYICUgNCA5IGUgdCAwID4gIyAmICguLlgnLicuJy5oLkJYNVh9LlBYTFhKIFIuKS4pLikuKS4pLikuKS4pLikuKS4pLmcuSlhXLj1Yalh3WDIgUi5FLkUuRS5SLlIuPS5lWEZYcCBLLm0uLCBzIFIuUi5SLkkuSS5JLkkuRi5GLmIuYi5iLmIuYi5iLmIuRi5mLmYudi5mLmYuPS57LicuKC4oLiguXi5eLl4uKC57Ll4uMy43LmYuZy5iLnQuZi52LiIsCisiZS5lLm4uYy5jLmMuYy5jLnYudi52LmMuOlh6WCxYaiAtLnMuKSBhIGEgYSByIHIgcSA6IDogQCBPIE8gJSA9ID0gNCBlIHQgMCA1ICMgKyBmIGkuOy47LjwuPC4jLnpYcVh9LlBYTFhwIFIgKi4jLiMuIy4qLiMuIy4jLiMuIy5vLlguQVhXLk9Yalg0WD4gUiBvLm8uby5vLlsgXSAgWEZYNiBHLm0uLCBrICMuby5YLl0gXSBdIF0gXSBdIC8gLyAvIC8gLyAvIC8gLyBSIFIgUiBSIFIgUiBSIHcuUy5sLnUudS53LmwuUy47LlIgVCBUIFQgXiBeIFQgQSBbICIsCisieyAlLjQuNC40LjIuNi42Ljkudy53LncubC5nWE1YTS5uIEsgSyByIHEgOiA6IDogQCBAICAgICBYICUgPSA5IDkgZSB0IDAgOCAjICMgJiAmLisuLyBUIFQgSCBWIGdYcVhfLlBYTFhKIHYgViBWIFYgViBWIFYgViBWIFYgViBWIEwgTVhXLk9Yalg0WCYgYiBCIEIgQiBCIEIgbSAvLkZYNiBHLm0uLCBkIGAgQiBNIE0gTSBNIE0gTSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIE0gWSA2Lmouay5qLjQuWSBNIG0gTSBNIE0gbSBtIG0gbSBtICIsCisiKy4rLiwuNC4yLjIuNi44LjguOS51Lncudy5TLnpYelhkLiUgYSA6IEAgTyBPIEAgTyAgIFggJSAlID0gNCA0IGUgdSAwIDUgJiArICsgVCBbIHsgLyB+IH4gVCBQIGdYcVhfLlBYTFhKIHYgRiBGIEYgRiBHIEcgRyBQIFAgUCBGIEwgVlhXLk9Yalg0WD4gbSBGIEYgQyBDIFYgTiB+LkZYNiBtLm0uLCBkIEMgRiBDIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgTSBOIFYgRiBWIE4gTSBWIFYgViBWIFYgViBWIFYgViBWICIsCisiLlgnLi5YLlguWC5YLlguWC5YLlgrWCcuJy5oLlAuPlg8WDkgJSAuICAgTyAgIFggJSAlID0gPSA0IDkgZSB1IHQgMCA1ICMgKyAmIHQuRS5SLlIuUi5SLlouRS4wLlNYVy58LklYUFhKIEUgUi5JLkYuYi5iLmIuYi5iLmIuYi5iLjEuS1hkLj1YdVh3WDIgaS5iLmYuZi50LnYufSB5WEFYNiBtLm0uMyBnIEQudC50LjAuMC43LjAuMC4zLjMuMy4xLjEuMS4xLjEuMS4xLjEuMS4xLjEuMS4xLjEuMS4xLjEuMS4xLjEufSB9IH0gOy47LjsuOy47LjsuOy59ICIsCisiJVglWCVYJVglWCVYJVglWCVYJVglWCVYJVglWCtYK1glWCVYaiBlICUgJSAlID0gPSA9IDQgNCBlIHUgdCB0IDAgPiAjICsgNSBJLikuey57LnsuKS5aLlouWi50LnpYVyBEWElYSVh9LnUgPS5nLkUuKC4oLlIuUi5aLmcuZy5mLmYubFhwIHVYdVh1WHAgZyB0LmYuZy49LnQufSBlWGEueiBOLk4ueSAmIDEuMy5mLmIuYi5iLnYuZi50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC43LjcuaS5pLmkuaS5pLjcuNy4wLjAuMC4wLjMuMy4zLjMuMS4xLiIsCisiJi4sLiwuLC4sLjQuNC4yLjIuOC45Lncudy53Lncudy5wLkBYZlgmWGUgPCA5ID0gOSA5IGUgdSB0IHQgMCA4ICYgKyAjIGQgPi4qLiMuby57IHsgLyBWLn4uMCBXIGQudlhMWFBYTFhKWDVYVyBKIDUgRyBUIFUgSCBVIFhYOS44IHAgVyA0WHVYdVh3WDRYeiAzIDggdSAqWD4gNSAzIHogRy5tLk4uTi48ICYgIyAjIHYgSCBHIEcgRiBGIEMgQyBDIEMgQyBDIEMgQyBDIEMgQyBDIEMgQyBDIEMgQyBDIEMgQyBDIFYgViBWIFYgViBWIFYgViBWIFYgViBWICIsCisiIC5PLk8uTy4rLisuPi40LjIuLC47LjYuMi44Ljgudy44LjYucC4mWCxYYC5lIDggOCAzIDggOCA1ICogJiAjICMgdCBBIHcuMi5ALlsgeyAnIC8gTiByWDhYeSB9Ll8uZC5kLmQuZC5kLk4uXy5fLj4gdiBUIEcgSSBtIGJYO1h5IE4uYS5wIHAgcCBwIHAgeSBhLnkgcCBBWCYgeSA2ICwgMiAyICogMiAqICogKiAjIHggYCBQIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiJS4rLiUuJS5YLkAuQC4mLiwuPi44LjkuPC44LjkucC53LnkuOS42LnkuVi4hLioudiB0IDcgMCA3IHQgZiBtID4udS48LiMuIy5vLlguWC5bIF0gVCArLjQuZCBsIGwgeCBoIGggaCBoIHggayBkIGggVCBZIEkgVSBGICUueyBkIGwgeCBoIGggaCBoIGggeCBsIGQgbSA7LmggbCBrIHggaCBoIGggaCB4IGsgbCBrIFYgWSBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiKy4lLisuJS4rLlguQC4mLiwuLC40LjguLC4yLjwuPC44LnkuOS53LnAudy40LnUudS5sLmsudS51LmUuZS51LjIuKCAjLiMuby57IFguWyAvIF0gQSBGIEYgXSBvLlsgWyBYLlguWC5bIFsgWyBbIHsgVCBJIEkgSSBQIFYgViBdIFsgWyBbIHsgeyB7IHsgWyBbIFsgSCBtIEEgWyBbIHsgeyB7IHsgeyBbIHsgLyBdIFkgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiKy4lLisuKy4rLisuWC5ALkAuQC4jLjIuLC4sLjYuOC48LjwuOS44LnkucC55LjwuPC48LjwuPC4yLiwuKi5vLiMuIy5vLnsgeyArLicgfiBdIH4gVSBZIFkgWSBZIFkgSSBVIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIFkgSCBIIEcgRyBIIEggSCBIIEggRyBHIEggSCBIIEggRyBHIEggSCBIIEggSCBQIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiTy4rLk8uKy4rLisuJS5YLlguIy4mLjwuKCAsLiwuLC40LjQuOC4yLjQuOC53LjwuOC40LiouKi4sLiMuIy4jLm8uWyB7IFguWC5SIC8gXiB+IFUgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBVIFUgSSBJIEkgSSBJIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiXSBdIC8gLyAvIF0gLyAvICcgXSBALjQuKy5ALiouIy4oICwuJS40LjQuNC45LiwuJC4sLiMuIy4jLiMuby5bIHsgWC5YLl0gLyBdIF4gXiBVIFkgWSBZIFkgWSBVIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiXSAnICcgJyAnICcgJyAnICcgJyB+ICwuKy4rLkAuJi4sLiouIy4mLkAuPi40LjQuWC4sLiMuIy5vLm8ueyBYLlguJyAnIFIgQSBSIEggVSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiJyAnICcgJyAnICcgJyAnICcgJyAvIHsgXSB7IFguWC5dIEAuQC5YLiQuQC4mLjQuJi4rLlsgWyB7IFguXSAnICcgJyBSIF4gXiBVIFkgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiLyAvIC8gLyAvIC8gLyAvIC8gLyBeIE8uXSBBICcgJyAvICcgTy4rLiUuJS4mLiYuIy5YLnsgXSAnICcgeyBgIH4gUiB+IEkgVSBZIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBVIFUgSSBJIEkgSSBJIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiLyAvIC8gLyAvIC8gLyAvIC8gLyBSIE8uXSBgIC8gLyAnICcgJyBdIFIgTy5PLl0gJi5dIF0gYCBgIH4gSSBVIEggVSBVIFkgWSBZIFkgWSBZIFkgWSBVIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiLyAvIC8gLyAvIC8gLyAvIC8gLyBSICQueyAvIC8gLyAvIC8gLyAvIF0gYCAgLnwgLi5gICAuSSBVICEgISBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisifiB+IH4gYCBgIGAgYCBgIGAgYCBgIF0gXSBUIH4gfiB+IGAgYCBdIF0gIC4gLiAuIC5gICAuWSAhICEgWSBZIFkgWSBZIFkgWSBZIFkgWSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiXiBeIF4gXiBeIF4gXiBeIF4gXiB+IGAgeyB+IF4gISBVIFUgVSBRICAuYCBgICAuIC5gICAuWSAhICEgWSBZIFkgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgSSBJIEkgSSBJIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiVSBVIFUgVSBVIFUgVSBVIFUgVSBVIEcgXSBHIFUgISAhICEgISAhIFkgIC5gIGAgIC5gIC4uWSAhICEgWSBZIFkgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSSBZIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiISAhICEgISAhICEgISAhICEgISAhIFEgXSBRICEgISAhICEgISAhICEgWSAgLmAgISAgLmAgISAhICEgWSBZIFkgWSBZIFkgWSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEkgVSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiISAhICEgISAhICEgISAhICEgISAhIFUgeyBVICEgISAhICEgISAhICEgISAhIC4uYCBgIGAgISBRICEgWSBZIFkgWSBZIFkgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgSSBJIEkgSSBJIFkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiWSBZIFkgWSBZIFkgISAhICEgWSBZIEggLi5IIFkgWSBZIFkgWSAhICEgISAhICEgLi4gLiAuWSBfICEgWSBZIFkgWSBZIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiWSBZIFkgWSBZIFkgWSBZIFkgWSBZIEggLi5IIFkgWSBZIFkgWSBZIFkgISAhIFEgWSB8ICAuWSBfICEgWSBZIFkgWSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgSSBJIEkgSSBJIEkgWSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiWSBZIFkgWSBZIFkgWSBZIFkgWSBZIEggYCBgIFkgWSBZIFkgWSBZIFkgWSAhIF8gXyBZICAuWSBfIF8gWSBZIFkgWSBVIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSSBJIFkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFUgYCBgIFUgWSBZIFkgWSBZIFkgWSBZICEgXyBfICEgISBfIF8gWSBZIFkgWSBVIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgfiB+IFUgWSBZIFkgWSBZIFkgWSBZIFkgXyBfICEgISBfIF8gWSBZIFkgVSBVIFUgVSBVIFUgVSBVIFUgSSBJIEkgSSBJIEkgWSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgVSBPLlkgWSBZIFkgWSBZIFkgWSBZIFkgWiBfIF8gISBfIF8gWSBZIFkgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEkgSSBJIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBVIF8gISAhIF8gWiBZIFkgVSBVIFUgVSBVIFUgSSBJIEkgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiVSBVIFUgVSBVIFkgWSBZIFkgWSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgWSBZIFkgWSBZIFUgXyAhIF8gVSBZIFkgVSBVIFUgVSBJIEkgSSBJIEkgSSBJIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFkgWSBZIFkgXyBfIF8gVSBZIFkgVSBVIEkgSSBJIEkgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgWSBZIFkgWiBfIF8gXyBaIFUgSSBJIEkgSSBJIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBZIFkgWSBVIF8gXyBRIFEgSSBJIEkgSSBJIEkgSSBJIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFQgVSBUIF8gXyBRIFEgSSBJIEkgSSBJIEkgSSBJIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIEkgUSBRIFEgXyBRIFEgUSBJIEkgSSBJIEkgSSBZIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIEkgSSBJIEkgSSBRIFEgUSBRIFEgUSBJIEkgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBVIFUgVSBJIEkgSSBJIEkgSSBJIEkgSSBRIFEgUSBRIFEgUSBJIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiSSBJIEkgSSBJIEkgSSBVIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIFEgUSBRIFEgUSBJIEkgSSBJIEkgWSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgUSBRIFEgUSBJIEkgSSBJIEkgWSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBRIFEgUSBJIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBJIEkgSSBRIFEgUSBRIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiVSBVIFkgSCBIIEggSCBIIEggSCBIIEggWSBVIFUgWSBIIEggSCBIIEggSCBIIFkgSCBJIEkgSSBJIEkgSSBJIFEgUSBRIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBZIEkgSSBJIEkgSSBJIEkgUSBRIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggWSBJIEkgSSBJIEkgUSBRIEkgSSBJIEkgWSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEkgSSBJIEkgSSBRIEkgSSBJIEkgVSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSSBJIEkgSSBJIFEgSSBJIEkgWSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBJIEkgSSBJIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBJIEkgSSBJIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEkgSSBJIEkgSSBJIEkgSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSSBJIEkgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEggSCBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBJIEkgSSBJIEkgSSBIIEggSCBIIEggSCBIIEggSCBIIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEggSCBIIEkgSSBJIEkgSSBZIEggSCBIIEggSCBIIEggRyBHIEcgRyBHIEcgRyBHIEcgRyBHIEcgRyBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGIEYgRiBGICIsCisiLyAvIC8gLyAvIC8gLyAvIC8gLyAvIC8gLyAvIC8gLyAvIC8gLyAvIC8gLyAvIC8gLyAvIC8gLyAvIC8gLyAvIC8gLyAvIFIgJyAnICcgYCBdIGAgLyAvIC8gLyAvIGAgYCBgIGAgYCBgIGAgYCBgIGAgYCBgIFQgVCBUIH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+ICIsCisiaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoIGggaCBoICIKK307CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmNWQwYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE2IEBACitzb3VyY2UuLiA9IHNyYy8KK291dHB1dC4uID0gYmluLworYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIC4sXAorICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICBiaW4vLFwKKyAgICAgICAgICAgICAgIGJyYW5kaW5nLyxcCisgICAgICAgICAgICAgICBzcGxhc2guYm1wLFwKKyAgICAgICAgICAgICAgIHBsdWdpbl9jdXN0b21pemF0aW9uLmluaSxcCisgICAgICAgICAgICAgICBpY29ucy8sXAorICAgICAgICAgICAgICAgbm90aWNlLmh0bWwsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKKyAgICAgICAgICAgICAgIGltYWdlcy8sXAorICAgICAgICAgICAgICAgaW50cm8vCisgICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YjE5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvZXBsLXYxMC5odG1sCkBAIC0wLDAgKzEsMzI4IEBACis8aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCit4bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoreG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgorPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgorPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Cis8bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Cis8bGluayByZWw9RmlsZS1MaXN0CitocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KKzx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgorPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+CisgPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgorICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgorICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+CisgIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KKyAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KKyAgPG86UGFnZXM+NDwvbzpQYWdlcz4KKyAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KKyAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+CisgICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KKyAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgorICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KKyAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KKyA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgorPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+CisgPHc6V29yZERvY3VtZW50PgorICA8dzpUcmFja1JldmlzaW9ucy8+CisgPC93OldvcmREb2N1bWVudD4KKzwveG1sPjwhW2VuZGlmXS0tPgorPHN0eWxlPgorPCEtLQorIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KK0Bmb250LWZhY2UKKwl7Zm9udC1mYW1pbHk6VGFob21hOworCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OworCW1zby1mb250LWNoYXJzZXQ6MDsKKwltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKKwltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKKwltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KKyAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLworcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAorCXttc28tc3R5bGUtcGFyZW50OiIiOworCW1hcmdpbjowaW47CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AKKwl7bWFyZ2luLXJpZ2h0OjBpbjsKKwltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKKwltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKKwltYXJnaW4tbGVmdDowaW47CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAorCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjguMHB0OworCWZvbnQtZmFtaWx5OlRhaG9tYTsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitAcGFnZSBTZWN0aW9uMQorCXtzaXplOjguNWluIDExLjBpbjsKKwltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKKwltc28taGVhZGVyLW1hcmdpbjouNWluOworCW1zby1mb290ZXItbWFyZ2luOi41aW47CisJbXNvLXBhcGVyLXNvdXJjZTowO30KK2Rpdi5TZWN0aW9uMQorCXtwYWdlOlNlY3Rpb24xO30KKy0tPgorPC9zdHlsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgorCis8ZGl2IGNsYXNzPVNlY3Rpb24xPgorCis8cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Cis8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKK1RIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCitSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKK09GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgorZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgorYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCitjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKK2FkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQorc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAorYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCitpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgorc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCitQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KK3dpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKK3dvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgorZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAorY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKK29yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCitkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobworcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQorU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKK2Egbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgorc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKK2Rpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCitDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKK2Zvcm0uPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKK1JlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCitwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0CithbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKK2NvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCitvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAorYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KK3RvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KK2FueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKK2xpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKK1JlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKK0NvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCit0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5CityaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKK2ZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKK2xpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Cit0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAoraWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQordGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQorZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCitFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAorcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgordGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KKzwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2l0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQoraXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCitlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCitjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCithbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQorYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKK2VmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCitpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCithcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKK3N0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKK0NvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKK3N0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKK2luZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKK2NvZGUgZm9ybTo8L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK2l0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCitjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Citjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKK29yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCitzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5CithY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCithbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQorb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCitsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQorUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAorQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKK0NvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAorY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgorbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KK3RoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KK2Nvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0CitvZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKK3JlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgordG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgordG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKK2FueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCitpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQorUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQorQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKK2NsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKK3dhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCitzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKK290aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKK2NvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAorV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKK3Jlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCitQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCitBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCitjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgorZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKK0FHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKK05FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCitUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCitUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAorb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKK2VuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAorZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKK21pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCithZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCithbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCitvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKK1JlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKK3N1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKK3NoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCitjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKK3BlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCityaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCitSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKK1JlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCitjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKK2NvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAorU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCit0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwordGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAorQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KK3NlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgorb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KKyhpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKK2luIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KK3RoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCitleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90CitleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKK1N0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKK0FtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcworQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcworaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+CisKKzwvZGl2PgorCis8L2JvZHk+CisKKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL2ZlYXR1cmUucHJvZHVjdCBiL29yZy5lY2xpcHNlLnN0ZW0udWkvZmVhdHVyZS5wcm9kdWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZTY4YTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ZlYXR1cmUucHJvZHVjdApAQCAtMCwwICsxLDQ4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9wZGUgdmVyc2lvbj0iMy41Ij8+CisKKzxwcm9kdWN0IG5hbWU9IlNURU0iIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnByb2R1Y3QiIGFwcGxpY2F0aW9uPSJvcmcuZWNsaXBzZS5zdGVtLnVpLkNvcmVFZGl0b3JBZHZpc29yQXBwbGljYXRpb24iIHVzZUZlYXR1cmVzPSJ0cnVlIiBpbmNsdWRlTGF1bmNoZXJzPSJ0cnVlIj4KKworICAgPGFib3V0SW5mbz4KKyAgICAgIDxpbWFnZSBwYXRoPSIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGY2NF82NF8zMi5naWYiLz4KKyAgICAgIDx0ZXh0PgorICAgICAgICAgU3BhdGlvLVRlbXBvcmFsIEVwaWRlbW9sb2dpY2FsL0V2ZW50IE1vZGVsZXIgKFNURU0pCisgICAgICA8L3RleHQ+CisgICA8L2Fib3V0SW5mbz4KKworICAgPGNvbmZpZ0luaSB1c2U9ImRlZmF1bHQiIHBhdGg9InBsdWdpbl9jdXN0b21pemF0aW9uLmluaSI+CisgICA8L2NvbmZpZ0luaT4KKworICAgPGxhdW5jaGVyQXJncz4KKyAgICAgIDx2bUFyZ3M+LVhtczQwME0gLVhteDYwME08L3ZtQXJncz4KKyAgIDwvbGF1bmNoZXJBcmdzPgorCisgICA8d2luZG93SW1hZ2VzIGkxNj0iL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmMTZfMTZfMzIuZ2lmIiBpMzI9Ii9vcmcuZWNsaXBzZS5zdGVtLnVpL2JyYW5kaW5nL29oZjMyXzMyXzMyLmdpZiIgaTQ4PSIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGY0OF80OF8zMi5naWYiIGk2ND0iL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmNjRfNjRfMzIuZ2lmIiBpMTI4PSIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGYxMjhfMTI4XzMyLmdpZiIvPgorCisgICA8c3BsYXNoCisgICAgICBsb2NhdGlvbj0ib3JnLmVjbGlwc2Uuc3RlbS51aSIKKyAgICAgIHN0YXJ0dXBQcm9ncmVzc1JlY3Q9IjAsNDEzLDQzMSwxNSIKKyAgICAgIHN0YXJ0dXBNZXNzYWdlUmVjdD0iMTAsMzgwLDQzMSwyMCIKKyAgICAgIHN0YXJ0dXBGb3JlZ3JvdW5kQ29sb3I9IkZGRkZGRiIgLz4KKyAgIDxsYXVuY2hlciBuYW1lPSJTVEVNIj4KKyAgICAgIDxzb2xhcmlzLz4KKyAgICAgIDx3aW4gdXNlSWNvPSJmYWxzZSI+CisgICAgICAgICA8Ym1wCisgICAgICAgICAgICB3aW5TbWFsbExvdz0iL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmMTZfMTZfOC5ibXAiCisgICAgICAgICAgICB3aW5NZWRpdW1Mb3c9Ii9vcmcuZWNsaXBzZS5zdGVtLnVpL2JyYW5kaW5nL29oZjMyXzMyXzguYm1wIgorICAgICAgICAgICAgd2luTGFyZ2VMb3c9Ii9vcmcuZWNsaXBzZS5zdGVtLnVpL2JyYW5kaW5nL29oZjQ4XzQ4XzguYm1wIi8+CisgICAgICA8L3dpbj4KKyAgIDwvbGF1bmNoZXI+CisKKyAgIDx2bT4KKyAgIDwvdm0+CisKKyAgIDxwbHVnaW5zPgorICAgPC9wbHVnaW5zPgorCisgICA8ZmVhdHVyZXM+CisgICAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5mZWF0dXJlIiB2ZXJzaW9uPSIwLjIuMS5xdWFsaWZlciIvPgorICAgPC9mZWF0dXJlcz4KKworCis8L3Byb2R1Y3Q+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvYWN0aW9uczE2L2Rpc2FibGVkUGF1c2UuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2FjdGlvbnMxNi9kaXNhYmxlZFBhdXNlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODU1OTNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2FjdGlvbnMxNi9kaXNhYmxlZFBhdXNlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvYWN0aW9uczE2L2Rpc2FibGVkUmVzZXQuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2FjdGlvbnMxNi9kaXNhYmxlZFJlc2V0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTczYjczCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2FjdGlvbnMxNi9kaXNhYmxlZFJlc2V0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvYWN0aW9uczE2L2Rpc2FibGVkUnVuLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9hY3Rpb25zMTYvZGlzYWJsZWRSdW4uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MGU0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvYWN0aW9uczE2L2Rpc2FibGVkUnVuLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvYWN0aW9uczE2L2Rpc2FibGVkU3RlcC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvYWN0aW9uczE2L2Rpc2FibGVkU3RlcC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzN2M5ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9hY3Rpb25zMTYvZGlzYWJsZWRTdGVwLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvYWN0aW9uczE2L2Rpc2FibGVkU3RvcC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvYWN0aW9uczE2L2Rpc2FibGVkU3RvcC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU4YjI1NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9hY3Rpb25zMTYvZGlzYWJsZWRTdG9wLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvYWN0aW9uczE2L3BhdXNlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9hY3Rpb25zMTYvcGF1c2UuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZWU5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvYWN0aW9uczE2L3BhdXNlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvYWN0aW9uczE2L3Jlc2V0LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9hY3Rpb25zMTYvcmVzZXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMTI4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvYWN0aW9uczE2L3Jlc2V0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvYWN0aW9uczE2L3Jlc3RhcnQuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2FjdGlvbnMxNi9yZXN0YXJ0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZmQxZGNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2FjdGlvbnMxNi9yZXN0YXJ0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvYWN0aW9uczE2L3J1bi5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvYWN0aW9uczE2L3J1bi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4Yjc4OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9hY3Rpb25zMTYvcnVuLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvYWN0aW9uczE2L3N0ZXAuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2FjdGlvbnMxNi9zdGVwLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjUzZWNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2FjdGlvbnMxNi9zdGVwLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvYWN0aW9uczE2L3N0b3AuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2FjdGlvbnMxNi9zdG9wLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjdjZTNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2FjdGlvbnMxNi9zdG9wLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvLmN2c2lnbm9yZSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NWU4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvLmN2c2lnbm9yZQpAQCAtMCwwICsxIEBACitUaHVtYnMuZGIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9BbmFseXNpcy5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvQW5hbHlzaXMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YWVlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvQW5hbHlzaXMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9BdXRvbWF0aWNFeHBlcmltZW50LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9BdXRvbWF0aWNFeHBlcmltZW50LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44N2ZjNjc4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0F1dG9tYXRpY0V4cGVyaW1lbnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9CYXRjaC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvQmF0Y2guZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYWRlNGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvQmF0Y2guZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Db3B5LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Db3B5LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzEwNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0NvcHkuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9EZWNvcmF0b3IuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0RlY29yYXRvci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzNzZhZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9EZWNvcmF0b3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9EZWNvcmF0b3JNb2RlbEZpbGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0RlY29yYXRvck1vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjRhYTM2MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9EZWNvcmF0b3JNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9EZWxldGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0RlbGV0ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhYTliMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9EZWxldGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9EeW5hbWljTGFiZWwuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0R5bmFtaWNMYWJlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5ZTM1MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9EeW5hbWljTGFiZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9FZGdlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9FZGdlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWRkYjllCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0VkZ2UuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9FeHBlcmltZW50LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9FeHBlcmltZW50LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmRlM2IxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0V4cGVyaW1lbnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9FeHBlcmltZW50TW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9FeHBlcmltZW50TW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ODEzYzIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0V4cGVyaW1lbnRNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9HcmFwaC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvR3JhcGguZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MGIzNTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvR3JhcGguZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9HcmFwaE1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvR3JhcGhNb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMGIwNjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvR3JhcGhNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9IZWxwSWNvbi5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvSGVscEljb24uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Y2ExZWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvSGVscEljb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9IZWxwSWNvbk1hY09TLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9IZWxwSWNvbk1hY09TLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZThhOTJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0hlbHBJY29uTWFjT1MuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9MYWJlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTGFiZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTQyYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTGFiZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9MaXN0LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9MaXN0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGExMTBhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0xpc3QuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9NYXRyaXguZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L01hdHJpeC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NjYmViMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9NYXRyaXguZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Nb2RlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMDEzM2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Nb2RlbE1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTW9kZWxNb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNjE3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTW9kZWxNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Nb2RpZmllci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTW9kaWZpZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMzhjZDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTW9kaWZpZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Nb2RpZmllck1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTW9kaWZpZXJNb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YWZkYmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTW9kaWZpZXJNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Ob2RlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Ob2RlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjE0OGY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L05vZGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9QcmVkaWNhdGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1ByZWRpY2F0ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZiNzU4ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9QcmVkaWNhdGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9QcmVkaWNhdGVNb2RlbEZpbGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1ByZWRpY2F0ZU1vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjRmNzZiZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9QcmVkaWNhdGVNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9SZWFsVGltZVNlcXVlbmNlci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvUmVhbFRpbWVTZXF1ZW5jZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYzRmY2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvUmVhbFRpbWVTZXF1ZW5jZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9SZWNvcmRlZFNpbXVsYXRpb25zLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9SZWNvcmRlZFNpbXVsYXRpb25zLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTBjYTRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1JlY29yZGVkU2ltdWxhdGlvbnMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9SZWNvcmRlZFNpbXVsYXRpb25zTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9SZWNvcmRlZFNpbXVsYXRpb25zTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YWRiZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1JlY29yZGVkU2ltdWxhdGlvbnNNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9SZWZhY3Rvci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvUmVmYWN0b3IuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNWEyM2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvUmVmYWN0b3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TVEVNLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TVEVNLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWQxNjdmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1NURU0uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TY2VuYXJpby5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU2NlbmFyaW8uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZmY2NDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU2NlbmFyaW8uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TY2VuYXJpb01vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU2NlbmFyaW9Nb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MThlYWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU2NlbmFyaW9Nb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TZXF1ZW5jZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1NlcXVlbmNlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3ZWQ5YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TZXF1ZW5jZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TZXF1ZW5jZXJNb2RlbEZpbGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1NlcXVlbmNlck1vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTEzODc0NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TZXF1ZW5jZXJNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TaW11bGF0aW9uQ29udHJvbFZpZXcuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1NpbXVsYXRpb25Db250cm9sVmlldy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYyOGQ5MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TaW11bGF0aW9uQ29udHJvbFZpZXcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TdGF0aWNMYWJlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU3RhdGljTGFiZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTQyYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU3RhdGljTGFiZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TdGVtRXhwbG9yZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1N0ZW1FeHBsb3Jlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlmMzM3ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TdGVtRXhwbG9yZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9UcmlnZ2VyLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9UcmlnZ2VyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzE2MDM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1RyaWdnZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9UcmlnZ2VyTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9UcmlnZ2VyTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNWQwZDg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1RyaWdnZXJNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9lcnJvcl9sb2cuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L2Vycm9yX2xvZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4NzNhMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9lcnJvcl9sb2cuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9tYXAuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L21hcC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4NGMzMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9tYXAuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9xdWVzdGlvbm1hcmsuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL2N1c3RvbW9iajE2L3F1ZXN0aW9ubWFyay5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmYTQxYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9xdWVzdGlvbm1hcmsuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9vYmoxNi8uY3ZzaWdub3JlIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2Ly5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg1ZThiYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9vYmoxNi8uY3ZzaWdub3JlCkBAIC0wLDAgKzEgQEAKK1RodW1icy5kYgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2L0NvbW1vbk1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ29tbW9uTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmVjNzViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2L0NvbW1vbk1vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2L0V4cGVyaW1lbnRNb2RlbEZpbGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2L0V4cGVyaW1lbnRNb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZGUzYjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvb2JqMTYvRXhwZXJpbWVudE1vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2L0dyYXBoTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaE1vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwYjA2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaE1vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2L0dyYXBoZ2VuZXJhdG9yTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaGdlbmVyYXRvck1vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5N2NmNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaGdlbmVyYXRvck1vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2L01vZGVsTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9vYmoxNi9Nb2RlbE1vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2MTdlMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9vYmoxNi9Nb2RlbE1vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2L01vZGlmaWVyTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9vYmoxNi9Nb2RpZmllck1vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzOGNkOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9vYmoxNi9Nb2RpZmllck1vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2L1ByZWRpY2F0ZU1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvb2JqMTYvUHJlZGljYXRlTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmI3NThkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2L1ByZWRpY2F0ZU1vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2L1NjZW5hcmlvTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9vYmoxNi9TY2VuYXJpb01vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxOGVhYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC9vYmoxNi9TY2VuYXJpb01vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2L1NlcXVlbmNlck1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvb2JqMTYvU2VxdWVuY2VyTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTdlZDliCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2L1NlcXVlbmNlck1vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2L1NvbHZlck1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvb2JqMTYvU29sdmVyTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTdlZWIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2L1NvbHZlck1vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2L1RyaWdnZXJNb2RlbEZpbGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL29iajE2L1RyaWdnZXJNb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMTYwMzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvb2JqMTYvVHJpZ2dlck1vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdDb21tb24uZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdDb21tb24uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OTcwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvd2l6YmFuL05ld0NvbW1vbi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdFeHBlcmltZW50LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC93aXpiYW4vTmV3RXhwZXJpbWVudC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkZTNiMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaWNvbnMvZnVsbC93aXpiYW4vTmV3RXhwZXJpbWVudC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdHcmFwaC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvd2l6YmFuL05ld0dyYXBoLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzBiMzU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdHcmFwaC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdHcmFwaGdlbmVyYXRvci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvd2l6YmFuL05ld0dyYXBoZ2VuZXJhdG9yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWU4MGYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdHcmFwaGdlbmVyYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdNb2RlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvd2l6YmFuL05ld01vZGVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTAxMzNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdNb2RlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdNb2RpZmllci5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvd2l6YmFuL05ld01vZGlmaWVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDM4Y2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdNb2RpZmllci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdTY2VuYXJpby5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvd2l6YmFuL05ld1NjZW5hcmlvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODVmMWRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdTY2VuYXJpby5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdTZXF1ZW5jZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdTZXF1ZW5jZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhN2VkOWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvd2l6YmFuL05ld1NlcXVlbmNlci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdTb2x2ZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdTb2x2ZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjUzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ljb25zL2Z1bGwvd2l6YmFuL05ld1NvbHZlci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pbWFnZXMvaW50cm90b3BpY2xhYmVscy9zYW1wbGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pbWFnZXMvaW50cm90b3BpY2xhYmVscy9zYW1wbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZjFmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ltYWdlcy9pbnRyb3RvcGljbGFiZWxzL3NhbXBsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pbWFnZXMvaW50cm90b3BpY2xhYmVscy9zYW1wbGVfaG92LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaW1hZ2VzL2ludHJvdG9waWNsYWJlbHMvc2FtcGxlX2hvdi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3NDE2NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaW1hZ2VzL2ludHJvdG9waWNsYWJlbHMvc2FtcGxlX2hvdi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pbnRyby9jc3Mvb3ZlcnZpZXcuY3NzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pbnRyby9jc3Mvb3ZlcnZpZXcuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOTcwMzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ludHJvL2Nzcy9vdmVydmlldy5jc3MKQEAgLTAsMCArMSwxNyBAQAorYSNzdGVtLW92ZXJ2aWV3IGltZyB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uLy4uL2ltYWdlcy9pbnRyb3RvcGljbGFiZWxzL3NhbXBsZS5naWYpOworfQorCithI3N0ZW0tb3ZlcnZpZXc6aG92ZXIgaW1nIHsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vLi4vaW1hZ2VzL2ludHJvdG9waWNsYWJlbHMvc2FtcGxlX2hvdi5naWYpOworfQorCithI3N0ZW0tb3ZlcnZpZXctZmFxIGltZyB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uLy4uL2ltYWdlcy9pbnRyb3RvcGljbGFiZWxzL3NhbXBsZS5naWYpOworfQorCithI3N0ZW0tb3ZlcnZpZXctZmFxOmhvdmVyIGltZyB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uLy4uL2ltYWdlcy9pbnRyb3RvcGljbGFiZWxzL3NhbXBsZV9ob3YuZ2lmKTsKK30KKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL2ludHJvL2Nzcy9vdmVydmlldy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pbnRyby9jc3Mvb3ZlcnZpZXcucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2MxZGUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pbnRyby9jc3Mvb3ZlcnZpZXcucHJvcGVydGllcwpAQCAtMCwwICsxLDQgQEAKK292ZXJ2aWV3LnN0ZW0tb3ZlcnZpZXcubGluay1pY29uID0gaW1hZ2VzL2ludHJvdG9waWNsYWJlbHMvc2FtcGxlLmdpZgorb3ZlcnZpZXcuc3RlbS1vdmVydmlldy5ob3Zlci1pY29uID0gaW1hZ2VzL2ludHJvdG9waWNsYWJlbHMvc2FtcGxlX2hvdi5naWYKK292ZXJ2aWV3LnN0ZW0tb3ZlcnZpZXctZmFxLmxpbmstaWNvbiA9IGltYWdlcy9pbnRyb3RvcGljbGFiZWxzL3NhbXBsZS5naWYKK292ZXJ2aWV3LnN0ZW0tb3ZlcnZpZXctZmFxLmhvdmVyLWljb24gPSBpbWFnZXMvaW50cm90b3BpY2xhYmVscy9zYW1wbGVfaG92LmdpZgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pbnRyby9jc3MvdHV0b3JpYWxzLmNzcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaW50cm8vY3NzL3R1dG9yaWFscy5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwNDlmNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaW50cm8vY3NzL3R1dG9yaWFscy5jc3MKQEAgLTAsMCArMSw4IEBACithI3N0ZW0tdHV0b3JpYWxzLW1haW4gaW1nIHsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vLi4vaW1hZ2VzL2ludHJvdG9waWNsYWJlbHMvc2FtcGxlLmdpZik7Cit9CisKK2Ejc3RlbS10dXRvcmlhbHMtbWFpbjpob3ZlciBpbWcgeworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi8uLi9pbWFnZXMvaW50cm90b3BpY2xhYmVscy9zYW1wbGVfaG92LmdpZik7Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaW50cm8vY3NzL3R1dG9yaWFscy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pbnRyby9jc3MvdHV0b3JpYWxzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwMzY1ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaW50cm8vY3NzL3R1dG9yaWFscy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNiBAQAordHV0b3JpYWxzLnN0ZW0tdHV0b3JpYWxzLW1haW4ubGluay1pY29uID0gaW1hZ2VzL2ludHJvdG9waWNsYWJlbHMvc2FtcGxlLmdpZgordHV0b3JpYWxzLnN0ZW0tdHV0b3JpYWxzLW1haW4uaG92ZXItaWNvbiA9IGltYWdlcy9pbnRyb3RvcGljbGFiZWxzL3NhbXBsZV9ob3YuZ2lmCisjdHV0b3JpYWxzLnN0ZW0tdHV0b3JpYWwteW91dHViZS1lbmdsaXNoLmxpbmstaWNvbiA9IGltYWdlcy9pbnRyb3RvcGljbGFiZWxzL3NhbXBsZS5naWYKKyN0dXRvcmlhbHMuc3RlbS10dXRvcmlhbC15b3V0dWJlLWVuZ2xpc2guaG92ZXItaWNvbiA9IGltYWdlcy9pbnRyb3RvcGljbGFiZWxzL3NhbXBsZV9ob3YuZ2lmCisjdHV0b3JpYWxzLnN0ZW0tdHV0b3JpYWwteW91dHViZS1zcGFuaXNoLmxpbmstaWNvbiA9IGltYWdlcy9pbnRyb3RvcGljbGFiZWxzL3NhbXBsZS5naWYKKyN0dXRvcmlhbHMuc3RlbS10dXRvcmlhbC15b3V0dWJlLXNwYW5pc2guaG92ZXItaWNvbiA9IGltYWdlcy9pbnRyb3RvcGljbGFiZWxzL3NhbXBsZV9ob3YuZ2lmCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL2ludHJvL2Nzcy93aGF0c25ldy5jc3MgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ludHJvL2Nzcy93aGF0c25ldy5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiODFhZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvaW50cm8vY3NzL3doYXRzbmV3LmNzcwpAQCAtMCwwICsxLDggQEAKK2Ejc3RlbS1ub3Rld29ydGh5IGltZyB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uLy4uL2ltYWdlcy9pbnRyb3RvcGljbGFiZWxzL3NhbXBsZS5naWYpOworfQorCithI3N0ZW0tbm90ZXdvcnRoeTpob3ZlciBpbWcgeworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi8uLi9pbWFnZXMvaW50cm90b3BpY2xhYmVscy9zYW1wbGVfaG92LmdpZik7Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvaW50cm8vY3NzL3doYXRzbmV3LnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ludHJvL2Nzcy93aGF0c25ldy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzM2I5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ludHJvL2Nzcy93aGF0c25ldy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMiBAQAordHV0b3JpYWxzLnN0ZW0tbm90ZXdvcnRoeS5saW5rLWljb24gPSBpbWFnZXMvaW50cm90b3BpY2xhYmVscy9zYW1wbGUuZ2lmCit0dXRvcmlhbHMuc3RlbS1ub3Rld29ydGh5LmhvdmVyLWljb24gPSBpbWFnZXMvaW50cm90b3BpY2xhYmVscy9zYW1wbGVfaG92LmdpZgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pbnRyby9vdmVydmlld0V4dGVuc2lvbkNvbnRlbnQueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pbnRyby9vdmVydmlld0V4dGVuc2lvbkNvbnRlbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNzdiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ludHJvL292ZXJ2aWV3RXh0ZW5zaW9uQ29udGVudC54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CisKKzxpbnRyb0NvbnRlbnQ+CisJPGV4dGVuc2lvbkNvbnRlbnQgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0ub3ZlcnZpZXciIG5hbWU9IlNURU0iCisJCXN0eWxlPSJjc3Mvb3ZlcnZpZXcuY3NzIiBhbHQtc3R5bGU9ImNzcy9vdmVydmlldy5wcm9wZXJ0aWVzIiBwYXRoPSJvdmVydmlldy9AIj4KKwkJPGdyb3VwIGlkPSJjb250ZW50LWdyb3VwIiBzdHlsZS1pZD0iY29udGVudC1ncm91cCI+CisJCQk8bGluayAgCisJCQkgICAgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N0ZW0iIAorCQkJICAgIGxhYmVsPSJNYWluIFNURU0gUHJvamVjdCB3ZWIgcGFnZSIKKwkJCSAgICBpZD0ic3RlbS1vdmVydmlldyIKKwkJCQlzdHlsZS1pZD0iY29udGVudC1saW5rIj4KKwkJCTwvbGluaz4KKwkJCTxsaW5rICAKKyAgICAgICAgICAgICAgICB1cmw9Imh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL1NURU1fRkFRIiAKKyAgICAgICAgICAgICAgICBsYWJlbD0iRkFRIgorICAgICAgICAgICAgICAgIGlkPSJzdGVtLW92ZXJ2aWV3LWZhcSIKKyAgICAgICAgICAgICAgICBzdHlsZS1pZD0iY29udGVudC1saW5rIj4KKyAgICAgICAgICAgIDwvbGluaz4KKwkJPC9ncm91cD4KKwk8L2V4dGVuc2lvbkNvbnRlbnQ+Cis8L2ludHJvQ29udGVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL2ludHJvL3R1dG9yaWFsc0V4dGVuc2lvbkNvbnRlbnQueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pbnRyby90dXRvcmlhbHNFeHRlbnNpb25Db250ZW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmI2OTY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pbnRyby90dXRvcmlhbHNFeHRlbnNpb25Db250ZW50LnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKworIDxpbnRyb0NvbnRlbnQ+CisgICAgPGV4dGVuc2lvbkNvbnRlbnQgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udHV0b3JpYWxzIiBuYW1lPSJTVEVNIFR1dG9yaWFscyIKKyAgICAgICAgc3R5bGU9ImNzcy90dXRvcmlhbHMuY3NzIiBhbHQtc3R5bGU9ImNzcy90dXRvcmlhbHMucHJvcGVydGllcyIgcGF0aD0idHV0b3JpYWxzL0AiPgorICAgICAgICA8Z3JvdXAgbGFiZWw9IlNURU0gVHV0b3JpYWxzIiBpZD0iY29udGVudC1ncm91cCIgc3R5bGUtaWQ9ImNvbnRlbnQtZ3JvdXAiPgorICAgICAgICAgICAgPGxpbmsKKyAgICAgICAgICAgICAgICB1cmw9Imh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL1R1dG9yaWFsc19mb3JfRGV2ZWxvcGVycyIKKyAgICAgICAgICAgICAgICBsYWJlbD0iU1RFTSBUdXRvcmlhbCB3ZWIgcGFnZSIgCisgICAgICAgICAgICAgICAgaWQ9InN0ZW0tdHV0b3JpYWxzLW1haW4iIHN0eWxlLWlkPSJjb250ZW50LWxpbmsiPgorICAgICAgICAgICAgICAgIDx0ZXh0PlRoZSBtYWluIFNURU0gVHV0b3JpYWwgV2ViIFBhZ2UuPC90ZXh0PgorICAgICAgICAgICAgPC9saW5rPgorICAgICAgICAgICAgPCEtLSAKKyAgICAgICAgICAgIDxsaW5rCisgICAgICAgICAgICAgICAgdXJsPSJodHRwOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9TGZpaWJRWDRJRkUiCisgICAgICAgICAgICAgICAgbGFiZWw9IlNURU0gVmlkZW8gRW5nbGlzaCIgCisgICAgICAgICAgICAgICAgaWQ9InN0ZW0tdHV0b3JpYWwteW91dHViZS1lbmdsaXNoIiBzdHlsZS1pZD0iY29udGVudC1saW5rIj4KKyAgICAgICAgICAgICAgICA8dGV4dD5TVEVNIFZpZGVvIFR1dG9yaWFsIChFbmdsaXNoKTwvdGV4dD4KKyAgICAgICAgICAgIDwvbGluaz4gCisgICAgICAgICAgICAtLT4KKyAgICAgICAgPC9ncm91cD4gICAgCisgICAgPC9leHRlbnNpb25Db250ZW50PgorPC9pbnRyb0NvbnRlbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9pbnRyby93aGF0c25ld0V4dGVuc2lvbkNvbnRlbnQueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9pbnRyby93aGF0c25ld0V4dGVuc2lvbkNvbnRlbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDA2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL2ludHJvL3doYXRzbmV3RXh0ZW5zaW9uQ29udGVudC54bWwKQEAgLTAsMCArMSwxNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CisgCisgPGludHJvQ29udGVudD4KKyAgICA8ZXh0ZW5zaW9uQ29udGVudCBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5ub3Rld29ydGh5IiBuYW1lPSJTVEVNIgorICAgICAgICBzdHlsZT0iY3NzL3doYXRzbmV3LmNzcyIgYWx0LXN0eWxlPSJjc3Mvd2hhdHNuZXcucHJvcGVydGllcyIgcGF0aD0id2hhdHNuZXcvQCI+CisgICAgICAgIDxncm91cCBpZD0iY29udGVudC1ncm91cCIgc3R5bGUtaWQ9ImNvbnRlbnQtZ3JvdXAiPgorICAgICAgICAgICAgPGxpbmsgbGFiZWw9IlNURU0iCisgICAgICAgICAgICAgICAgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N0ZW0iCisgICAgICAgICAgICAgICAgaWQ9InN0ZW0tbm90ZXdvcnRoeSIgc3R5bGUtaWQ9ImNvbnRlbnQtbGluayI+CisgICAgICAgICAgICAgICAgPHRleHQ+U1RFTSBQcm9qZWN0IHBhZ2U8L3RleHQ+ICAgIAorICAgICAgICAgICAgPC9saW5rPiAgICAgICAgCisgICAgICAgIDwvZ3JvdXA+ICAgICAgICAgICAKKyAgICA8L2V4dGVuc2lvbkNvbnRlbnQ+CisgPC9pbnRyb0NvbnRlbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9sb2dvLnBuZyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvbG9nby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxMWM1OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvbG9nby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9ub3RpY2UuaHRtbCBiL29yZy5lY2xpcHNlLnN0ZW0udWkvbm90aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhZjk2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvbm90aWNlLmh0bWwKQEAgLTAsMCArMSw3OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5NYXJjaCAxNywgMjAwNTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisgICAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKKyAgIAorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCisgICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKyAgIAorPHVsPgorCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucworICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPiAgIAorIAorPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisJCQorPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisJPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQorCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisgICAKKzxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1Nzc4ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvcGx1Z2luLnByb3BlcnRpZXMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZWFiOTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3BsdWdpbi54bWwKQEAgLTAsMCArMSwxNjQ0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgorPHBsdWdpbj4KKyAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29sb3Jwcm92aWRlcnMiIG5hbWU9IlVJIENvbG9yIFByb3ZpZGVycyIgc2NoZW1hPSJzY2hlbWEvdWkuY29sb3Byb3ZpZGVycy5leHNkIi8+CisKKyAgPGV4dGVuc2lvbgorICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIgorICAgIGlkPSJDb3JlRWRpdG9yQWR2aXNvckFwcGxpY2F0aW9uIj4KKyAgICA8YXBwbGljYXRpb24+CisgICAgICA8cnVuCisgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByZXNlbnRhdGlvbi5Db3JlRWRpdG9yQWR2aXNvciRBcHBsaWNhdGlvbiI+CisgICAgICA8L3J1bj4KKyAgICA8L2FwcGxpY2F0aW9uPgorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5wcm9kdWN0IgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByb2R1Y3RzIj4KKyAgICAgPHByb2R1Y3QKKyAgICAgICAgICAgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLnN0ZW0udWkuQ29yZUVkaXRvckFkdmlzb3JBcHBsaWNhdGlvbiIKKyAgICAgICAgICAgbmFtZT0iU1RFTSI+CisgICAgICAgIDxwcm9wZXJ0eQorICAgICAgICAgICAgICBuYW1lPSJwcmVmZXJlbmNlQ3VzdG9taXphdGlvbiIKKyAgICAgICAgICAgICAgdmFsdWU9InBsdWdpbl9jdXN0b21pemF0aW9uLmluaSIvPgorICAgICAgICA8cHJvcGVydHkKKyAgICAgICAgICAgICAgbmFtZT0iYWJvdXRUZXh0IgorICAgICAgICAgICAgICB2YWx1ZT0iU3BhdGlvLVRlbXBvcmFsIEVwaWRlbW9sb2dpY2FsL0V2ZW50IE1vZGVsZXIgKFNURU0pIi8+CisgICAgICAgIDxwcm9wZXJ0eQorICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwRm9yZWdyb3VuZENvbG9yIgorICAgICAgICAgICAgICB2YWx1ZT0iRkZGRkZGIi8+CisgICAgICAgIDxwcm9wZXJ0eQorICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwTWVzc2FnZVJlY3QiCisgICAgICAgICAgICAgIHZhbHVlPSIxMCwzODAsNDMxLDIwIi8+CisgICAgICAgIDxwcm9wZXJ0eQorICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwUHJvZ3Jlc3NSZWN0IgorICAgICAgICAgICAgICB2YWx1ZT0iMCw0MTMsNDMxLDE1Ii8+CisgICAgICAgIDxwcm9wZXJ0eQorICAgICAgICAgICAgICBuYW1lPSJ3aW5kb3dJbWFnZXMiCisgICAgICAgICAgICAgIHZhbHVlPSJicmFuZGluZy9vaGYxNl8xNl8zMi5naWYsYnJhbmRpbmcvb2hmMzJfMzJfMzIuZ2lmLGJyYW5kaW5nL29oZjQ4XzQ4XzMyLmdpZixicmFuZGluZy9vaGY2NF82NF8zMi5naWYsYnJhbmRpbmcvb2hmMTI4XzEyOF8zMi5naWYiLz4KKyAgICAgICAgPHByb3BlcnR5CisgICAgICAgICAgICAgIG5hbWU9ImFib3V0SW1hZ2UiCisgICAgICAgICAgICAgIHZhbHVlPSJicmFuZGluZy9vaGY2NF82NF8zMi5naWYiLz4KKyAgICAgICAgPHByb3BlcnR5CisgICAgICAgICAgICAgIG5hbWU9ImFwcE5hbWUiCisgICAgICAgICAgICAgIHZhbHVlPSJTVEVNIj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgCisgICAgICAgIDwhLS0gVGhlc2UgYXJlIGZvciB0aGUgV2VsY29tZS9pbnRyby4gIFNlZSBwbHVnaW4ucHJvcGVydGllcyAtLT4KKyAgICAgICAgICA8cHJvcGVydHkKKyAgICAgICAgICAgIG5hbWU9ImludHJvVGl0bGUiCisgICAgICAgICAgICB2YWx1ZT0iJWludHJvVGl0bGUiPgorICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgIAorICAgICAgICAgPHByb3BlcnR5CisgICAgICAgICAgICBuYW1lPSJpbnRyb0JyYW5kaW5nSW1hZ2UiCisgICAgICAgICAgICB2YWx1ZT0icHJvZHVjdDpicmFuZGluZy9vaGY2NF82NF8zMi5naWYiPgorICAgICAgICAgPC9wcm9wZXJ0eT4KKworICAgICAgICAgPHByb3BlcnR5CisgICAgICAgICAgICBuYW1lPSJpbnRyb0JyYW5kaW5nSW1hZ2VUZXh0IgorICAgICAgICAgICAgdmFsdWU9IiVpbnRyb0JyYW5kaW5nSW1hZ2VUZXh0Ij4KKyAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAKKyAgICAgICAgIDxwcm9wZXJ0eQorICAgICAgICAgICAgbmFtZT0iaW50cm9EZXNjcmlwdGlvbi1vdmVydmlldyIKKyAgICAgICAgICAgIHZhbHVlPSIlaW50cm9EZXNjcmlwdGlvbi1vdmVydmlldyI+CisgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgPHByb3BlcnR5CisgICAgICAgICAgICBuYW1lPSJpbnRyb0Rlc2NyaXB0aW9uLWZpcnN0c3RlcHMiCisgICAgICAgICAgICB2YWx1ZT0iJWludHJvRGVzY3JpcHRpb24tZmlyc3RzdGVwcyI+CisgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgPHByb3BlcnR5CisgICAgICAgICAgICBuYW1lPSJpbnRyb0Rlc2NyaXB0aW9uLXR1dG9yaWFscyIKKyAgICAgICAgICAgIHZhbHVlPSIlaW50cm9EZXNjcmlwdGlvbi10dXRvcmlhbHMiPgorICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgIDxwcm9wZXJ0eQorICAgICAgICAgICAgbmFtZT0iaW50cm9EZXNjcmlwdGlvbi1zYW1wbGVzIgorICAgICAgICAgICAgdmFsdWU9IiVpbnRyb0Rlc2NyaXB0aW9uLXNhbXBsZXMiPgorICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgIDxwcm9wZXJ0eQorICAgICAgICAgICAgbmFtZT0iaW50cm9EZXNjcmlwdGlvbi13aGF0c25ldyIKKyAgICAgICAgICAgIHZhbHVlPSIlaW50cm9EZXNjcmlwdGlvbi13aGF0c25ldyI+CisgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgPHByb3BlcnR5CisgICAgICAgICAgICBuYW1lPSJpbnRyb0Rlc2NyaXB0aW9uLW1pZ3JhdGUiCisgICAgICAgICAgICB2YWx1ZT0iJWludHJvRGVzY3JpcHRpb24tbWlncmF0ZSI+CisgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgPHByb3BlcnR5CisgICAgICAgICAgICBuYW1lPSJpbnRyb0Rlc2NyaXB0aW9uLXdlYnJlc291cmNlcyIKKyAgICAgICAgICAgIHZhbHVlPSIlaW50cm9EZXNjcmlwdGlvbi13ZWJyZXNvdXJjZXMiPgorICAgICAgICAgPC9wcm9wZXJ0eT4gICAgICAgICAKKyAgICAgICAgICAgIAorICAgICA8L3Byb2R1Y3Q+CisgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgorICAgICAgPGNhdGVnb3J5IAorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5zdGVtY2F0ZWdvcnkiCisgICAgICAgICAgICBuYW1lPSIlX1VJX1NURU0iCisgICAgICAgICAgICBwYXJlbnRDYXRlZ29yeT0iLyIvPgorICAgICAgPHdpemFyZAorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5zdGVtY2F0ZWdvcnkiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld1NURU1Qcm9qZWN0V2l6YXJkIgorICAgICAgICAgICAgaGFzUGFnZXM9InRydWUiCisgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbW9iajE2L1NURU0uZ2lmIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5uZXdzdGVtcHJvamVjdCIKKyAgICAgICAgICAgIG5hbWU9IiVfVUlfTmV3X1NURU1fUHJvamVjdF9XaXphcmQiCisgICAgICAgICAgICBwcm9qZWN0PSJ0cnVlIi8+CisgICAgICA8d2l6YXJkCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLnN0ZW1jYXRlZ29yeSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3TW9kZWxXaXphcmQiCisgICAgICAgICAgICBoYXNQYWdlcz0idHJ1ZSIKKyAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTW9kZWwuZ2lmIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5uZXdtb2RlbCIKKyAgICAgICAgICAgIG5hbWU9IiVfVUlfTW9kZWxNb2RlbFdpemFyZF9sYWJlbCIvPgorICAgICAgPHdpemFyZAorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5zdGVtY2F0ZWdvcnkiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0dyYXBoV2l6YXJkIgorICAgICAgICAgICAgaGFzUGFnZXM9InRydWUiCisgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbW9iajE2L0dyYXBoLmdpZiIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMubmV3Z3JhcGgiCisgICAgICAgICAgICBuYW1lPSIlX1VJX0dyYXBoTW9kZWxXaXphcmRfbGFiZWwiLz4KKyAgICAgIDx3aXphcmQKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuc3RlbWNhdGVnb3J5IgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdTZXF1ZW50aWFsU2VxdWVuY2VyV2l6YXJkJE5ld0ZpeGVkU2VxdWVudGlhbFNlcXVlbmNlcldpemFyZCIKKyAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU2VxdWVuY2VyLmdpZiIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMubmV3c2VxdWVuY2VyIgorICAgICAgICAgICAgbmFtZT0iJV9VSV9TZXF1ZW5jZXJNb2RlbFdpemFyZF9sYWJlbCIvPgorICAgICAgPHdpemFyZAorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5zdGVtY2F0ZWdvcnkiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld1NlcXVlbnRpYWxTZXF1ZW5jZXJXaXphcmQkTmV3UmVhbFRpbWVTZXF1ZW5jZXJXaXphcmQiCisgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbW9iajE2L1NlcXVlbmNlci5naWYiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLm5ld3J0c2VxdWVuY2VyIgorICAgICAgICAgICAgbmFtZT0iJV9VSV9SZWFsVGltZVNlcXVlbmNlck1vZGVsV2l6YXJkX2xhYmVsIi8+CisgICAgICA8d2l6YXJkCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLnN0ZW1jYXRlZ29yeSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3U2NlbmFyaW9XaXphcmQiCisgICAgICAgICAgICBoYXNQYWdlcz0idHJ1ZSIKKyAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU2NlbmFyaW8uZ2lmIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5uZXdzY2VuYXJpbyIKKyAgICAgICAgICAgIG5hbWU9IiVfVUlfU2NlbmFyaW9Nb2RlbFdpemFyZF9sYWJlbCIvPgorICAgICAgPHdpemFyZAorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5zdGVtY2F0ZWdvcnkiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0V4cGVyaW1lbnRXaXphcmQiCisgICAgICAgICAgICBoYXNQYWdlcz0idHJ1ZSIKKyAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvRXhwZXJpbWVudC5naWYiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLm5ld2V4cGVyaW1lbnQiCisgICAgICAgICAgICBuYW1lPSIlX1VJX0V4cGVyaW1lbnRNb2RlbFdpemFyZF9sYWJlbCI+CisgICAgICA8L3dpemFyZD4KKyAgICAgIDx3aXphcmQKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuc3RlbWNhdGVnb3J5IgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdUcmlnZ2VyV2l6YXJkIgorICAgICAgICAgICAgaGFzUGFnZXM9InRydWUiCisgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbW9iajE2L1RyaWdnZXIuZ2lmIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5uZXd0cmlnZ2VyIgorICAgICAgICAgICAgbmFtZT0iJV9VSV9UcmlnZ2VyTW9kZWxXaXphcmRfbGFiZWwiPgorICAgICAgPC93aXphcmQ+CisgICAgICA8d2l6YXJkCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLnN0ZW1jYXRlZ29yeSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3UHJlZGljYXRlV2l6YXJkIgorICAgICAgICAgICAgaGFzUGFnZXM9InRydWUiCisgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbW9iajE2L1ByZWRpY2F0ZS5naWYiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLm5ld3ByZWRpY2F0ZSIKKyAgICAgICAgICAgIG5hbWU9IiVfVUlfUHJlZGljYXRlTW9kZWxXaXphcmRfbGFiZWwiPgorICAgICAgPC93aXphcmQ+CisgICA8L2V4dGVuc2lvbj4KKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+CisgICAgICA8Y2F0ZWdvcnkKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzIgorICAgICAgICAgICAgbmFtZT0iJV9VSV9TVEVNIgorICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnk9Ii8iLz4KKyAgICAgIDx2aWV3CisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLkdyYXBoc1ZpZXciCisgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbW9iajE2L0dyYXBoLmdpZiIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdyYXBocyIKKyAgICAgICAgICAgIG5hbWU9IiVfVUlfR3JhcGhzIi8+CisgICAgICA8dmlldworICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5Nb2RlbHNWaWV3IgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Nb2RlbC5naWYiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5tb2RlbHMiCisgICAgICAgICAgICBuYW1lPSIlX1VJX01vZGVscyIvPgorICAgICAgPHZpZXcKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuU2NlbmFyaW9zVmlldyIKKyAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU2NlbmFyaW8uZ2lmIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3Muc2NlbmFyaW9zIgorICAgICAgICAgICAgbmFtZT0iJV9VSV9TY2VuYXJpb3MiLz4KKyAgICAgIDx2aWV3CisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLlNlcXVlbmNlcnNWaWV3IgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TZXF1ZW5jZXIuZ2lmIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3Muc2VxdWVuY2VycyIKKyAgICAgICAgICAgIG5hbWU9IiVfVUlfU2VxdWVuY2VycyIvPgorICAgICAgPHZpZXcKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuRGVjb3JhdG9yc1ZpZXciCisgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbW9iajE2L0RlY29yYXRvci5naWYiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5kZWNvcmF0b3JzIgorICAgICAgICAgICAgbmFtZT0iJV9VSV9EZWNvcmF0b3JzIi8+CisgICAgICA8dmlldworICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5BY3RpdmVTaW11bGF0aW9uc1ZpZXciCisgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbW9iajE2L1NURU0uZ2lmIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuYWN0aXZlc2ltdWxhdGlvbnMiCisgICAgICAgICAgICBuYW1lPSIlX1VJX0FjdGl2ZV9TaW11bGF0aW9uc19WaWV3Ii8+CisgICAgICA8dmlldworICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5TaW11bGF0aW9uQ29udHJvbFZpZXciCisgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbW9iajE2L1NpbXVsYXRpb25Db250cm9sVmlldy5naWYiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5zaW11bGF0aW9uY29udHJvbHZpZXciCisgICAgICAgICAgICBuYW1lPSIlX1VJX1NpbXVsYXRpb25fQ29udHJvbF9WaWV3Ii8+CisgICAgICA8dmlldworICAgICAgICAgICAgbmFtZT0iJV9VSV9FcnJvcl9Mb2dfVmlldyIKKyAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvZXJyb3JfbG9nLmdpZiIKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLmxvZy5Mb2dWaWV3IgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBkZS5ydW50aW1lLkxvZ1ZpZXciPgorICAgICAgPC92aWV3PgorICAgICAgPHZpZXcKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuTWFwVmlldyIKKyAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvbWFwLmdpZiIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwIgorICAgICAgICAgICAgbmFtZT0iJV9VSV9NYXBfVmlldyIvPgorICAgICAgPHZpZXcKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuQWN0aXZlQmF0Y2hlc1ZpZXciCisgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbW9iajE2L0JhdGNoLmdpZiIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmFjdGl2ZWJhdGNoZXMiCisgICAgICAgICAgICBuYW1lPSIlX1VJX0FjdGl2ZV9CYXRjaGVzX1ZpZXciPgorICAgICAgPC92aWV3PgorICAgICAgPHZpZXcKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuRXhwZXJpbWVudHNWaWV3IgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9FeHBlcmltZW50LmdpZiIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGVyaW1lbnRzIgorICAgICAgICAgICAgbmFtZT0iJV9VSV9FeHBlcmltZW50cyI+CisgICAgICA8L3ZpZXc+CisgICAgICA8dmlldworICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5UcmlnZ2Vyc1ZpZXciCisgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbW9iajE2L1RyaWdnZXIuZ2lmIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MudHJpZ2dlcnMiCisgICAgICAgICAgICBuYW1lPSIlX1VJX1RyaWdnZXJzIj4KKyAgICAgIDwvdmlldz4KKyAgICAgIDx2aWV3CisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLlByZWRpY2F0ZXNWaWV3IgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9QcmVkaWNhdGUuZ2lmIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MucHJlZGljYXRlcyIKKyAgICAgICAgICAgIG5hbWU9IiVfVUlfUHJlZGljYXRlcyI+CisgICAgICA8L3ZpZXc+CisgICA8L2V4dGVuc2lvbj4KKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMiPgorICAgICAgPHBlcnNwZWN0aXZlCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5wZXJzcGVjdGl2ZXMuRGVzaWduZXIiCisgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbW9iajE2L1NURU0uZ2lmIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuU1RFTURlc2lnbmVyUGVyc3BlY3RpdmUiCisgICAgICAgICAgICBuYW1lPSIlX1VJX0Rlc2lnbmVyX1BlcnNwZWN0aXZlIi8+CisgICAgICA8cGVyc3BlY3RpdmUKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnBlcnNwZWN0aXZlcy5TaW11bGF0aW9uIgorICAgICAgICAgICAgaWNvbj0iYnJhbmRpbmcvb2hmMTZfMTZfMzIuZ2lmIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuU1RFTVNpbXVsYXRpb25QZXJzcGVjdGl2ZSIKKyAgICAgICAgICAgIG5hbWU9IiVfVUlfU2ltdWxhdGlvbl9QZXJzcGVjdGl2ZSIvPgorICAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KKyAgICAgIDxwYWdlCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5TVEVNUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5TVEVNUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBuYW1lPSIlX1VJX1NURU0iLz4KKyAgICAgIDxwYWdlCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5TVEVNUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5WaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5WaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBuYW1lPSIlX1VJX1ZpelBQYWdlIi8+CisgICAgICA8cGFnZQorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuTWFwc0NvbG9yc1ByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuTWFwc0NvbG9yc1ByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgbmFtZT0iJV9VSV9Db2xvcnNQUGFnZSI+CisgICAgICA8L3BhZ2U+CisgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnByZWZlcmVuY2VzLlNURU1QcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnByZWZlcmVuY2VzLlNvbHZlclByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuU29sdmVyUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBuYW1lPSIlX1VJX1NvbHZlclBQYWdlIj4KKyAgICAgIDwvcGFnZT4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+CisgICAgICA8aW5pdGlhbGl6ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUluaXRpYWxpemVyIi8+CisgICAgICA8aW5pdGlhbGl6ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUluaXRpYWxpemVyIi8+CisgICAgICA8aW5pdGlhbGl6ZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnByZWZlcmVuY2VzLk1hcHNDb2xvcnNQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiPgorICAgICAgPC9pbml0aWFsaXplcj4KKyAgIDwvZXh0ZW5zaW9uPgorCis8IS0tCisgIDxleHRlbnNpb24KKyAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgorICAgIDxjb21tYW5kCisgICAgICBuYW1lPSIlX1VJX01lbnVfT3BlblVSSV9sYWJlbCIKKyAgICAgIGRlc2NyaXB0aW9uPSIlX1VJX01lbnVfT3BlblVSSV9kZXNjcmlwdGlvbiIKKyAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmZpbGUiCisgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcmVzZW50YXRpb24uQ29yZUVkaXRvckFkdmlzb3JPcGVuVVJJQ29tbWFuZCIgLz4KKyAgICA8Y29tbWFuZAorICAgICAgbmFtZT0iJV9VSV9NZW51X09wZW5fbGFiZWwiCisgICAgICBkZXNjcmlwdGlvbj0iJV9VSV9NZW51X09wZW5fZGVzY3JpcHRpb24iCisgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5maWxlIgorICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJlc2VudGF0aW9uLkNvcmVFZGl0b3JBZHZpc29yT3BlbkNvbW1hbmQiIC8+CisgIDwvZXh0ZW5zaW9uPgorLS0+Cis8IS0tCisgIDxleHRlbnNpb24KKyAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYmluZGluZ3MiPgorICAgIDxrZXkKKyAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcmVzZW50YXRpb24uQ29yZUVkaXRvckFkdmlzb3JPcGVuVVJJQ29tbWFuZCIKKyAgICAgIHNlcXVlbmNlPSJNMStVIgorICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iIC8+CisgICAgPGtleQorICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByZXNlbnRhdGlvbi5Db3JlRWRpdG9yQWR2aXNvck9wZW5Db21tYW5kIgorICAgICAgc2VxdWVuY2U9Ik0xK08iCisgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIgLz4KKyAgPC9leHRlbnNpb24+CistLT4KKworCisKKworCisKKworCisKKworICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgorICAgIDxlZGl0b3IKKyAgICAgICAgaWQgPSAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByZXNlbnRhdGlvbi5Nb2RlbEVkaXRvcklEIgorICAgICAgICBuYW1lID0gIiVfVUlfTW9kZWxFZGl0b3JfbGFiZWwiCisgICAgICAgIGljb24gPSAiaWNvbnMvZnVsbC9vYmoxNi9Nb2RlbE1vZGVsRmlsZS5naWYiCisgICAgICAgIGV4dGVuc2lvbnMgPSAibW9kZWwiCisgICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcmVzZW50YXRpb24uTW9kZWxFZGl0b3IiCisgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcmVzZW50YXRpb24uTW9kZWxBY3Rpb25CYXJDb250cmlidXRvciIgPgorICAgIDwvZWRpdG9yPgorICAgIDxlZGl0b3IKKyAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByZXNlbnRhdGlvbi5HcmFwaEVkaXRvciIKKyAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJlc2VudGF0aW9uLkdyYXBoQWN0aW9uQmFyQ29udHJpYnV0b3IiCisgICAgICAgICAgZXh0ZW5zaW9ucz0iZ3JhcGgiCisgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9HcmFwaE1vZGVsRmlsZS5naWYiCisgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcmVzZW50YXRpb24uR3JhcGhFZGl0b3JJRCIKKyAgICAgICAgICBuYW1lPSIlX1VJX0dyYXBoRWRpdG9yX2xhYmVsIi8+CisgICAgPGVkaXRvcgorICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLnByZXNlbnRhdGlvbi5TZXF1ZW5jZXJFZGl0b3IiCisgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5wcmVzZW50YXRpb24uU2VxdWVuY2VyQWN0aW9uQmFyQ29udHJpYnV0b3IiCisgICAgICAgICAgZXh0ZW5zaW9ucz0ic2VxdWVuY2VyIgorICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvU2VxdWVuY2VyTW9kZWxGaWxlLmdpZiIKKyAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXIucHJlc2VudGF0aW9uLlNlcXVlbmNlckVkaXRvcklEIgorICAgICAgICAgIG5hbWU9IiVfVUlfU2VxdWVuY2VyRWRpdG9yX2xhYmVsIj4KKyAgICA8L2VkaXRvcj4KKyAgICA8ZWRpdG9yCisgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5wcmVzZW50YXRpb24uU2NlbmFyaW9FZGl0b3IiCisgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLnByZXNlbnRhdGlvbi5TY2VuYXJpb0FjdGlvbkJhckNvbnRyaWJ1dG9yIgorICAgICAgICAgIGV4dGVuc2lvbnM9InNjZW5hcmlvIgorICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvU2NlbmFyaW9Nb2RlbEZpbGUuZ2lmIgorICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJlc2VudGF0aW9uLlNjZW5hcmlvRWRpdG9ySUQiCisgICAgICAgICAgbmFtZT0iJV9VSV9TY2VuYXJpb0VkaXRvcl9sYWJlbCI+CisgICAgPC9lZGl0b3I+CisgICAgPGVkaXRvcgorICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5wcmVzZW50YXRpb24uRXhwZXJpbWVudEVkaXRvciIKKyAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5wcmVzZW50YXRpb24uRXhwZXJpbWVudEFjdGlvbkJhckNvbnRyaWJ1dG9yIgorICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIgorICAgICAgICAgIGV4dGVuc2lvbnM9ImV4cGVyaW1lbnQiCisgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9FeHBlcmltZW50TW9kZWxGaWxlLmdpZiIKKyAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQucHJlc2VudGF0aW9uLkV4cGVyaW1lbnRFZGl0b3JJRCIKKyAgICAgICAgICBuYW1lPSIlX1VJX0V4cGVyaW1lbnRFZGl0b3JfbGFiZWwiPgorICAgIDwvZWRpdG9yPgorICAgIDxlZGl0b3IKKyAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIucHJlc2VudGF0aW9uLlRyaWdnZXJFZGl0b3IiCisgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIucHJlc2VudGF0aW9uLlRyaWdnZXJBY3Rpb25CYXJDb250cmlidXRvciIKKyAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIKKyAgICAgICAgICBleHRlbnNpb25zPSJ0cmlnZ2VyIgorICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvVHJpZ2dlck1vZGVsRmlsZS5naWYiCisgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLnByZXNlbnRhdGlvbi5UcmlnZ2VyRWRpdG9ySUQiCisgICAgICAgICAgbmFtZT0iJV9VSV9UcmlnZ2VyRWRpdG9yX2xhYmVsIj4KKyAgICA8L2VkaXRvcj4KKyAgICA8ZWRpdG9yCisgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUucHJlc2VudGF0aW9uLlByZWRpY2F0ZUVkaXRvciIKKyAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByZXNlbnRhdGlvbi5QcmVkaWNhdGVBY3Rpb25CYXJDb250cmlidXRvciIKKyAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIKKyAgICAgICAgICBleHRlbnNpb25zPSJwcmVkaWNhdGUiCisgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9QcmVkaWNhdGVNb2RlbEZpbGUuZ2lmIgorICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByZXNlbnRhdGlvbi5QcmVkaWNhdGVFZGl0b3JJRCIKKyAgICAgICAgICBuYW1lPSIlX1VJX1ByZWRpY2F0ZUVkaXRvcl9sYWJlbCI+CisgICAgPC9lZGl0b3I+CisgICAgPGVkaXRvcgorICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJlc2VudGF0aW9uLk1vZGlmaWVyRWRpdG9yIgorICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5wcmVzZW50YXRpb24uTW9kaWZpZXJBY3Rpb25CYXJDb250cmlidXRvciIKKyAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIKKyAgICAgICAgICBleHRlbnNpb25zPSJtb2RpZmllciIKKyAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01vZGlmaWVyTW9kZWxGaWxlLmdpZiIKKyAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByZXNlbnRhdGlvbi5Nb2RpZmllckVkaXRvcklEIgorICAgICAgICAgIG5hbWU9IiVfVUlfTW9kaWZpZXJFZGl0b3JfbGFiZWwiPgorICAgIDwvZWRpdG9yPgorICA8L2V4dGVuc2lvbj4KKworICAKKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorICAgICAgPG1lbnVDb250cmlidXRpb24KKyAgICAgICAgICAgIGxvY2F0aW9uVVJJPSJtZW51Om9yZy5lY2xpcHNlLnVpLm1haW4ubWVudT9hZnRlcj1lZGl0Ij4KKyAgICAgICAgIDxtZW51CisgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5tZW51Lm5ld3dpemFyZHMiCisgICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9TVEVNX05ld0FjdGlvblNldF9NZW51Ij4KKyAgICAgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29tbWFuZC53aXouZXhwZXJpbWVudCIKKyAgICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvRXhwZXJpbWVudC5naWYiCisgICAgICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9FeHBlcmltZW50TW9kZWxXaXphcmRfbGFiZWwiCisgICAgICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKKyAgICAgICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfRXhwZXJpbWVudE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29tbWFuZC53aXoudHJpZ2dlciIKKyAgICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvVHJpZ2dlci5naWYiCisgICAgICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9UcmlnZ2VyTW9kZWxXaXphcmRfbGFiZWwiCisgICAgICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKKyAgICAgICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfVHJpZ2dlck1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uICI+CisgICAgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQud2l6LnByZWRpY2F0ZSIKKyAgICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvUHJlZGljYXRlLmdpZiIKKyAgICAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1ByZWRpY2F0ZU1vZGVsV2l6YXJkX2xhYmVsIgorICAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX1ByZWRpY2F0ZU1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uICI+CisgICAgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQud2l6LnJ0c2VxdWVuY2VyIgorICAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9SZWFsVGltZVNlcXVlbmNlci5naWYiCisgICAgICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9SZWFsVGltZVNlcXVlbmNlck1vZGVsV2l6YXJkX2xhYmVsIgorICAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX1JlYWxUaW1lU2VxdWVuY2VyTW9kZWxXaXphcmRfZGVzY3JpcHRpb24iPgorICAgICAgICAgICAgPC9jb21tYW5kPiAgICAgCisgICAgICAgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQud2l6LnNlcXNlcXVlbmNlciIKKyAgICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU2VxdWVuY2VyLmdpZiIKKyAgICAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1NlcXVlbmNlck1vZGVsV2l6YXJkX2xhYmVsIgorICAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX1NlcXVlbmNlck1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29tbWFuZC53aXouc2NlbmFyaW8iCisgICAgICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbW9iajE2L1NjZW5hcmlvLmdpZiIKKyAgICAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1NjZW5hcmlvTW9kZWxXaXphcmRfbGFiZWwiCisgICAgICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKKyAgICAgICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfU2NlbmFyaW9Nb2RlbFdpemFyZF9kZXNjcmlwdGlvbiI+CisgICAgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQud2l6Lm1vZGVsIgorICAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9Nb2RlbC5naWYiCisgICAgICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Nb2RlbE1vZGVsV2l6YXJkX2xhYmVsIgorICAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX01vZGVsTW9kZWxXaXphcmRfZGVzY3JpcHRpb24gIj4KKyAgICAgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29tbWFuZC53aXoucHJvamVjdCIKKyAgICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU3RlbUV4cGxvcmVyLmdpZiIKKyAgICAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX05ld19TVEVNX1Byb2plY3RfV2l6YXJkIgorICAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX05ld19TVEVNX1Byb2plY3RfV2l6YXJkX1RUICI+CisgICAgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgICAgICA8c2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICBuYW1lPSJhZGRpdGlvbnMiPgorICAgICAgICAgICAgPC9zZXBhcmF0b3I+CisgICAgICAgICA8L21lbnU+CisgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgbG9jYXRpb25VUkk9InRvb2xiYXI6b3JnLmVjbGlwc2UudWkubWFpbi50b29sYmFyP2FmdGVyPWFkZGl0aW9ucyI+CisgICAgICAgICA8dG9vbGJhcgorICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudG9vbGJhci5uZXd3aXphcmRzIj4KKyAgICAgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29tbWFuZC53aXoucHJvamVjdCIKKyAgICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU3RlbUV4cGxvcmVyLmdpZiIKKyAgICAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX05ld19TVEVNX1Byb2plY3RfV2l6YXJkIgorICAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX05ld19TVEVNX1Byb2plY3RfV2l6YXJkX1RUICI+CisgICAgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQud2l6LnNjZW5hcmlvIgorICAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TY2VuYXJpby5naWYiCisgICAgICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9TY2VuYXJpb01vZGVsV2l6YXJkX2xhYmVsIgorICAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX1NjZW5hcmlvTW9kZWxXaXphcmRfZGVzY3JpcHRpb24iPgorICAgICAgICAgICAgPC9jb21tYW5kPgorICAgICAgICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5jb21tYW5kLndpei5tb2RlbCIKKyAgICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvTW9kZWwuZ2lmIgorICAgICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfTW9kZWxNb2RlbFdpemFyZF9sYWJlbCIKKyAgICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgorICAgICAgICAgICAgICAgICAgdG9vbHRpcD0iJV9VSV9Nb2RlbE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uICI+CisgICAgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQud2l6LnNlcXNlcXVlbmNlciIKKyAgICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU2VxdWVuY2VyLmdpZiIKKyAgICAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1NlcXVlbmNlck1vZGVsV2l6YXJkX2xhYmVsIgorICAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX1NlcXVlbmNlck1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29tbWFuZC53aXouZXhwZXJpbWVudCIKKyAgICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvRXhwZXJpbWVudC5naWYiCisgICAgICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9FeHBlcmltZW50TW9kZWxXaXphcmRfbGFiZWwiCisgICAgICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKKyAgICAgICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfRXhwZXJpbWVudE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29tbWFuZC53aXoudHJpZ2dlciIKKyAgICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvVHJpZ2dlci5naWYiCisgICAgICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9UcmlnZ2VyTW9kZWxXaXphcmRfbGFiZWwiCisgICAgICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKKyAgICAgICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfVHJpZ2dlck1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uICI+CisgICAgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQud2l6LnByZWRpY2F0ZSIKKyAgICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvUHJlZGljYXRlLmdpZiIKKyAgICAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1ByZWRpY2F0ZU1vZGVsV2l6YXJkX2xhYmVsIgorICAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX1ByZWRpY2F0ZU1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uICI+CisgICAgICAgICAgICA8L2NvbW1hbmQ+Cis8IS0tICAgICAgICAgIAorICAgICAgICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5jb21tYW5kLndpei5ydHNlcXVlbmNlciIKKyAgICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvUmVhbFRpbWVTZXF1ZW5jZXIuZ2lmIgorICAgICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUmVhbFRpbWVTZXF1ZW5jZXJNb2RlbFdpemFyZF9sYWJlbCIKKyAgICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgorICAgICAgICAgICAgICAgICAgdG9vbHRpcD0iJV9VSV9SZWFsVGltZVNlcXVlbmNlck1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgIDwvY29tbWFuZD4KKy0tPiAgICAgICAgICAgCisgICAgICAgICAgICA8c2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICBuYW1lPSJhZGRpdGlvbnMiPgorICAgICAgICAgICAgPC9zZXBhcmF0b3I+CisgICAgICAgICA8L3Rvb2xiYXI+CisgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICAgIDxtZW51Q29udHJpYnV0aW9uCisgICAgICAgICAgIGxvY2F0aW9uVVJJPSJ0b29sYmFyOm9yZy5lY2xpcHNlLnVpLm1haW4udG9vbGJhcj9hZnRlcj1hZGRpdGlvbnMiPgorICAgICAgICA8dG9vbGJhcgorICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS50b29sYmFyIj4KKyAgICAgICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQucnVuIgorICAgICAgICAgICAgICAgICBkaXNhYmxlZEljb249Imljb25zL2Z1bGwvYWN0aW9uczE2L2Rpc2FibGVkUnVuLmdpZiIKKyAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9hY3Rpb25zMTYvcnVuLmdpZiIKKyAgICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfU1RFTV9Db21tYW5kX1J1biIKKyAgICAgICAgICAgICAgICAgbW5lbW9uaWM9IiVfVUlfU1RFTV9Db21tYW5kX1J1bk1uZSIKKyAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfU1RFTV9Db21tYW5kX1J1blRUIj4KKyAgICAgICAgICAgPC9jb21tYW5kPgorICAgICAgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29tbWFuZC5wYXVzZSIKKyAgICAgICAgICAgICAgICAgZGlzYWJsZWRJY29uPSJpY29ucy9mdWxsL2FjdGlvbnMxNi9kaXNhYmxlZFBhdXNlLmdpZiIKKyAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9hY3Rpb25zMTYvcGF1c2UuZ2lmIgorICAgICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9TVEVNX0NvbW1hbmRfUGF1c2UiCisgICAgICAgICAgICAgICAgIG1uZW1vbmljPSIlX1VJX1NURU1fQ29tbWFuZF9QYXVzZU1uZSIKKyAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfU1RFTV9Db21tYW5kX1BhdXNlVFQiPgorICAgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5jb21tYW5kLnN0ZXAiCisgICAgICAgICAgICAgICAgIGRpc2FibGVkSWNvbj0iaWNvbnMvZnVsbC9hY3Rpb25zMTYvZGlzYWJsZWRTdGVwLmdpZiIKKyAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9hY3Rpb25zMTYvc3RlcC5naWYiCisgICAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1NURU1fQ29tbWFuZF9TdGVwIgorICAgICAgICAgICAgICAgICBtbmVtb25pYz0iJV9VSV9TVEVNX0NvbW1hbmRfU3RlcE1uZSIKKyAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfU1RFTV9Db21tYW5kX1N0ZXBUVCI+CisgICAgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQucmVzZXQiCisgICAgICAgICAgICAgICAgIGRpc2FibGVkSWNvbj0iaWNvbnMvZnVsbC9hY3Rpb25zMTYvZGlzYWJsZWRSZXNldC5naWYiCisgICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvYWN0aW9uczE2L3Jlc2V0LmdpZiIKKyAgICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfU1RFTV9Db21tYW5kX1Jlc2V0IgorICAgICAgICAgICAgICAgICBtbmVtb25pYz0iJV9VSV9TVEVNX0NvbW1hbmRfUmVzZXRNbmUiCisgICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgorICAgICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX1NURU1fQ29tbWFuZF9SZXNldFRUIj4KKyAgICAgICAgICAgPC9jb21tYW5kPgorICAgICAgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29tbWFuZC5zdG9wIgorICAgICAgICAgICAgICAgICBkaXNhYmxlZEljb249Imljb25zL2Z1bGwvYWN0aW9uczE2L2Rpc2FibGVkU3RvcC5naWYiCisgICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvYWN0aW9uczE2L3N0b3AuZ2lmIgorICAgICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9TVEVNX0NvbW1hbmRfU3RvcCIKKyAgICAgICAgICAgICAgICAgbW5lbW9uaWM9IiVfVUlfU1RFTV9Db21tYW5kX1N0b3BNbmUiCisgICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgorICAgICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX1NURU1fQ29tbWFuZF9TdG9wVFQiPgorICAgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICAgICAgIDxzZXBhcmF0b3IKKyAgICAgICAgICAgICAgICAgbmFtZT0iYWRkaXRpb25zIj4KKyAgICAgICAgICAgPC9zZXBhcmF0b3I+CisgICAgICAgIDwvdG9vbGJhcj4KKyAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICBsb2NhdGlvblVSST0icG9wdXA6b3JnLmVjbGlwc2UudWkucG9wdXAuYW55P2FmdGVyPWFkZGl0aW9ucyI+CisgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5jb21tYW5kLnJ1biIKKyAgICAgICAgICAgICAgZGlzYWJsZWRJY29uPSJpY29ucy9mdWxsL2FjdGlvbnMxNi9kaXNhYmxlZFJ1bi5naWYiCisgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvYWN0aW9uczE2L3J1bi5naWYiCisgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1NURU1fQ29tbWFuZF9SdW4iCisgICAgICAgICAgICAgIG1uZW1vbmljPSIlX1VJX1NURU1fQ29tbWFuZF9SdW5NbmUiCisgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgorICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX1NURU1fQ29tbWFuZF9SdW5UVCI+CisgICAgICAgICAgIDx2aXNpYmxlV2hlbgorICAgICAgICAgICAgICAgICBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuaXNleGVjdXRhYmxlIj4KKyAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQuc3RlcCIKKyAgICAgICAgICAgICAgZGlzYWJsZWRJY29uPSJpY29ucy9mdWxsL2FjdGlvbnMxNi9kaXNhYmxlZFN0ZXAuZ2lmIgorICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2FjdGlvbnMxNi9zdGVwLmdpZiIKKyAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfU1RFTV9Db21tYW5kX1N0ZXAiCisgICAgICAgICAgICAgIG1uZW1vbmljPSIlX1VJX1NURU1fQ29tbWFuZF9TdGVwTW5lIgorICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKKyAgICAgICAgICAgICAgdG9vbHRpcD0iJV9VSV9TVEVNX0NvbW1hbmRfU3RlcFRUIj4KKyAgICAgICAgICAgPHZpc2libGVXaGVuCisgICAgICAgICAgICAgICAgIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5pc2V4ZWN1dGFibGUiPgorICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICA8L21lbnVDb250cmlidXRpb24+CisgICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICBsb2NhdGlvblVSST0icG9wdXA6b3JnLmVjbGlwc2UudWkucG9wdXAuYW55P2FmdGVyPWFkZGl0aW9ucyI+CisgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5jb21tYW5kLm5ld21vZGlmaWVyd2l6YXJkIgorICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbW9iajE2L01vZGlmaWVyLmdpZiIKKyAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfU1RFTV9Db21tYW5kX05ld01vZFdpeiIKKyAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfU1RFTV9Db21tYW5kX05ld01vZFdpelRUIj4KKyAgICAgICAgICAgPHZpc2libGVXaGVuCisgICAgICAgICAgICAgICAgIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5pc01vZGlmaWFibGVJZGVudGlmaWFibGUiPgorICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICA8L21lbnVDb250cmlidXRpb24+CisgICAgIDxtZW51Q29udHJpYnV0aW9uCisgICAgICAgICAgIGxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS51aS5wb3B1cC5hbnk/YWZ0ZXI9YWRkaXRpb25zIj4KKyAgICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQuZGVsZXRlaWRlbnRpZmlhYmxlIgorICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbW9iajE2L0RlbGV0ZS5naWYiCisgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1NURU1fQ29tbWFuZF9EZWxldGUiCisgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgorICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX1NURU1fQ29tbWFuZF9EZWxldGVUVCI+CisgICAgICAgICAgICA8dmlzaWJsZVdoZW4KKyAgICAgICAgICAgICAgICAgY2hlY2tFbmFibGVkPSJmYWxzZSI+CisgICAgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmlzRGVsZXRhYmxlSWRlbnRpZmlhYmxlIj4KKyAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICAgICAgPG1lbnVDb250cmlidXRpb24KKyAgICAgICAgICAgbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLnVpLnBvcHVwLmFueT9hZnRlcj1hZGRpdGlvbnMiPgorICAgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29tbWFuZC5yZW5hbWVpZGVudGlmaWFibGUiCisgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvUmVmYWN0b3IuZ2lmIgorICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9TVEVNX0NvbW1hbmRfUmVmYWN0b3JfUmVuYW1lIgorICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKKyAgICAgICAgICAgICAgdG9vbHRpcD0iJV9VSV9TVEVNX0NvbW1hbmRfUmVmYWN0b3JfUmVuYW1lVFQiPgorICAgICAgICAgICAgPHZpc2libGVXaGVuCisgICAgICAgICAgICAgICAgIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5pc1JlZmFjdG9ySWRlbnRpZmlhYmxlIj4KKyAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICBsb2NhdGlvblVSST0icG9wdXA6b3JnLmVjbGlwc2UudWkucG9wdXAuYW55P2FmdGVyPWFkZGl0aW9ucyI+CisgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5jb21tYW5kLmNvcHlpZGVudGlmaWFibGUiCisgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3VzdG9tb2JqMTYvQ29weS5naWYiCisgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1NURU1fQ29tbWFuZF9SZWZhY3Rvcl9Db3B5ICIKKyAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfU1RFTV9Db21tYW5kX1JlZmFjdG9yX0NvcHlUVCI+CisgICAgICAgICAgICA8dmlzaWJsZVdoZW4KKyAgICAgICAgICAgICAgICAgY2hlY2tFbmFibGVkPSJmYWxzZSI+CisgICAgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmlzQ29weWFibGVJZGVudGlmaWFibGUiPgorICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KKyAgICAgICAgPC9jb21tYW5kPgorICAgICA8L21lbnVDb250cmlidXRpb24+CisgIDwvZXh0ZW5zaW9uPgorICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+CisgICAgIDxjYXRlZ29yeQorICAgICAgICAgICBkZXNjcmlwdGlvbj0iJV9VSV9TVEVNX1dpekNtZF9DYXRfRGVzYyIKKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcyIKKyAgICAgICAgICAgbmFtZT0iJV9VSV9TVEVNX1dpekNtZF9DYXRfTmFtZSI+CisgICAgIDwvY2F0ZWdvcnk+CisgICAgIDxjb21tYW5kCisgICAgICAgICAgIGRlZmF1bHRIYW5kbGVyPSJvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3U1RFTVByb2plY3RXaXphcmQkTmV3U1RFTVByb2plY3RXaXphcmRDb21tYW5kSGFuZGxlciIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IiVfVUlfTmV3X1NURU1fUHJvamVjdF9XaXphcmRfVFQgIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5jb21tYW5kLndpei5wcm9qZWN0IgorICAgICAgICAgICBuYW1lPSIlX1VJX05ld19TVEVNX1Byb2plY3RfV2l6YXJkIj4KKyAgICAgPC9jb21tYW5kPgorICAgICA8Y29tbWFuZAorICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMiCisgICAgICAgICAgIGRlZmF1bHRIYW5kbGVyPSJvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3U2NlbmFyaW9XaXphcmQkTmV3U2NlbmFyaW9XaXphcmRDb21tYW5kSGFuZGxlciIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IiVfVUlfU2NlbmFyaW9Nb2RlbFdpemFyZF9kZXNjcmlwdGlvbiIKKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29tbWFuZC53aXouc2NlbmFyaW8iCisgICAgICAgICAgIG5hbWU9IiVfVUlfU2NlbmFyaW9Nb2RlbFdpemFyZF9sYWJlbCI+CisgICAgIDwvY29tbWFuZD4KKyAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzIgorICAgICAgICAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld01vZGVsV2l6YXJkJE5ld01vZGVsV2l6YXJkQ29tbWFuZEhhbmRsZXIiCisgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlX1VJX01vZGVsTW9kZWxXaXphcmRfZGVzY3JpcHRpb24gIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5jb21tYW5kLndpei5tb2RlbCIKKyAgICAgICAgICAgbmFtZT0iJV9VSV9Nb2RlbE1vZGVsV2l6YXJkX2xhYmVsIj4KKyAgICAgPC9jb21tYW5kPgorICAgICA8Y29tbWFuZAorICAgICAgICAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld1NlcXVlbnRpYWxTZXF1ZW5jZXJXaXphcmQkTmV3Rml4ZWRTZXF1ZW50aWFsU2VxdWVuY2VyV2l6YXJkJE5ld1NlcXVlbnRpYWxTZXF1ZW5jZXJXaXphcmRDb21tYW5kSGFuZGxlciIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IiVfVUlfU2VxdWVuY2VyTW9kZWxXaXphcmRfZGVzY3JpcHRpb24iCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQud2l6LnNlcXNlcXVlbmNlciIKKyAgICAgICAgICAgbmFtZT0iJV9VSV9TZXF1ZW5jZXJNb2RlbFdpemFyZF9sYWJlbCI+CisgICAgIDwvY29tbWFuZD4KKyAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzIgorICAgICAgICAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld1ByZWRpY2F0ZVdpemFyZCROZXdQcmVkaWNhdGVXaXphcmRDb21tYW5kSGFuZGxlciIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IiVfVUlfUHJlZGljYXRlTW9kZWxXaXphcmRfZGVzY3JpcHRpb24gIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5jb21tYW5kLndpei5wcmVkaWNhdGUiCisgICAgICAgICAgIG5hbWU9IiVfVUlfUHJlZGljYXRlTW9kZWxXaXphcmRfbGFiZWwiPgorICAgICA8L2NvbW1hbmQ+CisgICAgIDxjb21tYW5kCisgICAgICAgICAgIGRlZmF1bHRIYW5kbGVyPSJvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3U2VxdWVudGlhbFNlcXVlbmNlcldpemFyZCROZXdSZWFsVGltZVNlcXVlbmNlcldpemFyZCROZXdSZWFsVGltZVNlcXVlbmNlcldpemFyZENvbW1hbmRIYW5kbGVyIgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iJV9VSV9SZWFsVGltZVNlcXVlbmNlck1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5jb21tYW5kLndpei5ydHNlcXVlbmNlciIKKyAgICAgICAgICAgbmFtZT0iJV9VSV9SZWFsVGltZVNlcXVlbmNlck1vZGVsV2l6YXJkX2xhYmVsIj4KKyAgICAgPC9jb21tYW5kPgorICAgICA8Y29tbWFuZAorICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMiCisgICAgICAgICAgIGRlZmF1bHRIYW5kbGVyPSJvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3VHJpZ2dlcldpemFyZCROZXdUcmlnZ2VyV2l6YXJkQ29tbWFuZEhhbmRsZXIiCisgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlX1VJX1RyaWdnZXJNb2RlbFdpemFyZF9kZXNjcmlwdGlvbiAiCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQud2l6LnRyaWdnZXIiCisgICAgICAgICAgIG5hbWU9IiVfVUlfVHJpZ2dlck1vZGVsV2l6YXJkX2xhYmVsIj4KKyAgICAgPC9jb21tYW5kPgorICAgICA8Y29tbWFuZAorICAgICAgICAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0V4cGVyaW1lbnRXaXphcmQkTmV3RXhwZXJpbWVudFdpemFyZENvbW1hbmRIYW5kbGVyIgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iJV9VSV9FeHBlcmltZW50TW9kZWxXaXphcmRfZGVzY3JpcHRpb24iCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQud2l6LmV4cGVyaW1lbnQiCisgICAgICAgICAgIG5hbWU9IiVfVUlfRXhwZXJpbWVudE1vZGVsV2l6YXJkX2xhYmVsIj4KKyAgICAgPC9jb21tYW5kPgorICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkuaGFuZGxlcnMuRGVsZXRlSGFuZGxlciIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IiVfVUlfRGVsZXRlX2Rlc2NyaXB0aW9uIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5jb21tYW5kLmRlbGV0ZWlkZW50aWZpYWJsZSIKKyAgICAgICAgICAgbmFtZT0iJV9VSV9EZWxldGVfbGFiZWwiPgorICAgICA8L2NvbW1hbmQ+CisgICAgIDxjb21tYW5kCisgICAgICAgICAgIGRlZmF1bHRIYW5kbGVyPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmhhbmRsZXJzLlJlZmFjdG9ySGFuZGxlciRSZW5hbWVIYW5kbGVyIgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iJV9VSV9SZWZhY3Rvcl9SZW5hbWVfZGVzY3JpcHRpb24iCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQucmVuYW1laWRlbnRpZmlhYmxlIgorICAgICAgICAgICBuYW1lPSIlX1VJX1JlZmFjdG9yX1JlbmFtZV9sYWJlbCI+CisgICAgIDwvY29tbWFuZD4KKyAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkuaGFuZGxlcnMuUmVmYWN0b3JIYW5kbGVyJENvcHlIYW5kbGVyIgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iJV9VSV9Db3B5X2Rlc2NyaXB0aW9uIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5jb21tYW5kLmNvcHlpZGVudGlmaWFibGUiCisgICAgICAgICAgIG5hbWU9IiVfVUlfQ29weV9sYWJlbCI+CisgICAgIDwvY29tbWFuZD4KKyAgPC9leHRlbnNpb24+CisgIAorICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+CisgICAgIDxjYXRlZ29yeQorICAgICAgICAgICBkZXNjcmlwdGlvbj0iJV9VSV9TVEVNX0V4ZWN1dGlvbl9Db21tYW5kX0NhdF9EZXNjIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5leGVjdXRpb24iCisgICAgICAgICAgIG5hbWU9IiVfVUlfU1RFTV9FeGVjdXRpb25fQ29tbWFuZF9DYXQiPgorICAgICA8L2NhdGVnb3J5PgorICAgICA8Y29tbWFuZAorICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmV4ZWN1dGlvbiIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IiVfVUlfU1RFTV9Db21tYW5kX1J1bl9EZXNjIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5jb21tYW5kLnJ1biIKKyAgICAgICAgICAgbmFtZT0iJV9VSV9TVEVNX0NvbW1hbmRfUnVuIj4KKyAgICAgPC9jb21tYW5kPgorICAgICA8Y29tbWFuZAorICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmV4ZWN1dGlvbiIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IiVfVUlfU1RFTV9Db21tYW5kX1N0ZXBfRGVzYyIKKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29tbWFuZC5zdGVwIgorICAgICAgICAgICBuYW1lPSIlX1VJX1NURU1fQ29tbWFuZF9TdGVwIj4KKyAgICAgPC9jb21tYW5kPgorICAgICA8Y29tbWFuZAorICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmV4ZWN1dGlvbiIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IiVfVUlfU1RFTV9Db21tYW5kX1Jlc2V0X0Rlc2MiCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQucmVzZXQiCisgICAgICAgICAgIG5hbWU9IiVfVUlfU1RFTV9Db21tYW5kX1Jlc2V0Ij4KKyAgICAgPC9jb21tYW5kPgorICAgICA8Y29tbWFuZAorICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmV4ZWN1dGlvbiIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IiVfVUlfU1RFTV9Db21tYW5kX1N0b3BfRGVzYyIKKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29tbWFuZC5zdG9wIgorICAgICAgICAgICBuYW1lPSIlX1VJX1NURU1fQ29tbWFuZF9TdG9wIj4KKyAgICAgPC9jb21tYW5kPgorICAgICA8Y29tbWFuZAorICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmV4ZWN1dGlvbiIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IiVfVUlfU1RFTV9Db21tYW5kX1BhdXNlX0Rlc2MiCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQucGF1c2UiCisgICAgICAgICAgIG5hbWU9IiVfVUlfU1RFTV9Db21tYW5kX1BhdXNlIj4KKyAgICAgPC9jb21tYW5kPgorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorICAgICA8aGFuZGxlcgorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5oYW5kbGVycy5TVEVNRXhlY3V0aW9uQ29tbWFuZEhhbmRsZXIkUnVuQ29tbWFuZEhhbmRsZXIiCisgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5jb21tYW5kLnJ1biI+CisgICAgICAgIDxhY3RpdmVXaGVuPgorICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5leGVjdXRhYmxlTm90UnVubmluZyI+CisgICAgICAgICAgIDwvcmVmZXJlbmNlPgorICAgICAgICA8L2FjdGl2ZVdoZW4+CisgICAgIDwvaGFuZGxlcj4KKyAgICAgPGhhbmRsZXIKKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkuaGFuZGxlcnMuU1RFTUV4ZWN1dGlvbkNvbW1hbmRIYW5kbGVyJFBhdXNlQ29tbWFuZEhhbmRsZXIiCisgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5jb21tYW5kLnBhdXNlIj4KKyAgICAgICAgPGFjdGl2ZVdoZW4+CisgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmV4ZWN1dGFibGVSdW5uaW5nIj4KKyAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgIDwvYWN0aXZlV2hlbj4KKyAgICAgPC9oYW5kbGVyPgorICAgICA8aGFuZGxlcgorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5oYW5kbGVycy5TVEVNRXhlY3V0aW9uQ29tbWFuZEhhbmRsZXIkU3RlcENvbW1hbmRIYW5kbGVyIgorICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29tbWFuZC5zdGVwIj4KKyAgICAgICAgPGFjdGl2ZVdoZW4+CisgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmV4ZWN1dGFibGVOb3RSdW5uaW5nIj4KKyAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgIDwvYWN0aXZlV2hlbj4KKyAgICAgPC9oYW5kbGVyPgorICAgICA8aGFuZGxlcgorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5oYW5kbGVycy5TVEVNRXhlY3V0aW9uQ29tbWFuZEhhbmRsZXIkUmVzZXRDb21tYW5kSGFuZGxlciIKKyAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQucmVzZXQiPgorICAgICAgICA8YWN0aXZlV2hlbj4KKyAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuZXhlY3V0YWJsZVN0b3BwYWJsZSI+CisgICAgICAgICAgIDwvcmVmZXJlbmNlPgorICAgICAgICA8L2FjdGl2ZVdoZW4+CisgICAgIDwvaGFuZGxlcj4KKyAgICAgPGhhbmRsZXIKKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkuaGFuZGxlcnMuU1RFTUV4ZWN1dGlvbkNvbW1hbmRIYW5kbGVyJFN0b3BDb21tYW5kSGFuZGxlciIKKyAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQuc3RvcCI+CisgICAgICAgIDxhY3RpdmVXaGVuPgorICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5leGVjdXRhYmxlU3RvcHBhYmxlIj4KKyAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgIDwvYWN0aXZlV2hlbj4KKyAgICAgPC9oYW5kbGVyPgorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgorICAgICA8Y2F0ZWdvcnkKKyAgICAgICAgICAgZGVzY3JpcHRpb249IiVfVUlfU1RFTV9FeHBlcmltZW50X0NvbW1hbmRfQ2F0X0Rlc2MiCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmV4cGVyaW1lbnQiCisgICAgICAgICAgIG5hbWU9IiVfVUlfU1RFTV9FeHBlcmltZW50X0NvbW1hbmRfQ2F0Ij4KKyAgICAgPC9jYXRlZ29yeT4KKyAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5leHBlcmltZW50IgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iJV9VSV9TVEVNX0NvbW1hbmRfTmV3TW9kV2l6X0Rlc2MiCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbW1hbmQubmV3bW9kaWZpZXJ3aXphcmQiCisgICAgICAgICAgIG5hbWU9IiVfVUlfU1RFTV9Db21tYW5kX05ld01vZFdpeiI+CisgICAgIDwvY29tbWFuZD4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KKyAgICAgPGhhbmRsZXIKKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdNb2RpZmllcldpemFyZCROZXdNb2RpZmllcldpemFyZENvbW1hbmRIYW5kbGVyIgorICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuY29tbWFuZC5uZXdtb2RpZmllcndpemFyZCI+CisgICAgICAgIDxhY3RpdmVXaGVuPgorICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5pc01vZGlmaWFibGVJZGVudGlmaWFibGUiPgorICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgPC9hY3RpdmVXaGVuPgorICAgICA8L2hhbmRsZXI+CisgIDwvZXh0ZW5zaW9uPgorICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+CisgICAgIDxwcm9wZXJ0eVRlc3RlcgorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5oYW5kbGVycy5JZGVudGlmaWFibGVEZWxlZ2F0ZVByb3BlcnR5VGVzdGVyIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5pZGVudGlmaWFibGVkZWxlZ2F0ZXByb3BlcnR5dGVzdGVyIgorICAgICAgICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnN0ZW0uaWRlbnRpZmFibGVkZWxlZ2F0ZSIKKyAgICAgICAgICAgcHJvcGVydGllcz0icnVubmFibGUiCisgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSWRlbnRpZmlhYmxlRGVsZWdhdGUiPgorICAgICA8L3Byb3BlcnR5VGVzdGVyPgorICAgICA8cHJvcGVydHlUZXN0ZXIKKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkuaGFuZGxlcnMuRXhlY3V0YWJsZVByb3BlcnR5VGVzdGVyIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5leGVjdXRhYmxlcHJvcGVydHl0ZXN0ZXIiCisgICAgICAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGFibGUiCisgICAgICAgICAgIHByb3BlcnRpZXM9InJ1bm5pbmcsIHN0b3BwYWJsZSIKKyAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZSI+CisgICAgIDwvcHJvcGVydHlUZXN0ZXI+CisgIDwvZXh0ZW5zaW9uPgorICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgorICAgICAgICAgPGZhY3RvcnkgCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5leGVjdXRhYmxlLklkZW50aWZpYWJsZURlbGVnYXRlRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5IiAKKyAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSWRlbnRpZmlhYmxlRGVsZWdhdGUiPgorICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZSIvPgorICAgICAgICAgPC9mYWN0b3J5PgorICAgICAgICAgPGZhY3RvcnkKKyAgICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSWRlbnRpZmlhYmxlRGVsZWdhdGUiCisgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5pZGVudGlmaWFibGUuSWRlbnRpZmlhYmxlRGVsZWdhdGVJZGVudGlmaWFibGVBZGFwdGVyRmFjdG9yeSI+CisgICAgICAgICAgICA8YWRhcHRlcgorICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUiPgorICAgICAgICAgICAgPC9hZGFwdGVyPgorICAgICAgICAgPC9mYWN0b3J5PgorICAgICAgICAgPGZhY3RvcnkKKyAgICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyIgorICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuaWRlbnRpZmlhYmxlLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVySWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkiPgorICAgICAgICAgICAgPGFkYXB0ZXIKKyAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlIj4KKyAgICAgICAgICAgIDwvYWRhcHRlcj4KKyAgICAgICAgIDwvZmFjdG9yeT4KKyAgICAgICAgIDxmYWN0b3J5CisgICAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLklkZW50aWZpYWJsZURlbGVnYXRlIgorICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubW9kaWZpYWJsZS5JZGVudGlmaWFibGVEZWxlZ2F0ZU1vZGlmaWFibGVBZGFwdGVyRmFjdG9yeSI+CisgICAgICAgICAgICA8YWRhcHRlcgorICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUiPgorICAgICAgICAgICAgPC9hZGFwdGVyPgorICAgICAgICAgPC9mYWN0b3J5PgorICAgICAgICAgPGZhY3RvcnkKKyAgICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyIgorICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubW9kaWZpYWJsZS5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlck1vZGlmaWFibGVBZGFwdGVyRmFjdG9yeSI+CisgICAgICAgICAgICA8YWRhcHRlcgorICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWFibGUiPgorICAgICAgICAgICAgPC9hZGFwdGVyPgorICAgICAgICAgPC9mYWN0b3J5PgorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+CisgICAgIDxkZWZpbml0aW9uCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmV4ZWN1dGFibGVSdW5uaW5nIj4KKyAgICAgICAgPHdpdGgKKyAgICAgICAgICAgICAgdmFyaWFibGU9InNlbGVjdGlvbiI+CisgICAgICAgICAgIDxpdGVyYXRlCisgICAgICAgICAgICAgICAgIGlmRW1wdHk9ImZhbHNlIgorICAgICAgICAgICAgICAgICBvcGVyYXRvcj0iYW5kIj4KKyAgICAgICAgICAgICAgPGFkYXB0CisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUiPgorICAgICAgICAgICAgICAgICA8dGVzdAorICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGFibGUucnVubmluZyI+CisgICAgICAgICAgICAgICAgIDwvdGVzdD4KKyAgICAgICAgICAgICAgPC9hZGFwdD4KKyAgICAgICAgICAgPC9pdGVyYXRlPgorICAgICAgICA8L3dpdGg+CisgICAgIDwvZGVmaW5pdGlvbj4KKyAgICAgPGRlZmluaXRpb24KKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuZXhlY3V0YWJsZU5vdFJ1bm5pbmciPgorICAgICAgICA8d2l0aAorICAgICAgICAgICAgICB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KKyAgICAgICAgICAgPGl0ZXJhdGUKKyAgICAgICAgICAgICAgICAgaWZFbXB0eT0iZmFsc2UiCisgICAgICAgICAgICAgICAgIG9wZXJhdG9yPSJhbmQiPgorICAgICAgICAgICAgICA8YWRhcHQKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZSI+CisgICAgICAgICAgICAgICAgIDxub3Q+CisgICAgICAgICAgICAgICAgICAgIDx0ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0YWJsZS5ydW5uaW5nIj4KKyAgICAgICAgICAgICAgICAgICAgPC90ZXN0PgorICAgICAgICAgICAgICAgICA8L25vdD4KKyAgICAgICAgICAgICAgPC9hZGFwdD4KKyAgICAgICAgICAgPC9pdGVyYXRlPgorICAgICAgICA8L3dpdGg+CisgICAgIDwvZGVmaW5pdGlvbj4KKyAgICAgPGRlZmluaXRpb24KKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuZXhlY3V0YWJsZVN0b3BwYWJsZSI+CisgICAgICAgIDx3aXRoCisgICAgICAgICAgICAgIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgorICAgICAgICAgICA8aXRlcmF0ZQorICAgICAgICAgICAgICAgICBpZkVtcHR5PSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgb3BlcmF0b3I9ImFuZCI+CisgICAgICAgICAgICAgIDxhZGFwdAorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlIj4KKyAgICAgICAgICAgICAgICAgPHRlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRhYmxlLnN0b3BwYWJsZSI+CisgICAgICAgICAgICAgICAgIDwvdGVzdD4KKyAgICAgICAgICAgICAgPC9hZGFwdD4KKyAgICAgICAgICAgPC9pdGVyYXRlPgorICAgICAgICA8L3dpdGg+CisgICAgIDwvZGVmaW5pdGlvbj4KKyAgICAgPGRlZmluaXRpb24KKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuaXNleGVjdXRhYmxlIj4KKyAgICAgICAgPHdpdGgKKyAgICAgICAgICAgICAgdmFyaWFibGU9InNlbGVjdGlvbiI+CisgICAgICAgICAgIDxpdGVyYXRlCisgICAgICAgICAgICAgICAgIGlmRW1wdHk9ImZhbHNlIgorICAgICAgICAgICAgICAgICBvcGVyYXRvcj0iYW5kIj4KKyAgICAgICAgICAgICAgPGFkYXB0CisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUiPgorICAgICAgICAgICAgICA8L2FkYXB0PgorICAgICAgICAgICA8L2l0ZXJhdGU+CisgICAgICAgIDwvd2l0aD4KKyAgICAgPC9kZWZpbml0aW9uPgorICAgICA8ZGVmaW5pdGlvbgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5pc0lkZW50aWZpYWJsZURlbGVnYXRlIj4KKyAgICAgICAgPHdpdGgKKyAgICAgICAgICAgICAgdmFyaWFibGU9InNlbGVjdGlvbiI+CisgICAgICAgICAgIDxpdGVyYXRlCisgICAgICAgICAgICAgICAgIG9wZXJhdG9yPSJhbmQiPgorICAgICAgICAgICAgICA8YWRhcHQKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5JZGVudGlmaWFibGVEZWxlZ2F0ZSI+CisgICAgICAgICAgICAgIDwvYWRhcHQ+CisgICAgICAgICAgIDwvaXRlcmF0ZT4KKyAgICAgICAgPC93aXRoPgorICAgICA8L2RlZmluaXRpb24+CisgICAgIDxkZWZpbml0aW9uCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmlzTW9kaWZpYWJsZUlkZW50aWZpYWJsZSI+CisgICAgICAgIDx3aXRoCisgICAgICAgICAgICAgIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgorICAgICAgICAgICA8aXRlcmF0ZQorICAgICAgICAgICAgICAgICBvcGVyYXRvcj0iYW5kIj4KKyAgICAgICAgICAgICAgPGFuZD4KKyAgICAgICAgICAgICAgPCEtLSBSZW1vdmVkIHNpbmNlIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBjcmVhdGUgbW9kaWZpZXJzIGZvciBsaXN0cyBvZiB0aGluZ3MgbGlrZSByZWNvdmVyeSByYXRlcyBmb3IgbXVsdGktcG9wdWxhdGlvbnMKKyAgICAgICAgICAgICAgICAgPGFkYXB0CisgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlIj4KKyAgICAgICAgICAgICAgICAgPC9hZGFwdD4KKyAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgIDxhZGFwdAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZSI+CisgICAgICAgICAgICAgICAgIDwvYWRhcHQ+CisgICAgICAgICAgICAgICAgIDxub3Q+CisgICAgICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmlzZXhlY3V0YWJsZSI+CisgICAgICAgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgorICAgICAgICAgICAgICAgICA8L25vdD4KKyAgICAgICAgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgICAgICAgICAgPGFkYXB0CisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllciI+CisgICAgICAgICAgICAgICAgICAgIDwvYWRhcHQ+CisgICAgICAgICAgICAgICAgIDwvbm90PgorICAgICAgICAgICAgICA8L2FuZD4KKyAgICAgICAgICAgPC9pdGVyYXRlPgorICAgICAgICA8L3dpdGg+CisgICAgIDwvZGVmaW5pdGlvbj4KKyAgICAgPGRlZmluaXRpb24KKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuaXNEZWxldGFibGVJZGVudGlmaWFibGUiPgorICAgICAgICA8d2l0aAorICAgICAgICAgICAgICB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KKyAgICAgICAgICAgPGl0ZXJhdGUKKyAgICAgICAgICAgICAgICAgb3BlcmF0b3I9ImFuZCI+CisgICAgICAgICAgICAgIDxhbmQ+CisgICAgICAgICAgICAgICAgIDxhZGFwdAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLmZpbGUuRmlsZSI+CisgICAgICAgICAgICAgICAgIDwvYWRhcHQ+CisgICAgICAgICAgICAgICA8L2FuZD4KKyAgICAgICAgICAgPC9pdGVyYXRlPgorICAgICAgICA8L3dpdGg+CisgICAgIDwvZGVmaW5pdGlvbj4KKyAgICAgICA8ZGVmaW5pdGlvbgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5pc1JlZmFjdG9ySWRlbnRpZmlhYmxlIj4KKyAgICAgICAgPHdpdGgKKyAgICAgICAgICAgICAgdmFyaWFibGU9InNlbGVjdGlvbiI+CisgICAgICAgICAgIDxpdGVyYXRlCisgICAgICAgICAgICAgICAgIG9wZXJhdG9yPSJhbmQiPgorICAgICAgICAgICAgICA8YW5kPgorICAgICAgICAgICAgICAgICA8YWRhcHQKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5maWxlLkZpbGUiPgorICAgICAgICAgICAgICAgICA8L2FkYXB0PgorICAgICAgICAgICAgICAgPC9hbmQ+CisgICAgICAgICAgIDwvaXRlcmF0ZT4KKyAgICAgICAgPC93aXRoPgorICAgICA8L2RlZmluaXRpb24+CisgICAgIDxkZWZpbml0aW9uCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmlzQ29weWFibGVJZGVudGlmaWFibGUiPgorICAgICAgICA8d2l0aAorICAgICAgICAgICAgICB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KKyAgICAgICAgICAgPGl0ZXJhdGUKKyAgICAgICAgICAgICAgICAgb3BlcmF0b3I9ImFuZCI+CisgICAgICAgICAgICAgIDxhbmQ+CisgICAgICAgICAgICAgICAgIDxhZGFwdAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLmZpbGUuRmlsZSI+CisgICAgICAgICAgICAgICAgIDwvYWRhcHQ+CisgICAgICAgICAgICAgICA8L2FuZD4KKyAgICAgICAgICAgPC9pdGVyYXRlPgorICAgICAgICA8L3dpdGg+CisgICAgIDwvZGVmaW5pdGlvbj4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KKyAgICAgPG1lbnVDb250cmlidXRpb24KKyAgICAgICAgICAgbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuU1RFTVByb2plY3RFeHBsb3Jlcj9hZnRlcj1hZGRpdGlvbnMiPgorICAgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmZpbGUucmVmcmVzaCIKKyAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUmVmcmVzaCAiCisgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgorICAgICAgICAgICAgICB0b29sdGlwPSIlX1VJX1JlZnJlc2hUVCI+CisgICAgICAgIDwvY29tbWFuZD4KKyAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICBsb2NhdGlvblVSST0icG9wdXA6b3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5TVEVNUHJvamVjdEV4cGxvcmVyP2FmdGVyPWFkZGl0aW9ucyI+CisgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC5kZWxldGUiCisgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0RlbGV0ZSIKKyAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfRGVsZXRlVFQiPgorICAgICAgICA8L2NvbW1hbmQ+CisgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgorICAgICA8ZGVmaW5pdGlvbgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5pc0RlbGV0ZWFibGUiPgorICAgICAgICA8d2l0aAorICAgICAgICAgICAgICB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KKyAgICAgICAgICAgPGl0ZXJhdGUKKyAgICAgICAgICAgICAgICAgb3BlcmF0b3I9ImFuZCI+CisgICAgICAgICAgICAgIDxvcj4KKyAgICAgICAgICAgICAgICAgPGFkYXB0CisgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KKyAgICAgICAgICAgICAgICAgPC9hZGFwdD4KKyAgICAgICAgICAgICAgICAgPGFkYXB0CisgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KKyAgICAgICAgICAgICAgICAgPC9hZGFwdD4KKyAgICAgICAgICAgICAgPC9vcj4KKyAgICAgICAgICAgPC9pdGVyYXRlPgorICAgICAgICA8L3dpdGg+CisgICAgIDwvZGVmaW5pdGlvbj4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KKyAgICAgPHZpZXcKKyAgICAgICAgICAgYWxsb3dNdWx0aXBsZT0iZmFsc2UiCisgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzIgorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbk5hdmlnYXRvciIKKyAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9TdGVtRXhwbG9yZXIuZ2lmIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciIKKyAgICAgICAgICAgbmFtZT0iJV9VSV9Qcm9qZWN0X0V4cGxvcmVyIgorICAgICAgICAgICByZXN0b3JhYmxlPSJ0cnVlIj4KKyAgICAgPC92aWV3PgorICA8L2V4dGVuc2lvbj4KKyAgCisgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXIiPgorICAgICA8dmlld2VyCisgICAgICAgICAgIHZpZXdlcklkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIj4KKyAgICAgPC92aWV3ZXI+CisgICAgIDx2aWV3ZXJDb250ZW50QmluZGluZworICAgICAgICAgICB2aWV3ZXJJZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciI+CisgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgIAorICAgICAgICAgICA8Y29udGVudEV4dGVuc2lvbgorICAgICAgICAgICAgICAgICBpc1Jvb3Q9InRydWUiCisgICAgICAgICAgICAgICAgIHBhdHRlcm49Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZUNvbnRlbnQiPgorICAgICAgICAgICA8L2NvbnRlbnRFeHRlbnNpb24+CisgICAgICAgICAgIDxjb250ZW50RXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgIHBhdHRlcm49Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuZmlsdGVycy4qIj4KKyAgICAgICAgICAgPC9jb250ZW50RXh0ZW5zaW9uPgorICAgICAgICAgCisgICAgICAgICAgPGNvbnRlbnRFeHRlbnNpb24KKyAgICAgICAgICAgICAgICAgcGF0dGVybj0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5pZGVudGlmaWFibGV0cmVlbm9kZXMiPgorICAgICAgICAgICA8L2NvbnRlbnRFeHRlbnNpb24+CisgICAgICAJCisgICAgICAJCisgICAgICAJICA8Y29udGVudEV4dGVuc2lvbgorICAgICAgICAgICAgICAgICBwYXR0ZXJuPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLmRlY29yYXRvcnMiPgorICAgICAgICAgICA8L2NvbnRlbnRFeHRlbnNpb24+CisgICAgICAgICAgIDxjb250ZW50RXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgIHBhdHRlcm49Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuc2NlbmFyaW9zIj4KKyAgICAgICAgICAgPC9jb250ZW50RXh0ZW5zaW9uPgorICAgICAgICAgICA8Y29udGVudEV4dGVuc2lvbgorICAgICAgICAgICAgICAgICBwYXR0ZXJuPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLnNlcXVlbmNlcnMiPgorICAgICAgICAgICA8L2NvbnRlbnRFeHRlbnNpb24+CisgICAgICAgICAgIDxjb250ZW50RXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgIHBhdHRlcm49Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuZXhwZXJpbWVudHMiPgorICAgICAgICAgICA8L2NvbnRlbnRFeHRlbnNpb24+CisgICAgICAgICAgIDxjb250ZW50RXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgIHBhdHRlcm49Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIubW9kZWxzIj4KKyAgICAgICAgICAgPC9jb250ZW50RXh0ZW5zaW9uPgorICAgICAgICAgICA8Y29udGVudEV4dGVuc2lvbgorICAgICAgICAgICAgICAgICBwYXR0ZXJuPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLm1vZGlmaWVycyI+CisgICAgICAgICAgIDwvY29udGVudEV4dGVuc2lvbj4KKyAgICAgICAgICAgPGNvbnRlbnRFeHRlbnNpb24KKyAgICAgICAgICAgICAgICAgcGF0dGVybj0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5ncmFwaHMiPgorICAgICAgICAgICA8L2NvbnRlbnRFeHRlbnNpb24+CisgICAgICAgICAgIDxjb250ZW50RXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgIHBhdHRlcm49Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIucmVjb3JkZWQiPgorICAgICAgICAgICA8L2NvbnRlbnRFeHRlbnNpb24+CisgICAgICAgICAgIDxjb250ZW50RXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgIHBhdHRlcm49Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIudHJpZ2dlcnMiPgorICAgICAgICAgICA8L2NvbnRlbnRFeHRlbnNpb24+CisgICAgICAgICAgIDxjb250ZW50RXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgIHBhdHRlcm49Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIucHJlZGljYXRlcyI+CisgICAgICAgICAgIDwvY29udGVudEV4dGVuc2lvbj4KKyAgICAgICAgICAgPGNvbnRlbnRFeHRlbnNpb24KKyAgICAgICAgICAgICAgICAgcGF0dGVybj0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5pZGVudGlmaWFibGVzMiI+CisgICAgICAgICAgIDwvY29udGVudEV4dGVuc2lvbj4KKyAgICAgICAgICAgPGNvbnRlbnRFeHRlbnNpb24KKyAgICAgICAgICAgICAgICAgcGF0dGVybj0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5kZWxlZ2F0aW5nd3JhcHBlcml0ZW1wcm92aWRlciI+CisgICAgICAgICAgIDwvY29udGVudEV4dGVuc2lvbj4KKyAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAKKyAgICAgPC92aWV3ZXJDb250ZW50QmluZGluZz4KKyAgICAgCisgICAgIDx2aWV3ZXJBY3Rpb25CaW5kaW5nCisgICAgICAgICAgIHZpZXdlcklkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIj4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICA8YWN0aW9uRXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgIHBhdHRlcm49Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuKiI+CisgICAgICAgICAgIDwvYWN0aW9uRXh0ZW5zaW9uPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICA8L3ZpZXdlckFjdGlvbkJpbmRpbmc+CisgICAgIDx2aWV3ZXJBY3Rpb25CaW5kaW5nCisgICAgICAgICAgIHZpZXdlcklkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIj4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICA8YWN0aW9uRXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgIHBhdHRlcm49Im9yZy5lY2xpcHNlLnN0ZW0udWkuYWN0aW9uLmVkaXRvci5vcGVuIj4KKyAgICAgICAgICAgPC9hY3Rpb25FeHRlbnNpb24+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgIDwvdmlld2VyQWN0aW9uQmluZGluZz4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4KKyAgICAgICAgICAgICAgICAKKyAgICAgPG5hdmlnYXRvckNvbnRlbnQKKyAgICAgICAgICAgY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5pZGVudGlmaWFibGV0cmVlbm9kZXMiCisgICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlVHJlZU5vZGVMYWJlbFByb3ZpZGVyIgorICAgICAgICAgICBuYW1lPSJJZGVudGlmaWFibGVUcmVlTm9kZXMiPgorICAgICAgICA8dHJpZ2dlclBvaW50cz4KKyAgICAgICAgICAgPGFkYXB0CisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KKyAgICAgICAgICAgPC9hZGFwdD4KKyAgICAgICAgPC90cmlnZ2VyUG9pbnRzPgorICAgICAgICA8cG9zc2libGVDaGlsZHJlbj4KKyAgICAgICAgICAgPGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlVHJlZU5vZGUiPgorICAgICAgICAgICA8L2luc3RhbmNlb2Y+CisgICAgICAgIDwvcG9zc2libGVDaGlsZHJlbj4KKyAgICAgPC9uYXZpZ2F0b3JDb250ZW50PgorICAgICA8bmF2aWdhdG9yQ29udGVudAorICAgICAgICAgICBjb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuUmVjb3JkZWRUcmVlTm9kZUNvbnRlbnRQcm92aWRlciIKKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIucmVjb3JkZWQiCisgICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuUmVjb3JkZWRUcmVlTm9kZUxhYmVsUHJvdmlkZXIiCisgICAgICAgICAgIG5hbWU9IiVfVUlfUmVjb3JkZWRfU2ltcyAiPgorICAgICAgICA8dHJpZ2dlclBvaW50cz4KKyAgICAgICAgICAgPGFkYXB0CisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KKyAgICAgICAgICAgPC9hZGFwdD4KKyAgICAgICAgPC90cmlnZ2VyUG9pbnRzPgorICAgICAgICA8cG9zc2libGVDaGlsZHJlbj4KKyAgICAgICAgICAgPGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuUmVjb3JkZWRUcmVlTm9kZSI+CisgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KKyAgICAgICAgPC9wb3NzaWJsZUNoaWxkcmVuPgorICAgICA8L25hdmlnYXRvckNvbnRlbnQ+CisgICAgIAorICAgICA8Y29tbW9uRmlsdGVyCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5maWx0ZXJzLmZvbGRlcnMiCisgICAgICAgICAgICBuYW1lPSIlZmlsdGVycy5maWx0ZXIuZm9sZGVycyIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlZmlsdGVycy5maWx0ZXIuZm9sZGVycyIKKyAgICAgICAgICAgIGFjdGl2ZUJ5RGVmYXVsdD0idHJ1ZSI+CisgICAgICA8ZmlsdGVyRXhwcmVzc2lvbj4KKyAgICAgICAJPGFuZD4KKwkgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXIiPgorCSAgICAgICAgICA8b3I+CisJICAgICAgICAgIAk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmFtZSIgdmFsdWU9Im1vZGVscyIvPgorCSAgICAgICAgICAJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm5hbWUiIHZhbHVlPSJkZWNvcmF0b3JzIi8+CisJICAgICAgICAgIAk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmFtZSIgdmFsdWU9ImV4cGVyaW1lbnRzIi8+CisJICAgICAgICAgIAk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmFtZSIgdmFsdWU9ImdyYXBocyIvPgorCSAgICAgICAgICAJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm5hbWUiIHZhbHVlPSJtb2RpZmllcnMiLz4KKwkgICAgICAgICAgCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5uYW1lIiB2YWx1ZT0icHJlZGljYXRlcyIvPgorCSAgICAgICAgICAJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm5hbWUiIHZhbHVlPSJSZWNvcmRlZCBTaW11bGF0aW9ucyIvPgorCSAgICAgICAgICAJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm5hbWUiIHZhbHVlPSJzY2VuYXJpb3MiLz4KKwkgICAgICAgICAgCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5uYW1lIiB2YWx1ZT0ic2VxdWVuY2VycyIvPgorCSAgICAgICAgICAJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm5hbWUiIHZhbHVlPSJ0cmlnZ2VycyIvPgorCSAgICAgICAgICA8L29yPgorICAgICAgICAgICAJPC9hZGFwdD4JICAgICAgICAgICAgCisJICAgICAgPC9hbmQ+CisgICAgICAgPC9maWx0ZXJFeHByZXNzaW9uPgorICAgICAgPC9jb21tb25GaWx0ZXI+CisgIAorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLm5hdmlnYXRvckNvbnRlbnQiPgorICAgICA8bmF2aWdhdG9yQ29udGVudAorICAgICAgICAgICBjb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlUHJvdmlkZXIiCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLmlkZW50aWZpYWJsZXMyIgorICAgICAgICAgICBsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZVByb3ZpZGVyIgorICAgICAgICAgICBuYW1lPSIlX1VJX0lkZW50aWZpYWJsZXMiPgorICAgICAgICA8dHJpZ2dlclBvaW50cz4KKyAgICAgICAgICAgPGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlIj4KKyAgICAgICAgICAgPC9pbnN0YW5jZW9mPgorICAgICAgICA8L3RyaWdnZXJQb2ludHM+CisgICAgICAgIDxwb3NzaWJsZUNoaWxkcmVuPgorICAgICAgICAgICA8aW5zdGFuY2VvZgorICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUiPgorICAgICAgICAgICA8L2luc3RhbmNlb2Y+CisgICAgICAgIDwvcG9zc2libGVDaGlsZHJlbj4KKyAgICAgPC9uYXZpZ2F0b3JDb250ZW50PgorICAgICA8bmF2aWdhdG9yQ29udGVudAorICAgICAgICAgICBjb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlQ29udGVudFByb3ZpZGVyIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5ncmFwaHMiCisgICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlUHJvdmlkZXIiCisgICAgICAgICAgIG5hbWU9IiVfVUlfR3JhcGhzIj4KKyAgICAgICAgPHRyaWdnZXJQb2ludHM+CisgICAgICAgICAgIDxpbnN0YW5jZW9mCisgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZVRyZWVOb2RlJEdyYXBoc1RyZWVOb2RlIj4KKyAgICAgICAgICAgPC9pbnN0YW5jZW9mPgorICAgICAgICA8L3RyaWdnZXJQb2ludHM+CisgICAgICAgIDxwb3NzaWJsZUNoaWxkcmVuPgorICAgICAgICAgICA8b3I+CisgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgorICAgICAgICAgICAgICA8aW5zdGFuY2VvZgorICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoIj4KKyAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgorICAgICAgICAgICA8L29yPgorICAgICAgICA8L3Bvc3NpYmxlQ2hpbGRyZW4+CisgICAgICAgIDxkcm9wQXNzaXN0YW50CisgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZURyb3BBZGFwdGVyQXNzaXN0YW50IgorICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5pZGVudGlmYWJsZWRyb3Bhc3Npc3RhbnQiPgorICAgICAgICAgICA8cG9zc2libGVEcm9wVGFyZ2V0cz4KKyAgICAgICAgICAgICAgPGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlVHJlZU5vZGUkR3JhcGhzVHJlZU5vZGUiPgorICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+CisgICAgICAgICAgIDwvcG9zc2libGVEcm9wVGFyZ2V0cz4KKyAgICAgICAgPC9kcm9wQXNzaXN0YW50PgorICAgICA8L25hdmlnYXRvckNvbnRlbnQ+CisgICAgIDxuYXZpZ2F0b3JDb250ZW50CisgICAgICAgICAgIGNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5JZGVudGlmaWFibGVDb250ZW50UHJvdmlkZXIiCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLnNjZW5hcmlvcyIKKyAgICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5JZGVudGlmaWFibGVQcm92aWRlciIKKyAgICAgICAgICAgbmFtZT0iJV9VSV9TY2VuYXJpb3MiPgorICAgICAgICA8dHJpZ2dlclBvaW50cz4KKyAgICAgICAgICAgPGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlVHJlZU5vZGUkU2NlbmFyaW9zVHJlZU5vZGUiPgorICAgICAgICAgICA8L2luc3RhbmNlb2Y+CisgICAgICAgIDwvdHJpZ2dlclBvaW50cz4KKyAgICAgICAgPHBvc3NpYmxlQ2hpbGRyZW4+CisgICAgICAgICAgIDxvcj4KKyAgICAgICAgICAgICAgPGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+CisgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8iPgorICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+CisgICAgICAgICAgIDwvb3I+CisgICAgICAgIDwvcG9zc2libGVDaGlsZHJlbj4KKyAgICAgICAgPGRyb3BBc3Npc3RhbnQKKyAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlRHJvcEFkYXB0ZXJBc3Npc3RhbnQiCisgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLmlkZW50aWZhYmxlZHJvcGFzc2lzdGFudCI+CisgICAgICAgICAgIDxwb3NzaWJsZURyb3BUYXJnZXRzPgorICAgICAgICAgICAgICA8aW5zdGFuY2VvZgorICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5JZGVudGlmaWFibGVUcmVlTm9kZSRTY2VuYXJpb3NUcmVlTm9kZSI+CisgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KKyAgICAgICAgICAgPC9wb3NzaWJsZURyb3BUYXJnZXRzPgorICAgICAgICA8L2Ryb3BBc3Npc3RhbnQ+CisgICAgIDwvbmF2aWdhdG9yQ29udGVudD4KKyAgICAgPG5hdmlnYXRvckNvbnRlbnQKKyAgICAgICAgICAgY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZUNvbnRlbnRQcm92aWRlciIKKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuc2VxdWVuY2VycyIKKyAgICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5JZGVudGlmaWFibGVQcm92aWRlciIKKyAgICAgICAgICAgbmFtZT0iJV9VSV9TZXF1ZW5jZXJzIj4KKyAgICAgICAgPHRyaWdnZXJQb2ludHM+CisgICAgICAgICAgIDxpbnN0YW5jZW9mCisgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZVRyZWVOb2RlJFNlcXVlbmNlcnNUcmVlTm9kZSI+CisgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KKyAgICAgICAgPC90cmlnZ2VyUG9pbnRzPgorICAgICAgICA8cG9zc2libGVDaGlsZHJlbj4KKyAgICAgICAgICAgPG9yPgorICAgICAgICAgICAgICA8aW5zdGFuY2VvZgorICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KKyAgICAgICAgICAgICAgPGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyIj4KKyAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgorICAgICAgICAgICA8L29yPgorICAgICAgICA8L3Bvc3NpYmxlQ2hpbGRyZW4+CisgICAgICAgIDxkcm9wQXNzaXN0YW50CisgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZURyb3BBZGFwdGVyQXNzaXN0YW50IgorICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5pZGVudGlmYWJsZWRyb3Bhc3Npc3RhbnQiPgorICAgICAgICAgICA8cG9zc2libGVEcm9wVGFyZ2V0cz4KKyAgICAgICAgICAgICAgPGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlVHJlZU5vZGUkU2VxdWVuY2Vyc1RyZWVOb2RlIj4KKyAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgorICAgICAgICAgICA8L3Bvc3NpYmxlRHJvcFRhcmdldHM+CisgICAgICAgIDwvZHJvcEFzc2lzdGFudD4KKyAgICAgPC9uYXZpZ2F0b3JDb250ZW50PgorICAgICA8bmF2aWdhdG9yQ29udGVudAorICAgICAgICAgICBjb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlQ29udGVudFByb3ZpZGVyIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci50cmlnZ2VycyIKKyAgICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5JZGVudGlmaWFibGVQcm92aWRlciIKKyAgICAgICAgICAgbmFtZT0iJV9VSV9UcmlnZ2VycyI+CisgICAgICAgIDx0cmlnZ2VyUG9pbnRzPgorICAgICAgICAgICA8aW5zdGFuY2VvZgorICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5JZGVudGlmaWFibGVUcmVlTm9kZSRUcmlnZ2Vyc1RyZWVOb2RlIj4KKyAgICAgICAgICAgPC9pbnN0YW5jZW9mPgorICAgICAgICA8L3RyaWdnZXJQb2ludHM+CisgICAgICAgIDxwb3NzaWJsZUNoaWxkcmVuPgorICAgICAgICAgICA8b3I+CisgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgorICAgICAgICAgICAgICA8aW5zdGFuY2VvZgorICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuVHJpZ2dlciI+CisgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KKyAgICAgICAgICAgPC9vcj4KKyAgICAgICAgPC9wb3NzaWJsZUNoaWxkcmVuPgorICAgICAgICA8ZHJvcEFzc2lzdGFudAorICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5JZGVudGlmaWFibGVEcm9wQWRhcHRlckFzc2lzdGFudCIKKyAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuaWRlbnRpZmFibGVkcm9wYXNzaXN0YW50Ij4KKyAgICAgICAgICAgPHBvc3NpYmxlRHJvcFRhcmdldHM+CisgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZVRyZWVOb2RlJFRyaWdnZXJzVHJlZU5vZGUiPgorICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+CisgICAgICAgICAgIDwvcG9zc2libGVEcm9wVGFyZ2V0cz4KKyAgICAgICAgPC9kcm9wQXNzaXN0YW50PgorICAgICA8L25hdmlnYXRvckNvbnRlbnQ+CisgICAgIDxuYXZpZ2F0b3JDb250ZW50CisgICAgICAgICAgIGNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5JZGVudGlmaWFibGVDb250ZW50UHJvdmlkZXIiCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLmV4cGVyaW1lbnRzIgorICAgICAgICAgICBsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZVByb3ZpZGVyIgorICAgICAgICAgICBuYW1lPSIlX1VJX0V4cGVyaW1lbnRzIj4KKyAgICAgICAgPHRyaWdnZXJQb2ludHM+CisgICAgICAgICAgIDxpbnN0YW5jZW9mCisgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZVRyZWVOb2RlJEV4cGVyaW1lbnRzVHJlZU5vZGUiPgorICAgICAgICAgICA8L2luc3RhbmNlb2Y+CisgICAgICAgIDwvdHJpZ2dlclBvaW50cz4KKyAgICAgICAgPHBvc3NpYmxlQ2hpbGRyZW4+CisgICAgICAgICAgIDxvcj4KKyAgICAgICAgICAgICAgPGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+CisgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50Ij4KKyAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgorICAgICAgICAgICA8L29yPgorICAgICAgICA8L3Bvc3NpYmxlQ2hpbGRyZW4+CisgICAgICAgIDxkcm9wQXNzaXN0YW50CisgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZURyb3BBZGFwdGVyQXNzaXN0YW50IgorICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5pZGVudGlmYWJsZWRyb3Bhc3Npc3RhbnQiPgorICAgICAgICAgICA8cG9zc2libGVEcm9wVGFyZ2V0cz4KKyAgICAgICAgICAgICAgPGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlVHJlZU5vZGUkRXhwZXJpbWVudHNUcmVlTm9kZSI+CisgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KKyAgICAgICAgICAgPC9wb3NzaWJsZURyb3BUYXJnZXRzPgorICAgICAgICA8L2Ryb3BBc3Npc3RhbnQ+CisgICAgIDwvbmF2aWdhdG9yQ29udGVudD4KKyAgICAgPG5hdmlnYXRvckNvbnRlbnQKKyAgICAgICAgICAgY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZUNvbnRlbnRQcm92aWRlciIKKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIubW9kaWZpZXJzIgorICAgICAgICAgICBsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZVByb3ZpZGVyIgorICAgICAgICAgICBuYW1lPSIlX1VJX01vZGlmaWVycyI+CisgICAgICAgIDx0cmlnZ2VyUG9pbnRzPgorICAgICAgICAgICA8aW5zdGFuY2VvZgorICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5JZGVudGlmaWFibGVUcmVlTm9kZSRNb2RpZmllcnNUcmVlTm9kZSI+CisgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KKyAgICAgICAgPC90cmlnZ2VyUG9pbnRzPgorICAgICAgICA8cG9zc2libGVDaGlsZHJlbj4KKyAgICAgICAgICAgPG9yPgorICAgICAgICAgICAgICA8aW5zdGFuY2VvZgorICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KKyAgICAgICAgICAgICAgPGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllciI+CisgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KKyAgICAgICAgICAgPC9vcj4KKyAgICAgICAgPC9wb3NzaWJsZUNoaWxkcmVuPgorICAgICAgICA8ZHJvcEFzc2lzdGFudAorICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5JZGVudGlmaWFibGVEcm9wQWRhcHRlckFzc2lzdGFudCIKKyAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuaWRlbnRpZmFibGVkcm9wYXNzaXN0YW50Ij4KKyAgICAgICAgICAgPHBvc3NpYmxlRHJvcFRhcmdldHM+CisgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZVRyZWVOb2RlJE1vZGlmaWVyc1RyZWVOb2RlIj4KKyAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgorICAgICAgICAgICA8L3Bvc3NpYmxlRHJvcFRhcmdldHM+CisgICAgICAgIDwvZHJvcEFzc2lzdGFudD4KKyAgICAgPC9uYXZpZ2F0b3JDb250ZW50PgorICAgICA8bmF2aWdhdG9yQ29udGVudAorICAgICAgICAgICBjb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlQ29udGVudFByb3ZpZGVyIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5tb2RlbHMiCisgICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlUHJvdmlkZXIiCisgICAgICAgICAgIG5hbWU9IiVfVUlfTW9kZWxzIj4KKyAgICAgICAgPHRyaWdnZXJQb2ludHM+CisgICAgICAgICAgIDxpbnN0YW5jZW9mCisgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZVRyZWVOb2RlJE1vZGVsc1RyZWVOb2RlIj4KKyAgICAgICAgICAgPC9pbnN0YW5jZW9mPgorICAgICAgICA8L3RyaWdnZXJQb2ludHM+CisgICAgICAgIDxwb3NzaWJsZUNoaWxkcmVuPgorICAgICAgICAgICA8b3I+CisgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgorICAgICAgICAgICAgICA8aW5zdGFuY2VvZgorICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsIj4KKyAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgorICAgICAgICAgICA8L29yPgorICAgICAgICA8L3Bvc3NpYmxlQ2hpbGRyZW4+CisgICAgICAgIDxkcm9wQXNzaXN0YW50CisgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZURyb3BBZGFwdGVyQXNzaXN0YW50IgorICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5pZGVudGlmYWJsZWRyb3Bhc3Npc3RhbnQiPgorICAgICAgICAgICA8cG9zc2libGVEcm9wVGFyZ2V0cz4KKyAgICAgICAgICAgICAgPGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlVHJlZU5vZGUkTW9kZWxzVHJlZU5vZGUiPgorICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+CisgICAgICAgICAgIDwvcG9zc2libGVEcm9wVGFyZ2V0cz4KKyAgICAgICAgPC9kcm9wQXNzaXN0YW50PgorICAgICA8L25hdmlnYXRvckNvbnRlbnQ+CisgICAgIDxuYXZpZ2F0b3JDb250ZW50CisgICAgICAgICAgIGNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5JZGVudGlmaWFibGVDb250ZW50UHJvdmlkZXIiCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLnByZWRpY2F0ZXMiCisgICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlUHJvdmlkZXIiCisgICAgICAgICAgIG5hbWU9IiVfVUlfUHJlZGljYXRlcyI+CisgICAgICAgIDx0cmlnZ2VyUG9pbnRzPgorICAgICAgICAgICA8aW5zdGFuY2VvZgorICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5JZGVudGlmaWFibGVUcmVlTm9kZSRQcmVkaWNhdGVzVHJlZU5vZGUiPgorICAgICAgICAgICA8L2luc3RhbmNlb2Y+CisgICAgICAgIDwvdHJpZ2dlclBvaW50cz4KKyAgICAgICAgPHBvc3NpYmxlQ2hpbGRyZW4+CisgICAgICAgICAgIDxvcj4KKyAgICAgICAgICAgICAgPGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+CisgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZSI+CisgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KKyAgICAgICAgICAgPC9vcj4KKyAgICAgICAgPC9wb3NzaWJsZUNoaWxkcmVuPgorICAgICAgICA8ZHJvcEFzc2lzdGFudAorICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5JZGVudGlmaWFibGVEcm9wQWRhcHRlckFzc2lzdGFudCIKKyAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuaWRlbnRpZmFibGVkcm9wYXNzaXN0YW50Ij4KKyAgICAgICAgICAgPHBvc3NpYmxlRHJvcFRhcmdldHM+CisgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZVRyZWVOb2RlJFByZWRpY2F0ZXNUcmVlTm9kZSI+CisgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KKyAgICAgICAgICAgPC9wb3NzaWJsZURyb3BUYXJnZXRzPgorICAgICAgICA8L2Ryb3BBc3Npc3RhbnQ+CisgICAgIDwvbmF2aWdhdG9yQ29udGVudD4KKyAgICAgPG5hdmlnYXRvckNvbnRlbnQKKyAgICAgICAgICAgY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZUNvbnRlbnRQcm92aWRlciIKKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuZGVjb3JhdG9ycyIKKyAgICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5JZGVudGlmaWFibGVQcm92aWRlciIKKyAgICAgICAgICAgbmFtZT0iJV9VSV9EZWNvcmF0b3JzIj4KKyAgICAgICAgPHRyaWdnZXJQb2ludHM+CisgICAgICAgICAgIDxpbnN0YW5jZW9mCisgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZVRyZWVOb2RlJERlY29yYXRvcnNUcmVlTm9kZSI+CisgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KKyAgICAgICAgPC90cmlnZ2VyUG9pbnRzPgorICAgICAgICA8cG9zc2libGVDaGlsZHJlbj4KKyAgICAgICAgICAgPG9yPgorICAgICAgICAgICAgICA8aW5zdGFuY2VvZgorICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KKyAgICAgICAgICAgICAgPGluc3RhbmNlb2YKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IiPgorICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+CisgICAgICAgICAgIDwvb3I+CisgICAgICAgIDwvcG9zc2libGVDaGlsZHJlbj4KKyAgICAgICAgPGRyb3BBc3Npc3RhbnQKKyAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlRHJvcEFkYXB0ZXJBc3Npc3RhbnQiCisgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLmlkZW50aWZhYmxlZHJvcGFzc2lzdGFudCI+CisgICAgICAgICAgIDxwb3NzaWJsZURyb3BUYXJnZXRzPgorICAgICAgICAgICAgICA8aW5zdGFuY2VvZgorICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5JZGVudGlmaWFibGVUcmVlTm9kZSREZWNvcmF0b3JzVHJlZU5vZGUiPgorICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+CisgICAgICAgICAgIDwvcG9zc2libGVEcm9wVGFyZ2V0cz4KKyAgICAgICAgPC9kcm9wQXNzaXN0YW50PgorICAgICA8L25hdmlnYXRvckNvbnRlbnQ+CisgICAgIAorICAgICA8YWN0aW9uUHJvdmlkZXIKKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkuaGFuZGxlcnMuRWRpdG9yQWN0aW9uUHJvdmlkZXIiCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmFjdGlvbi5lZGl0b3Iub3BlbiI+CisgICAgICAgIDxlbmFibGVtZW50PgorICAgICAgICAgICA8aW5zdGFuY2VvZgorICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUiPgorICAgICAgICAgICA8L2luc3RhbmNlb2Y+CisgICAgICAgIDwvZW5hYmxlbWVudD4KKyAgICAgPC9hY3Rpb25Qcm92aWRlcj4KKyAgICAgCisgIDwvZXh0ZW5zaW9uPgorICAKKyAgCisgIDxleHRlbnNpb24KKyAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW50cm8iPgorICAgIDxpbnRyb1Byb2R1Y3RCaW5kaW5nCisgICAgICAgIGludHJvSWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbCIKKyAgICAgICAgcHJvZHVjdElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnByb2R1Y3QiPgorICAgIDwvaW50cm9Qcm9kdWN0QmluZGluZz4KKyAgPC9leHRlbnNpb24+CisgIAorICA8ZXh0ZW5zaW9uCisgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLmNvbmZpZ0V4dGVuc2lvbiI+CisgICAgPGNvbmZpZ0V4dGVuc2lvbgorICAgICAgICBjb25maWdJZD0ib3JnLmVjbGlwc2UudWkuaW50cm8udW5pdmVyc2FsQ29uZmlnIgorICAgICAgICBjb250ZW50PSIkbmwkL2ludHJvL292ZXJ2aWV3RXh0ZW5zaW9uQ29udGVudC54bWwiPgorICAgIDwvY29uZmlnRXh0ZW5zaW9uPgorICAgIDxjb25maWdFeHRlbnNpb24KKyAgICAgICAgY29uZmlnSWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbENvbmZpZyIKKyAgICAgICAgY29udGVudD0iJG5sJC9pbnRyby93aGF0c25ld0V4dGVuc2lvbkNvbnRlbnQueG1sIj4KKyAgICA8L2NvbmZpZ0V4dGVuc2lvbj4KKyAgICA8Y29uZmlnRXh0ZW5zaW9uCisgICAgICAgIGNvbmZpZ0lkPSJvcmcuZWNsaXBzZS51aS5pbnRyby51bml2ZXJzYWxDb25maWciCisgICAgICAgIGNvbnRlbnQ9IiRubCQvaW50cm8vdHV0b3JpYWxzRXh0ZW5zaW9uQ29udGVudC54bWwiPgorICAgIDwvY29uZmlnRXh0ZW5zaW9uPgorICA8L2V4dGVuc2lvbj4KKworCisgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5zcGxhc2hIYW5kbGVycyI+CisgICAgICA8c3BsYXNoSGFuZGxlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udWkuc3BsYXNoaGFuZGxlci5TcGxhc2hIYW5kbGVyIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuc3BsYXNoaGFuZGxlciI+CisgICAgICA8L3NwbGFzaEhhbmRsZXI+CisgICAgICA8c3BsYXNoSGFuZGxlclByb2R1Y3RCaW5kaW5nCisgICAgICAgICAgICBwcm9kdWN0SWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkucHJvZHVjdCIKKyAgICAgICAgICAgIHNwbGFzaElkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnNwbGFzaGhhbmRsZXIiPgorICAgICAgPC9zcGxhc2hIYW5kbGVyUHJvZHVjdEJpbmRpbmc+CisgICA8L2V4dGVuc2lvbj4gIAorCisgIDwhLS0KKyAgPGV4dGVuc2lvbgorICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisgICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgbG9jYXRpb25VUkk9Im1lbnU6b3JnLmVjbGlwc2UudWkubWFpbi5tZW51Ij4KKyAgICAgICAgIDxtZW51CisgICAgICAgICAgICAgICBsYWJlbD0iSGVscDIiCisgICAgICAgICAgICAgICB0b29sdGlwPSJIZWxwMiI+CisKKyAgICAgICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmhlbHAucXVpY2tTdGFydEFjdGlvbiIKKyAgICAgICAgICAgICAgICAgICBpZD0icXVpY2tTdGFydEFjdGlvbiIKKyAgICAgICAgICAgICAgICAgICBzdHlsZT0icHVzaCI+CisgICAgICAgICAgIDwvY29tbWFuZD4KKyAgICAgICAgIDwvbWVudT4KKyAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICA8L2V4dGVuc2lvbj4KKyAgLS0+CisgIAorPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3BsdWdpbl9jdXN0b21pemF0aW9uLmluaSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvcGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNDEwYTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3BsdWdpbl9jdXN0b21pemF0aW9uLmluaQpAQCAtMCwwICsxLDYgQEAKK29yZy5lY2xpcHNlLnVpL1NIT1dfUFJPR1JFU1NfT05fU1RBUlRVUCA9IHRydWUKK29yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbC9JTlRST19ST09UX1BBR0VTID0gcm9vdCxvdmVydmlldyx0dXRvcmlhbHMsd2hhdHNuZXcKKyNvcmcuZWNsaXBzZS51aS5pbnRyby51bml2ZXJzYWwvSU5UUk9fUk9PVF9QQUdFUyA9IHJvb3Qsb3ZlcnZpZXcsZmlyc3RzdGVwcyx0dXRvcmlhbHMsc2FtcGxlcyx3aGF0c25ldyxtaWdyYXRlLHdlYnJlc291cmNlcworI29yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbC9JTlRST19EQVRBID0gcHJvZHVjdDokbmwkL2ludHJvQ29udGVudC54bWwKK29yZy5lY2xpcHNlLnVpLmludHJvL0lOVFJPX1RIRU1FID0gb3JnLmVjbGlwc2UudWkuaW50cm8udW5pdmVyc2FsLnNsYXRlCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc2NoZW1hL3VpLmNvbG9wcm92aWRlcnMuZXhzZCBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc2NoZW1hL3VpLmNvbG9wcm92aWRlcnMuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTA0NGRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zY2hlbWEvdWkuY29sb3Byb3ZpZGVycy5leHNkCkBAIC0wLDAgKzEsMTE0IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5zdGVtLnVpIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnN0ZW0udWkiIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmNvbG9ycHJvdmlkZXJzIiBuYW1lPSJVSSBDb2xvciBQcm92aWRlcnMiLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGFkZGluZyBDb2xvciBQcm92aWRlcnMgdG8gdGhlIFVJLgorQ29sb3IgcHJvdmlkZXJzIGFyZSByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIHRoZSBjb2xvcnMgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGhlIG1hcC4KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KKyAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+CisgICAgICAgICA8L2FwcGluZm8+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbG9wcm92aWRlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGVsZW1lbnQgbmFtZT0iY29sb3Byb3ZpZGVyIj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBBIGRpc3BsYXkgbmFtZSB0byBiZSB1c2VkIGluIHRoZSBjb21ibyBib3ggb2Ygc2VsZWN0aW5nIHRoZSBjb2xvciBwcm92aWRlcnMuCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjdG9yeSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBUaGUgZmFjdG9yeSBjbGFzcyBvZiBjb2xvciBwcm92aWRlciBhZGFwdGVycy4KK0ZhY3RvcnkgY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5Db2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkmbHQ7L2NvZGUmZ3Q7IGludGVyZmFjZS4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgIDxhcHBpbmZvPgorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLkNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIvPgorICAgICAgICAgICAgICAgPC9hcHBpbmZvPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByb3ZpZGVyIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIFRoZSBjb2xvciBwcm92aWRlciBpbnRlcmZhY2UuCitUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCB0aGUgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5Db2xvclByb3ZpZGVyJmx0Oy9jb2RlJmd0OyBpbnRlcmZhY2UuCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5Db2xvclByb3ZpZGVyIi8+CisgICAgICAgICAgICAgICA8L2FwcGluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhIHNhbXBsZSB1c2FnZSBvZiB0aGUgY29sb3IgcHJvdmlkZXIgZXh0ZW5zaW9uIHBvaW50OgorICAgICAgICAgCismbHQ7ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnN0ZW0udWkuY29sb3Jwcm92aWRlcnMmcXVvdDsmZ3Q7CisgICAgICZsdDtjb2xvcHJvdmlkZXIKKyAgICAgICAgICAgZmFjdG9yeT0mcXVvdDtvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLlNFSVJSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5JnF1b3Q7CisgICAgICAgICAgIG5hbWU9JnF1b3Q7JmFtcDtxdW90O1JhaW5ib3cmYW1wO3F1b3Q7IFJlbGF0aXZlIFZhbHVlcyZxdW90OworICAgICAgICAgICBwcm92aWRlcj0mcXVvdDtvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLlNFSVJSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlciZxdW90OyZndDsKKyAgICAgJmx0Oy9jb2xvcHJvdmlkZXImZ3Q7CismbHQ7L2V4dGVuc2lvbiZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwaW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpaW5mbyIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBUaGUgc3VwcGxpZWQgZmFjdG9yeSBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5Db2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkmbHQ7L2NvZGUmZ3Q7IGludGVyZmFjZS4KKworVGhlIHN1cHBsaWVkIGNvbG9yIHByb3ZpZGVyIGludGVyZmFjZSBtdXN0IGV4dGVuZCB0aGUgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5Db2xvclByb3ZpZGVyJmx0Oy9jb2RlJmd0OyBpbnRlcmZhY2UuCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKworCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3BsYXNoLmJtcCBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3BsYXNoLmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTVlZmIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcGxhc2guYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJlc2VudGF0aW9uL0NvbW1vbkFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3ByZXNlbnRhdGlvbi9Db21tb25BY3Rpb25CYXJDb250cmlidXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYjIxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3ByZXNlbnRhdGlvbi9Db21tb25BY3Rpb25CYXJDb250cmlidXRvci5qYXZhCkBAIC0wLDAgKzEsNDQxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisvL2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLmFjdGlvbi5Xb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbnRyb2xBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkxvYWRSZXNvdXJjZUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJDb250cmlidXRpb25JdGVtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZvciB0aGUgQ29tbW9uIG1vZGVsIGVkaXRvci4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQ29tbW9uQWN0aW9uQmFyQ29udHJpYnV0b3IKKwlleHRlbmRzIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcgorCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yUGFydDsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGFjdGlvbiBvcGVucyB0aGUgUHJvcGVydGllcyB2aWV3LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQWN0aW9uIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbiA9CisJCW5ldyBBY3Rpb24oQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtIikpIC8vJE5PTi1OTFMtMSQKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJdHJ5IHsKKwkJCQkJZ2V0UGFnZSgpLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgYWN0aW9uIHJlZnJlc2hlcyB0aGUgdmlld2VyIG9mIHRoZSBjdXJyZW50IGVkaXRvciBpZiB0aGUgZWRpdG9yCisJICogaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUFjdGlvbiByZWZyZXNoVmlld2VyQWN0aW9uID0KKwkJbmV3IEFjdGlvbihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtIikpIC8vJE5PTi1OTFMtMSQKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisJCQkJcmV0dXJuIGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWlmIChhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7CisJCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRWaWV3ZXIoKTsKKwkJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7CisJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyB3aWxsIGNvbnRhaW4gb25lIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlQ2hpbGRBY3Rpb25zOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVDaGlsZCBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlU2libGluZ0FjdGlvbnM7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZVNpYmxpbmcgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgY29udHJpYnV0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbW1vbkFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgeworCQlzdXBlcihBRERJVElPTlNfTEFTVF9TVFlMRSk7CisJCWxvYWRSZXNvdXJjZUFjdGlvbiA9IG5ldyBMb2FkUmVzb3VyY2VBY3Rpb24oKTsKKwkJdmFsaWRhdGVBY3Rpb24gPSBuZXcgVmFsaWRhdGVBY3Rpb24oKTsKKwkJY29udHJvbEFjdGlvbiA9IG5ldyBDb250cm9sQWN0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIFNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMgdG8gdGhlIHRvb2wgYmFyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7CisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJjb21tb24tc2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImNvbW1vbi1hZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgdG8gdGhlIG1lbnUgYmFyIGEgbWVudSBhbmQgc29tZSBzZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zLAorCSAqIGFzIHdlbGwgYXMgdGhlIHN1Yi1tZW51cyBmb3Igb2JqZWN0IGNyZWF0aW9uIGl0ZW1zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudU1hbmFnZXIpOworCisJCUlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbW1vbkVkaXRvcl9tZW51IiksICJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uTWVudUlEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlQ2hpbGQgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgorCQkvLworCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVTaWJsaW5nIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KKwkJLy8KKwkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gRm9yY2UgYW4gdXBkYXRlIGJlY2F1c2UgRWNsaXBzZSBoaWRlcyBlbXB0eSBtZW51cyBub3cuCisJCS8vCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcgorCQkJKG5ldyBJTWVudUxpc3RlbmVyKCkgeworCQkJCSBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCQkJCSBtZW51TWFuYWdlci51cGRhdGVBbGwodHJ1ZSk7CisJCQkJIH0KKwkJCSB9KTsKKworCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiBXaGVuIHRoZSBhY3RpdmUgZWRpdG9yIGNoYW5nZXMsIHRoaXMgcmVtZW1iZXJzIHRoZSBjaGFuZ2UgYW5kIHJlZ2lzdGVycyB3aXRoIGl0IGFzIGEgc2VsZWN0aW9uIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBwYXJ0KSB7CisJCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihwYXJ0KTsKKwkJYWN0aXZlRWRpdG9yUGFydCA9IHBhcnQ7CisKKwkJLy8gU3dpdGNoIHRvIHRoZSBuZXcgc2VsZWN0aW9uIHByb3ZpZGVyLgorCQkvLworCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCQl9CisJCWlmIChwYXJ0ID09IG51bGwpIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsKKwkJfQorCQllbHNlIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gcGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKKwkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKworCQkJLy8gRmFrZSBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IHRvIHVwZGF0ZSB0aGUgbWVudXMuCisJCQkvLworCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpICE9IG51bGwpIHsKKwkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn0sCisJICogaGFuZGxpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50fXMgYnkgcXVlcnlpbmcgZm9yIHRoZSBjaGlsZHJlbiBhbmQgc2libGluZ3MKKwkgKiB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZCB1cGRhdGluZyB0aGUgbWVudXMgYWNjb3JkaW5nbHkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJLy8gUmVtb3ZlIGFueSBtZW51IGl0ZW1zIGZvciBvbGQgc2VsZWN0aW9uLgorCQkvLworCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMpOworCQl9CisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucyk7CisJCX0KKworCQkvLyBRdWVyeSB0aGUgbmV3IHNlbGVjdGlvbiBmb3IgYXBwcm9wcmlhdGUgbmV3IGNoaWxkL3NpYmxpbmcgZGVzY3JpcHRvcnMKKwkJLy8KKwkJQ29sbGVjdGlvbjw/PiBuZXdDaGlsZERlc2NyaXB0b3JzID0gbnVsbDsKKwkJQ29sbGVjdGlvbjw/PiBuZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBudWxsOworCisJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7CisJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsKKwkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7CisKKwkJCUVkaXRpbmdEb21haW4gZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKKworCQkJbmV3Q2hpbGREZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgbnVsbCk7CisJCQluZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhudWxsLCBvYmplY3QpOworCQl9CisKKwkJLy8gR2VuZXJhdGUgYWN0aW9ucyBmb3Igc2VsZWN0aW9uOyBwb3B1bGF0ZSBhbmQgcmVkcmF3IHRoZSBtZW51cy4KKwkJLy8KKwkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMobmV3Q2hpbGREZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKKwkJY3JlYXRlU2libGluZ0FjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKG5ld1NpYmxpbmdEZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKKworCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKKwkJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOworCQl9CisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOworCQkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwKKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgeworCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVDaGlsZEFjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYWN0aW9uczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwKKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoQ29sbGVjdGlvbjw/PiBkZXNjcmlwdG9ycywgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJQ29sbGVjdGlvbjxJQWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOworCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgeworCQkJZm9yIChPYmplY3QgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7CisJCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCisJLyoqCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiB3aXRoIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbiwKKwkgKiBieSBpbnNlcnRpbmcgdGhlbSBiZWZvcmUgdGhlIHNwZWNpZmllZCBjb250cmlidXRpb24gaXRlbSA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4uCisJICogSWYgPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGV5IGFyZSBzaW1wbHkgYWRkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248PyBleHRlbmRzIElBY3Rpb24+IGFjdGlvbnMsIFN0cmluZyBjb250cmlidXRpb25JRCkgeworCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKElBY3Rpb24gYWN0aW9uIDogYWN0aW9ucykgeworCQkJCWlmIChjb250cmlidXRpb25JRCAhPSBudWxsKSB7CisJCQkJCW1hbmFnZXIuaW5zZXJ0QmVmb3JlKGNvbnRyaWJ1dGlvbklELCBhY3Rpb24pOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJbWFuYWdlci5hZGQoYWN0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCQorCS8qKgorCSAqIFRoaXMgcmVtb3ZlcyBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gYWxsIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkZXBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zKSB7CisJCWlmIChhY3Rpb25zICE9IG51bGwpIHsKKwkJCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtYW5hZ2VyLmdldEl0ZW1zKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CisJCQkJLy8gTG9vayBpbnRvIFN1YkNvbnRyaWJ1dGlvbkl0ZW1zCisJCQkJLy8KKwkJCQlJQ29udHJpYnV0aW9uSXRlbSBjb250cmlidXRpb25JdGVtID0gaXRlbXNbaV07CisJCQkJd2hpbGUgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBTdWJDb250cmlidXRpb25JdGVtKSB7CisJCQkJCWNvbnRyaWJ1dGlvbkl0ZW0gPSAoKFN1YkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0SW5uZXJJdGVtKCk7CisJCQkJfQorCisJCQkJLy8gRGVsZXRlIHRoZSBBY3Rpb25Db250cmlidXRpb25JdGVtcyB3aXRoIG1hdGNoaW5nIGFjdGlvbi4KKwkJCQkvLworCQkJCWlmIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCQlJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSljb250cmlidXRpb25JdGVtKS5nZXRBY3Rpb24oKTsKKwkJCQkJaWYgKGFjdGlvbnMuY29udGFpbnMoYWN0aW9uKSkgeworCQkJCQkJbWFuYWdlci5yZW1vdmUoY29udHJpYnV0aW9uSXRlbSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgcG9wLXVwIG1lbnUgYmVmb3JlIGl0IGFwcGVhcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQlzdXBlci5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOworCQlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG51bGw7CisKKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOworCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOworCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGluc2VydHMgZ2xvYmFsIGFjdGlvbnMgYmVmb3JlIHRoZSAiYWRkaXRpb25zLWVuZCIgc2VwYXJhdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMtZW5kIiwgbmV3IFNlcGFyYXRvcigidWktYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uKTsgLy8kTk9OLU5MUy0xJAorCisJCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsJCQorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHJlZnJlc2hWaWV3ZXJBY3Rpb24pOyAvLyROT04tTkxTLTEkCisKKwkJc3VwZXIuYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogVGhpcyBlbnN1cmVzIHRoYXQgYSBkZWxldGUgYWN0aW9uIHdpbGwgY2xlYW4gdXAgYWxsIHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBvYmplY3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUFsbFJlZmVyZW5jZXNPbkRlbGV0ZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3ByZXNlbnRhdGlvbi9Db21tb25FZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJlc2VudGF0aW9uL0NvbW1vbkVkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZGFhNzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3ByZXNlbnRhdGlvbi9Db21tb25FZGl0b3IuamF2YQpAQCAtMCwwICsxLDE1NTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLmVkaXRvci5Qcm9ibGVtRWRpdG9yUGFydDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVmFsaWRhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlJdGVtRGVsZWdhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5jZWxsZWRpdG9yLkFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkxvY2FsVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLlZpZXdlckRyYWdBZGFwdGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuVW53cmFwcGluZ1NlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJTWFya2VySGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS52aWV3LkV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVhNSVJlc291cmNlRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LnByb3ZpZGVyLkV4cGVyaW1lbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlci5HcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByb3ZpZGVyLk1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXIuTW9kaWZpZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByb3ZpZGVyLlByZWRpY2F0ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5wcm92aWRlci5TY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLnByb3ZpZGVyLlNlcXVlbmNlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIucHJvdmlkZXIuU29sdmVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIucHJvdmlkZXIuVHJpZ2dlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOworCisKKy8qKgorICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgQ29tbW9uIG1vZGVsIGVkaXRvci4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQ29tbW9uRWRpdG9yCisJZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0CisJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpblByb3ZpZGVyLCBJU2VsZWN0aW9uUHJvdmlkZXIsIElNZW51TGlzdGVuZXIsIElWaWV3ZXJQcm92aWRlciwgSUdvdG9NYXJrZXIgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGVkaXRpbmcgZG9tYWluIHRoYXQgaXMgdXNlZCB0byB0cmFjayBhbGwgY2hhbmdlcyB0byB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgb25lIGFkYXB0ZXIgZmFjdG9yeSB1c2VkIGZvciBwcm92aWRpbmcgdmlld3Mgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElDb250ZW50T3V0bGluZVBhZ2UgY29udGVudE91dGxpbmVQYWdlOworCisJLyoqCisJICogVGhpcyBpcyBhIGtsdWRnZS4uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlJ3Mgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmVlVmlld2VyIGNvbnRlbnRPdXRsaW5lVmlld2VyOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgcHJvcGVydHkgc2hlZXQgcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB2aWV3ZXIgdGhhdCBzaGFkb3dzIHRoZSBzZWxlY3Rpb24gaW4gdGhlIGNvbnRlbnQgb3V0bGluZS4KKwkgKiBUaGUgcGFyZW50IHJlbGF0aW9uIG11c3QgYmUgY29ycmVjdGx5IGRlZmluZWQgZm9yIHRoaXMgdG8gd29yay4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBzZWxlY3Rpb25WaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgY29udGVudCB2aWV3ZXIsIHdoaWNoIG1heSBiZSBlaXRoZXIgb25lIG9mIHRoZSB2aWV3ZXJzIGluIHRoZSBwYWdlcyBvciB0aGUgY29udGVudCBvdXRsaW5lIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVmlld2VyIGN1cnJlbnRWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgdG8gd2hpY2ggZXZlciB2aWV3ZXIgaXMgYWN0aXZlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfXMgdGhhdCBhcmUgbGlzdGVuaW5nIHRvIHRoaXMgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+KCk7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGVkaXRvciBhcyBhIHdob2xlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uIGVkaXRvclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7CisKKwkvKioKKwkgKiBUaGUgTWFya2VySGVscGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB3b3Jrc3BhY2UgcmVzb3VyY2UgbWFya2VycyBwcmVzZW50ZWQKKwkgKiBpbiBFY2xpcHNlJ3MgUHJvYmxlbXMgVmlldy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFya2VySGVscGVyIG1hcmtlckhlbHBlciA9IG5ldyBFZGl0VUlNYXJrZXJIZWxwZXIoKTsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyBmb3Igd2hlbiB0aGUgb3V0bGluZSBiZWNvbWVzIGFjdGl2ZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9CisJCW5ldyBJUGFydExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJaWYgKHAgaW5zdGFuY2VvZiBDb250ZW50T3V0bGluZSkgeworCQkJCQlpZiAoKChDb250ZW50T3V0bGluZSlwKS5nZXRDdXJyZW50UGFnZSgpID09IGNvbnRlbnRPdXRsaW5lUGFnZSkgeworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoQ29tbW9uRWRpdG9yLnRoaXMpOworCisJCQkJCQlzZXRDdXJyZW50Vmlld2VyKGNvbnRlbnRPdXRsaW5lVmlld2VyKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChwIGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgeworCQkJCQlpZiAoKChQcm9wZXJ0eVNoZWV0KXApLmdldEN1cnJlbnRQYWdlKCkgPT0gcHJvcGVydHlTaGVldFBhZ2UpIHsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKENvbW1vbkVkaXRvci50aGlzKTsKKwkJCQkJCWhhbmRsZUFjdGl2YXRlKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAocCA9PSBDb21tb25FZGl0b3IudGhpcykgeworCQkJCQloYW5kbGVBY3RpdmF0ZSgpOworCQkJCX0KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQl9OworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkIHNpbmNlIGxhc3QgYWN0aXZhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gc2F2ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHNhdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIE1hcCB0byBzdG9yZSB0aGUgZGlhZ25vc3RpYyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwPFJlc291cmNlLCBEaWFnbm9zdGljPiByZXNvdXJjZVRvRGlhZ25vc3RpY01hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFJlc291cmNlLCBEaWFnbm9zdGljPigpOworCisJLyoqCisJICogQ29udHJvbHMgd2hldGhlciB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHNob3VsZCBiZSB1cGRhdGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKworCS8qKgorCSAqIEFkYXB0ZXIgdXNlZCB0byB1cGRhdGUgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiB3aGVuIHJlc291cmNlcyBhcmUgZGVtYW5kZWQgbG9hZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBFQ29udGVudEFkYXB0ZXIgcHJvYmxlbUluZGljYXRpb25BZGFwdGVyID0gCisJCW5ldyBFQ29udGVudEFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisJCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZXNvdXJjZS5jbGFzcykpIHsKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRDoKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0VSUk9SUzoKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX1dBUk5JTkdTOiB7CisJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2Upbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7CisJCQkJCQkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIG51bGwpOworCQkJCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGRpYWdub3N0aWMpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucmVtb3ZlKHJlc291cmNlKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAodXBkYXRlUHJvYmxlbUluZGljYXRpb24pIHsKKwkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkJCQkJCQkgfQorCQkJCQkJCQkJIH0pOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCQkJCX0KKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7CisJCQkJYmFzaWNTZXRUYXJnZXQodGFyZ2V0KTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCB1bnNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsKKwkJCQliYXNpY1Vuc2V0VGFyZ2V0KHRhcmdldCk7CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdvcmtzcGFjZSBjaGFuZ2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0KKwkJbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOworCQkJCXRyeSB7CisJCQkJCWNsYXNzIFJlc291cmNlRGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKKwkJCQkJCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKwkJCQkJCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKKwkJCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIHx8CisJCQkJCQkJCSAgICBkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiBkZWx0YS5nZXRGbGFncygpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMpIHsKKwkJCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZGVsdGEuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKSwgZmFsc2UpOworCQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKKwkJCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKKwkJCQkJCQkJCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQllbHNlIGlmICghc2F2ZWRSZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlKSkgeworCQkJCQkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQl9CisKKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgeworCQkJCQkJCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOworCQkJCQkJfQorCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsKKwkJCQkJCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlczsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWZpbmFsIFJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsKKwkJCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOworCisJCQkJCWlmICghdmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCSByZW1vdmVkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKSk7CisJCQkJCQkJCQkgaWYgKCFpc0RpcnR5KCkpIHsKKwkJCQkJCQkJCQkgZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihDb21tb25FZGl0b3IudGhpcywgZmFsc2UpOworCQkJCQkJCQkJIH0KKwkJCQkJCQkJIH0KKwkJCQkJCQkgfSk7CisJCQkJCX0KKworCQkJCQlpZiAoIXZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOworCQkJCQkJCQkJIGlmIChnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpID09IENvbW1vbkVkaXRvci50aGlzKSB7CisJCQkJCQkJCQkJIGhhbmRsZUFjdGl2YXRlKCk7CisJCQkJCQkJCQkgfQorCQkJCQkJCQkgfQorCQkJCQkJCSB9KTsKKwkJCQkJfQorCQkJCX0KKwkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBIYW5kbGVzIGFjdGl2YXRpb24gb2YgdGhlIGVkaXRvciBvciBpdCdzIGFzc29jaWF0ZWQgdmlld3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoKSB7CisJCS8vIFJlY29tcHV0ZSB0aGUgcmVhZCBvbmx5IHN0YXRlLgorCQkvLworCQlpZiAoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKSAhPSBudWxsKSB7CisJCSAgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKS5jbGVhcigpOworCisJCSAgLy8gUmVmcmVzaCBhbnkgYWN0aW9ucyB0aGF0IG1heSBiZWNvbWUgZW5hYmxlZCBvciBkaXNhYmxlZC4KKwkJICAvLworCQkgIHNldFNlbGVjdGlvbihnZXRTZWxlY3Rpb24oKSk7CisJCX0KKworCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7CisJCQlpZiAoaGFuZGxlRGlydHlDb25mbGljdCgpKSB7CisJCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihDb21tb25FZGl0b3IudGhpcywgZmFsc2UpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVtb3ZlZFJlc291cmNlcy5jbGVhcigpOworCQkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgeworCQkJY2hhbmdlZFJlc291cmNlcy5yZW1vdmVBbGwoc2F2ZWRSZXNvdXJjZXMpOworCQkJaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpOworCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOworCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEhhbmRsZXMgd2hhdCB0byBkbyB3aXRoIGNoYW5nZWQgcmVzb3VyY2VzIG9uIGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpIHsKKwkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSAmJiAoIWlzRGlydHkoKSB8fCBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpKSB7CisJCQlpZiAoaXNEaXJ0eSgpKSB7CisJCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsKKwkJCX0KKwkJCWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZmx1c2goKTsKKworCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKwkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7CisJCQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKKwkJCQkJcmVzb3VyY2UudW5sb2FkKCk7CisJCQkJCXRyeSB7CisJCQkJCQlyZXNvdXJjZS5sb2FkKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJaWYgKCFyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5jb250YWluc0tleShyZXNvdXJjZSkpIHsKKwkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbi5pc1N0YWxlKGVkaXRvclNlbGVjdGlvbikpIHsKKwkJCQlzZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7CisJCQl9CisKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCX0KKwl9CisgIAorCS8qKgorCSAqIFVwZGF0ZXMgdGhlIHByb2JsZW1zIGluZGljYXRpb24gd2l0aCB0aGUgaW5mb3JtYXRpb24gZGVzY3JpYmVkIGluIHRoZSBzcGVjaWZpZWQgZGlhZ25vc3RpYy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpIHsKKwkJaWYgKHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKSB7CisJCQlCYXNpY0RpYWdub3N0aWMgZGlhZ25vc3RpYyA9CisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5PSywKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZWRpdG9yIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkgMCwKKwkJCQkJIG51bGwsCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpIH0pOworCQkJZm9yIChEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA6IHJlc291cmNlVG9EaWFnbm9zdGljTWFwLnZhbHVlcygpKSB7CisJCQkJaWYgKGNoaWxkRGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJZGlhZ25vc3RpYy5hZGQoY2hpbGREaWFnbm9zdGljKTsKKwkJCQl9CisJCQl9CisKKwkJCWludCBsYXN0RWRpdG9yUGFnZSA9IGdldFBhZ2VDb3VudCgpIC0gMTsKKwkJCWlmIChsYXN0RWRpdG9yUGFnZSA+PSAwICYmIGdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkgaW5zdGFuY2VvZiBQcm9ibGVtRWRpdG9yUGFydCkgeworCQkJCSgoUHJvYmxlbUVkaXRvclBhcnQpZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSkuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQlQcm9ibGVtRWRpdG9yUGFydCBwcm9ibGVtRWRpdG9yUGFydCA9IG5ldyBQcm9ibGVtRWRpdG9yUGFydCgpOworCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7CisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0TWFya2VySGVscGVyKG1hcmtlckhlbHBlcik7CisJCQkJdHJ5IHsKKwkJCQkJYWRkUGFnZSgrK2xhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydCwgZ2V0RWRpdG9ySW5wdXQoKSk7CisJCQkJCXNldFBhZ2VUZXh0KGxhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydC5nZXRQYXJ0TmFtZSgpKTsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJCXNob3dUYWJzKCk7CisJCQkJfQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChtYXJrZXJIZWxwZXIuaGFzTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpKSB7CisJCQkJbWFya2VySGVscGVyLmRlbGV0ZU1hcmtlcnMoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCW1hcmtlckhlbHBlci5jcmVhdGVNYXJrZXJzKGRpYWdub3N0aWMpOworCQkJCQl9CisJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFNob3dzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsKKwkJcmV0dXJuCisJCQlNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbgorCQkJCShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRmlsZUNvbmZsaWN0X2xhYmVsIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfV0FSTl9GaWxlQ29uZmxpY3QiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBtb2RlbCBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbW1vbkVkaXRvcigpIHsKKwkJc3VwZXIoKTsKKwkJaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdXAgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgbW9kZWwgZWRpdG9yLiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKSB7CisJCWluaXRpYWxpemVFZGl0aW5nRG9tYWluR2VuKCk7CisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpCisJCQkJLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgiKiIsCisJCQkJCQlTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbC5JTlNUQU5DRSk7CisKKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkKKwkJCQkuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKS5wdXQoInBsYXRmb3JtIiwKKwkJCQkJCVNURU1YTUlSZXNvdXJjZUZhY3RvcnlJbXBsLklOU1RBTkNFKTsKKwl9IC8vIGluaXRpYWxpemVFZGl0aW5nRG9tYWluCisJCisJLyoqCisJICogVGhpcyBzZXRzIHVwIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1vZGVsIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWRpdGluZ0RvbWFpbkdlbigpIHsKKwkJLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlpZWxkcyBpdGVtIHByb3ZpZGVycy4KKwkJLy8KKwkJYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOworCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBFeHBlcmltZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBHcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBQcmVkaWNhdGVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFRyaWdnZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKworCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUgZXhlY3V0ZWQuCisJCS8vCisJCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOworCisJCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCisJCS8vCisJCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcgorCQkJKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKKwkJCQkgcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgeworCQkJCQkgZ2V0Q29udGFpbmVyKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJIChuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJICBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCSAgZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworCisJCQkJCQkJCSAgLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KKwkJCQkJCQkJICAvLworCQkJCQkJCQkgIENvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaylldmVudC5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsKKwkJCQkJCQkJICBpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgeworCQkJCQkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihtb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7CisJCQkJCQkJCSAgfQorCQkJCQkJCQkgIGlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsICYmICFwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQkJCQkgIHByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsKKwkJCQkJCQkJICB9CisJCQkJCQkJICB9CisJCQkJCQkgIH0pOworCQkJCSB9CisJCQkgfSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgorCQkvLworCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgQm9vbGVhbj4oKSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBoZXJlIGZvciB0aGUgbGlzdGVuZXIgdG8gYmUgYWJsZSB0byBjYWxsIGl0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgYWN0aW9uKSB7CisJCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShhY3Rpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgc2V0cyB0aGUgc2VsZWN0aW9uIGludG8gd2hpY2hldmVyIHZpZXdlciBpcyBhY3RpdmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisJCWZpbmFsIENvbGxlY3Rpb248Pz4gdGhlU2VsZWN0aW9uID0gY29sbGVjdGlvbjsKKwkJLy8gTWFrZSBzdXJlIGl0J3Mgb2theS4KKwkJLy8KKwkJaWYgKHRoZVNlbGVjdGlvbiAhPSBudWxsICYmICF0aGVTZWxlY3Rpb24uaXNFbXB0eSgpKSB7CisJCQlSdW5uYWJsZSBydW5uYWJsZSA9CisJCQkJbmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBpdGVtcyBpbiB0aGUgY3VycmVudCBjb250ZW50IHZpZXdlciBvZiB0aGUgZWRpdG9yLgorCQkJCQkJLy8KKwkJCQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKKwkJCQkJCQljdXJyZW50Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0aGVTZWxlY3Rpb24udG9BcnJheSgpKSwgdHJ1ZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9OworCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGVkaXRpbmcgZG9tYWluIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSUVkaXRpbmdEb21haW5Qcm92aWRlcn0gaW50ZXJmYWNlLgorCSAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBpbXBsZW1lbnRpbmcgdGhlIHN0YXRpYyBtZXRob2RzIG9mIHtAbGluayBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW59CisJICogYW5kIGZvciBzdXBwb3J0aW5nIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKKwkJcmV0dXJuIGVkaXRpbmdEb21haW47CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGNsYXNzIFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsKKwkJcHVibGljIFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCQl9CisKKwkJcHVibGljIE9iamVjdCBbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7CisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7CisJCQlyZXR1cm4gKHBhcmVudCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhcmVudCkpLnRvQXJyYXkoKTsKKwkJfQorCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7CisJCQlyZXR1cm4gcGFyZW50ICE9IG51bGw7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG9uZSBjb250ZW50IHZpZXdlciwgZWl0aGVyIGZvciB0aGUgY3VycmVudCBwYWdlIG9yIHRoZSBvdXRsaW5lIHZpZXcsIGlmIGl0IGhhcyBmb2N1cywKKwkgKiBpcyB0aGUgY3VycmVudCBvbmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q3VycmVudFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7CisJCS8vIElmIGl0IGlzIGNoYW5naW5nLi4uCisJCS8vCisJCWlmIChjdXJyZW50Vmlld2VyICE9IHZpZXdlcikgeworCQkJaWYgKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7CisJCQkJLy8gQ3JlYXRlIHRoZSBsaXN0ZW5lciBvbiBkZW1hbmQuCisJCQkJLy8KKwkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPQorCQkJCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCQkJCS8vIFRoaXMganVzdCBub3RpZmllcyB0aG9zZSB0aGluZ3MgdGhhdCBhcmUgYWZmZWN0ZWQgYnkgdGhlIHNlY3Rpb24uCisJCQkJCQkvLworCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgc2VsZWN0aW9uQ2hhbmdlZEV2ZW50KSB7CisJCQkJCQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkNoYW5nZWRFdmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCQl9CisJCQkJCX07CisJCQl9CisKKwkJCS8vIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBvbGQgb25lLgorCQkJLy8KKwkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKKwkJCQljdXJyZW50Vmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOworCQkJfQorCisJCQkvLyBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG5ldyBvbmUuCisJCQkvLworCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7CisJCQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOworCQkJfQorCisJCQkvLyBSZW1lbWJlciBpdC4KKwkJCS8vCisJCQljdXJyZW50Vmlld2VyID0gdmlld2VyOworCisJCQkvLyBTZXQgdGhlIGVkaXRvcnMgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdlcidzIHNlbGVjdGlvbi4KKwkJCS8vCisJCQlzZXRTZWxlY3Rpb24oY3VycmVudFZpZXdlciA9PSBudWxsID8gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSA6IGN1cnJlbnRWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSB2aWV3ZXIgYXMgcmVxdWlyZWQgYnkgdGhlIHtAbGluayBJVmlld2VyUHJvdmlkZXJ9IGludGVyZmFjZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKKwkJcmV0dXJuIGN1cnJlbnRWaWV3ZXI7CisJfQorCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGEgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyIGFuZCBhZGRzIGEgbGlzdGVuZXIgYXMgd2VsbCByZWdpc3RlcmluZyB0aGUgbWVudSBmb3IgZXh0ZW5zaW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7CisJCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsgLy8kTk9OLU5MUy0xJAorCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKKwkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKHRoaXMpOworCQlNZW51IG1lbnU9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOworCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7CisJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGNvbnRleHRNZW51LCBuZXcgVW53cmFwcGluZ1NlbGVjdGlvblByb3ZpZGVyKHZpZXdlcikpOworCisJCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LOworCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07CisJCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKKwkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgY2FsbGVkIHRvIGxvYWQgYSByZXNvdXJjZSBpbnRvIHRoZSBlZGl0aW5nIGRvbWFpbidzIHJlc291cmNlIHNldCBiYXNlZCBvbiB0aGUgZWRpdG9yJ3MgaW5wdXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlTW9kZWwoKSB7CisJCVVSSSByZXNvdXJjZVVSSSA9IEVkaXRVSVV0aWwuZ2V0VVJJKGdldEVkaXRvcklucHV0KCkpOworCQlFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworCQl0cnkgeworCQkJLy8gTG9hZCB0aGUgcmVzb3VyY2UgdGhyb3VnaCB0aGUgZWRpdGluZyBkb21haW4uCisJCQkvLworCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIHRydWUpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZXhjZXB0aW9uID0gZTsKKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCBmYWxzZSk7CisJCX0KKworCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKTsKKwkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsICBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCX0KKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBkaWFnbm9zdGljIGRlc2NyaWJpbmcgdGhlIGVycm9ycyBhbmQgd2FybmluZ3MgbGlzdGVkIGluIHRoZSByZXNvdXJjZQorCSAqIGFuZCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiAoaWYgYW55KS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGlhZ25vc3RpYyBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhSZXNvdXJjZSByZXNvdXJjZSwgRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQlpZiAoIXJlc291cmNlLmdldEVycm9ycygpLmlzRW1wdHkoKSB8fCAhcmVzb3VyY2UuZ2V0V2FybmluZ3MoKS5pc0VtcHR5KCkpIHsKKwkJCUJhc2ljRGlhZ25vc3RpYyBiYXNpY0RpYWdub3N0aWMgPQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMKKwkJCQkJKERpYWdub3N0aWMuRVJST1IsCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmVkaXRvciIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJIDAsCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksIC8vJE5PTi1OTFMtMSQKKwkJCQkJIG5ldyBPYmplY3QgW10geyBleGNlcHRpb24gPT0gbnVsbCA/IChPYmplY3QpcmVzb3VyY2UgOiBleGNlcHRpb24gfSk7CisJCQliYXNpY0RpYWdub3N0aWMubWVyZ2UoRWNvcmVVdGlsLmNvbXB1dGVEaWFnbm9zdGljKHJlc291cmNlLCB0cnVlKSk7CisJCQlyZXR1cm4gYmFzaWNEaWFnbm9zdGljOworCQl9CisJCWVsc2UgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQlyZXR1cm4KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5lZGl0b3IiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCSBuZXcgT2JqZWN0W10geyBleGNlcHRpb24gfSk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gRGlhZ25vc3RpYy5PS19JTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gaW5zdGFsbCB5b3VyIG93biBjb250cm9scy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlcygpIHsKKwkJLy8gQ3JlYXRlcyB0aGUgbW9kZWwgZnJvbSB0aGUgZWRpdG9yIGlucHV0CisJCS8vCisJCWNyZWF0ZU1vZGVsKCk7CisKKwkJLy8gT25seSBjcmVhdGVzIHRoZSBvdGhlciBwYWdlcyBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhhdCBjYW4gYmUgZWRpdGVkCisJCS8vCisJCWlmICghZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgc2VsZWN0aW9uIHRyZWUgdmlldy4KKwkJCS8vCisJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShnZXRDb250YWluZXIoKSwgU1dULk1VTFRJKTsKKwkJCXNlbGVjdGlvblZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOworCQkJc2V0Q3VycmVudFZpZXdlcihzZWxlY3Rpb25WaWV3ZXIpOworCisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKworCQkJbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcihzZWxlY3Rpb25WaWV3ZXIuZ2V0VHJlZSgpLCBhZGFwdGVyRmFjdG9yeSk7CisKKwkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHNlbGVjdGlvblZpZXdlcik7CisJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh0cmVlKTsKKwkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCSBzZXRBY3RpdmVQYWdlKDApOworCQkJCQkgfQorCQkJCSB9KTsKKwkJfQorCisJCS8vIEVuc3VyZXMgdGhhdCB0aGlzIGVkaXRvciB3aWxsIG9ubHkgZGlzcGxheSB0aGUgcGFnZSdzIHRhYgorCQkvLyBhcmVhIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHBhZ2UKKwkJLy8KKwkJZ2V0Q29udGFpbmVyKCkuYWRkQ29udHJvbExpc3RlbmVyCisJCQkobmV3IENvbnRyb2xBZGFwdGVyKCkgeworCQkJCWJvb2xlYW4gZ3VhcmQgPSBmYWxzZTsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsKKwkJCQkJaWYgKCFndWFyZCkgeworCQkJCQkJZ3VhcmQgPSB0cnVlOworCQkJCQkJaGlkZVRhYnMoKTsKKwkJCQkJCWd1YXJkID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkgfSk7CisKKwkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkgfQorCQkJIH0pOworCX0KKworCS8qKgorCSAqIElmIHRoZXJlIGlzIGp1c3Qgb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsCisJICogdGhpcyBoaWRlcyB0aGUgc2luZ2xlIHRhYiBhdCB0aGUgYm90dG9tLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhpZGVUYWJzKCkgeworCQlpZiAoZ2V0UGFnZUNvdW50KCkgPD0gMSkgeworCQkJc2V0UGFnZVRleHQoMCwgIiIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7CisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoMSk7CisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7CisJCQkJZ2V0Q29udGFpbmVyKCkuc2V0U2l6ZShwb2ludC54LCBwb2ludC55ICsgNik7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsCisJICogdGhpcyBzaG93cyB0aGUgdGFicyBhdCB0aGUgYm90dG9tLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNob3dUYWJzKCkgeworCQlpZiAoZ2V0UGFnZUNvdW50KCkgPiAxKSB7CisJCQlzZXRQYWdlVGV4dCgwLCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7CisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoU1dULkRFRkFVTFQpOworCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOworCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSAtIDYpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIHRyYWNrIHRoZSBhY3RpdmUgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IHBhZ2VJbmRleCkgeworCQlzdXBlci5wYWdlQ2hhbmdlKHBhZ2VJbmRleCk7CisKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7CisJCQloYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihjb250ZW50T3V0bGluZVBhZ2UuZ2V0U2VsZWN0aW9uKCkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBob3cgdGhlIGZyYW1ld29yayBkZXRlcm1pbmVzIHdoaWNoIGludGVyZmFjZXMgd2UgaW1wbGVtZW50LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7CisJCWlmIChrZXkuZXF1YWxzKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gc2hvd091dGxpbmVWaWV3KCkgPyBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSA6IG51bGw7CisJCX0KKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gZ2V0UHJvcGVydHlTaGVldFBhZ2UoKTsKKwkJfQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IG91dGxpbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQ29udGVudE91dGxpbmVQYWdlIGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIHsKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSA9PSBudWxsKSB7CisJCQkvLyBUaGUgY29udGVudCBvdXRsaW5lIGlzIGp1c3QgYSB0cmVlLgorCQkJLy8KKwkJCWNsYXNzIE15Q29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgQ29udGVudE91dGxpbmVQYWdlIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCQkJCS8vIFNldCB1cCB0aGUgdHJlZSB2aWV3ZXIuCisJCQkJCS8vCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisKKwkJCQkJLy8gTWFrZSBzdXJlIG91ciBwb3B1cHMgd29yay4KKwkJCQkJLy8KKwkJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IoY29udGVudE91dGxpbmVWaWV3ZXIpOworCisJCQkJCWlmICghZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkgIC8vIFNlbGVjdCB0aGUgcm9vdCBvYmplY3QgaW4gdGhlIHZpZXcuCisJCQkJCSAgLy8KKwkJCQkJICBjb250ZW50T3V0bGluZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCQkJCQl9CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgbWFrZUNvbnRyaWJ1dGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlcikgeworCQkJCQlzdXBlci5tYWtlQ29udHJpYnV0aW9ucyhtZW51TWFuYWdlciwgdG9vbEJhck1hbmFnZXIsIHN0YXR1c0xpbmVNYW5hZ2VyKTsKKwkJCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsKKwkJCQl9CisJCQl9CisKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZSA9IG5ldyBNeUNvbnRlbnRPdXRsaW5lUGFnZSgpOworCisJCQkvLyBMaXN0ZW4gdG8gc2VsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBpdCBpcyBhIHNwZWNpYWwgd2F5LgorCQkJLy8KKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKKwkJCQkobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQkJCSAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBoYW5kbGUgc2VsZWN0aW9ucyBjb3JyZWN0bHkuCisJCQkJCSAvLworCQkJCQkgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQkJCSBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJcmV0dXJuIGNvbnRlbnRPdXRsaW5lUGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIHByb3BlcnR5IHNoZWV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7CisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZSA9CisJCQkJbmV3IEV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2UoZWRpdGluZ0RvbWFpbikgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoTGlzdDw/PiBzZWxlY3Rpb24pIHsKKwkJCQkJCUNvbW1vbkVkaXRvci50aGlzLnNldFNlbGVjdGlvblRvVmlld2VyKHNlbGVjdGlvbik7CisJCQkJCQlDb21tb25FZGl0b3IudGhpcy5zZXRGb2N1cygpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworCQkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOworCQkJCQl9CisJCQkJfTsKKwkJCXByb3BlcnR5U2hlZXRQYWdlLnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCX0KKworCQlyZXR1cm4gcHJvcGVydHlTaGVldFBhZ2U7CisJfQorCisJLyoqCisJICogVGhpcyBkZWFscyB3aXRoIGhvdyB3ZSB3YW50IHNlbGVjdGlvbiBpbiB0aGUgb3V0bGluZXIgdG8gYWZmZWN0IHRoZSBvdGhlciB2aWV3cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlpZiAoc2VsZWN0aW9uVmlld2VyICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCUl0ZXJhdG9yPD8+IHNlbGVjdGVkRWxlbWVudHMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuaXRlcmF0b3IoKTsKKwkJCWlmIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgeworCQkJCS8vIEdldCB0aGUgZmlyc3Qgc2VsZWN0ZWQgZWxlbWVudC4KKwkJCQkvLworCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzLm5leHQoKTsKKworCQkJCUFycmF5TGlzdDxPYmplY3Q+IHNlbGVjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKwkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnQpOworCQkJCXdoaWxlIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgeworCQkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnRzLm5leHQoKSk7CisJCQkJfQorCisJCQkJLy8gU2V0IHRoZSBzZWxlY3Rpb24gdG8gdGhlIHdpZGdldC4KKwkJCQkvLworCQkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uTGlzdCkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSB0ZXN0cyB0aGUgY29tbWFuZCBzdGFjay4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgeworCQlyZXR1cm4gKChCYXNpY0NvbW1hbmRTdGFjayllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5pc1NhdmVOZWVkZWQoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHNhdmVzIHRoZSBtb2RlbCBmaWxlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworCQkvLyBTYXZlIG9ubHkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBhY3R1YWxseSBjaGFuZ2VkLgorCQkvLworCQlmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7CisJCXNhdmVPcHRpb25zLnB1dChSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRUQsIFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRF9NRU1PUllfQlVGRkVSKTsKKworCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guCisJCS8vCisJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPQorCQkJbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKKwkJCQkvLyBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBnZXRzIGludm9rZWQgd2hlbiB0aGUgb3BlcmF0aW9uIHJ1bnMuCisJCQkJLy8KKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJCQkvLyBTYXZlIHRoZSByZXNvdXJjZXMgdG8gdGhlIGZpbGUgc3lzdGVtLgorCQkJCQkvLworCQkJCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwkJCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSkgeworCQkJCQkJaWYgKChmaXJzdCB8fCAhcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkgfHwgaXNQZXJzaXN0ZWQocmVzb3VyY2UpKSAmJiAhZWRpdGluZ0RvbWFpbi5pc1JlYWRPbmx5KHJlc291cmNlKSkgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCWxvbmcgdGltZVN0YW1wID0gcmVzb3VyY2UuZ2V0VGltZVN0YW1wKCk7CisJCQkJCQkJCXJlc291cmNlLnNhdmUoc2F2ZU9wdGlvbnMpOworCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VGltZVN0YW1wKCkgIT0gdGltZVN0YW1wKSB7CisJCQkJCQkJCQlzYXZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQkJCQkJCX0KKwkJCQkJCQlmaXJzdCA9IGZhbHNlOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfTsKKworCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOworCQl0cnkgeworCQkJLy8gVGhpcyBydW5zIHRoZSBvcHRpb25zLCBhbmQgc2hvd3MgcHJvZ3Jlc3MuCisJCQkvLworCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSkucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOworCisJCQkvLyBSZWZyZXNoIHRoZSBuZWNlc3Nhcnkgc3RhdGUuCisJCQkvLworCQkJKChCYXNpY0NvbW1hbmRTdGFjayllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5zYXZlSXNEb25lKCk7CisJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCS8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHRoYXQgc2hvdWxkbid0LgorCQkJLy8KKwkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOworCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB3aGV0aGVyIHNvbWV0aGluZyBoYXMgYmVlbiBwZXJzaXN0ZWQgdG8gdGhlIFVSSSBvZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBVUkkgY29udmVydGVyIGZyb20gdGhlIGVkaXRvcidzIHJlc291cmNlIHNldCB0byB0cnkgdG8gb3BlbiBhbiBpbnB1dCBzdHJlYW0uIAorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzUGVyc2lzdGVkKFJlc291cmNlIHJlc291cmNlKSB7CisJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisJCXRyeSB7CisJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0ocmVzb3VyY2UuZ2V0VVJJKCkpOworCQkJaWYgKHN0cmVhbSAhPSBudWxsKSB7CisJCQkJcmVzdWx0ID0gdHJ1ZTsKKwkJCQlzdHJlYW0uY2xvc2UoKTsKKwkJCX0KKwkJfQorCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gSWdub3JlCisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIHRydWUgYmVjYXVzZSBpdCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFRoaXMgYWxzbyBjaGFuZ2VzIHRoZSBlZGl0b3IncyBpbnB1dC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKKwkJU2F2ZUFzRGlhbG9nIHNhdmVBc0RpYWxvZyA9IG5ldyBTYXZlQXNEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOworCQlzYXZlQXNEaWFsb2cub3BlbigpOworCQlJUGF0aCBwYXRoID0gc2F2ZUFzRGlhbG9nLmdldFJlc3VsdCgpOworCQlpZiAocGF0aCAhPSBudWxsKSB7CisJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOworCQkJaWYgKGZpbGUgIT0gbnVsbCkgeworCQkJCWRvU2F2ZUFzKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKSwgbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVBcyhVUkkgdXJpLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKKwkJKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLnNldFVSSSh1cmkpOworCQlzZXRJbnB1dFdpdGhOb3RpZnkoZWRpdG9ySW5wdXQpOworCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOworCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9CisJCQlnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSAhPSBudWxsID8KKwkJCQlnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5nZXRQcm9ncmVzc01vbml0b3IoKSA6CisJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKKwkJZG9TYXZlKHByb2dyZXNzTW9uaXRvcik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgeworCQl0cnkgeworCQkJaWYgKG1hcmtlci5nZXRUeXBlKCkuZXF1YWxzKEVWYWxpZGF0b3IuTUFSS0VSKSkgeworCQkJCVN0cmluZyB1cmlBdHRyaWJ1dGUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKEVWYWxpZGF0b3IuVVJJX0FUVFJJQlVURSwgbnVsbCk7CisJCQkJaWYgKHVyaUF0dHJpYnV0ZSAhPSBudWxsKSB7CisJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaUF0dHJpYnV0ZSk7CisJCQkJCUVPYmplY3QgZU9iamVjdCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7CisJCQkJCWlmIChlT2JqZWN0ICE9IG51bGwpIHsKKwkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9ucy5zaW5nbGV0b24oZWRpdGluZ0RvbWFpbi5nZXRXcmFwcGVyKGVPYmplY3QpKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQlDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHN0YXJ0dXAuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKKwkJc2V0U2l0ZShzaXRlKTsKKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKKwkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsKKwkJc2l0ZS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7CisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJZ2V0Q29udHJvbChnZXRBY3RpdmVQYWdlKCkpLnNldEZvY3VzKCk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byByZXR1cm4gdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7CisJCXJldHVybiBlZGl0b3JTZWxlY3Rpb247CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gc2V0IHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCisJICogQ2FsbGluZyB0aGlzIHJlc3VsdCB3aWxsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQllZGl0b3JTZWxlY3Rpb24gPSBzZWxlY3Rpb247CisKKwkJZm9yIChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyIDogc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycykgeworCQkJbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOworCQl9CisJCXNldFN0YXR1c0xpbmVNYW5hZ2VyKHNlbGVjdGlvbik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZU1hbmFnZXIoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyID0gY3VycmVudFZpZXdlciAhPSBudWxsICYmIGN1cnJlbnRWaWV3ZXIgPT0gY29udGVudE91dGxpbmVWaWV3ZXIgPworCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA6IGdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOworCisJCWlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKSB7CisJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCQlDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikudG9MaXN0KCk7CisJCQkJc3dpdGNoIChjb2xsZWN0aW9uLnNpemUoKSkgeworCQkJCQljYXNlIDA6IHsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTm9PYmplY3RTZWxlY3RlZCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAxOiB7CisJCQkJCQlTdHJpbmcgdGV4dCA9IG5ldyBBZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3IoYWRhcHRlckZhY3RvcnkpLmdldFRleHQoY29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkIiwgdGV4dCkpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlkZWZhdWx0OiB7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQiLCBJbnRlZ2VyLnRvU3RyaW5nKGNvbGxlY3Rpb24uc2l6ZSgpKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoIiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHRoZSBwbHVnaW4ncyBwbHVnaW4ucHJvcGVydGllcyBmaWxlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQlyZXR1cm4gQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHBsdWdpbi5wcm9wZXJ0aWVzLCBtYWtpbmcgYSBzdWJzdGl0dXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEpIHsKKwkJcmV0dXJuIENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSwgbmV3IE9iamVjdCBbXSB7IHMxIH0pOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXJ9IHRvIGhlbHAgZmlsbCB0aGUgY29udGV4dCBtZW51cyB3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgRWRpdCBtZW51LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJKChJTWVudUxpc3RlbmVyKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpKS5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7CisJCXJldHVybiAoRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgeworCQlyZXR1cm4gZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3Rpb25CYXJzKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKKworCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworCisJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKKworCQlpZiAoZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSB0aGlzKSB7CisJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihudWxsKTsKKwkJfQorCisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBvdXRsaW5lIHZpZXcgc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93T3V0bGluZVZpZXcoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvY29tbW9uL3ByZXNlbnRhdGlvbi9Db3JlRWRpdG9yQWR2aXNvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9wcmVzZW50YXRpb24vQ29yZUVkaXRvckFkdmlzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDY5Y2MzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9wcmVzZW50YXRpb24vQ29yZUVkaXRvckFkdmlzb3IuamF2YQpAQCAtMCwwICsxLDg0MyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLmFjdGlvbi5Xb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Mb2FkUmVzb3VyY2VBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkdyb3VwTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnBlcnNwZWN0aXZlcy5TaW11bGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuU1RFTVByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZvbGRlckxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Db250cmlidXRpb25JdGVtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3RvcnkuSVdvcmtiZW5jaEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5BY3Rpb25CYXJBZHZpc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklBY3Rpb25CYXJDb25maWd1cmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklXb3JrYmVuY2hDb25maWd1cmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoV2luZG93QWR2aXNvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5tb2RlbC5Xb3JrYmVuY2hBZGFwdGVyQnVpbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOworCisKKy8qKgorICogQ3VzdG9taXplZCB7QGxpbmsgV29ya2JlbmNoQWR2aXNvcn0gZm9yIHRoZSBSQ1AgYXBwbGljYXRpb24uCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGZpbmFsIGNsYXNzIENvcmVFZGl0b3JBZHZpc29yIGV4dGVuZHMgV29ya2JlbmNoQWR2aXNvciB7CisJLyoqCisJICogVGhpcyBsb29rcyB1cCBhIHN0cmluZyBpbiB0aGUgcGx1Z2luJ3MgcGx1Z2luLnByb3BlcnRpZXMgZmlsZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJcmV0dXJuIENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSk7CisJfQorCisJLyoqCisJICogVGhpcyBsb29rcyB1cCBhIHN0cmluZyBpbiBwbHVnaW4ucHJvcGVydGllcywgbWFraW5nIGEgc3Vic3RpdHV0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByZXNlbnRhdGlvbi5Db3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXksIG5ldyBPYmplY3QgW10geyBzMSB9KTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjaW5pdGlhbGl6ZShvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoQ29uZmlndXJlcikKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJV29ya2JlbmNoQ29uZmlndXJlciBjb25maWd1cmVyKSB7CisJCXN1cGVyLmluaXRpYWxpemUoY29uZmlndXJlcik7CisJCWNvbmZpZ3VyZXIuc2V0U2F2ZUFuZFJlc3RvcmUodHJ1ZSk7CisJCWRlY2xhcmVXb3JrYmVuY2hJbWFnZXMoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjZ2V0RGVmYXVsdFBhZ2VJbnB1dCgpCisJICogCVNlZSA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1MjMzIj5idWcKKwkgKiAJMTQ1MjMzPC9hPgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJQWRhcHRhYmxlIGdldERlZmF1bHRQYWdlSW5wdXQoKSB7CisJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOworCQlyZXR1cm4gcm9vdDsKKwl9CisKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjcHJlU3RhcnR1cCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcHJlU3RhcnR1cCgpIHsKKwkJV29ya2JlbmNoQWRhcHRlckJ1aWxkZXIucmVnaXN0ZXJBZGFwdGVycygpOworCX0KKworCisvLwkvKioKKy8vCSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBlbmFibGUgdXNpbmcgdGhlIENvbW1vbiBOYXZpZ2F0b3IgRnJhbWV3b3JrIGluIGFuCisvLwkgKiBSQ1AgYXBwbGljYXRpb24uIFNlZSA8YQorLy8JICogaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTIzMyI+YnVnCisvLwkgKiAxNDUyMzM8L2E+CisvLwkgKi8KKy8vCXB1YmxpYyBzdGF0aWMgY2xhc3MgTmF2aWdhdG9yUm9vdCBpbXBsZW1lbnRzIElBZGFwdGFibGUsCisvLwkJCUlQZXJzaXN0YWJsZUVsZW1lbnQsIElFbGVtZW50RmFjdG9yeSB7CisvLwkKKy8vCQkvKioKKy8vCQkgKiBDb25zdHJ1Y3RvcgorLy8JCSAqLworLy8JCXB1YmxpYyBOYXZpZ2F0b3JSb290KCkgeworLy8JCX0KKy8vCisvLwkJLyoqCisvLwkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKKy8vCQkgKi8KKy8vCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgeworLy8JCQlPYmplY3QgcmV0VmFsdWUgPSBudWxsOworLy8JCQlpZiAoYWRhcHRlciA9PSBJUGVyc2lzdGFibGVFbGVtZW50LmNsYXNzKSB7CisvLwkJCQkvLyBZZXMKKy8vCQkJCXJldFZhbHVlID0gdGhpczsKKy8vCQkJfSAvLyBpZiAKKy8vCQkJZWxzZSBpZiAoYWRhcHRlciA9PSBJV29ya2JlbmNoQWRhcHRlci5jbGFzcykgeworLy8JCQkJcmV0VmFsdWUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEFkYXB0ZXIoYWRhcHRlcik7CisvLwkJCX0gLy8gaWYgCisvLwkJCXJldHVybiByZXRWYWx1ZTsKKy8vCQl9IC8vIGdldEFkYXB0ZXIKKy8vCQorLy8JCS8qKgorLy8JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudCNnZXRGYWN0b3J5SWQoKQorLy8JCSAqLworLy8JCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkKCkgeworLy8JCQlyZXR1cm4gIm9yZy5lY2xpcHNlLnN0ZW0udWkuY29tbW9uTmF2aWdhdG9yRmFjdG9yeSI7CisvLy8vCQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7CisvLwkJfQorLy8JCisvLwkJLyoqCisvLwkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGUjc2F2ZVN0YXRlKG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQorLy8JCSAqLworLy8JCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7CisvLwkJCS8vIEkgdGhpbmsgd2hhdCBpcyBoYXBwZW5pbmcgaGVyZSBpcyB0aGF0IHdlIGRvbid0IGFjdHVhbGx5IHNhdmUgdGhlCisvLwkJCS8vIHN0YXRlIHRoYXQgdGhlICJjcmVhdGVFbGVtZW50IiBtZXRob2QgKGJlbG93KSB3b3VsZCByZWFkLCBpbnN0ZWFkCisvLwkJCS8vIGluIGNyZWF0ZUVsZW1lbnQgd2UganVzdCByZXR1cm4gdGhlIHJvb3Qgb2YgdGhlIHdvcmtzcGFjZSB3aGljaAorLy8JCQkvLyBpcyB3aGF0IHdlIHdhbnQgYW55d2F5LgorLy8JCQlyZXR1cm47CisvLwkJfQorLy8JCisvLwkJLyoqCisvLwkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWxlbWVudEZhY3RvcnkjY3JlYXRlRWxlbWVudChvcmcuZWNsaXBzZS51aS5JTWVtZW50bykKKy8vCQkgKi8KKy8vCQlwdWJsaWMgSUFkYXB0YWJsZSBjcmVhdGVFbGVtZW50KElNZW1lbnRvIG1lbWVudG8pIHsKKy8vCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisvLwkJfQorLy8JCisvLwl9IC8vIE5hdmlnYXRvclJvb3QKKworCQorCS8qKgorCSAqIERlY2xhcmVzIGFsbCBJREUtc3BlY2lmaWMgd29ya2JlbmNoIGltYWdlcy4gVGhpcyBpbmNsdWRlcyBib3RoICJzaGFyZWQiCisJICogaW1hZ2VzIChuYW1lZCBpbiB7QGxpbmsgSURFLlNoYXJlZEltYWdlc30pIGFuZCBpbnRlcm5hbCBpbWFnZXMgKG5hbWVkIGluCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlc30pLgorCSAqIAorCSAqIEBzZWUgSVdvcmtiZW5jaENvbmZpZ3VyZXIjZGVjbGFyZUltYWdlCisJICovCisJcHJpdmF0ZSB2b2lkIGRlY2xhcmVXb3JrYmVuY2hJbWFnZXMoKSB7CisKKwkJZmluYWwgU3RyaW5nIElDT05TX1BBVEggPSAiJG5sJC9pY29ucy9mdWxsLyI7Ly8kTk9OLU5MUy0xJAorCQlmaW5hbCBTdHJpbmcgUEFUSF9FTE9DQUxUT09MID0gSUNPTlNfUEFUSCArICJlbGNsMTYvIjsgLy8gRW5hYmxlZCAvLyROT04tTkxTLTEkCisKKwkJLy8gdG9vbGJhcgorCQkvLyBpY29ucy4KKwkJZmluYWwgU3RyaW5nIFBBVEhfRExPQ0FMVE9PTCA9IElDT05TX1BBVEggKyAiZGxjbDE2LyI7IC8vIERpc2FibGVkIC8vJE5PTi1OTFMtMSQKKwkJLy8gLy8kTk9OLU5MUy0xJAorCQkvLyB0b29sYmFyCisJCS8vIGljb25zLgorCQlmaW5hbCBTdHJpbmcgUEFUSF9FVE9PTCA9IElDT05TX1BBVEggKyAiZXRvb2wxNi8iOyAvLyBFbmFibGVkIHRvb2xiYXIgLy8kTk9OLU5MUy0xJAorCQkvLyAvLyROT04tTkxTLTEkCisJCS8vIGljb25zLgorCQlmaW5hbCBTdHJpbmcgUEFUSF9EVE9PTCA9IElDT05TX1BBVEggKyAiZHRvb2wxNi8iOyAvLyBEaXNhYmxlZCB0b29sYmFyIC8vJE5PTi1OTFMtMSQKKwkJLy8gLy8kTk9OLU5MUy0xJAorCQkvLyBpY29ucy4KKwkJZmluYWwgU3RyaW5nIFBBVEhfT0JKRUNUID0gSUNPTlNfUEFUSCArICJvYmoxNi8iOyAvLyBNb2RlbCBvYmplY3QgLy8kTk9OLU5MUy0xJAorCQkvLyAvLyROT04tTkxTLTEkCisJCS8vIGljb25zCisJCWZpbmFsIFN0cmluZyBQQVRIX1dJWkJBTiA9IElDT05TX1BBVEggKyAid2l6YmFuLyI7IC8vIFdpemFyZCAvLyROT04tTkxTLTEkCisJCS8vIC8vJE5PTi1OTFMtMSQKKwkJLy8gaWNvbnMKKworCQlCdW5kbGUgaWRlQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKElERVdvcmtiZW5jaFBsdWdpbi5JREVfV09SS0JFTkNIKTsKKworCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAorCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19FVE9PTF9CVUlMRF9FWEVDLCBQQVRIX0VUT09MCisJCQkJCQkrICJidWlsZF9leGVjLmdpZiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAorCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAorCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19FVE9PTF9CVUlMRF9FWEVDX0hPVkVSLAorCQkJCVBBVEhfRVRPT0wgKyAiYnVpbGRfZXhlYy5naWYiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKwkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKKwkJCQlJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfRVRPT0xfQlVJTERfRVhFQ19ESVNBQkxFRCwKKwkJCQlQQVRIX0RUT09MICsgImJ1aWxkX2V4ZWMuZ2lmIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCisKKwkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKKwkJCQlJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfRVRPT0xfU0VBUkNIX1NSQywgUEFUSF9FVE9PTAorCQkJCQkJKyAic2VhcmNoX3NyYy5naWYiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKwkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKKwkJCQlJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfRVRPT0xfU0VBUkNIX1NSQ19IT1ZFUiwKKwkJCQlQQVRIX0VUT09MICsgInNlYXJjaF9zcmMuZ2lmIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCisJCWRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCisJCQkJSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX0VUT09MX1NFQVJDSF9TUkNfRElTQUJMRUQsCisJCQkJUEFUSF9EVE9PTCArICJzZWFyY2hfc3JjLmdpZiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAorCisJCWRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCisJCQkJSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX0VUT09MX05FWFRfTkFWLCBQQVRIX0VUT09MCisJCQkJCQkrICJuZXh0X25hdi5naWYiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKworCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAorCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19FVE9PTF9QUkVWSU9VU19OQVYsIFBBVEhfRVRPT0wKKwkJCQkJCSsgInByZXZfbmF2LmdpZiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAorCisJCWRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCisJCQkJSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX1dJWkJBTl9ORVdQUkpfV0laLCBQQVRIX1dJWkJBTgorCQkJCQkJKyAibmV3cHJqX3dpei5wbmciLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKwkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKKwkJCQlJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfV0laQkFOX05FV0ZPTERFUl9XSVosCisJCQkJUEFUSF9XSVpCQU4gKyAibmV3Zm9sZGVyX3dpei5wbmciLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKwkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKKwkJCQlJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfV0laQkFOX05FV0ZJTEVfV0laLCBQQVRIX1dJWkJBTgorCQkJCQkJKyAibmV3ZmlsZV93aXoucG5nIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCisKKwkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKKwkJCQlJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfV0laQkFOX0lNUE9SVERJUl9XSVosCisJCQkJUEFUSF9XSVpCQU4gKyAiaW1wb3J0ZGlyX3dpei5wbmciLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKwkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKKwkJCQlJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfV0laQkFOX0lNUE9SVFpJUF9XSVosCisJCQkJUEFUSF9XSVpCQU4gKyAiaW1wb3J0emlwX3dpei5wbmciLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKworCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAorCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19XSVpCQU5fRVhQT1JURElSX1dJWiwKKwkJCQlQQVRIX1dJWkJBTiArICJleHBvcnRkaXJfd2l6LnBuZyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAorCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAorCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19XSVpCQU5fRVhQT1JUWklQX1dJWiwKKwkJCQlQQVRIX1dJWkJBTiArICJleHBvcnR6aXBfd2l6LnBuZyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAorCisJCWRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCisJCQkJSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX1dJWkJBTl9SRVNPVVJDRVdPUktJTkdTRVRfV0laLAorCQkJCVBBVEhfV0laQkFOICsgIndvcmtzZXRfd2l6LnBuZyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAorCisJCWRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCisJCQkJSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX0RMR0JBTl9TQVZFQVNfRExHLCBQQVRIX1dJWkJBTgorCQkJCQkJKyAic2F2ZWFzX3dpei5wbmciLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKworCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAorCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19ETEdCQU5fUVVJQ0tGSVhfRExHLCBQQVRIX1dJWkJBTgorCQkJCQkJKyAicXVpY2tfZml4LnBuZyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAorCisJCWRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsIElERS5TaGFyZWRJbWFnZXMuSU1HX09CSl9QUk9KRUNULAorCQkJCVBBVEhfT0JKRUNUICsgInByal9vYmouZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKKwkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKKwkJCQlJREUuU2hhcmVkSW1hZ2VzLklNR19PQkpfUFJPSkVDVF9DTE9TRUQsIFBBVEhfT0JKRUNUCisJCQkJCQkrICJjcHJqX29iai5naWYiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAorCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLCBJREUuU2hhcmVkSW1hZ2VzLklNR19PUEVOX01BUktFUiwKKwkJCQlQQVRIX0VMT0NBTFRPT0wgKyAiZ290b29ial90c2suZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKKworCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAorCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19FTENMX1FVSUNLX0ZJWF9FTkFCTEVELAorCQkJCVBBVEhfRUxPQ0FMVE9PTCArICJzbWFydG1vZGVfY28uZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKKworCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAorCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19ETENMX1FVSUNLX0ZJWF9ESVNBQkxFRCwKKwkJCQlQQVRIX0RMT0NBTFRPT0wgKyAic21hcnRtb2RlX2NvLmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gdGFzayBvYmplY3RzCisJCS8vIGRlY2xhcmVSZWdpc3RyeUltYWdlKElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19PQkpTX0hQUklPX1RTSywKKwkJLy8gUEFUSF9PQkpFQ1QrImhwcmlvX3Rzay5naWYiKTsKKwkJLy8gZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX09CSlNfTVBSSU9fVFNLLAorCQkvLyBQQVRIX09CSkVDVCsibXByaW9fdHNrLmdpZiIpOworCQkvLyBkZWNsYXJlUmVnaXN0cnlJbWFnZShJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfT0JKU19MUFJJT19UU0ssCisJCS8vIFBBVEhfT0JKRUNUKyJscHJpb190c2suZ2lmIik7CisKKwkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwgSURFLlNoYXJlZEltYWdlcy5JTUdfT0JKU19UQVNLX1RTSywKKwkJCQlQQVRIX09CSkVDVCArICJ0YXNrbXJrX3Rzay5naWYiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAorCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLCBJREUuU2hhcmVkSW1hZ2VzLklNR19PQkpTX0JLTVJLX1RTSywKKwkJCQlQQVRIX09CSkVDVCArICJia21ya190c2suZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKKworCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAorCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19PQkpTX0NPTVBMRVRFX1RTSywgUEFUSF9PQkpFQ1QKKwkJCQkJCSsgImNvbXBsZXRlX3Rzay5naWYiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAorCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAorCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19PQkpTX0lOQ09NUExFVEVfVFNLLCBQQVRIX09CSkVDVAorCQkJCQkJKyAiaW5jb21wbGV0ZV90c2suZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKKwkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKKwkJCQlJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfT0JKU19XRUxDT01FX0lURU0sIFBBVEhfT0JKRUNUCisJCQkJCQkrICJ3ZWxjb21lX2l0ZW0uZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKKwkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKKwkJCQlJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfT0JKU19XRUxDT01FX0JBTk5FUiwgUEFUSF9PQkpFQ1QKKwkJCQkJCSsgIndlbGNvbWVfYmFubmVyLmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkCisJCWRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCisJCQkJSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX09CSlNfRVJST1JfUEFUSCwgUEFUSF9PQkpFQ1QKKwkJCQkJCSsgImVycm9yX3Rzay5naWYiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAorCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAorCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19PQkpTX1dBUk5JTkdfUEFUSCwgUEFUSF9PQkpFQ1QKKwkJCQkJCSsgIndhcm5fdHNrLmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkCisJCWRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCisJCQkJSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX09CSlNfSU5GT19QQVRILCBQQVRIX09CSkVDVAorCQkJCQkJKyAiaW5mb190c2suZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKKworCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAorCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19MQ0xfRkxBVF9MQVlPVVQsIFBBVEhfRUxPQ0FMVE9PTAorCQkJCQkJKyAiZmxhdExheW91dC5naWYiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAorCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAorCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19MQ0xfSElFUkFSQ0hJQ0FMX0xBWU9VVCwKKwkJCQlQQVRIX0VMT0NBTFRPT0wgKyAiaGllcmFyY2hpY2FsTGF5b3V0LmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkCisJCWRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCisJCQkJSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX0VUT09MX1BST0JMRU1fQ0FURUdPUlksCisJCQkJUEFUSF9FVE9PTCArICJwcm9ibGVtX2NhdGVnb3J5LmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkCisJCisJCS8vIHN5bmNocm9uaXphdGlvbiBpbmRpY2F0b3Igb2JqZWN0cworCQkvLyBkZWNsYXJlUmVnaXN0cnlJbWFnZShJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfT0JKU19XQkVUX1NUQVQsCisJCS8vIFBBVEhfT1ZFUkxBWSsid2JldF9zdGF0LmdpZiIpOworCQkvLyBkZWNsYXJlUmVnaXN0cnlJbWFnZShJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfT0JKU19TQkVUX1NUQVQsCisJCS8vIFBBVEhfT1ZFUkxBWSsic2JldF9zdGF0LmdpZiIpOworCQkvLyBkZWNsYXJlUmVnaXN0cnlJbWFnZShJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfT0JKU19DT05GTElDVF9TVEFULAorCQkvLyBQQVRIX09WRVJMQVkrImNvbmZsaWN0X3N0YXQuZ2lmIik7CisKKwkJLy8gY29udGVudCBsb2NhbGl0eSBpbmRpY2F0b3Igb2JqZWN0cworCQkvLyBkZWNsYXJlUmVnaXN0cnlJbWFnZShJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfT0JKU19OT1RMT0NBTF9TVEFULAorCQkvLyBQQVRIX1NUQVQrIm5vdGxvY2FsX3N0YXQuZ2lmIik7CisJCS8vIGRlY2xhcmVSZWdpc3RyeUltYWdlKElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19PQkpTX0xPQ0FMX1NUQVQsCisJCS8vIFBBVEhfU1RBVCsibG9jYWxfc3RhdC5naWYiKTsKKwkJLy8gZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX09CSlNfRklMTExPQ0FMX1NUQVQsCisJCS8vIFBBVEhfU1RBVCsiZmlsbGxvY2FsX3N0YXQuZ2lmIik7CisJfQorCisJLyoqCisJICogRGVjbGFyZXMgYW4gSURFLXNwZWNpZmljIHdvcmtiZW5jaCBpbWFnZS4KKwkgKiAKKwkgKiBAcGFyYW0gc3ltYm9saWNOYW1lCisJICogICAgICAgICAgICB0aGUgc3ltYm9saWMgbmFtZSBvZiB0aGUgaW1hZ2UKKwkgKiBAcGFyYW0gcGF0aAorCSAqICAgICAgICAgICAgdGhlIHBhdGggb2YgdGhlIGltYWdlIGZpbGU7IHRoaXMgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgYmFzZQorCSAqICAgICAgICAgICAgb2YgdGhlIElERSBwbHVnLWluCisJICogQHBhcmFtIHNoYXJlZAorCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHNoYXJlZCBpbWFnZSwgYW5kCisJICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhpcyBpcyBub3QgYSBzaGFyZWQgaW1hZ2UKKwkgKiBAc2VlIElXb3JrYmVuY2hDb25maWd1cmVyI2RlY2xhcmVJbWFnZQorCSAqLworCXByaXZhdGUgdm9pZCBkZWNsYXJlV29ya2JlbmNoSW1hZ2UoQnVuZGxlIGlkZUJ1bmRsZSwgU3RyaW5nIHN5bWJvbGljTmFtZSwKKwkJCVN0cmluZyBwYXRoLCBib29sZWFuIHNoYXJlZCkgeworCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IuZmluZChpZGVCdW5kbGUsIG5ldyBQYXRoKHBhdGgpLCBudWxsKTsKKwkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOworCQlnZXRXb3JrYmVuY2hDb25maWd1cmVyKCkuZGVjbGFyZUltYWdlKHN5bWJvbGljTmFtZSwgZGVzYywgc2hhcmVkKTsKKwl9CisJCisJCisJLyoqCisJICogUkNQJ3MgYXBwbGljYXRpb24KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEFwcGxpY2F0aW9uIGltcGxlbWVudHMgSUFwcGxpY2F0aW9uIHsKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uI3N0YXJ0KG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQpCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgT2JqZWN0IHN0YXJ0KElBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQlXb3JrYmVuY2hBZHZpc29yIHdvcmtiZW5jaEFkdmlzb3IgPSBuZXcgQ29yZUVkaXRvckFkdmlzb3IoKTsKKwkJCURpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuY3JlYXRlRGlzcGxheSgpOworCQkJdHJ5IHsKKwkJCQlpbnQgcmV0dXJuQ29kZSA9IFBsYXRmb3JtVUkuY3JlYXRlQW5kUnVuV29ya2JlbmNoKGRpc3BsYXksIHdvcmtiZW5jaEFkdmlzb3IpOworCQkJCWlmIChyZXR1cm5Db2RlID09IFBsYXRmb3JtVUkuUkVUVVJOX1JFU1RBUlQpIHsKKwkJCQkJcmV0dXJuIElBcHBsaWNhdGlvbi5FWElUX1JFU1RBUlQ7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlyZXR1cm4gSUFwcGxpY2F0aW9uLkVYSVRfT0s7CisJCQkJfQorCQkJfQorCQkJZmluYWxseSB7CisJCQkJZGlzcGxheS5kaXNwb3NlKCk7CisJCQl9CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb24jc3RvcCgpCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgdm9pZCBzdG9wKCkgeworCQkJLy8gRG8gbm90aGluZy4KKwkJfQorCX0KKworCS8qKgorCSAqIFJDUCdzIHBlcnNwZWN0aXZlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBOT1QgVVNFRAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNwZWN0aXZlIGltcGxlbWVudHMgSVBlcnNwZWN0aXZlRmFjdG9yeSB7CisJCS8qKgorCQkgKiBQZXJzcGVjdGl2ZSBJRAorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfUEVSU1BFQ1RJVkUgPSAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcmVzZW50YXRpb24uQ29yZUVkaXRvckFkdmlzb3JQZXJzcGVjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5I2NyZWF0ZUluaXRpYWxMYXlvdXQob3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQpCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgeworCQkJbGF5b3V0LnNldEVkaXRvckFyZWFWaXNpYmxlKHRydWUpOworCQkJbGF5b3V0LmFkZFBlcnNwZWN0aXZlU2hvcnRjdXQoSURfUEVSU1BFQ1RJVkUpOworCisJCQlJRm9sZGVyTGF5b3V0IHJpZ2h0ID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigicmlnaHQiLCBJUGFnZUxheW91dC5SSUdIVCwgKGZsb2F0KTAuNjYsIGxheW91dC5nZXRFZGl0b3JBcmVhKCkpOyAvLyROT04tTkxTLTEkCisJCQlyaWdodC5hZGRWaWV3KElQYWdlTGF5b3V0LklEX09VVExJTkUpOworCisJCQlJRm9sZGVyTGF5b3V0IGJvdHRvblJpZ2h0ID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigiYm90dG9uUmlnaHQiLCBJUGFnZUxheW91dC5CT1RUT00sIChmbG9hdCkwLjYwLCAicmlnaHQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlib3R0b25SaWdodC5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1BST1BfU0hFRVQpOworCQl9CisJfQorCQorCS8qKgorCSAqIFJDUCdzIHdpbmRvdyBhZHZpc29yCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBXaW5kb3dBZHZpc29yIGV4dGVuZHMgV29ya2JlbmNoV2luZG93QWR2aXNvciB7CisJCS8qKgorCQkgKiBAc2VlIFdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IjV29ya2JlbmNoV2luZG93QWR2aXNvcihvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoV2luZG93Q29uZmlndXJlcikKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBXaW5kb3dBZHZpc29yKElXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKKwkJCXN1cGVyKGNvbmZpZ3VyZXIpOworCQl9CisJCQorCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hXaW5kb3dBZHZpc29yI3ByZVdpbmRvd09wZW4oKQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZCBOT1QKKwkJICovCisJCXB1YmxpYyB2b2lkIHByZVdpbmRvd09wZW4oKSB7CisJCQlJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyID0gZ2V0V2luZG93Q29uZmlndXJlcigpOworCQkJY29uZmlndXJlci5zZXRJbml0aWFsU2l6ZShuZXcgUG9pbnQoMTAyNCwgNzY4KSk7CisJCQljb25maWd1cmVyLnNldFNob3dDb29sQmFyKHRydWUpOworCQkJY29uZmlndXJlci5zZXRTaG93U3RhdHVzTGluZSh0cnVlKTsKKwkJCWNvbmZpZ3VyZXIuc2V0U2hvd0Zhc3RWaWV3QmFycyh0cnVlKTsKKwkJCWNvbmZpZ3VyZXIuc2V0U2hvd1Byb2dyZXNzSW5kaWNhdG9yKHRydWUpOworCQkJY29uZmlndXJlci5zZXRTaG93UGVyc3BlY3RpdmVCYXIodHJ1ZSk7CisJCX0gLy8gcHJlV2luZG93T3BlbgorCQkKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoV2luZG93QWR2aXNvciNwcmVXaW5kb3dTaGVsbENsb3NlKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBwcmVXaW5kb3dTaGVsbENsb3NlKCkgeworCQkJdHJ5IHsKKwkJCQkvL3NhdmUgdGhlIGZ1bGwgd29ya3NwYWNlIGJlZm9yZSBxdWl0CisJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnNhdmUodHJ1ZSwgbnVsbCk7CisJCQl9IGNhdGNoIChmaW5hbCBDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkZhaWxlZCB0byBzYXZlIHdvcmtzcGFjZSBiZWZvcmUgcXVpdHRpbmciLCBlKTsKKwkJCX0KKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoV2luZG93QWR2aXNvciNjcmVhdGVBY3Rpb25CYXJBZHZpc29yKG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklBY3Rpb25CYXJDb25maWd1cmVyKQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBY3Rpb25CYXJBZHZpc29yIGNyZWF0ZUFjdGlvbkJhckFkdmlzb3IoSUFjdGlvbkJhckNvbmZpZ3VyZXIgY29uZmlndXJlcikgeworCQkJcmV0dXJuIG5ldyBXaW5kb3dBY3Rpb25CYXJBZHZpc29yKGNvbmZpZ3VyZXIpOworCQl9CisJfQorCisJLyoqCisJICogUkNQJ3MgYWN0aW9uIGJhciBhZHZpc29yCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBXaW5kb3dBY3Rpb25CYXJBZHZpc29yIGV4dGVuZHMgQWN0aW9uQmFyQWR2aXNvciB7CisJCS8qKgorCQkgKiBAc2VlIEFjdGlvbkJhckFkdmlzb3IjQWN0aW9uQmFyQWR2aXNvcihvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JQWN0aW9uQmFyQ29uZmlndXJlcikKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBXaW5kb3dBY3Rpb25CYXJBZHZpc29yKElBY3Rpb25CYXJDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKKwkJCXN1cGVyKGNvbmZpZ3VyZXIpOworCQl9CisJCQorCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5BY3Rpb25CYXJBZHZpc29yI2ZpbGxNZW51QmFyKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZmlsbE1lbnVCYXIoSU1lbnVNYW5hZ2VyIG1lbnVCYXIpIHsKKwkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gZ2V0QWN0aW9uQmFyQ29uZmlndXJlcigpLmdldFdpbmRvd0NvbmZpZ3VyZXIoKS5nZXRXaW5kb3coKTsKKwkJCW1lbnVCYXIuYWRkKGNyZWF0ZUZpbGVNZW51KHdpbmRvdykpOworCQkJbWVudUJhci5hZGQoY3JlYXRlRWRpdE1lbnUod2luZG93KSk7CisJCQltZW51QmFyLmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKwkJCW1lbnVCYXIuYWRkKGNyZWF0ZVdpbmRvd01lbnUod2luZG93KSk7CisJCQltZW51QmFyLmFkZChjcmVhdGVIZWxwTWVudSh3aW5kb3cpKTsJCQkJCQorCQl9CisJCQorCQkvKioKKwkJICogQ3JlYXRlcyB0aGUgJ0ZpbGUnIG1lbnUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkIE5PVAorCQkgKi8KKwkJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVGaWxlTWVudShJV29ya2JlbmNoV2luZG93IHdpbmRvdykgeworCQkJSU1lbnVNYW5hZ2VyIG1lbnUgPSBuZXcgTWVudU1hbmFnZXIoZ2V0U3RyaW5nKCJfVUlfTWVudV9GaWxlX2xhYmVsIiksIC8vJE5PTi1OTFMtMSQKKwkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9GSUxFKTsgICAgCisJCQltZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5GSUxFX1NUQVJUKSk7CisJCisJCQlJTWVudU1hbmFnZXIgbmV3TWVudSA9IG5ldyBNZW51TWFuYWdlcihnZXRTdHJpbmcoIl9VSV9NZW51X05ld19sYWJlbCIpLCAibmV3Iik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKKwkJCW5ld01lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOworCQorCQkJbWVudS5hZGQobmV3TWVudSk7CisJCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CisJCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQkJYWRkVG9NZW51QW5kUmVnaXN0ZXIobWVudSwgQWN0aW9uRmFjdG9yeS5DTE9TRS5jcmVhdGUod2luZG93KSk7CisJCQlhZGRUb01lbnVBbmRSZWdpc3RlcihtZW51LCBBY3Rpb25GYWN0b3J5LkNMT1NFX0FMTC5jcmVhdGUod2luZG93KSk7CisJCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQkJYWRkVG9NZW51QW5kUmVnaXN0ZXIobWVudSwgQWN0aW9uRmFjdG9yeS5TQVZFLmNyZWF0ZSh3aW5kb3cpKTsKKwkJCWFkZFRvTWVudUFuZFJlZ2lzdGVyKG1lbnUsIEFjdGlvbkZhY3RvcnkuU0FWRV9BUy5jcmVhdGUod2luZG93KSk7CisJCQlhZGRUb01lbnVBbmRSZWdpc3RlcihtZW51LCBBY3Rpb25GYWN0b3J5LlNBVkVfQUxMLmNyZWF0ZSh3aW5kb3cpKTsKKwkJCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CisJCQlhZGRUb01lbnVBbmRSZWdpc3RlcihtZW51LCBBY3Rpb25GYWN0b3J5LklNUE9SVC5jcmVhdGUod2luZG93KSk7CisJCQlhZGRUb01lbnVBbmRSZWdpc3RlcihtZW51LCBBY3Rpb25GYWN0b3J5LkVYUE9SVC5jcmVhdGUod2luZG93KSk7CisJCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQkJYWRkVG9NZW51QW5kUmVnaXN0ZXIobWVudSwgQWN0aW9uRmFjdG9yeS5RVUlULmNyZWF0ZSh3aW5kb3cpKTsKKwkJCW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkZJTEVfRU5EKSk7CisJCQlyZXR1cm4gbWVudTsKKwkJfQorCisJCS8qKgorCQkgKiBDcmVhdGVzIHRoZSAnRWRpdCcgbWVudS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlRWRpdE1lbnUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKKwkJCUlNZW51TWFuYWdlciBtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKGdldFN0cmluZygiX1VJX01lbnVfRWRpdF9sYWJlbCIpLCAvLyROT04tTkxTLTEkCisJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCk7CisJCQltZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5FRElUX1NUQVJUKSk7CisJCisJCQlhZGRUb01lbnVBbmRSZWdpc3RlcihtZW51LCBBY3Rpb25GYWN0b3J5LlVORE8uY3JlYXRlKHdpbmRvdykpOworCQkJYWRkVG9NZW51QW5kUmVnaXN0ZXIobWVudSwgQWN0aW9uRmFjdG9yeS5SRURPLmNyZWF0ZSh3aW5kb3cpKTsKKwkJCW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlVORE9fRVhUKSk7CisJCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQorCQkJYWRkVG9NZW51QW5kUmVnaXN0ZXIobWVudSwgQWN0aW9uRmFjdG9yeS5DVVQuY3JlYXRlKHdpbmRvdykpOworCQkJYWRkVG9NZW51QW5kUmVnaXN0ZXIobWVudSwgQWN0aW9uRmFjdG9yeS5DT1BZLmNyZWF0ZSh3aW5kb3cpKTsKKwkJCWFkZFRvTWVudUFuZFJlZ2lzdGVyKG1lbnUsIEFjdGlvbkZhY3RvcnkuUEFTVEUuY3JlYXRlKHdpbmRvdykpOworCQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ1VUX0VYVCkpOworCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKKwkKKwkJCWFkZFRvTWVudUFuZFJlZ2lzdGVyKG1lbnUsIEFjdGlvbkZhY3RvcnkuREVMRVRFLmNyZWF0ZSh3aW5kb3cpKTsKKwkJCWFkZFRvTWVudUFuZFJlZ2lzdGVyKG1lbnUsIEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5jcmVhdGUod2luZG93KSk7CisJCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQorCQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQUREX0VYVCkpOworCQorCQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuRURJVF9FTkQpKTsKKwkJCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKwkJCXJldHVybiBtZW51OworCQl9CisJCisJCS8qKgorCQkgKiBDcmVhdGVzIHRoZSAnV2luZG93JyBtZW51LgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZCBOT1QKKwkJICovCisJCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlV2luZG93TWVudShJV29ya2JlbmNoV2luZG93IHdpbmRvdykgeworCQkJSU1lbnVNYW5hZ2VyIG1lbnUgPSBuZXcgTWVudU1hbmFnZXIoZ2V0U3RyaW5nKCJfVUlfTWVudV9XaW5kb3dfbGFiZWwiKSwgLy8kTk9OLU5MUy0xJAorCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX1dJTkRPVyk7CisJCQlhZGRUb01lbnVBbmRSZWdpc3RlcihtZW51LCBBY3Rpb25GYWN0b3J5Lk9QRU5fUEVSU1BFQ1RJVkVfRElBTE9HLmNyZWF0ZSh3aW5kb3cpKTsKKwkJCWFkZFRvTWVudUFuZFJlZ2lzdGVyKG1lbnUsIEFjdGlvbkZhY3RvcnkuT1BFTl9ORVdfV0lORE9XLmNyZWF0ZSh3aW5kb3cpKTsKKwkJCisJCQltZW51LmFkZChDb250cmlidXRpb25JdGVtRmFjdG9yeS5PUEVOX1dJTkRPV1MuY3JlYXRlKHdpbmRvdykpOworCQkJbWVudS5hZGQoQ29udHJpYnV0aW9uSXRlbUZhY3RvcnkuVklFV1NfU0hPUlRMSVNULmNyZWF0ZSh3aW5kb3cpKTsKKwkJCWFkZFRvTWVudUFuZFJlZ2lzdGVyKG1lbnUsIEFjdGlvbkZhY3RvcnkuUFJFRkVSRU5DRVMuY3JlYXRlKHdpbmRvdykpOworCQkJCisJCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CisJCQkKKwkJCUlXb3JrYmVuY2hBY3Rpb24gcmVzZXRQZXJzcGVjdGl2ZSA9IEFjdGlvbkZhY3RvcnkuUkVTRVRfUEVSU1BFQ1RJVkUuY3JlYXRlKHdpbmRvdyk7CisJCQlhZGRUb01lbnVBbmRSZWdpc3RlcihtZW51LHJlc2V0UGVyc3BlY3RpdmUpOworCQkJCisJCQltZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKwkJCQorCQkJcmV0dXJuIG1lbnU7CisJCX0gLy8gY3JlYXRlV2luZG93TWVudQorCQorCQkvKioKKwkJICogQ3JlYXRlcyB0aGUgJ0hlbHAnIG1lbnUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkIE5PVAorCQkgKi8KKwkJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVIZWxwTWVudShJV29ya2JlbmNoV2luZG93IHdpbmRvdykgeworCQkJSU1lbnVNYW5hZ2VyIG1lbnUgPSBuZXcgTWVudU1hbmFnZXIoZ2V0U3RyaW5nKCJfVUlfTWVudV9IZWxwX2xhYmVsIiksIElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9IRUxQKTsgLy8kTk9OLU5MUy0xJAorCQkJLy8gV2VsY29tZSBvciBpbnRybyBwYWdlIHdvdWxkIGdvIGhlcmUKKwkJCS8vIEhlbHAgY29udGVudHMgd291bGQgZ28gaGVyZQorCQkJLy8gVGlwcyBhbmQgdHJpY2tzIHBhZ2Ugd291bGQgZ28gaGVyZQorCQkJSVdvcmtiZW5jaEFjdGlvbiBoZWxwSW50cm8gPSBBY3Rpb25GYWN0b3J5LklOVFJPLmNyZWF0ZSh3aW5kb3cpOworCQkJSVdvcmtiZW5jaEFjdGlvbiBhYm91dEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuQUJPVVQuY3JlYXRlKHdpbmRvdyk7CQkJCisJCQlJV29ya2JlbmNoQWN0aW9uIGNvbnRlbnRzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5IRUxQX0NPTlRFTlRTLmNyZWF0ZSh3aW5kb3cpOworCQkJCisJCQltZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5IRUxQX1NUQVJUKSk7CisJCQlhZGRUb01lbnVBbmRSZWdpc3RlcihtZW51LGhlbHBJbnRybyk7CisJCQlhZGRUb01lbnVBbmRSZWdpc3RlcihtZW51LGNvbnRlbnRzQWN0aW9uKTsKKwkJCWFkZFRvTWVudUFuZFJlZ2lzdGVyKG1lbnUsYWJvdXRBY3Rpb24pOworCQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuSEVMUF9FTkQpKTsKKwkJCW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOworCQkJcmV0dXJuIG1lbnU7CisJCX0KKwkJCisJCS8qKgorCQkgKiBBZGRzIHRoZSBzcGVjaWZpZWQgYWN0aW9uIHRvIHRoZSBnaXZlbiBtZW51IGFuZCBhbHNvIHJlZ2lzdGVycyB0aGUgYWN0aW9uIHdpdGggdGhlCisJCSAqIGFjdGlvbiBiYXIgY29uZmlndXJlciwgaW4gb3JkZXIgdG8gYWN0aXZhdGUgaXRzIGtleSBiaW5kaW5nLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51QW5kUmVnaXN0ZXIoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJQWN0aW9uIGFjdGlvbikgeworCQkJbWVudU1hbmFnZXIuYWRkKGFjdGlvbik7CisJCQlnZXRBY3Rpb25CYXJDb25maWd1cmVyKCkucmVnaXN0ZXJHbG9iYWxBY3Rpb24oYWN0aW9uKTsKKwkJfQkJCisJfQorCisJLyoqCisJICogQWJvdXQgYWN0aW9uIGZvciB0aGUgUkNQIGFwcGxpY2F0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgQWJvdXRBY3Rpb24gZXh0ZW5kcyBXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7CisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKKwkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldFdpbmRvdygpLmdldFNoZWxsKCksIGdldFN0cmluZygiX1VJX0Fib3V0X3RpdGxlIiksIC8vJE5PTi1OTFMtMSQKKwkJCWdldFN0cmluZygiX1VJX0Fib3V0X3RleHQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCS8qKgorCSAqIE9wZW4gYWN0aW9uIGZvciB0aGUgb2JqZWN0cyBmcm9tIHRoZSBDb3JlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgT3BlbkFjdGlvbiBleHRlbmRzIFdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKKwkJLyoqCisJCSAqIE9wZW5zIHRoZSBlZGl0b3JzIGZvciB0aGUgZmlsZXMgc2VsZWN0ZWQgdXNpbmcgdGhlIGZpbGUgZGlhbG9nLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7CisJCQlTdHJpbmcgZmlsZVBhdGggPSBvcGVuRmlsZVBhdGhEaWFsb2coZ2V0V2luZG93KCkuZ2V0U2hlbGwoKSwgbnVsbCwgU1dULk9QRU4pOworCQkJaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKKwkJCQlvcGVuRWRpdG9yKGdldFdpbmRvdygpLmdldFdvcmtiZW5jaCgpLCBVUkkuY3JlYXRlRmlsZVVSSShmaWxlUGF0aCkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogT3BlbiBVUkkgYWN0aW9uIGZvciB0aGUgb2JqZWN0cyBmcm9tIHRoZSBDb3JlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgT3BlblVSSUFjdGlvbiBleHRlbmRzIFdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKKwkJLyoqCisJCSAqIE9wZW5zIHRoZSBlZGl0b3JzIGZvciB0aGUgZmlsZXMgc2VsZWN0ZWQgdXNpbmcgdGhlIExvYWRSZXNvdXJjZURpYWxvZy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgeworCQkJTG9hZFJlc291cmNlQWN0aW9uLkxvYWRSZXNvdXJjZURpYWxvZyBsb2FkUmVzb3VyY2VEaWFsb2cgPSBuZXcgTG9hZFJlc291cmNlQWN0aW9uLkxvYWRSZXNvdXJjZURpYWxvZyhnZXRXaW5kb3coKS5nZXRTaGVsbCgpKTsKKwkJCWlmIChEaWFsb2cuT0sgPT0gbG9hZFJlc291cmNlRGlhbG9nLm9wZW4oKSkgeworCQkJCWZvciAoVVJJIHVyaSA6IGxvYWRSZXNvdXJjZURpYWxvZy5nZXRVUklzKCkpIHsKKwkJCQkJb3BlbkVkaXRvcihnZXRXaW5kb3coKS5nZXRXb3JrYmVuY2goKSwgdXJpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuRmlsZVBhdGhEaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyBmaWxlRXh0ZW5zaW9uRmlsdGVyLCBpbnQgc3R5bGUpIHsKKwkJRmlsZURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIHN0eWxlKTsKKwkJaWYgKGZpbGVFeHRlbnNpb25GaWx0ZXIgPT0gbnVsbCkgeworCQkJZmlsZUV4dGVuc2lvbkZpbHRlciA9CisJCQkJIiouIiArIGdldFN0cmluZygiX1VJX0NvbW1vbkVkaXRvckZpbGVuYW1lRXh0ZW5zaW9uIikgKyAiOyIgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSIqLiIgKyBnZXRTdHJpbmcoIl9VSV9HcmFwaEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9uIikgKyAiOyIgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSIqLiIgKyBnZXRTdHJpbmcoIl9VSV9Nb2RlbEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9uIikgKyAiOyIgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSIqLiIgKyBnZXRTdHJpbmcoIl9VSV9TY2VuYXJpb0VkaXRvckZpbGVuYW1lRXh0ZW5zaW9uIikgKyAiOyIgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCSIqLiIgKyBnZXRTdHJpbmcoIl9VSV9TZXF1ZW5jZXJFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCQlmaWxlRGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tde2ZpbGVFeHRlbnNpb25GaWx0ZXJ9KTsKKwkKKwkJZmlsZURpYWxvZy5vcGVuKCk7CisJCWlmIChmaWxlRGlhbG9nLmdldEZpbGVOYW1lKCkgIT0gbnVsbCAmJiBmaWxlRGlhbG9nLmdldEZpbGVOYW1lKCkubGVuZ3RoKCkgPiAwKSB7CisJCQlyZXR1cm4gZmlsZURpYWxvZy5nZXRGaWx0ZXJQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVEaWFsb2cuZ2V0RmlsZU5hbWUoKTsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5FZGl0b3IoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIFVSSSBmaWxlVVJJKSB7CisJCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOworCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKKwkKKwkJSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yRGVzY3JpcHRvciA9IHdvcmtiZW5jaC5nZXRFZGl0b3JSZWdpc3RyeSgpLmdldERlZmF1bHRFZGl0b3IoZmlsZVVSSS50b0ZpbGVTdHJpbmcoKSk7CisJCWlmIChlZGl0b3JEZXNjcmlwdG9yID09IG51bGwpIHsKKwkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKAorCQkJd29ya2JlbmNoV2luZG93LmdldFNoZWxsKCksCisJCQlnZXRTdHJpbmcoIl9VSV9FcnJvcl90aXRsZSIpLCAgLy8kTk9OLU5MUy0xJAorCQkJZ2V0U3RyaW5nKCJfV0FSTl9Ob19FZGl0b3IiLCBmaWxlVVJJLnRvRmlsZVN0cmluZygpKSk7ICAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZWxzZSB7CisJCQl0cnkgeworCQkJCXBhZ2Uub3BlbkVkaXRvcihuZXcgVVJJRWRpdG9ySW5wdXQoZmlsZVVSSSksIGVkaXRvckRlc2NyaXB0b3IuZ2V0SWQoKSk7CisJCQl9CisJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoCisJCQkJd29ya2JlbmNoV2luZG93LmdldFNoZWxsKCksCisJCQkJZ2V0U3RyaW5nKCJfVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsIiksICAvLyROT04tTkxTLTEkCisJCQkJZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNnZXRJbml0aWFsV2luZG93UGVyc3BlY3RpdmVJZCgpCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBzZXQgdGhlIGluaXRpYWwgUGVyc3BlY3RpdmUgCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxXaW5kb3dQZXJzcGVjdGl2ZUlkKCkgeworCQkvL3JldHVybiBEZXNpZ25lci5JRF9TVEVNX0RFU0lHTkVSX1BFUlNQRUNUSVZFOworCQlyZXR1cm4gU2ltdWxhdGlvbi5JRF9TVEVNX1NJTVVMQVRJT05fUEVSU1BFQ1RJVkU7CisJfQorCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI2dldE1haW5QcmVmZXJlbmNlUGFnZUlkKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1haW5QcmVmZXJlbmNlUGFnZUlkKCkgeworCQlyZXR1cm4gU1RFTVByZWZlcmVuY2VQYWdlLklEX1NURU1fUFJFRkVSRU5DRV9QQUdFOworCX0gLy8gZ2V0TWFpblByZWZlcmVuY2VQYWdlSWQKKwkKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNjcmVhdGVXb3JrYmVuY2hXaW5kb3dBZHZpc29yKG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklXb3JrYmVuY2hDb25maWd1cmVyKQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBXb3JrYmVuY2hXaW5kb3dBZHZpc29yIGNyZWF0ZVdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IoSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlcikgeworCQlyZXR1cm4gbmV3IFdpbmRvd0Fkdmlzb3IoY29uZmlndXJlcik7CisJfQkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJlc2VudGF0aW9uL0NvcmVFZGl0b3JQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9jb21tb24vcHJlc2VudGF0aW9uL0NvcmVFZGl0b3JQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2FiMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2NvbW1vbi9wcmVzZW50YXRpb24vQ29yZUVkaXRvclBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5FY2xpcHNlVUlQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUVkaXRQbHVnaW47CisKKy8qKgorICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBDb3JlIGVkaXRvciBwbHVnaW4uCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGZpbmFsIGNsYXNzIENvcmVFZGl0b3JQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4geworCS8qKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvcmVFZGl0b3JQbHVnaW4gSU5TVEFOQ0UgPSBuZXcgQ29yZUVkaXRvclBsdWdpbigpOworCisJLyoqCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvcmVFZGl0b3JQbHVnaW4oKSB7CisJCXN1cGVyCisJCQkobmV3IFJlc291cmNlTG9jYXRvciBbXSB7CisJCQkJRWNvcmVFZGl0UGx1Z2luLklOU1RBTkNFLAorCQkJfSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJLyoqCisJICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlVUlQbHVnaW4geworCQkvKioKKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKKwkJCXN1cGVyKCk7CisJCisJCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgorCQkJLy8KKwkJCXBsdWdpbiA9IHRoaXM7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9leHBlcmltZW50L3ByZXNlbnRhdGlvbi9FeHBlcmltZW50QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9leHBlcmltZW50L3ByZXNlbnRhdGlvbi9FeHBlcmltZW50QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmU3MzIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL2V4cGVyaW1lbnQvcHJlc2VudGF0aW9uL0V4cGVyaW1lbnRBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCkBAIC0wLDAgKzEsNDM3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29udHJvbEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YkNvbnRyaWJ1dGlvbkl0ZW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByZXNlbnRhdGlvbi5Db3JlRWRpdG9yUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBpcyB0aGUgYWN0aW9uIGJhciBjb250cmlidXRvciBmb3IgdGhlIEV4cGVyaW1lbnQgbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRXhwZXJpbWVudEFjdGlvbkJhckNvbnRyaWJ1dG9yCisJZXh0ZW5kcyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IKKwlpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvclBhcnQ7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBhY3Rpb24gb3BlbnMgdGhlIFByb3BlcnRpZXMgdmlldy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUFjdGlvbiBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24gPQorCQluZXcgQWN0aW9uKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbSIpKSAvLyROT04tTkxTLTEkCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCXRyeSB7CisJCQkJCWdldFBhZ2UoKS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIGFjdGlvbiByZWZyZXNoZXMgdGhlIHZpZXdlciBvZiB0aGUgY3VycmVudCBlZGl0b3IgaWYgdGhlIGVkaXRvcgorCSAqIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElBY3Rpb24gcmVmcmVzaFZpZXdlckFjdGlvbiA9CisJCW5ldyBBY3Rpb24oQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbSIpKSAvLyROT04tTkxTLTEkCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworCQkJCXJldHVybiBhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlpZiAoYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgeworCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpYWN0aXZlRWRpdG9yUGFydCkuZ2V0Vmlld2VyKCk7CisJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgeworCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcgorCSAqIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZUNoaWxkQWN0aW9uczsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCBmb3IgQ3JlYXRlQ2hpbGQgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcgorCSAqIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZVNpYmxpbmdBY3Rpb25zOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVTaWJsaW5nIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvbnRyaWJ1dG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFeHBlcmltZW50QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7CisJCXN1cGVyKEFERElUSU9OU19MQVNUX1NUWUxFKTsKKwkJbG9hZFJlc291cmNlQWN0aW9uID0gbmV3IExvYWRSZXNvdXJjZUFjdGlvbigpOworCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBWYWxpZGF0ZUFjdGlvbigpOworCQljb250cm9sQWN0aW9uID0gbmV3IENvbnRyb2xBY3Rpb24oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgU2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucyB0byB0aGUgdG9vbCBiYXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImV4cGVyaW1lbnQtc2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImV4cGVyaW1lbnQtYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHRvIHRoZSBtZW51IGJhciBhIG1lbnUgYW5kIHNvbWUgc2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucywKKwkgKiBhcyB3ZWxsIGFzIHRoZSBzdWItbWVudXMgZm9yIG9iamVjdCBjcmVhdGlvbiBpdGVtcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQlzdXBlci5jb250cmlidXRlVG9NZW51KG1lbnVNYW5hZ2VyKTsKKworCQlJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9FeHBlcmltZW50RWRpdG9yX21lbnUiKSwgIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50TWVudUlEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlQ2hpbGQgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgorCQkvLworCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVTaWJsaW5nIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KKwkJLy8KKwkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gRm9yY2UgYW4gdXBkYXRlIGJlY2F1c2UgRWNsaXBzZSBoaWRlcyBlbXB0eSBtZW51cyBub3cuCisJCS8vCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcgorCQkJKG5ldyBJTWVudUxpc3RlbmVyKCkgeworCQkJCSBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCQkJCSBtZW51TWFuYWdlci51cGRhdGVBbGwodHJ1ZSk7CisJCQkJIH0KKwkJCSB9KTsKKworCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiBXaGVuIHRoZSBhY3RpdmUgZWRpdG9yIGNoYW5nZXMsIHRoaXMgcmVtZW1iZXJzIHRoZSBjaGFuZ2UgYW5kIHJlZ2lzdGVycyB3aXRoIGl0IGFzIGEgc2VsZWN0aW9uIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBwYXJ0KSB7CisJCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihwYXJ0KTsKKwkJYWN0aXZlRWRpdG9yUGFydCA9IHBhcnQ7CisKKwkJLy8gU3dpdGNoIHRvIHRoZSBuZXcgc2VsZWN0aW9uIHByb3ZpZGVyLgorCQkvLworCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCQl9CisJCWlmIChwYXJ0ID09IG51bGwpIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsKKwkJfQorCQllbHNlIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gcGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKKwkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKworCQkJLy8gRmFrZSBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IHRvIHVwZGF0ZSB0aGUgbWVudXMuCisJCQkvLworCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpICE9IG51bGwpIHsKKwkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn0sCisJICogaGFuZGxpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50fXMgYnkgcXVlcnlpbmcgZm9yIHRoZSBjaGlsZHJlbiBhbmQgc2libGluZ3MKKwkgKiB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZCB1cGRhdGluZyB0aGUgbWVudXMgYWNjb3JkaW5nbHkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gZXZlbnQgCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCS8vIFJlbW92ZSBhbnkgbWVudSBpdGVtcyBmb3Igb2xkIHNlbGVjdGlvbi4KKwkJLy8KKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMpOworCQl9CisKKwkJLy8gUXVlcnkgdGhlIG5ldyBzZWxlY3Rpb24gZm9yIGFwcHJvcHJpYXRlIG5ldyBjaGlsZC9zaWJsaW5nIGRlc2NyaXB0b3JzCisJCS8vCisJCUNvbGxlY3Rpb248Pz4gbmV3Q2hpbGREZXNjcmlwdG9ycyA9IG51bGw7CisJCUNvbGxlY3Rpb248Pz4gbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gbnVsbDsKKworCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOworCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnNpemUoKSA9PSAxKSB7CisJCQlPYmplY3Qgb2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOworCisJCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7CisKKwkJCW5ld0NoaWxkRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhvYmplY3QsIG51bGwpOworCQkJbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobnVsbCwgb2JqZWN0KTsKKwkJfQorCisJCS8vIEdlbmVyYXRlIGFjdGlvbnMgZm9yIHNlbGVjdGlvbjsgcG9wdWxhdGUgYW5kIHJlZHJhdyB0aGUgbWVudXMuCisJCS8vCisJCWNyZWF0ZUNoaWxkQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKG5ld0NoaWxkRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7CisJCWNyZWF0ZVNpYmxpbmdBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhuZXdTaWJsaW5nRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7CisKKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7CisJCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKKwkJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7CisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7CisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlQ2hpbGRBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCisJLyoqCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgeworCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVTaWJsaW5nQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwgZGVzY3JpcHRvcikpOworCQkJfQorCQl9CisJCXJldHVybiBhY3Rpb25zOworCX0KKworCS8qKgorCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gd2l0aCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cworCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sCisJICogYnkgaW5zZXJ0aW5nIHRoZW0gYmVmb3JlIHRoZSBzcGVjaWZpZWQgY29udHJpYnV0aW9uIGl0ZW0gPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+LgorCSAqIElmIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgc2ltcGx5IGFkZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zLCBTdHJpbmcgY29udHJpYnV0aW9uSUQpIHsKKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChJQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMpIHsKKwkJCQlpZiAoY29udHJpYnV0aW9uSUQgIT0gbnVsbCkgeworCQkJCQltYW5hZ2VyLmluc2VydEJlZm9yZShjb250cmlidXRpb25JRCwgYWN0aW9uKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCW1hbmFnZXIuYWRkKGFjdGlvbik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQkKKwkvKioKKwkgKiBUaGlzIHJlbW92ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cworCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucykgeworCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7CisJCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgeworCQkJCS8vIExvb2sgaW50byBTdWJDb250cmlidXRpb25JdGVtcworCQkJCS8vCisJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uSXRlbSA9IGl0ZW1zW2ldOworCQkJCXdoaWxlIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCQljb250cmlidXRpb25JdGVtID0gKChTdWJDb250cmlidXRpb25JdGVtKWNvbnRyaWJ1dGlvbkl0ZW0pLmdldElubmVySXRlbSgpOworCQkJCX0KKworCQkJCS8vIERlbGV0ZSB0aGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbXMgd2l0aCBtYXRjaGluZyBhY3Rpb24uCisJCQkJLy8KKwkJCQlpZiAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKKwkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0QWN0aW9uKCk7CisJCQkJCWlmIChhY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsKKwkJCQkJCW1hbmFnZXIucmVtb3ZlKGNvbnRyaWJ1dGlvbkl0ZW0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHBvcC11cCBtZW51IGJlZm9yZSBpdCBhcHBlYXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKKwkJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBudWxsOworCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisKKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBpbnNlcnRzIGdsb2JhbCBhY3Rpb25zIGJlZm9yZSB0aGUgImFkZGl0aW9ucy1lbmQiIHNlcGFyYXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRHbG9iYWxBY3Rpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zLWVuZCIsIG5ldyBTZXBhcmF0b3IoInVpLWFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKKworCQlyZWZyZXNoVmlld2VyQWN0aW9uLnNldEVuYWJsZWQocmVmcmVzaFZpZXdlckFjdGlvbi5pc0VuYWJsZWQoKSk7CQkKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCByZWZyZXNoVmlld2VyQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAorCisJCXN1cGVyLmFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgZW5zdXJlcyB0aGF0IGEgZGVsZXRlIGFjdGlvbiB3aWxsIGNsZWFuIHVwIGFsbCByZWZlcmVuY2VzIHRvIGRlbGV0ZWQgb2JqZWN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVBbGxSZWZlcmVuY2VzT25EZWxldGUoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9leHBlcmltZW50L3ByZXNlbnRhdGlvbi9FeHBlcmltZW50RWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZXhwZXJpbWVudC9wcmVzZW50YXRpb24vRXhwZXJpbWVudEVkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MzBiNDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZXhwZXJpbWVudC9wcmVzZW50YXRpb24vRXhwZXJpbWVudEVkaXRvci5qYXZhCkBAIC0wLDAgKzEsMTcwMiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Mb2NhbFNlbGVjdGlvblRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuTWFya2VySGVscGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5lZGl0b3IuUHJvYmxlbUVkaXRvclBhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuY2VsbGVkaXRvci5BZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5Mb2NhbFRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5VbndyYXBwaW5nU2VsZWN0aW9uUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSU1hcmtlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSVV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS52aWV3LkV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVhNSVJlc291cmNlRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQucHJvdmlkZXIuRXhwZXJpbWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByZXNlbnRhdGlvbi5Db3JlRWRpdG9yUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlci5HcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByb3ZpZGVyLk1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXIuTW9kaWZpZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByb3ZpZGVyLlByZWRpY2F0ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5wcm92aWRlci5TY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5wcm92aWRlci5TZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIucHJvdmlkZXIuU29sdmVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIucHJvdmlkZXIuVHJpZ2dlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOworCisKKy8qKgorICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgRXhwZXJpbWVudCBtb2RlbCBlZGl0b3IuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEV4cGVyaW1lbnRFZGl0b3IKKwlleHRlbmRzIE11bHRpUGFnZUVkaXRvclBhcnQKKwlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluUHJvdmlkZXIsIElTZWxlY3Rpb25Qcm92aWRlciwgSU1lbnVMaXN0ZW5lciwgSVZpZXdlclByb3ZpZGVyLCBJR290b01hcmtlciB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgZWRpdGluZyBkb21haW4gdGhhdCBpcyB1c2VkIHRvIHRyYWNrIGFsbCBjaGFuZ2VzIHRvIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBvbmUgYWRhcHRlciBmYWN0b3J5IHVzZWQgZm9yIHByb3ZpZGluZyB2aWV3cyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNvbnRlbnRPdXRsaW5lUGFnZSBjb250ZW50T3V0bGluZVBhZ2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIGEga2x1ZGdlLi4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBjb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UncyB2aWV3ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgY29udGVudE91dGxpbmVWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBwcm9wZXJ0eSBzaGVldCBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQcm9wZXJ0eVNoZWV0UGFnZSBwcm9wZXJ0eVNoZWV0UGFnZTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHZpZXdlciB0aGF0IHNoYWRvd3MgdGhlIHNlbGVjdGlvbiBpbiB0aGUgY29udGVudCBvdXRsaW5lLgorCSAqIFRoZSBwYXJlbnQgcmVsYXRpb24gbXVzdCBiZSBjb3JyZWN0bHkgZGVmaW5lZCBmb3IgdGhpcyB0byB3b3JrLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmVlVmlld2VyIHNlbGVjdGlvblZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBjb250ZW50IHZpZXdlciwgd2hpY2ggbWF5IGJlIGVpdGhlciBvbmUgb2YgdGhlIHZpZXdlcnMgaW4gdGhlIHBhZ2VzIG9yIHRoZSBjb250ZW50IG91dGxpbmUgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBWaWV3ZXIgY3VycmVudFZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyB0byB3aGljaCBldmVyIHZpZXdlciBpcyBhY3RpdmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9cyB0aGF0IGFyZSBsaXN0ZW5pbmcgdG8gdGhpcyBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZWRpdG9yIGFzIGEgd2hvbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb24gZWRpdG9yU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKKworCS8qKgorCSAqIFRoZSBNYXJrZXJIZWxwZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHdvcmtzcGFjZSByZXNvdXJjZSBtYXJrZXJzIHByZXNlbnRlZAorCSAqIGluIEVjbGlwc2UncyBQcm9ibGVtcyBWaWV3LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXJrZXJIZWxwZXIgbWFya2VySGVscGVyID0gbmV3IEVkaXRVSU1hcmtlckhlbHBlcigpOworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIGZvciB3aGVuIHRoZSBvdXRsaW5lIGJlY29tZXMgYWN0aXZlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyID0KKwkJbmV3IElQYXJ0TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQlpZiAocCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSB7CisJCQkJCWlmICgoKENvbnRlbnRPdXRsaW5lKXApLmdldEN1cnJlbnRQYWdlKCkgPT0gY29udGVudE91dGxpbmVQYWdlKSB7CisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihFeHBlcmltZW50RWRpdG9yLnRoaXMpOworCisJCQkJCQlzZXRDdXJyZW50Vmlld2VyKGNvbnRlbnRPdXRsaW5lVmlld2VyKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChwIGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgeworCQkJCQlpZiAoKChQcm9wZXJ0eVNoZWV0KXApLmdldEN1cnJlbnRQYWdlKCkgPT0gcHJvcGVydHlTaGVldFBhZ2UpIHsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKEV4cGVyaW1lbnRFZGl0b3IudGhpcyk7CisJCQkJCQloYW5kbGVBY3RpdmF0ZSgpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHAgPT0gRXhwZXJpbWVudEVkaXRvci50aGlzKSB7CisJCQkJCWhhbmRsZUFjdGl2YXRlKCk7CisJCQkJfQorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCX07CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBzYXZlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gc2F2ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogTWFwIHRvIHN0b3JlIHRoZSBkaWFnbm9zdGljIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+IHJlc291cmNlVG9EaWFnbm9zdGljTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+KCk7CisKKwkvKioKKwkgKiBDb250cm9scyB3aGV0aGVyIHRoZSBwcm9ibGVtIGluZGljYXRpb24gc2hvdWxkIGJlIHVwZGF0ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOworCisJLyoqCisJICogQWRhcHRlciB1c2VkIHRvIHVwZGF0ZSB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHdoZW4gcmVzb3VyY2VzIGFyZSBkZW1hbmRlZCBsb2FkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEVDb250ZW50QWRhcHRlciBwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIgPSAKKwkJbmV3IEVDb250ZW50QWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKKwkJCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJlc291cmNlLmNsYXNzKSkgeworCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEOgorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fRVJST1JTOgorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fV0FSTklOR1M6IHsKKwkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKKwkJCQkJCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgbnVsbCk7CisJCQkJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgZGlhZ25vc3RpYyk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5yZW1vdmUocmVzb3VyY2UpOworCQkJCQkJCX0KKworCQkJCQkJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgeworCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQkJCQkJCQkJCSB9CisJCQkJCQkJCQkgfSk7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCQkJfQorCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsKKwkJCQliYXNpY1NldFRhcmdldCh0YXJnZXQpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHVuc2V0VGFyZ2V0KFJlc291cmNlIHRhcmdldCkgeworCQkJCWJhc2ljVW5zZXRUYXJnZXQodGFyZ2V0KTsKKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyBmb3Igd29ya3NwYWNlIGNoYW5nZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPQorCQluZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7CisJCQkJdHJ5IHsKKwkJCQkJY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgeworCQkJCQkJcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpOworCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworCQkJCQkJCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgeworCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgfHwKKwkJCQkJCQkJICAgIGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIGRlbHRhLmdldEZsYWdzKCkgIT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUykgeworCQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShkZWx0YS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpLCBmYWxzZSk7CisJCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworCQkJCQkJCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgeworCQkJCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWVsc2UgaWYgKCFzYXZlZFJlc291cmNlcy5yZW1vdmUocmVzb3VyY2UpKSB7CisJCQkJCQkJCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCX0KKworCQkJCQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldENoYW5nZWRSZXNvdXJjZXMoKSB7CisJCQkJCQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7CisJCQkJCQl9CisKKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRSZW1vdmVkUmVzb3VyY2VzKCkgeworCQkJCQkJCXJldHVybiByZW1vdmVkUmVzb3VyY2VzOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJZmluYWwgUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOworCQkJCQlkZWx0YS5hY2NlcHQodmlzaXRvcik7CisKKwkJCQkJaWYgKCF2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJIHJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsKKwkJCQkJCQkJCSBpZiAoIWlzRGlydHkoKSkgeworCQkJCQkJCQkJCSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKEV4cGVyaW1lbnRFZGl0b3IudGhpcywgZmFsc2UpOworCQkJCQkJCQkJIH0KKwkJCQkJCQkJIH0KKwkJCQkJCQkgfSk7CisJCQkJCX0KKworCQkJCQlpZiAoIXZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOworCQkJCQkJCQkJIGlmIChnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpID09IEV4cGVyaW1lbnRFZGl0b3IudGhpcykgeworCQkJCQkJCQkJCSBoYW5kbGVBY3RpdmF0ZSgpOworCQkJCQkJCQkJIH0KKwkJCQkJCQkJIH0KKwkJCQkJCQkgfSk7CisJCQkJCX0KKwkJCQl9CisJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogSGFuZGxlcyBhY3RpdmF0aW9uIG9mIHRoZSBlZGl0b3Igb3IgaXQncyBhc3NvY2lhdGVkIHZpZXdzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFjdGl2YXRlKCkgeworCQkvLyBSZWNvbXB1dGUgdGhlIHJlYWQgb25seSBzdGF0ZS4KKwkJLy8KKwkJaWYgKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkgIT0gbnVsbCkgeworCQkgIGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkuY2xlYXIoKTsKKworCQkgIC8vIFJlZnJlc2ggYW55IGFjdGlvbnMgdGhhdCBtYXkgYmVjb21lIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisJCSAgLy8KKwkJICBzZXRTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpOworCQl9CisKKwkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgeworCQkJaWYgKGhhbmRsZURpcnR5Q29uZmxpY3QoKSkgeworCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoRXhwZXJpbWVudEVkaXRvci50aGlzLCBmYWxzZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZW1vdmVkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOworCQkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7CisJCQljaGFuZ2VkUmVzb3VyY2VzLnJlbW92ZUFsbChzYXZlZFJlc291cmNlcyk7CisJCQloYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCk7CisJCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOworCQl9CisJfQorCisJLyoqCisJICogSGFuZGxlcyB3aGF0IHRvIGRvIHdpdGggY2hhbmdlZCByZXNvdXJjZXMgb24gYWN0aXZhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCkgeworCQlpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpICYmICghaXNEaXJ0eSgpIHx8IGhhbmRsZURpcnR5Q29uZmxpY3QoKSkpIHsKKwkJCWlmIChpc0RpcnR5KCkpIHsKKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpOworCQkJfQorCQkJZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOworCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOworCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGNoYW5nZWRSZXNvdXJjZXMpIHsKKwkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgeworCQkJCQlyZXNvdXJjZS51bmxvYWQoKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKKwkJCQkJfQorCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQlpZiAoIXJlc291cmNlVG9EaWFnbm9zdGljTWFwLmNvbnRhaW5zS2V5KHJlc291cmNlKSkgeworCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluLmlzU3RhbGUoZWRpdG9yU2VsZWN0aW9uKSkgeworCQkJCXNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKKwkJCX0KKworCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOworCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJfQorCX0KKyAgCisJLyoqCisJICogVXBkYXRlcyB0aGUgcHJvYmxlbXMgaW5kaWNhdGlvbiB3aXRoIHRoZSBpbmZvcm1hdGlvbiBkZXNjcmliZWQgaW4gdGhlIHNwZWNpZmllZCBkaWFnbm9zdGljLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCkgeworCQlpZiAodXBkYXRlUHJvYmxlbUluZGljYXRpb24pIHsKKwkJCUJhc2ljRGlhZ25vc3RpYyBkaWFnbm9zdGljID0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLk9LLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5lZGl0b3IiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgbnVsbCwKKwkJCQkJIG5ldyBPYmplY3QgW10geyBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkgfSk7CisJCQlmb3IgKERpYWdub3N0aWMgY2hpbGREaWFnbm9zdGljIDogcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAudmFsdWVzKCkpIHsKKwkJCQlpZiAoY2hpbGREaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQlkaWFnbm9zdGljLmFkZChjaGlsZERpYWdub3N0aWMpOworCQkJCX0KKwkJCX0KKworCQkJaW50IGxhc3RFZGl0b3JQYWdlID0gZ2V0UGFnZUNvdW50KCkgLSAxOworCQkJaWYgKGxhc3RFZGl0b3JQYWdlID49IDAgJiYgZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSBpbnN0YW5jZW9mIFByb2JsZW1FZGl0b3JQYXJ0KSB7CisJCQkJKChQcm9ibGVtRWRpdG9yUGFydClnZXRFZGl0b3IobGFzdEVkaXRvclBhZ2UpKS5zZXREaWFnbm9zdGljKGRpYWdub3N0aWMpOworCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQlzZXRBY3RpdmVQYWdlKGxhc3RFZGl0b3JQYWdlKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCVByb2JsZW1FZGl0b3JQYXJ0IHByb2JsZW1FZGl0b3JQYXJ0ID0gbmV3IFByb2JsZW1FZGl0b3JQYXJ0KCk7CisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsKKwkJCQlwcm9ibGVtRWRpdG9yUGFydC5zZXRNYXJrZXJIZWxwZXIobWFya2VySGVscGVyKTsKKwkJCQl0cnkgeworCQkJCQlhZGRQYWdlKCsrbGFzdEVkaXRvclBhZ2UsIHByb2JsZW1FZGl0b3JQYXJ0LCBnZXRFZGl0b3JJbnB1dCgpKTsKKwkJCQkJc2V0UGFnZVRleHQobGFzdEVkaXRvclBhZ2UsIHByb2JsZW1FZGl0b3JQYXJ0LmdldFBhcnROYW1lKCkpOworCQkJCQlzZXRBY3RpdmVQYWdlKGxhc3RFZGl0b3JQYWdlKTsKKwkJCQkJc2hvd1RhYnMoKTsKKwkJCQl9CisJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKworCQkJaWYgKG1hcmtlckhlbHBlci5oYXNNYXJrZXJzKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSkpIHsKKwkJCQltYXJrZXJIZWxwZXIuZGVsZXRlTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQl0cnkgeworCQkJCQkJbWFya2VySGVscGVyLmNyZWF0ZU1hcmtlcnMoZGlhZ25vc3RpYyk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQlDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogU2hvd3MgYSBkaWFsb2cgdGhhdCBhc2tzIGlmIGNvbmZsaWN0aW5nIGNoYW5nZXMgc2hvdWxkIGJlIGRpc2NhcmRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkgeworCQlyZXR1cm4KKwkJCU1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uCisJCQkJKGdldFNpdGUoKS5nZXRTaGVsbCgpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9GaWxlQ29uZmxpY3RfbGFiZWwiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9XQVJOX0ZpbGVDb25mbGljdCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhIG1vZGVsIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXhwZXJpbWVudEVkaXRvcigpIHsKKwkJc3VwZXIoKTsKKwkJaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdXAgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgbW9kZWwgZWRpdG9yLiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKSB7CisJCWluaXRpYWxpemVFZGl0aW5nRG9tYWluR2VuKCk7CisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpCisJCQkJLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgiKiIsCisJCQkJCQlTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbC5JTlNUQU5DRSk7CisKKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkKKwkJCQkuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKS5wdXQoInBsYXRmb3JtIiwKKwkJCQkJCVNURU1YTUlSZXNvdXJjZUZhY3RvcnlJbXBsLklOU1RBTkNFKTsKKwl9IC8vIGluaXRpYWxpemVFZGl0aW5nRG9tYWluCisJCisJLyoqCisJICogVGhpcyBzZXRzIHVwIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1vZGVsIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWRpdGluZ0RvbWFpbkdlbigpIHsKKwkJLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlpZWxkcyBpdGVtIHByb3ZpZGVycy4KKwkJLy8KKwkJYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOworCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBFeHBlcmltZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBHcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBQcmVkaWNhdGVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFRyaWdnZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKworCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUgZXhlY3V0ZWQuCisJCS8vCisJCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOworCisJCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCisJCS8vCisJCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcgorCQkJKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKKwkJCQkgcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgeworCQkJCQkgZ2V0Q29udGFpbmVyKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJIChuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJICBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCSAgZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworCisJCQkJCQkJCSAgLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KKwkJCQkJCQkJICAvLworCQkJCQkJCQkgIENvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaylldmVudC5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsKKwkJCQkJCQkJICBpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgeworCQkJCQkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihtb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7CisJCQkJCQkJCSAgfQorCQkJCQkJCQkgIGlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsICYmICFwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQkJCQkgIHByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsKKwkJCQkJCQkJICB9CisJCQkJCQkJICB9CisJCQkJCQkgIH0pOworCQkJCSB9CisJCQkgfSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgorCQkvLworCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgQm9vbGVhbj4oKSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBoZXJlIGZvciB0aGUgbGlzdGVuZXIgdG8gYmUgYWJsZSB0byBjYWxsIGl0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCQkJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGludCBhY3Rpb24pIHsKKwkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKGFjdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHRoZSBzZWxlY3Rpb24gaW50byB3aGljaGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBjb2xsZWN0aW9uIAorCSAqICA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisJCWZpbmFsIENvbGxlY3Rpb248Pz4gdGhlU2VsZWN0aW9uID0gY29sbGVjdGlvbjsKKwkJLy8gTWFrZSBzdXJlIGl0J3Mgb2theS4KKwkJLy8KKwkJaWYgKHRoZVNlbGVjdGlvbiAhPSBudWxsICYmICF0aGVTZWxlY3Rpb24uaXNFbXB0eSgpKSB7CisJCQlSdW5uYWJsZSBydW5uYWJsZSA9CisJCQkJbmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBpdGVtcyBpbiB0aGUgY3VycmVudCBjb250ZW50IHZpZXdlciBvZiB0aGUgZWRpdG9yLgorCQkJCQkJLy8KKwkJCQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKKwkJCQkJCQljdXJyZW50Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0aGVTZWxlY3Rpb24udG9BcnJheSgpKSwgdHJ1ZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9OworCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGVkaXRpbmcgZG9tYWluIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSUVkaXRpbmdEb21haW5Qcm92aWRlcn0gaW50ZXJmYWNlLgorCSAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBpbXBsZW1lbnRpbmcgdGhlIHN0YXRpYyBtZXRob2RzIG9mIHtAbGluayBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW59CisJICogYW5kIGZvciBzdXBwb3J0aW5nIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBFZGl0aW5nRG9tYWluIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgeworCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgY2xhc3MgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgeworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5IAorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE9iamVjdCBbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7CisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7CisJCQlyZXR1cm4gKHBhcmVudCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhcmVudCkpLnRvQXJyYXkoKTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7CisJCQlyZXR1cm4gcGFyZW50ICE9IG51bGw7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG9uZSBjb250ZW50IHZpZXdlciwgZWl0aGVyIGZvciB0aGUgY3VycmVudCBwYWdlIG9yIHRoZSBvdXRsaW5lIHZpZXcsIGlmIGl0IGhhcyBmb2N1cywKKwkgKiBpcyB0aGUgY3VycmVudCBvbmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmlld2VyIAorCSAqICA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q3VycmVudFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7CisJCS8vIElmIGl0IGlzIGNoYW5naW5nLi4uCisJCS8vCisJCWlmIChjdXJyZW50Vmlld2VyICE9IHZpZXdlcikgeworCQkJaWYgKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7CisJCQkJLy8gQ3JlYXRlIHRoZSBsaXN0ZW5lciBvbiBkZW1hbmQuCisJCQkJLy8KKwkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPQorCQkJCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCQkJCS8vIFRoaXMganVzdCBub3RpZmllcyB0aG9zZSB0aGluZ3MgdGhhdCBhcmUgYWZmZWN0ZWQgYnkgdGhlIHNlY3Rpb24uCisJCQkJCQkvLworCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgc2VsZWN0aW9uQ2hhbmdlZEV2ZW50KSB7CisJCQkJCQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkNoYW5nZWRFdmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCQl9CisJCQkJCX07CisJCQl9CisKKwkJCS8vIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBvbGQgb25lLgorCQkJLy8KKwkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKKwkJCQljdXJyZW50Vmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOworCQkJfQorCisJCQkvLyBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG5ldyBvbmUuCisJCQkvLworCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7CisJCQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOworCQkJfQorCisJCQkvLyBSZW1lbWJlciBpdC4KKwkJCS8vCisJCQljdXJyZW50Vmlld2VyID0gdmlld2VyOworCisJCQkvLyBTZXQgdGhlIGVkaXRvcnMgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdlcidzIHNlbGVjdGlvbi4KKwkJCS8vCisJCQlzZXRTZWxlY3Rpb24oY3VycmVudFZpZXdlciA9PSBudWxsID8gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSA6IGN1cnJlbnRWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSB2aWV3ZXIgYXMgcmVxdWlyZWQgYnkgdGhlIHtAbGluayBJVmlld2VyUHJvdmlkZXJ9IGludGVyZmFjZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgeworCQlyZXR1cm4gY3VycmVudFZpZXdlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIgYW5kIGFkZHMgYSBsaXN0ZW5lciBhcyB3ZWxsCisJICogcmVnaXN0ZXJpbmcgdGhlIG1lbnUgZm9yIGV4dGVuc2lvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7CisJCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsgLy8kTk9OLU5MUy0xJAorCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKKwkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKHRoaXMpOworCQlNZW51IG1lbnUgPSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKKwkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOworCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgdmlld2VyKTsKKworCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSzsKKwkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7TG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLCBMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCksCisJCQkJVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKKwkJdmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyYWdBZGFwdGVyKAorCQkJCXZpZXdlcikpOworCQl2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLAorCQkJCW5ldyBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7CisJfSAvLyBjcmVhdGVDb250ZXh0TWVudUZvcgorCisJLyoqCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yR2VuKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7CisJCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsgLy8kTk9OLU5MUy0xJAorCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKKwkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKHRoaXMpOworCQlNZW51IG1lbnU9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOworCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7CisJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGNvbnRleHRNZW51LCBuZXcgVW53cmFwcGluZ1NlbGVjdGlvblByb3ZpZGVyKHZpZXdlcikpOworCisJCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LOworCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07CisJCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKKwkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgY2FsbGVkIHRvIGxvYWQgYSByZXNvdXJjZSBpbnRvIHRoZSBlZGl0aW5nIGRvbWFpbidzIHJlc291cmNlIHNldCBiYXNlZCBvbiB0aGUgZWRpdG9yJ3MgaW5wdXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlTW9kZWwoKSB7CisJCVVSSSByZXNvdXJjZVVSSSA9IEVkaXRVSVV0aWwuZ2V0VVJJKGdldEVkaXRvcklucHV0KCkpOworCQlFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworCQl0cnkgeworCQkJLy8gTG9hZCB0aGUgcmVzb3VyY2UgdGhyb3VnaCB0aGUgZWRpdGluZyBkb21haW4uCisJCQkvLworCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIHRydWUpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZXhjZXB0aW9uID0gZTsKKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCBmYWxzZSk7CisJCX0KKworCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKTsKKwkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsICBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCX0KKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBkaWFnbm9zdGljIGRlc2NyaWJpbmcgdGhlIGVycm9ycyBhbmQgd2FybmluZ3MgbGlzdGVkIGluIHRoZSByZXNvdXJjZQorCSAqIGFuZCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiAoaWYgYW55KS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSByZXNvdXJjZSAKKwkgKiBAcGFyYW0gZXhjZXB0aW9uIAorCSAqIEByZXR1cm4KKwkgKiAgPCEtLSBlbmQtdXNlci1kb2MgLS0+IAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGlhZ25vc3RpYyBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhSZXNvdXJjZSByZXNvdXJjZSwgRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQlpZiAoIXJlc291cmNlLmdldEVycm9ycygpLmlzRW1wdHkoKSB8fCAhcmVzb3VyY2UuZ2V0V2FybmluZ3MoKS5pc0VtcHR5KCkpIHsKKwkJCUJhc2ljRGlhZ25vc3RpYyBiYXNpY0RpYWdub3N0aWMgPQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMKKwkJCQkJKERpYWdub3N0aWMuRVJST1IsCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmVkaXRvciIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJIDAsCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksIC8vJE5PTi1OTFMtMSQKKwkJCQkJIG5ldyBPYmplY3QgW10geyBleGNlcHRpb24gPT0gbnVsbCA/IChPYmplY3QpcmVzb3VyY2UgOiBleGNlcHRpb24gfSk7CisJCQliYXNpY0RpYWdub3N0aWMubWVyZ2UoRWNvcmVVdGlsLmNvbXB1dGVEaWFnbm9zdGljKHJlc291cmNlLCB0cnVlKSk7CisJCQlyZXR1cm4gYmFzaWNEaWFnbm9zdGljOworCQl9CisJCWVsc2UgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQlyZXR1cm4KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5lZGl0b3IiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCSBuZXcgT2JqZWN0W10geyBleGNlcHRpb24gfSk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gRGlhZ25vc3RpYy5PS19JTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gaW5zdGFsbCB5b3VyIG93biBjb250cm9scy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3JlYXRlUGFnZXMoKSB7CisJCS8vIENyZWF0ZXMgdGhlIG1vZGVsIGZyb20gdGhlIGVkaXRvciBpbnB1dAorCQkvLworCQljcmVhdGVNb2RlbCgpOworCisJCS8vIE9ubHkgY3JlYXRlcyB0aGUgb3RoZXIgcGFnZXMgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGVkaXRlZAorCQkvLworCQlpZiAoIWdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJLy8gQ3JlYXRlIGEgcGFnZSBmb3IgdGhlIHNlbGVjdGlvbiB0cmVlIHZpZXcuCisJCQkvLworCQkJVHJlZSB0cmVlID0gbmV3IFRyZWUoZ2V0Q29udGFpbmVyKCksIFNXVC5NVUxUSSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKKwkJCXNldEN1cnJlbnRWaWV3ZXIoc2VsZWN0aW9uVmlld2VyKTsKKworCQkJc2VsZWN0aW9uVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCS8vc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKworCQkJbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcihzZWxlY3Rpb25WaWV3ZXIuZ2V0VHJlZSgpLCBhZGFwdGVyRmFjdG9yeSk7CisKKwkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHNlbGVjdGlvblZpZXdlcik7CisJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh0cmVlKTsKKwkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCSBzZXRBY3RpdmVQYWdlKDApOworCQkJCQkgfQorCQkJCSB9KTsKKwkJfQorCisJCS8vIEVuc3VyZXMgdGhhdCB0aGlzIGVkaXRvciB3aWxsIG9ubHkgZGlzcGxheSB0aGUgcGFnZSdzIHRhYgorCQkvLyBhcmVhIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHBhZ2UKKwkJLy8KKwkJZ2V0Q29udGFpbmVyKCkuYWRkQ29udHJvbExpc3RlbmVyCisJCQkobmV3IENvbnRyb2xBZGFwdGVyKCkgeworCQkJCWJvb2xlYW4gZ3VhcmQgPSBmYWxzZTsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsKKwkJCQkJaWYgKCFndWFyZCkgeworCQkJCQkJZ3VhcmQgPSB0cnVlOworCQkJCQkJaGlkZVRhYnMoKTsKKwkJCQkJCWd1YXJkID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkgfSk7CisKKwkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkgfQorCQkJIH0pOworCX0gLy8gY3JlYXRlUGFnZXMKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gaW5zdGFsbCB5b3VyIG93biBjb250cm9scy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwkvL0BPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VzR2VuKCkgeworCQkvLyBDcmVhdGVzIHRoZSBtb2RlbCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQKKwkJLy8KKwkJY3JlYXRlTW9kZWwoKTsKKworCQkvLyBPbmx5IGNyZWF0ZXMgdGhlIG90aGVyIHBhZ2VzIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBlZGl0ZWQKKwkJLy8KKwkJaWYgKCFnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCS8vIENyZWF0ZSBhIHBhZ2UgZm9yIHRoZSBzZWxlY3Rpb24gdHJlZSB2aWV3LgorCQkJLy8KKwkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGdldENvbnRhaW5lcigpLCBTV1QuTVVMVEkpOworCQkJc2VsZWN0aW9uVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7CisJCQlzZXRDdXJyZW50Vmlld2VyKHNlbGVjdGlvblZpZXdlcik7CisKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCisJCQluZXcgQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yKHNlbGVjdGlvblZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsKKworCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Ioc2VsZWN0aW9uVmlld2VyKTsKKwkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHRyZWUpOworCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisKKwkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJIHNldEFjdGl2ZVBhZ2UoMCk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJLy8gRW5zdXJlcyB0aGF0IHRoaXMgZWRpdG9yIHdpbGwgb25seSBkaXNwbGF5IHRoZSBwYWdlJ3MgdGFiCisJCS8vIGFyZWEgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgcGFnZQorCQkvLworCQlnZXRDb250YWluZXIoKS5hZGRDb250cm9sTGlzdGVuZXIKKwkJCShuZXcgQ29udHJvbEFkYXB0ZXIoKSB7CisJCQkJYm9vbGVhbiBndWFyZCA9IGZhbHNlOworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBldmVudCkgeworCQkJCQlpZiAoIWd1YXJkKSB7CisJCQkJCQlndWFyZCA9IHRydWU7CisJCQkJCQloaWRlVGFicygpOworCQkJCQkJZ3VhcmQgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCSB9KTsKKworCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQkJCSB9CisJCQkgfSk7CisJfQorCisJLyoqCisJICogSWYgdGhlcmUgaXMganVzdCBvbmUgcGFnZSBpbiB0aGUgbXVsdGktcGFnZSBlZGl0b3IgcGFydCwKKwkgKiB0aGlzIGhpZGVzIHRoZSBzaW5nbGUgdGFiIGF0IHRoZSBib3R0b20uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGlkZVRhYnMoKSB7CisJCWlmIChnZXRQYWdlQ291bnQoKSA8PSAxKSB7CisJCQlzZXRQYWdlVGV4dCgwLCAiIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsKKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodCgxKTsKKwkJCQlQb2ludCBwb2ludCA9IGdldENvbnRhaW5lcigpLmdldFNpemUoKTsKKwkJCQlnZXRDb250YWluZXIoKS5zZXRTaXplKHBvaW50LngsIHBvaW50LnkgKyA2KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGFnZSBpbiB0aGUgbXVsdGktcGFnZSBlZGl0b3IgcGFydCwKKwkgKiB0aGlzIHNob3dzIHRoZSB0YWJzIGF0IHRoZSBib3R0b20uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2hvd1RhYnMoKSB7CisJCWlmIChnZXRQYWdlQ291bnQoKSA+IDEpIHsKKwkJCXNldFBhZ2VUZXh0KDAsIGdldFN0cmluZygiX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsKKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodChTV1QuREVGQVVMVCk7CisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7CisJCQkJZ2V0Q29udGFpbmVyKCkuc2V0U2l6ZShwb2ludC54LCBwb2ludC55IC0gNik7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWQgdG8gdHJhY2sgdGhlIGFjdGl2ZSB2aWV3ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgcGFnZUluZGV4KSB7CisJCXN1cGVyLnBhZ2VDaGFuZ2UocGFnZUluZGV4KTsKKworCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsKKwkJCWhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKGNvbnRlbnRPdXRsaW5lUGFnZS5nZXRTZWxlY3Rpb24oKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGhvdyB0aGUgZnJhbWV3b3JrIGRldGVybWluZXMgd2hpY2ggaW50ZXJmYWNlcyB3ZSBpbXBsZW1lbnQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgeworCQlpZiAoa2V5LmVxdWFscyhJQ29udGVudE91dGxpbmVQYWdlLmNsYXNzKSkgeworCQkJcmV0dXJuIHNob3dPdXRsaW5lVmlldygpID8gZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgOiBudWxsOworCQl9CisJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzKSkgeworCQkJcmV0dXJuIGdldFByb3BlcnR5U2hlZXRQYWdlKCk7CisJCX0KKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhJR290b01hcmtlci5jbGFzcykpIHsKKwkJCXJldHVybiB0aGlzOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoa2V5KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgYWNjZXNzZXMgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUgY29udGVudCBvdXRsaW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQ29udGVudE91dGxpbmVQYWdlIGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIHsKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSA9PSBudWxsKSB7CisJCQkvLyBUaGUgY29udGVudCBvdXRsaW5lIGlzIGp1c3QgYSB0cmVlLgorCQkJLy8KKwkJCWNsYXNzIE15Q29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgQ29udGVudE91dGxpbmVQYWdlIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCQkJCS8vIFNldCB1cCB0aGUgdHJlZSB2aWV3ZXIuCisJCQkJCS8vCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisKKwkJCQkJLy8gTWFrZSBzdXJlIG91ciBwb3B1cHMgd29yay4KKwkJCQkJLy8KKwkJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IoY29udGVudE91dGxpbmVWaWV3ZXIpOworCisJCQkJCWlmICghZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkgIC8vIFNlbGVjdCB0aGUgcm9vdCBvYmplY3QgaW4gdGhlIHZpZXcuCisJCQkJCSAgLy8KKwkJCQkJICBjb250ZW50T3V0bGluZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCQkJCQl9CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgbWFrZUNvbnRyaWJ1dGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlcikgeworCQkJCQlzdXBlci5tYWtlQ29udHJpYnV0aW9ucyhtZW51TWFuYWdlciwgdG9vbEJhck1hbmFnZXIsIHN0YXR1c0xpbmVNYW5hZ2VyKTsKKwkJCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsKKwkJCQl9CisJCQl9CisKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZSA9IG5ldyBNeUNvbnRlbnRPdXRsaW5lUGFnZSgpOworCisJCQkvLyBMaXN0ZW4gdG8gc2VsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBpdCBpcyBhIHNwZWNpYWwgd2F5LgorCQkJLy8KKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKKwkJCQkobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQkJCSAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBoYW5kbGUgc2VsZWN0aW9ucyBjb3JyZWN0bHkuCisJCQkJCSAvLworCQkJCQkgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQkJCSBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJcmV0dXJuIGNvbnRlbnRPdXRsaW5lUGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIHByb3BlcnR5IHNoZWV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogQHJldHVybgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElQcm9wZXJ0eVNoZWV0UGFnZSBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKKwkJaWYgKHByb3BlcnR5U2hlZXRQYWdlID09IG51bGwpIHsKKwkJCXByb3BlcnR5U2hlZXRQYWdlID0KKwkJCQluZXcgRXh0ZW5kZWRQcm9wZXJ0eVNoZWV0UGFnZShlZGl0aW5nRG9tYWluKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihMaXN0PD8+IHNlbGVjdGlvbikgeworCQkJCQkJRXhwZXJpbWVudEVkaXRvci50aGlzLnNldFNlbGVjdGlvblRvVmlld2VyKHNlbGVjdGlvbik7CisJCQkJCQlFeHBlcmltZW50RWRpdG9yLnRoaXMuc2V0Rm9jdXMoKTsKKwkJCQkJfQorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKKwkJCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7CisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsKKwkJCQkJfQorCQkJCX07CisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQl9CisKKwkJcmV0dXJuIHByb3BlcnR5U2hlZXRQYWdlOworCX0KKworCS8qKgorCSAqIFRoaXMgZGVhbHMgd2l0aCBob3cgd2Ugd2FudCBzZWxlY3Rpb24gaW4gdGhlIG91dGxpbmVyIHRvIGFmZmVjdCB0aGUgb3RoZXIgdmlld3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gc2VsZWN0aW9uIAorCSAqICA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJaWYgKHNlbGVjdGlvblZpZXdlciAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQlJdGVyYXRvcjw/PiBzZWxlY3RlZEVsZW1lbnRzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLml0ZXJhdG9yKCk7CisJCQlpZiAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsKKwkJCQkvLyBHZXQgdGhlIGZpcnN0IHNlbGVjdGVkIGVsZW1lbnQuCisJCQkJLy8KKwkJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCk7CisKKwkJCQlBcnJheUxpc3Q8T2JqZWN0PiBzZWxlY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisJCQkJc2VsZWN0aW9uTGlzdC5hZGQoc2VsZWN0ZWRFbGVtZW50KTsKKwkJCQl3aGlsZSAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsKKwkJCQkJc2VsZWN0aW9uTGlzdC5hZGQoc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCkpOworCQkJCX0KKworCQkJCS8vIFNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSB3aWRnZXQuCisJCQkJLy8KKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbkxpc3QpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSUVkaXRvclBhcnR9IGFuZCBzaW1wbHkgdGVzdHMgdGhlIGNvbW1hbmQgc3RhY2suCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKwkJcmV0dXJuICgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuaXNTYXZlTmVlZGVkKCk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSBzYXZlcyB0aGUgbW9kZWwgZmlsZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKKwkJLy8gU2F2ZSBvbmx5IHJlc291cmNlcyB0aGF0IGhhdmUgYWN0dWFsbHkgY2hhbmdlZC4KKwkJLy8KKwkJZmluYWwgTWFwPE9iamVjdCwgT2JqZWN0PiBzYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOworCQlzYXZlT3B0aW9ucy5wdXQoUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VELCBSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRURfTUVNT1JZX0JVRkZFUik7CisKKwkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbiBiZWNhdXNlIHRoaXMgaXMgYSBsb25nIHJ1bm5pbmcgYWN0aXZpdHkgdGhhdCBtb2RpZmllcyB0aGUgd29ya2JlbmNoLgorCQkvLworCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0KKwkJCW5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7CisJCQkJLy8gVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBydW5zLgorCQkJCS8vCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQkJLy8gU2F2ZSB0aGUgcmVzb3VyY2VzIHRvIHRoZSBmaWxlIHN5c3RlbS4KKwkJCQkJLy8KKwkJCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7CisJCQkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpIHsKKwkJCQkJCWlmICgoZmlyc3QgfHwgIXJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpIHx8IGlzUGVyc2lzdGVkKHJlc291cmNlKSkgJiYgIWVkaXRpbmdEb21haW4uaXNSZWFkT25seShyZXNvdXJjZSkpIHsKKwkJCQkJCQl0cnkgeworCQkJCQkJCQlsb25nIHRpbWVTdGFtcCA9IHJlc291cmNlLmdldFRpbWVTdGFtcCgpOworCQkJCQkJCQlyZXNvdXJjZS5zYXZlKHNhdmVPcHRpb25zKTsKKwkJCQkJCQkJaWYgKHJlc291cmNlLmdldFRpbWVTdGFtcCgpICE9IHRpbWVTdGFtcCkgeworCQkJCQkJCQkJc2F2ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJCQkJCQl9CisJCQkJCQkJZmlyc3QgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX07CisKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCS8vIFRoaXMgcnVucyB0aGUgb3B0aW9ucywgYW5kIHNob3dzIHByb2dyZXNzLgorCQkJLy8KKwkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpLnJ1bih0cnVlLCBmYWxzZSwgb3BlcmF0aW9uKTsKKworCQkJLy8gUmVmcmVzaCB0aGUgbmVjZXNzYXJ5IHN0YXRlLgorCQkJLy8KKwkJCSgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuc2F2ZUlzRG9uZSgpOworCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZyB0aGF0IHNob3VsZG4ndC4KKwkJCS8vCisJCQlDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgd2hldGhlciBzb21ldGhpbmcgaGFzIGJlZW4gcGVyc2lzdGVkIHRvIHRoZSBVUkkgb2YgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgVVJJIGNvbnZlcnRlciBmcm9tIHRoZSBlZGl0b3IncyByZXNvdXJjZSBzZXQgdG8gdHJ5IHRvIG9wZW4gYW4gaW5wdXQgc3RyZWFtLiAKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BlcnNpc3RlZChSZXNvdXJjZSByZXNvdXJjZSkgeworCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQl0cnkgeworCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKHJlc291cmNlLmdldFVSSSgpKTsKKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgeworCQkJCXJlc3VsdCA9IHRydWU7CisJCQkJc3RyZWFtLmNsb3NlKCk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElnbm9yZQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogVGhpcyBhbHdheXMgcmV0dXJucyB0cnVlIGJlY2F1c2UgaXQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFsc28gY2hhbmdlcyB0aGUgZWRpdG9yJ3MgaW5wdXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7CisJCVNhdmVBc0RpYWxvZyBzYXZlQXNEaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKKwkJc2F2ZUFzRGlhbG9nLm9wZW4oKTsKKwkJSVBhdGggcGF0aCA9IHNhdmVBc0RpYWxvZy5nZXRSZXN1bHQoKTsKKwkJaWYgKHBhdGggIT0gbnVsbCkgeworCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKKwkJCWlmIChmaWxlICE9IG51bGwpIHsKKwkJCQlkb1NhdmVBcyhVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZG9TYXZlQXMoVVJJIHVyaSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisJCShlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKS5zZXRVUkkodXJpKTsKKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKKwkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPQorCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgIT0gbnVsbCA/CisJCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgOgorCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisJCWRvU2F2ZShwcm9ncmVzc01vbml0b3IpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG1hcmtlciAKKwkgKiAgPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKKwkJdHJ5IHsKKwkJCWlmIChtYXJrZXIuZ2V0VHlwZSgpLmVxdWFscyhFVmFsaWRhdG9yLk1BUktFUikpIHsKKwkJCQlTdHJpbmcgdXJpQXR0cmlidXRlID0gbWFya2VyLmdldEF0dHJpYnV0ZShFVmFsaWRhdG9yLlVSSV9BVFRSSUJVVEUsIG51bGwpOworCQkJCWlmICh1cmlBdHRyaWJ1dGUgIT0gbnVsbCkgeworCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSSh1cmlBdHRyaWJ1dGUpOworCQkJCQlFT2JqZWN0IGVPYmplY3QgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0RU9iamVjdCh1cmksIHRydWUpOworCQkJCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7CisJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGVkaXRpbmdEb21haW4uZ2V0V3JhcHBlcihlT2JqZWN0KSkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBzdGFydHVwLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisJCXNldFNpdGUoc2l0ZSk7CisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7CisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7CisJCXNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7CisJCXNpdGUuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCWdldENvbnRyb2woZ2V0QWN0aXZlUGFnZSgpKS5zZXRGb2N1cygpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogQHBhcmFtIGxpc3RlbmVyIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gbGlzdGVuZXIgCisJICogIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gcmV0dXJuIHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7CisJCXJldHVybiBlZGl0b3JTZWxlY3Rpb247CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gc2V0IHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCisJICogQ2FsbGluZyB0aGlzIHJlc3VsdCB3aWxsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHNlbGVjdGlvbiAKKwkgKiAgPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQllZGl0b3JTZWxlY3Rpb24gPSBzZWxlY3Rpb247CisKKwkJZm9yIChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyIDogc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycykgeworCQkJbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOworCQl9CisJCXNldFN0YXR1c0xpbmVNYW5hZ2VyKHNlbGVjdGlvbik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gc2VsZWN0aW9uIAorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXNMaW5lTWFuYWdlcihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBjdXJyZW50Vmlld2VyICE9IG51bGwgJiYgY3VycmVudFZpZXdlciA9PSBjb250ZW50T3V0bGluZVZpZXdlciA/CisJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyIDogZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7CisKKwkJaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJCUNvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS50b0xpc3QoKTsKKwkJCQlzd2l0Y2ggKGNvbGxlY3Rpb24uc2l6ZSgpKSB7CisJCQkJCWNhc2UgMDogeworCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9Ob09iamVjdFNlbGVjdGVkIikpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIDE6IHsKKwkJCQkJCVN0cmluZyB0ZXh0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcihhZGFwdGVyRmFjdG9yeSkuZ2V0VGV4dChjb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQiLCB0ZXh0KSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWRlZmF1bHQ6IHsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTXVsdGlPYmplY3RTZWxlY3RlZCIsIEludGVnZXIudG9TdHJpbmcoY29sbGVjdGlvbi5zaXplKCkpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZSgiIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gdGhlIHBsdWdpbidzIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7CisJCXJldHVybiBDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXkpOworCX0KKworCS8qKgorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gcGx1Z2luLnByb3BlcnRpZXMsIG1ha2luZyBhIHN1YnN0aXR1dGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgeworCQlyZXR1cm4gQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5LCBuZXcgT2JqZWN0IFtdIHsgczEgfSk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcn0gdG8gaGVscCBmaWxsIHRoZSBjb250ZXh0IG1lbnVzIHdpdGggY29udHJpYnV0aW9ucyBmcm9tIHRoZSBFZGl0IG1lbnUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gbWVudU1hbmFnZXIgCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJKChJTWVudUxpc3RlbmVyKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpKS5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogQHJldHVybiAKKwkgKiAgPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7CisJCXJldHVybiAoRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogQHJldHVybiAKKwkgKiAgPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgeworCQlyZXR1cm4gZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3Rpb25CYXJzKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIAorCSAqICA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKKworCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworCisJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKKworCQlpZiAoZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSB0aGlzKSB7CisJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihudWxsKTsKKwkJfQorCisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBvdXRsaW5lIHZpZXcgc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93T3V0bGluZVZpZXcoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJlc2VudGF0aW9uL0dyYXBoQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcmVzZW50YXRpb24vR3JhcGhBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMWZiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJlc2VudGF0aW9uL0dyYXBoQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpAQCAtMCwwICsxLDQ0MyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisvL2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLmFjdGlvbi5Xb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbnRyb2xBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkxvYWRSZXNvdXJjZUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJDb250cmlidXRpb25JdGVtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByZXNlbnRhdGlvbi5Db3JlRWRpdG9yUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBpcyB0aGUgYWN0aW9uIGJhciBjb250cmlidXRvciBmb3IgdGhlIEdyYXBoIG1vZGVsIGVkaXRvci4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgR3JhcGhBY3Rpb25CYXJDb250cmlidXRvcgorCWV4dGVuZHMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yCisJaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3JQYXJ0OworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgYWN0aW9uIG9wZW5zIHRoZSBQcm9wZXJ0aWVzIHZpZXcuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElBY3Rpb24gc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uID0KKwkJbmV3IEFjdGlvbihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW0iKSkgLy8kTk9OLU5MUy0xJAorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQl0cnkgeworCQkJCQlnZXRQYWdlKCkuc2hvd1ZpZXcoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyBhY3Rpb24gcmVmcmVzaGVzIHRoZSB2aWV3ZXIgb2YgdGhlIGN1cnJlbnQgZWRpdG9yIGlmIHRoZSBlZGl0b3IKKwkgKiBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQWN0aW9uIHJlZnJlc2hWaWV3ZXJBY3Rpb24gPQorCQluZXcgQWN0aW9uKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0iKSkgLy8kTk9OLU5MUy0xJAorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKwkJCQlyZXR1cm4gYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcjsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJaWYgKGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKKwkJCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldFZpZXdlcigpOworCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKKwkJCQkJCXZpZXdlci5yZWZyZXNoKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gY29ycmVzcG9uZGluZyB0byBlYWNoIGRlc2NyaXB0b3IKKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBjcmVhdGVDaGlsZEFjdGlvbnM7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZUNoaWxkIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyB3aWxsIGNvbnRhaW4gb25lIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gY29ycmVzcG9uZGluZyB0byBlYWNoIGRlc2NyaXB0b3IKKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBjcmVhdGVTaWJsaW5nQWN0aW9uczsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCBmb3IgQ3JlYXRlU2libGluZyBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBjb250cmlidXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR3JhcGhBY3Rpb25CYXJDb250cmlidXRvcigpIHsKKwkJc3VwZXIoQURESVRJT05TX0xBU1RfU1RZTEUpOworCQlsb2FkUmVzb3VyY2VBY3Rpb24gPSBuZXcgTG9hZFJlc291cmNlQWN0aW9uKCk7CisJCXZhbGlkYXRlQWN0aW9uID0gbmV3IFZhbGlkYXRlQWN0aW9uKCk7CisJCWNvbnRyb2xBY3Rpb24gPSBuZXcgQ29udHJvbEFjdGlvbigpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBTZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zIHRvIHRoZSB0b29sIGJhci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgeworCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiZ3JhcGgtc2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImdyYXBoLWFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB0byB0aGUgbWVudSBiYXIgYSBtZW51IGFuZCBzb21lIHNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMsCisJICogYXMgd2VsbCBhcyB0aGUgc3ViLW1lbnVzIGZvciBvYmplY3QgY3JlYXRpb24gaXRlbXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51TWFuYWdlcik7CisKKwkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR3JhcGhFZGl0b3JfbWVudSIpLCAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoTWVudUlEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlQ2hpbGQgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgorCQkvLworCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVTaWJsaW5nIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KKwkJLy8KKwkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gRm9yY2UgYW4gdXBkYXRlIGJlY2F1c2UgRWNsaXBzZSBoaWRlcyBlbXB0eSBtZW51cyBub3cuCisJCS8vCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcgorCQkJKG5ldyBJTWVudUxpc3RlbmVyKCkgeworCQkJCSBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCQkJCSBtZW51TWFuYWdlci51cGRhdGVBbGwodHJ1ZSk7CisJCQkJIH0KKwkJCSB9KTsKKworCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiBXaGVuIHRoZSBhY3RpdmUgZWRpdG9yIGNoYW5nZXMsIHRoaXMgcmVtZW1iZXJzIHRoZSBjaGFuZ2UgYW5kIHJlZ2lzdGVycyB3aXRoIGl0IGFzIGEgc2VsZWN0aW9uIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBwYXJ0KSB7CisJCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihwYXJ0KTsKKwkJYWN0aXZlRWRpdG9yUGFydCA9IHBhcnQ7CisKKwkJLy8gU3dpdGNoIHRvIHRoZSBuZXcgc2VsZWN0aW9uIHByb3ZpZGVyLgorCQkvLworCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCQl9CisJCWlmIChwYXJ0ID09IG51bGwpIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsKKwkJfQorCQllbHNlIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gcGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKKwkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKworCQkJLy8gRmFrZSBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IHRvIHVwZGF0ZSB0aGUgbWVudXMuCisJCQkvLworCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpICE9IG51bGwpIHsKKwkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn0sCisJICogaGFuZGxpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50fXMgYnkgcXVlcnlpbmcgZm9yIHRoZSBjaGlsZHJlbiBhbmQgc2libGluZ3MKKwkgKiB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZCB1cGRhdGluZyB0aGUgbWVudXMgYWNjb3JkaW5nbHkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJLy8gUmVtb3ZlIGFueSBtZW51IGl0ZW1zIGZvciBvbGQgc2VsZWN0aW9uLgorCQkvLworCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMpOworCQl9CisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucyk7CisJCX0KKworCQkvLyBRdWVyeSB0aGUgbmV3IHNlbGVjdGlvbiBmb3IgYXBwcm9wcmlhdGUgbmV3IGNoaWxkL3NpYmxpbmcgZGVzY3JpcHRvcnMKKwkJLy8KKwkJQ29sbGVjdGlvbjw/PiBuZXdDaGlsZERlc2NyaXB0b3JzID0gbnVsbDsKKwkJQ29sbGVjdGlvbjw/PiBuZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBudWxsOworCisJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7CisJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsKKwkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7CisKKwkJCUVkaXRpbmdEb21haW4gZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKKworCQkJbmV3Q2hpbGREZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgbnVsbCk7CisJCQluZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhudWxsLCBvYmplY3QpOworCQl9CisKKwkJLy8gR2VuZXJhdGUgYWN0aW9ucyBmb3Igc2VsZWN0aW9uOyBwb3B1bGF0ZSBhbmQgcmVkcmF3IHRoZSBtZW51cy4KKwkJLy8KKwkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMobmV3Q2hpbGREZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKKwkJY3JlYXRlU2libGluZ0FjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKG5ld1NpYmxpbmdEZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKKworCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKKwkJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOworCQl9CisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOworCQkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwKKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgeworCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVDaGlsZEFjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYWN0aW9uczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwKKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoQ29sbGVjdGlvbjw/PiBkZXNjcmlwdG9ycywgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJQ29sbGVjdGlvbjxJQWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOworCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgeworCQkJZm9yIChPYmplY3QgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7CisJCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCisJLyoqCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiB3aXRoIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbiwKKwkgKiBieSBpbnNlcnRpbmcgdGhlbSBiZWZvcmUgdGhlIHNwZWNpZmllZCBjb250cmlidXRpb24gaXRlbSA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4uCisJICogSWYgPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGV5IGFyZSBzaW1wbHkgYWRkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248PyBleHRlbmRzIElBY3Rpb24+IGFjdGlvbnMsIFN0cmluZyBjb250cmlidXRpb25JRCkgeworCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKElBY3Rpb24gYWN0aW9uIDogYWN0aW9ucykgeworCQkJCWlmIChjb250cmlidXRpb25JRCAhPSBudWxsKSB7CisJCQkJCW1hbmFnZXIuaW5zZXJ0QmVmb3JlKGNvbnRyaWJ1dGlvbklELCBhY3Rpb24pOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJbWFuYWdlci5hZGQoYWN0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCQorCS8qKgorCSAqIFRoaXMgcmVtb3ZlcyBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gYWxsIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkZXBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zKSB7CisJCWlmIChhY3Rpb25zICE9IG51bGwpIHsKKwkJCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtYW5hZ2VyLmdldEl0ZW1zKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CisJCQkJLy8gTG9vayBpbnRvIFN1YkNvbnRyaWJ1dGlvbkl0ZW1zCisJCQkJLy8KKwkJCQlJQ29udHJpYnV0aW9uSXRlbSBjb250cmlidXRpb25JdGVtID0gaXRlbXNbaV07CisJCQkJd2hpbGUgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBTdWJDb250cmlidXRpb25JdGVtKSB7CisJCQkJCWNvbnRyaWJ1dGlvbkl0ZW0gPSAoKFN1YkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0SW5uZXJJdGVtKCk7CisJCQkJfQorCisJCQkJLy8gRGVsZXRlIHRoZSBBY3Rpb25Db250cmlidXRpb25JdGVtcyB3aXRoIG1hdGNoaW5nIGFjdGlvbi4KKwkJCQkvLworCQkJCWlmIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCQlJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSljb250cmlidXRpb25JdGVtKS5nZXRBY3Rpb24oKTsKKwkJCQkJaWYgKGFjdGlvbnMuY29udGFpbnMoYWN0aW9uKSkgeworCQkJCQkJbWFuYWdlci5yZW1vdmUoY29udHJpYnV0aW9uSXRlbSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgcG9wLXVwIG1lbnUgYmVmb3JlIGl0IGFwcGVhcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQlzdXBlci5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOworCQlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG51bGw7CisKKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOworCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOworCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGluc2VydHMgZ2xvYmFsIGFjdGlvbnMgYmVmb3JlIHRoZSAiYWRkaXRpb25zLWVuZCIgc2VwYXJhdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMtZW5kIiwgbmV3IFNlcGFyYXRvcigidWktYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uKTsgLy8kTk9OLU5MUy0xJAorCisJCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsJCQorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHJlZnJlc2hWaWV3ZXJBY3Rpb24pOyAvLyROT04tTkxTLTEkCisKKwkJc3VwZXIuYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogVGhpcyBlbnN1cmVzIHRoYXQgYSBkZWxldGUgYWN0aW9uIHdpbGwgY2xlYW4gdXAgYWxsIHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBvYmplY3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUFsbFJlZmVyZW5jZXNPbkRlbGV0ZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJlc2VudGF0aW9uL0dyYXBoRWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvZ3JhcGgvcHJlc2VudGF0aW9uL0dyYXBoRWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY4ODUxMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9ncmFwaC9wcmVzZW50YXRpb24vR3JhcGhFZGl0b3IuamF2YQpAQCAtMCwwICsxLDE2NTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Mb2NhbFNlbGVjdGlvblRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TYXZlQXNEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldFBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlZpZXdlclBhbmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLmVkaXRvci5Qcm9ibGVtRWRpdG9yUGFydDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVmFsaWRhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlJdGVtRGVsZWdhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5jZWxsZWRpdG9yLkFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkxvY2FsVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLlZpZXdlckRyYWdBZGFwdGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuVW53cmFwcGluZ1NlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJTWFya2VySGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS52aWV3LkV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVhNSVJlc291cmNlRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLkdyYXBoSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJlc2VudGF0aW9uLkNvcmVFZGl0b3JBZHZpc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJlc2VudGF0aW9uLkNvcmVFZGl0b3JQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQucHJvdmlkZXIuRXhwZXJpbWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcm92aWRlci5Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByb3ZpZGVyLk1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5wcm92aWRlci5QcmVkaWNhdGVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJvdmlkZXIuU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5wcm92aWRlci5TZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLnByb3ZpZGVyLlNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLnByb3ZpZGVyLlRyaWdnZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKKworCisvKioKKyAqIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIEdyYXBoIG1vZGVsIGVkaXRvci4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgR3JhcGhFZGl0b3IKKwlleHRlbmRzIE11bHRpUGFnZUVkaXRvclBhcnQKKwlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluUHJvdmlkZXIsIElTZWxlY3Rpb25Qcm92aWRlciwgSU1lbnVMaXN0ZW5lciwgSVZpZXdlclByb3ZpZGVyLCBJR290b01hcmtlciB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgZWRpdGluZyBkb21haW4gdGhhdCBpcyB1c2VkIHRvIHRyYWNrIGFsbCBjaGFuZ2VzIHRvIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBvbmUgYWRhcHRlciBmYWN0b3J5IHVzZWQgZm9yIHByb3ZpZGluZyB2aWV3cyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNvbnRlbnRPdXRsaW5lUGFnZSBjb250ZW50T3V0bGluZVBhZ2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIGEga2x1ZGdlLi4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBjb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UncyB2aWV3ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgY29udGVudE91dGxpbmVWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBwcm9wZXJ0eSBzaGVldCBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQcm9wZXJ0eVNoZWV0UGFnZSBwcm9wZXJ0eVNoZWV0UGFnZTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHZpZXdlciB0aGF0IHNoYWRvd3MgdGhlIHNlbGVjdGlvbiBpbiB0aGUgY29udGVudCBvdXRsaW5lLgorCSAqIFRoZSBwYXJlbnQgcmVsYXRpb24gbXVzdCBiZSBjb3JyZWN0bHkgZGVmaW5lZCBmb3IgdGhpcyB0byB3b3JrLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmVlVmlld2VyIHNlbGVjdGlvblZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBjb250ZW50IHZpZXdlciwgd2hpY2ggbWF5IGJlIGVpdGhlciBvbmUgb2YgdGhlIHZpZXdlcnMgaW4gdGhlIHBhZ2VzIG9yIHRoZSBjb250ZW50IG91dGxpbmUgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBWaWV3ZXIgY3VycmVudFZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyB0byB3aGljaCBldmVyIHZpZXdlciBpcyBhY3RpdmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9cyB0aGF0IGFyZSBsaXN0ZW5pbmcgdG8gdGhpcyBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZWRpdG9yIGFzIGEgd2hvbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb24gZWRpdG9yU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKKworCS8qKgorCSAqIFRoZSBNYXJrZXJIZWxwZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHdvcmtzcGFjZSByZXNvdXJjZSBtYXJrZXJzIHByZXNlbnRlZAorCSAqIGluIEVjbGlwc2UncyBQcm9ibGVtcyBWaWV3LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXJrZXJIZWxwZXIgbWFya2VySGVscGVyID0gbmV3IEVkaXRVSU1hcmtlckhlbHBlcigpOworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIGZvciB3aGVuIHRoZSBvdXRsaW5lIGJlY29tZXMgYWN0aXZlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyID0KKwkJbmV3IElQYXJ0TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQlpZiAocCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSB7CisJCQkJCWlmICgoKENvbnRlbnRPdXRsaW5lKXApLmdldEN1cnJlbnRQYWdlKCkgPT0gY29udGVudE91dGxpbmVQYWdlKSB7CisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihHcmFwaEVkaXRvci50aGlzKTsKKworCQkJCQkJc2V0Q3VycmVudFZpZXdlcihjb250ZW50T3V0bGluZVZpZXdlcik7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAocCBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpIHsKKwkJCQkJaWYgKCgoUHJvcGVydHlTaGVldClwKS5nZXRDdXJyZW50UGFnZSgpID09IHByb3BlcnR5U2hlZXRQYWdlKSB7CisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihHcmFwaEVkaXRvci50aGlzKTsKKwkJCQkJCWhhbmRsZUFjdGl2YXRlKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAocCA9PSBHcmFwaEVkaXRvci50aGlzKSB7CisJCQkJCWhhbmRsZUFjdGl2YXRlKCk7CisJCQkJfQorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCX07CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBzYXZlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gc2F2ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogTWFwIHRvIHN0b3JlIHRoZSBkaWFnbm9zdGljIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+IHJlc291cmNlVG9EaWFnbm9zdGljTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+KCk7CisKKwkvKioKKwkgKiBDb250cm9scyB3aGV0aGVyIHRoZSBwcm9ibGVtIGluZGljYXRpb24gc2hvdWxkIGJlIHVwZGF0ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOworCisJLyoqCisJICogQWRhcHRlciB1c2VkIHRvIHVwZGF0ZSB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHdoZW4gcmVzb3VyY2VzIGFyZSBkZW1hbmRlZCBsb2FkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEVDb250ZW50QWRhcHRlciBwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIgPSAKKwkJbmV3IEVDb250ZW50QWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKKwkJCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJlc291cmNlLmNsYXNzKSkgeworCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEOgorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fRVJST1JTOgorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fV0FSTklOR1M6IHsKKwkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKKwkJCQkJCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgbnVsbCk7CisJCQkJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgZGlhZ25vc3RpYyk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5yZW1vdmUocmVzb3VyY2UpOworCQkJCQkJCX0KKworCQkJCQkJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgeworCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQkJCQkJCQkJCSB9CisJCQkJCQkJCQkgfSk7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCQkJfQorCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsKKwkJCQliYXNpY1NldFRhcmdldCh0YXJnZXQpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHVuc2V0VGFyZ2V0KFJlc291cmNlIHRhcmdldCkgeworCQkJCWJhc2ljVW5zZXRUYXJnZXQodGFyZ2V0KTsKKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyBmb3Igd29ya3NwYWNlIGNoYW5nZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPQorCQluZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7CisJCQkJdHJ5IHsKKwkJCQkJY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgeworCQkJCQkJcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpOworCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworCQkJCQkJCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgeworCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgfHwKKwkJCQkJCQkJICAgIGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIGRlbHRhLmdldEZsYWdzKCkgIT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUykgeworCQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShkZWx0YS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpLCBmYWxzZSk7CisJCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworCQkJCQkJCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgeworCQkJCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWVsc2UgaWYgKCFzYXZlZFJlc291cmNlcy5yZW1vdmUocmVzb3VyY2UpKSB7CisJCQkJCQkJCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCX0KKworCQkJCQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldENoYW5nZWRSZXNvdXJjZXMoKSB7CisJCQkJCQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7CisJCQkJCQl9CisKKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRSZW1vdmVkUmVzb3VyY2VzKCkgeworCQkJCQkJCXJldHVybiByZW1vdmVkUmVzb3VyY2VzOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJZmluYWwgUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOworCQkJCQlkZWx0YS5hY2NlcHQodmlzaXRvcik7CisKKwkJCQkJaWYgKCF2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJIHJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsKKwkJCQkJCQkJCSBpZiAoIWlzRGlydHkoKSkgeworCQkJCQkJCQkJCSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKEdyYXBoRWRpdG9yLnRoaXMsIGZhbHNlKTsKKwkJCQkJCQkJCSB9CisJCQkJCQkJCSB9CisJCQkJCQkJIH0pOworCQkJCQl9CisKKwkJCQkJaWYgKCF2aXNpdG9yLmdldENoYW5nZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJIGNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKKwkJCQkJCQkJCSBpZiAoZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSBHcmFwaEVkaXRvci50aGlzKSB7CisJCQkJCQkJCQkJIGhhbmRsZUFjdGl2YXRlKCk7CisJCQkJCQkJCQkgfQorCQkJCQkJCQkgfQorCQkJCQkJCSB9KTsKKwkJCQkJfQorCQkJCX0KKwkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBIYW5kbGVzIGFjdGl2YXRpb24gb2YgdGhlIGVkaXRvciBvciBpdCdzIGFzc29jaWF0ZWQgdmlld3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoKSB7CisJCS8vIFJlY29tcHV0ZSB0aGUgcmVhZCBvbmx5IHN0YXRlLgorCQkvLworCQlpZiAoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKSAhPSBudWxsKSB7CisJCSAgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKS5jbGVhcigpOworCisJCSAgLy8gUmVmcmVzaCBhbnkgYWN0aW9ucyB0aGF0IG1heSBiZWNvbWUgZW5hYmxlZCBvciBkaXNhYmxlZC4KKwkJICAvLworCQkgIHNldFNlbGVjdGlvbihnZXRTZWxlY3Rpb24oKSk7CisJCX0KKworCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7CisJCQlpZiAoaGFuZGxlRGlydHlDb25mbGljdCgpKSB7CisJCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihHcmFwaEVkaXRvci50aGlzLCBmYWxzZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZW1vdmVkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOworCQkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7CisJCQljaGFuZ2VkUmVzb3VyY2VzLnJlbW92ZUFsbChzYXZlZFJlc291cmNlcyk7CisJCQloYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCk7CisJCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOworCQl9CisJfQorCisJLyoqCisJICogSGFuZGxlcyB3aGF0IHRvIGRvIHdpdGggY2hhbmdlZCByZXNvdXJjZXMgb24gYWN0aXZhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCkgeworCQlpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpICYmICghaXNEaXJ0eSgpIHx8IGhhbmRsZURpcnR5Q29uZmxpY3QoKSkpIHsKKwkJCWlmIChpc0RpcnR5KCkpIHsKKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpOworCQkJfQorCQkJZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOworCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOworCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGNoYW5nZWRSZXNvdXJjZXMpIHsKKwkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgeworCQkJCQlyZXNvdXJjZS51bmxvYWQoKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKKwkJCQkJfQorCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQlpZiAoIXJlc291cmNlVG9EaWFnbm9zdGljTWFwLmNvbnRhaW5zS2V5KHJlc291cmNlKSkgeworCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluLmlzU3RhbGUoZWRpdG9yU2VsZWN0aW9uKSkgeworCQkJCXNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKKwkJCX0KKworCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOworCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJfQorCX0KKyAgCisJLyoqCisJICogVXBkYXRlcyB0aGUgcHJvYmxlbXMgaW5kaWNhdGlvbiB3aXRoIHRoZSBpbmZvcm1hdGlvbiBkZXNjcmliZWQgaW4gdGhlIHNwZWNpZmllZCBkaWFnbm9zdGljLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCkgeworCQlpZiAodXBkYXRlUHJvYmxlbUluZGljYXRpb24pIHsKKwkJCUJhc2ljRGlhZ25vc3RpYyBkaWFnbm9zdGljID0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLk9LLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5lZGl0b3IiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgbnVsbCwKKwkJCQkJIG5ldyBPYmplY3QgW10geyBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkgfSk7CisJCQlmb3IgKERpYWdub3N0aWMgY2hpbGREaWFnbm9zdGljIDogcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAudmFsdWVzKCkpIHsKKwkJCQlpZiAoY2hpbGREaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQlkaWFnbm9zdGljLmFkZChjaGlsZERpYWdub3N0aWMpOworCQkJCX0KKwkJCX0KKworCQkJaW50IGxhc3RFZGl0b3JQYWdlID0gZ2V0UGFnZUNvdW50KCkgLSAxOworCQkJaWYgKGxhc3RFZGl0b3JQYWdlID49IDAgJiYgZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSBpbnN0YW5jZW9mIFByb2JsZW1FZGl0b3JQYXJ0KSB7CisJCQkJKChQcm9ibGVtRWRpdG9yUGFydClnZXRFZGl0b3IobGFzdEVkaXRvclBhZ2UpKS5zZXREaWFnbm9zdGljKGRpYWdub3N0aWMpOworCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQlzZXRBY3RpdmVQYWdlKGxhc3RFZGl0b3JQYWdlKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCVByb2JsZW1FZGl0b3JQYXJ0IHByb2JsZW1FZGl0b3JQYXJ0ID0gbmV3IFByb2JsZW1FZGl0b3JQYXJ0KCk7CisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsKKwkJCQlwcm9ibGVtRWRpdG9yUGFydC5zZXRNYXJrZXJIZWxwZXIobWFya2VySGVscGVyKTsKKwkJCQl0cnkgeworCQkJCQlhZGRQYWdlKCsrbGFzdEVkaXRvclBhZ2UsIHByb2JsZW1FZGl0b3JQYXJ0LCBnZXRFZGl0b3JJbnB1dCgpKTsKKwkJCQkJc2V0UGFnZVRleHQobGFzdEVkaXRvclBhZ2UsIHByb2JsZW1FZGl0b3JQYXJ0LmdldFBhcnROYW1lKCkpOworCQkJCQlzZXRBY3RpdmVQYWdlKGxhc3RFZGl0b3JQYWdlKTsKKwkJCQkJc2hvd1RhYnMoKTsKKwkJCQl9CisJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKworCQkJaWYgKG1hcmtlckhlbHBlci5oYXNNYXJrZXJzKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSkpIHsKKwkJCQltYXJrZXJIZWxwZXIuZGVsZXRlTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQl0cnkgeworCQkJCQkJbWFya2VySGVscGVyLmNyZWF0ZU1hcmtlcnMoZGlhZ25vc3RpYyk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQlDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogU2hvd3MgYSBkaWFsb2cgdGhhdCBhc2tzIGlmIGNvbmZsaWN0aW5nIGNoYW5nZXMgc2hvdWxkIGJlIGRpc2NhcmRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkgeworCQlyZXR1cm4KKwkJCU1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uCisJCQkJKGdldFNpdGUoKS5nZXRTaGVsbCgpLAorCQkJCSBnZXRTdHJpbmcoIl9VSV9GaWxlQ29uZmxpY3RfbGFiZWwiKSwgLy8kTk9OLU5MUy0xJAorCQkJCSBnZXRTdHJpbmcoIl9XQVJOX0ZpbGVDb25mbGljdCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhIG1vZGVsIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR3JhcGhFZGl0b3IoKSB7CisJCXN1cGVyKCk7CisJCWluaXRpYWxpemVFZGl0aW5nRG9tYWluKCk7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHVwIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1vZGVsIGVkaXRvci4gPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFZGl0aW5nRG9tYWluKCkgeworCQlpbml0aWFsaXplRWRpdGluZ0RvbWFpbkdlbigpOworCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKQorCQkJCS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIioiLAorCQkJCQkJU1RFTVhNSVJlc291cmNlRmFjdG9yeUltcGwuSU5TVEFOQ0UpOworCisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpCisJCQkJLmdldFByb3RvY29sVG9GYWN0b3J5TWFwKCkucHV0KCJwbGF0Zm9ybSIsCisJCQkJCQlTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbC5JTlNUQU5DRSk7CisJfSAvLyBpbml0aWFsaXplRWRpdGluZ0RvbWFpbgorCQorCS8qKgorCSAqIFRoaXMgc2V0cyB1cCB0aGUgZWRpdGluZyBkb21haW4gZm9yIHRoZSBtb2RlbCBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVkaXRpbmdEb21haW5HZW4oKSB7CisJCS8vIENyZWF0ZSBhbiBhZGFwdGVyIGZhY3RvcnkgdGhhdCB5aWVsZHMgaXRlbSBwcm92aWRlcnMuCisJCS8vCisJCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5EZXNjcmlwdG9yLlJlZ2lzdHJ5LklOU1RBTkNFKTsKKworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IENvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRXhwZXJpbWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RpZmllckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUHJlZGljYXRlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBUcmlnZ2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTb2x2ZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlIGV4ZWN1dGVkLgorCQkvLworCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKKworCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLgorCQkvLworCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIKKwkJCShuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7CisJCQkJIHB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsKKwkJCQkJIGdldENvbnRhaW5lcigpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCSAobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCSAgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkgIGZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKKworCQkJCQkJCQkgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuCisJCQkJCQkJCSAgLy8KKwkJCQkJCQkJICBDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spZXZlbnQuZ2V0U291cmNlKCkpLmdldE1vc3RSZWNlbnRDb21tYW5kKCk7CisJCQkJCQkJCSAgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKKwkJCQkJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOworCQkJCQkJCQkgIH0KKwkJCQkJCQkJICBpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCAmJiAhcHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgeworCQkJCQkJCQkJICBwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7CisJCQkJCQkJCSAgfQorCQkJCQkJCSAgfQorCQkJCQkJICB9KTsKKwkJCQkgfQorCQkJIH0pOworCisJCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KKwkJLy8KKwkJZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywgbmV3IEhhc2hNYXA8UmVzb3VyY2UsIEJvb2xlYW4+KCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgaGVyZSBmb3IgdGhlIGxpc3RlbmVyIHRvIGJlIGFibGUgdG8gY2FsbCBpdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoaW50IGFjdGlvbikgeworCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UoYWN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdGhlIHNlbGVjdGlvbiBpbnRvIHdoaWNoZXZlciB2aWV3ZXIgaXMgYWN0aXZlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgeworCQlmaW5hbCBDb2xsZWN0aW9uPD8+IHRoZVNlbGVjdGlvbiA9IGNvbGxlY3Rpb247CisJCS8vIE1ha2Ugc3VyZSBpdCdzIG9rYXkuCisJCS8vCisJCWlmICh0aGVTZWxlY3Rpb24gIT0gbnVsbCAmJiAhdGhlU2VsZWN0aW9uLmlzRW1wdHkoKSkgeworCQkJUnVubmFibGUgcnVubmFibGUgPQorCQkJCW5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgY29udGVudCB2aWV3ZXIgb2YgdGhlIGVkaXRvci4KKwkJCQkJCS8vCisJCQkJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7CisJCQkJCQkJY3VycmVudFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhlU2VsZWN0aW9uLnRvQXJyYXkoKSksIHRydWUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfTsKKwkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMocnVubmFibGUpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSBlZGl0aW5nIGRvbWFpbiBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElFZGl0aW5nRG9tYWluUHJvdmlkZXJ9IGludGVyZmFjZS4KKwkgKiBUaGlzIGlzIGltcG9ydGFudCBmb3IgaW1wbGVtZW50aW5nIHRoZSBzdGF0aWMgbWV0aG9kcyBvZiB7QGxpbmsgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWlufQorCSAqIGFuZCBmb3Igc3VwcG9ydGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb259LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7CisJCXJldHVybiBlZGl0aW5nRG9tYWluOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBjbGFzcyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciB7CisJCXB1YmxpYyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwkJfQorCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIHBhcmVudCAhPSBudWxsOworCQl9CisKKwkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ha2VzIHN1cmUgdGhhdCBvbmUgY29udGVudCB2aWV3ZXIsIGVpdGhlciBmb3IgdGhlIGN1cnJlbnQgcGFnZSBvciB0aGUgb3V0bGluZSB2aWV3LCBpZiBpdCBoYXMgZm9jdXMsCisJICogaXMgdGhlIGN1cnJlbnQgb25lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRWaWV3ZXIoVmlld2VyIHZpZXdlcikgeworCQkvLyBJZiBpdCBpcyBjaGFuZ2luZy4uLgorCQkvLworCQlpZiAoY3VycmVudFZpZXdlciAhPSB2aWV3ZXIpIHsKKwkJCWlmIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgeworCQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgb24gZGVtYW5kLgorCQkJCS8vCisJCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0KKwkJCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQkJCQkvLyBUaGlzIGp1c3Qgbm90aWZpZXMgdGhvc2UgdGhpbmdzIHRoYXQgYXJlIGFmZmVjdGVkIGJ5IHRoZSBzZWN0aW9uLgorCQkJCQkJLy8KKwkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHNlbGVjdGlvbkNoYW5nZWRFdmVudCkgeworCQkJCQkJCXNldFNlbGVjdGlvbihzZWxlY3Rpb25DaGFuZ2VkRXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQkJfQorCQkJCQl9OworCQkJfQorCisJCQkvLyBTdG9wIGxpc3RlbmluZyB0byB0aGUgb2xkIG9uZS4KKwkJCS8vCisJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7CisJCQkJY3VycmVudFZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKKwkJCX0KKworCQkJLy8gU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXcgb25lLgorCQkJLy8KKwkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgeworCQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKKwkJCX0KKworCQkJLy8gUmVtZW1iZXIgaXQuCisJCQkvLworCQkJY3VycmVudFZpZXdlciA9IHZpZXdlcjsKKworCQkJLy8gU2V0IHRoZSBlZGl0b3JzIHNlbGVjdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCB2aWV3ZXIncyBzZWxlY3Rpb24uCisJCQkvLworCQkJc2V0U2VsZWN0aW9uKGN1cnJlbnRWaWV3ZXIgPT0gbnVsbCA/IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkgOiBjdXJyZW50Vmlld2VyLmdldFNlbGVjdGlvbigpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgdmlld2VyIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSVZpZXdlclByb3ZpZGVyfSBpbnRlcmZhY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7CisJCXJldHVybiBjdXJyZW50Vmlld2VyOworCX0KKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlciBhbmQgYWRkcyBhIGxpc3RlbmVyIGFzIHdlbGwgcmVnaXN0ZXJpbmcgdGhlIG1lbnUgZm9yIGV4dGVuc2lvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKKwkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOworCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7CisJCU1lbnUgbWVudT0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7CisJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKKwkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUsIHZpZXdlcik7CisKKwkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTks7CisJCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCksIExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OworCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgVmlld2VyRHJhZ0FkYXB0ZXIodmlld2VyKSk7CisJCXZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7CisJfSAvLyBjcmVhdGVDb250ZXh0TWVudUZvcgorCQorCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlciBhbmQgYWRkcyBhIGxpc3RlbmVyIGFzIHdlbGwgcmVnaXN0ZXJpbmcgdGhlIG1lbnUgZm9yIGV4dGVuc2lvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvckdlbihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgeworCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQKKwkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7CisJCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKKwkJTWVudSBtZW51PSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKKwkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOworCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgbmV3IFVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcih2aWV3ZXIpKTsKKworCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSzsKKwkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OworCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgVmlld2VyRHJhZ0FkYXB0ZXIodmlld2VyKSk7CisJCXZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIGNhbGxlZCB0byBsb2FkIGEgcmVzb3VyY2UgaW50byB0aGUgZWRpdGluZyBkb21haW4ncyByZXNvdXJjZSBzZXQgYmFzZWQgb24gdGhlIGVkaXRvcidzIGlucHV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZU1vZGVsKCkgeworCQlVUkkgcmVzb3VyY2VVUkkgPSBFZGl0VUlVdGlsLmdldFVSSShnZXRFZGl0b3JJbnB1dCgpKTsKKwkJRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCS8vIExvYWQgdGhlIHJlc291cmNlIHRocm91Z2ggdGhlIGVkaXRpbmcgZG9tYWluLgorCQkJLy8KKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCB0cnVlKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWV4Y2VwdGlvbiA9IGU7CisJCQlyZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgZmFsc2UpOworCQl9CisKKwkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbik7CisJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCAgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQl9CisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5hZGQocHJvYmxlbUluZGljYXRpb25BZGFwdGVyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgZGlhZ25vc3RpYyBkZXNjcmliaW5nIHRoZSBlcnJvcnMgYW5kIHdhcm5pbmdzIGxpc3RlZCBpbiB0aGUgcmVzb3VyY2UKKwkgKiBhbmQgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gKGlmIGFueSkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERpYWdub3N0aWMgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMoUmVzb3VyY2UgcmVzb3VyY2UsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJaWYgKCFyZXNvdXJjZS5nZXRFcnJvcnMoKS5pc0VtcHR5KCkgfHwgIXJlc291cmNlLmdldFdhcm5pbmdzKCkuaXNFbXB0eSgpKSB7CisJCQlCYXNpY0RpYWdub3N0aWMgYmFzaWNEaWFnbm9zdGljID0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5lZGl0b3IiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZXhjZXB0aW9uID09IG51bGwgPyAoT2JqZWN0KXJlc291cmNlIDogZXhjZXB0aW9uIH0pOworCQkJYmFzaWNEaWFnbm9zdGljLm1lcmdlKEVjb3JlVXRpbC5jb21wdXRlRGlhZ25vc3RpYyhyZXNvdXJjZSwgdHJ1ZSkpOworCQkJcmV0dXJuIGJhc2ljRGlhZ25vc3RpYzsKKwkJfQorCQllbHNlIGlmIChleGNlcHRpb24gIT0gbnVsbCkgeworCQkJcmV0dXJuCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZWRpdG9yIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkgMCwKKwkJCQkJIGdldFN0cmluZygiX1VJX0NyZWF0ZU1vZGVsRXJyb3JfbWVzc2FnZSIsIHJlc291cmNlLmdldFVSSSgpKSwgLy8kTk9OLU5MUy0xJAorCQkJCQkgbmV3IE9iamVjdFtdIHsgZXhjZXB0aW9uIH0pOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIERpYWdub3N0aWMuT0tfSU5TVEFOQ0U7CisJCX0KKwl9CisKKworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBpbnN0YWxsIHlvdXIgb3duIGNvbnRyb2xzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlcygpIHsKKwkJLy8gQ3JlYXRlcyB0aGUgbW9kZWwgZnJvbSB0aGUgZWRpdG9yIGlucHV0CisJCS8vCisJCWNyZWF0ZU1vZGVsKCk7CisKKwkJLy8gT25seSBjcmVhdGVzIHRoZSBvdGhlciBwYWdlcyBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhhdCBjYW4gYmUgZWRpdGVkCisJCS8vCisJCWlmICghZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgc2VsZWN0aW9uIHRyZWUgdmlldy4KKwkJCS8vCisJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShnZXRDb250YWluZXIoKSwgU1dULk1VTFRJKTsKKwkJCXNlbGVjdGlvblZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOworCQkJc2V0Q3VycmVudFZpZXdlcihzZWxlY3Rpb25WaWV3ZXIpOworCisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJLy9zZWxlY3Rpb25WaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKTsKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCisJCQluZXcgQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yKHNlbGVjdGlvblZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsKKworCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Ioc2VsZWN0aW9uVmlld2VyKTsKKwkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHRyZWUpOworCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisKKwkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJIHNldEFjdGl2ZVBhZ2UoMCk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJLy8gRW5zdXJlcyB0aGF0IHRoaXMgZWRpdG9yIHdpbGwgb25seSBkaXNwbGF5IHRoZSBwYWdlJ3MgdGFiCisJCS8vIGFyZWEgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgcGFnZQorCQkvLworCQlnZXRDb250YWluZXIoKS5hZGRDb250cm9sTGlzdGVuZXIKKwkJCShuZXcgQ29udHJvbEFkYXB0ZXIoKSB7CisJCQkJYm9vbGVhbiBndWFyZCA9IGZhbHNlOworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBldmVudCkgeworCQkJCQlpZiAoIWd1YXJkKSB7CisJCQkJCQlndWFyZCA9IHRydWU7CisJCQkJCQloaWRlVGFicygpOworCQkJCQkJZ3VhcmQgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCSB9KTsKKworCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQkJCSB9CisJCQkgfSk7CisJfSAvLyBjcmVhdGVQYWdlcworCQorCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gaW5zdGFsbCB5b3VyIG93biBjb250cm9scy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlc0dlbigpIHsKKwkJLy8gQ3JlYXRlcyB0aGUgbW9kZWwgZnJvbSB0aGUgZWRpdG9yIGlucHV0CisJCS8vCisJCWNyZWF0ZU1vZGVsKCk7CisKKwkJLy8gT25seSBjcmVhdGVzIHRoZSBvdGhlciBwYWdlcyBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhhdCBjYW4gYmUgZWRpdGVkCisJCS8vCisJCWlmICghZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgc2VsZWN0aW9uIHRyZWUgdmlldy4KKwkJCS8vCisJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShnZXRDb250YWluZXIoKSwgU1dULk1VTFRJKTsKKwkJCXNlbGVjdGlvblZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOworCQkJc2V0Q3VycmVudFZpZXdlcihzZWxlY3Rpb25WaWV3ZXIpOworCisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKworCQkJbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcihzZWxlY3Rpb25WaWV3ZXIuZ2V0VHJlZSgpLCBhZGFwdGVyRmFjdG9yeSk7CisKKwkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHNlbGVjdGlvblZpZXdlcik7CisJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh0cmVlKTsKKwkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCSBzZXRBY3RpdmVQYWdlKDApOworCQkJCQkgfQorCQkJCSB9KTsKKwkJfQorCisJCS8vIEVuc3VyZXMgdGhhdCB0aGlzIGVkaXRvciB3aWxsIG9ubHkgZGlzcGxheSB0aGUgcGFnZSdzIHRhYgorCQkvLyBhcmVhIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHBhZ2UKKwkJLy8KKwkJZ2V0Q29udGFpbmVyKCkuYWRkQ29udHJvbExpc3RlbmVyCisJCQkobmV3IENvbnRyb2xBZGFwdGVyKCkgeworCQkJCWJvb2xlYW4gZ3VhcmQgPSBmYWxzZTsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsKKwkJCQkJaWYgKCFndWFyZCkgeworCQkJCQkJZ3VhcmQgPSB0cnVlOworCQkJCQkJaGlkZVRhYnMoKTsKKwkJCQkJCWd1YXJkID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkgfSk7CisKKwkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkgfQorCQkJIH0pOworCX0KKwkKKwkvKioKKwkgKiBJZiB0aGVyZSBpcyBqdXN0IG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LAorCSAqIHRoaXMgaGlkZXMgdGhlIHNpbmdsZSB0YWIgYXQgdGhlIGJvdHRvbS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoaWRlVGFicygpIHsKKwkJaWYgKGdldFBhZ2VDb3VudCgpIDw9IDEpIHsKKwkJCXNldFBhZ2VUZXh0KDAsICIiKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgeworCQkJCSgoQ1RhYkZvbGRlcilnZXRDb250YWluZXIoKSkuc2V0VGFiSGVpZ2h0KDEpOworCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOworCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSArIDYpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LAorCSAqIHRoaXMgc2hvd3MgdGhlIHRhYnMgYXQgdGhlIGJvdHRvbS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzaG93VGFicygpIHsKKwkJaWYgKGdldFBhZ2VDb3VudCgpID4gMSkgeworCQkJc2V0UGFnZVRleHQoMCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgeworCQkJCSgoQ1RhYkZvbGRlcilnZXRDb250YWluZXIoKSkuc2V0VGFiSGVpZ2h0KFNXVC5ERUZBVUxUKTsKKwkJCQlQb2ludCBwb2ludCA9IGdldENvbnRhaW5lcigpLmdldFNpemUoKTsKKwkJCQlnZXRDb250YWluZXIoKS5zZXRTaXplKHBvaW50LngsIHBvaW50LnkgLSA2KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdXNlZCB0byB0cmFjayB0aGUgYWN0aXZlIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBwYWdlSW5kZXgpIHsKKwkJc3VwZXIucGFnZUNoYW5nZShwYWdlSW5kZXgpOworCisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgIT0gbnVsbCkgeworCQkJaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oY29udGVudE91dGxpbmVQYWdlLmdldFNlbGVjdGlvbigpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgaG93IHRoZSBmcmFtZXdvcmsgZGV0ZXJtaW5lcyB3aGljaCBpbnRlcmZhY2VzIHdlIGltcGxlbWVudC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgeworCQlpZiAoa2V5LmVxdWFscyhJQ29udGVudE91dGxpbmVQYWdlLmNsYXNzKSkgeworCQkJcmV0dXJuIHNob3dPdXRsaW5lVmlldygpID8gZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgOiBudWxsOworCQl9CisJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzKSkgeworCQkJcmV0dXJuIGdldFByb3BlcnR5U2hlZXRQYWdlKCk7CisJCX0KKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhJR290b01hcmtlci5jbGFzcykpIHsKKwkJCXJldHVybiB0aGlzOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoa2V5KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgYWNjZXNzZXMgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUgY29udGVudCBvdXRsaW5lci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSUNvbnRlbnRPdXRsaW5lUGFnZSBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSB7CisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgPT0gbnVsbCkgeworCQkJLy8gVGhlIGNvbnRlbnQgb3V0bGluZSBpcyBqdXN0IGEgdHJlZS4KKwkJCS8vCisJCQljbGFzcyBNeUNvbnRlbnRPdXRsaW5lUGFnZSBleHRlbmRzIENvbnRlbnRPdXRsaW5lUGFnZSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCQkJCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKworCQkJCQkvLyBTZXQgdXAgdGhlIHRyZWUgdmlld2VyLgorCQkJCQkvLworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCisJCQkJCS8vIE1ha2Ugc3VyZSBvdXIgcG9wdXBzIHdvcmsuCisJCQkJCS8vCisJCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKGNvbnRlbnRPdXRsaW5lVmlld2VyKTsKKworCQkJCQlpZiAoIWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCQkJICAvLyBTZWxlY3QgdGhlIHJvb3Qgb2JqZWN0IGluIHRoZSB2aWV3LgorCQkJCQkgIC8vCisJCQkJCSAgY29udGVudE91dGxpbmVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIG1ha2VDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwgSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLCBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsKKwkJCQkJc3VwZXIubWFrZUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLCBzdGF0dXNMaW5lTWFuYWdlcik7CisJCQkJCWNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXIgPSBzdGF0dXNMaW5lTWFuYWdlcjsKKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKKwkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKKwkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7CisJCQkJfQorCQkJfQorCisJCQljb250ZW50T3V0bGluZVBhZ2UgPSBuZXcgTXlDb250ZW50T3V0bGluZVBhZ2UoKTsKKworCQkJLy8gTGlzdGVuIHRvIHNlbGVjdGlvbiBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgaXQgaXMgYSBzcGVjaWFsIHdheS4KKwkJCS8vCisJCQljb250ZW50T3V0bGluZVBhZ2UuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCisJCQkJKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJCQkgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2UgaGFuZGxlIHNlbGVjdGlvbnMgY29ycmVjdGx5LgorCQkJCQkgLy8KKwkJCQkJIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJCQkgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQkgfQorCQkJCSB9KTsKKwkJfQorCisJCXJldHVybiBjb250ZW50T3V0bGluZVBhZ2U7CisJfQorCisJLyoqCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBwcm9wZXJ0eSBzaGVldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVByb3BlcnR5U2hlZXRQYWdlIGdldFByb3BlcnR5U2hlZXRQYWdlKCkgeworCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgPT0gbnVsbCkgeworCQkJcHJvcGVydHlTaGVldFBhZ2UgPQorCQkJCW5ldyBFeHRlbmRlZFByb3BlcnR5U2hlZXRQYWdlKGVkaXRpbmdEb21haW4pIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKExpc3Q8Pz4gc2VsZWN0aW9uKSB7CisJCQkJCQlHcmFwaEVkaXRvci50aGlzLnNldFNlbGVjdGlvblRvVmlld2VyKHNlbGVjdGlvbik7CisJCQkJCQlHcmFwaEVkaXRvci50aGlzLnNldEZvY3VzKCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisJCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7CisJCQkJCX0KKwkJCQl9OworCQkJcHJvcGVydHlTaGVldFBhZ2Uuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJfQorCisJCXJldHVybiBwcm9wZXJ0eVNoZWV0UGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGRlYWxzIHdpdGggaG93IHdlIHdhbnQgc2VsZWN0aW9uIGluIHRoZSBvdXRsaW5lciB0byBhZmZlY3QgdGhlIG90aGVyIHZpZXdzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWlmIChzZWxlY3Rpb25WaWV3ZXIgIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJSXRlcmF0b3I8Pz4gc2VsZWN0ZWRFbGVtZW50cyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5pdGVyYXRvcigpOworCQkJaWYgKHNlbGVjdGVkRWxlbWVudHMuaGFzTmV4dCgpKSB7CisJCQkJLy8gR2V0IHRoZSBmaXJzdCBzZWxlY3RlZCBlbGVtZW50LgorCQkJCS8vCisJCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHMubmV4dCgpOworCisJCQkJQXJyYXlMaXN0PE9iamVjdD4gc2VsZWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudCk7CisJCQkJd2hpbGUgKHNlbGVjdGVkRWxlbWVudHMuaGFzTmV4dCgpKSB7CisJCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudHMubmV4dCgpKTsKKwkJCQl9CisKKwkJCQkvLyBTZXQgdGhlIHNlbGVjdGlvbiB0byB0aGUgd2lkZ2V0LgorCQkJCS8vCisJCQkJc2VsZWN0aW9uVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb25MaXN0KSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHRlc3RzIHRoZSBjb21tYW5kIHN0YWNrLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7CisJCXJldHVybiAoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLmlzU2F2ZU5lZWRlZCgpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSUVkaXRvclBhcnR9IGFuZCBzaW1wbHkgc2F2ZXMgdGhlIG1vZGVsIGZpbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisJCS8vIFNhdmUgb25seSByZXNvdXJjZXMgdGhhdCBoYXZlIGFjdHVhbGx5IGNoYW5nZWQuCisJCS8vCisJCWZpbmFsIE1hcDxPYmplY3QsIE9iamVjdD4gc2F2ZU9wdGlvbnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKKwkJc2F2ZU9wdGlvbnMucHV0KFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRCwgUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOworCisJCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtiZW5jaC4KKwkJLy8KKwkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9CisJCQluZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgeworCQkJCS8vIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IGdldHMgaW52b2tlZCB3aGVuIHRoZSBvcGVyYXRpb24gcnVucy4KKwkJCQkvLworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJCS8vIFNhdmUgdGhlIHJlc291cmNlcyB0byB0aGUgZmlsZSBzeXN0ZW0uCisJCQkJCS8vCisJCQkJCWJvb2xlYW4gZmlyc3QgPSB0cnVlOworCQkJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKSB7CisJCQkJCQlpZiAoKGZpcnN0IHx8ICFyZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSB8fCBpc1BlcnNpc3RlZChyZXNvdXJjZSkpICYmICFlZGl0aW5nRG9tYWluLmlzUmVhZE9ubHkocmVzb3VyY2UpKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJbG9uZyB0aW1lU3RhbXAgPSByZXNvdXJjZS5nZXRUaW1lU3RhbXAoKTsKKwkJCQkJCQkJcmVzb3VyY2Uuc2F2ZShzYXZlT3B0aW9ucyk7CisJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUaW1lU3RhbXAoKSAhPSB0aW1lU3RhbXApIHsKKwkJCQkJCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCQkJCQkJfQorCQkJCQkJCWZpcnN0ID0gZmFsc2U7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9OworCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisJCXRyeSB7CisJCQkvLyBUaGlzIHJ1bnMgdGhlIG9wdGlvbnMsIGFuZCBzaG93cyBwcm9ncmVzcy4KKwkJCS8vCisJCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7CisKKwkJCS8vIFJlZnJlc2ggdGhlIG5lY2Vzc2FyeSBzdGF0ZS4KKwkJCS8vCisJCQkoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLnNhdmVJc0RvbmUoKTsKKwkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgdGhhdCBzaG91bGRuJ3QuCisJCQkvLworCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHdoZXRoZXIgc29tZXRoaW5nIGhhcyBiZWVuIHBlcnNpc3RlZCB0byB0aGUgVVJJIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisJICogVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIFVSSSBjb252ZXJ0ZXIgZnJvbSB0aGUgZWRpdG9yJ3MgcmVzb3VyY2Ugc2V0IHRvIHRyeSB0byBvcGVuIGFuIGlucHV0IHN0cmVhbS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNQZXJzaXN0ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbShyZXNvdXJjZS5nZXRVUkkoKSk7CisJCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKKwkJCQlyZXN1bHQgPSB0cnVlOworCQkJCXN0cmVhbS5jbG9zZSgpOworCQkJfQorCQl9CisJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBJZ25vcmUKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgdHJ1ZSBiZWNhdXNlIGl0IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogVGhpcyBhbHNvIGNoYW5nZXMgdGhlIGVkaXRvcidzIGlucHV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgeworCQlTYXZlQXNEaWFsb2cgc2F2ZUFzRGlhbG9nID0gbmV3IFNhdmVBc0RpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7CisJCXNhdmVBc0RpYWxvZy5vcGVuKCk7CisJCUlQYXRoIHBhdGggPSBzYXZlQXNEaWFsb2cuZ2V0UmVzdWx0KCk7CisJCWlmIChwYXRoICE9IG51bGwpIHsKKwkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7CisJCQlpZiAoZmlsZSAhPSBudWxsKSB7CisJCQkJZG9TYXZlQXMoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpLCBuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGRvU2F2ZUFzKFVSSSB1cmksIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgeworCQkoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSkuc2V0VVJJKHVyaSk7CisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7CisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7CisJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0KKwkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpICE9IG51bGwgPworCQkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpIDoKKwkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworCQlkb1NhdmUocHJvZ3Jlc3NNb25pdG9yKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7CisJCXRyeSB7CisJCQlpZiAobWFya2VyLmdldFR5cGUoKS5lcXVhbHMoRVZhbGlkYXRvci5NQVJLRVIpKSB7CisJCQkJU3RyaW5nIHVyaUF0dHJpYnV0ZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoRVZhbGlkYXRvci5VUklfQVRUUklCVVRFLCBudWxsKTsKKwkJCQlpZiAodXJpQXR0cmlidXRlICE9IG51bGwpIHsKKwkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpQXR0cmlidXRlKTsKKwkJCQkJRU9iamVjdCBlT2JqZWN0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldEVPYmplY3QodXJpLCB0cnVlKTsKKwkJCQkJaWYgKGVPYmplY3QgIT0gbnVsbCkgeworCQkJCQkgIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zLnNpbmdsZXRvbihlZGl0aW5nRG9tYWluLmdldFdyYXBwZXIoZU9iamVjdCkpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgc3RhcnR1cC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgeworCQlzZXRTaXRlKHNpdGUpOworCQlzZXRJbnB1dFdpdGhOb3RpZnkoZWRpdG9ySW5wdXQpOworCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOworCQlzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKHRoaXMpOworCQlzaXRlLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgeworCQlnZXRDb250cm9sKGdldEFjdGl2ZVBhZ2UoKSkuc2V0Rm9jdXMoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHJldHVybiB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKKwkJcmV0dXJuIGVkaXRvclNlbGVjdGlvbjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byBzZXQgdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4KKwkgKiBDYWxsaW5nIHRoaXMgcmVzdWx0IHdpbGwgbm90aWZ5IHRoZSBsaXN0ZW5lcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWVkaXRvclNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKworCQlmb3IgKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgOiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzKSB7CisJCQlsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7CisJCX0KKwkJc2V0U3RhdHVzTGluZU1hbmFnZXIoc2VsZWN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXNMaW5lTWFuYWdlcihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBjdXJyZW50Vmlld2VyICE9IG51bGwgJiYgY3VycmVudFZpZXdlciA9PSBjb250ZW50T3V0bGluZVZpZXdlciA/CisJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyIDogZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7CisKKwkJaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJCUNvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS50b0xpc3QoKTsKKwkJCQlzd2l0Y2ggKGNvbGxlY3Rpb24uc2l6ZSgpKSB7CisJCQkJCWNhc2UgMDogeworCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9Ob09iamVjdFNlbGVjdGVkIikpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIDE6IHsKKwkJCQkJCVN0cmluZyB0ZXh0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcihhZGFwdGVyRmFjdG9yeSkuZ2V0VGV4dChjb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQiLCB0ZXh0KSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWRlZmF1bHQ6IHsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTXVsdGlPYmplY3RTZWxlY3RlZCIsIEludGVnZXIudG9TdHJpbmcoY29sbGVjdGlvbi5zaXplKCkpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZSgiIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gdGhlIHBsdWdpbidzIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7CisJCXJldHVybiBDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXkpOworCX0KKworCS8qKgorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gcGx1Z2luLnByb3BlcnRpZXMsIG1ha2luZyBhIHN1YnN0aXR1dGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgeworCQlyZXR1cm4gQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5LCBuZXcgT2JqZWN0IFtdIHsgczEgfSk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcn0gdG8gaGVscCBmaWxsIHRoZSBjb250ZXh0IG1lbnVzIHdpdGggY29udHJpYnV0aW9ucyBmcm9tIHRoZSBFZGl0IG1lbnUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQkoKElNZW51TGlzdGVuZXIpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkpLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpIHsKKwkJcmV0dXJuIChFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKSB7CisJCXJldHVybiBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGlvbkJhcnMoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7CisJCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOworCisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOworCisJCWdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7CisKKwkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOworCisJCWlmIChnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGl2ZUVkaXRvcigpID09IHRoaXMpIHsKKwkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKG51bGwpOworCQl9CisKKwkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKKwkJCXByb3BlcnR5U2hlZXRQYWdlLmRpc3Bvc2UoKTsKKwkJfQorCisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgIT0gbnVsbCkgeworCQkJY29udGVudE91dGxpbmVQYWdlLmRpc3Bvc2UoKTsKKwkJfQorCisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG91dGxpbmUgdmlldyBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHNob3dPdXRsaW5lVmlldygpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9wcmVzZW50YXRpb24vTW9kZWxBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3ByZXNlbnRhdGlvbi9Nb2RlbEFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3MmMzYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9wcmVzZW50YXRpb24vTW9kZWxBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCkBAIC0wLDAgKzEsNDQzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKy8vaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuYWN0aW9uLldvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29udHJvbEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YkNvbnRyaWJ1dGlvbkl0ZW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJlc2VudGF0aW9uLkNvcmVFZGl0b3JQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZvciB0aGUgTW9kZWwgbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBNb2RlbEFjdGlvbkJhckNvbnRyaWJ1dG9yCisJZXh0ZW5kcyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IKKwlpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvclBhcnQ7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBhY3Rpb24gb3BlbnMgdGhlIFByb3BlcnRpZXMgdmlldy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUFjdGlvbiBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24gPQorCQluZXcgQWN0aW9uKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbSIpKSAvLyROT04tTkxTLTEkCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCXRyeSB7CisJCQkJCWdldFBhZ2UoKS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIGFjdGlvbiByZWZyZXNoZXMgdGhlIHZpZXdlciBvZiB0aGUgY3VycmVudCBlZGl0b3IgaWYgdGhlIGVkaXRvcgorCSAqIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElBY3Rpb24gcmVmcmVzaFZpZXdlckFjdGlvbiA9CisJCW5ldyBBY3Rpb24oQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbSIpKSAvLyROT04tTkxTLTEkCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworCQkJCXJldHVybiBhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlpZiAoYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgeworCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpYWN0aXZlRWRpdG9yUGFydCkuZ2V0Vmlld2VyKCk7CisJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgeworCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcgorCSAqIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZUNoaWxkQWN0aW9uczsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCBmb3IgQ3JlYXRlQ2hpbGQgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcgorCSAqIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZVNpYmxpbmdBY3Rpb25zOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVTaWJsaW5nIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvbnRyaWJ1dG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNb2RlbEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgeworCQlzdXBlcihBRERJVElPTlNfTEFTVF9TVFlMRSk7CisJCWxvYWRSZXNvdXJjZUFjdGlvbiA9IG5ldyBMb2FkUmVzb3VyY2VBY3Rpb24oKTsKKwkJdmFsaWRhdGVBY3Rpb24gPSBuZXcgVmFsaWRhdGVBY3Rpb24oKTsKKwkJY29udHJvbEFjdGlvbiA9IG5ldyBDb250cm9sQWN0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIFNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMgdG8gdGhlIHRvb2wgYmFyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7CisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJtb2RlbC1zZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAorCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigibW9kZWwtYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHRvIHRoZSBtZW51IGJhciBhIG1lbnUgYW5kIHNvbWUgc2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucywKKwkgKiBhcyB3ZWxsIGFzIHRoZSBzdWItbWVudXMgZm9yIG9iamVjdCBjcmVhdGlvbiBpdGVtcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQlzdXBlci5jb250cmlidXRlVG9NZW51KG1lbnVNYW5hZ2VyKTsKKworCQlJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Nb2RlbEVkaXRvcl9tZW51IiksICJvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWxNZW51SUQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhY3Rpb25zIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucy1lbmQiKSk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVDaGlsZCBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCisJCS8vCisJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIFByZXBhcmUgZm9yIENyZWF0ZVNpYmxpbmcgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgorCQkvLworCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBGb3JjZSBhbiB1cGRhdGUgYmVjYXVzZSBFY2xpcHNlIGhpZGVzIGVtcHR5IG1lbnVzIG5vdy4KKwkJLy8KKwkJc3VibWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyCisJCQkobmV3IElNZW51TGlzdGVuZXIoKSB7CisJCQkJIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJCQkJIG1lbnVNYW5hZ2VyLnVwZGF0ZUFsbCh0cnVlKTsKKwkJCQkgfQorCQkJIH0pOworCisJCWFkZEdsb2JhbEFjdGlvbnMoc3VibWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIFdoZW4gdGhlIGFjdGl2ZSBlZGl0b3IgY2hhbmdlcywgdGhpcyByZW1lbWJlcnMgdGhlIGNoYW5nZSBhbmQgcmVnaXN0ZXJzIHdpdGggaXQgYXMgYSBzZWxlY3Rpb24gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHBhcnQpIHsKKwkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOworCQlhY3RpdmVFZGl0b3JQYXJ0ID0gcGFydDsKKworCQkvLyBTd2l0Y2ggdG8gdGhlIG5ldyBzZWxlY3Rpb24gcHJvdmlkZXIuCisJCS8vCisJCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCX0KKwkJaWYgKHBhcnQgPT0gbnVsbCkgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOworCQl9CisJCWVsc2UgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBwYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOworCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCQkvLyBGYWtlIGEgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgdG8gdXBkYXRlIHRoZSBtZW51cy4KKwkJCS8vCisJCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkgeworCQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfSwKKwkgKiBoYW5kbGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnR9cyBieSBxdWVyeWluZyBmb3IgdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncworCSAqIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZWxlY3RlZCBvYmplY3QgYW5kIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uCisJCS8vCisJCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7CisJCX0KKwkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsKKwkJfQorCisJCS8vIFF1ZXJ5IHRoZSBuZXcgc2VsZWN0aW9uIGZvciBhcHByb3ByaWF0ZSBuZXcgY2hpbGQvc2libGluZyBkZXNjcmlwdG9ycworCQkvLworCQlDb2xsZWN0aW9uPD8+IG5ld0NoaWxkRGVzY3JpcHRvcnMgPSBudWxsOworCQlDb2xsZWN0aW9uPD8+IG5ld1NpYmxpbmdEZXNjcmlwdG9ycyA9IG51bGw7CisKKwkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5zaXplKCkgPT0gMSkgeworCQkJT2JqZWN0IG9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKKworCQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpYWN0aXZlRWRpdG9yUGFydCkuZ2V0RWRpdGluZ0RvbWFpbigpOworCisJCQluZXdDaGlsZERlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMob2JqZWN0LCBudWxsKTsKKwkJCW5ld1NpYmxpbmdEZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG51bGwsIG9iamVjdCk7CisJCX0KKworCQkvLyBHZW5lcmF0ZSBhY3Rpb25zIGZvciBzZWxlY3Rpb247IHBvcHVsYXRlIGFuZCByZWRyYXcgdGhlIG1lbnVzLgorCQkvLworCQljcmVhdGVDaGlsZEFjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhuZXdDaGlsZERlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOworCQljcmVhdGVTaWJsaW5nQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMobmV3U2libGluZ0Rlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOworCisJCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOworCQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7CisJCX0KKwkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7CisJCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LAorCSAqIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMoQ29sbGVjdGlvbjw/PiBkZXNjcmlwdG9ycywgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJQ29sbGVjdGlvbjxJQWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOworCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgeworCQkJZm9yIChPYmplY3QgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7CisJCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZUNoaWxkQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwgZGVzY3JpcHRvcikpOworCQkJfQorCQl9CisJCXJldHVybiBhY3Rpb25zOworCX0KKworCS8qKgorCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LAorCSAqIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7CisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7CisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlU2libGluZ0FjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYWN0aW9uczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IHdpdGgge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMKKwkgKiBiYXNlZCBvbiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLAorCSAqIGJ5IGluc2VydGluZyB0aGVtIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGNvbnRyaWJ1dGlvbiBpdGVtIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPi4KKwkgKiBJZiA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZXkgYXJlIHNpbXBseSBhZGRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucywgU3RyaW5nIGNvbnRyaWJ1dGlvbklEKSB7CisJCWlmIChhY3Rpb25zICE9IG51bGwpIHsKKwkJCWZvciAoSUFjdGlvbiBhY3Rpb24gOiBhY3Rpb25zKSB7CisJCQkJaWYgKGNvbnRyaWJ1dGlvbklEICE9IG51bGwpIHsKKwkJCQkJbWFuYWdlci5pbnNlcnRCZWZvcmUoY29udHJpYnV0aW9uSUQsIGFjdGlvbik7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQltYW5hZ2VyLmFkZChhY3Rpb24pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkJCisJLyoqCisJICogVGhpcyByZW1vdmVzIGZyb20gdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMKKwkgKiBiYXNlZCBvbiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGRlcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248PyBleHRlbmRzIElBY3Rpb24+IGFjdGlvbnMpIHsKKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgeworCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0SXRlbXMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKKwkJCQkvLyBMb29rIGludG8gU3ViQ29udHJpYnV0aW9uSXRlbXMKKwkJCQkvLworCQkJCUlDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbkl0ZW0gPSBpdGVtc1tpXTsKKwkJCQl3aGlsZSAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIHsKKwkJCQkJY29udHJpYnV0aW9uSXRlbSA9ICgoU3ViQ29udHJpYnV0aW9uSXRlbSljb250cmlidXRpb25JdGVtKS5nZXRJbm5lckl0ZW0oKTsKKwkJCQl9CisKKwkJCQkvLyBEZWxldGUgdGhlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1zIHdpdGggbWF0Y2hpbmcgYWN0aW9uLgorCQkJCS8vCisJCQkJaWYgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7CisJCQkJCUlBY3Rpb24gYWN0aW9uID0gKChBY3Rpb25Db250cmlidXRpb25JdGVtKWNvbnRyaWJ1dGlvbkl0ZW0pLmdldEFjdGlvbigpOworCQkJCQlpZiAoYWN0aW9ucy5jb250YWlucyhhY3Rpb24pKSB7CisJCQkJCQltYW5hZ2VyLnJlbW92ZShjb250cmlidXRpb25JdGVtKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBwb3AtdXAgbWVudSBiZWZvcmUgaXQgYXBwZWFycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7CisJCU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbnVsbDsKKworCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7CisJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZWRpdCIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7CisJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZWRpdCIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgaW5zZXJ0cyBnbG9iYWwgYWN0aW9ucyBiZWZvcmUgdGhlICJhZGRpdGlvbnMtZW5kIiBzZXBhcmF0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucy1lbmQiLCBuZXcgU2VwYXJhdG9yKCJ1aS1hY3Rpb25zIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24pOyAvLyROT04tTkxTLTEkCisKKwkJcmVmcmVzaFZpZXdlckFjdGlvbi5zZXRFbmFibGVkKHJlZnJlc2hWaWV3ZXJBY3Rpb24uaXNFbmFibGVkKCkpOwkJCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgcmVmcmVzaFZpZXdlckFjdGlvbik7IC8vJE5PTi1OTFMtMSQKKworCQlzdXBlci5hZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGVuc3VyZXMgdGhhdCBhIGRlbGV0ZSBhY3Rpb24gd2lsbCBjbGVhbiB1cCBhbGwgcmVmZXJlbmNlcyB0byBkZWxldGVkIG9iamVjdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlQWxsUmVmZXJlbmNlc09uRGVsZXRlKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9wcmVzZW50YXRpb24vTW9kZWxFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9tb2RlbC9wcmVzZW50YXRpb24vTW9kZWxFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjMzY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGVsL3ByZXNlbnRhdGlvbi9Nb2RlbEVkaXRvci5qYXZhCkBAIC0wLDAgKzEsMTY1OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7CisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkxvY2FsU2VsZWN0aW9uVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKKworLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNhdmVBc0RpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuTWFya2VySGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVmlld2VyUGFuZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuZWRpdG9yLlByb2JsZW1FZGl0b3JQYXJ0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5SZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmNlbGxlZGl0b3IuQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuTG9jYWxUcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuVmlld2VyRHJhZ0FkYXB0ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5VbndyYXBwaW5nU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlNYXJrZXJIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnZpZXcuRXh0ZW5kZWRQcm9wZXJ0eVNoZWV0UGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcmVzZW50YXRpb24uQ29yZUVkaXRvckFkdmlzb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcmVzZW50YXRpb24uQ29yZUVkaXRvclBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJvdmlkZXIuQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5wcm92aWRlci5FeHBlcmltZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLkdyYXBoSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXIuTW9kaWZpZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByb3ZpZGVyLlByZWRpY2F0ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5wcm92aWRlci5TY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLnByb3ZpZGVyLlNlcXVlbmNlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIucHJvdmlkZXIuU29sdmVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIucHJvdmlkZXIuVHJpZ2dlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOworCisKKy8qKgorICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgTW9kZWwgbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBNb2RlbEVkaXRvcgorCWV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydAorCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5Qcm92aWRlciwgSVNlbGVjdGlvblByb3ZpZGVyLCBJTWVudUxpc3RlbmVyLCBJVmlld2VyUHJvdmlkZXIsIElHb3RvTWFya2VyIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBlZGl0aW5nIGRvbWFpbiB0aGF0IGlzIHVzZWQgdG8gdHJhY2sgYWxsIGNoYW5nZXMgdG8gdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG9uZSBhZGFwdGVyIGZhY3RvcnkgdXNlZCBmb3IgcHJvdmlkaW5nIHZpZXdzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQ29udGVudE91dGxpbmVQYWdlIGNvbnRlbnRPdXRsaW5lUGFnZTsKKworCS8qKgorCSAqIFRoaXMgaXMgYSBrbHVkZ2UuLi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVN0YXR1c0xpbmVNYW5hZ2VyIGNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZSdzIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBjb250ZW50T3V0bGluZVZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHByb3BlcnR5IHNoZWV0IHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFByb3BlcnR5U2hlZXRQYWdlIHByb3BlcnR5U2hlZXRQYWdlOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdmlld2VyIHRoYXQgc2hhZG93cyB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb250ZW50IG91dGxpbmUuCisJICogVGhlIHBhcmVudCByZWxhdGlvbiBtdXN0IGJlIGNvcnJlY3RseSBkZWZpbmVkIGZvciB0aGlzIHRvIHdvcmsuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgc2VsZWN0aW9uVmlld2VyOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGNvbnRlbnQgdmlld2VyLCB3aGljaCBtYXkgYmUgZWl0aGVyIG9uZSBvZiB0aGUgdmlld2VycyBpbiB0aGUgcGFnZXMgb3IgdGhlIGNvbnRlbnQgb3V0bGluZSB2aWV3ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFZpZXdlciBjdXJyZW50Vmlld2VyOworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIHRvIHdoaWNoIGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn1zIHRoYXQgYXJlIGxpc3RlbmluZyB0byB0aGlzIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPigpOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgc2VsZWN0aW9uIG9mIHRoZSBlZGl0b3IgYXMgYSB3aG9sZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBlZGl0b3JTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOworCisJLyoqCisJICogVGhlIE1hcmtlckhlbHBlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgd29ya3NwYWNlIHJlc291cmNlIG1hcmtlcnMgcHJlc2VudGVkCisJICogaW4gRWNsaXBzZSdzIFByb2JsZW1zIFZpZXcuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1hcmtlckhlbHBlciBtYXJrZXJIZWxwZXIgPSBuZXcgRWRpdFVJTWFya2VySGVscGVyKCk7CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdoZW4gdGhlIG91dGxpbmUgYmVjb21lcyBhY3RpdmUKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPQorCQluZXcgSVBhcnRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCWlmIChwIGluc3RhbmNlb2YgQ29udGVudE91dGxpbmUpIHsKKwkJCQkJaWYgKCgoQ29udGVudE91dGxpbmUpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBjb250ZW50T3V0bGluZVBhZ2UpIHsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKE1vZGVsRWRpdG9yLnRoaXMpOworCisJCQkJCQlzZXRDdXJyZW50Vmlld2VyKGNvbnRlbnRPdXRsaW5lVmlld2VyKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChwIGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgeworCQkJCQlpZiAoKChQcm9wZXJ0eVNoZWV0KXApLmdldEN1cnJlbnRQYWdlKCkgPT0gcHJvcGVydHlTaGVldFBhZ2UpIHsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKE1vZGVsRWRpdG9yLnRoaXMpOworCQkJCQkJaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChwID09IE1vZGVsRWRpdG9yLnRoaXMpIHsKKwkJCQkJaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQl9CisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIHNpbmNlIGxhc3QgYWN0aXZhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHNhdmVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBzYXZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBNYXAgdG8gc3RvcmUgdGhlIGRpYWdub3N0aWMgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4gcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4oKTsKKworCS8qKgorCSAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiBzaG91bGQgYmUgdXBkYXRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisKKwkvKioKKwkgKiBBZGFwdGVyIHVzZWQgdG8gdXBkYXRlIHRoZSBwcm9ibGVtIGluZGljYXRpb24gd2hlbiByZXNvdXJjZXMgYXJlIGRlbWFuZGVkIGxvYWRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUNvbnRlbnRBZGFwdGVyIHByb2JsZW1JbmRpY2F0aW9uQWRhcHRlciA9IAorCQluZXcgRUNvbnRlbnRBZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBSZXNvdXJjZSkgeworCQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVzb3VyY2UuY2xhc3MpKSB7CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQ6CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19FUlJPUlM6CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19XQVJOSU5HUzogeworCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOworCQkJCQkJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBudWxsKTsKKwkJCQkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBkaWFnbm9zdGljKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnJlbW92ZShyZXNvdXJjZSk7CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKSB7CisJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCQkJCQkJCQkJIH0KKwkJCQkJCQkJCSB9KTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJCQl9CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VGFyZ2V0KFJlc291cmNlIHRhcmdldCkgeworCQkJCWJhc2ljU2V0VGFyZ2V0KHRhcmdldCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgdW5zZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7CisJCQkJYmFzaWNVbnNldFRhcmdldCh0YXJnZXQpOworCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIGZvciB3b3Jrc3BhY2UgY2hhbmdlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9CisJCW5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKKwkJCQl0cnkgeworCQkJCQljbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7CisJCQkJCQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7CisJCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisJCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CisJCQkJCQkJaWYgKGRlbHRhLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7CisJCQkJCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCB8fAorCQkJCQkJCQkgICAgZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgZGVsdGEuZ2V0RmxhZ3MoKSAhPSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSB7CisJCQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGRlbHRhLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIGZhbHNlKTsKKwkJCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisJCQkJCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7CisJCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJZWxzZSBpZiAoIXNhdmVkUmVzb3VyY2VzLnJlbW92ZShyZXNvdXJjZSkpIHsKKwkJCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJfQorCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsKKwkJCQkJCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlczsKKwkJCQkJCX0KKworCQkJCQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlbW92ZWRSZXNvdXJjZXMoKSB7CisJCQkJCQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlmaW5hbCBSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpdG9yKCk7CisJCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKKworCQkJCQlpZiAoIXZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkgcmVtb3ZlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkpOworCQkJCQkJCQkJIGlmICghaXNEaXJ0eSgpKSB7CisJCQkJCQkJCQkJIGdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoTW9kZWxFZGl0b3IudGhpcywgZmFsc2UpOworCQkJCQkJCQkJIH0KKwkJCQkJCQkJIH0KKwkJCQkJCQkgfSk7CisJCQkJCX0KKworCQkJCQlpZiAoIXZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOworCQkJCQkJCQkJIGlmIChnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpID09IE1vZGVsRWRpdG9yLnRoaXMpIHsKKwkJCQkJCQkJCQkgaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQkJCQkJCSB9CisJCQkJCQkJCSB9CisJCQkJCQkJIH0pOworCQkJCQl9CisJCQkJfQorCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIEhhbmRsZXMgYWN0aXZhdGlvbiBvZiB0aGUgZWRpdG9yIG9yIGl0J3MgYXNzb2NpYXRlZCB2aWV3cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0ZSgpIHsKKwkJLy8gUmVjb21wdXRlIHRoZSByZWFkIG9ubHkgc3RhdGUuCisJCS8vCisJCWlmIChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpICE9IG51bGwpIHsKKwkJICBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpLmNsZWFyKCk7CisKKwkJICAvLyBSZWZyZXNoIGFueSBhY3Rpb25zIHRoYXQgbWF5IGJlY29tZSBlbmFibGVkIG9yIGRpc2FibGVkLgorCQkgIC8vCisJCSAgc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKKwkJfQorCisJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCWlmIChoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpIHsKKwkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKE1vZGVsRWRpdG9yLnRoaXMsIGZhbHNlKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCWNoYW5nZWRSZXNvdXJjZXMucmVtb3ZlQWxsKHNhdmVkUmVzb3VyY2VzKTsKKwkJCWhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKTsKKwkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBIYW5kbGVzIHdoYXQgdG8gZG8gd2l0aCBjaGFuZ2VkIHJlc291cmNlcyBvbiBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKSB7CisJCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkgJiYgKCFpc0RpcnR5KCkgfHwgaGFuZGxlRGlydHlDb25mbGljdCgpKSkgeworCQkJaWYgKGlzRGlydHkoKSkgeworCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSk7CisJCQl9CisJCQllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7CisKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgeworCQkJCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKSB7CisJCQkJCXJlc291cmNlLnVubG9hZCgpOworCQkJCQl0cnkgeworCQkJCQkJcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOworCQkJCQl9CisJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCWlmICghcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAuY29udGFpbnNLZXkocmVzb3VyY2UpKSB7CisJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4uaXNTdGFsZShlZGl0b3JTZWxlY3Rpb24pKSB7CisJCQkJc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOworCQkJfQorCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQl9CisJfQorICAKKwkvKioKKwkgKiBVcGRhdGVzIHRoZSBwcm9ibGVtcyBpbmRpY2F0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWVkIGRpYWdub3N0aWMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKSB7CisJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgeworCQkJQmFzaWNEaWFnbm9zdGljIGRpYWdub3N0aWMgPQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMKKwkJCQkJKERpYWdub3N0aWMuT0ssCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmVkaXRvciIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJIDAsCisJCQkJCSBudWxsLAorCQkJCQkgbmV3IE9iamVjdCBbXSB7IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSB9KTsKKwkJCWZvciAoRGlhZ25vc3RpYyBjaGlsZERpYWdub3N0aWMgOiByZXNvdXJjZVRvRGlhZ25vc3RpY01hcC52YWx1ZXMoKSkgeworCQkJCWlmIChjaGlsZERpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCWRpYWdub3N0aWMuYWRkKGNoaWxkRGlhZ25vc3RpYyk7CisJCQkJfQorCQkJfQorCisJCQlpbnQgbGFzdEVkaXRvclBhZ2UgPSBnZXRQYWdlQ291bnQoKSAtIDE7CisJCQlpZiAobGFzdEVkaXRvclBhZ2UgPj0gMCAmJiBnZXRFZGl0b3IobGFzdEVkaXRvclBhZ2UpIGluc3RhbmNlb2YgUHJvYmxlbUVkaXRvclBhcnQpIHsKKwkJCQkoKFByb2JsZW1FZGl0b3JQYXJ0KWdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkpLnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7CisJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCXNldEFjdGl2ZVBhZ2UobGFzdEVkaXRvclBhZ2UpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJUHJvYmxlbUVkaXRvclBhcnQgcHJvYmxlbUVkaXRvclBhcnQgPSBuZXcgUHJvYmxlbUVkaXRvclBhcnQoKTsKKwkJCQlwcm9ibGVtRWRpdG9yUGFydC5zZXREaWFnbm9zdGljKGRpYWdub3N0aWMpOworCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldE1hcmtlckhlbHBlcihtYXJrZXJIZWxwZXIpOworCQkJCXRyeSB7CisJCQkJCWFkZFBhZ2UoKytsYXN0RWRpdG9yUGFnZSwgcHJvYmxlbUVkaXRvclBhcnQsIGdldEVkaXRvcklucHV0KCkpOworCQkJCQlzZXRQYWdlVGV4dChsYXN0RWRpdG9yUGFnZSwgcHJvYmxlbUVkaXRvclBhcnQuZ2V0UGFydE5hbWUoKSk7CisJCQkJCXNldEFjdGl2ZVBhZ2UobGFzdEVkaXRvclBhZ2UpOworCQkJCQlzaG93VGFicygpOworCQkJCX0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfQorCisJCQlpZiAobWFya2VySGVscGVyLmhhc01hcmtlcnMoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKSkgeworCQkJCW1hcmtlckhlbHBlci5kZWxldGVNYXJrZXJzKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCXRyeSB7CisJCQkJCQltYXJrZXJIZWxwZXIuY3JlYXRlTWFya2VycyhkaWFnbm9zdGljKTsKKwkJCQkJfQorCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBTaG93cyBhIGRpYWxvZyB0aGF0IGFza3MgaWYgY29uZmxpY3RpbmcgY2hhbmdlcyBzaG91bGQgYmUgZGlzY2FyZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZURpcnR5Q29uZmxpY3QoKSB7CisJCXJldHVybgorCQkJTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24KKwkJCQkoZ2V0U2l0ZSgpLmdldFNoZWxsKCksCisJCQkJIGdldFN0cmluZygiX1VJX0ZpbGVDb25mbGljdF9sYWJlbCIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1dBUk5fRmlsZUNvbmZsaWN0IikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGEgbW9kZWwgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNb2RlbEVkaXRvcigpIHsKKwkJc3VwZXIoKTsKKwkJaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdXAgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgbW9kZWwgZWRpdG9yLiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKSB7CisJCWluaXRpYWxpemVFZGl0aW5nRG9tYWluR2VuKCk7CisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpCisJCQkJLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgiKiIsCisJCQkJCQlTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbC5JTlNUQU5DRSk7CisKKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkKKwkJCQkuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKS5wdXQoInBsYXRmb3JtIiwKKwkJCQkJCVNURU1YTUlSZXNvdXJjZUZhY3RvcnlJbXBsLklOU1RBTkNFKTsKKwl9IC8vIGluaXRpYWxpemVFZGl0aW5nRG9tYWluCisJCisJLyoqCisJICogVGhpcyBzZXRzIHVwIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1vZGVsIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWRpdGluZ0RvbWFpbkdlbigpIHsKKwkJLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlpZWxkcyBpdGVtIHByb3ZpZGVycy4KKwkJLy8KKwkJYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOworCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBFeHBlcmltZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBHcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBQcmVkaWNhdGVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFRyaWdnZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKworCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUgZXhlY3V0ZWQuCisJCS8vCisJCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOworCisJCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCisJCS8vCisJCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcgorCQkJKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKKwkJCQkgcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgeworCQkJCQkgZ2V0Q29udGFpbmVyKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJIChuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJICBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCSAgZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworCisJCQkJCQkJCSAgLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KKwkJCQkJCQkJICAvLworCQkJCQkJCQkgIENvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaylldmVudC5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsKKwkJCQkJCQkJICBpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgeworCQkJCQkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihtb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7CisJCQkJCQkJCSAgfQorCQkJCQkJCQkgIGlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsICYmICFwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQkJCQkgIHByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsKKwkJCQkJCQkJICB9CisJCQkJCQkJICB9CisJCQkJCQkgIH0pOworCQkJCSB9CisJCQkgfSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgorCQkvLworCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgQm9vbGVhbj4oKSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBoZXJlIGZvciB0aGUgbGlzdGVuZXIgdG8gYmUgYWJsZSB0byBjYWxsIGl0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgYWN0aW9uKSB7CisJCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShhY3Rpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgc2V0cyB0aGUgc2VsZWN0aW9uIGludG8gd2hpY2hldmVyIHZpZXdlciBpcyBhY3RpdmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisJCWZpbmFsIENvbGxlY3Rpb248Pz4gdGhlU2VsZWN0aW9uID0gY29sbGVjdGlvbjsKKwkJLy8gTWFrZSBzdXJlIGl0J3Mgb2theS4KKwkJLy8KKwkJaWYgKHRoZVNlbGVjdGlvbiAhPSBudWxsICYmICF0aGVTZWxlY3Rpb24uaXNFbXB0eSgpKSB7CisJCQlSdW5uYWJsZSBydW5uYWJsZSA9CisJCQkJbmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBpdGVtcyBpbiB0aGUgY3VycmVudCBjb250ZW50IHZpZXdlciBvZiB0aGUgZWRpdG9yLgorCQkJCQkJLy8KKwkJCQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKKwkJCQkJCQljdXJyZW50Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0aGVTZWxlY3Rpb24udG9BcnJheSgpKSwgdHJ1ZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9OworCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGVkaXRpbmcgZG9tYWluIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSUVkaXRpbmdEb21haW5Qcm92aWRlcn0gaW50ZXJmYWNlLgorCSAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBpbXBsZW1lbnRpbmcgdGhlIHN0YXRpYyBtZXRob2RzIG9mIHtAbGluayBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW59CisJICogYW5kIGZvciBzdXBwb3J0aW5nIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKKwkJcmV0dXJuIGVkaXRpbmdEb21haW47CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGNsYXNzIFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsKKwkJcHVibGljIFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCQl9CisKKwkJcHVibGljIE9iamVjdCBbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7CisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7CisJCQlyZXR1cm4gKHBhcmVudCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhcmVudCkpLnRvQXJyYXkoKTsKKwkJfQorCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7CisJCQlyZXR1cm4gcGFyZW50ICE9IG51bGw7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG9uZSBjb250ZW50IHZpZXdlciwgZWl0aGVyIGZvciB0aGUgY3VycmVudCBwYWdlIG9yIHRoZSBvdXRsaW5lIHZpZXcsIGlmIGl0IGhhcyBmb2N1cywKKwkgKiBpcyB0aGUgY3VycmVudCBvbmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q3VycmVudFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7CisJCS8vIElmIGl0IGlzIGNoYW5naW5nLi4uCisJCS8vCisJCWlmIChjdXJyZW50Vmlld2VyICE9IHZpZXdlcikgeworCQkJaWYgKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7CisJCQkJLy8gQ3JlYXRlIHRoZSBsaXN0ZW5lciBvbiBkZW1hbmQuCisJCQkJLy8KKwkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPQorCQkJCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCQkJCS8vIFRoaXMganVzdCBub3RpZmllcyB0aG9zZSB0aGluZ3MgdGhhdCBhcmUgYWZmZWN0ZWQgYnkgdGhlIHNlY3Rpb24uCisJCQkJCQkvLworCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgc2VsZWN0aW9uQ2hhbmdlZEV2ZW50KSB7CisJCQkJCQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkNoYW5nZWRFdmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCQl9CisJCQkJCX07CisJCQl9CisKKwkJCS8vIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBvbGQgb25lLgorCQkJLy8KKwkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKKwkJCQljdXJyZW50Vmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOworCQkJfQorCisJCQkvLyBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG5ldyBvbmUuCisJCQkvLworCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7CisJCQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOworCQkJfQorCisJCQkvLyBSZW1lbWJlciBpdC4KKwkJCS8vCisJCQljdXJyZW50Vmlld2VyID0gdmlld2VyOworCisJCQkvLyBTZXQgdGhlIGVkaXRvcnMgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdlcidzIHNlbGVjdGlvbi4KKwkJCS8vCisJCQlzZXRTZWxlY3Rpb24oY3VycmVudFZpZXdlciA9PSBudWxsID8gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSA6IGN1cnJlbnRWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSB2aWV3ZXIgYXMgcmVxdWlyZWQgYnkgdGhlIHtAbGluayBJVmlld2VyUHJvdmlkZXJ9IGludGVyZmFjZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKKwkJcmV0dXJuIGN1cnJlbnRWaWV3ZXI7CisJfQorCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGEgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyIGFuZCBhZGRzIGEgbGlzdGVuZXIgYXMgd2VsbCByZWdpc3RlcmluZyB0aGUgbWVudSBmb3IgZXh0ZW5zaW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgeworCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQKKwkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7CisJCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKKwkJTWVudSBtZW51PSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKKwkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOworCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgdmlld2VyKTsKKworCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSzsKKwkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKSwgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07CisJCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKKwkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKKwl9IC8vIGNyZWF0ZUNvbnRleHRNZW51Rm9yCisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIgYW5kIGFkZHMgYSBsaXN0ZW5lciBhcyB3ZWxsIHJlZ2lzdGVyaW5nIHRoZSBtZW51IGZvciBleHRlbnNpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3JHZW4oU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKKwkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOworCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7CisJCU1lbnUgbWVudT0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7CisJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKKwkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUsIG5ldyBVbndyYXBwaW5nU2VsZWN0aW9uUHJvdmlkZXIodmlld2VyKSk7CisKKwkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTks7CisJCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKKwkJdmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyYWdBZGFwdGVyKHZpZXdlcikpOworCQl2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyKGVkaXRpbmdEb21haW4sIHZpZXdlcikpOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgY2FsbGVkIHRvIGxvYWQgYSByZXNvdXJjZSBpbnRvIHRoZSBlZGl0aW5nIGRvbWFpbidzIHJlc291cmNlIHNldCBiYXNlZCBvbiB0aGUgZWRpdG9yJ3MgaW5wdXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlTW9kZWwoKSB7CisJCVVSSSByZXNvdXJjZVVSSSA9IEVkaXRVSVV0aWwuZ2V0VVJJKGdldEVkaXRvcklucHV0KCkpOworCQlFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworCQl0cnkgeworCQkJLy8gTG9hZCB0aGUgcmVzb3VyY2UgdGhyb3VnaCB0aGUgZWRpdGluZyBkb21haW4uCisJCQkvLworCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIHRydWUpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZXhjZXB0aW9uID0gZTsKKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCBmYWxzZSk7CisJCX0KKworCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKTsKKwkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsICBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCX0KKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBkaWFnbm9zdGljIGRlc2NyaWJpbmcgdGhlIGVycm9ycyBhbmQgd2FybmluZ3MgbGlzdGVkIGluIHRoZSByZXNvdXJjZQorCSAqIGFuZCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiAoaWYgYW55KS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGlhZ25vc3RpYyBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhSZXNvdXJjZSByZXNvdXJjZSwgRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQlpZiAoIXJlc291cmNlLmdldEVycm9ycygpLmlzRW1wdHkoKSB8fCAhcmVzb3VyY2UuZ2V0V2FybmluZ3MoKS5pc0VtcHR5KCkpIHsKKwkJCUJhc2ljRGlhZ25vc3RpYyBiYXNpY0RpYWdub3N0aWMgPQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMKKwkJCQkJKERpYWdub3N0aWMuRVJST1IsCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmVkaXRvciIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJIDAsCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksIC8vJE5PTi1OTFMtMSQKKwkJCQkJIG5ldyBPYmplY3QgW10geyBleGNlcHRpb24gPT0gbnVsbCA/IChPYmplY3QpcmVzb3VyY2UgOiBleGNlcHRpb24gfSk7CisJCQliYXNpY0RpYWdub3N0aWMubWVyZ2UoRWNvcmVVdGlsLmNvbXB1dGVEaWFnbm9zdGljKHJlc291cmNlLCB0cnVlKSk7CisJCQlyZXR1cm4gYmFzaWNEaWFnbm9zdGljOworCQl9CisJCWVsc2UgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQlyZXR1cm4KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5lZGl0b3IiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCSBuZXcgT2JqZWN0W10geyBleGNlcHRpb24gfSk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gRGlhZ25vc3RpYy5PS19JTlNUQU5DRTsKKwkJfQorCX0KKworCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGluc3RhbGwgeW91ciBvd24gY29udHJvbHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VzKCkgeworCQkvLyBDcmVhdGVzIHRoZSBtb2RlbCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQKKwkJLy8KKwkJY3JlYXRlTW9kZWwoKTsKKworCQkvLyBPbmx5IGNyZWF0ZXMgdGhlIG90aGVyIHBhZ2VzIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBlZGl0ZWQKKwkJLy8KKwkJaWYgKCFnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCS8vIENyZWF0ZSBhIHBhZ2UgZm9yIHRoZSBzZWxlY3Rpb24gdHJlZSB2aWV3LgorCQkJLy8KKwkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGdldENvbnRhaW5lcigpLCBTV1QuTVVMVEkpOworCQkJc2VsZWN0aW9uVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7CisJCQlzZXRDdXJyZW50Vmlld2VyKHNlbGVjdGlvblZpZXdlcik7CisKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkvL3NlbGVjdGlvblZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7CisKKwkJCW5ldyBBZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3Ioc2VsZWN0aW9uVmlld2VyLmdldFRyZWUoKSwgYWRhcHRlckZhY3RvcnkpOworCisJCQljcmVhdGVDb250ZXh0TWVudUZvcihzZWxlY3Rpb25WaWV3ZXIpOworCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2UodHJlZSk7CisJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKworCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkgc2V0QWN0aXZlUGFnZSgwKTsKKwkJCQkJIH0KKwkJCQkgfSk7CisJCX0KKworCQkvLyBFbnN1cmVzIHRoYXQgdGhpcyBlZGl0b3Igd2lsbCBvbmx5IGRpc3BsYXkgdGhlIHBhZ2UncyB0YWIKKwkJLy8gYXJlYSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBwYWdlCisJCS8vCisJCWdldENvbnRhaW5lcigpLmFkZENvbnRyb2xMaXN0ZW5lcgorCQkJKG5ldyBDb250cm9sQWRhcHRlcigpIHsKKwkJCQlib29sZWFuIGd1YXJkID0gZmFsc2U7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7CisJCQkJCWlmICghZ3VhcmQpIHsKKwkJCQkJCWd1YXJkID0gdHJ1ZTsKKwkJCQkJCWhpZGVUYWJzKCk7CisJCQkJCQlndWFyZCA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJIH0pOworCisJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCQkJIH0KKwkJCSB9KTsKKwl9IC8vIGNyZWF0ZVBhZ2VzCisJCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBpbnN0YWxsIHlvdXIgb3duIGNvbnRyb2xzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VzR2VuKCkgeworCQkvLyBDcmVhdGVzIHRoZSBtb2RlbCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQKKwkJLy8KKwkJY3JlYXRlTW9kZWwoKTsKKworCQkvLyBPbmx5IGNyZWF0ZXMgdGhlIG90aGVyIHBhZ2VzIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBlZGl0ZWQKKwkJLy8KKwkJaWYgKCFnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCS8vIENyZWF0ZSBhIHBhZ2UgZm9yIHRoZSBzZWxlY3Rpb24gdHJlZSB2aWV3LgorCQkJLy8KKwkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGdldENvbnRhaW5lcigpLCBTV1QuTVVMVEkpOworCQkJc2VsZWN0aW9uVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7CisJCQlzZXRDdXJyZW50Vmlld2VyKHNlbGVjdGlvblZpZXdlcik7CisKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCisJCQluZXcgQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yKHNlbGVjdGlvblZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsKKworCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Ioc2VsZWN0aW9uVmlld2VyKTsKKwkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHRyZWUpOworCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisKKwkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJIHNldEFjdGl2ZVBhZ2UoMCk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJLy8gRW5zdXJlcyB0aGF0IHRoaXMgZWRpdG9yIHdpbGwgb25seSBkaXNwbGF5IHRoZSBwYWdlJ3MgdGFiCisJCS8vIGFyZWEgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgcGFnZQorCQkvLworCQlnZXRDb250YWluZXIoKS5hZGRDb250cm9sTGlzdGVuZXIKKwkJCShuZXcgQ29udHJvbEFkYXB0ZXIoKSB7CisJCQkJYm9vbGVhbiBndWFyZCA9IGZhbHNlOworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBldmVudCkgeworCQkJCQlpZiAoIWd1YXJkKSB7CisJCQkJCQlndWFyZCA9IHRydWU7CisJCQkJCQloaWRlVGFicygpOworCQkJCQkJZ3VhcmQgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCSB9KTsKKworCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQkJCSB9CisJCQkgfSk7CisJfQorCQorCS8qKgorCSAqIElmIHRoZXJlIGlzIGp1c3Qgb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsCisJICogdGhpcyBoaWRlcyB0aGUgc2luZ2xlIHRhYiBhdCB0aGUgYm90dG9tLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhpZGVUYWJzKCkgeworCQlpZiAoZ2V0UGFnZUNvdW50KCkgPD0gMSkgeworCQkJc2V0UGFnZVRleHQoMCwgIiIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7CisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoMSk7CisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7CisJCQkJZ2V0Q29udGFpbmVyKCkuc2V0U2l6ZShwb2ludC54LCBwb2ludC55ICsgNik7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsCisJICogdGhpcyBzaG93cyB0aGUgdGFicyBhdCB0aGUgYm90dG9tLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNob3dUYWJzKCkgeworCQlpZiAoZ2V0UGFnZUNvdW50KCkgPiAxKSB7CisJCQlzZXRQYWdlVGV4dCgwLCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7CisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoU1dULkRFRkFVTFQpOworCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOworCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSAtIDYpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIHRyYWNrIHRoZSBhY3RpdmUgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IHBhZ2VJbmRleCkgeworCQlzdXBlci5wYWdlQ2hhbmdlKHBhZ2VJbmRleCk7CisKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7CisJCQloYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihjb250ZW50T3V0bGluZVBhZ2UuZ2V0U2VsZWN0aW9uKCkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBob3cgdGhlIGZyYW1ld29yayBkZXRlcm1pbmVzIHdoaWNoIGludGVyZmFjZXMgd2UgaW1wbGVtZW50LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7CisJCWlmIChrZXkuZXF1YWxzKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gc2hvd091dGxpbmVWaWV3KCkgPyBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSA6IG51bGw7CisJCX0KKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gZ2V0UHJvcGVydHlTaGVldFBhZ2UoKTsKKwkJfQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IG91dGxpbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQ29udGVudE91dGxpbmVQYWdlIGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIHsKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSA9PSBudWxsKSB7CisJCQkvLyBUaGUgY29udGVudCBvdXRsaW5lIGlzIGp1c3QgYSB0cmVlLgorCQkJLy8KKwkJCWNsYXNzIE15Q29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgQ29udGVudE91dGxpbmVQYWdlIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCQkJCS8vIFNldCB1cCB0aGUgdHJlZSB2aWV3ZXIuCisJCQkJCS8vCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisKKwkJCQkJLy8gTWFrZSBzdXJlIG91ciBwb3B1cHMgd29yay4KKwkJCQkJLy8KKwkJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IoY29udGVudE91dGxpbmVWaWV3ZXIpOworCisJCQkJCWlmICghZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkgIC8vIFNlbGVjdCB0aGUgcm9vdCBvYmplY3QgaW4gdGhlIHZpZXcuCisJCQkJCSAgLy8KKwkJCQkJICBjb250ZW50T3V0bGluZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCQkJCQl9CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgbWFrZUNvbnRyaWJ1dGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlcikgeworCQkJCQlzdXBlci5tYWtlQ29udHJpYnV0aW9ucyhtZW51TWFuYWdlciwgdG9vbEJhck1hbmFnZXIsIHN0YXR1c0xpbmVNYW5hZ2VyKTsKKwkJCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsKKwkJCQl9CisJCQl9CisKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZSA9IG5ldyBNeUNvbnRlbnRPdXRsaW5lUGFnZSgpOworCisJCQkvLyBMaXN0ZW4gdG8gc2VsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBpdCBpcyBhIHNwZWNpYWwgd2F5LgorCQkJLy8KKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKKwkJCQkobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQkJCSAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBoYW5kbGUgc2VsZWN0aW9ucyBjb3JyZWN0bHkuCisJCQkJCSAvLworCQkJCQkgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQkJCSBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJcmV0dXJuIGNvbnRlbnRPdXRsaW5lUGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIHByb3BlcnR5IHNoZWV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7CisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZSA9CisJCQkJbmV3IEV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2UoZWRpdGluZ0RvbWFpbikgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoTGlzdDw/PiBzZWxlY3Rpb24pIHsKKwkJCQkJCU1vZGVsRWRpdG9yLnRoaXMuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0aW9uKTsKKwkJCQkJCU1vZGVsRWRpdG9yLnRoaXMuc2V0Rm9jdXMoKTsKKwkJCQkJfQorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKKwkJCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7CisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsKKwkJCQkJfQorCQkJCX07CisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQl9CisKKwkJcmV0dXJuIHByb3BlcnR5U2hlZXRQYWdlOworCX0KKworCS8qKgorCSAqIFRoaXMgZGVhbHMgd2l0aCBob3cgd2Ugd2FudCBzZWxlY3Rpb24gaW4gdGhlIG91dGxpbmVyIHRvIGFmZmVjdCB0aGUgb3RoZXIgdmlld3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJaWYgKHNlbGVjdGlvblZpZXdlciAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQlJdGVyYXRvcjw/PiBzZWxlY3RlZEVsZW1lbnRzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLml0ZXJhdG9yKCk7CisJCQlpZiAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsKKwkJCQkvLyBHZXQgdGhlIGZpcnN0IHNlbGVjdGVkIGVsZW1lbnQuCisJCQkJLy8KKwkJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCk7CisKKwkJCQlBcnJheUxpc3Q8T2JqZWN0PiBzZWxlY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisJCQkJc2VsZWN0aW9uTGlzdC5hZGQoc2VsZWN0ZWRFbGVtZW50KTsKKwkJCQl3aGlsZSAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsKKwkJCQkJc2VsZWN0aW9uTGlzdC5hZGQoc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCkpOworCQkJCX0KKworCQkJCS8vIFNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSB3aWRnZXQuCisJCQkJLy8KKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbkxpc3QpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSUVkaXRvclBhcnR9IGFuZCBzaW1wbHkgdGVzdHMgdGhlIGNvbW1hbmQgc3RhY2suCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKwkJcmV0dXJuICgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuaXNTYXZlTmVlZGVkKCk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSBzYXZlcyB0aGUgbW9kZWwgZmlsZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKKwkJLy8gU2F2ZSBvbmx5IHJlc291cmNlcyB0aGF0IGhhdmUgYWN0dWFsbHkgY2hhbmdlZC4KKwkJLy8KKwkJZmluYWwgTWFwPE9iamVjdCwgT2JqZWN0PiBzYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOworCQlzYXZlT3B0aW9ucy5wdXQoUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VELCBSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRURfTUVNT1JZX0JVRkZFUik7CisKKwkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbiBiZWNhdXNlIHRoaXMgaXMgYSBsb25nIHJ1bm5pbmcgYWN0aXZpdHkgdGhhdCBtb2RpZmllcyB0aGUgd29ya2JlbmNoLgorCQkvLworCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0KKwkJCW5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7CisJCQkJLy8gVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBydW5zLgorCQkJCS8vCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQkJLy8gU2F2ZSB0aGUgcmVzb3VyY2VzIHRvIHRoZSBmaWxlIHN5c3RlbS4KKwkJCQkJLy8KKwkJCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7CisJCQkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpIHsKKwkJCQkJCWlmICgoZmlyc3QgfHwgIXJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpIHx8IGlzUGVyc2lzdGVkKHJlc291cmNlKSkgJiYgIWVkaXRpbmdEb21haW4uaXNSZWFkT25seShyZXNvdXJjZSkpIHsKKwkJCQkJCQl0cnkgeworCQkJCQkJCQlsb25nIHRpbWVTdGFtcCA9IHJlc291cmNlLmdldFRpbWVTdGFtcCgpOworCQkJCQkJCQlyZXNvdXJjZS5zYXZlKHNhdmVPcHRpb25zKTsKKwkJCQkJCQkJaWYgKHJlc291cmNlLmdldFRpbWVTdGFtcCgpICE9IHRpbWVTdGFtcCkgeworCQkJCQkJCQkJc2F2ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJCQkJCQl9CisJCQkJCQkJZmlyc3QgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX07CisKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCS8vIFRoaXMgcnVucyB0aGUgb3B0aW9ucywgYW5kIHNob3dzIHByb2dyZXNzLgorCQkJLy8KKwkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpLnJ1bih0cnVlLCBmYWxzZSwgb3BlcmF0aW9uKTsKKworCQkJLy8gUmVmcmVzaCB0aGUgbmVjZXNzYXJ5IHN0YXRlLgorCQkJLy8KKwkJCSgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuc2F2ZUlzRG9uZSgpOworCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZyB0aGF0IHNob3VsZG4ndC4KKwkJCS8vCisJCQlDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgd2hldGhlciBzb21ldGhpbmcgaGFzIGJlZW4gcGVyc2lzdGVkIHRvIHRoZSBVUkkgb2YgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgVVJJIGNvbnZlcnRlciBmcm9tIHRoZSBlZGl0b3IncyByZXNvdXJjZSBzZXQgdG8gdHJ5IHRvIG9wZW4gYW4gaW5wdXQgc3RyZWFtLiAKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BlcnNpc3RlZChSZXNvdXJjZSByZXNvdXJjZSkgeworCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQl0cnkgeworCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKHJlc291cmNlLmdldFVSSSgpKTsKKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgeworCQkJCXJlc3VsdCA9IHRydWU7CisJCQkJc3RyZWFtLmNsb3NlKCk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElnbm9yZQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogVGhpcyBhbHdheXMgcmV0dXJucyB0cnVlIGJlY2F1c2UgaXQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFsc28gY2hhbmdlcyB0aGUgZWRpdG9yJ3MgaW5wdXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7CisJCVNhdmVBc0RpYWxvZyBzYXZlQXNEaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKKwkJc2F2ZUFzRGlhbG9nLm9wZW4oKTsKKwkJSVBhdGggcGF0aCA9IHNhdmVBc0RpYWxvZy5nZXRSZXN1bHQoKTsKKwkJaWYgKHBhdGggIT0gbnVsbCkgeworCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKKwkJCWlmIChmaWxlICE9IG51bGwpIHsKKwkJCQlkb1NhdmVBcyhVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZG9TYXZlQXMoVVJJIHVyaSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisJCShlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKS5zZXRVUkkodXJpKTsKKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKKwkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPQorCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgIT0gbnVsbCA/CisJCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgOgorCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisJCWRvU2F2ZShwcm9ncmVzc01vbml0b3IpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKKwkJdHJ5IHsKKwkJCWlmIChtYXJrZXIuZ2V0VHlwZSgpLmVxdWFscyhFVmFsaWRhdG9yLk1BUktFUikpIHsKKwkJCQlTdHJpbmcgdXJpQXR0cmlidXRlID0gbWFya2VyLmdldEF0dHJpYnV0ZShFVmFsaWRhdG9yLlVSSV9BVFRSSUJVVEUsIG51bGwpOworCQkJCWlmICh1cmlBdHRyaWJ1dGUgIT0gbnVsbCkgeworCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSSh1cmlBdHRyaWJ1dGUpOworCQkJCQlFT2JqZWN0IGVPYmplY3QgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0RU9iamVjdCh1cmksIHRydWUpOworCQkJCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7CisJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGVkaXRpbmdEb21haW4uZ2V0V3JhcHBlcihlT2JqZWN0KSkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBzdGFydHVwLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisJCXNldFNpdGUoc2l0ZSk7CisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7CisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7CisJCXNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7CisJCXNpdGUuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCWdldENvbnRyb2woZ2V0QWN0aXZlUGFnZSgpKS5zZXRGb2N1cygpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gcmV0dXJuIHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgeworCQlyZXR1cm4gZWRpdG9yU2VsZWN0aW9uOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHNldCB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLgorCSAqIENhbGxpbmcgdGhpcyByZXN1bHQgd2lsbCBub3RpZnkgdGhlIGxpc3RlbmVycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJZWRpdG9yU2VsZWN0aW9uID0gc2VsZWN0aW9uOworCisJCWZvciAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA6IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMpIHsKKwkJCWxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsKKwkJfQorCQlzZXRTdGF0dXNMaW5lTWFuYWdlcihzZWxlY3Rpb24pOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0YXR1c0xpbmVNYW5hZ2VyKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciA9IGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCAmJiBjdXJyZW50Vmlld2VyID09IGNvbnRlbnRPdXRsaW5lVmlld2VyID8KKwkJCWNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXIgOiBnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKKworCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgeworCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnRvTGlzdCgpOworCQkJCXN3aXRjaCAoY29sbGVjdGlvbi5zaXplKCkpIHsKKwkJCQkJY2FzZSAwOiB7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX05vT2JqZWN0U2VsZWN0ZWQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNhc2UgMTogeworCQkJCQkJU3RyaW5nIHRleHQgPSBuZXcgQWRhcHRlckZhY3RvcnlJdGVtRGVsZWdhdG9yKGFkYXB0ZXJGYWN0b3J5KS5nZXRUZXh0KGNvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkpOworCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZCIsIHRleHQpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZGVmYXVsdDogeworCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9NdWx0aU9iamVjdFNlbGVjdGVkIiwgSW50ZWdlci50b1N0cmluZyhjb2xsZWN0aW9uLnNpemUoKSkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBsb29rcyB1cCBhIHN0cmluZyBpbiB0aGUgcGx1Z2luJ3MgcGx1Z2luLnByb3BlcnRpZXMgZmlsZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJcmV0dXJuIENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSk7CisJfQorCisJLyoqCisJICogVGhpcyBsb29rcyB1cCBhIHN0cmluZyBpbiBwbHVnaW4ucHJvcGVydGllcywgbWFraW5nIGEgc3Vic3RpdHV0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxKSB7CisJCXJldHVybiBDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXksIG5ldyBPYmplY3QgW10geyBzMSB9KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyfSB0byBoZWxwIGZpbGwgdGhlIGNvbnRleHQgbWVudXMgd2l0aCBjb250cmlidXRpb25zIGZyb20gdGhlIEVkaXQgbWVudS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCSgoSU1lbnVMaXN0ZW5lcilnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSkubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgeworCQlyZXR1cm4gKEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcilnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsKKwkJcmV0dXJuIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aW9uQmFycygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisKKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7CisKKwkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKKworCQlhZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7CisKKwkJaWYgKGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gdGhpcykgeworCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IobnVsbCk7CisJCX0KKworCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgeworCQkJcHJvcGVydHlTaGVldFBhZ2UuZGlzcG9zZSgpOworCQl9CisKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7CisJCQljb250ZW50T3V0bGluZVBhZ2UuZGlzcG9zZSgpOworCQl9CisKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgb3V0bGluZSB2aWV3IHNob3VsZCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd091dGxpbmVWaWV3KCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3ByZXNlbnRhdGlvbi9Nb2RpZmllckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJlc2VudGF0aW9uL01vZGlmaWVyQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGVlYTMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3ByZXNlbnRhdGlvbi9Nb2RpZmllckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKQEAgLTAsMCArMSw0MzcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByZXNlbnRhdGlvbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29udHJvbEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YkNvbnRyaWJ1dGlvbkl0ZW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByZXNlbnRhdGlvbi5Db3JlRWRpdG9yUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBpcyB0aGUgYWN0aW9uIGJhciBjb250cmlidXRvciBmb3IgdGhlIE1vZGlmaWVyIG1vZGVsIGVkaXRvci4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgTW9kaWZpZXJBY3Rpb25CYXJDb250cmlidXRvcgorCWV4dGVuZHMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yCisJaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3JQYXJ0OworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgYWN0aW9uIG9wZW5zIHRoZSBQcm9wZXJ0aWVzIHZpZXcuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElBY3Rpb24gc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uID0KKwkJbmV3IEFjdGlvbihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW0iKSkgLy8kTk9OLU5MUy0xJAorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQl0cnkgeworCQkJCQlnZXRQYWdlKCkuc2hvd1ZpZXcoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyBhY3Rpb24gcmVmcmVzaGVzIHRoZSB2aWV3ZXIgb2YgdGhlIGN1cnJlbnQgZWRpdG9yIGlmIHRoZSBlZGl0b3IKKwkgKiBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQWN0aW9uIHJlZnJlc2hWaWV3ZXJBY3Rpb24gPQorCQluZXcgQWN0aW9uKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0iKSkgLy8kTk9OLU5MUy0xJAorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKwkJCQlyZXR1cm4gYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcjsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJaWYgKGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKKwkJCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldFZpZXdlcigpOworCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKKwkJCQkJCXZpZXdlci5yZWZyZXNoKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gY29ycmVzcG9uZGluZyB0byBlYWNoIGRlc2NyaXB0b3IKKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBjcmVhdGVDaGlsZEFjdGlvbnM7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZUNoaWxkIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyB3aWxsIGNvbnRhaW4gb25lIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gY29ycmVzcG9uZGluZyB0byBlYWNoIGRlc2NyaXB0b3IKKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBjcmVhdGVTaWJsaW5nQWN0aW9uczsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCBmb3IgQ3JlYXRlU2libGluZyBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBjb250cmlidXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTW9kaWZpZXJBY3Rpb25CYXJDb250cmlidXRvcigpIHsKKwkJc3VwZXIoQURESVRJT05TX0xBU1RfU1RZTEUpOworCQlsb2FkUmVzb3VyY2VBY3Rpb24gPSBuZXcgTG9hZFJlc291cmNlQWN0aW9uKCk7CisJCXZhbGlkYXRlQWN0aW9uID0gbmV3IFZhbGlkYXRlQWN0aW9uKCk7CisJCWNvbnRyb2xBY3Rpb24gPSBuZXcgQ29udHJvbEFjdGlvbigpOworCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyBTZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zIHRvIHRoZSB0b29sIGJhci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgeworCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigibW9kaWZpZXItc2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoIm1vZGlmaWVyLWFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB0byB0aGUgbWVudSBiYXIgYSBtZW51IGFuZCBzb21lIHNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMsCisJICogYXMgd2VsbCBhcyB0aGUgc3ViLW1lbnVzIGZvciBvYmplY3QgY3JlYXRpb24gaXRlbXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51TWFuYWdlcik7CisKKwkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfTW9kaWZpZXJFZGl0b3JfbWVudSIpLCAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyTWVudUlEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlQ2hpbGQgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgorCQkvLworCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVTaWJsaW5nIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KKwkJLy8KKwkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gRm9yY2UgYW4gdXBkYXRlIGJlY2F1c2UgRWNsaXBzZSBoaWRlcyBlbXB0eSBtZW51cyBub3cuCisJCS8vCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcgorCQkJKG5ldyBJTWVudUxpc3RlbmVyKCkgeworCQkJCSBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCQkJCSBtZW51TWFuYWdlci51cGRhdGVBbGwodHJ1ZSk7CisJCQkJIH0KKwkJCSB9KTsKKworCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiBXaGVuIHRoZSBhY3RpdmUgZWRpdG9yIGNoYW5nZXMsIHRoaXMgcmVtZW1iZXJzIHRoZSBjaGFuZ2UgYW5kIHJlZ2lzdGVycyB3aXRoIGl0IGFzIGEgc2VsZWN0aW9uIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBwYXJ0KSB7CisJCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihwYXJ0KTsKKwkJYWN0aXZlRWRpdG9yUGFydCA9IHBhcnQ7CisKKwkJLy8gU3dpdGNoIHRvIHRoZSBuZXcgc2VsZWN0aW9uIHByb3ZpZGVyLgorCQkvLworCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCQl9CisJCWlmIChwYXJ0ID09IG51bGwpIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsKKwkJfQorCQllbHNlIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gcGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKKwkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKworCQkJLy8gRmFrZSBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IHRvIHVwZGF0ZSB0aGUgbWVudXMuCisJCQkvLworCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpICE9IG51bGwpIHsKKwkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn0sCisJICogaGFuZGxpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50fXMgYnkgcXVlcnlpbmcgZm9yIHRoZSBjaGlsZHJlbiBhbmQgc2libGluZ3MKKwkgKiB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZCB1cGRhdGluZyB0aGUgbWVudXMgYWNjb3JkaW5nbHkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJLy8gUmVtb3ZlIGFueSBtZW51IGl0ZW1zIGZvciBvbGQgc2VsZWN0aW9uLgorCQkvLworCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMpOworCQl9CisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucyk7CisJCX0KKworCQkvLyBRdWVyeSB0aGUgbmV3IHNlbGVjdGlvbiBmb3IgYXBwcm9wcmlhdGUgbmV3IGNoaWxkL3NpYmxpbmcgZGVzY3JpcHRvcnMKKwkJLy8KKwkJQ29sbGVjdGlvbjw/PiBuZXdDaGlsZERlc2NyaXB0b3JzID0gbnVsbDsKKwkJQ29sbGVjdGlvbjw/PiBuZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBudWxsOworCisJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7CisJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsKKwkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7CisKKwkJCUVkaXRpbmdEb21haW4gZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKKworCQkJbmV3Q2hpbGREZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgbnVsbCk7CisJCQluZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhudWxsLCBvYmplY3QpOworCQl9CisKKwkJLy8gR2VuZXJhdGUgYWN0aW9ucyBmb3Igc2VsZWN0aW9uOyBwb3B1bGF0ZSBhbmQgcmVkcmF3IHRoZSBtZW51cy4KKwkJLy8KKwkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMobmV3Q2hpbGREZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKKwkJY3JlYXRlU2libGluZ0FjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKG5ld1NpYmxpbmdEZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKKworCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKKwkJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOworCQl9CisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOworCQkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwKKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgeworCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVDaGlsZEFjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYWN0aW9uczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwKKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoQ29sbGVjdGlvbjw/PiBkZXNjcmlwdG9ycywgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJQ29sbGVjdGlvbjxJQWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOworCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgeworCQkJZm9yIChPYmplY3QgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7CisJCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCisJLyoqCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiB3aXRoIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbiwKKwkgKiBieSBpbnNlcnRpbmcgdGhlbSBiZWZvcmUgdGhlIHNwZWNpZmllZCBjb250cmlidXRpb24gaXRlbSA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4uCisJICogSWYgPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGV5IGFyZSBzaW1wbHkgYWRkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248PyBleHRlbmRzIElBY3Rpb24+IGFjdGlvbnMsIFN0cmluZyBjb250cmlidXRpb25JRCkgeworCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKElBY3Rpb24gYWN0aW9uIDogYWN0aW9ucykgeworCQkJCWlmIChjb250cmlidXRpb25JRCAhPSBudWxsKSB7CisJCQkJCW1hbmFnZXIuaW5zZXJ0QmVmb3JlKGNvbnRyaWJ1dGlvbklELCBhY3Rpb24pOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJbWFuYWdlci5hZGQoYWN0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCQorCS8qKgorCSAqIFRoaXMgcmVtb3ZlcyBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gYWxsIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkZXBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zKSB7CisJCWlmIChhY3Rpb25zICE9IG51bGwpIHsKKwkJCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtYW5hZ2VyLmdldEl0ZW1zKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CisJCQkJLy8gTG9vayBpbnRvIFN1YkNvbnRyaWJ1dGlvbkl0ZW1zCisJCQkJLy8KKwkJCQlJQ29udHJpYnV0aW9uSXRlbSBjb250cmlidXRpb25JdGVtID0gaXRlbXNbaV07CisJCQkJd2hpbGUgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBTdWJDb250cmlidXRpb25JdGVtKSB7CisJCQkJCWNvbnRyaWJ1dGlvbkl0ZW0gPSAoKFN1YkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0SW5uZXJJdGVtKCk7CisJCQkJfQorCisJCQkJLy8gRGVsZXRlIHRoZSBBY3Rpb25Db250cmlidXRpb25JdGVtcyB3aXRoIG1hdGNoaW5nIGFjdGlvbi4KKwkJCQkvLworCQkJCWlmIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCQlJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSljb250cmlidXRpb25JdGVtKS5nZXRBY3Rpb24oKTsKKwkJCQkJaWYgKGFjdGlvbnMuY29udGFpbnMoYWN0aW9uKSkgeworCQkJCQkJbWFuYWdlci5yZW1vdmUoY29udHJpYnV0aW9uSXRlbSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgcG9wLXVwIG1lbnUgYmVmb3JlIGl0IGFwcGVhcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQlzdXBlci5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOworCQlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG51bGw7CisKKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOworCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOworCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGluc2VydHMgZ2xvYmFsIGFjdGlvbnMgYmVmb3JlIHRoZSAiYWRkaXRpb25zLWVuZCIgc2VwYXJhdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMtZW5kIiwgbmV3IFNlcGFyYXRvcigidWktYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uKTsgLy8kTk9OLU5MUy0xJAorCisJCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsJCQorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHJlZnJlc2hWaWV3ZXJBY3Rpb24pOyAvLyROT04tTkxTLTEkCisKKwkJc3VwZXIuYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogVGhpcyBlbnN1cmVzIHRoYXQgYSBkZWxldGUgYWN0aW9uIHdpbGwgY2xlYW4gdXAgYWxsIHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBvYmplY3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUFsbFJlZmVyZW5jZXNPbkRlbGV0ZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3ByZXNlbnRhdGlvbi9Nb2RpZmllckVkaXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL21vZGlmaWVyL3ByZXNlbnRhdGlvbi9Nb2RpZmllckVkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3Nzk1MWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvbW9kaWZpZXIvcHJlc2VudGF0aW9uL01vZGlmaWVyRWRpdG9yLmphdmEKQEAgLTAsMCArMSwxNjkwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Mb2NhbFNlbGVjdGlvblRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TYXZlQXNEaWFsb2c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5NYXJrZXJIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5WaWV3ZXJQYW5lOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5lZGl0b3IuUHJvYmxlbUVkaXRvclBhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuY2VsbGVkaXRvci5BZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5Mb2NhbFRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5VbndyYXBwaW5nU2VsZWN0aW9uUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSU1hcmtlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSVV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS52aWV3LkV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVhNSVJlc291cmNlRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByb3ZpZGVyLk1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJlc2VudGF0aW9uLkNvcmVFZGl0b3JQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQucHJvdmlkZXIuRXhwZXJpbWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnByb3ZpZGVyLkdyYXBoSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUucHJvdmlkZXIuUHJlZGljYXRlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJvdmlkZXIuU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIucHJvdmlkZXIuU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLnByb3ZpZGVyLlNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLnByb3ZpZGVyLlRyaWdnZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOworCisKKy8qKgorICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgTW9kaWZpZXIgbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBNb2RpZmllckVkaXRvcgorCWV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydAorCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5Qcm92aWRlciwgSVNlbGVjdGlvblByb3ZpZGVyLCBJTWVudUxpc3RlbmVyLCBJVmlld2VyUHJvdmlkZXIsIElHb3RvTWFya2VyIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBlZGl0aW5nIGRvbWFpbiB0aGF0IGlzIHVzZWQgdG8gdHJhY2sgYWxsIGNoYW5nZXMgdG8gdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG9uZSBhZGFwdGVyIGZhY3RvcnkgdXNlZCBmb3IgcHJvdmlkaW5nIHZpZXdzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQ29udGVudE91dGxpbmVQYWdlIGNvbnRlbnRPdXRsaW5lUGFnZTsKKworCS8qKgorCSAqIFRoaXMgaXMgYSBrbHVkZ2UuLi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVN0YXR1c0xpbmVNYW5hZ2VyIGNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZSdzIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBjb250ZW50T3V0bGluZVZpZXdlcjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHByb3BlcnR5IHNoZWV0IHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFByb3BlcnR5U2hlZXRQYWdlIHByb3BlcnR5U2hlZXRQYWdlOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdmlld2VyIHRoYXQgc2hhZG93cyB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb250ZW50IG91dGxpbmUuCisJICogVGhlIHBhcmVudCByZWxhdGlvbiBtdXN0IGJlIGNvcnJlY3RseSBkZWZpbmVkIGZvciB0aGlzIHRvIHdvcmsuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgc2VsZWN0aW9uVmlld2VyOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGNvbnRlbnQgdmlld2VyLCB3aGljaCBtYXkgYmUgZWl0aGVyIG9uZSBvZiB0aGUgdmlld2VycyBpbiB0aGUgcGFnZXMgb3IgdGhlIGNvbnRlbnQgb3V0bGluZSB2aWV3ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFZpZXdlciBjdXJyZW50Vmlld2VyOworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIHRvIHdoaWNoIGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn1zIHRoYXQgYXJlIGxpc3RlbmluZyB0byB0aGlzIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPigpOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgc2VsZWN0aW9uIG9mIHRoZSBlZGl0b3IgYXMgYSB3aG9sZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBlZGl0b3JTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOworCisJLyoqCisJICogVGhlIE1hcmtlckhlbHBlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgd29ya3NwYWNlIHJlc291cmNlIG1hcmtlcnMgcHJlc2VudGVkCisJICogaW4gRWNsaXBzZSdzIFByb2JsZW1zIFZpZXcuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1hcmtlckhlbHBlciBtYXJrZXJIZWxwZXIgPSBuZXcgRWRpdFVJTWFya2VySGVscGVyKCk7CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdoZW4gdGhlIG91dGxpbmUgYmVjb21lcyBhY3RpdmUKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPQorCQluZXcgSVBhcnRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCWlmIChwIGluc3RhbmNlb2YgQ29udGVudE91dGxpbmUpIHsKKwkJCQkJaWYgKCgoQ29udGVudE91dGxpbmUpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBjb250ZW50T3V0bGluZVBhZ2UpIHsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKE1vZGlmaWVyRWRpdG9yLnRoaXMpOworCisJCQkJCQlzZXRDdXJyZW50Vmlld2VyKGNvbnRlbnRPdXRsaW5lVmlld2VyKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChwIGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgeworCQkJCQlpZiAoKChQcm9wZXJ0eVNoZWV0KXApLmdldEN1cnJlbnRQYWdlKCkgPT0gcHJvcGVydHlTaGVldFBhZ2UpIHsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKE1vZGlmaWVyRWRpdG9yLnRoaXMpOworCQkJCQkJaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChwID09IE1vZGlmaWVyRWRpdG9yLnRoaXMpIHsKKwkJCQkJaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQl9CisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHApIHsKKwkJCQkvLyBJZ25vcmUuCisJCQl9CisJCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIHNpbmNlIGxhc3QgYWN0aXZhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHNhdmVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBzYXZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBNYXAgdG8gc3RvcmUgdGhlIGRpYWdub3N0aWMgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4gcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4oKTsKKworCS8qKgorCSAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiBzaG91bGQgYmUgdXBkYXRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisKKwkvKioKKwkgKiBBZGFwdGVyIHVzZWQgdG8gdXBkYXRlIHRoZSBwcm9ibGVtIGluZGljYXRpb24gd2hlbiByZXNvdXJjZXMgYXJlIGRlbWFuZGVkIGxvYWRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUNvbnRlbnRBZGFwdGVyIHByb2JsZW1JbmRpY2F0aW9uQWRhcHRlciA9IAorCQluZXcgRUNvbnRlbnRBZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBSZXNvdXJjZSkgeworCQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVzb3VyY2UuY2xhc3MpKSB7CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQ6CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19FUlJPUlM6CisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19XQVJOSU5HUzogeworCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOworCQkJCQkJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBudWxsKTsKKwkJCQkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBkaWFnbm9zdGljKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSB7CisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnJlbW92ZShyZXNvdXJjZSk7CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKSB7CisJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCQkJCQkJCQkJIH0KKwkJCQkJCQkJCSB9KTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwkJCQl9CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VGFyZ2V0KFJlc291cmNlIHRhcmdldCkgeworCQkJCWJhc2ljU2V0VGFyZ2V0KHRhcmdldCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgdW5zZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7CisJCQkJYmFzaWNVbnNldFRhcmdldCh0YXJnZXQpOworCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIGZvciB3b3Jrc3BhY2UgY2hhbmdlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9CisJCW5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKKwkJCQl0cnkgeworCQkJCQljbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7CisJCQkJCQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7CisJCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisJCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CisJCQkJCQkJaWYgKGRlbHRhLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7CisJCQkJCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCB8fAorCQkJCQkJCQkgICAgZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgZGVsdGEuZ2V0RmxhZ3MoKSAhPSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSB7CisJCQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGRlbHRhLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIGZhbHNlKTsKKwkJCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisJCQkJCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7CisJCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJZWxzZSBpZiAoIXNhdmVkUmVzb3VyY2VzLnJlbW92ZShyZXNvdXJjZSkpIHsKKwkJCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJfQorCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsKKwkJCQkJCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlczsKKwkJCQkJCX0KKworCQkJCQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlbW92ZWRSZXNvdXJjZXMoKSB7CisJCQkJCQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlmaW5hbCBSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpdG9yKCk7CisJCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKKworCQkJCQlpZiAoIXZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkgcmVtb3ZlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkpOworCQkJCQkJCQkJIGlmICghaXNEaXJ0eSgpKSB7CisJCQkJCQkJCQkJIGdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoTW9kaWZpZXJFZGl0b3IudGhpcywgZmFsc2UpOworCQkJCQkJCQkJIH0KKwkJCQkJCQkJIH0KKwkJCQkJCQkgfSk7CisJCQkJCX0KKworCQkJCQlpZiAoIXZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOworCQkJCQkJCQkJIGlmIChnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpID09IE1vZGlmaWVyRWRpdG9yLnRoaXMpIHsKKwkJCQkJCQkJCQkgaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQkJCQkJCSB9CisJCQkJCQkJCSB9CisJCQkJCQkJIH0pOworCQkJCQl9CisJCQkJfQorCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIEhhbmRsZXMgYWN0aXZhdGlvbiBvZiB0aGUgZWRpdG9yIG9yIGl0J3MgYXNzb2NpYXRlZCB2aWV3cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0ZSgpIHsKKwkJLy8gUmVjb21wdXRlIHRoZSByZWFkIG9ubHkgc3RhdGUuCisJCS8vCisJCWlmIChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpICE9IG51bGwpIHsKKwkJICBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpLmNsZWFyKCk7CisKKwkJICAvLyBSZWZyZXNoIGFueSBhY3Rpb25zIHRoYXQgbWF5IGJlY29tZSBlbmFibGVkIG9yIGRpc2FibGVkLgorCQkgIC8vCisJCSAgc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKKwkJfQorCisJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCWlmIChoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpIHsKKwkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKE1vZGlmaWVyRWRpdG9yLnRoaXMsIGZhbHNlKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCWNoYW5nZWRSZXNvdXJjZXMucmVtb3ZlQWxsKHNhdmVkUmVzb3VyY2VzKTsKKwkJCWhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKTsKKwkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBIYW5kbGVzIHdoYXQgdG8gZG8gd2l0aCBjaGFuZ2VkIHJlc291cmNlcyBvbiBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKSB7CisJCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkgJiYgKCFpc0RpcnR5KCkgfHwgaGFuZGxlRGlydHlDb25mbGljdCgpKSkgeworCQkJaWYgKGlzRGlydHkoKSkgeworCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSk7CisJCQl9CisJCQllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7CisKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgeworCQkJCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKSB7CisJCQkJCXJlc291cmNlLnVubG9hZCgpOworCQkJCQl0cnkgeworCQkJCQkJcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOworCQkJCQl9CisJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCWlmICghcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAuY29udGFpbnNLZXkocmVzb3VyY2UpKSB7CisJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4uaXNTdGFsZShlZGl0b3JTZWxlY3Rpb24pKSB7CisJCQkJc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOworCQkJfQorCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQl9CisJfQorICAKKwkvKioKKwkgKiBVcGRhdGVzIHRoZSBwcm9ibGVtcyBpbmRpY2F0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWVkIGRpYWdub3N0aWMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKSB7CisJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgeworCQkJQmFzaWNEaWFnbm9zdGljIGRpYWdub3N0aWMgPQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMKKwkJCQkJKERpYWdub3N0aWMuT0ssCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmVkaXRvciIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJIDAsCisJCQkJCSBudWxsLAorCQkJCQkgbmV3IE9iamVjdCBbXSB7IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSB9KTsKKwkJCWZvciAoRGlhZ25vc3RpYyBjaGlsZERpYWdub3N0aWMgOiByZXNvdXJjZVRvRGlhZ25vc3RpY01hcC52YWx1ZXMoKSkgeworCQkJCWlmIChjaGlsZERpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCWRpYWdub3N0aWMuYWRkKGNoaWxkRGlhZ25vc3RpYyk7CisJCQkJfQorCQkJfQorCisJCQlpbnQgbGFzdEVkaXRvclBhZ2UgPSBnZXRQYWdlQ291bnQoKSAtIDE7CisJCQlpZiAobGFzdEVkaXRvclBhZ2UgPj0gMCAmJiBnZXRFZGl0b3IobGFzdEVkaXRvclBhZ2UpIGluc3RhbmNlb2YgUHJvYmxlbUVkaXRvclBhcnQpIHsKKwkJCQkoKFByb2JsZW1FZGl0b3JQYXJ0KWdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkpLnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7CisJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCXNldEFjdGl2ZVBhZ2UobGFzdEVkaXRvclBhZ2UpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJUHJvYmxlbUVkaXRvclBhcnQgcHJvYmxlbUVkaXRvclBhcnQgPSBuZXcgUHJvYmxlbUVkaXRvclBhcnQoKTsKKwkJCQlwcm9ibGVtRWRpdG9yUGFydC5zZXREaWFnbm9zdGljKGRpYWdub3N0aWMpOworCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldE1hcmtlckhlbHBlcihtYXJrZXJIZWxwZXIpOworCQkJCXRyeSB7CisJCQkJCWFkZFBhZ2UoKytsYXN0RWRpdG9yUGFnZSwgcHJvYmxlbUVkaXRvclBhcnQsIGdldEVkaXRvcklucHV0KCkpOworCQkJCQlzZXRQYWdlVGV4dChsYXN0RWRpdG9yUGFnZSwgcHJvYmxlbUVkaXRvclBhcnQuZ2V0UGFydE5hbWUoKSk7CisJCQkJCXNldEFjdGl2ZVBhZ2UobGFzdEVkaXRvclBhZ2UpOworCQkJCQlzaG93VGFicygpOworCQkJCX0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfQorCisJCQlpZiAobWFya2VySGVscGVyLmhhc01hcmtlcnMoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKSkgeworCQkJCW1hcmtlckhlbHBlci5kZWxldGVNYXJrZXJzKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCXRyeSB7CisJCQkJCQltYXJrZXJIZWxwZXIuY3JlYXRlTWFya2VycyhkaWFnbm9zdGljKTsKKwkJCQkJfQorCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBTaG93cyBhIGRpYWxvZyB0aGF0IGFza3MgaWYgY29uZmxpY3RpbmcgY2hhbmdlcyBzaG91bGQgYmUgZGlzY2FyZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZURpcnR5Q29uZmxpY3QoKSB7CisJCXJldHVybgorCQkJTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24KKwkJCQkoZ2V0U2l0ZSgpLmdldFNoZWxsKCksCisJCQkJIGdldFN0cmluZygiX1VJX0ZpbGVDb25mbGljdF9sYWJlbCIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1dBUk5fRmlsZUNvbmZsaWN0IikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGEgbW9kZWwgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNb2RpZmllckVkaXRvcigpIHsKKwkJc3VwZXIoKTsKKwkJaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKTsKKwl9CisJCisJLyoqCisJICogVGhpcyBzZXRzIHVwIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1vZGVsIGVkaXRvci4gPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFZGl0aW5nRG9tYWluKCkgeworCQlpbml0aWFsaXplRWRpdGluZ0RvbWFpbkdlbigpOworCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKQorCQkJCS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIioiLAorCQkJCQkJU1RFTVhNSVJlc291cmNlRmFjdG9yeUltcGwuSU5TVEFOQ0UpOworCisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpCisJCQkJLmdldFByb3RvY29sVG9GYWN0b3J5TWFwKCkucHV0KCJwbGF0Zm9ybSIsCisJCQkJCQlTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbC5JTlNUQU5DRSk7CisJfSAvLyBpbml0aWFsaXplRWRpdGluZ0RvbWFpbgorCisJLyoqCisJICogVGhpcyBzZXRzIHVwIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1vZGVsIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWRpdGluZ0RvbWFpbkdlbigpIHsKKwkJLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlpZWxkcyBpdGVtIHByb3ZpZGVycy4KKwkJLy8KKwkJYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOworCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBFeHBlcmltZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBHcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBQcmVkaWNhdGVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFRyaWdnZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKworCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUgZXhlY3V0ZWQuCisJCS8vCisJCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOworCisJCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCisJCS8vCisJCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcgorCQkJKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKKwkJCQkgcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgeworCQkJCQkgZ2V0Q29udGFpbmVyKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJIChuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJICBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCSAgZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworCisJCQkJCQkJCSAgLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KKwkJCQkJCQkJICAvLworCQkJCQkJCQkgIENvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaylldmVudC5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsKKwkJCQkJCQkJICBpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgeworCQkJCQkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihtb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7CisJCQkJCQkJCSAgfQorCQkJCQkJCQkgIGlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsICYmICFwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQkJCQkgIHByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsKKwkJCQkJCQkJICB9CisJCQkJCQkJICB9CisJCQkJCQkgIH0pOworCQkJCSB9CisJCQkgfSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgorCQkvLworCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgQm9vbGVhbj4oKSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBoZXJlIGZvciB0aGUgbGlzdGVuZXIgdG8gYmUgYWJsZSB0byBjYWxsIGl0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCQkJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGludCBhY3Rpb24pIHsKKwkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKGFjdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHRoZSBzZWxlY3Rpb24gaW50byB3aGljaGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKKwkJZmluYWwgQ29sbGVjdGlvbjw/PiB0aGVTZWxlY3Rpb24gPSBjb2xsZWN0aW9uOworCQkvLyBNYWtlIHN1cmUgaXQncyBva2F5LgorCQkvLworCQlpZiAodGhlU2VsZWN0aW9uICE9IG51bGwgJiYgIXRoZVNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKKwkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0KKwkJCQluZXcgUnVubmFibGUoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGl0ZW1zIGluIHRoZSBjdXJyZW50IGNvbnRlbnQgdmlld2VyIG9mIHRoZSBlZGl0b3IuCisJCQkJCQkvLworCQkJCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgeworCQkJCQkJCWN1cnJlbnRWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoZVNlbGVjdGlvbi50b0FycmF5KCkpLCB0cnVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX07CisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgZWRpdGluZyBkb21haW4gYXMgcmVxdWlyZWQgYnkgdGhlIHtAbGluayBJRWRpdGluZ0RvbWFpblByb3ZpZGVyfSBpbnRlcmZhY2UuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGltcGxlbWVudGluZyB0aGUgc3RhdGljIG1ldGhvZHMgb2Yge0BsaW5rIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbn0KKwkgKiBhbmQgZm9yIHN1cHBvcnRpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgeworCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgY2xhc3MgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgeworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0IFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIHBhcmVudCAhPSBudWxsOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ha2VzIHN1cmUgdGhhdCBvbmUgY29udGVudCB2aWV3ZXIsIGVpdGhlciBmb3IgdGhlIGN1cnJlbnQgcGFnZSBvciB0aGUgb3V0bGluZSB2aWV3LCBpZiBpdCBoYXMgZm9jdXMsCisJICogaXMgdGhlIGN1cnJlbnQgb25lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRWaWV3ZXIoVmlld2VyIHZpZXdlcikgeworCQkvLyBJZiBpdCBpcyBjaGFuZ2luZy4uLgorCQkvLworCQlpZiAoY3VycmVudFZpZXdlciAhPSB2aWV3ZXIpIHsKKwkJCWlmIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgeworCQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgb24gZGVtYW5kLgorCQkJCS8vCisJCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0KKwkJCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQkJCQkvLyBUaGlzIGp1c3Qgbm90aWZpZXMgdGhvc2UgdGhpbmdzIHRoYXQgYXJlIGFmZmVjdGVkIGJ5IHRoZSBzZWN0aW9uLgorCQkJCQkJLy8KKwkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHNlbGVjdGlvbkNoYW5nZWRFdmVudCkgeworCQkJCQkJCXNldFNlbGVjdGlvbihzZWxlY3Rpb25DaGFuZ2VkRXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQkJfQorCQkJCQl9OworCQkJfQorCisJCQkvLyBTdG9wIGxpc3RlbmluZyB0byB0aGUgb2xkIG9uZS4KKwkJCS8vCisJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7CisJCQkJY3VycmVudFZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKKwkJCX0KKworCQkJLy8gU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXcgb25lLgorCQkJLy8KKwkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgeworCQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKKwkJCX0KKworCQkJLy8gUmVtZW1iZXIgaXQuCisJCQkvLworCQkJY3VycmVudFZpZXdlciA9IHZpZXdlcjsKKworCQkJLy8gU2V0IHRoZSBlZGl0b3JzIHNlbGVjdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCB2aWV3ZXIncyBzZWxlY3Rpb24uCisJCQkvLworCQkJc2V0U2VsZWN0aW9uKGN1cnJlbnRWaWV3ZXIgPT0gbnVsbCA/IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkgOiBjdXJyZW50Vmlld2VyLmdldFNlbGVjdGlvbigpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgdmlld2VyIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSVZpZXdlclByb3ZpZGVyfSBpbnRlcmZhY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7CisJCXJldHVybiBjdXJyZW50Vmlld2VyOworCX0KKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlciBhbmQgYWRkcyBhIGxpc3RlbmVyIGFzIHdlbGwgcmVnaXN0ZXJpbmcgdGhlIG1lbnUgZm9yIGV4dGVuc2lvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKKwkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOworCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7CisJCU1lbnUgbWVudT0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7CisJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKKwkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUsIHZpZXdlcik7CisKKwkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTks7CisJCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCksIExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OworCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgVmlld2VyRHJhZ0FkYXB0ZXIodmlld2VyKSk7CisJCXZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7CisJfSAvLyBjcmVhdGVDb250ZXh0TWVudUZvcgorCQorCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlciBhbmQgYWRkcyBhIGxpc3RlbmVyIGFzIHdlbGwgcmVnaXN0ZXJpbmcgdGhlIG1lbnUgZm9yIGV4dGVuc2lvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvckdlbihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgeworCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQKKwkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7CisJCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKKwkJTWVudSBtZW51PSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKKwkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOworCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgbmV3IFVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcih2aWV3ZXIpKTsKKworCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSzsKKwkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OworCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgVmlld2VyRHJhZ0FkYXB0ZXIodmlld2VyKSk7CisJCXZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIGNhbGxlZCB0byBsb2FkIGEgcmVzb3VyY2UgaW50byB0aGUgZWRpdGluZyBkb21haW4ncyByZXNvdXJjZSBzZXQgYmFzZWQgb24gdGhlIGVkaXRvcidzIGlucHV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZU1vZGVsKCkgeworCQlVUkkgcmVzb3VyY2VVUkkgPSBFZGl0VUlVdGlsLmdldFVSSShnZXRFZGl0b3JJbnB1dCgpKTsKKwkJRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCS8vIExvYWQgdGhlIHJlc291cmNlIHRocm91Z2ggdGhlIGVkaXRpbmcgZG9tYWluLgorCQkJLy8KKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCB0cnVlKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWV4Y2VwdGlvbiA9IGU7CisJCQlyZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgZmFsc2UpOworCQl9CisKKwkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbik7CisJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCAgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQl9CisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5hZGQocHJvYmxlbUluZGljYXRpb25BZGFwdGVyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgZGlhZ25vc3RpYyBkZXNjcmliaW5nIHRoZSBlcnJvcnMgYW5kIHdhcm5pbmdzIGxpc3RlZCBpbiB0aGUgcmVzb3VyY2UKKwkgKiBhbmQgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gKGlmIGFueSkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERpYWdub3N0aWMgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMoUmVzb3VyY2UgcmVzb3VyY2UsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJaWYgKCFyZXNvdXJjZS5nZXRFcnJvcnMoKS5pc0VtcHR5KCkgfHwgIXJlc291cmNlLmdldFdhcm5pbmdzKCkuaXNFbXB0eSgpKSB7CisJCQlCYXNpY0RpYWdub3N0aWMgYmFzaWNEaWFnbm9zdGljID0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5lZGl0b3IiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZXhjZXB0aW9uID09IG51bGwgPyAoT2JqZWN0KXJlc291cmNlIDogZXhjZXB0aW9uIH0pOworCQkJYmFzaWNEaWFnbm9zdGljLm1lcmdlKEVjb3JlVXRpbC5jb21wdXRlRGlhZ25vc3RpYyhyZXNvdXJjZSwgdHJ1ZSkpOworCQkJcmV0dXJuIGJhc2ljRGlhZ25vc3RpYzsKKwkJfQorCQllbHNlIGlmIChleGNlcHRpb24gIT0gbnVsbCkgeworCQkJcmV0dXJuCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZWRpdG9yIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkgMCwKKwkJCQkJIGdldFN0cmluZygiX1VJX0NyZWF0ZU1vZGVsRXJyb3JfbWVzc2FnZSIsIHJlc291cmNlLmdldFVSSSgpKSwgLy8kTk9OLU5MUy0xJAorCQkJCQkgbmV3IE9iamVjdFtdIHsgZXhjZXB0aW9uIH0pOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIERpYWdub3N0aWMuT0tfSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGluc3RhbGwgeW91ciBvd24gY29udHJvbHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VzKCkgeworCQkvLyBDcmVhdGVzIHRoZSBtb2RlbCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQKKwkJLy8KKwkJY3JlYXRlTW9kZWwoKTsKKworCQkvLyBPbmx5IGNyZWF0ZXMgdGhlIG90aGVyIHBhZ2VzIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBlZGl0ZWQKKwkJLy8KKwkJaWYgKCFnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCS8vIENyZWF0ZSBhIHBhZ2UgZm9yIHRoZSBzZWxlY3Rpb24gdHJlZSB2aWV3LgorCQkJLy8KKwkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGdldENvbnRhaW5lcigpLCBTV1QuTVVMVEkpOworCQkJc2VsZWN0aW9uVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7CisJCQlzZXRDdXJyZW50Vmlld2VyKHNlbGVjdGlvblZpZXdlcik7CisKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkvL3NlbGVjdGlvblZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7CisKKwkJCW5ldyBBZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3Ioc2VsZWN0aW9uVmlld2VyLmdldFRyZWUoKSwgYWRhcHRlckZhY3RvcnkpOworCisJCQljcmVhdGVDb250ZXh0TWVudUZvcihzZWxlY3Rpb25WaWV3ZXIpOworCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2UodHJlZSk7CisJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKworCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkgc2V0QWN0aXZlUGFnZSgwKTsKKwkJCQkJIH0KKwkJCQkgfSk7CisJCX0KKworCQkvLyBFbnN1cmVzIHRoYXQgdGhpcyBlZGl0b3Igd2lsbCBvbmx5IGRpc3BsYXkgdGhlIHBhZ2UncyB0YWIKKwkJLy8gYXJlYSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBwYWdlCisJCS8vCisJCWdldENvbnRhaW5lcigpLmFkZENvbnRyb2xMaXN0ZW5lcgorCQkJKG5ldyBDb250cm9sQWRhcHRlcigpIHsKKwkJCQlib29sZWFuIGd1YXJkID0gZmFsc2U7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7CisJCQkJCWlmICghZ3VhcmQpIHsKKwkJCQkJCWd1YXJkID0gdHJ1ZTsKKwkJCQkJCWhpZGVUYWJzKCk7CisJCQkJCQlndWFyZCA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJIH0pOworCisJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCQkJIH0KKwkJCSB9KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGluc3RhbGwgeW91ciBvd24gY29udHJvbHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlUGFnZXNHZW4oKSB7CisJCS8vIENyZWF0ZXMgdGhlIG1vZGVsIGZyb20gdGhlIGVkaXRvciBpbnB1dAorCQkvLworCQljcmVhdGVNb2RlbCgpOworCisJCS8vIE9ubHkgY3JlYXRlcyB0aGUgb3RoZXIgcGFnZXMgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGVkaXRlZAorCQkvLworCQlpZiAoIWdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJLy8gQ3JlYXRlIGEgcGFnZSBmb3IgdGhlIHNlbGVjdGlvbiB0cmVlIHZpZXcuCisJCQkvLworCQkJVHJlZSB0cmVlID0gbmV3IFRyZWUoZ2V0Q29udGFpbmVyKCksIFNXVC5NVUxUSSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKKwkJCXNldEN1cnJlbnRWaWV3ZXIoc2VsZWN0aW9uVmlld2VyKTsKKworCQkJc2VsZWN0aW9uVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7CisKKwkJCW5ldyBBZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3Ioc2VsZWN0aW9uVmlld2VyLmdldFRyZWUoKSwgYWRhcHRlckZhY3RvcnkpOworCisJCQljcmVhdGVDb250ZXh0TWVudUZvcihzZWxlY3Rpb25WaWV3ZXIpOworCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2UodHJlZSk7CisJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKworCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkgc2V0QWN0aXZlUGFnZSgwKTsKKwkJCQkJIH0KKwkJCQkgfSk7CisJCX0KKworCQkvLyBFbnN1cmVzIHRoYXQgdGhpcyBlZGl0b3Igd2lsbCBvbmx5IGRpc3BsYXkgdGhlIHBhZ2UncyB0YWIKKwkJLy8gYXJlYSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBwYWdlCisJCS8vCisJCWdldENvbnRhaW5lcigpLmFkZENvbnRyb2xMaXN0ZW5lcgorCQkJKG5ldyBDb250cm9sQWRhcHRlcigpIHsKKwkJCQlib29sZWFuIGd1YXJkID0gZmFsc2U7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7CisJCQkJCWlmICghZ3VhcmQpIHsKKwkJCQkJCWd1YXJkID0gdHJ1ZTsKKwkJCQkJCWhpZGVUYWJzKCk7CisJCQkJCQlndWFyZCA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJIH0pOworCisJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCQkJIH0KKwkJCSB9KTsKKwl9CisKKwkvKioKKwkgKiBJZiB0aGVyZSBpcyBqdXN0IG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LAorCSAqIHRoaXMgaGlkZXMgdGhlIHNpbmdsZSB0YWIgYXQgdGhlIGJvdHRvbS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoaWRlVGFicygpIHsKKwkJaWYgKGdldFBhZ2VDb3VudCgpIDw9IDEpIHsKKwkJCXNldFBhZ2VUZXh0KDAsICIiKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgeworCQkJCSgoQ1RhYkZvbGRlcilnZXRDb250YWluZXIoKSkuc2V0VGFiSGVpZ2h0KDEpOworCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOworCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSArIDYpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LAorCSAqIHRoaXMgc2hvd3MgdGhlIHRhYnMgYXQgdGhlIGJvdHRvbS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzaG93VGFicygpIHsKKwkJaWYgKGdldFBhZ2VDb3VudCgpID4gMSkgeworCQkJc2V0UGFnZVRleHQoMCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgeworCQkJCSgoQ1RhYkZvbGRlcilnZXRDb250YWluZXIoKSkuc2V0VGFiSGVpZ2h0KFNXVC5ERUZBVUxUKTsKKwkJCQlQb2ludCBwb2ludCA9IGdldENvbnRhaW5lcigpLmdldFNpemUoKTsKKwkJCQlnZXRDb250YWluZXIoKS5zZXRTaXplKHBvaW50LngsIHBvaW50LnkgLSA2KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdXNlZCB0byB0cmFjayB0aGUgYWN0aXZlIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBwYWdlSW5kZXgpIHsKKwkJc3VwZXIucGFnZUNoYW5nZShwYWdlSW5kZXgpOworCisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgIT0gbnVsbCkgeworCQkJaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oY29udGVudE91dGxpbmVQYWdlLmdldFNlbGVjdGlvbigpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgaG93IHRoZSBmcmFtZXdvcmsgZGV0ZXJtaW5lcyB3aGljaCBpbnRlcmZhY2VzIHdlIGltcGxlbWVudC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7CisJCWlmIChrZXkuZXF1YWxzKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gc2hvd091dGxpbmVWaWV3KCkgPyBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSA6IG51bGw7CisJCX0KKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gZ2V0UHJvcGVydHlTaGVldFBhZ2UoKTsKKwkJfQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IG91dGxpbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQ29udGVudE91dGxpbmVQYWdlIGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIHsKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSA9PSBudWxsKSB7CisJCQkvLyBUaGUgY29udGVudCBvdXRsaW5lIGlzIGp1c3QgYSB0cmVlLgorCQkJLy8KKwkJCWNsYXNzIE15Q29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgQ29udGVudE91dGxpbmVQYWdlIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCQkJCS8vIFNldCB1cCB0aGUgdHJlZSB2aWV3ZXIuCisJCQkJCS8vCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisKKwkJCQkJLy8gTWFrZSBzdXJlIG91ciBwb3B1cHMgd29yay4KKwkJCQkJLy8KKwkJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IoY29udGVudE91dGxpbmVWaWV3ZXIpOworCisJCQkJCWlmICghZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkgIC8vIFNlbGVjdCB0aGUgcm9vdCBvYmplY3QgaW4gdGhlIHZpZXcuCisJCQkJCSAgLy8KKwkJCQkJICBjb250ZW50T3V0bGluZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCQkJCQl9CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgbWFrZUNvbnRyaWJ1dGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlcikgeworCQkJCQlzdXBlci5tYWtlQ29udHJpYnV0aW9ucyhtZW51TWFuYWdlciwgdG9vbEJhck1hbmFnZXIsIHN0YXR1c0xpbmVNYW5hZ2VyKTsKKwkJCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsKKwkJCQl9CisJCQl9CisKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZSA9IG5ldyBNeUNvbnRlbnRPdXRsaW5lUGFnZSgpOworCisJCQkvLyBMaXN0ZW4gdG8gc2VsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBpdCBpcyBhIHNwZWNpYWwgd2F5LgorCQkJLy8KKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKKwkJCQkobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQkJCSAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBoYW5kbGUgc2VsZWN0aW9ucyBjb3JyZWN0bHkuCisJCQkJCSAvLworCQkJCQkgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQkJCSBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJcmV0dXJuIGNvbnRlbnRPdXRsaW5lUGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIHByb3BlcnR5IHNoZWV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7CisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZSA9CisJCQkJbmV3IEV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2UoZWRpdGluZ0RvbWFpbikgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoTGlzdDw/PiBzZWxlY3Rpb24pIHsKKwkJCQkJCU1vZGlmaWVyRWRpdG9yLnRoaXMuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0aW9uKTsKKwkJCQkJCU1vZGlmaWVyRWRpdG9yLnRoaXMuc2V0Rm9jdXMoKTsKKwkJCQkJfQorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKKwkJCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7CisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsKKwkJCQkJfQorCQkJCX07CisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQl9CisKKwkJcmV0dXJuIHByb3BlcnR5U2hlZXRQYWdlOworCX0KKworCS8qKgorCSAqIFRoaXMgZGVhbHMgd2l0aCBob3cgd2Ugd2FudCBzZWxlY3Rpb24gaW4gdGhlIG91dGxpbmVyIHRvIGFmZmVjdCB0aGUgb3RoZXIgdmlld3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJaWYgKHNlbGVjdGlvblZpZXdlciAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQlJdGVyYXRvcjw/PiBzZWxlY3RlZEVsZW1lbnRzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLml0ZXJhdG9yKCk7CisJCQlpZiAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsKKwkJCQkvLyBHZXQgdGhlIGZpcnN0IHNlbGVjdGVkIGVsZW1lbnQuCisJCQkJLy8KKwkJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCk7CisKKwkJCQlBcnJheUxpc3Q8T2JqZWN0PiBzZWxlY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisJCQkJc2VsZWN0aW9uTGlzdC5hZGQoc2VsZWN0ZWRFbGVtZW50KTsKKwkJCQl3aGlsZSAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsKKwkJCQkJc2VsZWN0aW9uTGlzdC5hZGQoc2VsZWN0ZWRFbGVtZW50cy5uZXh0KCkpOworCQkJCX0KKworCQkJCS8vIFNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSB3aWRnZXQuCisJCQkJLy8KKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbkxpc3QpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSUVkaXRvclBhcnR9IGFuZCBzaW1wbHkgdGVzdHMgdGhlIGNvbW1hbmQgc3RhY2suCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKwkJcmV0dXJuICgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuaXNTYXZlTmVlZGVkKCk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSBzYXZlcyB0aGUgbW9kZWwgZmlsZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKKwkJLy8gU2F2ZSBvbmx5IHJlc291cmNlcyB0aGF0IGhhdmUgYWN0dWFsbHkgY2hhbmdlZC4KKwkJLy8KKwkJZmluYWwgTWFwPE9iamVjdCwgT2JqZWN0PiBzYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOworCQlzYXZlT3B0aW9ucy5wdXQoUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VELCBSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRURfTUVNT1JZX0JVRkZFUik7CisKKwkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbiBiZWNhdXNlIHRoaXMgaXMgYSBsb25nIHJ1bm5pbmcgYWN0aXZpdHkgdGhhdCBtb2RpZmllcyB0aGUgd29ya2JlbmNoLgorCQkvLworCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0KKwkJCW5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7CisJCQkJLy8gVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBydW5zLgorCQkJCS8vCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQkJLy8gU2F2ZSB0aGUgcmVzb3VyY2VzIHRvIHRoZSBmaWxlIHN5c3RlbS4KKwkJCQkJLy8KKwkJCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7CisJCQkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpIHsKKwkJCQkJCWlmICgoZmlyc3QgfHwgIXJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpIHx8IGlzUGVyc2lzdGVkKHJlc291cmNlKSkgJiYgIWVkaXRpbmdEb21haW4uaXNSZWFkT25seShyZXNvdXJjZSkpIHsKKwkJCQkJCQl0cnkgeworCQkJCQkJCQlsb25nIHRpbWVTdGFtcCA9IHJlc291cmNlLmdldFRpbWVTdGFtcCgpOworCQkJCQkJCQlyZXNvdXJjZS5zYXZlKHNhdmVPcHRpb25zKTsKKwkJCQkJCQkJaWYgKHJlc291cmNlLmdldFRpbWVTdGFtcCgpICE9IHRpbWVTdGFtcCkgeworCQkJCQkJCQkJc2F2ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJCQkJCQl9CisJCQkJCQkJZmlyc3QgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX07CisKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCS8vIFRoaXMgcnVucyB0aGUgb3B0aW9ucywgYW5kIHNob3dzIHByb2dyZXNzLgorCQkJLy8KKwkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpLnJ1bih0cnVlLCBmYWxzZSwgb3BlcmF0aW9uKTsKKworCQkJLy8gUmVmcmVzaCB0aGUgbmVjZXNzYXJ5IHN0YXRlLgorCQkJLy8KKwkJCSgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuc2F2ZUlzRG9uZSgpOworCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZyB0aGF0IHNob3VsZG4ndC4KKwkJCS8vCisJCQlDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgd2hldGhlciBzb21ldGhpbmcgaGFzIGJlZW4gcGVyc2lzdGVkIHRvIHRoZSBVUkkgb2YgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgVVJJIGNvbnZlcnRlciBmcm9tIHRoZSBlZGl0b3IncyByZXNvdXJjZSBzZXQgdG8gdHJ5IHRvIG9wZW4gYW4gaW5wdXQgc3RyZWFtLiAKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BlcnNpc3RlZChSZXNvdXJjZSByZXNvdXJjZSkgeworCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQl0cnkgeworCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKHJlc291cmNlLmdldFVSSSgpKTsKKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgeworCQkJCXJlc3VsdCA9IHRydWU7CisJCQkJc3RyZWFtLmNsb3NlKCk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElnbm9yZQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogVGhpcyBhbHdheXMgcmV0dXJucyB0cnVlIGJlY2F1c2UgaXQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFsc28gY2hhbmdlcyB0aGUgZWRpdG9yJ3MgaW5wdXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7CisJCVNhdmVBc0RpYWxvZyBzYXZlQXNEaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKKwkJc2F2ZUFzRGlhbG9nLm9wZW4oKTsKKwkJSVBhdGggcGF0aCA9IHNhdmVBc0RpYWxvZy5nZXRSZXN1bHQoKTsKKwkJaWYgKHBhdGggIT0gbnVsbCkgeworCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKKwkJCWlmIChmaWxlICE9IG51bGwpIHsKKwkJCQlkb1NhdmVBcyhVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZG9TYXZlQXMoVVJJIHVyaSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisJCShlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKS5zZXRVUkkodXJpKTsKKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKKwkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPQorCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgIT0gbnVsbCA/CisJCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgOgorCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisJCWRvU2F2ZShwcm9ncmVzc01vbml0b3IpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKKwkJdHJ5IHsKKwkJCWlmIChtYXJrZXIuZ2V0VHlwZSgpLmVxdWFscyhFVmFsaWRhdG9yLk1BUktFUikpIHsKKwkJCQlTdHJpbmcgdXJpQXR0cmlidXRlID0gbWFya2VyLmdldEF0dHJpYnV0ZShFVmFsaWRhdG9yLlVSSV9BVFRSSUJVVEUsIG51bGwpOworCQkJCWlmICh1cmlBdHRyaWJ1dGUgIT0gbnVsbCkgeworCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSSh1cmlBdHRyaWJ1dGUpOworCQkJCQlFT2JqZWN0IGVPYmplY3QgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0RU9iamVjdCh1cmksIHRydWUpOworCQkJCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7CisJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGVkaXRpbmdEb21haW4uZ2V0V3JhcHBlcihlT2JqZWN0KSkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBzdGFydHVwLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisJCXNldFNpdGUoc2l0ZSk7CisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7CisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7CisJCXNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7CisJCXNpdGUuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCWdldENvbnRyb2woZ2V0QWN0aXZlUGFnZSgpKS5zZXRGb2N1cygpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gcmV0dXJuIHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgeworCQlyZXR1cm4gZWRpdG9yU2VsZWN0aW9uOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHNldCB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLgorCSAqIENhbGxpbmcgdGhpcyByZXN1bHQgd2lsbCBub3RpZnkgdGhlIGxpc3RlbmVycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJZWRpdG9yU2VsZWN0aW9uID0gc2VsZWN0aW9uOworCisJCWZvciAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA6IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMpIHsKKwkJCWxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsKKwkJfQorCQlzZXRTdGF0dXNMaW5lTWFuYWdlcihzZWxlY3Rpb24pOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0YXR1c0xpbmVNYW5hZ2VyKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciA9IGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCAmJiBjdXJyZW50Vmlld2VyID09IGNvbnRlbnRPdXRsaW5lVmlld2VyID8KKwkJCWNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXIgOiBnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKKworCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgeworCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnRvTGlzdCgpOworCQkJCXN3aXRjaCAoY29sbGVjdGlvbi5zaXplKCkpIHsKKwkJCQkJY2FzZSAwOiB7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX05vT2JqZWN0U2VsZWN0ZWQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNhc2UgMTogeworCQkJCQkJU3RyaW5nIHRleHQgPSBuZXcgQWRhcHRlckZhY3RvcnlJdGVtRGVsZWdhdG9yKGFkYXB0ZXJGYWN0b3J5KS5nZXRUZXh0KGNvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkpOworCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZCIsIHRleHQpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZGVmYXVsdDogeworCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9NdWx0aU9iamVjdFNlbGVjdGVkIiwgSW50ZWdlci50b1N0cmluZyhjb2xsZWN0aW9uLnNpemUoKSkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBsb29rcyB1cCBhIHN0cmluZyBpbiB0aGUgcGx1Z2luJ3MgcGx1Z2luLnByb3BlcnRpZXMgZmlsZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJcmV0dXJuIENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSk7CisJfQorCisJLyoqCisJICogVGhpcyBsb29rcyB1cCBhIHN0cmluZyBpbiBwbHVnaW4ucHJvcGVydGllcywgbWFraW5nIGEgc3Vic3RpdHV0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxKSB7CisJCXJldHVybiBDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXksIG5ldyBPYmplY3QgW10geyBzMSB9KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyfSB0byBoZWxwIGZpbGwgdGhlIGNvbnRleHQgbWVudXMgd2l0aCBjb250cmlidXRpb25zIGZyb20gdGhlIEVkaXQgbWVudS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCSgoSU1lbnVMaXN0ZW5lcilnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSkubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgeworCQlyZXR1cm4gKEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcilnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsKKwkJcmV0dXJuIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aW9uQmFycygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisKKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7CisKKwkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKKworCQlhZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7CisKKwkJaWYgKGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gdGhpcykgeworCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IobnVsbCk7CisJCX0KKworCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgeworCQkJcHJvcGVydHlTaGVldFBhZ2UuZGlzcG9zZSgpOworCQl9CisKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7CisJCQljb250ZW50T3V0bGluZVBhZ2UuZGlzcG9zZSgpOworCQl9CisKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgb3V0bGluZSB2aWV3IHNob3VsZCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd091dGxpbmVWaWV3KCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3ByZWRpY2F0ZS9wcmVzZW50YXRpb24vUHJlZGljYXRlQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJlc2VudGF0aW9uL1ByZWRpY2F0ZUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjNDU1MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJlc2VudGF0aW9uL1ByZWRpY2F0ZUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKQEAgLTAsMCArMSw0MzcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbnRyb2xBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkxvYWRSZXNvdXJjZUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJDb250cmlidXRpb25JdGVtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcmVzZW50YXRpb24uQ29yZUVkaXRvclBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGFjdGlvbiBiYXIgY29udHJpYnV0b3IgZm9yIHRoZSBQcmVkaWNhdGUgbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBQcmVkaWNhdGVBY3Rpb25CYXJDb250cmlidXRvcgorCWV4dGVuZHMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yCisJaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3JQYXJ0OworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgYWN0aW9uIG9wZW5zIHRoZSBQcm9wZXJ0aWVzIHZpZXcuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElBY3Rpb24gc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uID0KKwkJbmV3IEFjdGlvbihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW0iKSkgLy8kTk9OLU5MUy0xJAorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQl0cnkgeworCQkJCQlnZXRQYWdlKCkuc2hvd1ZpZXcoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyBhY3Rpb24gcmVmcmVzaGVzIHRoZSB2aWV3ZXIgb2YgdGhlIGN1cnJlbnQgZWRpdG9yIGlmIHRoZSBlZGl0b3IKKwkgKiBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQWN0aW9uIHJlZnJlc2hWaWV3ZXJBY3Rpb24gPQorCQluZXcgQWN0aW9uKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0iKSkgLy8kTk9OLU5MUy0xJAorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKwkJCQlyZXR1cm4gYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcjsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJaWYgKGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKKwkJCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldFZpZXdlcigpOworCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKKwkJCQkJCXZpZXdlci5yZWZyZXNoKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gY29ycmVzcG9uZGluZyB0byBlYWNoIGRlc2NyaXB0b3IKKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBjcmVhdGVDaGlsZEFjdGlvbnM7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZUNoaWxkIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyB3aWxsIGNvbnRhaW4gb25lIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gY29ycmVzcG9uZGluZyB0byBlYWNoIGRlc2NyaXB0b3IKKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBjcmVhdGVTaWJsaW5nQWN0aW9uczsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCBmb3IgQ3JlYXRlU2libGluZyBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBjb250cmlidXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUHJlZGljYXRlQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7CisJCXN1cGVyKEFERElUSU9OU19MQVNUX1NUWUxFKTsKKwkJbG9hZFJlc291cmNlQWN0aW9uID0gbmV3IExvYWRSZXNvdXJjZUFjdGlvbigpOworCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBWYWxpZGF0ZUFjdGlvbigpOworCQljb250cm9sQWN0aW9uID0gbmV3IENvbnRyb2xBY3Rpb24oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgU2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucyB0byB0aGUgdG9vbCBiYXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInByZWRpY2F0ZS1zZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAorCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigicHJlZGljYXRlLWFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB0byB0aGUgbWVudSBiYXIgYSBtZW51IGFuZCBzb21lIHNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMsCisJICogYXMgd2VsbCBhcyB0aGUgc3ViLW1lbnVzIGZvciBvYmplY3QgY3JlYXRpb24gaXRlbXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51TWFuYWdlcik7CisKKwkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUHJlZGljYXRlRWRpdG9yX21lbnUiKSwgIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGVNZW51SUQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhY3Rpb25zIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucy1lbmQiKSk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVDaGlsZCBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCisJCS8vCisJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIFByZXBhcmUgZm9yIENyZWF0ZVNpYmxpbmcgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgorCQkvLworCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBGb3JjZSBhbiB1cGRhdGUgYmVjYXVzZSBFY2xpcHNlIGhpZGVzIGVtcHR5IG1lbnVzIG5vdy4KKwkJLy8KKwkJc3VibWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyCisJCQkobmV3IElNZW51TGlzdGVuZXIoKSB7CisJCQkJIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJCQkJIG1lbnVNYW5hZ2VyLnVwZGF0ZUFsbCh0cnVlKTsKKwkJCQkgfQorCQkJIH0pOworCisJCWFkZEdsb2JhbEFjdGlvbnMoc3VibWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIFdoZW4gdGhlIGFjdGl2ZSBlZGl0b3IgY2hhbmdlcywgdGhpcyByZW1lbWJlcnMgdGhlIGNoYW5nZSBhbmQgcmVnaXN0ZXJzIHdpdGggaXQgYXMgYSBzZWxlY3Rpb24gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHBhcnQpIHsKKwkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOworCQlhY3RpdmVFZGl0b3JQYXJ0ID0gcGFydDsKKworCQkvLyBTd2l0Y2ggdG8gdGhlIG5ldyBzZWxlY3Rpb24gcHJvdmlkZXIuCisJCS8vCisJCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCX0KKwkJaWYgKHBhcnQgPT0gbnVsbCkgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOworCQl9CisJCWVsc2UgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBwYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOworCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCQkvLyBGYWtlIGEgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgdG8gdXBkYXRlIHRoZSBtZW51cy4KKwkJCS8vCisJCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkgeworCQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfSwKKwkgKiBoYW5kbGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnR9cyBieSBxdWVyeWluZyBmb3IgdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncworCSAqIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZWxlY3RlZCBvYmplY3QgYW5kIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uCisJCS8vCisJCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7CisJCX0KKwkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsKKwkJfQorCisJCS8vIFF1ZXJ5IHRoZSBuZXcgc2VsZWN0aW9uIGZvciBhcHByb3ByaWF0ZSBuZXcgY2hpbGQvc2libGluZyBkZXNjcmlwdG9ycworCQkvLworCQlDb2xsZWN0aW9uPD8+IG5ld0NoaWxkRGVzY3JpcHRvcnMgPSBudWxsOworCQlDb2xsZWN0aW9uPD8+IG5ld1NpYmxpbmdEZXNjcmlwdG9ycyA9IG51bGw7CisKKwkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5zaXplKCkgPT0gMSkgeworCQkJT2JqZWN0IG9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKKworCQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpYWN0aXZlRWRpdG9yUGFydCkuZ2V0RWRpdGluZ0RvbWFpbigpOworCisJCQluZXdDaGlsZERlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMob2JqZWN0LCBudWxsKTsKKwkJCW5ld1NpYmxpbmdEZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG51bGwsIG9iamVjdCk7CisJCX0KKworCQkvLyBHZW5lcmF0ZSBhY3Rpb25zIGZvciBzZWxlY3Rpb247IHBvcHVsYXRlIGFuZCByZWRyYXcgdGhlIG1lbnVzLgorCQkvLworCQljcmVhdGVDaGlsZEFjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhuZXdDaGlsZERlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOworCQljcmVhdGVTaWJsaW5nQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMobmV3U2libGluZ0Rlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOworCisJCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOworCQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7CisJCX0KKwkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7CisJCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LAorCSAqIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMoQ29sbGVjdGlvbjw/PiBkZXNjcmlwdG9ycywgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJQ29sbGVjdGlvbjxJQWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOworCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgeworCQkJZm9yIChPYmplY3QgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7CisJCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZUNoaWxkQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwgZGVzY3JpcHRvcikpOworCQkJfQorCQl9CisJCXJldHVybiBhY3Rpb25zOworCX0KKworCS8qKgorCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LAorCSAqIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7CisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7CisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlU2libGluZ0FjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYWN0aW9uczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IHdpdGgge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMKKwkgKiBiYXNlZCBvbiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLAorCSAqIGJ5IGluc2VydGluZyB0aGVtIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGNvbnRyaWJ1dGlvbiBpdGVtIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPi4KKwkgKiBJZiA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZXkgYXJlIHNpbXBseSBhZGRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucywgU3RyaW5nIGNvbnRyaWJ1dGlvbklEKSB7CisJCWlmIChhY3Rpb25zICE9IG51bGwpIHsKKwkJCWZvciAoSUFjdGlvbiBhY3Rpb24gOiBhY3Rpb25zKSB7CisJCQkJaWYgKGNvbnRyaWJ1dGlvbklEICE9IG51bGwpIHsKKwkJCQkJbWFuYWdlci5pbnNlcnRCZWZvcmUoY29udHJpYnV0aW9uSUQsIGFjdGlvbik7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQltYW5hZ2VyLmFkZChhY3Rpb24pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkJCisJLyoqCisJICogVGhpcyByZW1vdmVzIGZyb20gdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMKKwkgKiBiYXNlZCBvbiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGRlcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248PyBleHRlbmRzIElBY3Rpb24+IGFjdGlvbnMpIHsKKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgeworCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0SXRlbXMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKKwkJCQkvLyBMb29rIGludG8gU3ViQ29udHJpYnV0aW9uSXRlbXMKKwkJCQkvLworCQkJCUlDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbkl0ZW0gPSBpdGVtc1tpXTsKKwkJCQl3aGlsZSAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIHsKKwkJCQkJY29udHJpYnV0aW9uSXRlbSA9ICgoU3ViQ29udHJpYnV0aW9uSXRlbSljb250cmlidXRpb25JdGVtKS5nZXRJbm5lckl0ZW0oKTsKKwkJCQl9CisKKwkJCQkvLyBEZWxldGUgdGhlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1zIHdpdGggbWF0Y2hpbmcgYWN0aW9uLgorCQkJCS8vCisJCQkJaWYgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7CisJCQkJCUlBY3Rpb24gYWN0aW9uID0gKChBY3Rpb25Db250cmlidXRpb25JdGVtKWNvbnRyaWJ1dGlvbkl0ZW0pLmdldEFjdGlvbigpOworCQkJCQlpZiAoYWN0aW9ucy5jb250YWlucyhhY3Rpb24pKSB7CisJCQkJCQltYW5hZ2VyLnJlbW92ZShjb250cmlidXRpb25JdGVtKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBwb3AtdXAgbWVudSBiZWZvcmUgaXQgYXBwZWFycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7CisJCU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbnVsbDsKKworCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7CisJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZWRpdCIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7CisJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZWRpdCIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgaW5zZXJ0cyBnbG9iYWwgYWN0aW9ucyBiZWZvcmUgdGhlICJhZGRpdGlvbnMtZW5kIiBzZXBhcmF0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucy1lbmQiLCBuZXcgU2VwYXJhdG9yKCJ1aS1hY3Rpb25zIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24pOyAvLyROT04tTkxTLTEkCisKKwkJcmVmcmVzaFZpZXdlckFjdGlvbi5zZXRFbmFibGVkKHJlZnJlc2hWaWV3ZXJBY3Rpb24uaXNFbmFibGVkKCkpOwkJCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgcmVmcmVzaFZpZXdlckFjdGlvbik7IC8vJE5PTi1OTFMtMSQKKworCQlzdXBlci5hZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGVuc3VyZXMgdGhhdCBhIGRlbGV0ZSBhY3Rpb24gd2lsbCBjbGVhbiB1cCBhbGwgcmVmZXJlbmNlcyB0byBkZWxldGVkIG9iamVjdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlQWxsUmVmZXJlbmNlc09uRGVsZXRlKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3ByZXNlbnRhdGlvbi9QcmVkaWNhdGVFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9wcmVkaWNhdGUvcHJlc2VudGF0aW9uL1ByZWRpY2F0ZUVkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZGM3NzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvcHJlZGljYXRlL3ByZXNlbnRhdGlvbi9QcmVkaWNhdGVFZGl0b3IuamF2YQpAQCAtMCwwICsxLDE2ODYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkxvY2FsU2VsZWN0aW9uVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TYXZlQXNEaWFsb2c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5NYXJrZXJIZWxwZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLmVkaXRvci5Qcm9ibGVtRWRpdG9yUGFydDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVmFsaWRhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlJdGVtRGVsZWdhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5jZWxsZWRpdG9yLkFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkxvY2FsVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLlZpZXdlckRyYWdBZGFwdGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLlVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJTWFya2VySGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJVXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnZpZXcuRXh0ZW5kZWRQcm9wZXJ0eVNoZWV0UGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByb3ZpZGVyLlByZWRpY2F0ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByZXNlbnRhdGlvbi5Db3JlRWRpdG9yUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LnByb3ZpZGVyLkV4cGVyaW1lbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlci5HcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByb3ZpZGVyLk1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXIuTW9kaWZpZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJvdmlkZXIuU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIucHJvdmlkZXIuU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLnByb3ZpZGVyLlNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLnByb3ZpZGVyLlRyaWdnZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOworCisKKy8qKgorICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgUHJlZGljYXRlIG1vZGVsIGVkaXRvci4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgUHJlZGljYXRlRWRpdG9yCisJZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0CisJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpblByb3ZpZGVyLCBJU2VsZWN0aW9uUHJvdmlkZXIsIElNZW51TGlzdGVuZXIsIElWaWV3ZXJQcm92aWRlciwgSUdvdG9NYXJrZXIgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGVkaXRpbmcgZG9tYWluIHRoYXQgaXMgdXNlZCB0byB0cmFjayBhbGwgY2hhbmdlcyB0byB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgb25lIGFkYXB0ZXIgZmFjdG9yeSB1c2VkIGZvciBwcm92aWRpbmcgdmlld3Mgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElDb250ZW50T3V0bGluZVBhZ2UgY29udGVudE91dGxpbmVQYWdlOworCisJLyoqCisJICogVGhpcyBpcyBhIGtsdWRnZS4uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlJ3Mgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmVlVmlld2VyIGNvbnRlbnRPdXRsaW5lVmlld2VyOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgcHJvcGVydHkgc2hlZXQgcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB2aWV3ZXIgdGhhdCBzaGFkb3dzIHRoZSBzZWxlY3Rpb24gaW4gdGhlIGNvbnRlbnQgb3V0bGluZS4KKwkgKiBUaGUgcGFyZW50IHJlbGF0aW9uIG11c3QgYmUgY29ycmVjdGx5IGRlZmluZWQgZm9yIHRoaXMgdG8gd29yay4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBzZWxlY3Rpb25WaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgY29udGVudCB2aWV3ZXIsIHdoaWNoIG1heSBiZSBlaXRoZXIgb25lIG9mIHRoZSB2aWV3ZXJzIGluIHRoZSBwYWdlcyBvciB0aGUgY29udGVudCBvdXRsaW5lIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVmlld2VyIGN1cnJlbnRWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgdG8gd2hpY2ggZXZlciB2aWV3ZXIgaXMgYWN0aXZlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfXMgdGhhdCBhcmUgbGlzdGVuaW5nIHRvIHRoaXMgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+KCk7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGVkaXRvciBhcyBhIHdob2xlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uIGVkaXRvclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7CisKKwkvKioKKwkgKiBUaGUgTWFya2VySGVscGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB3b3Jrc3BhY2UgcmVzb3VyY2UgbWFya2VycyBwcmVzZW50ZWQKKwkgKiBpbiBFY2xpcHNlJ3MgUHJvYmxlbXMgVmlldy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFya2VySGVscGVyIG1hcmtlckhlbHBlciA9IG5ldyBFZGl0VUlNYXJrZXJIZWxwZXIoKTsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyBmb3Igd2hlbiB0aGUgb3V0bGluZSBiZWNvbWVzIGFjdGl2ZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9CisJCW5ldyBJUGFydExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJaWYgKHAgaW5zdGFuY2VvZiBDb250ZW50T3V0bGluZSkgeworCQkJCQlpZiAoKChDb250ZW50T3V0bGluZSlwKS5nZXRDdXJyZW50UGFnZSgpID09IGNvbnRlbnRPdXRsaW5lUGFnZSkgeworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoUHJlZGljYXRlRWRpdG9yLnRoaXMpOworCisJCQkJCQlzZXRDdXJyZW50Vmlld2VyKGNvbnRlbnRPdXRsaW5lVmlld2VyKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChwIGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgeworCQkJCQlpZiAoKChQcm9wZXJ0eVNoZWV0KXApLmdldEN1cnJlbnRQYWdlKCkgPT0gcHJvcGVydHlTaGVldFBhZ2UpIHsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKFByZWRpY2F0ZUVkaXRvci50aGlzKTsKKwkJCQkJCWhhbmRsZUFjdGl2YXRlKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAocCA9PSBQcmVkaWNhdGVFZGl0b3IudGhpcykgeworCQkJCQloYW5kbGVBY3RpdmF0ZSgpOworCQkJCX0KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQl9OworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkIHNpbmNlIGxhc3QgYWN0aXZhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gc2F2ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHNhdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIE1hcCB0byBzdG9yZSB0aGUgZGlhZ25vc3RpYyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwPFJlc291cmNlLCBEaWFnbm9zdGljPiByZXNvdXJjZVRvRGlhZ25vc3RpY01hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFJlc291cmNlLCBEaWFnbm9zdGljPigpOworCisJLyoqCisJICogQ29udHJvbHMgd2hldGhlciB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHNob3VsZCBiZSB1cGRhdGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKworCS8qKgorCSAqIEFkYXB0ZXIgdXNlZCB0byB1cGRhdGUgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiB3aGVuIHJlc291cmNlcyBhcmUgZGVtYW5kZWQgbG9hZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBFQ29udGVudEFkYXB0ZXIgcHJvYmxlbUluZGljYXRpb25BZGFwdGVyID0gCisJCW5ldyBFQ29udGVudEFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisJCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZXNvdXJjZS5jbGFzcykpIHsKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRDoKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0VSUk9SUzoKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX1dBUk5JTkdTOiB7CisJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2Upbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7CisJCQkJCQkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIG51bGwpOworCQkJCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGRpYWdub3N0aWMpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucmVtb3ZlKHJlc291cmNlKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAodXBkYXRlUHJvYmxlbUluZGljYXRpb24pIHsKKwkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkJCQkJCQkgfQorCQkJCQkJCQkJIH0pOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCQkJCX0KKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7CisJCQkJYmFzaWNTZXRUYXJnZXQodGFyZ2V0KTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCB1bnNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsKKwkJCQliYXNpY1Vuc2V0VGFyZ2V0KHRhcmdldCk7CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdvcmtzcGFjZSBjaGFuZ2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0KKwkJbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOworCQkJCXRyeSB7CisJCQkJCWNsYXNzIFJlc291cmNlRGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKKwkJCQkJCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKwkJCQkJCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKKwkJCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIHx8CisJCQkJCQkJCSAgICBkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiBkZWx0YS5nZXRGbGFncygpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMpIHsKKwkJCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZGVsdGEuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKSwgZmFsc2UpOworCQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKKwkJCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKKwkJCQkJCQkJCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQllbHNlIGlmICghc2F2ZWRSZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlKSkgeworCQkJCQkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQl9CisKKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgeworCQkJCQkJCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOworCQkJCQkJfQorCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsKKwkJCQkJCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlczsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWZpbmFsIFJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsKKwkJCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOworCisJCQkJCWlmICghdmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCSByZW1vdmVkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKSk7CisJCQkJCQkJCQkgaWYgKCFpc0RpcnR5KCkpIHsKKwkJCQkJCQkJCQkgZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihQcmVkaWNhdGVFZGl0b3IudGhpcywgZmFsc2UpOworCQkJCQkJCQkJIH0KKwkJCQkJCQkJIH0KKwkJCQkJCQkgfSk7CisJCQkJCX0KKworCQkJCQlpZiAoIXZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOworCQkJCQkJCQkJIGlmIChnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpID09IFByZWRpY2F0ZUVkaXRvci50aGlzKSB7CisJCQkJCQkJCQkJIGhhbmRsZUFjdGl2YXRlKCk7CisJCQkJCQkJCQkgfQorCQkJCQkJCQkgfQorCQkJCQkJCSB9KTsKKwkJCQkJfQorCQkJCX0KKwkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBIYW5kbGVzIGFjdGl2YXRpb24gb2YgdGhlIGVkaXRvciBvciBpdCdzIGFzc29jaWF0ZWQgdmlld3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoKSB7CisJCS8vIFJlY29tcHV0ZSB0aGUgcmVhZCBvbmx5IHN0YXRlLgorCQkvLworCQlpZiAoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKSAhPSBudWxsKSB7CisJCSAgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKS5jbGVhcigpOworCisJCSAgLy8gUmVmcmVzaCBhbnkgYWN0aW9ucyB0aGF0IG1heSBiZWNvbWUgZW5hYmxlZCBvciBkaXNhYmxlZC4KKwkJICAvLworCQkgIHNldFNlbGVjdGlvbihnZXRTZWxlY3Rpb24oKSk7CisJCX0KKworCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7CisJCQlpZiAoaGFuZGxlRGlydHlDb25mbGljdCgpKSB7CisJCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihQcmVkaWNhdGVFZGl0b3IudGhpcywgZmFsc2UpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVtb3ZlZFJlc291cmNlcy5jbGVhcigpOworCQkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgeworCQkJY2hhbmdlZFJlc291cmNlcy5yZW1vdmVBbGwoc2F2ZWRSZXNvdXJjZXMpOworCQkJaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpOworCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOworCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEhhbmRsZXMgd2hhdCB0byBkbyB3aXRoIGNoYW5nZWQgcmVzb3VyY2VzIG9uIGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpIHsKKwkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSAmJiAoIWlzRGlydHkoKSB8fCBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpKSB7CisJCQlpZiAoaXNEaXJ0eSgpKSB7CisJCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsKKwkJCX0KKwkJCWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZmx1c2goKTsKKworCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKwkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7CisJCQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKKwkJCQkJcmVzb3VyY2UudW5sb2FkKCk7CisJCQkJCXRyeSB7CisJCQkJCQlyZXNvdXJjZS5sb2FkKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJaWYgKCFyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5jb250YWluc0tleShyZXNvdXJjZSkpIHsKKwkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbi5pc1N0YWxlKGVkaXRvclNlbGVjdGlvbikpIHsKKwkJCQlzZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7CisJCQl9CisKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCX0KKwl9CisgIAorCS8qKgorCSAqIFVwZGF0ZXMgdGhlIHByb2JsZW1zIGluZGljYXRpb24gd2l0aCB0aGUgaW5mb3JtYXRpb24gZGVzY3JpYmVkIGluIHRoZSBzcGVjaWZpZWQgZGlhZ25vc3RpYy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpIHsKKwkJaWYgKHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKSB7CisJCQlCYXNpY0RpYWdub3N0aWMgZGlhZ25vc3RpYyA9CisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5PSywKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZWRpdG9yIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkgMCwKKwkJCQkJIG51bGwsCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpIH0pOworCQkJZm9yIChEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA6IHJlc291cmNlVG9EaWFnbm9zdGljTWFwLnZhbHVlcygpKSB7CisJCQkJaWYgKGNoaWxkRGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJZGlhZ25vc3RpYy5hZGQoY2hpbGREaWFnbm9zdGljKTsKKwkJCQl9CisJCQl9CisKKwkJCWludCBsYXN0RWRpdG9yUGFnZSA9IGdldFBhZ2VDb3VudCgpIC0gMTsKKwkJCWlmIChsYXN0RWRpdG9yUGFnZSA+PSAwICYmIGdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkgaW5zdGFuY2VvZiBQcm9ibGVtRWRpdG9yUGFydCkgeworCQkJCSgoUHJvYmxlbUVkaXRvclBhcnQpZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSkuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQlQcm9ibGVtRWRpdG9yUGFydCBwcm9ibGVtRWRpdG9yUGFydCA9IG5ldyBQcm9ibGVtRWRpdG9yUGFydCgpOworCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7CisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0TWFya2VySGVscGVyKG1hcmtlckhlbHBlcik7CisJCQkJdHJ5IHsKKwkJCQkJYWRkUGFnZSgrK2xhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydCwgZ2V0RWRpdG9ySW5wdXQoKSk7CisJCQkJCXNldFBhZ2VUZXh0KGxhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydC5nZXRQYXJ0TmFtZSgpKTsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJCXNob3dUYWJzKCk7CisJCQkJfQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChtYXJrZXJIZWxwZXIuaGFzTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpKSB7CisJCQkJbWFya2VySGVscGVyLmRlbGV0ZU1hcmtlcnMoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCW1hcmtlckhlbHBlci5jcmVhdGVNYXJrZXJzKGRpYWdub3N0aWMpOworCQkJCQl9CisJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFNob3dzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsKKwkJcmV0dXJuCisJCQlNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbgorCQkJCShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRmlsZUNvbmZsaWN0X2xhYmVsIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfV0FSTl9GaWxlQ29uZmxpY3QiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBtb2RlbCBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByZWRpY2F0ZUVkaXRvcigpIHsKKwkJc3VwZXIoKTsKKwkJaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdXAgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgbW9kZWwgZWRpdG9yLiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKSB7CisJCWluaXRpYWxpemVFZGl0aW5nRG9tYWluR2VuKCk7CisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpCisJCQkJLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgiKiIsCisJCQkJCQlTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbC5JTlNUQU5DRSk7CisKKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkKKwkJCQkuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKS5wdXQoInBsYXRmb3JtIiwKKwkJCQkJCVNURU1YTUlSZXNvdXJjZUZhY3RvcnlJbXBsLklOU1RBTkNFKTsKKwl9IC8vIGluaXRpYWxpemVFZGl0aW5nRG9tYWluCisJCisJLyoqCisJICogVGhpcyBzZXRzIHVwIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1vZGVsIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWRpdGluZ0RvbWFpbkdlbigpIHsKKwkJLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlpZWxkcyBpdGVtIHByb3ZpZGVycy4KKwkJLy8KKwkJYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOworCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBFeHBlcmltZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBHcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBQcmVkaWNhdGVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFRyaWdnZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKworCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUgZXhlY3V0ZWQuCisJCS8vCisJCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOworCisJCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCisJCS8vCisJCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcgorCQkJKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKKwkJCQkgcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgeworCQkJCQkgZ2V0Q29udGFpbmVyKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJIChuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJICBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCSAgZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworCisJCQkJCQkJCSAgLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KKwkJCQkJCQkJICAvLworCQkJCQkJCQkgIENvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaylldmVudC5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsKKwkJCQkJCQkJICBpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgeworCQkJCQkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihtb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7CisJCQkJCQkJCSAgfQorCQkJCQkJCQkgIGlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsICYmICFwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQkJCQkgIHByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsKKwkJCQkJCQkJICB9CisJCQkJCQkJICB9CisJCQkJCQkgIH0pOworCQkJCSB9CisJCQkgfSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgorCQkvLworCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgQm9vbGVhbj4oKSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBoZXJlIGZvciB0aGUgbGlzdGVuZXIgdG8gYmUgYWJsZSB0byBjYWxsIGl0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCQkJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGludCBhY3Rpb24pIHsKKwkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKGFjdGlvbik7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHRoZSBzZWxlY3Rpb24gaW50byB3aGljaGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKKwkJZmluYWwgQ29sbGVjdGlvbjw/PiB0aGVTZWxlY3Rpb24gPSBjb2xsZWN0aW9uOworCQkvLyBNYWtlIHN1cmUgaXQncyBva2F5LgorCQkvLworCQlpZiAodGhlU2VsZWN0aW9uICE9IG51bGwgJiYgIXRoZVNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKKwkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0KKwkJCQluZXcgUnVubmFibGUoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGl0ZW1zIGluIHRoZSBjdXJyZW50IGNvbnRlbnQgdmlld2VyIG9mIHRoZSBlZGl0b3IuCisJCQkJCQkvLworCQkJCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgeworCQkJCQkJCWN1cnJlbnRWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoZVNlbGVjdGlvbi50b0FycmF5KCkpLCB0cnVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX07CisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgZWRpdGluZyBkb21haW4gYXMgcmVxdWlyZWQgYnkgdGhlIHtAbGluayBJRWRpdGluZ0RvbWFpblByb3ZpZGVyfSBpbnRlcmZhY2UuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGltcGxlbWVudGluZyB0aGUgc3RhdGljIG1ldGhvZHMgb2Yge0BsaW5rIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbn0KKwkgKiBhbmQgZm9yIHN1cHBvcnRpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgeworCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgY2xhc3MgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgeworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKwkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0IFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIHBhcmVudCAhPSBudWxsOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ha2VzIHN1cmUgdGhhdCBvbmUgY29udGVudCB2aWV3ZXIsIGVpdGhlciBmb3IgdGhlIGN1cnJlbnQgcGFnZSBvciB0aGUgb3V0bGluZSB2aWV3LCBpZiBpdCBoYXMgZm9jdXMsCisJICogaXMgdGhlIGN1cnJlbnQgb25lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRWaWV3ZXIoVmlld2VyIHZpZXdlcikgeworCQkvLyBJZiBpdCBpcyBjaGFuZ2luZy4uLgorCQkvLworCQlpZiAoY3VycmVudFZpZXdlciAhPSB2aWV3ZXIpIHsKKwkJCWlmIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgeworCQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgb24gZGVtYW5kLgorCQkJCS8vCisJCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0KKwkJCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQkJCQkvLyBUaGlzIGp1c3Qgbm90aWZpZXMgdGhvc2UgdGhpbmdzIHRoYXQgYXJlIGFmZmVjdGVkIGJ5IHRoZSBzZWN0aW9uLgorCQkJCQkJLy8KKwkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHNlbGVjdGlvbkNoYW5nZWRFdmVudCkgeworCQkJCQkJCXNldFNlbGVjdGlvbihzZWxlY3Rpb25DaGFuZ2VkRXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQkJfQorCQkJCQl9OworCQkJfQorCisJCQkvLyBTdG9wIGxpc3RlbmluZyB0byB0aGUgb2xkIG9uZS4KKwkJCS8vCisJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7CisJCQkJY3VycmVudFZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKKwkJCX0KKworCQkJLy8gU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXcgb25lLgorCQkJLy8KKwkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgeworCQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKKwkJCX0KKworCQkJLy8gUmVtZW1iZXIgaXQuCisJCQkvLworCQkJY3VycmVudFZpZXdlciA9IHZpZXdlcjsKKworCQkJLy8gU2V0IHRoZSBlZGl0b3JzIHNlbGVjdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCB2aWV3ZXIncyBzZWxlY3Rpb24uCisJCQkvLworCQkJc2V0U2VsZWN0aW9uKGN1cnJlbnRWaWV3ZXIgPT0gbnVsbCA/IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkgOiBjdXJyZW50Vmlld2VyLmdldFNlbGVjdGlvbigpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgdmlld2VyIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSVZpZXdlclByb3ZpZGVyfSBpbnRlcmZhY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7CisJCXJldHVybiBjdXJyZW50Vmlld2VyOworCX0KKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlciBhbmQgYWRkcyBhIGxpc3RlbmVyIGFzIHdlbGwKKwkgKiByZWdpc3RlcmluZyB0aGUgbWVudSBmb3IgZXh0ZW5zaW9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKKwkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOworCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7CisJCU1lbnUgbWVudSA9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOworCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7CisJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGNvbnRleHRNZW51LCB2aWV3ZXIpOworCisJCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LOworCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHtMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCksIExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKKwkJCQlUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OworCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgVmlld2VyRHJhZ0FkYXB0ZXIoCisJCQkJdmlld2VyKSk7CisJCXZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsCisJCQkJbmV3IEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKKwl9IC8vIGNyZWF0ZUNvbnRleHRNZW51Rm9yCisJCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGEgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyIGFuZCBhZGRzIGEgbGlzdGVuZXIgYXMgd2VsbCByZWdpc3RlcmluZyB0aGUgbWVudSBmb3IgZXh0ZW5zaW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yR2VuKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7CisJCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsgLy8kTk9OLU5MUy0xJAorCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKKwkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKHRoaXMpOworCQlNZW51IG1lbnU9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOworCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7CisJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGNvbnRleHRNZW51LCBuZXcgVW53cmFwcGluZ1NlbGVjdGlvblByb3ZpZGVyKHZpZXdlcikpOworCisJCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LOworCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07CisJCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKKwkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgY2FsbGVkIHRvIGxvYWQgYSByZXNvdXJjZSBpbnRvIHRoZSBlZGl0aW5nIGRvbWFpbidzIHJlc291cmNlIHNldCBiYXNlZCBvbiB0aGUgZWRpdG9yJ3MgaW5wdXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlTW9kZWwoKSB7CisJCVVSSSByZXNvdXJjZVVSSSA9IEVkaXRVSVV0aWwuZ2V0VVJJKGdldEVkaXRvcklucHV0KCkpOworCQlFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworCQl0cnkgeworCQkJLy8gTG9hZCB0aGUgcmVzb3VyY2UgdGhyb3VnaCB0aGUgZWRpdGluZyBkb21haW4uCisJCQkvLworCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIHRydWUpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZXhjZXB0aW9uID0gZTsKKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCBmYWxzZSk7CisJCX0KKworCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKTsKKwkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsICBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCX0KKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBkaWFnbm9zdGljIGRlc2NyaWJpbmcgdGhlIGVycm9ycyBhbmQgd2FybmluZ3MgbGlzdGVkIGluIHRoZSByZXNvdXJjZQorCSAqIGFuZCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiAoaWYgYW55KS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGlhZ25vc3RpYyBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhSZXNvdXJjZSByZXNvdXJjZSwgRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQlpZiAoIXJlc291cmNlLmdldEVycm9ycygpLmlzRW1wdHkoKSB8fCAhcmVzb3VyY2UuZ2V0V2FybmluZ3MoKS5pc0VtcHR5KCkpIHsKKwkJCUJhc2ljRGlhZ25vc3RpYyBiYXNpY0RpYWdub3N0aWMgPQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMKKwkJCQkJKERpYWdub3N0aWMuRVJST1IsCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmVkaXRvciIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJIDAsCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksIC8vJE5PTi1OTFMtMSQKKwkJCQkJIG5ldyBPYmplY3QgW10geyBleGNlcHRpb24gPT0gbnVsbCA/IChPYmplY3QpcmVzb3VyY2UgOiBleGNlcHRpb24gfSk7CisJCQliYXNpY0RpYWdub3N0aWMubWVyZ2UoRWNvcmVVdGlsLmNvbXB1dGVEaWFnbm9zdGljKHJlc291cmNlLCB0cnVlKSk7CisJCQlyZXR1cm4gYmFzaWNEaWFnbm9zdGljOworCQl9CisJCWVsc2UgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQlyZXR1cm4KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5lZGl0b3IiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCSBuZXcgT2JqZWN0W10geyBleGNlcHRpb24gfSk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gRGlhZ25vc3RpYy5PS19JTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gaW5zdGFsbCB5b3VyIG93biBjb250cm9scy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3JlYXRlUGFnZXMoKSB7CisJCS8vIENyZWF0ZXMgdGhlIG1vZGVsIGZyb20gdGhlIGVkaXRvciBpbnB1dAorCQkvLworCQljcmVhdGVNb2RlbCgpOworCisJCS8vIE9ubHkgY3JlYXRlcyB0aGUgb3RoZXIgcGFnZXMgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGVkaXRlZAorCQkvLworCQlpZiAoIWdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJLy8gQ3JlYXRlIGEgcGFnZSBmb3IgdGhlIHNlbGVjdGlvbiB0cmVlIHZpZXcuCisJCQkvLworCQkJVHJlZSB0cmVlID0gbmV3IFRyZWUoZ2V0Q29udGFpbmVyKCksIFNXVC5NVUxUSSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKKwkJCXNldEN1cnJlbnRWaWV3ZXIoc2VsZWN0aW9uVmlld2VyKTsKKworCQkJc2VsZWN0aW9uVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCS8vc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKworCQkJbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcihzZWxlY3Rpb25WaWV3ZXIuZ2V0VHJlZSgpLCBhZGFwdGVyRmFjdG9yeSk7CisKKwkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHNlbGVjdGlvblZpZXdlcik7CisJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh0cmVlKTsKKwkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCSBzZXRBY3RpdmVQYWdlKDApOworCQkJCQkgfQorCQkJCSB9KTsKKwkJfQorCisJCS8vIEVuc3VyZXMgdGhhdCB0aGlzIGVkaXRvciB3aWxsIG9ubHkgZGlzcGxheSB0aGUgcGFnZSdzIHRhYgorCQkvLyBhcmVhIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHBhZ2UKKwkJLy8KKwkJZ2V0Q29udGFpbmVyKCkuYWRkQ29udHJvbExpc3RlbmVyCisJCQkobmV3IENvbnRyb2xBZGFwdGVyKCkgeworCQkJCWJvb2xlYW4gZ3VhcmQgPSBmYWxzZTsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsKKwkJCQkJaWYgKCFndWFyZCkgeworCQkJCQkJZ3VhcmQgPSB0cnVlOworCQkJCQkJaGlkZVRhYnMoKTsKKwkJCQkJCWd1YXJkID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkgfSk7CisKKwkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkgfQorCQkJIH0pOworCX0gLy8gY3JlYXRlUGFnZXMKKwkKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGluc3RhbGwgeW91ciBvd24gY29udHJvbHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJLy9AT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlc0dlbigpIHsKKwkJLy8gQ3JlYXRlcyB0aGUgbW9kZWwgZnJvbSB0aGUgZWRpdG9yIGlucHV0CisJCS8vCisJCWNyZWF0ZU1vZGVsKCk7CisKKwkJLy8gT25seSBjcmVhdGVzIHRoZSBvdGhlciBwYWdlcyBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhhdCBjYW4gYmUgZWRpdGVkCisJCS8vCisJCWlmICghZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgc2VsZWN0aW9uIHRyZWUgdmlldy4KKwkJCS8vCisJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShnZXRDb250YWluZXIoKSwgU1dULk1VTFRJKTsKKwkJCXNlbGVjdGlvblZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOworCQkJc2V0Q3VycmVudFZpZXdlcihzZWxlY3Rpb25WaWV3ZXIpOworCisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKworCQkJbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcihzZWxlY3Rpb25WaWV3ZXIuZ2V0VHJlZSgpLCBhZGFwdGVyRmFjdG9yeSk7CisKKwkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHNlbGVjdGlvblZpZXdlcik7CisJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh0cmVlKTsKKwkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCSBzZXRBY3RpdmVQYWdlKDApOworCQkJCQkgfQorCQkJCSB9KTsKKwkJfQorCisJCS8vIEVuc3VyZXMgdGhhdCB0aGlzIGVkaXRvciB3aWxsIG9ubHkgZGlzcGxheSB0aGUgcGFnZSdzIHRhYgorCQkvLyBhcmVhIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHBhZ2UKKwkJLy8KKwkJZ2V0Q29udGFpbmVyKCkuYWRkQ29udHJvbExpc3RlbmVyCisJCQkobmV3IENvbnRyb2xBZGFwdGVyKCkgeworCQkJCWJvb2xlYW4gZ3VhcmQgPSBmYWxzZTsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsKKwkJCQkJaWYgKCFndWFyZCkgeworCQkJCQkJZ3VhcmQgPSB0cnVlOworCQkJCQkJaGlkZVRhYnMoKTsKKwkJCQkJCWd1YXJkID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkgfSk7CisKKwkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkgfQorCQkJIH0pOworCX0KKworCS8qKgorCSAqIElmIHRoZXJlIGlzIGp1c3Qgb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsCisJICogdGhpcyBoaWRlcyB0aGUgc2luZ2xlIHRhYiBhdCB0aGUgYm90dG9tLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhpZGVUYWJzKCkgeworCQlpZiAoZ2V0UGFnZUNvdW50KCkgPD0gMSkgeworCQkJc2V0UGFnZVRleHQoMCwgIiIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7CisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoMSk7CisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7CisJCQkJZ2V0Q29udGFpbmVyKCkuc2V0U2l6ZShwb2ludC54LCBwb2ludC55ICsgNik7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsCisJICogdGhpcyBzaG93cyB0aGUgdGFicyBhdCB0aGUgYm90dG9tLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNob3dUYWJzKCkgeworCQlpZiAoZ2V0UGFnZUNvdW50KCkgPiAxKSB7CisJCQlzZXRQYWdlVGV4dCgwLCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7CisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoU1dULkRFRkFVTFQpOworCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOworCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSAtIDYpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIHRyYWNrIHRoZSBhY3RpdmUgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IHBhZ2VJbmRleCkgeworCQlzdXBlci5wYWdlQ2hhbmdlKHBhZ2VJbmRleCk7CisKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7CisJCQloYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihjb250ZW50T3V0bGluZVBhZ2UuZ2V0U2VsZWN0aW9uKCkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBob3cgdGhlIGZyYW1ld29yayBkZXRlcm1pbmVzIHdoaWNoIGludGVyZmFjZXMgd2UgaW1wbGVtZW50LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKKwkJaWYgKGtleS5lcXVhbHMoSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcykpIHsKKwkJCXJldHVybiBzaG93T3V0bGluZVZpZXcoKSA/IGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIDogbnVsbDsKKwkJfQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykpIHsKKwkJCXJldHVybiBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOworCQl9CisJCWVsc2UgaWYgKGtleS5lcXVhbHMoSUdvdG9NYXJrZXIuY2xhc3MpKSB7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGtleSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIGNvbnRlbnQgb3V0bGluZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElDb250ZW50T3V0bGluZVBhZ2UgZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgeworCQlpZiAoY29udGVudE91dGxpbmVQYWdlID09IG51bGwpIHsKKwkJCS8vIFRoZSBjb250ZW50IG91dGxpbmUgaXMganVzdCBhIHRyZWUuCisJCQkvLworCQkJY2xhc3MgTXlDb250ZW50T3V0bGluZVBhZ2UgZXh0ZW5kcyBDb250ZW50T3V0bGluZVBhZ2UgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQkJCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyID0gZ2V0VHJlZVZpZXdlcigpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisKKwkJCQkJLy8gU2V0IHVwIHRoZSB0cmVlIHZpZXdlci4KKwkJCQkJLy8KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKworCQkJCQkvLyBNYWtlIHN1cmUgb3VyIHBvcHVwcyB3b3JrLgorCQkJCQkvLworCQkJCQljcmVhdGVDb250ZXh0TWVudUZvcihjb250ZW50T3V0bGluZVZpZXdlcik7CisKKwkJCQkJaWYgKCFlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCSAgLy8gU2VsZWN0IHRoZSByb290IG9iamVjdCBpbiB0aGUgdmlldy4KKwkJCQkJICAvLworCQkJCQkgIGNvbnRlbnRPdXRsaW5lVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBtYWtlQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyKSB7CisJCQkJCXN1cGVyLm1ha2VDb250cmlidXRpb25zKG1lbnVNYW5hZ2VyLCB0b29sQmFyTWFuYWdlciwgc3RhdHVzTGluZU1hbmFnZXIpOworCQkJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyID0gc3RhdHVzTGluZU1hbmFnZXI7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisJCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7CisJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOworCQkJCX0KKwkJCX0KKworCQkJY29udGVudE91dGxpbmVQYWdlID0gbmV3IE15Q29udGVudE91dGxpbmVQYWdlKCk7CisKKwkJCS8vIExpc3RlbiB0byBzZWxlY3Rpb24gc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGl0IGlzIGEgc3BlY2lhbCB3YXkuCisJCQkvLworCQkJY29udGVudE91dGxpbmVQYWdlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgorCQkJCShuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCQkJIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGhhbmRsZSBzZWxlY3Rpb25zIGNvcnJlY3RseS4KKwkJCQkJIC8vCisJCQkJCSBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCQkJIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKKwkJCQkJIH0KKwkJCQkgfSk7CisJCX0KKworCQlyZXR1cm4gY29udGVudE91dGxpbmVQYWdlOworCX0KKworCS8qKgorCSAqIFRoaXMgYWNjZXNzZXMgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUgcHJvcGVydHkgc2hlZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElQcm9wZXJ0eVNoZWV0UGFnZSBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKKwkJaWYgKHByb3BlcnR5U2hlZXRQYWdlID09IG51bGwpIHsKKwkJCXByb3BlcnR5U2hlZXRQYWdlID0KKwkJCQluZXcgRXh0ZW5kZWRQcm9wZXJ0eVNoZWV0UGFnZShlZGl0aW5nRG9tYWluKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihMaXN0PD8+IHNlbGVjdGlvbikgeworCQkJCQkJUHJlZGljYXRlRWRpdG9yLnRoaXMuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0aW9uKTsKKwkJCQkJCVByZWRpY2F0ZUVkaXRvci50aGlzLnNldEZvY3VzKCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisJCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7CisJCQkJCX0KKwkJCQl9OworCQkJcHJvcGVydHlTaGVldFBhZ2Uuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJfQorCisJCXJldHVybiBwcm9wZXJ0eVNoZWV0UGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGRlYWxzIHdpdGggaG93IHdlIHdhbnQgc2VsZWN0aW9uIGluIHRoZSBvdXRsaW5lciB0byBhZmZlY3QgdGhlIG90aGVyIHZpZXdzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWlmIChzZWxlY3Rpb25WaWV3ZXIgIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJSXRlcmF0b3I8Pz4gc2VsZWN0ZWRFbGVtZW50cyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5pdGVyYXRvcigpOworCQkJaWYgKHNlbGVjdGVkRWxlbWVudHMuaGFzTmV4dCgpKSB7CisJCQkJLy8gR2V0IHRoZSBmaXJzdCBzZWxlY3RlZCBlbGVtZW50LgorCQkJCS8vCisJCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHMubmV4dCgpOworCisJCQkJQXJyYXlMaXN0PE9iamVjdD4gc2VsZWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudCk7CisJCQkJd2hpbGUgKHNlbGVjdGVkRWxlbWVudHMuaGFzTmV4dCgpKSB7CisJCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudHMubmV4dCgpKTsKKwkJCQl9CisKKwkJCQkvLyBTZXQgdGhlIHNlbGVjdGlvbiB0byB0aGUgd2lkZ2V0LgorCQkJCS8vCisJCQkJc2VsZWN0aW9uVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb25MaXN0KSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHRlc3RzIHRoZSBjb21tYW5kIHN0YWNrLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7CisJCXJldHVybiAoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLmlzU2F2ZU5lZWRlZCgpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSUVkaXRvclBhcnR9IGFuZCBzaW1wbHkgc2F2ZXMgdGhlIG1vZGVsIGZpbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisJCS8vIFNhdmUgb25seSByZXNvdXJjZXMgdGhhdCBoYXZlIGFjdHVhbGx5IGNoYW5nZWQuCisJCS8vCisJCWZpbmFsIE1hcDxPYmplY3QsIE9iamVjdD4gc2F2ZU9wdGlvbnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKKwkJc2F2ZU9wdGlvbnMucHV0KFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRCwgUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOworCisJCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtiZW5jaC4KKwkJLy8KKwkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9CisJCQluZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgeworCQkJCS8vIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IGdldHMgaW52b2tlZCB3aGVuIHRoZSBvcGVyYXRpb24gcnVucy4KKwkJCQkvLworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJCS8vIFNhdmUgdGhlIHJlc291cmNlcyB0byB0aGUgZmlsZSBzeXN0ZW0uCisJCQkJCS8vCisJCQkJCWJvb2xlYW4gZmlyc3QgPSB0cnVlOworCQkJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKSB7CisJCQkJCQlpZiAoKGZpcnN0IHx8ICFyZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSB8fCBpc1BlcnNpc3RlZChyZXNvdXJjZSkpICYmICFlZGl0aW5nRG9tYWluLmlzUmVhZE9ubHkocmVzb3VyY2UpKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJbG9uZyB0aW1lU3RhbXAgPSByZXNvdXJjZS5nZXRUaW1lU3RhbXAoKTsKKwkJCQkJCQkJcmVzb3VyY2Uuc2F2ZShzYXZlT3B0aW9ucyk7CisJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUaW1lU3RhbXAoKSAhPSB0aW1lU3RhbXApIHsKKwkJCQkJCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCQkJCQkJfQorCQkJCQkJCWZpcnN0ID0gZmFsc2U7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9OworCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisJCXRyeSB7CisJCQkvLyBUaGlzIHJ1bnMgdGhlIG9wdGlvbnMsIGFuZCBzaG93cyBwcm9ncmVzcy4KKwkJCS8vCisJCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7CisKKwkJCS8vIFJlZnJlc2ggdGhlIG5lY2Vzc2FyeSBzdGF0ZS4KKwkJCS8vCisJCQkoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLnNhdmVJc0RvbmUoKTsKKwkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgdGhhdCBzaG91bGRuJ3QuCisJCQkvLworCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHdoZXRoZXIgc29tZXRoaW5nIGhhcyBiZWVuIHBlcnNpc3RlZCB0byB0aGUgVVJJIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisJICogVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIFVSSSBjb252ZXJ0ZXIgZnJvbSB0aGUgZWRpdG9yJ3MgcmVzb3VyY2Ugc2V0IHRvIHRyeSB0byBvcGVuIGFuIGlucHV0IHN0cmVhbS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNQZXJzaXN0ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbShyZXNvdXJjZS5nZXRVUkkoKSk7CisJCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKKwkJCQlyZXN1bHQgPSB0cnVlOworCQkJCXN0cmVhbS5jbG9zZSgpOworCQkJfQorCQl9CisJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBJZ25vcmUKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgdHJ1ZSBiZWNhdXNlIGl0IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogVGhpcyBhbHNvIGNoYW5nZXMgdGhlIGVkaXRvcidzIGlucHV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgeworCQlTYXZlQXNEaWFsb2cgc2F2ZUFzRGlhbG9nID0gbmV3IFNhdmVBc0RpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7CisJCXNhdmVBc0RpYWxvZy5vcGVuKCk7CisJCUlQYXRoIHBhdGggPSBzYXZlQXNEaWFsb2cuZ2V0UmVzdWx0KCk7CisJCWlmIChwYXRoICE9IG51bGwpIHsKKwkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7CisJCQlpZiAoZmlsZSAhPSBudWxsKSB7CisJCQkJZG9TYXZlQXMoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpLCBuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGRvU2F2ZUFzKFVSSSB1cmksIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgeworCQkoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSkuc2V0VVJJKHVyaSk7CisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7CisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7CisJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0KKwkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpICE9IG51bGwgPworCQkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpIDoKKwkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworCQlkb1NhdmUocHJvZ3Jlc3NNb25pdG9yKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7CisJCXRyeSB7CisJCQlpZiAobWFya2VyLmdldFR5cGUoKS5lcXVhbHMoRVZhbGlkYXRvci5NQVJLRVIpKSB7CisJCQkJU3RyaW5nIHVyaUF0dHJpYnV0ZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoRVZhbGlkYXRvci5VUklfQVRUUklCVVRFLCBudWxsKTsKKwkJCQlpZiAodXJpQXR0cmlidXRlICE9IG51bGwpIHsKKwkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpQXR0cmlidXRlKTsKKwkJCQkJRU9iamVjdCBlT2JqZWN0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldEVPYmplY3QodXJpLCB0cnVlKTsKKwkJCQkJaWYgKGVPYmplY3QgIT0gbnVsbCkgeworCQkJCQkgIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zLnNpbmdsZXRvbihlZGl0aW5nRG9tYWluLmdldFdyYXBwZXIoZU9iamVjdCkpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgc3RhcnR1cC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgeworCQlzZXRTaXRlKHNpdGUpOworCQlzZXRJbnB1dFdpdGhOb3RpZnkoZWRpdG9ySW5wdXQpOworCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOworCQlzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKHRoaXMpOworCQlzaXRlLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgeworCQlnZXRDb250cm9sKGdldEFjdGl2ZVBhZ2UoKSkuc2V0Rm9jdXMoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHJldHVybiB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKKwkJcmV0dXJuIGVkaXRvclNlbGVjdGlvbjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byBzZXQgdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4KKwkgKiBDYWxsaW5nIHRoaXMgcmVzdWx0IHdpbGwgbm90aWZ5IHRoZSBsaXN0ZW5lcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWVkaXRvclNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKworCQlmb3IgKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgOiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzKSB7CisJCQlsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7CisJCX0KKwkJc2V0U3RhdHVzTGluZU1hbmFnZXIoc2VsZWN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXNMaW5lTWFuYWdlcihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBjdXJyZW50Vmlld2VyICE9IG51bGwgJiYgY3VycmVudFZpZXdlciA9PSBjb250ZW50T3V0bGluZVZpZXdlciA/CisJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyIDogZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7CisKKwkJaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJCUNvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS50b0xpc3QoKTsKKwkJCQlzd2l0Y2ggKGNvbGxlY3Rpb24uc2l6ZSgpKSB7CisJCQkJCWNhc2UgMDogeworCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9Ob09iamVjdFNlbGVjdGVkIikpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIDE6IHsKKwkJCQkJCVN0cmluZyB0ZXh0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcihhZGFwdGVyRmFjdG9yeSkuZ2V0VGV4dChjb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQiLCB0ZXh0KSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWRlZmF1bHQ6IHsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTXVsdGlPYmplY3RTZWxlY3RlZCIsIEludGVnZXIudG9TdHJpbmcoY29sbGVjdGlvbi5zaXplKCkpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZSgiIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gdGhlIHBsdWdpbidzIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7CisJCXJldHVybiBDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXkpOworCX0KKworCS8qKgorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gcGx1Z2luLnByb3BlcnRpZXMsIG1ha2luZyBhIHN1YnN0aXR1dGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgeworCQlyZXR1cm4gQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5LCBuZXcgT2JqZWN0IFtdIHsgczEgfSk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcn0gdG8gaGVscCBmaWxsIHRoZSBjb250ZXh0IG1lbnVzIHdpdGggY29udHJpYnV0aW9ucyBmcm9tIHRoZSBFZGl0IG1lbnUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQkoKElNZW51TGlzdGVuZXIpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkpLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpIHsKKwkJcmV0dXJuIChFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKSB7CisJCXJldHVybiBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGlvbkJhcnMoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7CisJCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOworCisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOworCisJCWdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7CisKKwkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOworCisJCWlmIChnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGl2ZUVkaXRvcigpID09IHRoaXMpIHsKKwkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKG51bGwpOworCQl9CisKKwkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKKwkJCXByb3BlcnR5U2hlZXRQYWdlLmRpc3Bvc2UoKTsKKwkJfQorCisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgIT0gbnVsbCkgeworCQkJY29udGVudE91dGxpbmVQYWdlLmRpc3Bvc2UoKTsKKwkJfQorCisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG91dGxpbmUgdmlldyBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHNob3dPdXRsaW5lVmlldygpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby9wcmVzZW50YXRpb24vU2NlbmFyaW9BY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvL3ByZXNlbnRhdGlvbi9TY2VuYXJpb0FjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYxZGVjZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby9wcmVzZW50YXRpb24vU2NlbmFyaW9BY3Rpb25CYXJDb250cmlidXRvci5qYXZhCkBAIC0wLDAgKzEsNDQzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKy8vaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuYWN0aW9uLldvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29udHJvbEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YkNvbnRyaWJ1dGlvbkl0ZW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJlc2VudGF0aW9uLkNvcmVFZGl0b3JQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZvciB0aGUgU2NlbmFyaW8gbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBTY2VuYXJpb0FjdGlvbkJhckNvbnRyaWJ1dG9yCisJZXh0ZW5kcyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IKKwlpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvclBhcnQ7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOworCisJLyoqCisJICogVGhpcyBhY3Rpb24gb3BlbnMgdGhlIFByb3BlcnRpZXMgdmlldy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUFjdGlvbiBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24gPQorCQluZXcgQWN0aW9uKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbSIpKSAvLyROT04tTkxTLTEkCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCXRyeSB7CisJCQkJCWdldFBhZ2UoKS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIGFjdGlvbiByZWZyZXNoZXMgdGhlIHZpZXdlciBvZiB0aGUgY3VycmVudCBlZGl0b3IgaWYgdGhlIGVkaXRvcgorCSAqIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElBY3Rpb24gcmVmcmVzaFZpZXdlckFjdGlvbiA9CisJCW5ldyBBY3Rpb24oQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbSIpKSAvLyROT04tTkxTLTEkCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworCQkJCXJldHVybiBhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlpZiAoYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgeworCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpYWN0aXZlRWRpdG9yUGFydCkuZ2V0Vmlld2VyKCk7CisJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgeworCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcgorCSAqIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZUNoaWxkQWN0aW9uczsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCBmb3IgQ3JlYXRlQ2hpbGQgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcgorCSAqIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZVNpYmxpbmdBY3Rpb25zOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVTaWJsaW5nIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvbnRyaWJ1dG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTY2VuYXJpb0FjdGlvbkJhckNvbnRyaWJ1dG9yKCkgeworCQlzdXBlcihBRERJVElPTlNfTEFTVF9TVFlMRSk7CisJCWxvYWRSZXNvdXJjZUFjdGlvbiA9IG5ldyBMb2FkUmVzb3VyY2VBY3Rpb24oKTsKKwkJdmFsaWRhdGVBY3Rpb24gPSBuZXcgVmFsaWRhdGVBY3Rpb24oKTsKKwkJY29udHJvbEFjdGlvbiA9IG5ldyBDb250cm9sQWN0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIFNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMgdG8gdGhlIHRvb2wgYmFyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7CisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzY2VuYXJpby1zZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAorCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigic2NlbmFyaW8tYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIHRvIHRoZSBtZW51IGJhciBhIG1lbnUgYW5kIHNvbWUgc2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucywKKwkgKiBhcyB3ZWxsIGFzIHRoZSBzdWItbWVudXMgZm9yIG9iamVjdCBjcmVhdGlvbiBpdGVtcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQlzdXBlci5jb250cmlidXRlVG9NZW51KG1lbnVNYW5hZ2VyKTsKKworCQlJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9TY2VuYXJpb0VkaXRvcl9tZW51IiksICJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW9NZW51SUQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhY3Rpb25zIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucy1lbmQiKSk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVDaGlsZCBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCisJCS8vCisJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIFByZXBhcmUgZm9yIENyZWF0ZVNpYmxpbmcgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgorCQkvLworCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBGb3JjZSBhbiB1cGRhdGUgYmVjYXVzZSBFY2xpcHNlIGhpZGVzIGVtcHR5IG1lbnVzIG5vdy4KKwkJLy8KKwkJc3VibWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyCisJCQkobmV3IElNZW51TGlzdGVuZXIoKSB7CisJCQkJIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJCQkJIG1lbnVNYW5hZ2VyLnVwZGF0ZUFsbCh0cnVlKTsKKwkJCQkgfQorCQkJIH0pOworCisJCWFkZEdsb2JhbEFjdGlvbnMoc3VibWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIFdoZW4gdGhlIGFjdGl2ZSBlZGl0b3IgY2hhbmdlcywgdGhpcyByZW1lbWJlcnMgdGhlIGNoYW5nZSBhbmQgcmVnaXN0ZXJzIHdpdGggaXQgYXMgYSBzZWxlY3Rpb24gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHBhcnQpIHsKKwkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOworCQlhY3RpdmVFZGl0b3JQYXJ0ID0gcGFydDsKKworCQkvLyBTd2l0Y2ggdG8gdGhlIG5ldyBzZWxlY3Rpb24gcHJvdmlkZXIuCisJCS8vCisJCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCX0KKwkJaWYgKHBhcnQgPT0gbnVsbCkgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOworCQl9CisJCWVsc2UgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBwYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOworCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCQkvLyBGYWtlIGEgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgdG8gdXBkYXRlIHRoZSBtZW51cy4KKwkJCS8vCisJCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkgeworCQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfSwKKwkgKiBoYW5kbGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnR9cyBieSBxdWVyeWluZyBmb3IgdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncworCSAqIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZWxlY3RlZCBvYmplY3QgYW5kIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uCisJCS8vCisJCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7CisJCX0KKwkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsKKwkJfQorCisJCS8vIFF1ZXJ5IHRoZSBuZXcgc2VsZWN0aW9uIGZvciBhcHByb3ByaWF0ZSBuZXcgY2hpbGQvc2libGluZyBkZXNjcmlwdG9ycworCQkvLworCQlDb2xsZWN0aW9uPD8+IG5ld0NoaWxkRGVzY3JpcHRvcnMgPSBudWxsOworCQlDb2xsZWN0aW9uPD8+IG5ld1NpYmxpbmdEZXNjcmlwdG9ycyA9IG51bGw7CisKKwkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5zaXplKCkgPT0gMSkgeworCQkJT2JqZWN0IG9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKKworCQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpYWN0aXZlRWRpdG9yUGFydCkuZ2V0RWRpdGluZ0RvbWFpbigpOworCisJCQluZXdDaGlsZERlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMob2JqZWN0LCBudWxsKTsKKwkJCW5ld1NpYmxpbmdEZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG51bGwsIG9iamVjdCk7CisJCX0KKworCQkvLyBHZW5lcmF0ZSBhY3Rpb25zIGZvciBzZWxlY3Rpb247IHBvcHVsYXRlIGFuZCByZWRyYXcgdGhlIG1lbnVzLgorCQkvLworCQljcmVhdGVDaGlsZEFjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhuZXdDaGlsZERlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOworCQljcmVhdGVTaWJsaW5nQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMobmV3U2libGluZ0Rlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOworCisJCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOworCQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7CisJCX0KKwkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7CisJCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LAorCSAqIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMoQ29sbGVjdGlvbjw/PiBkZXNjcmlwdG9ycywgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJQ29sbGVjdGlvbjxJQWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOworCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgeworCQkJZm9yIChPYmplY3QgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7CisJCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZUNoaWxkQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwgZGVzY3JpcHRvcikpOworCQkJfQorCQl9CisJCXJldHVybiBhY3Rpb25zOworCX0KKworCS8qKgorCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LAorCSAqIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7CisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7CisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlU2libGluZ0FjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYWN0aW9uczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IHdpdGgge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMKKwkgKiBiYXNlZCBvbiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLAorCSAqIGJ5IGluc2VydGluZyB0aGVtIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGNvbnRyaWJ1dGlvbiBpdGVtIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPi4KKwkgKiBJZiA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZXkgYXJlIHNpbXBseSBhZGRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucywgU3RyaW5nIGNvbnRyaWJ1dGlvbklEKSB7CisJCWlmIChhY3Rpb25zICE9IG51bGwpIHsKKwkJCWZvciAoSUFjdGlvbiBhY3Rpb24gOiBhY3Rpb25zKSB7CisJCQkJaWYgKGNvbnRyaWJ1dGlvbklEICE9IG51bGwpIHsKKwkJCQkJbWFuYWdlci5pbnNlcnRCZWZvcmUoY29udHJpYnV0aW9uSUQsIGFjdGlvbik7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQltYW5hZ2VyLmFkZChhY3Rpb24pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkJCisJLyoqCisJICogVGhpcyByZW1vdmVzIGZyb20gdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMKKwkgKiBiYXNlZCBvbiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGRlcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248PyBleHRlbmRzIElBY3Rpb24+IGFjdGlvbnMpIHsKKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgeworCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0SXRlbXMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKKwkJCQkvLyBMb29rIGludG8gU3ViQ29udHJpYnV0aW9uSXRlbXMKKwkJCQkvLworCQkJCUlDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbkl0ZW0gPSBpdGVtc1tpXTsKKwkJCQl3aGlsZSAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIHsKKwkJCQkJY29udHJpYnV0aW9uSXRlbSA9ICgoU3ViQ29udHJpYnV0aW9uSXRlbSljb250cmlidXRpb25JdGVtKS5nZXRJbm5lckl0ZW0oKTsKKwkJCQl9CisKKwkJCQkvLyBEZWxldGUgdGhlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1zIHdpdGggbWF0Y2hpbmcgYWN0aW9uLgorCQkJCS8vCisJCQkJaWYgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7CisJCQkJCUlBY3Rpb24gYWN0aW9uID0gKChBY3Rpb25Db250cmlidXRpb25JdGVtKWNvbnRyaWJ1dGlvbkl0ZW0pLmdldEFjdGlvbigpOworCQkJCQlpZiAoYWN0aW9ucy5jb250YWlucyhhY3Rpb24pKSB7CisJCQkJCQltYW5hZ2VyLnJlbW92ZShjb250cmlidXRpb25JdGVtKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBwb3AtdXAgbWVudSBiZWZvcmUgaXQgYXBwZWFycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7CisJCU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbnVsbDsKKworCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7CisJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZWRpdCIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7CisJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZWRpdCIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgaW5zZXJ0cyBnbG9iYWwgYWN0aW9ucyBiZWZvcmUgdGhlICJhZGRpdGlvbnMtZW5kIiBzZXBhcmF0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucy1lbmQiLCBuZXcgU2VwYXJhdG9yKCJ1aS1hY3Rpb25zIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24pOyAvLyROT04tTkxTLTEkCisKKwkJcmVmcmVzaFZpZXdlckFjdGlvbi5zZXRFbmFibGVkKHJlZnJlc2hWaWV3ZXJBY3Rpb24uaXNFbmFibGVkKCkpOwkJCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgcmVmcmVzaFZpZXdlckFjdGlvbik7IC8vJE5PTi1OTFMtMSQKKworCQlzdXBlci5hZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGVuc3VyZXMgdGhhdCBhIGRlbGV0ZSBhY3Rpb24gd2lsbCBjbGVhbiB1cCBhbGwgcmVmZXJlbmNlcyB0byBkZWxldGVkIG9iamVjdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlQWxsUmVmZXJlbmNlc09uRGVsZXRlKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby9wcmVzZW50YXRpb24vU2NlbmFyaW9FZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zY2VuYXJpby9wcmVzZW50YXRpb24vU2NlbmFyaW9FZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDkxNjU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NjZW5hcmlvL3ByZXNlbnRhdGlvbi9TY2VuYXJpb0VkaXRvci5qYXZhCkBAIC0wLDAgKzEsMTYwMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuTWFya2VySGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5WaWV3ZXJQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuZWRpdG9yLlByb2JsZW1FZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5SZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmNlbGxlZGl0b3IuQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkxvY2FsVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLlZpZXdlckRyYWdBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5VbndyYXBwaW5nU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlNYXJrZXJIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnZpZXcuRXh0ZW5kZWRQcm9wZXJ0eVNoZWV0UGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkxvY2FsU2VsZWN0aW9uVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOworLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVhNSVJlc291cmNlRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlV0aWxpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcmVzZW50YXRpb24uQ29yZUVkaXRvckFkdmlzb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcmVzZW50YXRpb24uQ29yZUVkaXRvclBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LnByb3ZpZGVyLkV4cGVyaW1lbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXIuTW9kaWZpZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByb3ZpZGVyLlByZWRpY2F0ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIucHJvdmlkZXIuU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIucHJvdmlkZXIuU29sdmVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIucHJvdmlkZXIuVHJpZ2dlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5wcm92aWRlci5TY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRmlsZVRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldFBhZ2U7CisKKy8qKgorICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgU2NlbmFyaW8gbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorICogZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBTY2VuYXJpb0VkaXRvciBleHRlbmRzIE11bHRpUGFnZUVkaXRvclBhcnQgaW1wbGVtZW50cworCQlJRWRpdGluZ0RvbWFpblByb3ZpZGVyLCBJU2VsZWN0aW9uUHJvdmlkZXIsIElNZW51TGlzdGVuZXIsIElWaWV3ZXJQcm92aWRlciwgSUdvdG9NYXJrZXIgeworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1NDRU5BUklPX0VESVRPUiA9ICJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJlc2VudGF0aW9uLlNjZW5hcmlvRWRpdG9ySUQiOworCQorCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGVkaXRpbmcgZG9tYWluIHRoYXQgaXMgdXNlZCB0byB0cmFjayBhbGwgY2hhbmdlcyB0byB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG9uZSBhZGFwdGVyIGZhY3RvcnkgdXNlZCBmb3IgcHJvdmlkaW5nIHZpZXdzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNvbnRlbnRPdXRsaW5lUGFnZSBjb250ZW50T3V0bGluZVBhZ2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIGEga2x1ZGdlLi4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlJ3Mgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKwkgKiBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmVlVmlld2VyIGNvbnRlbnRPdXRsaW5lVmlld2VyOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgcHJvcGVydHkgc2hlZXQgcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB2aWV3ZXIgdGhhdCBzaGFkb3dzIHRoZSBzZWxlY3Rpb24gaW4gdGhlIGNvbnRlbnQgb3V0bGluZS4gVGhlCisJICogcGFyZW50IHJlbGF0aW9uIG11c3QgYmUgY29ycmVjdGx5IGRlZmluZWQgZm9yIHRoaXMgdG8gd29yay4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgc2VsZWN0aW9uVmlld2VyOworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGNvbnRlbnQgdmlld2VyLCB3aGljaCBtYXkgYmUgZWl0aGVyIG9uZSBvZgorCSAqIHRoZSB2aWV3ZXJzIGluIHRoZSBwYWdlcyBvciB0aGUgY29udGVudCBvdXRsaW5lIHZpZXdlci4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFZpZXdlciBjdXJyZW50Vmlld2VyOworCisJLyoqCisJICogVGhpcyBsaXN0ZW5zIHRvIHdoaWNoIGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn1zIHRoYXQgYXJlIGxpc3RlbmluZyB0byB0aGlzIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZWRpdG9yIGFzIGEgd2hvbGUuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uIGVkaXRvclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7CisKKwkvKioKKwkgKiBUaGUgTWFya2VySGVscGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB3b3Jrc3BhY2UgcmVzb3VyY2UgbWFya2VycyBwcmVzZW50ZWQKKwkgKiBpbiBFY2xpcHNlJ3MgUHJvYmxlbXMgVmlldy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFya2VySGVscGVyIG1hcmtlckhlbHBlciA9IG5ldyBFZGl0VUlNYXJrZXJIZWxwZXIoKTsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyBmb3Igd2hlbiB0aGUgb3V0bGluZSBiZWNvbWVzIGFjdGl2ZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9CisJCW5ldyBJUGFydExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJaWYgKHAgaW5zdGFuY2VvZiBDb250ZW50T3V0bGluZSkgeworCQkJCQlpZiAoKChDb250ZW50T3V0bGluZSlwKS5nZXRDdXJyZW50UGFnZSgpID09IGNvbnRlbnRPdXRsaW5lUGFnZSkgeworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoU2NlbmFyaW9FZGl0b3IudGhpcyk7CisKKwkJCQkJCXNldEN1cnJlbnRWaWV3ZXIoY29udGVudE91dGxpbmVWaWV3ZXIpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHAgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSB7CisJCQkJCWlmICgoKFByb3BlcnR5U2hlZXQpcCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBwcm9wZXJ0eVNoZWV0UGFnZSkgeworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoU2NlbmFyaW9FZGl0b3IudGhpcyk7CisJCQkJCQloYW5kbGVBY3RpdmF0ZSgpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHAgPT0gU2NlbmFyaW9FZGl0b3IudGhpcykgeworCQkJCQloYW5kbGVBY3RpdmF0ZSgpOworCQkJCX0KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQl9OworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBzYXZlZC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKKwkgKiAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHNhdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIE1hcCB0byBzdG9yZSB0aGUgZGlhZ25vc3RpYyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4gcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxSZXNvdXJjZSwgRGlhZ25vc3RpYz4oKTsKKworCS8qKgorCSAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiBzaG91bGQgYmUgdXBkYXRlZC4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOworCisJLyoqCisJICogQWRhcHRlciB1c2VkIHRvIHVwZGF0ZSB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHdoZW4gcmVzb3VyY2VzIGFyZSBkZW1hbmRlZCBsb2FkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBFQ29udGVudEFkYXB0ZXIgcHJvYmxlbUluZGljYXRpb25BZGFwdGVyID0gCisJCW5ldyBFQ29udGVudEFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisJCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZXNvdXJjZS5jbGFzcykpIHsKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRDoKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0VSUk9SUzoKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX1dBUk5JTkdTOiB7CisJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2Upbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7CisJCQkJCQkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIG51bGwpOworCQkJCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGRpYWdub3N0aWMpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucmVtb3ZlKHJlc291cmNlKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAodXBkYXRlUHJvYmxlbUluZGljYXRpb24pIHsKKwkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkJCQkJCQkgfQorCQkJCQkJCQkJIH0pOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCQkJCX0KKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7CisJCQkJYmFzaWNTZXRUYXJnZXQodGFyZ2V0KTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCB1bnNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsKKwkJCQliYXNpY1Vuc2V0VGFyZ2V0KHRhcmdldCk7CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdvcmtzcGFjZSBjaGFuZ2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0KKwkJbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOworCQkJCXRyeSB7CisJCQkJCWNsYXNzIFJlc291cmNlRGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKKwkJCQkJCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKwkJCQkJCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKKwkJCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIHx8CisJCQkJCQkJCSAgICBkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiBkZWx0YS5nZXRGbGFncygpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMpIHsKKwkJCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZGVsdGEuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKSwgZmFsc2UpOworCQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKKwkJCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKKwkJCQkJCQkJCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQllbHNlIGlmICghc2F2ZWRSZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlKSkgeworCQkJCQkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQl9CisKKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgeworCQkJCQkJCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOworCQkJCQkJfQorCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsKKwkJCQkJCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlczsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWZpbmFsIFJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsKKwkJCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOworCisJCQkJCWlmICghdmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCSByZW1vdmVkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKSk7CisJCQkJCQkJCQkgaWYgKCFpc0RpcnR5KCkpIHsKKwkJCQkJCQkJCQkgZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihTY2VuYXJpb0VkaXRvci50aGlzLCBmYWxzZSk7CisJCQkJCQkJCQkgfQorCQkJCQkJCQkgfQorCQkJCQkJCSB9KTsKKwkJCQkJfQorCisJCQkJCWlmICghdmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCSBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7CisJCQkJCQkJCQkgaWYgKGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gU2NlbmFyaW9FZGl0b3IudGhpcykgeworCQkJCQkJCQkJCSBoYW5kbGVBY3RpdmF0ZSgpOworCQkJCQkJCQkJIH0KKwkJCQkJCQkJIH0KKwkJCQkJCQkgfSk7CisJCQkJCX0KKwkJCQl9CisJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogSGFuZGxlcyBhY3RpdmF0aW9uIG9mIHRoZSBlZGl0b3Igb3IgaXQncyBhc3NvY2lhdGVkIHZpZXdzLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0ZSgpIHsKKwkJLy8gUmVjb21wdXRlIHRoZSByZWFkIG9ubHkgc3RhdGUuCisJCS8vCisJCWlmIChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpICE9IG51bGwpIHsKKwkJICBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpLmNsZWFyKCk7CisKKwkJICAvLyBSZWZyZXNoIGFueSBhY3Rpb25zIHRoYXQgbWF5IGJlY29tZSBlbmFibGVkIG9yIGRpc2FibGVkLgorCQkgIC8vCisJCSAgc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKKwkJfQorCisJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCWlmIChoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpIHsKKwkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKFNjZW5hcmlvRWRpdG9yLnRoaXMsIGZhbHNlKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCWNoYW5nZWRSZXNvdXJjZXMucmVtb3ZlQWxsKHNhdmVkUmVzb3VyY2VzKTsKKwkJCWhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKTsKKwkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBIYW5kbGVzIHdoYXQgdG8gZG8gd2l0aCBjaGFuZ2VkIHJlc291cmNlcyBvbiBhY3RpdmF0aW9uLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCkgeworCQlpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpICYmICghaXNEaXJ0eSgpIHx8IGhhbmRsZURpcnR5Q29uZmxpY3QoKSkpIHsKKwkJCWlmIChpc0RpcnR5KCkpIHsKKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpOworCQkJfQorCQkJZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOworCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOworCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGNoYW5nZWRSZXNvdXJjZXMpIHsKKwkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgeworCQkJCQlyZXNvdXJjZS51bmxvYWQoKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKKwkJCQkJfQorCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCQlpZiAoIXJlc291cmNlVG9EaWFnbm9zdGljTWFwLmNvbnRhaW5zS2V5KHJlc291cmNlKSkgeworCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZSwgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluLmlzU3RhbGUoZWRpdG9yU2VsZWN0aW9uKSkgeworCQkJCXNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKKwkJCX0KKworCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOworCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJfQorCX0KKyAgCisJLyoqCisJICogVXBkYXRlcyB0aGUgcHJvYmxlbXMgaW5kaWNhdGlvbiB3aXRoIHRoZSBpbmZvcm1hdGlvbiBkZXNjcmliZWQgaW4gdGhlIHNwZWNpZmllZCBkaWFnbm9zdGljLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpIHsKKwkJaWYgKHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKSB7CisJCQlCYXNpY0RpYWdub3N0aWMgZGlhZ25vc3RpYyA9CisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5PSywKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZWRpdG9yIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkgMCwKKwkJCQkJIG51bGwsCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpIH0pOworCQkJZm9yIChEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA6IHJlc291cmNlVG9EaWFnbm9zdGljTWFwLnZhbHVlcygpKSB7CisJCQkJaWYgKGNoaWxkRGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJZGlhZ25vc3RpYy5hZGQoY2hpbGREaWFnbm9zdGljKTsKKwkJCQl9CisJCQl9CisKKwkJCWludCBsYXN0RWRpdG9yUGFnZSA9IGdldFBhZ2VDb3VudCgpIC0gMTsKKwkJCWlmIChsYXN0RWRpdG9yUGFnZSA+PSAwICYmIGdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkgaW5zdGFuY2VvZiBQcm9ibGVtRWRpdG9yUGFydCkgeworCQkJCSgoUHJvYmxlbUVkaXRvclBhcnQpZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSkuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQlQcm9ibGVtRWRpdG9yUGFydCBwcm9ibGVtRWRpdG9yUGFydCA9IG5ldyBQcm9ibGVtRWRpdG9yUGFydCgpOworCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7CisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0TWFya2VySGVscGVyKG1hcmtlckhlbHBlcik7CisJCQkJdHJ5IHsKKwkJCQkJYWRkUGFnZSgrK2xhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydCwgZ2V0RWRpdG9ySW5wdXQoKSk7CisJCQkJCXNldFBhZ2VUZXh0KGxhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydC5nZXRQYXJ0TmFtZSgpKTsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJCXNob3dUYWJzKCk7CisJCQkJfQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChtYXJrZXJIZWxwZXIuaGFzTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpKSB7CisJCQkJbWFya2VySGVscGVyLmRlbGV0ZU1hcmtlcnMoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCW1hcmtlckhlbHBlci5jcmVhdGVNYXJrZXJzKGRpYWdub3N0aWMpOworCQkJCQl9CisJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFNob3dzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZURpcnR5Q29uZmxpY3QoKSB7CisJCXJldHVybgorCQkJTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24KKwkJCQkoZ2V0U2l0ZSgpLmdldFNoZWxsKCksCisJCQkJIGdldFN0cmluZygiX1VJX0ZpbGVDb25mbGljdF9sYWJlbCIpLCAvLyROT04tTkxTLTEkCisJCQkJIGdldFN0cmluZygiX1dBUk5fRmlsZUNvbmZsaWN0IikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGEgbW9kZWwgZWRpdG9yLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU2NlbmFyaW9FZGl0b3IoKSB7CisJCXN1cGVyKCk7CisJCWluaXRpYWxpemVFZGl0aW5nRG9tYWluKCk7CisJfQorCQorCS8qKgorCSAqIFRoaXMgc2V0cyB1cCB0aGUgZWRpdGluZyBkb21haW4gZm9yIHRoZSBtb2RlbCBlZGl0b3IuIDwhLS0gYmVnaW4tdXNlci1kb2MKKwkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWRpdGluZ0RvbWFpbigpIHsKKwkJaW5pdGlhbGl6ZUVkaXRpbmdEb21haW5HZW4oKTsKKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkKKwkJCQkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCIqIiwKKwkJCQkJCVNURU1YTUlSZXNvdXJjZUZhY3RvcnlJbXBsLklOU1RBTkNFKTsKKworCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKQorCQkJCS5nZXRQcm90b2NvbFRvRmFjdG9yeU1hcCgpLnB1dCgicGxhdGZvcm0iLAorCQkJCQkJU1RFTVhNSVJlc291cmNlRmFjdG9yeUltcGwuSU5TVEFOQ0UpOworCX0gLy8gaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4KKworCS8qKgorCSAqIFRoaXMgc2V0cyB1cCB0aGUgZWRpdGluZyBkb21haW4gZm9yIHRoZSBtb2RlbCBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVkaXRpbmdEb21haW5HZW4oKSB7CisJCS8vIENyZWF0ZSBhbiBhZGFwdGVyIGZhY3RvcnkgdGhhdCB5aWVsZHMgaXRlbSBwcm92aWRlcnMuCisJCS8vCisJCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5EZXNjcmlwdG9yLlJlZ2lzdHJ5LklOU1RBTkNFKTsKKworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IENvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRXhwZXJpbWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RpZmllckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUHJlZGljYXRlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBUcmlnZ2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTb2x2ZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlIGV4ZWN1dGVkLgorCQkvLworCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKKworCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLgorCQkvLworCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIKKwkJCShuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7CisJCQkJIHB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsKKwkJCQkJIGdldENvbnRhaW5lcigpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCSAobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCSAgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkgIGZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKKworCQkJCQkJCQkgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuCisJCQkJCQkJCSAgLy8KKwkJCQkJCQkJICBDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spZXZlbnQuZ2V0U291cmNlKCkpLmdldE1vc3RSZWNlbnRDb21tYW5kKCk7CisJCQkJCQkJCSAgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKKwkJCQkJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOworCQkJCQkJCQkgIH0KKwkJCQkJCQkJICBpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCAmJiAhcHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgeworCQkJCQkJCQkJICBwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7CisJCQkJCQkJCSAgfQorCQkJCQkJCSAgfQorCQkJCQkJICB9KTsKKwkJCQkgfQorCQkJIH0pOworCisJCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KKwkJLy8KKwkJZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywgbmV3IEhhc2hNYXA8UmVzb3VyY2UsIEJvb2xlYW4+KCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgaGVyZSBmb3IgdGhlIGxpc3RlbmVyIHRvIGJlIGFibGUgdG8gY2FsbCBpdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoaW50IGFjdGlvbikgeworCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UoYWN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdGhlIHNlbGVjdGlvbiBpbnRvIHdoaWNoZXZlciB2aWV3ZXIgaXMgYWN0aXZlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKKwkJZmluYWwgQ29sbGVjdGlvbjw/PiB0aGVTZWxlY3Rpb24gPSBjb2xsZWN0aW9uOworCQkvLyBNYWtlIHN1cmUgaXQncyBva2F5LgorCQkvLworCQlpZiAodGhlU2VsZWN0aW9uICE9IG51bGwgJiYgIXRoZVNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKKwkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0KKwkJCQluZXcgUnVubmFibGUoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGl0ZW1zIGluIHRoZSBjdXJyZW50IGNvbnRlbnQgdmlld2VyIG9mIHRoZSBlZGl0b3IuCisJCQkJCQkvLworCQkJCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgeworCQkJCQkJCWN1cnJlbnRWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoZVNlbGVjdGlvbi50b0FycmF5KCkpLCB0cnVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX07CisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyB0aGUgZWRpdGluZyBkb21haW4gYXMgcmVxdWlyZWQgYnkgdGhlIHtAbGluayBJRWRpdGluZ0RvbWFpblByb3ZpZGVyfSBpbnRlcmZhY2UuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGltcGxlbWVudGluZyB0aGUgc3RhdGljIG1ldGhvZHMgb2Yge0BsaW5rIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbn0KKwkgKiBhbmQgZm9yIHN1cHBvcnRpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKKwkJcmV0dXJuIGVkaXRpbmdEb21haW47CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBjbGFzcyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcworCQkJQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgeworCQlwdWJsaWMgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAorCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zCisJCQkJCS5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOworCQl9CisKKwkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucworCQkJCQkuc2luZ2xldG9uKHBhcmVudCkpLnRvQXJyYXkoKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiBwYXJlbnQgIT0gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBtYWtlcyBzdXJlIHRoYXQgb25lIGNvbnRlbnQgdmlld2VyLCBlaXRoZXIgZm9yIHRoZSBjdXJyZW50IHBhZ2Ugb3IKKwkgKiB0aGUgb3V0bGluZSB2aWV3LCBpZiBpdCBoYXMgZm9jdXMsIGlzIHRoZSBjdXJyZW50IG9uZS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q3VycmVudFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7CisJCS8vIElmIGl0IGlzIGNoYW5naW5nLi4uCisJCS8vCisJCWlmIChjdXJyZW50Vmlld2VyICE9IHZpZXdlcikgeworCQkJaWYgKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7CisJCQkJLy8gQ3JlYXRlIHRoZSBsaXN0ZW5lciBvbiBkZW1hbmQuCisJCQkJLy8KKwkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPQorCQkJCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCQkJCS8vIFRoaXMganVzdCBub3RpZmllcyB0aG9zZSB0aGluZ3MgdGhhdCBhcmUgYWZmZWN0ZWQgYnkgdGhlIHNlY3Rpb24uCisJCQkJCQkvLworCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgc2VsZWN0aW9uQ2hhbmdlZEV2ZW50KSB7CisJCQkJCQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkNoYW5nZWRFdmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCQl9CisJCQkJCX07CisJCQl9CisKKwkJCS8vIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBvbGQgb25lLgorCQkJLy8KKwkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKKwkJCQljdXJyZW50Vmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOworCQkJfQorCisJCQkvLyBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG5ldyBvbmUuCisJCQkvLworCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7CisJCQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOworCQkJfQorCisJCQkvLyBSZW1lbWJlciBpdC4KKwkJCS8vCisJCQljdXJyZW50Vmlld2VyID0gdmlld2VyOworCisJCQkvLyBTZXQgdGhlIGVkaXRvcnMgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdlcidzIHNlbGVjdGlvbi4KKwkJCS8vCisJCQlzZXRTZWxlY3Rpb24oY3VycmVudFZpZXdlciA9PSBudWxsID8gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSA6IGN1cnJlbnRWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSB2aWV3ZXIgYXMgcmVxdWlyZWQgYnkgdGhlIHtAbGluayBJVmlld2VyUHJvdmlkZXJ9IGludGVyZmFjZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7CisJCXJldHVybiBjdXJyZW50Vmlld2VyOworCX0KKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlciBhbmQgYWRkcyBhIGxpc3RlbmVyIGFzIHdlbGwKKwkgKiByZWdpc3RlcmluZyB0aGUgbWVudSBmb3IgZXh0ZW5zaW9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKKwkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOworCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7CisJCU1lbnUgbWVudSA9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOworCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7CisJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGNvbnRleHRNZW51LCB2aWV3ZXIpOworCisJCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LOworCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHtMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCksIExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKKwkJCQlUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OworCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgVmlld2VyRHJhZ0FkYXB0ZXIoCisJCQkJdmlld2VyKSk7CisJCXZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsCisJCQkJbmV3IEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKKwl9IC8vIGNyZWF0ZUNvbnRleHRNZW51Rm9yCisKKwkvKioKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3JHZW4oU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKKwkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOworCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7CisJCU1lbnUgbWVudT0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7CisJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKKwkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUsIG5ldyBVbndyYXBwaW5nU2VsZWN0aW9uUHJvdmlkZXIodmlld2VyKSk7CisKKwkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTks7CisJCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKKwkJdmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyYWdBZGFwdGVyKHZpZXdlcikpOworCQl2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyKGVkaXRpbmdEb21haW4sIHZpZXdlcikpOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgY2FsbGVkIHRvIGxvYWQgYSByZXNvdXJjZSBpbnRvIHRoZSBlZGl0aW5nIGRvbWFpbidzIHJlc291cmNlIHNldCBiYXNlZCBvbiB0aGUgZWRpdG9yJ3MgaW5wdXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlTW9kZWwoKSB7CisJCVVSSSByZXNvdXJjZVVSSSA9IEVkaXRVSVV0aWwuZ2V0VVJJKGdldEVkaXRvcklucHV0KCkpOworCQlFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworCQl0cnkgeworCQkJLy8gTG9hZCB0aGUgcmVzb3VyY2UgdGhyb3VnaCB0aGUgZWRpdGluZyBkb21haW4uCisJCQkvLworCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIHRydWUpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZXhjZXB0aW9uID0gZTsKKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCBmYWxzZSk7CisJCX0KKworCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKTsKKwkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsICBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCX0KKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBkaWFnbm9zdGljIGRlc2NyaWJpbmcgdGhlIGVycm9ycyBhbmQgd2FybmluZ3MgbGlzdGVkIGluIHRoZSByZXNvdXJjZQorCSAqIGFuZCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiAoaWYgYW55KS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGlhZ25vc3RpYyBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhSZXNvdXJjZSByZXNvdXJjZSwgRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQlpZiAoIXJlc291cmNlLmdldEVycm9ycygpLmlzRW1wdHkoKSB8fCAhcmVzb3VyY2UuZ2V0V2FybmluZ3MoKS5pc0VtcHR5KCkpIHsKKwkJCUJhc2ljRGlhZ25vc3RpYyBiYXNpY0RpYWdub3N0aWMgPQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMKKwkJCQkJKERpYWdub3N0aWMuRVJST1IsCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmVkaXRvciIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJIDAsCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksIC8vJE5PTi1OTFMtMSQKKwkJCQkJIG5ldyBPYmplY3QgW10geyBleGNlcHRpb24gPT0gbnVsbCA/IChPYmplY3QpcmVzb3VyY2UgOiBleGNlcHRpb24gfSk7CisJCQliYXNpY0RpYWdub3N0aWMubWVyZ2UoRWNvcmVVdGlsLmNvbXB1dGVEaWFnbm9zdGljKHJlc291cmNlLCB0cnVlKSk7CisJCQlyZXR1cm4gYmFzaWNEaWFnbm9zdGljOworCQl9CisJCWVsc2UgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQlyZXR1cm4KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5lZGl0b3IiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCSBuZXcgT2JqZWN0W10geyBleGNlcHRpb24gfSk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gRGlhZ25vc3RpYy5PS19JTlNUQU5DRTsKKwkJfQorCX0KKworCisKKwkvKioKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VzKCkgeworCQkvLyBDcmVhdGVzIHRoZSBtb2RlbCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQKKwkJLy8KKwkJY3JlYXRlTW9kZWwoKTsKKworCQkvLyBPbmx5IGNyZWF0ZXMgdGhlIG90aGVyIHBhZ2VzIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBlZGl0ZWQKKwkJLy8KKwkJaWYgKCFnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCS8vIENyZWF0ZSBhIHBhZ2UgZm9yIHRoZSBzZWxlY3Rpb24gdHJlZSB2aWV3LgorCQkJLy8KKwkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGdldENvbnRhaW5lcigpLCBTV1QuTVVMVEkpOworCQkJc2VsZWN0aW9uVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7CisJCQlzZXRDdXJyZW50Vmlld2VyKHNlbGVjdGlvblZpZXdlcik7CisKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisvLwkJCXNlbGVjdGlvblZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7CisKKwkJCW5ldyBBZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3Ioc2VsZWN0aW9uVmlld2VyLmdldFRyZWUoKSwgYWRhcHRlckZhY3RvcnkpOworCisJCQljcmVhdGVDb250ZXh0TWVudUZvcihzZWxlY3Rpb25WaWV3ZXIpOworCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2UodHJlZSk7CisJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKworCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkgc2V0QWN0aXZlUGFnZSgwKTsKKwkJCQkJIH0KKwkJCQkgfSk7CisJCX0KKworCQkvLyBFbnN1cmVzIHRoYXQgdGhpcyBlZGl0b3Igd2lsbCBvbmx5IGRpc3BsYXkgdGhlIHBhZ2UncyB0YWIKKwkJLy8gYXJlYSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBwYWdlCisJCS8vCisJCWdldENvbnRhaW5lcigpLmFkZENvbnRyb2xMaXN0ZW5lcgorCQkJKG5ldyBDb250cm9sQWRhcHRlcigpIHsKKwkJCQlib29sZWFuIGd1YXJkID0gZmFsc2U7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7CisJCQkJCWlmICghZ3VhcmQpIHsKKwkJCQkJCWd1YXJkID0gdHJ1ZTsKKwkJCQkJCWhpZGVUYWJzKCk7CisJCQkJCQlndWFyZCA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJIH0pOworCisJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCQkJIH0KKwkJCSB9KTsKKwl9IC8vIGNyZWF0ZVBhZ2VzCisJCisJLyoqCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VzR2VuKCkgeworCQkvLyBDcmVhdGVzIHRoZSBtb2RlbCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQKKwkJLy8KKwkJY3JlYXRlTW9kZWwoKTsKKworCQkvLyBPbmx5IGNyZWF0ZXMgdGhlIG90aGVyIHBhZ2VzIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBlZGl0ZWQKKwkJLy8KKwkJaWYgKCFnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCS8vIENyZWF0ZSBhIHBhZ2UgZm9yIHRoZSBzZWxlY3Rpb24gdHJlZSB2aWV3LgorCQkJLy8KKwkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGdldENvbnRhaW5lcigpLCBTV1QuTVVMVEkpOworCQkJc2VsZWN0aW9uVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7CisJCQlzZXRDdXJyZW50Vmlld2VyKHNlbGVjdGlvblZpZXdlcik7CisKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCisJCQluZXcgQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yKHNlbGVjdGlvblZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsKKworCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Ioc2VsZWN0aW9uVmlld2VyKTsKKwkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHRyZWUpOworCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisKKwkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJIHNldEFjdGl2ZVBhZ2UoMCk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJLy8gRW5zdXJlcyB0aGF0IHRoaXMgZWRpdG9yIHdpbGwgb25seSBkaXNwbGF5IHRoZSBwYWdlJ3MgdGFiCisJCS8vIGFyZWEgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgcGFnZQorCQkvLworCQlnZXRDb250YWluZXIoKS5hZGRDb250cm9sTGlzdGVuZXIKKwkJCShuZXcgQ29udHJvbEFkYXB0ZXIoKSB7CisJCQkJYm9vbGVhbiBndWFyZCA9IGZhbHNlOworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBldmVudCkgeworCQkJCQlpZiAoIWd1YXJkKSB7CisJCQkJCQlndWFyZCA9IHRydWU7CisJCQkJCQloaWRlVGFicygpOworCQkJCQkJZ3VhcmQgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCSB9KTsKKworCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQkJCSB9CisJCQkgfSk7CisJfQorCQorCS8qKgorCSAqIElmIHRoZXJlIGlzIGp1c3Qgb25lIHBhZ2UgaW4gdGhlIG11bHRpLXBhZ2UgZWRpdG9yIHBhcnQsCisJICogdGhpcyBoaWRlcyB0aGUgc2luZ2xlIHRhYiBhdCB0aGUgYm90dG9tLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoaWRlVGFicygpIHsKKwkJaWYgKGdldFBhZ2VDb3VudCgpIDw9IDEpIHsKKwkJCXNldFBhZ2VUZXh0KDAsICIiKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgeworCQkJCSgoQ1RhYkZvbGRlcilnZXRDb250YWluZXIoKSkuc2V0VGFiSGVpZ2h0KDEpOworCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOworCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSArIDYpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LAorCSAqIHRoaXMgc2hvd3MgdGhlIHRhYnMgYXQgdGhlIGJvdHRvbS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2hvd1RhYnMoKSB7CisJCWlmIChnZXRQYWdlQ291bnQoKSA+IDEpIHsKKwkJCXNldFBhZ2VUZXh0KDAsIGdldFN0cmluZygiX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsKKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodChTV1QuREVGQVVMVCk7CisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7CisJCQkJZ2V0Q29udGFpbmVyKCkuc2V0U2l6ZShwb2ludC54LCBwb2ludC55IC0gNik7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWQgdG8gdHJhY2sgdGhlIGFjdGl2ZSB2aWV3ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgcGFnZUluZGV4KSB7CisJCXN1cGVyLnBhZ2VDaGFuZ2UocGFnZUluZGV4KTsKKworCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsKKwkJCWhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKGNvbnRlbnRPdXRsaW5lUGFnZS5nZXRTZWxlY3Rpb24oKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGhvdyB0aGUgZnJhbWV3b3JrIGRldGVybWluZXMgd2hpY2ggaW50ZXJmYWNlcyB3ZSBpbXBsZW1lbnQuIDwhLS0KKwkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogCisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7CisJCWlmIChrZXkuZXF1YWxzKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gc2hvd091dGxpbmVWaWV3KCkgPyBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSA6IG51bGw7CisJCX0KKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gZ2V0UHJvcGVydHlTaGVldFBhZ2UoKTsKKwkJfQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IG91dGxpbmVyLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSUNvbnRlbnRPdXRsaW5lUGFnZSBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSB7CisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgPT0gbnVsbCkgeworCQkJLy8gVGhlIGNvbnRlbnQgb3V0bGluZSBpcyBqdXN0IGEgdHJlZS4KKwkJCS8vCisJCQljbGFzcyBNeUNvbnRlbnRPdXRsaW5lUGFnZSBleHRlbmRzIENvbnRlbnRPdXRsaW5lUGFnZSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCQkJCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKworCQkJCQkvLyBTZXQgdXAgdGhlIHRyZWUgdmlld2VyLgorCQkJCQkvLworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCisJCQkJCS8vIE1ha2Ugc3VyZSBvdXIgcG9wdXBzIHdvcmsuCisJCQkJCS8vCisJCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKGNvbnRlbnRPdXRsaW5lVmlld2VyKTsKKworCQkJCQlpZiAoIWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCQkJICAvLyBTZWxlY3QgdGhlIHJvb3Qgb2JqZWN0IGluIHRoZSB2aWV3LgorCQkJCQkgIC8vCisJCQkJCSAgY29udGVudE91dGxpbmVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIG1ha2VDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwgSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLCBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsKKwkJCQkJc3VwZXIubWFrZUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLCBzdGF0dXNMaW5lTWFuYWdlcik7CisJCQkJCWNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXIgPSBzdGF0dXNMaW5lTWFuYWdlcjsKKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKKwkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKKwkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7CisJCQkJfQorCQkJfQorCisJCQljb250ZW50T3V0bGluZVBhZ2UgPSBuZXcgTXlDb250ZW50T3V0bGluZVBhZ2UoKTsKKworCQkJLy8gTGlzdGVuIHRvIHNlbGVjdGlvbiBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgaXQgaXMgYSBzcGVjaWFsIHdheS4KKwkJCS8vCisJCQljb250ZW50T3V0bGluZVBhZ2UuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCisJCQkJKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJCQkgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2UgaGFuZGxlIHNlbGVjdGlvbnMgY29ycmVjdGx5LgorCQkJCQkgLy8KKwkJCQkJIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJCQkgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQkgfQorCQkJCSB9KTsKKwkJfQorCisJCXJldHVybiBjb250ZW50T3V0bGluZVBhZ2U7CisJfQorCisJLyoqCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBwcm9wZXJ0eSBzaGVldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVByb3BlcnR5U2hlZXRQYWdlIGdldFByb3BlcnR5U2hlZXRQYWdlKCkgeworCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgPT0gbnVsbCkgeworCQkJcHJvcGVydHlTaGVldFBhZ2UgPQorCQkJCW5ldyBFeHRlbmRlZFByb3BlcnR5U2hlZXRQYWdlKGVkaXRpbmdEb21haW4pIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKExpc3Q8Pz4gc2VsZWN0aW9uKSB7CisJCQkJCQlTY2VuYXJpb0VkaXRvci50aGlzLnNldFNlbGVjdGlvblRvVmlld2VyKHNlbGVjdGlvbik7CisJCQkJCQlTY2VuYXJpb0VkaXRvci50aGlzLnNldEZvY3VzKCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisJCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7CisJCQkJCX0KKwkJCQl9OworCQkJcHJvcGVydHlTaGVldFBhZ2Uuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJfQorCisJCXJldHVybiBwcm9wZXJ0eVNoZWV0UGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGRlYWxzIHdpdGggaG93IHdlIHdhbnQgc2VsZWN0aW9uIGluIHRoZSBvdXRsaW5lciB0byBhZmZlY3QgdGhlIG90aGVyIHZpZXdzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlpZiAoc2VsZWN0aW9uVmlld2VyICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCUl0ZXJhdG9yPD8+IHNlbGVjdGVkRWxlbWVudHMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuaXRlcmF0b3IoKTsKKwkJCWlmIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgeworCQkJCS8vIEdldCB0aGUgZmlyc3Qgc2VsZWN0ZWQgZWxlbWVudC4KKwkJCQkvLworCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzLm5leHQoKTsKKworCQkJCUFycmF5TGlzdDxPYmplY3Q+IHNlbGVjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKwkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnQpOworCQkJCXdoaWxlIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgeworCQkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnRzLm5leHQoKSk7CisJCQkJfQorCisJCQkJLy8gU2V0IHRoZSBzZWxlY3Rpb24gdG8gdGhlIHdpZGdldC4KKwkJCQkvLworCQkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uTGlzdCkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSB0ZXN0cyB0aGUgY29tbWFuZCBzdGFjay4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKwkJcmV0dXJuICgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuaXNTYXZlTmVlZGVkKCk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSBzYXZlcyB0aGUgbW9kZWwgZmlsZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisJCS8vIFNhdmUgb25seSByZXNvdXJjZXMgdGhhdCBoYXZlIGFjdHVhbGx5IGNoYW5nZWQuCisJCS8vCisJCWZpbmFsIE1hcDxPYmplY3QsIE9iamVjdD4gc2F2ZU9wdGlvbnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKKwkJc2F2ZU9wdGlvbnMucHV0KFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRCwgUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOworCisJCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtiZW5jaC4KKwkJLy8KKwkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9CisJCQluZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgeworCQkJCS8vIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IGdldHMgaW52b2tlZCB3aGVuIHRoZSBvcGVyYXRpb24gcnVucy4KKwkJCQkvLworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJCS8vIFNhdmUgdGhlIHJlc291cmNlcyB0byB0aGUgZmlsZSBzeXN0ZW0uCisJCQkJCS8vCisJCQkJCWJvb2xlYW4gZmlyc3QgPSB0cnVlOworCQkJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKSB7CisJCQkJCQlpZiAoKGZpcnN0IHx8ICFyZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSB8fCBpc1BlcnNpc3RlZChyZXNvdXJjZSkpICYmICFlZGl0aW5nRG9tYWluLmlzUmVhZE9ubHkocmVzb3VyY2UpKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJbG9uZyB0aW1lU3RhbXAgPSByZXNvdXJjZS5nZXRUaW1lU3RhbXAoKTsKKwkJCQkJCQkJcmVzb3VyY2Uuc2F2ZShzYXZlT3B0aW9ucyk7CisJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUaW1lU3RhbXAoKSAhPSB0aW1lU3RhbXApIHsKKwkJCQkJCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCQkJCQkJfQorCQkJCQkJCWZpcnN0ID0gZmFsc2U7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9OworCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisJCXRyeSB7CisJCQkvLyBUaGlzIHJ1bnMgdGhlIG9wdGlvbnMsIGFuZCBzaG93cyBwcm9ncmVzcy4KKwkJCS8vCisJCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7CisKKwkJCS8vIFJlZnJlc2ggdGhlIG5lY2Vzc2FyeSBzdGF0ZS4KKwkJCS8vCisJCQkoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLnNhdmVJc0RvbmUoKTsKKwkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgdGhhdCBzaG91bGRuJ3QuCisJCQkvLworCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHdoZXRoZXIgc29tZXRoaW5nIGhhcyBiZWVuIHBlcnNpc3RlZCB0byB0aGUgVVJJIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisJICogVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIFVSSSBjb252ZXJ0ZXIgZnJvbSB0aGUgZWRpdG9yJ3MgcmVzb3VyY2Ugc2V0IHRvIHRyeSB0byBvcGVuIGFuIGlucHV0IHN0cmVhbS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNQZXJzaXN0ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbShyZXNvdXJjZS5nZXRVUkkoKSk7CisJCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKKwkJCQlyZXN1bHQgPSB0cnVlOworCQkJCXN0cmVhbS5jbG9zZSgpOworCQkJfQorCQl9CisJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBJZ25vcmUKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgdHJ1ZSBiZWNhdXNlIGl0IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFRoaXMgYWxzbyBjaGFuZ2VzIHRoZSBlZGl0b3IncyBpbnB1dC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisJICogZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKKwkJU2F2ZUFzRGlhbG9nIHNhdmVBc0RpYWxvZyA9IG5ldyBTYXZlQXNEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOworCQlzYXZlQXNEaWFsb2cub3BlbigpOworCQlJUGF0aCBwYXRoID0gc2F2ZUFzRGlhbG9nLmdldFJlc3VsdCgpOworCQlpZiAocGF0aCAhPSBudWxsKSB7CisJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOworCQkJaWYgKGZpbGUgIT0gbnVsbCkgeworCQkJCWRvU2F2ZUFzKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKSwgbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZG9TYXZlQXMoVVJJIHVyaSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisJCShlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKS5zZXRVUkkodXJpKTsKKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKKwkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPQorCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgIT0gbnVsbCA/CisJCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgOgorCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisJCWRvU2F2ZShwcm9ncmVzc01vbml0b3IpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKKwkJdHJ5IHsKKwkJCWlmIChtYXJrZXIuZ2V0VHlwZSgpLmVxdWFscyhFVmFsaWRhdG9yLk1BUktFUikpIHsKKwkJCQlTdHJpbmcgdXJpQXR0cmlidXRlID0gbWFya2VyLmdldEF0dHJpYnV0ZShFVmFsaWRhdG9yLlVSSV9BVFRSSUJVVEUsIG51bGwpOworCQkJCWlmICh1cmlBdHRyaWJ1dGUgIT0gbnVsbCkgeworCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSSh1cmlBdHRyaWJ1dGUpOworCQkJCQlFT2JqZWN0IGVPYmplY3QgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0RU9iamVjdCh1cmksIHRydWUpOworCQkJCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7CisJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGVkaXRpbmdEb21haW4uZ2V0V3JhcHBlcihlT2JqZWN0KSkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBzdGFydHVwLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYworCSAqIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgeworCQlzZXRTaXRlKHNpdGUpOworCQlzZXRJbnB1dFdpdGhOb3RpZnkoZWRpdG9ySW5wdXQpOworCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOworCQlzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKHRoaXMpOworCQlzaXRlLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJZ2V0Q29udHJvbChnZXRBY3RpdmVQYWdlKCkpLnNldEZvY3VzKCk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAorCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gcmV0dXJuIHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgeworCQlyZXR1cm4gZWRpdG9yU2VsZWN0aW9uOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHNldCB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLgorCSAqIENhbGxpbmcgdGhpcyByZXN1bHQgd2lsbCBub3RpZnkgdGhlIGxpc3RlbmVycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWVkaXRvclNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKworCQlmb3IgKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgOiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzKSB7CisJCQlsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7CisJCX0KKwkJc2V0U3RhdHVzTGluZU1hbmFnZXIoc2VsZWN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZU1hbmFnZXIoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyID0gY3VycmVudFZpZXdlciAhPSBudWxsICYmIGN1cnJlbnRWaWV3ZXIgPT0gY29udGVudE91dGxpbmVWaWV3ZXIgPworCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA6IGdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOworCisJCWlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKSB7CisJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCQlDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikudG9MaXN0KCk7CisJCQkJc3dpdGNoIChjb2xsZWN0aW9uLnNpemUoKSkgeworCQkJCQljYXNlIDA6IHsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTm9PYmplY3RTZWxlY3RlZCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAxOiB7CisJCQkJCQlTdHJpbmcgdGV4dCA9IG5ldyBBZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3IoYWRhcHRlckZhY3RvcnkpLmdldFRleHQoY29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkIiwgdGV4dCkpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlkZWZhdWx0OiB7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQiLCBJbnRlZ2VyLnRvU3RyaW5nKGNvbGxlY3Rpb24uc2l6ZSgpKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoIiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHRoZSBwbHVnaW4ncyBwbHVnaW4ucHJvcGVydGllcyBmaWxlLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJcmV0dXJuIENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSk7CisJfQorCisJLyoqCisJICogVGhpcyBsb29rcyB1cCBhIHN0cmluZyBpbiBwbHVnaW4ucHJvcGVydGllcywgbWFraW5nIGEgc3Vic3RpdHV0aW9uLiA8IS0tCisJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgeworCQlyZXR1cm4gQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5LCBuZXcgT2JqZWN0IFtdIHsgczEgfSk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcn0gdG8gaGVscAorCSAqIGZpbGwgdGhlIGNvbnRleHQgbWVudXMgd2l0aCBjb250cmlidXRpb25zIGZyb20gdGhlIEVkaXQgbWVudS4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQkoKElNZW51TGlzdGVuZXIpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkpLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7CisJCXJldHVybiAoRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsKKwkJcmV0dXJuIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aW9uQmFycygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7CisJCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKKworCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworCisJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKKworCQlpZiAoZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSB0aGlzKSB7CisJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihudWxsKTsKKwkJfQorCisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBvdXRsaW5lIHZpZXcgc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4gPCEtLQorCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd091dGxpbmVWaWV3KCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NlcXVlbmNlci9wcmVzZW50YXRpb24vU2VxdWVuY2VyQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvcHJlc2VudGF0aW9uL1NlcXVlbmNlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMxMGVlYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvcHJlc2VudGF0aW9uL1NlcXVlbmNlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKQEAgLTAsMCArMSw0NDMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKy8vaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuYWN0aW9uLldvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29udHJvbEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YkNvbnRyaWJ1dGlvbkl0ZW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJlc2VudGF0aW9uLkNvcmVFZGl0b3JQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZvciB0aGUgU2VxdWVuY2VyIG1vZGVsIGVkaXRvci4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgU2VxdWVuY2VyQWN0aW9uQmFyQ29udHJpYnV0b3IKKwlleHRlbmRzIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcgorCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7CisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yUGFydDsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGFjdGlvbiBvcGVucyB0aGUgUHJvcGVydGllcyB2aWV3LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQWN0aW9uIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbiA9CisJCW5ldyBBY3Rpb24oQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtIikpIC8vJE5PTi1OTFMtMSQKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJdHJ5IHsKKwkJCQkJZ2V0UGFnZSgpLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFRoaXMgYWN0aW9uIHJlZnJlc2hlcyB0aGUgdmlld2VyIG9mIHRoZSBjdXJyZW50IGVkaXRvciBpZiB0aGUgZWRpdG9yCisJICogaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUFjdGlvbiByZWZyZXNoVmlld2VyQWN0aW9uID0KKwkJbmV3IEFjdGlvbihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtIikpIC8vJE5PTi1OTFMtMSQKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisJCQkJcmV0dXJuIGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWlmIChhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7CisJCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRWaWV3ZXIoKTsKKwkJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7CisJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyB3aWxsIGNvbnRhaW4gb25lIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlQ2hpbGRBY3Rpb25zOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVDaGlsZCBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlU2libGluZ0FjdGlvbnM7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZVNpYmxpbmcgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgY29udHJpYnV0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNlcXVlbmNlckFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgeworCQlzdXBlcihBRERJVElPTlNfTEFTVF9TVFlMRSk7CisJCWxvYWRSZXNvdXJjZUFjdGlvbiA9IG5ldyBMb2FkUmVzb3VyY2VBY3Rpb24oKTsKKwkJdmFsaWRhdGVBY3Rpb24gPSBuZXcgVmFsaWRhdGVBY3Rpb24oKTsKKwkJY29udHJvbEFjdGlvbiA9IG5ldyBDb250cm9sQWN0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIFNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMgdG8gdGhlIHRvb2wgYmFyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7CisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzZXF1ZW5jZXItc2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInNlcXVlbmNlci1hZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFkZHMgdG8gdGhlIG1lbnUgYmFyIGEgbWVudSBhbmQgc29tZSBzZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zLAorCSAqIGFzIHdlbGwgYXMgdGhlIHN1Yi1tZW51cyBmb3Igb2JqZWN0IGNyZWF0aW9uIGl0ZW1zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudU1hbmFnZXIpOworCisJCUlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1NlcXVlbmNlckVkaXRvcl9tZW51IiksICJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyTWVudUlEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlQ2hpbGQgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgorCQkvLworCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVTaWJsaW5nIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KKwkJLy8KKwkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gRm9yY2UgYW4gdXBkYXRlIGJlY2F1c2UgRWNsaXBzZSBoaWRlcyBlbXB0eSBtZW51cyBub3cuCisJCS8vCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcgorCQkJKG5ldyBJTWVudUxpc3RlbmVyKCkgeworCQkJCSBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCQkJCSBtZW51TWFuYWdlci51cGRhdGVBbGwodHJ1ZSk7CisJCQkJIH0KKwkJCSB9KTsKKworCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiBXaGVuIHRoZSBhY3RpdmUgZWRpdG9yIGNoYW5nZXMsIHRoaXMgcmVtZW1iZXJzIHRoZSBjaGFuZ2UgYW5kIHJlZ2lzdGVycyB3aXRoIGl0IGFzIGEgc2VsZWN0aW9uIHByb3ZpZGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBwYXJ0KSB7CisJCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihwYXJ0KTsKKwkJYWN0aXZlRWRpdG9yUGFydCA9IHBhcnQ7CisKKwkJLy8gU3dpdGNoIHRvIHRoZSBuZXcgc2VsZWN0aW9uIHByb3ZpZGVyLgorCQkvLworCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCQl9CisJCWlmIChwYXJ0ID09IG51bGwpIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsKKwkJfQorCQllbHNlIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gcGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKKwkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKworCQkJLy8gRmFrZSBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IHRvIHVwZGF0ZSB0aGUgbWVudXMuCisJCQkvLworCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpICE9IG51bGwpIHsKKwkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn0sCisJICogaGFuZGxpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50fXMgYnkgcXVlcnlpbmcgZm9yIHRoZSBjaGlsZHJlbiBhbmQgc2libGluZ3MKKwkgKiB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZCB1cGRhdGluZyB0aGUgbWVudXMgYWNjb3JkaW5nbHkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJLy8gUmVtb3ZlIGFueSBtZW51IGl0ZW1zIGZvciBvbGQgc2VsZWN0aW9uLgorCQkvLworCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMpOworCQl9CisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucyk7CisJCX0KKworCQkvLyBRdWVyeSB0aGUgbmV3IHNlbGVjdGlvbiBmb3IgYXBwcm9wcmlhdGUgbmV3IGNoaWxkL3NpYmxpbmcgZGVzY3JpcHRvcnMKKwkJLy8KKwkJQ29sbGVjdGlvbjw/PiBuZXdDaGlsZERlc2NyaXB0b3JzID0gbnVsbDsKKwkJQ29sbGVjdGlvbjw/PiBuZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBudWxsOworCisJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7CisJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsKKwkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7CisKKwkJCUVkaXRpbmdEb21haW4gZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKKworCQkJbmV3Q2hpbGREZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgbnVsbCk7CisJCQluZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhudWxsLCBvYmplY3QpOworCQl9CisKKwkJLy8gR2VuZXJhdGUgYWN0aW9ucyBmb3Igc2VsZWN0aW9uOyBwb3B1bGF0ZSBhbmQgcmVkcmF3IHRoZSBtZW51cy4KKwkJLy8KKwkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMobmV3Q2hpbGREZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKKwkJY3JlYXRlU2libGluZ0FjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKG5ld1NpYmxpbmdEZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKKworCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7CisJCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKKwkJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOworCQl9CisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOworCQkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwKKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgeworCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVDaGlsZEFjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYWN0aW9uczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwKKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoQ29sbGVjdGlvbjw/PiBkZXNjcmlwdG9ycywgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJQ29sbGVjdGlvbjxJQWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOworCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgeworCQkJZm9yIChPYmplY3QgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7CisJCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCisJLyoqCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiB3aXRoIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbiwKKwkgKiBieSBpbnNlcnRpbmcgdGhlbSBiZWZvcmUgdGhlIHNwZWNpZmllZCBjb250cmlidXRpb24gaXRlbSA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4uCisJICogSWYgPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGV5IGFyZSBzaW1wbHkgYWRkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248PyBleHRlbmRzIElBY3Rpb24+IGFjdGlvbnMsIFN0cmluZyBjb250cmlidXRpb25JRCkgeworCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKElBY3Rpb24gYWN0aW9uIDogYWN0aW9ucykgeworCQkJCWlmIChjb250cmlidXRpb25JRCAhPSBudWxsKSB7CisJCQkJCW1hbmFnZXIuaW5zZXJ0QmVmb3JlKGNvbnRyaWJ1dGlvbklELCBhY3Rpb24pOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJbWFuYWdlci5hZGQoYWN0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCQorCS8qKgorCSAqIFRoaXMgcmVtb3ZlcyBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gYWxsIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkZXBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zKSB7CisJCWlmIChhY3Rpb25zICE9IG51bGwpIHsKKwkJCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtYW5hZ2VyLmdldEl0ZW1zKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CisJCQkJLy8gTG9vayBpbnRvIFN1YkNvbnRyaWJ1dGlvbkl0ZW1zCisJCQkJLy8KKwkJCQlJQ29udHJpYnV0aW9uSXRlbSBjb250cmlidXRpb25JdGVtID0gaXRlbXNbaV07CisJCQkJd2hpbGUgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBTdWJDb250cmlidXRpb25JdGVtKSB7CisJCQkJCWNvbnRyaWJ1dGlvbkl0ZW0gPSAoKFN1YkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0SW5uZXJJdGVtKCk7CisJCQkJfQorCisJCQkJLy8gRGVsZXRlIHRoZSBBY3Rpb25Db250cmlidXRpb25JdGVtcyB3aXRoIG1hdGNoaW5nIGFjdGlvbi4KKwkJCQkvLworCQkJCWlmIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCQlJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSljb250cmlidXRpb25JdGVtKS5nZXRBY3Rpb24oKTsKKwkJCQkJaWYgKGFjdGlvbnMuY29udGFpbnMoYWN0aW9uKSkgeworCQkJCQkJbWFuYWdlci5yZW1vdmUoY29udHJpYnV0aW9uSXRlbSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgcG9wLXVwIG1lbnUgYmVmb3JlIGl0IGFwcGVhcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQlzdXBlci5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOworCQlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG51bGw7CisKKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOworCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKworCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOworCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGluc2VydHMgZ2xvYmFsIGFjdGlvbnMgYmVmb3JlIHRoZSAiYWRkaXRpb25zLWVuZCIgc2VwYXJhdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMtZW5kIiwgbmV3IFNlcGFyYXRvcigidWktYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uKTsgLy8kTk9OLU5MUy0xJAorCisJCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsJCQorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHJlZnJlc2hWaWV3ZXJBY3Rpb24pOyAvLyROT04tTkxTLTEkCisKKwkJc3VwZXIuYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogVGhpcyBlbnN1cmVzIHRoYXQgYSBkZWxldGUgYWN0aW9uIHdpbGwgY2xlYW4gdXAgYWxsIHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBvYmplY3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUFsbFJlZmVyZW5jZXNPbkRlbGV0ZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL3ByZXNlbnRhdGlvbi9TZXF1ZW5jZXJFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zZXF1ZW5jZXIvcHJlc2VudGF0aW9uL1NlcXVlbmNlckVkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOTU2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc2VxdWVuY2VyL3ByZXNlbnRhdGlvbi9TZXF1ZW5jZXJFZGl0b3IuamF2YQpAQCAtMCwwICsxLDE2NzAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTG9jYWxTZWxlY3Rpb25UcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNhdmVBc0RpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5NYXJrZXJIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5lZGl0b3IuUHJvYmxlbUVkaXRvclBhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuY2VsbGVkaXRvci5BZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5Mb2NhbFRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLlVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSU1hcmtlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudmlldy5FeHRlbmRlZFByb3BlcnR5U2hlZXRQYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1YTUlSZXNvdXJjZUZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIucHJvdmlkZXIuU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJlc2VudGF0aW9uLkNvcmVFZGl0b3JBZHZpc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJlc2VudGF0aW9uLkNvcmVFZGl0b3JQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQucHJvdmlkZXIuRXhwZXJpbWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlci5HcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByb3ZpZGVyLk1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXIuTW9kaWZpZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByb3ZpZGVyLlByZWRpY2F0ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5wcm92aWRlci5TY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIucHJvdmlkZXIuU29sdmVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIucHJvdmlkZXIuVHJpZ2dlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOworCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKKy8qKgorICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgU2VxdWVuY2VyIG1vZGVsIGVkaXRvci4KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNlcXVlbmNlckVkaXRvcgorCWV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydAorCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5Qcm92aWRlciwgSVNlbGVjdGlvblByb3ZpZGVyLCBJTWVudUxpc3RlbmVyLCBJVmlld2VyUHJvdmlkZXIgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGVkaXRpbmcgZG9tYWluIHRoYXQgaXMgdXNlZCB0byB0cmFjayBhbGwgY2hhbmdlcyB0byB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgb25lIGFkYXB0ZXIgZmFjdG9yeSB1c2VkIGZvciBwcm92aWRpbmcgdmlld3Mgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElDb250ZW50T3V0bGluZVBhZ2UgY29udGVudE91dGxpbmVQYWdlOworCisJLyoqCisJICogVGhpcyBpcyBhIGtsdWRnZS4uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlJ3Mgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmVlVmlld2VyIGNvbnRlbnRPdXRsaW5lVmlld2VyOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgcHJvcGVydHkgc2hlZXQgcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB2aWV3ZXIgdGhhdCBzaGFkb3dzIHRoZSBzZWxlY3Rpb24gaW4gdGhlIGNvbnRlbnQgb3V0bGluZS4KKwkgKiBUaGUgcGFyZW50IHJlbGF0aW9uIG11c3QgYmUgY29ycmVjdGx5IGRlZmluZWQgZm9yIHRoaXMgdG8gd29yay4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBzZWxlY3Rpb25WaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgY29udGVudCB2aWV3ZXIsIHdoaWNoIG1heSBiZSBlaXRoZXIgb25lIG9mIHRoZSB2aWV3ZXJzIGluIHRoZSBwYWdlcyBvciB0aGUgY29udGVudCBvdXRsaW5lIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVmlld2VyIGN1cnJlbnRWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgdG8gd2hpY2ggZXZlciB2aWV3ZXIgaXMgYWN0aXZlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfXMgdGhhdCBhcmUgbGlzdGVuaW5nIHRvIHRoaXMgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+KCk7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGVkaXRvciBhcyBhIHdob2xlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uIGVkaXRvclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7CisKKwkvKioKKwkgKiBUaGUgTWFya2VySGVscGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB3b3Jrc3BhY2UgcmVzb3VyY2UgbWFya2VycyBwcmVzZW50ZWQKKwkgKiBpbiBFY2xpcHNlJ3MgUHJvYmxlbXMgVmlldy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFya2VySGVscGVyIG1hcmtlckhlbHBlciA9IG5ldyBFZGl0VUlNYXJrZXJIZWxwZXIoKTsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyBmb3Igd2hlbiB0aGUgb3V0bGluZSBiZWNvbWVzIGFjdGl2ZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9CisJCW5ldyBJUGFydExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJaWYgKHAgaW5zdGFuY2VvZiBDb250ZW50T3V0bGluZSkgeworCQkJCQlpZiAoKChDb250ZW50T3V0bGluZSlwKS5nZXRDdXJyZW50UGFnZSgpID09IGNvbnRlbnRPdXRsaW5lUGFnZSkgeworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoU2VxdWVuY2VyRWRpdG9yLnRoaXMpOworCisJCQkJCQlzZXRDdXJyZW50Vmlld2VyKGNvbnRlbnRPdXRsaW5lVmlld2VyKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChwIGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgeworCQkJCQlpZiAoKChQcm9wZXJ0eVNoZWV0KXApLmdldEN1cnJlbnRQYWdlKCkgPT0gcHJvcGVydHlTaGVldFBhZ2UpIHsKKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKFNlcXVlbmNlckVkaXRvci50aGlzKTsKKwkJCQkJCWhhbmRsZUFjdGl2YXRlKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAocCA9PSBTZXF1ZW5jZXJFZGl0b3IudGhpcykgeworCQkJCQloYW5kbGVBY3RpdmF0ZSgpOworCQkJCX0KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQl9OworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkIHNpbmNlIGxhc3QgYWN0aXZhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gc2F2ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHNhdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIE1hcCB0byBzdG9yZSB0aGUgZGlhZ25vc3RpYyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwPFJlc291cmNlLCBEaWFnbm9zdGljPiByZXNvdXJjZVRvRGlhZ25vc3RpY01hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFJlc291cmNlLCBEaWFnbm9zdGljPigpOworCisJLyoqCisJICogQ29udHJvbHMgd2hldGhlciB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHNob3VsZCBiZSB1cGRhdGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKworCS8qKgorCSAqIEFkYXB0ZXIgdXNlZCB0byB1cGRhdGUgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiB3aGVuIHJlc291cmNlcyBhcmUgZGVtYW5kZWQgbG9hZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBFQ29udGVudEFkYXB0ZXIgcHJvYmxlbUluZGljYXRpb25BZGFwdGVyID0gCisJCW5ldyBFQ29udGVudEFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisJCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZXNvdXJjZS5jbGFzcykpIHsKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRDoKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0VSUk9SUzoKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX1dBUk5JTkdTOiB7CisJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2Upbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7CisJCQkJCQkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIG51bGwpOworCQkJCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGRpYWdub3N0aWMpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucmVtb3ZlKHJlc291cmNlKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAodXBkYXRlUHJvYmxlbUluZGljYXRpb24pIHsKKwkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkJCQkJCQkgfQorCQkJCQkJCQkJIH0pOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCQkJCX0KKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7CisJCQkJYmFzaWNTZXRUYXJnZXQodGFyZ2V0KTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCB1bnNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsKKwkJCQliYXNpY1Vuc2V0VGFyZ2V0KHRhcmdldCk7CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdvcmtzcGFjZSBjaGFuZ2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0KKwkJbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOworCQkJCXRyeSB7CisJCQkJCWNsYXNzIFJlc291cmNlRGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKKwkJCQkJCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKwkJCQkJCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKKwkJCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIHx8CisJCQkJCQkJCSAgICBkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiBkZWx0YS5nZXRGbGFncygpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMpIHsKKwkJCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZGVsdGEuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKSwgZmFsc2UpOworCQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKKwkJCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKKwkJCQkJCQkJCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQllbHNlIGlmICghc2F2ZWRSZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlKSkgeworCQkJCQkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQl9CisKKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgeworCQkJCQkJCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOworCQkJCQkJfQorCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsKKwkJCQkJCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlczsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWZpbmFsIFJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsKKwkJCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOworCisJCQkJCWlmICghdmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCSByZW1vdmVkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKSk7CisJCQkJCQkJCQkgaWYgKCFpc0RpcnR5KCkpIHsKKwkJCQkJCQkJCQkgZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihTZXF1ZW5jZXJFZGl0b3IudGhpcywgZmFsc2UpOworCQkJCQkJCQkJIH0KKwkJCQkJCQkJIH0KKwkJCQkJCQkgfSk7CisJCQkJCX0KKworCQkJCQlpZiAoIXZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOworCQkJCQkJCQkJIGlmIChnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpID09IFNlcXVlbmNlckVkaXRvci50aGlzKSB7CisJCQkJCQkJCQkJIGhhbmRsZUFjdGl2YXRlKCk7CisJCQkJCQkJCQkgfQorCQkJCQkJCQkgfQorCQkJCQkJCSB9KTsKKwkJCQkJfQorCQkJCX0KKwkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBIYW5kbGVzIGFjdGl2YXRpb24gb2YgdGhlIGVkaXRvciBvciBpdCdzIGFzc29jaWF0ZWQgdmlld3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoKSB7CisJCS8vIFJlY29tcHV0ZSB0aGUgcmVhZCBvbmx5IHN0YXRlLgorCQkvLworCQlpZiAoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKSAhPSBudWxsKSB7CisJCSAgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKS5jbGVhcigpOworCisJCSAgLy8gUmVmcmVzaCBhbnkgYWN0aW9ucyB0aGF0IG1heSBiZWNvbWUgZW5hYmxlZCBvciBkaXNhYmxlZC4KKwkJICAvLworCQkgIHNldFNlbGVjdGlvbihnZXRTZWxlY3Rpb24oKSk7CisJCX0KKworCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7CisJCQlpZiAoaGFuZGxlRGlydHlDb25mbGljdCgpKSB7CisJCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihTZXF1ZW5jZXJFZGl0b3IudGhpcywgZmFsc2UpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVtb3ZlZFJlc291cmNlcy5jbGVhcigpOworCQkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgeworCQkJY2hhbmdlZFJlc291cmNlcy5yZW1vdmVBbGwoc2F2ZWRSZXNvdXJjZXMpOworCQkJaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpOworCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOworCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEhhbmRsZXMgd2hhdCB0byBkbyB3aXRoIGNoYW5nZWQgcmVzb3VyY2VzIG9uIGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpIHsKKwkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSAmJiAoIWlzRGlydHkoKSB8fCBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpKSB7CisJCQlpZiAoaXNEaXJ0eSgpKSB7CisJCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsKKwkJCX0KKwkJCWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZmx1c2goKTsKKworCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKwkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7CisJCQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKKwkJCQkJcmVzb3VyY2UudW5sb2FkKCk7CisJCQkJCXRyeSB7CisJCQkJCQlyZXNvdXJjZS5sb2FkKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJaWYgKCFyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5jb250YWluc0tleShyZXNvdXJjZSkpIHsKKwkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbi5pc1N0YWxlKGVkaXRvclNlbGVjdGlvbikpIHsKKwkJCQlzZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7CisJCQl9CisKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCX0KKwl9CisgIAorCS8qKgorCSAqIFVwZGF0ZXMgdGhlIHByb2JsZW1zIGluZGljYXRpb24gd2l0aCB0aGUgaW5mb3JtYXRpb24gZGVzY3JpYmVkIGluIHRoZSBzcGVjaWZpZWQgZGlhZ25vc3RpYy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpIHsKKwkJaWYgKHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKSB7CisJCQlCYXNpY0RpYWdub3N0aWMgZGlhZ25vc3RpYyA9CisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5PSywKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZWRpdG9yIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkgMCwKKwkJCQkJIG51bGwsCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpIH0pOworCQkJZm9yIChEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA6IHJlc291cmNlVG9EaWFnbm9zdGljTWFwLnZhbHVlcygpKSB7CisJCQkJaWYgKGNoaWxkRGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJZGlhZ25vc3RpYy5hZGQoY2hpbGREaWFnbm9zdGljKTsKKwkJCQl9CisJCQl9CisKKwkJCWludCBsYXN0RWRpdG9yUGFnZSA9IGdldFBhZ2VDb3VudCgpIC0gMTsKKwkJCWlmIChsYXN0RWRpdG9yUGFnZSA+PSAwICYmIGdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkgaW5zdGFuY2VvZiBQcm9ibGVtRWRpdG9yUGFydCkgeworCQkJCSgoUHJvYmxlbUVkaXRvclBhcnQpZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSkuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQlQcm9ibGVtRWRpdG9yUGFydCBwcm9ibGVtRWRpdG9yUGFydCA9IG5ldyBQcm9ibGVtRWRpdG9yUGFydCgpOworCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7CisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0TWFya2VySGVscGVyKG1hcmtlckhlbHBlcik7CisJCQkJdHJ5IHsKKwkJCQkJYWRkUGFnZSgrK2xhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydCwgZ2V0RWRpdG9ySW5wdXQoKSk7CisJCQkJCXNldFBhZ2VUZXh0KGxhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydC5nZXRQYXJ0TmFtZSgpKTsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJCXNob3dUYWJzKCk7CisJCQkJfQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChtYXJrZXJIZWxwZXIuaGFzTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpKSB7CisJCQkJbWFya2VySGVscGVyLmRlbGV0ZU1hcmtlcnMoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCW1hcmtlckhlbHBlci5jcmVhdGVNYXJrZXJzKGRpYWdub3N0aWMpOworCQkJCQl9CisJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFNob3dzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsKKwkJcmV0dXJuCisJCQlNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbgorCQkJCShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRmlsZUNvbmZsaWN0X2xhYmVsIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfV0FSTl9GaWxlQ29uZmxpY3QiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBtb2RlbCBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNlcXVlbmNlckVkaXRvcigpIHsKKwkJc3VwZXIoKTsKKwkJaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNldHMgdXAgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgbW9kZWwgZWRpdG9yLiA8IS0tIGJlZ2luLXVzZXItZG9jCisJICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIAorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKSB7CisJCWluaXRpYWxpemVFZGl0aW5nRG9tYWluR2VuKCk7CisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpCisJCQkJLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgiKiIsCisJCQkJCQlTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbC5JTlNUQU5DRSk7CisKKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkKKwkJCQkuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKS5wdXQoInBsYXRmb3JtIiwKKwkJCQkJCVNURU1YTUlSZXNvdXJjZUZhY3RvcnlJbXBsLklOU1RBTkNFKTsKKwl9IC8vIGluaXRpYWxpemVFZGl0aW5nRG9tYWluCisJCisJLyoqCisJICogVGhpcyBzZXRzIHVwIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1vZGVsIGVkaXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWRpdGluZ0RvbWFpbkdlbigpIHsKKwkJLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlpZWxkcyBpdGVtIHByb3ZpZGVycy4KKwkJLy8KKwkJYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOworCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBFeHBlcmltZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBHcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBQcmVkaWNhdGVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFRyaWdnZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKworCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUgZXhlY3V0ZWQuCisJCS8vCisJCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOworCisJCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCisJCS8vCisJCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcgorCQkJKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKKwkJCQkgcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgeworCQkJCQkgZ2V0Q29udGFpbmVyKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJIChuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJICBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCSAgZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworCisJCQkJCQkJCSAgLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KKwkJCQkJCQkJICAvLworCQkJCQkJCQkgIENvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaylldmVudC5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsKKwkJCQkJCQkJICBpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgeworCQkJCQkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihtb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7CisJCQkJCQkJCSAgfQorCQkJCQkJCQkgIGlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsICYmICFwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQkJCQkgIHByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsKKwkJCQkJCQkJICB9CisJCQkJCQkJICB9CisJCQkJCQkgIH0pOworCQkJCSB9CisJCQkgfSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgorCQkvLworCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgQm9vbGVhbj4oKSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBoZXJlIGZvciB0aGUgbGlzdGVuZXIgdG8gYmUgYWJsZSB0byBjYWxsIGl0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgYWN0aW9uKSB7CisJCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShhY3Rpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgc2V0cyB0aGUgc2VsZWN0aW9uIGludG8gd2hpY2hldmVyIHZpZXdlciBpcyBhY3RpdmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisJCWZpbmFsIENvbGxlY3Rpb248Pz4gdGhlU2VsZWN0aW9uID0gY29sbGVjdGlvbjsKKwkJLy8gTWFrZSBzdXJlIGl0J3Mgb2theS4KKwkJLy8KKwkJaWYgKHRoZVNlbGVjdGlvbiAhPSBudWxsICYmICF0aGVTZWxlY3Rpb24uaXNFbXB0eSgpKSB7CisJCQlSdW5uYWJsZSBydW5uYWJsZSA9CisJCQkJbmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBpdGVtcyBpbiB0aGUgY3VycmVudCBjb250ZW50IHZpZXdlciBvZiB0aGUgZWRpdG9yLgorCQkJCQkJLy8KKwkJCQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKKwkJCQkJCQljdXJyZW50Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0aGVTZWxlY3Rpb24udG9BcnJheSgpKSwgdHJ1ZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9OworCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGVkaXRpbmcgZG9tYWluIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSUVkaXRpbmdEb21haW5Qcm92aWRlcn0gaW50ZXJmYWNlLgorCSAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBpbXBsZW1lbnRpbmcgdGhlIHN0YXRpYyBtZXRob2RzIG9mIHtAbGluayBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW59CisJICogYW5kIGZvciBzdXBwb3J0aW5nIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKKwkJcmV0dXJuIGVkaXRpbmdEb21haW47CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGNsYXNzIFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsKKwkJcHVibGljIFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOworCQl9CisKKwkJcHVibGljIE9iamVjdCBbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7CisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7CisJCQlyZXR1cm4gKHBhcmVudCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhcmVudCkpLnRvQXJyYXkoKTsKKwkJfQorCisJCXB1YmxpYyBPYmplY3QgW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgeworCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOworCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7CisJCQlyZXR1cm4gcGFyZW50ICE9IG51bGw7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG9uZSBjb250ZW50IHZpZXdlciwgZWl0aGVyIGZvciB0aGUgY3VycmVudCBwYWdlIG9yIHRoZSBvdXRsaW5lIHZpZXcsIGlmIGl0IGhhcyBmb2N1cywKKwkgKiBpcyB0aGUgY3VycmVudCBvbmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q3VycmVudFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7CisJCS8vIElmIGl0IGlzIGNoYW5naW5nLi4uCisJCS8vCisJCWlmIChjdXJyZW50Vmlld2VyICE9IHZpZXdlcikgeworCQkJaWYgKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7CisJCQkJLy8gQ3JlYXRlIHRoZSBsaXN0ZW5lciBvbiBkZW1hbmQuCisJCQkJLy8KKwkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPQorCQkJCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCQkJCS8vIFRoaXMganVzdCBub3RpZmllcyB0aG9zZSB0aGluZ3MgdGhhdCBhcmUgYWZmZWN0ZWQgYnkgdGhlIHNlY3Rpb24uCisJCQkJCQkvLworCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgc2VsZWN0aW9uQ2hhbmdlZEV2ZW50KSB7CisJCQkJCQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkNoYW5nZWRFdmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCQl9CisJCQkJCX07CisJCQl9CisKKwkJCS8vIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBvbGQgb25lLgorCQkJLy8KKwkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKKwkJCQljdXJyZW50Vmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOworCQkJfQorCisJCQkvLyBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG5ldyBvbmUuCisJCQkvLworCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7CisJCQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOworCQkJfQorCisJCQkvLyBSZW1lbWJlciBpdC4KKwkJCS8vCisJCQljdXJyZW50Vmlld2VyID0gdmlld2VyOworCisJCQkvLyBTZXQgdGhlIGVkaXRvcnMgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdlcidzIHNlbGVjdGlvbi4KKwkJCS8vCisJCQlzZXRTZWxlY3Rpb24oY3VycmVudFZpZXdlciA9PSBudWxsID8gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSA6IGN1cnJlbnRWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSB2aWV3ZXIgYXMgcmVxdWlyZWQgYnkgdGhlIHtAbGluayBJVmlld2VyUHJvdmlkZXJ9IGludGVyZmFjZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKKwkJcmV0dXJuIGN1cnJlbnRWaWV3ZXI7CisJfQorCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGEgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyIGFuZCBhZGRzIGEgbGlzdGVuZXIgYXMgd2VsbCByZWdpc3RlcmluZyB0aGUgbWVudSBmb3IgZXh0ZW5zaW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZCBOT1QKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgeworCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQKKwkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7CisJCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKKwkJTWVudSBtZW51PSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKKwkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOworCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgdmlld2VyKTsKKworCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSzsKKwkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKSwgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07CisJCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKKwkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKKwl9IC8vIGNyZWF0ZUNvbnRleHRNZW51Rm9yCisJCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGEgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyIGFuZCBhZGRzIGEgbGlzdGVuZXIgYXMgd2VsbCByZWdpc3RlcmluZyB0aGUgbWVudSBmb3IgZXh0ZW5zaW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yR2VuKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7CisJCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsgLy8kTk9OLU5MUy0xJAorCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKKwkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKHRoaXMpOworCQlNZW51IG1lbnU9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOworCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7CisJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGNvbnRleHRNZW51LCBuZXcgVW53cmFwcGluZ1NlbGVjdGlvblByb3ZpZGVyKHZpZXdlcikpOworCisJCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LOworCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07CisJCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKKwkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgY2FsbGVkIHRvIGxvYWQgYSByZXNvdXJjZSBpbnRvIHRoZSBlZGl0aW5nIGRvbWFpbidzIHJlc291cmNlIHNldCBiYXNlZCBvbiB0aGUgZWRpdG9yJ3MgaW5wdXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlTW9kZWwoKSB7CisJCVVSSSByZXNvdXJjZVVSSSA9IEVkaXRVSVV0aWwuZ2V0VVJJKGdldEVkaXRvcklucHV0KCkpOworCQlFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworCQl0cnkgeworCQkJLy8gTG9hZCB0aGUgcmVzb3VyY2UgdGhyb3VnaCB0aGUgZWRpdGluZyBkb21haW4uCisJCQkvLworCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIHRydWUpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZXhjZXB0aW9uID0gZTsKKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCBmYWxzZSk7CisJCX0KKworCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKTsKKwkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7CisJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsICBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCX0KKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBkaWFnbm9zdGljIGRlc2NyaWJpbmcgdGhlIGVycm9ycyBhbmQgd2FybmluZ3MgbGlzdGVkIGluIHRoZSByZXNvdXJjZQorCSAqIGFuZCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiAoaWYgYW55KS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGlhZ25vc3RpYyBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhSZXNvdXJjZSByZXNvdXJjZSwgRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQlpZiAoIXJlc291cmNlLmdldEVycm9ycygpLmlzRW1wdHkoKSB8fCAhcmVzb3VyY2UuZ2V0V2FybmluZ3MoKS5pc0VtcHR5KCkpIHsKKwkJCUJhc2ljRGlhZ25vc3RpYyBiYXNpY0RpYWdub3N0aWMgPQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMKKwkJCQkJKERpYWdub3N0aWMuRVJST1IsCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmVkaXRvciIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJIDAsCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksIC8vJE5PTi1OTFMtMSQKKwkJCQkJIG5ldyBPYmplY3QgW10geyBleGNlcHRpb24gPT0gbnVsbCA/IChPYmplY3QpcmVzb3VyY2UgOiBleGNlcHRpb24gfSk7CisJCQliYXNpY0RpYWdub3N0aWMubWVyZ2UoRWNvcmVVdGlsLmNvbXB1dGVEaWFnbm9zdGljKHJlc291cmNlLCB0cnVlKSk7CisJCQlyZXR1cm4gYmFzaWNEaWFnbm9zdGljOworCQl9CisJCWVsc2UgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQlyZXR1cm4KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5lZGl0b3IiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCSBuZXcgT2JqZWN0W10geyBleGNlcHRpb24gfSk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gRGlhZ25vc3RpYy5PS19JTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gaW5zdGFsbCB5b3VyIG93biBjb250cm9scy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQgTk9UCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3JlYXRlUGFnZXMoKSB7CisJCS8vIENyZWF0ZXMgdGhlIG1vZGVsIGZyb20gdGhlIGVkaXRvciBpbnB1dAorCQkvLworCQljcmVhdGVNb2RlbCgpOworCisJCS8vIE9ubHkgY3JlYXRlcyB0aGUgb3RoZXIgcGFnZXMgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGVkaXRlZAorCQkvLworCQlpZiAoIWdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJLy8gQ3JlYXRlIGEgcGFnZSBmb3IgdGhlIHNlbGVjdGlvbiB0cmVlIHZpZXcuCisJCQkvLworCQkJVHJlZSB0cmVlID0gbmV3IFRyZWUoZ2V0Q29udGFpbmVyKCksIFNXVC5NVUxUSSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKKwkJCXNldEN1cnJlbnRWaWV3ZXIoc2VsZWN0aW9uVmlld2VyKTsKKworCQkJc2VsZWN0aW9uVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCS8vc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKworCQkJbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcihzZWxlY3Rpb25WaWV3ZXIuZ2V0VHJlZSgpLCBhZGFwdGVyRmFjdG9yeSk7CisKKwkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHNlbGVjdGlvblZpZXdlcik7CisJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh0cmVlKTsKKwkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCSBzZXRBY3RpdmVQYWdlKDApOworCQkJCQkgfQorCQkJCSB9KTsKKwkJfQorCisJCS8vIEVuc3VyZXMgdGhhdCB0aGlzIGVkaXRvciB3aWxsIG9ubHkgZGlzcGxheSB0aGUgcGFnZSdzIHRhYgorCQkvLyBhcmVhIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHBhZ2UKKwkJLy8KKwkJZ2V0Q29udGFpbmVyKCkuYWRkQ29udHJvbExpc3RlbmVyCisJCQkobmV3IENvbnRyb2xBZGFwdGVyKCkgeworCQkJCWJvb2xlYW4gZ3VhcmQgPSBmYWxzZTsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsKKwkJCQkJaWYgKCFndWFyZCkgeworCQkJCQkJZ3VhcmQgPSB0cnVlOworCQkJCQkJaGlkZVRhYnMoKTsKKwkJCQkJCWd1YXJkID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkgfSk7CisKKwkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkgfQorCQkJIH0pOworCX0gLy8gY3JlYXRlUGFnZXMKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gaW5zdGFsbCB5b3VyIG93biBjb250cm9scy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwkvL0BPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VzR2VuKCkgeworCQkvLyBDcmVhdGVzIHRoZSBtb2RlbCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQKKwkJLy8KKwkJY3JlYXRlTW9kZWwoKTsKKworCQkvLyBPbmx5IGNyZWF0ZXMgdGhlIG90aGVyIHBhZ2VzIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBlZGl0ZWQKKwkJLy8KKwkJaWYgKCFnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCS8vIENyZWF0ZSBhIHBhZ2UgZm9yIHRoZSBzZWxlY3Rpb24gdHJlZSB2aWV3LgorCQkJLy8KKwkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGdldENvbnRhaW5lcigpLCBTV1QuTVVMVEkpOworCQkJc2VsZWN0aW9uVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7CisJCQlzZXRDdXJyZW50Vmlld2VyKHNlbGVjdGlvblZpZXdlcik7CisKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCisJCQluZXcgQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yKHNlbGVjdGlvblZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsKKworCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Ioc2VsZWN0aW9uVmlld2VyKTsKKwkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHRyZWUpOworCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkCisKKwkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJIHNldEFjdGl2ZVBhZ2UoMCk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJLy8gRW5zdXJlcyB0aGF0IHRoaXMgZWRpdG9yIHdpbGwgb25seSBkaXNwbGF5IHRoZSBwYWdlJ3MgdGFiCisJCS8vIGFyZWEgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgcGFnZQorCQkvLworCQlnZXRDb250YWluZXIoKS5hZGRDb250cm9sTGlzdGVuZXIKKwkJCShuZXcgQ29udHJvbEFkYXB0ZXIoKSB7CisJCQkJYm9vbGVhbiBndWFyZCA9IGZhbHNlOworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBldmVudCkgeworCQkJCQlpZiAoIWd1YXJkKSB7CisJCQkJCQlndWFyZCA9IHRydWU7CisJCQkJCQloaWRlVGFicygpOworCQkJCQkJZ3VhcmQgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCSB9KTsKKworCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOworCQkJCSB9CisJCQkgfSk7CisJfQorCisJCisJLyoqCisJICogSWYgdGhlcmUgaXMganVzdCBvbmUgcGFnZSBpbiB0aGUgbXVsdGktcGFnZSBlZGl0b3IgcGFydCwKKwkgKiB0aGlzIGhpZGVzIHRoZSBzaW5nbGUgdGFiIGF0IHRoZSBib3R0b20uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGlkZVRhYnMoKSB7CisJCWlmIChnZXRQYWdlQ291bnQoKSA8PSAxKSB7CisJCQlzZXRQYWdlVGV4dCgwLCAiIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsKKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodCgxKTsKKwkJCQlQb2ludCBwb2ludCA9IGdldENvbnRhaW5lcigpLmdldFNpemUoKTsKKwkJCQlnZXRDb250YWluZXIoKS5zZXRTaXplKHBvaW50LngsIHBvaW50LnkgKyA2KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGFnZSBpbiB0aGUgbXVsdGktcGFnZSBlZGl0b3IgcGFydCwKKwkgKiB0aGlzIHNob3dzIHRoZSB0YWJzIGF0IHRoZSBib3R0b20uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2hvd1RhYnMoKSB7CisJCWlmIChnZXRQYWdlQ291bnQoKSA+IDEpIHsKKwkJCXNldFBhZ2VUZXh0KDAsIGdldFN0cmluZygiX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsKKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodChTV1QuREVGQVVMVCk7CisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7CisJCQkJZ2V0Q29udGFpbmVyKCkuc2V0U2l6ZShwb2ludC54LCBwb2ludC55IC0gNik7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHVzZWQgdG8gdHJhY2sgdGhlIGFjdGl2ZSB2aWV3ZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgcGFnZUluZGV4KSB7CisJCXN1cGVyLnBhZ2VDaGFuZ2UocGFnZUluZGV4KTsKKworCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsKKwkJCWhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKGNvbnRlbnRPdXRsaW5lUGFnZS5nZXRTZWxlY3Rpb24oKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGhvdyB0aGUgZnJhbWV3b3JrIGRldGVybWluZXMgd2hpY2ggaW50ZXJmYWNlcyB3ZSBpbXBsZW1lbnQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKKwkJaWYgKGtleS5lcXVhbHMoSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcykpIHsKKwkJCXJldHVybiBzaG93T3V0bGluZVZpZXcoKSA/IGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIDogbnVsbDsKKwkJfQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykpIHsKKwkJCXJldHVybiBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOworCQl9CisJCWVsc2UgaWYgKGtleS5lcXVhbHMoSUdvdG9NYXJrZXIuY2xhc3MpKSB7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGtleSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIGNvbnRlbnQgb3V0bGluZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElDb250ZW50T3V0bGluZVBhZ2UgZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgeworCQlpZiAoY29udGVudE91dGxpbmVQYWdlID09IG51bGwpIHsKKwkJCS8vIFRoZSBjb250ZW50IG91dGxpbmUgaXMganVzdCBhIHRyZWUuCisJCQkvLworCQkJY2xhc3MgTXlDb250ZW50T3V0bGluZVBhZ2UgZXh0ZW5kcyBDb250ZW50T3V0bGluZVBhZ2UgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQkJCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyID0gZ2V0VHJlZVZpZXdlcigpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisKKwkJCQkJLy8gU2V0IHVwIHRoZSB0cmVlIHZpZXdlci4KKwkJCQkJLy8KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKworCQkJCQkvLyBNYWtlIHN1cmUgb3VyIHBvcHVwcyB3b3JrLgorCQkJCQkvLworCQkJCQljcmVhdGVDb250ZXh0TWVudUZvcihjb250ZW50T3V0bGluZVZpZXdlcik7CisKKwkJCQkJaWYgKCFlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCSAgLy8gU2VsZWN0IHRoZSByb290IG9iamVjdCBpbiB0aGUgdmlldy4KKwkJCQkJICAvLworCQkJCQkgIGNvbnRlbnRPdXRsaW5lVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBtYWtlQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyKSB7CisJCQkJCXN1cGVyLm1ha2VDb250cmlidXRpb25zKG1lbnVNYW5hZ2VyLCB0b29sQmFyTWFuYWdlciwgc3RhdHVzTGluZU1hbmFnZXIpOworCQkJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyID0gc3RhdHVzTGluZU1hbmFnZXI7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisJCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7CisJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOworCQkJCX0KKwkJCX0KKworCQkJY29udGVudE91dGxpbmVQYWdlID0gbmV3IE15Q29udGVudE91dGxpbmVQYWdlKCk7CisKKwkJCS8vIExpc3RlbiB0byBzZWxlY3Rpb24gc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGl0IGlzIGEgc3BlY2lhbCB3YXkuCisJCQkvLworCQkJY29udGVudE91dGxpbmVQYWdlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgorCQkJCShuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCQkJIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGhhbmRsZSBzZWxlY3Rpb25zIGNvcnJlY3RseS4KKwkJCQkJIC8vCisJCQkJCSBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCQkJIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKKwkJCQkJIH0KKwkJCQkgfSk7CisJCX0KKworCQlyZXR1cm4gY29udGVudE91dGxpbmVQYWdlOworCX0KKworCS8qKgorCSAqIFRoaXMgYWNjZXNzZXMgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUgcHJvcGVydHkgc2hlZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElQcm9wZXJ0eVNoZWV0UGFnZSBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKKwkJaWYgKHByb3BlcnR5U2hlZXRQYWdlID09IG51bGwpIHsKKwkJCXByb3BlcnR5U2hlZXRQYWdlID0KKwkJCQluZXcgRXh0ZW5kZWRQcm9wZXJ0eVNoZWV0UGFnZShlZGl0aW5nRG9tYWluKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihMaXN0PD8+IHNlbGVjdGlvbikgeworCQkJCQkJU2VxdWVuY2VyRWRpdG9yLnRoaXMuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0aW9uKTsKKwkJCQkJCVNlcXVlbmNlckVkaXRvci50aGlzLnNldEZvY3VzKCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisJCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7CisJCQkJCX0KKwkJCQl9OworCQkJcHJvcGVydHlTaGVldFBhZ2Uuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJfQorCisJCXJldHVybiBwcm9wZXJ0eVNoZWV0UGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGRlYWxzIHdpdGggaG93IHdlIHdhbnQgc2VsZWN0aW9uIGluIHRoZSBvdXRsaW5lciB0byBhZmZlY3QgdGhlIG90aGVyIHZpZXdzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWlmIChzZWxlY3Rpb25WaWV3ZXIgIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJSXRlcmF0b3I8Pz4gc2VsZWN0ZWRFbGVtZW50cyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5pdGVyYXRvcigpOworCQkJaWYgKHNlbGVjdGVkRWxlbWVudHMuaGFzTmV4dCgpKSB7CisJCQkJLy8gR2V0IHRoZSBmaXJzdCBzZWxlY3RlZCBlbGVtZW50LgorCQkJCS8vCisJCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHMubmV4dCgpOworCisJCQkJQXJyYXlMaXN0PE9iamVjdD4gc2VsZWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudCk7CisJCQkJd2hpbGUgKHNlbGVjdGVkRWxlbWVudHMuaGFzTmV4dCgpKSB7CisJCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudHMubmV4dCgpKTsKKwkJCQl9CisKKwkJCQkvLyBTZXQgdGhlIHNlbGVjdGlvbiB0byB0aGUgd2lkZ2V0LgorCQkJCS8vCisJCQkJc2VsZWN0aW9uVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb25MaXN0KSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHRlc3RzIHRoZSBjb21tYW5kIHN0YWNrLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7CisJCXJldHVybiAoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLmlzU2F2ZU5lZWRlZCgpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSUVkaXRvclBhcnR9IGFuZCBzaW1wbHkgc2F2ZXMgdGhlIG1vZGVsIGZpbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisJCS8vIFNhdmUgb25seSByZXNvdXJjZXMgdGhhdCBoYXZlIGFjdHVhbGx5IGNoYW5nZWQuCisJCS8vCisJCWZpbmFsIE1hcDxPYmplY3QsIE9iamVjdD4gc2F2ZU9wdGlvbnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKKwkJc2F2ZU9wdGlvbnMucHV0KFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRCwgUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOworCisJCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtiZW5jaC4KKwkJLy8KKwkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9CisJCQluZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgeworCQkJCS8vIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IGdldHMgaW52b2tlZCB3aGVuIHRoZSBvcGVyYXRpb24gcnVucy4KKwkJCQkvLworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJCS8vIFNhdmUgdGhlIHJlc291cmNlcyB0byB0aGUgZmlsZSBzeXN0ZW0uCisJCQkJCS8vCisJCQkJCWJvb2xlYW4gZmlyc3QgPSB0cnVlOworCQkJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKSB7CisJCQkJCQlpZiAoKGZpcnN0IHx8ICFyZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSB8fCBpc1BlcnNpc3RlZChyZXNvdXJjZSkpICYmICFlZGl0aW5nRG9tYWluLmlzUmVhZE9ubHkocmVzb3VyY2UpKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJbG9uZyB0aW1lU3RhbXAgPSByZXNvdXJjZS5nZXRUaW1lU3RhbXAoKTsKKwkJCQkJCQkJcmVzb3VyY2Uuc2F2ZShzYXZlT3B0aW9ucyk7CisJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUaW1lU3RhbXAoKSAhPSB0aW1lU3RhbXApIHsKKwkJCQkJCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCQkJCQkJfQorCQkJCQkJCWZpcnN0ID0gZmFsc2U7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9OworCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisJCXRyeSB7CisJCQkvLyBUaGlzIHJ1bnMgdGhlIG9wdGlvbnMsIGFuZCBzaG93cyBwcm9ncmVzcy4KKwkJCS8vCisJCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7CisKKwkJCS8vIFJlZnJlc2ggdGhlIG5lY2Vzc2FyeSBzdGF0ZS4KKwkJCS8vCisJCQkoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLnNhdmVJc0RvbmUoKTsKKwkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgdGhhdCBzaG91bGRuJ3QuCisJCQkvLworCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHdoZXRoZXIgc29tZXRoaW5nIGhhcyBiZWVuIHBlcnNpc3RlZCB0byB0aGUgVVJJIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisJICogVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIFVSSSBjb252ZXJ0ZXIgZnJvbSB0aGUgZWRpdG9yJ3MgcmVzb3VyY2Ugc2V0IHRvIHRyeSB0byBvcGVuIGFuIGlucHV0IHN0cmVhbS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzUGVyc2lzdGVkKFJlc291cmNlIHJlc291cmNlKSB7CisJCXJldHVybiBpc1BlcnNpc3RlZEdlbihyZXNvdXJjZSk7CisvLwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKy8vCQl0cnkgeworLy8JCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0ocmVzb3VyY2UuZ2V0VVJJKCkpOworLy8JCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKKy8vCQkJCXJlc3VsdCA9IHRydWU7CisvLwkJCQlzdHJlYW0uY2xvc2UoKTsKKy8vCQkJfQorLy8JCX0KKy8vCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgeworLy8JCQkvLyBub3RoaW5nCisvLwkJfQorLy8JCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHdoZXRoZXIgc29tZXRoaW5nIGhhcyBiZWVuIHBlcnNpc3RlZCB0byB0aGUgVVJJIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisJICogVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIFVSSSBjb252ZXJ0ZXIgZnJvbSB0aGUgZWRpdG9yJ3MgcmVzb3VyY2Ugc2V0IHRvIHRyeSB0byBvcGVuIGFuIGlucHV0IHN0cmVhbS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNQZXJzaXN0ZWRHZW4oUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbShyZXNvdXJjZS5nZXRVUkkoKSk7CisJCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKKwkJCQlyZXN1bHQgPSB0cnVlOworCQkJCXN0cmVhbS5jbG9zZSgpOworCQkJfQorCQl9CisJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBJZ25vcmUKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkvKioKKwkgKiBUaGlzIGFsd2F5cyByZXR1cm5zIHRydWUgYmVjYXVzZSBpdCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFRoaXMgYWxzbyBjaGFuZ2VzIHRoZSBlZGl0b3IncyBpbnB1dC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKKwkJU2F2ZUFzRGlhbG9nIHNhdmVBc0RpYWxvZyA9IG5ldyBTYXZlQXNEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOworCQlzYXZlQXNEaWFsb2cub3BlbigpOworCQlJUGF0aCBwYXRoID0gc2F2ZUFzRGlhbG9nLmdldFJlc3VsdCgpOworCQlpZiAocGF0aCAhPSBudWxsKSB7CisJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOworCQkJaWYgKGZpbGUgIT0gbnVsbCkgeworCQkJCWRvU2F2ZUFzKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKSwgbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVBcyhVUkkgdXJpLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKKwkJKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLnNldFVSSSh1cmkpOworCQlzZXRJbnB1dFdpdGhOb3RpZnkoZWRpdG9ySW5wdXQpOworCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOworCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9CisJCQlnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSAhPSBudWxsID8KKwkJCQlnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5nZXRQcm9ncmVzc01vbml0b3IoKSA6CisJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKKwkJZG9TYXZlKHByb2dyZXNzTW9uaXRvcik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgeworCQl0cnkgeworCQkJaWYgKG1hcmtlci5nZXRUeXBlKCkuZXF1YWxzKEVWYWxpZGF0b3IuTUFSS0VSKSkgeworCQkJCVN0cmluZyB1cmlBdHRyaWJ1dGUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKEVWYWxpZGF0b3IuVVJJX0FUVFJJQlVURSwgbnVsbCk7CisJCQkJaWYgKHVyaUF0dHJpYnV0ZSAhPSBudWxsKSB7CisJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaUF0dHJpYnV0ZSk7CisJCQkJCUVPYmplY3QgZU9iamVjdCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7CisJCQkJCWlmIChlT2JqZWN0ICE9IG51bGwpIHsKKwkJCQkJICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9ucy5zaW5nbGV0b24oZWRpdGluZ0RvbWFpbi5nZXRXcmFwcGVyKGVPYmplY3QpKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQlDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHN0YXJ0dXAuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKKwkJc2V0U2l0ZShzaXRlKTsKKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKKwkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsKKwkJc2l0ZS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7CisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJZ2V0Q29udHJvbChnZXRBY3RpdmVQYWdlKCkpLnNldEZvY3VzKCk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byByZXR1cm4gdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7CisJCXJldHVybiBlZGl0b3JTZWxlY3Rpb247CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gc2V0IHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCisJICogQ2FsbGluZyB0aGlzIHJlc3VsdCB3aWxsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQllZGl0b3JTZWxlY3Rpb24gPSBzZWxlY3Rpb247CisKKwkJZm9yIChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyIDogc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycykgeworCQkJbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOworCQl9CisJCXNldFN0YXR1c0xpbmVNYW5hZ2VyKHNlbGVjdGlvbik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZU1hbmFnZXIoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyID0gY3VycmVudFZpZXdlciAhPSBudWxsICYmIGN1cnJlbnRWaWV3ZXIgPT0gY29udGVudE91dGxpbmVWaWV3ZXIgPworCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA6IGdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOworCisJCWlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKSB7CisJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCQlDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikudG9MaXN0KCk7CisJCQkJc3dpdGNoIChjb2xsZWN0aW9uLnNpemUoKSkgeworCQkJCQljYXNlIDA6IHsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTm9PYmplY3RTZWxlY3RlZCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAxOiB7CisJCQkJCQlTdHJpbmcgdGV4dCA9IG5ldyBBZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3IoYWRhcHRlckZhY3RvcnkpLmdldFRleHQoY29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkIiwgdGV4dCkpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlkZWZhdWx0OiB7CisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQiLCBJbnRlZ2VyLnRvU3RyaW5nKGNvbGxlY3Rpb24uc2l6ZSgpKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoIiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHRoZSBwbHVnaW4ncyBwbHVnaW4ucHJvcGVydGllcyBmaWxlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQlyZXR1cm4gQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHBsdWdpbi5wcm9wZXJ0aWVzLCBtYWtpbmcgYSBzdWJzdGl0dXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEpIHsKKwkJcmV0dXJuIENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSwgbmV3IE9iamVjdCBbXSB7IHMxIH0pOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXJ9IHRvIGhlbHAgZmlsbCB0aGUgY29udGV4dCBtZW51cyB3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgRWRpdCBtZW51LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJKChJTWVudUxpc3RlbmVyKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpKS5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7CisJCXJldHVybiAoRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yKWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgeworCQlyZXR1cm4gZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3Rpb25CYXJzKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKKworCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworCisJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKKworCQlpZiAoZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSB0aGlzKSB7CisJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihudWxsKTsKKwkJfQorCisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5kaXNwb3NlKCk7CisJCX0KKworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBvdXRsaW5lIHZpZXcgc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93T3V0bGluZVZpZXcoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL1NvbHZlclByb3BlcnR5Q29tcG9zaXRlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL1NvbHZlclByb3BlcnR5Q29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxNGY4YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvU29sdmVyUHJvcGVydHlDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLy8gRGlzZWFzZU1vZGVsUHJvcGVydHlDb21wb3NpdGUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworCisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgU29sdmVyUHJvcGVydHlDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgeworCisJcHJpdmF0ZSBNYXA8U29sdmVyLCBTb2x2ZXJQcm9wZXJ0eUVkaXRvcj4gbW9kZWxNYXAgPSBuZXcgSGFzaE1hcDxTb2x2ZXIsIFNvbHZlclByb3BlcnR5RWRpdG9yPigpOworCisJcHJpdmF0ZSBTdGFja0xheW91dCBzdGFja0xheW91dCA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGNvbXBvc2l0ZQorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gc3R5bGUKKwkgKiBAcGFyYW0gcHJvamVjdFZhbGlkYXRvcgorCSAqLworCXB1YmxpYyBTb2x2ZXJQcm9wZXJ0eUNvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50LAorCQkJZmluYWwgaW50IHN0eWxlLCBmaW5hbCBTb2x2ZXJbXSBzb2x2ZXJzLAorCQkJTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvcikgeworCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKKwkJc3RhY2tMYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKTsKKwkJc2V0TGF5b3V0KHN0YWNrTGF5b3V0KTsKKworCQlMYWJlbCBsYWJlbDsKKwkJbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiU1BDMSIpKTsgLy8kTk9OLU5MUy0xJAorCQlTb2x2ZXJQcm9wZXJ0eUVkaXRvciBmaXJzdE9uZSA9IG51bGw7CisJCS8vIEFueSBkaXNlYXNlIG1vZGVscz8KKwkJaWYgKHNvbHZlcnMgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNvbHZlcnMubGVuZ3RoOyBpKyspIHsKKwkJCQlTb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXIgc3BlYSA9IChTb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXIpIFNvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkJCS5hZGFwdChzb2x2ZXJzW2ldLAorCQkJCQkJCQlTb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXIuY2xhc3MpOworCisJCQkJZmluYWwgU29sdmVyUHJvcGVydHlFZGl0b3Igc3BlID0gc3BlYQorCQkJCQkJLmNyZWF0ZVNvbHZlclByb3BlcnR5RWRpdG9yKHRoaXMsIFNXVC5OT05FLAorCQkJCQkJCQlwcm9qZWN0VmFsaWRhdG9yKTsKKworCQkJCW1vZGVsTWFwLnB1dChzb2x2ZXJzW2ldLCBzcGUpOworCQkJCWlmIChmaXJzdE9uZSA9PSBudWxsKSB7CisJCQkJCS8vIFllcworCQkJCQlmaXJzdE9uZSA9IHNwZTsKKwkJCQl9IC8vIGlmCisJCQl9IC8vIGZvciBpCisJCX0gLy8gaWYgYW55IGRpc2Vhc2UgbW9kZWxzPworCisJCXN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBmaXJzdE9uZTsKKwl9IC8vIERpc2Vhc2VNb2RlbFByb3BlcnR5Q29tcG9zaXRlCisKKwlwdWJsaWMgdm9pZCBkaXNwbGF5U29sdmVyKGZpbmFsIFNvbHZlciBzb2x2ZXIpIHsKKwkJZmluYWwgU29sdmVyUHJvcGVydHlFZGl0b3Igc3BlID0gbW9kZWxNYXAuZ2V0KHNvbHZlcik7CisJCS8vIERpZCB3ZSBmaW5kIGl0PworCQlpZiAoc3BlICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IHNwZTsKKwkJCWxheW91dCgpOworCQl9IC8vIGlmCisJCWVsc2UgeworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKE1lc3NhZ2VzLmdldFN0cmluZygiU1BDMiIpIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyBzb2x2ZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXCIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfSAvLyBkaXNwbGF5U29sdmVyCisJCisJcHVibGljIFNvbHZlciBjcmVhdGVTb2x2ZXIoKSB7CisJCVNvbHZlclByb3BlcnR5RWRpdG9yIHNwZSA9IChTb2x2ZXJQcm9wZXJ0eUVkaXRvcilzdGFja0xheW91dC50b3BDb250cm9sOworCQlyZXR1cm4gc3BlLmNyZWF0ZUFuZFBvcHVsYXRlU29sdmVyKCk7CisJfQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjaGVja1N1YmNsYXNzKCkgeworCQkvLyBEaXNhYmxlIHRoZSBjaGVjayB0aGF0IHByZXZlbnRzIHN1Yi1jbGFzc2luZyBvZiBTV1QgY29tcG9uZW50cworCX0KKworCS8qKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb21wb3NpdGUgYXJlIHZhbGlkLAorCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKKwkJcmV0dXJuICgoU29sdmVyUHJvcGVydHlFZGl0b3IpIChzdGFja0xheW91dC50b3BDb250cm9sKSkKKwkJCQkudmFsaWRhdGUoKTsKKwl9IC8vIHZhbGlkYXRlCisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7CisJCXJldHVybiAoKFNvbHZlclByb3BlcnR5RWRpdG9yKSAoc3RhY2tMYXlvdXQudG9wQ29udHJvbCkpCisJCQkJLmdldEVycm9yTWVzc2FnZSgpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBzb2x2ZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBwb3B1bGF0ZVNvbHZlcihTb2x2ZXIgc29sdmVyKSB7CisJCSgoU29sdmVyUHJvcGVydHlFZGl0b3IpIChzdGFja0xheW91dC50b3BDb250cm9sKSkKKwkJCQkucG9wdWxhdGUoc29sdmVyKTsKKwl9IC8vIHBvcHVsYXRlU29sdmVyCisKK30gLy8gU29sdmVyUHJvcGVydHlDb21wb3NpdGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvU29sdmVyUHJvcGVydHlFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvU29sdmVyUHJvcGVydHlFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzcxOWFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlci9Tb2x2ZXJQcm9wZXJ0eUVkaXRvci5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworYWJzdHJhY3QgcHVibGljIGNsYXNzIFNvbHZlclByb3BlcnR5RWRpdG9yIGV4dGVuZHMgQ29tcG9zaXRlIHsKKworCS8qKgorCSAqIEBwYXJhbSBmZWF0dXJlCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmVhdHVyZSBpcyBhIGR1YmxpbiBjb3JlIGZlYXR1cmUgCisJICogdGhhdCBpcyBzcGVjaWZpZWQgYnkgYSB1c2VyLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VzZXJTcGVjaWZpZWRTb2x2ZXJQcm9wZXJ0eShmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisJCWZpbmFsIEVDbGFzcyBjb250YWluaW5nQ2xhc3MgPSBmZWF0dXJlLmdldEVDb250YWluaW5nQ2xhc3MoKTsKKwkJLy8gSXMgaXQgYSBkaXNlYXNlIG1vZGVsIHByb3BlcnR5PworCQlpZiAoY29udGFpbmluZ0NsYXNzLmVxdWFscyhTb2x2ZXJQYWNrYWdlLmVJTlNUQU5DRS5nZXRTb2x2ZXIoKSkKKwkJCQl8fCBjb250YWluaW5nQ2xhc3MuZ2V0RUFsbFN1cGVyVHlwZXMoKS5jb250YWlucygKKwkJCQkJCVNvbHZlclBhY2thZ2UuZUlOU1RBTkNFLmdldFNvbHZlcigpKSkgeworCQkJcmV0VmFsdWUgPSB0cnVlOworCQl9IC8vIGlmIGEgZGlzZWFzZSBtb2RlbCBwcm9wZXJ0eQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBpc1VzZXJTcGVjaWZpZWREaXNlYXNlTW9kZWxQcm9wZXJ0eQorCisJLyoqCisJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHlEZWZhdWx0VmFsdWVTdHJpbmcoZmluYWwgSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQlTdHJpbmcgcmV0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQorCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGRlc2NyaXB0b3IKKwkJCQkuZ2V0RmVhdHVyZShudWxsKTsKKwkKKwkJc3dpdGNoIChmZWF0dXJlLmdldEZlYXR1cmVJRCgpKSB7CisJCS8vIEFueSBzcGVjaWFsIGhhbmRsaW5nIGhlcmUuLi4KKwkJCWRlZmF1bHQ6CisJCQkJcmV0VmFsdWUgPSBmZWF0dXJlLmdldERlZmF1bHRWYWx1ZUxpdGVyYWwoKTsKKwkJCQlyZXRWYWx1ZSA9IHJldFZhbHVlID09IG51bGwgPyAiIiA6IHJldFZhbHVlOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCX0gLy8gc3dpdGNoCisJCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldFByb3BlcnR5RGVmYXVsdFZhbHVlU3RyaW5nCisJCisJcHJvdGVjdGVkIGZpbmFsIE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIFRleHQ+IG1hcCA9IG5ldyBIYXNoTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgVGV4dD4oKTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTWVzc2FnZTsKKworCXB1YmxpYyBTb2x2ZXJQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKKwkJc3VwZXIocGFyZW50LHN0eWxlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBwb3B1bGF0ZShTb2x2ZXIgc29sdmVyKSB7CisJCS8vIE5vdGhpbmcgdG8gZG8gaGVyZSBzaW5jZSB0aGVyZSBhcmUgbm8gY29tbW9uIHNvbHZlciBhdHRyaWJ1dGVzIHJpZ2h0IG5vdworCX0KKworCS8qKgorCSAqIENyZWF0ZSB0aGUgc29sdmVyIGluc3RhbmNlIGZyb20gZm9ybSBkYXRhCisJICogQHJldHVybiBTb2x2ZXIKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgU29sdmVyIGNyZWF0ZUFuZFBvcHVsYXRlU29sdmVyKCk7CisJCisJCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyB2YWxpZGF0ZQorCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNoZWNrU3ViY2xhc3MoKSB7CisJCS8vIERpc2FibGUgdGhlIGNoZWNrIHRoYXQgcHJldmVudHMgc3ViLWNsYXNzaW5nIG9mIFNXVCBjb21wb25lbnRzCisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZSB0aGF0IGRlc2NyaWJlcyB0aGUgcHJvYmxlbSB3aXRoIHRoZSBjb250ZW50cworCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgeworCQlyZXR1cm4gZXJyb3JNZXNzYWdlOworCX0KK30gLy8gU29sdmVyUHJvcGVydHlFZGl0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL1NvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NzAxZjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL1NvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlcjsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwKKwkJaW1wbGVtZW50cyBBZGFwdGVyIHsKKworCWFic3RyYWN0IHB1YmxpYyBTb2x2ZXJQcm9wZXJ0eUVkaXRvciBjcmVhdGVTb2x2ZXJQcm9wZXJ0eUVkaXRvcigKKwkJCVNvbHZlclByb3BlcnR5Q29tcG9zaXRlIHNvbHZlclByb3BlcnR5Q29tcG9zaXRlLAorCQkJaW50IHN0eWxlLCBNb2RpZnlMaXN0ZW5lciBwcm9qZWN0VmFsaWRhdG9yKTsKK30gLy8gU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL1NvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiODEyMTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL1NvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM0IEBACisvLyBEaXNlYXNlTW9kZWxQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CisKKy8qKgorICoKKyAqLworcHVibGljIGludGVyZmFjZSBTb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5IHsKKworCVNvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnlJbXBsIElOU1RBTkNFID0gbmV3IFNvbHZlclByb3BlcnR5RWRpdG9yQWRhcHRlckZhY3RvcnlJbXBsKCk7CisKKwlwdWJsaWMgY2xhc3MgU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyRmFjdG9yeUltcGwgZXh0ZW5kcworCQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzCisJCQlTb2x2ZXJQcm9wZXJ0eUVkaXRvckFkYXB0ZXJGYWN0b3J5IHsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQkJcmV0dXJuIHR5cGUgPT0gU29sdmVyUHJvcGVydHlFZGl0b3JBZGFwdGVyLmNsYXNzOworCQl9CisKKwl9IAorfSAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvcHJlc2VudGF0aW9uL1NvbHZlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL3ByZXNlbnRhdGlvbi9Tb2x2ZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNzBmY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvc29sdmVyL3ByZXNlbnRhdGlvbi9Tb2x2ZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCkBAIC0wLDAgKzEsNDM2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIucHJlc2VudGF0aW9uOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db250cm9sQWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJDb250cmlidXRpb25JdGVtOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcmVzZW50YXRpb24uQ29yZUVkaXRvclBsdWdpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGFjdGlvbiBiYXIgY29udHJpYnV0b3IgZm9yIHRoZSBTb2x2ZXIgbW9kZWwgZWRpdG9yLg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTb2x2ZXJBY3Rpb25CYXJDb250cmlidXRvcg0KKwlleHRlbmRzIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcg0KKwlpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgew0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGVkaXRvci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3JQYXJ0Ow0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gcHJvdmlkZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOw0KKw0KKwkvKioNCisJICogVGhpcyBhY3Rpb24gb3BlbnMgdGhlIFByb3BlcnRpZXMgdmlldy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJQWN0aW9uIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbiA9DQorCQluZXcgQWN0aW9uKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbSIpKSAvLyROT04tTkxTLTEkDQorCQl7DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQl0cnkgew0KKwkJCQkJZ2V0UGFnZSgpLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7IC8vJE5PTi1OTFMtMSQNCisJCQkJfQ0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJCQlDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJCQl9DQorCQkJfQ0KKwkJfTsNCisNCisJLyoqDQorCSAqIFRoaXMgYWN0aW9uIHJlZnJlc2hlcyB0aGUgdmlld2VyIG9mIHRoZSBjdXJyZW50IGVkaXRvciBpZiB0aGUgZWRpdG9yDQorCSAqIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcn0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUFjdGlvbiByZWZyZXNoVmlld2VyQWN0aW9uID0NCisJCW5ldyBBY3Rpb24oQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbSIpKSAvLyROT04tTkxTLTEkDQorCQl7DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgew0KKwkJCQlyZXR1cm4gYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcjsNCisJCQl9DQorDQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQlpZiAoYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgew0KKwkJCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldFZpZXdlcigpOw0KKwkJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7DQorCQkJCQkJdmlld2VyLnJlZnJlc2goKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX07DQorDQorCS8qKg0KKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gY29ycmVzcG9uZGluZyB0byBlYWNoIGRlc2NyaXB0b3INCisJICogZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBjcmVhdGVDaGlsZEFjdGlvbnM7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZUNoaWxkIGFjdGlvbnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcg0KKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZVNpYmxpbmdBY3Rpb25zOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlIGFkZGVkIGZvciBDcmVhdGVTaWJsaW5nIGFjdGlvbnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgY29udHJpYnV0b3IuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU29sdmVyQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7DQorCQlzdXBlcihBRERJVElPTlNfTEFTVF9TVFlMRSk7DQorCQlsb2FkUmVzb3VyY2VBY3Rpb24gPSBuZXcgTG9hZFJlc291cmNlQWN0aW9uKCk7DQorCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBWYWxpZGF0ZUFjdGlvbigpOw0KKwkJY29udHJvbEFjdGlvbiA9IG5ldyBDb250cm9sQWN0aW9uKCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBTZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zIHRvIHRoZSB0b29sIGJhci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgew0KKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInNvbHZlci1zZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJA0KKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInNvbHZlci1hZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHRvIHRoZSBtZW51IGJhciBhIG1lbnUgYW5kIHNvbWUgc2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucywNCisJICogYXMgd2VsbCBhcyB0aGUgc3ViLW1lbnVzIGZvciBvYmplY3QgY3JlYXRpb24gaXRlbXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsNCisJCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudU1hbmFnZXIpOw0KKw0KKwkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU29sdmVyRWRpdG9yX21lbnUiKSwgIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXJNZW51SUQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkDQorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigic2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQNCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhY3Rpb25zIikpOyAvLyROT04tTkxTLTEkDQorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkDQorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsgLy8kTk9OLU5MUy0xJA0KKw0KKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlQ2hpbGQgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLg0KKwkJLy8NCisJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQNCisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQNCisNCisJCS8vIFByZXBhcmUgZm9yIENyZWF0ZVNpYmxpbmcgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLg0KKwkJLy8NCisJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkDQorCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQNCisNCisJCS8vIEZvcmNlIGFuIHVwZGF0ZSBiZWNhdXNlIEVjbGlwc2UgaGlkZXMgZW1wdHkgbWVudXMgbm93Lg0KKwkJLy8NCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcg0KKwkJCShuZXcgSU1lbnVMaXN0ZW5lcigpIHsNCisJCQkJIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsNCisJCQkJCSBtZW51TWFuYWdlci51cGRhdGVBbGwodHJ1ZSk7DQorCQkJCSB9DQorCQkJIH0pOw0KKw0KKwkJYWRkR2xvYmFsQWN0aW9ucyhzdWJtZW51TWFuYWdlcik7DQorCX0NCisNCisJLyoqDQorCSAqIFdoZW4gdGhlIGFjdGl2ZSBlZGl0b3IgY2hhbmdlcywgdGhpcyByZW1lbWJlcnMgdGhlIGNoYW5nZSBhbmQgcmVnaXN0ZXJzIHdpdGggaXQgYXMgYSBzZWxlY3Rpb24gcHJvdmlkZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHBhcnQpIHsNCisJCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihwYXJ0KTsNCisJCWFjdGl2ZUVkaXRvclBhcnQgPSBwYXJ0Ow0KKw0KKwkJLy8gU3dpdGNoIHRvIHRoZSBuZXcgc2VsZWN0aW9uIHByb3ZpZGVyLg0KKwkJLy8NCisJCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7DQorCQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOw0KKwkJfQ0KKwkJaWYgKHBhcnQgPT0gbnVsbCkgew0KKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsNCisJCX0NCisJCWVsc2Ugew0KKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gcGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsNCisJCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7DQorDQorCQkJLy8gRmFrZSBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IHRvIHVwZGF0ZSB0aGUgbWVudXMuDQorCQkJLy8NCisJCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkgew0KKwkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKSk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn0sDQorCSAqIGhhbmRsaW5nIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH1zIGJ5IHF1ZXJ5aW5nIGZvciB0aGUgY2hpbGRyZW4gYW5kIHNpYmxpbmdzDQorCSAqIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZWxlY3RlZCBvYmplY3QgYW5kIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7DQorCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uDQorCQkvLw0KKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgew0KKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7DQorCQl9DQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsNCisJCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsNCisJCX0NCisNCisJCS8vIFF1ZXJ5IHRoZSBuZXcgc2VsZWN0aW9uIGZvciBhcHByb3ByaWF0ZSBuZXcgY2hpbGQvc2libGluZyBkZXNjcmlwdG9ycw0KKwkJLy8NCisJCUNvbGxlY3Rpb248Pz4gbmV3Q2hpbGREZXNjcmlwdG9ycyA9IG51bGw7DQorCQlDb2xsZWN0aW9uPD8+IG5ld1NpYmxpbmdEZXNjcmlwdG9ycyA9IG51bGw7DQorDQorCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOw0KKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5zaXplKCkgPT0gMSkgew0KKwkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7DQorDQorCQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpYWN0aXZlRWRpdG9yUGFydCkuZ2V0RWRpdGluZ0RvbWFpbigpOw0KKw0KKwkJCW5ld0NoaWxkRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhvYmplY3QsIG51bGwpOw0KKwkJCW5ld1NpYmxpbmdEZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG51bGwsIG9iamVjdCk7DQorCQl9DQorDQorCQkvLyBHZW5lcmF0ZSBhY3Rpb25zIGZvciBzZWxlY3Rpb247IHBvcHVsYXRlIGFuZCByZWRyYXcgdGhlIG1lbnVzLg0KKwkJLy8NCisJCWNyZWF0ZUNoaWxkQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKG5ld0NoaWxkRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7DQorCQljcmVhdGVTaWJsaW5nQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMobmV3U2libGluZ0Rlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOw0KKw0KKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgew0KKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOw0KKwkJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7DQorCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOw0KKwkJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwNCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7DQorCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgew0KKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgew0KKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlQ2hpbGRBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIGFjdGlvbnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LA0KKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJQ29sbGVjdGlvbjxJQWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOw0KKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsNCisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsNCisJCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIGFjdGlvbnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gd2l0aCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cw0KKwkgKiBiYXNlZCBvbiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLA0KKwkgKiBieSBpbnNlcnRpbmcgdGhlbSBiZWZvcmUgdGhlIHNwZWNpZmllZCBjb250cmlidXRpb24gaXRlbSA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4uDQorCSAqIElmIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgc2ltcGx5IGFkZGVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248PyBleHRlbmRzIElBY3Rpb24+IGFjdGlvbnMsIFN0cmluZyBjb250cmlidXRpb25JRCkgew0KKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgew0KKwkJCWZvciAoSUFjdGlvbiBhY3Rpb24gOiBhY3Rpb25zKSB7DQorCQkJCWlmIChjb250cmlidXRpb25JRCAhPSBudWxsKSB7DQorCQkJCQltYW5hZ2VyLmluc2VydEJlZm9yZShjb250cmlidXRpb25JRCwgYWN0aW9uKTsNCisJCQkJfQ0KKwkJCQllbHNlIHsNCisJCQkJCW1hbmFnZXIuYWRkKGFjdGlvbik7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCX0NCisJCQ0KKwkvKioNCisJICogVGhpcyByZW1vdmVzIGZyb20gdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMNCisJICogYmFzZWQgb24gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRlcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbGxlY3Rpb248PyBleHRlbmRzIElBY3Rpb24+IGFjdGlvbnMpIHsNCisJCWlmIChhY3Rpb25zICE9IG51bGwpIHsNCisJCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsNCisJCQkJLy8gTG9vayBpbnRvIFN1YkNvbnRyaWJ1dGlvbkl0ZW1zDQorCQkJCS8vDQorCQkJCUlDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbkl0ZW0gPSBpdGVtc1tpXTsNCisJCQkJd2hpbGUgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBTdWJDb250cmlidXRpb25JdGVtKSB7DQorCQkJCQljb250cmlidXRpb25JdGVtID0gKChTdWJDb250cmlidXRpb25JdGVtKWNvbnRyaWJ1dGlvbkl0ZW0pLmdldElubmVySXRlbSgpOw0KKwkJCQl9DQorDQorCQkJCS8vIERlbGV0ZSB0aGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbXMgd2l0aCBtYXRjaGluZyBhY3Rpb24uDQorCQkJCS8vDQorCQkJCWlmIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgew0KKwkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0QWN0aW9uKCk7DQorCQkJCQlpZiAoYWN0aW9ucy5jb250YWlucyhhY3Rpb24pKSB7DQorCQkJCQkJbWFuYWdlci5yZW1vdmUoY29udHJpYnV0aW9uSXRlbSk7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBwb3AtdXAgbWVudSBiZWZvcmUgaXQgYXBwZWFycy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7DQorCQlzdXBlci5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOw0KKwkJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBudWxsOw0KKw0KKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQNCisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsNCisJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZWRpdCIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJA0KKw0KKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJA0KKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7DQorCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbnNlcnRzIGdsb2JhbCBhY3Rpb25zIGJlZm9yZSB0aGUgImFkZGl0aW9ucy1lbmQiIHNlcGFyYXRvci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRHbG9iYWxBY3Rpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgew0KKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucy1lbmQiLCBuZXcgU2VwYXJhdG9yKCJ1aS1hY3Rpb25zIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uKTsgLy8kTk9OLU5MUy0xJA0KKw0KKwkJcmVmcmVzaFZpZXdlckFjdGlvbi5zZXRFbmFibGVkKHJlZnJlc2hWaWV3ZXJBY3Rpb24uaXNFbmFibGVkKCkpOwkJDQorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHJlZnJlc2hWaWV3ZXJBY3Rpb24pOyAvLyROT04tTkxTLTEkDQorDQorCQlzdXBlci5hZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBlbnN1cmVzIHRoYXQgYSBkZWxldGUgYWN0aW9uIHdpbGwgY2xlYW4gdXAgYWxsIHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBvYmplY3RzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUFsbFJlZmVyZW5jZXNPbkRlbGV0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvcHJlc2VudGF0aW9uL1NvbHZlckVkaXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlci9wcmVzZW50YXRpb24vU29sdmVyRWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2YTYxNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvcHJlc2VudGF0aW9uL1NvbHZlckVkaXRvci5qYXZhCkBAIC0wLDAgKzEsMTg1NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLnByZXNlbnRhdGlvbjsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZVBhZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldFBhZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5NYXJrZXJIZWxwZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVmlld2VyUGFuZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5lZGl0b3IuUHJvYmxlbUVkaXRvclBhcnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5jZWxsZWRpdG9yLkFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkxvY2FsVHJhbnNmZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuVW53cmFwcGluZ1NlbGVjdGlvblByb3ZpZGVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSU1hcmtlckhlbHBlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlVdGlsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS52aWV3LkV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIucHJvdmlkZXIuU29sdmVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByZXNlbnRhdGlvbi5Db3JlRWRpdG9yUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5wcm92aWRlci5FeHBlcmltZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlci5HcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnByb3ZpZGVyLk1vZGlmaWVySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUucHJvdmlkZXIuUHJlZGljYXRlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5wcm92aWRlci5TY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLnByb3ZpZGVyLlNlcXVlbmNlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5wcm92aWRlci5UcmlnZ2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOw0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIFNvbHZlciBtb2RlbCBlZGl0b3IuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIA0KK3B1YmxpYyBjbGFzcyBTb2x2ZXJFZGl0b3INCisJZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0DQorCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5Qcm92aWRlciwgSVNlbGVjdGlvblByb3ZpZGVyLCBJTWVudUxpc3RlbmVyLCBJVmlld2VyUHJvdmlkZXIsIElHb3RvTWFya2VyIHsNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGVkaXRpbmcgZG9tYWluIHRoYXQgaXMgdXNlZCB0byB0cmFjayBhbGwgY2hhbmdlcyB0byB0aGUgbW9kZWwuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBvbmUgYWRhcHRlciBmYWN0b3J5IHVzZWQgZm9yIHByb3ZpZGluZyB2aWV3cyBvZiB0aGUgbW9kZWwuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElDb250ZW50T3V0bGluZVBhZ2UgY29udGVudE91dGxpbmVQYWdlOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyBhIGtsdWRnZS4uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBjb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UncyB2aWV3ZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBjb250ZW50T3V0bGluZVZpZXdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIHByb3BlcnR5IHNoZWV0IHBhZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSB2aWV3ZXIgdGhhdCBzaGFkb3dzIHRoZSBzZWxlY3Rpb24gaW4gdGhlIGNvbnRlbnQgb3V0bGluZS4NCisJICogVGhlIHBhcmVudCByZWxhdGlvbiBtdXN0IGJlIGNvcnJlY3RseSBkZWZpbmVkIGZvciB0aGlzIHRvIHdvcmsuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBzZWxlY3Rpb25WaWV3ZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGludmVydHMgdGhlIHJvbGwgb2YgcGFyZW50IGFuZCBjaGlsZCBpbiB0aGUgY29udGVudCBwcm92aWRlciBhbmQgc2hvdyBwYXJlbnRzIGFzIGEgdHJlZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBUcmVlVmlld2VyIHBhcmVudFZpZXdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgc2hvd3MgaG93IGEgdHJlZSB2aWV3IHdvcmtzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgc2hvd3MgaG93IGEgbGlzdCB2aWV3IHdvcmtzLg0KKwkgKiBBIGxpc3Qgdmlld2VyIGRvZXNuJ3Qgc3VwcG9ydCBpY29ucy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMaXN0Vmlld2VyIGxpc3RWaWV3ZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIHNob3dzIGhvdyBhIHRhYmxlIHZpZXcgd29ya3MuDQorCSAqIEEgdGFibGUgY2FuIGJlIHVzZWQgYXMgYSBsaXN0IHdpdGggaWNvbnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIHNob3dzIGhvdyBhIHRyZWUgdmlldyB3aXRoIGNvbHVtbnMgd29ya3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyV2l0aENvbHVtbnM7DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgdmlld2VyIHBhbmUsIGluIHRoZSBib29rLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFZpZXdlclBhbmUgY3VycmVudFZpZXdlclBhbmU7DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgY29udGVudCB2aWV3ZXIsIHdoaWNoIG1heSBiZSBlaXRoZXIgb25lIG9mIHRoZSB2aWV3ZXJzIGluIHRoZSBwYWdlcyBvciB0aGUgY29udGVudCBvdXRsaW5lIHZpZXdlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBWaWV3ZXIgY3VycmVudFZpZXdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgbGlzdGVucyB0byB3aGljaCBldmVyIHZpZXdlciBpcyBhY3RpdmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn1zIHRoYXQgYXJlIGxpc3RlbmluZyB0byB0aGlzIGVkaXRvci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+KCk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGVkaXRvciBhcyBhIHdob2xlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElTZWxlY3Rpb24gZWRpdG9yU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsNCisNCisJLyoqDQorCSAqIFRoZSBNYXJrZXJIZWxwZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHdvcmtzcGFjZSByZXNvdXJjZSBtYXJrZXJzIHByZXNlbnRlZA0KKwkgKiBpbiBFY2xpcHNlJ3MgUHJvYmxlbXMgVmlldy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNYXJrZXJIZWxwZXIgbWFya2VySGVscGVyID0gbmV3IEVkaXRVSU1hcmtlckhlbHBlcigpOw0KKw0KKwkvKioNCisJICogVGhpcyBsaXN0ZW5zIGZvciB3aGVuIHRoZSBvdXRsaW5lIGJlY29tZXMgYWN0aXZlDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPQ0KKwkJbmV3IElQYXJ0TGlzdGVuZXIoKSB7DQorCQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7DQorCQkJCWlmIChwIGluc3RhbmNlb2YgQ29udGVudE91dGxpbmUpIHsNCisJCQkJCWlmICgoKENvbnRlbnRPdXRsaW5lKXApLmdldEN1cnJlbnRQYWdlKCkgPT0gY29udGVudE91dGxpbmVQYWdlKSB7DQorCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoU29sdmVyRWRpdG9yLnRoaXMpOw0KKw0KKwkJCQkJCXNldEN1cnJlbnRWaWV3ZXIoY29udGVudE91dGxpbmVWaWV3ZXIpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWVsc2UgaWYgKHAgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSB7DQorCQkJCQlpZiAoKChQcm9wZXJ0eVNoZWV0KXApLmdldEN1cnJlbnRQYWdlKCkgPT0gcHJvcGVydHlTaGVldFBhZ2UpIHsNCisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihTb2x2ZXJFZGl0b3IudGhpcyk7DQorCQkJCQkJaGFuZGxlQWN0aXZhdGUoKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQllbHNlIGlmIChwID09IFNvbHZlckVkaXRvci50aGlzKSB7DQorCQkJCQloYW5kbGVBY3RpdmF0ZSgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcCkgew0KKwkJCQkvLyBJZ25vcmUuDQorCQkJfQ0KKwkJCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcCkgew0KKwkJCQkvLyBJZ25vcmUuDQorCQkJfQ0KKwkJCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7DQorCQkJCS8vIElnbm9yZS4NCisJCQl9DQorCQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwKSB7DQorCQkJCS8vIElnbm9yZS4NCisJCQl9DQorCQl9Ow0KKw0KKwkvKioNCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOw0KKw0KKwkvKioNCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOw0KKw0KKwkvKioNCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHNhdmVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHNhdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsNCisNCisJLyoqDQorCSAqIE1hcCB0byBzdG9yZSB0aGUgZGlhZ25vc3RpYyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+IHJlc291cmNlVG9EaWFnbm9zdGljTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8UmVzb3VyY2UsIERpYWdub3N0aWM+KCk7DQorDQorCS8qKg0KKwkgKiBDb250cm9scyB3aGV0aGVyIHRoZSBwcm9ibGVtIGluZGljYXRpb24gc2hvdWxkIGJlIHVwZGF0ZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7DQorDQorCS8qKg0KKwkgKiBBZGFwdGVyIHVzZWQgdG8gdXBkYXRlIHRoZSBwcm9ibGVtIGluZGljYXRpb24gd2hlbiByZXNvdXJjZXMgYXJlIGRlbWFuZGVkIGxvYWRlZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFQ29udGVudEFkYXB0ZXIgcHJvYmxlbUluZGljYXRpb25BZGFwdGVyID0gDQorCQluZXcgRUNvbnRlbnRBZGFwdGVyKCkgew0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBSZXNvdXJjZSkgew0KKwkJCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJlc291cmNlLmNsYXNzKSkgew0KKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRDoNCisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19FUlJPUlM6DQorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fV0FSTklOR1M6IHsNCisJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2Upbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7DQorCQkJCQkJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBudWxsKTsNCisJCQkJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7DQorCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGRpYWdub3N0aWMpOw0KKwkJCQkJCQl9DQorCQkJCQkJCWVsc2Ugew0KKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucmVtb3ZlKHJlc291cmNlKTsNCisJCQkJCQkJfQ0KKw0KKwkJCQkJCQlpZiAodXBkYXRlUHJvYmxlbUluZGljYXRpb24pIHsNCisJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMNCisJCQkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7DQorCQkJCQkJCQkJCSB9DQorCQkJCQkJCQkJIH0pOw0KKwkJCQkJCQl9DQorCQkJCQkJCWJyZWFrOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCQllbHNlIHsNCisJCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQlAT3ZlcnJpZGUNCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7DQorCQkJCWJhc2ljU2V0VGFyZ2V0KHRhcmdldCk7DQorCQkJfQ0KKw0KKwkJCUBPdmVycmlkZQ0KKwkJCXByb3RlY3RlZCB2b2lkIHVuc2V0VGFyZ2V0KFJlc291cmNlIHRhcmdldCkgew0KKwkJCQliYXNpY1Vuc2V0VGFyZ2V0KHRhcmdldCk7DQorCQkJfQ0KKwkJfTsNCisNCisJLyoqDQorCSAqIFRoaXMgbGlzdGVucyBmb3Igd29ya3NwYWNlIGNoYW5nZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9DQorCQluZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7DQorCQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7DQorCQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsNCisJCQkJdHJ5IHsNCisJCQkJCWNsYXNzIFJlc291cmNlRGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsNCisJCQkJCQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7DQorCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOw0KKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsNCisNCisJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgew0KKwkJCQkJCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsNCisJCQkJCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCB8fA0KKwkJCQkJCQkJICAgIGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIGRlbHRhLmdldEZsYWdzKCkgIT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUykgew0KKwkJCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZGVsdGEuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKSwgZmFsc2UpOw0KKwkJCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7DQorCQkJCQkJCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgew0KKwkJCQkJCQkJCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOw0KKwkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCWVsc2UgaWYgKCFzYXZlZFJlc291cmNlcy5yZW1vdmUocmVzb3VyY2UpKSB7DQorCQkJCQkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7DQorCQkJCQkJCQkJCX0NCisJCQkJCQkJCQl9DQorCQkJCQkJCQl9DQorCQkJCQkJCX0NCisNCisJCQkJCQkJcmV0dXJuIHRydWU7DQorCQkJCQkJfQ0KKw0KKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgew0KKwkJCQkJCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlczsNCisJCQkJCQl9DQorDQorCQkJCQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlbW92ZWRSZXNvdXJjZXMoKSB7DQorCQkJCQkJCXJldHVybiByZW1vdmVkUmVzb3VyY2VzOw0KKwkJCQkJCX0NCisJCQkJCX0NCisNCisJCQkJCWZpbmFsIFJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsNCisJCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsNCisNCisJCQkJCWlmICghdmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7DQorCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYw0KKwkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkgcmVtb3ZlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkpOw0KKwkJCQkJCQkJCSBpZiAoIWlzRGlydHkoKSkgew0KKwkJCQkJCQkJCQkgZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihTb2x2ZXJFZGl0b3IudGhpcywgZmFsc2UpOw0KKwkJCQkJCQkJCSB9DQorCQkJCQkJCQkgfQ0KKwkJCQkJCQkgfSk7DQorCQkJCQl9DQorDQorCQkJCQlpZiAoIXZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgew0KKwkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMNCisJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsNCisJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJIGNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsNCisJCQkJCQkJCQkgaWYgKGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gU29sdmVyRWRpdG9yLnRoaXMpIHsNCisJCQkJCQkJCQkJIGhhbmRsZUFjdGl2YXRlKCk7DQorCQkJCQkJCQkJIH0NCisJCQkJCQkJCSB9DQorCQkJCQkJCSB9KTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQkJCX0NCisJCQl9DQorCQl9Ow0KKw0KKwkvKioNCisJICogSGFuZGxlcyBhY3RpdmF0aW9uIG9mIHRoZSBlZGl0b3Igb3IgaXQncyBhc3NvY2lhdGVkIHZpZXdzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoKSB7DQorCQkvLyBSZWNvbXB1dGUgdGhlIHJlYWQgb25seSBzdGF0ZS4NCisJCS8vDQorCQlpZiAoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKSAhPSBudWxsKSB7DQorCQkgIGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkuY2xlYXIoKTsNCisNCisJCSAgLy8gUmVmcmVzaCBhbnkgYWN0aW9ucyB0aGF0IG1heSBiZWNvbWUgZW5hYmxlZCBvciBkaXNhYmxlZC4NCisJCSAgLy8NCisJCSAgc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsNCisJCX0NCisNCisJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsNCisJCQlpZiAoaGFuZGxlRGlydHlDb25mbGljdCgpKSB7DQorCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoU29sdmVyRWRpdG9yLnRoaXMsIGZhbHNlKTsNCisJCQl9DQorCQkJZWxzZSB7DQorCQkJCXJlbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsNCisJCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOw0KKwkJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOw0KKwkJCX0NCisJCX0NCisJCWVsc2UgaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgew0KKwkJCWNoYW5nZWRSZXNvdXJjZXMucmVtb3ZlQWxsKHNhdmVkUmVzb3VyY2VzKTsNCisJCQloYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCk7DQorCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOw0KKwkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEhhbmRsZXMgd2hhdCB0byBkbyB3aXRoIGNoYW5nZWQgcmVzb3VyY2VzIG9uIGFjdGl2YXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCkgew0KKwkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSAmJiAoIWlzRGlydHkoKSB8fCBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpKSB7DQorCQkJaWYgKGlzRGlydHkoKSkgew0KKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpOw0KKwkJCX0NCisJCQllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7DQorDQorCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsNCisJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgew0KKwkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgew0KKwkJCQkJcmVzb3VyY2UudW5sb2FkKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsNCisJCQkJCX0NCisJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCQlpZiAoIXJlc291cmNlVG9EaWFnbm9zdGljTWFwLmNvbnRhaW5zS2V5KHJlc291cmNlKSkgew0KKwkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorDQorCQkJaWYgKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbi5pc1N0YWxlKGVkaXRvclNlbGVjdGlvbikpIHsNCisJCQkJc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOw0KKwkJCX0NCisNCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7DQorCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsNCisJCX0NCisJfQ0KKyAgDQorCS8qKg0KKwkgKiBVcGRhdGVzIHRoZSBwcm9ibGVtcyBpbmRpY2F0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWVkIGRpYWdub3N0aWMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpIHsNCisJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgew0KKwkJCUJhc2ljRGlhZ25vc3RpYyBkaWFnbm9zdGljID0NCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYw0KKwkJCQkJKERpYWdub3N0aWMuT0ssDQorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5lZGl0b3IiLCAvLyROT04tTkxTLTEkDQorCQkJCQkgMCwNCisJCQkJCSBudWxsLA0KKwkJCQkJIG5ldyBPYmplY3QgW10geyBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkgfSk7DQorCQkJZm9yIChEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA6IHJlc291cmNlVG9EaWFnbm9zdGljTWFwLnZhbHVlcygpKSB7DQorCQkJCWlmIChjaGlsZERpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7DQorCQkJCQlkaWFnbm9zdGljLmFkZChjaGlsZERpYWdub3N0aWMpOw0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJCWludCBsYXN0RWRpdG9yUGFnZSA9IGdldFBhZ2VDb3VudCgpIC0gMTsNCisJCQlpZiAobGFzdEVkaXRvclBhZ2UgPj0gMCAmJiBnZXRFZGl0b3IobGFzdEVkaXRvclBhZ2UpIGluc3RhbmNlb2YgUHJvYmxlbUVkaXRvclBhcnQpIHsNCisJCQkJKChQcm9ibGVtRWRpdG9yUGFydClnZXRFZGl0b3IobGFzdEVkaXRvclBhZ2UpKS5zZXREaWFnbm9zdGljKGRpYWdub3N0aWMpOw0KKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsNCisJCQkJCXNldEFjdGl2ZVBhZ2UobGFzdEVkaXRvclBhZ2UpOw0KKwkJCQl9DQorCQkJfQ0KKwkJCWVsc2UgaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7DQorCQkJCVByb2JsZW1FZGl0b3JQYXJ0IHByb2JsZW1FZGl0b3JQYXJ0ID0gbmV3IFByb2JsZW1FZGl0b3JQYXJ0KCk7DQorCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7DQorCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldE1hcmtlckhlbHBlcihtYXJrZXJIZWxwZXIpOw0KKwkJCQl0cnkgew0KKwkJCQkJYWRkUGFnZSgrK2xhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydCwgZ2V0RWRpdG9ySW5wdXQoKSk7DQorCQkJCQlzZXRQYWdlVGV4dChsYXN0RWRpdG9yUGFnZSwgcHJvYmxlbUVkaXRvclBhcnQuZ2V0UGFydE5hbWUoKSk7DQorCQkJCQlzZXRBY3RpdmVQYWdlKGxhc3RFZGl0b3JQYWdlKTsNCisJCQkJCXNob3dUYWJzKCk7DQorCQkJCX0NCisJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQlpZiAobWFya2VySGVscGVyLmhhc01hcmtlcnMoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKSkgew0KKwkJCQltYXJrZXJIZWxwZXIuZGVsZXRlTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOw0KKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsNCisJCQkJCXRyeSB7DQorCQkJCQkJbWFya2VySGVscGVyLmNyZWF0ZU1hcmtlcnMoZGlhZ25vc3RpYyk7DQorCQkJCQl9DQorCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCQlDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBTaG93cyBhIGRpYWxvZyB0aGF0IGFza3MgaWYgY29uZmxpY3RpbmcgY2hhbmdlcyBzaG91bGQgYmUgZGlzY2FyZGVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsNCisJCXJldHVybg0KKwkJCU1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uDQorCQkJCShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX0ZpbGVDb25mbGljdF9sYWJlbCIpLCAvLyROT04tTkxTLTEkDQorCQkJCSBnZXRTdHJpbmcoIl9XQVJOX0ZpbGVDb25mbGljdCIpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYSBtb2RlbCBlZGl0b3IuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU29sdmVyRWRpdG9yKCkgew0KKwkJc3VwZXIoKTsNCisJCWluaXRpYWxpemVFZGl0aW5nRG9tYWluKCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgc2V0cyB1cCB0aGUgZWRpdGluZyBkb21haW4gZm9yIHRoZSBtb2RlbCBlZGl0b3IuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWRpdGluZ0RvbWFpbigpIHsNCisJCS8vIENyZWF0ZSBhbiBhZGFwdGVyIGZhY3RvcnkgdGhhdCB5aWVsZHMgaXRlbSBwcm92aWRlcnMuDQorCQkvLw0KKwkJYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOw0KKw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRXhwZXJpbWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEdyYXBoSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RpZmllckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFByZWRpY2F0ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgVHJpZ2dlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNvbHZlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKw0KKwkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlIGV4ZWN1dGVkLg0KKwkJLy8NCisJCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOw0KKw0KKwkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gc2V0IHRoZSBtb3N0IHJlY2VudCBjb21tYW5kJ3MgYWZmZWN0ZWQgb2JqZWN0cyB0byBiZSB0aGUgc2VsZWN0aW9uIG9mIHRoZSB2aWV3ZXIgd2l0aCBmb2N1cy4NCisJCS8vDQorCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXINCisJCQkobmV3IENvbW1hbmRTdGFja0xpc3RlbmVyKCkgew0KKwkJCQkgcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgew0KKwkJCQkJIGdldENvbnRhaW5lcigpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMNCisJCQkJCQkgKG5ldyBSdW5uYWJsZSgpIHsNCisJCQkJCQkJICBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkgIGZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsNCisNCisJCQkJCQkJCSAgLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4NCisJCQkJCQkJCSAgLy8NCisJCQkJCQkJCSAgQ29tbWFuZCBtb3N0UmVjZW50Q29tbWFuZCA9ICgoQ29tbWFuZFN0YWNrKWV2ZW50LmdldFNvdXJjZSgpKS5nZXRNb3N0UmVjZW50Q29tbWFuZCgpOw0KKwkJCQkJCQkJICBpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgew0KKwkJCQkJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOw0KKwkJCQkJCQkJICB9DQorCQkJCQkJCQkgIGlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsICYmICFwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7DQorCQkJCQkJCQkJICBwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7DQorCQkJCQkJCQkgIH0NCisJCQkJCQkJICB9DQorCQkJCQkJICB9KTsNCisJCQkJIH0NCisJCQkgfSk7DQorDQorCQkvLyBDcmVhdGUgdGhlIGVkaXRpbmcgZG9tYWluIHdpdGggYSBzcGVjaWFsIGNvbW1hbmQgc3RhY2suDQorCQkvLw0KKwkJZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywgbmV3IEhhc2hNYXA8UmVzb3VyY2UsIEJvb2xlYW4+KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIGhlcmUgZm9yIHRoZSBsaXN0ZW5lciB0byBiZSBhYmxlIHRvIGNhbGwgaXQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwkJCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoaW50IGFjdGlvbikgew0KKwkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKGFjdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgc2V0cyB0aGUgc2VsZWN0aW9uIGludG8gd2hpY2hldmVyIHZpZXdlciBpcyBhY3RpdmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsNCisJCWZpbmFsIENvbGxlY3Rpb248Pz4gdGhlU2VsZWN0aW9uID0gY29sbGVjdGlvbjsNCisJCS8vIE1ha2Ugc3VyZSBpdCdzIG9rYXkuDQorCQkvLw0KKwkJaWYgKHRoZVNlbGVjdGlvbiAhPSBudWxsICYmICF0aGVTZWxlY3Rpb24uaXNFbXB0eSgpKSB7DQorCQkJUnVubmFibGUgcnVubmFibGUgPQ0KKwkJCQluZXcgUnVubmFibGUoKSB7DQorCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgY29udGVudCB2aWV3ZXIgb2YgdGhlIGVkaXRvci4NCisJCQkJCQkvLw0KKwkJCQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsNCisJCQkJCQkJY3VycmVudFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhlU2VsZWN0aW9uLnRvQXJyYXkoKSksIHRydWUpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfTsNCisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBlZGl0aW5nIGRvbWFpbiBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElFZGl0aW5nRG9tYWluUHJvdmlkZXJ9IGludGVyZmFjZS4NCisJICogVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGltcGxlbWVudGluZyB0aGUgc3RhdGljIG1ldGhvZHMgb2Yge0BsaW5rIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbn0NCisJICogYW5kIGZvciBzdXBwb3J0aW5nIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbn0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgew0KKwkJcmV0dXJuIGVkaXRpbmdEb21haW47DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgew0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCisJCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJQE92ZXJyaWRlDQorCQlwdWJsaWMgT2JqZWN0IFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsNCisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7DQorCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJQE92ZXJyaWRlDQorCQlwdWJsaWMgT2JqZWN0IFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsNCisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7DQorCQkJcmV0dXJuIChwYXJlbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnQpKS50b0FycmF5KCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJQE92ZXJyaWRlDQorCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7DQorCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOw0KKwkJCXJldHVybiBwYXJlbnQgIT0gbnVsbDsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlAT3ZlcnJpZGUNCisJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRWaWV3ZXJQYW5lKFZpZXdlclBhbmUgdmlld2VyUGFuZSkgew0KKwkJaWYgKGN1cnJlbnRWaWV3ZXJQYW5lICE9IHZpZXdlclBhbmUpIHsNCisJCQlpZiAoY3VycmVudFZpZXdlclBhbmUgIT0gbnVsbCkgew0KKwkJCQljdXJyZW50Vmlld2VyUGFuZS5zaG93Rm9jdXMoZmFsc2UpOw0KKwkJCX0NCisJCQljdXJyZW50Vmlld2VyUGFuZSA9IHZpZXdlclBhbmU7DQorCQl9DQorCQlzZXRDdXJyZW50Vmlld2VyKGN1cnJlbnRWaWV3ZXJQYW5lLmdldFZpZXdlcigpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBtYWtlcyBzdXJlIHRoYXQgb25lIGNvbnRlbnQgdmlld2VyLCBlaXRoZXIgZm9yIHRoZSBjdXJyZW50IHBhZ2Ugb3IgdGhlIG91dGxpbmUgdmlldywgaWYgaXQgaGFzIGZvY3VzLA0KKwkgKiBpcyB0aGUgY3VycmVudCBvbmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vmlld2VyKFZpZXdlciB2aWV3ZXIpIHsNCisJCS8vIElmIGl0IGlzIGNoYW5naW5nLi4uDQorCQkvLw0KKwkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gdmlld2VyKSB7DQorCQkJaWYgKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7DQorCQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgb24gZGVtYW5kLg0KKwkJCQkvLw0KKwkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPQ0KKwkJCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7DQorCQkJCQkJLy8gVGhpcyBqdXN0IG5vdGlmaWVzIHRob3NlIHRoaW5ncyB0aGF0IGFyZSBhZmZlY3RlZCBieSB0aGUgc2VjdGlvbi4NCisJCQkJCQkvLw0KKwkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHNlbGVjdGlvbkNoYW5nZWRFdmVudCkgew0KKwkJCQkJCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsNCisJCQkJCQl9DQorCQkJCQl9Ow0KKwkJCX0NCisNCisJCQkvLyBTdG9wIGxpc3RlbmluZyB0byB0aGUgb2xkIG9uZS4NCisJCQkvLw0KKwkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsNCisJCQkJY3VycmVudFZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsNCisJCQl9DQorDQorCQkJLy8gU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXcgb25lLg0KKwkJCS8vDQorCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7DQorCQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsNCisJCQl9DQorDQorCQkJLy8gUmVtZW1iZXIgaXQuDQorCQkJLy8NCisJCQljdXJyZW50Vmlld2VyID0gdmlld2VyOw0KKw0KKwkJCS8vIFNldCB0aGUgZWRpdG9ycyBzZWxlY3Rpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgdmlld2VyJ3Mgc2VsZWN0aW9uLg0KKwkJCS8vDQorCQkJc2V0U2VsZWN0aW9uKGN1cnJlbnRWaWV3ZXIgPT0gbnVsbCA/IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkgOiBjdXJyZW50Vmlld2VyLmdldFNlbGVjdGlvbigpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSB2aWV3ZXIgYXMgcmVxdWlyZWQgYnkgdGhlIHtAbGluayBJVmlld2VyUHJvdmlkZXJ9IGludGVyZmFjZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgew0KKwkJcmV0dXJuIGN1cnJlbnRWaWV3ZXI7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlciBhbmQgYWRkcyBhIGxpc3RlbmVyIGFzIHdlbGwgcmVnaXN0ZXJpbmcgdGhlIG1lbnUgZm9yIGV4dGVuc2lvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7DQorCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQNCisJCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQNCisJCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsNCisJCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsNCisJCU1lbnUgbWVudT0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7DQorCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7DQorCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgbmV3IFVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcih2aWV3ZXIpKTsNCisNCisJCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LOw0KKwkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9Ow0KKwkJdmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyYWdBZGFwdGVyKHZpZXdlcikpOw0KKwkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIGNhbGxlZCB0byBsb2FkIGEgcmVzb3VyY2UgaW50byB0aGUgZWRpdGluZyBkb21haW4ncyByZXNvdXJjZSBzZXQgYmFzZWQgb24gdGhlIGVkaXRvcidzIGlucHV0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgY3JlYXRlTW9kZWwoKSB7DQorCQlVUkkgcmVzb3VyY2VVUkkgPSBFZGl0VUlVdGlsLmdldFVSSShnZXRFZGl0b3JJbnB1dCgpKTsNCisJCUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOw0KKwkJdHJ5IHsNCisJCQkvLyBMb2FkIHRoZSByZXNvdXJjZSB0aHJvdWdoIHRoZSBlZGl0aW5nIGRvbWFpbi4NCisJCQkvLw0KKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCB0cnVlKTsNCisJCX0NCisJCWNhdGNoIChFeGNlcHRpb24gZSkgew0KKwkJCWV4Y2VwdGlvbiA9IGU7DQorCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIGZhbHNlKTsNCisJCX0NCisNCisJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pOw0KKwkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7DQorCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCAgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOw0KKwkJfQ0KKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgZGlhZ25vc3RpYyBkZXNjcmliaW5nIHRoZSBlcnJvcnMgYW5kIHdhcm5pbmdzIGxpc3RlZCBpbiB0aGUgcmVzb3VyY2UNCisJICogYW5kIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIChpZiBhbnkpLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIERpYWdub3N0aWMgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMoUmVzb3VyY2UgcmVzb3VyY2UsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCWlmICghcmVzb3VyY2UuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpIHx8ICFyZXNvdXJjZS5nZXRXYXJuaW5ncygpLmlzRW1wdHkoKSkgew0KKwkJCUJhc2ljRGlhZ25vc3RpYyBiYXNpY0RpYWdub3N0aWMgPQ0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljDQorCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwNCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmVkaXRvciIsIC8vJE5PTi1OTFMtMSQNCisJCQkJCSAwLA0KKwkJCQkJIGdldFN0cmluZygiX1VJX0NyZWF0ZU1vZGVsRXJyb3JfbWVzc2FnZSIsIHJlc291cmNlLmdldFVSSSgpKSwgLy8kTk9OLU5MUy0xJA0KKwkJCQkJIG5ldyBPYmplY3QgW10geyBleGNlcHRpb24gPT0gbnVsbCA/IChPYmplY3QpcmVzb3VyY2UgOiBleGNlcHRpb24gfSk7DQorCQkJYmFzaWNEaWFnbm9zdGljLm1lcmdlKEVjb3JlVXRpbC5jb21wdXRlRGlhZ25vc3RpYyhyZXNvdXJjZSwgdHJ1ZSkpOw0KKwkJCXJldHVybiBiYXNpY0RpYWdub3N0aWM7DQorCQl9DQorCQllbHNlIGlmIChleGNlcHRpb24gIT0gbnVsbCkgew0KKwkJCXJldHVybg0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljDQorCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwNCisJCQkJCSAib3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmVkaXRvciIsIC8vJE5PTi1OTFMtMSQNCisJCQkJCSAwLA0KKwkJCQkJIGdldFN0cmluZygiX1VJX0NyZWF0ZU1vZGVsRXJyb3JfbWVzc2FnZSIsIHJlc291cmNlLmdldFVSSSgpKSwgLy8kTk9OLU5MUy0xJA0KKwkJCQkJIG5ldyBPYmplY3RbXSB7IGV4Y2VwdGlvbiB9KTsNCisJCX0NCisJCWVsc2Ugew0KKwkJCXJldHVybiBEaWFnbm9zdGljLk9LX0lOU1RBTkNFOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGluc3RhbGwgeW91ciBvd24gY29udHJvbHMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgY3JlYXRlUGFnZXMoKSB7DQorCQkvLyBDcmVhdGVzIHRoZSBtb2RlbCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQNCisJCS8vDQorCQljcmVhdGVNb2RlbCgpOw0KKw0KKwkJLy8gT25seSBjcmVhdGVzIHRoZSBvdGhlciBwYWdlcyBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhhdCBjYW4gYmUgZWRpdGVkDQorCQkvLw0KKwkJaWYgKCFnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsNCisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgc2VsZWN0aW9uIHRyZWUgdmlldy4NCisJCQkvLw0KKwkJCXsNCisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0NCisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIFNvbHZlckVkaXRvci50aGlzKSB7DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgew0KKwkJCQkJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShjb21wb3NpdGUsIFNXVC5NVUxUSSk7DQorCQkJCQkJCVRyZWVWaWV3ZXIgbmV3VHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOw0KKwkJCQkJCQlyZXR1cm4gbmV3VHJlZVZpZXdlcjsNCisJCQkJCQl9DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7DQorCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7DQorCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOw0KKwkJCQkJCX0NCisJCQkJCX07DQorCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7DQorDQorCQkJCXNlbGVjdGlvblZpZXdlciA9IChUcmVlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7DQorCQkJCXNlbGVjdGlvblZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorDQorCQkJCXNlbGVjdGlvblZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7DQorCQkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOw0KKwkJCQl2aWV3ZXJQYW5lLnNldFRpdGxlKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7DQorDQorCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3Ioc2VsZWN0aW9uVmlld2VyLmdldFRyZWUoKSwgYWRhcHRlckZhY3RvcnkpOw0KKw0KKwkJCQljcmVhdGVDb250ZXh0TWVudUZvcihzZWxlY3Rpb25WaWV3ZXIpOw0KKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7DQorCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisNCisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgcGFyZW50IHRyZWUgdmlldy4NCisJCQkvLw0KKwkJCXsNCisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0NCisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIFNvbHZlckVkaXRvci50aGlzKSB7DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgew0KKwkJCQkJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShjb21wb3NpdGUsIFNXVC5NVUxUSSk7DQorCQkJCQkJCVRyZWVWaWV3ZXIgbmV3VHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOw0KKwkJCQkJCQlyZXR1cm4gbmV3VHJlZVZpZXdlcjsNCisJCQkJCQl9DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7DQorCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7DQorCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOw0KKwkJCQkJCX0NCisJCQkJCX07DQorCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7DQorDQorCQkJCXBhcmVudFZpZXdlciA9IChUcmVlVmlld2VyKXZpZXdlclBhbmUuZ2V0Vmlld2VyKCk7DQorCQkJCXBhcmVudFZpZXdlci5zZXRBdXRvRXhwYW5kTGV2ZWwoMzApOw0KKwkJCQlwYXJlbnRWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJcGFyZW50Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKw0KKwkJCQljcmVhdGVDb250ZXh0TWVudUZvcihwYXJlbnRWaWV3ZXIpOw0KKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7DQorCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfUGFyZW50UGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisNCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgbGlzdCB2aWV3ZXINCisJCQkvLw0KKwkJCXsNCisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0NCisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIFNvbHZlckVkaXRvci50aGlzKSB7DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgew0KKwkJCQkJCQlyZXR1cm4gbmV3IExpc3RWaWV3ZXIoY29tcG9zaXRlKTsNCisJCQkJCQl9DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7DQorCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7DQorCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOw0KKwkJCQkJCX0NCisJCQkJCX07DQorCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7DQorCQkJCWxpc3RWaWV3ZXIgPSAoTGlzdFZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOw0KKwkJCQlsaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJbGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisNCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IobGlzdFZpZXdlcik7DQorCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsNCisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9MaXN0UGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisNCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgdHJlZSB2aWV3ZXINCisJCQkvLw0KKwkJCXsNCisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0NCisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIFNvbHZlckVkaXRvci50aGlzKSB7DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgew0KKwkJCQkJCQlyZXR1cm4gbmV3IFRyZWVWaWV3ZXIoY29tcG9zaXRlKTsNCisJCQkJCQl9DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7DQorCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7DQorCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOw0KKwkJCQkJCX0NCisJCQkJCX07DQorCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7DQorCQkJCXRyZWVWaWV3ZXIgPSAoVHJlZVZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOw0KKwkJCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisNCisJCQkJbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcih0cmVlVmlld2VyLmdldFRyZWUoKSwgYWRhcHRlckZhY3RvcnkpOw0KKw0KKwkJCQljcmVhdGVDb250ZXh0TWVudUZvcih0cmVlVmlld2VyKTsNCisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOw0KKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1RyZWVQYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKw0KKwkJCS8vIFRoaXMgaXMgdGhlIHBhZ2UgZm9yIHRoZSB0YWJsZSB2aWV3ZXIuDQorCQkJLy8NCisJCQl7DQorCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9DQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBTb2x2ZXJFZGl0b3IudGhpcykgew0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsNCisJCQkJCQkJcmV0dXJuIG5ldyBUYWJsZVZpZXdlcihjb21wb3NpdGUpOw0KKwkJCQkJCX0NCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsNCisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsNCisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsNCisJCQkJdGFibGVWaWV3ZXIgPSAoVGFibGVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsNCisNCisJCQkJVGFibGUgdGFibGUgPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpOw0KKwkJCQlUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsNCisJCQkJdGFibGUuc2V0TGF5b3V0KGxheW91dCk7DQorCQkJCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7DQorCQkJCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsNCisNCisJCQkJVGFibGVDb2x1bW4gb2JqZWN0Q29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7DQorCQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDMsIDEwMCwgdHJ1ZSkpOw0KKwkJCQlvYmplY3RDb2x1bW4uc2V0VGV4dChnZXRTdHJpbmcoIl9VSV9PYmplY3RDb2x1bW5fbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJb2JqZWN0Q29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsNCisNCisJCQkJVGFibGVDb2x1bW4gc2VsZkNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOw0KKwkJCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyLCAxMDAsIHRydWUpKTsNCisJCQkJc2VsZkNvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX1NlbGZDb2x1bW5fbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJc2VsZkNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7DQorDQorCQkJCXRhYmxlVmlld2VyLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZyBbXSB7ImEiLCAiYiJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQorCQkJCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorDQorCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRhYmxlVmlld2VyKTsNCisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOw0KKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1RhYmxlUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisNCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgdGFibGUgdHJlZSB2aWV3ZXIuDQorCQkJLy8NCisJCQl7DQorCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9DQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBTb2x2ZXJFZGl0b3IudGhpcykgew0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsNCisJCQkJCQkJcmV0dXJuIG5ldyBUcmVlVmlld2VyKGNvbXBvc2l0ZSk7DQorCQkJCQkJfQ0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgew0KKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOw0KKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsNCisJCQkJCQl9DQorCQkJCQl9Ow0KKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOw0KKw0KKwkJCQl0cmVlVmlld2VyV2l0aENvbHVtbnMgPSAoVHJlZVZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOw0KKw0KKwkJCQlUcmVlIHRyZWUgPSB0cmVlVmlld2VyV2l0aENvbHVtbnMuZ2V0VHJlZSgpOw0KKwkJCQl0cmVlLnNldExheW91dERhdGEobmV3IEZpbGxMYXlvdXQoKSk7DQorCQkJCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsNCisJCQkJdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7DQorDQorCQkJCVRyZWVDb2x1bW4gb2JqZWN0Q29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOw0KKwkJCQlvYmplY3RDb2x1bW4uc2V0VGV4dChnZXRTdHJpbmcoIl9VSV9PYmplY3RDb2x1bW5fbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJb2JqZWN0Q29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsNCisJCQkJb2JqZWN0Q29sdW1uLnNldFdpZHRoKDI1MCk7DQorDQorCQkJCVRyZWVDb2x1bW4gc2VsZkNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsNCisJCQkJc2VsZkNvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX1NlbGZDb2x1bW5fbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJc2VsZkNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7DQorCQkJCXNlbGZDb2x1bW4uc2V0V2lkdGgoMjAwKTsNCisNCisJCQkJdHJlZVZpZXdlcldpdGhDb2x1bW5zLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZyBbXSB7ImEiLCAiYiJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQorCQkJCXRyZWVWaWV3ZXJXaXRoQ29sdW1ucy5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorCQkJCXRyZWVWaWV3ZXJXaXRoQ29sdW1ucy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisNCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IodHJlZVZpZXdlcldpdGhDb2x1bW5zKTsNCisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOw0KKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1RyZWVXaXRoQ29sdW1uc1BhZ2VfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorDQorCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYw0KKwkJCQkobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkgc2V0QWN0aXZlUGFnZSgwKTsNCisJCQkJCSB9DQorCQkJCSB9KTsNCisJCX0NCisNCisJCS8vIEVuc3VyZXMgdGhhdCB0aGlzIGVkaXRvciB3aWxsIG9ubHkgZGlzcGxheSB0aGUgcGFnZSdzIHRhYg0KKwkJLy8gYXJlYSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBwYWdlDQorCQkvLw0KKwkJZ2V0Q29udGFpbmVyKCkuYWRkQ29udHJvbExpc3RlbmVyDQorCQkJKG5ldyBDb250cm9sQWRhcHRlcigpIHsNCisJCQkJYm9vbGVhbiBndWFyZCA9IGZhbHNlOw0KKwkJCQlAT3ZlcnJpZGUNCisJCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7DQorCQkJCQlpZiAoIWd1YXJkKSB7DQorCQkJCQkJZ3VhcmQgPSB0cnVlOw0KKwkJCQkJCWhpZGVUYWJzKCk7DQorCQkJCQkJZ3VhcmQgPSBmYWxzZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCSB9KTsNCisNCisJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMNCisJCQkobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkgcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7DQorCQkJCSB9DQorCQkJIH0pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBJZiB0aGVyZSBpcyBqdXN0IG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LA0KKwkgKiB0aGlzIGhpZGVzIHRoZSBzaW5nbGUgdGFiIGF0IHRoZSBib3R0b20uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoaWRlVGFicygpIHsNCisJCWlmIChnZXRQYWdlQ291bnQoKSA8PSAxKSB7DQorCQkJc2V0UGFnZVRleHQoMCwgIiIpOyAvLyROT04tTkxTLTEkDQorCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgew0KKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodCgxKTsNCisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7DQorCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSArIDYpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LA0KKwkgKiB0aGlzIHNob3dzIHRoZSB0YWJzIGF0IHRoZSBib3R0b20uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzaG93VGFicygpIHsNCisJCWlmIChnZXRQYWdlQ291bnQoKSA+IDEpIHsNCisJCQlzZXRQYWdlVGV4dCgwLCBnZXRTdHJpbmcoIl9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsIikpOyAvLyROT04tTkxTLTEkDQorCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgew0KKwkJCQkoKENUYWJGb2xkZXIpZ2V0Q29udGFpbmVyKCkpLnNldFRhYkhlaWdodChTV1QuREVGQVVMVCk7DQorCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOw0KKwkJCQlnZXRDb250YWluZXIoKS5zZXRTaXplKHBvaW50LngsIHBvaW50LnkgLSA2KTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdXNlZCB0byB0cmFjayB0aGUgYWN0aXZlIHZpZXdlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBwYWdlSW5kZXgpIHsNCisJCXN1cGVyLnBhZ2VDaGFuZ2UocGFnZUluZGV4KTsNCisNCisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgIT0gbnVsbCkgew0KKwkJCWhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKGNvbnRlbnRPdXRsaW5lUGFnZS5nZXRTZWxlY3Rpb24oKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgaG93IHRoZSBmcmFtZXdvcmsgZGV0ZXJtaW5lcyB3aGljaCBpbnRlcmZhY2VzIHdlIGltcGxlbWVudC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgew0KKwkJaWYgKGtleS5lcXVhbHMoSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcykpIHsNCisJCQlyZXR1cm4gc2hvd091dGxpbmVWaWV3KCkgPyBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSA6IG51bGw7DQorCQl9DQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykpIHsNCisJCQlyZXR1cm4gZ2V0UHJvcGVydHlTaGVldFBhZ2UoKTsNCisJCX0NCisJCWVsc2UgaWYgKGtleS5lcXVhbHMoSUdvdG9NYXJrZXIuY2xhc3MpKSB7DQorCQkJcmV0dXJuIHRoaXM7DQorCQl9DQorCQllbHNlIHsNCisJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIGNvbnRlbnQgb3V0bGluZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRPdXRsaW5lUGFnZSBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSB7DQorCQlpZiAoY29udGVudE91dGxpbmVQYWdlID09IG51bGwpIHsNCisJCQkvLyBUaGUgY29udGVudCBvdXRsaW5lIGlzIGp1c3QgYSB0cmVlLg0KKwkJCS8vDQorCQkJY2xhc3MgTXlDb250ZW50T3V0bGluZVBhZ2UgZXh0ZW5kcyBDb250ZW50T3V0bGluZVBhZ2Ugew0KKwkJCQlAT3ZlcnJpZGUNCisJCQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7DQorCQkJCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7DQorCQkJCQljb250ZW50T3V0bGluZVZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsNCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsNCisNCisJCQkJCS8vIFNldCB1cCB0aGUgdHJlZSB2aWV3ZXIuDQorCQkJCQkvLw0KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOw0KKw0KKwkJCQkJLy8gTWFrZSBzdXJlIG91ciBwb3B1cHMgd29yay4NCisJCQkJCS8vDQorCQkJCQljcmVhdGVDb250ZXh0TWVudUZvcihjb250ZW50T3V0bGluZVZpZXdlcik7DQorDQorCQkJCQlpZiAoIWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsNCisJCQkJCSAgLy8gU2VsZWN0IHRoZSByb290IG9iamVjdCBpbiB0aGUgdmlldy4NCisJCQkJCSAgLy8NCisJCQkJCSAgY29udGVudE91dGxpbmVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQlAT3ZlcnJpZGUNCisJCQkJcHVibGljIHZvaWQgbWFrZUNvbnRyaWJ1dGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlcikgew0KKwkJCQkJc3VwZXIubWFrZUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLCBzdGF0dXNMaW5lTWFuYWdlcik7DQorCQkJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyID0gc3RhdHVzTGluZU1hbmFnZXI7DQorCQkJCX0NCisNCisJCQkJQE92ZXJyaWRlDQorCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgew0KKwkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsNCisJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOw0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJCWNvbnRlbnRPdXRsaW5lUGFnZSA9IG5ldyBNeUNvbnRlbnRPdXRsaW5lUGFnZSgpOw0KKw0KKwkJCS8vIExpc3RlbiB0byBzZWxlY3Rpb24gc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGl0IGlzIGEgc3BlY2lhbCB3YXkuDQorCQkJLy8NCisJCQljb250ZW50T3V0bGluZVBhZ2UuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyDQorCQkJCShuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsNCisJCQkJCSAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBoYW5kbGUgc2VsZWN0aW9ucyBjb3JyZWN0bHkuDQorCQkJCQkgLy8NCisJCQkJCSBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgew0KKwkJCQkJCSBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7DQorCQkJCQkgfQ0KKwkJCQkgfSk7DQorCQl9DQorDQorCQlyZXR1cm4gY29udGVudE91dGxpbmVQYWdlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIHByb3BlcnR5IHNoZWV0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQcm9wZXJ0eVNoZWV0UGFnZSBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpIHsNCisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7DQorCQkJcHJvcGVydHlTaGVldFBhZ2UgPQ0KKwkJCQluZXcgRXh0ZW5kZWRQcm9wZXJ0eVNoZWV0UGFnZShlZGl0aW5nRG9tYWluKSB7DQorCQkJCQlAT3ZlcnJpZGUNCisJCQkJCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKExpc3Q8Pz4gc2VsZWN0aW9uKSB7DQorCQkJCQkJU29sdmVyRWRpdG9yLnRoaXMuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0aW9uKTsNCisJCQkJCQlTb2x2ZXJFZGl0b3IudGhpcy5zZXRGb2N1cygpOw0KKwkJCQkJfQ0KKw0KKwkJCQkJQE92ZXJyaWRlDQorCQkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsNCisJCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOw0KKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOw0KKwkJCQkJfQ0KKwkJCQl9Ow0KKwkJCXByb3BlcnR5U2hlZXRQYWdlLnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorCQl9DQorDQorCQlyZXR1cm4gcHJvcGVydHlTaGVldFBhZ2U7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgZGVhbHMgd2l0aCBob3cgd2Ugd2FudCBzZWxlY3Rpb24gaW4gdGhlIG91dGxpbmVyIHRvIGFmZmVjdCB0aGUgb3RoZXIgdmlld3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJaWYgKGN1cnJlbnRWaWV3ZXJQYW5lICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsNCisJCQlJdGVyYXRvcjw/PiBzZWxlY3RlZEVsZW1lbnRzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLml0ZXJhdG9yKCk7DQorCQkJaWYgKHNlbGVjdGVkRWxlbWVudHMuaGFzTmV4dCgpKSB7DQorCQkJCS8vIEdldCB0aGUgZmlyc3Qgc2VsZWN0ZWQgZWxlbWVudC4NCisJCQkJLy8NCisJCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHMubmV4dCgpOw0KKw0KKwkJCQkvLyBJZiBpdCdzIHRoZSBzZWxlY3Rpb24gdmlld2VyLCB0aGVuIHdlIHdhbnQgaXQgdG8gc2VsZWN0IHRoZSBzYW1lIHNlbGVjdGlvbiBhcyB0aGlzIHNlbGVjdGlvbi4NCisJCQkJLy8NCisJCQkJaWYgKGN1cnJlbnRWaWV3ZXJQYW5lLmdldFZpZXdlcigpID09IHNlbGVjdGlvblZpZXdlcikgew0KKwkJCQkJQXJyYXlMaXN0PE9iamVjdD4gc2VsZWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KKwkJCQkJc2VsZWN0aW9uTGlzdC5hZGQoc2VsZWN0ZWRFbGVtZW50KTsNCisJCQkJCXdoaWxlIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgew0KKwkJCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudHMubmV4dCgpKTsNCisJCQkJCX0NCisNCisJCQkJCS8vIFNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSB3aWRnZXQuDQorCQkJCQkvLw0KKwkJCQkJc2VsZWN0aW9uVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb25MaXN0KSk7DQorCQkJCX0NCisJCQkJZWxzZSB7DQorCQkJCQkvLyBTZXQgdGhlIGlucHV0IHRvIHRoZSB3aWRnZXQuDQorCQkJCQkvLw0KKwkJCQkJaWYgKGN1cnJlbnRWaWV3ZXJQYW5lLmdldFZpZXdlcigpLmdldElucHV0KCkgIT0gc2VsZWN0ZWRFbGVtZW50KSB7DQorCQkJCQkJY3VycmVudFZpZXdlclBhbmUuZ2V0Vmlld2VyKCkuc2V0SW5wdXQoc2VsZWN0ZWRFbGVtZW50KTsNCisJCQkJCQljdXJyZW50Vmlld2VyUGFuZS5zZXRUaXRsZShzZWxlY3RlZEVsZW1lbnQpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHRlc3RzIHRoZSBjb21tYW5kIHN0YWNrLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7DQorCQlyZXR1cm4gKChCYXNpY0NvbW1hbmRTdGFjayllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5pc1NhdmVOZWVkZWQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSBzYXZlcyB0aGUgbW9kZWwgZmlsZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsNCisJCS8vIFNhdmUgb25seSByZXNvdXJjZXMgdGhhdCBoYXZlIGFjdHVhbGx5IGNoYW5nZWQuDQorCQkvLw0KKwkJZmluYWwgTWFwPE9iamVjdCwgT2JqZWN0PiBzYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOw0KKwkJc2F2ZU9wdGlvbnMucHV0KFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRCwgUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOw0KKw0KKwkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbiBiZWNhdXNlIHRoaXMgaXMgYSBsb25nIHJ1bm5pbmcgYWN0aXZpdHkgdGhhdCBtb2RpZmllcyB0aGUgd29ya2JlbmNoLg0KKwkJLy8NCisJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPQ0KKwkJCW5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7DQorCQkJCS8vIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IGdldHMgaW52b2tlZCB3aGVuIHRoZSBvcGVyYXRpb24gcnVucy4NCisJCQkJLy8NCisJCQkJQE92ZXJyaWRlDQorCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQorCQkJCQkvLyBTYXZlIHRoZSByZXNvdXJjZXMgdG8gdGhlIGZpbGUgc3lzdGVtLg0KKwkJCQkJLy8NCisJCQkJCWJvb2xlYW4gZmlyc3QgPSB0cnVlOw0KKwkJCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSkgew0KKwkJCQkJCWlmICgoZmlyc3QgfHwgIXJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpIHx8IGlzUGVyc2lzdGVkKHJlc291cmNlKSkgJiYgIWVkaXRpbmdEb21haW4uaXNSZWFkT25seShyZXNvdXJjZSkpIHsNCisJCQkJCQkJdHJ5IHsNCisJCQkJCQkJCWxvbmcgdGltZVN0YW1wID0gcmVzb3VyY2UuZ2V0VGltZVN0YW1wKCk7DQorCQkJCQkJCQlyZXNvdXJjZS5zYXZlKHNhdmVPcHRpb25zKTsNCisJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUaW1lU3RhbXAoKSAhPSB0aW1lU3RhbXApIHsNCisJCQkJCQkJCQlzYXZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQl9DQorCQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsNCisJCQkJCQkJfQ0KKwkJCQkJCQlmaXJzdCA9IGZhbHNlOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX07DQorDQorCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOw0KKwkJdHJ5IHsNCisJCQkvLyBUaGlzIHJ1bnMgdGhlIG9wdGlvbnMsIGFuZCBzaG93cyBwcm9ncmVzcy4NCisJCQkvLw0KKwkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpLnJ1bih0cnVlLCBmYWxzZSwgb3BlcmF0aW9uKTsNCisNCisJCQkvLyBSZWZyZXNoIHRoZSBuZWNlc3Nhcnkgc3RhdGUuDQorCQkJLy8NCisJCQkoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLnNhdmVJc0RvbmUoKTsNCisJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7DQorCQl9DQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCS8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHRoYXQgc2hvdWxkbid0Lg0KKwkJCS8vDQorCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCX0NCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsNCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB3aGV0aGVyIHNvbWV0aGluZyBoYXMgYmVlbiBwZXJzaXN0ZWQgdG8gdGhlIFVSSSBvZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlLg0KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgVVJJIGNvbnZlcnRlciBmcm9tIHRoZSBlZGl0b3IncyByZXNvdXJjZSBzZXQgdG8gdHJ5IHRvIG9wZW4gYW4gaW5wdXQgc3RyZWFtLiANCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzUGVyc2lzdGVkKFJlc291cmNlIHJlc291cmNlKSB7DQorCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOw0KKwkJdHJ5IHsNCisJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0ocmVzb3VyY2UuZ2V0VVJJKCkpOw0KKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgew0KKwkJCQlyZXN1bHQgPSB0cnVlOw0KKwkJCQlzdHJlYW0uY2xvc2UoKTsNCisJCQl9DQorCQl9DQorCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KKwkJCS8vIElnbm9yZQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhbHdheXMgcmV0dXJucyB0cnVlIGJlY2F1c2UgaXQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgew0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWxzbyBjaGFuZ2VzIHRoZSBlZGl0b3IncyBpbnB1dC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsNCisJCVNhdmVBc0RpYWxvZyBzYXZlQXNEaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsNCisJCXNhdmVBc0RpYWxvZy5vcGVuKCk7DQorCQlJUGF0aCBwYXRoID0gc2F2ZUFzRGlhbG9nLmdldFJlc3VsdCgpOw0KKwkJaWYgKHBhdGggIT0gbnVsbCkgew0KKwkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7DQorCQkJaWYgKGZpbGUgIT0gbnVsbCkgew0KKwkJCQlkb1NhdmVBcyhVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSkpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvU2F2ZUFzKFVSSSB1cmksIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgew0KKwkJKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLnNldFVSSSh1cmkpOw0KKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsNCisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7DQorCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9DQorCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgIT0gbnVsbCA/DQorCQkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpIDoNCisJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsNCisJCWRvU2F2ZShwcm9ncmVzc01vbml0b3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgew0KKwkJdHJ5IHsNCisJCQlpZiAobWFya2VyLmdldFR5cGUoKS5lcXVhbHMoRVZhbGlkYXRvci5NQVJLRVIpKSB7DQorCQkJCVN0cmluZyB1cmlBdHRyaWJ1dGUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKEVWYWxpZGF0b3IuVVJJX0FUVFJJQlVURSwgbnVsbCk7DQorCQkJCWlmICh1cmlBdHRyaWJ1dGUgIT0gbnVsbCkgew0KKwkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpQXR0cmlidXRlKTsNCisJCQkJCUVPYmplY3QgZU9iamVjdCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7DQorCQkJCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7DQorCQkJCQkgIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zLnNpbmdsZXRvbihlZGl0aW5nRG9tYWluLmdldFdyYXBwZXIoZU9iamVjdCkpKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBzdGFydHVwLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7DQorCQlzZXRTaXRlKHNpdGUpOw0KKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsNCisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7DQorCQlzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKHRoaXMpOw0KKwkJc2l0ZS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7DQorCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7DQorCQlpZiAoY3VycmVudFZpZXdlclBhbmUgIT0gbnVsbCkgew0KKwkJCWN1cnJlbnRWaWV3ZXJQYW5lLnNldEZvY3VzKCk7DQorCQl9DQorCQllbHNlIHsNCisJCQlnZXRDb250cm9sKGdldEFjdGl2ZVBhZ2UoKSkuc2V0Rm9jdXMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgew0KKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7DQorCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHJldHVybiB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgew0KKwkJcmV0dXJuIGVkaXRvclNlbGVjdGlvbjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gc2V0IHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uDQorCSAqIENhbGxpbmcgdGhpcyByZXN1bHQgd2lsbCBub3RpZnkgdGhlIGxpc3RlbmVycy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJZWRpdG9yU2VsZWN0aW9uID0gc2VsZWN0aW9uOw0KKw0KKwkJZm9yIChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyIDogc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycykgew0KKwkJCWxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsNCisJCX0NCisJCXNldFN0YXR1c0xpbmVNYW5hZ2VyKHNlbGVjdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXNMaW5lTWFuYWdlcihJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyID0gY3VycmVudFZpZXdlciAhPSBudWxsICYmIGN1cnJlbnRWaWV3ZXIgPT0gY29udGVudE91dGxpbmVWaWV3ZXIgPw0KKwkJCWNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXIgOiBnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsNCisNCisJCWlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKSB7DQorCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7DQorCQkJCUNvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS50b0xpc3QoKTsNCisJCQkJc3dpdGNoIChjb2xsZWN0aW9uLnNpemUoKSkgew0KKwkJCQkJY2FzZSAwOiB7DQorCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9Ob09iamVjdFNlbGVjdGVkIikpOyAvLyROT04tTkxTLTEkDQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCQljYXNlIDE6IHsNCisJCQkJCQlTdHJpbmcgdGV4dCA9IG5ldyBBZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3IoYWRhcHRlckZhY3RvcnkpLmdldFRleHQoY29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7DQorCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZCIsIHRleHQpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQkJZGVmYXVsdDogew0KKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTXVsdGlPYmplY3RTZWxlY3RlZCIsIEludGVnZXIudG9TdHJpbmcoY29sbGVjdGlvbi5zaXplKCkpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQllbHNlIHsNCisJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZSgiIik7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gdGhlIHBsdWdpbidzIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsNCisJCXJldHVybiBDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGxvb2tzIHVwIGEgc3RyaW5nIGluIHBsdWdpbi5wcm9wZXJ0aWVzLCBtYWtpbmcgYSBzdWJzdGl0dXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgew0KKwkJcmV0dXJuIENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSwgbmV3IE9iamVjdCBbXSB7IHMxIH0pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyfSB0byBoZWxwIGZpbGwgdGhlIGNvbnRleHQgbWVudXMgd2l0aCBjb250cmlidXRpb25zIGZyb20gdGhlIEVkaXQgbWVudS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsNCisJCSgoSU1lbnVMaXN0ZW5lcilnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSkubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7DQorCQlyZXR1cm4gKEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcilnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgew0KKwkJcmV0dXJuIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aW9uQmFycygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgew0KKwkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5Ow0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQorCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOw0KKw0KKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7DQorDQorCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOw0KKw0KKwkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOw0KKw0KKwkJaWYgKGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gdGhpcykgew0KKwkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKG51bGwpOw0KKwkJfQ0KKw0KKwkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsNCisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7DQorCQl9DQorDQorCQlpZiAoY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsNCisJCQljb250ZW50T3V0bGluZVBhZ2UuZGlzcG9zZSgpOw0KKwkJfQ0KKw0KKwkJc3VwZXIuZGlzcG9zZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG91dGxpbmUgdmlldyBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd091dGxpbmVWaWV3KCkgew0KKwkJcmV0dXJuIHRydWU7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3NvbHZlci9wcmVzZW50YXRpb24vU29sdmVyTW9kZWxXaXphcmQuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvcHJlc2VudGF0aW9uL1NvbHZlck1vZGVsV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyNGE1OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS9zb2x2ZXIvcHJlc2VudGF0aW9uL1NvbHZlck1vZGVsV2l6YXJkLmphdmEKQEAgLTAsMCArMSw2MzkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5wcmVzZW50YXRpb247DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTZXRTZWxlY3Rpb25UYXJnZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zb2x2ZXIuU29sdmVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5Tb2x2ZXJQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvcmVFZGl0UGx1Z2luOw0KKw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJlc2VudGF0aW9uLkNvcmVFZGl0b3JQbHVnaW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247DQorDQorDQorLyoqDQorICogVGhpcyBpcyBhIHNpbXBsZSB3aXphcmQgZm9yIGNyZWF0aW5nIGEgbmV3IG1vZGVsIGZpbGUuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNvbHZlck1vZGVsV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7DQorCS8qKg0KKwkgKiBUaGUgc3VwcG9ydGVkIGV4dGVuc2lvbnMgZm9yIGNyZWF0ZWQgZmlsZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBGSUxFX0VYVEVOU0lPTlMgPQ0KKwkJQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU29sdmVyRWRpdG9yRmlsZW5hbWVFeHRlbnNpb25zIikuc3BsaXQoIlxccyosXFxzKiIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKw0KKwkvKioNCisJICogQSBmb3JtYXR0ZWQgbGlzdCBvZiBzdXBwb3J0ZWQgZmlsZSBleHRlbnNpb25zLCBzdWl0YWJsZSBmb3IgZGlzcGxheS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFRF9GSUxFX0VYVEVOU0lPTlMgPQ0KKwkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Tb2x2ZXJFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbnMiKS5yZXBsYWNlQWxsKCJcXHMqLFxccyoiLCAiLCAiKTsNCisNCisJLyoqDQorCSAqIFRoaXMgY2FjaGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCBwYWNrYWdlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNvbHZlclBhY2thZ2Ugc29sdmVyUGFja2FnZSA9IFNvbHZlclBhY2thZ2UuZUlOU1RBTkNFOw0KKw0KKwkvKioNCisJICogVGhpcyBjYWNoZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIGZhY3RvcnkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU29sdmVyRmFjdG9yeSBzb2x2ZXJGYWN0b3J5ID0gc29sdmVyUGFja2FnZS5nZXRTb2x2ZXJGYWN0b3J5KCk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBmaWxlIGNyZWF0aW9uIHBhZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU29sdmVyTW9kZWxXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIG5ld0ZpbGVDcmVhdGlvblBhZ2U7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBpbml0aWFsIG9iamVjdCBjcmVhdGlvbiBwYWdlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNvbHZlck1vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSBpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlOw0KKw0KKwkvKioNCisJICogUmVtZW1iZXIgdGhlIHNlbGVjdGlvbiBkdXJpbmcgaW5pdGlhbGl6YXRpb24gZm9yIHBvcHVsYXRpbmcgdGhlIGRlZmF1bHQgY29udGFpbmVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsNCisNCisJLyoqDQorCSAqIFJlbWVtYmVyIHRoZSB3b3JrYmVuY2ggZHVyaW5nIGluaXRpYWxpemF0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElXb3JrYmVuY2ggd29ya2JlbmNoOw0KKw0KKwkvKioNCisJICogQ2FjaGVzIHRoZSBuYW1lcyBvZiB0aGUgdHlwZXMgdGhhdCBjYW4gYmUgY3JlYXRlZCBhcyB0aGUgcm9vdCBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGluaXRpYWxPYmplY3ROYW1lczsNCisNCisJLyoqDQorCSAqIFRoaXMganVzdCByZWNvcmRzIHRoZSBpbmZvcm1hdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7DQorCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsNCisJCXNldFdpbmRvd1RpdGxlKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV2l6YXJkX2xhYmVsIikpOyAvLyROT04tTkxTLTEkDQorCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihFeHRlbmRlZEltYWdlUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0SW1hZ2VEZXNjcmlwdG9yKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvd2l6YmFuL05ld1NvbHZlciIpKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIHR5cGVzIHRoYXQgY2FuIGJlIGNyZWF0ZWQgYXMgdGhlIHJvb3Qgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbml0aWFsT2JqZWN0TmFtZXMoKSB7DQorCQlpZiAoaW5pdGlhbE9iamVjdE5hbWVzID09IG51bGwpIHsNCisJCQlpbml0aWFsT2JqZWN0TmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCisJCQlmb3IgKEVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyIDogc29sdmVyUGFja2FnZS5nZXRFQ2xhc3NpZmllcnMoKSkgew0KKwkJCQlpZiAoZUNsYXNzaWZpZXIgaW5zdGFuY2VvZiBFQ2xhc3MpIHsNCisJCQkJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKWVDbGFzc2lmaWVyOw0KKwkJCQkJaWYgKCFlQ2xhc3MuaXNBYnN0cmFjdCgpKSB7DQorCQkJCQkJaW5pdGlhbE9iamVjdE5hbWVzLmFkZChlQ2xhc3MuZ2V0TmFtZSgpKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlDb2xsZWN0aW9ucy5zb3J0KGluaXRpYWxPYmplY3ROYW1lcywgQ29tbW9uUGx1Z2luLklOU1RBTkNFLmdldENvbXBhcmF0b3IoKSk7DQorCQl9DQorCQlyZXR1cm4gaW5pdGlhbE9iamVjdE5hbWVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGUgYSBuZXcgbW9kZWwuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBjcmVhdGVJbml0aWFsTW9kZWwoKSB7DQorCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcylzb2x2ZXJQYWNrYWdlLmdldEVDbGFzc2lmaWVyKGluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UuZ2V0SW5pdGlhbE9iamVjdE5hbWUoKSk7DQorCQlFT2JqZWN0IHJvb3RPYmplY3QgPSBzb2x2ZXJGYWN0b3J5LmNyZWF0ZShlQ2xhc3MpOw0KKwkJcmV0dXJuIHJvb3RPYmplY3Q7DQorCX0NCisNCisJLyoqDQorCSAqIERvIHRoZSB3b3JrIGFmdGVyIGV2ZXJ5dGhpbmcgaXMgc3BlY2lmaWVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7DQorCQl0cnkgew0KKwkJCS8vIFJlbWVtYmVyIHRoZSBmaWxlLg0KKwkJCS8vDQorCQkJZmluYWwgSUZpbGUgbW9kZWxGaWxlID0gZ2V0TW9kZWxGaWxlKCk7DQorDQorCQkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbi4NCisJCQkvLw0KKwkJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPQ0KKwkJCQluZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgew0KKwkJCQkJQE92ZXJyaWRlDQorCQkJCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7DQorCQkJCQkJdHJ5IHsNCisJCQkJCQkJLy8gQ3JlYXRlIGEgcmVzb3VyY2Ugc2V0DQorCQkJCQkJCS8vDQorCQkJCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOw0KKw0KKwkJCQkJCQkvLyBHZXQgdGhlIFVSSSBvZiB0aGUgbW9kZWwgZmlsZS4NCisJCQkJCQkJLy8NCisJCQkJCQkJVVJJIGZpbGVVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShtb2RlbEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKTsNCisNCisJCQkJCQkJLy8gQ3JlYXRlIGEgcmVzb3VyY2UgZm9yIHRoaXMgZmlsZS4NCisJCQkJCQkJLy8NCisJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShmaWxlVVJJKTsNCisNCisJCQkJCQkJLy8gQWRkIHRoZSBpbml0aWFsIG1vZGVsIG9iamVjdCB0byB0aGUgY29udGVudHMuDQorCQkJCQkJCS8vDQorCQkJCQkJCUVPYmplY3Qgcm9vdE9iamVjdCA9IGNyZWF0ZUluaXRpYWxNb2RlbCgpOw0KKwkJCQkJCQlpZiAocm9vdE9iamVjdCAhPSBudWxsKSB7DQorCQkJCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChyb290T2JqZWN0KTsNCisJCQkJCQkJfQ0KKw0KKwkJCQkJCQkvLyBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgcmVzb3VyY2UgdG8gdGhlIGZpbGUgc3lzdGVtLg0KKwkJCQkJCQkvLw0KKwkJCQkJCQlNYXA8T2JqZWN0LCBPYmplY3Q+IG9wdGlvbnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsNCisJCQkJCQkJb3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCBpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlLmdldEVuY29kaW5nKCkpOw0KKwkJCQkJCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOw0KKwkJCQkJCX0NCisJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQkJCQlDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJCQkJCX0NCisJCQkJCQlmaW5hbGx5IHsNCisJCQkJCQkJcHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX07DQorDQorCQkJZ2V0Q29udGFpbmVyKCkucnVuKGZhbHNlLCBmYWxzZSwgb3BlcmF0aW9uKTsNCisNCisJCQkvLyBTZWxlY3QgdGhlIG5ldyBmaWxlIHJlc291cmNlIGluIHRoZSBjdXJyZW50IHZpZXcuDQorCQkJLy8NCisJCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsNCisJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsNCisJCQlmaW5hbCBJV29ya2JlbmNoUGFydCBhY3RpdmVQYXJ0ID0gcGFnZS5nZXRBY3RpdmVQYXJ0KCk7DQorCQkJaWYgKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KSB7DQorCQkJCWZpbmFsIElTZWxlY3Rpb24gdGFyZ2V0U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obW9kZWxGaWxlKTsNCisJCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjDQorCQkJCQkobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCSAoKElTZXRTZWxlY3Rpb25UYXJnZXQpYWN0aXZlUGFydCkuc2VsZWN0UmV2ZWFsKHRhcmdldFNlbGVjdGlvbik7DQorCQkJCQkJIH0NCisJCQkJCSB9KTsNCisJCQl9DQorDQorCQkJLy8gT3BlbiBhbiBlZGl0b3Igb24gdGhlIG5ldyBmaWxlLg0KKwkJCS8vDQorCQkJdHJ5IHsNCisJCQkJcGFnZS5vcGVuRWRpdG9yDQorCQkJCQkobmV3IEZpbGVFZGl0b3JJbnB1dChtb2RlbEZpbGUpLA0KKwkJCQkJIHdvcmtiZW5jaC5nZXRFZGl0b3JSZWdpc3RyeSgpLmdldERlZmF1bHRFZGl0b3IobW9kZWxGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkuZ2V0SWQoKSk7DQorCQkJfQ0KKwkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Iod29ya2JlbmNoV2luZG93LmdldFNoZWxsKCksIENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsIiksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkDQorCQkJCXJldHVybiBmYWxzZTsNCisJCQl9DQorDQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBvbmUgcGFnZSBvZiB0aGUgd2l6YXJkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNvbHZlck1vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2Ugew0KKwkJLyoqDQorCQkgKiBQYXNzIGluIHRoZSBzZWxlY3Rpb24uDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTb2x2ZXJNb2RlbFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UoU3RyaW5nIHBhZ2VJZCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQkJc3VwZXIocGFnZUlkLCBzZWxlY3Rpb24pOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBUaGUgZnJhbWV3b3JrIGNhbGxzIHRoaXMgdG8gc2VlIGlmIHRoZSBmaWxlIGlzIGNvcnJlY3QuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgew0KKwkJCWlmIChzdXBlci52YWxpZGF0ZVBhZ2UoKSkgew0KKwkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gbmV3IFBhdGgoZ2V0RmlsZU5hbWUoKSkuZ2V0RmlsZUV4dGVuc2lvbigpOw0KKwkJCQlpZiAoZXh0ZW5zaW9uID09IG51bGwgfHwgIUZJTEVfRVhURU5TSU9OUy5jb250YWlucyhleHRlbnNpb24pKSB7DQorCQkJCQlTdHJpbmcga2V5ID0gRklMRV9FWFRFTlNJT05TLnNpemUoKSA+IDEgPyAiX1dBUk5fRmlsZW5hbWVFeHRlbnNpb25zIiA6ICJfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwkJCQkJc2V0RXJyb3JNZXNzYWdlKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSwgbmV3IE9iamVjdCBbXSB7IEZPUk1BVFRFRF9GSUxFX0VYVEVOU0lPTlMgfSkpOw0KKwkJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCQl9DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIElGaWxlIGdldE1vZGVsRmlsZSgpIHsNCisJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGdldENvbnRhaW5lckZ1bGxQYXRoKCkuYXBwZW5kKGdldEZpbGVOYW1lKCkpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgcGFnZSB3aGVyZSB0aGUgdHlwZSBvZiBvYmplY3QgdG8gY3JlYXRlIGlzIHNlbGVjdGVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNvbHZlck1vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSBleHRlbmRzIFdpemFyZFBhZ2Ugew0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBDb21ibyBpbml0aWFsT2JqZWN0RmllbGQ7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqLw0KKwkJcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBlbmNvZGluZ3M7DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJvdGVjdGVkIENvbWJvIGVuY29kaW5nRmllbGQ7DQorDQorCQkvKioNCisJCSAqIFBhc3MgaW4gdGhlIHNlbGVjdGlvbi4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNvbHZlck1vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZShTdHJpbmcgcGFnZUlkKSB7DQorCQkJc3VwZXIocGFnZUlkKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCisJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsgew0KKwkJCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7DQorCQkJCWxheW91dC5udW1Db2x1bW5zID0gMTsNCisJCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEyOw0KKwkJCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7DQorDQorCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsNCisJCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQorCQkJCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOw0KKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsNCisJCQl9DQorDQorCQkJTGFiZWwgY29udGFpbmVyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7DQorCQkJew0KKwkJCQljb250YWluZXJMYWJlbC5zZXRUZXh0KENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfTW9kZWxPYmplY3QiKSk7IC8vJE5PTi1OTFMtMSQNCisNCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJCQljb250YWluZXJMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOw0KKwkJCX0NCisNCisJCQlpbml0aWFsT2JqZWN0RmllbGQgPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSKTsNCisJCQl7DQorCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsNCisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCisJCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsNCisJCQkJaW5pdGlhbE9iamVjdEZpZWxkLnNldExheW91dERhdGEoZGF0YSk7DQorCQkJfQ0KKw0KKwkJCWZvciAoU3RyaW5nIG9iamVjdE5hbWUgOiBnZXRJbml0aWFsT2JqZWN0TmFtZXMoKSkgew0KKwkJCQlpbml0aWFsT2JqZWN0RmllbGQuYWRkKGdldExhYmVsKG9iamVjdE5hbWUpKTsNCisJCQl9DQorDQorCQkJaWYgKGluaXRpYWxPYmplY3RGaWVsZC5nZXRJdGVtQ291bnQoKSA9PSAxKSB7DQorCQkJCWluaXRpYWxPYmplY3RGaWVsZC5zZWxlY3QoMCk7DQorCQkJfQ0KKwkJCWluaXRpYWxPYmplY3RGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih2YWxpZGF0b3IpOw0KKw0KKwkJCUxhYmVsIGVuY29kaW5nTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7DQorCQkJew0KKwkJCQllbmNvZGluZ0xhYmVsLnNldFRleHQoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9YTUxFbmNvZGluZyIpKTsgLy8kTk9OLU5MUy0xJA0KKw0KKwkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7DQorCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQorCQkJCWVuY29kaW5nTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsNCisJCQl9DQorCQkJZW5jb2RpbmdGaWVsZCA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5CT1JERVIpOw0KKwkJCXsNCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOw0KKwkJCQllbmNvZGluZ0ZpZWxkLnNldExheW91dERhdGEoZGF0YSk7DQorCQkJfQ0KKw0KKwkJCWZvciAoU3RyaW5nIGVuY29kaW5nIDogZ2V0RW5jb2RpbmdzKCkpIHsNCisJCQkJZW5jb2RpbmdGaWVsZC5hZGQoZW5jb2RpbmcpOw0KKwkJCX0NCisNCisJCQllbmNvZGluZ0ZpZWxkLnNlbGVjdCgwKTsNCisJCQllbmNvZGluZ0ZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHZhbGlkYXRvcik7DQorDQorCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsNCisJCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIHZhbGlkYXRvciA9DQorCQkJbmV3IE1vZGlmeUxpc3RlbmVyKCkgew0KKwkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsNCisJCQkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7DQorCQkJCX0NCisJCQl9Ow0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsNCisJCQlyZXR1cm4gZ2V0SW5pdGlhbE9iamVjdE5hbWUoKSAhPSBudWxsICYmIGdldEVuY29kaW5ncygpLmNvbnRhaW5zKGVuY29kaW5nRmllbGQuZ2V0VGV4dCgpKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlAT3ZlcnJpZGUNCisJCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7DQorCQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsNCisJCQlpZiAodmlzaWJsZSkgew0KKwkJCQlpZiAoaW5pdGlhbE9iamVjdEZpZWxkLmdldEl0ZW1Db3VudCgpID09IDEpIHsNCisJCQkJCWluaXRpYWxPYmplY3RGaWVsZC5jbGVhclNlbGVjdGlvbigpOw0KKwkJCQkJZW5jb2RpbmdGaWVsZC5zZXRGb2N1cygpOw0KKwkJCQl9DQorCQkJCWVsc2Ugew0KKwkJCQkJZW5jb2RpbmdGaWVsZC5jbGVhclNlbGVjdGlvbigpOw0KKwkJCQkJaW5pdGlhbE9iamVjdEZpZWxkLnNldEZvY3VzKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFN0cmluZyBnZXRJbml0aWFsT2JqZWN0TmFtZSgpIHsNCisJCQlTdHJpbmcgbGFiZWwgPSBpbml0aWFsT2JqZWN0RmllbGQuZ2V0VGV4dCgpOw0KKw0KKwkJCWZvciAoU3RyaW5nIG5hbWUgOiBnZXRJbml0aWFsT2JqZWN0TmFtZXMoKSkgew0KKwkJCQlpZiAoZ2V0TGFiZWwobmFtZSkuZXF1YWxzKGxhYmVsKSkgew0KKwkJCQkJcmV0dXJuIG5hbWU7DQorCQkJCX0NCisJCQl9DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsNCisJCQlyZXR1cm4gZW5jb2RpbmdGaWVsZC5nZXRUZXh0KCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIFJldHVybnMgdGhlIGxhYmVsIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgbmFtZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbChTdHJpbmcgdHlwZU5hbWUpIHsNCisJCQl0cnkgew0KKwkJCQlyZXR1cm4gQ29yZUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfIiArIHR5cGVOYW1lICsgIl90eXBlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwkJCX0NCisJCQljYXRjaChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7DQorCQkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKG1yZSk7DQorCQkJfQ0KKwkJCXJldHVybiB0eXBlTmFtZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEVuY29kaW5ncygpIHsNCisJCQlpZiAoZW5jb2RpbmdzID09IG51bGwpIHsNCisJCQkJZW5jb2RpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQorCQkJCWZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9YTUxFbmNvZGluZ0Nob2ljZXMiKSk7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgLy8kTk9OLU5MUy0xJA0KKwkJCQl7DQorCQkJCQllbmNvZGluZ3MuYWRkKHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKSk7DQorCQkJCX0NCisJCQl9DQorCQkJcmV0dXJuIGVuY29kaW5nczsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhlIGZyYW1ld29yayBjYWxscyB0aGlzIHRvIGNyZWF0ZSB0aGUgY29udGVudHMgb2YgdGhlIHdpemFyZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCQlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7DQorCQkvLyBDcmVhdGUgYSBwYWdlLCBzZXQgdGhlIHRpdGxlLCBhbmQgdGhlIGluaXRpYWwgbW9kZWwgZmlsZSBuYW1lLg0KKwkJLy8NCisJCW5ld0ZpbGVDcmVhdGlvblBhZ2UgPSBuZXcgU29sdmVyTW9kZWxXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlKCJXaGF0ZXZlciIsIHNlbGVjdGlvbik7IC8vJE5PTi1OTFMtMSQNCisJCW5ld0ZpbGVDcmVhdGlvblBhZ2Uuc2V0VGl0bGUoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Tb2x2ZXJNb2RlbFdpemFyZF9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJA0KKwkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXREZXNjcmlwdGlvbihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1NvbHZlck1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkDQorCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldEZpbGVOYW1lKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU29sdmVyRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZSIpICsgIi4iICsgRklMRV9FWFRFTlNJT05TLmdldCgwKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKwkJYWRkUGFnZShuZXdGaWxlQ3JlYXRpb25QYWdlKTsNCisNCisJCS8vIFRyeSBhbmQgZ2V0IHRoZSByZXNvdXJjZSBzZWxlY3Rpb24gdG8gZGV0ZXJtaW5lIGEgY3VycmVudCBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlIGRpYWxvZy4NCisJCS8vDQorCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCisJCQkvLyBHZXQgdGhlIHJlc291cmNlLi4uDQorCQkJLy8NCisJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpOw0KKwkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsNCisJCQkJLy8gR2V0IHRoZSByZXNvdXJjZSBwYXJlbnQsIGlmIGl0cyBhIGZpbGUuDQorCQkJCS8vDQorCQkJCUlSZXNvdXJjZSBzZWxlY3RlZFJlc291cmNlID0gKElSZXNvdXJjZSlzZWxlY3RlZEVsZW1lbnQ7DQorCQkJCWlmIChzZWxlY3RlZFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgew0KKwkJCQkJc2VsZWN0ZWRSZXNvdXJjZSA9IHNlbGVjdGVkUmVzb3VyY2UuZ2V0UGFyZW50KCk7DQorCQkJCX0NCisNCisJCQkJLy8gVGhpcyBnaXZlcyB1cyBhIGRpcmVjdG9yeS4uLg0KKwkJCQkvLw0KKwkJCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIgfHwgc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7DQorCQkJCQkvLyBTZXQgdGhpcyBmb3IgdGhlIGNvbnRhaW5lci4NCisJCQkJCS8vDQorCQkJCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldENvbnRhaW5lckZ1bGxQYXRoKHNlbGVjdGVkUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7DQorDQorCQkJCQkvLyBNYWtlIHVwIGEgdW5pcXVlIG5ldyBuYW1lIGhlcmUuDQorCQkJCQkvLw0KKwkJCQkJU3RyaW5nIGRlZmF1bHRNb2RlbEJhc2VGaWxlbmFtZSA9IENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU29sdmVyRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZSIpOyAvLyROT04tTkxTLTEkDQorCQkJCQlTdHJpbmcgZGVmYXVsdE1vZGVsRmlsZW5hbWVFeHRlbnNpb24gPSBGSUxFX0VYVEVOU0lPTlMuZ2V0KDApOw0KKwkJCQkJU3RyaW5nIG1vZGVsRmlsZW5hbWUgPSBkZWZhdWx0TW9kZWxCYXNlRmlsZW5hbWUgKyAiLiIgKyBkZWZhdWx0TW9kZWxGaWxlbmFtZUV4dGVuc2lvbjsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJZm9yIChpbnQgaSA9IDE7ICgoSUNvbnRhaW5lcilzZWxlY3RlZFJlc291cmNlKS5maW5kTWVtYmVyKG1vZGVsRmlsZW5hbWUpICE9IG51bGw7ICsraSkgew0KKwkJCQkJCW1vZGVsRmlsZW5hbWUgPSBkZWZhdWx0TW9kZWxCYXNlRmlsZW5hbWUgKyBpICsgIi4iICsgZGVmYXVsdE1vZGVsRmlsZW5hbWVFeHRlbnNpb247IC8vJE5PTi1OTFMtMSQNCisJCQkJCX0NCisJCQkJCW5ld0ZpbGVDcmVhdGlvblBhZ2Uuc2V0RmlsZU5hbWUobW9kZWxGaWxlbmFtZSk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlID0gbmV3IFNvbHZlck1vZGVsV2l6YXJkSW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZSgiV2hhdGV2ZXIyIik7IC8vJE5PTi1OTFMtMSQNCisJCWluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2Uuc2V0VGl0bGUoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Tb2x2ZXJNb2RlbFdpemFyZF9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJA0KKwkJaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5zZXREZXNjcmlwdGlvbihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJA0KKwkJYWRkUGFnZShpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlKTsNCisJfQ0KKw0KKwkvKioNCisJICogR2V0IHRoZSBmaWxlIGZyb20gdGhlIHBhZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpbGUgZ2V0TW9kZWxGaWxlKCkgew0KKwkJcmV0dXJuIG5ld0ZpbGVDcmVhdGlvblBhZ2UuZ2V0TW9kZWxGaWxlKCk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3RyaWdnZXIvcHJlc2VudGF0aW9uL1RyaWdnZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS9jb3JlL3RyaWdnZXIvcHJlc2VudGF0aW9uL1RyaWdnZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0Yzk5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdHJpZ2dlci9wcmVzZW50YXRpb24vVHJpZ2dlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKQEAgLTAsMCArMSw0MzcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIucHJlc2VudGF0aW9uOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db250cm9sQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Mb2FkUmVzb3VyY2VBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlZhbGlkYXRlQWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uSXRlbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24ucHJlc2VudGF0aW9uLkNvcmVFZGl0b3JQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZvciB0aGUgVHJpZ2dlciBtb2RlbCBlZGl0b3IuCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAZ2VuZXJhdGVkCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFRyaWdnZXJBY3Rpb25CYXJDb250cmlidXRvcgorCWV4dGVuZHMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yCisJaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3JQYXJ0OworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gcHJvdmlkZXIuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsKKworCS8qKgorCSAqIFRoaXMgYWN0aW9uIG9wZW5zIHRoZSBQcm9wZXJ0aWVzIHZpZXcuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElBY3Rpb24gc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uID0KKwkJbmV3IEFjdGlvbihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW0iKSkgLy8kTk9OLU5MUy0xJAorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQl0cnkgeworCQkJCQlnZXRQYWdlKCkuc2hvd1ZpZXcoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCQkJfQorCQkJfQorCQl9OworCisJLyoqCisJICogVGhpcyBhY3Rpb24gcmVmcmVzaGVzIHRoZSB2aWV3ZXIgb2YgdGhlIGN1cnJlbnQgZWRpdG9yIGlmIHRoZSBlZGl0b3IKKwkgKiBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJQWN0aW9uIHJlZnJlc2hWaWV3ZXJBY3Rpb24gPQorCQluZXcgQWN0aW9uKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0iKSkgLy8kTk9OLU5MUy0xJAorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKwkJCQlyZXR1cm4gYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcjsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJaWYgKGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKKwkJCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKWFjdGl2ZUVkaXRvclBhcnQpLmdldFZpZXdlcigpOworCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKKwkJCQkJCXZpZXdlci5yZWZyZXNoKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gY29ycmVzcG9uZGluZyB0byBlYWNoIGRlc2NyaXB0b3IKKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBjcmVhdGVDaGlsZEFjdGlvbnM7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZUNoaWxkIGFjdGlvbnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyB3aWxsIGNvbnRhaW4gb25lIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gY29ycmVzcG9uZGluZyB0byBlYWNoIGRlc2NyaXB0b3IKKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBjcmVhdGVTaWJsaW5nQWN0aW9uczsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCBmb3IgQ3JlYXRlU2libGluZyBhY3Rpb25zLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBjb250cmlidXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVHJpZ2dlckFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgeworCQlzdXBlcihBRERJVElPTlNfTEFTVF9TVFlMRSk7CisJCWxvYWRSZXNvdXJjZUFjdGlvbiA9IG5ldyBMb2FkUmVzb3VyY2VBY3Rpb24oKTsKKwkJdmFsaWRhdGVBY3Rpb24gPSBuZXcgVmFsaWRhdGVBY3Rpb24oKTsKKwkJY29udHJvbEFjdGlvbiA9IG5ldyBDb250cm9sQWN0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhpcyBhZGRzIFNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMgdG8gdGhlIHRvb2wgYmFyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7CisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJ0cmlnZ2VyLXNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCisJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJ0cmlnZ2VyLWFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgYWRkcyB0byB0aGUgbWVudSBiYXIgYSBtZW51IGFuZCBzb21lIHNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMsCisJICogYXMgd2VsbCBhcyB0aGUgc3ViLW1lbnVzIGZvciBvYmplY3QgY3JlYXRpb24gaXRlbXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51TWFuYWdlcik7CisKKwkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVHJpZ2dlckVkaXRvcl9tZW51IiksICJvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlck1lbnVJRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigic2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIFByZXBhcmUgZm9yIENyZWF0ZUNoaWxkIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KKwkJLy8KKwkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlU2libGluZyBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCisJCS8vCisJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEZvcmNlIGFuIHVwZGF0ZSBiZWNhdXNlIEVjbGlwc2UgaGlkZXMgZW1wdHkgbWVudXMgbm93LgorCQkvLworCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIKKwkJCShuZXcgSU1lbnVMaXN0ZW5lcigpIHsKKwkJCQkgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQkJCQkgbWVudU1hbmFnZXIudXBkYXRlQWxsKHRydWUpOworCQkJCSB9CisJCQkgfSk7CisKKwkJYWRkR2xvYmFsQWN0aW9ucyhzdWJtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogV2hlbiB0aGUgYWN0aXZlIGVkaXRvciBjaGFuZ2VzLCB0aGlzIHJlbWVtYmVycyB0aGUgY2hhbmdlIGFuZCByZWdpc3RlcnMgd2l0aCBpdCBhcyBhIHNlbGVjdGlvbiBwcm92aWRlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkgeworCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IocGFydCk7CisJCWFjdGl2ZUVkaXRvclBhcnQgPSBwYXJ0OworCisJCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KKwkJLy8KKwkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKwkJfQorCQlpZiAocGFydCA9PSBudWxsKSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7CisJCX0KKwkJZWxzZSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7CisJCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisKKwkJCS8vIEZha2UgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCB0byB1cGRhdGUgdGhlIG1lbnVzLgorCQkJLy8KKwkJCWlmIChzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSAhPSBudWxsKSB7CisJCQkJc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNlbGVjdGlvblByb3ZpZGVyLCBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LAorCSAqIGhhbmRsaW5nIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH1zIGJ5IHF1ZXJ5aW5nIGZvciB0aGUgY2hpbGRyZW4gYW5kIHNpYmxpbmdzCisJICogdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGVkIG9iamVjdCBhbmQgdXBkYXRpbmcgdGhlIG1lbnVzIGFjY29yZGluZ2x5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCS8vIFJlbW92ZSBhbnkgbWVudSBpdGVtcyBmb3Igb2xkIHNlbGVjdGlvbi4KKwkJLy8KKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMpOworCQl9CisKKwkJLy8gUXVlcnkgdGhlIG5ldyBzZWxlY3Rpb24gZm9yIGFwcHJvcHJpYXRlIG5ldyBjaGlsZC9zaWJsaW5nIGRlc2NyaXB0b3JzCisJCS8vCisJCUNvbGxlY3Rpb248Pz4gbmV3Q2hpbGREZXNjcmlwdG9ycyA9IG51bGw7CisJCUNvbGxlY3Rpb248Pz4gbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gbnVsbDsKKworCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOworCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnNpemUoKSA9PSAxKSB7CisJCQlPYmplY3Qgb2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOworCisJCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7CisKKwkJCW5ld0NoaWxkRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhvYmplY3QsIG51bGwpOworCQkJbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobnVsbCwgb2JqZWN0KTsKKwkJfQorCisJCS8vIEdlbmVyYXRlIGFjdGlvbnMgZm9yIHNlbGVjdGlvbjsgcG9wdWxhdGUgYW5kIHJlZHJhdyB0aGUgbWVudXMuCisJCS8vCisJCWNyZWF0ZUNoaWxkQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKG5ld0NoaWxkRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7CisJCWNyZWF0ZVNpYmxpbmdBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhuZXdTaWJsaW5nRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7CisKKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7CisJCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKKwkJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7CisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7CisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlQ2hpbGRBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCisJLyoqCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sCisJICogYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKKwkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgeworCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVTaWJsaW5nQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwgZGVzY3JpcHRvcikpOworCQkJfQorCQl9CisJCXJldHVybiBhY3Rpb25zOworCX0KKworCS8qKgorCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gd2l0aCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cworCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sCisJICogYnkgaW5zZXJ0aW5nIHRoZW0gYmVmb3JlIHRoZSBzcGVjaWZpZWQgY29udHJpYnV0aW9uIGl0ZW0gPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+LgorCSAqIElmIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgc2ltcGx5IGFkZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zLCBTdHJpbmcgY29udHJpYnV0aW9uSUQpIHsKKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChJQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMpIHsKKwkJCQlpZiAoY29udHJpYnV0aW9uSUQgIT0gbnVsbCkgeworCQkJCQltYW5hZ2VyLmluc2VydEJlZm9yZShjb250cmlidXRpb25JRCwgYWN0aW9uKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCW1hbmFnZXIuYWRkKGFjdGlvbik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQkKKwkvKioKKwkgKiBUaGlzIHJlbW92ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cworCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucykgeworCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7CisJCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgeworCQkJCS8vIExvb2sgaW50byBTdWJDb250cmlidXRpb25JdGVtcworCQkJCS8vCisJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uSXRlbSA9IGl0ZW1zW2ldOworCQkJCXdoaWxlIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCQljb250cmlidXRpb25JdGVtID0gKChTdWJDb250cmlidXRpb25JdGVtKWNvbnRyaWJ1dGlvbkl0ZW0pLmdldElubmVySXRlbSgpOworCQkJCX0KKworCQkJCS8vIERlbGV0ZSB0aGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbXMgd2l0aCBtYXRjaGluZyBhY3Rpb24uCisJCQkJLy8KKwkJCQlpZiAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKKwkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0QWN0aW9uKCk7CisJCQkJCWlmIChhY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsKKwkJCQkJCW1hbmFnZXIucmVtb3ZlKGNvbnRyaWJ1dGlvbkl0ZW0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHBvcC11cCBtZW51IGJlZm9yZSBpdCBhcHBlYXJzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKKwkJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBudWxsOworCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKENvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisKKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBpbnNlcnRzIGdsb2JhbCBhY3Rpb25zIGJlZm9yZSB0aGUgImFkZGl0aW9ucy1lbmQiIHNlcGFyYXRvci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRHbG9iYWxBY3Rpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zLWVuZCIsIG5ldyBTZXBhcmF0b3IoInVpLWFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKKworCQlyZWZyZXNoVmlld2VyQWN0aW9uLnNldEVuYWJsZWQocmVmcmVzaFZpZXdlckFjdGlvbi5pc0VuYWJsZWQoKSk7CQkKKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCByZWZyZXNoVmlld2VyQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAorCisJCXN1cGVyLmFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgZW5zdXJlcyB0aGF0IGEgZGVsZXRlIGFjdGlvbiB3aWxsIGNsZWFuIHVwIGFsbCByZWZlcmVuY2VzIHRvIGRlbGV0ZWQgb2JqZWN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVBbGxSZWZlcmVuY2VzT25EZWxldGUoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vY29yZS90cmlnZ2VyL3ByZXNlbnRhdGlvbi9UcmlnZ2VyRWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdHJpZ2dlci9wcmVzZW50YXRpb24vVHJpZ2dlckVkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MjZlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL2NvcmUvdHJpZ2dlci9wcmVzZW50YXRpb24vVHJpZ2dlckVkaXRvci5qYXZhCkBAIC0wLDAgKzEsMTY4NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5wcmVzZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Mb2NhbFNlbGVjdGlvblRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuTWFya2VySGVscGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5lZGl0b3IuUHJvYmxlbUVkaXRvclBhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuY2VsbGVkaXRvci5BZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5Mb2NhbFRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5VbndyYXBwaW5nU2VsZWN0aW9uUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSU1hcmtlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSVV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS52aWV3LkV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVhNSVJlc291cmNlRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIucHJvdmlkZXIuVHJpZ2dlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByZXNlbnRhdGlvbi5Db3JlRWRpdG9yUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcm92aWRlci5Db21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LnByb3ZpZGVyLkV4cGVyaW1lbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5wcm92aWRlci5HcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLnByb3ZpZGVyLk1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIucHJvdmlkZXIuTW9kaWZpZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLnByb3ZpZGVyLlByZWRpY2F0ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLnByb3ZpZGVyLlNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLnByb3ZpZGVyLlNlcXVlbmNlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNvbHZlci5wcm92aWRlci5Tb2x2ZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKKworCisvKioKKyAqIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIFRyaWdnZXIgbW9kZWwgZWRpdG9yLgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBUcmlnZ2VyRWRpdG9yCisJZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0CisJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpblByb3ZpZGVyLCBJU2VsZWN0aW9uUHJvdmlkZXIsIElNZW51TGlzdGVuZXIsIElWaWV3ZXJQcm92aWRlciwgSUdvdG9NYXJrZXIgeworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGVkaXRpbmcgZG9tYWluIHRoYXQgaXMgdXNlZCB0byB0cmFjayBhbGwgY2hhbmdlcyB0byB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgb25lIGFkYXB0ZXIgZmFjdG9yeSB1c2VkIGZvciBwcm92aWRpbmcgdmlld3Mgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIElDb250ZW50T3V0bGluZVBhZ2UgY29udGVudE91dGxpbmVQYWdlOworCisJLyoqCisJICogVGhpcyBpcyBhIGtsdWRnZS4uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlcjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlJ3Mgdmlld2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUcmVlVmlld2VyIGNvbnRlbnRPdXRsaW5lVmlld2VyOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgcHJvcGVydHkgc2hlZXQgcGFnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB2aWV3ZXIgdGhhdCBzaGFkb3dzIHRoZSBzZWxlY3Rpb24gaW4gdGhlIGNvbnRlbnQgb3V0bGluZS4KKwkgKiBUaGUgcGFyZW50IHJlbGF0aW9uIG11c3QgYmUgY29ycmVjdGx5IGRlZmluZWQgZm9yIHRoaXMgdG8gd29yay4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBzZWxlY3Rpb25WaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgY29udGVudCB2aWV3ZXIsIHdoaWNoIG1heSBiZSBlaXRoZXIgb25lIG9mIHRoZSB2aWV3ZXJzIGluIHRoZSBwYWdlcyBvciB0aGUgY29udGVudCBvdXRsaW5lIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVmlld2VyIGN1cnJlbnRWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgdG8gd2hpY2ggZXZlciB2aWV3ZXIgaXMgYWN0aXZlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfXMgdGhhdCBhcmUgbGlzdGVuaW5nIHRvIHRoaXMgZWRpdG9yLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+KCk7CisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGVkaXRvciBhcyBhIHdob2xlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uIGVkaXRvclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7CisKKwkvKioKKwkgKiBUaGUgTWFya2VySGVscGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB3b3Jrc3BhY2UgcmVzb3VyY2UgbWFya2VycyBwcmVzZW50ZWQKKwkgKiBpbiBFY2xpcHNlJ3MgUHJvYmxlbXMgVmlldy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFya2VySGVscGVyIG1hcmtlckhlbHBlciA9IG5ldyBFZGl0VUlNYXJrZXJIZWxwZXIoKTsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVucyBmb3Igd2hlbiB0aGUgb3V0bGluZSBiZWNvbWVzIGFjdGl2ZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9CisJCW5ldyBJUGFydExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJaWYgKHAgaW5zdGFuY2VvZiBDb250ZW50T3V0bGluZSkgeworCQkJCQlpZiAoKChDb250ZW50T3V0bGluZSlwKS5nZXRDdXJyZW50UGFnZSgpID09IGNvbnRlbnRPdXRsaW5lUGFnZSkgeworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoVHJpZ2dlckVkaXRvci50aGlzKTsKKworCQkJCQkJc2V0Q3VycmVudFZpZXdlcihjb250ZW50T3V0bGluZVZpZXdlcik7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAocCBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpIHsKKwkJCQkJaWYgKCgoUHJvcGVydHlTaGVldClwKS5nZXRDdXJyZW50UGFnZSgpID09IHByb3BlcnR5U2hlZXRQYWdlKSB7CisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihUcmlnZ2VyRWRpdG9yLnRoaXMpOworCQkJCQkJaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChwID09IFRyaWdnZXJFZGl0b3IudGhpcykgeworCQkJCQloYW5kbGVBY3RpdmF0ZSgpOworCQkJCX0KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcCkgeworCQkJCS8vIElnbm9yZS4KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwKSB7CisJCQkJLy8gSWdub3JlLgorCQkJfQorCQl9OworCisJLyoqCisJICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkIHNpbmNlIGxhc3QgYWN0aXZhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisKKwkvKioKKwkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gc2F2ZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHNhdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCS8qKgorCSAqIE1hcCB0byBzdG9yZSB0aGUgZGlhZ25vc3RpYyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwPFJlc291cmNlLCBEaWFnbm9zdGljPiByZXNvdXJjZVRvRGlhZ25vc3RpY01hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFJlc291cmNlLCBEaWFnbm9zdGljPigpOworCisJLyoqCisJICogQ29udHJvbHMgd2hldGhlciB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHNob3VsZCBiZSB1cGRhdGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKworCS8qKgorCSAqIEFkYXB0ZXIgdXNlZCB0byB1cGRhdGUgdGhlIHByb2JsZW0gaW5kaWNhdGlvbiB3aGVuIHJlc291cmNlcyBhcmUgZGVtYW5kZWQgbG9hZGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBFQ29udGVudEFkYXB0ZXIgcHJvYmxlbUluZGljYXRpb25BZGFwdGVyID0gCisJCW5ldyBFQ29udGVudEFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisJCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZXNvdXJjZS5jbGFzcykpIHsKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRDoKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0VSUk9SUzoKKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX1dBUk5JTkdTOiB7CisJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2Upbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7CisJCQkJCQkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIG51bGwpOworCQkJCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGRpYWdub3N0aWMpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucmVtb3ZlKHJlc291cmNlKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAodXBkYXRlUHJvYmxlbUluZGljYXRpb24pIHsKKwkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkJCQkJCQkgfQorCQkJCQkJCQkJIH0pOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCQkJCX0KKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRUYXJnZXQoUmVzb3VyY2UgdGFyZ2V0KSB7CisJCQkJYmFzaWNTZXRUYXJnZXQodGFyZ2V0KTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCB1bnNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsKKwkJCQliYXNpY1Vuc2V0VGFyZ2V0KHRhcmdldCk7CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdvcmtzcGFjZSBjaGFuZ2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0KKwkJbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOworCQkJCXRyeSB7CisJCQkJCWNsYXNzIFJlc291cmNlRGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKKwkJCQkJCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKworCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKwkJCQkJCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKKwkJCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIHx8CisJCQkJCQkJCSAgICBkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiBkZWx0YS5nZXRGbGFncygpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMpIHsKKwkJCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZGVsdGEuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKSwgZmFsc2UpOworCQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKKwkJCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKKwkJCQkJCQkJCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQllbHNlIGlmICghc2F2ZWRSZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlKSkgeworCQkJCQkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQl9CisKKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgeworCQkJCQkJCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOworCQkJCQkJfQorCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsKKwkJCQkJCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlczsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWZpbmFsIFJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsKKwkJCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOworCisJCQkJCWlmICghdmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCSByZW1vdmVkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKSk7CisJCQkJCQkJCQkgaWYgKCFpc0RpcnR5KCkpIHsKKwkJCQkJCQkJCQkgZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihUcmlnZ2VyRWRpdG9yLnRoaXMsIGZhbHNlKTsKKwkJCQkJCQkJCSB9CisJCQkJCQkJCSB9CisJCQkJCQkJIH0pOworCQkJCQl9CisKKwkJCQkJaWYgKCF2aXNpdG9yLmdldENoYW5nZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCQkobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJIGNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKKwkJCQkJCQkJCSBpZiAoZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSBUcmlnZ2VyRWRpdG9yLnRoaXMpIHsKKwkJCQkJCQkJCQkgaGFuZGxlQWN0aXZhdGUoKTsKKwkJCQkJCQkJCSB9CisJCQkJCQkJCSB9CisJCQkJCQkJIH0pOworCQkJCQl9CisJCQkJfQorCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworCQkJCX0KKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIEhhbmRsZXMgYWN0aXZhdGlvbiBvZiB0aGUgZWRpdG9yIG9yIGl0J3MgYXNzb2NpYXRlZCB2aWV3cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0ZSgpIHsKKwkJLy8gUmVjb21wdXRlIHRoZSByZWFkIG9ubHkgc3RhdGUuCisJCS8vCisJCWlmIChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpICE9IG51bGwpIHsKKwkJICBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpLmNsZWFyKCk7CisKKwkJICAvLyBSZWZyZXNoIGFueSBhY3Rpb25zIHRoYXQgbWF5IGJlY29tZSBlbmFibGVkIG9yIGRpc2FibGVkLgorCQkgIC8vCisJCSAgc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKKwkJfQorCisJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCWlmIChoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpIHsKKwkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKFRyaWdnZXJFZGl0b3IudGhpcywgZmFsc2UpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVtb3ZlZFJlc291cmNlcy5jbGVhcigpOworCQkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgeworCQkJY2hhbmdlZFJlc291cmNlcy5yZW1vdmVBbGwoc2F2ZWRSZXNvdXJjZXMpOworCQkJaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpOworCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOworCQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEhhbmRsZXMgd2hhdCB0byBkbyB3aXRoIGNoYW5nZWQgcmVzb3VyY2VzIG9uIGFjdGl2YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpIHsKKwkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSAmJiAoIWlzRGlydHkoKSB8fCBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpKSB7CisJCQlpZiAoaXNEaXJ0eSgpKSB7CisJCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsKKwkJCX0KKwkJCWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZmx1c2goKTsKKworCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsKKwkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7CisJCQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKKwkJCQkJcmVzb3VyY2UudW5sb2FkKCk7CisJCQkJCXRyeSB7CisJCQkJCQlyZXNvdXJjZS5sb2FkKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJaWYgKCFyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5jb250YWluc0tleShyZXNvdXJjZSkpIHsKKwkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbi5pc1N0YWxlKGVkaXRvclNlbGVjdGlvbikpIHsKKwkJCQlzZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7CisJCQl9CisKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsKKwkJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCX0KKwl9CisgIAorCS8qKgorCSAqIFVwZGF0ZXMgdGhlIHByb2JsZW1zIGluZGljYXRpb24gd2l0aCB0aGUgaW5mb3JtYXRpb24gZGVzY3JpYmVkIGluIHRoZSBzcGVjaWZpZWQgZGlhZ25vc3RpYy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpIHsKKwkJaWYgKHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKSB7CisJCQlCYXNpY0RpYWdub3N0aWMgZGlhZ25vc3RpYyA9CisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5PSywKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZWRpdG9yIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkgMCwKKwkJCQkJIG51bGwsCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpIH0pOworCQkJZm9yIChEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA6IHJlc291cmNlVG9EaWFnbm9zdGljTWFwLnZhbHVlcygpKSB7CisJCQkJaWYgKGNoaWxkRGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJZGlhZ25vc3RpYy5hZGQoY2hpbGREaWFnbm9zdGljKTsKKwkJCQl9CisJCQl9CisKKwkJCWludCBsYXN0RWRpdG9yUGFnZSA9IGdldFBhZ2VDb3VudCgpIC0gMTsKKwkJCWlmIChsYXN0RWRpdG9yUGFnZSA+PSAwICYmIGdldEVkaXRvcihsYXN0RWRpdG9yUGFnZSkgaW5zdGFuY2VvZiBQcm9ibGVtRWRpdG9yUGFydCkgeworCQkJCSgoUHJvYmxlbUVkaXRvclBhcnQpZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSkuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQlQcm9ibGVtRWRpdG9yUGFydCBwcm9ibGVtRWRpdG9yUGFydCA9IG5ldyBQcm9ibGVtRWRpdG9yUGFydCgpOworCQkJCXByb2JsZW1FZGl0b3JQYXJ0LnNldERpYWdub3N0aWMoZGlhZ25vc3RpYyk7CisJCQkJcHJvYmxlbUVkaXRvclBhcnQuc2V0TWFya2VySGVscGVyKG1hcmtlckhlbHBlcik7CisJCQkJdHJ5IHsKKwkJCQkJYWRkUGFnZSgrK2xhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydCwgZ2V0RWRpdG9ySW5wdXQoKSk7CisJCQkJCXNldFBhZ2VUZXh0KGxhc3RFZGl0b3JQYWdlLCBwcm9ibGVtRWRpdG9yUGFydC5nZXRQYXJ0TmFtZSgpKTsKKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7CisJCQkJCXNob3dUYWJzKCk7CisJCQkJfQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChtYXJrZXJIZWxwZXIuaGFzTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpKSB7CisJCQkJbWFya2VySGVscGVyLmRlbGV0ZU1hcmtlcnMoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCW1hcmtlckhlbHBlci5jcmVhdGVNYXJrZXJzKGRpYWdub3N0aWMpOworCQkJCQl9CisJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFNob3dzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsKKwkJcmV0dXJuCisJCQlNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbgorCQkJCShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwKKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRmlsZUNvbmZsaWN0X2xhYmVsIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkgZ2V0U3RyaW5nKCJfV0FSTl9GaWxlQ29uZmxpY3QiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBtb2RlbCBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRyaWdnZXJFZGl0b3IoKSB7CisJCXN1cGVyKCk7CisJCWluaXRpYWxpemVFZGl0aW5nRG9tYWluKCk7CisJfQorCisJLyoqCisJICogVGhpcyBzZXRzIHVwIHRoZSBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1vZGVsIGVkaXRvci4gPCEtLSBiZWdpbi11c2VyLWRvYworCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFZGl0aW5nRG9tYWluKCkgeworCQlpbml0aWFsaXplRWRpdGluZ0RvbWFpbkdlbigpOworCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKQorCQkJCS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIioiLAorCQkJCQkJU1RFTVhNSVJlc291cmNlRmFjdG9yeUltcGwuSU5TVEFOQ0UpOworCisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpCisJCQkJLmdldFByb3RvY29sVG9GYWN0b3J5TWFwKCkucHV0KCJwbGF0Zm9ybSIsCisJCQkJCQlTVEVNWE1JUmVzb3VyY2VGYWN0b3J5SW1wbC5JTlNUQU5DRSk7CisJfSAvLyBpbml0aWFsaXplRWRpdGluZ0RvbWFpbgorCQorCS8qKgorCSAqIFRoaXMgc2V0cyB1cCB0aGUgZWRpdGluZyBkb21haW4gZm9yIHRoZSBtb2RlbCBlZGl0b3IuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVkaXRpbmdEb21haW5HZW4oKSB7CisJCS8vIENyZWF0ZSBhbiBhZGFwdGVyIGZhY3RvcnkgdGhhdCB5aWVsZHMgaXRlbSBwcm92aWRlcnMuCisJCS8vCisJCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5EZXNjcmlwdG9yLlJlZ2lzdHJ5LklOU1RBTkNFKTsKKworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IENvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgRXhwZXJpbWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IE1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBNb2RpZmllckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUHJlZGljYXRlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTY2VuYXJpb0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgU2VxdWVuY2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBUcmlnZ2VySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTb2x2ZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IEVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlIGV4ZWN1dGVkLgorCQkvLworCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKKworCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLgorCQkvLworCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIKKwkJCShuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7CisJCQkJIHB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsKKwkJCQkJIGdldENvbnRhaW5lcigpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCQkJCSAobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCSAgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkgIGZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKKworCQkJCQkJCQkgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuCisJCQkJCQkJCSAgLy8KKwkJCQkJCQkJICBDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spZXZlbnQuZ2V0U291cmNlKCkpLmdldE1vc3RSZWNlbnRDb21tYW5kKCk7CisJCQkJCQkJCSAgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKKwkJCQkJCQkJCSAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOworCQkJCQkJCQkgIH0KKwkJCQkJCQkJICBpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCAmJiAhcHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgeworCQkJCQkJCQkJICBwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7CisJCQkJCQkJCSAgfQorCQkJCQkJCSAgfQorCQkJCQkJICB9KTsKKwkJCQkgfQorCQkJIH0pOworCisJCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KKwkJLy8KKwkJZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywgbmV3IEhhc2hNYXA8UmVzb3VyY2UsIEJvb2xlYW4+KCkpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgaGVyZSBmb3IgdGhlIGxpc3RlbmVyIHRvIGJlIGFibGUgdG8gY2FsbCBpdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwkJCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgYWN0aW9uKSB7CisJCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShhY3Rpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgc2V0cyB0aGUgc2VsZWN0aW9uIGludG8gd2hpY2hldmVyIHZpZXdlciBpcyBhY3RpdmUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisJCWZpbmFsIENvbGxlY3Rpb248Pz4gdGhlU2VsZWN0aW9uID0gY29sbGVjdGlvbjsKKwkJLy8gTWFrZSBzdXJlIGl0J3Mgb2theS4KKwkJLy8KKwkJaWYgKHRoZVNlbGVjdGlvbiAhPSBudWxsICYmICF0aGVTZWxlY3Rpb24uaXNFbXB0eSgpKSB7CisJCQlSdW5uYWJsZSBydW5uYWJsZSA9CisJCQkJbmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBpdGVtcyBpbiB0aGUgY3VycmVudCBjb250ZW50IHZpZXdlciBvZiB0aGUgZWRpdG9yLgorCQkJCQkJLy8KKwkJCQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKKwkJCQkJCQljdXJyZW50Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0aGVTZWxlY3Rpb24udG9BcnJheSgpKSwgdHJ1ZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9OworCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIGVkaXRpbmcgZG9tYWluIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSUVkaXRpbmdEb21haW5Qcm92aWRlcn0gaW50ZXJmYWNlLgorCSAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBpbXBsZW1lbnRpbmcgdGhlIHN0YXRpYyBtZXRob2RzIG9mIHtAbGluayBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW59CisJICogYW5kIGZvciBzdXBwb3J0aW5nIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKKwkJcmV0dXJuIGVkaXRpbmdEb21haW47CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGNsYXNzIFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisJCX0KKworCQkvKioKKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0IFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOworCQl9CisKKwkJLyoqCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE9iamVjdCBbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CisJCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7CisJCQlyZXR1cm4gKHBhcmVudCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhcmVudCkpLnRvQXJyYXkoKTsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKKwkJCXJldHVybiBwYXJlbnQgIT0gbnVsbDsKKwkJfQorCisJCS8qKgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBtYWtlcyBzdXJlIHRoYXQgb25lIGNvbnRlbnQgdmlld2VyLCBlaXRoZXIgZm9yIHRoZSBjdXJyZW50IHBhZ2Ugb3IgdGhlIG91dGxpbmUgdmlldywgaWYgaXQgaGFzIGZvY3VzLAorCSAqIGlzIHRoZSBjdXJyZW50IG9uZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vmlld2VyKFZpZXdlciB2aWV3ZXIpIHsKKwkJLy8gSWYgaXQgaXMgY2hhbmdpbmcuLi4KKwkJLy8KKwkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gdmlld2VyKSB7CisJCQlpZiAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsKKwkJCQkvLyBDcmVhdGUgdGhlIGxpc3RlbmVyIG9uIGRlbWFuZC4KKwkJCQkvLworCQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9CisJCQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJCQkJLy8gVGhpcyBqdXN0IG5vdGlmaWVzIHRob3NlIHRoaW5ncyB0aGF0IGFyZSBhZmZlY3RlZCBieSB0aGUgc2VjdGlvbi4KKwkJCQkJCS8vCisJCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBzZWxlY3Rpb25DaGFuZ2VkRXZlbnQpIHsKKwkJCQkJCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCX0KKworCQkJLy8gU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG9sZCBvbmUuCisJCQkvLworCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgeworCQkJCWN1cnJlbnRWaWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7CisJCQl9CisKKwkJCS8vIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmV3IG9uZS4KKwkJCS8vCisJCQlpZiAodmlld2VyICE9IG51bGwpIHsKKwkJCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7CisJCQl9CisKKwkJCS8vIFJlbWVtYmVyIGl0LgorCQkJLy8KKwkJCWN1cnJlbnRWaWV3ZXIgPSB2aWV3ZXI7CisKKwkJCS8vIFNldCB0aGUgZWRpdG9ycyBzZWxlY3Rpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgdmlld2VyJ3Mgc2VsZWN0aW9uLgorCQkJLy8KKwkJCXNldFNlbGVjdGlvbihjdXJyZW50Vmlld2VyID09IG51bGwgPyBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZIDogY3VycmVudFZpZXdlci5nZXRTZWxlY3Rpb24oKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHZpZXdlciBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElWaWV3ZXJQcm92aWRlcn0gaW50ZXJmYWNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgeworCQlyZXR1cm4gY3VycmVudFZpZXdlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNyZWF0ZXMgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIgYW5kIGFkZHMgYSBsaXN0ZW5lciBhcyB3ZWxsCisJICogcmVnaXN0ZXJpbmcgdGhlIG1lbnUgZm9yIGV4dGVuc2lvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorCSAqIGVuZC11c2VyLWRvYyAtLT4KKwkgKiAKKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7CisJCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsgLy8kTk9OLU5MUy0xJAorCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCisJCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKKwkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKHRoaXMpOworCQlNZW51IG1lbnUgPSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKKwkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOworCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgdmlld2VyKTsKKworCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSzsKKwkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7TG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLCBMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCksCisJCQkJVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKKwkJdmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyYWdBZGFwdGVyKAorCQkJCXZpZXdlcikpOworCQl2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLAorCQkJCW5ldyBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7CisJfSAvLyBjcmVhdGVDb250ZXh0TWVudUZvcgorCQorCS8qKgorCSAqIFRoaXMgY3JlYXRlcyBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlciBhbmQgYWRkcyBhIGxpc3RlbmVyIGFzIHdlbGwgcmVnaXN0ZXJpbmcgdGhlIG1lbnUgZm9yIGV4dGVuc2lvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvckdlbihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgeworCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQKKwkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7CisJCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKKwkJTWVudSBtZW51PSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKKwkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOworCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgbmV3IFVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcih2aWV3ZXIpKTsKKworCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSzsKKwkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OworCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgVmlld2VyRHJhZ0FkYXB0ZXIodmlld2VyKSk7CisJCXZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIGNhbGxlZCB0byBsb2FkIGEgcmVzb3VyY2UgaW50byB0aGUgZWRpdGluZyBkb21haW4ncyByZXNvdXJjZSBzZXQgYmFzZWQgb24gdGhlIGVkaXRvcidzIGlucHV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZU1vZGVsKCkgeworCQlVUkkgcmVzb3VyY2VVUkkgPSBFZGl0VUlVdGlsLmdldFVSSShnZXRFZGl0b3JJbnB1dCgpKTsKKwkJRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCS8vIExvYWQgdGhlIHJlc291cmNlIHRocm91Z2ggdGhlIGVkaXRpbmcgZG9tYWluLgorCQkJLy8KKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCB0cnVlKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWV4Y2VwdGlvbiA9IGU7CisJCQlyZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgZmFsc2UpOworCQl9CisKKwkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbik7CisJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgeworCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCAgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOworCQl9CisJCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5hZGQocHJvYmxlbUluZGljYXRpb25BZGFwdGVyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgZGlhZ25vc3RpYyBkZXNjcmliaW5nIHRoZSBlcnJvcnMgYW5kIHdhcm5pbmdzIGxpc3RlZCBpbiB0aGUgcmVzb3VyY2UKKwkgKiBhbmQgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gKGlmIGFueSkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERpYWdub3N0aWMgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMoUmVzb3VyY2UgcmVzb3VyY2UsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJaWYgKCFyZXNvdXJjZS5nZXRFcnJvcnMoKS5pc0VtcHR5KCkgfHwgIXJlc291cmNlLmdldFdhcm5pbmdzKCkuaXNFbXB0eSgpKSB7CisJCQlCYXNpY0RpYWdub3N0aWMgYmFzaWNEaWFnbm9zdGljID0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLAorCQkJCQkgIm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5lZGl0b3IiLCAvLyROT04tTkxTLTEkCisJCQkJCSAwLAorCQkJCQkgZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlTW9kZWxFcnJvcl9tZXNzYWdlIiwgcmVzb3VyY2UuZ2V0VVJJKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZXhjZXB0aW9uID09IG51bGwgPyAoT2JqZWN0KXJlc291cmNlIDogZXhjZXB0aW9uIH0pOworCQkJYmFzaWNEaWFnbm9zdGljLm1lcmdlKEVjb3JlVXRpbC5jb21wdXRlRGlhZ25vc3RpYyhyZXNvdXJjZSwgdHJ1ZSkpOworCQkJcmV0dXJuIGJhc2ljRGlhZ25vc3RpYzsKKwkJfQorCQllbHNlIGlmIChleGNlcHRpb24gIT0gbnVsbCkgeworCQkJcmV0dXJuCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYworCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwKKwkJCQkJICJvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZWRpdG9yIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkgMCwKKwkJCQkJIGdldFN0cmluZygiX1VJX0NyZWF0ZU1vZGVsRXJyb3JfbWVzc2FnZSIsIHJlc291cmNlLmdldFVSSSgpKSwgLy8kTk9OLU5MUy0xJAorCQkJCQkgbmV3IE9iamVjdFtdIHsgZXhjZXB0aW9uIH0pOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIERpYWdub3N0aWMuT0tfSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGluc3RhbGwgeW91ciBvd24gY29udHJvbHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkIE5PVAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VzKCkgeworCQkvLyBDcmVhdGVzIHRoZSBtb2RlbCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQKKwkJLy8KKwkJY3JlYXRlTW9kZWwoKTsKKworCQkvLyBPbmx5IGNyZWF0ZXMgdGhlIG90aGVyIHBhZ2VzIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBlZGl0ZWQKKwkJLy8KKwkJaWYgKCFnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCS8vIENyZWF0ZSBhIHBhZ2UgZm9yIHRoZSBzZWxlY3Rpb24gdHJlZSB2aWV3LgorCQkJLy8KKwkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGdldENvbnRhaW5lcigpLCBTV1QuTVVMVEkpOworCQkJc2VsZWN0aW9uVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7CisJCQlzZXRDdXJyZW50Vmlld2VyKHNlbGVjdGlvblZpZXdlcik7CisKKwkJCXNlbGVjdGlvblZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkvL3NlbGVjdGlvblZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7CisKKwkJCW5ldyBBZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3Ioc2VsZWN0aW9uVmlld2VyLmdldFRyZWUoKSwgYWRhcHRlckZhY3RvcnkpOworCisJCQljcmVhdGVDb250ZXh0TWVudUZvcihzZWxlY3Rpb25WaWV3ZXIpOworCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2UodHJlZSk7CisJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKworCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkgc2V0QWN0aXZlUGFnZSgwKTsKKwkJCQkJIH0KKwkJCQkgfSk7CisJCX0KKworCQkvLyBFbnN1cmVzIHRoYXQgdGhpcyBlZGl0b3Igd2lsbCBvbmx5IGRpc3BsYXkgdGhlIHBhZ2UncyB0YWIKKwkJLy8gYXJlYSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBwYWdlCisJCS8vCisJCWdldENvbnRhaW5lcigpLmFkZENvbnRyb2xMaXN0ZW5lcgorCQkJKG5ldyBDb250cm9sQWRhcHRlcigpIHsKKwkJCQlib29sZWFuIGd1YXJkID0gZmFsc2U7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7CisJCQkJCWlmICghZ3VhcmQpIHsKKwkJCQkJCWd1YXJkID0gdHJ1ZTsKKwkJCQkJCWhpZGVUYWJzKCk7CisJCQkJCQlndWFyZCA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJIH0pOworCisJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMKKwkJCShuZXcgUnVubmFibGUoKSB7CisJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJCQkJIH0KKwkJCSB9KTsKKwl9IC8vIGNyZWF0ZVBhZ2VzCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZXRob2QgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGluc3RhbGwgeW91ciBvd24gY29udHJvbHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJLy9AT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlc0dlbigpIHsKKwkJLy8gQ3JlYXRlcyB0aGUgbW9kZWwgZnJvbSB0aGUgZWRpdG9yIGlucHV0CisJCS8vCisJCWNyZWF0ZU1vZGVsKCk7CisKKwkJLy8gT25seSBjcmVhdGVzIHRoZSBvdGhlciBwYWdlcyBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhhdCBjYW4gYmUgZWRpdGVkCisJCS8vCisJCWlmICghZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQkvLyBDcmVhdGUgYSBwYWdlIGZvciB0aGUgc2VsZWN0aW9uIHRyZWUgdmlldy4KKwkJCS8vCisJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShnZXRDb250YWluZXIoKSwgU1dULk1VTFRJKTsKKwkJCXNlbGVjdGlvblZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOworCQkJc2V0Q3VycmVudFZpZXdlcihzZWxlY3Rpb25WaWV3ZXIpOworCisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworCQkJc2VsZWN0aW9uVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsKKworCQkJbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcihzZWxlY3Rpb25WaWV3ZXIuZ2V0VHJlZSgpLCBhZGFwdGVyRmFjdG9yeSk7CisKKwkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHNlbGVjdGlvblZpZXdlcik7CisJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh0cmVlKTsKKwkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjCisJCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCSBzZXRBY3RpdmVQYWdlKDApOworCQkJCQkgfQorCQkJCSB9KTsKKwkJfQorCisJCS8vIEVuc3VyZXMgdGhhdCB0aGlzIGVkaXRvciB3aWxsIG9ubHkgZGlzcGxheSB0aGUgcGFnZSdzIHRhYgorCQkvLyBhcmVhIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHBhZ2UKKwkJLy8KKwkJZ2V0Q29udGFpbmVyKCkuYWRkQ29udHJvbExpc3RlbmVyCisJCQkobmV3IENvbnRyb2xBZGFwdGVyKCkgeworCQkJCWJvb2xlYW4gZ3VhcmQgPSBmYWxzZTsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsKKwkJCQkJaWYgKCFndWFyZCkgeworCQkJCQkJZ3VhcmQgPSB0cnVlOworCQkJCQkJaGlkZVRhYnMoKTsKKwkJCQkJCWd1YXJkID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkgfSk7CisKKwkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYworCQkJKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkgdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsKKwkJCQkgfQorCQkJIH0pOworCX0KKwkKKwkvKioKKwkgKiBJZiB0aGVyZSBpcyBqdXN0IG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LAorCSAqIHRoaXMgaGlkZXMgdGhlIHNpbmdsZSB0YWIgYXQgdGhlIGJvdHRvbS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoaWRlVGFicygpIHsKKwkJaWYgKGdldFBhZ2VDb3VudCgpIDw9IDEpIHsKKwkJCXNldFBhZ2VUZXh0KDAsICIiKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgeworCQkJCSgoQ1RhYkZvbGRlcilnZXRDb250YWluZXIoKSkuc2V0VGFiSGVpZ2h0KDEpOworCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOworCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSArIDYpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LAorCSAqIHRoaXMgc2hvd3MgdGhlIHRhYnMgYXQgdGhlIGJvdHRvbS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzaG93VGFicygpIHsKKwkJaWYgKGdldFBhZ2VDb3VudCgpID4gMSkgeworCQkJc2V0UGFnZVRleHQoMCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ1RhYkZvbGRlcikgeworCQkJCSgoQ1RhYkZvbGRlcilnZXRDb250YWluZXIoKSkuc2V0VGFiSGVpZ2h0KFNXVC5ERUZBVUxUKTsKKwkJCQlQb2ludCBwb2ludCA9IGdldENvbnRhaW5lcigpLmdldFNpemUoKTsKKwkJCQlnZXRDb250YWluZXIoKS5zZXRTaXplKHBvaW50LngsIHBvaW50LnkgLSA2KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdXNlZCB0byB0cmFjayB0aGUgYWN0aXZlIHZpZXdlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBwYWdlSW5kZXgpIHsKKwkJc3VwZXIucGFnZUNoYW5nZShwYWdlSW5kZXgpOworCisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgIT0gbnVsbCkgeworCQkJaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oY29udGVudE91dGxpbmVQYWdlLmdldFNlbGVjdGlvbigpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgaXMgaG93IHRoZSBmcmFtZXdvcmsgZGV0ZXJtaW5lcyB3aGljaCBpbnRlcmZhY2VzIHdlIGltcGxlbWVudC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7CisJCWlmIChrZXkuZXF1YWxzKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gc2hvd091dGxpbmVWaWV3KCkgPyBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSA6IG51bGw7CisJCX0KKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7CisJCQlyZXR1cm4gZ2V0UHJvcGVydHlTaGVldFBhZ2UoKTsKKwkJfQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IG91dGxpbmVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJQ29udGVudE91dGxpbmVQYWdlIGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIHsKKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSA9PSBudWxsKSB7CisJCQkvLyBUaGUgY29udGVudCBvdXRsaW5lIGlzIGp1c3QgYSB0cmVlLgorCQkJLy8KKwkJCWNsYXNzIE15Q29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgQ29udGVudE91dGxpbmVQYWdlIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOworCQkJCQljb250ZW50T3V0bGluZVZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCQkJCS8vIFNldCB1cCB0aGUgdHJlZSB2aWV3ZXIuCisJCQkJCS8vCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7CisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSk7CisKKwkJCQkJLy8gTWFrZSBzdXJlIG91ciBwb3B1cHMgd29yay4KKwkJCQkJLy8KKwkJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IoY29udGVudE91dGxpbmVWaWV3ZXIpOworCisJCQkJCWlmICghZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJCQkgIC8vIFNlbGVjdCB0aGUgcm9vdCBvYmplY3QgaW4gdGhlIHZpZXcuCisJCQkJCSAgLy8KKwkJCQkJICBjb250ZW50T3V0bGluZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworCQkJCQl9CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgbWFrZUNvbnRyaWJ1dGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlcikgeworCQkJCQlzdXBlci5tYWtlQ29udHJpYnV0aW9ucyhtZW51TWFuYWdlciwgdG9vbEJhck1hbmFnZXIsIHN0YXR1c0xpbmVNYW5hZ2VyKTsKKwkJCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsKKwkJCQl9CisJCQl9CisKKwkJCWNvbnRlbnRPdXRsaW5lUGFnZSA9IG5ldyBNeUNvbnRlbnRPdXRsaW5lUGFnZSgpOworCisJCQkvLyBMaXN0ZW4gdG8gc2VsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBpdCBpcyBhIHNwZWNpYWwgd2F5LgorCQkJLy8KKwkJCWNvbnRlbnRPdXRsaW5lUGFnZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKKwkJCQkobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQkJCSAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBoYW5kbGUgc2VsZWN0aW9ucyBjb3JyZWN0bHkuCisJCQkJCSAvLworCQkJCQkgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQkJCSBoYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCSB9CisJCQkJIH0pOworCQl9CisKKwkJcmV0dXJuIGNvbnRlbnRPdXRsaW5lUGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIHByb3BlcnR5IHNoZWV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7CisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7CisJCQlwcm9wZXJ0eVNoZWV0UGFnZSA9CisJCQkJbmV3IEV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2UoZWRpdGluZ0RvbWFpbikgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoTGlzdDw/PiBzZWxlY3Rpb24pIHsKKwkJCQkJCVRyaWdnZXJFZGl0b3IudGhpcy5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihzZWxlY3Rpb24pOworCQkJCQkJVHJpZ2dlckVkaXRvci50aGlzLnNldEZvY3VzKCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisJCQkJCQlzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7CisJCQkJCX0KKwkJCQl9OworCQkJcHJvcGVydHlTaGVldFBhZ2Uuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKKwkJfQorCisJCXJldHVybiBwcm9wZXJ0eVNoZWV0UGFnZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGRlYWxzIHdpdGggaG93IHdlIHdhbnQgc2VsZWN0aW9uIGluIHRoZSBvdXRsaW5lciB0byBhZmZlY3QgdGhlIG90aGVyIHZpZXdzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWlmIChzZWxlY3Rpb25WaWV3ZXIgIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJSXRlcmF0b3I8Pz4gc2VsZWN0ZWRFbGVtZW50cyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5pdGVyYXRvcigpOworCQkJaWYgKHNlbGVjdGVkRWxlbWVudHMuaGFzTmV4dCgpKSB7CisJCQkJLy8gR2V0IHRoZSBmaXJzdCBzZWxlY3RlZCBlbGVtZW50LgorCQkJCS8vCisJCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHMubmV4dCgpOworCisJCQkJQXJyYXlMaXN0PE9iamVjdD4gc2VsZWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudCk7CisJCQkJd2hpbGUgKHNlbGVjdGVkRWxlbWVudHMuaGFzTmV4dCgpKSB7CisJCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudHMubmV4dCgpKTsKKwkJCQl9CisKKwkJCQkvLyBTZXQgdGhlIHNlbGVjdGlvbiB0byB0aGUgd2lkZ2V0LgorCQkJCS8vCisJCQkJc2VsZWN0aW9uVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb25MaXN0KSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHRlc3RzIHRoZSBjb21tYW5kIHN0YWNrLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7CisJCXJldHVybiAoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLmlzU2F2ZU5lZWRlZCgpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSUVkaXRvclBhcnR9IGFuZCBzaW1wbHkgc2F2ZXMgdGhlIG1vZGVsIGZpbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisJCS8vIFNhdmUgb25seSByZXNvdXJjZXMgdGhhdCBoYXZlIGFjdHVhbGx5IGNoYW5nZWQuCisJCS8vCisJCWZpbmFsIE1hcDxPYmplY3QsIE9iamVjdD4gc2F2ZU9wdGlvbnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKKwkJc2F2ZU9wdGlvbnMucHV0KFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRCwgUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOworCisJCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtiZW5jaC4KKwkJLy8KKwkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9CisJCQluZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgeworCQkJCS8vIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IGdldHMgaW52b2tlZCB3aGVuIHRoZSBvcGVyYXRpb24gcnVucy4KKwkJCQkvLworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJCS8vIFNhdmUgdGhlIHJlc291cmNlcyB0byB0aGUgZmlsZSBzeXN0ZW0uCisJCQkJCS8vCisJCQkJCWJvb2xlYW4gZmlyc3QgPSB0cnVlOworCQkJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKSB7CisJCQkJCQlpZiAoKGZpcnN0IHx8ICFyZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSB8fCBpc1BlcnNpc3RlZChyZXNvdXJjZSkpICYmICFlZGl0aW5nRG9tYWluLmlzUmVhZE9ubHkocmVzb3VyY2UpKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJbG9uZyB0aW1lU3RhbXAgPSByZXNvdXJjZS5nZXRUaW1lU3RhbXAoKTsKKwkJCQkJCQkJcmVzb3VyY2Uuc2F2ZShzYXZlT3B0aW9ucyk7CisJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUaW1lU3RhbXAoKSAhPSB0aW1lU3RhbXApIHsKKwkJCQkJCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7CisJCQkJCQkJfQorCQkJCQkJCWZpcnN0ID0gZmFsc2U7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9OworCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gZmFsc2U7CisJCXRyeSB7CisJCQkvLyBUaGlzIHJ1bnMgdGhlIG9wdGlvbnMsIGFuZCBzaG93cyBwcm9ncmVzcy4KKwkJCS8vCisJCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7CisKKwkJCS8vIFJlZnJlc2ggdGhlIG5lY2Vzc2FyeSBzdGF0ZS4KKwkJCS8vCisJCQkoKEJhc2ljQ29tbWFuZFN0YWNrKWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLnNhdmVJc0RvbmUoKTsKKwkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgdGhhdCBzaG91bGRuJ3QuCisJCQkvLworCQkJQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7CisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhpcyByZXR1cm5zIHdoZXRoZXIgc29tZXRoaW5nIGhhcyBiZWVuIHBlcnNpc3RlZCB0byB0aGUgVVJJIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisJICogVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIFVSSSBjb252ZXJ0ZXIgZnJvbSB0aGUgZWRpdG9yJ3MgcmVzb3VyY2Ugc2V0IHRvIHRyeSB0byBvcGVuIGFuIGlucHV0IHN0cmVhbS4gCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNQZXJzaXN0ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbShyZXNvdXJjZS5nZXRVUkkoKSk7CisJCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKKwkJCQlyZXN1bHQgPSB0cnVlOworCQkJCXN0cmVhbS5jbG9zZSgpOworCQkJfQorCQl9CisJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBJZ25vcmUKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFRoaXMgYWx3YXlzIHJldHVybnMgdHJ1ZSBiZWNhdXNlIGl0IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogVGhpcyBhbHNvIGNoYW5nZXMgdGhlIGVkaXRvcidzIGlucHV0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgeworCQlTYXZlQXNEaWFsb2cgc2F2ZUFzRGlhbG9nID0gbmV3IFNhdmVBc0RpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7CisJCXNhdmVBc0RpYWxvZy5vcGVuKCk7CisJCUlQYXRoIHBhdGggPSBzYXZlQXNEaWFsb2cuZ2V0UmVzdWx0KCk7CisJCWlmIChwYXRoICE9IG51bGwpIHsKKwkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7CisJCQlpZiAoZmlsZSAhPSBudWxsKSB7CisJCQkJZG9TYXZlQXMoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpLCBuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGRvU2F2ZUFzKFVSSSB1cmksIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgeworCQkoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSkuc2V0VVJJKHVyaSk7CisJCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7CisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7CisJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0KKwkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpICE9IG51bGwgPworCQkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpIDoKKwkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworCQlkb1NhdmUocHJvZ3Jlc3NNb25pdG9yKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7CisJCXRyeSB7CisJCQlpZiAobWFya2VyLmdldFR5cGUoKS5lcXVhbHMoRVZhbGlkYXRvci5NQVJLRVIpKSB7CisJCQkJU3RyaW5nIHVyaUF0dHJpYnV0ZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoRVZhbGlkYXRvci5VUklfQVRUUklCVVRFLCBudWxsKTsKKwkJCQlpZiAodXJpQXR0cmlidXRlICE9IG51bGwpIHsKKwkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpQXR0cmlidXRlKTsKKwkJCQkJRU9iamVjdCBlT2JqZWN0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldEVPYmplY3QodXJpLCB0cnVlKTsKKwkJCQkJaWYgKGVPYmplY3QgIT0gbnVsbCkgeworCQkJCQkgIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zLnNpbmdsZXRvbihlZGl0aW5nRG9tYWluLmdldFdyYXBwZXIoZU9iamVjdCkpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCUNvcmVFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgc3RhcnR1cC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgeworCQlzZXRTaXRlKHNpdGUpOworCQlzZXRJbnB1dFdpdGhOb3RpZnkoZWRpdG9ySW5wdXQpOworCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOworCQlzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKHRoaXMpOworCQlzaXRlLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgeworCQlnZXRDb250cm9sKGdldEFjdGl2ZVBhZ2UoKSkuc2V0Rm9jdXMoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHJldHVybiB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKKwkJcmV0dXJuIGVkaXRvclNlbGVjdGlvbjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byBzZXQgdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4KKwkgKiBDYWxsaW5nIHRoaXMgcmVzdWx0IHdpbGwgbm90aWZ5IHRoZSBsaXN0ZW5lcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWVkaXRvclNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKworCQlmb3IgKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgOiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzKSB7CisJCQlsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7CisJCX0KKwkJc2V0U3RhdHVzTGluZU1hbmFnZXIoc2VsZWN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXNMaW5lTWFuYWdlcihJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBjdXJyZW50Vmlld2VyICE9IG51bGwgJiYgY3VycmVudFZpZXdlciA9PSBjb250ZW50T3V0bGluZVZpZXdlciA/CisJCQljb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyIDogZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7CisKKwkJaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJCUNvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS50b0xpc3QoKTsKKwkJCQlzd2l0Y2ggKGNvbGxlY3Rpb24uc2l6ZSgpKSB7CisJCQkJCWNhc2UgMDogeworCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9Ob09iamVjdFNlbGVjdGVkIikpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIDE6IHsKKwkJCQkJCVN0cmluZyB0ZXh0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcihhZGFwdGVyRmFjdG9yeSkuZ2V0VGV4dChjb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQiLCB0ZXh0KSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWRlZmF1bHQ6IHsKKwkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTXVsdGlPYmplY3RTZWxlY3RlZCIsIEludGVnZXIudG9TdHJpbmcoY29sbGVjdGlvbi5zaXplKCkpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZSgiIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gdGhlIHBsdWdpbidzIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7CisJCXJldHVybiBDb3JlRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXkpOworCX0KKworCS8qKgorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gcGx1Z2luLnByb3BlcnRpZXMsIG1ha2luZyBhIHN1YnN0aXR1dGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgeworCQlyZXR1cm4gQ29yZUVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5LCBuZXcgT2JqZWN0IFtdIHsgczEgfSk7CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcn0gdG8gaGVscCBmaWxsIHRoZSBjb250ZXh0IG1lbnVzIHdpdGggY29udHJpYnV0aW9ucyBmcm9tIHRoZSBFZGl0IG1lbnUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQkoKElNZW51TGlzdGVuZXIpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkpLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpIHsKKwkJcmV0dXJuIChFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKSB7CisJCXJldHVybiBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGlvbkJhcnMoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7CisJCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IGZhbHNlOworCisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOworCisJCWdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7CisKKwkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOworCisJCWlmIChnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGl2ZUVkaXRvcigpID09IHRoaXMpIHsKKwkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKG51bGwpOworCQl9CisKKwkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKKwkJCXByb3BlcnR5U2hlZXRQYWdlLmRpc3Bvc2UoKTsKKwkJfQorCisJCWlmIChjb250ZW50T3V0bGluZVBhZ2UgIT0gbnVsbCkgeworCQkJY29udGVudE91dGxpbmVQYWdlLmRpc3Bvc2UoKTsKKwkJfQorCisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG91dGxpbmUgdmlldyBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHNob3dPdXRsaW5lVmlldygpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvQWN0aXZhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL0FjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YThlMGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL0FjdGl2YXRvci5qYXZhCkBAIC0wLDAgKzEsMzk0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbG9yUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuRm9udFJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5Db2xvclByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlLkV4cGVyaW1lbnRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLm5ld21vZGlmaWVycGFnZS5Db21tb25OZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLm5ld21vZGlmaWVycGFnZS5HcmFwaE5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubmV3bW9kaWZpZXJwYWdlLkxhYmVsc05ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubmV3bW9kaWZpZXJwYWdlLlNlcXVlbmNlck5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLkxhYmVsc1Byb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnBlcnNwZWN0aXZlcy5TaW11bGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLldvcmtiZW5jaEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCisvKioKKyAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgorICovCitwdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7CisKKwkvKioKKwkgKiBUaGUgc3ltYm9saWMgaWRlbnRpZmllciBmb3IgdGhpcyBwbHVnLWluCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkiOyAvLyROT04tTkxTLTEkCisKKwkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgorCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47CisKKwkvLyBUaGUgU1dUIGNvbG9yIHJlZ2lzdHJ5CisJcHJpdmF0ZSBzdGF0aWMgQ29sb3JSZWdpc3RyeSBjb2xvclJlZ2lzdHJ5ID0gbnVsbDsKKworCS8vIFRoZSBTV1QgZm9udCByZWdpc3RyeQorCXByaXZhdGUgc3RhdGljIEZvbnRSZWdpc3RyeSBmb250UmVnaXN0cnkgPSBudWxsOworCisJLyoqCisJICogVGhlIGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBBY3RpdmF0b3IoKSB7CisJCXN1cGVyKCk7CisJCXBsdWdpbiA9IHRoaXM7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCisJICogCisJICogQHBhcmFtIGNvbnRleHQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCQluZXcgU2VxdWVuY2VyTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkoKTsKKwkJbmV3IEdyYXBoTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkoKTsKKwkJbmV3IExhYmVsc05ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5KCk7CisJCW5ldyBFeHBlcmltZW50RmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUZhY3RvcnkoKTsKKwkJbmV3IExhYmVsc1Byb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOworCQluZXcgQ29tbW9uTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkoKTsKKwkJCisJCS8vR2V0IHRoZSBleHRlbnNpb24gY29sb3IgcHJvdmlkZXJzIGFuZCBhZGQgdGhlbSB0byB0aGUgY29tcG9zZWQgZmFjdG9yeQorCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IAorCQkJUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLnN0ZW0udWkuY29sb3Jwcm92aWRlcnMiKTsKKwkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA6IGVsZW1lbnRzKSB7CisJCQlpZiAoIWVsZW1lbnQuaXNWYWxpZCgpKSB7CisJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJJbnZhbGlkIGNvbG9yIHByb3ZpZGVyIGV4dGVuc2lvbiIsIG51bGwpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLy9HZXQgdGhlIGJ1bmRsZSB0aGF0IGV4dGVuZGVkIHRoZSBleHRlbnNpb24gcG9pbnQKKwkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSk7CisJCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7CisJCQlTdHJpbmcgZmFjdG9yeSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJmYWN0b3J5Iik7CisJCQlTdHJpbmcgcHJvdmlkZXIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgicHJvdmlkZXIiKTsKKwkJCS8vVXNlIHRoZSBidW5kbGUncyBjbGFzcyBsb2FkZXIgdG8gbG9hZCB0aGUgY2xhc3NlcworCQkJQ2xhc3MgZmFjdG9yeUNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyhmYWN0b3J5KTsKKwkJCU9iamVjdCBmYWN0b3J5SW5zdGFuY2UgPSBmYWN0b3J5Q2xhc3MubmV3SW5zdGFuY2UoKTsKKwkJCUNsYXNzIHByb3ZpZGVyQ2xhc3MgPSBidW5kbGUubG9hZENsYXNzKHByb3ZpZGVyKTsKKwkJCS8vUmVnaXN0ZXIgdGhlIHNwZWNpZmljIGZhY3RvcnkgaW4gdGhlIGdlbmVyYWwgZmFjdG9yeQorCQkJQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkZEFkYXB0ZXJGYWN0b3J5KAorCQkJCQkoQWRhcHRlckZhY3RvcnkpZmFjdG9yeUluc3RhbmNlLCBwcm92aWRlckNsYXNzLCBuYW1lKTsKKwkJfQorCX0gLy8gc3RhcnQKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKKwkgKiAKKwkgKiBAcGFyYW0gY29udGV4dAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdG9wKGNvbnRleHQpOworCQlwbHVnaW4gPSBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UuCisJICovCisJcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb2xvciByZWdpc3RyeQorCSAqIAorCSAqIEByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGNvbG9yIHJlZ2lzdHJ5CisJICovCisJcHVibGljIENvbG9yUmVnaXN0cnkgZ2V0Q29sb3JSZWdpc3RyeSgpIHsKKwkJaWYgKGNvbG9yUmVnaXN0cnkgPT0gbnVsbCkgeworCQkJY29sb3JSZWdpc3RyeSA9IG5ldyBDb2xvclJlZ2lzdHJ5KCk7CisJCQlpbml0aWFsaXplQ29sb3JSZWdpc3RyeShjb2xvclJlZ2lzdHJ5KTsKKwkJfQorCQlyZXR1cm4gY29sb3JSZWdpc3RyeTsKKwl9IC8vIGdldENvbG9yUmVnaXN0cnkKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZvbnQgcmVnaXN0cnkKKwkgKiAKKwkgKiBAcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBmb250IHJlZ2lzdHJ5CisJICovCisJcHVibGljIEZvbnRSZWdpc3RyeSBnZXRGb250UmVnaXN0cnkoKSB7CisJCWlmIChmb250UmVnaXN0cnkgPT0gbnVsbCkgeworCQkJZm9udFJlZ2lzdHJ5ID0gbmV3IEZvbnRSZWdpc3RyeSgpOworCQkJaW5pdGlhbGl6ZUZvbnRSZWdpc3RyeShmb250UmVnaXN0cnkpOworCQl9CisJCXJldHVybiBmb250UmVnaXN0cnk7CisJfSAvLyBnZXRDb2xvclJlZ2lzdHJ5CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI2luaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnkpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUltYWdlUmVnaXN0cnkoSW1hZ2VSZWdpc3RyeSByZWdpc3RyeSkgeworLy8JCWZpbmFsIFN0cmluZyBJQ09OX1BBVEhfUFJFRklYID0gImljb25zL2Z1bGwvY3VzdG9tb2JqMTYvIjsgLy8kTk9OLU5MUy0xJAorCQlmaW5hbCBTdHJpbmcgSUNPTl9BQ1RJT05fUEFUSF9QUkVGSVggPSAiaWNvbnMvZnVsbC9hY3Rpb25zMTYvIjsgLy8kTk9OLU5MUy0xJAorCisJCWZpbmFsIFN0cmluZyBDVVNUT01fSUNPTl9QQVRIX1BSRUZJWDIgPSAiaWNvbnMvZnVsbC9jdXN0b21vYmoxNi8iOyAvLyROT04tTkxTLTEkQworCQkKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuQVVUT01BVElDX0VYUEVSSU1FTlRfSUNPTiwgaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKKwkJCQlQTFVHSU5fSUQsIENVU1RPTV9JQ09OX1BBVEhfUFJFRklYMiArICJBdXRvbWF0aWNFeHBlcmltZW50LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAorCisJCXJlZ2lzdHJ5LnB1dChJU2hhcmVkSW1hZ2VzLkRFQ09SQVRPUl9JQ09OLCBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKAorCQkJCVBMVUdJTl9JRCwgQ1VTVE9NX0lDT05fUEFUSF9QUkVGSVgyICsgIkRlY29yYXRvci5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5ERUNPUkFUT1JfRk9MREVSX0lDT04sIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCisJCQkJUExVR0lOX0lELCBDVVNUT01fSUNPTl9QQVRIX1BSRUZJWDIgKyAiRGVjb3JhdG9yTW9kZWxGaWxlLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAorCisJCXJlZ2lzdHJ5LnB1dChJU2hhcmVkSW1hZ2VzLkRZTkFNSUNfTEFCRUxfSUNPTiwKKwkJCQlpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgQ1VTVE9NX0lDT05fUEFUSF9QUkVGSVgyCisJCQkJCQkrICJEeW5hbWljTGFiZWwuZ2lmIikpOyAvLyROT04tTkxTLTEkCisJCQorCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5FREdFX0lDT04sIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCisJCQkJUExVR0lOX0lELCBDVVNUT01fSUNPTl9QQVRIX1BSRUZJWDIgKyAiRWRnZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5FWFBFUklNRU5UX0lDT04sIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCisJCQkJUExVR0lOX0lELCBDVVNUT01fSUNPTl9QQVRIX1BSRUZJWDIgKyAiRXhwZXJpbWVudC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCisKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuRVhQRVJJTUVOVF9GT0xERVJfSUNPTiwgaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKKwkJCQlQTFVHSU5fSUQsIENVU1RPTV9JQ09OX1BBVEhfUFJFRklYMiArICJFeHBlcmltZW50TW9kZWxGaWxlLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuR1JBUEhfSUNPTiwgaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKKwkJCQlQTFVHSU5fSUQsIENVU1RPTV9JQ09OX1BBVEhfUFJFRklYMiArICJHcmFwaC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5HUkFQSF9GT0xERVJfSUNPTiwKKwkJCQlpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgQ1VTVE9NX0lDT05fUEFUSF9QUkVGSVgyCisJCQkJCQkrICJHcmFwaE1vZGVsRmlsZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5NT0RFTF9JQ09OLCBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKAorCQkJCVBMVUdJTl9JRCwgQ1VTVE9NX0lDT05fUEFUSF9QUkVGSVgyICsgIk1vZGVsLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAorCisJCXJlZ2lzdHJ5LnB1dChJU2hhcmVkSW1hZ2VzLk1PREVMX0ZPTERFUl9JQ09OLAorCQkJCWltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBDVVNUT01fSUNPTl9QQVRIX1BSRUZJWDIKKwkJCQkJCSsgIk1vZGVsTW9kZWxGaWxlLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAorCisJCXJlZ2lzdHJ5LnB1dChJU2hhcmVkSW1hZ2VzLk1PRElGSUVSX0lDT04sIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCisJCQkJUExVR0lOX0lELCBDVVNUT01fSUNPTl9QQVRIX1BSRUZJWDIgKyAiTW9kaWZpZXIuZ2lmIikpOyAvLyROT04tTkxTLTEkCisKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuTU9ESUZJRVJfRk9MREVSX0lDT04sIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCisJCQkJUExVR0lOX0lELCBDVVNUT01fSUNPTl9QQVRIX1BSRUZJWDIgKyAiTW9kaWZpZXJNb2RlbEZpbGUuZ2lmIikpOyAvLyROT04tTkxTLTEkCisJCQorCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5OT0RFX0lDT04sIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCisJCQkJUExVR0lOX0lELCBDVVNUT01fSUNPTl9QQVRIX1BSRUZJWDIgKyAiTm9kZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5QUkVESUNBVEVfSUNPTiwgaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKKwkJCQlQTFVHSU5fSUQsIENVU1RPTV9JQ09OX1BBVEhfUFJFRklYMiArICJQcmVkaWNhdGUuZ2lmIikpOyAvLyROT04tTkxTLTEkCisJCQorCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5QUkVESUNBVEVfRk9MREVSX0lDT04sIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCisJCQkJUExVR0lOX0lELCBDVVNUT01fSUNPTl9QQVRIX1BSRUZJWDIgKyAiUHJlZGljYXRlTW9kZWxGaWxlLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAorCisJCXJlZ2lzdHJ5LnB1dChJU2hhcmVkSW1hZ2VzLlJFQ09SREVEX1NJTVVMQVRJT05fSUNPTiwgaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKKwkJCQlQTFVHSU5fSUQsIENVU1RPTV9JQ09OX1BBVEhfUFJFRklYMiArICJSZWNvcmRlZFNpbXVsYXRpb25zLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAorCisJCXJlZ2lzdHJ5LnB1dChJU2hhcmVkSW1hZ2VzLlJFQ09SREVEX1NJTVVMQVRJT05fRk9MREVSX0lDT04sIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCisJCQkJUExVR0lOX0lELCBDVVNUT01fSUNPTl9QQVRIX1BSRUZJWDIgKyAiUmVjb3JkZWRTaW11bGF0aW9uc01vZGVsRmlsZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCisJCXJlZ2lzdHJ5LnB1dChJU2hhcmVkSW1hZ2VzLlNDRU5BUklPX0lDT04sIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCisJCQkJUExVR0lOX0lELCBDVVNUT01fSUNPTl9QQVRIX1BSRUZJWDIgKyAiU2NlbmFyaW8uZ2lmIikpOyAvLyROT04tTkxTLTEkCisKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuU0NFTkFSSU9fRk9MREVSX0lDT04sCisJCQkJaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIENVU1RPTV9JQ09OX1BBVEhfUFJFRklYMgorCQkJCQkJKyAiU2NlbmFyaW9Nb2RlbEZpbGUuZ2lmIikpOyAvLyROT04tTkxTLTEkCisKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuU0VRVUVOQ0VSX0lDT04sIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCisJCQkJUExVR0lOX0lELCBDVVNUT01fSUNPTl9QQVRIX1BSRUZJWDIgKyAiU2VxdWVuY2VyLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAorCisJCXJlZ2lzdHJ5LnB1dChJU2hhcmVkSW1hZ2VzLlNFUVVFTkNFUl9GT0xERVJfSUNPTiwgaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKKwkJCQlQTFVHSU5fSUQsIENVU1RPTV9JQ09OX1BBVEhfUFJFRklYMiArICJTZXF1ZW5jZXJNb2RlbEZpbGUuZ2lmIikpOyAvLyROT04tTkxTLTEkCisKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuU1RBVElDX0xBQkVMX0lDT04sCisJCQkJaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIENVU1RPTV9JQ09OX1BBVEhfUFJFRklYMgorCQkJCQkJKyAiU3RhdGljTGFiZWwuZ2lmIikpOyAvLyROT04tTkxTLTEkCisKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuVFJJR0dFUl9JQ09OLCBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKAorCQkJCVBMVUdJTl9JRCwgQ1VTVE9NX0lDT05fUEFUSF9QUkVGSVgyICsgIlRyaWdnZXIuZ2lmIikpOyAvLyROT04tTkxTLTEkCisJCQorCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5UUklHR0VSX0ZPTERFUl9JQ09OLCBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKAorCQkJCVBMVUdJTl9JRCwgQ1VTVE9NX0lDT05fUEFUSF9QUkVGSVgyICsgIlRyaWdnZXJNb2RlbEZpbGUuZ2lmIikpOyAvLyROT04tTkxTLTEkCisKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuU1RFTV9QUk9KRUNUX0lDT04sCisJCQkJaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIENVU1RPTV9JQ09OX1BBVEhfUFJFRklYMgorCQkJCQkJKyAic3RlbS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5TVEVNX0VYUExPUkVSX1BST0pFQ1RfSUNPTiwKKwkJCQlpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgQ1VTVE9NX0lDT05fUEFUSF9QUkVGSVgyCisJCQkJCQkrICJTdGVtUHJvamVjdC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5TVEVNX0VYUExPUkVSX1ZJRVdfSUNPTiwKKwkJCQlpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgQ1VTVE9NX0lDT05fUEFUSF9QUkVGSVgyCisJCQkJCQkrICJzdGVtRXhwbG9yZXIuZ2lmIikpOyAvLyROT04tTkxTLTEkCisKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuU0lNVUxBVElPTl9DT05UUk9MX1ZJRVdfSUNPTiwKKwkJCQlpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgQ1VTVE9NX0lDT05fUEFUSF9QUkVGSVgyCisJCQkJCQkrICJzaW11bGF0aW9uQ29udHJvbFZpZXcuZ2lmIikpOyAvLyROT04tTkxTLTEkCisKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuU0lNVUxBVElPTl9DT05UUk9MX0lDT04sCisJCQkJaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIENVU1RPTV9JQ09OX1BBVEhfUFJFRklYMgorCQkJCQkJKyAic2ltdWxhdGlvbkNvbnRyb2wuZ2lmIikpOyAvLyROT04tTkxTLTEkCisKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuREVMRVRFX0ZJTEVfSUNPTiwgaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKKwkJCQlQTFVHSU5fSUQsIENVU1RPTV9JQ09OX1BBVEhfUFJFRklYMiArICJkZWxldGUuZ2lmIikpOyAvLyROT04tTkxTLTEkCisKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuU1RFTV9HUkFQSF9GSUxFX0lDT04sCisJCQkJaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIENVU1RPTV9JQ09OX1BBVEhfUFJFRklYMgorCQkJCQkJKyAiZ2VuZXJpY0ZpbGUuZ2lmIikpOyAvLyROT04tTkxTLTEkCisKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuU1RFTV9GT0xERVJfSUNPTiwKKwkJCQlpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgQ1VTVE9NX0lDT05fUEFUSF9QUkVGSVgyCisJCQkJCQkrICJTY2VuYXJpb01vZGVsRmlsZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5TVEVNX1NDRU5BUklPX0ZJTEVfSUNPTiwKKwkJCQlpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgQ1VTVE9NX0lDT05fUEFUSF9QUkVGSVgyCisJCQkJCQkrICJTY2VuYXJpb01vZGVsRmlsZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5SVU5fSUNPTiwgaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKKwkJCQlQTFVHSU5fSUQsIElDT05fQUNUSU9OX1BBVEhfUFJFRklYICsgInJ1bi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5QQVVTRV9JQ09OLCBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKAorCQkJCVBMVUdJTl9JRCwgSUNPTl9BQ1RJT05fUEFUSF9QUkVGSVggKyAicGF1c2UuZ2lmIikpOyAvLyROT04tTkxTLTEkCisKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuUkVTRVRfSUNPTiwgaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKKwkJCQlQTFVHSU5fSUQsIElDT05fQUNUSU9OX1BBVEhfUFJFRklYICsgInJlc2V0LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuUkVTVEFSVF9JQ09OLCBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKAorCQkJCVBMVUdJTl9JRCwgSUNPTl9BQ1RJT05fUEFUSF9QUkVGSVggKyAicmVzdGFydC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5TVEVQX0lDT04sIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCisJCQkJUExVR0lOX0lELCBJQ09OX0FDVElPTl9QQVRIX1BSRUZJWCArICJzdGVwLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAorCisJCXJlZ2lzdHJ5LnB1dChJU2hhcmVkSW1hZ2VzLlNUT1BfSUNPTiwgaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKKwkJCQlQTFVHSU5fSUQsIElDT05fQUNUSU9OX1BBVEhfUFJFRklYICsgInN0b3AuZ2lmIikpOyAvLyROT04tTkxTLTEkCisKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuRElTQUJMRURfUlVOX0lDT04sCisJCQkJaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIElDT05fQUNUSU9OX1BBVEhfUFJFRklYCisJCQkJCQkrICJkaXNhYmxlZFJ1bi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5ESVNBQkxFRF9QQVVTRV9JQ09OLAorCQkJCWltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBJQ09OX0FDVElPTl9QQVRIX1BSRUZJWAorCQkJCQkJKyAiZGlzYWJsZWRQYXVzZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5ESVNBQkxFRF9SRVNFVF9JQ09OLAorCQkJCWltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBJQ09OX0FDVElPTl9QQVRIX1BSRUZJWAorCQkJCQkJKyAiZGlzYWJsZWRSZXNldC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlyZWdpc3RyeS5wdXQoSVNoYXJlZEltYWdlcy5ESVNBQkxFRF9TVEVQX0lDT04sCisJCQkJaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIElDT05fQUNUSU9OX1BBVEhfUFJFRklYCisJCQkJCQkrICJkaXNhYmxlZFN0ZXAuZ2lmIikpOyAvLyROT04tTkxTLTEkCisKKwkJcmVnaXN0cnkucHV0KElTaGFyZWRJbWFnZXMuRElTQUJMRURfU1RPUF9JQ09OLAorCQkJCWltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBJQ09OX0FDVElPTl9QQVRIX1BSRUZJWAorCQkJCQkJKyAiZGlzYWJsZWRTdG9wLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAorCisJCXJlZ2lzdHJ5LnB1dChJU2hhcmVkSW1hZ2VzLk1BUF9JQ09OLCBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKAorCQkJCVBMVUdJTl9JRCwgQ1VTVE9NX0lDT05fUEFUSF9QUkVGSVgyICsgIm1hcC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKKworLy8JCXJlZ2lzdHJ5LnB1dChJU2hhcmVkSW1hZ2VzLlJFQ09SREVEX1NJTVVMQVRJT05fSUNPTiwgaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKKy8vCQkJCVBMVUdJTl9JRCwgQ1VTVE9NX0lDT05fUEFUSF9QUkVGSVgyICsgIlJlY29yZGVkU2ltdWxhdGlvbnMuZ2lmIikpOyAvLyROT04tTkxTLTEkCisJfSAvLyBpbml0aWFsaXplSW1hZ2VSZWdpc3RyeQorCisJLyoqCisJICogQWRkIFNXVCBjb2xvcnMgdG8gY29sb3IgcmVnaXN0cnkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29sb3JSZWdpc3RyeShDb2xvclJlZ2lzdHJ5IGNvbG9yUmVnaXN0cnkpIHsKKwkJLy8gUmVnaXN0ZXIgY29sb3JzIGluIHJlZ2lzdHJ5CisJCWNvbG9yUmVnaXN0cnkucHV0KElTaGFyZWRDb2xvcnMuR1JFRU4sIG5ldyBSR0IoNTUsIDI1NSwgNTApKTsKKwkJY29sb3JSZWdpc3RyeS5wdXQoSVNoYXJlZENvbG9ycy5ZRUxMT1csIG5ldyBSR0IoMjU1LCAyNTUsIDApKTsKKwkJY29sb3JSZWdpc3RyeS5wdXQoSVNoYXJlZENvbG9ycy5PUkFOR0UsIG5ldyBSR0IoMjU1LCAxNzAsIDMwKSk7CisJCWNvbG9yUmVnaXN0cnkucHV0KElTaGFyZWRDb2xvcnMuR1JBWSwgbmV3IFJHQigyMTcsIDIxNywgMjE3KSk7CisJCS8vIEFkZCBtb3JlIGNvbG9ycyBoZXJlCisJfSAvLyBpbml0aWFsaXplQ29sb3JSZWdpc3RyeQorCisJLyoqCisJICogQWRkIFNXVCBmb250cyB0byBmb250IHJlZ2lzdHJ5CisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZvbnRSZWdpc3RyeShGb250UmVnaXN0cnkgZm9udFJlZ2lzdHJ5KSB7CisJCWludCBmb250SGVpZ2h0ID0gSkZhY2VSZXNvdXJjZXMuZ2V0RGVmYXVsdEZvbnQoKS5nZXRGb250RGF0YSgpWzBdCisJCQkJLmdldEhlaWdodCgpOworCisJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKCJDb3VyaWVyIE5ldyIsIGZvbnRIZWlnaHQsIC8vJE5PTi1OTFMtMSQKKwkJCQlTV1QuTk9STUFMKTsKKwkJLy8gUmVnaXN0ZXIgY29sb3JzIGluIHJlZ2lzdHJ5CisJCWZvbnRSZWdpc3RyeS5wdXQoSVNoYXJlZEZvbnRzLkRFRkFVTFQsIG5ldyBGb250RGF0YVtdIHsgZm9udERhdGEgfSk7CisJCS8vIEFkZCBtb3JlIGNvbG9ycyBoZXJlCisJfSAvLyBpbml0aWFsaXplQ29sb3JSZWdpc3RyeQorCisJLyoqCisJICogTG9nIGFuIGVycm9yIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgdGV4dAorCSAqIEBwYXJhbSBleGNlcHRpb24KKwkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQlwbHVnaW4uZ2V0TG9nKCkubG9nKAorCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAorCQkJCQkJMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7CisJfSAvLyBsb2dFcnJvcgorCisJLyoqCisJICogTG9nIGluZm9ybWF0aW9uIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIGluZm9ybWF0aW9uIG1lc3NhZ2UgdGV4dAorCSAqIEBwYXJhbSBleGNlcHRpb24KKwkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dJbmZvcm1hdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQlwbHVnaW4uZ2V0TG9nKCkubG9nKAorCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCisJCQkJCQkwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKKwl9IC8vIGxvZ0luZm9ybWF0aW9uCisKKwkvKioKKwkgKiBAcGFyYW0gcGVyc3BlY3RpdmVJZAorCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSB0byBzd2l0Y2ggdG8KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc3dpdGNoVG9QZXJzcGVjdGl2ZShTdHJpbmcgcGVyc3BlY3RpdmVJZCkgeworCQlmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7CisJCXRyeSB7CisJCQl3b3JrYmVuY2guc2hvd1BlcnNwZWN0aXZlKAorCQkJCQlTaW11bGF0aW9uLklEX1NURU1fU0lNVUxBVElPTl9QRVJTUEVDVElWRSwgd29ya2JlbmNoCisJCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKKwkJfSBjYXRjaCAoV29ya2JlbmNoRXhjZXB0aW9uIGUpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiUHJvYmxlbSBzd2l0Y2hpbmcgdG8gUGVyc3BlY3RpdmUgd2l0aCBJRD1cIiIKKwkJCQkJKyBwZXJzcGVjdGl2ZUlkICsgIlwiIiwgZSk7CisJCX0KKwl9IC8vIHN3aXRjaFRvUGVyc3BlY3RpdmUKK30gLy8gQWN0aXZhdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL0lTaGFyZWRDb2xvcnMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvSVNoYXJlZENvbG9ycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNjA4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL0lTaGFyZWRDb2xvcnMuamF2YQpAQCAtMCwwICsxLDQyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGlkZW50aWZpZXJzIHVzZWQgdG8gbWFyayBTV1QgY29sb3JzIGFkZGVkIHRvIHRoaXMKKyAqIHBsdWctaW4ncyBjb2xvciByZWdpc3RyeS4gVGhlc2UgY29sb3JzIGFyZSBpbnRlbmRlZCB0byBiZSBzaGFyZWQgYnkKKyAqIHJlZmVyZW5jaW5nIHRoZSBjb2xvciByZWdpc3RyeSBhbmQgdXNpbmcgdGhlIGlkZW50aWZpZXJzIGRlZmluZWQgaGVyZSB0bworICogc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBjb2xvci4KKyAqLworcHVibGljIGludGVyZmFjZSBJU2hhcmVkQ29sb3JzIHsKKworCS8qKgorCSAqIENvbG9yIGdyZWVuIC0tIHVzZWQgYXMgYmFja2dyb3VuZCB3aGVuIHNpbXVsYXRpb24gaXMgcnVubmluZworCSAqLworCVN0cmluZyBHUkVFTiA9ICJncmVlbiI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvbG9yIG9yYW5nZSAtLSB1c2VkIGFzIGJhY2tncm91bmQgd2hlbiBzaW11bGF0aW9uIGlzIHJlc2V0CisJICovCisJU3RyaW5nIE9SQU5HRSA9ICJvcmFuZ2UiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb2xvciB5ZWxsb3cgLS0gdXNlZCBhcyBiYWNrZ3JvdW5kIHdoZW4gc2ltdWxhdGlvbiBpcyBwYXVzZWQKKwkgKi8KKwlTdHJpbmcgWUVMTE9XID0gInllbGxvdyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvbG9yIHllbGxvdyAtLSB1c2VkIGFzIGJhY2tncm91bmQgZm9yIHRleHQKKwkgKi8KKwlTdHJpbmcgR1JBWSA9ICJncmF5IjsgLy8kTk9OLU5MUy0xJAorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL0lTaGFyZWRGb250cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9JU2hhcmVkRm9udHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjI0YTA1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9JU2hhcmVkRm9udHMuamF2YQpAQCAtMCwwICsxLDI4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGlkZW50aWZpZXJzIHVzZWQgdG8gbWFyayBTV1QgZm9udHMgYWRkZWQgdG8gdGhpcworICogcGx1Zy1pbidzIGZvbnQgcmVnaXN0cnkuIFRoZXNlIGZvbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBzaGFyZWQgYnkgcmVmZXJlbmNpbmcKKyAqIHRoZSBmb250cyByZWdpc3RyeSBhbmQgdXNpbmcgdGhlIGlkZW50aWZpZXJzIGRlZmluZWQgaGVyZSB0byBzZWxlY3QgdGhlCisgKiBhcHByb3ByaWF0ZSBpbWFnZS4KKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIElTaGFyZWRGb250cyB7CisKKwkvKioKKwkgKiBEZWZhdWx0IGZvbnQgdXNlZCBpbiBzaW11bGF0aW9uIGNvbnRyb2wKKwkgKi8KKwlTdHJpbmcgREVGQVVMVCA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL0lTaGFyZWRJbWFnZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvSVNoYXJlZEltYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYzBmNjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL0lTaGFyZWRJbWFnZXMuamF2YQpAQCAtMCwwICsxLDI5NSBAQAorLy8gSVNoYXJlZEltYWdlcy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGlkZW50aWZpZXJzIHVzZWQgdG8gbWFyayBpbWFnZXMgYWRkZWQgdG8gdGhpcworICogcGx1Zy1pbidzIGltYWdlIHJlZ2lzdHJ5LiBUaGlzIGltYWdlcyBhcmUgaW50ZW5kZWQgdG8gYmUgc2hhcmVkIGJ5CisgKiByZWZlcmVuY2luZyB0aGUgcmVnaXN0cnkgYW5kIHVzaW5nIHRoZSBpZGVudGlmaWVycyBkZWZpbmVkIGhlcmUgdG8gc2VsZWN0IHRoZQorICogYXBwcm9wcmlhdGUgaW1hZ2UuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVNoYXJlZEltYWdlcyB7CisKKwkvKioKKwkgKiBUaGlzIGltYWdlIGlzIHRoZSBpY29uIHRoYXQgcmVwcmVzZW50cyBhbgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50fS4KKwkgKi8KKwlTdHJpbmcgQVVUT01BVElDX0VYUEVSSU1FTlRfSUNPTiA9ICJhdXRvbWF0aWNleHBlcmltZW50LmltYWdlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyBpbWFnZSBpcyB0aGUgaWNvbiB0aGF0IHJlcHJlc2VudHMgYW4KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcn0uCisJICovCisJU3RyaW5nIERFQ09SQVRPUl9JQ09OID0gImRlY29yYXRvci5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdGhhdCByZXByZXNlbnRzIGFuCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3J9LgorCSAqLworCVN0cmluZyBERUNPUkFUT1JfRk9MREVSX0lDT04gPSAiZGVjb3JhdG9yX21vZGVsX2ZpbGUuaW1hZ2UiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGlzIGltYWdlIGlzIHRoZSBpY29uIHRoYXQgcmVwcmVzZW50cyBhCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWx9IGluIGEKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBofS4KKwkgKi8KKwlTdHJpbmcgRFlOQU1JQ19MQUJFTF9JQ09OID0gImR5bmFtaWNfbGFiZWwuaW1hZ2UiOyAvLyROT04tTkxTLTEkCisKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdGhhdCByZXByZXNlbnRzIGFuCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlfSBpbiBhCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaH0uCisJICovCisJU3RyaW5nIEVER0VfSUNPTiA9ICJlZGdlLmltYWdlIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdGhhdCByZXByZXNlbnRzIGFuCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnR9LgorCSAqLworCVN0cmluZyBFWFBFUklNRU5UX0lDT04gPSAiZXhwZXJpbWVudC5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdGhhdCByZXByZXNlbnRzIGFuCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnR9LgorCSAqLworCVN0cmluZyBFWFBFUklNRU5UX0ZPTERFUl9JQ09OID0gImV4cGVyaW1lbnRfbW9kZWxfZmlsZS5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdGhhdCByZXByZXNlbnRzIGEKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBofS4KKwkgKi8KKwlTdHJpbmcgR1JBUEhfSUNPTiA9ICJncmFwaC5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdGhhdCByZXByZXNlbnRzIGEgZmlsZSB0aGF0IGNvbnRhaW5zIGEKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBofS4KKwkgKi8KKwlTdHJpbmcgR1JBUEhfRk9MREVSX0lDT04gPSAiZ3JhcGhfbW9kZWxfZmlsZS5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdGhhdCByZXByZXNlbnRzIGEKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsfS4KKwkgKi8KKwlTdHJpbmcgTU9ERUxfSUNPTiA9ICJtb2RlbC5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdGhhdCByZXByZXNlbnRzIGEgZmlsZSB0aGF0IGNvbnRhaW5zIGEKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsfS4KKwkgKi8KKwlTdHJpbmcgTU9ERUxfRk9MREVSX0lDT04gPSAibW9kZWxfbW9kZWxfZmlsZS5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdGhhdCByZXByZXNlbnRzIGEKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyfS4KKwkgKi8KKwlTdHJpbmcgTU9ESUZJRVJfSUNPTiA9ICJtb2RpZmllci5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBUaGlzIGltYWdlIGlzIHRoZSBpY29uIHRoYXQgcmVwcmVzZW50cyBhCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllcn0uCisJICovCisJU3RyaW5nIE1PRElGSUVSX0ZPTERFUl9JQ09OID0gIm1vZGlmaWVyX21vZGVsX2ZpbGUuaW1hZ2UiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGlzIGltYWdlIGlzIHRoZSBpY29uIHRoYXQgcmVwcmVzZW50cyBhCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlfSBpbiBhCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaH0uCisJICovCisJU3RyaW5nIE5PREVfSUNPTiA9ICJub2RlLmltYWdlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyBpbWFnZSBpcyB0aGUgaWNvbiB0aGF0IHJlcHJlc2VudHMgYW4KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGV9LgorCSAqLworCVN0cmluZyBQUkVESUNBVEVfSUNPTiA9ICJwcmVkaWNhdGUuaW1hZ2UiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogVGhpcyBpbWFnZSBpcyB0aGUgaWNvbiB0aGF0IHJlcHJlc2VudHMgYW4KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGV9LgorCSAqLworCVN0cmluZyBQUkVESUNBVEVfRk9MREVSX0lDT04gPSAicHJlZGljYXRlX21vZGVsX2ZpbGUuaW1hZ2UiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGlzIGltYWdlIGlzIHRoZSBpY29uIGFzc29jaWF0ZWQgd2l0aCByZWNvcmRlZAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9ufXMuCisJICovCisJU3RyaW5nIFJFQ09SREVEX1NJTVVMQVRJT05fSUNPTiA9ICJyZWNvcmRlZF9zaW11bGF0aW9uLmltYWdlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyBpbWFnZSBpcyB0aGUgaWNvbiBhc3NvY2lhdGVkIHdpdGggcmVjb3JkZWQKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn1zLgorCSAqLworCVN0cmluZyBSRUNPUkRFRF9TSU1VTEFUSU9OX0ZPTERFUl9JQ09OID0gInJlY29yZGVkX3NpbXVsYXRpb25fbW9kZWxfZmlsZS5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdGhhdCByZXByZXNlbnRzIGEKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvfS4KKwkgKi8KKwlTdHJpbmcgU0NFTkFSSU9fSUNPTiA9ICJzY2VuYXJpby5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdGhhdCByZXByZXNlbnRzIGEgZmlsZSB0aGF0IGNvbnRhaW5zIGEKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvfS4KKwkgKi8KKwlTdHJpbmcgU0NFTkFSSU9fRk9MREVSX0lDT04gPSAic2NlbmFyaW9fbW9kZWxfZmlsZS5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdGhhdCByZXByZXNlbnRzIGEge0BsaW5rIFNlcXVlbmNlcn0uCisJICovCisJU3RyaW5nIFNFUVVFTkNFUl9JQ09OID0gInNlcXVlbmNlci5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdGhhdCByZXByZXNlbnRzIGEge0BsaW5rIFNlcXVlbmNlcn0uCisJICovCisJU3RyaW5nIFNFUVVFTkNFUl9GT0xERVJfSUNPTiA9ICJzZXF1ZW5jZXJfbW9kZWxfZmlsZS5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBUaGlzIGltYWdlIGlzIHRoZSBpY29uIHRoYXQgcmVwcmVzZW50cyBhIHN0YXRpYworCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWx9IGluIGEKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBofS4KKwkgKi8KKwlTdHJpbmcgU1RBVElDX0xBQkVMX0lDT04gPSAic3RhdGljX2xhYmVsLmltYWdlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyBpbWFnZSBpcyB0aGUgaWNvbiB0aGF0IHJlcHJlc2VudHMgYW4KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuVHJpZ2dlcn0uCisJICovCisJU3RyaW5nIFRSSUdHRVJfSUNPTiA9ICJ0cmlnZ2VyLmltYWdlIjsgLy8kTk9OLU5MUy0xJAorCQorCisJLyoqCisJICogVGhpcyBpbWFnZSBpcyB0aGUgaWNvbiB0aGF0IHJlcHJlc2VudHMgYW4KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuVHJpZ2dlcn0uCisJICovCisJU3RyaW5nIFRSSUdHRVJfRk9MREVSX0lDT04gPSAidHJpZ2dlcl9tb2RlbF9maWxlLmltYWdlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyBpbWFnZSBpcyB0aGUgaWNvbiB1c2VkIHRvIHJlcHJlc2VudCBhIFNURU0gcHJvamVjdC4KKwkgKi8KKwlTdHJpbmcgU1RFTV9QUk9KRUNUX0lDT04gPSAic3RlbV9wcm9qZWN0LmltYWdlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyBpbWFnZSBpcyB0aGUgaWNvbiB0byByZXByZXNlbnQgYSBSVU4gc2ltdWxhdGlvbiBldmVudAorCSAqLworCVN0cmluZyBSVU5fSUNPTiA9ICJydW4uaW1hZ2UiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGlzIGltYWdlIGlzIHRoZSBpY29uIHRvIHJlcHJlc2VudCBhIFBBVVNFIHNpbXVsYXRpb24gZXZlbnQKKwkgKi8KKwlTdHJpbmcgUEFVU0VfSUNPTiA9ICJwYXVzZS5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdG8gcmVwcmVzZW50IGEgU1RFUCBzaW11bGF0aW9uIGV2ZW50CisJICovCisJU3RyaW5nIFNURVBfSUNPTiA9ICJzdGVwLmltYWdlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyBpbWFnZSBpcyB0aGUgaWNvbiB0byByZXByZXNlbnQgYSBSRVNFVCBzaW11bGF0aW9uIGV2ZW50CisJICovCisJU3RyaW5nIFJFU0VUX0lDT04gPSAicmVzZXQuaW1hZ2UiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGlzIGltYWdlIGlzIHRoZSBpY29uIHRvIHJlcHJlc2VudCBhIFNUT1Agc2ltdWxhdGlvbiBldmVudAorCSAqLworCVN0cmluZyBSRVNUQVJUX0lDT04gPSAicmVzdGFydC5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKwkKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdG8gcmVwcmVzZW50IGEgU1RPUCBzaW11bGF0aW9uIGV2ZW50CisJICovCisJU3RyaW5nIFNUT1BfSUNPTiA9ICJzdG9wLmltYWdlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyBpbWFnZSBpcyB0aGUgaWNvbiB0byByZXByZXNlbnQgYSBkaXNhYmxlZCBSVU4gc2ltdWxhdGlvbiBldmVudAorCSAqLworCVN0cmluZyBESVNBQkxFRF9SVU5fSUNPTiA9ICJkaXNhYmxlZF9ydW4uaW1hZ2UiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGlzIGltYWdlIGlzIHRoZSBpY29uIHRvIHJlcHJlc2VudCBhIGRpc2FibGVkIFBBVVNFIHNpbXVsYXRpb24gZXZlbnQKKwkgKi8KKwlTdHJpbmcgRElTQUJMRURfUEFVU0VfSUNPTiA9ICJkaXNhYmxlZF9wYXVzZS5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdG8gcmVwcmVzZW50IGEgZGlzYWJsZWQgU1RFUCBzaW11bGF0aW9uIGV2ZW50CisJICovCisJU3RyaW5nIERJU0FCTEVEX1NURVBfSUNPTiA9ICJkaXNhYmxlZF9zdGVwLmltYWdlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyBpbWFnZSBpcyB0aGUgaWNvbiB0byByZXByZXNlbnQgYSBkaXNhYmxlZCBSRVNFVCBzaW11bGF0aW9uIGV2ZW50CisJICovCisJU3RyaW5nIERJU0FCTEVEX1JFU0VUX0lDT04gPSAiZGlzYWJsZWRfcmVzZXQuaW1hZ2UiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGlzIGltYWdlIGlzIHRoZSBpY29uIHRvIHJlcHJlc2VudCBhIGRpc2FibGVkIFNUT1Agc2ltdWxhdGlvbiBldmVudAorCSAqLworCVN0cmluZyBESVNBQkxFRF9TVE9QX0lDT04gPSAiZGlzYWJsZWRfc3RvcC5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdG8gcmVwcmVzZW50IHRoZSBTVEVNIFByb2plY3QgRXhwbG9yZXIgVmlldworCSAqLworCVN0cmluZyBTVEVNX0VYUExPUkVSX1ZJRVdfSUNPTiA9ICJzdGVtX2V4cGxvcmVyLmltYWdlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyBpbWFnZSBpcyB0aGUgaWNvbiB0byByZXByZXNlbnQgYSBTVEVNIHByb2plY3QgaW4gdGhlIFNURU0gUHJvamVjdAorCSAqIEV4cGxvcmVyCisJICovCisJU3RyaW5nIFNURU1fRVhQTE9SRVJfUFJPSkVDVF9JQ09OID0gInN0ZW1fcHJvamVjdC5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdG8gcmVwcmVzZW50IGEgZGVsZXRlIGZpbGUvZm9sZGVyIG9wZXJhdGlvbiBpbgorCSAqIFNURU0gUHJvamVjdCBFeHBsb3JlcgorCSAqLworCVN0cmluZyBERUxFVEVfRklMRV9JQ09OID0gImRlbGV0ZS5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gdGhhdCBpZGVudGlmaWVzIHRoZSBzaW11bGF0aW9uIGNvbnRyb2wgdmlldworCSAqLworCVN0cmluZyBTSU1VTEFUSU9OX0NPTlRST0xfVklFV19JQ09OID0gInNpbXVsYXRpb25fY29udHJvbF92aWV3LmltYWdlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyBpbWFnZSBpcyB0aGUgaWNvbiBhc3NvY2lhdGVkIHdpdGggYSBzaW11bGF0aW9uIGNvbnRyb2wKKwkgKi8KKwlTdHJpbmcgU0lNVUxBVElPTl9DT05UUk9MX0lDT04gPSAic2ltdWxhdGlvbl9jb250cm9sLmltYWdlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyBpbWFnZSBpcyB0aGUgaWNvbiBhc3NvY2lhdGVkIHdpdGgKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvfSBmaWxlcy4KKwkgKi8KKwlTdHJpbmcgU1RFTV9TQ0VOQVJJT19GSUxFX0lDT04gPSAic2NlbmFyaW9fZmlsZS5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gYXNzb2NpYXRlZCB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaH0gZmlsZXMuCisJICovCisJU3RyaW5nIFNURU1fR1JBUEhfRklMRV9JQ09OID0gImdlbmVyaWNfZmlsZS5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gYXNzb2NpYXRlZCB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbH0gZmlsZXMuCisJICovCisJU3RyaW5nIFNURU1fRk9MREVSX0lDT04gPSAic2NlbmFyaW9fRmlsZS5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaW1hZ2UgaXMgdGhlIGljb24gYXNzb2NpYXRlZCB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbH0gZmlsZXMuCisJICovCisJU3RyaW5nIE1BUF9JQ09OID0gIm1hcC5pbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8vIC8qKgorCS8vICogVGhpcyBpbWFnZSBpcyB0aGUgaWNvbiBhc3NvY2lhdGVkIHdpdGggZmlsZXMgdGhhdCBzdG9yZSByZWNvcmRlZCB7QGxpbmsKKwkvLyAqIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259cy4KKwkvLyAqLworCS8vCVN0cmluZyBSRUNPUkRFRF9TSU1VTEFUSU9OX0ZJTEVfSUNPTiA9ICJyZWNvcmRlZF9zaW11bGF0aW9uX0ZpbGUuaW1hZ2UiOyAvLyROT04tTkxTLTEkCisKK30gLy8gSVNoYXJlZEltYWdlcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9VdGlsaXR5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL1V0aWxpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjczM2YzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9VdGlsaXR5LmphdmEKQEAgLTAsMCArMSwyNzEgQEAKKy8vIFV0aWxpdHkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5MYWJlbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGNvbW1vbiB1dGlsaXR5IG1ldGhvZHMgdXNlZCBpbiB0aGUgU1RFTSBVSS4KKyAqLworcHVibGljIGNsYXNzIFV0aWxpdHkgeworCisJLy8gcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBudWxsOworCisJLyoqCisJICogQHJldHVybiBhIExpc3Qgb2YgdGhlIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UgdGhhdCBoYXZlIFNURU0gUHJvamVjdAorCSAqICAgICAgICAgIm5hdHVyZSIKKwkgKiAKKwkgKiBAc2VlIENvbnN0YW50cyNJRF9TVEVNX1BST0pFQ1RfTkFUVVJFCisJICovCisJcHVibGljIHN0YXRpYyBMaXN0PElQcm9qZWN0PiBnZXRTVEVNUHJvamVjdHNGcm9tV29ya3NwYWNlKCkgeworCQlyZXR1cm4gZ2V0U1RFTVByb2plY3RzRnJvbVdvcmtzcGFjZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkpOworCX0gLy8gZ2V0U1RFTVByb2plY3RzRnJvbVdvcmtzcGFjZQorCisJLyoqCisJICogQHBhcmFtIHdvcmtzcGFjZQorCSAqICAgICAgICAgICAgdGhlIHdvcmtzcGFjZSB0byBzZWFyY2ggZm9yIFNURU0gUHJvamVjdHMKKwkgKiBAcmV0dXJuIGEgTGlzdCBvZiB0aGUgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZSB0aGF0IGhhdmUgU1RFTSBQcm9qZWN0CisJICogICAgICAgICAibmF0dXJlIgorCSAqIAorCSAqIEBzZWUgQ29uc3RhbnRzI0lEX1NURU1fUFJPSkVDVF9OQVRVUkUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIExpc3Q8SVByb2plY3Q+IGdldFNURU1Qcm9qZWN0c0Zyb21Xb3Jrc3BhY2UoCisJCQlmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSkgeworCQlmaW5hbCBMaXN0PElQcm9qZWN0PiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3Q+KCk7CisJCWZpbmFsIElQcm9qZWN0W10gcHJvamVjdHMgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7CisJCWZvciAoZmluYWwgSVByb2plY3QgcHJvamVjdCA6IHByb2plY3RzKSB7CisJCQkvLyBJcyBpdCBhIFNURU0gcHJvamVjdD8KKwkJCWlmIChpc1NURU1Qcm9qZWN0KHByb2plY3QpKSB7CisJCQkJLy8gWWVzCisJCQkJcmV0VmFsdWUuYWRkKHByb2plY3QpOworCQkJfQorCQl9IC8vIGZvciBlYWNoIHByb2plY3QKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0U1RFTVByb2plY3RzRnJvbVdvcmtzcGFjZQorCisJLyoqCisJICogQHBhcmFtIHByb2plY3QKKwkgKiAgICAgICAgICAgIGFuIEVjbGlwc2UgcHJvamVjdAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb2plY3QgaGFzIFNURU0gcHJvamVjdCBuYXR1cmUKKwkgKiAKKwkgKiBAc2VlIENvbnN0YW50cyNJRF9TVEVNX1BST0pFQ1RfTkFUVVJFCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzU1RFTVByb2plY3QoZmluYWwgSVByb2plY3QgcHJvamVjdCkgeworCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisJCXRyeSB7CisJCQlmb3IgKGZpbmFsIFN0cmluZyBuYXR1cmUgOiBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0TmF0dXJlSWRzKCkpIHsKKwkJCQkvLyBTVEVNIE5hdHVyZT8KKwkJCQlpZiAobmF0dXJlLmVxdWFscyhDb25zdGFudHMuSURfU1RFTV9QUk9KRUNUX05BVFVSRSkpIHsKKwkJCQkJLy8gWWVzCisJCQkJCXJldFZhbHVlID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSAvLyBmb3IgZWFjaCBuYXR1cmUKKwkJfSBjYXRjaCAoZmluYWwgQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkvLyBOb3QgdGhpcyBwcm9qZWN0CisJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQl9IC8vIGZvciBlYWNoIG5hdHVyZQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBpc1NURU1Qcm9qZWN0CisKKwkvKioKKwkgKiBAcGFyYW0gZmlsZQorCSAqICAgICAgICAgICAgYSBmaWxlIHdpdGggYW4gPGNvZGU+SWRlbnRpZmlhYmxlPC9jb2RlPgorCSAqIEByZXR1cm4gdGhlIDxjb2RlPklkZW50aWZpYWJsZTwvY29kZT4gZGUtc2VyaWFsaXplZCBmcm9tIHRoZSBmaWxlLCBvcgorCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisJICovCisJcHVibGljIHN0YXRpYyBJZGVudGlmaWFibGUgZ2V0SWRlbnRpZmlhYmxlKGZpbmFsIElGaWxlIGZpbGUpIHsKKwkJZmluYWwgVVJJIGZpbGVVUkkgPSBVUkkuY3JlYXRlRmlsZVVSSShmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7OworCQlyZXR1cm4gb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlV0aWxpdHkuZ2V0SWRlbnRpZmlhYmxlKGZpbGVVUkkpOworCX0gLy8gZ2V0SWRlbnRpZmlhYmxlCisKKwkKKwkKKwkKKworCS8qKgorCSAqIEBwYXJhbSBsYWJlbFVSSQorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBVUkl9IG9mIGEge0BsaW5rIExhYmVsfQorCSAqIEByZXR1cm4gdGhlIHtAbGluayBMYWJlbH0gaW5zdGFuY2UsIG9yIG51bGwgaWYgbm90IGZvdW5kCisJICogCisJICogc3RlbTovL29yZy5lY2xpcHNlLnN0ZW0vbGFiZWwvcG9wdWxhdGlvbi9BRkcvMi9odW1hbi8yMDA2L0FGLUJEUy1HMDEwMDAxCisJICogICAgICAgIAorCSAqIAorCSAqLworCXB1YmxpYyBzdGF0aWMgTGFiZWwgZ2V0TGFiZWwoZmluYWwgVVJJIGxhYmVsVVJJKSB7CisJCUxhYmVsIHJldFZhbHVlID0gbnVsbDsKKworCQkvLyBJcyBpdCBhbiBhcmVhIGxhYmVsPworCQlpZiAoaXNBcmVhTGFiZWwobGFiZWxVUkkpKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIFVSSSBhcmVhR3JhcGhVUkkgPSBjcmVhdGVBcmVhR3JhcGhVUkkobGFiZWxVUkkpOworCQkJZmluYWwgR3JhcGggYXJlYUdyYXBoID0gKEdyYXBoKSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuVXRpbGl0eS5nZXRJZGVudGlmaWFibGUoYXJlYUdyYXBoVVJJKTsKKwkJCXJldFZhbHVlID0gYXJlYUdyYXBoLmdldE5vZGVMYWJlbChsYWJlbFVSSSk7CisJCX0gLy8gaWYgYXJlYQorCQkvLyBJcyBpdCBhIHBvcHVsYXRpb24gbGFiZWw/CisJCWVsc2UgaWYgKGlzUG9wdWxhdGlvbkxhYmVsKGxhYmVsVVJJKSkgeworCQkJZmluYWwgVVJJIHBvcHVsYXRpb25HcmFwaFVSSSA9IGNyZWF0ZVBvcHVsYXRpb25HcmFwaFVSSShsYWJlbFVSSSk7CisJCQlmaW5hbCBHcmFwaCBwb3B1bGF0aW9uR3JhcGggPSAoR3JhcGgpIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5VdGlsaXR5LmdldElkZW50aWZpYWJsZShwb3B1bGF0aW9uR3JhcGhVUkkpOworCQkJcmV0VmFsdWUgPSBwb3B1bGF0aW9uR3JhcGguZ2V0Tm9kZUxhYmVsKGxhYmVsVVJJKTsKKwkJfSAvLyBpZiBwb3B1bGF0aW9uCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0TGFiZWwKKworCS8qKgorCSAqIEBwYXJhbSBsYWJlbFVSSQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHtAbGluayBVUkl9IGlzIGZvciBhbiBhcmVhIGxhYmVsCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0FyZWFMYWJlbChmaW5hbCBVUkkgbGFiZWxVUkkpIHsKKwkJcmV0dXJuIGV4dHJhY3RMYWJlbE5hbWUobGFiZWxVUkkudG9TdHJpbmcoKSkuZXF1YWxzKCJhcmVhIik7CisJfQorCisJLyoqCisJICogQHBhcmFtIGxhYmVsVVJJCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUge0BsaW5rIFVSSX0gaXMgZm9yIGFuIHBvcHVsYXRpb24gbGFiZWwKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUG9wdWxhdGlvbkxhYmVsKGZpbmFsIFVSSSBsYWJlbFVSSSkgeworCQlyZXR1cm4gZXh0cmFjdExhYmVsTmFtZShsYWJlbFVSSS50b1N0cmluZygpKS5lcXVhbHMoInBvcHVsYXRpb24iKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbGFiZWxVUkkKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgVVJJfSBvZiB0aGUgZmlsZSB0aGF0IHRoZSBncmFwaCBjb250YWluaW5nIHRoZQorCSAqICAgICAgICAge0BsaW5rIExhYmVsfSB3aXRoIHRoZSBsYWJlbFVSSSB3b3VsZCBiZSBzZXJpYWxpemVkIGluCisJICovCisJcHJpdmF0ZSBzdGF0aWMgVVJJIGNyZWF0ZUFyZWFHcmFwaFVSSShmaW5hbCBVUkkgbGFiZWxVUkkpIHsKKwkJCisJCWZpbmFsIFN0cmluZyBwcmVmaXggPSBVUkkuY3JlYXRlUGxhdGZvcm1QbHVnaW5VUkkob3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5BY3RpdmF0b3IuUExVR0lOX0lELCBmYWxzZSkudG9TdHJpbmcoKTsKKwkJLy9maW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoInBsYXRmb3JtOi9wbHVnaW4vIiArIG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuQWN0aXZhdG9yLlBMVUdJTl9JRCArICIvcmVzb3VyY2VzL2RhdGEiKTsKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHByZWZpeCArICIvcmVzb3VyY2VzL2RhdGEiKTsKKworCQlzYi5hcHBlbmQoIi9jb3VudHJ5LyIpOworCQkvLyBFeHRyYWN0IHRoZSBsYWJlbCBuYW1lLiBDdXJyZW50bHkgdGhpcyBvbmx5IHdvcmtzIGZvciBhcmVhCisJCWZpbmFsIFN0cmluZyB1cmlTdHJpbmcgPSBsYWJlbFVSSS50b1N0cmluZygpOworCQlmaW5hbCBTdHJpbmcgbGFiZWxOYW1lID0gZXh0cmFjdExhYmVsTmFtZSh1cmlTdHJpbmcpOworCQlmaW5hbCBTdHJpbmcgaXNvS2V5ID0gZXh0cmFjdElTT0tleSh1cmlTdHJpbmcsIGxhYmVsTmFtZSk7CisJCWZpbmFsIFN0cmluZyBsZXZlbCA9IGV4dHJhY3RJU09MZXZlbCh1cmlTdHJpbmcsIGlzb0tleSk7CisJCXNiLmFwcGVuZChpc29LZXkpOworCQlzYi5hcHBlbmQoIi8iKTsKKwkJZmluYWwgU3RyaW5nIGZpbGVOYW1lID0gY3JlYXRlQXJlYUdyYXBoRmlsZU5hbWUoaXNvS2V5LCBsZXZlbCwgbGFiZWxOYW1lKTsKKwkJc2IuYXBwZW5kKGZpbGVOYW1lKTsKKwkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoc2IudG9TdHJpbmcoKSk7CisJfSAvLyBjcmVhdGVHcmFwaFVSSQorCisJcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlUG9wdWxhdGlvbkdyYXBoVVJJKGZpbmFsIFVSSSBsYWJlbFVSSSkgeworCQkKKwkJZmluYWwgU3RyaW5nIHByZWZpeCA9IFVSSS5jcmVhdGVQbGF0Zm9ybVBsdWdpblVSSShvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LnBvcHVsYXRpb24uaHVtYW4uQWN0aXZhdG9yLlBMVUdJTl9JRCwgZmFsc2UpLnRvU3RyaW5nKCk7CisJCS8vZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwbGF0Zm9ybTovcGx1Z2luLyIgKyBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LnBvcHVsYXRpb24uaHVtYW4uQWN0aXZhdG9yLlBMVUdJTl9JRCArICIvcmVzb3VyY2VzL2RhdGEiKTsKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHByZWZpeCArICIvcmVzb3VyY2VzL2RhdGEiKTsKKworCQlzYi5hcHBlbmQoIi9jb3VudHJ5LyIpOworCQkvLyBFeHRyYWN0IHRoZSBsYWJlbCBuYW1lLiBDdXJyZW50bHkgdGhpcyBvbmx5IHdvcmtzIGZvciBhcmVhCisJCWZpbmFsIFN0cmluZyB1cmlTdHJpbmcgPSBsYWJlbFVSSS50b1N0cmluZygpOworCQlmaW5hbCBTdHJpbmcgbGFiZWxOYW1lID0gZXh0cmFjdExhYmVsTmFtZSh1cmlTdHJpbmcpOworCQlmaW5hbCBTdHJpbmcgaXNvS2V5ID0gZXh0cmFjdElTT0tleSh1cmlTdHJpbmcsIGxhYmVsTmFtZSk7CisJCWZpbmFsIFN0cmluZyBsZXZlbCA9IGV4dHJhY3RJU09MZXZlbCh1cmlTdHJpbmcsIGlzb0tleSk7CisJCWZpbmFsIFN0cmluZyBwb3B1bGF0aW9uTmFtZSA9IGV4dHJhY3RQb3B1bGF0aW9uTmFtZSh1cmlTdHJpbmcsIGxldmVsKTsKKwkJZmluYWwgU3RyaW5nIGRhdGUgPSBleHRyYWN0UG9wdWxhdGlvbkRhdGUodXJpU3RyaW5nLCBwb3B1bGF0aW9uTmFtZSk7CisJCXNiLmFwcGVuZChpc29LZXkpOworCQlzYi5hcHBlbmQoIi8iKTsKKwkJc2IuYXBwZW5kKGNyZWF0ZVBvcHVsYXRpb25HcmFwaEZpbGVOYW1lKGlzb0tleSwgbGV2ZWwsIGxhYmVsTmFtZSwKKwkJCQlwb3B1bGF0aW9uTmFtZSwgZGF0ZSkpOworCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShzYi50b1N0cmluZygpKTsKKwl9IC8vIGNyZWF0ZVBvcHVsYXRpb25HcmFwaFVSSQorCisJLyoqCisJICogQHBhcmFtIHVyaVN0cmluZworCSAqIEBwYXJhbSBwb3B1bGF0aW9uTmFtZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXh0cmFjdFBvcHVsYXRpb25EYXRlKFN0cmluZyB1cmlTdHJpbmcsCisJCQlTdHJpbmcgcG9wdWxhdGlvbk5hbWUpIHsKKwkJZmluYWwgaW50IGluZGV4ID11cmlTdHJpbmcuaW5kZXhPZihwb3B1bGF0aW9uTmFtZSk7CisJCWZpbmFsIFN0cmluZyB0ZW1wID0gdXJpU3RyaW5nLnN1YnN0cmluZyhpbmRleCtwb3B1bGF0aW9uTmFtZS5sZW5ndGgoKSsxKTsKKwkJZmluYWwgaW50IGluZGV4MiA9IHRlbXAuaW5kZXhPZigiLyIpOworCQlyZXR1cm4gdGVtcC5zdWJzdHJpbmcoMCwgaW5kZXgyKTsKKwl9IC8vIGV4dHJhY3RQb3B1bGF0aW9uRGF0ZQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyZWF0ZVBvcHVsYXRpb25HcmFwaEZpbGVOYW1lKGZpbmFsIFN0cmluZyBpc29LZXksCisJCQlmaW5hbCBTdHJpbmcgbGV2ZWwsIEBTdXBwcmVzc1dhcm5pbmdzICgidW51c2VkIikgZmluYWwgU3RyaW5nIGxhYmVsTmFtZSwKKwkJCWZpbmFsIFN0cmluZyBwb3B1bGF0aW9uTmFtZSwgZmluYWwgU3RyaW5nIGRhdGUpIHsKKwkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGlzb0tleSk7CisJCXNiLmFwcGVuZCgiXyIpOworCQlzYi5hcHBlbmQobGV2ZWwpOworCQlzYi5hcHBlbmQoIl8iKTsKKwkJc2IuYXBwZW5kKHBvcHVsYXRpb25OYW1lKTsKKwkJc2IuYXBwZW5kKCJfIik7CisJCXNiLmFwcGVuZChkYXRlKTsKKwkJc2IuYXBwZW5kKCJfIik7CisJCXNiLmFwcGVuZCgicG9wdWxhdGlvbi5ncmFwaCIpOworCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0gLy8gY3JlYXRlUG9wdWxhdGlvbkdyYXBoRmlsZU5hbWUKKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBleHRyYWN0UG9wdWxhdGlvbk5hbWUoZmluYWwgU3RyaW5nIHVyaVN0cmluZywgU3RyaW5nIGxldmVsKSB7CisJCWZpbmFsIGludCBpbmRleCA9IHVyaVN0cmluZy5pbmRleE9mKGxldmVsKTsKKwkJZmluYWwgU3RyaW5nIHRlbXAgPSB1cmlTdHJpbmcuc3Vic3RyaW5nKGluZGV4K2xldmVsLmxlbmd0aCgpKzEpOworCQlmaW5hbCBpbnQgaW5kZXgyID0gdGVtcC5pbmRleE9mKCIvIik7CisJCXJldHVybiB0ZW1wLnN1YnN0cmluZygwLGluZGV4Mik7CisJfSAvLyBleHRyYWN0UG9wdWxhdGlvbk5hbWUKKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBleHRyYWN0SVNPTGV2ZWwoZmluYWwgU3RyaW5nIHVyaVN0cmluZywKKwkJCWZpbmFsIFN0cmluZyBpc29LZXkpIHsKKwkJZmluYWwgaW50IGluZGV4ID0gdXJpU3RyaW5nLmluZGV4T2YoaXNvS2V5KSArIGlzb0tleS5sZW5ndGgoKSArIDE7CisJCXJldHVybiB1cmlTdHJpbmcuc3Vic3RyaW5nKGluZGV4LCBpbmRleCArIDEpOworCX0gLy8gZXh0cmFjdElTT0xldmVsCisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlQXJlYUdyYXBoRmlsZU5hbWUoZmluYWwgU3RyaW5nIGlzb0tleSwKKwkJCWZpbmFsIFN0cmluZyBsZXZlbCwgZmluYWwgU3RyaW5nIGxhYmVsTmFtZSkgeworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoaXNvS2V5KTsKKwkJc2IuYXBwZW5kKCJfIik7CisJCXNiLmFwcGVuZChsZXZlbCk7CisJCXNiLmFwcGVuZCgiXyIpOworCQlzYi5hcHBlbmQobGFiZWxOYW1lKTsKKwkJc2IuYXBwZW5kKCIuZ3JhcGgiKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfSAvLyBjcmVhdGVGaWxlTmFtZQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4dHJhY3RJU09LZXkoZmluYWwgU3RyaW5nIHVyaVN0cmluZywKKwkJCWZpbmFsIFN0cmluZyBsYWJlbE5hbWUpIHsKKwkJZmluYWwgaW50IHN0YXJ0SW5kZXggPSB1cmlTdHJpbmcuaW5kZXhPZihsYWJlbE5hbWUpICsgMQorCQkJCSsgbGFiZWxOYW1lLmxlbmd0aCgpOworCQlmaW5hbCBpbnQgZW5kSW5kZXggPSBzdGFydEluZGV4ICsgMzsKKworCQlyZXR1cm4gdXJpU3RyaW5nLnN1YnN0cmluZyhzdGFydEluZGV4LCBlbmRJbmRleCk7CisJfSAvLyBleHRyYWN0SVNPS2V5CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXh0cmFjdExhYmVsTmFtZShmaW5hbCBTdHJpbmcgdXJpU3RyaW5nKSB7CisJCWZpbmFsIFN0cmluZyB1cmlTdWZmaXggPSB1cmlTdHJpbmcuc3Vic3RyaW5nKHVyaVN0cmluZworCQkJCS5pbmRleE9mKExhYmVsLlVSSV9UWVBFX0xBQkVMX1NFR01FTlQpCisJCQkJKyBMYWJlbC5VUklfVFlQRV9MQUJFTF9TRUdNRU5ULmxlbmd0aCgpICsgMSk7CisJCXJldHVybiB1cmlTdWZmaXguc3Vic3RyaW5nKDAsIHVyaVN1ZmZpeC5pbmRleE9mKCIvIikpOworCX0gLy8gZXh0cmFjdExhYmVsTmFtZQorCit9IC8vIFV0aWxpdHkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvQWJzdHJhY3RDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvQWJzdHJhY3RDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWE0MWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9BYnN0cmFjdENvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8vIEFic3RyYWN0Q29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC51dGlsLkdyYXBoQWRhcHRlckZhY3Rvcnk7CisKKy8qKgorICogVGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyB0aGF0IENvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBzaG91bGQgZXh0ZW5kLgorICogSXQgaG9sZHMgdGhlIGNvbW1vbiBpbmZvcm1hdGlvbiBmb3IgYWxsIGNvbG9yIHByb3ZpZGVycyBhbmQgaGFzIGZldyBhYnN0cmFjdCBtZXRob2RzCisgKiB0aGF0IHRoZSBjb25jcmV0ZSBjbGFzcyBzaG91bGQgb3ZlcnJpZGUuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEdyYXBoQWRhcHRlckZhY3RvcnkKKwlpbXBsZW1lbnRzIElDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnksIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgeworCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnV0aWwuR3JhcGhBZGFwdGVyRmFjdG9yeSNpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSk7CQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9BYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9BYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMGFkYzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL0Fic3RyYWN0UmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwyNjcgQEAKKy8vIEFic3RyYWN0UmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuU3RyaW5nQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5NYXBzQ29sb3JzUHJlZmVyZW5jZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkRldmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKKworLyoqCisgKiBUaGlzIGlzIGFuIGFic3RyYWN0IGNsYXNzIHRoYXQgUmVsYXRpdmUgVmFsdWUgQ29sb3IgUHJvdmlkZXIgQWRhcHRlciBzaG91bGQgZXh0ZW5kLgorICogSXQgaG9sZHMgdGhlIGNvbW1vbiBpbmZvcm1hdGlvbiBmb3IgYWxsIGNvbG9yIHByb3ZpZGVycyBhbmQgaGFzIGZldyBhYnN0cmFjdCBtZXRob2RzCisgKiB0aGF0IHRoZSBjb25jcmV0ZSBjbGFzcyBzaG91bGQgb3ZlcnJpZGUuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlciBleHRlbmRzIENvbG9yUHJvdmlkZXJBZGFwdGVyCisJCWltcGxlbWVudHMgUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXIgeworCQorCS8qKgorCSAqIEhvbGRzIHRoZSB7QGxpbmsgQ29sb3J9IGZvciByZWxhdGl2ZSB2YWx1ZSBvZiAxCisJICovCisJcHJpdmF0ZSBDb2xvciBtYXhfRmlsbENvbG9yOworCS8qKgorCSAqIEhvbGRzIHRoZSB7QGxpbmsgQ29sb3J9IGZvciByZWxhdGl2ZSB2YWx1ZXMgYmV0d2VlbiAwLjggYW5kIDEKKwkgKi8KKwlwcml2YXRlIENvbG9yIHJhbmdlXzA4XzFfRmlsbENvbG9yOworCS8qKgorCSAqIEhvbGRzIHRoZSB7QGxpbmsgQ29sb3J9IGZvciByZWxhdGl2ZSB2YWx1ZXMgYmV0d2VlbiAwLjYgYW5kIDAuOAorCSAqLworCXByaXZhdGUgQ29sb3IgcmFuZ2VfMDZfMDhfRmlsbENvbG9yOworCS8qKgorCSAqIEhvbGRzIHRoZSB7QGxpbmsgQ29sb3J9IGZvciByZWxhdGl2ZSB2YWx1ZXMgYmV0d2VlbiAwLjQgYW5kIDAuNgorCSAqLworCXByaXZhdGUgQ29sb3IgcmFuZ2VfMDRfMDZfRmlsbENvbG9yOworCS8qKgorCSAqIEhvbGRzIHRoZSB7QGxpbmsgQ29sb3J9IGZvciByZWxhdGl2ZSB2YWx1ZXMgYmV0d2VlbiAwLjIgYW5kIDAuNAorCSAqLworCXByaXZhdGUgQ29sb3IgcmFuZ2VfMDJfMDRfRmlsbENvbG9yOworCS8qKgorCSAqIEhvbGRzIHRoZSB7QGxpbmsgQ29sb3J9IGZvciByZWxhdGl2ZSB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAwLjIKKwkgKi8KKwlwcml2YXRlIENvbG9yIHJhbmdlXzBfMDJfRmlsbENvbG9yOworCS8qKgorCSAqIEhvbGRzIHRoZSB7QGxpbmsgQ29sb3J9IGZvciByZWxhdGl2ZSB2YWx1ZXMgb2YgMAorCSAqLworCXByb3RlY3RlZCBDb2xvciB6ZXJvX0ZpbGxDb2xvcjsKKwkvKioKKwkgKiBIb2xkcyB0aGUgY3VycmVudCBmb3JlZ3JvdW5kIHtAbGluayBDb2xvcn0gKHRoZSBiYXNlIGNvbG9yIGZvciBBbHBoYUNvbXBvc2l0ZSkKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sb3IgZm9yZWdyb3VuZEZpbGxDb2xvcjsJCisJCisJLyoqCisJICogSG9sZHMgdGhlIGN1cnJlbnQgYWxwaGEgdmFsdWUge0BsaW5rIENvbG9yfSAoZm9yIEFscGhhQ29tcG9zaXRlKQorCSAqIGRlZmF1bHQgaXMgMjU1CisJICovCisJcHJvdGVjdGVkIGludCBhbHBoYT0yNTU7CQorCQorCS8qKgorCSAqIEhvbGRzIHRoZSBkZWZhdWx0IGJhY2tncm91bmQge0BsaW5rIENvbG9yfSAodGhlIGJhc2UgY29sb3IgZm9yIEFscGhhQ29tcG9zaXRlKQorCSAqLworCXB1YmxpYyBDb2xvciBiYWNrZ3JvdW5kRmlsbENvbG9yOwkKKwkvKioKKwkgKiBUaGUgdGhyZXNob2xkIHVuZGVyIHdoaWNoIHZhbHVlcyBhcmUgY29uc2lkZXJlZCB6ZXJvCisJICovCisJcHJvdGVjdGVkIGZpbmFsIGZsb2F0IFpFUk9fUkVMQVRJVkVfVkFMVUVfVEhSRVNIT0xEID0gMC4wMDAwMDAwMDFmOworCS8qKgorCSAqIFJlZmVyZW5jZSB0byB0aGUgc2VsZWN0ZWQge0BsaW5rIERlY29yYXRvcn0KKwkgKi8KKwlwcm90ZWN0ZWQgRGVjb3JhdG9yIHNlbGVjdGVkRGVjb3JhdG9yID0gbnVsbDsKKwkvKioKKwkgKiBSZWZlcmVuY2UgdG8gdGhlIHNlbGVjdGVkIHtAbGluayBEZWNvcmF0b3J9CisJICovCisJcHJvdGVjdGVkIFN0cmluZyBzZWxlY3RlZFBvcHVsYXRpb25JZGVudGlmaWVyID0gbnVsbDsKKwkvKioKKwkgKiBJbnN0YW5jZSBvZiBhIHJlbGF0aXZlIHZhbHVlIHByb3ZpZGVyCisJICovCisJcHJvdGVjdGVkIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXIgcnZwID0gbnVsbDsKKwkvKioKKwkgKiBDdXJyZW50IGRldmljZQorCSAqLworCXByb3RlY3RlZCBEZXZpY2UgZGV2aWNlID0gbnVsbDsKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBBYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlcigpIHsKKwkJdXBkYXRlQ29sb3JzRnJvbVByZWZlcmVuY2VzKCk7CisJfSAvLyBBYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlcgorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5Db2xvclByb3ZpZGVyI2dldENvbG9yKERldmljZSkKKwkgKi8KKwlwdWJsaWMgQ29sb3IgZ2V0Q29sb3IoRGV2aWNlIGRldmljZSkgeworCQlkb3VibGUgcmVsYXRpdmVWYWx1ZSA9IGdldFJlbGF0aXZlVmFsdWUoKTsKKwkJdGhpcy5kZXZpY2UgPSBkZXZpY2U7CisJCXJldHVybiBnZXRDb2xvckZvclJlbGF0aXZlVmFsdWUocmVsYXRpdmVWYWx1ZSk7CisJfSAvLyBnZXRDb2xvcgorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5Db2xvclByb3ZpZGVyI3VwZGF0ZUdDKEdDKQorCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0ZUdDKEdDIGdjVG9VcGRhdGUpIHsKKwkJdGhpcy51cGRhdGVHQyhnY1RvVXBkYXRlLCAxLjBmLCBmYWxzZSk7CisJfSAvLyBzZXRHMkRDb2xvcgorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5Db2xvclByb3ZpZGVyI3VwZGF0ZUdDKEdDLCBmbG9hdCwgYm9vbGVhbikKKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGVHQyhHQyBnY1RvVXBkYXRlLCAKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKWZsb2F0IGdhaW5GYWN0b3IsIAorCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpYm9vbGVhbiB1c2VMb2dTY2FsaW5nKSB7CisJCS8vSWYgdGhlIGNvbmNyZXRlIGNvbG9yIHByb3ZpZGVyIHVzZXMgdGhlIGdhaW5GYWN0b3IgYW5kL29yIHVzZUxvZ1NjYWxpbmcgcGFyYW1ldGVycworCQkvL3RoZW4gaXQgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHdpdGggaXRzIGltcGxlbWVudGF0aW9uCisJCUNvbG9yIGZvcmVncm91bmQgPSBnZXRDb2xvcihnY1RvVXBkYXRlLmdldERldmljZSgpKTsKKwkJZ2NUb1VwZGF0ZS5zZXRCYWNrZ3JvdW5kKGZvcmVncm91bmQpOworCX0gLy8gc2V0RzJEQ29sb3IKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXIjZ2V0UmVsYXRpdmVWYWx1ZSgpCisJICovCisJYWJzdHJhY3QgcHVibGljIGZsb2F0IGdldFJlbGF0aXZlVmFsdWUoKTsKKwkKKwkvKioKKwkgKiBUaGUgbWV0aG9kIHJldHVybnMgdGhlIHtAbGluayBDb2xvcn0gdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgcmVsYXRpdmUgdmFsdWUuCisJICogCisJICogQHBhcmFtIHJlbGF0aXZlVmFsdWUgdGhlIHJlbGF0aXZlIHZhbHVlCisJICogQHJldHVybiB0aGUgbWF0Y2hpbmcge0BsaW5rIENvbG9yfQorCSAqLworCXByb3RlY3RlZCBDb2xvciBnZXRDb2xvckZvclJlbGF0aXZlVmFsdWUoZmluYWwgZG91YmxlIHJlbGF0aXZlVmFsdWUpIHsKKwkJQ29sb3IgcmV0VmFsdWUgPSBkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKTsKKwkJdXBkYXRlQ29sb3JzRnJvbVByZWZlcmVuY2VzKCk7CisJCWlmIChyZWxhdGl2ZVZhbHVlID09IDEpIHsKKwkJCXJldFZhbHVlID0gbWF4X0ZpbGxDb2xvcjsKKwkJfQorCQllbHNlIGlmIChyZWxhdGl2ZVZhbHVlID4gMC44KSB7CisJCQlyZXRWYWx1ZSA9IHJhbmdlXzA4XzFfRmlsbENvbG9yOworCQl9IAorCQllbHNlIGlmIChyZWxhdGl2ZVZhbHVlID4gMC42KSB7CisJCQkvLyBZZXMKKwkJCXJldFZhbHVlID0gcmFuZ2VfMDZfMDhfRmlsbENvbG9yOworCQl9IC8vIGlmCisJCWVsc2UgaWYgKHJlbGF0aXZlVmFsdWUgPiAwLjQpIHsKKwkJCXJldFZhbHVlID0gcmFuZ2VfMDRfMDZfRmlsbENvbG9yOworCQl9CisJCWVsc2UgaWYgKHJlbGF0aXZlVmFsdWUgPiAwLjIpIHsKKwkJCXJldFZhbHVlID0gcmFuZ2VfMDJfMDRfRmlsbENvbG9yOworCQl9CisJCWVsc2UgaWYgKHJlbGF0aXZlVmFsdWUgPiBaRVJPX1JFTEFUSVZFX1ZBTFVFX1RIUkVTSE9MRCkgeworCQkJcmV0VmFsdWUgPSByYW5nZV8wXzAyX0ZpbGxDb2xvcjsKKwkJfQorCQllbHNlIGlmIChyZWxhdGl2ZVZhbHVlIDw9IFpFUk9fUkVMQVRJVkVfVkFMVUVfVEhSRVNIT0xEKSB7CisJCQlyZXRWYWx1ZSA9IHplcm9fRmlsbENvbG9yOworCQl9CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0Q29sb3JGb3JSZWxhdGl2ZVZhbHVlCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLkNvbG9yUHJvdmlkZXJBZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCXJldHVybiB0eXBlID09IFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyLmNsYXNzOworCX0gLy8gaXNBZGFwdGVyRm9yVHlwZQorCQorCS8qKgorCSAqIFRoZSBtZXRob2Qgd2lsbCBjb252ZXJ0IHRoZSBSR0Igc3RyaW5nIGludG8ge0BsaW5rIENvbG9yfQorCSAqIEBwYXJhbSByZ2JTdHJpbmcgdGhlIFJHQiBzdHJpbmcKKwkgKiBAcmV0dXJuIHRoZSBtYXRjaGluZyB7QGxpbmsgQ29sb3J9CisJICovCisJcHJpdmF0ZSBDb2xvciBnZXRDb2xvckZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHJnYlN0cmluZykgeworCQlpZiAocmdiU3RyaW5nLmVxdWFscygiIikpIHsKKwkJCXJldHVybiBkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKTsKKwkJfQorCQlSR0IgcmdiID0gU3RyaW5nQ29udmVydGVyLmFzUkdCKHJnYlN0cmluZyk7CisJCXJldHVybiBuZXcgQ29sb3IoZGV2aWNlLCByZ2IucmVkLCByZ2IuZ3JlZW4sIHJnYi5ibHVlKTsKKwl9IC8vIGdldENvbG9yRnJvbVN0cmluZworCQorCS8qKgorCSAqIFRoZSBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIGNvbG9ycyBmaWVsZHMgZm9yIHRoZSB2YWx1ZSByYW5nZXMgZnJvbSB0aGUgcHJlZmVyZW5jZXMgcGFnZS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlQ29sb3JzRnJvbVByZWZlcmVuY2VzKCkgeworCQlmaW5hbCBQcmVmZXJlbmNlcyBwcmVmcyA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJbWF4X0ZpbGxDb2xvciA9IGdldENvbG9yRnJvbVN0cmluZyhwcmVmcy5nZXRTdHJpbmcoUmVsYXRpdmVWYWx1ZUNvbG9yUHJlZmVyZW5jZXMuRk9SRUdST1VORF9DT0xPUl9NQVhJTVVNX1JFTEFUSVZFX1ZBTFVFX0lEKSk7CisJCXJhbmdlXzA4XzFfRmlsbENvbG9yID0gZ2V0Q29sb3JGcm9tU3RyaW5nKHByZWZzLmdldFN0cmluZyhSZWxhdGl2ZVZhbHVlQ29sb3JQcmVmZXJlbmNlcy5GT1JFR1JPVU5EX0NPTE9SX1JBTkdFXzVfSUQpKTsKKwkJcmFuZ2VfMDZfMDhfRmlsbENvbG9yID0gZ2V0Q29sb3JGcm9tU3RyaW5nKHByZWZzLmdldFN0cmluZyhSZWxhdGl2ZVZhbHVlQ29sb3JQcmVmZXJlbmNlcy5GT1JFR1JPVU5EX0NPTE9SX1JBTkdFXzRfSUQpKTsKKwkJcmFuZ2VfMDRfMDZfRmlsbENvbG9yID0gZ2V0Q29sb3JGcm9tU3RyaW5nKHByZWZzLmdldFN0cmluZyhSZWxhdGl2ZVZhbHVlQ29sb3JQcmVmZXJlbmNlcy5GT1JFR1JPVU5EX0NPTE9SX1JBTkdFXzNfSUQpKTsKKwkJcmFuZ2VfMDJfMDRfRmlsbENvbG9yID0gZ2V0Q29sb3JGcm9tU3RyaW5nKHByZWZzLmdldFN0cmluZyhSZWxhdGl2ZVZhbHVlQ29sb3JQcmVmZXJlbmNlcy5GT1JFR1JPVU5EX0NPTE9SX1JBTkdFXzJfSUQpKTsKKwkJcmFuZ2VfMF8wMl9GaWxsQ29sb3IgPSBnZXRDb2xvckZyb21TdHJpbmcocHJlZnMuZ2V0U3RyaW5nKFJlbGF0aXZlVmFsdWVDb2xvclByZWZlcmVuY2VzLkZPUkVHUk9VTkRfQ09MT1JfUkFOR0VfMV9JRCkpOworCQl6ZXJvX0ZpbGxDb2xvciA9IGdldENvbG9yRnJvbVN0cmluZyhwcmVmcy5nZXRTdHJpbmcoUmVsYXRpdmVWYWx1ZUNvbG9yUHJlZmVyZW5jZXMuRk9SRUdST1VORF9DT0xPUl9aRVJPX1JFTEFUSVZFX1ZBTFVFX0lEKSk7CisJCWZvcmVncm91bmRGaWxsQ29sb3IgPSBnZXRDb2xvckZyb21TdHJpbmcocHJlZnMuZ2V0U3RyaW5nKE1hcHNDb2xvcnNQcmVmZXJlbmNlUGFnZS5GT1JFR1JPVU5EX0NPTE9SX0lEKSk7CisJCWJhY2tncm91bmRGaWxsQ29sb3IgPSBnZXRDb2xvckZyb21TdHJpbmcocHJlZnMuZ2V0U3RyaW5nKE1hcHNDb2xvcnNQcmVmZXJlbmNlUGFnZS5CQUNLR1JPVU5EX0NPTE9SX0lEKSk7CisJfSAvLyB1cGRhdGVDb2xvcnNGcm9tUHJlZmVyZW5jZXMKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuQ29sb3JQcm92aWRlciNzZXRTZWxlY3RlZERlY29yYXRvcihvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkRGVjb3JhdG9yKERlY29yYXRvciBzZWxlY3RlZERlY29yYXRvcikgeworCQl0aGlzLnNlbGVjdGVkRGVjb3JhdG9yID0gc2VsZWN0ZWREZWNvcmF0b3I7CisJfSAvLyBzZXRTZWxlY3RlZERlY29yYXRvcgorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5Db2xvclByb3ZpZGVyI3NldFNlbGVjdGVkRGVjb3JhdG9yKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IpCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRQb3B1bGF0aW9uSWRlbnRpZmllcihTdHJpbmcgc2VsZWN0ZWRJZCkgeworCQl0aGlzLnNlbGVjdGVkUG9wdWxhdGlvbklkZW50aWZpZXIgPSBzZWxlY3RlZElkOworCX0gLy8gc2V0U2VsZWN0ZWREZWNvcmF0b3IKKwkKKwkKKwkvKioKKwkgKiBNZXRob2Qgd2lsbCBzZXQgdGhlIHRhcmdldCBvYmplY3QgYXQgdGhlIGluc3RhbmNlIG9mIHtAbGluayBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJ9LgorCSAqIEBwYXJhbSB0YXJnZXQgVGhlIG5ldyB0YXJnZXQgb2JqZWN0CisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0UlZQVGFyZ2V0KE5vdGlmaWVyIHRhcmdldCkgeworCQlpZiAocnZwID09IG51bGwpIHsKKwkJCXJ2cCA9IChSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyKVJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHRhcmdldCwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyLmNsYXNzKTsKKwkJfQorCQllbHNlIHsKKwkJCXJ2cC5zZXRUYXJnZXQodGFyZ2V0KTsKKwkJfQorCX0gLy8gc2V0UlZQVGFyZ2V0CisJCisJCisJLyoqCisJICogCisJICogQHJldHVybiB0aGUgY3VycmVudCBmaWxsIGNvbG9yCisJICovCisJcHVibGljIENvbG9yIGdldEJhY2tncm91bmRGaWxsQ29sb3IoKSB7CisJCXJldHVybiBiYWNrZ3JvdW5kRmlsbENvbG9yOworCX0KKwkKKwkvKioKKwkgKiAKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIENvbG9yIGdldEZvcmVncm91bmRGaWxsQ29sb3IoKSB7CisJCXJldHVybiBmb3JlZ3JvdW5kRmlsbENvbG9yOworCX0KKworCS8qKgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgYWxwaGEKKwkgKi8KKwlwdWJsaWMgaW50IGdldEFscGhhKCkgeworCQlyZXR1cm4gYWxwaGE7CisJfQorCQorfSAvLyBBYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvQWJzdHJhY3RSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL0Fic3RyYWN0UmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMWYwYTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL0Fic3RyYWN0UmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvLyBBYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyB0aGF0IFJlbGF0aXZlIFZhbHVlIENvbG9yIFByb3ZpZGVyIEFkYXB0ZXIgRmFjdG9yaWVzIHNob3VsZCBleHRlbmQuCisgKiBJdCBob2xkcyB0aGUgY29tbW9uIGluZm9ybWF0aW9uIGZvciBhbGwgY29sb3IgcHJvdmlkZXJzIGFuZCBoYXMgZmV3IGFic3RyYWN0IG1ldGhvZHMKKyAqIHRoYXQgdGhlIGNvbmNyZXRlIGNsYXNzIHNob3VsZCBvdmVycmlkZS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSAKKwlleHRlbmRzIEFic3RyYWN0Q29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKKwkKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBwcm9wZXJ0aWVzIGNvbXBvc2l0ZSB0aGF0IHdpbGwgYmUgY29udHJpYnV0ZWQgdG8gdGhlIHZpZXcKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIHByb3BlcnRpZXNDb21wb3NpdGU7CisJLyoqCisJICogQSBsaXN0IG9mIHtAbGluayBQcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyfXMgdG8gYmUgbm90aWZpZWQgYWJvdXQKKwkgKiBwcm9wZXJ0eSBzZWxlY3Rpb24gZXZlbnRzCisJICovCisJcHJpdmF0ZSBmaW5hbCBMaXN0PFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXI+IHByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXI+KCk7CisJLyoqCisJICogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCB7QGxpbmsgSXRlbVByb3BlcnR5RGVzY3JpcHRvcn0KKwkgKi8KKwlwcm90ZWN0ZWQgSXRlbVByb3BlcnR5RGVzY3JpcHRvciBzZWxlY3RlZFByb3BlcnR5ID0gbnVsbDsKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuQWJzdHJhY3RDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXIuY2xhc3M7CisJfSAvLyBpc0ZhY3RvcnlGb3JUeXBlCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudXRpbC5HcmFwaEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUdyYXBoQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhBZGFwdGVyKCkgewkJCisJCXJldHVybiBjcmVhdGVOb2RlQWRhcHRlcigpOworCX0gLy8gY3JlYXRlR3JhcGhBZGFwdGVyCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkjZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKKwkgKi8KKwlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfSAvLyBnZXRSb290QWRhcHRlckZhY3RvcnkKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSNzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KQorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50KSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwl9IC8vIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuSUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9wZXJ0aWVzQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgaW50LCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yKQorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBDb21wb3NpdGUgY3JlYXRlUHJvcGVydGllc0NvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBpbnQgc3R5bGUsIGZpbmFsIERlY29yYXRvciBzZWxlY3RlZERlY29yYXRvcik7CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLklDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQ29sb3JzTGVnZW5kQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgaW50KQorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBDb21wb3NpdGUgY3JlYXRlQ29sb3JzTGVnZW5kQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSk7CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLklDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkjZ2V0UHJvcGVydGllc0NvbXBvc2l0ZSgpCisJICovCisJcHVibGljIENvbXBvc2l0ZSBnZXRQcm9wZXJ0aWVzQ29tcG9zaXRlKCkgeworCQlyZXR1cm4gcHJvcGVydGllc0NvbXBvc2l0ZTsKKwl9IC8vIGdldFByb3BlcnRpZXNDb21wb3NpdGUKKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcmVuY2VWYWx1ZShmaW5hbCBTdHJpbmcgcHJlZklkKSB7CisJCWZpbmFsIFByZWZlcmVuY2VzIHByZWZzID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCQlyZXR1cm4gcHJlZnMuZ2V0U3RyaW5nKHByZWZJZCk7CisJfSAvLyBnZXRQcmVmZXJlbmNlVmFsdWUKKwkKKwkvKioKKwkgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgd2lzaCB0byBiZSBub3RpZmllZAorCSAqIHdoZW5ldmVyIGEgcHJvcGVydHkgaXMgc2VsZWN0ZWQgaW4gdGhpcyB3aWRnZXQuCisJICovCisJcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyIHsKKwkJLyoqCisJCSAqIEBwYXJhbSBzZWxlY3RlZFByb3BlcnR5CisJCSAqLworCQl2b2lkIHByb3BlcnR5U2VsZWN0ZWQoSXRlbVByb3BlcnR5RGVzY3JpcHRvciBzZWxlY3RlZFByb3BlcnR5KTsKKwl9IC8vIFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIKKwkKKwkvKioKKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyKAorCQkJZmluYWwgUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworCQlwcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0gLy8gYWRkUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcgorCisJLyoqCisJICogQHBhcmFtIGxpc3RlbmVyCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcigKKwkJCWZpbmFsIFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJcHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9IC8vIHJlbW92ZVByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIKKworCS8qKgorCSAqIEBwYXJhbSBzZWxlY3RlZFByb3BlcnR5CisJICovCisJcHVibGljIHZvaWQgZmlyZVByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIoSXRlbVByb3BlcnR5RGVzY3JpcHRvciBzZWxlY3RlZFByb3BlcnR5KSB7CisJCWZvciAoZmluYWwgUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXJzKSB7CisJCQlsaXN0ZW5lci5wcm9wZXJ0eVNlbGVjdGVkKHNlbGVjdGVkUHJvcGVydHkpOworCQl9IC8vIGZvciBlYWNoIFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIKKwl9IC8vIGZpcmVQcm9wZXJ0eVNlbGVjdGlvbkV2ZW50CisJCit9IC8vIEFic3RyYWN0UmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvQXJlYVJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL0FyZWFSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MTg0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL0FyZWFSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8vIEFyZWFSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHdpbGwgcHJvdmlkZSBhbiBhcmVhIHZhbHVlIGZvciBhCisgKiBzcGVjaWZpYyBhZGFwdGVkIG9iamVjdC4KKyAqLworcHVibGljIGludGVyZmFjZSBBcmVhUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXIgZXh0ZW5kcyBSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlciB7CisJLy9NYXJrZXIgaW50ZXJmYWNlCQorfS8vIEFyZWFSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9BcmVhUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL0FyZWFSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjIzNjY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9BcmVhUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLy8gQXJlYVJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkFyZWFMYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubm9kZXMuUmVnaW9uOworCisvKioKKyAqIFRoaXMgY2xhc3MgYWRhcHRzIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZX0gb2JqZWN0cyB0bworICogPGNvZGU+QXJlYVJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyPC9jb2RlPiBvYmplY3QuCisgKi8KK3B1YmxpYyBjbGFzcyBBcmVhUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyIAorCWV4dGVuZHMgQWJzdHJhY3RSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIgeworCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIERvdWJsZT4gYXJlYVZhbHVlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEb3VibGU+KCk7CisJCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgQXJlYVJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlcigpIHsKKwkJc3VwZXIoKTsKKwl9IC8vIEFyZWFSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuQWJzdHJhY3RSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIjZ2V0UmVsYXRpdmVWYWx1ZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGZsb2F0IGdldFJlbGF0aXZlVmFsdWUoKSB7CisJCQorCQkvL2RvdWJsZSBub2RlQXJlYSA9IGdldEFyZWEoKTsKKwkJCisJCUdyYXBoIGdyYXBoID0gc2VsZWN0ZWREZWNvcmF0b3IuZ2V0R3JhcGgoKTsKKwkJZmluYWwgVVJJIGFyZWFMYWJlbFVSSSA9IFNURU1VUkkuY3JlYXRlVVJJKEFyZWFMYWJlbC5VUklfVFlQRV9BUkVBX0xBQkVMX1NFR01FTlQpOworCQlNYXA8U3RyaW5nLCBEb3VibGU+IHRlbXBBcmVhVmFsdWVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERvdWJsZT4oKTsKKwkJZm9yIChVUkkgbGFiZWxVcmkgOiBncmFwaC5nZXROb2RlTGFiZWxzKCkua2V5U2V0KCkpIHsKKwkJCWlmIChsYWJlbFVyaS50b1N0cmluZygpLnN0YXJ0c1dpdGgoYXJlYUxhYmVsVVJJLnRvU3RyaW5nKCkpKSB7CisJCQkJU3RyaW5nIGluZGV4VXJpID0gbGFiZWxVcmkuc2VnbWVudCgyKSArICIvIiArIGxhYmVsVXJpLnNlZ21lbnQoMyk7CisJCQkJaWYgKHRlbXBBcmVhVmFsdWVNYXAuY29udGFpbnNLZXkoaW5kZXhVcmkpKSB7CisJCQkJCURvdWJsZSBwcmV2VmFsdWUgPSB0ZW1wQXJlYVZhbHVlTWFwLnJlbW92ZShpbmRleFVyaSk7CisJCQkJCUFyZWFMYWJlbCBhcmVhTGFiZWwgPSAoQXJlYUxhYmVsKWdyYXBoLmdldE5vZGVMYWJlbChsYWJlbFVyaSk7CisJCQkJCURvdWJsZSBuZXdWYWx1ZSA9IG5ldyBEb3VibGUocHJldlZhbHVlLmRvdWJsZVZhbHVlKCkgKyBhcmVhTGFiZWwuZ2V0Q3VycmVudEFyZWFWYWx1ZSgpLmdldEFyZWEoKSk7CisJCQkJCXRlbXBBcmVhVmFsdWVNYXAucHV0KGluZGV4VXJpLCBuZXdWYWx1ZSk7CisJCQkJfQorCQkJfQorCQl9CisJCQkJCisJCXJldHVybiAwLjdmOworCQkKKwl9IC8vIGdldFJlbGF0aXZlVmFsdWUKKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwlwcml2YXRlIGRvdWJsZSBnZXRBcmVhKCkgeworCQlpZiAoIShnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFJlZ2lvbikpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkKKwkJZG91YmxlIHJldFZhbCA9IC0xOworCQlSZWdpb24gcmVnaW9uID0gKFJlZ2lvbilnZXRUYXJnZXQoKTsKKwkJZm9yIChOb2RlTGFiZWwgbm9kZUxhYmVsIDogcmVnaW9uLmdldExhYmVscygpKSB7CisJCQlpZiAobm9kZUxhYmVsIGluc3RhbmNlb2YgQXJlYUxhYmVsKSB7CisJCQkJQXJlYUxhYmVsIGxhYmVsID0gKEFyZWFMYWJlbClub2RlTGFiZWw7CisJCQkJQXJlYUxhYmVsVmFsdWUgdmFsdWUgPSAoQXJlYUxhYmVsVmFsdWUpbGFiZWwuZ2V0Q3VycmVudFZhbHVlKCk7CisJCQkJcmV0VmFsID0gdmFsdWUuZ2V0QXJlYSgpOworCQkJfQorCQl9CisJCXJldHVybiByZXRWYWw7CisJfSAvLyBnZXRQb3B1bGF0aW9uCisJCit9IC8vIEFyZWFSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvQXJlYVJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvQXJlYVJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2IwZGJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9BcmVhUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8vIEFyZWFSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OworCisvKioKKyAqIFRoaXMgZmFjdG9yeSBjcmVhdGUgYWRhcHRlcnMgdGhhdCBhZGFwdAorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlfXMgdG8KKyAqIHtAbGluayBBcmVhUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJ9cy4KKyAqLworcHVibGljIGNsYXNzIEFyZWFSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKKwkJQWJzdHJhY3RSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJcHVibGljIEFyZWFSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgeworCQlzdXBlcigpOworCX0gLy8gQXJlYVJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnV0aWwuR3JhcGhBZGFwdGVyRmFjdG9yeSNjcmVhdGVOb2RlQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTm9kZUFkYXB0ZXIoKSB7CisJCWZpbmFsIEFyZWFSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IG5ldyBBcmVhUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyKCk7CisJCXJldHVybiBhZGFwdGVyOworCX0gLy8gY3JlYXRlTm9kZUFkYXB0ZXIKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5BYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoZmluYWwgT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gQXJlYVJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyLmNsYXNzOworCX0gLy8gaXNGYWN0b3J5Rm9yVHlwZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLklDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvcGVydGllc0NvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIGludCwgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcikKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZVByb3BlcnRpZXNDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIGludCBzdHlsZSwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIERlY29yYXRvciBzZWxlY3RlZERlY29yYXRvcikKKwl7CisJCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQlmaW5hbCBMYXlvdXQgbGF5b3V0ID0gbmV3IFJvd0xheW91dCgpOworCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisJCWZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGNvbG9yIHByb3ZpZGVyIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKKwkJcmV0dXJuIGNvbXBvc2l0ZTsKKwl9IC8vIGNyZWF0ZVByb3BlcnRpZXNDb21wb3NpdGUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5BYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQ29sb3JzTGVnZW5kQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKKwkgKiAgICAgIGludCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbG9yc0xlZ2VuZENvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50LAorCQkJZmluYWwgaW50IHN0eWxlKSB7CisJCWZpbmFsIENvbG9yc0xlZ2VuZENvbXBvc2l0ZSBjb2xvcnNMZWdlbmRDb21wb3NpdGUgPSBuZXcgQ29sb3JzTGVnZW5kQ29tcG9zaXRlKAorCQkJCXBhcmVudCwgc3R5bGUpOworCQljb2xvcnNMZWdlbmRDb21wb3NpdGUuYWRkQ29sb3JFbnRyeSgKKwkJCQlSZWxhdGl2ZVZhbHVlQ29sb3JQcmVmZXJlbmNlcy5GT1JFR1JPVU5EX0NPTE9SX1JBTkdFXzRfSUQsCisJCQkJIkFyZWEgcmVsYXRpdmUgdmFsdWUiKTsKKwkJcmV0dXJuIGNvbG9yc0xlZ2VuZENvbXBvc2l0ZTsKKwl9IC8vIGNyZWF0ZUNvbG9yc0xlZ2VuZENvbXBvc2l0ZQorCit9IC8vIEFyZWFSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL0NvbG9yUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvQ29sb3JQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMTA5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL0NvbG9yUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDU4IEBACisvLyBDb2xvclByb3ZpZGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKKworLyoqCisgKiBUaGUgaW50ZXJmYWNlIHdpbGwgYmUgZXh0ZW5kZWQgYnkgbW9yZSBzcGVjaWZpYyBpbnRlcmZhY2VzIHRoYXQgcHJvdmlkZXMgY29sb3JzCisgKiBtZXRob2RzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbG9yUHJvdmlkZXIgeworCS8qKgorCSAqIFRoZSBtZXRob2Qgd2lsbCByZXR1cm4gYSB7QGxpbmsgQ29sb3J9IG9iamVjdCB0aGF0IG1hdGNoZXMgc29tZSBhZGFwdGVkIG9iamVjdAorCSAqIEBwYXJhbSBkZXZpY2UgQSBkZXZpY2UgZm9yIGNyZWF0ZWQgY29sb3JzCisJICogQHJldHVybiBhIHtAbGluayBDb2xvcn0gb2JqZWN0CisJICovCisJcHVibGljIENvbG9yIGdldENvbG9yKERldmljZSBkZXZpY2UpOworCS8qKgorCSAqIFRoZSBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIHNwZWNpZmllZCB7QGxpbmsgR0N9IG9iamVjdCB3aXRoIHZhbHVlcworCSAqIHRoYXQgbWF0Y2hlcyB0aGUgYWRhcHRlZCBvYmplY3QgKGxpa2UgZmlsbCBjb2xvcikuCisJICogCisJICogQHBhcmFtIGdjVG9VcGRhdGUge0BsaW5rIEdDfSBvYmplY3QgdG8gdXBkYXRlCisJICovCisJcHVibGljIHZvaWQgdXBkYXRlR0MoR0MgZ2NUb1VwZGF0ZSk7CisJLyoqCisJICogVGhlIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGUgc3BlY2lmaWVkIHtAbGluayBHQ30gb2JqZWN0IHdpdGggdmFsdWVzCisJICogdGhhdCBtYXRjaGVzIHRoZSBhZGFwdGVkIG9iamVjdCAobGlrZSBmaWxsIGNvbG9yKS4KKwkgKiAKKwkgKiBAcGFyYW0gZ2NUb1VwZGF0ZSB7QGxpbmsgR0N9IG9iamVjdCB0byB1cGRhdGUKKwkgKiBAcGFyYW0gZ2FpbkZhY3RvciBHYWluIGZhY3RvcgorCSAqIEBwYXJhbSB1c2VMb2dTY2FsaW5nIFVzZSBsb2dhcml0aG1pYyBzY2FsaW5nPworCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0ZUdDKEdDIGdjVG9VcGRhdGUsIGZsb2F0IGdhaW5GYWN0b3IsIGJvb2xlYW4gdXNlTG9nU2NhbGluZyk7CisJLyoqCisJICogVGhlIG1ldGhvZCB3aWxsIHNldCB0aGUgc2VsZWN0ZWQge0BsaW5rIERlY29yYXRvcn0uCisJICogQHBhcmFtIHNlbGVjdGVkRGVjb3JhdG9yIFRoZSBzZWxlY3RlZCBkZWNvcmF0b3IKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZERlY29yYXRvcihmaW5hbCBEZWNvcmF0b3Igc2VsZWN0ZWREZWNvcmF0b3IpOworCS8qKgorCSAqIFRoZSBtZXRob2Qgd2lsbCBzZXQgdGhlIHBvcHVsYXRpb24gbW9kZWwKKwkgKiBAcGFyYW0gc2VsZWN0ZWRQb3B1bGF0aW9uSWQgVGhlIHNlbGVjdGVkIHBvcG91bGF0aW9uIGlkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRQb3B1bGF0aW9uSWRlbnRpZmllcihmaW5hbCBTdHJpbmcgc2VsZWN0ZWRQb3B1bGF0aW9uSWQpOworfQorLy8gQ29sb3JQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvQ29sb3JQcm92aWRlckFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvQ29sb3JQcm92aWRlckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWM4MDIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9Db2xvclByb3ZpZGVyQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvbG9yUHJvdmlkZXJBZGFwdGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOworCisvKioKKyAqIFRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MgdGhhdCBhbnkge0BsaW5rIENvbG9yUHJvdmlkZXJ9IGFkYXB0ZXIgc2hvdWxkIGV4dGVuZC4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENvbG9yUHJvdmlkZXJBZGFwdGVyIAorCWV4dGVuZHMgQWRhcHRlckltcGwgCisJaW1wbGVtZW50cyBDb2xvclByb3ZpZGVyIHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gdHlwZSA9PSBDb2xvclByb3ZpZGVyLmNsYXNzOworCX0gLy8gaXNBZGFwdGVyRm9yVHlwZQorCQorfSAvLyBDb2xvclByb3ZpZGVyQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9Db2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmMTMyZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLy8gQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgcHJvdmlkaW5nCisgKiBjb2xvcnMuIFRoZSB7QGxpbmsgQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5fSBpcyBpbXBsZW1lbnRlZCBieSB0aGUKKyAqIHtAbGluayBDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsfSBjbGFzcyBhbmQgaXMgdGhlIHBhcmVudCBhZGFwdGVyCisgKiBmYWN0b3J5ICh7QGxpbmsgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeX0pIGZvciBhbGwgdGhlIG90aGVyIGFkYXB0ZXIKKyAqIGZhY3Rvcmllcy4KKyAqIAorICogRmFjdG9yaWVzIHdpbGwgYmUgYWRkZWQgdG8gdGhpcyBjb21wb3NlZCBvYmplY3QgYnkgdXNpbmcgdGhlIEVjbGlwc2UKKyAqIGV4dGVuc2lvbiBwb2ludHMgbWVjaGFuaXNtIGZvciBleHRlbmRpbmcgcGx1Zy1pbnMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkKKwkgKi8KKwlwdWJsaWMgQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbCBJTlNUQU5DRSA9IG5ldyBDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsKCk7CisJCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCisJICoge0BsaW5rIENvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeX0gaW50ZXJmYWNlLgorCSAqIAorCSAqIEBzZWUgQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5CisJICovCisJcHVibGljIGNsYXNzIENvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGwgCisJCWV4dGVuZHMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeQorCQlpbXBsZW1lbnRzIENvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7CisJCQorCQkvKioKKwkJICogTGlzdCBvZiBzdXBwb3J0ZWQgY29sb3IgcHJvdmlkZXJzCisJCSAqLworCQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxDbGFzcz4gc3VwcG9ydGVkQ29sb3JQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOworCQkvKioKKwkJICogTGlzdCBvZiBzdXBwb3J0ZWQgY29sb3IgcHJvdmlkZXJzIG5hbWVzCisJCSAqLworCQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxTdHJpbmc+IHN1cHBvcnRlZENvbG9yUHJvdmlkZXJzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCisJCS8qKgorCQkgKiBDb25zdHJ1Y3RvcgorCQkgKi8KKwkJcHJvdGVjdGVkIENvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGwoKSB7CisJCQkvL05vdGhpbmcKKwkJfQorCisJCS8qKgorCQkgKiBBZGQgYSB7QGxpbmsgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeX0gdG8gdGhpcyBjb21wb3NlZCBmYWN0b3J5LgorCQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkgVGhlIGFkYXB0ZXIgZmFjdG9yeSB0byBiZSBhZGRlZAorCQkgKiBAcGFyYW0gY29sb3JQcm92aWRlciBUaGUge0BsaW5rIENvbG9yUHJvdmlkZXJ9IGNsYXNzIAorCQkgKiBAcGFyYW0gZGlzcGxheU5hbWUgQSBkaXNwbGF5IG5hbWUgZm9yIHRoZSBhZGFwdGVyICh0byBiZSBhZGRlZCB0byB0aGUgVUkpCisJCSAqLworCQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyRmFjdG9yeShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgQ2xhc3MgY29sb3JQcm92aWRlciwgU3RyaW5nIGRpc3BsYXlOYW1lKSB7CisJCQlzdXBwb3J0ZWRDb2xvclByb3ZpZGVycy5hZGQoY29sb3JQcm92aWRlcik7CisJCQlzdXBwb3J0ZWRDb2xvclByb3ZpZGVyc05hbWVzLmFkZChkaXNwbGF5TmFtZSk7CisJCQlzdXBlci5hZGRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbCNpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShmaW5hbCBPYmplY3QgdHlwZSkgeworCQkJcmV0dXJuIHR5cGUgPT0gQ29sb3JQcm92aWRlci5jbGFzczsKKwkJfSAvLyBpc0ZhY3RvcnlGb3JUeXBlCisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIHN1cHBvcnRlZENvbG9yUHJvdmlkZXJzCisJCSAqLworCQlwdWJsaWMgTGlzdDxDbGFzcz4gZ2V0U3VwcG9ydGVkQ29sb3JQcm92aWRlcnMoKSB7CisJCQlyZXR1cm4gc3VwcG9ydGVkQ29sb3JQcm92aWRlcnM7CisJCX0KKworCQkvKioKKwkJICogQHJldHVybiB0aGUgc3VwcG9ydGVkQ29sb3JQcm92aWRlcnNOYW1lcworCQkgKi8KKwkJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRTdXBwb3J0ZWRDb2xvclByb3ZpZGVyc05hbWVzKCkgeworCQkJcmV0dXJuIHN1cHBvcnRlZENvbG9yUHJvdmlkZXJzTmFtZXM7CisJCX0KKwl9IC8vIENvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGwKK30gLy8gQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL0NvbG9yU2NhbGVDb21wb3NpdGUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvQ29sb3JTY2FsZUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNDNmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL0NvbG9yU2NhbGVDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDE4NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZGlzcGxheSBhICJsZWdlbmQiIHRoYXQgbWFwcyBjb2xvcnMgdG8gdmFsdWVzLgorICovCitwdWJsaWMgY2xhc3MgQ29sb3JTY2FsZUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7CisKKwlHcm91cCBzY2FsZUdyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5OT05FKTsKKwlDTGFiZWwgY29sb3JTY2FsZTsKKwkKKwlzdGF0aWMgZmluYWwgaW50IE5VTV9BWElTX0xBQkVMUyA9IDU7CisJTGFiZWxbXSB2YWx1ZVNjYWxlID0gbmV3IExhYmVsW05VTV9BWElTX0xBQkVMU107IC8vIDUgdmFsdWVzOworCXN0YXRpYyBmaW5hbCBpbnQgU0NBTEVfSEVJR0hUPTIwOworCXN0YXRpYyBmaW5hbCBpbnQgU0NBTEVfV0lEVEg9MTAwOworCS8vRGVjaW1hbEZvcm1hdCBiaWdGb3JtYXQgPSBuZXcgRGVjaW1hbEZvcm1hdCgiIzAuMCIpOworCURlY2ltYWxGb3JtYXQgc2NpRm9ybWF0ID0gbmV3IERlY2ltYWxGb3JtYXQoIjAuI0UwIik7CisJCisJYm9vbGVhbiB1c2VMb2dTY2FsZSA9IGZhbHNlOworCQorCXN0YXRpYyBmaW5hbCBpbnQgTlVNX1NURVBTPTU7CisJCisJLyoqCisJICogCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzYXR1cmF0ZWRDb2xvcgorCSAqIEBwYXJhbSBheGlzCisJICogQHBhcmFtIGxvZ1NjYWxlCisJICogQHBhcmFtIHN0eWxlCisJICogQHBhcmFtIGJhY2tHcm91bmQKKwkgKiBAcGFyYW0gdGV4dENvbG9yCisJICovCisJcHVibGljIENvbG9yU2NhbGVDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgQ29sb3Igc2F0dXJhdGVkQ29sb3IsIGRvdWJsZVtdIGF4aXMsIGJvb2xlYW4gbG9nU2NhbGUsIGZpbmFsIGludCBzdHlsZSwgQ29sb3IgYmFja0dyb3VuZCwgQ29sb3IgdGV4dENvbG9yKSB7CisJCXN1cGVyKHBhcmVudCwgc3R5bGUpOworCQlzY2FsZUdyb3VwLnNldFRleHQoIlNjYWxlIik7CisJCWZpbmFsIEZvcm1MYXlvdXQgc2NhbGVMYXlvdXQgPSBuZXcgRm9ybUxheW91dCgpOworCQlzY2FsZUdyb3VwLnNldExheW91dChzY2FsZUxheW91dCk7CisJCQorCQljb2xvclNjYWxlID0gbmV3IENMYWJlbChzY2FsZUdyb3VwLCBTV1QuTEVGVCk7CisJCQorCQljb2xvclNjYWxlLnNldEJhY2tncm91bmQoYmFja0dyb3VuZCk7CisJCWNvbG9yU2NhbGUuc2V0Rm9yZWdyb3VuZCh0ZXh0Q29sb3IpOworCQljb2xvclNjYWxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCQlmaW5hbCBGb3JtRGF0YSBzY2FsZURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJc2NhbGVEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJc2NhbGVEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCwgMCk7CisJCXNjYWxlRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlzY2FsZURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJY29sb3JTY2FsZS5zZXRMYXlvdXREYXRhKHNjYWxlRGF0YSk7CisJCS8vUG9pbnQgc1NpemUgPSBuZXcgUG9pbnQoU0NBTEVfV0lEVEgsIFNDQUxFX0hFSUdIVCk7CisJCS8vY29sb3JTY2FsZS5zZXRTaXplKHNTaXplKTsKKwkJCisJCSAgCisJICAgIGludCBsZWZ0TWFyZ2luID0gMDsKKwkgICAgaW50IHN0ZXAgPSAxMDAvTlVNX0FYSVNfTEFCRUxTOworCSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9BWElTX0xBQkVMUzsgaSArKykgeworCSAgICAJdmFsdWVTY2FsZVtpXSA9IG5ldyBMYWJlbChzY2FsZUdyb3VwLCBTV1QuTEVGVCk7CisJICAgIAlmaW5hbCBGb3JtRGF0YSB2YWx1ZURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJCXZhbHVlRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIDApOworCQkJdmFsdWVEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQkJdmFsdWVEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobGVmdE1hcmdpbiwgMCk7CisJCQl2YWx1ZURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobGVmdE1hcmdpbitzdGVwLCAwKTsKKwkJCXZhbHVlU2NhbGVbaV0uc2V0TGF5b3V0RGF0YSh2YWx1ZURhdGEpOworCQkJdmFsdWVTY2FsZVtpXS5zZXRUZXh0KCIgIik7IC8vIFRFU1RJTkcKKwkJCWxlZnRNYXJnaW4gKz0gc3RlcDsKKwkJCXZhbHVlU2NhbGVbaV0uc2V0QmFja2dyb3VuZChiYWNrR3JvdW5kKTsKKwkJCXZhbHVlU2NhbGVbaV0uc2V0Rm9yZWdyb3VuZCh0ZXh0Q29sb3IpOworCSAgICB9CisJICAgIAorCSAgICB1cGRhdGVDb2xvclNjYWxlKHNhdHVyYXRlZENvbG9yLCBheGlzLCBsb2dTY2FsZSwgYmFja0dyb3VuZCwgdGV4dENvbG9yKTsKKwkJCisJCXNjYWxlR3JvdXAuc2V0VmlzaWJsZSh0cnVlKTsKKwkJc2NhbGVHcm91cC5wYWNrKCk7CisJCQorCQl0aGlzLmxheW91dCgpOworCQl0aGlzLnBhY2soKTsKKwkJdGhpcy5zZXRWaXNpYmxlKHRydWUpOworCQkKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gc2F0dXJhdGVkQ29sb3IKKwkgKiBAcGFyYW0gYXhpcworCSAqIEBwYXJhbSBsb2dTY2FsZQorCSAqIEBwYXJhbSB0ZXh0QmFja0dyb3VuZAorCSAqIEBwYXJhbSB0ZXh0Rm9yZWdyb3VuZAorCSAqLworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNvbG9yU2NhbGUoQ29sb3Igc2F0dXJhdGVkQ29sb3IsIGRvdWJsZVtdIGF4aXMsIGJvb2xlYW4gbG9nU2NhbGUsIENvbG9yIHRleHRCYWNrR3JvdW5kLCBDb2xvciB0ZXh0Rm9yZWdyb3VuZCkgeworICAgIAkKKyAgICAJQ29sb3JbXSBzY2FsZUNvbG9ycyA9IG5ldyBDb2xvcls1XTsKKyAgICAJCisgICAgCWludCBzaXplID0gTlVNX1NURVBTLTE7CisgICAgCQorICAgIAlkb3VibGUgciA9IHNhdHVyYXRlZENvbG9yLmdldFJlZCgpOworCQlkb3VibGUgZyA9IHNhdHVyYXRlZENvbG9yLmdldEdyZWVuKCk7CisJCWRvdWJsZSBiID0gc2F0dXJhdGVkQ29sb3IuZ2V0Qmx1ZSgpOworCQkJCQorCQkvLyBUT0RPIHRoaXMgaXMgSUYgTElORUFSCisJCWZvcihpbnQgaSA9IDA7IGkgPCA1OyBpICsrKSB7CisJCQlkb3VibGUgYWxwaGFGID0gKChkb3VibGUpIGkpLzQuMDsgLy8gdGhpcyBpcyAwPT4xIG5vdCAwLTI1NQorCQkJaW50IGlyID0gKGludCkgKGFscGhhRipyKTsKKwkJCWludCBpZyA9IChpbnQpIChhbHBoYUYqZyk7CisJCQlpbnQgaWIgPSAoaW50KSAoYWxwaGFGKmIpOworCQkJc2NhbGVDb2xvcnNbaV0gPSBuZXcgQ29sb3IoZ2V0RGlzcGxheSgpLCBpcixpZyxpYik7CisJCX0KKyAgICAJCisgICAgCWludFtdIHNwYWNpbmcgPSBuZXcgaW50W3NpemVdOworICAgIAlpZihzaXplPD0wKSBzaXplID0gMTsKKyAgICAJaW50IGRlbHRhID0gMTAwL3NpemU7CisgICAgCWZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpICsrKSB7CisgICAgCQlzcGFjaW5nW2ldID0gZGVsdGEqKGkrMSk7CisgICAgCX0KKyAgICAJCisgICAgCS8vIFNldCB0aGUgYmFja2dyb3VuZCBncmFkaWVudAorCSAgICBjb2xvclNjYWxlLnNldEJhY2tncm91bmQoc2NhbGVDb2xvcnMsIHNwYWNpbmcpOworCSAgICAKKwkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fQVhJU19MQUJFTFM7IGkgKyspIHsKKwkJCXZhbHVlU2NhbGVbaV0uc2V0QmFja2dyb3VuZCh0ZXh0QmFja0dyb3VuZCk7CisJCQl2YWx1ZVNjYWxlW2ldLnNldEZvcmVncm91bmQodGV4dEZvcmVncm91bmQpOworCSAgICB9CisJICAgIAorCSAgICBpbnQgbGFzdCA9IE5VTV9BWElTX0xBQkVMUy0xOworCSAgICAvL3ZhbHVlU2NhbGVbMF0uc2V0QWxpZ25tZW50KFNXVC5SSUdIVCk7CisJICAgIHZhbHVlU2NhbGVbbGFzdF0uc2V0QWxpZ25tZW50KFNXVC5SSUdIVCk7CisJICAgIAorCSAgICBpZihheGlzWzFdPT0xLjApIHsKKwkgICAgCXZhbHVlU2NhbGVbbGFzdF0uc2V0VGV4dCgiMS4wIik7CisJICAgIH0gZWxzZSB7CisJICAgIAl2YWx1ZVNjYWxlW2xhc3RdLnNldFRleHQoIiIrc2NpRm9ybWF0LmZvcm1hdChheGlzWzFdKSk7CisJICAgIH0KKwkgICAgCisJICAgIAorCSAgICBpZihsb2dTY2FsZSkgeworCSAgICAJLy9kb3VibGUgZ2FpbiA9IDEuMC9heGlzWzFdOyAvLyB0aGUgZ2FpbgorCSAgICAJLy8gVE9ETyBDSEVDSyBUSElTIENPREUKKwkgICAgCS8qKgorCSAgICAJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLkludGVuc2l0eUNvbG9yc0xhYmVsc01hcHBpbmdDb2xvclByb3ZpZGVyQWRhcHRlci5wZXJmb3JtTG9nU2NhbGluZygpCisJICAgIAkgKi8KKwkgICAgCS8vZG91YmxlIG1pbiA9IChNYXRoLmV4cCgyKSAtMS4wKSAvIChheGlzWzFdKjk5LjApOyAgIC8vIHRoaXMgaXMgdGhlIG1pbgorCSAgICAJZG91YmxlIG1pbiA9IDAuMDEgKiBheGlzWzFdOyAgIC8vIHJlYWxseSB0aGUgbWluIGlzIGp1c3QgMSUgb2YgbWF4CisJICAgIAl2YWx1ZVNjYWxlWzBdLnNldFRleHQoIjwgIitzY2lGb3JtYXQuZm9ybWF0KG1pbikpOworCSAgICB9IGVsc2UgeworCSAgICAJdmFsdWVTY2FsZVswXS5zZXRUZXh0KCIiK2F4aXNbMF0pOworCSAgICB9CisJICAgIAorCSAgICAKKwkgICAgCisgICAgfS8vIHVwZGF0ZUNvbG9yU2NhbGUKKwkKKworCXB1YmxpYyBib29sZWFuIGlzVXNlTG9nU2NhbGUoKSB7CisJCXJldHVybiB1c2VMb2dTY2FsZTsKKwl9CisKKworCisJcHVibGljIHZvaWQgc2V0VXNlTG9nU2NhbGUoYm9vbGVhbiB1c2VMb2dTY2FsZSkgeworCQl0aGlzLnVzZUxvZ1NjYWxlID0gdXNlTG9nU2NhbGU7CisJfQorCisKKworfSAvLyBDb2xvcnNMZWdlbmRDb21wb3NpdGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvQ29sb3JzTGVnZW5kQ29tcG9zaXRlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL0NvbG9yc0xlZ2VuZENvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OWYzNDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL0NvbG9yc0xlZ2VuZENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuU3RyaW5nQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZGlzcGxheSBhICJsZWdlbmQiIHRoYXQgbWFwcyBjb2xvcnMgdG8gdmFsdWVzLgorICovCitwdWJsaWMgY2xhc3MgQ29sb3JzTGVnZW5kQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKKworCUdyb3VwIGxlZ2VuZEdyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5OT05FKTsKKworCS8qKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gc3R5bGUKKwkgKi8KKwlwdWJsaWMgQ29sb3JzTGVnZW5kQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIGludCBzdHlsZSkgeworCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKKworCQlsZWdlbmRHcm91cC5zZXRUZXh0KCJDb2xvcnMgTGVnZW5kIik7CisJCWZpbmFsIEdyaWRMYXlvdXQgbGVnZW5kTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGVnZW5kTGF5b3V0Lm51bUNvbHVtbnMgPSA0OworCQlsZWdlbmRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAxMDsKKwkJbGVnZW5kTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDI7CisJCWxlZ2VuZExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKKwkJbGVnZW5kTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDE1OworCQlsZWdlbmRHcm91cC5zZXRMYXlvdXQobGVnZW5kTGF5b3V0KTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gY29sb3JJRAorCSAqIEBwYXJhbSB0ZXh0CisJICovCisJcHVibGljIHZvaWQgYWRkQ29sb3JFbnRyeShmaW5hbCBTdHJpbmcgY29sb3JJRCwgZmluYWwgU3RyaW5nIHRleHQpIHsKKwkJZmluYWwgQ29sb3IgY29sb3IgPSBnZXRQcmVmZXJlbmNlc0NvbG9yKGNvbG9ySUQpOworCQlmaW5hbCBMYWJlbCBjb2xvckxhYmVsID0gbmV3IExhYmVsKGxlZ2VuZEdyb3VwLCBTV1QuQk9SREVSKTsKKwkJY29sb3JMYWJlbC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKKwkJY29sb3JMYWJlbC5zZXRUZXh0KCIgICAgICAgICAgICAiKTsKKwkJZmluYWwgTGFiZWwgY29sb3JUZXh0ID0gbmV3IExhYmVsKGxlZ2VuZEdyb3VwLCBTV1QuTk9ORSk7CisJCWNvbG9yVGV4dC5zZXRUZXh0KHRleHQpOworCQlsZWdlbmRHcm91cC5wYWNrKCk7CisJCXRoaXMubGF5b3V0KCk7CisJfQorCisJcHJpdmF0ZSBDb2xvciBnZXRQcmVmZXJlbmNlc0NvbG9yKGZpbmFsIFN0cmluZyBjb2xvcklkKSB7CisJCWZpbmFsIFByZWZlcmVuY2VzIHByZWZzID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCQlmaW5hbCBTdHJpbmcgY29sb3IgPSBwcmVmcy5nZXRTdHJpbmcoY29sb3JJZCk7CisJCWZpbmFsIFJHQiByZ2IgPSBTdHJpbmdDb252ZXJ0ZXIuYXNSR0IoY29sb3IpOworCQlyZXR1cm4gbmV3IENvbG9yKGdldERpc3BsYXkoKSwgcmdiLnJlZCwgcmdiLmdyZWVuLCByZ2IuYmx1ZSk7CisJfQorfSAvLyBDb2xvcnNMZWdlbmRDb21wb3NpdGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvSUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9JQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5ZGUyMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvSUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8vIElDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEludGVyZmFjZSB0byBiZSB1c2VkIG15IGFueSBDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkgY2xhc3MuCisgKiBQcm92aWRlcyBtZXRob2RzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgdHlwZXMgb2YgQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LgorICovCitwdWJsaWMgaW50ZXJmYWNlIElDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewkKKwkvKioKKwkgKiBUaGUgbWV0aG9kIHdpbGwgcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZSBhYm91dCB3aGV0aGVyIHRoZSBmYWN0b3J5IHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgdHlwZQorCSAqIEBwYXJhbSB0eXBlIFRoZSBjb2xvciBwcm92aWRlciB0eXBlIHRvIGNoZWNrCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBmYWN0b3J5IHN1cHBvcnRzIGl0CisJICovCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSk7CisJCisJLyoqCisJICogVGhlIG1ldGhvZCB3aWxsIHJldHVybiBhIHtAbGluayBDb21wb3NpdGV9IHdpZGdldCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEdVSSBhbmQgaG9sZHMKKwkgKiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgY29uZmlndXJlZCBmb3IgdGhlIHNwZWNpZmljIGZhY3RvcnkuCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG9mIHRoZSB7QGxpbmsgQ29tcG9zaXRlfQorCSAqIEBwYXJhbSBzdHlsZSB0aGUgc3R5bGUgZm9yIHRoZSBnZW5lcmF0ZWQge0BsaW5rIENvbXBvc2l0ZX0KKwkgKiBAcGFyYW0gc2VsZWN0ZWREZWNvcmF0b3IgdGhlIHNlbGVjdGVkIHtAbGluayBEZWNvcmF0b3J9CisJICogQHJldHVybiB0aGUgZ2VuZXJhdGVkIHtAbGluayBDb21wb3NpdGV9CisJICovCisJcHVibGljIENvbXBvc2l0ZSBjcmVhdGVQcm9wZXJ0aWVzQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIGludCBzdHlsZSwgZmluYWwgRGVjb3JhdG9yIHNlbGVjdGVkRGVjb3JhdG9yKTsKKwkKKwkvKioKKwkgKiBUaGUgbWV0aG9kIHdpbGwgcmV0dXJuIGEge0BsaW5rIENvbXBvc2l0ZX0gd2lkZ2V0IHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgR1VJIGFuZCBob2xkcworCSAqIHRoZSBhIGxlZ2VuZCBvZiB0aGUgY29sb3JzIHRoYXQgdGhpcyBjb2xvciBwcm92aWRlciBwcm92aWRlcy4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgb2YgdGhlIHtAbGluayBDb21wb3NpdGV9CisJICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBmb3IgdGhlIGdlbmVyYXRlZCB7QGxpbmsgQ29tcG9zaXRlfQorCSAqIEByZXR1cm4gdGhlIGdlbmVyYXRlZCB7QGxpbmsgQ29tcG9zaXRlfQorCSAqLworCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29sb3JzTGVnZW5kQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIGludCBzdHlsZSk7CisJCisJLyoqCisJICogVGhlIG1ldGhvZCB3aWxsIHJldHVybiB0aGUge0BsaW5rIENvbXBvc2l0ZX0gd2lkZ2V0IHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgR1VJIGFuZCBob2xkcworCSAqIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBjb25maWd1cmVkIGZvciB0aGUgc3BlY2lmaWMgZmFjdG9yeS4KKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgQ29tcG9zaXRlfQorCSAqLworCXB1YmxpYyBDb21wb3NpdGUgZ2V0UHJvcGVydGllc0NvbXBvc2l0ZSgpOworfSAvLyBJQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL0lDb2xvclByb3ZpZGVyQ2hhbmdlZExpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL0lDb2xvclByb3ZpZGVyQ2hhbmdlZExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1MTAxNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvSUNvbG9yUHJvdmlkZXJDaGFuZ2VkTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDI5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoZSBpbnRlcmZhY2UgaXMgZm9yIGxpc3RlbmVycyB0aGF0IHdpc2ggdG8gZ2V0IG5vdGlmaWVkIGFib3V0IGV2ZW50cyBvZgorICogY2hhbmdlIGluIHRoZSBzZWxlY3RlZCBjb2xvciBwcm92aWRlci4KKyAqIAorICogQGF1dGhvciBZb3NzaSBNZXNpa2EgKElCTSkKKyAqLworcHVibGljIGludGVyZmFjZSBJQ29sb3JQcm92aWRlckNoYW5nZWRMaXN0ZW5lciB7CisKKwkvKioKKwkgKiBMaXN0ZW5lcnMgd2lsbCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgYW5kIGl0IHdpbGwgYmUgY2FsbGVkIHVwb24KKwkgKiBjaGFuZ2VzIG9mIHRoZSBzZWxlY3RlZCBjb2xvciBwcm92aWRlci4KKwkgKiAKKwkgKiBAcGFyYW0gc2VsZWN0ZWRDb2xvclByb3ZpZGVyIFRoZSByZWNlbnRseSBzZWxlY3RlZCBjb2xvciBwcm92aWRlcgorCSAqLworCXB1YmxpYyB2b2lkIGNvbG9yUHJvdmlkZXJDaGFuZ2VkKENsYXNzIHNlbGVjdGVkQ29sb3JQcm92aWRlcik7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL0lQcmVmZXJlbmNlc0NvbnRyaWJ1dGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL0lQcmVmZXJlbmNlc0NvbnRyaWJ1dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxYmJlYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvSVByZWZlcmVuY2VzQ29udHJpYnV0ZXIuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvLyBJUHJlZmVyZW5jZXNDb250cmlidXRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuTWFwc0NvbG9yc1ByZWZlcmVuY2VQYWdlOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB0aG9zZSBlbnRpdGllcyB0aGF0IHdpc2ggdG8gY29udHJpYnV0ZQorICogcHJlZmVyZW5jZXMgZmllbGRzIHRvIHRoZSBNYXBzIENvbG9ycyBwcmVmZXJlbmNlcyBwYWdlLgorICovCitwdWJsaWMgaW50ZXJmYWNlIElQcmVmZXJlbmNlc0NvbnRyaWJ1dGVyIHsKKworCS8qKgorCSAqIFNldHMgdGhlIHtAbGluayBNYXBzQ29sb3JzUHJlZmVyZW5jZVBhZ2V9CisJICogQHBhcmFtIHByZWZlcmVuY2VQYWdlIHRoZSB7QGxpbmsgTWFwc0NvbG9yc1ByZWZlcmVuY2VQYWdlfQorCSAqLworCXB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VQYWdlKE1hcHNDb2xvcnNQcmVmZXJlbmNlUGFnZSBwcmVmZXJlbmNlUGFnZSk7CisJLyoqCisJICogQ3JlYXRlcyB0aGUgcHJlZmVyZW5jZXMgZmllbGRzIGFuZCBhZGQgdGhlbSB0byB0aGUgcHJlZmVyZW5jZXMgcGFnZQorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpOworCS8qKgorCSAqIEluaXRpYWxpemUgdGhlIHByZWZlcmVuY2VzIGZpZWxkcworCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKTsKKwkvKioKKwkgKiBCZWluZyBjYWxsZWQgd2hlbmV2ZXIgYSBwcm9wZXJ0eSBpbiB0aGUgcHJlZmVyZW5jZXMgcGFnZSBoYXMgYmVlbiBjaGFuZ2VkLgorCSAqIEBwYXJhbSBldmVudCBFdmVudCBvYmplY3QgYWJvdXQgdGhlIGNoYW5nZWQgcHJvcGVydHkKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KTsKKwkvKioKKwkgKiBMb2FkcyB0aGUgcHJlZmVyZW5jZXMgZmllbGRzIHdpdGggZGVmYXVsdCB2YWx1ZXMKKwkgKi8KKwlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKTsKKwkKK30gLy8gSVByZWZlcmVuY2VzQ29udHJpYnV0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvUG9wdWxhdGlvblJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL1BvcHVsYXRpb25SZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ODVkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL1BvcHVsYXRpb25SZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8vIFBvcHVsYXRpb25SZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHdpbGwgcHJvdmlkZSBwb3B1bGF0aW9uIHZhbHVlIGZvciBhCisgKiBzcGVjaWZpYyBhZGFwdGVkIG9iamVjdC4KKyAqLworcHVibGljIGludGVyZmFjZSBQb3B1bGF0aW9uUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXIgZXh0ZW5kcyBSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlciB7CisJLy9NYXJrZXIgaW50ZXJmYWNlCit9Ly8gUG9wdWxhdGlvblJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL1BvcHVsYXRpb25SZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvUG9wdWxhdGlvblJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZmRiZTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL1BvcHVsYXRpb25SZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDkyIEBACisvLyBQb3B1bGF0aW9uUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLkFyZWFMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5BcmVhTGFiZWxWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5Qb3B1bGF0aW9uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5ub2Rlcy5SZWdpb247CisKKy8qKgorICogVGhpcyBjbGFzcyBhZGFwdHMge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlfSBvYmplY3RzIHRvCisgKiB7QGxpbmsgUG9wdWxhdGlvblJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyfSBvYmplY3QuCisgKi8KK3B1YmxpYyBjbGFzcyBQb3B1bGF0aW9uUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyIGV4dGVuZHMKKwkJQWJzdHJhY3RSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIgeworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgUG9wdWxhdGlvblJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuQWJzdHJhY3RSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIjZ2V0UmVsYXRpdmVWYWx1ZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGZsb2F0IGdldFJlbGF0aXZlVmFsdWUoKSB7CisJCWdldFBvcHVsYXRpb24oKTsKKwkJcmV0dXJuIDAuNWY7CisJCQorCQkvLyAvLyBJcyB0aGVyZSBhIGRlY29yYXRvciBhbmQgYSBjdXJyZW50bHkgc2VsZWN0ZWQgcHJvcGVydHk/CisJCS8vIGlmIChkaXNwbGF5RGF0YSAhPSBudWxsKSB7CisJCS8vIC8vIFllcworCQkvLyAvLyBHZXQgdGhlIGRpc3BsYXkgZGF0YSBmb3IgdGhpcyBkZWNvcmF0b3IKKwkJLy8JCQkKKwkJLy8JCQkKKwkJLy8gTm9kZSBub2RlID0gKE5vZGUpZ2V0VGFyZ2V0KCk7CisJCS8vCQkJCisJCS8vIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXIgcnZwID0KKwkJLy8gZGlzcGxheURhdGEuZ2V0UmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcigpOworCQkvLyBmb3IgKGZpbmFsIERlY29yYXRvckRpc3BsYXlEYXRhLkxhYmVsRGF0YSBsYWJlbERhdGEgOgorCQkvLyBkaXNwbGF5RGF0YS5nZXRMYWJlbERhdGEoKSkgeworCQkvLyBydnAuc2V0VGFyZ2V0KGxhYmVsRGF0YS5nZXRMYWJlbCgpKTsKKwkJLy8gaWYgKGxhYmVsRGF0YS5nZXRMYWJlbCgpLmdldE5vZGUoKSA9PSBub2RlKSB7CisJCS8vIHJldHVybiAoZmxvYXQpcnZwLmdldFJlbGF0aXZlVmFsdWUoZGVjb3JhdGlvbkhlbHBlci5nZXRTZWxlY3RlZFByb3BlcnR5KCkpOworCQkvLyB9CisJCS8vIH0gLy8gZm9yIGVhY2ggTGFiZWxEYXRhCisJCS8vIH0gLy8gaWYgdGhlcmUgYSBkZWNvcmF0b3IgYW5kIGEgY3VycmVudGx5IHNlbGVjdGVkIHByb3BlcnR5CisKKwkJLy8gcmV0dXJuIDA7IC8vIFdlIHNob3VsZG4ndCByZWFjaCB0aGlzIHBvaW50CisJfSAvLyBnZXRSZWxhdGl2ZVZhbHVlCisJCisJLyoqCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgZG91YmxlIGdldFBvcHVsYXRpb24oKSB7CisJCWlmICghKGdldFRhcmdldCgpIGluc3RhbmNlb2YgUmVnaW9uKSkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCQorCQlkb3VibGUgcmV0VmFsID0gLTE7CisJCVJlZ2lvbiByZWdpb24gPSAoUmVnaW9uKWdldFRhcmdldCgpOworCQlmb3IgKE5vZGVMYWJlbCBub2RlTGFiZWwgOiByZWdpb24uZ2V0TGFiZWxzKCkpIHsKKwkJCWlmIChub2RlTGFiZWwgaW5zdGFuY2VvZiBQb3B1bGF0aW9uTGFiZWwpIHsKKwkJCQlQb3B1bGF0aW9uTGFiZWwgbGFiZWwgPSAoUG9wdWxhdGlvbkxhYmVsKW5vZGVMYWJlbDsKKwkJCQkvL2lmIChsYWJlbC5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpLmVxdWFscyhQb3B1bGF0aW9uTGFiZWwuSFVNQU4pKQorCQkJCVBvcHVsYXRpb25MYWJlbFZhbHVlIHZhbHVlID0gKFBvcHVsYXRpb25MYWJlbFZhbHVlKWxhYmVsLmdldEN1cnJlbnRWYWx1ZSgpOworCQkJCXJldFZhbCA9IHZhbHVlLmdldENvdW50KCk7CisJCQl9CisJCQlpZiAobm9kZUxhYmVsIGluc3RhbmNlb2YgQXJlYUxhYmVsKSB7CisJCQkJQXJlYUxhYmVsIGxhYmVsID0gKEFyZWFMYWJlbClub2RlTGFiZWw7CisJCQkJQXJlYUxhYmVsVmFsdWUgdmFsdWUgPSAoQXJlYUxhYmVsVmFsdWUpbGFiZWwuZ2V0Q3VycmVudFZhbHVlKCk7CisJCQkJcmV0VmFsID0gdmFsdWUuZ2V0QXJlYSgpOworCQkJfQorCQl9CisJCXJldHVybiByZXRWYWw7CisJfSAvLyBnZXRQb3B1bGF0aW9uCisKK30gLy8gUG9wdWxhdGlvblJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9Qb3B1bGF0aW9uUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9Qb3B1bGF0aW9uUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZWU0NmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL1BvcHVsYXRpb25SZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLy8gUG9wdWxhdGlvblJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7CisKKy8qKgorICogVGhpcyBmYWN0b3J5IGNyZWF0ZSBhZGFwdGVycyB0aGF0IGFkYXB0CisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGV9cyB0bworICoge0BsaW5rIFBvcHVsYXRpb25SZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlcn1zLgorICovCitwdWJsaWMgY2xhc3MgUG9wdWxhdGlvblJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcworCQlBYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkgeworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgUG9wdWxhdGlvblJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJfSAvLyBQb3B1bGF0aW9uUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudXRpbC5HcmFwaEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZU5vZGVBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVOb2RlQWRhcHRlcigpIHsKKwkJZmluYWwgUG9wdWxhdGlvblJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gbmV3IFBvcHVsYXRpb25SZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIoKTsKKwkJcmV0dXJuIGFkYXB0ZXI7CisJfSAvLyBjcmVhdGVOb2RlQWRhcHRlcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLkFic3RyYWN0UmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShmaW5hbCBPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gdHlwZSA9PSBQb3B1bGF0aW9uUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXIuY2xhc3M7CisJfSAvLyBpc0ZhY3RvcnlGb3JUeXBlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuSUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9wZXJ0aWVzQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgaW50LCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlUHJvcGVydGllc0NvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgaW50IHN0eWxlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgRGVjb3JhdG9yIHNlbGVjdGVkRGVjb3JhdG9yKQorCXsKKwkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCWZpbmFsIExheW91dCBsYXlvdXQgPSBuZXcgUm93TGF5b3V0KCk7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoIlRoaXMgY29sb3IgcHJvdmlkZXIgaXMgbm90IGltcGxlbWVudGVkIHlldCIpOworCQlyZXR1cm4gY29tcG9zaXRlOworCX0gLy8gY3JlYXRlUHJvcGVydGllc0NvbXBvc2l0ZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLkFic3RyYWN0UmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDb2xvcnNMZWdlbmRDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAorCSAqICAgICAgaW50KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29sb3JzTGVnZW5kQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsCisJCQlmaW5hbCBpbnQgc3R5bGUpIHsKKwkJZmluYWwgQ29sb3JzTGVnZW5kQ29tcG9zaXRlIGNvbG9yc0xlZ2VuZENvbXBvc2l0ZSA9IG5ldyBDb2xvcnNMZWdlbmRDb21wb3NpdGUoCisJCQkJcGFyZW50LCBzdHlsZSk7CisJCWNvbG9yc0xlZ2VuZENvbXBvc2l0ZS5hZGRDb2xvckVudHJ5KAorCQkJCVJlbGF0aXZlVmFsdWVDb2xvclByZWZlcmVuY2VzLkZPUkVHUk9VTkRfQ09MT1JfUkFOR0VfM19JRCwKKwkJCQkiUG9wdWxhdGlvbiByZWxhdGl2ZSB2YWx1ZSIpOworCQlyZXR1cm4gY29sb3JzTGVnZW5kQ29tcG9zaXRlOworCX0gLy8gY3JlYXRlQ29sb3JzTGVnZW5kQ29tcG9zaXRlCisKK30gLy8gUG9wdWxhdGlvblJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvUmVsYXRpdmVWYWx1ZUNvbG9yUHJlZmVyZW5jZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvUmVsYXRpdmVWYWx1ZUNvbG9yUHJlZmVyZW5jZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTM5MjNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9SZWxhdGl2ZVZhbHVlQ29sb3JQcmVmZXJlbmNlcy5qYXZhCkBAIC0wLDAgKzEsMjQ5IEBACisvLyBSZWxhdGl2ZVZhbHVlQ29sb3JQcmVmZXJlbmNlcy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Cb29sZWFuRmllbGRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Db2xvckZpZWxkRWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlN0cmluZ0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5NYXBzQ29sb3JzUHJlZmVyZW5jZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGhvbGRzIHRoZSBwcmVmZXJlbmNlcyBjb250cmlidXRpb24gdG8gdGhlIG1haW4gcHJlZmVyZW5jZXMgcGFnZSBmb3IgYWxsIHJlbGF0aXZlCisgKiB2YWx1ZSBjb2xvciBwcm92aWRlcnMuCisgKi8KK3B1YmxpYyBjbGFzcyBSZWxhdGl2ZVZhbHVlQ29sb3JQcmVmZXJlbmNlcyAKKwlpbXBsZW1lbnRzIElQcmVmZXJlbmNlc0NvbnRyaWJ1dGVyIHsKKwkKKwkvKioKKwkgKiBUaGUge0BsaW5rIE1hcHNDb2xvcnNQcmVmZXJlbmNlUGFnZX0gdGhlIHRoaXMgcHJlZmVyZW5jZXMgaGF2ZSBiZWVuIGFkZGVkIHRvCisJICovCisJcHJvdGVjdGVkIE1hcHNDb2xvcnNQcmVmZXJlbmNlUGFnZSBwcmVmZXJlbmNlc1BhZ2U7CisJCisJLyoqCisJICogVGhlIHByZWZlcmVuY2VzIGZpZWxkIGVkaXRvciBmb3IgZm9yZWdyb3VuZCBjb2xvciBvZiB6ZXJvIHJlbGF0aXZlIHZhbHVlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9DT0xPUl9aRVJPX1JFTEFUSVZFX1ZBTFVFX0lEID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAucHJlZmVyZW5jZXMuZm9yZWdyb3VuZGNvbG9yemVybyI7CisKKwkvKioKKwkgKiBUaGUgcHJlZmVyZW5jZXMgZmllbGQgZWRpdG9yIGZvciBmb3JlZ3JvdW5kIGNvbG9yIG9mIHJhbmdlIDEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EX0NPTE9SX1JBTkdFXzFfSUQgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlcy5mb3JlZ3JvdW5kY29sb3JyYW5nZTEiOworCisJLyoqCisJICogVGhlIHByZWZlcmVuY2VzIGZpZWxkIGVkaXRvciBmb3IgZm9yZWdyb3VuZCBjb2xvciBvZiByYW5nZSAyCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9DT0xPUl9SQU5HRV8yX0lEID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAucHJlZmVyZW5jZXMuZm9yZWdyb3VuZGNvbG9ycmFuZ2UyIjsKKworCS8qKgorCSAqIFRoZSBwcmVmZXJlbmNlcyBmaWVsZCBlZGl0b3IgZm9yIGZvcmVncm91bmQgY29sb3Igb2YgcmFuZ2UgMworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfQ09MT1JfUkFOR0VfM19JRCA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLmZvcmVncm91bmRjb2xvcnJhbmdlMyI7CisKKwkvKioKKwkgKiBUaGUgcHJlZmVyZW5jZXMgZmllbGQgZWRpdG9yIGZvciBmb3JlZ3JvdW5kIGNvbG9yIG9mIHJhbmdlIDQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EX0NPTE9SX1JBTkdFXzRfSUQgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlcy5mb3JlZ3JvdW5kY29sb3JyYW5nZTQiOworCS8qKgorCSAqIFRoZSBwcmVmZXJlbmNlcyBmaWVsZCBlZGl0b3IgZm9yIGZvcmVncm91bmQgY29sb3Igb2YgcmFuZ2UgNQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfQ09MT1JfUkFOR0VfNV9JRCA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLmZvcmVncm91bmRjb2xvcnJhbmdlNSI7CisJLyoqCisJICogVGhlIHByZWZlcmVuY2VzIGZpZWxkIGVkaXRvciBmb3IgZm9yZWdyb3VuZCBjb2xvciBvZiByYW5nZSA2CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9DT0xPUl9SQU5HRV82X0lEID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAucHJlZmVyZW5jZXMuZm9yZWdyb3VuZGNvbG9ycmFuZ2U2IjsKKwkvKioKKwkgKiBUaGUgcHJlZmVyZW5jZXMgZmllbGQgZWRpdG9yIGZvciBmb3JlZ3JvdW5kIGNvbG9yIG9mIHJhbmdlIDcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EX0NPTE9SX1JBTkdFXzdfSUQgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlcy5mb3JlZ3JvdW5kY29sb3JyYW5nZTciOworCQorCS8qKgorCSAqIFRoZSBwcmVmZXJlbmNlcyBmaWVsZCBlZGl0b3IgZm9yIGZvcmVncm91bmQgY29sb3Igb2YgbWF4aW11bSByZWxhdGl2ZSB2YWx1ZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfQ09MT1JfTUFYSU1VTV9SRUxBVElWRV9WQUxVRV9JRCA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLmZvcmVncm91bmRjb2xvcm1heGltdW0iOworCisJLyoqCisJICogVGhlIHByZWZlcmVuY2VzIGZpZWxkIGVkaXRvciBmb3IgYWxwaGEgY29tcG9zaXRlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0FMUEhBX0NPTVBPU0lURV9JRCA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLnVzZWFscGhhY29tcG9zaXRlIjsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IGNvbG9yIGZvciBwcmVmZXJlbmNlcyBmaWVsZCBlZGl0b3IgZm9yIHplcm8gcmVsYXRpdmUgdmFsdWUgKDAuMCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EX0NPTE9SX1pFUk9fUkVMQVRJVkVfVkFMVUVfREVGQVVMVF9SR0JfU1RSSU5HID0gIjAsMCwwIjsgCQkJLy9CbGFjaworCisJLyoqCisJICogVGhlIGRlZmF1bHQgY29sb3IgZm9yIHByZWZlcmVuY2VzIGZpZWxkIGVkaXRvciBmb3IgZm9yZWdyb3VuZCBjb2xvciBvZiByYW5nZSAxCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9DT0xPUl9SQU5HRV8xX0RFRkFVTFRfUkdCX1NUUklORyA9ICIxNjUsNDIsNDIiOwkJCQkJLy9Ccm93bgorCisJLyoqCisJICogVGhlIGRlZmF1bHQgY29sb3IgZm9yIHByZWZlcmVuY2VzIGZpZWxkIGVkaXRvciBmb3IgZm9yZWdyb3VuZCBjb2xvciBvZiByYW5nZSAyCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9DT0xPUl9SQU5HRV8yX0RFRkFVTFRfUkdCX1NUUklORyA9ICIyNTUsMCwwIjsgCQkJCQkvL1JlZAorCisJLyoqCQorCSAqIFRoZSBkZWZhdWx0IGNvbG9yIGZvciBwcmVmZXJlbmNlcyBmaWVsZCBlZGl0b3IgZm9yIGZvcmVncm91bmQgY29sb3Igb2YgcmFuZ2UgMworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfQ09MT1JfUkFOR0VfM19ERUZBVUxUX1JHQl9TVFJJTkcgPSAiMjU1LDE2NSwwIjsgCQkJCQkvL09yYW5nZQorCisJLyoqCisJICogVGhlIGRlZmF1bHQgY29sb3IgZm9yIHByZWZlcmVuY2VzIGZpZWxkIGVkaXRvciBmb3IgZm9yZWdyb3VuZCBjb2xvciBvZiByYW5nZSA0CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9DT0xPUl9SQU5HRV80X0RFRkFVTFRfUkdCX1NUUklORyA9ICIwLDI1NSwwIjsgCQkJCQkvL0dyZWVuCisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCBjb2xvciBmb3IgcHJlZmVyZW5jZXMgZmllbGQgZWRpdG9yIGZvciBmb3JlZ3JvdW5kIGNvbG9yIG9mIHJhbmdlIDUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EX0NPTE9SX1JBTkdFXzVfREVGQVVMVF9SR0JfU1RSSU5HID0gIjAsMCwyNTUiOwkJCQkJCS8vQmx1ZQorCisJLyoqCisJICogVGhlIGRlZmF1bHQgY29sb3IgZm9yIHByZWZlcmVuY2VzIGZpZWxkIGVkaXRvciBmb3IgZm9yZWdyb3VuZCBjb2xvciBvZiByYW5nZSA1CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9DT0xPUl9SQU5HRV82X0RFRkFVTFRfUkdCX1NUUklORyA9ICIwLDI1NSwyNTUiOwkJCQkJLy9DeWFuCisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCBjb2xvciBmb3IgcHJlZmVyZW5jZXMgZmllbGQgZWRpdG9yIGZvciBmb3JlZ3JvdW5kIGNvbG9yIG9mIHJhbmdlIDUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EX0NPTE9SX1JBTkdFXzdfREVGQVVMVF9SR0JfU1RSSU5HID0gIjI1NSwwLDI1NSI7CQkJCQkvL01hZ2VudGEKKwkKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCBjb2xvciBmb3IgcHJlZmVyZW5jZXMgZmllbGQgZWRpdG9yIGZvciBtYXhpbXVtIHJlbGF0aXZlIHZhbHVlICgxLjApCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9DT0xPUl9NQVhJTVVNX1JFTEFUSVZFX1ZBTFVFX0RFRkFVTFRfUkdCX1NUUklORyA9ICIyNTUsMjU1LDI1NSI7CS8vV2hpdGUKKworCS8qKgorCSAqIFRoZSBncm91cCB0aGF0IGdyb3VwcyBmaWVsZCBlZGl0b3JzIGZyb20gdGhpcyBwcmVmZXJlbmNlcyBjb250cmlidXRlcgorCSAqLworCXByaXZhdGUgR3JvdXAgcmVsYXRpdmVWYWx1ZXNQcmVmR3JvdXA7CQorCisJLyoqCisJICogVGhlIGFscGhhIGNvbXBvc2l0ZSBib29sZWFuIGZpZWxkIGVkaXRvcgorCSAqLworCSBzdGF0aWMgQm9vbGVhbkZpZWxkRWRpdG9yIHVzZUFscGhhQ29tcG9zaXRlQm9vbGVhbkZpZWxkRWRpdG9yOworCisJIC8qKgorCSAqIFRoZSBjb2xvciBmaWVsZCBlZGl0b3IgZm9yIHplcm8gcmVsYXRpdmUgdmFsdWUKKwkgKi8KKwkgc3RhdGljIENvbG9yRmllbGRFZGl0b3IgemVyb0NvbG9yRmllbGRFZGl0b3I7CisKKwkgLyoqCisJICogVGhlIGNvbG9yIGZpZWxkIGVkaXRvciBmb3IgcmFuZ2UgMQorCSAqLworCSBzdGF0aWMgQ29sb3JGaWVsZEVkaXRvciByYW5nZTFDb2xvckZpZWxkRWRpdG9yOworCisJIC8qKgorCSAqIFRoZSBjb2xvciBmaWVsZCBlZGl0b3IgZm9yIHJhbmdlIDIKKwkgKi8KKwkgc3RhdGljIENvbG9yRmllbGRFZGl0b3IgcmFuZ2UyQ29sb3JGaWVsZEVkaXRvcjsKKworCSAvKioKKwkgKiBUaGUgY29sb3IgZmllbGQgZWRpdG9yIGZvciByYW5nZSAzCisJICovCisJIHN0YXRpYyBDb2xvckZpZWxkRWRpdG9yIHJhbmdlM0NvbG9yRmllbGRFZGl0b3I7CisKKwkgLyoqCisJICogVGhlIGNvbG9yIGZpZWxkIGVkaXRvciBmb3IgcmFuZ2UgNAorCSAqLworCSBzdGF0aWMgQ29sb3JGaWVsZEVkaXRvciByYW5nZTRDb2xvckZpZWxkRWRpdG9yOworCisJIC8qKgorCSAqIFRoZSBjb2xvciBmaWVsZCBlZGl0b3IgZm9yIHJhbmdlIDUKKwkgKi8KKwkgc3RhdGljIENvbG9yRmllbGRFZGl0b3IgcmFuZ2U1Q29sb3JGaWVsZEVkaXRvcjsKKworCSAvKioKKwkgKiBUaGUgY29sb3IgZmllbGQgZWRpdG9yIGZvciBtYXhpbXVtIHJlbGF0aXZlIHZhbHVlCisJICovCisJIHN0YXRpYyBDb2xvckZpZWxkRWRpdG9yIG1heENvbG9yRmllbGRFZGl0b3I7CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLklQcmVmZXJlbmNlc0NvbnRyaWJ1dGVyI2NyZWF0ZUZpZWxkRWRpdG9ycygpCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlRmllbGRFZGl0b3JzKCkgeworCQlyZWxhdGl2ZVZhbHVlc1ByZWZHcm91cCA9IG5ldyBHcm91cChwcmVmZXJlbmNlc1BhZ2UuZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSwgU1dULlNIQURPV19FVENIRURfSU4pOworCQlyZWxhdGl2ZVZhbHVlc1ByZWZHcm91cC5zZXRUZXh0KCJSZWxhdGl2ZSBWYWx1ZXMiKTsKKwkJdXNlQWxwaGFDb21wb3NpdGVCb29sZWFuRmllbGRFZGl0b3IgPSBuZXcgQm9vbGVhbkZpZWxkRWRpdG9yKFVTRV9BTFBIQV9DT01QT1NJVEVfSUQsICJVc2UgJ0FscGhhIENvbXBvc2l0ZScgZm9yIHJlbGF0aXZlIGNvbG9ycyIsIHJlbGF0aXZlVmFsdWVzUHJlZkdyb3VwKTsKKwkJemVyb0NvbG9yRmllbGRFZGl0b3IgPSBuZXcgQ29sb3JGaWVsZEVkaXRvcihGT1JFR1JPVU5EX0NPTE9SX1pFUk9fUkVMQVRJVkVfVkFMVUVfSUQsICJDb2xvciBmb3IgemVybyByZWxhdGl2ZSB2YWx1ZSAoMCkiLCByZWxhdGl2ZVZhbHVlc1ByZWZHcm91cCk7CisJCXJhbmdlMUNvbG9yRmllbGRFZGl0b3IgPSBuZXcgQ29sb3JGaWVsZEVkaXRvcihGT1JFR1JPVU5EX0NPTE9SX1JBTkdFXzFfSUQsICJDb2xvciBmb3IgcmVsYXRpdmUgdmFsdWVzICgwIC0gMC4yKSIsIHJlbGF0aXZlVmFsdWVzUHJlZkdyb3VwKTsKKwkJcmFuZ2UyQ29sb3JGaWVsZEVkaXRvciA9IG5ldyBDb2xvckZpZWxkRWRpdG9yKEZPUkVHUk9VTkRfQ09MT1JfUkFOR0VfMl9JRCwgIkNvbG9yIGZvciByZWxhdGl2ZSB2YWx1ZXMgKDAuMiAtIDAuNCkiLCByZWxhdGl2ZVZhbHVlc1ByZWZHcm91cCk7CisJCXJhbmdlM0NvbG9yRmllbGRFZGl0b3IgPSBuZXcgQ29sb3JGaWVsZEVkaXRvcihGT1JFR1JPVU5EX0NPTE9SX1JBTkdFXzNfSUQsICJDb2xvciBmb3IgcmVsYXRpdmUgdmFsdWVzICgwLjQgLSAwLjYpIiwgcmVsYXRpdmVWYWx1ZXNQcmVmR3JvdXApOworCQlyYW5nZTRDb2xvckZpZWxkRWRpdG9yID0gbmV3IENvbG9yRmllbGRFZGl0b3IoRk9SRUdST1VORF9DT0xPUl9SQU5HRV80X0lELCAiQ29sb3IgZm9yIHJlbGF0aXZlIHZhbHVlcyAoMC42IC0gMC44KSIsIHJlbGF0aXZlVmFsdWVzUHJlZkdyb3VwKTsKKwkJcmFuZ2U1Q29sb3JGaWVsZEVkaXRvciA9IG5ldyBDb2xvckZpZWxkRWRpdG9yKEZPUkVHUk9VTkRfQ09MT1JfUkFOR0VfNV9JRCwgIkNvbG9yIGZvciByZWxhdGl2ZSB2YWx1ZXMgKDAuOCAtIDEpIiwgcmVsYXRpdmVWYWx1ZXNQcmVmR3JvdXApOworCQltYXhDb2xvckZpZWxkRWRpdG9yID0gbmV3IENvbG9yRmllbGRFZGl0b3IoRk9SRUdST1VORF9DT0xPUl9NQVhJTVVNX1JFTEFUSVZFX1ZBTFVFX0lELCAiQ29sb3IgZm9yIG1heGltdW0gcmVsYXRpdmUgdmFsdWUgKDEuMCkiLCByZWxhdGl2ZVZhbHVlc1ByZWZHcm91cCk7CisKKwkJcHJlZmVyZW5jZXNQYWdlLmFkZEZpZWxkKHVzZUFscGhhQ29tcG9zaXRlQm9vbGVhbkZpZWxkRWRpdG9yKTsKKwkJcHJlZmVyZW5jZXNQYWdlLmFkZEZpZWxkKHplcm9Db2xvckZpZWxkRWRpdG9yKTsKKwkJcHJlZmVyZW5jZXNQYWdlLmFkZEZpZWxkKHJhbmdlMUNvbG9yRmllbGRFZGl0b3IpOworCQlwcmVmZXJlbmNlc1BhZ2UuYWRkRmllbGQocmFuZ2UyQ29sb3JGaWVsZEVkaXRvcik7CisJCXByZWZlcmVuY2VzUGFnZS5hZGRGaWVsZChyYW5nZTNDb2xvckZpZWxkRWRpdG9yKTsKKwkJcHJlZmVyZW5jZXNQYWdlLmFkZEZpZWxkKHJhbmdlNENvbG9yRmllbGRFZGl0b3IpOworCQlwcmVmZXJlbmNlc1BhZ2UuYWRkRmllbGQocmFuZ2U1Q29sb3JGaWVsZEVkaXRvcik7CisJCXByZWZlcmVuY2VzUGFnZS5hZGRGaWVsZChtYXhDb2xvckZpZWxkRWRpdG9yKTsKKwl9IC8vIGNyZWF0ZUZpZWxkRWRpdG9ycworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLklQcmVmZXJlbmNlc0NvbnRyaWJ1dGVyI2luaXRpYWxpemUoKQorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CisJCWJvb2xlYW4gcmFuZ2VzRW5hYmxlZCA9ICF1c2VBbHBoYUNvbXBvc2l0ZUJvb2xlYW5GaWVsZEVkaXRvci5nZXRCb29sZWFuVmFsdWUoKTsKKwkJdG9nZ2xlRW5hYmxlZFJhbmdlQ29sb3JGaWxlZHMocmFuZ2VzRW5hYmxlZCk7CisJfSAvLyBpbml0aWFsaXplCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuSVByZWZlcmVuY2VzQ29udHJpYnV0ZXIjcGVyZm9ybURlZmF1bHRzKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7CisJCXplcm9Db2xvckZpZWxkRWRpdG9yLmdldENvbG9yU2VsZWN0b3IoKS5zZXRDb2xvclZhbHVlKFN0cmluZ0NvbnZlcnRlci5hc1JHQihGT1JFR1JPVU5EX0NPTE9SX1pFUk9fUkVMQVRJVkVfVkFMVUVfREVGQVVMVF9SR0JfU1RSSU5HKSk7CisJCXJhbmdlMUNvbG9yRmllbGRFZGl0b3IuZ2V0Q29sb3JTZWxlY3RvcigpLnNldENvbG9yVmFsdWUoU3RyaW5nQ29udmVydGVyLmFzUkdCKEZPUkVHUk9VTkRfQ09MT1JfUkFOR0VfMV9ERUZBVUxUX1JHQl9TVFJJTkcpKTsKKwkJcmFuZ2UyQ29sb3JGaWVsZEVkaXRvci5nZXRDb2xvclNlbGVjdG9yKCkuc2V0Q29sb3JWYWx1ZShTdHJpbmdDb252ZXJ0ZXIuYXNSR0IoRk9SRUdST1VORF9DT0xPUl9SQU5HRV8yX0RFRkFVTFRfUkdCX1NUUklORykpOworCQlyYW5nZTNDb2xvckZpZWxkRWRpdG9yLmdldENvbG9yU2VsZWN0b3IoKS5zZXRDb2xvclZhbHVlKFN0cmluZ0NvbnZlcnRlci5hc1JHQihGT1JFR1JPVU5EX0NPTE9SX1JBTkdFXzNfREVGQVVMVF9SR0JfU1RSSU5HKSk7CisJCXJhbmdlNENvbG9yRmllbGRFZGl0b3IuZ2V0Q29sb3JTZWxlY3RvcigpLnNldENvbG9yVmFsdWUoU3RyaW5nQ29udmVydGVyLmFzUkdCKEZPUkVHUk9VTkRfQ09MT1JfUkFOR0VfNF9ERUZBVUxUX1JHQl9TVFJJTkcpKTsKKwkJcmFuZ2U1Q29sb3JGaWVsZEVkaXRvci5nZXRDb2xvclNlbGVjdG9yKCkuc2V0Q29sb3JWYWx1ZShTdHJpbmdDb252ZXJ0ZXIuYXNSR0IoRk9SRUdST1VORF9DT0xPUl9SQU5HRV81X0RFRkFVTFRfUkdCX1NUUklORykpOworCQltYXhDb2xvckZpZWxkRWRpdG9yLmdldENvbG9yU2VsZWN0b3IoKS5zZXRDb2xvclZhbHVlKFN0cmluZ0NvbnZlcnRlci5hc1JHQihGT1JFR1JPVU5EX0NPTE9SX01BWElNVU1fUkVMQVRJVkVfVkFMVUVfREVGQVVMVF9SR0JfU1RSSU5HKSk7CisJfSAvLyBwZXJmb3JtRGVmYXVsdHMKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5JUHJlZmVyZW5jZXNDb250cmlidXRlciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQlpZiAoZXZlbnQuZ2V0U291cmNlKCkgPT0gdXNlQWxwaGFDb21wb3NpdGVCb29sZWFuRmllbGRFZGl0b3IpIHsKKwkJCWJvb2xlYW4gcmFuZ2VzRW5hYmxlZCA9ICF1c2VBbHBoYUNvbXBvc2l0ZUJvb2xlYW5GaWVsZEVkaXRvci5nZXRCb29sZWFuVmFsdWUoKTsKKwkJCXRvZ2dsZUVuYWJsZWRSYW5nZUNvbG9yRmlsZWRzKHJhbmdlc0VuYWJsZWQpOworCQl9CisJfSAvLyBwcm9wZXJ0eUNoYW5nZQorCQorCS8qKgorCSAqIFRvZ2dsZXMgYmV0d2VlbiBlbmFibGVkIGFuZCBkaXNhYmxlZCBtb2RlIG9mIHRoZSByYW5nZSBjb2xvciBmaWVsZCBlZGl0b3JzLgorCSAqIEBwYXJhbSBpc0VuYWJsZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGZpZWxkcworCSAqLworCXByaXZhdGUgdm9pZCB0b2dnbGVFbmFibGVkUmFuZ2VDb2xvckZpbGVkcyhib29sZWFuIGlzRW5hYmxlZCkgeworCQl6ZXJvQ29sb3JGaWVsZEVkaXRvci5zZXRFbmFibGVkKGlzRW5hYmxlZCwgcmVsYXRpdmVWYWx1ZXNQcmVmR3JvdXApOworCQlyYW5nZTFDb2xvckZpZWxkRWRpdG9yLnNldEVuYWJsZWQoaXNFbmFibGVkLCByZWxhdGl2ZVZhbHVlc1ByZWZHcm91cCk7CisJCXJhbmdlMkNvbG9yRmllbGRFZGl0b3Iuc2V0RW5hYmxlZChpc0VuYWJsZWQsIHJlbGF0aXZlVmFsdWVzUHJlZkdyb3VwKTsKKwkJcmFuZ2UzQ29sb3JGaWVsZEVkaXRvci5zZXRFbmFibGVkKGlzRW5hYmxlZCwgcmVsYXRpdmVWYWx1ZXNQcmVmR3JvdXApOworCQlyYW5nZTRDb2xvckZpZWxkRWRpdG9yLnNldEVuYWJsZWQoaXNFbmFibGVkLCByZWxhdGl2ZVZhbHVlc1ByZWZHcm91cCk7CisJCXJhbmdlNUNvbG9yRmllbGRFZGl0b3Iuc2V0RW5hYmxlZChpc0VuYWJsZWQsIHJlbGF0aXZlVmFsdWVzUHJlZkdyb3VwKTsKKwkJbWF4Q29sb3JGaWVsZEVkaXRvci5zZXRFbmFibGVkKGlzRW5hYmxlZCwgcmVsYXRpdmVWYWx1ZXNQcmVmR3JvdXApOworCX0gLy8gdG9nZ2xlRW5hYmxlZFJhbmdlQ29sb3JGaWxlZHMKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuSVByZWZlcmVuY2VzQ29udHJpYnV0ZXIjc2V0UHJlZmVyZW5jZVBhZ2Uob3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5NYXBzQ29sb3JzUHJlZmVyZW5jZVBhZ2UpCisJICovCisJcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZVBhZ2UoTWFwc0NvbG9yc1ByZWZlcmVuY2VQYWdlIHByZWZlcmVuY2VQYWdlKSB7CisJCXRoaXMucHJlZmVyZW5jZXNQYWdlID0gcHJlZmVyZW5jZVBhZ2U7CisJfSAvLyBzZXRQcmVmZXJlbmNlUGFnZQorCit9IC8vIFJlbGF0aXZlVmFsdWVDb2xvclByZWZlcmVuY2VzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL1JlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL1JlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhNmUxOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvLyBSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3I7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHdpbGwgcHJvdmlkZSBhbiByZWxhdGl2ZSB2YWx1ZSBmb3IgYQorICogc3BlY2lmaWMgYWRhcHRlZCBvYmplY3QuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXIgZXh0ZW5kcyBDb2xvclByb3ZpZGVyIHsKKworCS8qKgorCSAqIFRoZSByZWxhdGl2ZSB2YWx1ZSBmb3IgdGhlIGFkYXB0ZWQgb2JqZWN0LgorCSAqIEByZXR1cm4gdGhlIHJlbGF0aXZlIHZhbHVlCisJICovCisJcHVibGljIGZsb2F0IGdldFJlbGF0aXZlVmFsdWUoKTsKKwkKK30vLyBSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9SZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2NvbG9yL1JlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWQ2ZDMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9SZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLy8gUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgY3JlYXRlIGFkYXB0ZXJzIHRoYXQgYWRhcHQKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdH1zIHRvIHtAbGluayBSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlcn0KKyAqIHMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCUNvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcworCSAqIHtAbGluayBSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlcn0gaW5zdGFuY2VzLgorCSAqIDxwPgorCSAqIFRoaXMgaW5zdGFuY2UgaXMgYSB7QGxpbmsgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeX0gd2hpY2ggbWVhbnMgdGhhdCBpdAorCSAqIGNvbGxlY3RzIHRvZ2V0aGVyIG90aGVyIHtAbGluayBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5fSBhZGFwdGVyCisJICogZmFjdG9yaWVzLiBFYWNoIGNsYXNzIHRoYXQgaW1wbGVtZW50cworCSAqIHtAbGluayBSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5fSBuZWVkcyB0byBhZGQgaXRzZWxmIHRvIHRoaXMKKwkgKiBpbnN0YW5jZSB3aXRoIGEgY2FsbCB0bworCSAqIHtAbGluayBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2FkZEFkYXB0ZXJGYWN0b3J5KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KX0uCisJICogVGhpcyB3aWxsIHRoZW4gYWxsb3cgYWRhcHRlcnMgY3JlYXRlZCBieSB0aGF0IGZhY3RvcnkgdG8gYmUgZm91bmQgd2hlbgorCSAqIGFkYXB0aW5nIGNsYXNzIGluc3RhbmNlcyBoYW5kbGVkIGJ5IHRoZSBuZXcgZmFjdG9yeS4KKwkgKiA8cD4KKwkgKiBCYXNpY2FsbHksIGlmIHlvdSBjcmVhdGUgYW4gRU1GIG1vZGVsIGFuZCBkZWZpbmUgYQorCSAqIHtAbGluayBSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5fSBmb3IgaXQgc28gdGhhdCB0aGUgY2xhc3NlcyBpbgorCSAqIHRoYXQgbW9kZWwgY2FuIGJlIGFkYXB0ZWQsIHlvdSBuZWVkIHRvIGhvb2sgdGhhdCBmYWN0b3J5IGludG8gdGhpcyBvbmUgc28KKwkgKiB0aGF0IGxhdGVyIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFkYXB0IGEgY2xhc3MgZnJvbSB0aGF0IG1vZGVsIGlzCisJICogbWFkZSB0aGUgYXNzb2NpYXRlZCBmYWN0b3J5IHdpbGwgYmUgZm91bmQuIFlvdSBjYW4gZG8gdGhhdCBieSBhZGRpbmcgdGhlCisJICogbGluZTogPGNvZGU+CisJICogUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGRBZGFwdGVyRmFjdG9yeSh0aGlzKTsKKwkgKiA8L2NvZGU+CisJICogdG8gdGhlIGRlZmF1bHQgY29uc3RydWN0b3Igb2YgdGhlIG5ldyBmYWN0b3J5IGFmdGVyIHRoZSBzdXBlciBjYWxsLgorCSAqIFlvdSdyZSBub3QgZG9uZSBob3dldmVyLCB5b3UgYWxzbyBoYXZlIHRvICJmb3JjZSIgYW4gaW5zdGFuY2Ugb2YgdGhlCisJICogY2xhc3MgdG8gYmUgY3JlYXRlZCBzbyB0aGF0IHRoZSBjb25zdHJ1Y3RvciBpcyBydW4uIFRoaXMgaXMgdHlwaWNhbGx5CisJICogYWNoaWV2ZWQgYnkgYWxsb2NhdGluZyBhbiBpbnN0YW5jZSBpbiB0aGUgPGNvZGU+c3RhcnQ8L2NvZGU+IG1ldGhvZCBvZgorCSAqIHRoZSA8Y29kZT5BY3RpdmF0b3I8L2NvZGU+IG9mIHRoZSBwbHVnLWluIHRoYXQgZGVmaW5lcyB0aGUgZmFjdG9yeS4KKwkgKi8KKwlSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbCBJTlNUQU5DRSA9IG5ldyBSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbCgpOworCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzCisJICoge0BsaW5rIFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyfSdzCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzCisJCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMKKwkJCVJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJCXJldHVybiB0eXBlID09IFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyLmNsYXNzOworCQl9IC8vIGlzRmFjdG9yeUZvclR5cGUKKwl9IC8vIFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnlJbXBsCisKK30gLy8gUmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9jb2xvci9TdGFuZGFyZENvbG9yUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvU3RhbmRhcmRDb2xvclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4MDYwNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvY29sb3IvU3RhbmRhcmRDb2xvclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8vIFN0YW5kYXJkQ29sb3JQcm92aWRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuU3RyaW5nQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuTWFwc0NvbG9yc1ByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKKworLyoqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN0YW5kYXJkIGNvbG9ycyBmb3IgcmVuZGVyZWQgbWFwcy4KKyAqIFRoZSBjb2xvcnMgYXJlIGJhc2VkIG9uIHRoZSBjb2xvcnMgZnJvbSB0aGUgcHJlZmVyZW5jZXMgcGFnZS4gVGhpcyBjbGFzcyBpcyBiZWluZyB1c2VkIGJlY2F1c2UKKyAqIHRha2luZyB0aGUgdmFsdWVzIGRpcmVjdGx5IGZyb20gdGhlIHByZWZlcmVuY2VzIGlzIHRpbWUgY29uc3VtaW5nIGFuZCB0aGlzIGlzIGJlaW5nIGRvbmUgbWFueQorICogdGltZXMgYW5kIHRoZSBjdW11bGF0aXZlIHRpbWUgbWF5IGJlIGxhcmdlLgorICovCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRDb2xvclByb3ZpZGVyIAorCWltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgeworCQorCS8qKgorCSAqIEEgbWFwIGZvciBob2xkaW5nIHRoZSB2YWx1ZXMgb2YgY29sb3IgSURzCisJICovCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb2xvcj4gY29sb3JJZFRvQ29sb3IgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbG9yPigpOworCQorCXByaXZhdGUgRGV2aWNlIGRldmljZSA9IG51bGw7CisJCisJLyoqCisJICogVGhlIGNvbnN0cnVjdG9yIHdpbGwgdXBkYXRlIHRoZSBjdXJyZW50IGNvbG9ycyBmcm9tIHRoZSBwcmVmZXJlbmNlcyBhbmQgcmVnaXN0ZXIKKwkgKiB0aGlzIG9iamVjdCBhcyBhIGxpc3RlbmVyIHRvIHByZWZlcmVuY2VzIGNoYW5nZXMuCisJICogQHBhcmFtIGRldmljZSBBIHtAbGluayBEZXZpY2V9IHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gY3JlYXRpbmcge0BsaW5rIENvbG9yfSBvYmplY3RzLgorCSAqLworCXB1YmxpYyBTdGFuZGFyZENvbG9yUHJvdmlkZXIoRGV2aWNlIGRldmljZSkgeworCQl0aGlzLmRldmljZSA9IGRldmljZTsKKwkJZmluYWwgUHJlZmVyZW5jZXMgcHJlZnMgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7CisJCXByZWZzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisJCXVwZGF0ZUNvbG9yc0Zyb21QcmVmZXJlbmNlcygpOworCX0gLy8gU3RhbmRhcmRDb2xvclByb3ZpZGVyCisJCisJLyoqCisJICogVGhlIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgYmFja2dyb3VuZCB7QGxpbmsgQ29sb3J9LgorCSAqIEByZXR1cm4gdGhlIGJhY2tncm91bmQge0BsaW5rIENvbG9yfQorCSAqLworCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kQ29sb3IoKSB7CisJCXJldHVybiBjb2xvcklkVG9Db2xvci5nZXQoTWFwc0NvbG9yc1ByZWZlcmVuY2VQYWdlLkJBQ0tHUk9VTkRfQ09MT1JfSUQpOworCX0gLy8gZ2V0QmFja2dyb3VuZENvbG9yCisKKwkvKioKKwkgKiBUaGUgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBib3JkZXJzIHtAbGluayBDb2xvcn0uCisJICogQHJldHVybiB0aGUgYm9yZGVycyB7QGxpbmsgQ29sb3J9CisJICovCisJcHVibGljIENvbG9yIGdldEJvcmRlcnNDb2xvcigpIHsKKwkJcmV0dXJuIGNvbG9ySWRUb0NvbG9yLmdldChNYXBzQ29sb3JzUHJlZmVyZW5jZVBhZ2UuQk9SREVSU19DT0xPUl9JRCk7CisJfSAvLyBnZXRCb3JkZXJzQ29sb3IKKwkKKwkvKioKKwkgKiBUaGUgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBlZGdlcyB7QGxpbmsgQ29sb3J9LgorCSAqIEByZXR1cm4gdGhlIGVkZ2VzIHtAbGluayBDb2xvcn0KKwkgKi8KKwlwdWJsaWMgQ29sb3IgZ2V0RWRnZXNDb2xvcigpIHsKKwkJcmV0dXJuIGNvbG9ySWRUb0NvbG9yLmdldChNYXBzQ29sb3JzUHJlZmVyZW5jZVBhZ2UuRURHRVNfQ09MT1JfSUQpOworCX0gLy8gZ2V0RWRnZXNDb2xvcgorCisJLyoqCisJICogVGhlIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgZm9yZWdyb3VuZCB7QGxpbmsgQ29sb3J9LgorCSAqIEByZXR1cm4gdGhlIGZvcmVncm91bmQge0BsaW5rIENvbG9yfQorCSAqLworCXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kQ29sb3IoKSB7CisJCXJldHVybiBjb2xvcklkVG9Db2xvci5nZXQoTWFwc0NvbG9yc1ByZWZlcmVuY2VQYWdlLkZPUkVHUk9VTkRfQ09MT1JfSUQpOworCX0gLy8gZ2V0Rm9yZWdyb3VuZENvbG9yCisJCisJLyoqCisJICogVGhlIG1ldGhvZCBpcyB1c2VkIHRvIGNvbnZlcnQgUkdCIGFzIHN0cmluZyB0byB7QGxpbmsgQ29sb3J9LiAKKwkgKiBAcGFyYW0gcmdiU3RyaW5nIHRoZSBSR0Igc3RyaW5nCisJICogQHJldHVybiB0aGUgbWF0Y2hpbmcge0BsaW5rIENvbG9yfQorCSAqLworCXB1YmxpYyBDb2xvciBnZXRDb2xvckZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHJnYlN0cmluZykgeworCQlpZiAocmdiU3RyaW5nLmVxdWFscygiIikpIHsKKwkJCXJldHVybiBkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKTsKKwkJfQorCQlSR0IgcmdiID0gU3RyaW5nQ29udmVydGVyLmFzUkdCKHJnYlN0cmluZyk7CisJCS8vcmV0dXJuIG5ldyBDb2xvcihyZ2IucmVkLCByZ2IuZ3JlZW4sIHJnYi5ibHVlKTsKKwkJcmV0dXJuIG5ldyBDb2xvcihkZXZpY2UsIHJnYi5yZWQsIHJnYi5ncmVlbiwgcmdiLmJsdWUpOworCX0gLy8gZ2V0Q29sb3JGcm9tU3RyaW5nCisJCisJLyoqCisJICogVGhlIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGUgY29sb3JzIGZyb20gdGhlIHByZWZlcmVuY2VzIHBhZ2UuCisJICovCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbG9yc0Zyb21QcmVmZXJlbmNlcygpIHsKKwkJZmluYWwgUHJlZmVyZW5jZXMgcHJlZnMgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7CisJCVN0cmluZyBjb2xvcklkID0gTWFwc0NvbG9yc1ByZWZlcmVuY2VQYWdlLkZPUkVHUk9VTkRfQ09MT1JfSUQ7CisJCWNvbG9ySWRUb0NvbG9yLnB1dChjb2xvcklkLCBnZXRDb2xvckZyb21TdHJpbmcocHJlZnMuZ2V0U3RyaW5nKGNvbG9ySWQpKSk7CisJCWNvbG9ySWQgPSBNYXBzQ29sb3JzUHJlZmVyZW5jZVBhZ2UuQkFDS0dST1VORF9DT0xPUl9JRDsKKwkJY29sb3JJZFRvQ29sb3IucHV0KGNvbG9ySWQsIGdldENvbG9yRnJvbVN0cmluZyhwcmVmcy5nZXRTdHJpbmcoY29sb3JJZCkpKTsKKwkJY29sb3JJZCA9IE1hcHNDb2xvcnNQcmVmZXJlbmNlUGFnZS5CT1JERVJTX0NPTE9SX0lEOworCQljb2xvcklkVG9Db2xvci5wdXQoY29sb3JJZCwgZ2V0Q29sb3JGcm9tU3RyaW5nKHByZWZzLmdldFN0cmluZyhjb2xvcklkKSkpOworCQljb2xvcklkID0gTWFwc0NvbG9yc1ByZWZlcmVuY2VQYWdlLkVER0VTX0NPTE9SX0lEOworCQljb2xvcklkVG9Db2xvci5wdXQoY29sb3JJZCwgZ2V0Q29sb3JGcm9tU3RyaW5nKHByZWZzLmdldFN0cmluZyhjb2xvcklkKSkpOworCX0gLy8gdXBkYXRlQ29sb3JzRnJvbVByZWZlcmVuY2VzCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuUHJvcGVydHlDaGFuZ2VFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCVN0cmluZyBjb2xvcklkID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKKwkJaWYgKCFjb2xvcklkVG9Db2xvci5jb250YWluc0tleShjb2xvcklkKSkgeworCQkJcmV0dXJuOworCQl9CisJCUNvbG9yIGNvbG9yID0gZ2V0Q29sb3JGcm9tU3RyaW5nKChTdHJpbmcpZXZlbnQuZ2V0TmV3VmFsdWUoKSk7CisJCWNvbG9ySWRUb0NvbG9yLnB1dChjb2xvcklkLCBjb2xvcik7CisJfSAvLyBwcm9wZXJ0eUNoYW5nZQorCQorfSAvLyBTdGFuZGFyZENvbG9yUHJvdmlkZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvZXhlY3V0YWJsZS9JZGVudGlmaWFibGVEZWxlZ2F0ZUV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9leGVjdXRhYmxlL0lkZW50aWZpYWJsZURlbGVnYXRlRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNlNTg5ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvZXhlY3V0YWJsZS9JZGVudGlmaWFibGVEZWxlZ2F0ZUV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8vIElkZW50aWZpYWJsZURlbGVnYXRlRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5leGVjdXRhYmxlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuZXhlY3V0YWJsZS5FeGVjdXRhYmxlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLklkZW50aWZpYWJsZURlbGVnYXRlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4ge0BsaW5rIEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeX0gdGhhdCBhZGFwdHMge0BsaW5rCisgKiBJZGVudGlmaWFibGVEZWxlZ2F0ZX1zIHRvIHtAbGluayBJRXhlY3V0YWJsZX1zLgorICovCitwdWJsaWMgY2xhc3MgSWRlbnRpZmlhYmxlRGVsZWdhdGVFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcworCQlFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkgeworCisJLyoqCisJICogQHNlZQorCSAqIAlvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwKKwkgKiAJamF2YS5sYW5nLkNsYXNzKQorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihmaW5hbCBPYmplY3QgYWRhcHRhYmxlT2JqZWN0LAorCQkJZmluYWwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKKwkJSUV4ZWN1dGFibGUgcmV0VmFsdWUgPSBudWxsOworCQkvLyBJdCBpdCB3aGF0IHdlJ3JlIGxvb2tpbmcgZm9yPworCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlRGVsZWdhdGUKKwkJCQkmJiBhZGFwdGVyVHlwZS5lcXVhbHMoSUV4ZWN1dGFibGUuY2xhc3MpKSB7CisJCQkvLyBZZXMKKwkJCXJldFZhbHVlID0gKElFeGVjdXRhYmxlKSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIoCisJCQkJCSgoSWRlbnRpZmlhYmxlRGVsZWdhdGUpIGFkYXB0YWJsZU9iamVjdCkuZ2V0SWRlbnRpZmlhYmxlKCksCisJCQkJCUlFeGVjdXRhYmxlLmNsYXNzKTsKKwkJfSAvLyBpZgorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRBZGFwdGVyCisKK30gLy8gSWRlbnRpZmlhYmxlRGVsZWdhdGVFeGVjdXRhYmxlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvZmVhdHVyZW1vZGlmaWVyL0VTdHJ1Y3R1cmFsRmVhdHVyZUZlYXR1cmVNb2RpZmllckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2ZlYXR1cmVtb2RpZmllci9FU3RydWN0dXJhbEZlYXR1cmVGZWF0dXJlTW9kaWZpZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2Nzk5NWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2ZlYXR1cmVtb2RpZmllci9FU3RydWN0dXJhbEZlYXR1cmVGZWF0dXJlTW9kaWZpZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjc0IEBACisvLyBFU3RydWN0dXJhbEZlYXR1cmVGZWF0dXJlTW9kaWZpZXJBZGFwdGVyRmFjdG9yeS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZmVhdHVyZW1vZGlmaWVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTk9QTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlJhbmdlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNlcXVlbmNlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNpbmdsZVZhbHVlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5BY3RpdmF0b3I7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhbiBhZGFwdGVyIGZhY3RvcnkgdGhhdCBhZGFwdHMKKyAqIHtAbGluayBFU3RydWN0dXJhbEZlYXR1cmV9cyB0byB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyfXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRVN0cnVjdHVyYWxGZWF0dXJlRmVhdHVyZU1vZGlmaWVyQWRhcHRlckZhY3RvcnkgeworCisJLyoqCisJICogU2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqLworCUlkZW50aWZpYWJsZUZlYXR1cmVNb2RpZmllckFkYXB0ZXJGYWN0b3J5SW1wbCBJTlNUQU5DRSA9IG5ldyBJZGVudGlmaWFibGVGZWF0dXJlTW9kaWZpZXJBZGFwdGVyRmFjdG9yeUltcGwoKTsKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YKKwkgKiB7QGxpbmsgRVN0cnVjdHVyYWxGZWF0dXJlRmVhdHVyZU1vZGlmaWVyQWRhcHRlckZhY3Rvcnl9IHRoYXQgYWRhcHRzCisJICoge0BsaW5rIEVTdHJ1Y3R1cmFsRmVhdHVyZX1zIG9mCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlfXMgdG8KKwkgKiB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyfXMuCisJICogPHA+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpc24ndCBxdWl0ZSBjb21wbGV0ZSBhcyBpdCBkb2Vzbid0IGFsbG93IHRoZSBmYWN0b3J5CisJICogdG8gYmUgZXh0ZW5kZWQgYnkgYWRkaW5nIGFub3RoZXIgaW1wbGVtZW50YXRpb25zIG9mCisJICoge0BsaW5rIEVTdHJ1Y3R1cmFsRmVhdHVyZUZlYXR1cmVNb2RpZmllckFkYXB0ZXJGYWN0b3J5fS4gRG9pbmcgc28gd291bGQKKwkgKiBhbGxvdyBkaWZmZXJlbnQgdHlwZXMgcHJvdmlkZWQgYnkgb3RoZXIgcGx1Z2lucyB0byBiZSBhZGFwdGVkLgorCSAqLworCXB1YmxpYyBjbGFzcyBJZGVudGlmaWFibGVGZWF0dXJlTW9kaWZpZXJBZGFwdGVyRmFjdG9yeUltcGwgaW1wbGVtZW50cworCQkJRVN0cnVjdHVyYWxGZWF0dXJlRmVhdHVyZU1vZGlmaWVyQWRhcHRlckZhY3RvcnkgeworCisJCS8qKgorCQkgKiBAcGFyYW0gb2JqCisJCSAqICAgICAgICAgICAgdGhlIHtAbGluayBFU3RydWN0dXJhbEZlYXR1cmV9IHRvIGJlIGFkYXB0ZWQKKwkJICogQHBhcmFtIHRhcmdldAorCQkgKiAgICAgICAgICAgIHRoZSBjbGFzcyB0byBhZGFwdCB0bworCQkgKiBAcmV0dXJuIGEge0BsaW5rIEZlYXR1cmVNb2RpZmllcn0gZm9yIHRoZSBvYmosIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJCSAqICAgICAgICAgaWYgdGhhdCdzIG5vdCBwb3NzaWJsZS4KKwkJICovCisJCXB1YmxpYyBGZWF0dXJlTW9kaWZpZXIgYWRhcHQoZmluYWwgT2JqZWN0IG9iaiwgZmluYWwgT2JqZWN0IHRhcmdldCkgeworCQkJRmVhdHVyZU1vZGlmaWVyIHJldFZhbHVlID0gbnVsbDsKKwkJCWlmIChvYmogaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJCQkvLyBZZXMKKwkJCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIG9iajsKKwkJCQlpZiAodGFyZ2V0ID09IE5PUE1vZGlmaWVyLmNsYXNzKSB7CisJCQkJCS8vIFllcworCQkJCQkvLyBJbnRlZ2VyIE5PUD8KKwkJCQkJaWYgKGZlYXR1cmUuZ2V0RVR5cGUoKSA9PSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVJbnQoKSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQlyZXRWYWx1ZSA9IE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCQkJLmNyZWF0ZUludGVnZXJOT1BNb2RpZmllcigpOworCQkJCQkJcmV0VmFsdWUuc2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmUpOworCQkJCQl9IC8vIGlmIGludGVnZXIgTk9QCisJCQkJCS8vIExvbmcgTk9QPworCQkJCQllbHNlIGlmIChmZWF0dXJlLmdldEVUeXBlKCkgPT0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRQorCQkJCQkJCS5nZXRFTG9uZygpKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCQkJCQkuY3JlYXRlTG9uZ05PUE1vZGlmaWVyKCk7CisJCQkJCQlyZXRWYWx1ZS5zZXRFU3RydWN0dXJhbEZlYXR1cmUoZmVhdHVyZSk7CisJCQkJCX0gLy8gaWYgTG9uZyBOT1AKKwkJCQkJLy8gRG91YmxlIE5PUD8KKwkJCQkJZWxzZSBpZiAoZmVhdHVyZS5nZXRFVHlwZSgpID09IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCQkuZ2V0RURvdWJsZSgpKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCQkJCQkuY3JlYXRlRG91YmxlTk9QTW9kaWZpZXIoKTsKKwkJCQkJCXJldFZhbHVlLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlKTsKKwkJCQkJfSAvLyBpZiBkb3VibGUgTk9QCisJCQkJCS8vIFNURU1UaW1lIE5PUD8KKwkJCQkJZWxzZSBpZiAoZmVhdHVyZS5nZXRFVHlwZSgpID09IE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCQkuZ2V0U1RFTVRpbWUoKSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQlyZXRWYWx1ZSA9IE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCQkJLmNyZWF0ZVNURU1UaW1lTk9QTW9kaWZpZXIoKTsKKwkJCQkJCXJldFZhbHVlLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlKTsKKwkJCQkJfSAvLyBpZiBTVEVNVGltZSBOT1AKKwkJCQkJLy8gU3RyaW5nIE5PUD8KKwkJCQkJZWxzZSBpZiAoZmVhdHVyZS5nZXRFVHlwZSgpID09IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCQkuZ2V0RVN0cmluZygpKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCQkJCQkuY3JlYXRlU3RyaW5nTk9QTW9kaWZpZXIoKTsKKwkJCQkJCXJldFZhbHVlLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlKTsKKwkJCQkJfSAvLyBpZiBTdHJpbmcgTk9QCisJCQkJCWVsc2UgeworCQkJCQkJLy8gTm8KKwkJCQkJCS8vIE5vdCBpbXBsZW1lbnRlZAorLy8JCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkZlYXR1cmVNb2RpZmllckFkYXB0ZXIgZm9yIHR5cGUgXCIiCisvLwkJCQkJCQkJKyBmZWF0dXJlLmdldEVUeXBlKCkuZ2V0TmFtZSgpCisvLwkJCQkJCQkJKyAiXCIgaXMgbm90IGltcGxlbWVudGVkLiIsIG51bGwpOworCQkJCQkJcmV0VmFsdWUgPSBNb2RpZmllckZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCQkJCS5jcmVhdGVOT1BNb2RpZmllcigpOworCQkJCQkJcmV0VmFsdWUuc2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmUpOworCQkJCQl9IC8vIGVsc2UKKwkJCQl9IC8vIGlmIE5PUE1vZGlmaWVyCisJCQkJZWxzZSBpZiAodGFyZ2V0ID09IFNpbmdsZVZhbHVlTW9kaWZpZXIuY2xhc3MpIHsKKwkJCQkJLy8gWWVzCisJCQkJCS8vIEludGVnZXIgcmFuZ2U/CisJCQkJCWlmIChmZWF0dXJlLmdldEVUeXBlKCkgPT0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFSW50KCkpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJcmV0VmFsdWUgPSBNb2RpZmllckZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCQkJCS5jcmVhdGVJbnRlZ2VyTW9kaWZpZXIoKTsKKwkJCQkJCXJldFZhbHVlLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlKTsKKwkJCQkJfSAvLyBpZiBpbnRlZ2VyIHJhbmdlCisJCQkJCS8vIExvbmcgcmFuZ2U/CisJCQkJCWVsc2UgaWYgKGZlYXR1cmUuZ2V0RVR5cGUoKSA9PSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFCisJCQkJCQkJLmdldEVMb25nKCkpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJcmV0VmFsdWUgPSBNb2RpZmllckZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCQkJCS5jcmVhdGVMb25nTW9kaWZpZXIoKTsKKwkJCQkJCXJldFZhbHVlLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlKTsKKwkJCQkJfSAvLyBpZiBMb25nIHJhbmdlCisJCQkJCS8vIERvdWJsZSByYW5nZT8KKwkJCQkJZWxzZSBpZiAoZmVhdHVyZS5nZXRFVHlwZSgpID09IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCQkuZ2V0RURvdWJsZSgpKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCQkJCQkuY3JlYXRlRG91YmxlTW9kaWZpZXIoKTsKKwkJCQkJCXJldFZhbHVlLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlKTsKKwkJCQkJfSAvLyBpZiBkb3VibGUgcmFuZ2UKKwkJCQkJLy8gU1RFTVRpbWUgcmFuZ2U/CisJCQkJCWVsc2UgaWYgKGZlYXR1cmUuZ2V0RVR5cGUoKSA9PSBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCisJCQkJCQkJLmdldFNURU1UaW1lKCkpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJcmV0VmFsdWUgPSBNb2RpZmllckZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCQkJCS5jcmVhdGVTVEVNVGltZU1vZGlmaWVyKCk7CisJCQkJCQlyZXRWYWx1ZS5zZXRFU3RydWN0dXJhbEZlYXR1cmUoZmVhdHVyZSk7CisJCQkJCX0gLy8gaWYgU1RFTVRpbWUgcmFuZ2UKKwkJCQkJZWxzZSB7CisJCQkJCQkvLyBObworCQkJCQkJLy8gTm90IGltcGxlbWVudGVkCisJCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkZlYXR1cmVNb2RpZmllckFkYXB0ZXIgZm9yIHR5cGUgXCIiCisJCQkJCQkJCSsgZmVhdHVyZS5nZXRFVHlwZSgpLmdldE5hbWUoKQorCQkJCQkJCQkrICJcIiBpcyBub3QgaW1wbGVtZW50ZWQuIiwgbnVsbCk7CisJCQkJCQlyZXRWYWx1ZSA9IE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCQkJLmNyZWF0ZU5PUE1vZGlmaWVyKCk7CisJCQkJCQlyZXRWYWx1ZS5zZXRFU3RydWN0dXJhbEZlYXR1cmUoZmVhdHVyZSk7CisJCQkJCX0KKwkJCQl9IC8vIGlmIFJhbmdlIE1vZGlmaWVyCisJCQkJZWxzZSBpZiAodGFyZ2V0ID09IFJhbmdlTW9kaWZpZXIuY2xhc3MpIHsKKwkJCQkJLy8gWWVzCisJCQkJCS8vIEludGVnZXIgcmFuZ2U/CisJCQkJCWlmIChmZWF0dXJlLmdldEVUeXBlKCkgPT0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFSW50KCkpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJcmV0VmFsdWUgPSBNb2RpZmllckZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCQkJCS5jcmVhdGVJbnRlZ2VyUmFuZ2VNb2RpZmllcigpOworCQkJCQkJcmV0VmFsdWUuc2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmUpOworCQkJCQl9IC8vIGlmIGludGVnZXIgcmFuZ2UKKwkJCQkJLy8gTG9uZyByYW5nZT8KKwkJCQkJZWxzZSBpZiAoZmVhdHVyZS5nZXRFVHlwZSgpID09IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCQkuZ2V0RUxvbmcoKSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQlyZXRWYWx1ZSA9IE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCQkJLmNyZWF0ZUxvbmdSYW5nZU1vZGlmaWVyKCk7CisJCQkJCQlyZXRWYWx1ZS5zZXRFU3RydWN0dXJhbEZlYXR1cmUoZmVhdHVyZSk7CisJCQkJCX0gLy8gaWYgTG9uZyByYW5nZQorCQkJCQkvLyBEb3VibGUgcmFuZ2U/CisJCQkJCWVsc2UgaWYgKGZlYXR1cmUuZ2V0RVR5cGUoKSA9PSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFCisJCQkJCQkJLmdldEVEb3VibGUoKSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQlyZXRWYWx1ZSA9IE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCQkJLmNyZWF0ZURvdWJsZVJhbmdlTW9kaWZpZXIoKTsKKwkJCQkJCXJldFZhbHVlLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlKTsKKwkJCQkJfSAvLyBpZiBkb3VibGUgcmFuZ2UKKwkJCQkJLy8gU1RFTVRpbWUgcmFuZ2U/CisJCQkJCWVsc2UgaWYgKGZlYXR1cmUuZ2V0RVR5cGUoKSA9PSBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCisJCQkJCQkJLmdldFNURU1UaW1lKCkpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJcmV0VmFsdWUgPSBNb2RpZmllckZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCQkJCS5jcmVhdGVTVEVNVGltZVJhbmdlTW9kaWZpZXIoKTsKKwkJCQkJCXJldFZhbHVlLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlKTsKKwkJCQkJfSAvLyBpZiBTVEVNVGltZSByYW5nZQorCQkJCQllbHNlIHsKKwkJCQkJCS8vIE5vCisJCQkJCQkvLyBOb3QgaW1wbGVtZW50ZWQKKwkJCQkJCUFjdGl2YXRvci5sb2dFcnJvcigiRmVhdHVyZU1vZGlmaWVyQWRhcHRlciBmb3IgdHlwZSBcIiIKKwkJCQkJCQkJKyBmZWF0dXJlLmdldEVUeXBlKCkuZ2V0TmFtZSgpCisJCQkJCQkJCSsgIlwiIGlzIG5vdCBpbXBsZW1lbnRlZC4iLCBudWxsKTsKKwkJCQkJCXJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCQkJCQkuY3JlYXRlTk9QTW9kaWZpZXIoKTsKKwkJCQkJCXJldFZhbHVlLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlKTsKKwkJCQkJfQorCQkJCX0gLy8gaWYgUmFuZ2UgTW9kaWZpZXIKKwkJCQkvLyBTZXF1ZW5jZT8KKwkJCQllbHNlIGlmICh0YXJnZXQgPT0gU2VxdWVuY2VNb2RpZmllci5jbGFzcykgeworCQkJCQkvLyBZZXMKKwkJCQkJLy8gSW50ZWdlciBTZXF1ZW5jZT8KKwkJCQkJaWYgKGZlYXR1cmUuZ2V0RVR5cGUoKSA9PSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVJbnQoKSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQlyZXRWYWx1ZSA9IE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCQkJLmNyZWF0ZUludGVnZXJTZXF1ZW5jZU1vZGlmaWVyKCk7CisJCQkJCQlyZXRWYWx1ZS5zZXRFU3RydWN0dXJhbEZlYXR1cmUoZmVhdHVyZSk7CisJCQkJCX0gLy8gaWYgaW50ZWdlciBTZXF1ZW5jZQorCQkJCQkvLyBMb25nIFNlcXVlbmNlPworCQkJCQllbHNlIGlmIChmZWF0dXJlLmdldEVUeXBlKCkgPT0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRQorCQkJCQkJCS5nZXRFTG9uZygpKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCQkJCQkuY3JlYXRlTG9uZ1NlcXVlbmNlTW9kaWZpZXIoKTsKKwkJCQkJCXJldFZhbHVlLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlKTsKKwkJCQkJfSAvLyBpZiBMb25nIFNlcXVlbmNlCisJCQkJCS8vIERvdWJsZSBTZXF1ZW5jZT8KKwkJCQkJZWxzZSBpZiAoZmVhdHVyZS5nZXRFVHlwZSgpID09IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCQkuZ2V0RURvdWJsZSgpKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCQkJCQkuY3JlYXRlRG91YmxlU2VxdWVuY2VNb2RpZmllcigpOworCQkJCQkJcmV0VmFsdWUuc2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmUpOworCQkJCQl9IC8vIGlmIGRvdWJsZSBTZXF1ZW5jZQorCQkJCQkvLyBTVEVNVGltZSBTZXF1ZW5jZT8KKwkJCQkJZWxzZSBpZiAoZmVhdHVyZS5nZXRFVHlwZSgpID09IE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCQkuZ2V0U1RFTVRpbWUoKSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQlyZXRWYWx1ZSA9IE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCQkJLmNyZWF0ZVNURU1UaW1lU2VxdWVuY2VNb2RpZmllcigpOworCQkJCQkJcmV0VmFsdWUuc2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmUpOworCQkJCQl9IC8vIGlmIFNURU1UaW1lIFNlcXVlbmNlCisJCQkJCS8vIFN0cmluZyBTZXF1ZW5jZT8KKwkJCQkJZWxzZSBpZiAoZmVhdHVyZS5nZXRFVHlwZSgpID09IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UKKwkJCQkJCQkuZ2V0RVN0cmluZygpKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCQkJCQkuY3JlYXRlU3RyaW5nU2VxdWVuY2VNb2RpZmllcigpOworCQkJCQkJcmV0VmFsdWUuc2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmUpOworCQkJCQl9IC8vIGlmIFN0cmluZyBTZXF1ZW5jZQorCQkJCQllbHNlIHsKKwkJCQkJCS8vIE5vCisJCQkJCQkvLyBOb3QgaW1wbGVtZW50ZWQKKwkJCQkJCUFjdGl2YXRvci5sb2dFcnJvcigiRmVhdHVyZU1vZGlmaWVyQWRhcHRlciBmb3IgdHlwZSBcIiIKKwkJCQkJCQkJKyBmZWF0dXJlLmdldEVUeXBlKCkuZ2V0TmFtZSgpCisJCQkJCQkJCSsgIlwiIGlzIG5vdCBpbXBsZW1lbnRlZC4iLCBudWxsKTsKKwkJCQkJCXJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCQkJCQkuY3JlYXRlTk9QTW9kaWZpZXIoKTsKKwkJCQkJCXJldFZhbHVlLnNldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlKTsKKwkJCQkJfQorCQkJCX0gLy8gaWYgU2VxdWVuY2UgTW9kaWZpZXIKKwkJCQllbHNlIHsKKwkJCQkJLy8gTm8KKwkJCQkJLy8gTm90IGltcGxlbWVudGVkCisJCQkJCUFjdGl2YXRvci5sb2dFcnJvcigiRmVhdHVyZU1vZGlmaWVyQWRhcHRlciBmb3IgdHlwZSBcIiIKKwkJCQkJCQkrIGZlYXR1cmUuZ2V0RVR5cGUoKS5nZXROYW1lKCkKKwkJCQkJCQkrICJcIiBpcyBub3QgaW1wbGVtZW50ZWQuIiwgbnVsbCk7CisJCQkJCXJldFZhbHVlID0gTW9kaWZpZXJGYWN0b3J5LmVJTlNUQU5DRQorCQkJCQkJCS5jcmVhdGVOT1BNb2RpZmllcigpOworCQkJCQlyZXRWYWx1ZS5zZXRFU3RydWN0dXJhbEZlYXR1cmUoZmVhdHVyZSk7CisJCQkJfQorCQkJfSAvLyBpZiBFU3RydWN0dXJhbEZlYXR1cmUKKwkJCXJldHVybiByZXRWYWx1ZTsKKwkJfSAvLyBhZGFwdAorCisJfSAvLyBJZGVudGlmaWFibGVGZWF0dXJlTW9kaWZpZXJBZGFwdGVyRmFjdG9yeUltcGwKKworfSAvLyBFU3RydWN0dXJhbEZlYXR1cmVGZWF0dXJlTW9kaWZpZXJBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlL0V4cGVyaW1lbnRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlL0V4cGVyaW1lbnRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMGEzOGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2ZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUvRXhwZXJpbWVudEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8vIEV4cGVyaW1lbnRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlRmFjdG9yeS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci51dGlsLk1vZGlmaWVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlLlJhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuRG91YmxlUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5JbnRlZ2VyUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5Mb25nUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5TVEVNVGltZVJhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnl9IHRoYXQKKyAqIGFkYXB0cyB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkZlYXR1cmVNb2RpZmllcn1zIHRvCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld01vZGlmaWVyUGFnZS5GZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlfQorICogcy4KKyAqLworcHVibGljIGNsYXNzIEV4cGVyaW1lbnRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlRmFjdG9yeSBleHRlbmRzCisJCU1vZGlmaWVyQWRhcHRlckZhY3RvcnkgeworCisJLyoqCisJICogRGVmYXVsdCBDb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBJdCBhZGRzIGFuIGluc3RhbmNlIG9mIHRoZSB0aGlzIGZhY3RvcnkgdG8KKwkgKiB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXJGYWN0b3J5I0lOU1RBTkNFfS4KKwkgKi8KKwlwdWJsaWMgRXhwZXJpbWVudEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVGYWN0b3J5KCkgeworCQlzdXBlcigpOworCQlGZWF0dXJlTW9kaWZpZXJGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkuYWRkQWRhcHRlckZhY3RvcnkodGhpcyk7CisJfSAvLyBJbnRlZ2VyUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudXRpbC5Nb2RpZmllckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZU5PUE1vZGlmaWVyQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTk9QTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IE5PUEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudXRpbC5Nb2RpZmllckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURvdWJsZU5PUE1vZGlmaWVyQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRG91YmxlTk9QTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IE5PUEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLk51bWVyaWNOT1BGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnV0aWwuTW9kaWZpZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEb3VibGVSYW5nZU1vZGlmaWVyQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRG91YmxlUmFuZ2VNb2RpZmllckFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgRG91YmxlUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnV0aWwuTW9kaWZpZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVJbnRlZ2VyTk9QTW9kaWZpZXJBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbnRlZ2VyTk9QTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IE5PUEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLk51bWVyaWNOT1BGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnV0aWwuTW9kaWZpZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVJbnRlZ2VyUmFuZ2VNb2RpZmllckFkYXB0ZXIoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUludGVnZXJSYW5nZU1vZGlmaWVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBJbnRlZ2VyUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnV0aWwuTW9kaWZpZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVMb25nTk9QTW9kaWZpZXJBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb25nTk9QTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IE5PUEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLk51bWVyaWNOT1BGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnV0aWwuTW9kaWZpZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVMb25nUmFuZ2VNb2RpZmllckFkYXB0ZXIoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvbmdSYW5nZU1vZGlmaWVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBMb25nUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnV0aWwuTW9kaWZpZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVTdHJpbmdOT1BNb2RpZmllckFkYXB0ZXIoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0cmluZ05PUE1vZGlmaWVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBOT1BGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5TdHJpbmdOT1BGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnV0aWwuTW9kaWZpZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEb3VibGVNb2RpZmllckFkYXB0ZXIoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvdWJsZU1vZGlmaWVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBTaW5nbGVWYWx1ZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLkRvdWJsZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudXRpbC5Nb2RpZmllckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUludGVnZXJNb2RpZmllckFkYXB0ZXIoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUludGVnZXJNb2RpZmllckFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgU2luZ2xlVmFsdWVGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5JbnRlZ2VyRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci51dGlsLk1vZGlmaWVyQWRhcHRlckZhY3RvcnkjY3JlYXRlTG9uZ01vZGlmaWVyQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9uZ01vZGlmaWVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBTaW5nbGVWYWx1ZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLkxvbmdGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnV0aWwuTW9kaWZpZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVTVEVNVGltZU1vZGlmaWVyQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU1RFTVRpbWVNb2RpZmllckFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgU2luZ2xlVmFsdWVGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5TVEVNVGltZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyKCk7CisJfQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnV0aWwuTW9kaWZpZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEb3VibGVTZXF1ZW5jZU1vZGlmaWVyQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRG91YmxlU2VxdWVuY2VNb2RpZmllckFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgU2VxdWVuY2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5Eb3VibGVTZXF1ZW5jZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudXRpbC5Nb2RpZmllckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUludGVnZXJTZXF1ZW5jZU1vZGlmaWVyQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSW50ZWdlclNlcXVlbmNlTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IFNlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuSW50ZWdlclNlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci51dGlsLk1vZGlmaWVyQWRhcHRlckZhY3RvcnkjY3JlYXRlTG9uZ1NlcXVlbmNlTW9kaWZpZXJBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb25nU2VxdWVuY2VNb2RpZmllckFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgU2VxdWVuY2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5Mb25nU2VxdWVuY2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLnV0aWwuTW9kaWZpZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IFNlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuU1RFTVRpbWVTZXF1ZW5jZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyKCk7CisJfQorCQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIudXRpbC5Nb2RpZmllckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVN0cmluZ1NlcXVlbmNlTW9kaWZpZXJBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdHJpbmdTZXF1ZW5jZU1vZGlmaWVyQWRhcHRlcigpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gc3VwZXIuY3JlYXRlU3RyaW5nU2VxdWVuY2VNb2RpZmllckFkYXB0ZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci51dGlsLk1vZGlmaWVyQWRhcHRlckZhY3RvcnkjY3JlYXRlU1RFTVRpbWVOT1BNb2RpZmllckFkYXB0ZXIoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNURU1UaW1lTk9QTW9kaWZpZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IE5PUEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLlNURU1UaW1lTk9QRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci51dGlsLk1vZGlmaWVyQWRhcHRlckZhY3RvcnkjY3JlYXRlU1RFTVRpbWVSYW5nZU1vZGlmaWVyQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU1RFTVRpbWVSYW5nZU1vZGlmaWVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBTVEVNVGltZVJhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci51dGlsLk1vZGlmaWVyQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoZmluYWwgT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb2JqZWN0ID09IEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLmNsYXNzCisJCQkJfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZShvYmplY3QpOworCX0KKworfSAvLyBFeHBlcmltZW50RmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS9GZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlL0ZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkOTI2OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS9GZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8vIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRmVhdHVyZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdNb2RpZmllclBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld01vZGlmaWVyUGFnZS5GZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBhZGFwdHMge0BsaW5rIEZlYXR1cmVNb2RpZmllcn1zIHRvCisgKiB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZX1zLgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbAorCQlpbXBsZW1lbnRzIEFkYXB0ZXIgeworCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgdGhlIHBhcmVudCB7QGxpbmsgQ29tcG9zaXRlfQorCSAqIEBwYXJhbSBpZGVudGlmaWFibGUKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfQorCSAqIEBwYXJhbSBwYXJlbnROZXdNb2RpZmllclBhZ2UKKwkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQge0BsaW5rIE5ld01vZGlmaWVyUGFnZX0KKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZX0gYXBwcm9wcmlhdGUgZm9yIHRoZQorCSAqICAgICAgICAge0BsaW5rIEZlYXR1cmVNb2RpZmllcn0gYmUgYWRhcHRlZC4KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSBjcmVhdGVFZGl0Q29tcG9zaXRlKAorCQkJQ29tcG9zaXRlIHBhcmVudCwgRU9iamVjdCB0YXJnZXQsCisJCQlOZXdNb2RpZmllclBhZ2UgcGFyZW50TmV3TW9kaWZpZXJQYWdlKTsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShmaW5hbCBPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gdHlwZSA9PSBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5jbGFzczsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyfQorCSAqLworCXB1YmxpYyBGZWF0dXJlTW9kaWZpZXIgZ2V0RmVhdHVyZU1vZGlmaWVyKCkgeworCQlyZXR1cm4gKEZlYXR1cmVNb2RpZmllcikgZ2V0VGFyZ2V0KCk7CisJfSAvLyBnZXRGZWF0dXJlTW9kaWZpZXIKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNlbGVjdHMgdGhlIGJ1dHRvbiB0aGF0IGlzIGFwcHJvcHJpYXRlIGZvciB0aGUKKwkgKiB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyfSB0aGF0IGlzIHRoZSB0YXJnZXQuIGFuZCB1bi1zZWxlY3RzIGFsbCB0aGUgb3RoZXIKKwkgKiBidXR0b25zLiBUaHVzLCBpZiB0aGUge0BsaW5rIEZlYXR1cmVNb2RpZmllcn0gaXMgYW4gaW5zdGFuY2Ugb2YKKwkgKiB7QGxpbmsgUmFuZ2VNb2RpZmllcn0gdGhlIDxjb2RlPnJhbmdlQnV0dG9uPC9jb2RlPiB3aWxsIGJlIHNlbGVjdGVkLiBCeQorCSAqIGRlZmF1bHQgdGhlIDxjb2RlPm5vbmVCdXR0b248L2NvZGU+IGlzIHNlbGVjdGVkLgorCSAqIAorCSAqIEBwYXJhbSBub25lQnV0dG9uCisJICogQHBhcmFtIHNpbmdsZVZhbHVlQnV0dG9uCisJICogQHBhcmFtIHJhbmdlQnV0dG9uCisJICogQHBhcmFtIHNlcXVlbmNlQnV0dG9uCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRCdXR0b24oZmluYWwgQnV0dG9uIG5vbmVCdXR0b24sIGZpbmFsIEJ1dHRvbiBzaW5nbGVWYWx1ZUJ1dHRvbiwKKwkJCWZpbmFsIEJ1dHRvbiByYW5nZUJ1dHRvbiwgZmluYWwgQnV0dG9uIHNlcXVlbmNlQnV0dG9uKSB7CisJCW5vbmVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOworCQlzaW5nbGVWYWx1ZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQlyYW5nZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQlzZXF1ZW5jZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOworCX0gLy8gc2V0U2VsZWN0ZWRCdXR0b24KKworfSAvLyBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlL0ZlYXR1cmVNb2RpZmllckZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlL0ZlYXR1cmVNb2RpZmllckZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNzA5MzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2ZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUvRmVhdHVyZU1vZGlmaWVyRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLy8gRmVhdHVyZU1vZGlmaWVyRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhbiBhZGFwdGVyIGZhY3RvcnkgdGhhdCBhZGFwdHMge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXJ9cyB0bworICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdNb2RpZmllclBhZ2UuRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZX1zLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEZlYXR1cmVNb2RpZmllckZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyRmFjdG9yeSB7CisKKwkvKioKKwkgKiBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKi8KKwlGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlckZhY3RvcnlJbXBsIElOU1RBTkNFID0gbmV3IEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyRmFjdG9yeUltcGwoKTsKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgdGhlIHtAbGluayBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5fSB0aGF0IG90aGVyCisJICoge0BsaW5rIEZlYXR1cmVNb2RpZmllckZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyRmFjdG9yeX1zIGFkZAorCSAqIHRoZW1zZWx2ZXMgdG8uCisJICovCisJY2xhc3MgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzCisJCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMKKwkJCUZlYXR1cmVNb2RpZmllckZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyRmFjdG9yeSB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShmaW5hbCBPYmplY3QgdHlwZSkgeworCQkJcmV0dXJuIHR5cGUgPT0gRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuY2xhc3M7CisJCX0KKwl9IC8vIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyRmFjdG9yeUltcGwKKworfSAvLyBGZWF0dXJlTW9kaWZpZXJGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS9OT1BGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlL05PUEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQyZDg4NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS9OT1BGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvLyBOT1BGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuRmVhdHVyZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdNb2RpZmllclBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld01vZGlmaWVyUGFnZS5GZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcn0gZm9yCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk5PUE1vZGlmaWVyfXMuCisgKi8KK3B1YmxpYyBjbGFzcyBOT1BGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciBleHRlbmRzCisJCUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyIHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlLkZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyI2NyZWF0ZUVkaXRDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAorCSAqICAgICAgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUsCisJICogICAgICBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3TW9kaWZpZXJQYWdlKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIGNyZWF0ZUVkaXRDb21wb3NpdGUoCisJCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50LAorCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIEVPYmplY3QgdGFyZ2V0LAorCQkJZmluYWwgTmV3TW9kaWZpZXJQYWdlIHBhcmVudE5ld01vZGlmaWVyUGFnZSkgeworCQlmaW5hbCBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIHJldFZhbHVlID0gbmV3IEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUoCisJCQkJcGFyZW50LCBwYXJlbnROZXdNb2RpZmllclBhZ2UsIChGZWF0dXJlTW9kaWZpZXIpIGdldFRhcmdldCgpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKCkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9OworCQlyZXRWYWx1ZS5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKKworCQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChyZXRWYWx1ZSwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRGb3JlZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKKwkJbGFiZWwuc2V0VGV4dChnZXRGZWF0dXJlTW9kaWZpZXIoKS5nZXRUYXJnZXQoKS5lR2V0KAorCQkJCWdldEZlYXR1cmVNb2RpZmllcigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpKS50b1N0cmluZygpKTsKKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVFZGl0Q29tcG9zaXRlCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyfSBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lTk9QTW9kaWZpZXJ9cy4KKwkgKiAKKwkgKiBAc2VlIEV4cGVyaW1lbnRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlRmFjdG9yeSNjcmVhdGVTVEVNVGltZU5PUE1vZGlmaWVyQWRhcHRlcigpCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBTVEVNVGltZU5PUEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyIGV4dGVuZHMKKwkJCU5PUEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIjY3JlYXRlRWRpdENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCisJCSAqICAgICAgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUsCisJCSAqICAgICAgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld01vZGlmaWVyUGFnZSkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSBjcmVhdGVFZGl0Q29tcG9zaXRlKAorCQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsCisJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIEVPYmplY3QgdGFyZ2V0LAorCQkJCWZpbmFsIE5ld01vZGlmaWVyUGFnZSBwYXJlbnROZXdNb2RpZmllclBhZ2UpIHsKKwkJCWZpbmFsIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUgcmV0VmFsdWUgPSBuZXcgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSgKKwkJCQkJcGFyZW50LCBwYXJlbnROZXdNb2RpZmllclBhZ2UsCisJCQkJCShGZWF0dXJlTW9kaWZpZXIpIGdldFRhcmdldCgpKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX07CisJCQlyZXRWYWx1ZS5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKKworCQkJZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocmV0VmFsdWUsIFNXVC5OT05FKTsKKwkJCWxhYmVsLnNldFRleHQoZ2V0RmVhdHVyZU1vZGlmaWVyKCkuZ2V0VGFyZ2V0KCkuZUdldCgKKwkJCQkJZ2V0RmVhdHVyZU1vZGlmaWVyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkpLnRvU3RyaW5nKCkpOworCisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gY3JlYXRlRWRpdENvbXBvc2l0ZQorCisJfSAvLyBTVEVNVGltZU5PUEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyfSBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk5PUE1vZGlmaWVyfXMgdGhhdCBhcmUgbnVtZXJpYyBsaWtlCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5JbnRlZ2VyTk9QTW9kaWZpZXJ9LAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ05PUE1vZGlmaWVyfSBhbmQKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZU5PUE1vZGlmaWVyfS4KKwkgKiAKKwkgKiBAc2VlIEV4cGVyaW1lbnRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlRmFjdG9yeSNjcmVhdGVJbnRlZ2VyTk9QTW9kaWZpZXJBZGFwdGVyKCkKKwkgKiBAc2VlIEV4cGVyaW1lbnRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlRmFjdG9yeSNjcmVhdGVMb25nTk9QTW9kaWZpZXJBZGFwdGVyKCkKKwkgKiBAc2VlIEV4cGVyaW1lbnRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlRmFjdG9yeSNjcmVhdGVEb3VibGVOT1BNb2RpZmllckFkYXB0ZXIoKQorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTnVtZXJpY05PUEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyIGV4dGVuZHMKKwkJCU5PUEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIjY3JlYXRlRWRpdENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCisJCSAqICAgICAgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUsCisJCSAqICAgICAgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld01vZGlmaWVyUGFnZSkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSBjcmVhdGVFZGl0Q29tcG9zaXRlKAorCQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsCisJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIEVPYmplY3QgdGFyZ2V0LAorCQkJCWZpbmFsIE5ld01vZGlmaWVyUGFnZSBwYXJlbnROZXdNb2RpZmllclBhZ2UpIHsKKwkJCWZpbmFsIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUgcmV0VmFsdWUgPSBuZXcgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSgKKwkJCQkJcGFyZW50LCBwYXJlbnROZXdNb2RpZmllclBhZ2UsCisJCQkJCShGZWF0dXJlTW9kaWZpZXIpIGdldFRhcmdldCgpKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX07CisJCQlyZXRWYWx1ZS5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKKworCQkJZmluYWwgTGFiZWwgdG9MYWJlbCA9IG5ldyBMYWJlbChyZXRWYWx1ZSwgU1dULk5PTkUpOworCQkJdG9MYWJlbC5zZXRUZXh0KGdldEZlYXR1cmVNb2RpZmllcigpLmdldFRhcmdldCgpLmVHZXQoCisJCQkJCWdldEZlYXR1cmVNb2RpZmllcigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpKS50b1N0cmluZygpKTsKKworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGNyZWF0ZUVkaXRDb21wb3NpdGUKKworCX0gLy8gTnVtZXJpY05PUEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyfSBmb3IKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNURU1UaW1lTk9QTW9kaWZpZXJ9cy4KKwkgKiAKKwkgKiBAc2VlIEV4cGVyaW1lbnRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlRmFjdG9yeSNjcmVhdGVTVEVNVGltZU5PUE1vZGlmaWVyQWRhcHRlcigpCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdOT1BGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciBleHRlbmRzCisJCQlOT1BGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlLkZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyI2NyZWF0ZUVkaXRDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAorCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlLAorCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdNb2RpZmllclBhZ2UpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUgY3JlYXRlRWRpdENvbXBvc2l0ZSgKKwkJCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50LAorCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBFT2JqZWN0IHRhcmdldCwKKwkJCQlmaW5hbCBOZXdNb2RpZmllclBhZ2UgcGFyZW50TmV3TW9kaWZpZXJQYWdlKSB7CisJCQlmaW5hbCBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIHJldFZhbHVlID0gbmV3IEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUoCisJCQkJCXBhcmVudCwgcGFyZW50TmV3TW9kaWZpZXJQYWdlLAorCQkJCQkoRmVhdHVyZU1vZGlmaWVyKSBnZXRUYXJnZXQoKSkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKCkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9OworCQkJcmV0VmFsdWUuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7CisKKwkJCWZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHJldFZhbHVlLCBTV1QuTk9ORSk7CisJCQlsYWJlbC5zZXRUZXh0KGdldEZlYXR1cmVNb2RpZmllcigpLmdldFRhcmdldCgpLmVHZXQoCisJCQkJCWdldEZlYXR1cmVNb2RpZmllcigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpKS50b1N0cmluZygpKTsKKworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGNyZWF0ZUVkaXRDb21wb3NpdGUKKworCX0gLy8gU3RyaW5nTk9QRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIKKworfSAvLyBOT1BGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlL1JhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS9SYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5ZGQ3YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS9SYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw2ODcgQEAKKy8vIFJhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVSYW5nZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJSYW5nZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nUmFuZ2VNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVSYW5nZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdNb2RpZmllclBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld01vZGlmaWVyUGFnZS5GZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcn0gZm9yCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlJhbmdlTW9kaWZpZXJ9cy4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIFJhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIgZXh0ZW5kcworCQlGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciB7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS5GZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciNzZXRTZWxlY3RlZEJ1dHRvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b24sCisJICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b24sIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbikKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEJ1dHRvbihmaW5hbCBCdXR0b24gbm9uZUJ1dHRvbiwgZmluYWwgQnV0dG9uIHNpbmdsZVZhbHVlQnV0dG9uLAorCQkJZmluYWwgQnV0dG9uIHJhbmdlQnV0dG9uLCBmaW5hbCBCdXR0b24gc2VxdWVuY2VCdXR0b24pIHsKKwkJbm9uZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQlzaW5nbGVWYWx1ZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQlyYW5nZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJCXNlcXVlbmNlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7CisJfSAvLyBzZXRTZWxlY3RlZEJ1dHRvbgorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcn0gZm9yCisJICoge0BsaW5rIFJhbmdlTW9kaWZpZXJ9cyB0aGF0IGhhdmUgYSByYW5nZSBvZiBudW1lcmljIHZhbHVlcy4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGFic3RyYWN0IGNsYXNzIE51bWVyaWNSYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyCisJCQlleHRlbmRzIFJhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIgeworCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUX1dJRFRIID0gMzA7CisKKwkJcHJvdGVjdGVkIFRleHQgc3RhcnRUZXh0OworCQlwcm90ZWN0ZWQgVGV4dCBlbmRUZXh0OworCQlwcm90ZWN0ZWQgVGV4dCBpbmNUZXh0OworCisJCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGZWF0dXJlTW9kaWZpZXIoCisJCQkJRU9iamVjdCB0YXJnZXQpOworCisJCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmcgZ2V0SW5pdGlhbFN0YXJ0VGV4dCgpOworCisJCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmcgZ2V0SW5pdGlhbEVuZFRleHQoKTsKKworCQlhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIGdldEluaXRpYWxJbmNyZW1lbnRUZXh0KCk7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlLkZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyI2NyZWF0ZUVkaXRDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAorCQkgKiAgICAgIElkZW50aWZpYWJsZSwgTmV3TW9kaWZpZXJQYWdlKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIGNyZWF0ZUVkaXRDb21wb3NpdGUoCisJCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgRU9iamVjdCB0YXJnZXQsCisJCQkJZmluYWwgTmV3TW9kaWZpZXJQYWdlIHBhcmVudE5ld01vZGlmaWVyUGFnZSkgeworCisJCQlpbml0aWFsaXplRmVhdHVyZU1vZGlmaWVyKHRhcmdldCk7CisKKwkJCWZpbmFsIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUgcmV0VmFsdWUgPSBnZXRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlKAorCQkJCQlwYXJlbnQsIHBhcmVudE5ld01vZGlmaWVyUGFnZSk7CisKKwkJCWZpbmFsIEZvcm1MYXlvdXQgbGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKKwkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJCXJldFZhbHVlLnNldExheW91dChsYXlvdXQpOworCisJCQlzdGFydFRleHQgPSBuZXcgVGV4dChyZXRWYWx1ZSwgU1dULkJPUkRFUiB8IFNXVC5UUkFJTCk7CisJCQlzdGFydFRleHQuc2V0VGV4dChnZXRJbml0aWFsU3RhcnRUZXh0KCkpOworCQkJc3RhcnRUZXh0LnNldFRvb2xUaXBUZXh0KCJTdGFydGluZyB2YWx1ZSIpOworCQkJc3RhcnRUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHJldFZhbHVlLmdldE1vZGlmeUxpc3RlbmVyKCkpOworCQkJZmluYWwgTGFiZWwgdG9MYWJlbCA9IG5ldyBMYWJlbChyZXRWYWx1ZSwgU1dULk5PTkUpOworCQkJdG9MYWJlbC5zZXRUZXh0KCIgdG8gIik7CisKKwkJCWVuZFRleHQgPSBuZXcgVGV4dChyZXRWYWx1ZSwgU1dULkJPUkRFUiB8IFNXVC5UUkFJTCk7CisJCQllbmRUZXh0LnNldFRleHQoZ2V0SW5pdGlhbEVuZFRleHQoKSk7CisJCQllbmRUZXh0LnNldFRvb2xUaXBUZXh0KCJFbmRpbmcgdmFsdWUiKTsKKwkJCWVuZFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIocmV0VmFsdWUuZ2V0TW9kaWZ5TGlzdGVuZXIoKSk7CisKKwkJCWZpbmFsIExhYmVsIGJ5TGFiZWwgPSBuZXcgTGFiZWwocmV0VmFsdWUsIFNXVC5OT05FKTsKKwkJCWJ5TGFiZWwuc2V0VGV4dCgiIGJ5ICIpOworCisJCQlpbmNUZXh0ID0gbmV3IFRleHQocmV0VmFsdWUsIFNXVC5CT1JERVIgfCBTV1QuVFJBSUwpOworCQkJaW5jVGV4dC5zZXRUZXh0KGdldEluaXRpYWxJbmNyZW1lbnRUZXh0KCkpOworCQkJaW5jVGV4dC5zZXRUb29sVGlwVGV4dCgiSW5jcmVtZW50Iik7CisJCQlpbmNUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHJldFZhbHVlLmdldE1vZGlmeUxpc3RlbmVyKCkpOworCisJCQlvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhIGZvcm1EYXRhID0gbnVsbDsKKworCQkJLy8gc3RhcnQKKwkJCWZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCQlmb3JtRGF0YS53aWR0aCA9IFRFWFRfV0lEVEg7CisJCQlmb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQkJZm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCQlzdGFydFRleHQuc2V0TGF5b3V0RGF0YShmb3JtRGF0YSk7CisKKwkJCS8vICJ0byIKKwkJCWZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCQlmb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHN0YXJ0VGV4dCwgMCwgU1dULlJJR0hUKTsKKwkJCWZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChzdGFydFRleHQsIDAsIFNXVC5CT1RUT00pOworCQkJdG9MYWJlbC5zZXRMYXlvdXREYXRhKGZvcm1EYXRhKTsKKworCQkJLy8gZW5kCisJCQlmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQkJZm9ybURhdGEud2lkdGggPSBURVhUX1dJRFRIOworCQkJZm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCh0b0xhYmVsLCAwLCBTV1QuUklHSFQpOworCQkJZm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KHRvTGFiZWwsIDAsIFNXVC5CT1RUT00pOworCQkJZW5kVGV4dC5zZXRMYXlvdXREYXRhKGZvcm1EYXRhKTsKKworCQkJLy8gImJ5IgorCQkJZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJCWZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZW5kVGV4dCwgMCwgU1dULlJJR0hUKTsKKwkJCWZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChlbmRUZXh0LCAwLCBTV1QuQk9UVE9NKTsKKwkJCWJ5TGFiZWwuc2V0TGF5b3V0RGF0YShmb3JtRGF0YSk7CisKKwkJCS8vIGluYworCQkJZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJCWZvcm1EYXRhLndpZHRoID0gVEVYVF9XSURUSDsKKwkJCWZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYnlMYWJlbCwgMCwgU1dULlJJR0hUKTsKKwkJCWZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCQlmb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYnlMYWJlbCwgMCwgU1dULkJPVFRPTSk7CisJCQlpbmNUZXh0LnNldExheW91dERhdGEoZm9ybURhdGEpOworCisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gY3JlYXRlRWRpdENvbXBvc2l0ZQorCisJCS8qKgorCQkgKiBAcGFyYW0gcGFyZW50CisJCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKKwkJICogQHBhcmFtIHBhcmVudE5ld01vZGlmaWVyUGFnZQorCQkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgTmV3TW9kaWZpZXJQYWdlfSB0aGF0IGlzIHRoZSBwYXJlbnQgdG8gcGFyZW50CisJCSAqIEByZXR1cm4gYSBuZXcge0BsaW5rIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGV9CisJCSAqLworCQlwcm90ZWN0ZWQgYWJzdHJhY3QgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSBnZXRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlKAorCQkJCUNvbXBvc2l0ZSBwYXJlbnQsIE5ld01vZGlmaWVyUGFnZSBwYXJlbnROZXdNb2RpZmllclBhZ2UpOworCisJfSAvLyBOdW1lcmljUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcgorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcn0gZm9yCisJICoge0BsaW5rIEludGVnZXJSYW5nZU1vZGlmaWVyfXMuCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlZ2VyUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciBleHRlbmRzCisJCQlOdW1lcmljUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlLlJhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuTnVtZXJpY1JhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIjaW5pdGlhbGl6ZUZlYXR1cmVNb2RpZmllcihJZGVudGlmaWFibGUpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZlYXR1cmVNb2RpZmllcigKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgRU9iamVjdCB0YXJnZXQpIHsKKwkJCWZpbmFsIEludGVnZXJSYW5nZU1vZGlmaWVyIHJhbmdlTW9kaWZpZXIgPSAoSW50ZWdlclJhbmdlTW9kaWZpZXIpIGdldEZlYXR1cmVNb2RpZmllcigpOworCQkJcmFuZ2VNb2RpZmllci5zZXRTdGFydFZhbHVlKCgoSW50ZWdlcikgKGdldEZlYXR1cmVNb2RpZmllcigpCisJCQkJCS5nZXRUYXJnZXQoKS5lR2V0KGdldEZlYXR1cmVNb2RpZmllcigpCisJCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKSkpKS5pbnRWYWx1ZSgpKTsKKwkJCXJhbmdlTW9kaWZpZXIuc2V0RW5kVmFsdWUocmFuZ2VNb2RpZmllci5nZXRTdGFydFZhbHVlKCkpOworCQl9IC8vIGluaXRpYWxpemVGZWF0dXJlTW9kaWZpZXIKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5OdW1lcmljUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciNnZXRJbml0aWFsRW5kVGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIFN0cmluZyBnZXRJbml0aWFsRW5kVGV4dCgpIHsKKwkJCXJldHVybiBJbnRlZ2VyCisJCQkJCS50b1N0cmluZygoKEludGVnZXJSYW5nZU1vZGlmaWVyKSBnZXRGZWF0dXJlTW9kaWZpZXIoKSkKKwkJCQkJCQkuZ2V0RW5kVmFsdWUoKSk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5OdW1lcmljUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciNnZXRJbml0aWFsSW5jcmVtZW50VGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIFN0cmluZyBnZXRJbml0aWFsSW5jcmVtZW50VGV4dCgpIHsKKwkJCXJldHVybiBJbnRlZ2VyCisJCQkJCS50b1N0cmluZygoKEludGVnZXJSYW5nZU1vZGlmaWVyKSBnZXRGZWF0dXJlTW9kaWZpZXIoKSkKKwkJCQkJCQkuZ2V0SW5jcmVtZW50KCkpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlLlJhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuTnVtZXJpY1JhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIjZ2V0SW5pdGlhbFN0YXJ0VGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIFN0cmluZyBnZXRJbml0aWFsU3RhcnRUZXh0KCkgeworCQkJcmV0dXJuIEludGVnZXIKKwkJCQkJLnRvU3RyaW5nKCgoSW50ZWdlclJhbmdlTW9kaWZpZXIpIGdldEZlYXR1cmVNb2RpZmllcigpKQorCQkJCQkJCS5nZXRTdGFydFZhbHVlKCkpOworCQl9IC8vIGdldEluaXRpYWxTdGFydFRleHQKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5OdW1lcmljUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciNnZXRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlKENvbXBvc2l0ZSwKKwkJICogICAgICBOZXdNb2RpZmllclBhZ2UpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUgZ2V0RmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSgKKwkJCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50LAorCQkJCWZpbmFsIE5ld01vZGlmaWVyUGFnZSBwYXJlbnROZXdNb2RpZmllclBhZ2UpIHsKKwkJCWZpbmFsIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUgcmV0VmFsdWUgPSBuZXcgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSgKKwkJCQkJcGFyZW50LCBwYXJlbnROZXdNb2RpZmllclBhZ2UsCisJCQkJCShGZWF0dXJlTW9kaWZpZXIpIGdldFRhcmdldCgpKSB7CisKKwkJCQkvKioKKwkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdNb2RpZmllclBhZ2UuRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSN2YWxpZGF0ZSgpCisJCQkJICovCisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoKSB7CisJCQkJCWJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOworCisJCQkJCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKKworCQkJCQlpbnQgc3RhcnRWYWx1ZSA9IDA7CisJCQkJCWludCBlbmRWYWx1ZSA9IDA7CisJCQkJCWludCBpbmNWYWx1ZSA9IDA7CisKKwkJCQkJLy8gU3RhcnQgdGV4dAorCQkJCQkvLyBTdGlsbCB2YWxpZD8KKwkJCQkJaWYgKHJldFZhbHVlKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXRyeSB7CisJCQkJCQkJLy8gVmFsaWQgc3RhcnQgdmFsdWU/CisJCQkJCQkJc3RhcnRWYWx1ZSA9IEludGVnZXIucGFyc2VJbnQoc3RhcnRUZXh0LmdldFRleHQoKSk7CisJCQkJCQkJKChJbnRlZ2VyUmFuZ2VNb2RpZmllcikgZmVhdHVyZU1vZGlmaWVyKQorCQkJCQkJCQkJLnNldFN0YXJ0VmFsdWUoc3RhcnRWYWx1ZSk7CisJCQkJCQl9IGNhdGNoIChmaW5hbCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJCQkJCXJldFZhbHVlID0gZmFsc2U7CisJCQkJCQkJbWVzc2FnZSA9ICJTdGFydCB2YWx1ZSBub3QgdmFsaWQiOworCQkJCQkJfSAvLyBjYXRjaCBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKwkJCQkJfSAvLyBpZgorCisJCQkJCS8vIEVuZCB0ZXh0CisJCQkJCS8vIFN0aWxsIHZhbGlkPworCQkJCQlpZiAocmV0VmFsdWUpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJdHJ5IHsKKwkJCQkJCQkvLyBWYWxpZCBlbmQgdmFsdWU/CisJCQkJCQkJZW5kVmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KGVuZFRleHQuZ2V0VGV4dCgpKTsKKwkJCQkJCQkoKEludGVnZXJSYW5nZU1vZGlmaWVyKSBmZWF0dXJlTW9kaWZpZXIpCisJCQkJCQkJCQkuc2V0RW5kVmFsdWUoZW5kVmFsdWUpOworCQkJCQkJfSBjYXRjaCAoZmluYWwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCQkJCW1lc3NhZ2UgPSAiRW5kIHZhbHVlIG5vdCB2YWxpZCI7CisJCQkJCQl9IC8vIGNhdGNoIE51bWJlckZvcm1hdEV4Y2VwdGlvbgorCQkJCQl9IC8vIGlmCisKKwkJCQkJLy8gSW5jIHRleHQKKwkJCQkJLy8gU3RpbGwgdmFsaWQ/CisJCQkJCWlmIChyZXRWYWx1ZSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQl0cnkgeworCQkJCQkJCS8vIFZhbGlkIGluYyB2YWx1ZT8KKwkJCQkJCQlpbmNWYWx1ZSA9IEludGVnZXIucGFyc2VJbnQoaW5jVGV4dC5nZXRUZXh0KCkpOworCQkJCQkJCSgoSW50ZWdlclJhbmdlTW9kaWZpZXIpIGZlYXR1cmVNb2RpZmllcikKKwkJCQkJCQkJCS5zZXRJbmNyZW1lbnQoaW5jVmFsdWUpOworCQkJCQkJfSBjYXRjaCAoZmluYWwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCQkJCW1lc3NhZ2UgPSAiSW5jcmVtZW50IHZhbHVlIG5vdCB2YWxpZCI7CisJCQkJCQl9IC8vIGNhdGNoIE51bWJlckZvcm1hdEV4Y2VwdGlvbgorCQkJCQl9IC8vIGlmCisKKwkJCQkJLy8gQ29uc2lzdGVudAorCQkJCQkvLyBTdGlsbCB2YWxpZD8KKwkJCQkJaWYgKHJldFZhbHVlKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCS8vIEFyZSB0aGUgcmVsYXRpdmUgdmFsdWVzIGNvbnNpc3RlbnQ/CisJCQkJCQkvLyBpZiAoIShzdGFydFZhbHVlIDw9IGVuZFZhbHVlICYmIGluY1ZhbHVlID49IDBMKSkgeworCQkJCQkJaWYgKHN0YXJ0VmFsdWUgPD0gZW5kVmFsdWUgJiYgaW5jVmFsdWUgPCAwTCkgeworCQkJCQkJCS8vIE5vCisJCQkJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQkJCQltZXNzYWdlID0gIklmIHRoZSBzdGFydCBpcyA8PSB0aGUgZW5kLCB0aGVuIHRoZSBpbmNyZW1lbnQgY2Fubm9udCBiZSA8IDAuMCI7CisJCQkJCQl9IC8vIGlmCisJCQkJCQllbHNlIGlmIChzdGFydFZhbHVlID4gZW5kVmFsdWUgJiYgaW5jVmFsdWUgPj0gMEwpIHsKKwkJCQkJCQkvLyBObworCQkJCQkJCXJldFZhbHVlID0gZmFsc2U7CisJCQkJCQkJbWVzc2FnZSA9ICJJZiB0aGUgc3RhcnQgaXMgPiB0aGUgZW5kLCB0aGVuIHRoZSBpbmNyZW1lbnQgY2Fubm9udCBiZSA+PSAwLjAiOworCQkJCQkJfSAvLyBpZgorCQkJCQl9IC8vIGlmCisKKwkJCQkJLy8gQW55IGVycm9yIG1lc3NhZ2UgdG8gcmVwb3J0PworCQkJCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXBhcmVudE5ld01vZGlmaWVyUGFnZS5zZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7CisJCQkJCX0gLy8gaWYKKworCQkJCQkvLyBFdmVyeXRoaW5nIE9rPworCQkJCQlpZiAocmV0VmFsdWUpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJLy8gQ2hlY2sgb3V0IHRoZSBwYXJlbnQgdGhlbgorCQkJCQkJcmV0VmFsdWUgPSBwYXJlbnROZXdNb2RpZmllclBhZ2UudmFsaWRhdGVQYWdlKCk7CisJCQkJCX0gLy8gaWYKKworCQkJCQlyZXR1cm4gcmV0VmFsdWU7CisJCQkJfSAvLyB2YWxpZGF0ZQorCQkJfTsKKwkJCXJldHVybiByZXRWYWx1ZTsKKwkJfSAvLyBnZXRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlCisKKwl9IC8vIEludGVnZXJSYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyfSBmb3IKKwkgKiB7QGxpbmsgSW50ZWdlclJhbmdlTW9kaWZpZXJ9cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIExvbmdSYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyIGV4dGVuZHMKKwkJCU51bWVyaWNSYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5OdW1lcmljUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciNpbml0aWFsaXplRmVhdHVyZU1vZGlmaWVyKElkZW50aWZpYWJsZSkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRmVhdHVyZU1vZGlmaWVyKAorCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBFT2JqZWN0IHRhcmdldCkgeworCQkJZmluYWwgTG9uZ1JhbmdlTW9kaWZpZXIgcmFuZ2VNb2RpZmllciA9IChMb25nUmFuZ2VNb2RpZmllcikgZ2V0RmVhdHVyZU1vZGlmaWVyKCk7CisJCQlyYW5nZU1vZGlmaWVyLnNldFN0YXJ0VmFsdWUoKChMb25nKSAoZ2V0RmVhdHVyZU1vZGlmaWVyKCkKKwkJCQkJLmdldFRhcmdldCgpLmVHZXQoZ2V0RmVhdHVyZU1vZGlmaWVyKCkKKwkJCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpKSkpLmxvbmdWYWx1ZSgpKTsKKwkJCXJhbmdlTW9kaWZpZXIuc2V0RW5kVmFsdWUocmFuZ2VNb2RpZmllci5nZXRTdGFydFZhbHVlKCkpOworCQl9IC8vIGluaXRpYWxpemVGZWF0dXJlTW9kaWZpZXIKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5OdW1lcmljUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciNnZXRJbml0aWFsRW5kVGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIFN0cmluZyBnZXRJbml0aWFsRW5kVGV4dCgpIHsKKwkJCXJldHVybiBMb25nLnRvU3RyaW5nKCgoTG9uZ1JhbmdlTW9kaWZpZXIpIGdldEZlYXR1cmVNb2RpZmllcigpKQorCQkJCQkuZ2V0RW5kVmFsdWUoKSk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5OdW1lcmljUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciNnZXRJbml0aWFsSW5jcmVtZW50VGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIFN0cmluZyBnZXRJbml0aWFsSW5jcmVtZW50VGV4dCgpIHsKKwkJCXJldHVybiBMb25nLnRvU3RyaW5nKCgoTG9uZ1JhbmdlTW9kaWZpZXIpIGdldEZlYXR1cmVNb2RpZmllcigpKQorCQkJCQkuZ2V0SW5jcmVtZW50KCkpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlLlJhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuTnVtZXJpY1JhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIjZ2V0SW5pdGlhbFN0YXJ0VGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIFN0cmluZyBnZXRJbml0aWFsU3RhcnRUZXh0KCkgeworCQkJcmV0dXJuIExvbmcudG9TdHJpbmcoKChMb25nUmFuZ2VNb2RpZmllcikgZ2V0RmVhdHVyZU1vZGlmaWVyKCkpCisJCQkJCS5nZXRTdGFydFZhbHVlKCkpOworCQl9IC8vIGdldEluaXRpYWxTdGFydFRleHQKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5OdW1lcmljUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciNnZXRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKKwkJICogICAgICBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3TW9kaWZpZXJQYWdlKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIGdldEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUoCisJCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCwKKwkJCQlmaW5hbCBOZXdNb2RpZmllclBhZ2UgcGFyZW50TmV3TW9kaWZpZXJQYWdlKSB7CisJCQlmaW5hbCBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIHJldFZhbHVlID0gbmV3IEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUoCisJCQkJCXBhcmVudCwgcGFyZW50TmV3TW9kaWZpZXJQYWdlLAorCQkJCQkoRmVhdHVyZU1vZGlmaWVyKSBnZXRUYXJnZXQoKSkgeworCisJCQkJLyoqCisJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3TW9kaWZpZXJQYWdlLkZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUjdmFsaWRhdGUoKQorCQkJCSAqLworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKCkgeworCQkJCQlib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKKworCQkJCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisKKwkJCQkJbG9uZyBzdGFydFZhbHVlID0gMEw7CisJCQkJCWxvbmcgZW5kVmFsdWUgPSAwTDsKKwkJCQkJbG9uZyBpbmNWYWx1ZSA9IDBMOworCisJCQkJCS8vIFN0YXJ0IHRleHQKKwkJCQkJLy8gU3RpbGwgdmFsaWQ/CisJCQkJCWlmIChyZXRWYWx1ZSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQl0cnkgeworCQkJCQkJCS8vIFZhbGlkIHN0YXJ0IHZhbHVlPworCQkJCQkJCXN0YXJ0VmFsdWUgPSBMb25nLnBhcnNlTG9uZyhzdGFydFRleHQuZ2V0VGV4dCgpKTsKKwkJCQkJCQkoKExvbmdSYW5nZU1vZGlmaWVyKSBmZWF0dXJlTW9kaWZpZXIpCisJCQkJCQkJCQkuc2V0U3RhcnRWYWx1ZShzdGFydFZhbHVlKTsKKwkJCQkJCX0gY2F0Y2ggKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQkJCQltZXNzYWdlID0gIlN0YXJ0IHZhbHVlIG5vdCB2YWxpZCI7CisJCQkJCQl9IC8vIGNhdGNoIE51bWJlckZvcm1hdEV4Y2VwdGlvbgorCQkJCQl9IC8vIGlmCisKKwkJCQkJLy8gRW5kIHRleHQKKwkJCQkJLy8gU3RpbGwgdmFsaWQ/CisJCQkJCWlmIChyZXRWYWx1ZSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQl0cnkgeworCQkJCQkJCS8vIFZhbGlkIGVuZCB2YWx1ZT8KKwkJCQkJCQllbmRWYWx1ZSA9IExvbmcucGFyc2VMb25nKGVuZFRleHQuZ2V0VGV4dCgpKTsKKwkJCQkJCQkoKExvbmdSYW5nZU1vZGlmaWVyKSBmZWF0dXJlTW9kaWZpZXIpCisJCQkJCQkJCQkuc2V0RW5kVmFsdWUoZW5kVmFsdWUpOworCQkJCQkJfSBjYXRjaCAoZmluYWwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCQkJCW1lc3NhZ2UgPSAiRW5kIHZhbHVlIG5vdCB2YWxpZCI7CisJCQkJCQl9IC8vIGNhdGNoIE51bWJlckZvcm1hdEV4Y2VwdGlvbgorCQkJCQl9IC8vIGlmCisKKwkJCQkJLy8gSW5jIHRleHQKKwkJCQkJLy8gU3RpbGwgdmFsaWQ/CisJCQkJCWlmIChyZXRWYWx1ZSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQl0cnkgeworCQkJCQkJCS8vIFZhbGlkIGluYyB2YWx1ZT8KKwkJCQkJCQlpbmNWYWx1ZSA9IExvbmcucGFyc2VMb25nKGluY1RleHQuZ2V0VGV4dCgpKTsKKwkJCQkJCQkoKExvbmdSYW5nZU1vZGlmaWVyKSBmZWF0dXJlTW9kaWZpZXIpCisJCQkJCQkJCQkuc2V0SW5jcmVtZW50KGluY1ZhbHVlKTsKKwkJCQkJCX0gY2F0Y2ggKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQkJCQltZXNzYWdlID0gIkluY3JlbWVudCB2YWx1ZSBub3QgdmFsaWQiOworCQkJCQkJfSAvLyBjYXRjaCBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKwkJCQkJfSAvLyBpZgorCisJCQkJCS8vIENvbnNpc3RlbnQKKwkJCQkJLy8gU3RpbGwgdmFsaWQ/CisJCQkJCWlmIChyZXRWYWx1ZSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQkvLyBBcmUgdGhlIHJlbGF0aXZlIHZhbHVlcyBjb25zaXN0ZW50PworCQkJCQkJLy8gaWYgKCEoc3RhcnRWYWx1ZSA8PSBlbmRWYWx1ZSAmJiBpbmNWYWx1ZSA+PSAwTCkpIHsKKwkJCQkJCWlmIChzdGFydFZhbHVlIDw9IGVuZFZhbHVlICYmIGluY1ZhbHVlIDwgMEwpIHsKKwkJCQkJCQkvLyBObworCQkJCQkJCXJldFZhbHVlID0gZmFsc2U7CisJCQkJCQkJbWVzc2FnZSA9ICJJZiB0aGUgc3RhcnQgaXMgPD0gdGhlIGVuZCwgdGhlbiB0aGUgaW5jcmVtZW50IGNhbm5vbnQgYmUgPCAwLjAiOworCQkJCQkJfSAvLyBpZgorCQkJCQkJZWxzZSBpZiAoc3RhcnRWYWx1ZSA+IGVuZFZhbHVlICYmIGluY1ZhbHVlID49IDBMKSB7CisJCQkJCQkJLy8gTm8KKwkJCQkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCQkJCW1lc3NhZ2UgPSAiSWYgdGhlIHN0YXJ0IGlzID4gdGhlIGVuZCwgdGhlbiB0aGUgaW5jcmVtZW50IGNhbm5vbnQgYmUgPj0gMC4wIjsKKwkJCQkJCX0gLy8gaWYKKwkJCQkJfSAvLyBpZgorCQkJCQkvLyBBbnkgZXJyb3IgbWVzc2FnZSB0byByZXBvcnQ/CisJCQkJCWlmIChtZXNzYWdlICE9IG51bGwpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJcGFyZW50TmV3TW9kaWZpZXJQYWdlLnNldEVycm9yTWVzc2FnZShtZXNzYWdlKTsKKwkJCQkJfSAvLyBpZgorCisJCQkJCS8vIEV2ZXJ5dGhpbmcgT2s/CisJCQkJCWlmIChyZXRWYWx1ZSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQkvLyBDaGVjayBvdXQgdGhlIHBhcmVudCB0aGVuCisJCQkJCQlyZXRWYWx1ZSA9IHBhcmVudE5ld01vZGlmaWVyUGFnZS52YWxpZGF0ZVBhZ2UoKTsKKwkJCQkJfSAvLyBpZgorCisJCQkJCXJldHVybiByZXRWYWx1ZTsKKwkJCQl9IC8vIHZhbGlkYXRlCisKKwkJCX07CisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gZ2V0RmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZQorCisJfSAvLyBMb25nUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcgorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcn0gZm9yCisJICoge0BsaW5rIERvdWJsZVJhbmdlTW9kaWZpZXJ9cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIERvdWJsZVJhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIgZXh0ZW5kcworCQkJTnVtZXJpY1JhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS5SYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLk51bWVyaWNSYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyI2luaXRpYWxpemVGZWF0dXJlTW9kaWZpZXIoSWRlbnRpZmlhYmxlKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGZWF0dXJlTW9kaWZpZXIoCisJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIEVPYmplY3QgdGFyZ2V0KSB7CisJCQlmaW5hbCBEb3VibGVSYW5nZU1vZGlmaWVyIHJhbmdlTW9kaWZpZXIgPSAoRG91YmxlUmFuZ2VNb2RpZmllcikgZ2V0RmVhdHVyZU1vZGlmaWVyKCk7CisJCQlyYW5nZU1vZGlmaWVyLnNldFN0YXJ0VmFsdWUoKChEb3VibGUpIChnZXRGZWF0dXJlTW9kaWZpZXIoKQorCQkJCQkuZ2V0VGFyZ2V0KCkuZUdldChnZXRGZWF0dXJlTW9kaWZpZXIoKQorCQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkpKSkuZG91YmxlVmFsdWUoKSk7CisJCQlyYW5nZU1vZGlmaWVyLnNldEVuZFZhbHVlKHJhbmdlTW9kaWZpZXIuZ2V0U3RhcnRWYWx1ZSgpKTsKKwkJCS8vIHJhbmdlTW9kaWZpZXIuc2V0SW5jcmVtZW50KG5ldyBEb3VibGUoMC4wKSk7CisJCX0gLy8gaW5pdGlhbGl6ZUZlYXR1cmVNb2RpZmllcgorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS5SYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLk51bWVyaWNSYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyI2dldEluaXRpYWxFbmRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluaXRpYWxFbmRUZXh0KCkgeworCQkJcmV0dXJuIERvdWJsZS50b1N0cmluZygoKERvdWJsZVJhbmdlTW9kaWZpZXIpIGdldEZlYXR1cmVNb2RpZmllcigpKQorCQkJCQkuZ2V0RW5kVmFsdWUoKSk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5OdW1lcmljUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciNnZXRJbml0aWFsSW5jcmVtZW50VGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIFN0cmluZyBnZXRJbml0aWFsSW5jcmVtZW50VGV4dCgpIHsKKwkJCXJldHVybiBEb3VibGUudG9TdHJpbmcoKChEb3VibGVSYW5nZU1vZGlmaWVyKSBnZXRGZWF0dXJlTW9kaWZpZXIoKSkKKwkJCQkJLmdldEluY3JlbWVudCgpKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS5SYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLk51bWVyaWNSYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyI2dldEluaXRpYWxTdGFydFRleHQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5pdGlhbFN0YXJ0VGV4dCgpIHsKKwkJCXJldHVybiBEb3VibGUudG9TdHJpbmcoKChEb3VibGVSYW5nZU1vZGlmaWVyKSBnZXRGZWF0dXJlTW9kaWZpZXIoKSkKKwkJCQkJLmdldFN0YXJ0VmFsdWUoKSk7CisJCX0gLy8gZ2V0SW5pdGlhbFN0YXJ0VGV4dAorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS5SYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLk51bWVyaWNSYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyI2dldEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUoQ29tcG9zaXRlLAorCQkgKiAgICAgIE5ld01vZGlmaWVyUGFnZSkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSBnZXRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlKAorCQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsCisJCQkJZmluYWwgTmV3TW9kaWZpZXJQYWdlIHBhcmVudE5ld01vZGlmaWVyUGFnZSkgeworCisJCQlmaW5hbCBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIHJldFZhbHVlID0gbmV3IEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUoCisJCQkJCXBhcmVudCwgcGFyZW50TmV3TW9kaWZpZXJQYWdlLAorCQkJCQkoRmVhdHVyZU1vZGlmaWVyKSBnZXRUYXJnZXQoKSkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKCkgeworCQkJCQlib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKKworCQkJCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisJCQkJCWRvdWJsZSBzdGFydFZhbHVlID0gMC4wOworCQkJCQlkb3VibGUgZW5kVmFsdWUgPSAwLjA7CisJCQkJCWRvdWJsZSBpbmNWYWx1ZSA9IDAuMDsKKworCQkJCQkvLyBTdGFydCB0ZXh0CisJCQkJCS8vIFN0aWxsIHZhbGlkPworCQkJCQlpZiAocmV0VmFsdWUpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJdHJ5IHsKKwkJCQkJCQkvLyBWYWxpZCBzdGFydCB2YWx1ZT8KKwkJCQkJCQlzdGFydFZhbHVlID0gRG91YmxlCisJCQkJCQkJCQkucGFyc2VEb3VibGUoc3RhcnRUZXh0LmdldFRleHQoKSk7CisJCQkJCQkJKChEb3VibGVSYW5nZU1vZGlmaWVyKSBmZWF0dXJlTW9kaWZpZXIpCisJCQkJCQkJCQkuc2V0U3RhcnRWYWx1ZShzdGFydFZhbHVlKTsKKwkJCQkJCX0gY2F0Y2ggKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQkJCQltZXNzYWdlID0gIlN0YXJ0IHZhbHVlIG5vdCB2YWxpZCI7CisJCQkJCQl9IC8vIGNhdGNoIE51bWJlckZvcm1hdEV4Y2VwdGlvbgorCQkJCQl9IC8vIGlmCisKKwkJCQkJLy8gRW5kIHRleHQKKwkJCQkJLy8gU3RpbGwgdmFsaWQ/CisJCQkJCWlmIChyZXRWYWx1ZSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQl0cnkgeworCQkJCQkJCS8vIFZhbGlkIGVuZCB2YWx1ZT8KKwkJCQkJCQllbmRWYWx1ZSA9IERvdWJsZS5wYXJzZURvdWJsZShlbmRUZXh0LmdldFRleHQoKSk7CisJCQkJCQkJKChEb3VibGVSYW5nZU1vZGlmaWVyKSBmZWF0dXJlTW9kaWZpZXIpCisJCQkJCQkJCQkuc2V0RW5kVmFsdWUoZW5kVmFsdWUpOworCQkJCQkJfSBjYXRjaCAoZmluYWwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCQkJCW1lc3NhZ2UgPSAiRW5kIHZhbHVlIG5vdCB2YWxpZCI7CisJCQkJCQl9IC8vIGNhdGNoIE51bWJlckZvcm1hdEV4Y2VwdGlvbgorCQkJCQl9IC8vIGlmCisKKwkJCQkJLy8gSW5jIHRleHQKKwkJCQkJLy8gU3RpbGwgdmFsaWQ/CisJCQkJCWlmIChyZXRWYWx1ZSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQl0cnkgeworCQkJCQkJCS8vIFZhbGlkIGluYyB2YWx1ZT8KKwkJCQkJCQlpbmNWYWx1ZSA9IERvdWJsZS5wYXJzZURvdWJsZShpbmNUZXh0LmdldFRleHQoKSk7CisJCQkJCQkJKChEb3VibGVSYW5nZU1vZGlmaWVyKSBmZWF0dXJlTW9kaWZpZXIpCisJCQkJCQkJCQkuc2V0SW5jcmVtZW50KGluY1ZhbHVlKTsKKwkJCQkJCX0gY2F0Y2ggKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQkJCQltZXNzYWdlID0gIkluY3JlbWVudCB2YWx1ZSBub3QgdmFsaWQiOworCQkJCQkJfSAvLyBjYXRjaCBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKwkJCQkJfSAvLyBpZgorCisJCQkJCS8vIENvbnNpc3RlbnQKKwkJCQkJLy8gU3RpbGwgdmFsaWQ/CisJCQkJCWlmIChyZXRWYWx1ZSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQkvLyBBcmUgdGhlIHJlbGF0aXZlIHZhbHVlcyBjb25zaXN0ZW50PworCQkJCQkJLy8gaWYgKCEoc3RhcnRWYWx1ZSA8PSBlbmRWYWx1ZSAmJiBpbmNWYWx1ZSA+PSAwLjApKSB7CisJCQkJCQlpZiAoc3RhcnRWYWx1ZSA8PSBlbmRWYWx1ZSAmJiBpbmNWYWx1ZSA8IDAuMCkgeworCQkJCQkJCS8vIE5vCisJCQkJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQkJCQltZXNzYWdlID0gIklmIHRoZSBzdGFydCBpcyA8PSB0aGUgZW5kLCB0aGVuIHRoZSBpbmNyZW1lbnQgY2Fubm9udCBiZSA8IDAuMCI7CisJCQkJCQl9IC8vIGlmCisJCQkJCQllbHNlIGlmIChzdGFydFZhbHVlID4gZW5kVmFsdWUgJiYgaW5jVmFsdWUgPj0gMC4wKSB7CisJCQkJCQkJLy8gTm8KKwkJCQkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCQkJCW1lc3NhZ2UgPSAiSWYgdGhlIHN0YXJ0IGlzID4gdGhlIGVuZCwgdGhlbiB0aGUgaW5jcmVtZW50IGNhbm5vbnQgYmUgPj0gMC4wIjsKKwkJCQkJCX0gLy8gaWYKKwkJCQkJfSAvLyBpZgorCQkJCQkvLyBBbnkgZXJyb3IgbWVzc2FnZSB0byByZXBvcnQ/CisJCQkJCWlmIChtZXNzYWdlICE9IG51bGwpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJcGFyZW50TmV3TW9kaWZpZXJQYWdlLnNldEVycm9yTWVzc2FnZShtZXNzYWdlKTsKKwkJCQkJfSAvLyBpZgorCisJCQkJCS8vIEV2ZXJ5dGhpbmcgT2s/CisJCQkJCWlmIChyZXRWYWx1ZSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQkvLyBDaGVjayBvdXQgdGhlIHBhcmVudCB0aGVuCisJCQkJCQlyZXRWYWx1ZSA9IHBhcmVudE5ld01vZGlmaWVyUGFnZS52YWxpZGF0ZVBhZ2UoKTsKKwkJCQkJfSAvLyBpZgorCisJCQkJCXJldHVybiByZXRWYWx1ZTsKKwkJCQl9IC8vIHZhbGlkYXRlCisJCQl9OworCisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gZ2V0RmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZQorCisJfSAvLyBEb3VibGVSYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyfSBmb3IKKwkgKiB7QGxpbmsgU1RFTVRpbWVSYW5nZU1vZGlmaWVyfXMuCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBTVEVNVGltZVJhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIgZXh0ZW5kcworCQkJUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlLkZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyI2NyZWF0ZUVkaXRDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAorCQkgKiAgICAgIElkZW50aWZpYWJsZSwgTmV3TW9kaWZpZXJQYWdlKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIGNyZWF0ZUVkaXRDb21wb3NpdGUoCisJCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCwKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgRU9iamVjdCB0YXJnZXQsCisJCQkJZmluYWwgTmV3TW9kaWZpZXJQYWdlIHBhcmVudE5ld01vZGlmaWVyUGFnZSkgeworCQkJZmluYWwgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSByZXRWYWx1ZSA9IG5ldyBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlKAorCQkJCQlwYXJlbnQsIHBhcmVudE5ld01vZGlmaWVyUGFnZSwKKwkJCQkJKEZlYXR1cmVNb2RpZmllcikgZ2V0VGFyZ2V0KCkpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKKwkJCQkJZmluYWwgYm9vbGVhbiByZXRWYWx1ZSA9IHBhcmVudE5ld01vZGlmaWVyUGFnZQorCQkJCQkJCS52YWxpZGF0ZVBhZ2UoKTsKKworCQkJCQkvLyBTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisJCQkJCXJldHVybiByZXRWYWx1ZTsKKwkJCQl9IC8vIHZhbGlkYXRlCisJCQl9OworCQkJcmV0VmFsdWUuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7CisJCQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChyZXRWYWx1ZSwgU1dULk5PTkUpOworCisJCQlmaW5hbCBTVEVNVGltZVJhbmdlTW9kaWZpZXIgcmFuZ2VNb2RpZmllciA9IChTVEVNVGltZVJhbmdlTW9kaWZpZXIpIGdldEZlYXR1cmVNb2RpZmllcigpOworCQkJcmFuZ2VNb2RpZmllci5zZXRTdGFydFZhbHVlKChTVEVNVGltZSkgZ2V0RmVhdHVyZU1vZGlmaWVyKCkKKwkJCQkJLmdldFRhcmdldCgpLmVHZXQoCisJCQkJCQkJZ2V0RmVhdHVyZU1vZGlmaWVyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkpKTsKKwkJCXJhbmdlTW9kaWZpZXIuc2V0RW5kVmFsdWUocmFuZ2VNb2RpZmllci5nZXRTdGFydFZhbHVlKCkpOworCQkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHJhbmdlTW9kaWZpZXIKKwkJCQkJLmdldFN0YXJ0VmFsdWUoKS50b1N0cmluZygpKTsKKwkJCXNiLmFwcGVuZCgiIHRvICIpOworCQkJc2IuYXBwZW5kKHJhbmdlTW9kaWZpZXIuZ2V0RW5kVmFsdWUoKS50b1N0cmluZygpKTsKKwkJCXNiLmFwcGVuZCgiIGJ5ICIpOworCQkJc2IuYXBwZW5kKHJhbmdlTW9kaWZpZXIuZ2V0SW5jcmVtZW50KCkpOworCisJCQlsYWJlbC5zZXRUZXh0KHNiLnRvU3RyaW5nKCkpOworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGNyZWF0ZUVkaXRDb21wb3NpdGUKKworCX0gLy8gU1RFTVRpbWVSYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyCisKK30gLy8gUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlL1NlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS9TZXF1ZW5jZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmOTBkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS9TZXF1ZW5jZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwyNjEgQEAKKy8vIFNlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Eb3VibGVTZXF1ZW5jZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJTZXF1ZW5jZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Mb25nU2VxdWVuY2VNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuU1RFTVRpbWVTZXF1ZW5jZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdNb2RpZmllclBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld01vZGlmaWVyUGFnZS5GZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyfSBmb3IKKyAqIHtAbGluayAgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLlNlcXVlbmNlTW9kaWZpZXJ9cy4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIFNlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIgZXh0ZW5kcworCQlGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciB7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS5GZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciNzZXRTZWxlY3RlZEJ1dHRvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b24sCisJICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b24sIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbikKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEJ1dHRvbihmaW5hbCBCdXR0b24gbm9uZUJ1dHRvbiwgZmluYWwgQnV0dG9uIHNpbmdsZVZhbHVlQnV0dG9uLAorCQkJZmluYWwgQnV0dG9uIHJhbmdlQnV0dG9uLCBmaW5hbCBCdXR0b24gc2VxdWVuY2VCdXR0b24pIHsKKwkJbm9uZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQlzaW5nbGVWYWx1ZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQlyYW5nZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQlzZXF1ZW5jZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJfSAvLyBzZXRTZWxlY3RlZEJ1dHRvbgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIjY3JlYXRlRWRpdENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCisJICogICAgICBJZGVudGlmaWFibGUsIE5ld01vZGlmaWVyUGFnZSkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlhYnN0cmFjdCBwdWJsaWMgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSBjcmVhdGVFZGl0Q29tcG9zaXRlKAorCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgRU9iamVjdCB0YXJnZXQsCisJCQlmaW5hbCBOZXdNb2RpZmllclBhZ2UgcGFyZW50TmV3TW9kaWZpZXJQYWdlKTsKKworCWFic3RyYWN0IHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTnVtZXJpY1NlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIKKwkJCWV4dGVuZHMgU2VxdWVuY2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlLlNlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIjY3JlYXRlRWRpdENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCisJCSAqICAgICAgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUsCisJCSAqICAgICAgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld01vZGlmaWVyUGFnZSkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSBjcmVhdGVFZGl0Q29tcG9zaXRlKAorCQkJCUNvbXBvc2l0ZSBwYXJlbnQsIEVPYmplY3QgdGFyZ2V0LAorCQkJCU5ld01vZGlmaWVyUGFnZSBwYXJlbnROZXdNb2RpZmllclBhZ2UpIHsKKwkJCWluaXRpYWxpemVGZWF0dXJlTW9kaWZpZXIodGFyZ2V0KTsKKworCQkJZmluYWwgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSByZXRWYWx1ZSA9IG5ldyBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlKAorCQkJCQlwYXJlbnQsIHBhcmVudE5ld01vZGlmaWVyUGFnZSwKKwkJCQkJKEZlYXR1cmVNb2RpZmllcikgZ2V0VGFyZ2V0KCkpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKKwkJCQkJLy8gVE9ETyBjcmVhdGVFZGl0Q29tcG9zaXRlLnZhbGlkYXRlKCkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfTsKKworCQkJcmV0VmFsdWUuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7CisJCQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChyZXRWYWx1ZSwgU1dULkJPUkRFUik7CisKKwkJCWxhYmVsLnNldFRleHQoZ2V0U2VxdWVuY2VTdW1tYXJ5VGV4dCgpKTsKKworCQkJZmluYWwgQnV0dG9uIGVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKHJldFZhbHVlLCBTV1QuUFVTSCk7CisJCQllZGl0QnV0dG9uLnNldFRleHQoIkVkaXQiKTsKKwkJCWVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJLy8gVE9ETyBpbXBsZW1lbnQgd2lkZ2V0U2VsZWN0ZWQKKwkJCQl9CisJCQl9KTsKKwkJCXJldHVybiByZXRWYWx1ZTsKKwkJfSAvLyBjcmVhdGVFZGl0Q29tcG9zaXRlCisKKwkJLyoqCisJCSAqIEBwYXJhbSBpZGVudGlmaWFibGUKKwkJICovCisJCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGZWF0dXJlTW9kaWZpZXIoCisJCQkJRU9iamVjdCB0YXJnZXQpOworCisJCS8qKgorCQkgKiBAcmV0dXJuCisJCSAqLworCQlhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcXVlbmNlU3VtbWFyeVRleHQoKTsKKworCX0gLy8gTnVtZXJpY1NlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIKKworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSW50ZWdlclNlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIKKwkJCWV4dGVuZHMgTnVtZXJpY1NlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIgeworCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRmVhdHVyZU1vZGlmaWVyKEVPYmplY3QgdGFyZ2V0KSB7CisJCQlmaW5hbCBJbnRlZ2VyU2VxdWVuY2VNb2RpZmllciBzZXF1ZW5jZU1vZGlmaWVyID0gKEludGVnZXJTZXF1ZW5jZU1vZGlmaWVyKSBnZXRGZWF0dXJlTW9kaWZpZXIoKTsKKwkJCXNlcXVlbmNlTW9kaWZpZXIuZ2V0U2VxdWVuY2UoKS5hZGQoCisJCQkJCSgoSW50ZWdlcikgKHRhcmdldC5lR2V0KGdldEZlYXR1cmVNb2RpZmllcigpCisJCQkJCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpKSkpKTsKKwkJfSAvLyBpbml0aWFsaXplRmVhdHVyZU1vZGlmaWVyCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlLlNlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuTnVtZXJpY1NlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIjZ2V0U2VxdWVuY2VTdW1tYXJ5VGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIFN0cmluZyBnZXRTZXF1ZW5jZVN1bW1hcnlUZXh0KCkgeworCQkJZmluYWwgSW50ZWdlclNlcXVlbmNlTW9kaWZpZXIgc2VxdWVuY2VNb2RpZmllciA9IChJbnRlZ2VyU2VxdWVuY2VNb2RpZmllcikgZ2V0RmVhdHVyZU1vZGlmaWVyKCk7CisJCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCWludCBpID0gc2VxdWVuY2VNb2RpZmllci5nZXRTZXF1ZW5jZVNpemUoKTsKKwkJCWZvciAoSW50ZWdlciBpbnRlZ2VyIDogc2VxdWVuY2VNb2RpZmllci5nZXRTZXF1ZW5jZSgpKSB7CisJCQkJc2IuYXBwZW5kKGludGVnZXIudG9TdHJpbmcoKSk7CisJCQkJc2IuYXBwZW5kKC0taSA+IDAgPyAiLCAiIDogIiIpOworCQkJfSAvLyBmb3IgZWFjaAorCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJCX0gLy8gZ2V0U2VxdWVuY2VTdW1tYXJ5VGV4dAorCisJfSAvLyBJbnRlZ2VyU2VxdWVuY2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcgorCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBEb3VibGVTZXF1ZW5jZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyCisJCQlleHRlbmRzIE51bWVyaWNTZXF1ZW5jZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyIHsKKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZlYXR1cmVNb2RpZmllcihFT2JqZWN0IHRhcmdldCkgeworCQkJZmluYWwgRG91YmxlU2VxdWVuY2VNb2RpZmllciBzZXF1ZW5jZU1vZGlmaWVyID0gKERvdWJsZVNlcXVlbmNlTW9kaWZpZXIpIGdldEZlYXR1cmVNb2RpZmllcigpOworCQkJc2VxdWVuY2VNb2RpZmllci5nZXRTZXF1ZW5jZSgpLmFkZCgKKwkJCQkJKChEb3VibGUpICh0YXJnZXQuZUdldChnZXRGZWF0dXJlTW9kaWZpZXIoKQorCQkJCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKSkpKSk7CisJCX0gLy8gaW5pdGlhbGl6ZUZlYXR1cmVNb2RpZmllcgorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS5TZXF1ZW5jZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLk51bWVyaWNTZXF1ZW5jZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyI2dldFNlcXVlbmNlU3VtbWFyeVRleHQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VxdWVuY2VTdW1tYXJ5VGV4dCgpIHsKKwkJCWZpbmFsIERvdWJsZVNlcXVlbmNlTW9kaWZpZXIgc2VxdWVuY2VNb2RpZmllciA9IChEb3VibGVTZXF1ZW5jZU1vZGlmaWVyKSBnZXRGZWF0dXJlTW9kaWZpZXIoKTsKKwkJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJaW50IGkgPSBzZXF1ZW5jZU1vZGlmaWVyLmdldFNlcXVlbmNlU2l6ZSgpOworCQkJZm9yIChEb3VibGUgZGIgOiBzZXF1ZW5jZU1vZGlmaWVyLmdldFNlcXVlbmNlKCkpIHsKKwkJCQlzYi5hcHBlbmQoZGIudG9TdHJpbmcoKSk7CisJCQkJc2IuYXBwZW5kKC0taSA+IDAgPyAiLCAiIDogIiIpOworCQkJfSAvLyBmb3IgZWFjaAorCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJCX0gLy8gZ2V0U2VxdWVuY2VTdW1tYXJ5VGV4dAorCisJfSAvLyBEb3VibGVTZXF1ZW5jZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyCisKKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIExvbmdTZXF1ZW5jZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyCisJCQlleHRlbmRzIE51bWVyaWNTZXF1ZW5jZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyIHsKKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZlYXR1cmVNb2RpZmllcihFT2JqZWN0IHRhcmdldCkgeworCQkJZmluYWwgTG9uZ1NlcXVlbmNlTW9kaWZpZXIgc2VxdWVuY2VNb2RpZmllciA9IChMb25nU2VxdWVuY2VNb2RpZmllcikgZ2V0RmVhdHVyZU1vZGlmaWVyKCk7CisJCQlzZXF1ZW5jZU1vZGlmaWVyLmdldFNlcXVlbmNlKCkuYWRkKAorCQkJCQkoKExvbmcpICh0YXJnZXQuZUdldChnZXRGZWF0dXJlTW9kaWZpZXIoKQorCQkJCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKSkpKSk7CisJCX0gLy8gaW5pdGlhbGl6ZUZlYXR1cmVNb2RpZmllcgorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS5TZXF1ZW5jZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLk51bWVyaWNTZXF1ZW5jZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyI2dldFNlcXVlbmNlU3VtbWFyeVRleHQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VxdWVuY2VTdW1tYXJ5VGV4dCgpIHsKKwkJCWZpbmFsIExvbmdTZXF1ZW5jZU1vZGlmaWVyIHNlcXVlbmNlTW9kaWZpZXIgPSAoTG9uZ1NlcXVlbmNlTW9kaWZpZXIpIGdldEZlYXR1cmVNb2RpZmllcigpOworCQkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQlpbnQgaSA9IHNlcXVlbmNlTW9kaWZpZXIuZ2V0U2VxdWVuY2VTaXplKCk7CisJCQlmb3IgKExvbmcgbG5nIDogc2VxdWVuY2VNb2RpZmllci5nZXRTZXF1ZW5jZSgpKSB7CisJCQkJc2IuYXBwZW5kKGxuZy50b1N0cmluZygpKTsKKwkJCQlzYi5hcHBlbmQoLS1pID4gMCA/ICIsICIgOiAiIik7CisJCQl9IC8vIGZvciBlYWNoCisJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwkJfSAvLyBnZXRTZXF1ZW5jZVN1bW1hcnlUZXh0CisJfSAvLyBMb25nU2VxdWVuY2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcgorCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBTVEVNVGltZVNlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIKKwkJCWV4dGVuZHMgU2VxdWVuY2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciB7CisKKwkJCisJCQorCQkKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlLlNlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIjY3JlYXRlRWRpdENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlLCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3TW9kaWZpZXJQYWdlKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIGNyZWF0ZUVkaXRDb21wb3NpdGUoCisJCQkJQ29tcG9zaXRlIHBhcmVudCwgRU9iamVjdCB0YXJnZXQsCisJCQkJTmV3TW9kaWZpZXJQYWdlIHBhcmVudE5ld01vZGlmaWVyUGFnZSkgeworCQkJaW5pdGlhbGl6ZUZlYXR1cmVNb2RpZmllcih0YXJnZXQpOworCisJCQlmaW5hbCBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIHJldFZhbHVlID0gbmV3IEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUoCisJCQkJCXBhcmVudCwgcGFyZW50TmV3TW9kaWZpZXJQYWdlLAorCQkJCQkoRmVhdHVyZU1vZGlmaWVyKSBnZXRUYXJnZXQoKSkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKCkgeworCQkJCQkvLyBUT0RPIGNyZWF0ZUVkaXRDb21wb3NpdGUudmFsaWRhdGUoKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9OworCisJCQlyZXRWYWx1ZS5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKKwkJCWZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHJldFZhbHVlLCBTV1QuQk9SREVSKTsKKworCQkJbGFiZWwuc2V0VGV4dChnZXRTZXF1ZW5jZVN1bW1hcnlUZXh0KCkpOworCisJCQlmaW5hbCBCdXR0b24gZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24ocmV0VmFsdWUsIFNXVC5QVVNIKTsKKwkJCWVkaXRCdXR0b24uc2V0VGV4dCgiRWRpdCIpOworCQkJZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQkvLyBUT0RPIGltcGxlbWVudCB3aWRnZXRTZWxlY3RlZAorCQkJCX0KKwkJCX0pOworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGNyZWF0ZUVkaXRDb21wb3NpdGUKKworCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRmVhdHVyZU1vZGlmaWVyKEVPYmplY3QgdGFyZ2V0KSB7CisJCQlmaW5hbCBMb25nU2VxdWVuY2VNb2RpZmllciBzZXF1ZW5jZU1vZGlmaWVyID0gKExvbmdTZXF1ZW5jZU1vZGlmaWVyKSBnZXRGZWF0dXJlTW9kaWZpZXIoKTsKKwkJCXNlcXVlbmNlTW9kaWZpZXIuZ2V0U2VxdWVuY2UoKS5hZGQoCisJCQkJCSgoTG9uZykgKHRhcmdldC5lR2V0KGdldEZlYXR1cmVNb2RpZmllcigpCisJCQkJCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpKSkpKTsKKwkJfSAvLyBpbml0aWFsaXplRmVhdHVyZU1vZGlmaWVyCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlLlNlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuTnVtZXJpY1NlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIjZ2V0U2VxdWVuY2VTdW1tYXJ5VGV4dCgpCisJCSAqLworCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcXVlbmNlU3VtbWFyeVRleHQoKSB7CisJCQlmaW5hbCBTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXIgc2VxdWVuY2VNb2RpZmllciA9IChTVEVNVGltZVNlcXVlbmNlTW9kaWZpZXIpIGdldEZlYXR1cmVNb2RpZmllcigpOworCQkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQlpbnQgaSA9IHNlcXVlbmNlTW9kaWZpZXIuZ2V0U2VxdWVuY2VTaXplKCk7CisJCQlmb3IgKFNURU1UaW1lIHRpbWUgOiBzZXF1ZW5jZU1vZGlmaWVyLmdldFNlcXVlbmNlKCkpIHsKKwkJCQlzYi5hcHBlbmQodGltZS50b1N0cmluZygpKTsKKwkJCQlzYi5hcHBlbmQoLS1pID4gMCA/ICIsICIgOiAiIik7CisJCQl9IC8vIGZvciBlYWNoCisJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwkJfSAvLyBnZXRTZXF1ZW5jZVN1bW1hcnlUZXh0CisJfSAvLyBTVEVNVGltZVNlcXVlbmNlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIKKworfSAvLyBTZXF1ZW5jZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2ZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUvU2luZ2xlVmFsdWVGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlL1NpbmdsZVZhbHVlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDIwMDgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlL1NpbmdsZVZhbHVlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDQyNiBAQAorLy8gUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkRvdWJsZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLkludGVnZXJNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTG9uZ01vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TVEVNVGltZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdNb2RpZmllclBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld01vZGlmaWVyUGFnZS5GZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcn0gZm9yCisgKiB7QGxpbmsgU2luZ2xlVmFsdWVNb2RpZmllcn1zLgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgU2luZ2xlVmFsdWVGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciBleHRlbmRzCisJCUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyIHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlLkZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyI3NldFNlbGVjdGVkQnV0dG9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbiwKKwkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbiwgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkQnV0dG9uKGZpbmFsIEJ1dHRvbiBub25lQnV0dG9uLCBmaW5hbCBCdXR0b24gc2luZ2xlVmFsdWVCdXR0b24sCisJCQlmaW5hbCBCdXR0b24gcmFuZ2VCdXR0b24sIGZpbmFsIEJ1dHRvbiBzZXF1ZW5jZUJ1dHRvbikgeworCQlub25lQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7CisJCXNpbmdsZVZhbHVlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKKwkJcmFuZ2VCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKKwkJc2VxdWVuY2VCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKKwl9IC8vIHNldFNlbGVjdGVkQnV0dG9uCisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyfSBmb3IKKwkgKiB7QGxpbmsgU2luZ2xlVmFsdWVNb2RpZmllcn1zIHRoYXQgaGF2ZSBhIHJhbmdlIG9mIG51bWVyaWMgdmFsdWVzLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgTnVtZXJpY1NpbmdsZVZhbHVlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIKKwkJCWV4dGVuZHMgU2luZ2xlVmFsdWVGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciB7CisKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFWFRfV0lEVEggPSA2MDsKKworCQlwcm90ZWN0ZWQgVGV4dCB2YWx1ZVRleHQ7CisJCQorCQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRmVhdHVyZU1vZGlmaWVyKAorCQkJCUVPYmplY3QgdGFyZ2V0KTsKKworCQlhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlVGV4dCgpOworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS5GZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciNjcmVhdGVFZGl0Q29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKKwkJICogICAgICBJZGVudGlmaWFibGUsIE5ld01vZGlmaWVyUGFnZSkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSBjcmVhdGVFZGl0Q29tcG9zaXRlKAorCQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEVPYmplY3QgdGFyZ2V0LAorCQkJCWZpbmFsIE5ld01vZGlmaWVyUGFnZSBwYXJlbnROZXdNb2RpZmllclBhZ2UpIHsKKworCQkJaW5pdGlhbGl6ZUZlYXR1cmVNb2RpZmllcih0YXJnZXQpOworCisJCQlmaW5hbCBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIHJldFZhbHVlID0gZ2V0RmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSgKKwkJCQkJcGFyZW50LCBwYXJlbnROZXdNb2RpZmllclBhZ2UpOworCisJCQlmaW5hbCBGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7CisJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCQlyZXRWYWx1ZS5zZXRMYXlvdXQobGF5b3V0KTsKKworCQkJdmFsdWVUZXh0ID0gbmV3IFRleHQocmV0VmFsdWUsIFNXVC5CT1JERVIgfCBTV1QuVFJBSUwpOworCQkJdmFsdWVUZXh0LnNldFRleHQoZ2V0VmFsdWVUZXh0KCkpOworCQkJdmFsdWVUZXh0LnNldFRvb2xUaXBUZXh0KCJWYWx1ZSIpOworCQkJdmFsdWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHJldFZhbHVlLmdldE1vZGlmeUxpc3RlbmVyKCkpOworCQorCQkJb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YSBmb3JtRGF0YSA9IG51bGw7CisKKwkJCS8vIHN0YXJ0CisJCQlmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQkJZm9ybURhdGEud2lkdGggPSBURVhUX1dJRFRIOworCQkJZm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJCWZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQkJdmFsdWVUZXh0LnNldExheW91dERhdGEoZm9ybURhdGEpOworCisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gY3JlYXRlRWRpdENvbXBvc2l0ZQorCisJCS8qKgorCQkgKiBAcGFyYW0gcGFyZW50CisJCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKKwkJICogQHBhcmFtIHBhcmVudE5ld01vZGlmaWVyUGFnZQorCQkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgTmV3TW9kaWZpZXJQYWdlfSB0aGF0IGlzIHRoZSBwYXJlbnQgdG8gcGFyZW50CisJCSAqIEByZXR1cm4gYSBuZXcge0BsaW5rIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGV9CisJCSAqLworCQlwcm90ZWN0ZWQgYWJzdHJhY3QgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSBnZXRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlKAorCQkJCUNvbXBvc2l0ZSBwYXJlbnQsIE5ld01vZGlmaWVyUGFnZSBwYXJlbnROZXdNb2RpZmllclBhZ2UpOworCisJfSAKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXJ9IGZvcgorCSAqIHtAbGluayBJbnRlZ2VyTW9kaWZpZXJ9cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEludGVnZXJGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciBleHRlbmRzCisJCQlOdW1lcmljU2luZ2xlVmFsdWVGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlLlJhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuTnVtZXJpY1JhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIjaW5pdGlhbGl6ZUZlYXR1cmVNb2RpZmllcihJZGVudGlmaWFibGUpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZlYXR1cmVNb2RpZmllcigKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgRU9iamVjdCB0YXJnZXQpIHsKKwkJCWZpbmFsIEludGVnZXJNb2RpZmllciBtb2RpZmllciA9IChJbnRlZ2VyTW9kaWZpZXIpIGdldEZlYXR1cmVNb2RpZmllcigpOworCQkJbW9kaWZpZXIuc2V0VmFsdWUoKChJbnRlZ2VyKSAoZ2V0RmVhdHVyZU1vZGlmaWVyKCkKKwkJCQkJLmdldFRhcmdldCgpLmVHZXQoZ2V0RmVhdHVyZU1vZGlmaWVyKCkKKwkJCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpKSkpLmludFZhbHVlKCkpOworCQl9IC8vIGluaXRpYWxpemVGZWF0dXJlTW9kaWZpZXIKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5OdW1lcmljUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciNnZXRJbml0aWFsRW5kVGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZVRleHQoKSB7CisJCQlyZXR1cm4gSW50ZWdlcgorCQkJCQkudG9TdHJpbmcoKChJbnRlZ2VyTW9kaWZpZXIpIGdldEZlYXR1cmVNb2RpZmllcigpKQorCQkJCQkJCS5nZXRWYWx1ZSgpKTsKKwkJfQorCisKKwkJLyoqCisJCSAqIAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIGdldEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUoCisJCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCwKKwkJCQlmaW5hbCBOZXdNb2RpZmllclBhZ2UgcGFyZW50TmV3TW9kaWZpZXJQYWdlKSB7CisJCQlmaW5hbCBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIHJldFZhbHVlID0gbmV3IEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUoCisJCQkJCXBhcmVudCwgcGFyZW50TmV3TW9kaWZpZXJQYWdlLAorCQkJCQkoRmVhdHVyZU1vZGlmaWVyKSBnZXRUYXJnZXQoKSkgeworCisJCQkJLyoqCisJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3TW9kaWZpZXJQYWdlLkZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUjdmFsaWRhdGUoKQorCQkJCSAqLworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKCkgeworCQkJCQlib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKKworCQkJCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisKKwkJCQkJaW50IHZhbHVlID0gMDsKKwkJCQkJLy8gU3RhcnQgdGV4dAorCQkJCQkvLyBTdGlsbCB2YWxpZD8KKwkJCQkJaWYgKHJldFZhbHVlKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXRyeSB7CisJCQkJCQkJLy8gVmFsaWQgc3RhcnQgdmFsdWU/CisJCQkJCQkJdmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlVGV4dC5nZXRUZXh0KCkpOworCQkJCQkJCSgoSW50ZWdlck1vZGlmaWVyKSBmZWF0dXJlTW9kaWZpZXIpCisJCQkJCQkJCQkuc2V0VmFsdWUodmFsdWUpOworCQkJCQkJfSBjYXRjaCAoZmluYWwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCQkJCW1lc3NhZ2UgPSAiVmFsdWUgbm90IHZhbGlkIjsKKwkJCQkJCX0gLy8gY2F0Y2ggTnVtYmVyRm9ybWF0RXhjZXB0aW9uCisJCQkJCX0gLy8gaWYKKworCQkJCQkvLyBBbnkgZXJyb3IgbWVzc2FnZSB0byByZXBvcnQ/CisJCQkJCWlmIChtZXNzYWdlICE9IG51bGwpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJcGFyZW50TmV3TW9kaWZpZXJQYWdlLnNldEVycm9yTWVzc2FnZShtZXNzYWdlKTsKKwkJCQkJfSAvLyBpZgorCisJCQkJCS8vIEV2ZXJ5dGhpbmcgT2s/CisJCQkJCWlmIChyZXRWYWx1ZSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQkvLyBDaGVjayBvdXQgdGhlIHBhcmVudCB0aGVuCisJCQkJCQlyZXRWYWx1ZSA9IHBhcmVudE5ld01vZGlmaWVyUGFnZS52YWxpZGF0ZVBhZ2UoKTsKKwkJCQkJfSAvLyBpZgorCisJCQkJCXJldHVybiByZXRWYWx1ZTsKKwkJCQl9IC8vIHZhbGlkYXRlCisJCQl9OworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGdldEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUKKworCX0gLy8KKwkKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyfSBmb3IKKwkgKiB7QGxpbmsgTG9uZ01vZGlmaWVyfXMuCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBMb25nRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIgZXh0ZW5kcworCQkJTnVtZXJpY1NpbmdsZVZhbHVlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS5SYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLk51bWVyaWNSYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyI2luaXRpYWxpemVGZWF0dXJlTW9kaWZpZXIoSWRlbnRpZmlhYmxlKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGZWF0dXJlTW9kaWZpZXIoCisJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIEVPYmplY3QgdGFyZ2V0KSB7CisJCQlmaW5hbCBMb25nTW9kaWZpZXIgbW9kaWZpZXIgPSAoTG9uZ01vZGlmaWVyKSBnZXRGZWF0dXJlTW9kaWZpZXIoKTsKKwkJCW1vZGlmaWVyLnNldFZhbHVlKCgoTG9uZykgKGdldEZlYXR1cmVNb2RpZmllcigpCisJCQkJCS5nZXRUYXJnZXQoKS5lR2V0KGdldEZlYXR1cmVNb2RpZmllcigpCisJCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKSkpKS5pbnRWYWx1ZSgpKTsKKwkJfSAvLyBpbml0aWFsaXplRmVhdHVyZU1vZGlmaWVyCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5mZWF0dXJlbW9kaWZpZXJlZGl0Y29tcG9zaXRlLlJhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuTnVtZXJpY1JhbmdlRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIjZ2V0SW5pdGlhbEVuZFRleHQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWVUZXh0KCkgeworCQkJcmV0dXJuIExvbmcKKwkJCQkJLnRvU3RyaW5nKCgoTG9uZ01vZGlmaWVyKSBnZXRGZWF0dXJlTW9kaWZpZXIoKSkKKwkJCQkJCQkuZ2V0VmFsdWUoKSk7CisJCX0KKworCisJCS8qKgorCQkgKiAKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSBnZXRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlKAorCQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsCisJCQkJZmluYWwgTmV3TW9kaWZpZXJQYWdlIHBhcmVudE5ld01vZGlmaWVyUGFnZSkgeworCQkJZmluYWwgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSByZXRWYWx1ZSA9IG5ldyBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlKAorCQkJCQlwYXJlbnQsIHBhcmVudE5ld01vZGlmaWVyUGFnZSwKKwkJCQkJKEZlYXR1cmVNb2RpZmllcikgZ2V0VGFyZ2V0KCkpIHsKKworCQkJCS8qKgorCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld01vZGlmaWVyUGFnZS5GZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlI3ZhbGlkYXRlKCkKKwkJCQkgKi8KKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKKwkJCQkJYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CisKKwkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOworCisJCQkJCWxvbmcgdmFsdWUgPSAwOworCQkJCQkvLyBTdGFydCB0ZXh0CisJCQkJCS8vIFN0aWxsIHZhbGlkPworCQkJCQlpZiAocmV0VmFsdWUpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJdHJ5IHsKKwkJCQkJCQkvLyBWYWxpZCBzdGFydCB2YWx1ZT8KKwkJCQkJCQl2YWx1ZSA9IExvbmcucGFyc2VMb25nKHZhbHVlVGV4dC5nZXRUZXh0KCkpOworCQkJCQkJCSgoTG9uZ01vZGlmaWVyKSBmZWF0dXJlTW9kaWZpZXIpCisJCQkJCQkJCQkuc2V0VmFsdWUodmFsdWUpOworCQkJCQkJfSBjYXRjaCAoZmluYWwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCQkJCW1lc3NhZ2UgPSAiVmFsdWUgbm90IHZhbGlkIjsKKwkJCQkJCX0gLy8gY2F0Y2ggTnVtYmVyRm9ybWF0RXhjZXB0aW9uCisJCQkJCX0gLy8gaWYKKworCQkJCQkvLyBBbnkgZXJyb3IgbWVzc2FnZSB0byByZXBvcnQ/CisJCQkJCWlmIChtZXNzYWdlICE9IG51bGwpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJcGFyZW50TmV3TW9kaWZpZXJQYWdlLnNldEVycm9yTWVzc2FnZShtZXNzYWdlKTsKKwkJCQkJfSAvLyBpZgorCisJCQkJCS8vIEV2ZXJ5dGhpbmcgT2s/CisJCQkJCWlmIChyZXRWYWx1ZSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQkvLyBDaGVjayBvdXQgdGhlIHBhcmVudCB0aGVuCisJCQkJCQlyZXRWYWx1ZSA9IHBhcmVudE5ld01vZGlmaWVyUGFnZS52YWxpZGF0ZVBhZ2UoKTsKKwkJCQkJfSAvLyBpZgorCisJCQkJCXJldHVybiByZXRWYWx1ZTsKKwkJCQl9IC8vIHZhbGlkYXRlCisJCQl9OworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGdldEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUKKworCX0KKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyfSBmb3IKKwkgKiB7QGxpbmsgRG91YmxlTW9kaWZpZXJ9cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIERvdWJsZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyIGV4dGVuZHMKKwkJCU51bWVyaWNTaW5nbGVWYWx1ZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlci5OdW1lcmljUmFuZ2VGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciNpbml0aWFsaXplRmVhdHVyZU1vZGlmaWVyKElkZW50aWZpYWJsZSkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRmVhdHVyZU1vZGlmaWVyKAorCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBFT2JqZWN0IHRhcmdldCkgeworCQkJZmluYWwgRG91YmxlTW9kaWZpZXIgbW9kaWZpZXIgPSAoRG91YmxlTW9kaWZpZXIpIGdldEZlYXR1cmVNb2RpZmllcigpOworCQkJbW9kaWZpZXIuc2V0VmFsdWUoKChEb3VibGUpIChnZXRGZWF0dXJlTW9kaWZpZXIoKQorCQkJCQkuZ2V0VGFyZ2V0KCkuZUdldChnZXRGZWF0dXJlTW9kaWZpZXIoKQorCQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkpKSkuaW50VmFsdWUoKSk7CisJCX0gLy8gaW5pdGlhbGl6ZUZlYXR1cmVNb2RpZmllcgorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS5SYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyLk51bWVyaWNSYW5nZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyI2dldEluaXRpYWxFbmRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlVGV4dCgpIHsKKwkJCXJldHVybiBEb3VibGUKKwkJCQkJLnRvU3RyaW5nKCgoRG91YmxlTW9kaWZpZXIpIGdldEZlYXR1cmVNb2RpZmllcigpKQorCQkJCQkJCS5nZXRWYWx1ZSgpKTsKKwkJfQorCisKKwkJLyoqCisJCSAqIAorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIGdldEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUoCisJCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCwKKwkJCQlmaW5hbCBOZXdNb2RpZmllclBhZ2UgcGFyZW50TmV3TW9kaWZpZXJQYWdlKSB7CisJCQlmaW5hbCBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIHJldFZhbHVlID0gbmV3IEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUoCisJCQkJCXBhcmVudCwgcGFyZW50TmV3TW9kaWZpZXJQYWdlLAorCQkJCQkoRmVhdHVyZU1vZGlmaWVyKSBnZXRUYXJnZXQoKSkgeworCisJCQkJLyoqCisJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3TW9kaWZpZXJQYWdlLkZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUjdmFsaWRhdGUoKQorCQkJCSAqLworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKCkgeworCQkJCQlib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKKworCQkJCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisKKwkJCQkJZG91YmxlIHZhbHVlID0gMDsKKwkJCQkJLy8gU3RhcnQgdGV4dAorCQkJCQkvLyBTdGlsbCB2YWxpZD8KKwkJCQkJaWYgKHJldFZhbHVlKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXRyeSB7CisJCQkJCQkJLy8gVmFsaWQgc3RhcnQgdmFsdWU/CisJCQkJCQkJdmFsdWUgPSBEb3VibGUucGFyc2VEb3VibGUodmFsdWVUZXh0LmdldFRleHQoKSk7CisJCQkJCQkJKChEb3VibGVNb2RpZmllcikgZmVhdHVyZU1vZGlmaWVyKQorCQkJCQkJCQkJLnNldFZhbHVlKHZhbHVlKTsKKwkJCQkJCX0gY2F0Y2ggKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQkJCQltZXNzYWdlID0gIlZhbHVlIG5vdCB2YWxpZCI7CisJCQkJCQl9IC8vIGNhdGNoIE51bWJlckZvcm1hdEV4Y2VwdGlvbgorCQkJCQl9IC8vIGlmCisKKwkJCQkJLy8gQW55IGVycm9yIG1lc3NhZ2UgdG8gcmVwb3J0PworCQkJCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXBhcmVudE5ld01vZGlmaWVyUGFnZS5zZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7CisJCQkJCX0gLy8gaWYKKworCQkJCQkvLyBFdmVyeXRoaW5nIE9rPworCQkJCQlpZiAocmV0VmFsdWUpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJLy8gQ2hlY2sgb3V0IHRoZSBwYXJlbnQgdGhlbgorCQkJCQkJcmV0VmFsdWUgPSBwYXJlbnROZXdNb2RpZmllclBhZ2UudmFsaWRhdGVQYWdlKCk7CisJCQkJCX0gLy8gaWYKKworCQkJCQlyZXR1cm4gcmV0VmFsdWU7CisJCQkJfSAvLyB2YWxpZGF0ZQorCQkJfTsKKwkJCXJldHVybiByZXRWYWx1ZTsKKwkJfSAvLyBnZXRGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlCisKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyfSBmb3IKKwkgKiB7QGxpbmsgU1RFTVRpbWVNb2RpZmllcn1zLgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgU1RFTVRpbWVGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciBleHRlbmRzCisJCQlTaW5nbGVWYWx1ZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIjY3JlYXRlRWRpdENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCisJCSAqICAgICAgSWRlbnRpZmlhYmxlLCBOZXdNb2RpZmllclBhZ2UpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUgY3JlYXRlRWRpdENvbXBvc2l0ZSgKKwkJCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50LAorCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBFT2JqZWN0IHRhcmdldCwKKwkJCQlmaW5hbCBOZXdNb2RpZmllclBhZ2UgcGFyZW50TmV3TW9kaWZpZXJQYWdlKSB7CisJCQlmaW5hbCBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIHJldFZhbHVlID0gbmV3IEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUoCisJCQkJCXBhcmVudCwgcGFyZW50TmV3TW9kaWZpZXJQYWdlLAorCQkJCQkoRmVhdHVyZU1vZGlmaWVyKSBnZXRUYXJnZXQoKSkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKCkgeworCQkJCQlmaW5hbCBib29sZWFuIHJldFZhbHVlID0gcGFyZW50TmV3TW9kaWZpZXJQYWdlCisJCQkJCQkJLnZhbGlkYXRlUGFnZSgpOworCisJCQkJCS8vIFN0cmluZyBtZXNzYWdlID0gbnVsbDsKKwkJCQkJcmV0dXJuIHJldFZhbHVlOworCQkJCX0gLy8gdmFsaWRhdGUKKwkJCX07CisJCQlyZXRWYWx1ZS5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKKwkJCWZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHJldFZhbHVlLCBTV1QuTk9ORSk7CisKKwkJCWZpbmFsIFNURU1UaW1lTW9kaWZpZXIgbW9kaWZpZXIgPSAoU1RFTVRpbWVNb2RpZmllcikgZ2V0RmVhdHVyZU1vZGlmaWVyKCk7CisJCQltb2RpZmllci5zZXRWYWx1ZSgoU1RFTVRpbWUpIGdldEZlYXR1cmVNb2RpZmllcigpCisJCQkJCS5nZXRUYXJnZXQoKS5lR2V0KAorCQkJCQkJCWdldEZlYXR1cmVNb2RpZmllcigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpKSk7CisJCisJCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobW9kaWZpZXIKKwkJCQkJLmdldFZhbHVlKCkudG9TdHJpbmcoKSk7CisKKwkJCWxhYmVsLnNldFRleHQoc2IudG9TdHJpbmcoKSk7CisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gY3JlYXRlRWRpdENvbXBvc2l0ZQorCisJfSAvLyBTVEVNVGltZUZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGVBZGFwdGVyCisKK30gLy8gU2luZ2xlVmFsdWVGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9pZGVudGlmaWFibGUvRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXJJZGVudGlmaWFibGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9pZGVudGlmaWFibGUvRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXJJZGVudGlmaWFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZTc4M2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL2lkZW50aWZpYWJsZS9EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcklkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmlkZW50aWZpYWJsZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmFkYXB0ZXJzLmlkZW50aWZpYWJsZS5JZGVudGlmaWFibGVBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGFuCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmFkYXB0ZXJzLmV4ZWN1dGFibGUuRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5fQorICogdGhhdCBhZGFwdHMge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSWRlbnRpZmlhYmxlRGVsZWdhdGV9cyB0bworICoge0BsaW5rIElkZW50aWZpYWJsZX1zLgorICovCitwdWJsaWMgY2xhc3MgRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXJJZGVudGlmaWFibGVBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCUlkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5IHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsCisJICogICAgICBqYXZhLmxhbmcuQ2xhc3MpCisJICovCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7CisJCUlkZW50aWZpYWJsZSByZXRWYWx1ZSA9IG51bGw7CisKKwkJLy8gSXQgaXQgd2hhdCB3ZSdyZSBsb29raW5nIGZvcj8KKwkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyCisJCQkJJiYgYWRhcHRlclR5cGUuZXF1YWxzKElkZW50aWZpYWJsZS5jbGFzcykpIHsKKwkJCS8vIFllcworCQkJZmluYWwgRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIgZHdpcCA9IChEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgYWRhcHRhYmxlT2JqZWN0OworCQkJLy8gSXMgdGhpcyBhbiBJZGVudGlmaWFibGU/CisJCQlpZiAoZHdpcC5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlKSB7CisJCQkJLy8gWWVzCisJCQkJcmV0VmFsdWUgPSAoSWRlbnRpZmlhYmxlKSBkd2lwLmdldFZhbHVlKCk7CisJCQl9IC8vIGlmIElkZW50aWZpYWJsZQorCQkJZWxzZSB7CisJCQkJLy8gTm8KKwkJCQkvLyBLZWVwIGFkYXB0aW5nLi4uCisJCQkJcmV0VmFsdWUgPSAoSWRlbnRpZmlhYmxlKSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpCisJCQkJCQkuZ2V0QWRhcHRlcihkd2lwLmdldFZhbHVlKCksIElkZW50aWZpYWJsZS5jbGFzcyk7CisJCQl9CisJCX0gLy8gaWYKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0QWRhcHRlcgorCit9IC8vIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVySWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvaWRlbnRpZmlhYmxlL0lkZW50aWZpYWJsZURlbGVnYXRlSWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvaWRlbnRpZmlhYmxlL0lkZW50aWZpYWJsZURlbGVnYXRlSWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDFmMWRjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9pZGVudGlmaWFibGUvSWRlbnRpZmlhYmxlRGVsZWdhdGVJZGVudGlmaWFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8vIElkZW50aWZpYWJsZURlbGVnYXRlTW9kaWZpYWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5pZGVudGlmaWFibGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmFkYXB0ZXJzLmlkZW50aWZpYWJsZS5JZGVudGlmaWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLklkZW50aWZpYWJsZURlbGVnYXRlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4ge0BsaW5rIElkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5fSB0aGF0IGFkYXB0cworICoge0BsaW5rIElkZW50aWZpYWJsZURlbGVnYXRlfXMgdG8ge0BsaW5rIElkZW50aWZpYWJsZX1zLgorICovCitwdWJsaWMgY2xhc3MgSWRlbnRpZmlhYmxlRGVsZWdhdGVJZGVudGlmaWFibGVBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCUlkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5IHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsCisJICogICAgICBqYXZhLmxhbmcuQ2xhc3MpCisJICovCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7CisJCUlkZW50aWZpYWJsZSByZXRWYWx1ZSA9IG51bGw7CisJCS8vIEl0IGl0IHdoYXQgd2UncmUgbG9va2luZyBmb3I/CisJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJZGVudGlmaWFibGVEZWxlZ2F0ZQorCQkJCSYmIGFkYXB0ZXJUeXBlLmVxdWFscyhJZGVudGlmaWFibGUuY2xhc3MpKSB7CisJCQkvLyBZZXMKKwkJCXJldFZhbHVlID0gKChJZGVudGlmaWFibGVEZWxlZ2F0ZSkgYWRhcHRhYmxlT2JqZWN0KS5nZXRJZGVudGlmaWFibGUoKTsKKwkJfSAvLyBpZgorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRBZGFwdGVyCisKK30gLy8gSWRlbnRpZmlhYmxlRGVsZWdhdGVNb2RpZmlhYmxlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvbW9kaWZpYWJsZS9EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlck1vZGlmaWFibGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9tb2RpZmlhYmxlL0RlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyTW9kaWZpYWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1ZTY0YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvbW9kaWZpYWJsZS9EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlck1vZGlmaWFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5tb2RpZmlhYmxlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuaWRlbnRpZmlhYmxlLklkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4ge0BsaW5rIElkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5fSB0aGF0IGFkYXB0cworICoge0BsaW5rIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyfXMgdG8ge0BsaW5rIE1vZGlmaWFibGV9cy4KKyAqLworcHVibGljIGNsYXNzIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyTW9kaWZpYWJsZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKKwkJSWRlbnRpZmlhYmxlQWRhcHRlckZhY3RvcnkgeworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwKKwkgKiAgICAgIGphdmEubGFuZy5DbGFzcykKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKKwkJTW9kaWZpYWJsZSByZXRWYWx1ZSA9IG51bGw7CisKKwkJLy8gSXQgaXQgd2hhdCB3ZSdyZSBsb29raW5nIGZvcj8KKwkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyCisJCQkJJiYgYWRhcHRlclR5cGUuZXF1YWxzKE1vZGlmaWFibGUuY2xhc3MpKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyIGR3aXAgPSAoRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIGFkYXB0YWJsZU9iamVjdDsKKwkJCS8vIElzIHRoaXMgYW4gSWRlbnRpZmlhYmxlPworCQkJaWYgKGR3aXAuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIElkZW50aWZpYWJsZSkgeworCQkJCS8vIFllcworCQkJCS8vIC4uLmFuZCBpcyBpdCBNb2RpZmlhYmxlPworCQkJCWlmIChkd2lwLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBNb2RpZmlhYmxlKSB7CisJCQkJCS8vIFllcworCQkJCQlyZXRWYWx1ZSA9IChNb2RpZmlhYmxlKSBkd2lwLmdldFZhbHVlKCk7CisJCQkJfQorCQkJCS8vIGVsc2UgTk8KKwkJCX0gLy8gaWYgSWRlbnRpZmlhYmxlIAorCQkJZWxzZSB7CisJCQkJLy8gTm8KKwkJCQkvLyBLZWVwIGFkYXB0aW5nLi4uCisJCQkJcmV0VmFsdWUgPSAoTW9kaWZpYWJsZSkgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKQorCQkJCQkJLmdldEFkYXB0ZXIoZHdpcC5nZXRWYWx1ZSgpLCBNb2RpZmlhYmxlLmNsYXNzKTsKKwkJCX0KKwkJfSAvLyBpZgorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRBZGFwdGVyCit9IC8vIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyTW9kaWZpYWJsZUFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL21vZGlmaWFibGUvSWRlbnRpZmlhYmxlRGVsZWdhdGVNb2RpZmlhYmxlQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvbW9kaWZpYWJsZS9JZGVudGlmaWFibGVEZWxlZ2F0ZU1vZGlmaWFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMWYxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL21vZGlmaWFibGUvSWRlbnRpZmlhYmxlRGVsZWdhdGVNb2RpZmlhYmxlQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvLyBJZGVudGlmaWFibGVEZWxlZ2F0ZU1vZGlmaWFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubW9kaWZpYWJsZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYWRhcHRlcnMuaWRlbnRpZmlhYmxlLklkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSWRlbnRpZmlhYmxlRGVsZWdhdGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhbiB7QGxpbmsgSWRlbnRpZmlhYmxlQWRhcHRlckZhY3Rvcnl9IHRoYXQgYWRhcHRzCisgKiB7QGxpbmsgSWRlbnRpZmlhYmxlRGVsZWdhdGV9cyB0byB7QGxpbmsgSWRlbnRpZmlhYmxlfXMuCisgKi8KK3B1YmxpYyBjbGFzcyBJZGVudGlmaWFibGVEZWxlZ2F0ZU1vZGlmaWFibGVBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCUlkZW50aWZpYWJsZUFkYXB0ZXJGYWN0b3J5IHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsCisJICogICAgICBqYXZhLmxhbmcuQ2xhc3MpCisJICovCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7CisJCUlkZW50aWZpYWJsZSByZXRWYWx1ZSA9IG51bGw7CisJCS8vIEl0IGl0IHdoYXQgd2UncmUgbG9va2luZyBmb3I/CisJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJZGVudGlmaWFibGVEZWxlZ2F0ZQorCQkJCSYmIGFkYXB0ZXJUeXBlLmVxdWFscyhNb2RpZmlhYmxlLmNsYXNzKSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBJZGVudGlmaWFibGUgdGVtcCA9ICgoSWRlbnRpZmlhYmxlRGVsZWdhdGUpIGFkYXB0YWJsZU9iamVjdCkuZ2V0SWRlbnRpZmlhYmxlKCk7CisJCQkKKwkJCXJldFZhbHVlID0gdGVtcCAhPSBudWxsICYmIHRlbXAgaW5zdGFuY2VvZiBNb2RpZmlhYmxlID8gdGVtcCA6IG51bGw7CisJCX0gLy8gaWYKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0QWRhcHRlcgorCit9IC8vIElkZW50aWZpYWJsZURlbGVnYXRlTW9kaWZpYWJsZUFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL25ld21vZGlmaWVycGFnZS9Db21tb25OZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9uZXdtb2RpZmllcnBhZ2UvQ29tbW9uTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTQ2NTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9uZXdtb2RpZmllcnBhZ2UvQ29tbW9uTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLy8gRGlzZWFzZU5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5uZXdtb2RpZmllcnBhZ2U7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24udXRpbC5Db21tb25BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnV0aWwuU3RhbmRhcmRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLm5ld21vZGlmaWVycGFnZS5OZXdNb2RpZmllclBhZ2VBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubmV3bW9kaWZpZXJwYWdlLk5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdNb2RpZmllclBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhbiB7QGxpbmsgTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3Rvcnl9IHRoYXQgYWRhcHRzCisgKiB7QGxpbmsgRGlzZWFzZU1vZGVsfXMgdG8ge0BsaW5rIE5ld01vZGlmaWVyUGFnZX1zLgorICovCitwdWJsaWMgY2xhc3MgQ29tbW9uTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcworCQlDb21tb25BZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIE5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5LCBJU3RhcnR1cCB7CisKKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBDb21tb25OZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRkQWRhcHRlckZhY3RvcnkodGhpcyk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cCNlYXJseVN0YXJ0dXAoKQorCSAqLworCXB1YmxpYyB2b2lkIGVhcmx5U3RhcnR1cCgpIHsKKwkJLy8gTm90aGluZyB0byBkbyB0aGUgY29uc3RydWN0b3Igd2lsbCBkbyBldmVyeXRoaW5nLgkJCisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8udXRpbC5TY2VuYXJpb0FkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKGZpbmFsIE9iamVjdCB0eXBlKSB7CisJCXJldHVybiB0eXBlID09IE5ld01vZGlmaWVyUGFnZUFkYXB0ZXIuY2xhc3MgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9CisKKworCUBPdmVycmlkZQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvdWJsZVZhbHVlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBDb21tb25OZXdNb2RpZmllclBhZ2VBZGFwdGVyKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RyaW5nVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IENvbW1vbk5ld01vZGlmaWVyUGFnZUFkYXB0ZXIoKTsKKwl9CisJCisvKioKKwkgKiBUaGlzIGNsYXNzIGFkYXB0cyB7QGxpbmsgRGlzZWFzZU1vZGVsfXMgdG8ge0BsaW5rIE5ld01vZGlmaWVyUGFnZX1zCisJICovCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tbW9uTmV3TW9kaWZpZXJQYWdlQWRhcHRlciBleHRlbmRzCisJCQlOZXdNb2RpZmllclBhZ2VBZGFwdGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLm5ld21vZGlmaWVycGFnZS5OZXdNb2RpZmllclBhZ2VBZGFwdGVyI2NyZWF0ZU5ld01vZGlmaWVyUGFnZSgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE5ld01vZGlmaWVyUGFnZSBjcmVhdGVOZXdNb2RpZmllclBhZ2UoKSB7CisJCQlyZXR1cm4gbmV3IE5ld01vZGlmaWVyUGFnZSgoRU9iamVjdCkgZ2V0VGFyZ2V0KCkpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1VzZXJTcGVjaWZpZWRQcm9wZXJ0eSgKKwkJCQkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCQkJCWJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQkJZmluYWwgRUNsYXNzIGNvbnRhaW5pbmdDbGFzcyA9IGZlYXR1cmUuZ2V0RUNvbnRhaW5pbmdDbGFzcygpOworCQkJCQkvLyBJcyBpdCBhIGRpc2Vhc2UgbW9kZWwgcHJvcGVydHk/CisJCQkJCWlmIChjb250YWluaW5nQ2xhc3MuZXF1YWxzKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldERvdWJsZVZhbHVlKCkpCisJCQkJCQkJfHwgY29udGFpbmluZ0NsYXNzLmdldEVBbGxTdXBlclR5cGVzKCkuY29udGFpbnMoCisJCQkJCQkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREb3VibGVWYWx1ZSgpKSB8fCAKKwkJCQkJCQkJCWNvbnRhaW5pbmdDbGFzcy5lcXVhbHMoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nVmFsdWUoKSkKKwkJCQkJCQkJCXx8IGNvbnRhaW5pbmdDbGFzcy5nZXRFQWxsU3VwZXJUeXBlcygpLmNvbnRhaW5zKAorCQkJCQkJCQkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmdWYWx1ZSgpKSkgeworCQkJCQkJCQkJCisJCQkJCQkvLyBZZXMKKwkJCQkJCXJldFZhbHVlID0gdHJ1ZTsKKwkJCQkJfSAvLyBpZiBhIGRpc2Vhc2UgbW9kZWwgcHJvcGVydHkKKwkJCQkJcmV0dXJuIHJldFZhbHVlOworCQkJCX0gLy8gaXNVc2VyU3BlY2lmaWVkUHJvcGVydHkKKworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Qm90dG9tVGV4dCgpIHsKKwkJCQkJcmV0dXJuICIiOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBib29sZWFuIGlzTW9kaWZpYWJsZVByb3BlcnR5KAorCQkJCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJCQkJYm9vbGVhbiByZXRWYWx1ZSA9IHN1cGVyLmlzTW9kaWZpYWJsZVByb3BlcnR5KGZlYXR1cmUpOworCisJCQkJCXJldHVybiByZXRWYWx1ZTsKKwkJCQl9IC8vIGlzTW9kaWZpYWJsZVByb3BlcnR5CisJCQl9OworCQl9IC8vIGNyZWF0ZU5ld01vZGlmaWVyUGFnZQorCisJfSAvLyAKKworfSAvLyAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvbmV3bW9kaWZpZXJwYWdlL0dyYXBoTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvbmV3bW9kaWZpZXJwYWdlL0dyYXBoTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQ1MzUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9uZXdtb2RpZmllcnBhZ2UvR3JhcGhOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubmV3bW9kaWZpZXJwYWdlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnV0aWwuR3JhcGhBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3TW9kaWZpZXJQYWdlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4ge0BsaW5rIE5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5fSB0aGF0IGFkYXB0cyBtZW1iZXJzIG9mCisgKiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaH0gbW9kZWwgdG8ge0BsaW5rIE5ld01vZGlmaWVyUGFnZX1zLgorICovCitwdWJsaWMgY2xhc3MgR3JhcGhOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEdyYXBoQWRhcHRlckZhY3RvcnkKKwkJaW1wbGVtZW50cyBOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeSB7CisKKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCisJICovCisJcHVibGljIEdyYXBoTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJCU5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkZEFkYXB0ZXJGYWN0b3J5KHRoaXMpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLnV0aWwuR3JhcGhBZGFwdGVyRmFjdG9yeSNpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gdHlwZSA9PSBOZXdNb2RpZmllclBhZ2VBZGFwdGVyLmNsYXNzCisJCQkJfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnV0aWwuTGFiZWxzQWRhcHRlckZhY3RvcnkjY3JlYXRlU3RhdGljTGFiZWxBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGF0aWNMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgU3RhdGljTGFiZWxOZXdNb2RpZmllclBhZ2VBZGFwdGVyKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgudXRpbC5HcmFwaEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUVkZ2VBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFZGdlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBFZGdlTmV3TW9kaWZpZXJQYWdlQWRhcHRlcigpOworCX0KKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgZXh0ZW5kZWQgYnkgY2xhc3NlcyB0aGF0IGFkYXB0IHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguU3RhdGljTGFiZWx9cyB0bworCSAqIHtAbGluayBOZXdNb2RpZmllclBhZ2V9cy4KKwkgKi8KKwlzdGF0aWMgcHVibGljIGNsYXNzIFN0YXRpY0xhYmVsTmV3TW9kaWZpZXJQYWdlQWRhcHRlciBleHRlbmRzCisJCQlOZXdNb2RpZmllclBhZ2VBZGFwdGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLm5ld21vZGlmaWVycGFnZS5OZXdNb2RpZmllclBhZ2VBZGFwdGVyI2NyZWF0ZU5ld01vZGlmaWVyUGFnZSgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE5ld01vZGlmaWVyUGFnZSBjcmVhdGVOZXdNb2RpZmllclBhZ2UoKSB7CisJCQlyZXR1cm4gbmV3IFN0YXRpY0xhYmVsTmV3TW9kaWZpZXJQYWdlKChJZGVudGlmaWFibGUpIGdldFRhcmdldCgpKTsKKwkJfSAvLyBjcmVhdGVOZXdNb2RpZmllclBhZ2UKKworCX0gLy8gU3RhdGljTGFiZWxOZXdNb2RpZmllclBhZ2VBZGFwdGVyCisKKwkvKioKKwkgKiB7QGxpbmsgTmV3TW9kaWZpZXJQYWdlfSBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5TdGF0aWNMYWJlbH1zLgorCSAqLworCXN0YXRpYyBwdWJsaWMgY2xhc3MgU3RhdGljTGFiZWxOZXdNb2RpZmllclBhZ2UgZXh0ZW5kcyBOZXdNb2RpZmllclBhZ2UgeworCQkvKioKKwkJICogQHBhcmFtIHRhcmdldAorCQkgKi8KKwkJcHVibGljIFN0YXRpY0xhYmVsTmV3TW9kaWZpZXJQYWdlKElkZW50aWZpYWJsZSB0YXJnZXQpIHsKKwkJCXN1cGVyKHRhcmdldCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIGJvb2xlYW4gaXNVc2VyU3BlY2lmaWVkUHJvcGVydHkoCisJCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5pc1VzZXJTcGVjaWZpZWRQcm9wZXJ0eShmZWF0dXJlKTsKKwkJCXJldFZhbHVlID0gcmV0VmFsdWUKKwkJCQkJJiYgIWZlYXR1cmUuZXF1YWxzKEdyYXBoUGFja2FnZS5MaXRlcmFscy5FREdFX0xBQkVMX19FREdFKTsKKwkJCXJldFZhbHVlID0gcmV0VmFsdWUKKwkJCQkJJiYgIWZlYXR1cmUuZXF1YWxzKEdyYXBoUGFja2FnZS5MaXRlcmFscy5OT0RFX0xBQkVMX19OT0RFKTsKKwkJCXJldFZhbHVlID0gcmV0VmFsdWUKKwkJCQkJJiYgIWZlYXR1cmUKKwkJCQkJCQkuZXF1YWxzKEdyYXBoUGFja2FnZS5MaXRlcmFscy5MQUJFTF9fVVJJX09GX0lERU5USUZJQUJMRV9UT19CRV9MQUJFTEVEKTsKKworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGlzVXNlclNwZWNpZmllZFByb3BlcnR5CisKKwl9IC8vIFN0YXRpY0xhYmVsTmV3TW9kaWZpZXJQYWdlCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGV4dGVuZGVkIGJ5IGNsYXNzZXMgdGhhdCBhZGFwdCB7QGxpbmsgRWRnZX1zIHRvCisJICoge0BsaW5rIE5ld01vZGlmaWVyUGFnZX1zLiBJbiByZWFsaXR5IHRoZSB7QGxpbmsgRWRnZX0gaXMgbm90IGFkYXB0ZWQsCisJICogaW5zdGVhZCBpdCBhZGFwdHMgaXRzIGxhYmVsIHRvIGEKKwkgKiB7QGxpbmsgU3RhdGljTGFiZWxOZXdNb2RpZmllclBhZ2VBZGFwdGVyfSBhbmQgZGVsZWdhdGVzIHRvIHRoZSBhZGFwdGVyLgorCSAqLworCXN0YXRpYyBwdWJsaWMgY2xhc3MgRWRnZU5ld01vZGlmaWVyUGFnZUFkYXB0ZXIgZXh0ZW5kcyBOZXdNb2RpZmllclBhZ2VBZGFwdGVyIHsKKworCQlTdGF0aWNMYWJlbE5ld01vZGlmaWVyUGFnZUFkYXB0ZXIgbGFiZWxBZGFwdGVyID0gbnVsbDsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLm5ld21vZGlmaWVycGFnZS5OZXdNb2RpZmllclBhZ2VBZGFwdGVyCisJCSAqICAgICAgI2NyZWF0ZU5ld01vZGlmaWVyUGFnZSgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE5ld01vZGlmaWVyUGFnZSBjcmVhdGVOZXdNb2RpZmllclBhZ2UoKSB7CisJCQlOZXdNb2RpZmllclBhZ2UgcmV0VmFsdWUgPSBudWxsOworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gZ2V0TGFiZWxBZGFwdGVyKCkuY3JlYXRlTmV3TW9kaWZpZXJQYWdlKCk7CisJCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKwkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkNhbid0IGNyZWF0ZSBtb2RpZmVyIGZvciBcIiIgKyAoKChFZGdlKSBnZXRUYXJnZXQoKSkuZ2V0TGFiZWwoKSkuZUNsYXNzKCkuZ2V0TmFtZSgpKyAiXCIiLCBudWxsKTsKKwkJCX0KKwkJCXJldHVybiByZXRWYWx1ZTsKKwkJfSAvLyBjcmVhdGVOZXdNb2RpZmllclBhZ2UKKworCQlwcml2YXRlIE5ld01vZGlmaWVyUGFnZUFkYXB0ZXIgZ2V0TGFiZWxBZGFwdGVyKCkgeworCQkJaWYgKGxhYmVsQWRhcHRlciA9PSBudWxsKSB7CisJCQkJZmluYWwgRWRnZUxhYmVsIGVkZ2VMYWJlbCA9ICgoRWRnZSkgZ2V0VGFyZ2V0KCkpLmdldExhYmVsKCk7CisJCQkJbGFiZWxBZGFwdGVyID0gKFN0YXRpY0xhYmVsTmV3TW9kaWZpZXJQYWdlQWRhcHRlcikgTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkJCS5hZGFwdChlZGdlTGFiZWwsIE5ld01vZGlmaWVyUGFnZUFkYXB0ZXIuY2xhc3MpOworCQkJfQorCQkJcmV0dXJuIGxhYmVsQWRhcHRlcjsKKwkJfQorCisJfSAvLyBFZGdlTmV3TW9kaWZpZXJQYWdlQWRhcHRlcgorfSAvLyBHcmFwaE5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL25ld21vZGlmaWVycGFnZS9MYWJlbHNOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9uZXdtb2RpZmllcnBhZ2UvTGFiZWxzTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjRmNGYzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9uZXdtb2RpZmllcnBhZ2UvTGFiZWxzTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDg4IEBACisvLyBMYWJlbHNOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubmV3bW9kaWZpZXJwYWdlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy5MYWJlbHNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnV0aWwuTGFiZWxzQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5uZXdtb2RpZmllcnBhZ2UuR3JhcGhOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeS5TdGF0aWNMYWJlbE5ld01vZGlmaWVyUGFnZUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld01vZGlmaWVyUGFnZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGFuIHtAbGluayBOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeX0gdGhhdCBhZGFwdHMgbWVtYmVycyBvZgorICogdGhlIExhYmVsIG1vZGVsIHRvIHtAbGluayBOZXdNb2RpZmllclBhZ2V9cy4KKyAqLworcHVibGljIGNsYXNzIExhYmVsc05ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgTGFiZWxzQWRhcHRlckZhY3RvcnkKKwkJaW1wbGVtZW50cyBOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeSB7CisKKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCisJICovCisJcHVibGljIExhYmVsc05ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5KCkgeworCQlzdXBlcigpOworCQlOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGRBZGFwdGVyRmFjdG9yeSh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC51dGlsLkdyYXBoQWRhcHRlckZhY3RvcnkjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gTmV3TW9kaWZpZXJQYWdlQWRhcHRlci5jbGFzcworCQkJCXx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy51dGlsLkxhYmVsc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBQaHlzaWNhbFJlbGF0aW9uc2hpcExhYmVsTmV3TW9kaWZpZXJQYWdlQWRhcHRlcigpOworCX0KKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgZXh0ZW5kZWQgYnkgY2xhc3NlcyB0aGF0IGFkYXB0CisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWx9cyB0byB7QGxpbmsgTmV3TW9kaWZpZXJQYWdlfXMuCisJICovCisJcHVibGljIGNsYXNzIFBoeXNpY2FsUmVsYXRpb25zaGlwTGFiZWxOZXdNb2RpZmllclBhZ2VBZGFwdGVyIGV4dGVuZHMKKwkJCVN0YXRpY0xhYmVsTmV3TW9kaWZpZXJQYWdlQWRhcHRlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5uZXdtb2RpZmllcnBhZ2UuR3JhcGhOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeS5TdGF0aWNMYWJlbE5ld01vZGlmaWVyUGFnZUFkYXB0ZXIjY3JlYXRlTmV3TW9kaWZpZXJQYWdlKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgTmV3TW9kaWZpZXJQYWdlIGNyZWF0ZU5ld01vZGlmaWVyUGFnZSgpIHsKKwkJCXJldHVybiBuZXcgR3JhcGhOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeS5TdGF0aWNMYWJlbE5ld01vZGlmaWVyUGFnZSgKKwkJCQkJKElkZW50aWZpYWJsZSkgZ2V0VGFyZ2V0KCkpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1VzZXJTcGVjaWZpZWRQcm9wZXJ0eSgKKwkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCQkJCWJvb2xlYW4gcmV0VmFsdWUgPSBzdXBlci5pc1VzZXJTcGVjaWZpZWRQcm9wZXJ0eShmZWF0dXJlKTsKKworCQkJCQlyZXRWYWx1ZSA9IHJldFZhbHVlCisJCQkJCQkJJiYgIShmZWF0dXJlCisJCQkJCQkJCQkuZXF1YWxzKExhYmVsc1BhY2thZ2UuTGl0ZXJhbHMuUkVMQVRJVkVfUEhZU0lDQUxfUkVMQVRJT05TSElQX0xBQkVMX1ZBTFVFX19BREpBQ0VOVCkpOworCisJCQkJCXJldFZhbHVlID0gcmV0VmFsdWUKKwkJCQkJCQkmJiAhKGZlYXR1cmUKKwkJCQkJCQkJCS5lcXVhbHMoTGFiZWxzUGFja2FnZS5MaXRlcmFscy5SRUxBVElWRV9QSFlTSUNBTF9SRUxBVElPTlNISVBfTEFCRUxfVkFMVUVfX1JFTEFUSU9OU0hJUCkpOworCisJCQkJCXJldHVybiByZXRWYWx1ZTsKKwkJCQl9IC8vIGlzVXNlclNwZWNpZmllZFByb3BlcnR5CisJCQl9OworCQl9IC8vIGNyZWF0ZU5ld01vZGlmaWVyUGFnZQorCQkKKwl9IC8vIFBoeXNpY2FsUmVsYXRpb25zaGlwTmV3TW9kaWZpZXJQYWdlQWRhcHRlcgorfSAvLyBMYWJlbHNOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9uZXdtb2RpZmllcnBhZ2UvTmV3TW9kaWZpZXJQYWdlQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9uZXdtb2RpZmllcnBhZ2UvTmV3TW9kaWZpZXJQYWdlQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NDM3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL25ld21vZGlmaWVycGFnZS9OZXdNb2RpZmllclBhZ2VBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLy8gTmV3TW9kaWZpZXJQYWdlQWRhcHRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubmV3bW9kaWZpZXJwYWdlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3TW9kaWZpZXJQYWdlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgZXh0ZW5kZWQgYnkgY2xhc3NlcyB0aGF0IGFkYXB0IHtAbGluayBPYmplY3R9cyB0bworICoge0BsaW5rIE5ld01vZGlmaWVyUGFnZX1zLgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgTmV3TW9kaWZpZXJQYWdlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMKKwkJQWRhcHRlciB7CisKKwkvKioKKwkgKiBAcmV0dXJuIGEge0BsaW5rIE5ld01vZGlmaWVyUGFnZX0KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgTmV3TW9kaWZpZXJQYWdlIGNyZWF0ZU5ld01vZGlmaWVyUGFnZSgpOworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCXJldHVybiB0eXBlID09IE5ld01vZGlmaWVyUGFnZUFkYXB0ZXIuY2xhc3M7CisJfQorCit9IC8vIE5ld01vZGlmaWVyUGFnZUFkYXB0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvbmV3bW9kaWZpZXJwYWdlL05ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL25ld21vZGlmaWVycGFnZS9OZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMTRmOWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL25ld21vZGlmaWVycGFnZS9OZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8vIE5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5uZXdtb2RpZmllcnBhZ2U7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGFkYXB0cworICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlfXMgdG8KKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3TW9kaWZpZXJQYWdlfXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkgeworCisJLyoqCisJICogU2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCisJICovCisJTmV3TW9kaWZpZXJQYWdlQWRhdHBlckZhY3RvcnlJbXBsIElOU1RBTkNFID0gbmV3IE5ld01vZGlmaWVyUGFnZUFkYXRwZXJGYWN0b3J5SW1wbCgpOworCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyB0aGUge0BsaW5rIENvbXBvc2VkQWRhcHRlckZhY3Rvcnl9IHRoYXQgb3RoZXIKKwkgKiB7QGxpbmsgTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3Rvcnl9cyBhZGQgdGhlbXNlbHZlcyB0by4KKwkgKi8KKwljbGFzcyBOZXdNb2RpZmllclBhZ2VBZGF0cGVyRmFjdG9yeUltcGwgZXh0ZW5kcyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5CisJCQlpbXBsZW1lbnRzIE5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5IHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCQlyZXR1cm4gdHlwZSA9PSBOZXdNb2RpZmllclBhZ2VBZGFwdGVyLmNsYXNzCisJCQkJCXx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CisJCX0KKworCX0gLy8gSWRlbnRpZmlhYmxlTmV3TW9kaWZpZXJQYWdlQWRhdHBlckZhY3RvcnlJbXBsCisKK30gLy8gTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvbmV3bW9kaWZpZXJwYWdlL1NlcXVlbmNlck5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL25ld21vZGlmaWVycGFnZS9TZXF1ZW5jZXJOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOTFkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL25ld21vZGlmaWVycGFnZS9TZXF1ZW5jZXJOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvLyBTZXF1ZW5jZXJOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubmV3bW9kaWZpZXJwYWdlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLnV0aWwuU2VxdWVuY2VyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld01vZGlmaWVyUGFnZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGFuIHtAbGluayBOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeX0gdGhhdAorICogYWRhcHRzIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbnRpYWxTZXF1ZW5jZXJ9cyB0byB7QGxpbmsgTmV3TW9kaWZpZXJQYWdlfXMuCisgKi8KK3B1YmxpYyBjbGFzcyBTZXF1ZW5jZXJOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeSBleHRlbmRzCisJCVNlcXVlbmNlckFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMKKwkJTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkgeworCisJLyoqCisJICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBTZXF1ZW5jZXJOZXdNb2RpZmllclBhZ2VBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkuYWRkQWRhcHRlckZhY3RvcnkodGhpcyk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8udXRpbC5TY2VuYXJpb0FkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKGZpbmFsIE9iamVjdCB0eXBlKSB7CisJCXJldHVybiB0eXBlID09IE5ld01vZGlmaWVyUGFnZS5jbGFzcyB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci51dGlsLlNlcXVlbmNlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVNlcXVlbnRpYWxTZXF1ZW5jZXJBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXF1ZW50aWFsU2VxdWVuY2VyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBTZXF1ZW50aWFsU2VxdWVuY2VyTmV3TW9kaWZpZXJQYWdlQWRhcHRlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci51dGlsLlNlcXVlbmNlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJlYWxUaW1lU2VxdWVuY2VyQWRhcHRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVhbFRpbWVTZXF1ZW5jZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IFJlYWxUaW1lU2VxdWVuY2VyTmV3TW9kaWZpZXJQYWdlQWRhcHRlcigpOworCX0KKworCS8qKgorCSAqIFRoaXMgY2xhc3MgYWRhcHRzIHtAbGluayBTZXF1ZW50aWFsU2VxdWVuY2VyfXMgdG8KKwkgKiB7QGxpbmsgTmV3TW9kaWZpZXJQYWdlfXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFNlcXVlbnRpYWxTZXF1ZW5jZXJOZXdNb2RpZmllclBhZ2VBZGFwdGVyIGV4dGVuZHMKKwkJCU5ld01vZGlmaWVyUGFnZUFkYXB0ZXIgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubmV3bW9kaWZpZXJwYWdlLk5ld01vZGlmaWVyUGFnZUFkYXB0ZXIjY3JlYXRlTmV3TW9kaWZpZXJQYWdlKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgTmV3TW9kaWZpZXJQYWdlIGNyZWF0ZU5ld01vZGlmaWVyUGFnZSgpIHsKKwkJCXJldHVybiBuZXcgTmV3TW9kaWZpZXJQYWdlKChJZGVudGlmaWFibGUpIGdldFRhcmdldCgpKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNVc2VyU3BlY2lmaWVkUHJvcGVydHkoCisJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJCQkJLy8gVE9ETyBpc1VzZXJTcGVjaWZpZWRQcm9wZXJ0eQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9OworCQl9IC8vIGNyZWF0ZU5ld01vZGlmaWVyUGFnZQorCisJfSAvLyBTZXF1ZW50aWFsU2VxdWVuY2VyTmV3TW9kaWZpZXJQYWdlQWRhcHRlcgorCisJLyoqCisJICogVGhpcyBjbGFzcyBhZGFwdHMge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuUmVhbFRpbWVTZXF1ZW5jZXJ9cyB0byB7QGxpbmsgTmV3TW9kaWZpZXJQYWdlfXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFJlYWxUaW1lU2VxdWVuY2VyTmV3TW9kaWZpZXJQYWdlQWRhcHRlciBleHRlbmRzCisJCQlOZXdNb2RpZmllclBhZ2VBZGFwdGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLm5ld21vZGlmaWVycGFnZS5OZXdNb2RpZmllclBhZ2VBZGFwdGVyI2NyZWF0ZU5ld01vZGlmaWVyUGFnZSgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE5ld01vZGlmaWVyUGFnZSBjcmVhdGVOZXdNb2RpZmllclBhZ2UoKSB7CisJCQlyZXR1cm4gbmV3IE5ld01vZGlmaWVyUGFnZSgoSWRlbnRpZmlhYmxlKSBnZXRUYXJnZXQoKSkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBib29sZWFuIGlzVXNlclNwZWNpZmllZFByb3BlcnR5KAorCQkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCQkJCS8vIFRPRE8gaXNVc2VyU3BlY2lmaWVkUHJvcGVydHkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfTsKKwkJfSAvLyBjcmVhdGVOZXdNb2RpZmllclBhZ2UKKworCX0gLy8gUmVhbFRpbWVTZXF1ZW5jZXJOZXdNb2RpZmllclBhZ2VBZGFwdGVyCisKK30gLy8gU2VxdWVuY2VyTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvcHJvcGVydHlzdHJpbmdzL0RlZmF1bHRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9wcm9wZXJ0eXN0cmluZ3MvRGVmYXVsdFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhNTM3OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvcHJvcGVydHlzdHJpbmdzL0RlZmF1bHRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8vIERlZmF1bHRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0aGUgUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIgdGhhdCBpcyByZXR1cm5lZCBieSB0aGUKKyAqIHtAbGluayBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3Rvcnl9IHdoZW4gbm8gb3RoZXIKKyAqIHtAbGluayBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlcn0gaXMgZm91bmQuCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIgZXh0ZW5kcworCQlQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlciB7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXIjZ2V0UHJvcGVydHlOYW1lKG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKGZpbmFsIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKwkJcmV0dXJuICIhIgorCQkJCSsgKChFU3RydWN0dXJhbEZlYXR1cmUpIGRlc2NyaXB0b3IuZ2V0RmVhdHVyZShudWxsKSkuZ2V0TmFtZSgpCisJCQkJKyAiISI7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyI2dldFByb3BlcnR5VG9vbFRpcChvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcikKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VG9vbFRpcChmaW5hbCBJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisJCXJldHVybiAiISIKKwkJCQkrICgoRVN0cnVjdHVyYWxGZWF0dXJlKSBkZXNjcmlwdG9yLmdldEZlYXR1cmUobnVsbCkpLmdldE5hbWUoKQorCQkJCSsgVFRfU1VGRklYICsgIiEiOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3MuUHJvcGVydHlTdHJpbmdQcm92aWRlciNnZXRQcm9wZXJ0eVVuaXRzKG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlVbml0cyhmaW5hbCBJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisJCXJldHVybiAiISIKKwkJCQkrICgoRVN0cnVjdHVyYWxGZWF0dXJlKSBkZXNjcmlwdG9yLmdldEZlYXR1cmUobnVsbCkpLmdldE5hbWUoKQorCQkJCSsgVU5JVF9TVUZGSVggKyAiISI7CisJfQorCit9IC8vIERlZmF1bHRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlcgorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL3Byb3BlcnR5c3RyaW5ncy9MYWJlbHNQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvcHJvcGVydHlzdHJpbmdzL0xhYmVsc1Byb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZTcxYWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL3Byb3BlcnR5c3RyaW5ncy9MYWJlbHNQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5nczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmxhYmVscy51dGlsLkxhYmVsc0FkYXB0ZXJGYWN0b3J5OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBOTFMnZCBzdHJpbmdzIGZvciBMYWJlbCBwcm9wZXJ0aWVzLgorICovCitwdWJsaWMgY2xhc3MgTGFiZWxzUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKKwkJTGFiZWxzQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkgeworCisJUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IG51bGw7CisKKwkvKioKKwkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisJICovCisJcHVibGljIExhYmVsc1Byb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkZEFkYXB0ZXJGYWN0b3J5KHRoaXMpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGwjaXNGYWN0b3J5Rm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIHR5cGUgPT0gUHJvcGVydHlTdHJpbmdQcm92aWRlci5jbGFzcworCQkJCXx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CisJfQorCisvLwkvKioKKy8vCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMudXRpbC5MYWJlbHNBZGFwdGVyRmFjdG9yeSNjcmVhdGVBcmVhTGFiZWxBZGFwdGVyKCkKKy8vCSAqLworLy8JQE92ZXJyaWRlCisvLwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcmVhTGFiZWxBZGFwdGVyKCkgeworLy8JCS8vIEhhdmUgd2UgY3JlYXRlZCBvbmUgYmVmb3JlPworLy8JCWlmIChhZGFwdGVyID09IG51bGwpIHsKKy8vCQkJLy8gTm8KKy8vCQkJYWRhcHRlciA9IG5ldyBMYWJlbHNQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlcigpOworLy8JCX0gLy8gaWYgd2UgZGlkbid0IGNyZWF0ZSBvbmUgYmVmb3JlCisvLwkJcmV0dXJuIGFkYXB0ZXI7CisvLwl9CisKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLnV0aWwuTGFiZWxzQWRhcHRlckZhY3RvcnkjY3JlYXRlU3RhdGljTGFiZWxBZGFwdGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGF0aWNMYWJlbEFkYXB0ZXIoKSB7CisJCS8vIEhhdmUgd2UgY3JlYXRlZCBvbmUgYmVmb3JlPworCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7CisJCQkvLyBObworCQkJYWRhcHRlciA9IG5ldyBMYWJlbHNQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlcigpOworCQl9IC8vIGlmIHdlIGRpZG4ndCBjcmVhdGUgb25lIGJlZm9yZQorCQlyZXR1cm4gYWRhcHRlcjsKKwl9IC8vIGNyZWF0ZVN0YXRpY0xhYmVsQWRhcHRlcgorCQorCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIExhYmVsc1Byb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyIGV4dGVuZHMKKwkJCVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyIHsKKworCQkvKioKKwkJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkJICogQHJldHVybiB0aGUgTkxTJ2QgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZGlzcGxheSB0byB0aGUgdXNlcgorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZGVzY3JpcHRvcgorCQkJCQkuZ2V0RmVhdHVyZShudWxsKSkuZ2V0TmFtZSgpKTsKKwkJfSAvLyBnZXRQcm9wZXJ0eU5hbWUKKworCQkvKioKKwkJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkJICogQHJldHVybiB0aGUgTkxTJ2QgdG9vbCB0aXAgdGV4dCB0aGF0IGRlc2NyaWJlcyB0aGUgcHJvcGVydHkKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlUb29sVGlwKElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKwkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZGVzY3JpcHRvcgorCQkJCQkuZ2V0RmVhdHVyZShudWxsKTsKKwkJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoZmVhdHVyZS5nZXROYW1lKCkgKyBUVF9TVUZGSVgpOworCQl9IC8vIGdldFByb3BlcnR5VG9vbFRpcAorCisJCS8qKgorCQkgKiBAcGFyYW0gZGVzY3JpcHRvcgorCQkgKiBAcmV0dXJuIHRoZSBOTFMnZCB0ZXh0IHRoYXQgcmVwcmVzZW50cyB0aGUgdW5pdHMgb2YgdGhlIHByb3BlcnR5CisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VW5pdHMoSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBkZXNjcmlwdG9yCisJCQkJCS5nZXRGZWF0dXJlKG51bGwpOworCQkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZyhmZWF0dXJlLmdldE5hbWUoKSArIFVOSVRfU1VGRklYKTsKKwkJfSAvLyBnZXRQcm9wZXJ0eVVuaXRzCisKKwl9IC8vIExhYmVsc1Byb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyCit9IC8vIExhYmVsc1Byb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9wcm9wZXJ0eXN0cmluZ3MvTWVzc2FnZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvcHJvcGVydHlzdHJpbmdzL01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyNjRiZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvcHJvcGVydHlzdHJpbmdzL01lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLy8gTWVzc2FnZXMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5nczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CisKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRoZSBSZXNvdXJjZSBCdW5kbGUgZm9yIHRoaXMgcGFja2FnZS4KKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSBDb25zdGFudHMuSURfUk9PVAorCQkJKyAiLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCisJCQkuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKKworCXByaXZhdGUgTWVzc2FnZXMoKSB7CisJCS8vIGVtcHR5CisJfQorCisJLyoqCisJICogQHBhcmFtIGtleQorCSAqICAgICAgICAgICAgdGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UKKwkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSBrZXkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9IC8vIGdldFN0cmluZworfSAvLyBNZXNzYWdlcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9wcm9wZXJ0eXN0cmluZ3MvUHJvcGVydHlTdHJpbmdQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9wcm9wZXJ0eXN0cmluZ3MvUHJvcGVydHlTdHJpbmdQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmN2FiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL3Byb3BlcnR5c3RyaW5ncy9Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLy8gUHJvcGVydHlTdHJpbmdQcm92aWRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCBwcm92aWRlIE5MUydkIHN0cmluZ3MgZm9yCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGV9IHByb3BlcnRpZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlTdHJpbmdQcm92aWRlciB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzdWZmaXggYXBwZW5kZWQgdG8gdGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBjcmVhdGUgdGhlIGtleQorCSAqIHRvIGV4dHJhY3QgdGhlIHRvb2wgdGlwIHRleHQgZnJvbSB0aGUgbWVzc2FnZSBwcm9wZXJ0eSBmaWxlLgorCSAqLworCVN0cmluZyBUVF9TVUZGSVggPSAiVFQiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzdWZmaXggYXBwZW5kZWQgdG8gdGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBjcmVhdGUgdGhlIGtleQorCSAqIHRvIGV4dHJhY3QgdGhlIHRleHQgZnJvbSB0aGUgbWVzc2FnZSBwcm9wZXJ0eSBmaWxlIHRoYXQgcmVwcmVzZW50cyB0aGUKKwkgKiB1bml0cyBvZiBhIHByb3BlcnR5LgorCSAqLworCVN0cmluZyBVTklUX1NVRkZJWCA9ICJVTklUIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkgKiBAcmV0dXJuIHRoZSBOTFMnZCBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCisJICovCisJU3RyaW5nIGdldFByb3BlcnR5TmFtZShJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yKTsKKworCS8qKgorCSAqIEBwYXJhbSBkZXNjcmlwdG9yCisJICogQHJldHVybiB0aGUgTkxTJ2QgdG9vbCB0aXAgdGV4dCB0aGF0IGRlc2NyaWJlcyB0aGUgcHJvcGVydHkKKwkgKi8KKwlTdHJpbmcgZ2V0UHJvcGVydHlUb29sVGlwKElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpOworCisJLyoqCisJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkgKiBAcmV0dXJuIHRoZSBOTFMnZCB0ZXh0IHRoYXQgcmVwcmVzZW50cyB0aGUgdW5pdHMgb2YgdGhlIHByb3BlcnR5CisJICovCisJU3RyaW5nIGdldFByb3BlcnR5VW5pdHMoSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcik7Cit9IC8vIFByb3BlcnR5U3RyaW5nUHJvdmlkZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvcHJvcGVydHlzdHJpbmdzL1Byb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL3Byb3BlcnR5c3RyaW5ncy9Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMTkwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL3Byb3BlcnR5c3RyaW5ncy9Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8vIFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGV4dGVuZGVkIGJ5IGNsYXNzZXMgdGhhdCBwcm92aWRlIE5MUydkIHN0cmluZyBmb3IgZGlzZWFzZSBtb2RlbAorICogcHJvcGVydGllcy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwKKwkJaW1wbGVtZW50cyBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyIHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShmaW5hbCBPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gdHlwZSA9PSBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyLmNsYXNzOworCX0KKworfSAvLyBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9wcm9wZXJ0eXN0cmluZ3MvUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL3Byb3BlcnR5c3RyaW5ncy9Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGUxM2IzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9hZGFwdGVycy9wcm9wZXJ0eXN0cmluZ3MvUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8vIFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgY3JlYXRlIHtAbGluayBBZGFwdGVyfXMgdGhhdAorICogYWRhcHQgdGhlIHByb3BlcnRpZXMgb2Yge0BsaW5rICBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZX1zIHRvIE5MUydkIHtAbGluayBTdHJpbmd9cy4KKyAqLworcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcworCSAqIHtAbGluayBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyfSBpbnN0YW5jZXMuCisJICogPHA+CisJICogVGhpcyBpbnN0YW5jZSBpcyBhIHtAbGluayBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5fSB3aGljaCBtZWFucyB0aGF0IGl0CisJICogY29sbGVjdHMgdG9nZXRoZXIgb3RoZXIge0BsaW5rIENvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnl9IGFkYXB0ZXIKKwkgKiBmYWN0b3JpZXMuIEVhY2ggY2xhc3MgdGhhdCBpbXBsZW1lbnRzCisJICoge0BsaW5rIFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeX0gbmVlZHMgdG8gYWRkIGl0c2VsZiB0byB0aGlzCisJICogaW5zdGFuY2Ugd2l0aCBhIGNhbGwgdG8KKwkgKiB7QGxpbmsgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNhZGRBZGFwdGVyRmFjdG9yeShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSl9LgorCSAqIFRoaXMgd2lsbCB0aGVuIGFsbG93IGFkYXB0ZXJzIGNyZWF0ZWQgYnkgdGhhdCBmYWN0b3J5IHRvIGJlIGZvdW5kIHdoZW4KKwkgKiBhZGFwdGluZyBjbGFzcyBpbnN0YW5jZXMgaGFuZGxlZCBieSB0aGUgbmV3IGZhY3RvcnkuCisJICogPHA+CisJICogQmFzaWNhbGx5LCBpZiB5b3UgY3JlYXRlIGFuIEVNRiBtb2RlbCBhbmQgZGVmaW5lIGEKKwkgKiB7QGxpbmsgUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5fSBmb3IgaXQgc28gdGhhdCB0aGUgY2xhc3NlcworCSAqIGluIHRoYXQgbW9kZWwgY2FuIGJlIGFkYXB0ZWQsIHlvdSBuZWVkIHRvIGhvb2sgdGhhdCBmYWN0b3J5IGludG8gdGhpcyBvbmUKKwkgKiBzbyB0aGF0IGxhdGVyIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFkYXB0IGEgY2xhc3MgZnJvbSB0aGF0IG1vZGVsIGlzCisJICogbWFkZSB0aGUgYXNzb2NpYXRlZCBmYWN0b3J5IHdpbGwgYmUgZm91bmQuIFlvdSBjYW4gZG8gdGhhdCBieSBhZGRpbmcgdGhlCisJICogbGluZTogPGNvZGU+CisJICogUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkZEFkYXB0ZXJGYWN0b3J5KHRoaXMpOworCSAqIDwvY29kZT4KKwkgKiB0byB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBvZiB0aGUgbmV3IGZhY3RvcnkgYWZ0ZXIgdGhlIHN1cGVyIGNhbGwuCisJICogWW91J3JlIG5vdCBkb25lIGhvd2V2ZXIsIHlvdSBhbHNvIGhhdmUgdG8gImZvcmNlIiBhbiBpbnN0YW5jZSBvZiB0aGUKKwkgKiBjbGFzcyB0byBiZSBjcmVhdGVkIHNvIHRoYXQgdGhlIGNvbnN0cnVjdG9yIGlzIHJ1bi4gVGhpcyBpcyB0eXBpY2FsbHkKKwkgKiBhY2hpZXZlZCBieSBhbGxvY2F0aW5nIGFuIGluc3RhbmNlIGluIHRoZSA8Y29kZT5zdGFydDwvY29kZT4gbWV0aG9kIG9mCisJICogdGhlIDxjb2RlPkFjdGl2YXRvcjwvY29kZT4gb2YgdGhlIHBsdWctaW4gdGhhdCBkZWZpbmVzIHRoZSBmYWN0b3J5LgorCSAqLworCVByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGwgSU5TVEFOQ0UgPSBuZXcgUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbCgpOworCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzCisJICoge0BsaW5rIFByb3BlcnR5U3RyaW5nUHJvdmlkZXJ9J3MKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUltcGwgZXh0ZW5kcworCQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksCisJCQlJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlLCBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkgeworCisJCXByaXZhdGUgc3RhdGljIERlZmF1bHRQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlciBERUZBVUxUX1BST1BFUlRZX1NUUklOR19QUk9WSURFUiA9IG5ldyBEZWZhdWx0UHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIoKTsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5I2FkYXB0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyLAorCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIEFkYXB0ZXIgYWRhcHQoZmluYWwgTm90aWZpZXIgdGFyZ2V0LCBmaW5hbCBPYmplY3QgdHlwZSkgeworCQkJcmV0dXJuIHJldHVybkRlZmF1bHRJZk5lZWRlZChzdXBlci5hZGFwdCh0YXJnZXQsIHR5cGUpKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3RvcnkjYWRhcHROZXcob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIsCisJCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhmaW5hbCBOb3RpZmllciB0YXJnZXQsIGZpbmFsIE9iamVjdCB0eXBlKSB7CisJCQlyZXR1cm4gcmV0dXJuRGVmYXVsdElmTmVlZGVkKHN1cGVyLmFkYXB0TmV3KHRhcmdldCwgdHlwZSkpOworCQl9CisKKwkJcHJpdmF0ZSBBZGFwdGVyIHJldHVybkRlZmF1bHRJZk5lZWRlZChmaW5hbCBBZGFwdGVyIGFkYXB0ZXIpIHsKKwkJCWlmIChhZGFwdGVyID09IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQlyZXR1cm4gREVGQVVMVF9QUk9QRVJUWV9TVFJJTkdfUFJPVklERVI7CisJCQl9IC8vIGlmCisJCQlyZXR1cm4gYWRhcHRlcjsKKwkJfSAvLyByZXR1cm5EZWZhdWx0SWZOZWVkZWQKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSNpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShmaW5hbCBPYmplY3QgdHlwZSkgeworCQkJcmV0dXJuIHR5cGUgPT0gUHJvcGVydHlTdHJpbmdQcm92aWRlci5jbGFzczsKKwkJfQorCX0gLy8gUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5SW1wbAorfSAvLyBQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvYWRhcHRlcnMvcHJvcGVydHlzdHJpbmdzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL3Byb3BlcnR5c3RyaW5ncy9tZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YTRlNTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2FkYXB0ZXJzL3Byb3BlcnR5c3RyaW5ncy9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNTUgQEAKKyMgbWVzc2FnZXMucHJvcGVydGllcworIworIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjIEFyZWEgTGFiZWxzCithcmVhID0gYXJlYQorYXJlYVVOSVQgPSBrbV4yCithcmVhVFQgPSBhcmVhCisKKyMgUm9hZCBMYWJlbHMKK3JvYWROYW1lID0gUm9hZCBOYW1lCityb2FkTmFtZVVOSVQgPQorcm9hZE5hbWVUVCA9IFRoZSBuYW1lIG9mIHRoZSByb2FkLiAKK3JvYWRDbGFzcyA9IENsYXNzCityb2FkQ2xhc3NVTklUID0gCityb2FkQ2xhc3NUVCA9IFRoZSB0eXBlIG9mIHJvYWQuCitudW1iZXJDcm9zc2luZ3MgPSBOdW1iZXIgb2YgQ3Jvc3NpbmdzCitudW1iZXJDcm9zc2luZ3NVTklUID0gY3Jvc3NpbmdzCitudW1iZXJDb3Jzc2luZ3NUVCA9IFRoZSBudW1iZXIgb2YgY3Jvc3NpbmdzLgorCisjIFBvcHVsYXRpb24gTGFiZWxzCitjb3VudCA9IENvdW50Citjb3VudFVOSVQgPSBQTQorY291bnRUVCA9IFRoZSBudW1iZXIgb2YgcG9wdWxhdGlvbiBtZW1iZXJzCitwb3B1bGF0aW9uSWRlbnRpZmllciA9IFBvcHVsYXRpb24KK3BvcHVsYXRpb25JZGVudGlmaWVyVU5JVCA9IAorcG9wdWxhdGlvbklkZW50aWZpZXJUVCA9IFRoZSBuYW1lIG9mIHRoZSBwb3B1bGF0aW9uLgorbmFtZSA9IE5hbWUKK25hbWVVTklUID0gCituYW1lVFQgPSBUaGUgbmFtZQorcG9wdWxhdGVkQXJlYSA9IEFyZWEKK3BvcHVsYXRlZEFyZWFVTklUID0ga21eMgorcG9wdWxhdGVkQXJlYVRUID0gVGhlIHZhbHVlIHRvIHVzZSB3aGVuIGNvbXB1dGluZyB0aGUgcG9wdWxhdGlvbiBkZW5zaXR5IChvdmVycmlkZXMgcmVnaW9uIGFyZWEpLgorCisjIFJlbGF0aW9uc2hpcHMKK2JvcmRlckxlbmd0aCA9IEJvcmRlciBMZW5ndGgKK2JvcmRlckxlbmd0aFVOSVQgPSBrbQorYm9yZGVyTGVuZ3RoVFQgPSBUaGUgbGVuZ3RoIG9mIHRoZSBib3JkZXIgYmV0d2VlbiB0d28gZ2VvZ3JhcGhpYyByZWdpb25zLgorYWRqYWNlbnQgPSBBZGphY2VudAorYWRqYWNlbnRVTklUID0gCithZGphY2VudFRUID0gSWYgVHJ1ZSB0aGVuIHRoZSB0d28gbm9kZXMgYXJlIGFkamFjZW50CityZWxhdGlvbnNoaXAgPSBSZWxhdGlvbnNoaXAKK3JlbGF0aW9uc2hpcFVOSVQgPSAKK3JlbGF0aW9uc2hpcFRUID0gVGhlIHR5cGUgb2YgcmVsYXRpb25zaGlwCisKKyAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZWRpdG9ycy9HZW5lcmljUHJvcGVydHlFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZWRpdG9ycy9HZW5lcmljUHJvcGVydHlFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzdkYTE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9lZGl0b3JzL0dlbmVyaWNQcm9wZXJ0eUVkaXRvci5qYXZhCkBAIC0wLDAgKzEsNjI3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZWRpdG9yczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLmltcGwuUmVnaW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLnByb3BlcnR5c3RyaW5ncy5Qcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuTG9jYXRpb25QaWNrZXJEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aWRnZXRzLk1hdHJpeEVkaXRvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuTWF0cml4RWRpdG9yV2lkZ2V0Lk1hdHJpeEVkaXRvclZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CisKKy8qKgorICogUHJvZHVjaW5nIGEgZm9ybSBnaXZlbiBhbiBpZGVudGlmaWFibGUgb2JqZWN0IGlzIGNvbW1vbiBpbiBTVEVNLiBUaGlzIGNsYXNzIGNvbnNvbGlkYXRlcworICogd2hhdCB1c2VkIHRvIGJlIGEgaGFuZGZ1bCBvZiBwbGFjZXMgd2UgZG8gdGhpcyBpbnRvIGEgc2luZ2xlIHBsYWNlLgorICogCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyaWNQcm9wZXJ0eUVkaXRvciBleHRlbmRzIENvbXBvc2l0ZSB7CisJcHJvdGVjdGVkIGZpbmFsIE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIFRleHQ+IG1hcCA9IG5ldyBIYXNoTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgVGV4dD4oKTsKKwlwcm90ZWN0ZWQgZmluYWwgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgU3RyaW5nW10+IG1hdHJpeE1hcCA9IG5ldyBIYXNoTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgU3RyaW5nW10+KCk7CisJcHJvdGVjdGVkIGZpbmFsIE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIEJvb2xlYW4+IGJvb2xlYW5NYXAgPSBuZXcgSGFzaE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIEJvb2xlYW4+KCk7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTWVzc2FnZTsKKwlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKKwkKKwlwdWJsaWMgR2VuZXJpY1Byb3BlcnR5RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgSVByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcihwYXJlbnQsc3R5bGUpOworCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OworCX0KKworCS8qKgorCSAqIENyZWF0ZSB0aGUgY29tcG9zaXRlCisJICogCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqIEBwYXJhbSBwcm9qZWN0VmFsaWRhdG9yCisJICovCisJcHVibGljIEdlbmVyaWNQcm9wZXJ0eUVkaXRvcihmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBpbnQgc3R5bGUsCisJCQlmaW5hbCBJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlLAorCQkJZmluYWwgTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKKwkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKwkJCisJCWZpbmFsIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7CisJCXNldExheW91dChncmlkTGF5b3V0KTsKKworCQkvLyBHZXQgdGhlIGFkYXB0ZXIgdGhhdCB3aWxsIHByb3ZpZGUgTkxTJ2QgbmFtZXMgZm9yIHRoZQorCQkvLyBwcm9wZXJ0aWVzIG9mIHRoZSBkaXNlYXNlIG1vZGVsCisJCWZpbmFsIFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyIHBzcGEgPSAoUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIpIFByb3BlcnR5U3RyaW5nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCS5hZGFwdChpZGVudGlmaWFibGUsIFByb3BlcnR5U3RyaW5nUHJvdmlkZXIuY2xhc3MpOworCisJCWZpbmFsIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgaXRlbVByb3ZpZGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KAorCQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkuRGVzY3JpcHRvci5SZWdpc3RyeS5JTlNUQU5DRSk7CisKKwkJZmluYWwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSBwcm9wZXJ0eVNvdXJjZSA9IChJSXRlbVByb3BlcnR5U291cmNlKSBpdGVtUHJvdmlkZXJGYWN0b3J5CisJCQkJLmFkYXB0KGlkZW50aWZpYWJsZSwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7CisJCWZpbmFsIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BlcnRpZXMgPSBwcm9wZXJ0eVNvdXJjZQorCQkJCS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGlkZW50aWZpYWJsZSk7CisKKwkJZm9yIChmaW5hbCBJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yIDogcHJvcGVydGllcykgeworCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBkZXNjcmlwdG9yCisJCQkJCS5nZXRGZWF0dXJlKG51bGwpOworCQkJLy8gSXMgdGhpcyBhIGRpc2Vhc2UgbW9kZWwgcHJvcGVydHkgdGhhdCB0aGUgdXNlciBzaG91bGQgc3BlY2lmeT8KKwkJCWJvb2xlYW4gaXNEYXRhUGF0aCA9IGZhbHNlOworCQkJYm9vbGVhbiBpc1VSSSA9IGZhbHNlOworCQkJCisJCQlpZiAoaXNVc2VyU3BlY2lmaWVkUHJvcGVydHkoZmVhdHVyZSkpIHsKKwkJCQkvLyBZZXMKKwkJCQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7CisJCQkJbGFiZWwuc2V0VGV4dChwc3BhLmdldFByb3BlcnR5TmFtZShkZXNjcmlwdG9yKSk7CisKKwkJCQlmaW5hbCBHcmlkRGF0YSBsYWJlbEdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7CisJCQkJbGFiZWxHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJCQlsYWJlbEdELmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKKwkJCQlsYWJlbEdELmhvcml6b250YWxJbmRlbnQgPSAwOworCQkJCWxhYmVsLnNldExheW91dERhdGEobGFiZWxHRCk7CisKKwkJCQkvLyBHZXQgYSBzdHJpbmcgdmFsdWUgZm9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmZWF0dXJlCisKKwkJCQlmaW5hbCBTdHJpbmcgZGVmYXVsdFZhbHVlU3RyaW5nID0gZ2V0UHJvcGVydHlEZWZhdWx0VmFsdWVTdHJpbmcoZGVzY3JpcHRvcik7CisJCQkJRUNsYXNzaWZpZXIgY2xhc3NpZmllciA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKKwkJCQlpZihjbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIkVCb29sZWFuIikpIHsKKwkJCQkJQ29tcG9zaXRlIHJhZGlvQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuQk9SREVSKTsKKwkJCQkgICAgRmlsbExheW91dCBmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoKTsKKwkJCQkgICAgZmlsbExheW91dC50eXBlID0gU1dULkhPUklaT05UQUw7CisJCQkJICAgIHJhZGlvQ29tcG9zaXRlLnNldExheW91dChmaWxsTGF5b3V0KTsKKwkJCQkgICAgCisJCQkJICAgIGZpbmFsIEJ1dHRvbiBmYWxzZUJ1dHRvbiA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7CisJCQkJICAgIGZhbHNlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJOTyIpKTsvLyROT04tTkxTLTEkCisJCQkJICAgIAorCQkJCSAgICBCdXR0b24gdHJ1ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7CisJCQkJICAgIHRydWVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIllFUyIpKTsvLyROT04tTkxTLTEkCisJCQkJICAgIAkgICAgCisJCQkJICAgIGlmKGRlZmF1bHRWYWx1ZVN0cmluZyAhPSBudWxsKSB7CisJCQkJICAgIAl0cnVlQnV0dG9uLnNldFNlbGVjdGlvbihkZWZhdWx0VmFsdWVTdHJpbmcuZXF1YWxzKCJ0cnVlIikpOworCQkJCSAgICAJZmFsc2VCdXR0b24uc2V0U2VsZWN0aW9uKCFkZWZhdWx0VmFsdWVTdHJpbmcuZXF1YWxzKCJ0cnVlIikpOworCQkJCSAgICB9CisJCQkJICAgIGVsc2Uge2ZhbHNlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTt0cnVlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7fQorCQkJCSAgICAKKwkJCQkgICAgTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7CisJCQkJICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQkJCSAgICAgICAgICBpZiAoZXZlbnQud2lkZ2V0ID09IGZhbHNlQnV0dG9uKSB7CisJCQkJICAgICAgICAJYm9vbGVhbk1hcC5wdXQoZmVhdHVyZSwgIWZhbHNlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKKwkJCQkgICAgICAgICAgfQorCQkJCSAgICAgICAgfQorCQkJCSAgICAgIH07CisJCQkJICAgICAgLy8gdGhlc2UgYXJlIHJhZGlvIGJ1dHRvbnMgc28gd2Ugb25seSBuZWVkIHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gb25lIG9mIHRoZW0uCisJCQkJICAgICAgZmFsc2VCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOworCQkJCSAgICAgIGZpbmFsIEdyaWREYXRhIGNHRCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQpOworCQkJCSAgICAgIGNHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJCQkJICBjR0QuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQkJCQkgIHJhZGlvQ29tcG9zaXRlLnNldExheW91dERhdGEoY0dEKTsKKwkJCQkJICAKKwkJCQl9IGVsc2UgaWYoY2xhc3NpZmllci5nZXROYW1lKCkuZXF1YWxzKCJVUkkiKSkgeworCQkJCQkvLyBCcmluZyB1cCBsb2NhdGlvbiBwaWNrZXIgZm9yIFVSSSdzCisJCQkJCWlzVVJJID0gdHJ1ZTsKKwkJCQkJCisJCQkJCWZpbmFsIFRleHQgaXNva2V5VmFsdWVUZXh0ID0gbmV3IFRleHQodGhpcywgU1dULk5PTkUpOworCQkJCQlpc29rZXlWYWx1ZVRleHQuc2V0VGV4dCgiIik7CisJCQkJCW1hcC5wdXQoZmVhdHVyZSwgaXNva2V5VmFsdWVUZXh0KTsKKwkJCQkJCisJCQkJCWZpbmFsIEdyaWREYXRhIGdkX2lzb0tleUxhYmVsVmFsdWUgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKKwkJCQkJaXNva2V5VmFsdWVUZXh0LnNldExheW91dERhdGEoZ2RfaXNvS2V5TGFiZWxWYWx1ZSk7CisJCQkJCQorCQkJCQlmaW5hbCBCdXR0b24gbG9jYXRpb25CdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5OT05FKTsKKwkJCQkJbG9jYXRpb25CdXR0b24uc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIk5QaWNrTG9jIikpOworCQkJCQlmaW5hbCBHcmlkRGF0YSBsYl9pc29LZXlMYWJlbCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOworCQkJCQlsb2NhdGlvbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGxiX2lzb0tleUxhYmVsKTsKKwkJCQkJCisJCQkJCWxvY2F0aW9uQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQkJCQorCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgYXJnMCkgeworCQkJCQkJCUxvY2F0aW9uUGlja2VyRGlhbG9nIGxwRGlhbG9nID0gbmV3IExvY2F0aW9uUGlja2VyRGlhbG9nKEdlbmVyaWNQcm9wZXJ0eUVkaXRvci50aGlzLmdldFNoZWxsKCksIFNXVC5OT05FLCBNZXNzYWdlcy5nZXRTdHJpbmcoIk5QaWNrTG9jVGl0bGUiKSwgaXNva2V5VmFsdWVUZXh0LmdldFRleHQoKSwgR2VuZXJpY1Byb3BlcnR5RWRpdG9yLnRoaXMucHJvamVjdCk7CisJCQkJCQkJCisJCQkJCQkJT2JqZWN0IFtdIHJldCAgPSBscERpYWxvZy5vcGVuKCk7CisJCQkJCQkJaWYocmV0ICE9IG51bGwpIHsgCisJCQkJCQkJCWlmKHJldFsxXSAhPSBudWxsKQorCQkJCQkJCQkJaXNva2V5VmFsdWVUZXh0LnNldFRleHQoKChVUkkpcmV0WzFdKS50b1N0cmluZygpKTsKKwkJCQkJCQkJZWxzZQorCQkJCQkJCQkJaXNva2V5VmFsdWVUZXh0LnNldFRleHQoU1RFTVVSSS5jcmVhdGVVUkkoIm5vZGUvZ2VvL3JlZ2lvbi8iKygoU3RyaW5nKXJldFswXSkpLnRvU3RyaW5nKCkpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKKwkJCQkJCQkKKwkJCQkJCX0KKwkJCQkJfSk7CisKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBOb3QgYSBib29sZWFuCisJCQkJCVRleHQgdGV4dCA9IG51bGw7CisJCQkJCWlmKGlzTGlzdE9yTWFwKGZlYXR1cmUpKQorCQkJCQkJaGFuZGxlTGlzdE9yTWFwKGZlYXR1cmUpOworCQkJCQkKKwkJCQkJZWxzZSB7CisJCQkJCQkKKwkJCQkJCXRleHQgPSBuZXcgVGV4dCh0aGlzLCBTV1QuQk9SREVSIHwgU1dULlRSQUlMKTsKKwkJCQkJCWlmKGRlZmF1bHRWYWx1ZVN0cmluZyAhPSBudWxsKQorCQkJCQkJCXRleHQuc2V0VGV4dChkZWZhdWx0VmFsdWVTdHJpbmcpOworCQkJCQkJdGV4dC5zZXRUb29sVGlwVGV4dChwc3BhLmdldFByb3BlcnR5VG9vbFRpcChkZXNjcmlwdG9yKSk7CisJCQkJCQltYXAucHV0KGZlYXR1cmUsIHRleHQpOworCQkKKwkJCQkJCWZpbmFsIEdyaWREYXRhIHRleHRHRCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQpOworCQkJCQkJdGV4dEdELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQkJCQkJdGV4dEdELmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKKwkJCQkJCXRleHQuc2V0TGF5b3V0RGF0YSh0ZXh0R0QpOworCQkKKwkJCQkJCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIocHJvamVjdFZhbGlkYXRvcik7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoImRhdGFQYXRoIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJaXNEYXRhUGF0aCA9IHRydWU7CisJCQkJCQlmaW5hbCBDb21wb3NpdGUgYnV0dG9ucyA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOworCQkJCQkJZmluYWwgUm93TGF5b3V0IGJ1dHRvbnNMYXlvdXQgPSBuZXcgUm93TGF5b3V0KCk7CisJCQkJCQlidXR0b25zTGF5b3V0Lm1hcmdpblRvcCA9IDA7CisJCQkJCQlidXR0b25zTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7CisJCQkJCQlidXR0b25zLnNldExheW91dChidXR0b25zTGF5b3V0KTsKKwkJCQkJCWZpbmFsIFNoZWxsIHNoZWxsID0gdGhpcy5nZXRTaGVsbCgpOworCQorCQkJCQkJZmluYWwgQnV0dG9uIGZpbGVDaG9vc2VyQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLAorCQkJCQkJCQlTV1QuTk9ORSk7CisJCQkJCQlmaWxlQ2hvb3NlckJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzCisJCQkJCQkJCS5nZXRTdHJpbmcoImZpbGVDaG9vc2VyQnV0dG9uVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJZmlsZUNob29zZXJCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMKKwkJCQkJCQkJLmdldFN0cmluZygiZmlsZUNob29zZXJCdXR0b25Ub29sdGlwVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJZmluYWwgVGV4dCBfdGV4dD10ZXh0OworCQkJCQkJZmlsZUNob29zZXJCdXR0b24KKwkJCQkJCQkJLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCQkJCQkJQE92ZXJyaWRlCisJCQkJCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCgKKwkJCQkJCQkJCQkJZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQkJCQkJCWZpbmFsIEZpbGVEaWFsb2cgZmQgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwKKwkJCQkJCQkJCQkJCVNXVC5PUEVOIHwgU1dULk1VTFRJKTsKKwkJCQkJCQkJCQlmZAorCQkJCQkJCQkJCQkJLnNldFRleHQoTWVzc2FnZXMKKwkJCQkJCQkJCQkJCQkJLmdldFN0cmluZygiZmlsZUNob29zZXJEaWFsb2dUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCWZpbmFsIFN0cmluZ1tdIGV4dGVuc2lvbnNGaWx0ZXIgPSB7CisJCQkJCQkJCQkJCQkiKi50eHQiLCAiKi5jc3YiIH07CisJCQkJCQkJCQkJZmQuc2V0RmlsdGVyRXh0ZW5zaW9ucyhleHRlbnNpb25zRmlsdGVyKTsKKwkKKwkJCQkJCQkJCQkvLyBTdHJpbmcgZm9ybWF0IGZvciBzaW5nbGUgc2VsZWN0ZWQgZmlsZQorCQkJCQkJCQkJCS8vIHdpbGwgYmU6CisJCQkJCQkJCQkJLy8gInBhdGgvZmlsZV9uYW1lIgorCQkJCQkJCQkJCS8vIEZvciBtdWx0aS1maWxlcyB0aGUgZm9ybWF0IHdpbGwgYmU6CisJCQkJCQkJCQkJLy8gInBhdGgvZmlsZV9uYW1lMSIgImZpbGVfbmFtZTIiCisJCQkJCQkJCQkJLy8gImZpbGVfbmFtZTMiLi4uCisJCisJCQkJCQkJCQkJU3RyaW5nIHNlbGVjdGVkID0gIlwiIiArIGZkLm9wZW4oKSArICJcIiI7CisJCQkJCQkJCQkJZmluYWwgU3RyaW5nW10gc2VsZWN0ZWRGaWxlcyA9IGZkCisJCQkJCQkJCQkJCQkuZ2V0RmlsZU5hbWVzKCk7CisJCQkJCQkJCQkJaWYgKHNlbGVjdGVkRmlsZXMubGVuZ3RoID4gMSkgeyAvLyBpZgorCQkJCQkJCQkJCQkvLyBtdWx0aS1maWxlcworCQkJCQkJCQkJCQkvLyBzZWxlY3RlZAorCQkJCQkJCQkJCQlTdHJpbmdCdWlsZGVyIHN0ciA9IG5ldyBTdHJpbmdCdWlsZGVyKHNlbGVjdGVkKTsKKwkJCQkJCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzZWxlY3RlZEZpbGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQkJCQkJCQlzdHIuYXBwZW5kKCIgXCIiKTsKKwkJCQkJCQkJCQkJCXN0ci5hcHBlbmQoc2VsZWN0ZWRGaWxlc1tpXSk7CisJCQkJCQkJCQkJCQlzdHIuYXBwZW5kKCJcIiIpOworLy8JCQkJCQkJCQkJCQlzZWxlY3RlZCArPSAiIFwiIgorLy8JCQkJCQkJCQkJCQkJCSsgc2VsZWN0ZWRGaWxlc1tpXSArICJcIiI7CisJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJc2VsZWN0ZWQgPSBzdHIudG9TdHJpbmcoKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJX3RleHQuc2V0VGV4dChzZWxlY3RlZCk7CisJCQkJCQkJCQl9IC8vIHdpZGdldFNlbGVjdGVkCisJCQkJCQkJCX0gLy8gU2VsZWN0aW9uQWRhcHRlcgorCQkJCQkJCQkpOworCQorCQkJCQkJZmluYWwgQnV0dG9uIGRpckNob29zZXJCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsCisJCQkJCQkJCVNXVC5OT05FKTsKKwkJCQkJCWRpckNob29zZXJCdXR0b24uc2V0VGV4dChNZXNzYWdlcworCQkJCQkJCQkuZ2V0U3RyaW5nKCJkaXJDaG9vc2VyQnV0dG9uVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJZGlyQ2hvb3NlckJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcworCQkJCQkJCQkuZ2V0U3RyaW5nKCJkaXJDaG9vc2VyQnV0dG9uVG9vbHRpcFRleHQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWRpckNob29zZXJCdXR0b24KKwkJCQkJCQkJLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCQkJCQkJQE92ZXJyaWRlCisJCQkJCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCgKKwkJCQkJCQkJCQkJZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQkJCQkJCWZpbmFsIERpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coCisJCQkJCQkJCQkJCQlzaGVsbCwgU1dULk9QRU4pOworCQkJCQkJCQkJCWRkCisJCQkJCQkJCQkJCQkuc2V0VGV4dChNZXNzYWdlcworCQkJCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJkaXJDaG9vc2VyRGlhbG9nVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQlmaW5hbCBTdHJpbmcgc2VsZWN0ZWQgPSBkZC5vcGVuKCk7CisJCQkJCQkJCQkJX3RleHQuc2V0VGV4dChzZWxlY3RlZCk7CisJCQkJCQkJCQl9IC8vIHdpZGdldFNlbGVjdGVkCisJCQkJCQkJCX0gLy8gU2VsZWN0aW9uQWRhcHRlcgorCQkJCQkJCQkpOworCQorCQkJCQkJZmluYWwgR3JpZERhdGEgZmlsZUJ0bkdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCk7CisJCQkJCQkvLyBmaWxlQ2hvb3NlckJ1dHRvbi5zZXRMYXlvdXREYXRhKGZpbGVCdG5HRCk7CisJCQkJCQlidXR0b25zLnNldExheW91dERhdGEoZmlsZUJ0bkdEKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChmZWF0dXJlLmdldE5hbWUoKS5zdGFydHNXaXRoKCJkYXRhRmlsZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWlzRGF0YVBhdGggPSB0cnVlOworCQkJCQkJZmluYWwgQ29tcG9zaXRlIGJ1dHRvbnMgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKKwkJCQkJCWZpbmFsIFJvd0xheW91dCBidXR0b25zTGF5b3V0ID0gbmV3IFJvd0xheW91dCgpOworCQkJCQkJYnV0dG9uc0xheW91dC5tYXJnaW5Ub3AgPSAwOworCQkJCQkJYnV0dG9uc0xheW91dC5tYXJnaW5Cb3R0b20gPSAwOworCQkJCQkJYnV0dG9ucy5zZXRMYXlvdXQoYnV0dG9uc0xheW91dCk7CisJCQkJCQlmaW5hbCBTaGVsbCBzaGVsbCA9IHRoaXMuZ2V0U2hlbGwoKTsKKwkKKwkJCQkJCWZpbmFsIEJ1dHRvbiBmaWxlQ2hvb3NlckJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULk5PTkUpOworCQkJCQkJZmlsZUNob29zZXJCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoImZpbGVDaG9vc2VyQnV0dG9uVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJZmlsZUNob29zZXJCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJmaWxlQ2hvb3NlckJ1dHRvblRvb2x0aXBUZXh0IikpOyAvLyROT04tTkxTLTEkCisJCQkJCQlmaW5hbCBUZXh0IF90ZXh0PXRleHQ7CisJCQkJCQlmaWxlQ2hvb3NlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQkJCQkJCUBPdmVycmlkZQorCQkJCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQkJCQkJCWZpbmFsIEZpbGVEaWFsb2cgZmQgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULk9QRU4gfCBTV1QuU0lOR0xFKTsKKwkJCQkJCQkJCQlmZC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiZmlsZUNob29zZXJEaWFsb2dUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCVN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZlYXR1cmUuZ2V0TmFtZSgpLCAiXyIpOworCQkJCQkJCQkJCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKwkJCQkJCQkJCQl0b2submV4dFRva2VuKCk7CisJCQkJCQkJCQkJd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQkJCQkJCQkJdi5hZGQoIiouIiArIHRvay5uZXh0VG9rZW4oKSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCXYuYWRkKCIqIik7CisJCQkJCQkJCQkJZmluYWwgU3RyaW5nW10gZXh0ZW5zaW9uc0ZpbHRlciA9IG5ldyBTdHJpbmdbdi5zaXplKCldOworCQkJCQkJCQkJCWZkLnNldEZpbHRlckV4dGVuc2lvbnModi50b0FycmF5KGV4dGVuc2lvbnNGaWx0ZXIpKTsKKwkKKwkJCQkJCQkJCQlfdGV4dC5zZXRUZXh0KGZkLm9wZW4oKSk7CisJCQkJCQkJCQl9IC8vIHdpZGdldFNlbGVjdGVkCisJCQkJCQkJCX0gLy8gU2VsZWN0aW9uQWRhcHRlcgorCQkJCQkJCQkpOworCQorCQkJCQkJZmluYWwgR3JpZERhdGEgZmlsZUJ0bkdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCk7CisJCQkJCQkvLyBmaWxlQ2hvb3NlckJ1dHRvbi5zZXRMYXlvdXREYXRhKGZpbGVCdG5HRCk7CisJCQkJCQlidXR0b25zLnNldExheW91dERhdGEoZmlsZUJ0bkdEKTsKKwkJCQkJfQorCQkJCX0gLy8gaXMgbm90IGJvb2xlYW4KKwkJCQlpZiAoIWlzRGF0YVBhdGggJiYgIWlzVVJJKSB7CisJCQkJCWZpbmFsIExhYmVsIHVuaXRMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7CisJCQkJCXVuaXRMYWJlbC5zZXRUZXh0KHBzcGEuZ2V0UHJvcGVydHlVbml0cyhkZXNjcmlwdG9yKSk7CisJCQkJCWZpbmFsIEdyaWREYXRhIHVuaXRMYWJlbEdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCk7CisJCQkJCXVuaXRMYWJlbEdELnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOworCQkJCQl1bml0TGFiZWwuc2V0TGF5b3V0RGF0YSh1bml0TGFiZWxHRCk7CisJCQkJfQorCisJCQl9IC8vIGlmIHVzZXIgc3BlY2lmaWVkCisJCX0gLy8gZm9yIGVhY2ggZGlzZWFzZSBtb2RlbCBwcm9wZXJ0eQorCisJfSAvLyBHcmFwaEdlbmVyYXRvclByb3BlcnR5RWRpdG9yCisKKwlwcml2YXRlIHZvaWQgaGFuZGxlTGlzdE9yTWFwKGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5OT05FKTsKKwkJSW1hZ2UgaW1hZ2UgPSBudWxsOworCQlmaW5hbCBFQ2xhc3NpZmllciB0eXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOworCQkKKwkJaWYgKHR5cGUuZ2V0Q2xhc3NpZmllcklEKCkgPT0gQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfTElTVCB8fAorCQl0eXBlLmdldENsYXNzaWZpZXJJRCgpID09IENvbW1vblBhY2thZ2UuU1RSSU5HX1ZBTFVFX0xJU1QpCisJCQlpbWFnZSA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKKwkJCQkib3JnLmVjbGlwc2Uuc3RlbS51aSIsICIvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9MaXN0LmdpZiIpLmNyZWF0ZUltYWdlKCk7CisJCWVsc2UKKwkJCWltYWdlID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKAorCQkJCQkib3JnLmVjbGlwc2Uuc3RlbS51aSIsICIvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi9NYXRyaXguZ2lmIikuY3JlYXRlSW1hZ2UoKTsKKwkJCisJCWJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7CisJCWZpbmFsIEdyaWREYXRhIGJ1dHRvbkdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCk7CisJCS8vYnV0dG9uR0QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCS8vYnV0dG9uR0QuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQlidXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HRCk7CisJCQorCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7CisJCQkJU3RyaW5nIHRpdGxlPW51bGw7CisJCQkJc2hvcnQgY29scz0wOworCQkJCXNob3J0IHJvd3M9MDsKKwkJCQlTdHJpbmcgW10gcm93bmFtZXM9bnVsbDsKKwkJCQlTdHJpbmcgW10gY29sbmFtZXM9bnVsbDsKKwkJCQlib29sZWFuIGZpeGVkU2l6ZT1mYWxzZTsKKwkJCQlNYXRyaXhFZGl0b3JWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKKwkJCQlTdHJpbmcgW10gZXhpc3RpbmdWYWxzPW51bGw7CisJCQkJCisJCQkJLy8gUmV0cmlldmUgYW55IGFscmVhZHkgZW50ZXJlZCB2YWx1ZXMKKwkJCQlpZihtYXRyaXhNYXAuZ2V0KGZlYXR1cmUpIT1udWxsKSB7CisJCQkJCWV4aXN0aW5nVmFscyA9IG1hdHJpeE1hcC5nZXQoZmVhdHVyZSk7CisJCQkJfQorCQkJCQorCQkJCWlmKHR5cGUuZ2V0Q2xhc3NpZmllcklEKCkgPT0gQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfTElTVCB8fAorCQkJCQkJdHlwZS5nZXRDbGFzc2lmaWVySUQoKSA9PSBDb21tb25QYWNrYWdlLlNUUklOR19WQUxVRV9MSVNUKSB7CisJCQkJCWZpeGVkU2l6ZSA9IGdldEZpeGVkU2l6ZShmZWF0dXJlKTsKKwkJCQkJdGl0bGUgPSBmZWF0dXJlLmdldE5hbWUoKTsKKwkJCQkJY29scyA9IDE7CisJCQkJCXJvd3MgPSBnZXRSb3dDb3VudChmZWF0dXJlKTsKKwkJCQkJaWYoIWZpeGVkU2l6ZSAmJiByb3dzID09IDApCisJCQkJCQlyb3dzID0gKGV4aXN0aW5nVmFscyAhPSBudWxsKT8gKHNob3J0KWV4aXN0aW5nVmFscy5sZW5ndGg6KHNob3J0KTE7CisJCQkJCQorCQkJCQlyb3duYW1lcyA9IGdldFJvd05hbWVzKGZlYXR1cmUpOworCQkJCQljb2xuYW1lcyA9IG5ldyBTdHJpbmdbMV07Y29sbmFtZXNbMF09ZmVhdHVyZS5nZXROYW1lKCk7CisJCQkJCQorCQkJCX0gZWxzZSBpZih0eXBlLmdldENsYXNzaWZpZXJJRCgpID09IENvbW1vblBhY2thZ2UuRE9VQkxFX1ZBTFVFX01BVFJJWCkgeworCQkJCQl0aXRsZSA9IGZlYXR1cmUuZ2V0TmFtZSgpOworCQkJCQljb2xzID0gZ2V0Q29sQ291bnQoZmVhdHVyZSk7CisJCQkJCXJvd3MgPSBnZXRSb3dDb3VudChmZWF0dXJlKTsKKwkJCQkJcm93bmFtZXMgPSBnZXRSb3dOYW1lcyhmZWF0dXJlKTsKKwkJCQkJY29sbmFtZXMgPSByb3duYW1lczsKKwkJCQkJZml4ZWRTaXplID0gZ2V0Rml4ZWRTaXplKGZlYXR1cmUpOworCQkJCX0KKwkJCQkKKwkJCQl2YWxpZGF0b3IgPSBnZXRWYWxpZGF0b3IoZmVhdHVyZSk7CisJCQkJCisKKwkJCQkvLyBQcmUtcG9wdWxhdGUgd2l0aCAwIChkZWZhdWx0IGZyb20gRU1GIG5vdCBwb3NzaWJsZSBzaW5jZSBpdCdzIGEgcmVmZXJlbmNlKQorCQkJCWlmKGV4aXN0aW5nVmFscyA9PSBudWxsICYmICh0eXBlLmdldENsYXNzaWZpZXJJRCgpID09IENvbW1vblBhY2thZ2UuRE9VQkxFX1ZBTFVFX0xJU1QgfHwgdHlwZS5nZXRDbGFzc2lmaWVySUQoKSA9PSBDb21tb25QYWNrYWdlLkRPVUJMRV9WQUxVRV9NQVRSSVgpKSB7CisJCQkJCWV4aXN0aW5nVmFscyA9IG5ldyBTdHJpbmdbY29scypyb3dzXTsKKwkJCQkJZm9yKGludCBpPTA7aTxjb2xzKnJvd3M7KytpKSBleGlzdGluZ1ZhbHNbaV09IjAuMCI7CisJCQkJfQorCisJCQkJU2hlbGwgc2hlbGwgPSBHZW5lcmljUHJvcGVydHlFZGl0b3IudGhpcy5nZXRTaGVsbCgpOworCQkJCU1hdHJpeEVkaXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgTWF0cml4RWRpdG9yRGlhbG9nKHNoZWxsLCBTV1QuTk9ORSwgdGl0bGUsIHJvd3MsIGNvbHMsIHJvd25hbWVzLCBjb2xuYW1lcywgZXhpc3RpbmdWYWxzLGZpeGVkU2l6ZSx2YWxpZGF0b3IpOworCQkJCQorCQkJCVN0cmluZyBbXXJlcyA9IGRpYWxvZy5vcGVuKCk7CisJCQkJCisJCQkJaWYocmVzIT1udWxsKSB7CisJCQkJCW1hdHJpeE1hcC5wdXQoZmVhdHVyZSwgcmVzKTsKKwkJCQl9CisJCQkJCisJCQl9CisJCQkKKworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJCisJCQl9CisJCX0pOworCX0KKworCS8qKgorCSAqIGdldFZhbGlkYXRvci4gVGhlc2UgYXJlIGdlbmVyaWMgdmFsaWRhdG9ycyBmb3Igc3RyaW5ncyBhbmQgZG91Ymxlcy4gT3ZlcnJpZGUgaW4gCisJICogc3ViY2xhc3MgZm9yIG1vcmUgYWR2YW5jZWQgdmFsaWRhdGlvbiAoPjAgZXRjLikKKwkgKiBAcGFyYW0gZmVhdHVyZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgTWF0cml4RWRpdG9yVmFsaWRhdG9yIGdldFZhbGlkYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQlFQ2xhc3NpZmllciB0eXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOworCQlNYXRyaXhFZGl0b3JWYWxpZGF0b3IgdmFsaWRhdG9yPW51bGw7CisJCWlmKHR5cGUuZ2V0Q2xhc3NpZmllcklEKCkgPT0gQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfTElTVCB8fAorCQkJCXR5cGUuZ2V0Q2xhc3NpZmllcklEKCkgPT0gQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfTUFUUklYKSAKKwkJCXZhbGlkYXRvciA9IG5ldyBNYXRyaXhFZGl0b3JWYWxpZGF0b3IoKSB7CisJCQkJCisJCQkJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZShTdHJpbmcgdmFsKSB7CisJCQkJCWlmKHZhbCA9PSBudWxsIHx8IHZhbC50cmltKCkuZXF1YWxzKCIiKSkgcmV0dXJuIGZhbHNlOworCQkJCQl0cnkgeworCQkJCQkJRG91YmxlLnBhcnNlRG91YmxlKHZhbC50cmltKCkpOworCQkJCQl9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCX07CQkJCisJCWVsc2UgaWYodHlwZS5nZXRDbGFzc2lmaWVySUQoKSA9PSBDb21tb25QYWNrYWdlLlNUUklOR19WQUxVRV9MSVNUKQorCQkJdmFsaWRhdG9yID0gbmV3IE1hdHJpeEVkaXRvclZhbGlkYXRvcigpIHsKKwkJCQorCQkJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZShTdHJpbmcgdmFsKSB7CisJCQkJaWYodmFsID09IG51bGwgfHwgdmFsLnRyaW0oKS5lcXVhbHMoIiIpKSByZXR1cm4gZmFsc2U7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX07CQorCQlyZXR1cm4gdmFsaWRhdG9yOworCX0KKwkvKioKKwkgKiBUaGVzZSBhcmUgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzCisJICovCisJcHVibGljIHNob3J0IGdldENvbENvdW50KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCXJldHVybiAxOworCX0KKworCXB1YmxpYyBib29sZWFuIGdldEZpeGVkU2l6ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIFN0cmluZ1tdIGdldFJvd05hbWVzKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nW10gZ2V0Q29sTmFtZXMoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyBzaG9ydCBnZXRSb3dDb3VudChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQlyZXR1cm4gMTsKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIGlzTGlzdE9yTWFwKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCUVDbGFzc2lmaWVyIHR5cGUgPSBmZWF0dXJlLmdldEVUeXBlKCk7CisJCWlmKHR5cGUuZ2V0Q2xhc3NpZmllcklEKCkgPT0gQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfTElTVCB8fAorCQkJCXR5cGUuZ2V0Q2xhc3NpZmllcklEKCkgPT0gQ29tbW9uUGFja2FnZS5TVFJJTkdfVkFMVUVfTElTVCB8fAorCQkJCXR5cGUuZ2V0Q2xhc3NpZmllcklEKCkgPT0gQ29tbW9uUGFja2FnZS5ET1VCTEVfVkFMVUVfTUFUUklYKQorCQkJcmV0dXJuIHRydWU7CisJCWVsc2UgcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRlbnRzIGFyZSB2YWxpZCwgPGNvZGU+ZmFsc2U8L2NvZGU+CisJICogICAgICAgICBvdGhlcndpc2UuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gdmFsaWRhdGUoKTsKKworCisJLyoqCisJICogQHBhcmFtIGZlYXR1cmUKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmZWF0dXJlIGlzIGEgZHVibGluIGNvcmUgZmVhdHVyZSB0aGF0CisJICogICAgICAgICBpcyBzcGVjaWZpZWQgYnkgYSB1c2VyLgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzVXNlclNwZWNpZmllZFByb3BlcnR5KGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKTsKKworCisJLyoqCisJICogQHBhcmFtIHRleHQKKwkgKiBAcGFyYW0gbWluVmFsdWUKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZExvbmdWYWx1ZShmaW5hbCBTdHJpbmcgdGV4dCwgZmluYWwgbG9uZyBtaW5WYWx1ZSkgeworCQlib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKKwkJdHJ5IHsKKwkJCWZpbmFsIGRvdWJsZSB2YWx1ZSA9IExvbmcucGFyc2VMb25nKHRleHQpOworCQkJcmV0VmFsdWUgPSB2YWx1ZSA+PSBtaW5WYWx1ZTsKKwkJfSBjYXRjaCAoZmluYWwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJfSAvLyBjYXRjaCBQYXJzZUV4Y2VwdGlvbgorCQlyZXR1cm4gcmV0VmFsdWU7CisJfQorCisJLyoqCisJICogQHBhcmFtIHRleHQKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFBlcmNlbnRhZ2UoZmluYWwgU3RyaW5nIHRleHQpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CisJCXRyeSB7CisJCQlmaW5hbCBkb3VibGUgdmFsdWUgPSBEb3VibGUucGFyc2VEb3VibGUodGV4dCk7CisJCQlyZXRWYWx1ZSA9IHZhbHVlID49IDAuMCAmJiB2YWx1ZSA8PSAxMDAuOworCQl9IGNhdGNoIChmaW5hbCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQl9IC8vIGNhdGNoIFBhcnNlRXhjZXB0aW9uCisJCXJldHVybiByZXRWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdGV4dAorCSAqIEBwYXJhbSBtaW5WYWx1ZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkVmFsdWUoZmluYWwgU3RyaW5nIHRleHQsIGZpbmFsIGRvdWJsZSBtaW5WYWx1ZSkgeworCQlib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKKwkJdHJ5IHsKKwkJCWZpbmFsIGRvdWJsZSB2YWx1ZSA9IERvdWJsZS5wYXJzZURvdWJsZSh0ZXh0KTsKKwkJCXJldFZhbHVlID0gdmFsdWUgPj0gbWluVmFsdWU7CisJCX0gY2F0Y2ggKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKwkJCXJldFZhbHVlID0gZmFsc2U7CisJCX0gLy8gY2F0Y2ggUGFyc2VFeGNlcHRpb24KKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gaXNWYWxpZFJhdGUKKworCS8qKgorCSAqIEBwYXJhbSB0ZXh0CisJICogQHBhcmFtIG1pblZhbHVlCisJICogQHJldHVybgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRJbnRWYWx1ZShmaW5hbCBTdHJpbmcgdGV4dCwgZmluYWwgaW50IG1pblZhbHVlKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOworCQl0cnkgeworCQkJZmluYWwgZG91YmxlIHZhbHVlID0gSW50ZWdlci5wYXJzZUludCh0ZXh0KTsKKwkJCXJldFZhbHVlID0gdmFsdWUgPj0gbWluVmFsdWU7CisJCX0gY2F0Y2ggKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKwkJCXJldFZhbHVlID0gZmFsc2U7CisJCX0gLy8gY2F0Y2ggUGFyc2VFeGNlcHRpb24KKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gaXNWYWxpZEludFJhdGUKKwkKKwkvKioKKwkgKiBAcGFyYW0gdGV4dAorCSAqIEBwYXJhbSBtaW5WYWx1ZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkRG91YmxlVmFsdWUoZmluYWwgU3RyaW5nIHRleHQsIGZpbmFsIGludCBtaW5WYWx1ZSkgeworCQlib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKKwkJdHJ5IHsKKwkJCWZpbmFsIGRvdWJsZSB2YWx1ZSA9IERvdWJsZS5wYXJzZURvdWJsZSh0ZXh0KTsKKwkJCXJldFZhbHVlID0gdmFsdWUgPj0gbWluVmFsdWU7CisJCX0gY2F0Y2ggKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKwkJCXJldFZhbHVlID0gZmFsc2U7CisJCX0gLy8gY2F0Y2ggUGFyc2VFeGNlcHRpb24KKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gaXNWYWxpZEludFJhdGUKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tTdWJjbGFzcygpIHsKKwkJLy8gRGlzYWJsZSB0aGUgY2hlY2sgdGhhdCBwcmV2ZW50cyBzdWItY2xhc3Npbmcgb2YgU1dUIGNvbXBvbmVudHMKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZGVzY3JpcHRvcgorCSAqIEByZXR1cm4gdGhlIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByb3BlcnR5CisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZVN0cmluZyhmaW5hbCBJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZGVzY3JpcHRvcgorCQkJCS5nZXRGZWF0dXJlKG51bGwpOworCQorCQlyZXR1cm4gIGZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgpOworCX0KKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlIHRoYXQgZGVzY3JpYmVzIHRoZSBwcm9ibGVtIHdpdGggdGhlIGNvbnRlbnRzCisJICovCisJcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7CisJCXJldHVybiBlcnJvck1lc3NhZ2U7CisJfQorCit9IC8vIEdlbmVyaWNQcm9wZXJ0eUVkaXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9lZGl0b3JzL0lkZW50aWZpYWJsZUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2VkaXRvcnMvSWRlbnRpZmlhYmxlQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2ExODM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9lZGl0b3JzL0lkZW50aWZpYWJsZUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKQEAgLTAsMCArMSwzOTYgQEAKKy8vIElkZW50aWZpYWJsZUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5lZGl0b3JzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbnRyb2xBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkxvYWRSZXNvdXJjZUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBjbGFzcyB0aGUgYWN0aW9uIGJhciBjb250cmlidXRvciBmb3IgdGhlIElkZW50aWZpYWJsZSBtb2RlbCBlZGl0b3IuIEl0CisgKiBpcyBiYXNpY2FsbHkgYSBjb3B5IG9mIHRoZSBFTUYgZ2VuZXJhdGVkIHZlcnNpb24gb2YgdGhpcyBjb2RlLiBJdCBoYXMgYmVlbgorICogc2xpZ2h0bHkgbW9kaWZpZWQgYnkgbWFraW5nIHNvbWUgc3RyaW5ncyBtb3JlIGdlbmVyaWMuCisgKi8KK3B1YmxpYyBjbGFzcyBJZGVudGlmaWFibGVBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzCisJCUVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgeworCisJLyoqCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGVkaXRvci4KKwkgKi8KKwlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yUGFydDsKKworCS8qKgorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHByb3ZpZGVyLgorCSAqLworCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7CisKKwkvKioKKwkgKiBUaGlzIGFjdGlvbiBvcGVucyB0aGUgUHJvcGVydGllcyB2aWV3LgorCSAqLworCXByb3RlY3RlZCBJQWN0aW9uIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbiA9IG5ldyBBY3Rpb24oCisJCQkiU2hvdyAmUHJvcGVydGllcyBWaWV3IikgLy8kTk9OLU5MUy0xJAorCXsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCXRyeSB7CisJCQkJZ2V0UGFnZSgpLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCUFjdGl2YXRvci5sb2dFcnJvcigiUHJvYmxlbSBzaG93aW5nIHByb3BlcnR5IHZpZXciLCBleGNlcHRpb24pOworCQkJfQorCQl9CisJfTsKKworCS8qKgorCSAqIFRoaXMgYWN0aW9uIHJlZnJlc2hlcyB0aGUgdmlld2VyIG9mIHRoZSBjdXJyZW50IGVkaXRvciBpZiB0aGUgZWRpdG9yCisJICogaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyfS4KKwkgKi8KKwlwcm90ZWN0ZWQgSUFjdGlvbiByZWZyZXNoVmlld2VyQWN0aW9uID0gbmV3IEFjdGlvbigiJlJlZnJlc2giKSAvLyROT04tTkxTLTEkCisJeworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworCQkJcmV0dXJuIGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJaWYgKGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKKwkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpIGFjdGl2ZUVkaXRvclBhcnQpCisJCQkJCQkuZ2V0Vmlld2VyKCk7CisJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7CisJCQkJCXZpZXdlci5yZWZyZXNoKCk7CisJCQkJfQorCQkJfQorCQl9CisJfTsKKworCS8qKgorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8KKwkgKiBlYWNoIGRlc2NyaXB0b3IgZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlQ2hpbGRBY3Rpb25zOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlCisJICogYWRkZWQgZm9yIENyZWF0ZUNoaWxkIGFjdGlvbnMuCisJICovCisJcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyB3aWxsIGNvbnRhaW4gb25lCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBjb3JyZXNwb25kaW5nCisJICogdG8gZWFjaCBkZXNjcmlwdG9yIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtCisJICogcHJvdmlkZXIuCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlU2libGluZ0FjdGlvbnM7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUKKwkgKiBhZGRlZCBmb3IgQ3JlYXRlU2libGluZyBhY3Rpb25zLgorCSAqLworCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyOworCisJLyoqCisJICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBjb250cmlidXRvci4KKwkgKi8KKwlwdWJsaWMgSWRlbnRpZmlhYmxlQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7CisJCXN1cGVyKEFERElUSU9OU19MQVNUX1NUWUxFKTsKKwkJbG9hZFJlc291cmNlQWN0aW9uID0gbmV3IExvYWRSZXNvdXJjZUFjdGlvbigpOworCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBWYWxpZGF0ZUFjdGlvbigpOworCQljb250cm9sQWN0aW9uID0gbmV3IENvbnRyb2xBY3Rpb24oKTsKKwl9IC8vIElkZW50aWZpYWJsZUFjdGlvbkJhckNvbnRyaWJ1dG9yCisKKwkvKioKKwkgKiBUaGlzIGFkZHMgU2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucyB0byB0aGUgdG9vbCBiYXIuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImlkZW50aWZpYWJsZS1zZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAorCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiaWRlbnRpZmlhYmxlLWFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCX0gLy8gY29udHJpYnV0ZVRvVG9vbEJhcgorCisJLyoqCisJICogVGhpcyBhZGRzIHRvIHRoZSBtZW51IGJhciBhIG1lbnUgYW5kIHNvbWUgc2VwYXJhdG9ycyBmb3IgZWRpdG9yCisJICogYWRkaXRpb25zLCBhcyB3ZWxsIGFzIHRoZSBzdWItbWVudXMgZm9yIG9iamVjdCBjcmVhdGlvbiBpdGVtcy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQlzdXBlci5jb250cmlidXRlVG9NZW51KG1lbnVNYW5hZ2VyKTsKKworCQlJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCisJCQkJIklkZW50aWZpYWJsZSBFZGl0b3IiLCAib3JnLmVjbGlwc2Uuc3RlbS51aS5pZGVudGlmaWFibGVNZW51SUQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhY3Rpb25zIikpOyAvLyROT04tTkxTLTEkCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucy1lbmQiKSk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVDaGlsZCBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCisJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoIiZOZXcgQ2hpbGQiKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlU2libGluZyBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCisJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigiJk5ldyBTaWJsaW5nIik7IC8vJE5PTi1OTFMtMSQKKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gRm9yY2UgYW4gdXBkYXRlIGJlY2F1c2UgRWNsaXBzZSBoaWRlcyBlbXB0eSBtZW51cyBub3cuCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJCQltZW51TWFuYWdlci51cGRhdGVBbGwodHJ1ZSk7CisJCQl9CisJCX0pOworCisJCWFkZEdsb2JhbEFjdGlvbnMoc3VibWVudU1hbmFnZXIpOworCX0gLy8gY29udHJpYnV0ZVRvTWVudQorCisJLyoqCisJICogV2hlbiB0aGUgYWN0aXZlIGVkaXRvciBjaGFuZ2VzLCB0aGlzIHJlbWVtYmVycyB0aGUgY2hhbmdlIGFuZCByZWdpc3RlcnMKKwkgKiB3aXRoIGl0IGFzIGEgc2VsZWN0aW9uIHByb3ZpZGVyLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBwYXJ0KSB7CisJCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihwYXJ0KTsKKwkJYWN0aXZlRWRpdG9yUGFydCA9IHBhcnQ7CisKKwkJLy8gU3dpdGNoIHRvIHRoZSBuZXcgc2VsZWN0aW9uIHByb3ZpZGVyLgorCQkvLworCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgeworCQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCQl9CisJCWlmIChwYXJ0ID09IG51bGwpIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyID0gcGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKKwkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKworCQkJLy8gRmFrZSBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IHRvIHVwZGF0ZSB0aGUgbWVudXMuCisJCQkvLworCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpICE9IG51bGwpIHsKKwkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsCisJCQkJCQlzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhpcyBpbXBsZW1lbnRzCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn0sIGhhbmRsaW5nCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50fXMgYnkgcXVlcnlpbmcgZm9yCisJICogdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZAorCSAqIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4KKwkgKiAKKwkgKiBAcGFyYW0gZXZlbnQKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50fQorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCS8vIFJlbW92ZSBhbnkgbWVudSBpdGVtcyBmb3Igb2xkIHNlbGVjdGlvbi4KKwkJLy8KKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMpOworCQl9CisKKwkJLy8gUXVlcnkgdGhlIG5ldyBzZWxlY3Rpb24gZm9yIGFwcHJvcHJpYXRlIG5ldyBjaGlsZC9zaWJsaW5nIGRlc2NyaXB0b3JzCisJCUNvbGxlY3Rpb248Pz4gbmV3Q2hpbGREZXNjcmlwdG9ycyA9IG51bGw7CisJCUNvbGxlY3Rpb248Pz4gbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gbnVsbDsKKworCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOworCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24KKwkJCQkmJiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnNpemUoKSA9PSAxKSB7CisJCQlPYmplY3Qgb2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQorCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7CisKKwkJCUVkaXRpbmdEb21haW4gZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSBhY3RpdmVFZGl0b3JQYXJ0KQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOworCisJCQluZXdDaGlsZERlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMob2JqZWN0LCBudWxsKTsKKwkJCW5ld1NpYmxpbmdEZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG51bGwsIG9iamVjdCk7CisJCX0KKworCQkvLyBHZW5lcmF0ZSBhY3Rpb25zIGZvciBzZWxlY3Rpb247IHBvcHVsYXRlIGFuZCByZWRyYXcgdGhlIG1lbnVzLgorCQljcmVhdGVDaGlsZEFjdGlvbnMgPSBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhuZXdDaGlsZERlc2NyaXB0b3JzLAorCQkJCXNlbGVjdGlvbik7CisJCWNyZWF0ZVNpYmxpbmdBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucygKKwkJCQluZXdTaWJsaW5nRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7CisKKwkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7CisJCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKKwkJfQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKKwkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLAorCQkJCQludWxsKTsKKwkJCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7CisJCX0KKwl9IC8vIHNlbGVjdGlvbkNoYW5nZWQKKworCS8qKgorCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0KKwkgKiBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LCBhbmQgcmV0dXJucyB0aGUKKwkgKiBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMoCisJCQlDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7CisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7CisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlQ2hpbGRBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwgc2VsZWN0aW9uLAorCQkJCQkJZGVzY3JpcHRvcikpOworCQkJfQorCQl9CisJCXJldHVybiBhY3Rpb25zOworCX0KKworCS8qKgorCSAqIFRoaXMgZ2VuZXJhdGVzIGEKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGZvciBlYWNoCisJICogb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwgYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YKKwkgKiB0aGVzZSBhY3Rpb25zLgorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoCisJCQlDb2xsZWN0aW9uPD8+IGRlc2NyaXB0b3JzLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7CisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7CisJCQlmb3IgKE9iamVjdCBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpIHsKKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlU2libGluZ0FjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LAorCQkJCQkJc2VsZWN0aW9uLCBkZXNjcmlwdG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCisJLyoqCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMgYmFzZWQgb24gdGhlCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZQorCSAqIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sIGJ5IGluc2VydGluZyB0aGVtIGJlZm9yZSB0aGUgc3BlY2lmaWVkCisJICogY29udHJpYnV0aW9uIGl0ZW0gPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+LiBJZgorCSAqIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgc2ltcGx5CisJICogYWRkZWQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsCisJCQlDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zLCBTdHJpbmcgY29udHJpYnV0aW9uSUQpIHsKKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChJQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMpIHsKKwkJCQlpZiAoY29udHJpYnV0aW9uSUQgIT0gbnVsbCkgeworCQkJCQltYW5hZ2VyLmluc2VydEJlZm9yZShjb250cmlidXRpb25JRCwgYWN0aW9uKTsKKwkJCQl9IGVsc2UgeworCQkJCQltYW5hZ2VyLmFkZChhY3Rpb24pOworCQkJCX0KKwkJCX0KKwkJfQorCX0gLy8gcG9wdWxhdGVNYW5hZ2VyCisKKwkvKioKKwkgKiBUaGlzIHJlbW92ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IGFsbAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zIGJhc2VkIG9uIHRoZQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUKKwkgKiA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGRlcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsCisJCQlDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJQWN0aW9uPiBhY3Rpb25zKSB7CisJCWlmIChhY3Rpb25zICE9IG51bGwpIHsKKwkJCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtYW5hZ2VyLmdldEl0ZW1zKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CisJCQkJLy8gTG9vayBpbnRvIFN1YkNvbnRyaWJ1dGlvbkl0ZW1zCisJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uSXRlbSA9IGl0ZW1zW2ldOworCQkJCXdoaWxlIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCQljb250cmlidXRpb25JdGVtID0gKChTdWJDb250cmlidXRpb25JdGVtKSBjb250cmlidXRpb25JdGVtKQorCQkJCQkJCS5nZXRJbm5lckl0ZW0oKTsKKwkJCQl9CisKKwkJCQkvLyBEZWxldGUgdGhlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1zIHdpdGggbWF0Y2hpbmcgYWN0aW9uLgorCQkJCWlmIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgeworCQkJCQlJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgY29udHJpYnV0aW9uSXRlbSkKKwkJCQkJCQkuZ2V0QWN0aW9uKCk7CisJCQkJCWlmIChhY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsKKwkJCQkJCW1hbmFnZXIucmVtb3ZlKGNvbnRyaWJ1dGlvbkl0ZW0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfSAvLyBkZXBvcHVsYXRlTWFuYWdlcgorCisJLyoqCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHBvcC11cCBtZW51IGJlZm9yZSBpdCBhcHBlYXJzLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKKwkJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBudWxsOworCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCJOZXcgQ2hpbGQiKTsgLy8kTk9OLU5MUy0xJAorCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7CisJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZWRpdCIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAorCisJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCJOZXcgU2libGluZyIpOyAvLyROT04tTkxTLTEkCisJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMsIG51bGwpOworCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKKwl9IC8vIG1lbnVBYm91dFRvU2hvdworCisJLyoqCisJICogVGhpcyBpbnNlcnRzIGdsb2JhbCBhY3Rpb25zIGJlZm9yZSB0aGUgImFkZGl0aW9ucy1lbmQiIHNlcGFyYXRvci4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRHbG9iYWxBY3Rpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgeworCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zLWVuZCIsIG5ldyBTZXBhcmF0b3IoInVpLWFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKKworCQlyZWZyZXNoVmlld2VyQWN0aW9uLnNldEVuYWJsZWQocmVmcmVzaFZpZXdlckFjdGlvbi5pc0VuYWJsZWQoKSk7CisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgcmVmcmVzaFZpZXdlckFjdGlvbik7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBUaGUgYWN0aW9ucyBhZGRlZCBhcmUgVmFsaWRhdGUgYW5kIExvYWQgUmVzb3VyY2UKKwkJLy8gc3VwZXIuYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7CisJfSAvLyBhZGRHbG9iYWxBY3Rpb25zCisKKwkvKioKKwkgKiBUaGlzIGVuc3VyZXMgdGhhdCBhIGRlbGV0ZSBhY3Rpb24gd2lsbCBjbGVhbiB1cCBhbGwgcmVmZXJlbmNlcyB0byBkZWxldGVkCisJICogb2JqZWN0cy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVBbGxSZWZlcmVuY2VzT25EZWxldGUoKSB7CisJCXJldHVybiB0cnVlOworCX0gLy8gcmVtb3ZlQWxsUmVmZXJlbmNlc09uRGVsZXRlCisKK30gLy8gSWRlbnRpZmlhYmxlQWN0aW9uQmFyQ29udHJpYnV0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZWRpdG9ycy9JZGVudGlmaWFibGVFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZWRpdG9ycy9JZGVudGlmaWFibGVFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWI5YTJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9lZGl0b3JzL0lkZW50aWZpYWJsZUVkaXRvci5qYXZhCkBAIC0wLDAgKzEsNjkzIEBACisvLyBJZGVudGlmaWFibGVFZGl0b3IuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmVkaXRvcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkRlbGV0ZUNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuY2VsbGVkaXRvci5BZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuTG9jYWxUcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuVmlld2VyRHJhZ0FkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLnByb3ZpZGVyLkNvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LnByb3ZpZGVyLkV4cGVyaW1lbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGgucHJvdmlkZXIuR3JhcGhJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwucHJvdmlkZXIuTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8ucHJvdmlkZXIuU2NlbmFyaW9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLnByb3ZpZGVyLlNlcXVlbmNlckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TYXZlQXNEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRoZSBzdXBlci1jbGFzcyBvZiBhbGwgZWRpdG9ycyB0aGF0IGVkaXQge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlfXMuCisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBJZGVudGlmaWFibGVFZGl0b3IgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0IGltcGxlbWVudHMKKwkJSU1lbnVMaXN0ZW5lciwgSVNlbGVjdGlvblByb3ZpZGVyLCBJRWRpdGluZ0RvbWFpblByb3ZpZGVyIHsKKworCS8qKgorCSAqIFRoaXMgbWFwIGhvbGRzIHRoZSBvcHRpb25zIGZvciBzYXZpbmcgcmVzb3VyY2VzLgorCSAqLworCWZpbmFsIHByb3RlY3RlZCBzdGF0aWMgTWFwPE9iamVjdCwgT2JqZWN0PiBzYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOworCXN0YXRpYyB7CisJCS8vIE9ubHkgc2F2ZSB0aGluZ3MgdGhhdCBoYXZlIGNoYW5nZWQuCisJCXNhdmVPcHRpb25zLnB1dChSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRUQsCisJCQkJUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOworCX0gLy8gc3RhdGljCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBlZGl0b3IncyB7QGxpbmsgRWRpdGluZ0RvbWFpbn0gd2hpY2ggaXMgYmFzaWNhbGx5IHRoZQorCSAqIGNvbWJpbmF0aW9uIG9mIGEge0BsaW5rIFJlc291cmNlU2V0fSBhbmQgYSB7QGxpbmsgQ29tbWFuZFN0YWNrfS4gSXQKKwkgKiBrZWVwcyB0cmFjayBvZiB3aGF0IGlzIGJlaW5nIGVkaXRlZCBhbmQgdGhlIHN0YWNrIG9mIHtAbGluayBDb21tYW5kfXMKKwkgKiB0aGF0IG1hZGUgdGhlIGNoYW5nZXMuCisJICovCisJcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOworCisJLyoqCisJICogVGhpcyBhZGFwdGVyIGZhY3Rvcnkgd2lsbCBiZSBjb21wb3NlZCBvZiB0aGUgSWRlbnRpZmlhYmxlIGl0ZW0gcHJvdmlkZXIKKwkgKiBmYWN0b3JpZXMuCisJICogCisJICogQHNlZSAjY3JlYXRlQWRhcHRlckZhY3RvcnkoKQorCSAqLworCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OworCisJLyoqCisJICogVGhlIHtAbGluayBWaWV3ZXJ9IGN1cnJlbnRseSBkaXNwbGF5ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVmlld2VyIGN1cnJlbnRWaWV3ZXI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB7QGxpbmsgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9ufSB0aGF0IHNhdmVzIHRoZSBtb2RpZmllZAorCSAqIHtAbGluayBSZXNvdXJjZX1zLgorCSAqLworCWZpbmFsIHByaXZhdGUgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIHNhdmVPcGVyYXRpb24gPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgeworCQkvKioKKwkJICogQHBhcmFtIG1vbml0b3IKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCisJCQlmb3IgKGZpbmFsIFJlc291cmNlIHJlc291cmNlIDogZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpCisJCQkJCS5nZXRSZXNvdXJjZXMoKSkgeworCQkJCS8vIFNob3VsZCB0aGlzIFJlc291cmNlIGJlIHNhdmVkPworCQkJCWlmIChyZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSA9PSBmYWxzZQorCQkJCQkJJiYgZWRpdGluZ0RvbWFpbi5pc1JlYWRPbmx5KHJlc291cmNlKSA9PSBmYWxzZSkgeworCQkJCQkvLyBZZXMKKwkJCQkJdHJ5IHsKKwkJCQkJCXJlc291cmNlLnNhdmUoc2F2ZU9wdGlvbnMpOworCQkJCQl9IC8vIHRyeQorCQkJCQljYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKwkJCQkJCUFjdGl2YXRvci5sb2dFcnJvcigiUHJvYmxlbSBzYXZpbmciLCBlKTsKKwkJCQkJfSAvLyBjYXRjaCBFeGNlcHRpb24KKwkJCQl9IC8vIGlmIHNhdmUgcmVzb3VyY2UKKwkJCX0gLy8gZm9yIGVhY2ggUmVzb3VyY2UKKworCQl9IC8vIGV4ZWN1dGUKKwl9OyAvLyBzYXZlT3BlcmF0aW9uCisKKwkvKioKKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdoZW4gdGhlIG91dGxpbmUgYmVjb21lcyBhY3RpdmUuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHJvdGVjdGVkIElQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyID0gbmV3IElQYXJ0TGlzdGVuZXIoKSB7CisKKwkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7CisJCQkvLyBCYXNpY2FsbHkgdGhlcmUgYXJlIHRocmVlIHdheXMgdGhlIGVkaXRvciBnZXRzICJhY3RpdmF0ZWQiLAorCQkJLy8gZWl0aGVyIHRoZSBDb250ZW50IE91dGxpbmUgdmlldyBvciB0aGUgUHJvcGVydHkgU2hlZXQgdmlld3MgYXJlCisJCQkvLyBhY3RpdmF0ZWQgd2l0aCAib3VyIiBwYWdlIGJlaW5nIGRpc3BsYXllZCwgb3IgdGhlIGVkaXRvciBpdHNlbGYKKwkJCS8vIGlzIGFjdGl2YXRlZC4gV2Ugc2tpbSB0aHJvdWdoIHRoZSBwb3NzaWJpbGl0aWVzIGJlbG93LCBpZ25vcmluZworCQkJLy8gYW55IG90aGVyIHBvc3NpYmlsaXRpZXMuCisKKwkJCS8vIElzIHRoZSBjb250ZW50IG91dGxpbmUgdmlldyBiZWluZyBhY3RpdmF0ZWQ/CisJCQlpZiAocGFydCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSB7CisJCQkJLy8gWWVzCisJCQkJLy8gSXMgdGhlIGN1cnJlbnQgcGFnZSBpbiB0aGUgQ29udGVudCBPdXRsaW5lIHZpZXcgb3VyIHBhZ2U/CisJCQkJLy8gaWYgKCgoQ29udGVudE91dGxpbmUpIHBhcnQpLmdldEN1cnJlbnRQYWdlKCkgPT0KKwkJCQkvLyBjb250ZW50T3V0bGluZVBhZ2UpIHsKKwkJCQkvLyAvLyBZZXMKKwkJCQkvLyBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcigKKwkJCQkvLyBJZGVudGlmaWFibGVFZGl0b3IudGhpcyk7CisJCQkJLy8gc2V0Q3VycmVudFZpZXdlcihjb250ZW50T3V0bGluZVZpZXdlcik7CisJCQkJLy8gfSAvLyBpZiBvdXIgb3V0bGluZSBwYWdlCisKKwkJCX0gLy8gaWYgY29udGVudCBvdXRsaW5lIHZpZXcgYWN0aXZhdGVkCisJCQkvLyBJcyB0aGUgY3VycmVudCBwcm9wZXJ0eSBzaGVldCB2aWV3IGJlaW5nIGFjdGl2YXRlZD8KKwkJCWVsc2UgaWYgKHBhcnQgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSB7CisJCQkJLy8gWWVzCisJCQkJLy8gSXMgdGhlIGN1cnJlbnQgcGFnZSBpbiB0aGUgcHJvcGVydHkgdmlldyBvdXIgcGFnZT8KKwkJCQkvLyBpZiAoKChQcm9wZXJ0eVNoZWV0KSBwYXJ0KS5nZXRDdXJyZW50UGFnZSgpID09CisJCQkJLy8gcHJvcGVydHlTaGVldFBhZ2UpIHsKKwkJCQkvLyAvLyBZZXMKKwkJCQkvLyBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcigKKwkJCQkvLyBJZGVudGlmYWJsZUVkaXRvci50aGlzKTsKKwkJCQkvLyBoYW5kbGVBY3RpdmF0ZSgpOworCQkJCS8vIH0gLy8gaWYgb3VyIHByb3BlcnR5IHBhZ2UKKwkJCX0gLy8gaWYgcHJvcGVydHkgc2hlZXQgdmlldworCQkJLy8gSXMgdGhpcyBlZGl0b3IgYmVpbmcgYWN0aXZhdGVkPworCQkJZWxzZSBpZiAocGFydCA9PSBJZGVudGlmaWFibGVFZGl0b3IudGhpcykgeworCQkJCS8vIFllcworCQkJCWhhbmRsZUFjdGl2YXRlKCk7CisJCQl9IC8vIGlmCisKKwkJfSAvLyBwYXJ0QWN0aXZhdGVkCisKKwkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7CisJCQkvLyBJZ25vcmUKKwkJfQorCisJCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgeworCQkJLy8gSWdub3JlCisJCX0KKworCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgeworCQkJLy8gSWdub3JlCisJCX0KKworCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKKwkJCS8vIElnbm9yZQorCQl9CisJfTsgLy8gcGFydExpc3RlbmVyCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB7QGxpbmsgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn0gZm9yIHRoZSBlZGl0b3IuIEl0IGlzCisJICogYWx3YXlzIGxpc3RlbmluZyB0byB0aGUge0BsaW5rIFZpZXdlcn0gcmVmZXJlbmNlZCBieQorCSAqIHtAbGluayAjY3VycmVudFZpZXdlcn0uIFRoZSBtZXRob2Qge0BsaW5rICNzZXRDdXJyZW50Vmlld2VyKFZpZXdlcil9CisJICogbWFpbnRhaW5zIHRoZSBhc3NvY2lhdGlvbi4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQlzZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQl9CisJfTsgLy8gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCisKKwkvKioKKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfXMgdGhhdCBhcmUKKwkgKiBsaXN0ZW5pbmcgdG8gdGhpcyBlZGl0b3IuCisJICovCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKKworCS8qKgorCSAqIFRoZSBlZGl0b3IncyBjdXJyZW50IHNlbGVjdGlvbi4KKwkgKiAKKwkgKiBAc2Uge0BsaW5rICNzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbil9CisJICogQHNlZSAjZ2V0U2VsZWN0aW9uKCkKKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBlZGl0b3JTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOworCisJLyoqCisJICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGVFZGl0b3IoKSB7CisJCXN1cGVyKCk7CisJCWFkYXB0ZXJGYWN0b3J5ID0gY3JlYXRlQWRhcHRlckZhY3RvcnkoKTsKKwkJZWRpdGluZ0RvbWFpbiA9IGNyZWF0ZUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnkpOworCX0gLy8gSWRlbnRpZmlhYmxlRWRpdG9yCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgQWRhcHRlckZhY3Rvcnl9IHRoYXQgd2lsbCBwcm92aWRlIHRoZQorCSAqICAgICAgICAge0BsaW5rIEl0ZW1Qcm92aWRlcn1zIG5lZWRlZCB0byBhZGFwdCB0aGUge0BsaW5rIElkZW50aWZpYWJsZX1zCisJICogICAgICAgICBmb3IgdGhlIGVkaXRvci4KKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpIHsKKwkJZmluYWwgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSByZXRWYWx1ZSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KAorCQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkuRGVzY3JpcHRvci5SZWdpc3RyeS5JTlNUQU5DRSk7CisJCXJldFZhbHVlLmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlyZXRWYWx1ZS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCXJldFZhbHVlLmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBFeHBlcmltZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCXJldFZhbHVlLmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBHcmFwaEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOworCQlyZXRWYWx1ZS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJcmV0VmFsdWUuYWRkQWRhcHRlckZhY3RvcnkobmV3IFNjZW5hcmlvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCXJldFZhbHVlLmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBTZXF1ZW5jZXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKwkJcmV0VmFsdWUuYWRkQWRhcHRlckZhY3RvcnkobmV3IEVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCXJldFZhbHVlLmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUFkYXB0ZXJGYWN0b3J5CisKKwkvKioKKwkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgQWRhcHRlckZhY3Rvcnl9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUKKwkgKiAgICAgICAgICAgIHtAbGluayBFZGl0aW5nRG9tYWlufS4KKwkgKiBAcmV0dXJuIGFuIHtAbGluayBFZGl0aW5nRG9tYWlufQorCSAqLworCXByaXZhdGUgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGNyZWF0ZUVkaXRpbmdEb21haW4oCisJCQlmaW5hbCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworCisJCS8vIENyZWF0ZSB0aGUgY29tbWFuZCBzdGFjayBmb3IgdGhlIGVkaXQgY29tbWFuZHMKKwkJZmluYWwgQmFzaWNDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrID0gbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCk7CisKKwkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gdGhlIGNvbW1hbmQgc3RhY2sgc28gd2UgY2FuIHRyYWNrIHdoaWNoIG9iamVjdHMgYXJlCisJCS8vIGNoYW5nZWQgYnkgdGhlIGNvbW1hbmQgYW5kIHRoZW4gdXNlIHRoZW0gYXMgdGhlIHNlbGVjdGlvbi4KKworCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIobmV3IENvbW1hbmRTdGFja0xpc3RlbmVyKCkgeworCQkJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQorCQkJcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgeworCQkJCWdldENvbnRhaW5lcigpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkvLyBUZWxsIGFueSBsaXN0ZW5lcnMgdGhhdCB0aGUgZWRpdG9yIGlzIG5vdyAiZGlydHkiCisJCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7CisKKwkJCQkJCWZpbmFsIENvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaykgZXZlbnQKKwkJCQkJCQkJLmdldFNvdXJjZSgpKS5nZXRNb3N0UmVjZW50Q29tbWFuZCgpOworCQkJCQkJLy8gV2FzIHRoZXJlIGEgY29tbWFuZD8KKwkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCAhPSBudWxsKSB7CisJCQkJCQkJLy8gWWVzCisJCQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQKKwkJCQkJCQkJCS5nZXRBZmZlY3RlZE9iamVjdHMoKSk7CisJCQkJCQl9IC8vIGlmIGNvbW1hbmQKKworCQkJCQkJLy8gUmVmcmVzaCB0aGUgcHJvcGVydHkgc2hlZXQKKwkJCQkJCS8vIGlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7CisJCQkJCQkvLyAvLyBZZXMKKwkJCQkJCS8vCQkJCQkJCQorCQkJCQkJLy8gfSAvLyBpZgorCQkJCQl9IC8vIHJ1bgorCisJCQkJCXByaXZhdGUgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcigKKwkJCQkJCQlmaW5hbCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgeworCQkJCQkJLy8gQW55dGhpbmcgdGhlcmU/CisJCQkJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLmlzRW1wdHkoKSA9PSBmYWxzZSkgeworCQkJCQkJCS8vIFllcworCQkJCQkJCW5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgeworCQkJCQkJCQkJCS8vIFllcworCQkJCQkJCQkJCWN1cnJlbnRWaWV3ZXIKKwkJCQkJCQkJCQkJCS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCisJCQkJCQkJCQkJCQkJCXNlbGVjdGlvbikpOworCQkJCQkJCQkJfSAvLyBpZgorCQkJCQkJCQl9IC8vIHJ1bgorCQkJCQkJCX0ucnVuKCk7CisJCQkJCQl9IC8vIGlmCisJCQkJCX0gLy8gc2V0U2VsZWN0aW9uVG9WaWV3ZXIKKwkJCQl9KTsKKwkJCX0KKwkJfSk7CisKKwkJcmV0dXJuIG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywKKwkJCQluZXcgSGFzaE1hcDxSZXNvdXJjZSwgQm9vbGVhbj4oKSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZCgKKwkJCQkJCQlDbGFzczw/IGV4dGVuZHMgQ29tbWFuZD4gY29tbWFuZENsYXNzLAorCQkJCQkJCUNvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgeworCQkJCQkJaWYgKGNvbW1hbmRDbGFzcyA9PSBEZWxldGVDb21tYW5kLmNsYXNzKSB7CisJCQkJCQkJLy8gWWVzCisvLwkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzcz0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjdXJyZW50Vmlld2VyLmdldFNlbGVjdGlvbigpOworLy8JCQkJCQkJCisvLwkJCQkJCQlJVHJlZVNlbGVjdGlvbiBvYmogPSAoSVRyZWVTZWxlY3Rpb24pICBlZGl0b3JTZWxlY3Rpb247CisvLwkJCQkJCQlUcmVlUGF0aFtdIHBhdGhzID0gb2JqLmdldFBhdGhzKCk7CisJCQkJCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbW1hbmQoY29tbWFuZENsYXNzLCBjb21tYW5kUGFyYW1ldGVyKTsKKwkJCQkJCX0gLy8gaWYgCisJCQkJCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29tbWFuZChjb21tYW5kQ2xhc3MsIGNvbW1hbmRQYXJhbWV0ZXIpOworCQkJCQl9fTsKKwl9IC8vIGNyZWF0ZUVkaXRpbmdEb21haW4KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsCisJICogICAgICBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKKwkJc2V0U2l0ZShzaXRlKTsKKwkJc2V0SW5wdXQoaW5wdXQpOworCQlzZXRQYXJ0TmFtZShpbnB1dC5nZXROYW1lKCkpOworCQlzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKHRoaXMpOworCQlzaXRlLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKKwkJLy8gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoCisJCS8vIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKKwl9IC8vIGluaXQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I2NyZWF0ZVBhZ2VzKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpIHsKKwkJLy8gTG9hZCB0aGUgSWRlbnRpZmlhYmxlIHRvIGJlIGVkaXRlZAorCQlsb2FkSWRlbnRpZmlhYmxlKCk7CisKKwkJLy8gRGlkIGFueXRoaW5nIGFjdHVhbGx5IGdldCBsb2FkZWQ/CisJCWlmIChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpID09IGZhbHNlCisJCQkJJiYgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKQorCQkJCQkJLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpID09IGZhbHNlKSB7CisJCQkvLyBZZXMKKwkJCS8vIFdlIGNyZWF0ZSBhIHBhZ2UgdGhhdCBpcyBhIHRyZWUgdmlldyBvZiB0aGUgSWRlbnRpZmlhYmxlCisJCQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShnZXRDb250YWluZXIoKSwgU1dULk1VTFRJKTsKKwkJCWZpbmFsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOworCQkJc2V0Q3VycmVudFZpZXdlcih0cmVlVmlld2VyKTsKKworCQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAorCQkJCQlhZGFwdGVyRmFjdG9yeSkpOworCQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCisJCQkJCWFkYXB0ZXJGYWN0b3J5KSk7CisJCQl0cmVlVmlld2VyLnNldElucHV0KGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKQorCQkJCQkuZ2V0KDApKTsKKwkJCS8vIHRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7CisKKwkJCW5ldyBBZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3IodHJlZVZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsKKworCQkJY3JlYXRlQ29udGV4dE1lbnUodHJlZVZpZXdlcik7CisKKwkJCS8vIFN1cHBvcnQgZm9yIGRyYWdnaW5nIGFuZCBkcm9wcGluZyBJZGVudGlmaWFibGVzCisJCQlhZGREcmFnTkRyb3BTdXBwb3J0KHRyZWVWaWV3ZXIpOworCQkJCisJCQlmaW5hbCBpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh0cmVlKTsKKwkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgInRyZWUgZWRpdG9yIik7CisKKwkJCS8vIE9rIG5vdyBpdCdzIHRpbWUgdG8gY3JlYXRlIGFuZCBhZGQgYW55IHBhZ2VzIHRoYXQgYXJlIHNwZWNpZmljIHRvCisJCQkvLyB0aGUgSWRlbnRpZmlhYmxlIC4KKwkJCWNyZWF0ZUlkZW50aWZpYWJsZVNwZWNpZmljUGFnZXMoKTsKKworCQkJLy8gU3dpdGNoIHRvIHRoZSBhY3RpdmUgcGFnZS4KKwkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCXNldEFjdGl2ZVBhZ2UoMCk7CisJCQkJfQorCQkJfSk7CisJCX0gLy8gaWYKKwl9IC8vIGNyZWF0ZVBhZ2VzCisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBsb2FkcyBhIHJlc291cmNlIGludG8gdGhlIGVkaXRvcidzIHtAbGluayBFZGl0aW5nRG9tYWlufQorCSAqIHtAbGluayBSZXNvdXJjZVNldH0uCisJICogPHA+CisJICogVGhpcyBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgYXMgbWV0aG9kICJjcmVhdGVNb2RlbCIgdGhlIGdlbmVyYXRlZCBjb2RlCisJICovCisJcHJpdmF0ZSB2b2lkIGxvYWRJZGVudGlmaWFibGUoKSB7CisJCWZpbmFsIFVSSSByZXNvdXJjZVVSSSA9IEVkaXRVSVV0aWwuZ2V0VVJJKGdldEVkaXRvcklucHV0KCkpOworCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCS8vIEZpcnN0IHdlIHRyeSB0byBkZW1hbmQgbG9hZCB0aGUgcmVzb3VyY2UgLT4gdHJ1ZQorCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksCisJCQkJCXRydWUpOworCQl9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworCQkJLy8gUmVtZW1iZXIgdGhlIGV4Y2VwdGlvbgorCQkJZXhjZXB0aW9uID0gZTsKKwkJCS8vIFRoYXQgZGlkbid0IHdvcmssIHNvIGRvbid0IGRlbWFuZCBsb2FkIHRoZSByZXNvdXJjZSAtPiBmYWxzZQorCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksCisJCQkJCWZhbHNlKTsKKwkJfSAvLyBjYXRjaCBFeGNlcHRpb24KKwkJLy8gTmVlZCBjb2RlIGhlcmUgdG8gYW5hbHl6ZSB0aGUgZXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBvbmUuIHNlZQorCQkvLyBjcmVhdGVNb2RlbCgpCisJfSAvLyBsb2FkSWRlbnRpZmlhYmxlCisKKwkvKioKKwkgKiBUaGlzIG1ha2VzIHN1cmUgdGhhdCBvbmUgY29udGVudCB7QGxpbmsgVmlld2VyfSwgZWl0aGVyIHRoZSBvbmUgZm9yIHRoZQorCSAqIGN1cnJlbnQgcGFnZSBpbiB0aGUgZWRpdG9yLCBvciB0aGUgb25lIGluIHRoZSBvdXRsaW5lIHZpZXcsIGlmIGl0IGhhcworCSAqIGZvY3VzLCBpcyB0aGUgY3VycmVudCBvbmUuIEJhc2ljYWxseSwgdGhpcyBjb2RlIG1haW50YWlucyB3aGljaAorCSAqIHtAbGluayBWaWV3ZXJ9IHtAbGluayAjc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfSBpcyBsaXN0ZW5pbmcgdG8uCisJICogCisJICogQHBhcmFtIG5ld1ZpZXdlcgorCSAqICAgICAgICAgICAgdGhlIG5ldyB7QGxpbmsgVmlld2VyfQorCSAqLworCXByaXZhdGUgdm9pZCBzZXRDdXJyZW50Vmlld2VyKFZpZXdlciBuZXdWaWV3ZXIpIHsKKwkJLy8gSXMgdGhlIG5ldyB2aWV3ZXIgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgb25lPworCQlpZiAobmV3Vmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKKwkJCS8vIFllcworCQkJLy8gSXMgdGhlcmUgYSBjdXJyZW50IChpLmUuIG9sZCkgdmlld2VyPworCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCS8vIFdlJ3JlIG5vdCBsaXN0ZW5pbmcgdG8gaXQgYW55IG1vcmUKKwkJCQljdXJyZW50Vmlld2VyCisJCQkJCQkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7CisJCQl9IC8vIGlmCisKKwkJCS8vIElzIHRoZXJlIGEgbmV3IHZpZXdlcj8KKwkJCWlmIChuZXdWaWV3ZXIgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCS8vIFdlJ3JlIGxpc3RlbmluZyB0byBpdCBub3cKKwkJCQluZXdWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7CisJCQl9IC8vIGlmCisKKwkJCWN1cnJlbnRWaWV3ZXIgPSBuZXdWaWV3ZXI7CisKKwkJCS8vIE5vdyB3ZSBuZWVkIHRvIHNldCB0aGUgc2VsZWN0aW9uIGluIHRoZSBlZGl0b3IgYmFzZWQgb24gdGhlIG5ldworCQkJLy8gdmlld2VyJ3MgY3VycmVudCBzZWxlY3Rpb24uCisJCQlzZXRTZWxlY3Rpb24obmV3Vmlld2VyID09IG51bGwgPyBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZCisJCQkJCTogbmV3Vmlld2VyLmdldFNlbGVjdGlvbigpKTsKKwkJfSAvLyBpZiBkaWZmZXJlbnQgdmlld2VyCisJfSAvLyBzZXRDdXJyZW50Vmlld2VyCisKKwlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGV4dE1lbnUoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKKwkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOworCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOworCisJCS8vIEkgdGhpbmsgdGhpcyBpcyBjbGVhcmluZyB0aGUgbWVudSBpbiBwcmVwYXJhdGlvbiBmb3IgYmVpbmcgcmVjcmVhdGVkCisJCS8vIGp1c3QgYmVmb3JlIGl0IGlzIGRpc3BsYXllZC4KKwkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOworCisJCS8vIFJlZ2lzdGVyIHRvIGhhdmUgb3VyIG1lbnVBYm91dFRvU2hvdygpIG1ldGhvZCBiZSBjYWxsZWQganVzdCBiZWZvcmUKKwkJLy8gdGhlIGNvbnRleHQgbWVudSBpcyBkaXNwbGF5ZWQuCisJCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKKworCQlmaW5hbCBNZW51IG1lbnUgPSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKKwkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOworCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgdmlld2VyKTsKKworCisJfSAvLyBjcmVhdGVDb250ZXh0TWVudQorCisJcHJpdmF0ZSB2b2lkIGFkZERyYWdORHJvcFN1cHBvcnQoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKKwkJZmluYWwgaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTks7CisJCWZpbmFsIFRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geworCQkJCUxvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwgVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKKwkJdmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyYWdBZGFwdGVyKAorCQkJCXZpZXdlcikpOworCQl2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLAorCisJCW5ldyBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKKwkJCQkvLyBXZSBtYWtlIGFsbCBvcGVyYXRpb25zIGEgZHJvcCBsaW5rCisJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTElOSzsKKwkJCQlzdXBlci5kcmFnRW50ZXIoZXZlbnQpOworCQkJfQorCisJCQkvKioKKwkJCSAqIFdlIG92ZXJyaWRlIHRoZSBzdXBlciBtZXRob2QgYmVjYXVzZSB0aGUgSWRlbnRpZmlhYmxlUGx1Z2luVmlldworCQkJICogcHJvdmlkZXMgYSBDb2xsZWN0aW9ucyBvZiBJZGVudGlmaWFibGVzLCByYXRoZXIgdGhhbiBhbgorCQkJICogSVN0cnVjdHVyZVNlbGN0aW9uIG9mIElkZW50aWZpYWJsZURlbGVnYXRlcy4KKwkJCSAqLworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjw/PiBleHRyYWN0RHJhZ1NvdXJjZShPYmplY3Qgb2JqZWN0KSB7CisJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKKwkJCQkJLy8gWWVzCisJCQkJCXJldHVybiAoQ29sbGVjdGlvbjw/Pikgb2JqZWN0OworCQkJCX0gLy8gaWYKKwkJCQlyZXR1cm4gc3VwZXIuZXh0cmFjdERyYWdTb3VyY2Uob2JqZWN0KTsKKwkJCX0KKwkJfSk7CisJfSAvLyBhZGREcmFnTkRyb3BTdXBwb3J0CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyI21lbnVBYm91dFRvU2hvdyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQorCSAqLworCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJKChJTWVudUxpc3RlbmVyKSBnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSkKKwkJCQkubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKKwl9IC8vIG1lbnVBYm91dFRvU2hvdworCisJcHJvdGVjdGVkIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpIHsKKwkJcmV0dXJuIChFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IpIGdldEVkaXRvclNpdGUoKQorCQkJCS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOworCX0gLy8gZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IKKworCS8qKgorCSAqIFRoaXMgaGFuZGxlcyB0aGUgYWN0aXZhdGlvbiBvZiB0aGUgZWRpdG9yIG9yIGl0J3MgYXNzb2NpYXRlZCBjb250ZW50CisJICogb3V0bGluZSBvciBwcm9wZXJ0eSBzaGVldCB2aWV3LgorCSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFjdGl2YXRlKCkgeworCQkvLyBSZWNvbXB1dGUgdGhlIHJlYWQgb25seSBzdGF0ZT8KKwkJaWYgKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpLmNsZWFyKCk7CisKKwkJCS8vIFJlZnJlc2ggYW55IGFjdGlvbnMgdGhhdCBtYXkgYmVjb21lIGVuYWJsZWQgb3IgZGlzYWJsZWQKKwkJCXNldFNlbGVjdGlvbihnZXRTZWxlY3Rpb24oKSk7CisJCX0gLy8gaWYKKworCQkvLyBUaGlzIGlzIG5vdCBmaW5pc2hlZCB5ZXQsIHRoZSByZW1vdmVkIGFuZCBjaGFuZ2VkIHJlc291cmNlcyBhcmUgbm90CisJCS8vIGluaXRpYWxpemVkLgorCX0gLy8gaGFuZGxlQWN0aXZhdGUKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgZXh0ZW5kaW5nIGNsYXNzZXMgc28gdGhhdCB0aGV5IGNhbiBwcm92aWRlIGEKKwkgKiBwYWdlIHRvIHRoZSBlZGl0b3IgdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB7QGxpbmsgSWRlbnRpZmlhYmxlfQorCSAqIHRoZXkgYXJlIGVkaXRpbmcuCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlSWRlbnRpZmlhYmxlU3BlY2lmaWNQYWdlcygpIHsKKwkJLy8gTm90aGluZworCX0gLy8gY3JlYXRlSWRlbnRpZmlhYmxlU3BlY2lmaWNQYWdlcworCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlciNnZXRFZGl0aW5nRG9tYWluKCkKKwkgKi8KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgeworCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZG9TYXZlKAorCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQl0cnkgeworCQkJLy8gRmlyc3QgInRydWUiIC0+IGZvcmssIHNlY29uZCAiZmFsc2UiIC0+IGNhbmNlbGFibGUKKwkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpLnJ1bih0cnVlLCBmYWxzZSwKKwkJCQkJc2F2ZU9wZXJhdGlvbik7CisJCQkoKEJhc2ljQ29tbWFuZFN0YWNrKSBlZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5zYXZlSXNEb25lKCk7CisJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7CisJCX0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlByb2JsZW0gc2F2aW5nIiwgZSk7CisJCX0gLy8gY2F0Y2ggRXhjZXB0aW9uCisJfSAvLyBkb1NhdmUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2RvU2F2ZUFzKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKKwkJZmluYWwgU2F2ZUFzRGlhbG9nIHNhdmVBc0RpYWxvZyA9IG5ldyBTYXZlQXNEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOworCQlzYXZlQXNEaWFsb2cub3BlbigpOworCQlmaW5hbCBJUGF0aCBwYXRoID0gc2F2ZUFzRGlhbG9nLmdldFJlc3VsdCgpOworCQkvLyBEaWQgd2UgZ2V0IGEgcGF0aD8KKwkJaWYgKHBhdGggIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKQorCQkJCQkuZ2V0RmlsZShwYXRoKTsKKwkJCS8vIERpZCB3ZSBnZXQgYSB2YWxpZCBmaWxlPworCQkJaWYgKGZpbGUgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCWRvU2F2ZUFzKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKQorCQkJCQkJLnRvU3RyaW5nKCksIHRydWUpLCBuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpKTsKKwkJCX0gLy8gaWYKKwkJfSAvLyBpZgorCisJfSAvLyBkb1NhdmVBcworCisJcHJpdmF0ZSB2b2lkIGRvU2F2ZUFzKGZpbmFsIFVSSSB1cmksIGZpbmFsIEZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQpIHsKKwkJLy8gVGhlIFVSSSBvZiB0aGUgcmVzb3VyY2UgaGFzIGNoYW5nZWQsIHVwZGF0ZQorCQkoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSkuc2V0VVJJKHVyaSk7CisJCS8vIFNldCB0aGUgZWRpdG9yJ3MgaW5wdXQgdG8gdGhlIG5ldyBGaWxlRWRpdG9ySW5wdXQKKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGZpbGVFZGl0b3JJbnB1dCk7CisJCXNldFBhcnROYW1lKGZpbGVFZGl0b3JJbnB1dC5nZXROYW1lKCkpOworCisJCWZpbmFsIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciBlZGFjID0gKEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcikgZ2V0RWRpdG9yU2l0ZSgpCisJCQkJLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7CisKKwkJZmluYWwgSVN0YXR1c0xpbmVNYW5hZ2VyIGlzbG0gPSBlZGFjLmdldEFjdGlvbkJhcnMoKQorCQkJCS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOworCisJCS8vIEdldCBhIHByb2dyZXNzIGJhciBmb3IgdGhlIHNhdmUuLi4uCisJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0gaXNsbSAhPSBudWxsID8gaXNsbQorCQkJCS5nZXRQcm9ncmVzc01vbml0b3IoKSA6IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisKKwkJLy8gTm93IHNhdmUuLi4KKwkJZG9TYXZlKHByb2dyZXNzTW9uaXRvcik7CisJfSAvLyBkb1NhdmVBcworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7CisJCXJldHVybiB0cnVlOworCX0gLy8gaXNTYXZlQXNBbGxvd2VkCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2FkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCisJICovCisJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCisJCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0bworCSAqIHJldHVybiB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjZ2V0U2VsZWN0aW9uKCkKKwkgKi8KKwlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7CisJCXJldHVybiBlZGl0b3JTZWxlY3Rpb247CisJfSAvLyBnZXRTZWxlY3Rpb24KKworCS8qKgorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvCisJICogc2V0IHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uIENhbGxpbmcgdGhpcyByZXN1bHQgd2lsbCBub3RpZnkgdGhlCisJICogbGlzdGVuZXJzLgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjc2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJZWRpdG9yU2VsZWN0aW9uID0gc2VsZWN0aW9uOworCisJCWZvciAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA6IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMpIHsKKwkJCWxpc3RlbmVyCisJCQkJCS5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7CisJCX0gLy8gZm9yIGVhY2ggSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgorCQkvLyBzZXRTdGF0dXNMaW5lTWFuYWdlcihzZWxlY3Rpb24pOworCX0gLy8gc2V0U2VsZWN0aW9uCisKK30gLy8gSWRlbnRpZmlhYmxlRWRpdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2VkaXRvcnMvU2NlbmFyaW9FZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvZWRpdG9ycy9TY2VuYXJpb0VkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ODQwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2VkaXRvcnMvU2NlbmFyaW9FZGl0b3IuamF2YQpAQCAtMCwwICsxLDMwIEBACisvLyBTY2VuYXJpb0VkaXRvci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZWRpdG9yczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhbiB7QGxpbmsgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0fSB0aGF0IGVkaXRzCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvfXMuCisgKi8KK3B1YmxpYyBjbGFzcyBTY2VuYXJpb0VkaXRvciBleHRlbmRzIElkZW50aWZpYWJsZUVkaXRvciB7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuZWRpdG9ycy5JZGVudGlmaWFibGVFZGl0b3IjY3JlYXRlSWRlbnRpZmlhYmxlU3BlY2lmaWNQYWdlcygpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlSWRlbnRpZmlhYmxlU3BlY2lmaWNQYWdlcygpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlzdXBlci5jcmVhdGVJZGVudGlmaWFibGVTcGVjaWZpY1BhZ2VzKCk7CisJfQorCit9IC8vIFNjZW5hcmlvRWRpdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2hhbmRsZXJzL0RlbGV0ZUhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvaGFuZGxlcnMvRGVsZXRlSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOGRiMmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2hhbmRsZXJzL0RlbGV0ZUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLy8gU1RFTUV4ZWN1dGlvbkNvbW1hbmRIYW5kbGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5oYW5kbGVyczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLmZpbGUuRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLmZpbGUuRmlsZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3Jlci5JZGVudGlmaWFibGVUcmVlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRoZSB0b3AtbGV2ZWwge0BsaW5rIElIYW5kbGVyfSBmb3IgdGhlIFNURU0gRGVsZXRlIGNvbW1hbmQKKyAqIGhhbmRsZXJzIAorICovCitwdWJsaWMgY2xhc3MgRGVsZXRlSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlcgorCQlpbXBsZW1lbnRzIElIYW5kbGVyIHsKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgZXhlY3V0aW9uRXZlbnQpCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKworCQkKKwkJZmluYWwgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBIYW5kbGVyVXRpbAorCQkJCS5nZXRDdXJyZW50U2VsZWN0aW9uQ2hlY2tlZChleGVjdXRpb25FdmVudCk7CisJCQorCQkvLyBTdHJ1Y3R1cmVkIFNlbGVjdGlvbj8KKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCQorCQkJLy8gWWVzCisJCQkvLyBJdGVyYXRlIHRocm91Z2ggZXZlcnl0aGluZyB0aGF0J3MgaW4gdGhlIHNlbGVjdGlvbiBhbmQgcHV0IGVhY2gKKwkJCS8vIG9iamVjdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBjb2xsZWN0aW9uLgorCQkJZm9yIChmaW5hbCBPYmplY3Qgb2JqIDogKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvTGlzdCgpKSB7CisJCQkJLy8gSUV4ZWN1dGFibGUgZXhlY3V0YWJsZSA9IChJRXhlY3V0YWJsZSkgRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJLy8gLmFkYXB0KG9iaiwgSUV4ZWN1dGFibGUuY2xhc3MpOworCQkJCQorCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBQbGF0Zm9ybQorCQkJCS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIob2JqLCBGaWxlLmNsYXNzKTsgCisJCQorCisJCQkJCisJCQkJLy8gV2VyZSB3ZSBzdWNjZXNzZnVsIGluIGFkYXB0aW5nPworCQkJCWlmIChmaWxlICE9IG51bGwpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWRvaXQoZmlsZSk7CisJCQkJfSAvLyBpZgorCQkJCWVsc2UgeworCQkJCQkvLyBJbnRlcm5hbCBlcnJvcgorCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoCisJCQkJCQkJIlNURU0gSW50ZXJuYWwgZXJyb3IgZGVsZXRlIGNvbW1hbmQgYXBwbGllZCB0byBcIiIKKwkJCQkJCQkJCSsgb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIlwiIiwgbnVsbCk7CisJCQkJfQorCQkJfSAvLyBmb3IgZWFjaCBzZWxlY3Rpb24KKwkJCQorCQkJCisJCX0gLy8gaWYgU3RydWN0dXJlZFNlbGVjdGlvbgorCisJCWlmKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFRyZWVTZWxlY3Rpb24pIHsKKwkJCVRyZWVTZWxlY3Rpb24gdHMgPSAoVHJlZVNlbGVjdGlvbilzZWxlY3Rpb247CisJCQlUcmVlUGF0aFtdIHBhdGhzID0gIHRzLmdldFBhdGhzKCk7CisJCQlpZihwYXRocy5sZW5ndGggPiAwKSB7CisJCQkJVHJlZVBhdGggcGFyZW50ID0gcGF0aHNbMF0uZ2V0UGFyZW50UGF0aCgpOworCQkJCU9iamVjdCBwYXJlbnRTZWcgPSBwYXJlbnQuZ2V0TGFzdFNlZ21lbnQoKTsKKwkJCQlpZihwYXJlbnRTZWcgIT0gbnVsbCkgeworCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKKwkJCQkJaWYocGFyZW50U2VnIGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlVHJlZU5vZGUpIHsgCisJCQkJCQlwcm9qZWN0ID0oKElkZW50aWZpYWJsZVRyZWVOb2RlKXBhcmVudFNlZykuZ2V0UHJvamVjdCgpOworCQkJCQl9IGlmKHBhcmVudFNlZyBpbnN0YW5jZW9mIElQcm9qZWN0KSBwcm9qZWN0ID0gKElQcm9qZWN0KXBhcmVudFNlZzsKKwkJCQkJCisJCQkJCXRyeSB7CisJCQkJCQlwcm9qZWN0LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOworCQkJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0gLy8gZXhlY3V0ZQorCisJLyoqCisJICogRGVsZXRlIHRoZSBpZGVudGlmaWFibGUKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkb2l0KEZpbGUgZmlsZSkgeworCQl0cnkgeworCQkJZmlsZS5kZWxldGUoKTsKKwkJfSBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcihpb2UuZ2V0TWVzc2FnZSgpLCBpb2UpOworCQl9CisJfQorfSAvLyAgRGVsZXRlSGFuZGxlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9oYW5kbGVycy9FZGl0b3JBY3Rpb25Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9oYW5kbGVycy9FZGl0b3JBY3Rpb25Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MWI1ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2hhbmRsZXJzL0VkaXRvckFjdGlvblByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzNTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5oYW5kbGVyczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BYnN0cmFjdEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkFjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vblZpZXdlclNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25WaWV3ZXJXb3JrYmVuY2hTaXRlOworCisvKioKKyAqIHtAbGluayBBY3Rpb259IHRoYXQgb3BlbnMgdGhlIGVkaXRvciB3aGVuIGFuIHtAbGluayBJZGVudGlmaWFibGV9IGlzCisgKiBkb3VibGUtY2xpY2tlZCBpbiB0aGUgcHJvamVjdCBleHBsb3Jlci4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCitwdWJsaWMgY2xhc3MgRWRpdG9yQWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25BY3Rpb25Qcm92aWRlciB7CisKKwlJQWN0aW9uIG9wZW5BY3Rpb24gPSBudWxsOworCisJLyoqCisJICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBFZGl0b3JBY3Rpb25Qcm92aWRlcigpIHsKKwkJLy8gTm90aGluZworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkFjdGlvblByb3ZpZGVyI2luaXQob3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXQoSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGUgc2l0ZSkgeworCQlJQ29tbW9uVmlld2VyU2l0ZSBhU2l0ZSA9IHNpdGUuZ2V0Vmlld1NpdGUoKTsKKwkJaWYgKGFTaXRlIGluc3RhbmNlb2YgSUNvbW1vblZpZXdlcldvcmtiZW5jaFNpdGUpIHsKKwkJCUlDb21tb25WaWV3ZXJXb3JrYmVuY2hTaXRlIGN2d3MgPSAoSUNvbW1vblZpZXdlcldvcmtiZW5jaFNpdGUpIGFTaXRlOworCQkJb3BlbkFjdGlvbiA9IG5ldyBPcGVuSWRlbnRpZmlhYmxlQWN0aW9uKGN2d3MuZ2V0UGFnZSgpLCBjdndzCisJCQkJCS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKTsKKwkJfSAvLyBpZgorCX0gLy8gaW5pdAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwI2ZpbGxBY3Rpb25CYXJzKG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKKwkJaWYgKG9wZW5BY3Rpb24uaXNFbmFibGVkKCkpIHsKKwkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJQ29tbW9uQWN0aW9uQ29uc3RhbnRzLk9QRU4sCisJCQkJCW9wZW5BY3Rpb24pOworCQl9CisJfQorCisJLyoqCisJICogVGhlIHtAbGluayBBY3Rpb259IHRoYXQgb3BlbnMgYW4gZWRpdG9yIG9uIHRoZSBzZWxlY3RlZAorCSAqIHtAbGluayBJZGVudGlmaWFibGV9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgT3BlbklkZW50aWZpYWJsZUFjdGlvbiBleHRlbmRzIEFic3RyYWN0QWN0aW9uIGltcGxlbWVudHMKKwkJCUlBY3Rpb24geworCisJCXByaXZhdGUgZmluYWwgSVdvcmtiZW5jaFBhZ2UgcGFnZTsKKwkJcHJpdmF0ZSBmaW5hbCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7CisJCXByaXZhdGUgSWRlbnRpZmlhYmxlIHNlbGVjdGVkSWRlbnRpZmlhYmxlOworCisJCS8qKgorCQkgKiBDb25zdHJ1Y3RvcgorCQkgKiAKKwkJICogQHBhcmFtIHBhZ2UKKwkJICogQHBhcmFtIHNlbGVjdGlvblByb3ZpZGVyCisJCSAqLworCQlwdWJsaWMgT3BlbklkZW50aWZpYWJsZUFjdGlvbihJV29ya2JlbmNoUGFnZSBwYWdlLAorCQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikgeworCQkJdGhpcy5wYWdlID0gcGFnZTsKKwkJCXRoaXMuc2VsZWN0aW9uUHJvdmlkZXIgPSBzZWxlY3Rpb25Qcm92aWRlcjsKKwkJfSAvLyBPcGVuSWRlbnRpZmlhYmxlQWN0aW9uCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKKwkJICovCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCWZpbmFsIElQYXRoIHBhdGggPSBuZXcgUGF0aChzZWxlY3RlZElkZW50aWZpYWJsZS5nZXRVUkkoKQorCQkJCQkudG9QbGF0Zm9ybVN0cmluZyh0cnVlKSk7CisJCQlmaW5hbCBJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKQorCQkJCQkuZ2V0RmlsZShwYXRoKTsKKworCQkJLy8gRm91bmQgdGhlIGZpbGU/CisJCQlpZiAoZmlsZSAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJdHJ5IHsKKwkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSwgdHJ1ZSk7CisJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgeworCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlByb2JsZW0gb3BlbmluZyBlZGl0b3IiLCBlKTsKKwkJCQl9CisJCQl9IC8vIGlmIGZpbGUgZm91bmQKKwkJCWVsc2UgeworCQkJCUFjdGl2YXRvci5sb2dFcnJvcigiQ291bGQgbm90IGZpbmQgZmlsZSBcIiIgKyBwYXRoLnRvU3RyaW5nKCkKKwkJCQkJCSsgIlwiIiwgbnVsbCk7CisJCQl9CisKKwkJfSAvLyBydW4KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNpc0VuYWJsZWQoKQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworCQkJYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOworCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKKwkJCS8vIEFueXRoaW5nIHNlbGVjdGVkPworCQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7CisJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc1NlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOworCQkJCWlmIChzU2VsZWN0aW9uLnNpemUoKSA9PSAxCisJCQkJCQkmJiBzU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlKSB7CisJCQkJCS8vIFllcworCQkJCQlzZWxlY3RlZElkZW50aWZpYWJsZSA9IChJZGVudGlmaWFibGUpIHNTZWxlY3Rpb24KKwkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7CisJCQkJCXJldFZhbHVlID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gaXNFbmFibGVkCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0QWNjZWxlcmF0b3IoKQorCQkgKi8KKwkJcHVibGljIGludCBnZXRBY2NlbGVyYXRvcigpIHsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCkKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXREZXNjcmlwdGlvbigpCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigpCisJCSAqLworCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRIZWxwTGlzdGVuZXIoKQorCQkgKi8KKwkJcHVibGljIEhlbHBMaXN0ZW5lciBnZXRIZWxwTGlzdGVuZXIoKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldEhvdmVySW1hZ2VEZXNjcmlwdG9yKCkKKwkJICovCisJCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldElkKCkKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldEltYWdlRGVzY3JpcHRvcigpCisJCSAqLworCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0TWVudUNyZWF0b3IoKQorCQkgKi8KKwkJcHVibGljIElNZW51Q3JlYXRvciBnZXRNZW51Q3JlYXRvcigpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0U3R5bGUoKQorCQkgKi8KKwkJcHVibGljIGludCBnZXRTdHlsZSgpIHsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0VGV4dCgpCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldFRvb2xUaXBUZXh0KCkKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2lzQ2hlY2tlZCgpCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNpc0hhbmRsZWQoKQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaXNIYW5kbGVkKCkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuV2l0aEV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQorCQkgKi8KKwkJcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCQkvLyBOb3RoaW5nCisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRBY2NlbGVyYXRvcihpbnQpCisJCSAqLworCQlwdWJsaWMgdm9pZCBzZXRBY2NlbGVyYXRvcihpbnQga2V5Y29kZSkgeworCQkJLy8gTm90aGluZworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0QWN0aW9uRGVmaW5pdGlvbklkKGphdmEubGFuZy4KKwkJICogICAgICBTdHJpbmcpCisJCSAqLworCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25EZWZpbml0aW9uSWQoU3RyaW5nIGlkKSB7CisJCQkvLyBOb3RoaW5nCisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRDaGVja2VkKGJvb2xlYW4pCisJCSAqLworCQlwdWJsaWMgdm9pZCBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCkgeworCQkJLy8gTm90aGluZworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0RGVzY3JpcHRpb24oamF2YS5sYW5nLlN0cmluZykKKwkJICovCisJCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB0ZXh0KSB7CisJCQkvLyBOb3RoaW5nCisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihvcmcuZWNsaXBzZQorCQkgKiAgICAgIC5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IpCisJCSAqLworCQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IgbmV3SW1hZ2UpIHsKKwkJCS8vIE5vdGhpbmcKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEVuYWJsZWQoYm9vbGVhbikKKwkJICovCisJCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisJCQkvLyBOb3RoaW5nCisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRIZWxwTGlzdGVuZXIob3JnLmVjbGlwc2Uuc3d0LgorCQkgKiAgICAgIGV2ZW50cy5IZWxwTGlzdGVuZXIpCisJCSAqLworCQlwdWJsaWMgdm9pZCBzZXRIZWxwTGlzdGVuZXIoSGVscExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCQkvLyBOb3RoaW5nCisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IpCisJCSAqLworCQlwdWJsaWMgdm9pZCBzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IgbmV3SW1hZ2UpIHsKKwkJCS8vIE5vdGhpbmcKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldElkKGphdmEubGFuZy5TdHJpbmcpCisJCSAqLworCQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKKwkJCS8vIE5vdGhpbmcKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEltYWdlRGVzY3JpcHRvcihvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IpCisJCSAqLworCQlwdWJsaWMgdm9pZCBzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKSB7CisJCQkvLyBOb3RoaW5nCisJCX0KKworCQkvKioKKwkJICogQHBhcmFtIGNyZWF0b3IKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRNZW51Q3JlYXRvcihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yKQorCQkgKi8KKwkJcHVibGljIHZvaWQgc2V0TWVudUNyZWF0b3IoSU1lbnVDcmVhdG9yIGNyZWF0b3IpIHsKKwkJCS8vIE5vdGhpbmcKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldFRleHQoamF2YS5sYW5nLlN0cmluZykKKwkJICovCisJCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKKwkJCS8vIE5vdGhpbmcKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldFRvb2xUaXBUZXh0KGphdmEubGFuZy5TdHJpbmcpCisJCSAqLworCQlwdWJsaWMgdm9pZCBzZXRUb29sVGlwVGV4dChTdHJpbmcgdGV4dCkgeworCQkJLy8gTm90aGluZworCQl9CisKKwl9IC8vIE9wZW5JZGVudGlmaWFibGVBY3Rpb24KKworfSAvLyBFZGl0b3JBY3Rpb25Qcm92aWRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9oYW5kbGVycy9FeGVjdXRhYmxlUHJvcGVydHlUZXN0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvaGFuZGxlcnMvRXhlY3V0YWJsZVByb3BlcnR5VGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiNzA2ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvaGFuZGxlcnMvRXhlY3V0YWJsZVByb3BlcnR5VGVzdGVyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLy8gRXhlY3V0YWJsZVByb3BlcnR5VGVzdGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5oYW5kbGVyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuSVByb3BlcnR5VGVzdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBQcm9wZXJ0eVRlc3Rlcn0gZm9yIHtAbGluayBJRXhlY3V0YWJsZX1zIGluICJjb3JlCisgKiBleHByZXNzaW9ucyIuCisgKi8KK3B1YmxpYyBjbGFzcyBFeGVjdXRhYmxlUHJvcGVydHlUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlciBpbXBsZW1lbnRzCisJCUlQcm9wZXJ0eVRlc3RlciB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfSVNfUlVOTklORyA9ICJydW5uaW5nIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfSVNfU1RPUFBBQkxFID0gInN0b3BwYWJsZSI7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuSVByb3BlcnR5VGVzdGVyI3Rlc3QoamF2YS5sYW5nLk9iamVjdCwKKwkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSwgamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB0ZXN0KGZpbmFsIE9iamVjdCByZWNlaXZlciwgZmluYWwgU3RyaW5nIHByb3BlcnR5LAorCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQlmaW5hbCBPYmplY3RbXSBhcmdzLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJCWZpbmFsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB7CisJCQorCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisJCWlmIChyZWNlaXZlciBpbnN0YW5jZW9mIElFeGVjdXRhYmxlKSB7CisJCQkvLyBZZXMKKwkJCS8vIFJ1bm5hYmxlPworCQkJaWYgKFBST1BFUlRZX0lTX1JVTk5JTkcuZXF1YWxzKHByb3BlcnR5KSkgeworCQkJCS8vIFllcworCQkJCXJldFZhbHVlID0gKChJRXhlY3V0YWJsZSkgcmVjZWl2ZXIpLmlzUnVubmluZygpOworCQkJfSAvLyBpZiBydW5uYWJsZQorCQkJLy8gU3RvcHBhYmxlPworCQkJZWxzZSBpZiAoUFJPUEVSVFlfSVNfU1RPUFBBQkxFLmVxdWFscyhwcm9wZXJ0eSkpIHsKKwkJCQkvLyBZZXMKKwkJCQlyZXRWYWx1ZSA9ICgoSUV4ZWN1dGFibGUpIHJlY2VpdmVyKS5pc1N0b3BwYWJsZSgpOworCQkJfSAvLyBpZiAKKwkJfSAvLyBpZgorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHRlc3QKKworfSAvLyBFeGVjdXRhYmxlUHJvcGVydHlUZXN0ZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2hhbmRsZXJzL0lkZW50aWZpYWJsZURlbGVnYXRlUHJvcGVydHlUZXN0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvaGFuZGxlcnMvSWRlbnRpZmlhYmxlRGVsZWdhdGVQcm9wZXJ0eVRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ODA2ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2hhbmRsZXJzL0lkZW50aWZpYWJsZURlbGVnYXRlUHJvcGVydHlUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDczIEBACisvLyBSdW5uYWJsZUlkZW50aWZpYWJsZVByb3BlcnR5VGVzdGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5oYW5kbGVyczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5JZGVudGlmaWFibGVEZWxlZ2F0ZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIFByb3BlcnR5VGVzdGVyfSBmb3Ige0BsaW5rIElkZW50aWZpYWJsZURlbGVnYXRlfXMgaW4KKyAqICJjb3JlIGV4cHJlc3Npb25zIi4KKyAqLworcHVibGljIGNsYXNzIElkZW50aWZpYWJsZURlbGVnYXRlUHJvcGVydHlUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlciB7CisKKwkvLyBUaGlzIGNvZGUgaXNuJ3QgYmVpbmcgdXNlZCByaWdodCBub3csIGJ1dCBpdCBpcyBiZWluZyByZXRhaW5lZCBiZWNhdXNlIHdlCisJLy8gbWFueSB3YW50IHRvIHRlc3QgcHJvcGVydGllcyBvZiBJZGVudGlmaWFibGVEZWxlZ2F0ZXMgaW4gdGhlIGZ1dHVyZS4KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfSVNfUlVOTkFCTEUgPSAicnVubmFibGUiOworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLklQcm9wZXJ0eVRlc3RlciN0ZXN0KGphdmEubGFuZy5PYmplY3QsCisJICogCWphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSwgamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB0ZXN0KGZpbmFsIE9iamVjdCByZWNlaXZlciwgZmluYWwgU3RyaW5nIHByb3BlcnR5LAorCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIE9iamVjdFtdIGFyZ3MsCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOworCQlpZiAoSWRlbnRpZmlhYmxlRGVsZWdhdGUuY2xhc3MuZXF1YWxzKHJlY2VpdmVyKSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBJZGVudGlmaWFibGVEZWxlZ2F0ZSBpZCA9IChJZGVudGlmaWFibGVEZWxlZ2F0ZSkgcmVjZWl2ZXI7CisKKwkJCS8vIFJ1bm5hYmxlPworCQkJaWYgKFBST1BFUlRZX0lTX1JVTk5BQkxFLmVxdWFscyhwcm9wZXJ0eSkpIHsKKwkJCQkvLyBZZXMKKwkJCQkvLyBJcyB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGZvciBhIFNjZW5hcmlvPworCQkJCXJldFZhbHVlID0gaXNTY2VuYXJpb0NvbmZpZ3VyYXRpb25FbGVtZW50KGlkLmdldEZvcm1hdCgpKQorCQkJCQkJfHwgaXNFeHBlcmltZW50Q29uZmlndXJhdGlvbkVsZW1lbnQoaWQuZ2V0Rm9ybWF0KCkpOworCQkJfSAvLyBpZiBydW5uYWJsZQorCQl9IC8vIGlmCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gdGVzdAorCisJLyoqCisJICogQHBhcmFtIGNvbmZpZ0VsZW1lbnQKKwkgKiAJCWEgY29uZmlndXJhdGlvbiBlbGVtZW50IGZvciBhIHBsdWctaW4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgaXMgZm9yIGEge0BsaW5rCisJICogCW9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnR9LgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0V4cGVyaW1lbnRDb25maWd1cmF0aW9uRWxlbWVudChmaW5hbCBTdHJpbmcgZm9ybWF0KSB7CisJCXJldHVybiBmb3JtYXQgIT0gbnVsbCAmJiBmb3JtYXQuZXF1YWxzKEV4cGVyaW1lbnRQYWNrYWdlLmVOU19VUkkpOworCX0gLy8gaXNFeHBlcmltZW50Q29uZmlndXJhdGlvbkVsZW1lbnQKKworCS8qKgorCSAqIEBwYXJhbSBjb25maWdFbGVtZW50CisJICogCQlhIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBmb3IgYSBwbHVnLWluCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGlzIGZvciBhIHtAbGluaworCSAqIAlvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW99LgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc1NjZW5hcmlvQ29uZmlndXJhdGlvbkVsZW1lbnQoZmluYWwgU3RyaW5nIGZvcm1hdCkgeworCQlyZXR1cm4gZm9ybWF0ICE9IG51bGwgJiYgZm9ybWF0LmVxdWFscyhTY2VuYXJpb1BhY2thZ2UuZU5TX1VSSSk7CisJfSAvLyBpc1NjZW5hcmlvQ29uZmlndXJhdGlvbkVsZW1lbnQKK30gLy8gSWRlbnRpZmlhYmxlUHJvcGVydHlUZXN0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvaGFuZGxlcnMvUmVmYWN0b3JIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2hhbmRsZXJzL1JlZmFjdG9ySGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MzM3MzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2hhbmRsZXJzL1JlZmFjdG9ySGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACisvLyBTVEVNRXhlY3V0aW9uQ29tbWFuZEhhbmRsZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmhhbmRsZXJzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5maWxlLkZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy5maWxlLkZpbGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuVXRpbGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyLklkZW50aWZpYWJsZVRyZWVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2lkZ2V0cy5SZW5hbWVEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRoZSB0b3AtbGV2ZWwge0BsaW5rIElIYW5kbGVyfSBmb3IgdGhlIFNURU0gUmVuYW1lIGNvbW1hbmQKKyAqIGhhbmRsZXJzIAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmYWN0b3JIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyCisJCWltcGxlbWVudHMgSUhhbmRsZXIgeworCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXIjZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50KQorCSAqLworCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBleGVjdXRpb25FdmVudCkKKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworCisJCQorCQlmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IEhhbmRsZXJVdGlsCisJCQkJLmdldEN1cnJlbnRTZWxlY3Rpb25DaGVja2VkKGV4ZWN1dGlvbkV2ZW50KTsKKwkJCisJCS8vIFN0cnVjdHVyZWQgU2VsZWN0aW9uPworCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJLy8gWWVzCisJCQkvLyBJdGVyYXRlIHRocm91Z2ggZXZlcnl0aGluZyB0aGF0J3MgaW4gdGhlIHNlbGVjdGlvbiBhbmQgcHV0IGVhY2gKKwkJCS8vIG9iamVjdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBjb2xsZWN0aW9uLgorCQkJZm9yIChmaW5hbCBPYmplY3Qgb2JqIDogKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvTGlzdCgpKSB7CisJCQkJLy8gSUV4ZWN1dGFibGUgZXhlY3V0YWJsZSA9IChJRXhlY3V0YWJsZSkgRXhlY3V0YWJsZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJLy8gLmFkYXB0KG9iaiwgSUV4ZWN1dGFibGUuY2xhc3MpOworCQkJCQorCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBQbGF0Zm9ybQorCQkJCS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIob2JqLCBGaWxlLmNsYXNzKTsgCisJCQorCQkJCQorCQkJCS8vIFdlcmUgd2Ugc3VjY2Vzc2Z1bCBpbiBhZGFwdGluZz8KKwkJCQlpZiAoZmlsZSAhPSBudWxsKSB7CisJCQkJCS8vIFllcworCQkJCQlkb2l0KGZpbGUpOworCQkJCX0gLy8gaWYKKwkJCQllbHNlIHsKKwkJCQkJLy8gSW50ZXJuYWwgZXJyb3IKKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKAorCQkJCQkJCSJTVEVNIEludGVybmFsIGVycm9yIHJlbmFtZSBjb21tYW5kIGFwcGxpZWQgdG8gXCIiCisJCQkJCQkJCQkrIG9iai5nZXRDbGFzcygpLmdldE5hbWUoKSArICJcIiIsIG51bGwpOworCQkJCX0KKwkJCX0gLy8gZm9yIGVhY2ggc2VsZWN0aW9uCisJCX0gLy8gaWYgU3RydWN0dXJlZFNlbGVjdGlvbgorCisJCWlmKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFRyZWVTZWxlY3Rpb24pIHsKKwkJCVRyZWVTZWxlY3Rpb24gdHMgPSAoVHJlZVNlbGVjdGlvbilzZWxlY3Rpb247CisJCQlUcmVlUGF0aFtdIHBhdGhzID0gIHRzLmdldFBhdGhzKCk7CisJCQlpZihwYXRocy5sZW5ndGggPiAwKSB7CisJCQkJVHJlZVBhdGggcGFyZW50ID0gcGF0aHNbMF0uZ2V0UGFyZW50UGF0aCgpOworCQkJCU9iamVjdCBwYXJlbnRTZWcgPSBwYXJlbnQuZ2V0TGFzdFNlZ21lbnQoKTsKKwkJCQlpZihwYXJlbnRTZWcgIT0gbnVsbCkgeworCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKKwkJCQkJaWYocGFyZW50U2VnIGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlVHJlZU5vZGUpIHsgCisJCQkJCQlwcm9qZWN0ID0oKElkZW50aWZpYWJsZVRyZWVOb2RlKXBhcmVudFNlZykuZ2V0UHJvamVjdCgpOworCQkJCQl9IGlmKHBhcmVudFNlZyBpbnN0YW5jZW9mIElQcm9qZWN0KSBwcm9qZWN0ID0gKElQcm9qZWN0KXBhcmVudFNlZzsKKwkJCQkJCisJCQkJCXRyeSB7CisJCQkJCQlwcm9qZWN0LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOworCQkJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJCisJCX0KKwkJCisJCXJldHVybiBudWxsOworCX0gLy8gZXhlY3V0ZQorCisJCisJYWJzdHJhY3Qgdm9pZCBkb2l0KEZpbGUgZmlsZSk7CisJCisJcHVibGljIHN0YXRpYyBjbGFzcyBSZW5hbWVIYW5kbGVyICBleHRlbmRzIFJlZmFjdG9ySGFuZGxlciB7CisJCXByb3RlY3RlZCB2b2lkIGRvaXQoRmlsZSBmaWxlKSB7CisJCQlEaXNwbGF5IGRpc3BsYXkgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKKwkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOworCQkJUmVuYW1lRGlhbG9nIHJkID0gbmV3IFJlbmFtZURpYWxvZyhzaGVsbCwgU1dULlBVU0gsIGZpbGUuZ2V0UmVzb3VyY2UoKSwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJyZW5hbWUiKSk7CisJCQlTdHJpbmcgbmV3bmFtZSA9IHJkLm9wZW4oKTsKKwkJCWlmKG5ld25hbWUgIT0gbnVsbCkgeworCQkJCVhNSVJlc291cmNlIHJlc291cmNlID0gZmlsZS5nZXRSZXNvdXJjZSgpOworCQkJCVVSSSBvbGRVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKKwkJCQlVUkkgb2xkSWRVUkkgPSBmaWxlLmdldElkZW50aWZpYWJsZSgpLmdldFVSSSgpOworCQkJCVN0cmluZyBzX25ld1VSSSA9IG9sZFVSSS50b1N0cmluZygpLnN1YnN0cmluZygwLCBvbGRVUkkudG9TdHJpbmcoKS5pbmRleE9mKG9sZFVSSS5sYXN0U2VnbWVudCgpKSk7CisJCQkJU3RyaW5nIHNfbmV3SWRVUkkgPSBvbGRJZFVSSS50b1N0cmluZygpLnN1YnN0cmluZygwLCBvbGRJZFVSSS50b1N0cmluZygpLmluZGV4T2Yob2xkSWRVUkkubGFzdFNlZ21lbnQoKSkpOworCQkJCQorCQkJCQorCQkJCVVSSSBuZXdVUkkgPSBVUkkuY3JlYXRlVVJJKHNfbmV3VVJJK25ld25hbWUpOworCQkJCVVSSSBuZXdJRFVSSSA9IFVSSS5jcmVhdGVVUkkoc19uZXdJZFVSSStuZXduYW1lKTsKKwkJCQkKKwkJCQl0cnkgeworCQkJCQlBcnJheUxpc3Q8SWRlbnRpZmlhYmxlPm5ld2xpc3QgPSBuZXcgQXJyYXlMaXN0PElkZW50aWZpYWJsZT4oKTsKKwkJCQkJSWRlbnRpZmlhYmxlIGUgPSAoSWRlbnRpZmlhYmxlKUVjb3JlVXRpbC5jb3B5KGZpbGUuZ2V0SWRlbnRpZmlhYmxlKCkpOworCQkJCQllLnNldFVSSShuZXdJRFVSSSk7CisJCQkJCW5ld2xpc3QuYWRkKGUpOworCQkJCQlVdGlsaXR5LnNlcmlhbGl6ZUlkZW50aWZpYWJsZXMobmV3bGlzdCwgbmV3VVJJKTsKKwkJCQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOworCQkJCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJcHVibGljIHN0YXRpYyBjbGFzcyBDb3B5SGFuZGxlciAgZXh0ZW5kcyBSZWZhY3RvckhhbmRsZXIgeworCQlwcm90ZWN0ZWQgdm9pZCBkb2l0KEZpbGUgZmlsZSkgeworCQkJRGlzcGxheSBkaXNwbGF5ID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCk7CisJCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKKwkJCVJlbmFtZURpYWxvZyByZCA9IG5ldyBSZW5hbWVEaWFsb2coc2hlbGwsIFNXVC5QVVNILCBmaWxlLmdldFJlc291cmNlKCksIE1lc3NhZ2VzLmdldFN0cmluZygiY29weSIpKTsKKwkJCVN0cmluZyBuZXduYW1lID0gcmQub3BlbigpOworCQkJaWYobmV3bmFtZSAhPSBudWxsKSB7CisJCQkJWE1JUmVzb3VyY2UgcmVzb3VyY2UgPSBmaWxlLmdldFJlc291cmNlKCk7CisJCQkJVVJJIG9sZFVSSSA9IHJlc291cmNlLmdldFVSSSgpOworCQkJCVVSSSBvbGRJZFVSSSA9IGZpbGUuZ2V0SWRlbnRpZmlhYmxlKCkuZ2V0VVJJKCk7CisJCQkJU3RyaW5nIHNfbmV3VVJJID0gb2xkVVJJLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDAsIG9sZFVSSS50b1N0cmluZygpLmluZGV4T2Yob2xkVVJJLmxhc3RTZWdtZW50KCkpKTsKKwkJCQlTdHJpbmcgc19uZXdJZFVSSSA9IG9sZElkVVJJLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDAsIG9sZElkVVJJLnRvU3RyaW5nKCkuaW5kZXhPZihvbGRJZFVSSS5sYXN0U2VnbWVudCgpKSk7CisJCQkJCisJCQkJCisJCQkJVVJJIG5ld1VSSSA9IFVSSS5jcmVhdGVVUkkoc19uZXdVUkkrbmV3bmFtZSk7CisJCQkJVVJJIG5ld0lEVVJJID0gVVJJLmNyZWF0ZVVSSShzX25ld0lkVVJJK25ld25hbWUpOworCQkJCQorCQkJCXRyeSB7CisJCQkJCUFycmF5TGlzdDxJZGVudGlmaWFibGU+bmV3bGlzdCA9IG5ldyBBcnJheUxpc3Q8SWRlbnRpZmlhYmxlPigpOworCQkJCQlJZGVudGlmaWFibGUgZSA9IChJZGVudGlmaWFibGUpRWNvcmVVdGlsLmNvcHkoZmlsZS5nZXRJZGVudGlmaWFibGUoKSk7CisJCQkJCWUuc2V0VVJJKG5ld0lEVVJJKTsKKwkJCQkJbmV3bGlzdC5hZGQoZSk7CisJCQkJCVV0aWxpdHkuc2VyaWFsaXplSWRlbnRpZmlhYmxlcyhuZXdsaXN0LCBuZXdVUkkpOworCQkJCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9IC8vICBSZWZhY3RvckhhbmRsZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvaGFuZGxlcnMvU1RFTUV4ZWN1dGlvbkNvbW1hbmRIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2hhbmRsZXJzL1NURU1FeGVjdXRpb25Db21tYW5kSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNTZjZGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL2hhbmRsZXJzL1NURU1FeGVjdXRpb25Db21tYW5kSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTk0IEBACisvLyBTVEVNRXhlY3V0aW9uQ29tbWFuZEhhbmRsZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmhhbmRsZXJzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wZXJzcGVjdGl2ZXMuU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRoZSB0b3AtbGV2ZWwge0BsaW5rIElIYW5kbGVyfSBmb3IgdGhlIFNURU0gImV4ZWN1dGlvbiIgY29tbWFuZAorICogaGFuZGxlcnMgdGhhdCBiZWdpbiBhbmQgY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudH1zIGFuZAorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb31zLgorICogCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5CYXRjaE1hbmFnZXIKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXIKKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIFNURU1FeGVjdXRpb25Db21tYW5kSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlcgorCQlpbXBsZW1lbnRzIElIYW5kbGVyIHsKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgZXhlY3V0aW9uRXZlbnQpCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKworCQlib29sZWFuIHN3aXRjaFBlcnNwZWN0aXZlID0gZmFsc2U7CisJCQorCQkvL1N0cmluZyBuYW1lID0gZXhlY3V0aW9uRXZlbnQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7CisJCQorCQlmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IEhhbmRsZXJVdGlsCisJCQkJLmdldEN1cnJlbnRTZWxlY3Rpb25DaGVja2VkKGV4ZWN1dGlvbkV2ZW50KTsKKwkJCisJCWJvb2xlYW4gdXNlU2ltdWxhdGlvblBlcnNwZWN0aXZlID0gdHJ1ZTsKKworCQkvLyBTdHJ1Y3R1cmVkIFNlbGVjdGlvbj8KKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCS8vIFllcworCQkJLy8gSXRlcmF0ZSB0aHJvdWdoIGV2ZXJ5dGhpbmcgdGhhdCdzIGluIHRoZSBzZWxlY3Rpb24gYW5kIHB1dCBlYWNoCisJCQkvLyBvYmplY3QgaW50byB0aGUgYXBwcm9wcmlhdGUgY29sbGVjdGlvbi4KKwkJCWZvciAoZmluYWwgT2JqZWN0IG9iaiA6ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0xpc3QoKSkgeworCQkJCS8vIElFeGVjdXRhYmxlIGV4ZWN1dGFibGUgPSAoSUV4ZWN1dGFibGUpIEV4ZWN1dGFibGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCS8vIC5hZGFwdChvYmosIElFeGVjdXRhYmxlLmNsYXNzKTsKKwkJCQlJRXhlY3V0YWJsZSBleGVjdXRhYmxlID0gKElFeGVjdXRhYmxlKSBQbGF0Zm9ybQorCQkJCQkJLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcihvYmosIElFeGVjdXRhYmxlLmNsYXNzKTsgCisJCQkJCisJCQkJLy8gT25seSBzd2l0Y2ggdG8gdGhlIFNpbXVsYXRpb24gUGVyc2VwY3RpdmUgd2hlbiB0aGUgZXhlY3V0YWJsZSBpcyBhIHN0YW5kYXJkCisJCQkJLy8gcnVuIChzY2VuYXJpbykuIEZvciBvdGhlciBleGVjdXRhYmxlcyB3ZSBtYXkgd2FudCB0byBzdGF5IGluIG90aGVyIHNwZWNpYWwKKwkJCQkvLyBwZXJzcGVjdGl2ZXMKKwkJCQlpZihleGVjdXRhYmxlIGluc3RhbmNlb2YgQWRhcHRlcikgeworCQkJCQlBZGFwdGVyIGEgPSAoQWRhcHRlcikgZXhlY3V0YWJsZTsKKwkJCQkJT2JqZWN0IGFPYmogPSBhLmdldFRhcmdldCgpOworCQkJCQlpZiggYU9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5pbXBsLlNjZW5hcmlvSW1wbCApIHsKKwkJCQkJCXN3aXRjaFBlcnNwZWN0aXZlID0gdHJ1ZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXN3aXRjaFBlcnNwZWN0aXZlID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9IC8vIGlmIGFkYXB0ZXIgKHVzdWFsbHkgdHJ1ZSkKKwkJCQkKKwkJCQkvLyBXZXJlIHdlIHN1Y2Nlc3NmdWwgaW4gYWRhcHRpbmc/CisJCQkJaWYgKGV4ZWN1dGFibGUgIT0gbnVsbCkgeworCQkJCQkvLyBZZXMKKwkJCQkJZG9pdChleGVjdXRhYmxlKTsKKwkJCQl9IC8vIGlmCisJCQkJZWxzZSB7CisJCQkJCS8vIEludGVybmFsIGVycm9yCisJCQkJCUFjdGl2YXRvci5sb2dFcnJvcigKKwkJCQkJCQkiU1RFTSBJbnRlcm5hbCBlcnJvciBleGVjdXRpb24gY29tbWFuZCBhcHBsaWVkIHRvIFwiIgorCQkJCQkJCQkJKyBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXCIiLCBudWxsKTsKKwkJCQl9CisJCQl9IC8vIGZvciBlYWNoIHNlbGVjdGlvbgorCQl9IC8vIGlmIFN0cnVjdHVyZWRTZWxlY3Rpb24KKworCQkvLyBGbGlwIHRvIFNpbXVsYXRpb24gUGVyc3BlY3RpdmU/CisJCWlmIChzd2l0Y2hQZXJzcGVjdGl2ZSkgeworCQkJLy8gWWVzCisJCQlpZih1c2VTaW11bGF0aW9uUGVyc3BlY3RpdmUpIHsKKwkJCQlBY3RpdmF0b3Iuc3dpdGNoVG9QZXJzcGVjdGl2ZShTaW11bGF0aW9uLklEX1NURU1fU0lNVUxBVElPTl9QRVJTUEVDVElWRSk7CisJCQl9ZWxzZSB7CisJCQkJLy8gTm90aGluZworCQkJCS8vIEp1c3QgZG9uJ3Qgc3dpdGNoIFBlcnNwZWN0aXZlcworCQkJCS8vIHNvIGlmIHJ1bm5pbmcsIGUuZy4sIGluIHRoZSBhdXRvbWF0ZWQgZXhwZXJpbWVudCBwZXJzcGVjdGl2ZSBqdXN0IHN0YXkgdGhlcmUKKwkJCX0KKwkJCQorCQl9IC8vIGlmIGZsaXAKKworCQlyZXR1cm4gbnVsbDsKKwl9IC8vIGV4ZWN1dGUKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gaW52b2tlIHRoZSBzcGVjaWZpYyBtZXRob2Qgb2YKKwkgKiB0aGUge0BsaW5rIElFeGVjdXRhYmxlfSB0aGF0IGltcGxlbWVudHMgdGhlaXIgY29tbWFuZCBmb3IgdGhlCisJICoge0BsaW5rIElFeGVjdXRhYmxlfS4KKwkgKiAKKwkgKiBAcGFyYW0gZXhlY3V0YWJsZQorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBJRXhlY3V0YWJsZX0KKwkgKi8KKwlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBkb2l0KElFeGVjdXRhYmxlIGV4ZWN1dGFibGUpOworCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBTVEVNRXhlY3V0aW9uQ29tbWFuZEhhbmRsZXJ9IHRoYXQgaW52b2tlcworCSAqIHtAbGluayBJRXhlY3V0YWJsZSNydW4oKX0uCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBSdW5Db21tYW5kSGFuZGxlciBleHRlbmRzIFNURU1FeGVjdXRpb25Db21tYW5kSGFuZGxlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5oYW5kbGVycy5TVEVNRXhlY3V0aW9uQ29tbWFuZEhhbmRsZXIjZG9pdChvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGRvaXQoSUV4ZWN1dGFibGUgZXhlY3V0YWJsZSkgeworCQkJZXhlY3V0YWJsZS5ydW4oKTsKKwkJfQorCX0gLy8gUnVuQ29tbWFuZEhhbmRsZXIKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgU1RFTUV4ZWN1dGlvbkNvbW1hbmRIYW5kbGVyfSB0aGF0IGludm9rZXMKKwkgKiB7QGxpbmsgSUV4ZWN1dGFibGUjcGF1c2UoKX0uCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBQYXVzZUNvbW1hbmRIYW5kbGVyIGV4dGVuZHMgU1RFTUV4ZWN1dGlvbkNvbW1hbmRIYW5kbGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmhhbmRsZXJzLlNURU1FeGVjdXRpb25Db21tYW5kSGFuZGxlciNkb2l0KG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZG9pdChJRXhlY3V0YWJsZSBleGVjdXRhYmxlKSB7CisJCQlleGVjdXRhYmxlLnBhdXNlKCk7CisJCX0KKwl9IC8vIFBhdXNlQ29tbWFuZEhhbmRsZXIKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgU1RFTUV4ZWN1dGlvbkNvbW1hbmRIYW5kbGVyfSB0aGF0IGludm9rZXMKKwkgKiB7QGxpbmsgSUV4ZWN1dGFibGUjc3RlcCgpfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFN0ZXBDb21tYW5kSGFuZGxlciBleHRlbmRzIFNURU1FeGVjdXRpb25Db21tYW5kSGFuZGxlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS5oYW5kbGVycy5TVEVNRXhlY3V0aW9uQ29tbWFuZEhhbmRsZXIjZG9pdChvcmcuZWNsaXBzZS5zdGVtLmpvYnMuZXhlY3V0aW9uLklFeGVjdXRhYmxlKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGRvaXQoSUV4ZWN1dGFibGUgZXhlY3V0YWJsZSkgeworCQkJZXhlY3V0YWJsZS5zdGVwKCk7CisJCX0KKwl9IC8vIFN0ZXBDb21tYW5kSGFuZGxlcgorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBTVEVNRXhlY3V0aW9uQ29tbWFuZEhhbmRsZXJ9IHRoYXQgaW52b2tlcworCSAqIHtAbGluayBJRXhlY3V0YWJsZSNyZXNldCgpfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFJlc2V0Q29tbWFuZEhhbmRsZXIgZXh0ZW5kcyBTVEVNRXhlY3V0aW9uQ29tbWFuZEhhbmRsZXIgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkuaGFuZGxlcnMuU1RFTUV4ZWN1dGlvbkNvbW1hbmRIYW5kbGVyI2RvaXQob3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZSkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBkb2l0KElFeGVjdXRhYmxlIGV4ZWN1dGFibGUpIHsKKwkJCWV4ZWN1dGFibGUucmVzZXQoKTsKKwkJfQorCX0gLy8gUmVzZXRDb21tYW5kSGFuZGxlcgorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBTVEVNRXhlY3V0aW9uQ29tbWFuZEhhbmRsZXJ9IHRoYXQgaW52b2tlcworCSAqIHtAbGluayBJRXhlY3V0YWJsZSNzdG9wKCl9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3RvcENvbW1hbmRIYW5kbGVyIGV4dGVuZHMgU1RFTUV4ZWN1dGlvbkNvbW1hbmRIYW5kbGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmhhbmRsZXJzLlNURU1FeGVjdXRpb25Db21tYW5kSGFuZGxlciNkb2l0KG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGUpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZG9pdChJRXhlY3V0YWJsZSBleGVjdXRhYmxlKSB7CisJCQlleGVjdXRhYmxlLnN0b3AoKTsKKwkJfQorCX0gLy8gU3RvcENvbW1hbmRIYW5kbGVyCisKK30gLy8gU1RFTUV4ZWN1dGlvbkNvbW1hbmRIYW5kbGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3BlcnNwZWN0aXZlcy9EZXNpZ25lci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wZXJzcGVjdGl2ZXMvRGVzaWduZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjk4MzhiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wZXJzcGVjdGl2ZXMvRGVzaWduZXIuamF2YQpAQCAtMCwwICsxLDk3IEBACisvLyBEZXNpZ25lci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkucGVyc3BlY3RpdmVzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5EZWNvcmF0b3JzVmlldzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLkdyYXBoc1ZpZXc7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5Nb2RlbHNWaWV3OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuUHJlZGljYXRlc1ZpZXc7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5TY2VuYXJpb3NWaWV3OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuU2VxdWVuY2Vyc1ZpZXc7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5TaW11bGF0aW9uQ29udHJvbFZpZXc7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5UcmlnZ2Vyc1ZpZXc7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld1NURU1Qcm9qZWN0V2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGb2xkZXJMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLlByb2plY3RFeHBsb3JlcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlICJEZXNpZ25lciIgcGVyc3BlY3RpdmUgb2YgU1RFTS4gVGhpcyBQZXJzcGVjdGl2ZSBpcworICogdXNlZCB0byBjcmVhdGUgb3IgImRlc2lnbiIgc2ltdWxhdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBEZXNpZ25lciBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgeworCisJLyoqCisJICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIERlc2lnbmVyIFBlcnNwZWN0aXZlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfU1RFTV9ERVNJR05FUl9QRVJTUEVDVElWRSA9IENvbnN0YW50cy5JRF9ST09UCisJCQkrICIudWkuU1RFTURlc2lnbmVyUGVyc3BlY3RpdmUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3RvcnkjY3JlYXRlSW5pdGlhbExheW91dChvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KGZpbmFsIElQYWdlTGF5b3V0IGxheW91dCkgeworCQlmaW5hbCBTdHJpbmcgZWRpdG9yQXJlYSA9IGxheW91dC5nZXRFZGl0b3JBcmVhKCk7CisKKwkJLy8gUHV0IHRoZSBTVEVNIFByb2plY3QgRXhwbG9yZXIgdmlldyBvbiB0aGUgbGVmdCBzaWRlCisJCWZpbmFsIElGb2xkZXJMYXlvdXQgbGVmdCA9IGxheW91dC5jcmVhdGVGb2xkZXIoCisJCQkJImxlZnQiLCBJUGFnZUxheW91dC5MRUZULCAvLyROT04tTkxTLTEkCisJCQkJMC4yNWYsIGVkaXRvckFyZWEpOworCQlsZWZ0LmFkZFZpZXcoUHJvamVjdEV4cGxvcmVyLlZJRVdfSUQpOworCisJCS8vIFB1dCB0aGUgR3JhcGhzIFZpZXcgb24gdGhlIGJvdHRvbSB3aXRoIHRoZSBUYXNrcyBWaWV3CisJCWZpbmFsIElGb2xkZXJMYXlvdXQgYm90dG9tID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigiYm90dG9tIiwgLy8kTk9OLU5MUy0xJAorCQkJCUlQYWdlTGF5b3V0LkJPVFRPTSwgMC42NmYsIGVkaXRvckFyZWEpOworCisJCWJvdHRvbS5hZGRWaWV3KFNjZW5hcmlvc1ZpZXcuSURfU0NFTkFSSU9TX1ZJRVcpOworCQlib3R0b20uYWRkVmlldyhNb2RlbHNWaWV3LklEX01PREVMU19WSUVXKTsKKwkJYm90dG9tLmFkZFZpZXcoR3JhcGhzVmlldy5JRF9HUkFQSFNfVklFVyk7CisKKwkJYm90dG9tLmFkZFZpZXcoVHJpZ2dlcnNWaWV3LklEX1RSSUdHRVJTX1ZJRVcpOworCQlib3R0b20uYWRkVmlldyhQcmVkaWNhdGVzVmlldy5JRF9QUkVESUNBVEVTX1ZJRVcpOworCQlib3R0b20uYWRkVmlldyhTZXF1ZW5jZXJzVmlldy5JRF9TRVFVRU5DRVJTX1ZJRVcpOworCQlib3R0b20uYWRkVmlldyhEZWNvcmF0b3JzVmlldy5JRF9ERUNPUkFUT1JTX1ZJRVcpOworCisJCWJvdHRvbS5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1BST1BfU0hFRVQpOworCQlib3R0b20uYWRkVmlldyhJUGFnZUxheW91dC5JRF9UQVNLX0xJU1QpOworCQlib3R0b20uYWRkUGxhY2Vob2xkZXIoSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXKTsKKwkJLy8gYWRkIEVycm9yIExvZyB2aWV3CisJCWJvdHRvbS5hZGRWaWV3KCJvcmcuZWNsaXBzZS5wZGUucnVudGltZS5Mb2dWaWV3Iik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gUHV0IHRoZSBPdXRsaW5lIHZpZXcgb24gdGhlIHJpZ2h0CisJCWxheW91dC5hZGRWaWV3KElQYWdlTGF5b3V0LklEX09VVExJTkUsIElQYWdlTGF5b3V0LlJJR0hULCAuNzVmLAorCQkJCWVkaXRvckFyZWEpOworCisJCS8vIEFkZCB0aGUgVmlld3MgdG8gIlNob3cgVmlldyIgbWVudQorCQlsYXlvdXQKKwkJCQkuYWRkU2hvd1ZpZXdTaG9ydGN1dChTaW11bGF0aW9uQ29udHJvbFZpZXcuSURfU0lNVUxBVElPTl9DT05UUk9MX1ZJRVcpOworCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChHcmFwaHNWaWV3LklEX0dSQVBIU19WSUVXKTsKKwkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoTW9kZWxzVmlldy5JRF9NT0RFTFNfVklFVyk7CisJCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KFNjZW5hcmlvc1ZpZXcuSURfU0NFTkFSSU9TX1ZJRVcpOworCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChTZXF1ZW5jZXJzVmlldy5JRF9TRVFVRU5DRVJTX1ZJRVcpOworCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChEZWNvcmF0b3JzVmlldy5JRF9ERUNPUkFUT1JTX1ZJRVcpOworCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChUcmlnZ2Vyc1ZpZXcuSURfVFJJR0dFUlNfVklFVyk7CisJCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KFByZWRpY2F0ZXNWaWV3LklEX1BSRURJQ0FURVNfVklFVyk7CisJCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KFByb2plY3RFeHBsb3Jlci5WSUVXX0lEKTsKKworCQkvLyBBZGQgdGhlIFdpemFyZHMgdG8gdGhlICJOZXcuLi4iIG1lbnUKKwkJbGF5b3V0CisJCQkJLmFkZE5ld1dpemFyZFNob3J0Y3V0KE5ld1NURU1Qcm9qZWN0V2l6YXJkLklEX1NURU1fUFJPSkVDVF9XSVpBUkQpOworCisJCS8vIEFkZCB0aGUgRGVzaWduZXIgcGVyc3BlY3RpdmUgdG8gdGhlICJPcGVuIFBlcnNwZWN0aXZlIiBtZW51CisJCWxheW91dC5hZGRQZXJzcGVjdGl2ZVNob3J0Y3V0KElEX1NURU1fREVTSUdORVJfUEVSU1BFQ1RJVkUpOworCisJfSAvLyBjcmVhdGVJbml0aWFsTGF5b3V0CisKK30gLy8gRGVzaWduZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcGVyc3BlY3RpdmVzL1NpbXVsYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcGVyc3BlY3RpdmVzL1NpbXVsYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTE3MzAwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wZXJzcGVjdGl2ZXMvU2ltdWxhdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8vIFNpbXVsYXRpb24uamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnBlcnNwZWN0aXZlczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuQWN0aXZlQmF0Y2hlc1ZpZXc7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5BY3RpdmVTaW11bGF0aW9uc1ZpZXc7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5TY2VuYXJpb3NWaWV3OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuU2ltdWxhdGlvbkNvbnRyb2xWaWV3OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuTWFwVmlldzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRm9sZGVyTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5Qcm9qZWN0RXhwbG9yZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSAiU2ltdWxhdGlvbiIgcGVyc3BlY3RpdmUgb2YgU1RFTS4gVGhpcyBQZXJzcGVjdGl2ZQorICogaXMgdXNlZCB0byBjb250cm9sIGFuZCB2aXN1YWxpemUgc2ltdWxhdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBTaW11bGF0aW9uIGltcGxlbWVudHMgSVBlcnNwZWN0aXZlRmFjdG9yeSB7CisKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgU2ltdWxhdGlvbiBQZXJzcGVjdGl2ZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1NURU1fU0lNVUxBVElPTl9QRVJTUEVDVElWRSA9IENvbnN0YW50cy5JRF9ST09UCisJCQkrICIudWkuU1RFTVNpbXVsYXRpb25QZXJzcGVjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgaW5pdGlhbCBsYXlvdXQuIEFmdGVyIHRoZSBpbml0aWFsIGludm9jYXRpb24sIHRoZSBsYXN0IHdpbmRvdworCSAqIHNldHVwIHdpbGwgYmUgdXNlZCBzbyB0aGlzIGlzIHByb2JhYmx5IGEgb25lIHRpbWUgc2V0dXAgYnV0IGl0IGlzCisJICogaW1wb3J0YW50IHRvIGdldCB0aGUgdXNlciBzdGFydGVkIG9uIHRoZSByaWdodCBmb290LgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeSNjcmVhdGVJbml0aWFsTGF5b3V0KG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0KQorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoZmluYWwgSVBhZ2VMYXlvdXQgbGF5b3V0KSB7CisJCWZpbmFsIFN0cmluZyBlZGl0b3JBcmVhID0gbGF5b3V0LmdldEVkaXRvckFyZWEoKTsKKworCQkvLyBQdXQgdGhlIE1hcCBieSBpdHNlbGYgb24gdGhlIHRvcAorCQlsYXlvdXQuYWRkU3RhbmRhbG9uZVZpZXcoTWFwVmlldy5JRF9NQVBfVklFVywgdHJ1ZSwgSVBhZ2VMYXlvdXQuUklHSFQsCisJCQkJMC4wZiwgZWRpdG9yQXJlYSk7CisKKwkJLy8gUHV0IHRoZSBTaW11bGF0aW9uIENvbnRyb2wgdmlldyBiZWxvdyB0aGUgbWFwIG9uIHRoZSBsZWZ0CisJCWZpbmFsIElGb2xkZXJMYXlvdXQgbGVmdCA9IGxheW91dC5jcmVhdGVGb2xkZXIoCisJCQkJImxlZnQiLCBJUGFnZUxheW91dC5CT1RUT00sIC8vJE5PTi1OTFMtMSQKKwkJCQkwLjYwZiwgTWFwVmlldy5JRF9NQVBfVklFVyk7CisJCWxlZnQuYWRkVmlldyhTaW11bGF0aW9uQ29udHJvbFZpZXcuSURfU0lNVUxBVElPTl9DT05UUk9MX1ZJRVcpOworCQlsZWZ0LmFkZFZpZXcoUHJvamVjdEV4cGxvcmVyLlZJRVdfSUQpOworCQlsZWZ0LmFkZFZpZXcoU2NlbmFyaW9zVmlldy5JRF9TQ0VOQVJJT1NfVklFVyk7CisJCQorCQkvLyBQdXQgdGhlIFNjZW5hcmlvIFZpZXcgb24gdGhlIGJvdHRvbSByaWdodAorCQkvLyBhbmQgYWRkIGFsbCB0aGUgc2hvcnRjdXRzIHRoZXJlIGFsc28uCisJCWZpbmFsIElGb2xkZXJMYXlvdXQgYm90dG9tID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigiYm90dG9tIiwgLy8kTk9OLU5MUy0xJAorCQkJCUlQYWdlTGF5b3V0LlJJR0hULCAwLjMwZiwgImxlZnQiKTsKKworCQlib3R0b20uYWRkVmlldyhTY2VuYXJpb3NWaWV3LklEX1NDRU5BUklPU19WSUVXKTsKKworCQkvLyBBZGQgdGltZSBzZXJpZXMgdmlldworCQlib3R0b20uYWRkVmlldygib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5yZXBvcnRzIik7CisJCS8vIEFkZCBwaGFzZSBwbG90IHZpZXcKKwkJYm90dG9tLmFkZFZpZXcoIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MucmVwb3J0cy5waGFzZVNwYWNlIik7CisJCS8vIEFkZCBDU1YgbG9nZ2VyIHZpZXcKKwkJYm90dG9tLmFkZFZpZXcoIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MucmVwb3J0cy5waGFzZVNwYWNlIik7CisJCS8vIGFkZCBFcnJvciBMb2cgdmlldworCQlib3R0b20uYWRkVmlldygib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMiKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEFkZCB0aGUgVmlld3MgdG8gIlNob3cgVmlldyIgbWVudQorCQlsYXlvdXQKKwkJCQkuYWRkU2hvd1ZpZXdTaG9ydGN1dChTaW11bGF0aW9uQ29udHJvbFZpZXcuSURfU0lNVUxBVElPTl9DT05UUk9MX1ZJRVcpOworCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9QUk9HUkVTU19WSUVXKTsKKwkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoU2NlbmFyaW9zVmlldy5JRF9TQ0VOQVJJT1NfVklFVyk7CisJCWxheW91dAorCQkJCS5hZGRTaG93Vmlld1Nob3J0Y3V0KEFjdGl2ZVNpbXVsYXRpb25zVmlldy5JRF9BQ1RJVkVfU0lNVUxBVElPTlNfVklFVyk7CisJCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KEFjdGl2ZUJhdGNoZXNWaWV3LklEX0FDVElWRV9CQVRDSEVTX1ZJRVcpOworCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChNYXBWaWV3LklEX01BUF9WSUVXKTsKKworCQkvLyBUT0RPIGZpeCBoYXJkIGNvZGVkIGZvciBHRVZpZXcuR0VfVklFV19JRAorCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dCgib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZSIpOworCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dCgib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5yZXBvcnRzIik7CisJCWxheW91dAorCQkJCS5hZGRTaG93Vmlld1Nob3J0Y3V0KCJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnJlcG9ydHMucGhhc2VTcGFjZSIpOworCQkvLyBXZSBkb24ndCB3YW50IHRvIHNlZSB0aGUgZWRpdG9yCisJCWxheW91dC5zZXRFZGl0b3JBcmVhVmlzaWJsZShmYWxzZSk7CisKKwkJLy8gQWRkIHRoZSBTaW11bGF0aW9uIHBlcnNwZWN0aXZlIHRvIHRoZSAiT3BlbiBQZXJzcGVjdGl2ZSIgbWVudQorCQlsYXlvdXQuYWRkUGVyc3BlY3RpdmVTaG9ydGN1dChJRF9TVEVNX1NJTVVMQVRJT05fUEVSU1BFQ1RJVkUpOworCisJfSAvLyBjcmVhdGVJbml0aWFsTGF5b3V0CisKK30gLy8gU2ltdWxhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wcmVmZXJlbmNlcy9NYXBzQ29sb3JzUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ByZWZlcmVuY2VzL01hcHNDb2xvcnNQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmQwNmE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wcmVmZXJlbmNlcy9NYXBzQ29sb3JzUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKQEAgLTAsMCArMSw0NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnByZWZlcmVuY2VzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5SZWxhdGl2ZVZhbHVlQ29sb3JQcmVmZXJlbmNlczsKKworLyoqCisgKiBDbGFzcyB1c2VkIHRvIGluaXRpYWxpemUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KKyAqLworcHVibGljIGNsYXNzIE1hcHNDb2xvcnNQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgeworCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKKwkJc3RvcmUuc2V0RGVmYXVsdChNYXBzQ29sb3JzUHJlZmVyZW5jZVBhZ2UuRk9SRUdST1VORF9DT0xPUl9JRCwgTWFwc0NvbG9yc1ByZWZlcmVuY2VQYWdlLkZPUkVHUk9VTkRfQ09MT1JfREVGQVVMVF9SR0JfU1RSSU5HKTsKKwkJc3RvcmUuc2V0RGVmYXVsdChNYXBzQ29sb3JzUHJlZmVyZW5jZVBhZ2UuQkFDS0dST1VORF9DT0xPUl9JRCwgTWFwc0NvbG9yc1ByZWZlcmVuY2VQYWdlLkJBQ0tHUk9VTkRfQ09MT1JfREVGQVVMVF9SR0JfU1RSSU5HKTsKKwkJc3RvcmUuc2V0RGVmYXVsdChNYXBzQ29sb3JzUHJlZmVyZW5jZVBhZ2UuQk9SREVSU19DT0xPUl9JRCwgTWFwc0NvbG9yc1ByZWZlcmVuY2VQYWdlLkJPUkRFUlNfQ09MT1JfREVGQVVMVF9SR0JfU1RSSU5HKTsKKwkJc3RvcmUuc2V0RGVmYXVsdChNYXBzQ29sb3JzUHJlZmVyZW5jZVBhZ2UuRURHRVNfQ09MT1JfSUQsIE1hcHNDb2xvcnNQcmVmZXJlbmNlUGFnZS5FREdFU19DT0xPUl9ERUZBVUxUX1JHQl9TVFJJTkcpOworCQkKKwkJLy9UaGlzIHRvbyBzaG91bGQgYmUgZG9uZSBieSB1c2luZyB0aGUgZXh0ZW5zaW9uLXBvaW50cyBtZWNoYW5pc20uIFRoZSBjb2xvciBwcm92aWRlcnMgYXJlIHVua25vd24uCisJCXN0b3JlLnNldERlZmF1bHQoUmVsYXRpdmVWYWx1ZUNvbG9yUHJlZmVyZW5jZXMuRk9SRUdST1VORF9DT0xPUl9aRVJPX1JFTEFUSVZFX1ZBTFVFX0lELCBSZWxhdGl2ZVZhbHVlQ29sb3JQcmVmZXJlbmNlcy5GT1JFR1JPVU5EX0NPTE9SX1pFUk9fUkVMQVRJVkVfVkFMVUVfREVGQVVMVF9SR0JfU1RSSU5HKTsKKwkJc3RvcmUuc2V0RGVmYXVsdChSZWxhdGl2ZVZhbHVlQ29sb3JQcmVmZXJlbmNlcy5GT1JFR1JPVU5EX0NPTE9SX1JBTkdFXzFfSUQsIFJlbGF0aXZlVmFsdWVDb2xvclByZWZlcmVuY2VzLkZPUkVHUk9VTkRfQ09MT1JfUkFOR0VfMV9ERUZBVUxUX1JHQl9TVFJJTkcpOworCQlzdG9yZS5zZXREZWZhdWx0KFJlbGF0aXZlVmFsdWVDb2xvclByZWZlcmVuY2VzLkZPUkVHUk9VTkRfQ09MT1JfUkFOR0VfMl9JRCwgUmVsYXRpdmVWYWx1ZUNvbG9yUHJlZmVyZW5jZXMuRk9SRUdST1VORF9DT0xPUl9SQU5HRV8yX0RFRkFVTFRfUkdCX1NUUklORyk7CisJCXN0b3JlLnNldERlZmF1bHQoUmVsYXRpdmVWYWx1ZUNvbG9yUHJlZmVyZW5jZXMuRk9SRUdST1VORF9DT0xPUl9SQU5HRV8zX0lELCBSZWxhdGl2ZVZhbHVlQ29sb3JQcmVmZXJlbmNlcy5GT1JFR1JPVU5EX0NPTE9SX1JBTkdFXzNfREVGQVVMVF9SR0JfU1RSSU5HKTsKKwkJc3RvcmUuc2V0RGVmYXVsdChSZWxhdGl2ZVZhbHVlQ29sb3JQcmVmZXJlbmNlcy5GT1JFR1JPVU5EX0NPTE9SX1JBTkdFXzRfSUQsIFJlbGF0aXZlVmFsdWVDb2xvclByZWZlcmVuY2VzLkZPUkVHUk9VTkRfQ09MT1JfUkFOR0VfNF9ERUZBVUxUX1JHQl9TVFJJTkcpOworCQlzdG9yZS5zZXREZWZhdWx0KFJlbGF0aXZlVmFsdWVDb2xvclByZWZlcmVuY2VzLkZPUkVHUk9VTkRfQ09MT1JfUkFOR0VfNV9JRCwgUmVsYXRpdmVWYWx1ZUNvbG9yUHJlZmVyZW5jZXMuRk9SRUdST1VORF9DT0xPUl9SQU5HRV81X0RFRkFVTFRfUkdCX1NUUklORyk7CisJCXN0b3JlLnNldERlZmF1bHQoUmVsYXRpdmVWYWx1ZUNvbG9yUHJlZmVyZW5jZXMuRk9SRUdST1VORF9DT0xPUl9NQVhJTVVNX1JFTEFUSVZFX1ZBTFVFX0lELCBSZWxhdGl2ZVZhbHVlQ29sb3JQcmVmZXJlbmNlcy5GT1JFR1JPVU5EX0NPTE9SX01BWElNVU1fUkVMQVRJVkVfVkFMVUVfREVGQVVMVF9SR0JfU1RSSU5HKTsKKwl9IC8vIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMKKworfSAvLyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcHJlZmVyZW5jZXMvTWFwc0NvbG9yc1ByZWZlcmVuY2VQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ByZWZlcmVuY2VzL01hcHNDb2xvcnNQcmVmZXJlbmNlUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOTFjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ByZWZlcmVuY2VzL01hcHNDb2xvcnNQcmVmZXJlbmNlUGFnZS5qYXZhCkBAIC0wLDAgKzEsMjEzIEBACisvLyBNYXBzQ29sb3JzUHJlZmVyZW5jZVBhZ2UuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnByZWZlcmVuY2VzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Db2xvckZpZWxkRWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlN0cmluZ0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5Db2xvclByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuSVByZWZlcmVuY2VzQ29udHJpYnV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5SZWxhdGl2ZVZhbHVlQ29sb3JQcmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHByZWZlcmVuY2UgcGFnZSBmb3IgTWFwcyBDb2xvcnMuIEl0IGhvbGRzIGNvbW1vbiBtYXBzIGNvbG9ycworICogcHJlZmVyZW5jZXMgYW5kIGFuIGV4dGVuc2lvbiBwb2ludCB3aGVyZSBvdGhlciBwcmVmZXJlbmNlcyBjb250cmlidXRlcnMgKAorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuQ29sb3JQcm92aWRlcn1zKSBjYW4gYWRkIHRoZWlyIG93bgorICogcHJlZmVyZW5jZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBNYXBzQ29sb3JzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlCisJCWltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKKworCS8qKgorCSAqIElEIGZvciB0aGUgdGhpcyBwcmVmZXJlbmNlIHBhZ2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9TVEVNX01BUFNfQ09MT1JTX1BBR0UgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5NYXBzQ29sb3JzUHJlZmVyZW5jZVBhZ2UiOworCS8qKgorCSAqIElEIGZvciB0aGUgZm9yZWdyb3VuZCBjb2xvciBmaWVsZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfQ09MT1JfSUQgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlcy5mb3JlZ3JvdW5kY29sb3IiOworCS8qKgorCSAqIElEIGZvciB0aGUgYmFja2dyb3VuZCBjb2xvciBmaWVsZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tHUk9VTkRfQ09MT1JfSUQgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlcy5iYWNrZ3JvdW5kY29sb3IiOworCS8qKgorCSAqIElEIGZvciB0aGUgYm9yZGVycyBjb2xvciBmaWVsZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPUkRFUlNfQ09MT1JfSUQgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlcy5ib3JkZXJzY29sb3IiOworCS8qKgorCSAqIElEIGZvciB0aGUgZWRnZXMgY29sb3IgZmllbGQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFREdFU19DT0xPUl9JRCA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLmVkZ2VzY29sb3IiOworCS8qKgorCSAqIERlZmF1bHQgZm9yZWdyb3VuZCBjb2xvcgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfQ09MT1JfREVGQVVMVF9SR0JfU1RSSU5HID0gIjI1NSwwLDAiOyAvLyBEZWZhdWx0CisJLy8gaXMKKwkvLyBSZWQKKwkvKioKKwkgKiBEZWZhdWx0IGJhY2tncm91bmQgY29sb3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLR1JPVU5EX0NPTE9SX0RFRkFVTFRfUkdCX1NUUklORyA9ICIwLDAsMCI7IC8vIERlZmF1bHQKKwkvLyBpcworCS8vIEJsYWNrCisJLyoqCisJICogRGVmYXVsdCBib3JkZXJzIGNvbG9yCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9SREVSU19DT0xPUl9ERUZBVUxUX1JHQl9TVFJJTkcgPSAiMCw4MCw4MCI7IC8vIERlZmF1bHQKKwkvLyBpcworCS8vIERhcmsgYmx1ZSBncmVlbgorCS8qKgorCSAqIERlZmF1bHQgYm9yZGVycyBjb2xvcgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVER0VTX0NPTE9SX0RFRkFVTFRfUkdCX1NUUklORyA9ICIyNTUsMCwyNTUiOyAvLyBEZWZhdWx0CisJLy8gaXMKKwkvLyBNYWdlbnRhCisJLyoqCisJICogVGhlIGNvbG9yIGZpZWxkIGVkaXRvciBmb3IgdGhlIGJhY2tncm91bmQgY29sb3IKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBDb2xvckZpZWxkRWRpdG9yIGJhY2tncm91bmRDb2xvckZpZWxkRWRpdG9yOworCS8qKgorCSAqIFRoZSBjb2xvciBmaWVsZCBlZGl0b3IgZm9yIHRoZSBmb3JlZ3JvdW5kIGNvbG9yCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQ29sb3JGaWVsZEVkaXRvciBmb3JlZ3JvdW5kQ29sb3JGaWVsZEVkaXRvcjsKKwkvKioKKwkgKiBUaGUgY29sb3IgZmllbGQgZWRpdG9yIGZvciB0aGUgYm9yZGVycyBjb2xvcgorCSAqLworCXByaXZhdGUgc3RhdGljIENvbG9yRmllbGRFZGl0b3IgYm9yZGVyc0NvbG9yRmllbGRFZGl0b3I7CisJLyoqCisJICogVGhlIGNvbG9yIGZpZWxkIGVkaXRvciBmb3IgdGhlIGVkZ2VzIGNvbG9yCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQ29sb3JGaWVsZEVkaXRvciBlZGdlc0NvbG9yRmllbGRFZGl0b3I7CisJLyoqCisJICogVGhlIGxpc3Qgb2Yge0BsaW5rIElQcmVmZXJlbmNlc0NvbnRyaWJ1dGVyfXMKKwkgKi8KKwlwcml2YXRlIGZpbmFsIExpc3Q8SVByZWZlcmVuY2VzQ29udHJpYnV0ZXI+IHByZWZlcmVuY2VzRXh0ZW5kZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PElQcmVmZXJlbmNlc0NvbnRyaWJ1dGVyPigpOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgTWFwc0NvbG9yc1ByZWZlcmVuY2VQYWdlKCkgeworCQlzdXBlcihHUklEKTsKKwkJc2V0UHJlZmVyZW5jZVN0b3JlKEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOworCQlzZXREZXNjcmlwdGlvbigiQ2hvb3NlIHRoZSBjb2xvcnMgdG8gYmUgdXNlZCBmb3IgZHJhd2luZyBtYXBzIik7CisKKwkJLy8gVE9ETyBzdXBwb3J0IGV4dGVuc2lvbi1wb2ludHMgbWVjaGFuaXNtCisJCWZpbmFsIElQcmVmZXJlbmNlc0NvbnRyaWJ1dGVyIHByZWZlcmVuY2VzRXh0ZW5kZXIgPSBuZXcgUmVsYXRpdmVWYWx1ZUNvbG9yUHJlZmVyZW5jZXMoKTsKKwkJcHJlZmVyZW5jZXNFeHRlbmRlci5zZXRQcmVmZXJlbmNlUGFnZSh0aGlzKTsKKworCQlwcmVmZXJlbmNlc0V4dGVuZGVycy5hZGQocHJlZmVyZW5jZXNFeHRlbmRlcik7CisJfSAvLyBNYXBzQ29sb3JzUHJlZmVyZW5jZVBhZ2UKKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UjY3JlYXRlRmllbGRFZGl0b3JzKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7CisJCWJhY2tncm91bmRDb2xvckZpZWxkRWRpdG9yID0gbmV3IENvbG9yRmllbGRFZGl0b3IoQkFDS0dST1VORF9DT0xPUl9JRCwKKwkJCQkiQmFja2dyb3VuZCBDb2xvciIsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOworCQlmb3JlZ3JvdW5kQ29sb3JGaWVsZEVkaXRvciA9IG5ldyBDb2xvckZpZWxkRWRpdG9yKEZPUkVHUk9VTkRfQ09MT1JfSUQsCisJCQkJIkZvcmVncm91bmQgQ29sb3IiLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKKwkJYm9yZGVyc0NvbG9yRmllbGRFZGl0b3IgPSBuZXcgQ29sb3JGaWVsZEVkaXRvcihCT1JERVJTX0NPTE9SX0lELAorCQkJCSJCb3JkZXJzIENvbG9yIiwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7CisJCWVkZ2VzQ29sb3JGaWVsZEVkaXRvciA9IG5ldyBDb2xvckZpZWxkRWRpdG9yKEVER0VTX0NPTE9SX0lELAorCQkJCSJFZGdlcyBDb2xvciIsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOworCisJCWFkZEZpZWxkKGJhY2tncm91bmRDb2xvckZpZWxkRWRpdG9yKTsKKwkJYWRkRmllbGQoZm9yZWdyb3VuZENvbG9yRmllbGRFZGl0b3IpOworCQlhZGRGaWVsZChib3JkZXJzQ29sb3JGaWVsZEVkaXRvcik7CisJCWFkZEZpZWxkKGVkZ2VzQ29sb3JGaWVsZEVkaXRvcik7CisKKwkJZm9yIChmaW5hbCBJUHJlZmVyZW5jZXNDb250cmlidXRlciBwcmVmZXJlbmNlc0V4dGVuZGVyIDogcHJlZmVyZW5jZXNFeHRlbmRlcnMpIHsKKwkJCXByZWZlcmVuY2VzRXh0ZW5kZXIuY3JlYXRlRmllbGRFZGl0b3JzKCk7CisJCX0KKwl9IC8vIGNyZWF0ZUZpZWxkRWRpdG9ycworCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSNpbml0aWFsaXplKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQlmb3IgKGZpbmFsIElQcmVmZXJlbmNlc0NvbnRyaWJ1dGVyIHByZWZlcmVuY2VzRXh0ZW5kZXIgOiBwcmVmZXJlbmNlc0V4dGVuZGVycykgeworCQkJcHJlZmVyZW5jZXNFeHRlbmRlci5pbml0aWFsaXplKCk7CisJCX0KKwkJc3VwZXIuaW5pdGlhbGl6ZSgpOworCX0gLy8gaW5pdGlhbGl6ZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UjcHJvcGVydHlDaGFuZ2Uob3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKGZpbmFsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJZm9yIChmaW5hbCBJUHJlZmVyZW5jZXNDb250cmlidXRlciBwcmVmZXJlbmNlc0V4dGVuZGVyIDogcHJlZmVyZW5jZXNFeHRlbmRlcnMpIHsKKwkJCXByZWZlcmVuY2VzRXh0ZW5kZXIucHJvcGVydHlDaGFuZ2UoZXZlbnQpOworCQl9CisJCXN1cGVyLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKKwl9IC8vIHByb3BlcnR5Q2hhbmdlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKKwkJZm9yZWdyb3VuZENvbG9yRmllbGRFZGl0b3IuZ2V0Q29sb3JTZWxlY3RvcigpLnNldENvbG9yVmFsdWUoCisJCQkJU3RyaW5nQ29udmVydGVyLmFzUkdCKEZPUkVHUk9VTkRfQ09MT1JfREVGQVVMVF9SR0JfU1RSSU5HKSk7CisJCWJhY2tncm91bmRDb2xvckZpZWxkRWRpdG9yLmdldENvbG9yU2VsZWN0b3IoKS5zZXRDb2xvclZhbHVlKAorCQkJCVN0cmluZ0NvbnZlcnRlci5hc1JHQihCQUNLR1JPVU5EX0NPTE9SX0RFRkFVTFRfUkdCX1NUUklORykpOworCQlib3JkZXJzQ29sb3JGaWVsZEVkaXRvci5nZXRDb2xvclNlbGVjdG9yKCkuc2V0Q29sb3JWYWx1ZSgKKwkJCQlTdHJpbmdDb252ZXJ0ZXIuYXNSR0IoQk9SREVSU19DT0xPUl9ERUZBVUxUX1JHQl9TVFJJTkcpKTsKKwkJZWRnZXNDb2xvckZpZWxkRWRpdG9yLmdldENvbG9yU2VsZWN0b3IoKS5zZXRDb2xvclZhbHVlKAorCQkJCVN0cmluZ0NvbnZlcnRlci5hc1JHQihFREdFU19DT0xPUl9ERUZBVUxUX1JHQl9TVFJJTkcpKTsKKworCQlmb3IgKGZpbmFsIElQcmVmZXJlbmNlc0NvbnRyaWJ1dGVyIHByZWZlcmVuY2VzRXh0ZW5kZXIgOiBwcmVmZXJlbmNlc0V4dGVuZGVycykgeworCQkJcHJlZmVyZW5jZXNFeHRlbmRlci5wZXJmb3JtRGVmYXVsdHMoKTsKKwkJfQorCX0gLy8gcGVyZm9ybURlZmF1bHRzCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCisJICovCisJcHVibGljIHZvaWQgaW5pdChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwlmaW5hbCBJV29ya2JlbmNoIGFyZzApIHsKKwkJLy8gRG8gbm90aGluZworCX0gLy8gaW5pdAorCisJLyoqCisJICogVGhpcyBtYWtlcyBhZGRGaWVsZCBwdWJsaWMKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBhZGRGaWVsZChmaW5hbCBGaWVsZEVkaXRvciBlZGl0b3IpIHsKKwkJc3VwZXIuYWRkRmllbGQoZWRpdG9yKTsKKwl9IC8vIGFkZEZpZWxkCisKKwkvKioKKwkgKiBUaGlzIG1ha2VzIGdldEZpZWxkRWRpdG9yUGFyZW50IHB1YmxpYworCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDb21wb3NpdGUgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSB7CisJCXJldHVybiBzdXBlci5nZXRGaWVsZEVkaXRvclBhcmVudCgpOworCX0gLy8gZ2V0RmllbGRFZGl0b3JQYXJlbnQKKworfSAvLyBNYXBzQ29sb3JzUHJlZmVyZW5jZVBhZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcHJlZmVyZW5jZXMvTWVzc2FnZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcHJlZmVyZW5jZXMvTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzhlYjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wcmVmZXJlbmNlcy9NZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8vIE1lc3NhZ2VzLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJldHJpZXZlcyBtZXNzYWdlcyBmb3IgU1RFTSBwcmVmZXJlbmNlcy4KKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCisJCQkuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKKworCXByaXZhdGUgTWVzc2FnZXMoKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0ga2V5CisJICogQHJldHVybiB0aGUgc3RyaW5nIG1hdGNoaW5nIHRoZSBrZXkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9Cit9IC8vIE1lc3NhZ2VzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMDRlNzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDExMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnByZWZlcmVuY2VzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBDb25zdGFudCBkZWZpbml0aW9ucyBmb3IgcGx1Zy1pbiBwcmVmZXJlbmNlcworICovCitwdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUNvbnN0YW50cyB7CisKKwkvKioKKwkgKiBUaGUgcHJlZmVyZW5jZSBpZCBmb3IgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBkaXNwbGF5IHdoZW4gYQorCSAqIHZpc3VhbGl6YXRpb24gaXMgZmlyc3QgZGlzcGxheWVkLiBVc2VkIGZvciBEYXRhIERpc3BsYXkgWSBheGlzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxfQVRUUklCVVRFX05BTUVfU1RSSU5HX1BSRUZFUkVOQ0UgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS5pbml0aWFsYXR0cmlidXRlbmFtZSI7CisKKworCS8qKgorCSAqIFRoZSBwcmVmZXJlbmNlIGlkIGZvciB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGRpc3BsYXkgd2hlbiBhCisJICogdmlzdWFsaXphdGlvbiBpcyBmaXJzdCBkaXNwbGF5ZWQuIFVzZWQgZm9yIFBoYXNlIFNwYWNlIERpc3BsYXkgWCBheGlzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxfQVRUUklCVVRFX05BTUVfU1RSSU5HX1BSRUZFUkVOQ0UyID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkuaW5pdGlhbGF0dHJpYnV0ZW5hbWUyIjsKKworCQorCS8qKgorCSAqIFRoZSBwcmVmZXJlbmNlIGlkIGZvciBkaWZmZXJlbnQgZm9yZWdyb3VuZCBjb2xvcnMgZm9yIHZhcmlvdXMgbGFiZWxzLiBJZgorCSAqIGEgbGFiZWwgaXMgbm90IG9uIHRoZSBsaXN0LCBmb3JlZ3JvdW5kIGNvbG9yIHVzZXMgdGhlIGRlZmF1bHQuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9DT0xPUl9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAucHJlZmVyZW5jZXMuZm9yZWdyb3VuZGRlZmF1bHRjb2xvciI7CisJLyoqCisJICogVGhlIHByZWZlcmVuY2UgSUQgZm9yIGEgZmlyc3QgdXNlciBzZWxlY3RhYmxlIGNvbG9yIHRoYXQgY2FuIGJlIGNob3NlbiBhbmQgYXNzaWduZWQgdG8gYSBwcm9wZXJ0eSAoZS5nLiwgUykgYmVpbmcgdmlzdWFsaXplZCAoZWcgaW4gYSB0aW1lIHNlcmllcyBwbG90KQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfQ09MT1JfTEFCRUxfMSA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLmZvcmVncm91bmRjb2xvcm9uZSI7CisJLyoqCisJICogIFRoZSBwcmVmZXJlbmNlIElEIGZvciBhIHNlY29uZCB1c2VyIHNlbGVjdGFibGUgY29sb3IgdGhhdCBjYW4gYmUgY2hvc2VuIGFuZCBhc3NpZ25lZCB0byBhIHByb3BlcnR5IChlLmcuLCBFKSBiZWluZyB2aXN1YWxpemVkIChlZyBpbiBhIHRpbWUgc2VyaWVzIHBsb3QpCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9DT0xPUl9MQUJFTF8yID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAucHJlZmVyZW5jZXMuZm9yZWdyb3VuZGNvbG9ydHdvIjsKKwkvKioKKwkgKiAgVGhlIHByZWZlcmVuY2UgSUQgZm9yIGEgdGhpcmQgdXNlciBzZWxlY3RhYmxlIGNvbG9yIHRoYXQgY2FuIGJlIGNob3NlbiBhbmQgYXNzaWduZWQgdG8gYSBwcm9wZXJ0eSAoZS5nLiwgSSkgYmVpbmcgdmlzdWFsaXplZCAoZWcgaW4gYSB0aW1lIHNlcmllcyBwbG90KQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfQ09MT1JfTEFCRUxfMyA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLmZvcmVncm91bmRjb2xvcnRoZWUiOworCS8qKgorCSAqICBUaGUgcHJlZmVyZW5jZSBJRCBmb3IgYSBmb3VydGggdXNlciBzZWxlY3RhYmxlIGNvbG9yIHRoYXQgY2FuIGJlIGNob3NlbiBhbmQgYXNzaWduZWQgdG8gYSBwcm9wZXJ0eSAoZS5nLiwgUikgYmVpbmcgdmlzdWFsaXplZCAoZWcgaW4gYSB0aW1lIHNlcmllcyBwbG90KQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfQ09MT1JfTEFCRUxfNCA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLmZvcmVncm91bmRjb2xvcmZvdXIiOworCS8qKgorCSAqICBUaGUgcHJlZmVyZW5jZSBJRCBmb3IgYSBmaWZ0aCB1c2VyIHNlbGVjdGFibGUgY29sb3IgdGhhdCBjYW4gYmUgY2hvc2VuIGFuZCBhc3NpZ25lZCB0byBhIHByb3BlcnR5IChlLmcuLCBQKSBiZWluZyB2aXN1YWxpemVkIChlZyBpbiBhIHRpbWUgc2VyaWVzIHBsb3QpCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9DT0xPUl9MQUJFTF81ID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAucHJlZmVyZW5jZXMuZm9yZWdyb3VuZGNvbG9yZml2ZSI7CisJLyoqCisJICogIFRoZSBwcmVmZXJlbmNlIElEIGZvciBhIHNpeHRoIHVzZXIgc2VsZWN0YWJsZSBjb2xvciB0aGF0IGNhbiBiZSBjaG9zZW4gYW5kIGFzc2lnbmVkIHRvIGEgcHJvcGVydHkgKGUuZy4sIElSKSBiZWluZyB2aXN1YWxpemVkIChlZyBpbiBhIHRpbWUgc2VyaWVzIHBsb3QpCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9DT0xPUl9MQUJFTF82ID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAucHJlZmVyZW5jZXMuZm9yZWdyb3VuZGNvbG9yc2l4IjsKKwkvKioKKwkgKiAgVGhlIHByZWZlcmVuY2UgSUQgZm9yIGEgc2V2ZW50aCB1c2VyIHNlbGVjdGFibGUgY29sb3IgdGhhdCBjYW4gYmUgY2hvc2VuIGFuZCBhc3NpZ25lZCB0byBhIHByb3BlcnR5IChlLmcuLCApIGJlaW5nIHZpc3VhbGl6ZWQgKGVnIGluIGEgdGltZSBzZXJpZXMgcGxvdCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EX0NPTE9SX0xBQkVMXzcgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlcy5mb3JlZ3JvdW5kY29sb3JzZXZlbiI7CisKKwkKKwkvKioKKwkgKiBUaGUgcHJlZmVyZW5jZSBpZCBmb3IgZGlmZmVyZW50IHN0cmluZ3MgcmVwcmVzZW50aW5nIHZhcmlvdXMgbGFiZWxzLiBJZiBhCisJICogbGFiZWwgaXMgbm90IG9uIHRoZSBsaXN0LCBmb3JlZ3JvdW5kIGNvbG9yIHVzZXMgdGhlIGRlZmF1bHQuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLmZvcmVncm91bmRkZWZhdWx0c3RyaW5nIjsKKwkvKioKKwkgKiBBIFN0cmluZyBsYWJlbCB0aGF0IGRlZmluZXMgdGhlIHVzZXIgc2VsZWN0YWJsZSBwcm9wZXJ0eSB0byB3aGljaCBhIHVzZXIgc2VsZWN0YWJsZSBjb2xvciBjYW4gYmUgYXNzaWduZWQgKGUuZy4sIHdoZW4gdmlzdWFsaXppbmcgdGhlIHByb3BlcnR5IGluIGEgcGxvdCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EX1NUUklOR19MQUJFTF8xID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAucHJlZmVyZW5jZXMuZm9yZWdyb3VuZHN0cmluZ29uZSI7CisJLyoqCisJICogQSBTdHJpbmcgbGFiZWwgdGhhdCBkZWZpbmVzIHRoZSB1c2VyIHNlbGVjdGFibGUgcHJvcGVydHkgdG8gd2hpY2ggYSB1c2VyIHNlbGVjdGFibGUgY29sb3IgY2FuIGJlIGFzc2lnbmVkIChlLmcuLCB3aGVuIHZpc3VhbGl6aW5nIHRoZSBwcm9wZXJ0eSBpbiBhIHBsb3QpCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfMiA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLmZvcmVncm91bmRzdHJpbmd0d28iOworCS8qKgorCSAqIEEgU3RyaW5nIGxhYmVsIHRoYXQgZGVmaW5lcyB0aGUgdXNlciBzZWxlY3RhYmxlIHByb3BlcnR5IHRvIHdoaWNoIGEgdXNlciBzZWxlY3RhYmxlIGNvbG9yIGNhbiBiZSBhc3NpZ25lZCAoZS5nLiwgd2hlbiB2aXN1YWxpemluZyB0aGUgcHJvcGVydHkgaW4gYSBwbG90KQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfU1RSSU5HX0xBQkVMXzMgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlcy5mb3JlZ3JvdW5kc3RyaW5ndGhlZSI7CisJLyoqCisJICogQSBTdHJpbmcgbGFiZWwgdGhhdCBkZWZpbmVzIHRoZSB1c2VyIHNlbGVjdGFibGUgcHJvcGVydHkgdG8gd2hpY2ggYSB1c2VyIHNlbGVjdGFibGUgY29sb3IgY2FuIGJlIGFzc2lnbmVkIChlLmcuLCB3aGVuIHZpc3VhbGl6aW5nIHRoZSBwcm9wZXJ0eSBpbiBhIHBsb3QpCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfNCA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLmZvcmVncm91bmRzdHJpbmdmb3VyIjsKKwkvKioKKwkgKiBBIFN0cmluZyBsYWJlbCB0aGF0IGRlZmluZXMgdGhlIHVzZXIgc2VsZWN0YWJsZSBwcm9wZXJ0eSB0byB3aGljaCBhIHVzZXIgc2VsZWN0YWJsZSBjb2xvciBjYW4gYmUgYXNzaWduZWQgKGUuZy4sIHdoZW4gdmlzdWFsaXppbmcgdGhlIHByb3BlcnR5IGluIGEgcGxvdCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EX1NUUklOR19MQUJFTF81ID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAucHJlZmVyZW5jZXMuZm9yZWdyb3VuZHN0cmluZ2ZpdmUiOworCS8qKgorCSAqIEEgU3RyaW5nIGxhYmVsIHRoYXQgZGVmaW5lcyB0aGUgdXNlciBzZWxlY3RhYmxlIHByb3BlcnR5IHRvIHdoaWNoIGEgdXNlciBzZWxlY3RhYmxlIGNvbG9yIGNhbiBiZSBhc3NpZ25lZCAoZS5nLiwgd2hlbiB2aXN1YWxpemluZyB0aGUgcHJvcGVydHkgaW4gYSBwbG90KQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfU1RSSU5HX0xBQkVMXzYgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlcy5mb3JlZ3JvdW5kc3RyaW5nc2l4IjsKKwkvKioKKwkgKiBBIFN0cmluZyBsYWJlbCB0aGF0IGRlZmluZXMgdGhlIHVzZXIgc2VsZWN0YWJsZSBwcm9wZXJ0eSB0byB3aGljaCBhIHVzZXIgc2VsZWN0YWJsZSBjb2xvciBjYW4gYmUgYXNzaWduZWQgKGUuZy4sIHdoZW4gdmlzdWFsaXppbmcgdGhlIHByb3BlcnR5IGluIGEgcGxvdCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EX1NUUklOR19MQUJFTF83ID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAucHJlZmVyZW5jZXMuZm9yZWdyb3VuZHN0cmluZ3NldmVuIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHByZWZlcmVuY2UgZm9yIGhvdyBtYW55IHRocmVhZHMgdG8gdXNlIHdoZW4gcnVubmluZworCSAqIGEgc2ltdWxhdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTVVMQVRJT05fVEhSRUFEUyA9ICJzaW11bGF0aW9uVGhyZWFkcyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHByZWZlcmVuY2UgZm9yIHdoaWNoIGRlZmF1bHQgc29sdmVyIHRvIHVzZSAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NPTFZFUiA9ICJkZWZhdWx0U29sdmVyIjsgLy8kTk9OLU5MUy0xJAorCit9IC8vIFByZWZlcmVuY2VDb25zdGFudHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNDBjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CisKKy8qKgorICogQ2xhc3MgdXNlZCB0byBpbml0aWFsaXplIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgW10gVU5JWF9PUyA9IHsiTGludXgiLCAiVW5peCJ9OworCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7CisJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOworCQkvLyBmb3IgbWFwIGFuZCB5LWF4aXMgZGF0YSBkaXNwbGF5CisJCXN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5JTklUSUFMX0FUVFJJQlVURV9OQU1FX1NUUklOR19QUkVGRVJFTkNFLAorCQkJCQkJVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlLkRFRkFVTFRfSU5JVElBTF9BVFRSSUJVVEVfTkFNRV9TVFJJTkcpOworCQkKKwkJLy8gZm9yIHBoYXNlIHNwYWNlIGRpc3BsYXkgb25seSAoeC1heGlzIGluaXRpYWwpCisJCXN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5JTklUSUFMX0FUVFJJQlVURV9OQU1FX1NUUklOR19QUkVGRVJFTkNFMiwKKwkJCQlWaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UuREVGQVVMVF9JTklUSUFMX0FUVFJJQlVURV9OQU1FX1NUUklORzIpOworCisJCQorCQkvLyBTZXQgdXAgdGhlIGRlZmF1bHQgY29sb3IgdmFsdWVzIHdoaWNoIHdlIHdpbGwgYXNzaWduIHRvIGxhYmVscworCQlzdG9yZS5zZXREZWZhdWx0KFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9DT0xPUl9ERUZBVUxULAorCQkJCVZpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZS5GT1JFR1JPVU5EX0NPTE9SX0RFRkFVTFRfUkdCX1NUUklORyk7CisJCXN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5GT1JFR1JPVU5EX0NPTE9SX0xBQkVMXzEsCisJCQkJVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlLkZPUkVHUk9VTkRfQ09MT1JfMV9SR0JfU1RSSU5HKTsKKwkJc3RvcmUuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfQ09MT1JfTEFCRUxfMiwKKwkJCQlWaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UuRk9SRUdST1VORF9DT0xPUl8yX1JHQl9TVFJJTkcpOworCQlzdG9yZS5zZXREZWZhdWx0KFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9DT0xPUl9MQUJFTF8zLAorCQkJCVZpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZS5GT1JFR1JPVU5EX0NPTE9SXzNfUkdCX1NUUklORyk7CisJCXN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5GT1JFR1JPVU5EX0NPTE9SX0xBQkVMXzQsCisJCQkJVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlLkZPUkVHUk9VTkRfQ09MT1JfNF9SR0JfU1RSSU5HKTsKKwkJc3RvcmUuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfQ09MT1JfTEFCRUxfNSwKKwkJCQlWaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UuRk9SRUdST1VORF9DT0xPUl81X1JHQl9TVFJJTkcpOworCQlzdG9yZS5zZXREZWZhdWx0KFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9DT0xPUl9MQUJFTF82LAorCQkJCVZpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZS5GT1JFR1JPVU5EX0NPTE9SXzZfUkdCX1NUUklORyk7CisJCXN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5GT1JFR1JPVU5EX0NPTE9SX0xBQkVMXzcsCisJCQkJVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlLkZPUkVHUk9VTkRfQ09MT1JfN19SR0JfU1RSSU5HKTsKKwkJCisJCS8vIFNldCB1cCB0aGUgZGVmYXVsdCBzdHJpbmcgdmFsdWVzIHdoaWNoIHdlIHdpbGwgYXNzaWduIHRvIGxhYmVscworCQlzdG9yZS5zZXREZWZhdWx0KFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfREVGQVVMVCwKKwkJCQlWaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UuRk9SRUdST1VORF9BVFRSSUJVVEVfTkFNRV9ERUZBVUxUX1NUUklORyk7CisJCXN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5GT1JFR1JPVU5EX1NUUklOR19MQUJFTF8xLAorCQkJCVZpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZS5GT1JFR1JPVU5EX0FUVFJJQlVURV9OQU1FXzFfU1RSSU5HKTsKKwkJc3RvcmUuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfU1RSSU5HX0xBQkVMXzIsCisJCQkJVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlLkZPUkVHUk9VTkRfQVRUUklCVVRFX05BTUVfMl9TVFJJTkcpOworCQlzdG9yZS5zZXREZWZhdWx0KFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfMywKKwkJCQlWaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UuRk9SRUdST1VORF9BVFRSSUJVVEVfTkFNRV8zX1NUUklORyk7CisJCXN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5GT1JFR1JPVU5EX1NUUklOR19MQUJFTF80LAorCQkJCVZpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZS5GT1JFR1JPVU5EX0FUVFJJQlVURV9OQU1FXzRfU1RSSU5HKTsKKwkJc3RvcmUuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfU1RSSU5HX0xBQkVMXzUsCisJCQkJVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlLkZPUkVHUk9VTkRfQVRUUklCVVRFX05BTUVfNV9TVFJJTkcpOworCQlzdG9yZS5zZXREZWZhdWx0KFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfNiwKKwkJCQlWaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UuRk9SRUdST1VORF9BVFRSSUJVVEVfTkFNRV82X1NUUklORyk7CisJCXN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5GT1JFR1JPVU5EX1NUUklOR19MQUJFTF83LAorCQkJCVZpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZS5GT1JFR1JPVU5EX0FUVFJJQlVURV9OQU1FXzdfU1RSSU5HKTsKKworCQkKKwkJLy8gc3RvcmUuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLlBfQk9PTEVBTiwgdHJ1ZSk7CisJCS8vIHN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5QX0NIT0lDRSwgImNob2ljZTIiKTsKKwkJLy8gc3RvcmUuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLlBfU1RSSU5HLAorCQkvLyAiRGVmYXVsdCB2YWx1ZSIpOworCQkKKwkJLy8gR2V0ICMgb2YgcHJvY2Vzc29ycyBmcm9tIE9TIGhlcmUgaWYgcG9zc2libGUKKwkJCisJCVN0cmluZyBvc05hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKKwkJc2hvcnQgbnVtVGhyZWFkcyA9IHRoaXMuZ2V0TnVtQ1BVcyhvc05hbWUpOworCQlpZihudW1UaHJlYWRzID09IDApIG51bVRocmVhZHMgPSBTb2x2ZXJQcmVmZXJlbmNlUGFnZS5ERUZBVUxUX1NJTVVMQVRJT05fVEhSRUFEUzsKKwkJc3RvcmUKKwkJLnNldERlZmF1bHQoCisJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5TSU1VTEFUSU9OX1RIUkVBRFMsCisJCQkJU29sdmVyUHJlZmVyZW5jZVBhZ2UuREVGQVVMVF9TSU1VTEFUSU9OX1RIUkVBRFMpOworCQkKKwkJLy8gU2V0IHRoZSBkZWZhdWx0IHNvbHZlciB0byBGaW5pdGUgRGlmZmVyZW5jZQorCQlzdG9yZQorCQkuc2V0RGVmYXVsdCgKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLkRFRkFVTFRfU09MVkVSLAorCQkJCVNvbHZlclByZWZlcmVuY2VQYWdlLkRFRkFVTFRfU09MVkVSKTsKKwkJCisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBudW1iZXIgb2YgQ1BVcyBhdmFpbGFibGUgb24gdGhlIGhhcmR3YXJlIChpZiBwb3NzaWJsZSkKKwkgKiAKKwkgKiBAcGFyYW0gb3MKKwkgKiBAcmV0dXJuIHNob3J0IE51bWJlciBvZiBDUFVzLCBvciAwIGlmIG5vdCBmb3VuZAorCSAqLworCXByaXZhdGUgc2hvcnQgZ2V0TnVtQ1BVcyhTdHJpbmcgb3MpIHsKKwkJLy8gT25seSBmb3IgdW5peCBvcyBmb3Igbm93CisJCWJvb2xlYW4gdW5peCA9IGZhbHNlOworCQlmb3IoU3RyaW5nIG8gOiBVTklYX09TKSBpZihvcy5lcXVhbHNJZ25vcmVDYXNlKG8pKSB1bml4ID0gdHJ1ZTsKKwkJaWYoIXVuaXgpIHJldHVybiAwOyAKKwkJLy8gRm9yIHVuaXgsIGdldCB0aGUgQ1BVJ3MgZnJvbSAvcHJvYy9jcHVpbmZvCisKKwkJc2hvcnQgbnVtQ1BVcyA9IDA7CisJCUJ1ZmZlcmVkUmVhZGVyIGZpbGVSZWFkZXIgPSBudWxsOworCQl0cnkgeworCQkJZmlsZVJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcigiL3Byb2MvY3B1aW5mbyIpKTsKKworCQkJaWYgKGZpbGVSZWFkZXIgIT0gbnVsbCkgeworCQkJCVN0cmluZyBidWZmZXIgPSBudWxsOworCQkJCXdoaWxlIChFT0YoYnVmZmVyID0gZmlsZVJlYWRlci5yZWFkTGluZSgpKSAhPSB0cnVlKSB7CisJCQkJCWlmKGJ1ZmZlci5zdGFydHNXaXRoKCJwcm9jZXNzb3IiKSkgKytudW1DUFVzOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKKwkJCS8vIElnbm9yZSwgdW5hYmxlIHRvIGRldGVybWluZSBudW1iZXIgb2YgcHJvY2Vzc29ycworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCS8vIElnbm9yZSwgdW5hYmxlIHRvIGRldGVybWluZSBudW1iZXIgb2YgcHJvY2Vzc29ycworCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlmaWxlUmVhZGVyLmNsb3NlKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCS8vIGV4Y2VwdGlvbiBvbiBjbG9zZSBkb2VzIG5vdCBtYXR0ZXIKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVtQ1BVczsKKwl9CisJCisJLyoqCisJIEBwYXJhbSBidWZmZXIKKwkgKiAgICAgICAgICAgIEEgYnVmZmVyIG9mIGRpdmEgZGF0YQorCSAqIAorCSAqIEByZXR1cm4gVHJ1ZSBpZiB3ZSBoYXZlIHJlYWNoZWQgRW5kLU9mLUZpbGUKKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIGJvb2xlYW4gRU9GKFN0cmluZyBidWZmZXIpIHsKKwkJaWYgKGJ1ZmZlciA9PSBudWxsKQorCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCit9IC8vIFByZWZlcmVuY2VJbml0aWFsaXplcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wcmVmZXJlbmNlcy9TVEVNUHJlZmVyZW5jZVBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcHJlZmVyZW5jZXMvU1RFTVByZWZlcmVuY2VQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhMGRkMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcHJlZmVyZW5jZXMvU1RFTVByZWZlcmVuY2VQYWdlLmphdmEKQEAgLTAsMCArMSw2NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnByZWZlcmVuY2VzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwcmVmZXJlbmNlIHBhZ2UgdGhhdCBpcyBjb250cmlidXRlZCB0byB0aGUKKyAqIFByZWZlcmVuY2VzIGRpYWxvZy4gQnkgc3ViLWNsYXNzaW5nIDxzYW1wPkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U8L3NhbXA+LAorICogd2UgY2FuIHVzZSB0aGUgZmllbGQgc3VwcG9ydCBidWlsdCBpbnRvIEpGYWNlIHRoYXQgYWxsb3dzIHVzIHRvIGNyZWF0ZSBhIHBhZ2UKKyAqIHRoYXQgaXMgc21hbGwgYW5kIGtub3dzIGhvdyB0byBzYXZlLCByZXN0b3JlIGFuZCBhcHBseSBpdHNlbGYuCisgKiA8cD4KKyAqIFRoaXMgcGFnZSBpcyB1c2VkIHRvIG1vZGlmeSBwcmVmZXJlbmNlcyBvbmx5LiBUaGV5IGFyZSBzdG9yZWQgaW4gdGhlCisgKiBwcmVmZXJlbmNlIHN0b3JlIHRoYXQgYmVsb25ncyB0byB0aGUgbWFpbiBwbHVnLWluIGNsYXNzLiBUaGF0IHdheSwKKyAqIHByZWZlcmVuY2VzIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSB2aWEgdGhlIHByZWZlcmVuY2Ugc3RvcmUuCisgKi8KKworcHVibGljIGNsYXNzIFNURU1QcmVmZXJlbmNlUGFnZSBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cworCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgeworCisJLyoqCisJICogVGhlIElEIG9mIHRoZSBTVEVNIFByZWZlcmVuY2UgcGFnZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9TVEVNX1BSRUZFUkVOQ0VfUEFHRSA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnByZWZlcmVuY2VzLlNURU1QcmVmZXJlbmNlUGFnZSI7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBTVEVNUHJlZmVyZW5jZVBhZ2UoKSB7CisJCXN1cGVyKEdSSUQpOworCQlzZXRQcmVmZXJlbmNlU3RvcmUoQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7CisJCXNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiU1RFTVBQYWdlLlNURU0iKSk7IC8vJE5PTi1OTFMtMSQKKwl9IC8vIFNURU1QcmVmZXJlbmNlUGFnZQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgZmllbGQgZWRpdG9ycy4gRmllbGQgZWRpdG9ycyBhcmUgYWJzdHJhY3Rpb25zIG9mIHRoZSBjb21tb24KKwkgKiBHVUkgYmxvY2tzIG5lZWRlZCB0byBtYW5pcHVsYXRlIHZhcmlvdXMgdHlwZXMgb2YgcHJlZmVyZW5jZXMuIEVhY2ggZmllbGQKKwkgKiBlZGl0b3Iga25vd3MgaG93IHRvIHNhdmUgYW5kIHJlc3RvcmUgaXRzZWxmLgorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKKwkJLy8gTm90aGluZworCX0gLy8gY3JlYXRlRmllbGRFZGl0b3JzCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCisJICovCisJcHVibGljIHZvaWQgaW5pdChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikvLyROT04tTkxTLTEkCisJCQlJV29ya2JlbmNoIHdvcmtiZW5jaCkgeworCQkvLyBOb3RoaW5nCisJfSAvLyBpbml0CisKK30gLy8gU1RFTVByZWZlcmVuY2VQYWdlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ByZWZlcmVuY2VzL1NvbHZlclByZWZlcmVuY2VQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ByZWZlcmVuY2VzL1NvbHZlclByZWZlcmVuY2VQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyZmNhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcHJlZmVyZW5jZXMvU29sdmVyUHJlZmVyZW5jZVBhZ2UuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnByZWZlcmVuY2VzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuQ29tYm9GaWVsZEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JbnRlZ2VyRmllbGRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwcmVmZXJlbmNlIHBhZ2UgdGhhdCBpcyBjb250cmlidXRlZCB0byB0aGUKKyAqIFByZWZlcmVuY2VzIGRpYWxvZy4gQnkgc3ViLWNsYXNzaW5nIDxzYW1wPkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U8L3NhbXA+LAorICogd2UgY2FuIHVzZSB0aGUgZmllbGQgc3VwcG9ydCBidWlsdCBpbnRvIEpGYWNlIHRoYXQgYWxsb3dzIHVzIHRvIGNyZWF0ZSBhIHBhZ2UKKyAqIHRoYXQgaXMgc21hbGwgYW5kIGtub3dzIGhvdyB0byBzYXZlLCByZXN0b3JlIGFuZCBhcHBseSBpdHNlbGYuCisgKiA8cD4KKyAqIFRoaXMgcGFnZSBpcyB1c2VkIHRvIG1vZGlmeSBwcmVmZXJlbmNlcyBvbmx5LiBUaGV5IGFyZSBzdG9yZWQgaW4gdGhlCisgKiBwcmVmZXJlbmNlIHN0b3JlIHRoYXQgYmVsb25ncyB0byB0aGUgbWFpbiBwbHVnLWluIGNsYXNzLiBUaGF0IHdheSwKKyAqIHByZWZlcmVuY2VzIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSB2aWEgdGhlIHByZWZlcmVuY2Ugc3RvcmUuCisgKi8KKworcHVibGljIGNsYXNzIFNvbHZlclByZWZlcmVuY2VQYWdlIGV4dGVuZHMKK0ZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUgZGVmYXVsdCBudW1iZXIgb2YgdGhyZWFkcyB0byB1c2Ugd2hlbiBydW5uaW5nCisJICogYSBzaW11bGF0aW9uLiBUaGUgZGVmYXVsdCBpcyB1c2VkIGlmIHRoZSBudW1iZXIgb2YgQ1BVcyBjYW5ub3QKKwkgKiBiZSBkZXRlY3RlZAorCSAqLworCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TSU1VTEFUSU9OX1RIUkVBRFMgPSAyOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgc29sdmVyLiBGaW5pdGUgZGlmZmVyZW5jZSBzb2x2ZXIgaXMKKwkgKiBhbHdheXMgYXNzdW1lZCB0byBiZSBhdmFpbGFibGUuCisJICovCisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NPTFZFUiA9ICJvcmcuZWNsaXBzZS5zdGVtLnNvbHZlcnMuZmQuaW1wbC5GaW5pdGVEaWZmZXJlbmNlSW1wbCI7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBTb2x2ZXJQcmVmZXJlbmNlUGFnZSgpIHsKKwkJc3VwZXIoR1JJRCk7CisJCXNldFByZWZlcmVuY2VTdG9yZShBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKKwkJc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJETVBQYWdlVElUTEUiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBmaWVsZCBlZGl0b3JzLiBGaWVsZCBlZGl0b3JzIGFyZSBhYnN0cmFjdGlvbnMgb2YgdGhlIGNvbW1vbgorCSAqIEdVSSBibG9ja3MgbmVlZGVkIHRvIG1hbmlwdWxhdGUgdmFyaW91cyB0eXBlcyBvZiBwcmVmZXJlbmNlcy4gRWFjaCBmaWVsZAorCSAqIGVkaXRvciBrbm93cyBob3cgdG8gc2F2ZSBhbmQgcmVzdG9yZSBpdHNlbGYuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3JlYXRlRmllbGRFZGl0b3JzKCkgeworCisJCWZpbmFsIEludGVnZXJGaWVsZEVkaXRvciBzaW11bGF0aW9uVGhyZWFkc0ZpZWxkRWRpdG9yID0gbmV3IEludGVnZXJGaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlNJTVVMQVRJT05fVEhSRUFEUywKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkRNUFBhZ2VTaW1UaHJlYWRzIiksIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOyAvLyROT04tTkxTLTEkCisKKwkJYWRkRmllbGQoc2ltdWxhdGlvblRocmVhZHNGaWVsZEVkaXRvcik7CisKKworCQlTb2x2ZXIgW10gc29sdmVycyA9IGdldFNvbHZlcnMoKTsKKwkJU3RyaW5nIFtdW10gbmFtZXNBbmRWYWx1ZXMgPSBuZXcgU3RyaW5nW3NvbHZlcnMubGVuZ3RoXVtzb2x2ZXJzLmxlbmd0aF07CisKKwkJZm9yKGludCBpPTA7aTxzb2x2ZXJzLmxlbmd0aDsrK2kpIHsKKwkJCW5hbWVzQW5kVmFsdWVzW2ldWzBdID0gc29sdmVyc1tpXS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKKwkJCW5hbWVzQW5kVmFsdWVzW2ldWzFdID0gc29sdmVyc1tpXS5nZXRDbGFzcygpLmdldE5hbWUoKTsKKwkJfQorCisJCWZpbmFsIENvbWJvRmllbGRFZGl0b3IgY29tYm9GaWVsZEVkaXRvciA9IG5ldyBDb21ib0ZpZWxkRWRpdG9yKAorCQkJCVByZWZlcmVuY2VDb25zdGFudHMuREVGQVVMVF9TT0xWRVIsCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJETVBQYWdlRGVmYXVsdFNvbHZlciIpLAorCQkJCW5hbWVzQW5kVmFsdWVzLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKKworCQlhZGRGaWVsZChjb21ib0ZpZWxkRWRpdG9yKTsKKworCX0gLy8gY3JlYXRlRmllbGRFZGl0b3JzCisKKwkvKioKKwkgKiBnZXRTb2x2ZXJzIFJldHVybiByZWdpc3RlcmVkIHNvbHZlcnMKKwkgKiAKKwkgKiBAcmV0dXJuIFNvbHZlciBbXSBBdmFpbGFibGUgc29sdmVycworCSAqLworCisJcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlciBbXSBnZXRTb2x2ZXJzKCkgeworCQlTb2x2ZXIgW10gc29sdmVyczsKKwkJZmluYWwgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKKwkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gc29sdmVyQ29uZmlnRWxlbWVudHMgPSByZWdpc3RyeQorCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHMuSURfU09MVkVSX0VYVEVOU0lPTl9QT0lOVCk7CisKKwkJZmluYWwgTGlzdDxTb2x2ZXI+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PFNvbHZlcj4oKTsKKworCQkvL3NvbHZlcnMgPSBuZXcgU29sdmVyW3NvbHZlckNvbmZpZ0VsZW1lbnRzLmxlbmd0aF07CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb2x2ZXJDb25maWdFbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBzb2x2ZXJDb25maWdFbGVtZW50c1tpXTsKKwkJCS8vIERvZXMgdGhlIGVsZW1lbnQgc3BlY2lmeSB0aGUgY2xhc3Mgb2YgdGhlIGRpc2Vhc2UgbW9kZWw/CisJCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKENvbnN0YW50cy5TT0xWRVJfRUxFTUVOVCkpIHsKKwkJCQkvLyBZZXMKKwkJCQl0cnkgeworCQkJCQl0ZW1wLmFkZCgoU29sdmVyKSBlbGVtZW50CisJCQkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIikpOyAvLyROT04tTkxTLTEkCisJCQkJfSBjYXRjaCAoZmluYWwgQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCUFjdGl2YXRvci5sb2dFcnJvcigKKwkJCQkJCQkiQ2FuJ3QgY3JlYXRlIHNvbHZlciIsIGUpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfSAvLyBpZgorCQl9IC8vIGZvciBlYWNoIGNvbmZpZ3VyYXRpb24gZWxlbWVudAorCisJCXNvbHZlcnMgPSB0ZW1wLnRvQXJyYXkobmV3IFNvbHZlcltdIHt9KTsKKworCQlyZXR1cm4gc29sdmVyczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCisJICovCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgeworCQkvLyBOb3RoaW5nCisJfQorCit9IC8vIFNpbXVsYXRpb25NYW5hZ2VtZW50UHJlZmVyZW5jZVBhZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcHJlZmVyZW5jZXMvVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ByZWZlcmVuY2VzL1Zpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NzliMTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ByZWZlcmVuY2VzL1Zpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhCkBAIC0wLDAgKzEsNDI4IEBACisvLyBWaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnByZWZlcmVuY2VzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkNvbG9yRmllbGRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuU3RyaW5nRmllbGRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuU3RyaW5nQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBwcmVmZXJlbmNlcyBmb3IgdmlzdWFsaXphdGlvbiBvZiBhIHNpbXVsYXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBWaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlCisJCWltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKKworCS8qKgorCSAqIFRoZSBJRCBvZiB0aGUgU1RFTSBQcmVmZXJlbmNlIHBhZ2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfU1RFTV9WSVNVQUxJWkFUSU9OX1BBR0UgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5WaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UiOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGRpc3BsYXkgZmlyc3QgaW4gYSB2aXN1YWxpemF0aW9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSU5JVElBTF9BVFRSSUJVVEVfTkFNRV9TVFJJTkcgPSAiSSI7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gZGlzcGxheSBmaXJzdCBpbiBhIHZpc3VhbGl6YXRpb24uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTklUSUFMX0FUVFJJQlVURV9OQU1FX1NUUklORzIgPSAiUyI7CisKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX05BTUVfRklFTERfV0lEVEggPSAxMTsKKworCS8qKgorCSAqIEEgbWFwcGluZyBiZXR3ZWVuIGF0dHJpYnV0ZSBuYW1lcyBhbmQgYXR0cmlidXRlIGNvbG9ycyBpcyBtYWludGFpbmVkIGluCisJICogdGhpcyBjb2xvciBwcmVmZXJlbmNlIG1hcC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBDb2xvcj4gY29sb3JQcmVmZXJlbmNlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2xvcj4oKTsKKworCS8qKgorCSAqIERlZmluZSBzZXZlcmFsIGxhYmVsIG5hbWVzIChzdHJpbmdzKSB0aGF0IG1pZ2h0IG5lZWQgdW5pcXVlIGZvcmVncm91bmQKKwkgKiBjb2xvciBhc3NpZ25tZW50cy4KKwkgKiAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EX0FUVFJJQlVURV9OQU1FX0RFRkFVTFRfU1RSSU5HID0gIkRFRkFVTFQiOworCisJLyoqCisJICogU3VzY2VwdGlibGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EX0FUVFJJQlVURV9OQU1FXzFfU1RSSU5HID0gIlMiOworCS8qKgorCSAqIEV4cG9zZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EX0FUVFJJQlVURV9OQU1FXzJfU1RSSU5HID0gIkUiOworCS8qKgorCSAqIEluZmVjdGlvdXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EX0FUVFJJQlVURV9OQU1FXzNfU1RSSU5HID0gIkkiOworCS8qKgorCSAqIFJlY292ZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfQVRUUklCVVRFX05BTUVfNF9TVFJJTkcgPSAiUiI7CisJLyoqCisJICogVG90YWwgUG9wdWxhdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfQVRUUklCVVRFX05BTUVfNV9TVFJJTkcgPSAiQ291bnQiOworCQorCS8qKgorCSAqIFBvcHVsYXRpb24gRGVuc2l0eQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfQVRUUklCVVRFX05BTUVfNl9TVFJJTkcgPSAiRGVuc2l0eSI7CisJLyoqCisJICogSW5mZWN0aW91cyB0aGF0IERpZSBvZiB0aGUgZGlzZWFzZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfQVRUUklCVVRFX05BTUVfN19TVFJJTkcgPSAiSW5jaWRlbmNlIjsKKworCS8qKgorCSAqIERlZmF1bHQgY29sb3IgCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9DT0xPUl9ERUZBVUxUX1JHQl9TVFJJTkcgPSAiMCwwLDE3MiI7CisKKwkvKioKKwkgKiBTIGNvbG9yID0gYmx1ZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfQ09MT1JfMV9SR0JfU1RSSU5HID0gIjAsMCwyNTUiOworCisJLyoqCisJICogRSBjb2xvciA9IHllbGxvdworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfQ09MT1JfMl9SR0JfU1RSSU5HID0gIjI1NSwyNTUsMCI7CisKKwkvKioKKwkgKiBJIGNvbG9yID0gcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9DT0xPUl8zX1JHQl9TVFJJTkcgPSAiMjU1LDAsMCI7CisKKwkvKioKKwkgKiBSIGNvbG9yID0gZ3JlZW4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EX0NPTE9SXzRfUkdCX1NUUklORyA9ICIwLDI1NSwwIjsKKworCS8qKgorCSAqIFAgKFBvcHVsYXRpb24pIGNvbG9yID0gd2hpdGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EX0NPTE9SXzVfUkdCX1NUUklORyA9ICIyNTUsMjU1LDI1NSI7CisJCisKKwkvKioKKwkgKiBEZW5zaXR5IChDeWFuKQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkRfQ09MT1JfNl9SR0JfU1RSSU5HID0gIjAsMjU1LDI1NSI7CisJCisKKwkvKioKKwkgKiBJbmNpZGVuY2UgY29sb3IgPSBncmV5CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9DT0xPUl83X1JHQl9TVFJJTkcgPSAiMjAwLDIwMCwyMDAiOworCisJLyoqCisJICogZGVmaW5lIHNldmVyYWwgcHJpbWFyeSBmb3JlZ3JvdW5kIGNvbG9ycyBlYWNoIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYSBkaWZmZXJlbnQgbGFiZWwKKwkgKiAoZS5nLiwgUyxFLEksUiwgUCwgSVIsIElGKSBJZiB0aGUgTGFiZWwgaXMgbm90IGZvdW5kLCB1c2UgdGhlIGRlZmF1bHQgZm9yZWdyb3VuZAorCSAqIGNvbG9yIGZpZWxkIGVkaXRvcgorCSAqLworCXByaXZhdGUgc3RhdGljIENvbG9yRmllbGRFZGl0b3IgZm9yZWdyb3VuZENvbG9yRmllbGRFZGl0b3JEZWZhdWx0OworCXByaXZhdGUgc3RhdGljIENvbG9yRmllbGRFZGl0b3IgZm9yZWdyb3VuZENvbG9yRmllbGRFZGl0b3IxOworCXByaXZhdGUgc3RhdGljIENvbG9yRmllbGRFZGl0b3IgZm9yZWdyb3VuZENvbG9yRmllbGRFZGl0b3IyOworCXByaXZhdGUgc3RhdGljIENvbG9yRmllbGRFZGl0b3IgZm9yZWdyb3VuZENvbG9yRmllbGRFZGl0b3IzOworCXByaXZhdGUgc3RhdGljIENvbG9yRmllbGRFZGl0b3IgZm9yZWdyb3VuZENvbG9yRmllbGRFZGl0b3I0OworCXByaXZhdGUgc3RhdGljIENvbG9yRmllbGRFZGl0b3IgZm9yZWdyb3VuZENvbG9yRmllbGRFZGl0b3I1OworCXByaXZhdGUgc3RhdGljIENvbG9yRmllbGRFZGl0b3IgZm9yZWdyb3VuZENvbG9yRmllbGRFZGl0b3I2OworCXByaXZhdGUgc3RhdGljIENvbG9yRmllbGRFZGl0b3IgZm9yZWdyb3VuZENvbG9yRmllbGRFZGl0b3I3OworCisJLyoqCisJICogRGVmaW5lIHNldmVyYWwgc3RyaW5nIGZpZWxkIGVkaXRvcnMgdG8gYXNzaWduIHN0cmluZyB2YWx1ZXMgdG8gdGhlIGxhYmVscworCSAqIHRoYXQgcmVxdWlyZSBjb2xvciBhc3NpZ25tZW50cworCSAqLworCS8vIHByaXZhdGUgU3RyaW5nRmllbGRFZGl0b3IgZm9yZWdyb3VuZExhYmVsRmllbGRFZGl0b3JEZWZhdWx0OworCXByaXZhdGUgc3RhdGljIFN0cmluZ0ZpZWxkRWRpdG9yIGZvcmVncm91bmRMYWJlbEZpZWxkRWRpdG9yMTsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmdGaWVsZEVkaXRvciBmb3JlZ3JvdW5kTGFiZWxGaWVsZEVkaXRvcjI7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nRmllbGRFZGl0b3IgZm9yZWdyb3VuZExhYmVsRmllbGRFZGl0b3IzOworCXByaXZhdGUgc3RhdGljIFN0cmluZ0ZpZWxkRWRpdG9yIGZvcmVncm91bmRMYWJlbEZpZWxkRWRpdG9yNDsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmdGaWVsZEVkaXRvciBmb3JlZ3JvdW5kTGFiZWxGaWVsZEVkaXRvcjU7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nRmllbGRFZGl0b3IgZm9yZWdyb3VuZExhYmVsRmllbGRFZGl0b3I2OworCXByaXZhdGUgc3RhdGljIFN0cmluZ0ZpZWxkRWRpdG9yIGZvcmVncm91bmRMYWJlbEZpZWxkRWRpdG9yNzsKKworCXByaXZhdGUgU3RyaW5nRmllbGRFZGl0b3IgaW5pdGlhbEF0dHJpYnV0ZU5hbWVGaWVsZEVkaXRvcjE7CisJcHJpdmF0ZSBTdHJpbmdGaWVsZEVkaXRvciBpbml0aWFsQXR0cmlidXRlTmFtZUZpZWxkRWRpdG9yMjsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJcHVibGljIFZpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZSgpIHsKKwkJc3VwZXIoR1JJRCk7CisJCXNldFByZWZlcmVuY2VTdG9yZShBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKKwkJc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJTVEVNVlBhZ2UuVml6IikpOworCisJfSAvLyBWaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlI2NyZWF0ZUZpZWxkRWRpdG9ycygpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmllbGRFZGl0b3JzKCkgeworCQlpbml0aWFsQXR0cmlidXRlTmFtZUZpZWxkRWRpdG9yMSA9IG5ldyBTdHJpbmdGaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLklOSVRJQUxfQVRUUklCVVRFX05BTUVfU1RSSU5HX1BSRUZFUkVOQ0UsCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJWaXpQUGFnZS5Jbml0aWFsTmFtZTEiKSwKKwkJCQlBVFRSSUJVVEVfTkFNRV9GSUVMRF9XSURUSCwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7CisKKwkJaW5pdGlhbEF0dHJpYnV0ZU5hbWVGaWVsZEVkaXRvcjIgPSBuZXcgU3RyaW5nRmllbGRFZGl0b3IoCisJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5JTklUSUFMX0FUVFJJQlVURV9OQU1FX1NUUklOR19QUkVGRVJFTkNFMiwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIlZpelBQYWdlLkluaXRpYWxOYW1lMiIpLAorCQkJCUFUVFJJQlVURV9OQU1FX0ZJRUxEX1dJRFRILCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKKworCQkvLyBGb3IgQ29sb3IgQXNzaWdubWVudAorCQlmb3JlZ3JvdW5kQ29sb3JGaWVsZEVkaXRvckRlZmF1bHQgPSBuZXcgQ29sb3JGaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfQ09MT1JfREVGQVVMVCwgTWVzc2FnZXMKKwkJCQkJCS5nZXRTdHJpbmcoIlZpelBQYWdlLmZnY2QiKSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7CisJCWZvcmVncm91bmRDb2xvckZpZWxkRWRpdG9yMSA9IG5ldyBDb2xvckZpZWxkRWRpdG9yKAorCQkJCVByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9DT0xPUl9MQUJFTF8xLCBNZXNzYWdlcworCQkJCQkJLmdldFN0cmluZygiVml6UFBhZ2UuZmdjMSIpLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKKwkJZm9yZWdyb3VuZENvbG9yRmllbGRFZGl0b3IyID0gbmV3IENvbG9yRmllbGRFZGl0b3IoCisJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5GT1JFR1JPVU5EX0NPTE9SX0xBQkVMXzIsIE1lc3NhZ2VzCisJCQkJCQkuZ2V0U3RyaW5nKCJWaXpQUGFnZS5mZ2MyIiksIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOworCQlmb3JlZ3JvdW5kQ29sb3JGaWVsZEVkaXRvcjMgPSBuZXcgQ29sb3JGaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfQ09MT1JfTEFCRUxfMywgTWVzc2FnZXMKKwkJCQkJCS5nZXRTdHJpbmcoIlZpelBQYWdlLmZnYzMiKSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7CisJCWZvcmVncm91bmRDb2xvckZpZWxkRWRpdG9yNCA9IG5ldyBDb2xvckZpZWxkRWRpdG9yKAorCQkJCVByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9DT0xPUl9MQUJFTF80LCBNZXNzYWdlcworCQkJCQkJLmdldFN0cmluZygiVml6UFBhZ2UuZmdjNCIpLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKKwkJZm9yZWdyb3VuZENvbG9yRmllbGRFZGl0b3I1ID0gbmV3IENvbG9yRmllbGRFZGl0b3IoCisJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5GT1JFR1JPVU5EX0NPTE9SX0xBQkVMXzUsIE1lc3NhZ2VzCisJCQkJCQkuZ2V0U3RyaW5nKCJWaXpQUGFnZS5mZ2M1IiksIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOworCQlmb3JlZ3JvdW5kQ29sb3JGaWVsZEVkaXRvcjYgPSBuZXcgQ29sb3JGaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfQ09MT1JfTEFCRUxfNiwgTWVzc2FnZXMKKwkJCQkJCS5nZXRTdHJpbmcoIlZpelBQYWdlLmZnYzYiKSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7CisJCWZvcmVncm91bmRDb2xvckZpZWxkRWRpdG9yNyA9IG5ldyBDb2xvckZpZWxkRWRpdG9yKAorCQkJCVByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9DT0xPUl9MQUJFTF83LCBNZXNzYWdlcworCQkJCQkJLmdldFN0cmluZygiVml6UFBhZ2UuZmdjNyIpLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKKworCQkvLyBEbyBOT1QgYWRkIHRoZSBsYWJlbCBmaWVsZCBlZGl0b3IgZm9yIG5hbWUgREVGQVVMVAorCQkvLyBUaGlzIG11c3QgYmUgaGFyZCBjb2RlZCBhbmQgbm90IGV4cG9zZWQKKwkJLyoKKwkJICogZm9yZWdyb3VuZExhYmVsRmllbGRFZGl0b3JEZWZhdWx0ID0gbmV3IFN0cmluZ0ZpZWxkRWRpdG9yKAorCQkgKiBQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfU1RSSU5HX0xBQkVMX0RFRkFVTFQsCisJCSAqIE1lc3NhZ2VzLmdldFN0cmluZygiVml6UFBhZ2UuQkdkZWZhdWx0TmFtZSIpLAorCQkgKiBBVFRSSUJVVEVfTkFNRV9GSUVMRF9XSURUSCwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7CisJCSAqLworCQkvLyBGb3IgbGFiZWwgbmFtZSBCRzFOYW1lID0gUyAoc2VlIG1lc3NhZ2VzLnByb3BlcnRpZXMpCisJCWZvcmVncm91bmRMYWJlbEZpZWxkRWRpdG9yMSA9IG5ldyBTdHJpbmdGaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfU1RSSU5HX0xBQkVMXzEsIE1lc3NhZ2VzCisJCQkJCQkuZ2V0U3RyaW5nKCJWaXpQUGFnZS5CRzFOYW1lIiksCisJCQkJQVRUUklCVVRFX05BTUVfRklFTERfV0lEVEgsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOworCQkvLyBGb3IgbGFiZWwgbmFtZSBCRzJOYW1lID0gRSAoc2VlIG1lc3NhZ2VzLnByb3BlcnRpZXMpCisJCWZvcmVncm91bmRMYWJlbEZpZWxkRWRpdG9yMiA9IG5ldyBTdHJpbmdGaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfU1RSSU5HX0xBQkVMXzIsIE1lc3NhZ2VzCisJCQkJCQkuZ2V0U3RyaW5nKCJWaXpQUGFnZS5CRzJOYW1lIiksCisJCQkJQVRUUklCVVRFX05BTUVfRklFTERfV0lEVEgsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOworCQkvLyBGb3IgbGFiZWwgbmFtZSBCRzNOYW1lID0gSSAoc2VlIG1lc3NhZ2VzLnByb3BlcnRpZXMpCisJCWZvcmVncm91bmRMYWJlbEZpZWxkRWRpdG9yMyA9IG5ldyBTdHJpbmdGaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfU1RSSU5HX0xBQkVMXzMsIE1lc3NhZ2VzCisJCQkJCQkuZ2V0U3RyaW5nKCJWaXpQUGFnZS5CRzNOYW1lIiksCisJCQkJQVRUUklCVVRFX05BTUVfRklFTERfV0lEVEgsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOworCQkvLyBGb3IgbGFiZWwgbmFtZSBCRzROYW1lID0gUiAoc2VlIG1lc3NhZ2VzLnByb3BlcnRpZXMpCisJCWZvcmVncm91bmRMYWJlbEZpZWxkRWRpdG9yNCA9IG5ldyBTdHJpbmdGaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfU1RSSU5HX0xBQkVMXzQsIE1lc3NhZ2VzCisJCQkJCQkuZ2V0U3RyaW5nKCJWaXpQUGFnZS5CRzROYW1lIiksCisJCQkJQVRUUklCVVRFX05BTUVfRklFTERfV0lEVEgsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOworCQkvLyBGb3IgbGFiZWwgbmFtZSBCRzVOYW1lID0gUCAoc2VlIG1lc3NhZ2VzLnByb3BlcnRpZXMpCisJCWZvcmVncm91bmRMYWJlbEZpZWxkRWRpdG9yNSA9IG5ldyBTdHJpbmdGaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfU1RSSU5HX0xBQkVMXzUsIE1lc3NhZ2VzCisJCQkJCQkuZ2V0U3RyaW5nKCJWaXpQUGFnZS5CRzVOYW1lIiksCisJCQkJQVRUUklCVVRFX05BTUVfRklFTERfV0lEVEgsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpOworCQkvLyBGb3IgbGFiZWwgbmFtZSBCRzZOYW1lID0gSVIgKHNlZSBtZXNzYWdlcy5wcm9wZXJ0aWVzKQorCQlmb3JlZ3JvdW5kTGFiZWxGaWVsZEVkaXRvcjYgPSBuZXcgU3RyaW5nRmllbGRFZGl0b3IoCisJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5GT1JFR1JPVU5EX1NUUklOR19MQUJFTF82LCBNZXNzYWdlcworCQkJCQkJLmdldFN0cmluZygiVml6UFBhZ2UuQkc2TmFtZSIpLAorCQkJCUFUVFJJQlVURV9OQU1FX0ZJRUxEX1dJRFRILCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKKwkJLy8gRm9yIGxhYmVsIG5hbWUgQkc3TmFtZSA9IElGIChzZWUgbWVzc2FnZXMucHJvcGVydGllcykKKwkJZm9yZWdyb3VuZExhYmVsRmllbGRFZGl0b3I3ID0gbmV3IFN0cmluZ0ZpZWxkRWRpdG9yKAorCQkJCVByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfNywgTWVzc2FnZXMKKwkJCQkJCS5nZXRTdHJpbmcoIlZpelBQYWdlLkJHN05hbWUiKSwKKwkJCQlBVFRSSUJVVEVfTkFNRV9GSUVMRF9XSURUSCwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7CisKKwkJLy8gYWRkIGFsbCBjb21wb25lbnRzCisJCWFkZEZpZWxkKGluaXRpYWxBdHRyaWJ1dGVOYW1lRmllbGRFZGl0b3IxKTsKKwkJYWRkRmllbGQoaW5pdGlhbEF0dHJpYnV0ZU5hbWVGaWVsZEVkaXRvcjIpOworCQkvLyBBZGQgdGhlIGNvbG9yIGZpZWxkIGVkaXRvcnMKKwkJYWRkRmllbGQoZm9yZWdyb3VuZENvbG9yRmllbGRFZGl0b3JEZWZhdWx0KTsKKwkJLy8gRG8gTk9UIGFkZCB0aGUgbGFiZWwgZmllbGQgZWRpdG9yIGZvciBuYW1lIERFRkFVTFQKKwkJLy8gVGhpcyBtdXN0IGJlIGhhcmQgY29kZWQgYW5kIG5vdCBleHBvc2VkCisJCS8vIGFkZEZpZWxkKGZvcmVncm91bmRMYWJlbEZpZWxkRWRpdG9yRGVmYXVsdCk7CisKKwkJYWRkRmllbGQoZm9yZWdyb3VuZENvbG9yRmllbGRFZGl0b3IxKTsKKwkJYWRkRmllbGQoZm9yZWdyb3VuZExhYmVsRmllbGRFZGl0b3IxKTsKKworCQlhZGRGaWVsZChmb3JlZ3JvdW5kQ29sb3JGaWVsZEVkaXRvcjIpOworCQlhZGRGaWVsZChmb3JlZ3JvdW5kTGFiZWxGaWVsZEVkaXRvcjIpOworCisJCWFkZEZpZWxkKGZvcmVncm91bmRDb2xvckZpZWxkRWRpdG9yMyk7CisJCWFkZEZpZWxkKGZvcmVncm91bmRMYWJlbEZpZWxkRWRpdG9yMyk7CisKKwkJYWRkRmllbGQoZm9yZWdyb3VuZENvbG9yRmllbGRFZGl0b3I0KTsKKwkJYWRkRmllbGQoZm9yZWdyb3VuZExhYmVsRmllbGRFZGl0b3I0KTsKKworCQlhZGRGaWVsZChmb3JlZ3JvdW5kQ29sb3JGaWVsZEVkaXRvcjUpOworCQlhZGRGaWVsZChmb3JlZ3JvdW5kTGFiZWxGaWVsZEVkaXRvcjUpOworCisKKwkJYWRkRmllbGQoZm9yZWdyb3VuZENvbG9yRmllbGRFZGl0b3I2KTsKKwkJYWRkRmllbGQoZm9yZWdyb3VuZExhYmVsRmllbGRFZGl0b3I2KTsKKworCisJCWFkZEZpZWxkKGZvcmVncm91bmRDb2xvckZpZWxkRWRpdG9yNyk7CisJCWFkZEZpZWxkKGZvcmVncm91bmRMYWJlbEZpZWxkRWRpdG9yNyk7CisKKwl9Ly8gY3JlYXRlRmllbGRFZGl0b3JzCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBtYXBwaW5nIGJldHdlZW4gdGhlIGRpc3BsYXkgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgYW5kIHRoZQorCSAqICAgICAgICAgY29sb3IgdG8gYmUgdXNlZCB0byBkaXNwbGF5IGl0cyB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIENvbG9yPiBnZXRDb2xvck1hcHBpbmcoKSB7CisKKwkJLy8KKwkJZmluYWwgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpCisJCQkJLmdldFBsdWdpblByZWZlcmVuY2VzKCk7CisKKwkJRGV2aWNlIGRldmljZSA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOworCQkKKwkJLy8gQWRkIHRoZSBkZWZhdWx0IGNvbG9yIChhbHdheXMgdGhlIHNhbWUga2V5KQorCQlmaW5hbCBSR0IgZGVmYXVsdFJHQiA9IFN0cmluZ0NvbnZlcnRlci5hc1JHQihwcmVmZXJlbmNlcworCQkJCS5nZXRTdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5GT1JFR1JPVU5EX0NPTE9SX0RFRkFVTFQpKTsKKwkJCisJCWZpbmFsIENvbG9yIGNvbG9yRGVmID0gbmV3IENvbG9yKGRldmljZSwgZGVmYXVsdFJHQi5yZWQsCisJCQkJZGVmYXVsdFJHQi5ncmVlbiwgZGVmYXVsdFJHQi5ibHVlKTsKKwkJY29sb3JQcmVmZXJlbmNlTWFwLnB1dChGT1JFR1JPVU5EX0FUVFJJQlVURV9OQU1FX0RFRkFVTFRfU1RSSU5HLAorCQkJCWNvbG9yRGVmKTsKKworCQkvLyBBZGQgdGhlIGF0dHJpYnV0ZSBsYWJlbHMgYXMga2V5cyBhbmQgdGhlIHByZWZlcnJlZCBjb2xvcnMKKwkJZmluYWwgUkdCIHJnYjEgPSBTdHJpbmdDb252ZXJ0ZXIuYXNSR0IocHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9DT0xPUl9MQUJFTF8xKSk7CisJCWZpbmFsIENvbG9yIGNvbG9yMSA9IG5ldyBDb2xvcihkZXZpY2UsIHJnYjEucmVkLCByZ2IxLmdyZWVuLAorCQkJCXJnYjEuYmx1ZSk7CisKKwkJZmluYWwgUkdCIHJnYjIgPSBTdHJpbmdDb252ZXJ0ZXIuYXNSR0IocHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9DT0xPUl9MQUJFTF8yKSk7CisJCWZpbmFsIENvbG9yIGNvbG9yMiA9IG5ldyBDb2xvcihkZXZpY2UsIHJnYjIucmVkLCByZ2IyLmdyZWVuLAorCQkJCXJnYjIuYmx1ZSk7CisKKwkJZmluYWwgUkdCIHJnYjMgPSBTdHJpbmdDb252ZXJ0ZXIuYXNSR0IocHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9DT0xPUl9MQUJFTF8zKSk7CisJCWZpbmFsIENvbG9yIGNvbG9yMyA9IG5ldyBDb2xvcihkZXZpY2UsIHJnYjMucmVkLCByZ2IzLmdyZWVuLAorCQkJCXJnYjMuYmx1ZSk7CisKKwkJZmluYWwgUkdCIHJnYjQgPSBTdHJpbmdDb252ZXJ0ZXIuYXNSR0IocHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9DT0xPUl9MQUJFTF80KSk7CisJCWZpbmFsIENvbG9yIGNvbG9yNCA9IG5ldyBDb2xvcihkZXZpY2UsIHJnYjQucmVkLCByZ2I0LmdyZWVuLAorCQkJCXJnYjQuYmx1ZSk7CisKKwkJZmluYWwgUkdCIHJnYjUgPSBTdHJpbmdDb252ZXJ0ZXIuYXNSR0IocHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9DT0xPUl9MQUJFTF81KSk7CisJCWZpbmFsIENvbG9yIGNvbG9yNSA9IG5ldyBDb2xvcihkZXZpY2UsIHJnYjUucmVkLCByZ2I1LmdyZWVuLAorCQkJCXJnYjUuYmx1ZSk7CisJCisJCWZpbmFsIFJHQiByZ2I2ID0gU3RyaW5nQ29udmVydGVyLmFzUkdCKHByZWZlcmVuY2VzCisJCQkJLmdldFN0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfQ09MT1JfTEFCRUxfNikpOworCQlmaW5hbCBDb2xvciBjb2xvcjYgPSBuZXcgQ29sb3IoZGV2aWNlLCByZ2I2LnJlZCwgcmdiNi5ncmVlbiwKKwkJCQlyZ2I2LmJsdWUpOworCisJCWZpbmFsIFJHQiByZ2I3ID0gU3RyaW5nQ29udmVydGVyLmFzUkdCKHByZWZlcmVuY2VzCisJCQkJLmdldFN0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfQ09MT1JfTEFCRUxfNykpOworCQlmaW5hbCBDb2xvciBjb2xvcjcgPSBuZXcgQ29sb3IoZGV2aWNlLCByZ2I3LnJlZCwgcmdiNy5ncmVlbiwKKwkJCQlyZ2I3LmJsdWUpOworCQkKKworCisJCWZpbmFsIFN0cmluZyBrZXkxID0gcHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfMSk7CisJCWZpbmFsIFN0cmluZyBrZXkyID0gcHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfMik7CisJCWZpbmFsIFN0cmluZyBrZXkzID0gcHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfMyk7CisJCWZpbmFsIFN0cmluZyBrZXk0ID0gcHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfNCk7CisJCWZpbmFsIFN0cmluZyBrZXk1ID0gcHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfNSk7CisJCWZpbmFsIFN0cmluZyBrZXk2ID0gcHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfNik7CisJCWZpbmFsIFN0cmluZyBrZXk3ID0gcHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfNyk7CisKKwkJY29sb3JQcmVmZXJlbmNlTWFwLnB1dChrZXkxLCBjb2xvcjEpOworCQljb2xvclByZWZlcmVuY2VNYXAucHV0KGtleTIsIGNvbG9yMik7CisJCWNvbG9yUHJlZmVyZW5jZU1hcC5wdXQoa2V5MywgY29sb3IzKTsKKwkJY29sb3JQcmVmZXJlbmNlTWFwLnB1dChrZXk0LCBjb2xvcjQpOworCQljb2xvclByZWZlcmVuY2VNYXAucHV0KGtleTUsIGNvbG9yNSk7CisJCWNvbG9yUHJlZmVyZW5jZU1hcC5wdXQoa2V5NiwgY29sb3I2KTsKKwkJY29sb3JQcmVmZXJlbmNlTWFwLnB1dChrZXk3LCBjb2xvcjcpOworCQkKKwkJcmV0dXJuIGNvbG9yUHJlZmVyZW5jZU1hcDsKKwl9IC8vIGdldENvbG9yTWFwcGluZworCQorCS8qKgorCSAqIEByZXR1cm4gYSBzZXQgb2YgU3RyaW5ncyAobGFiZWxzKSBmb3Igd2hpY2ggdGhlIHVzZXIgaGFzCisJICogZGVmaW5lZCBjb2xvciBwcmVmZXJlbmNlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IGdldFByZWZlcmVuY2VTZXQoKSB7CisJCQorCQlIYXNoU2V0PFN0cmluZz4gcHJlZlNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwkJZmluYWwgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpCisJCQkJLmdldFBsdWdpblByZWZlcmVuY2VzKCk7CisJCWZpbmFsIFN0cmluZyBrZXkxID0gcHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfMSk7CisJCWZpbmFsIFN0cmluZyBrZXkyID0gcHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfMik7CisJCWZpbmFsIFN0cmluZyBrZXkzID0gcHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfMyk7CisJCWZpbmFsIFN0cmluZyBrZXk0ID0gcHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfNCk7CisJCWZpbmFsIFN0cmluZyBrZXk1ID0gcHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfNSk7CisJCWZpbmFsIFN0cmluZyBrZXk2ID0gcHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfNik7CisJCWZpbmFsIFN0cmluZyBrZXk3ID0gcHJlZmVyZW5jZXMKKwkJCQkuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9TVFJJTkdfTEFCRUxfNyk7CisKKwkJcHJlZlNldC5hZGQoa2V5MSk7CisJCXByZWZTZXQuYWRkKGtleTIpOworCQlwcmVmU2V0LmFkZChrZXkzKTsKKwkJcHJlZlNldC5hZGQoa2V5NCk7CisJCXByZWZTZXQuYWRkKGtleTUpOworCQlwcmVmU2V0LmFkZChrZXk2KTsKKwkJcHJlZlNldC5hZGQoa2V5Nyk7CisJCQorCQlyZXR1cm4gcHJlZlNldDsKKwl9Ly8gZ2V0IHByZWZTZXQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCWZpbmFsIElXb3JrYmVuY2ggd29ya2JlbmNoKSB7CisJCS8vIE5vdGhpbmcKKwl9IC8vIGluaXQKKworfSAvLyBWaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcHJlZmVyZW5jZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvcHJlZmVyZW5jZXMvbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZThhOTM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNTIgQEAKKyMgUHJlZmVyZW5jZU1lc3NhZ2VzLnByb3BlcnRpZXMKKyMKKyMgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1NURU1QUGFnZS5TVEVNPVNURU0KK1NURU1WUGFnZS5WaXo9VmlzdWFsaXphdGlvbgorCitWaXpQUGFnZS5Jbml0aWFsTmFtZTEgPSAmSW5pdGlhbCBZLWF4aXMgYXR0cmlidXRlOgorVml6UFBhZ2UuSW5pdGlhbE5hbWUyID0gJkluaXRpYWwgWC1heGlzIGF0dHJpYnV0ZToKKworVml6UFBhZ2UuZmdjZCA9ICZEZWZhdWx0IEZvcmVncm91bmQgQ29sb3IKK1ZpelBQYWdlLmZnYzEgPSAmRm9yZWdyb3VuZCBDb2xvcjEKK1ZpelBQYWdlLmZnYzIgPSAmRm9yZWdyb3VuZCBDb2xvcjIKK1ZpelBQYWdlLmZnYzMgPSAmRm9yZWdyb3VuZCBDb2xvcjMKK1ZpelBQYWdlLmZnYzQgPSAmRm9yZWdyb3VuZCBDb2xvcjQKK1ZpelBQYWdlLmZnYzUgPSAmRm9yZWdyb3VuZCBDb2xvcjUKK1ZpelBQYWdlLmZnYzYgPSAmRm9yZWdyb3VuZCBDb2xvcjYKK1ZpelBQYWdlLmZnYzcgPSAmRm9yZWdyb3VuZCBDb2xvcjcKKworVml6UFBhZ2UuQkdkZWZhdWx0TmFtZSA9ICZEZWZhdWx0IEZvcmVncm91bmQKK1ZpelBQYWdlLkJHMU5hbWUgPSAmRm9yZWdyb3VuZCBQcm9wZXJ0eTEKK1ZpelBQYWdlLkJHMk5hbWUgPSAmRm9yZWdyb3VuZCBQcm9wZXJ0eTIKK1ZpelBQYWdlLkJHM05hbWUgPSAmRm9yZWdyb3VuZCBQcm9wZXJ0eTMKK1ZpelBQYWdlLkJHNE5hbWUgPSAmRm9yZWdyb3VuZCBQcm9wZXJ0eTQKK1ZpelBQYWdlLkJHNU5hbWUgPSAmRm9yZWdyb3VuZCBQcm9wZXJ0eTUKK1ZpelBQYWdlLkJHNk5hbWUgPSAmRm9yZWdyb3VuZCBQcm9wZXJ0eTYKK1ZpelBQYWdlLkJHN05hbWUgPSAmRm9yZWdyb3VuZCBQcm9wZXJ0eTcKKworRE1QUGFnZVNpbVRocmVhZHM9Jk51bWJlciBvZiBjb25jdXJyZW50IHdvcmtlciB0aHJlYWRzIAorRE1QUGFnZVRJVExFPSZTb2x2ZXIgUHJlZmVyZW5jZXMKK0RNUFBhZ2VEZWZhdWx0U29sdmVyPSZEZWZhdWx0IHNvbHZlcgorCitzdGVtXDovL29yZy5lY2xpcHNlLnN0ZW0vZWRnZS9taWdyYXRpb24gPSBIdW1hbiBNaWdyYXRpb24KK3N0ZW1cOi8vb3JnLmVjbGlwc2Uuc3RlbS9lZGdlL3BpcGV0cmFuc3BvcnQgPSBBaXIgVHJhbnNwb3J0CitzdGVtXDovL29yZy5lY2xpcHNlLnN0ZW0vZWRnZS9yZWxhdGlvbnNoaXAvY29tbW9uYm9yZGVyID0gQ29tbW9uIEJvcmRlcnMKK3N0ZW1cOi8vb3JnLmVjbGlwc2Uuc3RlbS9lZGdlL3JlbGF0aW9uc2hpcC9yZWxhdGl2ZXBoeXNpY2FsID0gUmVsYXRpdmUgUGh5c2ljYWxzCitzdGVtXDovL29yZy5lY2xpcHNlLnN0ZW0vZWRnZS9yZWxhdGlvbnNoaXAvcm9hZCA9IFJvYWRzCitzdGVtXDovL29yZy5lY2xpcHNlLnN0ZW0vZWRnZS9yZWxhdGlvbnNoaXAvYWlyID0gQWlyCitzdGVtXDovL29yZy5lY2xpcHNlLnN0ZW0vZWRnZS9yZWxhdGlvbnNoaXAvcm9hZHRyYW5zcG9ydDIwMDEgPSBSb2FkIFRyYW5zcG9ydCAyMDAxCitzdGVtXDovL29yZy5lY2xpcHNlLnN0ZW0vZWRnZS9yZWxhdGlvbnNoaXAvcm9hZHRyYW5zcG9ydDIwMDQgPSBSb2FkIFRyYW5zcG9ydCAyMDA0CitzdGVtXDovL29yZy5lY2xpcHNlLnN0ZW0vZWRnZS9yZWxhdGlvbnNoaXAvcm9hZHRyYW5zcG9ydDIwMDcgPSBSb2FkIFRyYW5zcG9ydCAyMDA3CitzdGVtXDovL29yZy5lY2xpcHNlLnN0ZW0vZWRnZS9yZWxhdGlvbnNoaXAvYWlydHJhbnNwb3J0MjAwNiA9IEFpciBUcmFuc3BvcnQgMjAwNgorc3RlbVw6Ly9vcmcuZWNsaXBzZS5zdGVtL2VkZ2UvbWlncmF0aW9uL3JlbGF0aW9uc2hpcCA9IE1pZ3JhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS9zcGxhc2hoYW5kbGVyL1NwbGFzaEhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvc3BsYXNoaGFuZGxlci9TcGxhc2hIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4ZDRlZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvc3BsYXNoaGFuZGxlci9TcGxhc2hIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLy8gU3BsYXNoSGFuZGxlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkuc3BsYXNoaGFuZGxlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5TdHJpbmdDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnNwbGFzaC5CYXNpY1NwbGFzaEhhbmRsZXI7CisKKy8qKgorICogVGhpcyBpcyBiYXNlZCBvbiBFY2xpcHNlU3BsYXNoSGFuZGxlcgorICovCitwdWJsaWMgY2xhc3MgU3BsYXNoSGFuZGxlciBleHRlbmRzIEJhc2ljU3BsYXNoSGFuZGxlciB7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0KFNoZWxsIHNwbGFzaCkgeworCQlzdXBlci5pbml0KHNwbGFzaCk7CisJCVN0cmluZyBwcm9ncmVzc1JlY3RTdHJpbmcgPSAiMCwzODYsNjk3LDE1IjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgbWVzc2FnZVJlY3RTdHJpbmcgPSAiMTAsMzUwLDY5NywyMCI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIGJ1aWxkSWRMb2NTdHJpbmcgPSAiNTAwLDMyNSI7IC8vJE5PTi1OTFMtMSQKKworCQlTdHJpbmcgZm9yZWdyb3VuZENvbG9yU3RyaW5nID0gbnVsbDsKKworCQlSZWN0YW5nbGUgcHJvZ3Jlc3NSZWN0ID0gU3RyaW5nQ29udmVydGVyLmFzUmVjdGFuZ2xlKAorCQkJCXByb2dyZXNzUmVjdFN0cmluZywgbmV3IFJlY3RhbmdsZSgwLCAxNjUsIDQwMCwgMTUpKTsKKwkJc2V0UHJvZ3Jlc3NSZWN0KHByb2dyZXNzUmVjdCk7CisKKwkJUmVjdGFuZ2xlIG1lc3NhZ2VSZWN0ID0gU3RyaW5nQ29udmVydGVyLmFzUmVjdGFuZ2xlKG1lc3NhZ2VSZWN0U3RyaW5nLAorCQkJCW5ldyBSZWN0YW5nbGUoMTAsIDE1MCwgMzkwLCA1MCkpOworCQlzZXRNZXNzYWdlUmVjdChtZXNzYWdlUmVjdCk7CisKKwkJZmluYWwgUG9pbnQgYnVpbGRJZFBvaW50ID0gU3RyaW5nQ29udmVydGVyLmFzUG9pbnQoYnVpbGRJZExvY1N0cmluZywKKwkJCQluZXcgUG9pbnQoMzIyLCAxOTApKTsKKworCQlpbnQgZm9yZWdyb3VuZENvbG9ySW50ZWdlcjsKKwkJdHJ5IHsKKwkJCWZvcmVncm91bmRDb2xvckludGVnZXIgPSBJbnRlZ2VyCisJCQkJCS5wYXJzZUludChmb3JlZ3JvdW5kQ29sb3JTdHJpbmcsIDE2KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQlmb3JlZ3JvdW5kQ29sb3JJbnRlZ2VyID0gMHhEMkQ3RkY7IC8vIG9mZiB3aGl0ZQorCQl9CisKKwkJc2V0Rm9yZWdyb3VuZChuZXcgUkdCKChmb3JlZ3JvdW5kQ29sb3JJbnRlZ2VyICYgMHhGRjAwMDApID4+IDE2LAorCQkJCShmb3JlZ3JvdW5kQ29sb3JJbnRlZ2VyICYgMHhGRjAwKSA+PiA4LAorCQkJCWZvcmVncm91bmRDb2xvckludGVnZXIgJiAweEZGKSk7CisKKwkJZmluYWwgU3RyaW5nIGJ1aWxkSWQgPSBnZXRCdWlsZElkKCk7CisKKwkJZ2V0Q29udGVudCgpLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7CisJCQlAU3VwcHJlc3NXYXJuaW5ncygic3ludGhldGljLWFjY2VzcyIpCisJCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7CisJCQkJZS5nYy5zZXRGb3JlZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7CisJCQkJZS5nYy5kcmF3VGV4dChidWlsZElkLCBidWlsZElkUG9pbnQueCwgYnVpbGRJZFBvaW50LnksIHRydWUpOworCQkJfQorCQl9KTsKKwl9IC8vIGluaXQKKworCXByaXZhdGUgU3RyaW5nIGdldEJ1aWxkSWQoKSB7CisJCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoInN0ZW0uYnVpbGRJZCIsICJVbmtub3duIEJ1aWxkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KK30gLy8gU3BsYXNoSGFuZGxlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9BY3RpdmVCYXRjaGVzVmlldy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9BY3RpdmVCYXRjaGVzVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMzdiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL0FjdGl2ZUJhdGNoZXNWaWV3LmphdmEKQEAgLTAsMCArMSwxODYgQEAKKy8vIEFjdGl2ZUJhdGNoZXNWaWV3LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guQmF0Y2hNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5CYXRjaE1hbmFnZXJFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guSUJhdGNoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5iYXRjaC5JQmF0Y2hNYW5hZ2VyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4gRWNsaXBzZSB7QGxpbmsgVmlld1BhcnR9IHRoYXQgZGlzcGxheXMgdGhlIGN1cnJlbnRseSBhY3RpdmUKKyAqIHtAbGluayBJQmF0Y2h9cyBhbmQgdGhlaXIgc3RhdHVzLgorICogCisgKiBAc2VlIEJhdGNoTWFuYWdlcgorICovCitwdWJsaWMgY2xhc3MgQWN0aXZlQmF0Y2hlc1ZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7CisKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgQWN0aXZlIEJhdGNoZXMgVmlldworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FDVElWRV9CQVRDSEVTX1ZJRVcgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5hY3RpdmViYXRjaGVzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBMaXN0Vmlld2VyIGx2ID0gbnVsbDsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisJCWx2ID0gbmV3IExpc3RWaWV3ZXIocGFyZW50KTsKKwkJbHYuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBY3RpdmVCYXRjaGVzQ29udGVudFByb3ZpZGVyKCkpOworCQlsdi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBY3RpdmVCYXRjaGVzTGFiZWxQcm92aWRlcigpKTsKKwkJbHYuc2V0SW5wdXQoQmF0Y2hNYW5hZ2VyLklOU1RBTkNFKTsKKworCQkvLyBQcm92aWRlIG91ciBzZWxlY3Rpb24gbGlzdGVuZXIKKwkJZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKGx2KTsKKwl9IC8vIGNyZWF0ZVBhcnRDb250cm9sCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJCWdldFNpdGUoKS5zZXRTZWxlY3Rpb25Qcm92aWRlcihudWxsKTsKKwkJbHYgPSBudWxsOworCX0gLy8gZGlzcG9zZQorCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBBY3RpdmVCYXRjaGVzQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMKKwkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCBJQmF0Y2hNYW5hZ2VyTGlzdGVuZXIgeworCisJCXByaXZhdGUgTGlzdFZpZXdlciB2aWV3ZXIgPSBudWxsOworCisJCXByaXZhdGUgQmF0Y2hNYW5hZ2VyIGJhdGNoTWFuYWdlciA9IG51bGw7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKGZpbmFsIE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKwkJCXJldHVybiAoKEJhdGNoTWFuYWdlcikgaW5wdXRFbGVtZW50KS5nZXRBY3RpdmVCYXRjaGVzKCkudG9BcnJheSgpOworCQl9IC8vIGdldEVsZW1lbnRzCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQorCQkgKi8KKwkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJCXZpZXdlciA9IG51bGw7CisJCQliYXRjaE1hbmFnZXIgPSBudWxsOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKKwkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKGZpbmFsIFZpZXdlciB2aWV3ZXIsCisJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQkJZmluYWwgT2JqZWN0IG9sZElucHV0LCBmaW5hbCBPYmplY3QgbmV3SW5wdXQpIHsKKwkJCXRoaXMudmlld2VyID0gKExpc3RWaWV3ZXIpIHZpZXdlcjsKKwkJCS8vIElzIG91ciBiYXRjaCBtYW5hZ2VyIGNoYW5naW5nPworCQkJaWYgKGJhdGNoTWFuYWdlciAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJYmF0Y2hNYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKHRoaXMpOworCQkJfQorCQkJYmF0Y2hNYW5hZ2VyID0gKEJhdGNoTWFuYWdlcikgbmV3SW5wdXQ7CisKKwkJCS8vIERvIHdlIGhhdmUgYSBuZXcgYmF0Y2ggbWFuYWdlciB0byBsaXN0ZW4gdG8/CisJCQlpZiAoYmF0Y2hNYW5hZ2VyICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQliYXRjaE1hbmFnZXIuYWRkQmF0Y2hNYW5hZ2VyTGlzdGVuZXIodGhpcyk7CisJCQl9CisJCX0gLy8gaW5wdXRDaGFuZ2VkCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmJhdGNoLklCYXRjaE1hbmFnZXJMaXN0ZW5lciNiYXRjaGVzQ2hhbmdlZChvcmcuZWNsaXBzZS5zdGVtLmpvYnMuYmF0Y2guQmF0Y2hNYW5hZ2VyRXZlbnQpCisJCSAqLworCQlwdWJsaWMgdm9pZCBiYXRjaGVzQ2hhbmdlZChmaW5hbCBCYXRjaE1hbmFnZXJFdmVudCBldmVudCkgeworCQkJdmlld2VyLmdldExpc3QoKS5zZXRSZWRyYXcoZmFsc2UpOworCQkJdHJ5IHsKKwkJCQl2aWV3ZXIucmVtb3ZlKGV2ZW50LmdldEJhdGNoZXNSZW1vdmVkKCkpOworCQkJCXZpZXdlci5hZGQoZXZlbnQuZ2V0QmF0Y2hlc0FkZGVkKCkpOworCQkJfSBmaW5hbGx5IHsKKwkJCQl2aWV3ZXIuZ2V0TGlzdCgpLnNldFJlZHJhdyh0cnVlKTsKKwkJCX0KKworCQl9IC8vIGJhdGNoZXNDaGFuZ2VkCisKKwl9IC8vIEFjdGl2ZUJhdGNoZXNDb250ZW50UHJvdmlkZXIKKworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQWN0aXZlQmF0Y2hlc0xhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIEltYWdlIGdldEltYWdlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQlmaW5hbCBPYmplY3QgZWxlbWVudCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gLy8gZ2V0SW1hZ2UKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChmaW5hbCBPYmplY3QgZWxlbWVudCkgeworCQkJZmluYWwgSUJhdGNoIGJhdGNoID0gKElCYXRjaCkgZWxlbWVudDsKKwkJCXJldHVybiBiYXRjaC5nZXROYW1lV2l0aFNlcXVlbmNlTnVtYmVyKCk7CisJCX0gLy8gZ2V0VGV4dAorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKKwkJICovCisJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQlmaW5hbCBJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCQkvLyBub3RoaW5nCisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKKwkJICovCisJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQkvLyBub3RoaW5nCisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKKwkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQlmaW5hbCBPYmplY3QgZWxlbWVudCwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCWZpbmFsIFN0cmluZyBwcm9wZXJ0eSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQorCQkgKi8KKwkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCWZpbmFsIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJCS8vIG5vdGhpbmcKKwkJfQorCX0gLy8gQWN0aXZlQmF0Y2hlc0xhYmVsUHJvdmlkZXIKK30gLy8gQWN0aXZlQmF0Y2hlc1ZpZXcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvQWN0aXZlU2ltdWxhdGlvbnNWaWV3LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL0FjdGl2ZVNpbXVsYXRpb25zVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNjgxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL0FjdGl2ZVNpbXVsYXRpb25zVmlldy5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvLyBBY3RpdmVTaW11bGF0aW9uc1ZpZXcuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbk1hbmFnZXJFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhbiBFY2xpcHNlIHtAbGluayBWaWV3UGFydH0gdGhhdCBkaXNwbGF5cyB0aGUgY3VycmVudGx5IGFjdGl2ZQorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259cyBhbmQgdGhlaXIgc3RhdHVzLgorICogCisgKiBAc2VlIFNpbXVsYXRpb25NYW5hZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBBY3RpdmVTaW11bGF0aW9uc1ZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7CisKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgQWN0aXZlIFNpbXVsYXRpb25zIFZpZXcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BQ1RJVkVfU0lNVUxBVElPTlNfVklFVyA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmFjdGl2ZXNpbXVsYXRpb25zIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBMaXN0Vmlld2VyIGx2ID0gbnVsbDsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisJCWx2ID0gbmV3IExpc3RWaWV3ZXIocGFyZW50KTsKKwkJbHYuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBY3RpdmVTaW11bGF0aW9uc0NvbnRlbnRQcm92aWRlcigpKTsKKwkJbHYuc2V0TGFiZWxQcm92aWRlcihuZXcgQWN0aXZlU2ltdWxhdGlvbnNMYWJlbFByb3ZpZGVyKCkpOworCQlsdi5zZXRJbnB1dChTaW11bGF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkpOworCisJCS8vIFByb3ZpZGUgb3VyIHNlbGVjdGlvbiBsaXN0ZW5lcgorCQlnZXRTaXRlKCkuc2V0U2VsZWN0aW9uUHJvdmlkZXIobHYpOworCX0gLy8gY3JlYXRlUGFydENvbnRyb2wKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJLy8gTm90aGluZworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwkJZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKG51bGwpOworCQlsdiA9IG51bGw7CisJfSAvLyBkaXNwb3NlCisKKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEFjdGl2ZVNpbXVsYXRpb25zQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMKKwkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCBJU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lciB7CisKKwkJcHJpdmF0ZSBMaXN0Vmlld2VyIHZpZXdlciA9IG51bGw7CisKKwkJcHJpdmF0ZSBTaW11bGF0aW9uTWFuYWdlciBzaW11bGF0aW9uTWFuYWdlciA9IG51bGw7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKGZpbmFsIE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKwkJCXJldHVybiAoKFNpbXVsYXRpb25NYW5hZ2VyKSBpbnB1dEVsZW1lbnQpLmdldEFjdGl2ZVNpbXVsYXRpb25zKCkKKwkJCQkJLnRvQXJyYXkoKTsKKwkJfSAvLyBnZXRFbGVtZW50cworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKKwkJICovCisJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQl2aWV3ZXIgPSBudWxsOworCQkJc2ltdWxhdGlvbk1hbmFnZXIgPSBudWxsOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKKwkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKGZpbmFsIFZpZXdlciB2aWV3ZXIsCisJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQkJZmluYWwgT2JqZWN0IG9sZElucHV0LCBmaW5hbCBPYmplY3QgbmV3SW5wdXQpIHsKKwkJCXRoaXMudmlld2VyID0gKExpc3RWaWV3ZXIpIHZpZXdlcjsKKwkJCS8vIElzIG91ciBzaW11bGF0aW9uIG1hbmFnZXIgY2hhbmdpbmc/CisJCQlpZiAoc2ltdWxhdGlvbk1hbmFnZXIgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCXNpbXVsYXRpb25NYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKHRoaXMpOworCQkJfQorCQkJc2ltdWxhdGlvbk1hbmFnZXIgPSAoU2ltdWxhdGlvbk1hbmFnZXIpIG5ld0lucHV0OworCisJCQkvLyBEbyB3ZSBoYXZlIGEgbmV3IHNpbXVsYXRpb24gbWFuYWdlciB0byBsaXN0ZW4gdG8/CisJCQlpZiAoc2ltdWxhdGlvbk1hbmFnZXIgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCXNpbXVsYXRpb25NYW5hZ2VyLmFkZFNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXIodGhpcyk7CisJCQl9CisJCX0gLy8gaW5wdXRDaGFuZ2VkCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXIjc2ltdWxhdGlvbnNDaGFuZ2VkKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyRXZlbnQpCisJCSAqLworCQlwdWJsaWMgdm9pZCBzaW11bGF0aW9uc0NoYW5nZWQoZmluYWwgU2ltdWxhdGlvbk1hbmFnZXJFdmVudCBldmVudCkgeworCQkJdmlld2VyLmdldExpc3QoKS5zZXRSZWRyYXcoZmFsc2UpOworCQkJdHJ5IHsKKwkJCQl2aWV3ZXIucmVtb3ZlKGV2ZW50LmdldFNpbXVsYXRpb25zUmVtb3ZlZCgpKTsKKwkJCQl2aWV3ZXIuYWRkKGV2ZW50LmdldFNpbXVsYXRpb25zQWRkZWQoKSk7CisJCQl9IGZpbmFsbHkgeworCQkJCXZpZXdlci5nZXRMaXN0KCkuc2V0UmVkcmF3KHRydWUpOworCQkJfQorCisJCX0gLy8gc2ltdWxhdGlvbnNDaGFuZ2VkCisKKwl9IC8vIEFjdGl2ZVNpbXVsYXRpb25zQ29udGVudFByb3ZpZGVyCisKKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEFjdGl2ZVNpbXVsYXRpb25zTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzCisJCQlJTGFiZWxQcm92aWRlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIEltYWdlIGdldEltYWdlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQlmaW5hbCBPYmplY3QgZWxlbWVudCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gLy8gZ2V0SW1hZ2UKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChmaW5hbCBPYmplY3QgZWxlbWVudCkgeworCQkJZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IChJU2ltdWxhdGlvbikgZWxlbWVudDsKKwkJCXJldHVybiBzaW11bGF0aW9uLmdldE5hbWVXaXRoU2VxdWVuY2VOdW1iZXIoKTsKKwkJfSAvLyBnZXRUZXh0CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQorCQkgKi8KKwkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCWZpbmFsIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJCS8vIG5vdGhpbmcKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQorCQkgKi8KKwkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJCS8vIG5vdGhpbmcKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LAorCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCWZpbmFsIE9iamVjdCBlbGVtZW50LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJZmluYWwgU3RyaW5nIHByb3BlcnR5KSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCisJCSAqLworCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJZmluYWwgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQkJLy8gbm90aGluZworCQl9CisJfSAvLyBBY3RpdmVTaW11bGF0aW9uc0xhYmVsUHJvdmlkZXIKK30gLy8gQWN0aXZlU2ltdWxhdGlvbnNWaWV3CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL0RlY29yYXRvcnNWaWV3LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL0RlY29yYXRvcnNWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyYjY2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvRGVjb3JhdG9yc1ZpZXcuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLy8gRGVjb3JhdG9yc1ZpZXcuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGVjbGlwc2UgdmlldyBvZiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3J9cyB0aGF0IGhhdmUKKyAqIGJlZW4gaW1wb3J0ZWQgaW50byBlY2xpcHNlIGFzIHBsdWctaW5zLgorICoKKyAqIEBzZWUgU2VxdWVuY2Vyc1ZpZXcKKyAqLworcHVibGljIGNsYXNzIERlY29yYXRvcnNWaWV3IGV4dGVuZHMgSWRlbnRpZmlhYmxlUGx1Z2luVmlldyB7CisKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgRGVjb3JhdG9ycyBWaWV3CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfREVDT1JBVE9SU19WSUVXID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZGVjb3JhdG9ycyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgRGVjb3JhdG9yc1ZpZXcoKSB7CisJCXN1cGVyKCk7CisJfSAvLyBEZWNvcmF0b3JzVmlldworCisJLyoqCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElkZW50aWZpYWJsZVZpZXdNb2RlbCBnZXRJbnB1dCgpIHsKKwkJcmV0dXJuIERlY29yYXRvck1vZGVsLmdldE1vZGVsKCk7CisJfSAvLyBnZXRJbnB1dAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLklkZW50aWZpYWJsZVBsdWdpblZpZXcjZ2V0SWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyIGdldElkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlcigpIHsKKwkJcmV0dXJuIG5ldyBEZWNvcmF0b3JWaWV3VHJlZUNvbnRlbnRQcm92aWRlcigpOworCX0gLy8gZ2V0SWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG1vZGVsIG9mIHRoZSB7QGxpbmsgRGVjb3JhdG9yfXMgdGhhdCBleHRlbmQgYQorCSAqIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5kZWNvcmF0b3JzIGV4dGVuc2lvbiBwb2ludC4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIERlY29yYXRvck1vZGVsIGV4dGVuZHMgSWRlbnRpZmlhYmxlVmlld01vZGVsIHsKKworCQkvLyBUaGUgc2luZ2xldG9uIGluc3RhbmNlCisJCXByaXZhdGUgc3RhdGljIERlY29yYXRvck1vZGVsIGRlY01vZGVsOworCisJCS8qKgorCQkgKiBDb25zdHJ1Y3RvcgorCQkgKi8KKwkJcHJpdmF0ZSBEZWNvcmF0b3JNb2RlbChmaW5hbCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJRCkgeworCQkJc3VwZXIoZXh0ZW5zaW9uUG9pbnRJRCk7CisJCX0gLy8gRGVjb3JhdG9yTW9kZWwKKworCQkvKioKKwkJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBtb2RlbAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBEZWNvcmF0b3JNb2RlbCBnZXRNb2RlbCgpIHsKKwkJCS8vIERvIHdlIG5lZWQgdG8gbWFrZSB0aGUgbW9kZWw/CisJCQlpZiAoZGVjTW9kZWwgPT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCWRlY01vZGVsID0gbmV3IERlY29yYXRvck1vZGVsKAorCQkJCQkJQ29uc3RhbnRzLklEX0RFQ09SQVRPUl9FWFRFTlNJT05fUE9JTlQpOworCQkJfQorCQkJcmV0dXJuIGRlY01vZGVsOworCQl9IC8vIGdldE1vZGVsCisJfSAvLyBEZWNvcmF0b3JNb2RlbAorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyB0aGUgY29udGVudCBwcm92aWRlciBvZiB0aGUgZGVjb3JhdG9ycyB2aWV3LgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRGVjb3JhdG9yVmlld1RyZWVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcworCQkJSWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyIHsKKworCQkvLyBUaGlzIGlzIHRoZSBpbWFnZSB1c2VkIHRvIHJlcHJlc2VudCBkZWNvcmF0b3JzIGluIHRoZSBkZWNvcmF0b3JzIHZpZXcKKwkJc3RhdGljIEltYWdlRGVzY3JpcHRvciBkaXNlYXNlSWNvbiA9IG51bGw7CisKKwkJLy8gSWYgdHJ1ZSB0aGVuIHdlJ3ZlIG5ldmVyIHRyaWVkIHRvIGdldCB0aGUgaWNvbgorCQlzdGF0aWMgYm9vbGVhbiBkaXNlYXNlSWNvbkZpcnN0VGltZSA9IHRydWU7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5JZGVudGlmaWFibGVQbHVnaW5WaWV3LklkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShmaW5hbCBPYmplY3QgZWxlbWVudCkgeworCQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlRGVsZWdhdGUpID8gZ2V0RGlzZWFzZUljb24oKQorCQkJCQk6IHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOworCQl9IC8vIGdldEltYWdlCisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIGljb24gdG8gYmUgdXNlZCB0byByZXByZXNlbnQgZGVjb3JhdG9ycywgb3IgbnVsbCBpZiBpdAorCQkgKiAgICAgICAgIGNhbid0IGJlIGxvYWRlZC4KKwkJICovCisJCXByaXZhdGUgSW1hZ2UgZ2V0RGlzZWFzZUljb24oKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJCS8vIC8vIFNob3VsZCB3ZSB0cnkgdG8gbG9hZCB0aGUgaWNvbj8KKwkJCS8vIGlmIChkaXNlYXNlSWNvbkZpcnN0VGltZSAmJiBkaXNlYXNlSWNvbiA9PSBudWxsKSB7CisJCQkvLyAvLyBZZXMKKwkJCS8vIGRpc2Vhc2VJY29uRmlyc3RUaW1lID0gZmFsc2U7CisJCQkvLyBkaXNlYXNlSWNvbiA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKKwkJCS8vICJvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMiLAorCQkJLy8gImljb25zL2Z1bGwvY3VzdG9tMTYvIiArICJkaXNlYXNlLmdpZiIpOworCQkJLy8gfSAvLyBpZiB3ZSBzaG91bGQgbG9hZCB0aGUgaWNvbgorCQkJLy8gcmV0dXJuIGRpc2Vhc2VJY29uLmNyZWF0ZUltYWdlKCk7CisJCX0gLy8gZ2V0ZGlzZWFzZUljb24KKwl9IC8vIERlY29yYXRvclZpZXdUcmVlQ29udGVudFByb3ZpZGVyCit9IC8vIERlY29yYXRvcnNWaWV3CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL0V4ZWN1dGFibGVQbHVnaW5WaWV3LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL0V4ZWN1dGFibGVQbHVnaW5WaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2YTQ0MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvRXhlY3V0YWJsZVBsdWdpblZpZXcuamF2YQpAQCAtMCwwICsxLDIxNyBAQAorLy8gRXhlY3V0YWJsZVBsdWdpblZpZXcuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBlY2xpcHNlIHZpZXcgb2YgdGhlIGV4ZWN1dGFibGUgcGx1Zy1pbiByZXNvdXJjZXMgb2YKKyAqIGEgcGFydGljdWxhciB0eXBlIHRoYXQgaGF2ZSBiZWVuIGltcG9ydGVkIGludG8gZWNsaXBzZSBhcyBwbHVnLWlucy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEV4ZWN1dGFibGVQbHVnaW5WaWV3IGV4dGVuZHMgVmlld1BhcnQgeworCisJLyoqCisJICogVGhlIExpc3Qgb2YgdGhpbmdzIHRvIGJlIHNob3duIGluIHRoZSB2aWV3LgorCSAqLworCXByaXZhdGUgTGlzdFZpZXdlciBsdjsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGlucHV0IG1vZGVsIHNwZWNpZmljIHRvIHRoaXMgdmlldworCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBFeGVjdXRhYmxlVmlld01vZGVsIGdldElucHV0KCk7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQlsdiA9IG5ldyBMaXN0Vmlld2VyKHBhcmVudCk7CisJCWx2LnNldENvbnRlbnRQcm92aWRlcihuZXcgRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcigpKTsKKwkJbHYuc2V0TGFiZWxQcm92aWRlcihuZXcgRXhlY3V0YWJsZUxhYmVsUHJvdmlkZXIoKSk7CisJCWx2LnNldElucHV0KGdldElucHV0KCkpOworCisJCS8vIFByb3ZpZGUgb3VyIHNlbGVjdGlvbgorCQlnZXRTaXRlKCkuc2V0U2VsZWN0aW9uUHJvdmlkZXIobHYpOworCX0gLy8gY3JlYXRlUGFydENvbnRyb2wKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJLy8gTm90aGluZworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCS8vIFRPRE8gaW1wbGVtZW50IGRpc3Bvc2Ugc2VlIHNlbGVjdGlvbiBzZXJ2aWNlIGRvYworCQkvLyBnZXRTaXRlKCkuc2V0U2VsZWN0aW9uUHJvdmlkZXIobnVsbCk7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG1vZGVsIG9mIHRoZSBleGVjdXRhYmxlIHBsdWctaW5zIHRoYXQgZXh0ZW5kIGEKKwkgKiBTVEVNIGV4dGVuc2lvbiBwb2ludC4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEV4ZWN1dGFibGVWaWV3TW9kZWwgeworCisJCXByaXZhdGUgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGV4ZWN1dGFibGVzOworCisJCS8qKgorCQkgKiBDb25zdHJ1Y3RvcgorCQkgKi8KKwkJcHJvdGVjdGVkIEV4ZWN1dGFibGVWaWV3TW9kZWwoZmluYWwgU3RyaW5nIGV4dGVuc2lvblBvaW50SUQsCisJCQkJZmluYWwgU3RyaW5nIGV4ZWN1dGFibGVFbGVtZW50TmFtZSkgeworCQkJZXhlY3V0YWJsZXMgPSBuZXcgQXJyYXlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKKwkJCS8vIEdldCB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50cyBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQKKwkJCWZpbmFsIElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisJCQlmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IHJlZ2lzdHJ5CisJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoZXh0ZW5zaW9uUG9pbnRJRCk7CisKKwkJCS8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZWxlbWVudHMuCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBjb25maWdFbGVtZW50c1tpXTsKKwkJCQkvLyBJcyB0aGlzIGFuIE9ic2VydmVyPworCQkJCWlmIChleGVjdXRhYmxlRWxlbWVudE5hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgeworCQkJCQkvLyBZZXMKKwkJCQkJZXhlY3V0YWJsZXMuYWRkKGVsZW1lbnQpOworCQkJCX0gZWxzZSB7CisJCQkJCUFjdGl2YXRvci5sb2dFcnJvcihNZXNzYWdlRm9ybWF0LmZvcm1hdChNZXNzYWdlcworCQkJCQkJCS5nZXRTdHJpbmcoIklQVmlldy5VbmV4cGVjdGVkX0VsZW1lbnQiKSwgZWxlbWVudCAvLyROT04tTkxTLTEkCisJCQkJCQkJLmdldE5hbWUoKSwgZXh0ZW5zaW9uUG9pbnRJRCksIG51bGwpOworCQkJCX0gLy8gZWxzZQorCQkJfSAvLyBmb3IgZWFjaCBjb25maWd1cmF0aW9uIGVsZW1lbnQKKworCQl9IC8vIEV4ZWN1dGFibGVWaWV3TW9kZWwKKworCQkvKioKKwkJICogQHJldHVybiB0aGUgZXhlY3V0YWJsZXMKKwkJICovCisJCXByb3RlY3RlZCBmaW5hbCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4gZ2V0RXhlY3V0YWJsZXMoKSB7CisJCQlyZXR1cm4gZXhlY3V0YWJsZXM7CisJCX0KKworCX0gLy8gRXhlY3V0YWJsZVZpZXdNb2RlbAorCisJLyoqCisJICogVGhpcyBjbGFzcyBwcm92aWRlcyBjb250ZW50IGZvciB0aGUgbGlzdCB2aWV3IG9mIHRoZSBleGVjdXRhYmxlcyB0aGF0IGFyZQorCSAqIGF2YWlsYWJsZSBhcyBwYXJ0cyBvZiBwbHVnLWlucy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cworCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7CisJCQlyZXR1cm4gKChFeGVjdXRhYmxlVmlld01vZGVsKSBpbnB1dEVsZW1lbnQpLmdldEV4ZWN1dGFibGVzKCkKKwkJCQkJLnRvQXJyYXkoKTsKKwkJfSAvLyBnZXRFbGVtZW50cworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKKwkJICovCisJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQkvLyBOb3RoaW5nIHRvIGRvCisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAorCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIC8vJE5PTi1OTFMtMSQKKwkJVmlld2VyIHZpZXdlciwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIC8vJE5PTi1OTFMtMSQKKwkJT2JqZWN0IG9sZElucHV0LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgLy8kTk9OLU5MUy0xJAorCQlPYmplY3QgbmV3SW5wdXQpIHsKKwkJCS8vIE5vdGhpbmcgdG8gZG8KKwkJfQorCX0gLy8gRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcgorCisJLyoqCisJICogVGhpcyBjbGFzcyBwcm92aWRlcyBsYWJlbHMgdGhlIGRlc2NyaWJlIHRoZSBleGVjdXRhYmxlcyBhdmFpbGFibGUgYXMgcGFydAorCSAqIG9mIHBsdWctaW5zLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRXhlY3V0YWJsZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIEltYWdlIGdldEltYWdlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSAvLyROT04tTkxTLTEkCisJCU9iamVjdCBlbGVtZW50KSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7CisJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGVsZW1lbnQ7CisJCQlTdHJpbmcgcmV0VmFsdWUgPSBjb25maWdFbGVtZW50CisJCQkJCS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkVYRUNVVEFCTEVfTkFNRV9BVFRSSUJVVEUpOworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGdldFRleHQKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCisJCSAqLworCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgLy8kTk9OLU5MUy0xJAorCQlJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCQkvLyBOb3RoaW5nCisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKKwkJICovCisJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQkvLyBOb3RoaW5nCisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKKwkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSAvLyROT04tTkxTLTEkCisJCU9iamVjdCBlbGVtZW50LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgcHJvcGVydHkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKKwkJICovCisJCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSAvLyROT04tTkxTLTEkCisJCUlMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJCS8vIE5vdGhpbmcKKwkJfQorCX0gLy8gRXhlY3V0YWJsZUxhYmVsUHJvdmlkZXIKKworfSAvLyBFeGVjdXRhYmxlUGx1Z2luVmlldwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9FeHBlcmltZW50c1ZpZXcuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvRXhwZXJpbWVudHNWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2MGQyNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvRXhwZXJpbWVudHNWaWV3LmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8vIEV4cGVyaW1lbnRzVmlldy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLklTaGFyZWRJbWFnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgZWNsaXBzZSB2aWV3IG9mIHRoZQorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnR9cyB0aGF0IGhhdmUgYmVlbiBpbXBvcnRlZAorICogaW50byBlY2xpcHNlIGFzIHBsdWctaW5zLgorICovCitwdWJsaWMgY2xhc3MgRXhwZXJpbWVudHNWaWV3IGV4dGVuZHMgSWRlbnRpZmlhYmxlUGx1Z2luVmlldyB7CisKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgRXhwZXJpbWVudHMgVmlldyB7QHZhbHVlfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VYUEVSSU1FTlRTX1ZJRVcgPSBDb25zdGFudHMuSURfUk9PVAorCQkJKyAiLnVpLnZpZXdzLmV4cGVyaW1lbnRzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLklkZW50aWZpYWJsZVBsdWdpblZpZXcjZ2V0SWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyIGdldElkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlcigpIHsKKwkJcmV0dXJuIG5ldyBFeHBlcmltZW50UGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLklkZW50aWZpYWJsZVBsdWdpblZpZXcjZ2V0SW5wdXQoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJZGVudGlmaWFibGVWaWV3TW9kZWwgZ2V0SW5wdXQoKSB7CisJCXJldHVybiBFeHBlcmltZW50c1ZpZXdNb2RlbC5nZXRNb2RlbCgpOworCX0KKworCS8qKgorCSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBhIG1vZGVsIG9mIHRoZSBTVEVNCisJICoge0BsaW5rIEV4cGVyaW1lbnR9cyB0aGF0IGFyZSBwbHVnZ2VkIGludG8gdGhlIHN5c3RlbS4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEV4cGVyaW1lbnRzVmlld01vZGVsIGV4dGVuZHMgSWRlbnRpZmlhYmxlVmlld01vZGVsIHsKKwkJLy8gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQorCQlwcml2YXRlIHN0YXRpYyBFeHBlcmltZW50c1ZpZXdNb2RlbCBldk1vZGVsOworCisJCXByaXZhdGUgRXhwZXJpbWVudHNWaWV3TW9kZWwoKSB7CisJCQlzdXBlcihDb25zdGFudHMuSURfRVhQRVJJTUVOVF9FWFRFTlNJT05fUE9JTlQpOworCQl9CisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgTW9kZWxWaWV3TW9kZWwKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgRXhwZXJpbWVudHNWaWV3TW9kZWwgZ2V0TW9kZWwoKSB7CisJCQlpZiAoZXZNb2RlbCA9PSBudWxsKSB7CisJCQkJZXZNb2RlbCA9IG5ldyBFeHBlcmltZW50c1ZpZXdNb2RlbCgpOworCQkJfQorCQkJcmV0dXJuIGV2TW9kZWw7CisJCX0gLy8gZ2V0TW9kZWwKKwl9IC8vIEV4cGVyaW1lbnRzVmlld01vZGVsCisKKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEV4cGVyaW1lbnRQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIgZXh0ZW5kcworCQkJSWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyIHsKKworCQkvLyBUaGlzIGlzIHRoZSBpbWFnZSB1c2VkIHRvIHJlcHJlc2VudCBleHBlcmltZW50cyBpbiB0aGUgRXhwZXJpbWVudHMgdmlldworCQlzdGF0aWMgSW1hZ2UgZXhwZXJpbWVudEljb24gPSBudWxsOworCisJCS8vIElmIHRydWUgdGhlbiB3ZSd2ZSBuZXZlciB0cmllZCB0byBnZXQgdGhlIGljb24KKwkJc3RhdGljIGJvb2xlYW4gZXhwZXJpbWVudEljb25GaXJzdFRpbWUgPSB0cnVlOworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSWRlbnRpZmlhYmxlUGx1Z2luVmlldy5JZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCXJldHVybiAoZWxlbWVudCBpbnN0YW5jZW9mIElkZW50aWZpYWJsZURlbGVnYXRlKSA/IGdldEV4cGVyaW1lbnRJY29uKCkKKwkJCQkJOiBzdXBlci5nZXRJbWFnZShlbGVtZW50KTsKKwkJfSAvLyBnZXRJbWFnZQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBpY29uIHRvIGJlIHVzZWQgdG8gcmVwcmVzZW50IGV4cGVyaW1lbnRzLCBvciBudWxsIGlmIGl0CisJCSAqICAgICAgICAgY2FuJ3QgYmUgbG9hZGVkLgorCQkgKi8KKwkJcHJpdmF0ZSBJbWFnZSBnZXRFeHBlcmltZW50SWNvbigpIHsKKwkJCS8vIFNob3VsZCB3ZSB0cnkgdG8gbG9hZCB0aGUgaWNvbj8KKwkJCWlmIChleHBlcmltZW50SWNvbkZpcnN0VGltZSAmJiBleHBlcmltZW50SWNvbiA9PSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJZXhwZXJpbWVudEljb25GaXJzdFRpbWUgPSBmYWxzZTsKKwkJCQlleHBlcmltZW50SWNvbiA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldCgKKwkJCQkJCUlTaGFyZWRJbWFnZXMuRVhQRVJJTUVOVF9JQ09OKTsKKwkJCX0gLy8gaWYgd2Ugc2hvdWxkIGxvYWQgdGhlIGljb24KKwkJCXJldHVybiBleHBlcmltZW50SWNvbjsKKwkJfSAvLyBnZXRFeHBlcmltZW50SWNvbgorCisJfSAvLyBFeHBlcmltZW50UGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyCit9IC8vIEV4cGVyaW1lbnRzVmlldwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvR3JhcGhzVmlldy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9HcmFwaHNWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5OTZhYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvR3JhcGhzVmlldy5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvLyBHcmFwaHNWaWV3LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuSVNoYXJlZEltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBlY2xpcHNlIHZpZXcgb2YgdGhlCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBofXMgdGhhdCBoYXZlIGJlZW4gaW1wb3J0ZWQgaW50bworICogZWNsaXBzZSBhcyBwbHVnLWlucy4KKyAqLworcHVibGljIGNsYXNzIEdyYXBoc1ZpZXcgZXh0ZW5kcyBJZGVudGlmaWFibGVQbHVnaW5WaWV3IHsKKworCS8qKgorCSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBHcmFwaCBWaWV3CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfR1JBUEhTX1ZJRVcgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5ncmFwaHMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBHcmFwaHNWaWV3KCkgeworCQlzdXBlcigpOworCX0gLy8gR3JhcGhzVmlldworCisJLyoqCisJICogQHJldHVybiB0aGUgaW5wdXQgbW9kZWwgc3BlY2lmaWMgdG8gdGhpcyB2aWV3CisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElkZW50aWZpYWJsZVZpZXdNb2RlbCBnZXRJbnB1dCgpIHsKKwkJcmV0dXJuIEdyYXBoVmlld01vZGVsLmdldE1vZGVsKCk7CisJfSAvLyBnZXRJbnB1dAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLklkZW50aWZpYWJsZVBsdWdpblZpZXcjZ2V0SWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyIGdldElkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlcigpIHsKKwkJcmV0dXJuIG5ldyBHcmFwaFBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlcigpOworCX0gLy8gZ2V0SWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgYSBtb2RlbCBvZiB0aGUKKwkgKiB7QGxpbmsgR3JhcGh9cyB0aGF0IGFyZSBwbHVnZ2VkLWluIHRvIHRoZSBzeXN0ZW0uCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBHcmFwaFZpZXdNb2RlbCBleHRlbmRzIElkZW50aWZpYWJsZVZpZXdNb2RlbCB7CisJCS8vIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UKKwkJcHJpdmF0ZSBzdGF0aWMgR3JhcGhWaWV3TW9kZWwgZ3ZNb2RlbDsKKworCQkvKioKKwkJICogQ29uc3RydWN0b3IKKwkJICovCisJCXByaXZhdGUgR3JhcGhWaWV3TW9kZWwoKSB7CisJCQlzdXBlcihDb25zdGFudHMuSURfR1JBUEhfRVhURU5TSU9OX1BPSU5UKTsKKwkJfSAvLyBHcmFwaFZpZXdNb2RlbAorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIEdyYXBoVmlld01vZGVsCisJCSAqLworCQlwdWJsaWMgc3RhdGljIEdyYXBoVmlld01vZGVsIGdldE1vZGVsKCkgeworCQkJLy8gRG8gd2UgbmVlZCB0byBtYWtlIHRoZSBtb2RlbD8KKwkJCWlmIChndk1vZGVsID09IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQlndk1vZGVsID0gbmV3IEdyYXBoVmlld01vZGVsKCk7CisJCQl9CisJCQlyZXR1cm4gZ3ZNb2RlbDsKKwkJfSAvLyBnZXRNb2RlbAorCisJfSAvLyBHcmFwaFZpZXdNb2RlbAorCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBHcmFwaFBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlciBleHRlbmRzCisJCQlJZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIgeworCisJCS8vIFRoaXMgaXMgdGhlIGltYWdlIHVzZWQgdG8gcmVwcmVzZW50IGdyYXBocyBpbiB0aGUgZ3JhcGggdmlldworCQlzdGF0aWMgSW1hZ2UgZ3JhcGhJY29uID0gbnVsbDsKKworCQkvLyBJZiB0cnVlIHRoZW4gd2UndmUgbmV2ZXIgdHJpZWQgdG8gZ2V0IHRoZSBpY29uCisJCXN0YXRpYyBib29sZWFuIGdyYXBoSWNvbkZpcnN0VGltZSA9IHRydWU7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5JZGVudGlmaWFibGVQbHVnaW5WaWV3LklkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShmaW5hbCBPYmplY3QgZWxlbWVudCkgeworCQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlRGVsZWdhdGUpID8gZ2V0R3JhcGhJY29uKCkKKwkJCQkJOiBzdXBlci5nZXRJbWFnZShlbGVtZW50KTsKKwkJfSAvLyBnZXRJbWFnZQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBpY29uIHRvIGJlIHVzZWQgdG8gcmVwcmVzZW50IGdyYXBocywgb3IgbnVsbCBpZiBpdCBjYW4ndAorCQkgKiAgICAgICAgIGJlIGxvYWRlZC4KKwkJICovCisJCXByaXZhdGUgSW1hZ2UgZ2V0R3JhcGhJY29uKCkgeworCQkJLy8gU2hvdWxkIHdlIHRyeSB0byBsb2FkIHRoZSBpY29uPworCQkJaWYgKGdyYXBoSWNvbkZpcnN0VGltZSAmJiBncmFwaEljb24gPT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCWdyYXBoSWNvbkZpcnN0VGltZSA9IGZhbHNlOworCQkJCWdyYXBoSWNvbiA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldCgKKwkJCQkJCUlTaGFyZWRJbWFnZXMuR1JBUEhfSUNPTik7CisJCQl9IC8vIGlmIHdlIHNob3VsZCBsb2FkIHRoZSBpY29uCisJCQlyZXR1cm4gZ3JhcGhJY29uOworCQl9IC8vIGdldEdyYXBoSWNvbgorCisJfSAvLyBHcmFwaFBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlcgorfSAvLyBHcmFwaHNWaWV3CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL0lDb250ZXh0TWVudVVwZGF0ZXNMaXN0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9JQ29udGV4dE1lbnVVcGRhdGVzTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzgxNjI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9JQ29udGV4dE1lbnVVcGRhdGVzTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDMxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworCisvKioKKyAqIFRoZSBpbnRlcmZhY2UgZGVmaW5lcyBhIGxpc3RlbmVyIHRoYXQgZ2V0IG5vdGlmaWNhdGlvbnMgYWJvdXQgbmV3bHkgZ2VuZXJhdGVkIGNvbnRleHQKKyAqIG1lbnVzLiBVc3VhbGx5IHRoZSBsaXN0ZW5lciB3aWxsIGJlIGEgPGNvZGU+Vmlld1BhcnQ8L2NvZGU+IHRoYXQgbmVlZHMgdG8gcmVnaXN0ZXIKKyAqIHRoZSBjb250ZXh0IG1lbnUgc28gdGhhdCBleHRlcm5hbGx5IGRlZmluZWQgYWRkaXRpb25zIHRvIHRoZSBtZW51IHdpbGwgYmUgYWRkZWQuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNvbnRleHRNZW51VXBkYXRlc0xpc3RlbmVyIHsKKwkKKwkvKioKKwkgKiBUaGUgbWV0aG9kIGlzIGJlaW5nIGNhbGxlZCB3aGVuIG5ldyBjb250ZXh0IG1lbnUgaGFzIGJlZW4gY3JlYXRlZC4KKwkgKiBAcGFyYW0gbWVudU1hbmFnZXIgVGhlIG5ldyBNZW51TWFuYWdlcgorCSAqIEBwYXJhbSBzZWxlY3Rpb25Qcm92aWRlciBUaGUgSVNlbGVjdGlvblByb3ZpZGVyIGZvciB0aGUgTWVudU1hbmFnZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBvbkNvbnRleHRNZW51VXBkYXRlKE1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIpOworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL0lkZW50aWZpYWJsZURlbGVnYXRlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL0lkZW50aWZpYWJsZURlbGVnYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwZjBkZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvSWRlbnRpZmlhYmxlRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDE1MCBAQAorLy8gSWRlbnRpZmlhYmxlRGVsZWdhdGUKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5VdGlsaXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5EdWJsaW5Db3JlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuQWN0aXZhdG9yOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNlcmlhbGl6ZWQge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlfS4KKyAqLworcHVibGljIGNsYXNzIElkZW50aWZpYWJsZURlbGVnYXRlIGV4dGVuZHMgUGxhdGZvcm1PYmplY3QgaW1wbGVtZW50cworCQlDb21wYXJhYmxlPElkZW50aWZpYWJsZURlbGVnYXRlPiB7CisKKwkvLyBUaGUgQ2F0ZWdvcnkgdGhpcyBJZGVudGlmaWFibGUgYmVsb25ncyB0bworCS8vIEkgdGhpbmsgdGhpcyBjYW4gYmUgZGVsZXRlZAorCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKKworCS8vIFRoZSBVUkkgb2YgdGhlIElkZW50aWZpYWJsZQorCXByaXZhdGUgVVJJIHVyaTsKKworCS8vIFRoZSBEdWJsaW4gQ29yZSBpbnN0YW5jZSB0aGF0IHdhcyBpbml0aWFsaXplZCBmcm9tIHRoZSBjb25maWd1cmF0aW9uCisJLy8gZWxlbWVudAorCXByaXZhdGUgZmluYWwgRHVibGluQ29yZUltcGwgZHVibGluQ29yZTsKKworCS8qKgorCSAqIENyZWF0ZSBhbiB7QGxpbmsgSWRlbnRpZmlhYmxlRGVsZWdhdGV9IGZyb20gdGhlIHtAbGluaworCSAqIElDb25maWd1cmF0aW9uRWxlbWVudH0gb2J0YWluZWQgZnJvbSBhbiBleHRlbnNpb24gcG9pbnQuIFRoZSB7QGxpbmsKKwkgKiBEdWJsaW5Db3JlfSBpbnN0YW5jZSB3aWxsIGJlIGluaXRpYWxpemUgZnJvbSB0aGUge0BsaW5rCisJICogSUNvbmZpZ3VyYXRpb25FbGVtZW50fQorCSAqIAorCSAqIEBwYXJhbSBjb25maWdFbGVtZW50CisJICogCQl0aGUge0BsaW5rIElDb25maWd1cmF0aW9uRWxlbWVudH0gdGhhdCBkZWZpbmVzIGFuIHtAbGluaworCSAqIAkJSWRlbnRpZmlhYmxlfSB0aGF0IGhhcyBiZWVuIHBsdWdnZWQgaW4uCisJICovCisJcHVibGljIElkZW50aWZpYWJsZURlbGVnYXRlKGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7CisJCXRoaXMuZHVibGluQ29yZSA9IG5ldyBEdWJsaW5Db3JlSW1wbChjb25maWdFbGVtZW50KTsKKwl9IC8vIElkZW50aWZpYWJsZURlbGVnYXRlCisKKwkvKioKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWZpbmFsIFN0cmluZyByZXRWYWx1ZSA9IGR1YmxpbkNvcmUgIT0gbnVsbCA/IGR1YmxpbkNvcmUuZ2V0VGl0bGUoKSA6ICIiOyAvLyROT04tTkxTLTEkCisJCXJldHVybiByZXRWYWx1ZSAhPSBudWxsID8gcmV0VmFsdWUgOiAiIjsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfSBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGUgZ2V0SWRlbnRpZmlhYmxlKCkgeworCQlJZGVudGlmaWFibGUgcmV0VmFsdWUgPSBudWxsOworCQl0cnkgeworCQkJcmV0VmFsdWUgPSBVdGlsaXR5LmdldElkZW50aWZpYWJsZShnZXRVUkkoKSk7CisJCX0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlRoZSByZXNvdXJjZSBcIiIgKyBnZXRVUkkoKS50b1N0cmluZygpCisJCQkJCSsgIlwiIHdhcyBub3QgZm91bmQgb3Igd2FzIG9mIHRoZSB3cm9uZyBmb3JtYXQiLCBlKTsKKwkJCXJldFZhbHVlID0gbnVsbDsKKwkJfQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRJZGVudGlmaWFibGUKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfSdzIGVOU19VUkkuIFRoaXMgaXMgcmVjb3JkZWQKKwkgKiAJYXMgdGhlIHtAbGluayBEdWJsaW5Db3JlI2dldEZvcm1hdCgpfSBvZiB0aGUge0BsaW5rIElkZW50aWZpYWJsZX0uCisJICogQHNlZSBHcmFwaFBhY2thZ2UjZU5TX1VSSQorCSAqIEBzZWUgTW9kZWxQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlIFNjZW5hcmlvUGFja2FnZSNlTlNfVVJJCisJICogQHNlZSBTZXF1ZW5jZXJQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlIEV4cGVyaW1lbnRQYWNrYWdlI2VOU19VUkkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEZvcm1hdCgpIHsKKwkJcmV0dXJuIGdldER1YmxpbkNvcmUoKS5nZXRGb3JtYXQoKTsKKwl9IC8vIGdldEZvcm1hdAorCisJLyoqCisJICogQHJldHVybiB0aGUge0BsaW5rIFVSSX0gdG8gdGhlIHNlcmlhbGl6ZWQge0BsaW5rIElkZW50aWZpYWJsZX0uCisJICovCisJcHJpdmF0ZSBmaW5hbCBVUkkgZ2V0VVJJKCkgeworCQkvLyBBbHJlYWR5IGhhdmUgdGhlIFVSST8KKwkJaWYgKHVyaSA9PSBudWxsKSB7CisJCQkvLyBObworCQkJdXJpID0gVVJJLmNyZWF0ZVVSSShkdWJsaW5Db3JlLmdldElkZW50aWZpZXIoKSk7CisJCX0gLy8gaWYKKwkJcmV0dXJuIHVyaTsKKwl9IC8vIGdldFVSSQorCisJLyoqCisJICogQHJldHVybiB0aGUge0BsaW5rIER1YmxpbkNvcmV9CisJICovCisJcHVibGljIGZpbmFsIER1YmxpbkNvcmVJbXBsIGdldER1YmxpbkNvcmUoKSB7CisJCXJldHVybiBkdWJsaW5Db3JlOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBvCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGNvbXBhcmUKKwkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBpbnQgY29tcGFyZVRvKGZpbmFsIElkZW50aWZpYWJsZURlbGVnYXRlIG8pIHsKKwkJcmV0dXJuIHRvU3RyaW5nKCkuY29tcGFyZVRvKG8udG9TdHJpbmcoKSk7CisJfQorCisJLyoqCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisJCWlmIChvICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJcmV0VmFsdWUgPSB0b1N0cmluZygpLmVxdWFscyhvLnRvU3RyaW5nKCkpOworCQl9IC8vIGlmCisJCXJldHVybiByZXRWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiB0b1N0cmluZygpLmhhc2hDb2RlKCk7CisJfQorCisJLyoqCisJICogSSBkb24ndCB0aGluayB0aGlzIGlzIGV2ZXIgY2FsbGVkLCB0aGVyZSBpcyBhIHJlZmVyZW5jZSB0byBpdCwgYnV0IEkKKwkgKiBkb24ndCB0aGluayBpdCBldmVyIGdldHMgaW52b2tlZC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBwYXJlbnQKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIHBhcmVudDsKKwl9CisKK30gLy8gSWRlbnRpZmlhYmxlRGVsZWdhdGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL0lkZW50aWZpYWJsZVBsdWdpblZpZXcuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvSWRlbnRpZmlhYmxlUGx1Z2luVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ODliOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL0lkZW50aWZpYWJsZVBsdWdpblZpZXcuamF2YQpAQCAtMCwwICsxLDEwNDIgQEAKKy8vIElkZW50aWZpYWJsZVBsdWdpblZpZXcuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuTG9jYWxUcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkxvY2FsU2VsZWN0aW9uVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuR2VvZ3JhcGhpY05hbWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5leGVjdXRpb24uSUV4ZWN1dGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5oYW5kbGVycy5TVEVNRXhlY3V0aW9uQ29tbWFuZEhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5wZXJzcGVjdGl2ZXMuU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0FkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGVjbGlwc2UgdmlldyBvZiB0aGUge0BsaW5rIElkZW50aWZpYWJsZX0gcmVzb3VyY2VzCisgKiBvZiBhIHBhcnRpY3VsYXIgdHlwZSB0aGF0IGhhdmUgYmVlbiBpbXBvcnRlZCBpbnRvIGVjbGlwc2UgYXMgcGx1Zy1pbnMuCisgKiAKKyAqIEBzZWUgSWRlbnRpZmlhYmxlCisgKiBAc2VlIEdyYXBoc1ZpZXcKKyAqIEBzZWUgTW9kZWxzVmlldworICogQHNlZSBTY2VuYXJpb3NWaWV3CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBJZGVudGlmaWFibGVQbHVnaW5WaWV3IGV4dGVuZHMgVmlld1BhcnQgeworCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKKworCXByaXZhdGUgRHVibGluQ29yZVRvb2xUaXBIYW5kbGVyIGRjVFRpcEhhbmRsZXI7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBzZWxlY3Rpb24gdGhhdCBpcyBpbiBlZmZlY3QgYXQgdGhlIHN0YXJ0IG9mIGEgZHJhZyBvcGVyYXRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBzZWxlY3Rpb247CisKKwkvKioKKwkgKiBUaGlzIG1hcCBrZWVwcyB0cmFjayBvZiB0aGUge0BsaW5rIElkZW50aWZpYWJsZX0gdGhhdCB3ZSd2ZSBkZXNlcmlhbGl6ZWQKKwkgKiBzbyB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoYXQgbW9yZSB0aGFuIG9uY2UuCisJICogCisJICogQHNlZSAjZ2V0SWRlbnRpZmlhYmxlKFVSSSkKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwPFVSSSwgSWRlbnRpZmlhYmxlPiBkZXNlcmlhbGl6ZWRJZGVudGlmaWFibGVzTWFwID0gbmV3IEhhc2hNYXA8VVJJLCBJZGVudGlmaWFibGU+KCk7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGVQbHVnaW5WaWV3KCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisJCWRjVFRpcEhhbmRsZXIgPSBuZXcgRHVibGluQ29yZVRvb2xUaXBIYW5kbGVyKHBhcmVudC5nZXRTaGVsbCgpKTsKKworCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50KTsKKwkJdHJlZVZpZXdlcgorCQkJCS5zZXRDb250ZW50UHJvdmlkZXIobmV3IElkZW50aWZpYWJsZVBsdWdpblZpZXdUcmVlQ29udGVudFByb3ZpZGVyKCkpOworCQl0cmVlVmlld2VyCisJCQkJLnNldExhYmVsUHJvdmlkZXIoZ2V0SWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyKCkpOworCQl0cmVlVmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7CisJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoZ2V0SW5wdXQoKSk7CisKKwkJLy8gSG9vayB1cCB0aGUgZHVibGluIGNvcmUgdG9vbCB0aXAgaGFuZGxlcgorCQlkY1RUaXBIYW5kbGVyLmFkZERDVG9vbFRpcEhlbHAodHJlZVZpZXdlci5nZXRUcmVlKCkpOworCisJCS8vIFdlIGJlY29tZSBhIHNlbGVjdGlvbiBwcm92aWRlciB0b28KKwkJZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKHRyZWVWaWV3ZXIpOworCisJCS8vIENvbnRleHQgTWVudQorCQlmaW5hbCBNZW51TWFuYWdlciBjb250ZXh0TWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoKTsKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImV4ZWN1dGlvbiIpKTsKKworCQkvLyBTZXQgdGhlIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlcgorCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KAorCQkJCWNvbnRleHRNZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudSh0cmVlVmlld2VyLmdldENvbnRyb2woKSkpOworCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudU1hbmFnZXIsIHRyZWVWaWV3ZXIpOworCisJCS8vIExpc3RlbiBmb3IgZG91YmxlLWNsaWNrcyBvbiBFeGVjdXRhYmxlcworCQl0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soZmluYWwgRG91YmxlQ2xpY2tFdmVudCBldmVudCkgeworCQkJCWZpbmFsIElFeGVjdXRhYmxlIGV4ZWN1dGFibGUgPSAoSUV4ZWN1dGFibGUpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcigoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS50b0xpc3QoKS5nZXQoMCksIElFeGVjdXRhYmxlLmNsYXNzKTsKKworCQkJCS8vIFdlcmUgd2Ugc3VjY2Vzc2Z1bCBpbiBhZGFwdGluZz8KKwkJCQlpZiAoZXhlY3V0YWJsZSAhPSBudWxsKSB7CisJCQkJCS8vIFllcworCQkJCQlleGVjdXRhYmxlLnJ1bigpOworCQkJCQkKKwkJCQkJLy8gT25seSBzd2l0Y2ggdG8gdGhlIFNpbXVsYXRpb24gUGVyc2VwY3RpdmUgd2hlbiB0aGUgZXhlY3V0YWJsZSBpcyBhIHN0YW5kYXJkCisJCQkJCS8vIHJ1biAoc2NlbmFyaW8pLiBGb3Igb3RoZXIgZXhlY3V0YWJsZXMgd2UgbWF5IHdhbnQgdG8gc3RheSBpbiBvdGhlciBzcGVjaWFsCisJCQkJCS8vIHBlcnNwZWN0aXZlcworCQkJCQlpZihleGVjdXRhYmxlIGluc3RhbmNlb2YgQWRhcHRlcikgeworCQkJCQkJQWRhcHRlciBhID0gKEFkYXB0ZXIpIGV4ZWN1dGFibGU7CisJCQkJCQlPYmplY3Qgb2JqID0gYS5nZXRUYXJnZXQoKTsKKwkJCQkJCWlmKCBvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uaW1wbC5TY2VuYXJpb0ltcGwgKSB7CisJCQkJCQkJQWN0aXZhdG9yLnN3aXRjaFRvUGVyc3BlY3RpdmUoU2ltdWxhdGlvbi5JRF9TVEVNX1NJTVVMQVRJT05fUEVSU1BFQ1RJVkUpOworCQkJCQkJfQkKKwkJCQkJfSAvLyBpZiBhZGFwdGVyICh1c3VhbGx5IHRydWUpCisJCQkJCQorCQkJCX0gLy8gaWYKKwkJCX0gLy8gZG91YmxlQ2xpY2sKKwkJfSk7CisKKwkJLy8gU2V0IHVwIGRyYWcgc3VwcG9ydAorCQlmaW5hbCBpbnQgb3BzID0gRE5ELkRST1BfTElOSyB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFOworCQlmaW5hbCBUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsKKwkJCQlMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCksCisJCQkJTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07CisJCXRyZWVWaWV3ZXIuYWRkRHJhZ1N1cHBvcnQob3BzLCB0cmFuc2ZlcnMsIG5ldyBEcmFnU291cmNlTGlzdGVuZXIoKSB7CisKKwkJCS8qKgorCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VMaXN0ZW5lciNkcmFnU3RhcnQob3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQpCisJCQkgKi8KKwkJCXB1YmxpYyB2b2lkIGRyYWdTdGFydChmaW5hbCBEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKKwkJCQkvLyBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hlbiB0aGUgZHJhZyBjYW4gc3RhcnQgaGVyZQorCQkJCS8vIEp1c3Qgc2F5ICJ5ZXMiIHJpZ2h0IG5vdworCQkJCWV2ZW50LmRvaXQgPSB0cnVlOworCQkJCXNlbGVjdGlvbiA9IHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7CisJCQkJLy8gTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOworCQkJfSAvLyBkcmFnU3RhcnQKKworCQkJLyoqCisJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUxpc3RlbmVyI2RyYWdTZXREYXRhKG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50KQorCQkJICovCisJCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShmaW5hbCBEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKKworCQkJCWlmIChMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuaXNTdXBwb3J0ZWRUeXBlKAorCQkJCQkJZXZlbnQuZGF0YVR5cGUpKSB7CisJCQkJCS8vIFllcworCQkJCQlldmVudC5kYXRhID0gZXh0cmFjdFVSSVN0cmluZ3NGcm9tSWRlbnRpZmlhYmxlRGVsZWdhdGVzKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKKwkJCQkJTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLnNldFNlbGVjdGlvbigKKwkJCQkJCQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmRhdGEpOworCQkJCX0gLy8gaWYKKwkJCQllbHNlIGlmIChMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKAorCQkJCQkJZXZlbnQuZGF0YVR5cGUpKSB7CisJCQkJCS8vIFllcworCQkJCQlldmVudC5kYXRhID0gZXh0cmFjdFVSSVN0cmluZ3NGcm9tSWRlbnRpZmlhYmxlRGVsZWdhdGVzKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKKwkJCQl9IC8vIGlmCisKKwkJCX0gLy8gZHJhZ1NldERhdGEKKworCQkJcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBleHRyYWN0VVJJU3RyaW5nc0Zyb21JZGVudGlmaWFibGVEZWxlZ2F0ZXMoCisJCQkJCWZpbmFsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkRGVsZWdhdGVzKSB7CisJCQkJZmluYWwgTGlzdDxTdHJpbmc+IGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yIHNlbGVjdGlvbkl0ZXIgPSBzZWxlY3RlZERlbGVnYXRlcworCQkJCQkJLml0ZXJhdG9yKCk7IHNlbGVjdGlvbkl0ZXIuaGFzTmV4dCgpOykgeworCQkJCQlmaW5hbCBPYmplY3QgZWxlbWVudCA9IHNlbGVjdGlvbkl0ZXIubmV4dCgpOworCQkJCQkvLyBXYXMgYW4gSWRlbnRpZmlhYmxlIERlbGVnYXRlIHNlbGVjdGVkPworCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElkZW50aWZpYWJsZURlbGVnYXRlKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCS8vIEl0IGhhcyBhIFVSSSB0aGF0IHNwZWNpZmllcyB0aGUgc2VyaWFsaXplZAorCQkJCQkJLy8gcmVwcmVzZW50YXRpb24gb2YgdGhlIElkZW50aWZpYWJsZQorCQkJCQkJZmluYWwgU3RyaW5nIHVyaVN0cmluZyA9ICgoSWRlbnRpZmlhYmxlRGVsZWdhdGUpIGVsZW1lbnQpCisJCQkJCQkJCS5nZXREdWJsaW5Db3JlKCkuZ2V0SWRlbnRpZmllcigpOworCQkJCQkJLy8gV2VyZSB3ZSBzdWNjZXNzZnVsIGluIGdldHRpbmcgdGhlIHVyaSBzdHJpbmc/CisJCQkJCQlpZiAodXJpU3RyaW5nICE9IG51bGwpIHsKKwkJCQkJCQkvLyBZZXMKKwkJCQkJCQljb2xsZWN0aW9uLmFkZCh1cmlTdHJpbmcpOworCQkJCQkJfQorCQkJCQl9IC8vIGlmCisJCQkJfSAvLyBmb3IgZWFjaCBzZWxlY3Rpb24KKworCQkJCXJldHVybiBuZXcgSVN0cnVjdHVyZWRTZWxlY3Rpb24oKSB7CisKKwkJCQkJZmluYWwgTGlzdDxTdHJpbmc+IGxpc3Q7CisJCQkJCXsKKwkJCQkJCWxpc3QgPSBjb2xsZWN0aW9uOworCQkJCQl9CisKKwkJCQkJcHVibGljIE9iamVjdCBnZXRGaXJzdEVsZW1lbnQoKSB7CisJCQkJCQlyZXR1cm4gbGlzdC5nZXQoMCk7CisJCQkJCX0KKworCQkJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcigpIHsKKwkJCQkJCXJldHVybiBsaXN0Lml0ZXJhdG9yKCk7CisJCQkJCX0KKworCQkJCQlwdWJsaWMgaW50IHNpemUoKSB7CisJCQkJCQlyZXR1cm4gbGlzdC5zaXplKCk7CisJCQkJCX0KKworCQkJCQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKKwkJCQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKKwkJCQkJfQorCisJCQkJCXB1YmxpYyBMaXN0PFN0cmluZz4gdG9MaXN0KCkgeworCQkJCQkJcmV0dXJuIGxpc3Q7CisJCQkJCX0KKworCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworCQkJCQkJcmV0dXJuIGxpc3QuaXNFbXB0eSgpOworCQkJCQl9CisJCQkJfTsKKwkJCX0gLy8gZXh0cmFjdFVSSVN0cmluZ3MKKworCQkJLyoqCisJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUxpc3RlbmVyI2RyYWdGaW5pc2hlZChvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudCkKKwkJCSAqLworCQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKAorCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7CisJCQkJc2VsZWN0aW9uID0gbnVsbDsKKwkJCQlMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkuamF2YVRvTmF0aXZlKG51bGwsIG51bGwpOworCQkJfSAvLyBkcmFnRmluaXNoZWQKKworCQl9KTsKKwl9IC8vIGNyZWF0ZVBhcnRDb250cm9sCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBpbnB1dCBtb2RlbCBzcGVjaWZpYyB0byB0aGlzIHZpZXcKKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgSWRlbnRpZmlhYmxlVmlld01vZGVsIGdldElucHV0KCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyfQorCSAqICAgICAgICAgYXBwcm9wcmlhdGUgZm9yIHRoZSBtb2RlbAorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBJZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIgZ2V0SWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyKCk7CisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG1vZGVsIG9mIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfSdzIHRoYXQgZXh0ZW5kCisJICogYSBwYXJ0aWN1bGFyIGV4dGVuc2lvbiBwb2ludC4KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIElkZW50aWZpYWJsZVZpZXdNb2RlbCB7CisJCS8vIFRoZSByb290IG9mIHRoZSB0cmVlIG9mIGNhdGVnb3JpZXMgYW5kIGlkZW50aWZpYWJsZXMKKwkJcHJpdmF0ZSBmaW5hbCBDYXRlZ29yeSByb290OworCisJCS8vIE1hcHBpbmcgYmV0d2VlbiBhIGNhdGVnb3J5IGlkIGFuZCBhIGNhdGVnb3J5CisJCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQ2F0ZWdvcnk+IGNhdGVnb3J5TWFwOworCisJCS8qKgorCQkgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnRJRAorCQkgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gcG9pbnQgdGhhdCBJZGVudGlmaWFibGVzCisJCSAqICAgICAgICAgICAgdXNlIHRvIHBsdWctaW4uCisJCSAqLworCQlwdWJsaWMgSWRlbnRpZmlhYmxlVmlld01vZGVsKGZpbmFsIFN0cmluZyBleHRlbnNpb25Qb2ludElEKSB7CisJCQlyb290ID0gbmV3IENhdGVnb3J5KENvbnN0YW50cy5JREVOVElGSUFCTEVfUk9PVF9DQVRFR09SWV9OQU1FLAorCQkJCQlDb25zdGFudHMuSURFTlRJRklBQkxFX1JPT1RfQ0FURUdPUllfSUQsICIiKTsgLy8kTk9OLU5MUy0xJAorCQkJY2F0ZWdvcnlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENhdGVnb3J5PigpOworCQkJY2F0ZWdvcnlNYXAucHV0KHJvb3QuZ2V0Q2F0ZWdvcnlJZCgpLCByb290KTsKKworCQkJLy8gR2V0IHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnRzIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludAorCQkJZmluYWwgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKKwkJCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gcmVnaXN0cnkKKwkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihleHRlbnNpb25Qb2ludElEKTsKKworCQkJLy8gTWFrZSBhIGZpcnN0IHBhc3MgdGhyb3VnaCB0aGUgZWxlbWVudHMgbG9va2luZyBmb3IgY2F0ZWdvcmllcworCQkJZm9yIChmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA6IGNvbmZpZ0VsZW1lbnRzKSB7CisJCQkJLy8gSXMgdGhpcyBhIENhdGVnb3J5PworCQkJCWlmIChDb25zdGFudHMuQ0FURUdPUllfRUxFTUVOVC5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7CisJCQkJCS8vIFllcworCQkJCQlhZGRDYXRlZ29yeShlbGVtZW50KTsKKwkJCQl9CisJCQl9IC8vIGZvciBlYWNoIGNvbmZpZ3VyYXRpb24gZWxlbWVudAorCisJCQkvLyBSZXNvbHZlIHRoZSBjb25uZWN0aW9ucyBiZXR3ZWVuIHBhcmVudCBhbmQgY2hpbGQgY2F0ZWdvcmllcworCQkJcmVzb2x2ZUNhdGVnb3JpZXMoKTsKKworCQkJLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBlbGVtZW50cy4gUHJvY2Vzc2luZyB0aGUgaWRlbnRpZmlhYmxlcworCQkJZm9yIChmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA6IGNvbmZpZ0VsZW1lbnRzKSB7CisJCQkJLy8gSXMgdGhpcyBhIENhdGVnb3J5PworCQkJCWlmIChDb25zdGFudHMuQ0FURUdPUllfRUxFTUVOVC5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7CisJCQkJCS8vIFllcworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLy8gSXMgdGhpcyBhIGR1YmxpbiBjb3JlIGVsZW1lbnQ/CisJCQkJZWxzZSBpZiAoQ29uc3RhbnRzLkRVQkxJTl9DT1JFX0VMRU1FTlQKKwkJCQkJCS5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7CisJCQkJCS8vIFllcworCQkJCQkvLyBXYXMgYSBjYXRlZ29yeSBpZCBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQ/CisJCQkJCUNhdGVnb3J5IGNhdGVnb3J5ID0gcm9vdDsKKwkJCQkJZmluYWwgU3RyaW5nIGNhdGVnb3J5SWQgPSBlbGVtZW50CisJCQkJCQkJLmdldEF0dHJpYnV0ZSgiY2F0ZWdvcnlfaWQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlpZiAoY2F0ZWdvcnlJZCAhPSBudWxsKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCWNhdGVnb3J5ID0gY2F0ZWdvcnlNYXAuZ2V0KGNhdGVnb3J5SWQpOworCQkJCQkJLy8gRGlkIHdlIGZpbmQgdGhlIGNhdGVnb3J5PworCQkJCQkJaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKKwkJCQkJCQkvLyBObworCQkJCQkJCUFjdGl2YXRvci5sb2dFcnJvcihNZXNzYWdlRm9ybWF0LmZvcm1hdChNZXNzYWdlcworCQkJCQkJCQkJLmdldFN0cmluZygiSVBWaWV3Lk5vX0NhdGVnb3J5IiksIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCWNhdGVnb3J5SWQpLCBudWxsKTsKKwkJCQkJCQljYXRlZ29yeSA9IHJvb3Q7CisJCQkJCQl9CisKKwkJCQkJCWNhdGVnb3J5ID0gY2F0ZWdvcnkgPT0gbnVsbCA/IHJvb3QgOiBjYXRlZ29yeTsKKwkJCQkJfQorCQkJCQlhZGRJZGVudGlmaWFibGVEZWxlZ2F0ZShjYXRlZ29yeSwgZWxlbWVudCk7CisJCQkJfSAvLyBpZiBkdWJsaW4gY29yZQorCQkJCS8vIElzIGl0IGFuIGVsZW1lbnQgd2l0aCBhICJuYW1lIiBhdHRyaWJ1dGU/CisJCQkJZWxzZSBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSAhPSBudWxsKSB7CisJCQkJCS8vIFllcworCQkJCQlhZGRJZGVudGlmaWFibGVEZWxlZ2F0ZShyb290LCBlbGVtZW50KTsKKwkJCQl9IC8vIGlmCisJCQkJZWxzZSB7CisJCQkJCUFjdGl2YXRvci5sb2dFcnJvcihNZXNzYWdlRm9ybWF0LmZvcm1hdChNZXNzYWdlcworCQkJCQkJCS5nZXRTdHJpbmcoIklQVmlldy5VbmV4cGVjdGVkX0VsZW1lbnQiKSwgZWxlbWVudAorCQkJCQkJCS5nZXROYW1lKCksIGV4dGVuc2lvblBvaW50SUQpLCBudWxsKTsKKwkJCQl9IC8vIGVsc2UKKwkJCX0gLy8gZm9yIGVhY2ggY29uZmlndXJhdGlvbiBlbGVtZW50CisKKwkJfSAvLyBJZGVudGlmaWFibGVWaWV3TW9kZWwKKworCQkvKioKKwkJICogQWRkIGFuIHtAbGluayBJZGVudGlmaWFibGVEZWxlZ2F0ZX0gdG8gdGhlIG1vZGVsLgorCQkgKiAKKwkJICogQHBhcmFtIGNhdGVnb3J5CisJCSAqICAgICAgICAgICAgdGhlIHtAbGluayBDYXRlZ29yeX0gdG8gYWRkIHRoZSBkZWxlZ2F0ZSB0bworCQkgKiAKKwkJICogQHBhcmFtIGVsZW1lbnQKKwkJICogICAgICAgICAgICB0aGUge0BsaW5rIER1YmxpbkNvcmV9IGVsZW1lbnQgdGhhdCBkZWZpbmVzIHRoZSBkZWxlZ2F0ZQorCQkgKi8KKwkJcHJpdmF0ZSB2b2lkIGFkZElkZW50aWZpYWJsZURlbGVnYXRlKGZpbmFsIENhdGVnb3J5IGNhdGVnb3J5LAorCQkJCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CisJCQlmaW5hbCBJZGVudGlmaWFibGVEZWxlZ2F0ZSBpZGVudGlmaWFibGVEZWxlZ2F0ZSA9IG5ldyBJZGVudGlmaWFibGVEZWxlZ2F0ZSgKKwkJCQkJZWxlbWVudCk7CisJCQljYXRlZ29yeS5hZGRJZGVudGlmaWFibGVEZWxlZ2F0ZShpZGVudGlmaWFibGVEZWxlZ2F0ZSk7CisJCX0gLy8gYWRkSWRlbnRpZmlhYmxlRGVsZWdhdGUKKworCQkvKioKKwkJICogQWRkIGEge0BsaW5rIENhdGVnb3J5fSB0byB0aGUgbW9kZWwuCisJCSAqIAorCQkgKiBAcGFyYW0gZWxlbWVudAorCQkgKiAgICAgICAgICAgIHRoZSBjYXRlZ29yeSBlbGVtZW50IHRoYXQgZGVmaW5lcyB0aGUgY2F0ZWdvcnkKKwkJICovCisJCXByaXZhdGUgQ2F0ZWdvcnkgYWRkQ2F0ZWdvcnkoZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKKwkJCWZpbmFsIENhdGVnb3J5IGNhdGVnb3J5ID0gbmV3IENhdGVnb3J5KGVsZW1lbnQpOworCQkJLy8gRG9lcyB0aGUgY2F0ZWdvcnkgYWxyZWFkeSBleGlzdD8KKwkJCUNhdGVnb3J5IHJldFZhbHVlID0gY2F0ZWdvcnlNYXAuZ2V0KGNhdGVnb3J5LmdldENhdGVnb3J5SWQoKSk7CisKKwkJCWlmIChyZXRWYWx1ZSA9PSBudWxsKSB7CisJCQkJLy8gTm8KKwkJCQkvLyBJdCdzIG5ldworCQkJCXJldFZhbHVlID0gY2F0ZWdvcnk7CisJCQkJY2F0ZWdvcnlNYXAucHV0KGNhdGVnb3J5LmdldENhdGVnb3J5SWQoKSwgY2F0ZWdvcnkpOworCQkJfQorCisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gYWRkQ2F0ZWdvcnkKKworCQkvKioKKwkJICogSG9vayB1cCBwYXJlbnQgYW5kIGNoaWxkIGNhdGVnb3JpZXMuCisJCSAqLworCQlwcml2YXRlIHZvaWQgcmVzb2x2ZUNhdGVnb3JpZXMoKSB7CisJCQkvLyBHbyB0aHJvdWdoIGVhY2ggb2YgdGhlIGNhdGVnb3JpZXMgaG9va2luZyB1cCBwYXJlbnQgd2l0aCBjaGlsZAorCQkJZm9yIChmaW5hbCBDYXRlZ29yeSBjYXRlZ29yeSA6IGNhdGVnb3J5TWFwLnZhbHVlcygpKSB7CisJCQkJLy8gSXMgdGhpcyB0aGUgcm9vdCBjYXRlZ29yeT8KKwkJCQlpZiAoY2F0ZWdvcnkgPT0gcm9vdCkgeworCQkJCQkvLyBZZXMKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJLy8gRG9lcyBpdCdzIHBhcmVudCBleGlzdD8KKwkJCQlDYXRlZ29yeSBwYXJlbnRDYXRlZ29yeSA9IGNhdGVnb3J5TWFwLmdldChjYXRlZ29yeQorCQkJCQkJLmdldFBhcmVudElkKCkpOworCQkJCWlmIChwYXJlbnRDYXRlZ29yeSA9PSBudWxsKSB7CisJCQkJCS8vIE5vCisJCQkJCUFjdGl2YXRvcgorCQkJCQkJCS5sb2dJbmZvcm1hdGlvbigKKwkJCQkJCQkJCSJXaGVuIG9yZ2FuaXppbmcgY2F0ZWdvcmllcywgdGhlIHNwZWNpZmllZCBwYXJlbnQgY2F0ZWdvcnkgXCIiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkJKyBjYXRlZ29yeS5nZXRQYXJlbnRJZCgpCisJCQkJCQkJCQkJCSsgIlwiIGZvciB0aGUgY2F0ZWdvcnkgXCIiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkJKyBjYXRlZ29yeS5nZXRDYXRlZ29yeUlkKCkKKwkJCQkJCQkJCQkJKyAiXCIgY291bGQgbm90IGJlIGZvdW5kLiAgVXNpbmcgXCIvXCIgaW5zdGVhZC4iLCAvLyROT04tTkxTLTEkCisJCQkJCQkJCQludWxsKTsKKwkJCQkJcGFyZW50Q2F0ZWdvcnkgPSByb290OworCQkJCX0gLy8gaWYgcGFyZW50IGV4aXN0cworCisJCQkJY2F0ZWdvcnkuc2V0UGFyZW50KHBhcmVudENhdGVnb3J5KTsKKwkJCQlwYXJlbnRDYXRlZ29yeS5hZGRDaGlsZENhdGVnb3J5KGNhdGVnb3J5KTsKKworCQkJfSAvLyBmb3IgZWFjaCBjYXRlZ29yeQorCQl9IC8vIHJlc29sdmVDYXRlZ29yaWVzCisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIHJvb3QKKwkJICovCisJCXByb3RlY3RlZCBmaW5hbCBDYXRlZ29yeSBnZXRSb290KCkgeworCQkJcmV0dXJuIHJvb3Q7CisJCX0KKworCX0gLy8gSWRlbnRpZmlhYmxlVmlld01vZGVsCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZWxlbWVudCBpbiB0aGUgdHJlZSB0aGF0IGlzIHRoZSBtb2RlbCBvZiB0aGUKKwkgKiBwbHVnZ2VkIGluIGdyYXBocy4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENhdGVnb3J5IGltcGxlbWVudHMgQ29tcGFyYWJsZTxPYmplY3Q+IHsKKwkJQ2F0ZWdvcnkgcGFyZW50OworCisJCVN0cmluZyBwYXJlbnRJZDsKKworCQlTdHJpbmcgY2F0ZWdvcnlJZDsKKworCQlTdHJpbmcgY2F0ZWdvcnlOYW1lOworCisJCUxpc3Q8Q2F0ZWdvcnk+IGNoaWxkQ2F0ZWdvcmllczsKKworCQlMaXN0PElkZW50aWZpYWJsZURlbGVnYXRlPiBjaGlsZElkZW50aWZpYWJsZXM7CisKKwkJcHJvdGVjdGVkIENhdGVnb3J5KGZpbmFsIFN0cmluZyBjYXRlZ29yeU5hbWUsIGZpbmFsIFN0cmluZyBjYXRlZ29yeUlkLAorCQkJCWZpbmFsIFN0cmluZyBwYXJlbnRJZCkgeworCQkJdGhpcy5jYXRlZ29yeU5hbWUgPSBjYXRlZ29yeU5hbWU7CisJCQl0aGlzLmNhdGVnb3J5SWQgPSBjYXRlZ29yeUlkOworCQkJdGhpcy5wYXJlbnRJZCA9IHBhcmVudElkOworCQkJdGhpcy5wYXJlbnQgPSBudWxsOworCQkJdGhpcy5jaGlsZENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PENhdGVnb3J5PigpOworCQkJdGhpcy5jaGlsZElkZW50aWZpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PElkZW50aWZpYWJsZURlbGVnYXRlPigpOworCQl9CisKKwkJcHJvdGVjdGVkIENhdGVnb3J5KGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CisJCQl0aGlzKGdldE5MU0NhdGFnb3J5TmFtZShlbGVtZW50CisJCQkJCS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkNBVEVHT1JZX05BTUVfQVRUUklCVVRFKSksIGVsZW1lbnQKKwkJCQkJLmdldEF0dHJpYnV0ZShDb25zdGFudHMuQ0FURUdPUllfSURfQVRUUklCVVRFKSwgZWxlbWVudAorCQkJCQkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5QQVJFTlRfSURfQVRUUklCVVRFKSk7CisJCX0KKworCQkvKioKKwkJICogQHBhcmFtIGNhdGVnb3J5CisJCSAqICAgICAgICAgICAgYSBjaGlsZCB7QGxpbmsgQ2F0ZWdvcnl9IHRvIGFkZCB0byB0aGlzIHBhcmVudAorCQkgKi8KKwkJcHVibGljIHZvaWQgYWRkQ2hpbGRDYXRlZ29yeShmaW5hbCBDYXRlZ29yeSBjYXRlZ29yeSkgeworCQkJY2hpbGRDYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7CisJCX0KKworCQkvKioKKwkJICogQHBhcmFtIGlkZW50aWZpYWJsZURlbGVnYXRlCisJCSAqICAgICAgICAgICAgdGhlIHtAbGluayBJZGVudGlmaWFibGVEZWxlZ2F0ZX0gdG8gYWRkIHRvIHRoZSBjYXRlZ29yeQorCQkgKi8KKwkJcHVibGljIHZvaWQgYWRkSWRlbnRpZmlhYmxlRGVsZWdhdGUoCisJCQkJZmluYWwgSWRlbnRpZmlhYmxlRGVsZWdhdGUgaWRlbnRpZmlhYmxlRGVsZWdhdGUpIHsKKwkJCWNoaWxkSWRlbnRpZmlhYmxlcy5hZGQoaWRlbnRpZmlhYmxlRGVsZWdhdGUpOworCQl9CisKKwkJLyoqCisJCSAqIEBwYXJhbSBhdHRyaWJ1dGUKKwkJICogICAgICAgICAgICB0aGUgdmFsdWUgb2Yge0BsaW5rIENvbnN0YW50cyNDQVRFR09SWV9OQU1FX0FUVFJJQlVURX0KKwkJICogQHJldHVybiB0aGUgTkxTJ2QgdmVyc2lvbiBvZiB0aGUgY2F0ZWdvcnkgbmFtZQorCQkgKi8KKwkJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5MU0NhdGFnb3J5TmFtZShmaW5hbCBTdHJpbmcgYXR0cmlidXRlKSB7CisJCQlmaW5hbCBTdHJpbmcgbmFtZSA9IEdlb2dyYXBoaWNOYW1lcy5nZXROYW1lKGF0dHJpYnV0ZSk7CisJCQlyZXR1cm4gbmFtZS5zdGFydHNXaXRoKCIhIikgPyBhdHRyaWJ1dGUgOiBuYW1lOworCQl9IC8vIGdldE5MU0NhdGFnb3J5TmFtZQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBjYXRlZ29yeUlkIG9mIHRoaXMge0BsaW5rIENhdGVnb3J5fQorCQkgKi8KKwkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRDYXRlZ29yeUlkKCkgeworCQkJcmV0dXJuIGNhdGVnb3J5SWQ7CisJCX0KKworCQkvKioKKwkJICogQHJldHVybiB0aGUgcGFyZW50SWQKKwkJICovCisJCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0UGFyZW50SWQoKSB7CisJCQlyZXR1cm4gcGFyZW50SWQ7CisJCX0KKworCQkvKioKKwkJICogQHJldHVybiB0aGUgcGFyZW50CisJCSAqLworCQlwcm90ZWN0ZWQgZmluYWwgQ2F0ZWdvcnkgZ2V0UGFyZW50KCkgeworCQkJcmV0dXJuIHBhcmVudDsKKwkJfQorCisJCS8qKgorCQkgKiBAcGFyYW0gcGFyZW50CisJCSAqICAgICAgICAgICAgdGhlIHBhcmVudCB0byBzZXQKKwkJICovCisJCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFBhcmVudChmaW5hbCBDYXRlZ29yeSBwYXJlbnQpIHsKKwkJCXRoaXMucGFyZW50ID0gcGFyZW50OworCQl9CisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIGNoaWxkcmVuIG9mIHRoZSB7QGxpbmsgQ2F0ZWdvcnl9CisJCSAqLworCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKSB7CisJCQlmaW5hbCBMaXN0PE9iamVjdD4ga2lkTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZENhdGVnb3JpZXMpOworCQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZElkZW50aWZpYWJsZXMpOworCQkJa2lkTGlzdC5hZGRBbGwoY2hpbGRDYXRlZ29yaWVzKTsKKwkJCWtpZExpc3QuYWRkQWxsKGNoaWxkSWRlbnRpZmlhYmxlcyk7CisJCQlyZXR1cm4ga2lkTGlzdC50b0FycmF5KCk7CisJCX0gLy8gZ2V0Q2hpbGRyZW4KKworCQkvKioKKwkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJZmluYWwgU3RyaW5nQnVpbGRlciByZXRWYWx1ZSA9IG5ldyBTdHJpbmdCdWlsZGVyKGNhdGVnb3J5TmFtZSk7CisJCQlyZXRWYWx1ZS5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCXJldFZhbHVlLmFwcGVuZChjYXRlZ29yeUlkKTsKKwkJCXJldFZhbHVlLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0VmFsdWUuYXBwZW5kKHBhcmVudElkKTsKKwkJCXJldHVybiByZXRWYWx1ZS50b1N0cmluZygpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJCWZpbmFsIGludCBQUklNRSA9IDMxOworCQkJaW50IHJlc3VsdCA9IDE7CisJCQlyZXN1bHQgPSBQUklNRSAqIHJlc3VsdAorCQkJCQkrICgoY2F0ZWdvcnlJZCA9PSBudWxsKSA/IDAgOiBjYXRlZ29yeUlkLmhhc2hDb2RlKCkpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKwkJCWlmICh0aGlzID09IG9iaikgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJaWYgKG9iaiA9PSBudWxsKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlmaW5hbCBDYXRlZ29yeSBvdGhlciA9IChDYXRlZ29yeSkgb2JqOworCQkJaWYgKGNhdGVnb3J5SWQgPT0gbnVsbCkgeworCQkJCWlmIChvdGhlci5jYXRlZ29yeUlkICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoIWNhdGVnb3J5SWQuZXF1YWxzKG90aGVyLmNhdGVnb3J5SWQpKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQkvKioKKwkJICogQHBhcmFtIG8KKwkJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGNvbXBhcmUKKwkJICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZSNjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCXB1YmxpYyBpbnQgY29tcGFyZVRvKGZpbmFsIE9iamVjdCBvKSB7CisJCQlpbnQgcmV0VmFsdWUgPSAwOworCQkJaWYgKG8gaW5zdGFuY2VvZiBDYXRlZ29yeSkgeworCQkJCS8vIFllcworCQkJCWZpbmFsIENhdGVnb3J5IGNhdGVnb3J5ID0gKENhdGVnb3J5KSBvOworCQkJCXJldFZhbHVlID0gY2F0ZWdvcnlOYW1lLmNvbXBhcmVUbyhjYXRlZ29yeS5jYXRlZ29yeU5hbWUpOworCQkJfSAvLyBpZiBDYXRlZ29yeQorCQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIElkZW50aWZpYWJsZURlbGVnYXRlKSB7CisJCQkJLy8gWWVzCisJCQkJLy8gSW4gYSB0cmVlIGxpc3RpbmcgdGhhdCBtaXhlcyBjYXRlZ29yaWVzIGFuZAorCQkJCS8vIElkZW50aWZpYWJsZURlbGVnYXRlcyB3ZSB3YW50IHRoZSBjYXRlZ29yaWVzIHRvIGFwcGVhciBmaXJzdCwKKwkJCQkvLyBzbyB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLgorCQkJCXJldFZhbHVlID0gMTsKKwkJCX0gLy8gaWYgSWRlbnRpZmlhYmxlRGVsZWdhdGUKKwkJCXJldHVybiByZXRWYWx1ZTsKKwkJfSAvLyBjb21wYXJlVG8KKworCX0gLy8gQ2F0ZWdvcnkKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgY29udGVudCBmb3IgdGhlIHRyZWUgdmlldyBvZiB0aGUge0BsaW5rIElkZW50aWZpYWJsZX0KKwkgKiBzIHRoYXQgYXJlIGF2YWlsYWJsZSBhcyBwYXJ0cyBvZiBwbHVnLWlucy4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIElkZW50aWZpYWJsZVBsdWdpblZpZXdUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMKKwkJCUlUcmVlQ29udGVudFByb3ZpZGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oZmluYWwgT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKKwkJCU9iamVjdFtdIHJldFZhbHVlID0gbnVsbDsKKwkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ2F0ZWdvcnkpIHsKKwkJCQlmaW5hbCBDYXRlZ29yeSBjYXRlZ29yeSA9IChDYXRlZ29yeSkgcGFyZW50RWxlbWVudDsKKwkJCQlmaW5hbCBMaXN0PE9iamVjdD4ga2lkTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCQkJCUNvbGxlY3Rpb25zLnNvcnQoY2F0ZWdvcnkuY2hpbGRDYXRlZ29yaWVzKTsKKwkJCQlDb2xsZWN0aW9ucy5zb3J0KGNhdGVnb3J5LmNoaWxkSWRlbnRpZmlhYmxlcyk7CisJCQkJa2lkTGlzdC5hZGRBbGwoY2F0ZWdvcnkuY2hpbGRDYXRlZ29yaWVzKTsKKwkJCQlraWRMaXN0LmFkZEFsbChjYXRlZ29yeS5jaGlsZElkZW50aWZpYWJsZXMpOworCQkJCXJldFZhbHVlID0ga2lkTGlzdC50b0FycmF5KCk7CisJCQl9CisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gZ2V0Q2hpbGRyZW4KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoZmluYWwgT2JqZWN0IGVsZW1lbnQpIHsKKwkJCU9iamVjdCByZXRWYWx1ZSA9IG51bGw7CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENhdGVnb3J5KSB7CisJCQkJcmV0VmFsdWUgPSAoKENhdGVnb3J5KSBlbGVtZW50KS5wYXJlbnQ7CisJCQl9IGVsc2UgeworCQkJCXJldFZhbHVlID0gKChJZGVudGlmaWFibGVEZWxlZ2F0ZSkgZWxlbWVudCkuZ2V0UGFyZW50KCk7CisJCQl9CisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gZ2V0UGFyZW50CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oZmluYWwgT2JqZWN0IGVsZW1lbnQpIHsKKwkJCWJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2F0ZWdvcnkpIHsKKwkJCQlmaW5hbCBDYXRlZ29yeSBjYWdhdG9yeSA9IChDYXRlZ29yeSkgZWxlbWVudDsKKwkJCQlyZXRWYWx1ZSA9IGNhZ2F0b3J5LmNoaWxkQ2F0ZWdvcmllcy5zaXplKCkgPiAwCisJCQkJCQl8fCBjYWdhdG9yeS5jaGlsZElkZW50aWZpYWJsZXMuc2l6ZSgpID4gMDsKKwkJCX0KKwkJCXJldHVybiByZXRWYWx1ZTsKKwkJfSAvLyBoYXNDaGlsZHJlbgorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhmaW5hbCBPYmplY3QgaW5wdXRFbGVtZW50KSB7CisJCQlmaW5hbCBJZGVudGlmaWFibGVWaWV3TW9kZWwgbW9kZWwgPSAoSWRlbnRpZmlhYmxlVmlld01vZGVsKSBpbnB1dEVsZW1lbnQ7CisJCQkvLyByZXR1cm4gbmV3IE9iamVjdFtdIHsgbW9kZWwuZ2V0Um9vdCgpIH07CisJCQlBcnJheXMuc29ydChtb2RlbC5nZXRSb290KCkuZ2V0Q2hpbGRyZW4oKSk7CisJCQlyZXR1cm4gbW9kZWwuZ2V0Um9vdCgpLmdldENoaWxkcmVuKCk7CisJCX0gLy8gZ2V0RWxlbWVudHMKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCisJCSAqLworCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkJLy8gTm90aGluZyB0byBkaXNwb3NlCisJCX0gLy8gZGlzcG9zZQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCisJCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZCgKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgVmlld2VyIHZpZXdlciwKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgT2JqZWN0IG9sZElucHV0LAorCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBPYmplY3QgbmV3SW5wdXQpIHsKKwkJCS8vIE5vdGhpbmcgdG8gZG8gcmlnaHQgbm93CisJCX0gLy8gaW5wdXRDaGFuZ2VkCisKKwl9IC8vIElkZW50aWZpYWJsZVBsdWdpblZpZXdUcmVlQ29udGVudFByb3ZpZGVyCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGxhYmVscyB0aGUgZGVzY3JpYmUgdGhlIHtAbGluayBJZGVudGlmaWFibGV9cworCSAqIGF2YWlsYWJsZSBhcyBwYXJ0IG9mIHBsdWctaW5zLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgSWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyCisJCQlpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKKworCQlwcml2YXRlIHN0YXRpYyBJbWFnZSBjYXRlZ29yeUljb24gPSBudWxsOworCisJCS8vIElmIHRydWUgdGhlbiB3ZSd2ZSBuZXZlciB0cmllZCB0byBnZXQgdGhlIGljb24KKwkJc3RhdGljIGJvb2xlYW4gY2F0ZWdvcnlJY29uRmlyc3RUaW1lID0gdHJ1ZTsKKworCQlwcml2YXRlIGZpbmFsIExpc3Q8SUxhYmVsUHJvdmlkZXJMaXN0ZW5lcj4gbGlzdGVuZXJzOworCisJCS8qKgorCQkgKiBDb25zdHJ1Y3RvcgorCQkgKi8KKwkJcHVibGljIElkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlcigpIHsKKwkJCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SUxhYmVsUHJvdmlkZXJMaXN0ZW5lcj4oKTsKKwkJfSAvLyBJZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoZmluYWwgT2JqZWN0IGVsZW1lbnQpIHsKKwkJCUltYWdlIHJldFZhbHVlID0gbnVsbDsKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2F0ZWdvcnkpIHsKKwkJCQlyZXRWYWx1ZSA9IGdldENhdGVnb3J5SWNvbigpOworCQkJfQorCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGdldEltYWdlCisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIGljb24gdG8gYmUgdXNlZCB0byByZXByZXNlbnQge0BsaW5rIENhdGVnb3J5fXMsIG9yCisJCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgY2FuJ3QgYmUgbG9hZGVkLgorCQkgKi8KKwkJcHJvdGVjdGVkIEltYWdlIGdldENhdGVnb3J5SWNvbigpIHsKKwkJCS8vIFNob3VsZCB3ZSB0cnkgdG8gbG9hZCB0aGUgaWNvbj8KKwkJCWlmIChjYXRlZ29yeUljb25GaXJzdFRpbWUgJiYgY2F0ZWdvcnlJY29uID09IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQljYXRlZ29yeUljb25GaXJzdFRpbWUgPSBmYWxzZTsKKwkJCQljYXRlZ29yeUljb24gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpCisJCQkJCQkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZPTERFUik7CisJCQl9IC8vIGlmIHdlIHNob3VsZCBsb2FkIHRoZSBpY29uCisJCQlyZXR1cm4gY2F0ZWdvcnlJY29uOworCQl9IC8vIGdldENhdGVnb3J5SWNvbgorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRUZXh0KGZpbmFsIE9iamVjdCBlbGVtZW50KSB7CisJCQlTdHJpbmcgcmV0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDYXRlZ29yeSkgeworCQkJCWZpbmFsIENhdGVnb3J5IGNhdGVnb3J5ID0gKENhdGVnb3J5KSBlbGVtZW50OworCQkJCXJldFZhbHVlID0gY2F0ZWdvcnkuY2F0ZWdvcnlOYW1lOworCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlRGVsZWdhdGUpIHsKKwkJCQlmaW5hbCBJZGVudGlmaWFibGVEZWxlZ2F0ZSBpZGVudGlmaWFibGVEZWxlZ2F0ZSA9IChJZGVudGlmaWFibGVEZWxlZ2F0ZSkgZWxlbWVudDsKKwkJCQlyZXRWYWx1ZSA9IGlkZW50aWZpYWJsZURlbGVnYXRlLnRvU3RyaW5nKCk7CisJCQl9CisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gZ2V0VGV4dAorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKKwkJICovCisJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKGZpbmFsIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCQl9IC8vIGFkZExpc3RlbmVyCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCisJCSAqLworCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkJLy8gTm90aGluZyB0byBkby4gVGhlIGltYWdlcyBhcmUgZGlzcG9zZWQgb2YgZWxzZXdoZXJlLAorCQl9IC8vIGRpc3Bvc2UKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKKwkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KAorCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBPYmplY3QgZWxlbWVudCwKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgU3RyaW5nIHByb3BlcnR5KSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gLy8gaXNMYWJlbFByb3BlcnR5CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQorCQkgKi8KKwkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoZmluYWwgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJCX0gLy8gcmVtb3ZlTGlzdGVuZXIKKworCX0gLy8gSWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGRpc3BsYXlzIHRoZSB7QGxpbmsgRHVibGluQ29yZX0gbWV0YWRhdGEgb2YKKwkgKiB7QGxpbmsgSWRlbnRpZmlhYmxlfXMgd2hlbiB0aGUgbW91c2UgaG92ZXJzIG92ZXIgaXQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHVibGluQ29yZVRvb2xUaXBIYW5kbGVyIHsKKwkJLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHBpeGVscyBiZWxvdyB0aGUgY3VycmVudCBtb3VzZSBwb3NpdGlvbiBhdAorCQkvLyB3aGljaCB0byBwb3NpdGlvbiB0aGUgZHVibGluIGNvcmUKKwkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgWV9PRkZTRVQgPSAxNjsKKworCQlwcm90ZWN0ZWQgU2hlbGwgZGNUaXBTaGVsbDsKKworCQlMYWJlbCBkY0Rlc2NyaXB0aW9uVGV4dDsKKworCQlMYWJlbCBkY0NyZWF0b3JUZXh0OworCisJCUxhYmVsIGRjVmFsaWRUZXh0OworCisJCUxhYmVsIGRjU291cmNlVGV4dDsKKworCQlEdWJsaW5Db3JlVG9vbFRpcEhhbmRsZXIoZmluYWwgU2hlbGwgcGFyZW50KSB7CisJCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOworCisJCQlkY1RpcFNoZWxsID0gbmV3IFNoZWxsKHBhcmVudCwgU1dULk9OX1RPUCB8IFNXVC5UT09MKTsKKwkJCWZpbmFsIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOworCQkJZGNUaXBTaGVsbC5zZXRMYXlvdXQoZ3JpZExheW91dCk7CisKKwkJCWZpbmFsIENvbG9yIGJhY2tncm91bmRDb2xvciA9IGRpc3BsYXkKKwkJCQkJLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpOworCQkJZmluYWwgQ29sb3IgZm9yZWdyb3VuZENvbG9yID0gZGlzcGxheQorCQkJCQkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fRk9SRUdST1VORCk7CisKKwkJCWRjVGlwU2hlbGwuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOworCisJCQlkY0Rlc2NyaXB0aW9uVGV4dCA9IGNyZWF0ZURDQXR0cmlidXRlTGFiZWwoZGNUaXBTaGVsbCwKKwkJCQkJYmFja2dyb3VuZENvbG9yLCBmb3JlZ3JvdW5kQ29sb3IpOworCisJCQlkY0NyZWF0b3JUZXh0ID0gY3JlYXRlRENBdHRyaWJ1dGVMYWJlbChkY1RpcFNoZWxsLCBiYWNrZ3JvdW5kQ29sb3IsCisJCQkJCWZvcmVncm91bmRDb2xvcik7CisKKwkJCWRjVmFsaWRUZXh0ID0gY3JlYXRlRENBdHRyaWJ1dGVMYWJlbChkY1RpcFNoZWxsLCBiYWNrZ3JvdW5kQ29sb3IsCisJCQkJCWZvcmVncm91bmRDb2xvcik7CisJCQlkY1NvdXJjZVRleHQgPSBjcmVhdGVEQ0F0dHJpYnV0ZUxhYmVsKGRjVGlwU2hlbGwsIGJhY2tncm91bmRDb2xvciwKKwkJCQkJZm9yZWdyb3VuZENvbG9yKTsKKworCQkJZGNUaXBTaGVsbC5wYWNrKCk7CisJCX0gLy8gRHVibGluQ29yZVRvb2xUaXBIYW5kbGVyCisKKwkJcHJpdmF0ZSBMYWJlbCBjcmVhdGVEQ0F0dHJpYnV0ZUxhYmVsKGZpbmFsIFNoZWxsIHBhcmVudCwKKwkJCQlmaW5hbCBDb2xvciBiYWNrZ3JvdW5kQ29sb3IsIGZpbmFsIENvbG9yIGZvcmVncm91bmRDb2xvcikgeworCQkJZmluYWwgTGFiZWwgcmV0VmFsdWUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7CisJCQlyZXRWYWx1ZS5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7CisJCQlyZXRWYWx1ZS5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7CisJCQlyZXRWYWx1ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKKwkJCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpKTsKKwkJCXJldHVybiByZXRWYWx1ZTsKKwkJfSAvLyBjcmVhdGVEQ0F0dHJpYnV0ZUxhYmVsCisKKwkJLyoqCisJCSAqIEFkZCB0aGUgbmVjZXNzYXJ5IGxpc3RlbmVycyB0byB0aGUge0BsaW5rIENvbnRyb2x9IHRvIGNhdGNoIHRoZSBtb3VzZQorCQkgKiBldmVudHMgYW5kIHBvcCB0aGUgdG9vbCB0aXAgdXAuCisJCSAqIAorCQkgKiBAcGFyYW0gY29udHJvbAorCQkgKi8KKwkJcHVibGljIHZvaWQgYWRkRENUb29sVGlwSGVscChmaW5hbCBDb250cm9sIGNvbnRyb2wpIHsKKwkJCS8vIElmIHRoZSB1c2VyIGNsaWNrcyB3aXRoIHRoZSBtb3VzZSB3ZSB3YW50IHRvIGdldCByaWQgb2YgdGhlCisJCQkvLyBkdWJsaW4gY29yZQorCQkJY29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7CisKKwkJCQkvKioKKwkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyI21vdXNlRG93bihvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQpCisJCQkJICovCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgbW91c2VEb3duKAorCQkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIE1vdXNlRXZlbnQgZSkgeworCQkJCQkvLyBJcyB0aGUgZHVibGluIGNvcmUgdmlzaWJsZT8KKwkJCQkJaWYgKGRjVGlwU2hlbGwuaXNWaXNpYmxlKCkpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJLy8gTm90IGFueSBtb3JlCisJCQkJCQlkY1RpcFNoZWxsLnNldFZpc2libGUoZmFsc2UpOworCQkJCQl9IC8vIGlmIHZpc2libGUKKwkJCQl9IC8vIG1vdXNlRG93bgorCisJCQl9KTsKKworCQkJLy8gSWYgdGhlIG1vdXNlIGhvdmVycyB3ZSB3YW50IHRvIHBvcCB1cCB0aGUgZHVibGluIGNvcmUsIGJ1dCBpZiBpdAorCQkJLy8gZXhpdHMgd2Ugd2FudCB0byBnZXQgcmlnaHQgb2YgaXQuCisJCQljb250cm9sLmFkZE1vdXNlVHJhY2tMaXN0ZW5lcihuZXcgTW91c2VUcmFja0FkYXB0ZXIoKSB7CisKKwkJCQkvKioKKwkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0FkYXB0ZXIjbW91c2VIb3ZlcihvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQpCisJCQkJICovCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgbW91c2VIb3ZlcihmaW5hbCBNb3VzZUV2ZW50IGUpIHsKKwkJCQkJZmluYWwgUG9pbnQgcHQgPSBuZXcgUG9pbnQoZS54LCBlLnkpOworCQkJCQkvLyBJcyB0aGUgZXZlbnQncyBXaWRnZXQgYSBUcmVlIChpdCBzaG91bGQgYmUpPworCQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBUcmVlKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCWZpbmFsIFRyZWUgdHJlZSA9IChUcmVlKSBlLndpZGdldDsKKwkJCQkJCWZpbmFsIFRyZWVJdGVtIHRyZWVJdGVtID0gdHJlZS5nZXRJdGVtKHB0KTsKKwkJCQkJCS8vIEFyZSB3ZSBvdmVyIGFueXRoaW5nPworCQkJCQkJaWYgKHRyZWVJdGVtICE9IG51bGwpIHsKKwkJCQkJCQkvLyBZZXMKKwkJCQkJCQlmaW5hbCBPYmplY3Qgb2JqID0gdHJlZUl0ZW0uZ2V0RGF0YSgpOworCisJCQkJCQkJLy8gRG9lcyBpdCBoYXZlIERDIG1ldGEgZGF0YT8KKwkJCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlRGVsZWdhdGUpIHsKKwkJCQkJCQkJLy8gWWVzCisJCQkJCQkJCWZpbmFsIElkZW50aWZpYWJsZURlbGVnYXRlIGlkID0gKElkZW50aWZpYWJsZURlbGVnYXRlKSBvYmo7CisJCQkJCQkJCWZpbmFsIER1YmxpbkNvcmUgZGMgPSBpZC5nZXREdWJsaW5Db3JlKCk7CisKKwkJCQkJCQkJZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uID0gZGMuZ2V0RGVzY3JpcHRpb24oKTsKKwkJCQkJCQkJZmluYWwgU3RyaW5nIGNyZWF0b3IgPSBkYy5nZXRDcmVhdG9yKCk7CisJCQkJCQkJCWZpbmFsIFN0cmluZyB2YWxpZCA9IGRjLmdldFZhbGlkKCk7CisJCQkJCQkJCWZpbmFsIFN0cmluZyBzb3VyY2UgPSBkYy5nZXRTb3VyY2UoKTsKKworCQkJCQkJCQkvLyBJcyB0aGVyZSBhIGRlc2NyaXB0aW9uPworCQkJCQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbAorCQkJCQkJCQkJCSYmICFkZXNjcmlwdGlvbi5lcXVhbHMoIiIpKSB7CisJCQkJCQkJCQkvLyBZZXMKKwkJCQkJCQkJCWRjRGVzY3JpcHRpb25UZXh0LnNldFRleHQoZGVzY3JpcHRpb24pOworCQkJCQkJCQkJZGNEZXNjcmlwdGlvblRleHQuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCQkJCQkJfSAvLyBpZgorCQkJCQkJCQllbHNlIHsKKwkJCQkJCQkJCS8vIE5vCisJCQkJCQkJCQlkY0Rlc2NyaXB0aW9uVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQkJCQkJfQorCisJCQkJCQkJCS8vIElzIHRoZXJlIGEgY3JlYXRvcj8KKwkJCQkJCQkJaWYgKGNyZWF0b3IgIT0gbnVsbCAmJiAhY3JlYXRvci5lcXVhbHMoIiIpKSB7CisJCQkJCQkJCQkvLyBZZXMKKwkJCQkJCQkJCWRjQ3JlYXRvclRleHQuc2V0VGV4dChjcmVhdG9yKTsKKwkJCQkJCQkJCWRjQ3JlYXRvclRleHQuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCQkJCQkJfSAvLyBpZgorCQkJCQkJCQllbHNlIHsKKwkJCQkJCQkJCS8vIE5vCisJCQkJCQkJCQlkY0NyZWF0b3JUZXh0LnNldFZpc2libGUoZmFsc2UpOworCQkJCQkJCQl9CisJCQkJCQkJCS8vIElzIHRoZXJlIGEgdmFsaWQgcmFuZ2U/CisJCQkJCQkJCWlmICh2YWxpZCAhPSBudWxsICYmICF2YWxpZC5lcXVhbHMoIiIpKSB7CisJCQkJCQkJCQkvLyBZZXMKKwkJCQkJCQkJCWRjVmFsaWRUZXh0LnNldFRleHQodmFsaWQpOworCQkJCQkJCQkJZGNWYWxpZFRleHQuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCQkJCQkJfSAvLyBpZgorCQkJCQkJCQllbHNlIHsKKwkJCQkJCQkJCS8vIE5vCisJCQkJCQkJCQlkY1ZhbGlkVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQkJCQkJfQorCisJCQkJCQkJCS8vIElzIHRoZXJlIGEgc291cmNlPworCQkJCQkJCQlpZiAoc291cmNlICE9IG51bGwgJiYgIXNvdXJjZS5lcXVhbHMoIiIpKSB7CisJCQkJCQkJCQkvLyBZZXMKKwkJCQkJCQkJCWRjU291cmNlVGV4dC5zZXRUZXh0KHNvdXJjZSk7CisJCQkJCQkJCQlkY1NvdXJjZVRleHQuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCQkJCQkJfSAvLyBpZgorCQkJCQkJCQllbHNlIHsKKwkJCQkJCQkJCS8vIE5vCisJCQkJCQkJCQlkY1NvdXJjZVRleHQuc2V0VmlzaWJsZShmYWxzZSk7CisJCQkJCQkJCX0KKworCQkJCQkJCQlkY1RpcFNoZWxsLnBhY2soKTsKKworCQkJCQkJCQkvLyBOb3cgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHdoZXJlIHRvIHBvc2l0aW9uCisJCQkJCQkJCS8vIHRoZSBzaGVsbCBjb250YWluaW5nIHRoZSBkdWJsaW4gY29yZSB0b29sIHRpcAorCQkJCQkJCQkvLyBnaXZlbiB0aGUgc2l6ZSBvZiB0aGUgdG9vbCB0aXAgYW5kIHRoZSBib3VuZHMKKwkJCQkJCQkJLy8gb2YgdGhlIERpc3BsYXkuCisJCQkJCQkJCWRjVGlwU2hlbGwuc2V0Qm91bmRzKGNvbXB1dGVIb3ZlckxvY2F0aW9uKAorCQkJCQkJCQkJCWRjVGlwU2hlbGwsIGNvbnRyb2wudG9EaXNwbGF5KHB0KSkpOworCisJCQkJCQkJCS8vIE1ha2UgdGhlIER1YmxpbiBDb3JlIHRvb2wgdGlwIHZpc2libGUKKwkJCQkJCQkJZGNUaXBTaGVsbC5zZXRWaXNpYmxlKHRydWUpOworCQkJCQkJCX0gLy8gaWYgSUNvbmZpZ3VyYXRpb25FbGVtZW50CisKKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJLy8gTm8KKwkJCQkJCQkJZGNUaXBTaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQkJCQl9CisJCQkJCQl9IC8vIGlmIGRpc3BsYXkgREMKKwkJCQkJCWVsc2UgeworCQkJCQkJCS8vIE5vCisJCQkJCQkJZGNUaXBTaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQkJCX0KKworCQkJCQl9IC8vIGlmIFRyZWUKKworCQkJCX0gLy8gbW91c2VIb3ZlcgorCisJCQkJLyoqCisJCQkJICogRmlndXJlIG91dCB3aGVyZSB0byBwb3NpdGlvbiB0aGUgdG9vbCB0aXAKKwkJCQkgKiAKKwkJCQkgKiBAcGFyYW0gZGNUaXBTaGVsbAorCQkJCSAqICAgICAgICAgICAgdGhlIHtAbGluayBTaGVsbH0gdGhhdCBjb250YWlucyB0aGUgZHVibGluIGNvcmUKKwkJCQkgKiBAcGFyYW0gbW91c2VQb3NpdGlvbgorCQkJCSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIE1vdXNlIHJlbGF0aXZlIHRvIHRoZQorCQkJCSAqICAgICAgICAgICAgRGlzcGxheQorCQkJCSAqLworCQkJCXByaXZhdGUgUmVjdGFuZ2xlIGNvbXB1dGVIb3ZlckxvY2F0aW9uKGZpbmFsIFNoZWxsIGRjVGlwU2hlbGwsCisJCQkJCQlmaW5hbCBQb2ludCBtb3VzZVBvc2l0aW9uKSB7CisJCQkJCS8vIEdldCB0aGUgY3VycmVudCBib3VuZHMgb2YgdGhlIHRvb2xUaXAKKwkJCQkJZmluYWwgUmVjdGFuZ2xlIHJldFZhbHVlID0gZGNUaXBTaGVsbC5nZXRCb3VuZHMoKTsKKworCQkJCQlmaW5hbCBSZWN0YW5nbGUgZGlzcGxheUJvdW5kcyA9IGRjVGlwU2hlbGwuZ2V0RGlzcGxheSgpCisJCQkJCQkJLmdldEJvdW5kcygpOworCQkJCQkvLyBUaGUgeCBwb3NpdGlvbiBpcyBlaXRoZXIgdGhlIGN1cnJlbnQgbW91c2UgcG9zaXRpb24gaWYKKwkJCQkJLy8gdGhlIGR1YmxpbiBjb3JlIGNhbiBiZSBkaXNwbGF5ZWQgZW50aXJlbHkgdG8gdGhlIHJpZ2h0IG9mCisJCQkJCS8vIHRoYXQsIG9yIGEgdmFsdWUgdG8gdGhlIGxlZnQgb2YgdGhhdCB0aGF0IGFsbG93cyBpdCB0byBiZQorCQkJCQkvLyBkaXNwbGF5ZWQsIHdpdGggMCBiZWluZyB0aGUgbGltaXQuCisJCQkJCXJldFZhbHVlLnggPSBNYXRoLm1heChNYXRoLm1pbihtb3VzZVBvc2l0aW9uLngsCisJCQkJCQkJZGlzcGxheUJvdW5kcy53aWR0aCAtIHJldFZhbHVlLndpZHRoKSwgMCk7CisKKwkJCQkJLy8gVGhlIHkgcG9zaXRpb24gaXMgWV9PRkZTRVQgcGl4ZWxzIGJlbG93IHRoZSBjdXJyZW50IG1vdXNlCisJCQkJCS8vIHBvc2l0aW9uLCBvciBpZiB0aGUgZW50aXJlIGR1YmxpbiBjb3JlIHdvbid0IGZpdCBpbiB0aGUKKwkJCQkJLy8gd2luZG93IGF0IHRoYXQgcG9zaXRpb24sIHRoZW4gdGhlIGxvd2VzdCBwb3NpdGlvbiBhYm92ZQorCQkJCQkvLyB0aGF0IHdoZXJlIGl0IGNhbiwgd2l0aCAwICh0aGUgdG9wIG9mIHRoZSBEaXNwbGF5KSBiZWluZworCQkJCQkvLyB0aGUgbGltaXQKKwkJCQkJcmV0VmFsdWUueSA9IE1hdGgubWF4KE1hdGgubWluKG1vdXNlUG9zaXRpb24ueSArIFlfT0ZGU0VULAorCQkJCQkJCWRpc3BsYXlCb3VuZHMuaGVpZ2h0IC0gcmV0VmFsdWUuaGVpZ2h0KSwgMCk7CisKKwkJCQkJcmV0dXJuIHJldFZhbHVlOworCQkJCX0gLy8gY29tcHV0ZUhvdmVyTG9jYXRpb24KKworCQkJCS8qKgorCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVRyYWNrQWRhcHRlciNtb3VzZUV4aXQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50KQorCQkJCSAqLworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIG1vdXNlRXhpdCgKKwkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBNb3VzZUV2ZW50IGUpIHsKKwkJCQkJLy8gSXMgdGhlIGR1YmxpbiBjb3JlIHZpc2libGU/CisJCQkJCWlmIChkY1RpcFNoZWxsLmlzVmlzaWJsZSgpKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCS8vIE5vdCBhbnkgbW9yZQorCQkJCQkJZGNUaXBTaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQkJfSAvLyBpZiB2aXNpYmxlCisJCQkJfSAvLyBtb3VzZUV4aXQKKwkJCX0pOworCQl9IC8vIGFkZERDVG9vbFRpcEhlbHAKKwl9IC8vIER1YmxpbkNvcmVUb29sVGlwSGFuZGxlcgorfSAvLyBJZGVudGlmaWFibGVQbHVnaW5WaWV3CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL01lc3NhZ2VzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxYWU3MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDQyIEBACisvLyBNZXNzYWdlcy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlcyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQorCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7CisKKwlwcml2YXRlIE1lc3NhZ2VzKCkgeworCQkvLyBOb3RoaW5nCisJfQorCisJLyoqCisJICogQHBhcmFtIGtleQorCSAqIEByZXR1cm4gdGhlIHN0cmluZyBtYXRjaGluZyB0aGUga2V5CisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7CisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOworCQl9CisJfQorfSAvLyBNZXNzYWdlcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9Nb2RlbHNWaWV3LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL01vZGVsc1ZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjEzYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9Nb2RlbHNWaWV3LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8vIE1vZGVsc1ZpZXcuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5JU2hhcmVkSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGVjbGlwc2UgdmlldyBvZiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbH1zIHRoYXQgaGF2ZSBiZWVuCisgKiBpbXBvcnRlZCBpbnRvIGVjbGlwc2UgYXMgcGx1Zy1pbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBNb2RlbHNWaWV3IGV4dGVuZHMgSWRlbnRpZmlhYmxlUGx1Z2luVmlldyB7CisKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgTW9kZWwgVmlldworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX01PREVMU19WSUVXID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MubW9kZWxzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgTW9kZWxzVmlldygpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSWRlbnRpZmlhYmxlUGx1Z2luVmlldyNnZXRJZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIgZ2V0SWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyKCkgeworCQlyZXR1cm4gbmV3IE1vZGVsUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyKCk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgaW5wdXQgbW9kZWwgc3BlY2lmaWMgdG8gdGhpcyB2aWV3CisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElkZW50aWZpYWJsZVZpZXdNb2RlbCBnZXRJbnB1dCgpIHsKKwkJcmV0dXJuIE1vZGVsVmlld01vZGVsLmdldE1vZGVsKCk7CisJfSAvLyBnZXRJbnB1dAorCisJLyoqCisJICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIGEgbW9kZWwgb2YgdGhlIFNURU0KKwkgKiB7QGxpbmsgTW9kZWx9IHRoYXQgYXJlIHBsdWdnZWQgaW50byB0aGUgc3lzdGVtLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTW9kZWxWaWV3TW9kZWwgZXh0ZW5kcyBJZGVudGlmaWFibGVWaWV3TW9kZWwgeworCQkvLyBUaGUgc2luZ2xldG9uIGluc3RhbmNlCisJCXByaXZhdGUgc3RhdGljIE1vZGVsVmlld01vZGVsIG12TW9kZWw7CisKKwkJcHJpdmF0ZSBNb2RlbFZpZXdNb2RlbCgpIHsKKwkJCXN1cGVyKENvbnN0YW50cy5JRF9NT0RFTF9FWFRFTlNJT05fUE9JTlQpOworCQl9CisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgTW9kZWxWaWV3TW9kZWwKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgTW9kZWxWaWV3TW9kZWwgZ2V0TW9kZWwoKSB7CisJCQlpZiAobXZNb2RlbCA9PSBudWxsKSB7CisJCQkJbXZNb2RlbCA9IG5ldyBNb2RlbFZpZXdNb2RlbCgpOworCQkJfQorCQkJcmV0dXJuIG12TW9kZWw7CisJCX0gLy8gZ2V0TW9kZWwKKworCX0gLy8gTW9kZWxWaWV3c01vZGVsCisKKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE1vZGVsUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyIGV4dGVuZHMKKwkJCUlkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlciB7CisKKwkJLy8gVGhpcyBpcyB0aGUgaW1hZ2UgdXNlZCB0byByZXByZXNlbnQgbW9kZWxzIGluIHRoZSBtb2RlbCB2aWV3CisJCXN0YXRpYyBJbWFnZSBtb2RlbEljb24gPSBudWxsOworCisJCS8vIElmIHRydWUgdGhlbiB3ZSd2ZSBuZXZlciB0cmllZCB0byBnZXQgdGhlIGljb24KKwkJc3RhdGljIGJvb2xlYW4gbW9kZWxJY29uRmlyc3RUaW1lID0gdHJ1ZTsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLklkZW50aWZpYWJsZVBsdWdpblZpZXcuSWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIEltYWdlIGdldEltYWdlKGZpbmFsIE9iamVjdCBlbGVtZW50KSB7CisJCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBJZGVudGlmaWFibGVEZWxlZ2F0ZSkgPyBnZXRNb2RlbEljb24oKQorCQkJCQk6IHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOworCQl9IC8vIGdldEltYWdlCisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIGljb24gdG8gYmUgdXNlZCB0byByZXByZXNlbnQgbW9kZWxzLCBvciBudWxsIGlmIGl0IGNhbid0CisJCSAqICAgICAgICAgYmUgbG9hZGVkLgorCQkgKi8KKwkJcHJpdmF0ZSBJbWFnZSBnZXRNb2RlbEljb24oKSB7CisJCQkvLyBTaG91bGQgd2UgdHJ5IHRvIGxvYWQgdGhlIGljb24/CisJCQlpZiAobW9kZWxJY29uRmlyc3RUaW1lICYmIG1vZGVsSWNvbiA9PSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJbW9kZWxJY29uRmlyc3RUaW1lID0gZmFsc2U7CisJCQkJbW9kZWxJY29uID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KAorCQkJCQkJSVNoYXJlZEltYWdlcy5NT0RFTF9JQ09OKTsKKwkJCX0gLy8gaWYgd2Ugc2hvdWxkIGxvYWQgdGhlIGljb24KKwkJCXJldHVybiBtb2RlbEljb247CisJCX0gLy8gZ2V0TW9kZWxJY29uCisKKwl9IC8vIE1vZGVsUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyCit9IC8vIE1vZGVsc1ZpZXcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvUHJlZGljYXRlc1ZpZXcuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvUHJlZGljYXRlc1ZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmU0YmZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9QcmVkaWNhdGVzVmlldy5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvLyBQcmVkaWNhdGVzVmlldy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLklTaGFyZWRJbWFnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgZWNsaXBzZSB2aWV3IG9mIHRoZQorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlfXMgdGhhdCBoYXZlIGJlZW4gaW1wb3J0ZWQKKyAqIGludG8gZWNsaXBzZSBhcyBwbHVnLWlucy4KKyAqLworcHVibGljIGNsYXNzIFByZWRpY2F0ZXNWaWV3IGV4dGVuZHMgSWRlbnRpZmlhYmxlUGx1Z2luVmlldyB7CisKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgUHJlZGljYXRlcyBWaWV3IHtAdmFsdWV9CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfUFJFRElDQVRFU19WSUVXID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MucHJlZGljYXRlcyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJcHVibGljIFByZWRpY2F0ZXNWaWV3KCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5JZGVudGlmaWFibGVQbHVnaW5WaWV3I2dldElkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlciBnZXRJZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIoKSB7CisJCXJldHVybiBuZXcgUHJlZGljYXRlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLklkZW50aWZpYWJsZVBsdWdpblZpZXcjZ2V0SW5wdXQoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJZGVudGlmaWFibGVWaWV3TW9kZWwgZ2V0SW5wdXQoKSB7CisJCXJldHVybiBQcmVkaWNhdGVWaWV3TW9kZWwuZ2V0TW9kZWwoKTsKKwl9IC8vIGdldElucHV0CisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgYSBtb2RlbCBvZiB0aGUgU1RFTQorCSAqIHtAbGluayBQcmVkaWNhdGV9cyB0aGF0IGFyZSBwbHVnZ2VkIGludG8gdGhlIHN5c3RlbS4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFByZWRpY2F0ZVZpZXdNb2RlbCBleHRlbmRzIElkZW50aWZpYWJsZVZpZXdNb2RlbCB7CisJCS8vIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UKKwkJcHJpdmF0ZSBzdGF0aWMgUHJlZGljYXRlVmlld01vZGVsIHB2TW9kZWw7CisKKwkJcHJpdmF0ZSBQcmVkaWNhdGVWaWV3TW9kZWwoKSB7CisJCQlzdXBlcihDb25zdGFudHMuSURfUFJFRElDQVRFX0VYVEVOU0lPTl9QT0lOVCk7CisJCX0KKworCQkvKioKKwkJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBNb2RlbFZpZXdNb2RlbAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBQcmVkaWNhdGVWaWV3TW9kZWwgZ2V0TW9kZWwoKSB7CisJCQlpZiAocHZNb2RlbCA9PSBudWxsKSB7CisJCQkJcHZNb2RlbCA9IG5ldyBQcmVkaWNhdGVWaWV3TW9kZWwoKTsKKwkJCX0KKwkJCXJldHVybiBwdk1vZGVsOworCQl9IC8vIGdldE1vZGVsCisJfSAvLyBQcmVkaWNhdGVWaWV3TW9kZWwKKworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgUHJlZGljYXRlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyIGV4dGVuZHMKKwkJCUlkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlciB7CisKKwkJLy8gVGhpcyBpcyB0aGUgaW1hZ2UgdXNlZCB0byByZXByZXNlbnQgcHJlZGljYXRlcyBpbiB0aGUgcHJlZGljYXRlIHZpZXcKKwkJc3RhdGljIEltYWdlIHByZWRpY2F0ZUljb24gPSBudWxsOworCisJCS8vIElmIHRydWUgdGhlbiB3ZSd2ZSBuZXZlciB0cmllZCB0byBnZXQgdGhlIGljb24KKwkJc3RhdGljIGJvb2xlYW4gcHJlZGljYXRlSWNvbkZpcnN0VGltZSA9IHRydWU7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5JZGVudGlmaWFibGVQbHVnaW5WaWV3LklkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgeworCQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlRGVsZWdhdGUpID8gZ2V0UHJlZGljYXRlSWNvbigpCisJCQkJCTogc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7CisJCX0gLy8gZ2V0SW1hZ2UKKworCQkvKioKKwkJICogQHJldHVybiB0aGUgaWNvbiB0byBiZSB1c2VkIHRvIHJlcHJlc2VudCBwcmVkaWNhdGVzLCBvciBudWxsIGlmIGl0CisJCSAqICAgICAgICAgY2FuJ3QgYmUgbG9hZGVkLgorCQkgKi8KKwkJcHJpdmF0ZSBJbWFnZSBnZXRQcmVkaWNhdGVJY29uKCkgeworCQkJLy8gU2hvdWxkIHdlIHRyeSB0byBsb2FkIHRoZSBpY29uPworCQkJaWYgKHByZWRpY2F0ZUljb25GaXJzdFRpbWUgJiYgcHJlZGljYXRlSWNvbiA9PSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJcHJlZGljYXRlSWNvbkZpcnN0VGltZSA9IGZhbHNlOworCQkJCXByZWRpY2F0ZUljb24gPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoCisJCQkJCQlJU2hhcmVkSW1hZ2VzLlBSRURJQ0FURV9JQ09OKTsKKwkJCX0gLy8gaWYgd2Ugc2hvdWxkIGxvYWQgdGhlIGljb24KKwkJCXJldHVybiBwcmVkaWNhdGVJY29uOworCQl9IC8vIGdldFByZWRpY2F0ZUljb24KKworCX0gLy8gUHJlZGljYXRlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyCit9IC8vIFByZWRpY2F0ZXNWaWV3ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9TY2VuYXJpb3NWaWV3LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL1NjZW5hcmlvc1ZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWYxYTgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9TY2VuYXJpb3NWaWV3LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8vIFNjZW5hcmlvc1ZpZXcuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5JU2hhcmVkSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGVjbGlwc2UgdmlldyBvZiB0aGUKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW99cyB0aGF0IGhhdmUgYmVlbiBpbXBvcnRlZCBpbnRvCisgKiBlY2xpcHNlIGFzIHBsdWctaW5zLgorICovCitwdWJsaWMgY2xhc3MgU2NlbmFyaW9zVmlldyBleHRlbmRzIElkZW50aWZpYWJsZVBsdWdpblZpZXcgeworCisJLyoqCisJICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIFNjZW5hcmlvcyBWaWV3IHtAdmFsdWV9CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfU0NFTkFSSU9TX1ZJRVcgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5zY2VuYXJpb3MiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBTY2VuYXJpb3NWaWV3KCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5JZGVudGlmaWFibGVQbHVnaW5WaWV3I2dldElkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlciBnZXRJZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIoKSB7CisJCXJldHVybiBuZXcgU2NlbmFyaW9QbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSWRlbnRpZmlhYmxlUGx1Z2luVmlldyNnZXRJbnB1dCgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElkZW50aWZpYWJsZVZpZXdNb2RlbCBnZXRJbnB1dCgpIHsKKwkJcmV0dXJuIFNjZW5hcmlvVmlld01vZGVsLmdldE1vZGVsKCk7CisJfSAvLyBnZXRJbnB1dAorCisJLyoqCisJICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIGEgbW9kZWwgb2YgdGhlIFNURU0KKwkgKiB7QGxpbmsgU2NlbmFyaW99cyB0aGF0IGFyZSBwbHVnZ2VkIGludG8gdGhlIHN5c3RlbS4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFNjZW5hcmlvVmlld01vZGVsIGV4dGVuZHMgSWRlbnRpZmlhYmxlVmlld01vZGVsIHsKKwkJLy8gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQorCQlwcml2YXRlIHN0YXRpYyBTY2VuYXJpb1ZpZXdNb2RlbCBzdk1vZGVsOworCisJCXByaXZhdGUgU2NlbmFyaW9WaWV3TW9kZWwoKSB7CisJCQlzdXBlcihDb25zdGFudHMuSURfU0NFTkFSSU9fRVhURU5TSU9OX1BPSU5UKTsKKwkJfQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIE1vZGVsVmlld01vZGVsCisJCSAqLworCQlwdWJsaWMgc3RhdGljIFNjZW5hcmlvVmlld01vZGVsIGdldE1vZGVsKCkgeworCQkJaWYgKHN2TW9kZWwgPT0gbnVsbCkgeworCQkJCXN2TW9kZWwgPSBuZXcgU2NlbmFyaW9WaWV3TW9kZWwoKTsKKwkJCX0KKwkJCXJldHVybiBzdk1vZGVsOworCQl9IC8vIGdldE1vZGVsCisJfSAvLyBTY2VuYXJpb1ZpZXdNb2RlbAorCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBTY2VuYXJpb1BsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlciBleHRlbmRzCisJCQlJZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIgeworCisJCS8vIFRoaXMgaXMgdGhlIGltYWdlIHVzZWQgdG8gcmVwcmVzZW50IHNjZW5hcmlvcyBpbiB0aGUgc2NlbmFyaW8gdmlldworCQlzdGF0aWMgSW1hZ2Ugc2NlbmFyaW9JY29uID0gbnVsbDsKKworCQkvLyBJZiB0cnVlIHRoZW4gd2UndmUgbmV2ZXIgdHJpZWQgdG8gZ2V0IHRoZSBpY29uCisJCXN0YXRpYyBib29sZWFuIHNjZW5hcmlvSWNvbkZpcnN0VGltZSA9IHRydWU7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5JZGVudGlmaWFibGVQbHVnaW5WaWV3LklkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgeworCQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlRGVsZWdhdGUpID8gZ2V0U2NlbmFyaW9JY29uKCkKKwkJCQkJOiBzdXBlci5nZXRJbWFnZShlbGVtZW50KTsKKwkJfSAvLyBnZXRJbWFnZQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBpY29uIHRvIGJlIHVzZWQgdG8gcmVwcmVzZW50IHNjZW5hcmlvcywgb3IgbnVsbCBpZiBpdAorCQkgKiAgICAgICAgIGNhbid0IGJlIGxvYWRlZC4KKwkJICovCisJCXByaXZhdGUgSW1hZ2UgZ2V0U2NlbmFyaW9JY29uKCkgeworCQkJLy8gU2hvdWxkIHdlIHRyeSB0byBsb2FkIHRoZSBpY29uPworCQkJaWYgKHNjZW5hcmlvSWNvbkZpcnN0VGltZSAmJiBzY2VuYXJpb0ljb24gPT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCXNjZW5hcmlvSWNvbkZpcnN0VGltZSA9IGZhbHNlOworCQkJCXNjZW5hcmlvSWNvbiA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldCgKKwkJCQkJCUlTaGFyZWRJbWFnZXMuU0NFTkFSSU9fSUNPTik7CisJCQl9IC8vIGlmIHdlIHNob3VsZCBsb2FkIHRoZSBpY29uCisJCQlyZXR1cm4gc2NlbmFyaW9JY29uOworCQl9IC8vIGdldFNjZW5hcmlvSWNvbgorCisJfSAvLyBTY2VuYXJpb1BsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlcgorfS8vIFNjZW5hcmlvc1ZpZXcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvU2VxdWVuY2Vyc1ZpZXcuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvU2VxdWVuY2Vyc1ZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzk5MThkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9TZXF1ZW5jZXJzVmlldy5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvLyBTZXF1ZW5jZXJzVmlldy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLklTaGFyZWRJbWFnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgZWNsaXBzZSB2aWV3IG9mIHRoZQorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVuY2VyfXMgdGhhdCBoYXZlIGJlZW4KKyAqIGltcG9ydGVkIGludG8gZWNsaXBzZSBhcyBwbHVnLWlucy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTZXF1ZW5jZXJzVmlldyBleHRlbmRzIElkZW50aWZpYWJsZVBsdWdpblZpZXcgeworCS8qKgorCSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBTZXF1ZW5jZXJzIFZpZXcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9TRVFVRU5DRVJTX1ZJRVcgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5zZXF1ZW5jZXJzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLkV4ZWN1dGFibGVQbHVnaW5WaWV3I2dldElucHV0KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSWRlbnRpZmlhYmxlVmlld01vZGVsIGdldElucHV0KCkgeworCQlyZXR1cm4gU2VxdWVuY2VyTW9kZWwuZ2V0TW9kZWwoKTsKKwl9IC8vIEV4ZWN1dGFibGVWaWV3TW9kZWwKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5JZGVudGlmaWFibGVQbHVnaW5WaWV3I2dldElkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlcigpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlciBnZXRJZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIoKSB7CisJCXJldHVybiBuZXcgU2VxdWVuY2VyVmlld1RyZWVDb250ZW50UHJvdmlkZXIoKTsKKwl9IC8vIGdldElkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlcgorCisJLyoqCisJICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBtb2RlbCBvZiB0aGUgU2VxdWVuY2VycyB0aGF0IGV4dGVuZCBhCisJICogb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlcnMgZXh0ZW5zaW9uIHBvaW50LgorCSAqLworCXByaXZhdGUgc3RhdGljIGNsYXNzIFNlcXVlbmNlck1vZGVsIGV4dGVuZHMgSWRlbnRpZmlhYmxlVmlld01vZGVsIHsKKworCQkvLyBUaGUgc2luZ2xldG9uIGluc3RhbmNlCisJCXByaXZhdGUgc3RhdGljIFNlcXVlbmNlck1vZGVsIHNlcU1vZGVsOworCisJCS8qKgorCQkgKiBDb25zdHJ1Y3RvcgorCQkgKi8KKwkJcHVibGljIFNlcXVlbmNlck1vZGVsKCkgeworCQkJc3VwZXIoQ29uc3RhbnRzLklEX1NFUVVFTkNFUl9FWFRFTlNJT05fUE9JTlQpOworCQl9IC8vIFNlcXVlbmNlck1vZGVsCisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgU2VxdWVuY2VyTW9kZWwgZ2V0TW9kZWwoKSB7CisJCQkvLyBEbyB3ZSBuZWVkIHRvIG1ha2UgdGhlIG1vZGVsPworCQkJaWYgKHNlcU1vZGVsID09IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQlzZXFNb2RlbCA9IG5ldyBTZXF1ZW5jZXJNb2RlbCgpOworCQkJfQorCQkJcmV0dXJuIHNlcU1vZGVsOworCQl9IC8vIGdldE1vZGVsCisJfSAvLyBTZXF1ZW5jZXJNb2RlbAorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyB0aGUgY29udGVudCBwcm92aWRlciBvZiB0aGUgc2VxdWVuY2VycyB2aWV3LgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgU2VxdWVuY2VyVmlld1RyZWVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcworCQkJSWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyIHsKKworCQkvLyBUaGlzIGlzIHRoZSBpbWFnZSB1c2VkIHRvIHJlcHJlc2VudCBzZXF1ZW5jZXJzIGluIHRoZSBzZXF1ZW5jZXJzIHZpZXcKKwkJc3RhdGljIEltYWdlIHNlcXVlbmNlckljb24gPSBudWxsOworCisJCS8vIElmIHRydWUgdGhlbiB3ZSd2ZSBuZXZlciB0cmllZCB0byBnZXQgdGhlIGljb24KKwkJc3RhdGljIGJvb2xlYW4gc2VxdWVuY2VySWNvbkZpcnN0VGltZSA9IHRydWU7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5JZGVudGlmaWFibGVQbHVnaW5WaWV3LklkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShmaW5hbCBPYmplY3QgZWxlbWVudCkgeworCQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlRGVsZWdhdGUpID8gZ2V0RGlzZWFzZUljb24oKQorCQkJCQk6IHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOworCQl9IC8vIGdldEltYWdlCisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIGljb24gdG8gYmUgdXNlZCB0byByZXByZXNlbnQgc2VxdWVuY2Vycywgb3IgbnVsbCBpZiBpdAorCQkgKiAgICAgICAgIGNhbid0IGJlIGxvYWRlZC4KKwkJICovCisJCXByaXZhdGUgSW1hZ2UgZ2V0RGlzZWFzZUljb24oKSB7CisJCQkvLyBTaG91bGQgd2UgdHJ5IHRvIGxvYWQgdGhlIGljb24/CisJCQlpZiAoc2VxdWVuY2VySWNvbkZpcnN0VGltZSAmJiBzZXF1ZW5jZXJJY29uID09IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQlzZXF1ZW5jZXJJY29uRmlyc3RUaW1lID0gZmFsc2U7CisKKwkJCQlzZXF1ZW5jZXJJY29uID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KAorCQkJCQkJSVNoYXJlZEltYWdlcy5TRVFVRU5DRVJfSUNPTik7CisJCQl9IC8vIGlmIHdlIHNob3VsZCBsb2FkIHRoZSBpY29uCisJCQlyZXR1cm4gc2VxdWVuY2VySWNvbjsKKwkJfSAvLyBnZXRkaXNlYXNlSWNvbgorCX0gLy8gU2VxdWVuY2VyVmlld1RyZWVDb250ZW50UHJvdmlkZXIKK30gLy8gU2VxdWVuY2Vyc1ZpZXcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvU2ltdWxhdGlvbkNvbnRyb2wuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvU2ltdWxhdGlvbkNvbnRyb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGEyZmFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9TaW11bGF0aW9uQ29udHJvbC5qYXZhCkBAIC0wLDAgKzEsODA1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29sb3JSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Gb250UmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuU1RFTVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLmV4ZWN1dGlvbi5JRXhlY3V0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5JU2hhcmVkQ29sb3JzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuSVNoYXJlZEZvbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuSVNoYXJlZEltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlByb2dyZXNzQmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhbiBTV1QgY29udHJvbCB0aGF0IGRpc3BsYXlzIHRoZSBzdGF0dXMvc3RhdGUgb2YgYW4gSVNpbXVsYXRpb24KKyAqIGFuZCBhbGxvd3MgdGhlIElTaW11bGF0aW9uIHRvIGJlIG1hbmFnZWQuCisgKiAKKyAqLworcHVibGljIGNsYXNzIFNpbXVsYXRpb25Db250cm9sIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMKKwkJSVNpbXVsYXRpb25MaXN0ZW5lciwgQ29udHJvbExpc3RlbmVyIHsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGFjdGl2ZSBzaW11bGF0aW9uIGpvYiB0byB3aGljaCB0aGlzIGNsYXNzIGlzIGF0dGFjaGVkICYgaGFzCisJICogY29udHJvbCB1cG9uLgorCSAqLworCXByb3RlY3RlZCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uID0gbnVsbDsKKworCQorCS8qKgorCSAqIEJvb2xlYW4gdXNlZCB0byBrZWVwIHRyYWNrIG9mIHJlc2V0dGluZ3MgOiBXZSBuZWVkIHRoaXMgdmFyaWFibGUgYmVjYXVzZQorCSAqIHNvbWV0aW1lcyBhZnRlciBhIHJlc2V0IHRoZXJlIGlzIHN0aWxsIG9uZSBvciB0d28gY29tcGxldGVfY3ljbGVzIGZyb20KKwkgKiBvbGQgc2ltdWxhdGlvbiBydW4gKGJlZm9yZSByZXNldHRpbmcpIHRoYXQgc2hvdWxkIG5vdCBiZSBwcm9jZXNzZWQuCisJICogCisJICovCisJcHJpdmF0ZSBib29sZWFuIHJlc2V0ID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgSW1hZ2UgcmVnaXN0cnkgbWFuYWdlcyBpbWFnZXMsIGNyZWF0ZXMgdGhlbSBvbi1kZW1hbmQsIGFuZCBkaXNwb3NlcworCSAqIHRoZW0gd2hlbiB0aGUgYXNzb2NpYXRlZCBkaXNwbGF5IGlzIGRpc3Bvc2VkLgorCSAqLworCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY29sb3IgcmVnaXN0cnkgbWFuYWdlcyBTV1QgY29sb3JzLCBjcmVhdGVzIHRoZW0gb24tZGVtYW5kLCBhbmQgdGFrZXMKKwkgKiBjYXJlIG9mIGRpc3Bvc2FsLgorCSAqLworCXByaXZhdGUgc3RhdGljIENvbG9yUmVnaXN0cnkgY29sb3JSZWdpc3RyeSA9IG51bGw7CisKKwkvKioKKwkgKiBKRmFjZSBmb250IHJlZ2lzdHJ5CisJICovCisJcHJpdmF0ZSBzdGF0aWMgRm9udFJlZ2lzdHJ5IGZvbnRSZWdpc3RyeSA9IG51bGw7CisKKwkvKioKKwkgKiBXSURHRVRTIGZvciBzaW11bGF0aW9uIGNvbnRyb2wKKwkgKi8KKworCS8qKgorCSAqIFRoZSB0b3AgbGV2ZWwgY29udGFpbmVyIGZvciB0aGUgc2ltdWxhdGlvbiBjb250cm9sCisJICovCisJcHJpdmF0ZSBDb21wb3NpdGUgbWFpbkNvbnRhaW5lciA9IG51bGw7CisKKwlwcml2YXRlIENvbXBvc2l0ZSBidG5Db250YWluZXIgPSBudWxsOworCisJcHJpdmF0ZSBUZXh0IHNpbXVsYXRpb25Qcm9ncmVzc1RleHQ7CisJcHJpdmF0ZSBUZXh0ICBzaW11bGF0aW9uU3RhdGVUZXh0OworCXByaXZhdGUgVGV4dCAgc2ltdWxhdGlvblRpbWVUZXh0OworCisJcHJpdmF0ZSBQcm9ncmVzc0JhciBwYiA9IG51bGw7CisJCisJcHJpdmF0ZSBUZXh0IHNpbXVsYXRpb25UaXRsZVRleHQgPSBudWxsOworCisJLyoqCisJICogU3ltYm9saWMgY29uc3RhbnQgaW5kaWNhdGluZyBubyB3b3JrIGhhcyBiZWVuIGRvbmUKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBpbnQgQkVHSU5fV09SSyA9IDA7CisKKwkvKioKKwkgKiBCb29sZWFuIHZhcmlhYmxlIHVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciB3ZSBzaG91bGQgYnVpbGQgYSBwcm9ncmVzcyBiYXIKKwkgKiB1c2luZyBTV1QuSU5ERVRFUk1JTkFURQorCSAqLworCXByaXZhdGUgYm9vbGVhbiBVTktOT1dOX0RVUkFUSU9OID0gZmFsc2U7CisKKwkvKioKKwkgKiBTb21lIGNvbnN0YW50cyB3ZSBuZWVkIHRvIHNldCBwcmVmZXJyZWQgc2l6ZXMgb2YgU1dUIGNvbnRyb2xzIGFuZAorCSAqIGNvbnRhaW5lcnMuCisJICovCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBTkRBUkRfTEVOR1RIID0gMTAwOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQU5EQVJEX0hFSUdIVCA9IDIyOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRBSU5FUl9IRUlHSFQgPSAyMjU7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BUkdJTiA9IDEwOworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICogCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogCisJICovCisJcHVibGljIFNpbXVsYXRpb25Db250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIElTaW11bGF0aW9uIHNpbXVsYXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7CisKKwkJLy8gRmlyc3QsIHJlZ2lzdGVyIGFzIGEgbGlzdGVuZXIgb2Ygc2ltdWxhdGlvbiBtYW5hZ2VyIGV2ZW50cworCQlzaW11bGF0aW9uLmFkZFNpbXVsYXRpb25MaXN0ZW5lcih0aGlzKTsKKworCQkvLyBTZXRzIHRoZSBhY3RpdmUgc2ltdWxhdGlvbiB3ZSBhcmUgZ29pbmcgdG8gY29udHJvbAorCQl0aGlzLnNpbXVsYXRpb24gPSBzaW11bGF0aW9uOworCisJCQorCQlTZXF1ZW5jZXIgc2VxdWVuY2VyID0gc2ltdWxhdGlvbi5nZXRTY2VuYXJpbygpLmdldFNlcXVlbmNlcigpOworCQkvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSB0byBjcmVhdGUgYW4gaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIuCisJCVVOS05PV05fRFVSQVRJT04gPSAKKwkJCShzZXF1ZW5jZXIuZ2V0RHVyYXRpb24oKSA9PSBTZXF1ZW5jZXIuVU5LTk9XTl9EVVJBVElPTikgCisJCQk/IHRydWUgOiBmYWxzZTsKKworCQkvLyBTZXQgdGhlIGltYWdlIHJlZ2lzdHJ5CisJCWlmIChpbWFnZVJlZ2lzdHJ5ID09IG51bGwpIHsKKwkJCUFjdGl2YXRvciBhY3RpdmF0b3IgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpOworCQkJaW1hZ2VSZWdpc3RyeSA9IGFjdGl2YXRvci5nZXRJbWFnZVJlZ2lzdHJ5KCk7CisJCX0KKwkJLy8gU2V0IHRoZSBjb2xvciByZWdpc3RyeQorCQlpZiAoY29sb3JSZWdpc3RyeSA9PSBudWxsKSB7CisJCQlBY3RpdmF0b3IgYWN0aXZhdG9yID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKTsKKwkJCWNvbG9yUmVnaXN0cnkgPSBhY3RpdmF0b3IuZ2V0Q29sb3JSZWdpc3RyeSgpOworCQl9CisJCS8vIFNldCB0aGUgZm9udCByZWdpc3RyeQorCQlpZiAoZm9udFJlZ2lzdHJ5ID09IG51bGwpIHsKKwkJCUFjdGl2YXRvciBhY3RpdmF0b3IgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpOworCQkJZm9udFJlZ2lzdHJ5ID0gYWN0aXZhdG9yLmdldEZvbnRSZWdpc3RyeSgpOworCQl9CisKKwkJLy8gU2V0IHRoZSBsYXlvdXQgZGF0YSBmb3IgdGhlIHNpbXVsYXRpb24gY29udHJvbAorCQkvLyBUaGUgcGFyZW50IGhhcyBiZWVuIHNldCB0byBHcmlkTGF5b3V0KCkgcHJldmlvdXNseS4KKwkJdGhpcy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULk5PTkUsIHRydWUsIGZhbHNlKSk7CisJCQorCQkvLyBOb3cgY3JlYXRlIGFsbCB0aGUgd2lkZ2V0cworCQljcmVhdGVDb250ZW50cyh0aGlzKTsKKwkJcGFyZW50LnJlZHJhdygpOworCX0KKworCS8qKgorCSAqIENvbXB1dGUgdGhlIG5ldyBib3VuZHMgZm9yIHRoZSBzaW11bGF0aW9uIGNvbnRyb2wgYWZ0ZXIgcmVzaXppbmcuCisJICogCisJICogQHBhcmFtIGV2ZW50CisJICovCisJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7CisgICAgICAKKwkJCisJCWZpbmFsIGludCBNVUxUSVBMSUVSID0gNTsKKworCQorCQkvLyBHZXQgdGhlIGNsaWVudCBhcmVhIGJvdW5kYXJpZXMuCisJCVJlY3RhbmdsZSBjbGllbnRCb3VuZHMgPSBudWxsOworCQlpZiAodGhpcy5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisJCQlpZiAodGhpcy5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisJCQkJY2xpZW50Qm91bmRzID0gdGhpcy5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRDbGllbnRBcmVhKCk7CisJCQl9CisJCX0KKworCQkvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IGFuIE5QRQorCQlpZiAoY2xpZW50Qm91bmRzID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorICAgICAgICAKKyAgICAgICAgaW50IHdpZHRoID0gY2xpZW50Qm91bmRzLndpZHRoLSAoTUFSR0lOICogTVVMVElQTElFUik7CisgICAgICAgIGludCBoZWlnaHQgPSBTVEFOREFSRF9IRUlHSFQ7CisgICAgICAgIAorICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBKSEsgVGhpcyBjb2RlIHdhcyByZW1vdmVkIGJlY2F1c2UgdGhlIGNvbnRyb2xzIGRpZCBub3QgZGlzcGxheSB3ZWxsIG9uIHRoZSBNQUMuCisgICAgICAgIC8vIFN3aWNoaW5nIGZyb20gYSBncmlkIGxheW91dCB0byBmbG93IGxheW91dCBzZWVtcyB0byBmaXggdGhlIHByb2JsZW0uCisgICAgICAgIC8vIHRoZSBmb2xvd2luZyBpcyBubyBsb25nZXIgbmVlZGVkLgorICAgICAgICAvLworCQkvLyBDb21wdXRlIHRoZSBuZXcgZGlzcGxheWluZyBib3VuZHMuCisJCS8qUmVjdGFuZ2xlIHBiQm91bmRzID0gdGhpcy5jb21wdXRlVHJpbShwYi5nZXRCb3VuZHMoKS54LAorCQkJCXBiLmdldEJvdW5kcygpLnksIHdpZHRoLGhlaWdodCk7CisJCVJlY3RhbmdsZSB0aXRsZUJvdW5kcyA9IHRoaXMuY29tcHV0ZVRyaW0oCisJCQkJICAgICAgICBzaW11bGF0aW9uVGl0bGVUZXh0LmdldEJvdW5kcygpLngsIAorCQkJCSAgICAgICAgc2ltdWxhdGlvblRpdGxlVGV4dC5nZXRCb3VuZHMoKS55LCB3aWR0aCwgaGVpZ2h0KTsKKwkJUmVjdGFuZ2xlIHN0YXRlQm91bmRzID0gdGhpcy5jb21wdXRlVHJpbSgKKwkJCQkgICAgICAgIHNpbXVsYXRpb25TdGF0ZVRleHQuZ2V0Qm91bmRzKCkueCwgCisJCQkJICAgICAgICBzaW11bGF0aW9uU3RhdGVUZXh0LmdldEJvdW5kcygpLnksIHdpZHRoLCBoZWlnaHQpOworCQlSZWN0YW5nbGUgdGltZUJvdW5kcyA9IHRoaXMuY29tcHV0ZVRyaW0oCisJCSAgICAgICAgc2ltdWxhdGlvblRpbWVUZXh0LmdldEJvdW5kcygpLngsIAorCQkgICAgICAgIHNpbXVsYXRpb25UaW1lVGV4dC5nZXRCb3VuZHMoKS55LCB3aWR0aCwgaGVpZ2h0KTsKKwkJUmVjdGFuZ2xlIHByb2dyZXNzQm91bmRzID0gdGhpcy5jb21wdXRlVHJpbSgKKwkJICAgICAgICBzaW11bGF0aW9uUHJvZ3Jlc3NUZXh0LmdldEJvdW5kcygpLngsIAorCQkgICAgICAgIHNpbXVsYXRpb25Qcm9ncmVzc1RleHQuZ2V0Qm91bmRzKCkueSwgd2lkdGgsIGhlaWdodCk7Ki8KKwkJCisJCVJlY3RhbmdsZSBtYWluQm91bmRzID0gdGhpcy5jb21wdXRlVHJpbShjbGllbnRCb3VuZHMueCwgY2xpZW50Qm91bmRzLnksCisJCQkJY2xpZW50Qm91bmRzLndpZHRoIC0gTUFSR0lOLCBDT05UQUlORVJfSEVJR0hUKTsKKwkJUmVjdGFuZ2xlIGJ0bkJvdW5kcyA9IHRoaXMuY29tcHV0ZVRyaW0oYnRuQ29udGFpbmVyLmdldEJvdW5kcygpLngsIAorCQkJCWJ0bkNvbnRhaW5lci5nZXRCb3VuZHMoKS55LHdpZHRoLGhlaWdodCsyKk1BUkdJTik7CisJCQorCQkvLyBTZXQgdGhlIG5ldyBib3VuZGFyaWVzLgorLy8JCXBiLnNldEJvdW5kcyhwYkJvdW5kcyk7CisvLwkJc2ltdWxhdGlvblRpdGxlVGV4dC5zZXRCb3VuZHModGl0bGVCb3VuZHMpOworLy8JCXNpbXVsYXRpb25TdGF0ZVRleHQuc2V0Qm91bmRzKHN0YXRlQm91bmRzKTsKKy8vCQlzaW11bGF0aW9uVGltZVRleHQuc2V0Qm91bmRzKHRpbWVCb3VuZHMpOworLy8JCXNpbXVsYXRpb25Qcm9ncmVzc1RleHQuc2V0Qm91bmRzKHByb2dyZXNzQm91bmRzKTsKKwkJCisJCWJ0bkNvbnRhaW5lci5zZXRCb3VuZHMoYnRuQm91bmRzKTsKKwkJbWFpbkNvbnRhaW5lci5zZXRCb3VuZHMobWFpbkJvdW5kcyk7CisJCS8vIFJlZHJhdyB0aGUgd2lkZ2V0cy4KKwkJCisJCW1haW5Db250YWluZXIucmVkcmF3KCk7CisJCQorCX0KKworCS8qKgorCSAqIEV2ZW50IGhhbmRsZXIgbWV0aG9kIGZvciBtb3ZlZCB3aW5kb3cgZXZlbnRzLgorCSAqIAorCSAqIEBwYXJhbSBldmVudAorCSAqLworCXB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZXZlbnQpIHsKKwkJLy8gRE8gTk9USElORworCX0KKworCS8qKgorCSAqIFJlc2V0IHRoZSBwcm9ncmVzcyBiYXIgdG8gaW5pdGlhbCBzdGF0ZQorCSAqIAorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlc2V0UHJvZ3Jlc3NCYXIoKSB7CisKKwkJaWYgKG51bGwgPT0gcGIgfHwgcGIuaXNEaXNwb3NlZCgpICkgeworCQkJcmV0dXJuOworCQl9CisvLwkJaWYgKFVOS05PV05fRFVSQVRJT04pIHsKKy8vCQkJcmV0dXJuOworLy8JCX0KKwkJcGIuc2V0TWluaW11bShCRUdJTl9XT1JLKTsKKwkJcGIuc2V0TWF4aW11bShJRXhlY3V0YWJsZS5UT1RBTF9XT1JLKTsKKwkJcGIuc2V0U2VsZWN0aW9uKEJFR0lOX1dPUkspOworCQlwYi5yZWRyYXcoKTsKKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgc2ltdWxhdGlvbiBzdGF0ZSBsYWJlbCB3aGVuZXZlciBzaW11bGF0aW9uIGNoYW5nZXMgc3RhdGUKKwkgKiAKKwkgKiBAcGFyYW0gc3RhdGUKKwkgKiAgICAgICAgICAgIG9mIHNpbXVsYXRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0ZUxhYmVsKFNpbXVsYXRpb25TdGF0ZSBzdGF0ZSkgeworCisJCWlmIChudWxsID09IHNpbXVsYXRpb25TdGF0ZVRleHQgfHwgc2ltdWxhdGlvblN0YXRlVGV4dC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXJldHVybjsKKwkJfQorICAgICAgICBSZWN0YW5nbGUgYm91bmRzID0gc2ltdWxhdGlvblN0YXRlVGV4dC5nZXRCb3VuZHMoKTsKKwkJaWYgKHN0YXRlLmVxdWFscyhTaW11bGF0aW9uU3RhdGUuUlVOTklORykgfHwKKwkJCQlzdGF0ZS5lcXVhbHMoU2ltdWxhdGlvblN0YXRlLkNPTVBMRVRFRF9DWUNMRSkgKSB7CisJCQlzaW11bGF0aW9uU3RhdGVUZXh0LnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJTQ3RybC5SdW5uaW5nIikpOyAvLyROT04tTkxTLTEkCisJCQlzaW11bGF0aW9uU3RhdGVUZXh0LnNldEJhY2tncm91bmQoY29sb3JSZWdpc3RyeQorCQkJCQkuZ2V0KElTaGFyZWRDb2xvcnMuR1JFRU4pKTsKKwkJCQorCQl9IGVsc2UgaWYgKHN0YXRlLmVxdWFscyhTaW11bGF0aW9uU3RhdGUuUEFVU0VEKSkgeworCQkJc2ltdWxhdGlvblN0YXRlVGV4dC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiU0N0cmwuUGF1c2VkIikpOyAvLyROT04tTkxTLTEkCisJCQlzaW11bGF0aW9uU3RhdGVUZXh0LnNldEJhY2tncm91bmQoY29sb3JSZWdpc3RyeQorCQkJCQkuZ2V0KElTaGFyZWRDb2xvcnMuWUVMTE9XKSk7CisJCX0gZWxzZSBpZiAoc3RhdGUuZXF1YWxzKFNpbXVsYXRpb25TdGF0ZS5SRVNFVCkpIHsKKwkJCXNpbXVsYXRpb25TdGF0ZVRleHQuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlNDdHJsLlJlc2V0IikpOyAvLyROT04tTkxTLTEkCisJCQlzaW11bGF0aW9uU3RhdGVUZXh0LnNldEJhY2tncm91bmQoY29sb3JSZWdpc3RyeQorCQkJCQkuZ2V0KElTaGFyZWRDb2xvcnMuT1JBTkdFKSk7CisJCQlwYi5zZXRTZWxlY3Rpb24oMCk7CisJCX0KKwkJCisgICAgICAgIHNpbXVsYXRpb25TdGF0ZVRleHQuc2V0Qm91bmRzKGJvdW5kcyk7CisJCXNpbXVsYXRpb25TdGF0ZVRleHQucmVkcmF3KCk7CisJfQorCisJLyoqCisJICogVXBkYXRlIHByb2dyZXNzIGJhciBhbmQgcHJvZ3Jlc3MgTGFiZWwKKwkgKiBJZiBubyBkdXJhdGlvbiB0aGVuIHVzZSBzZXF1ZW5jZXIgY3ljbGUgY291bnQgdG8gCisJICogKG1vZHVsbyAxMDApIHRvIHJlZmxlY3QgdGhlIHByb2dyZXNzLgorCSAqIElmIHRoZXJlIGlzIGEgZHVyYXRpb24gdGhlbiB1c2UgdGhlIHdvcmsgY29tcGxldGVkIAorCSAqIHZhbHVlLgorCSAqIAorCSAqIEBwYXJhbSB3b3JrQ29tcGxldGVkCisJICogQHBhcmFtIHN0YXRlICBTaW11bGF0aW9uIHN0YXRlIChydW5uaW5nLCBwYXVzZWQgLi4uKQorCSAqLworCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvZ3Jlc3NMYWJlbChpbnQgd29ya0NvbXBsZXRlZCwgU2ltdWxhdGlvblN0YXRlIHN0YXRlKSB7CisJCVJlY3RhbmdsZSBib3VuZHMgPSBzaW11bGF0aW9uUHJvZ3Jlc3NUZXh0LmdldEJvdW5kcygpOworCQlTZXF1ZW5jZXIgc2VxdWVuY2VyID0gc2ltdWxhdGlvbi5nZXRTY2VuYXJpbygpLmdldFNlcXVlbmNlcigpOworCQlpbnQgY3VycmVudCA9IHNlcXVlbmNlci5nZXRDeWNsZSgpIDsKKwkJCQorCQkKKwkJaWYgKFVOS05PV05fRFVSQVRJT04gPT0gdHJ1ZSkgeworCQkJLy8gV0UgSEFWRSBVTktOT1dOIERVUkFUSU9OCisJCQlzaW11bGF0aW9uUHJvZ3Jlc3NUZXh0LnNldFRleHQoCisJCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiU0N0cmwuUHJvZ3Jlc3MiKSArIAorCQkJCQkiIDogdW5rbm93biBkdXJhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCWN1cnJlbnQgPSBjdXJyZW50JTEwMDsKKwkJCQorCQl9IGVsc2UgaWYgKHdvcmtDb21wbGV0ZWQgPD0gSUV4ZWN1dGFibGUuVE9UQUxfV09SSykgeworCQkJc2ltdWxhdGlvblByb2dyZXNzVGV4dC5zZXRUZXh0KAorCQkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIlNDdHJsLlByb2dyZXNzIikgKworCQkJCQkiIDogIiArIHdvcmtDb21wbGV0ZWQgKyAiJSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQl9CisKKworCQlzaW11bGF0aW9uUHJvZ3Jlc3NUZXh0LnNldEJvdW5kcyhib3VuZHMpOworCQlzaW11bGF0aW9uUHJvZ3Jlc3NUZXh0LnJlZHJhdygpOworCQlwYi5zZXRTZWxlY3Rpb24oY3VycmVudCk7CisJfQorCisJLyoqCisJICogVXBkYXRlIHNpbXVsYXRpb24gdGltZSBsYWJlbAorCSAqIAkgCisJICogQHBhcmFtIHN0YXRlIFNpbXVsYXRpb24gc3RhdGUKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUaW1lTGFiZWwoU2ltdWxhdGlvblN0YXRlIHN0YXRlKSB7CisJCVJlY3RhbmdsZSBib3VuZHMgPSBzaW11bGF0aW9uVGltZVRleHQuZ2V0Qm91bmRzKCk7CisJCS8vIEdldCB0aGUgY3VycmVudCB0aW1lIDoKKwkJU2VxdWVuY2VyIHNlcXVlbmNlciA9IHNpbXVsYXRpb24uZ2V0U2NlbmFyaW8oKS5nZXRTZXF1ZW5jZXIoKTsKKwkJU1RFTVRpbWUgdGltZSA9IHNlcXVlbmNlci5nZXRDdXJyZW50VGltZSgpOworCisJCWlmICgoc3RhdGUubmFtZSgpLmVxdWFscygiUlVOTklORyIpID09IGZhbHNlKSAvLyROT04tTkxTLTEkCisJCQkJJiYgKHN0YXRlLm5hbWUoKS5lcXVhbHMoIkNPTVBMRVRFRF9DWUNMRSIpID09IGZhbHNlKSkgeyAvLyROT04tTkxTLTEkCisJCQkvLyBET05UIFVQREFURSBVTkxFU1MgU1RBVEUgSVMgUlVOTklORyBPUiBDT01QTEVURURfQ1lDTEUKKwkJCS8vcmV0dXJuOworCQl9CisKKwkJaWYgKHNlcXVlbmNlci5nZXRDeWNsZSgpID4gMCAmJiByZXNldCA9PSB0cnVlKSB7CisJCQkvLyBETyBOT1RISU5HIDogaWdub3JlIHNwdXJpb3VzIGNvbXBsZXRlZCBjeWNsZXMgYWZ0ZXIgYSByZXNldC4KKwkJCXJlc2V0ID0gZmFsc2U7CisJCQlyZXR1cm47CisJCX0KKyAgICAgICAgU3RyaW5nIHRpbWVMYWJlbD0gIlsiICsgc2VxdWVuY2VyLmdldEN5Y2xlKCkgKyAiXSAiICsgCisgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRTdHJpbmcoIlNDdHJsLlRpbWUiKSArIAorICAgICAgICAgICAgICAgICAgICAgICAgIiA6ICIgKyB0aW1lLnRvU3RyaW5nKCk7IAorICAgICAgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCQorCQlzaW11bGF0aW9uVGltZVRleHQuc2V0VGV4dCh0aW1lTGFiZWwpOwkKKwkJc2ltdWxhdGlvblRpbWVUZXh0LnNldFRvb2xUaXBUZXh0KHRpbWVMYWJlbCk7CisJCQorCQlzaW11bGF0aW9uVGltZVRleHQuc2V0Qm91bmRzKGJvdW5kcyk7CisJCXNpbXVsYXRpb25UaW1lVGV4dC5yZWRyYXcoKTsKKworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHNpbXVsYXRpb24gdG8gd2hpY2ggdGhpcyBjb250cm9sIGlzIGF0dGFjaGVkIG9yIGFzc29jaWF0ZWQKKwkgKi8KKwlwdWJsaWMgSVNpbXVsYXRpb24gZ2V0U2ltdWxhdGlvbigpIHsKKwkJcmV0dXJuIHNpbXVsYXRpb247CisJfQorCisJLyoqCisJICogVGhpcyBpcyB3aGVyZSB3ZSBjcmVhdGUgJiBpbml0aWFsaXplIHRoZSBjb21wb25lbnRzIHRoYXQgZ28gaW50byB0aGUKKwkgKiBzaW11bGF0aW9uIGNvbnRyb2wuCisJICogCisJICogPHByZT4KKwkgKiAtIFRpdGxlIG9mIFNpbXVsYXRpb24KKwkgKiAtIFByb2dyZXNzIHN0YXR1cworCSAqIC0gU3RhdGUgKFJ1bm5pbmcgUGF1c2VkKQorCSAqIC0gcHJvZ3Jlc3MgYmFyCisJICogLSBDb250cm9sIGJ1dHRvbnMKKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50ICBTaW11bGF0aW9uQ29udHJvbCBDb21wb3NpdGUgKG91cnNlbHZlcykKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgeworCisJCS8vIENyZWF0ZSB0aGUgdG9wIGxldmVsIGNvbnRhaW5lciBmb3IgdGhlIFNXVCBXaWRnZXRzIG9mIHRoZSBzaW11bGF0aW9uCisJCS8vIGNvbnRyb2wKKwkJbWFpbkNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuU01PT1RIIHwgU1dULkJPUkRFUik7CisJCS8vIFNldCBMYXlvdXQgZGF0YSBmb3IgTWFpbkNvbnRhaW5lciB3aXRoaW4gU2ltdWxhdGlvbkNvbnRyb2wKKwkJbWFpbkNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdldE1haW5Db250YWluZXJHcmlkRGF0YSgpKTsKKwkJLy8gU2V0IHRoZSBsYXlvdXQgbWFuYWdlciBmb3IgdGhlIHRvcCBsZXZlbCBjb250YWluZXIKKwkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKKwkJbWFpbkNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7CisJCQorCisJCXNpbXVsYXRpb25UaXRsZVRleHQgPSBuZXcgVGV4dChtYWluQ29udGFpbmVyLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7CisJCXNpbXVsYXRpb25UaXRsZVRleHQuc2V0VGV4dChzaW11bGF0aW9uLmdldE5hbWVXaXRoU2VxdWVuY2VOdW1iZXIoKSk7CisJCXNpbXVsYXRpb25UaXRsZVRleHQuc2V0VG9vbFRpcFRleHQoc2ltdWxhdGlvbi5nZXROYW1lKCkpOworCQlzaW11bGF0aW9uVGl0bGVUZXh0CisJCQkJLnNldEJhY2tncm91bmQoY29sb3JSZWdpc3RyeS5nZXQoSVNoYXJlZENvbG9ycy5HUkFZKSk7CisJCXNpbXVsYXRpb25UaXRsZVRleHQuc2V0Rm9udChmb250UmVnaXN0cnkuZ2V0KElTaGFyZWRGb250cy5ERUZBVUxUKSk7CisJCXNpbXVsYXRpb25UaXRsZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOworCQkvLworCQlGb3JtRGF0YSBzdHRGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlzdHRGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlzdHRGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQlzdHRGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMSwgMCk7CisJCXNpbXVsYXRpb25UaXRsZVRleHQuc2V0TGF5b3V0RGF0YShzdHRGb3JtRGF0YSk7CisJCQorCisJCXNpbXVsYXRpb25Qcm9ncmVzc1RleHQgPSBuZXcgVGV4dChtYWluQ29udGFpbmVyLCBTV1QuU01PT1RICisJCQkJfCBTV1QuQk9SREVSKTsKKwkJc2ltdWxhdGlvblByb2dyZXNzVGV4dC5zZXRCYWNrZ3JvdW5kKGNvbG9yUmVnaXN0cnkKKwkJCQkuZ2V0KElTaGFyZWRDb2xvcnMuR1JFRU4pKTsKKwkJc2ltdWxhdGlvblByb2dyZXNzVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7CisJCXNpbXVsYXRpb25Qcm9ncmVzc1RleHQuc2V0Rm9udChmb250UmVnaXN0cnkuZ2V0KElTaGFyZWRGb250cy5ERUZBVUxUKSk7CisJCS8vCisJCUZvcm1EYXRhIHNwdEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCXNwdEZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXNwdEZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCXNwdEZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChzaW11bGF0aW9uVGl0bGVUZXh0LCAwKTsKKwkJc2ltdWxhdGlvblByb2dyZXNzVGV4dC5zZXRMYXlvdXREYXRhKHNwdEZvcm1EYXRhKTsKKworCQlzaW11bGF0aW9uU3RhdGVUZXh0ID0gbmV3IFRleHQobWFpbkNvbnRhaW5lciwgU1dULlNNT09USCB8IFNXVC5CT1JERVIpOworCQlzaW11bGF0aW9uU3RhdGVUZXh0LnNldEJhY2tncm91bmQoY29sb3JSZWdpc3RyeQorCQkJCS5nZXQoSVNoYXJlZENvbG9ycy5HUkVFTikpOworCQlzaW11bGF0aW9uU3RhdGVUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKKwkJc2ltdWxhdGlvblN0YXRlVGV4dC5zZXRGb250KGZvbnRSZWdpc3RyeS5nZXQoSVNoYXJlZEZvbnRzLkRFRkFVTFQpKTsKKwkJRm9ybURhdGEgc3N0Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJc3N0Rm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJc3N0Rm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJc3N0Rm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHNpbXVsYXRpb25Qcm9ncmVzc1RleHQsIDApOworCQlzaW11bGF0aW9uU3RhdGVUZXh0LnNldExheW91dERhdGEoc3N0Rm9ybURhdGEpOworCisJCXBiID0gbmV3IFByb2dyZXNzQmFyKG1haW5Db250YWluZXIsIFNXVC5TTU9PVEggfCBTV1QuQk9SREVSKTsKKwkJcGIuc2V0Rm9udChmb250UmVnaXN0cnkuZ2V0KElTaGFyZWRGb250cy5ERUZBVUxUKSk7CisJCUZvcm1EYXRhIHBiRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJcGJGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlwYkZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCXBiRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHNpbXVsYXRpb25TdGF0ZVRleHQsIDApOworCQlwYi5zZXRMYXlvdXREYXRhKHBiRm9ybURhdGEpOworCQkKKwkJc2ltdWxhdGlvblRpbWVUZXh0ID0gbmV3IFRleHQobWFpbkNvbnRhaW5lciwgU1dULlNNT09USCB8IFNXVC5CT1JERVIpOworCQlzaW11bGF0aW9uVGltZVRleHQuc2V0QmFja2dyb3VuZChjb2xvclJlZ2lzdHJ5CisJCQkJLmdldChJU2hhcmVkQ29sb3JzLkdSRUVOKSk7CisJCXNpbXVsYXRpb25UaW1lVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7CisJCXNpbXVsYXRpb25UaW1lVGV4dC5zZXRGb250KGZvbnRSZWdpc3RyeS5nZXQoSVNoYXJlZEZvbnRzLkRFRkFVTFQpKTsKKwkJRm9ybURhdGEgc3RtdEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCXN0bXRGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlzdG10Rm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJc3RtdEZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwYiwgMCk7CisJCXNpbXVsYXRpb25UaW1lVGV4dC5zZXRMYXlvdXREYXRhKHN0bXRGb3JtRGF0YSk7CisJCQorCQlDb21wb3NpdGUgY29udHJvbEJ1dHRvbnMgPSBjcmVhdGVDb250cm9sQnV0dG9ucyhtYWluQ29udGFpbmVyKTsKKwkJRm9ybURhdGEgY29udHJvbHNGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQljb250cm9sc0Zvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWNvbnRyb2xzRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoODAsIDApOworCQljb250cm9sc0Zvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChzaW11bGF0aW9uVGltZVRleHQsIDApOworCQljb250cm9sQnV0dG9ucy5zZXRMYXlvdXREYXRhKGNvbnRyb2xzRm9ybURhdGEpOworCQkKKwkJcmVzZXRQcm9ncmVzc0JhcigpOyAvLyBTZXQgYW5kIGRpc3BsYXkgcHJvZ3Jlc3MgYmFyJ3MgaW5pdGlhbCB2YWx1ZQorCQl1cGRhdGVTdGF0ZUxhYmVsKHNpbXVsYXRpb24uZ2V0U2ltdWxhdGlvblN0YXRlKCkpOworCQl1cGRhdGVQcm9ncmVzc0xhYmVsKEJFR0lOX1dPUkssIHNpbXVsYXRpb24uZ2V0U2ltdWxhdGlvblN0YXRlKCkpOworICAgICAgICB1cGRhdGVUaW1lTGFiZWwoc2ltdWxhdGlvbi5nZXRTaW11bGF0aW9uU3RhdGUoKSk7CisJCS8vbWFpbkNvbnRhaW5lci5yZWRyYXcoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgZ3JpZCBkYXRhIG9iamVjdCB3aXRoIGRlZmF1bHQgdmFsdWVzLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5ldyBncmlkIGRhdGEgb2JqZWN0CisJICovCisJcHJvdGVjdGVkIEdyaWREYXRhIGdldERlZmF1bHRHcmlkRGF0YSgpIHsKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOworCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOworCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gU1RBTkRBUkRfSEVJR0hUOworCQlncmlkRGF0YS5taW5pbXVtSGVpZ2h0ID0gU1RBTkRBUkRfSEVJR0hUOworCQlncmlkRGF0YS53aWR0aEhpbnQgPSBTVEFOREFSRF9MRU5HVEg7CisJCWdyaWREYXRhLm1pbmltdW1XaWR0aCA9IFNUQU5EQVJEX0xFTkdUSDsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOworCQlyZXR1cm4gZ3JpZERhdGE7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IGdyaWQgZGF0YSBjdXN0b21pemVkIGZvciBhIHRleHQgZmllbGQuCisJICogCisJICogQHJldHVybiBncmlkRGF0YSB0aGUgbmV3IGdyaWQgZGF0YSBvYmplY3QKKwkgKi8KKwlwcm90ZWN0ZWQgR3JpZERhdGEgZ2V0VGV4dEdyaWREYXRhKCkgeworCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULk5PTkUsIHRydWUsIGZhbHNlKTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7CisJCWdyaWREYXRhLmhlaWdodEhpbnQgPSBTVEFOREFSRF9IRUlHSFQ7CisJCWdyaWREYXRhLm1pbmltdW1IZWlnaHQgPSBTVEFOREFSRF9IRUlHSFQtMjsKKwkJZ3JpZERhdGEud2lkdGhIaW50ID0gU1RBTkRBUkRfTEVOR1RIOworCQlncmlkRGF0YS5taW5pbXVtV2lkdGggPSBTVEFOREFSRF9MRU5HVEg7CisJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKKwkJcmV0dXJuIGdyaWREYXRhOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBncmlkIGRhdGEgY3VzdG9taXplZCBmb3IgYSBwcm9ncmVzcyBiYXIuCisJICogCisJICogQHJldHVybiBncmlkRGF0YSB0aGUgbmV3IGdyaWQgZGF0YSBvYmplY3QKKwkgKi8KKwlwcm90ZWN0ZWQgR3JpZERhdGEgZ2V0UHJvZ3Jlc3NCYXJHcmlkRGF0YSgpIHsKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5OT05FLCB0cnVlLCBmYWxzZSk7CisJCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOworCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCXJldHVybiBncmlkRGF0YTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgZ3JpZCBkYXRhIGN1c3RvbWl6ZWQgZm9yIHRoZSBtYWluIGNvbnRhaW5lciBvZiB0aGUKKwkgKiBzaW11bGF0aW9uIGNvbnRyb2wuCisJICogCisJICogQHJldHVybiBncmlkRGF0YSB0aGUgbmV3IGdyaWQgZGF0YSBvYmplY3QKKwkgKi8KKwlwcm90ZWN0ZWQgR3JpZERhdGEgZ2V0TWFpbkNvbnRhaW5lckdyaWREYXRhKCkgeworCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOworCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJLy8gU2V0IHRoZSBwcmVmZXJyZWQgc2l6ZS4KKwkJZ3JpZERhdGEud2lkdGhIaW50ID0gU1RBTkRBUkRfTEVOR1RIOworCQlncmlkRGF0YS5taW5pbXVtV2lkdGggPSBTVEFOREFSRF9MRU5HVEg7CisJCS8vZ3JpZERhdGEuaGVpZ2h0SGludCA9IFNUQU5EQVJEX0hFSUdIVDsKKwkJLy9ncmlkRGF0YS5taW5pbXVtSGVpZ2h0ID0gU1RBTkRBUkRfSEVJR0hUOworCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gQ09OVEFJTkVSX0hFSUdIVDsKKwkJZ3JpZERhdGEubWluaW11bUhlaWdodCA9IENPTlRBSU5FUl9IRUlHSFQ7CisJCXJldHVybiBncmlkRGF0YTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgZ3JpZCBkYXRhIGN1c3RvbWl6ZWQgZm9yIHRoZSBwdXNoIGJ1dHRvbnMuCisJICogCisJICogQHJldHVybiBncmlkRGF0YSB0aGUgbmV3IGdyaWQgZGF0YSBvYmplY3QKKwkgKi8KKwlwcm90ZWN0ZWQgR3JpZERhdGEgZ2V0QnV0dG9uR3JpZERhdGEoKSB7CisJCQorCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOworCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7CisJCWdyaWREYXRhLmhlaWdodEhpbnQgPSBTVEFOREFSRF9IRUlHSFQtMitNQVJHSU47CisJCWdyaWREYXRhLm1pbmltdW1IZWlnaHQgPSBTVEFOREFSRF9IRUlHSFQtMjsKKwkJcmV0dXJuIGdyaWREYXRhOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGFycmF5IG9mIFNXVCBwdXNoIGJ1dHRvbnMuCisJICogYnRuQ29udGFpbmVyIGlzIGEgbmV3IENvbXBvc2l0ZSB0aGF0IHdpbGwgY29udGFpbgorCSAqIGEgcm93IG9mIDUgYnV0dG9ucy4KKwkgKiBAcGFyYW0gcGFyZW50IG1haW5Db250YWluZXIKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbnRyb2xCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCisJCWZpbmFsIGludCBPRkZTRVQgPSAxNjsKKwkJYnRuQ29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsMCk7CisgICAgICAgIC8vYnRuQ29udGFpbmVyLnNldFNpemUoU1RBTkRBUkRfTEVOR1RILCBTVEFOREFSRF9IRUlHSFQrT0ZGU0VUKTsKKyAgICAgICAgCisJCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDU7CisJCWdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKKwkJYnRuQ29udGFpbmVyLnNldExheW91dChncmlkTGF5b3V0KTsKKyAgICAgICAgLy8gc2V0IGdyaWREYXRhIGZvciBidG5Db250YWluZXIgd2l0aGluIG1haW5Db250YWluZXIKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOworCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7CisJCWdyaWREYXRhLmhlaWdodEhpbnQgPSBTVEFOREFSRF9IRUlHSFQgKyBPRkZTRVQrTUFSR0lOOworCQlncmlkRGF0YS5taW5pbXVtSGVpZ2h0ID0gU1RBTkRBUkRfSEVJR0hUKyBPRkZTRVQrTUFSR0lOOworCQlncmlkRGF0YS53aWR0aEhpbnQgPSBTVEFOREFSRF9MRU5HVEg7CisJCWdyaWREYXRhLm1pbmltdW1XaWR0aCA9IFNUQU5EQVJEX0xFTkdUSDsKKwkJYnRuQ29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOworCisJCS8vIGNyZWF0ZSB0aGUgc2ltdWxhdGlvbiBjb250cm9sIGJ1dHRvbnMKKwkJQnV0dG9uIHJ1biA9IG5ldyBCdXR0b24oYnRuQ29udGFpbmVyLCBTV1QuUFVTSCk7CisJCUJ1dHRvbiBwYXVzZSA9IG5ldyBCdXR0b24oYnRuQ29udGFpbmVyLCBTV1QuUFVTSCk7CisJCUJ1dHRvbiByZXNldCA9IG5ldyBCdXR0b24oYnRuQ29udGFpbmVyLCBTV1QuUFVTSCk7CisJCUJ1dHRvbiBzdGVwID0gbmV3IEJ1dHRvbihidG5Db250YWluZXIsIFNXVC5QVVNIKTsKKwkJQnV0dG9uIHN0b3AgPSBuZXcgQnV0dG9uKGJ0bkNvbnRhaW5lciwgU1dULlBVU0gpOworCisJCS8vIHNldCBhbGlnbm1lbnQgYW5kIGJhY2tncm91bmQgY29sb3IKKwkJcnVuLnNldEJhY2tncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JBWSkpOworCQlydW4uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJTQ3RybC5TdGFydFNpbSIpKTsgLy8kTk9OLU5MUy0xJAorCQlydW4uc2V0TGF5b3V0RGF0YShnZXRCdXR0b25HcmlkRGF0YSgpKTsKKworCQlwYXVzZQorCQkJCS5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoCisJCQkJCQlTV1QuQ09MT1JfR1JBWSkpOworCQlwYXVzZS5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlNDdHJsLlBhdXNlU2ltIikpOyAvLyROT04tTkxTLTEkCisJCXBhdXNlLnNldExheW91dERhdGEoZ2V0QnV0dG9uR3JpZERhdGEoKSk7CisKKwkJcmVzZXQKKwkJCQkuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKAorCQkJCQkJU1dULkNPTE9SX0dSQVkpKTsKKwkJcmVzZXQuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJTQ3RybC5SZXN0b3JlU2ltIikpOyAvLyROT04tTkxTLTEkCisJCXJlc2V0LnNldExheW91dERhdGEoZ2V0QnV0dG9uR3JpZERhdGEoKSk7CisKKwkJc3RlcC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSQVkpKTsKKwkJc3RlcC5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlNDdHJsLlN0ZXBTaW0iKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3RlcC5zZXRMYXlvdXREYXRhKGdldEJ1dHRvbkdyaWREYXRhKCkpOworCisJCXN0b3Auc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKSk7CisJCXN0b3Auc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJTQ3RybC5TdG9wU2ltIikpOyAvLyROT04tTkxTLTEkCisJCXN0b3Auc2V0TGF5b3V0RGF0YShnZXRCdXR0b25HcmlkRGF0YSgpKTsKKworCQlydW4uc2V0SW1hZ2UoaW1hZ2VSZWdpc3RyeS5nZXQoSVNoYXJlZEltYWdlcy5SVU5fSUNPTikpOworCQlwYXVzZS5zZXRJbWFnZShpbWFnZVJlZ2lzdHJ5LmdldChJU2hhcmVkSW1hZ2VzLlBBVVNFX0lDT04pKTsKKwkJcmVzZXQuc2V0SW1hZ2UoaW1hZ2VSZWdpc3RyeS5nZXQoSVNoYXJlZEltYWdlcy5SRVNFVF9JQ09OKSk7CisJCXN0ZXAuc2V0SW1hZ2UoaW1hZ2VSZWdpc3RyeS5nZXQoSVNoYXJlZEltYWdlcy5TVEVQX0lDT04pKTsKKwkJc3RvcC5zZXRJbWFnZShpbWFnZVJlZ2lzdHJ5LmdldChJU2hhcmVkSW1hZ2VzLlNUT1BfSUNPTikpOworICAgICAgICAKKworCQkvLyBzZXQgZXZlbnQgbGlzdGVuZXJzIGZvciBidXR0b25zCisJCXJ1bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7CisJCQkJc3dpdGNoIChlLnR5cGUpIHsKKwkJCQljYXNlIFNXVC5TZWxlY3Rpb246CisJCQkJCXJ1bigpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0pOworCQlwYXVzZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7CisJCQkJc3dpdGNoIChlLnR5cGUpIHsKKwkJCQljYXNlIFNXVC5TZWxlY3Rpb246CisJCQkJCXBhdXNlKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCXJlc2V0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKKwkJCQlzd2l0Y2ggKGUudHlwZSkgeworCQkJCWNhc2UgU1dULlNlbGVjdGlvbjoKKwkJCQkJcmVzZXQoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJc3RlcC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7CisJCQkJc3dpdGNoIChlLnR5cGUpIHsKKwkJCQljYXNlIFNXVC5TZWxlY3Rpb246CisJCQkJCXN0ZXAoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJc3RvcC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7CisJCQkJc3dpdGNoIChlLnR5cGUpIHsKKwkJCQljYXNlIFNXVC5TZWxlY3Rpb246CisJCQkJCXN0b3AoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJcmV0dXJuIGJ0bkNvbnRhaW5lcjsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICAKKwkJLy8gTnVsbGlmeSBhbGwgb3VyIHJlZmVyZW5jZXMuCisJCWlmIChzaW11bGF0aW9uICE9IG51bGwpIHsKKwkJCXNpbXVsYXRpb24ucmVtb3ZlU2ltdWxhdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJc2ltdWxhdGlvbiA9IG51bGw7CisJCX0KKworCQkKKwkJLy8gRm9yY2UgZGlzcG9zYWwgb2YgdGhlIG1haW4gd2lkZ2V0IGZvciB0aGUgc2ltdWxhdGlvbiBjb250cm9sLgorCQlpZiAobWFpbkNvbnRhaW5lciAhPSBudWxsKSB7CisJCQltYWluQ29udGFpbmVyLmRpc3Bvc2UoKTsKKwkJfQorCisJfSAvLyBkaXNwb3NlCisKKwkvKioKKwkgKiBUaGlzIGlzIHdoZXJlIHRoZSBzaW11bGF0aW9uIGNvbnRyb2wgaGVhcnMgYWJvdXQgY2hhbmdlcyBpbiB0aGUKKwkgKiBzaW11bGF0aW9uIGl0IGlzIG1hbmFnaW5nLiBJdCBpcyByZWFsbHkgb25seSBpbnRlcmVzdGVkIGluIGFsbCBldmVudHMKKwkgKiBnZW5lcmF0ZWQgYnkgdGhlIGFjdGl2ZSBzaW11bGF0aW9uCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbkxpc3RlbmVyI3NpbXVsYXRpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25FdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzaW11bGF0aW9uQ2hhbmdlZChTaW11bGF0aW9uRXZlbnQgZXZlbnQpIHsKKworCQkvLyBHZXQgdGhlIGN1cnJlbnQgc2ltdWxhdGlvbiBzdGF0ZQorCQlmaW5hbCBTaW11bGF0aW9uU3RhdGUgc2ltdWxhdGlvblN0YXRlID0gZXZlbnQuZ2V0U2ltdWxhdGlvblN0YXRlKCk7CisgICAgICAgIFNlcXVlbmNlciBzZXF1ZW5jZXIgPSBzaW11bGF0aW9uLmdldFNjZW5hcmlvKCkuZ2V0U2VxdWVuY2VyKCk7CisJCS8vIElmIHNlcXVlbmNlciBpcyBudWxsLCB0aGVuIHdlIGhhdmUgZGlzcG9zZWQgdGhlIHdpZGdldC4KKwkJaWYgKHNlcXVlbmNlciA9PSBudWxsKSB7CisJCQkvLyBXaWRnZXQgZGlzcG9zZWQsIGRvIG5vdGhpbmcuCisJCQlyZXR1cm47CisJCX0KKworCQlzd2l0Y2ggKHNpbXVsYXRpb25TdGF0ZSkgeworCQljYXNlIFNUT1BQRUQ6CisJCQkvLyBXZSdyZSBkb25lLCB3ZSdsbCBnZXQgYW4gZXZlbnQgZnJvbSB0aGUgU2ltdWxhdGlvbk1hbmFnZXIgdGVsbGluZworCQkJLy8gdXMgdGhhdCB0aGUgU2ltdWxhdGlvbiBpcyBubyBsb25nZXIgYXJvdW5kLgorCQkJcmV0dXJuOworCisJCWNhc2UgQ09NUExFVEVEX0NZQ0xFOgorCQkJZmluYWwgaW50IHdvcmtDb21wbGV0ZSA9IChpbnQpIHNlcXVlbmNlci5nZXRXb3JrQ29tcGxldGUoKTsKKworCQkJaWYgKHdvcmtDb21wbGV0ZSA8IElFeGVjdXRhYmxlLlRPVEFMX1dPUkspIHsKKwkJCQkvLyBIYXMgdGhlIHdpZGdldCBiZWVuIGRpc3Bvc2VkID8KKwkJCQlpZiAocGIuaXNEaXNwb3NlZCgpID09IHRydWUpIHsKKwkJCQkJLy8gWWVzLCBkbyBub3RoaW5nLgorCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCXBiLnNldFNlbGVjdGlvbih3b3JrQ29tcGxldGUpOworCQkJCXVwZGF0ZVByb2dyZXNzTGFiZWwod29ya0NvbXBsZXRlLCBzaW11bGF0aW9uU3RhdGUpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUlVOTklORzoKKwkJCWJyZWFrOwkKKwkJY2FzZSBDT01QTEVURURfU0VRVUVOQ0U6CisJCWNhc2UgUEFVU0VEOgorCQljYXNlIFJFU0VUOgorCQkJLy8gTm90aGluZworCQkJYnJlYWs7CisKKwkJfSAvLyBzd2l0Y2ggc2ltdWxhdGlvbiBzdGF0ZQorCQl1cGRhdGVTdGF0ZUxhYmVsKHNpbXVsYXRpb25TdGF0ZSk7CisJCXVwZGF0ZVRpbWVMYWJlbChzaW11bGF0aW9uU3RhdGUpOworCX0gLy8gc2ltdWxhdGlvbkNoYW5nZWQKKworCS8qKgorCSAqIFJlc2V0IHRoZSB0aW1lIGxhYmVsCisJICogCisJICovCisJcHJvdGVjdGVkIHZvaWQgcmVzZXRUaW1lTGFiZWwoKSB7CisJCWZpbmFsIGludCBaRVJPID0gMDsKKworCQlzaW11bGF0aW9uVGltZVRleHQKKwkJCQkuc2V0VGV4dCgiWyAiICsgWkVSTyArICIgXSAiICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJTQ3RybC5UaW1lIikgKyAiIDogIiArIFpFUk8pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAgLy8kTk9OLU5MUy00JAorCQkKKwkJc2ltdWxhdGlvblRpbWVUZXh0LnJlZHJhdygpOworCX0KKworCS8qKgorCSAqIFJ1biB0aGUgc2ltdWxhdGlvbgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJc2ltdWxhdGlvbi5ydW4oKTsKKwl9CisKKwkvKioKKwkgKiBQYXVzZSB0aGUgc2ltdWxhdGlvbgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHBhdXNlKCkgeworCQlzaW11bGF0aW9uLnBhdXNlKCk7CisJfQorCisJLyoqCisJICogUmVzZXQgdGhlIHNpbXVsYXRpb24gYW5kIHRoZSBjb250cm9scy4KKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJLy8gUmVzZXQgdGhlIHNpbXVsYXRpb24KKwkJc2ltdWxhdGlvbi5yZXNldCgpOworCisJCS8vIFR1cm4gZmxhZyBmb3IgcmVzZXRzIE9OIDoKKwkJcmVzZXQgPSB0cnVlOworCQkvLyBOb3cgcmVzZXQgdGhlIHdpZGdldCA6CisJCXJlc2V0VGltZUxhYmVsKCk7CisJfQorCisJLyoqCisJICogU3RlcCB0aGUgc2ltdWxhdGlvbgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHN0ZXAoKSB7CisJCXNpbXVsYXRpb24uc3RlcCgpOworCX0KKworCS8qKgorCSAqIFN0b3AgdGhlIHNpbXVsYXRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9wKCkgeworCQlzaW11bGF0aW9uLnN0b3AoKTsKKwl9CisKK30gLy8gU2ltdWxhdGlvbkNvbnRyb2wKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9TaW11bGF0aW9uQ29udHJvbFZpZXcuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvU2ltdWxhdGlvbkNvbnRyb2xWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0Mzk0NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvU2ltdWxhdGlvbkNvbnRyb2xWaWV3LmphdmEKQEAgLTAsMCArMSw0NDAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uTWFuYWdlckV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuSVNoYXJlZEltYWdlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhbiBlY2xpcHNlIHZpZXcgdGhhdCBkaXNwbGF5cyB0aGUgc3RhdGUgb2YgdGhlCisgKiBjdXJyZW50bHkgYWN0aXZlIHNpbXVsYXRpb25zIGFuZCBHVUkgY29udHJvbHMgdGhhdCBhbGxvdyB0aGUgc2ltdWxhdGlvbnMgdG8KKyAqIGJlIG1hbmFnZWQuCisgKiAKKyAqLworcHVibGljIGNsYXNzIFNpbXVsYXRpb25Db250cm9sVmlldyBleHRlbmRzIFZpZXdQYXJ0IGltcGxlbWVudHMKKwkJSVNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXIgeworCisJLyoqCisJICogT3VyIHJlZmVyZW5jZSB0byB0aGUgc2ltdWxhdGlvbiBtYW5hZ2VyCisJICovCisJcHJpdmF0ZSBTaW11bGF0aW9uTWFuYWdlciBzaW11bGF0aW9uTWFuYWdlciA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY29sbGVjdGlvbiBvZiBzaW11bGF0aW9uIGNvbnRyb2xzCisJICovCisJcHJpdmF0ZSBMaXN0PFNpbXVsYXRpb25Db250cm9sPiBjb250cm9sTGlzdCA9IG5ldyBBcnJheUxpc3Q8U2ltdWxhdGlvbkNvbnRyb2w+KCk7CisKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgU2ltdWxhdGlvbiBDb250cm9sIFZpZXcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9TSU1VTEFUSU9OX0NPTlRST0xfVklFVyA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLnNpbXVsYXRpb25jb250cm9sdmlldyI7IC8vJE5PTi1OTFMtMSQKKworCS8vIFRoZSBzY3JvbGxlZCBjb21wb3NpdGUgLS0gYWxsb3dzIGNvbnRyb2wgY29tcG9zaXRlIHRvIHNjcm9sbAorCXByaXZhdGUgU2Nyb2xsZWRDb21wb3NpdGUgc2Nyb2xsQ29tcG9zaXRlID0gbnVsbDsKKworCS8vIFRoZSBjb250cm9sIGNvbXBvc2l0ZSAtLSBob2xkcyB0aGUgY29udHJvbHMKKwlwcml2YXRlIENvbXBvc2l0ZSBjb250cm9sQ29tcG9zaXRlID0gbnVsbDsKKworCS8vIEFjdGlvbnMgZm9yIG1hc3RlciBzaW11bGF0aW9uIGNvbnRyb2wKKwlBY3Rpb24gcnVuQWN0aW9uLCByZXNldEFjdGlvbiwgcGF1c2VBY3Rpb24sIHN0ZXBBY3Rpb24sIHN0b3BBY3Rpb247CisKKwkvLyBVc2VkIGJ5IGEgcGFydCB0byBhY2Nlc3MgaXRzIG1lbnUsIHRvb2wgYmFyLCBhbmQgc3RhdHVzIGxpbmUgbWFuYWdlcnMuCisJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IG51bGw7CisKKwkvLyBNZW51IG1hbmFnZXIgZm9yIHRoaXMgdmlldworCUlNZW51TWFuYWdlciBkcm9wRG93bk1lbnUgPSBudWxsOworCisJLy8gVG9vbCBiYXIgbWFuYWdlciBmb3IgdGhpcyB2aWV3CisJSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXIgPSBudWxsOworCisJLy8gU29tZSBjb25zdGFudHMgd2UgbmVlZCB0byBzZXQgcHJlZmVycmVkIHNpemVzIG9mIFNXVCBjb250cm9scworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ1JPTExfTUlOX0xFTkdUSCA9IDEwMDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ1JPTExfTUlOX0hFSUdUSCA9IDE2MDA7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqIAorCSAqLworCXB1YmxpYyBTaW11bGF0aW9uQ29udHJvbFZpZXcoKSB7CisJCXN1cGVyKCk7CisJCS8vIFNldCBvdXIgcmVmZXJlbmNlIHRvIHRoZSBzaW11bGF0aW9uIG1hbmFnZXIKKwkJc2ltdWxhdGlvbk1hbmFnZXIgPSBTaW11bGF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCk7CisJCXNpbXVsYXRpb25NYW5hZ2VyLmFkZFNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXIodGhpcyk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIHdoZXJlIHRoZSB2aWV3IGlzIHB1dCB0b2dldGhlciBwaWVjZSBieSBwaWVjZQorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJZmluYWwgaW50IENPTFVNTlMgPSAxOworCisJCXNjcm9sbENvbXBvc2l0ZSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5WX1NDUk9MTAorCQkJCXwgU1dULkJPUkRFUik7CisJCXNjcm9sbENvbXBvc2l0ZS5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOworCQlzY3JvbGxDb21wb3NpdGUuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7CisJCXNjcm9sbENvbXBvc2l0ZS5zZXRNaW5TaXplKFNDUk9MTF9NSU5fTEVOR1RILCBTQ1JPTExfTUlOX0hFSUdUSCk7CisJCXNjcm9sbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7CisJCWNvbnRyb2xDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNjcm9sbENvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlzY3JvbGxDb21wb3NpdGUuc2V0Q29udGVudChjb250cm9sQ29tcG9zaXRlKTsKKwkJLy8gc2V0dXAgdGhlIGxheW91dAorCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisJCWNvbnRyb2xDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IENPTFVNTlM7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQljb250cm9sQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCQkKKworCQkvLyBDcmVhdGUgdGhlIGFjdGlvbnMgZm9yIG1hc3RlciBzaW11bGF0aW9uIGNvbnRyb2wKKwkJcnVuQWN0aW9uID0gbmV3IEFjdGlvbigKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIlNDVmlldy5SdW4iKSwgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21JbWFnZShBY3RpdmF0b3IgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoCisJCQkJCQkJCQkJSVNoYXJlZEltYWdlcy5SVU5fSUNPTikpKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJbWFzdGVyUnVuQWN0aW9uKCk7CisJCQl9CisJCX07CisKKwkJcGF1c2VBY3Rpb24gPSBuZXcgQWN0aW9uKAorCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiU0NWaWV3LlBhdXNlIiksIEltYWdlRGVzY3JpcHRvciAvLyROT04tTkxTLTEkCisJCQkJCQkuY3JlYXRlRnJvbUltYWdlKEFjdGl2YXRvci5nZXREZWZhdWx0KCkKKwkJCQkJCQkJLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoCisJCQkJCQkJCQkJSVNoYXJlZEltYWdlcy5QQVVTRV9JQ09OKSkpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQltYXN0ZXJQYXVzZUFjdGlvbigpOworCQkJfQorCQl9OworCisJCXJlc2V0QWN0aW9uID0gbmV3IEFjdGlvbigKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIlNDVmlldy5SZXNldCIpLCBJbWFnZURlc2NyaXB0b3IgLy8kTk9OLU5MUy0xJAorCQkJCQkJLmNyZWF0ZUZyb21JbWFnZShBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpCisJCQkJCQkJCS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KAorCQkJCQkJCQkJCUlTaGFyZWRJbWFnZXMuUkVTRVRfSUNPTikpKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJbWFzdGVyUmVzZXRBY3Rpb24oKTsKKwkJCX0KKwkJfTsKKworCQlzdGVwQWN0aW9uID0gbmV3IEFjdGlvbigKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIlNDVmlldy5TdGVwIiksIEltYWdlRGVzY3JpcHRvciAvLyROT04tTkxTLTEkCisJCQkJCQkuY3JlYXRlRnJvbUltYWdlKEFjdGl2YXRvci5nZXREZWZhdWx0KCkKKwkJCQkJCQkJLmdldEltYWdlUmVnaXN0cnkoKQorCQkJCQkJCQkuZ2V0KElTaGFyZWRJbWFnZXMuU1RFUF9JQ09OKSkpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQltYXN0ZXJTdGVwQWN0aW9uKCk7CisJCQl9CisJCX07CisKKwkJc3RvcEFjdGlvbiA9IG5ldyBBY3Rpb24oCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJTQ1ZpZXcuU3RvcCIpLCBJbWFnZURlc2NyaXB0b3IgLy8kTk9OLU5MUy0xJAorCQkJCQkJLmNyZWF0ZUZyb21JbWFnZShBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpCisJCQkJCQkJCS5nZXRJbWFnZVJlZ2lzdHJ5KCkKKwkJCQkJCQkJLmdldChJU2hhcmVkSW1hZ2VzLlNUT1BfSUNPTikpKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJbWFzdGVyU3RvcEFjdGlvbigpOworCQkJfQorCQl9OworCisJCS8vIFNldCBkaXNhYmxlZCBpY29ucyBmb3Igb3VyIG1hc3RlciBjb250cm9sCisKKwkJcnVuQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvcgorCQkJCS5jcmVhdGVGcm9tSW1hZ2UoQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KAorCQkJCQkJSVNoYXJlZEltYWdlcy5ESVNBQkxFRF9SVU5fSUNPTikpKTsKKworCQlwYXVzZUFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IKKwkJCQkuY3JlYXRlRnJvbUltYWdlKEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldCgKKwkJCQkJCUlTaGFyZWRJbWFnZXMuRElTQUJMRURfUEFVU0VfSUNPTikpKTsKKworCQlyZXNldEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IKKwkJCQkuY3JlYXRlRnJvbUltYWdlKEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldCgKKwkJCQkJCUlTaGFyZWRJbWFnZXMuRElTQUJMRURfUkVTRVRfSUNPTikpKTsKKworCQlzdGVwQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvcgorCQkJCS5jcmVhdGVGcm9tSW1hZ2UoQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KAorCQkJCQkJSVNoYXJlZEltYWdlcy5ESVNBQkxFRF9TVEVQX0lDT04pKSk7CisKKwkJc3RvcEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IKKwkJCQkuY3JlYXRlRnJvbUltYWdlKEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldCgKKwkJCQkJCUlTaGFyZWRJbWFnZXMuRElTQUJMRURfU1RPUF9JQ09OKSkpOworCisJCS8vIEluaXRpYWwgc3RhdGUgaWYgbWFzdGVyIGNvbnRyb2wgc2hvdWxkIGJlIERJU0FCTEVECisJCXJ1bkFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJcGF1c2VBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7CisJCXJlc2V0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOworCQlzdGVwQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOworCQlzdG9wQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOworCisJCS8vIGdldCB0aGUgYWN0aW9uIG1hbmFnZXIgZm9yIHRoaXMgdmlldworCQlhY3Rpb25CYXJzID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCk7CisKKwkJLy8gZ2V0IHRoZSBkcm9wIGRvd24gbWVudSBtYW5hZ2VyIGZvciB0aGlzIHZpZXcKKwkJZHJvcERvd25NZW51ID0gYWN0aW9uQmFycy5nZXRNZW51TWFuYWdlcigpOworCisJCS8vIGdldCB0aGUgdG9vbCBiYXIgbWFuYWdlciBmb3IgdGhpcyB2aWV3CisJCXRvb2xCYXIgPSBhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7CisKKwkJLy8gQWRkIGFsbCBhY3Rpb25zIHRvIGRyb3AgZG93biBtZW51IG9uIHRoZSByaWdodCBjb3JuZXIgb2YgdGhpcyB2aWV3CisJCWRyb3BEb3duTWVudS5hZGQocnVuQWN0aW9uKTsKKwkJZHJvcERvd25NZW51LmFkZChwYXVzZUFjdGlvbik7CisJCWRyb3BEb3duTWVudS5hZGQocmVzZXRBY3Rpb24pOworCQlkcm9wRG93bk1lbnUuYWRkKHN0ZXBBY3Rpb24pOworCQlkcm9wRG93bk1lbnUuYWRkKHN0b3BBY3Rpb24pOworCisJCS8vIEFkZCBhbGwgYWN0aW9ucyB0byB0aGUgdG9vbCBiYXIgb2YgdGhpcyB2aWV3CisJCXRvb2xCYXIuYWRkKHJ1bkFjdGlvbik7CisJCXRvb2xCYXIuYWRkKHBhdXNlQWN0aW9uKTsKKwkJdG9vbEJhci5hZGQocmVzZXRBY3Rpb24pOworCQl0b29sQmFyLmFkZChzdGVwQWN0aW9uKTsKKwkJdG9vbEJhci5hZGQoc3RvcEFjdGlvbik7CisKKwkJLy8gaWYgYW55IGFjdGl2ZSBTaW11bGF0aW9ucywgdXNlIHRoZW0KKwkJTGlzdDxJU2ltdWxhdGlvbj5saXN0ID0gc2ltdWxhdGlvbk1hbmFnZXIuZ2V0QWN0aXZlU2ltdWxhdGlvbnMoKTsKKwkJCisJCWZvciAoSVNpbXVsYXRpb24gc2ltOiBsaXN0KSB7CisJCQlhZGRTaW11bGF0aW9uKHNpbSk7CQkKKwkJfQorCX0KKworCS8qKgorCSAqIEVuYWJsZSB1c2Ugb2YgbWFzdGVyIGNvbnRyb2wgZm9yIGFjdGl2ZSBzaW11bGF0aW9ucworCSAqIAorCSAqIEBwYXJhbSBlbmFibGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgZW5hYmxlTWFzdGVyQ29udHJvbChib29sZWFuIGVuYWJsZWQpIHsKKwkJLy8gSW5pdGlhbCBzdGF0ZSBpZiBtYXN0ZXIgY29udHJvbCBzaG91bGQgYmUgRElTQUJMRUQKKwkJcnVuQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7CisJCXBhdXNlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7CisJCXJlc2V0QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7CisJCXN0ZXBBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKKwkJc3RvcEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOworCX0KKworCS8vIFJ1biBhbGwgc2ltdWxhdGlvbnMgLS0gc2V0IHN0YXRlIG9mIGFsbCBzaW11bGF0aW9ucyB0byBSVU5OSU5HCisJcHJvdGVjdGVkIHZvaWQgbWFzdGVyUnVuQWN0aW9uKCkgeworCQlJdGVyYXRvciBpdGVyID0gY29udHJvbExpc3QuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQlTaW11bGF0aW9uQ29udHJvbCBzaW11bGF0aW9uQ29udHJvbCA9IChTaW11bGF0aW9uQ29udHJvbCkgaXRlcgorCQkJCQkubmV4dCgpOworCQkJc2ltdWxhdGlvbkNvbnRyb2wucnVuKCk7CisJCX0KKwl9CisKKwkvLyBQYXVzZSBhbGwgc2ltdWxhdGlvbnMgLS0gc2V0IHN0YXRlIG9mIGFsbCBzaW11bGF0aW9ucyB0byBQQVVTRUQKKwlwcm90ZWN0ZWQgdm9pZCBtYXN0ZXJQYXVzZUFjdGlvbigpIHsKKwkJSXRlcmF0b3IgaXRlciA9IGNvbnRyb2xMaXN0Lml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJU2ltdWxhdGlvbkNvbnRyb2wgc2ltdWxhdGlvbkNvbnRyb2wgPSAoU2ltdWxhdGlvbkNvbnRyb2wpIGl0ZXIKKwkJCQkJLm5leHQoKTsKKwkJCXNpbXVsYXRpb25Db250cm9sLnBhdXNlKCk7CisJCX0KKwl9CisKKwkvLyBSZXNldCBhbGwgc2ltdWxhdGlvbnMgLS0gc2V0IHN0YXRlIG9mIGFsbCBzaW11bGF0aW9ucyB0byBSRVNFVAorCXByb3RlY3RlZCB2b2lkIG1hc3RlclJlc2V0QWN0aW9uKCkgeworCQlJdGVyYXRvciBpdGVyID0gY29udHJvbExpc3QuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQlTaW11bGF0aW9uQ29udHJvbCBzaW11bGF0aW9uQ29udHJvbCA9IChTaW11bGF0aW9uQ29udHJvbCkgaXRlcgorCQkJCQkubmV4dCgpOworCQkJc2ltdWxhdGlvbkNvbnRyb2wucmVzZXQoKTsKKwkJfQorCX0KKworCS8vIFN0ZXAgYWxsIHNpbXVsYXRpb25zIC0tIHN0ZXAgaW4gYWxsIHNpbXVsYXRpb25zCisJcHJvdGVjdGVkIHZvaWQgbWFzdGVyU3RlcEFjdGlvbigpIHsKKwkJSXRlcmF0b3IgaXRlciA9IGNvbnRyb2xMaXN0Lml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJU2ltdWxhdGlvbkNvbnRyb2wgc2ltdWxhdGlvbkNvbnRyb2wgPSAoU2ltdWxhdGlvbkNvbnRyb2wpIGl0ZXIKKwkJCQkJLm5leHQoKTsKKwkJCXNpbXVsYXRpb25Db250cm9sLnN0ZXAoKTsKKwkJfQorCX0KKworCS8vIFN0b3AgYWxsIHNpbXVsYXRpb25zCisJcHJvdGVjdGVkIHZvaWQgbWFzdGVyU3RvcEFjdGlvbigpIHsKKwkJSXRlcmF0b3IgaXRlciA9IGNvbnRyb2xMaXN0Lml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJU2ltdWxhdGlvbkNvbnRyb2wgc2ltdWxhdGlvbkNvbnRyb2wgPSAoU2ltdWxhdGlvbkNvbnRyb2wpIGl0ZXIKKwkJCQkJLm5leHQoKTsKKwkJCXNpbXVsYXRpb25Db250cm9sLnN0b3AoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygc2ltdWxhdGlvbiBjb250cm9scworCSAqLworCXB1YmxpYyBMaXN0PFNpbXVsYXRpb25Db250cm9sPiBnZXRTaW11bGF0aW9uQ29udHJvbExpc3QoKSB7CisJCXJldHVybiBjb250cm9sTGlzdDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCisJCS8vIEFyZSB3ZSBsaXN0ZW5pbmcgdG8gdGhlIHNpbXVsYXRpb24gbWFuYWdlcj8KKwkJaWYgKHNpbXVsYXRpb25NYW5hZ2VyICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJLy8gTm90IGFueSBtb3JlCisJCQlzaW11bGF0aW9uTWFuYWdlci5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKKwkJfQorCisJCWlmIChjb250cm9sTGlzdC5pc0VtcHR5KCkgPT0gZmFsc2UpIHsKKwkJCUl0ZXJhdG9yIGl0ZXIgPSBjb250cm9sTGlzdC5saXN0SXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJCVNpbXVsYXRpb25Db250cm9sIHNjdHJsID0gKFNpbXVsYXRpb25Db250cm9sKWl0ZXIubmV4dCgpOworCQkJCXNjdHJsLmRpc3Bvc2UoKTsKKwkJCQlpdGVyLnJlbW92ZSgpOworCQkJfQorCQl9CisKKwl9IC8vIGRpc3Bvc2UKKworCS8qKgorCSAqIEEgc2ltdWxhdGlvbiBoYXMgYmVlbiBzdGFydGVkIG9yIHN0b3BwZWQuCisJICogV2UgaGF2ZSByZWdpc3RlcmVkIGZvciBTaW11bGF0aW9uTWFuYWdlci5hZGRMaXN0ZW5lcigpIGFuZCAKKwkgKiBzbyB3ZSBhcmUgaW5mb3JtZWQgd2hlbiBhIHNpbXVsYXRpb24gaXMgc3RhcnRlZCBhbmQgd2hlbgorCSAqIG9uZSBpcyBzdG9wcGVkLiAKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyI3NpbXVsYXRpb25zQ2hhbmdlZChvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uTWFuYWdlckV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIHNpbXVsYXRpb25zQ2hhbmdlZChTaW11bGF0aW9uTWFuYWdlckV2ZW50IGV2ZW50KSB7CisKKwkJSVNpbXVsYXRpb25bXSBzaW11bGF0aW9ucyA9IG51bGw7CisKKwkJLy8gYWRkIGEgc2ltdWxhdGlvbiBjb250cm9sIGZvciBlYWNoIG5ldyBzaW11bGF0aW9uLi4uCisJCXNpbXVsYXRpb25zID0gZXZlbnQuZ2V0U2ltdWxhdGlvbnNBZGRlZCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpbXVsYXRpb25zLmxlbmd0aDsgaSsrKSB7CisJCQlhZGRTaW11bGF0aW9uKHNpbXVsYXRpb25zW2ldKTsJCQorCQl9CisKKwkJLy8gcmVtb3ZlIHRoZSBjb3JyZXNwb25kaW5nIHNpbXVsYXRpb24gY29udHJvbCBmb3IgYWxsIHN0b3BwZWQKKwkJLy8gc2ltdWxhdGlvbnMuLi4KKwkJc2ltdWxhdGlvbnMgPSBldmVudC5nZXRTaW11bGF0aW9uc1JlbW92ZWQoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaW11bGF0aW9ucy5sZW5ndGg7IGkrKykgeworCQkJcmVtb3ZlU2ltdWxhdGlvbihzaW11bGF0aW9uc1tpXSk7CQkJCisJCX0KKworCQkKKwkJc2Nyb2xsQ29tcG9zaXRlLnNldENvbnRlbnQoY29udHJvbENvbXBvc2l0ZSk7CisJCWNvbnRyb2xDb21wb3NpdGUubGF5b3V0KHRydWUpOworCQlzY3JvbGxDb21wb3NpdGUubGF5b3V0KHRydWUpOworCisJCQorCQkvL2NvbnRyb2xDb21wb3NpdGUucmVkcmF3KCk7CisJCXNjcm9sbENvbXBvc2l0ZS5yZWRyYXcoKTsKKwkJCisJCS8vIFJlZnJlc2ggb3VyIHJlZmVyZW5jZSB0byB0aGUgc2ltdWxhdGlvbiBtYW5hZ2VyCisvLwkJc2ltdWxhdGlvbk1hbmFnZXIgPSBTaW11bGF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCk7CisvLwkJc2ltdWxhdGlvbk1hbmFnZXIuYWRkU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lcih0aGlzKTsKKworCX0KKworCS8qKgorCSAqIGFkZCBhIHNpbXVsYXRpb24gY29udHJvbCBwYW5lbCAKKwkgKiBmb3IgYW4gYWRkZWQgb3IgZXhpc3RpbmcgSVNpbXVsYXRpb24gCisJICogCisJICogQHBhcmFtIHNpbSAgSW5zdGFuY2Ugb2YgSVNpbXVsYXRpb24KKwkgKi8KKwlwcml2YXRlIHZvaWQgYWRkU2ltdWxhdGlvbihJU2ltdWxhdGlvbiBzaW0pIHsKKwkJY29udHJvbENvbXBvc2l0ZS5zZXRSZWRyYXcodHJ1ZSk7CisJCXNjcm9sbENvbXBvc2l0ZS5zZXRSZWRyYXcodHJ1ZSk7CisJCVNpbXVsYXRpb25Db250cm9sIHNpbXVsYXRpb25Db250cm9sID0gCisJCQluZXcgU2ltdWxhdGlvbkNvbnRyb2woY29udHJvbENvbXBvc2l0ZSwgc2ltKTsKKwkJY29udHJvbENvbXBvc2l0ZS5hZGRDb250cm9sTGlzdGVuZXIoc2ltdWxhdGlvbkNvbnRyb2wpOworCQljb250cm9sTGlzdC5hZGQoc2ltdWxhdGlvbkNvbnRyb2wpOworCQlpZiAoY29udHJvbExpc3Quc2l6ZSgpID4gMCkgeworCQkJZW5hYmxlTWFzdGVyQ29udHJvbCh0cnVlKTsKKwkJfSAKKwkJCisJCWNvbnRyb2xDb21wb3NpdGUubGF5b3V0KHRydWUpOworCQlzY3JvbGxDb21wb3NpdGUubGF5b3V0KHRydWUpOworCQkKKwkJc2Nyb2xsQ29tcG9zaXRlLnJlZHJhdygpOwkJCisJfQorCQorCS8qKgorCSAqIHJlbW92ZSBhIHNpbXVsYXRpb24gY29udHJvbCBwYW5lbCAKKwkgKiBmb3IgYW4gYWRkZWQgb3IgZXhpc3RpbmcgSVNpbXVsYXRpb24gCisJICogCisJICogQHBhcmFtIHNpbSAgSW5zdGFuY2Ugb2YgSVNpbXVsYXRpb24KKwkgKi8KKwlwcml2YXRlIHZvaWQgcmVtb3ZlU2ltdWxhdGlvbihJU2ltdWxhdGlvbiBzaW11bGF0aW9uKSB7CisJCWNvbnRyb2xDb21wb3NpdGUuc2V0UmVkcmF3KHRydWUpOworCQlzY3JvbGxDb21wb3NpdGUuc2V0UmVkcmF3KHRydWUpOworCQkJCQorCQlDb250cm9sW10gY3RybHMgPSBjb250cm9sQ29tcG9zaXRlLmdldENoaWxkcmVuKCk7CisKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBjdHJscy5sZW5ndGg7IGorKykgeworCQkJU2ltdWxhdGlvbkNvbnRyb2wgc2ltdWxhdGlvbkNvbnRyb2wgPSAoU2ltdWxhdGlvbkNvbnRyb2wpIGN0cmxzW2pdOworCQkJaWYgKHNpbXVsYXRpb24uZXF1YWxzKHNpbXVsYXRpb25Db250cm9sLmdldFNpbXVsYXRpb24oKSkpIHsKKwkJCQljb250cm9sQ29tcG9zaXRlLnJlbW92ZUNvbnRyb2xMaXN0ZW5lcihzaW11bGF0aW9uQ29udHJvbCk7CisJCQkJY29udHJvbExpc3QucmVtb3ZlKHNpbXVsYXRpb25Db250cm9sKTsKKwkJCQkvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgY29tcG9zaXRlCisJCQkJQ29tcG9zaXRlIHRlbXBDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNjcm9sbENvbXBvc2l0ZSwKKwkJCQkJCVNXVC5OT05FKTsKKwkJCQkvLyBTZXQgdGhlIHRlbXBvcmFyeSBjb21wb3NpdGUgdG8gYmUgdGhlIHBhcmVudCBvZiB0aGUKKwkJCQkvLyBjb250cm9sIHdlIHdhbnQgdG8gcmVtb3ZlIDoKKwkJCQlzaW11bGF0aW9uQ29udHJvbC5zZXRQYXJlbnQodGVtcENvbXBvc2l0ZSk7CisJCQkJLy8gTm93IGdldCByaWQgb2YgdGhlIHRlbXBvcmFyeSBjb21wb3NpdGUgYW5kIGl0cyBjaGlsZHJlbgorCQkJCXRlbXBDb21wb3NpdGUuZGlzcG9zZSgpOworCQkJCXNpbXVsYXRpb25Db250cm9sLmRpc3Bvc2UoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChjb250cm9sTGlzdC5zaXplKCkgPT0gMCkgewkJCQorCQkJZW5hYmxlTWFzdGVyQ29udHJvbChmYWxzZSk7CisJCX0KKwkJCisJCWNvbnRyb2xDb21wb3NpdGUubGF5b3V0KHRydWUpOworCQlzY3JvbGxDb21wb3NpdGUubGF5b3V0KHRydWUpOworCQkKKwkJc2Nyb2xsQ29tcG9zaXRlLnJlZHJhdygpOwkJCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9UcmlnZ2Vyc1ZpZXcuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvVHJpZ2dlcnNWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZjYTE3NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvVHJpZ2dlcnNWaWV3LmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8vIFRyaWdnZXJzVmlldy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLklTaGFyZWRJbWFnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgZWNsaXBzZSB2aWV3IG9mIHRoZQorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJ9cyB0aGF0IGhhdmUgYmVlbiBpbXBvcnRlZCBpbnRvCisgKiBlY2xpcHNlIGFzIHBsdWctaW5zLgorICovCitwdWJsaWMgY2xhc3MgVHJpZ2dlcnNWaWV3IGV4dGVuZHMgSWRlbnRpZmlhYmxlUGx1Z2luVmlldyB7CisKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgVHJpZ2dlcnMgVmlldyB7QHZhbHVlfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1RSSUdHRVJTX1ZJRVcgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy50cmlnZ2VycyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJcHVibGljIFRyaWdnZXJzVmlldygpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSWRlbnRpZmlhYmxlUGx1Z2luVmlldyNnZXRJZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIgZ2V0SWRlbnRpZmlhYmxlUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyaWdnZXJQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSWRlbnRpZmlhYmxlUGx1Z2luVmlldyNnZXRJbnB1dCgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElkZW50aWZpYWJsZVZpZXdNb2RlbCBnZXRJbnB1dCgpIHsKKwkJcmV0dXJuIFRyaWdnZXJWaWV3TW9kZWwuZ2V0TW9kZWwoKTsKKwl9IC8vIGdldElucHV0CisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgYSBtb2RlbCBvZiB0aGUgU1RFTQorCSAqIHtAbGluayBUcmlnZ2VyfXMgdGhhdCBhcmUgcGx1Z2dlZCBpbnRvIHRoZSBzeXN0ZW0uCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUcmlnZ2VyVmlld01vZGVsIGV4dGVuZHMgSWRlbnRpZmlhYmxlVmlld01vZGVsIHsKKwkJLy8gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQorCQlwcml2YXRlIHN0YXRpYyBUcmlnZ2VyVmlld01vZGVsIHR2TW9kZWw7CisKKwkJcHJpdmF0ZSBUcmlnZ2VyVmlld01vZGVsKCkgeworCQkJc3VwZXIoQ29uc3RhbnRzLklEX1RSSUdHRVJfRVhURU5TSU9OX1BPSU5UKTsKKwkJfQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIE1vZGVsVmlld01vZGVsCisJCSAqLworCQlwdWJsaWMgc3RhdGljIFRyaWdnZXJWaWV3TW9kZWwgZ2V0TW9kZWwoKSB7CisJCQlpZiAodHZNb2RlbCA9PSBudWxsKSB7CisJCQkJdHZNb2RlbCA9IG5ldyBUcmlnZ2VyVmlld01vZGVsKCk7CisJCQl9CisJCQlyZXR1cm4gdHZNb2RlbDsKKwkJfSAvLyBnZXRNb2RlbAorCX0gLy8gVHJpZ2dlclZpZXdNb2RlbAorCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUcmlnZ2VyUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyIGV4dGVuZHMKKwkJCUlkZW50aWZpYWJsZVBsdWdpblZpZXdMYWJlbENvbnRlbnRQcm92aWRlciB7CisKKwkJLy8gVGhpcyBpcyB0aGUgaW1hZ2UgdXNlZCB0byByZXByZXNlbnQgdHJpZ2dlcnMgaW4gdGhlIHRyaWdnZXIgdmlldworCQlzdGF0aWMgSW1hZ2UgdHJpZ2dlckljb24gPSBudWxsOworCisJCS8vIElmIHRydWUgdGhlbiB3ZSd2ZSBuZXZlciB0cmllZCB0byBnZXQgdGhlIGljb24KKwkJc3RhdGljIGJvb2xlYW4gdHJpZ2dlckljb25GaXJzdFRpbWUgPSB0cnVlOworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSWRlbnRpZmlhYmxlUGx1Z2luVmlldy5JZGVudGlmaWFibGVQbHVnaW5WaWV3TGFiZWxDb250ZW50UHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCXJldHVybiAoZWxlbWVudCBpbnN0YW5jZW9mIElkZW50aWZpYWJsZURlbGVnYXRlKSA/IGdldFRyaWdnZXJJY29uKCkKKwkJCQkJOiBzdXBlci5nZXRJbWFnZShlbGVtZW50KTsKKwkJfSAvLyBnZXRJbWFnZQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBpY29uIHRvIGJlIHVzZWQgdG8gcmVwcmVzZW50IHRyaWdnZXJzLCBvciBudWxsIGlmIGl0CisJCSAqICAgICAgICAgY2FuJ3QgYmUgbG9hZGVkLgorCQkgKi8KKwkJcHJpdmF0ZSBJbWFnZSBnZXRUcmlnZ2VySWNvbigpIHsKKwkJCS8vIFNob3VsZCB3ZSB0cnkgdG8gbG9hZCB0aGUgaWNvbj8KKwkJCWlmICh0cmlnZ2VySWNvbkZpcnN0VGltZSAmJiB0cmlnZ2VySWNvbiA9PSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJdHJpZ2dlckljb25GaXJzdFRpbWUgPSBmYWxzZTsKKwkJCQl0cmlnZ2VySWNvbiA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldCgKKwkJCQkJCUlTaGFyZWRJbWFnZXMuVFJJR0dFUl9JQ09OKTsKKwkJCX0gLy8gaWYgd2Ugc2hvdWxkIGxvYWQgdGhlIGljb24KKwkJCXJldHVybiB0cmlnZ2VySWNvbjsKKwkJfSAvLyBnZXRUcmlnZ2VySWNvbgorCisJfSAvLyBUcmlnZ2VyUGx1Z2luVmlld0xhYmVsQ29udGVudFByb3ZpZGVyCisKK30gLy8gVHJpZ2dlcnNWaWV3ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9JZGVudGlmaWFibGVDb250ZW50UHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvSWRlbnRpZmlhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwNWE3OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvSWRlbnRpZmlhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0MjEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3JlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlRyZWVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLlV0aWxpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uTmF2aWdhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBJVHJlZUNvbnRlbnRQcm92aWRlcn0gZm9yCisgKiB7QGxpbmsgSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZX1zIHdoaWNoIGFwcGVhciBpbiB0aGUKKyAqIHtAbGluayBDb21tb25OYXZpZ2F0b3J9IGZyYW1ld29yayB0aGF0IGlzIHVzZWQgdG8gZXhwbG9yZSBTVEVNIFByb2plY3RzLgorICovCitAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKK3B1YmxpYyBjbGFzcyBJZGVudGlmaWFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwKKwkJSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvciB7CisKKwlWaWV3ZXIgdmlld2VyOworCisJLyoqCisJICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGVDb250ZW50UHJvdmlkZXIoKSB7CisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMsCisJCQkJSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgeworCQlPYmplY3RbXSByZXRWYWx1ZSA9IG51bGw7CisJCS8vIFJpZ2h0IGtpbmQgb2YgcGFyZW50PworCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElkZW50aWZpYWJsZVRyZWVOb2RlKSB7CisJCQkvLyBZZXMKKwkJCS8vIGlmIElkZW50aWZpYWJsZVRyZWVOb2RlCisJCQlmaW5hbCBMaXN0PElkZW50aWZpYWJsZT4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8SWRlbnRpZmlhYmxlPigpOworCisJCQlmaW5hbCBJZGVudGlmaWFibGVUcmVlTm9kZSBpdG4gPSAoSWRlbnRpZmlhYmxlVHJlZU5vZGUpIHBhcmVudEVsZW1lbnQ7CisKKwkJCWZpbmFsIElGb2xkZXIgZm9sZGVyID0gaXRuLmdldFByb2plY3QoKS5nZXRGb2xkZXIoCisJCQkJCWl0bi5nZXRGb2xkZXJOYW1lKCkpOworCisJCQkvLyBEb2VzIHRoZSBmb2xkZXIgZXhpc3Q/CisJCQlpZiAoZm9sZGVyLmV4aXN0cygpKSB7CisJCQkJLy8gWWVzCisJCQkJdHJ5IHsKKwkJCQkJZm9yIChmaW5hbCBJUmVzb3VyY2UgaWRlbnRpZmlhYmxlRmlsZSA6IGZvbGRlci5tZW1iZXJzKCkpIHsKKwkJCQkJCWlmKGlkZW50aWZpYWJsZUZpbGUgaW5zdGFuY2VvZiBJRmlsZSkgeworCQkJCQkJCUlGaWxlIGlmaWxlID0gKElGaWxlKSBpZGVudGlmaWFibGVGaWxlOworCQkJCQkJCS8vIGV4Y2x1ZGUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZmlsZXMgc3RhcnRpbmcgd2l0aCAnLicKKwkJCQkJCQlpZigoaWZpbGUuZ2V0TmFtZSgpLmxlbmd0aCgpPjApJiYoIGlmaWxlLmdldE5hbWUoKS5jaGFyQXQoMCkhPScuJyApICYmICFpZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIn4iKSkgeworCQkJCQkJCQl0cnkgeworCQkJCQkJCQkJZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50aWZpYWJsZSA9IFV0aWxpdHkuZ2V0SWRlbnRpZmlhYmxlKChJRmlsZSkgaWRlbnRpZmlhYmxlRmlsZSk7CisJCQkJCQkJCQlpZihpZGVudGlmaWFibGUgIT0gbnVsbCkgdGVtcC5hZGQoaWRlbnRpZmlhYmxlKTsKKwkJCQkJCQkJfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIHQpIHsKKwkJCQkJCQkJCS8vIGhlcmUgd2Ugd2FudCB0byBwcm90ZWN0IHRoZSB1c2VyIGFuZCBhbGxvdyBub24gU1RFTSBmaWxlcyBpbiBlYWNoIERpcmVjdG9yeQorCQkJCQkJCQkJLy8gSnVzdCBjYXRjaCBhbnkgZXhjZXB0aW9uIGFuZCBjb250aW51ZQorCQkJCQkJCQkJQWN0aXZhdG9yLmxvZ0luZm9ybWF0aW9uKCJFcnJvciBsb2FkaW5nIGZpbGUgIitpZmlsZS5nZXROYW1lKCkrIiBmb3IgZGlzcGxheSIsIHQpOworCQkJCQkJCQl9CisKKwkJCQkJCQl9CisJCQkJCQl9IC8vIGlmIGluc3RhbmNlT0YgSUZJTEUgZWxzZSBtaWdodCBiZSBmb2xkZXIgb3Igc29tZSBvdGhlciBvYmplY3QgY3JlYXRlZCBvdXRzaWRlIG9mIFNURU0gLi4uCisJCQkJCQkKKwkJCQkJfQorCQkJCX0gY2F0Y2ggKGZpbmFsIENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCIiLCBjZSk7CisJCQkJfSAvLyBmb3IgZWFjaCBJUmVzb3VyY2UgZm9sZGVyLm1lbWJlcnMoKQorCQkJfSAvLyBpZiBmb2xkZXIgZXhpc3RzCisKKwkJCXJldFZhbHVlID0gdGVtcC50b0FycmF5KCk7CisKKwkJfSBlbHNlIHsKKwkJCXJldFZhbHVlID0gbmV3IE9iamVjdFswXTsKKwkJfQorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldENoaWxkcmVuCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJT2JqZWN0IHJldFZhbHVlID0gbnVsbDsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJZGVudGlmaWFibGVJbnN0YW5jZVRyZWVOb2RlKSB7CisJCQlyZXRWYWx1ZSA9ICgoSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZSkgZWxlbWVudCkuZ2V0UGFyZW50KCk7CisJCX0gLy8gaWYgSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKKwkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihlbGVtZW50KTsKKwkJcmV0dXJuIGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCisJICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChvcmcKKwkgKiAgICAgIC5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChmaW5hbCBJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgeworCQl0cnkgeworCQkJZXZlbnQuZ2V0RGVsdGEoKS5hY2NlcHQodGhpcyk7CisJCX0gY2F0Y2ggKGZpbmFsIENvcmVFeGNlcHRpb24gZSkgeworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCIiLCBlKTsKKwkJfQorCX0gLy8gcmVzb3VyY2VDaGFuZ2VkCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5jb3JlCisJICogICAgICAucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KGZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQorCQlmaW5hbCBJUmVzb3VyY2Ugc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsgCisKKwkKKwkJSVBhdGggcGF0aCA9IGRlbHRhLmdldEZ1bGxQYXRoKCk7CisKKy8qCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBhdGg6ICIrcGF0aCk7CisJCWlmKChkZWx0YS5nZXRLaW5kKCkmSVJlc291cmNlRGVsdGEuQURERUQpID09IElSZXNvdXJjZURlbHRhLkFEREVEKSBTeXN0ZW0ub3V0LnByaW50bG4oIkFEREVEIik7CisJCWlmKChkZWx0YS5nZXRLaW5kKCkmSVJlc291cmNlRGVsdGEuQURERURfUEhBTlRPTSkgPT0gSVJlc291cmNlRGVsdGEuQURERURfUEhBTlRPTSkgU3lzdGVtLm91dC5wcmludGxuKCJBRERFRF9QSEFOVE9NIik7CisJCWlmKChkZWx0YS5nZXRLaW5kKCkmSVJlc291cmNlRGVsdGEuQUxMX1dJVEhfUEhBTlRPTVMpID09IElSZXNvdXJjZURlbHRhLkFMTF9XSVRIX1BIQU5UT01TKSBTeXN0ZW0ub3V0LnByaW50bG4oIkFMTF9XSVRIX1BIQU5UT01TIik7CisJCWlmKChkZWx0YS5nZXRLaW5kKCkmSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgU3lzdGVtLm91dC5wcmludGxuKCJDSEFOR0VEIik7CisJCWlmKChkZWx0YS5nZXRLaW5kKCkmSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgPT0gSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgU3lzdGVtLm91dC5wcmludGxuKCJDT05URU5UIik7CisJCWlmKChkZWx0YS5nZXRLaW5kKCkmSVJlc291cmNlRGVsdGEuQ09QSUVEX0ZST00pID09IElSZXNvdXJjZURlbHRhLkNPUElFRF9GUk9NKSBTeXN0ZW0ub3V0LnByaW50bG4oIkNPUElFRF9GUk9NIik7CisJCWlmKChkZWx0YS5nZXRLaW5kKCkmSVJlc291cmNlRGVsdGEuREVTQ1JJUFRJT04pID09IElSZXNvdXJjZURlbHRhLkRFU0NSSVBUSU9OKSBTeXN0ZW0ub3V0LnByaW50bG4oIkRFU0NSSVBUSU9OIik7CisJCWlmKChkZWx0YS5nZXRLaW5kKCkmSVJlc291cmNlRGVsdGEuRU5DT0RJTkcpID09IElSZXNvdXJjZURlbHRhLkVOQ09ESU5HKSBTeXN0ZW0ub3V0LnByaW50bG4oIkVOQ09ESU5HIik7CisJCWlmKChkZWx0YS5nZXRLaW5kKCkmSVJlc291cmNlRGVsdGEuTE9DQUxfQ0hBTkdFRCkgPT0gSVJlc291cmNlRGVsdGEuTE9DQUxfQ0hBTkdFRCkgU3lzdGVtLm91dC5wcmludGxuKCJMT0NBTF9DSEFOR0VEIik7CisJCWlmKChkZWx0YS5nZXRLaW5kKCkmSVJlc291cmNlRGVsdGEuTUFSS0VSUykgPT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUykgU3lzdGVtLm91dC5wcmludGxuKCJNQVJLRVJTIik7CisJCWlmKChkZWx0YS5nZXRLaW5kKCkmSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgPT0gSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgU3lzdGVtLm91dC5wcmludGxuKCJNT1ZFRF9GUk9NIik7CisJCWlmKChkZWx0YS5nZXRLaW5kKCkmSVJlc291cmNlRGVsdGEuTU9WRURfVE8pID09IElSZXNvdXJjZURlbHRhLk1PVkVEX1RPKSBTeXN0ZW0ub3V0LnByaW50bG4oIk1PVkVEX1RPIik7CisJCS8vaWYoKGRlbHRhLmdldEtpbmQoKSZJUmVzb3VyY2VEZWx0YS5OT19DSEFOR0UpID09IElSZXNvdXJjZURlbHRhLk5PX0NIQU5HRSkgU3lzdGVtLm91dC5wcmludGxuKCJOT19DSEFOR0UiKTsKKwkJaWYoKGRlbHRhLmdldEtpbmQoKSZJUmVzb3VyY2VEZWx0YS5PUEVOKSA9PSBJUmVzb3VyY2VEZWx0YS5PUEVOKSBTeXN0ZW0ub3V0LnByaW50bG4oIk9QRU4iKTsKKwkJaWYoKGRlbHRhLmdldEtpbmQoKSZJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSBTeXN0ZW0ub3V0LnByaW50bG4oIlJFTU9WRUQiKTsKKwkJaWYoKGRlbHRhLmdldEtpbmQoKSZJUmVzb3VyY2VEZWx0YS5SRU1PVkVEX1BIQU5UT00pID09IElSZXNvdXJjZURlbHRhLlJFTU9WRURfUEhBTlRPTSkgU3lzdGVtLm91dC5wcmludGxuKCJSRU1PVkVEX1BIQU5UT00iKTsKKwkJaWYoKGRlbHRhLmdldEtpbmQoKSZJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgPT0gSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpIFN5c3RlbS5vdXQucHJpbnRsbigiUkVQTEFDRUQiKTsKKwkJaWYoKGRlbHRhLmdldEtpbmQoKSZJUmVzb3VyY2VEZWx0YS5SRU1PVkVEX1BIQU5UT00pID09IElSZXNvdXJjZURlbHRhLlJFTU9WRURfUEhBTlRPTSkgU3lzdGVtLm91dC5wcmludGxuKCJSRU1PVkVEX1BIQU5UT00iKTsKKwkJaWYoKGRlbHRhLmdldEtpbmQoKSZJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgPT0gSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpIFN5c3RlbS5vdXQucHJpbnRsbigiUkVQTEFDRUQiKTsKKwkJaWYoKGRlbHRhLmdldEtpbmQoKSZJUmVzb3VyY2VEZWx0YS5TWU5DKSA9PSBJUmVzb3VyY2VEZWx0YS5TWU5DKSBTeXN0ZW0ub3V0LnByaW50bG4oIlNZTkMiKTsKKwkJaWYoKGRlbHRhLmdldEtpbmQoKSZJUmVzb3VyY2VEZWx0YS5UWVBFKSA9PSBJUmVzb3VyY2VEZWx0YS5UWVBFKSBTeXN0ZW0ub3V0LnByaW50bG4oIlRZUEUiKTsKKyovCQorCQkJCQorCQkKKwkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHBhdGgudG9TdHJpbmcoKSwgZmFsc2UpOworCQkKKwkJZm9yKFJlc291cmNlIHI6IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5VdGlsaXR5LnJlc291cmNlU2V0LmdldFJlc291cmNlcygpKSAKKwkJCWlmKHIuZ2V0VVJJKCkuZXF1YWxzKHVyaSkpIHsKKwkJCQlyLnNldE1vZGlmaWVkKHRydWUpOworCQkJCWJyZWFrOworCQkJfQorCQkKKwkJc3dpdGNoICggc291cmNlLmdldFR5cGUoKSApIHsgCisJCQljYXNlIElSZXNvdXJjZS5GT0xERVI6IAorCQkJCWZpbmFsIElGb2xkZXIgZiA9IChJRm9sZGVyKXNvdXJjZTsgCisJCQkJbmV3IFVJSm9iKCJVcGRhdGUgRm9sZGVyIikgeyAKKwkJCQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsgCisJCQkJCQlpZiAodmlld2VyICE9IG51bGwgCisJCQkJCQkJCSYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgeyAKKwkJCQkJCQkoKFN0cnVjdHVyZWRWaWV3ZXIpdmlld2VyKS5yZWZyZXNoKGYpOyAKKwkJCQkJCQorCQkJCQkJfSAKKwkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOyAKKwkJCQkJfSAKKwkJCQl9LnNjaGVkdWxlKCk7IAorCQkJCWJyZWFrOworCQljYXNlIElSZXNvdXJjZS5ST09UOiAKKwkJCW5ldyBVSUpvYigiVXBkYXRlIFJvb3QiKSB7IAorCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7IAorCQkJCQlpZiAodmlld2VyICE9IG51bGwgCisJCQkJCQkJJiYgIXZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7IAorCQkJCQkJKChTdHJ1Y3R1cmVkVmlld2VyKXZpZXdlcikucmVmcmVzaChzb3VyY2UpOyAKKwkJCQkJfSAKKwkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7IAorCQkJCX0gCisJCQl9LnNjaGVkdWxlKCk7IAorCQkJYnJlYWs7CisJCWNhc2UgSVJlc291cmNlLlBST0pFQ1Q6IAorCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdClzb3VyY2U7IAorCQkJbmV3IFVJSm9iKCJVcGRhdGUgUHJvamVjdCIpIHsgCisJCQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsgCisJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAKKwkJCQkJCQkmJiAhdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsgCisJCQkJCQkoKFN0cnVjdHVyZWRWaWV3ZXIpdmlld2VyKS5yZWZyZXNoKHByb2plY3QpOyAKKwkJCQkJfSAKKwkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7IAorCQkJCX0gCisJCQl9LnNjaGVkdWxlKCk7ICAKKwkJCWJyZWFrOworCQljYXNlIElSZXNvdXJjZS5GSUxFOiAKKwkJCWZpbmFsIElGaWxlIGZpbGUgPSAoSUZpbGUpIHNvdXJjZTsgCisJCQkvLyBXaGVuIGZpbGVzIGFyZSB1cGRhdGVkLCB3ZSBuZWVkIHRvIG1hcmsgYXMgbW9kaWZpZWQgb3RoZXIgZmlsZXMgdGhhdCBhbHNvIG5lZWRzIHRvIAorCQkJLy8gYmUgcmVmcmVzaGVkIHNpbmNlIHRoZXkgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNpbmcgdGhlIGNoYW5nZWQgZmlsZQorCQkJdGhpcy5tYXJrSW5kaXJlY3RGaWxlcyhkZWx0YSk7CisJCQluZXcgVUlKb2IoIlVwZGF0ZSBGaWxlIikgeyAKKwkJCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgCisJCQkJeyAKKwkJCQkJaWYgKHZpZXdlciAhPSBudWxsIAorCQkJCQkJCSYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgeyAKKwkJCQkJCSgoU3RydWN0dXJlZFZpZXdlcil2aWV3ZXIpLnJlZnJlc2goZmlsZSk7IAorCQkJCQl9IAorCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsgCisJCQkJfSAKKwkJCX0uc2NoZWR1bGUoKTsgCisJCQlyZXR1cm4gZmFsc2U7IAorCQlkZWZhdWx0OiAKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiB0cnVlOyAJCQorCX0gLy8gdmlzaXQKKworCS8qKgorCSAqIEluIFNURU0sIG1vZGVscyBjb250YWluIG90aGVyIG1vZGVscyBhbmQgZ3JhcGhzLCBhbmQgc2NlbmFyaW9zIGNvbnRhaW4gb3RoZXIgbW9kZWxzIGV0Yy4gV2hlbiBhIHJlc291cmNlIGlzIGNoYW5nZWQsIHdlIG5lZWQgdG8gc2VlCisJICogd2hhdCBvdGhlciByZXNvdXJjZXMgYXJlIHBvdGVudGlhbGx5IGFmZmVjdGVkIGFuZCBuZWVkIHRvIGJlIG1hcmtlZCBhcyBtb2RpZmllZAorCSAqIAorCSAqIEBwYXJhbSBkZWx0YSBUaGUgZGVsdGEKKwkgKi8KKwkKKwlwcml2YXRlIHZvaWQgbWFya0luZGlyZWN0RmlsZXMoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKwkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGRlbHRhLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBmYWxzZSk7CisJCS8vU3RyaW5nIGZpbGVuYW1lID0gdXJpLmxhc3RTZWdtZW50KCk7CisJCVN0cmluZyBwcm9qZWN0ID0gZ2V0UHJvamVjdCh1cmkpOworCQlTdHJpbmcgdHlwZSA9IGdldFR5cGUodXJpKTsKKwkJCisJCWZvcihSZXNvdXJjZSByOm9yZy5lY2xpcHNlLnN0ZW0uY29yZS5VdGlsaXR5LnJlc291cmNlU2V0LmdldFJlc291cmNlcygpKSB7CisJCQlTdHJpbmcgcF9wcm9qZWN0ID0gZ2V0UHJvamVjdChyLmdldFVSSSgpKTsKKwkJCWlmKCFwcm9qZWN0LmVxdWFscyhwX3Byb2plY3QpKSBjb250aW51ZTsKKwkJCUVMaXN0PEVPYmplY3Q+IGNvbnRlbnQgPSByLmdldENvbnRlbnRzKCk7CisJCQlpZihjb250ZW50ID09IG51bGwgfHwgY29udGVudC5zaXplKCkgPT0gMCkgY29udGludWU7CisJCQlFT2JqZWN0IGZpcnN0ID0gY29udGVudC5nZXQoMCk7CisJCQlVUkkgdSA9ICgoSWRlbnRpZmlhYmxlKWZpcnN0KS5nZXRVUkkoKTsKKwkJCWlmKHUgPT0gbnVsbCkgY29udGludWU7CisJCQlTdHJpbmcgcHJvaiA9IGdldFByb2plY3QodSk7CisJCQlpZihwcm9qID09IG51bGwpIGNvbnRpbnVlOworCQkJaWYoIXByb2ouZXF1YWxzKHByb2plY3QpKSBjb250aW51ZTsgLy8gd3JvbmcgcHJvamVjdAorCisJCQlpZih0eXBlLmVxdWFscygibW9kZWxzIikpIHsKKwkJCQlpZighKGZpcnN0IGluc3RhbmNlb2YgTW9kZWwpICYmICEoZmlyc3QgaW5zdGFuY2VvZiBTY2VuYXJpbykKKwkJCQkJCSYmICEoZmlyc3QgaW5zdGFuY2VvZiBFeHBlcmltZW50KSkgY29udGludWU7IC8vIG9ubHkgbW9kZWxzLHNjZW5hcmlvcyBhbmQgZXhwZXJpbWVudHMgY29udGFpbiBvdGhlciBtb2RlbHMJCQkJCisJCQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOworCQkJCWlmKGZpcnN0IGluc3RhbmNlb2YgTW9kZWwpCisJCQkJCW1vZGlmaWVkID0gY2hlY2tNb2RlbCgoTW9kZWwpZmlyc3QsIHVyaSk7CisJCQkJZWxzZSBpZihmaXJzdCBpbnN0YW5jZW9mIFNjZW5hcmlvKQorCQkJCQltb2RpZmllZCA9IGNoZWNrU2NlbmFyaW8oKFNjZW5hcmlvKWZpcnN0LCB1cmkpOwkJCQorCQkJCWVsc2UgaWYoZmlyc3QgaW5zdGFuY2VvZiBFeHBlcmltZW50KQorCQkJCQltb2RpZmllZCA9IGNoZWNrRXhwZXJpbWVudCgoRXhwZXJpbWVudClmaXJzdCwgdXJpKTsJCisJCQkJaWYobW9kaWZpZWQpIHIuc2V0TW9kaWZpZWQodHJ1ZSk7CQkJCQkJCisJCQl9IGVsc2UgaWYodHlwZS5lcXVhbHMoImRlY29yYXRvcnMiKSkgeworCQkJCWlmKCEoZmlyc3QgaW5zdGFuY2VvZiBNb2RlbCkgJiYgIShmaXJzdCBpbnN0YW5jZW9mIFNjZW5hcmlvKSkgY29udGludWU7IC8vIG9ubHkgbW9kZWxzIGFuZCBzY2VuYXJpb3MgY29udGFpbiBkZWNvcmF0b3JzCQkJCQorCQkJCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKKwkJCQlpZihmaXJzdCBpbnN0YW5jZW9mIE1vZGVsKQorCQkJCQltb2RpZmllZCA9IGNoZWNrTW9kZWxEZWNvcmF0b3JzKChNb2RlbClmaXJzdCwgdXJpKTsKKwkJCQllbHNlIGlmKGZpcnN0IGluc3RhbmNlb2YgU2NlbmFyaW8pCisJCQkJCW1vZGlmaWVkID0gY2hlY2tTY2VuYXJpb0RlY29yYXRvcnMoKFNjZW5hcmlvKWZpcnN0LCB1cmkpOwkJCQorCQkJCWlmKG1vZGlmaWVkKSByLnNldE1vZGlmaWVkKHRydWUpOwkJCQkJCQorCQkJfSBlbHNlIGlmKHR5cGUuZXF1YWxzKCJncmFwaHMiKSkgeworCQkJCWlmKCEoZmlyc3QgaW5zdGFuY2VvZiBNb2RlbCkpIGNvbnRpbnVlOyAvLyBvbmx5IG1vZGVscyAgY29udGFpbiBncmFwaHMJCQorCQkJCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKKwkJCQltb2RpZmllZCA9IGNoZWNrTW9kZWxHcmFwaHMoKE1vZGVsKWZpcnN0LCB1cmkpOworCQkJCWlmKG1vZGlmaWVkKSByLnNldE1vZGlmaWVkKHRydWUpOwkKKwkJCX0gIAorCQkJCisJCX0KKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIGNoZWNrTW9kZWwoTW9kZWwgbW9kZWwsIFVSSSBtb2RpZmllZFVSSSkgeworCQlpZihtb2RlbCA9PSBudWxsIHx8IG1vZGlmaWVkVVJJID09IG51bGwpIAorCQkJQ29yZVBsdWdpbi5sb2dFcnJvcigiTnVsbCBtb2RlbCIsIG5ldyBFeGNlcHRpb24oKSk7CisJCWlmKG1vZGVsLmdldFVSSSgpLmxhc3RTZWdtZW50KCkuZXF1YWxzKG1vZGlmaWVkVVJJLmxhc3RTZWdtZW50KCkpKSByZXR1cm4gdHJ1ZTsKKwkJZm9yKE1vZGVsIG06bW9kZWwuZ2V0TW9kZWxzKCkpIHsKKwkJCWJvb2xlYW4gbW9kaWZpZWQgPSBjaGVja01vZGVsKG0sIG1vZGlmaWVkVVJJKTsKKwkJCWlmKG1vZGlmaWVkKSByZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBjaGVja1NjZW5hcmlvKFNjZW5hcmlvIHNjZW5hcmlvLCBVUkkgbW9kaWZpZWRVUkkpIHsKKwkJTW9kZWwgbSA9IHNjZW5hcmlvLmdldE1vZGVsKCk7CisJCWlmKG0gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyAvLyBubyBtb2RlbCBpbiBzY2VuYXJpbworCQlyZXR1cm4gY2hlY2tNb2RlbChtLCBtb2RpZmllZFVSSSk7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBjaGVja0V4cGVyaW1lbnQoRXhwZXJpbWVudCBleHBlcmltZW50LCBVUkkgbW9kaWZpZWRVUkkpIHsKKwkJU2NlbmFyaW8gc2NlbmFyaW8gPSBleHBlcmltZW50LmdldFNjZW5hcmlvKCk7CisJCWlmKHNjZW5hcmlvID09IG51bGwpIHJldHVybiBmYWxzZTsKKwkJcmV0dXJuIGNoZWNrU2NlbmFyaW8oc2NlbmFyaW8sIG1vZGlmaWVkVVJJKTsKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIGNoZWNrTW9kZWxEZWNvcmF0b3JzKE1vZGVsIG1vZGVsLCBVUkkgbW9kaWZpZWRVUkkpIHsKKwkJaWYobW9kZWwgPT0gbnVsbCB8fCBtb2RpZmllZFVSSSA9PSBudWxsKSAKKwkJCUNvcmVQbHVnaW4ubG9nRXJyb3IoIk51bGwgbW9kZWwgb3IgZGVjb3JhdG9yIiwgbmV3IEV4Y2VwdGlvbigpKTsKKwkJCisJCWZvcihEZWNvcmF0b3IgZDptb2RlbC5nZXROb2RlRGVjb3JhdG9ycygpKQorCQkJaWYoZC5nZXRVUkkoKS5sYXN0U2VnbWVudCgpLmVxdWFscyhtb2RpZmllZFVSSS5sYXN0U2VnbWVudCgpKSkgcmV0dXJuIHRydWU7CisJCQorCQkvLyBDaGVjayBzdWIgbW9kZWwKKwkJZm9yKE1vZGVsIG06bW9kZWwuZ2V0TW9kZWxzKCkpIHsKKwkJCWJvb2xlYW4gbW9kaWZpZWQgPSBjaGVja01vZGVsRGVjb3JhdG9ycyhtLCBtb2RpZmllZFVSSSk7CisJCQlpZihtb2RpZmllZCkgcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tTY2VuYXJpb0RlY29yYXRvcnMoU2NlbmFyaW8gc2NlbmFyaW8sIFVSSSBtb2RpZmllZFVSSSkgeworCQlNb2RlbCBtID0gc2NlbmFyaW8uZ2V0TW9kZWwoKTsKKwkJaWYobSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJCWJvb2xlYW4gbW9kaWZpZWQgPSAgY2hlY2tNb2RlbERlY29yYXRvcnMobSwgbW9kaWZpZWRVUkkpOworCQlpZihtb2RpZmllZCkgcmV0dXJuIHRydWU7CisJCS8vIENoZWNrIHNjZW5hcmlvIGRlY29yYXRvcgorCQlmb3IoRGVjb3JhdG9yIGQ6c2NlbmFyaW8uZ2V0U2NlbmFyaW9EZWNvcmF0b3JzKCkpIAorCQkJaWYoZC5nZXRVUkkoKS5sYXN0U2VnbWVudCgpLmVxdWFscyhtb2RpZmllZFVSSS5sYXN0U2VnbWVudCgpKSkgcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIGNoZWNrTW9kZWxHcmFwaHMoTW9kZWwgbW9kZWwsIFVSSSBtb2RpZmllZFVSSSkgeworCQlpZihtb2RlbCA9PSBudWxsIHx8IG1vZGlmaWVkVVJJID09IG51bGwpIAorCQkJQ29yZVBsdWdpbi5sb2dFcnJvcigiTnVsbCBtb2RlbCBvciB1cmkiLCBuZXcgRXhjZXB0aW9uKCkpOworCQkKKwkJZm9yKEdyYXBoIGc6bW9kZWwuZ2V0R3JhcGhzKCkpCisJCQlpZihnLmdldFVSSSgpLmxhc3RTZWdtZW50KCkuZXF1YWxzKG1vZGlmaWVkVVJJLmxhc3RTZWdtZW50KCkpKSByZXR1cm4gdHJ1ZTsKKwkJCisJCS8vIENoZWNrIHN1YiBtb2RlbAorCQlmb3IoTW9kZWwgbTptb2RlbC5nZXRNb2RlbHMoKSkgeworCQkJYm9vbGVhbiBtb2RpZmllZCA9IGNoZWNrTW9kZWxHcmFwaHMobSwgbW9kaWZpZWRVUkkpOworCQkJaWYobW9kaWZpZWQpIHJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkKKwlwcml2YXRlIFN0cmluZyBnZXRQcm9qZWN0KFVSSSB1cmkpIHsKKwkJaWYoIXVyaS50b1N0cmluZygpLnN0YXJ0c1dpdGgoInBsYXRmb3JtOi9yZXNvdXJjZSIpKSByZXR1cm4gbnVsbDsKKworCQlTdHJpbmcgczEgPSB1cmkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMTkpOyAvLyAicGxhdGZvcm06L3Jlc291cmNlIgorCQlpbnQgaXMgPSBzMS5pbmRleE9mKCIvIik7CisJCVN0cmluZyBwcm9qZWN0ID0gczEuc3Vic3RyaW5nKDAsIGlzKTsgCisJCXJldHVybiBwcm9qZWN0OworCX0KKwkKKwlwcml2YXRlIFN0cmluZyBnZXRUeXBlKFVSSSB1cmkpIHsKKwkJaWYoIXVyaS50b1N0cmluZygpLnN0YXJ0c1dpdGgoInBsYXRmb3JtOi9yZXNvdXJjZSIpKSByZXR1cm4gbnVsbDsKKworCQlTdHJpbmcgczEgPSB1cmkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMTkpOyAvLyAicGxhdGZvcm06L3Jlc291cmNlIgorCQlpbnQgaXMgPSBzMS5pbmRleE9mKCIvIik7CisJCVN0cmluZyBfcHJvamVjdCA9IHMxLnN1YnN0cmluZyhpcysxKTsKKwkJaW50IGlzMiA9IF9wcm9qZWN0LmluZGV4T2YoIi8iKTsKKwkJaWYoaXMyID09IC0xKSByZXR1cm4gIiI7IC8vIG5vIHR5cGUKKwkJU3RyaW5nIHR5cGUgPSBfcHJvamVjdC5zdWJzdHJpbmcoMCwgaXMyKTsKKwkJcmV0dXJuIHR5cGU7CisJfQorfSAvLyBJZGVudGlmaWFibGVDb250ZW50UHJvdmlkZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvSWRlbnRpZmlhYmxlRHJvcEFkYXB0ZXJBc3Npc3RhbnQuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvSWRlbnRpZmlhYmxlRHJvcEFkYXB0ZXJBc3Npc3RhbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWNhMzIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9JZGVudGlmaWFibGVEcm9wQWRhcHRlckFzc2lzdGFudC5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvLyBJZGVudGlmaWFibGVEcm9wQWRhcHRlckFzc2lzdGFudC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTG9jYWxTZWxlY3Rpb25UcmFuc2ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5VdGlsaXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5LkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uRHJvcEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkRyb3BBZGFwdGVyQXNzaXN0YW50OworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cworICovCitwdWJsaWMgY2xhc3MgSWRlbnRpZmlhYmxlRHJvcEFkYXB0ZXJBc3Npc3RhbnQgZXh0ZW5kcyBDb21tb25Ecm9wQWRhcHRlckFzc2lzdGFudCB7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25Ecm9wQWRhcHRlckFzc2lzdGFudCNpc1N1cHBvcnRlZFR5cGUob3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGEpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWRUeXBlKFRyYW5zZmVyRGF0YSB0cmFuc2ZlclR5cGUpIHsKKwkJZmluYWwgYm9vbGVhbiByZXRWYWx1ZSA9IExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKQorCQkJCS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkRyb3BBZGFwdGVyQXNzaXN0YW50I2hhbmRsZURyb3Aob3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkRyb3BBZGFwdGVyLAorCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQsIGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElTdGF0dXMgaGFuZGxlRHJvcChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29tbW9uRHJvcEFkYXB0ZXIgZHJvcEFkYXB0ZXIsCisJCQlEcm9wVGFyZ2V0RXZlbnQgZXZlbnQsIE9iamVjdCB0YXJnZXQpIHsKKwkJSVN0YXR1cyByZXRWYWx1ZSA9IFN0YXR1cy5DQU5DRUxfU1RBVFVTOworCQkvLyBTdHJ1Y3R1cmVkIFNlbGVjdGlvbj8KKwkJaWYgKGV2ZW50LmRhdGEgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJLy8gWWVzCisJCQlmb3IgKE9iamVjdCBvYmogOiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5kYXRhKS50b0xpc3QoKSkgeworCQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQkJLy8gWWVzCisJCQkJCS8vIFRoZXNlIGFyZSBVUkkncyBmcm9tIElkZW50aWZhYmxlUGx1Z2luVmlldworCQkJCQlmaW5hbCBTdHJpbmcgdXJpU3RyaW5nID0gKFN0cmluZykgb2JqOworCQkJCQl0cnkgeworCQkJCQkJLy8gV2UncmUgZ29pbmcgdG8gZGVzZXJpYWxpemVkIHRoZSBJZGVudGlmaWFibGUsIGNoYW5nZQorCQkJCQkJLy8gaXQncyBVUkkgYW5kIHRoZW4gc2VyaWFsaXplIGl0IGFnYWluIGluIHRoZSBuZXcKKwkJCQkJCS8vIGxvY2F0aW9uLgorCQkJCQkJZmluYWwgVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpU3RyaW5nKTsKKwkJCQkJCWZpbmFsIElkZW50aWZpYWJsZSBpZGVudGlmYWJsZSA9IFV0aWxpdHkKKwkJCQkJCQkJLmdldElkZW50aWZpYWJsZSh1cmkpOworCQkJCQkJZmluYWwgRHVibGluQ29yZSBkYyA9IGlkZW50aWZhYmxlLmdldER1YmxpbkNvcmUoKTsKKwkJCQkJCWZpbmFsIFVSSSBzZXJpYWxpemF0aW9uVVJJID0gY3JlYXRlU2VyaWFsaXphdGlvblVSSSgKKwkJCQkJCQkJdXJpLCAoSWRlbnRpZmlhYmxlVHJlZU5vZGUpIHRhcmdldCk7CisJCQkJCQlpZGVudGlmYWJsZS5zZXRVUkkoc2VyaWFsaXphdGlvblVSSSk7CisJCQkJCQlkYy5zZXRUaXRsZSgiQ29weSBvZiBcIiIgKyBkYy5nZXRUaXRsZSgpICsgIlwiIik7CisJCQkJCQlkYy5zZXREZXNjcmlwdGlvbigiQ29weSBvZiBcIiIgKyBkYy5nZXREZXNjcmlwdGlvbigpCisJCQkJCQkJCSsgIlwiIik7CisJCQkJCQlkYy5wb3B1bGF0ZSgpOworCQkJCQkJVXRpbGl0eS5zZXJpYWxpemVJZGVudGlmaWFibGUoaWRlbnRpZmFibGUsCisJCQkJCQkJCXNlcmlhbGl6YXRpb25VUkkpOworCQkJCQkJcmV0VmFsdWUgPSBTdGF0dXMuT0tfU1RBVFVTOworCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKAorCQkJCQkJCQkiUHJvYmxlbSBkZXNlcmlhbGl6aW5nIElkZW50aWZpYWJsZSBmcm9tIFwiIgorCQkJCQkJCQkJCSsgdXJpU3RyaW5nICsgIlwiIiwgZSk7CisJCQkJCX0KKwkJCQl9IC8vIGlmCisJCQl9IC8vIGZvciBlYWNoIE9iamVjdAorCQl9IC8vIGlmIElTdHJ1Y3R1cmVkU2VsZWN0aW9uCisKKwkJLy8gTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLnNldFNlbGVjdGlvbihudWxsKTsKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gaGFuZGxlRHJvcAorCisJcHJpdmF0ZSBVUkkgY3JlYXRlU2VyaWFsaXphdGlvblVSSShVUkkgdXJpLCBJZGVudGlmaWFibGVUcmVlTm9kZSB0cmVlTm9kZSkgeworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIodHJlZU5vZGUuZ2V0UHJvamVjdCgpCisJCQkJLmdldE5hbWUoKSk7CisJCXNiLmFwcGVuZCgiLyIpOworCQlzYi5hcHBlbmQodHJlZU5vZGUuZ2V0Rm9sZGVyTmFtZSgpKTsKKwkJc2IuYXBwZW5kKCIvIik7CisJCXNiLmFwcGVuZCh1cmkuc2VnbWVudCh1cmkuc2VnbWVudENvdW50KCkgLSAxKSk7CisJCXJldHVybiBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShzYi50b1N0cmluZygpLCBmYWxzZSk7CisJfSAvLyBjcmVhdGVTZXJpYWxpemF0aW9uVVJJCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25Ecm9wQWRhcHRlckFzc2lzdGFudCN2YWxpZGF0ZURyb3AoamF2YS5sYW5nLk9iamVjdCwKKwkgKiAgICAgIGludCwgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGEpCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIAorCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlRHJvcChPYmplY3QgdGFyZ2V0LCBpbnQgb3BlcmF0aW9uLAorCQkJVHJhbnNmZXJEYXRhIHRyYW5zZmVyVHlwZSkgeworCQkvLyBJU3RhdHVzIHJldFZhbHVlID0gU3RhdHVzLkNBTkNFTF9TVEFUVVM7CisJCS8vCisJCS8vIGlmIChMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuZXF1YWxzKHRyYW5zZmVyVHlwZSkpIHsKKwkJLy8gLy8gWWVzCisJCS8vIHJldFZhbHVlID0gU3RhdHVzLk9LX1NUQVRVUzsKKwkJLy8gfSAvLyBpZgorCQkvLyBlbHNlIGlmIChMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkuZXF1YWxzKHRyYW5zZmVyVHlwZSkpIHsKKwkJLy8gLy8gWWVzCisJCS8vIHJldFZhbHVlID0gU3RhdHVzLk9LX1NUQVRVUzsKKwkJLy8gfSAvLyBpZgorCQkvLworCQkvLyByZXR1cm4gcmV0VmFsdWU7CisJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCX0gLy8gdmFsaWRhdGVEcm9wCisKK30gLy8gSWRlbnRpZmlhYmxlRHJvcEFkYXB0ZXJBc3Npc3RhbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL0lkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MjBhNDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL0lkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGUuamF2YQpAQCAtMCwwICsxLDczIEBACisvLyBJZGVudGlmaWFibGVJbnN0YW5jZVRyZWVOb2RlLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3JlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZX1zIGluCisgKiB0aGUgU1RFTSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgdGhhdCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUKKyAqIHtAbGluayBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uTmF2aWdhdG9yfSBmcmFtZXdvcmsuIEFuIGluc3RhbmNlCisgKiB0eXBpY2FsbHkgc2VydmVzIGFzIGEgcHJveHkgZm9yIHRoZSBmaWxlIHRoYXQgc2VyaWFsaXplcyB0aGUKKyAqIHtAbGluayBJZGVudGlmaWFibGV9LgorICogCisgKiBAc2VlIElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGVDb250ZW50UHJvdmlkZXIKKyAqIEBzZWUgSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZUxhYmVsUHJvdmlkZXIKKyAqLworcHVibGljIGNsYXNzIElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGUgeworCisJcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWFibGVUcmVlTm9kZSBwYXJlbnQ7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBleHRlbnNpb247CisKKwkvKioKKwkgKiBAcGFyYW0gaXRuCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gZXh0ZW5zaW9uCisJICogCQl0aGUgZmlsZSBuYW1lIGV4dGVuc2lvbiBvZiB0aGUgc2VyaWFsaXplZCBmaWxlLgorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGVJbnN0YW5jZVRyZWVOb2RlKElkZW50aWZpYWJsZVRyZWVOb2RlIGl0biwgU3RyaW5nIG5hbWUsCisJCQlTdHJpbmcgZXh0ZW5zaW9uKSB7CisJCXRoaXMucGFyZW50ID0gaXRuOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmV4dGVuc2lvbiA9IGV4dGVuc2lvbjsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlVHJlZU5vZGV9IHRoYXQgaXMgdGhlIHBhcmVudCBvZiB0aGlzIG5vZGUuCisJICovCisJcHVibGljIGZpbmFsIElkZW50aWZpYWJsZVRyZWVOb2RlIGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIHBhcmVudDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuYW1lCisJICovCisJcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGV4dGVuc2lvbgorCSAqLworCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgeworCQlyZXR1cm4gZXh0ZW5zaW9uOworCX0KKworfSAvLyBJZGVudGlmaWFibGVJbnN0YW5jZVRyZWVOb2RlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9JZGVudGlmaWFibGVJbnN0YW5jZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL0lkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGVDb250ZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmNhZTlkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9JZGVudGlmaWFibGVJbnN0YW5jZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8vIElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGVDb250ZW50UHJvdmlkZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uTmF2aWdhdG9yOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgSVRyZWVDb250ZW50UHJvdmlkZXJ9IGZvcgorICoge0BsaW5rIElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGV9cyB3aGljaCBhcHBlYXIgaW4gdGhlCisgKiB7QGxpbmsgQ29tbW9uTmF2aWdhdG9yfSBmcmFtZXdvcmsgdGhhdCBpcyB1c2VkIHRvIGV4cGxvcmUgU1RFTSBQcm9qZWN0cy4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCitwdWJsaWMgY2xhc3MgSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzCisJCUlUcmVlQ29udGVudFByb3ZpZGVyLCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKKworCVZpZXdlciB2aWV3ZXI7CisKKwkvKioKKwkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisJICovCisJcHVibGljIElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGVDb250ZW50UHJvdmlkZXIoKSB7CisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMsCisJCQkJSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOworCX0gLy8gSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZUNvbnRlbnRQcm92aWRlcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy4KKwkgKiAgICAgIE9iamVjdCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oZmluYWwgT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKKwkJT2JqZWN0W10gcmV0VmFsdWUgPSBudWxsOworCQkvLyBSaWdodCBraW5kIG9mIHBhcmVudD8KKwkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJZGVudGlmaWFibGVUcmVlTm9kZSkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBMaXN0PElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGU+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGU+KCk7CisJCQkKKwkJCWZpbmFsIElkZW50aWZpYWJsZVRyZWVOb2RlIGl0biA9IChJZGVudGlmaWFibGVUcmVlTm9kZSkgcGFyZW50RWxlbWVudDsKKworCQkJZmluYWwgSUZvbGRlciBmb2xkZXIgPSBpdG4uZ2V0UHJvamVjdCgpLmdldEZvbGRlcigKKwkJCQkJaXRuLmdldEZvbGRlck5hbWUoKSk7CisJCQkKKwkJCS8vIERvZXMgdGhlIGZvbGRlciBleGlzdD8KKwkJCWlmIChmb2xkZXIuZXhpc3RzKCkpIHsKKwkJCQkvLyBZZXMKKwkJCQl0cnkgeworCQkJCQlmb3IgKGZpbmFsIElSZXNvdXJjZSBpZGVudGlmaWFibGVGaWxlIDogZm9sZGVyLm1lbWJlcnMoKSkgeworCQkJCQkJZmluYWwgU3RyaW5nIGlkZW50aWZpYWJsZU5hbWUgPSBpZGVudGlmaWFibGVGaWxlCisJCQkJCQkJCS5nZXROYW1lKCk7CisJCQkJCQlmaW5hbCBTdHJpbmcgZXh0ZW5zaW9uID0gaWRlbnRpZmlhYmxlRmlsZQorCQkJCQkJCQkuZ2V0RmlsZUV4dGVuc2lvbigpOworCQkJCQkJZmluYWwgU3RyaW5nIG5hbWVXaXRob3V0RXh0ZW5zaW9uID0gaWRlbnRpZmlhYmxlTmFtZQorCQkJCQkJCQkuc3Vic3RyaW5nKDAsIGlkZW50aWZpYWJsZU5hbWUKKwkJCQkJCQkJCQkubGFzdEluZGV4T2YoZXh0ZW5zaW9uKSAtIDEpOworCQkJCQkJdGVtcC5hZGQobmV3IElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGUoaXRuLAorCQkJCQkJCQluYW1lV2l0aG91dEV4dGVuc2lvbiwgZXh0ZW5zaW9uKSk7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChmaW5hbCBDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCIiLCBlKTsKKwkJCQl9IC8vIGZvciBlYWNoIElSZXNvdXJjZSBmb2xkZXIubWVtYmVycygpCisJCQl9IC8vIGlmIGZvbGRlciBleGlzdHMKKwkJCQorCQkJcmV0VmFsdWUgPSB0ZW1wLnRvQXJyYXkoKTsKKworCQl9IC8vIGlmIElkZW50aWZpYWJsZVRyZWVOb2RlCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0Q2hpbGRyZW4KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLgorCSAqICAgICAgT2JqZWN0KQorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KGZpbmFsIE9iamVjdCBlbGVtZW50KSB7CisJCU9iamVjdCByZXRWYWx1ZSA9IG51bGw7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZSkgeworCQkJcmV0VmFsdWUgPSAoKElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGUpIGVsZW1lbnQpLmdldFBhcmVudCgpOworCQl9IC8vIGlmIElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGUKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0UGFyZW50CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLgorCSAqICAgICAgT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKGZpbmFsIE9iamVjdCBwYXJlbnRFbGVtZW50KSB7CisJCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7CisJCXJldHVybiBjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDA7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEKKwkgKiAgICAgIC5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoZmluYWwgT2JqZWN0IGlucHV0RWxlbWVudCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuCisJICogICAgICBqZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoZmluYWwgVmlld2VyIHZpZXdlciwgZmluYWwgT2JqZWN0IG9sZElucHV0LAorCQkJZmluYWwgT2JqZWN0IG5ld0lucHV0KSB7CisJCXRoaXMudmlld2VyID0gdmlld2VyOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZworCSAqICAgICAgLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKGZpbmFsIElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCXRyeSB7CisJCQlldmVudC5nZXREZWx0YSgpLmFjY2VwdCh0aGlzKTsKKwkJfSBjYXRjaCAoZmluYWwgQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIiIsIGUpOworCQl9CisJfSAvLyByZXNvdXJjZUNoYW5nZWQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNvcmUKKwkgKiAgICAgIC5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7CisJCS8vIElzIHRoZSBkaXNwbGF5IHZhbGlkPworCQlpZiAoZGlzcGxheSAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCXZpZXdlci5yZWZyZXNoKCk7CisJCQkJfQorCQkJfSk7CisJCX0gLy8gaWYKKworCQlyZXR1cm4gdHJ1ZTsKKwl9IC8vIHZpc2l0CisKK30gLy8gSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZUNvbnRlbnRQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZUxhYmVsUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZUxhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjIxY2ZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9JZGVudGlmaWFibGVJbnN0YW5jZVRyZWVOb2RlTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8vIElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3JlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBJTGFiZWxQcm92aWRlcn0gZm9yCisgKiB7QGxpbmsgSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZX1zIHdoaWNoIGFwcGVhciBpbiB0aGUKKyAqIHtAbGluayBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uTmF2aWdhdG9yfSBmcmFtZXdvcmsgdGhhdCBpcyB1c2VkIHRvCisgKiBleHBsb3JlIFNURU0gUHJvamVjdHMuCisgKiAKKyAqIEBzZWUgSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZUNvbnRlbnRQcm92aWRlcgorICovCitwdWJsaWMgY2xhc3MgSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cworCQlJTGFiZWxQcm92aWRlciB7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKKwkJSW1hZ2UgcmV0VmFsdWUgPSBudWxsOworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGUpIHsKKwkJCS8vIFllcworCQkJZmluYWwgSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZSBpaXRuID0gKElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGUpIGVsZW1lbnQ7CisKKwkJCXJldFZhbHVlID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KAorCQkJCQlpaXRuLmdldFBhcmVudCgpLmdldEltYWdlS2V5KCkpOworCisJCX0gLy8gaWYgSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRJbWFnZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJU3RyaW5nIHJldFZhbHVlID0gbnVsbDsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJZGVudGlmaWFibGVJbnN0YW5jZVRyZWVOb2RlKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGUgaWl0biA9IChJZGVudGlmaWFibGVJbnN0YW5jZVRyZWVOb2RlKSBlbGVtZW50OworCQkJcmV0VmFsdWUgPSBpaXRuLmdldE5hbWUoKTsKKwkJfSAvLyBpZiBJZGVudGlmaWFibGVJbnN0YW5jZVRyZWVOb2RlCisJCXJldHVybiByZXRWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlCisJICogCW9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLgorCSAqIAlqZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCisJICovCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQkvLyBOb3RoaW5nCisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkvLyBOb3RoaW5nCisJfQorCisJLyoqCisJICogQHNlZQorCSAqIAlvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nCisJICogCS5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgZWxlbWVudCwKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmcgcHJvcGVydHkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIEBzZWUKKwkgKiAJb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UKKwkgKiAJLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcigKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKK30gLy8gSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZUxhYmVsUHJvdmlkZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL0lkZW50aWZpYWJsZVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL0lkZW50aWZpYWJsZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiOTdlZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvSWRlbnRpZmlhYmxlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgSWRlbnRpZmlhYmxlUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciwKKwkJSVRyZWVDb250ZW50UHJvdmlkZXIgeworCisJLyoqCisJICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGVQcm92aWRlcigpIHsKKwkJLy8gTm90aGluZworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CisJCS8vIFRyZWUgU2VsZWN0aW9uPworCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVRyZWVTZWxlY3Rpb24pIHsKKwkJCUlUcmVlU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVHJlZVNlbGVjdGlvbikgb2JqZWN0OworCQkJb2JqZWN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOworCQl9CisJCUlJdGVtTGFiZWxQcm92aWRlciAgaXQgPSBnZXRMYWJlbFByb3ZpZGVyKG9iamVjdCk7CisJCQorCQkvLyBEaWQgd2UgZmluZCB0aGUgcHJvdmlkZXI/CisJCWlmIChpdCAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCU9iamVjdCB0ZW1wID0gaXQuZ2V0SW1hZ2Uob2JqZWN0KTsKKwkJCXJldHVybiAodGVtcCBpbnN0YW5jZW9mIEltYWdlKSA/IChJbWFnZSl0ZW1wIDogZ2V0SW1hZ2VGcm9tT2JqZWN0KHRlbXApOworCQl9CisJCXJldHVybiBudWxsOworCQkKKwl9IC8vIGdldEltYWdlCisKKwkgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlRnJvbU9iamVjdChPYmplY3Qgb2JqZWN0KQorCSAgeworCSAgICByZXR1cm4gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2Uob2JqZWN0KTsKKwkgIH0KKwkgCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJLy8gVHJlZSBTZWxlY3Rpb24/CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVRyZWVTZWxlY3Rpb24pIHsKKwkJCUlUcmVlU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVHJlZVNlbGVjdGlvbikgZWxlbWVudDsKKwkJCWVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7CisJCX0KKwkJT2JqZWN0IG9iaiA9IGdldExhYmVsUHJvdmlkZXIoZWxlbWVudCk7CisJCVN0cmluZyB0ZW1wID0gKChJSXRlbUxhYmVsUHJvdmlkZXIpb2JqKS5nZXRUZXh0KGVsZW1lbnQpOworCQlyZXR1cm4gdGVtcDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKKwkJZmluYWwgQ29sbGVjdGlvbjw/PiBjaGlsZHJlbiA9IGdldFRyZWVDb250ZW50UHJvdmlkZXIocGFyZW50RWxlbWVudCkuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7CisJCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7CisJCXJldHVybiBnZXRUcmVlQ29udGVudFByb3ZpZGVyKGVsZW1lbnQpLmdldFBhcmVudChlbGVtZW50KTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgeworCQlyZXR1cm4gZ2V0VHJlZUNvbnRlbnRQcm92aWRlcihlbGVtZW50KS5oYXNDaGlsZHJlbihlbGVtZW50KTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgeworCQlmaW5hbCBDb2xsZWN0aW9uPD8+IGVsZW1lbnRzID0gZ2V0VHJlZUNvbnRlbnRQcm92aWRlcihpbnB1dEVsZW1lbnQpLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7CisJCXJldHVybiBlbGVtZW50cy50b0FycmF5KCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlCisJICogICAgICAudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgIE9iamVjdCBuZXdJbnB1dCkgeworCQkvLyBOb3RoaW5nCisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS4KKwkgKiAgICAgIGpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcKKwkgKiAgICAgIC5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJLy8gTm90aGluZworCX0KKworCXByaXZhdGUgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKKwkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSByZXRWYWx1ZSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KAorCQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkuRGVzY3JpcHRvci5SZWdpc3RyeS5JTlNUQU5DRSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9CisKKwlwcml2YXRlIElJdGVtTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKGZpbmFsIE9iamVjdCBlbGVtZW50KSB7CisJCXJldHVybiAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBnZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGVsZW1lbnQsCisJCQkJSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKKwl9CisKKwlwcml2YXRlIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBnZXRUcmVlQ29udGVudFByb3ZpZGVyKGZpbmFsIE9iamVjdCBlbGVtZW50KSB7CisJCXJldHVybiAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBnZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGVsZW1lbnQsCisJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKwl9Cit9IC8vIElkZW50aWZpYWJsZVByb3ZpZGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL0lkZW50aWZpYWJsZVRyZWVOb2RlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL0lkZW50aWZpYWJsZVRyZWVOb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1MzZiMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvSWRlbnRpZmlhYmxlVHJlZU5vZGUuamF2YQpAQCAtMCwwICsxLDI4NyBAQAorLy8gSWRlbnRpZmlhYmxlVHJlZU5vZGUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuSVNoYXJlZEltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3U1RFTVByb2plY3RXaXphcmQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIGluIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbk5hdmlnYXRvcn0KKyAqIGJhc2VkIFNURU0gUHJvamVjdCBFeHBsb3JlciB2aWV3IHRvIHJlcHJlc2VudCBhIGdyb3VwIG9mIG9uZSB0eXBlIG9mCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGV9IGNvbXBvbmVudCAoZS5nLiwKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWx9LAorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaH0sCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcn0sCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvfSwKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlcn0gLAorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnR9LAorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJ9LAorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllcn0sCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGV9KSB0aGF0IGJlbG9uZyB0byBhCisgKiBwYXJ0aWN1bGFyIFNURU0gUHJvamVjdCBpbnN0YW5jZS4KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIElkZW50aWZpYWJsZVRyZWVOb2RlIHsKKworCXByaXZhdGUgZmluYWwgU3RyaW5nIGNvbXBvbmVudE5hbWU7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZm9sZGVyTmFtZTsKKwlwcml2YXRlIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaW1hZ2VLZXk7CisKKwkvKioKKwkgKiBAcGFyYW0gcHJvamVjdAorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBJUHJvamVjdH0gdGhhdCBpcyB0aGUgcGFyZW50IG9mIHRoaXMKKwkgKiAgICAgICAgICAgIHtAbGluayBJZGVudGlmaWFibGVUcmVlTm9kZX0uCisJICogQHBhcmFtIGNvbXBvbmVudE5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgKGUuZy4sICJTY2VuYXJpb3MiKQorCSAqIEBwYXJhbSBmb2xkZXJOYW1lCisJICogICAgICAgICAgICB0aGUgbm9uLU5MUydkIG5hbWUgb2YgdGhlIGZvbGRlciBpbiB0aGUgcHJvamVjdCB0aGF0CisJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGV9cyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhpcyBub2RlIGFyZQorCSAqICAgICAgICAgICAgc2VyaWFsaXplZCBpbi4KKwkgKiBAcGFyYW0gaW1hZ2VLZXkKKwkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdGhhdCBpcyB1c2VkIGFzIGEga2V5IGludG8gdGhlCisJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeX0gb2YgdGhlIHBsdWctaW4uCisJICovCisJcHVibGljIElkZW50aWZpYWJsZVRyZWVOb2RlKGZpbmFsIElQcm9qZWN0IHByb2plY3QsCisJCQlmaW5hbCBTdHJpbmcgY29tcG9uZW50TmFtZSwgU3RyaW5nIGZvbGRlck5hbWUsIFN0cmluZyBpbWFnZUtleSkgeworCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OworCQl0aGlzLmNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOworCQl0aGlzLmZvbGRlck5hbWUgPSBmb2xkZXJOYW1lOworCQl0aGlzLmltYWdlS2V5ID0gaW1hZ2VLZXk7CisJfSAvLyBJZGVudGlmaWFibGVUcmVlTm9kZQorCisJLyoqCisJICogQHJldHVybiB0aGUge0BsaW5rIElQcm9qZWN0fSBhc3NvY2lhdGVkIHdpdGggdGhlCisJICogICAgICAgICB7QGxpbmsgSWRlbnRpZmlhYmxlVHJlZU5vZGV9IGluc3RhbmNlLiAqCisJICovCisJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7CisJCXJldHVybiBwcm9qZWN0OworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpIHsKKwkJcmV0dXJuIGNvbXBvbmVudE5hbWU7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgbm9uLU5MUydkIG5hbWUgb2YgdGhlIGZvbGRlciBpbiB0aGUgcHJvamVjdCB0aGF0CisJICogICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGV9cyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhpcyBub2RlIGFyZSBzZXJpYWxpemVkCisJICogICAgICAgICBpbi4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEZvbGRlck5hbWUoKSB7CisJCXJldHVybiBmb2xkZXJOYW1lOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGtleSB1c2VkIHRvIGZpbmQgYW4gaW1hZ2UgZm9yIHRoZSBjb21wb25lbnQgaW4gdGhlIHNoYXJlZAorCSAqICAgICAgICAgaW1hZ2UgcmVnaXN0cnkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEltYWdlS2V5KCkgeworCQlyZXR1cm4gaW1hZ2VLZXk7CisJfQorCisJLyoqCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoY29tcG9uZW50TmFtZSk7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0gLy8gdG9TdHJpbmcKKworCS8qKgorCSAqIGhhc2hDb2RlLiBPdmVycmlkZSB0byBmaXggbmF2aWdhdG9yIHByb2JsZW0uIFRoZSBuYXZpZ2F0b3IgaW4gZWNsaXBzZSBzdG9yZXMgdGhlIHRyZWUgbm9kZXMKKwkgKiBpbiBhIGhhc2ggdGFibGUgYW5kIHdlIG5lZWQgdG8gb3ZlcnJpZGUgaGFzaENvZGUgYW5kIGVxdWFscyB0byBtYWtlIHN1cmUgdGhleSBjYW4gYmUKKwkgKiBmb3VuZC4gQSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sZGVyIG5hbWUgYW5kIHRoZSBwcm9qZWN0IG5hbWUgaXMgdW5pcXVlIHdpdGhpbiBTVEVNLgorCSAqLworCQorCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBmb2xkZXJOYW1lLmhhc2hDb2RlKClecHJvamVjdC5nZXROYW1lKCkuaGFzaENvZGUoKTsgLy8gWE9SCisJfQorCQorCS8qKgorCSAqIGVxdWFscy4gT3ZlcnJpZGUgdG8gZml4IG5hdmlnYXRvciBwcm9ibGVtCisJICovCisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisJCWlmKCEobyBpbnN0YW5jZW9mIElkZW50aWZpYWJsZVRyZWVOb2RlKSkgcmV0dXJuIGZhbHNlOworCQkKKwkJcmV0dXJuICgoKElkZW50aWZpYWJsZVRyZWVOb2RlKW8pLmdldEZvbGRlck5hbWUoKS5lcXVhbHModGhpcy5mb2xkZXJOYW1lKSAmJgorCQkJCSgoSWRlbnRpZmlhYmxlVHJlZU5vZGUpbykuZ2V0UHJvamVjdCgpLmdldE5hbWUoKS5lcXVhbHModGhpcy5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKSk7CisJfQorCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgSWRlbnRpZmlhYmxlVHJlZU5vZGV9IHRoYXQgcmVwcmVzZW50cworCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yfXMuCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBEZWNvcmF0b3JzVHJlZU5vZGUgZXh0ZW5kcyBJZGVudGlmaWFibGVUcmVlTm9kZSB7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBwcm9qZWN0CisJCSAqICAgICAgICAgICAgdGhlIHtAbGluayBJUHJvamVjdH0gdGhhdCBpcyB0aGUgcGFyZW50IG9mIHRoaXMKKwkJICogICAgICAgICAgICB7QGxpbmsgSWRlbnRpZmlhYmxlVHJlZU5vZGV9LgorCQkgKi8KKwkJcHVibGljIERlY29yYXRvcnNUcmVlTm9kZShJUHJvamVjdCBwcm9qZWN0KSB7CisJCQlzdXBlcihwcm9qZWN0LCBNZXNzYWdlcy5nZXRTdHJpbmcoIkVYUExPUkVSLkRFQ09SQVRPUl9GT0xERVIiKSwKKwkJCQkJTmV3U1RFTVByb2plY3RXaXphcmQuREVDT1JBVE9SU19GT0xERVJfTkFNRSwKKwkJCQkJb3JnLmVjbGlwc2Uuc3RlbS51aS5JU2hhcmVkSW1hZ2VzLkRFQ09SQVRPUl9GT0xERVJfSUNPTik7CisJCX0KKwl9IC8vIERlY29yYXRvcnNUcmVlTm9kZQorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBJZGVudGlmaWFibGVUcmVlTm9kZX0gdGhhdCByZXByZXNlbnRzCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb31zLgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2NlbmFyaW9zVHJlZU5vZGUgZXh0ZW5kcyBJZGVudGlmaWFibGVUcmVlTm9kZSB7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBwcm9qZWN0CisJCSAqICAgICAgICAgICAgdGhlIHtAbGluayBJUHJvamVjdH0gdGhhdCBpcyB0aGUgcGFyZW50IG9mIHRoaXMKKwkJICogICAgICAgICAgICB7QGxpbmsgSWRlbnRpZmlhYmxlVHJlZU5vZGV9LgorCQkgKi8KKwkJcHVibGljIFNjZW5hcmlvc1RyZWVOb2RlKElQcm9qZWN0IHByb2plY3QpIHsKKwkJCXN1cGVyKHByb2plY3QsIE1lc3NhZ2VzLmdldFN0cmluZygiRVhQTE9SRVIuU0NFTkFSSU9fRk9MREVSIiksCisJCQkJCU5ld1NURU1Qcm9qZWN0V2l6YXJkLlNDRUFOQVJJT1NfRk9MREVSX05BTUUsCisJCQkJCW9yZy5lY2xpcHNlLnN0ZW0udWkuSVNoYXJlZEltYWdlcy5TQ0VOQVJJT19GT0xERVJfSUNPTik7CisJCX0KKwl9IC8vIFNjZW5hcmlvc1RyZWVOb2RlCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIElkZW50aWZpYWJsZVRyZWVOb2RlfSB0aGF0IHJlcHJlc2VudHMKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudH1zLgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgRXhwZXJpbWVudHNUcmVlTm9kZSBleHRlbmRzIElkZW50aWZpYWJsZVRyZWVOb2RlIHsKKworCQkvKioKKwkJICogQHBhcmFtIHByb2plY3QKKwkJICogICAgICAgICAgICB0aGUge0BsaW5rIElQcm9qZWN0fSB0aGF0IGlzIHRoZSBwYXJlbnQgb2YgdGhpcworCQkgKiAgICAgICAgICAgIHtAbGluayBJZGVudGlmaWFibGVUcmVlTm9kZX0uCisJCSAqLworCQlwdWJsaWMgRXhwZXJpbWVudHNUcmVlTm9kZShJUHJvamVjdCBwcm9qZWN0KSB7CisJCQlzdXBlcihwcm9qZWN0LCBNZXNzYWdlcy5nZXRTdHJpbmcoIkVYUExPUkVSLkVYUEVSSU1FTlRfRk9MREVSIiksCisJCQkJCU5ld1NURU1Qcm9qZWN0V2l6YXJkLkVYUEVSSU1FTlRTX0ZPTERFUl9OQU1FLAorCQkJCQlvcmcuZWNsaXBzZS5zdGVtLnVpLklTaGFyZWRJbWFnZXMuRVhQRVJJTUVOVF9GT0xERVJfSUNPTik7CisJCX0KKwl9IC8vIEV4cGVyaW1lbnRzVHJlZU5vZGUKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgSWRlbnRpZmlhYmxlVHJlZU5vZGV9IHRoYXQgcmVwcmVzZW50cworCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlcn1zLgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2VxdWVuY2Vyc1RyZWVOb2RlIGV4dGVuZHMgSWRlbnRpZmlhYmxlVHJlZU5vZGUgeworCisJCS8qKgorCQkgKiBAcGFyYW0gcHJvamVjdAorCQkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgSVByb2plY3R9IHRoYXQgaXMgdGhlIHBhcmVudCBvZiB0aGlzCisJCSAqICAgICAgICAgICAge0BsaW5rIElkZW50aWZpYWJsZVRyZWVOb2RlfS4KKwkJICovCisJCXB1YmxpYyBTZXF1ZW5jZXJzVHJlZU5vZGUoSVByb2plY3QgcHJvamVjdCkgeworCQkJc3VwZXIocHJvamVjdCwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJFWFBMT1JFUi5TRVFVRU5DRVJfRk9MREVSIiksCisJCQkJCU5ld1NURU1Qcm9qZWN0V2l6YXJkLlNFUVVFTkNFUlNfRk9MREVSX05BTUUsCisJCQkJCW9yZy5lY2xpcHNlLnN0ZW0udWkuSVNoYXJlZEltYWdlcy5TRVFVRU5DRVJfRk9MREVSX0lDT04pOworCQl9CisJfSAvLyBTZXF1ZW5jZXJzVHJlZU5vZGUKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgSWRlbnRpZmlhYmxlVHJlZU5vZGV9IHRoYXQgcmVwcmVzZW50cworCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWx9cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE1vZGVsc1RyZWVOb2RlIGV4dGVuZHMgSWRlbnRpZmlhYmxlVHJlZU5vZGUgeworCisJCS8qKgorCQkgKiBAcGFyYW0gcHJvamVjdAorCQkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgSVByb2plY3R9IHRoYXQgaXMgdGhlIHBhcmVudCBvZiB0aGlzCisJCSAqICAgICAgICAgICAge0BsaW5rIElkZW50aWZpYWJsZVRyZWVOb2RlfS4KKwkJICovCisJCXB1YmxpYyBNb2RlbHNUcmVlTm9kZShJUHJvamVjdCBwcm9qZWN0KSB7CisJCQlzdXBlcihwcm9qZWN0LCBNZXNzYWdlcy5nZXRTdHJpbmcoIkVYUExPUkVSLk1PREVMX0ZPTERFUiIpLCAKKwkJCQkJTmV3U1RFTVByb2plY3RXaXphcmQuTU9ERUxTX0ZPTERFUl9OQU1FLAorCQkJCQlvcmcuZWNsaXBzZS5zdGVtLnVpLklTaGFyZWRJbWFnZXMuTU9ERUxfRk9MREVSX0lDT04pOworCQl9CisJfSAvLyBNb2RlbHNUcmVlTm9kZQorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBJZGVudGlmaWFibGVUcmVlTm9kZX0gdGhhdCByZXByZXNlbnRzCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaH1zLgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgR3JhcGhzVHJlZU5vZGUgZXh0ZW5kcyBJZGVudGlmaWFibGVUcmVlTm9kZSB7CisKKwkJLyoqCisJCSAqIEBwYXJhbSBwcm9qZWN0CisJCSAqICAgICAgICAgICAgdGhlIHtAbGluayBJUHJvamVjdH0gdGhhdCBpcyB0aGUgcGFyZW50IG9mIHRoaXMKKwkJICogICAgICAgICAgICB7QGxpbmsgSWRlbnRpZmlhYmxlVHJlZU5vZGV9LgorCQkgKi8KKwkJcHVibGljIEdyYXBoc1RyZWVOb2RlKElQcm9qZWN0IHByb2plY3QpIHsKKwkJCXN1cGVyKHByb2plY3QsIE1lc3NhZ2VzLmdldFN0cmluZygiRVhQTE9SRVIuR1JBUEhfRk9MREVSIiksIAorCQkJCQlOZXdTVEVNUHJvamVjdFdpemFyZC5HUkFQSFNfRk9MREVSX05BTUUsCisJCQkJCW9yZy5lY2xpcHNlLnN0ZW0udWkuSVNoYXJlZEltYWdlcy5HUkFQSF9GT0xERVJfSUNPTik7CisJCX0KKwl9IC8vIEdyYXBoc1RyZWVOb2RlCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIElkZW50aWZpYWJsZVRyZWVOb2RlfSB0aGF0IHJlcHJlc2VudHMKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnRyaWdnZXIuVHJpZ2dlcn1zLgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgVHJpZ2dlcnNUcmVlTm9kZSBleHRlbmRzIElkZW50aWZpYWJsZVRyZWVOb2RlIHsKKworCQkvKioKKwkJICogQHBhcmFtIHByb2plY3QKKwkJICogICAgICAgICAgICB0aGUge0BsaW5rIElQcm9qZWN0fSB0aGF0IGlzIHRoZSBwYXJlbnQgb2YgdGhpcworCQkgKiAgICAgICAgICAgIHtAbGluayBJZGVudGlmaWFibGVUcmVlTm9kZX0uCisJCSAqLworCQlwdWJsaWMgVHJpZ2dlcnNUcmVlTm9kZShJUHJvamVjdCBwcm9qZWN0KSB7CisJCQlzdXBlcihwcm9qZWN0LCBNZXNzYWdlcy5nZXRTdHJpbmcoIkVYUExPUkVSLlRSSUdHRVJfRk9MREVSIiksIAorCQkJCQlOZXdTVEVNUHJvamVjdFdpemFyZC5UUklHR0VSU19GT0xERVJfTkFNRSwKKwkJCQkJb3JnLmVjbGlwc2Uuc3RlbS51aS5JU2hhcmVkSW1hZ2VzLlRSSUdHRVJfRk9MREVSX0lDT04pOworCQl9CisJfSAvLyBUcmlnZ2Vyc1RyZWVOb2RlCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIElkZW50aWZpYWJsZVRyZWVOb2RlfSB0aGF0IHJlcHJlc2VudHMKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGV9cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFByZWRpY2F0ZXNUcmVlTm9kZSBleHRlbmRzIElkZW50aWZpYWJsZVRyZWVOb2RlIHsKKwkKKwkJLyoqCisJCSAqIEBwYXJhbSBwcm9qZWN0CisJCSAqICAgICAgICAgICAgdGhlIHtAbGluayBJUHJvamVjdH0gdGhhdCBpcyB0aGUgcGFyZW50IG9mIHRoaXMKKwkJICogICAgICAgICAgICB7QGxpbmsgSWRlbnRpZmlhYmxlVHJlZU5vZGV9LgorCQkgKi8KKwkJcHVibGljIFByZWRpY2F0ZXNUcmVlTm9kZShJUHJvamVjdCBwcm9qZWN0KSB7CisJCQlzdXBlcihwcm9qZWN0LCBNZXNzYWdlcy5nZXRTdHJpbmcoIkVYUExPUkVSLlBSRURJQ0FURV9GT0xERVIiKSwgCisJCQkJCU5ld1NURU1Qcm9qZWN0V2l6YXJkLlBSRURJQ0FURVNfRk9MREVSX05BTUUsCisJCQkJCW9yZy5lY2xpcHNlLnN0ZW0udWkuSVNoYXJlZEltYWdlcy5QUkVESUNBVEVfRk9MREVSX0lDT04pOworCQl9CisJfSAvLyBQcmVkaWNhdGVzVHJlZU5vZGUKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgSWRlbnRpZmlhYmxlVHJlZU5vZGV9IHRoYXQgcmVwcmVzZW50cworCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJ9cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE1vZGlmaWVyc1RyZWVOb2RlIGV4dGVuZHMgSWRlbnRpZmlhYmxlVHJlZU5vZGUgeworCQkvKioKKwkJICogQHBhcmFtIHByb2plY3QKKwkJICogICAgICAgICAgICB0aGUge0BsaW5rIElQcm9qZWN0fSB0aGF0IGlzIHRoZSBwYXJlbnQgb2YgdGhpcworCQkgKiAgICAgICAgICAgIHtAbGluayBJZGVudGlmaWFibGVUcmVlTm9kZX0uCisJCSAqLworCQlwdWJsaWMgTW9kaWZpZXJzVHJlZU5vZGUoSVByb2plY3QgcHJvamVjdCkgeworCQkJc3VwZXIocHJvamVjdCwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJFWFBMT1JFUi5NT0RJRklFUl9GT0xERVIiKSwgCisJCQkJCU5ld1NURU1Qcm9qZWN0V2l6YXJkLk1PRElGSUVSU19GT0xERVJfTkFNRSwKKwkJCQkJb3JnLmVjbGlwc2Uuc3RlbS51aS5JU2hhcmVkSW1hZ2VzLk1PRElGSUVSX0ZPTERFUl9JQ09OKTsKKwkJfQorCX0gLy8gTW9kaWZpZXJzVHJlZU5vZGUKKworfSAvLyBJZGVudGlmaWFibGVUcmVlTm9kZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvSWRlbnRpZmlhYmxlVHJlZU5vZGVDb250ZW50UHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvSWRlbnRpZmlhYmxlVHJlZU5vZGVDb250ZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjAzMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9JZGVudGlmaWFibGVUcmVlTm9kZUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvLyBJZGVudGlmaWFibGVUcmVlTm9kZUNvbnRlbnRQcm92aWRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIElDb250ZW50UHJvdmlkZXJ9IGZvciB0aGUgY29udHJpYnV0aW9ucyB0byB0aGUKKyAqIG9yZy5lY2xpcHNlLnVpLG5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50cyBleHRlbnNpb24gcG9pbnQgdGhhdCByZXByZXNlbnQgdGhlCisgKiBjb21wb25lbnRzIG9mIHRoZSBTVEVNIG1vZGVsaW5nIGZyYW1ld29yay4gVGhlc2UgY29udHJpYnV0aW9ucyBhcmUgaW5zdGFuY2VzCisgKiBvZiB7QGxpbmsgSWRlbnRpZmlhYmxlVHJlZU5vZGV9IHdoaWNoIGFyZSB1c2VkIHRvIGFnZ3JlZ2F0ZSBpbnN0YW5jZXMgb2YgYQorICogc2luZ2xlIHR5cGUgb2YgY29tcG9uZW50IGluIGEgU1RFTSBwcm9qZWN0LiBGb3IgaW5zdGFuY2UsIGFsbCBvZiB0aGUKKyAqIHNlcmlhbGl6ZWQge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3J9IGluc3RhbmNlcywgb3IgYWxsIG9mCisgKiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb30gaW5zdGFuY2VzLgorICovCitwdWJsaWMgY2xhc3MgSWRlbnRpZmlhYmxlVHJlZU5vZGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cworCQlJVHJlZUNvbnRlbnRQcm92aWRlciB7CisKKwlwcm90ZWN0ZWQgT2JqZWN0IGlucHV0ID0gbnVsbDsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuCisJICogICAgICBPYmplY3QpCisJICovCisJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7CisJCU9iamVjdFtdIHJldFZhbHVlID0gbnVsbDsKKwkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgeworCQkJLy8gWWVzCisJCQlyZXRWYWx1ZSA9IG5ldyBPYmplY3RbXSB7CisJCQkJCW5ldyBJZGVudGlmaWFibGVUcmVlTm9kZS5TY2VuYXJpb3NUcmVlTm9kZSgKKwkJCQkJCQkoSVByb2plY3QpIHBhcmVudEVsZW1lbnQpLAorCisJCQkJCW5ldyBJZGVudGlmaWFibGVUcmVlTm9kZS5FeHBlcmltZW50c1RyZWVOb2RlKAorCQkJCQkJCShJUHJvamVjdCkgcGFyZW50RWxlbWVudCksCisKKwkJCQkJbmV3IElkZW50aWZpYWJsZVRyZWVOb2RlLlNlcXVlbmNlcnNUcmVlTm9kZSgKKwkJCQkJCQkoSVByb2plY3QpIHBhcmVudEVsZW1lbnQpLAorCisJCQkJCW5ldyBJZGVudGlmaWFibGVUcmVlTm9kZS5Nb2RlbHNUcmVlTm9kZSgKKwkJCQkJCQkoSVByb2plY3QpIHBhcmVudEVsZW1lbnQpLAorCisJCQkJCW5ldyBJZGVudGlmaWFibGVUcmVlTm9kZS5HcmFwaHNUcmVlTm9kZSgKKwkJCQkJCQkoSVByb2plY3QpIHBhcmVudEVsZW1lbnQpLAorCisJCQkJCW5ldyBJZGVudGlmaWFibGVUcmVlTm9kZS5EZWNvcmF0b3JzVHJlZU5vZGUoCisJCQkJCQkJKElQcm9qZWN0KSBwYXJlbnRFbGVtZW50KSwKKworCQkJCQluZXcgSWRlbnRpZmlhYmxlVHJlZU5vZGUuVHJpZ2dlcnNUcmVlTm9kZSgKKwkJCQkJCQkoSVByb2plY3QpIHBhcmVudEVsZW1lbnQpLAorCisJCQkJCW5ldyBJZGVudGlmaWFibGVUcmVlTm9kZS5QcmVkaWNhdGVzVHJlZU5vZGUoCisJCQkJCQkJKElQcm9qZWN0KSBwYXJlbnRFbGVtZW50KSwKKwkJCQkJCQkKKwkJCQkJbmV3IElkZW50aWZpYWJsZVRyZWVOb2RlLk1vZGlmaWVyc1RyZWVOb2RlKAorCQkJCQkJCQkJKElQcm9qZWN0KSBwYXJlbnRFbGVtZW50KQorCisJCQl9OyAvLyBuZXcgT2JqZWN0CisJCX0gLy8gaWYgSVByb2plY3QKKwkJZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElkZW50aWZpYWJsZVRyZWVOb2RlKSB7CisJCQkvLyBZZXMKKwkJCS8vIGZpbmFsIElkZW50aWZpYWJsZVRyZWVOb2RlIGN0biA9IChJZGVudGlmaWFibGVUcmVlTm9kZSkKKwkJCS8vIHBhcmVudEVsZW1lbnQ7CisJCQlyZXRWYWx1ZSA9IG5ldyBPYmplY3RbMF07IC8vIG5ldmVyIG51bGwKKworCQl9IC8vIGlmIElkZW50aWZpYWJsZVRyZWVOb2RlCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldENoaWxkcmVuCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy4KKwkgKiAgICAgIE9iamVjdCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgeworCQlPYmplY3QgcmV0VmFsdWUgPSBudWxsOworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElkZW50aWZpYWJsZVRyZWVOb2RlKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIElkZW50aWZpYWJsZVRyZWVOb2RlIGN0biA9IChJZGVudGlmaWFibGVUcmVlTm9kZSkgZWxlbWVudDsKKwkJCXJldFZhbHVlID0gY3RuLmdldFByb2plY3QoKTsKKwkJfSAvLyBpZiBJZGVudGlmaWFibGVUcmVlTm9kZQorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldFBhcmVudAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEKKwkgKiAgICAgIC5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgeworCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLgorCSAqICAgICAgT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgZWxlbWVudCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJLy8gTm90aGluZworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS4KKwkgKiAgICAgIGpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVmlld2VyIHZpZXdlciwKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworCQlpbnB1dCA9IG5ld0lucHV0OworCX0KKworfSAvLyBJZGVudGlmaWFibGVUcmVlTm9kZUNvbnRlbnRQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvSWRlbnRpZmlhYmxlVHJlZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL0lkZW50aWZpYWJsZVRyZWVOb2RlTGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4N2I0MGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL0lkZW50aWZpYWJsZVRyZWVOb2RlTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8vIElkZW50aWZpYWJsZVRyZWVOb2RlTGFiZWxQcm92aWRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4ge0BsaW5rIElMYWJlbFByb3ZpZGVyfSBmb3IgdGhlIGNvbnRyaWJ1dGlvbnMgdG8gdGhlCisgKiBvcmcuZWNsaXBzZS51aSxuYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudHMgZXh0ZW5zaW9uIHBvaW50IHRoYXQgcmVwcmVzZW50IHRoZQorICogY29tcG9uZW50cyBvZiB0aGUgU1RFTSBtb2RlbGluZyBmcmFtZXdvcmsuIFRoZXNlIGNvbnRyaWJ1dGlvbnMgYXJlIGluc3RhbmNlcworICogb2Yge0BsaW5rIElkZW50aWZpYWJsZVRyZWVOb2RlfSB3aGljaCBhcmUgdXNlZCB0byBhZ2dyZWdhdGUgaW5zdGFuY2VzIG9mIGEKKyAqIHNpbmdsZSB0eXBlIG9mIGNvbXBvbmVudCBpbiBhIFNURU0gcHJvamVjdC4gRm9yIGluc3RhbmNlLCBhbGwgb2YgdGhlCisgKiBzZXJpYWxpemVkIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yfSBpbnN0YW5jZXMsIG9yIGFsbCBvZgorICogdGhlIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW99IGluc3RhbmNlcy4KKyAqLworcHVibGljIGNsYXNzIElkZW50aWZpYWJsZVRyZWVOb2RlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgeworCQlJbWFnZSByZXRWYWx1ZSA9IG51bGw7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlVHJlZU5vZGUpIHsKKwkJCS8vIFllcworCQkJZmluYWwgSWRlbnRpZmlhYmxlVHJlZU5vZGUgY3RuID0gKElkZW50aWZpYWJsZVRyZWVOb2RlKSBlbGVtZW50OworCQkJcmV0VmFsdWUgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoCisJCQkJCWN0bi5nZXRJbWFnZUtleSgpKTsKKwkJfSAvLyBpZiBJZGVudGlmaWFibGVUcmVlTm9kZQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRJbWFnZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJcmV0dXJuICgoSWRlbnRpZmlhYmxlVHJlZU5vZGUpIGVsZW1lbnQpLmdldENvbXBvbmVudE5hbWUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlCisJICogCW9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLgorCSAqIAlqZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCisJICovCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQkvLyBOb3RoaW5nCisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkvLyBOb3RoaW5nCisJfQorCisJLyoqCisJICogQHNlZQorCSAqIAlvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nCisJICogCS5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgZWxlbWVudCwKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmcgcHJvcGVydHkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIEBzZWUKKwkgKiAJb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UKKwkgKiAJLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcigKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKK30gLy8gSWRlbnRpZmlhYmxlVHJlZU5vZGVMYWJlbFByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9NZXNzYWdlcy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9NZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMTMxYzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL01lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLy8gTWVzc2FnZXMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CisKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRoZSBSZXNvdXJjZSBCdW5kbGUgZm9yIHRoaXMgcGFja2FnZS4KKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSBDb25zdGFudHMuSURfUk9PVCArICIudWkudmlld3MuZXhwbG9yZXIubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOworCisJcHJpdmF0ZSBNZXNzYWdlcygpIHsKKwkJLy8gZW1wdHkKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0ga2V5CisJICogICAgICAgICAgICB0aGUga2V5IGZvciB0aGUgbWVzc2FnZQorCSAqIEByZXR1cm4gdGhlIHN0cmluZyB0aGF0IG1hdGNoZXMgdGhlIGtleQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7CisJCXRyeSB7CisJCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOworCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuICchJyArIGtleSArICchJzsKKwkJfQorCX0gLy8gZ2V0U3RyaW5nCit9IC8vIFdpemFyZE1lc3NhZ2VzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL1JlY29yZGVkSW5zdGFuY2VUcmVlTm9kZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9SZWNvcmRlZEluc3RhbmNlVHJlZU5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDY4MzFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9SZWNvcmRlZEluc3RhbmNlVHJlZU5vZGUuamF2YQpAQCAtMCwwICsxLDc2IEBACisvLyBSZWNvcmRlZEluc3RhbmNlVHJlZU5vZGUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gaW5zdGFuY2Ugb2YgYSByZWNvcmRlZAorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259LgorICovCitwdWJsaWMgY2xhc3MgUmVjb3JkZWRJbnN0YW5jZVRyZWVOb2RlIHsKKworCXByaXZhdGUgZmluYWwgUmVjb3JkZWRUcmVlTm9kZSBwYXJlbnQ7CisJcHJpdmF0ZSBmaW5hbCBSZWNvcmRlZEluc3RhbmNlVHJlZU5vZGUgaW5zdGFuY2VQYXJlbnQ7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gbmFtZQorCSAqLworCXB1YmxpYyBSZWNvcmRlZEluc3RhbmNlVHJlZU5vZGUoZmluYWwgUmVjb3JkZWRUcmVlTm9kZSBwYXJlbnQsCisJCQlmaW5hbCBTdHJpbmcgbmFtZSkgeworCQlzdXBlcigpOworCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5pbnN0YW5jZVBhcmVudCA9IG51bGw7CisJfQorCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBuYW1lCisJICovCisJcHVibGljIFJlY29yZGVkSW5zdGFuY2VUcmVlTm9kZShmaW5hbCBSZWNvcmRlZEluc3RhbmNlVHJlZU5vZGUgcGFyZW50LAorCQkJZmluYWwgU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5wYXJlbnQgPSBudWxsOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmluc3RhbmNlUGFyZW50ID0gcGFyZW50OworCX0KKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBwYXJlbnQKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIHBhcmVudDsKKwl9CisJLyoqCisJICogQHJldHVybiB0aGUgaW5zdGFuY2UgcGFyZW50CisJICovCisJcHVibGljIE9iamVjdCBnZXRJbnN0YW5jZVBhcmVudCgpIHsKKwkJcmV0dXJuIGluc3RhbmNlUGFyZW50OworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG5hbWUKKwkgKi8KKwlwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGdldE5hbWUoKTsKKwl9CisKK30gLy8gUmVjb3JkZWRJbnN0YW5jZVRyZWVOb2RlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9SZWNvcmRlZEluc3RhbmNlVHJlZU5vZGVDb250ZW50UHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvUmVjb3JkZWRJbnN0YW5jZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJjMjgwYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvUmVjb3JkZWRJbnN0YW5jZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLy8gUmVjb3JkZWRJbnN0YW5jZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3JlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3I7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBJVHJlZUNvbnRlbnRQcm92aWRlcn0gZm9yIHtAbGluaworICogUmVjb3JkZWRJbnN0YW5jZVRyZWVOb2RlfXMgd2hpY2ggYXBwZWFyIGluIHRoZSB7QGxpbmsgQ29tbW9uTmF2aWdhdG9yfQorICogZnJhbWV3b3JrIHRoYXQgaXMgdXNlZCB0byBleHBsb3JlIFNURU0gUHJvamVjdHMuCisgKiAKKyAqIEBzZWUgUmVjb3JkZWRJbnN0YW5jZVRyZWVOb2RlTGFiZWxQcm92aWRlcgorICovCitAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWNvcmRlZEluc3RhbmNlVHJlZU5vZGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cworCQlJVHJlZUNvbnRlbnRQcm92aWRlciB7CisKKwkvKioKKwkgKiBAc2VlCisJICogCW9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLgorCSAqIAlPYmplY3QpCisJICovCisJYWJzdHJhY3QgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KTsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLgorCSAqIAlPYmplY3QpCisJICovCisJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJT2JqZWN0IHJldFZhbHVlID0gbnVsbDsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvcmRlZEluc3RhbmNlVHJlZU5vZGUpIHsKKwkJCXJldFZhbHVlID0gKChSZWNvcmRlZEluc3RhbmNlVHJlZU5vZGUpIGVsZW1lbnQpLmdldFBhcmVudCgpOworCQl9IC8vIGlmIElkZW50aWZpYWJsZUluc3RhbmNlVHJlZU5vZGUKKwkJcmV0dXJuIHJldFZhbHVlOworCX0KKworCS8qKgorCSAqIEBzZWUKKwkgKiAJb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuCisJICogCU9iamVjdCkKKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCk7CisKKwkvKioKKwkgKiBAc2VlCisJICogCW9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YQorCSAqIAkubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKwkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJLy8gTm90aGluZworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS4KKwkgKiAJamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7CisJCS8vIE5vdGhpbmcKKwl9CisKK30gLy8gUmVjb3JkZWRJbnN0YW5jZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9SZWNvcmRlZEluc3RhbmNlVHJlZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL1JlY29yZGVkSW5zdGFuY2VUcmVlTm9kZUxhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzViODA2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9SZWNvcmRlZEluc3RhbmNlVHJlZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLy8gUmVjb3JkZWRJbnN0YW5jZVRyZWVOb2RlTGFiZWxQcm92aWRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3I7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBJTGFiZWxQcm92aWRlcn0gZm9yIHtAbGluayBSZWNvcmRlZEluc3RhbmNlVHJlZU5vZGV9cworICogd2hpY2ggYXBwZWFyIGluIHRoZSB7QGxpbmsgQ29tbW9uTmF2aWdhdG9yfSBmcmFtZXdvcmsgdGhhdCBpcyB1c2VkIHRvIGV4cGxvcmUKKyAqIFNURU0gUHJvamVjdHMuCisgKiAKKyAqIEBzZWUgUmVjb3JkZWRJbnN0YW5jZVRyZWVOb2RlQ29udGVudFByb3ZpZGVyCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorcHVibGljIGFic3RyYWN0IGNsYXNzIFJlY29yZGVkSW5zdGFuY2VUcmVlTm9kZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cworCQlJTGFiZWxQcm92aWRlciB7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoZmluYWwgT2JqZWN0IGVsZW1lbnQpOworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldFRleHQoZmluYWwgT2JqZWN0IGVsZW1lbnQpOworCisJLyoqCisJICogQHNlZQorCSAqIAlvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS4KKwkgKiAJamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKGZpbmFsIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJLy8gTm90aGluZworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJLy8gTm90aGluZworCX0KKworCS8qKgorCSAqIEBzZWUKKwkgKiAJb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZworCSAqIAkuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShmaW5hbCBPYmplY3QgZWxlbWVudCwgZmluYWwgU3RyaW5nIHByb3BlcnR5KSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlCisJICogCW9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlCisJICogCS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoZmluYWwgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQkvLyBOb3RoaW5nCisJfQorCit9IC8vIFJlY29yZGVkSW5zdGFuY2VUcmVlTm9kZUxhYmVsUHJvdmlkZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL1JlY29yZGVkVHJlZU5vZGUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvUmVjb3JkZWRUcmVlTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NDkyNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL1JlY29yZGVkVHJlZU5vZGUuamF2YQpAQCAtMCwwICsxLDQwIEBACisvLyBSZWNvcmRlZFRyZWVOb2RlLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5leHBsb3JlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIGluIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbk5hdmlnYXRvcn0KKyAqIGJhc2VkIFNURU0gUHJvamVjdCBFeHBsb3JlciB2aWV3IHRvIHJlcHJlc2VudCBhIGdyb3VwIHJlY29yZGVkCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn0gcnVucyB0aGF0IGJlbG9uZyB0byBhCisgKiBwYXJ0aWN1bGFyIFNURU0gUHJvamVjdCBpbnN0YW5jZS4KKyAqLworcHVibGljIGNsYXNzIFJlY29yZGVkVHJlZU5vZGUgIHsKKworCXByaXZhdGUgZmluYWwgSVByb2plY3QgcHJvamVjdDsKKworCS8qKgorCSAqQHBhcmFtIHByb2plY3QKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgSVByb2plY3R9IHRoYXQgaXMgdGhlIHBhcmVudCBvZiB0aGlzCisJICogICAgICAgICAgICB7QGxpbmsgUmVjb3JkZWRUcmVlTm9kZX0uCisJICovCisJcHVibGljIFJlY29yZGVkVHJlZU5vZGUoSVByb2plY3QgcHJvamVjdCkgeworCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OworCX0gLy8gUmVjb3JkZWRUcmVlTm9kZQorCisJLyoqCisJICogQHJldHVybiB0aGUge0BsaW5rIElQcm9qZWN0fS4KKwkgKi8KKwlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKKwkJcmV0dXJuIHByb2plY3Q7CisJfQorfSAvLyBSZWNvcmRlZFRyZWVOb2RlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9SZWNvcmRlZFRyZWVOb2RlQ29udGVudFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL1JlY29yZGVkVHJlZU5vZGVDb250ZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWJhYmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9SZWNvcmRlZFRyZWVOb2RlQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLy8gUmVjb3JkZWRUcmVlTm9kZUNvbnRlbnRQcm92aWRlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIElDb250ZW50UHJvdmlkZXJ9IGZvciB0aGUgY29udHJpYnV0aW9ucyB0byB0aGUKKyAqIG9yZy5lY2xpcHNlLnVpLG5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50cyBleHRlbnNpb24gcG9pbnQgdGhhdCByZXByZXNlbnQKKyAqIHJlY29yZGVkIHtAbGluayBTaW11bGF0aW9ufSBydW5zLgorICovCitAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKK3B1YmxpYyBjbGFzcyBSZWNvcmRlZFRyZWVOb2RlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgeworCisJLyoqCisJICogQHNlZQorCSAqIAlvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy4KKwkgKiAJT2JqZWN0KQorCSAqLworCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihmaW5hbCBPYmplY3QgcGFyZW50RWxlbWVudCkgeworCQlPYmplY3RbXSByZXRWYWx1ZSA9IG51bGw7CisJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpIHsKKwkJCS8vIFllcworCQkJcmV0VmFsdWUgPSBuZXcgT2JqZWN0W10geyBuZXcgUmVjb3JkZWRUcmVlTm9kZSgKKwkJCQkJKElQcm9qZWN0KSBwYXJlbnRFbGVtZW50KSB9OyAvLyBuZXcgT2JqZWN0CisJCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY29yZGVkVHJlZU5vZGUpIHsKKwkJCS8vIFllcworCQkJLy8gZmluYWwgSWRlbnRpZmlhYmxlVHJlZU5vZGUgY3RuID0gKElkZW50aWZpYWJsZVRyZWVOb2RlKQorCQkJLy8gcGFyZW50RWxlbWVudDsKKwkJCXJldFZhbHVlID0gbmV3IE9iamVjdFswXTsgLy8gbmV2ZXIgbnVsbAorCQl9IC8vIGlmIElkZW50aWZpYWJsZVRyZWVOb2RlCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldENoaWxkcmVuCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy4KKwkgKiAJT2JqZWN0KQorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KGZpbmFsIE9iamVjdCBlbGVtZW50KSB7CisJCU9iamVjdCByZXRWYWx1ZSA9IG51bGw7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVjb3JkZWRUcmVlTm9kZSkgeworCQkJLy8gWWVzCisJCQlyZXRWYWx1ZSA9ICgoUmVjb3JkZWRUcmVlTm9kZSkgZWxlbWVudCkuZ2V0UHJvamVjdCgpOworCQl9IC8vIGlmIElkZW50aWZpYWJsZVRyZWVOb2RlCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0KKworCS8qKgorCSAqIEBzZWUKKwkgKiAJb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuCisJICogCU9iamVjdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihmaW5hbCBPYmplY3QgZWxlbWVudCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQHNlZQorCSAqIAlvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEKKwkgKiAJLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhmaW5hbCBPYmplY3QgaW5wdXRFbGVtZW50KSB7CisJCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuCisJICogCWpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChmaW5hbCBWaWV3ZXIgdmlld2VyLCBmaW5hbCBPYmplY3Qgb2xkSW5wdXQsCisJCQlmaW5hbCBPYmplY3QgbmV3SW5wdXQpIHsKKwkJLy8gTm90aGluZworCX0KKworfSAvLyBSZWNvcmRlZFRyZWVOb2RlQ29udGVudFByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9SZWNvcmRlZFRyZWVOb2RlTGFiZWxQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9SZWNvcmRlZFRyZWVOb2RlTGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNDMyZTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2V4cGxvcmVyL1JlY29yZGVkVHJlZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLy8gUmVjb3JkZWRUcmVlTm9kZUxhYmVsUHJvdmlkZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmV4cGxvcmVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuSVNoYXJlZEltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhbiB7QGxpbmsgSUxhYmVsUHJvdmlkZXJ9IGZvciB0aGUgY29udHJpYnV0aW9ucyB0byB0aGUKKyAqIG9yZy5lY2xpcHNlLnVpLG5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50cyBleHRlbnNpb24gcG9pbnQgdGhhdCByZXByZXNlbnQKKyAqIHJlY29yZGVkIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9ufXMuCisgKi8KK3B1YmxpYyBjbGFzcyBSZWNvcmRlZFRyZWVOb2RlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSggT2JqZWN0IGVsZW1lbnQpIHsKKwkJSW1hZ2UgcmV0VmFsdWUgPSBudWxsOworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlY29yZGVkVHJlZU5vZGUpIHsKKwkJCXJldFZhbHVlID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KAorCQkJCQlJU2hhcmVkSW1hZ2VzLlJFQ09SREVEX1NJTVVMQVRJT05fRk9MREVSX0lDT04pOworCisJCX0gLy8gaWYgSWRlbnRpZmlhYmxlSW5zdGFuY2VUcmVlTm9kZQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCBlbGVtZW50KSB7CisJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIkVYUExPUkVSLlJFQ09SREVEX1NJTVVMQVRJT05TX0ZPTERFUiIpOworCX0KKworCS8qKgorCSAqIEBzZWUKKwkgKiAJb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuCisJICogCWpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcigKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAc2VlCisJICogCW9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcKKwkgKiAJLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCBlbGVtZW50LAorCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZyBwcm9wZXJ0eSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQHNlZQorCSAqIAlvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZQorCSAqIAkuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKAorCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJLy8gTm90aGluZworCX0KKworfSAvLyBSZWNvcmRlZFRyZWVOb2RlTGFiZWxQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZXhwbG9yZXIvbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmQ2N2QyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9leHBsb3Jlci9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjUgQEAKKyMgRXhwbG9yZXIgbWVzc2FnZXMucHJvcGVydGllcworIworIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjIEV4cGxvcmVyCitFWFBMT1JFUi5ERUNPUkFUT1JfRk9MREVSPURlY29yYXRvcnMKK0VYUExPUkVSLkVYUEVSSU1FTlRfRk9MREVSPUV4cGVyaW1lbnRzCitFWFBMT1JFUi5HUkFQSF9GT0xERVI9R3JhcGhzCitFWFBMT1JFUi5NT0RFTF9GT0xERVI9TW9kZWxzCitFWFBMT1JFUi5NT0RJRklFUl9GT0xERVI9TW9kaWZpZXJzCitFWFBMT1JFUi5QUkVESUNBVEVfRk9MREVSPVByZWRpY2F0ZQorRVhQTE9SRVIuU0NFTkFSSU9fRk9MREVSPVNjZW5hcmlvcworRVhQTE9SRVIuU0VRVUVOQ0VSX0ZPTERFUj1TZXF1ZW5jZXJzCitFWFBMT1JFUi5UUklHR0VSX0ZPTERFUj1UcmlnZ2VycworRVhQTE9SRVIuUkVDT1JERURfU0lNVUxBVElPTlNfRk9MREVSPVJlY29yZGVkIFNpbXVsYXRpb25zCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9HZW9ncmFwaGljQ29udHJvbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL0dlb2dyYXBoaWNDb250cm9sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmYjMzYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9HZW9ncmFwaGljQ29udHJvbC5qYXZhCkBAIC0wLDAgKzEsMTExMyBAQAorLy8gR2VvZ3JhcGhpY0NvbnRyb2wuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTm9kZUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmdQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmdQcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmcuU2VnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5jZW50ZXJzLkdlb2dyYXBoaWNDZW50ZXJzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uTGlzdGVuZXI7aW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5Db2xvclByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLkNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLklDb2xvclByb3ZpZGVyQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5TdGVtUG9seWdvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLlN0ZW1Qb2x5Z29uc0xpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aWRnZXRzLkdlb1ZpZXdPcHRpb25zQmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2lkZ2V0cy5HZW9WaWV3T3B0aW9uc0Jhci5Qcm9wZXJ0eVNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHZpc3VhbGl6YXRpb24gb2YgdGhlIGdlb2dyYXBoaWMgYXR0cmlidXRlcyBvZiBhCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24ub3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn0uCisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBHZW9ncmFwaGljQ29udHJvbCBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzCisJCUlTaW11bGF0aW9uTGlzdGVuZXIsIElTZWxlY3Rpb25Qcm92aWRlciwgSUNvbG9yUHJvdmlkZXJDaGFuZ2VkTGlzdGVuZXIsCisJCUlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLAorCQlHZW9WaWV3T3B0aW9uc0Jhci5Qcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyIHsKKworCS8qKgorCSAqIFRoZSB3aWR0aCBvZiB0aGUgbGF5b3V0IG1hcmdpbi4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVJHSU5fV0lEVEggPSA1OworCisJLyoqCisJICogVGhlIGhlaWdodCBvZiB0aGUgbGF5b3V0IG1hcmdpbi4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVJHSU5fSEVJR0hUID0gNTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9ufSB0aGF0IHRoaXMgY29udHJvbCBpcyBsaXN0ZW5pbmcgdG8gYW5kCisJICogdmlzdWFsaXppbmcgYnkgcmVuZGVyaW5nIExhdC9Mb25nIGRhdGEgb24gdGhlIHtAbGluayAjbWFwQ2FudmFzfS4KKwkgKi8KKwlwcml2YXRlIElTaW11bGF0aW9uIHNpbXVsYXRpb24gPSBudWxsOworCisJLyoqCisJICogVGhlIHtAbGluayBJZGVudGlmaWFibGV9IHRoYXQgd2FzIG1vc3QgcmVjZW50bHkgc2VsZWN0ZWQsIG9yCisJICogPGNvZGU+bnVsbDwvY29kZT4sIGlmIG5vbmUgaGFzIGJlZW4gc2VsZWN0ZWQuCisJICovCisJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOworCisJLyoqCisJICogVGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9IHdhaXRpbmcgdG8gYmUgdG9sZAorCSAqIGFib3V0IHNlbGVjdGlvbnMuCisJICovCisJcHJvdGVjdGVkIGZpbmFsIExpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gbGlzdGVuZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+KCk7CisKKwlwcm90ZWN0ZWQgR2VvZ3JhcGhpY1JlbmRlcmVyIGdlb2dyYXBoaWNSZW5kZXJlcjsKKworCXByb3RlY3RlZCBTdHJpbmcgc2VsZWN0ZWRFZGdlID0gIiI7CisKKwkvKioKKwkgKiBJZiA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIHRoZXJlIGlzIGEgbWFwIHJlZnJlc2ggcmVxdWVzdCBwZW5kaW5nLgorCSAqLworCWJvb2xlYW4gcmVmcmVzaFBlbmRpbmcgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIDxjb2RlPkpvYjwvY29kZT4gdGhhdCBjb21wdXRlcyB0aGUgcG9seWdvbiB2YWx1ZXMgaW4gdGhlCisJICogYmFja2dyb3VuZC4KKwkgKi8KKwlKb2IgcmVmcmVzaEpvYjsKKwkvKioKKwkgKiBBZGFwdGVyIGluc3RhbmNlIG9mIHRoZSBzZWxlY3RlZCBjb2xvciBwcm92aWRlciAodG8gYmUgcmV1c2VkIGJ5IG9ubHkKKwkgKiBzZXR0aW5nIHRoZSB0YXJnZXQpCisJICovCisJcHJvdGVjdGVkIENvbG9yUHJvdmlkZXJBZGFwdGVyIGNvbG9yUHJvdmlkZXJBZGFwdGVyID0gbnVsbDsKKworCXByaXZhdGUgTGFiZWwgc2ltdWxhdGlvbk5hbWVMYWJlbDsKKworCXByaXZhdGUgR2VvVmlld09wdGlvbnNCYXIgb3B0aW9uc0JhcjsKKworCS8qKgorCSAqIFRoaXMgY29udGFpbnMgYSBtYXBwaW5nIGJldHdlZW4gdGhlIHtAbGluayBEZWNvcmF0b3J9cyB3ZSBkaXNwbGF5IGFuZCB0aGUKKwkgKiBkYXRhIHdlIG5lZWQgdG8gZGlzcGxheSB0aGVtLiBOb3QgdXNlZCB5ZXQuCisJICovCisJcHJvdGVjdGVkIGZpbmFsIE1hcDxEZWNvcmF0b3IsIERlY29yYXRvckRpc3BsYXlEYXRhPiBkZWNvcmF0b3JUb0RlY29yYXRvckRpc3BsYXlEYXRhTWFwID0gbmV3IEhhc2hNYXA8RGVjb3JhdG9yLCBEZWNvcmF0b3JEaXNwbGF5RGF0YT4oKTsKKworCS8vIENhY2hlIG9mIGdlbmVyYXRlZCBTdGVtUG9seWdvbnNMaXN0IGluc3RhbmNlcworCXByaXZhdGUgZmluYWwgTWFwPExhdExvbmcsIFN0ZW1Qb2x5Z29uc0xpc3Q+IHBvbHlnb25MaXN0TWFwID0gbmV3IEhhc2hNYXA8TGF0TG9uZywgU3RlbVBvbHlnb25zTGlzdD4oKTsKKworCS8qKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gc3R5bGUKKwkgKi8KKwlwdWJsaWMgR2VvZ3JhcGhpY0NvbnRyb2woZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgaW50IHN0eWxlKSB7CisJCXN1cGVyKHBhcmVudCwgc3R5bGUpOworCisJCUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKQorCQkJCS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworCisJCXNldFByZWZlcmVuY2VzKCk7CisKKwkJY3JlYXRlQ29udGV4dE1lbnUodGhpcyk7CisKKwkJZmluYWwgRm9ybUxheW91dCBsYXlvdXQgPSBuZXcgRm9ybUxheW91dCgpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gTUFSR0lOX0hFSUdIVDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gTUFSR0lOX1dJRFRIOworCQlzZXRMYXlvdXQobGF5b3V0KTsKKworCQlmaW5hbCBDb21wb3NpdGUgdG9wQ29tcG9zaXRlID0gY3JlYXRlVG9wQ29tcG9zaXRlKHRoaXMpOworCisJCWdlb2dyYXBoaWNSZW5kZXJlciA9IGNyZWF0ZUdlb2dyYXBoaWNSZW5kZXJlcigpOworCQlnZW9ncmFwaGljUmVuZGVyZXIuc2V0Q29sb3JQcm92aWRlckFkYXB0ZXIoY29sb3JQcm92aWRlckFkYXB0ZXIpOworCQlnZW9ncmFwaGljUmVuZGVyZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCWZpbmFsIENvbXBvc2l0ZSBib3R0b21Db21wb3NpdGUgPSBjcmVhdGVCb3R0b21Db21wb3NpdGUodGhpcyk7CisKKwkJZmluYWwgRm9ybURhdGEgdG9wQ29tcG9zaXRlRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJdG9wQ29tcG9zaXRlLnNldExheW91dERhdGEodG9wQ29tcG9zaXRlRm9ybURhdGEpOworCQl0b3BDb21wb3NpdGVGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXRvcENvbXBvc2l0ZUZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXRvcENvbXBvc2l0ZUZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisKKwkJZmluYWwgRm9ybURhdGEgZ2VvUmVuZGVyZXJGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlnZW9ncmFwaGljUmVuZGVyZXIuc2V0TGF5b3V0RGF0YShnZW9SZW5kZXJlckZvcm1EYXRhKTsKKwkJZ2VvUmVuZGVyZXJGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodG9wQ29tcG9zaXRlLCAwKTsKKwkJZ2VvUmVuZGVyZXJGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tQ29tcG9zaXRlLCAwKTsKKwkJZ2VvUmVuZGVyZXJGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlnZW9SZW5kZXJlckZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisKKwkJLy8gQm90dG9tIENvbXBvc2l0ZQorCQlmaW5hbCBGb3JtRGF0YSBib3R0b21Db21wb3NpdGVGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlib3R0b21Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShib3R0b21Db21wb3NpdGVGb3JtRGF0YSk7CisJCWJvdHRvbUNvbXBvc2l0ZUZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQlib3R0b21Db21wb3NpdGVGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlib3R0b21Db21wb3NpdGVGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCisJCXBhY2soKTsKKwl9IC8vIEdlb2dyYXBoaWNDb250cm9sCisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJYWJzdHJhY3QgcHJvdGVjdGVkIEdlb2dyYXBoaWNSZW5kZXJlciBjcmVhdGVHZW9ncmFwaGljUmVuZGVyZXIoKTsKKworCS8qKgorCSAqIFNldCB2aXN1YWxpemF0aW9uIHByZWZlcmVuY2VzCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0UHJlZmVyZW5jZXMoKSB7CisJCS8vIE5vdGhpbmcgeWV0CisJCS8vIHRyeSB7CisJCS8vIC8vIElQcmVmZXJlbmNlU3RvcmUKKwkJLy8gZmluYWwgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpCisJCS8vIC5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCQkvLworCQkvLyBpbml0aWFsU2NhbGVSdWxlclNlbGVjdGlvbiA9IHByZWZlcmVuY2VzCisJCS8vIC5nZXRJbnQob3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlcy4KKwkJLy8gUHJlZmVyZW5jZUNvbnN0YW50cy5JTklUSUFMX1NDQUxFX1NFTEVDVElPTl9QUkVGRVJFTkNFKTsKKwkJLy8gfSBjYXRjaCAoZmluYWwgTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworCQkvLyAvLyBJZ25vcmUKKwkJLy8gfSAvLyBjYXRjaCBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCX0gLy8gc2V0UHJlZmVyZW5jZXMKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5vcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9ufQorCSAqLworCXB1YmxpYyBmaW5hbCBJU2ltdWxhdGlvbiBnZXRTaW11bGF0aW9uKCkgeworCQlyZXR1cm4gc2ltdWxhdGlvbjsKKwl9IC8vIGdldFNpbXVsYXRpb24KKworCS8qKgorCSAqIFNldHRpbmcgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9ufSBoYXMKKwkgKiB0aGUgc2lkZS1lZmZlY3Qgb2YgY2F1c2luZyB0aGUgY29udHJvbCB0byByZW1vdmUgaXRzZWxmIGFzIGEgbGlzdGVuZXIKKwkgKiBmcm9tIGFueSBwcmV2aW91c2x5IHNldAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9ufSBhbmQgYWRkaW5nIGl0c2VsZgorCSAqIGFzIGEgbGlzdGVuZXIgdG8gdGhlIG5ldyBvbmUuIEl0IHdpbGwgYWxzbyBjYXVzZSB0aGUgaW1hZ2UgdG8gYmUKKwkgKiBpbml0aWFsaXplZCBmcm9tIHRoZSBjb250ZW50cyBvZiB0aGUgbmV3CisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259IGFzIGFwcHJvcHJpYXRlLgorCSAqIAorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogICAgICAgICAgICB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259CisJICogICAgICAgICAgICB3aG9zZSBMYXQvTG9uZyBkYXRhIHdpbGwgYmUgcmVuZGVyZWQuCisJICovCisJcHVibGljIGZpbmFsIHZvaWQgc2V0U2ltdWxhdGlvbihmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uKSB7CisJCS8vIEFueSBuZWVkIHRvIHN3aXRjaD8KKwkJaWYgKHRoaXMuc2ltdWxhdGlvbiA9PSBzaW11bGF0aW9uKSB7CisJCQkvLyBObworCQkJcmV0dXJuOworCQl9IC8vIGlmIG5vIG5lZWQgdG8gc3dpdGNoPworCisJCS8vIFNob3VsZCB3ZSByZW1vdmUgb3Vyc2VsdmVzIGFzIGxpc3RlbmVycyBmcm9tIHRoZSBjdXJyZW50IHNpbXVsYXRpb24/CisJCWlmICh0aGlzLnNpbXVsYXRpb24gIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQl0aGlzLnNpbXVsYXRpb24ucmVtb3ZlU2ltdWxhdGlvbkxpc3RlbmVyKHRoaXMpOworCQl9CisKKwkJdGhpcy5zaW11bGF0aW9uID0gc2ltdWxhdGlvbjsKKwkJc2VsZWN0aW9uID0gbnVsbDsKKwkJLy8gV2FzIHRoZXJlIGEgbmV3IHNpbXVsYXRpb24gdG8gc3dpdGNoIHRvPworCQlpZiAodGhpcy5zaW11bGF0aW9uICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJdGhpcy5zaW11bGF0aW9uLmFkZFNpbXVsYXRpb25MaXN0ZW5lcih0aGlzKTsKKwkJCWluaXRpYWxpemVGcm9tU2ltdWxhdGlvbih0aGlzLnNpbXVsYXRpb24pOworCQl9CisKKwkJcmVmcmVzaCgpOworCX0gLy8gc2V0U2ltdWxhdGlvbgorCisJLyoqCisJICogSW5pdGlhbGl6ZSB0aGUgY29udHJvbCBmcm9tIGEKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn0gaW5zdGFuY2UuCisJICogCisJICogQHBhcmFtIHNpbXVsYXRpb24KKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn0KKwkgKiAgICAgICAgICAgIHdob3NlIHN0YXRlIHdpbGwgYmUgdmlzdWFsaXplZCBpbiB0aGUgY29udHJvbC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbVNpbXVsYXRpb24oZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbikgeworCQlzaW11bGF0aW9uTmFtZUxhYmVsLnNldFRleHQoc2ltdWxhdGlvbi5nZXROYW1lKCkpOworCQlvcHRpb25zQmFyLnNldFNpbXVsYXRpb24oc2ltdWxhdGlvbik7CisJfSAvLyBpbml0aWFsaXplRnJvbVNpbXVsYXRpb24KKworCS8qKgorCSAqIFVwZGF0ZSB0aGUgY29udGVudHMgb2Yge0BsaW5rICNnZW9ncmFwaGljUmVuZGVyZXJ9IGZyb20gdGhlIGNvbnRlbnRzIG9mCisJICogdGhlIHtAbGluayAjc2ltdWxhdGlvbn0uIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgVUkKKwkgKiB0aHJlYWQgb3RoZXJ3aXNlIGl0IGNvbnRhaW5zIGEgcmFjZSBjb25kaXRpb24gdGhhdCBjYW4gbG9jayB1cCB0aGUKKwkgKiByZWZyZXNoaW5nIG9mIHRoZSBtYXAgY2FudmFzLgorCSAqLworCXZvaWQgcmVmcmVzaCgpIHsKKwkJLy8gVGhpcyBpcyBjb21wbGV4IGFuZCBwb3RlbnRpYWwgY29uZnVzaW5nIGNvZGUuIFRoZSBiYXNpYyBpZGVhIGlzIHRoYXQKKwkJLy8gd2Ugd2FudCB0byBkZXRlcm1pbmUgd2hhdCB0byBkcmF3IG9uIHRoZSBtYXBDYW52YXMgaW4gYSB0aHJlYWQKKwkJLy8gc2VwYXJhdGUgZnJvbSB0aGUgVUkgdGhyZWFkLCBidXQgd2UgYWxzbyB3YW50IHRvIGNhcHR1cmUgYSByZXF1ZXN0IHRvCisJCS8vIHJlZnJlc2ggdGhlIG1hcENhbnZhcyB0aGF0IGNvbWVzIHdoaWxlIGEgYmFja2dyb3VuZCBKb2IgaXMgYWxyZWFkeQorCQkvLyBydW5uaW5nLiBUaGlzIHJlcXVlc3QgY291bGQgaGF2ZSBiZWVuIGdlbmVyYXRlZCBiZWNhdXNlIHNvbWV0aGluZworCQkvLyBzaWduaWZpY2FudCBsaWtlIGEgZGVjb3JhdG9yIG9yIGEgcHJvcGVydHkgaGFzIGNoYW5nZWQgYW5kCisJCS8vIHdlIGRvbid0IHdhbnQgdG8gbG9zZSB0aGF0IHN3aXRjaC4KKwkJLy8gV2UgaGF2ZSB0d28gZmllbGRzIHRoYXQgY2FwdHVyZSB0aGUgc3RhdGUgb2YgdGhlIHJlZnJlc2guIFRoZSBmaXJzdAorCQkvLyBpcyB0aGUgZmxhZyByZWZyZXNoUGVuZGluZyB3aGljaCBpZiB0cnVlIGluZGljYXRlcyB0aGF0IGEgY2FsbCB0bworCQkvLyByZWZyZXNoTWFwQ2FudmFzIHdhcyBwcm9jZXNzZWQgd2hpbGUgYSBiYWNrZ3JvdW5kIEpvYiB3YXMgZXhlY3V0aW5nLgorCQkvLyBUaGlzIGZsYWcgaXMgc2V0IGluc3RlYWQgb2YgY3JlYXRpbmcgYW5vdGhlciBiYWNrZ3JvdW5kIEpvYi4gVGhlCisJCS8vIHNlY29uZCBpcyB0aGUgZmllbGQgcmVmcmVzaEpvYiB3aGljaCBpcyBzZXQgdG8gdGhlIGJhY2tncm91bmQgSm9iIGlmCisJCS8vIGl0IGlzIHByZXNlbnQgYW5kIHJ1bm5pbmcuCisJCS8vCisJCS8vIElmIHdlIGVudGVyIHRoZSBtZXRob2QgYW5kIHJlZnJlc2hQZW5kaW5nIGlzIHRydWUgdGhlbiB3ZSBpbW1lZGlhdGVseQorCQkvLyBleGl0IGJlY2F1c2UgYSByZWZyZXNoIGpvYiB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZXJlJ3Mgbm90aGluZyBtb3JlCisJCS8vIGZvciB1cyB0byByZXF1ZXN0LiBJZiwgaW5zdGVhZCwgcmVmcmVzaFBlbmRpbmcgaXMgZmFsc2UsIHRoZW4gd2UKKwkJLy8gY2hlY2sgdG8gc2VlIGlmIGEgcmVmcmVzaEpvYiBpcyBhbHJlYWR5IHJ1bm5pbmcuIElmIHNvLCB3ZSBzZXQKKwkJLy8gcmVmcmVzaFBlbmRpbmcgdG8gdHJ1ZSwgYW5kIGV4aXQuIElmIG5vdCwgd2UgY3JlYXRlIHRoZSBiYWNrZ3JvdW5kCisJCS8vIHJlZnJlc2ggam9iIGFuZCBhc3NpZ24gaXQgdG8gdGhlIGZpZWxkIHJlZnJlc2hKb2IuCisJCS8vCisJCS8vIEluIHRoZSBiYWNrZ3JvdW5kIHJlZnJlc2hpbmcgam9iIHdlIHByb2Nlc3MgdGhlIExhdC9Mb25nIGRhdGEgYW5kCisJCS8vIHRoZW4gd2hlbiBkb25lIHdlIGFkZCBhIFJ1bm5hYmxlIG9uIHRvIHRoZSBVSSB0aHJlYWQgdG8gcmVkcmF3IHRoZQorCQkvLyBtYXBDYW52YXMuIFRoYXQgUnVubmFibGUgYWxzbyBjaGVja3MgdG8gc2VlIGlmIHRoZSByZWZyZXNoIHBlbmRpbmcKKwkJLy8gZmxhZyBpcyBzZXQgYW5kIGlmIHNvLCByZXNldHMgdGhlIGZsYWcgYW5kIHRoZW4gYWRkcyBhbm90aGVyIFJ1bm5hYmxlCisJCS8vIHRvIHRoZSBVSSB0aHJlYWQgdG8gcmUtZW50ZXIgdGhlIHJlZnJlc2hNYXBDYW52YXMgbWV0aG9kLgorCQkvLworCQkvLyBUaGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIGluIHRoZSBtZXRob2QgaWYgY2FsbGVkIGJ5IG90aGVyIHRoYW4gdGhlCisJCS8vIFVJIHRocmVhZC4gSWYgYSB0aHJlYWQgZGlmZmVyZW50IGZyb20gdGhlIFVJIHRocmVhZCB3ZXJlIHRvIGNhbGwgdGhpcworCQkvLyBtZXRob2QgdGhlbiBpdCBjb3VsZCByZWFjaCBwb3NpdGlvbiAiUkMgIzIiIGluIHRoZSBjb2RlIGJlbG93IGFuZAorCQkvLyB0aGVuIGJlIHByZWVtcHRlZC4gVGhlIFVJIHRocmVhZCBjb3VsZCB0aGVuIGV4ZWN1dGUgdGhlIHRlc3QgYXQgIlJDCisJCS8vICMxIiBiZWxvdyBhbmQgZmluZCB0aGF0IHRoZXJlIGlzIG5vIHJlZnJlc2ggcGVuZGluZy4gSXQgd291bGQgZXhpdAorCQkvLyBhbmQgdGhlbiB0aGUgb3RoZXIgdGhyZWFkIHdvdWxkIHJlc3VtZSBhdCAiUkMgIzIiIGFuZCBzZXQgdGhlCisJCS8vIHJlZnJlc2hQZW5kaW5nIGZsYWcuIFRoaXMgd291bGQgY2F1c2UgYWxsIHN1YnNlcXVlbnQgbWV0aG9kCisJCS8vIGludm9jYXRpb25zIHRvIGltbWVkaWF0ZWx5IGV4aXQgYW5kIHRoZSBtYXAgY2FudmFzIHdvdWxkIG5ldmVyIGJlCisJCS8vIHJlZnJlc2hlZCBhZ2Fpbi4KKworCQkvLyBJcyB0aGVyZSBhIHJlZnJlc2ggcGVuZGluZz8KKwkJaWYgKCFyZWZyZXNoUGVuZGluZykgeworCQkJLy8gTm8KKwkJCS8vIElzIHRoZXJlIGFscmVhZHkgYSByZWZyZXNoIGpvYj8KKwkJCWlmIChyZWZyZXNoSm9iID09IG51bGwpIHsKKwkJCQkvLyBObworCQkJCS8vIFJlZnJlc2ggdGhlIG1hcCBjYW52YXMgaW4gdGhlIGJhY2tncm91bmQKKwkJCQlyZWZyZXNoSm9iID0gbmV3IEpvYihNZXNzYWdlcy5nZXRTdHJpbmcoIklNVmlldy5NUmVmcmVzaCIpKSB7CisJCQkJCS8qKgorCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCisJCQkJCSAqLworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCisJCQkJCQlmaW5hbCBTdGVtUG9seWdvbnNMaXN0IHBvbHlnb25zVG9EcmF3ID0gY3JlYXRlUG9seWdvbnNUb0RyYXcobW9uaXRvcik7CisJCQkJCQkvLyBTdGlsbCBvayB0byBydW4/CisJCQkJCQlpZihwb2x5Z29uc1RvRHJhdyA9PSBudWxsKSByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCQkJCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOworCQkJCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgeworCQkJCQkJCS8vIFllcworCQkJCQkJCXRyeSB7CisJCQkJCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCQkvLyBUaGlzIHJ1bnMgaW4gdGhlIFVJIHRocmVhZAorCQkJCQkJCQkJCS8vIElzIHRoZSByZW5kZXJlciBzdGlsbCBhcm91bmQ/CisJCQkJCQkJCQkJaWYgKCFnZW9ncmFwaGljUmVuZGVyZXIuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQkJCQkJCS8vIFllcworCQkJCQkJCQkJCQlnZW9ncmFwaGljUmVuZGVyZXIKKwkJCQkJCQkJCQkJCQkucmVuZGVyKHBvbHlnb25zVG9EcmF3KTsKKworCQkJCQkJCQkJCQlyZWZyZXNoSm9iID0gbnVsbDsKKwkJCQkJCQkJCQkJLy8gUkMgIzEKKwkJCQkJCQkJCQkJLy8gSXMgdGhlcmUgYSByZWZyZXNoIHBlbmRpbmc/CisJCQkJCQkJCQkJCWlmIChyZWZyZXNoUGVuZGluZykgeworCQkJCQkJCQkJCQkJLy8gWWVzCisJCQkJCQkJCQkJCQlyZWZyZXNoUGVuZGluZyA9IGZhbHNlOworCQkJCQkJCQkJCQkJLy8gV2UgY3JlYXRlIGEgbmV3IFJ1bm5hYmxlIHRvCisJCQkJCQkJCQkJCQkvLyBhdm9pZCByZWN1cnNpb24KKwkJCQkJCQkJCQkJCS8vIE9rIHRvIHJ1bj8KKwkJCQkJCQkJCQkJCWZpbmFsIERpc3BsYXkgZGlzcGxheTIgPSBEaXNwbGF5CisJCQkJCQkJCQkJCQkJCS5nZXREZWZhdWx0KCk7CisJCQkJCQkJCQkJCQlpZiAoIWRpc3BsYXkyLmlzRGlzcG9zZWQoKSkgeworCQkJCQkJCQkJCQkJCS8vIFllcworCQkJCQkJCQkJCQkJCWRpc3BsYXkyCisJCQkJCQkJCQkJCQkJCQkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQkJCQkJCQkJCS8vIFRoaXMgcnVucworCQkJCQkJCQkJCQkJCQkJCQkvLyBpbiB0aGUgVUkKKwkJCQkJCQkJCQkJCQkJCQkJLy8gdGhyZWFkCisJCQkJCQkJCQkJCQkJCQkJCXJlZnJlc2goKTsKKwkJCQkJCQkJCQkJCQkJCQl9IC8vIGFzeW5jRXhlYworCQkJCQkJCQkJCQkJCQkJfSk7CisJCQkJCQkJCQkJCQl9IC8vIGlmIG9rIHRvIHJ1bgorCQkJCQkJCQkJCQl9IC8vIGlmIHJlZnJlc2ggcGVuZGluZworCQkJCQkJCQkJCX0gLy8gaWYgdGhlIG1hcENhbnZhcyBzdGlsbCBhcm91bmQ/CisJCQkJCQkJCQl9IC8vIHJ1biAoVUkgdGhyZWFkIG1hcENhbnZhcy5yZWRyYXcoKSkKKwkJCQkJCQkJfSk7CisJCQkJCQkJfSAvLyB0cnkKKwkJCQkJCQljYXRjaCAoZmluYWwgTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisJCQkJCQkJCS8vIHNlZSAxNzc5NjYKKwkJCQkJCQkJLy8gV2UgaWdub3JlIHRoZSBleGNlcHRpb24sIHRoZXJlJ3Mgbm90aGluZyB0bworCQkJCQkJCQkvLyBkbworCQkJCQkJCX0gLy8gY2F0Y2ggTnVsbFBvaW50ZXJFeGNlcHRpb24KKwkJCQkJCX0gLy8gaWYgb2sgdG8gcnVuCisJCQkJCQltb25pdG9yLmRvbmUoKTsKKwkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQkJCQl9IC8vIHJ1biAoYmFja2dyb3VuZCBwb2x5Z29uIHByb2Nlc3NpbmcgSm9iKQorCisJCQkJfTsKKwkJCQlyZWZyZXNoUGVuZGluZyA9IGZhbHNlOworCQkJCXJlZnJlc2hKb2Iuc2NoZWR1bGUoKTsKKwkJCX0gLy8gaWYgbm90IGFscmVhZHkgYSByZWZyZXNoIGpvYgorCQkJZWxzZSB7CisJCQkJLy8gWWVzCisJCQkJLy8gVGhlcmUgaXMgYWxyZWFkeSBhIHJlZnJlc2ggam9iIHNvIHJlbWVtYmVyIHRoYXQgYSByZWZyZXNoIGlzCisJCQkJLy8gcGVuZGluZworCQkJCS8vIFJDICMyCisJCQkJcmVmcmVzaFBlbmRpbmcgPSB0cnVlOworCQkJfSAvLyBlbHNlCisJCX0gLy8gaWYgbm8gcmVmcmVzaCBpcyBwZW5kaW5nCisKKwl9IC8vIHJlZnJlc2gKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0I2Rpc3Bvc2UoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwkJLy8gSXMgdGhlcmUgYSBzaW11bGF0aW9uIHdlJ3JlIGxpc3RlbmluZyB0bz8KKwkJaWYgKHNpbXVsYXRpb24gIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQkvLyBOb3QgYW55IG1vcmUKKwkJCXNpbXVsYXRpb24ucmVtb3ZlU2ltdWxhdGlvbkxpc3RlbmVyKHRoaXMpOworCQl9CisKKwkJb3B0aW9uc0Jhci5yZW1vdmVDb2xvclByb3ZpZGVyQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCQlvcHRpb25zQmFyLnJlbW92ZVByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7CisKKwkJZ2VvZ3JhcGhpY1JlbmRlcmVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKworCQkvLyBTaG91bGRuJ3QgYmUgYW55IHNlbGVjdGlvbiBjaGFuZ2VkIGxpc3RlbmVycworCQlhc3NlcnQgbGlzdGVuZXJzLnNpemUoKSA9PSAwOworCisJCUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKQorCQkJCS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworCisJfSAvLyBkaXNwb3NlCisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIHZpZXcncyBjb250ZXh0IG1lbnUgYW5kIGFkZCB0aGUgYWN0aW9uIGhhbmRsZXJzIHRvIGl0LgorCSAqLworCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZXh0TWVudShmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJLy8gQ29udGV4dCBNZW51CisJCWZpbmFsIE1lbnVNYW5hZ2VyIGNvbnRleHRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCWNvbnRleHRNZW51TWFuYWdlci5hZGQobmV3IFJlc2V0UmVuZGVyZXIoKSk7CisKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlmaW5hbCBNZW51IHBvcFVwTWVudSA9IGNvbnRleHRNZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShwYXJlbnQpOworCisJCS8vIFNldCB0aGUgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyCisJCXBhcmVudC5zZXRNZW51KHBvcFVwTWVudSk7CisKKwl9IC8vIGNyZWF0ZUNvbnRleHRNZW51CisKKwkvKioKKwkgKiBAcGFyYW0gZXZlbnQKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShmaW5hbCBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCXNldFByZWZlcmVuY2VzKCk7CisJfSAvLyBwcm9wZXJ0eUNoYW5nZQorCisJLyoqCisJICogQHBhcmFtIGV2ZW50CisJICovCisJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJZmlyZVNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7CisJfQorCisJcHJvdGVjdGVkIGNsYXNzIFJlc2V0UmVuZGVyZXIgZXh0ZW5kcyBBY3Rpb24geworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZ2V0VGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCQkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiTWFwTWVudS5SZXNldCIpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCWdlb2dyYXBoaWNSZW5kZXJlci5yZXNldCgpOworCisJCQkvLyBzZXRUcmFuc2xhdGlvbihERUZBVUxUX0lOSVRJQUxfWF9UUkFOU0xBVElPTiwKKwkJCS8vIERFRkFVTFRfSU5JVElBTF9ZX1RSQU5TTEFUSU9OKTsKKwkJCS8vIHpvb21GYWN0b3IgPSBJTklUSUFMX1pPT01fRkFDVE9SOworCQkJLy8KKwkJCS8vIC8vIFJlc2V0IHRoZSBnYWluIGZhY3RvciBhbmQgdXBkYXRlIHRoZSBjaGVja3MgaW4gdGhlIGNvbnRleHQKKwkJCS8vIG1lbnUKKwkJCS8vIGxhc3RHYWluRmFjdG9yQWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOworCQkJLy8gZGVmYXVsdEdhaW5GYWN0b3JBY3Rpb24ucnVuKCk7CisJCQkvLyBkZWZhdWx0R2FpbkZhY3RvckFjdGlvbi5zZXRDaGVja2VkKHRydWUpOworCQkJLy8KKwkJCS8vIHVzZUxvZ1NjYWxpbmcgPSBERUZBVUxUX1VTRV9MT0dTQ0FMSU5HOworCQkJLy8gbG9nYXJpdGhtaWNBY3Rpb24uc2V0Q2hlY2tlZCh1c2VMb2dTY2FsaW5nKTsKKwkJCS8vCisJCQkvLyBkcmF3UG9seWdvbkJvcmRlcnMgPSBERUZBVUxUX0RSQVdfUE9MWUdPTl9CT1JERVJTOworCQkJLy8gZHJhd1BvbHlnb25Cb3JkZXJzQWN0aW9uLnNldENoZWNrZWQoZHJhd1BvbHlnb25Cb3JkZXJzKTsKKwkJCS8vCisJCQkvLyBkcmF3UG9seWdvbkNlbnRlckNvbm5lY3Rpb25zID0KKwkJCS8vIERFRkFVTFRfRFJBV19QT0xZR09OX0NFTlRFUl9DT05ORUNUSU9OUzsKKwkJCS8vIGNvbm5lY3RQb2x5Z29uQ2VudGVyc0FjdGlvbgorCQkJLy8gLnNldENoZWNrZWQoZHJhd1BvbHlnb25DZW50ZXJDb25uZWN0aW9ucyk7CisKKwkJCWdlb2dyYXBoaWNSZW5kZXJlci5yZWRyYXcoKTsKKwkJfQorCX0gLy8gUmVzZXRNYXBDYW52YXNBY3Rpb24KKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBob2xkIGRhdGEgdXNlZCB0byBkaXNwbGF5IHRoZSByZWxhdGl2ZSB2YWx1ZXMgb2YgYQorCSAqIHtAbGluayBEZWNvcmF0b3J9LiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgY3JlYXRlZCB3aGVuIHRoZSBsYWJlbAorCSAqIHZhbHVlcyBvZiBhIHtAbGluayBEZWNvcmF0b3J9IGFyZSBmaXJzdCBkcmF3biBhbmQgdGhlbiBzdWJzZXF1ZW50bHkKKwkgKiBjYWNoZWQgaW4ge0BsaW5rICNkZWNvcmF0b3JUb0RlY29yYXRvckRpc3BsYXlEYXRhTWFwfSBmb3IgZnV0dXJlCisJICogcmV0cmlldmFsLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRGVjb3JhdG9yRGlzcGxheURhdGEgeworCisJCXByaXZhdGUgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciBydnA7CisKKwkJcHJpdmF0ZSBMYXRMb25nUHJvdmlkZXJBZGFwdGVyIGxhdExvbmdQcm92aWRlcjsKKworCQlwcml2YXRlIGZpbmFsIExpc3Q8TGFiZWxEYXRhPiBsYWJlbERhdGFzID0gbmV3IEFycmF5TGlzdDxMYWJlbERhdGE+KCk7CisKKwkJcHJpdmF0ZSBmaW5hbCBMaXN0PExhYmVsRGF0YT4gbGFiZWxzV2l0aFVucmVzb2x2ZWRMYXRMb25nID0gbmV3IEFycmF5TGlzdDxMYWJlbERhdGE+KCk7CisKKwkJLyoqCisJCSAqIERlZmF1bHQgY29uc3RydWN0b3IKKwkJICovCisJCXB1YmxpYyBEZWNvcmF0b3JEaXNwbGF5RGF0YSgpIHsKKwkJCS8vIG5vdGhpbmcKKwkJfQorCisJCS8qKgorCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCBvZiB0aGUgbGFiZWxzIGhhdmUgdmFsaWQKKwkJICogICAgICAgICBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YSByZXRyaWV2ZWQuCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBoYXNBbGxMYXRMb25nKCkgeworCQkJcmV0dXJuIGxhYmVsc1dpdGhVbnJlc29sdmVkTGF0TG9uZy5zaXplKCkgPT0gMDsKKwkJfQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBsYWJlbCBkYXRhIGZvciB0aGUgZGVjb3JhdG9yCisJCSAqLworCQlwdWJsaWMgTGlzdDxMYWJlbERhdGE+IGdldExhYmVsRGF0YSgpIHsKKwkJCXJldHVybiBsYWJlbERhdGFzOworCQl9CisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIHtAbGluayBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyfQorCQkgKi8KKwkJcHVibGljIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXIgZ2V0UmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcigpIHsKKwkJCXJldHVybiBydnA7CisJCX0gLy8gZ2V0UmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcgorCisJCS8qKgorCQkgKiBHbyB0aHJvdWdoIGVhY2ggb2YgdGhlIGxhYmVsIGRhdGEgZW50cmllcyBhbmQgdHJ5IHRvIHJldHJpZXZlIHRoZQorCQkgKiBvbmVzIHRoYXQgZG8gbm90IGhhdmUgbGF0L2xvbmcgZGF0YSB5ZXQuCisJCSAqIAorCQkgKiBAcGFyYW0gbW9uaXRvcgorCQkgKiAgICAgICAgICAgIHByb2dyZXNzIG1vbml0b3IKKwkJICovCisJCXZvaWQgdXBkYXRlTGF0TG9uZyhmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCWZvciAoZmluYWwgSXRlcmF0b3I8TGFiZWxEYXRhPiBpdGVyID0gbGFiZWxzV2l0aFVucmVzb2x2ZWRMYXRMb25nCisJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKwkJCQlmaW5hbCBMYWJlbERhdGEgbGQgPSBpdGVyLm5leHQoKTsKKworCQkJCWxhdExvbmdQcm92aWRlci5zZXRUYXJnZXQobGQuZ2V0TGFiZWwoKS5nZXROb2RlKCkpOworCQkJCWxkLnNldExhdExvbmdEYXRhKGxhdExvbmdQcm92aWRlci5nZXRMYXRMb25nTm9XYWl0KCkpOworCQkJCS8vIERpZCB3ZSBnZXQgc29tZSBkYXRhPworCQkJCWlmIChsZC5nZXRMYXRMb25nRGF0YSgpLnNpemUoKSAhPSAwKSB7CisJCQkJCS8vIFllcworCQkJCQkvLyBObyBuZWVkIHRvIGtlZXAgdGhpcyBvbmUgb24gdGhlIGxpc3QKKwkJCQkJaXRlci5yZW1vdmUoKTsKKwkJCQl9IC8vIGlmIHdlIGdvdCBzb21lIGRhdGEKKwkJCX0gLy8gZm9yIGVhY2ggRHluYW1pY05vZGVMYWJlbEltcGwKKwkJfSAvLyB1cGRhdGVMYXRMb25nCisKKwkJLyoqCisJCSAqIEBwYXJhbSBsYWJlbAorCQkgKiAgICAgICAgICAgIGEge0BsaW5rIER5bmFtaWNOb2RlTGFiZWx9IHRvIGFkZCB0byB0aGUgc2V0LgorCQkgKi8KKwkJcHVibGljIHZvaWQgYWRkTGFiZWwoZmluYWwgRHluYW1pY05vZGVMYWJlbCBsYWJlbCkgeworCQkJZmluYWwgTGFiZWxEYXRhIGxkID0gbmV3IExhYmVsRGF0YShsYWJlbCk7CisJCQlsYWJlbERhdGFzLmFkZChsZCk7CisJCQlsYWJlbHNXaXRoVW5yZXNvbHZlZExhdExvbmcuYWRkKGxkKTsKKwkJfSAvLyBhZGRMYWJlbAorCisJCS8qKgorCQkgKiBAcGFyYW0gbGF0TG9uZ1Byb3ZpZGVyCisJCSAqICAgICAgICAgICAgdGhlIHtAbGluayBMYXRMb25nUHJvdmlkZXJBZGFwdGVyfSB0aGF0IHdpbGwgcHJvdmlkZSB0aGUKKwkJICogICAgICAgICAgICBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YSBmb3IgdGhlIGxhYmVscy4KKwkJICovCisJCXB1YmxpYyB2b2lkIHNldExhdExvbmdQcm92aWRlckFkYXB0ZXIoCisJCQkJZmluYWwgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlciBsYXRMb25nUHJvdmlkZXIpIHsKKwkJCXRoaXMubGF0TG9uZ1Byb3ZpZGVyID0gbGF0TG9uZ1Byb3ZpZGVyOworCQl9CisKKwkJLyoqCisJCSAqIEBwYXJhbSBydnAKKwkJICogICAgICAgICAgICB0aGUge0BsaW5rIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXJ9IHRoYXQgd2lsbCBwcm92aWRlCisJCSAqICAgICAgICAgICAgdGhlIHJlbGF0aXZlIHZhbHVlcyBmb3IgdGhlIGxhYmVscy4KKwkJICovCisJCXB1YmxpYyB2b2lkIHNldFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXIoCisJCQkJZmluYWwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciBydnApIHsKKwkJCXRoaXMucnZwID0gcnZwOworCQl9IC8vIHNldFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXIKKworCQkvKioKKwkJICogVGhpcyBjbGFzcyBtYWludGFpbnMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhCisJCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTGFiZWx9IGFuZCBpdHMKKwkJICogbGF0aXR1ZGUvbG9uZ2l0dWRlIGRhdGEuCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGNsYXNzIExhYmVsRGF0YSB7CisKKwkJCXByaXZhdGUgZmluYWwgRHluYW1pY05vZGVMYWJlbCBsYWJlbDsKKworCQkJcHJpdmF0ZSBMYXRMb25nIGxhdExvbmdEYXRhOworCisJCQkvKioKKwkJCSAqIEBwYXJhbSBsYWJlbAorCQkJICovCisJCQlwdWJsaWMgTGFiZWxEYXRhKGZpbmFsIER5bmFtaWNOb2RlTGFiZWwgbGFiZWwpIHsKKwkJCQl0aGlzLmxhYmVsID0gbGFiZWw7CisJCQl9CisKKwkJCS8qKgorCQkJICogQHJldHVybiB0aGUgbGFiZWwKKwkJCSAqLworCQkJcHVibGljIER5bmFtaWNOb2RlTGFiZWwgZ2V0TGFiZWwoKSB7CisJCQkJcmV0dXJuIGxhYmVsOworCQkJfQorCisJCQkvKioKKwkJCSAqIEByZXR1cm4gdGhlIGxhdGl0dWRlL2xvbmdpdHVkZSBkYXRhCisJCQkgKi8KKwkJCXB1YmxpYyBMYXRMb25nIGdldExhdExvbmdEYXRhKCkgeworCQkJCXJldHVybiBsYXRMb25nRGF0YTsKKwkJCX0KKworCQkJLyoqCisJCQkgKiBAcGFyYW0gbGF0TG9uZ0RhdGEKKwkJCSAqLworCQkJcHVibGljIHZvaWQgc2V0TGF0TG9uZ0RhdGEoZmluYWwgTGF0TG9uZyBsYXRMb25nRGF0YSkgeworCQkJCXRoaXMubGF0TG9uZ0RhdGEgPSBsYXRMb25nRGF0YTsKKwkJCX0KKworCQl9IC8vIExhYmVsRGF0YQorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCisJCQlmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCisJCQlmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHNlbGVjdGlvbgorCSAqLworCXB1YmxpYyBmaW5hbCBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKKwkJcmV0dXJuIHNlbGVjdGlvbjsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3NldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGZpbmFsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOworCQlmaXJlU2VsZWN0aW9uKHNlbGVjdGlvbik7CisJfQorCisJLyoqCisJICogUGFzcyBhIHtAbGluayBTZWxlY3Rpb25DaGFuZ2VkRXZlbnR9IGFsb25nIHRvIGxpc3RlbmVycy4KKwkgKiAKKwkgKiBAcGFyYW0gc2VsZWN0aW9uCisJICogICAgICAgICAgICB0aGUge0BsaW5rIElTZWxlY3Rpb259IHRvIGJlIGdpdmluZyB0byB0aGUgbGlzdGVuZXJzLgorCSAqLworCXB1YmxpYyB2b2lkIGZpcmVTZWxlY3Rpb24oZmluYWwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKworCQlmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsCisJCQkJc2VsZWN0aW9uKTsKKwkJZm9yIChmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7CisJCQlsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKKwkJfSAvLyBmb3IgZWFjaCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCisKKwl9IC8vIGZpcmVTZWxlY3Rpb24KKworCS8qKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVCb3R0b21Db21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQlvcHRpb25zQmFyID0gbmV3IEdlb1ZpZXdPcHRpb25zQmFyKHBhcmVudCwgU1dULk5PTkUpOworCQlvcHRpb25zQmFyLmFkZENvbG9yUHJvdmlkZXJDaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCW9wdGlvbnNCYXIuYWRkUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJcmV0dXJuIG9wdGlvbnNCYXI7CisJfSAvLyBjcmVhdGVCb3R0b21Db21wb3NpdGUKKworCS8qKgorCSAqIEBwYXJhbSBwcm9wZXJ0eVNlbGVjdGlvbkV2ZW50CisJICovCisJcHVibGljIHZvaWQgcHJvcGVydHlTZWxlY3RlZCgKKwkJCWZpbmFsIFByb3BlcnR5U2VsZWN0aW9uRXZlbnQgcHJvcGVydHlTZWxlY3Rpb25FdmVudCkgeworCQlpZiAocHJvcGVydHlTZWxlY3Rpb25FdmVudCA9PSBudWxsKSB7CisJCQlzZWxlY3RlZEVkZ2UgPSAiIjsKKwkJfQorCQkvLyBIYWNrCisJCWVsc2UgaWYgKHByb3BlcnR5U2VsZWN0aW9uRXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCXNlbGVjdGVkRWRnZSA9IChTdHJpbmcpIHByb3BlcnR5U2VsZWN0aW9uRXZlbnQuZ2V0U291cmNlKCk7CisJCX0KKwkJcmVmcmVzaCgpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgU1dUIGNvbnRyb2wgdGhhdCB0aGlzIHtAbGluayBDb21wb3NpdGV9IHdpbGwgYmUgYQorCSAqICAgICAgICAgICAgY2hpbGQgb2YKKwkgKiBAcmV0dXJuIHRoZSBTV1Qge0BsaW5rIENvbXBvc2l0ZX0gdG8gYmUgZGlzcGxheWVkIGFib3ZlIHRoZQorCSAqICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuTWFwQ2FudmFzfSBpbiB0aGUKKwkgKiAgICAgICAgIGNvbnRyb2wKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcENvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisJCWZpbmFsIENvbXBvc2l0ZSB0b3BDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCisJCWZpbmFsIEZpbGxMYXlvdXQgdG9wQ29tcG9zaXRlTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoU1dULlZFUlRJQ0FMKTsKKwkJdG9wQ29tcG9zaXRlLnNldExheW91dCh0b3BDb21wb3NpdGVMYXlvdXQpOworCisJCXNpbXVsYXRpb25OYW1lTGFiZWwgPSBuZXcgTGFiZWwodG9wQ29tcG9zaXRlLCBTV1QuQ0VOVEVSKTsKKwkJc2ltdWxhdGlvbk5hbWVMYWJlbC5zZXRUZXh0KCIiKTsKKworCQlyZXR1cm4gdG9wQ29tcG9zaXRlOworCX0gLy8gY3JlYXRlVG9wQ29tcG9zaXRlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uTGlzdGVuZXIjc2ltdWxhdGlvbkNoYW5nZWQob3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbkV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIHNpbXVsYXRpb25DaGFuZ2VkKGZpbmFsIFNpbXVsYXRpb25FdmVudCBldmVudCkgeworCisJCXN3aXRjaCAoZXZlbnQuZ2V0U2ltdWxhdGlvblN0YXRlKCkpIHsKKwkJY2FzZSBDT01QTEVURURfQ1lDTEU6CisJCQkvLyBJdCBjb3VsZCBiZSB0aGF0IHRoZSBwcm9wZXJ0eVNlbGVjdG9yIGlzIG5vdCBpbml0aWFsaXplZAorCQkJLy8geWV0LiBUaGlzIGNvdWxkIGhhcHBlbiBpZiwgd2hlbiB0aGUgc2ltdWxhdGlvbiBpcyBmaXJzdCBzZXQsIGl0cworCQkJLy8gc2NlbmFyaW8gd2FzIG5vdCBjb21wbGV0ZWx5IGluaXRpYWxpemVkLCBhbmQgc28gZGlkbid0IGhhdmUgYQorCQkJLy8gY2Fub25pY2FsIGdyYXBoLiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB3ZSBuZWVkIHRvIHRyeSBhZ2Fpbi4KKworCQkJLy8gSXMgdGhlIGNvbnRyb2wgaW5pdGlhbGl6ZWQ/CisJCQlpZiAoIW9wdGlvbnNCYXIuaXNJbml0aWFsaXplZCgpKSB7CisJCQkJLy8gTm8KKwkJCQlvcHRpb25zQmFyLnNldFNpbXVsYXRpb24oZ2V0U2ltdWxhdGlvbigpKTsKKwkJCX0gLy8gaWYKKworCQkJcmVmcmVzaCgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRVNFVDoKKwkJCXJlZnJlc2goKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLy8gSWdub3JlCisJCQlicmVhazsKKwkJfSAvLyBzd2l0Y2gKKwl9IC8vIHNpbXVsYXRpb25DaGFuZ2VkCisKKwkvKioKKwkgKiBUaGlzIHJ1bnMgaW4gdGhlIGJhY2tncm91bmQge0BsaW5rIEpvYn0gY3JlYXRlZCBpbiB7QGxpbmsgI3JlZnJlc2goKX0KKwkgKiAKKwkgKiBAcGFyYW0gZGVjb3JhdG9yCisJICogICAgICAgICAgICB0aGUge0BsaW5rIERlY29yYXRvcn0gZm9yIHdob20gdGhhdCBkYXRhIGlzIGJlaW5nIHJldHJpZXZlZC4KKwkgKiBAcGFyYW0gbW9uaXRvcgorCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlIHRvIHJlcG9ydCB0aGUgcHJvZ3Jlc3Mgb2YKKwkgKiAgICAgICAgICAgIG9idGFpbmluZyB0aGUgZGF0YQorCSAqIEByZXR1cm4gdGhlIHtAbGluayBEZWNvcmF0b3JEaXNwbGF5RGF0YX0gZm9yIHRoZSB7QGxpbmsgRGVjb3JhdG9yfS4KKwkgKi8KKwlwcm90ZWN0ZWQgRGVjb3JhdG9yRGlzcGxheURhdGEgZ2V0RGVjb3JhdG9yRGlzcGxheURhdGEoCisJCQlmaW5hbCBEZWNvcmF0b3IgZGVjb3JhdG9yLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJRGVjb3JhdG9yRGlzcGxheURhdGEgcmV0VmFsdWUgPSBkZWNvcmF0b3JUb0RlY29yYXRvckRpc3BsYXlEYXRhTWFwCisJCQkJLmdldChkZWNvcmF0b3IpOworCQkvLyBJcyB0aGVyZSBhbHJlYWR5IGFuIGluc3RhbmNlIGZvciB0aGlzIGRlY29yYXRvcj8KKwkJaWYgKHJldFZhbHVlID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQkvLyBDcmVhdGUgb25lIHRoZW4KKwkJCXJldFZhbHVlID0gbmV3IERlY29yYXRvckRpc3BsYXlEYXRhKCk7CisJCQlkZWNvcmF0b3JUb0RlY29yYXRvckRpc3BsYXlEYXRhTWFwLnB1dChkZWNvcmF0b3IsIHJldFZhbHVlKTsKKworCQkJaWYgKGRlY29yYXRvci5nZXRMYWJlbHNUb1VwZGF0ZSgpID09IG51bGwKKwkJCQkJfHwgZGVjb3JhdG9yLmdldExhYmVsc1RvVXBkYXRlKCkuaXNFbXB0eSgpKSB7CisJCQkJcmV0dXJuIHJldFZhbHVlOworCQkJfQorCisJCQkvLyBHZXQgdGhlIHJlbGF0aXZlIHZhbHVlIHByb3ZpZGVyIGFkYXB0ZXIgdGhhdCB3ZSdsbCB1c2UgZm9yIGFsbCBvZgorCQkJLy8gdGhlIGRlY29yYXRvcidzIGxhYmVscy4gV2Ugb25seSBnZXQgaXQgb25jZSBiZWNhdXNlIGl0IGlzCisJCQkvLyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgc2luZ2xldG9uIHBhdHRlcm4gc28gd2UnbGwgYWx3YXlzIGdldCB0aGUKKwkJCS8vIHNhbWUgb25lLgorCQkJZmluYWwgRHluYW1pY05vZGVMYWJlbCBmaXJzdE5vZGVMYWJlbCA9IChEeW5hbWljTm9kZUxhYmVsKSBkZWNvcmF0b3IKKwkJCQkJLmdldExhYmVsc1RvVXBkYXRlKCkuZ2V0KDApOworCQkJLy8gV2FzIHRoZXJlIGEgbGFiZWwgdG8gdXBkYXRlPworCQkJaWYgKGZpcnN0Tm9kZUxhYmVsICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQkvLyBHZXQgdGhlIHJlbGF0aXZlIHZhbHVlIGZyb20gdGhlIGR5bmFtaWMgbGFiZWwKKwkJCQlmaW5hbCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyIHJ2cCA9IChSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyKSBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkJLmFkYXB0KGZpcnN0Tm9kZUxhYmVsLCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIuY2xhc3MpOworCQkJCWlmKHJ2cCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJCQlyZXRWYWx1ZS5zZXRSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyKHJ2cCk7CisKKwkJCQlmaW5hbCBOb2RlIG5vZGUgPSBmaXJzdE5vZGVMYWJlbC5nZXROb2RlKCk7CisJCQkJLy8gU3RyaW5nIG5vZGVUaXRsZSA9IG5vZGUuZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCk7CisKKwkJCQlmaW5hbCBMYXRMb25nUHJvdmlkZXJBZGFwdGVyIGxhdExvbmdQcm92aWRlciA9IChMYXRMb25nUHJvdmlkZXJBZGFwdGVyKSBMYXRMb25nUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkJLmFkYXB0KG5vZGUsIExhdExvbmdQcm92aWRlci5jbGFzcyk7CisJCQkJcmV0VmFsdWUuc2V0TGF0TG9uZ1Byb3ZpZGVyQWRhcHRlcihsYXRMb25nUHJvdmlkZXIpOworCQkJfSAvLyBpZiB0aGVyZSBpcyBhIGxhYmVsCisKKwkJCWZvciAoZmluYWwgT2JqZWN0IGVsZW1lbnQgOiBkZWNvcmF0b3IuZ2V0TGFiZWxzVG9VcGRhdGUoKSkgeworCQkJCWZpbmFsIER5bmFtaWNOb2RlTGFiZWwgbm9kZUxhYmVsID0gKER5bmFtaWNOb2RlTGFiZWwpIGVsZW1lbnQ7CisJCQkJcmV0VmFsdWUuYWRkTGFiZWwobm9kZUxhYmVsKTsKKwkJCX0gLy8gZm9yCisKKwkJfSAvLyBpZiBubyBpbnN0YW5jZQorCisJCS8vIERvZXMgdGhlIGluc3RhbmNlIGhhdmUgYWxsIG9mIGl0J3MgbGF0L2xvbmcgZGF0YSByZXRyaWV2ZWQgeWV0PworCQlpZiAoIXJldFZhbHVlLmhhc0FsbExhdExvbmcoKSkgeworCQkJLy8gTm8KKwkJCS8vIFRyeSB0byBnZXQgaXQKKwkJCW1vbml0b3Iuc3ViVGFzayhkZWNvcmF0b3IuZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCkpOworCQkJcmV0VmFsdWUudXBkYXRlTGF0TG9uZyhtb25pdG9yKTsKKwkJfSAvLyBpZiBtaXNzaW5nIGxhdC9sb25nCisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0RGVjb3JhdG9yRGlzcGxheURhdGEKKworCXByb3RlY3RlZCBTdGVtUG9seWdvbnNMaXN0IGNyZWF0ZVBvbHlnb25zVG9EcmF3KAorCQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCXJldHVybiBjcmVhdGVQb2x5Z29uc1RvRHJhdyhvcHRpb25zQmFyLmdldFNlbGVjdGVkRGVjb3JhdG9yKCksIG9wdGlvbnNCYXIuZ2V0U2VsZWN0ZWRQb3B1bGF0aW9uSWRlbnRpZmllcigpLCBtb25pdG9yKTsKKwl9IC8vIGNyZWF0ZVBvbHlnb25zVG9EcmF3CisKKwkvKioKKwkgKiBUaGlzIHJ1bnMgaW4gdGhlIGJhY2tncm91bmQge0BsaW5rIEpvYn0gY3JlYXRlZCBpbgorCSAqIHtAbGluayAjcmVmcmVzaE1hcENhbnZhcygpfS4KKwkgKiAKKwkgKiBAcGFyYW0gc2VsZWN0ZWREZWNvcmF0b3IKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgRGVjb3JhdG9yfSB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3RlZCBwcm9wZXJ0eS4KKwkgKiBAcGFyYW0gc2VsZXRlZFBvcHVsYXRpb25JZGVudGlmaWVyIFRoZSBzZWxlY3RlZCBwb3B1bGF0aW9uIGlkZW50aWZpZXIKKwkgKiBAcGFyYW0gc2VsZWN0ZWRQcm9wZXJ0eQorCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG9mIHRoZSBzZWxlY3RlZCB7QGxpbmsgRGVjb3JhdG9yfSB0byB2aXN1YWxpemUKKwkgKiBAcGFyYW0gbW9uaXRvcgorCSAqICAgICAgICAgICAgcHJvZ3Jlc3MgbW9uaXRvciBmb3Igb2J0YWluaW5nIHRoZSBwb2x5Z29ucworCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHBvbHlnb24gdmFsdWVzIHRvIHJlbmRlciBpbiB0aGUKKwkgKiAgICAgICAgIHtAbGluayAjbWFwQ2FudmFzfQorCSAqLworCVN0ZW1Qb2x5Z29uc0xpc3QgY3JlYXRlUG9seWdvbnNUb0RyYXcoZmluYWwgRGVjb3JhdG9yIHNlbGVjdGVkRGVjb3JhdG9yLCBTdHJpbmcgc2VsZWN0ZWRQb3B1bGF0aW9uSWRlbnRpZmllciwKKwkJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlmaW5hbCBTdGVtUG9seWdvbnNMaXN0IHJldFZhbHVlID0gbmV3IFN0ZW1Qb2x5Z29uc0xpc3QoKTsKKworCQkvLyBJcyB0aGVyZSBhIGRlY29yYXRvciBzZWxlY3RlZD8KKwkJaWYgKHNlbGVjdGVkRGVjb3JhdG9yICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJLy8gR2V0IHRoZSBkaXNwbGF5IGRhdGEgZm9yIHRoaXMgZGVjb3JhdG9yCisJCQlmaW5hbCBEZWNvcmF0b3JEaXNwbGF5RGF0YSBkaXNwbGF5RGF0YSA9IGdldERlY29yYXRvckRpc3BsYXlEYXRhKAorCQkJCQlzZWxlY3RlZERlY29yYXRvciwgbW9uaXRvcik7CisJCQkKKwkJCWlmKGRpc3BsYXlEYXRhID09IG51bGwpIHJldHVybiBudWxsOworCQkJZmluYWwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciBydnAgPSBkaXNwbGF5RGF0YQorCQkJCQkuZ2V0UmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcigpOworCQkJaWYocnZwID09IG51bGwpIHJldHVybiBudWxsOworCQkJCisJCQltb25pdG9yLmJlZ2luVGFzayhzZWxlY3RlZERlY29yYXRvci5nZXREdWJsaW5Db3JlKCkuZ2V0VGl0bGUoKSwKKwkJCQkJZGlzcGxheURhdGEuZ2V0TGFiZWxEYXRhKCkuc2l6ZSgpKTsKKworCQkJZm9yIChmaW5hbCBEZWNvcmF0b3JEaXNwbGF5RGF0YS5MYWJlbERhdGEgbGFiZWxEYXRhIDogZGlzcGxheURhdGEKKwkJCQkJLmdldExhYmVsRGF0YSgpKSB7CisKKwkJCQkvLyBDaGVjayB0aGF0IHRoZSBwb3B1bGF0aW9uIGlkZW50aWZpZXIgbWF0Y2hlcy4gSWYgbm90LCBza2lwIGl0CisJCQkJRHluYW1pY05vZGVMYWJlbCBsYWIgPSBsYWJlbERhdGEuZ2V0TGFiZWwoKTsKKwkJCQlpZihsYWIgaW5zdGFuY2VvZiBEaXNlYXNlTW9kZWxMYWJlbCAmJiAKKwkJCQkJCSEoKERpc2Vhc2VNb2RlbExhYmVsKWxhYikuZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpLmVxdWFscyhzZWxlY3RlZFBvcHVsYXRpb25JZGVudGlmaWVyKSkgY29udGludWU7CisJCQkJCisJCQkJaWYobGFiIGluc3RhbmNlb2YgUG9wdWxhdGlvbk1vZGVsTGFiZWwgJiYgCisJCQkJCQkhKChQb3B1bGF0aW9uTW9kZWxMYWJlbClsYWIpLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkuZXF1YWxzKHNlbGVjdGVkUG9wdWxhdGlvbklkZW50aWZpZXIpKSBjb250aW51ZTsKKwkJCQkKKwkJCQkvLyBUaGlzIGlzIHRoZSBJZGVudGlmaWFibGUgdGhhdCB3aWxsIHByb2R1Y2UgdGhlIGxhdC9sb25nIGRhdGEKKwkJCQkvLyAoaWYgYXZhaWxhYmxlKS4KKwkJCQlmaW5hbCBJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlID0gbGFiZWxEYXRhLmdldExhYmVsKCkKKwkJCQkJCS5nZXRJZGVudGlmaWFibGUoKTsKKworCQkJCW1vbml0b3Iuc3ViVGFzayhpZGVudGlmaWFibGUuZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCkpOworCisJCQkJZmluYWwgTGF0TG9uZyBsYXRMb25nID0gbGFiZWxEYXRhLmdldExhdExvbmdEYXRhKCk7CisJCQkJLy8gQW55IGxhdC9sb25nIGRhdGEgZm9yIHRoaXMgbGFiZWw/CisJCQkJaWYgKGxhdExvbmcuc2l6ZSgpID4gMCkgeworCQkJCQkvLyBZZXMKKwkJCQkJZmluYWwgU3RlbVBvbHlnb25zTGlzdCBzdGVtUG9seWdvbnNMaXN0ID0gZ2V0U3RlbVBvbHlnb25zTGlzdCgKKwkJCQkJCQlsYXRMb25nLCBpZGVudGlmaWFibGUsIHJ2cCwgbGFiZWxEYXRhKTsKKworCQkJCQkvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3Qgb2YgcG9seWdvbnMgdG8gYmUgZHJhd24KKwkJCQkJcmV0VmFsdWUuYWRkQWxsKHN0ZW1Qb2x5Z29uc0xpc3QpOworCQkJCX0gLy8gaWYgQW55IGxhdC9sb25nIGRhdGEgZm9yIHRoaXMgbGFiZWwKKwkJCQltb25pdG9yLndvcmtlZCgxKTsKKworCQkJfSAvLyBmb3IgZWFjaCBMYWJlbERhdGEKKworCQkJaWYgKHNlbGVjdGVkRWRnZSAhPSBudWxsICYmICFzZWxlY3RlZEVkZ2UuZXF1YWxzKCIiKSkgeworCisJCQkJZmluYWwgTGlzdDxVUkk+IGVkZ2VUeXBlcyA9IG5ldyBMaW5rZWRMaXN0PFVSST4oKTsKKworCQkJCWZpbmFsIEdyYXBoIGdyYXBoID0gc2VsZWN0ZWREZWNvcmF0b3IuZ2V0R3JhcGgoKTsKKwkJCQlmaW5hbCBFTWFwPFVSSSwgRWRnZT4gYWxsRWRnZXMgPSBncmFwaC5nZXRFZGdlcygpOworCQkJCWZpbmFsIEl0ZXJhdG9yPFVSST4gaXRlciA9IGFsbEVkZ2VzLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCQkJZmluYWwgTGlzdDxFZGdlPiBlZGdlcyA9IG5ldyBBcnJheUxpc3Q8RWRnZT4oKTsKKwkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCQkJZmluYWwgVVJJIHVyaSA9IGl0ZXIubmV4dCgpOworCQkJCQlpZiAoZWRnZVR5cGVzLmNvbnRhaW5zKHVyaSkpIHsKKwkJCQkJCWVkZ2VUeXBlcy5hZGQodXJpKTsKKwkJCQkJfQorCQkJCQlpZiAodXJpLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChzZWxlY3RlZEVkZ2UpKSB7CisJCQkJCQllZGdlcy5hZGQoYWxsRWRnZXMuZ2V0KHVyaSkpOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKCFlZGdlcy5pc0VtcHR5KCkpIHsKKwkJCQkJZmluYWwgSXRlcmF0b3I8RWRnZT4gZWRnZXNJdGVyID0gZWRnZXMuaXRlcmF0b3IoKTsKKwkJCQkJZmluYWwgTGlzdDxVUkk+IGFkZGVkRWRnZXMgPSBuZXcgQXJyYXlMaXN0PFVSST4oKTsKKwkJCQkJd2hpbGUgKGVkZ2VzSXRlci5oYXNOZXh0KCkpIHsKKwkJCQkJCWZpbmFsIEVkZ2UgbmV4dEVkZ2UgPSBlZGdlc0l0ZXIubmV4dCgpOworCisJCQkJCQlmaW5hbCBOb2RlIG5vZGVBID0gbmV4dEVkZ2UuZ2V0QSgpOworCQkJCQkJZmluYWwgTm9kZSBub2RlQiA9IG5leHRFZGdlLmdldEIoKTsKKwkJCQkJCWlmIChub2RlQSA9PSBudWxsIHx8IG5vZGVCID09IG51bGwpIHsKKwkJCQkJCQkvLyBDb21tZW50ZWQgb3V0IDQvMi8yMDA5IHNpbmNlIGl0IGlzIHBvc3NpYmxlIAorCQkJCQkJCS8vIHRoYXQgZWRnZXMgZm9yIGFpciB0cmFuc3BvcnQgaGFzIGEgbWlzc2luZyBub2RlIGlmIAorCQkJCQkJCS8vIGEgc3ViIG1vZGVsIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgc2NlbmFyaW8KKwkJCQkJCQkvKmZpbmFsIFN0cmluZ0J1ZmZlciBtaXNzaW5nRWRnZVJlcG9ydCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCQkJCQltaXNzaW5nRWRnZVJlcG9ydAorCQkJCQkJCQkJLmFwcGVuZCgiVGhlIGZvbGxvd2luZyBlZGdlIGhhcyBhIG1pc3Npbmcgbm9kZTpcbiIpOworCQkJCQkJCW1pc3NpbmdFZGdlUmVwb3J0LmFwcGVuZCgiIEVkZ2UgVVJJOiAiCisJCQkJCQkJCQkrIG5leHRFZGdlLmdldFVSSSgpICsgIlxuIik7CisJCQkJCQkJaWYgKG5vZGVBID09IG51bGwgJiYgbm9kZUIgPT0gbnVsbCkgeworCQkJCQkJCQltaXNzaW5nRWRnZVJlcG9ydC5hcHBlbmQoIiBNaXNzaW5nIE5vZGU6IEJvdGgiKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQltaXNzaW5nRWRnZVJlcG9ydC5hcHBlbmQoIiBNaXNzaW5nIE5vZGU6ICIKKwkJCQkJCQkJCQkrIChub2RlQSA9PSBudWxsID8gIkEiIDogIkIiKSk7CisJCQkJCQkJCW1pc3NpbmdFZGdlUmVwb3J0LmFwcGVuZCgiIE5vbi1taXNzaW5nIE5vZGU6ICIKKwkJCQkJCQkJCQkrIChub2RlQSA9PSBudWxsID8gIkIiIDogIkEiKSk7CisJCQkJCQkJfQorCQkJCQkJCUFjdGl2YXRvci5sb2dFcnJvcihtaXNzaW5nRWRnZVJlcG9ydC50b1N0cmluZygpLAorCQkJCQkJCQkJbnVsbCk7CisJCQkJCQkJKi8KKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKworCQkJCQkJZmluYWwgU3RyaW5nIG5vZGVBSVNPS2V5ID0gbm9kZUEuZ2V0VVJJKCkubGFzdFNlZ21lbnQoKTsKKwkJCQkJCWRvdWJsZVtdIGNlbnRlckEgPSBHZW9ncmFwaGljQ2VudGVycworCQkJCQkJCQkuZ2V0Q2VudGVyKG5vZGVBSVNPS2V5KTsKKworCQkJCQkJLy8gRGlkIHdlIGdldCBpdD8KKwkJCQkJCWlmIChjZW50ZXJBID09IG51bGwpIHsKKwkJCQkJCQkvLyBObworCQkJCQkJCS8vIENvbXB1dGUgdGhlIGxhdC9sb25nIG9mIHRoZSBjZW50ZXIgb2YgdGhlIG5vZGUKKwkJCQkJCQlmaW5hbCBMYXRMb25nUHJvdmlkZXJBZGFwdGVyIGxhdExvbmdQcm92aWRlckEgPSAoTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlcikgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkJCQkJCS5hZGFwdChub2RlQSwgTGF0TG9uZ1Byb3ZpZGVyLmNsYXNzKTsKKwkJCQkJCQlsYXRMb25nUHJvdmlkZXJBLnNldFRhcmdldChub2RlQSk7CisJCQkJCQkJY2VudGVyQSA9IGxhdExvbmdQcm92aWRlckEuZ2V0Q2VudGVyKCk7CisJCQkJCQl9IC8vIGlmCisKKwkJCQkJCWZpbmFsIFN0cmluZyBub2RlQklTT0tleSA9IG5vZGVCLmdldFVSSSgpLmxhc3RTZWdtZW50KCk7CisJCQkJCQlkb3VibGVbXSBjZW50ZXJCID0gR2VvZ3JhcGhpY0NlbnRlcnMKKwkJCQkJCQkJLmdldENlbnRlcihub2RlQklTT0tleSk7CisJCQkJCQkvLyBEaWQgd2UgZ2V0IGl0PworCQkJCQkJaWYgKGNlbnRlckIgPT0gbnVsbCkgeworCQkJCQkJCS8vIE5vCisKKwkJCQkJCQkvLyBHZXQgdGhlIGxhdC9sb25nIG9mIHRoZSBjZW50ZXIgb2YgdGhlIG5vZGUKKwkJCQkJCQlmaW5hbCBMYXRMb25nUHJvdmlkZXJBZGFwdGVyIGxhdExvbmdQcm92aWRlckIgPSAoTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlcikgTGF0TG9uZ1Byb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkJCQkJCS5hZGFwdChub2RlQiwgTGF0TG9uZ1Byb3ZpZGVyLmNsYXNzKTsKKwkJCQkJCQlsYXRMb25nUHJvdmlkZXJCLnNldFRhcmdldChub2RlQik7CisJCQkJCQkJY2VudGVyQiA9IGxhdExvbmdQcm92aWRlckIuZ2V0Q2VudGVyKCk7CisJCQkJCQl9IC8vIGlmIGNlbnRlckIKKworCQkJCQkJaWYgKGNlbnRlckEgPT0gbnVsbCB8fCBjZW50ZXJCID09IG51bGwpIHsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKworCQkJCQkJZmluYWwgZG91YmxlW11bXSBkYXRhID0gbmV3IGRvdWJsZVsyXVsyXTsKKworCQkJCQkJZGF0YVswXVswXSA9IGNlbnRlckFbMF07CisJCQkJCQlkYXRhWzBdWzFdID0gY2VudGVyQVsxXTsKKwkJCQkJCWRhdGFbMV1bMF0gPSBjZW50ZXJCWzBdOworCQkJCQkJZGF0YVsxXVsxXSA9IGNlbnRlckJbMV07CisKKwkJCQkJCWlmICghYWRkZWRFZGdlcy5jb250YWlucyhuZXh0RWRnZS5nZXRVUkkoKSkpIHsKKwkJCQkJCQlmaW5hbCBTZWdtZW50IGVkZ2VTZWdtZW50ID0gbmV3IFNlZ21lbnQoZGF0YSk7CisJCQkJCQkJZmluYWwgU3RlbVBvbHlnb24gc3RlbVBvbHlnb24gPSBuZXcgU3RlbVBvbHlnb24oCisJCQkJCQkJCQllZGdlU2VnbWVudCwgbmV4dEVkZ2UpOworCQkJCQkJCXJldFZhbHVlLmFkZChzdGVtUG9seWdvbik7CisJCQkJCQkJYWRkZWRFZGdlcy5hZGQobmV4dEVkZ2UuZ2V0VVJJKCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IC8vIGlmIHRoZXJlIGEgZGVjb3JhdG9yIGFuZCBhIGN1cnJlbnRseSBzZWxlY3RlZCBwcm9wZXJ0eQorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9Ly8gY3JlYXRlUG9seWdvbnNUb0RyYXcKKworCS8qKgorCSAqIEBwYXJhbSBsYXRMb25nCisJICogQHBhcmFtIHJ2cAorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIFN0ZW1Qb2x5Z29uc0xpc3QgZ2V0U3RlbVBvbHlnb25zTGlzdChmaW5hbCBMYXRMb25nIGxhdExvbmcsCisJCQlmaW5hbCBJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlLAorCQkJZmluYWwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciBydnAsCisJCQlmaW5hbCBEZWNvcmF0b3JEaXNwbGF5RGF0YS5MYWJlbERhdGEgbGFiZWxEYXRhKSB7CisKKwkJU3RlbVBvbHlnb25zTGlzdCByZXRWYWx1ZSA9IHBvbHlnb25MaXN0TWFwLmdldChsYXRMb25nKTsKKwkJcnZwLnNldFRhcmdldChsYWJlbERhdGEuZ2V0TGFiZWwoKSk7CisJCS8vIGZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3Igc2VsZWN0ZWRQcm9wZXJ0eSA9CisJCS8vIG51bGw7Ly9ib3R0b21Db21wb3NpdGUuZ2V0CisJCS8vIERpZCB3ZSBmaW5kIGEgcHJldmlvdXNseSBnZW5lcmF0ZWQgcG9seWdvbiBsaXN0PworCQlpZiAocmV0VmFsdWUgPT0gbnVsbCkgeworCQkJLy8gLy8gTm8KKwkJCS8vIC8vIEFsbG9jYXRlIGEgbWFwcGluZyBiZXR3ZWVuIHRoZSBwcm9wZXJ0eSBuYW1lcyBhbmQgdGhlaXIKKwkJCS8vIC8vIHJlbGF0aXZlIHZhbHVlcy4KKwkJCS8vIGZpbmFsIE1hcDxTdHJpbmcsIERvdWJsZT4gcmVsYXRpdmVWYWx1ZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywKKwkJCS8vIERvdWJsZT4oKTsKKwkJCS8vCisJCQkvLyAvLyBGaXJzdCBwdXQgdGhlIFNlbGVjdGVkIHByb3BlcnR5IGluIHRoZSB2YWx1ZU1hcCB0bworCQkJLy8gLy8gZGlzcGxheQorCQkJLy8gcmVsYXRpdmVWYWx1ZU1hcC5wdXQoc2VsZWN0ZWRQcm9wZXJ0eQorCQkJLy8gLmdldERpc3BsYXlOYW1lKHNlbGVjdGVkUHJvcGVydHkpLCBuZXcgRG91YmxlKHJ2cAorCQkJLy8gLmdldFJlbGF0aXZlVmFsdWUoc2VsZWN0ZWRQcm9wZXJ0eSkpKTsKKworCQkJLy8gQXJlIHdlIGluIG11bHRpY29sb3IgZGlzcGxheSBtb2RlPworCQkJLy8gaWYgKGZhbHNlIC8qIG1hcENhbnZhcy5lbmFibGVNdWx0aUNvbG9yTW9kZSAqLykgeworCQkJLy8gLy8gWWVzCisJCQkvLyAvLyBBZGQgYWxsIHJlbGF0aXZlIHZhbHVlcyBieSBwcm9wZXJ0eSBhdHRyaWJ1dGUga2V5CisJCQkvLyBmaW5hbCBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wZXJ0aWVzID0gcnZwCisJCQkvLyAuZ2V0UHJvcGVydGllcygpOworCQkJLy8gLy8gSkhLIHdlIGRvbid0IG5lZWQgdG8gYWRkIHRoZSBzZWxlY3RlZCBvbmUgc2VwYXJhdGVseQorCQkJLy8gLy8gYWJvdmUgYXMgdGhlIGNvZGUgYmVsb3cgc2hvdWxkIGdldCBpdCBhcyB3ZWxsIC0gY2hlY2sKKwkJCS8vIC8vIHRoaXMuLi4KKwkJCS8vIGFzc2VydCAocHJvcGVydGllcy5jb250YWlucyhzZWxlY3RlZFByb3BlcnR5KSk7CisJCQkvLyAvLyBBZGQgQUxMIHRoZSBwcm9wZXJ0aWVzIGZvciBNdWx0aUNvbG9yIERpc3BsYXkgTW9kZQorCQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7CisJCQkvLyBmaW5hbCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGl0ZW1LZXkgPSAoSXRlbVByb3BlcnR5RGVzY3JpcHRvcikKKwkJCS8vIHByb3BlcnRpZXMKKwkJCS8vIC5nZXQoaSk7CisJCQkvLyBrZXkgPSBpdGVtS2V5LmdldERpc3BsYXlOYW1lKGl0ZW1LZXkpOworCQkJLy8gcmVsYXRpdmVWYWx1ZSA9IG5ldyBEb3VibGUocnZwLmdldFJlbGF0aXZlVmFsdWUoaXRlbUtleSkpOworCQkJLy8gdmFsdWVNYXAucHV0KGtleSwgcmVsYXRpdmVWYWx1ZSk7CisJCQkvLyB9IC8vIGZvciBhbGwgcHJvcGVydGllcworCQkJLy8gfSAvLyBpZiBtdWx0aSBjb2xvciBtb2RlCisKKwkJCS8vIGNyZWF0aW5nIHRoZSBwb2x5Z29uIGZyb20gdGhhdCBsYWJlbAorCQkJcmV0VmFsdWUgPSBuZXcgU3RlbVBvbHlnb25zTGlzdChsYXRMb25nLCAvLyByZWxhdGl2ZVZhbHVlTWFwLAorCQkJCQlpZGVudGlmaWFibGUpOworCQkJcG9seWdvbkxpc3RNYXAucHV0KGxhdExvbmcsIHJldFZhbHVlKTsKKwkJfSAvLyBpZiBkaWRuJ3QgZmluZCBnZW5lcmF0ZWQgaW5zdGFuY2UKKwkJLy8gZWxzZSB7CisJCS8vIC8vIFVwZGF0ZSB0aGUgcmVsYXRpdmUgdmFsdWVzIG9mIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSB2YWx1ZSBtYXAKKwkJLy8gcmV0VmFsdWUuY2xlYXJSZWxhdGl2ZVZhbHVlcygpOworCQkvLyByZXRWYWx1ZS5hZGRSZWxhdGl2ZVZhbHVlKHNlbGVjdGVkUHJvcGVydHkKKwkJLy8gLmdldERpc3BsYXlOYW1lKHNlbGVjdGVkUHJvcGVydHkpLCBuZXcgRG91YmxlKHJ2cAorCQkvLyAuZ2V0UmVsYXRpdmVWYWx1ZShzZWxlY3RlZFByb3BlcnR5KSkpOworCQkvLyB9IC8vIGVsc2UKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0U3RlbVBvbHlnb25zTGlzdAorCisJLyoqCisJICogVGhlIG1ldGhvZCB3aWxsIHJldHVybiB0aGUge0BsaW5rIEdlb2dyYXBoaWNSZW5kZXJlcn0gdXNlZCBieSB0aGlzCisJICogb2JqZWN0LgorCSAqIAorCSAqIEByZXR1cm4gVGhlIEdlb2dyYXBoaWNSZW5kZXJlciB1c2VkIGJ5IHRoaXMgb2JqZWN0CisJICogQHNlZSBHZW9ncmFwaGljUmVuZGVyZXIKKwkgKi8KKwlwdWJsaWMgR2VvZ3JhcGhpY1JlbmRlcmVyIGdldEdlb2dyYXBoaWNSZW5kZXJlcigpIHsKKwkJcmV0dXJuIGdlb2dyYXBoaWNSZW5kZXJlcjsKKwl9IC8vIGdldEdlb2dyYXBoaWNSZW5kZXJlcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLklDb2xvclByb3ZpZGVyQ2hhbmdlZExpc3RlbmVyI2NvbG9yUHJvdmlkZXJDaGFuZ2VkKGphdmEubGFuZy5DbGFzcykKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb2xvclByb3ZpZGVyQ2hhbmdlZChmaW5hbCBDbGFzcyBzZWxlY3RlZENvbG9yUHJvdmlkZXIpIHsKKwkJZmluYWwgRGVjb3JhdG9yIGRlY29yYXRvciA9IG9wdGlvbnNCYXIuZ2V0U2VsZWN0ZWREZWNvcmF0b3IoKTsKKwkJCisJCWlmKGRlY29yYXRvciA9PSBudWxsKSByZXR1cm47CisJCWZpbmFsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJLmdldEZhY3RvcnlGb3JUeXBlKHNlbGVjdGVkQ29sb3JQcm92aWRlcik7CisJCWZpbmFsIEFkYXB0ZXIgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGRlY29yYXRvci5nZXRHcmFwaCgpLAorCQkJCXNlbGVjdGVkQ29sb3JQcm92aWRlcik7CisJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgQ29sb3JQcm92aWRlckFkYXB0ZXIpIHsKKwkJCWNvbG9yUHJvdmlkZXJBZGFwdGVyID0gKENvbG9yUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyOworCQkJY29sb3JQcm92aWRlckFkYXB0ZXIuc2V0U2VsZWN0ZWREZWNvcmF0b3Iob3B0aW9uc0JhcgorCQkJCQkuZ2V0U2VsZWN0ZWREZWNvcmF0b3IoKSk7CisJCQljb2xvclByb3ZpZGVyQWRhcHRlci5zZXRTZWxlY3RlZFBvcHVsYXRpb25JZGVudGlmaWVyKG9wdGlvbnNCYXIuZ2V0U2VsZWN0ZWRQb3B1bGF0aW9uSWRlbnRpZmllcigpKTsKKwkJCWdlb2dyYXBoaWNSZW5kZXJlci5zZXRDb2xvclByb3ZpZGVyQWRhcHRlcihjb2xvclByb3ZpZGVyQWRhcHRlcik7CisJCQlsYXlvdXQoKTsKKwkJfQorCX0gLy8gY29sb3JQcm92aWRlckNoYW5nZWQKK30gLy8gR2VvZ3JhcGhpY0NvbnRyb2wKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9HZW9ncmFwaGljQ29udHJvbEZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9HZW9ncmFwaGljQ29udHJvbEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Q2OWU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL0dlb2dyYXBoaWNDb250cm9sRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8vIEdlb2dyYXBoaWNDb250cm9sRmFjdG9yeS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgZmFjdG9yaWVzIHRoYXQgY3JlYXRlIGluc3RhbmNlcyBvZgorICoge0BsaW5rIEdlb2dyYXBoaWNDb250cm9sfS4KKyAqLworcHVibGljIGludGVyZmFjZSBHZW9ncmFwaGljQ29udHJvbEZhY3RvcnkgeworCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvZiB0aGUgY29udHJvbAorCSAqIEByZXR1cm4gYSBuZXcge0BsaW5rIEdlb2dyYXBoaWNDb250cm9sfSBpbnN0YW5jZS4KKwkgKi8KKwlHZW9ncmFwaGljQ29udHJvbCBjcmVhdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCk7CisKK30gLy8gR2VvZ3JhcGhpY0NvbnRyb2xGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvR2VvZ3JhcGhpY1JlbmRlcmVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvR2VvZ3JhcGhpY1JlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhZDFiMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9HZW9ncmFwaGljUmVuZGVyZXIuamF2YQpAQCAtMCwwICsxLDQzNiBAQAorLy8gR2VvZ3JhcGhpY1JlbmRlcmVyLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuYXd0LkJhc2ljU3Ryb2tlOworaW1wb3J0IGphdmEuYXd0LlN0cm9rZTsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CisKK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0Lk51bWJlckZvcm1hdHRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLkNvbG9yUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5TdGVtUG9seWdvbnNMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgZXh0ZW5kZWQgYnkgY2xhc3NlcyB0aGF0IHJlbmRlciBnZW9ncmFwaGljIChsYXQvbG9uZykgZGF0YSBpbnRvCisgKiBhIHZpc3VhbCByZXByZXNlbnRhdGlvbi4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEdlb2dyYXBoaWNSZW5kZXJlciBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzCisJCUlTZWxlY3Rpb25Qcm92aWRlciB7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBJTklUSUFMX0dBSU5fRkFDVE9SID0gMS4wZjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU5JVElBTF9EUkFXX1BPTFlHT05fQk9SREVSUyA9IHRydWU7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElOSVRJQUxfVVNFX0xPR19TQ0FMSU5HID0gdHJ1ZTsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVJHSU5fSEVJR0hUID0gNTsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVJHSU5fV0lEVEggPSA1OworCisJcHJpdmF0ZSBzdGF0aWMgTnVtYmVyRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBOdW1iZXJGb3JtYXR0ZXIoKTsKKworCXByb3RlY3RlZCBib29sZWFuIGRyYXdQb2x5Z29uQm9yZGVycyA9IElOSVRJQUxfRFJBV19QT0xZR09OX0JPUkRFUlM7CisJcHJvdGVjdGVkIFN0cm9rZSBwb2x5Z29uU3Ryb2tlID0gbmV3IEJhc2ljU3Ryb2tlKDFmKTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2dTY2FsaW5nID0gSU5JVElBTF9VU0VfTE9HX1NDQUxJTkc7CisJcHJvdGVjdGVkIGZsb2F0IGdhaW5GYWN0b3IgPSBJTklUSUFMX0dBSU5fRkFDVE9SOworCisJcHJpdmF0ZSBHYWluRmFjdG9yQWN0aW9uIGRlZmF1bHRHYWluRmFjdG9yQWN0aW9uOworCUdhaW5GYWN0b3JBY3Rpb24gbGFzdEdhaW5GYWN0b3JBY3Rpb247CisJcHJpdmF0ZSBMb2dhcml0aG1pY0FjdGlvbiBsb2dhcml0aG1pY0FjdGlvbjsKKwlwcml2YXRlIERyYXdQb2x5Z29uQm9yZGVyc0FjdGlvbiBkcmF3UG9seWdvbkJvcmRlcnNBY3Rpb247CisJCisJcHJvdGVjdGVkIENvbG9yUHJvdmlkZXJBZGFwdGVyIGNvbG9yUHJvdmlkZXJBZGFwdGVyID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjb2xsZWN0aW9uIG9mIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgd2FpdGluZyB0byBiZSB0b2xkIGFib3V0CisJICogc2VsZWN0aW9ucy4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPiBsaXN0ZW5lcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKKworCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247CisKKwkvKioKKwkgKiBAcGFyYW0gcGFyZW50CisJICogQHBhcmFtIHN0eWxlCisJICovCisJcHVibGljIEdlb2dyYXBoaWNSZW5kZXJlcihmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBpbnQgc3R5bGUpIHsKKwkJc3VwZXIocGFyZW50LCBzdHlsZSk7CisJCXRoaXMuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisJCQkvKioKKwkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIjd2lkZ2V0RGlzcG9zZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQpCisJCQkgKi8KKwkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKAorCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgRGlzcG9zZUV2ZW50IGUpIHsKKwkJCQlpZiAoIWlzRGlzcG9zZWQoKSkgeworCQkJCQlkaXNwb3NlKCk7CisJCQkJfQorCQkJfQorCQl9KTsKKwl9IC8vIEdlb2dyYXBoaWNSZW5kZXJlcgorCisJLyoqCisJICogQHBhcmFtIHBvbHlnb25zVG9SZW5kZXIKKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgdm9pZCByZW5kZXIoU3RlbVBvbHlnb25zTGlzdCBwb2x5Z29uc1RvUmVuZGVyKTsKKworCXByb3RlY3RlZCBqYXZhLmF3dC5Db2xvciBnZXRDb2xvckZvclJlbGF0aXZlVmFsdWUoCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJCWZpbmFsIGRvdWJsZSByZWxhdGl2ZVZhbHVlKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0I2Rpc3Bvc2UoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCS8vTm90aGluZyB0byBkbworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCisJCQlmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCisJCQlmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHNlbGVjdGlvbgorCSAqLworCXB1YmxpYyBmaW5hbCBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKKwkJcmV0dXJuIHNlbGVjdGlvbjsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3NldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGZpbmFsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOworCQlmaXJlU2VsZWN0aW9uKHNlbGVjdGlvbik7CisJfQorCisJLyoqCisJICogUGFzcyBhIHtAbGluayBTZWxlY3Rpb25DaGFuZ2VkRXZlbnR9IGFsb25nIHRvIGxpc3RlbmVycy4KKwkgKiAKKwkgKiBAcGFyYW0gc2VsZWN0aW9uCisJICogICAgICAgICAgICB0aGUge0BsaW5rIElTZWxlY3Rpb259IHRvIGJlIGdpdmluZyB0byB0aGUgbGlzdGVuZXJzLgorCSAqLworCXB1YmxpYyB2b2lkIGZpcmVTZWxlY3Rpb24oZmluYWwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKworCQlmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsCisJCQkJc2VsZWN0aW9uKTsKKwkJZm9yIChmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7CisJCQlsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKKwkJfSAvLyBmb3IgZWFjaCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCisJfSAvLyBmaXJlU2VsZWN0aW9uCisKKwkvKioKKwkgKiBSZXNldCB0aGUgcmVuZGVyZXIuCisJICovCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCS8vIFJlc2V0IHRoZSBnYWluIGZhY3RvciBhbmQgdXBkYXRlIHRoZSBjaGVja3MgaW4gdGhlIGNvbnRleHQgbWVudQorCQlsYXN0R2FpbkZhY3RvckFjdGlvbi5zZXRDaGVja2VkKGZhbHNlKTsKKwkJZGVmYXVsdEdhaW5GYWN0b3JBY3Rpb24ucnVuKCk7CisJCWRlZmF1bHRHYWluRmFjdG9yQWN0aW9uLnNldENoZWNrZWQodHJ1ZSk7CisKKwkJdXNlTG9nU2NhbGluZyA9IElOSVRJQUxfVVNFX0xPR19TQ0FMSU5HOworCQlsb2dhcml0aG1pY0FjdGlvbi5zZXRDaGVja2VkKHVzZUxvZ1NjYWxpbmcpOworCisJCWRyYXdQb2x5Z29uQm9yZGVycyA9IElOSVRJQUxfRFJBV19QT0xZR09OX0JPUkRFUlM7CisJCWRyYXdQb2x5Z29uQm9yZGVyc0FjdGlvbi5zZXRDaGVja2VkKGRyYXdQb2x5Z29uQm9yZGVycyk7CisKKwkJLy8gZHJhd1BvbHlnb25DZW50ZXJDb25uZWN0aW9ucyA9CisJCS8vIERFRkFVTFRfRFJBV19QT0xZR09OX0NFTlRFUl9DT05ORUNUSU9OUzsKKwkJLy8gY29ubmVjdFBvbHlnb25DZW50ZXJzQWN0aW9uLnNldENoZWNrZWQoZHJhd1BvbHlnb25DZW50ZXJDb25uZWN0aW9ucyk7CisJfSAvLyByZXNldAorCisJcHJvdGVjdGVkIHZvaWQgc2V0R2FpbkZhY3RvcihmaW5hbCBmbG9hdCBnYWluRmFjdG9yKSB7CisJCXRoaXMuZ2FpbkZhY3RvciA9IGdhaW5GYWN0b3I7CisJfSAvLyBzZXRHYWluRmFjdG9yCisKKwkvKioKKwkgKiBTd2l0Y2ggdGhlIG9wdGlvbiBvZiBkcmF3aW5nIHRoZSBib3JkZXJzIG9mIHBvbHlnb25zIG9uIHRoZSBtYXAuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdG9nZ2xlRHJhd1BvbHlnb25Cb3JkZXJzQ2hvaWNlKCkgeworCQlkcmF3UG9seWdvbkJvcmRlcnMgPSAhZHJhd1BvbHlnb25Cb3JkZXJzOworCQlyZWRyYXcoKTsKKwl9IC8vIHRvZ2dsZURyYXdQb2x5Z29uQm9yZGVyc0Nob2ljZQorCisJLyoqCisJICogU3dpdGNoIHRoZSBvcHRpb24gb2Ygc2NhbGluZyB0aGUgZGlzcGxheSB2YWx1ZXMgbG9ncml0aG1pY2FsbHkuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdG9nZ2xlVXNlTG9nU2NhbGluZygpIHsKKwkJdXNlTG9nU2NhbGluZyA9ICF1c2VMb2dTY2FsaW5nOworCQlyZWRyYXcoKTsKKwl9IC8vIHRvZ2dsZVVzZUxvZ1NjYWxpbmcKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgdmlldydzIGNvbnRleHQgbWVudSBhbmQgYWRkIHRoZSBhY3Rpb24gaGFuZGxlcnMgdG8gaXQuCisJICogQHJldHVybiB0aGUgTWVudU1hbmFnZXIKKwkgKi8KKwlwdWJsaWMgTWVudU1hbmFnZXIgY3JlYXRlQ29udGV4dE1lbnVNYW5hZ2VyKCkgeworCisJCS8vIENvbnRleHQgTWVudQorCQlmaW5hbCBNZW51TWFuYWdlciBjb250ZXh0TWVudU1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyKCk7CisKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChjcmVhdGVHYWluRmFjdG9yTWVudSgpKTsKKworCQlsb2dhcml0aG1pY0FjdGlvbiA9IG5ldyBMb2dhcml0aG1pY0FjdGlvbigpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGxvZ2FyaXRobWljQWN0aW9uKTsKKworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CisJCWRyYXdQb2x5Z29uQm9yZGVyc0FjdGlvbiA9IG5ldyBEcmF3UG9seWdvbkJvcmRlcnNBY3Rpb24oKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChkcmF3UG9seWdvbkJvcmRlcnNBY3Rpb24pOworCisJCS8vIGNvbm5lY3RQb2x5Z29uQ2VudGVyc0FjdGlvbiA9IG5ldyBDb25uZWN0UG9seWdvbkNlbnRlcnNBY3Rpb24oKTsKKwkJLy8gY29udGV4dE1lbnVNYW5hZ2VyLmFkZChjb25uZWN0UG9seWdvbkNlbnRlcnNBY3Rpb24pOworCisJCWNvbnRleHRNZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKKworLy8gRGVmZWN0IDMwMjY2MworLy8JCWNvbnRleHRNZW51TWFuYWdlci5hZGQoY3JlYXRlUmVwb3J0c1NlbGVjdGlvbk1lbnUoKSk7CisJCQorCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChuZXcgUmVzZXRNYXBDYW52YXNBY3Rpb24oKSk7CisKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlyZXR1cm4gY29udGV4dE1lbnVNYW5hZ2VyOworCQkKKwl9IC8vIGNyZWF0ZUNvbnRleHRNZW51CisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBNZW51TWFuYWdlciBjcmVhdGVHYWluRmFjdG9yTWVudSgpIHsKKwkJZmluYWwgTWVudU1hbmFnZXIgZ2FpbkZhY3Rvck1lbnUgPSBuZXcgTWVudU1hbmFnZXIoTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJNYXBNZW51LkdhaW5GYWN0b3IiKSk7CisJCWdhaW5GYWN0b3JNZW51LmFkZChuZXcgR2FpbkZhY3RvckFjdGlvbigwLjAwMSkpOworCQlnYWluRmFjdG9yTWVudS5hZGQobmV3IEdhaW5GYWN0b3JBY3Rpb24oMC4wMSkpOworCQlnYWluRmFjdG9yTWVudS5hZGQobmV3IEdhaW5GYWN0b3JBY3Rpb24oMC4xKSk7CisKKwkJZGVmYXVsdEdhaW5GYWN0b3JBY3Rpb24gPSBuZXcgR2FpbkZhY3RvckFjdGlvbigxLjApOyAvLyBEZWZhdWx0CisJCWxhc3RHYWluRmFjdG9yQWN0aW9uID0gZGVmYXVsdEdhaW5GYWN0b3JBY3Rpb247CisJCWdhaW5GYWN0b3JNZW51LmFkZChkZWZhdWx0R2FpbkZhY3RvckFjdGlvbik7CisKKwkJZ2FpbkZhY3Rvck1lbnUuYWRkKG5ldyBHYWluRmFjdG9yQWN0aW9uKDEwLjApKTsKKwkJZ2FpbkZhY3Rvck1lbnUuYWRkKG5ldyBHYWluRmFjdG9yQWN0aW9uKDEwMC4wKSk7CisJCWdhaW5GYWN0b3JNZW51LmFkZChuZXcgR2FpbkZhY3RvckFjdGlvbigxMDAwLjApKTsKKwkJZ2FpbkZhY3Rvck1lbnUuYWRkKG5ldyBHYWluRmFjdG9yQWN0aW9uKDEwMDAwLjApKTsKKwkJZ2FpbkZhY3Rvck1lbnUuYWRkKG5ldyBHYWluRmFjdG9yQWN0aW9uKDEwMDAwMC4wKSk7CisJCWdhaW5GYWN0b3JNZW51LmFkZChuZXcgR2FpbkZhY3RvckFjdGlvbigxMDAwMDAwLjApKTsKKwkJZ2FpbkZhY3Rvck1lbnUuYWRkKG5ldyBHYWluRmFjdG9yQWN0aW9uKDEwMDAwMDAwLjApKTsKKwkJcmV0dXJuIGdhaW5GYWN0b3JNZW51OworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBNZW51TWFuYWdlciBjcmVhdGVSZXBvcnRzU2VsZWN0aW9uTWVudSgpIHsKKwkJZmluYWwgTWVudU1hbmFnZXIgcmVwb3J0c1NlbGVjdGlvbk1lbnUgPSBuZXcgTWVudU1hbmFnZXIoTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJNYXBNZW51LlJlcG9ydHNfU2VsZWN0IiksICJyZXBvcnRzIik7CisJCXJlcG9ydHNTZWxlY3Rpb25NZW51LmFkZChuZXcgU2VwYXJhdG9yKAorCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CisJCXJldHVybiByZXBvcnRzU2VsZWN0aW9uTWVudTsKKwl9IC8vIGNyZWF0ZVJlcG9ydHNTZWxlY3Rpb25NZW51CisKKwlwcm90ZWN0ZWQgY2xhc3MgR2FpbkZhY3RvckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKwkJcHJpdmF0ZSBmaW5hbCBkb3VibGUgZmFjdG9yOworCisJCUdhaW5GYWN0b3JBY3Rpb24oZmluYWwgZG91YmxlIGZhY3RvcikgeworCQkJc3VwZXIoR2VvZ3JhcGhpY1JlbmRlcmVyLnRoaXMuZ2V0VGV4dChmYWN0b3IpLAorCQkJCQlJQWN0aW9uLkFTX1JBRElPX0JVVFRPTik7CisJCQl0aGlzLmZhY3RvciA9IGZhY3RvcjsKKwkJCXNldENoZWNrZWQoZmFjdG9yID09IElOSVRJQUxfR0FJTl9GQUNUT1IpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gR2VvZ3JhcGhpY1JlbmRlcmVyLnRoaXMuZ2V0VGV4dChmYWN0b3IpOworCQl9IC8vIGdldFRleHQKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJc2V0R2FpbkZhY3RvcigoZmxvYXQpZmFjdG9yKTsKKwkJCWxhc3RHYWluRmFjdG9yQWN0aW9uID0gdGhpczsKKwkJCUNvbXBvc2l0ZSBwYXJlbnQgPSBHZW9ncmFwaGljUmVuZGVyZXIudGhpcy5nZXRQYXJlbnQoKTsKKwkJCSgoR2VvZ3JhcGhpY0NvbnRyb2wpcGFyZW50KS5yZWZyZXNoKCk7IAorCQl9CisKKwl9IC8vIEdhaW5GYWN0b3JBY3Rpb24KKworCVN0cmluZyBnZXRUZXh0KGZpbmFsIGRvdWJsZSBmYWN0b3IpIHsKKwkJU3RyaW5nIHJldFZhbHVlID0gIiI7CisJCXRyeSB7CisJCQlyZXRWYWx1ZSA9IGZvcm1hdHRlci52YWx1ZVRvU3RyaW5nKG5ldyBEb3VibGUoZmFjdG9yKSk7CisJCX0gY2F0Y2ggKGZpbmFsIFBhcnNlRXhjZXB0aW9uIGUpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiUHJvYmxlbSBwYXJzaW5nIGdhaW4gZmFjdG9yIHZhbHVlIFwiIiArIGZhY3RvcgorCQkJCQkrICJcIiIsIGUpOworCQl9CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldFRleHQKKworCXByb3RlY3RlZCBjbGFzcyBMb2dhcml0aG1pY0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKwkJLyoqCisJCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKKwkJICovCisJCXB1YmxpYyBMb2dhcml0aG1pY0FjdGlvbigpIHsKKwkJCXN1cGVyKE1lc3NhZ2VzLmdldFN0cmluZygiTWFwTWVudS5Mb2dyaXRobWljX1NjYWxpbmciKSwKKwkJCQkJSUFjdGlvbi5BU19DSEVDS19CT1gpOworCQkJc2V0Q2hlY2tlZCh1c2VMb2dTY2FsaW5nKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZ2V0VGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCQkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiTWFwTWVudS5Mb2dyaXRobWljX1NjYWxpbmciKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQl0b2dnbGVVc2VMb2dTY2FsaW5nKCk7CisJCQlDb21wb3NpdGUgcGFyZW50ID0gR2VvZ3JhcGhpY1JlbmRlcmVyLnRoaXMuZ2V0UGFyZW50KCk7CisJCQkoKEdlb2dyYXBoaWNDb250cm9sKXBhcmVudCkucmVmcmVzaCgpOyAKKwkJfQorCX0gLy8gTG9nYXJpZ2htaWNBY3Rpb24KKworCXByb3RlY3RlZCBjbGFzcyBEcmF3UG9seWdvbkJvcmRlcnNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisJCS8qKgorCQkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisJCSAqLworCQlwdWJsaWMgRHJhd1BvbHlnb25Cb3JkZXJzQWN0aW9uKCkgeworCQkJc3VwZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJNYXBNZW51LlBvbHlnb25fQm9yZGVycyIpLAorCQkJCQlJQWN0aW9uLkFTX0NIRUNLX0JPWCk7CisJCQkvLyBDaGVja2VkIGluIHRoZSBtZW51PworCQkJaWYgKGRyYXdQb2x5Z29uQm9yZGVycykgeworCQkJCS8vIFllcworCQkJCXNldENoZWNrZWQodHJ1ZSk7CisJCQl9IC8vIGlmCisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI2dldFRleHQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIk1hcE1lbnUuUG9seWdvbl9Cb3JkZXJzIik7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJdG9nZ2xlRHJhd1BvbHlnb25Cb3JkZXJzQ2hvaWNlKCk7CisJCQlDb21wb3NpdGUgcGFyZW50ID0gR2VvZ3JhcGhpY1JlbmRlcmVyLnRoaXMuZ2V0UGFyZW50KCk7CisJCQkoKEdlb2dyYXBoaWNDb250cm9sKXBhcmVudCkucmVmcmVzaCgpOyAKKwkJfQorCX0gLy8gRHJhd1BvbHlnb25Cb3JkZXJzQWN0aW9uCisKKwkvLyBwcm90ZWN0ZWQgY2xhc3MgQ29ubmVjdFBvbHlnb25DZW50ZXJzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKwkvLworCS8vIC8qKgorCS8vICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCS8vICovCisJLy8gcHVibGljIENvbm5lY3RQb2x5Z29uQ2VudGVyc0FjdGlvbigpIHsKKwkvLyBzdXBlcihNZXNzYWdlcy5nZXRTdHJpbmcoIk1hcE1lbnUuUG9seWdvbl9DZW50ZXJzIiksCisJLy8gSUFjdGlvbi5BU19DSEVDS19CT1gpOworCS8vIHNldEVuYWJsZWQoZmFsc2UpOworCS8vIHNldENoZWNrZWQoZHJhd1BvbHlnb25DZW50ZXJDb25uZWN0aW9ucyk7CisJLy8gfQorCS8vCisJLy8gLyoqCisJLy8gKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZ2V0VGV4dCgpCisJLy8gKi8KKwkvLyBAT3ZlcnJpZGUKKwkvLyBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJLy8gcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiTWFwTWVudS5Qb2x5Z29uX0NlbnRlcnMiKTsKKwkvLyB9CisJLy8KKwkvLyAvKioKKwkvLyAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQorCS8vICovCisJLy8gQE92ZXJyaWRlCisJLy8gcHVibGljIHZvaWQgcnVuKCkgeworCS8vIHRvZ2dsZURyYXdQb2x5Z29uc0NlbnRlcnNDb25uZWN0aW9ucygpOworCS8vIH0KKwkvLyB9IC8vIENvbm5lY3RQb2x5Z29uQ2VudGVyc0FjdGlvbgorCisJcHJvdGVjdGVkIGNsYXNzIFJlc2V0TWFwQ2FudmFzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI2dldFRleHQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIk1hcE1lbnUuUmVzZXQiKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQlyZXNldCgpOworCQl9CisJfSAvLyBSZXNldE1hcENhbnZhc0FjdGlvbgorCisJLyoqCisJICogQHBhcmFtIGNvbG9yUHJvdmlkZXIgdGhlIGNvbG9yUHJvdmlkZXIgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0Q29sb3JQcm92aWRlckFkYXB0ZXIoQ29sb3JQcm92aWRlckFkYXB0ZXIgY29sb3JQcm92aWRlcikgeworCQl0aGlzLmNvbG9yUHJvdmlkZXJBZGFwdGVyID0gY29sb3JQcm92aWRlcjsKKwl9Cit9IC8vIEdlb2dyYXBoaWNSZW5kZXJlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL0dlb2dyYXBoaWNWaWV3ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9HZW9ncmFwaGljVmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkOGQzZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9HZW9ncmFwaGljVmlld2VyLmphdmEKQEAgLTAsMCArMSw0MDIgQEAKKy8vIEdlb2dyYXBoaWNWaWV3ZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbk1hbmFnZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uTWFuYWdlckV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSUNvbnRleHRNZW51VXBkYXRlc0xpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuTWFwUmVuZGVyZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CisKKy8qKgorICogVGhpcyBjbGFzcyBwcmVzZW50cyAidmlld3MiIG9mIHRoZSBydW5uaW5nIHNpbXVsYXRpb25zLgorICovCitwdWJsaWMgY2xhc3MgR2VvZ3JhcGhpY1ZpZXdlciBleHRlbmRzIFZpZXdlciBpbXBsZW1lbnRzCisJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyIHsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gb2YKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn1zIHRoYXQgc2hvdWxkIGJlCisJICogZGlzcGxheWVkLgorCSAqLworCXByaXZhdGUgZmluYWwgU2V0PElTaW11bGF0aW9uPiBzaW11bGF0aW9uc1RvRGlzcGxheSA9IG5ldyBMaW5rZWRIYXNoU2V0PElTaW11bGF0aW9uPigpOworCisJLyoqCisJICogVGhpcyBpcyB0aGUge0BsaW5rIFNpbXVsYXRpb25NYW5hZ2VyfSB0aGF0IGlzIHRoZSBpbnB1dCB0byB0aGUgdmlld2VyLiBJdAorCSAqIG1haW50YWlucyBhIGNvbGxlY3Rpb24gb2YgYWN0aXZlCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259cyBpbiB0aGUgc3lzdGVtLgorCSAqIFRoaXMgdmlld2VyIGxpc3RlbnMgdG8gaXQgdG8gZGlzY292ZXIgd2hlbiBuZXcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn1zIGFyZSBjcmVhdGVkIGFuZAorCSAqIG9sZCBvbmVzIGRpc2FwcGVhci4KKwkgKiAKKwkgKiBAc2VlICNzaW11bGF0aW9uc0NoYW5nZWQoU2ltdWxhdGlvbk1hbmFnZXJFdmVudCkKKwkgKi8KKwlwcml2YXRlIFNpbXVsYXRpb25NYW5hZ2VyIHNpbXVsYXRpb25NYW5hZ2VyOworCisJLyoqCisJICogVGhlIDxjb2RlPklkZW50aWZpYWJsZTwvY29kZT4gdGhhdCB3YXMgbW9zdCByZWNlbnRseSBzZWxlY3RlZCBieSBhIHVzZXIKKwkgKiBjbGlja2luZyBvbiBvbmUgb2YgdGhlCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuTWFwQ29udHJvbH1zLCBvcgorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaGFzIGJlZW4gc2VsZWN0ZWQuCisJICovCisJcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB0b3AtbGV2ZWwgY29udHJvbCBvZiB0aGUgdmlld2VyLiBJdCBjb250YWlucyB0aGUKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5NYXBDb250cm9sfXMgdGhhdAorCSAqIGRpc3BsYXkgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259cy4KKwkgKi8KKwlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7CisKKwkvKioKKwkgKiBUaGlzIGZhY3RvcnkgaXMgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHtAbGluayBHZW9ncmFwaGljQ29udHJvbH0gaW4KKwkgKiB0aGUgbWV0aG9kIHtAbGluayAjcG9wdWxhdGVWaWV3KCl9CisJICovCisJcHJpdmF0ZSBHZW9ncmFwaGljQ29udHJvbEZhY3RvcnkgZ2NmOworCisJLyoqCisJICogVGhpcyBpcyBhIGxpc3Qgb2YgbGlzdGVuZXJzIHRvIGdldCBub3RpZmljYXRpb25zIGFib3V0IG5ld2x5IGdlbmVyYXRlZAorCSAqIGNvbnRleHQgbWVudXMuCisJICovCisJcHJpdmF0ZSBMaXN0PElDb250ZXh0TWVudVVwZGF0ZXNMaXN0ZW5lcj4gY29udGV4dE1lbnVVcGRhdGVMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElDb250ZXh0TWVudVVwZGF0ZXNMaXN0ZW5lcj4oKTsKKworCS8qKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIHRoZSBTV1QgcGFyZW50IG9mIHRoZSBjb250cm9sIHRoYXQgbWFrZXMgdXAgdGhlIHZpZXdlcgorCSAqIEBwYXJhbSBnY2YKKwkgKiAgICAgICAgICAgIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyBpbnN0YW5jZSBvZiB7QGxpbmsgR2VvZ3JhcGhpY0NvbnRyb2x9CisJICovCisJcHVibGljIEdlb2dyYXBoaWNWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgR2VvZ3JhcGhpY0NvbnRyb2xGYWN0b3J5IGdjZikgeworCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQlmaW5hbCBGaWxsTGF5b3V0IGNvbXBvc2l0ZUxheW91dCA9IG5ldyBGaWxsTGF5b3V0KFNXVC5IT1JJWk9OVEFMKTsKKwkJY29tcG9zaXRlLnNldExheW91dChjb21wb3NpdGVMYXlvdXQpOworCisJCS8vIFJlbWVtYmVyIHRoZSBmYWN0b3J5IHRoYXQgd2UnbGwgdXNlIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2YKKwkJLy8gR2VvZ3JhcGhpY0NvbnRyb2wKKwkJdGhpcy5nY2YgPSBnY2Y7CisKKwkJcmVmcmVzaCgpOworCisJCWNvbXBvc2l0ZS5wYWNrKCk7CisJfSAvLyBHZW9ncmFwaGljVmlld2VyCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyI2dldENvbnRyb2woKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7CisJCXJldHVybiBjb21wb3NpdGU7CisJfSAvLyBnZXRDb250cm9sCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyI2dldFNlbGVjdGlvbigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgeworCQlyZXR1cm4gc2VsZWN0aW9uOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIjcmVmcmVzaCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKKwkJaWYgKHNpbXVsYXRpb25NYW5hZ2VyICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJc2ltdWxhdGlvbnNUb0Rpc3BsYXkuY2xlYXIoKTsKKwkJCXNpbXVsYXRpb25zVG9EaXNwbGF5LmFkZEFsbChzaW11bGF0aW9uTWFuYWdlcgorCQkJCQkuZ2V0QWN0aXZlU2ltdWxhdGlvbnMoKSk7CisJCX0gLy8gaWYKKwkJcG9wdWxhdGVWaWV3KCk7CisJfSAvLyByZWZyZXNoCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyI2dldElucHV0KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldElucHV0KCkgeworCQlyZXR1cm4gc2ltdWxhdGlvbk1hbmFnZXI7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciNzZXRJbnB1dChqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkgeworCQlmaW5hbCBPYmplY3Qgb2xkSW5wdXQgPSBzaW11bGF0aW9uTWFuYWdlcjsKKwkJc2ltdWxhdGlvbk1hbmFnZXIgPSAoU2ltdWxhdGlvbk1hbmFnZXIpIGlucHV0OworCQlpbnB1dENoYW5nZWQoaW5wdXQsIG9sZElucHV0KTsKKwl9IC8vIHNldElucHV0CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyI2lucHV0Q2hhbmdlZChqYXZhLmxhbmcuT2JqZWN0LAorCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbnB1dENoYW5nZWQoT2JqZWN0IGlucHV0LCBPYmplY3Qgb2xkSW5wdXQpIHsKKwkJLy8gSXMgdGhlcmUgYWxyZWFkeSBhIHNpbXVsYXRpb24gbWFuYWdlcj8KKwkJaWYgKG9sZElucHV0ICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJKChTaW11bGF0aW9uTWFuYWdlcikgb2xkSW5wdXQpLnJlbW92ZUxpc3RlbmVyKHRoaXMpOworCQl9IC8vIGlmCisKKwkJLy8gUmVnaXN0ZXIgd2l0aCB0aGUgU2ltdWxhdGlvbk1hbmFnZXIgdG8gbGlzdGVuIGZvciBjaGFuZ2VzIGluIHRoZSBzZXQKKwkJLy8gb2YgYWN0aXZlIFNpbXVsYXRpb25zLgorCQkvLyBHb3QgaW5wdXQ/CisJCWlmIChpbnB1dCAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCSgoU2ltdWxhdGlvbk1hbmFnZXIpIGlucHV0KS5hZGRTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyKHRoaXMpOworCQl9IC8vIGlmCisKKwkJLy8gVXBkYXRlIHRoZSB2aWV3ZXIgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIG5ldyBpbnB1dCBzb3VyY2UKKwkJcmVmcmVzaCgpOworCX0gLy8gaW5wdXRDaGFuZ2VkCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyI3NldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24sCisJICogICAgICBib29sZWFuKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbiwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJYm9vbGVhbiByZXZlYWwpIHsKKwkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKGZpbmFsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkvLyBEaWQgdGhlIGV2ZW50IGNvbWUgZnJvbSBhIEdlb2dyYXBoaWNDb250cm9sPworCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSBpbnN0YW5jZW9mIEdlb2dyYXBoaWNDb250cm9sKSB7CisJCQkvLyBZZXMKKwkJCS8vIEp1c3QgcGFzcyBpdCBhbG9uZworCQkJc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7CisJCQlmaXJlU2VsZWN0aW9uQ2hhbmdlZChldmVudCk7CisJCX0gLy8gaWYKKwl9IC8vIHNlbGVjdGlvbkNoYW5nZWQKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXIjc2ltdWxhdGlvbnNDaGFuZ2VkKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgc2ltdWxhdGlvbnNDaGFuZ2VkKGZpbmFsIFNpbXVsYXRpb25NYW5hZ2VyRXZlbnQgZXZlbnQpIHsKKwkJYWRkVG9EaXNwbGF5ZWRTaW11bGF0aW9uU2V0KEFycmF5cy5hc0xpc3QoZXZlbnQuZ2V0U2ltdWxhdGlvbnNBZGRlZCgpKSk7CisKKwkJcmVtb3ZlRnJvbURpc3BsYXllZFNpbXVsYXRpb25TZXQoQXJyYXlzLmFzTGlzdChldmVudAorCQkJCS5nZXRTaW11bGF0aW9uc1JlbW92ZWQoKSkpOworCisJCXBvcHVsYXRlVmlldygpOworCX0gLy8gc2ltdWxhdGlvbnNDaGFuZ2VkCisKKwkvKioKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbnMKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn1zCisJICogICAgICAgICAgICB0byBhZGQgdG8gdGhlIHNldCBiZWluZyBkaXNwbGF5ZWQuCisJICovCisJcHJpdmF0ZSB2b2lkIGFkZFRvRGlzcGxheWVkU2ltdWxhdGlvblNldChmaW5hbCBMaXN0PElTaW11bGF0aW9uPiBzaW11bGF0aW9ucykgeworCQkvLyBBbnkgc2ltdWxhdGlvbnMgdG8gYWRkPworCQlpZiAoIXNpbXVsYXRpb25zLmlzRW1wdHkoKSkgeworCQkJLy8gWWVzCisJCQlzaW11bGF0aW9uc1RvRGlzcGxheS5hZGRBbGwoc2ltdWxhdGlvbnMpOworCQl9IC8vIGlmIGFueSBzaW11bGF0aW9ucworCX0gLy8gYWRkVG9EaXNwbGF5ZWRTaW11bGF0aW9uU2V0CisKKwkvKioKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbnMKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn1zCisJICogICAgICAgICAgICB0byByZW1vdmUgZnJvbSB0aGUgc2V0IGJlaW5nIGRpc3BsYXllZC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgcmVtb3ZlRnJvbURpc3BsYXllZFNpbXVsYXRpb25TZXQoCisJCQlmaW5hbCBMaXN0PElTaW11bGF0aW9uPiBzaW11bGF0aW9ucykgeworCQkvLyBBbnkgc2ltdWxhdGlvbnMgdG8gcmVtb3ZlPworCQlpZiAoIXNpbXVsYXRpb25zLmlzRW1wdHkoKSkgeworCQkJLy8gWWVzCisJCQlzaW11bGF0aW9uc1RvRGlzcGxheS5yZW1vdmVBbGwoc2ltdWxhdGlvbnMpOworCQl9IC8vIGlmCisJfSAvLyByZW1vdmVGcm9tRGlzcGxheWVkU2ltdWxhdGlvblNldAorCisJLyoqCisJICogQ3JlYXRlIGFuZCBkaXNwb3NlIG9mIE1hcENvbnRyb2xzIGFzIG5lY2Vzc2FyeSB0byBkaXNwbGF5IHRoZSBzZWxlY3RlZAorCSAqIFNpbXVsYXRpb25zLgorCSAqLworCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVZpZXcoKSB7CisKKwkJLy8gQXJlIHdlIGRvbmU/CisJCWlmIChjb21wb3NpdGUuaXNEaXNwb3NlZCgpKSB7CisJCQkvLyBZZXMKKwkJCXJldHVybjsKKwkJfSAvLyBpZgorCisJCXNlbGVjdGlvbiA9IG51bGw7CisKKwkJLy8gRmluZCB0aGUgU2ltdWxhdGlvbnMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBiZWluZyBkaXNwbGF5ZWQgYW5kIHB1dAorCQkvLyB0aGVtIGludG8gdGhlIFNldCB1bmRpc3BsYXllZFNpbXVsYXRpb25zLgorCQlmaW5hbCBTZXQ8SVNpbXVsYXRpb24+IHVuZGlzcGxheWVkU2ltdWxhdGlvbnMgPSBuZXcgSGFzaFNldDxJU2ltdWxhdGlvbj4oKTsKKwkJZm9yIChmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uIDogc2ltdWxhdGlvbnNUb0Rpc3BsYXkpIHsKKwkJCS8vIElzIHRoaXMgb25lIGFzc29jaWF0ZWQgd2l0aCBhIEdlb2dyYXBoaWNDb250cm9sIGFscmVhZHk/CisJCQlpZiAoIWlzRGlzcGxheWVkKHNpbXVsYXRpb24pKSB7CisJCQkJLy8gTm8KKwkJCQl1bmRpc3BsYXllZFNpbXVsYXRpb25zLmFkZChzaW11bGF0aW9uKTsKKwkJCX0gLy8gaWYgbm90IGRpc3BsYXllZAorCQl9IC8vIGZvciBlYWNoIElTaW11bGF0aW9uCisKKwkJLy8gR28gdGhyb3VnaCB0aGUgY3VycmVudCBzZXQgb2YgQ29udHJvbHMgbG9va2luZyBmb3Igb25lcyB0aGF0CisJCS8vIHdlIGNhbiByZWFzc2lnbgorCQlmaW5hbCBDb250cm9sW10gY29udHJvbHMgPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKKwkJZm9yIChmaW5hbCBDb250cm9sIGVsZW1lbnQgOiBjb250cm9scykgeworCQkJLy8gRG9lcyB0aGlzIEdlb2dyYXBoaWNDb250cm9sIGhhdmUgYSBzaW11bGF0aW9uIHRoYXQgaXMgc3RpbGwgdmFsaWQKKwkJCS8vIHRvIGRpc3BsYXk/CisJCQlmaW5hbCBHZW9ncmFwaGljQ29udHJvbCBnZW9Db250cm9sID0gKEdlb2dyYXBoaWNDb250cm9sKSBlbGVtZW50OworCQkJaWYgKCFzaW11bGF0aW9uc1RvRGlzcGxheS5jb250YWlucyhnZW9Db250cm9sLmdldFNpbXVsYXRpb24oKSkKKwkJCQkJJiYgIXVuZGlzcGxheWVkU2ltdWxhdGlvbnMuaXNFbXB0eSgpKSB7CisJCQkJLy8gTm8KKwkJCQkvLyBSZWFzc2lnbiBpdCB0byBvbmUgdGhhdCBpcyB2YWxpZAorCQkJCWZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb24gPSAoSVNpbXVsYXRpb24pIHVuZGlzcGxheWVkU2ltdWxhdGlvbnMKKwkJCQkJCS50b0FycmF5KClbMF07CisJCQkJZ2VvQ29udHJvbC5zZXRTaW11bGF0aW9uKHNpbXVsYXRpb24pOworCQkJCS8vIE5vdGlmeSBWaWV3UGFydCB0aGF0IGEgbmV3IGNvbnRleHQgbWVudSBoYXMgYmVlbiBnZW5lcmF0ZWQKKwkJCQlub3RpZnlDb250ZXh0TWVudVVwZGF0ZUxpc3RlbmVycyhnZW9Db250cm9sKTsKKwkJCQl1bmRpc3BsYXllZFNpbXVsYXRpb25zLnJlbW92ZShzaW11bGF0aW9uKTsKKwkJCX0gLy8gaWYKKwkJfSAvLyBmb3IgZWFjaCBNYXBDb250cm9sCisKKwkJLy8gQXQgdGhpcyBwb2ludCB3ZSBzdGlsbCBjb3VsZCBoYXZlIG1hcCBjb250cm9scyB3aXRoIGludmFsaWQKKwkJLy8gU2ltdWxhdGlvbnMsIGxldCdzIGdldCByaWQgb2YgdGhlbQorCQlmb3IgKGZpbmFsIENvbnRyb2wgZWxlbWVudCA6IGNvbnRyb2xzKSB7CisJCQlmaW5hbCBHZW9ncmFwaGljQ29udHJvbCBnZW9Db250cm9sID0gKEdlb2dyYXBoaWNDb250cm9sKSBlbGVtZW50OworCQkJLy8gRG9lcyB0aGlzIE1hcENvbnRyb2wgaGF2ZSBhIHNpbXVsYXRpb24gdGhhdCBpcyBzdGlsbCB2YWxpZCB0bworCQkJLy8gZGlzcGxheT8KKwkJCUlTaW11bGF0aW9uIHNpbXVsYXRpb24gPSBnZW9Db250cm9sLmdldFNpbXVsYXRpb24oKTsKKwkJCWlmIChzaW11bGF0aW9uICE9IG51bGwKKwkJCQkJJiYgIXNpbXVsYXRpb25zVG9EaXNwbGF5LmNvbnRhaW5zKHNpbXVsYXRpb24pKSB7CisJCQkJLy8gTm8KKwkJCQlnZW9Db250cm9sLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsJCQkJCQkJCQorCQkJCWdlb0NvbnRyb2wuZGlzcG9zZSgpOworCQkJfQorCQl9Ly8gZm9yIGVhY2ggTWFwQ29udHJvbAorCisJCS8vIElmIHRoZXJlJ3JlIGFueSBTaW11bGF0aW9ucyBub3QgYXNzaWduZWQgdG8gYSBHZW9ncmFwaGljQ29udHJvbCwKKwkJLy8gbGV0J3MgdGFrZSBjYXJlIG9mIHRoYXQgbm93LgorCQlmb3IgKGZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb24yIDogdW5kaXNwbGF5ZWRTaW11bGF0aW9ucykgeworCQkJZmluYWwgR2VvZ3JhcGhpY0NvbnRyb2wgZ2VvQ29udHJvbCA9IGdjZi5jcmVhdGUoY29tcG9zaXRlKTsKKwkJCS8vIE5vdGlmeSBWaWV3UGFydCB0aGF0IGEgbmV3IGNvbnRleHQgbWVudSBoYXMgYmVlbiBnZW5lcmF0ZWQKKwkJCW5vdGlmeUNvbnRleHRNZW51VXBkYXRlTGlzdGVuZXJzKGdlb0NvbnRyb2wpOworCQkJZ2VvQ29udHJvbC5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCQlnZW9Db250cm9sLnNldFNpbXVsYXRpb24oc2ltdWxhdGlvbjIpOworCQl9IC8vIGZvciBlYWNoIElTaW11bGF0aW9uCisKKwkJLy8gSWYgdGhlcmUgYXJlIG5vIHNpbXVsYXRpb25zIHRvIGRpc3BsYXksIHdlIGp1c3QgcHV0IHVwIGEgImJsYW5rIgorCQkvLyBHZW9ncmFwaGljQ29udHJvbAorCQlpZiAoY29tcG9zaXRlLmdldENoaWxkcmVuKCkubGVuZ3RoID09IDApIHsKKwkJCS8vIFllcworCQkJZmluYWwgR2VvZ3JhcGhpY0NvbnRyb2wgZ2VvQ29udHJvbCA9IGdjZi5jcmVhdGUoY29tcG9zaXRlKTsKKwkJCWdlb0NvbnRyb2wuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCQl9IC8vIGlmCisJCWNvbXBvc2l0ZS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7CisJCWNvbXBvc2l0ZS5yZWRyYXcoKTsKKwl9IC8vIHBvcHVsYXRlVmlldworCisJLyoqCisJICogQHBhcmFtIHNpbXVsYXRpb24KKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzRGlzcGxheWVkKGZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb24pIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOworCQlmaW5hbCBDb250cm9sW10gZm9vID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7CisJCWZvciAoZmluYWwgQ29udHJvbCBlbGVtZW50IDogZm9vKSB7CisJCQlmaW5hbCBHZW9ncmFwaGljQ29udHJvbCBnZW9Db250cm9sID0gKEdlb2dyYXBoaWNDb250cm9sKSBlbGVtZW50OworCQkJZmluYWwgSVNpbXVsYXRpb24gdGVzdFNpbXVsYXRpb24gPSBnZW9Db250cm9sLmdldFNpbXVsYXRpb24oKTsKKwkJCWlmICh0ZXN0U2ltdWxhdGlvbiAhPSBudWxsICYmIHRlc3RTaW11bGF0aW9uLmVxdWFscyhzaW11bGF0aW9uKSkgeworCQkJCXJldFZhbHVlID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0gLy8gaWYKKwkJfSAvLyBmb3IgZWFjaCBNYXBDb250cm9sCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGlzRGlzcGxheWVkCisKKwkvKioKKwkgKiBUaGUgbWV0aG9kIGFkZHMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciB0byB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMKKwkgKiAKKwkgKiBAcGFyYW0gbmV3TGlzdGVuZXIKKwkgKiAgICAgICAgICAgIEEgbGlzdGVuZXIgdG8gYmUgYWRkZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDb250ZXh0TWVudVVwZGF0ZUxpc3RlbmVyKAorCQkJSUNvbnRleHRNZW51VXBkYXRlc0xpc3RlbmVyIG5ld0xpc3RlbmVyKSB7CisJCWlmICghY29udGV4dE1lbnVVcGRhdGVMaXN0ZW5lcnMuY29udGFpbnMobmV3TGlzdGVuZXIpKSB7CisJCQljb250ZXh0TWVudVVwZGF0ZUxpc3RlbmVycy5hZGQobmV3TGlzdGVuZXIpOworCQl9IC8vIGlmCisJfSAvLyBhZGRDb250ZXh0TWVudVVwZGF0ZUxpc3RlbmVyCisJCisJLyoqCisJICogVGhlIG1ldGhvZCByZW1vdmVzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgdG8gdGhlIGxpc3Qgb2YgbGlzdGVuZXJzCisJICogCisJICogQHBhcmFtIG5ld0xpc3RlbmVyCisJICogICAgICAgICAgICBBIGxpc3RlbmVyIHRvIGJlIGFkZGVkCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dE1lbnVVcGRhdGVMaXN0ZW5lcigKKwkJCUlDb250ZXh0TWVudVVwZGF0ZXNMaXN0ZW5lciBuZXdMaXN0ZW5lcikgeworCQljb250ZXh0TWVudVVwZGF0ZUxpc3RlbmVycy5yZW1vdmUobmV3TGlzdGVuZXIpOworCX0gLy8gYWRkQ29udGV4dE1lbnVVcGRhdGVMaXN0ZW5lcgorCisJLyoqCisJICogVGhlIG1ldGhvZCB3aWxsIHNlbmQgbm90aWZpY2F0aW9uIHRvIGFsbCBsaXN0ZW5lcnMgYWJvdXQgbmV3IG1lbnUgdGhhdAorCSAqIGhhcyBiZWVuIGNyZWF0ZWQuCisJICogCisJICogQHBhcmFtIGdlb0NvbnRyb2wKKwkgKiAgICAgICAgICAgIFRoZSA8Y29kZT5HZW9ncmFwaGljQ29udHJvbDwvY29kZT4gdGhhdCBoYXMgdGhlIG5ldworCSAqICAgICAgICAgICAgPGNvZGU+TWVudU1hbmFnZXI8L2NvZGU+IGFzIGEgZmllbGQuCisJICovCisJcHJpdmF0ZSB2b2lkIG5vdGlmeUNvbnRleHRNZW51VXBkYXRlTGlzdGVuZXJzKEdlb2dyYXBoaWNDb250cm9sIGdlb0NvbnRyb2wpIHsKKwkJR2VvZ3JhcGhpY1JlbmRlcmVyIGdlb1JlbmRlcmVyID0gZ2VvQ29udHJvbC5nZXRHZW9ncmFwaGljUmVuZGVyZXIoKTsKKwkJaWYgKGdlb1JlbmRlcmVyIGluc3RhbmNlb2YgTWFwUmVuZGVyZXIpIHsKKwkJCU1hcFJlbmRlcmVyIG1hcFJlbmRlcmVyID0gKE1hcFJlbmRlcmVyKSBnZW9SZW5kZXJlcjsKKwkJCW5vdGlmeUNvbnRleHRNZW51VXBkYXRlTGlzdGVuZXJzKG1hcFJlbmRlcmVyLmdldE1lbnVNYW5hZ2VyKCksCisJCQkJCW1hcFJlbmRlcmVyKTsKKwkJfSAvLyBpZgorCX0gLy8gbm90aWZ5Q29udGV4dE1lbnVVcGRhdGVMaXN0ZW5lcnMKKworCS8qKgorCSAqIFRoZSBtZXRob2Qgd2lsbCBzZW5kIG5vdGlmaWNhdGlvbiB0byBhbGwgbGlzdGVuZXJzIGFib3V0IG5ldyBtZW51IHRoYXQKKwkgKiBoYXMgYmVlbiBjcmVhdGVkLgorCSAqIAorCSAqIEBwYXJhbSBtZW51TWFuYWdlcgorCSAqICAgICAgICAgICAgVGhlIG5ld2x5IGFkZGVkIDxjb2RlPk1lbnVNYW5hZ2VyPC9jb2RlPgorCSAqIEBwYXJhbSBzZWxlY3Rpb25Qcm92aWRlcgorCSAqICAgICAgICAgICAgQSA8Y29kZT5JU2VsZWN0aW9uUHJvdmlkZXI8L2NvZGU+IGZvciB0aGUgbWVudQorCSAqLworCXByaXZhdGUgdm9pZCBub3RpZnlDb250ZXh0TWVudVVwZGF0ZUxpc3RlbmVycyhNZW51TWFuYWdlciBtZW51TWFuYWdlciwKKwkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikgeworCQlmb3IgKGZpbmFsIElDb250ZXh0TWVudVVwZGF0ZXNMaXN0ZW5lciBsaXN0ZW5lciA6IGNvbnRleHRNZW51VXBkYXRlTGlzdGVuZXJzKSB7CisJCQlsaXN0ZW5lci5vbkNvbnRleHRNZW51VXBkYXRlKG1lbnVNYW5hZ2VyLCBzZWxlY3Rpb25Qcm92aWRlcik7CisJCX0gLy8gZm9yIGVhY2ggSUNvbnRleHRNZW51VXBkYXRlc0xpc3RlbmVyCisJfSAvLyBub3RpZnlDb250ZXh0TWVudVVwZGF0ZUxpc3RlbmVycworCQorfSAvLyBHZW9ncmFwaGljVmlld2VyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvbWFwL0dlb2dyYXBoaWNTZWxlY3Rpb25FbGVtZW50cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9HZW9ncmFwaGljU2VsZWN0aW9uRWxlbWVudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGRkZGMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9HZW9ncmFwaGljU2VsZWN0aW9uRWxlbWVudHMuamF2YQpAQCAtMCwwICsxLDc1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFNwZWNpZnkgdGhlIGluZm9ybWF0aW9uIHRoYXQgaXMgcGFzc2VkIGluIHRoZSBTdHJ1Y3R1cmVkU2VsZWN0aW9uIGV2ZW50IHRoYXQKKyAqIGlzIGNyZWF0ZWQgYnkgTWFwVmlldyBvbiBhIG1vdXNlIGNsaWNrIG9uIHRoZSBtYXAuCisgKiAKKyAqIDxwcmU+CisgKiBUaGUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBwYXNzZWQgYXMgdGhlIDJuZCBlbGVtZW50IGluIHRoZQorICogU3RydWN0dXJlZFNlbGVjdGlvbiBpbnN0YW5jZS4gCisgKiAKKyAqIFRoZSBpbmZvcm1hdGlvbiBwYXNzZWQgaXMgdGhlIGZvbGxvd2luZzogCisgKiAtIElkZW50aWZpYWJsZSB0aGF0IGRlc2NyaWJlcyB0aGUgbWFwIHBvbHlnb24gKGluIHRoZSAxc3QgZWxlbWVudCkKKyAqIC0gR2VvZ3JhcGhpY1NlbGVjdGlvbkVsZW1lbnQgKGluIHRoZSAybmQgZWxlbWVudCkKKyAqICAgLSBQb2ludCAobG9uZ2l0dWRlL2xhdGl0dWRlKSBvZiB0aGUgYWN0dWFsIGNsaWNrIAorICogICAtIE1hcCBvZiByZWxhdGl2ZSB2YWx1ZXMgYXQgdGhlIGluc3RhbmNlIG9mIHRoZSBjbGljay4KKyAqIAorICogTm90ZTogT25lIG1pZ2h0IHRoaW5rIHRoYXQgdGhlIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2hvdWxkIGhhdmUgYmVlbiBzdWJjbGFzc2VkCisgKiBidXQgaXQgaXMgc3BlY2lmaWNseSBmb3JiaWRkZW4uCisgKiAKKyAqIDwvcHJlPgorICovCitwdWJsaWMgY2xhc3MgR2VvZ3JhcGhpY1NlbGVjdGlvbkVsZW1lbnRzIHsKKworCS8qKgorCSAqIExvbmdpdHVkZSBvZiBzZWxlY3Rpb24gcG9pbnQKKwkgKi8KKwlwcml2YXRlIGRvdWJsZSBsb25naXR1ZGUgPSAwLjA7CisJLyoqCisJICogbGF0aXR1ZGUgb2Ygc2VsZWN0aW9uIHBvaW50CisJICovCisJcHJpdmF0ZSBkb3VibGUgbGF0aXR1ZGUgPSAwLjA7CisKKwkvKioKKwkgKiBkZWZhdWx0IGNvbnN0cnVjdG9yCisJICovCisJcHVibGljIEdlb2dyYXBoaWNTZWxlY3Rpb25FbGVtZW50cygpIHsKKwkJLy8gZGVmYXVsdCBjb25zdHJ1Y3RvcgorCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHBvaW50CisJICovCisJcHVibGljIGRvdWJsZSBnZXRMb25naXR1ZGUoKSB7CisJCXJldHVybiBsb25naXR1ZGU7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgcG9pbnQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldExhdGl0dWRlKCkgeworCQlyZXR1cm4gbGF0aXR1ZGU7CisJfQorCisJLyoqCisJICogc2V0IHRoZSBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIG9mIHRoZSBzZWxlY3RlZCBwb2ludAorCSAqIAorCSAqIEBwYXJhbSBsb25naXR1ZGUKKwkgKiBAcGFyYW0gbGF0aXR1ZGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQb2ludChmaW5hbCBkb3VibGUgbG9uZ2l0dWRlLCBmaW5hbCBkb3VibGUgbGF0aXR1ZGUpIHsKKwkJdGhpcy5sb25naXR1ZGUgPSBsb25naXR1ZGU7CisJCXRoaXMubGF0aXR1ZGUgPSBsYXRpdHVkZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvbWFwL0dyYXBoaWNzMkRSZW5kZXJlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9HcmFwaGljczJEUmVuZGVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWVkMThmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9HcmFwaGljczJEUmVuZGVyZXIuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUGFsZXR0ZURhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgYWxsb3dpbmcgdGhlIHVzZSBvZiBKYXZhIDJEIG9uIFNXVCBvciBEcmF3MkQgZ3JhcGhpY2FsIGNvbnRleHQuCisgKiBTZWU6CisgKiBodHRwOi8vd3d3LTEyOC5pYm0uY29tL2RldmVsb3BlcndvcmtzL2phdmEvbGlicmFyeS9qLTJkc3d0Lz9jYT1kZ3ItancxN2otMmRzd3QKKyAqIAorICogQGF1dGhvciBZYW5uaWNrIFNhaWxsZXQgLyBJQk0KKyAqLworCitwdWJsaWMgY2xhc3MgR3JhcGhpY3MyRFJlbmRlcmVyIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBQYWxldHRlRGF0YSBQQUxFVFRFX0RBVEEgPSBuZXcgUGFsZXR0ZURhdGEoMHhGRjAwMDAsCisJCQkweEZGMDAsIDB4RkYpOworCisJcHJpdmF0ZSBCdWZmZXJlZEltYWdlIGF3dEltYWdlOworCisJcHJpdmF0ZSBJbWFnZSBzd3RJbWFnZTsKKworCXByaXZhdGUgSW1hZ2VEYXRhIHN3dEltYWdlRGF0YTsKKworCXByaXZhdGUgaW50W10gYXd0UGl4ZWxzOworCisJLyoqIFJHQiB2YWx1ZSB0byB1c2UgYXMgdHJhbnNwYXJlbnQgY29sb3IgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNQQVJFTlRfQ09MT1IgPSAweDEyMzQ1NjsKKworCS8qKgorCSAqIFByZXBhcmUgdG8gcmVuZGVyIG9uIGEgU1dUIGdyYXBoaWNzIGNvbnRleHQuCisJICogCisJICogQHBhcmFtIGdjCisJICovCisJcHVibGljIHZvaWQgcHJlcGFyZVJlbmRlcmluZyhHQyBnYykgeworCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlIGNsaXAgPSBnYy5nZXRDbGlwcGluZygpOworCQlwcmVwYXJlUmVuZGVyaW5nKGNsaXAueCwgY2xpcC55LCBjbGlwLndpZHRoLCBjbGlwLmhlaWdodCk7CisJfQorCisJLyoqCisJICogUHJlcGFyZSB0aGUgQVdUIG9mZiBzY3JlZW4gaW1hZ2UgZm9yIHRoZSByZW5kZXJpbmcgb2YgdGhlIHJlY3Rhbmd1bGFyCisJICogcmVnaW9uIGdpdmVuIGFzIHBhcmFtZXRlci4KKwkgKiAKKwkgKiBAcGFyYW0gY2xpcFgKKwkgKiBAcGFyYW0gY2xpcFkKKwkgKiBAcGFyYW0gY2xpcFcKKwkgKiBAcGFyYW0gY2xpcEgKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmVwYXJlUmVuZGVyaW5nKGludCBjbGlwWCwgaW50IGNsaXBZLCBpbnQgY2xpcFcsIGludCBjbGlwSCkgeworCQkvLyBjaGVjayB0aGF0IHRoZSBvZmYgc2NyZWVuIGltYWdlcyBhcmUgaW5pdGlhbGl6ZWQgYW5kIGxhcmdlIGVub3VnaAorCQljaGVja09mZlNjcmVlbkltYWdlcyhjbGlwVywgY2xpcEgpOworCQkvLyBmaWxsIHRoZSByZWdpb24gaW4gdGhlIEFXVCBpbWFnZSB3aXRoIHRoZSB0cmFuc3BhcmVudCBjb2xvcgorCQlqYXZhLmF3dC5HcmFwaGljcyBhd3RHcmFwaGljcyA9IGF3dEltYWdlLmdldEdyYXBoaWNzKCk7CisJCWF3dEdyYXBoaWNzLnNldENvbG9yKG5ldyBqYXZhLmF3dC5Db2xvcihUUkFOU1BBUkVOVF9DT0xPUikpOworCQlhd3RHcmFwaGljcy5maWxsUmVjdChjbGlwWCwgY2xpcFksIGNsaXBXLCBjbGlwSCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgR3JhcGhpY3MyRCBjb250ZXh0IHRvIHVzZS4KKwkgKiAKKwkgKiBAcmV0dXJuIEdyYXBoaWNzMkQKKwkgKi8KKwlwdWJsaWMgR3JhcGhpY3MyRCBnZXRHcmFwaGljczJEKCkgeworCQlpZiAoYXd0SW1hZ2UgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gKEdyYXBoaWNzMkQpIGF3dEltYWdlLmdldEdyYXBoaWNzKCk7CisJfQorCisJLyoqCisJICogQ29tcGxldGUgdGhlIHJlbmRlcmluZyBieSBmbHVzaGluZyB0aGUgMkQgcmVuZGVyZXIgb24gYSBTV1QgZ3JhcGhpY2FsCisJICogY29udGV4dC4KKwkgKiAKKwkgKiBAcGFyYW0gZ2MKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW5kZXIoR0MgZ2MpIHsKKwkJaWYgKGF3dEltYWdlID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSBjbGlwID0gZ2MuZ2V0Q2xpcHBpbmcoKTsKKwkJdHJhbnNmZXJQaXhlbHMoY2xpcC54LCBjbGlwLnksIGNsaXAud2lkdGgsIGNsaXAuaGVpZ2h0KTsKKwkJZ2MuZHJhd0ltYWdlKHN3dEltYWdlLCBjbGlwLngsIGNsaXAueSwgY2xpcC53aWR0aCwgY2xpcC5oZWlnaHQsIGNsaXAueCwKKwkJCQljbGlwLnksIGNsaXAud2lkdGgsIGNsaXAuaGVpZ2h0KTsKKwl9CisKKwkvKioKKwkgKiBUcmFuc2ZlciBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBmcm9tIHRoZSBBV1QgaW1hZ2UgdG8gdGhlIFNXVCBpbWFnZS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgdHJhbnNmZXJQaXhlbHMoaW50IGNsaXBYLCBpbnQgY2xpcFksIGludCBjbGlwVywgaW50IGNsaXBIKSB7CisJCWludCBzdGVwID0gc3d0SW1hZ2VEYXRhLmRlcHRoIC8gODsKKwkJYnl0ZVtdIGRhdGEgPSBzd3RJbWFnZURhdGEuZGF0YTsKKwkJYXd0SW1hZ2UuZ2V0UkdCKGNsaXBYLCBjbGlwWSwgY2xpcFcsIGNsaXBILCBhd3RQaXhlbHMsIDAsIGNsaXBXKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGlwSDsgaSsrKSB7CisJCQlpbnQgaWR4ID0gKGNsaXBZICsgaSkgKiBzd3RJbWFnZURhdGEuYnl0ZXNQZXJMaW5lICsgY2xpcFggKiBzdGVwOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjbGlwVzsgaisrKSB7CisJCQkJaW50IHJnYiA9IGF3dFBpeGVsc1tqICsgaSAqIGNsaXBXXTsKKwkJCQlmb3IgKGludCBrID0gc3d0SW1hZ2VEYXRhLmRlcHRoIC0gODsgayA+PSAwOyBrIC09IDgpIHsKKwkJCQkJZGF0YVtpZHgrK10gPSAoYnl0ZSkgKChyZ2IgPj4gaykgJiAweEZGKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHN3dEltYWdlICE9IG51bGwpCisJCQlzd3RJbWFnZS5kaXNwb3NlKCk7CisJCXN3dEltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCBzd3RJbWFnZURhdGEpOworCX0KKworCS8qKgorCSAqIERpc3Bvc2UgdGhlIHJlc291cmNlcyBhdHRhY2hlZCB0byB0aGlzIDJEIHJlbmRlcmVyLgorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWlmIChhd3RJbWFnZSAhPSBudWxsKQorCQkJYXd0SW1hZ2UuZmx1c2goKTsKKwkJaWYgKHN3dEltYWdlICE9IG51bGwpCisJCQlzd3RJbWFnZS5kaXNwb3NlKCk7CisJCWF3dEltYWdlID0gbnVsbDsKKwkJc3d0SW1hZ2VEYXRhID0gbnVsbDsKKwkJYXd0UGl4ZWxzID0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgdGhhdCB0aGUgb2ZmIHNjcmVlbiBpbWFnZXMgYXJlIGluaXRpYWxpemVkIGFuZCBhcmUgYXQgbGVhc3QgYXMKKwkgKiBsYXJnZSBhcyB0aGUgc2l6ZSBnaXZlbiBhcyBwYXJhbWV0ZXIuCisJICovCisJcHJpdmF0ZSB2b2lkIGNoZWNrT2ZmU2NyZWVuSW1hZ2VzKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworCQlpbnQgY3VycmVudEltYWdlV2lkdGggPSAwOworCQlpbnQgY3VycmVudEltYWdlSGVpZ2h0ID0gMDsKKwkJaWYgKHN3dEltYWdlICE9IG51bGwpIHsKKwkJCWN1cnJlbnRJbWFnZVdpZHRoID0gc3d0SW1hZ2UuZ2V0SW1hZ2VEYXRhKCkud2lkdGg7CisJCQljdXJyZW50SW1hZ2VIZWlnaHQgPSBzd3RJbWFnZS5nZXRJbWFnZURhdGEoKS5oZWlnaHQ7CisJCX0KKworCQkvLyBpZiB0aGUgb2ZmIHNjcmVlbiBpbWFnZXMgYXJlIHRvbyBzbWFsbCwgcmVjcmVhdGUgdGhlbQorCQlpZiAod2lkdGggPiBjdXJyZW50SW1hZ2VXaWR0aCB8fCBoZWlnaHQgPiBjdXJyZW50SW1hZ2VIZWlnaHQpIHsKKwkJCWRpc3Bvc2UoKTsKKwkJCXdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGN1cnJlbnRJbWFnZVdpZHRoKTsKKwkJCWhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgY3VycmVudEltYWdlSGVpZ2h0KTsKKwkJCWF3dEltYWdlID0gbmV3IEJ1ZmZlcmVkSW1hZ2Uod2lkdGgsIGhlaWdodCwKKwkJCQkJQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKTsKKwkJCXN3dEltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodCwgMjQsIFBBTEVUVEVfREFUQSk7CisJCQlzd3RJbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCA9IFRSQU5TUEFSRU5UX0NPTE9SOworCQkJYXd0UGl4ZWxzID0gbmV3IGludFt3aWR0aCAqIGhlaWdodF07CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvbWFwL01hcENhbnZhcy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9NYXBDYW52YXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzhlODBmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9NYXBDYW52YXMuamF2YQpAQCAtMCwwICsxLDY5NCBAQAorLy8gTWFwQ2FudmFzLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLlJlZ2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5Lkdlb2dyYXBoaWNOYW1lczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5BYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLkNvbG9yUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuY29sb3IuQ29sb3JTY2FsZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLlN0YW5kYXJkQ29sb3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTW92ZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0FkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVdoZWVsTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgU1dUIFdpZGdldCB0aGF0IGRpc3BsYXlzIGEgIm1hcCIgdmlldyBvZiB0aGUgZ2VvZ3JhcGhpYworICogZmVhdHVyZXMgb2YgYSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn0uCisgKi8KK3B1YmxpYyBjbGFzcyBNYXBDYW52YXMgCisJZXh0ZW5kcyBDYW52YXMgCisJaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIsIFBhaW50TGlzdGVuZXIsIE1vdXNlV2hlZWxMaXN0ZW5lciwgTW91c2VNb3ZlTGlzdGVuZXIsIERpc3Bvc2VMaXN0ZW5lciAKK3sKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBJTklUSUFMX1pPT01fRkFDVE9SID0gMTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgSU5JVElBTF9YX1RSQU5TTEFUSU9OID0gMDsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgSU5JVElBTF9ZX1RSQU5TTEFUSU9OID0gMDsKKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFpPT01JTkdfRkFDVE9SID0gMS4xOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFVOWk9PTUlOR19GQUNUT1IgPSAxIC8gWk9PTUlOR19GQUNUT1I7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBsaXN0IG9mIHBvbHlnb25zIHRoYXQgYXJlIHJlbmRlcmVkLgorCSAqLworCXByaXZhdGUgU3RlbVBvbHlnb25zTGlzdCBwb2x5Z29uc1RvUmVuZGVyOworCisJZG91YmxlIHpvb21GYWN0b3IgPSBJTklUSUFMX1pPT01fRkFDVE9SOworCXByaXZhdGUgZmxvYXQgZ2FpbkZhY3RvciA9IDEuMGY7CisJcHJpdmF0ZSBkb3VibGUgeFRyYW5zbGF0aW9uID0gSU5JVElBTF9YX1RSQU5TTEFUSU9OOworCXByaXZhdGUgZG91YmxlIHlUcmFuc2xhdGlvbiA9IElOSVRJQUxfWV9UUkFOU0xBVElPTjsKKwlib29sZWFuIGRyYXdQb2x5Z29uQm9yZGVycyA9IHRydWU7CisJU3RlbVBvbHlnb25UcmFuc2Zvcm0gcG9pbnRzVHJhbnNmb3JtZXIgPSBuZXcgU3RlbVBvbHlnb25UcmFuc2Zvcm0oKTsKKwlib29sZWFuIHRvVXBkYXRlVHJhbmZvcm0gPSB0cnVlOworCQorCXByaXZhdGUgZmluYWwgU3RhbmRhcmRDb2xvclByb3ZpZGVyIHN0ZENvbG9yUHJvdmlkZXIgPSBuZXcgU3RhbmRhcmRDb2xvclByb3ZpZGVyKHRoaXMuZ2V0RGlzcGxheSgpKTsKKwlwcml2YXRlIENvbG9yUHJvdmlkZXJBZGFwdGVyIGNvbG9yUHJvdmlkZXIgPSBudWxsOworCisJcHJpdmF0ZSBib29sZWFuIHVzZUxvZ1NjYWxpbmcgPSB0cnVlOworCQorCWJvb2xlYW4gbGVmdE1vdXNlQnV0dG9uUHJlc3NlZCA9IGZhbHNlOworCWludCBsYXN0T2Zmc2V0WDsKKwlpbnQgbGFzdE9mZnNldFk7CisJQ29sb3JTY2FsZUNvbXBvc2l0ZSBjb2xvclNjYWxlID0gbnVsbDsKKworCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247CisJLyoqCisJICogVGhlIGNvbGxlY3Rpb24gb2YgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB3YWl0aW5nIHRvIGJlIHRvbGQgYWJvdXQKKwkgKiBzZWxlY3Rpb25zLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKKwlwcml2YXRlIFJlY3RhbmdsZSBwb2x5Z29uc0JvdW5kc1JlY3QgPSBudWxsOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVJHSU4gPSAxMDsKKwkKKwlwcml2YXRlIGZpbmFsIE1vdXNlVHJhY2tIYW5kbGVyIG1vdXNlVHJhY2tIYW5kbGVyID0gbmV3IE1vdXNlVHJhY2tIYW5kbGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBNb3VzZUJ1dHRvbkhhbmRsZXIgbW91c2VCdXR0b25IYW5kbGVyID0gbmV3IE1vdXNlQnV0dG9uSGFuZGxlcigpOworCXByaXZhdGUgZmluYWwgTW91c2VIb3ZlckhhbmRsZXIgbW91c2VIb3ZlckhhbmRsZXIgPSBuZXcgTW91c2VIb3ZlckhhbmRsZXIoKTsKKwlwcml2YXRlIGZpbmFsIEtleUhhbmRsZXIga2V5SGFuZGxlciA9IG5ldyBLZXlIYW5kbGVyKCk7CisKKwkvKioKKwkgKiBAcGFyYW0gcGFyZW50CisJICogQHBhcmFtIHN0eWxlCisJICovCisJcHVibGljIE1hcENhbnZhcyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBpbnQgc3R5bGUpIHsKKwkJc3VwZXIocGFyZW50LCBTV1QuRE9VQkxFX0JVRkZFUkVEIHwgU1dULk5PX0JBQ0tHUk9VTkQpOworCisJCWFkZFBhaW50TGlzdGVuZXIodGhpcyk7CisJCWFkZE1vdXNlV2hlZWxMaXN0ZW5lcih0aGlzKTsKKwkJYWRkTW91c2VUcmFja0xpc3RlbmVyKG1vdXNlVHJhY2tIYW5kbGVyKTsKKwkJYWRkTW91c2VNb3ZlTGlzdGVuZXIodGhpcyk7CisJCWFkZEtleUxpc3RlbmVyKGtleUhhbmRsZXIpOwkJCisJCWFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzKTsKKwkJYWRkTW91c2VMaXN0ZW5lcihtb3VzZUJ1dHRvbkhhbmRsZXIpOworCQlhZGRNb3VzZVRyYWNrTGlzdGVuZXIobW91c2VIb3ZlckhhbmRsZXIpOworCX0gLy8gTWFwQ2FudmFzCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXIjcGFpbnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woZmluYWwgUGFpbnRFdmVudCBlKSB7CisJCWZpbmFsIEdDIGdjID0gZS5nYzsKKwkJZmluYWwgUG9pbnQgY29udHJvbFNpemUgPSAoKENvbnRyb2wpIGUuZ2V0U291cmNlKCkpLmdldFNpemUoKTsKKwkJdG9VcGRhdGVUcmFuZm9ybSA9IHRydWU7CisJCWRyYXcoZ2MsIDAsIDAsIGNvbnRyb2xTaXplLngsIGNvbnRyb2xTaXplLnkpOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gZQorCSAqLworCXB1YmxpYyB2b2lkIG1vdXNlU2Nyb2xsZWQoZmluYWwgTW91c2VFdmVudCBlKSB7CisJCS8vIFpvb20gT3V0PworCQlpZiAoZS5jb3VudCA+PSAwKSB7CisJCQkvLyBZZXMKKwkJCXpvb21JbigpOworCQl9IGVsc2UgeworCQkJem9vbU91dCgpOworCQl9CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBlCisJICovCisJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgeworCQkvL1JlbW92ZSB0aGUgdG9vbHRpcCB0ZXh0IHdoZW4gdGhlIG1vdXNlIGlzIG1vdmUgdG8gYXZvaWQgc2hvd2luZyBhIHdyb25nCisJCS8vdG9vbHRpcCB0ZXh0IGJlZm9yZSB0aGUgcmlnaHQgdGV4dCBpcyBiZWluZyBjYWxjdWxhdGVkCisJCXNldFRvb2xUaXBUZXh0KG51bGwpOworCQkKKwkJaWYgKGxlZnRNb3VzZUJ1dHRvblByZXNzZWQpIHsKKwkJCS8vIFllcworCQkJLy8gbmV3IHggYW5kIHkgYXJlIGRlZmluZWQgYnkgY3VycmVudCBtb3VzZSBsb2NhdGlvbiBzdWJ0cmFjdGVkCisJCQkvLyBieSBwcmV2aW91c2x5IHByb2Nlc3NlZCBtb3VzZSBsb2NhdGlvbgorCQkJZmluYWwgaW50IG5ld1ggPSBlLnggLSBsYXN0T2Zmc2V0WDsKKwkJCWZpbmFsIGludCBuZXdZID0gZS55IC0gbGFzdE9mZnNldFk7CisJCQlsYXN0T2Zmc2V0WCA9IGUueDsKKwkJCWxhc3RPZmZzZXRZID0gZS55OworCisJCQkvLyBEaWQgd2UgbW92ZSBmcm9tIHRoZSBzcG90IHdoZXJlIHRoZSBtb3VzZSB3ZW50IGRvd24/CisJCQlpZiAobmV3WCAhPSAwIHx8IG5ld1kgIT0gMCkgeworCQkJCS8vIFllcworCQkJCS8vIFRoaXMgaXMgYSB0cmFuc2xhdGlvbiBvZiB0aGUgbWFwIHRoZW4KKwkJCQkvLyB1cGRhdGUgdGhlIGNhbnZhcyB0cmFuc2xhdGlvbgorCQkJCWFkZFRyYW5zbGF0aW9uKG5ld1gsIG5ld1kpOworCQkJfSAvLyBpZiBtb3ZlZAorCQl9CisJfQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIjd2lkZ2V0RGlzcG9zZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIERpc3Bvc2VFdmVudCBlKSB7CisJCWlmICghaXNEaXNwb3NlZCgpKSB7CisJCQlkaXNwb3NlKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gcG9seWdvbnNUb1JlbmRlcgorCSAqLworCXB1YmxpYyB2b2lkIHJlbmRlcihmaW5hbCBTdGVtUG9seWdvbnNMaXN0IHBvbHlnb25zVG9SZW5kZXIpIHsKKwkJdGhpcy5wb2x5Z29uc1RvUmVuZGVyID0gcG9seWdvbnNUb1JlbmRlcjsKKwkJcmVkcmF3KCk7CisJfSAvLyByZW5kZXIKKworCS8qKgorCSAqIEBwYXJhbSBkcmF3UG9seWdvbkJvcmRlcnMKKwkgKi8KKwlwdWJsaWMgZmluYWwgdm9pZCBzZXREcmF3UG9seWdvbkJvcmRlcnMoZmluYWwgYm9vbGVhbiBkcmF3UG9seWdvbkJvcmRlcnMpIHsKKwkJdGhpcy5kcmF3UG9seWdvbkJvcmRlcnMgPSBkcmF3UG9seWdvbkJvcmRlcnM7CisJfQorCisJLyoqCisJICogQHBhcmFtIGdhaW5GYWN0b3IKKwkgKi8KKwlwdWJsaWMgZmluYWwgdm9pZCBzZXRHYWluRmFjdG9yKGZpbmFsIGZsb2F0IGdhaW5GYWN0b3IpIHsKKwkJdGhpcy5nYWluRmFjdG9yID0gZ2FpbkZhY3RvcjsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdXNlTG9nU2NhbGluZworCSAqLworCXB1YmxpYyBmaW5hbCB2b2lkIHNldFVzZUxvZ1NjYWxpbmcoZmluYWwgYm9vbGVhbiB1c2VMb2dTY2FsaW5nKSB7CisJCXRoaXMudXNlTG9nU2NhbGluZyA9IHVzZUxvZ1NjYWxpbmc7CisJfQorCisJLyoqCisJICogUmVzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJeFRyYW5zbGF0aW9uID0gSU5JVElBTF9YX1RSQU5TTEFUSU9OOworCQl5VHJhbnNsYXRpb24gPSBJTklUSUFMX1lfVFJBTlNMQVRJT047CisJCXpvb21GYWN0b3IgPSBJTklUSUFMX1pPT01fRkFDVE9SOworCX0gLy8gcmVzZXQKKworCS8qKgorCSAqIFRoZSBtZXRob2Qgd2hpY2ggZ2V0cyB0aGUgTWFwQ2FudmFzJyBwb2x5Z29ucyBsaXN0LCBhbmQgZHJhd3MgaXQgb24gdGhlCisJICogTWFwQ2FudmFzLgorCSAqIAorCSAqIEBwYXJhbSBnYworCSAqIEBwYXJhbSB4CisJICogQHBhcmFtIHkKKwkgKiBAcGFyYW0gd2lkdGgKKwkgKiBAcGFyYW0gaGVpZ2h0CisJICovCisJdm9pZCBkcmF3KGZpbmFsIEdDIGdjLCBmaW5hbCBpbnQgeCwgZmluYWwgaW50IHksIGZpbmFsIGludCB3aWR0aCwKKwkJCWZpbmFsIGludCBoZWlnaHQpIHsKKwkJCisJCWdjLnNldEJhY2tncm91bmQoc3RkQ29sb3JQcm92aWRlci5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7CisJCWRyYXdCYWNrZ3JvdW5kKGdjLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKwkJZ2Muc2V0TGluZVdpZHRoKDApOyAvL1plcm8gbWVhbnMgdGhlIGZhc3Rlc3QgcG9zc2libGUgbGluZSBkcmF3aW5nIGFsZ29yaXRobQorCQkKKwkKKwkJCisJCWlmIChwb2x5Z29uc1RvUmVuZGVyID09IG51bGwgfHwgcG9seWdvbnNUb1JlbmRlci5pc0VtcHR5KCkpIHsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJLy9EbyB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSB0cmFuc2Zvcm0/CisJCWlmICh0b1VwZGF0ZVRyYW5mb3JtKSB7CisJCQkvL1llcywgY29tcHV0ZSBpdAorCQkJY29tcHV0ZVRyYW5zZm9ybShwb2x5Z29uc1RvUmVuZGVyKTsKKwkJCS8vVXBkYXRlIGFsbCBwb2x5Z29ucyBhYm91dCB0aGUgY2hhbmdlcyBpbiB0aGUgdHJhbnNmb3JtCisJCQlmb3IgKFN0ZW1Qb2x5Z29uIHN0ZW1wb2x5IDogcG9seWdvbnNUb1JlbmRlcikgeworCQkJCXN0ZW1wb2x5LnNldFBvaW50c1RyYW5zZm9ybWVyKHBvaW50c1RyYW5zZm9ybWVyKTsKKwkJCX0KKwkJCXRvVXBkYXRlVHJhbmZvcm0gPSBmYWxzZTsKKwkJfQorCQkKKwkJQ29sb3IgYm9yZGVyc0NvbG9yID0gc3RkQ29sb3JQcm92aWRlci5nZXRCb3JkZXJzQ29sb3IoKTsKKwkJCisJCWZvciAoZmluYWwgU3RlbVBvbHlnb24gc3RlbXBvbHkgOiBwb2x5Z29uc1RvUmVuZGVyKSB7CisJCQkKKwkJCUlkZW50aWZpYWJsZSBpZGVudGlmaWFibGUgPSBzdGVtcG9seS5nZXRJZGVudGlmaWFibGUoKTsKKwkJCQorCQkJaWYgKGlkZW50aWZpYWJsZSBpbnN0YW5jZW9mIE5vZGUpIHsKKwkJCQljb2xvclByb3ZpZGVyLnNldFRhcmdldChpZGVudGlmaWFibGUpOworCQkJCQorCQkJCS8vVXBkYXRlIHRoZSBHMkQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY29sb3IgYmVmb3JlIGZpbGxpbmcgdGhlIHBvbHlnb24KKwkJCQljb2xvclByb3ZpZGVyLnVwZGF0ZUdDKGdjLCBnYWluRmFjdG9yLCB1c2VMb2dTY2FsaW5nKTsKKwkJCQlnYy5maWxsUG9seWdvbihzdGVtcG9seS50cmFuc2Zvcm1lZFBvaW50cyk7CisJCQkJCQorCQkJCWlmIChkcmF3UG9seWdvbkJvcmRlcnMpIHsKKwkJCQkJZ2Muc2V0Rm9yZWdyb3VuZChib3JkZXJzQ29sb3IpOworCQkJCQlnYy5zZXRBbHBoYSgyNTUpOworCQkJCQlnYy5kcmF3UG9seWdvbihzdGVtcG9seS50cmFuc2Zvcm1lZFBvaW50cyk7CisJCQkJfQorCQkJfQorCQkJCisJCQlpZiAoaWRlbnRpZmlhYmxlIGluc3RhbmNlb2YgRWRnZSkgeworCQkJCQorCQkJCWdjLnNldEZvcmVncm91bmQoc3RkQ29sb3JQcm92aWRlci5nZXRFZGdlc0NvbG9yKCkpOworCQkJCWlmIChzdGVtcG9seS50cmFuc2Zvcm1lZFBvaW50cyA9PSBudWxsKSB7CisJCQkJCXN0ZW1wb2x5LnNldFBvaW50c1RyYW5zZm9ybWVyKHBvaW50c1RyYW5zZm9ybWVyKTsKKwkJCQl9CisJCQkJZ2MuZHJhd0xpbmUoCisJCQkJCQlzdGVtcG9seS50cmFuc2Zvcm1lZFBvaW50c1swXSwgCisJCQkJCQlzdGVtcG9seS50cmFuc2Zvcm1lZFBvaW50c1sxXSwgCisJCQkJCQlzdGVtcG9seS50cmFuc2Zvcm1lZFBvaW50c1syXSwgCisJCQkJCQlzdGVtcG9seS50cmFuc2Zvcm1lZFBvaW50c1szXSk7CisJCQl9CisJCX0gLy8gZm9yIGVhY2ggU3RlbVBvbHlnb24KKwkJCisJCQorLy8JCWlmKGNvbG9yUHJvdmlkZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlcikgeworLy8JCQlBYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlciBjID0gKEFic3RyYWN0UmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyKSBjb2xvclByb3ZpZGVyOworLy8JCQlkcmF3Q29sb3JTY2FsZShjKTsKKy8vCQl9CisJCQorCQlnYy5zZXRGb3JlZ3JvdW5kKGdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKTsKKwl9IC8vIGRyYXcKKwkKKwkKKwkKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gYWRhcHRlcgorCSAqLworLy8JcHJpdmF0ZSB2b2lkIGRyYXdDb2xvclNjYWxlKEFic3RyYWN0UmVsYXRpdmVWYWx1ZUNvbG9yUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIpIHsKKy8vCQlDb2xvciBzYXR1cmF0ZWRDb2xvciA9IGFkYXB0ZXIuZ2V0Rm9yZWdyb3VuZEZpbGxDb2xvcigpOyAvLyB0byB0cmFuc3BhcmVudCBjb2xvciBvdmVyIHRoZSBiYWNrZ3JvdW5kCisvLwkJQ29sb3IgdGV4dENvbG9yID0gc2F0dXJhdGVkQ29sb3I7IC8vIHRleHQKKy8vCQlDb2xvciBiYWNrR3JvdW5kID0gYWRhcHRlci5nZXRCYWNrZ3JvdW5kRmlsbENvbG9yKCk7IC8vIHRleHRCYWNrZ3JvdW5kCisvLwkJCisvLwkJaWYgKGNvbG9yU2NhbGUgPT0gbnVsbCkgeworLy8JCQljb2xvclNjYWxlID0gbmV3IENvbG9yU2NhbGVDb21wb3NpdGUodGhpcywgc2F0dXJhdGVkQ29sb3IsIG5ldyBkb3VibGVbXXswLjAsIDEuMC9nYWluRmFjdG9yfSwgdXNlTG9nU2NhbGluZywgU1dULkJPUkRFUiwgYmFja0dyb3VuZCwgdGV4dENvbG9yKTsKKy8vCQl9CisvLwkJY29sb3JTY2FsZS51cGRhdGVDb2xvclNjYWxlKHNhdHVyYXRlZENvbG9yLCBuZXcgZG91YmxlW117MC4wLCAxLjAvZ2FpbkZhY3Rvcn0sdXNlTG9nU2NhbGluZywgYmFja0dyb3VuZCwgdGV4dENvbG9yKTsKKy8vCX0KKworCS8qKgorCSAqIEBwYXJhbSBwb2x5Z29uTGlzdAorCSAqLworCXByaXZhdGUgdm9pZCBjb21wdXRlVHJhbnNmb3JtKGZpbmFsIFN0ZW1Qb2x5Z29uc0xpc3QgcG9seWdvbkxpc3QpIHsKKwkJaWYgKHBvbHlnb25zQm91bmRzUmVjdCA9PSBudWxsKSB7CisJCQlwb2x5Z29uc0JvdW5kc1JlY3QgPSBwb2x5Z29uTGlzdC5nZXRCb3VuZHMoKTsKKwkJCWlmIChwb2x5Z29uc0JvdW5kc1JlY3QgPT0gbnVsbCkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQkKKwkJZmluYWwgUmVjdGFuZ2xlIGNhbnZhc0JvdW5kcyA9IGdldEJvdW5kcygpOworCisJCWZpbmFsIGludCBlZmZlY3RpdmVDYW52YXNXaWR0aCA9IGNhbnZhc0JvdW5kcy53aWR0aCAtIDIgKiBNQVJHSU47CisJCWZpbmFsIGludCBlZmZlY3RpdmVDYW52YXNIZWlnaHQgPSBjYW52YXNCb3VuZHMuaGVpZ2h0IC0gMiAqIE1BUkdJTjsKKwkJZmluYWwgZG91YmxlIHdpZHRoID0gcG9seWdvbnNCb3VuZHNSZWN0LndpZHRoOworCQlmaW5hbCBkb3VibGUgaGVpZ2h0ID0gcG9seWdvbnNCb3VuZHNSZWN0LmhlaWdodDsKKwkJZmluYWwgZG91YmxlIFdJRFRIX1JBVElPID0gZWZmZWN0aXZlQ2FudmFzV2lkdGggLyB3aWR0aDsKKwkJZmluYWwgZG91YmxlIEhFSUdIVF9SQVRJTyA9IGVmZmVjdGl2ZUNhbnZhc0hlaWdodCAvIGhlaWdodDsKKwkJZmluYWwgZG91YmxlIFNDQUxFX0ZBQ1RPUiA9IE1hdGgubWluKFdJRFRIX1JBVElPLCBIRUlHSFRfUkFUSU8pCisJCQkJKiB6b29tRmFjdG9yOworCisJCS8vIEZpZ3VyZSBvdXQgdGhlIGV4dHJhIHRyYW5zbGF0aW9uIG5lZWRlZCB0byBjZW50ZXIgdGhlIGltYWdlIGVpdGhlcgorCQkvLyB2ZXJ0aWNhbGx5IG9yIGhvcml6b250YWxseSBpbiB0aGUgY2FudmFzCisJCWludCB4Q2VudGVyaW5nVHJhbnNsYXRpb24gPSAwOworCQlpbnQgeUNlbnRlcmluZ1RyYW5zbGF0aW9uID0gMDsKKwkJLy8gQW55dGhpbmcgdG8gY2VudGVyPworCQlpZiAod2lkdGggPiAwICYmIGhlaWdodCA+IDApIHsKKwkJCS8vIFllcworCQkJeENlbnRlcmluZ1RyYW5zbGF0aW9uID0gKGVmZmVjdGl2ZUNhbnZhc1dpZHRoIC0gKGludCkgKHdpZHRoICogU0NBTEVfRkFDVE9SKSkgLyAyOworCQkJeUNlbnRlcmluZ1RyYW5zbGF0aW9uID0gKGVmZmVjdGl2ZUNhbnZhc0hlaWdodCAtIChpbnQpIChoZWlnaHQgKiBTQ0FMRV9GQUNUT1IpKSAvIDI7CisJCX0gLy8gaWYgYW55dGhpbmcgdG8gY2VudGVyCisJCWludCBib3VuZHNNaW5YID0gcG9seWdvbnNCb3VuZHNSZWN0Lng7CisJCWludCBib3VuZHNNaW5ZID0gcG9seWdvbnNCb3VuZHNSZWN0Lnk7CisJCQorCQlwb2ludHNUcmFuc2Zvcm1lci5zZXRPZmZzZXRYKC1ib3VuZHNNaW5YICogU0NBTEVfRkFDVE9SICsgTUFSR0lOICsgeENlbnRlcmluZ1RyYW5zbGF0aW9uICsgeFRyYW5zbGF0aW9uICogem9vbUZhY3Rvcik7CisJCXBvaW50c1RyYW5zZm9ybWVyLnNldE9mZnNldFkoLWJvdW5kc01pblkgKiBTQ0FMRV9GQUNUT1IgKyBNQVJHSU4gKyB5Q2VudGVyaW5nVHJhbnNsYXRpb24gKyB5VHJhbnNsYXRpb24gKiB6b29tRmFjdG9yKTsKKwkJcG9pbnRzVHJhbnNmb3JtZXIuc2V0U2NhbGUoU0NBTEVfRkFDVE9SKTsKKwl9IC8vIGNvbXB1dGVUcmFuc2Zvcm0KKworCXZvaWQgem9vbUluKCkgeworCQl6b29tRmFjdG9yICo9IFpPT01JTkdfRkFDVE9SOworCQl0b1VwZGF0ZVRyYW5mb3JtID0gdHJ1ZTsKKwkJcmVkcmF3KCk7CisJfQorCisJdm9pZCB6b29tT3V0KCkgeworCQl6b29tRmFjdG9yICo9IFVOWk9PTUlOR19GQUNUT1I7CisJCXRvVXBkYXRlVHJhbmZvcm0gPSB0cnVlOworCQlyZWRyYXcoKTsKKwl9CisJCisJLyoqCisJICoKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE1vdXNlVHJhY2tIYW5kbGVyIGV4dGVuZHMgTW91c2VUcmFja0FkYXB0ZXIgeworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgbW91c2VFbnRlcihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJZmluYWwgTW91c2VFdmVudCBlKSB7CisJCQkKKwkJCS8vIFRoZSBNYXAgZG9lcyBub3QgTkVFRCB0byBzdGVhbCBmb2N1cyBhdCBhbGwKKwkJCS8vIElGIGluIHRoZSBmdXR1cmUgd2UgbmVlZCBmb2N1cyB0aGVuIHRoZSBmb2xsb3dpbmcKKwkJCS8vIEd1YXJkIGNsYXVzZWQgcHJvdGVjdHMgYWdhaW5zdCBpcnJlbGV2YW50L3VubmVlZGVkIHN0ZWFsaW5nIG9mIGZvY3VzCisJCQkKKwkJCS8vIGlmIHRoZXJlIGlzIE5PVEhJTkcgaW4gdGhlIG1hcCwgZG9uJ3Qgc3RlYWwgZm9jdXMKKwkJCS8vaWYgKHBvbHlnb25zVG9SZW5kZXIgIT0gbnVsbCAmJiAhcG9seWdvbnNUb1JlbmRlci5pc0VtcHR5KCkpIHsKKwkJCQkvL2ZvcmNlRm9jdXMoKTsKKwkJCS8vfQorCQl9CisJfQorCQorCS8qKgorCSAqIAorCSAqLworCXByb3RlY3RlZCBjbGFzcyBLZXlIYW5kbGVyIGV4dGVuZHMgS2V5QWRhcHRlciB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChmaW5hbCBLZXlFdmVudCBlKSB7CisJCQlzd2l0Y2ggKGUua2V5Q29kZSkgeworCQkJY2FzZSBTV1QuQVJST1dfVVA6CisJCQkJem9vbUluKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNXVC5BUlJPV19ET1dOOgorCQkJCXpvb21PdXQoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9IC8vIHN3aXRjaAorCQl9CisJfQorCisJLyoqCisJICogQSBoZWxwZXIgY2xhc3MgdGhhdCBkZWZpbmVzIGEgbW91c2UtbGlzdGVuZXIgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIHVzZXIKKwkgKiB0aGUgYWJpbGl0eSB0byBtb3ZlIHRoZSBtYXAgaW5zaWRlIHRoZSB2aWV3LgorCSAqIAorCSAqLworCXByb3RlY3RlZCBjbGFzcyBNb3VzZUJ1dHRvbkhhbmRsZXIgZXh0ZW5kcyBNb3VzZUFkYXB0ZXIgeworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXIjbW91c2VEb3duKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oZmluYWwgTW91c2VFdmVudCBlKSB7CisJCQkvLyBJcyB0aGUgbGVmdCBtb3VzZSBidXR0b24/CisJCQlpZiAoZS5idXR0b24gPT0gMSkgeworCQkJCS8vIFllcworCQkJCS8vIENhcHR1cmUgdGhlIHN0YXJ0aW5nIHBvaW50CisJCQkJbGFzdE9mZnNldFggPSBlLng7CisJCQkJbGFzdE9mZnNldFkgPSBlLnk7CisJCQkJbGVmdE1vdXNlQnV0dG9uUHJlc3NlZCA9IHRydWU7CisJCQl9IC8vIGlmCisJCX0gLy8gbW91c2VEb3duCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyI21vdXNlVXAob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50KQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIG1vdXNlVXAoZmluYWwgTW91c2VFdmVudCBlKSB7CisJCQkvLyBJcyBpdCB0aGUgbGVmdCBtb3VzZSBidXR0b24/CisJCQlpZiAoZS5idXR0b24gPT0gMSkgeworCQkJCS8vIFllcworCQkJCS8vIG5ldyB4IGFuZCB5IGFyZSBkZWZpbmVkIGJ5IGN1cnJlbnQgbW91c2UgbG9jYXRpb24gc3VidHJhY3RlZAorCQkJCS8vIGJ5IHByZXZpb3VzbHkgcHJvY2Vzc2VkIG1vdXNlIGxvY2F0aW9uCisJCQkJZmluYWwgaW50IG5ld1ggPSBlLnggLSBsYXN0T2Zmc2V0WDsKKwkJCQlmaW5hbCBpbnQgbmV3WSA9IGUueSAtIGxhc3RPZmZzZXRZOworCisJCQkJLy8gRGlkIHdlIG1vdmUgZnJvbSB0aGUgc3BvdCB3aGVyZSB0aGUgbW91c2Ugd2VudCBkb3duPworCQkJCWlmIChuZXdYICE9IDAgfHwgbmV3WSAhPSAwKSB7CisJCQkJCS8vIFllcworCQkJCQkvLyBUaGlzIGlzIGEgdHJhbnNsYXRpb24gb2YgdGhlIG1hcCB0aGVuCisJCQkJCS8vIHVwZGF0ZSB0aGUgY2FudmFzIHRyYW5zbGF0aW9uCisJCQkJCWFkZFRyYW5zbGF0aW9uKG5ld1gsIG5ld1kpOworCQkJCX0gLy8gaWYgbW92ZWQKKwkJCQllbHNlIHsKKwkJCQkJLy8gTm8KKwkJCQkJLy8gVGhpcyBpcyBhIHBvdGVudGlhbCBzZWxlY3Rpb24gb2YgYSBwb2x5Z29uCisJCQkJCWZpbmFsIFN0ZW1Qb2x5Z29uIHBvbHlnb24gPSBnZXRQb2x5Z29uKGUpOworCQkJCQkvLyBBcmUgd2UgY2xpY2tpbmcgb24gYSBwb2x5Z29uPworCQkJCQlpZiAocG9seWdvbiAhPSBudWxsKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCS8vIEdldCB0aGUgSWRlbnRpZmlhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9seWdvbiBhbmQKKwkJCQkJCS8vIG1ha2UgaXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgorCQkJCQkJLy8gQnVpbGQgdGhlIEdlb2dyYXBoaWNTZWxlY3Rpb25FbGVtZW50cworCQkJCQkJLy8gYW5kIHBhc3MgaXQgdmlhIHRoZSBTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFzIHRoZSAybmQKKwkJCQkJCS8vIGVsZW1lbnQKKwkJCQkJCWZpbmFsIEdlb2dyYXBoaWNTZWxlY3Rpb25FbGVtZW50cyBnc2UgPSBuZXcgR2VvZ3JhcGhpY1NlbGVjdGlvbkVsZW1lbnRzKCk7CisKKwkJCQkJCS8vIENvbnZlcnQgZnJvbSBjYW52YXMgc3BhY2UgY29vcmRpbmF0ZXMgdG8gbGF0L2xvbmcgYnkKKwkJCQkJCS8vIHRoZSBpbnZlcnNlCisJCQkJCQkvLyB0cmFuc2Zvcm0uCisJCQkJCQlmaW5hbCBQb2ludCBsYXRMb25nUG9zaXRpb24gPSBwb2ludHNUcmFuc2Zvcm1lci5nZXRJbnZlcnNlZFBvaW50KGUueCwgZS55KTsvL2ludmVyc2VNYXAobmV3IFBvaW50KGUueCwgZS55KSk7CisJCQkJCQlmaW5hbCBkb3VibGUgbG9uZ2l0dWRlID0gcG9seWdvbgorCQkJCQkJCQkudW5TY2FsZUxvbmdpdHVkZShsYXRMb25nUG9zaXRpb24ueCk7CisJCQkJCQlmaW5hbCBkb3VibGUgbGF0aXR1ZGUgPSBwb2x5Z29uCisJCQkJCQkJCS51blNjYWxlTGF0aXR1ZGUobGF0TG9uZ1Bvc2l0aW9uLnkpOworCQkJCQkJZ3NlLnNldFBvaW50KGxvbmdpdHVkZSwgbGF0aXR1ZGUpOworCQkJCQkJZmluYWwgSWRlbnRpZmlhYmxlIHJlZ25JbXBsID0gcG9seWdvbi5nZXRJZGVudGlmaWFibGUoKTsKKwkJCQkJCWZpbmFsIE9iamVjdFtdIGVsZW1lbnRzID0gbmV3IE9iamVjdFtdIHsgcmVnbkltcGwsIGdzZSB9OworCQkJCQkJZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCisJCQkJCQkJCWVsZW1lbnRzKTsKKwkJCQkJCWZpcmVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKKwkJCQkJfQorCQkJCX0gLy8gZWxzZSBkaWRuJ3QgbW92ZQorCQkJCWxlZnRNb3VzZUJ1dHRvblByZXNzZWQgPSBmYWxzZTsKKwkJCX0gLy8gaWYgbGVmdCBtb3VzZSBidXR0b24KKwkJCS8vUmVtZW1iZXIgdGhlIG1hcCBjYW52YXMgdGhhdCBoYXMgYmVlbiBjbGlja2VkIG9uCisJCQlTZWxlY3RlZFJlcG9ydHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2V0UmVjZW50Q2xpY2tlZE1hcENhbnZhcygoTWFwQ2FudmFzKWUuZ2V0U291cmNlKCkpOworCQl9IC8vIG1vdXNlVXAJCQorCX0gLy8gTW91c2VCdXR0b25IYW5kbGVyCisKKwlwcm90ZWN0ZWQgY2xhc3MgTW91c2VIb3ZlckhhbmRsZXIgZXh0ZW5kcyBNb3VzZVRyYWNrQWRhcHRlciB7CisKKy8vCQlAT3ZlcnJpZGUKKy8vCQlwdWJsaWMgdm9pZCBtb3VzZUVudGVyKE1vdXNlRXZlbnQgZSkgeworLy8JCQlmaW5hbCBDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvcihnZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfU0laRUFMTCk7CisvLwkJCUNhbnZhcyBtYXBDYW52YXMgPSAoQ2FudmFzKWUuZ2V0U291cmNlKCk7CisvLwkJCW1hcENhbnZhcy5zZXRDdXJzb3IoY3Vyc29yKTsKKy8vCQkJc3VwZXIubW91c2VFbnRlcihlKTsKKy8vCQl9CisvLworLy8JCUBPdmVycmlkZQorLy8JCXB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsKKy8vCQkJZmluYWwgQ3Vyc29yIGN1cnNvciA9IG5ldyBDdXJzb3IoZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX0FSUk9XKTsKKy8vCQkJQ2FudmFzIG1hcENhbnZhcyA9IChDYW52YXMpZS5nZXRTb3VyY2UoKTsKKy8vCQkJbWFwQ2FudmFzLnNldEN1cnNvcihjdXJzb3IpOworLy8JCQlzdXBlci5tb3VzZUV4aXQoZSk7CisvLwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0xpc3RlbmVyI21vdXNlSG92ZXIob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50KQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIG1vdXNlSG92ZXIoZmluYWwgTW91c2VFdmVudCBlKSB7CQkJCisJCQkvLyBDb252ZXJ0IGZyb20gY2FudmFzIHNwYWNlIGNvb3JkaW5hdGVzIHRvIGxhdC9sb25nIGJ5IHRoZSBpbnZlcnNlCisJCQkvLyB0cmFuc2Zvcm0uCisJCQlmaW5hbCBQb2ludCBsYXRMb25nUG9zaXRpb24gPSBwb2ludHNUcmFuc2Zvcm1lci5nZXRJbnZlcnNlZFBvaW50KGUueCwgZS55KTsvL2ludmVyc2VNYXAobmV3IFBvaW50KGUueCwgZS55KSk7CisJCQkKKwkJCS8vIFRyeSB0byBnZXQgdGhlIHBvbHlnb24gdGhhdCBtYXRjaGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbW91c2UKKwkJCWZpbmFsIFN0ZW1Qb2x5Z29uIHBvbHlnb24gPSBnZXRQb2x5Z29uKGxhdExvbmdQb3NpdGlvbik7CisKKwkJCS8vIERpZCB3ZSBmaW5kIGFuIGVuY2xvc2luZyBwb2x5Z29uPworCQkJaWYgKHBvbHlnb24gIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCS8vIFdlIHdhbnQgdG8gZ2V0IHRoZSBJU08ta2V5IGZvciB0aGUgaWRlbnRpZmlhYmxlLCBpdCB3aWxsIGJlCisJCQkJLy8gYXQgdGhlIGVuZCBvZiB0aGUgdmFsdWUgb2YgdGhlIGR1YmxpbiBjb3JlICJpZGVudGlmaWVyIgorCQkJCS8vIGF0dHJpYnV0ZQorCQkJCUlkZW50aWZpYWJsZSBpZGVudGlmaWFibGUgPSBwb2x5Z29uLmdldElkZW50aWZpYWJsZSgpOworCQkJCWZpbmFsIER1YmxpbkNvcmUgZGMgPSBpZGVudGlmaWFibGUuZ2V0RHVibGluQ29yZSgpOworCQkJCWZpbmFsIFN0cmluZyBkY0lkZW50aWZpZXIgPSBkYy5nZXRJZGVudGlmaWVyKCk7CisKKwkJCQlmaW5hbCBTdHJpbmcgaXNvS2V5ID0gZGNJZGVudGlmaWVyLnN1YnN0cmluZyhkY0lkZW50aWZpZXIKKwkJCQkJCS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CQkJCQorCQkJCS8vIERpZCB3ZSBnZXQgaXQ/CisJCQkJaWYgKGlzb0tleSAhPSBudWxsICYmICFpc29LZXkuZXF1YWxzKCIiKSkgeworCQkJCQkvLyBZZXMKKwkJCQkJZmluYWwgU3RyaW5nIGdlb2dyYXBoaWNOYW1lID0gR2VvZ3JhcGhpY05hbWVzCisJCQkJCQkJLmdldE5hbWUoaXNvS2V5KTsKKwkJCQkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGdlb2dyYXBoaWNOYW1lKTsKKwkJCQkJc2IuYXBwZW5kKCIgKCIpOworCQkJCQlzYi5hcHBlbmQoaXNvS2V5KTsKKwkJCQkJc2IuYXBwZW5kKCIpIik7CisJCQkJCQorCQkJCQlSZWdpb24gcmVnaW9uID0gKFJlZ2lvbilpZGVudGlmaWFibGU7CisJCQkJCWZvciAoTm9kZUxhYmVsIG5leHRMYWJlbCA6IHJlZ2lvbi5nZXRMYWJlbHMoKSkgeworCQkJCQkJaWYgKG5leHRMYWJlbCBpbnN0YW5jZW9mIFBvcHVsYXRpb25Nb2RlbExhYmVsKSB7CisJCQkJCQkJc2IuYXBwZW5kKCJcblBvcHVsYXRpb24gKG5vdyk6ICIgKyBuZXh0TGFiZWwpOworCQkJCQkJfQorCQkJCQkJaWYobmV4dExhYmVsIGluc3RhbmNlb2YgUG9wdWxhdGlvbkxhYmVsKSB7CisJCQkJCQkJc2IuYXBwZW5kKCJcblBvcHVsYXRpb24gKCIrKChQb3B1bGF0aW9uTGFiZWwpbmV4dExhYmVsKS5nZXRWYWxpZFllYXIoKSsiKToiK25leHRMYWJlbCk7CisJCQkJCQl9CisJCQkJCQlpZiAobmV4dExhYmVsIGluc3RhbmNlb2YgQXJlYUxhYmVsKSB7CisJCQkJCQkJc2IuYXBwZW5kKCJcbkFyZWE6ICIgKyBuZXh0TGFiZWwpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKGxhdExvbmdQb3NpdGlvbiAhPSBudWxsKSB7CisJCQkJCQlkb3VibGUgbGF0aXR1ZGUgPSAtMSAqIFN0ZW1Qb2x5Z29uLmdldFVuc2NhbGVkTGF0aXR1ZGUobGF0TG9uZ1Bvc2l0aW9uLnkpOworCQkJCQkJZG91YmxlIGxvbmdpdHVkZSA9IC0xICogU3RlbVBvbHlnb24uZ2V0VW5zY2FsZWRMb25naXR1ZGUobGF0TG9uZ1Bvc2l0aW9uLngpOworCQkJCQkJc2IuYXBwZW5kKCJcbkxhdGl0dWRlOiAiICsgbGF0aXR1ZGUgICsgIiwgTG9uZ2l0dWRlOiAiICsgbG9uZ2l0dWRlKTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJc2V0VG9vbFRpcFRleHQoc2IudG9TdHJpbmcoKSk7CisJCQkJfSAvLyBpZgorCQkJCWVsc2UgeworCQkJCQlzZXRUb29sVGlwVGV4dChwb2x5Z29uLmdldFRpdGxlKCkpOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIC8vIFllcyAvL21hcENhbnZhcy5zZXRUb29sVGlwVGV4dChwb2x5Z29uLmdldFRpdGxlKCkgKyAiXG4iCisJCQkJICogK3BvbHlnb24uZ2V0UmVsYXRpdmVWYWx1ZSgpKTsKKwkJCQkgKiAKKwkJCQkgKiBTdHJpbmcga2V5ID0KKwkJCQkgKiBwcm9wZXJ0eVNlbGVjdGlvbkNvbnRyb2wuZ2V0U2VsZWN0ZWRQcm9wZXJ0eVN0cmluZygpOworCQkJCSAqIG1hcENhbnZhcy5zZXRUb29sVGlwVGV4dCgiTmFtZTogIiArIHBvbHlnb24uZ2V0VGl0bGUoKSArICJcbiIgKworCQkJCSAqICJSZWxhdGl2ZSBWYWx1ZTogIiArIHBvbHlnb24uZ2V0UmVsYXRpdmVWYWx1ZShrZXkpKTsKKwkJCQkgKi8KKwkJCX0gLy8gaWYKKwkJCWVsc2UgeworCQkJCS8vIE5vCisJCQkJc2V0VG9vbFRpcFRleHQobnVsbCk7CisJCQl9CisJCX0gLy8gbW91c2VIb3ZlcgorCisJfSAvLyBNb3VzZUhvdmVySGFuZGxlcgorCisJLyoqCisJICogQHBhcmFtIGUKKwkgKiAgICAgICAgICAgIGEgbW91c2UgZXZlbnQKKwkgKiBAcmV0dXJuIHRoZSBwb2x5Z29uIHRoZSBtYXRjaGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbW91c2UsIG9yCisJICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzdWNoIHBvbHlnb24uCisJICovCisJU3RlbVBvbHlnb24gZ2V0UG9seWdvbihmaW5hbCBNb3VzZUV2ZW50IGUpIHsKKwkJLy8gQ29udmVydCBmcm9tIGNhbnZhcyBzcGFjZSBjb29yZGluYXRlcyB0byBsYXQvbG9uZyBieSB0aGUgaW52ZXJzZQorCQkvLyB0cmFuc2Zvcm0uCisJCS8vZmluYWwgUG9pbnQgbGF0TG9uZ1Bvc2l0aW9uID0gaW52ZXJzZU1hcChuZXcgUG9pbnQoZS54LCBlLnkpKTsKKwkJZmluYWwgUG9pbnQgbGF0TG9uZ1Bvc2l0aW9uID0gcG9pbnRzVHJhbnNmb3JtZXIuZ2V0SW52ZXJzZWRQb2ludChlLngsIGUueSk7CisJCXJldHVybiBnZXRQb2x5Z29uKGxhdExvbmdQb3NpdGlvbik7CisJCQorCX0gLy8gZ2V0UG9seWdvbgorCQorCS8qKgorCSAqIEBwYXJhbSBwb2ludCBhIHBvaW50IChwcm9iYWJseSB3aXRoaW4gdGhlIHBvbHlnb24pCisJICogQHJldHVybiB0aGUgcG9seWdvbiB0aGUgbWF0Y2hlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHBvaW50LCBvcgorCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaCBwb2x5Z29uLgorCSAqLworCVN0ZW1Qb2x5Z29uIGdldFBvbHlnb24oZmluYWwgUG9pbnQgcG9pbnQpIHsKKwkJU3RlbVBvbHlnb24gcmV0VmFsdWUgPSBudWxsOworCQkKKwkJaWYgKHBvaW50ICE9IG51bGwgJiYgcG9seWdvbnNUb1JlbmRlciAhPSBudWxsKSB7CisJCQkvLyBGaW5kIHRoZSBQb2x5Z29uIHRoYXQgY29udGFpbnMgdGhlIGxhdC9sb25nIGNvb3JkaW5hdGVzCisJCQlyZXRWYWx1ZSA9IHBvbHlnb25zVG9SZW5kZXIuZ2V0Q29udGFpbmluZ1JlZ2lvblBvbHlnb24ocG9pbnQpOworCQl9IC8vIGlmCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldFBvbHlnb24KKworCS8qKgorCSAqIEFkZHMgb2Zmc2V0cyB0byB0aGUgY3VycmVudCB0cmFuc2xhdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0geFRyYW5zbGF0aW9uQWRkaXRpb24KKwkgKiBAcGFyYW0geVRyYW5zbGF0aW9uQWRkaXRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUcmFuc2xhdGlvbihmaW5hbCBkb3VibGUgeFRyYW5zbGF0aW9uQWRkaXRpb24sCisJCQlmaW5hbCBkb3VibGUgeVRyYW5zbGF0aW9uQWRkaXRpb24pIHsKKwkJdGhpcy54VHJhbnNsYXRpb24gKz0gKHhUcmFuc2xhdGlvbkFkZGl0aW9uIC8gem9vbUZhY3Rvcik7CisJCXRoaXMueVRyYW5zbGF0aW9uICs9ICh5VHJhbnNsYXRpb25BZGRpdGlvbiAvIHpvb21GYWN0b3IpOworCQl0b1VwZGF0ZVRyYW5mb3JtID0gdHJ1ZTsKKwkJcmVkcmF3KCk7CisJfSAvLyBhZGRUcmFuc2xhdGlvbgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKKwkJCWZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCisJCQlmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24KKwkgKi8KKwlwdWJsaWMgZmluYWwgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7CisJCXJldHVybiBzZWxlY3Rpb247CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNzZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKwkJZmlyZVNlbGVjdGlvbihzZWxlY3Rpb24pOworCX0KKworCXZvaWQgZmlyZVNlbGVjdGlvbihmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCisJCWZpbmFsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywKKwkJCQlzZWxlY3Rpb24pOworCQlmb3IgKGZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgOiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzKSB7CisJCQlsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKKwkJfSAvLyBmb3IgZWFjaCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCisKKwl9IC8vIGZpcmVTZWxlY3Rpb24KKworCS8qKgorCSAqIEBwYXJhbSBjb2xvclByb3ZpZGVyIHRoZSBjb2xvclByb3ZpZGVyIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbG9yUHJvdmlkZXIoQ29sb3JQcm92aWRlckFkYXB0ZXIgY29sb3JQcm92aWRlcikgeworCQl0aGlzLmNvbG9yUHJvdmlkZXIgPSBjb2xvclByb3ZpZGVyOworCQkKKy8vCQlpZihjb2xvclByb3ZpZGVyIGluc3RhbmNlb2YgQWJzdHJhY3RSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIpIHsKKy8vCQkJQWJzdHJhY3RSZWxhdGl2ZVZhbHVlQ29sb3JQcm92aWRlckFkYXB0ZXIgYyA9IChBYnN0cmFjdFJlbGF0aXZlVmFsdWVDb2xvclByb3ZpZGVyQWRhcHRlcikgY29sb3JQcm92aWRlcjsKKy8vCQkJZHJhd0NvbG9yU2NhbGUoYyk7CisvLwkJfQorCQkKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewkJCisJCXJlbW92ZVBhaW50TGlzdGVuZXIodGhpcyk7CisJCXJlbW92ZU1vdXNlV2hlZWxMaXN0ZW5lcih0aGlzKTsKKwkJcmVtb3ZlTW91c2VUcmFja0xpc3RlbmVyKG1vdXNlVHJhY2tIYW5kbGVyKTsKKwkJcmVtb3ZlTW91c2VNb3ZlTGlzdGVuZXIodGhpcyk7CisJCXJlbW92ZUtleUxpc3RlbmVyKGtleUhhbmRsZXIpOwkJCisJCXJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzKTsKKwkJcmVtb3ZlTW91c2VMaXN0ZW5lcihtb3VzZUJ1dHRvbkhhbmRsZXIpOworCQlyZW1vdmVNb3VzZVRyYWNrTGlzdGVuZXIobW91c2VIb3ZlckhhbmRsZXIpOworCX0KKworfSAvLyBNYXBDYW52YXMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9tYXAvTWFwQ29udHJvbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9NYXBDb250cm9sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3MGM3YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9tYXAvTWFwQ29udHJvbC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8vIE1hcENvbnRyb2wuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5HZW9ncmFwaGljQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMuR2VvZ3JhcGhpY1JlbmRlcmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBTV1Qge0BsaW5rIENvbXBvc2l0ZX0gdGhhdCBkaXNwbGF5cyBMYXQvTG9uZyBkYXRhIGFkYXB0ZWQKKyAqIGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoZSBjYW5vbmljYWwgZ3JhcGggaW4gYQorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb30gYmVpbmcgc2ltdWxhdGVkLiBJdAorICogbGlzdGVucyBmb3IgY2hhbmdlcyBpbiB0aGUKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9ufSBhbmQgdGhlbiByZWRyYXdzIGl0cworICogdmlldyBhcyBhcHByb3ByaWF0ZS4KKyAqLworcHVibGljIGNsYXNzIE1hcENvbnRyb2wgZXh0ZW5kcyBHZW9ncmFwaGljQ29udHJvbCB7CisKKwkvKioKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICB0aGUgcGFyZW50IHtAbGluayBDb21wb3NpdGV9IG9mIHRoZSA8Y29kZT5NYXBDb250cm9sPC9jb2RlPgorCSAqLworCXB1YmxpYyBNYXBDb250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7CisJfSAvLyBNYXBDb250cm9sCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgR2VvZ3JhcGhpY1JlbmRlcmVyfSB0byB1c2UuCisJICovCisJcHJvdGVjdGVkIEdlb2dyYXBoaWNSZW5kZXJlciBjcmVhdGVHZW9ncmFwaGljUmVuZGVyZXIoKSB7CisJCXJldHVybiBuZXcgTWFwUmVuZGVyZXIodGhpcywgU1dULk5PTkUpOworCX0KK30gLy8gTWFwQ29udHJvbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9NYXBDb250cm9sRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9NYXBDb250cm9sRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZTdiMmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvbWFwL01hcENvbnRyb2xGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLy8gTWFwQ29udHJvbEZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLkdlb2dyYXBoaWNDb250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5HZW9ncmFwaGljQ29udHJvbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMKKyAqLworY2xhc3MgTWFwQ29udHJvbEZhY3RvcnkgaW1wbGVtZW50cyBHZW9ncmFwaGljQ29udHJvbEZhY3RvcnkgeworCisJc3RhdGljIE1hcENvbnRyb2xGYWN0b3J5IElOU1RBTkNFID0gbmV3IE1hcENvbnRyb2xGYWN0b3J5KCk7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5HZW9ncmFwaGljQ29udHJvbEZhY3RvcnkjY3JlYXRlKENvbXBvc2l0ZSkKKwkgKi8KKwlwdWJsaWMgR2VvZ3JhcGhpY0NvbnRyb2wgY3JlYXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBNYXBDb250cm9sKHBhcmVudCk7CisJfQorCit9IC8vIE1hcENvbnRyb2xGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvbWFwL01hcFJlbmRlcmVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvbWFwL01hcFJlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxZDQ5YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9tYXAvTWFwUmVuZGVyZXIuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLy8gTWFwUmVuZGVyZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5Db2xvclByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMuR2VvZ3JhcGhpY1JlbmRlcmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlbmRlcnMgZ2VvZ3JhcGhpYyBkYXRhIChsYXQvbG9uZykgaW50byBhICJmbGF0IG1hcCIgdmlzdWFsCisgKiByZXByZXNlbnRhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIE1hcFJlbmRlcmVyIGV4dGVuZHMgR2VvZ3JhcGhpY1JlbmRlcmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7CisKKwlwcml2YXRlIE1hcENhbnZhcyBtYXBDYW52YXM7CisJcHJpdmF0ZSBNZW51TWFuYWdlciBtZW51TWFuYWdlcjsKKworCS8qKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gc3R5bGUKKwkgKi8KKwlwdWJsaWMgTWFwUmVuZGVyZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7CisJCXN1cGVyKHBhcmVudCwgc3R5bGUpOworCQlzZXRTaXplKFNXVC5ERUZBVUxULCAxMDApOworCQkKKwkJZmluYWwgRmlsbExheW91dCBsYXlvdXQgPSBuZXcgRmlsbExheW91dCgpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gTUFSR0lOX0hFSUdIVDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gTUFSR0lOX1dJRFRIOworCQlzZXRMYXlvdXQobGF5b3V0KTsKKworCQkKKwkJbWFwQ2FudmFzID0gbmV3IE1hcENhbnZhcyh0aGlzLCBTV1QuTk9ORSk7CisJCW1hcENhbnZhcy5zZXRHYWluRmFjdG9yKGdhaW5GYWN0b3IpOworCQltYXBDYW52YXMuc2V0RHJhd1BvbHlnb25Cb3JkZXJzKGRyYXdQb2x5Z29uQm9yZGVycyk7CisvLwkJbWFwQ2FudmFzLnNldFBvbHlnb25TdHJva2UocG9seWdvblN0cm9rZSk7CisJCW1hcENhbnZhcy5zZXRDb2xvclByb3ZpZGVyKGNvbG9yUHJvdmlkZXJBZGFwdGVyKTsKKwkJCisJCXBhY2soKTsKKworCQltYXBDYW52YXMuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCW1lbnVNYW5hZ2VyID0gY3JlYXRlQ29udGV4dE1lbnVNYW5hZ2VyKCk7CisJCW1hcENhbnZhcy5zZXRNZW51KG1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KHRoaXMpKTsKKwl9IC8vIE1hcFJlbmRlcmVyCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5HZW9ncmFwaGljUmVuZGVyZXIjcmVuZGVyKG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuU3RlbVBvbHlnb25zTGlzdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZW5kZXIoU3RlbVBvbHlnb25zTGlzdCBwb2x5Z29uc1RvUmVuZGVyKSB7CisJCW1hcENhbnZhcy5zZXRHYWluRmFjdG9yKHRoaXMuZ2FpbkZhY3Rvcik7CisJCW1hcENhbnZhcy5zZXRVc2VMb2dTY2FsaW5nKHRoaXMudXNlTG9nU2NhbGluZyk7CisJCW1hcENhbnZhcy5yZW5kZXIocG9seWdvbnNUb1JlbmRlcik7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMuR2VvZ3JhcGhpY1JlbmRlcmVyI3Jlc2V0KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJc3VwZXIucmVzZXQoKTsKKwkJbWFwQ2FudmFzLnJlc2V0KCk7CisJCW1hcENhbnZhcy5zZXREcmF3UG9seWdvbkJvcmRlcnMoZHJhd1BvbHlnb25Cb3JkZXJzKTsKKwkJbWFwQ2FudmFzLnNldEdhaW5GYWN0b3IoZ2FpbkZhY3Rvcik7CisJCW1hcENhbnZhcy5zZXRVc2VMb2dTY2FsaW5nKHVzZUxvZ1NjYWxpbmcpOworCX0gLy8gcmVzZXQKKworCXByb3RlY3RlZCB2b2lkIHRvZ2dsZURyYXdQb2x5Z29uQm9yZGVyc0Nob2ljZSgpIHsKKwkJc3VwZXIudG9nZ2xlRHJhd1BvbHlnb25Cb3JkZXJzQ2hvaWNlKCk7CisJCW1hcENhbnZhcy5zZXREcmF3UG9seWdvbkJvcmRlcnMoZHJhd1BvbHlnb25Cb3JkZXJzKTsKKwkJcmVkcmF3KCk7CisJfSAvLyB0b2dnbGVEcmF3UG9seWdvbkJvcmRlcnNDaG9pY2UKKworCXByb3RlY3RlZCB2b2lkIHRvZ2dsZVVzZUxvZ1NjYWxpbmcoKSB7CisJCXN1cGVyLnRvZ2dsZVVzZUxvZ1NjYWxpbmcoKTsKKwkJbWFwQ2FudmFzLnNldFVzZUxvZ1NjYWxpbmcodXNlTG9nU2NhbGluZyk7CisJfSAvLyB0b2dnbGVVc2VMb2dTY2FsaW5nCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBNZW51TWFuYWdlcgorCSAqLworCXB1YmxpYyBNZW51TWFuYWdlciBnZXRNZW51TWFuYWdlcigpIHsKKwkJcmV0dXJuIG1lbnVNYW5hZ2VyOworCX0gLy8gZ2V0TWVudU1hbmFnZXIKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLkdlb2dyYXBoaWNSZW5kZXJlciNzZXRDb2xvclByb3ZpZGVyQWRhcHRlcihvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLkNvbG9yUHJvdmlkZXJBZGFwdGVyKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENvbG9yUHJvdmlkZXJBZGFwdGVyKENvbG9yUHJvdmlkZXJBZGFwdGVyIGNvbG9yUHJvdmlkZXIpIHsKKwkJc3VwZXIuc2V0Q29sb3JQcm92aWRlckFkYXB0ZXIoY29sb3JQcm92aWRlcik7CisJCW1hcENhbnZhcy5zZXRDb2xvclByb3ZpZGVyKGNvbG9yUHJvdmlkZXIpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCWZpcmVTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLkdlb2dyYXBoaWNSZW5kZXJlciNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewkJCisJCXN1cGVyLmRpc3Bvc2UoKTsKKwkJbWFwQ2FudmFzLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKwl9CisKK30gLy8gTWFwUmVuZGVyZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9tYXAvTWFwVmlldy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9NYXBWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjMTE2OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9tYXAvTWFwVmlldy5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvLyBNYXBWaWV3LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuSUNvbnRleHRNZW51VXBkYXRlc0xpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5HZW9ncmFwaGljVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgVmlld1BhcnR9IHRoYXQgcmVuZGVycyBMYXQvTG9uZyBkYXRhIGZvciBhY3RpdmUKKyAqIFNpbXVsYXRpb25zLgorICovCitwdWJsaWMgY2xhc3MgTWFwVmlldyBleHRlbmRzIFZpZXdQYXJ0IGltcGxlbWVudHMgSUNvbnRleHRNZW51VXBkYXRlc0xpc3RlbmVyIHsKKworCS8qKgorCSAqIFRoZSBJRCBvZiB0aGUgTWFwIFZpZXcuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfTUFQX1ZJRVcgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcCI7CisKKwkvKioKKwkgKiBUaGUgdmlld2VyIHRoYXQgZGlzcGxheXMgdGhlIGdlb2dyYXBoaWMgc3RhdGUgb2YgdGhlIHNpbXVsYXRpb25zLgorCSAqLworCXByaXZhdGUgR2VvZ3JhcGhpY1ZpZXdlciBnZW9ncmFwaGljVmlld2VyOworCisJLyoqCisJICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBNYXBWaWV3KCkgeworCQlzdXBlcigpOworCQkvLyBTZXQgdGhlIHZhbHVlcyBvZiB2YXJpb3VzIHZpc3VhbGl6YXRpb24gcHJlZmVyZW5jZXMKKwkJc2V0UHJlZmVyZW5jZXMoKTsKKworCQl0cnkgeworCQkJLy8gTGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSBwcmVmZXJlbmNlcyBhbmQgY2hhbmdlIHRoZSB2YWx1ZSB3ZQorCQkJLy8gdXNlIGlmIHRoZSB1c2VyIGNoYW5nZXMgdGhlIHZhbHVlIG9uIHRoZSBwcmVmZXJlbmNlIHBhZ2UuCisJCQlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkKKwkJCQkJLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworCQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQkJCQlmaW5hbCBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJCQkJc2V0UHJlZmVyZW5jZXMoKTsKKwkJCQkJCX0gLy8gcHJvcGVydHlDaGFuZ2UKKwkJCQkJfSAvLyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgorCQkJCQkpOworCQl9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworCQkJLy8gSWdub3JlCisJCX0gLy8gY2F0Y2ggRXhjZXB0aW9uCisKKwl9IC8vIE1hcFZpZXcKKworCS8qKgorCSAqIFNldCBwcmVmZXJlbmNlcworCSAqLworCXZvaWQgc2V0UHJlZmVyZW5jZXMoKSB7CisJCS8vIE5vdGhpbmcgeWV0CisJfSAvLyBzZXRQcmVmZXJlbmNlcworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJZ2VvZ3JhcGhpY1ZpZXdlciA9IG5ldyBHZW9ncmFwaGljVmlld2VyKHBhcmVudCwKKwkJCQlNYXBDb250cm9sRmFjdG9yeS5JTlNUQU5DRSk7CisJCS8vU2V0IHRoaXMgaW5zdGFuY2UgdG8gYmUgYSBsaXN0ZW5lciBmb3IgY29udGV4dCBtZW51IHVwZGF0ZXMKKwkJZ2VvZ3JhcGhpY1ZpZXdlci5hZGRDb250ZXh0TWVudVVwZGF0ZUxpc3RlbmVyKHRoaXMpOworCQlnZW9ncmFwaGljVmlld2VyLnNldElucHV0KFNpbXVsYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKSk7CisJCWdldFNpdGUoKS5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZW9ncmFwaGljVmlld2VyKTsKKwl9IC8vIGNyZWF0ZVBhcnRDb250cm9sCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlnZXRTaXRlKCkuc2V0U2VsZWN0aW9uUHJvdmlkZXIobnVsbCk7CisJCWdlb2dyYXBoaWNWaWV3ZXIucmVtb3ZlQ29udGV4dE1lbnVVcGRhdGVMaXN0ZW5lcih0aGlzKTsKKwkJZ2VvZ3JhcGhpY1ZpZXdlci5zZXRJbnB1dChudWxsKTsJCQorCX0gLy8gZGlzcG9zZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLklDb250ZXh0TWVudVVwZGF0ZXNMaXN0ZW5lciNvbkNvbnRleHRNZW51VXBkYXRlKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlciwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIpCisJICovCisJcHVibGljIHZvaWQgb25Db250ZXh0TWVudVVwZGF0ZShNZW51TWFuYWdlciBtZW51TWFuYWdlciwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyKSB7CisJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KCJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLmNvbnRleHQiLCBtZW51TWFuYWdlciwgc2VsZWN0aW9uUHJvdmlkZXIpOworCX0KKworfSAvLyBNYXBWaWV3CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvbWFwL01lc3NhZ2VzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvbWFwL01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3OWNlMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9tYXAvTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDQyIEBACisvLyBNZXNzYWdlcy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBnZXRzIE5MUyB2YWx1ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlcyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQorCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7CisKKwlwcml2YXRlIE1lc3NhZ2VzKCkgeworCQkvLyBOb3RoaW5nCisJfQorCisJLyoqCisJICogQHBhcmFtIGtleQorCSAqIEByZXR1cm4gdGhlIHN0cmluZyBtYXRjaGluZyB0aGUga2V5CisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7CisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOworCQl9CisJfQorfSAvLyBNZXNzYWdlcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9TZWxlY3RlZFJlcG9ydHNNYW5hZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvbWFwL1NlbGVjdGVkUmVwb3J0c01hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjc3MjhlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9TZWxlY3RlZFJlcG9ydHNNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwxNjYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8vJEFOQUxZU0lTLUlHTk9SRQorLyoqCisgKiBUaGUgcHVycG9zZSBvZiB0aGlzIDxpPlNpbmdsZXRvbjwvaT4gY2xhc3MgaXQgdG8ga2VlcCB0aGUgY3VycmVudCBzdGF0dXMgb2YKKyAqIGFsbCBlbmFibGVkL2Rpc2FibGVkIHJlcG9ydHMgZm9yIHRoZSBzcGVjaWZpYyBNYXBDb250cm9sLiBFYWNoIE1hcENvbnRyb2wgaGFzCisgKiBhIGNvbnRleHQgbWVudSB3aXRoIGEgbGlzdCBvZiByZXBvcnRzIHRoYXQgY2FuIGJlIGdlbmVyYXRlZCBvbmNlIHRoZSB1c2VyCisgKiBsZWZ0LWNsaWNrcyBvbiBhbiBhcmVhIGluIHRoZSBtYXAuIFRoZSB1c2VyIGNhbiBkaXNhYmxlL2VuYWJsZSBzb21lIG9yIGFsbCBvZgorICogdGhlIHJlcG9ydHMgdXNpbmcgdGhpcyBjb250ZXh0IG1lbnUuIFRoaXMgY2xhc3Mga2VlcHMgY3VycmVudCBzdGF0dXMgZm9yIGVhY2gKKyAqIG9uZSBvZiB0aGVzZSBtZW51cy4KKyAqLworcHVibGljIGNsYXNzIFNlbGVjdGVkUmVwb3J0c01hbmFnZXIgeworCS8qKgorCSAqIFRoZSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcworCSAqLworCXByaXZhdGUgc3RhdGljIFNlbGVjdGVkUmVwb3J0c01hbmFnZXIgaW5zdGFuY2U7CisJLyoqCisJICogTGlzdCBvZiByZXBvcnRzIElEcyB0aGF0IGhhcyBiZWVuIGVuYWJsZWQgZm9yIHRoZSBzcGVjaWZpYyBNYXBDYW52YXMKKwkgKi8KKwlwcml2YXRlIGZpbmFsIE1hcDxNYXBDYW52YXMsIExpc3Q8U3RyaW5nPj4gZW5hYmxlZFJlcG9ydHNNYXAgPSBuZXcgSGFzaE1hcDxNYXBDYW52YXMsIExpc3Q8U3RyaW5nPj4oKTsKKwkvKioKKwkgKiBMaXN0IG9mIHJlcG9ydHMgdGhhdCBoYXMgYmVlbiBjbGlja2VkIGJlZm9yZS4gSW5pdCBzdGF0ZSBpcyB0aGF0IGFsbAorCSAqIHJlcG9ydHMgYXJlIGVuYWJsZWQuCisJICovCisJcHJpdmF0ZSBmaW5hbCBNYXA8TWFwQ2FudmFzLCBMaXN0PFN0cmluZz4+IGFscmVhZHlTZWxlY3RlZFJlcG9ydHMgPSBuZXcgSGFzaE1hcDxNYXBDYW52YXMsIExpc3Q8U3RyaW5nPj4oKTsKKwkvKioKKwkgKiBUaGUgcmVjZW50IE1hcENhbnZhcyB0aGF0IHRoZSB1c2VyIGNsaWNrZWQgb24gd2l0aCB0aGUgbW91c2UgKGFueSBtb3VzZQorCSAqIGJ1dHRvbikKKwkgKi8KKwlwcml2YXRlIE1hcENhbnZhcyByZWNlbnRDbGlja2VkTWFwQ2FudmFzID0gbnVsbDsKKworCS8qKgorCSAqIFByaXZhdGUgY29uc3RydWN0b3IgYXMgaXQgaXMgU2luZ2xldG9uIGNsYXNzCisJICovCisJcHJpdmF0ZSBTZWxlY3RlZFJlcG9ydHNNYW5hZ2VyKCkgeworCQkvLyBEbyBub3RoaW5nCisJfQorCisJLyoqCisJICogVGhlIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc2luZ2xlIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKKwkgKiAKKwkgKiBAcmV0dXJuIFRoZSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcworCSAqLworCXB1YmxpYyBzdGF0aWMgU2VsZWN0ZWRSZXBvcnRzTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKKwkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKKwkJCWluc3RhbmNlID0gbmV3IFNlbGVjdGVkUmVwb3J0c01hbmFnZXIoKTsKKwkJfQorCQlyZXR1cm4gaW5zdGFuY2U7CisJfQorCisJLyoqCisJICogVGhlIG1ldGhvZCB3aWxsIG1hcmsgdGhlIHNwZWNpZmljIHJlcG9ydCBhcyBlbmFibGVkLgorCSAqIAorCSAqIEBwYXJhbSByZXBvcnRJRAorCSAqICAgICAgICAgICAgVGhlIHJlcG9ydCBJRCB0byBiZSBlbmFibGVkCisJICovCisJcHVibGljIHZvaWQgZW5hYmxlUmVwb3J0Rm9ySWRlbnRpZmlhYmxlKGZpbmFsIFN0cmluZyByZXBvcnRJRCkgeworCQlMaXN0PFN0cmluZz4gZW5hYmxlZFJlcG9ydHMgPSBudWxsOworCQlpZiAoZW5hYmxlZFJlcG9ydHNNYXAuY29udGFpbnNLZXkocmVjZW50Q2xpY2tlZE1hcENhbnZhcykpIHsKKwkJCWVuYWJsZWRSZXBvcnRzID0gZW5hYmxlZFJlcG9ydHNNYXAuZ2V0KHJlY2VudENsaWNrZWRNYXBDYW52YXMpOworCQkJZW5hYmxlZFJlcG9ydHNNYXAucmVtb3ZlKHJlY2VudENsaWNrZWRNYXBDYW52YXMpOworCQl9CisJCWlmIChudWxsID09IGVuYWJsZWRSZXBvcnRzKSB7CisJCQllbmFibGVkUmVwb3J0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl9CisJCWVuYWJsZWRSZXBvcnRzLmFkZChyZXBvcnRJRCk7CisJCWVuYWJsZWRSZXBvcnRzTWFwLnB1dChyZWNlbnRDbGlja2VkTWFwQ2FudmFzLCBlbmFibGVkUmVwb3J0cyk7CisJfQorCisJLyoqCisJICogVGhlIG1ldGhvZCB3aWxsIG1hcmsgdGhlIHNwZWNpZmljIHJlcG9ydCBhcyBkaXNhYmxlZC4KKwkgKiAKKwkgKiBAcGFyYW0gcmVwb3J0SUQKKwkgKiAgICAgICAgICAgIFRoZSByZXBvcnQgSUQgdG8gYmUgZGlzYWJsZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNhYmxlUmVwb3J0Rm9ySWRlbnRpZmlhYmxlKGZpbmFsIFN0cmluZyByZXBvcnRJRCkgeworCQlMaXN0PFN0cmluZz4gZW5hYmxlZFJlcG9ydHMgPSBudWxsOworCQlpZiAoZW5hYmxlZFJlcG9ydHNNYXAuY29udGFpbnNLZXkocmVjZW50Q2xpY2tlZE1hcENhbnZhcykpIHsKKwkJCWVuYWJsZWRSZXBvcnRzID0gZW5hYmxlZFJlcG9ydHNNYXAuZ2V0KHJlY2VudENsaWNrZWRNYXBDYW52YXMpOworCQkJZW5hYmxlZFJlcG9ydHNNYXAucmVtb3ZlKHJlY2VudENsaWNrZWRNYXBDYW52YXMpOworCQl9CisJCWlmIChudWxsICE9IGVuYWJsZWRSZXBvcnRzKSB7CisJCQllbmFibGVkUmVwb3J0cy5yZW1vdmUocmVwb3J0SUQpOworCQl9CisJCUxpc3Q8U3RyaW5nPiBpbml0aWFsaXplZFJlcG9ydHMgPSBhbHJlYWR5U2VsZWN0ZWRSZXBvcnRzCisJCQkJLmdldChyZWNlbnRDbGlja2VkTWFwQ2FudmFzKTsKKwkJaWYgKGluaXRpYWxpemVkUmVwb3J0cyA9PSBudWxsKSB7CisJCQlpbml0aWFsaXplZFJlcG9ydHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJfQorCQlpbml0aWFsaXplZFJlcG9ydHMuYWRkKHJlcG9ydElEKTsKKwkJaWYgKGFscmVhZHlTZWxlY3RlZFJlcG9ydHMuY29udGFpbnNLZXkocmVjZW50Q2xpY2tlZE1hcENhbnZhcykpIHsKKwkJCWFscmVhZHlTZWxlY3RlZFJlcG9ydHMucmVtb3ZlKHJlY2VudENsaWNrZWRNYXBDYW52YXMpOworCQl9CisJCWFscmVhZHlTZWxlY3RlZFJlcG9ydHMucHV0KHJlY2VudENsaWNrZWRNYXBDYW52YXMsIGluaXRpYWxpemVkUmVwb3J0cyk7CisJfQorCisJLyoqCisJICogVGhlIG1ldGhvZCB3aWxsIGNoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmljIHJlcG9ydCBpcyBlbmFibGVkIG9yIGRpc2FibGVkCisJICogZm9yIHRoZSBjdXJyZW50IE1hcENhbnZhcy4KKwkgKiAKKwkgKiBAcGFyYW0gcmVwb3J0SUQKKwkgKiAgICAgICAgICAgIFJlcG9ydCBJRCB0byBiZSBjaGVja2VkCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVwb3J0IGlzIGVuYWJsZWQgYW5kCisJICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90CisJICovCisJcHVibGljIGJvb2xlYW4gaXNSZXBvcnRFbmFibGVkKGZpbmFsIFN0cmluZyByZXBvcnRJRCkgeworCQlmaW5hbCBMaXN0PFN0cmluZz4gaW5pdGlhbGl6ZWRSZXBvcnRzID0gYWxyZWFkeVNlbGVjdGVkUmVwb3J0cworCQkJCS5nZXQocmVjZW50Q2xpY2tlZE1hcENhbnZhcyk7CisJCWlmIChpbml0aWFsaXplZFJlcG9ydHMgPT0gbnVsbAorCQkJCXx8ICFpbml0aWFsaXplZFJlcG9ydHMuY29udGFpbnMocmVwb3J0SUQpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCWlmICghZW5hYmxlZFJlcG9ydHNNYXAuY29udGFpbnNLZXkocmVjZW50Q2xpY2tlZE1hcENhbnZhcykpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlmaW5hbCBMaXN0PFN0cmluZz4gZW5hYmxlZFJlcG9ydHMgPSBlbmFibGVkUmVwb3J0c01hcAorCQkJCS5nZXQocmVjZW50Q2xpY2tlZE1hcENhbnZhcyk7CisJCWlmIChlbmFibGVkUmVwb3J0cyA9PSBudWxsIHx8ICFlbmFibGVkUmVwb3J0cy5jb250YWlucyhyZXBvcnRJRCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIE1hcENhbnZhcyB0aGF0IHRoZSB1c2VyIGNsaWNrZWQgb24KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBNYXBDYW52YXMgdGhhdCB0aGUgdXNlciBjbGlja2VkIG9uCisJICovCisJcHVibGljIE1hcENhbnZhcyBnZXRSZWNlbnRDbGlja2VkTWFwQ2FudmFzKCkgeworCQlyZXR1cm4gcmVjZW50Q2xpY2tlZE1hcENhbnZhczsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIE1hcENhbnZhcyB0aGF0IHRoZSB1c2VyIGNsaWNrZWQgb24KKwkgKiAKKwkgKiBAcGFyYW0gcmVjZW50Q2xpY2tlZE1hcENhbnZhcworCSAqICAgICAgICAgICAgdGhlIE1hcENhbnZhcyB0aGF0IHRoZSB1c2VyIGNsaWNrZWQgb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZWNlbnRDbGlja2VkTWFwQ2FudmFzKGZpbmFsIE1hcENhbnZhcyByZWNlbnRDbGlja2VkTWFwQ2FudmFzKSB7CisJCXRoaXMucmVjZW50Q2xpY2tlZE1hcENhbnZhcyA9IHJlY2VudENsaWNrZWRNYXBDYW52YXM7CisJfQorCisJLyoqCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9tYXAvU3RlbVBvbHlnb24uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9tYXAvU3RlbVBvbHlnb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDM0Y2IwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9TdGVtUG9seWdvbi5qYXZhCkBAIC0wLDAgKzEsMjY5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiBDb250cmlidXRvcnM6IAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5zcGF0aWFsLmdlby5MYXRMb25nLlNlZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7CisKKy8qKgorICogQSBzdWItY2xhc3Mgb2YgamF2YS5hd3QuUG9seWdvbiB0aGF0IGhhcyBhbiBleHRyYSBmaWVsZCBzYXZpbmcgdGhlIHJlbGF0aXZlCisgKiB2YWx1ZSBvZiB0aGUgcG9seWdvbi4gVGhlIHJlbGF0aXZlIHZhbHVlcyBjb3VsZCBiZSB1c2VkIGZvciBpbnRlbnNpdHkgdmFsdWVzCisgKiBvZiB0aGUgbGFiZWxzLgorICovCitwdWJsaWMgY2xhc3MgU3RlbVBvbHlnb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBVElUVURFX0RJUkVDVElPTiA9IC0xOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisJCisJLyoqCisJICogVGhpcyB2YWx1ZSBpcyBzZWxlY3RlZCB0byBjb252ZXJ0IGxhdC9sb25nIHZhbHVlcyB0byBpbnRlZ2VycyB3aXRoIHNpeAorCSAqIGRpZ2l0cyBvZiBwcmVjaXNpb24gZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIGRvdWJsZSB2YWx1ZXMuCisJICovCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IHNjYWxpbmdGYWN0b3JGb3JEYXRhID0gMTAwMDAwMDsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHtAbGluayBJZGVudGlmaWFibGV9IGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9seWdvbi4KKwkgKi8KKwlwcml2YXRlIHRyYW5zaWVudCBJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlOworCQorCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCBwb2ludHMgKGJldHRlciB1c2VkIGJ5IFNXVCBkcmF3aW5nKQorCSAqLworCXB1YmxpYyBpbnRbXSBwb2ludHMgPSBudWxsOworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCBwb2ludHMsIHRyYW5zZm9ybWVkIHRvIHNjYWxlIGFuZCBvZmZzZXRzCisJICovCisJcHVibGljIGludFtdIHRyYW5zZm9ybWVkUG9pbnRzID0gbnVsbDsKKwlwcml2YXRlIGludCBtaW5YID0gSW50ZWdlci5NQVhfVkFMVUUsIG1pblkgPSBJbnRlZ2VyLk1BWF9WQUxVRSwgbWF4WCA9IEludGVnZXIuTUlOX1ZBTFVFLCBtYXhZID0gSW50ZWdlci5NSU5fVkFMVUU7CisKKwkvKioKKwkgKiBFbXB0eSBjb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKi8KKwlwdWJsaWMgU3RlbVBvbHlnb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogR2V0cyBhIGxpc3Qgb2YgYSBsYXRMb25nRGF0YSBhcnJheXMsIGFuZCB0cmFuc2Zvcm1zIGl0IGludG8gYSBQb2x5Z29uLgorCSAqIAorCSAqIEBwYXJhbSBsYXRMb25nU2VnbWVudAorCSAqIEBwYXJhbSBpZGVudGlmaWFibGUKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfSBhc3NvY2lhdGVkIHdpdGggdGhlIHBvbHlnb24uCisJICovCisJcHVibGljIFN0ZW1Qb2x5Z29uKGZpbmFsIFNlZ21lbnQgbGF0TG9uZ1NlZ21lbnQsIGZpbmFsIElkZW50aWZpYWJsZSBpZGVudGlmaWFibGUpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5pZGVudGlmaWFibGUgPSBpZGVudGlmaWFibGU7CisKKwkJZmluYWwgaW50IHNpemUgPSBsYXRMb25nU2VnbWVudC5zaXplKCk7CisJCXBvaW50cyA9IG5ldyBpbnRbMipzaXplXTsKKworCQlmb3IgKGludCBpID0gMCwgcG9pbnRzSW5kZXggPSAwOyBpIDwgc2l6ZTsgaSsrLCBwb2ludHNJbmRleCs9MikgeworCQkJYWRkUG9pbnQobGF0TG9uZ1NlZ21lbnQubG9uZ2l0dWRlKGkpLCBsYXRMb25nU2VnbWVudC5sYXRpdHVkZShpKSwgcG9pbnRzSW5kZXgpOworCQl9CisJCS8vIH0KKwl9IC8vIFN0ZW1Qb2x5Z29uCisKKy8vCS8qKgorLy8JICogQWRkIGxhdExvbmcgY29vcmRpbmF0ZXMgdG8gYSBwb2x5Z29uLgorLy8JICogCisvLwkgKiBAcGFyYW0gbGF0TG9uZ0RhdGEKKy8vCSAqLworLy8JcHVibGljIHZvaWQgYWRkTGF0TG9uZ0RhdGEoZmluYWwgTGF0TG9uZyBsYXRMb25nRGF0YSkgeworLy8JCWZpbmFsIExpc3Q8U2VnbWVudD4gbGF0TG9uZ1NlZ21lbnRzTGlzdCA9IGxhdExvbmdEYXRhLmdldFNlZ21lbnRzKCk7CisvLworLy8JCWZvciAoZmluYWwgU2VnbWVudCBsYXRMb25nU2VnbWVudCA6IGxhdExvbmdTZWdtZW50c0xpc3QpIHsKKy8vCQkJaWYgKGxhdExvbmdTZWdtZW50LmlzUG9seWdvbigpKSB7CisvLwkJCQlmaW5hbCBpbnQgc2l6ZSA9IGxhdExvbmdTZWdtZW50LnNpemUoKTsKKy8vCQkJCWZvciAoaW50IGkgPSAwLCBwb2ludHNJbmRleCA9IDA7IGkgPCBzaXplOyBpKyssIHBvaW50c0luZGV4Kz0yKSB7CisvLwkJCQkJYWRkUG9pbnQobGF0TG9uZ1NlZ21lbnQubG9uZ2l0dWRlKGkpLCBsYXRMb25nU2VnbWVudAorLy8JCQkJCQkJLmxhdGl0dWRlKGkpLCBwb2ludHNJbmRleCk7CisvLwkJCQl9CisvLwkJCX0KKy8vCQl9IC8vIGZvcgorLy8JfSAvLyBhZGRMYXRMb25nRGF0YQorCisJLyoqCisJICogCisJICogQHBhcmFtIGxvbmdpdHVkZQorCSAqICAgICAgICAgICAgbG9uZ2l0dWRlIHZhbHVlCisJICogQHBhcmFtIGxhdGl0dWRlCisJICogICAgICAgICAgICBsYXRpdHVkZSB2YWx1ZQorCSAqIEBwYXJhbSBwb2ludHNJbmRleCAKKwkgKi8KKwlwcml2YXRlIHZvaWQgYWRkUG9pbnQoZmluYWwgZG91YmxlIGxvbmdpdHVkZSwgZmluYWwgZG91YmxlIGxhdGl0dWRlLCBmaW5hbCBpbnQgcG9pbnRzSW5kZXgpIHsKKwkJaW50IHggPSAoaW50KShsb25naXR1ZGUgKiBzY2FsaW5nRmFjdG9yRm9yRGF0YSk7IAorCQlpbnQgeSA9IChpbnQpKGxhdGl0dWRlICogc2NhbGluZ0ZhY3RvckZvckRhdGEgKiBMQVRJVFVERV9ESVJFQ1RJT04pOworCQlwb2ludHNbcG9pbnRzSW5kZXhdID0geDsKKwkJcG9pbnRzW3BvaW50c0luZGV4KzFdID0geTsKKwkJCisJCW1heFggPSBNYXRoLm1heCh4LCBtYXhYKTsKKwkJbWF4WSA9IE1hdGgubWF4KHksIG1heFkpOworCQltaW5YID0gTWF0aC5taW4oeCwgbWluWCk7CisJCW1pblkgPSBNYXRoLm1pbih5LCBtaW5ZKTsgCisJfSAvLyBhZGRQb2ludAorCQorCS8qKgorCSAqIEBwYXJhbSBwb2ludHNUcmFuc2Zvcm1lciB0aGUgcG9pbnRzVHJhbnNmb3JtZXIgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0UG9pbnRzVHJhbnNmb3JtZXIoU3RlbVBvbHlnb25UcmFuc2Zvcm0gcG9pbnRzVHJhbnNmb3JtZXIpIHsKKwkJdHJhbnNmb3JtZWRQb2ludHMgPSBuZXcgaW50W2dldE51bWJlck9mUG9pbnRzKCkqMl07CQkKKwkJZm9yIChpbnQgaT0wOyBpPGdldE51bWJlck9mUG9pbnRzKCk7IGkrKykgeworCQkJaW50IHhCZWZvcmUgPSBwb2ludHNbMippXTsKKwkJCWludCB5QmVmb3JlID0gcG9pbnRzWzIqaSsxXTsKKwkJCWludCB4QWZ0ZXIgPSAoaW50KSAoKHhCZWZvcmUgKiBwb2ludHNUcmFuc2Zvcm1lci5nZXRTY2FsZSgpKSArIHBvaW50c1RyYW5zZm9ybWVyLmdldE9mZnNldFgoKSk7CisJCQlpbnQgeUFmdGVyID0gKGludCkoKHlCZWZvcmUgKiBwb2ludHNUcmFuc2Zvcm1lci5nZXRTY2FsZSgpKSArIHBvaW50c1RyYW5zZm9ybWVyLmdldE9mZnNldFkoKSk7CisJCQl0cmFuc2Zvcm1lZFBvaW50c1syKmldID0geEFmdGVyOworCQkJdHJhbnNmb3JtZWRQb2ludHNbMippKzFdID0geUFmdGVyOworCQl9CisJfQorCisJLyoqCisJICogbWV0aG9kIHRvIHVuc2NhbGUgdGhlIHZhbHVlIHRoYXQgaGFkIGJlZW4gc2NhbGVkIGJ5IHRoZSBhYm92ZSBhZGRQb2ludAorCSAqIG1ldGhvZC4KKwkgKiAKKwkgKiBAcGFyYW0gbG9uZ2l0dWRlCisJICogQHJldHVybiB1bnNjYWxlZCB2YWx1ZQorCSAqLworCXB1YmxpYyBkb3VibGUgdW5TY2FsZUxvbmdpdHVkZShmaW5hbCBkb3VibGUgbG9uZ2l0dWRlKSB7CisJCXJldHVybiBsb25naXR1ZGUgLyBzY2FsaW5nRmFjdG9yRm9yRGF0YTsKKwl9CisKKwkvKioKKwkgKiBtZXRob2QgdG8gdW5zY2FsZSB0aGUgdmFsdWUgdGhhdCBoYWQgYmVlbiBzY2FsZWQgYnkgdGhlIGFib3ZlIGFkZFBvaW50CisJICogbWV0aG9kLgorCSAqIAorCSAqIEBwYXJhbSBsYXRpdHVkZQorCSAqIEByZXR1cm4gdW5zY2FsZWQgdmFsdWUKKwkgKi8KKwlwdWJsaWMgZG91YmxlIHVuU2NhbGVMYXRpdHVkZShmaW5hbCBkb3VibGUgbGF0aXR1ZGUpIHsKKwkJcmV0dXJuIGxhdGl0dWRlIC8gc2NhbGluZ0ZhY3RvckZvckRhdGEgKiBMQVRJVFVERV9ESVJFQ1RJT047CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdGl0bGUgb2YgdGhlIHBvbHlnb24uCisJICogCisJICogQHJldHVybiBTdHJpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgeworCQlyZXR1cm4gaWRlbnRpZmlhYmxlLmdldER1YmxpbkNvcmUoKS5nZXRUaXRsZSgpOworCX0gLy8gZ2V0VGl0bGUKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIDxjb2RlPklkZW50aWZpYWJsZTwvY29kZT4KKwkgKi8KKwlwdWJsaWMgZmluYWwgSWRlbnRpZmlhYmxlIGdldElkZW50aWZpYWJsZSgpIHsKKwkJcmV0dXJuIGlkZW50aWZpYWJsZTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaWRlbnRpZmlhYmxlCisJICogICAgICAgICAgICB0aGUgPGNvZGU+SWRlbnRpZmlhYmxlPC9jb2RlPiB0byBzZXQKKwkgKi8KKwlwdWJsaWMgZmluYWwgdm9pZCBzZXRJZGVudGlmaWFibGUoZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50aWZpYWJsZSkgeworCQl0aGlzLmlkZW50aWZpYWJsZSA9IGlkZW50aWZpYWJsZTsKKwl9CisJCisJLyoqCisJICogVGhlIG1ldGhvZCByZXR1cm5zIHRoZSBzbWFsbGVzdCB7QGxpbmsgUmVjdGFuZ2xlfSB0aGF0IGJvdW5kcyBvZiB0aGUgcG9seWdvbi4KKwkgKiBAcmV0dXJuIHtAbGluayBSZWN0YW5nbGV9IG9mIHRoZSBib3VuZHMgb2YgdGhlIHBvbHlnb24KKwkgKi8KKwlwdWJsaWMgUmVjdGFuZ2xlIGdldEJvdW5kcygpIHsKKwkJaWYgKG1pblggPT0gSW50ZWdlci5NQVhfVkFMVUUgJiYgbWF4WSA9PSBJbnRlZ2VyLk1JTl9WQUxVRSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJUmVjdGFuZ2xlIGJvdW5kcyA9IG5ldyBSZWN0YW5nbGUobWluWCwgbWluWSwgKG1heFggLSBtaW5YKSwgKG1heFkgLSBtaW5ZKSk7CisJCXJldHVybiBib3VuZHM7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgcG9pbnQgKHgseSkgaXMgY29udGFpbmVkIGluc2lkZSB0aGlzIHBvbHlnb24uIAorCSAqIEBwYXJhbSBwb2ludCB0aGUgWCBhbmQgWSBjb29yZGluYXRlcworCSAqIEByZXR1cm4gd2hldGhlciB0aGUgcG9pbnQgKHgseSkgaXMgY29udGFpbmVkIGluIHRoaXMgcG9seWdvbgorCSAqLworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUG9pbnQoUG9pbnQgcG9pbnQpIHsKKwkJcmV0dXJuIGNvbnRhaW5zUG9pbnQocG9pbnQueCwgcG9pbnQueSk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgcG9pbnQgKHgseSkgaXMgY29udGFpbmVkIGluc2lkZSB0aGlzIHBvbHlnb24uIAorCSAqIEBwYXJhbSB4IFRoZSBYIHZhbHVlIG9mIHRoZSBwb2ludAorCSAqIEBwYXJhbSB5IFRoZSBZIHZhbHVlIG9mIHRoZSBwb2ludAorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgcG9pbnQgKHgseSkgaXMgY29udGFpbmVkIGluIHRoaXMgcG9seWdvbgorCSAqLworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUG9pbnQoaW50IHgsIGludCB5KSB7CisJCWludCBpLCBqOworCQlib29sZWFuIGlzSW5zaWRlID0gZmFsc2U7CisJCWludCBudW1PZlBvaW50cyA9IHBvaW50cy5sZW5ndGggLyAyOworICAgICAgICAKKwkJZm9yIChpID0gMCwgaiA9IChudW1PZlBvaW50cy0xKSoyOyBpIDwgcG9pbnRzLmxlbmd0aC0xOyApIHsKKwkJCWlmICgoKChwb2ludHNbaSsxXTw9eSkgJiYgKHk8cG9pbnRzW2orMV0pKSB8fAorCQkJCSgocG9pbnRzW2orMV08PXkpICYmICh5PHBvaW50c1tpKzFdKSkpICYmCisJCQkJKHggPCAocG9pbnRzW2pdIC0gIHBvaW50c1tpXSkgKiAoeSAtIHBvaW50c1tpKzFdKSAvIChwb2ludHNbaisxXSAtIHBvaW50c1tpKzFdKSArIHBvaW50c1tpXSkpIHsKKwkJCQlpc0luc2lkZSA9ICFpc0luc2lkZTsKKwkJCX0KKwkJCWogPSBpOworCQkJaSArPSAyOwkJCQorCQl9CisJCXJldHVybiBpc0luc2lkZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGF0L2xvbmcgcG9pbnRzIHRoYXQgdGhpcyBwb2x5Z29uIGhhcworCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBsYXQvbG9uZyBwb2ludHMKKwkgKi8KKwlwdWJsaWMgaW50IGdldE51bWJlck9mUG9pbnRzKCkgeworCQlpZiAocG9pbnRzID09IG51bGwpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIHBvaW50cy5sZW5ndGggLyAyOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5vbi1zY2FsZWQgdmFsdWUgb2YgdGhlIGxhdGl0dWRlIG9mIHRoZSBzcGVjaWZpYyBwb2ludAorCSAqIEBwYXJhbSBpIFBvaW50IGluZGV4CisJICogQHJldHVybiB0aGUgbm9uLXNjYWxlZCB2YWx1ZSBvZiB0aGUgbGF0aXR1ZGUgb2YgdGhlIHNwZWNpZmljIHBvaW50CisJICovCisJcHVibGljIGRvdWJsZSBnZXROb25TY2FsZWRMYXRpdHVkZShmaW5hbCBpbnQgaSkgeworCQlyZXR1cm4gKGRvdWJsZSlwb2ludHNbMippKzFdIC8gKGRvdWJsZSlzY2FsaW5nRmFjdG9yRm9yRGF0YTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBub24tc2NhbGVkIHZhbHVlIG9mIHRoZSBsb25naXR1ZGUgb2YgdGhlIHNwZWNpZmljIHBvaW50CisJICogQHBhcmFtIGkgUG9pbnQgaW5kZXgKKwkgKiBAcmV0dXJuIHRoZSBub24tc2NhbGVkIHZhbHVlIG9mIHRoZSBsb25naXR1ZGUgb2YgdGhlIHNwZWNpZmljIHBvaW50CisJICovCisJcHVibGljIGRvdWJsZSBnZXROb25TY2FsZWRMb25naXR1ZGUoZmluYWwgaW50IGkpIHsKKwkJcmV0dXJuIChkb3VibGUpcG9pbnRzWzIqaV0gLyBzY2FsaW5nRmFjdG9yRm9yRGF0YSAqIExBVElUVURFX0RJUkVDVElPTjsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdW5zY2FsZWQgdmFsdWUgb2YgdGhlIHByb3ZpZGVkIGxhdGl0dWRlCisJICogQHBhcmFtIGxhdFZhbHVlIHRoZSBzY2FsZWQgbGF0aXR1ZGUgdmFsdWUKKwkgKiBAcmV0dXJuIHRoZSB1bnNjYWxlZCB2YWx1ZSBvZiB0aGUgcHJvdmlkZWQgbGF0aXR1ZGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRVbnNjYWxlZExhdGl0dWRlKGZpbmFsIGludCBsYXRWYWx1ZSkgeworCQlyZXR1cm4gKGRvdWJsZSlsYXRWYWx1ZSAvIChkb3VibGUpc2NhbGluZ0ZhY3RvckZvckRhdGE7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHVuc2NhbGVkIHZhbHVlIG9mIHRoZSBwcm92aWRlZCBsb25naXR1ZGUKKwkgKiBAcGFyYW0gbG9uZ1ZhbHVlIHRoZSBzY2FsZWQgbGF0aXR1ZGUgdmFsdWUKKwkgKiBAcmV0dXJuIHRoZSB1bnNjYWxlZCB2YWx1ZSBvZiB0aGUgcHJvdmlkZWQgbG9uZ2l0dWRlCisJICovCisJcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0VW5zY2FsZWRMb25naXR1ZGUoZmluYWwgaW50IGxvbmdWYWx1ZSkgeworCQlyZXR1cm4gKGRvdWJsZSlsb25nVmFsdWUgLyBzY2FsaW5nRmFjdG9yRm9yRGF0YSAqIExBVElUVURFX0RJUkVDVElPTjsKKwl9CisKK30gLy8gU3RlbVBvbHlnb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9tYXAvU3RlbVBvbHlnb25UcmFuc2Zvcm0uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9tYXAvU3RlbVBvbHlnb25UcmFuc2Zvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDVhOTA4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9TdGVtUG9seWdvblRyYW5zZm9ybS5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5hd3QuUG9pbnQ7CitpbXBvcnQgamF2YS5hd3QuZ2VvbS5BZmZpbmVUcmFuc2Zvcm07CitpbXBvcnQgamF2YS5hd3QuZ2VvbS5Ob25pbnZlcnRpYmxlVHJhbnNmb3JtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuYXd0Lmdlb20uUG9pbnQyRDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuQWN0aXZhdG9yOworCisvKioKKyAqIFRyYW5zZm9ybSBjbGFzcyB0byB0cmFuc2Zvcm0gcG9pbnRzIGZyb20gb25lIGNvb3JkaW5hdGVzIHNwYWNlIHRvIGFub3RoZXIuCisgKiBPZmZzZXQgYW5kIHNjYWxlIHZhbHVlcyBhcmUgdGhlIHZhbHVlcyB0aGF0IHdpbGwgYWZmZWN0IHRoZSB0cmFuc2Zvcm1hdGlvbi4KKyAqIEBhdXRob3IgWW9zc2kgTWVzaWthIChJQk0pCisgKi8KK3B1YmxpYyBjbGFzcyBTdGVtUG9seWdvblRyYW5zZm9ybSB7CisJCisJcHJpdmF0ZSBkb3VibGUgb2Zmc2V0WCA9IDAuMGQ7CisJcHJpdmF0ZSBkb3VibGUgb2Zmc2V0WSA9IDAuMGQ7CisJcHJpdmF0ZSBkb3VibGUgc2NhbGUgPSAxLjBkOworCQorCXByaXZhdGUgUG9pbnQyRCBnZXRJbnZlcnNlZFBvaW50KFBvaW50IHRvSW52ZXJzZSkgeworCQlBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IEFmZmluZVRyYW5zZm9ybSgpOworCQl0cmFuc2Zvcm0uc2V0VG9UcmFuc2xhdGlvbihvZmZzZXRYLCBvZmZzZXRZKTsKKwkJdHJhbnNmb3JtLnNjYWxlKHNjYWxlLCBzY2FsZSk7CisJCVBvaW50MkQgdG9SZXR1cm4gPSBuZXcgUG9pbnQyRC5Eb3VibGUoMCwgMCk7CisJCXRyeSB7CisJCQl0b1JldHVybiA9IHRyYW5zZm9ybS5pbnZlcnNlVHJhbnNmb3JtKHRvSW52ZXJzZSwgdG9SZXR1cm4pOworCQl9IGNhdGNoIChOb25pbnZlcnRpYmxlVHJhbnNmb3JtRXhjZXB0aW9uIGUpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiUHJvYmxlbSBpbnZlcnRpbmcgcG9pbnQgIiArIHRvSW52ZXJzZSwgZSk7CisJCQlyZXR1cm4gbmV3IFBvaW50KCk7CisJCX0KKwkJcmV0dXJuIHRvUmV0dXJuOworCX0KKwkKKwkvKioKKwkgKiBUaGUgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBpbnZlcnRlZCBwb2ludCBvZiB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzLgorCSAqIEkuZS4gaXQgd2lsbCBkbyByZXZlcnNlZCB0cmFuc2Zvcm1hdGlvbi4KKwkgKiBAcGFyYW0geCBYIHZhbHVlIG9mIHRoZSBwb2ludCB0byBiZSBpbnZlcnRlZAorCSAqIEBwYXJhbSB5IFkgdmFsdWUgb2YgdGhlIHBvaW50IHRvIGJlIGludmVydGVkCisJICogQHJldHVybiB0aGUgaW52ZXJ0ZWQgcG9pbnQgYXMgYW4gU1dUIHtAbGluayBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnR9CisJICovCisJcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludCBnZXRJbnZlcnNlZFBvaW50KGZpbmFsIGludCB4LCBmaW5hbCBpbnQgeSkgeworCQlQb2ludDJEIHRyYW5zZm9ybWVkID0gZ2V0SW52ZXJzZWRQb2ludChuZXcgUG9pbnQoeCwgeSkpOworCQlyZXR1cm4gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludCgoaW50KXRyYW5zZm9ybWVkLmdldFgoKSwgKGludCl0cmFuc2Zvcm1lZC5nZXRZKCkpOwkJCisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgb2Zmc2V0WAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0T2Zmc2V0WCgpIHsKKwkJcmV0dXJuIG9mZnNldFg7CisJfQorCisJLyoqCisJICogQHBhcmFtIG9mZnNldFggdGhlIG9mZnNldFggdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0T2Zmc2V0WChkb3VibGUgb2Zmc2V0WCkgeworCQl0aGlzLm9mZnNldFggPSBvZmZzZXRYOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG9mZnNldFkKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE9mZnNldFkoKSB7CisJCXJldHVybiBvZmZzZXRZOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBvZmZzZXRZIHRoZSBvZmZzZXRZIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldE9mZnNldFkoZG91YmxlIG9mZnNldFkpIHsKKwkJdGhpcy5vZmZzZXRZID0gb2Zmc2V0WTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzY2FsZQorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0U2NhbGUoKSB7CisJCXJldHVybiBzY2FsZTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2NhbGUgdGhlIHNjYWxlIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNjYWxlKGRvdWJsZSBzY2FsZSkgeworCQl0aGlzLnNjYWxlID0gc2NhbGU7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9TdGVtUG9seWdvbnNMaXN0LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvbWFwL1N0ZW1Qb2x5Z29uc0xpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWI4YjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9TdGVtUG9seWdvbnNMaXN0LmphdmEKQEAgLTAsMCArMSwxMTQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5FZGdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMuc3BhdGlhbC5nZW8uTGF0TG9uZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnNwYXRpYWwuZ2VvLkxhdExvbmcuU2VnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLm5vZGVzLlJlZ2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKKworLyoqCisgKiBBIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgTGlua2VkTGlzdDxzdGVtUG9seWdvbj4gY2xhc3MuIEl0IGhhcyBzb21lIGZpZWxkcworICogdGhhdCBoZWxwIGluIG1hbmFnaW5nIHRoZSBwb2x5Z29ucyBsaXN0IG9mIGEgbWFwLCBzdWNoIGFzIHRoZSBvZmZzZXQgbmVlZGVkCisgKiB0byBiZSBtYWRlIGluIG9yZGVyIHRvIGNlbnRyYWxpemUgdGhlIG1hcCwgdGhlIG9wdGltdW0gdmFsdWVzIG9mIHRoZSBtYXAKKyAqIGNvb3JkaW5hdGVzLCBldGMuCisgKiAKKyAqLworcHVibGljIGNsYXNzIFN0ZW1Qb2x5Z29uc0xpc3QgZXh0ZW5kcyBMaW5rZWRMaXN0PFN0ZW1Qb2x5Z29uPiB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCXByaXZhdGUgdHJhbnNpZW50IFJlY3RhbmdsZSBib3VuZHMgPSBudWxsOworCisJLyoqCisJICogRW1wdHkgQ29uc3RydWN0b3IKKwkgKiAKKwkgKi8KKwlwdWJsaWMgU3RlbVBvbHlnb25zTGlzdCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciB3aGljaCBnZXRzIGEgTGF0TG9uZyBvYmplY3QgYW5kIGNvbnN0cnVjdHMgYSBsaXN0IG9mIHBvbHlnb25zCisJICogCisJICogQHBhcmFtIGxhdExvbmdEYXRhCisJICogQHBhcmFtIGlkZW50aWZpYWJsZQorCSAqICAgICAgICAgICAgdGhlIDxjb2RlPklkZW50aWZpYWJsZTwvY29kZT4gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCisJICogICAgICAgICAgICBwb2x5Z29uIGRhdGEuCisJICovCisJcHVibGljIFN0ZW1Qb2x5Z29uc0xpc3QoZmluYWwgTGF0TG9uZyBsYXRMb25nRGF0YSwKKwkJCWZpbmFsIElkZW50aWZpYWJsZSBpZGVudGlmaWFibGUpIHsKKwkJc3VwZXIoKTsKKwkJZm9yIChmaW5hbCBTZWdtZW50IGxhdExvbmdTZWdtZW50IDogbGF0TG9uZ0RhdGEuZ2V0U2VnbWVudHMoKSkgeworCQkJYWRkKG5ldyBTdGVtUG9seWdvbihsYXRMb25nU2VnbWVudCwgaWRlbnRpZmlhYmxlKSk7CisJCX0KKwl9IC8vIFN0ZW1Qb2x5Z29uc0xpc3QKKworCS8qKgorCSAqIENvbXBhcmUgdGhlIGJvdW5kYXJpZXMgb2YgYSBwb2x5Z29uIHRvIHRob3NlIG9mIHRoZSBsaXN0IGFuZCB1cGRhdGUgaWYKKwkgKiBuZWNlc3NhcnkuCisJICogCisJICogQHBhcmFtIHBvbHlnb24KKwkgKiAgICAgICAgICAgIHRoZSBwb2x5Z29uIHRvIHVzZSB0byB1cGRhdGUgdGhlIG1pbmltdW0vbWF4aW11bSB2YWx1ZXMKKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlQm91bmRzKGZpbmFsIFN0ZW1Qb2x5Z29uIHBvbHlnb24pIHsKKwkJLy9Pbmx5IHVwZGF0ZSB0aGUgYm91bmRzIGZvciBwb2x5Z29uIG9mIG5vZGVzCisJCWlmIChwb2x5Z29uLmdldElkZW50aWZpYWJsZSgpIGluc3RhbmNlb2YgRWRnZSkKKwkJCXJldHVybjsKKwkJLy8gQm91bmRzIHlldD8KKwkJaWYgKGJvdW5kcyAhPSBudWxsKSB7CisJCQkvLyBZZXMJCQkKKwkJCWJvdW5kcyA9IGJvdW5kcy51bmlvbihwb2x5Z29uLmdldEJvdW5kcygpKTsKKwkJfSAvLyBpZgorCQllbHNlIHsgCisJCQlib3VuZHMgPSBwb2x5Z29uLmdldEJvdW5kcygpOworCQl9CisJfSAvLyB1cGRhdGVCb3VuZHMKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGJvdW5kaW5nIGJveCB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgcG9seWdvbnMgaW4gdGhlIGxpc3QuCisJICovCisJcHVibGljIGZpbmFsIFJlY3RhbmdsZSBnZXRCb3VuZHMoKSB7CisJCWZvciAoU3RlbVBvbHlnb24gcG9seWdvbiA6IHRoaXMpIHsKKwkJCXVwZGF0ZUJvdW5kcyhwb2x5Z29uKTsKKwkJfQorCQlyZXR1cm4gYm91bmRzOworCX0gLy8gZ2V0Qm91bmRzCisKKwkvKioKKwkgKiBAcGFyYW0gbGF0TG9uZ1Bvc2l0aW9uCisJICogICAgICAgICAgICB0aGUgcG9zaXRpb24gY29udGFpbmVkIGJ5IGEgcG9seWdvbiAob3Igbm90KQorCSAqIEByZXR1cm4gdGhlIHBvbHlnb24gdGhhdCBjb250YWlucyB0aGUgcG9pbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisJICogICAgICAgICB0aGUgcG9pbnQgbGllcyBvdXRzaWRlIG9mIGEgcG9seWdvbi4KKwkgKi8KKwlwdWJsaWMgU3RlbVBvbHlnb24gZ2V0Q29udGFpbmluZ1JlZ2lvblBvbHlnb24oZmluYWwgUG9pbnQgbGF0TG9uZ1Bvc2l0aW9uKSB7CisJCVN0ZW1Qb2x5Z29uIHJldFZhbHVlID0gbnVsbDsKKwkJZm9yIChmaW5hbCBTdGVtUG9seWdvbiBwb2x5Z29uIDogdGhpcykgeworCQkJLy8gRG9lcyB0aGUgcG9seWdvbiBjb250YWluIHRoZSBwb2ludD8KKwkJCWlmIChwb2x5Z29uLmNvbnRhaW5zUG9pbnQobGF0TG9uZ1Bvc2l0aW9uKSkgeworCQkJCS8vIFllcworCQkJCS8vSXMgdGhpcyBwb2x5Z29uIGEgcmVnaW9uPworCQkJCWlmIChwb2x5Z29uLmdldElkZW50aWZpYWJsZSgpIGluc3RhbmNlb2YgUmVnaW9uKSB7CisJCQkJCS8vWWVzCisJCQkJCXJldFZhbHVlID0gcG9seWdvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSAvLyBpZgorCQl9IC8vIGZvciBlYWNoIFN0ZW1Qb2x5Z29uCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldENvbnRhaW5pbmdQb2x5Z29uCit9IC8vIFN0ZW1Qb2x5Z29uc0xpc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9tYXAvbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9tYXAvbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGQ0OGM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjggQEAKKyMgbWVzc2FnZXMucHJvcGVydGllcworIworIyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqCisjICogQ29udHJpYnV0b3JzOgorIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIyBTdGVtIFBvbHlnb24KKyMgTm90aGluZywgYWxsIGNvbW1vbgorCisjIEludGVybmFsIE1hcCBWaWV3CitJTVZpZXcuTVJlZnJlc2ggPSBQb2x5Z29uIFJlZnJlc2gKK0lNVmlldy5NUHJvcD1Ob3cgRGlzcGxheWluZworSU1WaWV3LkVkZ2VzID0gRWRnZXMKKworIyBNYXAgQ2FudmFzIGNvbnRleHQgbWVudSBtZXNzYWdlcworTWFwTWVudS5SZXNldD1SZXNldCBNYXAKK01hcE1lbnUuR2FpbkZhY3Rvcj1HYWluIEZhY3RvcgorTWFwTWVudS5Mb2dyaXRobWljX1NjYWxpbmc9TG9nYXJpdGhtaWMgU2NhbGluZworTWFwTWVudS5Qb2x5Z29uX0JvcmRlcnM9RHJhdyBQb2x5Z29uIEJvcmRlcnMKK01hcE1lbnUuUG9seWdvbl9DZW50ZXJzPUNvbm5lY3QgUG9seWdvbiBDZW50ZXJzCitNYXBNZW51LlJlcG9ydHNfU2VsZWN0PVNlbGVjdCBSZXBvcnRzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvbWFwL3ByZWZlcmVuY2VzL01hcFZpZXdQcmVmZXJlbmNlUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9wcmVmZXJlbmNlcy9NYXBWaWV3UHJlZmVyZW5jZVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTcxNWYzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9wcmVmZXJlbmNlcy9NYXBWaWV3UHJlZmVyZW5jZVBhZ2UuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLy8gR2VvZ3JhcGhpY1ByZWZlcmVuY2VQYWdlLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkJvb2xlYW5GaWVsZEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkNvbG9yRmllbGRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5TdHJpbmdGaWVsZEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBwcmVmZXJlbmNlcyBmb3IgdGhlIE1hcCB2aWV3IG9mIGEgc2ltdWxhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIE1hcFZpZXdQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cworCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgeworCisJLyoqCisJICogVGhlIElEIG9mIHRoZSBTVEVNIFByZWZlcmVuY2UgcGFnZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9TVEVNX01BUF9WSUVXX1BBR0UgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlcy5NYXBWaWV3UHJlZmVyZW5jZVBhZ2UiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1dJRFRIID0gMTE7CisKKwlwcml2YXRlIENvbG9yRmllbGRFZGl0b3IgYmFja2dyb3VuZENvbG9yRmllbGRFZGl0b3I7CisKKwlwcml2YXRlIENvbG9yRmllbGRFZGl0b3IgZm9yZWdyb3VuZENvbG9yUmVsYXRpdmVWYWx1ZVplcm9GaWVsZEVkaXRvcjsKKworCXByaXZhdGUgQm9vbGVhbkZpZWxkRWRpdG9yIGVuYWJsZU11bHRpQ29sb3JEaXNwbGF5RmllbGRFZGl0b3I7CisJcHJpdmF0ZSBTdHJpbmdGaWVsZEVkaXRvciBzRmFjdG9yRmllbGRFZGl0b3I7CisJcHJpdmF0ZSBTdHJpbmdGaWVsZEVkaXRvciBlRmFjdG9yRmllbGRFZGl0b3I7CisJcHJpdmF0ZSBTdHJpbmdGaWVsZEVkaXRvciBpRmFjdG9yRmllbGRFZGl0b3I7CisJcHJpdmF0ZSBTdHJpbmdGaWVsZEVkaXRvciByRmFjdG9yRmllbGRFZGl0b3I7CisKKwlwcml2YXRlIFN0cmluZ0ZpZWxkRWRpdG9yIGd1aVNjYWxpbmdGYWN0b3JGaWVsZEVkaXRvcjsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJcHVibGljIE1hcFZpZXdQcmVmZXJlbmNlUGFnZSgpIHsKKwkJc3VwZXIoR1JJRCk7CisJCXNldFByZWZlcmVuY2VTdG9yZShBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKKwkJc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJNYXBWUFBhZ2UuVml6IikpOworCX0gLy8gR2VvZ3JhcGhpY1ByZWZlcmVuY2VQYWdlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSNjcmVhdGVGaWVsZEVkaXRvcnMoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKKwkJYmFja2dyb3VuZENvbG9yRmllbGRFZGl0b3IgPSBuZXcgQ29sb3JGaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLkJBQ0tHUk9VTkRfQ09MT1JfUFJFRkVSRU5DRSwgTWVzc2FnZXMKKwkJCQkJCS5nZXRTdHJpbmcoIk1hcFZQUGFnZS5iZ2MiKSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7CisKKwkJZm9yZWdyb3VuZENvbG9yUmVsYXRpdmVWYWx1ZVplcm9GaWVsZEVkaXRvciA9IG5ldyBDb2xvckZpZWxkRWRpdG9yKAorCQkJCVByZWZlcmVuY2VDb25zdGFudHMuRk9SRUdST1VORF9SRUxBVElWRV9WQUxVRV9aRVJPX0NPTE9SX1BSRUZFUkVOQ0UsCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJNYXBWUFBhZ2UuZmdydnplcm9jIiksCisJCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7CisKKwkJZW5hYmxlTXVsdGlDb2xvckRpc3BsYXlGaWVsZEVkaXRvciA9IG5ldyBCb29sZWFuRmllbGRFZGl0b3IoCisJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5NVUxUSV9DT0xPUl9ESVNQTEFZX0JPT0xFQU5fUFJFRkVSRU5DRSwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIk1hcFZQUGFnZS5tdWx0aWNvbG9yZGlzcGxheSIpLAorCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpOworCisJCXNGYWN0b3JGaWVsZEVkaXRvciA9IG5ldyBTdHJpbmdGaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlNfQ09MT1JfV0VJR0hUX1BSRUZFUkVOQ0UsIE1lc3NhZ2VzCisJCQkJCQkuZ2V0U3RyaW5nKCJNYXBWUFBhZ2UuU2NvbG9yV2VpZ2h0IiksIEZJRUxEX1dJRFRILAorCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpOworCQlzRmFjdG9yRmllbGRFZGl0b3Iuc2V0RW1wdHlTdHJpbmdBbGxvd2VkKGZhbHNlKTsKKworCQllRmFjdG9yRmllbGRFZGl0b3IgPSBuZXcgU3RyaW5nRmllbGRFZGl0b3IoCisJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5FX0NPTE9SX1dFSUdIVF9QUkVGRVJFTkNFLCBNZXNzYWdlcworCQkJCQkJLmdldFN0cmluZygiTWFwVlBQYWdlLkVjb2xvcldlaWdodCIpLCBGSUVMRF9XSURUSCwKKwkJCQlnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKKwkJZUZhY3RvckZpZWxkRWRpdG9yLnNldEVtcHR5U3RyaW5nQWxsb3dlZChmYWxzZSk7CisKKwkJaUZhY3RvckZpZWxkRWRpdG9yID0gbmV3IFN0cmluZ0ZpZWxkRWRpdG9yKAorCQkJCVByZWZlcmVuY2VDb25zdGFudHMuSV9DT0xPUl9XRUlHSFRfUFJFRkVSRU5DRSwgTWVzc2FnZXMKKwkJCQkJCS5nZXRTdHJpbmcoIk1hcFZQUGFnZS5JY29sb3JXZWlnaHQiKSwgRklFTERfV0lEVEgsCisJCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7CisJCWlGYWN0b3JGaWVsZEVkaXRvci5zZXRFbXB0eVN0cmluZ0FsbG93ZWQoZmFsc2UpOworCisJCXJGYWN0b3JGaWVsZEVkaXRvciA9IG5ldyBTdHJpbmdGaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlJfQ09MT1JfV0VJR0hUX1BSRUZFUkVOQ0UsIE1lc3NhZ2VzCisJCQkJCQkuZ2V0U3RyaW5nKCJNYXBWUFBhZ2UuUmNvbG9yV2VpZ2h0IiksIEZJRUxEX1dJRFRILAorCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpOworCQlyRmFjdG9yRmllbGRFZGl0b3Iuc2V0RW1wdHlTdHJpbmdBbGxvd2VkKGZhbHNlKTsKKworCQlndWlTY2FsaW5nRmFjdG9yRmllbGRFZGl0b3IgPSBuZXcgU3RyaW5nRmllbGRFZGl0b3IoCisJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5HVUlfU0NBTElOR19GQUNUT1JfRE9VQkxFX1BSRUZFUkVOQ0UsCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJNYXBWUFBhZ2UuZ3NmIiksIEZJRUxEX1dJRFRILAorCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpOworCQlndWlTY2FsaW5nRmFjdG9yRmllbGRFZGl0b3Iuc2V0RW1wdHlTdHJpbmdBbGxvd2VkKGZhbHNlKTsKKworCQlhZGRGaWVsZChiYWNrZ3JvdW5kQ29sb3JGaWVsZEVkaXRvcik7CisJCWFkZEZpZWxkKGZvcmVncm91bmRDb2xvclJlbGF0aXZlVmFsdWVaZXJvRmllbGRFZGl0b3IpOworCQlhZGRGaWVsZChlbmFibGVNdWx0aUNvbG9yRGlzcGxheUZpZWxkRWRpdG9yKTsKKwkJYWRkRmllbGQoc0ZhY3RvckZpZWxkRWRpdG9yKTsKKwkJYWRkRmllbGQoZUZhY3RvckZpZWxkRWRpdG9yKTsKKwkJYWRkRmllbGQoaUZhY3RvckZpZWxkRWRpdG9yKTsKKwkJYWRkRmllbGQockZhY3RvckZpZWxkRWRpdG9yKTsKKwkJYWRkRmllbGQoZ3VpU2NhbGluZ0ZhY3RvckZpZWxkRWRpdG9yKTsKKwl9IC8vIGNyZWF0ZUZpZWxkRWRpdG9ycworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UjY2hlY2tTdGF0ZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tTdGF0ZSgpIHsKKwkJc3VwZXIuY2hlY2tTdGF0ZSgpOworCisJCS8vIFRPRE8gZm9yIHNvbWUgcmVhc29uIG9ubHkgdGhlIEdVSSBzY2FsaW5nIGZhY3RvciBpcyB2YWxpZGF0ZWQgb24KKwkJLy8gZmllbGQgY2hhbmdlCisJCS8vIENoZWNrIEdVSSBTY2FsaW5nIGZhY3Rvcj8KKwkJaWYgKGlzVmFsaWQoKSkgeworCQkJLy8gWWVzCisJCQkvLyBJcyB0aGUgR1VJIHNjYWxlIGZhY3RvciBvaz8KKwkJCXRyeSB7CisJCQkJZmluYWwgZG91YmxlIGZhY3RvciA9IERvdWJsZQorCQkJCQkJLnBhcnNlRG91YmxlKGd1aVNjYWxpbmdGYWN0b3JGaWVsZEVkaXRvcgorCQkJCQkJCQkuZ2V0U3RyaW5nVmFsdWUoKSk7CisJCQkJaWYgKGZhY3RvciA8PSAwLjApIHsKKwkJCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmdldFN0cmluZygiR1VJU2NhbGUubmVnRXJyIikpOworCQkJCQlzZXRWYWxpZChmYWxzZSk7CisJCQkJfSAvLyBpZgorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuZ2V0U3RyaW5nKCJNYXBWUFBhZ2UubnVtRXJyIikpOworCQkJCXNldFZhbGlkKGZhbHNlKTsKKwkJCX0gLy8gY2F0Y2ggRXhjZXB0aW9uCisJCX0gLy8gQ2hlY2sgZ3VpIFNjYWxpbmcgZmFjdG9yCisKKwl9IC8vIGNoZWNrU3RhdGUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlI3Byb3BlcnR5Q2hhbmdlKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCXN1cGVyLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKKwkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKEZpZWxkRWRpdG9yLlZBTFVFKSkgeworCQkJaWYgKGV2ZW50LmdldFNvdXJjZSgpID09IGd1aVNjYWxpbmdGYWN0b3JGaWVsZEVkaXRvcikgeworCQkJCWNoZWNrU3RhdGUoKTsKKwkJCX0gLy8gaWYKKwkJfSAvLyBpZgorCX0gLy8gcHJvcGVydHlDaGFuZ2UKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCUlXb3JrYmVuY2ggd29ya2JlbmNoKSB7CisJCS8vIE5vdGhpbmcKKwl9IC8vIGluaXQKKworfSAvLyBHZW9ncmFwaGljUHJlZmVyZW5jZVBhZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9tYXAvcHJlZmVyZW5jZXMvTWVzc2FnZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9tYXAvcHJlZmVyZW5jZXMvTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDUwZjgyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9wcmVmZXJlbmNlcy9NZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8vIE1lc3NhZ2VzLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGdldHMgTkxTIHZhbHVlcy4KKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlcy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCisJCQkuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKKworCXByaXZhdGUgTWVzc2FnZXMoKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0ga2V5CisJICogQHJldHVybiB0aGUgc3RyaW5nIG1hdGNoaW5nIHRoZSBrZXkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9Cit9IC8vIE1lc3NhZ2VzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvbWFwL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9tYXAvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZmZlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvbWFwL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDY2IEBACisvLyBQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQ29uc3RhbnQgZGVmaW5pdGlvbnMgZm9yIHBsdWctaW4gcHJlZmVyZW5jZXMKKyAqLworcHVibGljIGludGVyZmFjZSBQcmVmZXJlbmNlQ29uc3RhbnRzIHsKKworCS8qKgorCSAqIFRoZSBwcmVmZXJlbmNlIGlkIGZvciB0aGUgbWFwJ3MgYmFja2dyb3VuZCBjb2xvcgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tHUk9VTkRfQ09MT1JfUFJFRkVSRU5DRSA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLmJhY2tncm91bmRjb2xvciI7CisKKwkvKioKKwkgKiBUaGUgcHJlZmVyZW5jZSBpZCBmb3IgdGhlIG1hcCdzIGZvcmVncm91bmQgY29sb3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EX0NPTE9SX1BSRUZFUkVOQ0UgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlcy5mb3JlZ3JvdW5kY29sb3IiOworCisJLyoqCisJICogVGhlIHByZWZlcmVuY2UgaWQgZm9yIHRoZSBtYXAncyBmb3JlZ3JvdW5kIGNvbG9yIHdoZW4gdGhlIHJlbGF0aXZlIHZhbHVlID0KKwkgKiAwCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORF9SRUxBVElWRV9WQUxVRV9aRVJPX0NPTE9SX1BSRUZFUkVOQ0UgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlcy5mb3JlZ3JvdW5kcmVsYXRpdmV2YWx1ZXplcm9jb2xvciI7CisKKwkvKioKKwkgKiBUaGUgcHJlZmVyZW5jZSBpZCBmb3IgdGhlIG11bHRpY29sb3IvbXVsdGktdmFyaWFibGUgbWFwIGRpc3BsYXkgbW9kZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSV9DT0xPUl9ESVNQTEFZX0JPT0xFQU5fUFJFRkVSRU5DRSA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLm11bHRpY29sb3JkaXNwbGF5IjsKKworCS8qKgorCSAqIE11bHRpY29sb3IgRGlzcGxheSBJbnRlbnNpdHkgd2VpZ2h0aW5nIGZvciB2YXJpYWJsZSBTCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU19DT0xPUl9XRUlHSFRfUFJFRkVSRU5DRSA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLnNjb2xvcndlaWdodCI7CisKKwkvKioKKwkgKiBNdWx0aWNvbG9yIERpc3BsYXkgSW50ZW5zaXR5IHdlaWdodGluZyBmb3IgdmFyaWFibGUgRQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVfQ09MT1JfV0VJR0hUX1BSRUZFUkVOQ0UgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlcy5lY29sb3J3ZWlnaHQiOworCisJLyoqCisJICogTXVsdGljb2xvciBEaXNwbGF5IEludGVuc2l0eSB3ZWlnaHRpbmcgZm9yIHZhcmlhYmxlIEkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJX0NPTE9SX1dFSUdIVF9QUkVGRVJFTkNFID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAucHJlZmVyZW5jZXMuaWNvbG9yd2VpZ2h0IjsKKworCS8qKgorCSAqIE11bHRpY29sb3IgRGlzcGxheSBJbnRlbnNpdHkgd2VpZ2h0aW5nIGZvciB2YXJpYWJsZSBSCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUl9DT0xPUl9XRUlHSFRfUFJFRkVSRU5DRSA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLnJjb2xvcndlaWdodCI7CisKKwkvKioKKwkgKiBUaGUgcHJlZmVyZW5jZSBpZCBmb3IgdGhlIG1hcCdzIGluaXRpYWwgc2NhbGluZworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSV9TQ0FMSU5HX0ZBQ1RPUl9ET1VCTEVfUFJFRkVSRU5DRSA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLmd1aXNjYWxpbmciOworCit9IC8vIFByZWZlcmVuY2VDb25zdGFudHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9tYXAvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvbWFwL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMjhiYTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvbWFwL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8vIFByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAucHJlZmVyZW5jZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOworCisvKioKKyAqIENsYXNzIHVzZWQgdG8gaW5pdGlhbGl6ZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgorICovCitwdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgeworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKKy8vCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikvLyROT04tTkxTLTEkCisvLwkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CisJCS8vIHN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5CQUNLR1JPVU5EX0NPTE9SX1BSRUZFUkVOQ0UsCisJCS8vIE1hcENhbnZhcy5ERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1JfUkdCX1NUUklORyk7CisJCS8vIHN0b3JlCisJCS8vIC5zZXREZWZhdWx0KAorCQkvLyBQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUkVHUk9VTkRfUkVMQVRJVkVfVkFMVUVfWkVST19DT0xPUl9QUkVGRVJFTkNFLAorCQkvLyBNYXBDYW52YXMuREVGQVVMVF9aRVJPX1BPTFlHT05fQ09MT1JfUkdCX1NUUklORyk7CisJCS8vIHN0b3JlCisJCS8vIC5zZXREZWZhdWx0KAorCQkvLyBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50cy5CT1JERVJfQ09MT1JfUFJFRkVSRU5DRSwKKwkJLy8gTWFwQ2FudmFzLkRFRkFVTFRfUE9MWUdPTl9CT1JERVJfQ09MT1JfUkdCX1NUUklORyk7CisKKy8vCQlzdG9yZQorLy8JCQkJLnNldERlZmF1bHQoCisvLwkJCQkJCW9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzLkRSQVdfUE9MWUdPTl9CT1JERVJTX0JPT0xFQU5fUFJFRkVSRU5DRSwKKy8vCQkJCQkJTWFwQ2FudmFzLkRFRkFVTFRfRFJBV19QT0xZR09OX0JPUkRFUlMpOworCQkvLworCQkvLyBzdG9yZS5zZXREZWZhdWx0KAorCQkvLyBQcmVmZXJlbmNlQ29uc3RhbnRzLk1VTFRJX0NPTE9SX0RJU1BMQVlfQk9PTEVBTl9QUkVGRVJFTkNFLAorCQkvLyBNYXBDYW52YXMuREVGQVVMVF9NVUxUSV9DT0xPUl9NT0RFKTsKKwkJLy8KKwkJLy8gc3RvcmUuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLlNfQ09MT1JfV0VJR0hUX1BSRUZFUkVOQ0UsCisJCS8vIE1hcENhbnZhcy5ERUZBVUxUX1NfV0VJR0hUSU5HKTsKKwkJLy8KKwkJLy8gc3RvcmUuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLkVfQ09MT1JfV0VJR0hUX1BSRUZFUkVOQ0UsCisJCS8vIE1hcENhbnZhcy5ERUZBVUxUX0VfV0VJR0hUSU5HKTsKKwkJLy8KKwkJLy8gc3RvcmUuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLklfQ09MT1JfV0VJR0hUX1BSRUZFUkVOQ0UsCisJCS8vIE1hcENhbnZhcy5ERUZBVUxUX0lfV0VJR0hUSU5HKTsKKwkJLy8KKwkJLy8gc3RvcmUuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLlJfQ09MT1JfV0VJR0hUX1BSRUZFUkVOQ0UsCisJCS8vIE1hcENhbnZhcy5ERUZBVUxUX1JfV0VJR0hUSU5HKTsKKworLy8JCXN0b3JlCisvLwkJCQkuc2V0RGVmYXVsdCgKKy8vCQkJCQkJb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLnByZWZlcmVuY2VzLlByZWZlcmVuY2VDb25zdGFudHMuTE9HU0NBTEVfQk9PTEVBTl9QUkVGRVJFTkNFLAorLy8JCQkJCQlNYXBDYW52YXMuREVGQVVMVF9VU0VfTE9HU0NBTElORyk7CisvLworLy8JCXN0b3JlCisvLwkJCQkuc2V0RGVmYXVsdCgKKy8vCQkJCQkJb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLnByZWZlcmVuY2VzLlByZWZlcmVuY2VDb25zdGFudHMuR0FJTl9GQUNUT1JfUFJFRkVSRU5DRSwKKy8vCQkJCQkJTWFwQ2FudmFzLkRFRkFVTFRfR0FJTl9GQUNUT1IpOworCisJfSAvLyBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzCit9IC8vIFByZWZlcmVuY2VJbml0aWFsaXplcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL21hcC9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYzE2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvbWFwL3ByZWZlcmVuY2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzOCBAQAorIyBtZXNzYWdlcy5wcm9wZXJ0aWVzCisjCisjIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitNYXBWUFBhZ2UuVml6ID0gTWFwIFByZWZlcmVuY2VzCisKKworTWFwVlBQYWdlLmJnYyA9ICZCYWNrZ3JvdW5kIENvbG9yCitNYXBWUFBhZ2UuZmdjID0gJkZvcmVncm91bmQgQ29sb3IKK01hcFZQUGFnZS5mZ3J2emVyb2MgPSAmWmVybyBSZWxhdGl2ZSBWYWx1ZSBDb2xvcgorTWFwVlBQYWdlLmJjID0gJkJvcmRlcnMgQ29sb3IKK01hcFZQUGFnZS5kcmF3cG9seWJvcmRlcnMgPSBEcmF3ICZQb2x5Z29uIEJvcmRlcnMKK01hcFZQUGFnZS5tdWx0aWNvbG9yZGlzcGxheSA9IEVuYWJsZSAmTXVsdGljb2xvciBEaXNwbGF5CitNYXBWUFBhZ2UuU2NvbG9yV2VpZ2h0ID0gJlMgQ29sb3IgV2VpZ2h0CitNYXBWUFBhZ2UuRWNvbG9yV2VpZ2h0ID0gJkUgQ29sb3IgV2VpZ2h0CitNYXBWUFBhZ2UuSWNvbG9yV2VpZ2h0ID0gJkkgQ29sb3IgV2VpZ2h0CitNYXBWUFBhZ2UuUmNvbG9yV2VpZ2h0ID0gJlIgQ29sb3IgV2VpZ2h0CitNYXBWUFBhZ2UubG9nc2NhbGUgPSBVc2UgTG9nYXJpdGhtaWMgU2NhbGUKK01hcFZQUGFnZS5nYWluZiA9IEdhaW4gJkZhY3RvcgorTWFwVlBQYWdlLmdzZiA9ICZHVUkgU2NhbGluZyBGYWN0b3IKK01hcFZQUGFnZS54dCA9IAlJbml0aWFsICZYIFRyYW5zbGF0aW9uCitNYXBWUFBhZ2UueXQgPSAJSW5pdGlhbCAmWSBUcmFuc2xhdGlvbgorTWFwVlBQYWdlLnpyc2YgPSAmWm9vbSBSdWxlciBTY2FsaW5nIEZhY3RvcgorTWFwVlBQYWdlLmlzcyA9IEluaXRpYWwgJlNjYWxlIFNlbGVjdGlvbiAoezB9LXsxfSkKKworTWFwVlBQYWdlLm51bUVyciA9IFRoZSBmaWVsZCBpcyBub3QgYSB2YWxpZCBudW1iZXIuCitHRmFjdG9yLm5lZ0VyciA9IFRoZSBHYWluIEZhY3RvciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLjAKK0dVSVNjYWxlLm5lZ0VyciA9IFRoZSBHVUkgU2NhbGluZyBGYWN0b3IgbXVzdCBiZSBncmVhdGVyIHRoYW4gMC4wCitaUlNjYWxlLm5lZ0VyciA9IFRoZSBab29tIFJ1bGVyIFNjYWxpbmcgZmFjdG9yIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL3ByZWZlcmVuY2VzL0dlb2dyYXBoaWNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL3ByZWZlcmVuY2VzL0dlb2dyYXBoaWNQcmVmZXJlbmNlUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzODkwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvcHJlZmVyZW5jZXMvR2VvZ3JhcGhpY1ByZWZlcmVuY2VQYWdlLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8vIEdlb2dyYXBoaWNQcmVmZXJlbmNlUGFnZS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5wcmVmZXJlbmNlczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkJvb2xlYW5GaWVsZEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkNvbG9yRmllbGRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuU3RyaW5nRmllbGRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBwcmVmZXJlbmNlcyBmb3IgdGhlIE1hcCB2aWV3IG9mIGEgc2ltdWxhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIEdlb2dyYXBoaWNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UKKwkJaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgeworCisJLyoqCisJICogVGhlIElEIG9mIHRoZSBTVEVNIEdlb2dyYXBoaWMgdmlldyBQcmVmZXJlbmNlIHBhZ2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfU1RFTV9HRU9HUkFQSElDX1ZJRVdfUFJFRkVSRU5DRV9QQUdFID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5wcmVmZXJlbmNlcy5HZW9ncmFwaGljVmlld1ByZWZlcmVuY2VQYWdlIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSUVMRF9XSURUSCA9IDExOworCisJcHJpdmF0ZSBCb29sZWFuRmllbGRFZGl0b3IgZHJhd1BvbHlnb25Cb3JkZXJzRmllbGRFZGl0b3I7CisKKwlwcml2YXRlIENvbG9yRmllbGRFZGl0b3IgYm9yZGVyQ29sb3JGaWVsZEVkaXRvcjsKKworCXByaXZhdGUgQm9vbGVhbkZpZWxkRWRpdG9yIGxvZ1NjYWxlRmllbGRFZGl0b3I7CisKKwlwcml2YXRlIFN0cmluZ0ZpZWxkRWRpdG9yIGdhaW5GYWN0b3JGaWVsZEVkaXRvcjsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJcHVibGljIEdlb2dyYXBoaWNQcmVmZXJlbmNlUGFnZSgpIHsKKwkJc3VwZXIoR1JJRCk7CisJCXNldFByZWZlcmVuY2VTdG9yZShBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKKwkJc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJHZW9QUGFnZS5WaXoiKSk7CisJfSAvLyBHZW9ncmFwaGljUHJlZmVyZW5jZVBhZ2UKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlI2NyZWF0ZUZpZWxkRWRpdG9ycygpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmllbGRFZGl0b3JzKCkgeworCisJCWRyYXdQb2x5Z29uQm9yZGVyc0ZpZWxkRWRpdG9yID0gbmV3IEJvb2xlYW5GaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLkRSQVdfUE9MWUdPTl9CT1JERVJTX0JPT0xFQU5fUFJFRkVSRU5DRSwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkdlb1BQYWdlLmRyYXdwb2x5Ym9yZGVycyIpLAorCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpOworCisJCWJvcmRlckNvbG9yRmllbGRFZGl0b3IgPSBuZXcgQ29sb3JGaWVsZEVkaXRvcigKKwkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLkJPUkRFUl9DT0xPUl9QUkVGRVJFTkNFLCBNZXNzYWdlcworCQkJCQkJLmdldFN0cmluZygiR2VvUFBhZ2UuYmMiKSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7CisKKwkJbG9nU2NhbGVGaWVsZEVkaXRvciA9IG5ldyBCb29sZWFuRmllbGRFZGl0b3IoCisJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5MT0dTQ0FMRV9CT09MRUFOX1BSRUZFUkVOQ0UsIE1lc3NhZ2VzCisJCQkJCQkuZ2V0U3RyaW5nKCJHZW9QUGFnZS5sb2dzY2FsZSIpLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKKworCQlnYWluRmFjdG9yRmllbGRFZGl0b3IgPSBuZXcgU3RyaW5nRmllbGRFZGl0b3IoCisJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5HQUlOX0ZBQ1RPUl9QUkVGRVJFTkNFLCBNZXNzYWdlcworCQkJCQkJLmdldFN0cmluZygiR2VvUFBhZ2UuZ2FpbmYiKSwgRklFTERfV0lEVEgsCisJCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7CisJCWdhaW5GYWN0b3JGaWVsZEVkaXRvci5zZXRFbXB0eVN0cmluZ0FsbG93ZWQoZmFsc2UpOworCisJCWFkZEZpZWxkKGRyYXdQb2x5Z29uQm9yZGVyc0ZpZWxkRWRpdG9yKTsKKwkJYWRkRmllbGQoYm9yZGVyQ29sb3JGaWVsZEVkaXRvcik7CisJCWFkZEZpZWxkKGxvZ1NjYWxlRmllbGRFZGl0b3IpOworCQlhZGRGaWVsZChnYWluRmFjdG9yRmllbGRFZGl0b3IpOworCX0gLy8gY3JlYXRlRmllbGRFZGl0b3JzCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSNjaGVja1N0YXRlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjaGVja1N0YXRlKCkgeworCQlzdXBlci5jaGVja1N0YXRlKCk7CisKKwkJLy8gQ2hlY2sgR2FpbiBmYWN0b3I/CisJCWlmIChpc1ZhbGlkKCkpIHsKKwkJCS8vIFllcworCQkJLy8gSXMgdGhlIEdhaW4gZmFjdG9yIG9rPworCQkJdHJ5IHsKKwkJCQlmaW5hbCBkb3VibGUgZmFjdG9yID0gRG91YmxlLnBhcnNlRG91YmxlKGdhaW5GYWN0b3JGaWVsZEVkaXRvcgorCQkJCQkJLmdldFN0cmluZ1ZhbHVlKCkpOworCQkJCWlmIChmYWN0b3IgPD0gMC4wKSB7CisJCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIkdGYWN0b3IubmVnRXJyIikpOworCQkJCQlzZXRWYWxpZChmYWxzZSk7CisJCQkJfSAvLyBpZgorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuZ2V0U3RyaW5nKCJHZW9QUGFnZS5udW1FcnIiKSk7CisJCQkJc2V0VmFsaWQoZmFsc2UpOworCQkJfSAvLyBjYXRjaCBFeGNlcHRpb24KKwkJfSAvLyBDaGVjayBndWkgU2NhbGluZyBmYWN0b3IKKworCX0gLy8gY2hlY2tTdGF0ZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQorCSAqLworCXB1YmxpYyB2b2lkIGluaXQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKKwkJLy8gTm90aGluZworCX0gLy8gaW5pdAorCit9IC8vIEdlb2dyYXBoaWNQcmVmZXJlbmNlUGFnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL3ByZWZlcmVuY2VzL01lc3NhZ2VzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvcHJlZmVyZW5jZXMvTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjBjY2VmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL3ByZWZlcmVuY2VzL01lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLy8gTWVzc2FnZXMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMucHJlZmVyZW5jZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBnZXRzIE5MUyB2YWx1ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlcyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5wcmVmZXJlbmNlcy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCisJCQkuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKKworCXByaXZhdGUgTWVzc2FnZXMoKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0ga2V5CisJICogQHJldHVybiB0aGUgc3RyaW5nIG1hdGNoaW5nIHRoZSBrZXkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9Cit9IC8vIE1lc3NhZ2VzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTY2MjY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDM4IEBACisvLyBQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLnByZWZlcmVuY2VzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBDb25zdGFudCBkZWZpbml0aW9ucyBmb3IgcGx1Zy1pbiBwcmVmZXJlbmNlcworICovCitwdWJsaWMgaW50ZXJmYWNlIFByZWZlcmVuY2VDb25zdGFudHMgeworCisJLyoqCisJICogVGhlIHByZWZlcmVuY2UgaWQgZm9yIHRoZSBkcmF3aW5nIHBvbHlnb24gYm9yZGVycy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUkFXX1BPTFlHT05fQk9SREVSU19CT09MRUFOX1BSRUZFUkVOQ0UgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlcy5wb2x5Z29uYm9yZGVycyI7CisJLyoqCisJICogVGhlIHByZWZlcmVuY2UgaWQgZm9yIHVzaW5nIGEgbG9nYXJpdGhtaWMgc2NhbGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUKKwkgKiBkaXNwbGF5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1NDQUxFX0JPT0xFQU5fUFJFRkVSRU5DRSA9ICJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLnByZWZlcmVuY2VzLmxvZ3NjYWxlIjsKKwkvKioKKwkgKiBUaGUgcHJlZmVyZW5jZSBpZCBmb3IgdGhlIG1hcCBnYWluIGZhY3RvcgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdBSU5fRkFDVE9SX1BSRUZFUkVOQ0UgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5wcmVmZXJlbmNlcy5nYWluZmFjdG9yIjsKKwkvKioKKwkgKiBUaGUgcHJlZmVyZW5jZSBpZCBmb3IgdGhlIG1hcCdzIGJvcmRlciBjb2xvcgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPUkRFUl9DT0xPUl9QUkVGRVJFTkNFID0gIm9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAucHJlZmVyZW5jZXMuYm9yZGVyY29sb3IiOworCit9IC8vIFByZWZlcmVuY2VDb25zdGFudHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzJhNGVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9nZW9ncmFwaGljL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8vIFByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5wcmVmZXJlbmNlczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7CisvL2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKKworLyoqCisgKiBDbGFzcyB1c2VkIHRvIGluaXRpYWxpemUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KKyAqLworcHVibGljIGNsYXNzIFByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7CisvLwkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpLy8kTk9OLU5MUy0xJAorLy8JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOworLy8JCXN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5CQUNLR1JPVU5EX0NPTE9SX1BSRUZFUkVOQ0UsCisvLwkJCQlNYXBDYW52YXMuREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SX1JHQl9TVFJJTkcpOworLy8KKy8vCQlzdG9yZQorLy8JCQkJLnNldERlZmF1bHQoCisvLwkJCQkJCW9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzLkJPUkRFUl9DT0xPUl9QUkVGRVJFTkNFLAorLy8JCQkJCQlNYXBDYW52YXMuREVGQVVMVF9QT0xZR09OX0JPUkRFUl9DT0xPUl9SR0JfU1RSSU5HKTsKKy8vCisvLwkJc3RvcmUKKy8vCQkJCS5zZXREZWZhdWx0KAorLy8JCQkJCQlvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50cy5EUkFXX1BPTFlHT05fQk9SREVSU19CT09MRUFOX1BSRUZFUkVOQ0UsCisvLwkJCQkJCU1hcENhbnZhcy5ERUZBVUxUX0RSQVdfUE9MWUdPTl9CT1JERVJTKTsKKy8vCisvLwkJc3RvcmUKKy8vCQkJCS5zZXREZWZhdWx0KAorLy8JCQkJCQlvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50cy5MT0dTQ0FMRV9CT09MRUFOX1BSRUZFUkVOQ0UsCisvLwkJCQkJCU1hcENhbnZhcy5ERUZBVUxUX1VTRV9MT0dTQ0FMSU5HKTsKKy8vCisvLwkJc3RvcmUKKy8vCQkJCS5zZXREZWZhdWx0KAorLy8JCQkJCQlvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50cy5HQUlOX0ZBQ1RPUl9QUkVGRVJFTkNFLAorLy8JCQkJCQlNYXBDYW52YXMuREVGQVVMVF9HQUlOX0ZBQ1RPUik7CisKKwl9IC8vIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMKK30gLy8gUHJlZmVyZW5jZUluaXRpYWxpemVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvcHJlZmVyZW5jZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvZ2VvZ3JhcGhpYy9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZmQ0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3ZpZXdzL2dlb2dyYXBoaWMvcHJlZmVyZW5jZXMvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDIzIEBACisjIG1lc3NhZ2VzLnByb3BlcnRpZXMKKyMKKyMgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0dlb1BQYWdlLlZpeiA9IEdlb2dyYXBoaWMgVmlzdWFsaXphdGlvbiBQcmVmZXJlbmNlcworCisKK0dlb1BQYWdlLmJjID0gJkJvcmRlcnMgQ29sb3IKK0dlb1BQYWdlLmRyYXdwb2x5Ym9yZGVycyA9IERyYXcgJlBvbHlnb24gQm9yZGVycworR2VvUFBhZ2UubG9nc2NhbGUgPSBVc2UgTG9nYXJpdGhtaWMgU2NhbGUKK0dlb1BQYWdlLmdhaW5mID0gR2FpbiAmRmFjdG9yCisKK0dlb1BQYWdlLm51bUVyciA9IFRoZSBmaWVsZCBpcyBub3QgYSB2YWxpZCBudW1iZXIuCitHRmFjdG9yLm5lZ0VyciA9IFRoZSBHYWluIEZhY3RvciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLjAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvdmlld3MvbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjFmNDcwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS92aWV3cy9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDQgQEAKKyMgVmlld3NNZXNzYWdlcy5wcm9wZXJ0aWVzCisjCisjIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjIElkZW50aWZpYWJsZSBQbHVnaW4gVmlldworSVBWaWV3Lk5vX0NhdGVnb3J5PUNhdGVnb3J5IFwiezB9XCIgZG9lcyBub3QgZXhpc3QuICBVc2luZyBcIi9cIiBpbnN0ZWFkLgorSVBWaWV3LlVuZXhwZWN0ZWRfRWxlbWVudD1VbmV4cGVjdGVkIGVsZW1lbnQgXCJ7MH1cIiBmb3VuZCBmb3IgZXh0ZW5zaW9uIHBvaW50IFwiezF9XCIKKworIyBTaW11bGF0aW9uIENvbnRyb2wgVmlldworU0NWaWV3LlJ1bj1SdW4KKworU0NWaWV3LlBhdXNlPVBhdXNlCitTQ1ZpZXcuUmVzZXQ9UmVzZXQKK1NDVmlldy5TdGVwPVN0ZXAKK1NDVmlldy5TdG9wPVN0b3AKKworIyBTaW11bGF0aW9uIENvbnRyb2wKKyMgVGhlIHN0cmluZ3Mgd2l0aCAiOiIgc2hvdWxkIGhhdmUgdGhlICI6IiBleHRyYWN0ZWQgREFGCitTQ3RybC5SdW5uaW5nPVN0YXR1cyA6IFJ1bm5pbmcKK1NDdHJsLlJlc2V0PVN0YXR1cyA6IFJlc2V0CitTQ3RybC5QYXVzZWQ9U3RhdHVzIDogUGF1c2VkCitTQ3RybC5UaW1lPVRpbWUKK1NDdHJsLlByb2dyZXNzPVByb2dyZXNzCitTQ3RybC5TdGFydFNpbT1TdGFydCB0aGUgc2ltdWxhdGlvbgorU0N0cmwuUGF1c2VTaW09UGF1c2UgdGhlIHNpbXVsYXRpb24KK1NDdHJsLlJlc3RvcmVTaW09UmVzdG9yZSB0aGUgc2ltdWxhdGlvbiB0byBpdHMgc3RhcnRpbmcgc3RhdGUKK1NDdHJsLlN0ZXBTaW09QWR2YW5jZSB0aGUgc2ltdWxhdGlvbiBieSBvbmUgdGltZSBzdGVwCitTQ3RybC5TdG9wU2ltPVN0b3AgdGhlIHNpbXVsYXRpb24KK1NDdHJsLlZpc3VhbGl6ZVNpbT1TaG93IG9uIE1hcFZpZXdlcgorCisjIFNURU0gUHJvamVjdCBFeHBsb3JlcgorU1RFTVBFeC5DRF9UaXRsZT1Db25maXJtIERlbGV0ZQorU1RFTVBFeC5DRD1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICIKK1NURU1QRXguQ0RfUHJvYj1Qcm9ibGVtIGRlbGV0aW5nICIKK1NURU1QRXguUmVGcmVzaF9Qcm9iPVByb2JsZW0gcmVmcmVzaGluZyAiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpZGdldHMvQ29sb3JQcm92aWRlclByb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2lkZ2V0cy9Db2xvclByb3ZpZGVyUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZTY4MDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpZGdldHMvQ29sb3JQcm92aWRlclByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDQ3NSBAQAorLy8gQ29sb3JQcm92aWRlclByb3BlcnRpZXNDb21wb3NpdGUuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBjb21wb3VuZCBTV1Qge0BsaW5rIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldH0gdGhhdCBhbGxvd3MgZm9yIHRoZSBzZWxlY3Rpb24gb2YKKyAqIGEgcHJvcGVydGllcyBvZiBhIHtAbGluayBEZWNvcmF0b3J9LgorICovCitwdWJsaWMgY2xhc3MgQ29sb3JQcm92aWRlclByb3BlcnRpZXNDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgeworCisJLyoqCisJICogQSBsaXN0IG9mIHtAbGluayBQcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyfXMgdG8gYmUgbm90aWZpZWQgYWJvdXQKKwkgKiBwcm9wZXJ0eSBzZWxlY3Rpb24gZXZlbnRzCisJICovCisJcHJpdmF0ZSBmaW5hbCBMaXN0PFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXI+IHByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXI+KCk7CisJLyoqCisJICogVGhlIGluaXRpYWwgcHJvcGVydHkgbmFtZSB0byBiZSBzZWxlY3RlZCB3aGVuIHRoZSBjb21wb3NpdGUgaXMgYmVpbmcKKwkgKiBpbml0aWFsaXplZAorCSAqLworCXByaXZhdGUgU3RyaW5nIGluaXRpYWxQcm9wZXJ0eU5hbWU7CisJLyoqCisJICogVGhlIHtAbGluayBDb21ib30gb2YgYXZhaWxhYmxlIHByb3BlcnRpZXMKKwkgKi8KKwlDb21ibyBwcm9wZXJ0aWVzQ29tYm87CisJLyoqCisJICogVGhlIHByb3BlcnRpZXMKKwkgKi8KKwlMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BlcnRpZXM7CisJLyoqCisJICogVGhlIHNlbGVjdGVkIHByb3BlcnR5CisJICovCisJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBzZWxlY3RlZFByb3BlcnR5OworCisJLy8gLyoqCisJLy8gKiBUaGUgc2VsZWN0ZWQgZGVjb3JhdG9yCisJLy8gKi8KKwkvLyBEZWNvcmF0b3Igc2VsZWN0ZWREZWNvcmF0b3I7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQge0BsaW5rIENvbXBvc2l0ZX0KKwkgKiBAcGFyYW0gc3R5bGUKKwkgKiAgICAgICAgICAgIGFuIFNXVCBzdHlsZQorCSAqLworCXB1YmxpYyBDb2xvclByb3ZpZGVyUHJvcGVydGllc0NvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50LAorCQkJZmluYWwgaW50IHN0eWxlKSB7CisJCXN1cGVyKHBhcmVudCwgc3R5bGUpOworCQlmaW5hbCBGb3JtTGF5b3V0IHJldFZhbHVlTGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKKwkJdGhpcy5zZXRMYXlvdXQocmV0VmFsdWVMYXlvdXQpOworCisJCS8vIENvbWJvIEJveCBvZiB0aGUgRGVjb3JhdG9yIFByb3BlcnRpZXMKKwkJcHJvcGVydGllc0NvbWJvID0gbmV3IENvbWJvKHRoaXMsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZCisJCQkJfCBTV1QuQ0VOVEVSKTsKKworCQlmaW5hbCBGb3JtRGF0YSBwcm9wZXJ0aWVzQ29tYm9Gb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlwcm9wZXJ0aWVzQ29tYm9Gb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXByb3BlcnRpZXNDb21ib0Zvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXByb3BlcnRpZXNDb21ib0Zvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCXByb3BlcnRpZXNDb21iby5zZXRMYXlvdXREYXRhKHByb3BlcnRpZXNDb21ib0Zvcm1EYXRhKTsKKwkJcHJvcGVydGllc0NvbWJvLnNldEVuYWJsZWQoZmFsc2UpOworCisJCXRoaXMucGFjaygpOworCisJCXByb3BlcnRpZXNDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoCisJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJLy8gQW55IERlY29yYXRvciBwcm9wZXJ0aWVzPworCQkJCWlmICghcHJvcGVydGllcy5pc0VtcHR5KCkpIHsKKwkJCQkJLy8gWWVzCisJCQkJCS8vIElzIGl0IGRpZmZlcmVudD8KKwkJCQkJZmluYWwgSXRlbVByb3BlcnR5RGVzY3JpcHRvciB0ZW1wID0gcHJvcGVydGllcworCQkJCQkJCS5nZXQocHJvcGVydGllc0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOworCQkJCQlpZiAoc2VsZWN0ZWRQcm9wZXJ0eSAhPSB0ZW1wKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXNlbGVjdGVkUHJvcGVydHkgPSB0ZW1wOworCQkJCQkJbm90aWZ5UHJvcGVydHlTZWxlY3Rpb24oc2VsZWN0ZWRQcm9wZXJ0eSk7CisJCQkJCX0gLy8gaWYKKwkJCQl9IC8vIGlmCisJCQl9IC8vIHdpZGdldFNlbGVjdGVkCisJCX0gLy8gU2VsZWN0aW9uQWRhcHRlcgorCQkJCSk7CisJfSAvLyBDb2xvclByb3ZpZGVyUHJvcGVydGllc0NvbXBvc2l0ZQorCisJLyoqCisJICogTm90aWZ5IGxpc3RlbmVycyBhYm91dCBhIHByb3BlcnR5IHRoYXQgaGFzIGJlZW4gc2VsZWN0ZWQKKwkgKiAKKwkgKiBAcGFyYW0gc2VsZWN0ZWRQcm9wZXJ0eQorCSAqICAgICAgICAgICAgdGhlIHNlbGVjdGVkIHByb3BlcnR5CisJICovCisJdm9pZCBub3RpZnlQcm9wZXJ0eVNlbGVjdGlvbihmaW5hbCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHNlbGVjdGVkUHJvcGVydHkpIHsKKwkJLy8gSXMgdGhlcmUgYSBwcm9wZXJ0eT8KKwkJaWYgKHNlbGVjdGVkUHJvcGVydHkgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlmaXJlUHJvcGVydHlTZWxlY3Rpb25FdmVudChuZXcgUHJvcGVydHlTZWxlY3Rpb25FdmVudCgKKwkJCQkJc2VsZWN0ZWRQcm9wZXJ0eSwgdGhpcykpOworCQl9IC8vIGlmCisJfSAvLyBub3RpZnlQcm9wZXJ0eVNlbGVjdGlvbgorCisJLyoqCisJICogUmV0dXJuIGEgbGlzdCBvZiB7QGxpbmsgSXRlbVByb3BlcnR5RGVzY3JpcHRvcn1zIGZvciB0aGUgc3BlY2lmaWMKKwkgKiB7QGxpbmsgRGVjb3JhdG9yfS4KKwkgKiAKKwkgKiBAcGFyYW0gZGVjb3JhdG9yCisJICogICAgICAgICAgICBhIHtAbGluayBEZWNvcmF0b3J9IHRoYXQgbW9kaWZpZXMgdGhlIHN0YXRlIG9mIHRoZSBjYW5vbmljYWwKKwkgKiAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGh9IGluIHRoZQorCSAqICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259LgorCSAqIEByZXR1cm4gYSB7QGxpbmsgTGlzdH0gb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHtAbGluayBEZWNvcmF0b3J9IHRoYXQKKwkgKiAgICAgICAgIGNhbiBiZSBkaXNwbGF5ZWQuCisJICovCisJTGlzdDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0aWVzVG9EaXNwbGF5KAorCQkJZmluYWwgRGVjb3JhdG9yIGRlY29yYXRvcikgeworCQlmaW5hbCBMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yPigpOworCQkvLyBHb3QgRGVjb3JhdG9yPworCQlpZiAoZGVjb3JhdG9yICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJLy8gQXJlIHRoZXJlIGFueSBsYWJlbHMgdG8gdXBkYXRlPworCQkJaWYgKCFkZWNvcmF0b3IuZ2V0TGFiZWxzVG9VcGRhdGUoKS5pc0VtcHR5KCkpIHsKKwkJCQkvLyBZZXMKKwkJCQkvLyBUaGUgZmlyc3Qgb25lIGlzIGdvb2QgZW5vdWdoCisJCQkJcmV0VmFsdWUuYWRkQWxsKHByb3BlcnR5U2lldmUuc2lldmUoZGVjb3JhdG9yCisJCQkJCQkuZ2V0TGFiZWxzVG9VcGRhdGUoKS5nZXQoMCkpKTsKKwkJCX0gLy8gaWYgbGFiZWxzIHRvIHVwZGF0ZQorCQl9IC8vIGlmIGdvdCBkZWNvcmF0b3IKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0UHJvcGVydGllc1RvRGlzcGxheQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZWxlY3RlZCB7QGxpbmsgSXRlbVByb3BlcnR5RGVzY3JpcHRvcn0uCisJICogCisJICogQHJldHVybiB0aGUgcHJvcGVydHkgb2YgdGhlIGRlY29yYXRvciB0aGF0IHNob3VsZCBiZSB0aGUgb25lIHRvIGJlCisJICogICAgICAgICBkaXNwbGF5ZWQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgZGVjb3JhdG9yUHJvcGVydGllcyBpcyBlbXB0eQorCSAqLworCXB1YmxpYyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGdldERlZmF1bHRTZWxlY3RlZFByb3BlcnR5KCkgeworCQkvLyBMb29rIGZvciBhIHByb3BlcnR5IHdpdGggYSBuYW1lIHRoYXQgbWF0Y2hlcyB0aGUgb25lIHNwZWNpZmllZCBpbgorCQkvLyB0aGUgcHJlZmVyZW5jZXMuCisJCWZvciAoZmluYWwgSXRlbVByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSA6IHByb3BlcnRpZXMpIHsKKwkJCS8vIG5hbWUgbWF0Y2g/CisJCQlpZiAocHJvcGVydHkuZ2V0RGlzcGxheU5hbWUocHJvcGVydHkpLmVxdWFscyhpbml0aWFsUHJvcGVydHlOYW1lKSkgeworCQkJCS8vIFllcworCQkJCXJldHVybiBwcm9wZXJ0eTsKKwkJCX0gLy8gaWYKKwkJfSAvLyBmb3IgZWFjaCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCS8vIERpZG4ndCBmaW5kIGEgbWF0Y2gsIGp1c3QgdXNlIHRoZSBmaXJzdCBvbmUuCisJCS8vIEFueSB0byB1c2U/CisJCWlmICghcHJvcGVydGllcy5pc0VtcHR5KCkpIHsKKwkJCS8vIFllcworCQkJcmV0dXJuIHByb3BlcnRpZXMuZ2V0KDApOworCQl9IC8vIGlmCisJCXJldHVybiBudWxsOworCX0gLy8gc2VsZWN0Q3VycmVudERlY29yYXRvclByb3BlcnR5CisKKwkvKioKKwkgKiBJbml0aWFsaXplcyB0aGUge0BsaW5rIENvbXBvc2l0ZX0gd2l0aCB0aGUgc3BlY2lmaWMge0BsaW5rIERlY29yYXRvcn0uCisJICogCisJICogQHBhcmFtIGRlY29yYXRvcgorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBEZWNvcmF0b3J9IHRvIGluaXRpYWxpemUgd2l0aAorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoZmluYWwgRGVjb3JhdG9yIGRlY29yYXRvcikgeworCQlwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydGllc1RvRGlzcGxheShkZWNvcmF0b3IpOworCQlzZWxlY3RlZFByb3BlcnR5ID0gZ2V0RGVmYXVsdFNlbGVjdGVkUHJvcGVydHkoKTsKKwkJZmluYWwgYm9vbGVhbiBjb21ib0lzRW5hYmxlZCA9IChkZWNvcmF0b3IgIT0gbnVsbCA/IHRydWUgOiBmYWxzZSk7CisJCWluaXRpYWxpemVDb21ibyh0aGlzLnByb3BlcnRpZXNDb21ibywgZ2V0UHJvcGVydHlOYW1lcyhwcm9wZXJ0aWVzKSwKKwkJCQlnZXRQcm9wZXJ0eUluZGV4KHNlbGVjdGVkUHJvcGVydHksIHByb3BlcnRpZXMpLCBjb21ib0lzRW5hYmxlZCk7CisKKwkJLy8gbm90aWZ5UHJvcGVydHlTZWxlY3Rpb24oc2VsZWN0ZWRQcm9wZXJ0eSk7CisJCUNvbG9yUHJvdmlkZXJQcm9wZXJ0aWVzQ29tcG9zaXRlLnRoaXMKKwkJCQkubm90aWZ5UHJvcGVydHlTZWxlY3Rpb24oc2VsZWN0ZWRQcm9wZXJ0eSk7CisJfSAvLyBpbml0aWFsaXplCisKKwkvKioKKwkgKiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyB7QGxpbmsgQ29tYm99IGJveAorCSAqIAorCSAqIEBwYXJhbSBjb21ibworCSAqICAgICAgICAgICAgdGhlIHByb3BlcnRpZXMge0BsaW5rIENvbWJvfQorCSAqIEBwYXJhbSBuYW1lcworCSAqICAgICAgICAgICAgdGhlIHZhbHVlcyB0byBiZSBhZGRlZCB0byB0aGUge0BsaW5rIENvbWJvfQorCSAqIEBwYXJhbSBzZWxlY3Rpb25JbmRleAorCSAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0KKwkgKiBAcGFyYW0gaXNFbmFibGVkCisJICogICAgICAgICAgICBpcyB0aGUge0BsaW5rIENvbWJvfSBlbmFibGVkL2Rpc2FibGVkCisJICovCisJdm9pZCBpbml0aWFsaXplQ29tYm8oZmluYWwgQ29tYm8gY29tYm8sIGZpbmFsIFN0cmluZ1tdIG5hbWVzLAorCQkJZmluYWwgaW50IHNlbGVjdGlvbkluZGV4LCBmaW5hbCBib29sZWFuIGlzRW5hYmxlZCkgeworCQljb21iby5zZXRJdGVtcyhuYW1lcyk7CisJCWNvbWJvLnNlbGVjdChzZWxlY3Rpb25JbmRleCk7CisJCXByb3BlcnRpZXNDb21iby5zZXRFbmFibGVkKGlzRW5hYmxlZCk7CisJfSAvLyBpbml0aWFsaXplQ29tYm8KKworCS8qKgorCSAqIEdldCB0aGUgcHJvcGVydGllcyBuYW1lcy4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvcGVydGllcworCSAqICAgICAgICAgICAgYSBsaXN0IG9mIHtAbGluayBEZWNvcmF0b3J9IHByb3BlcnRpZXMuCisJICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIHByb3BlcnRpZXMuCisJICovCisJU3RyaW5nW10gZ2V0UHJvcGVydHlOYW1lcyhmaW5hbCBMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BlcnRpZXMpIHsKKwkJZmluYWwgTGlzdDxTdHJpbmc+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJZm9yIChmaW5hbCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5IDogcHJvcGVydGllcykgeworCQkJCXJldFZhbHVlLmFkZChwcm9wZXJ0eS5nZXREaXNwbGF5TmFtZShwcm9wZXJ0eSkpOworCQkJfSAvLyBmb3IgZWFjaCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCX0gLy8gaWYKKwkJcmV0dXJuIHJldFZhbHVlLnRvQXJyYXkobmV3IFN0cmluZ1tdIHt9KTsKKwl9IC8vIGdldFByb3BlcnR5TmFtZXMKKworCS8qKgorCSAqIEdldCB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIHByb3BlcnR5LgorCSAqIAorCSAqIEBwYXJhbSBzZWxlY3RlZERlY29yYXRvclByb3BlcnR5CisJICogICAgICAgICAgICB0aGUgc2VsZWN0ZWQgcHJvcGVydHkKKwkgKiBAcGFyYW0gZGVjb3JhdG9yUHJvcGVydGllcworCSAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgYWxsIHByb3BlcnRpZXMKKwkgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWREZWNvcmF0b3JQcm9wZXJ0eSBpbiB0aGUKKwkgKiAgICAgICAgIGRlY29yYXRvclByb3Blcml0ZXMgbGlzdCwgb3IgMCBpZiBzZWxlY3RlZERlY29yYXRvclByb3BlcnR5IGlzCisJICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCWludCBnZXRQcm9wZXJ0eUluZGV4KAorCQkJZmluYWwgSXRlbVByb3BlcnR5RGVzY3JpcHRvciBzZWxlY3RlZERlY29yYXRvclByb3BlcnR5LAorCQkJZmluYWwgTGlzdDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBkZWNvcmF0b3JQcm9wZXJ0aWVzKSB7CisJCWlmIChzZWxlY3RlZERlY29yYXRvclByb3BlcnR5ICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJcmV0dXJuIGRlY29yYXRvclByb3BlcnRpZXMuaW5kZXhPZihzZWxlY3RlZERlY29yYXRvclByb3BlcnR5KTsKKwkJfSAvLyBpZgorCQlyZXR1cm4gMDsKKwl9IC8vIGdldFByb3BlcnR5SW5kZXgKKworCS8qKgorCSAqIEFkZCBhIHtAbGluayBQcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyfSB0byB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMuCisJICogCisJICogQHBhcmFtIGxpc3RlbmVyCisJICogICAgICAgICAgICB0aGUge0BsaW5rIFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXJ9IHRvIGJlIGFkZGVkCisJICovCisJcHVibGljIHZvaWQgYWRkUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcigKKwkJCWZpbmFsIFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJcHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwl9IC8vIGFkZFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIKKworCS8qKgorCSAqIFJlbW92ZSB0aGUge0BsaW5rIFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXJ9IGZyb20gdGhlIGxpc3Qgb2YgbGlzdGVuZXJzLgorCSAqIAorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBQcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyfSB0byBiZSByZW1vdmVkCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcigKKwkJCWZpbmFsIFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJcHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9IC8vIHJlbW92ZVByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIKKworCS8qKgorCSAqIE5vdGlmeSB7QGxpbmsgUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcn1zIGFib3V0IGEKKwkgKiB7QGxpbmsgUHJvcGVydHlTZWxlY3Rpb25FdmVudH0uCisJICogCisJICogQHBhcmFtIHBzZQorCSAqICAgICAgICAgICAgdGhlIGV2ZW50IHRvIG5vdGlmeSBhYm91dAorCSAqLworCXByaXZhdGUgdm9pZCBmaXJlUHJvcGVydHlTZWxlY3Rpb25FdmVudChmaW5hbCBQcm9wZXJ0eVNlbGVjdGlvbkV2ZW50IHBzZSkgeworCQlmb3IgKGZpbmFsIFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiBwcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVycykgeworCQkJbGlzdGVuZXIucHJvcGVydHlTZWxlY3RlZChwc2UpOworCQl9IC8vIGZvciBlYWNoIFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIKKwl9IC8vIGZpcmVQcm9wZXJ0eVNlbGVjdGlvbkV2ZW50CisKKwkvKioKKwkgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgd2lzaCB0byBiZSBub3RpZmllZAorCSAqIHdoZW5ldmVyIGEgcHJvcGVydHkgaXMgc2VsZWN0ZWQgaW4gdGhpcyB3aWRnZXQuCisJICovCisJcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyIHsKKwkJLyoqCisJCSAqIEBwYXJhbSBwcm9wZXJ0eVNlbGVjdGlvbkV2ZW50CisJCSAqLworCQl2b2lkIHByb3BlcnR5U2VsZWN0ZWQoUHJvcGVydHlTZWxlY3Rpb25FdmVudCBwcm9wZXJ0eVNlbGVjdGlvbkV2ZW50KTsKKwl9IC8vIFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgZXZlbnQgb2YgYSBwcm9wZXJ0eSBiZWluZyBzZWxlY3RlZCBpbiB0aGUKKwkgKiB7QGxpbmsgV2lkZ2V0fS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFByb3BlcnR5U2VsZWN0aW9uRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7CisJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCQkvLyRBTkFMWVNJUy1JR05PUkUKKwkJcHJpdmF0ZSB0cmFuc2llbnQgZmluYWwgSXRlbVByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eTsKKworCQkvKioKKwkJICogQHBhcmFtIHByb3BlcnR5CisJCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHRoYXQgd2FzIHNlbGVjdGVkLgorCQkgKiBAcGFyYW0gc291cmNlCisJCSAqLworCQlwdWJsaWMgUHJvcGVydHlTZWxlY3Rpb25FdmVudChmaW5hbCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5LAorCQkJCWZpbmFsIE9iamVjdCBzb3VyY2UpIHsKKwkJCXN1cGVyKHNvdXJjZSk7CisJCQl0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisJCX0KKworCQkvKioKKwkJICogQHJldHVybiB0aGUgcHJvcGVydHkKKwkJICovCisJCXB1YmxpYyBmaW5hbCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5KCkgeworCQkJcmV0dXJuIHByb3BlcnR5OworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgamF2YS51dGlsLkV2ZW50T2JqZWN0I3RvU3RyaW5nKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQlzYi5hcHBlbmQocHJvcGVydHkgPT0gbnVsbCA/ICJudWxsIiA6IHByb3BlcnR5CisJCQkJCS5nZXREaXNwbGF5TmFtZShwcm9wZXJ0eSkpOworCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJCX0KKwl9IC8vIFByb3BlcnR5U2VsZWN0aW9uRXZlbnQKKworCS8vIC8qKgorCS8vICogVGhpcyBtZXRob2QgbWF5IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBhIHByb3BlcnRpZXMgY29tYm8gdG8gZGlzcGxheQorCS8vICogKHNlbGVjdCkgYSBwYXJ0aWN1bGFyIHByb3BlcnR5CisJLy8gKgorCS8vICogQHBhcmFtIHByZWZlcnJlZFByb3BlcnR5CisJLy8gKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZGlzcGxheS4KKwkvLyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcnJlZFByb3BlcnR5IHdhcyBmb3VuZCwKKwkvLyAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisJLy8gKi8KKwkvLyBwdWJsaWMgYm9vbGVhbiBzZXREaXNwbGF5ZWRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJlZmVycmVkUHJvcGVydHkpIHsKKwkvLyBmaW5hbCBpbnQgaW5kZXggPSBwcm9wZXJ0aWVzQ29tYm8uaW5kZXhPZihwcmVmZXJyZWRQcm9wZXJ0eSk7CisJLy8gaWYgKGluZGV4ID49IDApIHsKKwkvLyBwcm9wZXJ0aWVzQ29tYm8uc2VsZWN0KGluZGV4KTsKKwkvLyBpbml0aWFsUHJvcGVydHlOYW1lID0gcHJlZmVycmVkUHJvcGVydHk7CisJLy8gcHJvcGVydGllcyA9IGdldFByb3BlcnRpZXNUb0Rpc3BsYXkoc2VsZWN0ZWREZWNvcmF0b3IpOworCS8vIGZvciAoZmluYWwgSXRlbVByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSA6IHByb3BlcnRpZXMpIHsKKwkvLyAvLyBuYW1lIG1hdGNoPworCS8vIGlmIChwcm9wZXJ0eS5nZXREaXNwbGF5TmFtZShwcm9wZXJ0eSkuZXF1YWxzKAorCS8vIGluaXRpYWxQcm9wZXJ0eU5hbWUpKSB7CisJLy8gLy8gWWVzCisJLy8gc2VsZWN0ZWRQcm9wZXJ0eSA9IHByb3BlcnR5OworCS8vIGJyZWFrOworCS8vIH0gLy8gaWYKKwkvLyB9IC8vIGZvciBlYWNoIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKKwkvLyBmaXJlUHJvcGVydHlTZWxlY3Rpb25FdmVudChuZXcgUHJvcGVydHlTZWxlY3Rpb25FdmVudChzZWxlY3RlZFByb3BlcnR5LAorCS8vIHByb3BlcnRpZXNDb21ibykpOworCS8vIHJldHVybiB0cnVlOworCS8vIH0vLyBpZiBzZWxlY3RvciBoYXMgaXRlbXMKKwkvLyByZXR1cm4gZmFsc2U7CisJLy8gfS8vIHNldERpc3BsYXllZFByb3BwZXJ0eSgpCisJLy8JCisJLy8gcHVibGljIHZvaWQgc2V0U2VsZWN0ZWREZWNvcmF0b3IoZmluYWwgRGVjb3JhdG9yIGRlY29yYXRvcikgeworCS8vIHRoaXMuc2VsZWN0ZWREZWNvcmF0b3IgPSBkZWNvcmF0b3I7CisJLy8gcHJvcGVydGllcyA9IGdldFByb3BlcnRpZXNUb0Rpc3BsYXkoc2VsZWN0ZWREZWNvcmF0b3IpOworCS8vIHNlbGVjdGVkUHJvcGVydHkgPSBzZWxlY3RDdXJyZW50RGVjb3JhdG9yUHJvcGVydHkocHJvcGVydGllcyk7CisJLy8KKwkvLyBpbml0aWFsaXplQ29tYm8ocHJvcGVydGllc0NvbWJvLAorCS8vIGdldFByb3BlcnR5TmFtZXMocHJvcGVydGllcyksIGdldFByb3BlcnR5SW5kZXgoCisJLy8gc2VsZWN0ZWRQcm9wZXJ0eSwgcHJvcGVydGllcyksIHRydWUpOworCS8vCisJLy8gQ29sb3JQcm92aWRlclByb3BlcnRpZXNDb21wb3NpdGUudGhpcy5ub3RpZnlQcm9wZXJ0eVNlbGVjdGlvbihzZWxlY3RlZFByb3BlcnR5KTsKKwkvLyB9CisJLy8JCisJLy8gLyoqCisJLy8gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgZGV0ZXJtaW5lIGlmIGEKKwkvLyAqIHtAbGluayBEZWNvcmF0b3J9IG1lZXRzIHNvbWUgc3BlY2lmaWVkIGNyaXRlcmlhLgorCS8vICovCisJLy8gcHVibGljIGludGVyZmFjZSBEZWNvcmF0b3JGaWx0ZXIgeworCS8vIC8qKgorCS8vICogQHBhcmFtIGRlY29yYXRvcgorCS8vICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUge0BsaW5rIERlY29yYXRvcn0gaXMgYWNjZXB0YWJsZS4KKwkvLyAqLworCS8vIGJvb2xlYW4gYWNjZXB0KGZpbmFsIERlY29yYXRvciBkZWNvcmF0b3IpOworCS8vIH0gLy8gRGVjb3JhdG9yRmlsdGVyCisJLy8KKwkvKioKKwkgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgc2VsZWN0IG91dCB0aGUgcHJvcGVydGllcworCSAqIHRvIGJlIGRpc3BsYXllZC4KKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5U2lldmUgeworCQkvKioKKwkJICogQHBhcmFtIGR5bmFtaWNMYWJlbAorCQkgKiAgICAgICAgICAgIHRoZSBsYWJlbCB0aGF0IGNvbnRhaW5zIHRoZSBjYW5kaWRhdGUgcHJvcGVydGllcyB0byBiZQorCQkgKiAgICAgICAgICAgIGRpc3BsYXllZC4KKwkJICogQHJldHVybiBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHRoZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlCisJCSAqICAgICAgICAgZGlzcGxheWVkIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgc2hvdWxkIGJlIGRpc3BsYXllZC4KKwkJICovCisJCUxpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gc2lldmUoZmluYWwgRHluYW1pY0xhYmVsIGR5bmFtaWNMYWJlbCk7CisJfSAvLyBQcm9wZXJ0eVNpZXZlCisKKwkvKioKKwkgKiBAcGFyYW0gcHJvcGVydHlTaWV2ZQorCSAqICAgICAgICAgICAgdGhlIHNpZXZlIHRoYXQgc2VsZWN0cyB0aGUgcHJvcGVydGllcyBvZiBhIHtAbGluayBEZWNvcmF0b3J9CisJICogICAgICAgICAgICB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQuCisJICovCisJcHVibGljIHZvaWQgc2V0UHJvcGVydHlTaWV2ZShmaW5hbCBQcm9wZXJ0eVNpZXZlIHByb3BlcnR5U2lldmUpIHsKKwkJdGhpcy5wcm9wZXJ0eVNpZXZlID0gcHJvcGVydHlTaWV2ZTsKKwl9IC8vIHNldFByb3BlcnR5U2lldmUKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHNpZXZlIHNlbGVjdHMgdGhvc2UgcHJvcGVydGllcyB0aGF0IGhhdmUgcmVsYXRpdmUgdmFsdWVzLgorCSAqLworCXByaXZhdGUgUHJvcGVydHlTaWV2ZSBwcm9wZXJ0eVNpZXZlID0gbmV3IFByb3BlcnR5U2lldmUoKSB7CisJCS8qKgorCQkgKiBAc2VlIENvbG9yUHJvdmlkZXJQcm9wZXJ0aWVzQ29tcG9zaXRlLlByb3BlcnR5U2lldmUjc2lldmUob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbCkKKwkJICovCisJCXB1YmxpYyBMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHNpZXZlKAorCQkJCWZpbmFsIER5bmFtaWNMYWJlbCBkeW5hbWljTGFiZWwpIHsKKwkJCWZpbmFsIExpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcmV0VmFsdWUgPSBuZXcgQXJyYXlMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+KCk7CisJCQlmaW5hbCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyIHJ2cCA9IChSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyKSBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkuYWRhcHQoZHluYW1pY0xhYmVsLCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIuY2xhc3MpOworCisJCQkvLyBEb2VzIHRoZSBsYWJlbCBoYXZlIHJlbGF0aXZlIHZhbHVlcz8KKwkJCWlmIChydnAgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCXJ2cC5zZXRUYXJnZXQoZHluYW1pY0xhYmVsKTsKKworCQkJCWZvciAoZmluYWwgT2JqZWN0IGVsZW1lbnQgOiBydnAuZ2V0UHJvcGVydGllcygpKSB7CisJCQkJCWZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkgPSAoSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgZWxlbWVudDsKKwkJCQkJcmV0VmFsdWUuYWRkKHByb3BlcnR5KTsKKwkJCQl9IC8vIGZvciBlYWNoIHByb3BlcnR5CisJCQl9IC8vIGlmIHRoZSBsYWJlbCBoYXMgcmVsYXRpdmUgdmFsdWVzCisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gc2lldmUKKwl9OworCisJLyoqCisJICogVGhlIG1ldGhvZCByZXR1cm5zIHRoZSBpbml0aWFsIHByb3BlcnR5IHRvIGJlIHNlbGVjdGVkCisJICogQHJldHVybiB0aGUgaW5pdGlhbFByb3BlcnR5TmFtZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbFByb3BlcnR5TmFtZSgpIHsKKwkJcmV0dXJuIGluaXRpYWxQcm9wZXJ0eU5hbWU7CisJfSAvLyBnZXRJbml0aWFsUHJvcGVydHlOYW1lCisKKwkvKioKKwkgKiBUaGUgbWV0aG9kIHNldHMgdGhlIGluaXRpYWwgcHJvcGVydHkgdG8gYmUgc2VsZWN0ZWQKKwkgKiBAcGFyYW0gaW5pdGlhbFByb3BlcnR5TmFtZSB0aGUgaW5pdGlhbFByb3BlcnR5TmFtZSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbml0aWFsUHJvcGVydHlOYW1lKFN0cmluZyBpbml0aWFsUHJvcGVydHlOYW1lKSB7CisJCXRoaXMuaW5pdGlhbFByb3BlcnR5TmFtZSA9IGluaXRpYWxQcm9wZXJ0eU5hbWU7CisJfSAvLyBzZXRJbml0aWFsUHJvcGVydHlOYW1lCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzZWxlY3RlZFByb3BlcnR5CisJICovCisJcHVibGljIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZ2V0U2VsZWN0ZWRQcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIHNlbGVjdGVkUHJvcGVydHk7CisJfQorCit9IC8vIENvbG9yUHJvdmlkZXJQcm9wZXJ0aWVzQ29tcG9zaXRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpZGdldHMvRGVjb3JhdG9yU2VsZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2lkZ2V0cy9EZWNvcmF0b3JTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNDc0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpZGdldHMvRGVjb3JhdG9yU2VsZWN0b3IuamF2YQpAQCAtMCwwICsxLDU0NCBAQAorLy8gUHJvcGVydHlTZWxlY3Rvci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2lkZ2V0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnBvcHVsYXRpb24uUG9wdWxhdGlvbkVudW1lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5wb3B1bGF0aW9uLlBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnBvcHVsYXRpb24uUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBjb21wb3VuZCBTV1Qgd2lkZ2V0IHRoYXQgYWxsb3dzIGZvciB0aGUgc2VsZWN0aW9uIG9mIGEKKyAqIHByb3BlcnR5IG9yIHByb3BlcnRpZXMgb2Ygb25lIG9yIG1vcmUge0BsaW5rIERlY29yYXRvcn1zLgorICovCitwdWJsaWMgY2xhc3MgRGVjb3JhdG9yU2VsZWN0b3IgZXh0ZW5kcyBDb21wb3NpdGUgeworCisJcHJpdmF0ZSBmaW5hbCBMaXN0PERlY29yYXRvclNlbGVjdGlvbkxpc3RlbmVyPiBwcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVycyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxEZWNvcmF0b3JTZWxlY3Rpb25MaXN0ZW5lcj4oKTsKKworCXByaXZhdGUgSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IG51bGw7CisKKworCXByaXZhdGUgZmluYWwgTGFiZWwgZGlzcGxheUxhYmVsOworCisJQ29tYm8gZGVjb3JhdG9yc0NvbWJvOworCisJQ29tYm8gcG9wdWxhdGlvbklkQ29tYm87CisKKwlMaXN0PERlY29yYXRvcj4gZGVjb3JhdG9yczsKKworCURlY29yYXRvciBzZWxlY3RlZERlY29yYXRvcjsKKworCVN0cmluZyBzZWxlY3RlZFByb3BlcnR5OworCisJU3RyaW5nIFtdIHBvcElkczsKKwkKKwlwcml2YXRlIERlY29yYXRvckZpbHRlciBkZWNvcmF0b3JGaWx0ZXIgPSBuZXcgRGVjb3JhdG9yRmlsdGVyKCkgeworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuUHJvcGVydHlTZWxlY3Rvci5EZWNvcmF0b3JGaWx0ZXIjYWNjZXB0KG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IpCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCURlY29yYXRvciBkZWNvcmF0b3IpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHNpZXZlIHNlbGVjdHMgdGhvc2UgcHJvcGVydGllcyB0aGF0IGhhdmUgcmVsYXRpdmUgdmFsdWVzLgorCSAqLworCXByaXZhdGUgUHJvcGVydHlTaWV2ZSBwcm9wZXJ0eVNpZXZlID0gbmV3IFByb3BlcnR5U2lldmUoKSB7CisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2lkZ2V0cy5Qcm9wZXJ0eVNlbGVjdG9yLlByb3BlcnR5U2lldmUjc2lldmUob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbCkKKwkJICovCisJCXB1YmxpYyBMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHNpZXZlKER5bmFtaWNMYWJlbCBkeW5hbWljTGFiZWwpIHsKKwkJCWZpbmFsIExpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcmV0VmFsdWUgPSBuZXcgQXJyYXlMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+KCk7CisJCQlmaW5hbCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyIHJ2cCA9IChSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyKSBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkuYWRhcHQoZHluYW1pY0xhYmVsLCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIuY2xhc3MpOworCisJCQkvLyBEb2VzIHRoZSBsYWJlbCBoYXZlIHJlbGF0aXZlIHZhbHVlcz8KKwkJCWlmIChydnAgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCXJ2cC5zZXRUYXJnZXQoZHluYW1pY0xhYmVsKTsKKworCQkJCWZvciAoZmluYWwgT2JqZWN0IGVsZW1lbnQgOiBydnAuZ2V0UHJvcGVydGllcygpKSB7CisJCQkJCWZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkgPSAoSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgZWxlbWVudDsKKwkJCQkJcmV0VmFsdWUuYWRkKHByb3BlcnR5KTsKKwkJCQl9IC8vIGZvciBlYWNoIHByb3BlcnR5CisJCQl9IC8vIGlmIHRoZSBsYWJlbCBoYXMgcmVsYXRpdmUgdmFsdWVzCisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gc2lldmUKKwl9OworCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqLworCXB1YmxpYyBEZWNvcmF0b3JTZWxlY3RvcihmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBpbnQgc3R5bGUsIGJvb2xlYW4gYWxsb3dEZWNvcmF0b3JTZWxlY3Rpb24pIHsKKwkJc3VwZXIocGFyZW50LCBzdHlsZSk7CisJCWZpbmFsIEZvcm1MYXlvdXQgcmV0VmFsdWVMYXlvdXQgPSBuZXcgRm9ybUxheW91dCgpOworCQl0aGlzLnNldExheW91dChyZXRWYWx1ZUxheW91dCk7CisKKwkJZGlzcGxheUxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5DRU5URVIpOworCQlkaXNwbGF5TGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIklNVmlldy5NUHJvcCIpICsgIiA6Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCS8vIENvbWJvIEJveCBvZiBEZWNvcmF0b3JzCisJCWRlY29yYXRvcnNDb21ibyA9IG5ldyBDb21ibyh0aGlzLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWQorCQkJCXwgU1dULkNFTlRFUik7CisKKwkJLy8gQ29tYm8gQm94IG9mIHRoZSBEZWNvcmF0b3IgUHJvcGVydGllcworCQlwb3B1bGF0aW9uSWRDb21ibyA9IG5ldyBDb21ibyh0aGlzLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWQorCQkJCXwgU1dULkNFTlRFUik7CisKKwkJZmluYWwgRm9ybURhdGEgZGVjb3JhdG9yc0NvbWJvRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJZGVjb3JhdG9yc0NvbWJvRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGRpc3BsYXlMYWJlbCwgMCk7CisJCWRlY29yYXRvcnNDb21ib0Zvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWRlY29yYXRvcnNDb21ib0Zvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCWRlY29yYXRvcnNDb21iby5zZXRMYXlvdXREYXRhKGRlY29yYXRvcnNDb21ib0Zvcm1EYXRhKTsKKworCQlmaW5hbCBGb3JtRGF0YSBwb3B1bGF0aW9uSWRDb21ib0RhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJcG9wdWxhdGlvbklkQ29tYm9EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChkZWNvcmF0b3JzQ29tYm8sIDApOworCQlwb3B1bGF0aW9uSWRDb21ib0RhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJcG9wdWxhdGlvbklkQ29tYm9EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCXBvcHVsYXRpb25JZENvbWJvLnNldExheW91dERhdGEocG9wdWxhdGlvbklkQ29tYm9EYXRhKTsKKworCQl0aGlzLnBhY2soKTsKKworCQlkZWNvcmF0b3JzQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQkJZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCS8vIEFueSBkZWNvcmF0b3JzPworCQkJCWlmICghZGVjb3JhdG9ycy5pc0VtcHR5KCkpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWZpbmFsIERlY29yYXRvciB0ZW1wRGVjb3JhdG9yID0gZGVjb3JhdG9ycworCQkJCQkJCS5nZXQoZGVjb3JhdG9yc0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOworCQkJCQkvLyBXYXMgdGhlcmUgYSBjaGFuZ2UgaW4gc2VsZWN0ZWQgRGVjb3JhdG9ycz8KKwkJCQkJaWYgKHNlbGVjdGVkRGVjb3JhdG9yICE9IHRlbXBEZWNvcmF0b3IpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJc2VsZWN0ZWREZWNvcmF0b3IgPSB0ZW1wRGVjb3JhdG9yOworCisJCQkJCQlwb3BJZHMgPSBnZXRQb3B1bGF0aW9uSWRzVG9EaXNwbGF5KHNlbGVjdGVkRGVjb3JhdG9yKTsKKwkJCQkJCWluaXRpYWxpemVDb21ibyhwb3B1bGF0aW9uSWRDb21ibywKKwkJCQkJCQkJcG9wSWRzLCAwKTsKKworCQkJCQkJRGVjb3JhdG9yU2VsZWN0b3IudGhpcworCQkJCQkJCQkubm90aWZ5RGVjb3JhdG9yU2VsZWN0aW9uKHNlbGVjdGVkUHJvcGVydHkpOworCQkJCQl9IC8vIGlmIERlY29yYXRvcnMgY2hhbmdlZAorCisJCQkJfSAvLyBpZiBhbnkgZGVjb3JhdG9ycworCQkJfQorCQl9IC8vIFNlbGVjdGlvbkFkYXB0ZXIKKwkJKTsKKworCQlwb3B1bGF0aW9uSWRDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQlmaW5hbCBTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJLy8gQW55IERlY29yYXRvciBwcm9wZXJ0aWVzPworCQkJCWlmICghKHBvcElkcyA9PSBudWxsKSkgeworCQkJCQkvLyBZZXMKKwkJCQkJLy8gSXMgaXQgZGlmZmVyZW50PworCQkJCQlmaW5hbCBTdHJpbmcgdGVtcCA9IHBvcElkc1twb3B1bGF0aW9uSWRDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpXTsKKwkJCQkJaWYgKCFzZWxlY3RlZFByb3BlcnR5LmVxdWFscyh0ZW1wKSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQlzZWxlY3RlZFByb3BlcnR5ID0gdGVtcDsKKwkJCQkJCURlY29yYXRvclNlbGVjdG9yLnRoaXMKKwkJCQkJCQkJLm5vdGlmeURlY29yYXRvclNlbGVjdGlvbihzZWxlY3RlZFByb3BlcnR5KTsKKwkJCQkJfSAvLyBpZgorCisJCQkJfSAvLyBpZgorCQkJfSAvLyB3aWRnZXRTZWxlY3RlZAorCisJCX0gLy8gU2VsZWN0aW9uQWRhcHRlcgorCQkJCSk7CisJCWlmKCFhbGxvd0RlY29yYXRvclNlbGVjdGlvbilwb3B1bGF0aW9uSWRDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKKwkJc2V0U2ltdWxhdGlvbihudWxsKTsKKwl9IC8vIFByb3BlcnR5U2VsZWN0b3IKKworCXZvaWQgbm90aWZ5RGVjb3JhdG9yU2VsZWN0aW9uKGZpbmFsIFN0cmluZyBzZWxlY3RlZElkKSB7CisJCS8vIElzIHRoZXJlIGEgcHJvcGVydHk/CisJCWlmIChzZWxlY3RlZFByb3BlcnR5ICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJZmlyZURlY29yYXRvclNlbGVjdGlvbkV2ZW50KG5ldyBEZWNvcmF0b3JTZWxlY3Rpb25FdmVudCgKKwkJCQkJc2VsZWN0ZWREZWNvcmF0b3IsIHNlbGVjdGVkSWQsIHRoaXMpKTsKKwkJfSAvLyBpZgorCX0gLy8gbm90aWZ5RGVjb3JhdG9yU2VsZWN0aW9uCisKKwkvKioKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250cm9sIGhhcyBiZWVuIGluaXRpYWxpemVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7CisJCXJldHVybiAhKGRlY29yYXRvcnMgPT0gbnVsbCB8fCBkZWNvcmF0b3JzLmlzRW1wdHkoKSk7CisJfSAvLyBpc0luaXRpYWxpemVkCisKKwkvKioKKwkgKiBAcGFyYW0gZGVjb3JhdG9ycworCSAqLworCXB1YmxpYyB2b2lkIHNldERlY29yYXRvcnMoZmluYWwgTGlzdDxEZWNvcmF0b3I+IGRlY29yYXRvcnMpIHsKKwkJdGhpcy5kZWNvcmF0b3JzID0gZGVjb3JhdG9yczsKKwkJc2VsZWN0ZWREZWNvcmF0b3IgPSBkZWNvcmF0b3JzLmlzRW1wdHkoKSA/IG51bGwgOiBkZWNvcmF0b3JzLmdldCgwKTsKKwkJcG9wSWRzID0gZ2V0UG9wdWxhdGlvbklkc1RvRGlzcGxheShzZWxlY3RlZERlY29yYXRvcik7CisJCWlmKHBvcElkcyA9PSBudWxsKXBvcElkcyA9IG5ldyBTdHJpbmdbMF07CisJCXNlbGVjdGVkUHJvcGVydHkgPSAocG9wSWRzLmxlbmd0aD09MCk/ICIiOnBvcElkc1swXTsgLy8gcGljayB0aGUgZmlyc3Qgb25lCisKKwkJaW5pdGlhbGl6ZUNvbWJvKGRlY29yYXRvcnNDb21ibywgZ2V0RGVjb3JhdG9yTmFtZXMoZGVjb3JhdG9ycyksCisJCQkJZ2V0RGVjb3JhdG9ySW5kZXgoc2VsZWN0ZWREZWNvcmF0b3IsIGRlY29yYXRvcnMpKTsKKworCQlpbml0aWFsaXplQ29tYm8ocG9wdWxhdGlvbklkQ29tYm8sIHBvcElkcywKKwkJCQkwKTsKKworCQlub3RpZnlEZWNvcmF0b3JTZWxlY3Rpb24oc2VsZWN0ZWRQcm9wZXJ0eSk7CisJfSAvLyBzZXREZWNvcmF0b3JzCisKKwkvKioKKwkgKiBJbml0aWFsaXplIHRoZSBjb250cm9sIGZyb20gYQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9ufSBpbnN0YW5jZS4KKwkgKiAKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbgorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9ufQorCSAqLworCXB1YmxpYyB2b2lkIHNldFNpbXVsYXRpb24oZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbikgeworCQl0aGlzLnNpbXVsYXRpb24gPSBzaW11bGF0aW9uOworCQlzZXREZWNvcmF0b3JzKGdldERlY29yYXRvcnNUb0Rpc3BsYXkoc2ltdWxhdGlvbikpOworCX0gLy8gc2V0U2ltdWxhdGlvbgorCisJLyoqCisJICogQHJldHVybiB0aGUgc2ltdWxhdGlvbgorCSAqLworCXB1YmxpYyBmaW5hbCBJU2ltdWxhdGlvbiBnZXRTaW11bGF0aW9uKCkgeworCQlyZXR1cm4gc2ltdWxhdGlvbjsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZGVjb3JhdG9yRmlsdGVyCisJICogICAgICAgICAgICB0aGUgZmlsdGVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCB7QGxpbmsgRGVjb3JhdG9yfXMgd2lsbCBiZQorCSAqICAgICAgICAgICAgZGlzcGxheWVkLgorCSAqLworCXB1YmxpYyB2b2lkIHNldERlY29yYXRvckZpbHRlcihmaW5hbCBEZWNvcmF0b3JGaWx0ZXIgZGVjb3JhdG9yRmlsdGVyKSB7CisJCXRoaXMuZGVjb3JhdG9yRmlsdGVyID0gZGVjb3JhdG9yRmlsdGVyOworCX0gLy8gc2V0RGVjb3JhdG9yRmlsdGVyCisKKworCS8qKgorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogICAgICAgICAgICB0aGUgc2ltdWxhdGlvbiB0aGF0IGNvbnRhaW5zIHtAbGluayBEZWNvcmF0b3J9cworCSAqIEByZXR1cm4gYSB7QGxpbmsgTGlzdH0gb2YgdGhlIHtAbGluayBEZWNvcmF0b3J9cyB3aG9zZSBwcm9wZXJ0aWVzCisJICovCisJcHJpdmF0ZSBMaXN0PERlY29yYXRvcj4gZ2V0RGVjb3JhdG9yc1RvRGlzcGxheShmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uKSB7CisJCWZpbmFsIExpc3Q8RGVjb3JhdG9yPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8RGVjb3JhdG9yPigpOworCisJCS8vIEdvdCBTaW11bGF0aW9uPworCQlpZiAoc2ltdWxhdGlvbiAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIEdyYXBoIGNhbm9uaWNhbEdyYXBoID0gc2ltdWxhdGlvbi5nZXRTY2VuYXJpbygpCisJCQkJCS5nZXRDYW5vbmljYWxHcmFwaCgpOworCQkJLy8gSXMgdGhlIGNhbm9uaWNhbEdyYXBoIGluaXRpYWxpemVkIHlldD8KKwkJCWlmIChjYW5vbmljYWxHcmFwaCAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJLy8gR28gdGhyb3VnaCB0aGUgRGVjb3JhdG9ycyBrZWVwaW5nIHRoZSBvbmVzIHRoYXQgdGhlIGZpbHRlcgorCQkJCS8vIHNheXMgYXJlIG9rLgorCQkJCWZvciAoZmluYWwgT2JqZWN0IGVsZW1lbnQgOiBjYW5vbmljYWxHcmFwaC5nZXREZWNvcmF0b3JzKCkpIHsKKwkJCQkJZmluYWwgRGVjb3JhdG9yIGRlY29yYXRvciA9IChEZWNvcmF0b3IpIGVsZW1lbnQ7CisJCQkJCS8vIEFjY2VwdGFibGU/CisJCQkJCWlmIChkZWNvcmF0b3JGaWx0ZXIuYWNjZXB0KGRlY29yYXRvcikpIHsKKwkJCQkJCXJldFZhbHVlLmFkZChkZWNvcmF0b3IpOworCQkJCQl9IC8vIGlmIGhhcyBhIHRpdGxlCisJCQkJfSAvLyBmb3IgZWFjaCBkZWNvcmF0b3IKKwkJCX0gLy8gaWYgZ290IGdyYXBoCisJCX0gLy8gaWYgZ290IHNpbXVsYXRpb24KKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gZ2V0RGVjb3JhdG9yc1RvRGlzcGxheQorCisJLyoqCisJICogQHBhcmFtIGRlY29yYXRvcgorCSAqICAgICAgICAgICAgYSB7QGxpbmsgRGVjb3JhdG9yfSB0aGF0IG1vZGlmaWVzIHRoZSBzdGF0ZSBvZiB0aGUgY2Fub25pY2FsCisJICogICAgICAgICAgICB7QGxpbmsgR3JhcGh9IGluIHRoZQorCSAqICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259LgorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogICAgICAgICAgICB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259CisJICogQHJldHVybiBhIHtAbGluayBMaXN0fSBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUge0BsaW5rIERlY29yYXRvcn0gdGhhdAorCSAqICAgICAgICAgY2FuIHNob3VsZCBiZSBkaXNwbGF5ZWQuCisJICovCisJU3RyaW5nIFtdIGdldFBvcHVsYXRpb25JZHNUb0Rpc3BsYXkoCisJCQlmaW5hbCBEZWNvcmF0b3IgZGVjb3JhdG9yKSB7CisJCWlmKGRlY29yYXRvciA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyIHBlYSA9IChQb3B1bGF0aW9uRW51bWVyYXRvckFkYXB0ZXIpUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChkZWNvcmF0b3IsIFBvcHVsYXRpb25FbnVtZXJhdG9yLmNsYXNzKTsKKwkJCisJCWlmKHBlYSAhPSBudWxsKSAKKwkJCXJldHVybiBwZWEuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXJzKCk7CisJCQorCQlpZihkZWNvcmF0b3IgaW5zdGFuY2VvZiBEaXNlYXNlTW9kZWwpIHsKKwkJCVN0cmluZyBbXSByZXMgPSBuZXcgU3RyaW5nWzFdOworCQkJcmVzWzBdPSAoKERpc2Vhc2VNb2RlbClkZWNvcmF0b3IpLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCk7CisJCQlyZXR1cm4gcmVzOworCQl9CisJCWlmKGRlY29yYXRvciBpbnN0YW5jZW9mIFBvcHVsYXRpb25Nb2RlbCkgeworCQkJU3RyaW5nIFtdIHJlcyA9IG5ldyBTdHJpbmdbMV07CisJCQlyZXNbMF09ICgoUG9wdWxhdGlvbk1vZGVsKWRlY29yYXRvcikuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKwkJCXJldHVybiByZXM7CisJCX0KKwkJcmV0dXJuIG51bGw7IC8vIG5vbmUgZm91bmQKKwl9IC8vIGdldFBvcHVsYXRpb25JZHNUb0Rpc3BsYXkKKworCS8vIC8qKgorCS8vICogQHBhcmFtIGRlY29yYXRvcnMKKwkvLyAqIHRoZSB7QGxpbmsgRGVjb3JhdG9yc30gaW4gdGhlIHNpbXVsYXRpb24gdGhhdCB3aG9zZSBzdGF0ZQorCS8vICogdmFsdWVzIGNhbiBiZSB2aXN1YWxpemVkLgorCS8vICogQHJldHVybiBvbmUgb2YgdGhlIHtAbGluayBEZWNvcmF0b3JzfQorCS8vICovCisJLy8gcHJpdmF0ZSBEZWNvcmF0b3Igc2VsZWN0Q3VycmVudERlY29yYXRvcihmaW5hbCBMaXN0PERlY29yYXRvcj4KKwkvLyBkZWNvcmF0b3JzKSB7CisJLy8gcmV0dXJuIGRlY29yYXRvcnMuZ2V0KDApOworCS8vIH0gLy8gc2VsZWN0Q3VycmVudERlY29yYXRvcgorCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgRGVjb3JhdG9yfSBzZWxlY3RlZCBpbiB0aGUgY29udHJvbCwgb3IKKwkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG9uZSBpcyBub3QgY3VycmVudGx5IHNlbGVjdGVkLgorCSAqLworCS8vIHB1YmxpYyBEZWNvcmF0b3IgZ2V0U2VsZWN0ZWREZWNvcmF0b3IoKSB7CisJLy8gcmV0dXJuIHNlbGVjdGVkRGVjb3JhdG9yOworCS8vIH0gLy8gZ2V0U2VsZWN0ZWREZWNvcmF0b3IKKwkvLworCS8vIC8qKgorCS8vICogQHJldHVybiB0aGUge0BsaW5rIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3J9IHNlbGVjdGVkIGluIHRoZSBjb250cm9sLCBvcgorCS8vICogPGNvZGU+bnVsbDwvY29kZT4gaWYgb25lIGlzIG5vdCBjdXJyZW50bHkgc2VsZWN0ZWQuCisJLy8gKi8KKwkvLyBwdWJsaWMgSXRlbVByb3BlcnR5RGVzY3JpcHRvciBnZXRTZWxlY3RlZFByb3BlcnR5KCkgeworCS8vIHJldHVybiBzZWxlY3RlZERlY29yYXRvclByb3BlcnR5OworCS8vIH0gLy8gZ2V0U2VsZWN0ZWRQcm9wZXJ0eQorCS8vCisJLy8gLyoqCisJLy8gKiBAcmV0dXJuIGEgZGlzcGxheSBuYW1lIG9mIHRoZSBzZWxlY3RlZCBwcm9wZXJ0eS4gVGhpcyBpcyB0aGUga2V5IHRvIHRoZQorCS8vICogc2VsZWN0ZWQgcmVsYXRpdmUgVmFsdWUKKwkvLyAqCisJLy8gKi8KKwkvLyBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGVkUHJvcGVydHlTdHJpbmcoKSB7CisJLy8gU3RyaW5nIHJldFZhbCA9ICJubyBwcm9wZXJ0eSBzZWxlY3RlZCI7CisJLy8gaWYgKHNlbGVjdGVkRGVjb3JhdG9yUHJvcGVydHkgIT0gbnVsbCkgeworCS8vIHJldFZhbCA9IHNlbGVjdGVkRGVjb3JhdG9yUHJvcGVydHkKKwkvLyAuZ2V0RGlzcGxheU5hbWUoc2VsZWN0ZWREZWNvcmF0b3JQcm9wZXJ0eSk7CisJLy8gfQorCS8vIHJldHVybiByZXRWYWw7CisJLy8gfSAvLyBnZXRTZWxlY3RlZFByb3BlcnR5CisJLyoqCisJICogQHBhcmFtIGNvbWJvCisJICogQHBhcmFtIG5hbWVzCisJICogQHBhcmFtIHNlbGVjdGlvbkluZGV4CisJICovCisJdm9pZCBpbml0aWFsaXplQ29tYm8oZmluYWwgQ29tYm8gY29tYm8sIGZpbmFsIFN0cmluZ1tdIG5hbWVzLAorCQkJZmluYWwgaW50IHNlbGVjdGlvbkluZGV4KSB7CisJCWNvbWJvLnNldEl0ZW1zKG5hbWVzKTsKKwkJY29tYm8uc2VsZWN0KHNlbGVjdGlvbkluZGV4KTsKKwl9IC8vIGluaXRpYWxpemVDb21ibworCisJLyoqCisJICogQHBhcmFtIGRlY29yYXRvcnMKKwkgKiAgICAgICAgICAgIGEgbGlzdCBvZiB7QGxpbmsgRGVjb3JhdG9yfXMKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBuYW1lcyBvZiB0aGUge0BsaW5rIERlY29yYXRvcnN9LgorCSAqLworCXByaXZhdGUgU3RyaW5nW10gZ2V0RGVjb3JhdG9yTmFtZXMoZmluYWwgTGlzdDxEZWNvcmF0b3I+IGRlY29yYXRvcnMpIHsKKwkJZmluYWwgTGlzdDxTdHJpbmc+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWlmIChkZWNvcmF0b3JzICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJZm9yIChmaW5hbCBEZWNvcmF0b3IgZGVjb3JhdG9yIDogZGVjb3JhdG9ycykgeworCQkJCXJldFZhbHVlLmFkZChkZWNvcmF0b3IuZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCkpOworCQkJfSAvLyBmb3IgZWFjaCBkZWNvcmF0b3IKKwkJfSAvLyBpZgorCQlyZXR1cm4gcmV0VmFsdWUudG9BcnJheShuZXcgU3RyaW5nW10ge30pOworCX0gLy8gZ2V0RGVjb3JhdG9yTmFtZXMKKworCS8qKgorCSAqIEBwYXJhbSBzZWxlY3RlZERlY29yYXRvcgorCSAqIEBwYXJhbSBkZWNvcmF0b3JzCisJICogICAgICAgICAgICBhIGxpc3Qgb2Yge0BsaW5rIERlY29yYXRvcn1zLgorCSAqIEByZXR1cm4gdGhlIHBvc2l0aW9uICgwIG9yaWdpbikgb2YgdGhlIHNlbGVjdGVkRGVjb3JhdG9yIGluIGRlY29yYXRvcnMsCisJICogICAgICAgICBvciAwLCBpZiB0aGUgZGVjb3JhdG9ycyBsaXN0IGlzIGVtcHR5LgorCSAqLworCXByaXZhdGUgaW50IGdldERlY29yYXRvckluZGV4KGZpbmFsIERlY29yYXRvciBzZWxlY3RlZERlY29yYXRvciwKKwkJCWZpbmFsIExpc3Q8RGVjb3JhdG9yPiBkZWNvcmF0b3JzKSB7CisJCWlmIChzZWxlY3RlZERlY29yYXRvciAhPSBudWxsICYmIGRlY29yYXRvcnMgIT0gbnVsbAorCQkJCSYmICFkZWNvcmF0b3JzLmlzRW1wdHkoKSkgeworCQkJLy8gWWVzCisJCQlyZXR1cm4gZGVjb3JhdG9ycy5pbmRleE9mKHNlbGVjdGVkRGVjb3JhdG9yKTsKKwkJfSAvLyBpZgorCQlyZXR1cm4gMDsKKwl9IC8vIGdldERlY29yYXRvckluZGV4CisKKwkvKioKKwkgKiBAcGFyYW0gc2VsZWN0ZWREZWNvcmF0b3JQcm9wZXJ0eQorCSAqIEBwYXJhbSBkZWNvcmF0b3JQcm9wZXJ0aWVzCisJICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkRGVjb3JhdG9yUHJvcGVydHkgaW4gdGhlCisJICogICAgICAgICBkZWNvcmF0b3JQcm9wZXJpdGVzIGxpc3QsIG9yIDAgaWYgc2VsZWN0ZWREZWNvcmF0b3JQcm9wZXJ0eSBpcworCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlpbnQgZ2V0UHJvcGVydHlJbmRleCgKKwkJCWZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3Igc2VsZWN0ZWREZWNvcmF0b3JQcm9wZXJ0eSwKKwkJCWZpbmFsIExpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZGVjb3JhdG9yUHJvcGVydGllcykgeworCQlpZiAoc2VsZWN0ZWREZWNvcmF0b3JQcm9wZXJ0eSAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXJldHVybiBkZWNvcmF0b3JQcm9wZXJ0aWVzLmluZGV4T2Yoc2VsZWN0ZWREZWNvcmF0b3JQcm9wZXJ0eSk7CisJCX0gLy8gaWYKKwkJcmV0dXJuIDA7CisJfSAvLyBnZXRQcm9wZXJ0eUluZGV4CisKKwkKKwkvKioKKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGREZWNvcmF0b3JTZWxlY3Rpb25MaXN0ZW5lcigKKwkJCWZpbmFsIERlY29yYXRvclNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogQHBhcmFtIGxpc3RlbmVyCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlRGVjb3JhdG9yU2VsZWN0aW9uTGlzdGVuZXIoCisJCQlmaW5hbCBEZWNvcmF0b3JTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworCQlwcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCX0KKworCXByaXZhdGUgdm9pZCBmaXJlRGVjb3JhdG9yU2VsZWN0aW9uRXZlbnQoZmluYWwgRGVjb3JhdG9yU2VsZWN0aW9uRXZlbnQgcHNlKSB7CisJCWZvciAoZmluYWwgRGVjb3JhdG9yU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiBwcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVycykgeworCQkJbGlzdGVuZXIuZGVjb3JhdG9yU2VsZWN0ZWQocHNlKTsKKwkJfSAvLyBmb3IgZWFjaCBEZWNvcmF0b3JTZWxlY3Rpb25MaXN0ZW5lcgorCX0gLy8gZmlyZURlY29yYXRvclNlbGVjdGlvbkV2ZW50CisKKwkvKioKKwkgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgZGV0ZXJtaW5lIGlmIGEKKwkgKiB7QGxpbmsgRGVjb3JhdG9yfSBtZWV0cyBzb21lIHNwZWNpZmllZCBjcml0ZXJpYS4KKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIERlY29yYXRvckZpbHRlciB7CisJCS8qKgorCQkgKiBAcGFyYW0gZGVjb3JhdG9yCisJCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHtAbGluayBEZWNvcmF0b3J9IGlzIGFjY2VwdGFibGUuCisJCSAqLworCQlib29sZWFuIGFjY2VwdChmaW5hbCBEZWNvcmF0b3IgZGVjb3JhdG9yKTsKKwl9IC8vIERlY29yYXRvckZpbHRlcgorCisJLyoqCisJICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHNlbGVjdCBvdXQgdGhlIHByb3BlcnRpZXMKKwkgKiB0byBiZSBkaXNwbGF5ZWQuCisJICovCisJcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eVNpZXZlIHsKKwkJLyoqCisJCSAqIEBwYXJhbSBkeW5hbWljTGFiZWwKKwkJICogICAgICAgICAgICB0aGUgbGFiZWwgdGhhdCBjb250YWlucyB0aGUgY2FuZGlkYXRlIHByb3BlcnRpZXMgdG8gYmUKKwkJICogICAgICAgICAgICBkaXNwbGF5ZWQuCisJCSAqIEByZXR1cm4gYSA8Y29kZT5MaXN0PC9jb2RlPiBvZiB0aGUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZQorCQkgKiAgICAgICAgIGRpc3BsYXllZCBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHNob3VsZCBiZSBkaXNwbGF5ZWQuCisJCSAqLworCQlMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHNpZXZlKGZpbmFsIER5bmFtaWNMYWJlbCBkeW5hbWljTGFiZWwpOworCX0gLy8gUHJvcGVydHlTaWV2ZQorCisJLyoqCisJICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHdpc2ggdG8gYmUgbm90aWZpZWQKKwkgKiB3aGVuZXZlciBhIHByb3BlcnR5IGlzIHNlbGVjdGVkIGluIHRoaXMgd2lkZ2V0LgorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgRGVjb3JhdG9yU2VsZWN0aW9uTGlzdGVuZXIgeworCQkvKioKKwkJICogQHBhcmFtIHByb3BlcnR5U2VsZWN0aW9uRXZlbnQKKwkJICovCisJCXZvaWQgZGVjb3JhdG9yU2VsZWN0ZWQoRGVjb3JhdG9yU2VsZWN0aW9uRXZlbnQgZGVjb3JhdG9yU2VsZWN0aW9uRXZlbnQpOworCX0gLy8gRGVjb3JhdG9yU2VsZWN0aW9uTGlzdGVuZXIKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgZXZlbnQgb2YgYSBwcm9wZXJ0eSBiZWluZyBzZWxlY3RlZCBpbiB0aGUKKwkgKiB3aWRnZXQuCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBEZWNvcmF0b3JTZWxlY3Rpb25FdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisJCXByaXZhdGUgdHJhbnNpZW50IGZpbmFsIFN0cmluZyBpZDsKKwkJcHJpdmF0ZSB0cmFuc2llbnQgZmluYWwgRGVjb3JhdG9yIGRlY29yYXRvcjsKKworCQkvKioKKwkJICogQHBhcmFtIGRlY29yYXRvcgorCQkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgRGVjb3JhdG9yfQorCQkgKiBAcGFyYW0gcHJvcGVydHkKKwkJICogICAgICAgICAgICB0aGUgcHJvcGVydHkgdGhhdCB3YXMgc2VsZWN0ZWQuCisJCSAqIEBwYXJhbSBzb3VyY2UKKwkJICovCisJCXB1YmxpYyBEZWNvcmF0b3JTZWxlY3Rpb25FdmVudChmaW5hbCBEZWNvcmF0b3IgZGVjb3JhdG9yLAorCQkJCWZpbmFsIFN0cmluZyBpZCwgZmluYWwgT2JqZWN0IHNvdXJjZSkgeworCQkJc3VwZXIoc291cmNlKTsKKwkJCXRoaXMuZGVjb3JhdG9yID0gZGVjb3JhdG9yOworCQkJdGhpcy5pZCA9IGlkOworCQl9CisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIGRlY29yYXRvcgorCQkgKi8KKwkJcHVibGljIGZpbmFsIERlY29yYXRvciBnZXREZWNvcmF0b3IoKSB7CisJCQlyZXR1cm4gZGVjb3JhdG9yOworCQl9CisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5CisJCSAqLworCQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldElkKCkgeworCQkJcmV0dXJuIGlkOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgamF2YS51dGlsLkV2ZW50T2JqZWN0I3RvU3RyaW5nKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKAorCQkJCQlkZWNvcmF0b3IgPT0gbnVsbCA/ICJudWxsLCIgOiBkZWNvcmF0b3IuZ2V0RHVibGluQ29yZSgpCisJCQkJCQkJLmdldFRpdGxlKCkpOworCQkJc2IuYXBwZW5kKGlkID09IG51bGwgPyAibnVsbCIgOiBpZCk7CisJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwkJfQorCX0gLy8gRGVjb3JhdG9yU2VsZWN0aW9uRXZlbnQKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGRpc3BsYXkgbGFiZWwKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlMYWJlbCgpIHsKKwkJcmV0dXJuIGRpc3BsYXlMYWJlbC5nZXRUZXh0KCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGRpc3BsYXlMYWJlbAorCSAqICAgICAgICAgICAgdGhlIGxhYmVsIHRvIGRpc3BsYXkgYWJvdmUgdGhlIHByb3BlcnR5IHNlbGVjdG9yCisJICovCisJcHVibGljIHZvaWQgc2V0RGlzcGxheUxhYmVsKGZpbmFsIFN0cmluZyBkaXNwbGF5TGFiZWwpIHsKKwkJdGhpcy5kaXNwbGF5TGFiZWwuc2V0VGV4dChkaXNwbGF5TGFiZWwpOworCX0KKworfSAvLyBQcm9wZXJ0eVNlbGVjdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpZGdldHMvR2VvVmlld09wdGlvbnNCYXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2lkZ2V0cy9HZW9WaWV3T3B0aW9uc0Jhci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyODI4ODgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpZGdldHMvR2VvVmlld09wdGlvbnNCYXIuamF2YQpAQCAtMCwwICsxLDgwNCBAQAorLy8gR2VvVmlld09wdGlvbnNCYXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnBvcHVsYXRpb24uUG9wdWxhdGlvbkVudW1lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5wb3B1bGF0aW9uLlBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnBvcHVsYXRpb24uUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5EZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbkdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5TdGFuZGFyZFBvcHVsYXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLkNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLklDb2xvclByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5jb2xvci5JQ29sb3JQcm92aWRlckNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIGNvbXBvdW5kIFNXVCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0fSB0aGF0IGFsbG93cyBmb3IgdGhlIHNlbGVjdGlvbiBvZgorICogYSB7QGxpbmsgRGVjb3JhdG9yfXMgYW5kIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmNvbG9yLkNvbG9yUHJvdmlkZXJ9cy4KKyAqLworcHVibGljIGNsYXNzIEdlb1ZpZXdPcHRpb25zQmFyIGV4dGVuZHMgQ29tcG9zaXRlIHsKKworCS8qKgorCSAqIEEgbGlzdCBvZiB7QGxpbmsgUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcn1zIHRvIGJlIG5vdGlmaWVkIGFib3V0CisJICogcHJvcGVydHkgc2VsZWN0aW9uIGV2ZW50cworCSAqLworCXByaXZhdGUgZmluYWwgTGlzdDxQcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyPiBzZWxlY3Rpb25MaXN0ZW5lcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8UHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcj4oKTsKKwkvKioKKwkgKiBUaGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgSUNvbG9yUHJvdmlkZXJDaGFuZ2VkTGlzdGVuZXJ9IHdhaXRpbmcgdG8gYmUgdG9sZCBjaGFuZ2Ugb2YgYSBjb2xvciBwcm92aWRlci4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxJQ29sb3JQcm92aWRlckNoYW5nZWRMaXN0ZW5lcj4gY29sb3JQcm92aWRlckNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8SUNvbG9yUHJvdmlkZXJDaGFuZ2VkTGlzdGVuZXI+KCk7CisJLyoqCisJICogQ29tYm8gZm9yIHNlbGVjdGluZyBkZWNvcmF0b3JzCisJICovCisJQ29tYm8gZGVjb3JhdG9yc0NvbWJvOworCS8qKgorCSAqIENvbWJvIGZvciBzZWxlY3RpbmcgZGVjb3JhdG9ycworCSAqLworCUNvbWJvIHBvcHVsYXRpb25zQ29tYm87CisKKwkvKioKKwkgKiBDb21ibyBmb3Igc2VsZWN0aW5nIHRoZSBjb2xvciBwcm92aWRlcgorCSAqLworCUNvbWJvIGNvbG9yUHJvdmlkZXJzQ29tYm87CisJCisJLyoqCisJICogQSBjb25zdGFudCB0byBzZXQgdGhlIHdpZHRoIG9mIHRoZSBkZWNvcmF0b3JzIGNvbWJvCisJICovCisJc3RhdGljIGZpbmFsIGludCBERUNPUkFUT1JTX1dJRFRIID0gMzU7CisJCisJLyoqCisJICogQSBjb25zdGFudCB0byBzZXQgdGhlIHdpZHRoIG9mIHRoZSBwb3AgaWQgY29tYm8KKwkgKi8KKwkKKwlzdGF0aWMgZmluYWwgaW50IFBPUElEU19XSURUSD0yNTsKKwkKKwkvKioKKwkgKiBBIGNvbnN0YW50IHRvIHNldCB0aGUgd2lkdGggb2YgdGhlIGNvbG9yIHByb3ZpZGVycyBjb21ibworCSAqLworCXN0YXRpYyBmaW5hbCBpbnQgUFJPVklERVJTX1dJRFRIICA9IDQ1OworCQorCS8qKgorCSAqIENvbWJvIGZvciBzZWxlY3RpbmcgZWRnZXMKKwkgKi8KKwlDb21ibyBlZGdlc0NvbWJvOworCS8qKgorCSAqIFRoZSBjb21wb3NpdGUgdGhhdCB0aGUgc2VsZWN0ZWQgY29sb3IgcHJvdmlkZXIgY29udHJpYnV0ZWQKKwkgKi8KKwlDb21wb3NpdGUgY29sb3JQcm92aWRlckNvbXBvc2l0ZTsKKwkvKioKKwkgKiBUaGUgY29tcG9zaXRlIHdpdGggdGhlIGNvbG9ycyBsZWdlbmQgKHByb3ZpZGVkIGJ5IHRoZSBzZWxlY3RlZCBjb2xvcgorCSAqIHByb3ZpZGVyKQorCSAqLworCUNvbXBvc2l0ZSBjb2xvcnNMZWdlbmRDb21wb3NpdGU7CisJLyoqCisJICogVGhlIGdyb3VwIGNvbXBvc2l0ZSB0aGF0IGdhdGhlcnMgdGhlIHdpZGdldHMKKwkgKi8KKwlHcm91cCBnZW9WaWV3T3B0aW9uc0dyb3VwOworCS8qKgorCSAqIFRoZSBncm91cCBjb21wb3NpdGUgdGhhdCBnYXRoZXJzIHRoZSB3aWRnZXRzCisJICovCisJR3JvdXAgZWRnZXNHcm91cDsJCisJLyoqCisJICogTGlzdCBvZiBhdmFpbGFibGUgZGVjb3JhdG9ycworCSAqLworCUxpc3Q8RGVjb3JhdG9yPiBkZWNvcmF0b3JzOworCS8qKgorCSAqIExpc3Qgb2YgYXZhaWxhYmxlIHBvcHVsYXRpb25zIGZvciB0aGUgc2VsZWN0ZWQgZGVjb3JhdG9yCisJICovCisJTGlzdDxTdHJpbmc+IHBvcHVsYXRpb25JZGVudGlmaWVyczsKKworCS8qKgorCSAqIExpc3Qgb2YgYXZhaWxhYmxlIGNvbG9yIHByb3ZpZGVycworCSAqLworCUxpc3Q8Q2xhc3M+IHN1cHBvcnRlZENvbG9yUHJvdmlkZXJzID0gbnVsbDsKKwkvKioKKwkgKiBMaXN0IG9mIGF2YWlsYWJsZSBjb2xvciBwcm92aWRlcnMgbmFtZXMKKwkgKi8KKwlMaXN0PFN0cmluZz4gc3VwcG9ydGVkQ29sb3JQcm92aWRlcnNOYW1lcyA9IG51bGw7CisJLyoqCisJICogTWFwcGluZyBiZXR3ZWVuIGVkZ2UgdHlwZSBhbmQgaXRzIFVSSSBwcmVmaXgKKwkgKi8KKwlNYXA8U3RyaW5nLCBTdHJpbmc+IGVkZ2VUeXBlVG9VcmlQcmVmaXhNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkvKioKKwkgKiBUaGUgc2VsZWN0ZWQgY29sb3IgcHJvdmlkZXIKKwkgKi8KKwlDbGFzcyBzZWxlY3RlZENvbG9yUHJvdmlkZXIgPSBudWxsOworCS8qKgorCSAqIFRoZSBzZWxlY3RlZCBkZWNvcmF0b3IKKwkgKi8KKwlEZWNvcmF0b3Igc2VsZWN0ZWREZWNvcmF0b3I7CisJLyoqCisJICogVGhlIHNlbGVjdGVkIHBvcHVsYXRpb24gaWRlbnRpZmllcgorCSAqLworCVN0cmluZyBzZWxlY3RlZFBvcHVsYXRpb25JZGVudGlmaWVyOworCQorCS8qKgorCSAqIERlY29yYXRvciBmaWx0ZXIgdG8gYmUgdXNlZAorCSAqLworCXByaXZhdGUgRGVjb3JhdG9yRmlsdGVyIGRlY29yYXRvckZpbHRlciA9IG5ldyBEZWNvcmF0b3JGaWx0ZXIoKSB7CisJCS8qKgorCQkgKiBDdXJyZW50bHkgb25seSBhY2NlcHRzIGRlY29yYXRvcnMgdGhhdCBhcmUgYWJsZSB0byBwcm92aWRlIGEgcmVsYXRpdmUgdmFsdWUKKwkJICogVE9ETzogRml4IHNvIHdlIGNhbiB2aWV3IG90aGVyIHR5cGVzIG9mIGRlY29yYXRvcnMKKwkJICogCisJCSAqIEBzZWUgR2VvVmlld09wdGlvbnNCYXIuRGVjb3JhdG9yRmlsdGVyI2FjY2VwdChvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yKQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gYWNjZXB0KAorCQkJCWZpbmFsIERlY29yYXRvciBkZWNvcmF0b3IpIHsKKwkJCQorCQkJRUxpc3Q8RHluYW1pY0xhYmVsPmxhYmVscyA9IGRlY29yYXRvci5nZXRMYWJlbHNUb1VwZGF0ZSgpOworCQkJaWYobGFiZWxzID09IG51bGwpIHJldHVybiBmYWxzZTsKKwkJCWZvcihEeW5hbWljTGFiZWwgbDpsYWJlbHMpIHsKKwkJCQlSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyIHJ2cCA9IChSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyKSBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCS5hZGFwdChsLCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIuY2xhc3MpOworCQkJCWlmKHJ2cCAhPSBudWxsKSByZXR1cm4gdHJ1ZTsKKwkJCX0KKwkKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX07CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQge0BsaW5rIENvbXBvc2l0ZX0KKwkgKiBAcGFyYW0gc3R5bGUKKwkgKiAgICAgICAgICAgIGFuIFNXVCBzdHlsZQorCSAqLworCXB1YmxpYyBHZW9WaWV3T3B0aW9uc0JhcihmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBpbnQgc3R5bGUpIHsKKwkJc3VwZXIocGFyZW50LCBzdHlsZSk7CisKKwkJZmluYWwgUm93TGF5b3V0IHJvd0xheW91dCA9IG5ldyBSb3dMYXlvdXQoU1dULkhPUklaT05UQUwpOworCQlyb3dMYXlvdXQuZmlsbCA9IHRydWU7CisJCXRoaXMuc2V0TGF5b3V0KHJvd0xheW91dCk7CisKKwkJZ2VvVmlld09wdGlvbnNHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuTk9ORSk7CisJCWZpbmFsIEZvcm1MYXlvdXQgZm9ybUxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7CisJCWdlb1ZpZXdPcHRpb25zR3JvdXAuc2V0TGF5b3V0KGZvcm1MYXlvdXQpOworCisJCS8vIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlnZW9WaWV3T3B0aW9uc0dyb3VwLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJJTVZpZXcuTVByb3AiKSk7CisJCWdlb1ZpZXdPcHRpb25zR3JvdXAuc2V0VmlzaWJsZShmYWxzZSk7CisKKwkJLy8gQ29tYm8gQm94IG9mIERlY29yYXRvcnMKKwkJZGVjb3JhdG9yc0NvbWJvID0gbmV3IENvbWJvKGdlb1ZpZXdPcHRpb25zR3JvdXAsIFNXVC5EUk9QX0RPV04KKwkJCQl8IFNXVC5SRUFEX09OTFkgfCBTV1QuQ0VOVEVSKTsKKworCQkvLyBDb21ibyBCb3ggb2YgcG9wdWxhdGlvbiBpZGVudGlmaWVycworCQlwb3B1bGF0aW9uc0NvbWJvID0gbmV3IENvbWJvKGdlb1ZpZXdPcHRpb25zR3JvdXAsIFNXVC5EUk9QX0RPV04KKwkJCQl8IFNXVC5SRUFEX09OTFkgfCBTV1QuQ0VOVEVSKTsKKworCQkvLyBDb21ibyBCb3ggb2YgdGhlIGNvbG9yIHByb3ZpZGVycworCQljb2xvclByb3ZpZGVyc0NvbWJvID0gbmV3IENvbWJvKGdlb1ZpZXdPcHRpb25zR3JvdXAsIFNXVC5EUk9QX0RPV04KKwkJCQl8IFNXVC5SRUFEX09OTFkgfCBTV1QuQ0VOVEVSKTsKKworCisJCWZpbmFsIEZvcm1EYXRhIGRlY29yYXRvcnNDb21ib0Zvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCWRlY29yYXRvcnNDb21ib0Zvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWRlY29yYXRvcnNDb21ib0Zvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KERFQ09SQVRPUlNfV0lEVEgsIDApOworCQlkZWNvcmF0b3JzQ29tYm8uc2V0TGF5b3V0RGF0YShkZWNvcmF0b3JzQ29tYm9Gb3JtRGF0YSk7CisKKwkJZmluYWwgRm9ybURhdGEgcG9wdWxhdGlvbkNvbWJvRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJcG9wdWxhdGlvbkNvbWJvRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGRlY29yYXRvcnNDb21ibywgNSk7CisJCXBvcHVsYXRpb25Db21ib0Zvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXBvcHVsYXRpb25Db21ib0Zvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KFBPUElEU19XSURUSCwgMCk7CisJCXBvcHVsYXRpb25zQ29tYm8uc2V0TGF5b3V0RGF0YShwb3B1bGF0aW9uQ29tYm9Gb3JtRGF0YSk7CisKKwkJCisJCWZpbmFsIEZvcm1EYXRhIGNvbG9yUHJvdmlkZXJzQ29tYm9Gb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQljb2xvclByb3ZpZGVyc0NvbWJvRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHBvcHVsYXRpb25zQ29tYm8sIDUpOworCQljb2xvclByb3ZpZGVyc0NvbWJvRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJY29sb3JQcm92aWRlcnNDb21ib0Zvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KFBST1ZJREVSU19XSURUSCwgMCk7CisJCWNvbG9yUHJvdmlkZXJzQ29tYm8uc2V0TGF5b3V0RGF0YShjb2xvclByb3ZpZGVyc0NvbWJvRm9ybURhdGEpOworCQkJCisJCXN1cHBvcnRlZENvbG9yUHJvdmlkZXJzID0gQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFN1cHBvcnRlZENvbG9yUHJvdmlkZXJzKCk7CisJCXN1cHBvcnRlZENvbG9yUHJvdmlkZXJzTmFtZXMgPSBDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0U3VwcG9ydGVkQ29sb3JQcm92aWRlcnNOYW1lcygpOworCisJCXRoaXMucGFjaygpOworCisJCQorCQlkZWNvcmF0b3JzQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKAorCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCS8vIEFueSBkZWNvcmF0b3JzPworCQkJCWlmICghZGVjb3JhdG9ycy5pc0VtcHR5KCkpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWZpbmFsIERlY29yYXRvciB0ZW1wRGVjb3JhdG9yID0gZGVjb3JhdG9ycworCQkJCQkJCS5nZXQoZGVjb3JhdG9yc0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOworCQkJCQkvLyBXYXMgdGhlcmUgYSBjaGFuZ2UgaW4gc2VsZWN0ZWQgRGVjb3JhdG9ycz8KKwkJCQkJaWYgKHNlbGVjdGVkRGVjb3JhdG9yICE9IHRlbXBEZWNvcmF0b3IpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJc2VsZWN0ZWREZWNvcmF0b3IgPSB0ZW1wRGVjb3JhdG9yOworCQkJCQkJQXJyYXlMaXN0PFN0cmluZz4gcG9wSWRzID0gZ2V0UG9wdWxhdGlvbklkZW50aWZpZXJzKHNlbGVjdGVkRGVjb3JhdG9yKTsKKwkJCQkJCXBvcHVsYXRpb25JZGVudGlmaWVycyA9IHBvcElkczsKKwkJCQkJCWlmKHBvcHVsYXRpb25JZGVudGlmaWVycyAhPSBudWxsKSBzZWxlY3RlZFBvcHVsYXRpb25JZGVudGlmaWVyID0gcG9wdWxhdGlvbklkZW50aWZpZXJzLmdldCgwKTsKKwkJCQkJCQorCQkJCQkJaW5pdGlhbGl6ZUNvbWJvKHBvcHVsYXRpb25zQ29tYm8sIGdldFBvcHVsYXRpb25JZE5hbWVzKHBvcElkcyksCisJCQkJCQkJCWdldFBvcHVsYXRpb25JZEluZGV4KHNlbGVjdGVkUG9wdWxhdGlvbklkZW50aWZpZXIsIHBvcHVsYXRpb25JZGVudGlmaWVycykpOworCQkJCQkJCisJCQorCQkJCQkJdXBkYXRlQ29sb3JQcm92aWRlckNvbXBvc2l0ZXMoKTsKKwkJCQkJCWZpcmVQcm9wZXJ0eVNlbGVjdGlvbkV2ZW50KG5ldyBQcm9wZXJ0eVNlbGVjdGlvbkV2ZW50KAorCQkJCQkJCQlzZWxlY3RlZERlY29yYXRvciwgc2VsZWN0ZWRQb3B1bGF0aW9uSWRlbnRpZmllciwgbnVsbCwgY29sb3JQcm92aWRlcnNDb21ibykpOworCQkJCQl9IC8vIGlmIERlY29yYXRvcnMgY2hhbmdlZAorCisJCQkJfSAvLyBpZiBhbnkgZGVjb3JhdG9ycworCQkJfQorCQl9IC8vIFNlbGVjdGlvbkFkYXB0ZXIKKwkJCQkpOworCisJCXBvcHVsYXRpb25zQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKAorCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCS8vIEFueSBkZWNvcmF0b3JzPworCQkJCWlmICghcG9wdWxhdGlvbklkZW50aWZpZXJzLmlzRW1wdHkoKSkgeworCQkJCQkvLyBZZXMKKwkJCQkJZmluYWwgU3RyaW5nIHRlbXBQb3BJZCA9IHBvcHVsYXRpb25JZGVudGlmaWVycworCQkJCQkJCS5nZXQocG9wdWxhdGlvbnNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKKwkJCQkJLy8gV2FzIHRoZXJlIGEgY2hhbmdlIGluIHNlbGVjdGVkIERlY29yYXRvcnM/CisJCQkJCWlmICghc2VsZWN0ZWRQb3B1bGF0aW9uSWRlbnRpZmllci5lcXVhbHModGVtcFBvcElkKSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQlzZWxlY3RlZFBvcHVsYXRpb25JZGVudGlmaWVyID0gdGVtcFBvcElkOworCQkJCQkJdXBkYXRlQ29sb3JQcm92aWRlckNvbXBvc2l0ZXMoKTsKKwkJCQkJCWZpcmVQcm9wZXJ0eVNlbGVjdGlvbkV2ZW50KG5ldyBQcm9wZXJ0eVNlbGVjdGlvbkV2ZW50KAorCQkJCQkJCQlzZWxlY3RlZERlY29yYXRvciwgc2VsZWN0ZWRQb3B1bGF0aW9uSWRlbnRpZmllciwgbnVsbCwgY29sb3JQcm92aWRlcnNDb21ibykpOworCQkJCQl9IC8vIGlmIERlY29yYXRvcnMgY2hhbmdlZAorCisJCQkJfSAvLyBpZiBhbnkgZGVjb3JhdG9ycworCQkJfQorCQl9IC8vIFNlbGVjdGlvbkFkYXB0ZXIKKwkJCQkpOworCQkKKwkJY29sb3JQcm92aWRlcnNDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoCisJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJc2VsZWN0ZWRDb2xvclByb3ZpZGVyID0gCisJCQkJCXN1cHBvcnRlZENvbG9yUHJvdmlkZXJzLmdldChjb2xvclByb3ZpZGVyc0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOworCQkJCXVwZGF0ZUNvbG9yUHJvdmlkZXJDb21wb3NpdGVzKCk7CisJCQl9CisJCX0gLy8gU2VsZWN0aW9uQWRhcHRlcgorCQkJCSk7CisJCQorCQllZGdlc0dyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5OT05FKTsKKwkJZWRnZXNDb21ibyA9IG5ldyBDb21ibyhlZGdlc0dyb3VwLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSB8IFNXVC5DRU5URVIpOworCQllZGdlc0NvbWJvLmFkZCgiIik7CQkKKwkJZWRnZXNHcm91cC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7CisJCWVkZ2VzR3JvdXAuc2V0VmlzaWJsZShmYWxzZSk7CisJCWVkZ2VzR3JvdXAuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIklNVmlldy5FZGdlcyIpKTsKKwkJCisJCWVkZ2VzQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKAorCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCVN0cmluZyBzZWxlY3RlZEVkZ2VzID0gZWRnZXNDb21iby5nZXRUZXh0KCk7CisJCQkJaWYgKHNlbGVjdGVkRWRnZXMgPT0gbnVsbCB8fCBzZWxlY3RlZEVkZ2VzLmVxdWFscygiIikpIHsKKwkJCQkJZmlyZVByb3BlcnR5U2VsZWN0aW9uRXZlbnQobnVsbCk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlTdHJpbmcgZWRnZVByZWZpeCA9IGVkZ2VUeXBlVG9VcmlQcmVmaXhNYXAuZ2V0KHNlbGVjdGVkRWRnZXMpOworCQkJCQlmaXJlUHJvcGVydHlTZWxlY3Rpb25FdmVudChuZXcgUHJvcGVydHlTZWxlY3Rpb25FdmVudChudWxsLCBudWxsLAorCQkJCQkJCW51bGwsIGVkZ2VQcmVmaXgpKTsKKwkJCQl9CisJCQl9CisJCX0gLy8gU2VsZWN0aW9uQWRhcHRlcgorCQkJCSk7CisKKwkJc2V0U2ltdWxhdGlvbihudWxsKTsKKwl9IC8vIFByb3BlcnR5U2VsZWN0b3IKKworCS8qKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRyb2wgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKKwkJcmV0dXJuICEoZGVjb3JhdG9ycyA9PSBudWxsIHx8IGRlY29yYXRvcnMuaXNFbXB0eSgpKTsKKwl9IC8vIGlzSW5pdGlhbGl6ZWQKKworCS8qKgorCSAqIFNldHMgdGhlIHtAbGluayBEZWNvcmF0b3J9cworCSAqIAorCSAqIEBwYXJhbSBkZWNvcmF0b3JzCisJICogICAgICAgICAgICB7QGxpbmsgRGVjb3JhdG9yfXMgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0RGVjb3JhdG9ycyhmaW5hbCBMaXN0PERlY29yYXRvcj4gZGVjb3JhdG9ycykgeworCQl0aGlzLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzOworCQlzZWxlY3RlZERlY29yYXRvciA9IGRlY29yYXRvcnMuaXNFbXB0eSgpID8gbnVsbCA6IGRlY29yYXRvcnMuZ2V0KDApOworCQkKKwkJLy8gSWYgd2UgaGF2ZSBCT1RIIGEgcG9wdWxhdGlvbiBkZWNvcmF0b3IgYW5kIGEgZGlzZWFzZSBkZWNvcmF0b3IKKwkJLy8gdHJ5IHRvIGluaXRpYWxseSBzZWxlY3QgdGhlIGRpc2Vhc2UgYnkgZGVmYXVsdAorCQlpZiAoZGVjb3JhdG9ycy5zaXplKCk+PTIpIHsKKwkJCWlmKCEoc2VsZWN0ZWREZWNvcmF0b3IgaW5zdGFuY2VvZiBEaXNlYXNlTW9kZWwpKSB7CisJCQkJZm9yKGludCBpID0gMDsgaSA8IGRlY29yYXRvcnMuc2l6ZSgpOyBpICsrKSB7CisJCQkJCWlmKGRlY29yYXRvcnMuZ2V0KGkpIGluc3RhbmNlb2YgRGlzZWFzZU1vZGVsKSB7CisJCQkJCQlzZWxlY3RlZERlY29yYXRvciA9IGRlY29yYXRvcnMuZ2V0KGkpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlBcnJheUxpc3Q8U3RyaW5nPiBwb3BJZHMgPSBnZXRQb3B1bGF0aW9uSWRlbnRpZmllcnMoc2VsZWN0ZWREZWNvcmF0b3IpOworCQlwb3B1bGF0aW9uSWRlbnRpZmllcnMgPSBwb3BJZHM7CisJCWlmKHBvcHVsYXRpb25JZGVudGlmaWVycyAhPSBudWxsKSBzZWxlY3RlZFBvcHVsYXRpb25JZGVudGlmaWVyID0gcG9wdWxhdGlvbklkZW50aWZpZXJzLmdldCgwKTsKKwkJCisJCWluaXRpYWxpemVDb21ibyhkZWNvcmF0b3JzQ29tYm8sIGdldERlY29yYXRvck5hbWVzKGRlY29yYXRvcnMpLAorCQkJCWdldERlY29yYXRvckluZGV4KHNlbGVjdGVkRGVjb3JhdG9yLCBkZWNvcmF0b3JzKSk7CisKKwkJaW5pdGlhbGl6ZUNvbWJvKHBvcHVsYXRpb25zQ29tYm8sIGdldFBvcHVsYXRpb25JZE5hbWVzKHBvcElkcyksCisJCQkJZ2V0UG9wdWxhdGlvbklkSW5kZXgoc2VsZWN0ZWRQb3B1bGF0aW9uSWRlbnRpZmllciwgcG9wdWxhdGlvbklkZW50aWZpZXJzKSk7CisKKwl9IC8vIHNldERlY29yYXRvcnMKKwkKKwlBcnJheUxpc3Q8U3RyaW5nPiBnZXRQb3B1bGF0aW9uSWRlbnRpZmllcnMoRGVjb3JhdG9yIGRlY29yYXRvcikgeworCQlpZihkZWNvcmF0b3IgPT0gbnVsbClyZXR1cm4gbnVsbDsKKwkJQXJyYXlMaXN0PFN0cmluZz5wb3BJZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCisJCVBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlciBwZWEgPSAoUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyKVBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQoZGVjb3JhdG9yLCBQb3B1bGF0aW9uRW51bWVyYXRvci5jbGFzcyk7CisJCQorCQlpZihwZWEgIT0gbnVsbCkgeworCQkJcGVhLnNldFRhcmdldChkZWNvcmF0b3IpOworCQkJU3RyaW5nIFtdIHBpcyA9IHBlYS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcnMoKTsKKwkJCWZvcihpbnQgaT0wO2k8cGlzLmxlbmd0aDsrK2kpCisJCQkJcG9wSWRzLmFkZChwaXNbaV0pOworCQl9CisJCWVsc2UgaWYoZGVjb3JhdG9yIGluc3RhbmNlb2YgRGlzZWFzZU1vZGVsKSB7CisJCQlwb3BJZHMuYWRkKCgoRGlzZWFzZU1vZGVsKWRlY29yYXRvcikuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSk7CisJCX0gZWxzZSBpZihkZWNvcmF0b3IgaW5zdGFuY2VvZiBEZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbCkgeworCQkJcG9wSWRzLmFkZCgoKERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsKWRlY29yYXRvcikuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSk7CisJCQlmb3IoUG9wdWxhdGlvbkdyb3VwIGc6KChEZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbClkZWNvcmF0b3IpLmdldFBvcHVsYXRpb25Hcm91cHMoKSkgeworCQkJCXBvcElkcy5hZGQoZy5nZXRJZGVudGlmaWVyKCkpOworCQkJfQorCQl9IGVsc2UgaWYoZGVjb3JhdG9yIGluc3RhbmNlb2YgU3RhbmRhcmRQb3B1bGF0aW9uTW9kZWwpIHsKKwkJCXBvcElkcy5hZGQoKChTdGFuZGFyZFBvcHVsYXRpb25Nb2RlbClkZWNvcmF0b3IpLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkpOworCQl9CisJCXJldHVybiBwb3BJZHM7CisJfQorCS8qKgorCSAqIFNldHMgdGhlIFBvcHVsYXRpb24gSWRlbnRpZmllcnMKKwkgKiAKKwkgKiBAcGFyYW0gcG9wSWRzCisJICovCisJcHVibGljIHZvaWQgc2V0UG9wdWxhdGlvbklkZW50aWZpZXJzKGZpbmFsIExpc3Q8U3RyaW5nPiBwb3BJZHMpIHsKKwkJdGhpcy5wb3B1bGF0aW9uSWRlbnRpZmllcnMgPSBwb3BJZHM7CisJCXNlbGVjdGVkUG9wdWxhdGlvbklkZW50aWZpZXIgPSBwb3BJZHMuaXNFbXB0eSgpID8gbnVsbCA6IHBvcElkcy5nZXQoMCk7CisJCQorCisJCWluaXRpYWxpemVDb21ibyhwb3B1bGF0aW9uc0NvbWJvLCBnZXRQb3B1bGF0aW9uSWROYW1lcyhwb3BJZHMpLAorCQkJCWdldFBvcHVsYXRpb25JZEluZGV4KHNlbGVjdGVkUG9wdWxhdGlvbklkZW50aWZpZXIsIHBvcHVsYXRpb25JZGVudGlmaWVycykpOworCX0gLy8gc2V0RGVjb3JhdG9ycworCisJLyoqCisJICogQHBhcmFtIGRlY29yYXRvcnMKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb2xvclByb3ZpZGVycyhmaW5hbCBMaXN0PERlY29yYXRvcj4gZGVjb3JhdG9ycykgeworCQkKKwkJaWYgKHN1cHBvcnRlZENvbG9yUHJvdmlkZXJzLmlzRW1wdHkoKSkgeworCQkJLy9ObyBjb2xvciBwcm92aWRlcnMgYXZhaWxhYmxlCisJCQlyZXR1cm47CisJCX0KKwkJCisJCWZvciAoU3RyaW5nIHByb3ZpZGVyTmFtZSA6IHN1cHBvcnRlZENvbG9yUHJvdmlkZXJzTmFtZXMpIHsKKwkJCWNvbG9yUHJvdmlkZXJzQ29tYm8uYWRkKHByb3ZpZGVyTmFtZSk7CisJCX0KKwkJY29sb3JQcm92aWRlcnNDb21iby5zZWxlY3QoMCk7CisJCXNlbGVjdGVkQ29sb3JQcm92aWRlciA9IHN1cHBvcnRlZENvbG9yUHJvdmlkZXJzLmdldCgwKTsKKworCQl1cGRhdGVDb2xvclByb3ZpZGVyQ29tcG9zaXRlcygpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgc2V0RWRnZXMoKSB7CisJCWlmIChzZWxlY3RlZERlY29yYXRvciA9PSBudWxsKQorCQkJcmV0dXJuOworCQkKKwkJU2V0PFVSST4gZWRnZXNVUklzID0gc2VsZWN0ZWREZWNvcmF0b3IuZ2V0R3JhcGgoKS5nZXRFZGdlcygpLmtleVNldCgpOworCQlJdGVyYXRvcjxVUkk+IGl0ZXIgPSBlZGdlc1VSSXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKKwkJCVVSSSBuZXh0VXJpID0gaXRlci5uZXh0KCk7CisJCQlTdHJpbmcgZWRnZVByZWZpeCA9IG5leHRVcmkudHJpbVNlZ21lbnRzKDEpLnRvU3RyaW5nKCk7CisJCQlTdHJpbmcgZWRnZVR5cGUgPSBvcmcuZWNsaXBzZS5zdGVtLnVpLnByZWZlcmVuY2VzLk1lc3NhZ2VzLmdldFN0cmluZyhlZGdlUHJlZml4KTsKKwkJCWlmIChlZGdlVHlwZS5zdGFydHNXaXRoKCIhIikgJiYgZWRnZVR5cGUuZW5kc1dpdGgoIiEiKSkgeworCQkJCWVkZ2VQcmVmaXggPSBuZXh0VXJpLnRyaW1TZWdtZW50cygyKS50b1N0cmluZygpOworCQkJCWVkZ2VUeXBlID0gb3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5NZXNzYWdlcy5nZXRTdHJpbmcoZWRnZVByZWZpeCk7CisJCQl9CisJCQkKKwkJCWlmICghZWRnZVR5cGVUb1VyaVByZWZpeE1hcC5jb250YWluc0tleShlZGdlVHlwZSkpIHsKKwkJCQllZGdlVHlwZVRvVXJpUHJlZml4TWFwLnB1dChlZGdlVHlwZSwgZWRnZVByZWZpeCk7CisJCQkJZWRnZXNDb21iby5hZGQoZWRnZVR5cGUpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZSB0aGUgY29udHJvbCBmcm9tIGEge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259IGluc3RhbmNlLgorCSAqIAorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogICAgICAgICAgICB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259CisJICovCisJcHVibGljIHZvaWQgc2V0U2ltdWxhdGlvbihmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uKSB7CisJCWlmIChzaW11bGF0aW9uID09IG51bGwpCisJCQlyZXR1cm47CisJCQorCQlzZXREZWNvcmF0b3JzKGdldERlY29yYXRvcnNUb0Rpc3BsYXkoc2ltdWxhdGlvbikpOworCQlpZihkZWNvcmF0b3JzICE9IG51bGwpIHsKKwkJCXNldENvbG9yUHJvdmlkZXJzKGRlY29yYXRvcnMpOworCQkJZ2VvVmlld09wdGlvbnNHcm91cC5zZXRWaXNpYmxlKHRydWUpOworCQkJc2V0RWRnZXMoKTsKKwkJCWVkZ2VzR3JvdXAuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCWdldEluZm9ybWF0aW9uKHNpbXVsYXRpb24pOworCQl9CisJfSAvLyBzZXRTaW11bGF0aW9uCisKKwkvKioKKwkgKiBAcGFyYW0gZGVjb3JhdG9yRmlsdGVyCisJICogICAgICAgICAgICB0aGUgZmlsdGVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCB7QGxpbmsgRGVjb3JhdG9yfXMgd2lsbCBiZQorCSAqICAgICAgICAgICAgZGlzcGxheWVkLgorCSAqLworCXB1YmxpYyB2b2lkIHNldERlY29yYXRvckZpbHRlcihmaW5hbCBEZWNvcmF0b3JGaWx0ZXIgZGVjb3JhdG9yRmlsdGVyKSB7CisJCXRoaXMuZGVjb3JhdG9yRmlsdGVyID0gZGVjb3JhdG9yRmlsdGVyOworCX0gLy8gc2V0RGVjb3JhdG9yRmlsdGVyCisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb2xvclByb3ZpZGVyQ29tcG9zaXRlcygpIHsKKwkJaWYgKGNvbG9yUHJvdmlkZXJDb21wb3NpdGUgIT0gbnVsbCkgeworCQkJY29sb3JQcm92aWRlckNvbXBvc2l0ZS5kaXNwb3NlKCk7CisJCX0KKwkJaWYgKGNvbG9yc0xlZ2VuZENvbXBvc2l0ZSAhPSBudWxsKSB7CisJCQljb2xvcnNMZWdlbmRDb21wb3NpdGUuZGlzcG9zZSgpOworCQl9CisJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldEZhY3RvcnlGb3JUeXBlKHNlbGVjdGVkQ29sb3JQcm92aWRlcik7CisJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkpIHsKKwkJCUlDb2xvclByb3ZpZGVyQWRhcHRlckZhY3Rvcnkgc2VsZWN0ZWRDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkgPSAoSUNvbG9yUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeTsKKwkJCQorCQkJY29sb3JQcm92aWRlckNvbXBvc2l0ZSA9IHNlbGVjdGVkQ29sb3JQcm92aWRlckFkYXB0ZXJGYWN0b3J5CisJCQkJCS5jcmVhdGVQcm9wZXJ0aWVzQ29tcG9zaXRlKGdlb1ZpZXdPcHRpb25zR3JvdXAsIFNXVC5OT05FLCBzZWxlY3RlZERlY29yYXRvcik7CisJCQkvLyBpZiB0aGVyZSBpcyBubyBjb21wb3NpdGUgY29udHJpYnV0aW9uIGZyb20gdGhlIHNlbGVjdGVkIGNvbG9yCisJCQkvLyBwcm92aWRlciB0aGVuIHJldHVybgorCQkJaWYgKGNvbG9yUHJvdmlkZXJDb21wb3NpdGUgPT0gbnVsbCkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChjb2xvclByb3ZpZGVyQ29tcG9zaXRlIGluc3RhbmNlb2YgQ29sb3JQcm92aWRlclByb3BlcnRpZXNDb21wb3NpdGUpIHsKKwkJCQkoKENvbG9yUHJvdmlkZXJQcm9wZXJ0aWVzQ29tcG9zaXRlKSBjb2xvclByb3ZpZGVyQ29tcG9zaXRlKQorCQkJCQkJLmFkZFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIobmV3IENvbG9yUHJvdmlkZXJQcm9wZXJ0aWVzQ29tcG9zaXRlLlByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlTZWxlY3RlZCgKKwkJCQkJCQkJCWZpbmFsIENvbG9yUHJvdmlkZXJQcm9wZXJ0aWVzQ29tcG9zaXRlLlByb3BlcnR5U2VsZWN0aW9uRXZlbnQgcHJvcGVydHlTZWxlY3Rpb25FdmVudCkgeworCQkJCQkJCQlmaXJlUHJvcGVydHlTZWxlY3Rpb25FdmVudChuZXcgUHJvcGVydHlTZWxlY3Rpb25FdmVudCgKKwkJCQkJCQkJCQludWxsLCBudWxsLG51bGwsIHByb3BlcnR5U2VsZWN0aW9uRXZlbnQKKwkJCQkJCQkJCQkJCS5nZXRTb3VyY2UoKSkpOworCQkJCQkJCX0KKwkJCQkJCX0pOworCQkJfQorCisJCQlmaW5hbCBGb3JtRGF0YSBjb2xvclByb3ZpZGVyQ29tcG9zaXRlRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJCWNvbG9yUHJvdmlkZXJDb21wb3NpdGVGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwwKTsKKwkJCWNvbG9yUHJvdmlkZXJDb21wb3NpdGVGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KERFQ09SQVRPUlNfV0lEVEgsIDApOworCQkJY29sb3JQcm92aWRlckNvbXBvc2l0ZUZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KFBST1ZJREVSU19XSURUSCwgMCk7CisJCQljb2xvclByb3ZpZGVyQ29tcG9zaXRlLnNldExheW91dERhdGEoY29sb3JQcm92aWRlckNvbXBvc2l0ZUZvcm1EYXRhKTsKKwkJCQorCQkJZ2VvVmlld09wdGlvbnNHcm91cC5sYXlvdXQoKTsKKwkJCQorCQkJY29sb3JzTGVnZW5kQ29tcG9zaXRlID0gc2VsZWN0ZWRDb2xvclByb3ZpZGVyQWRhcHRlckZhY3RvcnkKKwkJCQkJLmNyZWF0ZUNvbG9yc0xlZ2VuZENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7CisJCQlpZiAoY29sb3JzTGVnZW5kQ29tcG9zaXRlICE9IG51bGwpIHsKKwkJCQljb2xvcnNMZWdlbmRDb21wb3NpdGUucGFjaygpOworCQkJCWNvbG9yc0xlZ2VuZENvbXBvc2l0ZS5sYXlvdXQoKTsKKwkJCX0KKwkJCQorCQkJdGhpcy5sYXlvdXQoKTsKKwkJfQorCQkKKwkJZmlyZUNvbG9yUHJvdmlkZXJDaGFuZ2VkRXZlbnQoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbgorCSAqICAgICAgICAgICAgdGhlIHNpbXVsYXRpb24gdGhhdCBjb250YWlucyB7QGxpbmsgRGVjb3JhdG9yfXMKKwkgKiBAcmV0dXJuIGEge0BsaW5rIExpc3R9IG9mIHRoZSB7QGxpbmsgRGVjb3JhdG9yfXMgd2hvc2UgcHJvcGVydGllcworCSAqLworCXByaXZhdGUgTGlzdDxEZWNvcmF0b3I+IGdldERlY29yYXRvcnNUb0Rpc3BsYXkoZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbikgeworCQlmaW5hbCBMaXN0PERlY29yYXRvcj4gcmV0VmFsdWUgPSBuZXcgQXJyYXlMaXN0PERlY29yYXRvcj4oKTsKKworCQkvLyBHb3QgU2ltdWxhdGlvbj8KKwkJaWYgKHNpbXVsYXRpb24gIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBHcmFwaCBjYW5vbmljYWxHcmFwaCA9IHNpbXVsYXRpb24uZ2V0U2NlbmFyaW8oKQorCQkJCQkuZ2V0Q2Fub25pY2FsR3JhcGgoKTsKKwkJCS8vIElzIHRoZSBjYW5vbmljYWxHcmFwaCBpbml0aWFsaXplZCB5ZXQ/CisJCQlpZiAoY2Fub25pY2FsR3JhcGggIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCS8vIEdvIHRocm91Z2ggdGhlIERlY29yYXRvcnMga2VlcGluZyB0aGUgb25lcyB0aGF0IHRoZSBmaWx0ZXIKKwkJCQkvLyBzYXlzIGFyZSBvay4KKwkJCQlmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogY2Fub25pY2FsR3JhcGguZ2V0RGVjb3JhdG9ycygpKSB7CisJCQkJCWZpbmFsIERlY29yYXRvciBkZWNvcmF0b3IgPSAoRGVjb3JhdG9yKSBlbGVtZW50OworCQkJCQkvLyBBY2NlcHRhYmxlPworCQkJCQlpZiAoZGVjb3JhdG9yRmlsdGVyLmFjY2VwdChkZWNvcmF0b3IpKSB7CisJCQkJCQlyZXRWYWx1ZS5hZGQoZGVjb3JhdG9yKTsKKwkJCQkJfSAvLyBpZiBoYXMgYSB0aXRsZQorCQkJCX0gLy8gZm9yIGVhY2ggZGVjb3JhdG9yCisJCQl9IC8vIGlmIGdvdCBncmFwaAorCQl9IC8vIGlmIGdvdCBzaW11bGF0aW9uCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGdldERlY29yYXRvcnNUb0Rpc3BsYXkKKworCS8qKgorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogICAgICAgICAgICB0aGUgc2ltdWxhdGlvbiB0aGF0IGNvbnRhaW5zIHtAbGluayBEZWNvcmF0b3J9cworCSAqLworCXByaXZhdGUgdm9pZCBnZXRJbmZvcm1hdGlvbihmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uKSB7CisJCS8vIEdvdCBTaW11bGF0aW9uPworCQlpZiAoc2ltdWxhdGlvbiAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCWZpbmFsIEdyYXBoIGNhbm9uaWNhbEdyYXBoID0gc2ltdWxhdGlvbi5nZXRTY2VuYXJpbygpCisJCQkJCS5nZXRDYW5vbmljYWxHcmFwaCgpOworCQkJLy8gSXMgdGhlIGNhbm9uaWNhbEdyYXBoIGluaXRpYWxpemVkIHlldD8KKwkJCWlmIChjYW5vbmljYWxHcmFwaCAhPSBudWxsKSB7CisJCQkJY2Fub25pY2FsR3JhcGguZ2V0R3JhcGhMYWJlbHMoKTsKKwkJCQljYW5vbmljYWxHcmFwaAorCQkJCQkJLmdldE5vZGVMYWJlbHNCeVR5cGVVUkkoVVJJCisJCQkJCQkJCS5jcmVhdGVVUkkoInN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9sYWJlbC9wb3B1bGF0aW9uIikpOworCQkJfSAvLyBpZiBnb3QgZ3JhcGgKKwkJfSAvLyBpZiBnb3Qgc2ltdWxhdGlvbgorCX0gLy8gZ2V0RGVjb3JhdG9yc1RvRGlzcGxheQorCisJLyoqCisJICogQHBhcmFtIGNvbWJvCisJICogQHBhcmFtIG5hbWVzCisJICogQHBhcmFtIHNlbGVjdGlvbkluZGV4CisJICovCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDb21ibyhmaW5hbCBDb21ibyBjb21ibywgZmluYWwgU3RyaW5nW10gbmFtZXMsCisJCQlmaW5hbCBpbnQgc2VsZWN0aW9uSW5kZXgpIHsKKwkJY29tYm8uc2V0SXRlbXMobmFtZXMpOworCQljb21iby5zZWxlY3Qoc2VsZWN0aW9uSW5kZXgpOworCX0gLy8gaW5pdGlhbGl6ZUNvbWJvCisKKwkvKioKKwkgKiBAcGFyYW0gZGVjb3JhdG9ycworCSAqICAgICAgICAgICAgYSBsaXN0IG9mIHtAbGluayBEZWNvcmF0b3J9cworCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIG5hbWVzIG9mIHRoZSB7QGxpbmsgRGVjb3JhdG9yc30uCisJICovCisJcHJpdmF0ZSBTdHJpbmdbXSBnZXREZWNvcmF0b3JOYW1lcyhmaW5hbCBMaXN0PERlY29yYXRvcj4gZGVjb3JhdG9ycykgeworCQlmaW5hbCBMaXN0PFN0cmluZz4gcmV0VmFsdWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJaWYgKGRlY29yYXRvcnMgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlmb3IgKGZpbmFsIERlY29yYXRvciBkZWNvcmF0b3IgOiBkZWNvcmF0b3JzKSB7CisJCQkJU3RyaW5nIHRpdGxlID0gZGVjb3JhdG9yLmdldER1YmxpbkNvcmUoKS5nZXRUaXRsZSgpOworCQkJCXRpdGxlID0gdGl0bGUgPT0gbnVsbCA/ICJudWxsIiA6IHRpdGxlOworCQkJCXJldFZhbHVlLmFkZCh0aXRsZSk7CisJCQl9IC8vIGZvciBlYWNoIGRlY29yYXRvcgorCQl9IC8vIGlmCisJCXJldHVybiByZXRWYWx1ZS50b0FycmF5KG5ldyBTdHJpbmdbXSB7fSk7CisJfSAvLyBnZXREZWNvcmF0b3JOYW1lcworCisJLyoqCisJICogQHBhcmFtIHBvcElkcworCSAqICAgICAgICAgICAgYSBsaXN0IG9mIHBvcHVsYXRpb24gaWRzCisJICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgbmFtZXMgCisJICovCisJcHJpdmF0ZSBTdHJpbmdbXSBnZXRQb3B1bGF0aW9uSWROYW1lcyhmaW5hbCBMaXN0PFN0cmluZz4gcG9wSWRzKSB7CisJCWZpbmFsIExpc3Q8U3RyaW5nPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlpZiAocG9wSWRzICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJZm9yIChmaW5hbCBTdHJpbmcgZGVjaWQgOiBwb3BJZHMpIHsKKwkJCQlTdHJpbmcgdGl0bGUgPSBkZWNpZDsKKwkJCQl0aXRsZSA9IHRpdGxlID09IG51bGwgPyAibnVsbCIgOiB0aXRsZTsKKwkJCQlyZXRWYWx1ZS5hZGQodGl0bGUpOworCQkJfSAvLyBmb3IgZWFjaCBkZWNvcmF0b3IKKwkJfSAvLyBpZgorCQlyZXR1cm4gcmV0VmFsdWUudG9BcnJheShuZXcgU3RyaW5nW10ge30pOworCX0gLy8gZ2V0RGVjb3JhdG9yTmFtZXMKKwkKKwkvKioKKwkgKiBAcGFyYW0gc2VsZWN0ZWREZWNvcmF0b3IKKwkgKiBAcGFyYW0gZGVjb3JhdG9ycworCSAqICAgICAgICAgICAgYSBsaXN0IG9mIHtAbGluayBEZWNvcmF0b3J9cy4KKwkgKiBAcmV0dXJuIHRoZSBwb3NpdGlvbiAoMCBvcmlnaW4pIG9mIHRoZSBzZWxlY3RlZERlY29yYXRvciBpbiBkZWNvcmF0b3JzLAorCSAqICAgICAgICAgb3IgMCwgaWYgdGhlIGRlY29yYXRvcnMgbGlzdCBpcyBlbXB0eS4KKwkgKi8KKwlwcml2YXRlIGludCBnZXREZWNvcmF0b3JJbmRleChmaW5hbCBEZWNvcmF0b3Igc2VsZWN0ZWREZWNvcmF0b3IsCisJCQlmaW5hbCBMaXN0PERlY29yYXRvcj4gZGVjb3JhdG9ycykgeworCQlpZiAoc2VsZWN0ZWREZWNvcmF0b3IgIT0gbnVsbCAmJiBkZWNvcmF0b3JzICE9IG51bGwKKwkJCQkmJiAhZGVjb3JhdG9ycy5pc0VtcHR5KCkpIHsKKwkJCS8vIFllcworCQkJcmV0dXJuIGRlY29yYXRvcnMuaW5kZXhPZihzZWxlY3RlZERlY29yYXRvcik7CisJCX0gLy8gaWYKKwkJcmV0dXJuIDA7CisJfSAvLyBnZXREZWNvcmF0b3JJbmRleAorCisJLyoqCisJICovCisJcHJpdmF0ZSBpbnQgZ2V0UG9wdWxhdGlvbklkSW5kZXgoZmluYWwgU3RyaW5nIHNlbGVjdGVkUG9wSWQsCisJCQlmaW5hbCBMaXN0PFN0cmluZz4gcG9wSWRzKSB7CisJCWlmIChzZWxlY3RlZFBvcElkICE9IG51bGwgJiYgcG9wSWRzICE9IG51bGwKKwkJCQkmJiAhcG9wSWRzLmlzRW1wdHkoKSkgeworCQkJLy8gWWVzCisJCQlyZXR1cm4gcG9wSWRzLmluZGV4T2Yoc2VsZWN0ZWRQb3BJZCk7CisJCX0gLy8gaWYKKwkJcmV0dXJuIDA7CisJfSAvLyBnZXREZWNvcmF0b3JJbmRleAorCQorCS8qKgorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqLworCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIoCisJCQlmaW5hbCBQcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXNlbGVjdGlvbkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyKAorCQkJZmluYWwgUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworCQlzZWxlY3Rpb25MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlTZWxlY3Rpb25FdmVudChmaW5hbCBQcm9wZXJ0eVNlbGVjdGlvbkV2ZW50IHBzZSkgeworCQlmb3IgKGZpbmFsIFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiBzZWxlY3Rpb25MaXN0ZW5lcnMpIHsKKwkJCWxpc3RlbmVyLnByb3BlcnR5U2VsZWN0ZWQocHNlKTsKKwkJfSAvLyBmb3IgZWFjaCBQcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyCisJfSAvLyBmaXJlUHJvcGVydHlTZWxlY3Rpb25FdmVudAorCQorCS8qKgorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqLworCXB1YmxpYyB2b2lkIGFkZENvbG9yUHJvdmlkZXJDaGFuZ2VkTGlzdGVuZXIoCisJCQlmaW5hbCBJQ29sb3JQcm92aWRlckNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQljb2xvclByb3ZpZGVyQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVDb2xvclByb3ZpZGVyQ2hhbmdlZExpc3RlbmVyKAorCQkJZmluYWwgSUNvbG9yUHJvdmlkZXJDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJY29sb3JQcm92aWRlckNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBmaXJlQ29sb3JQcm92aWRlckNoYW5nZWRFdmVudCgpIHsKKwkJZm9yIChmaW5hbCBJQ29sb3JQcm92aWRlckNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA6IGNvbG9yUHJvdmlkZXJDaGFuZ2VkTGlzdGVuZXJzKSB7CisJCQlsaXN0ZW5lci5jb2xvclByb3ZpZGVyQ2hhbmdlZChzZWxlY3RlZENvbG9yUHJvdmlkZXIpOworCQl9IC8vIGZvciBlYWNoIFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIKKwl9IC8vIGZpcmVQcm9wZXJ0eVNlbGVjdGlvbkV2ZW50CisKKwkvKioKKwkgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgZGV0ZXJtaW5lIGlmIGEKKwkgKiB7QGxpbmsgRGVjb3JhdG9yfSBtZWV0cyBzb21lIHNwZWNpZmllZCBjcml0ZXJpYS4KKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIERlY29yYXRvckZpbHRlciB7CisJCS8qKgorCQkgKiBAcGFyYW0gZGVjb3JhdG9yCisJCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHtAbGluayBEZWNvcmF0b3J9IGlzIGFjY2VwdGFibGUuCisJCSAqLworCQlib29sZWFuIGFjY2VwdChmaW5hbCBEZWNvcmF0b3IgZGVjb3JhdG9yKTsKKwl9IC8vIERlY29yYXRvckZpbHRlcgorCisJLyoqCisJICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHdpc2ggdG8gYmUgbm90aWZpZWQKKwkgKiB3aGVuZXZlciBhIHByb3BlcnR5IGlzIHNlbGVjdGVkIGluIHRoaXMgd2lkZ2V0LgorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lciB7CisJCS8qKgorCQkgKiBAcGFyYW0gcHJvcGVydHlTZWxlY3Rpb25FdmVudAorCQkgKi8KKwkJdm9pZCBwcm9wZXJ0eVNlbGVjdGVkKFByb3BlcnR5U2VsZWN0aW9uRXZlbnQgcHJvcGVydHlTZWxlY3Rpb25FdmVudCk7CisJfSAvLyBQcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGV2ZW50IG9mIGEgcHJvcGVydHkgYmVpbmcgc2VsZWN0ZWQgaW4gdGhlCisJICogd2lkZ2V0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvcGVydHlTZWxlY3Rpb25FdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisJCXByaXZhdGUgdHJhbnNpZW50IGZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHk7CisJCXByaXZhdGUgdHJhbnNpZW50IGZpbmFsIERlY29yYXRvciBkZWNvcmF0b3I7CisJCXByaXZhdGUgdHJhbnNpZW50IGZpbmFsIFN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllcjsKKworCQkvKioKKwkJICogQHBhcmFtIGRlY29yYXRvcgorCQkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgRGVjb3JhdG9yfQorCQkgKiBAcGFyYW0gcHJvcGVydHkKKwkJICogICAgICAgICAgICB0aGUgcHJvcGVydHkgdGhhdCB3YXMgc2VsZWN0ZWQuCisJCSAqIEBwYXJhbSBzb3VyY2UKKwkJICovCisJCXB1YmxpYyBQcm9wZXJ0eVNlbGVjdGlvbkV2ZW50KGZpbmFsIERlY29yYXRvciBkZWNvcmF0b3IsIFN0cmluZyBwb3BJZCwKKwkJCQlmaW5hbCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5LCBmaW5hbCBPYmplY3Qgc291cmNlKSB7CisJCQlzdXBlcihzb3VyY2UpOworCQkJdGhpcy5kZWNvcmF0b3IgPSBkZWNvcmF0b3I7CisJCQl0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisJCQl0aGlzLnBvcHVsYXRpb25JZGVudGlmaWVyID0gcG9wSWQ7CisJCX0KKworCQkvKioKKwkJICogQHJldHVybiB0aGUgZGVjb3JhdG9yCisJCSAqLworCQlwdWJsaWMgZmluYWwgRGVjb3JhdG9yIGdldERlY29yYXRvcigpIHsKKwkJCXJldHVybiBkZWNvcmF0b3I7CisJCX0KKworCQkvKioKKwkJICogQHJldHVybiB0aGUgcG9wdWxhdGlvbiBpZGVudGlmaWVyCisJCSAqLworCQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFBvcHVsYXRpb25JZGVudGlmaWVyKCkgeworCQkJcmV0dXJuIHBvcHVsYXRpb25JZGVudGlmaWVyOworCQl9CisJCQorCQkvKioKKwkJICogQHJldHVybiB0aGUgcHJvcGVydHkKKwkJICovCisJCXB1YmxpYyBmaW5hbCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5KCkgeworCQkJcmV0dXJuIHByb3BlcnR5OworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgamF2YS51dGlsLkV2ZW50T2JqZWN0I3RvU3RyaW5nKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKAorCQkJCQlkZWNvcmF0b3IgPT0gbnVsbCA/ICJudWxsLCIgOiBkZWNvcmF0b3IuZ2V0RHVibGluQ29yZSgpCisJCQkJCQkJLmdldFRpdGxlKCkpOworCQkJc2IuYXBwZW5kKHByb3BlcnR5ID09IG51bGwgPyAibnVsbCIgOiBwcm9wZXJ0eQorCQkJCQkuZ2V0RGlzcGxheU5hbWUocHJvcGVydHkpKTsKKwkJCXJldHVybiBzYi50b1N0cmluZygpOworCQl9CisJfSAvLyBQcm9wZXJ0eVNlbGVjdGlvbkV2ZW50CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzZWxlY3RlZERlY29yYXRvcgorCSAqLworCXB1YmxpYyBEZWNvcmF0b3IgZ2V0U2VsZWN0ZWREZWNvcmF0b3IoKSB7CisJCXJldHVybiBzZWxlY3RlZERlY29yYXRvcjsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgc2VsZWN0ZWQgcG9wdWxhdGlvbiBpZGVudGlmaWVyCisJICovCisJcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZFBvcHVsYXRpb25JZGVudGlmaWVyKCkgeworCQlyZXR1cm4gc2VsZWN0ZWRQb3B1bGF0aW9uSWRlbnRpZmllcjsKKwl9Cit9IC8vIFByb3BlcnR5U2VsZWN0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2lkZ2V0cy9JU09LZXlQaWNrZWRFdmVudC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aWRnZXRzL0lTT0tleVBpY2tlZEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3ZjgyNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2lkZ2V0cy9JU09LZXlQaWNrZWRFdmVudC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8vIElTT0tleVBpY2tlZEV2ZW50LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS53aWRnZXRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGV2ZW50IG9mIGFuIElTT2tleSBiZWluZyBzZWxlY3RlZCB1c2luZyBhbgorICoge0BsaW5rIElTT0tleVBpY2tlcn0uCisgKi8KK3B1YmxpYyBjbGFzcyBJU09LZXlQaWNrZWRFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKwlwcml2YXRlIFN0cmluZyBpc29LZXk7CisKKwkvKioKKwkgKiBAcGFyYW0gc291cmNlCisJICogQHBhcmFtIGlzb0tleQorCSAqLworCXB1YmxpYyBJU09LZXlQaWNrZWRFdmVudChPYmplY3Qgc291cmNlLCBTdHJpbmcgaXNvS2V5KSB7CisJCXN1cGVyKHNvdXJjZSk7CisJCXRoaXMuaXNvS2V5ID0gaXNvS2V5OworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGlzb0tleQorCSAqLworCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0SXNvS2V5KCkgeworCQlyZXR1cm4gaXNvS2V5OworCX0KKworfSAvLyBJU09LZXlQaWNrZWRFdmVudApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aWRnZXRzL0lTT0tleVBpY2tlZEV2ZW50TGlzdGVuZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2lkZ2V0cy9JU09LZXlQaWNrZWRFdmVudExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0YmYyMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2lkZ2V0cy9JU09LZXlQaWNrZWRFdmVudExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHM7CitpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHdhbnQgdG8gYmUgaW5mb3JtZWQgd2hlbiBhbiBJU08KKyAqIGtleSBpcyBzZWxlY3RlZCBmcm9tIHRoZSB7QGxpbmsgSVNPS2V5UGlja2VyfTsKKyAqLworcHVibGljIGludGVyZmFjZSBJU09LZXlQaWNrZWRFdmVudExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CisJdm9pZCBpc29LZXlQaWNrZWQoSVNPS2V5UGlja2VkRXZlbnQgaWtwZSk7Cit9IC8vIElTT0tleVBpY2tlZEV2ZW50TGlzdGVuZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2lkZ2V0cy9JU09LZXlQaWNrZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2lkZ2V0cy9JU09LZXlQaWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWEwYzNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aWRnZXRzL0lTT0tleVBpY2tlci5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACisvLyBJU09LZXlQaWNrZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5HZW9ncmFwaGljTmFtZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRmlsdGVyZWRMaXN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBTV1QgQ29tcG9zaXRlIHRoYXQgYWxsb3dzIGEgdXNlciB0byBzcGVjaWZ5IGFuIElTTyBrZXkgYnkKKyAqIHBpY2tpbmcgZnJvbSBhbiBleHBhbmRhYmxlIGhpZXJhcmNoeSBvZiBjb3VudHJ5IG5hbWVzIGFuZCB0aGVpcgorICogc3ViLWRpdmlzaW9ucy4KKyAqLworcHVibGljIGNsYXNzIElTT0tleVBpY2tlciBleHRlbmRzIENvbXBvc2l0ZSB7CisKKwlwcml2YXRlIGZpbmFsIExpc3Q8SVNPS2V5UGlja2VkRXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PElTT0tleVBpY2tlZEV2ZW50TGlzdGVuZXI+KCk7CisKKwlwcml2YXRlIGZpbmFsIExhYmVsIGlzb0tleUxldmVsRGVzY3JpcHRpb247CisJcHJpdmF0ZSBmaW5hbCBGaWx0ZXJlZExpc3QgZmlsdGVyZWRMaXN0OworCWZpbmFsIFRleHQgdGV4dDsKKwlwcml2YXRlIGludCBpc29LZXlMZXZlbDsKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgY29tcG9zaXRlCisJICogCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqLworCXB1YmxpYyBJU09LZXlQaWNrZXIoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgaW50IHN0eWxlLAorCQkJZmluYWwgaW50IGlzb0tleUxldmVsKSB7CisJCXN1cGVyKHBhcmVudCwgc3R5bGUpOworCQl0aGlzLmlzb0tleUxldmVsID0gaXNvS2V5TGV2ZWw7CisJCXNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKKworCQl0ZXh0ID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7CisJCWZpbmFsIEZvcm1EYXRhIGZkX3RleHQgPSBuZXcgRm9ybURhdGEoKTsKKwkJZmRfdGV4dC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWZkX3RleHQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgyNSwgMCk7CisJCWZkX3RleHQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJdGV4dC5zZXRMYXlvdXREYXRhKGZkX3RleHQpOworCQl0ZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIG5ldyBMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KGZpbmFsIEV2ZW50IGV2ZW50KSB7CisJCQkJZmlsdGVyZWRMaXN0LnNldEZpbHRlcih0ZXh0LmdldFRleHQoKSk7CisJCQl9CisJCX0pOworCQlpc29LZXlMZXZlbERlc2NyaXB0aW9uID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKKwkJaXNvS2V5TGV2ZWxEZXNjcmlwdGlvbi5zZXRUZXh0KCJMYWJlbCIpOworCQlGb3JtRGF0YSBmZF9pc29LZXlMZXZlbERlc2NyaXB0aW9uOworCQlmZF9pc29LZXlMZXZlbERlc2NyaXB0aW9uID0gbmV3IEZvcm1EYXRhKCk7CisJCWZkX2lzb0tleUxldmVsRGVzY3JpcHRpb24udG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRleHQsIDIsIFNXVC5UT1ApOworCQlmZF9pc29LZXlMZXZlbERlc2NyaXB0aW9uLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDI1LCAwKTsKKwkJZmRfaXNvS2V5TGV2ZWxEZXNjcmlwdGlvbi5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQl0aGlzLmlzb0tleUxldmVsRGVzY3JpcHRpb24uc2V0TGF5b3V0RGF0YShmZF9pc29LZXlMZXZlbERlc2NyaXB0aW9uKTsKKworCQlmaWx0ZXJlZExpc3QgPSBuZXcgRmlsdGVyZWRMaXN0KHRoaXMsIFNXVC5CT1JERVIsIG51bGwsIGZhbHNlLCBmYWxzZSwKKwkJCQl0cnVlKTsKKwkJZmluYWwgRm9ybURhdGEgZmRfZmlsdGVyZWRMaXN0ID0gbmV3IEZvcm1EYXRhKCk7CisJCWZkX2ZpbHRlcmVkTGlzdC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGV4dCwgNSwgU1dULkRFRkFVTFQpOworCQlmZF9maWx0ZXJlZExpc3QuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCWZkX2ZpbHRlcmVkTGlzdC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHRleHQsIDAsIFNXVC5MRUZUKTsKKwkJZmRfZmlsdGVyZWRMaXN0LnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHRleHQsIDAsIFNXVC5SSUdIVCk7CisJCWZpbHRlcmVkTGlzdC5zZXRMYXlvdXREYXRhKGZkX2ZpbHRlcmVkTGlzdCk7CisJCWZpbHRlcmVkTGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWZpbmFsIE9iamVjdFtdIHNlbGVjdGVkID0gZmlsdGVyZWRMaXN0LmdldFNlbGVjdGlvbigpOworCQkJCS8vIEFueXRoaW5nIHNlbGVjdGVkPworCQkJCQorCQkJCWlmIChzZWxlY3RlZC5sZW5ndGggPT0gMSkgeworCQkJCQlmaW5hbCBTdHJpbmcgaXNvS2V5ID0gKFN0cmluZykgc2VsZWN0ZWRbMF07CisJCQkJCWZpcmVJU09LZXlQaWNrZWQoaXNvS2V5KTsKKwkJCQl9CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKGZpbmFsIFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQl3aWRnZXRTZWxlY3RlZChlKTsKKwkJCX0KKwkJfSk7CisKKwkJZmlsdGVyZWRMaXN0LnNldElnbm9yZUNhc2UodHJ1ZSk7CisJCWZpbHRlcmVkTGlzdC5zZXRGaWx0ZXIoIiIpOworCQlmaWx0ZXJlZExpc3Quc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KGZpbmFsIE9iamVjdCBlbGVtZW50KSB7CisJCQkJcmV0dXJuIGdldE5hbWUoKFN0cmluZykgZWxlbWVudCwgaXNvS2V5TGV2ZWwpOworCQkJfQorCQl9KTsKKwkJZmlsdGVyZWRMaXN0LnNldEVsZW1lbnRzKG5ldyBPYmplY3RbXSB7fSk7CisKKwkJcGFjaygpOworCX0gLy8gSVNPS2V5UGlja2VyCisKKwlwdWJsaWMgdm9pZCBzZXRJU09LZXlzKGZpbmFsIE9iamVjdFtdIGlzb0tleXMpIHsKKwkJZmlsdGVyZWRMaXN0LnNldEVsZW1lbnRzKGlzb0tleXMpOworCQl0aGlzLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJdGV4dC5zZXRUZXh0KCIiKTsKKwkJCX0KKwkJfSk7CisJfSAvLyBzZXRJU09LZXlzCisKKwlwdWJsaWMgdm9pZCBzZXRJU09LZXlMZXZlbERlc2NyaXB0aW9uKGZpbmFsIFN0cmluZyBpc29LZXlMZXZlbERlc2NyaXB0aW9uKSB7CisJCXRoaXMuaXNvS2V5TGV2ZWxEZXNjcmlwdGlvbi5zZXRUZXh0KGlzb0tleUxldmVsRGVzY3JpcHRpb24pOworCX0gLy8gc2V0SVNPS2V5TGV2ZWxEZXNjcmlwdGlvbgorCisJLyoqCisJICogQHJldHVybiB0aGUgaXNvIGtleSBsZXZlbAorCSAqLworCXB1YmxpYyBpbnQgZ2V0SVNPS2V5TGV2ZWwoKSB7CisJCXJldHVybiBpc29LZXlMZXZlbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJU09LZXlMZXZlbChmaW5hbCBpbnQgaXNvS2V5TGV2ZWwpIHsKKwkJdGhpcy5pc29LZXlMZXZlbCA9IGlzb0tleUxldmVsOworCX0gLy8gc2V0TGV2ZWwKKworCXByaXZhdGUgU3RyaW5nIGdldE5hbWUoZmluYWwgU3RyaW5nIGlzb0tleSwgZmluYWwgaW50IGxldmVsKSB7CisJCXJldHVybiBHZW9ncmFwaGljTmFtZXMuZ2V0TmFtZShpc29LZXksIGxldmVsKTsKKwl9IC8vIGdldE5hbWUKKworCXB1YmxpYyB2b2lkIGFkZElTT0tleVBpY2tlZExpc3RlbmVyKGZpbmFsIElTT0tleVBpY2tlZEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfSAvLyBhZGRJU09LZXlQaWNrZWRMaXN0ZW5lcgorCisJcHVibGljIHZvaWQgcmVtb3ZlSVNPS2V5UGlja2VkTGlzdGVuZXIoCisJCQlmaW5hbCBJU09LZXlQaWNrZWRFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCX0gLy8gcmVtb3ZlSVNPS2V5UGlja2VkTGlzdGVuZXIKKworCXByaXZhdGUgdm9pZCBmaXJlSVNPS2V5UGlja2VkKGZpbmFsIFN0cmluZyBpc29LZXkpIHsKKwkJZmluYWwgSVNPS2V5UGlja2VkRXZlbnQgaXNvS2V5UGlja2VkRXZlbnQgPSBuZXcgSVNPS2V5UGlja2VkRXZlbnQodGhpcywKKwkJCQlpc29LZXkpOworCQlmb3IgKGZpbmFsIElTT0tleVBpY2tlZEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKKwkJCWxpc3RlbmVyLmlzb0tleVBpY2tlZChpc29LZXlQaWNrZWRFdmVudCk7CisJCX0gLy8gZm9yIGVhY2ggSVNPS2V5UGlja2VkRXZlbnRMaXN0ZW5lcgorCX0KKwkKKwlwdWJsaWMgUG9pbnQgZ2V0UmVnaW9uTGlzdFNpemUoKSB7CisJCXJldHVybiBmaWx0ZXJlZExpc3QuZ2V0U2l6ZSgpOworCX0KKwkKKwlwdWJsaWMgUmVjdGFuZ2xlIGdldFJlZ2lvbkxpc3RCb3VuZHMoKSB7CisJCXJldHVybiBmaWx0ZXJlZExpc3QuZ2V0Qm91bmRzKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFJlZ2lvbkxpc3RTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworCQlmaWx0ZXJlZExpc3Quc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0UmVnaW9uTGlzdEJvdW5kcyhpbnQgeDAsIGludCB5MCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisJCWZpbHRlcmVkTGlzdC5zZXRCb3VuZHMoeDAseTAsd2lkdGgsIGhlaWdodCk7CisJfQorCQorfSAvLyBJU09LZXlQaWNrZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2lkZ2V0cy9Mb2NhdGlvblBpY2tlckRpYWxvZy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aWRnZXRzL0xvY2F0aW9uUGlja2VyRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmZDA2YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2lkZ2V0cy9Mb2NhdGlvblBpY2tlckRpYWxvZy5qYXZhCkBAIC0wLDAgKzEsNDQ1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2lkZ2V0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuR2VvZ3JhcGhpY01hcHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5Lkdlb2dyYXBoaWNOYW1lczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLkxvY2F0aW9uVXRpbGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CisKK3B1YmxpYyBjbGFzcyBMb2NhdGlvblBpY2tlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7CisKKwlwcml2YXRlIFN0cmluZyB0aXRsZTsKKwkKKwlwcml2YXRlIElTT0tleVBpY2tlciBpc29LZXlQaWNrZXIyOworCXByaXZhdGUgSVNPS2V5UGlja2VyIGlzb0tleVBpY2tlcjE7CisJcHJpdmF0ZSBJU09LZXlQaWNrZXIgaXNvS2V5UGlja2VyMDsKKwlwcml2YXRlIElTT0tleVBpY2tlciBpc29LZXlQaWNrZXIzOworCVN0cmluZyBpc29LZXkgPSAiIjsgLy8kTk9OLU5MUy0xJAorCVVSSSB0YXJnZXRVUkkgPSBudWxsOworCVN0cmluZyB0ZW1wSVNPS2V5ID0gbnVsbDsKKwkvL1N0cmluZyBwcmV2TG9jID0gbnVsbDsKKwlJUHJvamVjdCBwcm9qZWN0OworCXByaXZhdGUgYm9vbGVhbiBzZWxlY3RHbG9iYWwgPSB0cnVlOworCQorCWJvb2xlYW4gY2FuY2VsUHJlc3NlZCA9IGZhbHNlOworCXByb3RlY3RlZCBTaGVsbCBzaGVsbDsKKwlDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZTsKKwlwdWJsaWMgTG9jYXRpb25QaWNrZXJEaWFsb2cgKFNoZWxsIHBhcmVudCwgaW50IHN0eWxlLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBwcmV2TG9jLCBJUHJvamVjdCBwKSB7CisJCXN1cGVyIChwYXJlbnQsIHN0eWxlKTsKKwkJLy9zZXRTaGVsbFN0eWxlKFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5SRVNJWkUgfCBTV1QuTUFYIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKKwkJdGhpcy50aXRsZSA9IHRpdGxlOworCQkvL3RoaXMucHJldkxvYyA9IHByZXZMb2M7CisJCXRoaXMucHJvamVjdCA9IHA7CisJCQorCX0KKwkKKwkvKioKKwkgKiBvcGVuIHRoZSBtb2RhbCB3aW5kb3cuIAorCSAqIEByZXR1cm4gVGhlIFN0cmluZ1tdIHdpdGggcmVzdWx0cywgb3IgbnVsbCBpZiBjYW5jZWwgd2FzIHByZXNzZWQuCisJICovCisJcHVibGljIE9iamVjdCBbXSAgb3BlbiAoKSB7CisJCVNoZWxsIHBhcmVudCA9IGdldFBhcmVudCgpOworCQlzaGVsbCA9IG5ldyBTaGVsbChwYXJlbnQsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5NQVggfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOworCQkvL3NoZWxsID0gbmV3IFNoZWxsKHBhcmVudCwgU1dULkRJQUxPR19UUklNIHwgU1dULlJFU0laRSB8IFNXVC5NQVggfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOworCQkKKwkJCisJCWZpbmFsIFBvaW50IG1pblMgPSBuZXcgUG9pbnQoNjc3LCA0MTApOworCQlzaGVsbC5zZXRNaW5pbXVtU2l6ZShtaW5TKTsKKwkKKwkJR3JpZExheW91dCBnbDEgPSBuZXcgR3JpZExheW91dCgpOworCQlnbDEubnVtQ29sdW1ucyA9IDE7CisJCXNoZWxsLnNldExheW91dChnbDEpOworCQlzaGVsbC5zZXRUZXh0KHRpdGxlKTsKKwkJCisJCW1haW5Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTUFYKTsKKwkJLy9tYWluQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULlJFU0laRSB8IFNXVC5NQVgpOworCQkKKwkJCisJCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lcigpIHsKKwkJICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgeworCQkgICAgICAgIAorLy8JCSAgICAJICBSZWN0YW5nbGUgYiA9IHNoZWxsLmdldEJvdW5kcygpOworLy8JCSAgICAJICBtYWluQ29tcG9zaXRlLnNldEJvdW5kcyhiKTsKKwkJICAgIAkvLyAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogIFNIRUxMICoqKiBib3VuZHMgaD0gIitiLmhlaWdodCsiICB3PSAiK2Iud2lkdGgrIiA6IHgwID0gIitiLngrIiB5MCA9ICIrYi55KTsKKwkJICAgIAkgIAorLy8JCSAgICAJICBpbnQgdyA9IGIud2lkdGgvMzsKKy8vCQkgICAgCSAgaW50IGggPSBiLmhlaWdodC80OworLy8JCSAgICAJICBSZWN0YW5nbGUgcjAgPSBpc29LZXlQaWNrZXIwLmdldFJlZ2lvbkxpc3RCb3VuZHMoKTsKKy8vCQkgICAgCSAgaW50IHgwID0gcjAueDsKKy8vCQkgICAgCSAgaW50IHkwID0gcjAueTsKKy8vCQkgICAgCSAgCisvLwkJICAgIAkgIHJlU2V0S2V5UGlja2VyU2l6ZSh3LGgpOworCQkgICAgCSAgc2hlbGwucGFjaygpOyAvLyByZXNldHMgdGhlIHNpemUgYmFjayB0byB0aGUgb3JpZ2luYWwgISEKKwkJICAgIAkgIAorLy8JCSAgICAJICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBib3VuZHMgaD0gIitiLmhlaWdodCsiICB3PSAiK2Iud2lkdGgrIiA6IHgwID0gIit4MCsiIHkwID0gIit5MCk7CisvLwkJICAgIAkgIFJlY3RhbmdsZSBiMCA9IGlzb0tleVBpY2tlcjAuZ2V0UmVnaW9uTGlzdEJvdW5kcygpOworLy8JCSAgICAJICBTeXN0ZW0ub3V0LnByaW50bG4oImtleXBpY2tlcjAgaD0gIitiMC5oZWlnaHQrIiAgdz0gIitiMC53aWR0aCk7CisvLwkJICAgIAkgIFJlY3RhbmdsZSBiMSA9IGlzb0tleVBpY2tlcjEuZ2V0UmVnaW9uTGlzdEJvdW5kcygpOworLy8JCSAgICAJICBTeXN0ZW0ub3V0LnByaW50bG4oImtleXBpY2tlcjEgaD0gIitiMS5oZWlnaHQrIiAgdz0gIitiMS53aWR0aCk7CisvLwkJICAgIAkgIFJlY3RhbmdsZSBiMiA9IGlzb0tleVBpY2tlcjIuZ2V0UmVnaW9uTGlzdEJvdW5kcygpOworLy8JCSAgICAJICBTeXN0ZW0ub3V0LnByaW50bG4oImtleXBpY2tlcjIgaD0gIitiMi5oZWlnaHQrIiAgdz0gIitiMi53aWR0aCk7CisvLwkJICAgIAkgIFJlY3RhbmdsZSBiMyA9IGlzb0tleVBpY2tlcjMuZ2V0UmVnaW9uTGlzdEJvdW5kcygpOworLy8JCSAgICAJICBTeXN0ZW0ub3V0LnByaW50bG4oImtleXBpY2tlcjMgaD0gIitiMy5oZWlnaHQrIiAgdz0gIitiMy53aWR0aCk7CisJCSAgICAgIH0KKwkJICAgIH0pOworCQkKKwkJCisJCSAKKwkJR3JpZExheW91dCBtYWluTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbWFpbkxheW91dC5udW1Db2x1bW5zID0gMjsKKwkJbWFpbkxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOworCQkKKwkJbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXQobWFpbkxheW91dCk7CisJCWZpbmFsIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKKwkJLy9maW5hbCBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSKTsKKwkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDM3ODsKKwkJZ3JpZERhdGEud2lkdGhIaW50ID0gNjY3OworCisJCW1haW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisJCQorCQkvLyBSYWRpbyBidXR0b25zCisJCUNvbXBvc2l0ZSByYWRpb0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJICAgIEZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7CisJICAgIGZpbGxMYXlvdXQudHlwZSA9IFNXVC5IT1JJWk9OVEFMOworCSAgICByYWRpb0NvbXBvc2l0ZS5zZXRMYXlvdXQoZmlsbExheW91dCk7CisJICAgIAorCSAgICBmaW5hbCBCdXR0b24gW10gcmFkaW9CdXR0b25zID0gbmV3IEJ1dHRvblsyXTsKKwkgICAgcmFkaW9CdXR0b25zWzBdID0gbmV3IEJ1dHRvbihyYWRpb0NvbXBvc2l0ZSwgU1dULlJBRElPKTsKKwkgICAgcmFkaW9CdXR0b25zWzBdLnNldFNlbGVjdGlvbih0cnVlKTsKKwkgICAgcmFkaW9CdXR0b25zWzBdLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJOTG9jUGlja2VyV2l6Lmdsb2JhbCIpKTsvLyROT04tTkxTLTEkCisJICAgIAorCSAgICByYWRpb0J1dHRvbnNbMV0gPSBuZXcgQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBTV1QuUkFESU8pOworCSAgICByYWRpb0J1dHRvbnNbMV0uc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIk5Mb2NQaWNrZXJXaXouaW5wcm9qZWN0IikpOy8vJE5PTi1OTFMtMSQKKwkgICAgCSAgICAKKwkgICAgTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7CisJICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCSAgICAgICAgICBpZiAoZXZlbnQud2lkZ2V0ID09IHJhZGlvQnV0dG9uc1swXSkgeworCSAgICAgICAgCSAgaWYocmFkaW9CdXR0b25zWzBdLmdldFNlbGVjdGlvbigpKSB7CisJICAgICAgICAJCSAgc2VsZWN0R2xvYmFsID0gdHJ1ZTsKKwkgICAgICAgIAkJICByZWluaXQoKTsKKwkgICAgICAgIAkgIH0gZWxzZSB7CisJICAgICAgICAJCSAgc2VsZWN0R2xvYmFsID0gZmFsc2U7CisJICAgICAgICAJCSAgcmVpbml0KCk7CisJICAgICAgICAJICB9CisJICAgICAgICAgIH0KKwkgICAgICAgIH0KKwkgICAgfTsKKwkgICAgcmFkaW9CdXR0b25zWzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sbGlzdGVuZXIpOworCSAgICAKKwkgICAgR3JpZERhdGEgZ2RfcmFkaW8gPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKKwkgICAgZ2RfcmFkaW8uaG9yaXpvbnRhbFNwYW4gPSAyOworCSAgICByYWRpb0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkX3JhZGlvKTsKKwkJCisJICAgIExvY2F0aW9uVXRpbGl0eS5yZXNldCgpOworCSAgICAvLyBMb2NhdGlvbiBwaWNrZXIKKwkJLy8gSVNPIEtleQorCQlmaW5hbCBMYWJlbCBpc29LZXlMYWJlbCA9IG5ldyBMYWJlbChtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWlzb0tleUxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJOTG9jV2l6SVNPSyIpKTsgLy8kTk9OLU5MUy0xJAorCQlmaW5hbCBHcmlkRGF0YSBnZF9pc29LZXlMYWJlbCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOworCQlpc29LZXlMYWJlbC5zZXRMYXlvdXREYXRhKGdkX2lzb0tleUxhYmVsKTsKKwkJCisJCWZpbmFsIExhYmVsIGlzb2tleVZhbHVlTGFiZWwgPSBuZXcgTGFiZWwobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlpc29rZXlWYWx1ZUxhYmVsLnNldFRleHQoaXNvS2V5KTsKKworCQlmaW5hbCBHcmlkRGF0YSBnZF9pc29LZXlMYWJlbFZhbHVlID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7CisJCWlzb2tleVZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShnZF9pc29LZXlMYWJlbFZhbHVlKTsKKwkJCisJCQorCQkvLyBJU09LZXlQaWNrZXIgMAorCQlpc29LZXlQaWNrZXIwID0gbmV3IElTT0tleVBpY2tlcihtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSwgMCk7CisJCWlzb0tleVBpY2tlcjAuc2V0SVNPS2V5TGV2ZWwoMCk7CisJCWlzb0tleVBpY2tlcjAuc2V0SVNPS2V5TGV2ZWxEZXNjcmlwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIk5Mb2NXaXpDTlRSWSIpKTsKKwkJaXNvS2V5UGlja2VyMC5hZGRJU09LZXlQaWNrZWRMaXN0ZW5lcihuZXcgSVNPS2V5UGlja2VkRXZlbnRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGlzb0tleVBpY2tlZChmaW5hbCBJU09LZXlQaWNrZWRFdmVudCBpa3BlKSB7CisJCQkJT2JqZWN0W10gaXNvS2V5cyA9IG51bGw7CisJCQkJCWlmKHNlbGVjdEdsb2JhbCkgaXNvS2V5cz0gR2VvZ3JhcGhpY05hbWVzLmdldFN1YklTT0tleXMoCisJCQkJCQlHZW9ncmFwaGljTmFtZXMuZ2V0QWxwaGEyKGlrcGUuZ2V0SXNvS2V5KCkpLAorCQkJCQkJaXNvS2V5UGlja2VyMS5nZXRJU09LZXlMZXZlbCgpKTsKKwkJCQkJZWxzZSBpc29LZXlzID0gTG9jYXRpb25VdGlsaXR5LmdldEtleXMocHJvamVjdCwgaXNvS2V5UGlja2VyMS5nZXRJU09LZXlMZXZlbCgpLCBpa3BlLmdldElzb0tleSgpKS50b0FycmF5KCk7CisJCQkJaXNvS2V5UGlja2VyMS5zZXRJU09LZXlzKGlzb0tleXMpOworCQkJCWlzb0tleVBpY2tlcjIuc2V0SVNPS2V5cyhuZXcgT2JqZWN0W10ge30pOworCQkJCWlzb0tleVBpY2tlcjMuc2V0SVNPS2V5cyhuZXcgT2JqZWN0W10ge30pOworCQkJCWlzb0tleSA9IGlrcGUuZ2V0SXNvS2V5KCk7CisJCQkJaWYoIXNlbGVjdEdsb2JhbCkgdGFyZ2V0VVJJID0gTG9jYXRpb25VdGlsaXR5LmdldFVSSUZyb21JU09LZXkoaXNvS2V5KTsKKwkJCQl0ZW1wSVNPS2V5ID0gaXNvS2V5OworCQkJCWlzb2tleVZhbHVlTGFiZWwuc2V0VGV4dChpc29LZXkpOworCQkJfQorCQl9KTsKKwkJCisJCS8vIElTT0tleVBpY2tlciAxCisJCWlzb0tleVBpY2tlcjEgPSBuZXcgSVNPS2V5UGlja2VyKG1haW5Db21wb3NpdGUsIFNXVC5OT05FLCAxKTsKKwkJaXNvS2V5UGlja2VyMS5zZXRJU09LZXlMZXZlbERlc2NyaXB0aW9uKE1lc3NhZ2VzCisJCQkJLmdldFN0cmluZygiTkxvY1dpekwxIikpOworCQlpc29LZXlQaWNrZXIxLmFkZElTT0tleVBpY2tlZExpc3RlbmVyKG5ldyBJU09LZXlQaWNrZWRFdmVudExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgaXNvS2V5UGlja2VkKGZpbmFsIElTT0tleVBpY2tlZEV2ZW50IGlrcGUpIHsKKwkJCQlPYmplY3RbXSBpc29LZXlzID0gbnVsbDsKKwkJCQlpZihzZWxlY3RHbG9iYWwpIGlzb0tleXMgPSBHZW9ncmFwaGljTmFtZXMuZ2V0U3ViSVNPS2V5cyhpa3BlCisJCQkJCQkuZ2V0SXNvS2V5KCksIGlzb0tleVBpY2tlcjIuZ2V0SVNPS2V5TGV2ZWwoKSk7CisJCQkJZWxzZSBpc29LZXlzID0gTG9jYXRpb25VdGlsaXR5LmdldEtleXMocHJvamVjdCwgaXNvS2V5UGlja2VyMi5nZXRJU09LZXlMZXZlbCgpLCBpa3BlLmdldElzb0tleSgpKS50b0FycmF5KCk7CisJCQkJCisJCQkJaXNvS2V5UGlja2VyMi5zZXRJU09LZXlzKGlzb0tleXMpOworCQkJCWlzb0tleSA9IGlrcGUuZ2V0SXNvS2V5KCk7CisJCQkJaWYoIXNlbGVjdEdsb2JhbCkgdGFyZ2V0VVJJID0gTG9jYXRpb25VdGlsaXR5LmdldFVSSUZyb21JU09LZXkoaXNvS2V5KTsKKwkJCQl0ZW1wSVNPS2V5ID0gdGVtcElTT0tleSA9PSBudWxsID8gaXNvS2V5IDogdGVtcElTT0tleTsKKwkJCQkvLyBXZXJlIHRoZXJlIGFueSBJU08ga2V5cyB0byBzZXQ/CisJCQkJaWYgKGlzb0tleXMubGVuZ3RoID09IDApIHsKKwkJCQkJLy8gTm8KKwkJCQkJaXNvS2V5ID0gdGVtcElTT0tleTsKKwkJCQkJaXNva2V5VmFsdWVMYWJlbC5zZXRUZXh0KGlzb0tleSk7CisJCQkJCXRlbXBJU09LZXkgPSBudWxsOworCQkJCX0gLy8gaWYKKwkJCX0KKwkJfSk7CisJCQorCQkvLyBJU09LZXlQaWNrZXIgMgorCQlpc29LZXlQaWNrZXIyID0gbmV3IElTT0tleVBpY2tlcihtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSwgMik7CisJCWlzb0tleVBpY2tlcjIuc2V0SVNPS2V5TGV2ZWxEZXNjcmlwdGlvbihNZXNzYWdlcworCQkJCS5nZXRTdHJpbmcoIk5Mb2NXaXpMMiIpKTsKKwkJaXNvS2V5UGlja2VyMi5hZGRJU09LZXlQaWNrZWRMaXN0ZW5lcihuZXcgSVNPS2V5UGlja2VkRXZlbnRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGlzb0tleVBpY2tlZChmaW5hbCBJU09LZXlQaWNrZWRFdmVudCBpa3BlKSB7CisJCQkJT2JqZWN0W10gaXNvS2V5cyA9IG51bGw7CisJCQkJaWYoc2VsZWN0R2xvYmFsKSBpc29LZXlzID0gR2VvZ3JhcGhpY05hbWVzLmdldFN1YklTT0tleXMoaWtwZQorCQkJCQkJLmdldElzb0tleSgpLCBpc29LZXlQaWNrZXIzLmdldElTT0tleUxldmVsKCkpOworCQkJCWVsc2UgaXNvS2V5cyA9IExvY2F0aW9uVXRpbGl0eS5nZXRLZXlzKHByb2plY3QsIGlzb0tleVBpY2tlcjMuZ2V0SVNPS2V5TGV2ZWwoKSwgaWtwZS5nZXRJc29LZXkoKSkudG9BcnJheSgpOworCQkJCWlzb0tleVBpY2tlcjMuc2V0SVNPS2V5cyhpc29LZXlzKTsKKwkJCQlpc29LZXkgPSBpa3BlLmdldElzb0tleSgpOworCQkJCWlmKCFzZWxlY3RHbG9iYWwpIHRhcmdldFVSSSA9IExvY2F0aW9uVXRpbGl0eS5nZXRVUklGcm9tSVNPS2V5KGlzb0tleSk7CisJCQkJdGVtcElTT0tleSA9IHRlbXBJU09LZXkgPT0gbnVsbCA/IGlzb0tleSA6IHRlbXBJU09LZXk7CisJCQkJLy8gV2VyZSB0aGVyZSBhbnkgSVNPIGtleXMgdG8gc2V0PworCQkJCWlmIChpc29LZXlzLmxlbmd0aCA9PSAwKSB7CisJCQkJCS8vIE5vCisJCQkJCWlzb0tleSA9IHRlbXBJU09LZXk7CisJCQkJCWlzb2tleVZhbHVlTGFiZWwuc2V0VGV4dChpc29LZXkpOworCQkJCQl0ZW1wSVNPS2V5ID0gbnVsbDsKKwkJCQl9IC8vIGlmCisJCQl9CisJCX0pOworCQkKKwkJLy8gSVNPS2V5UGlja2VyIDMKKwkJaXNvS2V5UGlja2VyMyA9IG5ldyBJU09LZXlQaWNrZXIobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUsIDMpOworCQlpc29LZXlQaWNrZXIzLnNldElTT0tleUxldmVsRGVzY3JpcHRpb24oTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJOTG9jV2l6TDMiKSk7CisJCWlzb0tleVBpY2tlcjMuYWRkSVNPS2V5UGlja2VkTGlzdGVuZXIobmV3IElTT0tleVBpY2tlZEV2ZW50TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBpc29LZXlQaWNrZWQoZmluYWwgSVNPS2V5UGlja2VkRXZlbnQgaWtwZSkgeworCQkJCWlzb0tleSA9IHRlbXBJU09LZXkgPT0gbnVsbCA/IGlrcGUuZ2V0SXNvS2V5KCkgOiB0ZW1wSVNPS2V5OworCQkJCWlzb2tleVZhbHVlTGFiZWwuc2V0VGV4dChpc29LZXkpOworCQkJCXRlbXBJU09LZXkgPSBudWxsOworCQkJfQorCQl9KTsKKwkJCisJCQorCQkvLyAgIEZPUk0gREFUQSAgIC8vCisJCXNldEtleVBpY2tlckxheW91dHMoKTsKKwkJCisJCQorCQlmaW5hbCBCdXR0b24gb2theUJ1dHRvbiA9IG5ldyBCdXR0b24obWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlva2F5QnV0dG9uLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJOTG9jV2l6T2siKSk7CisJCW9rYXlCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7CisJCQorCQlCdXR0b24gY2FuY2VsQnV0dG9uID0gbmV3IEJ1dHRvbihtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWdkID0gbmV3IEdyaWREYXRhKCk7CisJCWNhbmNlbEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiTkxvY1dpekNhbmNlbCIpKTsKKwkJY2FuY2VsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOworCQkvLyBnZXRTaGVsbCgpLnBhY2soKTsKKwkJc2hlbGwucGFjaygpOworCQlzaGVsbC5vcGVuKCk7CisJCQorCQkKKwkJb2theUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7CisJCQkJY2FuY2VsUHJlc3NlZD1mYWxzZTsKKwkJCQlzaGVsbC5kaXNwb3NlKCk7CisJCQl9CisJCQkKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCQorCQkJfQorCQl9KTsKKwkJCisJCWNhbmNlbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7CisJCQkJY2FuY2VsUHJlc3NlZD10cnVlOworCQkJCXNoZWxsLmRpc3Bvc2UoKTsKKwkJCX0KKwkJCQorCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJCisJCQl9CisJCX0pOworCQkKKwkJCisJCURpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7CisJCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7CisJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOworCQl9CisJCWlmKGNhbmNlbFByZXNzZWQpIHJldHVybiBudWxsOworCQlPYmplY3QgW10gcmV0ID0gbmV3IE9iamVjdFsyXTsKKwkJcmV0WzBdID0gdGhpcy5pc29LZXk7CisJCXJldFsxXSA9IHRoaXMudGFyZ2V0VVJJOworCQlyZXR1cm4gcmV0OworCX0vLyBvcGVuKCkKKwkKKwkKKwkKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRLZXlQaWNrZXJMYXlvdXRzKCkgeworCQkvLyBJU08gUGlja2VyMAorCQkvL2ZpbmFsIEdyaWREYXRhIGdkX2lzb0tleVBpY2tlcjAgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgdHJ1ZSwgdHJ1ZSk7CisJCWZpbmFsIEdyaWREYXRhIGdkX2lzb0tleVBpY2tlcjAgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJZ2RfaXNvS2V5UGlja2VyMC52ZXJ0aWNhbFNwYW49MTsKKwkJZ2RfaXNvS2V5UGlja2VyMC5ob3Jpem9udGFsU3Bhbj0xOworCQkvL2dkX2lzb0tleVBpY2tlcjAuIFVwcGVyIGxlZnQKKwkJLy9maW5hbCBHcmlkRGF0YSBnZF9pc29LZXlQaWNrZXIwID0gbmV3IEdyaWREYXRhKFNXVC5DRU5URVJfSE9SSVpPTlRBTCk7CisJCWlzb0tleVBpY2tlcjAuc2V0TGF5b3V0RGF0YShnZF9pc29LZXlQaWNrZXIwKTsKKwkJaXNvS2V5UGlja2VyMC5zZXRJU09LZXlzKEdlb2dyYXBoaWNOYW1lcy5nZXRTdWJJU09LZXlzKAorCQkJCUdlb2dyYXBoaWNNYXBwZXIuRUFSVEhfQUxQSEEzX0lTT19LRVksIC0xKSk7CisKKwkJLy8gSVNPS2V5UGlja2VyIDEJCVVwcGVyIHJpZ2h0CisJCWZpbmFsIEdyaWREYXRhIGdkX2lzb0tleVBpY2tlcjEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJZ2RfaXNvS2V5UGlja2VyMS52ZXJ0aWNhbFNwYW49MTsKKwkJZ2RfaXNvS2V5UGlja2VyMS5ob3Jpem9udGFsU3Bhbj0xOworCQlpc29LZXlQaWNrZXIxLnNldExheW91dERhdGEoZ2RfaXNvS2V5UGlja2VyMSk7CisJCQorCQkvLyBJU09LZXlQaWNrZXIgMiBsb3dlciBsZWZ0CisJCWZpbmFsIEdyaWREYXRhIGdkX2lzb0tleVBpY2tlcjIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJZ2RfaXNvS2V5UGlja2VyMi52ZXJ0aWNhbFNwYW49MTsKKwkJZ2RfaXNvS2V5UGlja2VyMi5ob3Jpem9udGFsU3Bhbj0xOworCQlpc29LZXlQaWNrZXIyLnNldExheW91dERhdGEoZ2RfaXNvS2V5UGlja2VyMik7CisJCisJCS8vIElTT0tleVBpY2tlciAzIGxvd2VyIHJpZ2h0CisJCWZpbmFsIEdyaWREYXRhIGdkX2lzb0tleVBpY2tlcjMgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJZ2RfaXNvS2V5UGlja2VyMy52ZXJ0aWNhbFNwYW49MTsKKwkJZ2RfaXNvS2V5UGlja2VyMy5ob3Jpem9udGFsU3Bhbj0xOworCQkvL2ZkX2lzb0tleVBpY2tlcjMuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOworCQlpc29LZXlQaWNrZXIzLnNldExheW91dERhdGEoZ2RfaXNvS2V5UGlja2VyMyk7CisJfQorCQorCS8qKgorCSAqIAorCSAqIEBwYXJhbSB3aWR0aAorCSAqIEBwYXJhbSBoZWlnaHQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZVNldEtleVBpY2tlckJvdW5kcyhpbnQgd2lkdGgsIGludCBoZWlnaHQsaW50IHgwLCBpbnQgeTApIHsKKwkJaXNvS2V5UGlja2VyMC5zZXRSZWdpb25MaXN0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKwkJaXNvS2V5UGlja2VyMS5zZXRSZWdpb25MaXN0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKwkJaXNvS2V5UGlja2VyMi5zZXRSZWdpb25MaXN0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKwkJaXNvS2V5UGlja2VyMy5zZXRSZWdpb25MaXN0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKwkJaXNvS2V5UGlja2VyMC5zZXRSZWdpb25MaXN0Qm91bmRzKHgwLHkwLHdpZHRoLCBoZWlnaHQpOworCQlpc29LZXlQaWNrZXIxLnNldFJlZ2lvbkxpc3RCb3VuZHMoeDArd2lkdGgsIHkwLCB3aWR0aCwgaGVpZ2h0KTsKKwkJaXNvS2V5UGlja2VyMi5zZXRSZWdpb25MaXN0Qm91bmRzKHgwLCB5MCtoZWlnaHQsIHdpZHRoLCBoZWlnaHQpOworCQlpc29LZXlQaWNrZXIzLnNldFJlZ2lvbkxpc3RCb3VuZHMoeDArd2lkdGgsIHkwK2hlaWdodCwgd2lkdGgsIGhlaWdodCk7CisJCQorCX0KKwkKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gd2lkdGgKKwkgKiBAcGFyYW0gaGVpZ2h0CisJICovCisJcHVibGljIHZvaWQgcmVTZXRLZXlQaWNrZXJTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworCQlpc29LZXlQaWNrZXIwLnNldFJlZ2lvbkxpc3RTaXplKHdpZHRoLCBoZWlnaHQpOworCQlpc29LZXlQaWNrZXIxLnNldFJlZ2lvbkxpc3RTaXplKHdpZHRoLCBoZWlnaHQpOworCQlpc29LZXlQaWNrZXIyLnNldFJlZ2lvbkxpc3RTaXplKHdpZHRoLCBoZWlnaHQpOworCQlpc29LZXlQaWNrZXIzLnNldFJlZ2lvbkxpc3RTaXplKHdpZHRoLCBoZWlnaHQpOworCQkKKwl9CisJCisJCisJLyoqCisJICogCisJICovCisJcHVibGljIHZvaWQgcmVpbml0KCkgeworCQkKKwkJaWYoc2VsZWN0R2xvYmFsKQorCQkJaXNvS2V5UGlja2VyMC5zZXRJU09LZXlzKEdlb2dyYXBoaWNOYW1lcy5nZXRTdWJJU09LZXlzKAorCQkJCUdlb2dyYXBoaWNNYXBwZXIuRUFSVEhfQUxQSEEzX0lTT19LRVksIC0xKSk7CisJCWVsc2UgeworCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGdldEtleXMgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgeworCSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB7CisJICAgICAgICAgICAgCXByb2dyZXNzLmJlZ2luVGFzayhNZXNzYWdlcy5nZXRTdHJpbmcoIk5Mb2NQaWNrZXJXaXouZ2V0dGluZ0xvY2F0aW9ucyIpLCAxMDApOyAgIAkKKwkgICAgICAgIAkJaXNvS2V5UGlja2VyMC5zZXRJU09LZXlzKExvY2F0aW9uVXRpbGl0eS5nZXRLZXlzKHByb2plY3QsIDAsIG51bGwpLnRvQXJyYXkoKSk7CisJICAgICAgICAgICAgCXByb2dyZXNzLndvcmtlZCgxMDApOworCSAgICAgICAgICAgIAlwcm9ncmVzcy5kb25lKCk7CisJICAgICAgICAgICAgfQorCQkJfTsKKwkJCQorCQkJSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCk7CisJCQl0cnkgeworCQkJCWNvbnRleHQucnVuKHRydWUsIHRydWUsIGdldEtleXMpOworCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgeworCQkJCUFjdGl2YXRvci5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl9CisJCQkKKwkJfQorCQlpc29LZXlQaWNrZXIxLnNldElTT0tleXMobmV3IE9iamVjdFtdIHt9KTsKKwkJaXNvS2V5UGlja2VyMi5zZXRJU09LZXlzKG5ldyBPYmplY3RbXSB7fSk7CisJCWlzb0tleVBpY2tlcjMuc2V0SVNPS2V5cyhuZXcgT2JqZWN0W10ge30pOworCisJfQorCQorCS8qKgorCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElTT0tleSgpIHsKKwkJcmV0dXJuIGlzb0tleTsKKwl9CisJCisvLwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgeworLy8JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7CisvLwkgICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7CisvLwkgICAgCQkKKy8vCQlMb2NhdGlvblBpY2tlckRpYWxvZzIgZGlhbG9nICA9IG5ldyBMb2NhdGlvblBpY2tlckRpYWxvZzIoc2hlbGwsIFNXVC5SRVNJWkV8U1dULlBVU0gsICJQaWNrIGxvY2F0aW9uIiwgIiIsIG51bGwpOwkJIAorLy8JICAgIGRpYWxvZy5vcGVuKCk7CisvLwkgICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKKy8vCSAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgeworLy8JICAgICAgICBkaXNwbGF5LnNsZWVwKCk7CisvLwkgICAgICB9CisvLwkgICAgfQorLy8JICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGlja2VkIGxvY2F0aW9uOiIrZGlhbG9nLmdldElTT0tleSgpKTsKKy8vCSAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKKy8vCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2lkZ2V0cy9NYXRyaXhFZGl0b3JEaWFsb2cuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2lkZ2V0cy9NYXRyaXhFZGl0b3JEaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTRhZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aWRnZXRzL01hdHJpeEVkaXRvckRpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2lkZ2V0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuTWF0cml4RWRpdG9yV2lkZ2V0Lk1hdHJpeEVkaXRvckV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2lkZ2V0cy5NYXRyaXhFZGl0b3JXaWRnZXQuTWF0cml4RWRpdG9yVmFsaWRhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKK3B1YmxpYyBjbGFzcyBNYXRyaXhFZGl0b3JEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgeworCisJcHJpdmF0ZSBzaG9ydCByb3dzLCBjb2x1bW5zOworCXByaXZhdGUgU3RyaW5nIFtdIHJvd05hbWVzLCBjb2xOYW1lczsKKwlwcml2YXRlIGJvb2xlYW4gZml4ZWRTaXplOworCXByaXZhdGUgU3RyaW5nIHRpdGxlOworCU1hdHJpeEVkaXRvclZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOworCWJvb2xlYW4gY2FuY2VsUHJlc3NlZCA9IGZhbHNlOworCVN0cmluZyBbXSBleGlzdGluZ1ZhbHMgPSBudWxsOworCQorCXB1YmxpYyBNYXRyaXhFZGl0b3JEaWFsb2cgKFNoZWxsIHBhcmVudCwgaW50IHN0eWxlLCBTdHJpbmcgdGl0bGUsIHNob3J0IHJvd3MsIHNob3J0IGNvbHVtbnMsIFN0cmluZ1tdIHJvd25hbWVzLCBTdHJpbmcgW10gY29sdW1uTmFtZXMsIFN0cmluZyBbXSBleGlzdGluZ1ZhbHMsIGJvb2xlYW4gZml4ZWRTaXplLCBNYXRyaXhFZGl0b3JWYWxpZGF0b3IgdmFsaWRhdG9yKSB7CisJCXN1cGVyIChwYXJlbnQsIHN0eWxlKTsKKwkJdGhpcy5yb3dzID0gcm93czsKKwkJdGhpcy5jb2x1bW5zID0gY29sdW1uczsKKwkJdGhpcy5yb3dOYW1lcyA9IHJvd25hbWVzOworCQl0aGlzLmNvbE5hbWVzID0gY29sdW1uTmFtZXM7CisJCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOworCQl0aGlzLnRpdGxlID0gdGl0bGU7CisJCXRoaXMuZml4ZWRTaXplID0gZml4ZWRTaXplOworCQl0aGlzLmV4aXN0aW5nVmFscyA9IGV4aXN0aW5nVmFsczsKKwl9CisJCisJLyoqCisJICogb3BlbiB0aGUgbW9kYWwgd2luZG93LiAKKwkgKiBAcmV0dXJuIFRoZSBTdHJpbmdbXSB3aXRoIHJlc3VsdHMsIG9yIG51bGwgaWYgY2FuY2VsIHdhcyBwcmVzc2VkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgW10gb3BlbiAoKSB7CisJCVNoZWxsIHBhcmVudCA9IGdldFBhcmVudCgpOworCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChwYXJlbnQsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7CisJCXNoZWxsLnNldFRleHQodGl0bGUpOworCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJZ2wubnVtQ29sdW1ucyA9IDI7CisJCXNoZWxsLnNldExheW91dChnbCk7CisJCQorCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7CisJCWZpbmFsIE1hdHJpeEVkaXRvcldpZGdldCB3aWRnZXQgPSBuZXcgTWF0cml4RWRpdG9yV2lkZ2V0KHNoZWxsLCBTV1QuTk9ORSwgcm93cywgY29sdW1ucywgcm93TmFtZXMsIGNvbE5hbWVzLCBleGlzdGluZ1ZhbHMsIGZpeGVkU2l6ZSwgdmFsaWRhdG9yKTsKKwkJd2lkZ2V0LnNldExheW91dERhdGEoZ2QpOworCQkKKwkJZmluYWwgQnV0dG9uIG9rYXlCdXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuTk9ORSk7CisJCWdkID0gbmV3IEdyaWREYXRhKCk7CisJCW9rYXlCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIk1hdHJpeC5kaWFsb2cub2theSIpKTsKKwkJb2theUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKKwkJCisJCUJ1dHRvbiBjYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuTk9ORSk7CisJCWdkID0gbmV3IEdyaWREYXRhKCk7CisJCWNhbmNlbEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiTWF0cml4LmRpYWxvZy5jYW5jZWwiKSk7CisJCWNhbmNlbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKKwkJCisJCXNoZWxsLnBhY2soKTsKKwkJc2hlbGwub3BlbigpOworCQkKKwkJCisJCXdpZGdldC5hZGRMaXN0ZW5lcihuZXcgTWF0cml4RWRpdG9yV2lkZ2V0Lk1hdHJpeEVkaXRvckxpc3RlbmVyKCkgeworCQkJCisJCQlwdWJsaWMgdm9pZCBldmVudFJlY2VpdmVkKE1hdHJpeEVkaXRvcldpZGdldC5NYXRyaXhFZGl0b3JFdmVudCBldmVudCkgeworCQkJCWlmKGV2ZW50LnN0YXR1cyA9PSBNYXRyaXhFZGl0b3JXaWRnZXQuU1RBVFVTLklOVkFMSURfVkFMVUUpCisJCQkJCW9rYXlCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJZWxzZSBva2F5QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisJCQl9CisJCX0pOworCQkKKwkJb2theUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7CisJCQkJY2FuY2VsUHJlc3NlZD1mYWxzZTsKKwkJCQlzaGVsbC5kaXNwb3NlKCk7CisJCQl9CisJCQkKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCQorCQkJfQorCQl9KTsKKwkJCisJCWNhbmNlbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7CisJCQkJY2FuY2VsUHJlc3NlZD10cnVlOworCQkJCXNoZWxsLmRpc3Bvc2UoKTsKKwkJCX0KKwkJCQorCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJCisJCQl9CisJCX0pOworCQkKKwkJRGlzcGxheSBkaXNwbGF5ID0gcGFyZW50LmdldERpc3BsYXkoKTsKKwkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKKwkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7CisJCX0KKwkJCisJCQorCQlpZighY2FuY2VsUHJlc3NlZCkgeworCQkJU3RyaW5nIFtdIHJlcyA9IG5ldyBTdHJpbmdbd2lkZ2V0LmdldFRleHRWYWx1ZXMoKS5zaXplKCldOworCQkJaW50IGk9MDsKKwkJCWZvcihTdHJpbmcgdDp3aWRnZXQuZ2V0VGV4dFZhbHVlcygpKSByZXNbaSsrXT10OworCQkJcmV0dXJuIHJlczsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKKwkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKKwkgICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7CisJICAgIAorLy8JICAgIFN0cmluZyBbXSBybiA9IHsiQUdFMC0xMCIsICJBR0UxMS0zNSIsIkFHRTM2LTEwMCJ9OworLy8JCVN0cmluZyBbXSBjbiA9IHsiQUdFMC0xMCIsICJBR0UxMS0zNSIsIkFHRTM2LTEwMCJ9OworCQkKKy8vCQlNYXRyaXhFZGl0b3JEaWFsb2cgZGlhbG9nID0gbmV3IE1hdHJpeEVkaXRvckRpYWxvZyhzaGVsbCwgU1dULlBVU0gsICJFbnRlciBWYWx1ZXMiLCAoc2hvcnQpMywgKHNob3J0KTMsIHJuLCBjbiwgbmV3IE1hdHJpeEVkaXRvclZhbGlkYXRvcigpIHsKKworCSAgICBTdHJpbmcgW10gY24gPSB7IlBvcHVsYXRpb24gR3JvdXAifTsKKwkJCisJCU1hdHJpeEVkaXRvckRpYWxvZyBkaWFsb2cgID0gbmV3IE1hdHJpeEVkaXRvckRpYWxvZyhzaGVsbCwgU1dULlBVU0gsICJFbnRlciBzdHVmZiIsIChzaG9ydCkxLCAoc2hvcnQpMSwgbnVsbCwgY24sIG51bGwsIGZhbHNlLCBuZXcgTWF0cml4RWRpdG9yVmFsaWRhdG9yKCkgeworCQkKKwkKKwkJCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWUoU3RyaW5nIHZhbCkgeworCQkJCWlmKHZhbCA9PSBudWxsIHx8IHZhbC50cmltKCkuZXF1YWxzKCIiKSkgcmV0dXJuIHRydWU7CisJCQkJdHJ5IHsKKwkJCQkJRG91YmxlLnBhcnNlRG91YmxlKHZhbC50cmltKCkpOworCQkJCX0gY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9KTsKKwkJCSAKKwkgICAgZGlhbG9nLm9wZW4oKTsKKwkgICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKKwkgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHsKKwkgICAgICAgIGRpc3BsYXkuc2xlZXAoKTsKKwkgICAgICB9CisJICAgIH0KKwkgICAgZGlzcGxheS5kaXNwb3NlKCk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aWRnZXRzL01hdHJpeEVkaXRvcldpZGdldC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aWRnZXRzL01hdHJpeEVkaXRvcldpZGdldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2Y2JiOWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpZGdldHMvTWF0cml4RWRpdG9yV2lkZ2V0LmphdmEKQEAgLTAsMCArMSwzNzQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS53aWRnZXRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKK3B1YmxpYyBjbGFzcyBNYXRyaXhFZGl0b3JXaWRnZXQgZXh0ZW5kcyBDb21wb3NpdGUgeworCisJcHVibGljIGVudW0gU1RBVFVTIHsKKwkJT0tBWSwKKwkJSU5WQUxJRF9WQUxVRTsKKwl9CisJCisJcHJpdmF0ZSBzaG9ydCByb3dzOworCXNob3J0IGR5bnJvd3M7CisJc2hvcnQgY29sdW1uczsKKwlwcml2YXRlIFN0cmluZyBbXSByb3dOYW1lcywgY29sTmFtZXM7CisJcHJpdmF0ZSBib29sZWFuIGZpeGVkU2l6ZTsKKwlwcml2YXRlIENvbG9yIGNvbFJvd0hlYWRlckNvbHVtbnMgPSBuZXcgQ29sb3IobnVsbCwgMjAwLCAyMDAsIDIwMCk7CisJcHJpdmF0ZSBDb2xvciB0ZXh0QmFja2dyb3VuZENvbHVtbnMgPSBuZXcgQ29sb3IobnVsbCwgMjU1LCAyNTUsIDI1NSk7CisJcHJpdmF0ZSBDb2xvciB0ZXh0Qm9yZGVyQ29sb3IgPSAgbmV3IENvbG9yKG51bGwsIDAsIDAsIDApOworCQorCUFycmF5TGlzdDxUZXh0PiB0ZXh0V2lkZ2V0cyA9IG5ldyBBcnJheUxpc3Q8VGV4dD4oKTsKKwlBcnJheUxpc3Q8U3RyaW5nPiB0ZXh0VmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCisJTWF0cml4RWRpdG9yVmFsaWRhdG9yIHZhbGlkYXRvciA9IG51bGw7CisJcHJpdmF0ZSBBcnJheUxpc3Q8TWF0cml4RWRpdG9yTGlzdGVuZXI+IGxpc3RlbmVycyA9IG5ldyAgQXJyYXlMaXN0PE1hdHJpeEVkaXRvckxpc3RlbmVyPigpOworCQorCUxhYmVsIHN0YXR1cyA9IG51bGw7CisJQnV0dG9uIGN1cnJlbnRQbHVzQnV0dG9uOworCUJ1dHRvbiBjdXJyZW50TWludXNCdXR0b247CisJQXJyYXlMaXN0PExhYmVsPmVtcHR5TGFiZWxzID0gbmV3IEFycmF5TGlzdDxMYWJlbD4oKTsKKwkKKwkKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgTWF0cml4IEVkaXRvciBXaWRnZXQKKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50CisJICogQHBhcmFtIHJvd3MKKwkgKiBAcGFyYW0gY29sdW1ucworCSAqIEBwYXJhbSByb3duYW1lcworCSAqIEBwYXJhbSBjb2x1bW5OYW1lcworCSAqLworCQorCXB1YmxpYyBNYXRyaXhFZGl0b3JXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBzaG9ydCByb3dzLCBzaG9ydCBjb2x1bW5zLCBTdHJpbmdbXSByb3duYW1lcywgU3RyaW5nIFtdIGNvbHVtbk5hbWVzLCBTdHJpbmcgW11leGlzdGluZ1ZhbHMsYm9vbGVhbiBmaXhlZFNpemUsIE1hdHJpeEVkaXRvclZhbGlkYXRvciB2YWxpZGF0b3IpIHsKKwkJc3VwZXIocGFyZW50LCBzdHlsZSk7CisJCXRoaXMucm93cyA9IHJvd3M7CisJCXRoaXMuZHlucm93cyA9IHJvd3M7IC8vIGR5bmFtaWNhbGx5IGFkanVzdGVkIG51bWJlciBvZiByb3dzCisJCXRoaXMuY29sdW1ucyA9IGNvbHVtbnM7CisJCXRoaXMucm93TmFtZXMgPSByb3duYW1lczsKKwkJdGhpcy5jb2xOYW1lcyA9IGNvbHVtbk5hbWVzOworCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKKwkJdGhpcy5maXhlZFNpemUgPSBmaXhlZFNpemU7CisJCWNyZWF0ZUNvbnRlbnRzKGV4aXN0aW5nVmFscyk7CisJCQorCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKFN0cmluZyBbXWV4aXN0aW5nVmFscykgeworCQlzZXRCYWNrZ3JvdW5kKG5ldyBDb2xvcihudWxsLCAyNTUsIDI1NSwgMjU1KSk7CisJCQorCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gY29sdW1ucysxOworCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKKwkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7CisJCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7CisJCQorCQl0aGlzLnNldExheW91dChsYXlvdXQpOworCQkKKwkJLy8gVGhlIHN0YXR1cyByb3cgZm9yIGVycm9yIG1lc3NhZ2VzIGV0Yy4KKwkJc3RhdHVzID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKKwkJc3RhdHVzLnNldEZvcmVncm91bmQobmV3IENvbG9yKG51bGwsIDI1NSwgMCwgMCkpOworCQlHcmlkRGF0YSBzZ2QgPSBuZXcgR3JpZERhdGEoKTsKKwkJaWYoKHJvd05hbWVzICE9IG51bGwgJiYgcm93TmFtZXMubGVuZ3RoID4gMCkgfHwgZml4ZWRTaXplID09IGZhbHNlKQorCQkJc2dkLmhvcml6b250YWxTcGFuID0gY29sdW1ucysxOworCQllbHNlCisJCQlzZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5zOworCQkKKwkJc3RhdHVzLnNldExheW91dERhdGEoc2dkKTsKKwkJc3RhdHVzLnNldFRleHQoIiIpOworCQkKKwkJaWYoKHJvd05hbWVzICE9IG51bGwgJiYgcm93TmFtZXMubGVuZ3RoID4gMCkgfHwgZml4ZWRTaXplID09IGZhbHNlKSB7IAorCQkJTGFiZWwgbGFiID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKKwkJCWxhYi5zZXRUZXh0KCIiKTsKKwkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7CisJCQkvL2dkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJLy9nZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJCWxhYi5zZXRMYXlvdXREYXRhKGdkKTsKKwkJfQorCQkvLyBDcmVhdGUgY29sdW1uIGhlYWRlcnMKKwkJaWYoY29sTmFtZXMhPW51bGwpIGZvcihpbnQgYz0wO2M8Y29sTmFtZXMubGVuZ3RoOysrYykgeworCQkJTGFiZWwgbGFiID0gbmV3IExhYmVsKHRoaXMsIFNXVC5CT1JERVIpOworCQkJbGFiLnNldFRleHQoY29sTmFtZXNbY10pOworCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKKwkJCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOworCQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IDE7CisJCQlnZC52ZXJ0aWNhbEluZGVudCA9IDE7CisJCQlnZC5taW5pbXVtV2lkdGggPSAxMjg7CisJCQlsYWIuc2V0TGF5b3V0RGF0YShnZCk7CisJCQlsYWIuc2V0QmFja2dyb3VuZChjb2xSb3dIZWFkZXJDb2x1bW5zKTsKKwkJCWFkZEJvcmRlcihsYWIpOworCQl9CisJCS8vIENyZWF0ZSB0aGUgdGV4dAorCQkKKwkJZm9yKGludCByPTA7cjxyb3dzOysrcikgeworCQkJaWYoKHJvd05hbWVzICE9IG51bGwgJiYgcm93TmFtZXMubGVuZ3RoID4gcikgfHwgZml4ZWRTaXplID09IGZhbHNlKSB7CisJCQkJTGFiZWwgbGFiID0gbmV3IExhYmVsKHRoaXMsIFNXVC5CT1JERVIpOworCQkJCWlmKGZpeGVkU2l6ZSkKKwkJCQkJbGFiLnNldFRleHQocm93TmFtZXNbcl0pOworCQkJCWVsc2UKKwkJCQkJbGFiLnNldFRleHQoIiIpOworCQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7CisJCQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJLy9nZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJCQlsYWIuc2V0TGF5b3V0RGF0YShnZCk7CisJCQkJaWYoZml4ZWRTaXplKWxhYi5zZXRCYWNrZ3JvdW5kKGNvbFJvd0hlYWRlckNvbHVtbnMpOworCQkJCWVsc2UgbGFiLnNldEJhY2tncm91bmQobmV3IENvbG9yKG51bGwsIDI1NSwgMjU1LCAyNTUpKTsKKwkJCQlpZihmaXhlZFNpemUpYWRkQm9yZGVyKGxhYik7CisJCQkJZW1wdHlMYWJlbHMuYWRkKGxhYik7CisJCQl9CisJCQkKKwkJCWZvcihpbnQgYz0wO2M8Y29sdW1uczsrK2MpIHsKKwkJCQlUZXh0IHQgPSBhZGRUZXh0RmllbGQoKTsKKwkJCQlpbnQgaW5kZXggPSByKmNvbHVtbnMrYzsKKwkJCQlpZihleGlzdGluZ1ZhbHMgIT0gbnVsbCAmJiBleGlzdGluZ1ZhbHMubGVuZ3RoID4gaW5kZXgpCisJCQkJCXQuc2V0VGV4dChleGlzdGluZ1ZhbHNbaW5kZXhdKTsKKwkJCX0KKwkJfSAvLyBmb3IgZWFjaCByb3cKKwkKKwkJaWYoZml4ZWRTaXplID09IGZhbHNlKSB7CisJCQljdXJyZW50UGx1c0J1dHRvbiA9IGFkZFBsdXNCdXR0b24oKTsKKwkJCWN1cnJlbnRNaW51c0J1dHRvbiA9IGFkZE1pbnVzQnV0dG9uKCk7CisJCQlpZihyb3dzIDwgMiljdXJyZW50TWludXNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJCX0KKwl9CisJCisJVGV4dCBhZGRUZXh0RmllbGQoKSB7CisJCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHRoaXMsIFNXVC5OT05FKTsKKwkJdGV4dC5zZXRCYWNrZ3JvdW5kKHRleHRCYWNrZ3JvdW5kQ29sdW1ucyk7CisJCXRleHQuc2V0Rm9yZWdyb3VuZCh0ZXh0Qm9yZGVyQ29sb3IpOworCQorCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOworCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOworCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gMTsKKwkJZ2QudmVydGljYWxJbmRlbnQgPSAxOworCQkKKwkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKKwkJYWRkQm9yZGVyKHRleHQpOworCQl0ZXh0V2lkZ2V0cy5hZGQodGV4dCk7CisJCXRleHRWYWx1ZXMuYWRkKCIiKTsKKwkJCisJCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgeworCQkJCisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGFyZzApIHsKKwkJCQlib29sZWFuIHByb2JsZW0gPSBmYWxzZTsKKwkJCQlmb3IoVGV4dCB0Ok1hdHJpeEVkaXRvcldpZGdldC50aGlzLnRleHRXaWRnZXRzKSB7CisJCQkJCVN0cmluZyB2YWwgPSB0LmdldFRleHQoKS50cmltKCk7CisJCQkJCWlmKCF2YWxpZGF0b3IudmFsaWRhdGVWYWx1ZSh2YWwpKSB7CisJCQkJCQlwcm9ibGVtID0gdHJ1ZTsKKwkJCQkJCXN0YXR1cy5zZXRUZXh0KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5NZXNzYWdlcy5nZXRTdHJpbmcoIk1hdHJpeC5pbnZhbGlkLnZhbHVlIiksIHZhbCkpOworCQkJCQkJc3RhdHVzLnBhY2sodHJ1ZSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZighcHJvYmxlbSkgeworCQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7CisJCQkJCXN0YXR1cy5wYWNrKHRydWUpOworCQkJCQlmaXJlRXZlbnQobmV3IE1hdHJpeEVkaXRvckV2ZW50KFNUQVRVUy5PS0FZKSk7CisJCQkJfSBlbHNlIGZpcmVFdmVudChuZXcgTWF0cml4RWRpdG9yRXZlbnQoU1RBVFVTLklOVkFMSURfVkFMVUUpKTsKKwkJCQkKKwkJCQlpbnQgaW5kZXggPSB0ZXh0V2lkZ2V0cy5pbmRleE9mKHRleHQpOworCQkJCXRleHRWYWx1ZXMuc2V0KGluZGV4LCB0ZXh0LmdldFRleHQoKSk7CisJCQl9CisJCX0pOworCQlyZXR1cm4gdGV4dDsKKwl9CisJCisJQnV0dG9uIGFkZFBsdXNCdXR0b24oKSB7CisJCUJ1dHRvbiBwbHVzQnV0dG9uID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuTk9ORSk7CisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7CisJCXBsdXNCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIk1hdHJpeC5kaWFsb2cucGx1cyIpKTsKKwkJcGx1c0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKKwkKKwkJcGx1c0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CQkKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKKwkJCQljdXJyZW50TWludXNCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKwkJCQkrK2R5bnJvd3M7CisJCQkJCisJCQkJTGFiZWwgbGFiID0gbmV3IExhYmVsKE1hdHJpeEVkaXRvcldpZGdldC50aGlzLCBTV1QuQk9SREVSKTsKKwkJCQlsYWIuc2V0VGV4dCgiIik7CisJCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKKwkJCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJCQlsYWIuc2V0TGF5b3V0RGF0YShnZCk7CisJCQkJbGFiLnNldEJhY2tncm91bmQobmV3IENvbG9yKG51bGwsIDI1NSwgMjU1LCAyNTUpKTsKKwkJCQllbXB0eUxhYmVscy5hZGQobGFiKTsKKwkJCQlUZXh0IGxhc3RUZXh0ID0gbnVsbDsKKwkJCQlmb3IoaW50IGk9MDtpPGNvbHVtbnM7KytpKSBsYXN0VGV4dCA9IGFkZFRleHRGaWVsZCgpOworCQkJCQorCQkJCWN1cnJlbnRQbHVzQnV0dG9uLm1vdmVCZWxvdyhsYXN0VGV4dCk7CisJCQkJY3VycmVudE1pbnVzQnV0dG9uLm1vdmVCZWxvdyhjdXJyZW50UGx1c0J1dHRvbik7CisJCQkJbGFzdFRleHQuc2V0VGV4dChsYXN0VGV4dC5nZXRUZXh0KCkpOyAvLyBJbnZva2UgdmFsaWRhdG9yCisJCQkJTWF0cml4RWRpdG9yV2lkZ2V0LnRoaXMubGF5b3V0KHRydWUpOworCQkJCU1hdHJpeEVkaXRvcldpZGdldC50aGlzLnBhY2sodHJ1ZSk7CisJCQkJTWF0cml4RWRpdG9yV2lkZ2V0LnRoaXMuZ2V0UGFyZW50KCkucGFjayh0cnVlKTsKKwkJCX0KKwkJCQorCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJCisJCQl9CisJCX0pOworCQlyZXR1cm4gcGx1c0J1dHRvbjsKKwl9CisJCisJQnV0dG9uIGFkZE1pbnVzQnV0dG9uKCkgeworCQlCdXR0b24gbWludXNCdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5OT05FKTsKKwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKKwkJbWludXNCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIk1hdHJpeC5kaWFsb2cubWludXMiKSk7CisJCW1pbnVzQnV0dG9uLnNldExheW91dERhdGEoZ2QpOworCQorCQltaW51c0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBhcmcwKSB7CisJCQkJZm9yKGludCBpPShkeW5yb3dzLTEpKmNvbHVtbnM7aTwoZHlucm93cy0xKSpjb2x1bW5zK2NvbHVtbnM7KytpKSB0ZXh0V2lkZ2V0cy5nZXQoaSkuZGlzcG9zZSgpOworCQkJCWZvcihpbnQgaT0wO2k8Y29sdW1uczsrK2kpIHt0ZXh0V2lkZ2V0cy5yZW1vdmUoKGR5bnJvd3MtMSkqY29sdW1ucyk7dGV4dFZhbHVlcy5yZW1vdmUoKGR5bnJvd3MtMSkqY29sdW1ucyk7fQorCQkJCUxhYmVsIGVsYWIgPSBlbXB0eUxhYmVscy5nZXQoZHlucm93cy0xKTsKKwkJCQlUZXh0IGxhc3RUZXh0ID0gdGV4dFdpZGdldHMuZ2V0KChkeW5yb3dzLTIpKmNvbHVtbnMrY29sdW1ucy0xKTsKKwkJCQljdXJyZW50UGx1c0J1dHRvbi5tb3ZlQmVsb3cobGFzdFRleHQpOworCQkJCWN1cnJlbnRNaW51c0J1dHRvbi5tb3ZlQmVsb3coY3VycmVudFBsdXNCdXR0b24pOworCQkJCWVsYWIuZGlzcG9zZSgpOworCQkJCWVtcHR5TGFiZWxzLnJlbW92ZShlbGFiKTsKKwkJCQktLWR5bnJvd3M7CisJCQkJaWYoZHlucm93cyA9PSAxKQorCQkJCQljdXJyZW50TWludXNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJCisJCQkJbGFzdFRleHQuc2V0VGV4dChsYXN0VGV4dC5nZXRUZXh0KCkpOyAvLyBJbnZva2UgdmFsaWRhdG9yCisJCQkJCisJCQkJTWF0cml4RWRpdG9yV2lkZ2V0LnRoaXMubGF5b3V0KHRydWUpOworCQkJCU1hdHJpeEVkaXRvcldpZGdldC50aGlzLnBhY2sodHJ1ZSk7CisJCQkJTWF0cml4RWRpdG9yV2lkZ2V0LnRoaXMuZ2V0UGFyZW50KCkucGFjayh0cnVlKTsKKwkJCX0KKwkJCQorCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJCisJCQl9CisJCX0pOworCQlyZXR1cm4gbWludXNCdXR0b247CisJfQorCQorCXByaXZhdGUgdm9pZCBhZGRCb3JkZXIoZmluYWwgQ29udHJvbCB0KSB7CisJCS8vIEFkZCBhIGJvcmRlciBhcm91bmQgdGhlIHRleHQgYm94CisJCXQuYWRkUGFpbnRMaXN0ZW5lciggbmV3IFBhaW50TGlzdGVuZXIoKSB7CisJCQkKKwkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2dCkgeworCQkJCVBvaW50IHMgPSB0LmdldFNpemUoKTsKKwkJCQlDb2xvciBjID0gZXZ0LmdjLmdldEZvcmVncm91bmQoKTsKKworCQkJCWV2dC5nYy5zZXRGb3JlZ3JvdW5kKHQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOworCQkJICAgICAgIGV2dC5nYy5kcmF3UmVjdGFuZ2xlKDAsMCxzLngtMSxzLnktMSk7CisJCQkgICAgICAgZXZ0LmdjLnNldEZvcmVncm91bmQoYyk7CisJCQkgICB9CisKKwkJCX0gKTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTWF0cml4RWRpdG9yTGlzdGVuZXIgbGlzdGVuZXIpIHt0aGlzLmxpc3RlbmVycy5hZGQobGlzdGVuZXIpO30KKwkKKwl2b2lkIGZpcmVFdmVudChNYXRyaXhFZGl0b3JFdmVudCBldnQpIHtmb3IoTWF0cml4RWRpdG9yTGlzdGVuZXIgbDpsaXN0ZW5lcnMpIGwuZXZlbnRSZWNlaXZlZChldnQpO30KKwkKKwlwdWJsaWMgQXJyYXlMaXN0PFN0cmluZz4gZ2V0VGV4dFZhbHVlcygpIHsKKwkJcmV0dXJuIHRoaXMudGV4dFZhbHVlczsKKwl9CisJCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKKwkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKKwkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7CisJCQorCQlGaWxsTGF5b3V0IGZsID0gbmV3IEZpbGxMYXlvdXQoKTsKKwkJZmwudHlwZSA9IFNXVC5WRVJUSUNBTDsKKwkJc2hlbGwuc2V0TGF5b3V0KGZsKTsKKwkJCisvLwkJU3RyaW5nIFtdIHJuID0geyJBR0UwLTEwIiwgIkFHRTExLTM1IiwiQUdFMzYtMTAwIn07CisvLwkJU3RyaW5nIFtdIGNuID0geyJBR0UwLTEwIiwgIkFHRTExLTM1IiwiQUdFMzYtMTAwIn07CisJCQorLy8JCU1hdHJpeEVkaXRvcldpZGdldCBtID0gbmV3IE1hdHJpeEVkaXRvcldpZGdldChzaGVsbCwgU1dULlBVU0gsIChzaG9ydCkzLCAoc2hvcnQpMywgcm4sIGNuLCB0cnVlLCBuZXcgTWF0cml4RWRpdG9yVmFsaWRhdG9yKCkgeworCQorCQlTdHJpbmcgW10gY24gPSB7IlBvcHVsYXRpb24gR3JvdXAifTsKKwkJCQorCQlNYXRyaXhFZGl0b3JXaWRnZXQgbSA9IG5ldyBNYXRyaXhFZGl0b3JXaWRnZXQoc2hlbGwsIFNXVC5QVVNILCAoc2hvcnQpMSwgKHNob3J0KTEsIG51bGwsIGNuLCBudWxsLCBmYWxzZSwgbmV3IE1hdHJpeEVkaXRvclZhbGlkYXRvcigpIHsKKwkJCisJCQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlKFN0cmluZyB2YWwpIHsKKwkJCQlpZih2YWwgPT0gbnVsbCB8fCB2YWwudHJpbSgpLmVxdWFscygiIikpIHJldHVybiB0cnVlOworCQkJCXRyeSB7CisJCQkJCURvdWJsZS5wYXJzZURvdWJsZSh2YWwudHJpbSgpKTsKKwkJCQl9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfSk7CisJCQorCQltLmFkZExpc3RlbmVyKG5ldyBNYXRyaXhFZGl0b3JXaWRnZXQuTWF0cml4RWRpdG9yTGlzdGVuZXIoKSB7CisJCQkKKwkJCXB1YmxpYyB2b2lkIGV2ZW50UmVjZWl2ZWQoTWF0cml4RWRpdG9yRXZlbnQgZXZlbnQpIHsKKwkJCQlpZihldmVudC5zdGF0dXMgPT0gTWF0cml4RWRpdG9yV2lkZ2V0LlNUQVRVUy5PS0FZKSBTeXN0ZW0ub3V0LnByaW50bG4oIm9rYXkiKTsKKwkJCQllbHNlIFN5c3RlbS5vdXQucHJpbnRsbigiaW52YWxpZCIpOworCQkJfQorCQl9KTsKKwkJc2hlbGwucGFjaygpOworCQlzaGVsbC5vcGVuKCk7CisJCQorCQkgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKKwkgICAgICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKKwkgICAgICAgIH0KKwl9CisJCisJcHVibGljIHN0YXRpYyBjbGFzcyBNYXRyaXhFZGl0b3JFdmVudCB7CisJCXB1YmxpYyBTVEFUVVMgc3RhdHVzOworCQkKKwkJcHVibGljIE1hdHJpeEVkaXRvckV2ZW50KFNUQVRVUyBzKSB7dGhpcy5zdGF0dXMgPSBzO30KKwl9CisJCisJcHVibGljIGludGVyZmFjZSBNYXRyaXhFZGl0b3JMaXN0ZW5lciB7CisJCXB1YmxpYyB2b2lkIGV2ZW50UmVjZWl2ZWQoTWF0cml4RWRpdG9yRXZlbnQgZXZlbnQpOworCX0KKwkKKwlwdWJsaWMgaW50ZXJmYWNlIE1hdHJpeEVkaXRvclZhbGlkYXRvciB7CisKKwkJLyoqCisJCSAqIFZhbGlkYXRlLiBSZXR1cm4gZmFsc2UgaWYgdGhlIHZhbHVlIGlzIGludmFsaWQKKwkJICogQHBhcmFtIHZhbAorCQkgKiBAcmV0dXJuIEZhbHNlIGlmIGludmFsaWQKKwkJICovCisJCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWUoU3RyaW5nIHZhbCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aWRnZXRzL1Byb3BlcnR5U2VsZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2lkZ2V0cy9Qcm9wZXJ0eVNlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyYjVlMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2lkZ2V0cy9Qcm9wZXJ0eVNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSw3MDggQEAKKy8vIFByb3BlcnR5U2VsZWN0b3IuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5wb3B1bGF0aW9uLlBvcHVsYXRpb25FbnVtZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucG9wdWxhdGlvbi5Qb3B1bGF0aW9uRW51bWVyYXRvckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5wb3B1bGF0aW9uLlBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgY29tcG91bmQgU1dUIHdpZGdldCB0aGF0IGFsbG93cyBmb3IgdGhlIHNlbGVjdGlvbiBvZiBhCisgKiBwcm9wZXJ0eSBvciBwcm9wZXJ0aWVzIG9mIG9uZSBvciBtb3JlIHtAbGluayBEZWNvcmF0b3J9cy4KKyAqLworcHVibGljIGNsYXNzIFByb3BlcnR5U2VsZWN0b3IgZXh0ZW5kcyBDb21wb3NpdGUgeworCisJcHJpdmF0ZSBmaW5hbCBMaXN0PFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXI+IHByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXI+KCk7CisKKwlwcml2YXRlIElTaW11bGF0aW9uIHNpbXVsYXRpb24gPSBudWxsOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGZpcnN0IChpZgorCSAqIHBvc3NpYmxlKS4KKwkgKiAKKwkgKiBAc2VlICNzZXRQcmVmZXJlbmNlcygpCisJICovCisJcHJpdmF0ZSBTdHJpbmcgaW5pdGlhbFByb3BlcnR5TmFtZTsKKworCXByaXZhdGUgZmluYWwgTGFiZWwgZGlzcGxheUxhYmVsOworCisJQ29tYm8gZGVjb3JhdG9yc0NvbWJvOworCisJQ29tYm8gcHJvcGVydGllc0NvbWJvOworCisJQ29tYm8gcG9wSWRzQ29tYm87CisKKwlMaXN0PERlY29yYXRvcj4gZGVjb3JhdG9yczsKKworCURlY29yYXRvciBzZWxlY3RlZERlY29yYXRvcjsKKworCUxpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcHJvcGVydGllczsKKworCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3Igc2VsZWN0ZWRQcm9wZXJ0eTsKKwkKKwlTdHJpbmcgc2VsZWN0ZWRJZDsKKwkKKwlwcml2YXRlIERlY29yYXRvckZpbHRlciBkZWNvcmF0b3JGaWx0ZXIgPSBuZXcgRGVjb3JhdG9yRmlsdGVyKCkgeworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuUHJvcGVydHlTZWxlY3Rvci5EZWNvcmF0b3JGaWx0ZXIjYWNjZXB0KG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5EZWNvcmF0b3IpCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCURlY29yYXRvciBkZWNvcmF0b3IpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHNpZXZlIHNlbGVjdHMgdGhvc2UgcHJvcGVydGllcyB0aGF0IGhhdmUgcmVsYXRpdmUgdmFsdWVzLgorCSAqLworCXByaXZhdGUgUHJvcGVydHlTaWV2ZSBwcm9wZXJ0eVNpZXZlID0gbmV3IFByb3BlcnR5U2lldmUoKSB7CisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2lkZ2V0cy5Qcm9wZXJ0eVNlbGVjdG9yLlByb3BlcnR5U2lldmUjc2lldmUob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbCkKKwkJICovCisJCXB1YmxpYyBMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHNpZXZlKER5bmFtaWNMYWJlbCBkeW5hbWljTGFiZWwpIHsKKwkJCWZpbmFsIExpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcmV0VmFsdWUgPSBuZXcgQXJyYXlMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+KCk7CisJCQlmaW5hbCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyIHJ2cCA9IChSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyKSBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkuYWRhcHQoZHluYW1pY0xhYmVsLCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIuY2xhc3MpOworCisJCQkvLyBEb2VzIHRoZSBsYWJlbCBoYXZlIHJlbGF0aXZlIHZhbHVlcz8KKwkJCWlmIChydnAgIT0gbnVsbCkgeworCQkJCS8vIFllcworCQkJCXJ2cC5zZXRUYXJnZXQoZHluYW1pY0xhYmVsKTsKKworCQkJCWZvciAoZmluYWwgT2JqZWN0IGVsZW1lbnQgOiBydnAuZ2V0UHJvcGVydGllcygpKSB7CisJCQkJCWZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkgPSAoSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgZWxlbWVudDsKKwkJCQkJcmV0VmFsdWUuYWRkKHByb3BlcnR5KTsKKwkJCQl9IC8vIGZvciBlYWNoIHByb3BlcnR5CisJCQl9IC8vIGlmIHRoZSBsYWJlbCBoYXMgcmVsYXRpdmUgdmFsdWVzCisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gc2lldmUKKwl9OworCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqLworCXB1YmxpYyBQcm9wZXJ0eVNlbGVjdG9yKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIGludCBzdHlsZSwgYm9vbGVhbiBhbGxvd1Byb3BlcnR5U2VsZWN0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgc3R5bGUpOworCQlmaW5hbCBGb3JtTGF5b3V0IHJldFZhbHVlTGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKKwkJdGhpcy5zZXRMYXlvdXQocmV0VmFsdWVMYXlvdXQpOworCisJCWRpc3BsYXlMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuQ0VOVEVSKTsKKwkJZGlzcGxheUxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJJTVZpZXcuTVByb3AiKSArICIgOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkvLyBDb21ibyBCb3ggb2YgRGVjb3JhdG9ycworCQlkZWNvcmF0b3JzQ29tYm8gPSBuZXcgQ29tYm8odGhpcywgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkKKwkJCQl8IFNXVC5DRU5URVIpOworCisJCS8vIENvbWJvIEJveCBvZiB0aGUgRGVjb3JhdG9yIFByb3BlcnRpZXMKKwkJcHJvcGVydGllc0NvbWJvID0gbmV3IENvbWJvKHRoaXMsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZCisJCQkJfCBTV1QuQ0VOVEVSKTsKKworCQlwb3BJZHNDb21ibyA9IG5ldyBDb21ibyh0aGlzLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSAKKwkJCQl8IFNXVC5DRU5URVIpOworCQkKKwkJZmluYWwgRm9ybURhdGEgZGVjb3JhdG9yc0NvbWJvRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJZGVjb3JhdG9yc0NvbWJvRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGRpc3BsYXlMYWJlbCwgMCk7CisJCWRlY29yYXRvcnNDb21ib0Zvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWRlY29yYXRvcnNDb21ib0Zvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCWRlY29yYXRvcnNDb21iby5zZXRMYXlvdXREYXRhKGRlY29yYXRvcnNDb21ib0Zvcm1EYXRhKTsKKworCQlmaW5hbCBGb3JtRGF0YSBwcm9wZXJ0aWVzQ29tYm9Gb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlwcm9wZXJ0aWVzQ29tYm9Gb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZGVjb3JhdG9yc0NvbWJvLCAwKTsKKwkJcHJvcGVydGllc0NvbWJvRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJcHJvcGVydGllc0NvbWJvRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJcHJvcGVydGllc0NvbWJvLnNldExheW91dERhdGEocHJvcGVydGllc0NvbWJvRm9ybURhdGEpOworCisJCWZpbmFsIEZvcm1EYXRhIHBvcElkc0NvbWJvRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJcG9wSWRzQ29tYm9Gb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHJvcGVydGllc0NvbWJvLCAwKTsKKwkJcG9wSWRzQ29tYm9Gb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlwb3BJZHNDb21ib0Zvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCXBvcElkc0NvbWJvLnNldExheW91dERhdGEocG9wSWRzQ29tYm9Gb3JtRGF0YSk7CisKKwkJdGhpcy5wYWNrKCk7CisKKwkJZGVjb3JhdG9yc0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJCWZpbmFsIFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkvLyBBbnkgZGVjb3JhdG9ycz8KKwkJCQlpZiAoIWRlY29yYXRvcnMuaXNFbXB0eSgpKSB7CisJCQkJCS8vIFllcworCQkJCQlmaW5hbCBEZWNvcmF0b3IgdGVtcERlY29yYXRvciA9IGRlY29yYXRvcnMKKwkJCQkJCQkuZ2V0KGRlY29yYXRvcnNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKKwkJCQkJLy8gV2FzIHRoZXJlIGEgY2hhbmdlIGluIHNlbGVjdGVkIERlY29yYXRvcnM/CisJCQkJCWlmIChzZWxlY3RlZERlY29yYXRvciAhPSB0ZW1wRGVjb3JhdG9yKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXNlbGVjdGVkRGVjb3JhdG9yID0gdGVtcERlY29yYXRvcjsKKwkJCQkJCXByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzVG9EaXNwbGF5KHNlbGVjdGVkRGVjb3JhdG9yKTsKKwkJCQkJCXNlbGVjdGVkUHJvcGVydHkgPSBzZWxlY3RDdXJyZW50RGVjb3JhdG9yUHJvcGVydHkocHJvcGVydGllcyk7CisJCQkJCQlMaXN0PFN0cmluZz4gaWRzID0gZ2V0SWRzVG9EaXNwbGF5KHNlbGVjdGVkRGVjb3JhdG9yKTsKKwkJCQkJCXNlbGVjdGVkSWQgPSBpZHMuZ2V0KDApOworCQkJCQkJaW5pdGlhbGl6ZUNvbWJvKHByb3BlcnRpZXNDb21ibywKKwkJCQkJCQkJZ2V0UHJvcGVydHlOYW1lcyhwcm9wZXJ0aWVzKSwgZ2V0UHJvcGVydHlJbmRleCgKKwkJCQkJCQkJCQlzZWxlY3RlZFByb3BlcnR5LCBwcm9wZXJ0aWVzKSk7CisJCQkJCQlTdHJpbmcgW10gcHJvcElkcyA9IGlkcy50b0FycmF5KG5ldyBTdHJpbmdbXXt9KTsKKwkJCQkJCWluaXRpYWxpemVDb21ibyhwb3BJZHNDb21ibywKKwkJCQkJCQkJcHJvcElkcywgMCk7CisKKwkJCQkJCVByb3BlcnR5U2VsZWN0b3IudGhpcworCQkJCQkJCQkubm90aWZ5UHJvcGVydHlTZWxlY3Rpb24oc2VsZWN0ZWRQcm9wZXJ0eSwgc2VsZWN0ZWRJZCk7CisJCQkJCX0gLy8gaWYgRGVjb3JhdG9ycyBjaGFuZ2VkCisKKwkJCQl9IC8vIGlmIGFueSBkZWNvcmF0b3JzCisJCQl9CisJCX0gLy8gU2VsZWN0aW9uQWRhcHRlcgorCQkpOworCisJCXByb3BlcnRpZXNDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQlmaW5hbCBTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJLy8gQW55IERlY29yYXRvciBwcm9wZXJ0aWVzPworCQkJCWlmICghcHJvcGVydGllcy5pc0VtcHR5KCkpIHsKKwkJCQkJLy8gWWVzCisJCQkJCS8vIElzIGl0IGRpZmZlcmVudD8KKwkJCQkJZmluYWwgSXRlbVByb3BlcnR5RGVzY3JpcHRvciB0ZW1wID0gcHJvcGVydGllcworCQkJCQkJCS5nZXQocHJvcGVydGllc0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOworCQkJCQlpZiAoc2VsZWN0ZWRQcm9wZXJ0eSAhPSB0ZW1wKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXNlbGVjdGVkUHJvcGVydHkgPSB0ZW1wOworCQkJCQkJUHJvcGVydHlTZWxlY3Rvci50aGlzCisJCQkJCQkJCS5ub3RpZnlQcm9wZXJ0eVNlbGVjdGlvbihzZWxlY3RlZFByb3BlcnR5LCBzZWxlY3RlZElkKTsKKwkJCQkJfSAvLyBpZgorCisJCQkJfSAvLyBpZgorCQkJfSAvLyB3aWRnZXRTZWxlY3RlZAorCisJCX0gLy8gU2VsZWN0aW9uQWRhcHRlcgorCQkJCSk7CisJCXBvcElkc0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJCWZpbmFsIFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlMaXN0PFN0cmluZz5pZHMgPSBnZXRJZHNUb0Rpc3BsYXkoc2VsZWN0ZWREZWNvcmF0b3IpOworCQkJCQlmaW5hbCBTdHJpbmcgdGVtcCA9IGlkcworCQkJCQkJCS5nZXQocG9wSWRzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7CisJCQkJCWlmICghc2VsZWN0ZWRJZC5lcXVhbHModGVtcCkpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJc2VsZWN0ZWRJZCA9IHRlbXA7CisJCQkJCQlQcm9wZXJ0eVNlbGVjdG9yLnRoaXMKKwkJCQkJCQkJLm5vdGlmeVByb3BlcnR5U2VsZWN0aW9uKHNlbGVjdGVkUHJvcGVydHksIHNlbGVjdGVkSWQpOworCQkJCQl9IC8vIGlmCisKKwkJCX0gLy8gd2lkZ2V0U2VsZWN0ZWQKKworCQl9IC8vIFNlbGVjdGlvbkFkYXB0ZXIKKwkJCQkpOworCQlpZighYWxsb3dQcm9wZXJ0eVNlbGVjdGlvbilwcm9wZXJ0aWVzQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7CisJCXNldFNpbXVsYXRpb24obnVsbCk7CisJfSAvLyBQcm9wZXJ0eVNlbGVjdG9yCisKKwl2b2lkIG5vdGlmeVByb3BlcnR5U2VsZWN0aW9uKGZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3Igc2VsZWN0ZWRQcm9wZXJ0eSwgU3RyaW5nIHBvcGlkKSB7CisJCS8vIElzIHRoZXJlIGEgcHJvcGVydHk/CisJCWlmIChzZWxlY3RlZFByb3BlcnR5ICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJZmlyZVByb3BlcnR5U2VsZWN0aW9uRXZlbnQobmV3IFByb3BlcnR5U2VsZWN0aW9uRXZlbnQoCisJCQkJCXNlbGVjdGVkRGVjb3JhdG9yLCBzZWxlY3RlZFByb3BlcnR5LCB0aGlzLHBvcGlkICkpOworCQl9IC8vIGlmCisJfSAvLyBub3RpZnlQcm9wZXJ0eVNlbGVjdGlvbgorCisJLyoqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udHJvbCBoYXMgYmVlbiBpbml0aWFsaXplZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworCQlyZXR1cm4gIShkZWNvcmF0b3JzID09IG51bGwgfHwgZGVjb3JhdG9ycy5pc0VtcHR5KCkpOworCX0gLy8gaXNJbml0aWFsaXplZAorCisJLyoqCisJICogQHBhcmFtIGRlY29yYXRvcnMKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWNvcmF0b3JzKGZpbmFsIExpc3Q8RGVjb3JhdG9yPiBkZWNvcmF0b3JzKSB7CisJCXRoaXMuZGVjb3JhdG9ycyA9IGRlY29yYXRvcnM7CisJCXNlbGVjdGVkRGVjb3JhdG9yID0gZGVjb3JhdG9ycy5pc0VtcHR5KCkgPyBudWxsIDogZGVjb3JhdG9ycy5nZXQoMCk7CisJCXByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzVG9EaXNwbGF5KHNlbGVjdGVkRGVjb3JhdG9yKTsKKwkJc2VsZWN0ZWRQcm9wZXJ0eSA9IHNlbGVjdEN1cnJlbnREZWNvcmF0b3JQcm9wZXJ0eShwcm9wZXJ0aWVzKTsKKworCQlpbml0aWFsaXplQ29tYm8oZGVjb3JhdG9yc0NvbWJvLCBnZXREZWNvcmF0b3JOYW1lcyhkZWNvcmF0b3JzKSwKKwkJCQlnZXREZWNvcmF0b3JJbmRleChzZWxlY3RlZERlY29yYXRvciwgZGVjb3JhdG9ycykpOworCisJCWluaXRpYWxpemVDb21ibyhwcm9wZXJ0aWVzQ29tYm8sIGdldFByb3BlcnR5TmFtZXMocHJvcGVydGllcyksCisJCQkJZ2V0UHJvcGVydHlJbmRleChzZWxlY3RlZFByb3BlcnR5LCBwcm9wZXJ0aWVzKSk7CisKKwkJTGlzdDxTdHJpbmc+IGlkcyA9IGdldElkc1RvRGlzcGxheShzZWxlY3RlZERlY29yYXRvcik7CisJCWlmKGlkcyAhPSBudWxsKSB7CisJCQlTdHJpbmcgW10gcHJvcElkcyA9IGlkcy50b0FycmF5KG5ldyBTdHJpbmdbXXt9KTsKKwkJCWluaXRpYWxpemVDb21ibyhwb3BJZHNDb21ibywKKwkJCQkJcHJvcElkcywgMCk7CisJCX0KKwkJc2VsZWN0ZWRJZCAgPSAoaWRzPT1udWxsKT8gbnVsbDppZHMuZ2V0KDApOworCQlub3RpZnlQcm9wZXJ0eVNlbGVjdGlvbihzZWxlY3RlZFByb3BlcnR5LCBzZWxlY3RlZElkKTsKKwl9IC8vIHNldERlY29yYXRvcnMKKworCS8qKgorCSAqIEluaXRpYWxpemUgdGhlIGNvbnRyb2wgZnJvbSBhCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259IGluc3RhbmNlLgorCSAqIAorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogICAgICAgICAgICB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259CisJICovCisJcHVibGljIHZvaWQgc2V0U2ltdWxhdGlvbihmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uKSB7CisJCXRoaXMuc2ltdWxhdGlvbiA9IHNpbXVsYXRpb247CisJCXNldERlY29yYXRvcnMoZ2V0RGVjb3JhdG9yc1RvRGlzcGxheShzaW11bGF0aW9uKSk7CisJfSAvLyBzZXRTaW11bGF0aW9uCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzaW11bGF0aW9uCisJICovCisJcHVibGljIGZpbmFsIElTaW11bGF0aW9uIGdldFNpbXVsYXRpb24oKSB7CisJCXJldHVybiBzaW11bGF0aW9uOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBkZWNvcmF0b3JGaWx0ZXIKKwkgKiAgICAgICAgICAgIHRoZSBmaWx0ZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHtAbGluayBEZWNvcmF0b3J9cyB3aWxsIGJlCisJICogICAgICAgICAgICBkaXNwbGF5ZWQuCisJICovCisJcHVibGljIHZvaWQgc2V0RGVjb3JhdG9yRmlsdGVyKGZpbmFsIERlY29yYXRvckZpbHRlciBkZWNvcmF0b3JGaWx0ZXIpIHsKKwkJdGhpcy5kZWNvcmF0b3JGaWx0ZXIgPSBkZWNvcmF0b3JGaWx0ZXI7CisJfSAvLyBzZXREZWNvcmF0b3JGaWx0ZXIKKworCS8qKgorCSAqIEBwYXJhbSBwcm9wZXJ0eVNpZXZlCisJICogICAgICAgICAgICB0aGUgc2lldmUgdGhhdCBzZWxlY3RzIHRoZSBwcm9wZXJ0aWVzIG9mIGEge0BsaW5rIERlY29yYXRvcn0KKwkgKiAgICAgICAgICAgIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVNpZXZlKGZpbmFsIFByb3BlcnR5U2lldmUgcHJvcGVydHlTaWV2ZSkgeworCQl0aGlzLnByb3BlcnR5U2lldmUgPSBwcm9wZXJ0eVNpZXZlOworCX0gLy8gc2V0UHJvcGVydHlTaWV2ZQorCisJLyoqCisJICogQHBhcmFtIHNpbXVsYXRpb24KKwkgKiAgICAgICAgICAgIHRoZSBzaW11bGF0aW9uIHRoYXQgY29udGFpbnMge0BsaW5rIERlY29yYXRvcn1zCisJICogQHJldHVybiBhIHtAbGluayBMaXN0fSBvZiB0aGUge0BsaW5rIERlY29yYXRvcn1zIHdob3NlIHByb3BlcnRpZXMKKwkgKi8KKwlwcml2YXRlIExpc3Q8RGVjb3JhdG9yPiBnZXREZWNvcmF0b3JzVG9EaXNwbGF5KGZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb24pIHsKKwkJZmluYWwgTGlzdDxEZWNvcmF0b3I+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxEZWNvcmF0b3I+KCk7CisKKwkJLy8gR290IFNpbXVsYXRpb24/CisJCWlmIChzaW11bGF0aW9uICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJZmluYWwgR3JhcGggY2Fub25pY2FsR3JhcGggPSBzaW11bGF0aW9uLmdldFNjZW5hcmlvKCkKKwkJCQkJLmdldENhbm9uaWNhbEdyYXBoKCk7CisJCQkvLyBJcyB0aGUgY2Fub25pY2FsR3JhcGggaW5pdGlhbGl6ZWQgeWV0PworCQkJaWYgKGNhbm9uaWNhbEdyYXBoICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQkvLyBHbyB0aHJvdWdoIHRoZSBEZWNvcmF0b3JzIGtlZXBpbmcgdGhlIG9uZXMgdGhhdCB0aGUgZmlsdGVyCisJCQkJLy8gc2F5cyBhcmUgb2suCisJCQkJZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IGNhbm9uaWNhbEdyYXBoLmdldERlY29yYXRvcnMoKSkgeworCQkJCQlmaW5hbCBEZWNvcmF0b3IgZGVjb3JhdG9yID0gKERlY29yYXRvcikgZWxlbWVudDsKKwkJCQkJLy8gQWNjZXB0YWJsZT8KKwkJCQkJaWYgKGRlY29yYXRvckZpbHRlci5hY2NlcHQoZGVjb3JhdG9yKSkgeworCQkJCQkJcmV0VmFsdWUuYWRkKGRlY29yYXRvcik7CisJCQkJCX0gLy8gaWYgaGFzIGEgdGl0bGUKKwkJCQl9IC8vIGZvciBlYWNoIGRlY29yYXRvcgorCQkJfSAvLyBpZiBnb3QgZ3JhcGgKKwkJfSAvLyBpZiBnb3Qgc2ltdWxhdGlvbgorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXREZWNvcmF0b3JzVG9EaXNwbGF5CisKKwkvKioKKwkgKiBAcGFyYW0gZGVjb3JhdG9yCisJICogICAgICAgICAgICBhIHtAbGluayBEZWNvcmF0b3J9IHRoYXQgbW9kaWZpZXMgdGhlIHN0YXRlIG9mIHRoZSBjYW5vbmljYWwKKwkgKiAgICAgICAgICAgIHtAbGluayBHcmFwaH0gaW4gdGhlCisJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn0uCisJICogQHBhcmFtIHNpbXVsYXRpb24KKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn0KKwkgKiBAcmV0dXJuIGEge0BsaW5rIExpc3R9IG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB7QGxpbmsgRGVjb3JhdG9yfSB0aGF0CisJICogICAgICAgICBjYW4gc2hvdWxkIGJlIGRpc3BsYXllZC4KKwkgKi8KKwlMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnRpZXNUb0Rpc3BsYXkoCisJCQlmaW5hbCBEZWNvcmF0b3IgZGVjb3JhdG9yKSB7CisJCWZpbmFsIExpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcmV0VmFsdWUgPSBuZXcgQXJyYXlMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+KCk7CisJCS8vIEdvdCBEZWNvcmF0b3I/CisJCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQkvLyBBcmUgdGhlcmUgYW55IGxhYmVscyB0byB1cGRhdGU/CisJCQlpZiAoIWRlY29yYXRvci5nZXRMYWJlbHNUb1VwZGF0ZSgpLmlzRW1wdHkoKSkgeworCQkJCS8vIFllcworCQkJCS8vIFRoZSBmaXJzdCBvbmUgaXMgZ29vZCBlbm91Z2gKKwkJCQlyZXRWYWx1ZS5hZGRBbGwocHJvcGVydHlTaWV2ZS5zaWV2ZShkZWNvcmF0b3IKKwkJCQkJCS5nZXRMYWJlbHNUb1VwZGF0ZSgpLmdldCgwKSkpOworCQkJfSAvLyBpZiBsYWJlbHMgdG8gdXBkYXRlCisJCX0gLy8gaWYgZ290IGRlY29yYXRvcgorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRQcm9wZXJ0aWVzVG9EaXNwbGF5CisKKwkvKioKKwkgKiBAcGFyYW0gZGVjb3JhdG9yCisJICogICAgICAgICAgICBhIHtAbGluayBEZWNvcmF0b3J9IHRoYXQgbW9kaWZpZXMgdGhlIHN0YXRlIG9mIHRoZSBjYW5vbmljYWwKKwkgKiAgICAgICAgICAgIHtAbGluayBHcmFwaH0gaW4gdGhlCisJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn0uCisJICogQHJldHVybiBhIHtAbGluayBMaXN0fSBvZiB0aGUgaWRzLCBlLmcuIHBvcHVsYXRpb24gaWRzCisJICovCisJTGlzdDxTdHJpbmc+IGdldElkc1RvRGlzcGxheSgKKwkJCWZpbmFsIERlY29yYXRvciBkZWNvcmF0b3IpIHsKKwkJZmluYWwgTGlzdDxTdHJpbmc+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWlmKGRlY29yYXRvciA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyIHBlYSA9IChQb3B1bGF0aW9uRW51bWVyYXRvckFkYXB0ZXIpUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChkZWNvcmF0b3IsIFBvcHVsYXRpb25FbnVtZXJhdG9yLmNsYXNzKTsKKwkJCisJCWlmKHBlYSAhPSBudWxsKSB7CisJCQlmb3IoU3RyaW5nIHM6IHBlYS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcnMoKSkgcmV0VmFsdWUuYWRkKHMpOworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9CisJCWlmKGRlY29yYXRvciBpbnN0YW5jZW9mIERpc2Vhc2VNb2RlbCkgeworCQkJcmV0VmFsdWUuYWRkKCgoRGlzZWFzZU1vZGVsKWRlY29yYXRvcikuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSk7CisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0KKwkJaWYoZGVjb3JhdG9yIGluc3RhbmNlb2YgUG9wdWxhdGlvbk1vZGVsKSB7CisJCQlyZXRWYWx1ZS5hZGQoKChQb3B1bGF0aW9uTW9kZWwpZGVjb3JhdG9yKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpKTsKKwkJCXJldHVybiByZXRWYWx1ZTsKKwkJfQorCQlyZXR1cm4gbnVsbDsgLy8gbm9uZSBmb3VuZAorCX0gLy8gZ2V0UHJvcGVydGllc1RvRGlzcGxheQorCisJLy8gLyoqCisJLy8gKiBAcGFyYW0gZGVjb3JhdG9ycworCS8vICogdGhlIHtAbGluayBEZWNvcmF0b3JzfSBpbiB0aGUgc2ltdWxhdGlvbiB0aGF0IHdob3NlIHN0YXRlCisJLy8gKiB2YWx1ZXMgY2FuIGJlIHZpc3VhbGl6ZWQuCisJLy8gKiBAcmV0dXJuIG9uZSBvZiB0aGUge0BsaW5rIERlY29yYXRvcnN9CisJLy8gKi8KKwkvLyBwcml2YXRlIERlY29yYXRvciBzZWxlY3RDdXJyZW50RGVjb3JhdG9yKGZpbmFsIExpc3Q8RGVjb3JhdG9yPgorCS8vIGRlY29yYXRvcnMpIHsKKwkvLyByZXR1cm4gZGVjb3JhdG9ycy5nZXQoMCk7CisJLy8gfSAvLyBzZWxlY3RDdXJyZW50RGVjb3JhdG9yCisKKwkvKioKKwkgKiBAcGFyYW0gZGVjb3JhdG9yUHJvcGVydGllcworCSAqICAgICAgICAgICAgYSBsaXN0IG9mIHByb3BlcnRpZXMKKwkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBvZiB0aGUgZGVjb3JhdG9yIHRoYXQgc2hvdWxkIGJlIHRoZSBvbmUgdG8gYmUKKwkgKiAgICAgICAgIGRpc3BsYXllZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBkZWNvcmF0b3JQcm9wZXJ0aWVzIGlzIGVtcHR5CisJICovCisJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBzZWxlY3RDdXJyZW50RGVjb3JhdG9yUHJvcGVydHkoCisJCQlmaW5hbCBMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGRlY29yYXRvclByb3BlcnRpZXMpIHsKKwkJLy8gTG9vayBmb3IgYSBwcm9wZXJ0eSB3aXRoIGEgbmFtZSB0aGF0IG1hdGNoZXMgdGhlIG9uZSBzcGVjaWZpZWQgaW4KKwkJLy8gdGhlIHByZWZlcmVuY2VzLgorCQlmb3IgKGZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkgOiBkZWNvcmF0b3JQcm9wZXJ0aWVzKSB7CisJCQkvLyBuYW1lIG1hdGNoPworCQkJaWYgKHByb3BlcnR5LmdldERpc3BsYXlOYW1lKHByb3BlcnR5KS5lcXVhbHMoaW5pdGlhbFByb3BlcnR5TmFtZSkpIHsKKwkJCQkvLyBZZXMKKwkJCQlyZXR1cm4gcHJvcGVydHk7CisJCQl9IC8vIGlmCisJCX0gLy8gZm9yIGVhY2ggSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQkvLyBEaWRuJ3QgZmluZCBhIG1hdGNoLCBqdXN0IHVzZSB0aGUgZmlyc3Qgb25lLgorCQkvLyBBbnkgdG8gdXNlPworCQlpZiAoIWRlY29yYXRvclByb3BlcnRpZXMuaXNFbXB0eSgpKSB7CisJCQkvLyBZZXMKKwkJCXJldHVybiBkZWNvcmF0b3JQcm9wZXJ0aWVzLmdldCgwKTsKKwkJfSAvLyBpZgorCQlyZXR1cm4gbnVsbDsKKwl9IC8vIHNlbGVjdEN1cnJlbnREZWNvcmF0b3JQcm9wZXJ0eQorCisJLyoqCisJICogQHJldHVybiB0aGUge0BsaW5rIERlY29yYXRvcn0gc2VsZWN0ZWQgaW4gdGhlIGNvbnRyb2wsIG9yCisJICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBvbmUgaXMgbm90IGN1cnJlbnRseSBzZWxlY3RlZC4KKwkgKi8KKwkvLyBwdWJsaWMgRGVjb3JhdG9yIGdldFNlbGVjdGVkRGVjb3JhdG9yKCkgeworCS8vIHJldHVybiBzZWxlY3RlZERlY29yYXRvcjsKKwkvLyB9IC8vIGdldFNlbGVjdGVkRGVjb3JhdG9yCisJLy8KKwkvLyAvKioKKwkvLyAqIEByZXR1cm4gdGhlIHtAbGluayBJdGVtUHJvcGVydHlEZXNjcmlwdG9yfSBzZWxlY3RlZCBpbiB0aGUgY29udHJvbCwgb3IKKwkvLyAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG9uZSBpcyBub3QgY3VycmVudGx5IHNlbGVjdGVkLgorCS8vICovCisJLy8gcHVibGljIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZ2V0U2VsZWN0ZWRQcm9wZXJ0eSgpIHsKKwkvLyByZXR1cm4gc2VsZWN0ZWREZWNvcmF0b3JQcm9wZXJ0eTsKKwkvLyB9IC8vIGdldFNlbGVjdGVkUHJvcGVydHkKKwkvLworCS8vIC8qKgorCS8vICogQHJldHVybiBhIGRpc3BsYXkgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgcHJvcGVydHkuIFRoaXMgaXMgdGhlIGtleSB0byB0aGUKKwkvLyAqIHNlbGVjdGVkIHJlbGF0aXZlIFZhbHVlCisJLy8gKgorCS8vICovCisJLy8gcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZFByb3BlcnR5U3RyaW5nKCkgeworCS8vIFN0cmluZyByZXRWYWwgPSAibm8gcHJvcGVydHkgc2VsZWN0ZWQiOworCS8vIGlmIChzZWxlY3RlZERlY29yYXRvclByb3BlcnR5ICE9IG51bGwpIHsKKwkvLyByZXRWYWwgPSBzZWxlY3RlZERlY29yYXRvclByb3BlcnR5CisJLy8gLmdldERpc3BsYXlOYW1lKHNlbGVjdGVkRGVjb3JhdG9yUHJvcGVydHkpOworCS8vIH0KKwkvLyByZXR1cm4gcmV0VmFsOworCS8vIH0gLy8gZ2V0U2VsZWN0ZWRQcm9wZXJ0eQorCS8qKgorCSAqIEBwYXJhbSBjb21ibworCSAqIEBwYXJhbSBuYW1lcworCSAqIEBwYXJhbSBzZWxlY3Rpb25JbmRleAorCSAqLworCXZvaWQgaW5pdGlhbGl6ZUNvbWJvKGZpbmFsIENvbWJvIGNvbWJvLCBmaW5hbCBTdHJpbmdbXSBuYW1lcywKKwkJCWZpbmFsIGludCBzZWxlY3Rpb25JbmRleCkgeworCQljb21iby5zZXRJdGVtcyhuYW1lcyk7CisJCWNvbWJvLnNlbGVjdChzZWxlY3Rpb25JbmRleCk7CisJfSAvLyBpbml0aWFsaXplQ29tYm8KKworCS8qKgorCSAqIEBwYXJhbSBkZWNvcmF0b3JzCisJICogICAgICAgICAgICBhIGxpc3Qgb2Yge0BsaW5rIERlY29yYXRvcn1zCisJICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgbmFtZXMgb2YgdGhlIHtAbGluayBEZWNvcmF0b3JzfS4KKwkgKi8KKwlwcml2YXRlIFN0cmluZ1tdIGdldERlY29yYXRvck5hbWVzKGZpbmFsIExpc3Q8RGVjb3JhdG9yPiBkZWNvcmF0b3JzKSB7CisJCWZpbmFsIExpc3Q8U3RyaW5nPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlpZiAoZGVjb3JhdG9ycyAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCWZvciAoZmluYWwgRGVjb3JhdG9yIGRlY29yYXRvciA6IGRlY29yYXRvcnMpIHsKKwkJCQlyZXRWYWx1ZS5hZGQoZGVjb3JhdG9yLmdldER1YmxpbkNvcmUoKS5nZXRUaXRsZSgpKTsKKwkJCX0gLy8gZm9yIGVhY2ggZGVjb3JhdG9yCisJCX0gLy8gaWYKKwkJcmV0dXJuIHJldFZhbHVlLnRvQXJyYXkobmV3IFN0cmluZ1tdIHt9KTsKKwl9IC8vIGdldERlY29yYXRvck5hbWVzCisKKwkvKioKKwkgKiBAcGFyYW0gc2VsZWN0ZWREZWNvcmF0b3IKKwkgKiBAcGFyYW0gZGVjb3JhdG9ycworCSAqICAgICAgICAgICAgYSBsaXN0IG9mIHtAbGluayBEZWNvcmF0b3J9cy4KKwkgKiBAcmV0dXJuIHRoZSBwb3NpdGlvbiAoMCBvcmlnaW4pIG9mIHRoZSBzZWxlY3RlZERlY29yYXRvciBpbiBkZWNvcmF0b3JzLAorCSAqICAgICAgICAgb3IgMCwgaWYgdGhlIGRlY29yYXRvcnMgbGlzdCBpcyBlbXB0eS4KKwkgKi8KKwlwcml2YXRlIGludCBnZXREZWNvcmF0b3JJbmRleChmaW5hbCBEZWNvcmF0b3Igc2VsZWN0ZWREZWNvcmF0b3IsCisJCQlmaW5hbCBMaXN0PERlY29yYXRvcj4gZGVjb3JhdG9ycykgeworCQlpZiAoc2VsZWN0ZWREZWNvcmF0b3IgIT0gbnVsbCAmJiBkZWNvcmF0b3JzICE9IG51bGwKKwkJCQkmJiAhZGVjb3JhdG9ycy5pc0VtcHR5KCkpIHsKKwkJCS8vIFllcworCQkJcmV0dXJuIGRlY29yYXRvcnMuaW5kZXhPZihzZWxlY3RlZERlY29yYXRvcik7CisJCX0gLy8gaWYKKwkJcmV0dXJuIDA7CisJfSAvLyBnZXREZWNvcmF0b3JJbmRleAorCisJLyoqCisJICogQHBhcmFtIHByb3BlcnRpZXMKKwkgKiAgICAgICAgICAgIGEgbGlzdCBvZiB7QGxpbmsgRGVjb3JhdG9yfSBwcm9wZXJ0aWVzLgorCSAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBwcm9wZXJ0aWVzLgorCSAqLworCVN0cmluZ1tdIGdldFByb3BlcnR5TmFtZXMoZmluYWwgTGlzdDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wZXJ0aWVzKSB7CisJCWZpbmFsIExpc3Q8U3RyaW5nPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCWZvciAoZmluYWwgSXRlbVByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSA6IHByb3BlcnRpZXMpIHsKKwkJCQlyZXRWYWx1ZS5hZGQocHJvcGVydHkuZ2V0RGlzcGxheU5hbWUocHJvcGVydHkpKTsKKwkJCX0gLy8gZm9yIGVhY2ggSXRlbVByb3BlcnR5RGVzY3JpcHRvcgorCQl9IC8vIGlmCisJCXJldHVybiByZXRWYWx1ZS50b0FycmF5KG5ldyBTdHJpbmdbXSB7fSk7CisJfSAvLyBnZXRQcm9wZXJ0eU5hbWVzCisKKwkvKioKKwkgKiBAcGFyYW0gc2VsZWN0ZWREZWNvcmF0b3JQcm9wZXJ0eQorCSAqIEBwYXJhbSBkZWNvcmF0b3JQcm9wZXJ0aWVzCisJICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkRGVjb3JhdG9yUHJvcGVydHkgaW4gdGhlCisJICogICAgICAgICBkZWNvcmF0b3JQcm9wZXJpdGVzIGxpc3QsIG9yIDAgaWYgc2VsZWN0ZWREZWNvcmF0b3JQcm9wZXJ0eSBpcworCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlpbnQgZ2V0UHJvcGVydHlJbmRleCgKKwkJCWZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3Igc2VsZWN0ZWREZWNvcmF0b3JQcm9wZXJ0eSwKKwkJCWZpbmFsIExpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZGVjb3JhdG9yUHJvcGVydGllcykgeworCQlpZiAoc2VsZWN0ZWREZWNvcmF0b3JQcm9wZXJ0eSAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXJldHVybiBkZWNvcmF0b3JQcm9wZXJ0aWVzLmluZGV4T2Yoc2VsZWN0ZWREZWNvcmF0b3JQcm9wZXJ0eSk7CisJCX0gLy8gaWYKKwkJcmV0dXJuIDA7CisJfSAvLyBnZXRQcm9wZXJ0eUluZGV4CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBtYXkgYmUgdXNlZCB0byBpbml0aWFsaXplIGEgcHJvcGVydGllcyBjb21ibyB0byBkaXNwbGF5CisJICogKHNlbGVjdCkgYSBwYXJ0aWN1bGFyIHByb3BlcnR5CisJICogCisJICogQHBhcmFtIHByZWZlcnJlZFByb3BlcnR5CisJICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZGlzcGxheS4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJyZWRQcm9wZXJ0eSB3YXMgZm91bmQsCisJICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHNldERpc3BsYXllZFByb3BlcnR5KGZpbmFsIFN0cmluZyBwcmVmZXJyZWRQcm9wZXJ0eSkgeworCQlmaW5hbCBpbnQgaW5kZXggPSBwcm9wZXJ0aWVzQ29tYm8uaW5kZXhPZihwcmVmZXJyZWRQcm9wZXJ0eSk7CisJCWlmIChpbmRleCA+PSAwKSB7CisJCQlwcm9wZXJ0aWVzQ29tYm8uc2VsZWN0KGluZGV4KTsKKwkJCWluaXRpYWxQcm9wZXJ0eU5hbWUgPSBwcmVmZXJyZWRQcm9wZXJ0eTsKKwkJCXByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzVG9EaXNwbGF5KHNlbGVjdGVkRGVjb3JhdG9yKTsKKwkJCWZvciAoZmluYWwgSXRlbVByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSA6IHByb3BlcnRpZXMpIHsKKwkJCQkvLyBuYW1lIG1hdGNoPworCQkJCWlmIChwcm9wZXJ0eS5nZXREaXNwbGF5TmFtZShwcm9wZXJ0eSkuZXF1YWxzKAorCQkJCQkJaW5pdGlhbFByb3BlcnR5TmFtZSkpIHsKKwkJCQkJLy8gWWVzCisJCQkJCXNlbGVjdGVkUHJvcGVydHkgPSBwcm9wZXJ0eTsKKwkJCQkJYnJlYWs7CisJCQkJfSAvLyBpZgorCQkJfSAvLyBmb3IgZWFjaCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCisJCQlmaXJlUHJvcGVydHlTZWxlY3Rpb25FdmVudChuZXcgUHJvcGVydHlTZWxlY3Rpb25FdmVudCgKKwkJCQkJc2VsZWN0ZWREZWNvcmF0b3IsIHNlbGVjdGVkUHJvcGVydHksIHByb3BlcnRpZXNDb21ibywgc2VsZWN0ZWRJZCkpOworCQkJcmV0dXJuIHRydWU7CisJCX0vLyBpZiBzZWxlY3RvciBoYXMgaXRlbXMKKwkJcmV0dXJuIGZhbHNlOworCX0vLyBzZXREaXNwbGF5ZWRQcm9wcGVydHkoKQorCisJLyoqCisJICogQHBhcmFtIGxpc3RlbmVyCisJICovCisJcHVibGljIHZvaWQgYWRkUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcigKKwkJCWZpbmFsIFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJcHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyKAorCQkJZmluYWwgUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworCQlwcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCX0KKworCXByaXZhdGUgdm9pZCBmaXJlUHJvcGVydHlTZWxlY3Rpb25FdmVudChmaW5hbCBQcm9wZXJ0eVNlbGVjdGlvbkV2ZW50IHBzZSkgeworCQlmb3IgKGZpbmFsIFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiBwcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVycykgeworCQkJbGlzdGVuZXIucHJvcGVydHlTZWxlY3RlZChwc2UpOworCQl9IC8vIGZvciBlYWNoIFByb3BlcnR5U2VsZWN0aW9uTGlzdGVuZXIKKwl9IC8vIGZpcmVQcm9wZXJ0eVNlbGVjdGlvbkV2ZW50CisKKwkvKioKKwkgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgZGV0ZXJtaW5lIGlmIGEKKwkgKiB7QGxpbmsgRGVjb3JhdG9yfSBtZWV0cyBzb21lIHNwZWNpZmllZCBjcml0ZXJpYS4KKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIERlY29yYXRvckZpbHRlciB7CisJCS8qKgorCQkgKiBAcGFyYW0gZGVjb3JhdG9yCisJCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHtAbGluayBEZWNvcmF0b3J9IGlzIGFjY2VwdGFibGUuCisJCSAqLworCQlib29sZWFuIGFjY2VwdChmaW5hbCBEZWNvcmF0b3IgZGVjb3JhdG9yKTsKKwl9IC8vIERlY29yYXRvckZpbHRlcgorCisJLyoqCisJICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHNlbGVjdCBvdXQgdGhlIHByb3BlcnRpZXMKKwkgKiB0byBiZSBkaXNwbGF5ZWQuCisJICovCisJcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eVNpZXZlIHsKKwkJLyoqCisJCSAqIEBwYXJhbSBkeW5hbWljTGFiZWwKKwkJICogICAgICAgICAgICB0aGUgbGFiZWwgdGhhdCBjb250YWlucyB0aGUgY2FuZGlkYXRlIHByb3BlcnRpZXMgdG8gYmUKKwkJICogICAgICAgICAgICBkaXNwbGF5ZWQuCisJCSAqIEByZXR1cm4gYSA8Y29kZT5MaXN0PC9jb2RlPiBvZiB0aGUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZQorCQkgKiAgICAgICAgIGRpc3BsYXllZCBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHNob3VsZCBiZSBkaXNwbGF5ZWQuCisJCSAqLworCQlMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHNpZXZlKGZpbmFsIER5bmFtaWNMYWJlbCBkeW5hbWljTGFiZWwpOworCX0gLy8gUHJvcGVydHlTaWV2ZQorCisJLyoqCisJICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHdpc2ggdG8gYmUgbm90aWZpZWQKKwkgKiB3aGVuZXZlciBhIHByb3BlcnR5IGlzIHNlbGVjdGVkIGluIHRoaXMgd2lkZ2V0LgorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlTZWxlY3Rpb25MaXN0ZW5lciB7CisJCS8qKgorCQkgKiBAcGFyYW0gcHJvcGVydHlTZWxlY3Rpb25FdmVudAorCQkgKi8KKwkJdm9pZCBwcm9wZXJ0eVNlbGVjdGVkKFByb3BlcnR5U2VsZWN0aW9uRXZlbnQgcHJvcGVydHlTZWxlY3Rpb25FdmVudCk7CisJfSAvLyBQcm9wZXJ0eVNlbGVjdGlvbkxpc3RlbmVyCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGV2ZW50IG9mIGEgcHJvcGVydHkgYmVpbmcgc2VsZWN0ZWQgaW4gdGhlCisJICogd2lkZ2V0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvcGVydHlTZWxlY3Rpb25FdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisJCXByaXZhdGUgdHJhbnNpZW50IGZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHk7CisJCXByaXZhdGUgdHJhbnNpZW50IGZpbmFsIERlY29yYXRvciBkZWNvcmF0b3I7CisJCXByaXZhdGUgdHJhbnNpZW50IGZpbmFsIFN0cmluZyBpZDsKKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gZGVjb3JhdG9yCisJCSAqICAgICAgICAgICAgdGhlIHtAbGluayBEZWNvcmF0b3J9CisJCSAqIEBwYXJhbSBwcm9wZXJ0eQorCQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBzZWxlY3RlZC4KKwkJICogQHBhcmFtIHNvdXJjZQorCQkgKi8KKwkJcHVibGljIFByb3BlcnR5U2VsZWN0aW9uRXZlbnQoZmluYWwgRGVjb3JhdG9yIGRlY29yYXRvciwKKwkJCQlmaW5hbCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5LCBmaW5hbCBPYmplY3Qgc291cmNlLCBTdHJpbmcgaWQpIHsKKwkJCXN1cGVyKHNvdXJjZSk7CisJCQl0aGlzLmRlY29yYXRvciA9IGRlY29yYXRvcjsKKwkJCXRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKwkJCXRoaXMuaWQgPSBpZDsKKwkJfQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBkZWNvcmF0b3IKKwkJICovCisJCXB1YmxpYyBmaW5hbCBEZWNvcmF0b3IgZ2V0RGVjb3JhdG9yKCkgeworCQkJcmV0dXJuIGRlY29yYXRvcjsKKwkJfQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eQorCQkgKi8KKwkJcHVibGljIGZpbmFsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHkoKSB7CisJCQlyZXR1cm4gcHJvcGVydHk7CisJCX0KKworCQkvKioKKwkJICogZ2V0SWQuIEdldCB0aGUgaWQgKGUuZy4gcG9wdWxhdGlvbiBpZCkKKwkJICovCisJCQorCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQkJcmV0dXJuIGlkOworCQl9CisJCS8qKgorCQkgKiBAc2VlIGphdmEudXRpbC5FdmVudE9iamVjdCN0b1N0cmluZygpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigKKwkJCQkJZGVjb3JhdG9yID09IG51bGwgPyAibnVsbCwiIDogZGVjb3JhdG9yLmdldER1YmxpbkNvcmUoKQorCQkJCQkJCS5nZXRUaXRsZSgpKTsKKwkJCXNiLmFwcGVuZChwcm9wZXJ0eSA9PSBudWxsID8gIm51bGwiIDogcHJvcGVydHkKKwkJCQkJLmdldERpc3BsYXlOYW1lKHByb3BlcnR5KSk7CisJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwkJfQorCX0gLy8gUHJvcGVydHlTZWxlY3Rpb25FdmVudAorCisJLyoqCisJICogQHJldHVybiB0aGUgZGlzcGxheSBsYWJlbAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheUxhYmVsKCkgeworCQlyZXR1cm4gZGlzcGxheUxhYmVsLmdldFRleHQoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZGlzcGxheUxhYmVsCisJICogICAgICAgICAgICB0aGUgbGFiZWwgdG8gZGlzcGxheSBhYm92ZSB0aGUgcHJvcGVydHkgc2VsZWN0b3IKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TGFiZWwoZmluYWwgU3RyaW5nIGRpc3BsYXlMYWJlbCkgeworCQl0aGlzLmRpc3BsYXlMYWJlbC5zZXRUZXh0KGRpc3BsYXlMYWJlbCk7CisJfQorCit9IC8vIFByb3BlcnR5U2VsZWN0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2lkZ2V0cy9SZW5hbWVEaWFsb2cuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2lkZ2V0cy9SZW5hbWVEaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGM0MjBkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aWRnZXRzL1JlbmFtZURpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2lkZ2V0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklucHV0RGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkud2lkZ2V0cy5NYXRyaXhFZGl0b3JXaWRnZXQuTWF0cml4RWRpdG9yRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aWRnZXRzLk1hdHJpeEVkaXRvcldpZGdldC5NYXRyaXhFZGl0b3JWYWxpZGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworcHVibGljIGNsYXNzIFJlbmFtZURpYWxvZyBleHRlbmRzIERpYWxvZyB7CisKKwlwcml2YXRlIFN0cmluZyB0aXRsZTsKKwlib29sZWFuIGNhbmNlbFByZXNzZWQgPSBmYWxzZTsKKwlYTUlSZXNvdXJjZSByZXNvdXJjZTsKKwlTdHJpbmcgdmFsdWU7CisJCisJcHVibGljIFJlbmFtZURpYWxvZyAoU2hlbGwgcGFyZW50LCBpbnQgc3R5bGUsIFhNSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgdGl0bGUpIHsKKwkJc3VwZXIgKHBhcmVudCwgc3R5bGUpOworCQl0aGlzLnRpdGxlID0gdGl0bGU7CisJCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKwl9CisJCisJLyoqCisJICogb3BlbiB0aGUgbW9kYWwgd2luZG93LiAKKwkgKiBAcmV0dXJuIFRoZSBTdHJpbmdbXSB3aXRoIHJlc3VsdHMsIG9yIG51bGwgaWYgY2FuY2VsIHdhcyBwcmVzc2VkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgIG9wZW4gKCkgeworCQlTaGVsbCBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKKwkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwocGFyZW50LCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOworCQlzaGVsbC5zZXRUZXh0KHRpdGxlKTsKKwkJR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWdsLm51bUNvbHVtbnMgPSAyOworCQlzaGVsbC5zZXRMYXlvdXQoZ2wpOworCQkKKwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOworCQkKKwkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5OT05FKTsKKwkJaWYocmVzb3VyY2UgIT0gbnVsbCkgeworCQkJdGV4dC5zZXRUZXh0KHJlc291cmNlLmdldFVSSSgpLmxhc3RTZWdtZW50KCkpOworCQkJdmFsdWUgPSByZXNvdXJjZS5nZXRVUkkoKS5sYXN0U2VnbWVudCgpOworCQl9CisJCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7CisJCWdkLm1pbmltdW1XaWR0aCA9IDEwMDsKKwkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCQorCQlmaW5hbCBCdXR0b24gb2theUJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5OT05FKTsKKwkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKKwkJb2theUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lLmRpYWxvZy5va2F5IikpOworCQlva2F5QnV0dG9uLnNldExheW91dERhdGEoZ2QpOworCQlva2F5QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCQkKKwkJQnV0dG9uIGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5OT05FKTsKKwkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKKwkJY2FuY2VsQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWUuZGlhbG9nLmNhbmNlbCIpKTsKKwkJY2FuY2VsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOworCQkKKwkJc2hlbGwucGFjaygpOworCQlzaGVsbC5vcGVuKCk7CisJCQorCQkKKwkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQkKKwkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgYXJnMCkgeworCQkJCVVSSSBvbGRVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKKwkJCQlTdHJpbmcgcGF0aCA9IG9sZFVSSS5wYXRoKCk7CisJCQkJaW50IGluZCAgPSBwYXRoLmxhc3RJbmRleE9mKCIvIik7CisJCQkJU3RyaW5nIHRydW5jcGF0aCA9ICIiOworCQkJCWlmKGluZCAhPSAtMSkgdHJ1bmNwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgaW5kKzEpOworCQkJCQorCQkJCVN0cmluZyBuZXdwYXRoID0gdHJ1bmNwYXRoK3RleHQuZ2V0VGV4dCgpOworCQkJCUZpbGUgZiA9IG5ldyBGaWxlKG5ld3BhdGgpOworCQkJCWlmKGYuZXhpc3RzKCkgfHwgdGV4dC5nZXRUZXh0KCkudHJpbSgpLmVxdWFscygiIikgfHwgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKHJlc291cmNlLmdldFVSSSgpLmxhc3RTZWdtZW50KCkpKSB7CisJCQkJCW9rYXlCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJb2theUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCQkJCQl2YWx1ZSA9IHRleHQuZ2V0VGV4dCgpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCQorCQlva2F5QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQkKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKKwkJCQljYW5jZWxQcmVzc2VkPWZhbHNlOworCQkJCXNoZWxsLmRpc3Bvc2UoKTsKKwkJCX0KKwkJCQorCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJCisJCQl9CisJCX0pOworCQkKKwkJY2FuY2VsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQkKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKKwkJCQljYW5jZWxQcmVzc2VkPXRydWU7CisJCQkJc2hlbGwuZGlzcG9zZSgpOworCQkJfQorCQkJCisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgYXJnMCkgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQkKKwkJCX0KKwkJfSk7CisJCQorCQlEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOworCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgeworCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKKwkJfQorCQkKKwkJCisJCWlmKCFjYW5jZWxQcmVzc2VkKSB7CisJCQlTdHJpbmcgcmVzID0gdmFsdWU7CisJCQlyZXR1cm4gcmVzOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgeworCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOworCSAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKKwkgICAgCisvLwkgICAgU3RyaW5nIFtdIHJuID0geyJBR0UwLTEwIiwgIkFHRTExLTM1IiwiQUdFMzYtMTAwIn07CisvLwkJU3RyaW5nIFtdIGNuID0geyJBR0UwLTEwIiwgIkFHRTExLTM1IiwiQUdFMzYtMTAwIn07CisJCQorLy8JCU1hdHJpeEVkaXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgTWF0cml4RWRpdG9yRGlhbG9nKHNoZWxsLCBTV1QuUFVTSCwgIkVudGVyIFZhbHVlcyIsIChzaG9ydCkzLCAoc2hvcnQpMywgcm4sIGNuLCBuZXcgTWF0cml4RWRpdG9yVmFsaWRhdG9yKCkgeworCisJCQorCQlSZW5hbWVEaWFsb2cgZGlhbG9nICA9IG5ldyBSZW5hbWVEaWFsb2coc2hlbGwsIFNXVC5QVVNILCBudWxsLCAiRW50ZXIgc3R1ZmYiKTsKKwkJCSAKKwkgICAgZGlhbG9nLm9wZW4oKTsKKwkgICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKKwkgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHsKKwkgICAgICAgIGRpc3BsYXkuc2xlZXAoKTsKKwkgICAgICB9CisJICAgIH0KKwkgICAgZGlzcGxheS5kaXNwb3NlKCk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL0R1YmxpbkNvcmVQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvRHVibGluQ29yZVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTU5NDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL0R1YmxpbkNvcmVQYWdlLmphdmEKQEAgLTAsMCArMSw1NjggQEAKKy8vIER1YmxpbkNvcmVQYWdlLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uaW1wbC5EdWJsaW5Db3JlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRoZSB7QGxpbmsgV2l6YXJkUGFnZX0gdGhhdCBhbGwge0BsaW5rIE5ld0lkZW50aWZpYWJsZVdpemFyZH1zCisgKiB1c2UgdG8gc3BlY2lmeSB0aGUgZGV0YWlscyBvZiBhIHtAbGluayBEdWJsaW5Db3JlfSBpbnN0YW5jZS4gRWFjaAorICoge0BsaW5rIE5ld0lkZW50aWZpYWJsZVdpemFyZH0gY29udGFpbnMgYSB7QGxpbmsgTmV3SWRlbnRpZmlhYmxlUGFnZX0gYW5kIG9uZQorICogb2YgdGhlc2UgcGFnZXMuCisgKiAKKyAqIEBzZWUgTmV3SWRlbnRpZmlhYmxlUGFnZQorICogQHNlZSBOZXdJZGVudGlmaWFibGVXaXphcmQKKyAqLworcHVibGljIGNsYXNzIER1YmxpbkNvcmVQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjaGFyYWN0ZXIgZGlzcGxheWVkIG5leHQgdG8gYXR0cmlidXRlIG5hbWVzIGZvciB0aG9zZQorCSAqIGF0dHJpYnV0ZXMgdGhhdCBhcmUgcmVxdWlyZWQuIEl0IGlzIGFwcGxpZWQgdG8gdGhlIGF0dHJpYnV0ZSBuYW1lIGluCisJICogI2NyZWF0ZURDQXR0cmlidXRlKENvbXBvc2l0ZSwgU3RyaW5nLCBTdHJpbmcsIGJvb2xlYW4sIGJvb2xlYW4pIGlmIHRoZQorCSAqIGFwcHJvcHJpYXRlIGZsYWcgaXMgPGNvZGU+dHJ1ZTwvY29kZT4uCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkVEX0ZJRUxEX0NIQVIgPSAiKiI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMge0BsaW5rIE1vZGlmeUxpc3RlbmVyfSBpcyBhdHRhY2hlZCB0byB0aG9zZSBhdHRyaWJ1dGVzIHdob3NlCisJICogY29udGVudHMgbmVlZCB0byBiZSB2ZXJpZmllZCBmb3IgY29ycmVjdG5lc3MuIFdoZW5ldmVyIG9uZSBvZiB0aG9zZQorCSAqIGF0dHJpYnV0ZXMgY2hhbmdlcywgYSBjYWxsIHRvIHtAbGluayAjdmFsaWRhdGVEdWJsaW5Db3JlUGFnZSgpfSBpcyBtYWRlCisJICogd2hpY2ggdGhlbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IG9yIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcworCSAqIHZhbHVlIGlzIHBhc3NlZCB0byB7QGxpbmsgI3NldFBhZ2VDb21wbGV0ZShib29sZWFuKX0gd2hpY2ggdGhlbiBlbmFibGVzCisJICogb3IgZGlzYWJsZXMgdGhlIGJ1dHRvbnMgYXQgdGhlIGJvdHRvbSBvZiB0aGUge0BsaW5rIER1YmxpbkNvcmVQYWdlfS4gVGhlCisJICogYXR0YWNobWVudCBpcyBkb25lIGluIHRoZSBtZXRob2QKKwkgKiB7QGxpbmsgI2NyZWF0ZURDQXR0cmlidXRlKENvbXBvc2l0ZSwgU3RyaW5nLCBTdHJpbmcsIGJvb2xlYW4sIGJvb2xlYW4pfQorCSAqIGlmIHRoZSBhcHByb3ByaWF0ZSBmbGFnIGlzIDxjb2RlPnRydWU8L2NvZGU+LgorCSAqLworCXByaXZhdGUgZmluYWwgTW9kaWZ5TGlzdGVuZXIgZGNWYWxpZGF0b3IgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIE1vZGlmeUV2ZW50IGUpIHsKKwkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZUR1YmxpbkNvcmVQYWdlKCkpOworCQl9CisJfTsKKworCS8qKgorCSAqIFJlcXVpcmVkLCBWYWxpZGF0ZWQKKwkgKiAKKwkgKiBAc2VlIER1YmxpbkNvcmUjZ2V0VGl0bGUoKQorCSAqIEBzZWUgI1JFUVVJUkVEX0ZJRUxEX0NIQVIKKwkgKiBAc2VlICNkY1ZhbGlkYXRvcgorCSAqIEBzZWUgI3ZhbGlkYXRlRHVibGluQ29yZVBhZ2UoKQorCSAqLworCXByb3RlY3RlZCBUZXh0IHRpdGxlOworCisJLyoqCisJICogQHNlZSBEdWJsaW5Db3JlI2dldERlc2NyaXB0aW9uKCkKKwkgKi8KKwlwcm90ZWN0ZWQgVGV4dCBkZXNjcmlwdGlvbjsKKworCS8qKgorCSAqIEBzZWUgRHVibGluQ29yZSNnZXRDcmVhdG9yKCkKKwkgKi8KKwlwcm90ZWN0ZWQgVGV4dCBjcmVhdG9yOworCisJLyoqCisJICogVmFsaWRhdGVkCisJICogCisJICogQHNlZSBEdWJsaW5Db3JlI2dldERhdGUoKQorCSAqIEBzZWUgI2RjVmFsaWRhdG9yCisJICogQHNlZSAjdmFsaWRhdGVEdWJsaW5Db3JlUGFnZSgpCisJICovCisJcHJvdGVjdGVkIFRleHQgZGF0ZTsKKworCS8qKgorCSAqIFJlcXVpcmVkCisJICogCisJICogQHNlZSBEdWJsaW5Db3JlI2dldEZvcm1hdCgpCisJICogQHNlZSAjUkVRVUlSRURfRklFTERfQ0hBUgorCSAqLworCXByb3RlY3RlZCBUZXh0IGZvcm1hdDsKKworCS8qKgorCSAqIEBzZWUgRHVibGluQ29yZSNnZXRQdWJsaXNoZXIoKQorCSAqLworCXByb3RlY3RlZCBUZXh0IHB1Ymxpc2hlcjsKKworCS8qKgorCSAqIEBzZWUgRHVibGluQ29yZSNnZXRDb3ZlcmFnZSgpCisJICovCisJcHJvdGVjdGVkIFRleHQgY292ZXJhZ2U7CisKKwkvKioKKwkgKiBAc2VlIER1YmxpbkNvcmUjZ2V0Q29udHJpYnV0b3IoKQorCSAqLworCXByb3RlY3RlZCBUZXh0IGNvbnRyaWJ1dG9yOworCisJLyoqCisJICogQHNlZSBEdWJsaW5Db3JlI2dldFJlbGF0aW9uKCkKKwkgKi8KKwlwcm90ZWN0ZWQgVGV4dCByZWxhdGlvbjsKKworCS8qKgorCSAqIEBzZWUgRHVibGluQ29yZSNnZXRSaWdodHMoKQorCSAqLworCXByb3RlY3RlZCBUZXh0IHJpZ2h0czsKKworCS8qKgorCSAqIEBzZWUgRHVibGluQ29yZSNnZXRTb3VyY2UoKQorCSAqLworCXByb3RlY3RlZCBUZXh0IHNvdXJjZTsKKworCS8qKgorCSAqIEBzZWUgRHVibGluQ29yZSNnZXRTdWJqZWN0KCkKKwkgKi8KKwlwcm90ZWN0ZWQgVGV4dCBzdWJqZWN0OworCisJLyoqCisJICogUmVxdWlyZWQKKwkgKiAKKwkgKiBAc2VlIER1YmxpbkNvcmUjZ2V0VHlwZSgpCisJICogQHNlZSAjUkVRVUlSRURfRklFTERfQ0hBUgorCSAqLworCXByb3RlY3RlZCBUZXh0IHR5cGU7CisKKwkvKioKKwkgKiBAc2VlIER1YmxpbkNvcmUjZ2V0TGFuZ3VhZ2UoKQorCSAqLworCXByb3RlY3RlZCBUZXh0IGxhbmd1YWdlOworCisJLyoqCisJICogQHNlZSBEdWJsaW5Db3JlI2dldEJpYmxpb2dyYXBoaWNDaXRhdGlvbigpCisJICovCisJcHJvdGVjdGVkIFRleHQgYmlibGlvZ3JhcGhpY0NpdGF0aW9uOworCisJLyoqCisJICogVmFsaWRhdGVkCisJICogCisJICogQHNlZSBEdWJsaW5Db3JlI2dldENyZWF0ZWQoKQorCSAqIEBzZWUgI2RjVmFsaWRhdG9yCisJICogQHNlZSAjdmFsaWRhdGVEdWJsaW5Db3JlUGFnZSgpCisJICovCisJcHJvdGVjdGVkIFRleHQgY3JlYXRlZDsKKworCS8qKgorCSAqIEBzZWUgRHVibGluQ29yZSNnZXRMaWNlbnNlKCkKKwkgKi8KKwlwcm90ZWN0ZWQgVGV4dCBsaWNlbnNlOworCisJLyoqCisJICogQHNlZSBEdWJsaW5Db3JlI2dldFJlcXVpcmVkKCkKKwkgKi8KKwlwcm90ZWN0ZWQgVGV4dCByZXF1aXJlZDsKKworCS8qKgorCSAqIEBzZWUgRHVibGluQ29yZSNnZXRTcGF0aWFsKCkKKwkgKi8KKwlwcm90ZWN0ZWQgVGV4dCBzcGF0aWFsOworCisJLyoqCisJICogVmFsaWRhdGVkCisJICogCisJICogQHNlZSBEdWJsaW5Db3JlI2dldFZhbGlkKCkKKwkgKiBAc2VlICNkY1ZhbGlkYXRvcgorCSAqIEBzZWUgI3ZhbGlkYXRlRHVibGluQ29yZVBhZ2UoKQorCSAqLworCXByb3RlY3RlZCBUZXh0IHZhbGlkOworCisJLyoqCisJICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCSAqLworCXByb3RlY3RlZCBEdWJsaW5Db3JlUGFnZSgpIHsKKwkJc3VwZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5wYWdlX3RpdGxlIikpOyAvLyROT04tTkxTLTEkCisJCXNldFRpdGxlKE1lc3NhZ2VzLmdldFN0cmluZygiTkR1YmxpbkNvcmUucGFnZV90aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQlzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLnBhZ2VfZGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKKwl9IC8vIER1YmxpbkNvcmVQYWdlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisJCS8vIENyZWF0ZXMgYSB7QGxpbmsgQ29tcG9zaXRlfSBhbmQgY2FsbHMge0BsaW5rCisJCS8vICNzZXRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wpfQorCisJCS8vIFBhZ2UgQ29tcG9zaXRlCisJCWZpbmFsIENvbXBvc2l0ZSBwYWdlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5Ob25lKTsKKwkJZmluYWwgR3JpZExheW91dCBwYWdlQ29tcG9zaXRlTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJcGFnZUNvbXBvc2l0ZUxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxMjsKKwkJcGFnZUNvbXBvc2l0ZUxheW91dC5udW1Db2x1bW5zID0gMjsKKwkJcGFnZUNvbXBvc2l0ZUxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQlwYWdlQ29tcG9zaXRlTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJcGFnZUNvbXBvc2l0ZS5zZXRMYXlvdXQocGFnZUNvbXBvc2l0ZUxheW91dCk7CisKKwkJZmluYWwgR3JpZERhdGEgcGFnZUNvbXBvc2l0ZUxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJcGFnZUNvbXBvc2l0ZUxheW91dERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOworCQlwYWdlQ29tcG9zaXRlTGF5b3V0RGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCXBhZ2VDb21wb3NpdGVMYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQlwYWdlQ29tcG9zaXRlTGF5b3V0RGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7CisJCXBhZ2VDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShwYWdlQ29tcG9zaXRlTGF5b3V0RGF0YSk7CisKKwkJdGl0bGUgPSBjcmVhdGVEQ0F0dHJpYnV0ZShwYWdlQ29tcG9zaXRlLCBNZXNzYWdlcworCQkJCS5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLnRpdGxlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLnRpdGxlRGVzYyIpLCAvLyROT04tTkxTLTEkCisJCQkJdHJ1ZSwgdHJ1ZSk7CisJCWRlc2NyaXB0aW9uID0gY3JlYXRlRENBdHRyaWJ1dGUocGFnZUNvbXBvc2l0ZSwgTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5kZXNjIiksIC8vJE5PTi1OTFMtMSQKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLmRlc2NEZXNjIiksIC8vJE5PTi1OTFMtMSQKKwkJCQlmYWxzZSwgZmFsc2UpOworCQljcmVhdG9yID0gY3JlYXRlRENBdHRyaWJ1dGUocGFnZUNvbXBvc2l0ZSwgTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5jcmVhdG9yIiksIC8vJE5PTi1OTFMtMSQKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLmNyZWF0b3JEZXNjIiksIC8vJE5PTi1OTFMtMSQKKwkJCQlmYWxzZSwgZmFsc2UpOworCQlkYXRlID0gY3JlYXRlRENBdHRyaWJ1dGUocGFnZUNvbXBvc2l0ZSwgTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5kYXRlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLmRhdGVEZXNjIiksIC8vJE5PTi1OTFMtMSQKKwkJCQlmYWxzZSwgdHJ1ZSk7CisJCXZhbGlkID0gY3JlYXRlRENBdHRyaWJ1dGUocGFnZUNvbXBvc2l0ZSwgTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJORHVibGluQ29yZS52YWxpZCIpLCAvLyROT04tTkxTLTEkCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJORHVibGluQ29yZS52YWxpZERlc2MiKSwgLy8kTk9OLU5MUy0xJAorCQkJCWZhbHNlLCB0cnVlKTsKKwkJY3JlYXRlZCA9IGNyZWF0ZURDQXR0cmlidXRlKHBhZ2VDb21wb3NpdGUsIE1lc3NhZ2VzCisJCQkJLmdldFN0cmluZygiTkR1YmxpbkNvcmUuY3JlYXRlZCIpLCAvLyROT04tTkxTLTEkCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5jcmVhdGVkRGVzYyIpLCAvLyROT04tTkxTLTEkCisJCQkJZmFsc2UsIHRydWUpOworCQlzb3VyY2UgPSBjcmVhdGVEQ0F0dHJpYnV0ZShwYWdlQ29tcG9zaXRlLCBNZXNzYWdlcworCQkJCS5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLnNvdXJjZSIpLCAvLyROT04tTkxTLTEkCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5zb3VyY2VEZXNjIiksIC8vJE5PTi1OTFMtMSQKKwkJCQlmYWxzZSwgZmFsc2UpOworCisJCXB1Ymxpc2hlciA9IGNyZWF0ZURDQXR0cmlidXRlKHBhZ2VDb21wb3NpdGUsIE1lc3NhZ2VzCisJCQkJLmdldFN0cmluZygiTkR1YmxpbkNvcmUucHVibGlzaGVyIiksIC8vJE5PTi1OTFMtMSQKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLnB1Ymxpc2hlckRlc2MiKSwgLy8kTk9OLU5MUy0xJAorCQkJCWZhbHNlLCBmYWxzZSk7CisJCWNvdmVyYWdlID0gY3JlYXRlRENBdHRyaWJ1dGUocGFnZUNvbXBvc2l0ZSwgTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5jb3ZlcmFnZSIpLCAvLyROT04tTkxTLTEkCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5jb3ZlcmFnZURlc2MiKSwgLy8kTk9OLU5MUy0xJAorCQkJCWZhbHNlLCBmYWxzZSk7CisJCWNvbnRyaWJ1dG9yID0gY3JlYXRlRENBdHRyaWJ1dGUocGFnZUNvbXBvc2l0ZSwgTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5jb250cmlidXRvciIpLCAvLyROT04tTkxTLTEkCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5jb250cmlidXRvckRlc2MiKSwgLy8kTk9OLU5MUy0xJAorCQkJCWZhbHNlLCBmYWxzZSk7CisJCXJlbGF0aW9uID0gY3JlYXRlRENBdHRyaWJ1dGUocGFnZUNvbXBvc2l0ZSwgTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5yZWxhdGlvbiIpLCAvLyROT04tTkxTLTEkCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5yZWxhdGlvbkRlc2MiKSwgZmFsc2UsIC8vJE5PTi1OTFMtMSQKKwkJCQlmYWxzZSk7CisJCXJpZ2h0cyA9IGNyZWF0ZURDQXR0cmlidXRlKHBhZ2VDb21wb3NpdGUsIE1lc3NhZ2VzCisJCQkJLmdldFN0cmluZygiTkR1YmxpbkNvcmUucmlnaHRzIiksIC8vJE5PTi1OTFMtMSQKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLnJpZ2h0c0Rlc2MiKSwgLy8kTk9OLU5MUy0xJAorCQkJCWZhbHNlLCBmYWxzZSk7CisKKwkJc3ViamVjdCA9IGNyZWF0ZURDQXR0cmlidXRlKHBhZ2VDb21wb3NpdGUsIE1lc3NhZ2VzCisJCQkJLmdldFN0cmluZygiTkR1YmxpbkNvcmUuc3ViamVjdCIpLCAvLyROT04tTkxTLTEkCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5zdWJqZWN0RGVzYyIpLCAvLyROT04tTkxTLTEkCisJCQkJZmFsc2UsIGZhbHNlKTsKKwkJbGFuZ3VhZ2UgPSBjcmVhdGVEQ0F0dHJpYnV0ZShwYWdlQ29tcG9zaXRlLCBNZXNzYWdlcworCQkJCS5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLmxhbmd1YWdlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLmxhbmd1YWdlRGVzYyIpLCAvLyROT04tTkxTLTEkCisJCQkJZmFsc2UsIGZhbHNlKTsKKwkJYmlibGlvZ3JhcGhpY0NpdGF0aW9uID0gY3JlYXRlRENBdHRyaWJ1dGUocGFnZUNvbXBvc2l0ZSwgTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5jaXRhdGlvbiIpLCAvLyROT04tTkxTLTEkCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5jaXRhdGlvbkRlc2MiKSwgZmFsc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAorCisJCWxpY2Vuc2UgPSBjcmVhdGVEQ0F0dHJpYnV0ZShwYWdlQ29tcG9zaXRlLCBNZXNzYWdlcworCQkJCS5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLmxpY2Vuc2UiKSwgLy8kTk9OLU5MUy0xJAorCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiTkR1YmxpbkNvcmUubGljZW5zRGVzYyIpLCAvLyROT04tTkxTLTEkCisJCQkJZmFsc2UsIGZhbHNlKTsKKwkJcmVxdWlyZWQgPSBjcmVhdGVEQ0F0dHJpYnV0ZShwYWdlQ29tcG9zaXRlLCBNZXNzYWdlcworCQkJCS5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLnJlcXVpcmVkIiksIC8vJE5PTi1OTFMtMSQKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLnJlcXVpcmVkRGVzYyIpLCAvLyROT04tTkxTLTEkCisJCQkJZmFsc2UsIGZhbHNlKTsKKwkJc3BhdGlhbCA9IGNyZWF0ZURDQXR0cmlidXRlKHBhZ2VDb21wb3NpdGUsIE1lc3NhZ2VzCisJCQkJLmdldFN0cmluZygiTkR1YmxpbkNvcmUuc3BhdGlhbCIpLCAvLyROT04tTkxTLTEkCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5zcGF0aWFsRGVzYyIpLCAvLyROT04tTkxTLTEkCisJCQkJZmFsc2UsIGZhbHNlKTsKKworCQlmb3JtYXQgPSBjcmVhdGVEQ0F0dHJpYnV0ZShwYWdlQ29tcG9zaXRlLCBNZXNzYWdlcworCQkJCS5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLmZvcm1hdCIpLCAvLyROT04tTkxTLTEkCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5mb3JtYXREZXNjIiksIC8vJE5PTi1OTFMtMSQKKwkJCQl0cnVlLCBmYWxzZSk7CisJCXR5cGUgPSBjcmVhdGVEQ0F0dHJpYnV0ZShwYWdlQ29tcG9zaXRlLCBNZXNzYWdlcworCQkJCS5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLnR5cGUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiTkR1YmxpbkNvcmUudHlwZURlc2MiKSwgLy8kTk9OLU5MUy0xJAorCQkJCXRydWUsIGZhbHNlKTsKKworCQlmaW5hbCBMYWJlbCByZXF1aXJlZEZpZWxkTGFiZWwgPSBuZXcgTGFiZWwocGFnZUNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlyZXF1aXJlZEZpZWxkTGFiZWwuc2V0VGV4dChSRVFVSVJFRF9GSUVMRF9DSEFSCisJCQkJKyBNZXNzYWdlcy5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLnJlcXVpcmVkRmllbGQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJZmluYWwgR3JpZERhdGEgcmVxdWlyZWRMYWJlbExheW91dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJcmVxdWlyZWRMYWJlbExheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOworCQlyZXF1aXJlZEZpZWxkTGFiZWwuc2V0TGF5b3V0RGF0YShyZXF1aXJlZExhYmVsTGF5b3V0RGF0YSk7CisKKwkJaW5pdGlhbGl6ZURDQXR0cmlidXRlcygpOworCisJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZUR1YmxpbkNvcmVQYWdlKCkpOworCQlzZXRDb250cm9sKHBhZ2VDb21wb3NpdGUpOworCX0gLy8gY3JlYXRlQ29udHJvbAorCisJLyoqCisJICogU2V0IHRoZSB7QGxpbmsgI2NyZWF0ZWR9IGF0dHJpYnV0ZSB0byBoYXZlIHRoZSBjdXJyZW50IGRhdGUgc3RyaW5nIGFuZAorCSAqIHRoZSB7QGxpbmsgI2NyZWF0b3J9IHRvIGJlIHRoZSB2YWx1ZSBvZiB0aGUgInVzZXIubmFtZSIgc3lzdGVtIHByb3BlcnR5LgorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEQ0F0dHJpYnV0ZXMoKSB7CisJCWNyZWF0ZWQuc2V0VGV4dChEdWJsaW5Db3JlSW1wbC5jcmVhdGVJU084NjAxRGF0ZVN0cmluZyhDYWxlbmRhcgorCQkJCS5nZXRJbnN0YW5jZSgpLmdldFRpbWUoKSkpOworCQljcmVhdG9yLnNldFRleHQoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLm5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKKwl9IC8vIGluaXRpYWxpemVEQ0ZpZWxkcworCisJLyoqCisJICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB7QGxpbmsgRHVibGluQ29yZX0gYXR0cmlidXRlIHRoYXQgd2lsbCBiZSBzZWVuCisJICogICAgICAgICAgICBieSB0aGUgdXNlci4KKwkgKiBAcGFyYW0gdG9vbFRpcAorCSAqICAgICAgICAgICAgdGhlIHRvb2wgdGlwIHRleHQgZm9yIHRoZSBhdHRyaWJ1dGUKKwkgKiBAcGFyYW0gcmVxdWlyZWRGaWVsZAorCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiB0aGUgYXR0cmlidXRlIGlzIHZpc3VhbGx5IG1hcmtlZAorCSAqICAgICAgICAgICAgd2l0aCB0aGUge0BsaW5rICNSRVFVSVJFRF9GSUVMRF9DSEFSfSBhcyBiZWluZyAicmVxdWlyZWQiCisJICogQHBhcmFtIHZhbGlkYXRpbmdGaWVsZAorCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgaXMgZXhhbWluZWQKKwkgKiAgICAgICAgICAgIGJ5IHtAbGluayAjdmFsaWRhdGVEdWJsaW5Db3JlUGFnZSgpfSB0byB2YWxpZGF0ZSB0aGUgcGFnZQorCSAqIEByZXR1cm4gYSBsYWJlbGVkIHRleHQgYXR0cmlidXRlCisJICovCisJcHJpdmF0ZSBUZXh0IGNyZWF0ZURDQXR0cmlidXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsCisJCQlmaW5hbCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgZmluYWwgU3RyaW5nIHRvb2xUaXAsCisJCQlmaW5hbCBib29sZWFuIHJlcXVpcmVkRmllbGQsIGZpbmFsIGJvb2xlYW4gdmFsaWRhdGluZ0ZpZWxkKSB7CisJCWZpbmFsIExhYmVsIGF0dHJpYnV0ZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOworCQlhdHRyaWJ1dGVMYWJlbC5zZXRUZXh0KGF0dHJpYnV0ZU5hbWUgKyAiOiIgLy8kTk9OLU5MUy0xJAorCQkJCSsgKHJlcXVpcmVkRmllbGQgPyBSRVFVSVJFRF9GSUVMRF9DSEFSIDogIiIpKTsgLy8kTk9OLU5MUy0xJAorCQlmaW5hbCBHcmlkRGF0YSBsYWJlbExheW91dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJbGFiZWxMYXlvdXREYXRhLmhvcml6b250YWxTcGFuID0gMTsKKwkJYXR0cmlidXRlTGFiZWwuc2V0TGF5b3V0RGF0YShsYWJlbExheW91dERhdGEpOworCisJCWZpbmFsIFRleHQgcmV0VmFsdWUgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOworCQlyZXRWYWx1ZS5zZXRUb29sVGlwVGV4dCh0b29sVGlwKTsKKwkJZmluYWwgR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlsYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQlsYWJlbExheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOworCQlyZXRWYWx1ZS5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOworCisJCS8vIElzIHRoaXMgYXR0cmlidXRlIHRvIGJlIHdhdGNoZWQgZm9yIHZhbGlkaXR5PworCQlpZiAodmFsaWRhdGluZ0ZpZWxkKSB7CisJCQkvLyBZZXMKKwkJCXJldFZhbHVlLmFkZE1vZGlmeUxpc3RlbmVyKGRjVmFsaWRhdG9yKTsKKwkJfQorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZURDQXR0cmlidXRlCisKKwkvKioKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZXMgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlCisJICogICAgICAgICB7QGxpbmsgRHVibGluQ29yZVBhZ2V9IGFyZSB2YWxpZC4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUR1YmxpbkNvcmVQYWdlKCkgeworCQlib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKKworCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7CisKKwkJLy8gSXMgdGhlcmUgYSB0aXRsZT8KKwkJaWYgKHRpdGxlLmdldFRleHQoKSA9PSBudWxsIHx8IHRpdGxlLmdldFRleHQoKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIk5EdWJsaW5Db3JlLnRpdGxlRXJyIikpOyAvLyROT04tTkxTLTEkCisJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQl9IC8vIGlmIHRpdGxlCisKKwkJLy8gSXMgdGhlcmUgYSBjcmVhdGVkIGRhdGU/CisJCWlmIChyZXRWYWx1ZSA9PSB0cnVlCisJCQkJJiYgKGNyZWF0ZWQuZ2V0VGV4dCgpICE9IG51bGwgJiYgIWNyZWF0ZWQuZ2V0VGV4dCgpLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIFllcworCQkJLy8gSXMgdGhlIGZvcm1hdCB2YWxpZD8KKwkJCWlmICghaXNWYWxpZERhdGVTdHJpbmcoY3JlYXRlZC5nZXRUZXh0KCkpKSB7CisJCQkJLy8gTm8KKwkJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5jcmVhdGVkRXJyIikpOyAvLyROT04tTkxTLTEkCisJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCX0KKwkJfSAvLyBpZiBjcmVhdGVkIGRhdGUKKworCQkvLyBJcyB0aGVyZSBhIGRhdGU/CisJCWlmIChyZXRWYWx1ZSA9PSB0cnVlCisJCQkJJiYgKGRhdGUuZ2V0VGV4dCgpICE9IG51bGwgJiYgIWRhdGUuZ2V0VGV4dCgpLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIFllcworCQkJLy8gSXMgdGhlIGZvcm1hdCB2YWxpZD8KKwkJCWlmICghaXNWYWxpZERhdGVTdHJpbmcoZGF0ZS5nZXRUZXh0KCkpKSB7CisJCQkJLy8gTm8KKwkJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuZ2V0U3RyaW5nKCJORHVibGluQ29yZS5kYXRlRXJyIikpOyAvLyROT04tTkxTLTEkCisJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCX0KKwkJfSAvLyBpZiBkYXRlCisKKwkJLy8gSXMgdGhlcmUgYSB2YWxpZCByYW5nZQorCQlpZiAocmV0VmFsdWUgPT0gdHJ1ZQorCQkJCSYmICh2YWxpZC5nZXRUZXh0KCkgIT0gbnVsbCAmJiAhdmFsaWQuZ2V0VGV4dCgpLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIFllcworCQkJLy8gSXMgdGhlIGZvcm1hdCB2YWxpZD8KKwkJCWlmICghaXNWYWxpZFZhbGlkRGF0ZVN0cmluZyh2YWxpZC5nZXRUZXh0KCkpKSB7CisJCQkJLy8gTm8KKwkJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuZ2V0U3RyaW5nKCJORHVibGluQ29yZS52YWxpZEVyciIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldFZhbHVlID0gZmFsc2U7CisJCQl9CisJCX0gLy8gaWYgZGF0ZQorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHZhbGlkYXRlRHVibGluQ29yZVBhZ2UKKworCS8qKgorCSAqIEBwYXJhbSB2YWxpZERhdGFSYW5nZVN0cmluZworCSAqICAgICAgICAgICAgYSBkYXRlIHN0cmluZyB0aGF0IGNvbmZvcm1zIHRvIElTTyZuYnNwOzg2MDEgPGEKKwkgKiAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWUiPgorCSAqICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvTk9URS1kYXRldGltZTwvYT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWxpZCBkYXRlIHJhbmdlIHN0cmluZyBpcyBwcm9wZXJseQorCSAqICAgICAgICAgZm9ybWF0dGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkVmFsaWREYXRlU3RyaW5nKAorCQkJZmluYWwgU3RyaW5nIHZhbGlkRGF0YVJhbmdlU3RyaW5nKSB7CisJCS8vIFRPRE8gc2hvdWxkIHByb2JhYmx5IHRlc3QgaXNFbmRCZWZvcmVTdGFydCBhcyB3ZWxsCisJCXJldHVybiBEdWJsaW5Db3JlSW1wbC5pc1ZhbGlkU3RhcnREYXRlVmFsaWQodmFsaWREYXRhUmFuZ2VTdHJpbmcpCisJCQkJJiYgRHVibGluQ29yZUltcGwuaXNWYWxpZEVuZERhdGVWYWxpZCh2YWxpZERhdGFSYW5nZVN0cmluZyk7CisJfSAvLyBpc1ZhbGlkVmFsaWREYXRlU3RyaW5nCisKKwlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNWYWxpZERhdGVTdHJpbmcoZmluYWwgU3RyaW5nIGRhdGVTdHJpbmcpIHsKKwkJYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOworCQlmaW5hbCBTdHJpbmcgdHJpbWVkRGF0ZVN0cmluZyA9IGRhdGVTdHJpbmcudHJpbSgpOworCQl0cnkgeworCQkJLy8gSXMgaXQgdGhlIHJpZ2h0IGxlbmd0aD8KKwkJCWlmICh0cmltZWREYXRlU3RyaW5nLmxlbmd0aCgpICE9ICJ5eXl5LWRkLW1tIi5sZW5ndGgoKSkgeyAvLyROT04tTkxTLTEkCisJCQkJLy8gTm8KKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCUR1YmxpbkNvcmVJbXBsLmNyZWF0ZURhdGVGcm9tSVNPODYwMURhdGVTdHJpbmcoZGF0ZVN0cmluZyk7CisJCQkvLyBJZiB0aGVyZSdzIG5vIHBhcnNlIGV4Y2VwdGlvbiwgdGhlIHN0cmluZyBpcyB2YWxpZAorCQkJcmV0VmFsdWUgPSB0cnVlOworCQl9IGNhdGNoIChmaW5hbCBQYXJzZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQl9CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGlzVmFsaWREYXRlU3RyaW5nCisKKwkvKioKKwkgKiBAcGFyYW0gc3RhcnREYXRlU3RyaW5nCisJICogICAgICAgICAgICBhIGRhdGUgc3RyaW5nIHRoYXQgY29uZm9ybXMgdG8gSVNPJm5ic3A7ODYwMSA8YQorCSAqICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvTk9URS1kYXRldGltZSI+CisJICogICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9OT1RFLWRhdGV0aW1lPC9hPgorCSAqIEBwYXJhbSBlbmREYXRlU3RyaW5nCisJICogICAgICAgICAgICBhIGRhdGUgc3RyaW5nIHRoYXQgY29uZm9ybXMgdG8gSVNPJm5ic3A7ODYwMSA8YQorCSAqICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvTk9URS1kYXRldGltZSI+CisJICogICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9OT1RFLWRhdGV0aW1lPC9hPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRhdGUgcmVwcmVzZW50ZWQgYnkKKwkgKiAgICAgICAgIDxjb2RlPmVuZERhdGVTdHJpbmc8L2NvZGU+IGlzIGJlZm9yZSB0aGUgZGF0ZSByZXByZXNlbnRlZCBieQorCSAqICAgICAgICAgPGNvZGU+c3RhcnREYXRlU3RyaW5nPC9jb2RlPgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VuZEJlZm9yZVN0YXJ0KGZpbmFsIFN0cmluZyBzdGFydERhdGVTdHJpbmcsCisJCQlmaW5hbCBTdHJpbmcgZW5kRGF0ZVN0cmluZykgeworCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisJCXRyeSB7CisJCQlmaW5hbCBEYXRlIHN0YXJ0RGF0ZSA9IER1YmxpbkNvcmVJbXBsCisJCQkJCS5jcmVhdGVEYXRlRnJvbUlTTzg2MDFEYXRlU3RyaW5nKHN0YXJ0RGF0ZVN0cmluZyk7CisJCQlmaW5hbCBEYXRlIGVuZERhdGUgPSBEdWJsaW5Db3JlSW1wbAorCQkJCQkuY3JlYXRlRGF0ZUZyb21JU084NjAxRGF0ZVN0cmluZyhlbmREYXRlU3RyaW5nKTsKKwkJCXJldFZhbHVlID0gZW5kRGF0ZS5iZWZvcmUoc3RhcnREYXRlKTsKKwkJfSBjYXRjaCAoZmluYWwgUGFyc2VFeGNlcHRpb24gZSkgeworCQkJcmV0VmFsdWUgPSB0cnVlOworCQl9IC8vIGNhdGNoCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGlzRW5kQmVmb3JlU3RhcnQKKworCS8qKgorCSAqIEByZXR1cm4gYSB7QGxpbmsgRHVibGluQ29yZX0gaW5zdGFuY2UgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgY29udGVudHMgb2YKKwkgKiAgICAgICAgIHRoaXMge0BsaW5rIER1YmxpbkNvcmVQYWdlfQorCSAqLworCXB1YmxpYyBEdWJsaW5Db3JlIGNyZWF0ZUR1YmxpbkNvcmUoKSB7CisJCWZpbmFsIER1YmxpbkNvcmUgcmV0VmFsdWUgPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEdWJsaW5Db3JlKCk7CisKKwkJaWYgKGlzU2V0KHRpdGxlLmdldFRleHQoKSkpIHsKKwkJCXJldFZhbHVlLnNldFRpdGxlKHRpdGxlLmdldFRleHQoKSk7CisJCX0KKwkJaWYgKGlzU2V0KGRlc2NyaXB0aW9uLmdldFRleHQoKSkpIHsKKwkJCXJldFZhbHVlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLmdldFRleHQoKSk7CisJCX0KKwkJaWYgKGlzU2V0KGNyZWF0b3IuZ2V0VGV4dCgpKSkgeworCQkJcmV0VmFsdWUuc2V0Q3JlYXRvcihjcmVhdG9yLmdldFRleHQoKSk7CisJCX0KKwkJaWYgKGlzU2V0KGRhdGUuZ2V0VGV4dCgpKSkgeworCQkJcmV0VmFsdWUuc2V0RGF0ZShkYXRlLmdldFRleHQoKSk7CisJCX0KKwkJaWYgKGlzU2V0KGZvcm1hdC5nZXRUZXh0KCkpKSB7CisJCQlyZXRWYWx1ZS5zZXRGb3JtYXQoZm9ybWF0LmdldFRleHQoKSk7CisJCX0KKwkJaWYgKGlzU2V0KHB1Ymxpc2hlci5nZXRUZXh0KCkpKSB7CisJCQlyZXRWYWx1ZS5zZXRQdWJsaXNoZXIocHVibGlzaGVyLmdldFRleHQoKSk7CisJCX0KKwkJaWYgKGlzU2V0KGNvdmVyYWdlLmdldFRleHQoKSkpIHsKKwkJCXJldFZhbHVlLnNldENvdmVyYWdlKGNvdmVyYWdlLmdldFRleHQoKSk7CisJCX0KKwkJaWYgKGlzU2V0KGNvbnRyaWJ1dG9yLmdldFRleHQoKSkpIHsKKwkJCXJldFZhbHVlLnNldENvbnRyaWJ1dG9yKGNvbnRyaWJ1dG9yLmdldFRleHQoKSk7CisJCX0KKwkJaWYgKGlzU2V0KHJlbGF0aW9uLmdldFRleHQoKSkpIHsKKwkJCXJldFZhbHVlLnNldFJlbGF0aW9uKHJlbGF0aW9uLmdldFRleHQoKSk7CisJCX0KKwkJaWYgKGlzU2V0KHJpZ2h0cy5nZXRUZXh0KCkpKSB7CisJCQlyZXRWYWx1ZS5zZXRSaWdodHMocmlnaHRzLmdldFRleHQoKSk7CisJCX0KKwkJaWYgKGlzU2V0KHNvdXJjZS5nZXRUZXh0KCkpKSB7CisJCQlyZXRWYWx1ZS5zZXRTb3VyY2Uoc291cmNlLmdldFRleHQoKSk7CisJCX0KKwkJaWYgKGlzU2V0KHN1YmplY3QuZ2V0VGV4dCgpKSkgeworCQkJcmV0VmFsdWUuc2V0U3ViamVjdChzdWJqZWN0LmdldFRleHQoKSk7CisJCX0KKwkJaWYgKGlzU2V0KHR5cGUuZ2V0VGV4dCgpKSkgeworCQkJcmV0VmFsdWUuc2V0VHlwZSh0eXBlLmdldFRleHQoKSk7CisJCX0KKwkJaWYgKGlzU2V0KGxhbmd1YWdlLmdldFRleHQoKSkpIHsKKwkJCXJldFZhbHVlLnNldEJpYmxpb2dyYXBoaWNDaXRhdGlvbihsYW5ndWFnZS5nZXRUZXh0KCkpOworCQl9CisJCWlmIChpc1NldChiaWJsaW9ncmFwaGljQ2l0YXRpb24uZ2V0VGV4dCgpKSkgeworCQkJcmV0VmFsdWUuc2V0QmlibGlvZ3JhcGhpY0NpdGF0aW9uKGJpYmxpb2dyYXBoaWNDaXRhdGlvbi5nZXRUZXh0KCkpOworCQl9CisJCWlmIChpc1NldChjcmVhdGVkLmdldFRleHQoKSkpIHsKKwkJCXJldFZhbHVlLnNldENyZWF0ZWQoY3JlYXRlZC5nZXRUZXh0KCkpOworCQl9CisJCWlmIChpc1NldChsaWNlbnNlLmdldFRleHQoKSkpIHsKKwkJCXJldFZhbHVlLnNldExpY2Vuc2UobGljZW5zZS5nZXRUZXh0KCkpOworCQl9CisJCWlmIChpc1NldChyZXF1aXJlZC5nZXRUZXh0KCkpKSB7CisJCQlyZXRWYWx1ZS5zZXRSZXF1aXJlZChyZXF1aXJlZC5nZXRUZXh0KCkpOworCQl9CisJCWlmIChpc1NldChzcGF0aWFsLmdldFRleHQoKSkpIHsKKwkJCXJldFZhbHVlLnNldFNwYXRpYWwoc3BhdGlhbC5nZXRUZXh0KCkpOworCQl9CisJCWlmIChpc1NldCh2YWxpZC5nZXRUZXh0KCkpKSB7CisJCQlyZXRWYWx1ZS5zZXRWYWxpZCh2YWxpZC5nZXRUZXh0KCkpOworCQl9CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlRHVibGluQ29yZQorCisJLyoqCisJICogQHBhcmFtIHRleHQKKwkgKiAgICAgICAgICAgIGEgU3RyaW5nCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3RyaW5nIGlzIG5vdCBudWxsIG5vciB0aGUgZW1wdHkKKwkgKiAgICAgICAgIHN0cmluZworCSAqIEBzZWUgI2NyZWF0ZUR1YmxpbkNvcmUoKQorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc1NldChmaW5hbCBTdHJpbmcgdGV4dCkgeworCQlyZXR1cm4gISh0ZXh0ID09IG51bGwgfHwgdGV4dC5lcXVhbHMoIiIpKTsgLy8kTk9OLU5MUy0xJAorCX0KK30gLy8gRHVibGluQ29yZVBhZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9NZXNzYWdlcy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2YjZiMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9NZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8vIE1lc3NhZ2VzLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50czsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIFJlc291cmNlIEJ1bmRsZSBmb3IgdGhpcyBwYWNrYWdlLgorICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZXMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IENvbnN0YW50cy5JRF9ST09UCisJCQkrICIudWkud2l6YXJkcy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCisJCQkuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKKworCXByaXZhdGUgTWVzc2FnZXMoKSB7CisJCS8vIGVtcHR5CisJfQorCisJLyoqCisJICogQHBhcmFtIGtleQorCSAqICAgICAgICAgICAgdGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UKKwkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSBrZXkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9IC8vIGdldFN0cmluZworfSAvLyBXaXphcmRNZXNzYWdlcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL05ld0V4cGVyaW1lbnRXaXphcmQuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdFeHBlcmltZW50V2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5OGYzYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdFeHBlcmltZW50V2l6YXJkLmphdmEKQEAgLTAsMCArMSwxNjAgQEAKKy8vIE5ld0V4cGVyaW1lbnRXaXphcmQuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBXaXphcmQgZm9yIG1ha2luZyBuZXcgU1RFTQorICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5leHBlcmltZW50LkV4cGVyaW1lbnR9cy4KKyAqIAorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWwKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0dyYXBoV2l6YXJkCisgKi8KK3B1YmxpYyBjbGFzcyBOZXdFeHBlcmltZW50V2l6YXJkIGV4dGVuZHMgTmV3SWRlbnRpZmlhYmxlV2l6YXJkIHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNnZXRXaXphcmRUaXRsZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRXaXphcmRUaXRsZSgpIHsKKwkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiTkV4cGVyaW1lbnRXaXoud2l6YXJkX3RpdGxlIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjY3JlYXRlTmV3SWRlbnRpZmlhYmxlUGFnZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE5ld0lkZW50aWZpYWJsZVBhZ2UgY3JlYXRlTmV3SWRlbnRpZmlhYmxlUGFnZSgpIHsKKwkJZmluYWwgTmV3RXhwZXJpbWVudFBhZ2UgcmV0VmFsdWUgPSBuZXcgTmV3RXhwZXJpbWVudFBhZ2UoTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJORXhwZXJpbWVudFdpei5wYWdlX3RpdGxlIikpOyAvLyROT04tTkxTLTEkCisJCXJldFZhbHVlLnNldFRpdGxlKE1lc3NhZ2VzLmdldFN0cmluZygiTkV4cGVyaW1lbnRXaXoucGFnZV90aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQlyZXRWYWx1ZS5zZXREZXNjcmlwdGlvbihNZXNzYWdlcworCQkJCS5nZXRTdHJpbmcoIk5FeHBlcmltZW50V2l6LnBhZ2VfZGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKKworCQl0aGlzLnNldEhlbHBDb250ZXh0SWQoIm9yZy5lY2xpcHNlLnN0ZW0uZG9jLm5ld2V4cGVyaW1lbnRfY29udGV4dGlkIik7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZU5ld0lkZW50aWZpYWJsZVBhZ2UKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNjcmVhdGVEdWJsaW5Db3JlUGFnZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIER1YmxpbkNvcmVQYWdlIGNyZWF0ZUR1YmxpbkNvcmVQYWdlKCkgeworCQlyZXR1cm4gbmV3IER1YmxpbkNvcmVQYWdlKCkgeworCQkJLyoqCisJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQuRHVibGluQ29yZVBhZ2UjaW5pdGlhbGl6ZURDRmllbGRzKCkKKwkJCSAqLworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRENBdHRyaWJ1dGVzKCkgeworCQkJCXN1cGVyLmluaXRpYWxpemVEQ0F0dHJpYnV0ZXMoKTsKKwkJCQlmb3JtYXQuc2V0VGV4dChFeHBlcmltZW50UGFja2FnZS5lTlNfVVJJKTsKKwkJCQlmb3JtYXQuc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJdHlwZS5zZXRUZXh0KFNURU1VUkkuRVhQRVJJTUVOVF9UWVBFX1VSSS50b1N0cmluZygpKTsKKwkJCQl0eXBlLnNldEVuYWJsZWQoZmFsc2UpOworCQkJfQorCQl9OworCX0gLy8gY3JlYXRlRHVibGluQ29yZVBhZ2UKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNjcmVhdGVJZGVudGlmaWFibGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJZGVudGlmaWFibGUgY3JlYXRlSWRlbnRpZmlhYmxlKCkgeworCQlJZGVudGlmaWFibGUgcmV0VmFsdWUgPSBFeHBlcmltZW50RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXhwZXJpbWVudCgpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVTcGVjaWZpY0lkZW50aWZpYWJsZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2dldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkgeworCQlyZXR1cm4gTmV3U1RFTVByb2plY3RXaXphcmQuRVhQRVJJTUVOVFNfRk9MREVSX05BTUU7CisJfSAvLyBnZXRGb2xkZXJOYW1lCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lRXh0ZW5zaW9uKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25GaWxlTmFtZUV4dGVuc2lvbigpIHsKKwkJcmV0dXJuIEV4cGVyaW1lbnRQYWNrYWdlLmVOQU1FOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTmV3RXhwZXJpbWVudFBhZ2UgZXh0ZW5kcyBOZXdJZGVudGlmaWFibGVQYWdlIHsKKworCQkvKioKKwkJICogQHBhcmFtIHBhZ2VOYW1lCisJCSAqLworCQlwcm90ZWN0ZWQgTmV3RXhwZXJpbWVudFBhZ2UoZmluYWwgU3RyaW5nIHBhZ2VOYW1lKSB7CisJCQlzdXBlcihwYWdlTmFtZSk7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVNwZWNpZmljQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCAib3JnLmVjbGlwc2Uuc3RlbS5kb2MubmV3ZXhwZXJpbWVudF9jb250ZXh0aWQiKTsKKwkJCXJldHVybiBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQl9IC8vIGNyZWF0ZVNwZWNpZmljQ29tcG9zaXRlCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZC5OZXdJZGVudGlmaWFibGVQYWdlI2dldERDRGVzY3JpcHRpb24oKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RENEZXNjcmlwdGlvbigpIHsKKwkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChNZXNzYWdlcworCQkJCQkuZ2V0U3RyaW5nKCJORXhwZXJpbWVudFdpei5EQ19ERVNDUklQVElPTiIpLAorCQkJCQluZXcgT2JqZWN0W10geyBzZXJpYWxpemF0aW9uRmlsZU5hbWVGaWVsZC5nZXRUZXh0KCkgfSk7CisJCX0gLy8gZ2V0RENEZXNjcmlwdGlvbgorCisJfSAvLyBOZXdFeHBlcmltZW50UGFnZQorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBJSGFuZGxlcn0gZm9yIHRoZSBjb21tYW5kIHRoYXQgY3JlYXRlcyBhCisJICoge0BsaW5rIE5ld0V4cGVyaW1lbnRXaXphcmR9CisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBOZXdFeHBlcmltZW50V2l6YXJkQ29tbWFuZEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIKKwkJCWltcGxlbWVudHMgSUhhbmRsZXIgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudCkKKwkJICovCisJCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBleGVjdXRpb25FdmVudCkKKwkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gSGFuZGxlclV0aWwKKwkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvd0NoZWNrZWQoZXhlY3V0aW9uRXZlbnQpOworCQkJZmluYWwgTmV3RXhwZXJpbWVudFdpemFyZCB3aXphcmQgPSBuZXcgTmV3RXhwZXJpbWVudFdpemFyZCgpOworCQkJd2l6YXJkLmluaXQod2luZG93LmdldFdvcmtiZW5jaCgpLCBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKKwkJCWZpbmFsIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgU1RFTVdpemFyZERpYWxvZyh3aW5kb3cKKwkJCQkJLmdldFNoZWxsKCksIHdpemFyZCk7CisJCQl3aXphcmREaWFsb2cub3BlbigpOworCQkJcmV0dXJuIG51bGw7CisJCX0gLy8gZXhlY3V0ZQorCX0gLy8gTmV3RXhwZXJpbWVudFdpemFyZENvbW1hbmRIYW5kbGVyCisKK30gLy8gTmV3RXhwZXJpbWVudFdpemFyZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdJZGVudGlmaWFibGVQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvTmV3SWRlbnRpZmlhYmxlUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OTM2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvTmV3SWRlbnRpZmlhYmxlUGFnZS5qYXZhCkBAIC0wLDAgKzEsNDU3IEBACisvLyBOZXdJZGVudGlmaWFibGVQYWdlLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcmVzZW50YXRpb24uQ29yZUVkaXRvckFkdmlzb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5VdGlsaXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZXhwbG9yZXIuSWRlbnRpZmlhYmxlVHJlZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0aGUge0BsaW5rIFdpemFyZFBhZ2V9IHRoYXQgaXMgdGhlIHN1cGVyIGNsYXNzIG9mIGFsbCB3aXphcmQKKyAqIHBhZ2VzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZGV0YWlscyBvZiBhbiB7QGxpbmsgSWRlbnRpZmlhYmxlfS4KKyAqIAorICogQHNlZSBEdWJsaW5Db3JlUGFnZQorICogQHNlZSBOZXdJZGVudGlmaWFibGVXaXphcmQKKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIE5ld0lkZW50aWZpYWJsZVBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKKworCS8qKgorCSAqIFRoaXMge0BsaW5rIENvbWJvfSB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBuYW1lcyBvZiB0aGUgcHJvamVjdHMgaW4KKwkgKiB0aGUgd29ya3NwYWNlIHRoYXQgdGhlIHtAbGluayBJZGVudGlmaWFibGV9IGNhbiBiZSBjcmVhdGVkIGluLgorCSAqLworCXByb3RlY3RlZCBDb21ibyBwcm9qZWN0TmFtZXNDb21ibzsKKworCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGluIHdoaWNoIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfSB3aWxsIGJlCisJICogc2VyaWFsaXplZC4KKwkgKiAKKwkgKiBAc2VlIE5ld0lkZW50aWZpYWJsZVdpemFyZCNjcmVhdGVJZGVudGlmaWFibGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCisJICogICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQorCSAqLworCXByb3RlY3RlZCBUZXh0IHNlcmlhbGl6YXRpb25GaWxlTmFtZUZpZWxkOworCisJLyoqCisJICogVGhpcyB7QGxpbmsgQ29tcG9zaXRlfSBpcyBjcmVhdGVkIGJ5IHRoZSBzdWJjbGFzc2VzIHdpdGggdGhlIGNhbGwgdG8KKwkgKiB7QGxpbmsgI2NyZWF0ZVNwZWNpZmljQ29tcG9zaXRlKENvbXBvc2l0ZSl9LiBUaGlzIHtAbGluayBDb21wb3NpdGV9CisJICogY29udGFpbnMgYWxsIG9mIHRoZSBpbnRlcmZhY2UgZmVhdHVyZXMgZm9yIGRlZmluaW5nIHRoZSBkZXRhaWxzIG9mIHRoZQorCSAqIHtAbGluayBJZGVudGlmaWFibGV9IHRvIGJlIGNyZWF0ZWQuCisJICovCisJcHJpdmF0ZSBDb21wb3NpdGUgc3BlY2lmaWNDb21wb3NpdGU7CisKKwkvKioKKwkgKiBUaGUgY29sbGVjdGlvbiBvZiBTVEVNIHByb2plY3RzIGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4gVGhpcyB3aWxsIGJlCisJICogdXNlZCB0byBwb3B1bGF0ZSB7QGxpbmsgI3Byb2plY3ROYW1lc0NvbWJvfS4KKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdDxJUHJvamVjdD4gc3RlbVByb2plY3RzID0gbnVsbDsKKworCS8qKgorCSAqIFJlbWVtYmVyIHRoZSBsYXN0IHByb2plY3QgdXNlZCBpZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gaXMgbm90IHJlZmVyZW5jaW5nIAorCSAqIGFuIGV4aXN0aW5nIHByb2plY3QKKwkgKi8KKwkKKwlzdGF0aWMgSVByb2plY3QgbGFzdFByb2plY3QgPSBudWxsOworCQorCS8qKgorCSAqIFRoaXMge0BsaW5rIE1vZGlmeUxpc3RlbmVyfSBpcyBhdHRhY2hlZCB0byB0aG9zZSB3aWRnZXRzIHdob3NlIGNvbnRlbnRzCisJICogbmVlZCB0byBiZSB2ZXJpZmllZCBmb3IgY29ycmVjdG5lc3MuIFdoZW5ldmVyIG9uZSBvZiB0aG9zZSBpcyBtb2RpZmllZCwgYQorCSAqIGNhbGwgdG8ge0BsaW5rICN2YWxpZGF0ZVBhZ2UoKX0gaXMgbWFkZSB3aGljaCB0aGVuIHJldHVybnMKKwkgKiA8Y29kZT50cnVlPC9jb2RlPiBvciA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgdmFsdWUgaXMgcGFzc2VkIHRvCisJICoge0BsaW5rICNzZXRQYWdlQ29tcGxldGUoYm9vbGVhbil9IHdoaWNoIHRoZW4gZW5hYmxlcyBvciBkaXNhYmxlcyB0aGUKKwkgKiBidXR0b25zIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UuIFRoZSBhdHRhY2htZW50IGlzIGRvbmUgaW4gdGhlIG1ldGhvZAorCSAqIHtAbGluayAjY3JlYXRlUHJvamVjdENvbXBvc2l0ZShDb21wb3NpdGUpfSBhbmQgaW4KKwkgKiB7QGxpbmsgI2NyZWF0ZVNlcmlhbGl6YXRpb25Db21wb3NpdGUoQ29tcG9zaXRlKX0KKwkgKi8KKwlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgcHJvamVjdFZhbGlkYXRvciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgTW9kaWZ5RXZlbnQgZSkgeworCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKKwkJfQorCX07CisKKwkvKioKKwkgKiBAcGFyYW0gcGFnZU5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwYWdlLCB0aGlzIGlzIHBhc3NlZCB1cCBieSBhIHN1YmNsYXNzLgorCSAqLworCXByb3RlY3RlZCBOZXdJZGVudGlmaWFibGVQYWdlKGZpbmFsIFN0cmluZyBwYWdlTmFtZSkgeworCQlzdXBlcihwYWdlTmFtZSk7CisJfSAvLyBOZXdJZGVudGlmaWFibGVQYWdlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisJCS8qCisJCSAqIENyZWF0ZXMgYSB7QGxpbmsgQ29tcG9zaXRlfSBhbmQgY2FsbHMge0BsaW5rICAjc2V0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sKX0uIEJhc2ljYWxseSwgaXQgYWRkcworCQkgKiB0aHJlZSB0aGluZ3MgdG8gdGhlIENvbXBvc2l0ZSBpdCBjcmVhdGVzLCBhICJwcm9qZWN0IGNvbXBvc2l0ZSIgYW4KKwkJICogImlkZW50aWZpYWJsZSBjb21wb3NpdGUiIGFuZCBhICJzcGVjaWZpYyBjb21wb3NpdGUiLiBUaGUgZmlyc3QgaXMKKwkJICogY29tbW9uIHRvIGFsbCBwYWdlcyBhbmQgaXMgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIHByb2plY3QgdGhlCisJCSAqIElkZW50aWZpYWJsZSB3aWxsIGJlIHNlcmlhbGl6ZWQgaW4uIFRoZSBzZWNvbmQsIGFsc28gY29tbW9uIHRvIGFsbAorCQkgKiBwYWdlcywgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBzZXJpYWxpemF0aW9uIGZpbGUgZm9yIHRoZQorCQkgKiBJZGVudGlmaWFibGUuIFRoZSB0aGlyZCBpcyBmb3IgdGhlIHNwZWNpZmljIGRldGFpbHMgZm9yIGRlZmluaW5nIHRoZQorCQkgKiBJZGVudGlmaWFibGUuCisJCSAqLworCQkvLyBQYWdlIENvbXBvc2l0ZQorCQlmaW5hbCBDb21wb3NpdGUgcGFnZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCWZpbmFsIEdyaWRMYXlvdXQgcGFnZUxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCXBhZ2VMYXlvdXQubnVtQ29sdW1ucyA9IDE7CisJCXBhZ2VMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTI7CisJCXBhZ2VDb21wb3NpdGUuc2V0TGF5b3V0KHBhZ2VMYXlvdXQpOworCisJCWZpbmFsIEdyaWREYXRhIHBhZ2VMYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCXBhZ2VMYXlvdXREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJcGFnZUxheW91dERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOworCQlwYWdlTGF5b3V0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJcGFnZUNvbXBvc2l0ZS5zZXRMYXlvdXQocGFnZUxheW91dCk7CisKKwkJY3JlYXRlUHJvamVjdENvbXBvc2l0ZShwYWdlQ29tcG9zaXRlKTsKKworCQkvLyBIb3Jpem9udGFsIFNlcGFyYXRvcgorCQlmaW5hbCBMYWJlbCBzZXBlcmF0b3IgPSBuZXcgTGFiZWwocGFnZUNvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwKKwkJCQl8IFNXVC5TRVBBUkFUT1IpOworCQlzZXBlcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisKKwkJZmluYWwgQ29tcG9zaXRlIGlkZW50aWZpYWJsZUNvbXBvc2l0ZSA9IGNyZWF0ZVNlcmlhbGl6YXRpb25Db21wb3NpdGUocGFnZUNvbXBvc2l0ZSk7CisJCWlkZW50aWZpYWJsZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKKwkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKworCQkvLyBBZGQgYW55dGhpbmcgdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB3aXphcmQKKwkJc3BlY2lmaWNDb21wb3NpdGUgPSBjcmVhdGVTcGVjaWZpY0NvbXBvc2l0ZShwYWdlQ29tcG9zaXRlKTsKKwkJLy8gV2FzIHRoZXJlIGFueXRoaW5nPworCQlpZiAoc3BlY2lmaWNDb21wb3NpdGUgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlmaW5hbCBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCQlzcGVjaWZpY0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKKwkJfSAvLyBpZgorCisJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7CisJCXBhcmVudC5wYWNrKCk7CisJCXNldENvbnRyb2wocGFnZUNvbXBvc2l0ZSk7CisJfSAvLyBjcmVhdGVDb250cm9sCisKKwkvKioKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICB0aGUgcGFyZW50IHtAbGluayBDb21wb3NpdGV9CisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3RDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQlmaW5hbCBDb21wb3NpdGUgcHJvamVjdENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTm9uZSk7CisJCWZpbmFsIEdyaWRMYXlvdXQgcHJvamVjdENvbXBvc2l0ZUxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCXByb2plY3RDb21wb3NpdGVMYXlvdXQubnVtQ29sdW1ucyA9IDM7CisJCXByb2plY3RDb21wb3NpdGVMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTI7CisJCXByb2plY3RDb21wb3NpdGVMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJcHJvamVjdENvbXBvc2l0ZUxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCXByb2plY3RDb21wb3NpdGUuc2V0TGF5b3V0KHByb2plY3RDb21wb3NpdGVMYXlvdXQpOworCisJCWZpbmFsIEdyaWREYXRhIHByb2plY3RDb21wb3NpdGVMYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCXByb2plY3RDb21wb3NpdGVMYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQlwcm9qZWN0Q29tcG9zaXRlLnNldExheW91dERhdGEocHJvamVjdENvbXBvc2l0ZUxheW91dERhdGEpOworCisJCS8vIFByb2plY3QgTGFiZWwKKwkJZmluYWwgTGFiZWwgcHJvamVjdExhYmVsID0gbmV3IExhYmVsKHByb2plY3RDb21wb3NpdGUsIFNXVC5MRUZUKTsKKwkJcHJvamVjdExhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSWRXaXoucHJvamVjdCIpICsgIjoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWZpbmFsIEdyaWREYXRhIHByb2plY3RMYWJlbExheW91dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJcHJvamVjdExhYmVsTGF5b3V0RGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7CisJCXByb2plY3RMYWJlbExheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCXByb2plY3RMYWJlbC5zZXRMYXlvdXREYXRhKHByb2plY3RMYWJlbExheW91dERhdGEpOworCisJCS8vIFByb2plY3QgQ29tYm8KKwkJcHJvamVjdE5hbWVzQ29tYm8gPSBuZXcgQ29tYm8ocHJvamVjdENvbXBvc2l0ZSwgU1dULkJPUkRFUgorCQkJCXwgU1dULlJFQURfT05MWSk7CisJCWZpbmFsIEdyaWREYXRhIHByb2plY3RGaWVsZExheW91dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJcHJvamVjdEZpZWxkTGF5b3V0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJcHJvamVjdEZpZWxkTGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJcHJvamVjdEZpZWxkTGF5b3V0RGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7CisJCXByb2plY3ROYW1lc0NvbWJvLnNldExheW91dERhdGEocHJvamVjdEZpZWxkTGF5b3V0RGF0YSk7CisKKwkJLy8gaW5pdGlhbGl6ZSB0aGUgcHJvamVjdCBmaWVsZCB0byBwb2ludCB0byB0aGUgc2VsZWN0ZWQgcHJvamVjdAorCQlpbml0aWFsaXplUHJvamVjdENvbWJvKHByb2plY3ROYW1lc0NvbWJvKTsKKworCQkvLyBUaGUgcHJvamVjdFZhbGlkYXRvciB3aWxsIGxvb2sgYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWVsZCBhbmQKKwkJLy8gZGV0ZXJtaW5lIGlmIGl0IHJlZmVycyB0byBhIHZhbGlkIHByb2plY3QuCisJCXByb2plY3ROYW1lc0NvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKHByb2plY3RWYWxpZGF0b3IpOworCQkKKwkJLy8gUmVtZW1iZXIgdGhlIHNlbGVjdGlvbiBkb25lIGZvciBmdXR1cmUgCisJCXByb2plY3ROYW1lc0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCU5ld0lkZW50aWZpYWJsZVBhZ2UubGFzdFByb2plY3QgPSBOZXdJZGVudGlmaWFibGVQYWdlLnRoaXMuZ2V0U2VsZWN0ZWRQcm9qZWN0KCk7CisJCQl9CisJCQkKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCisJCQl9CisJCX0pOworCQkvLyBQcm9qZWN0IEJyb3dzZSBCdXR0b24KKwkJZmluYWwgQnV0dG9uIHByb2plY3RGaWVsZEJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24ocHJvamVjdENvbXBvc2l0ZSwKKwkJCQlTV1QuUFVTSCk7CisJCXByb2plY3RGaWVsZEJyb3dzZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiTklkV2l6LmJyb3dzZSIpKTsgLy8kTk9OLU5MUy0xJAorCisJCXByb2plY3RGaWVsZEJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKworCQkJLyoqCisJCQkgKiBUaGUgYnJvd3NlIGJ1dHRvbiB3aWxsIHBvcC11cCBhIGZpbGUgc2VhcmNoIGRpYWxvZyBhbmQgYWxsb3cgdGhlCisJCQkgKiB1c2VyIHRvIHNwZWNpZnkgdGhlIHByb2plY3QKKwkJCSAqIAorCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKKwkJCSAqLworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCgKKwkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlmaW5hbCBTdHJpbmcgZmlsZVBhdGggPSBDb3JlRWRpdG9yQWR2aXNvci5vcGVuRmlsZVBhdGhEaWFsb2coCisJCQkJCQlnZXRTaGVsbCgpLCAiKiIsIFNXVC5PUEVOKTsgLy8kTk9OLU5MUy0xJAorCQkJCWlmIChmaWxlUGF0aCAhPSBudWxsKSB7CisJCQkJCXByb2plY3ROYW1lc0NvbWJvLnNldFRleHQoZmlsZVBhdGgpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJfSAvLyBjcmVhdGVQcm9qZWN0Q29tcG9zaXRlCisKKwkvKioKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICB0aGUgcGFyZW50IHtAbGluayBDb21wb3NpdGV9CisJICogQHJldHVybiBhIHtAbGluayBDb21wb3NpdGV9IGluIHdoaWNoIHRoZSB1c2VyIGNhbiBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZQorCSAqICAgICAgICAgZmlsZSBpbiB3aGljaCB0aGUge0BsaW5rIElkZW50aWZpYWJsZX0gc2hvdWxkIGJlIHNlcmlhbGl6ZWQuCisJICovCisJcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlU2VyaWFsaXphdGlvbkNvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisJCWZpbmFsIENvbXBvc2l0ZSByZXRWYWx1ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCUdyaWREYXRhIGdyaWREYXRhOworCisJCWZpbmFsIEdyaWRMYXlvdXQgaWRlbnRpZmFibGVDb21wb3NpdGVMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlpZGVudGlmYWJsZUNvbXBvc2l0ZUxheW91dC5udW1Db2x1bW5zID0gMzsKKwkJaWRlbnRpZmFibGVDb21wb3NpdGVMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTI7CisJCWlkZW50aWZhYmxlQ29tcG9zaXRlTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCWlkZW50aWZhYmxlQ29tcG9zaXRlTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJcmV0VmFsdWUuc2V0TGF5b3V0KGlkZW50aWZhYmxlQ29tcG9zaXRlTGF5b3V0KTsKKwkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJLy8gaWRlbnRpZmlhYmxlQ29tcG9zaXRlTGF5b3V0RGF0YS5ob3Jpem9udGFsU3Bhbj0xOworCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJLy8gaWRlbnRpZmlhYmxlQ29tcG9zaXRlTGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJcmV0VmFsdWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisKKwkJLy8gU2VyaWFsaXphdGlvbiBmaWxlIG5hbWUgbGFiZWwKKwkJZmluYWwgTGFiZWwgc2VyaWFsaXphdGlvbkZpbGVOYW1lTGFiZWwgPSBuZXcgTGFiZWwocmV0VmFsdWUsIFNXVC5OT05FKTsKKwkJc2VyaWFsaXphdGlvbkZpbGVOYW1lTGFiZWwKKwkJCQkuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIk5JZFdpei5uYW1lIikgKyAiOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOworCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFQUQ7CisJCXNlcmlhbGl6YXRpb25GaWxlTmFtZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOworCisJCXNlcmlhbGl6YXRpb25GaWxlTmFtZUZpZWxkID0gbmV3IFRleHQocmV0VmFsdWUsIFNXVC5CT1JERVIpOworCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKKwkJc2VyaWFsaXphdGlvbkZpbGVOYW1lRmllbGQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisKKwkJc2VyaWFsaXphdGlvbkZpbGVOYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIocHJvamVjdFZhbGlkYXRvcik7CisKKwkJcmV0dXJuIHJldFZhbHVlOworCX0gLy8gY3JlYXRlU2VyaWFsaXphdGlvbkNvbXBvc2l0ZQorCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgdGhlIHBhcmVudCB7QGxpbmsgQ29tcG9zaXRlfSwgdHlwaWNhbGx5IHRoZSBvbmUgY3JlYXRlZCBpbgorCSAqICAgICAgICAgICAge0BsaW5rICNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSl9LgorCSAqLworCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlU3BlY2lmaWNDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQkvLyBUaGUgTmV3TW9kZWxXaXphcmQgZG9lc24ndCBwcm92aWRlIGEgInNwZWNpZmljIGNvbXBvc2l0ZSIgc28gd2UgZG9uJ3QKKwkJLy8gbWFrZSB0aGlzIG1ldGhvZCBhYnN0cmFjdC4KKwkJcmV0dXJuIG51bGw7CisJfSAvLyBjcmVhdGVTcGVjaWZpY0NvbXBvc2l0ZQorCisJLyoqCisJICogQHJldHVybiB0aGUgcHJvamVjdCBzZWxlY3RlZCBieSB0aGUgdXNlci4KKwkgKi8KKwlwdWJsaWMgSVByb2plY3QgZ2V0U2VsZWN0ZWRQcm9qZWN0KCkgeworCQlpbnQgaW5kID0gcHJvamVjdE5hbWVzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKKwkJaWYoaW5kICE9IC0xKQorCQkJcmV0dXJuIHN0ZW1Qcm9qZWN0cy5nZXQocHJvamVjdE5hbWVzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7CisJCXJldHVybiBudWxsOworCX0gLy8gZ2V0U2VsZWN0ZWRQcm9qZWN0CisKKwkvKioKKwkgKiBAcGFyYW0gcHJvamVjdENvbWJvCisJICogICAgICAgICAgICB0aGUge0BsaW5rIENvbWJvfSB0byBiZSBpbml0aWFsaXplZCB3aXRoIHRoZSBuYW1lcyBvZiB0aGUKKwkgKiAgICAgICAgICAgIHByb2plY3RzLgorCSAqLworCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUHJvamVjdENvbWJvKGZpbmFsIENvbWJvIHByb2plY3RDb21ibykgeworCisJCUlQcm9qZWN0IHNlbGVjdGVkUHJvamVjdCA9IGdldFdvcmtTcGFjZVNlbGVjdGVkUHJvamVjdCgpOworCisJCWlmKHNlbGVjdGVkUHJvamVjdCA9PSBudWxsKSBzZWxlY3RlZFByb2plY3QgPSBsYXN0UHJvamVjdDsKKwkJCisJCS8vIEdldCB0aGUgUHJvamVjdHMgdGhhdCBhcmUgU1RFTSBwcm9qZWN0cworCQlpbnQgaW5kZXggPSAwOworCQlpbnQgaSA9IDA7CisJCWZvciAoZmluYWwgSVByb2plY3QgcHJvamVjdCA6IGdldFNURU1Qcm9qZWN0cygpKSB7CisJCQkvLyBJcyB0aGUgU1RFTSBwcm9qZWN0IHNlbGVjdGVkPworCQkJaWYgKHByb2plY3QuZXF1YWxzKHNlbGVjdGVkUHJvamVjdCkpIHsKKwkJCQkvLyBZZXMKKwkJCQlpbmRleCA9IGk7CisJCQl9CisKKwkJCWZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSA9IHByb2plY3QuZ2V0TmFtZSgpOworCQkJcHJvamVjdENvbWJvLmFkZChwcm9qZWN0TmFtZSk7CisJCQlpKys7CisJCX0gLy8gZm9yIGVhY2ggU1RFTSBwcm9qZWN0CisJCXByb2plY3RDb21iby5zZXRGb2N1cygpOworCQlwcm9qZWN0Q29tYm8uc2VsZWN0KGluZGV4KTsKKwkJTmV3SWRlbnRpZmlhYmxlUGFnZS5sYXN0UHJvamVjdCA9IHRoaXMuZ2V0U2VsZWN0ZWRQcm9qZWN0KCk7CisJfSAvLyBpbml0aWFsaXplUHJvamVjdEZpZWxkCisKKwlwcml2YXRlIElQcm9qZWN0IGdldFdvcmtTcGFjZVNlbGVjdGVkUHJvamVjdCgpIHsKKwkJSVByb2plY3QgcmV0VmFsdWUgPSBudWxsOworCQkvLyBGaW5kIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcHJvamVjdCwgaWYgdGhlcmUgaXMgb25lCisJCWZpbmFsIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQorCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkKKwkJCQkuZ2V0U2VsZWN0aW9uKCk7CisJCS8vIFN0cnVjdHVyZWQgU2VsZWN0aW9uIHRoYXQgbWlnaHQgaGF2ZSBhIHByb2plY3Q/CisJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJZm9yIChPYmplY3Qgb2JqIDogKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0xpc3QoKSkgeworCQkJCS8vIFByb2plY3Q/CisJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CisJCQkJCXJldFZhbHVlID0gKElQcm9qZWN0KSBvYmo7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBGaWxlIG9yIEZvbGRlcj8gKGluIGEgUHJvamVjdCkKKwkJCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKKwkJCQkJLy8gWWVzCisJCQkJCXJldFZhbHVlID0gKChJUmVzb3VyY2UpIG9iaikuZ2V0UHJvamVjdCgpOworCQkJCQlicmVhazsKKwkJCQl9IC8vIGVsc2UgaWYgRmlsZSBvciBGb2xkZXIKKwkJCQkvLyBJZGVudGlmaWFibGU/CisJCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlKSB7CisJCQkJCWZpbmFsIElQYXRoIHBhdGggPSBuZXcgUGF0aCgoKElkZW50aWZpYWJsZSkgb2JqKS5nZXRVUkkoKQorCQkJCQkJCS50b1BsYXRmb3JtU3RyaW5nKHRydWUpKTsKKwkJCQkJcmV0VmFsdWUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpCisJCQkJCQkJLmdldEZpbGUocGF0aCkuZ2V0UHJvamVjdCgpOworCQkJCQlicmVhazsKKwkJCQl9IC8vIGVsc2UgaWYgSWRlbnRpZmlhYmxlCisJCQkJLy8gSWRlbnRpZmlhYmxlVHJlZU5vZGU/CisJCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlVHJlZU5vZGUpIHsKKwkJCQkJcmV0VmFsdWUgPSAoKElkZW50aWZpYWJsZVRyZWVOb2RlKSBvYmopLmdldFByb2plY3QoKTsKKwkJCQkJYnJlYWs7CisJCQkJfSAvLyBlbHNlIGlmIElkZW50aWZpYWJsZVRyZWVOb2RlCisKKwkJCX0gLy8gZm9yIGVhY2ggc2VsZWN0ZWQgb2JqZWN0CisJCX0gLy8gaWYgc3RydWN0dXJlZCBzZWxlY3Rpb24KKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRXb3JrU3BhY2VTZWxlY3RlZFByb2plY3QKKworCS8qKgorCSAqIEByZXR1cm4gYSBMaXN0IG9mIHRoZSBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlIHRoYXQgaGF2ZSBTVEVNIFByb2plY3QKKwkgKiAgICAgICAgICJuYXR1cmUiCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuQ29uc3RhbnRzI0lEX1NURU1fUFJPSkVDVF9OQVRVUkUKKwkgKi8KKwlwcml2YXRlIExpc3Q8SVByb2plY3Q+IGdldFNURU1Qcm9qZWN0cygpIHsKKwkJLy8gUmVmcmVzaAorCQlzdGVtUHJvamVjdHMgPSBVdGlsaXR5LmdldFNURU1Qcm9qZWN0c0Zyb21Xb3Jrc3BhY2UoKTsKKwkJcmV0dXJuIHN0ZW1Qcm9qZWN0czsKKwl9IC8vIGdldFNURU1Qcm9qZWN0cworCisJLyoqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGFnZSBpcyBjb21wbGV0ZSBhbmQgcmVhZHkgdG8gZ28KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOworCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7CisKKwkJLy8gQXJlIHRoZXJlIGFueSBwcm9qZWN0cz8KKwkJaWYgKGdldFNURU1Qcm9qZWN0cygpLnNpemUoKSA9PSAwKSB7CisJCQkvLyBObworCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmdldFN0cmluZygiTklkV2l6Lm5vUHJvakVyciIpKTsKKwkJCXJldFZhbHVlID0gZmFsc2U7CisJCX0gLy8gaWYgbm8gcHJvamVjdHMKKworCQkvLyBJcyB0aGUgc2VyaWFsaXphdGlvbiBmaWxlIG5hbWUgbWlzc2luZz8KKwkJaWYgKHJldFZhbHVlICYmIHNlcmlhbGl6YXRpb25GaWxlTmFtZUZpZWxkLmdldFRleHQoKSA9PSBudWxsCisJCQkJfHwgIiIuZXF1YWxzKHNlcmlhbGl6YXRpb25GaWxlTmFtZUZpZWxkLmdldFRleHQoKS50cmltKCkpKSB7CisJCQkvLyBZZXMKKwkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIk5JZFdpei5uYW1lTWlzc2luZ0VyciIpKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJfQorCisJCS8vIElzIHRoZSBzZXJpYWxpemF0aW9uIGZpbGUgbmFtZSB2YWxpZD8KKwkJaWYgKHJldFZhbHVlICYmICFzZXJpYWxpemF0aW9uRmlsZU5hbWVJc1ZhbGlkKCkpIHsKKwkJCS8vIE5vCisJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSWRXaXoubmFtZUVyciIpKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJfQorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHZhbGlkYXRlUGFnZQorCisJLyoqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VyaWFsaXphdGlvbiBmaWxlIG5hbWUgc3BlY2lmaWVkIGZvcgorCSAqICAgICAgICAgdGhlIHtAbGluayBJZGVudGlmaWFibGV9IHRvIGJlIGNyZWF0ZWQgaXMgYSB2YWxpZCBuYW1lLgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBzZXJpYWxpemF0aW9uRmlsZU5hbWVJc1ZhbGlkKCkgeworCQlmaW5hbCBTdHJpbmcgbmFtZSA9IHNlcmlhbGl6YXRpb25GaWxlTmFtZUZpZWxkLmdldFRleHQoKTsKKworCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlmaW5hbCBTdHJpbmcgdHJpbWVkTmFtZSA9IG5hbWUudHJpbSgpOworCisJCXJldHVybiAhKHRyaW1lZE5hbWUuZXF1YWxzKCIiKSB8fCB0cmltZWROYW1lLmNvbnRhaW5zKCIgIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9IC8vIHNlcmlhbGl6YXRpb25GaWxlTmFtZUlzVmFsaWQKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUge0BsaW5rIER1YmxpbkNvcmUjZ2V0VGl0bGUoKX0gYXR0cmlidXRlIG9uIHRoZQorCSAqICAgICAgICAge0BsaW5rIER1YmxpbkNvcmVQYWdlfS4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldERDVGl0bGUoKSB7CisJCXJldHVybiBnZXREQ0Rlc2NyaXB0aW9uKCk7CisJfSAvLyBnZXREQ1RpdGxlCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBmb3IgYSB7QGxpbmsgRHVibGluQ29yZSNnZXREZXNjcmlwdGlvbigpfSBhdHRyaWJ1dGUgb24KKwkgKiAgICAgICAgIHRoZSB7QGxpbmsgRHVibGluQ29yZVBhZ2V9LgorCSAqLworCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmcgZ2V0RENEZXNjcmlwdGlvbigpOworCisJLyoqCisJICogQHJldHVybiBhIHZhbHVlIHN1aXRhYmxlIGZvciB7QGxpbmsgRHVibGluQ29yZSNzZXRWYWxpZChTdHJpbmcpfQorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0RENWYWxpZERhdGVSYW5nZSgpIHsKKwkJcmV0dXJuICIiOworCX0gLy8gZ2V0RENWYWxpZERhdGVSYW5nZQorfSAvLyBOZXdJZGVudGlmaWFibGVQYWdlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvTmV3SWRlbnRpZmlhYmxlV2l6YXJkLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvTmV3SWRlbnRpZmlhYmxlV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFiOTQyZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdJZGVudGlmaWFibGVXaXphcmQuamF2YQpAQCAtMCwwICsxLDM1MyBAQAorLy8gTmV3SWRlbnRpZmlhYmxlV2l6YXJkLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLmFjdGlvbi5Xb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlV0aWxpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5wcmVzZW50YXRpb24uQ29yZUVkaXRvckFkdmlzb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIHN1cGVyIGNsYXNzIGZvciB0aGUge0BsaW5rIFdpemFyZH1zIHRoYXQgY3JlYXRlCisgKiB7QGxpbmsgSWRlbnRpZmlhYmxlfXMuIFRoZSBiYXNpYyB7QGxpbmsgSWRlbnRpZmlhYmxlfSB3aXphcmQgY29udGFpbnMgdHdvCisgKiB7QGxpbmsgV2l6YXJkUGFnZX1zLiBUaGUgZmlyc3QgaXMgYSBzdWJjbGFzcyBpbnN0YW5jZSBvZiB0aGUgYWJzdHJhY3QgY2xhc3MKKyAqIHtAbGluayBOZXdJZGVudGlmaWFibGVQYWdlfSBhbmQgdGhlIHNlY29uZCBpcyBhbiBpbnN0YW5jZSBvZgorICoge0BsaW5rIER1YmxpbkNvcmVQYWdlfS4gVGhlIHtAbGluayBOZXdJZGVudGlmaWFibGVQYWdlfSBpbXBsZW1lbnRzIHRoZQorICogdGVtcGxhdGUgcGF0dGVybiBieSBjcmVhdGluZyBhbiBvdmVyYWxsIHN0cnVjdHVyZSBmb3IgdGhlIHBhZ2UgdGhhdCBpcyBmaWxsZWQKKyAqIGluIGJ5IHRoZSByZXN1bHRzIG9mIGNhbGxzIHRvIGFic3RyYWN0IG1ldGhvZHMgaW1wbGVtZW50ZWQgYnkgdGhlIHN1YmNsYXNzZXMuCisgKiAKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGUKKyAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkdyYXBoCisgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbAorICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2NlbmFyaW8uU2NlbmFyaW8KKyAqLworYWJzdHJhY3QgcHVibGljIGNsYXNzIE5ld0lkZW50aWZpYWJsZVdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzCisJCUlOZXdXaXphcmQgeworCisJLyoqCisJICogVGhlIHdpemFyZCdzIGxpbmsgdG8gdGhlIHtAbGluayBJV29ya2JlbmNofS4KKwkgKi8KKwlwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOworCisJLyoqCisJICogVGhlIGZpcnN0IHBhZ2UgaW4gdGhlIHdpemFyZCB0aGF0IGEgdXNlciB1c2VzIHRvIHNwZWNpZnkgdGhlIGRldGFpbHMgb2YgYQorCSAqIG5ldyB7QGxpbmsgSWRlbnRpZmlhYmxlfSB0byBiZSBjcmVhdGVkLgorCSAqIAorCSAqIEBzZWUgI25ld0R1YmxpbkNvcmVQYWdlCisJICovCisJcHJvdGVjdGVkIE5ld0lkZW50aWZpYWJsZVBhZ2UgbmV3SWRlbnRpZmlhYmxlUGFnZSA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgc2Vjb25kIHBhZ2UgaW4gdGhlIHdpemFyZCB0aGF0IGEgdXNlciB1c2VzIHRvIHNwZWNpZnkgdGhlIGRldGFpbHMgb2YKKwkgKiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uRHVibGluQ29yZX0gbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfQorCSAqIGJlaW5nIGNyZWF0ZWQuCisJICogCisJICogQHNlZSAjbmV3SWRlbnRpZmlhYmxlUGFnZQorCSAqLworCXByb3RlY3RlZCBEdWJsaW5Db3JlUGFnZSBuZXdEdWJsaW5Db3JlUGFnZTsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbnRleHQgc2Vuc2l0aXZlIGhlbHAgY29udGV4dCBpZCBmb3IgdGhlIHdpemFyZAorCSAqLworCQorCXByb3RlY3RlZCBTdHJpbmcgaGVscENvbnRleHRJZDsKKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBDb250ZXh0SWQoKSB7CisJCXJldHVybiBoZWxwQ29udGV4dElkOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldEhlbHBDb250ZXh0SWQoU3RyaW5nIGhlbHBDb250ZXh0SWQpIHsKKwkJdGhpcy5oZWxwQ29udGV4dElkID0gaGVscENvbnRleHRJZDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoLAorCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KGZpbmFsIElXb3JrYmVuY2ggd29ya2JlbmNoLAorCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQl0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKKwkJc2V0V2luZG93VGl0bGUoZ2V0V2l6YXJkVGl0bGUoKSk7CisJCXNldEhlbHBBdmFpbGFibGUodHJ1ZSk7CisJfSAvLyBpbml0CisKKworCS8qKgorCSAqIENyZWF0ZSB0aGUge0BsaW5rIFdpemFyZH0ncyBwYWdlcy4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgeworCQlzdXBlci5hZGRQYWdlcygpOworCQlzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoZmFsc2UpOworCQluZXdJZGVudGlmaWFibGVQYWdlID0gY3JlYXRlTmV3SWRlbnRpZmlhYmxlUGFnZSgpOworCQkvLyBXZXJlIHdlIHN1Y2Nlc3NmdWwgaW4gY3JlYXRpbmcgdGhlIHBhZ2U/CisJCWlmIChuZXdJZGVudGlmaWFibGVQYWdlID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQlyZXR1cm47CisJCX0KKwkJbmV3RHVibGluQ29yZVBhZ2UgPSBjcmVhdGVEdWJsaW5Db3JlUGFnZSgpOworCQkvLyBXZXJlIHdlIHN1Y2Nlc3NmdWwgaW4gY3JlYXRpbmcgdGhlIHBhZ2U/CisJCWlmIChuZXdEdWJsaW5Db3JlUGFnZSA9PSBudWxsKSB7CisJCQkvLyBObworCQkJcmV0dXJuOworCQl9CisJCWFkZFBhZ2UobmV3SWRlbnRpZmlhYmxlUGFnZSk7CisJCWFkZFBhZ2UobmV3RHVibGluQ29yZVBhZ2UpOworCX0gLy8gYWRkUGFnZXMKKworCS8qKgorCSAqIEBwYXJhbSBwYWdlCisJICogICAgICAgICAgICB0aGUge0BsaW5rIElXaXphcmRQYWdlfSBwYWdlIGN1cnJlbnRseSBiZWluZyBkaXNwbGF5ZWQuCisJICogQHJldHVybiB0aGUgbmV4dCB7QGxpbmsgSVdpemFyZFBhZ2V9IHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoZmluYWwgSVdpemFyZFBhZ2UgcGFnZSkgeworCQlmaW5hbCBJV2l6YXJkUGFnZSBuZXh0UGFnZSA9IHN1cGVyLmdldE5leHRQYWdlKHBhZ2UpOworCQkvLyBEdWJsaW4gQ29yZSBuZXh0PworCQlpZiAobmV4dFBhZ2UgaW5zdGFuY2VvZiBEdWJsaW5Db3JlUGFnZSkgeworCQkJLy8gWWVzCisJCQkvLyBXZSBwcmUtcG9wdWxhdGUgc29tZSBvZiB0aGUgZmllbGRzIGluIHRoZSBEdWJsaW5Db3JlIHBhZ2Ugd2l0aAorCQkJLy8gdmFsdWVzIG9idGFpbmVkIGZyb20gdGhlIG5ld0lkZW50aWZhaWJsZVBhZ2UgdGhhdCB0aGUgdXNlciBoYXMKKwkJCS8vIGp1c3QgY29tcGxldGVkLiBUaGUgZXhhY3QgZGV0YWlscyBhcmUgc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YKKwkJCS8vIElkZW50aWZpYWJsZSBiZWluZyBjcmVhdGVkLgorCQkJZmluYWwgRHVibGluQ29yZVBhZ2UgZGNQYWdlID0gKER1YmxpbkNvcmVQYWdlKSBuZXh0UGFnZTsKKwkJCWRjUGFnZS50aXRsZS5zZXRUZXh0KG5ld0lkZW50aWZpYWJsZVBhZ2UuZ2V0RENUaXRsZSgpKTsKKwkJCWRjUGFnZS5kZXNjcmlwdGlvbi5zZXRUZXh0KG5ld0lkZW50aWZpYWJsZVBhZ2UuZ2V0RENEZXNjcmlwdGlvbigpKTsKKwkJCWRjUGFnZS52YWxpZC5zZXRUZXh0KG5ld0lkZW50aWZpYWJsZVBhZ2UuZ2V0RENWYWxpZERhdGVSYW5nZSgpKTsKKwkJfSAvLyBpZiBEdWJsaW5Db3JlUGFnZQorCisJCXJldHVybiBuZXh0UGFnZTsKKwl9IC8vIGdldE5leHRQYWdlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKKwkJLy8gVGhpcyBpcyBleGVjdXRlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgIkZpbmlzaCIgYnV0dG9uIG9mIHRoZQorCQkvLyB3aXphcmQuIEl0IHVzZXMgdGhlIGRldGFpbHMgaW4gdGhlIHR3byBwYWdlcyAobmV3SWRlbnRpZmlhYmxlUGFnZSBhbmQKKwkJLy8gbmV3RHVibGluQ29yZVBhZ2UpIHRvIGNyZWF0ZSB0aGUgSWRlbnRpZmlhYmxlLiBJdCBzZXJpYWxpemVzIHRoZQorCQkvLyBJZGVudGlmaWFibGUgaW4gYSBmaWxlIGluIHRoZSBwcm9qZWN0IHRoYXQgd2FzIHNlbGVjdGVkIG9uIHRoZQorCQkvLyBuZXdJZGVudGlmYWJsZVBhZ2UuCisJCWZpbmFsIGJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOworCQl0cnkgeworCQkJLy8gVGhlIGZpbGVVUkkgc3BlY2lmaWVzIHdoZXJlIHRoZSBJZGVudGlmaWFibGUgd2lsbCBiZSBzZXJpYWxpemVkCisJCQlmaW5hbCBVUkkgc2VyaWFsaXphdGlvblVSSSA9IGNyZWF0ZVNlcmlhbGl6YXRpb25VUkkoKTsKKworCQkJLy8gQ3JlYXRpbmcgdGhlIElkZW50aWZpYWJsZSBjYW4gcG90ZW50aWFsbHkgdGFrZSBhIHdoaWxlIHNvIHdlCisJCQkvLyB3cmFwIHRoZSBjYWxsIHRvIGNyZWF0ZUlkZW50aWZhYmxlIGluIGFuICJvcGVyYXRpb24iIHNvIHRoYXQgaXQKKwkJCS8vIGNhbiBiZSBydW4gaW4gdGhlIGJhY2tncm91bmQuCisJCQlmaW5hbCBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJCWNyZWF0ZUlkZW50aWZpYWJsZSgKKwkJCQkJCQltb25pdG9yID09IG51bGwgPyBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpCisJCQkJCQkJCQk6IG1vbml0b3IsIHNlcmlhbGl6YXRpb25VUkkpOworCQkJCX0gLy8gZXhlY3V0ZQorCQkJfTsgLy8gV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uCisKKwkJCS8vIFRoZSBjb250YWluZXIgaXMgYSBJUnVubmFibGVDb250ZXh0LCB3ZSB1c2UgaXQgdG8gZXhlY3V0ZSB0aGUKKwkJCS8vIG9wZXJhdGlvbiB3ZSBjcmVhdGVkIGFib3ZlLiBUaGUgZmlyc3QgYXJndW1lbnQgb2YgZmFsc2UgaW5kaWNhdGVzCisJCQkvLyBub3QgdG8gImZvcmsiLCB0aGUgc2Vjb25kIG9mICJ0cnVlIiBpbmRpY2F0ZXMgdGhhdCB0aGUgb3BlcmF0aW9uCisJCQkvLyBpcyBjYW5jZWxhYmxlLgorCQkJZ2V0Q29udGFpbmVyKCkucnVuKGZhbHNlLCB0cnVlLCBvcCk7CisKKwkJCS8vIFJlZnJlc2ggdGhlIHByb2plY3Qgc28gdGhhdCB0aGUgbmV3IHNlcmlhbGl6ZWQgZmlsZSB3aWxsIGRpc3BsYXkKKwkJCXRyeSB7CisJCQkJbmV3SWRlbnRpZmlhYmxlUGFnZS5nZXRTZWxlY3RlZFByb2plY3QoKS5yZWZyZXNoTG9jYWwoCisJCQkJCQlJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOworCQkJfSBjYXRjaCAoZmluYWwgQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gSWdub3JlCisJCQl9CisJCQkvLyBOb3cgb3BlbiB1cCB0aGUgYXBwcm9wcmlhdGUgZWRpdG9yIGZvciB0aGUgbmV3IElkZW50aWZpYWJsZS4KKwkJCXJldHVybiBDb3JlRWRpdG9yQWR2aXNvci5vcGVuRWRpdG9yKHdvcmtiZW5jaCwgQ29tbW9uUGx1Z2luCisJCQkJCS5hc0xvY2FsVVJJKHNlcmlhbGl6YXRpb25VUkkpKTsKKwkJfSAvLyB0cnkKKwkJY2F0Y2ggKGZpbmFsIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKEFjdGl2YXRvci5QTFVHSU5fSUQsIGUpOworCQl9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBUaGlzIGdldHMgdGhyb3duIGlmIHRoZSBvcGVyYXRpb24gaXMgY2FuY2VsZWQKKwkJCUFjdGl2YXRvci5sb2dJbmZvcm1hdGlvbihBY3RpdmF0b3IuUExVR0lOX0lELCBlKTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsdWU7CisKKwl9IC8vIHBlcmZvcm1GaW5pc2gKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgc3BlY2lmaWMge0BsaW5rIElkZW50aWZpYWJsZX0gYXMgc3BlY2lmaWVkIGJ5IHRoZSBjb250ZW50cyBvZgorCSAqIHRoZSB3aXphcmQgcGFnZXMgYW5kIHNlcmlhbGl6ZSBpdCBpbiB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgdGhlCisJICoge0BsaW5rIFVSSX0gcmV0dXJuZWQgYnkge0BsaW5rICNjcmVhdGVTZXJpYWxpemF0aW9uVVJJKCl9LgorCSAqIAorCSAqIEBwYXJhbSBtb25pdG9yCisJICogICAgICAgICAgICBhIHtAbGluayBJUHJvZ3Jlc3NNb25pdG9yfSB0byB1c2UgdG8gcmVwb3J0IG91ciBwcm9ncmVzcworCSAqIEBwYXJhbSBzZXJpYWxpemF0aW9uVVJJCisJICogICAgICAgICAgICB0aGUge0BsaW5rIFVSSX0gb2YgdGhlIHNlcmlhbGl6YXRpb24gZmlsZQorCSAqIEBzZWUgI3BlcmZvcm1GaW5pc2goKQorCSAqLworCXZvaWQgY3JlYXRlSWRlbnRpZmlhYmxlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgVVJJIHNlcmlhbGl6YXRpb25VUkkpIHsKKwkJLy8gV2FzIGEgcHJvZ3Jlc3MgbW9uaXRvciBzcGVjaWZpZWQ/CisJCWlmIChtb25pdG9yID09IG51bGwpIHsKKwkJCS8vIE5vCisJCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKKwkJfQorCisJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmdldFN0cmluZygiTklkV2l6LmNyZWF0aW5nIiksIDEwMCk7IC8vJE5PTi1OTFMtMSQKKwkJdHJ5IHsKKwkJCS8vIENyZWF0ZSB0aGUgSWRlbnRpZmlhYmxlIGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoZSBXaXphcmQKKwkJCS8vIFBhZ2VzLgorCQkJZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50aWZpYWJsZSA9IGNyZWF0ZUlkZW50aWZpYWJsZSgpOworCQkJaWRlbnRpZmlhYmxlLnNldFVSSShzZXJpYWxpemF0aW9uVVJJKTsKKwkJCWFzc2VydCBpZGVudGlmaWFibGUuc2FuZSgpOworCisJCQlVdGlsaXR5LnNlcmlhbGl6ZUlkZW50aWZpYWJsZShpZGVudGlmaWFibGUsIHNlcmlhbGl6YXRpb25VUkkpOworCQl9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoTWVzc2FnZXMuZ2V0U3RyaW5nKCJOSWRXaXouc2F2ZUVyciIpLCBlKTsgLy8kTk9OLU5MUy0xJAorCQl9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKE1lc3NhZ2VzLmdldFN0cmluZygiTklkV2l6LnNhdmVFcnIiKSwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJfSBmaW5hbGx5IHsKKwkJCW1vbml0b3IuZG9uZSgpOworCQl9CisJfSAvLyBjcmVhdGVJZGVudGlmaWFibGUKKworCS8qKgorCSAqIENyZWF0ZSB0aGUge0BsaW5rIFVSSX0gdG8gYmUgdXNlZCB0byBzZXJpYWxpemUgdGhlIHtAbGluayBJZGVudGlmaWFibGV9CisJICogY3JlYXRlZCBpbiB7QGxpbmsgI3BlcmZvcm1GaW5pc2goKX0uIFRoZSBwYXRoIGluIHRoZSB7QGxpbmsgVVJJfSB3aWxsCisJICogcGxhY2UgdGhlIHNlcmlhbGl6YXRpb24gZmlsZSBpbnRvIHRoZSBwcm9qZWN0IHJldHVybmVkIGJ5CisJICoge0BsaW5rICNnZXRTZWxlY3RlZFByb2plY3QoKX0uIFRoZSBuYW1lIG9mIHRoZSBmb2xkZXIgaW4gdGhlIHByb2plY3QgaXMKKwkgKiBzdXBwbGllZCBieSB7QGxpbmsgI2dldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCl9IHdoaWNoIGlzIG92ZXJyaWRkZW4gYnkKKwkgKiBhIHN1YmNsYXNzLiBUaGUgbmFtZSBvZiB0aGUgZmlsZSBhbmQgdGhlIGZpbGUgZXh0ZW5zaW9uIGFyZSBwcm92aWRlZCBieQorCSAqIHRoZSBtZXRob2RzIHtAbGluayAjZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lKCl9IGFuZAorCSAqIHtAbGluayAjZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lRXh0ZW5zaW9uKCl9LCBib3RoIG9mIHdoaWNoIGFyZQorCSAqIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuCisJICogCisJICogQHJldHVybiB0aGUge0BsaW5rIFVSSX0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2VyaWFsaXplIHRoZQorCSAqICAgICAgICAge0BsaW5rIElkZW50aWZpYWJsZX0gY3JlYXRlZCBpbiB7QGxpbmsgI3BlcmZvcm1GaW5pc2goKX0uCisJICogCisJICogQHNlZSAjY3JlYXRlSWRlbnRpZmlhYmxlKElQcm9ncmVzc01vbml0b3IsIFVSSSkKKwkgKi8KKwlwcml2YXRlIFVSSSBjcmVhdGVTZXJpYWxpemF0aW9uVVJJKCkgeworCisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihuZXdJZGVudGlmaWFibGVQYWdlCisJCQkJLmdldFNlbGVjdGVkUHJvamVjdCgpLmdldE5hbWUoKSk7CisJCXNiLmFwcGVuZCgiLyIpOyAvLyROT04tTkxTLTEkCisJCXNiLmFwcGVuZChnZXRTZXJpYWxpemF0aW9uRm9sZGVyTmFtZSgpKTsKKwkJc2IuYXBwZW5kKCIvIik7IC8vJE5PTi1OTFMtMSQKKwkJc2IuYXBwZW5kKGdldFNlcmlhbGl6YXRpb25GaWxlTmFtZSgpKTsKKwkJc2IuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKKwkJc2IuYXBwZW5kKGdldFNlcmlhbGl6YXRpb25GaWxlTmFtZUV4dGVuc2lvbigpKTsKKworCQlyZXR1cm4gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoc2IudG9TdHJpbmcoKSwgdHJ1ZSk7CisJfSAvLyBjcmVhdGVTZXJpYWxpemF0aW9uVVJJCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzZXJpYWxpemF0aW9uIGZpbGUgZm9yIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfQorCSAqICAgICAgICAgZW50ZXJlZCBieSB0aGUgdXNlciBvbiB7QGxpbmsgI25ld0lkZW50aWZpYWJsZVBhZ2V9LgorCSAqLworCXByaXZhdGUgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25GaWxlTmFtZSgpIHsKKwkJcmV0dXJuIG5ld0lkZW50aWZpYWJsZVBhZ2Uuc2VyaWFsaXphdGlvbkZpbGVOYW1lRmllbGQuZ2V0VGV4dCgpOworCX0gLy8gZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0aXRsZSBvZiB0aGUgV2l6YXJkIGZvciB1c2UgYXMgdGhlIHRpdGxlIG9mIHRoZSB3aW5kb3cuCisJICovCisJYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZyBnZXRXaXphcmRUaXRsZSgpOworCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBjcmVhdGUgYSB7QGxpbmsgV2l6YXJkUGFnZX0KKwkgKiB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHtAbGluayBJZGVudGlmaWFibGV9IHRoYXQgaXMgYmVpbmcKKwkgKiBjcmVhdGVkLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHBhZ2UgdXNlZCB0byBzcGVjaWZ5IHRoZSBuZXcge0BsaW5rIElkZW50aWZpYWJsZX0gdG8gY3JlYXRlLgorCSAqIEBzZWUgI2NyZWF0ZUR1YmxpbkNvcmVQYWdlKCkKKwkgKi8KKwlhYnN0cmFjdCBwcm90ZWN0ZWQgTmV3SWRlbnRpZmlhYmxlUGFnZSBjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlKCk7CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIHRvIGNyZWF0ZSBhCisJICoge0BsaW5rIER1YmxpbkNvcmVQYWdlfSB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mCisJICoge0BsaW5rIElkZW50aWZpYWJsZX0gdGhhdCBpcyBiZWluZyBjcmVhdGVkLiBUeXBpY2FsbHksIHRoZSBtZXRob2Qgd2lsbAorCSAqIGNyZWF0ZSBhIHtAbGluayBEdWJsaW5Db3JlUGFnZX0gd2l0aCBzb21lIG9mIHRoZSBmaWVsZHMgcHJlLXBvcHVsYXRlZAorCSAqIHdpdGggdmFsdWVzIHNwZWNpZmljIHRvIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfS4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgcHJlLXBvcHVsYXRlZCB7QGxpbmsgRHVibGluQ29yZVBhZ2V9LgorCSAqIEBzZWUgI2NyZWF0ZU5ld0lkZW50aWZpYWJsZVBhZ2UoKQorCSAqLworCWFic3RyYWN0IHByb3RlY3RlZCBEdWJsaW5Db3JlUGFnZSBjcmVhdGVEdWJsaW5Db3JlUGFnZSgpOworCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBjcmVhdGUgdGhlIHNwZWNpZmljIHR5cGUgb2YKKwkgKiB7QGxpbmsgSWRlbnRpZmlhYmxlfSB0aGF0IHRoZSB7QGxpbmsgI25ld0lkZW50aWZpYWJsZVBhZ2V9IHRoYXQgdGhleQorCSAqIHJldHVybmVkIGZyb20ge0BsaW5rICNjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlKCl9IHNwZWNpZmllcy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzcGVjaWZpYyB0eXBlIG9mIHtAbGluayBJZGVudGlmaWFibGV9IGNyZWF0ZWQgYnkgYSBzdWJjbGFzc2VzCisJICogICAgICAgICBvZiB0aGlzIGNsYXNzLgorCSAqLworCWFic3RyYWN0IHByb3RlY3RlZCBJZGVudGlmaWFibGUgY3JlYXRlSWRlbnRpZmlhYmxlKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmb2xkZXIgdW5kZXIgdGhlIHNlbGVjdGVkIHByb2plY3QgdGhhdCB0aGUKKwkgKiAgICAgICAgIHtAbGluayBJZGVudGlmaWFibGV9IGNyZWF0ZWQgYnkKKwkgKiAgICAgICAgIHtAbGluayAjY3JlYXRlSWRlbnRpZmlhYmxlKElQcm9ncmVzc01vbml0b3IsIFVSSSl9IHNob3VsZCBiZQorCSAqICAgICAgICAgc2VyaWFsaXplZCBpbi4KKwkgKiBAc2VlICNnZXRTZWxlY3RlZFByb2plY3QoKQorCSAqIEBzZWUgI2NyZWF0ZVNlcmlhbGl6YXRpb25VUkkoKQorCSAqLworCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmcgZ2V0U2VyaWFsaXphdGlvbkZvbGRlck5hbWUoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGZpbGUgZXh0ZW5zaW9uIG9mIHRoZSBzZXJpYWxpemF0aW9uIGZpbGUgb2YgdGhlCisJICogICAgICAgICB7QGxpbmsgSWRlbnRpZmlhYmxlfSBjcmVhdGVkIGJ5CisJICogICAgICAgICB7QGxpbmsgI2NyZWF0ZUlkZW50aWZpYWJsZShJUHJvZ3Jlc3NNb25pdG9yLCBVUkkpfS4gVHlwaWNhbGx5LAorCSAqICAgICAgICAgdGhpcyBpcyB0aGUgRU1GICJlTkFNRSIgb2YgdGhlIG1vZGVsIGluIHdoaWNoIHRoZQorCSAqICAgICAgICAge0BsaW5rIElkZW50aWZpYWJsZX0gaXMgZGVmaW5lZC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2UjZU5BTUUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2UjZU5BTUUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb1BhY2thZ2UjZU5BTUUKKwkgKiBAc2VlICBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZXhwZXJpbWVudC5FeHBlcmltZW50UGFja2FnZSNlTkFNRQorCSAqLworCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmcgZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lRXh0ZW5zaW9uKCk7CisKKwkvKioKKwkgKiBSdW4gdGhlIFdpemFyZCBmcm9tIGFuIEFjdGlvbgorCSAqLworCWFic3RyYWN0IHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTmV3SWRlbnRpZmlhYmxlV2l6YXJkQWN0aW9uIGV4dGVuZHMKKwkJCVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKKwkJcHJvdGVjdGVkIHZvaWQgcnVuKGZpbmFsIE5ld0lkZW50aWZpYWJsZVdpemFyZCB3aXphcmQpIHsKKwkJCXdpemFyZC5pbml0KGdldFdpbmRvdygpLmdldFdvcmtiZW5jaCgpLCBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKKwkJCWZpbmFsIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFdpbmRvdygpCisJCQkJCS5nZXRTaGVsbCgpLCB3aXphcmQpOworCQkJd2l6YXJkRGlhbG9nLm9wZW4oKTsKKwkJfSAvLyBydW4KKwl9IC8vIE5ld0lkZW50aWZpYWJsZVdpemFyZEFjdGlvbgorCit9IC8vIE5ld0lkZW50aWZpYWJsZVdpemFyZApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL05ld01vZGVsV2l6YXJkLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvTmV3TW9kZWxXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2E5MWUwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL05ld01vZGVsV2l6YXJkLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8vIE5ld01vZGVsV2l6YXJkLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5TVEVNVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuTW9kZWxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgTmV3SWRlbnRpZmlhYmxlV2l6YXJkfSBmb3IgdGhhdCBjcmVhdGVzIG5ldyBTVEVNCisgKiB7QGxpbmsgTW9kZWx9cy4KKyAqLworcHVibGljIGNsYXNzIE5ld01vZGVsV2l6YXJkIGV4dGVuZHMgTmV3SWRlbnRpZmlhYmxlV2l6YXJkIHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNnZXRXaXphcmRUaXRsZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRXaXphcmRUaXRsZSgpIHsKKwkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiTk1vZGVsV2l6LndpemFyZF90aXRsZSIpOyAvLyROT04tTkxTLTEkCisJfSAvLyBnZXRXaXphcmRUaXRsZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2NyZWF0ZU5ld0lkZW50aWZpYWJsZVBhZ2UoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBOZXdJZGVudGlmaWFibGVQYWdlIGNyZWF0ZU5ld0lkZW50aWZpYWJsZVBhZ2UoKSB7CisJCXRoaXMuc2V0SGVscENvbnRleHRJZCgib3JnLmVjbGlwc2Uuc3RlbS5kb2MubmV3bW9kZWxfY29udGV4dGlkIik7CisJCXJldHVybiBuZXcgTmV3TW9kZWxQYWdlKCk7CisJfSAvLyBjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjY3JlYXRlRHVibGluQ29yZVBhZ2UoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBEdWJsaW5Db3JlUGFnZSBjcmVhdGVEdWJsaW5Db3JlUGFnZSgpIHsKKwkJcmV0dXJuIG5ldyBEdWJsaW5Db3JlUGFnZSgpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURDQXR0cmlidXRlcygpIHsKKwkJCQlzdXBlci5pbml0aWFsaXplRENBdHRyaWJ1dGVzKCk7CisJCQkJZm9ybWF0LnNldFRleHQoTW9kZWxQYWNrYWdlLmVOU19VUkkpOworCQkJCWZvcm1hdC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQl0eXBlLnNldFRleHQoU1RFTVVSSS5NT0RFTF9UWVBFX1VSSS50b1N0cmluZygpKTsKKwkJCQl0eXBlLnNldEVuYWJsZWQoZmFsc2UpOworCQkJfQorCQl9OworCX0gLy8gY3JlYXRlRHVibGluQ29yZVBhZ2UKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNjcmVhdGVJZGVudGlmaWFibGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJZGVudGlmaWFibGUgY3JlYXRlSWRlbnRpZmlhYmxlKCkgeworCQlmaW5hbCBNb2RlbCByZXRWYWx1ZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTW9kZWwoKTsKKwkJcmV0VmFsdWUuc2V0RHVibGluQ29yZShuZXdEdWJsaW5Db3JlUGFnZS5jcmVhdGVEdWJsaW5Db3JlKCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVTcGVjaWZpY0lkZW50aWZpYWJsZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2dldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkgeworCQlyZXR1cm4gTmV3U1RFTVByb2plY3RXaXphcmQuTU9ERUxTX0ZPTERFUl9OQU1FOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNnZXRTZXJpYWxpemF0aW9uRmlsZU5hbWVFeHRlbnNpb24oKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lRXh0ZW5zaW9uKCkgeworCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVOQU1FOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTmV3TW9kZWxQYWdlIGV4dGVuZHMgTmV3SWRlbnRpZmlhYmxlUGFnZSB7CisKKwkJLyoqCisJCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKKwkJICovCisJCXByb3RlY3RlZCBOZXdNb2RlbFBhZ2UoKSB7CisJCQlzdXBlcihNZXNzYWdlcy5nZXRTdHJpbmcoIk5Nb2RlbFdpei5wYWdlX3RpdGxlIikpOyAvLyROT04tTkxTLTEkCisJCQlzZXRUaXRsZShNZXNzYWdlcy5nZXRTdHJpbmcoIk5Nb2RlbFdpei5wYWdlX3RpdGxlIikpOyAvLyROT04tTkxTLTEkCisJCQlzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIk5Nb2RlbFdpei5wYWdlX2Rlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCisJCX0gLy8gTmV3TW9kZWxQYWdlCisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlU3BlY2lmaWNDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsICJvcmcuZWNsaXBzZS5zdGVtLmRvYy5uZXdtb2RlbF9jb250ZXh0aWQiKTsKKwkJCXJldHVybiBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQl9IC8vIGNyZWF0ZVNwZWNpZmljQ29tcG9zaXRlCisJCQorCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkLk5ld0lkZW50aWZpYWJsZVBhZ2UjZ2V0RENEZXNjcmlwdGlvbigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIFN0cmluZyBnZXREQ0Rlc2NyaXB0aW9uKCkgeworCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1lc3NhZ2VzCisJCQkJCS5nZXRTdHJpbmcoIk5Nb2RlbFdpei5EQ19ERVNDUklQVElPTiIpLAorCQkJCQluZXcgT2JqZWN0W10geyBzZXJpYWxpemF0aW9uRmlsZU5hbWVGaWVsZC5nZXRUZXh0KCkgfSk7CisJCX0gLy8gZ2V0RENEZXNjcmlwdGlvbgorCisJfSAvLyBOZXdNb2RlbFBhZ2UKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgSUhhbmRsZXJ9IGZvciB0aGUgY29tbWFuZCB0aGF0IGNyZWF0ZXMgYQorCSAqIHtAbGluayBOZXdNb2RlbFdpemFyZH0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE5ld01vZGVsV2l6YXJkQ29tbWFuZEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIKKwkJCWltcGxlbWVudHMgSUhhbmRsZXIgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudCkKKwkJICovCisJCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBleGVjdXRpb25FdmVudCkKKwkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gSGFuZGxlclV0aWwKKwkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvd0NoZWNrZWQoZXhlY3V0aW9uRXZlbnQpOworCQkJZmluYWwgTmV3TW9kZWxXaXphcmQgd2l6YXJkID0gbmV3IE5ld01vZGVsV2l6YXJkKCk7CisJCQl3aXphcmQuaW5pdCh3aW5kb3cuZ2V0V29ya2JlbmNoKCksIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOworCQkJZmluYWwgV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBTVEVNV2l6YXJkRGlhbG9nKHdpbmRvdworCQkJCQkuZ2V0U2hlbGwoKSwgd2l6YXJkKTsKKwkJCXdpemFyZERpYWxvZy5vcGVuKCk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSAvLyBleGVjdXRlCisJfSAvLyBOZXdNb2RlbFdpemFyZENvbW1hbmRIYW5kbGVyCisKK30gLy8gTmV3TW9kZWxXaXphcmQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdNb2RpZmllclBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdNb2RpZmllclBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWU1ZDBlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL05ld01vZGlmaWVyUGFnZS5qYXZhCkBAIC0wLDAgKzEsNjc5IEBACisvLyBOZXdNb2RpZmllclBhZ2UuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkxhYmVsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLlN0YXRpY0xhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5GZWF0dXJlTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk5PUE1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5SYW5nZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TZXF1ZW5jZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5TaW5nbGVWYWx1ZU1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZmVhdHVyZW1vZGlmaWVyLkVTdHJ1Y3R1cmFsRmVhdHVyZUZlYXR1cmVNb2RpZmllckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMuZmVhdHVyZW1vZGlmaWVyZWRpdGNvbXBvc2l0ZS5GZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLmFkYXB0ZXJzLmZlYXR1cmVtb2RpZmllcmVkaXRjb21wb3NpdGUuRmVhdHVyZU1vZGlmaWVyRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMucHJvcGVydHlzdHJpbmdzLlByb3BlcnR5U3RyaW5nUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3MuUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5wcm9wZXJ0eXN0cmluZ3MuUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIE5ld0lkZW50aWZpYWJsZVBhZ2V9IHRoYXQgaXMgY3VzdG9taXplZCB0byBjb250YWluIGEKKyAqIGxpc3Qgb2YgdGhlIHtAbGluayBFU3RydWN0dXJhbEZlYXR1cmV9cyBvZiBhbiB7QGxpbmsgSWRlbnRpZmlhYmxlfSB0aGF0IGNhbgorICogYmUgbW9kaWZpZWQgYnkgYSB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyfS4gSXQgaXMgZXh0ZW5kZWQgZm9yIGVhY2ggdHlwZSBvZgorICoge0BsaW5rIElkZW50aWZpYWJsZX0gd2hpY2ggY2FuIGJlIG1vZGlmaWVkLiBJbnN0YW5jZXMgb2Ygc3ViY2xhc3NlcyBvZiB0aGlzCisgKiBjbGFzcyBhcmUgY3JlYXRlZCBieSBhbiBjb21wb3NhYmxlIGFkYXB0ZXIgZmFjdG9yeS4gVGhpcyBhcHByb2FjaCBhbGxvd3MgbmV3CisgKiB0eXBlcyBvZiB7QGxpbmsgSWRlbnRpZmlhYmxlfXMgdG8gYmUgYWRkZWQgdG8gdGhlIHN5c3RlbSBhbmQgaGF2ZSB0aGUKKyAqIHtAbGluayBOZXdNb2RpZmllcldpemFyZH0gYmUgYWJsZSB0byBoYW5kbGUgdGhlbSwgY29tcGxldGUgd2l0aCBOTFMKKyAqIHRyYW5zbGF0aW9ucywgZXRjLgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgTmV3TW9kaWZpZXJQYWdlIGV4dGVuZHMgTmV3SWRlbnRpZmlhYmxlUGFnZSB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfSBmb3Igd2hpY2ggdGhlIHBhZ2UgaXMgY3JlYXRpbmcgYQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJ9LgorCSAqLworCXByb3RlY3RlZCBFT2JqZWN0IHRhcmdldDsKKworCXByaXZhdGUgZmluYWwgTGlzdDxGZWF0dXJlTW9kaWZpZXJDb21wb3NpdGU+IGZlYXR1cmVNb2RpZmllckNvbXBvc2l0ZXMgPSBuZXcgQXJyYXlMaXN0PEZlYXR1cmVNb2RpZmllckNvbXBvc2l0ZT4oKTsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICogCisJICogQHBhcmFtIGlkZW50aWZpYWJsZQorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBJZGVudGlmaWFibGV9IGZvciB3aGljaCB0aGUgcGFnZSBpcyBjcmVhdGluZyBhCisJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyfS4KKwkgKi8KKwlwcm90ZWN0ZWQgTmV3TW9kaWZpZXJQYWdlKGZpbmFsIEVPYmplY3QgdGFyZ2V0KSB7CisJCXN1cGVyKE1lc3NhZ2VzLmdldFN0cmluZygiTk1vZGlmaWVyV2l6LnBhZ2VfdGl0bGUiKSk7CisJCXNldFRpdGxlKE1lc3NhZ2VzLmdldFN0cmluZygiTk1vZGlmaWVyV2l6LnBhZ2VfdGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJOTW9kaWZpZXJXaXoucGFnZV9kZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAorCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKKwl9IC8vIE5ld01vZGlmaWVyUGFnZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkLk5ld0lkZW50aWZpYWJsZVBhZ2UjY3JlYXRlU3BlY2lmaWNDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlU3BlY2lmaWNDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQkKKwkJICAvL0Rpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7CisJICAgICAgLy9Db2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7CisJICAgICAgCisJICAgICAgZmluYWwgQ29tcG9zaXRlIG91dGVyQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsU1dULkJPUkRFUik7CisJICAgICAgb3V0ZXJDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOworCSAgICAgIAorCSAgICAgIC8vIHNldCB0aGUgbWluaW11bSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzY3JvbGxlZCBjb250ZW50IC0gbWV0aG9kIDIKKwkgICAgICBmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzY3JvbGxlZENvbXBvc2l0ZSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShvdXRlckNvbXBvc2l0ZSwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7CisJICAgICAgc2Nyb2xsZWRDb21wb3NpdGUuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKKwkgICAgICBzY3JvbGxlZENvbXBvc2l0ZS5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKKwkgICAgICBmaW5hbCBDb21wb3NpdGUgaW5uZXJDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNjcm9sbGVkQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJICAgICAgc2Nyb2xsZWRDb21wb3NpdGUuc2V0Q29udGVudChpbm5lckNvbXBvc2l0ZSk7CisJICAgICAgLy9pbm5lckNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kKGJsdWUpOworCSAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJICAgICAgaW5uZXJDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisJICAgICAgCisJICAgICAgc2Nyb2xsZWRDb21wb3NpdGUuc2V0TWluU2l6ZShpbm5lckNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKKwkgICAgICBpbm5lckNvbXBvc2l0ZS5zZXRTaXplKGlubmVyQ29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOworICAgICAgICAgIGlubmVyQ29tcG9zaXRlLmxheW91dCgpOworICAgICAgICAgIFBvaW50IGlubmVyU2l6ZSA9IGlubmVyQ29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7CisgICAgICAgICAgc2Nyb2xsZWRDb21wb3NpdGUuc2V0U2l6ZShpbm5lclNpemUpOworICAgIAkgIG91dGVyQ29tcG9zaXRlLnNldFNpemUoaW5uZXJTaXplKTsKKyAgICAJICBpbm5lckNvbXBvc2l0ZS5sYXlvdXQoKTsKKyAgICAgICAgICBvdXRlckNvbXBvc2l0ZS5sYXlvdXQoKTsKKyAgICAgICAgICBwYXJlbnQubGF5b3V0KCk7CisgICAgICAgICAgTGFiZWwgdGVzdExhYmVsID0gbmV3IExhYmVsKGlubmVyQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKKyAgICAgICAgICB0ZXN0TGFiZWwuc2V0VGV4dCgicHJlc3MgdG8gc2Nyb2xsIik7CisJICAgICAgQnV0dG9uIGFkZCA9IG5ldyBCdXR0b24gKGlubmVyQ29tcG9zaXRlLCBTV1QuUFVTSCk7CisJICAgICAgYWRkLnNldFRleHQoImZvcmNlIHNjcm9sbCIpOworCSAgICAgIGZpbmFsIGludFtdIGluZGV4ID0gbmV3IGludFtdezB9OworCSAgICAgIGFkZC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7CisJICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFdmVudCBlKSB7CisJICAgICAgICAgICAgICBpbmRleFswXSsrOworCSAgICAgICAgICAgICAgTGFiZWwgZW1wdHlMYWJlbCA9IG5ldyBMYWJlbChpbm5lckNvbXBvc2l0ZSwgU1dULk5PTkUpOworCSAgICAgICAgICAgICAgZW1wdHlMYWJlbC5zZXRUZXh0KCJib3R0b20iKTsKKwkgICAgICAgICAgICAgIC8vIHJlc2V0IHNpemUgb2YgY29udGVudCBzbyBjaGlsZHJlbiBjYW4gYmUgc2VlbiAtIG1ldGhvZCAxCisJICAgICAgICAgICAgICBpbm5lckNvbXBvc2l0ZS5zZXRTaXplKGlubmVyQ29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOworCSAgICAgICAgICAgICAgaW5uZXJDb21wb3NpdGUubGF5b3V0KCk7CisJICAgICAgICAgICAgICAKKwkgICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBtaW5pbXVtIHdpZHRoIGFuZCBoZWlnaHQgc28gY2hpbGRyZW4gY2FuIGJlIHNlZW4gLSBtZXRob2QgMgorCSAgICAgICAgICAgICAgUG9pbnQgaW5uZXJTaXplID0gaW5uZXJDb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKKwkgICAgICAgICAgICAgIGlubmVyU2l6ZS55Kj0zOworCSAgICAgICAgICAgICAgaW5uZXJTaXplLnkvPTI7CisJICAgICAgICAgICAgICBzY3JvbGxlZENvbXBvc2l0ZS5zZXRNaW5TaXplKGlubmVyU2l6ZSk7CisJICAgICAgICAgICAgICAJCisJICAgICAgICAgIH0KKwkgICAgICB9KTsKKworCQkvLyBHZXQgdGhlIGFkYXB0ZXIgdGhhdCB3aWxsIHByb3ZpZGUgTkxTJ2QgbmFtZXMgZm9yIHRoZQorCQkvLyBwcm9wZXJ0aWVzIG9mIHRoZSBJZGVudGlmaWFibGUKKwkJZmluYWwgUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXIgcHNwYSA9IChQcm9wZXJ0eVN0cmluZ1Byb3ZpZGVyQWRhcHRlcikgUHJvcGVydHlTdHJpbmdQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJLmFkYXB0KHRhcmdldCwgUHJvcGVydHlTdHJpbmdQcm92aWRlci5jbGFzcyk7CisKKwkJZmluYWwgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBpdGVtUHJvdmlkZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoCisJCQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5EZXNjcmlwdG9yLlJlZ2lzdHJ5LklOU1RBTkNFKTsKKworCQlmaW5hbCBJSXRlbVByb3BlcnR5U291cmNlIHByb3BlcnR5U291cmNlID0gKElJdGVtUHJvcGVydHlTb3VyY2UpIGl0ZW1Qcm92aWRlckZhY3RvcnkKKwkJCQkuYWRhcHQodGFyZ2V0LCBJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKKwkJZmluYWwgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcHJvcGVydGllcyA9IHByb3BlcnR5U291cmNlCisJCQkJLmdldFByb3BlcnR5RGVzY3JpcHRvcnModGFyZ2V0KTsKKworCQlmb3IgKGZpbmFsIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgOiBwcm9wZXJ0aWVzKSB7CisJCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGRlc2NyaXB0b3IKKwkJCQkJLmdldEZlYXR1cmUobnVsbCk7CisJCQkvLyBJcyB0aGlzIGEgcHJvcGVydHkgdGhhdCB0aGUgdXNlciBzcGVjaWZpZXM/CisJCQlpZiAoaXNVc2VyU3BlY2lmaWVkUHJvcGVydHkoZmVhdHVyZSkpIHsKKwkJCQkvLyBZZXMKKwkJCQkvLyBMYWJlbCBmb3IgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisJCQkJZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoaW5uZXJDb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJCQlsYWJlbC5zZXRUZXh0KHBzcGEuZ2V0UHJvcGVydHlOYW1lKGRlc2NyaXB0b3IpKTsKKwkJCQkvLyBsYWJlbC5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9DWUFOKSk7CisJCQkJR3JpZERhdGEgZ3JpZERhdGExID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7CisJCQkJZ3JpZERhdGExLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOworCQkJCWdyaWREYXRhMS5ob3Jpem9udGFsSW5kZW50ID0gMDsKKwkJCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhMSk7CisKKwkJCQkvLyBDb21wb3NpdGUgZm9yIHRoZSBlZGl0b3IKKwkJCQlmaW5hbCBGZWF0dXJlTW9kaWZpZXJDb21wb3NpdGUgZmVhdHVyZU1vZGlmaWVyQ29tcG9zaXRlID0gbmV3IEZlYXR1cmVNb2RpZmllckNvbXBvc2l0ZSgKKwkJCQkJCWlubmVyQ29tcG9zaXRlLCB0YXJnZXQsIGZlYXR1cmUsIHBzcGEsIGRlc2NyaXB0b3IsCisJCQkJCQlpc01vZGlmaWFibGVQcm9wZXJ0eShmZWF0dXJlKSwgdGhpcyk7CisJCQkJR3JpZERhdGEgZ3JpZERhdGEyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7CisJCQkJZ3JpZERhdGEyLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQkJCWdyaWREYXRhMi5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCQkJZ3JpZERhdGEyLmhvcml6b250YWxJbmRlbnQgPSAwOworCQkJCWZlYXR1cmVNb2RpZmllckNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhMik7CisKKwkJCQlmZWF0dXJlTW9kaWZpZXJDb21wb3NpdGVzLmFkZChmZWF0dXJlTW9kaWZpZXJDb21wb3NpdGUpOworCisJCQl9IC8vIGlmIHVzZXIgc3BlY2lmaWVkCisJCX0gLy8gZm9yIGVhY2ggcHJvcGVydHkKKworCQkvLyBBbnkgdGV4dCBmb3IgdGhlIGJvdHRvbT8KKwkJZmluYWwgU3RyaW5nIGJvdHRvbVRleHQgPSBnZXRCb3R0b21UZXh0KCk7CisJCWlmIChib3R0b21UZXh0ICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJZmluYWwgTGFiZWwgYm90dG9tVGV4dExhYmVsID0gbmV3IExhYmVsKGlubmVyQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCQlib3R0b21UZXh0TGFiZWwuc2V0VGV4dChib3R0b21UZXh0KTsKKwkJCWZpbmFsIEdyaWREYXRhIGJvdHRvbVRleHRHRCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQpOworCQkJYm90dG9tVGV4dEdELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQkJYm90dG9tVGV4dEdELmhvcml6b250YWxTcGFuID0gMjsKKwkJCWJvdHRvbVRleHRMYWJlbC5zZXRMYXlvdXREYXRhKGJvdHRvbVRleHRHRCk7CisJCX0gLy8gaWYKKwkKKwkJCisJCS8vIHJlc2V0IHRoZSBtaW5pbXVtIHdpZHRoIGFuZCBoZWlnaHQgc28gY2hpbGRyZW4gY2FuIGJlIHNlZW4gLSBtZXRob2QgMgorCQkvLyBUT0RPIHdoeSBkb2VzIHRoZSBmb2xsb3dpbmcgbm90IG1ha2UgdGhlIHNjcm9sbGJhciBzaG93IHVwIGF0IHRoZSBzdGFydCA/PworICAgICAgICBpbm5lclNpemUgPSBpbm5lckNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOworICAgICAgICBpbm5lckNvbXBvc2l0ZS5zZXRTaXplKGlubmVyU2l6ZSk7CisgICAgICAgIGlubmVyQ29tcG9zaXRlLmxheW91dCgpOworICAgICAgIC8vIHNjcm9sbGVkQ29tcG9zaXRlLnNldFNpemUoaW5uZXJTaXplKTsKKyAgICAgICAvLyBpbm5lclNpemUueSo9MzsKKyAgICAgICAvLyBpbm5lclNpemUueS89MjsKKyAgICAgICAgc2Nyb2xsZWRDb21wb3NpdGUuc2V0TWluU2l6ZShpbm5lclNpemUpOworICAgICAgICAJICAgICAgICAgICAgCisgICAgICAgCisJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCAib3JnLmVjbGlwc2Uuc3RlbS5kb2MubmV3bW9kaWZpZXJfY29udGV4dGlkIik7CisKKwkJcmV0dXJuIG91dGVyQ29tcG9zaXRlOworCX0gLy8gY3JlYXRlU3BlY2lmaWNDb21wb3NpdGUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZC5OZXdJZGVudGlmaWFibGVQYWdlI2dldERDRGVzY3JpcHRpb24oKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0RENEZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1lc3NhZ2VzCisJCQkJLmdldFN0cmluZygiTk1vZGlmaWVyV2l6LkRDX0RFU0NSSVBUSU9OIiksCisJCQkJbmV3IE9iamVjdFtdIHsgc2VyaWFsaXphdGlvbkZpbGVOYW1lRmllbGQuZ2V0VGV4dCgpIH0pOworCX0gLy8gZ2V0RENEZXNjcmlwdGlvbgorCisJLyoqCisJICogQHBhcmFtIGZlYXR1cmUKKwkgKiAgICAgICAgICAgIGEge0BsaW5rIEVTdHJ1Y3R1cmFsRmVhdHVyZX0gb2YgYW4ge0BsaW5rIElkZW50aWZpYWJsZX0uCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUge0BsaW5rIEVTdHJ1Y3R1cmFsRmVhdHVyZX0gcmVwcmVzZW50cworCSAqICAgICAgICAgYSBwcm9wZXJ0eSB0aGF0IGlzIHNwZWNpZmllZCBieSBhIHVzZXIsIDxjb2RlPmZhbHNlPC9jb2RlPgorCSAqICAgICAgICAgb3RoZXJ3aXNlLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzVXNlclNwZWNpZmllZFByb3BlcnR5KGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSAhZmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCkuZXF1YWxzKAorCQkJCUNvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRFVCTElOX0NPUkUpOworCQlyZXRWYWx1ZSA9IHJldFZhbHVlICYmICEoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBpc1VzZXJTcGVjaWZpZWRQcm9wZXJ0eQorCisJLyoqCisJICogQHJldHVybiBhIGxpbmUgb2YgdGV4dCB0byBhcHBlYXIgYmVsb3cgdGhlIHByb3BlcnRpZXMsIG9yCisJICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyB0ZXh0IGlzIHRvIGFwcGVhci4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEJvdHRvbVRleHQoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBmZWF0dXJlCisJICogICAgICAgICAgICB0aGUge0BsaW5rIEVTdHJ1Y3R1cmFsRmVhdHVyZX0gdG8gdGVzdCBmb3IgbW9kaWZpYWJpbGl0eQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gKERlZmF1bHQpIGlmIHRoZSBmZWF0dXJlIHJlcHJlc2VudHMgYSBwcm9wZXJ0eQorCSAqICAgICAgICAgdGhhdCB0aGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBtb2RpZnkgZm9yIGFuCisJICogICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudH0gb3IgYQorCSAqICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJ9LgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzTW9kaWZpYWJsZVByb3BlcnR5KGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCWJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKKwkJcmV0VmFsdWUgfD0gKGZlYXR1cmUuZ2V0RVR5cGUoKS5lcXVhbHMoRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVJTlQpKTsKKwkJcmV0VmFsdWUgfD0gKGZlYXR1cmUuZ2V0RVR5cGUoKS5lcXVhbHMoRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVMT05HKSk7CisJCXJldFZhbHVlIHw9IChmZWF0dXJlLmdldEVUeXBlKCkuZXF1YWxzKEVjb3JlUGFja2FnZS5MaXRlcmFscy5FRE9VQkxFKSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGlzTW9kaWZpYWJsZVByb3BlcnR5CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyfXMgb24gdGhlIHBhZ2UgdGhhdCB0aGUgdXNlciBoYXMKKwkgKiAgICAgICAgIHNwZWNpZmllZC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgTGlzdDxGZWF0dXJlTW9kaWZpZXI+IGdldEZlYXR1cmVNb2RpZmllcnMoKSB7CisJCWZpbmFsIExpc3Q8RmVhdHVyZU1vZGlmaWVyPiByZXRWYWx1ZSA9IG5ldyBBcnJheUxpc3Q8RmVhdHVyZU1vZGlmaWVyPigpOworCQlmb3IgKGZpbmFsIEZlYXR1cmVNb2RpZmllckNvbXBvc2l0ZSBmZWF0dXJlTW9kaWZpZXJDb21wb3NpdGUgOiBmZWF0dXJlTW9kaWZpZXJDb21wb3NpdGVzKSB7CisJCQlmaW5hbCBGZWF0dXJlTW9kaWZpZXIgZmVhdHVyZU1vZGlmaWVyID0gZmVhdHVyZU1vZGlmaWVyQ29tcG9zaXRlCisJCQkJCS5nZXRGZWF0dXJlTW9kaWZpZXIoKTsKKwkJCS8vIElzIHRoaXMgRmVhdHVyZU1vZGlmaWVyIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgTk9QPworCQkJaWYgKCEoZmVhdHVyZU1vZGlmaWVyIGluc3RhbmNlb2YgTk9QTW9kaWZpZXIpKSB7CisJCQkJLy8gWWVzCisJCQkJZmVhdHVyZU1vZGlmaWVyLnNldFRhcmdldCh0YXJnZXQpOworCQkJCXJldFZhbHVlLmFkZChmZWF0dXJlTW9kaWZpZXIpOworCQkJfSAvLyBpZgorCQl9IC8vIGZvciBlYWNoIEZlYXR1cmVNb2RpZmllckNvbXBvc2l0ZQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRGZWF0dXJlTW9kaWZpZXJzCisKKwkvKioKKwkgKiBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVBhZ2UjdmFsaWRhdGVQYWdlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7CisJCXJldHVybiBzdXBlci52YWxpZGF0ZVBhZ2UoKTsKKwl9IC8vIHZhbGlkYXRlUGFnZQorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBDb21wb3NpdGV9IHRoYXQgZGlzcGxheXMgdGhlIGRldGFpbHMgb2YgYQorCSAqIHtAbGluayBGZWF0dXJlTW9kaWZpZXJ9LgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRmVhdHVyZU1vZGlmaWVyQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKKworCQkvKioKKwkJICogVGhpcyBpcyBhIHBsYWNlIGhvbGRlciBmb3IgdGhlIGN1cnJlbnQKKwkJICoge0BsaW5rIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGV9IHRvIHdoaWNoIGEgcmVmZXJlbmNlIGlzCisJCSAqIG1haW50YWluZWQgYnkge0BsaW5rICNlZGl0Q29tcG9zaXRlfS4gV2hlbiB0aGUgdXNlciBzZWxlY3RzIG9uZSBvZgorCQkgKiB0aGUgcmFkaW8gYnV0dG9ucyAoe0BsaW5rICNub25lQnV0dG9ufSwge0BsaW5rICNyYW5nZUJ1dHRvbn0sIG9yCisJCSAqIHtAbGluayAjc2VxdWVuY2VCdXR0b259KSB0aGUgY2hpbGQgb2YgdGhpcyB7QGxpbmsgQ29tcG9zaXRlfSBpcworCQkgKiBjaGFuZ2VkIGJ5IHtAbGluayAjc2V0RWRpdENvbXBvc2l0ZShDb21wb3NpdGUpfS4KKwkJICovCisJCWZpbmFsIENvbXBvc2l0ZSBlZGl0Q29tcG9zaXRlSG9sZGVyOworCisJCS8qKgorCQkgKiBUaGlzIGlzIHRoZSBjdXJyZW50IHtAbGluayBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlfSBiZWluZworCQkgKiBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYW5kIGlzIHRoZSBjaGlsZCBvZgorCQkgKiB7QGxpbmsgI2VkaXRDb21wb3NpdGVIb2xkZXJ9LgorCQkgKi8KKwkJcHJpdmF0ZSBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIGVkaXRDb21wb3NpdGU7CisKKwkJLyoqCisJCSAqIFRoaXMgaXMgdGhlIHtAbGluayBGZWF0dXJlTW9kaWZpZXJ9LCBpZiBpdCBleGlzdHMsIGNyZWF0ZWQgYnkgdGhlCisJCSAqIHVzZXIgZm9yIHRoZSB7QGxpbmsgRVN0cnVjdHVyYWxGZWF0dXJlfSByZWZlcmVuY2VkIGJ5CisJCSAqIHtAbGluayAjZmVhdHVyZX0uCisJCSAqLworCQlGZWF0dXJlTW9kaWZpZXIgZmVhdHVyZU1vZGlmaWVyID0gbnVsbDsKKworCQkvKioKKwkJICogVGhlc2UgYnV0dG9ucyBhcmUgZ3JvdXBlZCB0b2dldGhlciBhcyAicmFkaW8gYnV0dG9ucyIgYW5kIGFsbG93IHRoZQorCQkgKiB1c2VyIHRvIHNwZWNpZnkgd2hpY2ggdHlwZSBvZiB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyfSB0byBjcmVhdGUuCisJCSAqIEluaXRpYWxseSwge0BsaW5rICNub25lQnV0dG9ufSBpcyBzZWxlY3RlZCBhbmQgdGhlCisJCSAqIHtAbGluayBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlfSByZXR1cm5lZCBieQorCQkgKiB7QGxpbmsgI2NyZWF0ZURlZmF1bHRFZGl0Q29tcG9zaXRlKENvbXBvc2l0ZSwgTmV3TW9kaWZpZXJQYWdlLCBJZGVudGlmaWFibGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSl9CisJCSAqIGlzIGRpc3BsYXllZCwgd2hpY2ggc2ltcGx5IHNob3dzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmZWF0dXJlLgorCQkgKi8KKwkJQnV0dG9uIG5vbmVCdXR0b24gPSBudWxsOworCQlCdXR0b24gc2luZ2xlQnV0dG9uID0gbnVsbDsKKwkJQnV0dG9uIHJhbmdlQnV0dG9uID0gbnVsbDsKKwkJQnV0dG9uIHNlcXVlbmNlQnV0dG9uID0gbnVsbDsKKworCQkvKioKKwkJICogQHBhcmFtIHBhcmVudAorCQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQge0BsaW5rIENvbXBvc2l0ZX0KKwkJICogQHBhcmFtIHRhcmdldAorCQkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgRU9iamVjdH0gdGhhdCBjb250YWlucyB0aGUKKwkJICogICAgICAgICAgICB7QGxpbmsgRVN0cnVjdHVyYWxGZWF0dXJlfQorCQkgKiBAcGFyYW0gZmVhdHVyZQorCQkgKiAgICAgICAgICAgIHRoZSBmZWF0dXJlIHRvIGJlIG1vZGlmaWVkCisJCSAqIEBwYXJhbSBwc3AKKwkJICogICAgICAgICAgICB0aGUgcHJvdmlkZXIgb2YgTkxTJ2Qgc3RyaW5ncyB0byBsYWJlbCB0aGUgcHJvcGVydGllcyBvZgorCQkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgSWRlbnRpZmlhYmxlfQorCQkgKiBAcGFyYW0gZGVzY3JpcHRvcgorCQkgKiBAcGFyYW0gbW9kaWZpYWJsZQorCQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gdGhlIHtAbGluayBFU3RydWN0dXJhbEZlYXR1cmV9CisJCSAqICAgICAgICAgICAgY2FuIGJlIG1vZGlmaWVkLgorCQkgKiBAcGFyYW0gcGFyZW50TmV3TW9kaWZpZXJQYWdlCisJCSAqICAgICAgICAgICAgdGhlIHtAbGluayBOZXdNb2RpZmllclBhZ2V9IHRoYXQgY29udGFpbnMgdGhlIHBhcmVudAorCQkgKiAgICAgICAgICAgIHtAbGluayBDb21wb3NpdGV9LgorCQkgKi8KKwkJcHVibGljIEZlYXR1cmVNb2RpZmllckNvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50LAorCQkJCWZpbmFsIEVPYmplY3QgdGFyZ2V0LAorCQkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAorCQkJCWZpbmFsIFByb3BlcnR5U3RyaW5nUHJvdmlkZXIgcHNwLAorCQkJCWZpbmFsIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCisJCQkJZmluYWwgYm9vbGVhbiBtb2RpZmlhYmxlLAorCQkJCWZpbmFsIE5ld01vZGlmaWVyUGFnZSBwYXJlbnROZXdNb2RpZmllclBhZ2UpIHsKKwkJCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOworCQkJZmluYWwgRm9ybUxheW91dCBsYXlvdXQgPSBuZXcgRm9ybUxheW91dCgpOworCQkJbGF5b3V0LnNwYWNpbmcgPSAyOworCQkJc2V0TGF5b3V0KGxheW91dCk7CisKKwkJCS8vIEVkaXQgQ29tcG9zaXRlIEhvbGRlcgorCQkJZWRpdENvbXBvc2l0ZUhvbGRlciA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOworCQkJZmluYWwgRmlsbExheW91dCBmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoKTsKKwkJCWZpbGxMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJCWZpbGxMYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQkJZWRpdENvbXBvc2l0ZUhvbGRlci5zZXRMYXlvdXQoZmlsbExheW91dCk7CisJCQllZGl0Q29tcG9zaXRlSG9sZGVyLnNldFRvb2xUaXBUZXh0KHBzcAorCQkJCQkuZ2V0UHJvcGVydHlUb29sVGlwKGRlc2NyaXB0b3IpKTsKKworCQkJLy8gVW5pdHMgTGFiZWwKKwkJCWZpbmFsIExhYmVsIHVuaXRMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7CisJCQl1bml0TGFiZWwuc2V0VGV4dChwc3AuZ2V0UHJvcGVydHlVbml0cyhkZXNjcmlwdG9yKSk7CisJCQkKKwkJCS8vIFJhZGlvIGJ1dHRvbiBncm91cAorCQkJZmluYWwgR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULlNIQURPV19FVENIRURfSU4pOworCQkJZ3JvdXAuc2V0VGV4dCgiU2VsZWN0IE1vZGlmaWVyIFR5cGUiKTsKKwkJCWdyb3VwLnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7CisJCQlncm91cC5zZXRFbmFibGVkKG1vZGlmaWFibGUpOworCQkJbm9uZUJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7CisJCQlub25lQnV0dG9uLnNldFRleHQoIk5vbmUiKTsKKwkJCW5vbmVCdXR0b24uc2V0RW5hYmxlZChtb2RpZmlhYmxlKTsKKworCisJCQkvLyByYW5nZSBidXR0b24KKwkJCXNpbmdsZUJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7CisJCQlzaW5nbGVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlNpbmdsZS50eXBlIikpOworCQkJc2luZ2xlQnV0dG9uLnNldEVuYWJsZWQobW9kaWZpYWJsZSk7CisJCQkKKwkJCS8vIHJhbmdlIGJ1dHRvbgorCQkJcmFuZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOworCQkJcmFuZ2VCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlJhbmdlLnR5cGUiKSk7CisJCQlyYW5nZUJ1dHRvbi5zZXRFbmFibGVkKG1vZGlmaWFibGUpOworCQkJCisJCQkvLyBzZXF1ZW5jZSBidXR0b24KKwkJCXNlcXVlbmNlQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKKwkJCXNlcXVlbmNlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJTZXF1ZW5jZS50eXBlIikpOworCQkJc2VxdWVuY2VCdXR0b24uc2V0RW5hYmxlZChtb2RpZmlhYmxlKTsKKworCQkJZmluYWwgaW50IG9mZnNldCA9IDEwOworCisJCQkvLyBUaGUgbGVmdCBvZiB0aGUgZWRpdENvbXBvc2l0ZUhvbGRlciBpcyBhdHRhY2hlZCB0byB0aGUgbGVmdCBvZgorCQkJLy8gdGhlIHBhcmVudCBjb21wb3NpdGUKKwkJCUZvcm1EYXRhIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCQlmb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQkJZm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIG9mZnNldCk7CisJCQllZGl0Q29tcG9zaXRlSG9sZGVyLnNldExheW91dERhdGEoZm9ybURhdGEpOworCisJCQkvLyBsZWZ0LT5ob2xkZXIucmlnaHQKKwkJCS8vIHJpZ2h0LT5ncm91cAorCQkJZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJCWZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZWRpdENvbXBvc2l0ZUhvbGRlciwgMCwKKwkJCQkJU1dULlJJR0hUKTsKKwkJCWZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGdyb3VwLCAwLCBTV1QuTEVGVCk7CisJCQlmb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoZWRpdENvbXBvc2l0ZUhvbGRlciwgLTMsCisJCQkJCVNXVC5CT1RUT00pOworCQkJdW5pdExhYmVsLnNldExheW91dERhdGEoZm9ybURhdGEpOworCisJCQkvLyBUaGUgcmlnaHQgb2YgdGhlIHJhZGlvIGJ1dHRvbiBjb21wb3NpdGUgaXMgYXR0YWNoZWQgdG8gdGhlIHJpZ2h0CisJCQkvLyBvZiB0aGUgcGFyZW50IGNvbXBvc2l0ZS4KKwkJCWZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCQlmb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShmb3JtRGF0YSk7CisKKwkJCS8vIFRoaXMgY2FsbCB0YWtlcyB0aGUgZmVhdHVyZSBhbmQgYWRhcHRzIGl0IHRvIGEgbW9kaWZpZXIgdGhhdCBkb2VzCisJCQkvLyBub3RoaW5nLiBXaGVuIHdlIGNhbGwgc2V0RmVhdHVyZU1vZGlmaWVyIHRoYXQgbW9kaWZpZXIgaXMgYWRhcHRlZAorCQkJLy8gdG8gYSBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIChhbmQgYXNzaWduZWQgdG8KKwkJCS8vIGVkaXRDb21wb3NpdGUpLiBUaGF0IGNvbXBvc2l0ZSBkb2Vzbid0IGFsbG93IGVkaXRpbmcsIGJ1dCwKKwkJCS8vIGluc3RlYWQsIGRpc3BsYXlzIGEgImRlZmF1bHQiIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmZWF0dXJlJ3MKKwkJCS8vIHZhbHVlLiBGb3IgYSBTdHJpbmcsIGl0IHdvdWxkIGp1c3QgZGlzcGxheSB0aGUgdmFsdWUgb2YgdGhlCisJCQkvLyBTdHJpbmcsIGZvciBhIG51bWJlciBpdCBqdXN0IGRpc3BsYXlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUKKwkJCS8vIHZhbHVlIG9mIHRoZSBudW1iZXIKKwkJCXNldEZlYXR1cmVNb2RpZmllcihFU3RydWN0dXJhbEZlYXR1cmVGZWF0dXJlTW9kaWZpZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkuYWRhcHQoZmVhdHVyZSwgTk9QTW9kaWZpZXIuY2xhc3MpKTsKKwkJCXN3aXRjaFRvRmVhdHVyZU1vZGlmaWVyKHRhcmdldCwgcGFyZW50TmV3TW9kaWZpZXJQYWdlKTsKKworCQkJbm9uZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCgKKwkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCS8vIFB1dCB1cCB0aGUgZGVmYXVsdD8KKwkJCQkJaWYgKG5vbmVCdXR0b24uZ2V0U2VsZWN0aW9uKCkKKwkJCQkJCQkmJiAhKGZlYXR1cmVNb2RpZmllciBpbnN0YW5jZW9mIE5PUE1vZGlmaWVyKSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQlmaW5hbCBGZWF0dXJlTW9kaWZpZXIgZm0gPSBFU3RydWN0dXJhbEZlYXR1cmVGZWF0dXJlTW9kaWZpZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkJLmFkYXB0KGZlYXR1cmUsIE5PUE1vZGlmaWVyLmNsYXNzKTsKKwkJCQkJCWZtLnNldFRhcmdldChmZWF0dXJlKTsKKwkJCQkJCXNldEZlYXR1cmVNb2RpZmllcihmbSk7CisJCQkJCQlzd2l0Y2hUb0ZlYXR1cmVNb2RpZmllcih0YXJnZXQsCisJCQkJCQkJCXBhcmVudE5ld01vZGlmaWVyUGFnZSk7CisJCQkJCX0gLy8gaWYKKwkJCQl9CisJCQl9KTsKKwkJCQorCQkJc2luZ2xlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKAorCQkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJLy8gUHV0IHVwIHRoZSBzaW5nbGUgdmFsdWUgbW9kaWZpZXI/CisJCQkJCWlmIChzaW5nbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkKKwkJCQkJCQkmJiAhKGZlYXR1cmVNb2RpZmllciBpbnN0YW5jZW9mIFNpbmdsZVZhbHVlTW9kaWZpZXIpKSB7CisJCQkJCQkvLyBZZXMKKwkJCQkJCXNldEZlYXR1cmVNb2RpZmllcihFU3RydWN0dXJhbEZlYXR1cmVGZWF0dXJlTW9kaWZpZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkJCQkuYWRhcHQoZmVhdHVyZSwgU2luZ2xlVmFsdWVNb2RpZmllci5jbGFzcykpOworCQkJCQkJc3dpdGNoVG9GZWF0dXJlTW9kaWZpZXIodGFyZ2V0LAorCQkJCQkJCQlwYXJlbnROZXdNb2RpZmllclBhZ2UpOworCQkJCQkJLy8gc2VsZWN0UmFuZ2VCdXR0b24oKTsKKwkJCQkJfSAvLyBpZgorCQkJCX0KKwkJCX0pOworCQkJCisJCQlyYW5nZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCgKKwkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCS8vIFB1dCB1cCB0aGUgcmFuZ2UgbW9kaWZpZXI/CisJCQkJCWlmIChyYW5nZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKQorCQkJCQkJCSYmICEoZmVhdHVyZU1vZGlmaWVyIGluc3RhbmNlb2YgUmFuZ2VNb2RpZmllcikpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJc2V0RmVhdHVyZU1vZGlmaWVyKEVTdHJ1Y3R1cmFsRmVhdHVyZUZlYXR1cmVNb2RpZmllckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJCQkJCS5hZGFwdChmZWF0dXJlLCBSYW5nZU1vZGlmaWVyLmNsYXNzKSk7CisJCQkJCQlzd2l0Y2hUb0ZlYXR1cmVNb2RpZmllcih0YXJnZXQsCisJCQkJCQkJCXBhcmVudE5ld01vZGlmaWVyUGFnZSk7CisJCQkJCQkvLyBzZWxlY3RSYW5nZUJ1dHRvbigpOworCQkJCQl9IC8vIGlmCisJCQkJfQorCQkJfSk7CisJCQlzZXF1ZW5jZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCgKKwkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCS8vIFB1dCB1cCB0aGUgc2VxdWVuY2UgbW9kaWZpZXI/CisJCQkJCWlmIChzZXF1ZW5jZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKQorCQkJCQkJCSYmICEoZmVhdHVyZU1vZGlmaWVyIGluc3RhbmNlb2YgU2VxdWVuY2VNb2RpZmllcikpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJc2V0RmVhdHVyZU1vZGlmaWVyKEVTdHJ1Y3R1cmFsRmVhdHVyZUZlYXR1cmVNb2RpZmllckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJCQkJCS5hZGFwdChmZWF0dXJlLCBTZXF1ZW5jZU1vZGlmaWVyLmNsYXNzKSk7CisJCQkJCQlzd2l0Y2hUb0ZlYXR1cmVNb2RpZmllcih0YXJnZXQsCisJCQkJCQkJCXBhcmVudE5ld01vZGlmaWVyUGFnZSk7CisJCQkJCQkvLyBzZWxlY3RTZXF1ZW5jZUJ1dHRvbigpOworCQkJCQl9IC8vIGlmCisJCQkJfQorCQkJfSk7CisJCQkKKwkJCS8vIFRoZSBGZWF0dXJlIE1vZGlmaWVyIENvbXBvc2l0ZSBtdXN0IGhhdmUgCisJCQkvLyBmaXhlZCBzaXplIHRvIHB1dCB0aGVzZSBpbiBhIHNjcm9sbCBwYW5lCisJCQlzZXRTaXplKDUwMCwxNTApOworCisJCX0gLy8gRmVhdHVyZU1vZGlmaWVyQ29tcG9zaXRlCisKKwkJdm9pZCBzZWxlY3ROb25lQnV0dG9uKCkgeworCQkJbm9uZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJCQlzaW5nbGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKKwkJCXJhbmdlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7CisJCQlzZXF1ZW5jZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQl9IC8vIHNlbGVjdE5vbmVCdXR0b24KKworCQlGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIGNyZWF0ZURlZmF1bHRFZGl0Q29tcG9zaXRlKAorCQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsCisJCQkJZmluYWwgTmV3TW9kaWZpZXJQYWdlIHBhcmVudE5ld01vZGlmaWVyUGFnZSwKKwkJCQlmaW5hbCBJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlLAorCQkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCQlmaW5hbCBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlIHJldFZhbHVlID0gbmV3IEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUoCisJCQkJCXBhcmVudCwgcGFyZW50TmV3TW9kaWZpZXJQYWdlLCBudWxsKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX07CisJCQlyZXRWYWx1ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7CisJCQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChyZXRWYWx1ZSwgU1dULkJPUkRFUiB8IFNXVC5UUkFJTCk7CisJCQlsYWJlbC5zZXRUZXh0KGlkZW50aWZpYWJsZS5lR2V0KGZlYXR1cmUpLnRvU3RyaW5nKCkpOworCQkJZmluYWwgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOworCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gY3JlYXRlRGVmYXVsdEVkaXRDb21wb3NpdGUKKworCQl2b2lkIHN3aXRjaFRvRmVhdHVyZU1vZGlmaWVyKGZpbmFsIEVPYmplY3QgdGFyZ2V0LAorCQkJCWZpbmFsIE5ld01vZGlmaWVyUGFnZSBwYXJlbnROZXdNb2RpZmllclBhZ2UpIHsKKwkJCS8vIFRoZSB0YXJnZXQgb2YgdGhlIGZlYXR1cmVNb2RpZmllciBuZWVkcyB0byBiZSBhZGp1c3RlZCBoZXJlLiBJdAorCQkJLy8gd291bGQgdHlwaWNhbGx5IGJlIGlkZW50aWZpYWJsZSwgYnV0IGlmIGlkZW50aWZpYWJsZSBpcyBhbgorCQkJLy8gaW5zdGFuY2Ugb2YgYSBTdGF0aWNOb2RlTGFiZWwgb3IgU3RhdGljRWRnZUxhYmVsIHRoZW4gdGhlCisJCQkvLyBmZWF0dXJlcyBvZiB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgdmFsdWUgZmVhdHVyZSBvZiB0aGUKKwkJCS8vIGlkZW50aWZpYWJsZSBoYXZlIGJlZW4gaW5jbHVkZWQgYXMgZmVhdHVyZXMuIFRoZSBwcm9ibGVtIGlzIHRoYXQKKwkJCS8vIHdoZW4gdGhhdCBoYXBwZW5zIHRoZSB0YXJnZXQgb2YgdGhlIEZlYXR1cmVNb2RpZmllciBuZWVkcyB0byBiZQorCQkJLy8gdGhlIGxhYmVsIHZhbHVlIGFuZCBub3QgdGhlIGlkZW50aWZpYWJsZS4KKwkJCS8vIEEgc3RhdGljIGxhYmVsPworCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIFN0YXRpY0xhYmVsCisJCQkJCSYmICh0YXJnZXQuZUNsYXNzKCkgIT0gZmVhdHVyZU1vZGlmaWVyCisJCQkJCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLmdldEVDb250YWluaW5nQ2xhc3MoKSkpIHsKKwkJCQkvLyBZZXMKKwkJCQlmaW5hbCBTdGF0aWNMYWJlbCBzdGF0aWNMYWJlbCA9IChTdGF0aWNMYWJlbCkgdGFyZ2V0OworCQkJCWZpbmFsIExhYmVsVmFsdWUgbHYgPSAoTGFiZWxWYWx1ZSkgc3RhdGljTGFiZWwKKwkJCQkJCS5lR2V0KEdyYXBoUGFja2FnZS5MaXRlcmFscy5MQUJFTF9fQ1VSUkVOVF9WQUxVRSk7CisJCQkJZmVhdHVyZU1vZGlmaWVyLnNldFRhcmdldChsdik7CisJCQl9IC8vIGlmIHN0YXRpYyBsYWJlbAorCQkJZWxzZSB7CisJCQkJZmVhdHVyZU1vZGlmaWVyLnNldFRhcmdldCh0YXJnZXQpOworCQkJfQorCisJCQlmaW5hbCBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlciBmbWVjQWRhcHRlciA9IChGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlQWRhcHRlcikgRmVhdHVyZU1vZGlmaWVyRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJCS5hZGFwdChmZWF0dXJlTW9kaWZpZXIsCisJCQkJCQkJRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZUFkYXB0ZXIuY2xhc3MpOworCQkJZm1lY0FkYXB0ZXIuc2V0VGFyZ2V0KGZlYXR1cmVNb2RpZmllcik7CisJCQlzZXRFZGl0Q29tcG9zaXRlKGZtZWNBZGFwdGVyLmNyZWF0ZUVkaXRDb21wb3NpdGUoCisJCQkJCWVkaXRDb21wb3NpdGVIb2xkZXIsIHRhcmdldCwgcGFyZW50TmV3TW9kaWZpZXJQYWdlKSk7CisJCQlmbWVjQWRhcHRlci5zZXRTZWxlY3RlZEJ1dHRvbihub25lQnV0dG9uLCBzaW5nbGVCdXR0b24sIHJhbmdlQnV0dG9uLAorCQkJCQlzZXF1ZW5jZUJ1dHRvbik7CisJCX0gLy8gc3dpdGNoVG9GZWF0dXJlTW9kaWZpZXIKKworCQl2b2lkIHNldEVkaXRDb21wb3NpdGUoZmluYWwgRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZSBlZGl0Q29tcG9zaXRlKSB7CisJCQkvLyBHZXQgcmlkIG9mIHRoZSBvbGQgb25lPworCQkJaWYgKHRoaXMuZWRpdENvbXBvc2l0ZSAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJdGhpcy5lZGl0Q29tcG9zaXRlLmRpc3Bvc2UoKTsKKwkJCX0gLy8gaWYKKwkJCXRoaXMuZWRpdENvbXBvc2l0ZSA9IGVkaXRDb21wb3NpdGU7CisJCQlnZXRTaGVsbCgpLnBhY2soKTsKKwkJCS8vIGdldFNoZWxsKCkubGF5b3V0KCk7CisJCQlnZXRTaGVsbCgpLmxheW91dCh0cnVlLCB0cnVlKTsKKwkJfSAvLyBzZXRFZGl0Q29tcG9zaXRlCisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIHtAbGluayBGZWF0dXJlTW9kaWZpZXJ9LCBwb3NzaWJseSA8Y29kZT5udWxsPC9jb2RlPgorCQkgKi8KKwkJcHVibGljIGZpbmFsIEZlYXR1cmVNb2RpZmllciBnZXRGZWF0dXJlTW9kaWZpZXIoKSB7CisJCQlyZXR1cm4gZmVhdHVyZU1vZGlmaWVyOworCQl9CisKKwkJLyoqCisJCSAqIEBwYXJhbSBmZWF0dXJlTW9kaWZpZXIKKwkJICogICAgICAgICAgICB0aGUge0BsaW5rIEZlYXR1cmVNb2RpZmllcn0gdG8gc2V0CisJCSAqLworCQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRGZWF0dXJlTW9kaWZpZXIoCisJCQkJZmluYWwgRmVhdHVyZU1vZGlmaWVyIGZlYXR1cmVNb2RpZmllcikgeworCQkJdGhpcy5mZWF0dXJlTW9kaWZpZXIgPSBmZWF0dXJlTW9kaWZpZXI7CisJCX0KKwl9IC8vIEZlYXR1cmVNb2RpZmllckNvbXBvc2l0ZQorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBDb21wb3NpdGV9IHRoYXQgYWxsb3dzIGEgdXNlciB0byBzcGVjaWZ5IHRoZQorCSAqIGRldGFpbHMgb2YgYSB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyfS4KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgc3RhdGljIGNsYXNzIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgeworCisJCS8qKgorCQkgKiBUaGlzIGlzIHRoZSB7QGxpbmsgRmVhdHVyZU1vZGlmaWVyfSB0aGF0IHRoaXMge0BsaW5rIENvbXBvc2l0ZX0gaXMKKwkJICogZWRpdGluZy4KKwkJICovCisJCXByb3RlY3RlZCBGZWF0dXJlTW9kaWZpZXIgZmVhdHVyZU1vZGlmaWVyID0gbnVsbDsKKworCQkvKioKKwkJICogVGhpcyBpcyB0aGUge0BsaW5rIE5ld01vZGlmaWVyUGFnZX0gdGhhdCBpcyB0aGUgdWx0aW1hdGUgcGFyZW50IG9mCisJCSAqIHRoZSBwYXJlbnQge0BsaW5rIENvbXBvc2l0ZX0KKwkJICovCisJCXByb3RlY3RlZCBOZXdNb2RpZmllclBhZ2UgcGFyZW50TmV3TW9kaWZpZXJQYWdlOworCisJCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoCisJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBNb2RpZnlFdmVudCBlKSB7CisJCQkJcGFyZW50TmV3TW9kaWZpZXJQYWdlLnNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZSgpKTsKKwkJCX0KKwkJfTsKKworCQkvKioKKwkJICogQHBhcmFtIHBhcmVudAorCQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQge0BsaW5rIENvbXBvc2l0ZX0KKwkJICogQHBhcmFtIHBhcmVudE5ld01vZGlmaWVyUGFnZQorCQkgKiAgICAgICAgICAgIHRoZSB1bHRpbWF0ZSBwYXJlbnQge0BsaW5rIE5ld01vZGlmaWVyUGFnZX0gb2YgdGhlIHBhcmVudAorCQkgKiAgICAgICAgICAgIHtAbGluayBDb21wb3NpdGV9CisJCSAqIEBwYXJhbSBmZWF0dXJlTW9kaWZpZXIKKwkJICogICAgICAgICAgICB0aGUge0BsaW5rIEZlYXR1cmVNb2RpZmllcn0gYmVpbmcgZWRpdGVkLgorCQkgKi8KKwkJcHVibGljIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwKKwkJCQlmaW5hbCBOZXdNb2RpZmllclBhZ2UgcGFyZW50TmV3TW9kaWZpZXJQYWdlLAorCQkJCWZpbmFsIEZlYXR1cmVNb2RpZmllciBmZWF0dXJlTW9kaWZpZXIpIHsKKwkJCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOworCQkJdGhpcy5wYXJlbnROZXdNb2RpZmllclBhZ2UgPSBwYXJlbnROZXdNb2RpZmllclBhZ2U7CisJCQl0aGlzLmZlYXR1cmVNb2RpZmllciA9IGZlYXR1cmVNb2RpZmllcjsKKwkJfSAvLyBGZWF0dXJlTW9kaWZpZXJFZGl0Q29tcG9zaXRlCisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIHtAbGluayBGZWF0dXJlTW9kaWZpZXJ9CisJCSAqLworCQlwdWJsaWMgZmluYWwgRmVhdHVyZU1vZGlmaWVyIGdldEZlYXR1cmVNb2RpZmllcigpIHsKKwkJCXJldHVybiBmZWF0dXJlTW9kaWZpZXI7CisJCX0KKworCQkvKioKKwkJICogQHJldHVybiB0aGUgbW9kaWZ5TGlzdGVuZXIKKwkJICovCisJCXB1YmxpYyBmaW5hbCBNb2RpZnlMaXN0ZW5lciBnZXRNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCXJldHVybiBtb2RpZnlMaXN0ZW5lcjsKKwkJfQorCisJCS8qKgorCQkgKiBBcyBhIHNpZGUtZWZmZWN0IHRoaXMgbWV0aG9kIHNldHMgdGhlIGVycm9yIG1lc3NhZ2Ugb2YgdGhlCisJCSAqIHtAbGluayAjcGFyZW50TmV3TW9kaWZpZXJQYWdlfSBpZiBpdCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4KKwkJICogCisJCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlCisJCSAqICAgICAgICAge0BsaW5rIEZlYXR1cmVNb2RpZmllckVkaXRDb21wb3NpdGV9IGlzIHZhbGlkLgorCQkgKi8KKwkJYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoKTsKKworCX0gLy8gRmVhdHVyZU1vZGlmaWVyRWRpdENvbXBvc2l0ZQorfSAvLyBOZXdNb2RpZmllclBhZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdNb2RpZmllcldpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL05ld01vZGlmaWVyV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2N2Q4YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdNb2RpZmllcldpemFyZC5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvLyBOZXdNb2RpZmllcldpemFyZC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguRWRnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGlmaWVyLk1vZGlmaWVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kaWZpZXIuTW9kaWZpZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuYWRhcHRlcnMubmV3bW9kaWZpZXJwYWdlLk5ld01vZGlmaWVyUGFnZUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS5hZGFwdGVycy5uZXdtb2RpZmllcnBhZ2UuTmV3TW9kaWZpZXJQYWdlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBOZXdJZGVudGlmaWFibGVXaXphcmR9IGZvciB0aGF0IGNyZWF0ZXMgbmV3IFNURU0KKyAqIHtAbGluayBNb2RpZmllcn1zLgorICovCitwdWJsaWMgY2xhc3MgTmV3TW9kaWZpZXJXaXphcmQgZXh0ZW5kcyBOZXdJZGVudGlmaWFibGVXaXphcmQgeworCisJLyoqCisJICogVGhpcyBpcyB0aGUge0BsaW5rIElkZW50aWZpYWJsZX0gZm9yIHdoaWNoIHRoZSB3aXphcmQgaXMgY3JlYXRpbmcgYQorCSAqIHtAbGluayBNb2RpZmllcn0uCisJICovCisJcHJpdmF0ZSBFT2JqZWN0IHRhcmdldDsKKwlwcml2YXRlIE5ld01vZGlmaWVyUGFnZSBuZXdNb2RpZmllclBhZ2U7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjZ2V0V2l6YXJkVGl0bGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0V2l6YXJkVGl0bGUoKSB7CisJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIk5Nb2RpZmllcldpei53aXphcmRfdGl0bGUiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTmV3SWRlbnRpZmlhYmxlUGFnZSBjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlKCkgeworCisJCS8vIFdlIHVzZSBhbiBhZGFwdGVyIGZhY3RvcnkgdG8gYWRhcHQgdGhlIElkZW50aWZpYWJsZSBpbnRvIGEKKwkJLy8gTmV3TW9kaWZpZXJQYWdlLiBXZSBkbyB0aGlzIGJlY2F1c2UgdGhlIHVuaXZlcnNlIG9mIElkZW50aWZpYWJsZXMgaXMKKwkJLy8gdW5saW1pdGVkLiBUaGUgbnVtYmVyIGFuZCB0eXBlcyBvZiBmaWVsZHMgY2FuIHZhcnkgd2lkZWx5LiBUaGUKKwkJLy8gYWRhcHRlciBmYWN0b3J5IGlzIENvbXBvc2FibGUgd2hpY2ggbWVhbnMgdGhhdCBpdCBtYWludGFpbnMgYW4KKwkJLy8gZXh0ZW5zaWJsZSBjb2xsZWN0aW9uIG9mIG90aGVyIGZhY3RvcmllcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0KKwkJLy8gdGhlIGFkYXB0aW9uLiBGb3IgaW5zdGFuY2UsIGEgbmV3IERlY29yYXRvciAoYSB0eXBlIG9mIElkZW50aWZpYWJsZSkKKwkJLy8gdGhhdCBpbXBsZW1lbnRzIGEgZGlzZWFzZSBtb2RlbCBjb21wdXRhdGlvbiBjYW4gYmUgYWRhcHRlZCBieSB0aGUKKwkJLy8gYWRkaXRpb24gb2YgYSBmYWN0b3J5IHRoYXQgcmVjb2duaXplcyBpdC4KKwkJZmluYWwgTmV3TW9kaWZpZXJQYWdlQWRhcHRlciBhZGFwdGVyID0gKE5ld01vZGlmaWVyUGFnZUFkYXB0ZXIpIE5ld01vZGlmaWVyUGFnZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCisJCQkJLmFkYXB0KHRhcmdldCwgTmV3TW9kaWZpZXJQYWdlQWRhcHRlci5jbGFzcyk7CisJCS8vIFdlcmUgd2Ugc3VjY2Vzc2Z1bCBpbiBhZGFwdGluZz8KKwkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlhZGFwdGVyLnNldFRhcmdldCh0YXJnZXQpOworCQkJbmV3TW9kaWZpZXJQYWdlID0gYWRhcHRlci5jcmVhdGVOZXdNb2RpZmllclBhZ2UoKTsKKwkJfSAvLyBpZgorCQllbHNlIHsKKwkJCS8vIE5vCisJCQlBY3RpdmF0b3IubG9nRXJyb3IoCisJCQkJCSJJbnRlcm5hbCBFcnJvcjogY291bGQgbm90IGNyZWF0ZSBOZXdNb2RpZmllclBhZ2UgZm9yIFwiIgorCQkJCQkJCSsgdGFyZ2V0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIlwiIiwgbnVsbCk7CisJCQluZXdNb2RpZmllclBhZ2UgPSBuZXcgTmV3TW9kaWZpZXJQYWdlKHRhcmdldCkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlU3BlY2lmaWNDb21wb3NpdGUoCisJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQl9OworCQl9IC8vIGVsc2UKKwkJCisJCXRoaXMuc2V0SGVscENvbnRleHRJZCgib3JnLmVjbGlwc2Uuc3RlbS5kb2MubmV3bW9kaWZpZXJfY29udGV4dGlkIik7IC8vSEVSRQorCisJCXJldHVybiBuZXdNb2RpZmllclBhZ2U7CisJfSAvLyBjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjY3JlYXRlRHVibGluQ29yZVBhZ2UoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBEdWJsaW5Db3JlUGFnZSBjcmVhdGVEdWJsaW5Db3JlUGFnZSgpIHsKKwkJcmV0dXJuIG5ldyBEdWJsaW5Db3JlUGFnZSgpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURDQXR0cmlidXRlcygpIHsKKwkJCQlzdXBlci5pbml0aWFsaXplRENBdHRyaWJ1dGVzKCk7CisJCQkJZm9ybWF0LnNldFRleHQoTW9kaWZpZXJQYWNrYWdlLmVOU19VUkkpOworCQkJCWZvcm1hdC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQl0eXBlLnNldFRleHQoU1RFTVVSSS5NT0RJRklFUl9UWVBFX1VSSS50b1N0cmluZygpKTsKKwkJCQl0eXBlLnNldEVuYWJsZWQoZmFsc2UpOworCQkJfQorCQl9OworCX0gLy8gY3JlYXRlRHVibGluQ29yZVBhZ2UKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNjcmVhdGVJZGVudGlmaWFibGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJZGVudGlmaWFibGUgY3JlYXRlSWRlbnRpZmlhYmxlKCkgeworCQlmaW5hbCBNb2RpZmllciByZXRWYWx1ZSA9IE1vZGlmaWVyRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTW9kaWZpZXIoKTsKKwkJcmV0VmFsdWUuc2V0RHVibGluQ29yZShuZXdEdWJsaW5Db3JlUGFnZS5jcmVhdGVEdWJsaW5Db3JlKCkpOworCQkvLyBXZSBhbGxvdyBFZGdlcyB0byBiZSBjb25zaWRlcmVkIHRvIGJlICJtb2RpZmlhYmxlIiwgYnV0IHdlIHJlYWxseQorCQkvLyBtZWFuIHRoYXQgdGhlaXIgbGFiZWxzIGNhbiBiZSBtb2RpZmllZC4gVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZvciB0aGUKKwkJLy8gdXNlciBzbyB0aGF0IHRoZXkgY2FuIHJpZ2h0LWNsaWNrIG9uIGFuIEVkZ2UgYW5kIGNyZWF0ZSBhIG1vZGlmaWVyCisJCS8vIGZvciB0aGVpciBsYWJlbC4gVGhlIHByb2JsZW0gaXMgdGhhdCB3ZSd2ZSBnb3QgdG8gZ2V0IHRoZSByaWdodAorCQkvLyB0YXJnZXQgVVJJLCBpZiB3ZSBqdXN0IGdldCB0aGUgVVJJIG9mIHRoZSBJZGVudGlmaWFibGUgKHdoaWNoIGNvdWxkCisJCS8vIGJlIGFuIEVkZ2VMYWJlbCkgdGhlbiB3ZSdkIGdldCB0aGUgVVJJIG9mIHRoZSBFZGdlIGFuZCBub3QgaXRzIExhYmVsLgorCisJCS8vIElzIHRoaXMgYW4gRWRnZT8KKwkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVkZ2UpIHsKKwkJCS8vIFllcworCQkJZmluYWwgRWRnZSBlZGdlID0gKEVkZ2UpIHRhcmdldDsKKwkJCXJldFZhbHVlLnNldFRhcmdldFVSSShlZGdlLmdldExhYmVsKCkuZ2V0VVJJKCkpOworCQl9IGVsc2UgaWYodGFyZ2V0IGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlKXsKKwkJCXJldFZhbHVlLnNldFRhcmdldFVSSSgoKElkZW50aWZpYWJsZSl0YXJnZXQpLmdldFVSSSgpKTsKKwkJfSBlbHNlIHJldFZhbHVlLnNldFRhcmdldFVSSShudWxsKTsgLy8gU3RyaW5nIHZhbHVlIG9yIGRvdWJsZSB2YWx1ZQorCQlyZXRWYWx1ZS5nZXRGZWF0dXJlTW9kaWZpZXJzKCkuYWRkQWxsKAorCQkJCW5ld01vZGlmaWVyUGFnZS5nZXRGZWF0dXJlTW9kaWZpZXJzKCkpOworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVTcGVjaWZpY0lkZW50aWZpYWJsZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2dldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkgeworCQlyZXR1cm4gTmV3U1RFTVByb2plY3RXaXphcmQuTU9ESUZJRVJTX0ZPTERFUl9OQU1FOworCX0gLy8gZ2V0U2VyaWFsaXphdGlvbkZvbGRlck5hbWUKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNnZXRTZXJpYWxpemF0aW9uRmlsZU5hbWVFeHRlbnNpb24oKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lRXh0ZW5zaW9uKCkgeworCQlyZXR1cm4gTW9kaWZpZXJQYWNrYWdlLmVOQU1FOworCX0gLy8gZ2V0SWRlbnRpZmlhYmxlU2VyaWFsaXphdGlvbkZpbGVFeHRlbnNpb24KKworCS8qKgorCSAqIEBwYXJhbSB0YXJnZXQKKwkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgdGhhdCB0aGUgd2lsbAorCSAqICAgICAgICAgICAgbW9kaWZ5LgorCSAqLworCWZpbmFsIHB1YmxpYyB2b2lkIHNldFRhcmdldChmaW5hbCBFT2JqZWN0IHRhcmdldCkgeworCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIElIYW5kbGVyfSBmb3IgdGhlIGNvbW1hbmQgdGhhdCBjcmVhdGVzIGEgbmV3CisJICogTW9kaWZpZXJXaXphcmQuCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBOZXdNb2RpZmllcldpemFyZENvbW1hbmRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyCisJCQlpbXBsZW1lbnRzIElIYW5kbGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlciNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQpCisJCSAqLworCQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgZXhlY3V0aW9uRXZlbnQpCisJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisKKwkJCWZpbmFsIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gSGFuZGxlclV0aWwKKwkJCQkJLmdldEN1cnJlbnRTZWxlY3Rpb25DaGVja2VkKGV4ZWN1dGlvbkV2ZW50KTsKKworCQkJLy8gU3RydWN0dXJlZCBTZWxlY3Rpb24/CisJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJCS8vIFllcworCQkJCXRyeSB7CisJCQkJCWZpbmFsIE9iamVjdCBvYmogPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikudG9BcnJheSgpWzBdOworCQkJCQlFT2JqZWN0IHRhcmdldCA9IG51bGw7CisJCQkJCWlmKG9iaiBpbnN0YW5jZW9mIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSAKKwkJCQkJCXRhcmdldCA9IChFT2JqZWN0KSgoRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpb2JqKS5nZXRWYWx1ZSgpOworCQkJCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSAKKwkJCQkJCXRhcmdldCA9IChFT2JqZWN0KW9iajsKKwkJCQkJCisJCQkJCWlmKHRhcmdldCAhPSBudWxsKSB7CisJCQkJCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IEhhbmRsZXJVdGlsCisJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3dDaGVja2VkKGV4ZWN1dGlvbkV2ZW50KTsKKwkJCQkJCWZpbmFsIE5ld01vZGlmaWVyV2l6YXJkIHdpemFyZCA9IG5ldyBOZXdNb2RpZmllcldpemFyZCgpOworCQkJCQkJd2l6YXJkLnNldFRhcmdldCh0YXJnZXQpOworCQkJCQkJd2l6YXJkLmluaXQod2luZG93LmdldFdvcmtiZW5jaCgpLAorCQkJCQkJCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKKwkJCQkJCWZpbmFsIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgU1RFTVdpemFyZERpYWxvZyh3aW5kb3cKKwkJCQkJCQkJLmdldFNoZWxsKCksIHdpemFyZCk7CisJCQkJCQl3aXphcmREaWFsb2cub3BlbigpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gTm8KKwkJCQkJCUFjdGl2YXRvci5sb2dFcnJvcigKKwkJCQkJCQkJIkludGVybmFsIGVycm9yOiBhdHRlbXB0aW5nIHRvIGNyZWF0ZSBNb2RpZmllciBXaXphcmQgZm9yIFwiIgorCQkJCQkJCQkJCSsgb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIlwiIiwgbnVsbCk7CisJCQkJCX0gLy8gZWxzZQorCQkJCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpb29iZSkgeworCQkJCQkvLyBJZ25vcmUsIGl0IGp1c3QgbWVhbnMgdGhlcmUgd2Fzbid0IGFueXRoaW5nIHJlYWxseSBzZWxlY3RlZC4KKwkJCQl9CisJCQl9IC8vIGlmIFN0cnVjdHVyZWRTZWxlY3Rpb24KKworCQkJcmV0dXJuIG51bGw7CisJCX0gLy8gZXhlY3V0ZQorCX0gLy8gTmV3TW9kaWZpZXJXaXphcmRDb21tYW5kSGFuZGxlcgorfSAvLyBOZXdNb2RpZmllcldpemFyZApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL05ld05vbklkZW50aWZpYWJsZVdpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL05ld05vbklkZW50aWZpYWJsZVdpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNWQ3MmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvTmV3Tm9uSWRlbnRpZmlhYmxlV2l6YXJkLmphdmEKQEAgLTAsMCArMSwzMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHM7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsNCisNCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgTmV3Tm9uSWRlbnRpZmlhYmxlV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMNCisJCUlOZXdXaXphcmQgew0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgY29udGV4dCBzZW5zaXRpdmUgaGVscCBjb250ZXh0IGlkIGZvciB0aGUgd2l6YXJkDQorCSAqLw0KKwkNCisJcHJvdGVjdGVkIFN0cmluZyBoZWxwQ29udGV4dElkID0gIm9yZy5lY2xpcHNlLnN0ZW0uZG9jLm5ld2V4cGVyaW1lbnRfY29udGV4dGlkIjsNCisJDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscENvbnRleHRJZCgpIHsNCisJCXJldHVybiBoZWxwQ29udGV4dElkOw0KKwl9DQorDQorCXByb3RlY3RlZCB2b2lkIHNldEhlbHBDb250ZXh0SWQoU3RyaW5nIGhlbHBDb250ZXh0SWQpIHsNCisJCXRoaXMuaGVscENvbnRleHRJZCA9IGhlbHBDb250ZXh0SWQ7DQorCX0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL05ld1ByZWRpY2F0ZVdpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL05ld1ByZWRpY2F0ZVdpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYjUwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvTmV3UHJlZGljYXRlV2l6YXJkLmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8vIE5ld1ByZWRpY2F0ZVdpemFyZC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5JZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5wcmVkaWNhdGUuUHJlZGljYXRlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUucHJlZGljYXRlLlByZWRpY2F0ZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgTmV3SWRlbnRpZmlhYmxlV2l6YXJkfSBmb3IgdGhhdCBjcmVhdGVzIG5ldyBTVEVNCisgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGV9cworICovCitwdWJsaWMgY2xhc3MgTmV3UHJlZGljYXRlV2l6YXJkIGV4dGVuZHMgTmV3SWRlbnRpZmlhYmxlV2l6YXJkIHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNnZXRXaXphcmRUaXRsZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRXaXphcmRUaXRsZSgpIHsKKwkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiTlByZWRpY2F0ZVdpei53aXphcmRfdGl0bGUiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTmV3SWRlbnRpZmlhYmxlUGFnZSBjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlKCkgeworCQl0aGlzLnNldEhlbHBDb250ZXh0SWQoIm9yZy5lY2xpcHNlLnN0ZW0uZG9jLm5ld3ByZWRpY2F0ZV9jb250ZXh0aWQiKTsKKwkJcmV0dXJuIG5ldyBOZXdQcmVkaWNhdGVQYWdlKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2NyZWF0ZUR1YmxpbkNvcmVQYWdlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRHVibGluQ29yZVBhZ2UgY3JlYXRlRHVibGluQ29yZVBhZ2UoKSB7CisJCXJldHVybiBuZXcgRHVibGluQ29yZVBhZ2UoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEQ0F0dHJpYnV0ZXMoKSB7CisJCQkJc3VwZXIuaW5pdGlhbGl6ZURDQXR0cmlidXRlcygpOworCQkJCWZvcm1hdC5zZXRUZXh0KFByZWRpY2F0ZVBhY2thZ2UuZU5TX1VSSSk7CisJCQkJZm9ybWF0LnNldEVuYWJsZWQoZmFsc2UpOworCQkJCXR5cGUuc2V0VGV4dChTVEVNVVJJLlBSRURJQ0FURV9UWVBFX1VSSS50b1N0cmluZygpKTsKKwkJCQl0eXBlLnNldEVuYWJsZWQoZmFsc2UpOworCQkJfQorCQl9OworCX0gLy8gY3JlYXRlRHVibGluQ29yZVBhZ2UKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNjcmVhdGVJZGVudGlmaWFibGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJZGVudGlmaWFibGUgY3JlYXRlSWRlbnRpZmlhYmxlKCkgeworCQlmaW5hbCBJZGVudGlmaWFibGVQcmVkaWNhdGVFeHByZXNzaW9uIHJldFZhbHVlID0gUHJlZGljYXRlRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkuY3JlYXRlSWRlbnRpZmlhYmxlUHJlZGljYXRlRXhwcmVzc2lvbigpOworCQlyZXRWYWx1ZS5zZXREdWJsaW5Db3JlKG5ld0R1YmxpbkNvcmVQYWdlLmNyZWF0ZUR1YmxpbkNvcmUoKSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUlkZW50aWZpYWJsZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2dldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkgeworCQlyZXR1cm4gTmV3U1RFTVByb2plY3RXaXphcmQuUFJFRElDQVRFU19GT0xERVJfTkFNRTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lRXh0ZW5zaW9uKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25GaWxlTmFtZUV4dGVuc2lvbigpIHsKKwkJcmV0dXJuIFByZWRpY2F0ZVBhY2thZ2UuZU5BTUU7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBOZXdQcmVkaWNhdGVQYWdlIGV4dGVuZHMgTmV3SWRlbnRpZmlhYmxlUGFnZSB7CisKKwkJLyoqCisJCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKKwkJICovCisJCXByb3RlY3RlZCBOZXdQcmVkaWNhdGVQYWdlKCkgeworCQkJc3VwZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJOUHJlZGljYXRlV2l6LnBhZ2VfdGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCXNldFRpdGxlKE1lc3NhZ2VzLmdldFN0cmluZygiTlByZWRpY2F0ZVdpei5wYWdlX3RpdGxlIikpOyAvLyROT04tTkxTLTEkCisJCQlzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIk5QcmVkaWNhdGVXaXoucGFnZV9kZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAorCQl9IC8vIE5ld1ByZWRpY2F0ZVBhZ2UKKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVTcGVjaWZpY0NvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgIm9yZy5lY2xpcHNlLnN0ZW0uZG9jLm5ld3ByZWRpY2F0ZV9jb250ZXh0aWQiKTsKKwkJCXJldHVybiBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQl9IC8vIGNyZWF0ZVNwZWNpZmljQ29tcG9zaXRlCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQuTmV3SWRlbnRpZmlhYmxlUGFnZSNnZXREQ0Rlc2NyaXB0aW9uKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERDRGVzY3JpcHRpb24oKSB7CisJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTWVzc2FnZXMKKwkJCQkJLmdldFN0cmluZygiTlByZWRpY2F0ZVdpei5EQ19ERVNDUklQVElPTiIpLAorCQkJCQluZXcgT2JqZWN0W10geyBzZXJpYWxpemF0aW9uRmlsZU5hbWVGaWVsZC5nZXRUZXh0KCkgfSk7CisJCX0gLy8gZ2V0RENEZXNjcmlwdGlvbgorCisJfSAvLyBOZXdQcmVkaWNhdGVQYWdlCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIElIYW5kbGVyfSBmb3IgdGhlIGNvbW1hbmQgdGhhdCBjcmVhdGVzIGEKKwkgKiB7QGxpbmsgTmV3UHJlZGljYXRlV2l6YXJkfQorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTmV3UHJlZGljYXRlV2l6YXJkQ29tbWFuZEhhbmRsZXIgZXh0ZW5kcworCQkJQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudCkKKwkJICovCisJCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBleGVjdXRpb25FdmVudCkKKwkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gSGFuZGxlclV0aWwKKwkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvd0NoZWNrZWQoZXhlY3V0aW9uRXZlbnQpOworCQkJZmluYWwgTmV3UHJlZGljYXRlV2l6YXJkIHdpemFyZCA9IG5ldyBOZXdQcmVkaWNhdGVXaXphcmQoKTsKKwkJCXdpemFyZC5pbml0KHdpbmRvdy5nZXRXb3JrYmVuY2goKSwgU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7CisJCQlmaW5hbCBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFNURU1XaXphcmREaWFsb2cod2luZG93CisJCQkJCS5nZXRTaGVsbCgpLCB3aXphcmQpOworCQkJd2l6YXJkRGlhbG9nLm9wZW4oKTsKKwkJCXJldHVybiBudWxsOworCQl9IC8vIGV4ZWN1dGUKKwl9IC8vIE5ld1ByZWRpY2F0ZVdpemFyZENvbW1hbmRIYW5kbGVyCit9IC8vIE5ld1ByZWRpY2F0ZVdpemFyZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdTVEVNUHJvamVjdFdpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL05ld1NURU1Qcm9qZWN0V2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhkYTVlYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdTVEVNUHJvamVjdFdpemFyZC5qYXZhCkBAIC0wLDAgKzEsMzI1IEBACisvLyBQcm9qZWN0V2l6YXJkLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGFuIEVjbGlwc2Uge0BsaW5rIFdpemFyZH0gZm9yIGNyZWF0aW5nIG5ldyBTVEVNIHByb2plY3RzLgorICovCitwdWJsaWMgY2xhc3MgTmV3U1RFTVByb2plY3RXaXphcmQgZXh0ZW5kcyBOZXdOb25JZGVudGlmaWFibGVXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkLAorCQlJRXhlY3V0YWJsZUV4dGVuc2lvbiB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB7QGxpbmsgV2l6YXJkfSB0aGF0IGNyZWF0ZXMgYSBTVEVNIHByb2plY3QuCisJICogKiB7QHZhbHVlfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1NURU1fUFJPSkVDVF9XSVpBUkQgPSBDb25zdGFudHMuSURfUk9PVAorCQkJKyAiLnVpLndpemFyZHMubmV3c3RlbXByb2plY3QiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgbmFtZSBvZiB0aGUgZm9sZGVyIHVzZWQgdG8gc2VyaWFsaXplIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGh9IGluIGEgcHJvamVjdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSFNfRk9MREVSX05BTUUgPSAiZ3JhcGhzIjsKKworCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoZSBmb2xkZXIgdXNlZCB0byBzZXJpYWxpemUgUmVjb3JkZWQgU2ltdWxhdGlvbnMgaW4gYSBwcm9qZWN0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ09SREVEX1NJTVVMQVRJT05TX0ZPTERFUl9OQU1FID0gIlJlY29yZGVkIFNpbXVsYXRpb25zIjsKKworCQorCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoZSBmb2xkZXIgdXNlZCB0byBzZXJpYWxpemUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbH1zIGluIGEgcHJvamVjdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTFNfRk9MREVSX05BTUUgPSAibW9kZWxzIjsKKworCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoZSBmb2xkZXIgdXNlZCB0byBzZXJpYWxpemUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb31zIGluIGEgcHJvamVjdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0VBTkFSSU9TX0ZPTERFUl9OQU1FID0gInNjZW5hcmlvcyI7CisKKwkvKioKKwkgKiBUaGUgbmFtZSBvZiB0aGUgZm9sZGVyIHVzZWQgdG8gc2VyaWFsaXplIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yfXMgaW4gYSBwcm9qZWN0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ09SQVRPUlNfRk9MREVSX05BTUUgPSAiZGVjb3JhdG9ycyI7CisKKwkvKioKKwkgKiBUaGUgbmFtZSBvZiB0aGUgZm9sZGVyIHVzZWQgdG8gc2VyaWFsaXplIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlcn1zIGluIGEgcHJvamVjdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVFVRU5DRVJTX0ZPTERFUl9OQU1FID0gInNlcXVlbmNlcnMiOworCisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIGZvbGRlciB1c2VkIHRvIHNlcmlhbGl6ZSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmV4cGVyaW1lbnQuRXhwZXJpbWVudH1zIGluIGEKKwkgKiBwcm9qZWN0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVSSU1FTlRTX0ZPTERFUl9OQU1FID0gImV4cGVyaW1lbnRzIjsKKworCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoZSBmb2xkZXIgdXNlZCB0byBzZXJpYWxpemUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RpZmllci5Nb2RpZmllcn1zIGluIGEgcHJvamVjdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRklFUlNfRk9MREVSX05BTUUgPSAibW9kaWZpZXJzIjsKKworCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoZSBmb2xkZXIgdXNlZCB0byBzZXJpYWxpemUge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJ9cyBpbiBhIHByb2plY3QuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJR0dFUlNfRk9MREVSX05BTUUgPSAidHJpZ2dlcnMiOworCisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIGZvbGRlciB1c2VkIHRvIHNlcmlhbGl6ZSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnByZWRpY2F0ZS5QcmVkaWNhdGV9cyBpbiBhIHByb2plY3QuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRElDQVRFU19GT0xERVJfTkFNRSA9ICJwcmVkaWNhdGVzIjsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIFdpemFyZCBwYWdlIHByZXNlbnRlZCB0byB0aGUgdXNlciB0byBnZXQgdGhlIGluZm9ybWF0aW9uCisJICogbmVjZXNzYXJ5IHRvIGNyZWF0ZSB0aGUgbmV3IHByb2plY3QuCisJICovCisJV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZSBuZXdQcm9qZWN0UGFnZSA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgbmFtZXMgb2YgdGhlIGZvbGRlcnMgaW4gZWFjaCBTVEVNIHByb2plY3QgYnkgZGVmYXVsdC4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGRlZmF1bHRGb2xkZXJzID0geyBHUkFQSFNfRk9MREVSX05BTUUsCisJCQlNT0RFTFNfRk9MREVSX05BTUUsIFNDRUFOQVJJT1NfRk9MREVSX05BTUUsIERFQ09SQVRPUlNfRk9MREVSX05BTUUsCisJCQlTRVFVRU5DRVJTX0ZPTERFUl9OQU1FLCBFWFBFUklNRU5UU19GT0xERVJfTkFNRSwKKwkJCU1PRElGSUVSU19GT0xERVJfTkFNRSwgVFJJR0dFUlNfRk9MREVSX05BTUUsIFBSRURJQ0FURVNfRk9MREVSX05BTUUsIFJFQ09SREVEX1NJTVVMQVRJT05TX0ZPTERFUl9OQU1FfTsKKworCS8qKgorCSAqIEBpbmhlcml0RG9jCisJICovCisJcHVibGljIHZvaWQgaW5pdChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgSVdvcmtiZW5jaCB3b3JrYmVuY2gsCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOworCQlzZXRIZWxwQXZhaWxhYmxlKHRydWUpOyAvL0FkZHMgSEVMUCBCdXR0b24gdG8gTmV3IFNURU0gUHJvamVjdCBXaXphcmQgcGFnZQorCQl0aGlzLnNldEhlbHBDb250ZXh0SWQoIm9yZy5lY2xpcHNlLnN0ZW0uZG9jLm5ld3N0ZW1wcm9qZWN0X2NvbnRleHRpZCIpOyAvL0hFUkUKKwl9IC8vIGluaXQKKworCS8qKgorCSAqIEBpbmhlcml0RG9jCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7CisJCXN1cGVyLmFkZFBhZ2VzKCk7CisJCXNldFdpbmRvd1RpdGxlKE1lc3NhZ2VzLmdldFN0cmluZygiTlNURU1Qcm9XaXoudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJbmV3UHJvamVjdFBhZ2UgPSBuZXcgU1RFTVdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2UoTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJOU1RFTVByb1dpei50aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQluZXdQcm9qZWN0UGFnZS5zZXRUaXRsZShNZXNzYWdlcy5nZXRTdHJpbmcoIk5TVEVNUHJvV2l6LnBhZ2VfdGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJbmV3UHJvamVjdFBhZ2Uuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMKKwkJCQkuZ2V0U3RyaW5nKCJOU1RFTVByb1dpei5wYWdlX2Rlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCisJCS8vIFRPRE8gc2V0IGljb24gZm9yIG5ldyBTVEVNIHByb2plY3Qgd2l6YXJkCisJCS8vIG5ld1Byb2plY3RQYWdlLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZSk7CisJCWFkZFBhZ2UobmV3UHJvamVjdFBhZ2UpOworCX0gLy8gYWRkUGFnZXMKKworCS8qKgorCSAqIEBpbmhlcml0RG9jCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKKwkJZmluYWwgYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CisJCXRyeSB7CisJCQlmaW5hbCBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJCWNyZWF0ZVByb2plY3QobW9uaXRvciA9PSBudWxsID8gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKQorCQkJCQkJCTogbW9uaXRvcik7CisJCQkJfSAvLyBleGVjdXRlCisJCQl9OyAvLyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24KKworCQkJLy8gVGhlIGNvbnRhaW5lciBpcyBhIElSdW5uYWJsZUNvbnRleHQsIHdlIHVzZSBpdCB0byBydW4gdGhlCisJCQkvLyBwb3RlbnRpYWxseSBsb25nIG9wZXJhdGlvbiBvZiBjcmVhdGluZyB0aGUgcHJvamVjdC4KKwkJCS8vIFRoZSBmaXJzdCBhcmd1bWVudCBvZiBmYWxzZSBpbmRpY2F0ZXMgbm90IHRvICJmb3JrIiwgdGhlIHNlY29uZAorCQkJLy8gb2YgInRydWUiIGluZGljYXRlcyB0aGF0IHRoZSBvcGVyYXRpb24gaXMgY2FuY2VsYWJsZS4KKwkJCWdldENvbnRhaW5lcigpLnJ1bihmYWxzZSwgdHJ1ZSwgb3ApOworCQl9IC8vIHRyeQorCQljYXRjaCAoZmluYWwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoSURfU1RFTV9QUk9KRUNUX1dJWkFSRCwgZSk7CisJCX0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCS8vIFRoaXMgZ2V0cyB0aHJvd24gaWYgdGhlIG9wZXJhdGlvbiBpcyBjYW5jZWxlZAorCQkJQWN0aXZhdG9yLmxvZ0luZm9ybWF0aW9uKElEX1NURU1fUFJPSkVDVF9XSVpBUkQsIGUpOworCQl9CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIHBlcmZvcm1GaW5pc2gKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgcHJvamVjdC4KKwkgKiAKKwkgKiBAcGFyYW0gbW9uaXRvcgorCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yIHRvIHJlcG9ydCB0aGUgcHJvZ3Jlc3MgaW4gY3JlYXRpbmcgdGhlCisJICogICAgICAgICAgICBwcm9qZWN0CisJICovCisJdm9pZCBjcmVhdGVQcm9qZWN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkvLyBXYXMgYSBwcm9ncmVzcyBtb25pdG9yIHNwZWNpZmllZD8KKwkJaWYgKG1vbml0b3IgPT0gbnVsbCkgeworCQkJLy8gTm8KKwkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworCQl9CisKKwkJbW9uaXRvcgorCQkJCS5iZWdpblRhc2soCisJCQkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIk5TVEVNUHJvV2l6LnRpdGxlIiksIDEgKyBkZWZhdWx0Rm9sZGVycy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCisKKwkJdHJ5IHsKKwkJCWZpbmFsIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkKKwkJCQkJLmdldFJvb3QoKTsKKworCQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLmdldFN0cmluZygiTlNURU1Qcm9XaXouY3JlYXRpbmdfcHJvamVjdCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KG5ld1Byb2plY3RQYWdlCisJCQkJCS5nZXRQcm9qZWN0TmFtZSgpKTsKKwkJCWZpbmFsIElQcm9qZWN0RGVzY3JpcHRpb24gcHJvamVjdERlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luCisJCQkJCS5nZXRXb3Jrc3BhY2UoKS5uZXdQcm9qZWN0RGVzY3JpcHRpb24ocHJvamVjdC5nZXROYW1lKCkpOworCisJCQkvLyBEaWQgdGhlIHVzZXIgY2hhbmdlIHRoZSBsb2NhdGlvbiBvZiB0aGUgcHJvamVjdD8KKwkJCWlmICghUGxhdGZvcm0uZ2V0TG9jYXRpb24oKQorCQkJCQkuZXF1YWxzKG5ld1Byb2plY3RQYWdlLmdldExvY2F0aW9uUGF0aCgpKSkgeworCQkJCS8vIFllcworCQkJCS8vIC4uLm5ldyBsb2NhdGlvbiB0aGVuCisJCQkJcHJvamVjdERlc2NyaXB0aW9uCisJCQkJCQkuc2V0TG9jYXRpb24obmV3UHJvamVjdFBhZ2UuZ2V0TG9jYXRpb25QYXRoKCkpOworCQkJfSAvLyBpZiBuZXcgbG9jYXRpb25zCisKKwkJCS8vIFRoaXMgcHJvamVjdCBoYXMgYSAiU1RFTSIgbmF0dXJlCisJCQlwcm9qZWN0RGVzY3JpcHRpb24KKwkJCQkJLnNldE5hdHVyZUlkcyhuZXcgU3RyaW5nW10geyBDb25zdGFudHMuSURfU1RFTV9QUk9KRUNUX05BVFVSRSB9KTsKKworCQkJLy8gQ3JlYXRlIHRoZSBwcm9qZWN0CisJCQlwcm9qZWN0LmNyZWF0ZShwcm9qZWN0RGVzY3JpcHRpb24sIG1vbml0b3IpOworCQkJbW9uaXRvci53b3JrZWQoMSk7CisKKwkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcworCQkJCQkuZ2V0U3RyaW5nKCJOU1RFTVByb1dpei5jcmVhdGluZ19kaXJlY3RvcmllcyIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQlwcm9qZWN0Lm9wZW4obW9uaXRvcik7CisKKwkJCWZpbmFsIElQYXRoIHByb2plY3RQYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOworCisJCQkvLyBDcmVhdGUgdGhlIGRlZmF1bHQgZm9sZGVycworCQkJZm9yIChmaW5hbCBTdHJpbmcgZm9sZGVyTmFtZSA6IGRlZmF1bHRGb2xkZXJzKSB7CisJCQkJZmluYWwgSVBhdGggZnVsbEZvbGRlclBhdGggPSBwcm9qZWN0UGF0aC5hcHBlbmQoZm9sZGVyTmFtZSk7CisKKwkJCQlmaW5hbCBJRm9sZGVyIGZvbGRlciA9IHJvb3QuZ2V0Rm9sZGVyKGZ1bGxGb2xkZXJQYXRoKTsKKwkJCQljcmVhdGVGb2xkZXIoZm9sZGVyLCBtb25pdG9yKTsKKworCQkJCW1vbml0b3Iud29ya2VkKDEpOworCQkJfSAvLyBmb3IgZWFjaCBkZWZhdWx0IGZvbGRlciBuYW1lCisJCQkvLyBtb25pdG9yLnN1YlRhc2soInN0ZW0uY3JlYXRpbmdfZmlsZXMiKTsKKworCQkJLy8gUG9wdWxhdGUgdGhlIG5ldyBwcm9qZWN0IHdpdGggZGVmYXVsdCBmaWxlcy4KKwkJCS8vIGZpbmFsIElQYXRoCisJCX0gLy8gdHJ5CisJCWNhdGNoIChmaW5hbCBDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoCisJCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiTlNURU1Qcm9XaXouQ3JlYXRlX1Byb2JsZW0iKSwgY2UpOyAvLyROT04tTkxTLTEkCisJCX0gZmluYWxseSB7CisJCQltb25pdG9yLmRvbmUoKTsKKwkJfQorCX0gLy8gY3JlYXRlUHJvamVjdAorCisJLyoqCisJICogQ3JlYXRlIGEgZm9sZGVyIGluIHRoZSBwcm9qZWN0LiBBbGwgZm9sZGVycyBhbG9uZyB0aGUgcGF0aCB3aWxsIGJlCisJICogY3JlYXRlZCBhcyBuZWNlc3NhcnkuCisJICogCisJICogQHBhcmFtIGZvbGRlcgorCSAqICAgICAgICAgICAgdGhlIGZvbGRlciB0byBjcmVhdGUKKwkgKiBAcGFyYW0gbW9uaXRvcgorCSAqICAgICAgICAgICAgdGhlIG1vbml0b3Igd2F0Y2hpbmcgb3VyIHByb2dyZXNzCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvbGRlcihmaW5hbCBJRm9sZGVyIGZvbGRlciwKKwkJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyBEb2VzIHRoZSBmb2xkZXIgYWxyZWFkeSBleGlzdD8KKwkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKKwkJCS8vIE5vCisJCQkvLyBPaywgZ2V0IHRoZSB3b3VsZCBiZSBwYXJlbnQgb2YgdGhpcyBmb2xkZXIuCisJCQlmaW5hbCBJQ29udGFpbmVyIHBhcmVudCA9IGZvbGRlci5nZXRQYXJlbnQoKTsKKwkJCS8vIElzIHRoZSBwYXJlbnQgYWxzbyBhIGZvbGRlcj8KKwkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJRm9sZGVyKSB7CisJCQkJLy8gWWVzCisJCQkJLy8gRG9lcyBpdCBleGlzdD8KKwkJCQlpZiAoISgoSUZvbGRlcikgcGFyZW50KS5leGlzdHMoKSkgeworCQkJCQkvLyBObworCQkJCQkvLyBDcmVhdGUgaXQgdGhlbgorCQkJCQljcmVhdGVGb2xkZXIoKElGb2xkZXIpIHBhcmVudCwgbW9uaXRvcik7CisJCQkJfSAvLyBpZiBwYXJlbnQgZG9lc24ndCBleGlzdAorCQkJfSAvLyBpZiBwYXJlbnQgYSBmb2xkZXIKKworCQkJLy8gTm93IGNyZWF0ZSB0aGlzIGZvbGRlcgorCQkJZm9sZGVyLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbW9uaXRvcik7CisJCX0gLy8gaWYgdGhlIGZvbGRlciBkb2Vzbid0IGFscmVhZHkgZXhpc3QKKworCX0gLy8gY3JlYXRlRm9sZGVyCisKKwkvKioKKwkgKiBAaW5oZXJpdERvYworCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXB1YmxpYyB2b2lkIHNldEluaXRpYWxpemF0aW9uRGF0YShmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnLAorCQkJZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgT2JqZWN0IGRhdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJLy8gY29uZmlnRWxlbWVudCA9IGNvbmZpZzsKKwl9IC8vIHNldEluaXRpYWxpemF0aW9uRGF0YQorCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBJSGFuZGxlcn0gZm9yIHRoZSBjb21tYW5kIHRoYXQgY3JlYXRlcyBhCisJICoge0BsaW5rIE5ld1NURU1Qcm9qZWN0V2l6YXJkfQorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTmV3U1RFTVByb2plY3RXaXphcmRDb21tYW5kSGFuZGxlciBleHRlbmRzCisJCQlBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXIjZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50KQorCQkgKi8KKwkJcHVibGljIE9iamVjdCBleGVjdXRlKGZpbmFsIEV4ZWN1dGlvbkV2ZW50IGV4ZWN1dGlvbkV2ZW50KQorCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBIYW5kbGVyVXRpbAorCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93Q2hlY2tlZChleGVjdXRpb25FdmVudCk7CisJCQlmaW5hbCBOZXdTVEVNUHJvamVjdFdpemFyZCB3aXphcmQgPSBuZXcgTmV3U1RFTVByb2plY3RXaXphcmQoKTsKKwkJCXdpemFyZC5pbml0KHdpbmRvdy5nZXRXb3JrYmVuY2goKSwgU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7CisJCQlmaW5hbCBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFNURU1XaXphcmREaWFsb2cod2luZG93CisJCQkJCS5nZXRTaGVsbCgpLCB3aXphcmQpOyAKKwkJCXdpemFyZERpYWxvZy5vcGVuKCk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSAvLyBleGVjdXRlCisJfSAvLyBOZXdTVEVNUHJvamVjdFdpemFyZFdpemFyZENvbW1hbmRIYW5kbGVyCisKK30gLy8gUHJvamVjdFdpemFyZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdTY2VuYXJpb1dpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL05ld1NjZW5hcmlvV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM5NzFmYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdTY2VuYXJpb1dpemFyZC5qYXZhCkBAIC0wLDAgKzEsMzAxIEBACisvLyBOZXdTY2VuYXJpb1dpemFyZC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLlNURU1VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zY2VuYXJpby5TY2VuYXJpb0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlclByb3BlcnR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIE5ld0lkZW50aWZpYWJsZVdpemFyZH0gZm9yIHRoYXQgY3JlYXRlcyBuZXcgU1RFTQorICoge0BsaW5rIFNjZW5hcmlvfXMuCisgKi8KK3B1YmxpYyBjbGFzcyBOZXdTY2VuYXJpb1dpemFyZCBleHRlbmRzIE5ld0lkZW50aWZpYWJsZVdpemFyZCB7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjZ2V0V2l6YXJkVGl0bGUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0V2l6YXJkVGl0bGUoKSB7CisJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIk5TY2VuYXJpb1dpei53aXphcmRfdGl0bGUiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTmV3SWRlbnRpZmlhYmxlUGFnZSBjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlKCkgeworCQl0aGlzLnNldEhlbHBDb250ZXh0SWQoIm9yZy5lY2xpcHNlLnN0ZW0uZG9jLm5ld3NjZW5hcmlvX2NvbnRleHRpZCIpOworCQlyZXR1cm4gbmV3IE5ld1NjZW5hcmlvUGFnZSgpOworCX0gLy8gY3JlYXRlTmV3SWRlbnRpZmlhYmxlUGFnZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2NyZWF0ZUR1YmxpbkNvcmVQYWdlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRHVibGluQ29yZVBhZ2UgY3JlYXRlRHVibGluQ29yZVBhZ2UoKSB7CisJCXJldHVybiBuZXcgRHVibGluQ29yZVBhZ2UoKSB7CisJCQkvKioKKwkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZC5EdWJsaW5Db3JlUGFnZSNpbml0aWFsaXplRENGaWVsZHMoKQorCQkJICovCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEQ0F0dHJpYnV0ZXMoKSB7CisJCQkJc3VwZXIuaW5pdGlhbGl6ZURDQXR0cmlidXRlcygpOworCQkJCWZvcm1hdC5zZXRUZXh0KFNjZW5hcmlvUGFja2FnZS5lTlNfVVJJKTsKKwkJCQlmb3JtYXQuc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJdHlwZS5zZXRUZXh0KFNURU1VUkkuU0NFTkFSSU9fVFlQRV9VUkkudG9TdHJpbmcoKSk7CisJCQkJdHlwZS5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCX0KKwkJfTsKKwl9IC8vIGNyZWF0ZUR1YmxpbkNvcmVQYWdlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjY3JlYXRlSWRlbnRpZmlhYmxlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSWRlbnRpZmlhYmxlIGNyZWF0ZUlkZW50aWZpYWJsZSgpIHsKKwkJZmluYWwgU2NlbmFyaW8gcmV0VmFsdWUgPSBTY2VuYXJpb0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNjZW5hcmlvKCk7CisJCXJldFZhbHVlLnNldER1YmxpbkNvcmUobmV3RHVibGluQ29yZVBhZ2UuY3JlYXRlRHVibGluQ29yZSgpKTsKKwkJU29sdmVyUHJvcGVydHlDb21wb3NpdGUgc3BjID0gKChOZXdTY2VuYXJpb1BhZ2UpbmV3SWRlbnRpZmlhYmxlUGFnZSkuc29sdmVyUEM7CisJCVNvbHZlciBzID0gc3BjLmNyZWF0ZVNvbHZlcigpOworCQlyZXRWYWx1ZS5zZXRTb2x2ZXIocyk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZVNwZWNpZmljSWRlbnRpZmlhYmxlCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjZ2V0U2VyaWFsaXphdGlvbkZvbGRlck5hbWUoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VyaWFsaXphdGlvbkZvbGRlck5hbWUoKSB7CisJCXJldHVybiBOZXdTVEVNUHJvamVjdFdpemFyZC5TQ0VBTkFSSU9TX0ZPTERFUl9OQU1FOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNnZXRTZXJpYWxpemF0aW9uRmlsZU5hbWVFeHRlbnNpb24oKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lRXh0ZW5zaW9uKCkgeworCQlyZXR1cm4gU2NlbmFyaW9QYWNrYWdlLmVOQU1FOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTmV3U2NlbmFyaW9QYWdlIGV4dGVuZHMgTmV3SWRlbnRpZmlhYmxlUGFnZSB7CisKKwkJcHJpdmF0ZSBTb2x2ZXIgW10gc29sdmVycyA9IG51bGw7CisJCQorCQlTb2x2ZXJQcm9wZXJ0eUNvbXBvc2l0ZSBzb2x2ZXJQQzsKKwkJCisJCXByaXZhdGUgQ29tYm8gY29tYm87CisJCS8qKgorCQkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisJCSAqLworCQlwcm90ZWN0ZWQgTmV3U2NlbmFyaW9QYWdlKCkgeworCQkJc3VwZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJOU2NlbmFyaW9XaXoucGFnZV90aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJc2V0VGl0bGUoTWVzc2FnZXMuZ2V0U3RyaW5nKCJOU2NlbmFyaW9XaXoucGFnZV90aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJOU2NlbmFyaW9XaXoucGFnZV9kZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAorCQl9IC8vIE5ld1NjZW5hcmlvUGFnZQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQuTmV3SWRlbnRpZmlhYmxlUGFnZSNjcmVhdGVTcGVjaWZpY0NvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVTcGVjaWZpY0NvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJCVNvbHZlciBbXSBzb2x2ZXJzID0gZ2V0U29sdmVycygpOworCQkJCisJCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKworCQkJCisJCQlmaW5hbCBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOworCQkJY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKKworCQkJZmluYWwgTGFiZWwgc29sdmVyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCQlmaW5hbCBHcmlkRGF0YSBnZF9zb2x2ZXJMYWJlbCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOworCQkJZ2Rfc29sdmVyTGFiZWwud2lkdGhIaW50ID0gMTAwOworCQkJc29sdmVyTGFiZWwuc2V0TGF5b3V0RGF0YShnZF9zb2x2ZXJMYWJlbCk7CisJCQlzb2x2ZXJMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiTlNjZW5hcmlvV2l6LnNvbHZlciIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQljb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOworCQkJY29tYm8uc2V0VGV4dExpbWl0KDMwKTsKKwkJCWZpbmFsIEdyaWREYXRhIGdkX2NvbWJvID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLAorCQkJCQlmYWxzZSk7CisJCQlnZF9jb21iby53aWR0aEhpbnQgPSAzMDM7CisJCQljb21iby5zZXRMYXlvdXREYXRhKGdkX2NvbWJvKTsKKworCQkJY29tYm8uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJOU2NlbmFyaW9XaXouc29sdmVyIikpOyAvLyROT04tTkxTLTEkCisJCQkvLyBJbml0aWFsaXplIHRoZSBsaXN0IG9mIGRpc2Vhc2UgbW9kZWxzIGF2YWlsYWJsZQorCQkJY29tYm8uc2V0SXRlbXMoZ2V0U29sdmVyTmFtZXMoc29sdmVycykpOworCQkJLy8gU2V0IHRoZSBvbmUgZnJvbSBwcmVmZXJlbmNlcworCQkJCisJCQlmaW5hbCBOZXdTY2VuYXJpb1BhZ2Ugc2VsZiA9IHRoaXM7CisJCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCXNlbGYuZGlzcGxheVNvbHZlcihnZXRTb2x2ZXJzKClbY29tYm8KKwkJCQkJCQkJCS5nZXRTZWxlY3Rpb25JbmRleCgpXSk7CisJCQkJCS8vIGxheW91dCgpOworCQkJCX0gLy8gd2lkZ2V0U2VsZWN0ZWQKKwkJCX0pOworCQkJCisJCQljb21iby5zZWxlY3QoMCk7CisJCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihwcm9qZWN0VmFsaWRhdG9yKTsKKworCQkJc29sdmVyUEMgPSBuZXcgU29sdmVyUHJvcGVydHlDb21wb3NpdGUoY29tcG9zaXRlLCAxLCBzb2x2ZXJzLCBwcm9qZWN0VmFsaWRhdG9yKTsKKwkKKwkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCAib3JnLmVjbGlwc2Uuc3RlbS5kb2MubmV3c2NlbmFyaW9fY29udGV4dGlkIik7CisJCQkKKwkJCXJldHVybiBjb21wb3NpdGU7CisJCX0gLy8gY3JlYXRlU3BlY2lmaWNDb21wb3NpdGUKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZC5OZXdJZGVudGlmaWFibGVQYWdlI2dldERDRGVzY3JpcHRpb24oKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RENEZXNjcmlwdGlvbigpIHsKKwkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChNZXNzYWdlcworCQkJCQkuZ2V0U3RyaW5nKCJOU2NlbmFyaW9XaXouRENfREVTQ1JJUFRJT04iKSwKKwkJCQkJbmV3IE9iamVjdFtdIHsgc2VyaWFsaXphdGlvbkZpbGVOYW1lRmllbGQuZ2V0VGV4dCgpIH0pOworCQl9IC8vIGdldERDRGVzY3JpcHRpb24KKworCQkvKioKKwkJICogCisJCSAqLworCQkKKwkJcHJpdmF0ZSBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc29sdmVyLlNvbHZlciBbXSBnZXRTb2x2ZXJzKCkgeworCQkJZmluYWwgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJCVN0cmluZyBwcmVmU29sdmVyID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKG9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50cy5ERUZBVUxUX1NPTFZFUik7CisJCQkKKwkJCWlmIChzb2x2ZXJzID09IG51bGwpIHsKKwkJCQlmaW5hbCBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOworCQkJCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudFtdIHNvbHZlckNvbmZpZ0VsZW1lbnRzID0gcmVnaXN0cnkKKwkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3Iob3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50cy5JRF9TT0xWRVJfRVhURU5TSU9OX1BPSU5UKTsKKworCQkJCWZpbmFsIExpc3Q8U29sdmVyPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxTb2x2ZXI+KCk7CisKKwkJCQlzb2x2ZXJzID0gbmV3IFNvbHZlcltzb2x2ZXJDb25maWdFbGVtZW50cy5sZW5ndGhdOworCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb2x2ZXJDb25maWdFbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCQlmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IHNvbHZlckNvbmZpZ0VsZW1lbnRzW2ldOworCQkJCQkvLyBEb2VzIHRoZSBlbGVtZW50IHNwZWNpZnkgdGhlIGNsYXNzIG9mIHRoZSBkaXNlYXNlIG1vZGVsPworCQkJCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKENvbnN0YW50cy5TT0xWRVJfRUxFTUVOVCkpIHsKKwkJCQkJCS8vIFllcworCQkJCQkJdHJ5IHsKKwkJCQkJCQlTb2x2ZXIgcyA9IChTb2x2ZXIpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKKwkJCQkJCQkJCisJCQkJCQkJaWYocy5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMocHJlZlNvbHZlcikmJiBpID4gMCkgeworCQkJCQkJCQkJLy8gU2V0IHRoZSBwcmVmZXJlbmNlIG9uZSBvbiB0b3AKKwkJCQkJCQkJCVNvbHZlciB0bXAgPSB0ZW1wLmdldCgwKTsKKwkJCQkJCQkJCXRlbXAuc2V0KDAsIHMpOworCQkJCQkJCQkJdGVtcC5hZGQodG1wKTsKKwkJCQkJCQl9IGVsc2UKKwkJCQkJCQl0ZW1wLmFkZChzKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfSBjYXRjaCAoZmluYWwgQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKAorCQkJCQkJCQkJIkNhbid0IGNyZWF0ZSBzb2x2ZXIiLCBlKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfQorCQkJCQl9IC8vIGlmCisJCQkJfSAvLyBmb3IgZWFjaCBjb25maWd1cmF0aW9uIGVsZW1lbnQKKworCQkJCXNvbHZlcnMgPSB0ZW1wLnRvQXJyYXkobmV3IFNvbHZlcltdIHt9KTsKKwkJCX0gLy8gaWYgZGlzZXNhZU1vZGVscyBub3QgY3JlYXRlZAorCisJCQlyZXR1cm4gc29sdmVyczsKKwkJfQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgc29sdmVycworCQkgKi8KKwkJcHJpdmF0ZSBTdHJpbmdbXSBnZXRTb2x2ZXJOYW1lcyhmaW5hbCBTb2x2ZXJbXSBzb2x2ZXJzKSB7CisJCQlmaW5hbCBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IG9yZy5lY2xpcHNlLnN0ZW0udWkuQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCQkJU3RyaW5nIHByZWZTb2x2ZXIgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcob3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzLkRFRkFVTFRfU09MVkVSKTsKKwkJCQorCQkJZmluYWwgU3RyaW5nW10gcmV0VmFsdWUgPSBuZXcgU3RyaW5nW3NvbHZlcnMubGVuZ3RoXTsKKwkJCVN0cmluZyBmaXJzdE9uZSA9IG51bGw7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNvbHZlcnMubGVuZ3RoOyBpKyspIHsKKwkJCQlTdHJpbmcgbmFtZSA9IHNvbHZlcnNbaV0uZ2V0RHVibGluQ29yZSgpLmdldFRpdGxlKCk7CisJCQkJLy8gV2FzIGEgbmFtZSBzcGVjaWZpZWQ/CisJCQkJaWYgKChuYW1lID09IG51bGwpIHx8IG5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCS8vIE5vCisJCQkJCW5hbWUgPSBzb2x2ZXJzW2ldLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOworCQkJCX0gLy8gaWYKKwkJCQlpZihzb2x2ZXJzW2ldLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhwcmVmU29sdmVyKSYmIGkgPiAwKSB7CisJCQkJCS8vIFNldCB0aGUgcHJlZmVyZW5jZSBvbmUgb24gdG9wCisJCQkJCVN0cmluZyB0bXAgPSByZXRWYWx1ZVswXTsKKwkJCQkJcmV0VmFsdWVbMF0gPSBuYW1lOworCQkJCQlyZXRWYWx1ZVtpXSA9IHRtcDsKKwkJCQl9CisJCQkJZWxzZSByZXRWYWx1ZVtpXSA9IG5hbWU7CisJCQl9IC8vIGZvciBpCisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gZ2V0RGlzZWFzZU1vZGVsTmFtZXMKKwkJCisJCXZvaWQgZGlzcGxheVNvbHZlcihmaW5hbCBTb2x2ZXIgc29sdmVyKSB7CisJCQlzb2x2ZXJQQy5kaXNwbGF5U29sdmVyKHNvbHZlcik7CisJCX0gLy8gZGlzcGxheVNvbHZlcgorCX0gLy8gTmV3U2NlbmFyaW9QYWdlCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIElIYW5kbGVyfSBmb3IgdGhlIGNvbW1hbmQgdGhhdCBjcmVhdGVzIGEKKwkgKiB7QGxpbmsgTmV3U2NlbmFyaW9XaXphcmR9CisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBOZXdTY2VuYXJpb1dpemFyZENvbW1hbmRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyCisJCQlpbXBsZW1lbnRzIElIYW5kbGVyIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlciNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQpCisJCSAqLworCQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgZXhlY3V0aW9uRXZlbnQpCisJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisJCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IEhhbmRsZXJVdGlsCisJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3dDaGVja2VkKGV4ZWN1dGlvbkV2ZW50KTsKKwkJCWZpbmFsIE5ld1NjZW5hcmlvV2l6YXJkIHdpemFyZCA9IG5ldyBOZXdTY2VuYXJpb1dpemFyZCgpOworCQkJd2l6YXJkLmluaXQod2luZG93LmdldFdvcmtiZW5jaCgpLCBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKKwkJCWZpbmFsIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgU1RFTVdpemFyZERpYWxvZyh3aW5kb3cKKwkJCQkJLmdldFNoZWxsKCksIHdpemFyZCk7CisJCQl3aXphcmREaWFsb2cub3BlbigpOworCQkJcmV0dXJuIG51bGw7CisJCX0gLy8gZXhlY3V0ZQorCX0gLy8gTmV3U2NlbmFyaW9XaXphcmRDb21tYW5kSGFuZGxlcgorfSAvLyBOZXdTY2VuYXJpb1dpemFyZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdTZXF1ZW5jZXJXaXphcmQuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdTZXF1ZW5jZXJXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmU5YmZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL05ld1NlcXVlbmNlcldpemFyZC5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8vIE5ld1NlcXVlbmNlcldpemFyZC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlclBhY2thZ2U7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBOZXdJZGVudGlmaWFibGVXaXphcmR9IGZvciB0aGF0IGNyZWF0ZXMgbmV3IFNURU0KKyAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlcn1zCisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBOZXdTZXF1ZW5jZXJXaXphcmQgZXh0ZW5kcyBOZXdJZGVudGlmaWFibGVXaXphcmQgeworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2NyZWF0ZUR1YmxpbkNvcmVQYWdlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRHVibGluQ29yZVBhZ2UgY3JlYXRlRHVibGluQ29yZVBhZ2UoKSB7CisJCXJldHVybiBuZXcgRHVibGluQ29yZVBhZ2UoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEQ0F0dHJpYnV0ZXMoKSB7CisJCQkJc3VwZXIuaW5pdGlhbGl6ZURDQXR0cmlidXRlcygpOworCQkJCWZvcm1hdC5zZXRUZXh0KFNlcXVlbmNlclBhY2thZ2UuZU5TX1VSSSk7CisJCQkJZm9ybWF0LnNldEVuYWJsZWQoZmFsc2UpOworCQkJCXR5cGUuc2V0VGV4dChTVEVNVVJJLlNFUVVFTkNFUl9UWVBFX1VSSS50b1N0cmluZygpKTsKKwkJCQl0eXBlLnNldEVuYWJsZWQoZmFsc2UpOworCQkJfQorCQl9OworCX0gLy8gY3JlYXRlRHVibGluQ29yZVBhZ2UKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNnZXRTZXJpYWxpemF0aW9uRm9sZGVyTmFtZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJpYWxpemF0aW9uRm9sZGVyTmFtZSgpIHsKKwkJcmV0dXJuIE5ld1NURU1Qcm9qZWN0V2l6YXJkLlNFUVVFTkNFUlNfRk9MREVSX05BTUU7CisJfSAvLyBnZXRGb2xkZXJOYW1lCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjZ2V0U2VyaWFsaXphdGlvbkZpbGVOYW1lRXh0ZW5zaW9uKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25GaWxlTmFtZUV4dGVuc2lvbigpIHsKKwkJcmV0dXJuIFNlcXVlbmNlclBhY2thZ2UuZU5BTUU7CisJfQorCisJLyoqCisJICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV2l6YXJkIHBhZ2UgZm9yIHNwZWNpZnlpbmcgYQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuc2VxdWVuY2VyLlNlcXVlbmNlcn0KKwkgKi8KKwlhYnN0cmFjdCBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFNlcXVlbmNlclBhZ2UgZXh0ZW5kcyBOZXdJZGVudGlmaWFibGVQYWdlIHsKKwkJLyoqCisJCSAqIEBwYXJhbSBwYWdlTmFtZQorCQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwYWdlCisJCSAqLworCQlwcm90ZWN0ZWQgU2VxdWVuY2VyUGFnZShmaW5hbCBTdHJpbmcgcGFnZU5hbWUpIHsKKwkJCXN1cGVyKHBhZ2VOYW1lKTsKKwkJfQorCisJfSAvLyBTZXF1ZW5jZXJQYWdlCisKK30gLy8gTmV3U2VxdWVuY2VyV2l6YXJkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvTmV3U2VxdWVudGlhbFNlcXVlbmNlcldpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL05ld1NlcXVlbnRpYWxTZXF1ZW5jZXJXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTJiYzM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL05ld1NlcXVlbnRpYWxTZXF1ZW5jZXJXaXphcmQuamF2YQpAQCAtMCwwICsxLDY2NyBAQAorLy8gTmV3U2VxdWVudGlhbFNlcXVlbmNlcldpemFyZC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5pbXBsLkR1YmxpbkNvcmVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5Nb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuUmVhbFRpbWVTZXF1ZW5jZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNlcXVlbmNlci5TZXF1ZW5jZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5zZXF1ZW5jZXIuU2VxdWVudGlhbFNlcXVlbmNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGF0ZVRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIFdpemFyZCBmb3IgbWFraW5nIG5ldyBTVEVNIHtAbGluayBTZXF1ZW50aWFsU2VxdWVuY2VyfXMuCisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBOZXdTZXF1ZW50aWFsU2VxdWVuY2VyV2l6YXJkIGV4dGVuZHMgTmV3U2VxdWVuY2VyV2l6YXJkIHsKKworCWFic3RyYWN0IHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgU2VxdWVudGlhbFNlcXVlbmNlclBhZ2UgZXh0ZW5kcworCQkJU2VxdWVuY2VyUGFnZSB7CisJCQorCQkvKioKKwkJICogVGhpcyBpcyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgY3ljbGUgdGltZSB0ZXh0IGZpZWxkLgorCQkgKi8KKwkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DWUNMRV9QRVJJT0RfVElNRV9WQUxVRSA9ICIxIjsKKworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTVEVNVGltZS5Vbml0cyBERUZBVUxUX0NZQ0xFX1BFUklPRF9USU1FX1VOSVQgPSBTVEVNVGltZS5Vbml0cy5EQVk7CisKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gY3ljbGVQZXJpb2RUaW1lVW5pdFN0cmluZ3NQbHVyYWwgPSB7CisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJOU2VxdWVuY2VyV2l6Lm1pbGxpc2Vjb25kcyIpLAorCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiTlNlcXVlbmNlcldpei5zZWNvbmRzIiksCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJOU2VxdWVuY2VyV2l6Lm1pbnV0ZXMiKSwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIk5TZXF1ZW5jZXJXaXouaG91cnMiKSwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIk5TZXF1ZW5jZXJXaXouZGF5cyIpIH07CisKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gY3ljbGVQZXJpb2RUaW1lVW5pdFN0cmluZ3NTaW5ndWxhciA9IHsKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIk5TZXF1ZW5jZXJXaXoubWlsbGlzZWNvbmQiKSwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIk5TZXF1ZW5jZXJXaXouc2Vjb25kIiksCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJOU2VxdWVuY2VyV2l6Lm1pbnV0ZSIpLAorCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiTlNlcXVlbmNlcldpei5ob3VyIiksCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJOU2VxdWVuY2VyV2l6LmRheSIpIH07CisKKwkJLy8gVGhpcyBpcyB0aGUgKHNpbXVsYXRlZCkgdGltZSBwZXJpb2QgYmV0d2VlbiBzdWNjZXNzaXZlIHNpbXVsYXRpb24KKwkJLy8gY3ljbGVzLgorCQlwcml2YXRlIFRleHQgY3ljbGVQZXJpb2RUaW1lVmFsdWVGaWVsZDsKKworCQlwcml2YXRlIENvbWJvIGN5Y2xlUGVyaW9kVGltZUNvbWJvQm94OworCisJCS8qKgorCQkgKiBDb25zdHJ1Y3RvcgorCQkgKi8KKwkJcHVibGljIFNlcXVlbnRpYWxTZXF1ZW5jZXJQYWdlKCkgeyAKKwkJCXN1cGVyKE1lc3NhZ2VzLmdldFN0cmluZygiTlNlcVNlcXVlbmNlcldpei5wYWdlX3RpdGxlIikpOworCQkJc2V0VGl0bGUoTWVzc2FnZXMuZ2V0U3RyaW5nKCJOU2VxU2VxdWVuY2VyV2l6LnBhZ2VfdGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCXNldERlc2NyaXB0aW9uKE1lc3NhZ2VzCisJCQkJCS5nZXRTdHJpbmcoIk5TZXFTZXF1ZW5jZXJXaXoucGFnZV9kZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAorCQl9IC8vIFNlcXVlbmNlclBhZ2UKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkLk5ld0lkZW50aWZpYWJsZVBhZ2UjY3JlYXRlU3BlY2lmaWNDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlU3BlY2lmaWNDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKworCQkJZmluYWwgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOworCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEyOworCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCisJCQlmaW5hbCBHcmlkRGF0YSBjb21wb3NpdGVHcmlkTGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJY29tcG9zaXRlR3JpZExheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShjb21wb3NpdGVHcmlkTGF5b3V0RGF0YSk7CisKKwkJCS8vIEN5Y2xlIFBlcmlvZCBUaW1lIGxhYmVsCisJCQlmaW5hbCBMYWJlbCBjeWNsZVRpbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJCWN5Y2xlVGltZUxhYmVsLnNldFRleHQoTWVzc2FnZXMKKwkJCQkJLmdldFN0cmluZygiTlNlcXVlbmNlcldpei5jeWNsZVRpbWUiKSArICI6Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJZmluYWwgR3JpZERhdGEgY3ljbGVUaW1lTGFiZWxMYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCQljeWNsZVRpbWVMYWJlbExheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOworCQkJY3ljbGVUaW1lTGFiZWxMYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVBRDsKKwkJCWN5Y2xlVGltZUxhYmVsLnNldExheW91dERhdGEoY3ljbGVUaW1lTGFiZWxMYXlvdXREYXRhKTsKKworCQkJY3ljbGVQZXJpb2RUaW1lVmFsdWVGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJCQljeWNsZVBlcmlvZFRpbWVWYWx1ZUZpZWxkLnNldFRleHQoREVGQVVMVF9DWUNMRV9QRVJJT0RfVElNRV9WQUxVRSk7CisJCQlmaW5hbCBHcmlkRGF0YSBjeWNsZVRpbWVWYWx1ZUxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJCWN5Y2xlVGltZVZhbHVlTGF5b3V0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJCWN5Y2xlVGltZVZhbHVlTGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJCWN5Y2xlVGltZVZhbHVlTGF5b3V0RGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7CisJCQljeWNsZVBlcmlvZFRpbWVWYWx1ZUZpZWxkLnNldExheW91dERhdGEoY3ljbGVUaW1lVmFsdWVMYXlvdXREYXRhKTsKKworCQkJY3ljbGVQZXJpb2RUaW1lVmFsdWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihwcm9qZWN0VmFsaWRhdG9yKTsKKworCQkJY3ljbGVQZXJpb2RUaW1lQ29tYm9Cb3ggPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuRFJPUF9ET1dOCisJCQkJCXwgU1dULlJFQURfT05MWSk7CisJCQljeWNsZVBlcmlvZFRpbWVDb21ib0JveC5zZXRJdGVtcyhjeWNsZVBlcmlvZFRpbWVVbml0U3RyaW5nc1BsdXJhbCk7CisJCQljeWNsZVBlcmlvZFRpbWVDb21ib0JveC5zZWxlY3QoREVGQVVMVF9DWUNMRV9QRVJJT0RfVElNRV9VTklUCisJCQkJCS5vcmRpbmFsKCkpOworCQkJZmluYWwgR3JpZERhdGEgY3ljbGVUaW1lQ29tYm9Cb3hMYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCQljeWNsZVRpbWVDb21ib0JveExheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5UUkFJTDsKKwkJCWN5Y2xlVGltZUNvbWJvQm94TGF5b3V0RGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7CisJCQljeWNsZVBlcmlvZFRpbWVDb21ib0JveC5zZXRMYXlvdXREYXRhKGN5Y2xlVGltZUNvbWJvQm94TGF5b3V0RGF0YSk7CisKKwkJCWZpbmFsIENvbXBvc2l0ZSBzZXF1ZW5jZXJTcGVjaWZpY0NvbnRyb2wgPSBjcmVhdGVTZXF1ZW50aWFsU2VxdWVuY2VyU3BlY2lmaWNDb21wb3NpdGUoY29tcG9zaXRlKTsKKwkJCWZpbmFsIEdyaWREYXRhIHNlcXVlbmNlclNwZWNpZmljQ29udHJvbExheW91dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJCXNlcXVlbmNlclNwZWNpZmljQ29udHJvbExheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQlzZXF1ZW5jZXJTcGVjaWZpY0NvbnRyb2xMYXlvdXREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQkJc2VxdWVuY2VyU3BlY2lmaWNDb250cm9sTGF5b3V0RGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQlzZXF1ZW5jZXJTcGVjaWZpY0NvbnRyb2wKKwkJCQkJLnNldExheW91dERhdGEoc2VxdWVuY2VyU3BlY2lmaWNDb250cm9sTGF5b3V0RGF0YSk7CisJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgIm9yZy5lY2xpcHNlLnN0ZW0uZG9jLm5ld3NlcXVlbnRpYWxzZXF1ZW5jZXJfY29udGV4dGlkIik7CisJCQlyZXR1cm4gY29tcG9zaXRlOworCisJCX0gLy8gY3JlYXRlU3BlY2lmaWNDb21wb3NpdGUKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkLk5ld0lkZW50aWZpYWJsZVBhZ2UjdmFsaWRhdGVQYWdlKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7CisJCQlib29sZWFuIHJldFZhbHVlID0gc3VwZXIudmFsaWRhdGVQYWdlKCk7CisKKwkJCS8vIEN5Y2xlIHZhbHVlPworCQkJaWYgKHJldFZhbHVlKSB7CisJCQkJdHJ5IHsKKwkJCQkJLy8gWWVzCisJCQkJCWZpbmFsIGludCBjeWNsZVRpbWVWYWx1ZSA9IEludGVnZXIKKwkJCQkJCQkucGFyc2VJbnQoY3ljbGVQZXJpb2RUaW1lVmFsdWVGaWVsZC5nZXRUZXh0KCkpOworCQkJCQkvLyBJcyB0aGUgY3ljbGUgdGltZSBub24temVybyBhbmQgcG9zaXRpdmU/CisJCQkJCWlmIChjeWNsZVRpbWVWYWx1ZSA8IDEpIHsKKwkJCQkJCS8vIE5vCisJCQkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzCisJCQkJCQkJCS5nZXRTdHJpbmcoIk5TZXFTZXF1ZW5jZXJXaXouY3ljbGVUaW1lRXJyIikpOworCQkJCQl9IC8vIGlmCisJCQkJfSBjYXRjaCAoZmluYWwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwkJCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzCisJCQkJCQkJLmdldFN0cmluZygiTlNlcVNlcXVlbmNlcldpei5jeWNsZVRpbWVGb3JtYXRFcnIiKSk7CisJCQkJfSAvLyBjYXRjaCBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKwkJCX0gLy8gaWYKKworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIHZhbGlkYXRlUGFnZQorCisJCS8qKgorCQkgKiBAcmV0dXJuIHRoZSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgb2Ygb25lIGN5Y2xlCisJCSAqLworCQlwcm90ZWN0ZWQgbG9uZyBnZXRDeWNsZUR1cmF0aW9uKCkgeworCQkJbG9uZyByZXRWYWx1ZSA9IDE7CisJCQlmaW5hbCBTdHJpbmcgY3ljbGVQZXJpb2RUaW1lU3RyaW5nID0gY3ljbGVQZXJpb2RUaW1lVmFsdWVGaWVsZAorCQkJCQkuZ2V0VGV4dCgpOworCisJCQlmaW5hbCBsb25nIGN5Y2xlRHVyYXRpb24gPSBTVEVNVGltZS5Vbml0cy52YWx1ZXMoKVtjeWNsZVBlcmlvZFRpbWVDb21ib0JveAorCQkJCQkuZ2V0U2VsZWN0aW9uSW5kZXgoKV0uZ2V0TWlsbGlzZWNvbmRzKCk7CisKKwkJCXRyeSB7CisJCQkJZmluYWwgaW50IGN5Y2xlVGltZVZhbHVlID0gSW50ZWdlcgorCQkJCQkJLnBhcnNlSW50KGN5Y2xlUGVyaW9kVGltZVN0cmluZyk7CisJCQkJcmV0VmFsdWUgPSBjeWNsZVRpbWVWYWx1ZSAqIGN5Y2xlRHVyYXRpb247CisJCQl9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworCQkJCUFjdGl2YXRvci5sb2dFcnJvcigiTmV3UmVhbFRpbWVTZXF1ZW50aWFsU2VxdWVuY2VyIiwgZSk7CisJCQl9CisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gZ2V0Q3ljbGVEdXJhdGlvbgorCisJCS8qKgorCQkgKiBAcmV0dXJuIGEgbG9jYWxlIHNwZWNpZmljIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgZHVyYXRpb24KKwkJICovCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q3ljbGVEdXJhdGlvbkRlc2NyaXB0aW9uKCkgeworCQkJZmluYWwgU3RyaW5nIGN5Y2xlUGVyaW9kVGltZVN0cmluZyA9IGN5Y2xlUGVyaW9kVGltZVZhbHVlRmllbGQKKwkJCQkJLmdldFRleHQoKTsKKwkJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihjeWNsZVBlcmlvZFRpbWVTdHJpbmcpOworCQkJc2IuYXBwZW5kKCIgIik7CisJCQlzYgorCQkJCQkuYXBwZW5kKCIxIi5lcXVhbHMoY3ljbGVQZXJpb2RUaW1lU3RyaW5nKSA/IGN5Y2xlUGVyaW9kVGltZVVuaXRTdHJpbmdzU2luZ3VsYXJbY3ljbGVQZXJpb2RUaW1lQ29tYm9Cb3gKKwkJCQkJCQkuZ2V0U2VsZWN0aW9uSW5kZXgoKV0KKwkJCQkJCQk6IGN5Y2xlUGVyaW9kVGltZVVuaXRTdHJpbmdzUGx1cmFsW2N5Y2xlUGVyaW9kVGltZUNvbWJvQm94CisJCQkJCQkJCQkuZ2V0U2VsZWN0aW9uSW5kZXgoKV0pOworCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJCX0gLy8gZ2V0Q3ljbGVEdXJhdGlvbkRlc2NyaXB0aW9uCisKKwkJLyoqCisJCSAqIEBwYXJhbSBwYXJlbnQKKwkJICogQHJldHVybiBUT0RPCisJCSAqLworCQlhYnN0cmFjdCBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVNlcXVlbnRpYWxTZXF1ZW5jZXJTcGVjaWZpY0NvbXBvc2l0ZSgKKwkJCQlDb21wb3NpdGUgcGFyZW50KTsKKworCX0gLy8gU2VxdWVudGlhbFNlcXVlbmNlclBhZ2UKKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgTmV3U2VxdWVudGlhbFNlcXVlbmNlcldpemFyZH0gZm9yIGNyZWF0aW5nCisJICoge0BsaW5rIFNlcXVlbnRpYWxTZXF1ZW5jZXJ9cyB3aXRoIGZpeGVkIGN5Y2xlIHRpbWVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTmV3Rml4ZWRTZXF1ZW50aWFsU2VxdWVuY2VyV2l6YXJkIGV4dGVuZHMKKwkJCU5ld1NlcXVlbnRpYWxTZXF1ZW5jZXJXaXphcmQgeworCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjZ2V0V2l6YXJkVGl0bGUoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0V2l6YXJkVGl0bGUoKSB7CisJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJOU2VxU2VxdWVuY2VyV2l6LndpemFyZF90aXRsZSIpOyAvLyROT04tTkxTLTEkCisJCX0gLy8gZ2V0V2l6YXJkVGl0bGUKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2NyZWF0ZU5ld0lkZW50aWZpYWJsZVBhZ2UoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBOZXdJZGVudGlmaWFibGVQYWdlIGNyZWF0ZU5ld0lkZW50aWZpYWJsZVBhZ2UoKSB7CisJCQl0aGlzLnNldEhlbHBDb250ZXh0SWQoIm9yZy5lY2xpcHNlLnN0ZW0uZG9jLm5ld3NlcXVlbnRpYWxzZXF1ZW5jZXJfY29udGV4dGlkIik7CisJCQlyZXR1cm4gbmV3IEZpeGVkU2VxdWVudGlhbFNlcXVlbmNlclBhZ2UoKTsKKwkJfSAvLyBjcmVhdGVOZXdJZGVudGlmaWFibGVQYWdlCisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNjcmVhdGVJZGVudGlmaWFibGUoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBJZGVudGlmaWFibGUgY3JlYXRlSWRlbnRpZmlhYmxlKCkgeworCQkJZmluYWwgU2VxdWVudGlhbFNlcXVlbmNlciByZXRWYWx1ZSA9IFNlcXVlbmNlckZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCS5jcmVhdGVTZXF1ZW50aWFsU2VxdWVuY2VyKCk7CisJCQlyZXRWYWx1ZS5zZXREdWJsaW5Db3JlKG5ld0R1YmxpbkNvcmVQYWdlLmNyZWF0ZUR1YmxpbkNvcmUoKSk7CisKKwkJCWZpbmFsIERhdGUgc3RhcnREYXRlID0gKChGaXhlZFNlcXVlbnRpYWxTZXF1ZW5jZXJQYWdlKSBuZXdJZGVudGlmaWFibGVQYWdlKQorCQkJCQkuZ2V0U3RhcnREYXRlKCk7CisJCQkKKwkJCWZpbmFsIERhdGUgZW5kRGF0ZSA9ICgoRml4ZWRTZXF1ZW50aWFsU2VxdWVuY2VyUGFnZSkgbmV3SWRlbnRpZmlhYmxlUGFnZSkKKwkJCQkJLmdldEVuZERhdGUoKTsKKworCQkJdHJ5IHsKKwkJCQlyZXRWYWx1ZQorCQkJCQkJLnNldFRpbWVJbmNyZW1lbnQoKChGaXhlZFNlcXVlbnRpYWxTZXF1ZW5jZXJQYWdlKSBuZXdJZGVudGlmaWFibGVQYWdlKQorCQkJCQkJCQkuZ2V0Q3ljbGVEdXJhdGlvbigpKTsKKworCQkJCWZpbmFsIFNURU1UaW1lIHN0YXJ0VGltZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJCS5jcmVhdGVTVEVNVGltZSgpOworCQkJCXN0YXJ0VGltZS5zZXRUaW1lKHN0YXJ0RGF0ZSk7CisJCQkJCisJCQkJcmV0VmFsdWUuc2V0U3RhcnRUaW1lKHN0YXJ0VGltZSk7CisKKwkJCQkvLyBXYXMgYW4gZW5kIGRhdGUgc3BlY2lmaWVkPworCQkJCWlmIChlbmREYXRlICE9IG51bGwpIHsKKwkJCQkJLy8gWWVzCisJCQkJCWZpbmFsIFNURU1UaW1lIGVuZFRpbWUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCisJCQkJCQkJLmNyZWF0ZVNURU1UaW1lKCk7CisJCQkJCWVuZFRpbWUuc2V0VGltZShlbmREYXRlKTsKKwkJCQkJcmV0VmFsdWUuc2V0RW5kVGltZShlbmRUaW1lKTsKKwkJCQl9IC8vIGlmIGVuZCBkYXRlCisJCQl9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworCQkJCUFjdGl2YXRvci5sb2dFcnJvcigiTmV3U2VxdWVudGlhbFNlcXVlbmNlciIsIGUpOworCQkJfQorCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIGNyZWF0ZVNwZWNpZmljSWRlbnRpZmlhYmxlCisKKwkJLyoqCisJCSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHtAbGluayBTZXF1ZW50aWFsU2VxdWVuY2VyUGFnZX0gZm9yIGZpeGVkCisJCSAqIGRhdGVzLgorCQkgKi8KKwkJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBGaXhlZFNlcXVlbnRpYWxTZXF1ZW5jZXJQYWdlIGV4dGVuZHMKKwkJCQlTZXF1ZW50aWFsU2VxdWVuY2VyUGFnZSB7CisKKwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRU5EX0RBVEVfSU5JVElBTExZX0VOQUJMRUQgPSBmYWxzZTsKKworCQkJLy8gVGhpcyBpcyB0aGUgc3RhcnQgZGF0ZSBvZiB0aGUgc2VxdWVuY2VyCisJCQlCdXR0b24gZW5kRGF0ZUVuYWJsZWRCdXR0b247CisJCQlwcml2YXRlIERhdGVUaW1lIHN0YXJ0RGF0ZTsKKwkJCURhdGVUaW1lIGVuZERhdGU7CisKKwkJCS8qKgorCQkJICogQHJldHVybiB0aGUgc3RhcnRpbmcge0BsaW5rIERhdGV9CisJCQkgKi8KKwkJCXB1YmxpYyBEYXRlIGdldFN0YXJ0RGF0ZSgpIHsKKwkJCQlmaW5hbCBDYWxlbmRhciBzdGFydENhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwkJCQkvLyB1c2UgYSB0aW1lIG9mIGRheSBzZXQgdG8gbm9vbiBzbyBvbiBkYXlsaWdodCBzYXZpbmdzIHRpbWUKKwkJCQkvL3RoZSBhY3R1YWwgZGF0ZSBjaGFuZ2VzIG9rLgorCQkJCXN0YXJ0Q2FsZW5kYXIuc2V0KHN0YXJ0RGF0ZS5nZXRZZWFyKCksIHN0YXJ0RGF0ZS5nZXRNb250aCgpLAorCQkJCQkJc3RhcnREYXRlLmdldERheSgpLCAxMiwgMCwgMCk7CisJCQkJcmV0dXJuIHN0YXJ0Q2FsZW5kYXIuZ2V0VGltZSgpOworCQkJfSAvLyBnZXRTdGFydERhdGUKKworCQkJLyoqCisJCQkgKiBAcmV0dXJuIHRoZSBlbmRpbmcge0BsaW5rIERhdGV9LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubworCQkJICogICAgICAgICBlbmQgZGF0ZSB3YXMgc3BlY2lmaWVkLgorCQkJICovCisJCQlwdWJsaWMgRGF0ZSBnZXRFbmREYXRlKCkgeworCQkJCURhdGUgcmV0VmFsdWUgPSBudWxsOworCQkJCS8vIElzIHRoZSBlbmQgZGF0ZSBlbmFibGVkPworCQkJCWlmIChlbmREYXRlRW5hYmxlZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgeworCQkJCQkvLyBZZXMKKwkJCQkJZmluYWwgQ2FsZW5kYXIgZW5kQ2FsZW5kYXIgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworCQkJCQkvLyB1c2UgYSB0aW1lIG9mIGRheSBzZXQgdG8gbm9vbiBzbyBvbiBkYXlsaWdodCBzYXZpbmdzIHRpbWUKKwkJCQkJLy90aGUgYWN0dWFsIGRhdGUgY2hhbmdlcyBvay4KKwkJCQkJZW5kQ2FsZW5kYXIuc2V0KGVuZERhdGUuZ2V0WWVhcigpLCBlbmREYXRlLmdldE1vbnRoKCksCisJCQkJCQkJZW5kRGF0ZS5nZXREYXkoKSwgMTEsIDU5LCA1OSk7CisJCQkJCXJldFZhbHVlID0gZW5kQ2FsZW5kYXIuZ2V0VGltZSgpOworCQkJCX0gLy8gaWYKKwkJCQlyZXR1cm4gcmV0VmFsdWU7CisJCQl9IC8vIGdldEVuZERhdGUKKworCQkJLyoqCisJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQuTmV3SWRlbnRpZmlhYmxlUGFnZSN2YWxpZGF0ZVBhZ2UoKQorCQkJICovCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKKwkJCQlib29sZWFuIHJldFZhbHVlID0gc3VwZXIudmFsaWRhdGVQYWdlKCk7CisKKwkJCQkvLyBEb2VzIHRoZSBzdXBlciBjbGFzcyBoYXZlIGFueSBwcm9ibGVtcz8KKwkJCQlpZiAocmV0VmFsdWUpIHsKKwkJCQkJLy8gTm8KKwkJCQkJLy8gSXMgdGhlIGVuZCBkYXRlIGVuYWJsZWQ/CisJCQkJCWlmIChlbmREYXRlRW5hYmxlZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgeworCQkJCQkJLy8gWWVzCisJCQkJCQkKKwkJCQkJCS8vIGVuZCB5ZWFyIGJlZm9yZSBzdGFydD8KKwkJCQkJCWlmIChlbmREYXRlLmdldFllYXIoKSA8IHN0YXJ0RGF0ZS5nZXRZZWFyKCkpIHsKKwkJCQkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCQkJfSBlbHNlCisJCQkJCQkvLyBpcyBzYW1lIHllYXIgYnV0IG1vbnRoIGJlZm9yZSBjdXJyZW50IG1vbnRoID8KKwkJCQkJCWlmICgoZW5kRGF0ZS5nZXRZZWFyKCkgPT0gc3RhcnREYXRlLmdldFllYXIoKSkgJiYgKGVuZERhdGUuZ2V0TW9udGgoKSA8IHN0YXJ0RGF0ZS5nZXRNb250aCgpKSkgeworCQkJCQkJCS8vIHllcyAtIHByb2JsZW0KKwkJCQkJCQlyZXRWYWx1ZSA9IGZhbHNlOworCQkJCQkJfSBlbHNlCisJCQkJCQkvLyBpcyBzYW1lIHllYXIgYW5kIHNhbWUgbW9udGggYnVkIGRheSBiZWZvcmUgY3VycmVudCBkYXkgPworCQkJCQkJaWYgKChlbmREYXRlLmdldFllYXIoKSA9PSBzdGFydERhdGUuZ2V0WWVhcigpKSAmJiAoZW5kRGF0ZS5nZXRNb250aCgpID09IHN0YXJ0RGF0ZS5nZXRNb250aCgpKSAmJiAoZW5kRGF0ZS5nZXREYXkoKSA8PSBzdGFydERhdGUuZ2V0RGF5KCkpKSB7CisJCQkJCQkJLy8geWVzIC0gcHJvYmxlbQorCQkJCQkJCXJldFZhbHVlID0gZmFsc2U7CisJCQkJCQl9CisJCQkJCQkJCQorCQkJCQkJaWYoIXJldFZhbHVlKSBzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuZ2V0U3RyaW5nKCJOU2VxU2VxdWVuY2VyV2l6LmVuZEJlZm9yZUVyciIpKTsKKwkJCQkJCQkKKwkJCQkJfSAvLyBpZiBlbmQgZGF0ZQorCQkJCX0gLy8gaWYgc3VwZXIgcGFnZSBvaworCQkJCXJldHVybiByZXRWYWx1ZTsKKwkJCX0gLy8gdmFsaWRhdGVQYWdlCisKKwkJCS8qKgorCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3U2VxdWVudGlhbFNlcXVlbmNlcldpemFyZC5TZXF1ZW50aWFsU2VxdWVuY2VyUGFnZSNjcmVhdGVTZXF1ZW50aWFsU2VxdWVuY2VyU3BlY2lmaWNDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQorCQkJICovCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlU2VxdWVudGlhbFNlcXVlbmNlclNwZWNpZmljQ29tcG9zaXRlKAorCQkJCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisJCQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisKKwkJCQlmaW5hbCBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxMjsKKwkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKworCQkJCWZpbmFsIEdyaWREYXRhIGNvbXBvc2l0ZUdyaWRMYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCQkJY29tcG9zaXRlR3JpZExheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoY29tcG9zaXRlR3JpZExheW91dERhdGEpOworCisJCQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCisJCQkJZmluYWwgTGFiZWwgc3RhcnREYXRlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuQ0VOVEVSKTsKKwkJCQlzdGFydERhdGVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKKwkJCQlzdGFydERhdGVMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzCisJCQkJCQkuZ2V0U3RyaW5nKCJOU2VxU2VxdWVuY2VyV2l6LnN0YXJ0VGltZSIpCisJCQkJCQkrICI6Iik7CisJCQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCisJCQkJc3RhcnREYXRlID0gbmV3IERhdGVUaW1lKGNvbXBvc2l0ZSwgU1dULkNBTEVOREFSKTsKKwkJCQlzdGFydERhdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7CisJCQkJc3RhcnREYXRlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoCisJCQkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisKKwkJCQllbmREYXRlRW5hYmxlZEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOworCQkJCWVuZERhdGVFbmFibGVkQnV0dG9uLnNldFRleHQoTWVzc2FnZXMKKwkJCQkJCS5nZXRTdHJpbmcoIk5TZXFTZXF1ZW5jZXJXaXouZW5kVGltZSIpCisJCQkJCQkrICI6Iik7CisJCQkJZW5kRGF0ZUVuYWJsZWRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7CisJCQkJZW5kRGF0ZUVuYWJsZWRCdXR0b24KKwkJCQkJCS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCgKKwkJCQkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCQkJCWVuZERhdGUuc2V0RW5hYmxlZChlbmREYXRlRW5hYmxlZEJ1dHRvbgorCQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCQkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7CisJCQkJCQkJfQorCQkJCQkJfSk7CisJCQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCisJCQkJZW5kRGF0ZSA9IG5ldyBEYXRlVGltZShjb21wb3NpdGUsIFNXVC5DQUxFTkRBUik7CisJCQkJZW5kRGF0ZS5zZXRFbmFibGVkKEVORF9EQVRFX0lOSVRJQUxMWV9FTkFCTEVEKTsKKwkJCQllbmREYXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOworCQkJCWVuZERhdGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCgKKwkJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKKwkJCQkJfQorCQkJCX0pOworCQkJCXJldHVybiBjb21wb3NpdGU7CisJCQl9IC8vIGNyZWF0ZVNlcXVlbnRpYWxTZXF1ZW5jZXJTcGVjaWZpY0NvbXBvc2l0ZQorCisJCQkvKioKKwkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld1NlcXVlbnRpYWxTZXF1ZW5jZXJXaXphcmQuU2VxdWVudGlhbFNlcXVlbmNlclBhZ2UjZ2V0RENUaXRsZSgpCisJCQkgKi8KKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREQ1RpdGxlKCkgeworCQkJCVN0cmluZyByZXRWYWx1ZSA9IG51bGw7CisJCQkJZmluYWwgU3RyaW5nIHN0YXJ0RGF0ZVN0cmluZyA9IER1YmxpbkNvcmVJbXBsCisJCQkJCQkuY3JlYXRlSVNPODYwMURhdGVTdHJpbmcoZ2V0U3RhcnREYXRlKCkpOworCQkJCWZpbmFsIERhdGUgZW5kRGF0ZSA9IGdldEVuZERhdGUoKTsKKwkJCQlmaW5hbCBTdHJpbmcgZW5kRGF0ZVN0cmluZyA9IGVuZERhdGUgIT0gbnVsbCA/IER1YmxpbkNvcmVJbXBsCisJCQkJCQkuY3JlYXRlSVNPODYwMURhdGVTdHJpbmcoZW5kRGF0ZSkgOiBudWxsOworCisJCQkJLy8gV2FzIGFuIGVuZCBkYXRlIHNwZWNpZmllZD8KKwkJCQlpZiAoZW5kRGF0ZVN0cmluZyAhPSBudWxsICYmICFlbmREYXRlU3RyaW5nLmVxdWFscygiIikpIHsKKwkJCQkJLy8gWWVzCisJCQkJCXJldFZhbHVlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTWVzc2FnZXMKKwkJCQkJCQkuZ2V0U3RyaW5nKCJOU2VxU2VxdWVuY2VyV2l6LkRDX1RJVExFMSIpLAorCQkJCQkJCW5ldyBPYmplY3RbXSB7IHN0YXJ0RGF0ZVN0cmluZywgZW5kRGF0ZVN0cmluZywKKwkJCQkJCQkJCWdldEN5Y2xlRHVyYXRpb25EZXNjcmlwdGlvbigpIH0pOworCQkJCX0gLy8gaWYgZW5kIGRhdGUKKwkJCQllbHNlIHsKKwkJCQkJLy8gTm8KKwkJCQkJcmV0VmFsdWUgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChNZXNzYWdlcworCQkJCQkJCS5nZXRTdHJpbmcoIk5TZXFTZXF1ZW5jZXJXaXouRENfVElUTEUyIiksCisJCQkJCQkJbmV3IE9iamVjdFtdIHsgc3RhcnREYXRlU3RyaW5nLAorCQkJCQkJCQkJZ2V0Q3ljbGVEdXJhdGlvbkRlc2NyaXB0aW9uKCkgfSk7CisJCQkJfSAvLyBlbHNlCisJCQkJcmV0dXJuIHJldFZhbHVlOworCQkJfSAvLyBnZXREQ1RpdGxlCisKKwkJCS8qKgorCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkLk5ld0lkZW50aWZpYWJsZVBhZ2UjZ2V0RENEZXNjcmlwdGlvbigpCisJCQkgKi8KKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREQ0Rlc2NyaXB0aW9uKCkgeworCQkJCVN0cmluZyByZXRWYWx1ZSA9IG51bGw7CisJCQkJZmluYWwgU3RyaW5nIHN0YXJ0RGF0ZVN0cmluZyA9IER1YmxpbkNvcmVJbXBsCisJCQkJCQkuY3JlYXRlSVNPODYwMURhdGVTdHJpbmcoZ2V0U3RhcnREYXRlKCkpOworCQkJCWZpbmFsIERhdGUgZW5kRGF0ZSA9IGdldEVuZERhdGUoKTsKKwkJCQlmaW5hbCBTdHJpbmcgZW5kRGF0ZVN0cmluZyA9IGVuZERhdGUgIT0gbnVsbCA/IER1YmxpbkNvcmVJbXBsCisJCQkJCQkuY3JlYXRlSVNPODYwMURhdGVTdHJpbmcoZW5kRGF0ZSkgOiBudWxsOworCisJCQkJLy8gV2FzIGFuIGVuZCBkYXRlIHNwZWNpZmllZD8KKwkJCQlpZiAoZW5kRGF0ZVN0cmluZyAhPSBudWxsICYmICFlbmREYXRlU3RyaW5nLmVxdWFscygiIikpIHsKKwkJCQkJLy8gWWVzCisJCQkJCXJldFZhbHVlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTWVzc2FnZXMKKwkJCQkJCQkuZ2V0U3RyaW5nKCJOU2VxU2VxdWVuY2VyV2l6LkRDX0RFU0NSSVBUSU9OMSIpLAorCQkJCQkJCW5ldyBPYmplY3RbXSB7IHN0YXJ0RGF0ZVN0cmluZywgZW5kRGF0ZVN0cmluZywKKwkJCQkJCQkJCWdldEN5Y2xlRHVyYXRpb25EZXNjcmlwdGlvbigpIH0pOworCQkJCX0gLy8gaWYgZW5kIGRhdGUKKwkJCQllbHNlIHsKKwkJCQkJLy8gTm8KKwkJCQkJcmV0VmFsdWUgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChNZXNzYWdlcworCQkJCQkJCS5nZXRTdHJpbmcoIk5TZXFTZXF1ZW5jZXJXaXouRENfREVTQ1JJUFRJT04yIiksCisJCQkJCQkJbmV3IE9iamVjdFtdIHsgc3RhcnREYXRlU3RyaW5nLAorCQkJCQkJCQkJZ2V0Q3ljbGVEdXJhdGlvbkRlc2NyaXB0aW9uKCkgfSk7CisJCQkJfSAvLyBlbHNlCisKKwkJCQlyZXR1cm4gcmV0VmFsdWU7CisJCQl9IC8vIGdldERDRGVzY3JpcHRpb24KKworCQkJLyoqCisJCQkgKiBAcmV0dXJuIGEgc3RyaW5nIHN1aXRhYmxlIGZvcgorCQkJICogICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5EdWJsaW5Db3JlI3NldFZhbGlkKFN0cmluZyl9CisJCQkgKi8KKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREQ1ZhbGlkRGF0ZVJhbmdlKCkgeworCQkJCWZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigic3RhcnQ9Iik7CisKKwkJCQlzYi5hcHBlbmQoRHVibGluQ29yZUltcGwKKwkJCQkJCS5jcmVhdGVJU084NjAxRGF0ZVN0cmluZyhnZXRTdGFydERhdGUoKSkpOworCisJCQkJc2IuYXBwZW5kKCI7Iik7CisKKwkJCQkvLyBFbmQgZGF0ZT8KKwkJCQlmaW5hbCBEYXRlIGVuZERhdGUgPSBnZXRFbmREYXRlKCk7CisJCQkJaWYgKGVuZERhdGUgIT0gbnVsbCkgeworCQkJCQkvLyBZZXMKKwkJCQkJc2IuYXBwZW5kKCIgZW5kPSIpOworCQkJCQlzYi5hcHBlbmQoRHVibGluQ29yZUltcGwuY3JlYXRlSVNPODYwMURhdGVTdHJpbmcoZW5kRGF0ZSkpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQl9IC8vIGlmCisJCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJCQl9IC8vIGdldFZhbGlkRGF0ZVJhbmdlCisJCX0gLy8gRml4ZWRTZXF1ZW50aWFsU2VxdWVuY2VyUGFnZQorCisJCS8qKgorCQkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIElIYW5kbGVyfSBmb3IgdGhlIGNvbW1hbmQgdGhhdCBjcmVhdGVzIGEKKwkJICoge0BsaW5rIE5ld1NlcXVlbnRpYWxTZXF1ZW5jZXJXaXphcmR9CisJCSAqLworCQlwdWJsaWMgc3RhdGljIGNsYXNzIE5ld1NlcXVlbnRpYWxTZXF1ZW5jZXJXaXphcmRDb21tYW5kSGFuZGxlciBleHRlbmRzCisJCQkJQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgeworCisJCQkvKioKKwkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXIjZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50KQorCQkJICovCisJCQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoZmluYWwgRXhlY3V0aW9uRXZlbnQgZXhlY3V0aW9uRXZlbnQpCisJCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworCQkJCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gSGFuZGxlclV0aWwKKwkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3dDaGVja2VkKGV4ZWN1dGlvbkV2ZW50KTsKKwkJCQlmaW5hbCBOZXdGaXhlZFNlcXVlbnRpYWxTZXF1ZW5jZXJXaXphcmQgd2l6YXJkID0gbmV3IE5ld0ZpeGVkU2VxdWVudGlhbFNlcXVlbmNlcldpemFyZCgpOworCQkJCXdpemFyZC5pbml0KHdpbmRvdy5nZXRXb3JrYmVuY2goKSwgU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7CisJCQkJZmluYWwgV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBTVEVNV2l6YXJkRGlhbG9nKHdpbmRvdworCQkJCQkJLmdldFNoZWxsKCksIHdpemFyZCk7CisJCQkJd2l6YXJkRGlhbG9nLm9wZW4oKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0gLy8gZXhlY3V0ZQorCQl9IC8vIE5ld1NlcXVlbnRpYWxTZXF1ZW5jZXJXaXphcmRDb21tYW5kSGFuZGxlcgorCX0gLy8gTmV3Rml4ZWRTZXF1ZW50aWFsU2VxdWVuY2VyV2l6YXJkCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEgV2l6YXJkIGZvciBtYWtpbmcgbmV3IFNURU0ge0BsaW5rIFJlYWxUaW1lU2VxdWVuY2VyfXMuCisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBOZXdSZWFsVGltZVNlcXVlbmNlcldpemFyZCBleHRlbmRzCisJCQlOZXdTZXF1ZW50aWFsU2VxdWVuY2VyV2l6YXJkIHsKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2dldFdpemFyZFRpdGxlKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFdpemFyZFRpdGxlKCkgeworCQkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiTlJUU2VxdWVuY2VyV2l6LndpemFyZF90aXRsZSIpOyAvLyROT04tTkxTLTEkCisJCX0gLy8gZ2V0V2l6YXJkVGl0bGUKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2NyZWF0ZU5ld0lkZW50aWZpYWJsZVBhZ2UoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBOZXdJZGVudGlmaWFibGVQYWdlIGNyZWF0ZU5ld0lkZW50aWZpYWJsZVBhZ2UoKSB7CisJCQl0aGlzLnNldEhlbHBDb250ZXh0SWQoIm9yZy5lY2xpcHNlLnN0ZW0uZG9jLm5ld3JlYWx0aW1lc2VxdWVuY2VyX2NvbnRleHRpZCIpOworCQkJcmV0dXJuIG5ldyBSZWFsVGltZVNlcXVlbnRpYWxTZXF1ZW5jZXJQYWdlKCk7CisJCX0gLy8gY3JlYXRlTmV3SWRlbnRpZmlhYmxlUGFnZQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjY3JlYXRlSWRlbnRpZmlhYmxlKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgSWRlbnRpZmlhYmxlIGNyZWF0ZUlkZW50aWZpYWJsZSgpIHsKKwkJCWZpbmFsIFJlYWxUaW1lU2VxdWVuY2VyIHJldFZhbHVlID0gU2VxdWVuY2VyRmFjdG9yeS5lSU5TVEFOQ0UKKwkJCQkJLmNyZWF0ZVJlYWxUaW1lU2VxdWVuY2VyKCk7CisJCQlyZXRWYWx1ZS5zZXREdWJsaW5Db3JlKG5ld0R1YmxpbkNvcmVQYWdlLmNyZWF0ZUR1YmxpbkNvcmUoKSk7CisJCQlyZXRWYWx1ZQorCQkJCQkuc2V0VGltZUluY3JlbWVudCgoKFJlYWxUaW1lU2VxdWVudGlhbFNlcXVlbmNlclBhZ2UpIG5ld0lkZW50aWZpYWJsZVBhZ2UpCisJCQkJCQkJLmdldEN5Y2xlRHVyYXRpb24oKSk7CisJCQlyZXR1cm4gcmV0VmFsdWU7CisJCX0gLy8gY3JlYXRlU3BlY2lmaWNJZGVudGlmaWFibGUKKworCQkvKioKKwkJICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEge0BsaW5rIFNlcXVlbnRpYWxTZXF1ZW5jZXJQYWdlfSBmb3IgYQorCQkgKiB7QGxpbmsgUmVhbFRpbWVTZXF1ZW5jZXJ9cy4KKwkJICovCisJCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgUmVhbFRpbWVTZXF1ZW50aWFsU2VxdWVuY2VyUGFnZSBleHRlbmRzCisJCQkJU2VxdWVudGlhbFNlcXVlbmNlclBhZ2UgeworCisJCQkvKioKKwkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld1NlcXVlbnRpYWxTZXF1ZW5jZXJXaXphcmQuU2VxdWVudGlhbFNlcXVlbmNlclBhZ2UjY3JlYXRlU2VxdWVudGlhbFNlcXVlbmNlclNwZWNpZmljQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkJCSAqLworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVNlcXVlbnRpYWxTZXF1ZW5jZXJTcGVjaWZpY0NvbXBvc2l0ZSgKKwkJCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQkJCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQkJCQorCQkJCXJldHVybiBjb21wb3NpdGU7CisJCQl9IC8vIGNyZWF0ZVNlcXVlbnRpYWxTZXF1ZW5jZXJTcGVjaWZpY0NvbXBvc2l0ZQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlU3BlY2lmaWNDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5jcmVhdGVTcGVjaWZpY0NvbXBvc2l0ZShwYXJlbnQpOworCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCAib3JnLmVjbGlwc2Uuc3RlbS5kb2MubmV3cmVhbHRpbWVzZXF1ZW5jZXJfY29udGV4dGlkIik7CisJCQkJcmV0dXJuIGNvbXBvc2l0ZTsKKwkJCX0KKwkJCS8qKgorCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3U2VxdWVudGlhbFNlcXVlbmNlcldpemFyZC5TZXF1ZW50aWFsU2VxdWVuY2VyUGFnZSNnZXREQ1RpdGxlKCkKKwkJCSAqLworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERDVGl0bGUoKSB7CisJCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1lc3NhZ2VzCisJCQkJCQkuZ2V0U3RyaW5nKCJOU1JUU2VxdWVuY2VyV2l6LkRDX1RJVExFIiksCisJCQkJCQluZXcgT2JqZWN0W10geyBnZXRDeWNsZUR1cmF0aW9uRGVzY3JpcHRpb24oKSB9KTsKKwkJCX0gLy8gZ2V0RENUaXRsZQorCisJCQkvKioKKwkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZC5OZXdJZGVudGlmaWFibGVQYWdlI2dldERDRGVzY3JpcHRpb24oKQorCQkJICovCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RENEZXNjcmlwdGlvbigpIHsKKwkJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTWVzc2FnZXMKKwkJCQkJCS5nZXRTdHJpbmcoIk5TUlRTZXF1ZW5jZXJXaXouRENfREVTQ1JJUFRJT04xIiksCisJCQkJCQluZXcgT2JqZWN0W10geyBnZXRDeWNsZUR1cmF0aW9uRGVzY3JpcHRpb24oKSB9KTsKKwkJCX0gLy8gZ2V0RENEZXNjcmlwdGlvbgorCisJCQkvKioKKwkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld1NlcXVlbnRpYWxTZXF1ZW5jZXJXaXphcmQuU2VxdWVudGlhbFNlcXVlbmNlclBhZ2UjZ2V0RENWYWxpZERhdGVSYW5nZSgpCisJCQkgKi8KKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREQ1ZhbGlkRGF0ZVJhbmdlKCkgeworCQkJCXJldHVybiAiIjsKKwkJCX0gLy8gZ2V0VmFsaWREYXRlUmFuZ2UKKwkJCQorCQl9IC8vIFJlYWxUaW1lU2VxdWVudGlhbFNlcXVlbmNlclBhZ2UKKworCQkvKioKKwkJICogVGhpcyBjbGFzcyBpcyBhIHtAbGluayBJSGFuZGxlcn0gZm9yIHRoZSBjb21tYW5kIHRoYXQgY3JlYXRlcyBhCisJCSAqIHtAbGluayBOZXdTZXF1ZW50aWFsU2VxdWVuY2VyV2l6YXJkfQorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBjbGFzcyBOZXdSZWFsVGltZVNlcXVlbmNlcldpemFyZENvbW1hbmRIYW5kbGVyIGV4dGVuZHMKKwkJCQlBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7CisKKwkJCS8qKgorCQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlciNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQpCisJCQkgKi8KKwkJCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShmaW5hbCBFeGVjdXRpb25FdmVudCBleGVjdXRpb25FdmVudCkKKwkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisJCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBIYW5kbGVyVXRpbAorCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvd0NoZWNrZWQoZXhlY3V0aW9uRXZlbnQpOworCQkJCWZpbmFsIE5ld1JlYWxUaW1lU2VxdWVuY2VyV2l6YXJkIHdpemFyZCA9IG5ldyBOZXdSZWFsVGltZVNlcXVlbmNlcldpemFyZCgpOworCQkJCXdpemFyZC5pbml0KHdpbmRvdy5nZXRXb3JrYmVuY2goKSwgU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7CisJCQkJZmluYWwgV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBTVEVNV2l6YXJkRGlhbG9nKHdpbmRvdworCQkJCQkJLmdldFNoZWxsKCksIHdpemFyZCk7CisJCQkJd2l6YXJkRGlhbG9nLm9wZW4oKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0gLy8gZXhlY3V0ZQorCQl9IC8vIE5ld1JlYWxUaW1lU2VxdWVuY2VyV2l6YXJkQ29tbWFuZEhhbmRsZXIKKwl9IC8vIE5ld1JlYWxUaW1lU2VxdWVuY2VyV2l6YXJkCit9IC8vIE5ld1NlcXVlbnRpYWxTZXF1ZW5jZXJXaXphcmQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9OZXdUcmlnZ2VyV2l6YXJkLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvTmV3VHJpZ2dlcldpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYmQ1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvTmV3VHJpZ2dlcldpemFyZC5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvLyBOZXdUcmlnZ2VyV2l6YXJkLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuU1RFTVVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUudHJpZ2dlci5UcmlnZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS50cmlnZ2VyLlRyaWdnZXJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSB7QGxpbmsgTmV3SWRlbnRpZmlhYmxlV2l6YXJkfSBmb3IgdGhhdCBjcmVhdGVzIG5ldyBTVEVNCisgKiB7QGxpbmsgVHJpZ2dlcn1zCisgKi8KK3B1YmxpYyBjbGFzcyBOZXdUcmlnZ2VyV2l6YXJkIGV4dGVuZHMgTmV3SWRlbnRpZmlhYmxlV2l6YXJkIHsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzLk5ld0lkZW50aWZpYWJsZVdpemFyZCNnZXRXaXphcmRUaXRsZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRXaXphcmRUaXRsZSgpIHsKKwkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiTlRyaWdnZXJXaXoud2l6YXJkX3RpdGxlIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udWkud2l6YXJkcy5OZXdJZGVudGlmaWFibGVXaXphcmQjY3JlYXRlTmV3SWRlbnRpZmlhYmxlUGFnZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE5ld0lkZW50aWZpYWJsZVBhZ2UgY3JlYXRlTmV3SWRlbnRpZmlhYmxlUGFnZSgpIHsKKwkJdGhpcy5zZXRIZWxwQ29udGV4dElkKCJvcmcuZWNsaXBzZS5zdGVtLmRvYy5uZXd0cmlnZ2VyX2NvbnRleHRpZCIpOworCQlyZXR1cm4gbmV3IE5ld1RyaWdnZXJQYWdlKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2NyZWF0ZUR1YmxpbkNvcmVQYWdlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRHVibGluQ29yZVBhZ2UgY3JlYXRlRHVibGluQ29yZVBhZ2UoKSB7CisJCXJldHVybiBuZXcgRHVibGluQ29yZVBhZ2UoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEQ0F0dHJpYnV0ZXMoKSB7CisJCQkJc3VwZXIuaW5pdGlhbGl6ZURDQXR0cmlidXRlcygpOworCQkJCWZvcm1hdC5zZXRUZXh0KFRyaWdnZXJQYWNrYWdlLmVOU19VUkkpOworCQkJCWZvcm1hdC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQl0eXBlLnNldFRleHQoU1RFTVVSSS5UUklHR0VSX1RZUEVfVVJJLnRvU3RyaW5nKCkpOworCQkJCXR5cGUuc2V0RW5hYmxlZChmYWxzZSk7CisJCQl9CisJCX07CisJfSAvLyBjcmVhdGVEdWJsaW5Db3JlUGFnZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2NyZWF0ZUlkZW50aWZpYWJsZSgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElkZW50aWZpYWJsZSBjcmVhdGVJZGVudGlmaWFibGUoKSB7CisJCWZpbmFsIFRyaWdnZXIgcmV0VmFsdWUgPSBUcmlnZ2VyRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHJpZ2dlcigpOworCQlyZXRWYWx1ZS5zZXREdWJsaW5Db3JlKG5ld0R1YmxpbkNvcmVQYWdlLmNyZWF0ZUR1YmxpbkNvcmUoKSk7CisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZUlkZW50aWZpYWJsZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2dldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcmlhbGl6YXRpb25Gb2xkZXJOYW1lKCkgeworCQlyZXR1cm4gTmV3U1RFTVByb2plY3RXaXphcmQuVFJJR0dFUlNfRk9MREVSX05BTUU7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkI2dldFNlcmlhbGl6YXRpb25GaWxlTmFtZUV4dGVuc2lvbigpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJpYWxpemF0aW9uRmlsZU5hbWVFeHRlbnNpb24oKSB7CisJCXJldHVybiBUcmlnZ2VyUGFja2FnZS5lTkFNRTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5ld1RyaWdnZXJQYWdlIGV4dGVuZHMgTmV3SWRlbnRpZmlhYmxlUGFnZSB7CisKKwkJLyoqCisJCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKKwkJICovCisJCXByb3RlY3RlZCBOZXdUcmlnZ2VyUGFnZSgpIHsKKwkJCXN1cGVyKE1lc3NhZ2VzLmdldFN0cmluZygiTlRyaWdnZXJXaXoucGFnZV90aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJc2V0VGl0bGUoTWVzc2FnZXMuZ2V0U3RyaW5nKCJOVHJpZ2dlcldpei5wYWdlX3RpdGxlIikpOyAvLyROT04tTkxTLTEkCisJCQlzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIk5UcmlnZ2VyV2l6LnBhZ2VfZGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKKwkJfSAvLyBOZXdUcmlnZ2VyUGFnZQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVNwZWNpZmljQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCAib3JnLmVjbGlwc2Uuc3RlbS5kb2MubmV3dHJpZ2dlcl9jb250ZXh0aWQiKTsKKwkJCXJldHVybiBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQl9IC8vIGNyZWF0ZVNwZWNpZmljQ29tcG9zaXRlCisJCQorCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpemFyZHMuTmV3SWRlbnRpZmlhYmxlV2l6YXJkLk5ld0lkZW50aWZpYWJsZVBhZ2UjZ2V0RENEZXNjcmlwdGlvbigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIFN0cmluZyBnZXREQ0Rlc2NyaXB0aW9uKCkgeworCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1lc3NhZ2VzCisJCQkJCS5nZXRTdHJpbmcoIk5UcmlnZ2VyV2l6LkRDX0RFU0NSSVBUSU9OIiksCisJCQkJCW5ldyBPYmplY3RbXSB7IHNlcmlhbGl6YXRpb25GaWxlTmFtZUZpZWxkLmdldFRleHQoKSB9KTsKKwkJfSAvLyBnZXREQ0Rlc2NyaXB0aW9uCisKKwl9IC8vIE5ld1RyaWdnZXJQYWdlCisKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGEge0BsaW5rIElIYW5kbGVyfSBmb3IgdGhlIGNvbW1hbmQgdGhhdCBjcmVhdGVzIGEKKwkgKiB7QGxpbmsgTmV3VHJpZ2dlcldpemFyZH0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE5ld1RyaWdnZXJXaXphcmRDb21tYW5kSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlcgorCQkJaW1wbGVtZW50cyBJSGFuZGxlciB7CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXIjZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50KQorCQkgKi8KKwkJcHVibGljIE9iamVjdCBleGVjdXRlKGZpbmFsIEV4ZWN1dGlvbkV2ZW50IGV4ZWN1dGlvbkV2ZW50KQorCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBIYW5kbGVyVXRpbAorCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93Q2hlY2tlZChleGVjdXRpb25FdmVudCk7CisJCQlmaW5hbCBOZXdUcmlnZ2VyV2l6YXJkIHdpemFyZCA9IG5ldyBOZXdUcmlnZ2VyV2l6YXJkKCk7CisJCQl3aXphcmQuaW5pdCh3aW5kb3cuZ2V0V29ya2JlbmNoKCksIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOworCQkJZmluYWwgV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBTVEVNV2l6YXJkRGlhbG9nKHdpbmRvdworCQkJCQkuZ2V0U2hlbGwoKSwgd2l6YXJkKTsKKwkJCXdpemFyZERpYWxvZy5vcGVuKCk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSAvLyBleGVjdXRlCisJfSAvLyBOZXdUcmlnZ2VyV2l6YXJkQ29tbWFuZEhhbmRsZXIKKwkKK30gLy8gTmV3VHJpZ2dlcldpemFyZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9TVEVNV2l6YXJkRGlhbG9nLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvU1RFTVdpemFyZERpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MTViMjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvU1RFTVdpemFyZERpYWxvZy5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA2LDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOw0KKw0KK3B1YmxpYyBjbGFzcyBTVEVNV2l6YXJkRGlhbG9nIGV4dGVuZHMgV2l6YXJkRGlhbG9nIHsNCisNCisJcHJpdmF0ZSBCdXR0b24gaGVscEJ1dHRvbjsNCisNCisJcHVibGljIFNURU1XaXphcmREaWFsb2coZmluYWwgU2hlbGwgcGFyZW50U2hlbGwsIGZpbmFsIElXaXphcmQgbmV3V2l6YXJkKSB7DQorCQlzdXBlcihwYXJlbnRTaGVsbCwgbmV3V2l6YXJkKTsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChmaW5hbCBpbnQgYnV0dG9uSWQpIHsNCisJCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOw0KKwkJaWYgKElEaWFsb2dDb25zdGFudHMuSEVMUF9JRCA9PSBidXR0b25JZCkgew0KKwkJCWlmICh0aGlzLmdldFdpemFyZCgpIGluc3RhbmNlb2YgTmV3SWRlbnRpZmlhYmxlV2l6YXJkKSB7DQorCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLmRpc3BsYXlIZWxwKA0KKwkJCQkJCSgoTmV3SWRlbnRpZmlhYmxlV2l6YXJkKSB0aGlzLmdldFdpemFyZCgpKQ0KKwkJCQkJCQkJLmdldEhlbHBDb250ZXh0SWQoKSk7DQorCQkJfSBlbHNlIHsNCisJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuZGlzcGxheUhlbHAoDQorCQkJCQkJKChOZXdOb25JZGVudGlmaWFibGVXaXphcmQpIHRoaXMuZ2V0V2l6YXJkKCkpDQorCQkJCQkJCQkuZ2V0SGVscENvbnRleHRJZCgpKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgew0KKwkJc3VwZXIuY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihwYXJlbnQpOw0KKwkJaGVscEJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkhFTFBfSUQpOw0KKwkJZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGhlbHBJY29uID0gQWJzdHJhY3RVSVBsdWdpbg0KKwkJCQkuaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigib3JnLmVjbGlwc2Uuc3RlbS51aSIsDQorCQkJCQkJImljb25zL2Z1bGwvY3VzdG9tb2JqMTYvSGVscEljb24uZ2lmIik7DQorCQlmaW5hbCBJbWFnZSBpbWFnZSA9IGhlbHBJY29uLmNyZWF0ZUltYWdlKCk7DQorCQlmaW5hbCBJbWFnZURlc2NyaXB0b3IgaGVscEljb25NYWNPUyA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigib3JnLmVjbGlwc2Uuc3RlbS51aSIsICJpY29ucy9mdWxsL2N1c3RvbW9iajE2L0hlbHBJY29uTWFjT1MuZ2lmIik7DQorCQloZWxwQnV0dG9uLnNldFRleHQoIiIpOw0KKwkJaWYoU3lzdGVtLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmNvbnRhaW5zKCJNYWMiKSl7DQorCQkJZmluYWwgSW1hZ2UgaW1hZ2VNYWNPUyA9IGhlbHBJY29uTWFjT1MuY3JlYXRlSW1hZ2UoKTsNCisJCQloZWxwQnV0dG9uLnNldEltYWdlKGltYWdlTWFjT1MpOw0KKwkJfQ0KKwkJZWxzZXsNCisJCQloZWxwQnV0dG9uLnNldEltYWdlKGltYWdlKTsNCisJCX0NCisJCWZpbmFsIEdyaWREYXRhIGhlbHBCdXR0b25MYXlvdXQgPSBuZXcgR3JpZERhdGEoKTsNCisJCWhlbHBCdXR0b25MYXlvdXQudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJaGVscEJ1dHRvbi5zZXRMYXlvdXREYXRhKGhlbHBCdXR0b25MYXlvdXQpOw0KKwl9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9TVEVNV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51aS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91aS93aXphcmRzL1NURU1XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzMDhlZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9TVEVNV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZS5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51aS53aXphcmRzOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZTsNCisNCitwdWJsaWMgY2xhc3MgU1RFTVdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlIHsNCisNCisJcHVibGljIFNURU1XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlKFN0cmluZyBwYWdlTmFtZSkgew0KKwkJc3VwZXIocGFnZU5hbWUpOw0KKwl9DQorDQorCUBPdmVycmlkZQ0KKwkgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KKwkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOw0KKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChnZXRDb250cm9sKCksICJvcmcuZWNsaXBzZS5zdGVtLmRvYy5uZXdzdGVtcHJvamVjdF9jb250ZXh0aWQiKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdWkvd2l6YXJkcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZjNlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3VpL3dpemFyZHMvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDIzMiBAQAorIyBXaXphcmRNZXNzYWdlcy5wcm9wZXJ0aWVzCisjCisjLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgKgorIyAqIENvbnRyaWJ1dG9yczoKKyMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyMgTmV3IFByb2plY3QgV2l6YXJkCitOU1RFTVByb1dpei5wYWdlX3RpdGxlID0gU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgbmV3IFNURU0gUHJvamVjdAorTlNURU1Qcm9XaXoudGl0bGUgPSBDcmVhdGUgYSBTVEVNIHByb2plY3QKK05TVEVNUHJvV2l6LnBhZ2VfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgU1RFTSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2Ugb3IgaW4gYW4gZXh0ZXJuYWwgbG9jYXRpb24uCitOU1RFTVByb1dpei5jcmVhdGluZ19kaXJlY3RvcmllcyA9IENyZWF0aW5nIHByb2plY3QgZGlyZWN0b3JpZXMKK05TVEVNUHJvV2l6LmNyZWF0aW5nX3Byb2plY3QgPSBDcmVhdGluZyBuZXcgU1RFTSBwcm9qZWN0CisKK05TVEVNUHJvV2l6LmdyYXBoX2ZvbGRlciA9IEdyYXBocworTlNURU1Qcm9XaXoubW9kZWxfZm9sZGVyID0gTW9kZWxzCitOU1RFTVByb1dpei5zY2VuYXJpb19mb2xkZXIgPSBTY2VuYXJpb3MKK05TVEVNUHJvV2l6LmRlY29yYXRvcl9mb2xkZXIgPSBEZWNvcmF0b3JzCitOU1RFTVByb1dpei5DcmVhdGVfUHJvYmxlbT1Qcm9ibGVtIGNyZWF0aW5nIHByb2plY3QKKworIyBOZXcgSWRlbnRpZmllciBXaXphcmQgKHN1cGVyIGNsYXNzIHRvIEdyYXBoL01vZGVsL1NjZW5hcmlvIHdpemFyZHMKK05JZFdpei5jcmVhdGluZz1DcmVhdGluZworTklkV2l6LmJyb3dzZT1Ccm93c2UKK05JZFdpei5wcm9qZWN0PVByb2plY3QKK05JZFdpei5uYW1lPU5hbWUKK05JZFdpei5ub1Byb2pFcnI9Tm8gcHJvamVjdHMgZXhpc3QKK05JZFdpei5uYW1lTWlzc2luZ0Vycj1OYW1lIGlzIG1pc3NpbmcKK05JZFdpei5uYW1lRXJyPUludmFsaWQgTmFtZQorTklkV2l6LnNhdmVFcnI9UHJvYmxlbSBTYXZpbmcKKworIyBEdWJsaW4gQ29yZSBQYWdlCitORHVibGluQ29yZS5wYWdlX3RpdGxlID0gRHVibGluIENvcmUKK05EdWJsaW5Db3JlLnBhZ2VfZGVzY3JpcHRpb24gPSBJbml0aWFsaXplIHRoZSBEdWJsaW4gQ29yZSBNZXRhZGF0YS4KKworTkR1YmxpbkNvcmUudGl0bGU9VGl0bGUKK05EdWJsaW5Db3JlLnRpdGxlRGVzYz1BIG5hbWUgZ2l2ZW4gdG8gdGhlIHJlc291cmNlLiAgVXN1YWxseSB0aGUgZm9ybWFsIG5hbWUgb2YgdGhlIHJlc291cmNlLgorTkR1YmxpbkNvcmUuZGVzYz1EZXNjcmlwdGlvbgorTkR1YmxpbkNvcmUuZGVzY0Rlc2M9QW4gYWNjb3VudCBvZiB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuICBUeXBpY2FsbHkgYSBzaG9ydCBhYnN0cmFjdC4KK05EdWJsaW5Db3JlLmNyZWF0b3I9Q3JlYXRvcgorTkR1YmxpbkNvcmUuY3JlYXRvckRlc2M9QW4gZW50aXR5IHByaW1hcmlseSByZXNwb25zaWJsZSBmb3IgbWFraW5nIHRoZSBjb250ZW50IG9mIHRoZSByZXNvdXJjZS4gIFR5cGljYWxseSB0aGUgbmFtZSBvZiBhIHBlcnNvbiBvciBvcmdhbml6YXRpb24uCitORHVibGluQ29yZS5kYXRlPURhdGUKK05EdWJsaW5Db3JlLmRhdGVEZXNjPUEgZGF0ZSBhc3NvY2lhdGVkIHdpdGggYW4gZXZlbnQgaW4gdGhlIGxpZmUgY3ljbGUgb2YgdGhlIHJlc291cmNlLiAgVHlwaWNhbGx5IFlZWVktTU0tREQuIGUuZy4gMjAwNy0wMS0xOAorTkR1YmxpbkNvcmUudmFsaWQ9VmFsaWQKK05EdWJsaW5Db3JlLnZhbGlkRGVzYz1EYXRlIChvZnRlbiBhIHJhbmdlKSBvZiB2YWxpZGl0eSBvZiBhIHJlc291cmNlLiBlLmcuIHN0YXJ0PTIwMDYtMDMtMjk7IGVuZD0yMDA2LTAzLTMwOyBvciBzaW1wbHkgc3RhcnQ9MjAwNi0wMy0yOTsgaWYgdGhlcmUgaXMgbm8gZW5kIHRvIHRoZSB2YWxpZGl0eS4KK05EdWJsaW5Db3JlLmNyZWF0ZWQ9Q3JlYXRlZAorTkR1YmxpbkNvcmUuY3JlYXRlZERlc2M9VGhlIGNyZWF0aW9uIGRhdGUgb2YgdGhlIHJlc291cmNlLiAgVHlwaWNhbGx5IFlZWVktTU0tREQuIGUuZy4gMjAwNy0wMS0xOAorTkR1YmxpbkNvcmUuc291cmNlPVNvdXJjZQorTkR1YmxpbkNvcmUuc291cmNlRGVzYz1BIHJlZmVyZW5jZSB0byBhIHJlc291cmNlIGZyb20gd2hpY2ggdGhlIHByZXNlbnQgcmVzb3VyY2UgaXMgZGVyaXZlZC4gVGhlIG9yaWdpbmFsIHNvdXJjZSBvZiB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlLiBlLmcuIGEgVVJMLgorTkR1YmxpbkNvcmUucHVibGlzaGVyPVB1Ymxpc2hlcgorTkR1YmxpbkNvcmUucHVibGlzaGVyRGVzYz1BbiBlbnRpdHkgcmVzcG9uc2libGUgZm9yIG1ha2luZyB0aGUgcmVzb3VyY2UgYXZhaWxhYmxlLiAgVHlwaWNhbGx5IHRoZSBuYW1lIG9mIGEgcGVyc29uLCBvcmdhbml6YXRpb24gb3Igc2VydmljZS4KK05EdWJsaW5Db3JlLmNvdmVyYWdlPUNvdmVyYWdlCitORHVibGluQ29yZS5jb3ZlcmFnZURlc2M9VGhlIGV4dGVudCBvciBzY29wZSBvZiB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuICBDb3VsZCBpbmNsdWRlIHNwYXRpYWwgbG9jYXRpb24sIHRlbXBvcmFsIHBlcmlvZCAoZGF0ZSBvciBkYXRlIHJhbmdlKSwganVyaXNkaWN0aW9uLCBldGMuCitORHVibGluQ29yZS5jb250cmlidXRvcj1Db250cmlidXRvcgorTkR1YmxpbkNvcmUuY29udHJpYnV0b3JEZXNjPUFuIGVudGl0eSByZXNwb25zaWJsZSBmb3IgbWFraW5nIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHJlc291cmNlLiAgVHlwaWNhbGx5IHRoZSBuYW1lIG9mIGEgcGVyc29uLCBvcmdhbml6YXRpb24gb3Igc2VydmljZS4KK05EdWJsaW5Db3JlLnJlbGF0aW9uPVJlbGF0aW9uCitORHVibGluQ29yZS5yZWxhdGlvbkRlc2M9QSByZWZlcmVuY2UgdG8gYSByZWxhdGVkIHJlc291cmNlLiBlLmcuIGEgVVJMCitORHVibGluQ29yZS5yaWdodHM9UmlnaHRzCitORHVibGluQ29yZS5yaWdodHNEZXNjPUluZm9ybWF0aW9uIGFib3V0IHJpZ2h0cyBoZWxkIGluIGFuZCBvdmVyIHRoZSByZXNvdXJjZS4gIFR5cGljYWxseSwgYSByaWdodHMgbWFuYWdlbWVudCBzdGF0ZW1lbnQuIGUuZy4gQ29weXJpZ2h0IEZvb0JhciAyMDA2CitORHVibGluQ29yZS5zdWJqZWN0PVN1YmplY3QKK05EdWJsaW5Db3JlLnN1YmplY3REZXNjPVRoZSB0b3BpYyBvZiB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuICBUeXBpY2FsbHkga2V5d29yZHMgb3IgY2xhc3NpZmljYXRpb24gY29kZXMuCitORHVibGluQ29yZS5sYW5ndWFnZT1MYW5ndWFnZQorTkR1YmxpbkNvcmUubGFuZ3VhZ2VEZXNjPUEgbGFuZ3VhZ2Ugb2YgdGhlIGludGVsbGVjdHVhbCBjb250ZW50IG9mIHRoZSByZXNvdXJjZS4gZS5nLiBlbi1HQgorTkR1YmxpbkNvcmUuY2l0YXRpb249Q2l0YXRpb24KK05EdWJsaW5Db3JlLmNpdGF0aW9uRGVzYz1BIGJpYmxpb2dyYXBoaWMgcmVmZXJlbmNlIGZvciB0aGUgcmVzb3VyY2UuCitORHVibGluQ29yZS5saWNlbnNlPUxpY2Vuc2UKK05EdWJsaW5Db3JlLmxpY2Vuc0Rlc2M9QSBsZWdhbCBkb2N1bWVudCBnaXZpbmcgb2ZmaWNpYWwgcGVybWlzc2lvbiB0byBkbyBzb21ldGhpbmcgd2l0aCB0aGUgcmVzb3VyY2UuCitORHVibGluQ29yZS5yZXF1aXJlZD1SZXF1aXJlZAorTkR1YmxpbkNvcmUucmVxdWlyZWREZXNjPVRoZSBkZXNjcmliZWQgcmVzb3VyY2UgcmVxdWlyZXMgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2UgdG8gc3VwcG9ydCBpdHMgZnVuY3Rpb24sIGRlbGl2ZXJ5LCBvciBjb2hlcmVuY2Ugb2YgY29udGVudC4KK05EdWJsaW5Db3JlLnNwYXRpYWw9U3BhdGlhbAorTkR1YmxpbkNvcmUuc3BhdGlhbERlc2M9U3BhdGlhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGludGVsbGVjdHVhbCBjb250ZW50IG9mIHRoZSByZXNvdXJjZS4KK05EdWJsaW5Db3JlLmZvcm1hdD1Gb3JtYXQKK05EdWJsaW5Db3JlLmZvcm1hdERlc2M9QSBwcmVkZWZpbmVkLCBTVEVNIHNwZWNpZmljLCBVUkkgdGhhdCB1bmlxdWVseSBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGUgcmVzb3VyY2UuIE5vdCB1c2VyIGRlZmluZWQuCitORHVibGluQ29yZS50eXBlPVR5cGUKK05EdWJsaW5Db3JlLnR5cGVEZXNjPUEgcHJlZGVmaW5lZCwgU1RFTSBzcGVjaWZpYywgVVJJIHRoYXQgdW5pcXVlbHkgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZS4gTm90IHVzZXIgZGVmaW5lZC4KK05EdWJsaW5Db3JlLnJlcXVpcmVkRmllbGQ9cmVxdWlyZWQgZmllbGQKKworTkR1YmxpbkNvcmUudGl0bGVFcnI9VGhlIFRpdGxlIGlzIGVtcHR5LgorTkR1YmxpbkNvcmUuY3JlYXRlZEVycj1DcmVhdGVkIGRhdGUgbm90IGZvcm1hdHRlZCBjb3JyZWN0bHk6IFlZWVktTU0tREQKK05EdWJsaW5Db3JlLmRhdGVFcnI9RGF0ZSBub3QgZm9ybWF0dGVkIGNvcnJlY3RseTogWVlZWS1NTS1ERAorTkR1YmxpbkNvcmUudmFsaWRFcnI9VmFsaWQgZGF0ZSByYW5nZSBub3QgZm9ybWF0dGVkIGNvcnJlY3RseTogc3RhcnQ9WVlZWS1NTS1ERDsgb3Igc3RhcnQ9WVlZWS1NTS1ERDsgZW5kPVlZWVktTU0tREQ7CisKKworIyBNb2RlbCBXaXphcmQKK05Nb2RlbFdpei53aXphcmRfdGl0bGUgPSBOZXcgTW9kZWwKK05Nb2RlbFdpei5wYWdlX3RpdGxlID0gTW9kZWwKK05Nb2RlbFdpei5wYWdlX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IFNURU0gTW9kZWwgaW4gYSBwcm9qZWN0LgorTk1vZGVsV2l6LkRDX0RFU0NSSVBUSU9OID0gTW9kZWwgInswfSIKKworIyBNb2RlbCBTY2VuYXJpbworCitOU2NlbmFyaW9XaXoud2l6YXJkX3RpdGxlID0gTmV3IFNjZW5hcmlvCitOU2NlbmFyaW9XaXoucGFnZV90aXRsZSA9IFNjZW5hcmlvCitOU2NlbmFyaW9XaXoucGFnZV9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBTVEVNIFNjZW5hcmlvIGluIGEgcHJvamVjdC4KK05TY2VuYXJpb1dpei5EQ19ERVNDUklQVElPTiA9IFNjZW5hcmlvICJ7MH0iCitOU2NlbmFyaW9XaXouc29sdmVyID0gUGljayBhIHNvbHZlcgorCisjIE1vZGVsIFNlcXVlbmNlcgorTlNlcXVlbmNlcldpei5jeWNsZVRpbWUgPSBDeWNsZSBwZXJpb2QKK05TZXF1ZW5jZXJXaXoubWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzCitOU2VxdWVuY2VyV2l6Lm1pbGxpc2Vjb25kID0gbWlsbGlzZWNvbmQKK05TZXF1ZW5jZXJXaXouc2Vjb25kcyA9IHNlY29uZHMKK05TZXF1ZW5jZXJXaXouc2Vjb25kID0gc2Vjb25kCitOU2VxdWVuY2VyV2l6Lm1pbnV0ZXMgPSBtaW51dGVzCitOU2VxdWVuY2VyV2l6Lm1pbnV0ZSA9IG1pbnV0ZQorTlNlcXVlbmNlcldpei5ob3VycyA9IGhvdXJzCitOU2VxdWVuY2VyV2l6LmhvdXIgPSBob3VyCitOU2VxdWVuY2VyV2l6LmRheXMgPSBkYXlzCitOU2VxdWVuY2VyV2l6LmRheSA9IGRheQorCisjIE1vZGVsIFNlcXVlbnRpYWwgU2VxdWVuY2VyCitOU2VxU2VxdWVuY2VyV2l6LmN5Y2xlVGltZUVyciA9IFRoZSBjeWNsZSB0aW1lIG11c3QgYmUgMSBvciBncmVhdGVyLgorTlNlcVNlcXVlbmNlcldpei5jeWNsZVRpbWVGb3JtYXRFcnIgPSBUaGUgY3ljbGUgdGltZSBpcyBub3QgYSB2YWxpZCBpbnRlZ2VyLgorTlNlcVNlcXVlbmNlcldpei53aXphcmRfdGl0bGUgPSBOZXcgU2VxdWVudGlhbCBTZXF1ZW5jZXIKK05TZXFTZXF1ZW5jZXJXaXoucGFnZV90aXRsZSA9IFNlcXVlbnRpYWwgU2VxdWVuY2VyCitOU2VxU2VxdWVuY2VyV2l6LnBhZ2VfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgU1RFTSBTZXF1ZW50aWFsIFNlcXVlbmNlciBpbiBhIHByb2plY3QuCitOU2VxU2VxdWVuY2VyV2l6LnN0YXJ0VGltZSA9IFN0YXJ0IERhdGUKK05TZXFTZXF1ZW5jZXJXaXouZW5kVGltZSA9IFNwZWNpZnkgRW5kIERhdGUKK05TZXFTZXF1ZW5jZXJXaXouc3RhcnREYXRlRXJyID0gU3RhcnQgRGF0ZSBub3QgZm9ybWF0dGVkIGNvcnJlY3RseTogWVlZWS1NTS1ERAorTlNlcVNlcXVlbmNlcldpei5taXNzaW5nU3RhcnREYXRlRXJyID0gVGhlIFN0YXJ0IGRhdGUgaXMgbWlzc2luZy4KK05TZXFTZXF1ZW5jZXJXaXouZW5kRGF0ZUVyciA9IEVuZCBEYXRlIG5vdCBmb3JtYXR0ZWQgY29ycmVjdGx5OiBZWVlZLU1NLURECitOU2VxU2VxdWVuY2VyV2l6LmVuZEJlZm9yZUVyciA9IFRoZSBlbmQgZGF0ZSBvY2N1cnMgYmVmb3JlIHRoZSBzdGFydCBkYXRlLgorTlNlcVNlcXVlbmNlcldpei5EQ19USVRMRTEgPSBTZXF1ZW50aWFsIFNlcXVlbmNlciAoU3RhcnQ6IHswfSwgRW5kOiB7MX0sIEN5Y2xlIFBlcmlvZDogezJ9KS4KK05TZXFTZXF1ZW5jZXJXaXouRENfVElUTEUyID0gU2VxdWVudGlhbCBTZXF1ZW5jZXIgKFN0YXJ0OiB7MH0sIEN5Y2xlIFBlcmlvZDogezF9KS4KK05TZXFTZXF1ZW5jZXJXaXouRENfREVTQ1JJUFRJT04xID0gU2VxdWVudGlhbCBTZXF1ZW5jZXIgc3RhcnRpbmcgZnJvbSB7MH0gdG8gezF9IHdpdGggYSBjeWNsZSBwZXJpb2Qgb2YgezJ9LgorTlNlcVNlcXVlbmNlcldpei5EQ19ERVNDUklQVElPTjIgPSBTZXF1ZW50aWFsIFNlcXVlbmNlciBzdGFydGluZyBmcm9tIHswfSwgd2l0aCBubyBlbmQgYW5kIGEgY3ljbGUgcGVyaW9kIG9mIHsxfS4KKworIyBNb2RlbCBSZWFsLVRpbWUgU2VxdWVuY2VyCitOUlRTZXF1ZW5jZXJXaXoud2l6YXJkX3RpdGxlID0gTmV3IFJlYWwtVGltZSBTZXF1ZW5jZXIKK05TUlRTZXF1ZW5jZXJXaXouRENfVElUTEUgPSBSZWFsLVRpbWUgU2VxdWVuY2VyIChDeWNsZSBQZXJpb2Q6IHswfSkuCitOU1JUU2VxdWVuY2VyV2l6LkRDX0RFU0NSSVBUSU9OMSA9IFJlYWwtVGltZSBTZXF1ZW5jZXIgc3RhcnRpbmcgZnJvbSB0aGUgY3VycmVudCBkYXRlL3RpbWUsIHdpdGggYSBjeWNsZSBwZXJpb2Qgb2YgezB9LgorCisjIE1vZGVsIEV4cGVyaW1lbnQKK05FeHBlcmltZW50V2l6LndpemFyZF90aXRsZSA9IE5ldyBFeHBlcmltZW50CitORXhwZXJpbWVudFdpei5wYWdlX3RpdGxlID0gRXhwZXJpbWVudAorTkV4cGVyaW1lbnRXaXoucGFnZV9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBTVEVNIEV4cGVyaW1lbnQgaW4gYSBwcm9qZWN0CitORXhwZXJpbWVudFdpei5EQ19ERVNDUklQVElPTiA9IEV4cGVyaW1lbnQgInswfSIKKworIyBNb2RpZmllcgorTk1vZGlmaWVyV2l6LndpemFyZF90aXRsZSA9IE5ldyBNb2RpZmllcgorTk1vZGlmaWVyV2l6LnBhZ2VfdGl0bGUgPSBNb2RpZmllcgorTk1vZGlmaWVyV2l6LnBhZ2VfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgU1RFTSBNb2RpZmllciBpbiBhIHByb2plY3QKK05Nb2RpZmllcldpei5EQ19ERVNDUklQVElPTiA9IE1vZGlmaWVyICJ7MH0iCisKKyMgVHJpZ2dlcgorTlRyaWdnZXJXaXoud2l6YXJkX3RpdGxlID0gTmV3IFRyaWdnZXIKK05UcmlnZ2VyV2l6LnBhZ2VfdGl0bGUgPSBUcmlnZ2VyCitOVHJpZ2dlcldpei5wYWdlX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IFNURU0gVHJpZ2dlciBpbiBhIHByb2plY3QKK05UcmlnZ2VyV2l6LkRDX0RFU0NSSVBUSU9OID0gVHJpZ2dlciAiezB9IgorCisjIFByZWRpY2F0ZQorTlByZWRpY2F0ZVdpei53aXphcmRfdGl0bGUgPSBOZXcgUHJlZGljYXRlCitOUHJlZGljYXRlV2l6LnBhZ2VfdGl0bGUgPSBQcmVkaWNhdGUKK05QcmVkaWNhdGVXaXoucGFnZV9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBTVEVNIFByZWRpY2F0ZSBpbiBhIHByb2plY3QKK05QcmVkaWNhdGVXaXouRENfREVTQ1JJUFRJT04gPSBQcmVkaWNhdGUgInswfSIKKworIyBNb2RpZmllcnMKK1JhbmdlLnR5cGUgPSBSYW5nZQorU2VxdWVuY2UudHlwZSA9IFNlcXVlbmNlCitTaW5nbGUudHlwZSA9IFNpbmdsZQorCisKKyMgTWF0cml4IEVkaXRvcgorTWF0cml4LmludmFsaWQudmFsdWUgPSBJbnZhbGlkIFZhbHVlIHswfQorTWF0cml4LmRpYWxvZy5va2F5ID0gT2theQorTWF0cml4LmRpYWxvZy5jYW5jZWwgPSBDYW5jZWwKK01hdHJpeC5kaWFsb2cucGx1cyA9ICsKK01hdHJpeC5kaWFsb2cubWludXMgPSAtCisKKyNMb2NhdGlvbiBwaWNrZXIKK05Mb2NXaXpJU09LID0gSVNPIEtleQorTkxvY1dpekNOVFJZID0gQ291bnRyeQorTkxvY1dpekwxID0gTGV2ZWwgMQorTkxvY1dpekwyID0gTGV2ZWwgMgorTkxvY1dpekwzID0gTGV2ZWwgMworTkxvY1dpek9rID0gT2theQorTkxvY1dpekNhbmNlbCA9IENhbmNlbAorTkxvY1BpY2tlcldpei5nbG9iYWwgPSBTZWxlY3QgR2xvYmFsbHkKK05Mb2NQaWNrZXJXaXouaW5wcm9qZWN0ID0gU2VsZWN0IFdpdGhpbiBQcm9qZWN0CitOTG9jUGlja2VyV2l6LmdldHRpbmdMb2NhdGlvbnMgPSBSZXRyaWV2aW5nIGxpc3Qgb2YgbG9jYXRpb25zIGZvciBjdXJyZW50IHByb2plY3QuLi4KKworI1JlbmFtZS9jb3B5IGRpYWxvZworUmVuYW1lLmRpYWxvZy5va2F5ID0gT2theQorUmVuYW1lLmRpYWxvZy5jYW5jZWwgPSBDYW5jZWwKK3JlbmFtZSA9IFJlbmFtZSBGaWxlCitjb3B5ID0gQ29weSBGaWxlCisKKyMgR3JhcGggR2VuZXJhdG9ycworR0dEQy4wPVNvdXJjZQorR0dEQy4yPWNsYXNzCitHR0RDLjM9UHJvYmxlbSBjcmVhdGluZyBHcmFwaCBHZW5lcmF0b3IgaW5zdGFuY2UKK1lFUyA9IFllcworTk8gPSBObworTkdGV2l6LkRDX0RFU0NSSVBUSU9OID0gR3JhcGgKKworIyBMYXR0aWNlIGdyYXBoIGdlbmVyYXRvcgoreFNpemUgPSBYIFNpemUKK3lTaXplID0gWSBTaXplCit4U2l6ZVVOSVQgPSBHcmlkcworeVNpemVVTklUID0gR3JpZHMKK3hTaXplVFQgPSBOdW1iZXIgb2YgZ3JpZHMgYWxvbmcgWCBheGlzCit5U2l6ZVRUID0gTnVtYmVyIG9mIGdyaWRzIGFsb25nIFkgYXhpcwordXNlTmVhcmVzdE5laWdoYm9ycyA9IE5lYXJlc3QgTmVpZ2hib3JzCit1c2VOZWFyZXN0TmVpZ2hib3JzVU5JVCA9IAordXNlTmVhcmVzdE5laWdoYm9yc1RUID0gQ29ubmVjdCBncmlkcyB3aXRoIG5lYXJlc3QgbmVpZ2hib3IgZWRnZXMKK3VzZU5leHROZWFyZXN0TmVpZ2hib3JzID0gTmV4dCBOZWFyZXN0IE5laWdoYm9ycwordXNlTmV4dE5lYXJlc3ROZWlnaGJvcnNVTklUID0gCit1c2VOZXh0TmVhcmVzdE5laWdoYm9yc1RUID0gQ29ubmVjdCBncmlkcyB1c2luZyBuZXh0IG5lYXJlc3QgbmVpZ2hib3IgZWRnZXMKK3BlcmlvZGljQm91bmRhcmllcyA9IFBlcmlvZGljIEJvdW5kYXJpZXMKK3BlcmlvZGljQm91bmRhcmllc1VOSVQgPSAKK3BlcmlvZGljQm91bmRhcmllc1RUID0gVXNlIFBlcmlvZGljIEJvdW5kYXJpZXMKKworIyBGb3IgZ2VuZXJpYyBwcm9wZXJ0eSBlZGl0b3IKK2ZpbGVDaG9vc2VyQnV0dG9uVGV4dD1TZWxlY3QgRmlsZS4uLgorZGlyQ2hvb3NlckJ1dHRvblRleHQ9U2VsZWN0IERpcmVjdG9yeS4uLgorZmlsZUNob29zZXJCdXR0b25Ub29sdGlwVGV4dD1BIGZpbGUgaXMgYmVpbmcgdXNlZCBmb3IgbG9hZGluZyBkYXRhIGZvciBvbmUgc3BlY2lmaWMgbm9kZQorZGlyQ2hvb3NlckJ1dHRvblRvb2x0aXBUZXh0PUEgZGlyZWN0b3J5IGlzIGJlaW5nIHVzZWQgZm9yIGxvYWRpbmcgYSBjb2xsZWN0aW9uIG9mIGZpbGVzICh1c3VhbGx5IGZvciBtb3JlIHRoYW4gb25lIG5vZGUpCitmaWxlQ2hvb3NlckRpYWxvZ1RpdGxlPVNlbGVjdCBDU1YgRmlsZQorZGlyQ2hvb3NlckRpYWxvZ1RpdGxlPVNlbGVjdCBEaXJlY3RvcnkKK05QaWNrTG9jID0gUGljaworTlBpY2tMb2NUaXRsZSA9IFBpY2sgYSBsb2NhdGlvbgorCisjRG91YmxlIGFuZCBzdHJpbmcgdmFsdWVzCitpZGVudGlmaWVyID0gSWRlbnRpZmllcgoraWRlbnRpZmllclVOSVQgPSAKK3ZhbHVlID0gVmFsdWUKK3ZhbHVlVU5JVCA9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnVpL3N0ZW0ucHJvZHVjdCBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3RlbS5wcm9kdWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYzlhMzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3N0ZW0ucHJvZHVjdApAQCAtMCwwICsxLDIxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8P3BkZSB2ZXJzaW9uPSIzLjUiPz4NCisNCis8cHJvZHVjdCBuYW1lPSJTVEVNIiB1aWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkucHJvZHVjdCIgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkucHJvZHVjdCIgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLnN0ZW0udWkuQ29yZUVkaXRvckFkdmlzb3JBcHBsaWNhdGlvbiIgdmVyc2lvbj0iMS4wLjEiIHVzZUZlYXR1cmVzPSJmYWxzZSIgaW5jbHVkZUxhdW5jaGVycz0idHJ1ZSI+DQorDQorICAgPGFib3V0SW5mbz4NCisgICAgICA8aW1hZ2UgcGF0aD0iL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmNjRfNjRfMzIuZ2lmIi8+DQorICAgICAgPHRleHQ+DQorICAgICAgICAgU3BhdGlvLVRlbXBvcmFsIEVwaWRlbW9sb2dpY2FsL0V2ZW50IE1vZGVsZXIgKFNURU0pDQorICAgICAgPC90ZXh0Pg0KKyAgIDwvYWJvdXRJbmZvPg0KKw0KKyAgIDxjb25maWdJbmkgdXNlPSJkZWZhdWx0Ij4NCisgICA8L2NvbmZpZ0luaT4NCisNCisgICA8bGF1bmNoZXJBcmdzPg0KKyAgICAgIDx2bUFyZ3M+LVhtczQwME0gLVhteDYwME08L3ZtQXJncz4NCisgICA8L2xhdW5jaGVyQXJncz4NCisNCisgICA8d2luZG93SW1hZ2VzIGkxNj0iL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmMTZfMTZfMzIuZ2lmIiBpMzI9Ii9vcmcuZWNsaXBzZS5zdGVtLnVpL2JyYW5kaW5nL29oZjMyXzMyXzMyLmdpZiIgaTQ4PSIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGY0OF80OF8zMi5naWYiIGk2ND0iL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmNjRfNjRfMzIuZ2lmIiBpMTI4PSIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGYxMjhfMTI4XzMyLmdpZiIvPg0KKw0KKyAgIDxzcGxhc2gNCisgICAgICBsb2NhdGlvbj0ib3JnLmVjbGlwc2Uuc3RlbS51aSINCisgICAgICBzdGFydHVwUHJvZ3Jlc3NSZWN0PSIwLDQxMyw0MzEsMTUiDQorICAgICAgc3RhcnR1cE1lc3NhZ2VSZWN0PSIxMCwzODAsNDMxLDIwIg0KKyAgICAgIHN0YXJ0dXBGb3JlZ3JvdW5kQ29sb3I9IkZGRkZGRiIgLz4NCisgICA8bGF1bmNoZXIgbmFtZT0iU1RFTSI+DQorICAgICAgPHNvbGFyaXMvPg0KKyAgICAgIDx3aW4gdXNlSWNvPSJmYWxzZSI+DQorICAgICAgICAgPGJtcA0KKyAgICAgICAgICAgIHdpblNtYWxsTG93PSIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGYxNl8xNl84LmJtcCINCisgICAgICAgICAgICB3aW5NZWRpdW1Mb3c9Ii9vcmcuZWNsaXBzZS5zdGVtLnVpL2JyYW5kaW5nL29oZjMyXzMyXzguYm1wIg0KKyAgICAgICAgICAgIHdpbkxhcmdlTG93PSIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGY0OF80OF84LmJtcCIvPg0KKyAgICAgIDwvd2luPg0KKyAgIDwvbGF1bmNoZXI+DQorDQorICAgPHZtPg0KKyAgIDwvdm0+DQorDQorICAgPHBsdWdpbnM+DQorICAgICAgPHBsdWdpbiBpZD0iY29tLmlibS5pY3UiLz4NCisgICAgICA8cGx1Z2luIGlkPSJqYXZheC5zZXJ2bGV0Ii8+DQorICAgICAgPHBsdWdpbiBpZD0iamF2YXguc2VydmxldC5qc3AiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMuZWwiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5hcGFjaGUuamFzcGVyIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmFwYWNoZS5sdWNlbmUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuYmlydC5jaGFydC5kZXZpY2Uuc3d0Ii8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuYmlydC5jaGFydC5lbmdpbmUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmVuZ2luZS5leHRlbnNpb24iLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5iaXJ0LmNvcmUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5iaXJ0LmNvcmUudWkiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZS5jb3JlIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5vYnNlcnZhYmxlIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5wcm9wZXJ0eSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLmxpbnV4Lng4NiIgZnJhZ21lbnQ9InRydWUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0ubGludXgueDg2XzY0IiBmcmFnbWVudD0idHJ1ZSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5tYWNvc3giIGZyYWdtZW50PSJ0cnVlIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLndpbjMyLng4NiIgZnJhZ21lbnQ9InRydWUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0ud2luMzIueDg2XzY0IiBmcmFnbWVudD0idHJ1ZSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUuam9icyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUubmV0Ii8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5uZXQubGludXgueDg2IiBmcmFnbWVudD0idHJ1ZSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUubmV0LndpbjMyLng4NiIgZnJhZ21lbnQ9InRydWUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLm5ldC53aW4zMi54ODZfNjQiIGZyYWdtZW50PSJ0cnVlIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5jb21wYXRpYmlsaXR5IiBmcmFnbWVudD0idHJ1ZSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLndpbjMyLng4NiIgZnJhZ21lbnQ9InRydWUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5yZWdpc3RyeSIgZnJhZ21lbnQ9InRydWUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVjZiIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHkiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2Zlci5zc2wiIGZyYWdtZW50PSJ0cnVlIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZWNmLnNzbCIgZnJhZ21lbnQ9InRydWUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0Ii8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Ii8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQudWkiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLmpldHR5Ii8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnJlZ2lzdHJ5Ii8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmpzcC5qYXNwZXIiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmpzcC5qYXNwZXIucmVnaXN0cnkiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVwb3NpdG9yeSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXMiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5Ii8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5zZWN1cml0eSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkubWFjb3N4IiBmcmFnbWVudD0idHJ1ZSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkud2luMzIueDg2IiBmcmFnbWVudD0idHJ1ZSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmhlbHAiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlciIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmhlbHAudWkiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcCIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpmYWNlIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmciLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmciLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmciLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5vc2dpIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmF1dG9tYXRpY2V4cGVyaW1lbnQiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZGlzZWFzZW1vZGVscy5tb2RlbHMiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZGlzZWFzZW1vZGVscy5zY2VuYXJpb3MiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5Ii8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5pbmZyYXN0cnVjdHVyZS50cmFuc3BvcnRhdGlvbiIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkubW9kZWxzIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5wb3B1bGF0aW9uLmh1bWFuIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeS5wb3B1bGF0aW9uLmh1bWFuLm1vZGVscyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5wb3B1bGF0aW9uLmh1bWFuIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leGFtcGxlIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLmV4cGVyaW1lbnRhbCIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5leHRlcm5hbGRhdGFzb3VyY2UiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuZm9yY2luZyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24iLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2VzIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5kb2MiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZ3JhcGhnZW5lcmF0b3JzIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlb2dyYXBoeSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW9ncmFwaHkuaW5mcmFzdHJ1Y3R1cmUudHJhbnNwb3J0YXRpb24iLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VvZ3JhcGh5Lm1vZGVscyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW9ncmFwaHkucG9wdWxhdGlvbiIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW9ncmFwaHkucG9wdWxhdGlvbi5odW1hbiIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5nZW9ncmFwaHkucG9wdWxhdGlvbi5odW1hbi5tb2RlbHMiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRpc2Vhc2Vtb2RlbHMubW9kZWxzIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kaXNlYXNlbW9kZWxzLnNjZW5hcmlvcyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uam9icyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDEiIGZyYWdtZW50PSJ0cnVlIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5zZXF1ZW5jZXJzIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLmZkIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5zb2x2ZXJzLnJrIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmV4YW1wbGUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmRpc2Vhc2Vtb2RlbHMuZXh0ZXJuYWxkYXRhc291cmNlIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLmZvcmNpbmcuZWRpdG9yIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5kaXNlYXNlbW9kZWxzLm11bHRpcG9wdWxhdGlvbiIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuZ2UiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLmdyYXBoZ2VuZXJhdG9ycyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkubmwxIiBmcmFnbWVudD0idHJ1ZSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkucG9wdWxhdGlvbm1vZGVscyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkucmVwb3J0cyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5mZCIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuc29sdmVycy5yayIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0Ii8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0LmNhcmJvbi5tYWNvc3giIGZyYWdtZW50PSJ0cnVlIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0LmNvY29hLm1hY29zeCIgZnJhZ21lbnQ9InRydWUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QuY29jb2EubWFjb3N4Lng4Nl82NCIgZnJhZ21lbnQ9InRydWUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLmxpbnV4Lng4NiIgZnJhZ21lbnQ9InRydWUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLmxpbnV4Lng4Nl82NCIgZnJhZ21lbnQ9InRydWUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3Qud2luMzIud2luMzIueDg2IiBmcmFnbWVudD0idHJ1ZSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC53aW4zMi53aW4zMi54ODZfNjQiIGZyYWdtZW50PSJ0cnVlIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudGVhbS51aSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnRleHQiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51aSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLmNhcmJvbiIgZnJhZ21lbnQ9InRydWUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51aS5jb2NvYSIgZnJhZ21lbnQ9InRydWUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkuZm9ybXMiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51aS5pbnRybyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbCIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvciIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLmxvZyIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkud2luMzIiIGZyYWdtZW50PSJ0cnVlIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIi8+DQorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eCIgZnJhZ21lbnQ9InRydWUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMiIgZnJhZ21lbnQ9InRydWUiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcuaGFtY3Jlc3QuY29yZSIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5qdW5pdCIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5tb3J0YmF5LmpldHR5LnNlcnZlciIvPg0KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5tb3J0YmF5LmpldHR5LnV0aWwiLz4NCisgICAgICA8cGx1Z2luIGlkPSJvcmcubW96aWxsYS5yaGlubyIvPg0KKyAgIDwvcGx1Z2lucz4NCisNCisNCis8L3Byb2R1Y3Q+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51aS9zdGVtTGludXgucHJvZHVjdCBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3RlbUxpbnV4LnByb2R1Y3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI1ZmY2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udWkvc3RlbUxpbnV4LnByb2R1Y3QKQEAgLTAsMCArMSwxMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P3BkZSB2ZXJzaW9uPSIzLjQiPz4KKworPHByb2R1Y3QgbmFtZT0iU1RFTSIgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkucHJvZHVjdCIgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLnN0ZW0udWkuQ29yZUVkaXRvckFkdmlzb3JBcHBsaWNhdGlvbiIgdXNlRmVhdHVyZXM9ImZhbHNlIj4KKworICAgPGFib3V0SW5mbz4KKyAgICAgIDxpbWFnZSBwYXRoPSIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9zdGVtQWJvdXQuZ2lmIi8+CisgICAgICA8dGV4dD4KKyAgICAgICAgIFRoaXMgaXMgYWxsIGFib3V0IFNURU0KKyAgICAgIDwvdGV4dD4KKyAgIDwvYWJvdXRJbmZvPgorCisgICA8Y29uZmlnSW5pIHVzZT0iZGVmYXVsdCIgcGF0aD0icGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pIi8+CisKKyAgIDxsYXVuY2hlckFyZ3M+CisgICAgICA8dm1BcmdzPi1YbXM3NjhNIC1YbXg3NjhNPC92bUFyZ3M+CisgICA8L2xhdW5jaGVyQXJncz4KKworICAgPHdpbmRvd0ltYWdlcyBpMTY9Ii9vcmcuZWNsaXBzZS5zdGVtLnVpL2JyYW5kaW5nL29oZjE2XzE2XzMyLmdpZiIgaTMyPSIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGYzMl8zMl8zMi5naWYiIGk0OD0iL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmNDhfNDhfMzIuZ2lmIiBpNjQ9Ii9vcmcuZWNsaXBzZS5zdGVtLnVpL2JyYW5kaW5nL29oZjY0XzY0XzMyLmdpZiIgaTEyOD0iL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmMTI4XzEyOF8zMi5naWYiLz4KKworICAgPHNwbGFzaAorICAgICAgbG9jYXRpb249Im9yZy5lY2xpcHNlLnN0ZW0udWkiCisgICAgICBzdGFydHVwUHJvZ3Jlc3NSZWN0PSIwLDQxMyw0MzEsMTUiCisgICAgICBzdGFydHVwTWVzc2FnZVJlY3Q9IjEwLDM4MCw0MzEsMjAiCisgICAgICBzdGFydHVwRm9yZWdyb3VuZENvbG9yPSJGRkZGRkYiIC8+CisgICA8bGF1bmNoZXIgbmFtZT0iU1RFTSI+CisgICAgICA8bGludXggaWNvbj0iL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvc3BsYXNoLnhwbSIvPgorICAgICAgPHNvbGFyaXMvPgorICAgICAgPHdpbiB1c2VJY289ImZhbHNlIj4KKyAgICAgICAgIDxibXAKKyAgICAgICAgICAgIHdpblNtYWxsTG93PSIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGYxNl8xNl84LmJtcCIKKyAgICAgICAgICAgIHdpbk1lZGl1bUxvdz0iL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmMzJfMzJfOC5ibXAiCisgICAgICAgICAgICB3aW5MYXJnZUxvdz0iL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmNDhfNDhfOC5ibXAiLz4KKyAgICAgIDwvd2luPgorICAgPC9sYXVuY2hlcj4KKworICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luIGlkPSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQiLz4KKyAgICAgIDxwbHVnaW4gaWQ9ImNvbS5pYm0uaWN1Ii8+CisgICAgICA8cGx1Z2luIGlkPSJjb20uaWJtLmljdS5zb3VyY2UiLz4KKyAgICAgIDxwbHVnaW4gaWQ9ImNvbS5qY3JhZnQuanNjaCIvPgorICAgICAgPHBsdWdpbiBpZD0iY29tLmxvd2FnaWUuaXRleHQiLz4KKyAgICAgIDxwbHVnaW4gaWQ9ImphdmF4LnNlcnZsZXQiLz4KKyAgICAgIDxwbHVnaW4gaWQ9ImphdmF4LnNlcnZsZXQuanNwIi8+CisgICAgICA8cGx1Z2luIGlkPSJqYXZheC54bWwiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im5ldC5zb3VyY2Vmb3JnZS5scGcubHBnamF2YXJ1bnRpbWUiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5hcGFjaGUuYW50Ii8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMuZWwiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuYXBhY2hlLmphc3BlciIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmFwYWNoZS5sdWNlbmUiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuYXBhY2hlLnhlcmNlcyIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmFwYWNoZS54bWwucmVzb2x2ZXIiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZXIiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0iLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5saW51eC54ODYiIGZyYWdtZW50PSJ0cnVlIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmpvYnMiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUubmV0Ii8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLm5ldC5saW51eC54ODYiIGZyYWdtZW50PSJ0cnVlIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29tcGF0aWJpbGl0eSIgZnJhZ21lbnQ9InRydWUiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LmF1dGgiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LnJlZ2lzdHJ5IiBmcmFnbWVudD0idHJ1ZSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24iLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmNoYW5nZSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Ii8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5hcHAiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAucmVnaXN0cnkiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guanNwLmphc3BlciIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5qc3AuamFzcGVyLnJlZ2lzdHJ5Ii8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5Ii8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5Ii8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5oZWxwIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlciIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5oZWxwLnVpIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcCIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamZhY2UiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmNvcmUiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGF0YSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucyIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmpvYnMiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDEiIGZyYWdtZW50PSJ0cnVlIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcnMiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udGVzdHMudXRpbCIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS50cmFuc3BvcnQiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscyIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5nZSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEiIGZyYWdtZW50PSJ0cnVlIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5vc2dpIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5wZGUucnVudGltZSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmxpbnV4Lmd0ay54ODYiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnJjcC5zb3VyY2UiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnJjcC5zb3VyY2UubGludXguZ3RrLng4NiIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0Ii8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLmxpbnV4Lng4NiIgZnJhZ21lbnQ9InRydWUiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnRleHQiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnRvbWNhdCIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLmZvcm1zIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvciIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcyIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLmxvZyIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eCIgZnJhZ21lbnQ9InRydWUiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmp1bml0Ii8+CisgICA8L3BsdWdpbnM+CisKKzwvcHJvZHVjdD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udWkvc3RlbU1hY09TLnByb2R1Y3QgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3N0ZW1NYWNPUy5wcm9kdWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZWI4ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnVpL3N0ZW1NYWNPUy5wcm9kdWN0CkBAIC0wLDAgKzEsMTU1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9wZGUgdmVyc2lvbj0iMy41Ij8+CisKKzxwcm9kdWN0IG5hbWU9IlNURU0iIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnByb2R1Y3QiIGFwcGxpY2F0aW9uPSJvcmcuZWNsaXBzZS5zdGVtLnVpLkNvcmVFZGl0b3JBZHZpc29yQXBwbGljYXRpb24iIHVzZUZlYXR1cmVzPSJmYWxzZSIgaW5jbHVkZUxhdW5jaGVycz0idHJ1ZSI+CisKKyAgIDxhYm91dEluZm8+CisgICAgICA8aW1hZ2UgcGF0aD0iL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmNjRfNjRfMzIuZ2lmIi8+CisgICAgICA8dGV4dD4KKyAgICAgICAgIFNwYXRpby1UZW1wb3JhbCBFcGlkZW1vbG9naWNhbC9FdmVudCBNb2RlbGVyIChTVEVNKQorICAgICAgPC90ZXh0PgorICAgPC9hYm91dEluZm8+CisKKyAgIDxjb25maWdJbmkgdXNlPSJkZWZhdWx0Ij4KKyAgICAgIDxsaW51eD5wbHVnaW5fY3VzdG9taXphdGlvbi5pbmk8L2xpbnV4PgorICAgICAgPG1hY29zeD5wbHVnaW5fY3VzdG9taXphdGlvbi5pbmk8L21hY29zeD4KKyAgICAgIDxzb2xhcmlzPnBsdWdpbl9jdXN0b21pemF0aW9uLmluaTwvc29sYXJpcz4KKyAgICAgIDx3aW4zMj5wbHVnaW5fY3VzdG9taXphdGlvbi5pbmk8L3dpbjMyPgorICAgPC9jb25maWdJbmk+CisKKyAgIDxsYXVuY2hlckFyZ3M+CisgICAgICA8cHJvZ3JhbUFyZ3M+LWRlYnVnIC1jb25zb2xlTG9nPC9wcm9ncmFtQXJncz4KKyAgICAgIDx2bUFyZ3M+LVhtczUxMk0gLVhteDUxMk08L3ZtQXJncz4KKyAgIDwvbGF1bmNoZXJBcmdzPgorCisgICA8d2luZG93SW1hZ2VzIGkxNj0iL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmMTZfMTZfMzIuZ2lmIiBpMzI9Ii9vcmcuZWNsaXBzZS5zdGVtLnVpL2JyYW5kaW5nL29oZjMyXzMyXzMyLmdpZiIgaTQ4PSIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGY0OF80OF8zMi5naWYiIGk2ND0iL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmNjRfNjRfMzIuZ2lmIiBpMTI4PSIvb3JnLmVjbGlwc2Uuc3RlbS51aS9icmFuZGluZy9vaGYxMjhfMTI4XzMyLmdpZiIvPgorCisgICA8c3BsYXNoCisgICAgICBsb2NhdGlvbj0ib3JnLmVjbGlwc2Uuc3RlbS51aSIKKyAgICAgIHN0YXJ0dXBQcm9ncmVzc1JlY3Q9IjAsNDEzLDQzMSwxNSIKKyAgICAgIHN0YXJ0dXBNZXNzYWdlUmVjdD0iMTAsMzgwLDQzMSwyMCIKKyAgICAgIHN0YXJ0dXBGb3JlZ3JvdW5kQ29sb3I9IkZGRkZGRiIgLz4KKyAgIDxsYXVuY2hlciBuYW1lPSJTVEVNIj4KKyAgICAgIDxzb2xhcmlzLz4KKyAgICAgIDx3aW4gdXNlSWNvPSJmYWxzZSI+CisgICAgICAgICA8Ym1wCisgICAgICAgICAgICB3aW5TbWFsbExvdz0iL29yZy5lY2xpcHNlLnN0ZW0udWkvYnJhbmRpbmcvb2hmMTZfMTZfOC5ibXAiCisgICAgICAgICAgICB3aW5NZWRpdW1Mb3c9Ii9vcmcuZWNsaXBzZS5zdGVtLnVpL2JyYW5kaW5nL29oZjMyXzMyXzguYm1wIgorICAgICAgICAgICAgd2luTGFyZ2VMb3c9Ii9vcmcuZWNsaXBzZS5zdGVtLnVpL2JyYW5kaW5nL29oZjQ4XzQ4XzguYm1wIi8+CisgICAgICA8L3dpbj4KKyAgIDwvbGF1bmNoZXI+CisKKyAgIDx2bT4KKyAgIDwvdm0+CisKKyAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbiBpZD0iY29tLmlibS5pY3UiLz4KKyAgICAgIDxwbHVnaW4gaWQ9ImNvbS5sb3dhZ2llLml0ZXh0Ii8+CisgICAgICA8cGx1Z2luIGlkPSJqYXZheC5zZXJ2bGV0Ii8+CisgICAgICA8cGx1Z2luIGlkPSJqYXZheC5zZXJ2bGV0LmpzcCIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmFwYWNoZS5hbnQiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5hcGFjaGUuYmF0aWsucGRmIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5lbCIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmciLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5hcGFjaGUuamFzcGVyIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuYXBhY2hlLmx1Y2VuZSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5hcGFjaGUueGVyY2VzIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuYXBhY2hlLnhtbC5yZXNvbHZlciIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuYW50LmNvcmUiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmJpcnQuY2hhcnQuZGV2aWNlLmV4dGVuc2lvbiIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuYmlydC5jaGFydC5kZXZpY2Uuc3ZnIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmRldmljZS5zd3QiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmJpcnQuY2hhcnQuZW5naW5lIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmVuZ2luZS5leHRlbnNpb24iLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmJpcnQuY2hhcnQudWkiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmJpcnQuY2hhcnQudWkuZXh0ZW5zaW9uIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5iaXJ0LmNvcmUiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmJpcnQuY29yZS51aSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZyIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucyIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0ubWFjb3N4IiBmcmFnbWVudD0idHJ1ZSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLndpbjMyLng4NiIgZnJhZ21lbnQ9IiIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5qb2JzIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLm5ldCIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbXBhdGliaWxpdHkiIGZyYWdtZW50PSJ0cnVlIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy53aW4zMiIgZnJhZ21lbnQ9IiIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5hdXRoIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5yZWdpc3RyeSIgZnJhZ21lbnQ9InRydWUiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Ii8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5hcHAiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuamV0dHkiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5yZWdpc3RyeSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guanNwLmphc3BlciIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5qc3AuamFzcGVyLnJlZ2lzdHJ5Ii8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5Ii8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5oZWxwIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlciIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5oZWxwLnVpIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcCIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamR0LmNvbXBpbGVyLmFwdCIgZnJhZ21lbnQ9InRydWUiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb21waWxlci50b29sIiBmcmFnbWVudD0idHJ1ZSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpmYWNlIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZyIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uub3NnaSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uub3NnaS51dGlsIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5wZGUucnVudGltZSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS5jb3JlIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZXMiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5Ii8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLmpvYnMiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0uam9icy5ubDEiIGZyYWdtZW50PSJ0cnVlIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnNlcXVlbmNlcnMiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuZGlzZWFzZW1vZGVscyIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5nZSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5ubDEiIGZyYWdtZW50PSJ0cnVlIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5jYXJib24ubWFjb3N4IiBmcmFnbWVudD0idHJ1ZSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0Lmd0ay5saW51eC54ODYiIGZyYWdtZW50PSJ0cnVlIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3Qud2luMzIud2luMzIueDg2IiBmcmFnbWVudD0iIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnRleHQiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnRvbWNhdCIgZnJhZ21lbnQ9IiIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLmNhcmJvbiIgZnJhZ21lbnQ9InRydWUiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLmZvcm1zIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51aS53aW4zMiIgZnJhZ21lbnQ9IiIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIiIGZyYWdtZW50PSIiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aSIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UueHNkIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcuanVuaXQiLz4KKyAgICAgIDxwbHVnaW4gaWQ9Im9yZy5tb3J0YmF5LmpldHR5IiBmcmFnbWVudD0iIi8+CisgICAgICA8cGx1Z2luIGlkPSJvcmcubW96aWxsYS5yaGlubyIvPgorICAgICAgPHBsdWdpbiBpZD0ib3JnLnczYy5kb20iIGZyYWdtZW50PSIiLz4KKyAgIDwvcGx1Z2lucz4KKworCis8L3Byb2R1Y3Q+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvLmNkdHByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvLmNkdHByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyZWE4MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy8uY2R0cHJvamVjdApAQCAtMCwwICsxLDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2VjbGlwc2UtY2R0IHZlcnNpb249IjIuMCI/PgorCis8Y2R0cHJvamVjdC8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGU4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLy5jcHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy8uY3Byb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxOWM1NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy8uY3Byb2plY3QKQEAgLTAsMCArMSwxMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZmlsZVZlcnNpb24gNC4wLjA/PgorCis8Y3Byb2plY3Q+Cis8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiPgorPGNjb25maWd1cmF0aW9uIGlkPSJjb252ZXJ0ZWQuY29uZmlnLjkwNzg0NTI2NCI+Cis8c3RvcmFnZU1vZHVsZSBidWlsZFN5c3RlbUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5kZWZhdWx0Q29uZmlnRGF0YVByb3ZpZGVyIiBpZD0iY29udmVydGVkLmNvbmZpZy45MDc4NDUyNjQiIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5zZXR0aW5ncyIgbmFtZT0iY29udmVydGVkQ29uZmlnIj4KKzxleHRlcm5hbFNldHRpbmdzLz4KKzxleHRlbnNpb25zLz4KKzwvc3RvcmFnZU1vZHVsZT4KKzwvY2NvbmZpZ3VyYXRpb24+Cis8L3N0b3JhZ2VNb2R1bGU+Cis8L2Nwcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NmQxZDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvLnByb2plY3QKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5uZXQuc291cmNlZm9yZ2UubWV0cmljcy5idWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm5ldC5zb3VyY2Vmb3JnZS5tZXRyaWNzLm5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyOTc4NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw3NCBAQAorI1RodSBOb3YgMDEgMTQ6NTA6MzggRURUIDIwMDcKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MWRiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMCwwICsxLDUwIEBACisjTW9uIEZlYiAyNSAxMjoyOToyMyBQU1QgMjAwOAorY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitjbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPXRydWUKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQorY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCitjbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK2NsZWFudXAudXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQorY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitjbGVhbnVwX3Byb2ZpbGU9X3JlbGVuZyBjb2RlIGNsZWFudXAKK2NsZWFudXBfc2V0dGluZ3NfdmVyc2lvbj0yCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNTFmZTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyMCBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcztzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy5BY3RpdmF0b3IKK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQuZW5naW5lO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLmJpcnQuY29yZS51aSwKKyBvcmcuZWNsaXBzZS5zdGVtLnVpLAorIG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMsCisgb3JnLmVjbGlwc2Uuc3RlbS5kYXRhLmdlb2dyYXBoeSwKKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMsCisgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcworQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMsCisgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKK0J1bmRsZS1DbGFzc1BhdGg6IC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4MzU5YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNyBAQAorc291cmNlLi4gPSBzcmMvCitvdXRwdXQuLiA9IGJpbi8KK2Jpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIC4sXAorICAgICAgICAgICAgICAgaWNvbnMvLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvaWNvbnMvZnVsbC9jdXN0b21vYmoxNi8uY3ZzaWdub3JlIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODVlOGJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvLmN2c2lnbm9yZQpAQCAtMCwwICsxIEBACitUaHVtYnMuZGIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0FuYWx5c2lzLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L0FuYWx5c2lzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmFlZWJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvQW5hbHlzaXMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1N0YXRpY0xhYmVsLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1N0YXRpY0xhYmVsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzE0MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvU3RhdGljTGFiZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1RyaWdnZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL2ljb25zL2Z1bGwvY3VzdG9tb2JqMTYvVHJpZ2dlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYzMjQ2OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL2N1c3RvbW9iajE2L1RyaWdnZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL29iajE2L0NvbW1vbk1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvaWNvbnMvZnVsbC9vYmoxNi9Db21tb25Nb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZWM3NWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvaWNvbnMvZnVsbC9vYmoxNi9Db21tb25Nb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL29iajE2L0V4cGVyaW1lbnRNb2RlbEZpbGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL2ljb25zL2Z1bGwvb2JqMTYvRXhwZXJpbWVudE1vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkZTNiMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL29iajE2L0V4cGVyaW1lbnRNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL29iajE2L0dyYXBoTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL29iajE2L0dyYXBoTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTIxNmJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL29iajE2L01vZGVsTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL29iajE2L01vZGVsTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTAxMzNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL2ljb25zL2Z1bGwvb2JqMTYvTW9kZWxNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL29iajE2L1ByZWRpY2F0ZU1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvaWNvbnMvZnVsbC9vYmoxNi9QcmVkaWNhdGVNb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2Yjc1OGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvaWNvbnMvZnVsbC9vYmoxNi9QcmVkaWNhdGVNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL29iajE2L1NjZW5hcmlvTW9kZWxGaWxlLmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL29iajE2L1NjZW5hcmlvTW9kZWxGaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjZmOWZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL2ljb25zL2Z1bGwvb2JqMTYvU2NlbmFyaW9Nb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL29iajE2L1NlcXVlbmNlck1vZGVsRmlsZS5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvaWNvbnMvZnVsbC9vYmoxNi9TZXF1ZW5jZXJNb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhN2VkOWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvaWNvbnMvZnVsbC9vYmoxNi9TZXF1ZW5jZXJNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL29iajE2L1RyaWdnZXJNb2RlbEZpbGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL2ljb25zL2Z1bGwvb2JqMTYvVHJpZ2dlck1vZGVsRmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxNjAzOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL29iajE2L1RyaWdnZXJNb2RlbEZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL3dpemJhbi9OZXdDb21tb24uZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL2ljb25zL2Z1bGwvd2l6YmFuL05ld0NvbW1vbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5NzA0YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL3dpemJhbi9OZXdDb21tb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL3dpemJhbi9OZXdFeHBlcmltZW50LmdpZiBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL3dpemJhbi9OZXdFeHBlcmltZW50LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmI0MmU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL2ljb25zL2Z1bGwvd2l6YmFuL05ld0V4cGVyaW1lbnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL3dpemJhbi9OZXdHcmFwaC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvaWNvbnMvZnVsbC93aXpiYW4vTmV3R3JhcGguZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzODI5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvaWNvbnMvZnVsbC93aXpiYW4vTmV3R3JhcGguZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL3dpemJhbi9OZXdNb2RlbC5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvaWNvbnMvZnVsbC93aXpiYW4vTmV3TW9kZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZjdmODkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvaWNvbnMvZnVsbC93aXpiYW4vTmV3TW9kZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL3dpemJhbi9OZXdTY2VuYXJpby5naWYgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvaWNvbnMvZnVsbC93aXpiYW4vTmV3U2NlbmFyaW8uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NWYxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvaWNvbnMvZnVsbC93aXpiYW4vTmV3U2NlbmFyaW8uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL3dpemJhbi9OZXdTZXF1ZW5jZXIuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL2ljb25zL2Z1bGwvd2l6YmFuL05ld1NlcXVlbmNlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllODBmMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9mdWxsL3dpemJhbi9OZXdTZXF1ZW5jZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9zYW1wbGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL2ljb25zL3NhbXBsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmYjNjOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9pY29ucy9zYW1wbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDNiMzkzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNiBAQAorCitwbHVnaW5OYW1lID0gU1RFTSBDaGFydCBhbmQgQW5hbHlzaXMgVXRpbGl0aWVzCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZworCisjIFBlcnNwZWN0aXZlcworX1VUSUxfQW5hbHlzaXNfUGVyc3BlY3RpdmUgPSBBbmFseXNpcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzQ1YzQzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3BsdWdpbi54bWwKQEAgLTAsMCArMSw3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KKzxwbHVnaW4+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51aS5TVEVNUGVyc3BlY3RpdmUiCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzIj4KKyAgICAgIDxwZXJzcGVjdGl2ZQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy5wZXJzcGVjdGl2ZXMuQW5hbHlzaXMiCisgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N1c3RvbW9iajE2L0FuYWx5c2lzLmdpZiIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMucGVyc3BlY3RpdmVzLlNURU1BbmFseXNpc1BlcnNwZWN0aXZlIgorICAgICAgICAgICAgbmFtZT0iJV9VVElMX0FuYWx5c2lzX1BlcnNwZWN0aXZlIj4KKyAgICAgIDwvcGVyc3BlY3RpdmU+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KKyAgICAgIDx2aWV3CisgICAgICAgICAgICBhbGxvd011bHRpcGxlPSJ0cnVlIgorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLkVzdGltYXRvclZpZXciCisgICAgICAgICAgICBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5lc3RpbWF0b3IiCisgICAgICAgICAgICBuYW1lPSJFc3RpbWF0b3IiPgorICAgICAgICAgUmVwb3J0cworICAgICAgPC92aWV3PgorICAgICAgPHZpZXcKKyAgICAgICAgICAgIGFsbG93TXVsdGlwbGU9InRydWUiCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuU2NlbmFyaW9Db21wYXJpc29uVmlldyIKKyAgICAgICAgICAgIGljb249Imljb25zL3NhbXBsZS5naWYiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLmNvbXBhcmlzb24iCisgICAgICAgICAgICBuYW1lPSJTY2VuYXJpb0NvbXBhcmlzb24iCisgICAgICAgICAgICByZXN0b3JhYmxlPSJ0cnVlIj4KKyAgICAgIDwvdmlldz4KKyAgICAgIDx2aWV3CisgICAgICAgICAgICBhbGxvd011bHRpcGxlPSJ0cnVlIgorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLkx5YXB1bm92VmlldyIKKyAgICAgICAgICAgIGljb249Imljb25zL3NhbXBsZS5naWYiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLmx5YXB1bm92IgorICAgICAgICAgICAgbmFtZT0iTHlhcHVub3YiCisgICAgICAgICAgICByZXN0b3JhYmxlPSJ0cnVlIj4KKyAgICAgIDwvdmlldz4KKyAgICAgICA8dmlldworICAgICAgICAgICAgYWxsb3dNdWx0aXBsZT0idHJ1ZSIKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5FcGlkZW1pY1ZpZXciCisgICAgICAgICAgICBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5hZ2dyZWdhdGUiCisgICAgICAgICAgICBuYW1lPSJFcGlkZW1pYyIKKyAgICAgICAgICAgIHJlc3RvcmFibGU9InRydWUiPgorICAgICAgPC92aWV3PgorICAgICAgPHZpZXcKKyAgICAgICAgICAgIGFsbG93TXVsdGlwbGU9InRydWUiCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuUHJvY2Vzc29yVmlldyIKKyAgICAgICAgICAgIGljb249Imljb25zL3NhbXBsZS5naWYiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLnByb2Nlc3NvciIKKyAgICAgICAgICAgIG5hbWU9IlByb2Nlc3NvciIKKyAgICAgICAgICAgIHJlc3RvcmFibGU9InRydWUiPgorICAgICAgPC92aWV3PgorICAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+CisgICAgICA8dmlld2VyQ29udHJpYnV0aW9uCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzIgorICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuY29udGV4dCI+CisgICAgICAgICA8YWN0aW9uCisgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLlJlcG9ydHNDb250ZXh0TWVudUFjdGlvbiIKKyAgICAgICAgICAgICAgIGlkPSJBbmFseXNpcyIKKyAgICAgICAgICAgICAgIGxhYmVsPSJBbmFseXNpcyIKKyAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJyZXBvcnRzL2FkZGl0aW9ucyIKKyAgICAgICAgICAgICAgIHN0YXRlPSJ0cnVlIj4KKyAgICAgICAgIDwvYWN0aW9uPgorICAgICAgPC92aWV3ZXJDb250cmlidXRpb24+CisgICA8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9BY3RpdmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL0FjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYTc5OTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9BY3RpdmF0b3IuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CisKKy8qKgorICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKKworCS8qKgorCSAqIFRoZSBwbHVnLWluIElECisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcyI7IC8vJE5PTi1OTFMtMSQKKworCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKKwlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOworCisJLyoqCisJICogVGhlIGNvbnN0cnVjdG9yCisJICovCisJcHVibGljIEFjdGl2YXRvcigpIHsKKwkJcGx1Z2luID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXBsdWdpbiA9IG51bGw7CisJCXN1cGVyLnN0b3AoY29udGV4dCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCisJICogCisJICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbiBwbHVnLWluCisJICogcmVsYXRpdmUgcGF0aAorCSAqIAorCSAqIEBwYXJhbSBwYXRoCisJICogICAgICAgICAgICB0aGUgcGF0aAorCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKKwkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBwYXRoKTsKKwl9CisKKwkvKioKKwkgKiBMb2cgYW4gZXJyb3IgdG8gdGhlIElMb2cgZm9yIHRoaXMgcGx1Z2luCisJICogCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiAgICAgICAgICAgIHRoZSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB0ZXh0CisJICogQHBhcmFtIGV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgdGhlIGFzc29jaWF0ZWQgZXhjZXB0aW9uLCBvciBudWxsCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisJCS8vIERvIHdlIGhhdmUgYSBwbHVnaW4/CisJCWlmIChwbHVnaW4gIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlwbHVnaW4uZ2V0TG9nKCkubG9nKAorCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbi5nZXRCdW5kbGUoKQorCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7CisJCX0gZWxzZSB7CisJCQkvLyBObworCQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOworCQkJLy8gRXhjZXB0aW9uPworCQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJU3lzdGVtLm91dC5wcmludGxuKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworCQkJfSAvLyBpZgorCQl9CisJfSAvLyBsb2dFcnJvcgorCisJLyoqCisJICogTG9nIGluZm9ybWF0aW9uIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIGluZm9ybWF0aW9uIG1lc3NhZ2UgdGV4dAorCSAqIEBwYXJhbSBleGNlcHRpb24KKwkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dJbmZvcm1hdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQkvLyBEbyB3ZSBoYXZlIGEgcGx1Z2luPworCQlpZiAocGx1Z2luICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJcGx1Z2luLmdldExvZygpLmxvZygKKwkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIHBsdWdpbi5nZXRCdW5kbGUoKQorCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7CisJCX0gZWxzZSB7CisJCQkvLyBObworCQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOworCQkJLy8gRXhjZXB0aW9uPworCQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJU3lzdGVtLm91dC5wcmludGxuKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworCQkJfSAvLyBpZgorCQl9CisJfSAvLyBsb2dJbmZvcm1hdGlvbgorfSAvLyBBY3RpdmF0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL0FnZ3JlZ2F0ZURhdGFXcml0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL0FnZ3JlZ2F0ZURhdGFXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDI3ZTlkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvQWdncmVnYXRlRGF0YVdyaXRlci5qYXZhCkBAIC0wLDAgKzEsNTc5IEBACisvLyBBZ2dyZWdhdGVEYXRhV3JpdGVyCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5BY3RpdmF0b3I7CisKKy8qKgorICogd3JpdGVzIENTViBGaWxlcworICogCisgKi8KK3B1YmxpYyBjbGFzcyBBZ2dyZWdhdGVEYXRhV3JpdGVyIHsKKworCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGVGb3JtYXQgZGYgPQorCS8vIERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZShEYXRlRm9ybWF0LlNIT1JULERhdGVGb3JtYXQuTUVESVVNKTsKKworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGFnZ3JlZ2F0ZUZpbGVOYW1lOworCXByaXZhdGUgZmluYWwgU3RyaW5nIGluY2lkZW5jZUZpbGVOYW1lOworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBrZXlTID0gIlMiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBrZXlFID0gIkUiOworCQorCQorCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcga2V5SSA9ICJJIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcga2V5UiA9ICJSIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcga2V5QmlydGhzID0gIkJpcnRocyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGtleURlYXRocyA9ICJEZWF0aHMiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBrZXlEZWx0YUJpcnRocyA9ICJkZWx0YUJpcnRocyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGtleURlbHRhRGVhdGhzID0gImRlbHRhRGVhdGhzIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcga2V5SW5jaWRlbmNlID0gIkluY2lkZW5jZSI7CisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGJpcnRoc0xpc3Q9bnVsbDsKKwlwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZGVhdGhzTGlzdD1udWxsOworCXByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBkZWx0YUJpcnRoc0xpc3Q9bmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGRlbHRhRGVhdGhzTGlzdD1uZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkKKwkvKioKKwkgKiBpbmRpY2F0ZXMgaWYgYmlydGggY291bnRzIGV4aXN0IGluIGRhdGEgc2V0CisJICovCisJcHJpdmF0ZSBib29sZWFuIGhhdmVCaXJ0aHMgPSBmYWxzZTsKKwkvKioKKwkgKiBpbmRpY2F0ZXMgaWYgZGVhdGggY291bnRzIGV4aXN0IGluIGRhdGEgc2V0CisJICovCisJcHJpdmF0ZSBib29sZWFuIGhhdmVEZWF0aHMgPSBmYWxzZTsKKwkvKiogCisJICogQmlydGhzIGFyZSBzdG9yZWQgY3VtdWxhdGl2ZWx5IGJ1dCB3ZSB3YW50IHRvIGxvZyB0aGUgZGVyaXZhdGl2ZQorCSAqIHNvIHdlIHdpbGwgc3RvcmUgdGhlIHByZXZpb3VzIHZhbHVlIGFuZCBzdWJ0cmFjdCBpdCB0byBnZXQgdGhlIGluc3RhbnRhbmVvdXMgdmFsdWUKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBkb3VibGUgcGFzdEJpcnRocyA9IDAuMDsKKwkvKiogCisJICogRGVhdGhzIGFyZSBzdG9yZWQgY3VtdWxhdGl2ZWx5IGJ1dCB3ZSB3YW50IHRvIGxvZyB0aGUgZGVyaXZhdGl2ZQorCSAqIHNvIHdlIHdpbGwgc3RvcmUgdGhlIHByZXZpb3VzIHZhbHVlIGFuZCBzdWJ0cmFjdCBpdCB0byBnZXQgdGhlIGluc3RhbnRhbmVvdXMgdmFsdWUKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBkb3VibGUgcGFzdERlYXRocyA9IDAuMDsKKwkKKwlTdHJpbmdbXSBwcmVmZXJyZWRLZXlPcmRlciA9IHsKKwkJCQkJCQkJCVJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwuSVRFUkFUSU9OX0tFWSwgCisJCQkJCQkJCQlSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsLlRJTUVfS0VZLCAKKwkJCQkJCQkJCWtleVMsIAorCQkJCQkJCQkJa2V5RSwgCisJCQkJCQkJCQlrZXlJLCAKKwkJCQkJCQkJCWtleVIsCisJCQkJCQkJCQlrZXlCaXJ0aHMsCisJCQkJCQkJCQlrZXlEZWF0aHMKKwkJCQkJCQkJCX07CisJCisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVBhdGggUEFUSCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2VwID0gRmlsZS5zZXBhcmF0b3I7CisJCisJLyoqCisJICogRGlyZWN0b3J5IGNvbnRhaW5pbmcgc2NlbmFyaW8gZm9sZGVycworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOQUxZU0lTRk9MREVSID0gUEFUSC50b09TU3RyaW5nKCk7CisKKwkvKioKKwkgKiBGb2xkZXIgbmFtZSBmb3IgZmlsZXMgY29udGFpbmluZyBhZ2dyZWdhdGUgZGF0YQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFHR1JFR0FURV9GT0xERVJOQU1FID0gImFnZ3JlZ2F0ZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGFnZ3JlZ2F0ZVBhdGhTdWZmaXggPSBBR0dSRUdBVEVfRk9MREVSTkFNRStzZXA7CisJLy8gVE9ETyBmb3Igbm93IGFsbCBhZ2dyZWdhdGUgZGF0YSB3aWxsIGJlIGluIG9uZSBmb2xkZXIgY2FsbGVkIGNzdi9hZ2dyZWdhdGUKKwlwcml2YXRlIFN0cmluZyBhZ2dyZWdhdGVEaXJlY3RvcnlOYW1lID0gUEFUSC5hcHBlbmQoc2VwICsgYWdncmVnYXRlUGF0aFN1ZmZpeCkudG9PU1N0cmluZygpOworCQorCS8qKgorCSAqIEZvbGRlciBuYW1lIGZvciBmaWxlcyBjb250YWluaW5nIGluY2lkZW5jZSBkYXRhCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DSURFTkNFX0ZPTERFUk5BTUUgPSAiaW5jaWRlbmNlIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5jaWRlbmNlUGF0aFN1ZmZpeCA9IElOQ0lERU5DRV9GT0xERVJOQU1FK3NlcDsKKwkvLyBUT0RPIGZvciBub3cgYWxsIGFnZ3JlZ2F0ZSBkYXRhIHdpbGwgYmUgaW4gb25lIGZvbGRlciBjYWxsZWQgY3N2L2FnZ3JlZ2F0ZQorCXByaXZhdGUgU3RyaW5nIGluY2lkZW5jZURpcmVjdG9yeU5hbWUgPSBQQVRILmFwcGVuZChzZXAgKyBpbmNpZGVuY2VQYXRoU3VmZml4KS50b09TU3RyaW5nKCk7CisJCisJcHJpdmF0ZSBGaWxlV3JpdGVyIGZ3MTsKKwlwcml2YXRlIEZpbGVXcml0ZXIgZncyOworCisJLyoqCisJICogCisJICogQHBhcmFtIGRhdGFGb2xkZXIKKwkgKiBAcGFyYW0gYWdncmVnYXRlRGF0YUZpbGVOYW1lCisJICovCisJcHVibGljIEFnZ3JlZ2F0ZURhdGFXcml0ZXIoZmluYWwgU3RyaW5nIGRhdGFGb2xkZXIsIGZpbmFsIFN0cmluZyBhZ2dyZWdhdGVEYXRhRmlsZU5hbWUpIHsKKwkJLy8gRGV0ZXJtaW5lIHRoZSBhZ2dyZWdhdGUgZm9sZGVyIG5hbWUgZnJvbSB0aGUgZGF0YSBmb2xkZXIKKwkJSVBhdGggcCA9IG5ldyBQYXRoKGRhdGFGb2xkZXIpOworCQlwID0gcC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7IC8vIGdldCByaWQgb2YgZGlzZWFzZSBmb2xkZXIKKwkJcCA9IHAuYXBwZW5kKEFHR1JFR0FURV9GT0xERVJOQU1FKTsKKwkJdGhpcy5hZ2dyZWdhdGVEaXJlY3RvcnlOYW1lID0gcC50b09TU3RyaW5nKCk7CisJCS8vIGNoZWNrIHRoYXQgdGhlIGRpcmVjdG9yeSBleGlzdHMJCisJCWZpbmFsIEZpbGUgZGlyID0gbmV3IEZpbGUodGhpcy5hZ2dyZWdhdGVEaXJlY3RvcnlOYW1lKTsKKwkJaWYgKCghZGlyLmV4aXN0cygpKSB8fCAoIWRpci5pc0RpcmVjdG9yeSgpKSkgeworCQkJLy8gY3JlYXRlIGl0LgorCQkJYm9vbGVhbiBzdWNjZXNzID0gZGlyLm1rZGlycygpOworCQkJaWYgKCFzdWNjZXNzKSB7CisJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKAorCQkJCQkJIkZhaWxlZCB0byBDcmVhdGUgRGlyZWN0b3J5IiArIGFnZ3JlZ2F0ZURpcmVjdG9yeU5hbWUsCisJCQkJCQluZXcgSU9FeGNlcHRpb24oIkZhaWxlZCB0byBDcmVhdGUgRHJpZWN0b3J5IgorCQkJCQkJCQkrIGFnZ3JlZ2F0ZURpcmVjdG9yeU5hbWUpKTsKKwkJCX0KKwkJfQorCQkKKwkJcCA9IG5ldyBQYXRoKGRhdGFGb2xkZXIpOworCQlwID0gcC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7IC8vIGdldCByaWQgb2YgZGlzZWFzZSBmb2xkZXIKKwkJcCA9IHAuYXBwZW5kKElOQ0lERU5DRV9GT0xERVJOQU1FKTsKKwkJdGhpcy5pbmNpZGVuY2VEaXJlY3RvcnlOYW1lID0gcC50b09TU3RyaW5nKCk7CisJCWZpbmFsIEZpbGUgZGlyMiA9IG5ldyBGaWxlKHRoaXMuaW5jaWRlbmNlRGlyZWN0b3J5TmFtZSk7CisJCWlmICgoIWRpcjIuZXhpc3RzKCkpIHx8ICghZGlyMi5pc0RpcmVjdG9yeSgpKSkgeworCQkJLy8gY3JlYXRlIGl0LgorCQkJYm9vbGVhbiBzdWNjZXNzID0gZGlyMi5ta2RpcnMoKTsKKwkJCWlmICghc3VjY2VzcykgeworCQkJCUFjdGl2YXRvci5sb2dFcnJvcigKKwkJCQkJCSJGYWlsZWQgdG8gQ3JlYXRlIEluZGljZW5jZSBEaXJlY3RvcnkiICsgaW5jaWRlbmNlRGlyZWN0b3J5TmFtZSwKKwkJCQkJCW5ldyBJT0V4Y2VwdGlvbigiRmFpbGVkIHRvIENyZWF0ZSBEaXJlY3RvcnkiCisJCQkJCQkJCSsgaW5jaWRlbmNlRGlyZWN0b3J5TmFtZSkpOworCQkJfQorCQl9CisJCQorCQkKKwkJYWdncmVnYXRlRmlsZU5hbWUgPSBhZ2dyZWdhdGVEaXJlY3RvcnlOYW1lK3NlcCthZ2dyZWdhdGVEYXRhRmlsZU5hbWU7CisJCXRyeSB7CisJCQlmdzEgPSBuZXcgRmlsZVdyaXRlcihhZ2dyZWdhdGVGaWxlTmFtZSk7CisJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiRXJyb3Igb3BlbmluZyBkYXRhIGZpbGUiICArIGFnZ3JlZ2F0ZURpcmVjdG9yeU5hbWUgKyAiICIrIGFnZ3JlZ2F0ZUZpbGVOYW1lLCBlKTsKKwkJfQorCQkKKwkJaW5jaWRlbmNlRmlsZU5hbWUgPSBpbmNpZGVuY2VEaXJlY3RvcnlOYW1lK3NlcCthZ2dyZWdhdGVEYXRhRmlsZU5hbWU7CisJCXRyeSB7CisJCQlmdzIgPSBuZXcgRmlsZVdyaXRlcihpbmNpZGVuY2VGaWxlTmFtZSk7CisJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiRXJyb3Igb3BlbmluZyBkYXRhIGZpbGUiICArIGluY2lkZW5jZURpcmVjdG9yeU5hbWUgKyAiICIrIGluY2lkZW5jZUZpbGVOYW1lLCBlKTsKKwkJfQorCQkKKwl9IC8vIEFnZ3JlZ2F0ZURhdGFXcml0ZXIKKworCQorCisJCisJCisKKwkvKioKKwkgKiBsb2cgdGhlIGRhdGEgZm9yIGFuIGluc3RhbmNlCisJICogQHBhcmFtIGRhdGEKKwkgKiBAcGFyYW0gYWxwaGEgdGhlIGltbXVuaXR5IExvc3MgUmF0ZQorCSAqIEByZXR1cm4gRmlsZW5hbWUgKGluY2x1ZGluZyBwYXRoKSBvZiBsb2cgZmlsZQorCSAqLworCXB1YmxpYyBTdHJpbmdbXSBsb2dEYXRhSW5zdGFuY2UoZmluYWwgUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UgZGF0YSwgZG91YmxlIGFscGhhKSB7CisJCSAgICAKKwkJICAgIFN0cmluZ1tdIHJldFZhbCA9IG5ldyBTdHJpbmdbMl07CisJCQlNYXA8U3RyaW5nLExpc3Q8U3RyaW5nPj4gaW5zdGFuY2UgPSBkYXRhLmdldEluc3RhbmNlKCk7CQorCQkJU2V0PFN0cmluZz4ga2V5U2V0ID0gaW5zdGFuY2Uua2V5U2V0KCk7CisJCQlTdHJpbmdbXSBrZXlzID0gc29ydEtleXMoa2V5U2V0KTsKKwkJCQorCQkJTGlzdDxTdHJpbmc+IGRhdGFMaXN0ID0gaW5zdGFuY2UuZ2V0KGtleXNbMF0pOworCQkJCisJCQlTdHJpbmcgaGVhZGVyID0ga2V5c1swXTsgLy8gdGhpcyBpcyB0aGUgSVRFUkFUSU9OX0tFWSA9ICJpdGVyYXRpb24iOyBjb2x1bW4KKwkJCVN0cmluZ0J1aWxkZXIgc3RyQmxkciA9IG5ldyBTdHJpbmdCdWlsZGVyKGhlYWRlcik7CisJCQlmb3IgKGludCBpID0gMTsgaSA8IGtleXMubGVuZ3RoOyBpICsrKSB7CisJCQkJLy8gbG9nIHRoZSBoZWFkZXIKKwkJCQlzdHJCbGRyLmFwcGVuZCgiLCIpOworCQkJCXN0ckJsZHIuYXBwZW5kKGtleXNbaV0udG9TdHJpbmcoKS50cmltKCkpOworCQkJfQorCQkJc3RyQmxkci5hcHBlbmQoIlxuIik7CisJCQkKKwkJCXRyeSB7CisJCQkJZncxLmFwcGVuZChzdHJCbGRyLnRvU3RyaW5nKCkpOworCQkJfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworCQkJCUFjdGl2YXRvci5sb2dFcnJvcigiRXJyb3Igd3JpdGluZyBhZ2dyZWdhdGUgZGF0YSBmaWxlIiAgKyBhZ2dyZWdhdGVEaXJlY3RvcnlOYW1lICsgIiAiKyBhZ2dyZWdhdGVGaWxlTmFtZSwgZSk7CisJCQl9CisJCQkKKwkJCS8vIGdldCB0aGUgYmlydGhzIAorCQkJYmlydGhzTGlzdCA9IGRhdGEuZ2V0SW5zdGFuY2UoKS5nZXQoa2V5QmlydGhzKTsKKwkJCWRhdGEuZ2V0SW5zdGFuY2UoKS5wdXQoa2V5QmlydGhzLCBiaXJ0aHNMaXN0KTsKKwkJCQorCQkJLy8gZ2V0IHRoZSBkZWF0aHMgbGlzdAorCQkJZGVhdGhzTGlzdCA9IGRhdGEuZ2V0SW5zdGFuY2UoKS5nZXQoa2V5RGVhdGhzKTsKKwkJCWRhdGEuZ2V0SW5zdGFuY2UoKS5wdXQoa2V5RGVhdGhzLCBkZWF0aHNMaXN0KTsKKwkJCQorCQkJCisJCQlpbnQgZGF0YVNpemUgPSBkYXRhTGlzdC5zaXplKCk7CisJCQkvLyB3cml0ZSB0aGUgZGF0YQorCQkJZm9yKGludCBpID0gMDsgaSA8IGRhdGFTaXplOyBpICsrKSB7CisJCQkJLy8gZ2V0IHRoZSBmaXJzdCBjb2x1bW4gKCJpdGVyYXRpb25zIikKKwkJCQlTdHJpbmcga2V5ID0ga2V5c1swXS50b1N0cmluZygpOworCQkJCUxpc3Q8U3RyaW5nPiB2YWx1ZUxpc3QgPSBkYXRhLmdldEluc3RhbmNlKCkuZ2V0KGtleSk7CisJCQkJCisJCQkJc3RyQmxkciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQkJc3RyQmxkci5hcHBlbmQodmFsdWVMaXN0LmdldChpKSk7CisJCQkJc3RyQmxkci5hcHBlbmQoIiAiKTsKKworCQkJCWZvciAoaW50IGogPSAxOyBqIDwga2V5cy5sZW5ndGg7IGorKykgeworCQkJCQlrZXkgPSBrZXlzW2pdLnRvU3RyaW5nKCk7CisJCQkJCXZhbHVlTGlzdCA9IGRhdGEuZ2V0SW5zdGFuY2UoKS5nZXQoa2V5KTsJCisJCQkJCXN0ckJsZHIuYXBwZW5kKCIsICIpOworCQkJCQlzdHJCbGRyLmFwcGVuZCh2YWx1ZUxpc3QuZ2V0KGkpKTsKKwkJCQl9Ly8gZm9yIGFsbCBrZXlzCisJCQkJc3RyQmxkci5hcHBlbmQoIlxuIik7CisJCQkJdHJ5IHsKKwkJCQkJZncxLmFwcGVuZChzdHJCbGRyLnRvU3RyaW5nKCkpOworCQkJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJFcnJvciB3cml0aW5nIGFnZ3JlZ2F0ZSBkYXRhIGZpbGUiICArIGFnZ3JlZ2F0ZURpcmVjdG9yeU5hbWUgKyBhZ2dyZWdhdGVGaWxlTmFtZSwgZSk7CisJCQkJfQorCQkJfS8vIGZvciBhbGwgcG9pbnRzCisJCQkKKwkJCS8vc3RyID0gIiI7CisJCQl0cnkgeworCQkJCWlmIChmdzEgIT0gbnVsbCkgeworCQkJCQlmdzEuZmx1c2goKTsKKwkJCQkJZncxLmNsb3NlKCk7CisJCQkJfQorCQkJfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworCQkJCS8vIGRvIG5vdGhpbmcKKwkJCX0KKwkJCQorCQkJaGF2ZUJpcnRocyA9IGZhbHNlOworCQkJaWYoYmlydGhzTGlzdCE9bnVsbCkgeworCQkJCWhhdmVCaXJ0aHMgPSB0cnVlOworCQkJCS8vIGdldCB0aGUgZGVyaXZhdGl2ZSBmb3IgdGhlIGJpcnRocyBsaXN0CisJCQkJZm9yIChpbnQgaSA9IDA7aSA8IGJpcnRoc0xpc3Quc2l6ZSgpOyBpICsrKSB7CisJCQkJCWRlbHRhQmlydGhzTGlzdC5hZGQoaSxiaXJ0aHNMaXN0LmdldChpKSk7CisJCQkJfQorCQkJCWlmIChkZWx0YUJpcnRoc0xpc3QgIT0gbnVsbCkgeworCQkJCQlwYXN0QmlydGhzID0gMDsKKwkJCQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IGRlbHRhQmlydGhzTGlzdC5zaXplKCk7IGlpKyspIHsKKwkJCQkJCWZpbmFsIGRvdWJsZSBiaXJ0aHMgPSAobmV3IERvdWJsZShkZWx0YUJpcnRoc0xpc3QuZ2V0KGlpKSkpLmRvdWJsZVZhbHVlKCk7CisJCQkJCQlkZWx0YUJpcnRoc0xpc3Quc2V0KGlpLCAiIiArIChiaXJ0aHMgLSBwYXN0QmlydGhzKSk7CisJCQkJCQlwYXN0QmlydGhzID0gYmlydGhzOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJCisJCQloYXZlRGVhdGhzID0gZmFsc2U7CisJCQlpZihkZWF0aHNMaXN0IT1udWxsKSB7CisJCQkJaGF2ZURlYXRocyA9IHRydWU7CisJCQkJLy8gZ2V0IHRoZSBkZXJpdmF0aXZlIGZvciB0aGUgZGVhdGhzIGxpc3QKKwkJCQlmb3IgKGludCBpID0gMDtpIDwgZGVhdGhzTGlzdC5zaXplKCk7IGkgKyspIHsKKwkJCQkJZGVsdGFEZWF0aHNMaXN0LmFkZChpLGRlYXRoc0xpc3QuZ2V0KGkpKTsKKwkJCQl9CisJCQkJaWYgKGRlbHRhRGVhdGhzTGlzdCAhPSBudWxsKSB7CisJCQkJCXBhc3REZWF0aHMgPSAwOworCQkJCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgZGVsdGFEZWF0aHNMaXN0LnNpemUoKTsgaWkrKykgeworCQkJCQkJZmluYWwgZG91YmxlIGRlYXRocyA9IChuZXcgRG91YmxlKGRlbHRhRGVhdGhzTGlzdC5nZXQoaWkpKSkuZG91YmxlVmFsdWUoKTsKKwkJCQkJCWRlbHRhRGVhdGhzTGlzdC5zZXQoaWksICIiICsgKGRlYXRocyAtIHBhc3REZWF0aHMpKTsKKwkJCQkJCXBhc3REZWF0aHMgPSBkZWF0aHM7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkKKwkJCWRhdGEuZ2V0SW5zdGFuY2UoKS5wdXQoa2V5RGVsdGFCaXJ0aHMsIGRlbHRhQmlydGhzTGlzdCk7CisJCQlkYXRhLmdldEluc3RhbmNlKCkucHV0KGtleURlbHRhRGVhdGhzLCBkZWx0YURlYXRoc0xpc3QpOworCQkJCisJCQkKKwkJCXJldFZhbFswXSA9IHRoaXMuYWdncmVnYXRlRmlsZU5hbWU7CisJCQkKKwkJCS8vIG5leHQgY29tcHV0ZSB0aGUgaW5jaWRlbmNlIGFuZCBsb2cgaXQgdG9vLi4uCisJCQlyZXRWYWxbMV0gPSBsb2dJbmNpZGVuY2UoZGF0YSwgYWxwaGEpOworCQkJCisJCQlyZXR1cm4gcmV0VmFsOworCX0vLyBsb2cgdGhlIGRhdGEKKworCQorCisJLyoqCisJICogbG9nIHRoZSBkYXRhIGZvciBhbiBpbnN0YW5jZQorCSAqIEBwYXJhbSBkYXRhCisJICogQHBhcmFtIGFscGhhIHRoZSBpbW11bml0eSBsb3NzIHJhdGUKKwkgKiBAcmV0dXJuIHRoZSBpbmNpZGVuY2UgZGF0YSBmaWxlIG5hbWUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvZ0luY2lkZW5jZShmaW5hbCBSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBkYXRhLCBkb3VibGUgYWxwaGEpIHsKKwkJICAgIAorCQkJTWFwPFN0cmluZyxMaXN0PFN0cmluZz4+IGluc3RhbmNlID0gZGF0YS5nZXRJbnN0YW5jZSgpOwkKKwkJCVNldDxTdHJpbmc+IGtleVNldCA9IGluc3RhbmNlLmtleVNldCgpOworCQkJCisJCQkKKwkJCVN0cmluZ1tdIGtleXMgPSBzb3J0S2V5cyhrZXlTZXQpOworCQkJTGlzdDxTdHJpbmc+IGRhdGFMaXN0ID0gaW5zdGFuY2UuZ2V0KGtleXNbMF0pOworCQkJaW50IHNpemUgPSBkYXRhTGlzdC5zaXplKCk7CisJCQkKKwkJCS8vIGdldCB0aGUgdG90YWwgcG9wdWxhdGlvbiBhcyBhIGZ1bmN0aW9uIG9mIHRpbWUKKwkJCUxpc3Q8RG91YmxlPiBwb3BMaXN0ID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGogKyspIHsKKwkJCQlkb3VibGUgcG9wID0gMC4wOworCQkKKwkJCQlpZihrZXlTZXQuY29udGFpbnMoa2V5UykpIHsKKwkJCQkJZGF0YUxpc3QgPSBpbnN0YW5jZS5nZXQoa2V5Uyk7CisJCQkJCURvdWJsZSBkT2JqID0gbmV3IERvdWJsZShkYXRhTGlzdC5nZXQoaikpOworCQkJCQlwb3ArPSBkT2JqLmRvdWJsZVZhbHVlKCk7CisJCQkJfQorCQkJCWlmKGtleVNldC5jb250YWlucyhrZXlFKSkgeworCQkJCQlkYXRhTGlzdCA9IGluc3RhbmNlLmdldChrZXlFKTsKKwkJCQkJRG91YmxlIGRPYmogPSBuZXcgRG91YmxlKGRhdGFMaXN0LmdldChqKSk7CisJCQkJCXBvcCs9IGRPYmouZG91YmxlVmFsdWUoKTsKKwkJCQl9CisJCQkJaWYoa2V5U2V0LmNvbnRhaW5zKGtleUkpKSB7CisJCQkJCWRhdGFMaXN0ID0gaW5zdGFuY2UuZ2V0KGtleUkpOworCQkJCQlEb3VibGUgZE9iaiA9IG5ldyBEb3VibGUoZGF0YUxpc3QuZ2V0KGopKTsKKwkJCQkJcG9wKz0gZE9iai5kb3VibGVWYWx1ZSgpOworCQkJCX0KKwkJCQlpZihrZXlTZXQuY29udGFpbnMoa2V5UikpIHsKKwkJCQkJZGF0YUxpc3QgPSBpbnN0YW5jZS5nZXQoa2V5Uik7CisJCQkJCURvdWJsZSBkT2JqID0gbmV3IERvdWJsZShkYXRhTGlzdC5nZXQoaikpOworCQkJCQlwb3ArPSBkT2JqLmRvdWJsZVZhbHVlKCk7CisJCQkJfQorCQkJCQorCQkJCXBvcExpc3QuYWRkKG5ldyBEb3VibGUocG9wKSk7CisJCQl9CisJCQkKKwkJCS8vaW5jaWRlbmNlID0gZGVsdGFJIC0gZGVsdGFSICsgbXVJIC0gbXVSICAoZGVhdGhzIGluIGluZmVjdGlvdXMgYW5kIHJlY292ZXJlZCkKKwkJCUxpc3Q8RG91YmxlPiBpbmNpZGVuY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQlMaXN0PFN0cmluZz4gc0xpc3QgPSBpbnN0YW5jZS5nZXQoa2V5Uyk7CisJCQlMaXN0PFN0cmluZz4gaUxpc3QgPSBpbnN0YW5jZS5nZXQoa2V5SSk7CisJCQlMaXN0PFN0cmluZz4gckxpc3QgPSBpbnN0YW5jZS5nZXQoa2V5Uik7IC8vIG9rIGlmIHRoaXMgaXMgbnVsbAorCQkJCisJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCS8vICAgZ2V0IHRoZSBJbmNpZGVuY2UKKwkJCS8vCisJCQlMaXN0PFN0cmluZz4gZXhhY3RJbmNpZGVuY2UgPSBpbnN0YW5jZS5nZXQoa2V5SW5jaWRlbmNlKTsKKwkJCWlmKGV4YWN0SW5jaWRlbmNlICE9IG51bGwpIHsKKwkJCQkvLyByZWFkIHRoZSBpbmNpZGVuY2UKKwkJCQlmb3IoaW50IGkgPSAwOyBpIDwgZXhhY3RJbmNpZGVuY2Uuc2l6ZSgpOyBpICsrKSB7CisJCQkJCWluY2lkZW5jZUxpc3QuYWRkKGksbmV3IERvdWJsZShleGFjdEluY2lkZW5jZS5nZXQoaSkpKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCQorCQkJCS8vIGNvbXB1dGUgdGhlIGluY2lkZW5jZQorCQkJCWluY2lkZW5jZUxpc3QgPSBjb21wdXRlSW5jaWRlbmNlKGlMaXN0LCByTGlzdCwgYWxwaGEsIHNpemUpIDsKKwkJCX0vLyBmaW5kIHRoZSBpbmNpZGVuY2UgZnJvbSBmaWxlIGVsc2UgY29tcHV0ZSBpdAorCQkJLy8JCisgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCQorCQkJCisJCQkvLyBoZWFkZXIgaW5mbworCQkJU3RyaW5nIHN0ciA9IGtleXNbMF0rIiwiK2tleXNbMV0rIiwiKyJJbmNpZGVuY2UsUyxQIjsKKwkJCWlmKGhhdmVCaXJ0aHMpIHN0ciArPSIsIitrZXlEZWx0YUJpcnRoczsKKwkJCWlmKGhhdmVEZWF0aHMpIHN0ciArPSIsIitrZXlEZWx0YURlYXRoczsKKwkJCQorCQkJc3RyICs9ICJcbiI7CisJCQl0cnkgeworCQkJCWZ3Mi5hcHBlbmQoc3RyKTsKKwkJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKwkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkVycm9yIHdyaXRpbmcgYWdncmVnYXRlIGRhdGEgZmlsZSIgICsgYWdncmVnYXRlRGlyZWN0b3J5TmFtZSArICIgIisgYWdncmVnYXRlRmlsZU5hbWUsIGUpOworCQkJfQorCQkJCisJCQkvLyB3cml0ZSB0aGUgZGF0YQorCQkJc3RyID0gIiI7CisJCQlmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgeworCQkJCXN0ciA9ICIiOworCQkJCS8vIGdldCB0aGUgZmlyc3QgY29sdW1uICgiaXRlcmF0aW9ucyIpCisJCQkJU3RyaW5nIGtleSA9IGtleXNbMF0udG9TdHJpbmcoKTsKKwkJCQlMaXN0PFN0cmluZz4gdmFsdWVMaXN0ID0gZGF0YS5nZXRJbnN0YW5jZSgpLmdldChrZXkpOworCQkJCXN0ciA9IHZhbHVlTGlzdC5nZXQoaSkgKyAiICI7CisJCQkJLy8gdGltZQorCQkJCWtleSA9IGtleXNbMV0udG9TdHJpbmcoKTsKKwkJCQl2YWx1ZUxpc3QgPSBkYXRhLmdldEluc3RhbmNlKCkuZ2V0KGtleSk7CisJCQkJc3RyICs9ICIsICIrdmFsdWVMaXN0LmdldChpKTsKKwkJCQkvLyBpbmNpZGVuY2UKKwkJCQlzdHIgKz0gIiwgIitpbmNpZGVuY2VMaXN0LmdldChpKS5kb3VibGVWYWx1ZSgpOworCQkJCS8vIFMKKwkJCQlzdHIgKz0gIiwgIitzTGlzdC5nZXQoaSk7CisJCQkJLy8gUAorCQkJCXN0ciArPSAiLCAiK3BvcExpc3QuZ2V0KGkpLmRvdWJsZVZhbHVlKCk7CisJCQkJCisJCQkJaWYoaGF2ZUJpcnRocykgeworCQkJCQkvLyBkZWx0YUJpcnRocworCQkJCQlrZXkgPSBrZXlEZWx0YUJpcnRoczsKKwkJCQkJdmFsdWVMaXN0ID0gZGF0YS5nZXRJbnN0YW5jZSgpLmdldChrZXkpOworCQkJCQlpZih2YWx1ZUxpc3QhPSBudWxsICYmIHZhbHVlTGlzdC5zaXplKCkgPiAwICkgeworCQkJCQkJc3RyICs9ICIsICIrdmFsdWVMaXN0LmdldChpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXN0ciArPSAiLCAiKzA7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJaWYoaGF2ZURlYXRocykgeworCQkJCQkvLyBkZWx0YURlYXRocworCQkJCQlrZXkgPSBrZXlEZWx0YURlYXRoczsKKwkJCQkJdmFsdWVMaXN0ID0gZGF0YS5nZXRJbnN0YW5jZSgpLmdldChrZXkpOworCQkJCQlpZih2YWx1ZUxpc3QhPSBudWxsICYmIHZhbHVlTGlzdC5zaXplKCkgPiAwICkgeworCQkJCQkJc3RyICs9ICIsICIrdmFsdWVMaXN0LmdldChpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXN0ciArPSAiLCAiKzA7CisJCQkJCX0KKwkJCQl9CisJCQkKKwkJCQkKKwkJCQlzdHIgKz0gIiBcbiI7CisJCQkJdHJ5IHsKKwkJCQkJZncyLmFwcGVuZChzdHIpOworCQkJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJFcnJvciB3cml0aW5nIGFnZ3JlZ2F0ZSBkYXRhIGZpbGUiICArIGluY2lkZW5jZURpcmVjdG9yeU5hbWUgKyBpbmNpZGVuY2VGaWxlTmFtZSwgZSk7CisJCQkJfQorCQkJfS8vIGZvciBhbGwgcG9pbnRzCisJCQkKKwkJCXN0ciA9ICIiOworCQkJdHJ5IHsKKwkJCQlpZiAoZncyICE9IG51bGwpIHsKKwkJCQkJZncyLmZsdXNoKCk7CisJCQkJCWZ3Mi5jbG9zZSgpOworCQkJCX0KKwkJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBkbyBub3RoaW5nCisJCQl9CisJCQkKKwkJCXJldHVybiBpbmNpZGVuY2VGaWxlTmFtZTsKKwkJCQorCQkJCisJfS8vIGxvZyB0aGUgZGF0YQorCQorCS8qKgorCSAqIAorCSAqIGNvbXB1dGUgdGhlIGluY2lkZW5jZSAtIHJldHVybiBhcyBsaXN0IG9mIERvdWJsZQorCSAqIAorCSAqIEBwYXJhbSBpTGlzdAorCSAqIEBwYXJhbSByTGlzdAorCSAqIEBwYXJhbSBhbHBoYQorCSAqIEBwYXJhbSBzaXplCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgTGlzdDxEb3VibGU+IGNvbXB1dGVJbmNpZGVuY2UoTGlzdDxTdHJpbmc+IGlMaXN0LCBMaXN0PFN0cmluZz4gckxpc3QsIGRvdWJsZSBhbHBoYSwgaW50IHNpemUpIHsKKwkJTGlzdDxEb3VibGU+IGluY2lkZW5jZUxpc3QgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJLy8gdGltZSB6ZXJvIHBvaW50CisJCWRvdWJsZSBkZWx0YUkgPSAobmV3IERvdWJsZShpTGlzdC5nZXQoMCkpKS5kb3VibGVWYWx1ZSgpOworCQlkb3VibGUgZGVsdGFSID0gKG5ldyBEb3VibGUockxpc3QuZ2V0KDApKSkuZG91YmxlVmFsdWUoKTsKKwkJZG91YmxlIGJpcnRocyA9IDAuMDsKKwkJZG91YmxlIGRlYXRocyA9IDAuMDsKKwkJaWYoKGJpcnRoc0xpc3QhPW51bGwpJiYoYmlydGhzTGlzdC5zaXplKCk+PTEpKSBiaXJ0aHMgPSAobmV3IERvdWJsZShiaXJ0aHNMaXN0LmdldCgwKSkpLmRvdWJsZVZhbHVlKCk7CisJCWlmKChkZWF0aHNMaXN0IT1udWxsKSYmKGRlYXRoc0xpc3Quc2l6ZSgpPj0xKSkgZGVhdGhzID0gKG5ldyBEb3VibGUoZGVhdGhzTGlzdC5nZXQoMCkpKS5kb3VibGVWYWx1ZSgpOworCQkvLyAxLiBGaXJzdCBjb21wdXRlIHRoZSBpbmNpZGVuY2UgZnJvbSB0aGUgZGlmZmVyZW5jZSBpbiBkZWx0YUkgLSBkZWx0YVIKKwkJLy8gaWdub3JpbmcgdGhlIHJhdGUgb2YgaW1tdW5pdHkgbG9zcy4KKwkJRG91YmxlIGluY2lkZW5jZSA9IG5ldyBEb3VibGUoKGRlbHRhSSArIGRlbHRhUikgKyAoZGVhdGhzLWJpcnRocykgKTsKKwkgICAgLy8gd2UgY2FuJ3QgdXNlIHRoaXMgb25lIHBvaW50IGNvcnJlY3QgZm9yIGFscGhhIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBSCisJCS8vIGF0IHQtMSAod2hlcmUgd2UgaGF2ZSBubyBkYXRhIGZvciB0PSAtMSApCQkJCisJIAorCQlpbmNpZGVuY2VMaXN0LmFkZChpbmNpZGVuY2UpOworCisJCWZvciAoaW50IGogPSAxOyBqIDwgc2l6ZTsgaiArKykgeworCQkJCisJCQkvLyBnZXQgZGVsdGFJIGFuZCBkZWx0YVIgZnJvbSBwcmV2aW91cyB2YWx1ZQorCQkJZGVsdGFJID0gKG5ldyBEb3VibGUoaUxpc3QuZ2V0KGopKSkuZG91YmxlVmFsdWUoKTsKKwkJCWRlbHRhSSAtPSAobmV3IERvdWJsZShpTGlzdC5nZXQoai0xKSkpLmRvdWJsZVZhbHVlKCk7CisJCQkKKwkJCWlmKHJMaXN0IT1udWxsKSB7CisJCQkJZGVsdGFSID0gKG5ldyBEb3VibGUockxpc3QuZ2V0KGopKSkuZG91YmxlVmFsdWUoKTsKKwkJCQlkZWx0YVIgLT0gKG5ldyBEb3VibGUockxpc3QuZ2V0KGotMSkpKS5kb3VibGVWYWx1ZSgpOworCQkJfQorCQkJYmlydGhzID0gMC4wOworCQkJZGVhdGhzID0gMC4wOworCQkJaWYoKGJpcnRoc0xpc3QhPW51bGwpJiYoYmlydGhzTGlzdC5zaXplKCk+PWopKSBiaXJ0aHMgPSAobmV3IERvdWJsZShiaXJ0aHNMaXN0LmdldChqKSkpLmRvdWJsZVZhbHVlKCk7CisJCQlpZigoZGVhdGhzTGlzdCE9bnVsbCkmJihkZWF0aHNMaXN0LnNpemUoKT49aikpIGRlYXRocyA9IChuZXcgRG91YmxlKGRlYXRoc0xpc3QuZ2V0KGopKSkuZG91YmxlVmFsdWUoKTsKKwkJCQorCQkJLy8gQ29tcHV0ZSB0aGUgaW5jaWRlbmNlIGZyb20gdGhlIGRpZmZlcmVuY2UgaW4gZGVsdGFJIC0gZGVsdGFSCisJCQkvLyBjb3JyZWN0aW5nIGZvciB0aGUgcmF0ZSBvZiBpbW11bml0eSBsb3NzLgorCQkJZG91YmxlIHJWYWx1ZSA9IChuZXcgRG91YmxlKHJMaXN0LmdldChqLTEpKSkuZG91YmxlVmFsdWUoKTsKKwkJCWRvdWJsZSBpbmNWYWx1ZSA9IChkZWx0YUkgKyBkZWx0YVIpICsgKGRlYXRocy1iaXJ0aHMpICsoYWxwaGEqclZhbHVlKTsKKwkJCWluY2lkZW5jZSA9IG5ldyBEb3VibGUoaW5jVmFsdWUpOworCQkJaW5jaWRlbmNlTGlzdC5hZGQoaW5jaWRlbmNlKTsKKwkJfQkKKwkJcmV0dXJuIGluY2lkZW5jZUxpc3Q7CisJfQorCisKKwkvKioKKwkgKiBJZiB0aGUga2V5U2V0IGNvbnRhaW5zIHRoZSBwcmVmZXJyZWQga2V5cywgcmV0dXJuIHRoZSBwcmVmZXJyZWQgb25lcyBpbiB0aGUgcHJlZmVycmVkIG9yZGVyLAorCSAqIG90aGVyd2lzZSBqdXN0IHJldHVybnMgdGhlbS4KKwkgKiBAcGFyYW0ga2V5U2V0CisJICogQHJldHVybiB0aGUgc29ydGVkIGtleXMKKwkgKi8KKwlwcml2YXRlIFN0cmluZ1tdIHNvcnRLZXlzKFNldDxTdHJpbmc+IGtleVNldCkgeworCQlTdHJpbmdbXSBrZXlzID0gbmV3IFN0cmluZ1trZXlTZXQuc2l6ZSgpXTsKKwkJaW50IGljb3VudCA9IDA7CisJCS8vIGZpcnN0IGFkZCB0aGUgcHJlZmVycmVkIGtleXMgKGlmIHRoZXkgZXhpc3QpIGluIHRoZSBjb3JyZWN0IG9yZGVyCisJICAgIFNldDxTdHJpbmc+IGRvbmVTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJlZmVycmVkS2V5T3JkZXIubGVuZ3RoOyBpICsrKSB7CisJCQlpZihrZXlTZXQuY29udGFpbnMocHJlZmVycmVkS2V5T3JkZXJbaV0pKSB7CisJCQkJa2V5c1tpY291bnRdID0gcHJlZmVycmVkS2V5T3JkZXJbaV0udHJpbSgpOworCQkJCWljb3VudCArKzsKKwkJCQlkb25lU2V0LmFkZChwcmVmZXJyZWRLZXlPcmRlcltpXSk7CisJCQl9CisJCX0KKyAgCisJCS8vIHRoZW4gYWRkIGFueSBvdGhlciBrZXlzCisJCUl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGtleVNldC5pdGVyYXRvcigpOworCQl3aGlsZSgoaXRlciE9bnVsbCkmJihpdGVyLmhhc05leHQoKSkpeworCQkJU3RyaW5nIG5leHRLZXkgPSBpdGVyLm5leHQoKTsKKwkJCWlmKCFkb25lU2V0LmNvbnRhaW5zKG5leHRLZXkpKSB7CisJCQkJa2V5c1tpY291bnRdID0gbmV4dEtleTsKKwkJCSAgICBpY291bnQgKys7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBrZXlzOworCX0KKwkKKwkvKioKKwkgKiBnZXQgdGhlIGtleSB1c2UgZm9yIFN1c2NlcHRpYmxlIGRhdGEKKwkgKiBAcmV0dXJuICdTJworCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEtleVMoKSB7CisJCXJldHVybiBrZXlTOworCX0KKworCS8qKgorCSAqIAorCSAqIEByZXR1cm4gRQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEtleUUoKSB7CisJCXJldHVybiBrZXlFOworCX0KKworCS8qKgorCSAqIAorCSAqIEByZXR1cm4gSQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEtleUkoKSB7CisJCXJldHVybiBrZXlJOworCX0KKworCS8qKgorCSAqIAorCSAqIEByZXR1cm4gUgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEtleVIoKSB7CisJCXJldHVybiBrZXlSOworCX0KKworCS8qKgorCSAqIGdldCB0aGUga2V5IHVzZSBmb3IgSW5jaWRlbmNlIGRhdGEKKwkgKiBAcmV0dXJuICdJbmNpZGVuY2UnCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0S2V5SW5jaWRlbmNlKCkgeworCQlyZXR1cm4ga2V5SW5jaWRlbmNlOworCX0KKworCit9Ly8gQWdncmVnYXRlRGF0YVdyaXRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvQ1NWQW5hbHlzaXNXcml0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL0NTVkFuYWx5c2lzV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM4YTVlYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL0NTVkFuYWx5c2lzV3JpdGVyLmphdmEKQEAgLTAsMCArMSwzOTcgQEAKKy8vIENTVkFuYWx5c2lzV3JpdGVyCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRXJyb3JSZXN1bHQ7CisKKworLyoqCisgKiB3cml0ZXMgQ1NWIEZpbGVzCisgKiAKKyAqLworcHVibGljIGNsYXNzIENTVkFuYWx5c2lzV3JpdGVyICB7CisKKwkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlRm9ybWF0IGRmID0KKwkvLyBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2UoRGF0ZUZvcm1hdC5TSE9SVCxEYXRlRm9ybWF0Lk1FRElVTSk7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBvdXRwdXRGaWxlTmFtZSA9ICIiOworCisKKwkvKioKKwkgKiBUT0RPIG5lZWQgdG8gZ2V0IGRpc2Vhc2UgcGFyYW1ldGVycyBmb3IgdGhlIHNjZW5hcmlvIGFuZCB3cml0ZSB0aGVtIHRvIGEKKwkgKiBmaWxlCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBwYXJhbUZpbGVOYW1lOworCisJLy9wcml2YXRlIHN0YXRpYyBTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRUVFIGQgTU1NIHl5IiwgTG9jYWxlLmdldERlZmF1bHQoKSk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUGF0aCBQQVRIID0gb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLkFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNlcCA9IEZpbGUuc2VwYXJhdG9yOworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NWID0gImNzdiI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9TVUZGSVggPSBDU1Yrc2VwOworCisJcHJpdmF0ZSAgc3RhdGljIFN0cmluZyBhZGlyID0gUEFUSC5hcHBlbmQoc2VwICsgUEFUSF9TVUZGSVgpLnRvT1NTdHJpbmcoKTsKKworCXByaXZhdGUgRmlsZVdyaXRlciBmdzsKKworCS8qKgorCSAqIGRlY2ltYWwgZm9ybWF0CisJICovCisJLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjaW1hbEZvcm1hdCBkZjEgPSBuZXcgRGVjaW1hbEZvcm1hdCggIjAuMCIgKTsKKwkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNpbWFsRm9ybWF0IGRmMiA9IG5ldyBEZWNpbWFsRm9ybWF0KCAiMC4wMCIgKTsKKwkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNpbWFsRm9ybWF0IGRmMyA9IG5ldyBEZWNpbWFsRm9ybWF0KCAiMC4wMDAiICk7CisJLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjaW1hbEZvcm1hdCBkZjQgPSBuZXcgRGVjaW1hbEZvcm1hdCggIjAuMDAwMCIgKTsKKwkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNpbWFsRm9ybWF0IGRmNSA9IG5ldyBEZWNpbWFsRm9ybWF0KCAiMC4wMDAwMCIgKTsKKworCisKKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBmaWxlTmFtZQorCSAqLworCXB1YmxpYyBDU1ZBbmFseXNpc1dyaXRlcihmaW5hbCBTdHJpbmcgZmlsZU5hbWUpIHsKKworCQlvdXRwdXRGaWxlTmFtZSA9IGFkaXIrZmlsZU5hbWUrIi4iK0NTVjsKKwkJZmluYWwgRmlsZSBkaXIgPSBuZXcgRmlsZShhZGlyKTsKKwkJaWYgKCghZGlyLmV4aXN0cygpKSB8fCAoIWRpci5pc0RpcmVjdG9yeSgpKSkgeworCQkJLy8gY3JlYXRlIGl0LgorCQkJYm9vbGVhbiBzdWNjZXNzID0gZGlyLm1rZGlycygpOworCQkJaWYgKCFzdWNjZXNzKSB7CisJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKAorCQkJCQkJIkZhaWxlZCB0byBDcmVhdGUgRHJpZWN0b3J5IiArIG91dHB1dEZpbGVOYW1lLAorCQkJCQkJbmV3IElPRXhjZXB0aW9uKCJGYWlsZWQgdG8gQ3JlYXRlIERyaWVjdG9yeSIKKwkJCQkJCQkJKyBvdXRwdXRGaWxlTmFtZSkpOworCQkJfQorCisJCX0KKworCQl0cnkgeworCQkJZncgPSBuZXcgRmlsZVdyaXRlcihvdXRwdXRGaWxlTmFtZSk7CisJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigKKwkJCQkJIkVycm9yIGNsb3NpbmcgQ1NWIGFuYWx5c2lzIGZpbGUiCisJCQkJCSsgb3V0cHV0RmlsZU5hbWUgKyBvdXRwdXRGaWxlTmFtZSwgZSk7CisJCX0KKworCX0gLy8gQ1NWQW5hbHlzaXNXcml0ZXIKKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBkaXJlY3RvcnkKKwkgKiBAcGFyYW0gZmlsZU5hbWUKKwkgKi8KKwlwdWJsaWMgQ1NWQW5hbHlzaXNXcml0ZXIoZmluYWwgU3RyaW5nIGRpcmVjdG9yeSwgZmluYWwgU3RyaW5nIGZpbGVOYW1lKSB7CisKKworCQlhZGlyID0gZGlyZWN0b3J5OworCQlvdXRwdXRGaWxlTmFtZSA9IGFkaXIrZmlsZU5hbWUrIi4iK0NTVjsKKworCQlmaW5hbCBGaWxlIGRpciA9IG5ldyBGaWxlKGFkaXIpOworCQlpZiAoKCFkaXIuZXhpc3RzKCkpIHx8ICghZGlyLmlzRGlyZWN0b3J5KCkpKSB7CisJCQkvLyBjcmVhdGUgaXQuCisJCQlib29sZWFuIHN1Y2Nlc3MgPSBkaXIubWtkaXJzKCk7CisJCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCQlBY3RpdmF0b3IubG9nRXJyb3IoCisJCQkJCQkiRmFpbGVkIHRvIENyZWF0ZSBEcmllY3RvcnkiICsgb3V0cHV0RmlsZU5hbWUsCisJCQkJCQluZXcgSU9FeGNlcHRpb24oIkZhaWxlZCB0byBDcmVhdGUgRHJpZWN0b3J5IgorCQkJCQkJCQkrIG91dHB1dEZpbGVOYW1lKSk7CisJCQl9CisKKwkJfQorCisJCXRyeSB7CisJCQlmdyA9IG5ldyBGaWxlV3JpdGVyKG91dHB1dEZpbGVOYW1lKTsKKwkJfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKAorCQkJCQkiRXJyb3IgY2xvc2luZyBDU1YgYW5hbHlzaXMgZmlsZSIKKwkJCQkJKyBvdXRwdXRGaWxlTmFtZSArIG91dHB1dEZpbGVOYW1lLCBlKTsKKwkJfQorCisJfSAvLyBDU1ZBbmFseXNpc1dyaXRlcgorCisKKworCS8qKgorCSAqIExvZyB0aGUgZGF0YSBmcm9tIGEgc2ltcGxlIGxpc3QKKwkgKiBAcGFyYW0gZGF0YUxpc3QgCisJICovCisJcHVibGljIHZvaWQgbG9nRGF0YShMaXN0PEVMaXN0PERvdWJsZT4+IGRhdGFMaXN0KSB7CisKKworCQkvLyBnZXQgdGhlIHNpemUgb2YgdGhlIGxvbmdlc3QgYXJyYXkKKwkJaW50IG1heFJvd3MgPSAwOworCQlpbnQgbnVtQXJyYXlzID0gZGF0YUxpc3Quc2l6ZSgpOworCQlmb3IoaW50IGkgPSAwOyBpIDwgbnVtQXJyYXlzOyBpICsrKSB7CisJCQlFTGlzdDxEb3VibGU+IGRhdGEgPSBkYXRhTGlzdC5nZXQoaSk7CisJCQlpZihkYXRhLnNpemUoKSA+PSBtYXhSb3dzKSBtYXhSb3dzID0gZGF0YS5zaXplKCk7CisJCX0KKworCisJCS8vIHJvd3MKKwkJZm9yKGludCB5ID0gMDsgeSA8IG1heFJvd3M7IHkgKyspIHsKKwkJCS8vU3RyaW5nIHN0ciA9ICIiOworCQkJU3RyaW5nQnVpbGRlciBzdHJCbGRyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCS8vIGNvbHVtbnMKKwkJCWZvcihpbnQgeCA9IDA7IHggPCBudW1BcnJheXM7IHggKyspIHsKKwkJCQlFTGlzdDxEb3VibGU+IGRhdGEgPSBkYXRhTGlzdC5nZXQoeCk7CisJCQkJaWYoZGF0YS5zaXplKCk+PSBtYXhSb3dzKSB7CisJCQkJCXN0ckJsZHIuYXBwZW5kKGRhdGEuZ2V0KHkpKTsKKwkJCQkJaWYoeCA8IG51bUFycmF5cy0xKSB7CisJCQkJCQlzdHJCbGRyLmFwcGVuZCgiLCAiKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJc3RyQmxkci5hcHBlbmQoIlxuIik7CisJCQl0cnkgeworCQkJCWZ3LndyaXRlKHN0ckJsZHIudG9TdHJpbmcoKSk7CisJCQl9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJFcnJvciB3cml0aW5nIGRhdGEgdG8gQ1NWIEFuYWx5c2lzIGZpbGUiCisJCQkJCQkrIG91dHB1dEZpbGVOYW1lICsgb3V0cHV0RmlsZU5hbWUsIGUpOworCQkJfQorCQl9CisKKwkJdHJ5IHsKKwkJCWZ3LmZsdXNoKCk7CisJCQlmdy5jbG9zZSgpOworCQl9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoCisJCQkJCSJFcnJvciBjbG9zaW5nIENTViBhbmFseXNpcyBmaWxlIgorCQkJCQkrIG91dHB1dEZpbGVOYW1lICsgb3V0cHV0RmlsZU5hbWUsIGUpOworCQl9CisJfS8vIGxvZyBkYXRhCisKKwkvKioKKwkgKiBMb2cgdGhlIGRhdGEgZnJvbSBhIHNpbXBsZSBsaXN0CisJICogQHBhcmFtIGhlYWRlciAKKwkgKiBAcGFyYW0gZGF0YUxpc3QgCisJICovCisJcHVibGljIHZvaWQgbG9nRGF0YShMaXN0PFN0cmluZz4gaGVhZGVyLCBMaXN0PGRvdWJsZVtdPiBkYXRhTGlzdCkgeworCisJCVN0cmluZyBzdHJIZWFkZXIgPSAiaXRlcmF0aW9uIjsKKwkJU3RyaW5nQnVpbGRlciBzdHJCbGRyID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RySGVhZGVyKTsKKwkJLy8gaGVhZGVyIGNvbHVtbnMKKwkJZm9yKGludCB4ID0gMDsgeCA8IGhlYWRlci5zaXplKCk7IHggKyspIHsKKwkJCXN0ckJsZHIuYXBwZW5kKCIsICIpOworCQkJc3RyQmxkci5hcHBlbmQoaGVhZGVyLmdldCh4KSk7CisJCX0KKwkJc3RyQmxkci5hcHBlbmQoIlxuIik7CisJCXRyeSB7CisJCQlmdy53cml0ZShzdHJCbGRyLnRvU3RyaW5nKCkpOworCQl9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkVycm9yIHdyaXRpbmcgSEVBREVSIHRvIENTViBBbmFseXNpcyBmaWxlIgorCQkJCQkrIG91dHB1dEZpbGVOYW1lICsgb3V0cHV0RmlsZU5hbWUsIGUpOworCQl9CisKKwkJLy8gZ2V0IHRoZSBzaXplIG9mIHRoZSBsb25nZXN0IGFycmF5CisJCWludCBtYXhSb3dzID0gMDsKKwkJaW50IG51bUFycmF5cyA9IGRhdGFMaXN0LnNpemUoKTsKKwkJZm9yKGludCBpID0gMDsgaSA8IG51bUFycmF5czsgaSArKykgeworCQkJZG91YmxlW10gZGF0YSA9IGRhdGFMaXN0LmdldChpKTsKKwkJCWlmKGRhdGEubGVuZ3RoID49IG1heFJvd3MpIG1heFJvd3MgPSBkYXRhLmxlbmd0aDsKKwkJfQorCisKKwkJLy8gcm93cworCQlmb3IoaW50IHkgPSAwOyB5IDwgbWF4Um93czsgeSArKykgeworCQkJLy9TdHJpbmcgc3RyID0geSsiICI7CisJCQkvLyBjb2x1bW5zCisJCQkKKwkJCXN0ckJsZHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJc3RyQmxkci5hcHBlbmQoeSk7CisJCQlzdHJCbGRyLmFwcGVuZCgiICIpOworCQkJCisJCQlmb3IoaW50IHggPSAwOyB4IDwgbnVtQXJyYXlzOyB4ICsrKSB7CisJCQkJZG91YmxlW10gZGF0YSA9IGRhdGFMaXN0LmdldCh4KTsKKwkJCQlpZihkYXRhLmxlbmd0aD49IG1heFJvd3MpIHsKKwkJCQkJc3RyQmxkci5hcHBlbmQoIiwgIik7CisJCQkJCXN0ckJsZHIuYXBwZW5kKGRhdGFbeV0pOworCQkJCX0KKwkJCX0KKworCQkJc3RyQmxkci5hcHBlbmQoIlxuIik7CisJCQl0cnkgeworCQkJCWZ3LndyaXRlKHN0ckJsZHIudG9TdHJpbmcoKSk7CisJCQl9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJFcnJvciB3cml0aW5nIGRhdGEgdG8gQ1NWIEFuYWx5c2lzIGZpbGUiCisJCQkJCQkrIG91dHB1dEZpbGVOYW1lICsgb3V0cHV0RmlsZU5hbWUsIGUpOworCQkJfQorCQl9CisKKwkJdHJ5IHsKKwkJCWZ3LmZsdXNoKCk7CisJCQlmdy5jbG9zZSgpOworCQl9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoCisJCQkJCSJFcnJvciBjbG9zaW5nIENTViBhbmFseXNpcyBmaWxlIgorCQkJCQkrIG91dHB1dEZpbGVOYW1lICsgb3V0cHV0RmlsZU5hbWUsIGUpOworCQl9CisJfS8vIGxvZyBkYXRhCisKKworCS8qKgorCSAqIExvZyB0aGUgZGF0YSBmb3IgYSBsaXN0IG9mIHRyYWplY3RvcmllcworCSAqIEBwYXJhbSBkaW1lbnNpb24gb2YgdGhlIHNwYWNlIChhbHdheXMgMiBmb3Igbm93KQorCSAqIEBwYXJhbSBkYXRhTGlzdCAKKwkgKi8KKwlwdWJsaWMgdm9pZCBsb2dEYXRhKGludCBkaW1lbnNpb24sIExpc3Q8UGhhc2VTcGFjZUNvb3JkaW5hdGVbXT4gZGF0YUxpc3QpIHsKKworCisJCS8vIGdldCB0aGUgc2l6ZSBvZiB0aGUgbG9uZ2VzdCBhcnJheQorCQlpbnQgbWF4Um93cyA9IDA7CisJCWludCBudW1BcnJheXMgPSBkYXRhTGlzdC5zaXplKCk7CisJCWZvcihpbnQgaSA9IDA7IGkgPCBudW1BcnJheXM7IGkgKyspIHsKKwkJCVBoYXNlU3BhY2VDb29yZGluYXRlW10gZGF0YSA9IGRhdGFMaXN0LmdldChpKTsKKwkJCWlmKGRhdGEubGVuZ3RoID49IG1heFJvd3MpIG1heFJvd3MgPSBkYXRhLmxlbmd0aDsKKwkJfQorCisKKwkJLy8gcm93cworCQlmb3IoaW50IHkgPSAwOyB5IDwgbWF4Um93czsgeSArKykgeworCQkJLy8gY29sdW1ucworCQkJLy9TdHJpbmcgc3RyID0gIiI7CisKKwkJCVN0cmluZ0J1aWxkZXIgc3RyQmxkciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKwkJCWZvcihpbnQgeCA9IDA7IHggPCBudW1BcnJheXM7IHggKyspIHsKKwkJCQlQaGFzZVNwYWNlQ29vcmRpbmF0ZVtdIGRhdGEgPSBkYXRhTGlzdC5nZXQoeCk7CisJCQkJaWYoZGF0YS5sZW5ndGg+PSBtYXhSb3dzKSB7CisJCQkJCXN0ckJsZHIuYXBwZW5kKGRhdGFbeV0ueFZhbHVlKTsKKwkJCQkJc3RyQmxkci5hcHBlbmQoIiwgIik7CisJCQkJCXN0ckJsZHIuYXBwZW5kKGRhdGFbeV0ueVZhbHVlKTsKKwkJCQkJc3RyQmxkci5hcHBlbmQoIiAgIik7CisJCQkJCWlmKHggPCBudW1BcnJheXMtMSkgeworCQkJCQkJc3RyQmxkci5hcHBlbmQoIiwgIik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlzdHJCbGRyLmFwcGVuZCgiXG4iKTsKKwkJCXRyeSB7CisJCQkJZncud3JpdGUoc3RyQmxkci50b1N0cmluZygpKTsKKwkJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKwkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkVycm9yIHdyaXRpbmcgZGF0YSB0byBDU1YgQW5hbHlzaXMgZmlsZSIKKwkJCQkJCSsgb3V0cHV0RmlsZU5hbWUgKyBvdXRwdXRGaWxlTmFtZSwgZSk7CisJCQl9CisJCX0KKworCQl0cnkgeworCQkJZncuZmx1c2goKTsKKwkJCWZ3LmNsb3NlKCk7CisJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigKKwkJCQkJIkVycm9yIGNsb3NpbmcgQ1NWIGFuYWx5c2lzIGZpbGUiCisJCQkJCSsgb3V0cHV0RmlsZU5hbWUgKyBvdXRwdXRGaWxlTmFtZSwgZSk7CisJCX0KKworCisKKworCX0vLyBsb2cgZGF0YQorCisKKwkvKioKKwkgKiBMb2cgdGhlIGRhdGEgZm9yIGEgY29tcGFyaXNvbiBvZiBtdWx0aXBsZSBzY2VuYXJpb3MgdmVyc3VzIGEgcmVmZXJlbmNlCisJICogc2NlbmFyaW8KKwkgKiBAcGFyYW0gZGF0YSAKKwkgKi8KKwlwdWJsaWMgdm9pZCBsb2dEYXRhKE1hcDxNYXA8U3RyaW5nLCBTdHJpbmc+LCBFcnJvclJlc3VsdD4gZGF0YSkgeworCQkvLyB3cml0ZSB0aGUgaGVhZGVyIHBhcmFtIG5hbWVzIHBsdXMgdGhlIGhlYWRlciBmb3IgdGhlIFJNUyBkaWZmZXJlbmNlCisJCS8vIEp1c3QgZ2V0IHRoZSBmaXJzdCBrZXkgYW5kIHVzZSB0aGUgcGFyYW0gbmFtZXMgZnJvbSBpdAorCQl0cnkgeworCQkJTWFwPFN0cmluZywgU3RyaW5nPiBmaXJzdFJlc3VsdCA9IGRhdGEua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7CisJCQlTZXQ8U3RyaW5nPiBwYXJtcyA9IGZpcnN0UmVzdWx0LmtleVNldCgpOworCQkJZm9yKFN0cmluZyBwIDogcGFybXMpIHsKKwkJCQlmdy53cml0ZShwKTsKKwkJCQlmdy53cml0ZSgiLCIpOworCQkJfQorCQkJZncud3JpdGUoIlJNUyIpOworCQkJZncud3JpdGUoIlxuIik7CisKKwkJCS8vIE5vdyB3cml0ZSB0aGUgcmVzdWx0CisKKwkJCWZvcihNYXA8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogZGF0YS5rZXlTZXQoKSkgeworCQkJCUVycm9yUmVzdWx0IHJlcyA9IGRhdGEuZ2V0KGVudHJ5KTsKKwkJCQkvLyBDb21wdXRlIGF2ZXJhZ2UKKwkJCQlDb2xsZWN0aW9uPFN0cmluZz4gcHZhbHVlcyA9IGVudHJ5LnZhbHVlcygpOworCQkJCWZvcihTdHJpbmcgcHZhbCA6IHB2YWx1ZXMpIHtmdy53cml0ZShwdmFsKTtmdy53cml0ZSgiLCIpO30KKwkJCQlkb3VibGUgZXJyb3IgPSAwOworCQkJCWlmKHJlcyE9bnVsbCl7CisJCQkJCWVycm9yID0gcmVzLmdldEVycm9yKCk7CisJCQkJfQorCQkJCWZ3LndyaXRlKGVycm9yKyIiKTsKKwkJCQlmdy53cml0ZSgiXG4iKTsKKworCQkJfQorCQl9IGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgeworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKAorCQkJCQkiRXJyb3IgY2xvc2luZyBDU1YgYW5hbHlzaXMgZmlsZSIKKwkJCQkJKyBvdXRwdXRGaWxlTmFtZSArIG91dHB1dEZpbGVOYW1lLCBpb2UpOworCQl9CQorCisJfQorCisKKwkvKgorCSAqIHByaXZhdGUgR3JhcGggZ2V0R3JhcGgoZmluYWwgTm9kZSBub2RlKSB7IHJldHVybiAoR3JhcGgpCisJICogbm9kZS5lQ29udGFpbmVyKCkuZUNvbnRhaW5lcigpOyB9IC8vIGdldEdyYXBoCisJICovCisKKwkvKioKKwkgKiBGbHVzaCBhbmQgQ2xvc2UgdGhlIGZpbGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBmbHVzaExvZ2dlckRhdGEoKSB7CisJCXRyeSB7CisJCQlpZiAoZncgIT0gbnVsbCkgZncuZmx1c2goKTsKKwkJfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworCQkJLy8gZG8gbm90aGluZworCQl9CisKKwl9IC8vIGZsdXNoIEFsbCBEYXRhCisKKwkvKioKKwkgKiBGbHVzaCBhbmQgQ2xvc2UgdGhlIGZpbGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBjbG9zZUxvZ2dlckRhdGEoKSB7CisJCWZsdXNoTG9nZ2VyRGF0YSgpOworCisJCWlmIChmdyA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKworCQl0cnkgeworCQkJZncuY2xvc2UoKTsKKwkJfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJFcnJvciBDTE9TSU5HIENTViBMb2dnZXIgZmlsZSIgKyBvdXRwdXRGaWxlTmFtZQorCQkJCQkrIG91dHB1dEZpbGVOYW1lLCBlKTsKKwkJfQorCQkvLyBmb3IgdGVzdGluZworCX0gLy8gbG9nQWxsIERhdGEKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvQ3ljbGVDb21wcmVzc29yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9DeWNsZUNvbXByZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDk1NjkwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvQ3ljbGVDb21wcmVzc29yLmphdmEKQEAgLTAsMCArMSwyNzAgQEAKKy8qKgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIHRha2UgYSB0aW1lIHNlcmllcyB3aXRoIG11bHRpcGxlIGVwaWRlbWljIHdhdmVzLiBJdCBjb2xsYXBzZXMgdGhlIGRhdGEgaW50bworICogYSBzaW5nbGUgImF2ZXJhZ2VkIiBjeWNsZSBhbGlnbmluZyB0aGUgcGVha3Mgb2YgZWFjaCBlcGlkZW1pYyB1c2luZyBhIHNtb290aGluZyBhbmQgcGVhayBmaW5kaW5nIGFsZ29yaXRobQorKi8KK3B1YmxpYyBjbGFzcyBDeWNsZUNvbXByZXNzb3IgeworCQorCW9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGRhdGE7CisJCisJLyoqCisJICogdGhpcyBwaGFzZSBzaGlmdCBtYXhpbWl6ZXMgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIHR3byB2ZWN0b3JzCisJICovCisJc3RhdGljIGZpbmFsIGludCBXSU5ET1cgPSAzNjU7CisJCisJLyoqCisJICogYnkgZGVmYXVsdCB3ZSB3aWxsIHRyeSB0byBmaW5kIG1heCBjb3JyZWxhdGlvbiBmb3IgYSBzaGlmdCBvZiArLy0gMzAgZGF5cworCSAqIGlmIHRoZSB2ZWN0b3JzIGFyZSBzaG9ydGVyIHRoYW4gdGhpcyB3ZSByZWR1Y2UgdGhlIHdpbmRvdworCSAqLworCXN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9QSEFTRV9TSElGVCA9IDMwOworCQorCS8qKgorCSAqIHRoZSBwZWFrIHBvc2l0aW9ucworCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdDxJbnRlZ2VyPiBwZWFrUG9zaXRpb25zID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCQorCXN0YXRpYyBMaXN0PERvdWJsZT4gY29tcHJlc3NlZEN5Y2xlcyA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gREFZX09GX0NIQU5OVUtBID0geyAzNDcsIDcwMiwgMTA4NiwgMTQzMCwgMTc5NCwgMjE3OSwKKwkJCQkJCQkJCQkgICAyNTMzLCAyOTE2LCAzMjcxLCAzNjI1LCA0MDA4IH07CisKKwkKKwkKKwkvKioKKwkgKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIHRha2UgYSBSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZShzKSBhbmQgdG8gcmVjb25zdHJ1Y3QgYSBzaW5nbGUgImF2ZXJhZ2VkIiBvciAKKwkgKiB0eXBpY2FsIGVwaWRlbWljIHdhdmUgZnJvbSBhIHRpbWUgc2VyaWVzIGNvbnRhaW5pbmcgbWFueSBzdWNoIHdhdmVzLgorCSAqIE5vdGUgdGhhdCB0aGUgcGVhayBmaW5kZXIgYWxnb3JpdGhtIG9wZXJhdGVzIG9uIHNtb290aGVkIGRhdGEgYnV0IG9uY2UgdGhlIHBlYWtzIGFyZSBsb2NhdGVkCisJICogdGhlIGludGVncmF0aW9uIGFuZCBub3JtYWxpemF0aW9uIGlzIGRvbmUgd2l0aCB0aGUgcmF3IGRhdGEuCisJICogQHBhcmFtIGRhdGFJbnN0YW5jZQorCSAqIAorCSAqLworCXB1YmxpYyBDeWNsZUNvbXByZXNzb3IoUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UgZGF0YUluc3RhbmNlKSB7CisJCWRhdGEgPSBkYXRhSW5zdGFuY2U7CisJCVN0cmluZyBrZXkgPSAiSW5jaWRlbmNlIjsgLy8gdGhpcyBvbmx5IHdvcmtzIGZvciBpbmNpZGVuY2UgZGF0YSByaWdodCBub3cKKwkJcGVha1Bvc2l0aW9ucyA9IHRoaXMuZ2V0RGVsYXlBZnRlckNoYW5udWthKGRhdGEsIGtleSApOworCQkvL3BlYWtQb3NpdGlvbnMgPSB0aGlzLmdldFBlYWtQb3NpdGlvbnMoZGF0YSwga2V5ICk7CisJCQorCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwZWFrUG9zaXRpb25zLnNpemUoKTsgaSArKykgeworCQkJaW50IHBlYWsgPSBwZWFrUG9zaXRpb25zLmdldChpKS5pbnRWYWx1ZSgpOworCQkJU3lzdGVtLm91dC5wcmludCgiIitwZWFrKyIsIik7CisJCX0KKwkJU3lzdGVtLm91dC5wcmludGxuKCItMSIpOworCQkKKwkJY29tcHJlc3NlZEN5Y2xlcyA9IHRoaXMuY29tcHJlc3NEYXRhKGRhdGEsIHBlYWtQb3NpdGlvbnMsIGtleSk7CisJfQorCQorCS8qKgorCSAqIEZpbmRzIGluZGV4IG9mIHBlYWtzLCByZXR1cm5zIGFzIGxpc3QKKwkgKiBAcGFyYW0gaW5zdGFuY2UKKwkgKiBAcGFyYW0ga2V5IAorCSAqIEBwYXJhbWV0ZXIga2V5IChtdXN0IGJlIEksIEUsIG9yIGluY2lkZW5jZSAtIHRoZXkgaGF2ZSBwZWFrcykKKwkgKiBAcmV0dXJuIGxpc3Qgb2YgcGVhayBwb3NpdGlvbnMKKwkgKi8KKwlwdWJsaWMgTGlzdDxJbnRlZ2VyPiBnZXRQZWFrUG9zaXRpb25zKFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGluc3RhbmNlLCBTdHJpbmcga2V5KSB7CisJCUxpc3Q8SW50ZWdlcj4gcGVha3MgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisJCQorCQlMaXN0PERvdWJsZT4gdmVjdG9yID0gaW5zdGFuY2UuZ2V0RGF0YSgpLmdldChrZXkpOworCQlMaXN0PERvdWJsZT4gc21vb3RoZWRPbmNlID0gc21vb3RoMyh2ZWN0b3IpOworCQlMaXN0PERvdWJsZT4gc21vb3RoZWQgPSBzbW9vdGgzKHNtb290aGVkT25jZSk7CisJCWludCBpc3RhcnQgPSAwOworCQlpbnQgaXN0b3AgPSBJTklUSUFMX1BIQVNFX1NISUZUOworCQlpbnQgcGVha1BvcyA9IGZpbmRQZWFrKHNtb290aGVkLGlzdGFydCxpc3RvcCk7CisJCWlmKHBlYWtQb3MhPWlzdGFydCkgcGVha3MuYWRkKEludGVnZXIudmFsdWVPZihwZWFrUG9zKSk7CisJCWludCBtYXhTdGFydEluZGV4ID0gc21vb3RoZWQuc2l6ZSgpIC0gV0lORE9XLzI7CisJCXdoaWxlKHBlYWtQb3MgPCBtYXhTdGFydEluZGV4ICkgeworCQkJaXN0YXJ0ID0gcGVha1BvcysoV0lORE9XLzIpOworCQkJaXN0b3AgPSBpc3RhcnQgKyBXSU5ET1c7CisJCQlwZWFrUG9zPSBmaW5kUGVhayhzbW9vdGhlZCxpc3RhcnQsaXN0b3ApOworCQkJcGVha3MuYWRkKEludGVnZXIudmFsdWVPZihwZWFrUG9zKSk7CisJCX0KKwkJcmV0dXJuIHBlYWtzOworCX0KKwkKKwkKKwkKKworCS8qKgorCSAqIEZpbmRzIGluZGV4IG9mIHBlYWtzLCByZXR1cm5zIGFzIGxpc3QKKwkgKiBAcGFyYW0gaW5zdGFuY2UKKwkgKiBAcGFyYW0ga2V5IAorCSAqIEBwYXJhbWV0ZXIga2V5IChtdXN0IGJlIEksIEUsIG9yIGluY2lkZW5jZSAtIHRoZXkgaGF2ZSBwZWFrcykKKwkgKiBAcmV0dXJuIGxpc3Qgb2YgcGVhayBwb3NpdGlvbnMKKwkgKi8KKwlwdWJsaWMgTGlzdDxJbnRlZ2VyPiBnZXREZWxheUFmdGVyQ2hhbm51a2EoUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UgaW5zdGFuY2UsIFN0cmluZyBrZXkpIHsKKwkJTGlzdDxJbnRlZ2VyPiBwZWFrcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKwkJCisJCUxpc3Q8RG91YmxlPiB2ZWN0b3IgPSBpbnN0YW5jZS5nZXREYXRhKCkuZ2V0KGtleSk7CisJCUxpc3Q8RG91YmxlPiBzbW9vdGhlZE9uY2UgPSBzbW9vdGgzKHZlY3Rvcik7CisJCUxpc3Q8RG91YmxlPiBzbW9vdGhlZCA9IHNtb290aDMoc21vb3RoZWRPbmNlKTsKKwkJCisJCWZvciAoaW50IGkgPSAwOyBpIDwgREFZX09GX0NIQU5OVUtBLmxlbmd0aDsgaSArKykgeworCQkJaW50IGlzdGFydCA9IERBWV9PRl9DSEFOTlVLQVtpXS0zMDsKKwkJCWludCBpc3RvcCA9IGlzdGFydCArIDkwOworCQkJLy9pbnQgcGVha1BvcyA9IGZpbmRGaXJzdFBlYWsoc21vb3RoZWQsaXN0YXJ0LGlzdG9wKTsKKwkJCWludCBwZWFrUG9zID0gZmluZFBlYWsoc21vb3RoZWQsaXN0YXJ0LGlzdG9wKTsKKwkJCXBlYWtzLmFkZChJbnRlZ2VyLnZhbHVlT2YocGVha1BvcykpOworCQl9CisJCQorCQlyZXR1cm4gcGVha3M7CisJfQorCQorCQorCS8qKgorCSAqIENyZWF0ZWQgYW5kICJhdmVyYWdlZCIgY3ljbGUgZnJvbSBzZXZlcmFsIHBlcmlvZHMgb2YgZGF0YQorCSAqIEBwYXJhbSBpbnN0YW5jZQorCSAqIEBwYXJhbSBwZWFrcworCSAqIEBwYXJhbSBrZXkKKwkgKiBAcmV0dXJuIHRoZSBjb21wcmVzc2VkIGRhdGEKKwkgKi8KKwlwdWJsaWMgTGlzdDxEb3VibGU+IGNvbXByZXNzRGF0YShSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBpbnN0YW5jZSwgTGlzdDxJbnRlZ2VyPiBwZWFrcywgU3RyaW5nIGtleSkgeworCQkKKwkJTGlzdDxEb3VibGU+IGRhdGEgPSBpbnN0YW5jZS5nZXREYXRhKCkuZ2V0KGtleSk7CisJCWRvdWJsZVtdIHN1bSA9IG5ldyBkb3VibGVbV0lORE9XXTsKKwkJZG91YmxlW10gZGVub20gPSBuZXcgZG91YmxlW1dJTkRPV107CisJCS8vMS4gIGluaXQKKwkJZm9yKGludCBpID0gMDsgaSA8IFdJTkRPVzsgaSArKykgeworCQkJc3VtW2ldID0gMC4wOworCQkJZGVub21baV0gPSAwLjA7CisJCX0KKwkgICAgLy8yLiAgaW50ZWdyYXRlIGFsbCBjeWNsZXMKKwkJZm9yIChpbnQgaVBlYWsgPSAwOyBpUGVhayA8IHBlYWtzLnNpemUoKTsgaVBlYWsgKyspIHsKKwkJCWludCBuZXh0UGVhayA9IHBlYWtzLmdldChpUGVhaykuaW50VmFsdWUoKTsKKwkJCWludCBpc3RhcnQgPSBuZXh0UGVhay1XSU5ET1cvMjsKKwkJCQorCQkJaW50IGluZGV4ID0gaXN0YXJ0OwkKKwkJCWZvcihpbnQgaSA9IDA7IGkgPCBXSU5ET1c7IGkgKyspIHsKKwkJCQlpZigoaW5kZXggPj0wKSYmKGluZGV4IDwgZGF0YS5zaXplKCkpKSB7CisJCQkJCWRvdWJsZSB2YWwgPSBkYXRhLmdldChpbmRleCkuZG91YmxlVmFsdWUoKTsKKwkJCQkJc3VtW2ldICs9IHZhbDsKKwkJCQkJZGVub21baV0gKz0gMS4wOworCQkJCX0vLyBpZiBpbiBib3VuZHMKKwkJCQlpbmRleCArKzsKKwkJCX0vLyBhbGwgZGF0YSBpbiB3aW5kb3cKKwkJCQorCQl9Ly8gYWxsIHBlYWtzCisJCS8vMy4gIG5vcm1hbGl6ZSB0aGUgcmVzdWx0IAorCQlMaXN0PERvdWJsZT4gY29tcHJlc3NlZCA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQlmb3IoaW50IGkgPSAwOyBpIDwgV0lORE9XOyBpICsrKSB7CisJCQkJaWYoZGVub21baV0gPD0gMC4wKSBkZW5vbVtpXSA9IDEuMDsgLy8gYWx3YXlzCisJCQkJZG91YmxlIHZhbCA9IHN1bVtpXSAvIGRlbm9tW2ldOworCQkJCWNvbXByZXNzZWQuYWRkKGksbmV3IERvdWJsZSh2YWwpKTsKKwkJfS8vIGFsbCBkYXRhIGluIHdpbmRvdworCQkKKwkJcmV0dXJuIGNvbXByZXNzZWQ7CisJfQorCQorCisJLyoqCisJICogQHBhcmFtIGRhdGFMaXN0CisJICogQHBhcmFtIGlzdGFydAorCSAqIEBwYXJhbSBpc3RvcAorCSAqIEByZXR1cm4gaW5kZXggb2YgcGVhayBwb3NpdGlvbiB3aXRoaW4gd2luZG93CisJICovCisJcHVibGljIHN0YXRpYyBpbnQgZmluZFBlYWsoTGlzdDxEb3VibGU+IGRhdGFMaXN0LCBpbnQgaXN0YXJ0LCBpbnQgaXN0b3ApIHsKKwkJaW50IHBlYWtJbmRleCA9IGlzdGFydDsKKwkJZG91YmxlIHBlYWtWYWwgPSAwLjA7CisJCWZvciAoaW50IGkgPSBpc3RhcnQ7IGkgPCBpc3RvcDsgaSArKykgeworCQkJaWYoaSA8IGRhdGFMaXN0LnNpemUoKSApIHsKKwkJCQlkb3VibGUgdmFsID0gZGF0YUxpc3QuZ2V0KGkpLmRvdWJsZVZhbHVlKCk7CisJCQkJaWYodmFsPnBlYWtWYWwpIHsKKwkJCQkJcGVha1ZhbCA9IHZhbDsKKwkJCQkJcGVha0luZGV4ID0gaTsKKwkJCQl9Ly8gaWYgcGVhaworCQkJfS8vIGlmIG5vdCBlbmQgb2YgZGF0YQorCQl9Ly8gZm9yIGFsbCBkYXRhCisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCBwZWFrIGF0ICIrcGVha0luZGV4KyIgdmFsPSIrcGVha1ZhbCk7CisJCXJldHVybiBwZWFrSW5kZXg7CisJfS8vIGZpbmRQZWFrCisKKworCS8qKgorCSAqIEBwYXJhbSBkYXRhTGlzdAorCSAqIEBwYXJhbSBpc3RhcnQKKwkgKiBAcGFyYW0gaXN0b3AKKwkgKiBAcmV0dXJuIGluZGV4IG9mIHBlYWsgcG9zaXRpb24gd2l0aGluIHdpbmRvdworCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IGZpbmRGaXJzdFBlYWsoTGlzdDxEb3VibGU+IGRhdGFMaXN0LCBpbnQgaXN0YXJ0LCBpbnQgaXN0b3ApIHsKKwkJaW50IHBlYWtJbmRleCA9IGlzdGFydDsKKwkJZG91YmxlIHBlYWtWYWwgPSAwLjA7CisJCWZvciAoaW50IGkgPSBpc3RhcnQ7IGkgPCBpc3RvcDsgaSArKykgeworCQkJaWYoaSA8IGRhdGFMaXN0LnNpemUoKSApIHsKKwkJCQlkb3VibGUgdmFsID0gZGF0YUxpc3QuZ2V0KGkpLmRvdWJsZVZhbHVlKCk7CisJCQkJaWYodmFsPj1wZWFrVmFsKSB7CisJCQkJCXBlYWtWYWwgPSB2YWw7CisJCQkJCXBlYWtJbmRleCA9IGk7CisJCQkJfS8vIGlmIHBlYWsKKwkJCQllbHNlIHsKKwkJCQkJcmV0dXJuIHBlYWtJbmRleDsKKwkJCQl9CisJCQl9Ly8gaWYgbm90IGVuZCBvZiBkYXRhCisJCX0vLyBmb3IgYWxsIGRhdGEKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIHBlYWsgYXQgIitwZWFrSW5kZXgrIiB2YWw9IitwZWFrVmFsKTsKKwkJcmV0dXJuIHBlYWtJbmRleDsKKwl9Ly8gZmluZFBlYWsKKwkKKwkKKwkKKwkvKiogCisJICogZG8gYSB0aHJlZSBwb2ludCBzbW9vdGgKKwkgKiBAcGFyYW0gZGF0YUxpc3QKKwkgKiBAcmV0dXJuIHRoZSBzbW9vdGhlZCBkYXRhCisJICovCisJcHVibGljIHN0YXRpYyBMaXN0PERvdWJsZT4gc21vb3RoMyhMaXN0PERvdWJsZT4gZGF0YUxpc3QpIHsKKwkJTGlzdDxEb3VibGU+IHNtb290aCA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQlkb3VibGUgdjAgPSBkYXRhTGlzdC5nZXQoMCkuZG91YmxlVmFsdWUoKTsKKwkJZG91YmxlIHYxID0gZGF0YUxpc3QuZ2V0KDEpLmRvdWJsZVZhbHVlKCk7CisJCS8vIGFkZCB0aGUgZmlyc3QgZW5kcG9pbnQKKwkJc21vb3RoLmFkZCggbmV3IERvdWJsZSggKHYwK3YxKS8yLjApICk7CisJCQorCQkvLyBhZGQgdGhlIG90aGVycworCQlmb3IgKGludCBpID0gMTsgaSA8IGRhdGFMaXN0LnNpemUoKS0xOyBpICsrKSB7CisJCQlkb3VibGUgZDEgPSBkYXRhTGlzdC5nZXQoaS0xKS5kb3VibGVWYWx1ZSgpOworCQkJZG91YmxlIGQyID0gZGF0YUxpc3QuZ2V0KGkpLmRvdWJsZVZhbHVlKCk7CisJCQlkb3VibGUgZDMgPSBkYXRhTGlzdC5nZXQoaSsxKS5kb3VibGVWYWx1ZSgpOworCQkJc21vb3RoLmFkZChpLCBuZXcgRG91YmxlKCAoZDErZDIrZDMpLzMuMCkgKTsKKwkJfQorCQlpbnQgaUxhc3QgPSBkYXRhTGlzdC5zaXplKCkgLTE7CisJCS8vIGFkZCB0aGUgbGFzdCBlbmQgcG9pbnQKKwkJdjAgPSBkYXRhTGlzdC5nZXQoaUxhc3QpLmRvdWJsZVZhbHVlKCk7CisJCXYxID0gZGF0YUxpc3QuZ2V0KGlMYXN0LTEpLmRvdWJsZVZhbHVlKCk7CisJCXNtb290aC5hZGQoIG5ldyBEb3VibGUoICh2MCt2MSkvMi4wKSApOworCQkKKwkJcmV0dXJuIHNtb290aDsKKwl9Ly8gc21vb3RoCisJCisKKworCS8qKgorCSAqIGdldCB0aGUgcmVzdWx0CisJICogQHJldHVybiBjeWNsZSBjb21wcmVzc2VkIGRhdGEKKwkgKi8KKwlwdWJsaWMgZG91YmxlW10gZ2V0Q29tcHJlc3NlZERhdGEoKSB7CisJCWRvdWJsZVtdIHZhbHVlcyA9IG5ldyBkb3VibGVbY29tcHJlc3NlZEN5Y2xlcy5zaXplKCldOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXByZXNzZWRDeWNsZXMuc2l6ZSgpOyBpICsrKSB7CisJCQl2YWx1ZXNbaV0gPSBjb21wcmVzc2VkQ3ljbGVzLmdldChpKS5kb3VibGVWYWx1ZSgpOworCQl9CisJCXJldHVybiB2YWx1ZXM7CisJfQorIAorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvRGF0YVByb2Nlc3Nvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvRGF0YVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMTE0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9EYXRhUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw3NTIgQEAKKy8vIERhdGFQcm9jZXNzb3IuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLkFjdGl2YXRvcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlYWRzIGluY2lkZW5jZSBkYXRhIGZyb20gZmlsZXMgKGZpbGUgbmFtZXMga2V5ZWQgYnkgbG9jYXRpb24pIGFuZCAKKyAqIGNyZWF0ZXMgdGhlIG5ldyBmb3JtYXQgQ1NWIGZpbGVzIGZvciBTVEVNLgorICogSXQgcmV3cml0ZXMgdGhlIGluY2lkZW5jZS4KKyAqIEl0IGNvbXB1dGVzIGFuZCB3cml0ZXMgdGhlIFNJUiBhcHByb3hpbWF0aW9ucyBmcm9tIHRoZSBpbmNpZGVuY2UgYW5kIHRoZSAKKyAqIHBvcHVsYXRpb24gZGF0YS4KKyAqLworcHVibGljIGNsYXNzIERhdGFQcm9jZXNzb3IgeworCisJLyoqIAorCSAqIE5hbWUgb2YgdGhlIHJlc3VsdCBmaWxlcworCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNJREVOQ0VfRklMRV9OQU1FID0gIkluY2lkZW5jZV8yLmNzdiI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVU0NFUFRJQkxFX0ZJTEVfTkFNRSA9ICJTXzIuY3N2IjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GRUNUSU9VU19GSUxFX05BTUUgPSAiSV8yLmNzdiI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ09WRVJFRF9GSUxFX05BTUUgPSAiUl8yLmNzdiI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUFVMQVRJT05fRklMRV9OQU1FID0gIlBfMi5jc3YiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRJTkdfRlJBQ1RJT05fRklMRV9OQU1FID0gInJlcG9ydGluZ0ZyYWN0aW9uLmNzdiI7CisKKwkvKioKKwkgKiBJbmNpZGVuY2VzIHBlciBsb2NhdGlvbiBpZAorCSAqLworCXByaXZhdGUgTWFwPFN0cmluZyxMaXN0PERhdGE+PiBpbmNpZGVuY2VNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTGlzdDxEYXRhPj4oKTsKKwkKKwkvKioKKwkgKiBQb3B1bGF0aW9uIHNpemUgcGVyIGxvY2F0aW9uIGlkCisJICovCisJcHJpdmF0ZSBNYXA8U3RyaW5nLERvdWJsZT4gcG9wdWxhdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxEb3VibGU+KCk7CisKKwkvKioKKwkgKiBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIChkYXlzKSBmb3IgYSBzcGVjaWZpYyBsb2NhdGlvbiAKKwkgKi8KKwlwcml2YXRlIGludCBtYXhJdGVyYXRpb24gPSAwOworCQorCS8qKgorCSAqIFJlZmVyZW5jZSBwb3B1bGF0aW9uIGRheSAoZGF5IG9mIHBvcHVsYXRpb24gZGF0YSB2ZXJzdXMgdGhlIHN0YXJ0IGRhdGUgCisJICogb2YgdGhlIGRhdGEpCisJICovCisJcHJpdmF0ZSBsb25nIHJlZmVyZW5jZVBvcHVsYXRpb25EYXk7CisJCisJLyoqCisJICogUG9wdWxhdGlvbiBjaGFuZ2UgcGVyIGRheSAocG9wdWxhdGlvbiBzaXplIGF0IHRoZSBzdGFydCBkYXRlIG9mIHRoZSBkYXRhIAorCSAqIHZlcnN1cyB0aGUgc2l6ZSBhdCB0aGUgZW5kIGRhdGUgb2YgdGhlIGRhdGEpCisJICovCisJcHJpdmF0ZSBkb3VibGUgZnJhY3RDaGFuZ2VQb3B1bGF0aW9uUGVyRGF5OworCQorCS8qKgorCSAqIENvbXB1dGVzIGFuZCB3cml0ZXMgdGhlIFNJUiBhcHByb3hpbWF0aW9ucyBmcm9tIHRoZSBpbmNpZGVuY2UgYW5kIHRoZSAKKwkgKiBwb3B1bGF0aW9uIGRhdGEuCisJICogCisJICogQHBhcmFtIHNvdXJjZUZvbGRlciBUaGUgZm9sZGVyIG9mIHRoZSBzb3VyY2UgZGF0YQorCSAqIEBwYXJhbSB0YXJnZXRGb2xkZXIgVGhlIHRhcmdldCBmb2xkZXIgb2YgdGhlIHJlc3VsdHMKKwkgKiBAcGFyYW0gc3RhcnREYXRlIFRoZSBkYXRlIGluIHdoaWNoIHRoZSBkYXRhIHN0YXJ0cworCSAqIEBwYXJhbSBlbmREYXRlIFRoZSBkYXRlIGluIHdoaWNoIHRoZSBkYXRhIGVuZHMKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbkRhdGFGaWxlIFRoZSBwb3B1bGF0aW9uIGRhdGEgZmlsZQorCSAqIEBwYXJhbSBwb3B1bGF0aW9uU2l6ZVN0YXJ0WWVhciBQb3B1bGF0aW9uIHNpemUgaW4gdGhlIGZpcnN0IHllYXIgb2YgdGhlIGRhdGEKKwkgKiBAcGFyYW0gcG9wdWxhdGlvblNpemVFbmRZZWFyIFBvcHVsYXRpb24gc2l6ZSBpbiB0aGUgbGFzdCB5ZWFyIG9mIHRoZSBkYXRhCisJICogQHBhcmFtIHJlY292ZXJ5UmF0ZSBBdmVyYWdlIHRpbWUgaXQgdGFrZXMgYW4gaW5mZWN0aW91cyBwZXJzb24gdG8gcmVjb3ZlcgorCSAqIEBwYXJhbSBzdXNjZXB0aWJsZVJhdGUgUmF0ZSBvZiBpbml0aWFsIHN1c2NlcHRpYmxlIHRvIGRpc2Vhc2UKKwkgKiBAcGFyYW0gaW1tdW5pdHlMb3NzUmF0ZSBJbW11bml0eSBsb3NzIHJhdGUgdG8gZGlzZWFzZQorCSAqIAorCSAqIEB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiBUaHJvd24gd2hlbiB0aGUgcHJvY2VzcyBmYWlscworCSAqLworCXB1YmxpYyB2b2lkIHByb2Nlc3MoCisJCQlTdHJpbmcgc291cmNlRm9sZGVyLAorCQkJU3RyaW5nIHRhcmdldEZvbGRlciwKKwkJCURhdGUgc3RhcnREYXRlLAorCQkJRGF0ZSBlbmREYXRlLAorCQkJU3RyaW5nIHBvcHVsYXRpb25EYXRhRmlsZSwKKwkJCWxvbmcgcG9wdWxhdGlvblNpemVTdGFydFllYXIsCisJCQlsb25nIHBvcHVsYXRpb25TaXplRW5kWWVhciwKKwkJCWRvdWJsZSByZWNvdmVyeVJhdGUsCisJCQlkb3VibGUgc3VzY2VwdGlibGVSYXRlLAorCQkJZG91YmxlIGltbXVuaXR5TG9zc1JhdGUpIHRocm93cyBTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uIHsKKworCQlyZWFkUG9wdWxhdGlvbkRhdGEoCisJCQkJcG9wdWxhdGlvbkRhdGFGaWxlLCAKKwkJCQlzdGFydERhdGUsIAorCQkJCWVuZERhdGUsIAorCQkJCXBvcHVsYXRpb25TaXplU3RhcnRZZWFyLCAKKwkJCQlwb3B1bGF0aW9uU2l6ZUVuZFllYXIpOworCQkKKwkJcmVhZFNvdXJjZURhdGEoc291cmNlRm9sZGVyKTsKKwkJCisJCW1vZGVsRGlzZWFzZVN0YXRlKHJlY292ZXJ5UmF0ZSwgc3VzY2VwdGlibGVSYXRlLCBpbW11bml0eUxvc3NSYXRlKTsKKwkJCisJCXdyaXRlUmVzdWx0cyh0YXJnZXRGb2xkZXIpOworCQkKKwl9IC8vIHByb2Nlc3MKKworCS8qKgorCSAqIFJlYWQgdGhlIHBvcHVsYXRpb24gZGF0YS4KKwkgKiAKKwkgKiBAcGFyYW0gcG9wdWxhdGlvbkRhdGFGaWxlIFRoZSBwb3B1bGF0aW9uIGRhdGEgZmlsZXMKKwkgKiBAcGFyYW0gc3RhcnREYXRlIFRoZSBkYXRlIGluIHdoaWNoIHRoZSBkYXRhIHN0YXJ0cworCSAqIEBwYXJhbSBlbmREYXRlIFRoZSBkYXRlIGluIHdoaWNoIHRoZSBkYXRhIGVuZHMKKwkgKiBAcGFyYW0gcG9wdWxhdGlvblNpemVTdGFydFllYXIgUG9wdWxhdGlvbiBzaXplIGluIHRoZSBmaXJzdCB5ZWFyIG9mIHRoZSBkYXRhCisJICogQHBhcmFtIHBvcHVsYXRpb25TaXplRW5kWWVhciBQb3B1bGF0aW9uIHNpemUgaW4gdGhlIGxhc3QgeWVhciBvZiB0aGUgZGF0YQorCSAqIAorCSAqIEBleGNlcHRpb24gU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiAKKwkgKiAJCQkgIFRocm93biB3aGVuIGZhaWxlZCB0byBsb2FkIHRoZSBwb3B1bGF0aW9uIGRhdGEKKwkgKi8KKwlwcml2YXRlIHZvaWQgcmVhZFBvcHVsYXRpb25EYXRhKAorCQkJU3RyaW5nIHBvcHVsYXRpb25EYXRhRmlsZSwKKwkJCURhdGUgc3RhcnREYXRlLAorCQkJRGF0ZSBlbmREYXRlLAorCQkJbG9uZyBwb3B1bGF0aW9uU2l6ZVN0YXJ0WWVhciwKKwkJCWxvbmcgcG9wdWxhdGlvblNpemVFbmRZZWFyKSB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiB7CisKKwkJZmluYWwgU3RyaW5nIFBPUFVMQVRJT05fWUVBUiA9ICJZRUFSIjsKKworCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwb3B1bGF0aW9uRGF0YUZpbGUpOworCQkKKwkJQnVmZmVyZWRSZWFkZXIgZmlsZVJlYWRlciA9IG9wZW5SZWFkZXIoZmlsZSk7CisJCWlmIChmaWxlUmVhZGVyID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uKAorCQkJCQkiRmFpbGVkIHRvIG9wZW4gcG9wdWxhdGlvbiBkYXRhIGZpbGUgIiArIHBvcHVsYXRpb25EYXRhRmlsZSk7CisJCX0KKwkJCisJCS8vIGluaXRpYWxpemUgdGhlIHBvcHVsYXRpb24gZGF0YSB5ZWFyIHRvIHRoZSBmaXJzdCB5ZWFyIG9mIHRoZSBkYXRhICAKKwkJQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwkJY2FsLnNldFRpbWUoc3RhcnREYXRlKTsKKwkJaW50IHBvcHVsYXRpb25EYXRhWWVhciA9IGNhbC5nZXQoQ2FsZW5kYXIuWUVBUik7CisJCQorCQl0cnkgeworCQkJU3RyaW5nIGJ1ZmZlciA9IG51bGw7CisJCQl3aGlsZSAoRU9GKGJ1ZmZlciA9IGZpbGVSZWFkZXIucmVhZExpbmUoKSkgIT0gdHJ1ZSkgeworCQkJCWludCBpZHggPSBidWZmZXIuaW5kZXhPZigiPSIpOworCQkJCWlmKGlkeCA+PSAwKSB7CisJCQkJCVN0cmluZyBpZCA9IChidWZmZXIuc3Vic3RyaW5nKDAsaWR4KSkudHJpbSgpOworCQkJCQlTdHJpbmcgdmFsdWUgPSAoYnVmZmVyLnN1YnN0cmluZyhpZHgrMSxidWZmZXIubGVuZ3RoKCkpKS50cmltKCk7CisJCQkJCWlmKGlkLmVxdWFscyhQT1BVTEFUSU9OX1lFQVIpKSB7CisJCQkJCQkvLyBleHRyYWN0cyB0aGUgcG9wdWxhdGlvbiBkYXRhIHllYXIgZnJvbSB0aGUgZmlsZQorCQkJCQkJdHJ5IHsKKwkJCQkJCQlwb3B1bGF0aW9uRGF0YVllYXIgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKwkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgeworCQkJCQkJCS8vIGlnbm9yZQorCQkJCQkJCUFjdGl2YXRvci5sb2dJbmZvcm1hdGlvbigiRmFpbGVkIHRvIHJlYWQgcG9wdWxhdGlvbiB5ZWFyIiwgZXgpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgaWYoaWQuaW5kZXhPZigiLSIpID49IDApeworCQkJCQkJdHJ5IHsKKwkJCQkJCQlwb3B1bGF0aW9uTWFwLnB1dChpZCxuZXcgRG91YmxlKHZhbHVlKSk7CisJCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKKwkJCQkJCQkvLyBpZ25vcmUKKwkJCQkJCQlBY3RpdmF0b3IubG9nSW5mb3JtYXRpb24oIkZhaWxlZCB0byByZWFkIHBvcHVsYXRpb24gZm9yICIgKyBpZCwgZXgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZihwb3B1bGF0aW9uTWFwLmlzRW1wdHkoKSkgeworCQkJCXRocm93IG5ldyBTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVhZCBwb3B1bGF0aW9uIGRhdGEgZnJvbSAiICsgZmlsZS5nZXROYW1lKCkpOworCQkJfQorCisJCQkvLyBjb21wdXRhdGlvbiBvZiByZWZlcmVuY2UgcG9wdWxhdGlvbiBkYXkKKwkJCWNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisJCQljYWwuc2V0KENhbGVuZGFyLkRBWV9PRl9ZRUFSLCAxKTsKKwkJCWNhbC5zZXQoQ2FsZW5kYXIuWUVBUiwgcG9wdWxhdGlvbkRhdGFZZWFyKTsgLy8gcG9wdWxhdGlvbiBkYXRhIHllYXIKKwkJCWxvbmcgb2Zmc2V0ID0gY2FsLmdldFRpbWVJbk1pbGxpcygpLXN0YXJ0RGF0ZS5nZXRUaW1lKCk7IC8vIGluIG1pbGxpc2Vjb25kcworCQkJcmVmZXJlbmNlUG9wdWxhdGlvbkRheSA9IG9mZnNldC8oMTAwMCo2MCo2MCoyNCk7CisJCQkKKwkJCS8vIGNvbXB1dGF0aW9uIG9mIHBvcHVsYXRpb24gY2hhbmdlIHBlciBkYXkKKwkJCW9mZnNldCA9IGVuZERhdGUuZ2V0VGltZSgpLXN0YXJ0RGF0ZS5nZXRUaW1lKCk7IC8vIGluIG1pbGxpc2Vjb25kcworCQkJbG9uZyBvZmZzZXREYXlzID0gb2Zmc2V0LygxMDAwKjYwKjYwKjI0KTsKKwkJCWRvdWJsZSBjaGFuZ2VQb3B1bGF0aW9uUGVyRGF5ID0gCisJCQkJKChkb3VibGUpcG9wdWxhdGlvblNpemVFbmRZZWFyIC0gKGRvdWJsZSlwb3B1bGF0aW9uU2l6ZVN0YXJ0WWVhcikvKG9mZnNldERheXMrMSk7CisJCQkKKwkJCWZyYWN0Q2hhbmdlUG9wdWxhdGlvblBlckRheSA9IGNoYW5nZVBvcHVsYXRpb25QZXJEYXkvcG9wdWxhdGlvblNpemVTdGFydFllYXI7CisKKwkJfSBjYXRjaChJT0V4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oZXgpOworCQl9CisJCQorCX0gLy8gcmVhZFBvcHVsYXRpb25EYXRhCisJCisJLyoqCisJICogUmVhZCB0aGUgc291cmNlIGRhdGEuCisJICogCisJICogQHBhcmFtIHNvdXJjZUZvbGRlciBUaGUgZm9sZGVyIG9mIHRoZSBzb3VyY2UgZGF0YQorCSAqIAorCSAqIEBleGNlcHRpb24gU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiAKKwkgKiAJCQkgIFRocm93biB3aGVuIGZhaWxlZCB0byBsb2FkIHRoZSBzb3VyY2UgZGF0YSBmaWxlcworCSAqLworCXByaXZhdGUgdm9pZCByZWFkU291cmNlRGF0YSgKKwkJCVN0cmluZyBzb3VyY2VGb2xkZXIpIHRocm93cyBTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uIHsKKwkJCisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHNvdXJjZUZvbGRlcik7CisJCQkKKwkJaW50IG51bUZpbGVzID0gMDsKKwkJRmlsZVtdIGFsbEZpbGVzID0gZmlsZS5saXN0RmlsZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxGaWxlcy5sZW5ndGg7IGkrKykgeworCQkJdHJ5IHsKKwkJCQlyZWFkRGF0YUZyb21Tb3VyY2VGaWxlKGFsbEZpbGVzW2ldKTsKKwkJCQludW1GaWxlcyArKzsKKwkJCX0gY2F0Y2goU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJCUFjdGl2YXRvci5sb2dJbmZvcm1hdGlvbigiRmFpbGVkIHRvIHJlYWQgZGF0YSBmcm9tICIgKyBhbGxGaWxlc1tpXS5nZXROYW1lKCksIGV4KTsKKwkJCX0KKwkJfQorCQkKKwkJaWYobnVtRmlsZXMgPT0gMCkgeworCQkJdGhyb3cgbmV3IFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byByZWFkIHNvdXJjZSBkYXRhIGZyb20gIiArIHNvdXJjZUZvbGRlcik7CisJCX0KKwkJCisJfSAvLyByZWFkU291cmNlRGF0YQorCQorCS8qKgorCSAqIFJlYWQgZGF0YSBmcm9tIGEgc291cmNlIGZpbGUuCisJICogCisJICogQHBhcmFtIGZpbGUgQSBzb3VyY2UgZmlsZQorCSAqIAorCSAqIEBleGNlcHRpb24gU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiAKKwkgKiAJCQkgIFRocm93biB3aGVuIGZhaWxlZCB0byBsb2FkIGEgc291cmNlIGZpbGUKKwkgKi8KKwlwcml2YXRlIHZvaWQgcmVhZERhdGFGcm9tU291cmNlRmlsZSgKKwkJCUZpbGUgZmlsZSkgdGhyb3dzIFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24geworCQkKKwkJU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXROYW1lKCk7CisJCWlmIChmaWxlTmFtZS5pbmRleE9mKCIudHh0IikgPCAwKSB7CisJCQlyZXR1cm47IC8vIGlnbm9yZQorCQl9CisKKwkJQnVmZmVyZWRSZWFkZXIgZmlsZVJlYWRlciA9IG9wZW5SZWFkZXIoZmlsZSk7CisJCWlmIChmaWxlUmVhZGVyID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gb3BlbiBmaWxlICIgKyBmaWxlTmFtZSk7CisJCX0KKwkJCisJCWludCBpZHggPSBmaWxlTmFtZS5pbmRleE9mKCIudHh0Iik7CisJCVN0cmluZyBpZElucHV0ID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsaWR4KTsKKwkJU3RyaW5nIGlkID0gY29udmVydElEKGlkSW5wdXQpOworCQlpZiAoaWQgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBjb252ZXJ0ICIgKyBpZElucHV0ICsgIiB0byBTVEVNIElEIik7CisJCX0KKwkJCisJCURvdWJsZSBwb3B1bGF0aW9uID0gcG9wdWxhdGlvbk1hcC5nZXQoaWQpOworCQlpZiAocG9wdWxhdGlvbiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbigiTm8gcG9wdWxhdGlvbiBmb3VuZCBmb3IgIiArIGlkICsgIiBmcm9tICIgKyBpZElucHV0KTsKKwkJfQorCisJCWlmKCFpbmNpZGVuY2VNYXAuY29udGFpbnNLZXkoaWQpKSB7CisJCQlMaXN0PERhdGE+IGluY0xpc3QgPSBuZXcgQXJyYXlMaXN0PERhdGE+KCk7CisJCQlpbmNpZGVuY2VNYXAucHV0KGlkLCBpbmNMaXN0KTsKKwkJfQorCQlMaXN0PERhdGE+IGluY0xpc3QgPSBpbmNpZGVuY2VNYXAuZ2V0KGlkKTsKKworCQl0cnkgeworCQkJU3RyaW5nIGJ1ZmZlciA9IG51bGw7CisJCQlmaWxlUmVhZGVyLnJlYWRMaW5lKCk7IC8vIHNraXAgdGhlIGhlYWRlcgorCQkJd2hpbGUgKEVPRihidWZmZXIgPSBmaWxlUmVhZGVyLnJlYWRMaW5lKCkpICE9IHRydWUpIHsKKworCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJ1ZmZlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAorCQkgICAgICAgIFN0cmluZyBpdGVyYXRpb24gPSB0b2tlbml6ZXIubmV4dFRva2VuKCIsIik7CisJCSAgICAgICAgU3RyaW5nIHRpbWUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCIsIik7CisJCSAgICAgICAgU3RyaW5nIGluYyA9IHRva2VuaXplci5uZXh0VG9rZW4oIiwiKTsKKwkJCSAgICAKKwkJICAgICAgICBJbnRlZ2VyIGNvdW50ID0gbmV3IEludGVnZXIoaXRlcmF0aW9uLnRyaW0oKSk7CisJCQkgICAgZG91YmxlIHJlcG9ydHMgPSAobmV3IERvdWJsZShpbmMpKS5kb3VibGVWYWx1ZSgpOworCQkJICAgIGRvdWJsZSBwb3AgPSBnZXRQb3B1bGF0aW9uKGNvdW50LmludFZhbHVlKCksIHBvcHVsYXRpb24uZG91YmxlVmFsdWUoKSk7CisJCQkgICAgRGF0YSBkYXRhID0gbmV3IERhdGEoY291bnQsIHRpbWUsIHJlcG9ydHMsIHBvcCk7CisJCQkgICAgaW5jTGlzdC5hZGQoZGF0YSk7CisJCQkgICAgaWYoaW5jTGlzdC5zaXplKCkgPiBtYXhJdGVyYXRpb24pIHsKKwkJCSAgICAJbWF4SXRlcmF0aW9uID0gaW5jTGlzdC5zaXplKCk7CisJCQkgICAgfQorCQkJfQorCQl9IGNhdGNoKElPRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbihleCk7CisJCX0KKwkJCisJfSAvLyByZWFkRGF0YUZyb21Tb3VyY2VGaWxlCisKKwkvKioKKwkgKiBNb2RlbCB0aGUgUyxJLFIgZGlzZWFzZSBwYXJhbWV0ZXJzIGZyb20gaW5jaWRlbmNlIGRhdGEsIHBvcHVsYXRpb24sIGFuZCAKKwkgKiBtb2RlbGVkIHBhcmFtZXRlcnMgZm9yIHJlcG9ydGluZyBmcmFjdGlvbiBhbmQgcmVjb3ZlcnkgcmF0ZS4KKwkgKiAKKwkgKiBAcGFyYW0gcmVjb3ZlcnlSYXRlIEF2ZXJhZ2UgdGltZSBpdCB0YWtlcyBhbiBpbmZlY3Rpb3VzIHBlcnNvbiB0byByZWNvdmVyCisJICogQHBhcmFtIHN1c2NlcHRpYmxlUmF0ZSBSYXRlIG9mIGluaXRpYWwgc3VzY2VwdGlibGUgdG8gZGlzZWFzZQorCSAqIEBwYXJhbSBpbW11bml0eUxvc3NSYXRlIEltbXVuaXR5IGxvc3MgcmF0ZSB0byBkaXNlYXNlCisJICovCisJcHJpdmF0ZSB2b2lkIG1vZGVsRGlzZWFzZVN0YXRlKAorCQkJZG91YmxlIHJlY292ZXJ5UmF0ZSwKKwkJCWRvdWJsZSBzdXNjZXB0aWJsZVJhdGUsCisJCQlkb3VibGUgaW1tdW5pdHlMb3NzUmF0ZSkgeworCQkKKwkJLy8gZm9yIGFsbCBsb2NhdGlvbnMKKwkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gcG9wdWxhdGlvbk1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworCQl3aGlsZShpdGVyLmhhc05leHQoKSkgeworCQkJU3RyaW5nIGlkID0gaXRlci5uZXh0KCk7CisJCQkKKwkJCWlmKCFpbmNpZGVuY2VNYXAuY29udGFpbnNLZXkoaWQpKSB7CisJCQkJLy8gaWdub3JlIC0gbm8gaW5jaWRlbmNlcyBmb3IgdGhpcyBsb2NhdGlvbiBpZAorCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlMaXN0PERhdGE+IGRhdGFMaXN0ID0gaW5jaWRlbmNlTWFwLmdldChpZCk7CisJCQkJCisJCQlkb3VibGUgbWluRnJhY3Rpb24gPSAxMC4wOworCQkJZG91YmxlIGJlc3RGcmFjdGlvbiA9IDEuMDsKKwkJCWRvdWJsZSBtaW5TbG9wZSA9IERvdWJsZS5NQVhfVkFMVUU7CisJCQkKKwkJCS8vIGRyb3AgdGhlIHJlcG9ydGluZyBmcmFjdGlvbiB1bnRpbCB3ZSBoaXQgbmVnYXRpdmUgUyAKKwkJCS8vIHRoaXMgc2V0cyB0aGUgTUlOIHJlcG9ydGluZyBmcmFjdGlvbgorCQkJYm9vbGVhbiB2YWxpZCA9IHRydWU7CisJCQlib29sZWFuIHBvaW50T0sgPSB0cnVlOworCQkJZmluYWwgaW50IG1heGRlbHRhID0gMTAwMDsKKwkJCWludCBpZGVsdGEgPSBtYXhkZWx0YTsKKwkJICAgIGRvdWJsZSBzY2FsZSA9IDEwMDAwMDsKKwkJCWZvciAoaW50IGlmcmFjdGlvbiA9IChpbnQpc2NhbGU7ICgoaWZyYWN0aW9uID4gMSkmJnZhbGlkKTsgaWZyYWN0aW9uIC09IGlkZWx0YSkgeworCQkJCXBvaW50T0sgPSB0cnVlOworCQkJCWlmKChpZnJhY3Rpb248PSBpZGVsdGEpJiYoaWRlbHRhID49MTApKXsKKwkJCQkJaWRlbHRhIC89IDEwOworCQkJCX0KKwkJCQlkb3VibGUgZnJhY3Rpb24gPSBpZnJhY3Rpb24vc2NhbGU7CisJCQkJCisJCQkJLy8gZm9yIGFsbCBpdGVyYXRpb25zCisJCQkJLy8gcmUtc2NhbGUgdGhlIGluY2lkZW5jZSBhbmQgaW50ZWdyYXRlIGl0IG92ZXIgdGltZQorCQkJCS8vIGFuZCBzdWJ0cmFjdGluZyBmcm9tIHRoZSBzdXNjZXB0aWJsZSBhdCBlYWNoIHRpbWUgc3RlcAorCQkJCWRvdWJsZSBpbnRlZ3JhdGVkSW5mZWN0aW91cyA9IDAuMDsKKwkJCQlkb3VibGUgaW50ZWdyYXRlZFJlY292ZXJpZXMgPSAwLjA7CisJCQkJZG91YmxlW10geWRhdGFTID0gbmV3IGRvdWJsZVttYXhJdGVyYXRpb25dOworCQkJCWRvdWJsZVtdIHlkYXRhUiA9IG5ldyBkb3VibGVbbWF4SXRlcmF0aW9uXTsKKwkJCQlkb3VibGVbXSB4ZGF0YSA9IG5ldyBkb3VibGVbbWF4SXRlcmF0aW9uXTsKKwkJCQlmb3IoaW50IGk9MDsgaTxtYXhJdGVyYXRpb247IGkrKykgeworCQkJCQl5ZGF0YVNbaV0gPSAwLjA7CisJCQkJCXlkYXRhUltpXSA9IDAuMDsKKwkJCQkJeGRhdGFbaV0gPSAwLjA7CisJCQkJfQorCQkJCQorCQkJCWZvciAoaW50IGkgPSAwOyAoKGkgPCBkYXRhTGlzdC5zaXplKCkpJiZ2YWxpZCk7IGkgKyspIHsKKwkJCQkJRGF0YSBkYXRhID0gZGF0YUxpc3QuZ2V0KGkpOworCQkJCQlkb3VibGUgaW5jaWRlbmNlID0gZGF0YS5yZXBvcnRzL2ZyYWN0aW9uOworCQkJCQlkb3VibGUgcG9wdWxhdGlvbiA9IGRhdGEucG9wdWxhdGlvbjsKKwkJCQkJaW50ZWdyYXRlZEluZmVjdGlvdXMgKz0gaW5jaWRlbmNlOworCQkJCQlkb3VibGUgcmVjb3ZlcmllcyA9IGludGVncmF0ZWRJbmZlY3Rpb3VzICogcmVjb3ZlcnlSYXRlOyAKKwkJCQkJaW50ZWdyYXRlZFJlY292ZXJpZXMgKz0gcmVjb3ZlcmllczsKKwkJCQkJLy8gc2V0IHRoZSBpbml0aWFsIHJlY292ZXJlZAorCQkJCQlpZihpPT0wKXsgCisJCQkJCQlpbnRlZ3JhdGVkUmVjb3ZlcmllcyArPSAoMS4wLXN1c2NlcHRpYmxlUmF0ZSkgKiBwb3B1bGF0aW9uOworCQkJCQl9CisJCQkJCWludGVncmF0ZWRJbmZlY3Rpb3VzIC09IHJlY292ZXJpZXM7CisJCQkJCWRvdWJsZSBpbmZlY3Rpb3VzID0gaW50ZWdyYXRlZEluZmVjdGlvdXM7CisJCQkJCWludGVncmF0ZWRSZWNvdmVyaWVzICo9ICgxLjAgLSBpbW11bml0eUxvc3NSYXRlKTsKKwkJCQkJZG91YmxlIHJlY292ZXJlZCA9IGludGVncmF0ZWRSZWNvdmVyaWVzOworCQkJCQlkb3VibGUgc3VzY2VwdGlibGUgPSBwb3B1bGF0aW9uIC0gKGluZmVjdGlvdXMgKyByZWNvdmVyZWQpOworCQkJCQl5ZGF0YVNbaV0gPSBzdXNjZXB0aWJsZS9wb3B1bGF0aW9uOworCQkJCQl5ZGF0YVJbaV0gPSByZWNvdmVyZWQvcG9wdWxhdGlvbjsKKwkJCQkJeGRhdGFbaV0gPSBpOworCQkJCQlpZigoc3VzY2VwdGlibGUgPj0gMC4wKSAmJihyZWNvdmVyZWQ+PTAuMCkmJihpbmZlY3Rpb3VzPj0gMC4wKSl7CisJCQkJCQltaW5GcmFjdGlvbiA9IGZyYWN0aW9uOworCQkJCQkJZGF0YS5yZXBvcnRpbmdGcmFjdGlvbiA9IG1pbkZyYWN0aW9uOworCQkJCQl9IGVsc2UgeworCQkJCQkJcG9pbnRPSyA9IGZhbHNlOworCQkJCQkJaWYoaWRlbHRhID4gMSkgeworCQkJCQkJCS8vIGJhY2sgdXAgYW5kIHRha2Ugc21hbGxlciBzdGVwcworCQkJCQkJCWlmcmFjdGlvbiArPSBpZGVsdGE7CisJCQkJCQkJaWRlbHRhIC89IDEwOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl2YWxpZCA9IGZhbHNlOworCQkJCQkJCWlkZWx0YSA9IG1heGRlbHRhOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYoISh2YWxpZCYmcG9pbnRPSykpIGJyZWFrOworCQkJCX0gLy8gZm9yIGkgdGltZSBzdGVwcworCQkJCQorCQkJCWlmKHZhbGlkJiZwb2ludE9LKSB7CisJCQkJCWRvdWJsZSBzbG9wZSA9IGdldFNsb3BlTGluZWFyKHhkYXRhLHlkYXRhUyk7CisJCQkJCWlmIChNYXRoLmFicyhzbG9wZSkgPD0gbWluU2xvcGUpIHsKKwkJCQkJCW1pblNsb3BlID0gTWF0aC5hYnMoc2xvcGUpOworCQkJCQkJYmVzdEZyYWN0aW9uID0gZnJhY3Rpb247CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQl9IC8vIGZvciBhbGwgcmVwb3J0aW5nIGZyYWN0aW9ucworCisJCQkvLyBzZXQgdGhlIGZyYWN0aW9ucworCQkJZm9yIChpbnQgaSA9IDA7ICgoaSA8IGRhdGFMaXN0LnNpemUoKSkmJnZhbGlkKTsgaSArKykgeworCQkJCURhdGEgZGF0YSA9IGRhdGFMaXN0LmdldChpKTsKKwkJCQlpZigoYmVzdEZyYWN0aW9uPCAwLjkpJiYoYmVzdEZyYWN0aW9uID49IGRhdGEucmVwb3J0aW5nRnJhY3Rpb24pKXsKKwkJCQkJZGF0YS5yZXBvcnRpbmdGcmFjdGlvbiA9IGJlc3RGcmFjdGlvbjsKKwkJCQl9CisJCQl9IC8vIGZvciBhbGwgdGltZXMKKwkJfSAvLyBmb3IgYWxsIGxvY2F0aW9ucworCQkKKwkJLy8gZm9yIGFsbCBsb2NhdGlvbnMKKwkJaXRlciA9IHBvcHVsYXRpb25NYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyBpZCA9IGl0ZXIubmV4dCgpOworCQkJaWYoIWluY2lkZW5jZU1hcC5jb250YWluc0tleShpZCkpIHsKKwkJCQkvLyBpZ25vcmUgLSBubyBpbmNpZGVuY2VzIGZvciB0aGlzIGxvY2F0aW9uIGlkCisJCQkJY29udGludWU7CisJCQl9CisJCQlMaXN0PERhdGE+IGRhdGFMaXN0ID0gaW5jaWRlbmNlTWFwLmdldChpZCk7CisKKwkJCS8vIGZvciBhbGwgaXRlcmF0aW9ucworCQkJLy8gcmUtc2NhbGUgdGhlIGluY2lkZW5jZSBhbmQgaW50ZWdyYXRlIGl0IG92ZXIgdGltZQorCQkJLy8gYW5kIHN1YnRyYWN0aW5nIGZyb20gdGhlIHN1c2NlcHRpYmxlIGF0IGVhY2ggdGltZSBzdGVwCisJCQlkb3VibGUgaW50ZWdyYXRlZEluZmVjdGlvdXMgPSAwLjA7CisJCQlkb3VibGUgaW50ZWdyYXRlZFJlY292ZXJpZXMgPSAwLjA7CisKKwkJCS8vIHNldCB0aGUgZGF0YQorCQkJZm9yIChpbnQgaSA9IDA7IChpIDwgZGF0YUxpc3Quc2l6ZSgpKTsgaSArKykgeworCQkJCURhdGEgZGF0YSA9IGRhdGFMaXN0LmdldChpKTsKKwkJCQlkb3VibGUgZnJhY3Rpb24gPSBkYXRhLnJlcG9ydGluZ0ZyYWN0aW9uOworCQkJCWRvdWJsZSBpbmNpZGVuY2UgPSBkYXRhLnJlcG9ydHMvZnJhY3Rpb247CisJCQkJZG91YmxlIHBvcHVsYXRpb24gPSBkYXRhLnBvcHVsYXRpb247CisJCQkJaW50ZWdyYXRlZEluZmVjdGlvdXMgKz0gaW5jaWRlbmNlOworCQkJCWRvdWJsZSByZWNvdmVyaWVzID0gaW50ZWdyYXRlZEluZmVjdGlvdXMgKiByZWNvdmVyeVJhdGU7CisJCQkJaW50ZWdyYXRlZFJlY292ZXJpZXMgKz0gcmVjb3ZlcmllczsKKwkJCQkvLyBzZXQgdGhlIGluaXRpYWwgcmVjb3ZlcmVkCisJCQkJaWYoaT09MCl7CisJCQkJCWludGVncmF0ZWRSZWNvdmVyaWVzICs9ICgxLjAtc3VzY2VwdGlibGVSYXRlKSAqIHBvcHVsYXRpb247CisJCQkJfQorCQkJCWludGVncmF0ZWRJbmZlY3Rpb3VzIC09IHJlY292ZXJpZXM7CisJCQkJZGF0YS5pbmZlY3Rpb3VzID0gaW50ZWdyYXRlZEluZmVjdGlvdXM7CisJCQkJaW50ZWdyYXRlZFJlY292ZXJpZXMgKj0gKDEuMCAtIGltbXVuaXR5TG9zc1JhdGUpOworCQkJCWRhdGEucmVjb3ZlcmVkID0gaW50ZWdyYXRlZFJlY292ZXJpZXM7CisJCQkJZGF0YS5zdXNjZXB0aWJsZSA9IHBvcHVsYXRpb24gLSAoZGF0YS5pbmZlY3Rpb3VzICsgZGF0YS5yZWNvdmVyZWQpOworCQkJCQorCQkJfSAvLyBmb3IgaSB0aW1lIHN0ZXBzCisJCQkKKwkJfSAvLyBmb3IgYWxsIGxvY2F0aW9ucworCQkKKwl9IC8vIG1vZGVsRGlzZWFzZVN0YXRlCisKKwkvKioKKwkgKiBXcml0ZSB0aGUgcmVzdWx0cyB0byB0aGUgdGFyZ2V0IGZvbGRlci4KKwkgKiAKKwkgKiBAcGFyYW0gdGFyZ2V0Rm9sZGVyIFRoZSB0YXJnZXQgZm9sZGVyIG9mIHRoZSByZXN1bHRzCisJICogCisJICogQGV4Y2VwdGlvbiBTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uIAorCSAqIAkJCSAgVGhyb3duIHdoZW4gZmFpbGVkIHRvIHdyaXRlIHJlc3VsdHMKKwkgKi8KKwlwcml2YXRlIHZvaWQgd3JpdGVSZXN1bHRzKAorCQkJU3RyaW5nIHRhcmdldEZvbGRlcikgdGhyb3dzIFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24geworCisJCXRyeSB7CisJCQlpZighdGFyZ2V0Rm9sZGVyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeworCQkJCXRhcmdldEZvbGRlciArPSBGaWxlLnNlcGFyYXRvcjsKKwkJCX0KKwkJCQorCQkJV3JpdGVyIGZ3MSA9IG5ldyBGaWxlV3JpdGVyKHRhcmdldEZvbGRlciArIElOQ0lERU5DRV9GSUxFX05BTUUpOworCQkJV3JpdGVyIGZ3MiA9IG5ldyBGaWxlV3JpdGVyKHRhcmdldEZvbGRlciArIFNVU0NFUFRJQkxFX0ZJTEVfTkFNRSk7CisJCQlXcml0ZXIgZnczID0gbmV3IEZpbGVXcml0ZXIodGFyZ2V0Rm9sZGVyICsgSU5GRUNUSU9VU19GSUxFX05BTUUpOworCQkJV3JpdGVyIGZ3NCA9IG5ldyBGaWxlV3JpdGVyKHRhcmdldEZvbGRlciArIFJFQ09WRVJFRF9GSUxFX05BTUUpOworCQkJV3JpdGVyIGZ3NSA9IG5ldyBGaWxlV3JpdGVyKHRhcmdldEZvbGRlciArIFBPUFVMQVRJT05fRklMRV9OQU1FKTsKKwkJCVdyaXRlciBmdzYgPSBuZXcgRmlsZVdyaXRlcih0YXJnZXRGb2xkZXIgKyBSRVBPUlRJTkdfRlJBQ1RJT05fRklMRV9OQU1FKTsKKwkJCQorCQkJU3RyaW5nW10ga2V5cyA9IG5ldyBTdHJpbmdbcG9wdWxhdGlvbk1hcC5rZXlTZXQoKS5zaXplKCldOworCQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gcG9wdWxhdGlvbk1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworCQkJaW50IGNvdW50ZXI9MDsKKwkJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJa2V5c1tjb3VudGVyKytdID0gaXRlci5uZXh0KCk7CisJCQl9CisJCQkKKwkJCUFycmF5cy5zb3J0KGtleXMpOworCQkJCisJCQlTdHJpbmcgaGVhZGVyVGV4dCA9ICJpdGVyYXRpb24sdGltZSI7CisJCQlTdHJpbmdCdWlsZGVyIHN0ckJsZHIgPSBuZXcgU3RyaW5nQnVpbGRlcihoZWFkZXJUZXh0KTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkgKyspIHsKKwkJCQlpZiAoaW5jaWRlbmNlTWFwLmNvbnRhaW5zS2V5KGtleXNbaV0pKSB7CisJCQkJCXN0ckJsZHIuYXBwZW5kKCIsIik7CisJCQkJCXN0ckJsZHIuYXBwZW5kKGtleXNbaV0pOworCQkJCX0KKwkJCQkKKwkJCX0KKwkJCXN0ckJsZHIuYXBwZW5kKCJcbiIpOworCQkJU3RyaW5nIGhlYWRlciA9IHN0ckJsZHIudG9TdHJpbmcoKTsKKwkJCWZ3MS53cml0ZShoZWFkZXIpOworCQkJZncyLndyaXRlKGhlYWRlcik7CisJCQlmdzMud3JpdGUoaGVhZGVyKTsKKwkJCWZ3NC53cml0ZShoZWFkZXIpOworCQkJZnc1LndyaXRlKGhlYWRlcik7CisJCQlmdzYud3JpdGUoaGVhZGVyKTsKKwkJCQorCQkJLy8gZm9yIGFsbCBpdGVyYXRpb25zCisJCQlmb3IgKGludCBpID0gMDsgaSA8IG1heEl0ZXJhdGlvbjsgaSArKykgeworCQkJCS8vIGZvciBhbGwgaWQgKGNvbHVtbnMpCisJCQkJU3RyaW5nIGxpbmUxID0gIiI7CisJCQkJU3RyaW5nIGxpbmUyID0gIiI7CisJCQkJU3RyaW5nIGxpbmUzID0gIiI7CisJCQkJU3RyaW5nIGxpbmU0ID0gIiI7CisJCQkJU3RyaW5nIGxpbmU1ID0gIiI7CisJCQkJU3RyaW5nIGxpbmU2ID0gIjAsMCI7CisJCQkJCisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgaiArKykgeworCQkJCQlTdHJpbmcgaWQgPSBrZXlzW2pdOworCQkJCQlpZiAoaW5jaWRlbmNlTWFwLmNvbnRhaW5zS2V5KGlkKSkgeworCQkJCQkJTGlzdDxEYXRhPiBkYXRhTGlzdCA9IGluY2lkZW5jZU1hcC5nZXQoaWQpOworCQkJCQkJaWYoaSA+PSBkYXRhTGlzdC5zaXplKCkpIHsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCURhdGEgZGF0YSA9IGRhdGFMaXN0LmdldChpKTsKKwkJCQkJCWlmKGk9PTApIHsKKwkJCQkJCQlsaW5lNiArPSAiLCIrZGF0YS5yZXBvcnRpbmdGcmFjdGlvbjsKKwkJCQkJCX0KKwkJCQkJCWlmKGogPT0gMCkgeworCQkJCQkJCWxpbmUxICs9IGRhdGEuaXRlcmF0aW9uLmludFZhbHVlKCkrIiwiK2RhdGEudGltZTsKKwkJCQkJCQlsaW5lMiArPSBkYXRhLml0ZXJhdGlvbi5pbnRWYWx1ZSgpKyIsIitkYXRhLnRpbWU7CisJCQkJCQkJbGluZTMgKz0gZGF0YS5pdGVyYXRpb24uaW50VmFsdWUoKSsiLCIrZGF0YS50aW1lOworCQkJCQkJCWxpbmU0ICs9IGRhdGEuaXRlcmF0aW9uLmludFZhbHVlKCkrIiwiK2RhdGEudGltZTsKKwkJCQkJCQlsaW5lNSArPSBkYXRhLml0ZXJhdGlvbi5pbnRWYWx1ZSgpKyIsIitkYXRhLnRpbWU7CisJCQkJCQl9CisJCQkJCQlsaW5lMSArPSAiLCIrZGF0YS5yZXBvcnRzOworCQkJCQkJbGluZTIgKz0gIiwiK2RhdGEuc3VzY2VwdGlibGU7CisJCQkJCQlsaW5lMyArPSAiLCIrZGF0YS5pbmZlY3Rpb3VzOworCQkJCQkJbGluZTQgKz0gIiwiK2RhdGEucmVjb3ZlcmVkOworCQkJCQkJbGluZTUgKz0gIiwiK2RhdGEucG9wdWxhdGlvbjsKKwkJCQkJfQorCQkJCX0KKwkJCQlsaW5lMSArPSAiXG4iOworCQkJCWxpbmUyICs9ICJcbiI7CisJCQkJbGluZTMgKz0gIlxuIjsKKwkJCQlsaW5lNCArPSAiXG4iOworCQkJCWxpbmU1ICs9ICJcbiI7CisJCQkJaWYgKGk9PTApIGxpbmU2ICs9ICJcbiI7CisJCQkJZncxLndyaXRlKGxpbmUxKTsKKwkJCQlmdzIud3JpdGUobGluZTIpOworCQkJCWZ3My53cml0ZShsaW5lMyk7CisJCQkJZnc0LndyaXRlKGxpbmU0KTsKKwkJCQlmdzUud3JpdGUobGluZTUpOworCQkJCWlmIChpPT0wKSBmdzYud3JpdGUobGluZTYpOworCQkJfQorCQkJZncxLmZsdXNoKCk7CisJCQlmdzEuY2xvc2UoKTsKKwkJCWZ3Mi5mbHVzaCgpOworCQkJZncyLmNsb3NlKCk7CisJCQlmdzMuZmx1c2goKTsKKwkJCWZ3My5jbG9zZSgpOworCQkJZnc0LmZsdXNoKCk7CisJCQlmdzQuY2xvc2UoKTsKKwkJCWZ3NS5mbHVzaCgpOworCQkJZnc1LmNsb3NlKCk7CisJCQlmdzYuZmx1c2goKTsKKwkJCWZ3Ni5jbG9zZSgpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oZXgpOworCQl9CisJCQorCX0gLy8gd3JpdGVSZXN1bHRzCisJCisJLyoqCisJICogUmV0dXJucyB0aGUgU1RFTSBJRCBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBJRAorCSAqIAorCSAqIEBwYXJhbSBpbnB1dElEIFRoZSBsb2NhdGlvbiBpZCBhcyBleHRyYWN0ZWQgZnJvbSB0aGUgZmlsZSBuYW1lCisJICogCisJICogQHJldHVybiBUaGUgU1RFTSBJRCBhcyBleHRyYWN0ZWQgZnJvbSB0aGUgcG9wdWxhdGlvbiBmaWxlCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0SUQoU3RyaW5nIGlucHV0SUQpIHsKKwkJCisJCVN0cmluZyBpbnB1dENvZGUyID0gZ2V0QWRtaW4yQ29kZShpbnB1dElEKTsKKwkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gcG9wdWxhdGlvbk1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworCQl3aGlsZShpdGVyLmhhc05leHQoKSkgeworCQkJU3RyaW5nIGlkID0gaXRlci5uZXh0KCk7CisJCQlpZihnZXRBZG1pbjJDb2RlKGlkKS5lcXVhbHNJZ25vcmVDYXNlKGlucHV0Q29kZTIpKSByZXR1cm4gaWQ7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJCQorCX0gLy8gY29udmVydElECisJCisJLyoqCisJICogRmluZCB0aGUgU1RFTSBJRCBieSBtYXRjaGluZyByZWdpb24yIGNvZGUgcGFydAorCSAqIAorCSAqIEBwYXJhbSBpZCBUaGUgbG9jYXRpb24gaWQgYXMgZXh0cmFjdGVkIGZyb20gdGhlIGZpbGUgbmFtZQorCSAqIAorCSAqIEByZXR1cm4gVGhlIFNURU0gSUQgYXMgZXh0cmFjdGVkIGZyb20gdGhlIHBvcHVsYXRpb24gZmlsZQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFkbWluMkNvZGUoU3RyaW5nIGlkKSB7CisJCQorCQlpbnQgaWR4ID0gaWQubGFzdEluZGV4T2YoIi0iKTsKKwkJcmV0dXJuIGlkLnN1YnN0cmluZyhpZHgrMSxpZC5sZW5ndGgoKSk7CisJCQorCX0gLy8gZ2V0QWRtaW4yQ29kZQorCQorCS8qKgorCSAqIERvIHRoZSBsaW5lYXIgZml0dGluZy4KKwkgKiAKKwkgKiBAcGFyYW0geERhdGEKKwkgKiBAcGFyYW0geURhdGEKKwkgKiAKKwkgKiBAcmV0dXJuIHNsb3BlCisJICovCisJcHJpdmF0ZSBkb3VibGUgZ2V0U2xvcGVMaW5lYXIoZG91YmxlW10geERhdGEsIGRvdWJsZVtdIHlEYXRhKSB7CisJCQorCQlMaW5lYXJMZWFzdFNxdWFyZXNGaXQgbGluRml0ID0gbmV3IExpbmVhckxlYXN0U3F1YXJlc0ZpdCh4RGF0YSwgeURhdGEpOworCQkKKwkJcmV0dXJuIGxpbkZpdC5nZXRTbG9wZSgpOworCQkKKwl9IC8vIGdldFNsb3BlTGluZWFyCisJCisJLyoqCisJICogUmV0dXJucyB0aGUgcG9wdWxhdGlvbiBzaXplIGZvciBhIGdpdmVuIGl0ZXJhdGlvbi4KKwkgKiBjb21wdXRhdGlvbiBpcyBiYXNlZCBvbgorCSAqIHBqKHQpID0gcGowICsgZnJhY3RDaGFuZ2VQb3B1bGF0aW9uUGVyRGF5KihpdGVyYXRpb24tcmVmZXJlbmNlUG9wdWxhdGlvbkRheSkKKyAgICAgKiAKKwkgKiBAcGFyYW0gaXRlcmF0aW9uIFRoZSBpdGVyYXRpb24gY291bnQgKGRheSBudW1iZXIpCisJICogQHBhcmFtIHJlZlBvcCBUaGUgc2l6ZSBvZiB0aGUgcG9wdWxhdGlvbiBhcyBleHRyYWN0ZWQgZnJvbSB0aGUgZmlsZQorCSAqIAorCSAqIEByZXR1cm4gVGhlIHBvcHVsYXRpb24gc2l6ZSBmb3IgYSBnaXZlbiBpdGVyYXRpb24KKwkgKi8KKwlwcml2YXRlIGRvdWJsZSBnZXRQb3B1bGF0aW9uKGludCBpdGVyYXRpb24sIGRvdWJsZSByZWZQb3ApIHsKKwkJCisJCWRvdWJsZSBpbmNyZWFzZSA9IChpdGVyYXRpb24tcmVmZXJlbmNlUG9wdWxhdGlvbkRheSkgKiBmcmFjdENoYW5nZVBvcHVsYXRpb25QZXJEYXk7CisJCXJldHVybiByZWZQb3AqKDEgKyBpbmNyZWFzZSk7CisJCQorCX0gLy8gZ2V0UG9wdWxhdGlvbgorCQorCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBCdWZmZXJlZFJlYWRlcgorCSAqIAorCSAqIEBwYXJhbSBmIFRoZSBmaWxlIHdlIHdhbnQgdG8gb3BlbiBmb3IgcmVhZGluZworCSAqIAorCSAqIEByZXR1cm4gYSByZWFkZXIgdG8gYSBnaXZlbiBmaWxlCisJICovCisJcHVibGljIHN0YXRpYyBCdWZmZXJlZFJlYWRlciBvcGVuUmVhZGVyKEZpbGUgZikgeworCisJCXRyeSB7CisJCQlpZiAoZi5leGlzdHMoKSA9PSBmYWxzZSkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJcmV0dXJuIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJCXJldHVybiBudWxsOworCQkKKwl9IC8vIG9wZW5SZWFkZXIKKwkKKwkvKioKKwkgKiBJbmRpY2F0ZSBFbmQtT2YtRmlsZQorCSAqIAorCSAqIEBwYXJhbSBidWZmZXIgQSBidWZmZXIgb2YgZGF0YQorCSAqIAorCSAqIEByZXR1cm4gVHJ1ZSBpZiB3ZSBoYXZlIHJlYWNoZWQgRW5kLU9mLUZpbGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gRU9GKFN0cmluZyBidWZmZXIpIHsKKwkJCisJCWlmIChidWZmZXIgPT0gbnVsbCB8fCBidWZmZXIubGVuZ3RoKCkgPT0gMCkKKwkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJCQorCX0gLy8gRU9GCisJCisJLyoqCisJICogQ2xhc3MgZm9yIGVhY2ggcm93IGluIHRoZSBpbnB1dCBmaWxlcworCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgRGF0YSB7CisJCQorCQkvKioKKwkJICogUmVwb3J0ZWQgaW5jaWRlbmNlCisJCSAqLworCQlwdWJsaWMgZG91YmxlIHJlcG9ydHM7IAorCQkKKwkJLyoqCisJCSAqIFJlcG9ydGluZyBmcmFjdGlvbgorCQkgKi8KKwkJcHVibGljIGRvdWJsZSByZXBvcnRpbmdGcmFjdGlvbiA9IC0xLjA7CisJCQorCQkvKioKKwkJICogUworCQkgKi8KKwkJcHVibGljIGRvdWJsZSBzdXNjZXB0aWJsZSA9IDAuMDsKKwkJCisJCS8qKgorCQkgKiBJCisJCSAqLworCQlwdWJsaWMgZG91YmxlIGluZmVjdGlvdXMgPSAwLjA7CisJCQorCQkvKioKKwkJICogUgorCQkgKi8KKwkJcHVibGljIGRvdWJsZSByZWNvdmVyZWQgPSAwLjA7CisJCQorCQkvKioKKwkJICogUG9wdWxhdGlvbiBzaXplCisJCSAqLworCQlwdWJsaWMgZG91YmxlIHBvcHVsYXRpb24gPSAwLjA7CisJCQorCQkvKioKKwkJICogSXRlcmF0aW9uIGNvdW50IChkYXkgbnVtYmVyKQorCQkgKi8KKwkJcHVibGljIEludGVnZXIgaXRlcmF0aW9uOworCisJCS8qKgorCQkgKiBUaW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdworCQkgKi8KKwkJcHVibGljIFN0cmluZyB0aW1lOworCQkKKwkJLyoqCisJCSAqIEBwYXJhbSBpdGVyIEl0ZXJhdGlvbiBjb3VudCAoZGF5IG51bWJlcikKKwkJICogQHBhcmFtIHRpbWUgVGhlIGRhdGUgb2YgdGhlIHJlcG9ydAorCQkgKiBAcGFyYW0gcmVwb3J0ZWQgTnVtYmVyIG9mIHJlcG9ydGVkIGluY2lkZW5jZQorCQkgKiBAcGFyYW0gcG9wIFBvcHVsYXRpb24gc2l6ZQorCQkgKi8KKwkJcHVibGljIERhdGEoSW50ZWdlciBpdGVyLCBTdHJpbmcgdGltZSwgZG91YmxlIHJlcG9ydGVkLCBkb3VibGUgcG9wKSB7CisJCQl0aGlzLml0ZXJhdGlvbiA9IGl0ZXI7CisJCQl0aGlzLnRpbWUgPSB0aW1lOworCQkJdGhpcy5yZXBvcnRzID0gcmVwb3J0ZWQ7CisJCQl0aGlzLnBvcHVsYXRpb24gPSBwb3A7CisJCX0KKwkJCisJCS8qKgorCQkgKiBAcmV0dXJuIFRoZSByZWZlcmVuY2UgcG9wdWxhdGlvbiBzaXplCisJCSAqLworCQlwdWJsaWMgZG91YmxlIGdldFJlZmVyZW5jZVBvcHVsYXRpb24oKSB7CisJCQlyZXR1cm4gcG9wdWxhdGlvbjsKKwkJfQorCisJCS8qKgorCQkgKiBTZXQgdGhlIHJlZmVyZW5jZSBwb3B1bGF0aW9uIHNpemUKKwkJICogCisJCSAqIEBwYXJhbSBsb2NhbFBvcHVsYXRpb24gVGhlIHJlZmVyZW5jZSBwb3B1bGF0aW9uIHNpemUKKwkJICovCisJCXB1YmxpYyB2b2lkIHNldExvY2FsUG9wdWxhdGlvbihkb3VibGUgbG9jYWxQb3B1bGF0aW9uKSB7CisJCQl0aGlzLnBvcHVsYXRpb24gPSBsb2NhbFBvcHVsYXRpb247CisJCQl0aGlzLnN1c2NlcHRpYmxlID0gbG9jYWxQb3B1bGF0aW9uOyAvLyBpbml0aWFsbHkKKwkJfQorCisJfSAvLyBEYXRhCisKK30gLy8gRGF0YVByb2Nlc3NvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvRXJyb3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL0Vycm9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRmNTA2OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL0Vycm9yLmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsMjAwOCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworcHVibGljIGludGVyZmFjZSBFcnJvciB7CisgLy8gRW1wdHkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL0xpbmVhckxlYXN0U3F1YXJlc0ZpdC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvTGluZWFyTGVhc3RTcXVhcmVzRml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxYWVjMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL0xpbmVhckxlYXN0U3F1YXJlc0ZpdC5qYXZhCkBAIC0wLDAgKzEsMjExIEBACisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBEbyBhIGxlYXN0IHNxdWFyZWQgZml0IGZvciBhIHNldCBvZiB4LHkgZGF0YSAKKyAqIERhdGEgaXMgcGFzc2VkIGFzIHNlcGFyYXRlIGxpc3RzIGluIHRoZSBjb25zdHJ1Y3RvcgorICoKKyAqLworcHVibGljIGNsYXNzIExpbmVhckxlYXN0U3F1YXJlc0ZpdCB7CisJCisJLyoqCisJICogYmVzdCBmaXQgc2xvcGUKKwkgKi8KKwlwcml2YXRlIGRvdWJsZSBzbG9wZSA9IDA7CisJLyoqCisJICogYmVzdCBmaXQgaW50ZXJjZXB0CisJICovCisJcHJpdmF0ZSBkb3VibGUgaW50ZXJjZXB0ID0gMDsKKwkvKioKKwkgKiB2YXJpYW5jZSBvZiBzbG9wZSBmaXQKKwkgKi8KKwlwcml2YXRlIGRvdWJsZSBzbG9wZVZhcmlhbmNlID0gMDsKKwkKKworCisJLyoqCisJICogdmFyaWFuY2Ugb2YgaW50ZXJjZXB0IGZpdAorCSAqLworCXByaXZhdGUgZG91YmxlIGludGVyY2VwdFZhcmlhbmNlID0gMDsKKwkvKioKKwkgKiBzdGFuZGFyZCBkZXZpYXRpb24gb2Ygc2xvcGUgZml0CisJICovCisJcHJpdmF0ZSBkb3VibGUgc2xvcGVTdGREZXYgPSAwOworCS8qKgorCSAqIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBpbnRlcmNlcHQgZml0CisJICovCisJcHJpdmF0ZSBkb3VibGUgaW50ZXJjZXB0U3RkRGV2ID0gMDsKKwkKKwkKKwkvKioKKwkgKiBjb25zdHJ1Y3RvcgorCSAqIEBwYXJhbSB4TGlzdAorCSAqIEBwYXJhbSB5TGlzdAorCSAqLworCXB1YmxpYyBMaW5lYXJMZWFzdFNxdWFyZXNGaXQoTGlzdDxEb3VibGU+IHhMaXN0LCBMaXN0PERvdWJsZT4geUxpc3QpIHsKKwkJCisJCWludCBucHRzID0geExpc3Quc2l6ZSgpOworCQlhc3NlcnQobnB0cyA9PSB5TGlzdC5zaXplKCkpOworCQkKKwkJLy94LCB5IGZvciBsZWFzdCBzcXVhcmVzIGZpdHRpbmcgdG8gbGluZSB5ID0gYWxwaGEqeCAtIGJldGEKKwkJZG91YmxlW10geCA9IG5ldyBkb3VibGVbbnB0c107CisJCWRvdWJsZVtdIHkgPSBuZXcgZG91YmxlW25wdHNdOworCQkKKwkJZm9yKGludCBqID0gMDsgaiA8IG5wdHM7IGorKyl7CisJCQl4W2pdID0geExpc3QuZ2V0KGopLmRvdWJsZVZhbHVlKCk7CisJCQl5W2pdID0geUxpc3QuZ2V0KGopLmRvdWJsZVZhbHVlKCk7CisJCX0KKwkKKwkJLy8gZG8gdGhlIGZpdAorCQlkb3VibGUgc3VteCAgPSAwOworCQlkb3VibGUgc3VteSA9IDA7CisJCWRvdWJsZSBzdW14eSA9IDA7CisJCWRvdWJsZSBzdW14MiA9IDA7CisJCWRvdWJsZSBzdW15MiA9IDA7CisJCWRvdWJsZSBzdW0gPSAwOworCQkKKwkJZm9yKGludCBqID0gMDsgaiA8IG5wdHM7IGorKyl7CisJCQlzdW14ICs9IHhbal07CisJCQlzdW15ICs9IHlbal07CisJCQlzdW14eSArPSB4W2pdICogeVtqXTsKKwkJCXN1bXgyICs9IHhbal0gKiB4W2pdOworCQkJc3VteTIgKz0geVtqXSAqIHlbal07CisJCQlzdW0gKz0gMTsKKwkJfQorCQkKKwkJZG91YmxlIGRlbHRhID0gLShzdW0gKiBzdW14MiAtIHN1bXggKiBzdW14KTsKKwkJLy8gZ2V0IHRoZSBpbnRlcmNlcHQKKwkJaW50ZXJjZXB0ID0gKHN1bXggKiBzdW14eSAtIHN1bXkgKiBzdW14MikvZGVsdGE7CisJCQorCQkvLyBnZXQgdGhlIHNsb3BlCisJCXNsb3BlID0gKHN1bXggKiBzdW15IC0gc3VtICogc3VteHkgKS9kZWx0YTsKKwkJCisJCS8vdmFyaWFuY2UgYW5kIHN0ZAorCQlkb3VibGUgdmFyaWFuY2UgPSAoc3VteTIraW50ZXJjZXB0KmludGVyY2VwdCpzdW0rc2xvcGUqc2xvcGUqc3VteDIKKwkJCQktMiooLWludGVyY2VwdCpzdW15K3Nsb3BlKnN1bXh5K2ludGVyY2VwdCpzbG9wZSpzdW14KSkvKG5wdHMtMik7CisJCQorCQlpbnRlcmNlcHRWYXJpYW5jZSA9IE1hdGguYWJzKCh2YXJpYW5jZS9kZWx0YSkqc3VteDIpOworCQlzbG9wZVZhcmlhbmNlID0gTWF0aC5hYnMoKHZhcmlhbmNlL2RlbHRhKSpzdW0pOworCQkKKwkJaW50ZXJjZXB0U3RkRGV2ID0gTWF0aC5zcXJ0KGludGVyY2VwdFZhcmlhbmNlKTsKKwkJc2xvcGVTdGREZXYgPSBNYXRoLnNxcnQoc2xvcGVWYXJpYW5jZSk7CisJCQorCX0KKwkKKwkvKioKKwkgKiBjb25zdHJ1Y3RvciB1c2luZyBzaW1wbGUgYXJyYXlzCisJICogQHBhcmFtIHhMaXN0CisJICogQHBhcmFtIHlMaXN0CisJICovCisJcHVibGljIExpbmVhckxlYXN0U3F1YXJlc0ZpdChkb3VibGVbXSB4TGlzdCwgZG91YmxlW10geUxpc3QpIHsKKwkJCisJCWludCBucHRzID0geExpc3QubGVuZ3RoOworCQlhc3NlcnQobnB0cyA9PSB5TGlzdC5sZW5ndGgpOworCQkKKwkJLy94LCB5IGZvciBsZWFzdCBzcXVhcmVzIGZpdHRpbmcgdG8gbGluZSB5ID0gYWxwaGEqeCAtIGJldGEKKwkJZG91YmxlW10geCA9IHhMaXN0OworCQlkb3VibGVbXSB5ID0geUxpc3Q7CisJCQorCQorCQkvLyBkbyB0aGUgZml0CisJCWRvdWJsZSBzdW14ICA9IDA7CisJCWRvdWJsZSBzdW15ID0gMDsKKwkJZG91YmxlIHN1bXh5ID0gMDsKKwkJZG91YmxlIHN1bXgyID0gMDsKKwkJZG91YmxlIHN1bXkyID0gMDsKKwkJZG91YmxlIHN1bSA9IDA7CisJCQorCQlmb3IoaW50IGogPSAwOyBqIDwgbnB0czsgaisrKXsKKwkJCXN1bXggKz0geFtqXTsKKwkJCXN1bXkgKz0geVtqXTsKKwkJCXN1bXh5ICs9IHhbal0gKiB5W2pdOworCQkJc3VteDIgKz0geFtqXSAqIHhbal07CisJCQlzdW15MiArPSB5W2pdICogeVtqXTsKKwkJCXN1bSArPSAxOworCQl9CisJCQorCQlkb3VibGUgZGVsdGEgPSAtKHN1bSAqIHN1bXgyIC0gc3VteCAqIHN1bXgpOworCQkvLyBnZXQgdGhlIGludGVyY2VwdAorCQlpbnRlcmNlcHQgPSAoc3VteCAqIHN1bXh5IC0gc3VteSAqIHN1bXgyKS9kZWx0YTsKKwkJCisJCS8vIGdldCB0aGUgc2xvcGUKKwkJc2xvcGUgPSAoc3VteCAqIHN1bXkgLSBzdW0gKiBzdW14eSApL2RlbHRhOworCQkKKwkJLy92YXJpYW5jZSBhbmQgc3RkCisJCWRvdWJsZSB2YXJpYW5jZSA9IChzdW15MitpbnRlcmNlcHQqaW50ZXJjZXB0KnN1bStzbG9wZSpzbG9wZSpzdW14MgorCQkJCS0yKigtaW50ZXJjZXB0KnN1bXkrc2xvcGUqc3VteHkraW50ZXJjZXB0KnNsb3BlKnN1bXgpKS8obnB0cy0yKTsKKwkJCisJCWludGVyY2VwdFZhcmlhbmNlID0gTWF0aC5hYnMoKHZhcmlhbmNlL2RlbHRhKSpzdW14Mik7CisJCXNsb3BlVmFyaWFuY2UgPSBNYXRoLmFicygodmFyaWFuY2UvZGVsdGEpKnN1bSk7CisJCQorCQlpbnRlcmNlcHRTdGREZXYgPSBNYXRoLnNxcnQoaW50ZXJjZXB0VmFyaWFuY2UpOworCQlzbG9wZVN0ZERldiA9IE1hdGguc3FydChzbG9wZVZhcmlhbmNlKTsKKwkJCisJfQorCQorCS8qKgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHNsb3BlCisJICovCisJcHVibGljIGRvdWJsZSBnZXRTbG9wZSgpIHsKKwkJcmV0dXJuIHNsb3BlOworCX0KKworCisJLyoqCisJICogCisJICogQHJldHVybiB0aGUgaW50ZXJjZXB0CisJICovCisJcHVibGljIGRvdWJsZSBnZXRJbnRlcmNlcHQoKSB7CisJCXJldHVybiBpbnRlcmNlcHQ7CisJfQorCisKKwkvKioKKwkgKiAKKwkgKiBAcmV0dXJuIHNsb3BlVmFyaWFuY2UKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFNsb3BlVmFyaWFuY2UoKSB7CisJCXJldHVybiBzbG9wZVZhcmlhbmNlOworCX0KKworCisJLyoqCisJICogCisJICogQHJldHVybiBpbnRlcmNlcHRWYXJpYW5jZQorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0SW50ZXJjZXB0VmFyaWFuY2UoKSB7CisJCXJldHVybiBpbnRlcmNlcHRWYXJpYW5jZTsKKwl9CisKKworCS8qKgorCSAqIAorCSAqIEByZXR1cm4gc2xvcGVTdGREZXYKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFNsb3BlU3RkRGV2KCkgeworCQlyZXR1cm4gc2xvcGVTdGREZXY7CisJfQorCisKKwkvKioKKwkgKiAKKwkgKiBAcmV0dXJuIGludGVyY2VwdFN0ZERldgorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0SW50ZXJjZXB0U3RkRGV2KCkgeworCQlyZXR1cm4gaW50ZXJjZXB0U3RkRGV2OworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvTHlhcHVub3ZBbmFseXNpcy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvTHlhcHVub3ZBbmFseXNpcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMGQ2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9MeWFwdW5vdkFuYWx5c2lzLmphdmEKQEAgLTAsMCArMSwzNjUgQEAKKy8qKgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5TdGF0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwuUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2U7CisKKworICAgCisKKy8qKiAKKyAqIHRoaXMgY2xhc3MgY29tcHV0ZXMgdGhlIG1lYW4gc3F1YXJlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gc2NlbmFyaW9zIGFzIGEgZnVuY3Rpb24gb2YgdGltZQorICogMS4gSXQgb25seSBsb29rcyBhdCBsb2NhdGlvbnMgd2hpY2ggYXJlIENPTU1PTiB0byBib3RoIHNjZW5hcmlvcworICogMi4gVGhlIHRpbWUgc2VyaWVzIHNob3VsZCBiZSB0aGUgc2FtZSBsZW5ndGguIElmIHRoZXkgYXJlIG5vdCB0aGlzIHdpbGwgY29tcGFyZSBvZiBhIHBlcmlvZCBlcXVhbCB0bworICogICAgdGhlIFNIT1JURVNUIG9mIGFsbCB0aGUgdGltZSBzZXJpZXMuIAorICogMy4gSXQgb25seSBjb25zaWRlcnMgbG9jYXRpb25zIHdoZXJlIGluZmVjdGlvdXMgY291bnQgaXMgbm9uemVybyBpbiBvbmUgb3IgdGhlIG90aGVyIC0gbm90IGludGVyZXN0ZWQgaW4gd2VpZ2h0aW5nIHJlZ2lvbnMgd2l0aCBubyBkaXNlYXNlLgorICoKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBMeWFwdW5vdkFuYWx5c2lzIHsKKwkKKwkvKioKKwkgKiBpbnB1dAorCSAqLworCU1hcDxTdHJpbmcsTGlzdDxQaGFzZVNwYWNlQ29vcmRpbmF0ZT4+IGNvbW1vblBoYXNlU3BhY2VBID0gbmV3IEhhc2hNYXA8U3RyaW5nLExpc3Q8UGhhc2VTcGFjZUNvb3JkaW5hdGU+PigpOworCU1hcDxTdHJpbmcsTGlzdDxQaGFzZVNwYWNlQ29vcmRpbmF0ZT4+IGNvbW1vblBoYXNlU3BhY2VCID0gbmV3IEhhc2hNYXA8U3RyaW5nLExpc3Q8UGhhc2VTcGFjZUNvb3JkaW5hdGU+PigpOworCQorCU1hcDxTdHJpbmcsTGlzdDxEb3VibGU+PiB0b3RhbFBvcHVsYXRpb24gPSBuZXcgSGFzaE1hcDxTdHJpbmcsTGlzdDxEb3VibGU+PigpOworCQorCQorCS8qKgorCSAqIG51bWJlciBjb21tb24gbG9jYXRpb25zIHdpdGggbm9uemVybyBJbmYgY291bnQgYXQgdGltZSB0CisJICovCisJcHVibGljIGRvdWJsZVtdIGxvY2F0aW9uQ291bnQ7CisJCisJLyoqCisJICogU2NlbmFyaW8gQQorCSAqLworCXB1YmxpYyBQaGFzZVNwYWNlQ29vcmRpbmF0ZVtdIHRyYWplY3RvcnlBOworCQorCS8qKgorCSAqIFNjZW5hcmlvIEIKKwkgKi8KKwlwdWJsaWMgUGhhc2VTcGFjZUNvb3JkaW5hdGVbXSB0cmFqZWN0b3J5QjsKKwkKKwkKKwkvKioKKwkgKiB0aW1lCisJICovCisJcHVibGljIGRvdWJsZVtdIHRpbWU7CisJCisJLyoqCisJICogRGV0ZXJtaW5lcyB0aGUgTWVhblNxdWFyZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHNjZW5hcmlvIGRhdGEgc2V0cyBvdmVyIHRpbWUgZWFjaCBzdG9yZWQgaW4gYSBtYXAKKwkgKiBAcGFyYW0gc2NlbmFyaW9NYXBBIAorCSAqIEBwYXJhbSBzY2VuYXJpb01hcEIgCisJICogQHBhcmFtIHJ1bm5hYmxlQ29udGV4dCBGb3IgcHJvZ3Jlc3MgaW5kaWNhdG9yCisJICovCisJcHVibGljIEx5YXB1bm92QW5hbHlzaXMoUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCBzY2VuYXJpb01hcEEsIFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwgc2NlbmFyaW9NYXBCLCBJUnVubmFibGVDb250ZXh0IHJ1bm5hYmxlQ29udGV4dCkgeworCQlmaW5hbCBSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIG1hcEEgPSBzY2VuYXJpb01hcEE7CisJCWZpbmFsIFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwgbWFwQiA9IHNjZW5hcmlvTWFwQjsKKwkJCisJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyB0YXNrID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB7CisgICAgICAgICAgICAJcHJvZ3Jlc3MuYmVnaW5UYXNrKCJDYWxjdWxhdGluZyBjb21tb24gbG9jYXRpb25zLi4uIiwgbWFwQS5nZXROdW1Mb2NhdGlvbnMoKSk7CisgICAgCisJCQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvckEgPSBtYXBBLmdldExvY2F0aW9ucygpLml0ZXJhdG9yKCk7CisJCQkJaW50IG1heFRpbWUgPSAtMTsKKwkJCQl3aGlsZShpdGVyYXRvckEuaGFzTmV4dCgpKSB7CisJCQkJCXByb2dyZXNzLndvcmtlZCgxKTsKKwkJCQkJaWYocHJvZ3Jlc3MuaXNDYW5jZWxlZCgpKSB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKwkJCQkJU3RyaW5nIGlkID0gaXRlcmF0b3JBLm5leHQoKTsKKwkJCQkJCisJCQkJCWlmKG1hcEIuY29udGFpbnNMb2NhdGlvbihpZCkpIHsKKwkJCQkJCQorCQkJCQkJLy8gZ2V0IHRoZSBsaXN0cyBvZiBkYXRhIG9ubHkgZm9yIHRob3NlIGxvY2F0aW9ucyB0aGF0IGFyZSBjb21tb24gdG8gYm90aCBtYXBzCisJCQkJCQlSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBkYXRhTWFwQSA9IG1hcEEuZ2V0TG9jYXRpb24oaWQpOworCQkJCQkJTGlzdDxQaGFzZVNwYWNlQ29vcmRpbmF0ZT4gYURhdGEgPSBnZXROb3JtYWxpemVkVHJhamVjdG9yeShkYXRhTWFwQSk7CisJCQkJCQorCQkJCQkJY29tbW9uUGhhc2VTcGFjZUEucHV0KGlkLGFEYXRhKTsKKwkJCQkJCQorCQkJCQkJLy8gZ2V0IHRoZSB0b3RhbCBwb3B1bGF0aW9uIGZyb20gTWFwIEEgKHNhbWUgYXMgbWFwIEIgZm9yIG5vdworCQkJCQkJdG90YWxQb3B1bGF0aW9uLnB1dChpZCwgZ2V0VG90YWxQb3B1bGF0aW9uKGRhdGFNYXBBKSk7CisJCQkJCQkKKwkJCQkJCS8vIE1hcCBCCisJCQkJCQlSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBkYXRhTWFwQiA9IG1hcEIuZ2V0TG9jYXRpb24oaWQpOworCQkJCQkJTGlzdDxQaGFzZVNwYWNlQ29vcmRpbmF0ZT4gYkRhdGEgPSBnZXROb3JtYWxpemVkVHJhamVjdG9yeShkYXRhTWFwQik7CisJCQkJCQkKKwkJCQkJCWNvbW1vblBoYXNlU3BhY2VCLnB1dChpZCxiRGF0YSk7CisJCQkJCQorCQkJCQkJCQkJCQorCQkJCQkJLy8gaW5pdCB0aGUgYXJyYXlzCisJCQkJCQlpZiAobWF4VGltZSA9PSAtMSkgbWF4VGltZSA9IGFEYXRhLnNpemUoKTsKKwkJCQkJCWlmKGFEYXRhLnNpemUoKSA8IG1heFRpbWUpIG1heFRpbWUgPSBhRGF0YS5zaXplKCk7CisJCQkJCQlpZihiRGF0YS5zaXplKCkgPCBtYXhUaW1lKSBtYXhUaW1lID0gYkRhdGEuc2l6ZSgpOworCQkJCQl9Ly8gaWYKKwkJCQl9Ly8gd2hpbGUKKwkJCQlwcm9ncmVzcy5kb25lKCk7CisJCQkJaWYodGltZT09bnVsbCkgeworCQkJCQl0aW1lID0gbmV3IGRvdWJsZVttYXhUaW1lXTsKKwkJCQkJdHJhamVjdG9yeUEgPSBuZXcgUGhhc2VTcGFjZUNvb3JkaW5hdGVbbWF4VGltZV07CisJCQkJCXRyYWplY3RvcnlCID0gbmV3IFBoYXNlU3BhY2VDb29yZGluYXRlW21heFRpbWVdOworCQkKKwkJCQkJbG9jYXRpb25Db3VudCA9IG5ldyBkb3VibGVbbWF4VGltZV07CisJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBtYXhUaW1lOyBpICsrKSB7CisJCQkJCQl0aW1lW2ldID0gaTsKKwkJCQkJCXRyYWplY3RvcnlBW2ldID0gbmV3IFBoYXNlU3BhY2VDb29yZGluYXRlKDAuMCwwLjApOworCQkJCQkJdHJhamVjdG9yeUJbaV0gPSBuZXcgUGhhc2VTcGFjZUNvb3JkaW5hdGUoMC4wLDAuMCk7CisJCQkJCQlsb2NhdGlvbkNvdW50W2ldID0gMC4wOworCQkJCQl9CisJCQkJfQorICAgICAgICAgICAgfSAvLyBydW4KKwkJfTsKKwkJdHJ5IHsKKwkJCXJ1bm5hYmxlQ29udGV4dC5ydW4odHJ1ZSwgZmFsc2UsIHRhc2spOworCQl9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisJCQkvLyBUaGlzIHRhc2sgaXMgbm90IGludGVycnVwdGFibGUKKwkJfSBjYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl2ZSkgeworCQkJLy8gVGhpcyB0YXNrIGlzIG5vdCBpbnRlcnJ1cHRhYmxlCisJCX0KKwl9Ly8gY29uc3RydWN0b3IgTWVhblNxdWFyZURpZmZlcmVuY2UKKwkKKwkKKwkvKioKKwkgKiBGcm9tIHRoZSBkYXRhTWFwIGV4dHJhY3QgYSBsaXN0IG9mIG5vcm1hbGl6ZSBpbmZlY3Rpb3VzIChmcmFjdGlvbiBvZiB0b3RhbCBwb3B1bGF0aW9uKQorCSAqIEBwYXJhbSBkYXRhTWFwCisJICogQHJldHVybiBub3JtYWxpemUgbGlzdCBvZiBpbmZlY3Rpb3VzIHBlb3BsZQorCSAqLworCXB1YmxpYyBMaXN0PFBoYXNlU3BhY2VDb29yZGluYXRlPiBnZXROb3JtYWxpemVkVHJhamVjdG9yeShSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBkYXRhTWFwKSB7CisJCWZpbmFsIFN0cmluZyBTVVNDRVBUSUJMRSA9IFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuU1VTQ0VQVElCTEVdOworCQlmaW5hbCBTdHJpbmcgRVhQT1NFRCA9IFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuRVhQT1NFRF07CisJCWZpbmFsIFN0cmluZyBJTkZFQ1RJT1VTID0gU3RhdGVzLnN0YXRlc1RvRml0W1N0YXRlcy5JTkZFQ1RJT1VTXTsKKwkJZmluYWwgU3RyaW5nIFJFQ09WRVJFRCA9IFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuUkVDT1ZFUkVEXTsKKwkJCisJCS8vIG1heSBvciBtYXkgbm90IGV4aXN0CisJCUxpc3Q8U3RyaW5nPiBleHBvc2VkTGlzdCA9IG51bGw7CisJCUxpc3Q8U3RyaW5nPiByZWNvdmVyZWRMaXN0ID0gbnVsbDsKKwkJIAorCQkvLyBNVVNUIGV4aXN0CisJCUxpc3Q8U3RyaW5nPiBpbmZlY3Rpb3VzTGlzdCA9IGRhdGFNYXAuZ2V0RGF0YShJTkZFQ1RJT1VTKTsKKwkJTGlzdDxTdHJpbmc+IHN1c2NlcHRpYmxlTGlzdCA9IGRhdGFNYXAuZ2V0RGF0YShTVVNDRVBUSUJMRSk7CQorCQlhc3NlcnQoaW5mZWN0aW91c0xpc3QhPW51bGwpOworCQlhc3NlcnQoc3VzY2VwdGlibGVMaXN0IT1udWxsKTsKKwkJaWYoZGF0YU1hcC5jb250YWluc1BhcmFtZXRlcihFWFBPU0VEKSkgeworCQkJZXhwb3NlZExpc3QgPSBkYXRhTWFwLmdldERhdGEoRVhQT1NFRCk7CQorCQl9CisJCWlmKGRhdGFNYXAuY29udGFpbnNQYXJhbWV0ZXIoUkVDT1ZFUkVEKSkgeworCQkJcmVjb3ZlcmVkTGlzdCA9IGRhdGFNYXAuZ2V0RGF0YShSRUNPVkVSRUQpOwkKKwkJfQorCQkKKwkJTGlzdDxQaGFzZVNwYWNlQ29vcmRpbmF0ZT4gbm9ybWFsaXplZFRyYWplY3RvcnkgPSBuZXcgQXJyYXlMaXN0PFBoYXNlU3BhY2VDb29yZGluYXRlPigpOworCQorCQlkb3VibGVbXSB0b3RhbFBvcCA9IG5ldyBkb3VibGVbaW5mZWN0aW91c0xpc3Quc2l6ZSgpXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZlY3Rpb3VzTGlzdC5zaXplKCk7IGkgKyspIHsKKwkJCQorCQkJZG91YmxlIGluZiA9IChuZXcgRG91YmxlKGluZmVjdGlvdXNMaXN0LmdldChpKSkpLmRvdWJsZVZhbHVlKCk7CisJCQlkb3VibGUgc3VzYyA9IChuZXcgRG91YmxlKHN1c2NlcHRpYmxlTGlzdC5nZXQoaSkpKS5kb3VibGVWYWx1ZSgpOworCQkJZG91YmxlIGV4cG9zZWQgPSAwLjA7CisJCQlkb3VibGUgcmVjb3ZlcmVkID0gMC4wOworCQkJaWYoZXhwb3NlZExpc3QhPW51bGwpIHsKKwkJCQlleHBvc2VkID0gKG5ldyBEb3VibGUoZXhwb3NlZExpc3QuZ2V0KGkpKSkuZG91YmxlVmFsdWUoKTsKKwkJCX0KKwkJCWlmKHJlY292ZXJlZExpc3QhPW51bGwpIHsKKwkJCQlyZWNvdmVyZWQgPSAobmV3IERvdWJsZShyZWNvdmVyZWRMaXN0LmdldChpKSkpLmRvdWJsZVZhbHVlKCk7CisJCQl9CisJCQl0b3RhbFBvcFtpXSA9IGluZitzdXNjK2V4cG9zZWQrcmVjb3ZlcmVkOworCQkJaW5mIC89IHRvdGFsUG9wW2ldOworCQkJc3VzYyAvPSB0b3RhbFBvcFtpXTsKKwkJCQorCQkJUGhhc2VTcGFjZUNvb3JkaW5hdGUgcG9pbnQgPSBuZXcgUGhhc2VTcGFjZUNvb3JkaW5hdGUoc3VzYyxpbmYpOworCQkJbm9ybWFsaXplZFRyYWplY3RvcnkuYWRkKHBvaW50KTsKKwkJfQorCQlyZXR1cm4gbm9ybWFsaXplZFRyYWplY3Rvcnk7CisJfQorCQorCQorCQorCS8qKgorCSAqIEZyb20gdGhlIGRhdGFNYXAgZXh0cmFjdCBhIGxpc3Qgb2YgdGhlIHRvdGFsIHBvcHVsYXRpb24pCisJICogQHBhcmFtIGRhdGFNYXAKKwkgKiBAcmV0dXJuIHRvdGFsIHBvcHVsYXRpb24KKwkgKi8KKwlwdWJsaWMgTGlzdDxEb3VibGU+IGdldFRvdGFsUG9wdWxhdGlvbihvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBkYXRhTWFwKSB7CisJCWZpbmFsIFN0cmluZyBTVVNDRVBUSUJMRSA9IFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuU1VTQ0VQVElCTEVdOworCQlmaW5hbCBTdHJpbmcgRVhQT1NFRCA9IFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuRVhQT1NFRF07CisJCWZpbmFsIFN0cmluZyBJTkZFQ1RJT1VTID0gU3RhdGVzLnN0YXRlc1RvRml0W1N0YXRlcy5JTkZFQ1RJT1VTXTsKKwkJZmluYWwgU3RyaW5nIFJFQ09WRVJFRCA9IFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuUkVDT1ZFUkVEXTsKKwkJCisJCS8vIG1heSBvciBtYXkgbm90IGV4aXN0CisJCUxpc3Q8U3RyaW5nPiBleHBvc2VkTGlzdCA9IG51bGw7CisJCUxpc3Q8U3RyaW5nPiByZWNvdmVyZWRMaXN0ID0gbnVsbDsKKwkJIAorCQkvLyBNVVNUIGV4aXN0CisJCUxpc3Q8U3RyaW5nPiBpbmZlY3Rpb3VzTGlzdCA9IGRhdGFNYXAuZ2V0RGF0YShJTkZFQ1RJT1VTKTsKKwkJTGlzdDxTdHJpbmc+IHN1c2NlcHRpYmxlTGlzdCA9IGRhdGFNYXAuZ2V0RGF0YShTVVNDRVBUSUJMRSk7CQorCQlhc3NlcnQoaW5mZWN0aW91c0xpc3QhPW51bGwpOworCQlhc3NlcnQoc3VzY2VwdGlibGVMaXN0IT1udWxsKTsKKwkJaWYoZGF0YU1hcC5jb250YWluc1BhcmFtZXRlcihFWFBPU0VEKSkgeworCQkJZXhwb3NlZExpc3QgPSBkYXRhTWFwLmdldERhdGEoRVhQT1NFRCk7CQorCQl9CisJCWlmKGRhdGFNYXAuY29udGFpbnNQYXJhbWV0ZXIoUkVDT1ZFUkVEKSkgeworCQkJcmVjb3ZlcmVkTGlzdCA9IGRhdGFNYXAuZ2V0RGF0YShSRUNPVkVSRUQpOwkKKwkJfQorCQkKKwkJTGlzdDxEb3VibGU+IHBvcHVsYXRpb24gPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZlY3Rpb3VzTGlzdC5zaXplKCk7IGkgKyspIHsKKwkJCWRvdWJsZSB0b3RhbFBvcCA9IDAuMDsKKwkJCWRvdWJsZSBpbmYgPSAobmV3IERvdWJsZShpbmZlY3Rpb3VzTGlzdC5nZXQoaSkpKS5kb3VibGVWYWx1ZSgpOworCQkJZG91YmxlIHN1c2MgPSAobmV3IERvdWJsZShzdXNjZXB0aWJsZUxpc3QuZ2V0KGkpKSkuZG91YmxlVmFsdWUoKTsKKwkJCWRvdWJsZSBleHBvc2VkID0gMC4wOworCQkJZG91YmxlIHJlY292ZXJlZCA9IDAuMDsKKwkJCWlmKGV4cG9zZWRMaXN0IT1udWxsKSB7CisJCQkJZXhwb3NlZCA9IChuZXcgRG91YmxlKGV4cG9zZWRMaXN0LmdldChpKSkpLmRvdWJsZVZhbHVlKCk7CisJCQl9CisJCQlpZihyZWNvdmVyZWRMaXN0IT1udWxsKSB7CisJCQkJcmVjb3ZlcmVkID0gKG5ldyBEb3VibGUocmVjb3ZlcmVkTGlzdC5nZXQoaSkpKS5kb3VibGVWYWx1ZSgpOworCQkJfQorCQkJdG90YWxQb3AgPSBpbmYrc3VzYytleHBvc2VkK3JlY292ZXJlZDsKKwkJCXBvcHVsYXRpb24uYWRkKG5ldyBEb3VibGUodG90YWxQb3ApKTsKKwkJfQorCQlyZXR1cm4gcG9wdWxhdGlvbjsKKwl9CisJCisJLyoqCisJICogc29sdmVzIGZvciB0aGUgUm9vdCBNZWFuU3F1YXJlRGlmZmVyZW5jZSB2cyB0aW1lCisJICogdXNpbmcgaW5mZWN0aW91cyBkYXRhIG9ubHkgZm9yIG5vdworCSAqIAorCSAqIEBwYXJhbSBydW5uYWJsZUNvbnRleHQgUnVubmFibGUgY29udGV4dCBmb3IgcHJvZ3Jlc3MgaW5kaWNhdG9yCisJICogQHJldHVybiBjb21wYXJpc29uIHRpbWUgc2VyaWVzIGFzIGRvdWJsZVtdCisJICovCisJCisJcHVibGljIExpc3Q8UGhhc2VTcGFjZUNvb3JkaW5hdGVbXT4gZ2V0THlhcHVub3ZUcmFqZWN0b3J5KElSdW5uYWJsZUNvbnRleHQgcnVubmFibGVDb250ZXh0KSB7CisJCWZpbmFsIExpc3Q8UGhhc2VTcGFjZUNvb3JkaW5hdGVbXT4gcmV0VmFsID0gbmV3IEFycmF5TGlzdDxQaGFzZVNwYWNlQ29vcmRpbmF0ZVtdPigpOworCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgdGFzayA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgeworICAgICAgICAgICAgCXByb2dyZXNzLmJlZ2luVGFzaygiR2V0dGluZyBMeWFwdW5vdiB0cmFqZWN0b3J5IiwgdGltZS5sZW5ndGgpOworICAgIAorCQkJCWRvdWJsZVtdIG1heFBvcHVsYXRpb24gPSBuZXcgZG91YmxlW3RpbWUubGVuZ3RoXTsKKwkJCQlmb3IoaW50IGljb3VudCA9MDsgaWNvdW50IDwgdGltZS5sZW5ndGg7IGljb3VudCArKykgeworCQkJCQlwcm9ncmVzcy53b3JrZWQoMSk7CisJCQkJCWlmKHByb2dyZXNzLmlzQ2FuY2VsZWQoKSkgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisJCQkJCQorCQkJCQltYXhQb3B1bGF0aW9uW2ljb3VudF0gPSAwLjA7CisJCQkJCUl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGNvbW1vblBoYXNlU3BhY2VBLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCQkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkJCQkvLyBhbGwgbG9jYXRpb25zCisJCQkJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJCQlTdHJpbmcgaWQgPSBpdGVyLm5leHQoKTsKKwkJCQkJCQorCQkJCQkJTGlzdDxQaGFzZVNwYWNlQ29vcmRpbmF0ZT4gYURhdGEgPSBjb21tb25QaGFzZVNwYWNlQS5nZXQoaWQpOworCQkJCQkJTGlzdDxQaGFzZVNwYWNlQ29vcmRpbmF0ZT4gYkRhdGEgPSBjb21tb25QaGFzZVNwYWNlQi5nZXQoaWQpOworCQkJCQkJCQkJCQorCQkJCQkJTGlzdDxEb3VibGU+IHBvcHVsYXRpb24gPSB0b3RhbFBvcHVsYXRpb24uZ2V0KGlkKTsKKwkJCQkJCS8vIHkgYXhpcyBpcyBJbmZlY3Rpb3VzCisJCQkJCQlkb3VibGUgaUEgPSBhRGF0YS5nZXQoaWNvdW50KS5nZXRZVmFsdWUoKTsKKwkJCQkJCWRvdWJsZSBpQiA9IGJEYXRhLmdldChpY291bnQpLmdldFlWYWx1ZSgpOworCQkJCQkJCisJCQkJCQkvLyB4IGF4aXMgaXMgU3VzY2VwdGlibGUKKwkJCQkJCWRvdWJsZSBzQSA9IGFEYXRhLmdldChpY291bnQpLmdldFhWYWx1ZSgpOworCQkJCQkJZG91YmxlIHNCID0gYkRhdGEuZ2V0KGljb3VudCkuZ2V0WFZhbHVlKCk7CisJCQkJCQkKKwkJCQkJCWRvdWJsZSBwb3AgPSBwb3B1bGF0aW9uLmdldChpY291bnQpLmRvdWJsZVZhbHVlKCk7CisJCQkJCQkKKwkJCQkJCS8vZG91YmxlIGRlbm9tID0gKGlBK2lCKS8yLjA7CisJCQkJCQkvLyBzcXVhcmUgb2YgdGhlIGF2ZXJhZ2UgZnJhY3Rpb24gb2YgaW5mZWN0aW91cyBwZW9wbGUKKwkJCQkJCS8vZGVub20gKj0gZGVub207IAorCQkJCQkJaWYoKGlBPjAuMCl8fChpQj4wLjApKSB7CisJCQkJCQkJLy8gd2UgaGF2ZSBhIGxvY2F0aW9uIHdpdGggbm9uemVybyBkYXRhCisJCQkJCQkJLy8gd2VpZ2h0IGJ5IHRoZSB0b3RhbCBwb3B1bGF0aW9uCisJCQkJCQkJbG9jYXRpb25Db3VudFtpY291bnRdICs9IDEuMDsKKwkJCQkJCQltYXhQb3B1bGF0aW9uW2ljb3VudF0gKz0gcG9wOworCQkJCQkJCXRyYWplY3RvcnlBW2ljb3VudF0uaW50ZWdyYXRlUGF0aChzQSpwb3AsIGlBKnBvcCkgOworCQkJCQkJCXRyYWplY3RvcnlCW2ljb3VudF0uaW50ZWdyYXRlUGF0aChzQipwb3AsIGlCKnBvcCkgOworCQkJCQkJfQorCQkJCQl9Ly8gYWxsIGxvY2F0aW9ucworCQkgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCQkJCisJCQkJCS8vIG5vcm1hbGl6ZSAKKwkJCQkJaWYobG9jYXRpb25Db3VudFtpY291bnRdID49IDEuMCkgeworCQkJCQkJdHJhamVjdG9yeUFbaWNvdW50XS5ub3JtYWxpemUobWF4UG9wdWxhdGlvbltpY291bnRdKTsKKwkJCQkJCXRyYWplY3RvcnlCW2ljb3VudF0ubm9ybWFsaXplKG1heFBvcHVsYXRpb25baWNvdW50XSk7CisJCQkJCX0KKwkJCQl9Ly8gZm9yIGFsbCB0aW1lCisJCQorCQkJCXJldFZhbC5hZGQodHJhamVjdG9yeUEpOworCQkJCXJldFZhbC5hZGQodHJhamVjdG9yeUIpOworCQkJCXByb2dyZXNzLmRvbmUoKTsKKyAgICAgICAgICAgIH0gLy8gcnVuCisJCX07CisJCQorCQl0cnkgeworCQkJcnVubmFibGVDb250ZXh0LnJ1bih0cnVlLCB0cnVlLCB0YXNrKTsKKwkJfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdmUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCQorCQlyZXR1cm4gcmV0VmFsOwkKKwl9Ly8gZ2V0THlhcHVub3ZUcmFqZWN0b3J5KCkKKwkKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gdHJhamVjdG9yeUxpc3QKKwkgKiBAcmV0dXJuIHRoZSBjdW11bGF0aXZlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHRyYWplY3RvcmllcworCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQorCXB1YmxpYyBzdGF0aWMgTGlzdDxFTGlzdDxEb3VibGU+PiBnZXRDdW11bGF0aXZlUGhhc2VTcGFjZURldmlhdGlvbihMaXN0PFBoYXNlU3BhY2VDb29yZGluYXRlW10+IHRyYWplY3RvcnlMaXN0KSB7CisJCUxpc3Q8RUxpc3Q8RG91YmxlPj4gZGV2aWF0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8RUxpc3Q8RG91YmxlPj4oKTsKKwkJUGhhc2VTcGFjZUNvb3JkaW5hdGVbXSByZWZlcmVuY2VUcmFqZWN0b3J5ID0gdHJhamVjdG9yeUxpc3QuZ2V0KDApOworCQkKKwkJaWYodHJhamVjdG9yeUxpc3Quc2l6ZSgpPj0yKSB7CisJCQlmb3IgKGludCBpID0gMTsgaSA8IHRyYWplY3RvcnlMaXN0LnNpemUoKTsgaSArKyApIHsKKwkJCQlQaGFzZVNwYWNlQ29vcmRpbmF0ZVtdIGNvbXBhcmlzb25UcmFqZWN0b3J5ID0gdHJhamVjdG9yeUxpc3QuZ2V0KGkpOworCQkJCQorCQkJCUVMaXN0PERvdWJsZT4gZGV2aWF0aW9uID0gbmV3IEJhc2ljRUxpc3Q8RG91YmxlPihyZWZlcmVuY2VUcmFqZWN0b3J5Lmxlbmd0aCk7CisJCQkJCisJCQkJLy9kb3VibGUgbWluRGV2aWF0aW9uID0gOTk5OTk5LjA7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXZpYXRpb24uc2l6ZSgpOyBqICsrKSB7CisJCQkJCWRldmlhdGlvbi5zZXQoaiwgMC4wKTsKKwkJCQkJaWYoY29tcGFyaXNvblRyYWplY3RvcnkubGVuZ3RoPj0gaikgeworCQkJCQkJUGhhc2VTcGFjZUNvb3JkaW5hdGUgcmVmID0gcmVmZXJlbmNlVHJhamVjdG9yeVtqXTsKKwkJCQkJCVBoYXNlU3BhY2VDb29yZGluYXRlIGNvbXAgPSBjb21wYXJpc29uVHJhamVjdG9yeVtqXTsKKwkJCQkJCWRldmlhdGlvbi5zZXQoaiwgZGV2aWF0aW9uLmdldChqKStyZWYuZ2V0RGlzdGFuY2UoY29tcCkpOworCQkJCQkJaWYgKGogPj0gMSkgZGV2aWF0aW9uLnNldChqLCBkZXZpYXRpb24uZ2V0KGotMSkgKyBkZXZpYXRpb24uZ2V0KGopKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvKioKKwkJCQkgKiB0YWtlIHRoZSBsb2cKKwkJCQkgKi8KKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IGRldmlhdGlvbi5zaXplKCk7IGogKyspIHsKKwkJCQkJaWYoZGV2aWF0aW9uLmdldChqKSA+IDAuMCkgZGV2aWF0aW9uLnNldChqLCBNYXRoLmxvZyhkZXZpYXRpb24uZ2V0KGopKSk7CisJCQkJfQorCQkJCWRldmlhdGlvbkxpc3QuYWRkKGRldmlhdGlvbik7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBkZXZpYXRpb25MaXN0OworCX0KK30gLy8gY2xhc3MgTWVhblNxdWFyZURpZmZlcmVuY2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL01lYW5TcXVhcmVEaWZmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9NZWFuU3F1YXJlRGlmZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5Mjg5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9NZWFuU3F1YXJlRGlmZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMzYwIEBACisvKioKKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpczsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5TdGF0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwuUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2U7CisKKy8qKiAKKyAqIHRoaXMgY2xhc3MgY29tcHV0ZXMgdGhlIG1lYW4gc3F1YXJlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gc2NlbmFyaW9zIGFzIGEgZnVuY3Rpb24gb2YgdGltZQorICogMS4gSXQgb25seSBsb29rcyBhdCBsb2NhdGlvbnMgd2hpY2ggYXJlIENPTU1PTiB0byBib3RoIHNjZW5hcmlvcworICogMi4gVGhlIHRpbWUgc2VyaWVzIHNob3VsZCBiZSB0aGUgc2FtZSBsZW5ndGguIElmIHRoZXkgYXJlIG5vdCB0aGlzIHdpbGwgY29tcGFyZSBvZiBhIHBlcmlvZCBlcXVhbCB0bworICogICAgdGhlIFNIT1JURVNUIG9mIGFsbCB0aGUgdGltZSBzZXJpZXMuIAorICogMy4gSXQgb25seSBjb25zaWRlcnMgbG9jYXRpb25zIHdoZXJlIGluZmVjdGlvdXMgY291bnQgaXMgbm9uemVybyBpbiBvbmUgb3IgdGhlIG90aGVyIC0gbm90IGludGVyZXN0ZWQgaW4gd2VpZ2h0aW5nIHJlZ2lvbnMgd2l0aCBubyBkaXNlYXNlLgorICogQGF1dGhvciBqYW1lcworICoKKyAqLworcHVibGljIGNsYXNzIE1lYW5TcXVhcmVEaWZmZXJlbmNlIHsKKwkKKwkvKioKKwkgKiBpbnB1dAorCSAqLworCU1hcDxTdHJpbmcsTGlzdDxEb3VibGU+PiBjb21tb25JbmZlY3Rpb3VzTG9jYXRpb25zQSA9IG5ldyBIYXNoTWFwPFN0cmluZyxMaXN0PERvdWJsZT4+KCk7CisJTWFwPFN0cmluZyxMaXN0PERvdWJsZT4+IGNvbW1vbkluZmVjdGlvdXNMb2NhdGlvbnNCID0gbmV3IEhhc2hNYXA8U3RyaW5nLExpc3Q8RG91YmxlPj4oKTsKKwlNYXA8U3RyaW5nLExpc3Q8RG91YmxlPj4gY29tbW9uU3VzY2VwdGlibGVMb2NhdGlvbnNBID0gbmV3IEhhc2hNYXA8U3RyaW5nLExpc3Q8RG91YmxlPj4oKTsKKwlNYXA8U3RyaW5nLExpc3Q8RG91YmxlPj4gY29tbW9uU3VzY2VwdGlibGVMb2NhdGlvbnNCID0gbmV3IEhhc2hNYXA8U3RyaW5nLExpc3Q8RG91YmxlPj4oKTsKKwlNYXA8U3RyaW5nLExpc3Q8RG91YmxlPj4gdG90YWxQb3B1bGF0aW9uID0gbmV3IEhhc2hNYXA8U3RyaW5nLExpc3Q8RG91YmxlPj4oKTsKKwkKKwkKKwkvKioKKwkgKiBudW1iZXIgY29tbW9uIGxvY2F0aW9ucyB3aXRoIG5vbnplcm8gSW5mIGNvdW50IGF0IHRpbWUgdAorCSAqLworCXB1YmxpYyBkb3VibGVbXSBsb2NhdGlvbkNvdW50OworCS8qKgorCSAqIFRoZSBSZXN1bHQKKwkgKi8KKwlwdWJsaWMgZG91YmxlW10gbWVhblNxRGlmZjsKKwkvKioKKwkgKiB0aW1lCisJICovCisJcHVibGljIGRvdWJsZVtdIHRpbWU7CisJCisJLyoqCisJICogRGV0ZXJtaW5lcyB0aGUgTWVhblNxdWFyZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHNjZW5hcmlvIGRhdGEgc2V0cyBvdmVyIHRpbWUgZWFjaCBzdG9yZWQgaW4gYSBtYXAKKwkgKiBAcGFyYW0gc2NlbmFyaW9NYXBBIAorCSAqIEBwYXJhbSBzY2VuYXJpb01hcEIgCisJICogQHBhcmFtIHJ1bm5hYmxlQ29udGV4dCBSdW5uYWJsZSBjb250ZXh0IGZvciBwcm9ncmVzcyBpbmRpY2F0b3IKKwkgKi8KKwlwdWJsaWMgTWVhblNxdWFyZURpZmZlcmVuY2UoUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCBzY2VuYXJpb01hcEEsIFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwgc2NlbmFyaW9NYXBCLCBJUnVubmFibGVDb250ZXh0IHJ1bm5hYmxlQ29udGV4dCkgeworCQlmaW5hbCBSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIG1hcEEgPSBzY2VuYXJpb01hcEE7CisJCWZpbmFsIFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwgbWFwQiA9IHNjZW5hcmlvTWFwQjsKKwkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHRhc2sgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgIAlwcm9ncmVzcy5iZWdpblRhc2soIkNhbGN1bGF0aW5nIGNvbW1vbiBsb2NhdGlvbnMuLi4iLCBtYXBBLmdldE51bUxvY2F0aW9ucygpKTsKKyAgICAgCisJCQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvckEgPSBtYXBBLmdldExvY2F0aW9ucygpLml0ZXJhdG9yKCk7CisJCQkJaW50IG1heFRpbWUgPSAtMTsKKwkJCQl3aGlsZShpdGVyYXRvckEuaGFzTmV4dCgpKSB7CisJCQkJCXByb2dyZXNzLndvcmtlZCgxKTsKKwkJCQkJaWYocHJvZ3Jlc3MuaXNDYW5jZWxlZCgpKSB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKwkJCQkJU3RyaW5nIGlkID0gaXRlcmF0b3JBLm5leHQoKTsKKwkJCQkJCisJCQkJCWlmKG1hcEIuY29udGFpbnNMb2NhdGlvbihpZCkpIHsKKwkJCQkJCQorCQkJCQkJLy8gZ2V0IHRoZSBsaXN0cyBvZiBkYXRhIG9ubHkgZm9yIHRob3NlIGxvY2F0aW9ucyB0aGF0IGFyZSBjb21tb24gdG8gYm90aCBtYXBzCisJCQkJCQlSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBkYXRhTWFwQSA9IG1hcEEuZ2V0TG9jYXRpb24oaWQpOworCQkJCQkJTGlzdDxEb3VibGU+IGRhdGFBSSA9IGdldE5vcm1hbGl6ZWRJbmZlY3Rpb3VzKGRhdGFNYXBBKTsKKwkJCQkJCWNvbW1vbkluZmVjdGlvdXNMb2NhdGlvbnNBLnB1dChpZCxkYXRhQUkpOworCQkJCQkJCisJCQkJCQlMaXN0PERvdWJsZT4gZGF0YUFTID0gZ2V0Tm9ybWFsaXplZFN1c2NlcHRpYmxlKGRhdGFNYXBBKTsKKwkJCQkJCWNvbW1vblN1c2NlcHRpYmxlTG9jYXRpb25zQS5wdXQoaWQsZGF0YUFTKTsKKwkJCQkJCQorCQkJCQkJCisJCQkJCQkvLyBnZXQgdGhlIHRvdGFsIHBvcHVsYXRpb24gZnJvbSBNYXAgQSAoc2FtZSBhcyBtYXAgQiBmb3Igbm93CisJCQkJCQl0b3RhbFBvcHVsYXRpb24ucHV0KGlkLCBnZXRUb3RhbFBvcHVsYXRpb24oZGF0YU1hcEEpKTsKKwkJCQkJCQorCQkJCQkJLy8gTWFwIEIKKwkJCQkJCVJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGRhdGFNYXBCID0gbWFwQi5nZXRMb2NhdGlvbihpZCk7CisJCQkJCQlMaXN0PERvdWJsZT4gZGF0YUJJID0gZ2V0Tm9ybWFsaXplZEluZmVjdGlvdXMoZGF0YU1hcEIpOworCQkJCQkJY29tbW9uSW5mZWN0aW91c0xvY2F0aW9uc0IucHV0KGlkLGRhdGFCSSk7CisJCQkJCQkKKwkJCQkJCUxpc3Q8RG91YmxlPiBkYXRhQlMgPSBnZXROb3JtYWxpemVkU3VzY2VwdGlibGUoZGF0YU1hcEIpOworCQkJCQkJY29tbW9uU3VzY2VwdGlibGVMb2NhdGlvbnNCLnB1dChpZCxkYXRhQlMpOworCQkJCQkJCisJCQkJCQkvLyBpbml0IHRoZSBhcnJheSBzaXplCisJCQkJCQlpZiAobWF4VGltZSA9PSAtMSkgbWF4VGltZSA9IGRhdGFBSS5zaXplKCk7CisJCQkJCQkKKwkJCQkJCS8vIGRpbWVuc2lvbiB0aGUgYXJyYXlzIHRvIHRoZSBsZW5ndGggb2YgdGhlIFNNQUxMRVNUIGFycmF5IGZvciB3aGljaCB3ZSBoYXZlIGRhdGEKKwkJCQkJCWlmKG1heFRpbWUgPj0gZGF0YUJJLnNpemUoKSApIG1heFRpbWUgPSBkYXRhQkkuc2l6ZSgpOworCQkJCQkJaWYobWF4VGltZSA+PSBkYXRhQUkuc2l6ZSgpICkgbWF4VGltZSA9IGRhdGFBSS5zaXplKCk7CisJCQkJCX0vLyBpZgorCQkJCX0vLyB3aGlsZQorCQkJCXByb2dyZXNzLmRvbmUoKTsKKwkJCQlpZihtYXhUaW1lPD0wKSBtYXhUaW1lID0gMDsKKwkJCQlpZih0aW1lPT1udWxsKSB7CisJCQkJCXRpbWUgPSBuZXcgZG91YmxlW21heFRpbWVdOworCQkJCQltZWFuU3FEaWZmID0gbmV3IGRvdWJsZVttYXhUaW1lXTsKKwkJCQkJbG9jYXRpb25Db3VudCA9IG5ldyBkb3VibGVbbWF4VGltZV07CisJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBtYXhUaW1lOyBpICsrKSB7CisJCQkJCQl0aW1lW2ldID0gaTsKKwkJCQkJCW1lYW5TcURpZmZbaV0gPSAwLjA7CisJCQkJCQlsb2NhdGlvbkNvdW50W2ldID0gMC4wOworCQkJCQl9CisJCQkJfQorICAgICAgICAgICAgfQorCQl9OworCQl0cnkgeworCQkJcnVubmFibGVDb250ZXh0LnJ1bih0cnVlLCBmYWxzZSwgdGFzayk7CisJCX0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKwkJCS8vIFRhc2sgaXMgbm90IGludGVycnVwdGFibGUKKwkJfSBjYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgeworCQkJLy8gVGFzayBpcyBub3QgaW50ZXJydXB0YWJsZQorCQl9CisJfS8vIGNvbnN0cnVjdG9yIE1lYW5TcXVhcmVEaWZmZXJlbmNlCisJCisJCisJLyoqCisJICogRnJvbSB0aGUgZGF0YU1hcCBleHRyYWN0IGEgbGlzdCBvZiBub3JtYWxpemUgaW5mZWN0aW91cyAoZnJhY3Rpb24gb2YgdG90YWwgcG9wdWxhdGlvbikKKwkgKiBAcGFyYW0gZGF0YU1hcAorCSAqIEByZXR1cm4gbm9ybWFsaXplIGxpc3Qgb2YgaW5mZWN0aW91cyBwZW9wbGUKKwkgKi8KKwlwdWJsaWMgTGlzdDxEb3VibGU+IGdldE5vcm1hbGl6ZWRJbmZlY3Rpb3VzKFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGRhdGFNYXApIHsKKwkJZmluYWwgU3RyaW5nIFNVU0NFUFRJQkxFID0gU3RhdGVzLnN0YXRlc1RvRml0W1N0YXRlcy5TVVNDRVBUSUJMRV07CisJCWZpbmFsIFN0cmluZyBFWFBPU0VEID0gU3RhdGVzLnN0YXRlc1RvRml0W1N0YXRlcy5FWFBPU0VEXTsKKwkJZmluYWwgU3RyaW5nIElORkVDVElPVVMgPSBTdGF0ZXMuc3RhdGVzVG9GaXRbU3RhdGVzLklORkVDVElPVVNdOworCQlmaW5hbCBTdHJpbmcgUkVDT1ZFUkVEID0gU3RhdGVzLnN0YXRlc1RvRml0W1N0YXRlcy5SRUNPVkVSRURdOworCQkKKwkJLy8gbWF5IG9yIG1heSBub3QgZXhpc3QKKwkJTGlzdDxTdHJpbmc+IGV4cG9zZWRMaXN0ID0gbnVsbDsKKwkJTGlzdDxTdHJpbmc+IHJlY292ZXJlZExpc3QgPSBudWxsOworCQkgCisJCS8vIE1VU1QgZXhpc3QKKwkJTGlzdDxTdHJpbmc+IGluZmVjdGlvdXNMaXN0ID0gZGF0YU1hcC5nZXREYXRhKElORkVDVElPVVMpOworCQlMaXN0PFN0cmluZz4gc3VzY2VwdGlibGVMaXN0ID0gZGF0YU1hcC5nZXREYXRhKFNVU0NFUFRJQkxFKTsJCisJCWFzc2VydChpbmZlY3Rpb3VzTGlzdCE9bnVsbCk7CisJCWFzc2VydChzdXNjZXB0aWJsZUxpc3QhPW51bGwpOworCQlpZihkYXRhTWFwLmNvbnRhaW5zUGFyYW1ldGVyKEVYUE9TRUQpKSB7CisJCQlleHBvc2VkTGlzdCA9IGRhdGFNYXAuZ2V0RGF0YShFWFBPU0VEKTsJCisJCX0KKwkJaWYoZGF0YU1hcC5jb250YWluc1BhcmFtZXRlcihSRUNPVkVSRUQpKSB7CisJCQlyZWNvdmVyZWRMaXN0ID0gZGF0YU1hcC5nZXREYXRhKFJFQ09WRVJFRCk7CQorCQl9CisJCQorCQlMaXN0PERvdWJsZT4gbm9ybWFsaXplZEluZmVjdGlvdXMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJZG91YmxlW10gdG90YWxQb3AgPSBuZXcgZG91YmxlW2luZmVjdGlvdXNMaXN0LnNpemUoKV07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mZWN0aW91c0xpc3Quc2l6ZSgpOyBpICsrKSB7CisJCQkKKwkJCWRvdWJsZSBpbmYgPSAobmV3IERvdWJsZShpbmZlY3Rpb3VzTGlzdC5nZXQoaSkpKS5kb3VibGVWYWx1ZSgpOworCQkJZG91YmxlIHN1c2MgPSAobmV3IERvdWJsZShzdXNjZXB0aWJsZUxpc3QuZ2V0KGkpKSkuZG91YmxlVmFsdWUoKTsKKwkJCWRvdWJsZSBleHBvc2VkID0gMC4wOworCQkJZG91YmxlIHJlY292ZXJlZCA9IDAuMDsKKwkJCWlmKGV4cG9zZWRMaXN0IT1udWxsKSB7CisJCQkJZXhwb3NlZCA9IChuZXcgRG91YmxlKGV4cG9zZWRMaXN0LmdldChpKSkpLmRvdWJsZVZhbHVlKCk7CisJCQl9CisJCQlpZihyZWNvdmVyZWRMaXN0IT1udWxsKSB7CisJCQkJcmVjb3ZlcmVkID0gKG5ldyBEb3VibGUocmVjb3ZlcmVkTGlzdC5nZXQoaSkpKS5kb3VibGVWYWx1ZSgpOworCQkJfQorCQkJdG90YWxQb3BbaV0gPSBpbmYrc3VzYytleHBvc2VkK3JlY292ZXJlZDsKKwkJCWluZiAvPSB0b3RhbFBvcFtpXTsKKwkJCW5vcm1hbGl6ZWRJbmZlY3Rpb3VzLmFkZChuZXcgRG91YmxlKGluZikpOworCQl9CisJCXJldHVybiBub3JtYWxpemVkSW5mZWN0aW91czsKKwl9CisJCisJCisJLyoqCisJICogRnJvbSB0aGUgZGF0YU1hcCBleHRyYWN0IGEgbGlzdCBvZiBub3JtYWxpemUgaW5mZWN0aW91cyAoZnJhY3Rpb24gb2YgdG90YWwgcG9wdWxhdGlvbikKKwkgKiBAcGFyYW0gZGF0YU1hcAorCSAqIEByZXR1cm4gbm9ybWFsaXplIGxpc3Qgb2YgaW5mZWN0aW91cyBwZW9wbGUKKwkgKi8KKwlwdWJsaWMgTGlzdDxEb3VibGU+IGdldE5vcm1hbGl6ZWRTdXNjZXB0aWJsZShSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBkYXRhTWFwKSB7CisJCWZpbmFsIFN0cmluZyBTVVNDRVBUSUJMRSA9IFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuU1VTQ0VQVElCTEVdOworCQlmaW5hbCBTdHJpbmcgRVhQT1NFRCA9IFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuRVhQT1NFRF07CisJCWZpbmFsIFN0cmluZyBJTkZFQ1RJT1VTID0gU3RhdGVzLnN0YXRlc1RvRml0W1N0YXRlcy5JTkZFQ1RJT1VTXTsKKwkJZmluYWwgU3RyaW5nIFJFQ09WRVJFRCA9IFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuUkVDT1ZFUkVEXTsKKwkJCisJCS8vIG1heSBvciBtYXkgbm90IGV4aXN0CisJCUxpc3Q8U3RyaW5nPiBleHBvc2VkTGlzdCA9IG51bGw7CisJCUxpc3Q8U3RyaW5nPiByZWNvdmVyZWRMaXN0ID0gbnVsbDsKKwkJIAorCQkvLyBNVVNUIGV4aXN0CisJCUxpc3Q8U3RyaW5nPiBpbmZlY3Rpb3VzTGlzdCA9IGRhdGFNYXAuZ2V0RGF0YShJTkZFQ1RJT1VTKTsKKwkJTGlzdDxTdHJpbmc+IHN1c2NlcHRpYmxlTGlzdCA9IGRhdGFNYXAuZ2V0RGF0YShTVVNDRVBUSUJMRSk7CQorCQlhc3NlcnQoaW5mZWN0aW91c0xpc3QhPW51bGwpOworCQlhc3NlcnQoc3VzY2VwdGlibGVMaXN0IT1udWxsKTsKKwkJaWYoZGF0YU1hcC5jb250YWluc1BhcmFtZXRlcihFWFBPU0VEKSkgeworCQkJZXhwb3NlZExpc3QgPSBkYXRhTWFwLmdldERhdGEoRVhQT1NFRCk7CQorCQl9CisJCWlmKGRhdGFNYXAuY29udGFpbnNQYXJhbWV0ZXIoUkVDT1ZFUkVEKSkgeworCQkJcmVjb3ZlcmVkTGlzdCA9IGRhdGFNYXAuZ2V0RGF0YShSRUNPVkVSRUQpOwkKKwkJfQorCQkKKwkJTGlzdDxEb3VibGU+IG5vcm1hbGl6ZWRTdXNjZXB0aWJsZSA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQlkb3VibGVbXSB0b3RhbFBvcCA9IG5ldyBkb3VibGVbc3VzY2VwdGlibGVMaXN0LnNpemUoKV07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VzY2VwdGlibGVMaXN0LnNpemUoKTsgaSArKykgeworCQkJCisJCQlkb3VibGUgaW5mID0gKG5ldyBEb3VibGUoaW5mZWN0aW91c0xpc3QuZ2V0KGkpKSkuZG91YmxlVmFsdWUoKTsKKwkJCWRvdWJsZSBzdXNjID0gKG5ldyBEb3VibGUoc3VzY2VwdGlibGVMaXN0LmdldChpKSkpLmRvdWJsZVZhbHVlKCk7CisJCQlkb3VibGUgZXhwb3NlZCA9IDAuMDsKKwkJCWRvdWJsZSByZWNvdmVyZWQgPSAwLjA7CisJCQlpZihleHBvc2VkTGlzdCE9bnVsbCkgeworCQkJCWV4cG9zZWQgPSAobmV3IERvdWJsZShleHBvc2VkTGlzdC5nZXQoaSkpKS5kb3VibGVWYWx1ZSgpOworCQkJfQorCQkJaWYocmVjb3ZlcmVkTGlzdCE9bnVsbCkgeworCQkJCXJlY292ZXJlZCA9IChuZXcgRG91YmxlKHJlY292ZXJlZExpc3QuZ2V0KGkpKSkuZG91YmxlVmFsdWUoKTsKKwkJCX0KKwkJCXRvdGFsUG9wW2ldID0gaW5mK3N1c2MrZXhwb3NlZCtyZWNvdmVyZWQ7CisJCQlpZih0b3RhbFBvcFtpXSAhPSAwLjApIHN1c2MgLz0gdG90YWxQb3BbaV07CisJCQllbHNlIHN1c2MgPSAwOyAvLyBzb21lIHByb2JsZW0gZm9yIGFpciB0cmFuc3BvcmF0aW9uIG5vZGVzIHNvIGFkZGVkIHRoaXMgZml4CisJCQlub3JtYWxpemVkU3VzY2VwdGlibGUuYWRkKG5ldyBEb3VibGUoc3VzYykpOworCQl9CisJCXJldHVybiBub3JtYWxpemVkU3VzY2VwdGlibGU7CisJfQorCQorCS8qKgorCSAqIEZyb20gdGhlIGRhdGFNYXAgZXh0cmFjdCBhIGxpc3Qgb2YgdGhlIHRvdGFsIHBvcHVsYXRpb24pCisJICogQHBhcmFtIGRhdGFNYXAKKwkgKiBAcmV0dXJuIHRvdGFsIHBvcHVsYXRpb24KKwkgKi8KKwlwdWJsaWMgTGlzdDxEb3VibGU+IGdldFRvdGFsUG9wdWxhdGlvbihSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBkYXRhTWFwKSB7CisJCWZpbmFsIFN0cmluZyBTVVNDRVBUSUJMRSA9IFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuU1VTQ0VQVElCTEVdOworCQlmaW5hbCBTdHJpbmcgRVhQT1NFRCA9IFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuRVhQT1NFRF07CisJCWZpbmFsIFN0cmluZyBJTkZFQ1RJT1VTID0gU3RhdGVzLnN0YXRlc1RvRml0W1N0YXRlcy5JTkZFQ1RJT1VTXTsKKwkJZmluYWwgU3RyaW5nIFJFQ09WRVJFRCA9IFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuUkVDT1ZFUkVEXTsKKwkJCisJCS8vIG1heSBvciBtYXkgbm90IGV4aXN0CisJCUxpc3Q8U3RyaW5nPiBleHBvc2VkTGlzdCA9IG51bGw7CisJCUxpc3Q8U3RyaW5nPiByZWNvdmVyZWRMaXN0ID0gbnVsbDsKKwkJIAorCQkvLyBNVVNUIGV4aXN0CisJCUxpc3Q8U3RyaW5nPiBpbmZlY3Rpb3VzTGlzdCA9IGRhdGFNYXAuZ2V0RGF0YShJTkZFQ1RJT1VTKTsKKwkJTGlzdDxTdHJpbmc+IHN1c2NlcHRpYmxlTGlzdCA9IGRhdGFNYXAuZ2V0RGF0YShTVVNDRVBUSUJMRSk7CQorCQlhc3NlcnQoaW5mZWN0aW91c0xpc3QhPW51bGwpOworCQlhc3NlcnQoc3VzY2VwdGlibGVMaXN0IT1udWxsKTsKKwkJaWYoZGF0YU1hcC5jb250YWluc1BhcmFtZXRlcihFWFBPU0VEKSkgeworCQkJZXhwb3NlZExpc3QgPSBkYXRhTWFwLmdldERhdGEoRVhQT1NFRCk7CQorCQl9CisJCWlmKGRhdGFNYXAuY29udGFpbnNQYXJhbWV0ZXIoUkVDT1ZFUkVEKSkgeworCQkJcmVjb3ZlcmVkTGlzdCA9IGRhdGFNYXAuZ2V0RGF0YShSRUNPVkVSRUQpOwkKKwkJfQorCQkKKwkJTGlzdDxEb3VibGU+IHBvcHVsYXRpb24gPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZlY3Rpb3VzTGlzdC5zaXplKCk7IGkgKyspIHsKKwkJCWRvdWJsZSB0b3RhbFBvcCA9IDAuMDsKKwkJCWRvdWJsZSBpbmYgPSAobmV3IERvdWJsZShpbmZlY3Rpb3VzTGlzdC5nZXQoaSkpKS5kb3VibGVWYWx1ZSgpOworCQkJZG91YmxlIHN1c2MgPSAobmV3IERvdWJsZShzdXNjZXB0aWJsZUxpc3QuZ2V0KGkpKSkuZG91YmxlVmFsdWUoKTsKKwkJCWRvdWJsZSBleHBvc2VkID0gMC4wOworCQkJZG91YmxlIHJlY292ZXJlZCA9IDAuMDsKKwkJCWlmKGV4cG9zZWRMaXN0IT1udWxsKSB7CisJCQkJZXhwb3NlZCA9IChuZXcgRG91YmxlKGV4cG9zZWRMaXN0LmdldChpKSkpLmRvdWJsZVZhbHVlKCk7CisJCQl9CisJCQlpZihyZWNvdmVyZWRMaXN0IT1udWxsKSB7CisJCQkJcmVjb3ZlcmVkID0gKG5ldyBEb3VibGUocmVjb3ZlcmVkTGlzdC5nZXQoaSkpKS5kb3VibGVWYWx1ZSgpOworCQkJfQorCQkJdG90YWxQb3AgPSBpbmYrc3VzYytleHBvc2VkK3JlY292ZXJlZDsKKwkJCXBvcHVsYXRpb24uYWRkKG5ldyBEb3VibGUodG90YWxQb3ApKTsKKwkJfQorCQlyZXR1cm4gcG9wdWxhdGlvbjsKKwl9CisJCisJLyoqCisJICogc29sdmVzIGZvciB0aGUgUm9vdCBNZWFuU3F1YXJlRGlmZmVyZW5jZSB2cyB0aW1lCisJICogdXNpbmcgaW5mZWN0aW91cyBkYXRhIG9ubHkgZm9yIG5vdworCSAqIAorCSAqIEBwYXJhbSBydW5uYWJsZUNvbnRleHQgUnVubmFibGUgY29udGV4dCBmb3IgcHJvZ3Jlc3MgaW5kaWNhdG9yCisJICogQHJldHVybiBjb21wYXJpc29uIHRpbWUgc2VyaWVzIGFzIGRvdWJsZVtdCisJICovCisJcHVibGljIGRvdWJsZVtdIHNvbHZlKElSdW5uYWJsZUNvbnRleHQgcnVubmFibGVDb250ZXh0KSB7CisJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyB0YXNrID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB7CisgICAgICAgICAgICAJcHJvZ3Jlc3MuYmVnaW5UYXNrKCJTb2x2aW5nLi4uIiwgdGltZS5sZW5ndGgpOworCQkJCWRvdWJsZVtdIG1heFBvcHVsYXRpb24gPSBuZXcgZG91YmxlW3RpbWUubGVuZ3RoXTsKKwkJCQlmb3IoaW50IGljb3VudCA9MDsgaWNvdW50IDwgdGltZS5sZW5ndGg7IGljb3VudCArKykgeworCQkJCQlwcm9ncmVzcy53b3JrZWQoMSk7CisJCQkJCWlmKHByb2dyZXNzLmlzQ2FuY2VsZWQoKSkgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisJCQkJCW1heFBvcHVsYXRpb25baWNvdW50XSA9IDAuMDsKKwkJCQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gY29tbW9uSW5mZWN0aW91c0xvY2F0aW9uc0Eua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCQkJCS8vIGFsbCBsb2NhdGlvbnMKKwkJCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKKwkJCQkJCVN0cmluZyBpZCA9IGl0ZXIubmV4dCgpOworCQkJCQkJTGlzdDxEb3VibGU+IGRhdGFBSSA9IGNvbW1vbkluZmVjdGlvdXNMb2NhdGlvbnNBLmdldChpZCk7CisJCQkJCQlMaXN0PERvdWJsZT4gZGF0YUJJID0gY29tbW9uSW5mZWN0aW91c0xvY2F0aW9uc0IuZ2V0KGlkKTsKKwkJCQkJCQorCQkJCQkJTGlzdDxEb3VibGU+IHBvcHVsYXRpb24gPSB0b3RhbFBvcHVsYXRpb24uZ2V0KGlkKTsKKwkJCQkJCQorCQkJCQkJZG91YmxlIGlBID0gZGF0YUFJLmdldChpY291bnQpLmRvdWJsZVZhbHVlKCk7CisJCQkJCQlkb3VibGUgaUIgPSBkYXRhQkkuZ2V0KGljb3VudCkuZG91YmxlVmFsdWUoKTsKKwkJCQkJCWRvdWJsZSBwb3AgPSBwb3B1bGF0aW9uLmdldChpY291bnQpLmRvdWJsZVZhbHVlKCk7CisJCQorCQkJCQkJLy8gZG91YmxlIGRlbm9tID0gKGlBK2lCKS8yLjA7CisJCQkJCQkvLyBzcXVhcmUgb2YgdGhlIGF2ZXJhZ2UgZnJhY3Rpb24gb2YgaW5mZWN0aW91cyBwZW9wbGUKKwkJCQkJCS8vIGRlbm9tICo9IGRlbm9tOworCQkJCQkJaWYgKChpQSA+IDAuMCkgfHwgKGlCID4gMC4wKSkgeworCQkJCQkJCS8vIHdlIGhhdmUgYSBsb2NhdGlvbiB3aXRoIG5vbnplcm8gZGF0YQorCQkJCQkJCWxvY2F0aW9uQ291bnRbaWNvdW50XSArPSAxLjA7CisJCQkJCQkJbWF4UG9wdWxhdGlvbltpY291bnRdICs9IHBvcDsKKwkJCQkJCQkvLyBzcXVhcmUgb2YgdGhlIERJRkZFUkVOQ0UKKwkJCQkJCQkKKwkJCQkJCQkvLyBDaGFuZ2VkIDIvNC8wOS4gRHJvcCB0aGUgUyBkYXRhIGNvbXBhcmlzb24KKwkJCQkJCQkvL2RvdWJsZSB0ZXJtID0gKChpQSAtIGlCKSAqIChpQSAtIGlCKSkKKwkJCQkJCQkvLwkJKyAoKHNBIC0gc0IpICogKHNBIC0gc0IpKTsKKwkJCQkJCQkKKwkJCQkJCQlkb3VibGUgdGVybSA9ICgoaUEgLSBpQikgKiAoaUEgLSBpQikpOworCQkJCQkKKwkJCQkJCQlkb3VibGUgbnVtZXIgPSBwb3AgKiBNYXRoLnNxcnQodGVybSk7CisJCQkJCQkJLy8gbm9ybWFsaXplCisJCQkJCQkJbWVhblNxRGlmZltpY291bnRdICs9IG51bWVyOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQorCQkJCQl9Ly8gYWxsIGxvY2F0aW9ucworCQkJCQkKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkJCisJCQkJCS8vIG5vcm1hbGl6ZSAKKwkJCQkJaWYobG9jYXRpb25Db3VudFtpY291bnRdID49IDEuMCkgeworCQkJCQkJbWVhblNxRGlmZltpY291bnRdIC89IG1heFBvcHVsYXRpb25baWNvdW50XTsKKwkJCQkJfQorCQkJCX0vLyBmb3IgYWxsIHRpbWUKKwkJCQlwcm9ncmVzcy5kb25lKCk7CisgICAgICAgICAgICB9IC8vIHJ1bgorCQl9OworCQkKKwkJdHJ5IHsKKwkJCXJ1bm5hYmxlQ29udGV4dC5ydW4odHJ1ZSwgdHJ1ZSwgdGFzayk7CisJCX0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKwkJCXJldHVybiBudWxsOworCQl9IGNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXZlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gbWVhblNxRGlmZjsJCisJfS8vIHNvbHZlKCkKKworCQorCQorfSAvLyBjbGFzcyBNZWFuU3F1YXJlRGlmZmVyZW5jZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvTW9kZWxQYXJhbWV0ZXJzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9Nb2RlbFBhcmFtZXRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTNlYzAyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvTW9kZWxQYXJhbWV0ZXJzLmphdmEKQEAgLTAsMCArMSwzNTggQEAKKy8qKgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqCisgKiBUaGlzIGNsYXNzIGhvbGRzIGFsbCB0aGUgcGFyYW1ldGVycyB0aGF0IHdlIG1pZ2h0IHdhbnQgdG8gZXN0aW1hdGUKKyAqIGFuZCB0aGVpciBzdGFuZGFyZCBkZXZpYXRpb25zIGFuZCB2YXJpYW5jZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBNb2RlbFBhcmFtZXRlcnMgeworCisJLyoqCisJICogQWxsIG1vZGVsIHBhcmFtZXRlcnMgYXJlIHN0b3JlZCBpbiB0aGlzIG1hcAorCSAqLworCXByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGFyYW1ldGVyPigpOworCisKKwkvKioKKwkgKiBBbGwgc2VsZWN0ZWQgZGF0YSBhcyBhIExpc3Q8ZG91YmxlW11bXT4ga2V5ZWQgYnkgbG9jYXRpb24KKwkgKiBmb3IgZGlzcGxheS4gVGhlIGRvdWJsZSBpbmRpY2VzIGFyZSBkYXRhW3N0YXRlXVtjaGFydEluZGV4XVt0aW1lXQorCSAqIHdoZXJlIHN0YXRlIGluZGljYXRlcyBlaXRoZXIgcmF3IGRhdGEgKHN0YXRlPTApIG9yIHRoZSBzZWxlY3RlZCB0aW1lIHJlZ2lvbiBvZiB0aGUgZGF0YSAoc3RhdGU9MSkgCisJICogY2hhcnQgaW5kZXggc2VsZWN0ZWQgZm9yIGVhY2ggb2YgdGhlIHN0YXRlIHZhcmlhYmxlcyBTLEUsSSxSIChjaGFydEluZGV4IDAtMykKKwkgKi8KKwlwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBMaXN0PGRvdWJsZVtdW10+ID4gc2VsZWN0ZWREYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PGRvdWJsZVtdW10+PigpOworCisJLyoqCisJICogQWxsIHNlbGVjdGVkIHJlZ3Jlc3Npb24gYXMgYSBMaXN0PGRvdWJsZVtdW10+IGtleWVkIGJ5IGxvY2F0aW9uCisJICogZm9yIGRpc3BsYXkuIFRoZSBkb3VibGUgaW5kaWNlcyBhcmUgZGF0YVtzdGF0ZV1bdGltZV0KKwkgKiB3aGVyZSBzdGF0ZSBpbmRpY2F0ZXMgZWl0aGVyIHggYXhpcyAoc3RhdGU9MCkgb3IgeSBheGlzIChzdGF0ZT0xKSAKKwkgKiBjaGFydCBpbmRleCBzZWxlY3RlZCBmb3IgZWFjaCBvZiB0aGUgc3RhdGUgZXF1YXRpb25zIChjaGFydEluZGV4IDAtMykKKwkgKi8KKwlwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBMaXN0PGRvdWJsZVtdW10+ID4gcmVncmVzc2lvbkRhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8ZG91YmxlW11bXT4+KCk7CisKKworCS8qKgorCSAqIEFsbCBzZWxlY3RlZCBmaXRzIHRvIHRoZSByZWdyZXNzaW9uIGFzIGEgTGlzdDxkb3VibGVbXVtdPiBrZXllZCBieSBsb2NhdGlvbgorCSAqIGZvciBkaXNwbGF5LiBUaGUgZG91YmxlIGluZGljZXMgYXJlIGRhdGFbc3RhdGVdW3RpbWVdCisJICogd2hlcmUgc3RhdGUgaW5kaWNhdGVzIGVpdGhlciB4IGF4aXMgKHN0YXRlPTApIG9yIHkgYXhpcyAoc3RhdGU9MSkgCisJICogY2hhcnQgaW5kZXggc2VsZWN0ZWQgZm9yIGVhY2ggb2YgdGhlIHN0YXRlIGVxdWF0aW9ucyAoY2hhcnRJbmRleCAwLTMpCisJICovCisJcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgTGlzdDxkb3VibGVbXVtdPiA+IGZpdHRlZERhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8ZG91YmxlW11bXT4+KCk7CisKKworCisKKwkvKioKKwkgKiB0aGUgcmVmZXJlbmNlIHBvcHVsYXRpb24gZGVuc2l0eQorCSAqIHJlcXVpcmVkIHRvIGRvIGFuIGF2ZXJhZ2UgYWNyb3NzIGxvY2F0aW9ucyB3aXRoIHZhcnlpbmcgZGVuc2l0eQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIFJFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFkgPSAxMDAuMDsKKworCisJLyoqCisJICogZW1wdHkgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgTW9kZWxQYXJhbWV0ZXJzKCkgeworCQkvLyBOb3RoaW5nIGhlcmUKKwl9CisKKworCS8qKgorCSAqIGF2ZXJhZ2UgdGhlIGRhdGEgaW4gYSBtYXAgb2YgbW9kZWwgcGFyYW1ldGVycworCSAqIEBwYXJhbSBwYXJhbWV0ZXJJZE1hcAorCSAqIEByZXR1cm4gdGhlIGF2ZXJhZ2VkIG1vZGVsUGFyYW1ldGVycworCSAqLworCXB1YmxpYyBNb2RlbFBhcmFtZXRlcnMgYXZlcmFnZShNYXA8U3RyaW5nLE1vZGVsUGFyYW1ldGVycz4gcGFyYW1ldGVySWRNYXApIHsKKwkJLy9JdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBwYXJhbWV0ZXJJZE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworCQlmb3IgKEVudHJ5PFN0cmluZyxNb2RlbFBhcmFtZXRlcnM+IGVudHJ5IDogcGFyYW1ldGVySWRNYXAuZW50cnlTZXQoKSkgeworCisJCQkvL3doaWxlKChpdGVyIT1udWxsKSYmKGl0ZXIuaGFzTmV4dCgpKSkgeworCQkJLy9TdHJpbmcga2V5ID0gaXRlci5uZXh0KCk7CisJCQlNb2RlbFBhcmFtZXRlcnMgcGFybXMgPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJdGhpcy5hY2N1bXVsYXRlTnVtZXJhdG9yKHBhcm1zKTsKKwkJCXRoaXMuYWNjdW11bGF0ZURlbm9taW5hdG9yKHBhcm1zKTsKKworCQkJLy8gYW5kIGZvciBkaXNwbGF5IHB1cnBvc2VzIHNhdmUgdGhlIGRhdGEsIGJ5IGxvY2F0aW9uLCB0aGF0IHdlbnQgaW50byB0aGUgZml0CisJCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIyID0gcGFybXMuc2VsZWN0ZWREYXRhLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCQl3aGlsZSgoaXRlcjIhPW51bGwpJiYoaXRlcjIuaGFzTmV4dCgpKSkgeworCQkJCVN0cmluZyBpZCA9IGl0ZXIyLm5leHQoKTsKKwkJCQlMaXN0PGRvdWJsZVtdW10+IGRhdGEgPSBwYXJtcy5zZWxlY3RlZERhdGEuZ2V0KGlkKTsKKwkJCQl0aGlzLnNlbGVjdGVkRGF0YS5wdXQoaWQsIGRhdGEpOworCQkJfQkKKwkJCS8vIGFuZCBmb3IgZGlzcGxheSBwdXJwb3NlcyBzYXZlIHRoZSByZWdyZXNzaW9uLCBieSBsb2NhdGlvbiwgdGhhdCB3ZW50IGludG8gdGhlIGZpdAorCQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyMyA9IHBhcm1zLnJlZ3Jlc3Npb25EYXRhLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCQl3aGlsZSgoaXRlcjMhPW51bGwpJiYoaXRlcjMuaGFzTmV4dCgpKSkgeworCQkJCVN0cmluZyBpZCA9IGl0ZXIzLm5leHQoKTsKKwkJCQlMaXN0PGRvdWJsZVtdW10+IGRhdGEgPSBwYXJtcy5yZWdyZXNzaW9uRGF0YS5nZXQoaWQpOworCQkJCXRoaXMucmVncmVzc2lvbkRhdGEucHV0KGlkLCBkYXRhKTsKKwkJCX0JCisKKwkJCS8vIGFuZCBmb3IgZGlzcGxheSBwdXJwb3NlcyBzYXZlIHRoZSBmaXR0ZWQgZGF0YSwgYnkgbG9jYXRpb24sIHRoYXQgd2VudCBpbnRvIHRoZSBmaXQKKwkJCUl0ZXJhdG9yPFN0cmluZz4gaXRlcjQgPSBwYXJtcy5maXR0ZWREYXRhLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCQl3aGlsZSgoaXRlcjQhPW51bGwpJiYoaXRlcjQuaGFzTmV4dCgpKSkgeworCQkJCVN0cmluZyBpZCA9IGl0ZXI0Lm5leHQoKTsKKwkJCQlMaXN0PGRvdWJsZVtdW10+IGRhdGEgPSBwYXJtcy5maXR0ZWREYXRhLmdldChpZCk7CisJCQkJdGhpcy5maXR0ZWREYXRhLnB1dChpZCwgZGF0YSk7CisJCQl9CQorCQl9Ly8gYWxsIGxvY2F0aW9ucworCQl0aGlzLmF2ZXJhZ2UoKTsKKwkJdGhpcy5jYWxjdWxhdGVTdGRBdmcoKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisKKwlIYXNoTWFwIDxTdHJpbmcsIERvdWJsZT4gbnVtZXJhdG9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRG91YmxlPigpOworCisJLyoqCisJICogYWNjdW11bGF0ZSBudW1lcmF0b3IgdmFsdWVzIGZyb20gYW5vdGhlciBNb2RlbFBhcmFtZXRlcnMgaW5zdGFuY2UgZm9yIGNhbGN1bGF0aW5nIGF2ZXJhZ2UKKwkgKiBAcGFyYW0gb3RoZXIKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKKwlwcml2YXRlIHZvaWQgYWNjdW11bGF0ZU51bWVyYXRvcihNb2RlbFBhcmFtZXRlcnMgb3RoZXIpIHsKKworCQlmb3IoUGFyYW1ldGVyIHBhcm0gOiBvdGhlci5nZXRQYXJhbWV0ZXJzKCkudmFsdWVzKCkpIHsKKwkJCWlmKG51bWVyYXRvcnMuY29udGFpbnNLZXkocGFybS5uYW1lKSkKKwkJCQludW1lcmF0b3JzLnB1dChwYXJtLm5hbWUsIAorCQkJCQkJbnVtZXJhdG9ycy5nZXQocGFybS5uYW1lKSArIChwYXJtLnZhbHVlIC8gcGFybS52YXJpYW5jZSkpOworCQkJZWxzZQorCQkJCW51bWVyYXRvcnMucHV0KHBhcm0ubmFtZSwgCisJCQkJCQlwYXJtLnZhbHVlIC8gcGFybS52YXJpYW5jZSk7CisJCX0KKwl9CisKKwlIYXNoTWFwIDxTdHJpbmcsIERvdWJsZT4gZGVub21pbmF0b3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEb3VibGU+KCk7CisKKwkvKioKKwkgKiBhY2N1bXVsYXRlIGRlbm9taW5hdG9yIHZhbHVlcyBmcm9tIGFub3RoZXIgTW9kZWxQYXJhbWV0ZXJzIGluc3RhbmNlIGZvciBjYWxjdWxhdGluZyBhdmVyYWdlCisJICogQHBhcmFtIG90aGVyCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCisJcHJpdmF0ZSB2b2lkIGFjY3VtdWxhdGVEZW5vbWluYXRvcihNb2RlbFBhcmFtZXRlcnMgb3RoZXIpIHsKKworCQlmb3IoUGFyYW1ldGVyIHBhcm0gOiBvdGhlci5nZXRQYXJhbWV0ZXJzKCkudmFsdWVzKCkpIHsKKwkJCWlmKGRlbm9taW5hdG9ycy5jb250YWluc0tleShwYXJtLm5hbWUpKQorCQkJCWRlbm9taW5hdG9ycy5wdXQocGFybS5uYW1lLCAKKwkJCQkJCWRlbm9taW5hdG9ycy5nZXQocGFybS5uYW1lKSArICgxLjAgLyBwYXJtLnZhcmlhbmNlKSk7CisJCQllbHNlCisJCQkJZGVub21pbmF0b3JzLnB1dChwYXJtLm5hbWUsIAorCQkJCQkJKDEuMCAvIHBhcm0udmFyaWFuY2UpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIGRpdmlkZSB0byBnZXQgYXZlcmFnZQorCSAqLworCXByaXZhdGUgdm9pZCBhdmVyYWdlKCkgeworCQlmb3IoU3RyaW5nIHBhcm0gOiB0aGlzLm51bWVyYXRvcnMua2V5U2V0KCkpIHsKKwkJCWRvdWJsZSBudW0gPSBudW1lcmF0b3JzLmdldChwYXJtKS5kb3VibGVWYWx1ZSgpOworCQkJZG91YmxlIGRlbm9tID0gZGVub21pbmF0b3JzLmdldChwYXJtKS5kb3VibGVWYWx1ZSgpOworCQkJdGhpcy5hZGRQYXJhbWV0ZXIocGFybSwgbmV3IFBhcmFtZXRlcihwYXJtLCBudW0gLyBkZW5vbSAgKSk7CisJCX0vLyBmb3IKKwl9Ly8gYXZlcmFnZQorCisJLyoqCisJICogZmluZCBzdGQgb2YgZWFjaCBwYXJhbWV0ZXIgYXZlcmFnZQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQorCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVTdGRBdmcoKSB7CisJCWZvcihTdHJpbmcgcGFybSA6IHRoaXMubnVtZXJhdG9ycy5rZXlTZXQoKSkgeworCQkJUGFyYW1ldGVyIHAgPSB0aGlzLmdldFBhcmFtZXRlcihwYXJtKTsKKwkJCXAuc3RkZGV2ID0gTWF0aC5zcXJ0KDEuMCAvIGRlbm9taW5hdG9ycy5nZXQocGFybSkpOworCQl9CisKKwkJLy8gSSBhc3N1bWUgdGhlICs9IGJlbG93IHdhcyBhIGJ1Zz8gLSBTRUQKKwkJLyoJCXN0ZEJldGEgKz0gTWF0aC5zcXJ0KDEvZGVub21pbmF0b3JCZXRhKTsKKwkJc3RkQWxwaGEgKz0gTWF0aC5zcXJ0KDEvZGVub21pbmF0b3JBbHBoYSk7CisJCXN0ZEdhbW1hICs9IE1hdGguc3FydCgxL2Rlbm9taW5hdG9yR2FtbWEpOworCQlzdGRFcHNpbG9uICs9IE1hdGguc3FydCgxL2Rlbm9taW5hdG9yRXBzaWxvbik7CisJCXN0ZEJldGEyICs9IE1hdGguc3FydCgxL2Rlbm9taW5hdG9yQmV0YTIpOworCQlzdGRBbHBoYTIgKz0gTWF0aC5zcXJ0KDEvZGVub21pbmF0b3JBbHBoYTIpOworCQlzdGRHYW1tYTIgKz0gTWF0aC5zcXJ0KDEvZGVub21pbmF0b3JHYW1tYTIpOworCQlzdGRFcHNpbG9uMiArPSBNYXRoLnNxcnQoMS9kZW5vbWluYXRvckVwc2lsb24yKTsKKwkJc3RkTGFtYmRhICs9IE1hdGguc3FydCgxL2Rlbm9taW5hdG9yTGFtYmRhKTsKKwkJICovCisJfQorCisKKwkvKioKKwkgKiBhZGQgYSBuZXcgcGFyYW1ldGVyIHRvIHRoZSBtYXAKKwkgKiBAcGFyYW0gbmFtZSBQYXJhbWV0ZXIgbmFtZQorCSAqIEBwYXJhbSBwYXJtIFBhcmFtZXRlciBpbnN0YW5jZQorCSAqLworCXB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgUGFyYW1ldGVyIHBhcm0pIHsKKwkJdGhpcy5wYXJhbWV0ZXJzLnB1dChuYW1lLCBwYXJtKTsKKwl9CisKKwkvKioKKwkgKiBhZGQgc2VsZWN0ZWQgZGF0YSBmb3IgZGlzcGxheQorCSAqIEBwYXJhbSBuYW1lIGxvY2F0aW9uIG5hbWUKKwkgKiBAcGFyYW0gZGF0YSB0aGUgc2VsZWN0ZWQgZGF0YQorCSAqLworCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGVkRGF0YShTdHJpbmcgbmFtZSwgTGlzdDxkb3VibGVbXVtdPiBkYXRhKSB7CisJCXRoaXMuc2VsZWN0ZWREYXRhLnB1dChuYW1lLCBkYXRhKTsKKwl9CisKKwkvKioKKwkgKiBhZGQgc2VsZWN0ZWQgcmVncmVzc2lvbiBmb3IgZGlzcGxheQorCSAqIEBwYXJhbSBuYW1lIGxvY2F0aW9uIG5hbWUKKwkgKiBAcGFyYW0gZGF0YSB0aGUgc2VsZWN0ZWQgZGF0YQorCSAqLworCXB1YmxpYyB2b2lkIGFkZFJlZ3Jlc3Npb25EYXRhKFN0cmluZyBuYW1lLCBMaXN0PGRvdWJsZVtdW10+IGRhdGEpIHsKKwkJdGhpcy5yZWdyZXNzaW9uRGF0YS5wdXQobmFtZSwgZGF0YSk7CisJfQorCisKKwkvKioKKwkgKiBhZGQgZml0dGVkIGRhdGEgZm9yIGRpc3BsYXkKKwkgKiBAcGFyYW0gbmFtZSBsb2NhdGlvbiBuYW1lCisJICogQHBhcmFtIGRhdGEgdGhlIHNlbGVjdGVkIGRhdGEKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRGaXR0ZWREYXRhKFN0cmluZyBuYW1lLCBMaXN0PGRvdWJsZVtdW10+IGRhdGEpIHsKKwkJdGhpcy5maXR0ZWREYXRhLnB1dChuYW1lLCBkYXRhKTsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJhdyBkYXRhIChzdGF0ZSAwKSBhbmQgdGhlIHNlbGVjdGVkIGRhdGEgKHN0YXRlIDEpIAorCSAqIGZvciBlYWNoIG9mIHRoZSBzdGF0ZSB2YXJpYWJsZXMgUyxFLEksUiAoY2hhcnRJbmRleCAwLTMpCisJICogQHBhcmFtIGlkIAorCSAqIEBwYXJhbSBjaGFydEluZGV4IAorCSAqIEBwYXJhbSBzdGF0ZQorCSAqIEByZXR1cm4gdGhlIGRhdGEgdG8gcGxvdAorCSAqLworCXB1YmxpYyBkb3VibGVbXSBnZXREYXRhVmFsdWVzKFN0cmluZyBpZCwgaW50IGNoYXJ0SW5kZXgsIGludCBzdGF0ZSkgeworCQlMaXN0PGRvdWJsZVtdW10+IGRhdGFMaXN0ID0gc2VsZWN0ZWREYXRhLmdldChpZCk7CisJCWRvdWJsZVtdW10gZGF0YSA9IGRhdGFMaXN0LmdldChjaGFydEluZGV4KTsKKwkJLy8gcGljayB0aGUgcmlnaHQgZGF0YSBmb3IgdGhlIHJpZ2h0IGNoYXJ0CisJCXJldHVybiBkYXRhW3N0YXRlXTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZWdyZXNzaW9uIGRhdGEgKHggPSBzdGF0ZSAwLCB5ID0gc3RhdGUgMSkgCisJICogZm9yIGVhY2ggb2YgdGhlIHN0YXRlIGVxdWF0aW9ucyAoY2hhcnRJbmRleCAwLTMpCisJICogQHBhcmFtIGlkIAorCSAqIEBwYXJhbSBjaGFydEluZGV4IAorCSAqIEBwYXJhbSBzdGF0ZQorCSAqIEByZXR1cm4gdGhlIGRhdGEgdG8gcGxvdAorCSAqLworCXB1YmxpYyBkb3VibGVbXSBnZXRSZWdyZXNzaW9uVmFsdWVzKFN0cmluZyBpZCwgaW50IGNoYXJ0SW5kZXgsIGludCBzdGF0ZSkgeworCQlMaXN0PGRvdWJsZVtdW10+IGRhdGFMaXN0ID0gcmVncmVzc2lvbkRhdGEuZ2V0KGlkKTsKKwkJZG91YmxlW11bXSBkYXRhID0gZGF0YUxpc3QuZ2V0KGNoYXJ0SW5kZXgpOworCQkvLyBwaWNrIHRoZSByaWdodCBkYXRhIGZvciB0aGUgcmlnaHQgY2hhcnQKKwkJcmV0dXJuIGRhdGFbc3RhdGVdOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpdHRlZCBkYXRhICh4ID0gc3RhdGUgMCwgeSA9IHN0YXRlIDEpIAorCSAqIGZvciBlYWNoIG9mIHRoZSBzdGF0ZSBlcXVhdGlvbnMgKGNoYXJ0SW5kZXggMC0zKQorCSAqIEBwYXJhbSBpZCAKKwkgKiBAcGFyYW0gY2hhcnRJbmRleCAKKwkgKiBAcGFyYW0gc3RhdGUKKwkgKiBAcmV0dXJuIHRoZSBkYXRhIHRvIHBsb3QKKwkgKi8KKwlwdWJsaWMgZG91YmxlW10gZ2V0Rml0dGVkVmFsdWVzKFN0cmluZyBpZCwgaW50IGNoYXJ0SW5kZXgsIGludCBzdGF0ZSkgeworCQlMaXN0PGRvdWJsZVtdW10+IGRhdGFMaXN0ID0gZml0dGVkRGF0YS5nZXQoaWQpOworCQlkb3VibGVbXVtdIGRhdGEgPSBkYXRhTGlzdC5nZXQoY2hhcnRJbmRleCk7CisJCS8vIHBpY2sgdGhlIHJpZ2h0IGRhdGEgZm9yIHRoZSByaWdodCBjaGFydAorCQlyZXR1cm4gZGF0YVtzdGF0ZV07CisJfQorCisJLyoqCisJICogdmFsaWRhdGUgdGhlIGtleQorCSAqIEBwYXJhbSBpZAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB2YWxpZAorCSAqLworCXB1YmxpYyBib29sZWFuIHZhbGlkRGF0YUlEKFN0cmluZyBpZCkgeworCQlib29sZWFuIHJldFZhbCA9IGZhbHNlOworCQlpZiAoKGlkICE9IG51bGwpJiYoc2VsZWN0ZWREYXRhLmNvbnRhaW5zS2V5KGlkKSkpIHJldFZhbCA9IHRydWU7CisJCXJldHVybiByZXRWYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbG9jYXRpb24gSURzIGZvciB3aGljaCB3ZSBhbmFseXplZCBkYXRhIGFuZAorCSAqIHN0b3JlZCB0aGUgbGlzdHMgb2Ygc2VsZWN0ZWQgZGF0YQorCSAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIGtleXMKKwkgKi8KKwlwdWJsaWMgU3RyaW5nW10gZ2V0RGF0YUxvY2F0aW9ucygpIHsKKwkJU2V0PFN0cmluZz4ga2V5cyA9IHNlbGVjdGVkRGF0YS5rZXlTZXQoKTsKKwkJLy8gcGljayB0aGUgcmlnaHQgZGF0YSBmb3IgdGhlIHJpZ2h0IGNoYXJ0CisJCVN0cmluZ1tdIGlkcyA9IG5ldyBTdHJpbmdba2V5cy5zaXplKCldOworCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBrZXlzLml0ZXJhdG9yKCk7CisJCWludCBpID0gMDsKKwkJd2hpbGUoaXRlciE9bnVsbCYmaXRlci5oYXNOZXh0KCkpIHsKKwkJCWlkc1tpXSA9IGl0ZXIubmV4dCgpOworCQkJaSsrOworCQl9CisJCUFycmF5cy5zb3J0KGlkcyk7CisJCXJldHVybiBpZHM7CisJfQorCisKKworCS8qKgorCSAqIFJldHVybiB0aGUgcGFyYW1ldGVycworCSAqIEByZXR1cm4gTWFwPFN0cmluZywgUGFyYW1ldGVyPiBUaGUgcGFyYW1ldGVycworCSAqLworCisJcHVibGljIE1hcDxTdHJpbmcsIFBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpIHsKKwkJcmV0dXJuIHRoaXMucGFyYW1ldGVyczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyCisJICogQHBhcmFtIHAgVGhlIHBhcmFtZXRlciBuYW1lCisJICogQHJldHVybiBQYXJhbWV0ZXIgCisJICovCisKKwlwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgcCkgeworCQlyZXR1cm4gdGhpcy5wYXJhbWV0ZXJzLmdldChwKTsKKwl9CisJLyoqCisJICogY29udGFpbnNQYXJhbWV0ZXIgQ2hlY2sgaWYgdGhlIGdpdmVuIHBhcmFtZXRlciBpcyBpbiB0aGlzIG1vZGVsCisJICogCisJICogQHBhcmFtIHAgVGhlIHBhcmFtZXRlcgorCSAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHAgaXMgaW4gdGhlIG1vZGVsCisJICovCisKKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc1BhcmFtZXRlcihTdHJpbmcgcCkgeworCQlyZXR1cm4gdGhpcy5wYXJhbWV0ZXJzLmNvbnRhaW5zS2V5KHApOworCX0KKwkvKioKKwkgKiByZXR1cm4gdmFsdWVzIGFzIGEgc3RyaW5nCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisJCWZvcihQYXJhbWV0ZXIgcGFybTp0aGlzLnBhcmFtZXRlcnMudmFsdWVzKCkpIHsKKwkJCWJ1ZmZlci5hcHBlbmQocGFybS5uYW1lKS5hcHBlbmQoIj0iKS5hcHBlbmQocGFybS52YWx1ZSkuYXBwZW5kKCJcbiIpOworCQkJYnVmZmVyLmFwcGVuZCgiZGV2aWF0aW9uKCIpLmFwcGVuZChwYXJtLm5hbWUpLmFwcGVuZCgiKSIpLmFwcGVuZCgiPSIpLmFwcGVuZChwYXJtLnN0ZGRldikuYXBwZW5kKCJcbiIpOworCQkJYnVmZmVyLmFwcGVuZCgidmFyaWFuY2UoIikuYXBwZW5kKHBhcm0ubmFtZSkuYXBwZW5kKCIpIikuYXBwZW5kKCI9IikuYXBwZW5kKHBhcm0udmFyaWFuY2UpLmFwcGVuZCgiXG4iKTsJCisJCX0JCQorCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJfSAKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvTW9uaXRvclByZWZlcmVuY2VzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9Nb25pdG9yUHJlZmVyZW5jZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTVkZGEwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvTW9uaXRvclByZWZlcmVuY2VzLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBNb25pdG9yUHJlZmVyZW5jZXMgeworCisJUGx1Z2luIHBsdWdpbiA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCk7CisKKwkvKioKKwkgKiB0aGUgdXNlcnMgcHJlZmVyZW5jZXMKKwkgKi8KKwlQcmVmZXJlbmNlcyBwcmVmcyA9IHBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCisJLyoqCisJICogdGhlIElEIG9mIHRoZSBkZWZhdWx0IGxvY2F0aW9uIHRoZSBsb2NhdGlvbiBJRCBmb3IgdGhlIGFnZ3JlZ2F0ZWQgZGF0YSBhdAorCSAqIHRoZSB3b3JsZCBsZXZlbAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BSRUZFUkVOQ0UgPSAiUFJFVklPVVNfRk9MREVSIjsKKwkKKwkvKioKKwkgKiB0aGUgSUQgb2YgdGhlIGVzdGltYXRvciBtZXRob2QKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNUSU1BVE9SX1BSRUZFUkVOQ0UgPSAiRVNUSU1BVE9SX01FVEhPRCI7CisKKwkKKwkvKioKKwkgKiB0aGUgZGVmYXVsdCBmb2xkZXIgbG9jYXRpb24KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QUkVGX1ZBTFVFID0gIiI7CisgICAgCisJU3RyaW5nIHJlY2VudEZvbGRlciA9IG51bGw7CisJCisJU3RyaW5nIHJlY2VudEVzdGltYXRpb25NZXRob2QgPSBudWxsOworCQorCisJLyoqCisJICogCisJICovCisJcHVibGljIE1vbml0b3JQcmVmZXJlbmNlcygpIHsKKwkJaWYgKHByZWZzLmNvbnRhaW5zKERFRkFVTFRfUFJFRkVSRU5DRSkpIHsKKwkJCXJlY2VudEZvbGRlciA9IHByZWZzLmdldFN0cmluZyhERUZBVUxUX1BSRUZFUkVOQ0UpOworCQl9ICBlbHNlIHsKKwkJCS8vIGZpcnN0IHRpbWUgb25seQorCQkJcmVjZW50Rm9sZGVyID0gREVGQVVMVF9QUkVGX1ZBTFVFOworCQkJc2V0UHJlZmVyZW5jZXMoKTsKKwkJfQorCQkKKwkJaWYgKHByZWZzLmNvbnRhaW5zKEVTVElNQVRPUl9QUkVGRVJFTkNFKSkgeworCQkJcmVjZW50RXN0aW1hdGlvbk1ldGhvZCA9IHByZWZzLmdldFN0cmluZyhFU1RJTUFUT1JfUFJFRkVSRU5DRSk7CisJCX0gIGVsc2UgeworCQkJcmVjZW50RXN0aW1hdGlvbk1ldGhvZCA9IG51bGw7CisJCQlzZXRQcmVmZXJlbmNlcygpOworCQl9CisJfSAvLyBjb25zdHJ1Y3RvcgorCisJLyoqCisJICogIHNldCB0aGUgcHJlZmVyZW5jZXMKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlcygpIHsKKwkJcHJlZnMuc2V0VmFsdWUoREVGQVVMVF9QUkVGRVJFTkNFLCByZWNlbnRGb2xkZXIpOworCQlpZihyZWNlbnRFc3RpbWF0aW9uTWV0aG9kICE9IG51bGwpIHByZWZzLnNldFZhbHVlKEVTVElNQVRPUl9QUkVGRVJFTkNFLCByZWNlbnRFc3RpbWF0aW9uTWV0aG9kKTsKKwkJcGx1Z2luLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOworCX0KKwkKKwkKKworCQorCisJLyoqCisJICogIHNldCB0aGUgcHJlZmVyZW5jZXMgYmFzZWQgb24gdXNlciBhY3Rpb24KKwkgKiBAcGFyYW0gY29uc3VtZXIgc3BlY2lmaWMgY2xhc3MgdGhhdCBzZXRzIG9yIGdldHMgdGhpcyBmb2xkZXIgcHJlZmVyZW5jZQorCSAqIEBwYXJhbSByZWNlbnQgCisJICovCisJcHVibGljIHZvaWQgc2V0UmVjZW50Rm9sZGVyKFN0cmluZyBjb25zdW1lciwgU3RyaW5nIHJlY2VudCkgeworCQlyZWNlbnRGb2xkZXI9cmVjZW50OworCQlwcmVmcy5zZXRWYWx1ZShjb25zdW1lcisiXyIrREVGQVVMVF9QUkVGRVJFTkNFLCByZWNlbnRGb2xkZXIpOworCQlwbHVnaW4uc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7CisJfQorCisJLyoqCisJICogIHNldCB0aGUgcHJlZmVyZW5jZXMgYmFzZWQgb24gdXNlciBhY3Rpb24KKwkgKiBAcGFyYW0gbWV0aG9kIAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVzdGltYXRvck1ldGhvZChTdHJpbmcgbWV0aG9kKSB7CisJCXJlY2VudEVzdGltYXRpb25NZXRob2Q9bWV0aG9kOworCQlwcmVmcy5zZXRWYWx1ZShFU1RJTUFUT1JfUFJFRkVSRU5DRSwgcmVjZW50RXN0aW1hdGlvbk1ldGhvZCk7CisJCXBsdWdpbi5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKKwl9CisJCisJCisJCisJLyoqCisJICogCisJICogQHBhcmFtIGNvbnN1bWVyIAorCSAqIEByZXR1cm4gcmVjZW50bHkgdXNlZCBmb2xkZXIKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJlY2VudEZvbGRlcihTdHJpbmcgY29uc3VtZXIpIHsKKwkJcmVjZW50Rm9sZGVyID0gcHJlZnMuZ2V0U3RyaW5nKGNvbnN1bWVyKyJfIitERUZBVUxUX1BSRUZFUkVOQ0UpOworCQlpZigocmVjZW50Rm9sZGVyPT1udWxsKXx8KHJlY2VudEZvbGRlci5sZW5ndGgoKT09MCkpIHsKKwkJCXJlY2VudEZvbGRlciA9IERFRkFVTFRfUFJFRl9WQUxVRTsKKwkJCXNldFJlY2VudEZvbGRlcihjb25zdW1lciwgcmVjZW50Rm9sZGVyKTsKKwkJCX0KKwkJcmV0dXJuIHJlY2VudEZvbGRlcjsKKwl9CisJCisJCisJCisJCisJLyoqCisJICogCisJICogQHJldHVybiByZWNlbnRseSB1c2VkIGVzdGltYXRpb24gbWV0aG9kCisJICovCisJcHVibGljIFN0cmluZyBnZXRSZWNlbnRFc3RpbWF0b3JNZXRob2QoKSB7CisJCXJldHVybiByZWNlbnRFc3RpbWF0aW9uTWV0aG9kOworCX0KK30vLyBjbGFzcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvTm9uTGluZWFyU0VJUlBhcmFtZXRlckVzdGltYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvTm9uTGluZWFyU0VJUlBhcmFtZXRlckVzdGltYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OTdkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9Ob25MaW5lYXJTRUlSUGFyYW1ldGVyRXN0aW1hdG9yLmphdmEKQEAgLTAsMCArMSwyNDkgQEAKKworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuU3RhdGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlOworCisvKioKKyAqIEVzdGltYXRlIHBhcmFtZXRlcnMgZm9yIGFuIFNJLCBTSVIgb3IgU0VJUiBtb2RlbAorICogCisgKgorICovCitwdWJsaWMgY2xhc3MgTm9uTGluZWFyU0VJUlBhcmFtZXRlckVzdGltYXRvciBleHRlbmRzIFNFSVJwYXJhbWV0ZXJFc3RpbWF0b3IgeworCisJLy8gVW5pcXVlIHN0YXRlcyBmb3IgdGhpcyBlc3RpbWF0b3IKKwlkb3VibGUgW10gZTsKKwlkb3VibGUgW10gcjsKKwkKKwkvKioKKwkgKiBAcGFyYW0gZGF0YQorCSAqLworCXB1YmxpYyBOb25MaW5lYXJTRUlSUGFyYW1ldGVyRXN0aW1hdG9yKFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGRhdGEpIHsKKwkJc3VwZXIoZGF0YSk7CisJCUxpc3Q8RG91YmxlPiBzVG9GaXQgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJTGlzdDxEb3VibGU+IGVUb0ZpdCA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQlMaXN0PERvdWJsZT4gaVRvRml0ID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCUxpc3Q8RG91YmxlPiByVG9GaXQgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCisJCUxpc3Q8RG91YmxlPiBpTGlzdCA9IGRhdGEuZ2V0RGF0YSgpLmdldChTdGF0ZXMuc3RhdGVzVG9GaXRbU3RhdGVzLklORkVDVElPVVNdKTsKKwkJTGlzdDxEb3VibGU+IHNMaXN0ID0gZGF0YS5nZXREYXRhKCkuZ2V0KFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuU1VTQ0VQVElCTEVdKTsKKwkJTGlzdDxEb3VibGU+IHJMaXN0ID0gZGF0YS5nZXREYXRhKCkuZ2V0KFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuUkVDT1ZFUkVEXSk7CisJCUxpc3Q8RG91YmxlPiBlTGlzdCA9IGRhdGEuZ2V0RGF0YSgpLmdldChTdGF0ZXMuc3RhdGVzVG9GaXRbU3RhdGVzLkVYUE9TRURdKTsKKwkJCisJCS8vIFRvRG86IFdoeSBhcmUgd2Ugc2tpcHBpbmcgdGhlIGZpcnN0IHZhbHVlPworCQlmb3IgKGludCBpY291bnQgPSAxOyBpY291bnQgPCBpTGlzdC5zaXplKCk7IGljb3VudCArKykgeworCQkJCWlUb0ZpdC5hZGQoaUxpc3QuZ2V0KGljb3VudCkpOworCQkJCWVUb0ZpdC5hZGQoZUxpc3QuZ2V0KGljb3VudCkpOworCQkJCXNUb0ZpdC5hZGQoc0xpc3QuZ2V0KGljb3VudCkpOworCQkJCXJUb0ZpdC5hZGQockxpc3QuZ2V0KGljb3VudCkpOworCQl9CisJCQorCQl0aGlzLm51bURhdGFQb2ludHMgPSBpVG9GaXQuc2l6ZSgpOworCQlpZihudW1EYXRhUG9pbnRzIDwgTUlOU0laRSkgcmV0dXJuOworCQlkYXRhVmFsaWQgPSB0cnVlOworCQl0aGlzLnMgPSBuZXcgZG91YmxlW3RoaXMubnVtRGF0YVBvaW50c107CisJCXRoaXMuZSA9IG5ldyBkb3VibGVbdGhpcy5udW1EYXRhUG9pbnRzXTsKKwkJdGhpcy5pID0gbmV3IGRvdWJsZVt0aGlzLm51bURhdGFQb2ludHNdOworCQl0aGlzLnIgPSBuZXcgZG91YmxlW3RoaXMubnVtRGF0YVBvaW50c107CisJCXRoaXMudCA9IG5ldyBkb3VibGVbdGhpcy5udW1EYXRhUG9pbnRzXTsKKwkJaW50IG5wdHMgPSB0aGlzLm51bURhdGFQb2ludHM7CisJCWRvdWJsZVtdW10gZGF0YVMgPSBuZXcgZG91YmxlWzJdW25wdHMgLSAxXTsKKwkJZG91YmxlW11bXSBkYXRhRSA9IG5ldyBkb3VibGVbMl1bbnB0cyAtIDFdOworCQlkb3VibGVbXVtdIGRhdGFJID0gbmV3IGRvdWJsZVsyXVtucHRzIC0gMV07CisJCWRvdWJsZVtdW10gZGF0YVIgPSBuZXcgZG91YmxlWzJdW25wdHMgLSAxXTsKKwkJCisJCWZvciAoaW50IGljb3VudCA9IDA7IGljb3VudCA8IHRoaXMubnVtRGF0YVBvaW50czsgaWNvdW50ICsrKSB7CisJCQlzW2ljb3VudF0gPSBzVG9GaXQuZ2V0KGljb3VudCkuZG91YmxlVmFsdWUoKTsKKwkJCWVbaWNvdW50XSA9IGVUb0ZpdC5nZXQoaWNvdW50KS5kb3VibGVWYWx1ZSgpOworCQkJaVtpY291bnRdID0gaVRvRml0LmdldChpY291bnQpLmRvdWJsZVZhbHVlKCk7CisJCQlyW2ljb3VudF0gPSByVG9GaXQuZ2V0KGljb3VudCkuZG91YmxlVmFsdWUoKTsKKwkJCXRbaWNvdW50XSA9IGljb3VudDsKKworCQkJLy8gaW5pdCB0aGUgcmF3IGRhdGEgZm9yIHBsb3R0aW5nCisJCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJLy8gVE9ETyBuZWVkIHRvIGZpbGwgdGhlIHNlbGVjdGVkIGFycmF5IGluIHRoZSBjb2RlIGZvciB0aGlzIGNsYXNzICoqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQlpZihpY291bnQgPCB0aGlzLm51bURhdGFQb2ludHMtMSkgeworCQkJCWRhdGFTWzBdW2ljb3VudF0gPSAoc1tpY291bnRdK3NbaWNvdW50KzFdKS8yLjA7CisJCQkJZGF0YUVbMF1baWNvdW50XSA9IChlW2ljb3VudF0rZVtpY291bnQrMV0pLzIuMDsKKwkJCQlkYXRhSVswXVtpY291bnRdID0gKGlbaWNvdW50XStpW2ljb3VudCsxXSkvMi4wOworCQkJCWRhdGFSWzBdW2ljb3VudF0gPSAocltpY291bnRdK3JbaWNvdW50KzFdKS8yLjA7CisJCQkJZGF0YVNbMV1baWNvdW50XSA9IChzW2ljb3VudF0rc1tpY291bnQrMV0pLzIuMDsKKwkJCQlkYXRhRVsxXVtpY291bnRdID0gKGVbaWNvdW50XStlW2ljb3VudCsxXSkvMi4wOworCQkJCWRhdGFJWzFdW2ljb3VudF0gPSAoaVtpY291bnRdK2lbaWNvdW50KzFdKS8yLjA7CisJCQkJZGF0YVJbMV1baWNvdW50XSA9IChyW2ljb3VudF0rcltpY291bnQrMV0pLzIuMDsKKwkJCQkvLyBpbml0IHRoZSBzZWxlY3RlZCBkYXRhIGFycmF5CisJCQkJZm9yIChpbnQgY2hhcnRJbmRleCA9IDA7IGNoYXJ0SW5kZXggPCA0OyBjaGFydEluZGV4ICsrICkgeworCQkJCQkvLyBUSElTIElTIFdST05HCisJCQkJCWRhdGFTWzFdW2ljb3VudF0gPSAwLjA7CisJCQkJCWRhdGFFWzFdW2ljb3VudF0gPSAwLjA7CisJCQkJCWRhdGFJWzFdW2ljb3VudF0gPSAwLjA7CisJCQkJCWRhdGFSWzFdW2ljb3VudF0gPSAwLjA7CisJCQkJfS8vIGluaXQgc2VsZWN0ZWQKKwkJCX0vLyBpbml0IHRoZSBkYXRlCisKKwkJfS8vIGZvciBpY291bnQKKwl9Ly8gY29uc3RydWN0b3IKKworCS8qKgorCSAqIEVzdGltYXRlIHRoZSBwYXJhbWV0ZXJzCisJICogQHBhcmFtIGxvY2FsRGVuc2l0eSAKKwkgKiBAcGFyYW0gbG9jYWxQb3B1bGF0aW9uIAorCSAqIEBwYXJhbSBsb2NhdGlvbklEIAorCSAqIEByZXR1cm4gdGhlIE1vZGVsUGFyYW1ldGVycyBlc3RpbWF0ZQorCSAqLworCXB1YmxpYyBNb2RlbFBhcmFtZXRlcnMgZXN0aW1hdGUoZG91YmxlIGxvY2FsRGVuc2l0eSwgZG91YmxlIGxvY2FsUG9wdWxhdGlvbiwgU3RyaW5nIGxvY2F0aW9uSUQpIHsKKwkJCisJCU1vZGVsUGFyYW1ldGVycyBmaXR0ZWRQYXJtcyA9IG51bGw7CisJCWZpbmFsIGRvdWJsZSBDUklUSUNBTF9TVVNDRVBUSUJMRSA9IDAuMzsKKwkJCisJCWludCBucHRzID0gcy5sZW5ndGg7CisJCWFzc2VydChucHRzID09IGUubGVuZ3RoKTsKKwkJYXNzZXJ0KG5wdHM9PWkubGVuZ3RoKTsKKwkJYXNzZXJ0KG5wdHM9PXIubGVuZ3RoKTsKKwkJCisJCS8qCisJCSAqIEJlZ2luIFNFSVIgZml0dGluZyB0byBmaW5kIHBhcmFtZXRlcnMgaW5jbHVkaW5nIGJldGEgZnVuY3Rpb24KKwkJICovCisJCQorCQkvL2ZpcnN0IGZpbmQgYWxwaGEgYW5kIGVwc2lsb24KKwkJZG91YmxlW10gZFMgPSBuZXcgZG91YmxlW25wdHNdOworCQlkb3VibGVbXSBsbkUgPSBuZXcgZG91YmxlW25wdHNdOworCQlkb3VibGVbXSBkbG5FID0gbmV3IGRvdWJsZVtucHRzXTsKKwkJCisJCWZvcihpbnQgaiA9IDA7IGogPCBucHRzOyBqKyspeworCQkJbG5FW2pdID0gTWF0aC5sb2coZVtqXSk7CisJCX0KKwkJCisJCQorCQkvL2Rlcml2YXRpdmVzIG9mIGVuZHBvaW50cworCQlkU1swXSA9IHNbMV0gLSBzWzBdOworCQlkU1tucHRzLTFdID0gc1tucHRzLTFdIC0gc1tucHRzLTJdOworCQlkbG5FWzBdID0gbG5FWzFdIC0gbG5FWzBdOyAKKwkJZGxuRVtucHRzLTFdID0gbG5FW25wdHMtMV0gLSBsbkVbbnB0cy0yXTsKKworCQkvL2Rlcml2YXRpdmVzIG9mIGFsbCBvdGhlciBwb2ludHMKKwkJZm9yKGludCBqID0gMTtqIDwgbnB0cy0xO2orKykKKwkJeworCQkJZFNbal0gPSAoc1tqKzFdIC0gc1tqLTFdKS8yOworCQkJZGxuRVtqXSA9IChsbkVbaisxXSAtIGxuRVtqLTFdKS8yOworCQl9CisJCQorCQorCQkvL3ggYW5kIHkgZm9yIGxlYXN0IHNxdWFyZXMgZml0dGluZworCQlkb3VibGVbXSB4ID0gbmV3IGRvdWJsZVtucHRzXTsKKwkJZG91YmxlW10geSA9IG5ldyBkb3VibGVbbnB0c107CisJCQorCQlmb3IoaW50IGogPSAwOyBqIDwgbnB0czsgaisrKXsKKwkJCXhbal0gPSByW2pdL2Vbal07CisJCQl5W2pdID0gKDEvZVtqXSkqZFNbal0rZGxuRVtqXTsKKwkJfQorCQkKKwkJLy9zdW1zIGZvciBsZWFzdCBzcXVhcmVzIGZpdHRpbmcKKwkJZG91YmxlIHN1bXggID0gMDsKKwkJZG91YmxlIHN1bXkgPSAwOworCQlkb3VibGUgc3VteHkgPSAwOworCQlkb3VibGUgc3VteDIgPSAwOworCQlkb3VibGUgc3VteTIgPSAwOworCQlkb3VibGUgc3VtID0gMDsKKwkJCisJCWZvcihpbnQgaiA9IDA7IGogPCBucHRzOyBqKyspeworCQkJc3VteCArPSB4W2pdOworCQkJc3VteSArPSB5W2pdOworCQkJc3VteHkgKz0geFtqXSAqIHlbal07CisJCQlzdW14MiArPSB4W2pdICogeFtqXTsKKwkJCXN1bXkyICs9IHlbal0gKiB5W2pdOworCQkJc3VtICs9IDE7CisJCX0KKwkJCisJCS8vZGVsdGEgZm9yIENyYW1lcidzIFJ1bGUKKwkJZG91YmxlIGRlbHRhID0gLShzdW0qc3VteDIgLSBzdW14KnN1bXgpOworCQlkb3VibGUgYWxwaGEgPSAtKHN1bSpzdW14eSAtIHN1bXgqc3VteSkvZGVsdGE7CisJCWRvdWJsZSBlcHNpbG9uID0gKHN1bXgyKnN1bXkgLSBzdW14KnN1bXh5KS9kZWx0YTsKKwkJCisJCS8vdmFyaWFuY2UgYW5kIHN0ZAorCQlkb3VibGUgdmFyaWFuY2UgPSAoc3VteTIgKyBzdW0qZXBzaWxvbiplcHNpbG9uICsgYWxwaGEqYWxwaGEqc3VteDIKKwkJCQktMiooYWxwaGEqc3VteHkgLSBlcHNpbG9uKnN1bXkgKyBlcHNpbG9uKmFscGhhKnN1bXgpKS8obnB0cy0yKTsKKwkJCisJCWRvdWJsZSB2YXJBbHBoYSA9IC0odmFyaWFuY2UvZGVsdGEpKnN1bTsKKwkJZG91YmxlIHZhckVwc2lsb24gPSAtKHZhcmlhbmNlL2RlbHRhKSpzdW14MjsKKwkJCisJCWRvdWJsZSBzdGRBbHBoYSA9IE1hdGguc3FydCh2YXJBbHBoYSk7CisJCWRvdWJsZSBzdGRFcHNpbG9uID0gTWF0aC5zcXJ0KHZhckVwc2lsb24pOworCQkKKwkJLy9ub3cgZmluZCBiZXRhIGFuZCBsYW1iZGEKKwkJCisJCS8veCBhbmQgeSBmb3IgbGVhc3Qgc3F1YXJlcyBmaXR0aW5nCisJCQorCQkvLyBUT0RPIFF1ZXN0aW9uIGZvciBCYXJiYXJhIEpvbmUKKwkJLy8gUFJPQkxFTTogd2hhdCBkb2VzIGl0IG1lYW4gd2hlbiAKKwkJLy8gKGFscGhhKnIgLSBkUykgaXMgbmVnYXRpdmUgID8/CisJCS8vICB0aGlzIGdpdmVzIE5hTiBmb3IgbG9nCisJCWZvcihpbnQgaiA9IDA7IGogPCBucHRzOyBqKyspeworCQkJeFtqXSA9IE1hdGgubG9nKCgoc1tqXStlW2pdK2lbal0pLUNSSVRJQ0FMX1NVU0NFUFRJQkxFKS8oMS1DUklUSUNBTF9TVVNDRVBUSUJMRSkpOworCQkJeVtqXSA9IE1hdGgubG9nKChhbHBoYSpyW2pdIC0gZFNbal0pLyhzW2pdKmlbal0pKTsKKwkJfQorCQkKKwkJLy9zdW1zIGZvciBsZWFzdCBzcXVhcmVzIGZpdHRpbmcsIHNldCBiYWNrIHRvIHplcm8KKwkgICAgc3VteCAgPSAwOworCSAgICBzdW15ID0gMDsKKwkJc3VteHkgPSAwOworCQlzdW14MiA9IDA7CisJCXN1bXkyID0gMDsKKwkJc3VtID0gMDsKKwkJCisJCWZvcihpbnQgaiA9IDA7IGogPCBucHRzOyBqKyspeworCQkJc3VteCArPSB4W2pdOworCQkJc3VteSArPSB5W2pdOworCQkJc3VteHkgKz0geFtqXSAqIHlbal07CisJCQlzdW14MiArPSB4W2pdICogeFtqXTsKKwkJCXN1bXkyICs9IHlbal0gKiB5W2pdOworCQkJc3VtICs9IDE7CisJCX0KKwkJCisJCWRlbHRhID0gc3VtKnN1bXgyIC0gc3VteCpzdW14OworCQlkb3VibGUgbG5CZXRhID0gKHN1bXkqc3VteDIgLSBzdW14KnN1bXh5KS9kZWx0YTsKKwkJZG91YmxlIGxhbWJkYSA9IChzdW0qc3VteHkgLSBzdW14KnN1bXkpL2RlbHRhOworCQkKKwkJZG91YmxlIGJldGEgPSBNYXRoLmV4cChsbkJldGEpOworCQkKKwkJLy92YXJpYW5jZSBhbmQgc3RkCisJCXZhcmlhbmNlID0gKHN1bXkyICsgbG5CZXRhKmxuQmV0YSpzdW0gKyBsYW1iZGEqbGFtYmRhKnN1bXgyCisJCQkJLTIqKGxuQmV0YSpzdW15ICsgbGFtYmRhKnN1bXh5ICsgbG5CZXRhKmxhbWJkYSpzdW14KSkvKG5wdHMtMik7CisJCQorCQlkb3VibGUgdmFyTG5CZXRhID0gKHZhcmlhbmNlL2RlbHRhKSpzdW14MjsKKwkJZG91YmxlIHZhckxhbWJkYSA9ICh2YXJpYW5jZS9kZWx0YSkqc3VtOworCQkKKwkJZG91YmxlIHN0ZExuQmV0YSA9IE1hdGguc3FydCh2YXJMbkJldGEpOworCQlkb3VibGUgc3RkTGFtYmRhID0gTWF0aC5zcXJ0KHZhckxhbWJkYSk7CisJCQorCQkvL1RPRE8gSG93IHRvIGZpbmQgc3RkIGFuZCB2YXJpYW5jZSBvZiBCZXRhIHJhdGhlciB0aGFuIGxuQmV0YQorCQkKKwkJZml0dGVkUGFybXMgPSBuZXcgTW9kZWxQYXJhbWV0ZXJzKCk7CisJCWRvdWJsZSBuZXdiZXRhID0gYmV0YTsKKwkJaWYoIXVzZUZyZXFEZXBlbmRhbnRCZXRhKSBuZXdiZXRhICo9ICgoTW9kZWxQYXJhbWV0ZXJzLlJFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFkpL2xvY2FsRGVuc2l0eSk7CisJCWZpdHRlZFBhcm1zLmFkZFBhcmFtZXRlcihQYXJhbWV0ZXIuQkVUQSwgbmV3IFBhcmFtZXRlcihQYXJhbWV0ZXIuQkVUQSwgbmV3YmV0YSkpOworCQlmaXR0ZWRQYXJtcy5hZGRQYXJhbWV0ZXIoUGFyYW1ldGVyLkxOQkVUQSwgbmV3IFBhcmFtZXRlcihQYXJhbWV0ZXIuTE5CRVRBLCBsbkJldGEsIHN0ZExuQmV0YSwgdmFyTG5CZXRhKSk7CisJCWZpdHRlZFBhcm1zLmFkZFBhcmFtZXRlcihQYXJhbWV0ZXIuQUxQSEEsIG5ldyBQYXJhbWV0ZXIoUGFyYW1ldGVyLkFMUEhBLCBhbHBoYSwgc3RkQWxwaGEsIHZhckFscGhhKSk7CisJCWZpdHRlZFBhcm1zLmFkZFBhcmFtZXRlcihQYXJhbWV0ZXIuRVBTSUxPTiwgbmV3IFBhcmFtZXRlcihQYXJhbWV0ZXIuRVBTSUxPTiwgZXBzaWxvbiwgc3RkRXBzaWxvbiwgdmFyRXBzaWxvbikpOworCQlmaXR0ZWRQYXJtcy5hZGRQYXJhbWV0ZXIoUGFyYW1ldGVyLkxBTUJEQSwgbmV3IFBhcmFtZXRlcihQYXJhbWV0ZXIuTEFNQkRBLCBsYW1iZGEsIHN0ZExhbWJkYSwgdmFyTGFtYmRhKSk7CisJICAgICAgIAorCQlyZXR1cm4gZml0dGVkUGFybXM7CisJfSAvLyBlc3RpbWF0ZQorCQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvUGFyYW1ldGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9QYXJhbWV0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTY1OWJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvUGFyYW1ldGVyLmphdmEKQEAgLTAsMCArMSwxNzcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBBIGZpdHRlZCBwYXJhbWV0ZXIKKyAqLworcHVibGljIGNsYXNzIFBhcmFtZXRlciB7CisJCisJLyoKKwkgKiBUaGVzZSBhcmUgY29tbW9uIHBhcmFtZXRlcnMgdXNlZCBmb3IgZXN0aW1hdGlvbi4KKwkgKiBPYnNlcnZlIHRoYXQgbm90IGFsbCBwYXJhbWV0ZXJzIGFyZSB1c2VkIGluIGEgZ2l2ZW4KKwkgKiBzY2VuYXJpbworCSAqLworCQorCS8qKgorCSAqIGJldGEgaXMgdGhlIGRpc2Vhc2UgdHJhbnNtaXNzaW9uIHJhdGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUpFQ1QgPSAicmVqZWN0ZWQiOworCQorCS8qKgorCSAqIGJldGEgaXMgdGhlIGRpc2Vhc2UgdHJhbnNtaXNzaW9uIHJhdGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRVRBID0gImJldGEiOworCQorCS8qKgorCSAqIGJldGEyIGlzIHRoZSBzZWNvbmQgZml0dGVkIGRpc2Vhc2UgdHJhbnNtaXNzaW9uIHJhdGUgaW4gbWV0aG9kIHR3bworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFVEEyID0gImJldGEyIjsKKwkKKwkvKioKKwkgKiBsbkJldGEgZm9yIG5vbmxpbmVhciBmaXQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMTkJFVEEgPSAibG5iZXRhIjsKKwkKKwkvKioKKwkgKiBhbHBoYSBpcyB0aGUgaW1tdW5pdHkgbG9zcyByYXRlCisJICovCisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxQSEEgPSAiYWxwaGEiOworCQorCS8qKgorCSAqIGFscGhhMiBpcyB0aGUgc2Vjb25kIGZpdHRlZCBpbW11bml0eSBsb3NzIHJhdGUgaW4gbWV0aG9kIHR3bworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMUEhBMiA9ICJhbHBoYTIiOworCisJLyoqCisJICogZXBzaWxvbiBpcyB0aGUgaW5jdWJhdGlvbiByYXRlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVBTSUxPTiA9ICJlcHNpbG9uIjsKKworCS8qKgorCSAqIGVwc2lsb24yIGlzIHRoZSBzZWNvbmQgZml0dGVkIGluY3ViYXRpb24gcmF0ZSBmb3VuZCBpbiBtZXRob2QgdHdvCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVBTSUxPTjIgPSAiZXBzaWxvbjIiOworCQkKKwkvKioKKwkgKmdhbW1hIGlzIHRoZSBpbmZlY3Rpb3VzIHJlY292ZXJ5IHJhdGUgCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0FNTUEgPSAiZ2FtbWEiOworCQorCS8qKgorCSAqIGdhbW1hMiBpcyB0aGUgc2Vjb25kIGZpdHRlZCBpbmZlY3Rpb3VzIHJlY292ZXJ5IHJhdGUgaW4gbWV0aG9kIHR3bworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdBTU1BMiA9ICJnYW1tYTIiOworCQorCS8qKgorCSAqIGxhbWJkYSBpcyB0aGUgaW5mZWN0aW91cyByZWNvdmVyeSByYXRlIAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBTUJEQSA9ICJsYW1iZGEiOworCQorCS8qKgorCSAqIFJkUgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJkUiA9ICJSZFIiOworCQorCS8qKgorCSAqIFJkUworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJkUyA9ICJSZFMiOworCQorCS8qKgorCSAqIFJkSQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJkSSA9ICJSZEkiOworCQorCS8qKgorCSAqIEJFVEFWQVIKKwkgKi8KKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRVRBVkFSID0gIkJFVEFWQVIiOworCQorCS8qKgorCSAqIEdBTU1BVkFSCisJICovCisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0FNTUFWQVIgPSAiR0FNTUFWQVIiOworCQorCQorCS8qKiBFTkQgUEFSQU1FVEVSIERFQ0xBUkFUSU9OICovCisJCisJLyoqCisJICogUGFyYW1ldGVyIG5hbWUgKGZvciBtYXAga2V5cyBldGMuKQorCSAqLworCXB1YmxpYyBTdHJpbmcgbmFtZTsKKwkvKioKKwkgKiBUaGUgcGFyYW1ldGVyIHZhbHVlCisJICovCisJcHVibGljIGRvdWJsZSB2YWx1ZSA9IDAuMDsKKwkvKioKKwkgKiBUaGUgcGFyYW1ldGVyIHN0YW5kYXJkIGRldmlhdGlvbgorCSAqLworCXB1YmxpYyBkb3VibGUgc3RkZGV2ID0gMS4wOworCS8qKgorCSAqIFRoZSBwYXJhbWV0ZXIgdmFyaWFuY2UKKwkgKi8KKwlwdWJsaWMgZG91YmxlIHZhcmlhbmNlPSAxLjA7CisJCisJLyoqCisJICogUHJpdmF0ZSBudWxsIGNvbnN0cnVjdG9yIChmb3JjZSBhIG5hbWUpCisJICogCisJICovCisJCisJcHJpdmF0ZSBQYXJhbWV0ZXIoKSB7CisJCS8vIE5vdGhpbmcgaGVyZQorCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciAxCisJICogCisJICogQHBhcmFtIG5hbWUgU3RyaW5nCisJICovCisJCisJcHVibGljIFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworCQl0aGlzKCk7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdG9yIDIKKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKKwkgKiBAcGFyYW0gdmFsdWUgU2V0IHZhbHVlCisJICogQHBhcmFtIGRldiBTZXQgc3RhbmRhcmQgZGV2aWF0aW9uCisJICogQHBhcmFtIHZhciBTZXQgdmFyaWF0aW9uCisJICovCisJCisJcHVibGljIFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlLCBkb3VibGUgZGV2LCBkb3VibGUgdmFyKSB7CisJCXRoaXMoKTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5zdGRkZXYgPSBkZXY7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy52YXJpYW5jZSA9IHZhcjsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0b3IgMyBTZXQgb25seSB2YWx1ZQorCSAqIAorCSAqIEBwYXJhbSBuYW1lIFN0cmluZworCSAqIEBwYXJhbSB2YWx1ZSBTZXQgdmFsdWUKKwkgKi8KKwkKKwlwdWJsaWMgUGFyYW1ldGVyKFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpIHsKKwkJdGhpcygpOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvUGFyYW1ldGVyRXN0aW1hdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9QYXJhbWV0ZXJFc3RpbWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzNkMWZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvUGFyYW1ldGVyRXN0aW1hdG9yLmphdmEKQEAgLTAsMCArMSwyNzMgQEAKKworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5Fc3RpbWF0b3JDb250cm9sOworCisvKioKKyAqIEVzdGltYXRlIHBhcmFtZXRlcnMgZm9yIGFuIFNJLCBTSVIgb3IgU0VJUiBtb2RlbAorICogCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIFBhcmFtZXRlckVzdGltYXRvciB7CisJCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcga2V5UyA9ICJTIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBrZXlFID0gIkUiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGtleUkgPSAiSSI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcga2V5UiA9ICJSIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBrZXlTZWxlY3RlZFMgPSAiUyoiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGtleVNlbGVjdGVkRSA9ICJFKiI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcga2V5U2VsZWN0ZWRJID0gIkkqIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBrZXlTZWxlY3RlZFIgPSAiUioiOworCQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGtleVhZMSA9ICJYMXZzWTEiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGtleVhZMiA9ICJYMnZzWTIiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGtleVhZMyA9ICJYM3ZzWTMiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGtleVhZNCA9ICJYNHZzWTQiOworCQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGtleUZpdDEgPSAiRml0IFhZMSI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcga2V5Rml0MiA9ICJGaXQgWFkyIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBrZXlGaXQzID0gIkZpdCBYWTMiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGtleUZpdDQgPSAiRml0IFhZNCI7CisJCisJCisJcHJvdGVjdGVkIHN0YXRpYyBkb3VibGUgbWluU3RocmVzaG9sZCA9IDAuMDE7CisJcHJvdGVjdGVkIHN0YXRpYyBkb3VibGUgbWluRXRocmVzaG9sZCA9IDAuMDE7CisJcHJvdGVjdGVkIHN0YXRpYyBkb3VibGUgbWluSXRocmVzaG9sZCA9IDAuMDE7CisJcHJvdGVjdGVkIHN0YXRpYyBkb3VibGUgbWluUnRocmVzaG9sZCA9IDAuMDE7CisJCisJcHJvdGVjdGVkIHN0YXRpYyBkb3VibGUgbWF4U3RocmVzaG9sZCA9IDAuOTk7CisJcHJvdGVjdGVkIHN0YXRpYyBkb3VibGUgbWF4RXRocmVzaG9sZCA9IDAuOTk7CisJcHJvdGVjdGVkIHN0YXRpYyBkb3VibGUgbWF4SXRocmVzaG9sZCA9IDAuOTk7CisJcHJvdGVjdGVkIHN0YXRpYyBkb3VibGUgbWF4UnRocmVzaG9sZCA9IDAuOTk7CisJCisJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHVzZUZyZXFEZXBlbmRhbnRCZXRhID0gdHJ1ZTsKKwkKKworCS8qKgorCSAqIHJlamVjdGVkIGRhdGEgd2hlcmUgZml0IGZhaWxlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgcmVqZWN0Q291bnQgPSAwLjA7CisJCisJLyoKKwkgKiB0aGUgU0VMRUNURUQgZGF0YSB0byBwbG90CisJICovCisJTGlzdDxkb3VibGVbXVtdPiAgZGF0YVRvUGxvdCA9IG5ldyBBcnJheUxpc3Q8ZG91YmxlW11bXT4oKTsKKwkKKwkKKwlMaXN0PGRvdWJsZVtdW10+IHJlZ3Jlc3Npb25WYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PGRvdWJsZVtdW10+KCk7CisJCisKKwlMaXN0PGRvdWJsZVtdW10+IGZpdHRlZFZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8ZG91YmxlW11bXT4oKTsKKwkKKwkKKwlwcm90ZWN0ZWQgUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UgZGF0YTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBwb2ludHMgbmVlZGVkIHRvIGRvIGEgcmVhc29uYWJsZSBmaXQKKwkgKiBUT0RPIHNob3VsZCBub3QgYmUgaGFyZCBjb2RlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1JTlNJWkUgPSA3OworCQorCS8qKgorCSAqIElmIGRlcml2YXRpdmVNZXRob2QgPSBMSU5FQVJfREVSSVZBVElWRSAgdGhlbiBhIGxpbmVhciBhbGdvcml0aG0KKwkgKiBpcyB1c2VkIHRvIGNvbXB1dGUgZGVyaXZhdGl2ZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSU5FQVJfREVSSVZBVElWRSA9IDE7CisJCisJCisJLyoqCisJICogSWYgZGVyaXZhdGl2ZU1ldGhvZCA9IFBPTFlOT01JQUxfREVSSVZBVElWRSAgdGhlbiBhIHBvbHlub21pYWwgYWxnb3JpdGhtCisJICogaXMgdXNlZCB0byBjb21wdXRlIGRlcml2YXRpdmVzCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9MWU5PTUlBTF9ERVJJVkFUSVZFID0gMjsKKwkKKwkvLyBBbGwgbW9kZWxzIGhhdmUgdGhlc2UgdmVjdG9ycworCWRvdWJsZVtdIHA7CisJZG91YmxlW10gczsKKwlkb3VibGVbXSBpOworCWRvdWJsZVtdIHQ7CisJCQorCS8qKgorCSAqIHNldCB0byB0cnVlIG9ubHkgaWYgdGhlcmUgYXJlIGVub3VnaCBwb2ludHMgdG8gZG8gYSByZWFzb25hYmxlIGZpdAorCSAqLworCXB1YmxpYyBib29sZWFuIGRhdGFWYWxpZCA9IGZhbHNlOworCQorCWludCBudW1EYXRhUG9pbnRzOworCQorCisJLyoqCisJICogY29uc3RydWN0IGEgbmV3IGVzdGltYXRvciBmb3IgdGhlIGlucHV0IGRhdGFbXSBTSVIKKwkgKiBAcGFyYW0gZGF0YQorCSAqLworCXB1YmxpYyBQYXJhbWV0ZXJFc3RpbWF0b3IoUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UgZGF0YSkgeworCQl0aGlzLmRhdGEgPSBkYXRhOworCQkvLyBBbHdheXMgUHJlcGFyZSB0aGUgZGF0YSBmb3IgYW5hbHlzaXMKKwkJdGhpcy5kYXRhLmZpbmRNYXhWYWx1ZXMoKTsKKwl9CisJCisJLyoqCisJICogVGhlIGNvbnRyb2wgbmVlZHMgdGhpcyBpbmZvcm1hdGlvbiBidXQgbXVzdCBnZXQgaXQgdGhyb3VnaCB0aGUgYW5hbHl6ZXIgZnJvbSB0aGUgRXN0aW1hdG9yCisJICogY3JlYXRlZCBieSB0aGUgZmFjdG9yeQorCSAqIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50aWFsIGVxdWF0aW9ucyBpbiB0aGUgc29sdXRpb24KKwkgKiBAcmV0dXJuIG51bWJlciBvZiBlcXVhdGlvbnMgZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGdyYXBocworCSAqLworCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TnVtUHJvcGVydGllcygpOworCQorCS8qKgorCSAqIFRoZSBjb250cm9sIG5lZWRzIHRoaXMgaW5mb3JtYXRpb24gYnV0IG11c3QgZ2V0IGl0IHRocm91Z2ggdGhlIGFuYWx5emVyIGZyb20gdGhlIEVzdGltYXRvcgorCSAqIGNyZWF0ZWQgYnkgdGhlIGZhY3RvcnkKKwkgKiBAcGFyYW0gZXF1YXRpb25JbmRleCAsIG9uZSBjaGFydCBwZXIgc3RhdGUgUywgRSwgSSwgYW5kIFIuCisJICogQHBhcmFtIHN0YXRlIDAgb3IgMSByZXByZXNlbnRpbmcgUyBhbmQgU3NlbGVjdGVkLCBJIGFuZCBJIHNlbGVjdGVkLGV0Yy4KKwkgKiBAcmV0dXJuIHByb3BlcnR5IG5hbWUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KGludCBlcXVhdGlvbkluZGV4LCBpbnQgc3RhdGUpIHsKKwkJIHN3aXRjaCAoZXF1YXRpb25JbmRleCkgeworICAgICAgICAgY2FzZSAwOiAgCisgICAgICAgIAkgaWYoc3RhdGU9PTApIHsKKyAgICAgICAgCQkgcmV0dXJuIGtleVM7CisgICAgICAgIAkgfSBlbHNlIGlmIChzdGF0ZT09MSkgeworICAgICAgICAJCSByZXR1cm4ga2V5U2VsZWN0ZWRTOworICAgICAgICAJIH0gZWxzZSBpZiAoKHN0YXRlPT0yKXx8KHN0YXRlPT0zKSkgeworICAgICAgICAJCSByZXR1cm4ga2V5WFkxOworICAgICAgICAJIH1lbHNlICB7CisgICAgICAgIAkJIHJldHVybiBrZXlGaXQxOworICAgICAgICAJIH0KKyAgICAgICAgCSAKKyAgICAgICAgIGNhc2UgMTogIAorICAgICAgICAJIGlmKHN0YXRlPT0wKSB7CisgICAgICAgIAkJIHJldHVybiBrZXlJOworICAgICAgICAJIH0gZWxzZSBpZiAoc3RhdGU9PTEpIHsKKyAgICAgICAgCQkgcmV0dXJuIGtleVNlbGVjdGVkSTsKKyAgICAgICAgCSB9IGVsc2UgaWYgKChzdGF0ZT09Mil8fChzdGF0ZT09MykpIHsKKyAgICAgICAgCQkgcmV0dXJuIGtleVhZMjsKKyAgICAgICAgCSB9ZWxzZSAgeworICAgICAgICAJCSByZXR1cm4ga2V5Rml0MjsKKyAgICAgICAgCSB9CisgICAgICAgIAkgCisgICAgICAgICBjYXNlIDI6ICAKKyAgICAgICAgCSBpZihzdGF0ZT09MCkgeworICAgICAgICAJCSByZXR1cm4ga2V5UjsKKyAgICAgICAgCSB9IGVsc2UgaWYgKHN0YXRlPT0xKSB7CisgICAgICAgIAkJIHJldHVybiBrZXlTZWxlY3RlZFI7CisgICAgICAgIAkgfSBlbHNlIGlmICgoc3RhdGU9PTIpfHwoc3RhdGU9PTMpKSB7CisgICAgICAgIAkJIHJldHVybiBrZXlYWTM7CisgICAgICAgIAkgfWVsc2UgIHsKKyAgICAgICAgCQkgcmV0dXJuIGtleUZpdDM7CisgICAgICAgIAkgfQorICAgICAgICAJIAorICAgICAgICAgY2FzZSAzOiAgIAorICAgICAgICAJIGlmKHN0YXRlPT0wKSB7CisgICAgICAgIAkJIHJldHVybiBrZXlFOworICAgICAgICAJIH0gZWxzZSBpZiAoc3RhdGU9PTEpIHsKKyAgICAgICAgCQkgcmV0dXJuIGtleVNlbGVjdGVkRTsKKyAgICAgICAgCSB9IGVsc2UgaWYgKChzdGF0ZT09Mil8fChzdGF0ZT09MykpIHsKKyAgICAgICAgCQkgcmV0dXJuIGtleVhZNDsKKyAgICAgICAgCSB9ZWxzZSAgeworICAgICAgICAJCSByZXR1cm4ga2V5Rml0NDsKKyAgICAgICAgCSB9CisgICAgICAgIAkgCisgICAgICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKKwkJIH0vLyBzd2l0Y2gJCisJfS8vIGdldFByb3BlcnR5CisJCisJLyoqCisJICogdXBkYXRlIHRoZSBtaW4gYW5kIG1heCB0aHJlc2hvbGRzIGZyb20gdGhlCisJICogRXN0aW1hdG9yQ29udHJvbCBVSSBzcGlubmVycworCSAqIEBwYXJhbSBjb250cm9sUGFyYW1ldGVyc01hcCAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBbGxQYXJhbWV0ZXJzKE1hcDxTdHJpbmcsT2JqZWN0PiBjb250cm9sUGFyYW1ldGVyc01hcCkgeworCQlpZihjb250cm9sUGFyYW1ldGVyc01hcCAgIT1udWxsKSB7CisJCQltYXhTdGhyZXNob2xkID0gKChEb3VibGUpY29udHJvbFBhcmFtZXRlcnNNYXAuZ2V0KEVzdGltYXRvckNvbnRyb2wuTUFYX1NfS0VZKSkuZG91YmxlVmFsdWUoKTsKKwkJCW1pblN0aHJlc2hvbGQgPSAoKERvdWJsZSljb250cm9sUGFyYW1ldGVyc01hcC5nZXQoRXN0aW1hdG9yQ29udHJvbC5NSU5fU19LRVkpKS5kb3VibGVWYWx1ZSgpOworCQkKKwkJCW1heEV0aHJlc2hvbGQgPSAoKERvdWJsZSljb250cm9sUGFyYW1ldGVyc01hcC5nZXQoRXN0aW1hdG9yQ29udHJvbC5NQVhfRV9LRVkpKS5kb3VibGVWYWx1ZSgpOworCQkJbWluRXRocmVzaG9sZCA9ICgoRG91YmxlKWNvbnRyb2xQYXJhbWV0ZXJzTWFwLmdldChFc3RpbWF0b3JDb250cm9sLk1JTl9FX0tFWSkpLmRvdWJsZVZhbHVlKCk7CisJCQkKKwkJCW1heEl0aHJlc2hvbGQgPSAoKERvdWJsZSljb250cm9sUGFyYW1ldGVyc01hcC5nZXQoRXN0aW1hdG9yQ29udHJvbC5NQVhfSV9LRVkpKS5kb3VibGVWYWx1ZSgpOworCQkJbWluSXRocmVzaG9sZCA9ICgoRG91YmxlKWNvbnRyb2xQYXJhbWV0ZXJzTWFwLmdldChFc3RpbWF0b3JDb250cm9sLk1JTl9JX0tFWSkpLmRvdWJsZVZhbHVlKCk7CisJCQorCQkJbWF4UnRocmVzaG9sZCA9ICgoRG91YmxlKWNvbnRyb2xQYXJhbWV0ZXJzTWFwLmdldChFc3RpbWF0b3JDb250cm9sLk1BWF9SX0tFWSkpLmRvdWJsZVZhbHVlKCk7CisJCQltaW5SdGhyZXNob2xkID0gKChEb3VibGUpY29udHJvbFBhcmFtZXRlcnNNYXAuZ2V0KEVzdGltYXRvckNvbnRyb2wuTUlOX1JfS0VZKSkuZG91YmxlVmFsdWUoKTsKKwkJCQorCQkJdXNlRnJlcURlcGVuZGFudEJldGEgPSAoKEJvb2xlYW4pIGNvbnRyb2xQYXJhbWV0ZXJzTWFwLmdldChFc3RpbWF0b3JDb250cm9sLkZSRVFfTU9ERV9LRVkpICkuYm9vbGVhblZhbHVlKCk7CisJCQkKKwkJfQorCQlyZXR1cm47CisJfS8vIHVwZGF0ZSBUaHJlc2hvbGRzCisJCisJCisJCisJLyoqCisJICogRXN0aW1hdGUgdGhlIHBhcmFtZXRlcnMKKwkgKiBAcGFyYW0gbG9jYWxEZW5zaXR5IAorCSAqIEBwYXJhbSBsb2NhbFBvcHVsYXRpb24gIAorCSAqIEBwYXJhbSBsb2NhdGlvbklEIAorCSAqIEByZXR1cm4gdGhlIE1vZGVsUGFyYW1ldGVycyBlc3RpbWF0ZQorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBNb2RlbFBhcmFtZXRlcnMgZXN0aW1hdGUoZG91YmxlIGxvY2FsRGVuc2l0eSwgZG91YmxlIGxvY2FsUG9wdWxhdGlvbiwgU3RyaW5nIGxvY2F0aW9uSUQpIDsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByYXcgZGF0YSAoc3RhdGUgMCkgYW5kIHRoZSBzZWxlY3RlZCBkYXRhIChzdGF0ZSAxKSAKKwkgKiBmb3IgZWFjaCBvZiB0aGUgc3RhdGUgdmFyaWFibGVzIFMsRSxJLFIgKGNoYXJ0SW5kZXggMC0zKQorCSAqIEBwYXJhbSBjaGFydEluZGV4IAorCSAqIEBwYXJhbSBzdGF0ZQorCSAqIEByZXR1cm4gdGhlIGRhdGEgdG8gcGxvdAorCSAqLworCXB1YmxpYyBkb3VibGVbXSBnZXRWYWx1ZXMoaW50IGNoYXJ0SW5kZXgsIGludCBzdGF0ZSkgeworCQkvLyBwaWNrIHRoZSByaWdodCBkYXRhIGZvciB0aGUgcmlnaHQgY2hhcnQKKwkJaWYoc3RhdGUgPD0gMSkgeworCQkJZG91YmxlW11bXSBkYXRhID0gZGF0YVRvUGxvdC5nZXQoY2hhcnRJbmRleCk7CisJCQlyZXR1cm4gZGF0YVtzdGF0ZV07CisJCX0gCisJCS8vIHJlZ3Jlc3Npb24gZGF0YQorCQlkb3VibGVbXVtdIHJlZ3Jlc3Npb24gPSByZWdyZXNzaW9uVmFsdWVzLmdldChjaGFydEluZGV4KTsKKwkJcmV0dXJuIHJlZ3Jlc3Npb25bc3RhdGUtMl07CisJfS8vIGdldFZhbHVlcworCQorCQorCS8qKgorCSAqIGNyZWF0ZSBhIHNvcnRlZCByZWdyZXNzaW9uIChvcmRlcmVkIGJ5IHRoZSB4IGNvb3JkaW5hdGUpCisJICogQHBhcmFtIHhMaXN0CisJICogQHBhcmFtIHlMaXN0CisJICogQHJldHVybiB0aGUgcmVncmVzc2lvbgorCSAqLworCXB1YmxpYyBkb3VibGVbXVtdIGdldFNvcnRlZFJlZ3Jlc3Npb24oTGlzdDxEb3VibGU+IHhMaXN0LCBMaXN0PERvdWJsZT4geUxpc3QpIHsKKwkJZG91YmxlW11bXSByZWdyZXNzaW9uID0gbmV3IGRvdWJsZVsyXVt4TGlzdC5zaXplKCldOworCQlpZih5TGlzdC5zaXplKCkgIT0geExpc3Quc2l6ZSgpKSByZXR1cm4gcmVncmVzc2lvbjsKKwkJTGlzdDxQaGFzZVNwYWNlQ29vcmRpbmF0ZT4gY29vcmRzID0gbmV3IEFycmF5TGlzdDxQaGFzZVNwYWNlQ29vcmRpbmF0ZT4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB4TGlzdC5zaXplKCk7IGkgKyspIHsKKwkJCWRvdWJsZSB4ID0geExpc3QuZ2V0KGkpLmRvdWJsZVZhbHVlKCk7CisJCQlkb3VibGUgeSA9IHlMaXN0LmdldChpKS5kb3VibGVWYWx1ZSgpOworCQkJUGhhc2VTcGFjZUNvb3JkaW5hdGUgY29vcmQgPSBuZXcgUGhhc2VTcGFjZUNvb3JkaW5hdGUoeCx5KTsKKwkJCWNvb3Jkcy5hZGQoY29vcmQpOworCQl9CisJCU9iamVjdFtdIGNvb3JkQXJyYXkgPSBjb29yZHMudG9BcnJheSgpOworCQlBcnJheXMuc29ydChjb29yZEFycmF5KTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB4TGlzdC5zaXplKCk7IGkgKyspIHsKKwkJCVBoYXNlU3BhY2VDb29yZGluYXRlIGNvb3JkID0gKFBoYXNlU3BhY2VDb29yZGluYXRlKWNvb3JkQXJyYXlbaV07CisJCQlyZWdyZXNzaW9uWzBdW2ldID0gY29vcmQueFZhbHVlOworCQkJcmVncmVzc2lvblsxXVtpXSA9IGNvb3JkLnlWYWx1ZTsKKwkJfQorCQlyZXR1cm4gcmVncmVzc2lvbjsKKwl9Ly9nZXRTb3J0ZWRSZWdyZXNzaW9uCisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9QYXJhbWV0ZXJFc3RpbWF0b3JGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9QYXJhbWV0ZXJFc3RpbWF0b3JGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0ZjhlOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL1BhcmFtZXRlckVzdGltYXRvckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRmFjdG9yeSB0aGF0IGNyZWF0ZXMgUGFyYW1ldGVyRXNpbWF0b3IgaW5zdGFuY2VzCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXJFc3RpbWF0b3JGYWN0b3J5IHsKKworCS8qKgorCSAqIENyZWF0ZSBuZXcgUGFyYW1ldGVyRXN0aW1hdG9yCisJICogCisJICogQHBhcmFtIG1ldGhvZCBNZXRob2QgdXNlZCB0byBlc3RpbWF0ZSBwYXJhbWV0ZXJzCisJICogQHBhcmFtIGRhdGEgRXN0aW1hdG9yIGRhdGEKKwkgKiBAcmV0dXJuIFBhcmFtZXRlckVzdGltYXRvcgorCSAqLworCXB1YmxpYyBzdGF0aWMgUGFyYW1ldGVyRXN0aW1hdG9yIGNyZWF0ZUVzdGltYXRvcigKKwkJCVBhcmFtZXRlckVzdGltYXRvck1ldGhvZCBtZXRob2QsIAorCQkJUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UgZGF0YSkgeworCQlQYXJhbWV0ZXJFc3RpbWF0b3IgcmVzdWx0ID0gbnVsbDsKKwkJCisJCXN3aXRjaChtZXRob2QpIHsKKwkJCWNhc2UgU0VJUjoKKwkJCQlyZXN1bHQgPSBuZXcgU0VJUnBhcmFtZXRlckVzdGltYXRvcihkYXRhKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0lSOgorCQkJCSByZXN1bHQgPSBuZXcgU0lScGFyYW1ldGVyRXN0aW1hdG9yKGRhdGEpOworCQkJCSBicmVhazsKKwkJCWNhc2UgU0k6CisJCQkJIHJlc3VsdCA9IG5ldyBTSXBhcmFtZXRlckVzdGltYXRvcihkYXRhKTsKKwkJCQkgYnJlYWs7CQorCQkJY2FzZSBOT05MSU5FQVJTRUlSOgorCQkJCSByZXN1bHQgPSBuZXcgTm9uTGluZWFyU0VJUlBhcmFtZXRlckVzdGltYXRvcihkYXRhKTsKKwkJCQkgYnJlYWs7CQorCQkJZGVmYXVsdDoKKwkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlVua25vd24gbWV0aG9kOiAiK21ldGhvZCwgbnVsbCk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9QYXJhbWV0ZXJFc3RpbWF0b3JNZXRob2QuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL1BhcmFtZXRlckVzdGltYXRvck1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYWYyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9QYXJhbWV0ZXJFc3RpbWF0b3JNZXRob2QuamF2YQpAQCAtMCwwICsxLDc0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRGlzZWFzZVR5cGU7CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEFkZCBhbnkgbmV3IHBhcmFtZXRlciBlc3RpbWF0aW9uIG1ldGhvZCB5b3UgY3JlYXRlIHRvIHRoZSBsaXN0IGluIHRoaXMgZW51bWVyYXRpb24KKyAqIHRvIGVuc3VyZSBpdCBiZWNvbWVzIGF2YWlsYWJsZSBmcm9tIHRoZSBwYXJhbWV0ZXIgZXN0aW1hdG9yIHNlbGVjdGlvbgorICogd2l6YXJkLiBBbHNvIHByb3ZpZGUgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgbWV0aG9kLgorICogCisgKiBZb3UgYWxzbyBuZWVkIHRvIG1vZGlmeSB0aGUgZmFjdG9yeSBtZXRob2QgdG8gZW5zdXJlIGl0IGNhbiBjcmVhdGUKKyAqIGFuIGluc3RhbmNlIG9mIHRoZSBwYXJhbWV0ZXIgZXN0aW1hdG9yIGltcGxlbWVudGluZyB0aGUgbWV0aG9kLgorICovCitwdWJsaWMgZW51bSBQYXJhbWV0ZXJFc3RpbWF0b3JNZXRob2QgewkKKwkvKioKKwkgKiBJZiBtZXRob2QgPSBTRUlSX01FVEhPRCwgdGhlbiBTRUlSIG1vZGVsIHVzZWQKKwkgKi8KKwlTRUlSKCJTRUlSIiwgIkFuIFNFSVIgcGFyYW1ldGVyIGVzdGltYXRvciIsIERpc2Vhc2VUeXBlLlNFSVIpLAorCS8qKgorCSAqIElmIG1ldGhvZCA9IFNJUl9NRVRIT0QsIHRoZW4gU0lSIG1vZGVsIHVzZWQKKwkgKi8KKwlTSVIoIlNJUiIsICJBbiBTSVIgcGFyYW1ldGVyIGVzdGltYXRvciIsIERpc2Vhc2VUeXBlLlNJUiksCisJLyoqCisJICogSWYgbWV0aG9kID0gU0lfTUVUSE9ELCB0aGVuIFNJIG1vZGVsIHVzZWQKKwkgKi8KKwlTSSgiU0kiLCAiQW4gU0kgcGFyYW1ldGVyIGVzdGltYXRvciIsIERpc2Vhc2VUeXBlLlNJKSwKKwkvKioKKwkgKiBJZiBtZXRob2QgPSBOT05MSU5FQVJfU0VJUl9NRVRIT0QsIHRoZW4gU0VJUiBtZXRob2QgZm9yIGJldGEgZnVuY3Rpb24gdXNlZAorCSAqLworCU5PTkxJTkVBUlNFSVIoIk5vbkxpbmVhciBTRUlSIiwgIkEgbm9uLWxpbmVhciBTRUlSIHBhcmFtZXRlciBlc3RpbWF0b3IiLCBEaXNlYXNlVHlwZS5TRUlSKTsKKwkKKwlTdHJpbmcgbmFtZTsKKwlTdHJpbmcgZGVzY3JpcHRvbjsKKwlEaXNlYXNlVHlwZSB0eXBlOworCQorCXByaXZhdGUgUGFyYW1ldGVyRXN0aW1hdG9yTWV0aG9kKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sIERpc2Vhc2VUeXBlIHR5cGUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5kZXNjcmlwdG9uID0gZGVzY3JpcHRpb247CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCQorCS8qKgorCSAqIE5hbWUgKGFzIGl0IHNob3dzIHVwIGluIHRoZSB3aXphcmQpCisJICogQHJldHVybiBTdHJpbmcgVGhlIG5hbWUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7cmV0dXJuIHRoaXMubmFtZTt9CisJCisJLyoqCisJICogRGVzY3JpcHRpb24gKGFzIGl0IHNob3dzIHVwIGluIHRoZSBXaXphcmQpCisJICogQHJldHVybiBTdHJpbmcgRGVzY3JpcHRpb24KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkge3JldHVybiB0aGlzLmRlc2NyaXB0b247fQorCQorCS8qKgorCSAqIGdldFR5cGUuIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgbWV0aG9kIChkZXRlcm1pbmVzCisJICogd2hpY2ggaW5wdXQgZGF0YSBjYW4gYmUgdXNlZCkKKwkgKiBAcmV0dXJuIERpc2Vhc2VUeXBlIFRoZSB0eXBlCisJICovCisJcHVibGljIERpc2Vhc2VUeXBlIGdldFR5cGUoKSB7cmV0dXJuIHRoaXMudHlwZTt9CisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9QaGFzZVNwYWNlQ29vcmRpbmF0ZS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvUGhhc2VTcGFjZUNvb3JkaW5hdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTk5NTVmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvUGhhc2VTcGFjZUNvb3JkaW5hdGUuamF2YQpAQCAtMCwwICsxLDExOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKgorICogQW4geC15IGNvb3JkaW5hdGUgaW4gUGhhc2UgU3BhY2UgCisgKiBVc2VkLCBmb3IgZXhhbXBsZSwgIHRvIGNvbXB1dGUgdHJhamVjdG9yeSBhbmQgTHlhcHVub3YgRXhwb25lbnQKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQaGFzZVNwYWNlQ29vcmRpbmF0ZSBpbXBsZW1lbnRzIENvbXBhcmFibGUgeworCQorCQkKKwkJZG91YmxlIHhWYWx1ZTsKKwkJZG91YmxlIHlWYWx1ZTsKKwkJCisJCS8qKgorCQkgKiBjb25zdHJ1Y3RvcgorCQkgKiBAcGFyYW0geAorCQkgKiBAcGFyYW0geQorCQkgKi8KKwkJcHVibGljIFBoYXNlU3BhY2VDb29yZGluYXRlKGRvdWJsZSB4LGRvdWJsZSB5KSB7CisJCQl4VmFsdWUgPSB4OworCQkJeVZhbHVlID0geTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIGdldFgKKwkJICogQHJldHVybiB4VmFsdWUKKwkJICovCisJCXB1YmxpYyBkb3VibGUgZ2V0WFZhbHVlKCkgeworCQkJcmV0dXJuIHhWYWx1ZTsKKwkJfQorCisJCS8qKgorCQkgKiBzZXQgeFZhbHVlCisJCSAqIEBwYXJhbSB2YWx1ZSAKKwkJICovCisJCXB1YmxpYyB2b2lkIHNldFhWYWx1ZShkb3VibGUgdmFsdWUpIHsKKwkJCXhWYWx1ZSA9IHZhbHVlOworCQl9CisKKwkJLyoqCisJCSAqIGdldFkKKwkJICogQHJldHVybiBZVmFsdWUKKwkJICovCisJCXB1YmxpYyBkb3VibGUgZ2V0WVZhbHVlKCkgeworCQkJcmV0dXJuIHlWYWx1ZTsKKwkJfQorCisJCS8qKgorCQkgKiBzZXQgeVZhbHVlCisJCSAqIEBwYXJhbSB2YWx1ZSAKKwkJICovCisJCXB1YmxpYyB2b2lkIHNldFlWYWx1ZShkb3VibGUgdmFsdWUpIHsKKwkJCXlWYWx1ZSA9IHZhbHVlOworCQl9CisJCisJCS8qKgorCQkgKiBpbnRlZ3JhdGUgKHN1bSkgcGF0aCB2YWx1ZXMKKwkJICogQHBhcmFtIGRlbHRhWHZhbHVlIAorCQkgKiBAcGFyYW0gZGVsdGFZdmFsdWUgCisJCSAqLworCQlwdWJsaWMgdm9pZCBpbnRlZ3JhdGVQYXRoKGRvdWJsZSBkZWx0YVh2YWx1ZSwgZG91YmxlIGRlbHRhWXZhbHVlKSB7CisJCQl4VmFsdWUgKz0gZGVsdGFYdmFsdWU7CisJCQl5VmFsdWUgKz0gZGVsdGFZdmFsdWU7CisJCX0KKwkJCisJCS8qKgorCQkgKiBub3JtYWxpemUgdGhlIGNvb3JkaW5hdGVzCisJCSAqIEBwYXJhbSBub3JtYWxpemF0aW9uCisJCSAqIAorCQkgKi8KKwkJcHVibGljIHZvaWQgbm9ybWFsaXplKGRvdWJsZSBub3JtYWxpemF0aW9uKSB7CisJCQl4VmFsdWUgLz0gbm9ybWFsaXphdGlvbjsKKwkJCXlWYWx1ZSAvPSBub3JtYWxpemF0aW9uOworCQl9CisJCQorCQkvKioKKwkJICogCisJCSAqIEBwYXJhbSBvdGhlclBvaW50CisJCSAqIEByZXR1cm4gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhpcyBwb2ludCBhbmQgb3RoZXIgcG9pbnQgaW4gcGhhc2Ugc3BhY2UKKwkJICovCisJCXB1YmxpYyBkb3VibGUgZ2V0RGlzdGFuY2UoUGhhc2VTcGFjZUNvb3JkaW5hdGUgb3RoZXJQb2ludCkgeworCQkJZG91YmxlIGRpc3QyID0gKCh0aGlzLnhWYWx1ZSAtIG90aGVyUG9pbnQueFZhbHVlKSoodGhpcy54VmFsdWUgLSBvdGhlclBvaW50LnhWYWx1ZSkpKworCQkJCQkJICAgKCh0aGlzLnlWYWx1ZSAtIG90aGVyUG9pbnQueVZhbHVlKSoodGhpcy55VmFsdWUgLSBvdGhlclBvaW50LnlWYWx1ZSkpCTsKKwkJCWRvdWJsZSBkaXN0ID0gTWF0aC5zcXJ0KGRpc3QyKTsKKwkJCQorCQkJcmV0dXJuIGRpc3Q7CisJCX0KKwkJCisJCS8qKgorCQkgKiBmb3Igc29ydGluZyBjb29yZGluYXRlcyBieSB0aGVpciB4IHZhbHVlCisJCSAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUjY29tcGFyZVRvKGphdmEubGFuZy5PYmplY3QpCisJCSAqLworCQkgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG90aGVyQ29vcmQpIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24geworCQkJICAgIGlmICghKG90aGVyQ29vcmQgaW5zdGFuY2VvZiBQaGFzZVNwYWNlQ29vcmRpbmF0ZSkpIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oIkEgUGVyc29uIG9iamVjdCBleHBlY3RlZC4iKTsKKwkJCSAgICBkb3VibGUgb3RoZXJYID0gKChQaGFzZVNwYWNlQ29vcmRpbmF0ZSlvdGhlckNvb3JkKS54VmFsdWU7CisJCQkgICAgaWYgKHRoaXMueFZhbHVlIDwgb3RoZXJYKSByZXR1cm4gLTE7CisJCQkgICAgaWYgKHRoaXMueFZhbHVlID4gb3RoZXJYKSByZXR1cm4gMTsKKwkJCSAgICByZXR1cm4gMDsKKwkJIH0KKworCQorCQkKKwkJCisJCisKK30vL1BoYXNlU3BhY2VDb29yZGluYXRlIGNsYXNzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9QaGFzZVN5bmNocm9uaXplci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvUGhhc2VTeW5jaHJvbml6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mzc0MmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvUGhhc2VTeW5jaHJvbml6ZXIuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoqCisgKiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwuUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2U7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICAqIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gdGFrZSBhIHBhaXIgb2YgdGltZSBzZXJpZXMgZWFjaCBpbnZvbHZpbmcgbXVsdGlwbGUgZXBpZGVtaWMgd2F2ZXMuIEl0IHVzZXMgb25lIAorICAqIHNlcmllcyBhcyBhIHJlZmVyZW5jZSBhbiB0aGVuIHBoYXNlIHNoaWZ0cyB0aGUgcGVha3Mgd2l0aGluIHRoZSBzZWNvbmQgZGF0YSBzZXJpZXMgc28gdGhhdCB0aGUgZXBpZGVtaWNzCisgICogYXJlICJzeW5jaHJvbml6ZWQiLiBUaGlzIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBhY2N1cmF0ZWx5IGZpdCBtb2RlbCBwYXJhbWV0ZXJzIG9mIG1hbnkgbG9jYXRpb25zIHdpdGhvdXQgaW1wb3NpbmcgYQorICAqIHRyYW5zcG9ydGF0aW9uIG1vZGVsLiBBcyB0aGUgZXBpZGVtaWMgIm1vdmVzIiwgcGVha3Mgb2NjdXIgYXQgZGlmZmVyZW50IHRpbWVzLiBTeW5jaHJvbml6aW5nIGFsbG93cyB1cyB0byBlc3RpbWF0ZSB0aGUgZXBpZGVtaWMKKyAgKiBwYXJhbWV0ZXJzIHdpdGhvdXQgYSB0cmFuc3BvcnRhdGlvbiBtb2RlbC4gVGhpcyBjbGFzcyBpcyB1c2VkIHdoZW4gdGhlIGZpdHRpbmcgaXMgZG9uZSBieSBhZGRpbmcgc3luY2hyb25pemVkIGRhdGEgb3ZlciBhbGwgbG9jYXRpb25zLgorICAqIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBpZiB3ZSBjYW4gZml0IGVhY2ggbG9jYXRpb24gaW5kZXBlbmRhbnRseSwgYnV0IGlzIG5lY2Vzc2FyeSB3aGVuIHRoZSBhbW91bnQgb2YgZGF0YSBpcyBzY2FyY2UgKGVnIGZvciByZWFsCisgICogZXBpZGVtaWMgaW5jaWRlbmNlIGRhdGEpLgorICovCitwdWJsaWMgY2xhc3MgUGhhc2VTeW5jaHJvbml6ZXIgeworCQorCVJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIHJlZmVyZW5jZTsKKwkvL1JlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGRhdGE7CisJCisJLyoqCisJICogdGhpcyBwaGFzZSBzaGlmdCBtYXhpbWl6ZXMgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIHR3byB2ZWN0b3JzCisJICovCisJLy9pbnQgcGhhc2VTaGlmdDsKKwkKKwkvKioKKwkgKiBieSBkZWZhdWx0IHdlIHdpbGwgdHJ5IHRvIGZpbmQgbWF4IGNvcnJlbGF0aW9uIGZvciBhIHNoaWZ0IG9mICsvLSAzMCBkYXlzCisJICogaWYgdGhlIHZlY3RvcnMgYXJlIHNob3J0ZXIgdGhhbiB0aGlzIHdlIHJlZHVjZSB0aGUgd2luZG93CisJICovCisJLy9pbnQgZGVmYXVsdFNoaWZ0V2luZG93ID0gMzA7CisJCisJLyoqCisJICogVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byB0YWtlIGEgcGFpciBvZiBSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZShzKSBlYWNoIGludm9sdmluZyBtdWx0aXBsZSBlcGlkZW1pYyB3YXZlcy4gSXQgdXNlcyBvbmUgCisJICogc2VyaWVzIGFzIGEgcmVmZXJlbmNlIGFuIHRoZW4gcGhhc2Ugc2hpZnRzIHRoZSBwZWFrcyB3aXRoaW4gdGhlIHNlY29uZCBpbmNpZGVuY2UgZGF0YSBzZXJpZXMgc28gdGhhdCB0aGUgZXBpZGVtaWNzCisJICogYXJlICJzeW5jaHJvbml6ZWQiLiBUaGlzIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBhY2N1cmF0ZWx5IGZpdCBtb2RlbCBwYXJhbWV0ZXJzIG9mIG1hbnkgbG9jYXRpb25zIHdpdGhvdXQgaW1wb3NpbmcgYQorCSAqIHRyYW5zcG9ydGF0aW9uIG1vZGVsLiBBcyB0aGUgZXBpZGVtaWMgIm1vdmVzIiwgcGVha3Mgb2NjdXIgYXQgZGlmZmVyZW50IHRpbWVzLiBTeW5jaHJvbml6aW5nIGFsbG93cyB1cyB0byBlc3RpbWF0ZSB0aGUgZXBpZGVtaWMKKwkgKiBwYXJhbWV0ZXJzIHdpdGhvdXQgYSB0cmFuc3BvcnRhdGlvbiBtb2RlbC4gVGhpcyBjbGFzcyBpcyB1c2VkIHdoZW4gdGhlIGZpdHRpbmcgaXMgZG9uZSBieSBhZGRpbmcgc3luY2hyb25pemVkIGRhdGEgb3ZlciBhbGwgbG9jYXRpb25zLgorCSAqIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBpZiB3ZSBjYW4gZml0IGVhY2ggbG9jYXRpb24gaW5kZXBlbmRlbnRseSwgYnV0IGlzIG5lY2Vzc2FyeSB3aGVuIHRoZSBhbW91bnQgb2YgZGF0YSBpcyBzY2FyY2UgKGVnIGZvciByZWFsCisJICogZXBpZGVtaWMgaW5jaWRlbmNlIGRhdGEpLgorCSAqIEBwYXJhbSByZWZJbnN0YW5jZQorCSAqIAorCSAqLworCXB1YmxpYyBQaGFzZVN5bmNocm9uaXplcihSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSByZWZJbnN0YW5jZSkgeworCQlyZWZlcmVuY2UgPSByZWZJbnN0YW5jZTsKKwkJdGhpcy5nZXRQZWFrUG9zaXRpb25zKHJlZmVyZW5jZSwgIkluY2lkZW5jZSIpOworCX0KKwkKKwkvKioKKwkgKiBGaW5kcyBpbmRleCBvZiBwZWFrcywgcmV0dXJucyBhcyBsaXN0CisJICogQHBhcmFtIGluc3RhbmNlCisJICogQHBhcmFtIGtleSAKKwkgKiBAcGFyYW1ldGVyIGtleSAobXVzdCBiZSBJLCBFLCBvciBpbmNpZGVuY2UgLSB0aGV5IGhhdmUgcGVha3MpCisJICogQHJldHVybiBsaXN0IG9mIHBlYWsgcG9zaXRpb25zCisJICovCisJcHVibGljIExpc3Q8SW50ZWdlcj4gZ2V0UGVha1Bvc2l0aW9ucyhSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBpbnN0YW5jZSwgU3RyaW5nIGtleSkgeworCQlMaXN0PERvdWJsZT4gdmVjdG9yID0gaW5zdGFuY2UuZ2V0RGF0YSgpLmdldChrZXkpOworCQlMaXN0PEludGVnZXI+IHBlYWtzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHZlY3Rvci5zaXplKCk7IGkgKyspIHsKKwkJCWRvdWJsZSB2YWx1ZSA9IHZlY3Rvci5nZXQoaSkuZG91YmxlVmFsdWUoKTsKKwkJCWRvdWJsZSBuZXh0ID0gMC4wOworCQkJZG91YmxlIGxhc3QgPSAwLjA7CisJCQlpZiAoaTwodmVjdG9yLnNpemUoKS0xKSkgbmV4dCA9IHZlY3Rvci5nZXQoaSsxKS5kb3VibGVWYWx1ZSgpOworCQkJaWYgKGk+MCkgbGFzdCA9IHZlY3Rvci5nZXQoaS0xKS5kb3VibGVWYWx1ZSgpOworCQkJaWYoKHZhbHVlID4gbmV4dCkmJih2YWx1ZT5sYXN0KSkgeworCQkJCXBlYWtzLmFkZChJbnRlZ2VyLnZhbHVlT2YoaSkpOworCQkJCS8vIERFQlVHCisJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIHBlYWsgYXQgaT0iK2krIiwgdmFsdWU9Iit2YWx1ZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHBlYWtzOworCX0KKwkKKwkvKioKKwkgKiBSb3RhdGVzIHRoZSB2ZWN0b3IgKExpc3QpIGJ5IFNoaWZ0IC0gd3JhcHBpbmcgdmFsdWVzIGZyb20gYmVnaW5uaW5nIHRvIGVuZCBvciB2aWNlIHZlcnNhIGFzIG5lY2Vzc2FyeQorCSAqIFRoaXMgc2hvdWxkIHdvcmsgZm9yIHF1YXNpIHBlcmlvZGljIHRpbWUgc2VyaWVzCisJICogQHBhcmFtIHNoaWZ0CisJICogQHBhcmFtIHZlY3RvcgorCSAqIEByZXR1cm4gc2hpZnRlZCB2ZWN0b3IKKwkgKi8KKwlwdWJsaWMgTGlzdDxEb3VibGU+IGdldFNoaWZ0ZWRWZWN0b3IoaW50IHNoaWZ0LCBMaXN0PERvdWJsZT4gdmVjdG9yKXsKKwkJTGlzdCBzaGlmdGVkID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCWludCBtYXggPSB2ZWN0b3Iuc2l6ZSgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSArKykgeworCQkJaW50IGogPSBpIC0gc2hpZnQ7CisJCQlpZiAoaiA+PSBtYXgpIHsKKwkJCQlqID0gaiAtIG1heDsKKwkJCX0KKwkJCWlmIChqIDwgMCkgeworCQkJCWogPSBtYXgrajsKKwkJCX0KKwkJCXNoaWZ0ZWQuYWRkKGksdmVjdG9yLmdldChqKSk7CisJCX0KKwkJCisJCXJldHVybiBzaGlmdGVkOworCX0KKyAKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL1NFSVJwYXJhbWV0ZXJFc3RpbWF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL1NFSVJwYXJhbWV0ZXJFc3RpbWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGIwM2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvU0VJUnBhcmFtZXRlckVzdGltYXRvci5qYXZhCkBAIC0wLDAgKzEsNDIyIEBACisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLlN0YXRlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZTsKKworLyoqCisgKiBFc3RpbWF0ZSBwYXJhbWV0ZXJzIGZvciBhbiBTRUlSIG1vZGVsCisgKiAKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTRUlScGFyYW1ldGVyRXN0aW1hdG9yIGV4dGVuZHMgUGFyYW1ldGVyRXN0aW1hdG9yIHsKKwkKKwkvLyBVbmlxdWUgc3RhdGVzIGZvciBTRUlSIGVzdGltYXRvcgorCWRvdWJsZVtdIGU7CisJZG91YmxlW10gcjsKKwkKKwkvKioKKwkgKiBAcGFyYW0gZGF0YSBEYXRhIAorCSAqLworCXB1YmxpYyBTRUlScGFyYW1ldGVyRXN0aW1hdG9yKFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGRhdGEpIHsKKwkJc3VwZXIoZGF0YSk7CisJCUxpc3Q8RG91YmxlPiBzVG9GaXQgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJTGlzdDxEb3VibGU+IGVUb0ZpdCA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQlMaXN0PERvdWJsZT4gaVRvRml0ID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCUxpc3Q8RG91YmxlPiByVG9GaXQgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCisJCUxpc3Q8RG91YmxlPiBpTGlzdCA9IGRhdGEuZ2V0RGF0YSgpLmdldChTdGF0ZXMuc3RhdGVzVG9GaXRbU3RhdGVzLklORkVDVElPVVNdKTsKKwkJTGlzdDxEb3VibGU+IHNMaXN0ID0gZGF0YS5nZXREYXRhKCkuZ2V0KFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuU1VTQ0VQVElCTEVdKTsKKwkJTGlzdDxEb3VibGU+IHJMaXN0ID0gZGF0YS5nZXREYXRhKCkuZ2V0KFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuUkVDT1ZFUkVEXSk7CisJCUxpc3Q8RG91YmxlPiBlTGlzdCA9IGRhdGEuZ2V0RGF0YSgpLmdldChTdGF0ZXMuc3RhdGVzVG9GaXRbU3RhdGVzLkVYUE9TRURdKTsKKwkJCisJCS8vIFRvRG86IFdoeSBhcmUgd2Ugc2tpcHBpbmcgdGhlIGZpcnN0IHZhbHVlPworCQlmb3IgKGludCBpY291bnQgPSAxOyBpY291bnQgPCBpTGlzdC5zaXplKCk7IGljb3VudCArKykgeworCQkJCWlUb0ZpdC5hZGQoaUxpc3QuZ2V0KGljb3VudCkpOworCQkJCWVUb0ZpdC5hZGQoZUxpc3QuZ2V0KGljb3VudCkpOworCQkJCXNUb0ZpdC5hZGQoc0xpc3QuZ2V0KGljb3VudCkpOworCQkJCXJUb0ZpdC5hZGQockxpc3QuZ2V0KGljb3VudCkpOworCQl9CisJCQorCQkKKwkJdGhpcy5udW1EYXRhUG9pbnRzID0gaVRvRml0LnNpemUoKTsKKwkJaWYobnVtRGF0YVBvaW50cyA8IE1JTlNJWkUpIHJldHVybjsKKwkJZGF0YVZhbGlkID0gdHJ1ZTsKKwkJdGhpcy5wID0gbmV3IGRvdWJsZVt0aGlzLm51bURhdGFQb2ludHNdOworCQl0aGlzLnMgPSBuZXcgZG91YmxlW3RoaXMubnVtRGF0YVBvaW50c107CisJCXRoaXMuZSA9IG5ldyBkb3VibGVbdGhpcy5udW1EYXRhUG9pbnRzXTsKKwkJdGhpcy5pID0gbmV3IGRvdWJsZVt0aGlzLm51bURhdGFQb2ludHNdOworCQl0aGlzLnIgPSBuZXcgZG91YmxlW3RoaXMubnVtRGF0YVBvaW50c107CisJCXRoaXMudCA9IG5ldyBkb3VibGVbdGhpcy5udW1EYXRhUG9pbnRzXTsKKwkJIAorCQkKKwkJZm9yIChpbnQgaWNvdW50ID0gMDsgaWNvdW50IDwgdGhpcy5udW1EYXRhUG9pbnRzOyBpY291bnQgKyspIHsKKwkJCXNbaWNvdW50XSA9IHNUb0ZpdC5nZXQoaWNvdW50KS5kb3VibGVWYWx1ZSgpOworCQkJZVtpY291bnRdID0gZVRvRml0LmdldChpY291bnQpLmRvdWJsZVZhbHVlKCk7CisJCQlpW2ljb3VudF0gPSBpVG9GaXQuZ2V0KGljb3VudCkuZG91YmxlVmFsdWUoKTsKKwkJCXJbaWNvdW50XSA9IHJUb0ZpdC5nZXQoaWNvdW50KS5kb3VibGVWYWx1ZSgpOworCQkJcFtpY291bnRdID0gc1tpY291bnRdK2VbaWNvdW50XStpW2ljb3VudF0rcltpY291bnRdOworCQkJdFtpY291bnRdID0gaWNvdW50OwkJCisJCX0vLyBmb3IgaWNvdW50CisJfS8vIGNvbnRzcnVjdG9yCisKKwkvKioKKwkgKiBFc3RpbWF0ZSB0aGUgcGFyYW1ldGVycworCSAqIEBwYXJhbSBsb2NhbERlbnNpdHkgCisJICogQHBhcmFtIGxvY2FsUG9wdWxhdGlvbiAKKwkgKiBAcGFyYW0gbG9jYXRpb25JRCAKKwkgKiBAcmV0dXJuIHRoZSBNb2RlbFBhcmFtZXRlcnMgZXN0aW1hdGUKKwkgKi8KKwlwdWJsaWMgTW9kZWxQYXJhbWV0ZXJzIGVzdGltYXRlKGRvdWJsZSBsb2NhbERlbnNpdHksIGRvdWJsZSBsb2NhbFBvcHVsYXRpb24sIFN0cmluZyBsb2NhdGlvbklEKSB7CisJCQorCQlNb2RlbFBhcmFtZXRlcnMgZml0dGVkUGFybXMgPSBuZXcgTW9kZWxQYXJhbWV0ZXJzKCk7CisJCQorCQlpbnQgbnB0cyA9IHMubGVuZ3RoOworCQlhc3NlcnQobnB0cyA9PSBlLmxlbmd0aCk7CisJCWFzc2VydChucHRzPT1pLmxlbmd0aCk7CisJCWFzc2VydChucHRzPT1yLmxlbmd0aCk7CisJCQorCQorCQkJCisJCQlkb3VibGVbXSBsblMgPSBuZXcgZG91YmxlW25wdHNdOworCQkJZG91YmxlW10gZGxuUyA9IG5ldyBkb3VibGVbbnB0cy0xXTsKKwkJCWRvdWJsZVtdIGxuRSA9IG5ldyBkb3VibGVbbnB0c107CisJCQlkb3VibGVbXSBkbG5FID0gbmV3IGRvdWJsZVtucHRzLTFdOworCQkJZG91YmxlW10gbG5JID0gbmV3IGRvdWJsZVtucHRzXTsKKwkJCWRvdWJsZVtdIGRsbkkgPSBuZXcgZG91YmxlW25wdHMtMV07CisJCQlkb3VibGVbXSBsblIgPSBuZXcgZG91YmxlW25wdHNdOworCQkJZG91YmxlW10gZGxuUiA9IG5ldyBkb3VibGVbbnB0cy0xXTsKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCisJCQkKKwkJCS8vIGF2ZXJhZ2UgdmFsdWVzIGFib3V0IGRlcml2YXRpdmUKKwkJCWRvdWJsZVtdIHNBdmcgPSBuZXcgZG91YmxlW25wdHMtMV07CisJCQlkb3VibGVbXSBlQXZnID0gbmV3IGRvdWJsZVtucHRzLTFdOworCQkJZG91YmxlW10gaUF2ZyA9IG5ldyBkb3VibGVbbnB0cy0xXTsKKwkJCWRvdWJsZVtdIHJBdmcgPSBuZXcgZG91YmxlW25wdHMtMV07CisJCQlkb3VibGVbXSBwQXZnID0gbmV3IGRvdWJsZVtucHRzLTFdOworCQkJZG91YmxlW11bXSBkYXRhUyA9IG5ldyBkb3VibGVbMl1bbnB0cyAtIDFdOworCQkJZG91YmxlW11bXSBkYXRhRSA9IG5ldyBkb3VibGVbMl1bbnB0cyAtIDFdOworCQkJZG91YmxlW11bXSBkYXRhSSA9IG5ldyBkb3VibGVbMl1bbnB0cyAtIDFdOworCQkJZG91YmxlW11bXSBkYXRhUiA9IG5ldyBkb3VibGVbMl1bbnB0cyAtIDFdOworCQkJICAgICAgICAKKwkJCS8vIGdldCB0aGUgbG9nYXJpdGhtcworCQkJZG91YmxlIGN1dG9mZiA9IDAuMDAwMDAwMDAwNTsKKworCQkJZm9yKGludCBqID0gMDsgaiA8IG5wdHM7IGorKyl7CisJCQkJaWYoc1tqXSA+PSBjdXRvZmYpIHsKKwkJCQkJbG5TW2pdID0gTWF0aC5sb2coc1tqXSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG5TW2pdID0gTWF0aC5sb2coY3V0b2ZmKTsgIC8vIFRPRE8gZml4IHRoaXMKKwkJCQl9CisJCQkJaWYoZVtqXSA+PSBjdXRvZmYpIHsKKwkJCQkJbG5FW2pdID0gTWF0aC5sb2coZVtqXSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG5FW2pdID0gTWF0aC5sb2coY3V0b2ZmKTsgIC8vIFRPRE8gZml4IHRoaXMKKwkJCQl9CisJCQkJaWYoaVtqXSA+PSBjdXRvZmYpIHsKKwkJCQkJbG5JW2pdID0gTWF0aC5sb2coaVtqXSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG5JW2pdID0gTWF0aC5sb2coY3V0b2ZmKTsgIC8vIFRPRE8gZml4IHRoaXMKKwkJCQl9CisJCQkJaWYocltqXSA+PSBjdXRvZmYpIHsKKwkJCQkJbG5SW2pdID0gTWF0aC5sb2cocltqXSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG5SW2pdID0gTWF0aC5sb2coY3V0b2ZmKTsgIC8vIFRPRE8gZml4IHRoaXMKKwkJCQl9CisJCQl9CisKKwkJCWRvdWJsZSBzTWF4ID0gMC4wOworCQkJZG91YmxlIGVNYXggPSAwLjA7CisJCQlkb3VibGUgaU1heCA9IDAuMDsKKwkJCWRvdWJsZSByTWF4ID0gMC4wOworCQkJLy9kZXJpdmF0aXZlcyBvZiBsb2dhcml0aG1zIGFuZCBhdmVyYWdlcyBvZiBvdGhlciBwb2ludHMKKwkJCWZvcihpbnQgaiA9IDE7aiA8IG5wdHMtMTtqKyspCisJCQl7CisJCQkJZGxuU1tqLTFdID0gKGxuU1tqXS1sblNbai0xXSk7IC8vIGR0ID0gMQorCQkJCWRsbkVbai0xXSA9IChsbkVbal0tbG5FW2otMV0pOyAvLyBkdCA9IDEKKwkJCQlkbG5JW2otMV0gPSAobG5JW2pdLWxuSVtqLTFdKTsgLy8gZHQgPSAxCisJCQkJZGxuUltqLTFdID0gKGxuUltqXS1sblJbai0xXSk7IC8vIGR0ID0gMQorCQkJCQorCQkJCXNBdmdbai0xXSA9IChzW2pdICsgc1tqLTFdKS8yLjA7CisJCQkJZUF2Z1tqLTFdID0gKGVbal0gKyBlW2otMV0pLzIuMDsKKwkJCQlpQXZnW2otMV0gPSAoaVtqXSArIGlbai0xXSkvMi4wOworCQkJCXJBdmdbai0xXSA9IChyW2pdICsgcltqLTFdKS8yLjA7CisJCQkJCQorCQkJCQorCQkJCWlmKHNBdmdbai0xXSA+PSBzTWF4KSBzTWF4ID0gc0F2Z1tqLTFdOworCQkJCWlmKGVBdmdbai0xXSA+PSBlTWF4KSBlTWF4ID0gZUF2Z1tqLTFdOworCQkJCWlmKGlBdmdbai0xXSA+PSBpTWF4KSBpTWF4ID0gaUF2Z1tqLTFdOworCQkJCWlmKHJBdmdbai0xXSA+PSByTWF4KSByTWF4ID0gckF2Z1tqLTFdOworCQkJCQorCQkJCXBBdmdbai0xXSA9IChwW2pdICsgcFtqLTFdKS8yLjA7CisJCQl9CisJCisJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8JCQkKKwkJCS8vIGRTL2R0LT4gZXF1YXRpb24gMS4KKwkJCS8veCwgeSBmb3IgbGVhc3Qgc3F1YXJlcyBmaXR0aW5nIHRvIGxpbmUgeSA9IGFscGhhKnggLSBiZXRhCisJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCS8vCisJCQlMaXN0PERvdWJsZT4geExpc3QxID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQlMaXN0PERvdWJsZT4geUxpc3QxID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQlMaXN0PERvdWJsZT4gZml0TGlzdDEgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCQorCQkJZm9yKGludCBqID0gMDsgaiA8IG5wdHMtMTsgaisrKXsKKwkJCQlkb3VibGUgc05vcm0gPSBzQXZnW2pdL3NNYXg7CisJCQkJZG91YmxlIGlOb3JtID0gaUF2Z1tqXS9pTWF4OworCQkJCWRvdWJsZSByTm9ybSA9IHJBdmdbal0vck1heDsKKwkJCQlkb3VibGUgZU5vcm0gPSBlQXZnW2pdL2VNYXg7CisJCQkJZGF0YVNbMF1bal0gPSBzTm9ybTsKKwkJCQlkYXRhSVswXVtqXSA9IGlOb3JtOworCQkJCWRhdGFSWzBdW2pdID0gck5vcm07CisJCQkJZGF0YUVbMF1bal0gPSBlTm9ybTsKKwkJCQkvLyBieSBkZWZhdWx0LCBzZWxlY3RlZCBkYXRhIGlzIHRoZSBTQU1FCisJCQkJZGF0YVNbMV1bal0gPSBzTm9ybTsKKwkJCQlkYXRhSVsxXVtqXSA9IGlOb3JtOworCQkJCWRhdGFSWzFdW2pdID0gck5vcm07CisJCQkJZGF0YUVbMV1bal0gPSBlTm9ybTsKKwkJCQkKKwkJCQlpZigoc05vcm08PW1heFN0aHJlc2hvbGQpJiYoc05vcm0+PW1pblN0aHJlc2hvbGQpJiYoaU5vcm0+PW1pbkl0aHJlc2hvbGQpJiYock5vcm08PW1heFJ0aHJlc2hvbGQpKSB7CisJCQkJCQlkb3VibGUgbnVtZXIgPSAocEF2Z1tqXSpyQXZnW2pdKSAvIHNBdmdbal07CisJCQkJCQlkb3VibGUgeFZhbHVlID0gIG51bWVyLyBpQXZnW2pdOworCQkJCQkJZG91YmxlIHlWYWx1ZSA9IChwQXZnW2pdKiBkbG5TW2pdKSAvIGlBdmdbal07CisJCQkJCQl4TGlzdDEuYWRkKG5ldyBEb3VibGUoeFZhbHVlKSApOworCQkJCQkJeUxpc3QxLmFkZChuZXcgRG91YmxlKHlWYWx1ZSkpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vICoqKiogZm9yIHBsb3R0aW5nICoqKioqKgorCQkJCQkvLyBoZXJlIHdlIGRlZmluZSBTKiwgSSosIFIqCisJCQkJCS8vIE5PVCBTZWxlY3RlZCA9IDAuMAorCQkJCQlkYXRhU1sxXVtqXSA9IDAuMDsKKwkJCQkJZGF0YUlbMV1bal0gPSAwLjA7CisJCQkJCWRhdGFSWzFdW2pdID0gMC4wOworCQkJCQkvLy8vKioqKioqKioqKioqKioqKioqLy8vLy8KKwkJCQl9CisJCQl9Ly8gZm9yIGoKKwkJCQorCQkJTGluZWFyTGVhc3RTcXVhcmVzRml0IGxpbmVGaXQxICA9IG51bGw7CisJCQlpZih4TGlzdDEuc2l6ZSgpID4gMikgeworCQkJCWxpbmVGaXQxID0gbmV3IExpbmVhckxlYXN0U3F1YXJlc0ZpdCh4TGlzdDEseUxpc3QxKTsKKwkJCQkvLyBpbmNwdAorCQkJCWRvdWJsZSBiZXRhIAk9IC0xLjAqbGluZUZpdDEuZ2V0SW50ZXJjZXB0KCk7IAorCQkJCWRvdWJsZSB2YXJCZXRhIAk9IGxpbmVGaXQxLmdldEludGVyY2VwdFZhcmlhbmNlKCk7CisJCQkJZG91YmxlIHN0ZEJldGEgCT0gbGluZUZpdDEuZ2V0SW50ZXJjZXB0U3RkRGV2KCk7CisJCQkJLy8gc2xvcGUKKwkJCQlkb3VibGUgYWxwaGEgCT0gbGluZUZpdDEuZ2V0U2xvcGUoKTsKKwkJCQlkb3VibGUgdmFyQWxwaGEgPSBsaW5lRml0MS5nZXRTbG9wZVZhcmlhbmNlKCk7CisJCQkJZG91YmxlIHN0ZEFscGhhID0gbGluZUZpdDEuZ2V0U2xvcGVTdGREZXYoKTsKKwkJCQlkb3VibGUgbmV3YmV0YSA9IGJldGE7CisJCQkJaWYoIXVzZUZyZXFEZXBlbmRhbnRCZXRhKSBuZXdiZXRhICo9ICgoTW9kZWxQYXJhbWV0ZXJzLlJFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFkpL2xvY2FsRGVuc2l0eSk7CisJCQkJZml0dGVkUGFybXMuYWRkUGFyYW1ldGVyKFBhcmFtZXRlci5CRVRBLCBuZXcgUGFyYW1ldGVyKFBhcmFtZXRlci5CRVRBLCBuZXdiZXRhLCBzdGRCZXRhLCB2YXJCZXRhKSk7CisJCQkJZml0dGVkUGFybXMuYWRkUGFyYW1ldGVyKFBhcmFtZXRlci5BTFBIQSwgbmV3IFBhcmFtZXRlcihQYXJhbWV0ZXIuQUxQSEEsIGFscGhhLCBzdGRBbHBoYSwgdmFyQWxwaGEpKTsKKwkJCQkvLyBmaXQKKwkJCQlmb3IgKGludCBpID0gMDsgaTwgeExpc3QxLnNpemUoKTsgaSArKykgeworCQkJCQlkb3VibGUgdmFsID0gKGxpbmVGaXQxLmdldFNsb3BlKCkqeExpc3QxLmdldChpKS5kb3VibGVWYWx1ZSgpKSArIGxpbmVGaXQxLmdldEludGVyY2VwdCgpOyAKKwkJCQkJZml0TGlzdDEuYWRkKG5ldyBEb3VibGUodmFsKSk7CisJCQkJfQorCQkJfSAvLyBpZiBmaXQgdmFsaWQKKwkJCWVsc2UgeworCQkJCXJlamVjdENvdW50ICs9IDEuMDsKKwkJCX0KKwkJCQorCQorCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCQkvL0VxdWF0aW9uIDIgKz4gZEUvZHQgc2Vjb25kIGZpdCBmb3IgYmV0YSBhbmQgZXBzaWxvbgorCQkJTGlzdDxEb3VibGU+IHhMaXN0MiA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJTGlzdDxEb3VibGU+IHlMaXN0MiA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJTGlzdDxEb3VibGU+IGZpdExpc3QyID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQkKKwkJCS8veCwgeSBmb3IgbGVhc3Qgc3F1YXJlcyBmaXR0aW5nIHRvIGxpbmUgeSA9IGJldGEqeCAtIGVwc2lsb24KKwkJCWZvcihpbnQgaiA9IDA7IGogPCBucHRzLTE7IGorKyl7CisJCQkJZG91YmxlIHNOb3JtID0gc0F2Z1tqXS9zTWF4OworCQkJCS8vZG91YmxlIGlOb3JtID0gaUF2Z1tqXS9pTWF4OworCQkJCWRvdWJsZSBlTm9ybSA9IGVBdmdbal0vZU1heDsKKwkJCQlpZigoc05vcm08PW1heFN0aHJlc2hvbGQpJiYoc05vcm0+PW1pblN0aHJlc2hvbGQpJiYoZU5vcm0+PW1pbkV0aHJlc2hvbGQpICkgeworCQkJCQkvLyBpZiBkYXRhIGluIHJhbmdlCisJCQkJCWRvdWJsZSB4VmFsdWUgPSAoc0F2Z1tqXSAqIGlBdmdbal0pIC8gKHBBdmdbal0qZUF2Z1tqXSk7CisJCQkJCWRvdWJsZSB5VmFsdWUgPSBkbG5FW2pdOworCQkJCQl4TGlzdDIuYWRkKG5ldyBEb3VibGUoeFZhbHVlKSk7CisJCQkJCXlMaXN0Mi5hZGQobmV3IERvdWJsZSh5VmFsdWUpKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyAqKioqIGZvciBwbG90dGluZyAqKioqKioKKwkJCQkJLy8gaGVyZSB3ZSBkZWZpbmUgRSoKKwkJCQkJLy8gTk9UIFNlbGVjdGVkID0gMC4wCisJCQkJCWRhdGFFWzFdW2pdID0gMC4wOworCQkJCQkvLy8vKioqKioqKioqKioqKioqKioqLy8vLy8KKwkJCQl9CisJCQl9CisJCQkvLyBUT0RPOiAgUGxvdCByZXN0cmljdGVkIGRhdGEKKwkJCUxpbmVhckxlYXN0U3F1YXJlc0ZpdCBsaW5lRml0MiAgPSBudWxsOworCQkJaWYoeExpc3QyLnNpemUoKSA+IDIpIHsKKwkJCQlsaW5lRml0MiA9IG5ldyBMaW5lYXJMZWFzdFNxdWFyZXNGaXQoeExpc3QyLHlMaXN0Mik7CisJCQkJLy8gaW5jcHQKKwkJCQlkb3VibGUgZXBzaWxvbgkJPSAtMS4wKmxpbmVGaXQyLmdldEludGVyY2VwdCgpOyAKKwkJCQlkb3VibGUgdmFyRXBzaWxvbiAJPSBsaW5lRml0Mi5nZXRJbnRlcmNlcHRWYXJpYW5jZSgpOworCQkJCWRvdWJsZSBzdGRFcHNpbG9uIAk9IGxpbmVGaXQyLmdldEludGVyY2VwdFN0ZERldigpOworCQkJCS8vIHNsb3BlCisJCQkJZG91YmxlIGJldGEyIAkJPSBsaW5lRml0Mi5nZXRTbG9wZSgpOworCQkJCWRvdWJsZSB2YXJCZXRhMgkJPSBsaW5lRml0Mi5nZXRTbG9wZVZhcmlhbmNlKCk7CisJCQkJZG91YmxlIHN0ZEJldGEyIAk9IGxpbmVGaXQyLmdldFNsb3BlU3RkRGV2KCk7CisJCQkJZG91YmxlIG5ld2JldGEyID0gYmV0YTIgOworCQkJCWlmKCF1c2VGcmVxRGVwZW5kYW50QmV0YSkgbmV3YmV0YTIgKj0gKChNb2RlbFBhcmFtZXRlcnMuUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWSkvbG9jYWxEZW5zaXR5KTsKKwkJCQlmaXR0ZWRQYXJtcy5hZGRQYXJhbWV0ZXIoUGFyYW1ldGVyLkJFVEEyLCBuZXcgUGFyYW1ldGVyKFBhcmFtZXRlci5CRVRBMiwgbmV3YmV0YTIsIHN0ZEJldGEyLCB2YXJCZXRhMikpOworCQkJCWZpdHRlZFBhcm1zLmFkZFBhcmFtZXRlcihQYXJhbWV0ZXIuRVBTSUxPTiwgbmV3IFBhcmFtZXRlcihQYXJhbWV0ZXIuRVBTSUxPTiwgZXBzaWxvbiwgc3RkRXBzaWxvbiwgdmFyRXBzaWxvbikpOworCQkJCS8vIGZpdCAyCisJCQkJZm9yIChpbnQgaSA9IDA7IGk8IHhMaXN0Mi5zaXplKCk7IGkgKyspIHsKKwkJCQkJZG91YmxlIHZhbCA9IChsaW5lRml0Mi5nZXRTbG9wZSgpKnhMaXN0Mi5nZXQoaSkuZG91YmxlVmFsdWUoKSkgKyBsaW5lRml0Mi5nZXRJbnRlcmNlcHQoKTsgCisJCQkJCWZpdExpc3QyLmFkZChuZXcgRG91YmxlKHZhbCkpOworCQkJCX0KKwkJCX0vLyBpZiBmaXQgdmFsaWQKKwkJCWVsc2UgeworCQkJCXJlamVjdENvdW50ICs9IDEuMDsKKwkJCX0KKwkJCQorCQkJCisJCQkKKwkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCS8vRXF1YXRpb24gMy4gdGhpcmQgZmluZCBlcHNpbG9uIGFuZCBnYW1tYQorCQkJTGlzdDxEb3VibGU+IHhMaXN0MyA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJTGlzdDxEb3VibGU+IHlMaXN0MyA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJTGlzdDxEb3VibGU+IGZpdExpc3QzID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQkKKwkJCS8vZGVyaXZhdGl2ZXMgb2YgYWxsIG90aGVyIHBvaW50cworCQkJZm9yKGludCBqID0gMDtqIDwgbnB0cy0xO2orKykKKwkJCXsKKwkJCQlkb3VibGUgaU5vcm0gPSBpQXZnW2pdL2lNYXg7CisJCQkJZG91YmxlIGVOb3JtID0gZUF2Z1tqXS9lTWF4OworCQkJCWlmKChpTm9ybT49bWluSXRocmVzaG9sZCkmJihlTm9ybT49bWluRXRocmVzaG9sZCkgKSB7CisJCQkJCXhMaXN0My5hZGQobmV3IERvdWJsZShlQXZnW2pdIC8gaUF2Z1tqXSApICk7CisJCQkJCXlMaXN0My5hZGQobmV3IERvdWJsZShkbG5JW2pdKSk7CisJCQkJfQorCQkJfQorCQkJLy8gVE9ETzogIFBsb3QgcmVzdHJpY3RlZCBkYXRhCisJCQlMaW5lYXJMZWFzdFNxdWFyZXNGaXQgbGluZUZpdDMgPSBudWxsOworCQkJaWYoeExpc3QzLnNpemUoKSA+IDIpIHsKKwkJCQlsaW5lRml0MyA9IG5ldyBMaW5lYXJMZWFzdFNxdWFyZXNGaXQoeExpc3QzLHlMaXN0Myk7CisJCQkJLy8gaW5jcHQKKwkJCQlkb3VibGUgZ2FtbWEJCT0gLTEuMCpsaW5lRml0My5nZXRJbnRlcmNlcHQoKTsgCisJCQkJZG91YmxlIHZhckdhbW1hIAk9IGxpbmVGaXQzLmdldEludGVyY2VwdFZhcmlhbmNlKCk7CisJCQkJZG91YmxlIHN0ZEdhbW1hIAk9IGxpbmVGaXQzLmdldEludGVyY2VwdFN0ZERldigpOworCQkJCS8vIHNsb3BlCisJCQkJZG91YmxlIGVwc2lsb24yIAkJPSBsaW5lRml0My5nZXRTbG9wZSgpOworCQkJCWRvdWJsZSB2YXJFcHNpbG9uMgkJPSBsaW5lRml0My5nZXRTbG9wZVZhcmlhbmNlKCk7CisJCQkJZG91YmxlIHN0ZEVwc2lsb24yIAkJPSBsaW5lRml0My5nZXRTbG9wZVN0ZERldigpOworCQkJCWZpdHRlZFBhcm1zLmFkZFBhcmFtZXRlcihQYXJhbWV0ZXIuR0FNTUEsIG5ldyBQYXJhbWV0ZXIoUGFyYW1ldGVyLkdBTU1BLCBnYW1tYSwgc3RkR2FtbWEsIHZhckdhbW1hKSk7CisJCQkJZml0dGVkUGFybXMuYWRkUGFyYW1ldGVyKFBhcmFtZXRlci5FUFNJTE9OMiwgbmV3IFBhcmFtZXRlcihQYXJhbWV0ZXIuRVBTSUxPTjIsIGVwc2lsb24yLCBzdGRFcHNpbG9uMiwgdmFyRXBzaWxvbjIpKTsJCQorCQkJCS8vIGZpdCAzCisJCQkJZm9yIChpbnQgaSA9IDA7IGk8IHhMaXN0My5zaXplKCk7IGkgKyspIHsKKwkJCQkJZG91YmxlIHZhbCA9IChsaW5lRml0My5nZXRTbG9wZSgpKnhMaXN0My5nZXQoaSkuZG91YmxlVmFsdWUoKSkgKyBsaW5lRml0My5nZXRJbnRlcmNlcHQoKTsgCisJCQkJCWZpdExpc3QzLmFkZChuZXcgRG91YmxlKHZhbCkpOworCQkJCX0KKwkJCX0vLyBpZiBmaXQgdmFsaWQKKwkJCWVsc2UgeworCQkJCXJlamVjdENvdW50ICs9IDEuMDsKKwkJCX0KKwkJCQorCQkKKwkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCS8vIEVxdWF0aW9uIDQuICBmaW5kIGdhbW1hIGFuZCBhbHBoYQorCQkJLy8gbGVhc3Qgc3F1YXJlcyBmaXR0aW5nIHRvIGxpbmUgeSA9IGdhbW1hKnggLSBhbHBoYQorCQkJTGlzdDxEb3VibGU+IHhMaXN0NCA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJTGlzdDxEb3VibGU+IHlMaXN0NCA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJTGlzdDxEb3VibGU+IGZpdExpc3Q0ID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQkKKwkJCS8vZGVyaXZhdGl2ZXMgb2YgYWxsIG90aGVyIHBvaW50cworCQkJZm9yKGludCBqID0gMDtqIDwgbnB0cy0xO2orKykgeworCQkJCWRvdWJsZSBpTm9ybSA9IGlBdmdbal0vaU1heDsKKwkJCQlkb3VibGUgck5vcm0gPSByQXZnW2pdL3JNYXg7CisJCQkJaWYoKGlOb3JtPj1taW5JdGhyZXNob2xkKSYmKHJOb3JtPj1taW5SdGhyZXNob2xkKSYmKHJOb3JtPD1tYXhSdGhyZXNob2xkKSApIHsKKwkJCQkJeExpc3Q0LmFkZChuZXcgRG91YmxlKGlBdmdbal0gLyByQXZnW2pdICkgKTsKKwkJCQkJeUxpc3Q0LmFkZChuZXcgRG91YmxlKGRsblJbal0pKTsKKwkJCQl9CisJCQl9CisJCQkvLyBUT0RPOiAgUGxvdCByZXN0cmljdGVkIGRhdGEKKwkJCUxpbmVhckxlYXN0U3F1YXJlc0ZpdCBsaW5lRml0NCA9IG51bGw7CisJCQlpZih4TGlzdDQuc2l6ZSgpID4gMikgeworCQkJCWxpbmVGaXQ0ID0gbmV3IExpbmVhckxlYXN0U3F1YXJlc0ZpdCh4TGlzdDQseUxpc3Q0KTsKKwkJCQkvLyBpbmNwdAorCQkJCS8vIFRPRE8gd2h5IGlzIHRoaXMgY29taW5nIG91dCBuZWdhdGl2ZSBzb21ldGltZXM/CisJCQkJZG91YmxlIGFscGhhMiAJCT0gTWF0aC5hYnMoLTEuMCpsaW5lRml0NC5nZXRJbnRlcmNlcHQoKSk7CisJCQkJZG91YmxlIHZhckFscGhhMgk9IGxpbmVGaXQ0LmdldEludGVyY2VwdFZhcmlhbmNlKCk7CisJCQkJZG91YmxlIHN0ZEFscGhhMgk9IGxpbmVGaXQ0LmdldEludGVyY2VwdFN0ZERldigpOworCQkJCS8vIHNsb3BlCisJCQkJZG91YmxlIGdhbW1hMgkJCT0gbGluZUZpdDQuZ2V0U2xvcGUoKTsKKwkJCQlkb3VibGUgdmFyR2FtbWEyCQk9IGxpbmVGaXQ0LmdldFNsb3BlVmFyaWFuY2UoKTsKKwkJCQlkb3VibGUgc3RkR2FtbWEyIAkJPSBsaW5lRml0NC5nZXRTbG9wZVN0ZERldigpOworCQkJCWZpdHRlZFBhcm1zLmFkZFBhcmFtZXRlcihQYXJhbWV0ZXIuQUxQSEEyLCBuZXcgUGFyYW1ldGVyKFBhcmFtZXRlci5BTFBIQTIsIGFscGhhMiwgc3RkQWxwaGEyLCB2YXJBbHBoYTIpKTsKKwkJCQlmaXR0ZWRQYXJtcy5hZGRQYXJhbWV0ZXIoUGFyYW1ldGVyLkdBTU1BMiwgbmV3IFBhcmFtZXRlcihQYXJhbWV0ZXIuR0FNTUEyLCBnYW1tYTIsIHN0ZEdhbW1hMiwgdmFyR2FtbWEyKSk7CisJCQkJLy8gZml0IDQKKwkJCQlmb3IgKGludCBpID0gMDsgaTwgeExpc3Q0LnNpemUoKTsgaSArKykgeworCQkJCQlkb3VibGUgdmFsID0gKGxpbmVGaXQ0LmdldFNsb3BlKCkqeExpc3Q0LmdldChpKS5kb3VibGVWYWx1ZSgpKSArIGxpbmVGaXQ0LmdldEludGVyY2VwdCgpOyAKKwkJCQkJZml0TGlzdDQuYWRkKG5ldyBEb3VibGUodmFsKSk7CisJCQkJfQorCQkJfS8vIGlmIGZpdCB2YWxpZAorCQkJZWxzZSB7CisJCQkJcmVqZWN0Q291bnQgKz0gMS4wOworCQkJfQorCQkJCQorCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkJLy8gRE9ORQorCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkJZml0dGVkUGFybXMuYWRkUGFyYW1ldGVyKFBhcmFtZXRlci5SRUpFQ1QsIG5ldyBQYXJhbWV0ZXIoUGFyYW1ldGVyLlJFSkVDVCwgcmVqZWN0Q291bnQpKTsJCisJCQlkYXRhVG9QbG90LmFkZChkYXRhUyk7CisJCQlkYXRhVG9QbG90LmFkZChkYXRhSSk7CisJCQlkYXRhVG9QbG90LmFkZChkYXRhUik7CisJCQlkYXRhVG9QbG90LmFkZChkYXRhRSk7CisJCQlmaXR0ZWRQYXJtcy5hZGRTZWxlY3RlZERhdGEobG9jYXRpb25JRCwgZGF0YVRvUGxvdCk7CisJCQkKKwkJCQorCQkJZG91YmxlW11bXSByZWdyZXNzaW9uMSA9IGdldFNvcnRlZFJlZ3Jlc3Npb24oeExpc3QxLCB5TGlzdDEpOyAKKwkJCWRvdWJsZVtdW10gcmVncmVzc2lvbjIgPSBnZXRTb3J0ZWRSZWdyZXNzaW9uKHhMaXN0MiwgeUxpc3QyKTsgCisJCQlkb3VibGVbXVtdIHJlZ3Jlc3Npb24zID0gZ2V0U29ydGVkUmVncmVzc2lvbih4TGlzdDMsIHlMaXN0Myk7IAorCQkJZG91YmxlW11bXSByZWdyZXNzaW9uNCA9IGdldFNvcnRlZFJlZ3Jlc3Npb24oeExpc3Q0LCB5TGlzdDQpOyAKKwkJCQorCQkJZG91YmxlW11bXSBmaXQxID0gZ2V0U29ydGVkUmVncmVzc2lvbih4TGlzdDEsIGZpdExpc3QxKTsgCisJCQlkb3VibGVbXVtdIGZpdDIgPSBnZXRTb3J0ZWRSZWdyZXNzaW9uKHhMaXN0MiwgZml0TGlzdDIpOyAKKwkJCWRvdWJsZVtdW10gZml0MyA9IGdldFNvcnRlZFJlZ3Jlc3Npb24oeExpc3QzLCBmaXRMaXN0Myk7IAorCQkJZG91YmxlW11bXSBmaXQ0ID0gZ2V0U29ydGVkUmVncmVzc2lvbih4TGlzdDQsIGZpdExpc3Q0KTsgCisJCQkKKwkJCXJlZ3Jlc3Npb25WYWx1ZXMuYWRkKHJlZ3Jlc3Npb24xKTsKKwkJCXJlZ3Jlc3Npb25WYWx1ZXMuYWRkKHJlZ3Jlc3Npb24yKTsKKwkJCXJlZ3Jlc3Npb25WYWx1ZXMuYWRkKHJlZ3Jlc3Npb24zKTsKKwkJCXJlZ3Jlc3Npb25WYWx1ZXMuYWRkKHJlZ3Jlc3Npb240KTsKKwkJCQorCQkJCisJCQlmaXR0ZWRWYWx1ZXMuYWRkKGZpdDEpOworCQkJZml0dGVkVmFsdWVzLmFkZChmaXQyKTsKKwkJCWZpdHRlZFZhbHVlcy5hZGQoZml0Myk7CisJCQlmaXR0ZWRWYWx1ZXMuYWRkKGZpdDQpOworCQkJCisJCQlmaXR0ZWRQYXJtcy5hZGRSZWdyZXNzaW9uRGF0YShsb2NhdGlvbklELCByZWdyZXNzaW9uVmFsdWVzKTsKKwkJCWZpdHRlZFBhcm1zLmFkZEZpdHRlZERhdGEobG9jYXRpb25JRCwgZml0dGVkVmFsdWVzKTsKKwkJCQorCQkJCisJCXJldHVybiBmaXR0ZWRQYXJtczsKKwl9IC8vIGVzdGltYXRlCisJCisJCisKKwkKKwkKKwkvKioKKwkgKiBTRUlSIG1vZGVscyBoYXZlIDQgcHJvcGVydGllcworCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLlBhcmFtZXRlckVzdGltYXRvciNnZXROdW1Qcm9wZXJ0aWVzKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldE51bVByb3BlcnRpZXMoKSB7CisJCXJldHVybiA0OworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvU0lScGFyYW1ldGVyRXN0aW1hdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9TSVJwYXJhbWV0ZXJFc3RpbWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWYwNGVlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvU0lScGFyYW1ldGVyRXN0aW1hdG9yLmphdmEKQEAgLTAsMCArMSwzNTAgQEAKKworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuU3RhdGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlOworCisvKioKKyAqIEVzdGltYXRlIHBhcmFtZXRlcnMgZm9yIGFuIFNJUiBtb2RlbAorICogCisgKgorICovCitwdWJsaWMgY2xhc3MgU0lScGFyYW1ldGVyRXN0aW1hdG9yIGV4dGVuZHMgUGFyYW1ldGVyRXN0aW1hdG9yeworCisJLy8gVW5pcXVlIHN0YXRlIGZvciB0aGlzIGVzdGltYXRvcgorCWRvdWJsZSBbXSByOworCQorCXN0YXRpYyBmaW5hbCBkb3VibGUgTUlOQ1VUT0ZGID0gMC4wMDU7CisJCisJLyoqCisJICogQHBhcmFtIGRhdGEKKwkgKi8KKwlwdWJsaWMgU0lScGFyYW1ldGVyRXN0aW1hdG9yKFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGRhdGEpIHsKKwkJCisJCXN1cGVyKGRhdGEpOworCQkKKwkJTGlzdDxEb3VibGU+IHNUb0ZpdCA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQlMaXN0PERvdWJsZT4gaVRvRml0ID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCUxpc3Q8RG91YmxlPiByVG9GaXQgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCisJCUxpc3Q8RG91YmxlPiBpTGlzdCA9IGRhdGEuZ2V0RGF0YSgpLmdldChTdGF0ZXMuc3RhdGVzVG9GaXRbU3RhdGVzLklORkVDVElPVVNdKTsKKwkJTGlzdDxEb3VibGU+IHNMaXN0ID0gZGF0YS5nZXREYXRhKCkuZ2V0KFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuU1VTQ0VQVElCTEVdKTsKKwkJTGlzdDxEb3VibGU+IHJMaXN0ID0gZGF0YS5nZXREYXRhKCkuZ2V0KFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuUkVDT1ZFUkVEXSk7CisJCQorCQkvLyBUb0RvOiBXaHkgYXJlIHdlIHNraXBwaW5nIHRoZSBmaXJzdCB2YWx1ZT8KKwkJZm9yIChpbnQgaWNvdW50ID0gMTsgaWNvdW50IDwgaUxpc3Quc2l6ZSgpOyBpY291bnQgKyspIHsKKwkJCQlpVG9GaXQuYWRkKGlMaXN0LmdldChpY291bnQpKTsKKwkJCQlzVG9GaXQuYWRkKHNMaXN0LmdldChpY291bnQpKTsKKwkJCQlyVG9GaXQuYWRkKHJMaXN0LmdldChpY291bnQpKTsKKwkJfQorCQkKKwkJdGhpcy5udW1EYXRhUG9pbnRzID0gaVRvRml0LnNpemUoKTsKKwkJaWYobnVtRGF0YVBvaW50cyA8IE1JTlNJWkUpIHJldHVybjsKKwkJZGF0YVZhbGlkID0gdHJ1ZTsKKwkJdGhpcy5wID0gbmV3IGRvdWJsZVt0aGlzLm51bURhdGFQb2ludHNdOworCQl0aGlzLnMgPSBuZXcgZG91YmxlW3RoaXMubnVtRGF0YVBvaW50c107CisJCXRoaXMuaSA9IG5ldyBkb3VibGVbdGhpcy5udW1EYXRhUG9pbnRzXTsKKwkJdGhpcy5yID0gbmV3IGRvdWJsZVt0aGlzLm51bURhdGFQb2ludHNdOworCQl0aGlzLnQgPSBuZXcgZG91YmxlW3RoaXMubnVtRGF0YVBvaW50c107CisJCSAKKwkJZm9yIChpbnQgaWNvdW50ID0gMDsgaWNvdW50IDwgdGhpcy5udW1EYXRhUG9pbnRzOyBpY291bnQgKyspIHsKKwkJCXNbaWNvdW50XSA9IHNUb0ZpdC5nZXQoaWNvdW50KS5kb3VibGVWYWx1ZSgpOworCQkJaVtpY291bnRdID0gaVRvRml0LmdldChpY291bnQpLmRvdWJsZVZhbHVlKCk7CisJCQlyW2ljb3VudF0gPSByVG9GaXQuZ2V0KGljb3VudCkuZG91YmxlVmFsdWUoKTsKKwkJCXBbaWNvdW50XSA9IHNbaWNvdW50XStpW2ljb3VudF0rcltpY291bnRdOworCQkJdFtpY291bnRdID0gaWNvdW50OworCQl9Ly8gZm9yIGljb3VudAorCX0vLyBjb25zdHJ1Y3RvcgorCisKKwkvKioKKwkgKiBFc3RpbWF0ZSB0aGUgcGFyYW1ldGVycworCSAqIEBwYXJhbSBsb2NhbERlbnNpdHkgCisJICogQHBhcmFtIGxvY2FsUG9wdWxhdGlvbiAKKwkgKiBAcGFyYW0gbG9jYXRpb25JRCAKKwkgKiBAcmV0dXJuIHRoZSBNb2RlbFBhcmFtZXRlcnMgZXN0aW1hdGUKKwkgKi8KKwlwdWJsaWMgTW9kZWxQYXJhbWV0ZXJzIGVzdGltYXRlKGRvdWJsZSBsb2NhbERlbnNpdHksIGRvdWJsZSBsb2NhbFBvcHVsYXRpb24sIFN0cmluZyBsb2NhdGlvbklEKSB7CisKKwkJTW9kZWxQYXJhbWV0ZXJzIGZpdHRlZFBhcm1zID0gbmV3IE1vZGVsUGFyYW1ldGVycygpOworCQkKKwkJLy9kb3VibGUgcmVwb3J0QmV0YTEgPSAwOworCQkvL2RvdWJsZSByZXBvcnRCZXRhMiA9IDA7CisJCQorCQkJCQorCQlpbnQgbnB0cyA9IHMubGVuZ3RoOworCQlhc3NlcnQobnB0cz09aS5sZW5ndGgpOworCQlhc3NlcnQobnB0cz09ci5sZW5ndGgpOworCQkKKwkJCWRvdWJsZVtdIGxuUyA9IG5ldyBkb3VibGVbbnB0c107CisJCQlkb3VibGVbXSBkbG5TID0gbmV3IGRvdWJsZVtucHRzLTFdOworCQkJZG91YmxlW10gbG5JID0gbmV3IGRvdWJsZVtucHRzXTsKKwkJCWRvdWJsZVtdIGRsbkkgPSBuZXcgZG91YmxlW25wdHMtMV07CisJCQlkb3VibGVbXSBsblIgPSBuZXcgZG91YmxlW25wdHNdOworCQkJZG91YmxlW10gZGxuUiA9IG5ldyBkb3VibGVbbnB0cy0xXTsKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCisJCQkKKwkJCS8vIGF2ZXJhZ2UgdmFsdWVzIGFib3V0IGRlcml2YXRpdmUKKwkJCWRvdWJsZVtdIHNBdmcgPSBuZXcgZG91YmxlW25wdHMtMV07CisJCQlkb3VibGVbXSBpQXZnID0gbmV3IGRvdWJsZVtucHRzLTFdOworCQkJZG91YmxlW10gckF2ZyA9IG5ldyBkb3VibGVbbnB0cy0xXTsKKwkJCWRvdWJsZVtdIHBBdmcgPSBuZXcgZG91YmxlW25wdHMtMV07CisJCQlkb3VibGVbXVtdIGRhdGFTID0gbmV3IGRvdWJsZVsyXVtucHRzIC0gMV07CisJCQlkb3VibGVbXVtdIGRhdGFJID0gbmV3IGRvdWJsZVsyXVtucHRzIC0gMV07CisJCQlkb3VibGVbXVtdIGRhdGFSID0gbmV3IGRvdWJsZVsyXVtucHRzIC0gMV07CisJCQkgICAgICAgIAorCQkJLy8gZ2V0IHRoZSBsb2dhcml0aG1zCisJCQlkb3VibGUgY3V0b2ZmID0gMC4wMDAwMDAwMDA1OworCisJCQlmb3IoaW50IGogPSAwOyBqIDwgbnB0czsgaisrKXsKKwkJCQlpZihzW2pdID49IGN1dG9mZikgeworCQkJCQlsblNbal0gPSBNYXRoLmxvZyhzW2pdKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsblNbal0gPSBNYXRoLmxvZyhjdXRvZmYpOyAgLy8gVE9ETyBmaXggdGhpcworCQkJCX0KKwkJCQlpZihpW2pdID49IGN1dG9mZikgeworCQkJCQlsbklbal0gPSBNYXRoLmxvZyhpW2pdKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsbklbal0gPSBNYXRoLmxvZyhjdXRvZmYpOyAgLy8gVE9ETyBmaXggdGhpcworCQkJCX0KKwkJCQlpZihyW2pdID49IGN1dG9mZikgeworCQkJCQlsblJbal0gPSBNYXRoLmxvZyhyW2pdKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsblJbal0gPSBNYXRoLmxvZyhjdXRvZmYpOyAgLy8gVE9ETyBmaXggdGhpcworCQkJCX0KKwkJCX0KKwkJCQorCQkJLy9kZXJpdmF0aXZlcyBvZiBsb2dhcml0aG1zIGFuZCBhdmVyYWdlcyBvZiBvdGhlciBwb2ludHMKKwkJCWRvdWJsZSBzTWF4ID0gMC4wOworCQkJZG91YmxlIGlNYXggPSAwLjA7CisJCQlkb3VibGUgck1heCA9IDAuMDsKKwkJCWZvcihpbnQgaiA9IDE7aiA8IG5wdHMtMTtqKyspCisJCQl7CisJCQkJZGxuU1tqLTFdID0gKGxuU1tqXS1sblNbai0xXSk7IC8vIGR0ID0gMQorCQkJCQorCQkJCWRsbklbai0xXSA9IChsbklbal0tbG5JW2otMV0pOyAvLyBkdCA9IDEKKwkJCQlkbG5SW2otMV0gPSAobG5SW2pdLWxuUltqLTFdKTsgLy8gZHQgPSAxCisJCQkJCisJCQkJc0F2Z1tqLTFdID0gKHNbal0gKyBzW2otMV0pLzIuMDsKKwkJCQlpQXZnW2otMV0gPSAoaVtqXSArIGlbai0xXSkvMi4wOworCQkJCXJBdmdbai0xXSA9IChyW2pdICsgcltqLTFdKS8yLjA7CisJCQkJCQkJCQorCQkJCWlmKHNBdmdbai0xXSA+PSBzTWF4KSBzTWF4ID0gc0F2Z1tqLTFdOworCQkJCWlmKGlBdmdbai0xXSA+PSBpTWF4KSBpTWF4ID0gaUF2Z1tqLTFdOworCQkJCWlmKHJBdmdbai0xXSA+PSByTWF4KSByTWF4ID0gckF2Z1tqLTFdOworCQkJCQorCQkJCXBBdmdbai0xXSA9IChwW2pdICsgcFtqLTFdKS8yLjA7CisJCQl9CisJCQkKKwkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwkJCQorCQkJLy8gZFMvZHQtPiBlcXVhdGlvbiAxLgorCQkJLy94LCB5IGZvciBsZWFzdCBzcXVhcmVzIGZpdHRpbmcgdG8gbGluZSB5ID0gYWxwaGEqeCAtIGJldGEKKwkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkJLy8KKwkJCUxpc3Q8RG91YmxlPiB4TGlzdDEgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCUxpc3Q8RG91YmxlPiB5TGlzdDEgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCUxpc3Q8RG91YmxlPiBmaXRMaXN0MSA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJZm9yKGludCBqID0gMDsgaiA8IG5wdHMtMTsgaisrKXsKKwkJCQlkb3VibGUgc05vcm0gPSBzQXZnW2pdL3NNYXg7CisJCQkJZG91YmxlIGlOb3JtID0gaUF2Z1tqXS9pTWF4OworCQkJCWRvdWJsZSByTm9ybSA9IHJBdmdbal0vck1heDsKKwkJCQkKKwkJCQlkYXRhU1swXVtqXSA9IHNOb3JtOworCQkJCWRhdGFJWzBdW2pdID0gaU5vcm07CisJCQkJZGF0YVJbMF1bal0gPSByTm9ybTsKKwkJCQkvLyBieSBkZWZhdWx0LCBzZWxlY3RlZCBkYXRhIGlzIHRoZSBTQU1FCisJCQkJZGF0YVNbMV1bal0gPSBzTm9ybTsKKwkJCQlkYXRhSVsxXVtqXSA9IGlOb3JtOworCQkJCWRhdGFSWzFdW2pdID0gck5vcm07CisJCQkJCisJCQkJaWYoKHNOb3JtPD1tYXhTdGhyZXNob2xkKSYmKHNOb3JtPj1taW5TdGhyZXNob2xkKSYmKGlOb3JtPj1taW5JdGhyZXNob2xkKSYmKHJOb3JtPD1tYXhSdGhyZXNob2xkKSkgeworCQkJCQlkb3VibGUgbnVtZXIgPSAocEF2Z1tqXSpyQXZnW2pdKSAvIHNBdmdbal07CisJCQkJCXhMaXN0MS5hZGQobmV3IERvdWJsZSggbnVtZXIvIGlBdmdbal0gKSApOworCQkJCQl5TGlzdDEuYWRkKG5ldyBEb3VibGUoIGRsblNbal0gKiAocEF2Z1tqXS9pQXZnW2pdKSAgKSk7CisJCQkJCQorCQkJCX1lbHNlIHsKKwkJCQkJLy8gKioqKiBmb3IgcGxvdHRpbmcgKioqKioqCisJCQkJCS8vIGhlcmUgd2UgZGVmaW5lIFMqLCBJKiwgUioKKwkJCQkJLy8gTk9UIFNlbGVjdGVkID0gMC4wCisJCQkJCWRhdGFTWzFdW2pdID0gMC4wOworCQkJCQlkYXRhSVsxXVtqXSA9IDAuMDsKKwkJCQkJZGF0YVJbMV1bal0gPSAwLjA7CisJCQkJCS8vLy8qKioqKioqKioqKioqKioqKiovLy8vLworCQkJCX0KKwkJCX0KKwkJCUxpbmVhckxlYXN0U3F1YXJlc0ZpdCBsaW5lRml0MSA9IG51bGw7CisJCQlpZih4TGlzdDEuc2l6ZSgpID4yKSB7CisJCQkJbGluZUZpdDEgPSBuZXcgTGluZWFyTGVhc3RTcXVhcmVzRml0KHhMaXN0MSx5TGlzdDEpOworCQkJCS8vIGluY3B0CisJCQkJZG91YmxlIGJldGEgCT0gLTEuMCpsaW5lRml0MS5nZXRJbnRlcmNlcHQoKTsKKwkJCQlkb3VibGUgdmFyQmV0YSAJPSBsaW5lRml0MS5nZXRJbnRlcmNlcHRWYXJpYW5jZSgpOworCQkJCWRvdWJsZSBzdGRCZXRhIAk9IGxpbmVGaXQxLmdldEludGVyY2VwdFN0ZERldigpOworCQkJCS8vIHNsb3BlCisJCQkJZG91YmxlIGFscGhhIAk9IGxpbmVGaXQxLmdldFNsb3BlKCk7CisJCQkJZG91YmxlIHZhckFscGhhID0gbGluZUZpdDEuZ2V0U2xvcGVWYXJpYW5jZSgpOworCQkJCWRvdWJsZSBzdGRBbHBoYSA9IGxpbmVGaXQxLmdldFNsb3BlU3RkRGV2KCk7CisJCQkJZG91YmxlIG5ld2JldGEgPSBiZXRhOworCQkJCS8vcmVwb3J0QmV0YTEgPSBiZXRhOworCQkJCWlmKCF1c2VGcmVxRGVwZW5kYW50QmV0YSkgbmV3YmV0YSAqPSAoKE1vZGVsUGFyYW1ldGVycy5SRUZFUkVOQ0VfUE9QVUxBVElPTl9ERU5TSVRZKS9sb2NhbERlbnNpdHkpOworCQkJCWZpdHRlZFBhcm1zLmFkZFBhcmFtZXRlcihQYXJhbWV0ZXIuQkVUQSwgbmV3IFBhcmFtZXRlcihQYXJhbWV0ZXIuQkVUQSwgbmV3YmV0YSwgc3RkQmV0YSwgdmFyQmV0YSkpOworCQkJCWZpdHRlZFBhcm1zLmFkZFBhcmFtZXRlcihQYXJhbWV0ZXIuQUxQSEEsIG5ldyBQYXJhbWV0ZXIoUGFyYW1ldGVyLkFMUEhBLCBhbHBoYSwgc3RkQWxwaGEsIHZhckFscGhhKSk7CisJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImJldGExID0gIituZXdiZXRhKyIsIGFscGhhMSA9ICIrYWxwaGEpOworCQkJCQorCQkJCS8vIGZpdCAxCisJCQkJZm9yIChpbnQgaSA9IDA7IGk8IHhMaXN0MS5zaXplKCk7IGkgKyspIHsKKwkJCQkJZG91YmxlIHZhbCA9ICgtbGluZUZpdDEuZ2V0U2xvcGUoKSp4TGlzdDEuZ2V0KGkpLmRvdWJsZVZhbHVlKCkpICsgbGluZUZpdDEuZ2V0SW50ZXJjZXB0KCk7IAorCQkJCQlmaXRMaXN0MS5hZGQobmV3IERvdWJsZSh2YWwpKTsKKwkJCQl9CisJCQl9Ly8gaWYgZml0IHZhbGlkCisJCQllbHNlIHsKKwkJCQlyZWplY3RDb3VudCArPSAxLjA7CisJCQl9CisJCQkKKwkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkJLy9FcXVhdGlvbiAyICs+IGRJL2R0IHNlY29uZCBmaXQgZm9yIGJldGEgYW5kIGVwc2lsb24KKwkJCUxpc3Q8RG91YmxlPiB4TGlzdDIgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCUxpc3Q8RG91YmxlPiB5TGlzdDIgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCUxpc3Q8RG91YmxlPiBmaXRMaXN0MiA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJLy94LCB5IGZvciBsZWFzdCBzcXVhcmVzIGZpdHRpbmcgdG8gbGluZSB5ID0gYmV0YSp4IC0gZXBzaWxvbgorCQkJZm9yKGludCBqID0gMDsgaiA8IG5wdHMtMTsgaisrKXsKKwkJCQlkb3VibGUgc05vcm0gPSBzQXZnW2pdL3NNYXg7CisJCQkJZG91YmxlIGlOb3JtID0gaUF2Z1tqXS9pTWF4OworCQkJCWlmKChzTm9ybTw9bWF4U3RocmVzaG9sZCkmJihzTm9ybT49bWluU3RocmVzaG9sZCkmJihpTm9ybT49bWluSXRocmVzaG9sZCkgKSB7CisJCQkJCWRvdWJsZSByYXRpbyA9IHBBdmdbal0gLyBzQXZnW2pdOworCQkJCQl4TGlzdDIuYWRkKG5ldyBEb3VibGUoIHJhdGlvICkpOworCQkJCQl5TGlzdDIuYWRkKG5ldyBEb3VibGUocmF0aW8qZGxuSVtqXSkpOworCQkJCX0vLyBpZiBkYXRhIGluIHJhbmdlCisJCQl9CisJCQkvLyBUT0RPOiAgUGxvdCByZXN0cmljdGVkIGRhdGEKKwkJCUxpbmVhckxlYXN0U3F1YXJlc0ZpdCBsaW5lRml0MiA9IG51bGw7CisJCQlpZih4TGlzdDIuc2l6ZSgpID4gMikgeworCQkJCWxpbmVGaXQyID0gbmV3IExpbmVhckxlYXN0U3F1YXJlc0ZpdCh4TGlzdDIseUxpc3QyKTsKKwkJCQkvLyBzbG9wZQorCQkJCWRvdWJsZSBnYW1tYQkJPSAtMS4wKiBsaW5lRml0Mi5nZXRTbG9wZSgpOyAKKwkJCQlkb3VibGUgdmFyR2FtbWEgCT0gbGluZUZpdDIuZ2V0U2xvcGVWYXJpYW5jZSgpOworCQkJCWRvdWJsZSBzdGRHYW1tYSAJPSBsaW5lRml0Mi5nZXRTbG9wZVN0ZERldigpOworCQkJCS8vIGluY3B0CisJCQkJZG91YmxlIGJldGEyIAkJPSBsaW5lRml0Mi5nZXRJbnRlcmNlcHQoKTsKKwkJCQlkb3VibGUgdmFyQmV0YTIJCT0gbGluZUZpdDIuZ2V0SW50ZXJjZXB0VmFyaWFuY2UoKTsKKwkJCQlkb3VibGUgc3RkQmV0YTIgCT0gbGluZUZpdDIuZ2V0SW50ZXJjZXB0U3RkRGV2KCk7CisJCQkJZG91YmxlIG5ld2JldGEyID0gYmV0YTI7CisJCQkJLy9yZXBvcnRCZXRhMiA9IGJldGEyOworCQkJCWlmKCF1c2VGcmVxRGVwZW5kYW50QmV0YSkgbmV3YmV0YTIgKj0gKChNb2RlbFBhcmFtZXRlcnMuUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWSkvbG9jYWxEZW5zaXR5KTsKKwkJCQlmaXR0ZWRQYXJtcy5hZGRQYXJhbWV0ZXIoUGFyYW1ldGVyLkJFVEEyLCBuZXcgUGFyYW1ldGVyKFBhcmFtZXRlci5CRVRBMiwgbmV3YmV0YTIsIHN0ZEJldGEyLCB2YXJCZXRhMikpOworCQkJCWZpdHRlZFBhcm1zLmFkZFBhcmFtZXRlcihQYXJhbWV0ZXIuR0FNTUEsIG5ldyBQYXJhbWV0ZXIoUGFyYW1ldGVyLkdBTU1BLCBnYW1tYSwgc3RkR2FtbWEsIHZhckdhbW1hKSk7CisJCQkJCisJCQkJLy8gZml0IDIKKwkJCQlmb3IgKGludCBpID0gMDsgaTwgeExpc3QyLnNpemUoKTsgaSArKykgeworCQkJCQlkb3VibGUgdmFsID0gKGxpbmVGaXQyLmdldFNsb3BlKCkqeExpc3QyLmdldChpKS5kb3VibGVWYWx1ZSgpKSArIGxpbmVGaXQyLmdldEludGVyY2VwdCgpOyAKKwkJCQkJZml0TGlzdDIuYWRkKG5ldyBEb3VibGUodmFsKSk7CisJCQkJfQorCQkJCQorCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJiZXRhMiA9ICIrbmV3YmV0YTIrIiwgZ2FtbWExID0gIitnYW1tYSk7CisJCQl9Ly8gaWYgZml0IHZhbGlkCisJCQllbHNlIHsKKwkJCQlyZWplY3RDb3VudCArPSAxLjA7CisJCQl9CisJCQkKKwkJCQorCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkJLy8gRXF1YXRpb24gMy4gIGZpbmQgZ2FtbWEgYW5kIGFscGhhCisJCQkvLyBsZWFzdCBzcXVhcmVzIGZpdHRpbmcgdG8gbGluZSB5ID0gZ2FtbWEqeCAtIGFscGhhCisJCQlMaXN0PERvdWJsZT4geExpc3QzID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQlMaXN0PERvdWJsZT4geUxpc3QzID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQlMaXN0PERvdWJsZT4gZml0TGlzdDMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCS8vZGVyaXZhdGl2ZXMgb2YgYWxsIG90aGVyIHBvaW50cworCQkJZm9yKGludCBqID0gMDtqIDwgbnB0cy0xO2orKykgeworCQkJCWRvdWJsZSBpTm9ybSA9IGlBdmdbal0vaU1heDsKKwkJCQlkb3VibGUgck5vcm0gPSByQXZnW2pdL3JNYXg7CisJCQkJaWYoKGlOb3JtPj1taW5JdGhyZXNob2xkKSYmKHJOb3JtPj1taW5SdGhyZXNob2xkKSYmKHJOb3JtPD1tYXhSdGhyZXNob2xkKSApIHsKKwkJCQkJeExpc3QzLmFkZChuZXcgRG91YmxlKGlBdmdbal0gLyByQXZnW2pdICkgKTsKKwkJCQkJeUxpc3QzLmFkZChuZXcgRG91YmxlKGRsblJbal0pKTsKKwkJCQl9CisJCQl9CisJCQkvLyBUT0RPOiAgUGxvdCByZXN0cmljdGVkIGRhdGEKKwkJCUxpbmVhckxlYXN0U3F1YXJlc0ZpdCBsaW5lRml0MyA9IG51bGw7CisJCQlpZih4TGlzdDMuc2l6ZSgpID4gMikgeworCQkJCWxpbmVGaXQzID0gbmV3IExpbmVhckxlYXN0U3F1YXJlc0ZpdCh4TGlzdDMseUxpc3QzKTsKKwkJCQkvLyBpbmNwdAorCQkJCS8vIFRPRE8gd2h5IGlzIHRoaXMgY29taW5nIG91dCBuZWdhdGl2ZSBzb21ldGltZXM/CisJCQkJZG91YmxlIGFscGhhMiAJCT0gTWF0aC5hYnMoLTEuMCpsaW5lRml0My5nZXRJbnRlcmNlcHQoKSk7IAorCQkJCWRvdWJsZSB2YXJBbHBoYTIJPSBsaW5lRml0My5nZXRJbnRlcmNlcHRWYXJpYW5jZSgpOworCQkJCWRvdWJsZSBzdGRBbHBoYTIJPSBsaW5lRml0My5nZXRJbnRlcmNlcHRTdGREZXYoKTsKKwkJCQkvLyBzbG9wZQorCQkJCWRvdWJsZSBnYW1tYTIJCQk9IGxpbmVGaXQzLmdldFNsb3BlKCk7CisJCQkJZG91YmxlIHZhckdhbW1hMgkJPSBsaW5lRml0My5nZXRTbG9wZVZhcmlhbmNlKCk7CisJCQkJZG91YmxlIHN0ZEdhbW1hMiAJCT0gbGluZUZpdDMuZ2V0U2xvcGVTdGREZXYoKTsKKwkJCQlmaXR0ZWRQYXJtcy5hZGRQYXJhbWV0ZXIoUGFyYW1ldGVyLkFMUEhBMiwgbmV3IFBhcmFtZXRlcihQYXJhbWV0ZXIuQUxQSEEyLCBhbHBoYTIsIHN0ZEFscGhhMiwgdmFyQWxwaGEyKSk7CisJCQkJZml0dGVkUGFybXMuYWRkUGFyYW1ldGVyKFBhcmFtZXRlci5HQU1NQTIsIG5ldyBQYXJhbWV0ZXIoUGFyYW1ldGVyLkdBTU1BMiwgZ2FtbWEyLCBzdGRHYW1tYTIsIHZhckdhbW1hMikpOworCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhbHBoYTIgPSAiK2FscGhhMisiLCBnYW1tYTIgPSAiK2dhbW1hMik7CisJCQkJCisJCQkJLy8gZml0IDMKKwkJCQlmb3IgKGludCBpID0gMDsgaTwgeExpc3QzLnNpemUoKTsgaSArKykgeworCQkJCQlkb3VibGUgdmFsID0gKGxpbmVGaXQzLmdldFNsb3BlKCkqeExpc3QzLmdldChpKS5kb3VibGVWYWx1ZSgpKSArIGxpbmVGaXQzLmdldEludGVyY2VwdCgpOyAKKwkJCQkJZml0TGlzdDMuYWRkKG5ldyBEb3VibGUodmFsKSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlyZWplY3RDb3VudCArPSAxLjA7CisJCQl9CisJCQkKKwkJCWZpdHRlZFBhcm1zLmFkZFBhcmFtZXRlcihQYXJhbWV0ZXIuUkVKRUNULCBuZXcgUGFyYW1ldGVyKFBhcmFtZXRlci5SRUpFQ1QsIHJlamVjdENvdW50KSk7CQorCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkJLy8gRE9ORQorCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkJZGF0YVRvUGxvdC5hZGQoZGF0YVMpOworCQkJZGF0YVRvUGxvdC5hZGQoZGF0YUkpOworCQkJZGF0YVRvUGxvdC5hZGQoZGF0YVIpOworCQkJZml0dGVkUGFybXMuYWRkU2VsZWN0ZWREYXRhKGxvY2F0aW9uSUQsIGRhdGFUb1Bsb3QpOworCQkJCisJCQlkb3VibGVbXVtdIHJlZ3Jlc3Npb24xID0gZ2V0U29ydGVkUmVncmVzc2lvbih4TGlzdDEsIHlMaXN0MSk7IAorCQkJZG91YmxlW11bXSByZWdyZXNzaW9uMiA9IGdldFNvcnRlZFJlZ3Jlc3Npb24oeExpc3QyLCB5TGlzdDIpOyAKKwkJCWRvdWJsZVtdW10gcmVncmVzc2lvbjMgPSBnZXRTb3J0ZWRSZWdyZXNzaW9uKHhMaXN0MywgeUxpc3QzKTsKKwkJCQorCQkJZG91YmxlW11bXSBmaXQxID0gZ2V0U29ydGVkUmVncmVzc2lvbih4TGlzdDEsIGZpdExpc3QxKTsgCisJCQlkb3VibGVbXVtdIGZpdDIgPSBnZXRTb3J0ZWRSZWdyZXNzaW9uKHhMaXN0MiwgZml0TGlzdDIpOyAKKwkJCWRvdWJsZVtdW10gZml0MyA9IGdldFNvcnRlZFJlZ3Jlc3Npb24oeExpc3QzLCBmaXRMaXN0Myk7IAorCQkJCisJCQlyZWdyZXNzaW9uVmFsdWVzLmFkZChyZWdyZXNzaW9uMSk7CisJCQlyZWdyZXNzaW9uVmFsdWVzLmFkZChyZWdyZXNzaW9uMik7CisJCQlyZWdyZXNzaW9uVmFsdWVzLmFkZChyZWdyZXNzaW9uMyk7CisJCQkKKwkJCWZpdHRlZFZhbHVlcy5hZGQoZml0MSk7CisJCQlmaXR0ZWRWYWx1ZXMuYWRkKGZpdDIpOworCQkJZml0dGVkVmFsdWVzLmFkZChmaXQzKTsKKwkKKwkJCWZpdHRlZFBhcm1zLmFkZFJlZ3Jlc3Npb25EYXRhKGxvY2F0aW9uSUQsIHJlZ3Jlc3Npb25WYWx1ZXMpOworCQkJZml0dGVkUGFybXMuYWRkRml0dGVkRGF0YShsb2NhdGlvbklELCBmaXR0ZWRWYWx1ZXMpOworCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIiIrbG9jYWxQb3B1bGF0aW9uKyIsICIrcmVwb3J0QmV0YTErIiwgIityZXBvcnRCZXRhMik7CisJCQkKKwkJcmV0dXJuIGZpdHRlZFBhcm1zOworCX0gLy8gZXN0aW1hdGUKKwkKKwkvKioKKwkgKiBUaGUgY29udHJvbCBuZWVkcyB0aGlzIGluZm9ybWF0aW9uIGJ1dCBtdXN0IGdldCBpdCB0aHJvdWdoIHRoZSBhbmFseXplciBmcm9tIHRoZSBFc3RpbWF0b3IKKwkgKiBjcmVhdGVkIGJ5IHRoZSBmYWN0b3J5CisJICogU0lSIG1vZGVscyBoYXZlIDMgcHJvcGVydGllcworCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLlBhcmFtZXRlckVzdGltYXRvciNnZXROdW1Qcm9wZXJ0aWVzKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldE51bVByb3BlcnRpZXMoKSB7CisJCXJldHVybiAzOworCX0KKwkKKwkKKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL1NJcGFyYW1ldGVyRXN0aW1hdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9TSXBhcmFtZXRlckVzdGltYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NzMwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9TSXBhcmFtZXRlckVzdGltYXRvci5qYXZhCkBAIC0wLDAgKzEsMjQ5IEBACisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLlN0YXRlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZTsKKworLyoqCisgKiBFc3RpbWF0ZSBwYXJhbWV0ZXJzIGZvciBhbiBTSVIgbW9kZWwKKyAqIAorICoKKyAqLworcHVibGljIGNsYXNzIFNJcGFyYW1ldGVyRXN0aW1hdG9yIGV4dGVuZHMgUGFyYW1ldGVyRXN0aW1hdG9yeworCisJLyoqCisJICogQHBhcmFtIGRhdGEgCisJICovCisJcHVibGljIFNJcGFyYW1ldGVyRXN0aW1hdG9yKFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGRhdGEpIHsKKwkJc3VwZXIoZGF0YSk7CisJCQorCQlMaXN0PERvdWJsZT4gc1RvRml0ID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCUxpc3Q8RG91YmxlPiBpVG9GaXQgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCisJCUxpc3Q8RG91YmxlPiBpTGlzdCA9IGRhdGEuZ2V0RGF0YSgpLmdldChTdGF0ZXMuc3RhdGVzVG9GaXRbU3RhdGVzLklORkVDVElPVVNdKTsKKwkJTGlzdDxEb3VibGU+IHNMaXN0ID0gZGF0YS5nZXREYXRhKCkuZ2V0KFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuU1VTQ0VQVElCTEVdKTsKKwkJCisJCS8vIFRvRG86IFdoeSBhcmUgd2Ugc2tpcHBpbmcgdGhlIGZpcnN0IHZhbHVlPworCQlmb3IgKGludCBpY291bnQgPSAxOyBpY291bnQgPCBpTGlzdC5zaXplKCk7IGljb3VudCArKykgeworCQkJCWlUb0ZpdC5hZGQoaUxpc3QuZ2V0KGljb3VudCkpOworCQkJCXNUb0ZpdC5hZGQoc0xpc3QuZ2V0KGljb3VudCkpOworCQl9CisJCQorCQl0aGlzLm51bURhdGFQb2ludHMgPSBpVG9GaXQuc2l6ZSgpOworCQlpZihudW1EYXRhUG9pbnRzIDwgTUlOU0laRSkgcmV0dXJuOworCQlkYXRhVmFsaWQgPSB0cnVlOworCQl0aGlzLnMgPSBuZXcgZG91YmxlW3RoaXMubnVtRGF0YVBvaW50c107CisJCXRoaXMuaSA9IG5ldyBkb3VibGVbdGhpcy5udW1EYXRhUG9pbnRzXTsKKwkJdGhpcy50ID0gbmV3IGRvdWJsZVt0aGlzLm51bURhdGFQb2ludHNdOworCisJCWZvciAoaW50IGljb3VudCA9IDA7IGljb3VudCA8IHRoaXMubnVtRGF0YVBvaW50czsgaWNvdW50ICsrKSB7CisJCQlzW2ljb3VudF0gPSBzVG9GaXQuZ2V0KGljb3VudCkuZG91YmxlVmFsdWUoKTsKKwkJCWlbaWNvdW50XSA9IGlUb0ZpdC5nZXQoaWNvdW50KS5kb3VibGVWYWx1ZSgpOworCQkJdFtpY291bnRdID0gaWNvdW50OworCQl9Ly8gZm9yIGljb3VudAorCX0KKworCS8qKgorCSAqIEVzdGltYXRlIHRoZSBwYXJhbWV0ZXJzCisJICogQHBhcmFtIGxvY2FsRGVuc2l0eSAKKwkgKiBAcGFyYW0gbG9jYWxQb3B1bGF0aW9uIAorCSAqIEBwYXJhbSBsb2NhdGlvbklEIAorCSAqIEByZXR1cm4gdGhlIE1vZGVsUGFyYW1ldGVycyBlc3RpbWF0ZQorCSAqLworCXB1YmxpYyBNb2RlbFBhcmFtZXRlcnMgZXN0aW1hdGUoZG91YmxlIGxvY2FsRGVuc2l0eSwgZG91YmxlIGxvY2FsUG9wdWxhdGlvbiwgU3RyaW5nIGxvY2F0aW9uSUQpIHsKKwkJCisJCU1vZGVsUGFyYW1ldGVycyBmaXR0ZWRQYXJtcyA9IG5ldyBNb2RlbFBhcmFtZXRlcnMoKTsKKwkJCisJCWludCBucHRzID0gcy5sZW5ndGg7CisJCWFzc2VydChucHRzPT1pLmxlbmd0aCk7CisJCQorCQkJZG91YmxlW10gbG5TID0gbmV3IGRvdWJsZVtucHRzXTsKKwkJCWRvdWJsZVtdIGRsblMgPSBuZXcgZG91YmxlW25wdHMtMV07CisJCQlkb3VibGVbXSBsbkkgPSBuZXcgZG91YmxlW25wdHNdOworCQkJZG91YmxlW10gZGxuSSA9IG5ldyBkb3VibGVbbnB0cy0xXTsKKwkJCQorCQkJLy8gYXZlcmFnZSB2YWx1ZXMgYWJvdXQgZGVyaXZhdGl2ZQorCQkJZG91YmxlW10gc0F2ZyA9IG5ldyBkb3VibGVbbnB0cy0xXTsKKwkJCWRvdWJsZVtdIGlBdmcgPSBuZXcgZG91YmxlW25wdHMtMV07CisJCQlkb3VibGVbXSBwQXZnID0gbmV3IGRvdWJsZVtucHRzLTFdOworCQkJZG91YmxlW11bXSBkYXRhUyA9IG5ldyBkb3VibGVbMl1bbnB0cyAtIDFdOworCQkJZG91YmxlW11bXSBkYXRhSSA9IG5ldyBkb3VibGVbMl1bbnB0cyAtIDFdOworCQkJCisJCQkvLyBnZXQgdGhlIGxvZ2FyaXRobXMKKwkJCWZvcihpbnQgaiA9IDA7IGogPCBucHRzOyBqKyspeworCQkJCWlmKHNbal0gPj0gMC4wKSB7CisJCQkJCWxuU1tqXSA9IE1hdGgubG9nKHNbal0pOworCQkJCX0gZWxzZSB7CisJCQkJCWxuU1tqXSA9IC0xLjA7ICAvLyBUT0RPIGZpeCB0aGlzCisJCQkJfQorCQkJCWlmKGlbal0gPj0gMC4wKSB7CisJCQkJCWxuSVtqXSA9IE1hdGgubG9nKGlbal0pOworCQkJCX0gZWxzZSB7CisJCQkJCWxuSVtqXSA9IC0xLjA7ICAvLyBUT0RPIGZpeCB0aGlzCisJCQkJfQorCQkJfQorCQkJCisJCQkvL2Rlcml2YXRpdmVzIG9mIGxvZ2FyaXRobXMgYW5kIGF2ZXJhZ2VzIG9mIG90aGVyIHBvaW50cworCQkJZm9yKGludCBqID0gMTtqIDwgbnB0cy0xO2orKykKKwkJCXsKKwkJCQlkbG5TW2otMV0gPSAobG5TW2pdLWxuU1tqLTFdKTsgLy8gZHQgPSAxCisJCQkJZGxuSVtqLTFdID0gKGxuSVtqXS1sbklbai0xXSk7IC8vIGR0ID0gMQorCQkJCQorCQkJCXNBdmdbai0xXSA9IChzW2pdICsgc1tqLTFdKS8yLjA7CisJCQkJaUF2Z1tqLTFdID0gKGlbal0gKyBpW2otMV0pLzIuMDsKKwkJCQlwQXZnW2otMV0gPSAocFtqXSArIHBbai0xXSkvMi4wOworCQkJfQorCQkJCisJCQlkb3VibGUgc01heCA9IGRhdGEuZ2V0TWF4UygpOworCQkJZG91YmxlIGlNYXggPSBkYXRhLmdldE1heEkoKTsKKwkJCQorCQkJCisJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8JCQkKKwkJCS8vIGRTL2R0LT4gZXF1YXRpb24gMS4KKwkJCS8veCwgeSBmb3IgbGVhc3Qgc3F1YXJlcyBmaXR0aW5nIHRvIGxpbmUgeSA9IGFscGhhKnggLSBiZXRhCisJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCS8vCisJCQlMaXN0PERvdWJsZT4geExpc3QxID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQlMaXN0PERvdWJsZT4geUxpc3QxID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQlMaXN0PERvdWJsZT4gZml0TGlzdDEgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCQorCQkJZm9yKGludCBqID0gMDsgaiA8IG5wdHMtMTsgaisrKXsKKwkJCQlkb3VibGUgc05vcm0gPSBzQXZnW2pdL3NNYXg7CisJCQkJZG91YmxlIGlOb3JtID0gaUF2Z1tqXS9pTWF4OworCQkJCWRhdGFTWzBdW2pdID0gc05vcm07CisJCQkJZGF0YUlbMF1bal0gPSBpTm9ybTsKKwkJCQkvLyBieSBkZWZhdWx0LCBzZWxlY3RlZCBkYXRhIGlzIHRoZSBTQU1FCisJCQkJZGF0YVNbMV1bal0gPSBzTm9ybTsKKwkJCQlkYXRhSVsxXVtqXSA9IGlOb3JtOworCQkJCQorCQkJCWlmKChzTm9ybTw9bWF4U3RocmVzaG9sZCkmJihzTm9ybT49bWluU3RocmVzaG9sZCkmJihpTm9ybT49bWluSXRocmVzaG9sZCkgKSB7CisJCQkJCWRvdWJsZSBudW1lciA9IChwQXZnW2pdIC8gc0F2Z1tqXSk7CisJCQkJCXhMaXN0MS5hZGQobmV3IERvdWJsZSggbnVtZXIgKSApOworCQkJCQl5TGlzdDEuYWRkKG5ldyBEb3VibGUoIChwQXZnW2pdL2lBdmdbal0pICogZGxuU1tqXSAgKSk7CisJCQkJfWVsc2UgeworCQkJCQkvLyAqKioqIGZvciBwbG90dGluZyAqKioqKioKKwkJCQkJLy8gaGVyZSB3ZSBkZWZpbmUgUyosIEkqLCBSKgorCQkJCQkvLyBOT1QgU2VsZWN0ZWQgPSAwLjAKKwkJCQkJZGF0YVNbMV1bal0gPSAwLjA7CisJCQkJCWRhdGFJWzFdW2pdID0gMC4wOworCQkJCQkvLy8vKioqKioqKioqKioqKioqKioqLy8vLy8KKwkJCQl9CisJCQl9CisJCQlMaW5lYXJMZWFzdFNxdWFyZXNGaXQgbGluZUZpdDEgPSBudWxsOworCQkJaWYoeExpc3QxLnNpemUoKSA+IDIpIHsKKwkJCQlsaW5lRml0MSA9IG5ldyBMaW5lYXJMZWFzdFNxdWFyZXNGaXQoeExpc3QxLHlMaXN0MSk7CisJCQkJLy8gaW5jcHQKKwkJCQlkb3VibGUgYmV0YSAJPSBsaW5lRml0MS5nZXRJbnRlcmNlcHQoKTsgCisJCQkJZG91YmxlIHZhckJldGEgCT0gbGluZUZpdDEuZ2V0SW50ZXJjZXB0VmFyaWFuY2UoKTsKKwkJCQlkb3VibGUgc3RkQmV0YSAJPSBsaW5lRml0MS5nZXRJbnRlcmNlcHRTdGREZXYoKTsKKwkJCQkvLyBzbG9wZQorCQkJCWRvdWJsZSBhbHBoYSAJPSBsaW5lRml0MS5nZXRTbG9wZSgpOworCQkJCWRvdWJsZSB2YXJBbHBoYSA9IGxpbmVGaXQxLmdldFNsb3BlVmFyaWFuY2UoKTsKKwkJCQlkb3VibGUgc3RkQWxwaGEgPSBsaW5lRml0MS5nZXRTbG9wZVN0ZERldigpOworCQkJCWRvdWJsZSBuZXdiZXRhID0gYmV0YTsKKwkJCQlpZighdXNlRnJlcURlcGVuZGFudEJldGEpIG5ld2JldGEgKj0gKChNb2RlbFBhcmFtZXRlcnMuUkVGRVJFTkNFX1BPUFVMQVRJT05fREVOU0lUWSkvbG9jYWxEZW5zaXR5KTsKKwkJCQlmaXR0ZWRQYXJtcy5hZGRQYXJhbWV0ZXIoUGFyYW1ldGVyLkJFVEEsIG5ldyBQYXJhbWV0ZXIoUGFyYW1ldGVyLkJFVEEsIG5ld2JldGEsIHN0ZEJldGEsIHZhckJldGEpKTsKKwkJCQlmaXR0ZWRQYXJtcy5hZGRQYXJhbWV0ZXIoUGFyYW1ldGVyLkFMUEhBLCBuZXcgUGFyYW1ldGVyKFBhcmFtZXRlci5BTFBIQSwgYWxwaGEsIHN0ZEFscGhhLCB2YXJBbHBoYSkpOworCQkJCS8vIGZpdAorCQkJCWZvciAoaW50IGkgPSAwOyBpPCB4TGlzdDEuc2l6ZSgpOyBpICsrKSB7CisJCQkJCWRvdWJsZSB2YWwgPSAobGluZUZpdDEuZ2V0U2xvcGUoKSp4TGlzdDEuZ2V0KGkpLmRvdWJsZVZhbHVlKCkpICsgbGluZUZpdDEuZ2V0SW50ZXJjZXB0KCk7IAorCQkJCQlmaXRMaXN0MS5hZGQobmV3IERvdWJsZSh2YWwpKTsKKwkJCQl9CisJCQl9Ly8gaWYgZml0IHZhbGlkCisJCQllbHNlIHsKKwkJCQlyZWplY3RDb3VudCArPSAxLjA7CisJCQl9CisJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCS8vRXF1YXRpb24gMiArPiBkSS9kdCBzZWNvbmQgZml0IGZvciBiZXRhIGFuZCBlcHNpbG9uCisJCQlMaXN0PERvdWJsZT4geExpc3QyID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQlMaXN0PERvdWJsZT4geUxpc3QyID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQlMaXN0PERvdWJsZT4gZml0TGlzdDIgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCQorCQkJLy94LCB5IGZvciBsZWFzdCBzcXVhcmVzIGZpdHRpbmcgdG8gbGluZSB5ID0gYmV0YSp4IC0gZXBzaWxvbgorCQkJZm9yKGludCBqID0gMDsgaiA8IG5wdHMtMTsgaisrKXsKKwkJCQlkb3VibGUgc05vcm0gPSBzQXZnW2pdL3NNYXg7CisJCQkJZG91YmxlIGlOb3JtID0gaUF2Z1tqXS9pTWF4OworCQkJCWlmKChzTm9ybTw9bWF4U3RocmVzaG9sZCkmJihzTm9ybT49bWluU3RocmVzaG9sZCkmJihpTm9ybT49bWluSXRocmVzaG9sZCkgKSB7CisJCQkJCXhMaXN0Mi5hZGQobmV3IERvdWJsZSggKCBwQXZnW2pdIC8gc0F2Z1tqXSkgKSk7CisJCQkJCXlMaXN0Mi5hZGQobmV3IERvdWJsZSgocEF2Z1tqXS9zQXZnW2pdKSAqZGxuSVtqXSkpOworCQkJCX0vLyBpZiBkYXRhIGluIHJhbmdlCisJCQl9CisJCQkvLyBUT0RPOiAgUGxvdCByZXN0cmljdGVkIGRhdGEKKwkJCUxpbmVhckxlYXN0U3F1YXJlc0ZpdCBsaW5lRml0MiA9IG51bGw7CisJCQlpZih4TGlzdDIuc2l6ZSgpID4gMikgeworCQkJCWxpbmVGaXQyID0gbmV3IExpbmVhckxlYXN0U3F1YXJlc0ZpdCh4TGlzdDIseUxpc3QyKTsKKwkJCQkvLyBpbmNwdAorCQkJCWRvdWJsZSBiZXRhMgkJPSBsaW5lRml0Mi5nZXRJbnRlcmNlcHQoKTsgCisJCQkJZG91YmxlIHZhckJldGEyIAk9IGxpbmVGaXQyLmdldEludGVyY2VwdFZhcmlhbmNlKCk7CisJCQkJZG91YmxlIHN0ZEJldGEyIAk9IGxpbmVGaXQyLmdldEludGVyY2VwdFN0ZERldigpOworCQkJCS8vIHNsb3BlCisJCQkJZG91YmxlIGFscGhhMiAJCT0gbGluZUZpdDIuZ2V0U2xvcGUoKTsKKwkJCQlkb3VibGUgdmFyQWxwaGEyCT0gbGluZUZpdDIuZ2V0U2xvcGVWYXJpYW5jZSgpOworCQkJCWRvdWJsZSBzdGRBbHBoYTIgCT0gbGluZUZpdDIuZ2V0U2xvcGVTdGREZXYoKTsKKwkJCQlkb3VibGUgbmV3YmV0YTIgPSBiZXRhMiAqICgoTW9kZWxQYXJhbWV0ZXJzLlJFRkVSRU5DRV9QT1BVTEFUSU9OX0RFTlNJVFkpL2xvY2FsRGVuc2l0eSk7CisJCQkJZml0dGVkUGFybXMuYWRkUGFyYW1ldGVyKFBhcmFtZXRlci5CRVRBMiwgbmV3IFBhcmFtZXRlcihQYXJhbWV0ZXIuQkVUQTIsIG5ld2JldGEyLCBzdGRCZXRhMiwgdmFyQmV0YTIpKTsKKwkJCQlmaXR0ZWRQYXJtcy5hZGRQYXJhbWV0ZXIoUGFyYW1ldGVyLkFMUEhBMiwgbmV3IFBhcmFtZXRlcihQYXJhbWV0ZXIuQUxQSEEyLCBhbHBoYTIsIHN0ZEFscGhhMiwgdmFyQWxwaGEyKSk7CisJCQorCQkJCS8vIGZpdAorCQkJCWZvciAoaW50IGkgPSAwOyBpPCB4TGlzdDIuc2l6ZSgpOyBpICsrKSB7CisJCQkJCWRvdWJsZSB2YWwgPSAobGluZUZpdDIuZ2V0U2xvcGUoKSp4TGlzdDIuZ2V0KGkpLmRvdWJsZVZhbHVlKCkpICsgbGluZUZpdDIuZ2V0SW50ZXJjZXB0KCk7IAorCQkJCQlmaXRMaXN0Mi5hZGQobmV3IERvdWJsZSh2YWwpKTsKKwkJCQl9CQkKKwkJCX0gLy8gaWYgZml0IHZhbGlkCisJCQllbHNlIHsKKwkJCQlyZWplY3RDb3VudCArPSAxLjA7CisJCQl9CisJCQkKKwkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCS8vIERPTkUKKwkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCWZpdHRlZFBhcm1zLmFkZFBhcmFtZXRlcihQYXJhbWV0ZXIuUkVKRUNULCBuZXcgUGFyYW1ldGVyKFBhcmFtZXRlci5SRUpFQ1QsIHJlamVjdENvdW50KSk7CisJCQkKKwkJCWRhdGFUb1Bsb3QuYWRkKGRhdGFTKTsKKwkJCWRhdGFUb1Bsb3QuYWRkKGRhdGFJKTsKKwkJCWZpdHRlZFBhcm1zLmFkZFNlbGVjdGVkRGF0YShsb2NhdGlvbklELCBkYXRhVG9QbG90KTsKKwkJCQorCQkJZG91YmxlW11bXSByZWdyZXNzaW9uMSA9IGdldFNvcnRlZFJlZ3Jlc3Npb24oeExpc3QxLCB5TGlzdDEpOyAKKwkJCWRvdWJsZVtdW10gcmVncmVzc2lvbjIgPSBnZXRTb3J0ZWRSZWdyZXNzaW9uKHhMaXN0MiwgeUxpc3QyKTsKKwkJCQorCQkJZG91YmxlW11bXSBmaXQxID0gZ2V0U29ydGVkUmVncmVzc2lvbih4TGlzdDEsIGZpdExpc3QxKTsgCisJCQlkb3VibGVbXVtdIGZpdDIgPSBnZXRTb3J0ZWRSZWdyZXNzaW9uKHhMaXN0MiwgZml0TGlzdDIpOyAKKwkJCQorCQkJcmVncmVzc2lvblZhbHVlcy5hZGQocmVncmVzc2lvbjEpOworCQkJcmVncmVzc2lvblZhbHVlcy5hZGQocmVncmVzc2lvbjIpOworCisJCQlmaXR0ZWRWYWx1ZXMuYWRkKGZpdDEpOworCQkJZml0dGVkVmFsdWVzLmFkZChmaXQyKTsKKwkJCQorCQkJZml0dGVkUGFybXMuYWRkUmVncmVzc2lvbkRhdGEobG9jYXRpb25JRCwgcmVncmVzc2lvblZhbHVlcyk7CisJCQlmaXR0ZWRQYXJtcy5hZGRGaXR0ZWREYXRhKGxvY2F0aW9uSUQsIGZpdHRlZFZhbHVlcyk7CisJCQkKKwkJCQorCQkJCisJCXJldHVybiBmaXR0ZWRQYXJtczsKKwl9IC8vIGVzdGltYXRlCisJCisJLyoqCisJICogU0kgbW9kZWxzIGhhdmUgMiBwcm9wZXJ0aWVzCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMuUGFyYW1ldGVyRXN0aW1hdG9yI2dldE51bVByb3BlcnRpZXMoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0TnVtUHJvcGVydGllcygpIHsKKwkJcmV0dXJuIDI7CisJfQorCQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvU2NlbmFyaW9BbmFseXNpc1N1aXRlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9TY2VuYXJpb0FuYWx5c2lzU3VpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDU0Yzk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvU2NlbmFyaW9BbmFseXNpc1N1aXRlLmphdmEKQEAgLTAsMCArMSwzNzAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLkVycm9yUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLnV0aWwuQ1NWc2NlbmFyaW9Mb2FkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLnNjZW5hcmlvLlNjZW5hcmlvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5BbmFseXNpc0NvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLkVzdGltYXRvckNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLk1lc3NhZ2VzOworCisvKioKKyAqIEFuYWx5emVzIGEge0BsaW5rIFNjZW5hcmlvfSBhbmQgY29tcGFyZXMgc2NlbmFyaW9zCisgKi8KK3B1YmxpYyBjbGFzcyBTY2VuYXJpb0FuYWx5c2lzU3VpdGUgeworCS8qKgorCSAqIEZvciB0ZXN0aW5nCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFX1JPT1RfRElSRUNUT1JZID0gQWdncmVnYXRlRGF0YVdyaXRlci5BTkFMWVNJU0ZPTERFUjsKKworCS8qKgorCSAqIFdoZXJlIHdlIHN0YXJ0IGxvb2tpbmcgZm9yIHJlY29yZGVkIHNjZW5hcmlvIGZpbGVzCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgUkVGRVJFTkNFX1RFU1RJTkdfRElSRUNUT1JZID0gUkVGRVJFTkNFX1JPT1RfRElSRUNUT1JZOworCisJLyoqCisJICogU2V0IHRvIGFuIGFjdHVhbCBmb2xkZXIgYmVsb3cgKGlmIGZvdW5kKQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFRkVSRU5DRV9URVNUSU5HX0FHR1JFR0FURV9GSUxFID0gUkVGRVJFTkNFX1JPT1RfRElSRUNUT1JZK0ZpbGUuc2VwYXJhdG9yK0FnZ3JlZ2F0ZURhdGFXcml0ZXIuQUdHUkVHQVRFX0ZPTERFUk5BTUUrRmlsZS5zZXBhcmF0b3IrImFnZ3JlZ2F0ZS5jc3YiOworCisJLyoqCisJICogU2V0IHRvIGFuIGFjdHVhbCBmb2xkZXIgYmVsb3cgKGlmIGZvdW5kKQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFRkVSRU5DRV9URVNUSU5HX0lOQ0lERU5DRV9GSUxFID0gUkVGRVJFTkNFX1JPT1RfRElSRUNUT1JZK0ZpbGUuc2VwYXJhdG9yK0FnZ3JlZ2F0ZURhdGFXcml0ZXIuSU5DSURFTkNFX0ZPTERFUk5BTUUrRmlsZS5zZXBhcmF0b3IrImluY2lkZW5jZS5jc3YiOworCisJCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFRkFVTFRfQUdHUkVHQVRFX0ZJTEVOQU1FID0gImFnZ3JlZ2F0ZSI7CisJCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENPTVBBUklTT05fRklMRV9OQU1FID0gIlJNU0NvbXBhcmlzb25SZXN1bHRzIjsKKwkJCisJLyoqCisJICogTWVzc2FnZSBpZiBkaXJlY3Rvcnkgbm90IGZvdW5kCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0ZPVU5EX01TRyA9IE1lc3NhZ2VzLmdldFN0cmluZygiQ09NTU9OLk5PVEZPVU5EIik7CisJCisJLyoqCisJICogTWVzc2FnZSBpZiBkYXRhIG5vdCB2YWxpZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfREFUQV9NU0cgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIkNPTU1PTi5OT1REQVRBIik7CisJCisJLyoqCisJICogTWVzc2FnZSBpZiBkb25lCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9ORV9NU0cgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIkNPTU1PTi5ET05FIik7CisJCisJLyoqCisJICogTWVzc2FnZSBpZiBSZWFkeQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURZX01TRyA9IE1lc3NhZ2VzLmdldFN0cmluZygiQ09NTU9OLlJFQURZIik7CisJCisJLyoqCisJICogTWVzc2FnZSBpZiBXb3JraW5nCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0lOR19NU0cgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIkNPTU1PTi5XT1JLSU5HIik7CisJCisJCisJLyoqCisJICogQ29udGFpbnMgYWxsIHJlZmVyZW5jZSBzY2VuYXJpbyBkYXRhCisJICovCisJUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCByZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAgPSBudWxsOworCQorCS8qKgorCSAqIENvbnRhaW5zIGFsbCByZWZlcmVuY2Ugc2NlbmFyaW8gZGF0YSAoZm9yIGNvbXBhcmlzb24pCisJICovCisJUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCBjb21wYXJpc29uU2NlbmFyaW9EYXRhTWFwID0gbnVsbDsKKwkKKwkvKiogCisJICogdGhlIEVzdGltYXRvciBpbnN0YW5jZQorCSAqLworCVNjZW5hcmlvUGFyYW1ldGVyRXN0aW1hdG9yIGVzdGltYXRvciA9IG51bGw7CisJCisJQW5hbHlzaXNDb250cm9sIGNvbnRyb2wgPSBudWxsOworCQorCQorCS8qKgorCSAqIEBwYXJhbSBjdHJsIAorCSAqIAorCSAqLworCXB1YmxpYyBTY2VuYXJpb0FuYWx5c2lzU3VpdGUoQW5hbHlzaXNDb250cm9sIGN0cmwpIHsKKwkJY29udHJvbCA9IGN0cmw7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBBZ2dyZWdhdGUgZGF0YQorCSAqIAorCSAqIEBwYXJhbSBmb2xkZXIgU2NlbmFyaW8gZm9sZGVyCisJICogQHBhcmFtIHJ1bm5hYmxlQ29udGV4dCBSdW5uYWJsZSBjb250ZXh0CisJICogQHBhcmFtIGFscGhhIHRoZSBJbW11bml0eSBMb3NzIFJhdGUuIFRoaXMgaXMgbmVlZGVkIHRvIGNvbXB1dGUgdGhlIGluY2lkZW5jZQorCSAqIEByZXR1cm4gU3RyaW5nW10gZmlsZW5hbWUgd2hlcmUgZmlsZW5hbWVbMF0gPSBhZ2dyZWdhdGUgZGF0YSBmaWxlIGFuZCBmaWxlbmFtZVsxXSA9IGluY2lkZW5jZSBkYXRhIGZpbGUKKwkgKiBAdGhyb3dzIFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24gVGhyb3duIGlmIHByb2JsZW0gcmVhZGluZyBkYXRhCisJICovCisJCisJcHVibGljIFN0cmluZ1tdIGFnZ3JlZ2F0ZURhdGEoU3RyaW5nIGZvbGRlciwgSVJ1bm5hYmxlQ29udGV4dCBydW5uYWJsZUNvbnRleHQsIGRvdWJsZSBhbHBoYSkgdGhyb3dzIFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb257CQorCQlTdHJpbmdbXSByZXRWYWw7IC8vPSBuZXcgU3RyaW5nWzJdOworCQlDU1ZzY2VuYXJpb0xvYWRlciBsb2FkZXIgPSBuZXcgQ1NWc2NlbmFyaW9Mb2FkZXIoZm9sZGVyKTsKKwkJaW50IG1heFJlc29sdXRpb24gPSBsb2FkZXIuZ2V0TWF4UmVzb2x1dGlvbigpOworICAgICAgICBSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIG1hcCA9IGxvYWRlci5wYXJzZUFsbEZpbGVzKG1heFJlc29sdXRpb24pOworICAgICAgICBTdHJpbmcgYWdncmVnYXRlRmlsZU5hbWUgPSBnZXRBZ2dyZWdhdGVGaWxlTmFtZShmb2xkZXIpOworICAgICAgICBSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBhZ2dyZWdhdGVkRGF0YSA9IG1hcC5hZ2dyZWdhdGVTY2VuYXJpb0RhdGEocnVubmFibGVDb250ZXh0KTsKKyAgICAgICAgQWdncmVnYXRlRGF0YVdyaXRlciB3cml0ZXIgPSBuZXcgQWdncmVnYXRlRGF0YVdyaXRlcihmb2xkZXIsIGFnZ3JlZ2F0ZUZpbGVOYW1lKTsKKyAgICAgCisgICAgICAgIHJldFZhbCA9IHdyaXRlci5sb2dEYXRhSW5zdGFuY2UoYWdncmVnYXRlZERhdGEsIGFscGhhKTsgICAgIAorCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwkKKwkvKioKKwkgKiBBZ2dyZWdhdGUgZGF0YSBidXQgZmlsdGVyIHRoZSBsb2NhdGlvbnMgdGhhdCBnZXQgYWdncmVnYXRlIHRvIG1hdGNoIHRoZSBsb2NhdGlvbnMKKwkgKiBpbiB0aGUgcmVmZXJlbmNlRm9sZGVyCisJICogQHBhcmFtIHJlZmVyZW5jZUZvbGRlciAKKwkgKiBAcGFyYW0gZm9sZGVyIFNjZW5hcmlvIGZvbGRlcgorCSAqIEBwYXJhbSBydW5uYWJsZUNvbnRleHQgUnVubmFibGUgY29udGV4dAorCSAqIEBwYXJhbSBhbHBoYSB0aGUgSW1tdW5pdHkgTG9zcyBSYXRlLiBUaGlzIGlzIG5lZWRlZCB0byBjb21wdXRlIHRoZSBpbmNpZGVuY2UKKwkgKiBAcmV0dXJuIFN0cmluZ1tdIGZpbGVuYW1lIHdoZXJlIGZpbGVuYW1lWzBdID0gYWdncmVnYXRlIGRhdGEgZmlsZSBhbmQgZmlsZW5hbWVbMV0gPSBpbmNpZGVuY2UgZGF0YSBmaWxlCisJICogQHRocm93cyBTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uIFRocm93biBpZiBwcm9ibGVtIHJlYWRpbmcgZGF0YQorCSAqLworCQorCXB1YmxpYyBTdHJpbmdbXSBhZ2dyZWdhdGVCeUZpbHRlcihTdHJpbmcgcmVmZXJlbmNlRm9sZGVyLCBTdHJpbmcgZm9sZGVyLCBJUnVubmFibGVDb250ZXh0IHJ1bm5hYmxlQ29udGV4dCwgZG91YmxlIGFscGhhKSB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbnsJCisJCVN0cmluZ1tdIHJldFZhbDsvLyA9IG5ldyBTdHJpbmdbMl07CisJCQorCQlDU1ZzY2VuYXJpb0xvYWRlciByZWZMb2FkZXIgPSBuZXcgQ1NWc2NlbmFyaW9Mb2FkZXIocmVmZXJlbmNlRm9sZGVyKTsKKwkJaW50IG1heFJlcyA9IHJlZkxvYWRlci5nZXRNYXhSZXNvbHV0aW9uKCk7CisJCVNldDxTdHJpbmc+IGxvY2F0aW9uc1RvQWdncmVnYXRlID0gcmVmTG9hZGVyLmdldExvY2F0aW9ucyhtYXhSZXMpOwkKKwkJQ1NWc2NlbmFyaW9Mb2FkZXIgbG9hZGVyID0gbmV3IENTVnNjZW5hcmlvTG9hZGVyKGZvbGRlcik7CisJCWludCBtYXhSZXNvbHV0aW9uID0gbG9hZGVyLmdldE1heFJlc29sdXRpb24oKTsKKyAgICAgICAgUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCBtYXAgPSBsb2FkZXIucGFyc2VBbGxGaWxlcyhsb2NhdGlvbnNUb0FnZ3JlZ2F0ZSwgbWF4UmVzb2x1dGlvbik7CisgICAgICAgIFN0cmluZyBhZ2dyZWdhdGVGaWxlTmFtZSA9IGdldEFnZ3JlZ2F0ZUZpbGVOYW1lKGZvbGRlcik7CisgICAgICAgIFJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlIGFnZ3JlZ2F0ZWREYXRhID0gbWFwLmFnZ3JlZ2F0ZVNjZW5hcmlvRGF0YShydW5uYWJsZUNvbnRleHQpOworICAgICAgICBBZ2dyZWdhdGVEYXRhV3JpdGVyIHdyaXRlciA9IG5ldyBBZ2dyZWdhdGVEYXRhV3JpdGVyKGZvbGRlciwgYWdncmVnYXRlRmlsZU5hbWUpOworICAgICAgICByZXRWYWwgPSB3cml0ZXIubG9nRGF0YUluc3RhbmNlKGFnZ3JlZ2F0ZWREYXRhLCBhbHBoYSk7ICAgICAKKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJLyoqCisJICogRXN0aW1hdGVzIHRoZSBtb2RlbCBwYXJhbWV0ZXJzIGZvciBzY2VuYXJpbyBkYXRhIGxvY2F0ZWQgaW4gdGhlIHJlZmVyZW5jZURpcmVjdG9yeQorCSAqIEBwYXJhbSBkYXRhTWFwIERhdGEKKwkgKiBAcGFyYW0gcGFyYW1ldGVyRXN0aW1hdG9yTWV0aG9kIFdoaWNoIG1ldGhvZCBkbyB3ZSB1c2UgdG8gZXN0aW1hdGUKKwkgKiBAcGFyYW0gcnVubmFibGVDb250ZXh0IENvbnRleHQgdXNlZCBmb3IgbG9uZyBydW5uaW5nIHRhc2tzCisJICogQHJldHVybiBhIHNldCBvZiBmaXR0ZWQgbW9kZWwgcGFyYW1ldGVycworCSAqLworCXB1YmxpYyBNb2RlbFBhcmFtZXRlcnMgZXN0aW1hdGVQYXJhbWV0ZXJzKFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwgZGF0YU1hcCwgUGFyYW1ldGVyRXN0aW1hdG9yTWV0aG9kIHBhcmFtZXRlckVzdGltYXRvck1ldGhvZCwgSVJ1bm5hYmxlQ29udGV4dCBydW5uYWJsZUNvbnRleHQpIHsJCisJCQl0aGlzLnJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCA9IGRhdGFNYXA7CisJCQllc3RpbWF0b3IgPSBuZXcgU2NlbmFyaW9QYXJhbWV0ZXJFc3RpbWF0b3IodGhpcy5yZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAsIHBhcmFtZXRlckVzdGltYXRvck1ldGhvZCk7CisJCQkKKwkJCU1vZGVsUGFyYW1ldGVycyBiZXN0RXN0aW1hdGUgPSBuZXcgTW9kZWxQYXJhbWV0ZXJzKCk7CisJCQkKKwkJCS8vIFRoZSB1c2VyIGNhbiBzZXQgdGhpcworCQkJYm9vbGVhbiBzdW1BbGxMb2NhdGlvbnMgPSBmYWxzZTsKKwkJCU1hcDxTdHJpbmcsT2JqZWN0PiBjb250cm9sUGFyYW1ldGVyc01hcCA9IGNvbnRyb2wuZ2V0Q29udHJvbFBhcmFtZXRlcnNNYXAoKTsKKwkJCWlmKGNvbnRyb2xQYXJhbWV0ZXJzTWFwICE9IG51bGwpIHsKKwkJCQlzdW1BbGxMb2NhdGlvbnMgPSAoKEJvb2xlYW4pIGNvbnRyb2xQYXJhbWV0ZXJzTWFwLmdldChFc3RpbWF0b3JDb250cm9sLlNVTV9MT0NBVElPTlNfS0VZKSkuYm9vbGVhblZhbHVlKCk7CisJCQl9CisJCQkKKwkJCWlmKHN1bUFsbExvY2F0aW9ucykgeworCQkJCWJlc3RFc3RpbWF0ZSA9IGVzdGltYXRvci5hdmVyYWdlVGhlbkVzdGltYXRlUGFyYW1ldGVycyhjb250cm9sUGFyYW1ldGVyc01hcCwgcnVubmFibGVDb250ZXh0KTsKKwkJCX0gZWxzZSB7CisJCQkJTWFwPFN0cmluZyxNb2RlbFBhcmFtZXRlcnM+IGZpdHRlZFBhcmFtZXRlcnMgPSBlc3RpbWF0b3IuZXN0aW1hdGVQYXJhbWV0ZXJzKGNvbnRyb2xQYXJhbWV0ZXJzTWFwLCBydW5uYWJsZUNvbnRleHQpOwkJCisJCQkJYmVzdEVzdGltYXRlLmF2ZXJhZ2UoZml0dGVkUGFyYW1ldGVycyk7CisJCQl9CisJCQkKKwkJCQorCQkgICAgcmV0dXJuIGJlc3RFc3RpbWF0ZTsKKwl9CisJCisJLyoqCisJICogVGhlIGFnZ3JlZ2F0ZSBmaWxlIGlzIG5hbWVkIGFmdGVyIHRoZSBkYXRhIGRpcmVjdG9yeSB1bmRlciBjc3YKKwkgKiBAcGFyYW0gZGlyCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBZ2dyZWdhdGVGaWxlTmFtZShTdHJpbmcgZGlyKSB7CisJCWludCBzdGFydCA9IGRpci5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpOworCQkKKwkJU3RyaW5nIGZpbGVuYW1lID0gREVGQVVMVF9BR0dSRUdBVEVfRklMRU5BTUU7CisJCWlmKHN0YXJ0ID49MCkgeworCQkJZmlsZW5hbWUgPSBkaXIuc3Vic3RyaW5nKHN0YXJ0KzEsZGlyLmxlbmd0aCgpKTsKKwkJfQorCQlmaWxlbmFtZSA9IGZpbGVuYW1lICsiLmNzdiI7CisJCXJldHVybiBmaWxlbmFtZTsKKwl9CisJCisJLyoqCisJICogUm9vdCBNZWFuIFNxdWFyZSBEaWZmZXJlbmNlIENvbXBhcmlzb24KKwkgKiBDb21wYXJlcyBkYXRhIGZyb20gdHdvIHNjZW5hcmlvczogdGhlIHJlZmVyZW5jZURpcmVjdG9yeSBhbmQgdGhlIGNvbXBhcmlzb25EaXJlY3RvcnkKKwkgKiBUaGUgY29tcGFyaXNvbiBkaXJlY3Rvcnkgd2lsbCByZWN1cnNpdmVseSB0cmF2ZXJzZSBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIGxvZyBmaWxlcy4KKwkgKiBXaGVuIGZvdW5kLCBhIGNvbXBhcmlzb24gaXMgZG9uZSBhbmQgdGhlIHJlc3VsdHMgaXMgd3JpdHRlbiB0byB0aGUgY29tcGFyaXNvbiBkaXJlY3RvcnkKKwkgKiBpbmNsdWRpbmcgdGhlIHBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIHNpbXVsYXRpb24KKwkgKiAKKwkgKiBAcGFyYW0gcmVmZXJlbmNlRGlyZWN0b3J5CisJICogQHBhcmFtIGNvbXBhcmlzb25EaXJlY3RvcnkKKwkgKiBAcGFyYW0gcnVubmFibGVDb250ZXh0IENvbnRleHQgZm9yIGxvbmcgcnVubmluZyB0YXNrCisJICogQHJldHVybiBFcnJvclJlc3VsdAorCSAqIEB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiAKKwkgKi8KKwkKKwlwdWJsaWMgRXJyb3JSZXN1bHQgY29tcGFyZShTdHJpbmcgcmVmZXJlbmNlRGlyZWN0b3J5LCBTdHJpbmcgY29tcGFyaXNvbkRpcmVjdG9yeSwgSVJ1bm5hYmxlQ29udGV4dCBydW5uYWJsZUNvbnRleHQpIHRocm93cyBTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uIHsKKwkJQ1NWc2NlbmFyaW9Mb2FkZXIgcmVmZXJlbmNlTG9hZGVyID0gbmV3IENTVnNjZW5hcmlvTG9hZGVyKHJlZmVyZW5jZURpcmVjdG9yeSk7CisJCS8vIFdlIHdpbGwgd3JpdGUgdGhlIHJlc3VsdCB0byBhIGZpbGUgaW4gdGhlIGNvbXBhcmlzb24gZGlyZWN0b3J5IGZvbGRlcgorCQlTdHJpbmcgcmVzdWx0RmlsZSA9IENPTVBBUklTT05fRklMRV9OQU1FOworCQkKKwkJQ1NWQW5hbHlzaXNXcml0ZXIgcmVzdWx0V3JpdGVyID0gbmV3IENTVkFuYWx5c2lzV3JpdGVyKHJlc3VsdEZpbGUpOwkKKwkJTWFwPE1hcDxTdHJpbmcsIFN0cmluZz4sIEVycm9yUmVzdWx0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxNYXA8U3RyaW5nLCBTdHJpbmc+LCBFcnJvclJlc3VsdD4oKTsKKwkJY29tcGFyZVJlY3Vyc2l2ZShyZWZlcmVuY2VMb2FkZXIsIGNvbXBhcmlzb25EaXJlY3RvcnksIHJlc3VsdCwgcnVubmFibGVDb250ZXh0KTsKKwkJcmVzdWx0V3JpdGVyLmxvZ0RhdGEocmVzdWx0KTsKKwkJcmVzdWx0V3JpdGVyLmZsdXNoTG9nZ2VyRGF0YSgpOworCQlyZXN1bHRXcml0ZXIuY2xvc2VMb2dnZXJEYXRhKCk7CisJCS8vIEZpbmQgdGhlIHNtYWxsZXN0IFJNUyBkaWZmZXJlbmNlIGFuZCByZXR1cm4gaXRzIGRvdWJsZSBsaXN0CisJCWRvdWJsZSBzbWFsbGVzdEVycm9yID0gRG91YmxlLk1BWF9WQUxVRTsKKwkJRXJyb3JSZXN1bHQgcmV0dXJuRXJyb3I9bnVsbDsKKwkJZm9yKEVudHJ5PE1hcDxTdHJpbmcsIFN0cmluZz4sRXJyb3JSZXN1bHQ+IGVudHJ5IDogcmVzdWx0LmVudHJ5U2V0KCkpIHsKKwkJCUVycm9yUmVzdWx0IHJlcyA9IGVudHJ5LmdldFZhbHVlKCk7CisJCQkvLyBDb21wdXRlIGF2ZXJhZ2UKKwkJCWRvdWJsZSBlcnJvciA9IDAuMDsKKwkJCWlmKHJlcyAhPW51bGwpIHsKKwkJCQllcnJvciA9IHJlcy5nZXRFcnJvcigpOworCQkJfQorCQkJaWYoZXJyb3IgPCBzbWFsbGVzdEVycm9yKSB7c21hbGxlc3RFcnJvciA9IGVycm9yO3JldHVybkVycm9yID0gcmVzO30KKwkJfQorCQlyZXR1cm4gcmV0dXJuRXJyb3I7CisJfQorCQorCS8qKgorCSAqIFJvb3QgTWVhbiBTcXVhcmUgRGlmZmVyZW5jZSBDb21wYXJpc29uCisJICogQ29tcGFyZXMgZGF0YSBmcm9tIHR3byBzY2VuYXJpb3M6IHRoZSByZWZlcmVuY2VEaXJlY3RvcnkgYW5kIHRoZSBjb21wYXJpc29uRGlyZWN0b3J5CisJICogVGhlIGNvbXBhcmlzb24gZGlyZWN0b3J5IHdpbGwgcmVjdXJzaXZlbHkgdHJhdmVyc2UgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvciBsb2cgZmlsZXMuCisJICogV2hlbiBmb3VuZCwgYSBjb21wYXJpc29uIGlzIGRvbmUgYW5kIHRoZSByZXN1bHRzIGlzIHdyaXR0ZW4gdG8gdGhlIGNvbXBhcmlzb24gZGlyZWN0b3J5CisJICogaW5jbHVkaW5nIHRoZSBwYXJhbWV0ZXJzIHVzZWQgZm9yIHRoZSBzaW11bGF0aW9uCisJICogCisJICogQHBhcmFtIHJlZmVyZW5jZUxvYWRlcgorCSAqIEBwYXJhbSBjb21wYXJpc29uRGlyZWN0b3J5CisJICogQHBhcmFtIHJlc3VsdAorCSAqIEBwYXJhbSBydW5uYWJsZUNvbnRleHQgQ29udGV4dCBmb3IgbG9uZyBydW5uaW5nIHRhc2sKKwkgKiBAdGhyb3dzIFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24gCisJICovCisJcHVibGljIHZvaWQgY29tcGFyZVJlY3Vyc2l2ZShDU1ZzY2VuYXJpb0xvYWRlciByZWZlcmVuY2VMb2FkZXIsIFN0cmluZyBjb21wYXJpc29uRGlyZWN0b3J5LCBNYXA8TWFwPFN0cmluZywgU3RyaW5nPiwgRXJyb3JSZXN1bHQ+IHJlc3VsdCwgSVJ1bm5hYmxlQ29udGV4dCBydW5uYWJsZUNvbnRleHQpIHRocm93cyBTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uIHsJCQorCQl0cnkgeworCQkJQ1NWc2NlbmFyaW9Mb2FkZXIgY29tcGFyaXNvbkxvYWRlciA9IG5ldyBDU1ZzY2VuYXJpb0xvYWRlcihjb21wYXJpc29uRGlyZWN0b3J5KTsKKwkJCS8vIEEgdmFsaWQgc2NlbmFyaW8gZm9sZGVyIHdhcyBmb3VuZC4gRG8gdGhlIGNvbXBhcmlzb24KKwkJCUVycm9yUmVzdWx0IHJlcyA9IF9jb21wYXJlKHJlZmVyZW5jZUxvYWRlciwgY29tcGFyaXNvbkxvYWRlciwgcnVubmFibGVDb250ZXh0KTsKKwkJCU1hcDxTdHJpbmcsIFN0cmluZz5ydW5QYXJtcyA9IGNvbXBhcmlzb25Mb2FkZXIuZ2V0UnVuUGFyYW1ldGVycygpOworCQkJcmVzdWx0LnB1dChydW5QYXJtcywgcmVzKTsKKwkJfSBjYXRjaChTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uIHNpZSkgeworCQkJLy8gVGhlIGZvbGRlciBkaWQgbm90IGNvbnRhaW4gdmFsaWQgbG9nIGZpbGVzLiBSZWN1cnNlIGRvd24gc3ViZGlyZWN0b3JpZXMKKwkJCS8vIGxvb2tpbmcgZm9yIGxvZyBmaWxlcworCQkJRmlsZSBmID0gbmV3IEZpbGUoY29tcGFyaXNvbkRpcmVjdG9yeSk7CisJCQlTdHJpbmcgW10gZGlycyA9IGYubGlzdCgpOworCQkJaWYoZGlycyAhPSBudWxsKSAKKwkJCQlmb3IoU3RyaW5nIGRpciA6IGRpcnMpIGNvbXBhcmVSZWN1cnNpdmUocmVmZXJlbmNlTG9hZGVyLCBjb21wYXJpc29uRGlyZWN0b3J5K0ZpbGUuc2VwYXJhdG9yK2RpciwgcmVzdWx0LCBydW5uYWJsZUNvbnRleHQpOworCQl9CisJfQorCisJCQorCS8qKgorCSAqIFJvb3QgTWVhbiBTcXVhcmUgRGlmZmVyZW5jZSBDb21wYXJpc29uCisJICogQ29tcGFyZXMgZGF0YSBmcm9tIHR3byBzY2VuYXJpb3M6IHRoZSByZWZlcmVuY2VEaXJlY3RvcnkgYW5kIHRoZSBjb21wYXJpc29uRGlyZWN0b3J5CisJICogQHBhcmFtIHJlZkxvYWRlcgorCSAqIEBwYXJhbSBjb21wTG9hZGVyCisJICogQHBhcmFtIHJ1bm5hYmxlQ29udGV4dCBDb250ZXh0IGZvciBsb25nIHJ1bm5pbmcgdGFzaworCSAqIEByZXR1cm4gdGhlIG1lYW4gc3F1YXJlIGRpZmYKKwkgKiBAdGhyb3dzIFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24gCisJICovCisJcHJpdmF0ZSBFcnJvclJlc3VsdCBfY29tcGFyZShDU1ZzY2VuYXJpb0xvYWRlciByZWZMb2FkZXIsIENTVnNjZW5hcmlvTG9hZGVyIGNvbXBMb2FkZXIsIElSdW5uYWJsZUNvbnRleHQgcnVubmFibGVDb250ZXh0KSB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiB7CisJCQlpbnQgbWF4UmVmID0gcmVmTG9hZGVyLmdldE1heFJlc29sdXRpb24oKTsJCQorCQkJaW50IG1heENvbXAgPSBjb21wTG9hZGVyLmdldE1heFJlc29sdXRpb24oKTsJCQkJCisJCQkvLyBGaW5kIHRoZSBoaWdoZXN0IHJlc29sdXRpb24gY29tbW9uIHR3byBib3RoIGxvY2F0aW9ucyBhbmQgCisJCQkvLyB1c2UgaXQgZm9yIGNvbXBhcmlzb24uCisJCQlpbnQgYWN0dWFsUmVzID0gKG1heFJlZiA+IG1heENvbXApP21heENvbXA6bWF4UmVmOworCQkJCQorCQkJdGhpcy5yZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAgPSByZWZMb2FkZXIucGFyc2VBbGxGaWxlcyhhY3R1YWxSZXMpOworCQkJCQkKKwkJCXRoaXMuY29tcGFyaXNvblNjZW5hcmlvRGF0YU1hcCA9IGNvbXBMb2FkZXIucGFyc2VBbGxGaWxlcyhhY3R1YWxSZXMpOworCQkJCQkKKwkJCVNpbXBsaWZpZWRNZWFuU3F1YXJlRGlmZmVyZW5jZSBtc2QgPSBuZXcgU2ltcGxpZmllZE1lYW5TcXVhcmVEaWZmZXJlbmNlKHJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCwgY29tcGFyaXNvblNjZW5hcmlvRGF0YU1hcCk7CisJCQkJCQorCQkJRXJyb3JSZXN1bHQgcmVzdWx0ID0gCW1zZC5zb2x2ZShydW5uYWJsZUNvbnRleHQpOwkKKwkJCXJldHVybiByZXN1bHQ7CisJfQorCQorCS8qKgorCSAqIAorCSAqIEBwYXJhbSBkaXJlY3RvcnkKKwkgKiBAcmV0dXJuIHRydWUgaXMgYSBkYXRhIGRpcmVjdG9yeSBleGlzdHMKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShTdHJpbmcgZGlyZWN0b3J5KSB7CisJCXJldHVybiBDU1ZzY2VuYXJpb0xvYWRlci52YWxpZGF0ZShkaXJlY3RvcnkpOworCX0KKwkKKwkvKioKKwkgKiBSb290IE1lYW4gU3F1YXJlIERpZmZlcmVuY2UgQ29tcGFyaXNvbgorCSAqIENvbXBhcmVzIGRhdGEgZnJvbSB0d28gc2NlbmFyaW9zOiB0aGUgcmVmZXJlbmNlRGlyZWN0b3J5IGFuZCB0aGUgY29tcGFyaXNvbkRpcmVjdG9yeQorCSAqIEBwYXJhbSByZWZlcmVuY2VEaXJlY3RvcnkKKwkgKiBAcGFyYW0gY29tcGFyaXNvbkRpcmVjdG9yeQorCSAqIEBwYXJhbSBydW5uYWJsZUNvbnRleHQgQ29udGV4dCBmb3IgbG9uZyBydW5uaW5nIHRhc2tzCisJICogQHJldHVybiB0aGUgbWVhbiBzcXVhcmUgZGlmZgorCSAqIEB0aHJvd3MgU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiBUaHJvd24gaWYgcHJvYmxlbXMgZW5jb3VudGVyZWQgcmVhZGluZyBkYXRhCisJICovCisJCisJcHVibGljIExpc3Q8UGhhc2VTcGFjZUNvb3JkaW5hdGVbXT4gZ2V0THlhcHVub3ZUcmFqZWN0b3J5KFN0cmluZyByZWZlcmVuY2VEaXJlY3RvcnksIFN0cmluZyBjb21wYXJpc29uRGlyZWN0b3J5LCBJUnVubmFibGVDb250ZXh0IHJ1bm5hYmxlQ29udGV4dCkgdGhyb3dzIFNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb24geworCQkgICAKKwkJCS8vIGZvciByZWZlcmVuY2UgYW5kIGZvciBzaW5nbGUgc2NlbmFyaW8gYW5hbHlzaXMKKwkJCUNTVnNjZW5hcmlvTG9hZGVyIHJlZkxvYWRlciA9IG5ldyBDU1ZzY2VuYXJpb0xvYWRlcihyZWZlcmVuY2VEaXJlY3RvcnkpOworCQkJaW50IG1heFJlZiA9IHJlZkxvYWRlci5nZXRNYXhSZXNvbHV0aW9uKCk7CisJCQlpZihtYXhSZWYgPD0tMSkgcmV0dXJuIG51bGw7CisJCQkvLyBmb3IgdGVzdGluZyBjb21wYXJpc29uIGZ1bmN0aW9ucworCQkJQ1NWc2NlbmFyaW9Mb2FkZXIgY29tcExvYWRlciA9IG5ldyBDU1ZzY2VuYXJpb0xvYWRlcihjb21wYXJpc29uRGlyZWN0b3J5KTsKKwkJCWludCBtYXhDb21wID0gY29tcExvYWRlci5nZXRNYXhSZXNvbHV0aW9uKCk7CisJCQlpbnQgYWN0dWFsUmVzID0gKG1heFJlZiA+IG1heENvbXApP21heENvbXA6bWF4UmVmOworCQkJaWYoYWN0dWFsUmVzPD0tMSkgcmV0dXJuIG51bGw7CisJCQl0aGlzLnJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCA9IHJlZkxvYWRlci5wYXJzZUFsbEZpbGVzKGFjdHVhbFJlcyk7CisJCQl0aGlzLmNvbXBhcmlzb25TY2VuYXJpb0RhdGFNYXAgPSBjb21wTG9hZGVyLnBhcnNlQWxsRmlsZXMoYWN0dWFsUmVzKTsKKwkJCQorCQkJTHlhcHVub3ZBbmFseXNpcyBseWFwID0gbmV3IEx5YXB1bm92QW5hbHlzaXMocmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwLCBjb21wYXJpc29uU2NlbmFyaW9EYXRhTWFwLCBydW5uYWJsZUNvbnRleHQpOworCQkJCisJCQlMaXN0PFBoYXNlU3BhY2VDb29yZGluYXRlW10+IHJldFZhbCA9IGx5YXAuZ2V0THlhcHVub3ZUcmFqZWN0b3J5KHJ1bm5hYmxlQ29udGV4dCk7CQorCQkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJLyoqCisJICogCisJICogQHBhcmFtIHRyYWplY3RvcnlMaXN0CisJICogQHJldHVybiB0aGUgZGV2aWF0aW9uIGFzIExpc3QoZG91YmxlW10pCisJICovCisJcHVibGljIHN0YXRpYyBMaXN0PEVMaXN0PERvdWJsZT4+IGdldEN1bXVsYXRpdmVQaGFzZVNwYWNlRGV2aWF0aW9uKExpc3Q8UGhhc2VTcGFjZUNvb3JkaW5hdGVbXT4gdHJhamVjdG9yeUxpc3QpIHsKKwkJTGlzdDxFTGlzdDxEb3VibGU+PiBkZXZpYXRpb24gPSBMeWFwdW5vdkFuYWx5c2lzLmdldEN1bXVsYXRpdmVQaGFzZVNwYWNlRGV2aWF0aW9uKHRyYWplY3RvcnlMaXN0KTsKKwkJcmV0dXJuIGRldmlhdGlvbjsKKwkJCisJfQorCQorCS8qKgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgZXN0aW1hdG9yCisJICovCisJcHVibGljIFBhcmFtZXRlckVzdGltYXRvciBnZXRFc3RpbWF0b3IoKSB7CisJCXJldHVybiBlc3RpbWF0b3IuZ2V0RXN0aW1hdG9yKCk7CisJfQorCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvU2NlbmFyaW9QYXJhbWV0ZXJFc3RpbWF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL1NjZW5hcmlvUGFyYW1ldGVyRXN0aW1hdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVjZGIyMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL1NjZW5hcmlvUGFyYW1ldGVyRXN0aW1hdG9yLmphdmEKQEAgLTAsMCArMSw1OTcgQEAKKy8qKgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLlN0YXRlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMubGFiZWxzLlBvcHVsYXRpb25MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLlV0aWxpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLkVzdGltYXRvckNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLk1lc3NhZ2VzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioKKyAqIEVzdGltYXRlcyByYXRlIGNvbnN0YW50cyBmb3IgYSBzY2VuYXJpbworICovCitwdWJsaWMgY2xhc3MgU2NlbmFyaW9QYXJhbWV0ZXJFc3RpbWF0b3IgeworCQorCS8qKgorCSAqIFRoZSBzY2VuYXJpbyBkYXRhIHVzZWQgZm9yIGVzdGltYXRpb24KKwkgKi8KKwkKKwlSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIHJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCA9IG51bGw7CisJCisJLyoqCisJICogVGhlIFBhcmFtZXRlciBFc3RpbWF0b3IgbWV0aG9kIHdlIHVzZQorCSAqLworCQorCVBhcmFtZXRlckVzdGltYXRvck1ldGhvZCBwYXJhbWV0ZXJFc3RpbWF0b3JNZXRob2QgPSBudWxsOworCQorCS8qKgorCSAqIFRoaXMgU2V0IHdpbGwgY29udGFpbiBsb2NhdGlvbnMgd2l0aCAiZ29vZCIgZGF0YS4gR29vZCBkYXRhIGltcGxpZXMgdGhhdCBhdCBsZWFzdAorCSAqIHRoZSAiSSIgc3RhdGUgaXMgZGVmaW5lZCBhbmQgdGhhdCBtYXhpbXVtIG51bWJlciBvZiBwb2VwbGUgaW4gdGhlICJJIiBzdGF0ZSBhdCBzb21lIHRpbWUKKwkgKiBpcyBsYXJnZSBlbm91Z2ggZm9yIHRoZSBlc3RpbWF0b3IgdG8gcmV0dXJuIGFuIGFwcHJveGltYXRlIGJldGEgY29lZmZpY2llbnQgCisJICovCisJU2V0PFN0cmluZz4gcmVmZXJlbmNlTG9jYXRpb25zOworCQorCS8qKgorCSAqIGFyZWFzIG9mIHRoZSByZWZlcmVuY2UgbG9jYXRpb25zCisJICogbG9hZGVkIGZyb20gdGhlIHNjZW5hcmlvIGdyYXBoIGJ5IElECisJICovCisJTWFwPFN0cmluZyxEb3VibGU+IHJlZmVyZW5jZUFyZWFEYXRhTWFwOworCQorCS8qKgorCSAqIHBvcHVsYXRpb25zIG9mIHRoZSByZWZlcmVuY2UgbG9jYXRpb25zCisJICogbG9hZGVkIGZyb20gdGhlIHNjZW5hcmlvIGdyYXBoIGJ5IElECisJICovCisJTWFwPFN0cmluZyxEb3VibGU+IHJlZmVyZW5jZVBvcHVsYXRpb25EYXRhTWFwOworCQorCS8qKgorCSAqIHJlbWVtYmVyIHRoZSBtYXggSW5mZWN0aW91cyBhdCBlYWNoIGxvY2F0aW9uCisJICovCisJTWFwPFN0cmluZyxEb3VibGU+IG1heEluZmVjdGlvdXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRG91YmxlPigpOworCQorCVBhcmFtZXRlckVzdGltYXRvciBlc3RpbWF0b3I7CisJCisJLyoqCisJICogUHJlZml4IGZvciBhcmVhLiBGb3JtYXQgaXMKKwkgKiAgIHN0ZW06Ly9vcmcuZWNsaXBzZS5zdGVtL2xhYmVsL2FyZWEvVVNBLzIvVVMtR0EtMTMzMDcKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJFQV9VUklfUFJFRklYID0gb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuQXJlYUxhYmVsLlVSSV9UWVBFX0FSRUFfTEFCRUxfU0VHTUVOVDsKKwkKKwkvKioKKwkgKiBwcmVmaXggZm9yIHBvcHVsYXRpb24uIEZvcm1hdCBpcworCSAqIHN0ZW06Ly9vcmcuZWNsaXBzZS5zdGVtL2xhYmVsL3BvcHVsYXRpb24vVVNBLzIvVVMtR0EtMTMzMDcvaHVtYW4KKwkgKiAgICAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9QVUxBVElPTl9VUklfUFJFRklYID0gb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5sYWJlbHMuUG9wdWxhdGlvbkxhYmVsLlVSSV9UWVBFX1BPUFVMQVRJT05fTEFCRUxfU0VHTUVOVDsKKwkKKwkvKioKKwkgKiBUT0RPIG1ha2UgZ3VpIGl0ZW0KKwkgKiBzeW50YXggaXMgIAorCSAqIHN0ZW06Ly9vcmcuZWNsaXBzZS5zdGVtL2xhYmVsL3BvcHVsYXRpb24vSVNSLzIvaHVtYW4vMjAwNi9JTC0wNS02MjMKKwkgKiBIdW1hbiBvbmx5IGZvciBub3cKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BFQ0lFUyA9ICJodW1hbiI7CisJCisJLyoqCisJICogVE9ETyBtYWtlIGd1aSBpdGVtCisJICogc3ludGF4IGlzIAorCSAqICBzdGVtOi8vb3JnLmVjbGlwc2Uuc3RlbS9sYWJlbC9wb3B1bGF0aW9uL0lTUi8yL2h1bWFuLzIwMDYvSUwtMDUtNjIzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFlFQVIgPSAiMjAwNiI7CisJCisJLyoqCisJICogYW5hbHlzaXMgbW9kZSB1c2luZyBBTEwgZGF0YSBpbmNsdWRpbmcgemVyb3MKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfTU9ERSA9IDA7CisJCisJLyoqCisJICogYW5hbHlzaXMgbW9kZSBhbmFseXppbmcgZGF0YSBvbmx5IHdoZW4gUyxFLEksUiBhcmUgYWxsID4gMC4wOworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTl9aRVJPX0RBVEFfTU9ERSA9IDE7CisJCisJCisJLyoqCisJICogY29uc3RhbnQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRVZFTF9TVFJJTkcgPSAibGV2ZWwiOyAJCisJCisJLy8gZml0IGFsbCBsb2NhdGlvbnMgd2l0aCBtYXggaW5mZWN0aW91cyBwb3B1bGF0aW9ucyA+PSBGSVRUSU5HX0ZSQUNUSU9OICogTEFSR0VTVCBJbmZlY3Rpb3VzIFBvcHVsYXRpb24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgRklUVElOR19GUkFDVElPTiA9IDAuMDU7CisJCisJLyoqCisJICogVGhlIHBhcmVudCBjb250cm9sCisJICovCisJcHJvdGVjdGVkIEVzdGltYXRvckNvbnRyb2wgY29udHJvbCA9IG51bGw7CisJCisJLyoqCisJICogCisJICogQHBhcmFtIHNjZW5hcmlvRGF0YU1hcAorCSAqIEBwYXJhbSBwYXJhbWV0ZXJFc3RpbWF0b3JNZXRob2QgCisJICovCisJcHVibGljIFNjZW5hcmlvUGFyYW1ldGVyRXN0aW1hdG9yKFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwgc2NlbmFyaW9EYXRhTWFwLCBQYXJhbWV0ZXJFc3RpbWF0b3JNZXRob2QgcGFyYW1ldGVyRXN0aW1hdG9yTWV0aG9kKSB7CisJCXJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcCA9IHNjZW5hcmlvRGF0YU1hcDsKKwkJdGhpcy5wYXJhbWV0ZXJFc3RpbWF0b3JNZXRob2QgPSBwYXJhbWV0ZXJFc3RpbWF0b3JNZXRob2Q7CisJCXJlZmVyZW5jZUxvY2F0aW9ucyA9IGdldFJlZmVyZW5jZUxvY2F0aW9ucygpOworCQlnZXRBcmVhRGF0YU1hcCgpOworCQlnZXRQb3B1bGF0aW9uRGF0YU1hcCgpOworCX0KKwkKKwkvKioKKwkgKiBFc3RpbWF0ZSB0aGUgcmF0ZSBwYXJhbWV0ZXJzIGZyb20gdGhlIGV4aXN0aW5nIHNjZW5hcmlvIGRhdGEKKwkgKiBAcGFyYW0gY29udHJvbFBhcmFtdGVyc01hcCAKKyAgICAgKiBAcGFyYW0gcnVubmFibGVDb250ZXh0IENvbnRleHQgZm9yIGxvbmcgcnVubmluZyB0YXNrcworCSAqIEByZXR1cm4gbWFwIG9mIHBhcmFtZXRlcnMKKwkgKi8KKwlwdWJsaWMgTWFwPFN0cmluZyxNb2RlbFBhcmFtZXRlcnM+IGVzdGltYXRlUGFyYW1ldGVycyhNYXA8U3RyaW5nLE9iamVjdD4gY29udHJvbFBhcmFtdGVyc01hcCwgSVJ1bm5hYmxlQ29udGV4dCBydW5uYWJsZUNvbnRleHQpIHsgCQkKKwkJZmluYWwgTWFwPFN0cmluZyxPYmplY3Q+IGZpbmFsUGFyYW1ldGVyTWFwID0gY29udHJvbFBhcmFtdGVyc01hcDsKKwkJCisJCWZpbmFsIFBhcmFtZXRlckVzdGltYXRvck1ldGhvZCBtZXRob2QgPSB0aGlzLnBhcmFtZXRlckVzdGltYXRvck1ldGhvZDsKKwkJCisJCUlTY2VuYXJpb1BhcmFtZXRlckVzdGltYXRvclJ1bm5hYmxlV2l0aFByb2dyZXNzIGFuYWx5c2lzVGFzayA9IG5ldyBJU2NlbmFyaW9QYXJhbWV0ZXJFc3RpbWF0b3JSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKKwkJCXB1YmxpYyBNYXA8U3RyaW5nLE1vZGVsUGFyYW1ldGVycz4gZml0dGVkUGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZyxNb2RlbFBhcmFtZXRlcnM+KCk7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgeworICAgICAgICAgICAgCUl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IHJlZmVyZW5jZUxvY2F0aW9ucy5pdGVyYXRvcigpOworICAgICAgICAgICAgCWludCBpY291bnQgPSAwOworICAgICAgICAgICAgICAgIHByb2dyZXNzLmJlZ2luVGFzaygiRXN0aW1hdGluZyBwYXJhbWV0ZXJzIiwgcmVmZXJlbmNlTG9jYXRpb25zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgLy8gVE9ETyBTVEFSVCB0aGlzIGNvZGUgZXhpc3RzIG9ubHkgdG8gVEVTVCB0aGUgQ3ljbGVDb21wcmVzc29yIGNsYXNzCisgICAgICAgIAkJLy8gVE9ETyBTVEFSVCB0aGlzIGNvZGUgZXhpc3RzIG9ubHkgdG8gVEVTVCB0aGUgQ3ljbGVDb21wcmVzc29yIGNsYXNzCisgICAgICAgICAgICAgICAgLy8gVE9ETyBTSE9VTEQgRVZFTlRVQUxMWSBCRSBQQVJUIE9GIFJPTkkncyBuZXcgVklFVworICAgICAgICAJCS8vTGlzdDxTdHJpbmc+IGFsbElEcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAJCS8vTGlzdDxkb3VibGVbXT4gYWxsQ29tcHJlc3NlZEluY2lkZW5jZSA9IG5ldyBBcnJheUxpc3Q8ZG91YmxlW10+KCk7CisgICAgICAgIAkJLy8gVE9ETyBFTkQgdGhpcyBjb2RlIGV4aXN0cyBvbmx5IHRvIFRFU1QgdGhlIEN5Y2xlQ29tcHJlc3NvciBjbGFzcworICAgICAgICAJCS8vIFRPRE8gRU5EIHRoaXMgY29kZSBleGlzdHMgb25seSB0byBURVNUIHRoZSBDeWNsZUNvbXByZXNzb3IgY2xhc3MKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB3aGlsZShpdGVyLmhhc05leHQoKSkgewkKKyAgICAgICAgICAgICAgICAJaWNvdW50ICsrOworICAgICAgICAgICAgCQkvL2lmIChpY291bnQlMTAwPT0wKSBTeXN0ZW0ub3V0LnByaW50bG4oIi4iKTsKKyAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgCQlTdHJpbmcgaWQgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgCQlSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBsb2NhdGlvbkRhdGFNYXAgPSByZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAuZ2V0TG9jYXRpb24oaWQpOworICAgICAgICAgICAgCQorICAgICAgICAgICAgCQkvLyBUT0RPIFNUQVJUIHRoaXMgY29kZSBleGlzdHMgb25seSB0byBURVNUIHRoZSBDeWNsZUNvbXByZXNzb3IgY2xhc3MKKyAgICAgICAgICAgIAkJLy8gVE9ETyBTVEFSVCB0aGlzIGNvZGUgZXhpc3RzIG9ubHkgdG8gVEVTVCB0aGUgQ3ljbGVDb21wcmVzc29yIGNsYXNzCisgICAgICAgICAgICAJCS8vIFRPRE8gU0hPVUxEIEVWRU5UVUFMTFkgQkUgUEFSVCBPRiBST05JJ3MgbmV3IFZJRVcKKyAgICAgICAgICAgIAkJLy9hbGxJRHMuYWRkKGlkKTsKKyAgICAgICAgICAgIAkJLy9DeWNsZUNvbXByZXNzb3IgY29tcHJlc3NvciA9IG5ldyBDeWNsZUNvbXByZXNzb3IobG9jYXRpb25EYXRhTWFwKTsKKyAgICAgICAgICAgIAkJLy9kb3VibGVbXSByZXN1bHQgPSBjb21wcmVzc29yLmdldENvbXByZXNzZWREYXRhKCk7CisgICAgICAgICAgICAJCS8vYWxsQ29tcHJlc3NlZEluY2lkZW5jZS5hZGQocmVzdWx0KTsKKyAgICAgICAgICAgIAkJLy8gVE9ETyBFTkQgdGhpcyBjb2RlIGV4aXN0cyBvbmx5IHRvIFRFU1QgdGhlIEN5Y2xlQ29tcHJlc3NvciBjbGFzcworICAgICAgICAgICAgCQkvLyBUT0RPIEVORCB0aGlzIGNvZGUgZXhpc3RzIG9ubHkgdG8gVEVTVCB0aGUgQ3ljbGVDb21wcmVzc29yIGNsYXNzCisgICAgICAgICAgICAJCQorICAgICAgICAgICAgCQkKKyAgICAgICAgICAgCQkJZXN0aW1hdG9yID0gUGFyYW1ldGVyRXN0aW1hdG9yRmFjdG9yeS5jcmVhdGVFc3RpbWF0b3IobWV0aG9kLCBsb2NhdGlvbkRhdGFNYXApOworICAgICAgICAgICAJCQllc3RpbWF0b3Iuc2V0QWxsUGFyYW1ldGVycyhmaW5hbFBhcmFtZXRlck1hcCk7CisgICAgICAgICAgIAkJCQorICAgICAgICAgICAJCQlkb3VibGUgbG9jYWxBcmVhID0gZ2V0QXJlYShpZCkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgCQkJYXNzZXJ0KGxvY2FsQXJlYSA+IDAuMCk7CisgICAgICAgICAgIAkJCWlmKGxvY2FsQXJlYSA9PSAwKSBsb2NhbEFyZWEgPSAxLjA7IC8vIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICAgCQkJZmluYWwgZG91YmxlIGxvY2FsUG9wdWxhdGlvbiA9IGdldFBvcHVsYXRpb24oaWQpLmRvdWJsZVZhbHVlKCk7CisgICAgICAgICAgIAkJCWZpbmFsIGRvdWJsZSBsb2NhbERlbnNpdHkgPSBsb2NhbFBvcHVsYXRpb24vbG9jYWxBcmVhOworICAgICAgICAgICAJCQlNb2RlbFBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IGVzdGltYXRvci5lc3RpbWF0ZShsb2NhbERlbnNpdHksIGxvY2FsUG9wdWxhdGlvbixpZCk7CisgICAgICAgICAgIAkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJnb3QgcGFyYW1ldGVycyAiK3BhcmFtZXRlcnMudG9TdHJpbmcoKSk7CisgICAgICAgICAgIAkJCWZpdHRlZFBhcmFtZXRlcnMucHV0KGlkLCBwYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIAkJaWYgKHByb2dyZXNzLmlzQ2FuY2VsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgCQlwcm9ncmVzcy53b3JrZWQoMSk7CisgICAgICAgICAgICAJfSAvLyB3aGlsZQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFRPRE8gU1RBUlQgdGhpcyBjb2RlIGV4aXN0cyBvbmx5IHRvIFRFU1QgdGhlIEN5Y2xlQ29tcHJlc3NvciBjbGFzcworICAgICAgICAJCS8vIFRPRE8gU1RBUlQgdGhpcyBjb2RlIGV4aXN0cyBvbmx5IHRvIFRFU1QgdGhlIEN5Y2xlQ29tcHJlc3NvciBjbGFzcworICAgICAgICAgICAgICAgIC8vIFRPRE8gU0hPVUxEIEVWRU5UVUFMTFkgQkUgUEFSVCBPRiBST05JJ3MgbmV3IFZJRVcKKyAgICAgICAgICAgICAgICAvL0NTVkFuYWx5c2lzV3JpdGVyIHdyaXRlciA9IG5ldyBDU1ZBbmFseXNpc1dyaXRlcigiQzovcnVudGltZS1zdGVtLnByb2R1Y3QvTWVjaWRzL3JlY29yZGVkc2ltdWxhdGlvbnMvSW5mbHVlbnphL2N5Y2xlQ29tcHJlc3NlZC8iLCJJbmNpZGVuY2UiKTsKKyAgICAgICAgCQkvL3dyaXRlci5sb2dEYXRhKGFsbElEcywgYWxsQ29tcHJlc3NlZEluY2lkZW5jZSk7CisgICAgICAgIAkJLy8gVE9ETyBFTkQgdGhpcyBjb2RlIGV4aXN0cyBvbmx5IHRvIFRFU1QgdGhlIEN5Y2xlQ29tcHJlc3NvciBjbGFzcworICAgICAgICAJCS8vIFRPRE8gRU5EIHRoaXMgY29kZSBleGlzdHMgb25seSB0byBURVNUIHRoZSBDeWNsZUNvbXByZXNzb3IgY2xhc3MKKyAgICAgICAgCQkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwcm9ncmVzcy5kb25lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUmV0dXJuIHRoZSBmaXR0ZWQgcGFyYW1ldGVycworICAgICAgICAgICAgICogQHJldHVybiBNYXA8U3RyaW5nLCBNb2RlbFBhcmFtZXRlcnM+IHJlc3VsdAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgTW9kZWxQYXJhbWV0ZXJzPiBnZXRGaXR0ZWRQYXJhbWV0ZXJzKCkgeworICAgICAgICAgICAgCXJldHVybiB0aGlzLmZpdHRlZFBhcmFtZXRlcnM7CisgICAgICAgICAgICB9CisgICAgICAgICB9OworICAgICAgICAgdHJ5IHsKKyAgICAgICAgCSBydW5uYWJsZUNvbnRleHQucnVuKHRydWUsIHRydWUsIGFuYWx5c2lzVGFzayk7CisgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgIAkgQWN0aXZhdG9yLmxvZ0Vycm9yKCIiLCBpZSk7CisgICAgICAgIAkgcmV0dXJuIG51bGw7CisgICAgICAgICB9IGNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7CisgICAgICAgIAkgQWN0aXZhdG9yLmxvZ0Vycm9yKCIiLCBpdGUpOworICAgICAgICAJIHJldHVybiBudWxsOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIGFuYWx5c2lzVGFzay5nZXRGaXR0ZWRQYXJhbWV0ZXJzKCk7CisJfS8vZXN0aW1hdGVQYXJhbWV0ZXJzKCkgCisJCisJLyoqCisJICogQXZlcmFnZSBBbGwgZGF0YSBUSEVOIEVzdGltYXRlIHRoZSByYXRlIHBhcmFtZXRlcnMgZnJvbSB0aGUgYXZlcmFnZWQgc2NlbmFyaW8gZGF0YQorCSAqIEBwYXJhbSBjb250cm9sUGFyYW10ZXJzTWFwIAorCSAqIEBwYXJhbSBydW5uYWJsZUNvbnRleHQgQ29udGV4dCBmb3IgbG9uZyBydW5uaW5nIHRhc2tzCisJICogQHJldHVybiBtYXAgb2YgcGFyYW1ldGVycworCSAqLworCXB1YmxpYyBNb2RlbFBhcmFtZXRlcnMgYXZlcmFnZVRoZW5Fc3RpbWF0ZVBhcmFtZXRlcnMoTWFwPFN0cmluZyxPYmplY3Q+IGNvbnRyb2xQYXJhbXRlcnNNYXAsIElSdW5uYWJsZUNvbnRleHQgcnVubmFibGVDb250ZXh0KSB7IAkJIAkJCisJCWZpbmFsIE1hcDxTdHJpbmcsT2JqZWN0PiBmaW5hbFBhcmFtZXRlck1hcCA9IGNvbnRyb2xQYXJhbXRlcnNNYXA7CisJCWZpbmFsIFBhcmFtZXRlckVzdGltYXRvck1ldGhvZCBtZXRob2QgPSB0aGlzLnBhcmFtZXRlckVzdGltYXRvck1ldGhvZDsKKwkJCisJCUlBdmVyYWdlZFBhcmFtZXRlckVzdGltYXRvclJ1bm5hYmxlV2l0aFByb2dyZXNzIGFuYWx5c2lzVGFzayA9IG5ldyBJQXZlcmFnZWRQYXJhbWV0ZXJFc3RpbWF0b3JSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKKwkJCU1vZGVsUGFyYW1ldGVycyBtb2RlbFBhcmFtZXRlcnMgPSBudWxsOworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgIAlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSByZWZlcmVuY2VMb2NhdGlvbnMuaXRlcmF0b3IoKTsKKyAgICAKKyAgICAgICAgICAgICAgICBwcm9ncmVzcy5iZWdpblRhc2soIkF2ZXJhZ2luZyBkYXRhIiwgcmVmZXJlbmNlTG9jYXRpb25zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UgYXZlcmFnZWREYXRhTWFwID0gbnVsbDsKKyAgICAgICAgICAgICAgICBkb3VibGUgbG9jYWxBcmVhID0gMC4wOworICAgICAgICAgICAgICAgIGRvdWJsZSBsb2NhbFBvcHVsYXRpb24gPSAwLjA7CisgICAgICAgICAgICAgICAgcmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwLmZpbmRNYXhJbmNpZGVuY2UoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaWRNYXggPSByZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAuZ2V0TWF4SW5jaWRlbmNlTG9jYXRpb24oKTsKKyAgICAgICAgICAgICAgICAvL2RvdWJsZSBtYXggPSByZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAuZ2V0TWF4SW5jaWRlbmNlKCk7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIiBtYXggaW5jaWRlbmNlIGlzICIrbWF4KyIgYXQgIitpZE1heCk7CisgICAgICAgICAgICAgIAlsb2NhbEFyZWEgKz0gZ2V0QXJlYShpZE1heCkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBsb2NhbFBvcHVsYXRpb24gKz0gZ2V0UG9wdWxhdGlvbihpZE1heCkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBtYXhsb2NhdGlvbkRhdGFNYXAgPSByZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAuZ2V0TG9jYXRpb24oaWRNYXgpOworICAgICAgICAgICAgICAgIGF2ZXJhZ2VkRGF0YU1hcCA9IG1heGxvY2F0aW9uRGF0YU1hcC5jbG9uZSgpOworICAgICAgICAgICAgICAgLy8gUGhhc2VTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gbmV3IFBoYXNlU3luY2hyb25pemVyKGF2ZXJhZ2VkRGF0YU1hcCk7CisgICAgICAgICAgICAgICAgCQorICAgICAgICAgICAgICAgIHdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7CQorICAgICAgICAgICAgCQlTdHJpbmcgaWQgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIAkJaWYoIWlkLmVxdWFsc0lnbm9yZUNhc2UoaWRNYXgpKSB7CisgICAgICAgICAgICAJCQlsb2NhbEFyZWEgKz0gZ2V0QXJlYShpZCkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAJCWxvY2FsUG9wdWxhdGlvbiArPSBnZXRQb3B1bGF0aW9uKGlkKS5kb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIAkJUmVmZXJlbmNlU2NlbmFyaW9EYXRhSW5zdGFuY2UgbG9jYXRpb25EYXRhTWFwID0gcmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwLmdldExvY2F0aW9uKGlkKTsKKyAgICAgICAgICAgICAgICAJCWF2ZXJhZ2VkRGF0YU1hcC5pbnRlZ3JhdGVEYXRhKGxvY2F0aW9uRGF0YU1hcC5pbnN0YW5jZSk7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgCQkJZXN0aW1hdG9yID0gUGFyYW1ldGVyRXN0aW1hdG9yRmFjdG9yeS5jcmVhdGVFc3RpbWF0b3IobWV0aG9kLCBhdmVyYWdlZERhdGFNYXApOworICAgICAgIAkJCWVzdGltYXRvci5zZXRBbGxQYXJhbWV0ZXJzKGZpbmFsUGFyYW1ldGVyTWFwKTsKKyAgICAgICAJCQlhc3NlcnQobG9jYWxBcmVhID4gMC4wKTsKKyAgICAgICAJCQlpZihsb2NhbEFyZWEgPT0gMCkgbG9jYWxBcmVhID0gMS4wOyAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgCQkJZmluYWwgZG91YmxlIGxvY2FsRGVuc2l0eSA9IGxvY2FsUG9wdWxhdGlvbi9sb2NhbEFyZWE7CisgICAgICAgIAkJCQkJCisgICAgICAgCQkJbW9kZWxQYXJhbWV0ZXJzID0gZXN0aW1hdG9yLmVzdGltYXRlKGxvY2FsRGVuc2l0eSwgbG9jYWxQb3B1bGF0aW9uLCBNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5BVkVSQUdFIikpOworICAgICAgIAkJCQorICAgICAgICAJCWlmIChwcm9ncmVzcy5pc0NhbmNlbGVkKCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgCQlwcm9ncmVzcy53b3JrZWQoMSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwcm9ncmVzcy5kb25lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUmV0dXJuIHRoZSBmaXR0ZWQgcGFyYW1ldGVycworICAgICAgICAgICAgICogQHJldHVybiBNYXA8U3RyaW5nLCBNb2RlbFBhcmFtZXRlcnM+IHJlc3VsdAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgTW9kZWxQYXJhbWV0ZXJzIGdldE1vZGVsUGFyYW1ldGVycygpIHsKKyAgICAgICAgICAgIAlyZXR1cm4gdGhpcy5tb2RlbFBhcmFtZXRlcnM7CisgICAgICAgICAgICB9CisgICAgICAgICB9OworICAgICAgICAgdHJ5IHsKKyAgICAgICAgCSBydW5uYWJsZUNvbnRleHQucnVuKHRydWUsIHRydWUsIGFuYWx5c2lzVGFzayk7CisgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgIAkgQWN0aXZhdG9yLmxvZ0Vycm9yKCIiLCBpZSk7CisgICAgICAgIAkgcmV0dXJuIG51bGw7CisgICAgICAgICB9IGNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7CisgICAgICAgIAkgQWN0aXZhdG9yLmxvZ0Vycm9yKCIiLCBpdGUpOworICAgICAgICAJIHJldHVybiBudWxsOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIGFuYWx5c2lzVGFzay5nZXRNb2RlbFBhcmFtZXRlcnMoKTsKKwl9Ly9hdmVyYWdlVGhlbkVzdGltYXRlUGFyYW1ldGVycygpIAorCQorCS8qKgorCSAqIFJldHVybnMgYSBzZXQgb2YgbG9jYXRpb25zIHdoZXJlIHRoZSBtYXggSW5mZWN0aW91cyBwb3B1bGF0aW9uIHNhdGlzZmllcyB0aGUgY3JpdGVyaW9uOgorCSAqIGxvY2FsTWF4SSA+PSBGSVRUSU5HX0ZSQUNUSU9OKmdsb2JhbE1heEkKKwkgKiBUaGVyZSBpcyBub3QgcG9pbnQgaW4gYW5hbHl6aW5nIGxvY2F0aW9ucyB3aGVyZSBuby1vbmUgZ2V0cyBzaWNrCisJICogQHJldHVybiBzZXQgb2YgcmVmZXJlbmNlTG9jYXRpb25zCisJICovCisJcHJpdmF0ZSBTZXQ8U3RyaW5nPiBnZXRSZWZlcmVuY2VMb2NhdGlvbnMoKSB7CisJCVNldDxTdHJpbmc+IGxvY2F0aW9uc1RvRml0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCQlTZXQ8U3RyaW5nPiBhbGxMb2NhdGlvbnMgPSByZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAuZ2V0TG9jYXRpb25zKCk7CisJCQorCQlkb3VibGUgZ2xvYmFsTWF4SSA9IDAuMDsKKwkJCisJCS8vIDEuIGdldCB0aGUgbG9jYWwgbWF4IGluZmVjdGlvdXMgY291bnQgYnkgcmVnaW9uIGlkIGZvciBhbGwgcmVnaW9ucworCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBhbGxMb2NhdGlvbnMuaXRlcmF0b3IoKTsKKwkJd2hpbGUoKGl0ZXIhPW51bGwpJiYoaXRlci5oYXNOZXh0KCkpKSAgeworCQkJU3RyaW5nIGlkID0gaXRlci5uZXh0KCk7CisJCQlSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBsb2NhdGlvbkRhdGFNYXAgPSByZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAuZ2V0TG9jYXRpb24oaWQpOworCQkJCisJCQlpZihsb2NhdGlvbkRhdGFNYXAuY29udGFpbnNQYXJhbWV0ZXIoU3RhdGVzLnN0YXRlc1RvRml0W1N0YXRlcy5JTkZFQ1RJT1VTXSkpIHsKKwkJCQlMaXN0PFN0cmluZz4gZGF0YSA9IGxvY2F0aW9uRGF0YU1hcC5nZXREYXRhKFN0YXRlcy5zdGF0ZXNUb0ZpdFtTdGF0ZXMuSU5GRUNUSU9VU10pOworCQkJCWRvdWJsZSBsb2NhbE1heCA9IDAuMDsKKwkJCQkKKwkJCQlmb3IoaW50IGkgPSAwOyBpIDwgZGF0YS5zaXplKCk7IGkgKyspIHsKKwkJCQkJZG91YmxlIGluZmVjdGlvdXMgPSAobmV3IERvdWJsZShkYXRhLmdldChpKSkpLmRvdWJsZVZhbHVlKCk7CisJCQkJCWlmIChsb2NhbE1heCA8IGluZmVjdGlvdXMpIGxvY2FsTWF4ID0gaW5mZWN0aW91czsKKwkJCQkJaWYgKGdsb2JhbE1heEkgPCBsb2NhbE1heCkgZ2xvYmFsTWF4SSA9IGxvY2FsTWF4OworCQkJCQkKKwkJCQl9CisJCQkJbWF4SW5mZWN0aW91c01hcC5wdXQoaWQsbmV3IERvdWJsZShsb2NhbE1heCkpOworCQkJfQorCQl9CisJCQorCQkvLyAyLiBTZWxlY3QgdGhvc2UgcmVnaW9ucyB3aXRoICBtYXggaW5mZWN0aW91cyBjb3VudCAgPj0gRklUVElOR19GUkFDVElPTiAqIExBUkdFU1QgSW5mZWN0aW91cyBQb3B1bGF0aW9uCisJCUl0ZXJhdG9yPFN0cmluZz4gaXRlcjIgPSBtYXhJbmZlY3Rpb3VzTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCXdoaWxlKChpdGVyMiE9bnVsbCkmJihpdGVyMi5oYXNOZXh0KCkpKSAgeworCQkJU3RyaW5nIGlkID0gaXRlcjIubmV4dCgpOworCQkJZG91YmxlIGxvY2FsTWF4SSA9IAltYXhJbmZlY3Rpb3VzTWFwLmdldChpZCkuZG91YmxlVmFsdWUoKTsKKwkJCWlmIChsb2NhbE1heEkgPj0gRklUVElOR19GUkFDVElPTipnbG9iYWxNYXhJKSB7CisJCQkJbG9jYXRpb25zVG9GaXQuYWRkKGlkKTsKKwkJCX0KKwkJCQorCQl9CisJCQorCSAgCXJldHVybiBsb2NhdGlvbnNUb0ZpdDsKKwl9CisJCisJLyoqCisJICogCisJICogQHBhcmFtIElECisJICogQHJldHVybgorCSAqLworCURvdWJsZSBnZXRBcmVhKFN0cmluZyBpZCkgeworCQlkb3VibGUgYXJlYSA9IDAuMDsKKwkJVVJJIHVyaSA9IGdldEFyZWFVUkkoaWQpOyAKKwkJLy8gTmV3IHV0aWxpdHkgbWV0aG9kCisJCUFyZWFMYWJlbCBhcmVhTGFiZWwgPSAoQXJlYUxhYmVsKW9yZy5lY2xpcHNlLnN0ZW0udWkuVXRpbGl0eS5nZXRMYWJlbCh1cmkpOworCQlpZihhcmVhTGFiZWw9PW51bGwpIEFjdGl2YXRvci5sb2dFcnJvcigiYXJlYSBsYWJlbCBpcyBudWxsIiwgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigibnVsbCBhcmVhIikpOworCQlhcmVhID0gYXJlYUxhYmVsLmdldEN1cnJlbnRBcmVhVmFsdWUoKS5nZXRBcmVhKCk7CisJCXJldHVybiBuZXcgRG91YmxlKGFyZWEpOworCX0KKwkKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gSUQKKwkgKiBAcmV0dXJuCisJICovCisJRG91YmxlIGdldFBvcHVsYXRpb24oU3RyaW5nIGlkKSB7CisJCWRvdWJsZSBwb3AgPSAwLjA7CisJCVVSSSB1cmkgPSBnZXRQb3B1bGF0aW9uVVJJKGlkKTsgCisJCS8vIE5ldyB1dGlsaXR5IG1ldGhvZAorCQlQb3B1bGF0aW9uTGFiZWwgcG9wTGFiZWwgPSAoUG9wdWxhdGlvbkxhYmVsKW9yZy5lY2xpcHNlLnN0ZW0udWkuVXRpbGl0eS5nZXRMYWJlbCh1cmkpOworCQlpZihwb3BMYWJlbD09bnVsbCkgQWN0aXZhdG9yLmxvZ0Vycm9yKCJQb3B1bGF0aW9uIGxhYmVsIGlzIG51bGwiLCBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCJudWxsIHBvcHVsYXRpb24iKSk7CisJCXBvcCA9IHBvcExhYmVsLmdldEN1cnJlbnRQb3B1bGF0aW9uVmFsdWUoKS5nZXRDb3VudCgpOworCQlyZXR1cm4gbmV3IERvdWJsZShwb3ApOworCX0KKwkKKwkvKioKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBhcmVhIG1hcAorCSAqLworCU1hcDxTdHJpbmcsRG91YmxlPiBnZXRBcmVhRGF0YU1hcCgpIHsKKwkJTWFwPFN0cmluZyxEb3VibGU+IGFyZWFNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRG91YmxlPigpOworCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSByZWZlcmVuY2VMb2NhdGlvbnMuaXRlcmF0b3IoKTsKKwkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyBpZCA9IGl0ZXIubmV4dCgpOworCQkJRG91YmxlIGFyZWEgPSBnZXRBcmVhKGlkKTsKKwkJCWFyZWFNYXAucHV0KGlkLCBhcmVhKTsKKwkJfQorCQlyZXR1cm4gYXJlYU1hcDsKKwl9CisJCisJLyoqCisJICogCisJICogQHJldHVybiB0aGUgcG9wdWxhdGlvbiBtYXAKKwkgKi8KKwlNYXA8U3RyaW5nLERvdWJsZT4gZ2V0UG9wdWxhdGlvbkRhdGFNYXAoKSB7CisJCU1hcDxTdHJpbmcsRG91YmxlPiBwb3BNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRG91YmxlPigpOworCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSByZWZlcmVuY2VMb2NhdGlvbnMuaXRlcmF0b3IoKTsKKwkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyBpZCA9IGl0ZXIubmV4dCgpOworCQkJRG91YmxlIHBvcHVsYXRpb24gPSBnZXRQb3B1bGF0aW9uKGlkKTsKKwkJCXBvcE1hcC5wdXQoaWQsIHBvcHVsYXRpb24pOworCQl9CQorCQlyZXR1cm4gcG9wTWFwOworCX0KKwkKKwkvKioKKwkgKiBjb252ZXJ0IGEgTGlzdCBvZiBTdHJpbmcgaW50byBhbmQgYXJyYXkgb2YgZG91YmxlCisJICogQHBhcmFtIGRhdGFMaXN0CisJICogQHJldHVybiBkb3VibGVbXSBvZiB2YWx1ZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGRvdWJsZVtdIGdldERvdWJsZVZhbHVlcyhMaXN0PFN0cmluZz4gZGF0YUxpc3QpIHsKKwkJZG91YmxlW10gcmV0VmFsdWUgPSBuZXcgZG91YmxlW2RhdGFMaXN0LnNpemUoKV07CisJCXRyeSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGFMaXN0LnNpemUoKTsgaSArKykgeworCQkJCURvdWJsZSBkYmxlT2JqID0gbmV3IERvdWJsZShkYXRhTGlzdC5nZXQoaSkpOworCQkJCXJldFZhbHVlW2ldID0gZGJsZU9iai5kb3VibGVWYWx1ZSgpOworCQkJfQorCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlN0cmluZyBEYXRhIG5vdCB2YWxpZC4gRXhwZWN0aW5nIERvdWJsZSB2YWx1ZXMiLCBlKTsKKwkJfQorCQkKKwkJcmV0dXJuIHJldFZhbHVlOworCX0KKwkKKworCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgRXN0aW1hdG9yCisgICAgICovCisgICAgcHVibGljIFBhcmFtZXRlckVzdGltYXRvciBnZXRFc3RpbWF0b3IoKSB7CisJCXJldHVybiBlc3RpbWF0b3I7CisJfQorCQorCQorCS8qKgorCSAqIAorCSAqIEBwYXJhbSBpZAorCSAqIEByZXR1cm4KKwkgKi8KKwlVUkkgZ2V0QXJlYVVSSShTdHJpbmcgaWQpIHsKKwkJaW50IGxldmVsID0gZ2V0TGV2ZWwoaWQpOworCQlTdHJpbmcgY291bnRyeUNvZGU7CisJCS8vIG5lZWQgdXJpIG9mIGZvcm06ICAgc3RlbTovL29yZy5lY2xpcHNlLnN0ZW0vbGFiZWwvYXJlYS9VU0EvMi9VUy1HQS0xMzMwNworCQlpZiAobGV2ZWwgPT0gMCkgIHsKKwkJCWNvdW50cnlDb2RlID0gaWQ7CisJCX0gZWxzZSB7CisJCQlTdHJpbmcgdHdvTGV0dGVyQ29kZSA9IGlkLnN1YnN0cmluZygwLDIpOworCQkJY291bnRyeUNvZGUgPSBvcmcuZWNsaXBzZS5zdGVtLmRhdGEuZ2VvZ3JhcGh5Lkdlb2dyYXBoaWNNYXBwZXIuZ2V0QWxwaGEzKHR3b0xldHRlckNvZGUpOworCQl9CisJCVN0cmluZyBjb21wb3NpdGUgPSAic3RlbTovL29yZy5lY2xpcHNlLnN0ZW0vIitBUkVBX1VSSV9QUkVGSVggKyAiLyIgKyBjb3VudHJ5Q29kZSArIi8iK2dldExldmVsKGlkKSsiLyIraWQ7CisJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKGNvbXBvc2l0ZSk7CQorCQlyZXR1cm4gdXJpOworCX0vLyBnZXRBcmVhVVJJCisJCisJCisJLyoqCisJICogCisJICogQHBhcmFtIGlkCisJICogQHJldHVybgorCSAqLworCVVSSSBnZXRQb3B1bGF0aW9uVVJJKFN0cmluZyBpZCkgeworCQlpbnQgbGV2ZWwgPSBnZXRMZXZlbChpZCk7CisJCVN0cmluZyBjb3VudHJ5Q29kZTsKKwkJLy8gY29tcG9zZSB0aGUgaW5wdXQgc3RyaW5nCisJCWlmIChsZXZlbCA9PSAwKSAgeworCQkJY291bnRyeUNvZGUgPSBpZDsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyB0d29MZXR0ZXJDb2RlID0gaWQuc3Vic3RyaW5nKDAsMik7CisJCQljb3VudHJ5Q29kZSA9IG9yZy5lY2xpcHNlLnN0ZW0uZGF0YS5nZW9ncmFwaHkuR2VvZ3JhcGhpY01hcHBlci5nZXRBbHBoYTModHdvTGV0dGVyQ29kZSk7CisJCX0KKwkJLy8gc3ludGF4IGlzCisJCS8vIHN0ZW06Ly9vcmcuZWNsaXBzZS5zdGVtL2xhYmVsL3BvcHVsYXRpb24vSVNSLzIvaHVtYW4vMjAwNi9JTC0wNS02MjMKKwkJCisJCS8vIEhhY2sgdG8gZml4IHllYXIgcHJvYmxlbS4gV2UgZG9uJ3Qga25vdyB0aGUgeWVhciwgdHJ5IHVudGlsIHdlIGd1ZXNzIHJpZ2h0CisJCVN0cmluZyBjb21wb3NpdGUgPSBudWxsOworCQlmb3IoaW50IHllYXI9MjAwMDt5ZWFyPDIwMjA7Kyt5ZWFyKSB7CisJCQljb21wb3NpdGUgPSAic3RlbTovL29yZy5lY2xpcHNlLnN0ZW0vIitQT1BVTEFUSU9OX1VSSV9QUkVGSVggKyAiLyIgKyBjb3VudHJ5Q29kZSArIi8iK2dldExldmVsKGlkKSsiLyIrU1BFQ0lFUysiLyIreWVhcisiLyIraWQ7CisJCQkKKwkJCXRyeSB7CisJCQkJZmluYWwgVVJJIHBvcHVsYXRpb25HcmFwaFVSSSA9IFV0aWxpdHkuY3JlYXRlUG9wdWxhdGlvbkdyYXBoVVJJKFVSSS5jcmVhdGVVUkkoY29tcG9zaXRlKSk7CisJCQkJCisJCQkJLy8gbmVlZCB0byBjYXRjaCBhbnkgZXhjZXB0aW9uIGhlcmUuLi53ZSB0YWtlIHRoZSBkYXRhIGZvciBhbnkgeWVhciBmb3IgdGhpcyBlc3RpbWF0ZQorCQkJCWZpbmFsIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOworCQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCIqIiwgbmV3IFhNSVJlc291cmNlRmFjdG9yeUltcGwoKSk7CisJCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRQcm90b2NvbFRvRmFjdG9yeU1hcCgpLnB1dCgicGxhdGZvcm0iLCBuZXcgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKKwkJCQlmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKHBvcHVsYXRpb25HcmFwaFVSSSx0cnVlKTsKKwkJCQlJZGVudGlmaWFibGUgaWRlbnQgPSAoSWRlbnRpZmlhYmxlKSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKKwkJCQlmaW5hbCBHcmFwaCBwb3B1bGF0aW9uR3JhcGggPSAoR3JhcGgpIGlkZW50OworCQkJCQorCQkJCS8vIGRpZCB3ZSBnZXQgdGhlIGRhdGEKKwkJCQlpZihwb3B1bGF0aW9uR3JhcGggIT0gbnVsbCkgYnJlYWs7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCS8vZG8gbm90aGluZy4gbm90IGFuIGVycm9yU3lzdGVtLm91dC5wcmludGxuKCJObyBFcnJvciBsb29raW5nIGZvciBkYXRhOiAiK2NvbXBvc2l0ZSk7CisJCQl9CisJCQkKKwkJfQorCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShjb21wb3NpdGUpOwkKKwkJcmV0dXJuIHVyaTsKKwl9Ly8gZ2V0UG9wdWxhdGlvblVSSQorCQorCS8qKgorCSAqIGZpbmRzIHRoZSBhZG1pbiBsZXZlbCBvZiB0aGUgaWQgYnkgY291bnRpbmcgJy0nIGNoYXJhY3RlcnMKKwkgKiBAcGFyYW0gaWQKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBpbnQgZ2V0TGV2ZWwoU3RyaW5nIGlkKSB7CisJCQorCQlpZihpZC5pbmRleE9mKCItIikgPT0tMSkgcmV0dXJuIDA7CisJCQorCQlpbnQgaWR4MSA9IGlkLmluZGV4T2YoIi0iKTsKKwkJU3RyaW5nIGZpcnN0UGFydCA9IGlkLnN1YnN0cmluZyhpZHgxKzEsaWQubGVuZ3RoKCkpOworCQlpZihmaXJzdFBhcnQuaW5kZXhPZigiLSIpID09LTEpIHJldHVybiAxOworCQkKKwkJaW50IGlkeDIgPSBmaXJzdFBhcnQuaW5kZXhPZigiLSIpOworCQlTdHJpbmcgc2Vjb25kUGFydCA9IGZpcnN0UGFydC5zdWJzdHJpbmcoaWR4MisxLGZpcnN0UGFydC5sZW5ndGgoKSk7CisJCWlmKHNlY29uZFBhcnQuaW5kZXhPZigiLSIpID09LTEpIHJldHVybiAyOworCQkKKworCQlpbnQgaWR4MyA9IHNlY29uZFBhcnQuaW5kZXhPZigiLSIpOworCQlTdHJpbmcgdGhpcmRQYXJ0ID0gc2Vjb25kUGFydC5zdWJzdHJpbmcoaWR4MysxLHNlY29uZFBhcnQubGVuZ3RoKCkpOworCQlpZih0aGlyZFBhcnQuaW5kZXhPZigiLSIpID09LTEpIHsKKwkJCXJldHVybiAzOworCQl9IAorCQkvLyBUT0RPIHNob3VsZCBnZW5lcmFsaXplIHRoaXMuCisJCXJldHVybiA0OyAvLyB0d28gbGV2ZWxzIHBhc3Qgd2hlcmUgd2Ugbm93IGhhdmUgZGF0YS4uLi4KKwkJCisJfQorCQorCQorCS8qKgorCSAqIAorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHN0YXRlcyB0byBmaXQgYnkgbmFtZQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U3RhdGVzVG9GaXQoKSB7CisJCXJldHVybiBTdGF0ZXMuc3RhdGVzVG9GaXQ7CisJfQorCQorCQorCQorCS8qKgorCSAqIEludGVybmFsIGludGVyZmFjZSBmb3IgbG9uZyBydW5uaW5nIHRhc2sKKwkgKi8KKwlwcml2YXRlIGludGVyZmFjZSBJU2NlbmFyaW9QYXJhbWV0ZXJFc3RpbWF0b3JSdW5uYWJsZVdpdGhQcm9ncmVzcyBleHRlbmRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7CisJCSAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBmaXR0ZWQgcGFyYW1ldGVycworICAgICAgICAgKiBAcmV0dXJuIE1hcDxTdHJpbmcsIE1vZGVsUGFyYW1ldGVycz4gcmVzdWx0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgTW9kZWxQYXJhbWV0ZXJzPiBnZXRGaXR0ZWRQYXJhbWV0ZXJzKCk7CisJfQorCQorCisJCisJLyoqCisJICogSW50ZXJuYWwgaW50ZXJmYWNlIGZvciBsb25nIHJ1bm5pbmcgdGFzaworCSAqLworCXByaXZhdGUgaW50ZXJmYWNlIElBdmVyYWdlZFBhcmFtZXRlckVzdGltYXRvclJ1bm5hYmxlV2l0aFByb2dyZXNzIGV4dGVuZHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKKwkJIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGZpdHRlZCBwYXJhbWV0ZXJzCisgICAgICAgICAqIEByZXR1cm4gTW9kZWxQYXJhbWV0ZXJzICByZXN1bHQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNb2RlbFBhcmFtZXRlcnMgZ2V0TW9kZWxQYXJhbWV0ZXJzKCk7CisJfQorCQorCS8qKgorCSAqIEdldCB0aGUgdmFsdWVzIHRvIHBsb3QgZnJvbSB0aGUgZXN0aW1hdG9yCisJICogQHBhcmFtIGNoYXJ0SW5kZXgKKwkgKiBAcGFyYW0gc3RhdGUKKwkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBkYXRhIHRvIHBsb3QKKwkgKi8KKwlwdWJsaWMgZG91YmxlW10gZ2V0VmFsdWVzKGludCBjaGFydEluZGV4LCBpbnQgc3RhdGUpIHsKKwkJcmV0dXJuIGVzdGltYXRvci5nZXRWYWx1ZXMoY2hhcnRJbmRleCwgc3RhdGUpOworCX0KKwkKK30vLyBnZXRMZXZlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvU2ltcGxpZmllZE1lYW5TcXVhcmVEaWZmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9TaW1wbGlmaWVkTWVhblNxdWFyZURpZmZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmI1N2U0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvU2ltcGxpZmllZE1lYW5TcXVhcmVEaWZmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qKgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuQW5hbHlzaXNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRXJyb3JSZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5TaW1wbGVFcnJvckZ1bmN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5BbmFseXNpc0ZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsOworCisKKyAgIAorCisvKiogCisgKiB0aGlzIGNsYXNzIGNvbXB1dGVzIHRoZSBtZWFuIHNxdWFyZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHNjZW5hcmlvcyBhcyBhIGZ1bmN0aW9uIG9mIHRpbWUKKyAqIDEuIEl0IG9ubHkgbG9va3MgYXQgbG9jYXRpb25zIHdoaWNoIGFyZSBDT01NT04gdG8gYm90aCBzY2VuYXJpb3MKKyAqIDIuIFRoZSB0aW1lIHNlcmllcyBzaG91bGQgYmUgdGhlIHNhbWUgbGVuZ3RoLiBJZiB0aGV5IGFyZSBub3QgdGhpcyB3aWxsIGNvbXBhcmUgb2YgYSBwZXJpb2QgZXF1YWwgdG8KKyAqICAgIHRoZSBTSE9SVEVTVCBvZiBhbGwgdGhlIHRpbWUgc2VyaWVzLiAKKyAqIDMuIEl0IG9ubHkgY29uc2lkZXJzIGxvY2F0aW9ucyB3aGVyZSBpbmZlY3Rpb3VzIGNvdW50IGlzIG5vbnplcm8gaW4gb25lIG9yIHRoZSBvdGhlciAtIG5vdCBpbnRlcmVzdGVkIGluIHdlaWdodGluZyByZWdpb25zIHdpdGggbm8gZGlzZWFzZS4KKyAqIAorICogVGhlIHNpbXBsaWZpZWQgdmVyc2lvbiBvbmx5IGRlYWxzIHdpdGggYWJzb2x1dGUgSSBjb21wYXJpc29uCisgKgorICovCisKK3B1YmxpYyBjbGFzcyBTaW1wbGlmaWVkTWVhblNxdWFyZURpZmZlcmVuY2UgeworCQorCVJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwgcmVmOworCVJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwgZGF0YTsKKwlFcnJvclJlc3VsdCByZXN1bHQ7CisJCisJc3RhdGljIEFuYWx5c2lzRmFjdG9yeSBhRmFjdG9yeSA9IG5ldyBBbmFseXNpc0ZhY3RvcnlJbXBsKCk7CisJc3RhdGljIFNpbXBsZUVycm9yRnVuY3Rpb24gZXJyb3JGdW5jdGlvbiA9IGFGYWN0b3J5LmNyZWF0ZVNpbXBsZUVycm9yRnVuY3Rpb24oKTsKKwkKKwkvKioKKwkgKiBpbnB1dAorCSAqLworCS8vTWFwPFN0cmluZyxMaXN0PERvdWJsZT4+IGNvbW1vbkluZmVjdGlvdXNMb2NhdGlvbnNBID0gbmV3IEhhc2hNYXA8U3RyaW5nLExpc3Q8RG91YmxlPj4oKTsKKwkvL01hcDxTdHJpbmcsTGlzdDxEb3VibGU+PiBjb21tb25JbmZlY3Rpb3VzTG9jYXRpb25zQiA9IG5ldyBIYXNoTWFwPFN0cmluZyxMaXN0PERvdWJsZT4+KCk7CisJCisJCisJCisJCisJLyoqCisJICogRGV0ZXJtaW5lcyB0aGUgTWVhblNxdWFyZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHNjZW5hcmlvIGRhdGEgc2V0cyBvdmVyIHRpbWUgZWFjaCBzdG9yZWQgaW4gYSBtYXAKKwkgKiBAcGFyYW0gc2NlbmFyaW9NYXBBIAorCSAqIEBwYXJhbSBzY2VuYXJpb01hcEIgCisJICovCisJcHVibGljIFNpbXBsaWZpZWRNZWFuU3F1YXJlRGlmZmVyZW5jZShSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIHNjZW5hcmlvTWFwQSwgUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCBzY2VuYXJpb01hcEIpIHsKKwkJcmVmID0gc2NlbmFyaW9NYXBBOworCQlkYXRhID0gc2NlbmFyaW9NYXBCOworCX0vLyBjb25zdHJ1Y3RvciBNZWFuU3F1YXJlRGlmZmVyZW5jZQorCQorCQorCQorCQorCS8qKgorCSAqIHNvbHZlcyBmb3IgdGhlIFJvb3QgTWVhblNxdWFyZURpZmZlcmVuY2UgdnMgdGltZQorCSAqIHVzaW5nIGluZmVjdGlvdXMgZGF0YSBvbmx5IGZvciBub3cKKwkgKiAKKwkgKiBAcGFyYW0gcnVubmFibGVDb250ZXh0IFJ1bm5hYmxlIGNvbnRleHQgZm9yIHByb2dyZXNzIGluZGljYXRvcgorCSAqIEByZXR1cm4gY29tcGFyaXNvbiB0aW1lIHNlcmllcyBhcyBkb3VibGVbXQorCSAqLworCXB1YmxpYyBFcnJvclJlc3VsdCBzb2x2ZShJUnVubmFibGVDb250ZXh0IHJ1bm5hYmxlQ29udGV4dCkgeworCQlmaW5hbCBTaW1wbGlmaWVkTWVhblNxdWFyZURpZmZlcmVuY2Ugc2VsZiA9IHRoaXM7CisJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyB0YXNrID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB7CisgICAgICAgICAgICAJcHJvZ3Jlc3MuYmVnaW5UYXNrKCJTb2x2aW5nLi4uIiwgMTAwKTsKKyAgICAgICAgICAgIAkKKyAgICAgICAgICAgIAlzZWxmLnJlc3VsdCA9IGVycm9yRnVuY3Rpb24uY2FsY3VsYXRlRXJyb3Ioc2VsZi5yZWYsIHNlbGYuZGF0YSk7CisgICAgICAgICAgICAJcHJvZ3Jlc3MuZG9uZSgpOworICAgICAgICAgICAgfQorCQl9OworCQkKKwkJdHJ5IHsKKwkJCXJ1bm5hYmxlQ29udGV4dC5ydW4odHJ1ZSwgZmFsc2UsIHRhc2spOworCQl9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisJCQkvLyBUYXNrIGlzIG5vdCBpbnRlcnJ1cHRhYmxlCisJCX0gY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKKwkJCS8vIFRhc2sgaXMgbm90IGludGVycnVwdGFibGUKKwkJfQorCQlyZXR1cm4gdGhpcy5yZXN1bHQ7CisJfS8vIHNvbHZlKCkKKworCQorCQorfSAvLyBjbGFzcyBTaW1wbGVNZWFuU3F1YXJlRGlmZmVyZW5jZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvVGhyZXNob2xkTWVhblNxdWFyZURpZmZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL1RocmVzaG9sZE1lYW5TcXVhcmVEaWZmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4OTczZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL1RocmVzaG9sZE1lYW5TcXVhcmVEaWZmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qKgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuQW5hbHlzaXNGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRXJyb3JSZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5UaHJlc2hvbGRFcnJvckZ1bmN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5BbmFseXNpc0ZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsOworCisKKyAgIAorCisvKiogCisgKiB0aGlzIGNsYXNzIGNvbXB1dGVzIHRoZSBtZWFuIHNxdWFyZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHNjZW5hcmlvcyBhcyBhIGZ1bmN0aW9uIG9mIHRpbWUKKyAqIDEuIEl0IG9ubHkgbG9va3MgYXQgbG9jYXRpb25zIHdoaWNoIGFyZSBDT01NT04gdG8gYm90aCBzY2VuYXJpb3MKKyAqIDIuIFRoZSB0aW1lIHNlcmllcyBzaG91bGQgYmUgdGhlIHNhbWUgbGVuZ3RoLiBJZiB0aGV5IGFyZSBub3QgdGhpcyB3aWxsIGNvbXBhcmUgb2YgYSBwZXJpb2QgZXF1YWwgdG8KKyAqICAgIHRoZSBTSE9SVEVTVCBvZiBhbGwgdGhlIHRpbWUgc2VyaWVzLiAKKyAqIDMuIEl0IG9ubHkgY29uc2lkZXJzIGxvY2F0aW9ucyB3aGVyZSBpbmZlY3Rpb3VzIGNvdW50IGlzIG5vbnplcm8gaW4gb25lIG9yIHRoZSBvdGhlciAtIG5vdCBpbnRlcmVzdGVkIGluIHdlaWdodGluZyByZWdpb25zIHdpdGggbm8gZGlzZWFzZS4KKyAqIDQuIFRoZXJlIGlzIGEgdGhyZXNob2xkIHdoZXJlIHdlICBpZ25vcmUgZXJyb3IgaWYgaXQncyBiZWxvdyB0aGUgdGhyZXNob2xkLiAKKyAqIAorICogCisgKiBUaGUgc2ltcGxpZmllZCB2ZXJzaW9uIG9ubHkgZGVhbHMgd2l0aCBhYnNvbHV0ZSBJIGNvbXBhcmlzb24KKyAqCisgKi8KKworcHVibGljIGNsYXNzIFRocmVzaG9sZE1lYW5TcXVhcmVEaWZmZXJlbmNlIHsKKwkKKwlSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIHJlZjsKKwlSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIGRhdGE7CisJRXJyb3JSZXN1bHQgcmVzdWx0OworCQorCXN0YXRpYyBBbmFseXNpc0ZhY3RvcnkgYUZhY3RvcnkgPSBuZXcgQW5hbHlzaXNGYWN0b3J5SW1wbCgpOworCXN0YXRpYyBUaHJlc2hvbGRFcnJvckZ1bmN0aW9uIGVycm9yRnVuY3Rpb24gPSBhRmFjdG9yeS5jcmVhdGVUaHJlc2hvbGRFcnJvckZ1bmN0aW9uKCk7CisJCisJLyoqCisJICogaW5wdXQKKwkgKi8KKwkvL01hcDxTdHJpbmcsTGlzdDxEb3VibGU+PiBjb21tb25JbmZlY3Rpb3VzTG9jYXRpb25zQSA9IG5ldyBIYXNoTWFwPFN0cmluZyxMaXN0PERvdWJsZT4+KCk7CisJLy9NYXA8U3RyaW5nLExpc3Q8RG91YmxlPj4gY29tbW9uSW5mZWN0aW91c0xvY2F0aW9uc0IgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTGlzdDxEb3VibGU+PigpOworCQorCQorCQorCQorCS8qKgorCSAqIERldGVybWluZXMgdGhlIE1lYW5TcXVhcmUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBzY2VuYXJpbyBkYXRhIHNldHMgb3ZlciB0aW1lIGVhY2ggc3RvcmVkIGluIGEgbWFwCisJICogQHBhcmFtIHNjZW5hcmlvTWFwQSAKKwkgKiBAcGFyYW0gc2NlbmFyaW9NYXBCIAorCSAqLworCXB1YmxpYyBUaHJlc2hvbGRNZWFuU3F1YXJlRGlmZmVyZW5jZShSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIHNjZW5hcmlvTWFwQSwgUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCBzY2VuYXJpb01hcEIpIHsKKwkJcmVmID0gc2NlbmFyaW9NYXBBOworCQlkYXRhID0gc2NlbmFyaW9NYXBCOworCX0vLyBjb25zdHJ1Y3RvciBNZWFuU3F1YXJlRGlmZmVyZW5jZQorCQorCQorCQorCQorCS8qKgorCSAqIHNvbHZlcyBmb3IgdGhlIFJvb3QgTWVhblNxdWFyZURpZmZlcmVuY2UgdnMgdGltZQorCSAqIHVzaW5nIGluZmVjdGlvdXMgZGF0YSBvbmx5IGZvciBub3cKKwkgKiAKKwkgKiBAcGFyYW0gcnVubmFibGVDb250ZXh0IFJ1bm5hYmxlIGNvbnRleHQgZm9yIHByb2dyZXNzIGluZGljYXRvcgorCSAqIEByZXR1cm4gY29tcGFyaXNvbiB0aW1lIHNlcmllcyBhcyBkb3VibGVbXQorCSAqLworCXB1YmxpYyBFcnJvclJlc3VsdCBzb2x2ZShJUnVubmFibGVDb250ZXh0IHJ1bm5hYmxlQ29udGV4dCkgeworCQlmaW5hbCBUaHJlc2hvbGRNZWFuU3F1YXJlRGlmZmVyZW5jZSBzZWxmID0gdGhpczsKKwkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHRhc2sgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgIAlwcm9ncmVzcy5iZWdpblRhc2soIlNvbHZpbmcuLi4iLCAxMDApOworICAgICAgICAgICAgCQorICAgICAgICAgICAgCXNlbGYucmVzdWx0ID0gZXJyb3JGdW5jdGlvbi5jYWxjdWxhdGVFcnJvcihzZWxmLnJlZiwgc2VsZi5kYXRhKTsKKyAgICAgICAgICAgIAlwcm9ncmVzcy5kb25lKCk7CisgICAgICAgICAgICB9CisJCX07CisJCQorCQl0cnkgeworCQkJcnVubmFibGVDb250ZXh0LnJ1bih0cnVlLCBmYWxzZSwgdGFzayk7CisJCX0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKwkJCS8vIFRhc2sgaXMgbm90IGludGVycnVwdGFibGUKKwkJfSBjYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgeworCQkJLy8gVGFzayBpcyBub3QgaW50ZXJydXB0YWJsZQorCQl9CisJCXJldHVybiB0aGlzLnJlc3VsdDsKKwl9Ly8gc29sdmUoKQorCisJCisJCit9IC8vIGNsYXNzIFRocmVzaG9sZE1lYW5TcXVhcmVEaWZmZXJlbmNlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9wZXJzcGVjdGl2ZXMvQW5hbHlzaXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3BlcnNwZWN0aXZlcy9BbmFseXNpcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlY2FlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy9wZXJzcGVjdGl2ZXMvQW5hbHlzaXMuamF2YQpAQCAtMCwwICsxLDgxIEBACisvLyBBbmFseXNpcy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy5wZXJzcGVjdGl2ZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuRXBpZGVtaWNWaWV3OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5Fc3RpbWF0b3JWaWV3OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5MeWFwdW5vdlZpZXc7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLlByb2Nlc3NvclZpZXc7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLlNjZW5hcmlvQ29tcGFyaXNvblZpZXc7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZvbGRlckxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OworCisKKy8qKgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSAiQW5hbHlzaXMiIHBlcnNwZWN0aXZlIG9mIFNURU0uIFRoaXMgcGVyc3BlY3RpdmUgaXMKKyAqIHVzZWQgdG8gcmV2aWV3IGFuZCBjb21wYXJlIHRoZSByZXN1bHRzIG9mIGRpZmZlcmVudCBydW5zLgorICovCitwdWJsaWMgY2xhc3MgQW5hbHlzaXMgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKKworCS8qKgorCSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBEZXNpZ25lciBQZXJzcGVjdGl2ZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1NURU1fQU5BTFlTSVNfUEVSU1BFQ1RJVkUgPSBDb25zdGFudHMuSURfUk9PVAorCQkJKyAiLnV0aWwuYW5hbHlzaXMucGVyc3BlY3RpdmVzLlNURU1BbmFseXNpc1BlcnNwZWN0aXZlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5I2NyZWF0ZUluaXRpYWxMYXlvdXQob3JnLmVjbGlwc2UudWkKKwkgKiAgICAgIC5JUGFnZUxheW91dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KGZpbmFsIElQYWdlTGF5b3V0IGxheW91dCkgeworCQlmaW5hbCBTdHJpbmcgZWRpdG9yQXJlYSA9IGxheW91dC5nZXRFZGl0b3JBcmVhKCk7CisKKwkJLy8gV2UgZG9uJ3Qgd2FudCB0byBzZWUgdGhlIGVkaXRvcgorCQlsYXlvdXQuc2V0RWRpdG9yQXJlYVZpc2libGUoZmFsc2UpOworCQkKKwkJLy8gUHV0IHRoZSBTVEVNIEFuYWx5c2lzIFZpZXdzIG9uIHRvcAorCQlmaW5hbCBJRm9sZGVyTGF5b3V0IHRvcCA9IGxheW91dC5jcmVhdGVGb2xkZXIoCisJCQkJInRvcCIsIElQYWdlTGF5b3V0LlRPUCwgLy8kTk9OLU5MUy0xJAorCQkJCTEuMDBmLCBlZGl0b3JBcmVhKTsKKwkJCisJCXRvcC5hZGRWaWV3KFByb2Nlc3NvclZpZXcuSURfUHJvY2Vzc29yX1ZJRVcpOworCQl0b3AuYWRkVmlldyhFc3RpbWF0b3JWaWV3LklEX0VzdGltYXRvcl9WSUVXKTsKKwkJdG9wLmFkZFZpZXcoU2NlbmFyaW9Db21wYXJpc29uVmlldy5JRF9Db21wYXJpc29uX1ZJRVcpOworCQl0b3AuYWRkVmlldyhMeWFwdW5vdlZpZXcuSURfTHlhcHVub3ZfVklFVyk7CisJCXRvcC5hZGRWaWV3KEVwaWRlbWljVmlldy5JRF9BZ2dyZWdhdGVfVklFVyk7CisJCQorCQkvLyBUT0RPIGZpeCBoYXJkIGNvZGVkIGlkcworCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChQcm9jZXNzb3JWaWV3LklEX1Byb2Nlc3Nvcl9WSUVXKTsKKwkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoRXN0aW1hdG9yVmlldy5JRF9Fc3RpbWF0b3JfVklFVyk7CisJCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KFNjZW5hcmlvQ29tcGFyaXNvblZpZXcuSURfQ29tcGFyaXNvbl9WSUVXKTsKKwkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoTHlhcHVub3ZWaWV3LklEX0x5YXB1bm92X1ZJRVcpOworCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChFcGlkZW1pY1ZpZXcuSURfQWdncmVnYXRlX1ZJRVcpOworCQkKKwkJLy90b3AuYWRkVmlldyhQcm9qZWN0RXhwbG9yZXIuVklFV19JRCk7CisKKwkJLy8gUHV0IHRoZSBHcmFwaHMgVmlldyBvbiB0aGUgYm90dG9tIHdpdGggdGhlIFRhc2tzIFZpZXcKKwkJLy8gQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCS8vCQlJRm9sZGVyTGF5b3V0IGJvdHRvbSA9IGxheW91dC5jcmVhdGVGb2xkZXIoImJvdHRvbSIsIC8vJE5PTi1OTFMtMSQKKwkJLy8gSVBhZ2VMYXlvdXQuQk9UVE9NLCAwLjY2ZiwgZWRpdG9yQXJlYSk7CisKKwkJLy8gV2UgZG9uJ3Qgd2FudCB0byBzZWUgdGhlIGVkaXRvcgorCQlsYXlvdXQuc2V0RWRpdG9yQXJlYVZpc2libGUoZmFsc2UpOworCisJCS8vIEFkZCB0aGUgQW5hbHlzaXMgcGVyc3BlY3RpdmUgdG8gdGhlICJPcGVuIFBlcnNwZWN0aXZlIiBtZW51CisJCWxheW91dC5hZGRQZXJzcGVjdGl2ZVNob3J0Y3V0KElEX1NURU1fQU5BTFlTSVNfUEVSU1BFQ1RJVkUpOworCisJfSAvLyBjcmVhdGVJbml0aWFsTGF5b3V0CisKK30gLy8gQW5hbHlzaXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy91dGlscy9BZ2dyZWdhdGVDU1ZGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy91dGlscy9BZ2dyZWdhdGVDU1ZGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0NzNmNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3V0aWxzL0FnZ3JlZ2F0ZUNTVkZpbGUuamF2YQpAQCAtMCwwICsxLDk3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy51dGlsczsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVXRpbGl0eSB0aGF0IHJlYWRzIGEgU1RFTSBDU1YgZmlsZSBhbmQgZ2VuZXJhdGVzIGFub3RoZXIgY3N2IGZpbGUgY29udGFpbmluZyAKKyAqIGFuIGFnZ3JlZ2F0ZSBjb2x1bW4gZm9yIGFsbCBsb2NhdGlvbnMgaW4gdGhlIG9yaWdpbmFsIGZpbGUKKyAqLworcHVibGljIGNsYXNzIEFnZ3JlZ2F0ZUNTVkZpbGUgeworCisJLyoqCisJICogQHBhcmFtIGFyZ3MKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCWlmKGFyZ3MubGVuZ3RoID09IDApIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IEFnZ3JlZ2F0ZUNTVkZpbGUgPGNzdiBmaWxlPiA8b3V0cHV0IGZpbGU+XG5PdXRwdXQgZmlsZSBpcyBvcHRpb25hbCBhbmQgaWYgbm90IHNwZWNpZmllZCB0aGUgbmFtZSB3aWxsIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSBpbnB1dCBmaWxlLiIpOworCQkJU3lzdGVtLmV4aXQoLTEpOworCQl9CisJCQorCQlTdHJpbmcgY3ZzZmlsZW5hbWUgPSBhcmdzWzBdOworCQlTdHJpbmcgb3V0ZmlsZW5hbWUgPSBudWxsOworCQlpZihhcmdzLmxlbmd0aCA9PSAxKSBvdXRmaWxlbmFtZSA9IGFyZ3NbMF0rIl9hZ2dyZWdhdGUuY3N2IjsKKwkJZWxzZSBvdXRmaWxlbmFtZT0gYXJnc1sxXTsKKwkJCisJCU1hcDxJbnRlZ2VyLCBEb3VibGU+YWdncmVnYXRlID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgRG91YmxlPigpOworCQlMaXN0PEludGVnZXI+IGl0ZXJhdGlvbiA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKwkJTGlzdDxTdHJpbmc+IHRpbWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdHJ5IHsKKwkJCSBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjdnNmaWxlbmFtZSk7IAorCQkgICAgIEJ1ZmZlcmVkUmVhZGVyIGQgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGZpcykpOworCQkgICAgIFN0cmluZyBoZWFkZXIgPSBudWxsOworCQkgICAgIGhlYWRlcj1kLnJlYWRMaW5lKCk7CisJCSAgICAgaWYoaGVhZGVyID09IG51bGwpIHsKKwkJICAgIAkgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciwgZmlsZSBpcyBlbXB0eSEiKTsKKwkJICAgIAkgU3lzdGVtLmV4aXQoLTIpOworCQkgICAgIH0KKwkJICAgIFN0cmluZyBkYXRhID0gbnVsbDsgCisJCSAgICB3aGlsZSAoIChkYXRhPWQucmVhZExpbmUoKSkgIT0gbnVsbCApIHsgCisJCSAgICAJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihkYXRhLCAiLCIpOworCQkgICAgCWludCBjb2x1bW4gPSAwOworCQkgICAgCWludCBpdD0wOworCQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQkJU3RyaW5nIHZhbCA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKKwkJCQkJaWYoY29sdW1uID09IDApIHsKKwkJCQkJCWl0ID0gSW50ZWdlci5wYXJzZUludCh2YWwpOworCQkJCQkJaXRlcmF0aW9uLmFkZChpdCk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihjb2x1bW4gPT0gMSkgdGltZS5hZGQodmFsKTsKKwkJCQkJZWxzZSB7IC8vIGNvbHVtbiA+IDEsIGxvY2F0aW9uIGNvbHVtbgorCQkJCQkJaWYoYWdncmVnYXRlLmNvbnRhaW5zS2V5KGl0KSkgCisJCQkJCQkJYWdncmVnYXRlLnB1dChpdCwgYWdncmVnYXRlLmdldChpdCkrRG91YmxlLnBhcnNlRG91YmxlKHZhbCkpOworCQkJCQkJZWxzZSBhZ2dyZWdhdGUucHV0KGl0LCBEb3VibGUucGFyc2VEb3VibGUodmFsKSk7CisJCQkJCX0KKwkJCQkgICAgKysgY29sdW1uOworCQkJICAgICB9IC8vIHJlYWQgdG9rZW5zCisJCSAgICB9IC8vcmVhZCBpdGVyYXRpb24gbGluZQorCQkgICAgCisJCSAgICBkLmNsb3NlKCk7CisJCSAgICAvLyBXcml0ZQorCQkgICAgRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKG91dGZpbGVuYW1lKTsKKwkJICAgIGZ3LndyaXRlKCJpdGVyYXRpb24sdGltZSxhZ2dyZWdhdGVcbiIpOyAvLyBoZWFkZXIKKwkJICAgIGludCByb3cgPSAwOworCQkgICAgZm9yKGludCBpdDppdGVyYXRpb24pIHsKKwkJICAgIAlmdy53cml0ZShpdCsiLCIpOworCQkgICAgCWZ3LndyaXRlKHRpbWUuZ2V0KHJvdykrIiwiKTsKKwkJICAgIAlmdy53cml0ZShhZ2dyZWdhdGUuZ2V0KGl0KSsiXG4iKTsKKwkJICAgIAkrK3JvdzsKKwkJICAgIH0KKwkJICAgIGZ3LmZsdXNoKCk7CisJCSAgICBmdy5jbG9zZSgpOworCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9BbmFseXNpc0NvbnRyb2wuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL0FuYWx5c2lzQ29udHJvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YzFhZjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9BbmFseXNpc0NvbnRyb2wuamF2YQpAQCAtMCwwICsxLDI2NyBAQAorLy8gQW5hbHlzaXNDb250cm9sCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMuTW9uaXRvclByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworCisvKioKKyAqIEFuYWx5c2lzQ29udHJvbCBpcyBhIHN1YmNsYXNzIG9mIENhbnZhcyBzdWl0YWJsZSBmb3IgY2hhcnQgZHJhd2luZ3MuCisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBBbmFseXNpc0NvbnRyb2wgZXh0ZW5kcyBDb21wb3NpdGUgIHsKKwkKKwkvKioKKwkgKiB1c2VyIHByZWZlcmVuY2VzCisJICovCisJTW9uaXRvclByZWZlcmVuY2VzIHByZWZzID0gbmV3IE1vbml0b3JQcmVmZXJlbmNlcygpOworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVJfVEVYVCA9ICJjbGVhciBtb25pdG9ycyI7CisKKwlwcm90ZWN0ZWQgTGFiZWwgc2ltdWxhdGlvbk5hbWVMYWJlbDsKKworCS8qKgorCSAqIAorCSAqLworCXN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9QQVRIID0gIFBsYXRmb3JtLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOworCQorCS8qKgorCSAqIFN0YXR1cyB0ZXh0CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVFVTX1RFWFQgPSAic3RhdHVzIjsKKwkKKwlwcm90ZWN0ZWQgc3RhdGljIE1hcDxTdHJpbmcsT2JqZWN0PiBjb250cm9sUGFyYW1ldGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxPYmplY3Q+KCk7CisJCisJLyoqIAorCSAqIGEgc3RyaW5nIGZvciBzZXR0aW5nIHVzZXIgZmVlZGJhY2sgbWVzc2FnZXMKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHVzZXJNZXNzYWdlID0gIiI7CisJCisJLyoqCisJICogYSBsYWJlbCB0byBkaXNwbGF5IG1lc3NhZ2VzCisJICovCisJcHJvdGVjdGVkIExhYmVsIHVzZXJNZXNzYWdlTGFiZWwgPSBudWxsOworCQorCisKKwkvKioKKwkgKiBidXR0b24gdG8gdHJpZ2dlciB0aGUgYW5hbHlzaXMKKwkgKi8KKwlwcm90ZWN0ZWQgQnV0dG9uIGFuYWx5emVCdXR0b24gPSBudWxsOworCisJcHJvdGVjdGVkIEJ1dHRvbiBzZWxlY3RFc3RpbWF0b3JCdXR0b24gPSBudWxsOworCisJCisJLyoqCisJICogVGhlIGNvbGxlY3Rpb24gb2YgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB3YWl0aW5nIHRvIGJlIHRvbGQgYWJvdXQKKwkgKiBzZWxlY3Rpb25zLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+IGxpc3RlbmVycyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPigpOworCisJLyoqCisJICogVGhlIGNvbGxlY3Rpb24gb2YgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB3YWl0aW5nIHRvIGJlIHRvbGQgYWJvdXQKKwkgKiBzZWxlY3Rpb25zLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBMaXN0PElSZW1vdmVMaXN0ZW5lcj4gcmVtb3ZlTGlzdGVuZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PElSZW1vdmVMaXN0ZW5lcj4oKTsKKworCQorCisJcHJvdGVjdGVkIExhYmVsIGlkZW50aWZpYWJsZVRpdGxlOworCisJLyoqCisJICogVGhlIHdpZHRoIG9mIHRoZSBsYXlvdXQgbWFyZ2luLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BUkdJTl9XSURUSCA9IDU7CisKKwkvKioKKwkgKiBUaGUgaGVpZ2h0IG9mIHRoZSBsYXlvdXQgbWFyZ2luLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BUkdJTl9IRUlHSFQgPSA1OworCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBzdHlsZQorCSAqLworCXB1YmxpYyBBbmFseXNpc0NvbnRyb2woZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgaW50IHN0eWxlKSB7CisJCXN1cGVyKHBhcmVudCwgc3R5bGUpOworCisJCXRoaXMuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisJCQkvKioKKwkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIjd2lkZ2V0RGlzcG9zZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQpCisJCQkgKi8KKwkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQkJZmluYWwgRGlzcG9zZUV2ZW50IGUpIHsKKwkJCQlkaXNwb3NlKCk7CisJCQl9CisJCX0pOworCisJCWZpbmFsIEZvcm1MYXlvdXQgbGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IE1BUkdJTl9IRUlHSFQ7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IE1BUkdJTl9XSURUSDsKKwkJc2V0TGF5b3V0KGxheW91dCk7CisKKwl9IC8vIEFuYWx5c2lzQ29udHJvbAorCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBTV1QgY29udHJvbCB0aGF0IHRoaXMgY29tcG9zaXRlIHdpbGwgYmUgYSBjaGlsZCBvZgorCSAqIEByZXR1cm4gdGhlIFNXVCBDb21wb3NpdGUgdG8gYmUgZGlzcGxheWVkIGFib3ZlIHRoZSBNYXBDYW52YXMgaW4gdGhlCisJICogICAgICAgICBjb250cm9sCisJICovCisJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQlmaW5hbCBDb21wb3NpdGUgdG9wQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKworCQlmaW5hbCBGaWxsTGF5b3V0IHRvcENvbXBvc2l0ZUxheW91dCA9IG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCk7CisJCXRvcENvbXBvc2l0ZS5zZXRMYXlvdXQodG9wQ29tcG9zaXRlTGF5b3V0KTsKKworCQlzaW11bGF0aW9uTmFtZUxhYmVsID0gbmV3IExhYmVsKHRvcENvbXBvc2l0ZSwgU1dULkNFTlRFUik7CisJCXNpbXVsYXRpb25OYW1lTGFiZWwuc2V0VGV4dCgiIik7CisKKwkJcmV0dXJuIHRvcENvbXBvc2l0ZTsKKwl9IC8vIGNyZWF0ZVRvcENvbXBvc2l0ZQorCQorCS8qKgorCSAqIGNyZWF0ZXMgdGhlIEFuYWx5emVCdXR0b25Db21wb3NpdGUgYW5kIGl0cyBjb21wb3NpdGUgY29udGFpbmVyCisJICogQHBhcmFtIGNvbnRyb2wKKwkgKiBAcGFyYW0gdGhlIGJ1dHRvbiBsYWJlbAorCSAqIEByZXR1cm4gdGhlIGNvbXBvc2l0ZQorCSAqLworCUNvbXBvc2l0ZSBnZXRBbmFseXplQnV0dG9uQ29tcG9zaXRlKEFuYWx5c2lzQ29udHJvbCBjb250cm9sLCBTdHJpbmcgbGFiZWwpIHsKKwkJQ29tcG9zaXRlIGFuYWx5emVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbnRyb2wsIFNXVC5CT1JERVIpOworCSAgICBGaWxsTGF5b3V0IGZpbGxMYXlvdXQgPSBuZXcgRmlsbExheW91dCgpOworCSAgICBmaWxsTGF5b3V0LnR5cGUgPSBTV1QuSE9SSVpPTlRBTDsKKwkgICAgYW5hbHl6ZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZmlsbExheW91dCk7CisJICAgIExhYmVsIGxlZnRMYWJlbCA9IG5ldyBMYWJlbChhbmFseXplQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJICAgIGxlZnRMYWJlbC5zZXRUZXh0KCIgIik7Ly8ganVzdCBhIHNwYWNlcgorCSAgICBhbmFseXplQnV0dG9uID0gbmV3IEJ1dHRvbihhbmFseXplQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWFuYWx5emVCdXR0b24uc2V0VGV4dChsYWJlbCk7CisJCUxhYmVsIHJpZ2h0TGFiZWwgPSBuZXcgTGFiZWwoYW5hbHl6ZUNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlyaWdodExhYmVsLnNldFRleHQoIiAiKTsvLyBqdXN0IGEgc3BhY2VyCisJICAgCisJICAgIHJldHVybiBhbmFseXplQ29tcG9zaXRlOworCX0vL2dldEFuYWx5emVCdXR0b25Db21wb3NpdGUKKwkKKworCisJLyoqCisJICogCisJICogQHBhcmFtIGZvbGRlck5hbWUKKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplSGVhZGVyKFN0cmluZyBmb2xkZXJOYW1lKTsKKworCQorCS8qKgorCSAqIEFsbCBjb250cm9sbGVycyBtdXN0IGltcGxlbWVudCB0aGlzIAorCSAqIHRvIHJlbW92ZSB0aGUgY29udHJvbCBlLmcuIGJ5IGEgcmVtb3ZlIGJ1dHRvbiBldmVudAorCSAqLworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZSgpIDsKKwkKKwkKKwkKKwkKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRJUmVtb3ZlTGlzdGVuZXIoSVJlbW92ZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXJlbW92ZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKwkKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVJUmVtb3ZlTGlzdGVuZXIoSVJlbW92ZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXJlbW92ZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCX0KKwkKKwkvKioKKwkgKiBzZXQgb2YgaWRlbnRpZmlhYmxlc1RvRml0CisJICogQHBhcmFtIGlkZW50aWZpYWJsZXNUb0ZpdAorCSAqLworCXB1YmxpYyB2b2lkIGZpcmVSZW1vdmVFdmVudChTZXQ8SWRlbnRpZmlhYmxlPiBpZGVudGlmaWFibGVzVG9GaXQpIHsKKwkJZm9yIChmaW5hbCBJUmVtb3ZlTGlzdGVuZXIgbGlzdGVuZXIgOiByZW1vdmVMaXN0ZW5lcnMpIHsKKwkJCUl0ZXJhdG9yPElkZW50aWZpYWJsZT4gaXRlciA9IGlkZW50aWZpYWJsZXNUb0ZpdC5pdGVyYXRvcigpOworCQkJd2hpbGUoKGl0ZXIhPW51bGwpJiYoaXRlci5oYXNOZXh0KCkpKSB7CisJCQkJSWRlbnRpZmlhYmxlIGlkZW50ID0gaXRlci5uZXh0KCk7CisJCQkJbGlzdGVuZXIuaWRlbnRpZmlhYmxlUmVtb3ZlZChpZGVudCk7CisJCQl9CisJCQkKKwkJfSAvLyBmb3IgZWFjaCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCisJfQorCisJLyoqCisJICogZ2V0IHZhbHVlcyBmb3IgZ3JhcGhzIGFzIGRvdWJsZSBhcnJheQorCSAqIEBwYXJhbSBjaGFydEluZGV4IGFsbG93cyBtdWx0aXBsZSBjaGFydHMgaW4gYSB2aWV3LiBEZWZhdWx0IGlzIGluZGV4PTAgKG9uZSBjaGFydCkKKwkgKiBAcGFyYW0gc3RhdGUKKwkgKiBAcmV0dXJuIHZhbHVlIGFycmF5CisJICovCisJcHVibGljIGFic3RyYWN0IGRvdWJsZVtdIGdldFZhbHVlcyhpbnQgY2hhcnRJbmRleCwgaW50IHN0YXRlKTsKKwkKKwkvKioKKwkgKiB1cGRhdGUgdGhlIG1lc3NhZ2UgdGV4dAorCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0ZU1lc3NhZ2UoKSB7CisJCWlmKHVzZXJNZXNzYWdlTGFiZWwhPW51bGwpCXVzZXJNZXNzYWdlTGFiZWwuc2V0VGV4dCh1c2VyTWVzc2FnZSk7CisJfQorCQorCS8qKgorCSAqIHVwZGF0ZSB0aGUgbWVzc2FnZSB0ZXh0CisJICogQHBhcmFtIG1lc3NhZ2UgCisJICovCisJcHVibGljIHZvaWQgdXBkYXRlTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworCQl1c2VyTWVzc2FnZSA9IG1lc3NhZ2U7CisJCWlmKHVzZXJNZXNzYWdlTGFiZWwhPW51bGwpCXVzZXJNZXNzYWdlTGFiZWwuc2V0VGV4dCh1c2VyTWVzc2FnZSk7CisJfQorCQorCS8qKgorCSAqIGdldCB0aGUgbmFtZSBvZiB0aGUgdGltZSBzZXJpZXMgZm9yIGEgZ2l2ZW4gc3RhdGUKKwkgKiBAcGFyYW0gY2hhcnRJbmRleCAgYWxsb3dzIG11bHRpcGxlIGNoYXJ0cyBpbiBhIHZpZXcuIERlZmF1bHQgaXMgaW5kZXg9MCAob25lIGNoYXJ0KQorCSAqIEBwYXJhbSBzdGF0ZQorCSAqIEByZXR1cm4gcHJvcGVydHkgbmFtZQorCSAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvcGVydHkoaW50IGNoYXJ0SW5kZXgsIGludCBzdGF0ZSk7CisgICAgCisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2hhcnRJbmRleCAgYWxsb3dzIG11bHRpcGxlIGNoYXJ0cyBpbiBhIHZpZXcuIERlZmF1bHQgaXMgaW5kZXg9MCAob25lIGNoYXJ0KQorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIHByb3BlcnRpZXMgdG8gcGxvdAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TnVtUHJvcGVydGllcyhpbnQgY2hhcnRJbmRleCk7CisgICAgCisgICAgLyoqCisJICogRWFjaCBDb250cm9sIGNsYXNzIG1heSBhZGQgb2JqZWN0cyB0byB0aGlzIG1hcAorCSAqIEByZXR1cm4gdGhlIGNvbnRyb2wgcGFyYW1ldGVycyBtYXBzCisJICovCisJcHVibGljIGFic3RyYWN0IE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0Q29udHJvbFBhcmFtZXRlcnNNYXAoKSA7CisJCisKKworfSAvLyBBbmFseXNpc0NvbnRyb2wKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL0FuYWx5c2lzQ29udHJvbEZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL0FuYWx5c2lzQ29udHJvbEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTM1NjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvQW5hbHlzaXNDb250cm9sRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8vIEFuYWx5c2lzQ29udHJvbEZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGZhY3RvcmllcyB0aGF0IGNyZWF0ZSBpbnN0YW5jZXMgb2YKKyAqIHtAbGluayBBbmFseXNpc0NvbnRyb2x9LgorICovCitwdWJsaWMgaW50ZXJmYWNlIEFuYWx5c2lzQ29udHJvbEZhY3RvcnkgeworCisJLyoqCisJICogCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBkaXJOYW1lIAorCSAqIEByZXR1cm4gdGhlIEFuYWx5c2lzQ29udHJvbAorCSAqLworCUFuYWx5c2lzQ29udHJvbCBjcmVhdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRpck5hbWUpOworCisJLyoqCisJICogQHJldHVybiBUT0RPIEpGSworCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29udHJvbFR5cGUoKTsKKworfSAvLyBBbmFseXNpc0NvbnRyb2xGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9BbmFseXNpc1ZpZXdlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvQW5hbHlzaXNWaWV3ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjdkNjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvQW5hbHlzaXNWaWV3ZXIuamF2YQpAQCAtMCwwICsxLDIyMSBAQAorLy8gQW5hbHlzaXNWaWV3ZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5NYXBDb250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJlc2VudHMgInZpZXdzIiBvZiB0aGUgcnVubmluZyBzaW11bGF0aW9ucy4KKyAqLworcHVibGljIGNsYXNzIEFuYWx5c2lzVmlld2VyIGV4dGVuZHMgVmlld2VyICB7CisKKwkKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1BSRUZJWCA9ICIvcmVzb3VyY2VzL2RhdGEvc2NlbmFyaW8vZGlzZWFzZS8iOworCQorCQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgdG9wLWxldmVsIGNvbnRyb2wgb2YgdGhlIHZpZXdlci4gSXQgY29udGFpbnMgdGhlCisJICoge0BsaW5rIE1hcENvbnRyb2x9cyB0aGF0IGRpc3BsYXkgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259cy4KKwkgKi8KKwlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlOworCisJCisKKworCQorCisJCisKKwkvLyBnZXQgdGhlIHBhdGgKKwkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIFBBVEggPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKTsKKworCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNlcCA9IEZpbGUuc2VwYXJhdG9yOworCQorCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHBhdGhTdWZmaXggPSAiYW5hbHlzaXMiK3NlcDsKKwkKKwkKKworCS8qKgorCSAqIFRoaXMgZmFjdG9yeSBpcyB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2Yge0BsaW5rIEFuYWx5c2lzQ29udHJvbH0gaW4gdGhlCisJICogbWV0aG9kIHtAbGluayAjcG9wdWxhdGVWaWV3KCl9CisJICovCisJcHJpdmF0ZSBmaW5hbCBBbmFseXNpc0NvbnRyb2xGYWN0b3J5IGFjZjsKKworCS8qKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIHRoZSBTV1QgcGFyZW50IG9mIHRoZSBjb250cm9sIHRoYXQgbWFrZXMgdXAgdGhlIHZpZXdlcgorCSAqIEBwYXJhbSBhY2YKKwkgKiAgICAgICAgICAgIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyBpbnN0YW5jZSBvZiB7QGxpbmsgQW5hbHlzaXNDb250cm9sfQorCSAqLworCXB1YmxpYyBBbmFseXNpc1ZpZXdlcihmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBBbmFseXNpc0NvbnRyb2xGYWN0b3J5IGFjZikgeworCisJCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCWZpbmFsIEZpbGxMYXlvdXQgY29tcG9zaXRlTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoU1dULkhPUklaT05UQUwpOworCQljb21wb3NpdGUuc2V0TGF5b3V0KGNvbXBvc2l0ZUxheW91dCk7CisKKwkJLy8gUmVtZW1iZXIgdGhlIGZhY3RvcnkgdGhhdCB3ZSdsbCB1c2UgdG8gY3JlYXRlIGluc3RhbmNlcyBvZgorCQkvLyBBbmFseXNpc0NvbnRyb2wKKwkJdGhpcy5hY2YgPSBhY2Y7CisJCXJlZnJlc2goKTsKKwkJY29tcG9zaXRlLnBhY2soKTsKKwkJCisJfSAvLyBBbmFseXNpc1ZpZXdlcgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciNnZXRDb250cm9sKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgeworCQlyZXR1cm4gY29tcG9zaXRlOworCX0gLy8gZ2V0Q29udHJvbAorCisKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIjcmVmcmVzaCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKKwkJcG9wdWxhdGVWaWV3KCk7CisJfSAvLyByZWZyZXNoCisKKwkKKwkKKwkKKwkvKioKKwkgKiBDcmVhdGUgYW5kIGRpc3Bvc2Ugb2YgTWFwQ29udHJvbHMgYXMgbmVjZXNzYXJ5IHRvIGRpc3BsYXkgdGhlIHNlbGVjdGVkCisJICogU2ltdWxhdGlvbnMuCisJICovCisJcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVmlldygpIHsKKwkJCisJCQorCQkvLyBwcm9ibGVtIGhlcmUgd2hlbiB3ZSBzdGFydCB1cAorCQkvLyBBcmUgd2UgZG9uZT8KKwkJaWYgKGNvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCS8vIFllcworCQkJcmV0dXJuOworCQl9IC8vIGlmCisKKwkgICAgU3RyaW5nIGRpcmVjdG9yeSA9ICJkYXRhIGRpcmVjdG9yeSBoZXJlIjsKKwkJZmluYWwgQW5hbHlzaXNDb250cm9sIGFuYWx5c2lzQ29udHJvbCA9IGFjZi5jcmVhdGUoCisJCQkJY29tcG9zaXRlLAorCQkJCWRpcmVjdG9yeSk7CisJCisJCWFuYWx5c2lzQ29udHJvbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJCS8qKgorCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lciN3aWRnZXREaXNwb3NlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudCkKKwkJCSAqLworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQlmaW5hbCBEaXNwb3NlRXZlbnQgZSkgeworCQkJCWNvbXBvc2l0ZS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7CisJCQkJY29tcG9zaXRlLnJlZHJhdygpOworCQkJfQorCQl9KTsKKworCQljb21wb3NpdGUubGF5b3V0KHRydWUsIHRydWUpOworCQljb21wb3NpdGUucmVkcmF3KCk7CisJfSAvLyBwb3B1bGF0ZVZpZXcKKwkKKwkKKwkKKworCQorCisJCisKKwkKKwkvKioKKwkgKiBSZW1vdmVzIHdoaXRlc3BhY2UsICcsJywgJy4nLCBldGMuCisJICogQHBhcmFtIHMKKwkgKiBAcmV0dXJuIGEgZmlsdGVyZWQgc3RyaW5nCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUZpbHRlciAoU3RyaW5nIHMpIHsKKwkJU3RyaW5nIHMxID0gcy50cmltKCk7CisJCXMxID0gczEucmVwbGFjZSgnIicsJyAnKTsKKwkJczEgPSBzMS5yZXBsYWNlQWxsKCIgIiwiIik7CisJCXMxID0gczEucmVwbGFjZSgnLCcsJ18nKTsKKwkJczEgPSBzMS5yZXBsYWNlKCcuJywnXycpOworCQlzMSA9IHMxLnJlcGxhY2VBbGwoIl8iLCIiKTsKKwkJcyA9IHMxOworCQkKKwkJcmV0dXJuIHM7CisJfQorCisJCisJCisJCisKKwkvKioKKwkgKiBmaWx0ZXJzIHRoZSBsb2NhdGlvbiBpZCBwcmVmaXggZnJvbSB0aGUgYmVnaW5uaW5nIG9mCisJICogIGEgbm9kZXMgSUQgZm9yIGdlbmVyYXRpb24gb2YgYSBmaWxlIG5hbWUKKwkgKiBAcGFyYW0gdW5maWx0ZXJlZAorCSAqIEByZXR1cm4gdGhlIGZpbHRlcmVkIGZpbGUgbmFtZSB1c2luZyBsb2NhdGlvbiBpZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWx0ZXJGaWxlbmFtZShTdHJpbmcgdW5maWx0ZXJlZCkgeworCQlpbnQgbGFzdCA9IHVuZmlsdGVyZWQuaW5kZXhPZihVUklfUFJFRklYKTsKKwkJaWYgKGxhc3QgPj0wKSB7CisJCQlsYXN0ICs9IFVSSV9QUkVGSVgubGVuZ3RoKCk7CisJCQlyZXR1cm4gdW5maWx0ZXJlZC5zdWJzdHJpbmcobGFzdCwgdW5maWx0ZXJlZC5sZW5ndGgoKSk7CisJCX0gCisJCXJldHVybiB1bmZpbHRlcmVkOworCisJCisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciNnZXRJbnB1dCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbnB1dCgpIHsKKwkJLy8gbm90IHVzZWQKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciNzZXRJbnB1dChqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldElucHV0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgaW5wdXQpIHsKKwkJLy8gbm90IHVzZWQKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyI3NldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24sIGJvb2xlYW4pCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBJU2VsZWN0aW9uIHNlbGVjdGlvbiwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGJvb2xlYW4gcmV2ZWFsKSB7CisJCS8vIG5vdCB1c2VkCisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciNnZXRTZWxlY3Rpb24oKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKKwkJLy8gbm90IHVzZWQKKwkJcmV0dXJuIG51bGw7CisJfQorCisJCit9IC8vIEFuYWx5c2lzVmlld2VyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9FcGlkZW1pY0NvbnRyb2wuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL0VwaWRlbWljQ29udHJvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMjU1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9FcGlkZW1pY0NvbnRyb2wuamF2YQpAQCAtMCwwICsxLDg0NyBAQAorLy8gRXN0aW1hdG9yQ29udHJvbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkNvbG9yRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5pbXBsLkNvbG9yRGVmaW5pdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5TY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuaW1wbC5SZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YUluc3RhbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMudXRpbC5DU1ZzY2VuYXJpb0xvYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuY29tbW9uLklkZW50aWZpYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy5BZ2dyZWdhdGVEYXRhV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy5TY2VuYXJpb0FuYWx5c2lzU3VpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworLyoqCisgKiBHVUkgZm9yIGFnZ3JlZ2F0ZSB2aWV3CisgKi8KK3B1YmxpYyBjbGFzcyBFcGlkZW1pY0NvbnRyb2wgZXh0ZW5kcyBBbmFseXNpc0NvbnRyb2wgeworCisJCisJLyoqCisJICogdXNlZCB0byBpZGVudGlmeSB1c2VyIHByZWZlcmVuY2VzIGZvciB0aGlzIGNsYXNzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNVTUVSID0gIkVQSURFTUlDX0NPTlRST0wiOworCQorCS8qKgorCSAqIHVzZWQgdG8gcmVtZW1iZXIgdGhlIGFnZ3JlZ2F0ZSBkaXJlY3RvcnkgaW4gdGhlIHVzZXIgcHJlZmVyZW5jZXMKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUdHUkVHQVRFX0ZPTERFUl9LRVkgPSBDT05TVU1FUisiX0FHR1JFR0FURSI7CisJCisJLyoqCisJICogdXNlZCB0byByZW1lbWJlciB0aGUgcmVmZXJlbmNlIGRpcmVjdG9yeSBpbiB0aGUgdXNlciBwcmVmZXJlbmNlcworCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VfRk9MREVSX0tFWSA9IENPTlNVTUVSKyJfUkVGRVJFTkNFIjsKKwkKKwkvKioKKwkgKiB1c2VkIHRvIHJlbWVtYmVyIHRoZSBpbmNpZGVuY2UgZGlyZWN0b3J5IGluIHRoZSB1c2VyIHByZWZlcmVuY2VzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0lERU5DRV9GT0xERVJfS0VZID0gQ09OU1VNRVIrIl9JTkNJREVOQ0UiOworCisJCisJLyoqCisJICogQSBsYWJlbCB0byByZXBvcnQgc3RhdHVzIChub3QgeWV0IHVzZWQpCisJICovCisJc3RhdGljIExhYmVsIHN0YXR1c0xhYmVsOworCQorCS8qKgorCSAqICBMYWJlbCBmb3IgY3VycmVudCBzY2VuYXJpbyBmb2xkZXIKKwkgKi8KKwlzdGF0aWMgTGFiZWwgc2NlbmFyaW9Gb2xkZXJMYWJlbDsKKwkKKwkKKwkKKwkvKioKKwkgKiBMYWJlbCBmb3IgYWdncmVnYXRlIGZpbGUKKwkgKi8KKwkKKwlzdGF0aWMgTGFiZWwgYWdncmVnYXRlRmlsZUxhYmVsOworCQorCS8qKgorCSAqIExhYmVsIGZvciBpbmNpZGVuY2UgZmlsZQorCSAqLworCQorCXN0YXRpYyBMYWJlbCBpbmNpZGVuY2VGaWxlTGFiZWw7CisJCisJLyoqCisJICogSW5wdXQgdGV4dCBmaWVsZCBmb3IgdGhlIHNjZW5hcmlvIGZvbGRlciBvZiBkYXRhIHRvIGFnZ3JlZ2F0ZQorCSAqLworCXB1YmxpYyBzdGF0aWMgVGV4dCBhZ2dyZWdhdGVEaXJ0ZXh0OworCQorCS8qKgorCSAqIElucHV0IHRleHQgZmllbGQgZm9yIHRoZSByZWZlcmVuY2Ugc2NlbmFyaW8gZm9sZGVyIHRoYXQgZmlsdGVycyB0aGUgbG9jYXRpb25zIHRvIGFnZ3JlZ2F0ZQorCSAqLworCXB1YmxpYyBzdGF0aWMgVGV4dCByZWZlcmVuY2VEaXJ0ZXh0OworCQorCQorCS8qKgorCSAqIElucHV0IHRleHQgZmllbGQgZm9yIHRoZSBhZ2dyZWdhdGUgZGF0YSBmaWxlCisJICovCisJcHVibGljIHN0YXRpYyBUZXh0IGZpbGV0ZXh0QWdncmVnYXRlOworCQorCS8qKgorCSAqIElucHV0IHRleHQgZmllbGQgZm9yIHRoZSBJbmNpZGVuY2UgZGF0YSBmaWxlCisJICovCisJcHVibGljIHN0YXRpYyBUZXh0IGZpbGV0ZXh0SW5jaWRlbmNlOworCQorCS8qKgorCSAqIGFscGhhIGlzIHRoZSBJbW11bml0eSBMb3NzIFJhdGUKKwkgKiBUT0RPIHRoaXMgbmVlZHMgdG8gYmUgc2V0IGluIHRoZSBHVUkKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGRvdWJsZSBhbHBoYSA9IDAuMDAzOworCS8qKgorCSAqIFRpbWUgc2VyaWVzIGNhbnZhcworCSAqLworCVRpbWVTZXJpZXNDYW52YXMgYWdncmVnYXRlRGF0YUNhbnZhczsKKwkKKwkvKioKKwkgKiBOZXcgSW5jaWRlbmNlIGNhbnZhcworCSAqLworCVRpbWVTZXJpZXNDYW52YXMgbmV3SW5jaWRlbmNlQ2FudmFzOworCQorCS8qKgorICAgICAqIHBvc3NpYmxlIHN0YXRlcyB3aXRoIHBhcmFtZXRlcnMgdG8gZml0CisgICAgICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpbmNpZGVuY2VTdGF0ZXMgPSB7IkluY2lkZW5jZSIsImRlbHRhQmlydGhzIiwiZGVsdGFEZWF0aHMifTsKKwkKKwkvLyB0aGVzZSBhcmUgbm90IHkgYXhpcyBudW1lcmljIGRhdGEgYW5kIHNob3VsZCBub3QgYmUgcGxvdHRlZCBpbiB0aGUgYWdncmVnYXRlIHBsb3QKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPTUlUX0xJU1QgPSB7InRpbWUiLCIjaXRlcmF0aW9uIiwiSW5jaWRlbmNlIn07CisJCisJLyoqCisJICogQ29sb3JzIGZvciB0aGUgdGltZSBzZXJpZXMgY2hhcnQKKwkgKi8KKwlzdGF0aWMgZmluYWwgQ29sb3JEZWZpbml0aW9uIGZvcmVHcm91bmQgPSBDb2xvckRlZmluaXRpb25JbXBsLmNyZWF0ZSgxODAsIDAsIDApOworCXN0YXRpYyBmaW5hbCBDb2xvckRlZmluaXRpb24gYmFja2dyb3VuZEdyb3VuZCA9IENvbG9yRGVmaW5pdGlvbkltcGwuY3JlYXRlKDI1NSwgMjU1LCAyMjUpOworCXN0YXRpYyBmaW5hbCBDb2xvckRlZmluaXRpb24gZnJhbWVDb2xvciA9IENvbG9yRGVmaW5pdGlvbkltcGwuV0hJVEUoKTsKKwlmaW5hbCBDb2xvciB3aGl0ZT0gdGhpcy5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKTsKKwlmaW5hbCBDb2xvciBncmV5PSB0aGlzLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JBWSk7CisJCisJCisJCisJU2NlbmFyaW9BbmFseXNpc1N1aXRlIGFuYWx5emVyID0gbmV3IFNjZW5hcmlvQW5hbHlzaXNTdWl0ZSh0aGlzKTsKKwkKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVElUTEVfVEVYVCA9ICJBZ2dyZWdhdGUgZGF0YSB2aWV3IjsKKwkKKwkvKioKKwkgKiBTdG9yZSB0aGUgYWdncmVnYXRlIGRhdGEgZm9yIHRoZSBzdGF0ZXMKKwkgKi8KKwlwdWJsaWMgTGlzdDxMaXN0PERvdWJsZT4+IGFnZ3JlZ2F0ZURhdGEgPSBuZXcgQXJyYXlMaXN0PExpc3Q8RG91YmxlPj4oKTsKKwkKKwkvKioKKwkgKiBTdG9yZSB0aGUgYWdncmVnYXRlIGRhdGEgZm9yIHRoZSBzdGF0ZXMKKwkgKi8KKwlwdWJsaWMgTGlzdDxMaXN0PERvdWJsZT4+IGluY2lkZW5jZURhdGEgPSBuZXcgQXJyYXlMaXN0PExpc3Q8RG91YmxlPj4oKTsKKwkKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciBvZiBlYWNoIGRhdGEgTGlzdDxEb3VibGU+IGluIHRoZSBwcmltYXJ5IHRpbWUgc2VyaWVzCisJICovCisJcHVibGljIExpc3Q8U3RyaW5nPiBwcmltYXJ5UHJvcGVydGllc1RvUGxvdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQorCS8qKgorCSAqIFRoZSBpZGVudGlmaWVyIG9mIGVhY2ggZGF0YSBMaXN0PERvdWJsZT4gaW4gdGhlIHNlY29uZGFyeSB0aW1lIHNlcmllcworCSAqLworCXB1YmxpYyBMaXN0PFN0cmluZz4gc2Vjb25kYXJ5UHJvcGVydGllc1RvUGxvdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQorCS8qKgorCSAqIGJ1dHRvbiB0byBhZ2dyZWdhdGUgZGF0YQorCSAqLworCXByaXZhdGUgQnV0dG9uIGFnZ3JlZ2F0ZUJ1dHRvbjsKKwkKKworCQorCS8qKgorCSAqIGNoZWNrYm94IHRvIHVzZSBhIHJlZmVyZW5jZSBkYXRhIHNldCBmb3IgZmlsdGVyaW5nIGxvY2F0aW9ucyB0byBhZ2dyZWdhdGUKKwkgKi8KKwlwcm90ZWN0ZWQgQnV0dG9uIHVzZVJlZmVyZW5jZUNoZWNrYm94OworCQorCXByb3RlY3RlZCBCdXR0b24gcGlja1JlZkJ1dHRvbjsKKwkKKwkKKwkvKioKKwkgKiBidXR0b24gdG8gcGxvdCB0aGUgZGF0YQorCSAqLworCXByaXZhdGUgQnV0dG9uIHBsb3RCdXR0b247CisJCisJLyoqCisJICogCisJICogQHBhcmFtIHBhcmVudAorCSAqLworCXB1YmxpYyBFcGlkZW1pY0NvbnRyb2woZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQsIFNXVC5Ob25lKTsKKwkJY3JlYXRlQ29udGVudHMoKTsKKwl9IC8vIEVzdGltYXRvckNvbnRyb2wKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgY29udGVudHMgb2YgdGhlIHBsb3R0ZXIKKwkgKi8KKwl2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgeworCQkvLyBVc2UgZm9ybSBsYXlvdXQKKwkJc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOworCisJCURpc3BsYXkgZGlzcGxheSA9IHRoaXMuZ2V0RGlzcGxheSgpOworCQkKKwkJaWRlbnRpZmlhYmxlVGl0bGUgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOworCQlpZGVudGlmaWFibGVUaXRsZS5zZXRUZXh0KFRJVExFX1RFWFQpOworCQkvL3Byb3BlcnR5U2VsZWN0b3IgPSBuZXcgUHJvcGVydHlTZWxlY3Rvcih0aGlzLCBTV1QuTk9ORSk7CisJCQorCQlpbnQgYm90dG9tID0gNTsKKwkJZmluYWwgRm9ybURhdGEgdGl0bGVGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlpZGVudGlmaWFibGVUaXRsZS5zZXRMYXlvdXREYXRhKHRpdGxlRm9ybURhdGEpOworCQl0aXRsZUZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJdGl0bGVGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tLCAwKTsKKwkJdGl0bGVGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQl0aXRsZUZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCQorCQlDb2xvciBsYWJlbEJhY2tncm91bmQgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigxODAsIDE4MCwgMjAwKSk7CisJCQorCQlib3R0b20gKz0gNTsKKwkJc2NlbmFyaW9Gb2xkZXJMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuQk9SREVSKTsKKwkJc2NlbmFyaW9Gb2xkZXJMYWJlbC5zZXRCYWNrZ3JvdW5kKGxhYmVsQmFja2dyb3VuZCk7CisJCQorCQlzY2VuYXJpb0ZvbGRlckxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFUElWSUVXLlNDRU5BUklPRk9MREVSTEFCRUwiKSk7CisKKwkJZmluYWwgRm9ybURhdGEgc2NlbmFyaW9MYWJlbEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCXNjZW5hcmlvRm9sZGVyTGFiZWwuc2V0TGF5b3V0RGF0YShzY2VuYXJpb0xhYmVsRm9ybURhdGEpOworCQlzY2VuYXJpb0xhYmVsRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGlkZW50aWZpYWJsZVRpdGxlLCAwKTsKKwkJc2NlbmFyaW9MYWJlbEZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQlzY2VuYXJpb0xhYmVsRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJc2NlbmFyaW9MYWJlbEZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDE1LCAwKTsKKwkJCisJCWFnZ3JlZ2F0ZURpcnRleHQgPSBuZXcgVGV4dCh0aGlzLCBTV1QuQk9SREVSKTsKKwkgICAgYWdncmVnYXRlRGlydGV4dC5zZXRCb3VuZHMoMTAsIDEwLCAxMDAsIDIwKTsKKwkgICAgU3RyaW5nIHJlY2VudEZvbGRlciA9IHByZWZzLmdldFJlY2VudEZvbGRlcihDT05TVU1FUik7CisJICAgIGlmKHJlY2VudEZvbGRlcj09IG51bGwpIHsKKwkgICAgCXJlY2VudEZvbGRlciA9IFNjZW5hcmlvQW5hbHlzaXNTdWl0ZS5SRUZFUkVOQ0VfVEVTVElOR19ESVJFQ1RPUlk7CisJICAgIH0KKwkgICAgYWdncmVnYXRlRGlydGV4dC5zZXRUZXh0KHJlY2VudEZvbGRlcik7CisJICAgIGZpbmFsIEZvcm1EYXRhIGRpclRleHRGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCSAgICBhZ2dyZWdhdGVEaXJ0ZXh0LnNldExheW91dERhdGEoZGlyVGV4dEZvcm1EYXRhKTsKKwkgICAgZGlyVGV4dEZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChpZGVudGlmaWFibGVUaXRsZSwgMCk7CisJICAgIGRpclRleHRGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tLCAwKTsKKwkgICAgZGlyVGV4dEZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2NlbmFyaW9Gb2xkZXJMYWJlbCwgMCk7CisJICAgIGRpclRleHRGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCg4MCwgMCk7CisJCQorCSAgICBCdXR0b24gcGlja0RpckJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcywgU1dULk5PTkUpOworCSAgICBwaWNrRGlyQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFUElWSUVXLlNFTEVDVERJUiIpKTsKKwkgICAgZmluYWwgRm9ybURhdGEgcGlja0RpckJ1dHRvbkZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJICAgIHBpY2tEaXJCdXR0b25Gb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoaWRlbnRpZmlhYmxlVGl0bGUsIDApOworCSAgICBwaWNrRGlyQnV0dG9uRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGJvdHRvbSwgMCk7CisJICAgIHBpY2tEaXJCdXR0b25Gb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGFnZ3JlZ2F0ZURpcnRleHQsIDApOworCSAgICBwaWNrRGlyQnV0dG9uRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkgICAgcGlja0RpckJ1dHRvbi5zZXRMYXlvdXREYXRhKHBpY2tEaXJCdXR0b25Gb3JtRGF0YSk7CisJICAgIHBpY2tEaXJCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKwkJCisJICAgIGZpbmFsIFNoZWxsIHNoZWxsID0gdGhpcy5nZXRTaGVsbCgpOworCSAgICBwaWNrRGlyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJCWZpbmFsIFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlmaW5hbCBEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKAorCQkJCQkJc2hlbGwsIFNXVC5PUEVOKTsKKwkJCQkJZGQuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkVQSVZJRVcuU0VMRUNUU0NFTkFSSU9GT0xERVIiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJU3RyaW5nIGJlZ2luU2VhcmNoID0gYWdncmVnYXRlRGlydGV4dC5nZXRUZXh0KCk7CisJCQkJCWlmKChiZWdpblNlYXJjaD09bnVsbCl8fChiZWdpblNlYXJjaC5sZW5ndGgoKTwxKSkgYmVnaW5TZWFyY2ggPSBST09UX1BBVEg7CisJCQkJCQorCQkJCQlkZC5zZXRGaWx0ZXJQYXRoKGJlZ2luU2VhcmNoKTsKKwkJCQkJZmluYWwgU3RyaW5nIHNlbGVjdGVkID0gZGQub3BlbigpOworCQkJCQlpZihzZWxlY3RlZCE9bnVsbCkgYWdncmVnYXRlRGlydGV4dC5zZXRUZXh0KHNlbGVjdGVkKTsKKwkJCX0KKwkJfSk7CisJICAgCisJICAgIAorCSAgICAvLy8vLy8vLy8vLy8gUkVGRVJFTkNFIEZPTERFUi8vLy8vLy8vLy8KKwkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJICAgIAorCSAgICBib3R0b20gKz0gNTsKKwkgICAgdXNlUmVmZXJlbmNlQ2hlY2tib3g9IG5ldyBCdXR0b24odGhpcywgU1dULkNIRUNLKTsKKwkgICAgdXNlUmVmZXJlbmNlQ2hlY2tib3guc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkVQSVZJRVcuUkVGRVJFTkNFRk9MREVSTEFCRUwiKSk7CisJICAgIHVzZVJlZmVyZW5jZUNoZWNrYm94LnNldEJhY2tncm91bmQobGFiZWxCYWNrZ3JvdW5kKTsKKwkgICAgdXNlUmVmZXJlbmNlQ2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQkJZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWlmKHVzZVJlZmVyZW5jZUNoZWNrYm94LmdldFNlbGVjdGlvbigpKSB7CisJCQkJCXJlZmVyZW5jZURpcnRleHQuc2V0QmFja2dyb3VuZCh3aGl0ZSk7CisJCQkJCSBTdHJpbmcgcmVmRm9sZGVyID0gcHJlZnMuZ2V0UmVjZW50Rm9sZGVyKFJFRkVSRU5DRV9GT0xERVJfS0VZKTsKKwkJCQkJICAgIGlmKHJlZkZvbGRlcj09IG51bGwpIHsKKwkJCQkJICAgIAlyZWZGb2xkZXIgPSBhZ2dyZWdhdGVEaXJ0ZXh0LmdldFRleHQoKTsKKwkJCQkJICAgIAlpZigocmVmRm9sZGVyPT1udWxsKXx8KHJlZkZvbGRlci5sZW5ndGgoKTwxKSkgcmVmRm9sZGVyID0gUk9PVF9QQVRIOworCQkJCQkgICAgfQorCQkJCQlyZWZlcmVuY2VEaXJ0ZXh0LnNldFRleHQocmVmRm9sZGVyKTsKKwkJCQkJcGlja1JlZkJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCQkJCX0gZWxzZSB7CisJCQkJCXJlZmVyZW5jZURpcnRleHQuc2V0QmFja2dyb3VuZChncmV5KTsKKwkJCQkJcGlja1JlZkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQl9CisJCQl9CisJCX0pOworCisJCWZpbmFsIEZvcm1EYXRhIHJlZmVyZW5jZUxhYmVsRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJdXNlUmVmZXJlbmNlQ2hlY2tib3guc2V0TGF5b3V0RGF0YShyZWZlcmVuY2VMYWJlbEZvcm1EYXRhKTsKKwkJcmVmZXJlbmNlTGFiZWxGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2NlbmFyaW9Gb2xkZXJMYWJlbCwgMCk7CisJCXJlZmVyZW5jZUxhYmVsRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGJvdHRvbSwgMCk7CisJCXJlZmVyZW5jZUxhYmVsRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJcmVmZXJlbmNlTGFiZWxGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxNSwgMCk7CisJCQorCQlyZWZlcmVuY2VEaXJ0ZXh0ID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7CisJICAgIHJlZmVyZW5jZURpcnRleHQuc2V0Qm91bmRzKDEwLCAxMCwgMTAwLCAyMCk7CisJICAgIFN0cmluZyByZWZGb2xkZXIgPSBwcmVmcy5nZXRSZWNlbnRGb2xkZXIoUkVGRVJFTkNFX0ZPTERFUl9LRVkpOworCSAgICBpZihyZWZGb2xkZXI9PSBudWxsKSB7CisJICAgIAlyZWZGb2xkZXIgPSByZWNlbnRGb2xkZXI7CisJICAgIH0KKwkgCisJICAgIHJlZmVyZW5jZURpcnRleHQuc2V0VGV4dChyZWZGb2xkZXIpOworCSAgICBmaW5hbCBGb3JtRGF0YSByZWZEaXJUZXh0Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkgICAgcmVmZXJlbmNlRGlydGV4dC5zZXRMYXlvdXREYXRhKHJlZkRpclRleHRGb3JtRGF0YSk7CisJICAgIHJlZkRpclRleHRGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2NlbmFyaW9Gb2xkZXJMYWJlbCwgMCk7CisJICAgIHJlZkRpclRleHRGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tLCAwKTsKKwkgICAgcmVmRGlyVGV4dEZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodXNlUmVmZXJlbmNlQ2hlY2tib3gsIDApOworCSAgICByZWZEaXJUZXh0Rm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoODAsIDApOworCQkKKwkgICAgcGlja1JlZkJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcywgU1dULk5PTkUpOworCSAgICBwaWNrUmVmQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFUElWSUVXLlNFTEVDVERJUiIpKTsKKwkgICAgZmluYWwgRm9ybURhdGEgcGlja1JlZkJ1dHRvbkZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJICAgIHBpY2tSZWZCdXR0b25Gb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2NlbmFyaW9Gb2xkZXJMYWJlbCwgMCk7CisJICAgIHBpY2tSZWZCdXR0b25Gb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tLCAwKTsKKwkgICAgcGlja1JlZkJ1dHRvbkZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocmVmZXJlbmNlRGlydGV4dCwgMCk7CisJICAgIHBpY2tSZWZCdXR0b25Gb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCSAgICBwaWNrUmVmQnV0dG9uLnNldExheW91dERhdGEocGlja1JlZkJ1dHRvbkZvcm1EYXRhKTsKKwkgICAgcGlja1JlZkJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCQkKKwkgICAgcGlja1JlZkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQlmaW5hbCBTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJZmluYWwgRGlyZWN0b3J5RGlhbG9nIGRkID0gbmV3IERpcmVjdG9yeURpYWxvZygKKwkJCQkJCXNoZWxsLCBTV1QuT1BFTik7CisJCQkJCWRkLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFUElWSUVXLlNFTEVDVFJFRkVSRU5DRUZPTERFUiIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlTdHJpbmcgYmVnaW5TZWFyY2ggPSByZWZlcmVuY2VEaXJ0ZXh0LmdldFRleHQoKTsKKwkJCQkJaWYoKGJlZ2luU2VhcmNoPT1udWxsKXx8KGJlZ2luU2VhcmNoLmxlbmd0aCgpPDEpKSBiZWdpblNlYXJjaCA9IFJPT1RfUEFUSDsKKwkJCQkJZGQuc2V0RmlsdGVyUGF0aChiZWdpblNlYXJjaCk7CisJCQkJCWZpbmFsIFN0cmluZyBzZWxlY3RlZCA9IGRkLm9wZW4oKTsKKwkJCQkJaWYoc2VsZWN0ZWQhPW51bGwpIHJlZmVyZW5jZURpcnRleHQuc2V0VGV4dChzZWxlY3RlZCk7CisJCQl9CisJCX0pOworCSAgCisJICAgIC8vIGRlZmF1bHQgbm90IHNlbGVjdGVkCisJICAgIHVzZVJlZmVyZW5jZUNoZWNrYm94LnNldFNlbGVjdGlvbihmYWxzZSk7CisJICAgIHJlZmVyZW5jZURpcnRleHQuc2V0QmFja2dyb3VuZChncmV5KTsKKwkJcGlja1JlZkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCisJICAgIC8vLy8vLy8vLy8vLyBFTkQgUkVGRVJFTkNFIEZPTERFUiAvLy8vLy8vLworCSAgICAKKwkgICAgYm90dG9tICs9IDU7CisJICAgIENvbXBvc2l0ZSBhZ2dyZWdhdGVDb21wb3NpdGUgPSBnZXRBZ2dyZWdhdGVCdXR0b25Db21wb3NpdGUodGhpcywgTWVzc2FnZXMuZ2V0U3RyaW5nKCJFUElWSUVXLkFHR1JFR0FURURBVEEiKSk7CisKKworCSAgICBmaW5hbCBGb3JtRGF0YSBhZ2dyZWdhdGVCdXR0b25Gb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCSAgICBhZ2dyZWdhdGVCdXR0b25Gb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodXNlUmVmZXJlbmNlQ2hlY2tib3gsIDApOworCSAgICBhZ2dyZWdhdGVCdXR0b25Gb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tLCAwKTsKKwkgICAgYWdncmVnYXRlQnV0dG9uRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkgICAgYWdncmVnYXRlQnV0dG9uRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkgICAgYWdncmVnYXRlQ29tcG9zaXRlLnNldExheW91dERhdGEoYWdncmVnYXRlQnV0dG9uRm9ybURhdGEpOworCSAgICAKKwkgICAgZmluYWwgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIHByb2dyZXNzRGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyh0aGlzLmdldFNoZWxsKCkpOworCSAgICAKKwkgICAgYWdncmVnYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJCWZpbmFsIFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlTdHJpbmcgcmVmZXJlbmNlRGlyZWN0b3J5ID0gYWdncmVnYXRlRGlydGV4dC5nZXRUZXh0KCk7CisJCQkJCisJCQkJaWYoIWFuYWx5emVyLnZhbGlkYXRlKHJlZmVyZW5jZURpcmVjdG9yeSkpIHsKKwkJCQkJaWRlbnRpZmlhYmxlVGl0bGUuc2V0VGV4dChTY2VuYXJpb0FuYWx5c2lzU3VpdGUuTk9UX0ZPVU5EX01TRyk7CisJCQkJCXVwZGF0ZU1lc3NhZ2UoU2NlbmFyaW9BbmFseXNpc1N1aXRlLk5PVF9GT1VORF9NU0cpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCXVwZGF0ZU1lc3NhZ2UoU2NlbmFyaW9BbmFseXNpc1N1aXRlLldPUktJTkdfTVNHKTsKKwkJCQlTdHJpbmcgYWdncmVnYXRlRmlsZW5hbWUgPSBudWxsOworCQkJCVN0cmluZyBpbmNpZGVuY2VGaWxlbmFtZSA9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJU3RyaW5nW10gZGF0YUZpbGVzOworCQkJCQlpZih1c2VSZWZlcmVuY2VDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkgeworCQkJCQkJZGF0YUZpbGVzID0gYW5hbHl6ZXIuYWdncmVnYXRlQnlGaWx0ZXIocmVmZXJlbmNlRGlydGV4dC5nZXRUZXh0KCksYWdncmVnYXRlRGlydGV4dC5nZXRUZXh0KCksIHByb2dyZXNzRGlhbG9nLCBhbHBoYSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlkYXRhRmlsZXMgPSBhbmFseXplci5hZ2dyZWdhdGVEYXRhKGFnZ3JlZ2F0ZURpcnRleHQuZ2V0VGV4dCgpLCBwcm9ncmVzc0RpYWxvZywgYWxwaGEpOworCQkJCQl9CisJCQkJCWFnZ3JlZ2F0ZUZpbGVuYW1lID0gZGF0YUZpbGVzWzBdOworCQkJCSAgICBpbmNpZGVuY2VGaWxlbmFtZSA9IGRhdGFGaWxlc1sxXTsKKwkJCQkgICAgLy8gdmFsaWQgc28gcmVtZW1iZXIgdGhlIHByZWZlcmVuY2VzCisJCQkJCXByZWZzLnNldFJlY2VudEZvbGRlcihDT05TVU1FUixhZ2dyZWdhdGVEaXJ0ZXh0LmdldFRleHQoKSk7CisJCQkJCXByZWZzLnNldFJlY2VudEZvbGRlcihSRUZFUkVOQ0VfRk9MREVSX0tFWSxyZWZlcmVuY2VEaXJ0ZXh0LmdldFRleHQoKSk7CisJCQkJCS8vIHJlbWVtYmVyIHRoZSBvdXRwdXQgZmlsZXMgYXMgd2VsbAorCQkJCQlwcmVmcy5zZXRSZWNlbnRGb2xkZXIoQUdHUkVHQVRFX0ZPTERFUl9LRVksYWdncmVnYXRlRmlsZW5hbWUpOworCQkJCQlwcmVmcy5zZXRSZWNlbnRGb2xkZXIoSU5DSURFTkNFX0ZPTERFUl9LRVksaW5jaWRlbmNlRmlsZW5hbWUpOworCQkJCX0gY2F0Y2goU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiBzaWUpIHsKKwkJCQkJdXBkYXRlTWVzc2FnZShTY2VuYXJpb0FuYWx5c2lzU3VpdGUuSU5WQUxJRF9EQVRBX01TRyk7CisJCQkJCUFjdGl2YXRvci5sb2dFcnJvcihzaWUuZ2V0TWVzc2FnZSgpLCBzaWUpOworCQkJCX0KKwkJCQkKKwkJCQlmaWxldGV4dEFnZ3JlZ2F0ZS5zZXRUZXh0KGFnZ3JlZ2F0ZUZpbGVuYW1lKTsKKwkJCQlmaWxldGV4dEluY2lkZW5jZS5zZXRUZXh0KGluY2lkZW5jZUZpbGVuYW1lKTsKKwkJCQl1cGRhdGVNZXNzYWdlKFNjZW5hcmlvQW5hbHlzaXNTdWl0ZS5SRUFEWV9NU0cpOworCQkJfQorCQl9KTsKKwkgICAgCisJICAgIAorCSAgICBib3R0b20gKz0gNTsKKwkJYWdncmVnYXRlRmlsZUxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5CT1JERVIpOworCQlhZ2dyZWdhdGVGaWxlTGFiZWwuc2V0QmFja2dyb3VuZChsYWJlbEJhY2tncm91bmQpOworCQlhZ2dyZWdhdGVGaWxlTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkVQSVZJRVcuQUdHRklMRUxBQkVMIikpOworCQlmaW5hbCBGb3JtRGF0YSBhZ2dyZWdhdGVGaWxlTGFiZWxGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlhZ2dyZWdhdGVGaWxlTGFiZWwuc2V0TGF5b3V0RGF0YShhZ2dyZWdhdGVGaWxlTGFiZWxGb3JtRGF0YSk7CisJCWFnZ3JlZ2F0ZUZpbGVMYWJlbEZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChhZ2dyZWdhdGVDb21wb3NpdGUsIDApOworCQlhZ2dyZWdhdGVGaWxlTGFiZWxGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tLCAwKTsKKwkJYWdncmVnYXRlRmlsZUxhYmVsRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJYWdncmVnYXRlRmlsZUxhYmVsRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTUsIDApOworCQkKKwkJZmlsZXRleHRBZ2dyZWdhdGUgPSBuZXcgVGV4dCh0aGlzLCBTV1QuQk9SREVSKTsKKwkJZmlsZXRleHRBZ2dyZWdhdGUuc2V0Qm91bmRzKDEwLCAxMCwgMTAwLCAyMCk7CisJCVN0cmluZyBhZ2dyZWdhdGVEaXI9cHJlZnMuZ2V0UmVjZW50Rm9sZGVyKEFHR1JFR0FURV9GT0xERVJfS0VZKTsKKwkJZmlsZXRleHRBZ2dyZWdhdGUuc2V0VGV4dChhZ2dyZWdhdGVEaXIpOworCSAgICBmaW5hbCBGb3JtRGF0YSBmaWxlVGV4dEFnZ3JlZ2F0ZUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJICAgIGZpbGV0ZXh0QWdncmVnYXRlLnNldExheW91dERhdGEoZmlsZVRleHRBZ2dyZWdhdGVGb3JtRGF0YSk7CisJICAgIGZpbGVUZXh0QWdncmVnYXRlRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGFnZ3JlZ2F0ZUNvbXBvc2l0ZSwgMCk7CisJICAgIGZpbGVUZXh0QWdncmVnYXRlRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGJvdHRvbSwgMCk7CisJICAgIGZpbGVUZXh0QWdncmVnYXRlRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChhZ2dyZWdhdGVGaWxlTGFiZWwsIDApOworCSAgICBmaWxlVGV4dEFnZ3JlZ2F0ZUZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDgwLCAwKTsKKwkgICAgCisJICAgIC8vYm90dG9tICs9IDU7CisJICAgIGluY2lkZW5jZUZpbGVMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuQk9SREVSKTsKKwkJaW5jaWRlbmNlRmlsZUxhYmVsLnNldEJhY2tncm91bmQobGFiZWxCYWNrZ3JvdW5kKTsKKwkJaW5jaWRlbmNlRmlsZUxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFUElWSUVXLklOQ0ZJTEVMQUJFTCIpKTsKKwkJZmluYWwgRm9ybURhdGEgaW5jaWRlbmNlRmlsZUxhYmVsRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJaW5jaWRlbmNlRmlsZUxhYmVsLnNldExheW91dERhdGEoaW5jaWRlbmNlRmlsZUxhYmVsRm9ybURhdGEpOworCQlpbmNpZGVuY2VGaWxlTGFiZWxGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWdncmVnYXRlRmlsZUxhYmVsLCAwKTsKKwkJaW5jaWRlbmNlRmlsZUxhYmVsRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGJvdHRvbSs1LCAwKTsKKwkJaW5jaWRlbmNlRmlsZUxhYmVsRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJaW5jaWRlbmNlRmlsZUxhYmVsRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTUsIDApOworCSAgICAKKwkgICAgZmlsZXRleHRJbmNpZGVuY2UgPSBuZXcgVGV4dCh0aGlzLCBTV1QuQk9SREVSKTsKKwkJZmlsZXRleHRJbmNpZGVuY2Uuc2V0Qm91bmRzKDEwLCAxMCwgMTAwLCAyMCk7CisJCVN0cmluZyBpbmNpZGVuY2VEaXI9cHJlZnMuZ2V0UmVjZW50Rm9sZGVyKElOQ0lERU5DRV9GT0xERVJfS0VZKTsKKwkJZmlsZXRleHRJbmNpZGVuY2Uuc2V0VGV4dChpbmNpZGVuY2VEaXIpOworCSAgICBmaW5hbCBGb3JtRGF0YSBmaWxlVGV4dEluY2lkZW5jZUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJICAgIGZpbGV0ZXh0SW5jaWRlbmNlLnNldExheW91dERhdGEoZmlsZVRleHRJbmNpZGVuY2VGb3JtRGF0YSk7CisJICAgIGZpbGVUZXh0SW5jaWRlbmNlRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGZpbGV0ZXh0QWdncmVnYXRlLCAwKTsKKwkgICAgZmlsZVRleHRJbmNpZGVuY2VGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tKzUsIDApOworCSAgICBmaWxlVGV4dEluY2lkZW5jZUZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoaW5jaWRlbmNlRmlsZUxhYmVsLCAwKTsKKwkgICAgZmlsZVRleHRJbmNpZGVuY2VGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCg4MCwgMCk7CisJCQorCQkKKwkgICAgQnV0dG9uIHBpY2tBZ2dyZWdhdGVGaWxlQnV0dG9uID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuTk9ORSk7CisJICAgIAorCSAgICBwaWNrQWdncmVnYXRlRmlsZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiRVBJVklFVy5TRUxFQ1RBR0dGSUxFIikpOworCSAgICBmaW5hbCBGb3JtRGF0YSBwaWNrQWdncmVnYXRlRmlsZUJ1dHRvbkZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJICAgIHBpY2tBZ2dyZWdhdGVGaWxlQnV0dG9uRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGFnZ3JlZ2F0ZUNvbXBvc2l0ZSwgMCk7CisJICAgIHBpY2tBZ2dyZWdhdGVGaWxlQnV0dG9uRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGJvdHRvbSwgMCk7CisJICAgIHBpY2tBZ2dyZWdhdGVGaWxlQnV0dG9uRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChmaWxldGV4dEFnZ3JlZ2F0ZSwgMCk7CisJICAgIHBpY2tBZ2dyZWdhdGVGaWxlQnV0dG9uRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkgICAgcGlja0FnZ3JlZ2F0ZUZpbGVCdXR0b24uc2V0TGF5b3V0RGF0YShwaWNrQWdncmVnYXRlRmlsZUJ1dHRvbkZvcm1EYXRhKTsKKwkgICAgcGlja0FnZ3JlZ2F0ZUZpbGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKwkgICAgcGlja0FnZ3JlZ2F0ZUZpbGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQkJZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWZpbmFsIEZpbGVEaWFsb2cgZGQgPSBuZXcgRmlsZURpYWxvZygKKwkJCQkJCXNoZWxsLCBTV1QuT1BFTik7CisJCQkJCWRkLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFUElWSUVXLlNFTEVDVEFHR0ZJTEUiKSk7CisJCQkJCVN0cmluZyBiZWdpblNlYXJjaCA9IGZpbGV0ZXh0QWdncmVnYXRlLmdldFRleHQoKTsKKwkJCQkJaWYoKGJlZ2luU2VhcmNoPT1udWxsKXx8KGJlZ2luU2VhcmNoLmxlbmd0aCgpPDEpKSBiZWdpblNlYXJjaCA9IFJPT1RfUEFUSDsKKwkJCQkJZGQuc2V0RmlsdGVyUGF0aChiZWdpblNlYXJjaCk7CisJCQkJCQorCQkJCQlmaW5hbCBTdHJpbmcgc2VsZWN0ZWQgPSBkZC5vcGVuKCk7CisJCQkJCWlmKHNlbGVjdGVkIT1udWxsKSBmaWxldGV4dEFnZ3JlZ2F0ZS5zZXRUZXh0KHNlbGVjdGVkKTsKKwkJCX0KKwkJfSk7CisJICAgIAorCSAgICBib3R0b20gKz0gNTsKKworCSAgICBCdXR0b24gcGlja0luY2lkZW5jZUZpbGVCdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5OT05FKTsKKwkgICAgcGlja0luY2lkZW5jZUZpbGVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkVQSVZJRVcuU0VMRUNUSU5DRklMRSIpKTsKKwkgICAgZmluYWwgRm9ybURhdGEgcGlja0luY2lkZW5jZUZpbGVCdXR0b25Gb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCSAgICBwaWNrSW5jaWRlbmNlRmlsZUJ1dHRvbkZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwaWNrQWdncmVnYXRlRmlsZUJ1dHRvbiwgMCk7CisJICAgIHBpY2tJbmNpZGVuY2VGaWxlQnV0dG9uRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGJvdHRvbSwgMCk7CisJICAgIHBpY2tJbmNpZGVuY2VGaWxlQnV0dG9uRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChmaWxldGV4dEluY2lkZW5jZSwgMCk7CisJICAgIHBpY2tJbmNpZGVuY2VGaWxlQnV0dG9uRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkgICAgcGlja0luY2lkZW5jZUZpbGVCdXR0b24uc2V0TGF5b3V0RGF0YShwaWNrSW5jaWRlbmNlRmlsZUJ1dHRvbkZvcm1EYXRhKTsKKwkgICAgcGlja0luY2lkZW5jZUZpbGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKwkgICAgcGlja0luY2lkZW5jZUZpbGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQkJZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWZpbmFsIEZpbGVEaWFsb2cgZGQgPSBuZXcgRmlsZURpYWxvZygKKwkJCQkJCXNoZWxsLCBTV1QuT1BFTik7CisJCQkJCWRkLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFUElWSUVXLlNFTEVDVElOQ0ZJTEUiKSk7CisJCQkJCVN0cmluZyBiZWdpblNlYXJjaCA9IGZpbGV0ZXh0SW5jaWRlbmNlLmdldFRleHQoKTsKKwkJCQkJaWYoKGJlZ2luU2VhcmNoPT1udWxsKXx8KGJlZ2luU2VhcmNoLmxlbmd0aCgpPDEpKSBiZWdpblNlYXJjaCA9IFJPT1RfUEFUSDsKKwkJCQkJZGQuc2V0RmlsdGVyUGF0aChiZWdpblNlYXJjaCk7CisJCQkJCQorCQkJCQlmaW5hbCBTdHJpbmcgc2VsZWN0ZWQgPSBkZC5vcGVuKCk7CisJCQkJCWlmKHNlbGVjdGVkIT1udWxsKSBmaWxldGV4dEluY2lkZW5jZS5zZXRUZXh0KHNlbGVjdGVkKTsKKwkJCX0KKwkJfSk7CisJICAgIAorCSAgICBib3R0b20gKz0gNTsKKwkgICAgQ29tcG9zaXRlIHBsb3RCdXR0b25Db21wb3NpdGUgPSBnZXRQbG90QnV0dG9uQ29tcG9zaXRlKHRoaXMsIE1lc3NhZ2VzLmdldFN0cmluZygiRVBJVklFVy5QTE9UVEVYVCIpKTsKKwkgICAgCisJICAgIGZpbmFsIEZvcm1EYXRhIHBsb3RCdXR0b25Gb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCSAgICBwbG90QnV0dG9uRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGluY2lkZW5jZUZpbGVMYWJlbCwgMCk7CisJICAgIHBsb3RCdXR0b25Gb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tLCAwKTsKKwkgICAgcGxvdEJ1dHRvbkZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJICAgIHBsb3RCdXR0b25Gb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCSAgICBwbG90QnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEocGxvdEJ1dHRvbkZvcm1EYXRhKTsKKwkgCisJICAgIGZpbmFsIEVwaWRlbWljQ29udHJvbCBhQ3RybCA9IHRoaXM7CisJICAgIHBsb3RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQkJZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQorCQkJCQorCQkJCS8qCisJCQkJICogcmVpbml0aWFsaXplIHRoZSBncmFwaAorCQkJCSAqLworCQkJCWFnZ3JlZ2F0ZURhdGEuY2xlYXIoKTsKKwkJCQlpbmNpZGVuY2VEYXRhLmNsZWFyKCk7CisJCQkJcHJpbWFyeVByb3BlcnRpZXNUb1Bsb3QuY2xlYXIoKTsKKwkJCQlzZWNvbmRhcnlQcm9wZXJ0aWVzVG9QbG90LmNsZWFyKCk7CisJCQkJYWdncmVnYXRlRGF0YUNhbnZhcy5yZXNldCgpOworCQkJCW5ld0luY2lkZW5jZUNhbnZhcy5yZXNldCgpOworCQkJCQorCQkJCQorCQkJCS8vIGFuZCBwbG90IGFnYWluCisJCQkJQ1NWc2NlbmFyaW9Mb2FkZXIgbG9hZGVyID0gbmV3IENTVnNjZW5hcmlvTG9hZGVyKCk7CisJCQkJUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCBhZ2dyZWdhdGVNYXAgPSBudWxsOworCQkJCXRyeSB7CisJCQkJCWFnZ3JlZ2F0ZU1hcCA9IGxvYWRlci5wYXJzZUFnZ3JlZ2F0ZUZpbGUoZmlsZXRleHRBZ2dyZWdhdGUuZ2V0VGV4dCgpKTsKKwkJCQl9IGNhdGNoIChTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uIGUxKSB7CisJCQkJCUFjdGl2YXRvci5sb2dFcnJvcihlMS5nZXRNZXNzYWdlKCksIGUxKTsKKwkJCQl9CisJCQkJCisJCQkJZm9yKFN0cmluZyBsb2NhdGlvbiA6IGFnZ3JlZ2F0ZU1hcC5nZXRMb2NhdGlvbnMoKSkgeworCQkJCQlSZWZlcmVuY2VTY2VuYXJpb0RhdGFJbnN0YW5jZSBpbnN0YW5jZSA9IGFnZ3JlZ2F0ZU1hcC5nZXRMb2NhdGlvbihsb2NhdGlvbik7CisJCQkJCU1hcDxTdHJpbmcsIExpc3Q8RG91YmxlPj4gcmF3ZGF0YSA9IGluc3RhbmNlLmdldERhdGEoKTsKKwkJCQorCQkJCQlTdHJpbmdbXSBzdGF0ZXMgPSBmaWx0ZXJEaXNwbGF5YWJsZVN0YXRlcyhyYXdkYXRhLmtleVNldCgpKTsKKwkJCQkJCisJCQkJCUFycmF5cy5zb3J0KHN0YXRlcyk7CisJCQkJCS8vVE9ETyBhZGQgc2VsZWN0aW9uIG1ldGhvZCBmb3Igc3RhdGVzCisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVzLmxlbmd0aDsgaSArKyApIHsKKwkJCQkJCWlmKHJhd2RhdGEuZ2V0KHN0YXRlc1tpXSkhPW51bGwpIHsKKwkJCQkJCQlhZ2dyZWdhdGVEYXRhLmFkZChyYXdkYXRhLmdldChzdGF0ZXNbaV0pKTsKKwkJCQkJCQlwcmltYXJ5UHJvcGVydGllc1RvUGxvdC5hZGQoc3RhdGVzW2ldKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkKKwkJCQkJYUN0cmwuYWdncmVnYXRlRGF0YUNhbnZhcy5kcmF3KCk7CisJCQkJfS8vIGZvciBhbGwgbG9jYXRpb25zIGluIGFnZ3JlZ2F0ZU1hcCAob25seSBvbmUgZm9yIGFnZ3JlZ2F0ZSBkYXRhKQorCQkJCQorCQkJCQorCQkJCQorCQkJCQorCQkJCS8vIGFuZCBub3cgcGxvdCB0aGUgaW5jaWRlbmNlIGRhdGEKKwkJCQkKKwkJCQlNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGRhdGFNYXAgPSBudWxsOworCQkJCXRyeSB7CisJCQkJCWRhdGFNYXAgPSBsb2FkZXIucHJvY2Vzc0luY2lkZW5jZUZpbGUoZmlsZXRleHRJbmNpZGVuY2UuZ2V0VGV4dCgpKTsKKwkJCQl9IGNhdGNoIChTY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uIGUxKSB7CisJCQkJCUFjdGl2YXRvci5sb2dFcnJvcihlMS5nZXRNZXNzYWdlKCksIGUxKTsKKwkJCQl9CisJCQkJCisJCQkJCWluY2lkZW5jZURhdGEgPSBuZXcgQXJyYXlMaXN0PExpc3Q8RG91YmxlPj4oKTsKKwkJCQkJCisJCQkJCQorCQkJCQkKKwkJCQkJLy8gdmFsaWRhdGUgYW5kIGFkZCBkYXRhCisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jaWRlbmNlU3RhdGVzLmxlbmd0aDsgaSArKyApIHsKKwkJCQkJCWlmKGRhdGFNYXAuZ2V0KGluY2lkZW5jZVN0YXRlc1tpXSkhPW51bGwpIHsKKwkJCQkJCQkKKwkJCQkJCQlMaXN0PERvdWJsZT4gbmV4dERhdGEgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCQkJCQlMaXN0PFN0cmluZz4gZGF0YUxpc3QgPSBkYXRhTWFwLmdldChpbmNpZGVuY2VTdGF0ZXNbaV0pOworCQkJCQkJCQorCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGF0YUxpc3Quc2l6ZSgpOyBqICsrKSB7CisJCQkJCQkJCXRyeSB7CisJCQkJCQkJCQlEb3VibGUgZGJsID0gbmV3IERvdWJsZShkYXRhTGlzdC5nZXQoaikpOworCQkJCQkJCQkJaWYgKGRibCE9bnVsbCkgbmV4dERhdGEuYWRkKGRibCk7CisJCQkJCQkJCX0gY2F0Y2goRXhjZXB0aW9uIGVJZ25vcmUpIHsKKwkJCQkJCQkJCS8vIG5vdGhpbmcgaWYgbm90IGRvdWJsZSBkYXRhIHdlIGp1c3QgZG9uJ3QgdXNlIGl0LgorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWlmKG5leHREYXRhLnNpemUoKSA+PTEpIGluY2lkZW5jZURhdGEuYWRkKG5leHREYXRhKTsKKwkJCQkJCQlzZWNvbmRhcnlQcm9wZXJ0aWVzVG9QbG90LmFkZChpbmNpZGVuY2VTdGF0ZXNbaV0pOworCQkJCQkJfQorCQkJCQl9CQorCQkJCQlhQ3RybC5uZXdJbmNpZGVuY2VDYW52YXMuZHJhdygpOworCQkJCQorCQkJfQorCQl9KTsKKwkgICAgCisJCXN0YXR1c0xhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5CT1JERVIpOworCQlzdGF0dXNMYWJlbC5zZXRCYWNrZ3JvdW5kKGxhYmVsQmFja2dyb3VuZCk7CisJCXN0YXR1c0xhYmVsLnNldFRleHQoIiIpOworCQkKKwkJYm90dG9tICs9IDU7CisJCS8vIFBsb3QKKwkJCisJCS8vIGFnZ3JlZ2F0ZSB0aW1lIHNlcmllcyBkYXRhCisJCWFnZ3JlZ2F0ZURhdGFDYW52YXMgPSBuZXcgVGltZVNlcmllc0NhbnZhcyh0aGlzLAorCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiRVBJVklFVy5BR0dSRUdBVEVMRUdFTkQiKSwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkVQSVZJRVcuWUFYSVMiKSwKKwkJCQlBZ2dyZWdhdGVEYXRhV3JpdGVyLmdldEtleVMoKSwKKwkJCQlmb3JlR3JvdW5kLAorCQkJCWJhY2tncm91bmRHcm91bmQsCisJCQkJZnJhbWVDb2xvciwgMCk7CisJCQorCQlmaW5hbCBGb3JtRGF0YSBhbmFseXNpc0NoYXJ0Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJYWdncmVnYXRlRGF0YUNhbnZhcy5zZXRMYXlvdXREYXRhKGFuYWx5c2lzQ2hhcnRGb3JtRGF0YSk7CisJCWFuYWx5c2lzQ2hhcnRGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tLCAwKTsKKwkJYW5hbHlzaXNDaGFydEZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQlhbmFseXNpc0NoYXJ0Rm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJYW5hbHlzaXNDaGFydEZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDUwLCAwKTsKKwkJCisJCS8vIG5ldyBJbmNpZGVuY2UgQ2FudmFzIHNlcmllcyBkYXRhCisJCW5ld0luY2lkZW5jZUNhbnZhcyA9IG5ldyBUaW1lU2VyaWVzQ2FudmFzKHRoaXMsCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJJTkNWSUVXLklOQ0lERU5DRUxFR0VORCIpLAorCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiSU5DVklFVy5ZQVhJUyIpLAorCQkJCWluY2lkZW5jZVN0YXRlc1swXSwKKwkJCQlmb3JlR3JvdW5kLAorCQkJCWJhY2tncm91bmRHcm91bmQsCisJCQkJZnJhbWVDb2xvciwgMSk7CisJCQorCQlmaW5hbCBGb3JtRGF0YSBpbmNpZGVuY2VDaGFydEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCW5ld0luY2lkZW5jZUNhbnZhcy5zZXRMYXlvdXREYXRhKGluY2lkZW5jZUNoYXJ0Rm9ybURhdGEpOworCQlpbmNpZGVuY2VDaGFydEZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQlpbmNpZGVuY2VDaGFydEZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQlpbmNpZGVuY2VDaGFydEZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIDApOworCQlpbmNpZGVuY2VDaGFydEZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCisJfSAvLyBjcmVhdGVDb250ZW50cworCQorCS8qKgorCSAqIGNyZWF0ZXMgYSBBZ2dyZWdhdGUgQnV0dG9uIGNvbXBvc2l0ZSBhbmQgaXRzIGNvbXBvc2l0ZSBjb250YWluZXIKKwkgKiBAcGFyYW0gY29udHJvbAorCSAqIEBwYXJhbSB0aGUgQWdncmVnYXRlIGJ1dHRvbiBsYWJlbAorCSAqIEByZXR1cm4gdGhlIEFnZ3JlZ2F0ZSBjb21wb3NpdGUKKwkgKi8KKwlDb21wb3NpdGUgZ2V0QWdncmVnYXRlQnV0dG9uQ29tcG9zaXRlKEFuYWx5c2lzQ29udHJvbCBjb250cm9sLCBTdHJpbmcgbGFiZWwpIHsKKwkJQ29tcG9zaXRlIGFnZ3JlZ2F0ZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29udHJvbCwgU1dULkJPUkRFUik7CisJICAgIEZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7CisJICAgIGZpbGxMYXlvdXQudHlwZSA9IFNXVC5IT1JJWk9OVEFMOworCSAgICBhZ2dyZWdhdGVDb21wb3NpdGUuc2V0TGF5b3V0KGZpbGxMYXlvdXQpOworCSAgICBMYWJlbCBsZWZ0TGFiZWwgPSBuZXcgTGFiZWwoYWdncmVnYXRlQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJICAgIGxlZnRMYWJlbC5zZXRUZXh0KCIgIik7Ly8ganVzdCBhIHNwYWNlcgorCSAgICBhZ2dyZWdhdGVCdXR0b24gPSBuZXcgQnV0dG9uKGFnZ3JlZ2F0ZUNvbXBvc2l0ZSwgU1dULk5PTkUpOworCSAgICBhZ2dyZWdhdGVCdXR0b24gLnNldFRleHQobGFiZWwpOworCQlMYWJlbCByaWdodExhYmVsID0gbmV3IExhYmVsKGFnZ3JlZ2F0ZUNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlyaWdodExhYmVsLnNldFRleHQoIiAiKTsvLyBqdXN0IGEgc3BhY2VyCisJCWFnZ3JlZ2F0ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCSAgICByZXR1cm4gYWdncmVnYXRlQ29tcG9zaXRlOworCX0vL2dldEFnZ3JlZ2F0ZUJ1dHRvbkNvbXBvc2l0ZQorCQorCQorCQorCQorCS8qKgorCSAqIGNyZWF0ZXMgYSBQbG90QnV0dG9uIGNvbXBvc2l0ZSBhbmQgaXRzIGNvbXBvc2l0ZSBjb250YWluZXIKKwkgKiBAcGFyYW0gY29udHJvbAorCSAqIEBwYXJhbSB0aGUgcGxvdCBidXR0b24gbGFiZWwKKwkgKiBAcmV0dXJuIHRoZSBjb21wb3NpdGUKKwkgKi8KKwlDb21wb3NpdGUgZ2V0UGxvdEJ1dHRvbkNvbXBvc2l0ZShBbmFseXNpc0NvbnRyb2wgY29udHJvbCwgU3RyaW5nIGxhYmVsKSB7CisJCUNvbXBvc2l0ZSBwbG90Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb250cm9sLCBTV1QuQk9SREVSKTsKKwkgICAgRmlsbExheW91dCBmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoKTsKKwkgICAgZmlsbExheW91dC50eXBlID0gU1dULkhPUklaT05UQUw7CisJICAgIHBsb3RDb21wb3NpdGUuc2V0TGF5b3V0KGZpbGxMYXlvdXQpOworCSAgICB1c2VyTWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKHBsb3RDb21wb3NpdGUsIFNXVC5OT05FKTsKKwkgICAgdXNlck1lc3NhZ2VMYWJlbC5zZXRUZXh0KHVzZXJNZXNzYWdlKTsvLyBqdXN0IGEgc3BhY2VyCisJICAgIHBsb3RCdXR0b24gPSBuZXcgQnV0dG9uKHBsb3RDb21wb3NpdGUsIFNXVC5OT05FKTsKKwkgICAgcGxvdEJ1dHRvbiAuc2V0VGV4dChsYWJlbCk7CisJCUxhYmVsIHJpZ2h0TGFiZWwgPSBuZXcgTGFiZWwocGxvdENvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlyaWdodExhYmVsLnNldFRleHQoIiAiKTsvLyBqdXN0IGEgc3BhY2VyCisJCXBsb3RCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKwkgICAgcmV0dXJuIHBsb3RDb21wb3NpdGU7CisJfS8vZ2V0UGxvdEJ1dHRvbkNvbXBvc2l0ZQorCQorCQorCS8qKgorCSAqIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBhbmFseXNpcyBidXR0b24KKwkgKiAKKwkgKiBAcGFyYW0gYgorCSAqLworCQorCXB1YmxpYyB2b2lkIGVuYWJsZUFuYWx5c2lzKGJvb2xlYW4gYikgeworCQlpZihiKSB0aGlzLmFuYWx5emVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKwkJZWxzZSB0aGlzLmFuYWx5emVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJfQorCQorCQorCS8qKgorCSAqIHRvIHJlbW92ZSB0aGUgY29udHJvbCBlLmcuIGJ5IGEgcmVtb3ZlIGJ1dHRvbiBldmVudAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKwkJCisJCXVwZGF0ZVN0YXR1c0xhYmVsKCk7CisJfQorCisJCisJCisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0dXNMYWJlbCgpIHsKKwkJc3RhdHVzTGFiZWwuc2V0VGV4dChBbmFseXNpc0NvbnRyb2wuU1RBVFVTX1RFWFQpOworCX0KKwkKKworCS8qKgorCSAqIEluaXRpYWxpemUgdGhlIGhlYWRlciBsYWJlbAorCSAqIAorCSAqIEBwYXJhbSBmb2xkZXJOYW1lCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUhlYWRlcihTdHJpbmcgZm9sZGVyTmFtZSkgeworCQlzaW11bGF0aW9uTmFtZUxhYmVsLnNldFRleHQoImFuYWx5emluZyAiK2ZvbGRlck5hbWUpOworCisJfSAvLyBpbml0aWFsaXplRnJvbVNpbXVsYXRpb24KKworCisJCisJCisJCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkJCQkJCisJCXN1cGVyLmRpc3Bvc2UoKTsKKwkJCisJfSAvLyBkaXNwb3NlCisKKwkKKwkvKioKKwkgKiBub3QgdXNlZAorCSAqIEByZXR1cm4gbnVsbAorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGUgZ2V0SWRlbnRpZmlhYmxlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGFnZ3JlZ2F0ZSBkYXRhCisJICogQHBhcmFtIGNoYXJ0SW5kZXggCisJICogQHBhcmFtIHN0YXRlCisJICogQHJldHVybiBDdW11bGF0aXZlIGRldmlhdGlvbiBmcm9tIHJlZmVyZW5jZSB0cmFqZWN0b3J5CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGRvdWJsZVtdIGdldFZhbHVlcyhpbnQgY2hhcnRJbmRleCwgaW50IHN0YXRlKSB7CisJCS8vIHBpY2sgdGhlIHJpZ2h0IGRhdGEgZm9yIHRoZSByaWdodCBjaGFydAorCQlMaXN0PExpc3Q8RG91YmxlPj4gZGF0YSA9IGFnZ3JlZ2F0ZURhdGE7CisJCWlmKGNoYXJ0SW5kZXggPj0gMSkgZGF0YSA9IGluY2lkZW5jZURhdGE7CisJCQorCQlkb3VibGUgW10gcmVzdWx0ID0gbmV3IGRvdWJsZVtkYXRhLmdldChzdGF0ZSkuc2l6ZSgpXTsKKwkJaW50IGk9MDsKKwkJZm9yKGRvdWJsZSBkOmRhdGEuZ2V0KHN0YXRlKSkKKwkJCXJlc3VsdFtpKytdPWQ7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCS8qKgorCSAqIGdldCB0aGUgbmFtZSBvZiB0aGUgZGF0YSB0aW1lIHNlcmllcworCSAqIEBwYXJhbSBjaGFydEluZGV4IAorCSAqIEBwYXJhbSBzdGF0ZQorCSAqIEByZXR1cm4gcHJvcGVydHkgbmFtZQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoaW50IGNoYXJ0SW5kZXgsaW50IHN0YXRlKSB7CisJCS8vIHJldHVybiB0aGUgcmlnaHQgcHJvcGVydHkgZm9yIHRoZSByZXF1ZXN0ZWQgY2hhcnQKKwkJaWYoY2hhcnRJbmRleD09MCkgeworCQkJcmV0dXJuIHByaW1hcnlQcm9wZXJ0aWVzVG9QbG90LmdldChzdGF0ZSk7CisJCX0KKwkJcmV0dXJuIHNlY29uZGFyeVByb3BlcnRpZXNUb1Bsb3QuZ2V0KHN0YXRlKTsJCQkKKwl9CisJCisJLyoqCisJICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIHByb3BlcnRpZXMgdG8gcGxvdAorCSAqIEBwYXJhbSBjaGFydEluZGV4IAorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuQW5hbHlzaXNDb250cm9sI2dldE51bVByb3BlcnRpZXMoaW50IGNoYXJ0SW5kZXgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBnZXROdW1Qcm9wZXJ0aWVzKGludCBjaGFydEluZGV4KSB7CisJCS8vIHJldHVybiB0aGUgcmlnaHQgbnVtYmVyIG9mIHByb3BlcnRpZXMgZm9yIHRoZSByZXF1ZXN0ZWQgY2hhcnQKKwkJaWYoY2hhcnRJbmRleD09MCkgeworCQkJcmV0dXJuIHByaW1hcnlQcm9wZXJ0aWVzVG9QbG90LnNpemUoKTsKKwkJfQorCQlyZXR1cm4gc2Vjb25kYXJ5UHJvcGVydGllc1RvUGxvdC5zaXplKCk7CQorCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nW10gZmlsdGVyRGlzcGxheWFibGVTdGF0ZXMoU2V0PFN0cmluZz4gaW5wdXRTZXQpIHsKKwkJCisJCS8vIHJlbW92ZSBub24geS1heGlzIGRhdGEgaXRlbXMKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBPTUlUX0xJU1QubGVuZ3RoOyBpICsrKSB7CisJCQlpbnB1dFNldC5yZW1vdmUoT01JVF9MSVNUW2ldKTsKKwkJfQorCQkKKwkJU3RyaW5nW10gcmV0VmFsID0gbmV3IFN0cmluZ1tpbnB1dFNldC5zaXplKCldOworCQlpbnQgaWNvdW50ID0gMDsKKwkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gaW5wdXRTZXQuaXRlcmF0b3IoKTsKKwkJd2hpbGUoKGl0ZXIhPW51bGwpJiYoaXRlci5oYXNOZXh0KCkpKSB7CisJCQlTdHJpbmcga2V5ID0gaXRlci5uZXh0KCk7CisJCQlyZXRWYWxbaWNvdW50XSA9IGtleTsKKwkJICAgIGljb3VudCArKzsJCisJCX0KKwkJQXJyYXlzLnNvcnQocmV0VmFsKTsKKwkJCisJCXJldHVybiByZXRWYWw7CisJfQorCQorCSAvKioKKwkgKiBFYWNoIENvbnRyb2wgY2xhc3MgbWF5IGFkZCBvYmplY3RzIHRvIHRoaXMgbWFwCisJICogQHJldHVybiB0aGUgY29udHJvbCBwYXJhbWV0ZXJzIG1hcHMKKwkgKi8KKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRDb250cm9sUGFyYW1ldGVyc01hcCgpIHsKKwkJLy8gYWRkIG5vdGhpbmcgZm9yIG5vdworCQlyZXR1cm4gY29udHJvbFBhcmFtZXRlcnNNYXA7CisJfQorCQorfSAvLyBFc3RpbWF0b3JDb250cm9sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9FcGlkZW1pY0ZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL0VwaWRlbWljRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNzgzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9FcGlkZW1pY0ZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUyIEBACisvLyBFc3RpbWF0b3JGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIEFuYWx5c2lzQ29udHJvbH0gaW5zdGFuY2VzLgorICovCitwdWJsaWMgY2xhc3MgRXBpZGVtaWNGYWN0b3J5IGltcGxlbWVudHMgQW5hbHlzaXNDb250cm9sRmFjdG9yeSB7CisKKwkvKioKKwkgKiBwdWJsaWMgSU5TVEFOQ0UgZm9yIHRoaXMgRmFjdG9yeQorCSAqLworCXB1YmxpYyBzdGF0aWMgRXBpZGVtaWNGYWN0b3J5IElOU1RBTkNFID0gbmV3IEVwaWRlbWljRmFjdG9yeSgpOworCisJLyoqCisJICogQ29uc3RhbnRzIAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOQUxZU0lTX1RZUEUgPSAiQWdncmVnYXRlIjsKKwkKKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gZGlyTmFtZQorCSAqIEByZXR1cm4gbmV3IEVzdGltYXRvckNvbnRyb2woKQorCSAqLworCXB1YmxpYyBBbmFseXNpc0NvbnRyb2wgY3JlYXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkaXJOYW1lKSB7CisJCQkJCisJCXJldHVybiBuZXcgRXBpZGVtaWNDb250cm9sKHBhcmVudCk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0eXBlIG9mIGFuYWx5c2lzCisJICogCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb250cm9sVHlwZSgpIHsKKwkJcmV0dXJuIEFOQUxZU0lTX1RZUEU7CisJfQorCit9IC8vIEVzdGltYXRvckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL0VwaWRlbWljVmlldy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvRXBpZGVtaWNWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkOWM1NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL0VwaWRlbWljVmlldy5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8vIEVzdGltYXRvclZpZXcgCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OworCisvKioKKyAqIFRoZSB2aWV3IHByb3ZpZGVzIGEgdG9vbCBmb3IgYW5hbHl6aW5nIGFnZ3JlZ2F0ZSBkYXRhCisgKi8KKworcHVibGljIGNsYXNzIEVwaWRlbWljVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKKworCS8qKgorCSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBBZ2dyZWdhdGUgVmlldyB7QHZhbHVlfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FnZ3JlZ2F0ZV9WSUVXID0gIm9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5hZ2dyZWdhdGUiOyAvLyROT04tTkxTLTEkCisKKworCXByaXZhdGUgQW5hbHlzaXNWaWV3ZXIgYW5hbHlzaXNWaWV3ZXI7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQlhbmFseXNpc1ZpZXdlciA9IG5ldyBBbmFseXNpc1ZpZXdlcihwYXJlbnQsIEVwaWRlbWljRmFjdG9yeS5JTlNUQU5DRSk7CisJCWFuYWx5c2lzVmlld2VyLnNldElucHV0KFNpbXVsYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKSk7CisKKwkJZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKGFuYWx5c2lzVmlld2VyKTsKKwl9IC8vIGNyZWF0ZVBhcnRDb250cm9sCisKKwkKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9IC8vIGRpc3Bvc2UKKworCS8qKgorCSAqIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIGludGVyZmFjZSwgYnV0IHdlJ3JlIG5vdCB1c2luZyBpdC4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCS8vIE5vdGhpbmcKKwl9IC8vIHNldEZvY3VzCisKK30gLy8gRXN0aW1hdG9yVmlldwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvRXN0aW1hdG9yQ2FudmFzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9Fc3RpbWF0b3JDYW52YXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTQxNmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvRXN0aW1hdG9yQ2FudmFzLmphdmEKQEAgLTAsMCArMSwzNzIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQuZGV2aWNlLklEZXZpY2VSZW5kZXJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmV4Y2VwdGlvbi5DaGFydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmZhY3RvcnkuR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuQ2hhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5DaGFydFdpdGhBeGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkFuY2hvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5BeGlzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5Cb3VuZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuQ2hhcnREaW1lbnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuQ29sb3JEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkludGVyc2VjdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuUG9zaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuVGlja1N0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLmltcGwuQm91bmRzSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5pbXBsLkNvbG9yRGVmaW5pdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5jb21wb25lbnQuQXhpczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmNvbXBvbmVudC5TZXJpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5jb21wb25lbnQuaW1wbC5TZXJpZXNJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuZGF0YS5OdW1iZXJEYXRhU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuZGF0YS5TZXJpZXNEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuZGF0YS5UZXh0RGF0YVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuaW1wbC5OdW1iZXJEYXRhU2V0SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuaW1wbC5TZXJpZXNEZWZpbml0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuaW1wbC5UZXh0RGF0YVNldEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5pbXBsLkNoYXJ0V2l0aEF4ZXNJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwubGF5b3V0LkxlZ2VuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmxheW91dC5QbG90OworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwudHlwZS5CYXJTZXJpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC50eXBlLmltcGwuQmFyU2VyaWVzSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LnV0aWwuUGx1Z2luU2V0dGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OworCisvKioKKyAqIFRpbWVTZXJpZXNDYW52YXMgaXMgYSBzdWJjbGFzcyBvZiB7QGxpbmsgQ2FudmFzfSBzdWl0YWJsZSBmb3IgY2hhcnQgZHJhd2luZ3MuCisgKi8KK3B1YmxpYyBjbGFzcyBFc3RpbWF0b3JDYW52YXMgZXh0ZW5kcyBDYW52YXMgeworCisJcHJvdGVjdGVkIElEZXZpY2VSZW5kZXJlciBpZHIgPSBudWxsOworCisJLyoqCisJICogVGhpcyBpcyB0aGUge0BsaW5rIENoYXJ0fSB0aGF0IHBsb3RzIHRoZSByZWxhdGl2ZSB2YWx1ZXMuCisJICovCisJcHJvdGVjdGVkIENoYXJ0IGNtID0gbnVsbDsKKworCS8vcHJpdmF0ZSBFc3RpbWF0b3JDb250cm9sIGNvbnRyb2wgPSBudWxsOworCisJc3RhdGljIENvbG9yRGVmaW5pdGlvbltdIGJhckNvbG9ycyA9IHtDb2xvckRlZmluaXRpb25JbXBsLlJFRCgpLAorCQlDb2xvckRlZmluaXRpb25JbXBsLkJMVUUoKSwKKwkJQ29sb3JEZWZpbml0aW9uSW1wbC5PUkFOR0UoKSwKKwkJQ29sb3JEZWZpbml0aW9uSW1wbC5ZRUxMT1coKSwKKwkJQ29sb3JEZWZpbml0aW9uSW1wbC5HUkVFTigpLAorCQlDb2xvckRlZmluaXRpb25JbXBsLlBJTksoKSwKKwkJQ29sb3JEZWZpbml0aW9uSW1wbC5CTEFDSygpIH07CisKKworCS8qKgorCSAqIHRoZSBjaGFydCB0aXRsZQorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRSA9ICJFc3RpbWF0ZWQgUGFyYW1ldGVycyI7CisKKwkvKioKKwkgKiB0aGUgbGVnZW5kCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFUyA9ICJQYXJhbWV0ZXIgVmFsdWVzIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVTX0xPV0VSID0gIlZhbHVlIC0gU3RkLkRldi4iOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRVNfSElHSEVSID0gIlZhbHVlICsgU3RkLkRldi4iOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBTSE9XX1NURF9ERVYgPSBmYWxzZTsKKworCisJLyoqCisJICogQ29sbGVjdGlvbiBvZiB2YWx1ZXMgZm9yIHRoZSBYLVNFUklFUyBiYXIgbGFiZWxzCisJICoqLworCXByaXZhdGUgc3RhdGljIFZlY3RvcjxTdHJpbmc+IHhBeGlzUGFyYW1ldGVyTmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKworCS8qKgorCSAqIENvbGxlY3Rpb24gb2YgdmFsdWVzIGZvciB0aGUgWS1TRVJJRVMgYmFycworCSAqKi8KKwlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3Q8RG91YmxlPiBiYXJWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwlwcml2YXRlIHN0YXRpYyBOdW1iZXJEYXRhU2V0IGJhck9ydGhvVmFsdWVzOworCisKKwkvKioKKwkgKiBDb2xsZWN0aW9uIG9mIHZhbHVlcyBmb3IgdGhlIFktU0VSSUVTMiBzdGFuZGFyZCBkZXZpYXRpb24gbG93ZXIgYW5kIGhpZ2hlciBiYXJzCisJICoqLworCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdDxEb3VibGU+IGJhclN0ZERldkxvd2VyID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0PERvdWJsZT4gYmFyU3RkRGV2SGlnaGVyID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJcHJpdmF0ZSBzdGF0aWMgTnVtYmVyRGF0YVNldCBiYXJPcnRob1N0ZERldkxvd2VyOworCXByaXZhdGUgc3RhdGljIE51bWJlckRhdGFTZXQgYmFyT3J0aG9TdGREZXZIaWdoZXIKKwk7CisKKwkvKioKKwkgKiBDaGFydCBnZW5lcmF0b3IgaW5zdGFuY2UgKHJlZmVyZW5jZSB0byBhIHNpbmdsZXRvbikKKwkgKi8KKwlHZW5lcmF0b3IgZ3I7CisKKwlJbWFnZSBpbWdDaGFydCA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICB0aGUgU1dUIHBhcmVudCBvZiB0aGUge0BsaW5rIFdpZGdldH0KKwkgKi8KKwlwdWJsaWMgRXN0aW1hdG9yQ2FudmFzKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50LCBTV1QuRE9VQkxFX0JVRkZFUkVEIHwgU1dULkJPUkRFUik7CisKKwkJZ3IgPSBHZW5lcmF0b3IuaW5zdGFuY2UoKTsKKworCQl0cnkgeworCQkJaWRyID0gUGx1Z2luU2V0dGluZ3MuaW5zdGFuY2UoKS5nZXREZXZpY2UoImR2LlNXVCIpOyAvLyROT04tTkxTLTEkCQkJCisJCX0gY2F0Y2ggKGZpbmFsIENoYXJ0RXhjZXB0aW9uIHBleCkgeworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJQcm9ibGVtIGluaXRpYWxpemluZyBjaGFydCIsIHBleCk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybjsKKwkJfQorCisJCS8vY29udHJvbCA9IChFc3RpbWF0b3JDb250cm9sKSBwYXJlbnQ7CisKKwkJVmVjdG9yPFN0cmluZz4geEF4aXNQYXJhbWV0ZXJzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisJCXhBeGlzUGFyYW1ldGVycy5hZGQoImJldGEiKTsKKwkJeEF4aXNQYXJhbWV0ZXJzLmFkZCgiYWxwaGEiKTsKKwkJeEF4aXNQYXJhbWV0ZXJzLmFkZCgiZXBzaWxvbiIpOworCQl4QXhpc1BhcmFtZXRlcnMuYWRkKCJnYW1tYSIpOworCisJCS8vTWFwPFN0cmluZyxEb3VibGU+IGluaXRNYXAgPSBNb2RlbFBhcmFtZXRlcnM7CisJCS8vY20gPSBjcmVhdGVCYXJDaGFydChpbml0TWFwKTsgCisKKwkJYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChmaW5hbCBQYWludEV2ZW50IHBlKSB7CisJCQkJaWYoY20gPT0gbnVsbCkgcmV0dXJuOworCQkJCWZpbmFsIENvbXBvc2l0ZSBzb3VyY2UgPSAoQ29tcG9zaXRlKSBwZS5nZXRTb3VyY2UoKTsKKwkJCQlmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlIGQgPSBzb3VyY2UKKwkJCQkuZ2V0Q2xpZW50QXJlYSgpOworCisJCQkJaWYoaW1nQ2hhcnQgIT0gbnVsbCkgaW1nQ2hhcnQuZGlzcG9zZSgpOworCQkJCWltZ0NoYXJ0ID0gbmV3IEltYWdlKHNvdXJjZS5nZXREaXNwbGF5KCksIGQpOworCQkJCWlkci5zZXRQcm9wZXJ0eShJRGV2aWNlUmVuZGVyZXIuR1JBUEhJQ1NfQ09OVEVYVCwgbmV3IEdDKAorCQkJCQkJaW1nQ2hhcnQpKTsKKwkJCQlmaW5hbCBCb3VuZHMgYm91bmRzID0gQm91bmRzSW1wbC5jcmVhdGUoZC54LCBkLnksIGQud2lkdGgsCisJCQkJCQlkLmhlaWdodCk7CisJCQkJYm91bmRzLnNjYWxlKDcyZCAvIGlkci5nZXREaXNwbGF5U2VydmVyKCkuZ2V0RHBpUmVzb2x1dGlvbigpKTsKKwkJCQkvLyBCT1VORFMgTVVTVCBCRSBTUEVDSUZJRUQgSU4gUE9JTlRTCisKKwkJCQl0cnkgeworCQkJCQlnci5yZW5kZXIoaWRyLCBnci5idWlsZChpZHIuZ2V0RGlzcGxheVNlcnZlcigpLCBjbSwgYm91bmRzLAorCQkJCQkJCW51bGwsIG51bGwsIG51bGwpKTsKKwkJCQkJcGUuZ2MuZHJhd0ltYWdlKGltZ0NoYXJ0LCBkLngsIGQueSk7CisJCQkJfSBjYXRjaCAoZmluYWwgQ2hhcnRFeGNlcHRpb24gY2UpIHsKKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJQcm9ibGVtIHJlbmRlcmluZyBjaGFydCIsIGNlKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKworCQkJfSAvLyBwYWludENvbnRyb2wKKwkJfSAvLyBQYWludExpc3RlbmVyCisKKwkJKTsKKworCX0gLy8gRXN0aW1hdG9yQ2FudmFzIGNvbnN0cnVjdG9yCisKKwkvKioKKwkgKiAqIGNyZWF0ZXMgdGhlIGNoYXJ0CisJICogQHBhcmFtIGJhckRhdGFNYXAKKwkgKiBAcmV0dXJuIGEgYmFyIGNoYXJ0CisJICovCisJQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKwlwdWJsaWMgc3RhdGljIENoYXJ0IGNyZWF0ZUJhckNoYXJ0KE1hcDxTdHJpbmcsUGFyYW1ldGVyPiBiYXJEYXRhTWFwKSB7CisJCS8vIFJlc2V0IGV2ZXJ5dGhpbmcKKwkJeEF4aXNQYXJhbWV0ZXJOYW1lcy5jbGVhcigpOworCQliYXJWYWx1ZXMuY2xlYXIoKTsKKwkJYmFyU3RkRGV2TG93ZXIuY2xlYXIoKTsKKwkJYmFyU3RkRGV2SGlnaGVyLmNsZWFyKCk7CisKKwkJLy8gQkFSIENIQVJUUyBBUkUgQkFTRUQgT04gQ0hBUlRTIFRIQVQgQ09OVEFJTiBBWEVTCisJCUNoYXJ0V2l0aEF4ZXMgY3dhQmFyID0gQ2hhcnRXaXRoQXhlc0ltcGwuY3JlYXRlKCk7CisJCWN3YUJhci5nZXRCbG9jaygpLnNldEJhY2tncm91bmQoQ29sb3JEZWZpbml0aW9uSW1wbC5XSElURSgpKTsKKwkJY3dhQmFyLmdldEJsb2NrKCkuZ2V0T3V0bGluZSgpLnNldFZpc2libGUodHJ1ZSk7CisJCWN3YUJhci5zZXREaW1lbnNpb24oQ2hhcnREaW1lbnNpb24uVFdPX0RJTUVOU0lPTkFMX1dJVEhfREVQVEhfTElURVJBTCk7CisKKwkJLy8gQ1VTVE9NSVpFIFRIRSBQTE9UCisJCVBsb3QgcCA9IGN3YUJhci5nZXRQbG90KCk7CisJCXAuZ2V0Q2xpZW50QXJlYSgpLnNldEJhY2tncm91bmQoQ29sb3JEZWZpbml0aW9uSW1wbC5jcmVhdGUoMjU1LCAyNTUsIDIyNSkpOworCQlwLmdldE91dGxpbmUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJY3dhQmFyLmdldFRpdGxlKCkuZ2V0TGFiZWwoKS5nZXRDYXB0aW9uKCkuc2V0VmFsdWUoVElUTEUpOworCisJCS8vIENVU1RPTUlaRSBUSEUgTEVHRU5ECisJCUxlZ2VuZCBsZyA9IGN3YUJhci5nZXRMZWdlbmQoKTsKKwkJbGcuZ2V0VGV4dCgpLmdldEZvbnQoKS5zZXRTaXplKDE2KTsKKwkJbGcuZ2V0SW5zZXRzKCkuc2V0KDEwLCA1LCAwLCAwKTsKKwkJbGcuc2V0QW5jaG9yKEFuY2hvci5OT1JUSF9MSVRFUkFMKTsKKworCQkvLyBDVVNUT01JWkUgVEhFIFgtQVhJUworCQlBeGlzIHhBeGlzUHJpbWFyeSA9IGN3YUJhci5nZXRQcmltYXJ5QmFzZUF4ZXMoKVswXTsKKwkJeEF4aXNQcmltYXJ5LnNldFR5cGUoQXhpc1R5cGUuVEVYVF9MSVRFUkFMKTsKKwkJeEF4aXNQcmltYXJ5LmdldE1ham9yR3JpZCgpLnNldFRpY2tTdHlsZShUaWNrU3R5bGUuQkVMT1dfTElURVJBTCk7CisJCXhBeGlzUHJpbWFyeS5nZXRPcmlnaW4oKS5zZXRUeXBlKEludGVyc2VjdGlvblR5cGUuVkFMVUVfTElURVJBTCk7CisJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLnNldFZpc2libGUoZmFsc2UpOworCisJCS8vIENVU1RPTUlaRSBUSEUgWS1BWElTCisJCUF4aXMgeUF4aXNQcmltYXJ5ID0gY3dhQmFyLmdldFByaW1hcnlPcnRob2dvbmFsQXhpcyh4QXhpc1ByaW1hcnkpOworCQl5QXhpc1ByaW1hcnkuZ2V0TWFqb3JHcmlkKCkuc2V0VGlja1N0eWxlKFRpY2tTdHlsZS5MRUZUX0xJVEVSQUwpOworCQl5QXhpc1ByaW1hcnkuc2V0VHlwZShBeGlzVHlwZS5MSU5FQVJfTElURVJBTCk7CisJCXlBeGlzUHJpbWFyeS5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5nZXRGb250KCkuc2V0Um90YXRpb24oOTApOworCisKKwkJLy8gcG9wdWxhdGUgZnJvbSB0aGUgbWFwCisJCVNldDxTdHJpbmc+IGtleVNldCA9IGJhckRhdGFNYXAua2V5U2V0KCk7CisJCVN0cmluZ1tdIGtleXMgPSBuZXcgU3RyaW5nW2tleVNldC5zaXplKCldOworCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBrZXlTZXQuaXRlcmF0b3IoKTsKKwkJaW50IGljb3VudCA9IDA7CisJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQlrZXlzW2ljb3VudF0gPSBpdGVyLm5leHQoKTsKKwkJCWljb3VudCArKzsKKwkJfQorCQlBcnJheXMuc29ydChrZXlzKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CisJCQlTdHJpbmcgcGFyYW1OYW1lID0ga2V5c1tpXTsKKwkJCXhBeGlzUGFyYW1ldGVyTmFtZXMuYWRkKHBhcmFtTmFtZSk7CisJCQlEb3VibGUgZFZhbHVlID0gbmV3IERvdWJsZShiYXJEYXRhTWFwLmdldChwYXJhbU5hbWUpLnZhbHVlKTsKKworCQkJYmFyU3RkRGV2TG93ZXIuYWRkKGRWYWx1ZSk7CisJCQliYXJWYWx1ZXMuYWRkKGRWYWx1ZSk7CisJCQliYXJTdGREZXZIaWdoZXIuYWRkKGRWYWx1ZSk7CisJCX0KKworCQlUZXh0RGF0YVNldCBjYXRlZ29yeVZhbHVlcyA9IFRleHREYXRhU2V0SW1wbC5jcmVhdGUoeEF4aXNQYXJhbWV0ZXJOYW1lcyk7CisKKwkJYmFyT3J0aG9WYWx1ZXMgPSBOdW1iZXJEYXRhU2V0SW1wbC5jcmVhdGUoYmFyVmFsdWVzKTsKKwkJYmFyT3J0aG9TdGREZXZMb3dlciA9IE51bWJlckRhdGFTZXRJbXBsLmNyZWF0ZShiYXJTdGREZXZMb3dlcik7CisJCWJhck9ydGhvU3RkRGV2SGlnaGVyID0gTnVtYmVyRGF0YVNldEltcGwuY3JlYXRlKGJhclN0ZERldkhpZ2hlcik7CisKKwkJLy8gQ1JFQVRFIFRIRSBDQVRFR09SWSBCQVNFIFNFUklFUworCQlTZXJpZXMgc2VDYXRlZ29yeSA9IFNlcmllc0ltcGwuY3JlYXRlKCk7CisJCXNlQ2F0ZWdvcnkuc2V0RGF0YVNldChjYXRlZ29yeVZhbHVlcyk7CisKKwkJLy8gQ3JlYXRlIHRoZSBmaXJzdCBzZXJpZXMgb2YgZGF0YVZhbHVlcyB0aGUgT1JUSE9HT05BTCBWYWx1ZS1TdGF0bmRhcmQgZGV2aWF0aW9ucyBMT1dFUiBTRVJJRVMKKwkJQmFyU2VyaWVzIGJzTG93ZXIgPSAoQmFyU2VyaWVzKSBCYXJTZXJpZXNJbXBsLmNyZWF0ZSgpOworCQlic0xvd2VyLnNldFNlcmllc0lkZW50aWZpZXIoVkFMVUVTX0xPV0VSKTsKKwkJYnNMb3dlci5zZXREYXRhU2V0KGJhck9ydGhvU3RkRGV2TG93ZXIpOworCQlic0xvd2VyLnNldFJpc2VyT3V0bGluZShudWxsKTsKKwkJYnNMb3dlci5nZXRMYWJlbCgpLnNldFZpc2libGUodHJ1ZSk7CisJCWJzTG93ZXIuc2V0TGFiZWxQb3NpdGlvbihQb3NpdGlvbi5JTlNJREVfTElURVJBTCk7CisKKwkJLy8gQ3JlYXRlIHRoZSBWYWx1ZXMgc2VyaWVzIG9mIGRhdGFWYWx1ZXMgdGhlIE9SVEhPR09OQUwgU0VSSUVTCisJCUJhclNlcmllcyBic1ZhbHVlcyA9IChCYXJTZXJpZXMpIEJhclNlcmllc0ltcGwuY3JlYXRlKCk7CisJCWJzVmFsdWVzLnNldFNlcmllc0lkZW50aWZpZXIoVkFMVUVTKTsKKwkJYnNWYWx1ZXMuc2V0RGF0YVNldChiYXJPcnRob1ZhbHVlcyk7CisJCWJzVmFsdWVzLnNldFJpc2VyT3V0bGluZShudWxsKTsKKwkJYnNWYWx1ZXMuZ2V0TGFiZWwoKS5zZXRWaXNpYmxlKHRydWUpOworCQlic1ZhbHVlcy5zZXRMYWJlbFBvc2l0aW9uKFBvc2l0aW9uLklOU0lERV9MSVRFUkFMKTsKKworCQkvLyBDcmVhdGUgdGhlIFRISVJEIHNlcmllcyBvZiBkYXRhVmFsdWVzIHRoZSBPUlRIT0dPTkFMIFZhbHVlK1N0ZERldiBISUdIRVIgU0VSSUVTCisJCUJhclNlcmllcyBic0hpZ2hlciA9IChCYXJTZXJpZXMpIEJhclNlcmllc0ltcGwuY3JlYXRlKCk7CisJCWJzSGlnaGVyLnNldFNlcmllc0lkZW50aWZpZXIoVkFMVUVTX0hJR0hFUik7CisJCWJzSGlnaGVyLnNldERhdGFTZXQoYmFyT3J0aG9TdGREZXZIaWdoZXIpOworCQlic0hpZ2hlci5zZXRSaXNlck91dGxpbmUobnVsbCk7CisJCWJzSGlnaGVyLmdldExhYmVsKCkuc2V0VmlzaWJsZSh0cnVlKTsKKwkJYnNIaWdoZXIuc2V0TGFiZWxQb3NpdGlvbihQb3NpdGlvbi5JTlNJREVfTElURVJBTCk7CisKKwkJLy8gV1JBUCBUSEUgQkFTRSBTRVJJRVMgSU4gVEhFIFgtQVhJUyBTRVJJRVMgREVGSU5JVElPTgorCQlTZXJpZXNEZWZpbml0aW9uIHNkWCA9IFNlcmllc0RlZmluaXRpb25JbXBsLmNyZWF0ZSgpOworCQlzZFguZ2V0U2VyaWVzUGFsZXR0ZSgpLnVwZGF0ZSgwKTsgLy8gU0VUIFRIRSBDT0xPUlMgSU4gVEhFIFBBTEVUVEUKKwkJeEF4aXNQcmltYXJ5LmdldFNlcmllc0RlZmluaXRpb25zKCkuYWRkKHNkWCk7CisJCXNkWC5nZXRTZXJpZXMoKS5hZGQoc2VDYXRlZ29yeSk7CisKKwkJaWYgKFNIT1dfU1REX0RFVikgeworCQkJLy8gT25lIFRIRSBPUlRIT0dPTkFMIFZBTFVFUy1TVEQtREVWIGxvd2VyIFNFUklFUyBGb3IgdGhlIFktQVhJUyBTRVJJRVMgREVGSU5JVElPTgorCQkJU2VyaWVzRGVmaW5pdGlvbiBzZFlsb3dlciA9IFNlcmllc0RlZmluaXRpb25JbXBsLmNyZWF0ZSgpOworCQkJc2RZbG93ZXIuZ2V0U2VyaWVzUGFsZXR0ZSgpLnVwZGF0ZSgxKTsgLy8gU0VUIFRIRSBDT0xPUiBJTiBUSEUgUEFMRVRURQorCQkJeUF4aXNQcmltYXJ5LmdldFNlcmllc0RlZmluaXRpb25zKCkuYWRkKHNkWWxvd2VyKTsKKwkJCXNkWWxvd2VyLmdldFNlcmllcygpLmFkZChic0xvd2VyKTsKKwkJfQorCisKKwkJLy8gVHdvIFRIRSBPUlRIT0dPTkFMIFZBTFVFUyBTRVJJRVMgRm9yIHRoZSBZLUFYSVMgU0VSSUVTIERFRklOSVRJT04KKwkJU2VyaWVzRGVmaW5pdGlvbiBzZFkxID0gU2VyaWVzRGVmaW5pdGlvbkltcGwuY3JlYXRlKCk7CisJCXNkWTEuZ2V0U2VyaWVzUGFsZXR0ZSgpLnVwZGF0ZSgxKTsgLy8gU0VUIFRIRSBDT0xPUiBJTiBUSEUgUEFMRVRURQorCQl5QXhpc1ByaW1hcnkuZ2V0U2VyaWVzRGVmaW5pdGlvbnMoKS5hZGQoc2RZMSk7CisJCXNkWTEuZ2V0U2VyaWVzKCkuYWRkKGJzVmFsdWVzKTsKKworCQlpZiAoU0hPV19TVERfREVWKSB7CisJCQkvLyBUaHJlZSBUSEUgT1JUSE9HT05BTCBWQUxVRVMrU1REREVWIEhpZ2hlciBTRVJJRVMgRm9yIHRoZSBZLUFYSVMgU0VSSUVTIERFRklOSVRJT04KKwkJCVNlcmllc0RlZmluaXRpb24gc2RZSGlnaGVyID0gU2VyaWVzRGVmaW5pdGlvbkltcGwuY3JlYXRlKCk7CisJCQlzZFlIaWdoZXIuZ2V0U2VyaWVzUGFsZXR0ZSgpLnVwZGF0ZSgxKTsgLy8gU0VUIFRIRSBDT0xPUiBJTiBUSEUgUEFMRVRURQorCQkJeUF4aXNQcmltYXJ5LmdldFNlcmllc0RlZmluaXRpb25zKCkuYWRkKHNkWUhpZ2hlcik7CisJCQlzZFlIaWdoZXIuZ2V0U2VyaWVzKCkuYWRkKGJzSGlnaGVyKTsKKwkJfQorCisKKwkJcmV0dXJuIGN3YUJhcjsKKworCX0vLyBjcmVhdGVCYXJDaGFydAorCisJLyoqCisJICogcmVmcmVzaGVzIChzb21lIG9mKSB0aGUgZGF0YSBpbiB0aGUgYmFyIGNoYXJ0IGJ5IGtleSB2YWx1ZXMKKwkgKiBAcGFyYW0gYmFyRGF0YU1hcCBBbGwgcGFyYW1ldGVycworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoKE1hcDxTdHJpbmcsUGFyYW1ldGVyPiBiYXJEYXRhTWFwKSB7CisJCS8vSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gYmFyRGF0YU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworCQkvL3doaWxlKGl0ZXIuaGFzTmV4dCgpKSB7CisKKworCQlmb3IgKEVudHJ5PFN0cmluZyxQYXJhbWV0ZXI+IGVudHJ5IDogYmFyRGF0YU1hcC5lbnRyeVNldCgpKSB7CisJCQlpbnQgaWNvdW50ID0geEF4aXNQYXJhbWV0ZXJOYW1lcy5pbmRleE9mKGVudHJ5LmdldEtleSgpKTsKKwkJCWlmIChpY291bnQgPj0gMCkgeworCQkJCWRvdWJsZSB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCkudmFsdWU7CisJCQkJLy8gYW5kIHRoZSBoaWdoZXIvbG93ZXIgdmFsdWVzCisJCQkJZG91YmxlIGRldmlhdGlvbiA9IGVudHJ5LmdldFZhbHVlKCkuc3RkZGV2OworCQkJCURvdWJsZSBsb3dlciA9IG5ldyBEb3VibGUodmFsdWUtZGV2aWF0aW9uKTsKKwkJCQlEb3VibGUgaGlnaGVyID0gbmV3IERvdWJsZSh2YWx1ZSArIGRldmlhdGlvbik7CisKKwkJCQliYXJWYWx1ZXMuc2V0KGljb3VudCxuZXcgRG91YmxlKHZhbHVlKSk7CisJCQkJYmFyU3RkRGV2TG93ZXIuc2V0KGljb3VudCxsb3dlcik7CisJCQkJYmFyU3RkRGV2SGlnaGVyLnNldChpY291bnQsaGlnaGVyKTsKKwkJCX0KKworCQl9Ly8gd2hpbGUgaGF2ZSBrZXlzCisJfS8vIHJlZnJlc2gKKworCS8qKgorCSAqIFRoZSBtZXRob2Qgd2hpY2ggZ2V0cyB0aGUge0BsaW5rIEVzdGltYXRvckNhbnZhc30nIHJlcG9ydHMgbGlzdCwgYW5kCisJICogZHJhd3MgaXQgb24gdGhlIHtAbGluayBFc3RpbWF0b3JDYW52YXN9LgorCSAqIEBwYXJhbSBiYXJEYXRhTWFwIFBhcmFtZXRlciBtYXAKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBkcmF3KE1hcDxTdHJpbmcsUGFyYW1ldGVyPiBiYXJEYXRhTWFwKSB7CisJCWNtID0gRXN0aW1hdG9yQ2FudmFzLmNyZWF0ZUJhckNoYXJ0KGJhckRhdGFNYXApOworCQkvL3JlZnJlc2goYmFyRGF0YU1hcCk7CisKKwkJaWYgKCF0aGlzLmlzRGlzcG9zZWQoKSkgeworCQkJcmVkcmF3KCk7CisJCX0KKwl9IC8vIHBhaW50Q29udHJvbAorCisJLyoqCisJICogRGlzcG9zZXMgdGhlIENvbG9yIG9iamVjdHMKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisKK30gLy8gVGltZVNlcmllc0NhbnZhcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvRXN0aW1hdG9yQ29udHJvbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvRXN0aW1hdG9yQ29udHJvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNGZhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9Fc3RpbWF0b3JDb250cm9sLmphdmEKQEAgLTAsMCArMSwxMTAzIEBACisvLyBFc3RpbWF0b3JDb250cm9sLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5Db2xvckRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuaW1wbC5Db2xvckRlZmluaXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLmltcGwuUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLnV0aWwuQ1NWc2NlbmFyaW9Mb2FkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLkFnZ3JlZ2F0ZURhdGFXcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLk1vZGVsUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMuUGFyYW1ldGVyRXN0aW1hdG9yTWV0aG9kOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy5TY2VuYXJpb0FuYWx5c2lzU3VpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgU1dUIEdVSSBjb21wb25lbnQgdGhhdCB1c2VzIEJJUlQgdG8gcGxvdAorICovCitwdWJsaWMgY2xhc3MgRXN0aW1hdG9yQ29udHJvbCBleHRlbmRzIEFuYWx5c2lzQ29udHJvbCB7CisJCisJCisJCisJLyoqCisJICoga2VlcCB0aGUgcmVjZW50IGZvbGRlciBuYW1lCisJICovCisJU3RyaW5nIHJlY2VudEZvbGRlcjsKKwkKKwkvKioKKwkgKiB1c2VkIHRvIGlkZW50aWZ5IHVzZXIgcHJlZmVyZW5jZXMgZm9yIHRoaXMgY2xhc3MKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1VNRVIgPSAiRVNUSU1BVE9SX0NPTlRST0wiOworCisJCisJLyoqCisJICogIExhYmVsIGZvciBjdXJyZW50IHNjZW5hcmlvIGZvbGRlcgorCSAqLworCXN0YXRpYyBMYWJlbCBzY2VuYXJpb0ZvbGRlckxhYmVsOworCQorCS8qKgorCSAqICBMYWJlbCBmb3IgY3VycmVudCBwYXJhbWV0ZXIgZXN0aW1hdG9yCisJICovCisJCisJc3RhdGljIExhYmVsIGVzdGltYXRvckZvbGRlckxhYmVsOworCS8qKgorCSAqIElucHV0IHRleHQgZmllbGQgZm9yIHRoZSBzY2VuYXJpbyBmb2xkZXIgb2YgZGF0YSB0byB1c2UgaW4gbWFraW5nIHRoZSBlc3RpbWF0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBUZXh0IHRleHQxOworCQorCS8qKgorCSAqIFRleHQgZGlzcGxheWluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBhcmFtZXRlciBlc3RpbWF0b3IKKwkgKi8KKwkKKwlwdWJsaWMgc3RhdGljIFRleHQgZXN0aW1hdG9yVGV4dDsKKwkKKwkvKioKKwkgKiBBIGxhYmVsIHRvIHJlcG9ydCBzdGF0dXMgKG5vdCB5ZXQgdXNlZCkKKwkgKi8KKwlzdGF0aWMgTGFiZWwgc3RhdHVzTGFiZWw7CisJCisJLyoqCisJICogUmFkaW8gYnV0dG9ucyBmb3IgZml0IHRoZW4gYXZlcmFnZSBvciBzdW0gb3ZlciBsb2NhdGlvbiB0aGVuCisJICovCisJcHVibGljIHN0YXRpYyBCdXR0b25bXSBkYXRhQXZlcmFnZVJhZGlvQnV0dG9ucyA9IG5ldyBCdXR0b25bMl07CisJCQorCS8qKgorCSAqIFJhZGlvIGJ1dHRvbnMgZm9yIGZyZXF1ZW5jeSB2cyBkZW5zaXR5IGRlcGVuZGVudCBiZXRhCisJICovCisJcHVibGljIHN0YXRpYyBCdXR0b25bXSBiZXRhTW9kZVJhZGlvQnV0dG9ucyA9IG5ldyBCdXR0b25bMl07CisJCisJLyoqCisJICogdGhyZWUgZGVjaW1hbCBwbGFjZXMKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1BJTk5FUl9SRVNPTFVUSU9OID0gMTAwMDsKKwkKKwkvKioKKwkgKiAwLjAwMQorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTUElOTkVSX0lOQ1JFTUVOVCA9IDE7CisJCisJCisJLyoqIG1pbiBTIHRocmVzaG9sZCBmb3IgYW5hbHlzaXMgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFNwaW5uZXIgbWluVGhyZXNob2xkU3Bpbm5lclM7CisJLyoqIG1heCBTIHRocmVzaG9sZCBmb3IgYW5hbHlzaXMgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFNwaW5uZXIgbWF4VGhyZXNob2xkU3Bpbm5lclM7CisJLyoqIFMgc3Bpbm5lciBsYWJlbCAqLworCXN0YXRpYyBMYWJlbCBtaW5TcGlubmVyTGFiZWxTOworCS8qKiBTIHNwaW5uZXIgbGFiZWwgKi8KKwlzdGF0aWMgTGFiZWwgbWF4U3Bpbm5lckxhYmVsUzsKKwkKKwkvKioKKwkgKiBrZXlzIGZvciBmaW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVycyBmcm9tIHRoZSBtYXAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fU19LRVkgPSAiTUlOUyI7CisJLyoqCisJICoga2V5cyBmb3IgZmluZGluZyBjb250cm9sIHBhcmFtZXRlcnMgZnJvbSB0aGUgbWFwCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX0VfS0VZID0gIk1JTkUiOworCS8qKgorCSAqIGtleXMgZm9yIGZpbmRpbmcgY29udHJvbCBwYXJhbWV0ZXJzIGZyb20gdGhlIG1hcAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTl9JX0tFWSA9ICJNSU5JIjsKKwkvKioKKwkgKiBrZXlzIGZvciBmaW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVycyBmcm9tIHRoZSBtYXAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fUl9LRVkgPSAiTUlOUiI7CisJLyoqCisJICoga2V5cyBmb3IgZmluZGluZyBjb250cm9sIHBhcmFtZXRlcnMgZnJvbSB0aGUgbWFwCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX1NfS0VZID0gIk1BWFMiOworCS8qKgorCSAqIGtleXMgZm9yIGZpbmRpbmcgY29udHJvbCBwYXJhbWV0ZXJzIGZyb20gdGhlIG1hcAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9FX0tFWSA9ICJNQVhFIjsKKwkvKioKKwkgKiBrZXlzIGZvciBmaW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVycyBmcm9tIHRoZSBtYXAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfSV9LRVkgPSAiTUFYSSI7CisJLyoqCisJICoga2V5cyBmb3IgZmluZGluZyBjb250cm9sIHBhcmFtZXRlcnMgZnJvbSB0aGUgbWFwCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX1JfS0VZID0gIk1BWFIiOworCS8qKgorCSAqIGtleXMgZm9yIGZpbmRpbmcgY29udHJvbCBwYXJhbWV0ZXJzIGZyb20gdGhlIG1hcAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVTV9MT0NBVElPTlNfS0VZID0gIlNVTV9MT0NBVElPTlMiOworCS8qKgorCSAqIGtleXMgZm9yIGZpbmRpbmcgY29udHJvbCBwYXJhbWV0ZXJzIGZyb20gdGhlIG1hcAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSRVFfTU9ERV9LRVkgPSAiRlJFUV9NT0RFIjsKKwkKKwkvKiogUmVnaW9uIFNlbGVjdG9yIENvbWJvIGJveCAqKi8KKwlwcm90ZWN0ZWQgc3RhdGljIENvbWJvIGRpc3BsYXlSZWdpb25Db21ibzsKKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyByZWdpb25Ub0Rpc3BsYXkgPSAiIjsKKwkKKwkvKiogbWluIEUgdGhyZXNob2xkIGZvciBhbmFseXNpcyAqLworCXByb3RlY3RlZCBzdGF0aWMgU3Bpbm5lciBtaW5UaHJlc2hvbGRTcGlubmVyRTsKKwkvKiogbWF4IEUgdGhyZXNob2xkIGZvciBhbmFseXNpcyAqLworCXByb3RlY3RlZCBzdGF0aWMgU3Bpbm5lciBtYXhUaHJlc2hvbGRTcGlubmVyRTsKKwkvKiogRSBzcGlubmVyIGxhYmVsICovCisJc3RhdGljIExhYmVsIG1pblNwaW5uZXJMYWJlbEU7CisJLyoqIEUgc3Bpbm5lciBsYWJlbCAqLworCXN0YXRpYyBMYWJlbCBtYXhTcGlubmVyTGFiZWxFOworCQorCS8qKiBtaW4gSSB0aHJlc2hvbGQgZm9yIGFuYWx5c2lzICovCisJcHJvdGVjdGVkIHN0YXRpYyBTcGlubmVyIG1pblRocmVzaG9sZFNwaW5uZXJJOworCS8qKiBtYXggSSB0aHJlc2hvbGQgZm9yIGFuYWx5c2lzICovCisJcHJvdGVjdGVkIHN0YXRpYyBTcGlubmVyIG1heFRocmVzaG9sZFNwaW5uZXJJOworCS8qKiBJIHNwaW5uZXIgbGFiZWwgKi8KKwlzdGF0aWMgTGFiZWwgbWluU3Bpbm5lckxhYmVsSTsKKwkvKiogKCBzcGlubmVyIGxhYmVsICovCisJc3RhdGljIExhYmVsIG1heFNwaW5uZXJMYWJlbEk7CisJCisJLyoqIG1pbiBSIHRocmVzaG9sZCBmb3IgYW5hbHlzaXMgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFNwaW5uZXIgbWluVGhyZXNob2xkU3Bpbm5lclI7CisJLyoqIG1heCBSIHRocmVzaG9sZCBmb3IgYW5hbHlzaXMgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFNwaW5uZXIgbWF4VGhyZXNob2xkU3Bpbm5lclI7CQorCS8qKiBSIHNwaW5uZXIgbGFiZWwgKi8KKwlzdGF0aWMgTGFiZWwgbWluU3Bpbm5lckxhYmVsUjsKKwkvKiogUiBzcGlubmVyIGxhYmVsICovCisJc3RhdGljIExhYmVsIG1heFNwaW5uZXJMYWJlbFI7CisJCisJCisJCisJLyoqCisJICogVGhlIHJlc3VsdHMgYW5kIGRhdGEgdGhhdCBnbyBpbnRvIG1ha2luZyBhbiBlc3RpbWF0ZQorCSAqLworCXN0YXRpYyBNb2RlbFBhcmFtZXRlcnMgYXZlcmFnZVBhcm1zOworCQorCisJLyoqCisJICogRm9sZGVyIHRvIGNvbnRhaW4gdGhlIGFuYWx5c2lzIGdyYXBocworCSAqIAorCSAqLworCXN0YXRpYyBUYWJGb2xkZXIgdGFiRm9sZGVyOworCisJLyoqCisJICogdGhlIGNoYXJ0IG9mIHJlc3VsdHMKKwkgKi8KKwlzdGF0aWMgRXN0aW1hdG9yQ2FudmFzIGVzdGltYXRvckNhbnZhczsKKwkKKwkvKioKKwkgKiBDb2xvcnMgZm9yIHRoZSB0aW1lIHNlcmllcyBjaGFydAorCSAqLworCXN0YXRpYyBmaW5hbCBDb2xvckRlZmluaXRpb24gZm9yZUdyb3VuZCA9IENvbG9yRGVmaW5pdGlvbkltcGwuY3JlYXRlKDE4MCwgMCwgMCk7CisJc3RhdGljIGZpbmFsIENvbG9yRGVmaW5pdGlvbiBiYWNrZ3JvdW5kR3JvdW5kID0gQ29sb3JEZWZpbml0aW9uSW1wbC5jcmVhdGUoMjU1LCAyNTUsIDIyNSk7CisJc3RhdGljIGZpbmFsIENvbG9yRGVmaW5pdGlvbiBmcmFtZUNvbG9yID0gQ29sb3JEZWZpbml0aW9uSW1wbC5XSElURSgpOworCQorCS8qKgorCSAqIEZvciBub3cgd2Ugd2lsbCBhbHdheXMgc2V0IHVwIGZvciBmb3VyIG9mIHRoZXNlCisJICogd2Ugd2lsbCB1c2UgMi00IGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBtb2RlbCAoU0ksU0lSLCBTRUlSLCBldGMpLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgVGltZVNlcmllc0NhbnZhc1tdIGVxdWF0aW9uU2VyaWVzID0gbmV3IFRpbWVTZXJpZXNDYW52YXNbNF07CisJCisJLyoqCisJICogRm9yIG5vdyB3ZSB3aWxsIGFsd2F5cyBzZXQgdXAgZm9yIGZvdXIgb2YgdGhlc2UKKwkgKiB3ZSB3aWxsIHVzZSAyLTQgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIG1vZGVsIChTSSxTSVIsIFNFSVIsIGV0YykuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBYWVNlcmllc0NhbnZhc1tdIHJlZ3Jlc3Npb25TZXJpZXMgPSBuZXcgWFlTZXJpZXNDYW52YXNbNF07CisJCisJLyoqCisJICogV2l6YXJkIGZvciBzZWxlY3RpbmcgYSBuZXcgcGFyYW1ldGVyIGVzdGltYXRvcgorCSAqLworCQorCXN0YXRpYyBQYXJhbWV0ZXJFc3RpbWF0b3JXaXphcmQgcGFyYW1ldGVyRXN0aW1hdG9yV2l6YXJkOworCQorCS8qKgorCSAqIFRoZSBkaWFsb2cgZm9yIHRoZSB3aXphcmQKKwkgKi8KKwlzdGF0aWMgV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZzsJCisJcHJvdGVjdGVkIHN0YXRpYyBTY2VuYXJpb0FuYWx5c2lzU3VpdGUgYW5hbHl6ZXI7CisJCisJLy9Qcm9wZXJ0eVNlbGVjdG9yIHByb3BlcnR5U2VsZWN0b3I7CisJLy9MaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHNlbGVjdGVkUHJvcGVydGllczsKKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKi8KKwlwdWJsaWMgRXN0aW1hdG9yQ29udHJvbChmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgU1dULk5vbmUpOworCQljcmVhdGVDb250ZW50cygpOworCX0gLy8gRXN0aW1hdG9yQ29udHJvbAorCisJLyoqCisJICogQ3JlYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgcGxvdHRlcgorCSAqLworCXZvaWQgY3JlYXRlQ29udGVudHMoKSB7CisJCQorCQlhbmFseXplciA9IG5ldyBTY2VuYXJpb0FuYWx5c2lzU3VpdGUodGhpcyk7CisJCQorCQlzZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7CisKKwkJaWRlbnRpZmlhYmxlVGl0bGUgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOworCQlpZGVudGlmaWFibGVUaXRsZS5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiRVNULlRJVExFIikpOworCQkvL3Byb3BlcnR5U2VsZWN0b3IgPSBuZXcgUHJvcGVydHlTZWxlY3Rvcih0aGlzLCBTV1QuTk9ORSk7CisJCURpc3BsYXkgZGlzcGxheSA9IHRoaXMuZ2V0RGlzcGxheSgpOworCQkKKwkJQ29sb3IgbGFiZWxCYWNrZ3JvdW5kID0gbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMTgwLCAxODAsIDIwMCkpOworCQkKKwkJc3RhdHVzTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULkJPUkRFUik7CisJCXN0YXR1c0xhYmVsLnNldEJhY2tncm91bmQobGFiZWxCYWNrZ3JvdW5kKTsKKwkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiIik7CisJCQorCQlzY2VuYXJpb0ZvbGRlckxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5CT1JERVIpOworCQlzY2VuYXJpb0ZvbGRlckxhYmVsLnNldEJhY2tncm91bmQobGFiZWxCYWNrZ3JvdW5kKTsKKwkJc2NlbmFyaW9Gb2xkZXJMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiRVNULlNDRk9MREVSIikpOworCQkKKwkJZXN0aW1hdG9yRm9sZGVyTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULkJPUkRFUik7CisJCWVzdGltYXRvckZvbGRlckxhYmVsLnNldEJhY2tncm91bmQobGFiZWxCYWNrZ3JvdW5kKTsKKwkJZXN0aW1hdG9yRm9sZGVyTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5QQVJBTUVTVElNQVRPUiIpKTsKKwkJCisJCXRleHQxID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7CisJICAgIHRleHQxLnNldEJvdW5kcygxMCwgMTAsIDEwMCwgMjApOworCSAgICAKKwkgICAgcmVjZW50Rm9sZGVyID0gcHJlZnMuZ2V0UmVjZW50Rm9sZGVyKENPTlNVTUVSKTsKKwkgICAgaWYocmVjZW50Rm9sZGVyPT0gbnVsbCkgeworCSAgICAJcmVjZW50Rm9sZGVyID0gU2NlbmFyaW9BbmFseXNpc1N1aXRlLlJFRkVSRU5DRV9URVNUSU5HX0RJUkVDVE9SWTsKKwkgICAgfQorCSAgICB0ZXh0MS5zZXRUZXh0KHJlY2VudEZvbGRlcik7CisJCSAgCisJICAgIFN0cmluZyBlc3RpbWF0b3JNZXRob2QgPSBwcmVmcy5nZXRSZWNlbnRFc3RpbWF0b3JNZXRob2QoKTsKKwkgICAgZXN0aW1hdG9yVGV4dCA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOworCSAgICBlc3RpbWF0b3JUZXh0LnNldEJvdW5kcygxMCwgMTAsIDEwMCwgMjApOworCSAgICBpZihlc3RpbWF0b3JNZXRob2QgIT0gbnVsbCkgZXN0aW1hdG9yVGV4dC5zZXRUZXh0KGVzdGltYXRvck1ldGhvZCk7CisJICAgIGVsc2UgZXN0aW1hdG9yVGV4dC5zZXRUZXh0KCIiKTsKKwkgICAgCisJICAgIHNlbGVjdEVzdGltYXRvckJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcywgU1dULk5PTkUpOworCSAgICBzZWxlY3RFc3RpbWF0b3JCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5TRUxFQ1RFU1RJTUFUT1IiKSk7CisJICAgIAorCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkgICAgLy8KKwkgICAgLy8gIGNvbXBvbmVudHMgZm9yIHVzZXIgaW50ZXJhY3Rpb24gd2l0aCBmaXR0aW5nIGFsZ29yaXRobQorCSAgICAvLworCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCSAgICBDb21wb3NpdGUgZGlzcGxheUNvbXBvc2l0ZSA9IGdldFJlZ2lvblNlbGVjdG9yQ29tYm9Db21wb3NpdGUodGhpcyk7CisJICAgIENvbXBvc2l0ZSByYWRpb0NvbXBvc2l0ZSA9IGdldERhdGFBdmdSYWRpb0J1dHRvbnNDb21wb3NpdGUodGhpcyk7CisJICAgIENvbXBvc2l0ZSBzcGlubmVyQ29tcG9zaXRlID0gZ2V0U3Bpbm5lckNvbXBvc2l0ZSh0aGlzKTsKKwkgICAgQ29tcG9zaXRlIGJldGFNb2RlQ29tcG9zaXRlID0gZ2V0YmV0YU1vZGVSYWRpb0J1dHRvbnNDb21wb3NpdGUodGhpcyk7CisJICAgIENvbXBvc2l0ZSBkb0VzdGltYXRpb25Db21wb3NpdGUgPSBnZXRBbmFseXplQnV0dG9uQ29tcG9zaXRlKHRoaXMsTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuRVNUSU1BVEUiKSk7CisJCQorCQkKKwkJdGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlciAodGhpcywgU1dULk5PTkUpOworCQkvLyByZXN1bHRzCQorCQlUYWJJdGVtIGl0ZW0wID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCBTV1QuQk9SREVSKTsKKwkJaXRlbTAuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5SRVNVTFRTIikpOworCQllc3RpbWF0b3JDYW52YXMgPSBuZXcgRXN0aW1hdG9yQ2FudmFzKHRhYkZvbGRlcik7CisJCWl0ZW0wLnNldENvbnRyb2woZXN0aW1hdG9yQ2FudmFzKTsKKwkJCisJCS8vIGRhdGEKKwkJVGFiSXRlbSBpdGVtMSA9IG5ldyBUYWJJdGVtICh0YWJGb2xkZXIsIFNXVC5OVUxMKTsKKwkJaXRlbTEuc2V0VGV4dCAoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuSU5QVVREQVRBIikpOworCQlDb21wb3NpdGUgZGF0YUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyLCBTV1QuQk9SREVSKTsKKyAgICAJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKKyAJCWRhdGFDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOworIAkJaXRlbTEuc2V0Q29udHJvbChkYXRhQ29tcG9zaXRlKTsKKyAJCS8vIHNldCB1cCB0aGUgZm91ciBkYXRhIHRpbWUgc2VyaWVzIGluc2lkZSB0aGUgZGF0YUNvbXBvc2l0ZQorIAkJZ2V0RXF1YXRpb25TZXJpZXNDaGFydHMoZGF0YUNvbXBvc2l0ZSk7IAorIAkJCisJCS8vIHJlZ3Jlc3Npb24gQ2hhcnRzIGdvICoqKiBoZXJlICoqKgorCQlUYWJJdGVtIGl0ZW0yID0gbmV3IFRhYkl0ZW0gKHRhYkZvbGRlciwgU1dULk5VTEwpOworCQlpdGVtMi5zZXRUZXh0IChNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5SRUdSRVNTSU9OIikpOworCQlDb21wb3NpdGUgcmVncmVzc2lvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyLCBTV1QuQk9SREVSKTsKKyAgICAJcmVncmVzc2lvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7CisgCQlpdGVtMi5zZXRDb250cm9sKHJlZ3Jlc3Npb25Db21wb3NpdGUpOworIAkgICAgLy8gc2V0IHVwIHRoZSBmb3VyIHJlZ3Jlc3Npb24gWFkgc2VyaWVzIHBsb3RzIGluc2lkZSB0aGUgZGF0YUNvbXBvc2l0ZQorIAkJZ2V0UmVncmVzc2lvblNlcmllc0NoYXJ0cyhyZWdyZXNzaW9uQ29tcG9zaXRlKTsgCisJCQorCQkKKwkJLy8gRk9ybSBkYXRhCisJCWludCBib3R0b20gPSA1OworCQlmaW5hbCBGb3JtRGF0YSB0aXRsZUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCWlkZW50aWZpYWJsZVRpdGxlLnNldExheW91dERhdGEodGl0bGVGb3JtRGF0YSk7CisJCXRpdGxlRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQl0aXRsZUZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQl0aXRsZUZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXRpdGxlRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKworCQkvLyBUZXh0RmllbGQgZm9sZGVyIGxhYmVsCisJCWJvdHRvbSArPSA1OworCQlmaW5hbCBGb3JtRGF0YSBzY2VuYXJpb0ZvbGRlckxhYmVsRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJc2NlbmFyaW9Gb2xkZXJMYWJlbEZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChpZGVudGlmaWFibGVUaXRsZSwgMCk7CisJCXNjZW5hcmlvRm9sZGVyTGFiZWxGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tLCAwKTsKKwkJc2NlbmFyaW9Gb2xkZXJMYWJlbEZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXNjZW5hcmlvRm9sZGVyTGFiZWxGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxNSwgMCk7CisJCXNjZW5hcmlvRm9sZGVyTGFiZWwuc2V0TGF5b3V0RGF0YShzY2VuYXJpb0ZvbGRlckxhYmVsRm9ybURhdGEpOworCQkKKwkJCisJCS8vIGZpcnN0IHRleHQgZmllbGQgZm9yIHBhcmFtZXRlciBFc3RpbWF0b3IKKwkJZmluYWwgRm9ybURhdGEgdGV4dDFGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQl0ZXh0MUZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChpZGVudGlmaWFibGVUaXRsZSwgMCk7CisJCXRleHQxRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGJvdHRvbSwgMCk7CisJCXRleHQxRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChzY2VuYXJpb0ZvbGRlckxhYmVsLCAwKTsKKwkJdGV4dDFGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCg4MCwgMCk7CisJCXRleHQxLnNldExheW91dERhdGEodGV4dDFGb3JtRGF0YSk7CisJCXRleHQxLnNldEVkaXRhYmxlKGZhbHNlKTsgLy8gQ2FuIG9ubHkgYmUgc2VsZWN0ZWQgdGhyb3VnaCB3aXphcmQKKwkJCQorCQlmaW5hbCBGb3JtRGF0YSBzZWxlY3RFc3RpbWF0b3JCdXR0b25Gb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwkJCisJCXNlbGVjdEVzdGltYXRvckJ1dHRvbkZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChpZGVudGlmaWFibGVUaXRsZSwgMCk7CisJCXNlbGVjdEVzdGltYXRvckJ1dHRvbkZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQlzZWxlY3RFc3RpbWF0b3JCdXR0b25Gb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHRleHQxLCAwKTsKKwkJc2VsZWN0RXN0aW1hdG9yQnV0dG9uRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJc2VsZWN0RXN0aW1hdG9yQnV0dG9uLnNldExheW91dERhdGEoc2VsZWN0RXN0aW1hdG9yQnV0dG9uRm9ybURhdGEpOworCisJCWJvdHRvbSArPSA1OworCQlmaW5hbCBGb3JtRGF0YSBlc3RpbWF0b3JMYWJlbEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCWVzdGltYXRvckxhYmVsRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHNjZW5hcmlvRm9sZGVyTGFiZWwsIDApOworCQllc3RpbWF0b3JMYWJlbEZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQllc3RpbWF0b3JMYWJlbEZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWVzdGltYXRvckxhYmVsRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTUsIDApOworCQllc3RpbWF0b3JGb2xkZXJMYWJlbC5zZXRMYXlvdXREYXRhKGVzdGltYXRvckxhYmVsRm9ybURhdGEpOworCQkKKwkJCisJCS8vIGZpcnN0IHRleHQgZmllbGQgZm9yIHBhcmFtZXRlciBFc3RpbWF0b3IKKwkJZmluYWwgRm9ybURhdGEgZXN0aW1hdG9yVGV4dEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCWVzdGltYXRvclRleHRGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2NlbmFyaW9Gb2xkZXJMYWJlbCwgMCk7CisJCWVzdGltYXRvclRleHRGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tLCAwKTsKKwkJZXN0aW1hdG9yVGV4dEZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2NlbmFyaW9Gb2xkZXJMYWJlbCwgMCk7CisJCWVzdGltYXRvclRleHRGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQllc3RpbWF0b3JUZXh0LnNldExheW91dERhdGEoZXN0aW1hdG9yVGV4dEZvcm1EYXRhKTsKKwkJZXN0aW1hdG9yVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7IC8vIENhbiBvbmx5IGJlIHNlbGVjdGVkIHRocm91Z2ggd2l6YXJkCisJCQorCQlpbnQgdG9wID0gYm90dG9tOworCQlib3R0b20gKz0gMTA7CisJCQorCQkvLyBEaXNwbGF5IHJlZ2lvblNlbGVjdG9yQ29tYm8KKwkJZmluYWwgRm9ybURhdGEgZGlzcGxheUNvbWJvQ29tcG9zaXRlRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJZGlzcGxheUNvbWJvQ29tcG9zaXRlRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGVzdGltYXRvclRleHQsIDApOworCQlkaXNwbGF5Q29tYm9Db21wb3NpdGVGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tLCAwKTsKKwkJZGlzcGxheUNvbWJvQ29tcG9zaXRlRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCg1LDApOworCQlkaXNwbGF5Q29tYm9Db21wb3NpdGVGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgyNCwgMCk7CisJCWRpc3BsYXlDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkaXNwbGF5Q29tYm9Db21wb3NpdGVGb3JtRGF0YSk7CisJCQorCQkKKwkJLy8gYmV0YSBtb2RlIENvbXBvc2l0ZQorCQlmaW5hbCBGb3JtRGF0YSBiZXRhTW9kZVJhZGlvQ29tcG9zaXRlRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJYmV0YU1vZGVSYWRpb0NvbXBvc2l0ZUZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChlc3RpbWF0b3JUZXh0LCAwKTsKKwkJYmV0YU1vZGVSYWRpb0NvbXBvc2l0ZUZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQliZXRhTW9kZVJhZGlvQ29tcG9zaXRlRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgyNSwwKTsKKwkJYmV0YU1vZGVSYWRpb0NvbXBvc2l0ZUZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDM5LCAwKTsKKwkJYmV0YU1vZGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShiZXRhTW9kZVJhZGlvQ29tcG9zaXRlRm9ybURhdGEpOworCQkKKwkJLy8gcmFkaW8gYnV0dG9ucyBDb21wb3NpdGUKKwkJZmluYWwgRm9ybURhdGEgcmFkaW9Db21wb3NpdGVGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlyYWRpb0NvbXBvc2l0ZUZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChlc3RpbWF0b3JUZXh0LCAwKTsKKwkJcmFkaW9Db21wb3NpdGVGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tLCAwKTsKKwkJcmFkaW9Db21wb3NpdGVGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDQwLCAwKTsKKwkJcmFkaW9Db21wb3NpdGVGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCg2MSwwKTsKKwkJcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShyYWRpb0NvbXBvc2l0ZUZvcm1EYXRhKTsKKwkJCisJCS8vIFNwaW5uZXIgQ29tcG9zaXRlIAorCQlmaW5hbCBGb3JtRGF0YSBzcGlubmVyRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJc3Bpbm5lckZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0b3AsIDApOworCQlzcGlubmVyRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGJvdHRvbSwgMCk7CisJCXNwaW5uZXJGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDYyLCAwKTsKKwkJc3Bpbm5lckZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCXNwaW5uZXJDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShzcGlubmVyRm9ybURhdGEpOworCQkKKwkJLy90b3AgPSBib3R0b207CisJCQorCQkKKwkJLy8gQW5hbHl6ZSBidXR0b24KKwkJYm90dG9tICs9IDU7CisJCWZpbmFsIEZvcm1EYXRhIGFuYWx5c2lzQnV0dG9uRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJYW5hbHlzaXNCdXR0b25Gb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocmFkaW9Db21wb3NpdGUsIDApOworCQlhbmFseXNpc0J1dHRvbkZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQlhbmFseXNpc0J1dHRvbkZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWFuYWx5c2lzQnV0dG9uRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJZG9Fc3RpbWF0aW9uQ29tcG9zaXRlLnNldExheW91dERhdGEoYW5hbHlzaXNCdXR0b25Gb3JtRGF0YSk7CisJCWlmKHJlY2VudEZvbGRlciAhPSBudWxsICYmIGVzdGltYXRvck1ldGhvZCAhPSBudWxsKQorCQkJYW5hbHl6ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCQllbHNlIGFuYWx5emVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJCQorCQkvLyBSZXN1bHRzIEdyYXBoCisJCWJvdHRvbSArPSA0MDsKKwkJCisJCWZpbmFsIEZvcm1EYXRhIHRhYkZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCXRhYkZvbGRlci5zZXRMYXlvdXREYXRhKHRhYkZvcm1EYXRhKTsKKwkJdGFiRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGRvRXN0aW1hdGlvbkNvbXBvc2l0ZSwgMCk7CisJCXRhYkZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQl0YWJGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQl0YWJGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQkKKwkJZmluYWwgU2hlbGwgc2hlbGwgPSB0aGlzLmdldFNoZWxsKCk7CisJCWZpbmFsIEVzdGltYXRvckNvbnRyb2wgZUNvbnRyb2wgPSB0aGlzOworCQlzZWxlY3RFc3RpbWF0b3JCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJCQkJZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCVN0cmluZyBkaXIgPSBudWxsOworCQkJCWlmKHBhcmFtZXRlckVzdGltYXRvcldpemFyZCAhPSBudWxsKQorCQkJCQlkaXIgPSBwYXJhbWV0ZXJFc3RpbWF0b3JXaXphcmQuc2VsZWN0Rm9sZGVyUGFnZS5nZXREaXJOYW1lKCk7CisJCQkJZWxzZSBkaXIgPSByZWNlbnRGb2xkZXI7CisJCQkJCisJCQkJaWYoKGRpcj09bnVsbCl8fChkaXIubGVuZ3RoKCk8MSkpIGRpciA9IFJPT1RfUEFUSDsKKwkJCQkKKwkJCQlwYXJhbWV0ZXJFc3RpbWF0b3JXaXphcmQgPSBuZXcgUGFyYW1ldGVyRXN0aW1hdG9yV2l6YXJkKGVDb250cm9sLCBkaXIpOworCQkJCQorCQkJCS8vcGFyYW1ldGVyRXN0aW1hdG9yV2l6YXJkLmluaXQoc2VsZWN0RXN0aW1hdG9yQnV0dG9uLik7CisJCQkgICAgLy90aGlzLgorCQkJCS8vIEluc3RhbnRpYXRlcyB0aGUgd2l6YXJkIGNvbnRhaW5lciB3aXRoIHRoZSB3aXphcmQgYW5kIG9wZW5zIGl0CisJCQkJd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgcGFyYW1ldGVyRXN0aW1hdG9yV2l6YXJkKTsKKwkJCQl3aXphcmREaWFsb2cuY3JlYXRlKCk7CisJCQkJZUNvbnRyb2wuYW5hbHl6ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQlFc3RpbWF0b3JDb250cm9sLmVzdGltYXRvclRleHQuc2V0VGV4dCgiIik7CisJCQkgICAgd2l6YXJkRGlhbG9nLm9wZW4oKTsJCQkJCisJCQl9CisJCX0pOworCQlmaW5hbCBQcm9ncmVzc01vbml0b3JEaWFsb2cgcHJvZ3Jlc3NEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSk7CisJCQorCQlhbmFseXplQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJCWZpbmFsIFNlbGVjdGlvbkV2ZW50IGUpIHsKKworCQkJCXJlY2VudEZvbGRlciA9IHRleHQxLmdldFRleHQoKTsKKwkJCQlTdHJpbmcgbWV0aG9kdHh0ID0gZXN0aW1hdG9yVGV4dC5nZXRUZXh0KCk7CisJCQkJaWRlbnRpZmlhYmxlVGl0bGUuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5USVRMRSIpKTsKKwkJCQkKKwkJCQkvKgorCQkJCSAqIFZBTElEQVRFIHRoZSB0ZXh0IGlucHV0IEZpZWxkcworCQkJCSAqLworCQkJCWlmKCFhbmFseXplci52YWxpZGF0ZShyZWNlbnRGb2xkZXIpKSB7CisJCQkJCWlkZW50aWZpYWJsZVRpdGxlLnNldFRleHQoU2NlbmFyaW9BbmFseXNpc1N1aXRlLk5PVF9GT1VORF9NU0cpOworCQkJCQl0ZXh0MS5zZXRUZXh0KCIiKTsKKwkJCQkJcmV0dXJuOworCQkJCX0gCisJCQkJLy8gZWxzZSB2YWxpZCBzbyByZW1lbWJlciB0aGUgcHJlZmVyZW5jZXMKKwkJCQlwcmVmcy5zZXRSZWNlbnRGb2xkZXIoQ09OU1VNRVIscmVjZW50Rm9sZGVyKTsKKwkJCQlwcmVmcy5zZXRFc3RpbWF0b3JNZXRob2QobWV0aG9kdHh0KTsKKwkJCQkKKwkJCQlSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXBJbXBsIGRhdGFNYXA7CisJCQkJUGFyYW1ldGVyRXN0aW1hdG9yTWV0aG9kIG1ldGhvZDsKKwkJCQorCQkJCWlmKHBhcmFtZXRlckVzdGltYXRvcldpemFyZCAhPSBudWxsKSB7CisJCQkJCWRhdGFNYXAgPSBwYXJhbWV0ZXJFc3RpbWF0b3JXaXphcmQuZ2V0UmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwKCk7CisJCQkJCW1ldGhvZCA9IHBhcmFtZXRlckVzdGltYXRvcldpemFyZC5nZXRQYXJhbWV0ZXJFc3RpbWF0b3JNZXRob2QoKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBXZSBoYXZlbid0IGdvbmUgdGhyb3VnaCB0aGUgd2l6YXJkIGFuZCBsb2FkZWQgZGF0YSB5ZXQsIGJ1dAorCQkJCQkvLyBhc3N1bWluZyB0aGUgZm9sZGVyIGFuZCB0aGUgbWV0aG9kIGlzIHNldCB3ZSBjYW4gbG9hZCB0aGUgZGF0YSBoZXJlCisJCQkJCXRyeSB7CisJCQkJCQlDU1ZzY2VuYXJpb0xvYWRlciBsb2FkZXIgPSBuZXcgQ1NWc2NlbmFyaW9Mb2FkZXIocmVjZW50Rm9sZGVyKTsKKwkJCQkJCS8vIFBpY2sgdGhlIGhpZ2hlc3QgcmVzb2x1dGlvbiBhdmFpbGFibGUKKwkJCQkJCWludCBtYXhSZXNvbHV0aW9uID0gbG9hZGVyLmdldE1heFJlc29sdXRpb24oKTsKKwkJCQkJCWRhdGFNYXAgPSBsb2FkZXIucGFyc2VBbGxGaWxlcyhtYXhSZXNvbHV0aW9uKTsKKwkJCQkJCW1ldGhvZCA9IFBhcmFtZXRlckVzdGltYXRvck1ldGhvZC52YWx1ZU9mKG1ldGhvZHR4dCk7CisJCQkJCX0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisJCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoZXguZ2V0TWVzc2FnZSgpLCBleCk7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJLy9TdHJpbmcgY29tcGFyaXNvbkRpcmVjdG9yeSA9IFNjZW5hcmlvQW5hbHlzaXNTdWl0ZS5DT01QQVJJU09OX1RFU1RJTkdfRElSRUNUT1JZOworCQkJCWF2ZXJhZ2VQYXJtcyA9IGFuYWx5emVyLmVzdGltYXRlUGFyYW1ldGVycygKKwkJCQkJCWRhdGFNYXAsCisJCQkJCQltZXRob2QsIAorCQkJCQkJcHJvZ3Jlc3NEaWFsb2cKKwkJCQkJCSk7CisJCQkJCisJCQkJU3RyaW5nW10gZGlzcGxheWFibGVSZWdpb25zID0gYXZlcmFnZVBhcm1zLmdldERhdGFMb2NhdGlvbnMoKTsKKwkJCQkKKwkJCQlkaXNwbGF5UmVnaW9uQ29tYm8uc2V0SXRlbXMgKGRpc3BsYXlhYmxlUmVnaW9ucyk7CisJCQkJZGlzcGxheVJlZ2lvbkNvbWJvLnNlbGVjdCgwKTsKKwkJCQlyZWdpb25Ub0Rpc3BsYXkgPSBkaXNwbGF5YWJsZVJlZ2lvbnNbMF07CisJCQkJCQkKKwkJCQkKKwkJCQorCQkJCXVwZGF0ZUNoYXJ0cygpOworCQkJCisJCQl9CisJCX0pOworCQkKKwkJCisJCW1heFRocmVzaG9sZFNwaW5uZXJTLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkgICAgICAgIGludCBtYXggPSBtYXhUaHJlc2hvbGRTcGlubmVyUy5nZXRTZWxlY3Rpb24oKTsKKwkJICAgICAgICBpbnQgbWluID0gbWluVGhyZXNob2xkU3Bpbm5lclMuZ2V0U2VsZWN0aW9uKCk7CisJCSAgICAgICAgaW50IG1pblRocmVzaCA9IG1heC1TUElOTkVSX0lOQ1JFTUVOVDsKKwkJICAgICAgICBpbnQgbWF4VGhyZXNoID0gbWluK1NQSU5ORVJfSU5DUkVNRU5UOworCQkgICAgICAgCisJCSAgICAgICAgbWF4VGhyZXNob2xkU3Bpbm5lclMuc2V0TWluaW11bShtYXhUaHJlc2gpOworCQkgICAgICAgIG1pblRocmVzaG9sZFNwaW5uZXJTLnNldE1heGltdW0obWluVGhyZXNoKTsgIAorCQkgICAgICB9CisJCSAgICB9KTsvLyBtYXhUaHJlc2hvbGRTcGlubmVyUworCQkKKwkJbWluVGhyZXNob2xkU3Bpbm5lclMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTZWxlY3Rpb25FdmVudCBlKSB7ICAKKwkJICAgICAgICBpbnQgbWF4ID0gbWF4VGhyZXNob2xkU3Bpbm5lclMuZ2V0U2VsZWN0aW9uKCk7CisJCSAgICAgICAgaW50IG1pbiA9IG1pblRocmVzaG9sZFNwaW5uZXJTLmdldFNlbGVjdGlvbigpOworCQkgICAgICAgIGludCBtaW5UaHJlc2ggPSBtYXgtU1BJTk5FUl9JTkNSRU1FTlQ7CisJCSAgICAgICAgaW50IG1heFRocmVzaCA9IG1pbitTUElOTkVSX0lOQ1JFTUVOVDsKKwkJICAgICAgCisJCSAgICAgICAgbWF4VGhyZXNob2xkU3Bpbm5lclMuc2V0TWluaW11bShtYXhUaHJlc2gpOworCQkgICAgICAgIG1pblRocmVzaG9sZFNwaW5uZXJTLnNldE1heGltdW0obWluVGhyZXNoKTsgIAorCQkgICAgICB9CisJCSAgICB9KTsvLyBtYXhUaHJlc2hvbGRTcGlubmVyUworCQkKKwl9IC8vIGNyZWF0ZUNvbnRlbnRzCisJCisJLyoqCisJICogY3JlYXRlcyB0aGUgZGF0YUF2ZXJhZ2VSYWRpb0J1dHRvbnMgYW5kIHRoZWlyIGNvbXBvc2l0ZSBjb250YWluZXIKKwkgKiBAcGFyYW0gY29udHJvbAorCSAqIEByZXR1cm4gdGhlIGNvbXBvc2l0ZQorCSAqLworCUNvbXBvc2l0ZSBnZXREYXRhQXZnUmFkaW9CdXR0b25zQ29tcG9zaXRlKEVzdGltYXRvckNvbnRyb2wgY29udHJvbCkgeworCQlDb21wb3NpdGUgcmFkaW9Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbnRyb2wsIFNXVC5CT1JERVIpOworCSAgICBGaWxsTGF5b3V0IGZpbGxMYXlvdXQgPSBuZXcgRmlsbExheW91dCgpOworCSAgICBmaWxsTGF5b3V0LnR5cGUgPSBTV1QuVkVSVElDQUw7CisJICAgIHJhZGlvQ29tcG9zaXRlLnNldExheW91dChmaWxsTGF5b3V0KTsKKwkgICAgCisJICAgIGRhdGFBdmVyYWdlUmFkaW9CdXR0b25zWzBdID0gbmV3IEJ1dHRvbihyYWRpb0NvbXBvc2l0ZSwgU1dULlJBRElPKTsKKwkgICAgZGF0YUF2ZXJhZ2VSYWRpb0J1dHRvbnNbMF0uc2V0U2VsZWN0aW9uKHRydWUpOworCSAgICBkYXRhQXZlcmFnZVJhZGlvQnV0dG9uc1swXS5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiRVNULkNIT0lDRTEiKSk7CisJICAgIGRhdGFBdmVyYWdlUmFkaW9CdXR0b25zWzBdLnNldEJvdW5kcygxMCwgNSwgNzUsIDMwKTsKKworCSAgICBkYXRhQXZlcmFnZVJhZGlvQnV0dG9uc1sxXSA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7CisJICAgIGRhdGFBdmVyYWdlUmFkaW9CdXR0b25zWzFdLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuQ0hPSUNFMiIpKTsKKwkgICAgZGF0YUF2ZXJhZ2VSYWRpb0J1dHRvbnNbMV0uc2V0Qm91bmRzKDEwLCAzMCwgNzUsIDMwKTsKKwkgICAgCSAgICAKKwkgICAgcmV0dXJuIHJhZGlvQ29tcG9zaXRlOworCX0vL2dldERhdGFBdmdSYWRpb0J1dHRvbnNDb21wb3NpdGUKKwkKKworCS8qKgorCSAqIGNyZWF0ZXMgdGhlIGJldGFNb2RlUmFkaW9CdXR0b25zIGFuZCB0aGVpciBjb21wb3NpdGUgY29udGFpbmVyCisJICogQHBhcmFtIGNvbnRyb2wKKwkgKiBAcmV0dXJuIHRoZSBjb21wb3NpdGUKKwkgKi8KKwlDb21wb3NpdGUgZ2V0YmV0YU1vZGVSYWRpb0J1dHRvbnNDb21wb3NpdGUoRXN0aW1hdG9yQ29udHJvbCBjb250cm9sKSB7CisJCUNvbXBvc2l0ZSByYWRpb0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29udHJvbCwgU1dULkJPUkRFUik7CisJICAgIEZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7CisJICAgIGZpbGxMYXlvdXQudHlwZSA9IFNXVC5WRVJUSUNBTDsKKwkgICAgcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0KGZpbGxMYXlvdXQpOworCSAgICAKKwkgICAgYmV0YU1vZGVSYWRpb0J1dHRvbnNbMF0gPSBuZXcgQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBTV1QuUkFESU8pOworCSAgICBiZXRhTW9kZVJhZGlvQnV0dG9uc1swXS5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJICAgIGJldGFNb2RlUmFkaW9CdXR0b25zWzBdLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuRlJFUUJFVEEiKSk7CisJICAgIGJldGFNb2RlUmFkaW9CdXR0b25zWzBdLnNldEJvdW5kcygxMCwgNSwgNzUsIDMwKTsKKworCSAgICBiZXRhTW9kZVJhZGlvQnV0dG9uc1sxXSA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7CisJICAgIGJldGFNb2RlUmFkaW9CdXR0b25zWzFdLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuREVOU0lUWUJFVEEiKSk7CisJICAgIGJldGFNb2RlUmFkaW9CdXR0b25zWzFdLnNldEJvdW5kcygxMCwgMzAsIDc1LCAzMCk7CisJICAgIHJldHVybiByYWRpb0NvbXBvc2l0ZTsKKwl9Ly9nZXRiZXRhTW9kZVJhZGlvQnV0dG9uc0NvbXBvc2l0ZQorCQorCQorCQorCS8qKgorCSAqIGNyZWF0ZXMgdGhlIHJlZ2lvblNlbGVjdG9yIGNvbWJvIGJveCBhbmQgaXRzIGNvbXBvc2l0ZSBjb250YWluZXIKKwkgKiBAcGFyYW0gY29udHJvbAorCSAqIEByZXR1cm4gdGhlIGNvbXBvc2l0ZQorCSAqLworCUNvbXBvc2l0ZSBnZXRSZWdpb25TZWxlY3RvckNvbWJvQ29tcG9zaXRlKEVzdGltYXRvckNvbnRyb2wgY29udHJvbCkgeworCQlDb21wb3NpdGUgY29tYm9Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbnRyb2wsIFNXVC5CT1JERVIpOworCSAgICBGaWxsTGF5b3V0IGZpbGxMYXlvdXQgPSBuZXcgRmlsbExheW91dCgpOworCSAgICBmaWxsTGF5b3V0LnR5cGUgPSBTV1QuVkVSVElDQUw7CisJICAgIGNvbWJvQ29tcG9zaXRlLnNldExheW91dChmaWxsTGF5b3V0KTsKKwkgICAgCisJCWRpc3BsYXlSZWdpb25Db21ibyA9IG5ldyBDb21ibyAoY29tYm9Db21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOworCQlkaXNwbGF5UmVnaW9uQ29tYm8uc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyBNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5BVkVSQUdFIikgfSk7CisJCWRpc3BsYXlSZWdpb25Db21iby5zZXRTaXplICgyMDAsIDIwMCk7CisJCWRpc3BsYXlSZWdpb25Db21iby5wYWNrKCk7CisJICAgCisJCUxhYmVsIGNvbWJvTGFiZWwgPSBuZXcgTGFiZWwoY29tYm9Db21wb3NpdGUsIFNXVC5OT05FKTsKKwkgICAgY29tYm9MYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiRVNULkRJU1BMQVkiKSk7CisJICAgIAorCSAgICBkaXNwbGF5UmVnaW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJICAgIAkgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2VsZWN0aW9uRXZlbnQgZSkgeworCSAgICAJICAgIAkgIHJlZ2lvblRvRGlzcGxheSA9IGRpc3BsYXlSZWdpb25Db21iby5nZXRUZXh0KCk7CisJICAgIAkgICAgCSAgdXBkYXRlQ2hhcnRzKCk7CisJICAgIAkgICAgICB9CisJICAgIAkgICAgfSk7CisJCisKKwkJCisJICAgIHJldHVybiBjb21ib0NvbXBvc2l0ZTsKKwl9Ly9nZXRiZXRhTW9kZVJhZGlvQnV0dG9uc0NvbXBvc2l0ZQorCQorCQorCS8qKgorCSAqIHVwZGF0ZSB0aGUgZ3JhcGhzCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHVwZGF0ZUNoYXJ0cygpIHsKKwkJc3RhdHVzTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5DT01QTEVURSIpKTsKKwkJZXN0aW1hdG9yQ2FudmFzLmRyYXcoYXZlcmFnZVBhcm1zLmdldFBhcmFtZXRlcnMoKSk7CisJCQorCQlpbnQgbnVtRGF0YUNoYXJ0cyA9IGFuYWx5emVyLmdldEVzdGltYXRvcigpLmdldE51bVByb3BlcnRpZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1EYXRhQ2hhcnRzOyBpKyspIHsKKwkJCS8vIHRlbGwgdGhlIGNhbnZhcyB0byB0aGUgdGhlIGRhdGEgZnJvbSB0aGlzIGNvbnRyb2wKKwkJCS8vIHRoZSBjb250cm9sIGdldHMgaXQgZnJvbSB0aGUgYW5hbHl6ZXIgd2hpY2ggZ2V0cyBpdCBmb3JtIHRoZQorCQkJLy8gZXN0aW1hdG9ycworCQkJZXF1YXRpb25TZXJpZXNbaV0uZHJhdygpOworCQkJcmVncmVzc2lvblNlcmllc1tpXS5kcmF3KCk7CisJCX0KKwkJCisJfQorCQorCQorCQorCisJCisJLyoqCisJICogY3JlYXRlcyB0aGUgc3Bpbm5lcnMgZm9yIHRoZSBtaW4gYW5kIG1heCB0aHJlc2hvbGQgc2V0dGluZ3MgYW5kIHRoZWlyIGNvbXBvc2l0ZSBjb250YWluZXIKKwkgKiBAcGFyYW0gY29udHJvbAorCSAqIEByZXR1cm4gdGhlIGNvbXBvc2l0ZQorCSAqLworCUNvbXBvc2l0ZSBnZXRTcGlubmVyQ29tcG9zaXRlKEVzdGltYXRvckNvbnRyb2wgY29udHJvbCkgeworCQlDb21wb3NpdGUgc3Bpbm5lckNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29udHJvbCwgU1dULkJPUkRFUik7CisJCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDg7CisJICAgIHNwaW5uZXJDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOworCSAgICAKKwkgICAgLy8gbWF4IFMKKwkgICAgbWF4VGhyZXNob2xkU3Bpbm5lclMgPSBuZXcgU3Bpbm5lcihzcGlubmVyQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJICAgIG1heFRocmVzaG9sZFNwaW5uZXJTLnNldERpZ2l0cygzKTsgCQkvLyBhbGxvdyAzIGRlY2ltYWwgcGxhY2VzCisJICAgIG1heFRocmVzaG9sZFNwaW5uZXJTLnNldE1pbmltdW0oMSk7CQkvLyBzZXQgdGhlIG1pbmltdW0gdmFsdWUgdG8gMC4wMDEKKwkgICAgbWF4VGhyZXNob2xkU3Bpbm5lclMuc2V0TWF4aW11bShTUElOTkVSX1JFU09MVVRJT04pOwkvLyBzZXQgdGhlIG1heGltdW0gdmFsdWUgdG8gMS4wCisJICAgIG1heFRocmVzaG9sZFNwaW5uZXJTLnNldEluY3JlbWVudCgxKTsJLy8gc2V0IHRoZSBpbmNyZW1lbnQgdmFsdWUgdG8gMC4wMDEKKwkgICAgbWF4VGhyZXNob2xkU3Bpbm5lclMuc2V0U2VsZWN0aW9uKDk5MCk7CS8vIHNldCB0aGUgaW5pdGlhbCB2YWx1ZSAwLjk5MAorCSAgICBtYXhTcGlubmVyTGFiZWxTID0gbmV3IExhYmVsKHNwaW5uZXJDb21wb3NpdGUsIFNXVC5OT05FKTsKKwkgICAgbWF4U3Bpbm5lckxhYmVsUy5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiRVNULk1BWFRIUkVTSE9MRFMiKSk7CisJICAgIC8vIG1heCBFCisJICAgIG1heFRocmVzaG9sZFNwaW5uZXJFID0gbmV3IFNwaW5uZXIoc3Bpbm5lckNvbXBvc2l0ZSwgU1dULk5PTkUpOworCSAgICBtYXhUaHJlc2hvbGRTcGlubmVyRS5zZXREaWdpdHMoMyk7IAkJLy8gYWxsb3cgMyBkZWNpbWFsIHBsYWNlcworCSAgICBtYXhUaHJlc2hvbGRTcGlubmVyRS5zZXRNaW5pbXVtKDEpOwkJLy8gc2V0IHRoZSBtaW5pbXVtIHZhbHVlIHRvIDAuMDAxCisJICAgIG1heFRocmVzaG9sZFNwaW5uZXJFLnNldE1heGltdW0oU1BJTk5FUl9SRVNPTFVUSU9OKTsJLy8gc2V0IHRoZSBtYXhpbXVtIHZhbHVlIHRvIDEuMAorCSAgICBtYXhUaHJlc2hvbGRTcGlubmVyRS5zZXRJbmNyZW1lbnQoMSk7CS8vIHNldCB0aGUgaW5jcmVtZW50IHZhbHVlIHRvIDAuMDAxCisJICAgIG1heFRocmVzaG9sZFNwaW5uZXJFLnNldFNlbGVjdGlvbihTUElOTkVSX1JFU09MVVRJT04pOwkvLyBzZXQgdGhlIGluaXRpYWwgdmFsdWUgMC45OTAKKwkgICAgbWF4U3Bpbm5lckxhYmVsRSA9IG5ldyBMYWJlbChzcGlubmVyQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJICAgIG1heFNwaW5uZXJMYWJlbEUuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5NQVhUSFJFU0hPTERFIikpOworCSAgICAvLyBtYXggSQorCSAgICBtYXhUaHJlc2hvbGRTcGlubmVySSA9IG5ldyBTcGlubmVyKHNwaW5uZXJDb21wb3NpdGUsIFNXVC5OT05FKTsKKwkgICAgbWF4VGhyZXNob2xkU3Bpbm5lckkuc2V0RGlnaXRzKDMpOyAJCS8vIGFsbG93IDMgZGVjaW1hbCBwbGFjZXMKKwkgICAgbWF4VGhyZXNob2xkU3Bpbm5lckkuc2V0TWluaW11bSgxKTsJCS8vIHNldCB0aGUgbWluaW11bSB2YWx1ZSB0byAwLjAwMQorCSAgICBtYXhUaHJlc2hvbGRTcGlubmVySS5zZXRNYXhpbXVtKFNQSU5ORVJfUkVTT0xVVElPTik7CS8vIHNldCB0aGUgbWF4aW11bSB2YWx1ZSB0byAxLjAKKwkgICAgbWF4VGhyZXNob2xkU3Bpbm5lckkuc2V0SW5jcmVtZW50KDEpOwkvLyBzZXQgdGhlIGluY3JlbWVudCB2YWx1ZSB0byAwLjAwMQorCSAgICBtYXhUaHJlc2hvbGRTcGlubmVySS5zZXRTZWxlY3Rpb24oU1BJTk5FUl9SRVNPTFVUSU9OKTsJLy8gc2V0IHRoZSBpbml0aWFsIHZhbHVlIDAuOTkwCisJICAgIG1heFNwaW5uZXJMYWJlbEkgPSBuZXcgTGFiZWwoc3Bpbm5lckNvbXBvc2l0ZSwgU1dULk5PTkUpOworCSAgICBtYXhTcGlubmVyTGFiZWxJLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuTUFYVEhSRVNIT0xESSIpKTsKKwkgICAgLy8gbWF4IFIKKwkgICAgbWF4VGhyZXNob2xkU3Bpbm5lclIgPSBuZXcgU3Bpbm5lcihzcGlubmVyQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJICAgIG1heFRocmVzaG9sZFNwaW5uZXJSLnNldERpZ2l0cygzKTsgCQkvLyBhbGxvdyAzIGRlY2ltYWwgcGxhY2VzCisJICAgIG1heFRocmVzaG9sZFNwaW5uZXJSLnNldE1pbmltdW0oMSk7CQkvLyBzZXQgdGhlIG1pbmltdW0gdmFsdWUgdG8gMC4wMDEKKwkgICAgbWF4VGhyZXNob2xkU3Bpbm5lclIuc2V0TWF4aW11bShTUElOTkVSX1JFU09MVVRJT04pOwkvLyBzZXQgdGhlIG1heGltdW0gdmFsdWUgdG8gMS4wCisJICAgIG1heFRocmVzaG9sZFNwaW5uZXJSLnNldEluY3JlbWVudCgxKTsJLy8gc2V0IHRoZSBpbmNyZW1lbnQgdmFsdWUgdG8gMC4wMDEKKwkgICAgbWF4VGhyZXNob2xkU3Bpbm5lclIuc2V0U2VsZWN0aW9uKDk5MCk7CS8vIHNldCB0aGUgaW5pdGlhbCB2YWx1ZSAwLjk5MAorCSAgICBtYXhTcGlubmVyTGFiZWxSID0gbmV3IExhYmVsKHNwaW5uZXJDb21wb3NpdGUsIFNXVC5OT05FKTsKKwkgICAgbWF4U3Bpbm5lckxhYmVsUi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiRVNULk1BWFRIUkVTSE9MRFIiKSk7CisJICAgIAorCSAgICAvLyBtaW4gUworCSAgICBtaW5UaHJlc2hvbGRTcGlubmVyUyA9IG5ldyBTcGlubmVyKHNwaW5uZXJDb21wb3NpdGUsIFNXVC5OT05FKTsKKwkgICAgbWluVGhyZXNob2xkU3Bpbm5lclMuc2V0RGlnaXRzKDMpOyAJCS8vIGFsbG93IDMgZGVjaW1hbCBwbGFjZXMKKwkgICAgbWluVGhyZXNob2xkU3Bpbm5lclMuc2V0TWluaW11bSgxKTsJCS8vIHNldCB0aGUgbWluaW11bSB2YWx1ZSB0byAwLjAwMQorCSAgICBtaW5UaHJlc2hvbGRTcGlubmVyUy5zZXRNYXhpbXVtKFNQSU5ORVJfUkVTT0xVVElPTik7CS8vIHNldCB0aGUgbWF4aW11bSB2YWx1ZSB0byAxLjAKKwkgICAgbWluVGhyZXNob2xkU3Bpbm5lclMuc2V0SW5jcmVtZW50KFNQSU5ORVJfSU5DUkVNRU5UKTsJLy8gc2V0IHRoZSBpbmNyZW1lbnQgdmFsdWUgdG8gMC4wMDEKKwkgICAgbWluVGhyZXNob2xkU3Bpbm5lclMuc2V0U2VsZWN0aW9uKDEwKTsJLy8gc2V0IHRoZSBpbml0aWFsIHZhbHVlIDAuMDAxCisJICAgIG1pblNwaW5uZXJMYWJlbFMgPSBuZXcgTGFiZWwoc3Bpbm5lckNvbXBvc2l0ZSwgU1dULk5PTkUpOworCSAgICBtaW5TcGlubmVyTGFiZWxTLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuTUlOVEhSRVNIT0xEUyIpKTsKKwkgICAgLy8gbWluIEUKKwkgICAgbWluVGhyZXNob2xkU3Bpbm5lckUgPSBuZXcgU3Bpbm5lcihzcGlubmVyQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJICAgIG1pblRocmVzaG9sZFNwaW5uZXJFLnNldERpZ2l0cygzKTsgCQkvLyBhbGxvdyAzIGRlY2ltYWwgcGxhY2VzCisJICAgIG1pblRocmVzaG9sZFNwaW5uZXJFLnNldE1pbmltdW0oMSk7CQkvLyBzZXQgdGhlIG1pbmltdW0gdmFsdWUgdG8gMC4wMDEKKwkgICAgbWluVGhyZXNob2xkU3Bpbm5lckUuc2V0TWF4aW11bShTUElOTkVSX1JFU09MVVRJT04pOwkvLyBzZXQgdGhlIG1heGltdW0gdmFsdWUgdG8gMS4wCisJICAgIG1pblRocmVzaG9sZFNwaW5uZXJFLnNldEluY3JlbWVudChTUElOTkVSX0lOQ1JFTUVOVCk7CS8vIHNldCB0aGUgaW5jcmVtZW50IHZhbHVlIHRvIDAuMDAxCisJICAgIG1pblRocmVzaG9sZFNwaW5uZXJFLnNldFNlbGVjdGlvbigxMDApOwkvLyBzZXQgdGhlIGluaXRpYWwgdmFsdWUgMC4wMDEKKwkgICAgbWluU3Bpbm5lckxhYmVsRSA9IG5ldyBMYWJlbChzcGlubmVyQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJICAgIG1pblNwaW5uZXJMYWJlbEUuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5NSU5USFJFU0hPTERFIikpOyAgCisJICAgIC8vIG1pbiBJCisJICAgIG1pblRocmVzaG9sZFNwaW5uZXJJID0gbmV3IFNwaW5uZXIoc3Bpbm5lckNvbXBvc2l0ZSwgU1dULk5PTkUpOworCSAgICBtaW5UaHJlc2hvbGRTcGlubmVySS5zZXREaWdpdHMoMyk7IAkJLy8gYWxsb3cgMyBkZWNpbWFsIHBsYWNlcworCSAgICBtaW5UaHJlc2hvbGRTcGlubmVySS5zZXRNaW5pbXVtKDEpOwkJLy8gc2V0IHRoZSBtaW5pbXVtIHZhbHVlIHRvIDAuMDAxCisJICAgIG1pblRocmVzaG9sZFNwaW5uZXJJLnNldE1heGltdW0oU1BJTk5FUl9SRVNPTFVUSU9OKTsJLy8gc2V0IHRoZSBtYXhpbXVtIHZhbHVlIHRvIDEuMAorCSAgICBtaW5UaHJlc2hvbGRTcGlubmVySS5zZXRJbmNyZW1lbnQoU1BJTk5FUl9JTkNSRU1FTlQpOwkvLyBzZXQgdGhlIGluY3JlbWVudCB2YWx1ZSB0byAwLjAwMQorCSAgICBtaW5UaHJlc2hvbGRTcGlubmVySS5zZXRTZWxlY3Rpb24oMTAwKTsJLy8gc2V0IHRoZSBpbml0aWFsIHZhbHVlIDAuMDAxCisJICAgIG1pblNwaW5uZXJMYWJlbEkgPSBuZXcgTGFiZWwoc3Bpbm5lckNvbXBvc2l0ZSwgU1dULk5PTkUpOworCSAgICBtaW5TcGlubmVyTGFiZWxJLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuTUlOVEhSRVNIT0xESSIpKTsKKwkgICAgLy8gbWluIFIKKwkgICAgbWluVGhyZXNob2xkU3Bpbm5lclIgPSBuZXcgU3Bpbm5lcihzcGlubmVyQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJICAgIG1pblRocmVzaG9sZFNwaW5uZXJSLnNldERpZ2l0cygzKTsgCQkvLyBhbGxvdyAzIGRlY2ltYWwgcGxhY2VzCisJICAgIG1pblRocmVzaG9sZFNwaW5uZXJSLnNldE1pbmltdW0oMSk7CQkvLyBzZXQgdGhlIG1pbmltdW0gdmFsdWUgdG8gMC4wMDEKKwkgICAgbWluVGhyZXNob2xkU3Bpbm5lclIuc2V0TWF4aW11bShTUElOTkVSX1JFU09MVVRJT04pOwkvLyBzZXQgdGhlIG1heGltdW0gdmFsdWUgdG8gMS4wCisJICAgIG1pblRocmVzaG9sZFNwaW5uZXJSLnNldEluY3JlbWVudChTUElOTkVSX0lOQ1JFTUVOVCk7CS8vIHNldCB0aGUgaW5jcmVtZW50IHZhbHVlIHRvIDAuMDAxCisJICAgIG1pblRocmVzaG9sZFNwaW5uZXJSLnNldFNlbGVjdGlvbigxKTsJLy8gc2V0IHRoZSBpbml0aWFsIHZhbHVlIDAuMDAxCisJICAgIG1pblNwaW5uZXJMYWJlbFIgPSBuZXcgTGFiZWwoc3Bpbm5lckNvbXBvc2l0ZSwgU1dULk5PTkUpOworCSAgICBtaW5TcGlubmVyTGFiZWxSLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuTUlOVEhSRVNIT0xEUiIpKTsKKwkgICAgCisJICAgIHNwaW5uZXJDb21wb3NpdGUucGFjaygpOworCSAgICAKKwkgICAgcmV0dXJuIHNwaW5uZXJDb21wb3NpdGU7CisJfS8vZ2V0U3Bpbm5lckNvbXBvc2l0ZXIKKwkKKwkKKwkvKioKKwkgKiBzZXQgdXAgdGhlIGZvdXIgZGF0YSB0aW1lIHNlcmllcyBjaGFydHMKKwkgKiBAcGFyYW0gZGF0YUNvbXBvc2l0ZQorCSAqLworCXByaXZhdGUgdm9pZCBnZXRFcXVhdGlvblNlcmllc0NoYXJ0cyhDb21wb3NpdGUgZGF0YUNvbXBvc2l0ZSkgeworCQkvLyBTCisgCQllcXVhdGlvblNlcmllc1swXSA9IG5ldyBUaW1lU2VyaWVzQ2FudmFzKHRoaXMsZGF0YUNvbXBvc2l0ZSwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5FUVVBVElPTjEiKSwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5BWElTTEFCRUwxIiksCisJCQkJQWdncmVnYXRlRGF0YVdyaXRlci5nZXRLZXlTKCksLy8gZXF1YXRpb24gMSBhbHdheXMgaGFzIFMKKwkJCQlmb3JlR3JvdW5kLAorCQkJCWJhY2tncm91bmRHcm91bmQsCisJCQkJZnJhbWVDb2xvciwgMCwgdHJ1ZSk7CisJCWZpbmFsIEZvcm1EYXRhIGVxT25lRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJZXF1YXRpb25TZXJpZXNbMF0uc2V0TGF5b3V0RGF0YShlcU9uZUZvcm1EYXRhKTsKKwkJZXFPbmVGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZGF0YUNvbXBvc2l0ZSwgMCk7CisJCWVxT25lRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDUwLCAwKTsKKwkJZXFPbmVGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQllcU9uZUZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDUwLCAwKTsKKwkJCisJCS8vIEkKKwkJZXF1YXRpb25TZXJpZXNbMV0gPSBuZXcgVGltZVNlcmllc0NhbnZhcyh0aGlzLGRhdGFDb21wb3NpdGUsCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuRVFVQVRJT04zIiksCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuQVhJU0xBQkVMMyIpLAorCQkJCUFnZ3JlZ2F0ZURhdGFXcml0ZXIuZ2V0S2V5SSgpLC8vIGVxdWF0aW9uIDMgYWx3YXlzIGhhcyBJCisJCQkJZm9yZUdyb3VuZCwKKwkJCQliYWNrZ3JvdW5kR3JvdW5kLAorCQkJCWZyYW1lQ29sb3IsIDEsIHRydWUpOworCQlmaW5hbCBGb3JtRGF0YSBlcVRocmVlRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJZXF1YXRpb25TZXJpZXNbMV0uc2V0TGF5b3V0RGF0YShlcVRocmVlRm9ybURhdGEpOworCQllcVRocmVlRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDUxLCAwKTsKKwkJZXFUaHJlZUZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQllcVRocmVlRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJZXFUaHJlZUZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDUwLCAwKTsKKwkJCisJCS8vIFIKKwkJZXF1YXRpb25TZXJpZXNbMl0gPSBuZXcgVGltZVNlcmllc0NhbnZhcyh0aGlzLGRhdGFDb21wb3NpdGUsCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuRVFVQVRJT040IiksCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuQVhJU0xBQkVMNCIpLAorCQkJCUFnZ3JlZ2F0ZURhdGFXcml0ZXIuZ2V0S2V5UigpLC8vIGVxdWF0aW9uIDQgYWx3YXlzIGhhcyBSCisJCQkJZm9yZUdyb3VuZCwKKwkJCQliYWNrZ3JvdW5kR3JvdW5kLAorCQkJCWZyYW1lQ29sb3IsIDIsIHRydWUpOworCQlmaW5hbCBGb3JtRGF0YSBlcUZvdXJGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQllcXVhdGlvblNlcmllc1syXS5zZXRMYXlvdXREYXRhKGVxRm91ckZvcm1EYXRhKTsKKwkJZXFGb3VyRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDUxLCAwKTsKKwkJZXFGb3VyRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCWVxRm91ckZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTEsIDApOworCQllcUZvdXJGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQkKKwkJLy8gRQorCQllcXVhdGlvblNlcmllc1szXSA9IG5ldyBUaW1lU2VyaWVzQ2FudmFzKHRoaXMsZGF0YUNvbXBvc2l0ZSwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5FUVVBVElPTjIiKSwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5BWElTTEFCRUwyIiksCisJCQkJQWdncmVnYXRlRGF0YVdyaXRlci5nZXRLZXlFKCksLy8gZXF1YXRpb24gMiBhbHdheXMgaGFzIEUKKwkJCQlmb3JlR3JvdW5kLAorCQkJCWJhY2tncm91bmRHcm91bmQsCisJCQkJZnJhbWVDb2xvciwgMywgdHJ1ZSk7CisJCWZpbmFsIEZvcm1EYXRhIGVxVHdvRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJZXF1YXRpb25TZXJpZXNbM10uc2V0TGF5b3V0RGF0YShlcVR3b0Zvcm1EYXRhKTsKKwkJZXFUd29Gb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZGF0YUNvbXBvc2l0ZSwgMCk7CisJCWVxVHdvRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDUwLCAwKTsKKwkJZXFUd29Gb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDUxLCAwKTsKKwkJZXFUd29Gb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCX0vLyBnZXRFcXVhdGlvblNlcmllcworCQorCQorCQorCQorCQorCS8qKgorCSAqIHNldCB1cCB0aGUgZm91ciByZWdyZXNzaW9uIFhZc2VyaWVzIGNoYXJ0cworCSAqIEBwYXJhbSByZWdyZXNzaW9uQ29tcG9zaXRlCisJICovCisJcHJpdmF0ZSB2b2lkIGdldFJlZ3Jlc3Npb25TZXJpZXNDaGFydHMoQ29tcG9zaXRlIHJlZ3Jlc3Npb25Db21wb3NpdGUpIHsKKwkJLy8gRXF1YXRpb24gMSBmcm9tIGRTL2RUCisgCQlyZWdyZXNzaW9uU2VyaWVzWzBdID0gbmV3IFhZU2VyaWVzQ2FudmFzKHRoaXMscmVncmVzc2lvbkNvbXBvc2l0ZSwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5FUVVBVElPTjEiKSwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5SQVhJU0xBQkVMMSIpLAorCQkJCWZvcmVHcm91bmQsCisJCQkJYmFja2dyb3VuZEdyb3VuZCwKKwkJCQlmcmFtZUNvbG9yLCAwKTsKKwkJZmluYWwgRm9ybURhdGEgZXFPbmVGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlyZWdyZXNzaW9uU2VyaWVzWzBdLnNldExheW91dERhdGEoZXFPbmVGb3JtRGF0YSk7CisJCWVxT25lRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHJlZ3Jlc3Npb25Db21wb3NpdGUsIDApOworCQllcU9uZUZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCwgMCk7CisJCWVxT25lRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJZXFPbmVGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCwgMCk7CisJCQorCQkvLyBFcXVhdGlvbiAyIGZyb20gZEkvZFQKKwkJcmVncmVzc2lvblNlcmllc1sxXSA9IG5ldyBYWVNlcmllc0NhbnZhcyh0aGlzLHJlZ3Jlc3Npb25Db21wb3NpdGUsCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuRVFVQVRJT04zIiksCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuUkFYSVNMQUJFTDMiKSwKKwkJCQlmb3JlR3JvdW5kLAorCQkJCWJhY2tncm91bmRHcm91bmQsCisJCQkJZnJhbWVDb2xvciwgMSk7CisJCWZpbmFsIEZvcm1EYXRhIGVxVGhyZWVGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlyZWdyZXNzaW9uU2VyaWVzWzFdLnNldExheW91dERhdGEoZXFUaHJlZUZvcm1EYXRhKTsKKwkJZXFUaHJlZUZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MSwgMCk7CisJCWVxVGhyZWVGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJZXFUaHJlZUZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWVxVGhyZWVGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCwgMCk7CisJCQorCQkvLyBFcXVhdGlvbiAzIGZyb20gZFIvZFQKKwkJcmVncmVzc2lvblNlcmllc1syXSA9IG5ldyBYWVNlcmllc0NhbnZhcyh0aGlzLHJlZ3Jlc3Npb25Db21wb3NpdGUsCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuRVFVQVRJT040IiksCisJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuUkFYSVNMQUJFTDQiKSwKKwkJCQlmb3JlR3JvdW5kLAorCQkJCWJhY2tncm91bmRHcm91bmQsCisJCQkJZnJhbWVDb2xvciwgMik7CisJCWZpbmFsIEZvcm1EYXRhIGVxRm91ckZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCXJlZ3Jlc3Npb25TZXJpZXNbMl0uc2V0TGF5b3V0RGF0YShlcUZvdXJGb3JtRGF0YSk7CisJCWVxRm91ckZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MSwgMCk7CisJCWVxRm91ckZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQllcUZvdXJGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDUxLCAwKTsKKwkJZXFGb3VyRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJCisJCS8vIEVxdWF0aW9uIDQgZnJvbSBkRS9kVAorCQlyZWdyZXNzaW9uU2VyaWVzWzNdID0gbmV3IFhZU2VyaWVzQ2FudmFzKHRoaXMscmVncmVzc2lvbkNvbXBvc2l0ZSwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5FUVVBVElPTjIiKSwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5SQVhJU0xBQkVMMiIpLAorCQkJCWZvcmVHcm91bmQsCisJCQkJYmFja2dyb3VuZEdyb3VuZCwKKwkJCQlmcmFtZUNvbG9yLCAzKTsKKwkJZmluYWwgRm9ybURhdGEgZXFUd29Gb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlyZWdyZXNzaW9uU2VyaWVzWzNdLnNldExheW91dERhdGEoZXFUd29Gb3JtRGF0YSk7CisJCWVxVHdvRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHJlZ3Jlc3Npb25Db21wb3NpdGUsIDApOworCQllcVR3b0Zvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCwgMCk7CisJCWVxVHdvRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MSwgMCk7CisJCWVxVHdvRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwl9Ly8gZ2V0IHJlZ3Jlc3Npb24gc2VyaWVzIGNvbXBvc2l0ZQorCQorCQorCS8qKgorCSAqIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBhbmFseXNpcyBidXR0b24KKwkgKiAKKwkgKiBAcGFyYW0gYgorCSAqLworCXB1YmxpYyB2b2lkIGVuYWJsZUFuYWx5c2lzKGJvb2xlYW4gYikgeworCQlpZihiKSB0aGlzLmFuYWx5emVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKwkJZWxzZSB0aGlzLmFuYWx5emVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJfQorCQorCQorCS8qKgorCSAqIHRvIHJlbW92ZSB0aGUgY29udHJvbCBlLmcuIGJ5IGEgcmVtb3ZlIGJ1dHRvbiBldmVudAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKwkJCisJCXVwZGF0ZVN0YXR1c0xhYmVsKCk7CisJfQorCisJCisJCisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0dXNMYWJlbCgpIHsKKwkJc3RhdHVzTGFiZWwuc2V0VGV4dChBbmFseXNpc0NvbnRyb2wuU1RBVFVTX1RFWFQpOworCX0KKwkKKworCS8qKgorCSAqIEluaXRpYWxpemUgdGhlIGhlYWRlciBsYWJlbAorCSAqIAorCSAqIEBwYXJhbSBmb2xkZXJOYW1lCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUhlYWRlcihTdHJpbmcgZm9sZGVyTmFtZSkgeworCQlzaW11bGF0aW9uTmFtZUxhYmVsLnNldFRleHQoImFuYWx5emluZyAiK2ZvbGRlck5hbWUpOworCisJfSAvLyBpbml0aWFsaXplRnJvbVNpbXVsYXRpb24KKworCisJCisJCisJCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkJCQkJCisJCXN1cGVyLmRpc3Bvc2UoKTsKKwkJCisJfSAvLyBkaXNwb3NlCisKKwkKKwkvKioKKwkgKiBub3QgdXNlZAorCSAqIEByZXR1cm4gbnVsbAorCSAqLworCXB1YmxpYyBJZGVudGlmaWFibGUgZ2V0SWRlbnRpZmlhYmxlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkKKworCS8qKgorCSAqIGdldCB0aGUgdmFsdWUgZm9yIHBsb3R0aW5nCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuQW5hbHlzaXNDb250cm9sI2dldFZhbHVlcyhpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgZG91YmxlW10gZ2V0VmFsdWVzKGludCBjaGFydEluZGV4LCBpbnQgc3RhdGUpIHsKKwkJaWYgKHN0YXRlIDw9IDEpIHsKKwkJCXJldHVybiBhdmVyYWdlUGFybXMuZ2V0RGF0YVZhbHVlcyhyZWdpb25Ub0Rpc3BsYXksIGNoYXJ0SW5kZXgsIHN0YXRlKTsKKwkJfSBlbHNlIGlmIChzdGF0ZSA8PTMpIHsKKwkJCXJldHVybiBhdmVyYWdlUGFybXMuZ2V0UmVncmVzc2lvblZhbHVlcyhyZWdpb25Ub0Rpc3BsYXksIGNoYXJ0SW5kZXgsIHN0YXRlLTIpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGF2ZXJhZ2VQYXJtcy5nZXRGaXR0ZWRWYWx1ZXMocmVnaW9uVG9EaXNwbGF5LCBjaGFydEluZGV4LCBzdGF0ZS00KTsKKwkJfQorCQkKKwkJCisJCS8vcmV0dXJuIGFuYWx5emVyLmdldEVzdGltYXRvcigpLmdldFZhbHVlcyhjaGFydEluZGV4LCBzdGF0ZSk7CisJfQorCQorCS8qKgorCSAqIE5vdCB1c2VkCisJICogQHBhcmFtIGNoYXJ0SW5kZXggbm90IHVzZWQgKG9ubHkgb25lIGNoYXJ0KQorCSAqIEBwYXJhbSBzdGF0ZQorCSAqIEByZXR1cm4gcHJvcGVydHkgbmFtZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoaW50IGNoYXJ0SW5kZXgsIGludCBzdGF0ZSkgeworCQlyZXR1cm4gYW5hbHl6ZXIuZ2V0RXN0aW1hdG9yKCkuZ2V0UHJvcGVydHkoY2hhcnRJbmRleCwgc3RhdGUpOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBtYXggIFMgdmFsdWUgdGhyZXNob2xkIGZyb20gdGhlIHNwaW5uZXIgYXMgYSBkb3VibGUKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE1heFRocmVzaG9sZFMoKSB7CisJCWRvdWJsZSBzZWxlY3Rpb24gPSBtYXhUaHJlc2hvbGRTcGlubmVyUy5nZXRTZWxlY3Rpb24oKTsvLyByZWFsbHkgYW4gaW50CisJCWRvdWJsZSByZXMgPSBTUElOTkVSX1JFU09MVVRJT047IC8vIDEwMDAgbWVhbnMgMyBkZWNpbWFsIHBsYWNlcworCQlyZXR1cm4gc2VsZWN0aW9uL3JlczsKKwl9CisJLyoqCisJICogQHJldHVybiB0aGUgbWluIFMgdmFsdWUgdGhyZXNob2xkIGZyb20gdGhlIHNwaW5uZXIgYXMgYSBkb3VibGUKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE1pblRocmVzaG9sZFMoKSB7CisJCWRvdWJsZSBzZWxlY3Rpb24gPSBtaW5UaHJlc2hvbGRTcGlubmVyUy5nZXRTZWxlY3Rpb24oKTsvLyByZWFsbHkgYW4gaW50CisJCWRvdWJsZSByZXMgPSBTUElOTkVSX1JFU09MVVRJT047IC8vIDEwMDAgbWVhbnMgMyBkZWNpbWFsIHBsYWNlcworCQlyZXR1cm4gc2VsZWN0aW9uL3JlczsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgbWF4ICBFIHZhbHVlIHRocmVzaG9sZCBmcm9tIHRoZSBzcGlubmVyIGFzIGEgZG91YmxlCisJICovCisJcHVibGljIGRvdWJsZSBnZXRNYXhUaHJlc2hvbGRFKCkgeworCQlkb3VibGUgc2VsZWN0aW9uID0gbWF4VGhyZXNob2xkU3Bpbm5lckUuZ2V0U2VsZWN0aW9uKCk7Ly8gcmVhbGx5IGFuIGludAorCQlkb3VibGUgcmVzID0gU1BJTk5FUl9SRVNPTFVUSU9OOyAvLyAxMDAwIG1lYW5zIDMgZGVjaW1hbCBwbGFjZXMKKwkJcmV0dXJuIHNlbGVjdGlvbi9yZXM7CisJfQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG1pbiBFIHZhbHVlIHRocmVzaG9sZCBmcm9tIHRoZSBzcGlubmVyIGFzIGEgZG91YmxlCisJICovCisJcHVibGljIGRvdWJsZSBnZXRNaW5UaHJlc2hvbGRFKCkgeworCQlkb3VibGUgc2VsZWN0aW9uID0gbWluVGhyZXNob2xkU3Bpbm5lckUuZ2V0U2VsZWN0aW9uKCk7Ly8gcmVhbGx5IGFuIGludAorCQlkb3VibGUgcmVzID0gU1BJTk5FUl9SRVNPTFVUSU9OOyAvLyAxMDAwIG1lYW5zIDMgZGVjaW1hbCBwbGFjZXMKKwkJcmV0dXJuIHNlbGVjdGlvbi9yZXM7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG1heCAgSSB2YWx1ZSB0aHJlc2hvbGQgZnJvbSB0aGUgc3Bpbm5lciBhcyBhIGRvdWJsZQorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0TWF4VGhyZXNob2xkSSgpIHsKKwkJZG91YmxlIHNlbGVjdGlvbiA9IG1heFRocmVzaG9sZFNwaW5uZXJJLmdldFNlbGVjdGlvbigpOy8vIHJlYWxseSBhbiBpbnQKKwkJZG91YmxlIHJlcyA9IFNQSU5ORVJfUkVTT0xVVElPTjsgLy8gMTAwMCBtZWFucyAzIGRlY2ltYWwgcGxhY2VzCisJCXJldHVybiBzZWxlY3Rpb24vcmVzOworCX0KKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBtaW4gSSB2YWx1ZSB0aHJlc2hvbGQgZnJvbSB0aGUgc3Bpbm5lciBhcyBhIGRvdWJsZQorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0TWluVGhyZXNob2xkSSgpIHsKKwkJZG91YmxlIHNlbGVjdGlvbiA9IG1pblRocmVzaG9sZFNwaW5uZXJJLmdldFNlbGVjdGlvbigpOy8vIHJlYWxseSBhbiBpbnQKKwkJZG91YmxlIHJlcyA9IFNQSU5ORVJfUkVTT0xVVElPTjsgLy8gMTAwMCBtZWFucyAzIGRlY2ltYWwgcGxhY2VzCisJCXJldHVybiBzZWxlY3Rpb24vcmVzOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBtYXggIFIgdmFsdWUgdGhyZXNob2xkIGZyb20gdGhlIHNwaW5uZXIgYXMgYSBkb3VibGUKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE1heFRocmVzaG9sZFIoKSB7CisJCWRvdWJsZSBzZWxlY3Rpb24gPSBtYXhUaHJlc2hvbGRTcGlubmVyUi5nZXRTZWxlY3Rpb24oKTsvLyByZWFsbHkgYW4gaW50CisJCWRvdWJsZSByZXMgPSBTUElOTkVSX1JFU09MVVRJT047IC8vIDEwMDAgbWVhbnMgMyBkZWNpbWFsIHBsYWNlcworCQlyZXR1cm4gc2VsZWN0aW9uL3JlczsKKwl9CisJLyoqCisJICogQHJldHVybiB0aGUgbWluIFIgdmFsdWUgdGhyZXNob2xkIGZyb20gdGhlIHNwaW5uZXIgYXMgYSBkb3VibGUKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE1pblRocmVzaG9sZFIoKSB7CisJCWRvdWJsZSBzZWxlY3Rpb24gPSBtaW5UaHJlc2hvbGRTcGlubmVyUi5nZXRTZWxlY3Rpb24oKTsvLyByZWFsbHkgYW4gaW50CisJCWRvdWJsZSByZXMgPSBTUElOTkVSX1JFU09MVVRJT047IC8vIDEwMDAgbWVhbnMgMyBkZWNpbWFsIHBsYWNlcworCQlyZXR1cm4gc2VsZWN0aW9uL3JlczsKKwl9CisJCisJLyoqCisJICogTm90IHVzZWQKKwkgKiBAcGFyYW0gY2hhcnRJbmRleCBub3QgdXNlZCAob25seSBvbmUgY2hhcnQpCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHByb3BlcnRpZXMsIG9ubHkgb25lCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuQW5hbHlzaXNDb250cm9sI2dldE51bVByb3BlcnRpZXMoaW50IGNoYXJ0SW5kZXgpCisJICovCisJcHVibGljIGludCBnZXROdW1Qcm9wZXJ0aWVzKGludCBjaGFydEluZGV4KSB7CisJCWlmKGFuYWx5emVyIT1udWxsKSB7CisJCQkvLyB3ZSBhbHdheXMgcmV0dXJuIDIgYmVjYXVzZSB3ZSBjaGFydCB0aGUgdmFyaWFibGUgYWxvbmcgd2l0aCB0aGUgc2VsZWN0ZWQgcmFuZ2UuLi4KKwkJCS8vIHNvIDIgcGVyIGNoYXJ0IFMsIFNzZWxlY3RlZCwgb3IgSSwgSXNlbGVjdGVkLCBldGMuCisJCQlyZXR1cm4gMjsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJCisJLyoqCisJICogRWFjaCBDb250cm9sIGNsYXNzIG1heSBhZGQgb2JqZWN0cyB0byB0aGlzIG1hcAorCSAqIEByZXR1cm4gdGhlIGNvbnRyb2wgcGFyYW1ldGVycyBtYXBzCisJICovCisJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0Q29udHJvbFBhcmFtZXRlcnNNYXAoKSB7CisJCS8vIGFkZCBub3RoaW5nIGZvciBub3cKKwkJY29udHJvbFBhcmFtZXRlcnNNYXAucHV0KE1JTl9TX0tFWSwgbmV3IERvdWJsZShnZXRNaW5UaHJlc2hvbGRTKCkpKTsKKwkJY29udHJvbFBhcmFtZXRlcnNNYXAucHV0KE1JTl9FX0tFWSwgbmV3IERvdWJsZShnZXRNaW5UaHJlc2hvbGRFKCkpKTsKKwkJY29udHJvbFBhcmFtZXRlcnNNYXAucHV0KE1JTl9JX0tFWSwgbmV3IERvdWJsZShnZXRNaW5UaHJlc2hvbGRJKCkpKTsKKwkJY29udHJvbFBhcmFtZXRlcnNNYXAucHV0KE1JTl9SX0tFWSwgbmV3IERvdWJsZShnZXRNaW5UaHJlc2hvbGRSKCkpKTsKKwkJCisJCWNvbnRyb2xQYXJhbWV0ZXJzTWFwLnB1dChNQVhfU19LRVksIG5ldyBEb3VibGUoZ2V0TWF4VGhyZXNob2xkUygpKSk7CisJCWNvbnRyb2xQYXJhbWV0ZXJzTWFwLnB1dChNQVhfRV9LRVksIG5ldyBEb3VibGUoZ2V0TWF4VGhyZXNob2xkRSgpKSk7CisJCWNvbnRyb2xQYXJhbWV0ZXJzTWFwLnB1dChNQVhfSV9LRVksIG5ldyBEb3VibGUoZ2V0TWF4VGhyZXNob2xkSSgpKSk7CisJCWNvbnRyb2xQYXJhbWV0ZXJzTWFwLnB1dChNQVhfUl9LRVksIG5ldyBEb3VibGUoZ2V0TWF4VGhyZXNob2xkUigpKSk7CisJCQorCQlib29sZWFuIHN1bUFsbExvY2F0aW9ucyA9IGRhdGFBdmVyYWdlUmFkaW9CdXR0b25zWzFdLmdldFNlbGVjdGlvbigpOworCQlib29sZWFuIGZyZXFEZXBlbmRhbnRCZXRhTW9kZSA9IGJldGFNb2RlUmFkaW9CdXR0b25zWzBdLmdldFNlbGVjdGlvbigpOworCQkKKwkJY29udHJvbFBhcmFtZXRlcnNNYXAucHV0KFNVTV9MT0NBVElPTlNfS0VZLCBCb29sZWFuLnZhbHVlT2Yoc3VtQWxsTG9jYXRpb25zKSk7CisJCWNvbnRyb2xQYXJhbWV0ZXJzTWFwLnB1dChGUkVRX01PREVfS0VZLCBCb29sZWFuLnZhbHVlT2YoZnJlcURlcGVuZGFudEJldGFNb2RlKSk7CisJCQorCQkKKwkJCisJCXJldHVybiBjb250cm9sUGFyYW1ldGVyc01hcDsKKwl9CisKKwkKKworfSAvLyBFc3RpbWF0b3JDb250cm9sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9Fc3RpbWF0b3JGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9Fc3RpbWF0b3JGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY5M2ZhMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL0VzdGltYXRvckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUyIEBACisvLyBFc3RpbWF0b3JGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIEFuYWx5c2lzQ29udHJvbH0gaW5zdGFuY2VzLgorICovCitwdWJsaWMgY2xhc3MgRXN0aW1hdG9yRmFjdG9yeSBpbXBsZW1lbnRzIEFuYWx5c2lzQ29udHJvbEZhY3RvcnkgeworCisJLyoqCisJICogcHVibGljIElOU1RBTkNFIGZvciB0aGlzIEZhY3RvcnkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEVzdGltYXRvckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgRXN0aW1hdG9yRmFjdG9yeSgpOworCisJLyoqCisJICogQ29uc3RhbnRzIAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOQUxZU0lTX1RZUEUgPSAiRXN0aW1hdG9yIjsKKwkKKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gZGlyTmFtZQorCSAqIEByZXR1cm4gbmV3IEVzdGltYXRvckNvbnRyb2woKQorCSAqLworCXB1YmxpYyBBbmFseXNpc0NvbnRyb2wgY3JlYXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkaXJOYW1lKSB7CisJCQkJCisJCXJldHVybiBuZXcgRXN0aW1hdG9yQ29udHJvbChwYXJlbnQpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdHlwZSBvZiBhbmFseXNpcworCSAqIAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29udHJvbFR5cGUoKSB7CisJCXJldHVybiBBTkFMWVNJU19UWVBFOworCX0KKworfSAvLyBFc3RpbWF0b3JGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9Fc3RpbWF0b3JWaWV3LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9Fc3RpbWF0b3JWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0Y2JmMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL0VzdGltYXRvclZpZXcuamF2YQpAQCAtMCwwICsxLDY4IEBACisvLyBFc3RpbWF0b3JWaWV3IAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKKworLyoqCisgKiBUaGlzIHZpZXcgcHJvdmlkZXMgYSB0b29sIHRvIGVzdGltYXRlIG1vZGVsIHBhcmFtZXRlcnMgZm9yIGEgbW9kZWwgdGhhdCBtaWdodCBmaXQgYSBzZXQgb2YgcmVmZXJlbmNlIGRhdGEuCisgKi8KKworcHVibGljIGNsYXNzIEVzdGltYXRvclZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7CisKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgRXN0aW1hdG9yIFZpZXcge0B2YWx1ZX0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9Fc3RpbWF0b3JfVklFVyA9ICJvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuZXN0aW1hdG9yIjsgLy8kTk9OLU5MUy0xJAorCisKKwlwcml2YXRlIEFuYWx5c2lzVmlld2VyIGFuYWx5c2lzVmlld2VyOworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlhbmFseXNpc1ZpZXdlciA9IG5ldyBBbmFseXNpc1ZpZXdlcihwYXJlbnQsIEVzdGltYXRvckZhY3RvcnkuSU5TVEFOQ0UpOworCQlhbmFseXNpc1ZpZXdlci5zZXRJbnB1dChTaW11bGF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkpOworCisJCWdldFNpdGUoKS5zZXRTZWxlY3Rpb25Qcm92aWRlcihhbmFseXNpc1ZpZXdlcik7CisKKworCX0gLy8gY3JlYXRlUGFydENvbnRyb2wKKworCQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjZGlzcG9zZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0gLy8gZGlzcG9zZQorCisJLyoqCisJICogVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgaW50ZXJmYWNlLCBidXQgd2UncmUgbm90IHVzaW5nIGl0LgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJLy8gTm90aGluZworCX0gLy8gc2V0Rm9jdXMKKworfSAvLyBFc3RpbWF0b3JWaWV3CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9JUmVtb3ZlTGlzdGVuZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL0lSZW1vdmVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNjkyM2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9JUmVtb3ZlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDMwIEBACisvLyBJUmVtb3ZlTGlzdGVuZXIKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5JZGVudGlmaWFibGU7CisKKy8qKgorICogV2hlbiB0aGUgcmVtb3ZlIGJ1dHRvbiBpcyBwcmVzc2VkIGJ5IHRoZSB1c2VyCisgKiBAYXV0aG9yIEphbWVzCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIElSZW1vdmVMaXN0ZW5lciB7CisJLyoqCisJICogCisJICogQHBhcmFtIGlkZW50aWZpYWJsZQorCSAqLworCXZvaWQgaWRlbnRpZmlhYmxlUmVtb3ZlZChJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlKSA7CisJCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL0x5YXB1bm92Q29udHJvbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvTHlhcHVub3ZDb250cm9sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwNGU0NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL0x5YXB1bm92Q29udHJvbC5qYXZhCkBAIC0wLDAgKzEsNTYxIEBACisvLyBFc3RpbWF0b3JDb250cm9sLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkNvbG9yRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5pbXBsLkNvbG9yRGVmaW5pdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbG9yUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5TY2VuYXJpb0luaXRpYWxpemF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLkNTVkFuYWx5c2lzV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy5QaGFzZVNwYWNlQ29vcmRpbmF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMuU2NlbmFyaW9BbmFseXNpc1N1aXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIFNXVCBHVUkgY29tcG9uZW50IHRoYXQgdXNlcyBCSVJUIHRvIHBsb3QKKyAqLworcHVibGljIGNsYXNzIEx5YXB1bm92Q29udHJvbCBleHRlbmRzIEFuYWx5c2lzQ29udHJvbCB7CisJCisJCQorCS8qKgorCSAqIHVzZWQgdG8gaWRlbnRpZnkgdXNlciBwcmVmZXJlbmNlcyBmb3IgdGhpcyBjbGFzcworCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVU1FUiA9ICJMWUFQVU5PVl9DT05UUk9MIjsKKwkKKwkvKioKKwkgKiB1c2VkIHRvIHJlbWVtYmVyIHRoZSBwcmltYXJ5IGRpcmVjdG9yeSBpbiB0aGUgdXNlciBwcmVmZXJlbmNlcworCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNQVJZX0ZPTERFUl9LRVkgPSBDT05TVU1FUisiX1BSSU1BUlkiOworCS8qKgorCSAqIHVzZWQgdG8gcmVtZW1iZXIgdGhlIHNlY29uZGFyeSBkaXJlY3RvcnkgaW4gdGhlIHVzZXIgcHJlZmVyZW5jZXMKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EQVJZX0ZPTERFUl9LRVkgPSBDT05TVU1FUisiX1NFQ09OREFSWSI7CisKKwkvKioKKwkgKiAgRmlyc3QgU2NlbmFyaW8gTGFiZWwgLSBpbmRpY2F0ZXMgbnVtYmVyIG9mIHJlZ2lvbnMgYmVpbmcgd2F0Y2hlZCBmb3IgYW5hbHlzaXMuCisJICogIFRoZXJlIGFyZSBsb2NhdGlvbnMgd2l0aCByZWxhdGl2ZSB2YWx1ZSBoaXN0b3J5IHByb3ZpZGVycyBhdHRhY2hlZAorCSAqLworCUxhYmVsIGZpcnN0U2NlbmFyaW9Gb2xkZXJMYWJlbDsKKwkKKwkvKioKKwkgKiAgU2Vjb25kIFNjZW5hcmlvIExhYmVsIC0gaW5kaWNhdGVzIG51bWJlciBvZiByZWdpb25zIGJlaW5nIHdhdGNoZWQgZm9yIGFuYWx5c2lzLgorCSAqICBUaGVyZSBhcmUgbG9jYXRpb25zIHdpdGggcmVsYXRpdmUgdmFsdWUgaGlzdG9yeSBwcm92aWRlcnMgYXR0YWNoZWQKKwkgKi8KKwlMYWJlbCBzZWNvbmRTY2VuYXJpb0ZvbGRlckxhYmVsOworCQorCS8qKgorCSAqICBBIExhYmVsIHRvIGdpdmUgZmVlZGJhayBvbiB0aGUgY29tcHV0YXRpb24gYWN0aW9uCisJICovCisJLy9MYWJlbCB1c2VyRmVlZGJhY2tMYWJlbDsKKwkKKwkvKioKKwkgKiBGaXJzdCBpbnB1dCB0ZXh0IGZpZWxkIGZvciB0aGUgc2NlbmFyaW8gZm9sZGVyIG9mIGRhdGEgdG8gdXNlIGluIG1ha2luZyB0aGUgZXN0aW1hdGlvbgorCSAqLworCVRleHQgdGV4dDE7CisJCisKKwkvKioKKwkgKiBTZWNvbmQgSW5wdXQgdGV4dCBmaWVsZCBmb3IgdGhlIHNjZW5hcmlvIGZvbGRlciBvZiBkYXRhIHRvIGJlIGNvbXBhcmVkCisJICoqLworCVRleHQgdGV4dDI7CisJCisKKwkKKwkKKwkvKioKKwkgKiBBIGxhYmVsIHRvIHJlcG9ydCBzdGF0dXMgKG5vdCB5ZXQgdXNlZCkKKwkgKi8KKwlMYWJlbCBzdGF0dXNMYWJlbDsKKwkKKwkKKwkvKioKKwkgKiBSZXN1bHRzIG9mIGFuYWx5c2lzCisJICovCisJTGFiZWwgcmVzdWx0c0xhYmVsOworCQorCS8qKgorCSAqIHRoZSBjaGFydCBvZiB0d28gKG9yIG1vcmUpIHRyYWplY3RvcmllcyBpbiBwaGFzZSBzcGFjZQorCSAqLworCUx5YXB1bm92VHJhamVjdG9yeUNhbnZhcyBseWFwdW5vdlRyYWplY3RvcnlDYW52YXM7CisJCisJLyoqCisJICogdGhlIHRpbWUgc2VyaWVzIGNoYXJ0IG9mIHRoZSBkaXZlcmdlbmNlIG9mIHRoZSBMeWFwdW5vdiB0cmFqZWN0b3J5KGllcykgZnJvbSB0aGUgcmVmZXJlbmNlIHRyYWplY3RvcnkKKwkgKi8KKwlUaW1lU2VyaWVzQ2FudmFzIHRpbWVTZXJpZXNDYW52YXM7CisJLyoqCisJICogQ29sb3JzIGZvciB0aGUgdGltZSBzZXJpZXMgY2hhcnQKKwkgKi8KKwlzdGF0aWMgZmluYWwgQ29sb3JEZWZpbml0aW9uIGZvcmVHcm91bmQgPSBDb2xvckRlZmluaXRpb25JbXBsLmNyZWF0ZSgxODAsIDAsIDApOworCXN0YXRpYyBmaW5hbCBDb2xvckRlZmluaXRpb24gYmFja2dyb3VuZEdyb3VuZCA9IENvbG9yRGVmaW5pdGlvbkltcGwuY3JlYXRlKDI1NSwgMjU1LCAyMjUpOworCXN0YXRpYyBmaW5hbCBDb2xvckRlZmluaXRpb24gZnJhbWVDb2xvciA9IENvbG9yRGVmaW5pdGlvbkltcGwuV0hJVEUoKTsKKwkKKwkvKioKKwkgKiBMYWJlbCBmb3IgbGluZSBzZXJpZXMgRGF0YSAobGVnZW5kKQorCSAqLworCisJCisJLyoqCisJICogdGhlIHJlc3VsdHMgb2YgdmFyaW91cyBzY2VuYXJpbyBjb21wYXJpc29ucworCSAqIFRPRE86IGV2ZW50dWFsbHkgdGhpcyBtaWdodCBiZSBhIG1hcCBrZXllZCBieSBjb21wYXJpc29uIGlkCisJICogZm9yIG5vdyB0aGVyZSBpcyBvbmx5IG9uZSBjb21wYXJpc29uLCB0aGUgbWVhbiBzcXVhcmUgZGlmZmVyZW5jZS4KKwkgKi8KKwlMaXN0PFBoYXNlU3BhY2VDb29yZGluYXRlW10+IGNvbXBhcmlzb25WYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFBoYXNlU3BhY2VDb29yZGluYXRlW10+KCk7CisJCisJLyoqCisJICogdGhpcyBpcyB0aGUgY3VtdWxhdGl2ZSBkZXZpYXRpb24gYmV0d2VlbiB0aGUgdHJhamVjdG9yaWVzIChyZWxhdGl2ZSB0byB0aGUgcmVmZXJlbmNlCisJICogdHJhamVjdG9yeQorCSAqLworCUxpc3Q8RUxpc3Q8RG91YmxlPj4gY3VtdWxhdGl2ZURldmlhdGlvbiA9IG5ldyBBcnJheUxpc3Q8RUxpc3Q8RG91YmxlPj4oKTsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFlBUFVOT1ZfRklMRV9QUkVGSVggPSAiTHlhcHVub3ZBbmFseXNpcyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExZQVBVTk9WX0RFVklBVElPTl9GSUxFX1BSRUZJWCA9ICJMeWFwdW5vdkRldmlhdGlvbiI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9GT0xERVJfRElBTE9HX1RFWFQgPSAiUGljayBhIHNjZW5hcmlvIGZvbGRlciI7CisJCisJU2NlbmFyaW9BbmFseXNpc1N1aXRlIGFuYWx5emVyID0gbmV3IFNjZW5hcmlvQW5hbHlzaXNTdWl0ZSh0aGlzKTsKKwkKKwlDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlOworCQorCS8qKgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKi8KKwlwdWJsaWMgTHlhcHVub3ZDb250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50LCBTV1QuTm9uZSk7CisJCXBhcmVudENvbXBvc2l0ZSA9IHBhcmVudDsKKwkJY3JlYXRlQ29udGVudHMoKTsKKwl9IC8vIEVzdGltYXRvckNvbnRyb2wKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgY29udGVudHMgb2YgdGhlIHBsb3R0ZXIKKwkgKi8KKwlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7CisJCXNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKKwkJRGlzcGxheSBkaXNwbGF5ID0gdGhpcy5nZXREaXNwbGF5KCk7CisJCUNvbG9yIGxhYmVsQmFja2dyb3VuZCA9IG5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKDI0MCwgMjQwLCAyNDApKTsKKwkJaWRlbnRpZmlhYmxlVGl0bGUgPSBuZXcgTGFiZWwodGhpcywgU1dULkJPUkRFUik7CisJCWlkZW50aWZpYWJsZVRpdGxlLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJMWUEuVElUTEUiKSk7CisJCWlkZW50aWZpYWJsZVRpdGxlLnNldEJhY2tncm91bmQobGFiZWxCYWNrZ3JvdW5kKTsKKwkJLy9wcm9wZXJ0eVNlbGVjdG9yID0gbmV3IFByb3BlcnR5U2VsZWN0b3IodGhpcywgU1dULk5PTkUpOworCQkKKwkJCisJCQorCQkKKwkJc3RhdHVzTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULkJPUkRFUik7CisJCXN0YXR1c0xhYmVsLnNldEJhY2tncm91bmQobGFiZWxCYWNrZ3JvdW5kKTsKKwkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiIik7CisJCQorCQlmaXJzdFNjZW5hcmlvRm9sZGVyTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOworCQkvL2ZpcnN0U2NlbmFyaW9Gb2xkZXJMYWJlbC5zZXRCYWNrZ3JvdW5kKGxhYmVsQmFja2dyb3VuZCk7CisJCWZpcnN0U2NlbmFyaW9Gb2xkZXJMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiTFlBLkZPTERFUjFMQUJFTCIpKTsKKwkJCisJCXRleHQxID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7CisJICAgIHRleHQxLnNldEJvdW5kcygxMCwgMTAsIDEwMCwgMjApOworCSAgICBTdHJpbmcgcHJpbWFyeURpcj1wcmVmcy5nZXRSZWNlbnRGb2xkZXIoUFJJTUFSWV9GT0xERVJfS0VZKTsKKwkgICAgdGV4dDEuc2V0VGV4dChwcmltYXJ5RGlyKTsKKwkgICAgCisJICAgIHNlY29uZFNjZW5hcmlvRm9sZGVyTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOworCSAgICAvLyBzZWNvbmRTY2VuYXJpb0ZvbGRlckxhYmVsLnNldEJhY2tncm91bmQobGFiZWxCYWNrZ3JvdW5kKTsKKwkgICAgc2Vjb25kU2NlbmFyaW9Gb2xkZXJMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiTFlBLkZPTERFUjJMQUJFTCIpKTsKKwkJCisJCXRleHQyID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7CisJICAgIHRleHQyLnNldEJvdW5kcygxMCwgMTAsIDEwMCwgMjApOworCSAgICBTdHJpbmcgc2Vjb25kYXJ5RGlyPXByZWZzLmdldFJlY2VudEZvbGRlcihTRUNPTkRBUllfRk9MREVSX0tFWSk7CisJICAgIHRleHQyLnNldFRleHQoc2Vjb25kYXJ5RGlyKTsKKwkJICAKKwkgICAgQ29tcG9zaXRlIGFuYWx5emVCdXR0b25Db21wb3NpdGUgPSBnZXRBbmFseXplQnV0dG9uQ29tcG9zaXRlKHRoaXMsTWVzc2FnZXMuZ2V0U3RyaW5nKCJMWUEuQ09NUEFSSVNPTiIpKTsKKworCQlyZXN1bHRzTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULlNIQURPV19PVVQpOworCQlyZXN1bHRzTGFiZWwuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOworCQlyZXN1bHRzTGFiZWwuc2V0VGV4dCgiIik7CisJCQorCQlmaW5hbCBGb3JtRGF0YSB0aXRsZUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCWlkZW50aWZpYWJsZVRpdGxlLnNldExheW91dERhdGEodGl0bGVGb3JtRGF0YSk7CisJCXRpdGxlRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQl0aXRsZUZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXRpdGxlRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTUsIDApOworCQkKKwkJZmluYWwgRm9ybURhdGEgcmVzdWx0c0Zvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCXJlc3VsdHNMYWJlbC5zZXRMYXlvdXREYXRhKHJlc3VsdHNGb3JtRGF0YSk7CisJCXJlc3VsdHNGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXJlc3VsdHNGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDE1LCAwKTsKKwkJcmVzdWx0c0Zvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDc1LCAwKTsKKworCQorICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCS8vIFRleHRGaWVsZCBmb2xkZXIgbGFiZWwKKwkJZmluYWwgRm9ybURhdGEgZmlyc3RTY2VuYXJpb0ZvbGRlckxhYmVsRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJLy8gcHJvcGVydHlTZWxlY3RvckZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjU1ZMb2dnZXJDYW52YXMsCisJCS8vIDApOworCQlmaXJzdFNjZW5hcmlvRm9sZGVyTGFiZWxGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoaWRlbnRpZmlhYmxlVGl0bGUsIDApOworCQkvL2ZpcnN0U2NlbmFyaW9Gb2xkZXJMYWJlbEZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQlmaXJzdFNjZW5hcmlvRm9sZGVyTGFiZWxGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlmaXJzdFNjZW5hcmlvRm9sZGVyTGFiZWxGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxNSwgMCk7CisJCWZpcnN0U2NlbmFyaW9Gb2xkZXJMYWJlbC5zZXRMYXlvdXREYXRhKGZpcnN0U2NlbmFyaW9Gb2xkZXJMYWJlbEZvcm1EYXRhKTsKKwkJLy8gZmlyc3QgdGV4dCBmaWVsZCBmb3IgcGFyYW1ldGVyIEVzdGltYXRvcgorCQlmaW5hbCBGb3JtRGF0YSB0ZXh0MUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCXRleHQxRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGlkZW50aWZpYWJsZVRpdGxlLCAwKTsKKwkJLy90ZXh0MUZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQl0ZXh0MUZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZmlyc3RTY2VuYXJpb0ZvbGRlckxhYmVsLCAwKTsKKwkJdGV4dDFGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCg3NSwgMCk7CisJCXRleHQxLnNldExheW91dERhdGEodGV4dDFGb3JtRGF0YSk7CisJCQorCQlCdXR0b24gc2VsZWN0Rm9sZGVyMUJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcywgU1dULk5PTkUpOworCQlzZWxlY3RGb2xkZXIxQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJMWUEuU0VMRUNURk9MREVSIikpOworCQlmaW5hbCBGb3JtRGF0YSBzZWxlY3RGb2xkZXIxRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJc2VsZWN0Rm9sZGVyMUZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChpZGVudGlmaWFibGVUaXRsZSwgMCk7CisJCS8vc2VsZWN0Rm9sZGVyMUZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQlzZWxlY3RGb2xkZXIxRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCh0ZXh0MSwgMCk7CisJCXNlbGVjdEZvbGRlcjFGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQlzZWxlY3RGb2xkZXIxQnV0dG9uLnNldExheW91dERhdGEoc2VsZWN0Rm9sZGVyMUZvcm1EYXRhKTsKKwkJCisJCWZpbmFsIFNoZWxsIHNoZWxsID0gdGhpcy5nZXRTaGVsbCgpOworCQkKKwkJc2VsZWN0Rm9sZGVyMUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQlmaW5hbCBTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJZmluYWwgRGlyZWN0b3J5RGlhbG9nIGRkID0gbmV3IERpcmVjdG9yeURpYWxvZygKKwkJCQkJCXNoZWxsLCBTV1QuT1BFTik7CisJCQkJCWRkLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJMWUEuU0VMRUNURk9MREVSRElBTE9HIikpOyAvLyROT04tTkxTLTEkCisJCQkJCVN0cmluZyBiZWdpblNlYXJjaCA9IHRleHQxLmdldFRleHQoKTsKKwkJCQkJaWYoKGJlZ2luU2VhcmNoPT1udWxsKXx8KGJlZ2luU2VhcmNoLmxlbmd0aCgpPDEpKSBiZWdpblNlYXJjaCA9IFJPT1RfUEFUSDsKKwkJCQkJCisJCQkJCWRkLnNldEZpbHRlclBhdGgoYmVnaW5TZWFyY2gpOworCQkJCQlmaW5hbCBTdHJpbmcgc2VsZWN0ZWQgPSBkZC5vcGVuKCk7CisJCQkJCWlmKHNlbGVjdGVkIT1udWxsKSB0ZXh0MS5zZXRUZXh0KHNlbGVjdGVkKTsKKwkJCX0KKwkJfSk7CisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCisJLy8JYm90dG9tICs9IGRlbHRhQm90dG9tOworCQkKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLyBUZXh0RmllbGQgZm9sZGVyIGxhYmVsCisJCWZpbmFsIEZvcm1EYXRhIHNlY29uZFNjZW5hcmlvRm9sZGVyTGFiZWxGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQkvLyBwcm9wZXJ0eVNlbGVjdG9yRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNTVkxvZ2dlckNhbnZhcywKKwkJLy8gMCk7CisJCXNlY29uZFNjZW5hcmlvRm9sZGVyTGFiZWxGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2VsZWN0Rm9sZGVyMUJ1dHRvbiwgMCk7CisJLy8gIHNlY29uZFNjZW5hcmlvRm9sZGVyTGFiZWxGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQodGV4dDIsIDApOworCQlzZWNvbmRTY2VuYXJpb0ZvbGRlckxhYmVsRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJc2Vjb25kU2NlbmFyaW9Gb2xkZXJMYWJlbEZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDE1LCAwKTsKKwkJc2Vjb25kU2NlbmFyaW9Gb2xkZXJMYWJlbC5zZXRMYXlvdXREYXRhKHNlY29uZFNjZW5hcmlvRm9sZGVyTGFiZWxGb3JtRGF0YSk7CisJCS8vIGZpcnN0IHRleHQgZmllbGQgZm9yIHBhcmFtZXRlciBFc3RpbWF0b3IKKwkJZmluYWwgRm9ybURhdGEgdGV4dDJGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQl0ZXh0MkZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChzZWxlY3RGb2xkZXIxQnV0dG9uLCAwKTsKKwkvLwl0ZXh0MkZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQl0ZXh0MkZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2Vjb25kU2NlbmFyaW9Gb2xkZXJMYWJlbCwgMCk7CisJCXRleHQyRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNzUsIDApOworCQl0ZXh0Mi5zZXRMYXlvdXREYXRhKHRleHQyRm9ybURhdGEpOworCQkKKwkJQnV0dG9uIHNlbGVjdEZvbGRlcjJCdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5OT05FKTsKKwkJc2VsZWN0Rm9sZGVyMkJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiTFlBLlNFTEVDVEZPTERFUiIpKTsKKwkJZmluYWwgRm9ybURhdGEgc2VsZWN0Rm9sZGVyMkZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCXNlbGVjdEZvbGRlcjJGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2VsZWN0Rm9sZGVyMUJ1dHRvbiwgMCk7CisJLy8Jc2VsZWN0Rm9sZGVyMkZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQlzZWxlY3RGb2xkZXIyRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCh0ZXh0MiwgMCk7CisJCXNlbGVjdEZvbGRlcjJGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQlzZWxlY3RGb2xkZXIyQnV0dG9uLnNldExheW91dERhdGEoc2VsZWN0Rm9sZGVyMkZvcm1EYXRhKTsKKwkJCisJCXNlbGVjdEZvbGRlcjJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQkJZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWZpbmFsIERpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coCisJCQkJCQlzaGVsbCwgU1dULk9QRU4pOworCQkJCQlkZC5zZXRUZXh0KFNFTEVDVF9GT0xERVJfRElBTE9HX1RFWFQpOyAvLyROT04tTkxTLTEkCisJCQkJCVN0cmluZyBiZWdpblNlYXJjaCA9IHRleHQyLmdldFRleHQoKTsKKwkJCQkJaWYoKGJlZ2luU2VhcmNoPT1udWxsKXx8KGJlZ2luU2VhcmNoLmxlbmd0aCgpPDEpKSBiZWdpblNlYXJjaCA9IFJPT1RfUEFUSDsKKwkJCQkJCisJCQkJCWRkLnNldEZpbHRlclBhdGgoYmVnaW5TZWFyY2gpOworCQkJCQlmaW5hbCBTdHJpbmcgc2VsZWN0ZWQgPSBkZC5vcGVuKCk7CisJCQkJCWlmKHNlbGVjdGVkIT1udWxsKSB0ZXh0Mi5zZXRUZXh0KHNlbGVjdGVkKTsKKwkJCX0KKwkJfSk7CisJCQorCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCQorCS8vCWJvdHRvbSArPSBkZWx0YUJvdHRvbTsKKwkJLy8gQW5hbHl6ZUJ1dHRvbgorCQlmaW5hbCBGb3JtRGF0YSBhbmFseXNpc0J1dHRvbkZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCS8vIHByb3BlcnR5U2VsZWN0b3JGb3JtRGF0YVgudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHByb3BlcnR5U2VsZWN0b3JZLAorCQkvLyAwKTsKKwkJYW5hbHlzaXNCdXR0b25Gb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2VsZWN0Rm9sZGVyMkJ1dHRvbiwgMCk7CisJCS8vYW5hbHlzaXNCdXR0b25Gb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tLCAwKTsKKwkJYW5hbHlzaXNCdXR0b25Gb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlhbmFseXNpc0J1dHRvbkZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCWFuYWx5emVCdXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShhbmFseXNpc0J1dHRvbkZvcm1EYXRhKTsKKwkJCisJCQorCQkKKwkJLy8gVHJhamVjdG9yaWVzCisJCWx5YXB1bm92VHJhamVjdG9yeUNhbnZhcyA9IG5ldyBMeWFwdW5vdlRyYWplY3RvcnlDYW52YXModGhpcyk7CisJCWZpbmFsIEZvcm1EYXRhIHRyYWplY3RvcnlDaGFydEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCWx5YXB1bm92VHJhamVjdG9yeUNhbnZhcy5zZXRMYXlvdXREYXRhKHRyYWplY3RvcnlDaGFydEZvcm1EYXRhKTsKKwkJdHJhamVjdG9yeUNoYXJ0Rm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGFuYWx5emVCdXR0b25Db21wb3NpdGUsIDApOworCQl0cmFqZWN0b3J5Q2hhcnRGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJdHJhamVjdG9yeUNoYXJ0Rm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJdHJhamVjdG9yeUNoYXJ0Rm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIDApOworCQkKKwkJLy8gZGl2ZXJnZW5jZSBncmFwaAorCQl0aW1lU2VyaWVzQ2FudmFzID0gbmV3IFRpbWVTZXJpZXNDYW52YXModGhpcywKKwkJCQkJCQkJCQkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkxZQS5ESVZFUkdFTkNFTEVHRU5EIiksCisJCQkJCQkJCQkJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJMWUEuRElWRVJHRU5DRVlBWElTIiksCisJCQkJCQkJCQkJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJMWUEuRElWRVJHRU5DRVlBWElTIiksCisJCQkJCQkJCQkJCQkJZm9yZUdyb3VuZCwKKwkJCQkJCQkJCQkJCQliYWNrZ3JvdW5kR3JvdW5kLAorCQkJCQkJCQkJCQkJCWZyYW1lQ29sb3IsIDApOworCQkKKwkJCisJCQorCQlmaW5hbCBGb3JtRGF0YSBhbmFseXNpc0NoYXJ0Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJdGltZVNlcmllc0NhbnZhcy5zZXRMYXlvdXREYXRhKGFuYWx5c2lzQ2hhcnRGb3JtRGF0YSk7CisJCWFuYWx5c2lzQ2hhcnRGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYW5hbHl6ZUJ1dHRvbkNvbXBvc2l0ZSwgMCk7CisJCWFuYWx5c2lzQ2hhcnRGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJYW5hbHlzaXNDaGFydEZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIDApOworCQlhbmFseXNpc0NoYXJ0Rm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJCisJCQorCQlmaW5hbCBQcm9ncmVzc01vbml0b3JEaWFsb2cgcHJvZ3Jlc3NEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSk7CisKKwkJYW5hbHl6ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQlmaW5hbCBTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCisJCQkJU3RyaW5nIHJlZmVyZW5jZURpcmVjdG9yeSAgPSB0ZXh0MS5nZXRUZXh0KCk7CisJCQkJU3RyaW5nIGNvbXBhcmlzb25EaXJlY3RvcnkgPSB0ZXh0Mi5nZXRUZXh0KCk7CisJCQkJRGlzcGxheSBkaXNwbGF5ID0gcGFyZW50Q29tcG9zaXRlLmdldERpc3BsYXkoKTsKKwkJCQkvKgorCQkJCSAqIHJlc2V0IHRoZSBsYWJlbCB0ZXh0CisJCQkJICovCisJCQkgICAgaWRlbnRpZmlhYmxlVGl0bGUuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkxZQS5USVRMRSIpKTsKKwkJCSAgICByZXN1bHRzTGFiZWwuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOworCQkJICAgIHJlc3VsdHNMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiTFlBLldPUktJTkciKSk7CisJCQkgICAgLyoKKwkJCQkgKiByZWluaXRpYWxpemUgdGhlIGdyYXBoCisJCQkJICovCisJCQkJY29tcGFyaXNvblZhbHVlcy5jbGVhcigpOworCQkJCWN1bXVsYXRpdmVEZXZpYXRpb24uY2xlYXIoKTsKKwkJCQlseWFwdW5vdlRyYWplY3RvcnlDYW52YXMucmVzZXQoKTsKKwkJCSAgICAKKwkJCQkvKgorCQkJCSAqIFZBTElEQVRFIHRoZSB0ZXh0IGlucHV0IEZpZWxkcworCQkJCSAqLworCQkJCWlmKCFhbmFseXplci52YWxpZGF0ZShyZWZlcmVuY2VEaXJlY3RvcnkpKSB7CisJCQkJCWlkZW50aWZpYWJsZVRpdGxlLnNldFRleHQoU2NlbmFyaW9BbmFseXNpc1N1aXRlLk5PVF9GT1VORF9NU0cpOworCQkJCQl0ZXh0MS5zZXRUZXh0KCIiKTsKKwkJCQl9CisgICAgICAgICAgICAgICAgaWYoIWFuYWx5emVyLnZhbGlkYXRlKGNvbXBhcmlzb25EaXJlY3RvcnkpKSB7CisgICAgICAgICAgICAgICAgCWlkZW50aWZpYWJsZVRpdGxlLnNldFRleHQoU2NlbmFyaW9BbmFseXNpc1N1aXRlLk5PVF9GT1VORF9NU0cpOworICAgICAgICAgICAgICAgIAl0ZXh0Mi5zZXRUZXh0KCIiKTsKKwkJCQl9CisgICAgICAgICAgICAgICAgaWYoKCFhbmFseXplci52YWxpZGF0ZShyZWZlcmVuY2VEaXJlY3RvcnkpKSB8fCAoIWFuYWx5emVyLnZhbGlkYXRlKGNvbXBhcmlzb25EaXJlY3RvcnkpKSkgeworICAgICAgICAgICAgICAgIAlyZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorCQkJCXRyeSB7CisJCQkJCQorCQkJCQlMaXN0PFBoYXNlU3BhY2VDb29yZGluYXRlW10+IGRhdGEgPSBhbmFseXplci5nZXRMeWFwdW5vdlRyYWplY3RvcnkocmVmZXJlbmNlRGlyZWN0b3J5LCBjb21wYXJpc29uRGlyZWN0b3J5LCBwcm9ncmVzc0RpYWxvZyk7CisJCQkJCWlmKGRhdGE9PW51bGwpIHsKKwkJCQkJCXJlc3VsdHNMYWJlbC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOworCQkJCQkgICAgcmVzdWx0c0xhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJMWUEuRVJST1IxIikpOworCQkJCQkgICAgCisJCQkJCX0gZWxzZSB7CisJCQkJCQljb21wYXJpc29uVmFsdWVzLmFkZEFsbChkYXRhKTsKKwkJCQkJCS8vc3VjY2Vzcy4uLiByZW1lbWJlciB0aGUgdXNlcnMgcHJlZnMKKwkJCQkJCXByZWZzLnNldFJlY2VudEZvbGRlcihQUklNQVJZX0ZPTERFUl9LRVkscmVmZXJlbmNlRGlyZWN0b3J5KTsKKwkJCQkJCXByZWZzLnNldFJlY2VudEZvbGRlcihTRUNPTkRBUllfRk9MREVSX0tFWSxjb21wYXJpc29uRGlyZWN0b3J5KTsKKwkJCQkJCQorCQkJCQkJY3VtdWxhdGl2ZURldmlhdGlvbi5hZGRBbGwoU2NlbmFyaW9BbmFseXNpc1N1aXRlLmdldEN1bXVsYXRpdmVQaGFzZVNwYWNlRGV2aWF0aW9uKGNvbXBhcmlzb25WYWx1ZXMpKTsKKwkJCQkJCQorCQkJCQkJLy8KKwkJCQkJCS8vIG5vdyB1ZGF0ZSBldmVyeXRoaW5nCisJCQkJCQkvLworCQkJCQkJbHlhcHVub3ZUcmFqZWN0b3J5Q2FudmFzLmRyYXcoKTsKKwkJCQkJCS8vIExvZyB0aGUgdHJhamVjdG9yeSBkYXRhCisJCQkJCQlTdHJpbmcgb3V0RmlsZU5hbWUgPSBMWUFQVU5PVl9GSUxFX1BSRUZJWCsiXyIrCisJCQkJCQkgZ2V0U2NlbmFyaW9OYW1lRnJvbURpcmVjdG9yeU5hbWUocmVmZXJlbmNlRGlyZWN0b3J5KSsKKwkJCQkJCSAiXyIrCisJCQkJCQkgZ2V0U2NlbmFyaW9OYW1lRnJvbURpcmVjdG9yeU5hbWUoY29tcGFyaXNvbkRpcmVjdG9yeSk7CisJCQkJCQkKKwkJCQkJCUNTVkFuYWx5c2lzV3JpdGVyIHdyaXRlciA9IG5ldyBDU1ZBbmFseXNpc1dyaXRlcihvdXRGaWxlTmFtZSk7CisJCQkJCQl3cml0ZXIubG9nRGF0YSgyLGNvbXBhcmlzb25WYWx1ZXMpOworCisJCQkJCQkvLyBMb2cgdGhlIGN1bXVsYXRpdmUgZGV2aWF0aW9uIGRhdGEKKwkJCQkJCW91dEZpbGVOYW1lID0gTFlBUFVOT1ZfREVWSUFUSU9OX0ZJTEVfUFJFRklYKyJfIisKKwkJCQkJCSBnZXRTY2VuYXJpb05hbWVGcm9tRGlyZWN0b3J5TmFtZShyZWZlcmVuY2VEaXJlY3RvcnkpKworCQkJCQkJICJfIisKKwkJCQkJCSBnZXRTY2VuYXJpb05hbWVGcm9tRGlyZWN0b3J5TmFtZShjb21wYXJpc29uRGlyZWN0b3J5KTsKKwkJCQkJCSBDU1ZBbmFseXNpc1dyaXRlciB3cml0ZXIyID0gbmV3IENTVkFuYWx5c2lzV3JpdGVyKG91dEZpbGVOYW1lKTsKKwkJCQkJCSB3cml0ZXIyLmxvZ0RhdGEoY3VtdWxhdGl2ZURldmlhdGlvbik7CisJCQkJCQkgdGltZVNlcmllc0NhbnZhcy5kcmF3KCk7CisJCQkJCQkgcmVzdWx0c0xhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJMWUEuQ09NUExFVEUiKSk7CisJCQkJCX0KKyAJCQkJCQorCQkJCX0gY2F0Y2goU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiBzaWUpIHsKKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCIiLCBzaWUpOworCQkJCX0KKwkJCQkKKwkJCQkvLyBkb25lCisJCQl9CisJCX0pOworCQkKKwl9IC8vIGNyZWF0ZUNvbnRlbnRzCisJCisJCisJCisKKworCS8qKgorCSAqIEBwYXJhbSBkaXJOYW1lCisJICogQHJldHVybiBzaG9ydCBuYW1lIG9mIHNjZW5hcmlvCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2NlbmFyaW9OYW1lRnJvbURpcmVjdG9yeU5hbWUoU3RyaW5nIGRpck5hbWUpIHsKKwkJaW50IGxhc3QgPSBkaXJOYW1lLmxhc3RJbmRleE9mKCIvIik7CisJCWludCBsYXN0MiA9IGRpck5hbWUubGFzdEluZGV4T2YoIlxcIik7CisJCWlmIChsYXN0MiA+IGxhc3QpCisJCQlsYXN0ID0gbGFzdDI7CisJCWlmIChsYXN0IDw9IDApCisJCQlsYXN0ID0gMDsKKwkJU3RyaW5nIHJldFZhbCA9IGRpck5hbWUuc3Vic3RyaW5nKGxhc3QgKyAxLCBkaXJOYW1lLmxlbmd0aCgpKTsKKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJLyoqCisJICogVGhpcyByZXR1cm5zIHRoZSByZXN1bHRzIG9mIGEgY29tcGFyaXNvbiBvZiB0eXBlIGNvbXBhcmlzb25UeXBlCisJICogYXMgYW4gYXJyYXkgb2YgZG91YmxlLiAKKwkgKiAKKwkgKiBAcGFyYW0gdHJhamVjdG9yeSB0aGUgdHJhamVjdG9yeSB0byByZXR1cm4KKwkgKiBAcmV0dXJuIGNvbXBhcmlzb24KKwkgKi8KKwlwdWJsaWMgUGhhc2VTcGFjZUNvb3JkaW5hdGVbXSBnZXRQb2ludFZhbHVlcyhpbnQgdHJhamVjdG9yeSkgeworCQkKKwkJcmV0dXJuIGNvbXBhcmlzb25WYWx1ZXMuZ2V0KHRyYWplY3RvcnkpOworCX0KKwkKKwkvKioKKwkgKiByZXR1cm5zIHRoZSBhbmFseXNpcyBvZiBseWFwdW5vdiB0cmFjdG9yeShpZXMpIHJlbGF0aXZlIHRvIHJlZmVyZW5jZS4KKwkgKiBAcGFyYW0gY2hhcnRJbmRleCBub3QgdXNlZCAob25seSBvbmUgY2hhcnQpCisJICogQHBhcmFtIHRyYWplY3RvcnkgCisJICogQHJldHVybiBDdW11bGF0aXZlIGRldmlhdGlvbiBmcm9tIHJlZmVyZW5jZSB0cmFqZWN0b3J5CisJICovCisJQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCisJQE92ZXJyaWRlCisJcHVibGljIGRvdWJsZVtdIGdldFZhbHVlcyhpbnQgY2hhcnRJbmRleCwgaW50IHRyYWplY3RvcnkpIHsKKwkJCisJCUVMaXN0PERvdWJsZT4gbCA9IGN1bXVsYXRpdmVEZXZpYXRpb24uZ2V0KHRyYWplY3RvcnkpOworCQlkb3VibGUgW10gcmVzID0gbmV3IGRvdWJsZVtsLnNpemUoKV07CisJCWZvcihpbnQgaT0wO2k8cmVzLmxlbmd0aDsrK2kpIHJlc1tpXSA9IGwuZ2V0KGkpOworCQlyZXR1cm4gcmVzOworCX0KKworCS8qKgorCSAqIE5vdCB1c2VkCisJICogQHBhcmFtIGNoYXJ0SW5kZXggbm90IHVzZWQgKG9ubHkgb25lIGNoYXJ0KQorCSAqIEBwYXJhbSBzdGF0ZQorCSAqIEByZXR1cm4gcHJvcGVydHkgbmFtZQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoaW50IGNoYXJ0SW5kZXgsIGludCBzdGF0ZSkgeworCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJMWUEuRElWRVJHRU5DRVlBWElTIik7CisJfQorCQorCS8qKgorCSAqIE9ubHkgb25lIHByb3BlcnR5IHRvIHBsb3QgPSB0aGUgUk1TIGRpZmZlcmVuY2UKKwkgKiBAcGFyYW0gY2hhcnRJbmRleCBub3QgdXNlZCAob25seSBvbmUgY2hhcnQpCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHByb3BlcnRpZXMKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5BbmFseXNpc0NvbnRyb2wjZ2V0TnVtUHJvcGVydGllcyhpbnQgY2hhcnRJbmRleCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGdldE51bVByb3BlcnRpZXMoaW50IGNoYXJ0SW5kZXgpIHsKKwkJcmV0dXJuIDE7CisJfQorCisKKwkKKwkKKwkvKioKKwkgKiB0byByZW1vdmUgdGhlIGNvbnRyb2wgZS5nLiBieSBhIHJlbW92ZSBidXR0b24gZXZlbnQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisJCXVwZGF0ZVN0YXR1c0xhYmVsKCk7CisJfQorCisJCisJCisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0dXNMYWJlbCgpIHsKKwkJc3RhdHVzTGFiZWwuc2V0VGV4dChBbmFseXNpc0NvbnRyb2wuU1RBVFVTX1RFWFQpOworCX0KKwkKKwkKKworCS8qKgorCSAqIEluaXRpYWxpemUgdGhlIGhlYWRlciBsYWJlbAorCSAqIAorCSAqIEBwYXJhbSBmb2xkZXJOYW1lCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUhlYWRlcihTdHJpbmcgZm9sZGVyTmFtZSkgeworCQlzaW11bGF0aW9uTmFtZUxhYmVsLnNldFRleHQoImFuYWx5emluZyAiK2ZvbGRlck5hbWUpOworCisJfSAvLyBpbml0aWFsaXplRnJvbVNpbXVsYXRpb24KKworCisJCisJCisJCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkJCQkJCisJCXN1cGVyLmRpc3Bvc2UoKTsKKwkJCisJfSAvLyBkaXNwb3NlCisKKwkvKioKKwkgKiBFYWNoIENvbnRyb2wgY2xhc3MgbWF5IGFkZCBvYmplY3RzIHRvIHRoaXMgbWFwCisJICogQHJldHVybiB0aGUgY29udHJvbCBwYXJhbWV0ZXJzIG1hcHMKKwkgKi8KKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRDb250cm9sUGFyYW1ldGVyc01hcCgpIHsKKwkJLy8gYWRkIG5vdGhpbmcgZm9yIG5vdworCQlyZXR1cm4gY29udHJvbFBhcmFtZXRlcnNNYXA7CisJfQorCQorCit9IC8vIEVzdGltYXRvckNvbnRyb2wKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL0x5YXB1bm92RmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvTHlhcHVub3ZGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMwZmFhNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL0x5YXB1bm92RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8vIEVzdGltYXRvckZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBmYWN0b3J5IGZvciBjcmVhdGluZyB7QGxpbmsgQW5hbHlzaXNDb250cm9sfSBpbnN0YW5jZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBMeWFwdW5vdkZhY3RvcnkgaW1wbGVtZW50cyBBbmFseXNpc0NvbnRyb2xGYWN0b3J5IHsKKworCS8qKgorCSAqIHB1YmxpYyBJTlNUQU5DRSBmb3IgdGhpcyBGYWN0b3J5CisJICovCisJcHVibGljIHN0YXRpYyBMeWFwdW5vdkZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgTHlhcHVub3ZGYWN0b3J5KCk7CisKKwkvKioKKwkgKiBDb25zdGFudHMgCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5BTFlTSVNfVFlQRSA9ICJMeWFwdW5vdiI7CisJCisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50CisJICogQHBhcmFtIGRpck5hbWUKKwkgKiBAcmV0dXJuIG5ldyBMeWFwdW5vdkNvbnRyb2woKQorCSAqLworCXB1YmxpYyBBbmFseXNpc0NvbnRyb2wgY3JlYXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkaXJOYW1lKSB7CisJCQkJCisJCXJldHVybiBuZXcgTHlhcHVub3ZDb250cm9sKHBhcmVudCk7CisJfQorCQorCisJLyoqCisJICogQHJldHVybiB0eXBlIG9mIGFuYWx5c2lzCisJICogCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb250cm9sVHlwZSgpIHsKKwkJcmV0dXJuIEFOQUxZU0lTX1RZUEU7CisJfQorCit9IC8vIEVzdGltYXRvckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL0x5YXB1bm92VHJhamVjdG9yeUNhbnZhcy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvTHlhcHVub3ZUcmFqZWN0b3J5Q2FudmFzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcwNjBkOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL0x5YXB1bm92VHJhamVjdG9yeUNhbnZhcy5qYXZhCkBAIC0wLDAgKzEsNDAwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5kZXZpY2UuSURldmljZVJlbmRlcmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQuZXhjZXB0aW9uLkNoYXJ0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQuZmFjdG9yeS5HZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5DaGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLkNoYXJ0V2l0aEF4ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuQXhpc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuQm91bmRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkNvbG9yRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5JbnRlcnNlY3Rpb25UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLlRpY2tTdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5pbXBsLkJvdW5kc0ltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuaW1wbC5Db2xvckRlZmluaXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuY29tcG9uZW50LkF4aXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5jb21wb25lbnQuU2VyaWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuY29tcG9uZW50LmltcGwuU2VyaWVzSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuTnVtYmVyRGF0YVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuU2VyaWVzRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuaW1wbC5OdW1iZXJEYXRhRWxlbWVudEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5kYXRhLmltcGwuTnVtYmVyRGF0YVNldEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5kYXRhLmltcGwuU2VyaWVzRGVmaW5pdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5pbXBsLkNoYXJ0V2l0aEF4ZXNJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwubGF5b3V0LkxlZ2VuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmxheW91dC5QbG90OworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwudHlwZS5MaW5lU2VyaWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwudHlwZS5TY2F0dGVyU2VyaWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwudHlwZS5pbXBsLlNjYXR0ZXJTZXJpZXNJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQudXRpbC5QbHVnaW5TZXR0aW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy5QaGFzZVNwYWNlQ29vcmRpbmF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKKworLyoqCisgKiBMeWFwdW5vdkNvbXBhcmlzb25DYW52YXMgaXMgYSBzdWJjbGFzcyBvZiB7QGxpbmsgQ2FudmFzfSBzdWl0YWJsZSBmb3IgY2hhcnQKKyAqIGRyYXdpbmdzLgorICovCitwdWJsaWMgY2xhc3MgTHlhcHVub3ZUcmFqZWN0b3J5Q2FudmFzIGV4dGVuZHMgQ2FudmFzIHsKKworCXByb3RlY3RlZCBJRGV2aWNlUmVuZGVyZXIgaWRyID0gbnVsbDsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHtAbGluayBDaGFydH0gdGhhdCBwbG90cyB0aGUgcmVsYXRpdmUgdmFsdWVzLgorCSAqLworCXByb3RlY3RlZCBDaGFydCBjbSA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY29udHJvbCBmb3IgdGhpcyBjYW52YXMKKwkgKi8KKwlwcml2YXRlIEx5YXB1bm92Q29udHJvbCBjb250cm9sID0gbnVsbDsKKworCS8qKgorCSAqIFRoZXNlIGFyZSB0aGUgdmFsdWVzIHRoYXQgd2lsbCBiZSBwbG90dGVkIGluIFgKKwkgKiAKKwkgKi8KKwlwcml2YXRlIGZpbmFsIExpc3Q8TGlzdDxEb3VibGU+PiByZWxhdGl2ZVZhbHVlc1ggPSBuZXcgQXJyYXlMaXN0PExpc3Q8RG91YmxlPj4oKTsKKworCS8qKgorCSAqIFRoZXNlIGFyZSB0aGUgdmFsdWVzIHRoYXQgd2lsbCBiZSBwbG90dGVkIGluIFkKKwkgKiAKKwkgKi8KKwlwcml2YXRlIGZpbmFsIExpc3Q8TGlzdDxEb3VibGU+PiByZWxhdGl2ZVZhbHVlc1kgPSBuZXcgQXJyYXlMaXN0PExpc3Q8RG91YmxlPj4oKTsKKworCS8qKgorCSAqIENoYXJ0IGdlbmVyYXRvciBpbnN0YW5jZSAocmVmZXJlbmNlIHRvIGEgc2luZ2xldG9uKQorCSAqLworCUdlbmVyYXRvciBncjsKKworCXByaXZhdGUgZmluYWwgTGlzdDxMaW5lU2VyaWVzPiBsaW5lU2VyaWVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8TGluZVNlcmllcz4oKTsKKwlBeGlzIHlBeGlzUHJpbWFyeTsKKwlBeGlzIHhBeGlzUHJpbWFyeTsKKwlkb3VibGUgbWF4WCA9IC0xLjA7CisJZG91YmxlIG1heFkgPSAtMS4wOworCisJQ29sb3JEZWZpbml0aW9uW10gbGluZUNvbG9ycyA9IHsgQ29sb3JEZWZpbml0aW9uSW1wbC5SRUQoKSwKKwkJCUNvbG9yRGVmaW5pdGlvbkltcGwuQkxVRSgpLCBDb2xvckRlZmluaXRpb25JbXBsLk9SQU5HRSgpLAorCQkJQ29sb3JEZWZpbml0aW9uSW1wbC5ZRUxMT1coKSwgQ29sb3JEZWZpbml0aW9uSW1wbC5HUkVFTigpLAorCQkJQ29sb3JEZWZpbml0aW9uSW1wbC5QSU5LKCksIENvbG9yRGVmaW5pdGlvbkltcGwuQkxBQ0soKSB9OworCisJLyoqCisJICogVE9ETyBldmVudHVhbGx5IHRoaXMgc2hvdWxkIG5vdCBiZSBoYXJkIGNvZGVkIGJ1dCBzaG91bGQgYmUgYmFzZWQgb24gdGhlCisJICogbnVtYmVyIG9mIGZpbGVzIGJlaW5nIHJlYWQgaW4gaW4gdGhlIEdVSQorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fVFJBSkVDVE9SSUVTID0gMjsKKworCS8qKgorCSAqIExhYmVsIGZvciBUaW1lIGFjY2VzcyAoVE9ETyBuZWVkIHRvIG5scyB0aGlzKQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVfTEFCRUwgPSAidGltZSI7CisKKwkvKioKKwkgKiBMYWJlbCBmb3IgbGluZSBzZXJpZXMgSWRlbnRpZmllciAobGVnZW5kKQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJNU19MQUJFTCA9ICJJW0FdIHZzIElbQl0iOworCisJSW1hZ2UgaW1nQ2hhcnQgPSBudWxsOworCQorCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIHRoZSBTV1QgcGFyZW50IG9mIHRoZSB7QGxpbmsgV2lkZ2V0fQorCSAqLworCXB1YmxpYyBMeWFwdW5vdlRyYWplY3RvcnlDYW52YXMoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQsIFNXVC5ET1VCTEVfQlVGRkVSRUQgfCBTV1QuQk9SREVSKTsKKwkJd2hpbGUgKHJlbGF0aXZlVmFsdWVzWC5zaXplKCkgPCBOVU1fVFJBSkVDVE9SSUVTKSB7CisJCQlyZWxhdGl2ZVZhbHVlc1guYWRkKG5ldyBBcnJheUxpc3Q8RG91YmxlPigpKTsKKwkJfQorCQl3aGlsZSAocmVsYXRpdmVWYWx1ZXNZLnNpemUoKSA8IE5VTV9UUkFKRUNUT1JJRVMpIHsKKwkJCXJlbGF0aXZlVmFsdWVzWS5hZGQobmV3IEFycmF5TGlzdDxEb3VibGU+KCkpOworCQl9CisJCXJlc2V0RGF0YSgpOworCQlnciA9IEdlbmVyYXRvci5pbnN0YW5jZSgpOworCisJCXRyeSB7CisJCQlpZHIgPSBQbHVnaW5TZXR0aW5ncy5pbnN0YW5jZSgpLmdldERldmljZSgiZHYuU1dUIik7IC8vJE5PTi1OTFMtMSQJCQkKKwkJfSBjYXRjaCAoZmluYWwgQ2hhcnRFeGNlcHRpb24gcGV4KSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlByb2JsZW0gaW5pdGlhbGl6aW5nIGNoYXJ0IiwgcGV4KTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CisKKwkJY29udHJvbCA9IChMeWFwdW5vdkNvbnRyb2wpIHBhcmVudDsKKworCQljbSA9IGNyZWF0ZUx5YXB1bm92VHJhamVjdG9yeUNoYXJ0KHJlbGF0aXZlVmFsdWVzWCwgcmVsYXRpdmVWYWx1ZXNZLAorCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiUEgudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChmaW5hbCBQYWludEV2ZW50IHBlKSB7CisKKwkJCQlmaW5hbCBDb21wb3NpdGUgc291cmNlID0gKENvbXBvc2l0ZSkgcGUuZ2V0U291cmNlKCk7CisJCQkJZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSBkID0gc291cmNlCisJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpOworCisJCQkJaWYoaW1nQ2hhcnQgIT0gbnVsbCkgaW1nQ2hhcnQuZGlzcG9zZSgpOworCQkJCWltZ0NoYXJ0ID0gbmV3IEltYWdlKHNvdXJjZS5nZXREaXNwbGF5KCksIGQpOworCQkJCQorCQkJCWlkci5zZXRQcm9wZXJ0eShJRGV2aWNlUmVuZGVyZXIuR1JBUEhJQ1NfQ09OVEVYVCwgbmV3IEdDKAorCQkJCQkJaW1nQ2hhcnQpKTsKKwkJCQlmaW5hbCBCb3VuZHMgYm91bmRzID0gQm91bmRzSW1wbC5jcmVhdGUoZC54LCBkLnksIGQud2lkdGgsCisJCQkJCQlkLmhlaWdodCk7CisJCQkJYm91bmRzLnNjYWxlKDcyZCAvIGlkci5nZXREaXNwbGF5U2VydmVyKCkuZ2V0RHBpUmVzb2x1dGlvbigpKTsKKwkJCQkvLyBCT1VORFMgTVVTVCBCRSBTUEVDSUZJRUQgSU4gUE9JTlRTCisKKwkJCQl0cnkgeworCQkJCQlnci5yZW5kZXIoaWRyLCBnci5idWlsZChpZHIuZ2V0RGlzcGxheVNlcnZlcigpLCBjbSwgYm91bmRzLAorCQkJCQkJCW51bGwsIG51bGwsIG51bGwpKTsKKwkJCQkJcGUuZ2MuZHJhd0ltYWdlKGltZ0NoYXJ0LCBkLngsIGQueSk7CisJCQkJfSBjYXRjaCAoZmluYWwgQ2hhcnRFeGNlcHRpb24gY2UpIHsKKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJQcm9ibGVtIHJlbmRlcmluZyBjaGFydCIsIGNlKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKworCQkJfSAvLyBwYWludENvbnRyb2wKKwkJfSAvLyBQYWludExpc3RlbmVyCisKKwkJKTsKKworCX0gLy8gTHlhcHVub3ZDb21wYXJpc29uQ2FudmFzCisKKwkvKioKKwkgKiBUaGUgbWV0aG9kIHdoaWNoIGdldHMgdGhlIHtAbGluayBMeWFwdW5vdlRyYWplY3RvcnlDYW52YXN9JyByZXBvcnRzIGxpc3QsCisJICogYW5kIGRyYXdzIGl0IG9uIHRoZSB7QGxpbmsgTHlhcHVub3ZUcmFqZWN0b3J5Q2FudmFzfS4KKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBkcmF3KCkgeworCQkvLyBIYXMgYSByZWxhdGl2ZSB2YWx1ZSBwcm92aWRlciBiZWVuIHByb3ZpZGVkPworCQljbGVhckRhdGEoKTsKKwkJc2V0Q29sb3JEZWZzKGxpbmVTZXJpZXNMaXN0KTsKKworCQkvLyBzZXQgdXAgdG8gYXV0b3NjYWxlCisJCW1heFggPSAtMS4wOworCQltYXhZID0gLTEuMDsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IE5VTV9UUkFKRUNUT1JJRVM7IGkrKykgeworCisJCQlmaW5hbCBQaGFzZVNwYWNlQ29vcmRpbmF0ZVtdIHRyYWplY3RvcnkgPSBjb250cm9sLmdldFBvaW50VmFsdWVzKGkpOworCisJCQlpZiAodHJhamVjdG9yeS5sZW5ndGggPiAwKSB7CisKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IHRyYWplY3RvcnkubGVuZ3RoOyBqKyspIHsKKworCQkJCQlpZiAodHJhamVjdG9yeVtqXS5nZXRYVmFsdWUoKSA+PSBtYXhYKSB7CisJCQkJCQltYXhYID0gdHJhamVjdG9yeVtqXS5nZXRYVmFsdWUoKTsKKwkJCQkJCXhBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heCgKKwkJCQkJCQkJTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZShtYXhYKSk7CisJCQkJCX0KKworCQkJCQlpZiAodHJhamVjdG9yeVtqXS5nZXRZVmFsdWUoKSA+PSBtYXhZKSB7CisJCQkJCQltYXhZID0gdHJhamVjdG9yeVtqXS5nZXRZVmFsdWUoKTsKKwkJCQkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heCgKKwkJCQkJCQkJTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZShtYXhZKSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlmb3IgKGludCBjeWNsZU51bWJlciA9IDA7IGN5Y2xlTnVtYmVyIDwgdHJhamVjdG9yeS5sZW5ndGg7IGN5Y2xlTnVtYmVyKyspIHsKKwkJCQkJdGhpcy5yZWxhdGl2ZVZhbHVlc1guZ2V0KGkpLmFkZCgKKwkJCQkJCQluZXcgRG91YmxlKHRyYWplY3RvcnlbY3ljbGVOdW1iZXJdLmdldFhWYWx1ZSgpKSk7CisJCQkJCXRoaXMucmVsYXRpdmVWYWx1ZXNZLmdldChpKS5hZGQoCisJCQkJCQkJbmV3IERvdWJsZSh0cmFqZWN0b3J5W2N5Y2xlTnVtYmVyXS5nZXRZVmFsdWUoKSkpOworCQkJCX0gLy8gZm9yIGN5Y2xlTnVtYmVyCisJCQl9IGVsc2UgeworCQkJCXJlc2V0RGF0YSgpOworCQkJfQorCQl9Ly8gZm9yIE5VTV9UUkFKRUNUT1JJRVMKKwkJaWYgKCF0aGlzLmlzRGlzcG9zZWQoKSkgeworCQkJcmVkcmF3KCk7CisJCX0KKwl9IC8vIHBhaW50Q29udHJvbAorCisJLyoqCisJICogQHBhcmFtIHJlbGF0aXZlVmFsdWVzWAorCSAqICAgICAgICAgICAgdGhlIDxjb2RlPkxpc3Q8L2NvZGU+IHRoYXQgd2lsbCBjb250YWluIHRoZSByZWxhdGl2ZSBYIGF4aXMKKwkgKiAgICAgICAgICAgIHZhbHVlcyAoMC4wLTEuMCkgdG8gcGxvdAorCSAqIEBwYXJhbSByZWxhdGl2ZVZhbHVlc1kKKwkgKiAgICAgICAgICAgIHRoYXQgd2lsbCBjb250YWluIHRoZSByZWxhdGl2ZSBZIGF4aXMgdmFsdWVzICgwLjAtMS4wKSB0byBwbG90CisJICogQHBhcmFtIHNlcmllc0lkZW50aWZpZXIKKwkgKiAgICAgICAgICAgIHRoZSB0aXRsZSBvZiB0aGUgZ3JhcGgKKwkgKiBAcmV0dXJuIGEgPGNvZGU+Q2hhcnQ8L2NvZGU+CisJICovCisJQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKwlwdWJsaWMgZmluYWwgQ2hhcnQgY3JlYXRlTHlhcHVub3ZUcmFqZWN0b3J5Q2hhcnQoCisJCQlmaW5hbCBMaXN0PExpc3Q8RG91YmxlPj4gcmVsYXRpdmVWYWx1ZXNYLAorCQkJZmluYWwgTGlzdDxMaXN0PERvdWJsZT4+IHJlbGF0aXZlVmFsdWVzWSwKKwkJCWZpbmFsIFN0cmluZyBzZXJpZXNJZGVudGlmaWVyKSB7CisJCWZpbmFsIENoYXJ0V2l0aEF4ZXMgcmV0VmFsdWUgPSBDaGFydFdpdGhBeGVzSW1wbC5jcmVhdGUoKTsKKworCQkvLyBnZXQgdGhlIE5MUyBkZWZhdWx0IGxhYmVscworCQkvLyBkZWZhdWx0QXhpc0xhYmVsX1ggPSBNZXNzYWdlcy5nZXRTdHJpbmcoIlhBWElTREVGLnRpdGxlIik7CisJCS8vIGRlZmF1bHRBeGlzTGFiZWxfWSA9IE1lc3NhZ2VzLmdldFN0cmluZygiWUFYSVNERUYudGl0bGUiKTsKKwkJU3RyaW5nIGRlZmF1bHRBeGlzTGFiZWxfWCA9ICJTIjsKKwkJU3RyaW5nIGRlZmF1bHRBeGlzTGFiZWxfWSA9ICJJIjsKKworCQkvLyBQbG90CisJCXJldFZhbHVlLmdldEJsb2NrKCkuc2V0QmFja2dyb3VuZChDb2xvckRlZmluaXRpb25JbXBsLldISVRFKCkpOworCQlmaW5hbCBQbG90IHAgPSByZXRWYWx1ZS5nZXRQbG90KCk7CisJCXAuZ2V0Q2xpZW50QXJlYSgpLnNldEJhY2tncm91bmQoCisJCQkJQ29sb3JEZWZpbml0aW9uSW1wbC5jcmVhdGUoMjU1LCAyNTUsIDIyNSkpOworCisJCS8vIFRpdGxlCisJCS8vIGN3YUxpbmUuZ2V0VGl0bGUoICkuZ2V0TGFiZWwoICkuZ2V0Q2FwdGlvbiggKS5zZXRWYWx1ZSggIkxpbmUgQ2hhcnQiCisJCS8vICk7Ly8kTk9OLU5MUy0xJAorCQlyZXRWYWx1ZS5nZXRUaXRsZSgpLnNldFZpc2libGUoZmFsc2UpOworCisJCS8vIExlZ2VuZAorCQlmaW5hbCBMZWdlbmQgbGcgPSByZXRWYWx1ZS5nZXRMZWdlbmQoKTsKKwkJbGcuc2V0VmlzaWJsZShmYWxzZSk7CisJCS8qCisJCSAqIGZpbmFsIExpbmVBdHRyaWJ1dGVzIGxpYSA9IGxnLmdldE91dGxpbmUoKTsKKwkJICogbGcuZ2V0VGV4dCgpLmdldEZvbnQoKS5zZXRTaXplKDgpOworCQkgKiBsaWEuc2V0U3R5bGUoTGluZVN0eWxlLlNPTElEX0xJVEVSQUwpOyBsZy5nZXRJbnNldHMoKS5zZXQoMTAsIDUsIDAsCisJCSAqIDApOyBsZy5nZXRPdXRsaW5lKCkuc2V0VmlzaWJsZShmYWxzZSk7CisJCSAqIGxnLnNldEFuY2hvcihBbmNob3IuTk9SVEhfTElURVJBTCk7CisJCSAqIGxnLnNldFBvc2l0aW9uKFBvc2l0aW9uLkJFTE9XX0xJVEVSQUwpOworCQkgKi8KKwkJLy8gY3dhTGluZS5nZXRMZWdlbmQoICkuZ2V0VGV4dCgpLmdldEZvbnQoKS5zZXRTaXplKDE2KTs7CisJCS8vIGN3YUxpbmUuZ2V0TGVnZW5kKCApLnNldFZpc2libGUoIHRydWUgKTsKKwkJLy8gWC1BeGlzCisJCXhBeGlzUHJpbWFyeSA9IHJldFZhbHVlLmdldFByaW1hcnlCYXNlQXhlcygpWzBdOworCQl4QXhpc1ByaW1hcnkuc2V0VHlwZShBeGlzVHlwZS5MSU5FQVJfTElURVJBTCk7CisJCS8vIFktQXhpcworCQl5QXhpc1ByaW1hcnkgPSByZXRWYWx1ZS5nZXRQcmltYXJ5T3J0aG9nb25hbEF4aXMoeEF4aXNQcmltYXJ5KTsKKworCQkvLyB4QXhpc1ByaW1hcnkuc2V0VHlwZShBeGlzVHlwZS5URVhUX0xJVEVSQUwpOworCisJCXhBeGlzUHJpbWFyeS5nZXRNYWpvckdyaWQoKS5zZXRUaWNrU3R5bGUoVGlja1N0eWxlLkJFTE9XX0xJVEVSQUwpOworCQl5QXhpc1ByaW1hcnkuZ2V0TWFqb3JHcmlkKCkuc2V0VGlja1N0eWxlKFRpY2tTdHlsZS5MRUZUX0xJVEVSQUwpOworCisJCXhBeGlzUHJpbWFyeS5nZXRPcmlnaW4oKS5zZXRUeXBlKEludGVyc2VjdGlvblR5cGUuVkFMVUVfTElURVJBTCk7CisKKwkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuZ2V0Q2FwdGlvbigpLmdldEZvbnQoKS5zZXRTaXplKDgpOworCQlTdHJpbmcgeEF4aXNMYWJlbCA9IGRlZmF1bHRBeGlzTGFiZWxfWDsKKwkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuZ2V0Q2FwdGlvbigpLnNldFZhbHVlKHhBeGlzTGFiZWwpOworCQl4QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5zZXRWaXNpYmxlKHRydWUpOworCisJCXlBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLmdldENhcHRpb24oKS5nZXRGb250KCkuc2V0U2l6ZSg4KTsKKwkJU3RyaW5nIHlBeGlzTGFiZWwgPSBkZWZhdWx0QXhpc0xhYmVsX1k7CisJCXlBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLmdldENhcHRpb24oKS5zZXRWYWx1ZSh5QXhpc0xhYmVsKTsKKwkJeUF4aXNQcmltYXJ5LmdldFRpdGxlKCkuc2V0VmlzaWJsZSh0cnVlKTsKKworCQlmaW5hbCBpbnQgTUFYQ09MT1JTID0gbGluZUNvbG9ycy5sZW5ndGg7CisJCS8vIGZvciBhbGwgcmVsYXRpdmUgdmFsdWVzIGxpc3RzCisJCS8vIFggbXVzdCBiZSBzYW1lIHNpemUgYXMgWQorCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbGF0aXZlVmFsdWVzWC5zaXplKCk7IGkrKykgeworCQkJZmluYWwgTnVtYmVyRGF0YVNldCBvcnRob1ZhbHVlc1ggPSBOdW1iZXJEYXRhU2V0SW1wbAorCQkJCQkuY3JlYXRlKHJlbGF0aXZlVmFsdWVzWC5nZXQoaSkpOworCQkJZmluYWwgTnVtYmVyRGF0YVNldCBvcnRob1ZhbHVlc1kgPSBOdW1iZXJEYXRhU2V0SW1wbAorCQkJCQkuY3JlYXRlKHJlbGF0aXZlVmFsdWVzWS5nZXQoaSkpOworCisJCQkvLyBYLVNlcmllcworCQkJZmluYWwgU2VyaWVzIGxzeCA9IFNlcmllc0ltcGwuY3JlYXRlKCk7CisJCQkvLyBmaW5hbCBMaW5lU2VyaWVzIGxzeCA9IChTY2F0dGVyU2VyaWVzKQorCQkJLy8gU2NhdHRlclNlcmllc0ltcGwuY3JlYXRlKCk7CisJCQkvLyBzZUNhdGVnb3J5LnNldERhdGFTZXQob3J0aG9WYWx1ZXNYKTsKKwkJCWxzeC5zZXREYXRhU2V0KG9ydGhvVmFsdWVzWCk7CisKKwkJCS8vIFktU2VyaWVzCisJCQlmaW5hbCBTY2F0dGVyU2VyaWVzIGxzeSA9IChTY2F0dGVyU2VyaWVzKSBTY2F0dGVyU2VyaWVzSW1wbAorCQkJCQkuY3JlYXRlKCk7CisJCQlsc3kuc2V0RGF0YVNldChvcnRob1ZhbHVlc1kpOworCQkJbHN5LmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0VmlzaWJsZSh0cnVlKTsKKworCQkJaW50IGNvbG9ySW5kZXggPSBpICUgTUFYQ09MT1JTOworCQkJbHN5LmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IobGluZUNvbG9yc1tjb2xvckluZGV4XSk7CisJCQlsc3kuc2V0U2VyaWVzSWRlbnRpZmllcihzZXJpZXNJZGVudGlmaWVyKTsKKwkJCQorCQkJbHN5LmdldE1hcmtlcnMoKS5jbGVhcigpOworCisJCQlmaW5hbCBTZXJpZXNEZWZpbml0aW9uIHNkWCA9IFNlcmllc0RlZmluaXRpb25JbXBsLmNyZWF0ZSgpOworCQkJZmluYWwgU2VyaWVzRGVmaW5pdGlvbiBzZFkgPSBTZXJpZXNEZWZpbml0aW9uSW1wbC5jcmVhdGUoKTsKKworCQkJc2RZLmdldFNlcmllc1BhbGV0dGUoKS51cGRhdGUoLTIpOworCisJCQl4QXhpc1ByaW1hcnkuZ2V0U2VyaWVzRGVmaW5pdGlvbnMoKS5hZGQoc2RYKTsKKwkJCXlBeGlzUHJpbWFyeS5nZXRTZXJpZXNEZWZpbml0aW9ucygpLmFkZChzZFkpOworCisJCQkvLyBzZFguZ2V0U2VyaWVzKCkuYWRkKHNlQ2F0ZWdvcnkpOworCQkJc2RYLmdldFNlcmllcygpLmFkZChsc3gpOworCQkJc2RZLmdldFNlcmllcygpLmFkZChsc3kpOworCisJCX0vLyBGT1IgQUxMIERBVEEgU0VUUworCisJCXhBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1pbihOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDAuMCkpOworCQl4QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNYXgoTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZSgxLjApKTsKKwkJeEF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0U3RlcCgwLjI1KTsKKwkJeEF4aXNQcmltYXJ5LmdldExhYmVsKCkuZ2V0Q2FwdGlvbigpLmdldEZvbnQoKS5zZXRTaXplKDkpOworCisJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1pbihOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDAuMCkpOworCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNYXgoTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZSgxLjApKTsKKwkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0U3RlcCgwLjI1KTsKKwkJeUF4aXNQcmltYXJ5LmdldExhYmVsKCkuZ2V0Q2FwdGlvbigpLmdldEZvbnQoKS5zZXRTaXplKDkpOworCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZVBoYXNlU3BhY2VMaW5lQ2hhcnQKKworCS8qKgorCSAqIFNldHMgdGhlIGNvbG9ycyBmb3IgYSBuIGFycmF5IG9mIExpbmVTZXJpZXMgYWxsIHRvIGJsdWUgVE9ETzogZXZlbnR1YWxseQorCSAqIHdlIG5lZWQgdG8gcGljayBzb21lIGJldHRlciBjb2xvcnMgYW5kIGNvbm5lY3QgdG8gYSBsZWdlbmQuLi4KKwkgKiAKKwkgKiBAcGFyYW0gbHNMaXN0CisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNldENvbG9yRGVmcyhmaW5hbCBMaXN0PExpbmVTZXJpZXM+IGxzTGlzdCkgeworCQkvLyB0aGUgZGVmYXVsdCBsaW5lIGNvbG9yCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbHNMaXN0LnNpemUoKTsgaSsrKSB7CisJCQlDb2xvckRlZmluaXRpb24gY29sb3IgPSBDb2xvckRlZmluaXRpb25JbXBsLkJMVUUoKTsKKwkJCWxzTGlzdC5nZXQoaSkuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRDb2xvcihjb2xvcik7CisJCX0KKwkJcmV0dXJuOworCX0vLyBnZXRDb2xvckRlZgorCisJLyoqCisJICogRGlzcG9zZXMgdGhlIENvbG9yIG9iamVjdHMKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJLyoqCisJICogcmVzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJcmVzZXREYXRhKCk7CisJCXJlZHJhdygpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHJlc2V0RGF0YSgpIHsKKworCQljbGVhckRhdGEoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWxhdGl2ZVZhbHVlc1guc2l6ZSgpOyBpKyspIHsKKwkJCXJlbGF0aXZlVmFsdWVzWC5nZXQoaSkuYWRkKG5ldyBEb3VibGUoMS4wKSk7CisJCQlyZWxhdGl2ZVZhbHVlc1kuZ2V0KGkpLmFkZChuZXcgRG91YmxlKDAuMCkpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGNsZWFyRGF0YSgpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWxhdGl2ZVZhbHVlc1guc2l6ZSgpOyBpKyspIHsKKwkJCXJlbGF0aXZlVmFsdWVzWC5nZXQoaSkuY2xlYXIoKTsKKwkJCXJlbGF0aXZlVmFsdWVzWS5nZXQoaSkuY2xlYXIoKTsKKwkJfQorCX0KK30gLy8gTHlhcHVub3ZDb21wYXJpc29uQ2FudmFzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9MeWFwdW5vdlZpZXcuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL0x5YXB1bm92Vmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMWVjNDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9MeWFwdW5vdlZpZXcuamF2YQpAQCAtMCwwICsxLDY4IEBACisvLyBFc3RpbWF0b3JWaWV3IAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKKworLyoqCisgKiBUaGlzIHZpZXcgcHJvdmlkZXMgZm9yIGEgTHlhcHVub3YgYW5hbHlzaXMsIGNvbXBhcmluZyB0d28gc2NlbmFyaW9zCisgKi8KKworcHVibGljIGNsYXNzIEx5YXB1bm92VmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKKworCS8qKgorCSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBMeWFwdW5vdiBWaWV3IHtAdmFsdWV9CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfTHlhcHVub3ZfVklFVyA9ICJvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MubHlhcHVub3YiOyAvLyROT04tTkxTLTEkCisKKworCXByaXZhdGUgQW5hbHlzaXNWaWV3ZXIgYW5hbHlzaXNWaWV3ZXI7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCWFuYWx5c2lzVmlld2VyID0gbmV3IEFuYWx5c2lzVmlld2VyKHBhcmVudCwgTHlhcHVub3ZGYWN0b3J5LklOU1RBTkNFKTsKKwkJYW5hbHlzaXNWaWV3ZXIuc2V0SW5wdXQoU2ltdWxhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpKTsKKworCQlnZXRTaXRlKCkuc2V0U2VsZWN0aW9uUHJvdmlkZXIoYW5hbHlzaXNWaWV3ZXIpOworCisKKwl9IC8vIGNyZWF0ZVBhcnRDb250cm9sCisKKwkKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9IC8vIGRpc3Bvc2UKKworCS8qKgorCSAqIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIGludGVyZmFjZSwgYnV0IHdlJ3JlIG5vdCB1c2luZyBpdC4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCS8vIE5vdGhpbmcKKwl9IC8vIHNldEZvY3VzCisKK30gLy8gRXN0aW1hdG9yVmlldwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvTWVzc2FnZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2OGMyNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL01lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLy8gTWVzc2FnZXMuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlcyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCisJCQkuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKKworCXByaXZhdGUgTWVzc2FnZXMoKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0ga2V5CisJICogQHJldHVybiB0aGUgc3RyaW5nIG1hdGNoaW5nIHRoZSBrZXkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoZmluYWwgU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoZmluYWwgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9Cit9IC8vIE1lc3NhZ2VzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9QYXJhbWV0ZXJFc3RpbWF0b3JXaXphcmQuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL1BhcmFtZXRlckVzdGltYXRvcldpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTYxMTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9QYXJhbWV0ZXJFc3RpbWF0b3JXaXphcmQuamF2YQpAQCAtMCwwICsxLDQyMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYW5hbHlzaXMuRGlzZWFzZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5pbXBsLlJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy51dGlsLkNTVnNjZW5hcmlvTG9hZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy5QYXJhbWV0ZXJFc3RpbWF0b3JNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7CisKKy8qKgorICogQSB3aXphcmQgZm9yIHNlbGVjdGluZyBhIHNjZW5hcmlvIGZvbGRlciBhbmQgYSBwYXJhbWV0ZXIgZXN0aW1hdG9yCisgKiAKKyAqLworcHVibGljIGNsYXNzIFBhcmFtZXRlckVzdGltYXRvcldpemFyZCBleHRlbmRzIFdpemFyZCB7CisJLyoqCisJICogVGhpcyBwYWdlIGlzIGZvciBzZWxlY3Rpbmcgc2NlbmFyaW8gZm9sZGVyCisJICovCisJcHJvdGVjdGVkIFBhcmFtZXRlckVzdGltYXRvcldpemFyZFNlbGVjdEZvbGRlclBhZ2Ugc2VsZWN0Rm9sZGVyUGFnZTsKKworCS8qKgorCSAqIFRoaXMgcGFnZSBpcyBmb3Igc2VsZWN0aW5nIHdoaWNoIHBhcmFtZXRlciBlc3RpbWF0b3IgdG8gYXBwbHkKKwkgKi8KKwlwcm90ZWN0ZWQgUGFyYW1ldGVyRXN0aW1hdG9yV2l6YXJkU2VsZWN0RXN0aW1hdG9yUGFnZSBzZWxlY3RFc3RpbWF0b3JQYWdlOworCisJLyoqCisJICogUmVtZW1iZXIgdGhlIHdvcmtiZW5jaCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisJICovCisJcHJvdGVjdGVkIElXb3JrYmVuY2ggd29ya2JlbmNoOworCQorCS8qKgorCSAqIFNlbGVjdGlvbiwgaS5lLiB0aGUgc2VsZWN0ZWQgd2lkZ2V0IHRoYXQgb3BlbmVkIHRoZSB3aXphcmQKKwkgKi8KKwkKKwkvL0lTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKKwkKKwkvKioKKwkgKiBUaGUgRXN0aW1hdG9yIENvbnRyb2wuIFdlIHVzZSBpdCB0byB1cGRhdGUgZmllbGRzIGluZGljYXRpbmcKKwkgKiB0aGUgY3VycmVudCBmb2xkZXIvZXN0aW1hdG9yCisJICogCisJICovCisJCisJRXN0aW1hdG9yQ29udHJvbCBlc3RpbWF0b3JDb250cm9sOworCQorCS8qKgorCSAqIFdoZW4gdGhlIHdpemFyZCBpcyBjb21wbGV0ZSwgd2UgaGF2ZSBsb2FkZWQgZGF0YSBpbnRvCisJICogdGhpcyBtYXAgCisJICovCisJCisJUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCByZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXA7CisJCisJLyoqCisJICogV2hlbiB0aGUgd2l6YXJkIGlzIGNvbXBsZXRlLCB3ZSBoYXZlIHNlbGVjdGVkIGEKKwkgKiBwYXJhbWV0ZXIgZXN0aW1hdG9yIG1ldGhvZAorCSAqLworCQorCXB1YmxpYyBQYXJhbWV0ZXJFc3RpbWF0b3JNZXRob2QgcGFyYW1ldGVyRXN0aW1hdG9yTWV0aG9kOworCQorCXByaXZhdGUgU3RyaW5nIGluaXREaXIgPSBudWxsOworCQorCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICogCisJICogQHBhcmFtIGN0cmwgRXN0aW1hdG9yQ29udHJvbAorCSAqIEBwYXJhbSBpbml0RGlyIEluaXRpYWwgZGlyZWN0b3J5CisJICovCisJCisJcHVibGljIFBhcmFtZXRlckVzdGltYXRvcldpemFyZChFc3RpbWF0b3JDb250cm9sIGN0cmwsIFN0cmluZyBpbml0RGlyKSB7CisJCXRoaXMuZXN0aW1hdG9yQ29udHJvbCA9IGN0cmw7CisJCXRoaXMuaW5pdERpciA9IGluaXREaXI7CisJCXRoaXMuc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOworCX0KKwkKKwkvKioKKwkgKiBJbml0aWFsaXplCisJICogCisJICogQHBhcmFtIHdvcmtiZW5jaAorCSAqIEBwYXJhbSBzZWxlY3Rpb24gU2VsZWN0aW9uIAorCSAqLworCQorCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQl0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKKwkJLy90aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKwkJc2V0V2luZG93VGl0bGUoIkNyZWF0ZSBQYXJhbWV0ZXIgRXN0aW1hdG9yIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBEb25lIHNlbGVjdGluZyBwYXJhbWV0ZXIgZXN0aW1hdG9yCisJICogCisJICogQHJldHVybiBib29sZWFuCisJICovCisKKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgeworCQlFc3RpbWF0b3JDb250cm9sLnRleHQxLnNldFRleHQoc2VsZWN0Rm9sZGVyUGFnZS5nZXREaXJOYW1lKCkpOworCQlFc3RpbWF0b3JDb250cm9sLmVzdGltYXRvclRleHQuc2V0VGV4dCh0aGlzLnBhcmFtZXRlckVzdGltYXRvck1ldGhvZC5nZXROYW1lKCkpOworCQllc3RpbWF0b3JDb250cm9sLmVuYWJsZUFuYWx5c2lzKHRydWUpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBnZXRSZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAuIFJldHVybiB0aGUgcmVmZXJlbmNlIHNjZW5hcmlvIGRhdGEgbWFwCisJICogIAorCSAqIEByZXR1cm4gUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwCisJICovCisJCisJcHVibGljIFJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcEltcGwgZ2V0UmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwKCkge3JldHVybiB0aGlzLnJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcDt9CisJCisJLyoqCisJICogZ2V0UGFyYW1ldGVyRXN0aW1hdG9yLiBSZXR1cm4gdGhlIHBhcmFtZXRlciBlc3RpbWF0b3IgbWV0aG9kIHNlbGVjdGVkCisJICogIAorCSAqIEByZXR1cm4gUGFyYW1ldGVyRXN0aW1hdG9yCisJICovCisJCisJcHVibGljIFBhcmFtZXRlckVzdGltYXRvck1ldGhvZCBnZXRQYXJhbWV0ZXJFc3RpbWF0b3JNZXRob2QoKSB7cmV0dXJuIHRoaXMucGFyYW1ldGVyRXN0aW1hdG9yTWV0aG9kO30KKwkKKwkKKwkvKioKKyAgICAgKiBXZSBvdmVycmlkZSBjcmVhdGVQYWdlQ29udHJvbHMgdG8gYXZvaWQgY3JlYXRpbmcgdGhlIGNvbnRyb2xzCisgICAgICogZm9yIHRoZSBzZWNvbmQgcGFnZSB1bnRpbCB3ZSBhcmUgcmVhZHkuCisgICAgICogCisgICAgICogQHBhcmFtIHBhZ2VDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKKyAgICAJLy9JV2l6YXJkUGFnZSBwYWdlID0gc2VsZWN0Rm9sZGVyUGFnZTsKKyAgICAgICAgLy9wYWdlLmNyZWF0ZUNvbnRyb2wocGFnZUNvbnRhaW5lcik7CisgICAgfQorICAgIAorCS8qKgorCSAqIFBhZ2UgZm9yIHNlbGVjdGluZyBzY2VuYXJpbyBmb2xkZXIKKwkgKi8KKwlwdWJsaWMgY2xhc3MgUGFyYW1ldGVyRXN0aW1hdG9yV2l6YXJkU2VsZWN0Rm9sZGVyUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgeworCQlUZXh0IGZvbGRlclRleHQgPSBudWxsOworCQlwcml2YXRlIFN0cmluZyBkaXJlY3Rvcnk7CisJCQorCQkvKioKKwkJICogUGFzcyBpbiB0aGUgc2VsZWN0aW9uLgorCQkgKiAKKwkJICogQHBhcmFtIHBhZ2VJZAorCQkgKi8KKwkJcHVibGljIFBhcmFtZXRlckVzdGltYXRvcldpemFyZFNlbGVjdEZvbGRlclBhZ2UoU3RyaW5nIHBhZ2VJZCkgeworCQkJc3VwZXIocGFnZUlkKTsKKwkJfQorCisJCS8qKgorCQkgKiBUaGUgZnJhbWV3b3JrIGNhbGxzIHRoaXMgdG8gc2VlIGlmIHRoZSBmaWxlIGlzIGNvcnJlY3QuCisJCSAqLworCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCS8qKgorCQkgKiBDcmVhdGUgbGF5b3V0CisJCSAqIAorCQkgKiBAcGFyYW0gcGFyZW50CisJCSAqLworCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQkJeworCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEyOworCQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKworCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJfQorCQkJTGFiZWwgY29udGFpbmVyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7CisJCQl7CisJCQkJY29udGFpbmVyTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5TQ0ZPTERFUiIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJY29udGFpbmVyTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCX0KKwkJCWZvbGRlclRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5MRUZUKTsKKwkJCXsKKwkJCQlmb2xkZXJUZXh0LnNldFRleHQodGhpcy5nZXREaXJOYW1lKCkpOworCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCQkJZGF0YS5taW5pbXVtV2lkdGggPSAxMDA7CisJCQkJZm9sZGVyVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJfQorCQkJQnV0dG9uIHNlbGVjdEZvbGRlckJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTEVGVCk7CisJCQl7CisJCQkJc2VsZWN0Rm9sZGVyQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuU0VMRUNURk9MREVCVVRUT04iKSk7CisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJc2VsZWN0Rm9sZGVyQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7CisJCQl9CisJCQkKKwkJCWZpbmFsIFNoZWxsIHNoZWxsID0gdGhpcy5nZXRTaGVsbCgpOworCQkJCisJCQlzZWxlY3RGb2xkZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQkJCQlmaW5hbCBTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCWZpbmFsIERpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coCisJCQkJCQlzaGVsbCwgU1dULk9QRU4pOworCQkJCQlkZC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiRVNULlNFTEVDVEZPTERFRElBTE9HVElUTEUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJZGQuc2V0RmlsdGVyUGF0aChmb2xkZXJUZXh0LmdldFRleHQoKSk7CisJCQkJCWZpbmFsIFN0cmluZyBzZWxlY3RlZCA9IGRkLm9wZW4oKTsKKwkJCQkJaWYoc2VsZWN0ZWQgIT0gbnVsbCkgZm9sZGVyVGV4dC5zZXRUZXh0KHNlbGVjdGVkKTsKKwkJCQl9CisJCQl9KTsKKwkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7CisJCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBTZXQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG5hbWUKKwkJICogCisJCSAqIEBwYXJhbSBkaXIgRGlyZWN0b3J5CisJCSAqLworCQkKKwkJcHVibGljIHZvaWQgc2V0RGlyTmFtZShTdHJpbmcgZGlyKSB7CisJCQl0aGlzLmRpcmVjdG9yeSA9IGRpcjsKKwkJfQorCisJCS8qKgorCQkgKiBHZXQgdGhlIGRpcmVjdG9yeQorCQkgKiAKKwkJICogQHJldHVybiBTdHJpbmcgRGlyZWN0b3J5CisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldERpck5hbWUoKSB7CisJCQlyZXR1cm4gdGhpcy5kaXJlY3Rvcnk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBjYW5GbGlwVG9OZXh0UGFnZS4gRmlndXJlIG91dCB3aGV0aGVyIGZvbGRlciBpcyBzZXQuIAorCQkgKiAKKwkJICogQHJldHVybiBib29sZWFuIFRydWUgaWYgcGFnZSBpcyB2YWxpZAorCQkgKi8KKwkJCisJCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCl7CisJCQkgIHJldHVybiB0aGlzLnZhbGlkYXRlUGFnZSgpOworCQl9CisJCQorCQkvKioKKwkJICogaXNQYWdlQ29tcGxldGUuCisJCSAqIAorCQkgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiBjb21wbGV0ZQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7CisJCQlyZXR1cm4gdGhpcy52YWxpZGF0ZVBhZ2UoKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIE92ZXJyaWRlIHRvIGxvYWQgZm9sZGVyIGRhdGEgYW5kIHZhbGlkYXRlCisJCSAqIAorCQkgKiBAcmV0dXJuIElXaXphcmRQYWdlCisJCSAqLworCQkKKwkJcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgeworCQkJdHJ5IHsKKwkJCQlzZWxlY3RFc3RpbWF0b3JQYWdlID0gbmV3IFBhcmFtZXRlckVzdGltYXRvcldpemFyZFNlbGVjdEVzdGltYXRvclBhZ2UoIkVzdGltYXRvciIpOyAvLyROT04tTkxTLTEkCisJCQkJc2VsZWN0RXN0aW1hdG9yUGFnZS5zZXRUaXRsZShNZXNzYWdlcy5nZXRTdHJpbmcoIkVTVC5QQVJBTUVTVFRJVExFIikpOworCQkJCXNlbGVjdEVzdGltYXRvclBhZ2Uuc2V0RGVzY3JpcHRpb24oIiIpOyAvLyROT04tTkxTLTEkCisJCQkJc2VsZWN0RXN0aW1hdG9yUGFnZS5zZXRXaXphcmQodGhpcy5nZXRXaXphcmQoKSk7CisJCQkJQ1NWc2NlbmFyaW9Mb2FkZXIgbG9hZGVyID0gbmV3IENTVnNjZW5hcmlvTG9hZGVyKHRoaXMuZm9sZGVyVGV4dC5nZXRUZXh0KCkpOworCQkJCS8vIFBpY2sgdGhlIGhpZ2hlc3QgcmVzb2x1dGlvbiBhdmFpbGFibGUKKwkJCQlpbnQgbWF4UmVzb2x1dGlvbiA9IGxvYWRlci5nZXRNYXhSZXNvbHV0aW9uKCk7CisJCQkJUmVmZXJlbmNlU2NlbmFyaW9EYXRhTWFwSW1wbCBtYXAgPSBsb2FkZXIucGFyc2VBbGxGaWxlcyhtYXhSZXNvbHV0aW9uKTsKKwkJCQkoKFBhcmFtZXRlckVzdGltYXRvcldpemFyZCl0aGlzLmdldFdpemFyZCgpKS5yZWZlcmVuY2VTY2VuYXJpb0RhdGFNYXAgPSBtYXA7CisJCQkJdGhpcy5zZXREaXJOYW1lKHRoaXMuZm9sZGVyVGV4dC5nZXRUZXh0KCkpOworCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgeworCQkJCXRoaXMuc2V0RXJyb3JNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKKwkJCQlyZXR1cm4gdGhpczsKKwkJCX0KKwkgICAgICAgIHJldHVybiBzZWxlY3RFc3RpbWF0b3JQYWdlOworCQl9CisJfQorCisJLyoqCisJICogUGFnZSBmb3Igc2VsZWN0aW5nIGVzdGltYXRvcgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1ldGVyRXN0aW1hdG9yV2l6YXJkU2VsZWN0RXN0aW1hdG9yUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgeworCisJCS8qKgorCQkgKiBQYXNzIGluIHRoZSBzZWxlY3Rpb24uCisJCSAqIAorCQkgKiBAcGFyYW0gcGFnZUlkCisJCSAqLworCQlwdWJsaWMgUGFyYW1ldGVyRXN0aW1hdG9yV2l6YXJkU2VsZWN0RXN0aW1hdG9yUGFnZShTdHJpbmcgcGFnZUlkKSB7CisJCQlzdXBlcihwYWdlSWQpOworCQl9CisKKwkJLyoqCisJCSAqIFRoZSBmcmFtZXdvcmsgY2FsbHMgdGhpcyB0byBzZWUgaWYgdGhlIGZpbGUgaXMgY29ycmVjdC4KKwkJICovCisJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKKwkJCXJldHVybiAoKChQYXJhbWV0ZXJFc3RpbWF0b3JXaXphcmQpdGhpcy5nZXRXaXphcmQoKSkucGFyYW1ldGVyRXN0aW1hdG9yTWV0aG9kICE9IG51bGwpOworCQl9CisKKwkJLyoqCisJCSAqIENyZWF0ZSBsYXlvdXQKKwkJICogCisJCSAqIEBwYXJhbSBwYXJlbnQKKwkJICovCisJCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCQl7CisJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQkJCWxheW91dC5udW1Db2x1bW5zID0gMTsKKwkJCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTI7CisJCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQkJCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7CisJCQl9CisKKwkJCUxhYmVsIGNvbnRhaW5lckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOworCQkJeworCQkJCWNvbnRhaW5lckxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJFU1QuUEFSQU1FU1RMQUJFTCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCQkJY29udGFpbmVyTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCX0KKwkJCQorCQkJTGFiZWwgZGVzY3JpcHRpb25MYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKKwkJCXsKKwkJCQlkZXNjcmlwdGlvbkxhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCisKKwkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJCQlkZXNjcmlwdGlvbkxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCQl9CisJCQkKKwkJCWJvb2xlYW4gZmlyc3QgPSB0cnVlOworCQkJZm9yKFBhcmFtZXRlckVzdGltYXRvck1ldGhvZCBtZXRob2QgOiBQYXJhbWV0ZXJFc3RpbWF0b3JNZXRob2QudmFsdWVzKCkpIHsKKwkJCQlEaXNlYXNlVHlwZSBkYXRhVHlwZSA9ICgoUGFyYW1ldGVyRXN0aW1hdG9yV2l6YXJkKXRoaXMuZ2V0V2l6YXJkKCkpLnJlZmVyZW5jZVNjZW5hcmlvRGF0YU1hcC5nZXRUeXBlKCk7CisJCQkJaWYobWV0aG9kLmdldFR5cGUoKSAhPSBkYXRhVHlwZSkgY29udGludWU7CisJCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUkFESU8pOworCQkJICAgIGJ1dHRvbi5zZXRUZXh0KG1ldGhvZC5nZXROYW1lKCkpOworCQkJICAgIGlmKGZpcnN0KSB7CisJCQkgICAgCWJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJCQkgICAgCSgoUGFyYW1ldGVyRXN0aW1hdG9yV2l6YXJkKXRoaXMuZ2V0V2l6YXJkKCkpLnBhcmFtZXRlckVzdGltYXRvck1ldGhvZCA9IG1ldGhvZDsKKwkJCSAgICAJZGVzY3JpcHRpb25MYWJlbC5zZXRUZXh0KG1ldGhvZC5nZXREZXNjcmlwdGlvbigpKTsKKwkJCSAgICAJZmlyc3QgPSBmYWxzZTsKKwkJCSAgICB9CisJCQkgICAgZmluYWwgUGFyYW1ldGVyRXN0aW1hdG9yV2l6YXJkIHdpemFyZCA9IChQYXJhbWV0ZXJFc3RpbWF0b3JXaXphcmQpdGhpcy5nZXRXaXphcmQoKTsKKwkJCSAgICBmaW5hbCBQYXJhbWV0ZXJFc3RpbWF0b3JNZXRob2QgY3VycmVudE1ldGhvZCA9IG1ldGhvZDsKKwkJCSAgICBmaW5hbCBMYWJlbCBkZXNjTGFiZWwgPSBkZXNjcmlwdGlvbkxhYmVsOworCQkJICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQkJCQkJZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQkJd2l6YXJkLnBhcmFtZXRlckVzdGltYXRvck1ldGhvZCA9IGN1cnJlbnRNZXRob2Q7CisJCQkJCQlkZXNjTGFiZWwuc2V0VGV4dChjdXJyZW50TWV0aG9kLmdldERlc2NyaXB0aW9uKCkpOworCQkJCQkJd2l6YXJkLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKKwkJCQkJfQorCQkJICAgIH0pOworCQkJfQorCQkJCisJCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOworCQkJc2V0Q29udHJvbChjb21wb3NpdGUpOworCQkJCisJCX0KKwkJCisJCS8qKgorCQkgKiBjYW5GbGlwVG9OZXh0UGFnZS4gRmFsc2Ugc2luY2UgdGhlcmUgaXMgbm8gbmV4dCBwYWdlCisJCSAqIAorCQkgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiBjYW4gZmxpcAorCQkgKi8KKwkJCisJCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCl7CisJCQkgIHJldHVybiBmYWxzZTsgLy8gVGhlcmUgaXMgbm8gbmV4dCBwYWdlcgorCQl9CisJCisJCS8qKgorCQkgKiBpc1BhZ2VDb21wbGV0ZS4KKwkJICogCisJCSAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIGNvbXBsZXRlCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKKwkJCXJldHVybiB0aGlzLnZhbGlkYXRlUGFnZSgpOworCQl9CisJfQorCisJLyoqCisJICogVGhlIGZyYW1ld29yayBjYWxscyB0aGlzIHRvIGNyZWF0ZSB0aGUgY29udGVudHMgb2YgdGhlIHdpemFyZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKKwkJc2VsZWN0Rm9sZGVyUGFnZSA9IG5ldyBQYXJhbWV0ZXJFc3RpbWF0b3JXaXphcmRTZWxlY3RGb2xkZXJQYWdlKCJGb2xkZXIiKTsgLy8kTk9OLU5MUy0xJAorCQlzZWxlY3RGb2xkZXJQYWdlLnNldFRpdGxlKE1lc3NhZ2VzLmdldFN0cmluZygiRVNULldJWkFSRFBBR0UxVElUTEUiKSk7CisJCXNlbGVjdEZvbGRlclBhZ2Uuc2V0RGVzY3JpcHRpb24oIiIpOyAvLyROT04tTkxTLTEkCisJCXNlbGVjdEZvbGRlclBhZ2Uuc2V0RGlyTmFtZSh0aGlzLmluaXREaXIpOworCQlhZGRQYWdlKHNlbGVjdEZvbGRlclBhZ2UpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL1Byb2Nlc3NvckNvbnRyb2wuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL1Byb2Nlc3NvckNvbnRyb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmUxYTc3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvUHJvY2Vzc29yQ29udHJvbC5qYXZhCkBAIC0wLDAgKzEsNTk0IEBACisvLyBQcm9jZXNzb3JDb250cm9sLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLlNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLkRhdGFQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworCisvKioKKyAqIEdVSSBmb3IgcHJvY2Vzc2luZyBkYXRhIC0gcmVhZGluZyBpbmNpZGVuY2UgZGF0YSBmcm9tIGZpbGVzIChmaWxlIG5hbWVzIAorICoga2V5ZWQgYnkgbG9jYXRpb24pIGFuZCBjcmVhdGluZyB0aGUgbmV3IGZvcm1hdCBDU1YgZmlsZXMgZm9yIFNURU0gCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9jZXNzb3JDb250cm9sIGV4dGVuZHMgQW5hbHlzaXNDb250cm9sIHsKKworCS8qKgorCSAqIFRoZSBmb3JtYXQgb2YgdGhlIHRpbWUgaW4gdGhlIGlucHV0IGZpbGVzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVfRk9STUFUID0gInl5eXktTU0tZGQiOworCQorCS8qKgorCSAqIElucHV0IHRleHQgZmllbGQgZm9yIHRoZSBzb3VyY2UgZm9sZGVyIG9mIHRoZSByYXcgZGF0YQorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBzb3VyY2VGb2xkZXI7CisKKwkvKioKKwkgKiBJbnB1dCB0ZXh0IGZpZWxkIGZvciB0aGUgdGFyZ2V0IGZvbGRlciBvZiB0aGUgcHJvY2Vzc2VkIGRhdGEKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFRleHQgdGFyZ2V0Rm9sZGVyOworCisJLyoqCisJICogSW5wdXQgdGV4dCBmaWVsZCBmb3IgdGhlIHBvcHVsYXRpb24gZGF0YSBmaWxlCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBUZXh0IHBvcHVsYXRpb25EYXRhRmlsZTsKKworCS8qKgorCSAqIFJlY292ZXJ5IHJhdGUKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFNwaW5uZXIgcmVjb3ZlcnlSYXRlOyAKKworCS8qKgorCSAqIFN1c2NlcHRpYmxlIHJhdGUKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFNwaW5uZXIgc3VzY2VwdGlibGVSYXRlOworCisJLyoqCisJICogSW1tdW5pdHkgbG9zcyByYXRlCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBTcGlubmVyIGltbXVuaXR5TG9zc1JhdGU7CisKKwkvKioKKwkgKiBQb3B1bGF0aW9uIHNpemUgaW4gdGhlIHN0YXJ0IHllYXIKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFNwaW5uZXIgcG9wdWxhdGlvblNpemVTdGFydFllYXI7CisKKwkvKioKKwkgKiBQb3B1bGF0aW9uIHNpemUgaW4gdGhlIGVuZCB5ZWFyCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBTcGlubmVyIHBvcHVsYXRpb25TaXplRW5kWWVhcjsKKwkKKwkvKioKKwkgKiBCdXR0b24gdG8gdHJpZ2dlciB0aGUgZGF0YSBwcm9jZXNzaW5nCisJICovCisJcHJvdGVjdGVkIEJ1dHRvbiBwcm9jZXNzQnV0dG9uOworCQorCS8qKgorCSAqIEEgbGFiZWwgdG8gcmVwb3J0IHN0YXR1cworCSAqLworCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgc3RhdHVzTGFiZWw7CisKKwkvKioKKwkgKiBTdGFydCBkYXRlIG9mIHRoZSBkYXRhCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBEYXRlIHN0YXJ0RGF0ZTsgCisKKwkvKioKKwkgKiBFbmQgZGF0ZSBvZiB0aGUgZGF0YQorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgRGF0ZSBlbmREYXRlOworCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqLworCXB1YmxpYyBQcm9jZXNzb3JDb250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnQsIFNXVC5Ob25lKTsKKwkJY3JlYXRlQ29udGVudHMoKTsKKwkKKwl9IC8vIFByb2Nlc3NvckNvbnRyb2wKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgY29udGVudHMgb2YgdGhlIHBsb3R0ZXIKKwkgKi8KKwl2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgeworCQorCQlmaW5hbCBTaGVsbCBzaGVsbCA9IHRoaXMuZ2V0U2hlbGwoKTsKKworCQlzZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7CisKKwkJaWRlbnRpZmlhYmxlVGl0bGUgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOworCQlpZGVudGlmaWFibGVUaXRsZS5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUFJPQ0VTU09SLlRJVExFIikpOworCQlEaXNwbGF5IGRpc3BsYXkgPSB0aGlzLmdldERpc3BsYXkoKTsKKwkJCisJCUNvbG9yIGxhYmVsQmFja2dyb3VuZCA9IG5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKDE4MCwgMTgwLCAyMDApKTsKKworCQkvLyBzdGF0dXMgbGFiZWwKKwkJc3RhdHVzTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULkJPUkRFUik7CisJCXN0YXR1c0xhYmVsLnNldFRleHQoIiIpOworCQkKKwkJLy8gc291cmNlIGZvbGRlcgorCQlMYWJlbCBzb3VyY2VGb2xkZXJMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuQk9SREVSKTsKKwkJc291cmNlRm9sZGVyTGFiZWwuc2V0QmFja2dyb3VuZChsYWJlbEJhY2tncm91bmQpOworCQlzb3VyY2VGb2xkZXJMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUFJPQ0VTU09SLlNPVVJDRUZPTERFUiIpKTsKKworCQlzb3VyY2VGb2xkZXIgPSBuZXcgVGV4dCh0aGlzLCBTV1QuQk9SREVSKTsKKwkJc291cmNlRm9sZGVyLnNldEJvdW5kcygxMCwgMTAsIDEwMCwgMjApOworCQlzb3VyY2VGb2xkZXIuc2V0VGV4dCgiIik7CisJCXNvdXJjZUZvbGRlci5zZXRFZGl0YWJsZShmYWxzZSk7IC8vIGNhbiBvbmx5IGJlIHNlbGVjdGVkIHRocm91Z2ggZGlhbG9nCisJCQorCSAgICBCdXR0b24gc2VsZWN0U291cmNlRm9sZGVyQnV0dG9uID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuTk9ORSk7CisJICAgIHNlbGVjdFNvdXJjZUZvbGRlckJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUFJPQ0VTU09SLlNFTEVDVFNPVVJDRUZPTERFUiIpKTsKKwkJc2VsZWN0U291cmNlRm9sZGVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlmaW5hbCBEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7CisJCQkJZGQuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBST0NFU1NPUi5TRUxFQ1RTT1VSQ0VGT0xERURJQUxPR1RJVExFIikpOworCisJCQkJU3RyaW5nIGRpciA9IHNvdXJjZUZvbGRlci5nZXRUZXh0KCk7CisJCQkJaWYoKGRpcj09bnVsbCl8fChkaXIubGVuZ3RoKCk8MSkpIGRpciA9IFJPT1RfUEFUSDsKKwkJCQkKKwkJCQlkZC5zZXRGaWx0ZXJQYXRoKGRpcik7CisJCQkJZmluYWwgU3RyaW5nIHNlbGVjdGVkID0gZGQub3BlbigpOworCQkJCWlmKHNlbGVjdGVkIT1udWxsKSBzb3VyY2VGb2xkZXIuc2V0VGV4dChzZWxlY3RlZCk7CisJCQkJaWYoc2VsZWN0ZWQgIT0gbnVsbCAmJiBzZWxlY3RlZC5sZW5ndGgoKSAhPSAwKSB7CisJCQkJCXN0YXR1c0xhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQUk9DRVNTT1IuUkVBRElOR0RBVEEiKSk7CisJCQkJCXBvcHVsYXRpb25TaXplU3RhcnRZZWFyLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCQlwb3B1bGF0aW9uU2l6ZUVuZFllYXIuc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJCWluaXRpYWxpemVEYXRlcygpOworCQkJCQlpZihzdGFydERhdGUgIT0gbnVsbCAmJiBlbmREYXRlICE9IG51bGwpIHsKKwkJCQkJCURhdGVGb3JtYXQgZm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoVElNRV9GT1JNQVQpOworCQkJCQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiUHJvY2Vzc2luZyBkYXRhIGZyb20gIiArIGZvcm1hdC5mb3JtYXQoc3RhcnREYXRlKSArICIgdG8gIiArIGZvcm1hdC5mb3JtYXQoZW5kRGF0ZSkpOworCQkJCQkJCisJCQkJCQkvLyBpbml0aWFsaXplIHRhcmdldCBmb2xkZXIgdG8gdGhlIHNvdXJjZSBmb2xkZXIKKwkJCQkJCWlmICh0YXJnZXRGb2xkZXIuZ2V0VGV4dCgpID09IG51bGwgfHwgdGFyZ2V0Rm9sZGVyLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCQkJdGFyZ2V0Rm9sZGVyLnNldFRleHQoc2VsZWN0ZWQpOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlDYWxlbmRhciBzdGFydENhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisJCQkJCQlzdGFydENhbC5zZXRUaW1lKHN0YXJ0RGF0ZSk7CisJCQkJCQlDYWxlbmRhciBlbmRDYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworCQkJCQkJZW5kQ2FsLnNldFRpbWUoZW5kRGF0ZSk7CisJCQkJCQlwb3B1bGF0aW9uU2l6ZVN0YXJ0WWVhci5zZXRFbmFibGVkKHRydWUpOworCQkJCQkJaWYoc3RhcnRDYWwuZ2V0KENhbGVuZGFyLllFQVIpIDwgZW5kQ2FsLmdldChDYWxlbmRhci5ZRUFSKSkgeworCQkJCQkJCXBvcHVsYXRpb25TaXplRW5kWWVhci5zZXRFbmFibGVkKHRydWUpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gZmFpbGVkIHRvIHJlYWQgZGF0YSAtIGludmFsaWQgZGF0YQorCQkJCQkJc3RhdHVzTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBST0NFU1NPUi5GQUlMRURSRUFEREFUQSIpKTsKKwkJCQkJCXNvdXJjZUZvbGRlci5zZXRUZXh0KCIiKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbmFibGVQcm9jZXNzQnV0dG9uKCk7CisJCQl9CisJCX0pOworCisJICAgIC8vIHRhcmdldCBmb2xkZXIKKwkJTGFiZWwgdGFyZ2V0Rm9sZGVyTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULkJPUkRFUik7CisJCXRhcmdldEZvbGRlckxhYmVsLnNldEJhY2tncm91bmQobGFiZWxCYWNrZ3JvdW5kKTsKKwkJdGFyZ2V0Rm9sZGVyTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBST0NFU1NPUi5UQVJHRVRGT0xERVIiKSk7CisKKwkJdGFyZ2V0Rm9sZGVyID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7CisJCXRhcmdldEZvbGRlci5zZXRCb3VuZHMoMTAsIDEwLCAxMDAsIDIwKTsKKwkJdGFyZ2V0Rm9sZGVyLnNldFRleHQoIiIpOworCQl0YXJnZXRGb2xkZXIuc2V0RWRpdGFibGUoZmFsc2UpOyAvLyBjYW4gb25seSBiZSBzZWxlY3RlZCB0aHJvdWdoIGRpYWxvZworCisJCUJ1dHRvbiBzZWxlY3RUYXJnZXRGb2xkZXJCdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5OT05FKTsKKwkgICAgc2VsZWN0VGFyZ2V0Rm9sZGVyQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQUk9DRVNTT1IuU0VMRUNUVEFSR0VURk9MREVSIikpOworCQlzZWxlY3RUYXJnZXRGb2xkZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWZpbmFsIERpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKKwkJCQlkZC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUFJPQ0VTU09SLlNFTEVDVFRBUkdFVEZPTERFRElBTE9HVElUTEUiKSk7CisJCQkJCisJCQkJU3RyaW5nIGRpciA9IHRhcmdldEZvbGRlci5nZXRUZXh0KCk7CisJCQkJaWYoKGRpcj09bnVsbCl8fChkaXIubGVuZ3RoKCk8MSkpIGRpciA9IFJPT1RfUEFUSDsKKwkJCQkKKwkJCQlkZC5zZXRGaWx0ZXJQYXRoKGRpcik7CisJCQkJZmluYWwgU3RyaW5nIHNlbGVjdGVkID0gZGQub3BlbigpOworCQkJCWlmKHNlbGVjdGVkIT1udWxsKSB0YXJnZXRGb2xkZXIuc2V0VGV4dChzZWxlY3RlZCk7CisJCQkJZW5hYmxlUHJvY2Vzc0J1dHRvbigpOworCQkJfQorCQl9KTsKKworCSAgICAvLyBwb3B1bGF0aW9uIGRhdGEgZmlsZQorCQlMYWJlbCBwb3B1bGF0aW9uRGF0YUZpbGVMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuQk9SREVSKTsKKwkJcG9wdWxhdGlvbkRhdGFGaWxlTGFiZWwuc2V0QmFja2dyb3VuZChsYWJlbEJhY2tncm91bmQpOworCQlwb3B1bGF0aW9uRGF0YUZpbGVMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUFJPQ0VTU09SLlBPUFVMQVRJT05EQVRBRklMRSIpKTsKKworCQlwb3B1bGF0aW9uRGF0YUZpbGUgPSBuZXcgVGV4dCh0aGlzLCBTV1QuQk9SREVSKTsKKwkJcG9wdWxhdGlvbkRhdGFGaWxlLnNldEJvdW5kcygxMCwgMTAsIDEwMCwgMjApOworCQlwb3B1bGF0aW9uRGF0YUZpbGUuc2V0VGV4dCgiIik7CisJCXBvcHVsYXRpb25EYXRhRmlsZS5zZXRFZGl0YWJsZShmYWxzZSk7IC8vIGNhbiBvbmx5IGJlIHNlbGVjdGVkIHRocm91Z2ggZGlhbG9nCisKKwkJQnV0dG9uIHNlbGVjdFBvcHVsYXRpb25EYXRhRmlsZUJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcywgU1dULk5PTkUpOworCQlzZWxlY3RQb3B1bGF0aW9uRGF0YUZpbGVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBST0NFU1NPUi5TRUxFQ1RQT1BVTEFUSU9OREFUQUZJTEUiKSk7CisJCXNlbGVjdFBvcHVsYXRpb25EYXRhRmlsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJZmluYWwgRmlsZURpYWxvZyBmZCA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7CisJCQkJZmQuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBST0NFU1NPUi5TRUxFQ1RQT1BVTEFUSU9OREFUQUZJTEVESUFMT0dUSVRMRSIpKTsKKwkJCQlTdHJpbmcgYmVnaW5TZWFyY2ggPSBwb3B1bGF0aW9uRGF0YUZpbGUuZ2V0VGV4dCgpOworCQkJCWlmKChiZWdpblNlYXJjaD09bnVsbCl8fChiZWdpblNlYXJjaC5sZW5ndGgoKTwxKSkgYmVnaW5TZWFyY2ggPSBST09UX1BBVEg7CisJCQkJCisJCQkJZmQuc2V0RmlsdGVyUGF0aChiZWdpblNlYXJjaCk7CisJCQkJZmluYWwgU3RyaW5nIHNlbGVjdGVkID0gZmQub3BlbigpOworCQkJCWlmKHNlbGVjdGVkIT1udWxsKSBwb3B1bGF0aW9uRGF0YUZpbGUuc2V0VGV4dChzZWxlY3RlZCk7CisJCQkJZW5hYmxlUHJvY2Vzc0J1dHRvbigpOworCQkJfQorCQl9KTsKKworCQkvLyBwYXJhbWV0ZXJzCisJCUxhYmVsIHBhcmFtZXRlcnNMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuQk9SREVSKTsKKwkJcGFyYW1ldGVyc0xhYmVsLnNldEJhY2tncm91bmQobGFiZWxCYWNrZ3JvdW5kKTsKKwkJcGFyYW1ldGVyc0xhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQUk9DRVNTT1IuUEFSQU1FVEVSUyIpKTsKKworCQlDb21wb3NpdGUgc3Bpbm5lckNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULkJPUkRFUik7CisJCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDY7CisJICAgIHNwaW5uZXJDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOworCQkKKwkJLy8gcmVjb3ZlcnkgcmF0ZQorCQlMYWJlbCByZWNvdmVyeVJhdGVMYWJlbCA9IG5ldyBMYWJlbChzcGlubmVyQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCXJlY292ZXJ5UmF0ZUxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQUk9DRVNTT1IuUkVDT1ZFUllSQVRFIikpOworCisJCXJlY292ZXJ5UmF0ZSA9IG5ldyBTcGlubmVyKHNwaW5uZXJDb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJcmVjb3ZlcnlSYXRlLnNldERpZ2l0cygyKTsgLy8gYWxsb3cgMiBkZWNpbWFsIHBsYWNlcworCQlyZWNvdmVyeVJhdGUuc2V0TWluaW11bSgwKTsJLy8gc2V0IHRoZSBtaW5pbXVtIHZhbHVlIHRvIDAKKwkJcmVjb3ZlcnlSYXRlLnNldE1heGltdW0oMTAwKTsgLy8gc2V0IHRoZSBtYXhpbXVtIHZhbHVlIHRvIDEuMAorCQlyZWNvdmVyeVJhdGUuc2V0SW5jcmVtZW50KDEpOyAvLyBzZXQgdGhlIGluY3JlbWVudCB2YWx1ZSB0byAwLjAxCisJCXJlY292ZXJ5UmF0ZS5zZXRTZWxlY3Rpb24oMjApOwkvLyBzZXQgdGhlIGluaXRpYWwgdmFsdWUgMC4yCisJCXJlY292ZXJ5UmF0ZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBNb2RpZnlFdmVudCBlKSB7CisJCQkJZW5hYmxlUHJvY2Vzc0J1dHRvbigpOworCQkJfQorCQl9KTsKKworCQkvLyBzdXNjZXB0aWJsZSByYXRlCisJCUxhYmVsIHN1c2NlcHRpYmxlUmF0ZUxhYmVsID0gbmV3IExhYmVsKHNwaW5uZXJDb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJc3VzY2VwdGlibGVSYXRlTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBST0NFU1NPUi5TVVNDRVBUSUJMRVJBVEUiKSk7CisKKwkJc3VzY2VwdGlibGVSYXRlID0gbmV3IFNwaW5uZXIoc3Bpbm5lckNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlzdXNjZXB0aWJsZVJhdGUuc2V0RGlnaXRzKDMpOyAvLyBhbGxvdyAzIGRlY2ltYWwgcGxhY2VzCisJCXN1c2NlcHRpYmxlUmF0ZS5zZXRNaW5pbXVtKDApOwkvLyBzZXQgdGhlIG1pbmltdW0gdmFsdWUgdG8gMAorCQlzdXNjZXB0aWJsZVJhdGUuc2V0TWF4aW11bSgxMDAwKTsgLy8gc2V0IHRoZSBtYXhpbXVtIHZhbHVlIHRvIDEuMAorCQlzdXNjZXB0aWJsZVJhdGUuc2V0SW5jcmVtZW50KDEpOyAvLyBzZXQgdGhlIGluY3JlbWVudCB2YWx1ZSB0byAwLjAwMQorCQlzdXNjZXB0aWJsZVJhdGUuc2V0U2VsZWN0aW9uKDMzMyk7CS8vIHNldCB0aGUgaW5pdGlhbCB2YWx1ZSAwLjAwMQorCQlzdXNjZXB0aWJsZVJhdGUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgTW9kaWZ5RXZlbnQgZSkgeworCQkJCWVuYWJsZVByb2Nlc3NCdXR0b24oKTsKKwkJCX0KKwkJfSk7CisKKwkJLy8gaW1tdW5pdHkgbG9zcyByYXRlCisJCUxhYmVsIGltbXVuaXR5TG9zc1JhdGVMYWJlbCA9IG5ldyBMYWJlbChzcGlubmVyQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWltbXVuaXR5TG9zc1JhdGVMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUFJPQ0VTU09SLklNTVVOSVRZTE9TU1JBVEUiKSk7CisKKwkJaW1tdW5pdHlMb3NzUmF0ZSA9IG5ldyBTcGlubmVyKHNwaW5uZXJDb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJaW1tdW5pdHlMb3NzUmF0ZS5zZXREaWdpdHMoNCk7IC8vIGFsbG93IDQgZGVjaW1hbCBwbGFjZXMKKwkJaW1tdW5pdHlMb3NzUmF0ZS5zZXRNaW5pbXVtKDApOwkvLyBzZXQgdGhlIG1pbmltdW0gdmFsdWUgdG8gMAorCQlpbW11bml0eUxvc3NSYXRlLnNldE1heGltdW0oMTAwMDApOyAvLyBzZXQgdGhlIG1heGltdW0gdmFsdWUgdG8gMS4wCisJCWltbXVuaXR5TG9zc1JhdGUuc2V0SW5jcmVtZW50KDEpOyAvLyBzZXQgdGhlIGluY3JlbWVudCB2YWx1ZSB0byAwLjAwMDEKKwkJaW1tdW5pdHlMb3NzUmF0ZS5zZXRTZWxlY3Rpb24oOSk7CS8vIHNldCB0aGUgaW5pdGlhbCB2YWx1ZSAwLjAwMDkKKwkJaW1tdW5pdHlMb3NzUmF0ZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBNb2RpZnlFdmVudCBlKSB7CisJCQkJZW5hYmxlUHJvY2Vzc0J1dHRvbigpOworCQkJfQorCQl9KTsKKworCQlzcGlubmVyQ29tcG9zaXRlLnBhY2soKTsKKworCQkvLyBwb3B1bGF0aW9uIHNpemUKKwkJTGFiZWwgcG9wdWxhdGlvblNpemVMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuQk9SREVSKTsKKwkJcG9wdWxhdGlvblNpemVMYWJlbC5zZXRCYWNrZ3JvdW5kKGxhYmVsQmFja2dyb3VuZCk7CisJCXBvcHVsYXRpb25TaXplTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBST0NFU1NPUi5QT1BVTEFUSU9OU0laRSIpKTsKKworCQlDb21wb3NpdGUgc2l6ZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULkJPUkRFUik7CisJCWdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSA0OworCSAgICBzaXplQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKKworCQkvLyBzdGFydCB5ZWFyCisJCUxhYmVsIHBvcHVsYXRpb25TaXplU3RhcnRZZWFyTGFiZWwgPSBuZXcgTGFiZWwoc2l6ZUNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlwb3B1bGF0aW9uU2l6ZVN0YXJ0WWVhckxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQUk9DRVNTT1IuU1RBUlRZRUFSIikpOworCisJCXBvcHVsYXRpb25TaXplU3RhcnRZZWFyID0gbmV3IFNwaW5uZXIoc2l6ZUNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlwb3B1bGF0aW9uU2l6ZVN0YXJ0WWVhci5zZXREaWdpdHMoMCk7IC8vIGFsbG93IDAgZGVjaW1hbCBwbGFjZXMKKwkJcG9wdWxhdGlvblNpemVTdGFydFllYXIuc2V0TWluaW11bSgwKTsJLy8gc2V0IHRoZSBtaW5pbXVtIHZhbHVlIHRvIDAKKwkJcG9wdWxhdGlvblNpemVTdGFydFllYXIuc2V0TWF4aW11bSgxMDAwMDAwMDApOyAvLyBzZXQgdGhlIG1heGltdW0gdmFsdWUgdG8gMTAwLDAwMCwwMDAKKwkJcG9wdWxhdGlvblNpemVTdGFydFllYXIuc2V0SW5jcmVtZW50KDEwMDApOyAvLyBzZXQgdGhlIGluY3JlbWVudCB2YWx1ZSB0byAxMDAwCisJCXBvcHVsYXRpb25TaXplU3RhcnRZZWFyLnNldFNlbGVjdGlvbigxMDAwMDAwMCk7CS8vIHNldCB0aGUgaW5pdGlhbCB2YWx1ZSAxMCwwMDAsMDAwCisJCXBvcHVsYXRpb25TaXplU3RhcnRZZWFyLnNldEVuYWJsZWQoZmFsc2UpOworCQlwb3B1bGF0aW9uU2l6ZVN0YXJ0WWVhci5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBNb2RpZnlFdmVudCBlKSB7CisJCQkJZW5hYmxlUHJvY2Vzc0J1dHRvbigpOworCQkJfQorCQl9KTsKKworCQkvLyBlbmQgeWVhcgorCQlMYWJlbCBwb3B1bGF0aW9uU2l6ZUVuZFllYXJMYWJlbCA9IG5ldyBMYWJlbChzaXplQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCXBvcHVsYXRpb25TaXplRW5kWWVhckxhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQUk9DRVNTT1IuRU5EWUVBUiIpKTsKKworCQlwb3B1bGF0aW9uU2l6ZUVuZFllYXIgPSBuZXcgU3Bpbm5lcihzaXplQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCXBvcHVsYXRpb25TaXplRW5kWWVhci5zZXREaWdpdHMoMCk7IC8vIGFsbG93IDAgZGVjaW1hbCBwbGFjZXMKKwkJcG9wdWxhdGlvblNpemVFbmRZZWFyLnNldE1pbmltdW0oMCk7CS8vIHNldCB0aGUgbWluaW11bSB2YWx1ZSB0byAwCisJCXBvcHVsYXRpb25TaXplRW5kWWVhci5zZXRNYXhpbXVtKDEwMDAwMDAwMCk7IC8vIHNldCB0aGUgbWF4aW11bSB2YWx1ZSB0byAxMDAsMDAwLDAwMAorCQlwb3B1bGF0aW9uU2l6ZUVuZFllYXIuc2V0SW5jcmVtZW50KDEwMDApOyAvLyBzZXQgdGhlIGluY3JlbWVudCB2YWx1ZSB0byAxMDAwCisJCXBvcHVsYXRpb25TaXplRW5kWWVhci5zZXRTZWxlY3Rpb24oMTAwMDAwMDApOwkvLyBzZXQgdGhlIGluaXRpYWwgdmFsdWUgMTAsMDAwLDAwMAorCQlwb3B1bGF0aW9uU2l6ZUVuZFllYXIuc2V0RW5hYmxlZChmYWxzZSk7CisJCXBvcHVsYXRpb25TaXplRW5kWWVhci5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBNb2RpZnlFdmVudCBlKSB7CisJCQkJZW5hYmxlUHJvY2Vzc0J1dHRvbigpOworCQkJfQorCQl9KTsKKworCQlzaXplQ29tcG9zaXRlLnBhY2soKTsKKwkgICAgCisJCS8vIHByb2Nlc3MgYnV0dG9uCisJCXByb2Nlc3NCdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5OT05FKTsKKwkJcHJvY2Vzc0J1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiUFJPQ0VTU09SLlBST0NFU1MiKSk7CisJCXByb2Nlc3NCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXRyeSB7CisJCQkJCURhdGFQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IERhdGFQcm9jZXNzb3IoKTsKKwkJCQkJcHJvY2Vzc29yLnByb2Nlc3MoCisJCQkJCQkJc291cmNlRm9sZGVyLmdldFRleHQoKSwgCisJCQkJCQkJdGFyZ2V0Rm9sZGVyLmdldFRleHQoKSwgCisJCQkJCQkJc3RhcnREYXRlLCAKKwkJCQkJCQllbmREYXRlLCAKKwkJCQkJCQlwb3B1bGF0aW9uRGF0YUZpbGUuZ2V0VGV4dCgpLCAKKwkJCQkJCQlMb25nLnBhcnNlTG9uZyhwb3B1bGF0aW9uU2l6ZVN0YXJ0WWVhci5nZXRUZXh0KCkpLCAKKwkJCQkJCQlMb25nLnBhcnNlTG9uZyhwb3B1bGF0aW9uU2l6ZUVuZFllYXIuZ2V0VGV4dCgpKSwKKwkJCQkJCQlEb3VibGUucGFyc2VEb3VibGUocmVjb3ZlcnlSYXRlLmdldFRleHQoKSksIAorCQkJCQkJCURvdWJsZS5wYXJzZURvdWJsZShzdXNjZXB0aWJsZVJhdGUuZ2V0VGV4dCgpKSwKKwkJCQkJCQlEb3VibGUucGFyc2VEb3VibGUoaW1tdW5pdHlMb3NzUmF0ZS5nZXRUZXh0KCkpKTsKKwkJCQkJc3RhdHVzTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkNPTU1PTi5ET05FIikpOworCQkJCX0gY2F0Y2goU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJCQlzdGF0dXNMYWJlbC5zZXRUZXh0KGV4LmdldE1lc3NhZ2UoKSk7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJZW5hYmxlUHJvY2Vzc0J1dHRvbigpOworCisJCWNyZWF0ZUZvcm1EYXRhKG51bGwsIGlkZW50aWZpYWJsZVRpdGxlLCBudWxsLCBudWxsLCA1KTsKKwkJY3JlYXRlRm9ybURhdGEoaWRlbnRpZmlhYmxlVGl0bGUsIHNvdXJjZUZvbGRlckxhYmVsLCBzb3VyY2VGb2xkZXIsIHNlbGVjdFNvdXJjZUZvbGRlckJ1dHRvbiwgMTApOworCQljcmVhdGVGb3JtRGF0YShzb3VyY2VGb2xkZXJMYWJlbCwgdGFyZ2V0Rm9sZGVyTGFiZWwsIHRhcmdldEZvbGRlciwgc2VsZWN0VGFyZ2V0Rm9sZGVyQnV0dG9uLCAxNSk7CisJCWNyZWF0ZUZvcm1EYXRhKHRhcmdldEZvbGRlckxhYmVsLCBwb3B1bGF0aW9uRGF0YUZpbGVMYWJlbCwgcG9wdWxhdGlvbkRhdGFGaWxlLCBzZWxlY3RQb3B1bGF0aW9uRGF0YUZpbGVCdXR0b24sIDIwKTsKKwkJY3JlYXRlRm9ybURhdGEocG9wdWxhdGlvbkRhdGFGaWxlTGFiZWwsIHBhcmFtZXRlcnNMYWJlbCwgc3Bpbm5lckNvbXBvc2l0ZSwgbnVsbCwgMjUpOworCQljcmVhdGVGb3JtRGF0YShwYXJhbWV0ZXJzTGFiZWwsIHBvcHVsYXRpb25TaXplTGFiZWwsIHNpemVDb21wb3NpdGUsIG51bGwsIDMwKTsKKwkJY3JlYXRlRm9ybURhdGEocG9wdWxhdGlvblNpemVMYWJlbCwgbnVsbCwgbnVsbCwgcHJvY2Vzc0J1dHRvbiwgMzUpOworCQljcmVhdGVGb3JtRGF0YShwcm9jZXNzQnV0dG9uLCBzdGF0dXNMYWJlbCwgbnVsbCwgbnVsbCwgMTAwKTsKKworCX0gLy8gY3JlYXRlQ29udGVudHMKKwkKKwkvKioKKwkgKiBFbmFibGUgb3IgZGlzYWJsZSB0aGUgcHJvY2VzcyBidXR0b24KKwkgKi8KKwl2b2lkIGVuYWJsZVByb2Nlc3NCdXR0b24oKSB7CisJCQorCQlib29sZWFuIGVuYWJsZWQgPSB0cnVlOworCQlpZiAoZW5hYmxlZCAmJiAoc291cmNlRm9sZGVyLmdldFRleHQoKSA9PSBudWxsIHx8IHNvdXJjZUZvbGRlci5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkpCisJCQllbmFibGVkID0gZmFsc2U7CisJCWlmIChlbmFibGVkICYmICh0YXJnZXRGb2xkZXIuZ2V0VGV4dCgpID09IG51bGwgfHwgdGFyZ2V0Rm9sZGVyLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKSkKKwkJCWVuYWJsZWQgPSBmYWxzZTsKKwkJaWYgKGVuYWJsZWQgJiYgKHBvcHVsYXRpb25EYXRhRmlsZS5nZXRUZXh0KCkgPT0gbnVsbCB8fCBwb3B1bGF0aW9uRGF0YUZpbGUuZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApKQorCQkJZW5hYmxlZCA9IGZhbHNlOworCQlpZiAoZW5hYmxlZCAmJiAocmVjb3ZlcnlSYXRlLmdldFRleHQoKSA9PSBudWxsIHx8IHJlY292ZXJ5UmF0ZS5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkpCisJCQllbmFibGVkID0gZmFsc2U7CisJCWlmIChlbmFibGVkICYmIChzdXNjZXB0aWJsZVJhdGUuZ2V0VGV4dCgpID09IG51bGwgfHwgc3VzY2VwdGlibGVSYXRlLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKSkKKwkJCWVuYWJsZWQgPSBmYWxzZTsKKwkJaWYgKGVuYWJsZWQgJiYgKGltbXVuaXR5TG9zc1JhdGUuZ2V0VGV4dCgpID09IG51bGwgfHwgaW1tdW5pdHlMb3NzUmF0ZS5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkpCisJCQllbmFibGVkID0gZmFsc2U7CisJCWlmIChlbmFibGVkICYmIChwb3B1bGF0aW9uU2l6ZVN0YXJ0WWVhci5nZXRUZXh0KCkgPT0gbnVsbCB8fCBwb3B1bGF0aW9uU2l6ZVN0YXJ0WWVhci5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkpCisJCQllbmFibGVkID0gZmFsc2U7CisJCWlmIChlbmFibGVkICYmIChwb3B1bGF0aW9uU2l6ZUVuZFllYXIuZ2V0VGV4dCgpID09IG51bGwgfHwgcG9wdWxhdGlvblNpemVFbmRZZWFyLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKSkKKwkJCWVuYWJsZWQgPSBmYWxzZTsKKwkJdGhpcy5wcm9jZXNzQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7CisJCisJfSAvLyBlbmFibGVQcm9jZXNzQnV0dG9uCisJCisJLyoqCisJICogSW5pdGlhbGl6ZXMgdGhlIHN0YXJ0IGFuZCBlbmQgZGF0ZXMgb2YgdGhlIGRhdGEuCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURhdGVzKCkgeworCQorCQlzdGFydERhdGUgPSBudWxsOworCQllbmREYXRlID0gbnVsbDsKKworCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShzb3VyY2VGb2xkZXIuZ2V0VGV4dCgpKTsKKwkJCisJCUZpbGVbXSBhbGxGaWxlcyA9IGZpbGUubGlzdEZpbGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRmlsZXMubGVuZ3RoOyBpKyspIHsKKwkJCVN0cmluZyBmaWxlTmFtZSA9IGFsbEZpbGVzW2ldLmdldE5hbWUoKTsKKwkJCWlmIChmaWxlTmFtZS5pbmRleE9mKCIudHh0IikgPj0gMCkgeworCQkJCUJ1ZmZlcmVkUmVhZGVyIGZpbGVSZWFkZXIgPSBEYXRhUHJvY2Vzc29yLm9wZW5SZWFkZXIoYWxsRmlsZXNbaV0pOworCQkJCWlmIChmaWxlUmVhZGVyICE9IG51bGwpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCVN0cmluZyBidWZmZXIgPSBudWxsOworCQkJCQkJZmlsZVJlYWRlci5yZWFkTGluZSgpOyAvLyBza2lwIHRoZSBoZWFkZXIKKwkJCQkJCXdoaWxlIChEYXRhUHJvY2Vzc29yLkVPRihidWZmZXIgPSBmaWxlUmVhZGVyLnJlYWRMaW5lKCkpICE9IHRydWUpIHsKKwkJCQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihidWZmZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlpZih0b2tlbml6ZXIuY291bnRUb2tlbnMoKSA9PSAzKSB7CisJCQkJCQkJCXRva2VuaXplci5uZXh0VG9rZW4oIiwiKTsgLy8gaXRlcmF0aW9uCisJCQkJCQkJCVN0cmluZyB0aW1lID0gdG9rZW5pemVyLm5leHRUb2tlbigiLCIpOworCQkJCQkJCQl0b2tlbml6ZXIubmV4dFRva2VuKCIsIik7IC8vIGluY2lkZW5jZQorCQkJCQkJCQkKKwkJCQkJCQkJaWYodGltZSE9IG51bGwpIHsKKwkJCQkJCQkJCURhdGVGb3JtYXQgZm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoVElNRV9GT1JNQVQpOworCQkJCQkJCQkJRGF0ZSBkYXRlID0gZm9ybWF0LnBhcnNlKHRpbWUpOworCQkJCQkJCQkJaWYoc3RhcnREYXRlID09IG51bGwgfHwgZGF0ZS5iZWZvcmUoc3RhcnREYXRlKSkgeworCQkJCQkJCQkJCXN0YXJ0RGF0ZSA9IGRhdGU7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlpZihlbmREYXRlID09IG51bGwgfHwgZGF0ZS5hZnRlcihlbmREYXRlKSkgeworCQkJCQkJCQkJCWVuZERhdGUgPSBkYXRlOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworCQkJCQkJLy8gaWdub3JlCisJCQkJCX0KKwkJCQl9IC8vIGlmICEgbnVsbAorCQkJfSAvLyBpZiB2YWxpZCBmaWxlbmFtZQorCQl9IC8vIGZvcgorCQkKKwl9IC8vIGluaXRpYWxpemVEYXRlcworCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBGb3JtRGF0YSB3aGljaCBjb250YWlucyBMYWJlbCwgQ29udHJvbCBhbmQgQnV0dG9uLgorCSAqIAorCSAqIEBwYXJhbSB0b3BDb250cm9sIFRoZSBjb250cm9sIGF0IHRoZSB0b3Agb2YgdGhpcyBGb3JtRGF0YQorCSAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgb2YgdGhpcyBGb3JtRGF0YQorCSAqIEBwYXJhbSB0ZXh0IFRoZSBjb250cm9sIG9mIHRoaXMgRm9ybURhdGEKKwkgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24gb2YgdGhpcyBGb3JtRGF0YQorCSAqIEBwYXJhbSBib3R0b20gVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHBvc2l0aW9uIG9mIHRoaXMgRm9ybURhdGEKKwkgKi8KKwlwcml2YXRlIHZvaWQgY3JlYXRlRm9ybURhdGEoQ29udHJvbCB0b3BDb250cm9sLCBMYWJlbCBsYWJlbCwgQ29udHJvbCB0ZXh0LCBCdXR0b24gYnV0dG9uLCBpbnQgYm90dG9tKSB7IAorCisJCS8vIGxhYmVsCisJCWlmIChsYWJlbCAhPSBudWxsKSB7CisJCQlmaW5hbCBGb3JtRGF0YSBsYWJlbEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCQlpZiAodG9wQ29udHJvbCAhPSBudWxsKQorCQkJCWxhYmVsRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRvcENvbnRyb2wsIDApOworCQkJZWxzZQorCQkJCWxhYmVsRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQkJbGFiZWxGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tLCAwKTsKKwkJCWxhYmVsRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJCWludCBudW1lcmF0b3IgPSAxNTsKKwkJCWlmICh0ZXh0ID09IG51bGwgJiYgYnV0dG9uID09IG51bGwpCisJCQkJbnVtZXJhdG9yID0gMTAwOworCQkJbGFiZWxGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChudW1lcmF0b3IsIDApOworCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShsYWJlbEZvcm1EYXRhKTsKKwkJfQorCQkKKwkJLy8gdGV4dCBmaWVsZAorCQlpZiAodGV4dCAhPSBudWxsKSB7CisJCQlmaW5hbCBGb3JtRGF0YSB0ZXh0RmllbGRGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQkJaWYgKHRvcENvbnRyb2wgIT0gbnVsbCkKKwkJCQl0ZXh0RmllbGRGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodG9wQ29udHJvbCwgMCk7CisJCQllbHNlCisJCQkJdGV4dEZpZWxkRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQkJdGV4dEZpZWxkRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGJvdHRvbSwgMCk7CisJCQlpZiAobGFiZWwgIT0gbnVsbCkKKwkJCQl0ZXh0RmllbGRGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGxhYmVsLCAwKTsKKwkJCWVsc2UKKwkJCQl0ZXh0RmllbGRGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQkJaW50IG51bWVyYXRvciA9IDgwOworCQkJaWYgKGJ1dHRvbiA9PSBudWxsKQorCQkJCW51bWVyYXRvciA9IDEwMDsKKwkJCXRleHRGaWVsZEZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG51bWVyYXRvciwgMCk7CisJCQl0ZXh0LnNldExheW91dERhdGEodGV4dEZpZWxkRm9ybURhdGEpOworCQl9CisJCQorCQkvLyBzZWxlY3Rpb24gYnV0dG9uCisJCWlmIChidXR0b24gIT0gbnVsbCkgeworCQkJZmluYWwgRm9ybURhdGEgYnV0dG9uRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsJCQorCQkJaWYgKHRvcENvbnRyb2wgIT0gbnVsbCkKKwkJCQlidXR0b25Gb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodG9wQ29udHJvbCwgMCk7CisJCQllbHNlCisJCQkJYnV0dG9uRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQkJYnV0dG9uRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGJvdHRvbSwgMCk7CisJCQlpZiAodGV4dCAhPSBudWxsKQorCQkJCWJ1dHRvbkZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGV4dCwgMCk7CisJCQllbHNlIGlmIChsYWJlbCAhPSBudWxsKQorCQkJCWJ1dHRvbkZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobGFiZWwsIDApOworCQkJZWxzZQorCQkJCWJ1dHRvbkZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCQlidXR0b25Gb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQkJYnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uRm9ybURhdGEpOworCQl9CisKKwl9IC8vIGNyZWF0ZUZvcm1EYXRhCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQjZGlzcG9zZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0gLy8gZGlzcG9zZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuQW5hbHlzaXNDb250cm9sI3JlbW92ZSgpCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlKCkgeworCQkvLyBkbyBub3RoaW5nIGZvciBub3cKKwl9IC8vIHJlbW92ZQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuQW5hbHlzaXNDb250cm9sI2luaXRpYWxpemVIZWFkZXIoU3RyaW5nKQorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVIZWFkZXIoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZyBmb2xkZXJOYW1lKSB7CisJCS8vIGRvIG5vdGhpbmcgZm9yIG5vdworCX0gLy8gaW5pdGlhbGl6ZUhlYWRlcgorCisJLyoqCisJICogTm90IHVzZWQKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5BbmFseXNpc0NvbnRyb2wjZ2V0VmFsdWVzKGludCwgaW50KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBkb3VibGVbXSBnZXRWYWx1ZXMoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpaW50IGNoYXJ0SW5kZXgsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKWludCB0cmFqZWN0b3J5KSB7CisJCXJldHVybiBudWxsOworCX0gLy8gZ2V0VmFsdWVzCisJCisJLyoqCisJICogTm90IHVzZWQKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3cy5BbmFseXNpc0NvbnRyb2wjZ2V0UHJvcGVydHkoaW50LCBpbnQpCisJICovCisJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGNoYXJ0SW5kZXgsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgc3RhdGUpIHsKKwkJcmV0dXJuIG51bGw7CisJfSAvLyBnZXRQcm9wZXJ0eQorCQorCS8qKgorCSAqIE5vdCB1c2VkCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuQW5hbHlzaXNDb250cm9sI2dldE51bVByb3BlcnRpZXMoaW50IGNoYXJ0SW5kZXgpCisJICovCisJcHVibGljIGludCBnZXROdW1Qcm9wZXJ0aWVzKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgY2hhcnRJbmRleCkgeworCQlyZXR1cm4gMDsKKwl9IC8vIGdldE51bVByb3BlcnRpZXMKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzLkFuYWx5c2lzQ29udHJvbCNnZXRDb250cm9sUGFyYW1ldGVyc01hcCgpCisJICovCisJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0Q29udHJvbFBhcmFtZXRlcnNNYXAoKSB7CisKKwkJLy8gYWRkIG5vdGhpbmcgZm9yIG5vdworCQlyZXR1cm4gY29udHJvbFBhcmFtZXRlcnNNYXA7CisJfSAvLyBnZXRDb250cm9sUGFyYW1ldGVyc01hcAorCQorfSAvLyBQcm9jZXNzb3JDb250cm9sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9Qcm9jZXNzb3JGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9Qcm9jZXNzb3JGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxZWFhZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL1Byb2Nlc3NvckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUxIEBACisvLyBQcm9jZXNzb3JGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIFByb2Nlc3NvckNvbnRyb2x9IGluc3RhbmNlcy4KKyAqLworcHVibGljIGNsYXNzIFByb2Nlc3NvckZhY3RvcnkgaW1wbGVtZW50cyBBbmFseXNpc0NvbnRyb2xGYWN0b3J5IHsKKworCS8qKgorCSAqIHB1YmxpYyBJTlNUQU5DRSBmb3IgdGhpcyBGYWN0b3J5CisJICovCisJcHVibGljIHN0YXRpYyBQcm9jZXNzb3JGYWN0b3J5IElOU1RBTkNFID0gbmV3IFByb2Nlc3NvckZhY3RvcnkoKTsKKworCS8qKgorCSAqIENvbnN0YW50cyAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTkFMWVNJU19UWVBFID0gIlByb2Nlc3NvciI7CisJCisJLyoqCisJICogCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBkaXJOYW1lCisJICogQHJldHVybiBuZXcgUHJvY2Vzc29yQ29udHJvbCgpCisJICovCisJcHVibGljIEFuYWx5c2lzQ29udHJvbCBjcmVhdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRpck5hbWUpIHsKKwkJCQkKKwkJcmV0dXJuIG5ldyBQcm9jZXNzb3JDb250cm9sKHBhcmVudCk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0eXBlIG9mIGFuYWx5c2lzCisJICogCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb250cm9sVHlwZSgpIHsKKwkJcmV0dXJuIEFOQUxZU0lTX1RZUEU7CisJfQorCit9IC8vIFByb2Nlc3NvckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL1Byb2Nlc3NvclZpZXcuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL1Byb2Nlc3NvclZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGYxOTU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvUHJvY2Vzc29yVmlldy5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8vIFByb2Nlc3NvclZpZXcgCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OworCisvKioKKyAqIFRoaXMgdmlldyBwcm92aWRlcyBhIHRvb2wgdG8gZXN0aW1hdGUgcGFyYW1ldGVycyBmb3IgYSBzZXQgb2YgcmVmZXJlbmNlIGRhdGEKKyAqLworcHVibGljIGNsYXNzIFByb2Nlc3NvclZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7CisKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgUHJvY2Vzc29yIFZpZXcge0B2YWx1ZX0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9Qcm9jZXNzb3JfVklFVyA9ICJvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MucHJvY2Vzc29yIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBBbmFseXNpc1ZpZXdlciBhbmFseXNpc1ZpZXdlcjsKKworCS8qKgorLy8JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlhbmFseXNpc1ZpZXdlciA9IG5ldyBBbmFseXNpc1ZpZXdlcihwYXJlbnQsIFByb2Nlc3NvckZhY3RvcnkuSU5TVEFOQ0UpOworCQlhbmFseXNpc1ZpZXdlci5zZXRJbnB1dChTaW11bGF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkpOworCisJCWdldFNpdGUoKS5zZXRTZWxlY3Rpb25Qcm92aWRlcihhbmFseXNpc1ZpZXdlcik7CisKKwl9IC8vIGNyZWF0ZVBhcnRDb250cm9sCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJfSAvLyBkaXNwb3NlCisKKwkvKioKKwkgKiBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBpbnRlcmZhY2UsIGJ1dCB3ZSdyZSBub3QgdXNpbmcgaXQuCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgeworCQkvLyBOb3RoaW5nCisJfSAvLyBzZXRGb2N1cworCit9IC8vIFByb2Nlc3NvclZpZXcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL1JlcG9ydHNDb250ZXh0TWVudUFjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvUmVwb3J0c0NvbnRleHRNZW51QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmOGQ5NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL1JlcG9ydHNDb250ZXh0TWVudUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8vIFJlcG9ydHNDb250ZXh0TWVudUFjdGlvbiAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MuZ2VvZ3JhcGhpYy5tYXAuU2VsZWN0ZWRSZXBvcnRzTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKKworLyoqCisgKiBUaGUgY2xhc3MgaXMgYSBkZWxlZ2F0aW9uIGZvciB0aGUgcG9wdXAgbWVudSBvZiB0aGUKKyAqIDxjb2RlPkdlb2dyYXBoaWNSZW5kZXJlcjwvY29kZT4uIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gaGFuZGxlCisgKiB0aGUgYWN0aXZpdHkgaW4gdGhlIHJlcG9ydHMgY29udGV4dCBtZW51IGFuZCBrZWVwIHRoZSBjdXJyZW50IHN0YXRlIG9mIGFsbAorICogZW5hYmxlZC9kaXNhYmxlZCByZXBvcnRzIGZyb20gdGhhdCBtZW51LiBUaGUgcmVwb3J0J3MgPGNvZGU+Vmlld1BhcnQ8L2NvZGU+CisgKiBvYmplY3Qgd2lsbCB1c2UgdGhpcyBjbGFzcyBmb3IgY2hlY2tpbmcgd2hldGhlciB0byBnZW5lcmF0ZSBhIHJlcG9ydCBvciBub3QuCisgKi8KK3B1YmxpYyBjbGFzcyBSZXBvcnRzQ29udGV4dE1lbnVBY3Rpb24gCisJaW1wbGVtZW50cyBJVmlld0FjdGlvbkRlbGVnYXRlIHsKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCisJICovCisJcHVibGljIHZvaWQgcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uIGFjdGlvbikgeworCQlTdHJpbmcgcmVwb3J0SWQgPSBhY3Rpb24uZ2V0SWQoKTsKKwkJCisJCWlmIChTZWxlY3RlZFJlcG9ydHNNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNSZXBvcnRFbmFibGVkKHJlcG9ydElkKSkgeyAvLyBUaGUgcmVwb3J0IHdhcyBwcmV2aW91c2x5IGVuYWJsZWQgc28gZGlzYWJsZSBpdAorCQkJU2VsZWN0ZWRSZXBvcnRzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmRpc2FibGVSZXBvcnRGb3JJZGVudGlmaWFibGUocmVwb3J0SWQpOworCQkJYWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOworCQl9CisJCWVsc2UKKwkJeworCQkJU2VsZWN0ZWRSZXBvcnRzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmVuYWJsZVJlcG9ydEZvcklkZW50aWZpYWJsZShyZXBvcnRJZCk7CisJCQlhY3Rpb24uc2V0Q2hlY2tlZCh0cnVlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sCisJICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCisJICovCisJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwlvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiBhY3Rpb24sCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJCW9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJLy8gRG8gTm90aGluZworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCUlWaWV3UGFydCBhcmcwKSB7CisJCS8vIERvIE5vdGhpbmcKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9TY2VuYXJpb0NvbXBhcmlzb25Db250cm9sLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9TY2VuYXJpb0NvbXBhcmlzb25Db250cm9sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQyMmNjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL1NjZW5hcmlvQ29tcGFyaXNvbkNvbnRyb2wuamF2YQpAQCAtMCwwICsxLDUxMCBAQAorLy8gRXN0aW1hdG9yQ29udHJvbC5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5Db2xvckRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuaW1wbC5Db2xvckRlZmluaXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hbmFseXNpcy5FcnJvclJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFuYWx5c2lzLlNjZW5hcmlvSW5pdGlhbGl6YXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMuQ1NWQW5hbHlzaXNXcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLlNjZW5hcmlvQW5hbHlzaXNTdWl0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBTV1QgR1VJIGNvbXBvbmVudCB0aGF0IHVzZXMgQklSVCB0byBwbG90CisgKi8KK3B1YmxpYyBjbGFzcyBTY2VuYXJpb0NvbXBhcmlzb25Db250cm9sIGV4dGVuZHMgQW5hbHlzaXNDb250cm9sIHsKKwkKKwkvKioKKwkgKiB1c2VkIHRvIGlkZW50aWZ5IHVzZXIgcHJlZmVyZW5jZXMgZm9yIHRoaXMgY2xhc3MKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1VNRVIgPSAiU0NFTkFSSU9DT01QQVJJU09OX0NPTlRST0wiOworCQorCS8qKgorCSAqIHVzZWQgdG8gcmVtZW1iZXIgdGhlIHByaW1hcnkgZGlyZWN0b3J5IGluIHRoZSB1c2VyIHByZWZlcmVuY2VzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1BUllfRk9MREVSX0tFWSA9IENPTlNVTUVSKyJfUFJJTUFSWSI7CisJLyoqCisJICogdXNlZCB0byByZW1lbWJlciB0aGUgc2Vjb25kYXJ5IGRpcmVjdG9yeSBpbiB0aGUgdXNlciBwcmVmZXJlbmNlcworCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRBUllfRk9MREVSX0tFWSA9IENPTlNVTUVSKyJfU0VDT05EQVJZIjsKKworCS8qKgorCSAqICBGaXJzdCBTY2VuYXJpbyBMYWJlbCAtIGluZGljYXRlcyBudW1iZXIgb2YgcmVnaW9ucyBiZWluZyB3YXRjaGVkIGZvciBhbmFseXNpcy4KKwkgKiAgVGhlcmUgYXJlIGxvY2F0aW9ucyB3aXRoIHJlbGF0aXZlIHZhbHVlIGhpc3RvcnkgcHJvdmlkZXJzIGF0dGFjaGVkCisJICovCisJTGFiZWwgZmlyc3RTY2VuYXJpb0ZvbGRlckxhYmVsOworCQorCS8qKgorCSAqICBTZWNvbmQgU2NlbmFyaW8gTGFiZWwgLSBpbmRpY2F0ZXMgbnVtYmVyIG9mIHJlZ2lvbnMgYmVpbmcgd2F0Y2hlZCBmb3IgYW5hbHlzaXMuCisJICogIFRoZXJlIGFyZSBsb2NhdGlvbnMgd2l0aCByZWxhdGl2ZSB2YWx1ZSBoaXN0b3J5IHByb3ZpZGVycyBhdHRhY2hlZAorCSAqLworCUxhYmVsIHNlY29uZFNjZW5hcmlvRm9sZGVyTGFiZWw7CisJCisJLyoqCisJICogRmlyc3QgaW5wdXQgdGV4dCBmaWVsZCBmb3IgdGhlIHNjZW5hcmlvIGZvbGRlciBvZiBkYXRhIHRvIHVzZSBpbiBtYWtpbmcgdGhlIGVzdGltYXRpb24KKwkgKi8KKwlUZXh0IHRleHQxOworCQorCisJLyoqCisJICogU2Vjb25kIElucHV0IHRleHQgZmllbGQgZm9yIHRoZSBzY2VuYXJpbyBmb2xkZXIgb2YgZGF0YSB0byBiZSBjb21wYXJlZAorCSAqKi8KKwlUZXh0IHRleHQyOworCQorCQorCQorCS8qKgorCSAqIFJlc3VsdHMgb2YgYW5hbHlzaXMKKwkgKi8KKwlMYWJlbCBzdGF0dXNMYWJlbDsKKwkKKwkKKwkvKioKKwkgKiBDb2xvcnMgZm9yIHRoZSB0aW1lIHNlcmllcyBjaGFydAorCSAqLworCXN0YXRpYyBmaW5hbCBDb2xvckRlZmluaXRpb24gZm9yZUdyb3VuZCA9IENvbG9yRGVmaW5pdGlvbkltcGwuQkxBQ0soKTsKKwlzdGF0aWMgZmluYWwgQ29sb3JEZWZpbml0aW9uIGJhY2tncm91bmRHcm91bmQgPSBDb2xvckRlZmluaXRpb25JbXBsLmNyZWF0ZSgyNTUsIDIzMSwgMTg2KTsvL2NvbG9yIGlzIGNhbGxlZCB3aGVhdAorCXN0YXRpYyBmaW5hbCBDb2xvckRlZmluaXRpb24gZnJhbWVDb2xvciA9IENvbG9yRGVmaW5pdGlvbkltcGwuY3JlYXRlKDIyMCwgMjIwLCAyMjApOworCQorCXN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9QQVRIID0gIFBsYXRmb3JtLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOworCS8qKgorCSAqIHRoZSBjaGFydCBvZiByZXN1bHRzCisJICovCisJc3RhdGljIFRpbWVTZXJpZXNDYW52YXMgdGltZVNlcmllc0NhbnZhczsKKwkKKwkKKwkKKwkvKioKKwkgKiB0aGUgcmVzdWx0cyBvZiB2YXJpb3VzIHNjZW5hcmlvIGNvbXBhcmlzb25zCisJICogVE9ETzogZXZlbnR1YWxseSB0aGlzIG1pZ2h0IGJlIGEgbWFwIGtleWVkIGJ5IGNvbXBhcmlzb24gaWQKKwkgKiBmb3Igbm93IHRoZXJlIGlzIG9ubHkgb25lIGNvbXBhcmlzb24sIHRoZSBtZWFuIHNxdWFyZSBkaWZmZXJlbmNlLgorCSAqLworCUxpc3Q8RUxpc3Q8RG91YmxlPj4gY29tcGFyaXNvblZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8RUxpc3Q8RG91YmxlPj4oKTsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFSSVNPTl9GSUxFX05BTUUgPSAiUk1TQ29tcGFyZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9GT0xERVJfRElBTE9HX1RFWFQgPSAiUGljayBhIHNjZW5hcmlvIGZvbGRlciI7CisJCisJU2NlbmFyaW9BbmFseXNpc1N1aXRlIGFuYWx5emVyID0gbmV3IFNjZW5hcmlvQW5hbHlzaXNTdWl0ZSh0aGlzKTsKKwkKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50CisJICovCisJcHVibGljIFNjZW5hcmlvQ29tcGFyaXNvbkNvbnRyb2woZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQsIFNXVC5Ob25lKTsKKwkJY3JlYXRlQ29udGVudHMoKTsKKwl9IC8vIEVzdGltYXRvckNvbnRyb2wKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgY29udGVudHMgb2YgdGhlIHBsb3R0ZXIKKwkgKi8KKwlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7CisJCXNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKKworCQlpZGVudGlmaWFibGVUaXRsZSA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7CisJCWlkZW50aWZpYWJsZVRpdGxlLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJDT01QLlRJVExFIikpOworCQkvL3Byb3BlcnR5U2VsZWN0b3IgPSBuZXcgUHJvcGVydHlTZWxlY3Rvcih0aGlzLCBTV1QuTk9ORSk7CisJCURpc3BsYXkgZGlzcGxheSA9IHRoaXMuZ2V0RGlzcGxheSgpOworCQkKKwkJQ29sb3IgbGFiZWxCYWNrZ3JvdW5kID0gbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMjIwLCAyMjAsIDIyMCkpOworCQkKKwkJc3RhdHVzTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULkJPUkRFUik7CisJCXN0YXR1c0xhYmVsLnNldEJhY2tncm91bmQobGFiZWxCYWNrZ3JvdW5kKTsKKwkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiIik7CisJCQorCQlmaXJzdFNjZW5hcmlvRm9sZGVyTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULkJPUkRFUik7CisJCWZpcnN0U2NlbmFyaW9Gb2xkZXJMYWJlbC5zZXRCYWNrZ3JvdW5kKGxhYmVsQmFja2dyb3VuZCk7CisJCWZpcnN0U2NlbmFyaW9Gb2xkZXJMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiQ09NUC5GT0xERVIxTEFCRUwiKSk7CisJCQorCQl0ZXh0MSA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOworCSAgICB0ZXh0MS5zZXRCb3VuZHMoMTAsIDEwLCAxMDAsIDIwKTsKKwkgICAgU3RyaW5nIHByaW1hcnlEaXI9cHJlZnMuZ2V0UmVjZW50Rm9sZGVyKFBSSU1BUllfRk9MREVSX0tFWSk7CisJICAgIHRleHQxLnNldFRleHQocHJpbWFyeURpcik7CisJICAgIAorCSAgICBzZWNvbmRTY2VuYXJpb0ZvbGRlckxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5CT1JERVIpOworCSAgICBzZWNvbmRTY2VuYXJpb0ZvbGRlckxhYmVsLnNldEJhY2tncm91bmQobGFiZWxCYWNrZ3JvdW5kKTsKKwkgICAgc2Vjb25kU2NlbmFyaW9Gb2xkZXJMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiQ09NUC5GT0xERVIyTEFCRUwiKSk7CisJCQorCQl0ZXh0MiA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOworCSAgICB0ZXh0Mi5zZXRCb3VuZHMoMTAsIDEwLCAxMDAsIDIwKTsKKwkgICAgU3RyaW5nIHNlY29uZGFyeURpcj1wcmVmcy5nZXRSZWNlbnRGb2xkZXIoU0VDT05EQVJZX0ZPTERFUl9LRVkpOworCSAgICB0ZXh0Mi5zZXRUZXh0KHNlY29uZGFyeURpcik7CisKKwkgICAgQ29tcG9zaXRlIGFuYWx5emVCdXR0b25Db21wb3NpdGUgPSBnZXRBbmFseXplQnV0dG9uQ29tcG9zaXRlKHRoaXMsTWVzc2FnZXMuZ2V0U3RyaW5nKCJDT01QLkFOQUxZWkUiKSk7CisKKwkJc3RhdHVzTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULlNIQURPV19PVVQpOworCQlzdGF0dXNMYWJlbC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7CisJCXN0YXR1c0xhYmVsLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJDT01QLlJFU1VMVFMiKSk7CisJCQorCQlpbnQgZGVsdGFCb3R0b20gPSA1OworICAgICAgICBpbnQgYm90dG9tID0gZGVsdGFCb3R0b207CisJCQorCQlmaW5hbCBGb3JtRGF0YSB0aXRsZUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCWlkZW50aWZpYWJsZVRpdGxlLnNldExheW91dERhdGEodGl0bGVGb3JtRGF0YSk7CisJCXRpdGxlRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQl0aXRsZUZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQl0aXRsZUZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXRpdGxlRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKworCQlib3R0b20gKz0gZGVsdGFCb3R0b207CisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJLy8gVGV4dEZpZWxkIGZvbGRlciBsYWJlbAorCQlmaW5hbCBGb3JtRGF0YSBmaXJzdFNjZW5hcmlvRm9sZGVyTGFiZWxGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQkvLyBwcm9wZXJ0eVNlbGVjdG9yRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNTVkxvZ2dlckNhbnZhcywKKwkJLy8gMCk7CisJCWZpcnN0U2NlbmFyaW9Gb2xkZXJMYWJlbEZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChpZGVudGlmaWFibGVUaXRsZSwgMCk7CisJCWZpcnN0U2NlbmFyaW9Gb2xkZXJMYWJlbEZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQlmaXJzdFNjZW5hcmlvRm9sZGVyTGFiZWxGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlmaXJzdFNjZW5hcmlvRm9sZGVyTGFiZWxGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxNSwgMCk7CisJCWZpcnN0U2NlbmFyaW9Gb2xkZXJMYWJlbC5zZXRMYXlvdXREYXRhKGZpcnN0U2NlbmFyaW9Gb2xkZXJMYWJlbEZvcm1EYXRhKTsKKwkJLy8gZmlyc3QgdGV4dCBmaWVsZCBmb3IgcGFyYW1ldGVyIEVzdGltYXRvcgorCQlmaW5hbCBGb3JtRGF0YSB0ZXh0MUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCXRleHQxRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGlkZW50aWZpYWJsZVRpdGxlLCAwKTsKKwkJdGV4dDFGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tLCAwKTsKKwkJdGV4dDFGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGZpcnN0U2NlbmFyaW9Gb2xkZXJMYWJlbCwgMCk7CisJCXRleHQxRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNzUsIDApOworCQl0ZXh0MS5zZXRMYXlvdXREYXRhKHRleHQxRm9ybURhdGEpOworCQkKKwkKKwkJQnV0dG9uIHNlbGVjdEZvbGRlcjFCdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5OT05FKTsKKwkJc2VsZWN0Rm9sZGVyMUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiQ09NUC5TRUxFQ1RGT0xERVJCVVRUT04iKSk7CisJCWZpbmFsIEZvcm1EYXRhIHNlbGVjdEZvbGRlcjFGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlzZWxlY3RGb2xkZXIxRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGlkZW50aWZpYWJsZVRpdGxlLCAwKTsKKwkJc2VsZWN0Rm9sZGVyMUZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQlzZWxlY3RGb2xkZXIxRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCh0ZXh0MSwgMCk7CisJCXNlbGVjdEZvbGRlcjFGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQlzZWxlY3RGb2xkZXIxQnV0dG9uLnNldExheW91dERhdGEoc2VsZWN0Rm9sZGVyMUZvcm1EYXRhKTsKKwkJCisJCWZpbmFsIFNoZWxsIHNoZWxsID0gdGhpcy5nZXRTaGVsbCgpOworCQorCQlzZWxlY3RGb2xkZXIxQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJCWZpbmFsIFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlmaW5hbCBEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKAorCQkJCQkJc2hlbGwsIFNXVC5PUEVOKTsKKwkJCQkJZGQuc2V0VGV4dChTRUxFQ1RfRk9MREVSX0RJQUxPR19URVhUKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlTdHJpbmcgYmVnaW5TZWFyY2ggPSB0ZXh0MS5nZXRUZXh0KCk7CisJCQkJCWlmKChiZWdpblNlYXJjaD09bnVsbCl8fChiZWdpblNlYXJjaC5sZW5ndGgoKTwxKSkgYmVnaW5TZWFyY2ggPSBST09UX1BBVEg7CisJCQkJCQorCQkJCQlkZC5zZXRGaWx0ZXJQYXRoKGJlZ2luU2VhcmNoKTsKKwkJCQkJZmluYWwgU3RyaW5nIHNlbGVjdGVkID0gZGQub3BlbigpOworCQkJCQlpZihzZWxlY3RlZCE9bnVsbCkgdGV4dDEuc2V0VGV4dChzZWxlY3RlZCk7CisJCQl9CisJCX0pOworCQkKKwkKKwkJCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCisJCWJvdHRvbSArPSBkZWx0YUJvdHRvbTsKKwkJCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJLy8gVGV4dEZpZWxkIGZvbGRlciBsYWJlbAorCQlmaW5hbCBGb3JtRGF0YSBzZWNvbmRTY2VuYXJpb0ZvbGRlckxhYmVsRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJLy8gcHJvcGVydHlTZWxlY3RvckZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjU1ZMb2dnZXJDYW52YXMsCisJCS8vIDApOworCQlzZWNvbmRTY2VuYXJpb0ZvbGRlckxhYmVsRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGZpcnN0U2NlbmFyaW9Gb2xkZXJMYWJlbCwgMCk7CisJCXNlY29uZFNjZW5hcmlvRm9sZGVyTGFiZWxGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tLCAwKTsKKwkJc2Vjb25kU2NlbmFyaW9Gb2xkZXJMYWJlbEZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXNlY29uZFNjZW5hcmlvRm9sZGVyTGFiZWxGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxNSwgMCk7CisJCXNlY29uZFNjZW5hcmlvRm9sZGVyTGFiZWwuc2V0TGF5b3V0RGF0YShzZWNvbmRTY2VuYXJpb0ZvbGRlckxhYmVsRm9ybURhdGEpOworCQkvLyBmaXJzdCB0ZXh0IGZpZWxkIGZvciBwYXJhbWV0ZXIgRXN0aW1hdG9yCisJCWZpbmFsIEZvcm1EYXRhIHRleHQyRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJdGV4dDJGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGV4dDEsIDApOworCQl0ZXh0MkZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQl0ZXh0MkZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2Vjb25kU2NlbmFyaW9Gb2xkZXJMYWJlbCwgMCk7CisJCXRleHQyRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNzUsIDApOworCQl0ZXh0Mi5zZXRMYXlvdXREYXRhKHRleHQyRm9ybURhdGEpOworCQkKKwkJQnV0dG9uIHNlbGVjdEZvbGRlcjJCdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5OT05FKTsKKwkJc2VsZWN0Rm9sZGVyMkJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiQ09NUC5TRUxFQ1RGT0xERVJCVVRUT04iKSk7CisJCWZpbmFsIEZvcm1EYXRhIHNlbGVjdEZvbGRlcjJGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlzZWxlY3RGb2xkZXIyRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRleHQxLCAwKTsKKwkJc2VsZWN0Rm9sZGVyMkZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQlzZWxlY3RGb2xkZXIyRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCh0ZXh0MiwgMCk7CisJCXNlbGVjdEZvbGRlcjJGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQlzZWxlY3RGb2xkZXIyQnV0dG9uLnNldExheW91dERhdGEoc2VsZWN0Rm9sZGVyMkZvcm1EYXRhKTsKKwkJCisJCXNlbGVjdEZvbGRlcjJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQkJZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWZpbmFsIERpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coCisJCQkJCQlzaGVsbCwgU1dULk9QRU4pOworCQkJCQlkZC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiQ09NUC5TRUxFQ1RGT0xERVJESUFMT0ciKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJU3RyaW5nIGJlZ2luU2VhcmNoID0gdGV4dDIuZ2V0VGV4dCgpOworCQkJCQlpZigoYmVnaW5TZWFyY2g9PW51bGwpfHwoYmVnaW5TZWFyY2gubGVuZ3RoKCk8MSkpIGJlZ2luU2VhcmNoID0gUk9PVF9QQVRIOworCQkJCQkKKwkJCQkJZGQuc2V0RmlsdGVyUGF0aChiZWdpblNlYXJjaCk7CisJCQkJCWZpbmFsIFN0cmluZyBzZWxlY3RlZCA9IGRkLm9wZW4oKTsKKwkJCQkJaWYoc2VsZWN0ZWQhPW51bGwpIHRleHQyLnNldFRleHQoc2VsZWN0ZWQpOworCQkJfQorCQl9KTsKKwkJCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCisJCWJvdHRvbSArPSBkZWx0YUJvdHRvbTsKKwkJLy8gQW5hbHl6ZUJ1dHRvbgorCQlmaW5hbCBGb3JtRGF0YSBhbmFseXNpc0J1dHRvbkZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCS8vIHByb3BlcnR5U2VsZWN0b3JGb3JtRGF0YVgudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHByb3BlcnR5U2VsZWN0b3JZLAorCQkvLyAwKTsKKwkJYW5hbHlzaXNCdXR0b25Gb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGV4dDIsIDApOworCQlhbmFseXNpc0J1dHRvbkZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQlhbmFseXNpc0J1dHRvbkZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWFuYWx5c2lzQnV0dG9uRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJYW5hbHl6ZUJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGFuYWx5c2lzQnV0dG9uRm9ybURhdGEpOworCQkKKwkJCisJCQorCQkvLyBSZXN1bHRzIEdyYXBoCisJCXRpbWVTZXJpZXNDYW52YXMgPSBuZXcgVGltZVNlcmllc0NhbnZhcyh0aGlzLAorCQkJCQkJCQkJCQkJCU1lc3NhZ2VzLmdldFN0cmluZygiQ09NUC5STVNESUZGRVJFTkNFTEFCRUwiKSwKKwkJCQkJCQkJCQkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkNPTVAuUk1TU1RSSU5HIiksCisJCQkJCQkJCQkJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJDT01QLlJNU1NUUklORyIpLAorCQkJCQkJCQkJCQkJCWZvcmVHcm91bmQsCisJCQkJCQkJCQkJCQkJYmFja2dyb3VuZEdyb3VuZCwKKwkJCQkJCQkJCQkJCQlmcmFtZUNvbG9yLCAwKTsKKwkJCisJCWZpbmFsIEZvcm1EYXRhIGNoYXJ0Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJdGltZVNlcmllc0NhbnZhcy5zZXRMYXlvdXREYXRhKGNoYXJ0Rm9ybURhdGEpOworCQljaGFydEZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChib3R0b20sIDApOworCQljaGFydEZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCg5MCwgMCk7CisJCWNoYXJ0Rm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJY2hhcnRGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQkKKwkJLyoKKwkJZmluYWwgRm9ybURhdGEgcmVzdWx0c1NlbGVjdG9yRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJcmVzdWx0c1NlbGVjdG9yRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGFuYWx5emVCdXR0b24sIDApOworCQlyZXN1bHRzU2VsZWN0b3JGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYm90dG9tLCAwKTsKKwkJcmVzdWx0c1NlbGVjdG9yRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJcmVzdWx0c1NlbGVjdG9yRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJc3RhdHVzTGFiZWwuc2V0TGF5b3V0RGF0YShyZXN1bHRzU2VsZWN0b3JGb3JtRGF0YSk7CisJCSovCisJCS8vIFN0YXR1cyBsYWJlbAorCQlmaW5hbCBGb3JtRGF0YSBzdGF0dXNGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlzdGF0dXNGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoOTAsIDApOworCQlzdGF0dXNGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJc3RhdHVzRm9ybURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJc3RhdHVzRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJc3RhdHVzTGFiZWwuc2V0TGF5b3V0RGF0YShzdGF0dXNGb3JtRGF0YSk7CisJCQorCQkKKwkJZmluYWwgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIHByb2dyZXNzRGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyh0aGlzLmdldFNoZWxsKCkpOworCisJCWFuYWx5emVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQkJZmluYWwgU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCS8qCisJCQkJICogcmVpbml0aWFsaXplIHRoZSBncmFwaAorCQkJCSAqLworCQkJCXRpbWVTZXJpZXNDYW52YXMucmVzZXQoKTsKKwkJCQljb21wYXJpc29uVmFsdWVzLmNsZWFyKCk7CisJCQkJdGltZVNlcmllc0NhbnZhcy5kcmF3KCk7CisJCQkJLy8gcmVpbml0aWFsaXplIHRoZSBzdGF0dXMgbGFiZWwKKwkJCQlzdGF0dXNMYWJlbC5zZXRUZXh0KEFuYWx5c2lzQ29udHJvbC5TVEFUVVNfVEVYVCk7CisJCQkJCisJCQkJCisJCQkJU3RyaW5nIHJlZmVyZW5jZURpcmVjdG9yeSAgPSB0ZXh0MS5nZXRUZXh0KCk7CisJCQkJU3RyaW5nIGNvbXBhcmlzb25EaXJlY3RvcnkgPSB0ZXh0Mi5nZXRUZXh0KCk7CisJCQkJCisJCQkJLyoKKwkJCQkgKiBWQUxJREFURSB0aGUgdGV4dCBpbnB1dCBGaWVsZHMKKwkJCQkgKi8KKwkJCQlpZighYW5hbHl6ZXIudmFsaWRhdGUocmVmZXJlbmNlRGlyZWN0b3J5KSkgeworCQkJCQlzdGF0dXNMYWJlbC5zZXRUZXh0KFNjZW5hcmlvQW5hbHlzaXNTdWl0ZS5OT1RfRk9VTkRfTVNHKTsKKwkJCQkJdGV4dDEuc2V0VGV4dCgiIik7CisJCQkJfQorICAgICAgICAgICAgICAgIGlmKCFhbmFseXplci52YWxpZGF0ZShjb21wYXJpc29uRGlyZWN0b3J5KSkgeworICAgICAgICAgICAgICAgIAlzdGF0dXNMYWJlbC5zZXRUZXh0KFNjZW5hcmlvQW5hbHlzaXNTdWl0ZS5OT1RfRk9VTkRfTVNHKTsKKyAgICAgICAgICAgICAgICAJdGV4dDIuc2V0VGV4dCgiIik7CisJCQkJfQorICAgICAgICAgICAgICAgIGlmKCghYW5hbHl6ZXIudmFsaWRhdGUocmVmZXJlbmNlRGlyZWN0b3J5KSkgfHwgKCFhbmFseXplci52YWxpZGF0ZShjb21wYXJpc29uRGlyZWN0b3J5KSkpIHsKKyAgICAgICAgICAgICAgICAJcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBFcnJvclJlc3VsdCByZXN1bHQ9bnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIAlyZXN1bHQgPSBhbmFseXplci5jb21wYXJlKHJlZmVyZW5jZURpcmVjdG9yeSwgY29tcGFyaXNvbkRpcmVjdG9yeSwgcHJvZ3Jlc3NEaWFsb2cpOworICAgICAgICAgICAgICAgIAlpZihyZXN1bHQgIT1udWxsKSB7CisgICAgICAgICAgICAgICAgCQljb21wYXJpc29uVmFsdWVzLmFkZChyZXN1bHQuZ2V0RXJyb3JCeVRpbWVTdGVwKCkpOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgCQorICAgICAgICAgICAgICAgIAkvL3N1Y2Nlc3MuLi4gcmVtZW1iZXIgdGhlIHVzZXJzIHByZWZzCisJCQkJCXByZWZzLnNldFJlY2VudEZvbGRlcihQUklNQVJZX0ZPTERFUl9LRVkscmVmZXJlbmNlRGlyZWN0b3J5KTsKKwkJCQkJcHJlZnMuc2V0UmVjZW50Rm9sZGVyKFNFQ09OREFSWV9GT0xERVJfS0VZLGNvbXBhcmlzb25EaXJlY3RvcnkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2goU2NlbmFyaW9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbiBzaWUpIHsKKyAgICAgICAgICAgICAgICAJQWN0aXZhdG9yLmxvZ0Vycm9yKCIiLCBzaWUpOworICAgICAgICAgICAgICAgIH0KKwkJCQkKKwkJCQl0aW1lU2VyaWVzQ2FudmFzLmRyYXcoKTsKKwkJCQkKKwkJCQlTdHJpbmcgb3V0RmlsZU5hbWUgPSBDT01QQVJJU09OX0ZJTEVfTkFNRSsiXyIrCisJCQkJCQkJCQkgZ2V0U2NlbmFyaW9OYW1lRnJvbURpcmVjdG9yeU5hbWUocmVmZXJlbmNlRGlyZWN0b3J5KSsKKwkJCQkJCQkJCSAiXyIrCisJCQkJCQkJCQkgZ2V0U2NlbmFyaW9OYW1lRnJvbURpcmVjdG9yeU5hbWUoY29tcGFyaXNvbkRpcmVjdG9yeSk7CisJCQkJCQkJCQkgCisJCQkJQ1NWQW5hbHlzaXNXcml0ZXIgd3JpdGVyID0gbmV3IENTVkFuYWx5c2lzV3JpdGVyKG91dEZpbGVOYW1lKTsKKwkJCSAgICB3cml0ZXIubG9nRGF0YShjb21wYXJpc29uVmFsdWVzKTsKKwkJCSAgICBTdHJpbmcgcmVzdWx0cyA9ICJSTVMgRGlmZmVyZW5jZSA9ICI7CisJCQkgICAgaWYocmVzdWx0ICE9bnVsbCkgeworCQkJICAgIAlyZXN1bHRzICs9IHJlc3VsdC5nZXRFcnJvcigpOworCQkJICAgIH0KKwkJCSAgICAKKwkJCQlzdGF0dXNMYWJlbC5zZXRUZXh0KHJlc3VsdHMpOworCQkJfQorCQl9KTsKKwkJCisJfSAvLyBjcmVhdGVDb250ZW50cworCQorCQorCQorCQorCS8qKgorCSAqIEBwYXJhbSBkaXJOYW1lCisJICogQHJldHVybiBzaG9ydCBuYW1lIG9mIHNjZW5hcmlvCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2NlbmFyaW9OYW1lRnJvbURpcmVjdG9yeU5hbWUoU3RyaW5nIGRpck5hbWUpIHsKKwkJaW50IGxhc3QgPSBkaXJOYW1lLmxhc3RJbmRleE9mKCIvIik7CisJCWludCBsYXN0MiA9ICBkaXJOYW1lLmxhc3RJbmRleE9mKCJcXCIpOworCQlpZihsYXN0Mj5sYXN0KSBsYXN0ID0gbGFzdDI7CisJCWlmKGxhc3QgPD0wICkgbGFzdCA9IDA7CisJCVN0cmluZyByZXRWYWwgPSBkaXJOYW1lLnN1YnN0cmluZyhsYXN0KzEsIGRpck5hbWUubGVuZ3RoKCkpOworCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIHJldHVybnMgdGhlIHJlc3VsdHMgb2YgYSBjb21wYXJpc29uIG9mIHR5cGUgY29tcGFyaXNvblR5cGUKKwkgKiBhcyBhbiBhcnJheSBvZiBkb3VibGUuIAorCSAqIFRPRE8gZm9yIG5vdyB0aGVyZSBpcyBvbmx5IG9uZSB0eXBlLCB0aGUgTUVBTiBTUSBEaWZmCisJICogQHBhcmFtIGNoYXJ0SW5kZXggbm90IHVzZWQgKG9ubHkgb25lIGNoYXJ0KQorCSAqIEBwYXJhbSBjb21wYXJpc29uVHlwZQorCSAqIEByZXR1cm4gQ3VtdWxhdGl2ZSBkZXZpYXRpb24gZnJvbSByZWZlcmVuY2UgdHJhamVjdG9yeQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQorCUBPdmVycmlkZQorCXB1YmxpYyBkb3VibGVbXSBnZXRWYWx1ZXMoaW50IGNoYXJ0SW5kZXgsIGludCBjb21wYXJpc29uVHlwZSkgeworCQlpZigoY29tcGFyaXNvblZhbHVlcz09bnVsbCl8fChjb21wYXJpc29uVmFsdWVzLnNpemUoKT09MCkpIHJldHVybiBuZXcgZG91YmxlWzBdOworCQlFTGlzdDxEb3VibGU+IHIgPSBjb21wYXJpc29uVmFsdWVzLmdldCgwKTsKKwkJZG91YmxlIFtdcmVzdWx0ID0gbmV3IGRvdWJsZVtyLnNpemUoKV07CisJCWZvcihpbnQgaT0wO2k8ci5zaXplKCk7KytpKSByZXN1bHRbaV09ci5nZXQoaSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCisJLyoqCisJICogCisJICogQHBhcmFtIGNoYXJ0SW5kZXggbm90IHVzZWQgKG9ubHkgb25lIGNoYXJ0KQorCSAqIEBwYXJhbSBzdGF0ZQorCSAqIEByZXR1cm4gcHJvcGVydHkgbmFtZQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoaW50IGNoYXJ0SW5kZXgsIGludCBzdGF0ZSkgeworCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJDT01QLlJNU1NUUklORyIpOworCX0KKwkKKwkvKioKKwkgKiBPbmx5IG9uZSBwcm9wZXJ0eSB0byBwbG90ID0gdGhlIFJNUyBkaWZmZXJlbmNlCisJICogQHBhcmFtIGNoYXJ0SW5kZXggbm90IHVzZWQgKG9ubHkgb25lIGNoYXJ0KQorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzCisJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuQW5hbHlzaXNDb250cm9sI2dldE51bVByb3BlcnRpZXMoaW50IGNoYXJ0SW5kZXgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBnZXROdW1Qcm9wZXJ0aWVzKGludCBjaGFydEluZGV4KSB7CisJCXJldHVybiAxOworCX0KKworCQorCQorCQorCQorCS8qKgorCSAqIHRvIHJlbW92ZSB0aGUgY29udHJvbCBlLmcuIGJ5IGEgcmVtb3ZlIGJ1dHRvbiBldmVudAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKwkJdXBkYXRlU3RhdHVzTGFiZWwoKTsKKwl9CisKKwkKKwkKKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXR1c0xhYmVsKCkgeworCQlzdGF0dXNMYWJlbC5zZXRUZXh0KEFuYWx5c2lzQ29udHJvbC5TVEFUVVNfVEVYVCk7CisJfQorCQorCQorCisJLyoqCisJICogSW5pdGlhbGl6ZSB0aGUgaGVhZGVyIGxhYmVsCisJICogCisJICogQHBhcmFtIGZvbGRlck5hbWUKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSGVhZGVyKFN0cmluZyBmb2xkZXJOYW1lKSB7CisJCXNpbXVsYXRpb25OYW1lTGFiZWwuc2V0VGV4dCgiYW5hbHl6aW5nICIrZm9sZGVyTmFtZSk7CisKKwl9IC8vIGluaXRpYWxpemVGcm9tU2ltdWxhdGlvbgorCisKKwkKKwkKKwkKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0I2Rpc3Bvc2UoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQkJCQkKKwkJc3VwZXIuZGlzcG9zZSgpOworCQkKKwl9IC8vIGRpc3Bvc2UKKworCisJCisJLyoqCisJICogRWFjaCBDb250cm9sIGNsYXNzIG1heSBhZGQgb2JqZWN0cyB0byB0aGlzIG1hcAorCSAqIEByZXR1cm4gdGhlIGNvbnRyb2wgcGFyYW1ldGVycyBtYXBzCisJICovCisJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0Q29udHJvbFBhcmFtZXRlcnNNYXAoKSB7CisJCS8vIGFkZCBub3RoaW5nIGZvciBub3cKKwkJcmV0dXJuIGNvbnRyb2xQYXJhbWV0ZXJzTWFwOworCX0KKwkKKworfSAvLyBFc3RpbWF0b3JDb250cm9sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9TY2VuYXJpb0NvbXBhcmlzb25GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9TY2VuYXJpb0NvbXBhcmlzb25GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5MTFiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL1NjZW5hcmlvQ29tcGFyaXNvbkZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUzIEBACisvLyBFc3RpbWF0b3JGYWN0b3J5LmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIEFuYWx5c2lzQ29udHJvbH0gaW5zdGFuY2VzLgorICovCitwdWJsaWMgY2xhc3MgU2NlbmFyaW9Db21wYXJpc29uRmFjdG9yeSBpbXBsZW1lbnRzIEFuYWx5c2lzQ29udHJvbEZhY3RvcnkgeworCisJLyoqCisJICogcHVibGljIElOU1RBTkNFIGZvciB0aGlzIEZhY3RvcnkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFNjZW5hcmlvQ29tcGFyaXNvbkZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgU2NlbmFyaW9Db21wYXJpc29uRmFjdG9yeSgpOworCisJLyoqCisJICogQ29uc3RhbnRzIAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOQUxZU0lTX1RZUEUgPSAiUGhhc2VTeW5jaHJvbml6ZXIiOworCQorCisJLyoqCisJICogCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSBkaXJOYW1lCisJICogQHJldHVybiBuZXcgU2NlbmFyaW9Db21wYXJpc29uQ29udHJvbCgpCisJICovCisJcHVibGljIEFuYWx5c2lzQ29udHJvbCBjcmVhdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRpck5hbWUpIHsKKwkJCQkKKwkJcmV0dXJuIG5ldyBTY2VuYXJpb0NvbXBhcmlzb25Db250cm9sKHBhcmVudCk7CisJfQorCQorCisJLyoqCisJICogQHJldHVybiB0eXBlIG9mIGFuYWx5c2lzCisJICogCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb250cm9sVHlwZSgpIHsKKwkJcmV0dXJuIEFOQUxZU0lTX1RZUEU7CisJfQorCit9IC8vIEVzdGltYXRvckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL1NjZW5hcmlvQ29tcGFyaXNvblZpZXcuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL1NjZW5hcmlvQ29tcGFyaXNvblZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDI5ZjJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvU2NlbmFyaW9Db21wYXJpc29uVmlldy5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8vIEVzdGltYXRvclZpZXcgCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OworCisvKioKKyAqIFRoaXMgdmlldyBwcm92aWRlcyBmb3IgYSBDcm9zcyBQaGFzZVN5bmNocm9uaXplciBhbmFseXNpcywgY29tcGFyaW5nIHR3byBzY2VuYXJpb3MKKyAqLworCitwdWJsaWMgY2xhc3MgU2NlbmFyaW9Db21wYXJpc29uVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKKworCisJLyoqCisJICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIENvbXBhcmlzb24gVmlldyB7QHZhbHVlfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0NvbXBhcmlzb25fVklFVyA9ICJvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3MuY29tcGFyaXNvbiI7IC8vJE5PTi1OTFMtMSQKKworCisKKwlwcml2YXRlIEFuYWx5c2lzVmlld2VyIGFuYWx5c2lzVmlld2VyOworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlhbmFseXNpc1ZpZXdlciA9IG5ldyBBbmFseXNpc1ZpZXdlcihwYXJlbnQsIFNjZW5hcmlvQ29tcGFyaXNvbkZhY3RvcnkuSU5TVEFOQ0UpOworCQlhbmFseXNpc1ZpZXdlci5zZXRJbnB1dChTaW11bGF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkpOworCisJCWdldFNpdGUoKS5zZXRTZWxlY3Rpb25Qcm92aWRlcihhbmFseXNpc1ZpZXdlcik7CisKKworCX0gLy8gY3JlYXRlUGFydENvbnRyb2wKKworCQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjZGlzcG9zZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0gLy8gZGlzcG9zZQorCisJLyoqCisJICogVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgaW50ZXJmYWNlLCBidXQgd2UncmUgbm90IHVzaW5nIGl0LgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJLy8gTm90aGluZworCX0gLy8gc2V0Rm9jdXMKKworfSAvLyBFc3RpbWF0b3JWaWV3CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9UaW1lU2VyaWVzQ2FudmFzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9UaW1lU2VyaWVzQ2FudmFzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzYjFjMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL1RpbWVTZXJpZXNDYW52YXMuamF2YQpAQCAtMCwwICsxLDEyMzUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQuZGV2aWNlLklEZXZpY2VSZW5kZXJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmV4Y2VwdGlvbi5DaGFydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmZhY3RvcnkuR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuQ2hhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5DaGFydFdpdGhBeGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkFuY2hvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5BeGlzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5Cb3VuZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuQ29sb3JEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkludGVyc2VjdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuTGluZUF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuTGluZVN0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLlBvc2l0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLlRpY2tTdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5pbXBsLkJvdW5kc0ltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuaW1wbC5Db2xvckRlZmluaXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuY29tcG9uZW50LkF4aXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5jb21wb25lbnQuU2VyaWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuY29tcG9uZW50LmltcGwuU2VyaWVzSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuTnVtYmVyRGF0YVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuU2VyaWVzRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmRhdGEuaW1wbC5OdW1iZXJEYXRhRWxlbWVudEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5kYXRhLmltcGwuTnVtYmVyRGF0YVNldEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5kYXRhLmltcGwuU2VyaWVzRGVmaW5pdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5pbXBsLkNoYXJ0V2l0aEF4ZXNJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwubGF5b3V0LkxlZ2VuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmxheW91dC5QbG90OworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwudHlwZS5MaW5lU2VyaWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwudHlwZS5pbXBsLlNjYXR0ZXJTZXJpZXNJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQudXRpbC5QbHVnaW5TZXR0aW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udWkucHJlZmVyZW5jZXMuVmlzdWFsaXphdGlvblByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy5BY3RpdmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLkFnZ3JlZ2F0ZURhdGFXcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzLlNjZW5hcmlvQW5hbHlzaXNTdWl0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOworCisvKioKKyAqIFRpbWVTZXJpZXNDYW52YXMgaXMgYSBzdWJjbGFzcyBvZiB7QGxpbmsgQ2FudmFzfSBzdWl0YWJsZSBmb3IgY2hhcnQgZHJhd2luZ3MuCisgKi8KK3B1YmxpYyBjbGFzcyBUaW1lU2VyaWVzQ2FudmFzIGV4dGVuZHMgQ2FudmFzIHsKKworCXByb3RlY3RlZCBJRGV2aWNlUmVuZGVyZXIgaWRyID0gbnVsbDsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHtAbGluayBDaGFydH0gdGhhdCBwbG90cyB0aGUgcmVsYXRpdmUgdmFsdWVzLgorCSAqLworCXByb3RlY3RlZCBDaGFydCBjbSA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgcHJvdmlkZXIgb2YgcmVsYXRpdmUgdmFsdWVzLgorCSAqLworCS8vcHJpdmF0ZSBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyIHJ2aHA7CisKKwlwcml2YXRlIEFuYWx5c2lzQ29udHJvbCBjb250cm9sID0gbnVsbDsKKwkKKwkvKioKKwkgKiB0aGUgaW5kZXggb2YgdGhpcyBDaGFydAorCSAqLworCXByaXZhdGUgaW50IGNoYXJ0SW5kZXggPSAwOworCQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRLZXkgPSBBZ2dyZWdhdGVEYXRhV3JpdGVyLmdldEtleVMoKTsKKworCS8qKgorCSAqIHNvbWUgZXh0cmEgY29sb3JzCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb2xvckRlZmluaXRpb25bXSBjb2xvckRlZmF1bHQgPSB7CisJCQkJCQkJCQkJCQkJCQlDb2xvckRlZmluaXRpb25JbXBsLkJMVUUoKSwgCisJCQkJCQkJCQkJCQkJCQlDb2xvckRlZmluaXRpb25JbXBsLkJMQUNLKCksIAorCQkJCQkJCQkJCQkJCQkJQ29sb3JEZWZpbml0aW9uSW1wbC5HUkVZKCksCisJCQkJCQkJCQkJCQkJCQlDb2xvckRlZmluaXRpb25JbXBsLkNZQU4oKSwKKwkJCQkJCQkJCQkJCQkJCUNvbG9yRGVmaW5pdGlvbkltcGwuT1JBTkdFKCkgCisJCQkJCQkJCQkJCQkJCQl9OworCS8qKgorCSAqIHVzZWQgaWYgd2UgbmVlZCB0byBvdmVybGF5IHRyYWNlcyBpbiBkaWZmZXJlbnQgY29sb3JzCisJICovCisJcHJpdmF0ZSBib29sZWFuIG92ZXJsYXlNb2RlID0gZmFsc2U7CisJCisJLyoqCisJICogdXNlZCB0byBpbmRleCB0aGUgbGluZSBzZXJpZXMgc28gd2UgY2FuIHN0ZXAgdGhyb3VnaCBkZWZhdWx0IGNvbG9ycworCSAqIHdoZW4gYSB1c2VyIGN1c3RvbSBjb2xvciBpcyBub3QgeWV0IGFzc2lnbmVkCisJICovCisJcHJpdmF0ZSBpbnQgc2VyaWVzQ291bnQgID0gMDsKKwkKKworCS8qKgorCSAqIEEgY29udGV4dCBtZW51IGZvciB0aGlzIHZpZXcKKwkgKi8KKwlNZW51IHBvcFVwTWVudSA9IG51bGw7CisJCisJLyoqCisJICogc2V0IHkgYXhpcyB0byBhIGxpbmVhciBzY2FsZQorCSAqLworCXByaXZhdGUgTGluZWFyU2NhbGVBY3Rpb24gbGluZWFyVGltZUFjdGlvbjsKKwkvKioKKwkgKiBzZXQgeSBheGlzIHRvIGEgbG9nIHNjYWxlCisJICovCisJcHJpdmF0ZSBMb2dTY2FsZUFjdGlvbiBsb2dUaW1lQWN0aW9uOworCXByb3RlY3RlZCBib29sZWFuIHVzZUxpbmVhclRpbWVTY2FsZSA9IHRydWU7CisJCisKKwkvKioKKwkgKiBzaG93IHRoZSBsZWdlbmQgKHRydWUgYnkgZGVmYXVsdCkKKwkgKi8KKwlwcml2YXRlIExlZ2VuZFZpZXdBY3Rpb24gdmlld0xlZ2VuZDsKKworCS8qKgorCSAqIGhpZGUgdGhlIGxlZ2VuZCAKKwkgKi8KKwlwcml2YXRlIExlZ2VuZEhpZGVBY3Rpb24gaGlkZUxlZ2VuZDsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93TGVnZW5kID0gdHJ1ZTsKKworCXByb3RlY3RlZCBMZWdlbmQgbGVnZW5kID0gbnVsbDsKKwkKKworCS8qKgorCSAqIHRoaXMgaXMgYSBtYXAgb2YgdGhlIERhdGFTZXJpZXMgb2JqZWN0IChrZXllZCBieSBwcm9wZXJ0eSBuYW1lKQorCSAqLworCXByb3RlY3RlZCBmaW5hbCBNYXA8U3RyaW5nLERhdGFTZXJpZXM+IGRhdGFTZXJpZXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRGF0YVNlcmllcz4oKTsKKwkKKwkvKioKKwkgKiBLZWVwIHRyYWNrIG9mIHdoaWNoIHRpbWVzZXJpZXMgYXJlIHZpc2libGUKKwkgKi8KKwkKKwlwcm90ZWN0ZWQgTWFwPFN0cmluZywgQm9vbGVhbj52aXNpYmxlTWFwID0gIG5ldyBIYXNoTWFwPFN0cmluZyxCb29sZWFuPigpOworCisKKwkvKioKKwkgKiBUaGVzZSBhcmUgdGhlIGN5Y2xlIG51bWJlcnMgdGhhdCBtYXRjaCB0aGUgcmVsYXRpdmUgdmFsdWVzIHRoYXQgd2lsbCBiZQorCSAqIHBsb3R0ZWQKKwkgKiAKKwkgKiBAc2VlICNyZWxhdGl2ZVZhbHVlcworCSAqLworCXByaXZhdGUgZmluYWwgTGlzdDxJbnRlZ2VyPiBjeWNsZU51bWJlcnMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisKKwkvKioKKwkgKiBDaGFydCBnZW5lcmF0b3IgaW5zdGFuY2UgKHJlZmVyZW5jZSB0byBhIHNpbmdsZXRvbikKKwkgKi8KKwlHZW5lcmF0b3IgZ3I7CisKKwlBeGlzIHlBeGlzUHJpbWFyeTsKKwlBeGlzIHhBeGlzUHJpbWFyeTsKKwkvKioKKwkgKiB0aGUgbWF4WSB2YWx1ZSBmb3Igc2NhbGluZworCSAqLworCWRvdWJsZSBtYXhZID0gLTEuMDsKKworCS8qKgorCSAqIExvZyBvZiB6ZXJvIGlzIG5lZ2F0aXZlIGluZmluaXR5IHNvIGZvciBlYWNoIGxvY2F0aW9uIHdlIHdpbGwgY3V0IG9mZiB0aGUgbWluaW11bSAKKwkgKiBhdCB0aGUgbWluIE5PTlpFUk8gWSB2YWx1ZQorCSAqLworCXByaXZhdGUgZG91YmxlIG1pbllzY2FsZSA9IDEuMDsKKwkKKwkKKwkvKioKKwkgKiBMYWJlbCBmb3IgbGluZSBzZXJpZXMgTEVHRU5ECisJICovCisJcHVibGljIFN0cmluZyBPcmRpbmF0ZV9MRUdFTkQgPSAiWSI7CisJCisJLyoqCisJICogTGFiZWwgZm9yIGxpbmUgc2VyaWVzIFkgYXhpcyBsYWJlbAorCSAqKi8KKwlwdWJsaWMgU3RyaW5nIE9yZGluYXRlX0FYSVMgPSAiWSI7CisJCisJLyoqIAorCSAqIGN1c3RvbWl6YWJsZSBjb2xvciBkZWZpbml0aW9ucworCSAqLworCXByaXZhdGUgQ29sb3JEZWZpbml0aW9uIGZvcmVHcm91bmQgPSBDb2xvckRlZmluaXRpb25JbXBsLldISVRFKCk7CisJcHJpdmF0ZSBDb2xvckRlZmluaXRpb24gYmFja2dyb3VuZEdyb3VuZCA9IENvbG9yRGVmaW5pdGlvbkltcGwuQkxBQ0soKTsKKwlwcml2YXRlIENvbG9yRGVmaW5pdGlvbiBmcmFtZUNvbG9yID0gQ29sb3JEZWZpbml0aW9uSW1wbC5jcmVhdGUoMTgwLCAxODAsIDIwMCk7CisKKwlJbWFnZSBpbWdDaGFydCA9IG51bGw7CisJCisJLyoqCisJICogVGhpcyBDb25zdHJ1Y3RvciBpcyB1c2VkIHdoZW4gd2Ugd2FudCB0byBwbGFjZSB0aGUgdGltZSBzZXJpZXMgaW4gYSBjb250YWluZXIKKwkgKiB3aGljaCBpcyBhIHN1YiBjb21wb25lbnQgb2YgdGhlIGFjdHVhbCBBbmFseXNpc0NvbnRyb2wKKwkgKiBAcGFyYW0gYW5hbHlzaXNDb250cm9sIAorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQgIHRoZSBTV1QgcGFyZW50IG9mIHRoZSB7QGxpbmsgV2lkZ2V0fQorCSAqIEBwYXJhbSBvcmRpbmF0ZVN0cmluZyAKKwkgKiBAcGFyYW0geUF4aXNMYWJlbCAKKwkgKiBAcGFyYW0gZGVmYXVsdFlEYXRhVHlwZSAKKwkgKiBAcGFyYW0gZm9yZWdyb3VuZCAKKwkgKiBAcGFyYW0gYmFja2dyb3VuZCAKKwkgKiBAcGFyYW0gZnJhbWVjb2xvciAKKwkgKiBAcGFyYW0gY2hhcnRJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBjaGFydCAoMCBpZiBvbmx5IG9uZSkKKwkgKiBAcGFyYW0gb3ZlcmxheU1vZGUgdXNlZCBpZiB3ZSBuZWVkIHRvIG92ZXJsYXkgdHJhY2VzIGluIGRpZmZlcmVudCBjb2xvcnMKKwkgKi8KKwlwdWJsaWMgVGltZVNlcmllc0NhbnZhcyhmaW5hbCBBbmFseXNpc0NvbnRyb2wgYW5hbHlzaXNDb250cm9sLCBmaW5hbCBDb21wb3NpdGUgcGFyZW50LCAKKwkJCWZpbmFsIFN0cmluZyBvcmRpbmF0ZVN0cmluZywgCisJCQlmaW5hbCBTdHJpbmcgeUF4aXNMYWJlbCwgCisJCQlmaW5hbCBTdHJpbmcgZGVmYXVsdFlEYXRhVHlwZSwKKwkJCUNvbG9yRGVmaW5pdGlvbiBmb3JlZ3JvdW5kLAorCQkJQ29sb3JEZWZpbml0aW9uIGJhY2tncm91bmQsCisJCQlDb2xvckRlZmluaXRpb24gZnJhbWVjb2xvciwKKwkJCWludCBjaGFydEluZGV4LAorCQkJYm9vbGVhbiBvdmVybGF5TW9kZQkpIHsKKwkJc3VwZXIocGFyZW50LCBTV1QuRE9VQkxFX0JVRkZFUkVEIHwgU1dULkJPUkRFUik7CisJCU9yZGluYXRlX0xFR0VORCA9IG9yZGluYXRlU3RyaW5nOworCQlPcmRpbmF0ZV9BWElTID0geUF4aXNMYWJlbDsKKwkJZGVmYXVsdEtleSA9IGRlZmF1bHRZRGF0YVR5cGU7CisJCWZvcmVHcm91bmQgCQkJPSBmb3JlZ3JvdW5kOworCQliYWNrZ3JvdW5kR3JvdW5kIAk9IGJhY2tncm91bmQ7CisJCWZyYW1lQ29sb3IgCQkJPSBmcmFtZWNvbG9yOworCQl0aGlzLmNoYXJ0SW5kZXggPSBjaGFydEluZGV4OworCQl0aGlzLm92ZXJsYXlNb2RlID0gb3ZlcmxheU1vZGU7CisJCQorCQlnciA9IEdlbmVyYXRvci5pbnN0YW5jZSgpOworCisJCXRyeSB7CisJCQlpZHIgPSBQbHVnaW5TZXR0aW5ncy5pbnN0YW5jZSgpLmdldERldmljZSgiZHYuU1dUIik7IC8vJE5PTi1OTFMtMSQJCQkKKwkJfSBjYXRjaCAoZmluYWwgQ2hhcnRFeGNlcHRpb24gcGV4KSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlByb2JsZW0gaW5pdGlhbGl6aW5nIGNoYXJ0IiwgcGV4KTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CisKKwkJY29udHJvbCA9IGFuYWx5c2lzQ29udHJvbDsKKworCQkKKwkJY20gPSBjcmVhdGVTaW1wbGVMaW5lQ2hhcnQoZGF0YVNlcmllc01hcCwgY3ljbGVOdW1iZXJzLCBNZXNzYWdlcworCQkJCS5nZXRTdHJpbmcoIkNDLnRpdGxlIikpOyAvLyROT04tTkxTLTEkCisJCQorCQlyZXNldERhdGEoKTsKKwkJYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChmaW5hbCBQYWludEV2ZW50IHBlKSB7CisKKwkJCQlmaW5hbCBDb21wb3NpdGUgc291cmNlID0gKENvbXBvc2l0ZSkgcGUuZ2V0U291cmNlKCk7CisJCQkJZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSBkID0gc291cmNlCisJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpOworCisJCQkJaWYoaW1nQ2hhcnQgIT0gbnVsbCkgaW1nQ2hhcnQuZGlzcG9zZSgpOworCQkJCWltZ0NoYXJ0ID0gbmV3IEltYWdlKHNvdXJjZS5nZXREaXNwbGF5KCksIGQpOworCQkJCQorCQkJCWlkci5zZXRQcm9wZXJ0eShJRGV2aWNlUmVuZGVyZXIuR1JBUEhJQ1NfQ09OVEVYVCwgbmV3IEdDKAorCQkJCQkJaW1nQ2hhcnQpKTsKKwkJCQlmaW5hbCBCb3VuZHMgYm91bmRzID0gQm91bmRzSW1wbC5jcmVhdGUoZC54LCBkLnksIGQud2lkdGgsCisJCQkJCQlkLmhlaWdodCk7CisJCQkJYm91bmRzLnNjYWxlKDcyZCAvIGlkci5nZXREaXNwbGF5U2VydmVyKCkuZ2V0RHBpUmVzb2x1dGlvbigpKTsKKwkJCQkvLyBCT1VORFMgTVVTVCBCRSBTUEVDSUZJRUQgSU4gUE9JTlRTCisKKwkJCQl0cnkgeworCQkJCQlnci5yZW5kZXIoaWRyLCBnci5idWlsZChpZHIuZ2V0RGlzcGxheVNlcnZlcigpLCBjbSwgYm91bmRzLAorCQkJCQkJCW51bGwsIG51bGwsIG51bGwpKTsKKwkJCQkJcGUuZ2MuZHJhd0ltYWdlKGltZ0NoYXJ0LCBkLngsIGQueSk7CisJCQkJfSBjYXRjaCAoZmluYWwgQ2hhcnRFeGNlcHRpb24gY2UpIHsKKwkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJQcm9ibGVtIHJlbmRlcmluZyBjaGFydCIsIGNlKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX0gLy8gcGFpbnRDb250cm9sCisJCX0gLy8gUGFpbnRMaXN0ZW5lcgorCQkpOworCQkKKwkJLy9DcmVhdGUgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSBjYW52YXMKKwkJY3JlYXRlQ29udGV4dE1lbnUodGhpcyk7CisJCQorCisJfSAvLyBUaW1lU2VyaWVzQ2FudmFzCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICogCisJICogQHBhcmFtIHBhcmVudCAgdGhlIFNXVCBwYXJlbnQgb2YgdGhlIHtAbGluayBXaWRnZXR9CisJICogQHBhcmFtIG9yZGluYXRlU3RyaW5nIAorCSAqIEBwYXJhbSB5QXhpc0xhYmVsIAorCSAqIEBwYXJhbSBkZWZhdWx0WURhdGFUeXBlIAorCSAqIEBwYXJhbSBmb3JlZ3JvdW5kIAorCSAqIEBwYXJhbSBiYWNrZ3JvdW5kIAorCSAqIEBwYXJhbSBmcmFtZWNvbG9yIAorCSAqIEBwYXJhbSBjaGFydEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGNoYXJ0ICgwIGlmIG9ubHkgb25lKQorCSAqICAKKwkgKi8KKwlwdWJsaWMgVGltZVNlcmllc0NhbnZhcyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCAKKwkJCWZpbmFsIFN0cmluZyBvcmRpbmF0ZVN0cmluZywgCisJCQlmaW5hbCBTdHJpbmcgeUF4aXNMYWJlbCwgCisJCQlmaW5hbCBTdHJpbmcgZGVmYXVsdFlEYXRhVHlwZSwKKwkJCUNvbG9yRGVmaW5pdGlvbiBmb3JlZ3JvdW5kLAorCQkJQ29sb3JEZWZpbml0aW9uIGJhY2tncm91bmQsCisJCQlDb2xvckRlZmluaXRpb24gZnJhbWVjb2xvciwKKwkJCWludCBjaGFydEluZGV4KSB7CisJCXN1cGVyKHBhcmVudCwgU1dULkRPVUJMRV9CVUZGRVJFRCB8IFNXVC5CT1JERVIpOworCQlPcmRpbmF0ZV9MRUdFTkQgPSBvcmRpbmF0ZVN0cmluZzsKKwkJT3JkaW5hdGVfQVhJUyA9IHlBeGlzTGFiZWw7CisJCWRlZmF1bHRLZXkgPSBkZWZhdWx0WURhdGFUeXBlOworCQlmb3JlR3JvdW5kIAkJCT0gZm9yZWdyb3VuZDsKKwkJYmFja2dyb3VuZEdyb3VuZCAJPSBiYWNrZ3JvdW5kOworCQlmcmFtZUNvbG9yIAkJCT0gZnJhbWVjb2xvcjsKKwkJdGhpcy5jaGFydEluZGV4ID0gY2hhcnRJbmRleDsKKwkJCisJCWdyID0gR2VuZXJhdG9yLmluc3RhbmNlKCk7CisKKwkJdHJ5IHsKKwkJCWlkciA9IFBsdWdpblNldHRpbmdzLmluc3RhbmNlKCkuZ2V0RGV2aWNlKCJkdi5TV1QiKTsgLy8kTk9OLU5MUy0xJAkJCQorCQl9IGNhdGNoIChmaW5hbCBDaGFydEV4Y2VwdGlvbiBwZXgpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiUHJvYmxlbSBpbml0aWFsaXppbmcgY2hhcnQiLCBwZXgpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCX0KKworCQljb250cm9sID0gKEFuYWx5c2lzQ29udHJvbCkgcGFyZW50OworCisJCQorCQljbSA9IGNyZWF0ZVNpbXBsZUxpbmVDaGFydChkYXRhU2VyaWVzTWFwLCBjeWNsZU51bWJlcnMsIE1lc3NhZ2VzCisJCQkJLmdldFN0cmluZygiQ0MudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCisJCXJlc2V0RGF0YSgpOworCQkKKwkJYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChmaW5hbCBQYWludEV2ZW50IHBlKSB7CisJCQkJCisJCQkJZmluYWwgQ29tcG9zaXRlIHNvdXJjZSA9IChDb21wb3NpdGUpIHBlLmdldFNvdXJjZSgpOworCQkJCWZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUgZCA9IHNvdXJjZQorCQkJCQkJLmdldENsaWVudEFyZWEoKTsKKworCQkJCWlmKGltZ0NoYXJ0ICE9IG51bGwpIGltZ0NoYXJ0LmRpc3Bvc2UoKTsKKwkJCQlpbWdDaGFydCA9IG5ldyBJbWFnZShzb3VyY2UuZ2V0RGlzcGxheSgpLCBkKTsKKwkJCQlpZHIuc2V0UHJvcGVydHkoSURldmljZVJlbmRlcmVyLkdSQVBISUNTX0NPTlRFWFQsIG5ldyBHQygKKwkJCQkJCWltZ0NoYXJ0KSk7CisJCQkJZmluYWwgQm91bmRzIGJvdW5kcyA9IEJvdW5kc0ltcGwuY3JlYXRlKGQueCwgZC55LCBkLndpZHRoLAorCQkJCQkJZC5oZWlnaHQpOworCQkJCWJvdW5kcy5zY2FsZSg3MmQgLyBpZHIuZ2V0RGlzcGxheVNlcnZlcigpLmdldERwaVJlc29sdXRpb24oKSk7CisJCQkJLy8gQk9VTkRTIE1VU1QgQkUgU1BFQ0lGSUVEIElOIFBPSU5UUworCisJCQkJdHJ5IHsKKwkJCQkJZ3IucmVuZGVyKGlkciwgZ3IuYnVpbGQoaWRyLmdldERpc3BsYXlTZXJ2ZXIoKSwgY20sIGJvdW5kcywKKwkJCQkJCQludWxsLCBudWxsLCBudWxsKSk7CisJCQkJCXBlLmdjLmRyYXdJbWFnZShpbWdDaGFydCwgZC54LCBkLnkpOworCQkJCX0gY2F0Y2ggKGZpbmFsIENoYXJ0RXhjZXB0aW9uIGNlKSB7CisJCQkJCUFjdGl2YXRvci5sb2dFcnJvcigiUHJvYmxlbSByZW5kZXJpbmcgY2hhcnQiLCBjZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9IC8vIHBhaW50Q29udHJvbAorCQl9IC8vIFBhaW50TGlzdGVuZXIKKwkJKTsKKwkJCisJCS8vQ3JlYXRlIGEgY29udGV4dCBtZW51IGZvciB0aGUgY2FudmFzCisJCWNyZWF0ZUNvbnRleHRNZW51KHRoaXMpOworCQkKKworCX0gLy8gVGltZVNlcmllc0NhbnZhcworCisJCisJCisJLyoqCisJICogVGhlIG1ldGhvZCB3aGljaCBnZXRzIHRoZSB7QGxpbmsgVGltZVNlcmllc0NhbnZhc30nIHJlcG9ydHMgbGlzdCwgYW5kCisJICogZHJhd3MgaXQgb24gdGhlIHtAbGluayBUaW1lU2VyaWVzQ2FudmFzfS4KKwkgKiBAcmV0dXJuIGludGVncmF0ZWREaWZmZXJlbmNlIGZvciBlYWNoIGxpbmUgc2VyaWVzCisJICogCisJICovCisJcHVibGljIGRvdWJsZVtdIGRyYXcoKSB7CisJCQorCQkvL2NsZWFyRGF0YSgpOworCQlyZXNldERhdGEoKTsKKworCQl5QXhpc1ByaW1hcnkuZ2V0U2VyaWVzRGVmaW5pdGlvbnMoKS5jbGVhcigpOworCQkKKwkJaW50IG1heExpbmVzID0gY29udHJvbC5nZXROdW1Qcm9wZXJ0aWVzKGNoYXJ0SW5kZXgpOworCQorCQkvLyBhZGQgYWxsIHRoZSByZXN0IG9mIHRoZSBsaW5lIHNlcmllcyBub3cKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhMaW5lczsgaSArKykgeworCQkJU3RyaW5nIHByb3BlcnR5ID0gY29udHJvbC5nZXRQcm9wZXJ0eShjaGFydEluZGV4LGkpOworCQkJCisJCQlpZighZGF0YVNlcmllc01hcC5jb250YWluc0tleShwcm9wZXJ0eSkpIHsKKwkJCQkvLyBuZXcgcHJvcGVydHkKKwkJCQlEYXRhU2VyaWVzIHNlcmllcyA9IG5ldyBEYXRhU2VyaWVzKHByb3BlcnR5LCBzZXJpZXNDb3VudCwgb3ZlcmxheU1vZGUpOworCQkJCWlmKHZpc2libGVNYXAuY29udGFpbnNLZXkocHJvcGVydHkpKQorCQkJCQkJc2VyaWVzLnNldFZpc2libGUodmlzaWJsZU1hcC5nZXQocHJvcGVydHkpLmJvb2xlYW5WYWx1ZSgpKTsKKwkJCQllbHNlIHsKKwkJCQkJc2VyaWVzLnNldFZpc2libGUodHJ1ZSk7CisJCQkJCXZpc2libGVNYXAucHV0KHByb3BlcnR5LEJvb2xlYW4uVFJVRSk7CisJCQkJfQorCQkJCXNlcmllc0NvdW50ICsrOworCQkJCWRhdGFTZXJpZXNNYXAucHV0KHByb3BlcnR5LCBzZXJpZXMpOworCQkJfQorCQkJRGF0YVNlcmllcyBzZXJpZXMgPSBkYXRhU2VyaWVzTWFwLmdldChwcm9wZXJ0eSk7CisJCQlpZihzZXJpZXMuaXNWaXNpYmxlKCkpIHsKKwkJCQlzZXJpZXMuc2hvdygpOworCQkJfSBlbHNlIHsKKwkJCQlzZXJpZXMuaGlkZSgpOworCQkJfQorCQl9CisJCisKKwkJLy8gdXBkYXRlIHRoZSBjb250ZXh0IG1lbnUgd2l0aCB0aGUgbmV3IHByb3BlcnRpZXMgdG8gcGxvdAorCQl1cGRhdGVDb250ZXh0TWVudSh0aGlzKTsKKwkJCisJCQorCQkKKwkJZG91YmxlW10gaW50ZWdyYXRlZERpZmZlcmVuY2UgPSBuZXcgZG91YmxlW21heExpbmVzXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhMaW5lczsgaSsrKSB7CisJCQlpbnRlZ3JhdGVkRGlmZmVyZW5jZVtpXSA9IDAuMDsKKwkJfQorCQkKKwkJbWF4WSA9IC0xLjA7CisJCQorCQkJYm9vbGVhbiBzZXRDeWNsZXMgPSBmYWxzZTsKKwkJCS8vIEdldCB0aGUgdmFsdWVzIGZvciB0aGUgcHJvcGVydHkgdG8gYmUgcGxvdHRlZAorCQkJaW50IG1heFBvaW50cyA9IDA7CisJCQkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4TGluZXM7IGkrKykgeworCQkJCVN0cmluZyBwcm9wZXJ0eSA9IGNvbnRyb2wuZ2V0UHJvcGVydHkoY2hhcnRJbmRleCxpKTsKKwkJCQlmaW5hbCBkb3VibGVbXSBkb3VibGVWYWx1ZXMgPSBjb250cm9sLmdldFZhbHVlcyhjaGFydEluZGV4LGkpOworCQkJCQorCQkJCURhdGFTZXJpZXMgc2VyaWVzID0gZGF0YVNlcmllc01hcC5nZXQocHJvcGVydHkpOworCQkJCQorCQkJCWlmKGRhdGFTZXJpZXNNYXAuZ2V0KHByb3BlcnR5KS5pc1Zpc2libGUoKSA9PSB0cnVlKSB7IAorCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGRvdWJsZVZhbHVlcy5sZW5ndGg7IGorKykgeworCQkJCQkJaW50ZWdyYXRlZERpZmZlcmVuY2VbaV0gKz0gZG91YmxlVmFsdWVzW2pdOworCQkJCQkJCisJCQkJCQlpZihkb3VibGVWYWx1ZXNbal0gPD0gbWluWXNjYWxlKSB7CisJCQkJCQkJaWYoZG91YmxlVmFsdWVzW2pdID4gMC4wKSBtaW5Zc2NhbGUgPSBkb3VibGVWYWx1ZXNbal07CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWlmKGRvdWJsZVZhbHVlc1tqXSA+PSBtYXhZKSB7CisJCQkJCQkJbWF4WSA9IGRvdWJsZVZhbHVlc1tqXTsKKwkJCQkJCQlkb3VibGUgbG9nID0gTWF0aC5mbG9vcihNYXRoLmxvZzEwKG1heFkpKTsKKwkJCQkJCQlkb3VibGUgYWRqdXN0ZWRNYXggPSAoTWF0aC5jZWlsKG1heFkvTWF0aC5wb3coMTAsIGxvZykpKSpNYXRoLnBvdygxMCwgbG9nKTsKKwkJCQkJCSAgICBpZihhZGp1c3RlZE1heCA8PSAxLjApIGFkanVzdGVkTWF4ID0gMS4wOworCQkJCQkJICAgIC8vYWRqdXN0ZWRNYXggPSBtYXhZKjEwMC4wOworCQkJCQkJICAgIC8vYWRqdXN0ZWRNYXggKz0gMS4wOworCQkJCQkJICAgIC8vaW50IG14ID0gKGludClhZGp1c3RlZE1heDsKKwkJCQkJCSAgICAvL2FkanVzdGVkTWF4ID0gKChkb3VibGUpbXgpLzEwMC4wOworCQkJCQkJCWlmICh1c2VMaW5lYXJUaW1lU2NhbGUpIHsKKwkJCQkJCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWF4KE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoYWRqdXN0ZWRNYXgpKTsKKwkJCQkJCQkJZG91YmxlIHN0ZXAgPSBhZGp1c3RlZE1heCAvIDEwLjA7CisJCQkJCQkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldFN0ZXAoc3RlcCk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLy8ga2VlcCAyIHNpZ25pZmljYW50IGZpZ3VyZXMgb24gc2NhbGUgYXhpcworCQkJCQkJCQlkb3VibGUgeW1heCA9IE1hdGgubG9nKGFkanVzdGVkTWF4KTsKKwkJCQkJCQkJaWYoYWRqdXN0ZWRNYXggPiAxLjApIHsKKwkJCQkJCQkJCXltYXggKz0gMC40OTk7CisJCQkJCQkJCQlsb25nIGltYXggPSBNYXRoLnJvdW5kKHltYXgpOworCQkJCQkJCQkJeW1heCA9IGltYXg7CisJCQkJCQkJCX0KKwkJCQkJCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWF4KE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoeW1heCkpOworCQkJCQkJCQlkb3VibGUgc3RlcCA9IHltYXgvMTAuMDsKKwkJCQkJCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0U3RlcChzdGVwKTsKKwkJCQkJCQl9CisJCQkJCQkJCisJCQkJCQkJCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IC8vIGlzIHZpc2libGUKKwkJCQlpbnRlZ3JhdGVkRGlmZmVyZW5jZVtpXSAvPSBkb3VibGVWYWx1ZXMubGVuZ3RoOworCQkJCQkvLyBBbnkgdmFsdWVzPworCQkJCQlpZiAoZG91YmxlVmFsdWVzLmxlbmd0aCA+IDApIHsKKwkJCQkJCWlmIChtYXhQb2ludHMgPCBkb3VibGVWYWx1ZXMubGVuZ3RoKSB7CisJCQkJCQkJbWF4UG9pbnRzID0gZG91YmxlVmFsdWVzLmxlbmd0aDsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJZm9yIChpbnQgY3ljbGVOdW1iZXIgPSAwOyBjeWNsZU51bWJlciA8IGRvdWJsZVZhbHVlcy5sZW5ndGg7IGN5Y2xlTnVtYmVyKyspIHsKKwkJCQkJCQkKKwkJCQkJCQlEb3VibGUgdmFsdWU7CisJCQkJCQkJZG91YmxlIGRpc3BsYXlWYWx1ZSA9IGRvdWJsZVZhbHVlc1tjeWNsZU51bWJlcl07CisJCQkJCQkJaWYgKGRpc3BsYXlWYWx1ZSA8PSBtaW5Zc2NhbGUpIHsKKwkJCQkJCQkJLy8gTG9nKDAuMCkgaXMgbmVnYXRpdmUgaW5maW5pdHkgc28gZm9yIGRpc3BsYXkgcHVycG9zZXMgb25seQorCQkJCQkJCQkvLyB3ZSBzZXQgdGhlIG1pbmltdW0gYXhpcyB2YWx1ZSBhdCAwLjEvUE9QVUxBVElPTgorCQkJCQkJCQlkaXNwbGF5VmFsdWUgPSBtaW5Zc2NhbGU7CisJCQkJCQkJfQorCQkJCQkJCWlmICh1c2VMaW5lYXJUaW1lU2NhbGUpIHsKKwkJCQkJCQkJdmFsdWUgPSBuZXcgRG91YmxlKGRpc3BsYXlWYWx1ZSk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJdmFsdWUgPSBuZXcgRG91YmxlKE1hdGgubG9nKGRpc3BsYXlWYWx1ZSkpOworCQkJCQkJCX0KKwkJCQkJCQkKKworCQkJCQkJCXNlcmllcy5hZGRWYWx1ZSh2YWx1ZSk7CisJCQkJCQkJCisJCQkJCQkJLy8gb25seSBkbyBvbmNlIGZvciBmaXJzdCBsaW5lIHNlcmllcworCQkJCQkJCWlmICghc2V0Q3ljbGVzKSB7CisJCQkJCQkJCWN5Y2xlTnVtYmVycy5hZGQoSW50ZWdlci52YWx1ZU9mKGN5Y2xlTnVtYmVyKSk7CQorCQkJCQkJCQl9CisJCQkJCQl9IC8vIGZvciBjeWNsZU51bWJlcgorCQkJCQkJCisJCQkJCQlpZih4QXhpc1ByaW1hcnkuZ2V0U2VyaWVzRGVmaW5pdGlvbnMoKS5nZXQoMCkuZ2V0U2VyaWVzKCkuc2l6ZSgpICE9IGN5Y2xlTnVtYmVycy5zaXplKCkpIHsKKwkJCQkJCQkvLyBUaGUgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGhhdmUgY2hhbmdlZCwgY3JlYXRlIGEgbmV3IHNlcmllcyBmb3IgdGhlIHggYXhpcworCQkJCQkJCXhBeGlzUHJpbWFyeS5nZXRTZXJpZXNEZWZpbml0aW9ucygpLmNsZWFyKCk7CisJCQkJCQkJZmluYWwgU2VyaWVzIHhBeGlzU2VyaWVzID0gU2VyaWVzSW1wbC5jcmVhdGUoKTsKKworCQkJCQkJCWZpbmFsIE51bWJlckRhdGFTZXQgeFZhbHVlcyA9IE51bWJlckRhdGFTZXRJbXBsLmNyZWF0ZShjeWNsZU51bWJlcnMpOworCQkJCQkJCXhBeGlzU2VyaWVzLnNldERhdGFTZXQoeFZhbHVlcyk7CisJCQkJCQkJZmluYWwgU2VyaWVzRGVmaW5pdGlvbiBzZFggPSBTZXJpZXNEZWZpbml0aW9uSW1wbC5jcmVhdGUoKTsKKworCQkJCQkJCXhBeGlzUHJpbWFyeS5nZXRTZXJpZXNEZWZpbml0aW9ucygpLmFkZChzZFgpOworCQkJCQkJCXNkWC5nZXRTZXJpZXMoKS5hZGQoeEF4aXNTZXJpZXMpOworCQkJCQkJfQorCQkJCQkJCQorCQkJCQkJCisJCQkJCQlzZXRDeWNsZXMgPSB0cnVlOyAvLyB3ZSBzZXQgdGhlbSBvbmx5IG9uY2UKKwkJCQkJCQorCQkJCQl9IGVsc2UgeworCQkJCQkJLy9yZXNldERhdGEoKTsKKwkJCQkJfQorCQkJfSAvLyBmb3IgaSBwcm9wZXJ0aWVzCisKKworCQlpZiAoIXRoaXMuaXNEaXNwb3NlZCgpKSB7CisJCQlyZWRyYXcoKTsKKwkJfQorCQkKKwkJaWYodGhpcy5jaGFydEluZGV4PT0xKSB7CisJCQljb250cm9sLnVwZGF0ZU1lc3NhZ2UoU2NlbmFyaW9BbmFseXNpc1N1aXRlLlJFQURZX01TRyk7CisJCX0gZWxzZSB7CisJCQljb250cm9sLnVwZGF0ZU1lc3NhZ2UoU2NlbmFyaW9BbmFseXNpc1N1aXRlLldPUktJTkdfTVNHKTsKKwkJfQorCQlyZXR1cm4gaW50ZWdyYXRlZERpZmZlcmVuY2U7CisJfSAvLyBwYWludENvbnRyb2wKKworCS8qKgorCSAqIEBwYXJhbSBkYXRhU2VyaWVzTWFwCisJICogICAgICAgICAgICB0aGUge0BsaW5rIExpc3R9IHRoYXQgd2lsbCBjb250YWluIHRoZSByZWxhdGl2ZSB2YWx1ZXMKKwkgKiAgICAgICAgICAgICgwLjAtMS4wKSB0byBwbG90CisJICogQHBhcmFtIGN5Y2xlTnVtYmVycworCSAqICAgICAgICAgICAgdGhlIHtAbGluayBMaXN0fSBvZiBzaW11bGF0aW9uIGN5Y2xlIG51bWJlcnMgdGhhdCBtYXRjaCB0aGUKKwkgKiAgICAgICAgICAgIHJlbGF0aXZlIHZhbHVlcworCSAqIEBwYXJhbSBzZXJpZXNJZGVudGlmaWVyCisJICogICAgICAgICAgICB0aGUgdGl0bGUgb2YgdGhlIGNoYXJ0CisJICogQHJldHVybiBhIDxjb2RlPkNoYXJ0PC9jb2RlPgorCSAqLworCXB1YmxpYyBmaW5hbCBDaGFydCBjcmVhdGVTaW1wbGVMaW5lQ2hhcnQoCisJCQlmaW5hbCBNYXA8U3RyaW5nLCBEYXRhU2VyaWVzPiBkYXRhU2VyaWVzTWFwLAorCQkJZmluYWwgTGlzdDxJbnRlZ2VyPiBjeWNsZU51bWJlcnMsIGZpbmFsIFN0cmluZyBzZXJpZXNJZGVudGlmaWVyKSB7CisJCQorCQlmaW5hbCBDaGFydFdpdGhBeGVzIHJldFZhbHVlID0gQ2hhcnRXaXRoQXhlc0ltcGwuY3JlYXRlKCk7CisKKwkJCisJCS8vIFBsb3QKKwkJcmV0VmFsdWUuZ2V0QmxvY2soKS5zZXRCYWNrZ3JvdW5kKGZyYW1lQ29sb3IpOworCQlmaW5hbCBQbG90IHAgPSByZXRWYWx1ZS5nZXRQbG90KCk7CisJCXAuZ2V0Q2xpZW50QXJlYSgpLnNldEJhY2tncm91bmQoYmFja2dyb3VuZEdyb3VuZCk7CisKKwkJLy8gVGl0bGUKKwkJLy8gY3dhTGluZS5nZXRUaXRsZSggKS5nZXRMYWJlbCggKS5nZXRDYXB0aW9uKCApLnNldFZhbHVlKCAiTGluZSBDaGFydCIKKwkJLy8gKTsvLyROT04tTkxTLTEkCisJCXJldFZhbHVlLmdldFRpdGxlKCkuc2V0VmlzaWJsZShmYWxzZSk7CisKKwkJLy8gTGVnZW5kCisJCWxlZ2VuZCA9IHJldFZhbHVlLmdldExlZ2VuZCgpOworCQlmaW5hbCBMaW5lQXR0cmlidXRlcyBsaWEgPSBsZWdlbmQuZ2V0T3V0bGluZSgpOworCQlsZWdlbmQuZ2V0VGV4dCgpLmdldEZvbnQoKS5zZXRTaXplKDgpOworCQlsaWEuc2V0U3R5bGUoTGluZVN0eWxlLlNPTElEX0xJVEVSQUwpOworCQlsZWdlbmQuZ2V0SW5zZXRzKCkuc2V0KDEwLCA1LCAwLCAwKTsKKwkJbGVnZW5kLmdldE91dGxpbmUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJbGVnZW5kLnNldEFuY2hvcihBbmNob3IuTk9SVEhfTElURVJBTCk7CisJCWxlZ2VuZC5zZXRQb3NpdGlvbihQb3NpdGlvbi5CRUxPV19MSVRFUkFMKTsKKwkJbGVnZW5kLmdldFRleHQoKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJbGVnZW5kLmdldE91dGxpbmUoKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJCisJCS8vIGN3YUxpbmUuZ2V0TGVnZW5kKCApLmdldFRleHQoKS5nZXRGb250KCkuc2V0U2l6ZSgxNik7OworCQkvLyBjd2FMaW5lLmdldExlZ2VuZCggKS5zZXRWaXNpYmxlKCB0cnVlICk7CisKKwkJLy8gLy8vLy8vLy8vCisJCS8vIFgtQXhpcworCQl4QXhpc1ByaW1hcnkgPSByZXRWYWx1ZS5nZXRQcmltYXJ5QmFzZUF4ZXMoKVswXTsKKwkJeEF4aXNQcmltYXJ5LnNldFR5cGUoQXhpc1R5cGUuVEVYVF9MSVRFUkFMKTsKKwkJeEF4aXNQcmltYXJ5LmdldE1ham9yR3JpZCgpLnNldFRpY2tTdHlsZShUaWNrU3R5bGUuQkVMT1dfTElURVJBTCk7CisJCXhBeGlzUHJpbWFyeS5nZXRPcmlnaW4oKS5zZXRUeXBlKEludGVyc2VjdGlvblR5cGUuVkFMVUVfTElURVJBTCk7CisJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLnNldFZpc2libGUoZmFsc2UpOworCQl4QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5nZXRDYXB0aW9uKCkuZ2V0Rm9udCgpLnNldFNpemUoOSk7CisJCXhBeGlzUHJpbWFyeS5nZXRUaXRsZSgpLmdldENhcHRpb24oKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJeEF4aXNQcmltYXJ5LmdldExhYmVsKCkuZ2V0Q2FwdGlvbigpLnNldENvbG9yKGZvcmVHcm91bmQpOworCisJCWZpbmFsIFNlcmllcyB4QXhpc1NlcmllcyA9IFNlcmllc0ltcGwuY3JlYXRlKCk7CisKKwkJLy8gbmV3IGNvbG9ycworCQl4QXhpc1Nlcmllcy5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJeEF4aXNTZXJpZXMuZ2V0TGFiZWwoKS5nZXRPdXRsaW5lKCkuc2V0Q29sb3IoZm9yZUdyb3VuZCk7CisJCS8vCQorCisJCWZpbmFsIE51bWJlckRhdGFTZXQgeFZhbHVlcyA9IE51bWJlckRhdGFTZXRJbXBsLmNyZWF0ZShjeWNsZU51bWJlcnMpOworCQl4QXhpc1Nlcmllcy5zZXREYXRhU2V0KHhWYWx1ZXMpOworCQlmaW5hbCBTZXJpZXNEZWZpbml0aW9uIHNkWCA9IFNlcmllc0RlZmluaXRpb25JbXBsLmNyZWF0ZSgpOworCisJCXhBeGlzUHJpbWFyeS5nZXRTZXJpZXNEZWZpbml0aW9ucygpLmFkZChzZFgpOworCQlzZFguZ2V0U2VyaWVzKCkuYWRkKHhBeGlzU2VyaWVzKTsKKworCQkvLyAvLy8vLy8vLworCQkvLyBZLUF4aXMKKwkJeUF4aXNQcmltYXJ5ID0gcmV0VmFsdWUuZ2V0UHJpbWFyeU9ydGhvZ29uYWxBeGlzKHhBeGlzUHJpbWFyeSk7CisJCXlBeGlzUHJpbWFyeS5nZXRNYWpvckdyaWQoKS5zZXRUaWNrU3R5bGUoVGlja1N0eWxlLkxFRlRfTElURVJBTCk7CisKKwkJLy8gTnVtYmVyRGF0YVNldFtdIG9ydGhvVmFsdWVzID0gbmV3IE51bWJlckRhdGFTZXRbTUFYX0xJTkVTXTsKKwkJLy8gU2VyaWVzRGVmaW5pdGlvbltdIHNkWSA9IG5ldyBTZXJpZXNEZWZpbml0aW9uW01BWF9MSU5FU107CisKKwkJLy8gZW5kIFktU2VyaWVzCisKKwkJeEF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWluKE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoMC4wKSk7CisJCS8vIHhBeGlzUHJpbWFyeS5nZXRTY2FsZSggKS5zZXRNYXgoIE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoIDEwLjAgKQorCQkvLyApOworCQkvLyB4QXhpc1ByaW1hcnkuZ2V0U2NhbGUoICkuc2V0U3RlcCggMSApOworCQl4QXhpc1ByaW1hcnkuZ2V0TGFiZWwoKS5nZXRDYXB0aW9uKCkuZ2V0Rm9udCgpLnNldFNpemUoOSk7CisJCXhBeGlzUHJpbWFyeS5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuc2V0VmlzaWJsZSh0cnVlKTsKKwkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuZ2V0Q2FwdGlvbigpLnNldFZhbHVlKE1lc3NhZ2VzLmdldFN0cmluZygiVFMuVElNRUxBQkVMIikpOworCisJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1pbihOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDAuMCkpOworCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNYXgoTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZSgxLjApKTsKKwkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0U3RlcCgwLjI1KTsKKwkJeUF4aXNQcmltYXJ5LmdldExhYmVsKCkuZ2V0Q2FwdGlvbigpLmdldEZvbnQoKS5zZXRTaXplKDkpOworCQl5QXhpc1ByaW1hcnkuZ2V0TGFiZWwoKS5nZXRDYXB0aW9uKCkuc2V0Q29sb3IoZm9yZUdyb3VuZCk7CisJCXlBeGlzUHJpbWFyeS5nZXRUaXRsZSggKS5nZXRDYXB0aW9uKCApLnNldFZhbHVlKCBPcmRpbmF0ZV9BWElTICk7CisJCXlBeGlzUHJpbWFyeS5nZXRUaXRsZSggKS5zZXRWaXNpYmxlKHRydWUpOworCQkvLyB5QXhpc1ByaW1hcnkuZ2V0TWFqb3JHcmlkKCkuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJCisJCS8vIGZvciBub3cgZ2V0IHJlYWR5IHRvIGNyZWF0ZSBvbmx5IG9uZSBsaW5lIC0gd2UgaGF2ZSBubyBkYXRhIHlldC4KKwkJLy8gd2Ugd2lsbCBhZGQgbW9yZSBsaW5lcyBhcyB3ZSBuZWVkIHRoZW0KKwkJLy8gaGFuZGxlIG51bGwKKwkJaWYoIWRhdGFTZXJpZXNNYXAuY29udGFpbnNLZXkoZGVmYXVsdEtleSkpIHsKKwkJCURhdGFTZXJpZXMgc2VyaWVzID0gbmV3IERhdGFTZXJpZXMoZGVmYXVsdEtleSwgc2VyaWVzQ291bnQsIG92ZXJsYXlNb2RlKTsKKwkJCXNlcmllc0NvdW50ICsrOworCQkJZGF0YVNlcmllc01hcC5wdXQoZGVmYXVsdEtleSwgc2VyaWVzKTsKKwkJfQorCisJCXJldHVybiByZXRWYWx1ZTsKKwl9IC8vIGNyZWF0ZVNpbXBsZUxpbmVDaGFydAorCisJCisJLyoqCisJICogQ3JlYXRlIHRoZSB2aWV3J3MgY29udGV4dCBtZW51IGFuZCBhZGQgdGhlIGFjdGlvbiBoYW5kbGVycyB0byBpdC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudShmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJLy8gSW5pdCBhIENvbnRleHQgTWVudSBNYW5hZ2VyCisJCWZpbmFsIE1lbnVNYW5hZ2VyIGNvbnRleHRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCWxpbmVhclRpbWVBY3Rpb24gPSBuZXcgTGluZWFyU2NhbGVBY3Rpb24oKTsKKwkJbG9nVGltZUFjdGlvbiA9IG5ldyBMb2dTY2FsZUFjdGlvbigpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGxpbmVhclRpbWVBY3Rpb24pOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGxvZ1RpbWVBY3Rpb24pOworCisKKwkJCisJCS8vIFBsYWNlIEhvbGRlciBmb3IgTWVudSBBZGRpdGlvbnMKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKAorCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQorCQl2aWV3TGVnZW5kID0gbmV3IExlZ2VuZFZpZXdBY3Rpb24oKTsKKwkJaGlkZUxlZ2VuZCA9IG5ldyBMZWdlbmRIaWRlQWN0aW9uKCk7CisJCWNvbnRleHRNZW51TWFuYWdlci5hZGQodmlld0xlZ2VuZCk7CisJCWNvbnRleHRNZW51TWFuYWdlci5hZGQoaGlkZUxlZ2VuZCk7CisJCQorCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCisJCQorCQkvLyBQbGFjZSBIb2xkZXIgZm9yIE1lbnUgQWRkaXRpb25zCisJCWNvbnRleHRNZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigKKwkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOworCisJCXBvcFVwTWVudSA9IGNvbnRleHRNZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShwYXJlbnQpOworCisJCS8vIFNldCB0aGUgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyCisJCXBhcmVudC5zZXRNZW51KHBvcFVwTWVudSk7CisKKwl9IC8vIGNyZWF0ZUNvbnRleHRNZW51CisJCisJLyoqCisJICogVXBkYXRlIHRoZSB2aWV3J3MgY29udGV4dCBtZW51IGFuZCBhZGQgdGhlIGFjdGlvbiBoYW5kbGVycyB0byBpdC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlQ29udGV4dE1lbnUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXBvcFVwTWVudS5kaXNwb3NlKCk7CisKKwkJLy8gSW5pdCBhIENvbnRleHQgTWVudSBNYW5hZ2VyCisJCWZpbmFsIE1lbnVNYW5hZ2VyIGNvbnRleHRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCWxpbmVhclRpbWVBY3Rpb24gPSBuZXcgTGluZWFyU2NhbGVBY3Rpb24oKTsKKwkJbG9nVGltZUFjdGlvbiA9IG5ldyBMb2dTY2FsZUFjdGlvbigpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGxpbmVhclRpbWVBY3Rpb24pOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGxvZ1RpbWVBY3Rpb24pOworCQkKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCQkvLyBQbGFjZSBIb2xkZXIgZm9yIE1lbnUgQWRkaXRpb25zCisJCWNvbnRleHRNZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigKKwkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkKKwkJdmlld0xlZ2VuZCA9IG5ldyBMZWdlbmRWaWV3QWN0aW9uKCk7CisJCWhpZGVMZWdlbmQgPSBuZXcgTGVnZW5kSGlkZUFjdGlvbigpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKHZpZXdMZWdlbmQpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGhpZGVMZWdlbmQpOworCQkKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQorCQkKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQkKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIGFkZCB0aGUgZGlzcGxheWFibGUgcHJvcGVydGllcworCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2wuZ2V0TnVtUHJvcGVydGllcyhjaGFydEluZGV4KTsgaSArKykgeworCQkJCisJCQlTdHJpbmcgbmV4dFByb3AgPSBjb250cm9sLmdldFByb3BlcnR5KGNoYXJ0SW5kZXgsaSk7CisJCQlEYXRhU2VyaWVzIHNlcmllcyA9IGRhdGFTZXJpZXNNYXAuZ2V0KG5leHRQcm9wKTsKKwkJCURpc3BsYXlhYmxlUHJvcGVydHkgcHJvcGVydHkgPSBuZXcgRGlzcGxheWFibGVQcm9wZXJ0eShuZXh0UHJvcCwgc2VyaWVzLmlzVmlzaWJsZSgpKTsKKwkJCWNvbnRleHRNZW51TWFuYWdlci5hZGQocHJvcGVydHkpOworCQl9CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlmaW5hbCBNZW51IHBvcFVwTWVudSA9IGNvbnRleHRNZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShwYXJlbnQpOworCisJCS8vIFNldCB0aGUgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyCisJCXBhcmVudC5zZXRNZW51KHBvcFVwTWVudSk7CisKKworCX0gLy8gdXBkYXRlQ29udGV4dE1lbnUKKworCisJCisJLyoqCisJICogU2V0cyB0aGUgY29sb3JzIGZvciBhIG4gYXJyYXkgb2YgTGluZVNlcmllcyBnaXZlbiB0aGUgcHJvcGVydHkgdG8gUGxvdAorCSAqIGZvciBlYWNoLiBUcnkgdG8gc2V0IGNvbG9yIGZyb20gdGhlIHByZWZlcmVuY2VzIChpZiBzcGVjaWZpZWQgZm9yIHRoYXQKKwkgKiBwcm9wZXJ0eSkgb3RoZXJ3aXNlIHNldHMgbGluZSBjb2xvciB0byBibHVlLgorCSAqIAorCSAqIEBwYXJhbSBwcm9wZXJ0aWVzVG9QbG90CisJICogQHBhcmFtIGxzTGlzdAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb2xvckRlZnMoCisJCQlmaW5hbCBMaXN0PFN0cmluZz4gcHJvcGVydGllc1RvUGxvdCwKKwkJCWZpbmFsIExpc3Q8TGluZVNlcmllcz4gbHNMaXN0KSB7CisJCS8vIHRoZSBkZWZhdWx0IGxpbmUgY29sb3IKKworCQkvLyBpZiBwb3NzaWJsZSBnZXQgY29sb3IgZnJvbSBwcmVmZXJlbmNlcworCQlmaW5hbCBNYXA8U3RyaW5nLCBDb2xvcj4gY29sb3JNYXAgPSBWaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UKKwkJCQkuZ2V0Q29sb3JNYXBwaW5nKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbHNMaXN0LnNpemUoKTsgaSsrKSB7CisJCQlDb2xvckRlZmluaXRpb24gY29sb3IgPSBDb2xvckRlZmluaXRpb25JbXBsLkJMVUUoKTsKKworCQkJaWYgKChwcm9wZXJ0aWVzVG9QbG90ICE9IG51bGwpICYmIChwcm9wZXJ0aWVzVG9QbG90LnNpemUoKSA+IGkpKSB7CisJCQkJZmluYWwgU3RyaW5nIGtleSA9IHByb3BlcnRpZXNUb1Bsb3QuZ2V0KGkpOworCQkJCS8vIGxvb2sgb3IgdGhlIHByZWZlcmVuY2UgY29sb3IgYnkgbmFtZQorCQkJCWlmIChjb2xvck1hcC5jb250YWluc0tleShrZXkpKSB7CisJCQkJCWZpbmFsIENvbG9yIGMgPSBjb2xvck1hcC5nZXQoa2V5KTsKKwkJCQkJY29sb3IgPSBDb2xvckRlZmluaXRpb25JbXBsLmNyZWF0ZShjLmdldFJlZCgpLAorCQkJCQkJCWMuZ2V0R3JlZW4oKSwgYy5nZXRCbHVlKCkpOworCQkJCX0KKwkJCQlsc0xpc3QuZ2V0KGkpLnNldFNlcmllc0lkZW50aWZpZXIoa2V5KTsKKwkJCQlsc0xpc3QuZ2V0KGkpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoY29sb3IpOworCQkJfSBlbHNlIHsKKworCQkJCWlmIChsc0xpc3QuZ2V0KGkpICE9IG51bGwpIHsKKwkJCQkJbHNMaXN0LmdldChpKS5zZXRTZXJpZXNJZGVudGlmaWVyKCIgIik7CisJCQkJCWxzTGlzdC5nZXQoaSkuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRDb2xvcihjb2xvcik7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybjsKKwl9Ly8gZ2V0Q29sb3JEZWYKKworCisJCisKKwkvKioKKwkgKiBEaXNwb3NlcyB0aGUgQ29sb3Igb2JqZWN0cworCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9CisKKwkvKioKKwkgKiByZXNldAorCSAqLworCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlyZXNldERhdGEoKTsKKwkJcmVkcmF3KCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVzZXREYXRhKCkgeworCQljbGVhckRhdGEoKTsKKwkJc2VyaWVzQ291bnQgPSAwOyAvLyBhbHdheXMgc3RhcnQgd2l0aCB0aGUgc2FtZSBmaXJzdCBjb2xvcgorCQljeWNsZU51bWJlcnMuYWRkKEludGVnZXIudmFsdWVPZigwKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNsZWFyRGF0YSgpIHsKKwkJCisJCWRhdGFTZXJpZXNNYXAuY2xlYXIoKTsKKwkJY3ljbGVOdW1iZXJzLmNsZWFyKCk7CisJfQorCisJCisJLyoqCisJICogdG9nZ2xlIHRoZSBzY2FsZSBmcm9tIGxvZ2FyaXRobWljIHRvIGxpbmVhcgorCSAqLworCXZvaWQgdG9nZ2xlQXhpc1NjYWxlKCkgeworCQlpZiAodXNlTGluZWFyVGltZVNjYWxlKSB7IC8vU3dpdGNoIHRvIGxvZ2FyaXRobWljIHNjYWxlCisJCQlsb2dUaW1lQWN0aW9uLnNldENoZWNrZWQodHJ1ZSk7CisJCQlsaW5lYXJUaW1lQWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOworCQkJLy9KdXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgYXhpcyB0eXBlLCB0byBtb3ZlIHRvIGxvZyBzY2FsZSwgZGlkbid0IHdvcmsKKwkJCS8veUF4aXNQcmltYXJ5LnNldFR5cGUoQXhpc1R5cGUuTE9HQVJJVEhNSUNfTElURVJBTCk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNaW4obnVsbCk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNYXgobnVsbCk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS51bnNldFN0ZXAoKTsKKwkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnVuc2V0U3RlcE51bWJlcigpOworCQl9CisJCWVsc2UgeyAvL1N3aXRjaCB0byBsaW5lYXIgc2NhbGUKKwkJCWxvZ1RpbWVBY3Rpb24uc2V0Q2hlY2tlZChmYWxzZSk7CisJCQlsaW5lYXJUaW1lQWN0aW9uLnNldENoZWNrZWQodHJ1ZSk7CisJCQkvL3lBeGlzUHJpbWFyeS5zZXRUeXBlKEF4aXNUeXBlLkxJTkVBUl9MSVRFUkFMKTsKKwkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1pbihOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDAuMCkpOworCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWF4KE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoMS4wKSk7CisJCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRTdGVwKDAuMjUpOworCQl9CisJCXVzZUxpbmVhclRpbWVTY2FsZSA9ICF1c2VMaW5lYXJUaW1lU2NhbGU7CisJCWRyYXcoKTsKKwl9CisJCisKKwkvKioKKwkgKiB0b2dnbGUgdGhlIHNjYWxlIGZyb20gbG9nYXJpdGhtaWMgdG8gbGluZWFyCisJICovCisJdm9pZCB0b2dnbGVMZWdlbmQoKSB7CisJCWlmIChzaG93TGVnZW5kKSB7IC8vU3dpdGNoIHRvIGhpZGUKKwkJCXZpZXdMZWdlbmQuc2V0Q2hlY2tlZChmYWxzZSk7CisJCQloaWRlTGVnZW5kLnNldENoZWNrZWQodHJ1ZSk7CisJCQlsZWdlbmQuc2V0VmlzaWJsZShmYWxzZSk7CisJCX0KKwkJZWxzZSB7IC8vU3dpdGNoIHRvIHZpZXcKKwkJCXZpZXdMZWdlbmQuc2V0Q2hlY2tlZCh0cnVlKTsKKwkJCWhpZGVMZWdlbmQuc2V0Q2hlY2tlZChmYWxzZSk7CisJCQlsZWdlbmQuc2V0VmlzaWJsZSh0cnVlKTsKKwkJfQorCQlzaG93TGVnZW5kID0gIXNob3dMZWdlbmQ7CisJCWRyYXcoKTsKKwl9CisKKworCS8qKgorCSAqIEFjdGlvbiB0byBzaG93IHRoZSBsZWdlbmQKKwkgKi8KKwlwcm90ZWN0ZWQgY2xhc3MgTGVnZW5kVmlld0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJCXB1YmxpYyBMZWdlbmRWaWV3QWN0aW9uKCkKKwkJeworCQkJc3VwZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5TaG93TGVnZW5kIiksIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKKwkJCXNldENoZWNrZWQoc2hvd0xlZ2VuZCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI2dldFRleHQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbnRleHRNZW51LlNob3dMZWdlbmQiKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQlpZiAoc2hvd0xlZ2VuZCkgeworCQkJCXNldENoZWNrZWQodHJ1ZSk7CisJCQkJLy9Ob3RoaW5nIHRvIGRvLiBJdCdzIGFscmVhZHkgbGluZWFyLXRpbWUuCisJCQl9CisJCQllbHNlIHsKKwkJCQl0b2dnbGVMZWdlbmQoKTsKKwkJCX0KKwkJCWRyYXcoKTsKKwkJfQorCX0gLy9MZWdlbmRWaWV3QWN0aW9uCisJCisJLyoqCisJICogQWN0aW9uIHRvIGhpZGUgdGhlIGxlZ2VuZAorCSAqLworCWNsYXNzIExlZ2VuZEhpZGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gCXsKKwkJcHVibGljIExlZ2VuZEhpZGVBY3Rpb24oKQorCQl7CisJCQlzdXBlcihNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbnRleHRNZW51LkhpZGVMZWdlbmQiKSwgSUFjdGlvbi5BU19DSEVDS19CT1gpOworCQkJc2V0Q2hlY2tlZCghc2hvd0xlZ2VuZCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI2dldFRleHQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbnRleHRNZW51LkhpZGVMZWdlbmQiKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQlpZiAoIXNob3dMZWdlbmQpIHsKKwkJCQlzZXRDaGVja2VkKHRydWUpOworCQkJCS8vTm90aGluZyB0byBkby4gSXQncyBhbHJlYWR5IGxvZy10aW1lLgorCQkJfQorCQkJZWxzZSB7CisJCQkJdG9nZ2xlTGVnZW5kKCk7CisJCQl9CisJCQlkcmF3KCk7CisJCX0KKwl9Ly9MZWdlbmRIaWRlQWN0aW9uCisKKwkKKwkvKioKKwkgKiBzd2l0Y2ggdG8gbGluZWFyIHBsb3QgCisJICogCisJICovCisJcHJvdGVjdGVkIGNsYXNzIExpbmVhclNjYWxlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKwkJcHVibGljIExpbmVhclNjYWxlQWN0aW9uKCkKKwkJeworCQkJc3VwZXIoTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5MaW5lYXJUaW1lU2NhbGUiKSwgSUFjdGlvbi5BU19DSEVDS19CT1gpOworCQkJc2V0Q2hlY2tlZCh1c2VMaW5lYXJUaW1lU2NhbGUpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5MaW5lYXJUaW1lU2NhbGUiKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQlpZiAodXNlTGluZWFyVGltZVNjYWxlKSB7CisJCQkJc2V0Q2hlY2tlZCh0cnVlKTsKKwkJCQkvL05vdGhpbmcgdG8gZG8uIEl0J3MgYWxyZWFkeSBsaW5lYXItdGltZS4KKwkJCX0KKwkJCWVsc2UgeworCQkJCXRvZ2dsZUF4aXNTY2FsZSgpOworCQkJfQorCQkJZHJhdygpOworCQl9CisJfSAvL0xpbmVhclNjYWxlQWN0aW9uCisKKwkvKioKKwkgKiBzd2l0Y2ggdG8gc2VtaS1sb2cgcGxvdCAobG9nIHNjYWxlIG9uIHkgYXhpcykKKwkgKiAKKwkgKi8KKwljbGFzcyBMb2dTY2FsZUFjdGlvbiBleHRlbmRzIEFjdGlvbiAJeworCQlwdWJsaWMgTG9nU2NhbGVBY3Rpb24oKQorCQl7CisJCQlzdXBlcihNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbnRleHRNZW51LkxvZ1RpbWVTY2FsZSIpLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7CisJCQlzZXRDaGVja2VkKCF1c2VMaW5lYXJUaW1lU2NhbGUpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb250ZXh0TWVudS5Mb2dUaW1lU2NhbGUiKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQlpZiAoIXVzZUxpbmVhclRpbWVTY2FsZSkgeworCQkJCXNldENoZWNrZWQodHJ1ZSk7CisJCQkJLy9Ob3RoaW5nIHRvIGRvLiBJdCdzIGFscmVhZHkgbG9nLXRpbWUuCisJCQl9CisJCQllbHNlIHsKKwkJCQl0b2dnbGVBeGlzU2NhbGUoKTsKKwkJCX0KKwkJCWRyYXcoKTsKKwkJfQorCX0vL0xvZ1NjYWxlQWN0aW9uCisJCisJLyoqCisJICogRGlzcGxheWFibGVQcm9wZXJ0eQorCSAqCisJICovCisJcHJvdGVjdGVkIGNsYXNzIERpc3BsYXlhYmxlUHJvcGVydHkgZXh0ZW5kcyBBY3Rpb24KKwl7CisJCVN0cmluZyBwcm9wZXJ0eSA9IG51bGw7CisJCXB1YmxpYyBEaXNwbGF5YWJsZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSwgYm9vbGVhbiB2aXNpYmlsaXR5KQorCQl7CisJCQkJCXN1cGVyKHByb3BlcnR5LCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7CisJCQkJCXRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKwkJCQkJc2V0Q2hlY2tlZCh2aXNpYmlsaXR5KTsKKwkJfQorCQkKKwkKKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI2dldFRleHQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJCXJldHVybiBwcm9wZXJ0eTsKKwkJfQorCisJCS8qKgorCQkgKiBUb2dnbGUgdGhlIHN0YXRlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlEYXRhU2VyaWVzIHNlcmllcyA9IGRhdGFTZXJpZXNNYXAuZ2V0KHByb3BlcnR5KTsKKwkJCQlzZXJpZXMudG9nZ2xlVmlzaWJsZSgpOworCQkJCWRhdGFTZXJpZXNNYXAucHV0KHByb3BlcnR5LHNlcmllcyk7CisJCQkJc2V0Q2hlY2tlZChzZXJpZXMuaXNWaXNpYmxlKCkpOworCQkJCXZpc2libGVNYXAucHV0KHByb3BlcnR5LCBCb29sZWFuLnZhbHVlT2Yoc2VyaWVzLmlzVmlzaWJsZSgpKSk7CisJCQkJZHJhdygpOworCQl9CisJfS8vIERpc3BsYXlhYmxlUHJvcGVydHkKKwkKKwkKKwkvKioKKwkgKiBJbm5lciBjbGFzcyBEYXRhU2VyaWVzCisJICogYWxsIHRoZSBkYXRhIG9iamVjdHMgZm9yIGEgcGxvdAorCSAqCisJICovCisJcHJvdGVjdGVkIGNsYXNzIERhdGFTZXJpZXMgCisJeworCQlwdWJsaWMgU3RyaW5nIHByb3BlcnR5TmFtZSA9ICIiOworCQkKKwkJcHVibGljIExpc3Q8RG91YmxlPiByZWxhdGl2ZVZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQlwdWJsaWMgU2VyaWVzIGxpbmVTZXJpZXMgPSBudWxsOworCQlwcml2YXRlIGJvb2xlYW4gdmlzaWJsZSA9IHRydWU7CisJCXByaXZhdGUgU2VyaWVzRGVmaW5pdGlvbiBzZFkgPSBudWxsOworCQlwcml2YXRlIGludCBzZXJpZXNJbmRleCA9IDA7CisJCXByaXZhdGUgYm9vbGVhbiBvdmVybGF5TW9kZSA9IGZhbHNlOworCQkKKwkJCisJCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKKwkJCXJldHVybiB2aXNpYmxlOworCQl9CisJCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiBzdGF0ZSkgeworCQkJdmlzaWJsZSA9IHN0YXRlOworCQl9CisJCQorCQlwdWJsaWMgdm9pZCB0b2dnbGVWaXNpYmxlKCkgeworCQkJdmlzaWJsZSA9ICF2aXNpYmxlOworCQl9CisKKwkJLyoqCisJCSAqIAorCQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCisJCSAqIEBwYXJhbSBpbmRleAorCQkgKiBAcGFyYW0gb3ZlcmxheSAKKwkJICovCisJCXB1YmxpYyBEYXRhU2VyaWVzKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBpbmRleCwgYm9vbGVhbiBvdmVybGF5KSB7CisJCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKwkJCXRoaXMuc2VyaWVzSW5kZXggPSBpbmRleDsKKwkJCXRoaXMub3ZlcmxheU1vZGUgPSBvdmVybGF5OworCQkJcmVsYXRpdmVWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCXJlbGF0aXZlVmFsdWVzLmFkZChuZXcgRG91YmxlKDAuMCkpOworCQkJYWRkTGluZVNlcmllcyhwcm9wZXJ0eU5hbWUpOworCQl9CisJCQorCQlwdWJsaWMgdm9pZCBhZGRWYWx1ZShEb3VibGUgdmFsKSB7CisJCQlpZihyZWxhdGl2ZVZhbHVlcz09bnVsbCkgcmVsYXRpdmVWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCXJlbGF0aXZlVmFsdWVzLmFkZCh2YWwpOworCQl9CisJCQorCQkvKioKKwkJICogQHBhcmFtIHByb3BlcnR5TmFtZQorCQkgKiAKKwkJICovCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisJCXB1YmxpYyB2b2lkIGFkZExpbmVTZXJpZXMoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQkJCisJCQlmaW5hbCBOdW1iZXJEYXRhU2V0IG9ydGhvVmFsdWVzID0gTnVtYmVyRGF0YVNldEltcGwKKwkJCQkJLmNyZWF0ZShyZWxhdGl2ZVZhbHVlcyk7CisJCQlpZihsaW5lU2VyaWVzID09IG51bGwpIHsKKwkJCQlsaW5lU2VyaWVzID0gU2NhdHRlclNlcmllc0ltcGwuY3JlYXRlKCk7CisJCQkJLyoKKwkJCQkgKiAKKwkJCQkgKiBCYXIgY2hhcnQgc3R5bGUgaXMgdG9vIHNsb3cgZm9yIGdlbmVyYXRpb24gb2YgYSBmaWxsCisJCQkJICogaWYgd2Ugd2FudCBhIGZpbGwgd2UgY2FuIHRyeSB1c2luZyB0aGUgZGlmZmVyZW5jZSBwbG90CisJCQkJICogdG8gYSBzdHJhaWdodCBsaW5lIGF0IHk9MAorCQkJCSAqIAorCQkJCQorCQkJCWlmKHByb3BlcnR5TmFtZS5pbmRleE9mKCIqIik+PTEpIHsKKwkJCQkJLy8gYmFyc2VyaWVzIG1ldGhvZHMKKwkJCQkJbGluZVNlcmllcyA9IChCYXJTZXJpZXMpIEJhclNlcmllc0ltcGwuY3JlYXRlKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbGluZVNlcmllcyA9IChTY2F0dGVyU2VyaWVzKSBTY2F0dGVyU2VyaWVzSW1wbC5jcmVhdGUoKTsKKwkJCQl9CisJCQkJCisJCQkJKgorCQkJCSovCisJCQl9IC8vIGlmIGxpbmVTZXJpZXM9PW51bGwKKwkJCWxpbmVTZXJpZXMuc2V0RGF0YVNldChvcnRob1ZhbHVlcyk7CisJCQkoKExpbmVTZXJpZXMpIGxpbmVTZXJpZXMpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCSgoTGluZVNlcmllcykgbGluZVNlcmllcykuZ2V0TWFya2VycygpLmNsZWFyKCk7CisJCQkKKwkJCS8vIEFzc2lnbiB0aGUgbGluZSBjb2xvcgorCQkJLy8gYmFzZWQgb24gc2VsZWN0ZWQgcHJvcGVydHkuIERlZmF1bHQgaXMgQmx1ZQorCQkJc2V0Q29sb3JEZWZzKHByb3BlcnR5TmFtZSk7CisJCQkvLyBJZiB0aGlzIGlzIHRoZSAic2VsZWN0ZWQiIHJlZ2lvbiBvZiBhIGdyYXBoIHNldCB0aGUgbWFya2VyIHR5cGUKKwkJCisJCQkvLyB0aGUgc2VyaWVzIGRlZgorCQkJc2RZID0gU2VyaWVzRGVmaW5pdGlvbkltcGwuY3JlYXRlKCk7CisJCQlzZFkuZ2V0U2VyaWVzUGFsZXR0ZSgpLnVwZGF0ZSgtMik7CisJCQlzZFkuZ2V0U2VyaWVzKCkuYWRkKGxpbmVTZXJpZXMpOworCQkJeUF4aXNQcmltYXJ5LmdldFNlcmllc0RlZmluaXRpb25zKCkuYWRkKHNkWSk7CisJCQkKKwkJCXJldHVybjsKKwkJfS8vIGFkZExpbmVTZXJpZXMKKwkJCisJCS8qKiAKKwkJICogaW4gcmVzcG9uc2UgdG8gdXNlciBhY3Rpb24gdGVtcG9yYXJpbHkgcmVtb3ZlIHRoZSBsaW5lIHNlcmllcyBmcm9tIHRoZSBncmFwaAorCQkgKi8KKwkJcHVibGljIHZvaWQgaGlkZSgpIHsKKwkJCWxpbmVTZXJpZXMuc2V0VmlzaWJsZShmYWxzZSk7CisJCQl2aXNpYmxlID0gZmFsc2U7CisJCX0vLyBoaWRlCisJCQorCQkvKiogCisJCSAqIGluIHJlc3BvbnNlIHRvIHVzZXIgYWN0aW9uIGFkZCBiYWNrIHRoZSBsaW5lIHNlcmllcyB0byB0aGUgZ3JhcGgKKwkJICovCisJCXB1YmxpYyB2b2lkIHNob3coKSB7CisJCQlsaW5lU2VyaWVzLnNldFZpc2libGUodHJ1ZSk7CisJCQl2aXNpYmxlID0gdHJ1ZTsKKwkJfS8vIHNob3cKKwkJCisKKwkJLyoqCisJCSAqIFNldHMgdGhlIGNvbG9ycyBmb3IgYSBuIGFycmF5IG9mIExpbmVTZXJpZXMgZ2l2ZW4gdGhlIHByb3BlcnR5IHRvIFBsb3QKKwkJICogZm9yIGVhY2guIFRyeSB0byBzZXQgY29sb3IgZnJvbSB0aGUgcHJlZmVyZW5jZXMgKGlmIHNwZWNpZmllZCBmb3IgdGhhdAorCQkgKiBwcm9wZXJ0eSkgb3RoZXJ3aXNlIHNldHMgbGluZSBjb2xvciB0byBibHVlLgorCQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIAorCQkgKgorCQkgKi8KKwkJcHVibGljIHZvaWQgc2V0Q29sb3JEZWZzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJCS8vIHRoZSBkZWZhdWx0IGxpbmUgY29sb3IKKworCQkJLy8gaWYgcG9zc2libGUgZ2V0IGNvbG9yIGZyb20gcHJlZmVyZW5jZXMKKwkJCWZpbmFsIE1hcDxTdHJpbmcsIENvbG9yPiBjb2xvck1hcCA9IFZpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZS5nZXRDb2xvck1hcHBpbmcoKTsKKworCQkJLy8gZGVmYXVsdCBjb2xvcgorCQkJaW50IGNvbG9ySW5kZXggPSBzZXJpZXNJbmRleCAlIGNvbG9yRGVmYXVsdC5sZW5ndGg7CisJCQlDb2xvckRlZmluaXRpb24gY29sb3IgPSBjb2xvckRlZmF1bHRbY29sb3JJbmRleF07CisKKwkJCS8vIHByZWZlcnJlZCBjb2xvciBieSBuYW1lCisJCQlTdHJpbmcga2V5ID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZygwLDEpOworCQkJCisJCQlpZiAoY29sb3JNYXAuY29udGFpbnNLZXkoa2V5KSkgeworCQkJCWZpbmFsIENvbG9yIGMgPSBjb2xvck1hcC5nZXQoa2V5KTsKKwkJCQljb2xvciA9IENvbG9yRGVmaW5pdGlvbkltcGwuY3JlYXRlKGMuZ2V0UmVkKCksIGMuZ2V0R3JlZW4oKSwgYy5nZXRCbHVlKCkpOworCQkJfQorCQkJCisJCQl0aGlzLmxpbmVTZXJpZXMuc2V0U2VyaWVzSWRlbnRpZmllcihwcm9wZXJ0eU5hbWUpOworCQkJaWYgKG92ZXJsYXlNb2RlKSB7CisJCQkJaWYocHJvcGVydHlOYW1lLmluZGV4T2YoIioiKT49MSkgeworCQkJCQkvLyBiYXJzZXJpZXMgbWV0aG9kcworCQkJCQkoKExpbmVTZXJpZXMpdGhpcy5saW5lU2VyaWVzKS5nZXRMaW5lQXR0cmlidXRlcygpLnNldENvbG9yKGNvbG9yKTsKKwkJCQl9IGVsc2UgeworCQkJCQkoKExpbmVTZXJpZXMpdGhpcy5saW5lU2VyaWVzKS5nZXRMaW5lQXR0cmlidXRlcygpLnNldENvbG9yKENvbG9yRGVmaW5pdGlvbkltcGwuR1JFWSgpKTsKKwkJCQkJKChMaW5lU2VyaWVzKXRoaXMubGluZVNlcmllcykuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRTdHlsZShMaW5lU3R5bGUuRE9UVEVEX0xJVEVSQUwpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJKChMaW5lU2VyaWVzKXRoaXMubGluZVNlcmllcykuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRDb2xvcihjb2xvcik7CisJCQl9CisJCQkKKwkJCQorCQl9Ly8gZ2V0Q29sb3JEZWZzCisKKwkJLyoqCisJCSAqIGxlbmd0aCBvZiB0aGUgc2VyaWVzCisJCSAqIEByZXR1cm4gbnVtYmVyIG9mIGRhdGEgcG9pbnRzCisJCSAqLworCQlwdWJsaWMgaW50IGdldERhdGFTaXplKCkgeworCQkJcmV0dXJuIHJlbGF0aXZlVmFsdWVzLnNpemUoKTsKKwkJfQorCQkvLyBBY2Nlc3NvcnMKKwkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7CisJCQlyZXR1cm4gcHJvcGVydHlOYW1lOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJCXRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworCQl9CisKKwkJcHVibGljIExpc3Q8RG91YmxlPiBnZXRSZWxhdGl2ZVZhbHVlcygpIHsKKwkJCXJldHVybiByZWxhdGl2ZVZhbHVlczsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFJlbGF0aXZlVmFsdWVzKExpc3Q8RG91YmxlPiByZWxhdGl2ZVZhbHVlcykgeworCQkJdGhpcy5yZWxhdGl2ZVZhbHVlcyA9IHJlbGF0aXZlVmFsdWVzOworCQl9CisKKwkJCisKKwkJcHVibGljIHZvaWQgc2V0TGluZVNlcmllcyhMaW5lU2VyaWVzIGxpbmVTZXJpZXMpIHsKKwkJCXRoaXMubGluZVNlcmllcyA9IGxpbmVTZXJpZXM7CisJCX0KKwl9Ly8gRGF0YVNlcmllcworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCit9IC8vIFRpbWVTZXJpZXNDYW52YXMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2FuYWx5c2lzL3ZpZXdzL1hZU2VyaWVzQ2FudmFzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9YWVNlcmllc0NhbnZhcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMDViZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9YWVNlcmllc0NhbnZhcy5qYXZhCkBAIC0wLDAgKzEsMTE2MyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMudmlld3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQuZGV2aWNlLklEZXZpY2VSZW5kZXJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmV4Y2VwdGlvbi5DaGFydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmZhY3RvcnkuR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuQ2hhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5DaGFydFdpdGhBeGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkFuY2hvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5BeGlzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5Cb3VuZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuQ29sb3JEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLkludGVyc2VjdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuTGluZUF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuTGluZVN0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLk1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5NYXJrZXJUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLlBvc2l0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLlRpY2tTdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmF0dHJpYnV0ZS5pbXBsLkJvdW5kc0ltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5hdHRyaWJ1dGUuaW1wbC5Db2xvckRlZmluaXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuYXR0cmlidXRlLmltcGwuTWFya2VySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmNvbXBvbmVudC5BeGlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuY29tcG9uZW50LlNlcmllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmNvbXBvbmVudC5pbXBsLlNlcmllc0ltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5kYXRhLk51bWJlckRhdGFTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5kYXRhLlNlcmllc0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5kYXRhLmltcGwuTnVtYmVyRGF0YUVsZW1lbnRJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuZGF0YS5pbXBsLk51bWJlckRhdGFTZXRJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuZGF0YS5pbXBsLlNlcmllc0RlZmluaXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY2hhcnQubW9kZWwuaW1wbC5DaGFydFdpdGhBeGVzSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLmxheW91dC5MZWdlbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jaGFydC5tb2RlbC5sYXlvdXQuUGxvdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLnR5cGUuU2NhdHRlclNlcmllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0Lm1vZGVsLnR5cGUuaW1wbC5TY2F0dGVyU2VyaWVzSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LnV0aWwuUGx1Z2luU2V0dGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnByZWZlcmVuY2VzLlZpc3VhbGl6YXRpb25QcmVmZXJlbmNlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7CisKKy8qKgorICogVGltZVNlcmllc0NhbnZhcyBpcyBhIHN1YmNsYXNzIG9mIHtAbGluayBDYW52YXN9IHN1aXRhYmxlIGZvciBjaGFydCBkcmF3aW5ncy4KKyAqLworcHVibGljIGNsYXNzIFhZU2VyaWVzQ2FudmFzIGV4dGVuZHMgQ2FudmFzIHsKKworCXByb3RlY3RlZCBJRGV2aWNlUmVuZGVyZXIgaWRyID0gbnVsbDsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHtAbGluayBDaGFydH0gdGhhdCBwbG90cyB0aGUgcmVsYXRpdmUgdmFsdWVzLgorCSAqLworCXByb3RlY3RlZCBDaGFydCBjbSA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgcHJvdmlkZXIgb2YgcmVsYXRpdmUgdmFsdWVzLgorCSAqLworCS8vcHJpdmF0ZSBSZWxhdGl2ZVZhbHVlSGlzdG9yeVByb3ZpZGVyIHJ2aHA7CisKKwlwcml2YXRlIEFuYWx5c2lzQ29udHJvbCBjb250cm9sID0gbnVsbDsKKwkKKwkvKioKKwkgKiB0aGUgaW5kZXggb2YgdGhpcyBDaGFydAorCSAqLworCXByb3RlY3RlZCBpbnQgY2hhcnRJbmRleCA9IDA7CisJCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9LRVlfUFJFRklYID0gIlhZIjsKKwkKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEtleSA9IERFRkFVTFRfS0VZX1BSRUZJWDsKKworCS8qKgorCSAqIHNvbWUgZXh0cmEgY29sb3JzCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXVtdIGNvbG9yRGVmYXVsdCA9IHsKKwkJCQkJCQkJCQkJCQl7MCwgMCwgMjU1fSwgCQkvL0JsdWUKKwkJCQkJCQkJCQkJCQl7MjU1LCAwLCAwfSwgCQkvL1JlZAorCQkJCQkJCQkJCQkJCXswLCAyNTUsIDB9LCAJCS8vR3JlZW4KKwkJCQkJCQkJCQkJCQl7MjU1LCAyNTUsIDB9LCAJCS8vWWVsbG93CisJCQkJCQkJCQkJCQkJezAsIDAsIDB9LCAJCQkvL0JsYWNrIAorCQkJCQkJCQkJCQkJCXsxMjcsIDEyNywgMTI3fSwgCS8vR3JleQorCQkJCQkJCQkJCQkJCXsyNTUsIDI1NSwgMjU1fSwJLy9DeWFuCisJCQkJCQkJCQkJCQkJezI1NSwgMTk3LCA0MX0JCS8vT3JhbmdlIAorCQkJCQkJCQkJCQkJCX07CisJCisJLyoqCisJICogdXNlZCB0byBpbmRleCB0aGUgbGluZSBzZXJpZXMgc28gd2UgY2FuIHN0ZXAgdGhyb3VnaCBkZWZhdWx0IGNvbG9ycworCSAqIHdoZW4gYSB1c2VyIGN1c3RvbSBjb2xvciBpcyBub3QgeWV0IGFzc2lnbmVkCisJICovCisJcHJpdmF0ZSBpbnQgc2VyaWVzQ291bnQgID0gMDsKKwkKKworCS8qKgorCSAqIEEgY29udGV4dCBtZW51IGZvciB0aGlzIHZpZXcKKwkgKi8KKwlNZW51IHBvcFVwTWVudSA9IG51bGw7CisJCisJLyoqCisJICogc2V0IHkgYXhpcyB0byBhIGxpbmVhciBzY2FsZQorCSAqLworCXByaXZhdGUgTGluZWFyU2NhbGVBY3Rpb24gbGluZWFyVGltZUFjdGlvbjsKKwkvKioKKwkgKiBzZXQgeSBheGlzIHRvIGEgbG9nIHNjYWxlCisJICovCisJcHJpdmF0ZSBMb2dTY2FsZUFjdGlvbiBsb2dUaW1lQWN0aW9uOworCXByb3RlY3RlZCBib29sZWFuIHVzZUxpbmVhclRpbWVTY2FsZSA9IHRydWU7CisJCisKKwkvKioKKwkgKiBzaG93IHRoZSBsZWdlbmQgKHRydWUgYnkgZGVmYXVsdCkKKwkgKi8KKwlwcml2YXRlIExlZ2VuZFZpZXdBY3Rpb24gdmlld0xlZ2VuZDsKKworCS8qKgorCSAqIGhpZGUgdGhlIGxlZ2VuZCAKKwkgKi8KKwlwcml2YXRlIExlZ2VuZEhpZGVBY3Rpb24gaGlkZUxlZ2VuZDsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93TGVnZW5kID0gdHJ1ZTsKKworCXByb3RlY3RlZCBMZWdlbmQgbGVnZW5kID0gbnVsbDsKKwkKKworCS8qKgorCSAqIHRoaXMgaXMgYSBtYXAgb2YgdGhlIERhdGFYWVNlcmllcyBvYmplY3QgKGtleWVkIGJ5IHByb3BlcnR5IG5hbWUpCisJICovCisJcHJvdGVjdGVkIGZpbmFsIE1hcDxTdHJpbmcsRGF0YVhZU2VyaWVzPiBkYXRhU2VyaWVzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLERhdGFYWVNlcmllcz4oKTsKKworCS8qKgorCSAqIENoYXJ0IGdlbmVyYXRvciBpbnN0YW5jZSAocmVmZXJlbmNlIHRvIGEgc2luZ2xldG9uKQorCSAqLworCUdlbmVyYXRvciBncjsKKworCUF4aXMgeUF4aXNQcmltYXJ5OworCUF4aXMgeEF4aXNQcmltYXJ5OworCS8qKgorCSAqIHRoZSBtYXhZIHZhbHVlIGZvciBzY2FsaW5nCisJICovCisJZG91YmxlIG1heFkgPSBEb3VibGUuTUlOX1ZBTFVFOworCQorCS8qKgorCSAqIHRoZSBtYXhZIHZhbHVlIGZvciBzY2FsaW5nCisJICovCisJZG91YmxlIG1heFggPSBEb3VibGUuTUlOX1ZBTFVFOworCisJLyoqCisJICogdGhlIG1pblkgdmFsdWUgZm9yIHNjYWxpbmcKKwkgKi8KKwlwcml2YXRlIGRvdWJsZSBtaW5ZID0gRG91YmxlLk1BWF9WQUxVRTsKKwkKKwkvKioKKwkgKiB0aGUgbWluWCB2YWx1ZSBmb3Igc2NhbGluZworCSAqLworCXByaXZhdGUgZG91YmxlIG1pblggPSBEb3VibGUuTUFYX1ZBTFVFOworCQorCQorCS8qKgorCSAqIExhYmVsIGZvciBsaW5lIHNlcmllcyBMRUdFTkQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIE9yZGluYXRlX0xFR0VORCA9ICJZIjsKKwkKKwkvKioKKwkgKiBMYWJlbCBmb3IgbGluZSBzZXJpZXMgWSBheGlzIGxhYmVsCisJICoqLworCXB1YmxpYyBTdHJpbmcgT3JkaW5hdGVfQVhJUyA9ICJZIjsKKwkKKwkvKiogCisJICogY3VzdG9taXphYmxlIGNvbG9yIGRlZmluaXRpb25zCisJICovCisJcHJvdGVjdGVkIENvbG9yRGVmaW5pdGlvbiBmb3JlR3JvdW5kID0gQ29sb3JEZWZpbml0aW9uSW1wbC5XSElURSgpOworCXByaXZhdGUgQ29sb3JEZWZpbml0aW9uIGJhY2tncm91bmRHcm91bmQgPSBDb2xvckRlZmluaXRpb25JbXBsLkJMQUNLKCk7CisJcHJpdmF0ZSBDb2xvckRlZmluaXRpb24gZnJhbWVDb2xvciA9IENvbG9yRGVmaW5pdGlvbkltcGwuY3JlYXRlKDE4MCwgMTgwLCAyMDApOworCisJSW1hZ2UgaW1nQ2hhcnQgPSBudWxsOworCQorCS8qKgorCSAqIFRoaXMgQ29uc3RydWN0b3IgaXMgdXNlZCB3aGVuIHdlIHdhbnQgdG8gcGxhY2UgdGhlIHRpbWUgc2VyaWVzIGluIGEgY29udGFpbmVyCisJICogd2hpY2ggaXMgYSBzdWIgY29tcG9uZW50IG9mIHRoZSBhY3R1YWwgQW5hbHlzaXNDb250cm9sCisJICogQHBhcmFtIGFuYWx5c2lzQ29udHJvbCAKKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50ICB0aGUgU1dUIHBhcmVudCBvZiB0aGUge0BsaW5rIFdpZGdldH0KKwkgKiBAcGFyYW0gb3JkaW5hdGVTdHJpbmcgCisJICogQHBhcmFtIHlBeGlzTGFiZWwgCisJICogQHBhcmFtIGZvcmVncm91bmQgCisJICogQHBhcmFtIGJhY2tncm91bmQgCisJICogQHBhcmFtIGZyYW1lY29sb3IgCisJICogQHBhcmFtIGNoYXJ0SW5kZXggdGhlIGluZGV4IG9mIHRoaXMgY2hhcnQgKDAgaWYgb25seSBvbmUpCisJICogIAorCSAqLworCXB1YmxpYyBYWVNlcmllc0NhbnZhcyhmaW5hbCBBbmFseXNpc0NvbnRyb2wgYW5hbHlzaXNDb250cm9sLCBmaW5hbCBDb21wb3NpdGUgcGFyZW50LCAKKwkJCWZpbmFsIFN0cmluZyBvcmRpbmF0ZVN0cmluZywgCisJCQlmaW5hbCBTdHJpbmcgeUF4aXNMYWJlbCwgCisJCQlDb2xvckRlZmluaXRpb24gZm9yZWdyb3VuZCwKKwkJCUNvbG9yRGVmaW5pdGlvbiBiYWNrZ3JvdW5kLAorCQkJQ29sb3JEZWZpbml0aW9uIGZyYW1lY29sb3IsCisJCQlpbnQgY2hhcnRJbmRleCkgeworCQlzdXBlcihwYXJlbnQsIFNXVC5ET1VCTEVfQlVGRkVSRUQgfCBTV1QuQk9SREVSKTsKKwkJT3JkaW5hdGVfTEVHRU5EID0gb3JkaW5hdGVTdHJpbmc7CisJCU9yZGluYXRlX0FYSVMgPSB5QXhpc0xhYmVsOworCQlkZWZhdWx0S2V5ID0gREVGQVVMVF9LRVlfUFJFRklYK2NoYXJ0SW5kZXg7CisJCWZvcmVHcm91bmQgCQkJPSBmb3JlZ3JvdW5kOworCQliYWNrZ3JvdW5kR3JvdW5kIAk9IGJhY2tncm91bmQ7CisJCWZyYW1lQ29sb3IgCQkJPSBmcmFtZWNvbG9yOworCQl0aGlzLmNoYXJ0SW5kZXggPSBjaGFydEluZGV4OworCQkKKwkJZ3IgPSBHZW5lcmF0b3IuaW5zdGFuY2UoKTsKKworCQl0cnkgeworCQkJaWRyID0gUGx1Z2luU2V0dGluZ3MuaW5zdGFuY2UoKS5nZXREZXZpY2UoImR2LlNXVCIpOyAvLyROT04tTkxTLTEkCQkJCisJCX0gY2F0Y2ggKGZpbmFsIENoYXJ0RXhjZXB0aW9uIHBleCkgeworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJQcm9ibGVtIGluaXRpYWxpemluZyBjaGFydCIsIHBleCk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybjsKKwkJfQorCisJCWNvbnRyb2wgPSBhbmFseXNpc0NvbnRyb2w7CisKKwkJCisJCWNtID0gY3JlYXRlU2ltcGxlTGluZUNoYXJ0KGRhdGFTZXJpZXNNYXAsIE1lc3NhZ2VzLmdldFN0cmluZygiQ0MudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCisJCXJlc2V0RGF0YSgpOworCQlhZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKGZpbmFsIFBhaW50RXZlbnQgcGUpIHsKKworCQkJCWZpbmFsIENvbXBvc2l0ZSBzb3VyY2UgPSAoQ29tcG9zaXRlKSBwZS5nZXRTb3VyY2UoKTsKKwkJCQlmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlIGQgPSBzb3VyY2UKKwkJCQkJCS5nZXRDbGllbnRBcmVhKCk7CisKKwkJCQlpZihpbWdDaGFydCAhPSBudWxsKSBpbWdDaGFydC5kaXNwb3NlKCk7CisJCQkJaW1nQ2hhcnQgPSBuZXcgSW1hZ2Uoc291cmNlLmdldERpc3BsYXkoKSwgZCk7CisJCQkJaWRyLnNldFByb3BlcnR5KElEZXZpY2VSZW5kZXJlci5HUkFQSElDU19DT05URVhULCBuZXcgR0MoCisJCQkJCQlpbWdDaGFydCkpOworCQkJCWZpbmFsIEJvdW5kcyBib3VuZHMgPSBCb3VuZHNJbXBsLmNyZWF0ZShkLngsIGQueSwgZC53aWR0aCwKKwkJCQkJCWQuaGVpZ2h0KTsKKwkJCQlib3VuZHMuc2NhbGUoNzJkIC8gaWRyLmdldERpc3BsYXlTZXJ2ZXIoKS5nZXREcGlSZXNvbHV0aW9uKCkpOworCQkJCS8vIEJPVU5EUyBNVVNUIEJFIFNQRUNJRklFRCBJTiBQT0lOVFMKKworCQkJCXRyeSB7CisJCQkJCWdyLnJlbmRlcihpZHIsIGdyLmJ1aWxkKGlkci5nZXREaXNwbGF5U2VydmVyKCksIGNtLCBib3VuZHMsCisJCQkJCQkJbnVsbCwgbnVsbCwgbnVsbCkpOworCQkJCQlwZS5nYy5kcmF3SW1hZ2UoaW1nQ2hhcnQsIGQueCwgZC55KTsKKwkJCQl9IGNhdGNoIChmaW5hbCBDaGFydEV4Y2VwdGlvbiBjZSkgeworCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlByb2JsZW0gcmVuZGVyaW5nIGNoYXJ0IiwgY2UpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfSAvLyBwYWludENvbnRyb2wKKwkJfSAvLyBQYWludExpc3RlbmVyCisJCSk7CisJCQorCQkvL0NyZWF0ZSBhIGNvbnRleHQgbWVudSBmb3IgdGhlIGNhbnZhcworCQljcmVhdGVDb250ZXh0TWVudSh0aGlzKTsKKwkJCisKKwl9IC8vIFRpbWVTZXJpZXNDYW52YXMKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50ICB0aGUgU1dUIHBhcmVudCBvZiB0aGUge0BsaW5rIFdpZGdldH0KKwkgKiBAcGFyYW0gb3JkaW5hdGVTdHJpbmcgCisJICogQHBhcmFtIHlBeGlzTGFiZWwgCisJICogQHBhcmFtIGZvcmVncm91bmQgCisJICogQHBhcmFtIGJhY2tncm91bmQgCisJICogQHBhcmFtIGZyYW1lY29sb3IgCisJICogQHBhcmFtIGNoYXJ0SW5kZXggdGhlIGluZGV4IG9mIHRoaXMgY2hhcnQgKDAgaWYgb25seSBvbmUpCisJICogIAorCSAqLworCXB1YmxpYyBYWVNlcmllc0NhbnZhcyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCAKKwkJCWZpbmFsIFN0cmluZyBvcmRpbmF0ZVN0cmluZywgCisJCQlmaW5hbCBTdHJpbmcgeUF4aXNMYWJlbCwgCisJCQlDb2xvckRlZmluaXRpb24gZm9yZWdyb3VuZCwKKwkJCUNvbG9yRGVmaW5pdGlvbiBiYWNrZ3JvdW5kLAorCQkJQ29sb3JEZWZpbml0aW9uIGZyYW1lY29sb3IsCisJCQlpbnQgY2hhcnRJbmRleCkgeworCQlzdXBlcihwYXJlbnQsIFNXVC5ET1VCTEVfQlVGRkVSRUQgfCBTV1QuQk9SREVSKTsKKwkJT3JkaW5hdGVfTEVHRU5EID0gb3JkaW5hdGVTdHJpbmc7CisJCU9yZGluYXRlX0FYSVMgPSB5QXhpc0xhYmVsOworCQlkZWZhdWx0S2V5ID0gREVGQVVMVF9LRVlfUFJFRklYK2NoYXJ0SW5kZXg7CisJCWZvcmVHcm91bmQgCQkJPSBmb3JlZ3JvdW5kOworCQliYWNrZ3JvdW5kR3JvdW5kIAk9IGJhY2tncm91bmQ7CisJCWZyYW1lQ29sb3IgCQkJPSBmcmFtZWNvbG9yOworCQl0aGlzLmNoYXJ0SW5kZXggPSBjaGFydEluZGV4OworCQkKKwkJZ3IgPSBHZW5lcmF0b3IuaW5zdGFuY2UoKTsKKworCQl0cnkgeworCQkJaWRyID0gUGx1Z2luU2V0dGluZ3MuaW5zdGFuY2UoKS5nZXREZXZpY2UoImR2LlNXVCIpOyAvLyROT04tTkxTLTEkCQkJCisJCX0gY2F0Y2ggKGZpbmFsIENoYXJ0RXhjZXB0aW9uIHBleCkgeworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJQcm9ibGVtIGluaXRpYWxpemluZyBjaGFydCIsIHBleCk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybjsKKwkJfQorCisJCWNvbnRyb2wgPSAoQW5hbHlzaXNDb250cm9sKSBwYXJlbnQ7CisKKwkJCisJCWNtID0gY3JlYXRlU2ltcGxlTGluZUNoYXJ0KGRhdGFTZXJpZXNNYXAsIE1lc3NhZ2VzCisJCQkJLmdldFN0cmluZygiQ0MudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCisJCXJlc2V0RGF0YSgpOworCQlhZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKGZpbmFsIFBhaW50RXZlbnQgcGUpIHsKKworCQkJCWZpbmFsIENvbXBvc2l0ZSBzb3VyY2UgPSAoQ29tcG9zaXRlKSBwZS5nZXRTb3VyY2UoKTsKKwkJCQlmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlIGQgPSBzb3VyY2UKKwkJCQkJCS5nZXRDbGllbnRBcmVhKCk7CisKKwkJCQlpZihpbWdDaGFydCAhPSBudWxsKSBpbWdDaGFydC5kaXNwb3NlKCk7CisJCQkJaW1nQ2hhcnQgPSBuZXcgSW1hZ2Uoc291cmNlLmdldERpc3BsYXkoKSwgZCk7CisJCQkJaWRyLnNldFByb3BlcnR5KElEZXZpY2VSZW5kZXJlci5HUkFQSElDU19DT05URVhULCBuZXcgR0MoCisJCQkJCQlpbWdDaGFydCkpOworCQkJCWZpbmFsIEJvdW5kcyBib3VuZHMgPSBCb3VuZHNJbXBsLmNyZWF0ZShkLngsIGQueSwgZC53aWR0aCwKKwkJCQkJCWQuaGVpZ2h0KTsKKwkJCQlib3VuZHMuc2NhbGUoNzJkIC8gaWRyLmdldERpc3BsYXlTZXJ2ZXIoKS5nZXREcGlSZXNvbHV0aW9uKCkpOworCQkJCS8vIEJPVU5EUyBNVVNUIEJFIFNQRUNJRklFRCBJTiBQT0lOVFMKKworCQkJCXRyeSB7CisJCQkJCWdyLnJlbmRlcihpZHIsIGdyLmJ1aWxkKGlkci5nZXREaXNwbGF5U2VydmVyKCksIGNtLCBib3VuZHMsCisJCQkJCQkJbnVsbCwgbnVsbCwgbnVsbCkpOworCQkJCQlwZS5nYy5kcmF3SW1hZ2UoaW1nQ2hhcnQsIGQueCwgZC55KTsKKwkJCQl9IGNhdGNoIChmaW5hbCBDaGFydEV4Y2VwdGlvbiBjZSkgeworCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIlByb2JsZW0gcmVuZGVyaW5nIGNoYXJ0IiwgY2UpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfSAvLyBwYWludENvbnRyb2wKKwkJfSAvLyBQYWludExpc3RlbmVyCisJCSk7CisJCQorCQkvL0NyZWF0ZSBhIGNvbnRleHQgbWVudSBmb3IgdGhlIGNhbnZhcworCQljcmVhdGVDb250ZXh0TWVudSh0aGlzKTsKKwkJCisKKwl9IC8vIFRpbWVTZXJpZXNDYW52YXMKKworCQorCQorCS8qKgorCSAqIFRoZSBtZXRob2Qgd2hpY2ggZ2V0cyB0aGUge0BsaW5rIFhZU2VyaWVzQ2FudmFzfScgcmVwb3J0cyBsaXN0LCBhbmQKKwkgKiBkcmF3cyBpdCBvbiB0aGUge0BsaW5rIFhZU2VyaWVzQ2FudmFzfS4KKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBkcmF3KCkgeworCisJCQorCQkKKwkJCisJCXJlc2V0RGF0YSgpOworCQkKKwkJbWF4WSA9IC0xLjA7CisJCW1pblkgPSAwLjA7CisJCW1heFggPSAtMS4wOworCQltaW5YID0gMC4wOworCQlkb3VibGUgYWRqdXN0ZWRNYXhZID0gMC4wOworCQlkb3VibGUgYWRqdXN0ZWRNYXhYID0gMC4wOworCQkKKwkJLy8gZ2V0IHRoZSB4LHkgZGF0YSAoaT0wKQorCQkvLyBhbmQgdGhlIHgsIGZpdFkgZGF0YSAoaT0xKQorCQlmb3IoaW50IGkgPSAwOyBpIDw9IDE7IGkgKyspIHsKKwkJCQorCQkJLy8gb25lIFhZIGRhdGEgc2V0IHBlciBjaGFydAorCQkJLy9mb3IgKGludCBpID0gMDsgaSA8IG1heExpbmVzOyBpICsrKSB7CisJCQlTdHJpbmcgcHJvcGVydHkgPSAiWFkiK2NoYXJ0SW5kZXg7CisJCQlpZihpPT0xKSBwcm9wZXJ0eSA9ICJGSVQiK2NoYXJ0SW5kZXg7CisJCQkKKwkJCWlmKCFkYXRhU2VyaWVzTWFwLmNvbnRhaW5zS2V5KHByb3BlcnR5KSkgeworCQkJCS8vIG5ldyBwcm9wZXJ0eQorCQkJCURhdGFYWVNlcmllcyBzZXJpZXMgPSBuZXcgRGF0YVhZU2VyaWVzKHByb3BlcnR5KTsKKwkJCQlzZXJpZXNDb3VudCArKzsKKwkJCQlkYXRhU2VyaWVzTWFwLnB1dChwcm9wZXJ0eSwgc2VyaWVzKTsKKwkJCX0KKwkJCURhdGFYWVNlcmllcyBzZXJpZXMgPSBkYXRhU2VyaWVzTWFwLmdldChwcm9wZXJ0eSk7CisJCQlpZihzZXJpZXMuaXNWaXNpYmxlKCkpIHsKKwkJCQlzZXJpZXMuc2hvdygpOworCQkJfSBlbHNlIHsKKwkJCQlzZXJpZXMuaGlkZSgpOworCQkJfQorCQkJCisJCQkvLyBHZXQgdGhlIHZhbHVlcyBmb3IgdGhlIHByb3BlcnR5IHRvIGJlIHBsb3R0ZWQKKwkJCWludCBtYXhQb2ludHMgPSAwOworCQkJCisJCQlmaW5hbCBkb3VibGVbXSBkb3VibGVWYWx1ZXNYID0gY29udHJvbC5nZXRWYWx1ZXMoY2hhcnRJbmRleCwoMippKSsyKTsKKwkJCWZpbmFsIGRvdWJsZVtdIGRvdWJsZVZhbHVlc1kgPSBjb250cm9sLmdldFZhbHVlcyhjaGFydEluZGV4LCgyKmkpKzMpOworCQkJCisJCQkvLyB1cGRhdGUgdGhlIG1pbiBtYXggc2NhbGVzCisJCQlmb3IgKGludCBqID0gMDsgaiA8IGRvdWJsZVZhbHVlc1gubGVuZ3RoOyBqKyspIHsJCisJCQkJaWYoZG91YmxlVmFsdWVzWVtqXSA8PSBtaW5ZKSB7CisJCQkJCW1pblkgPSBkb3VibGVWYWx1ZXNZW2pdOworCQkJCQltaW5ZID0gTWF0aC5yb3VuZChtaW5ZKTsKKwkJCQl9CisJCQkJaWYoZG91YmxlVmFsdWVzWFtqXSA8PSBtaW5YKSB7CisJCQkJCW1pblggPSBkb3VibGVWYWx1ZXNYW2pdOworCQkJCQltaW5YID0gTWF0aC5yb3VuZChtaW5YKTsKKwkJCQl9CisJCQkJCisJCQkJaWYoZG91YmxlVmFsdWVzWVtqXSA+PSBtYXhZKSB7CisJCQkJCW1heFkgPSBkb3VibGVWYWx1ZXNZW2pdOworCQkJCQlkb3VibGUgbG9nID0gTWF0aC5mbG9vcihNYXRoLmxvZzEwKG1heFkpKTsKKwkJCQkJYWRqdXN0ZWRNYXhZID0gKE1hdGguY2VpbChtYXhZL01hdGgucG93KDEwLCBsb2cpKSkqTWF0aC5wb3coMTAsIGxvZyk7CisJCQkJICAvLyAgaWYoYWRqdXN0ZWRNYXhZIDw9IDEuMCkgYWRqdXN0ZWRNYXhZID0gMS4wOworCQkJCX0vLyBtYXhZCisJCQkJaWYoZG91YmxlVmFsdWVzWFtqXSA+PSBtYXhYKSB7CisJCQkJCW1heFggPSAxLjAyKmRvdWJsZVZhbHVlc1hbal07CisJCQkJCWRvdWJsZSBsb2cgPSBNYXRoLmZsb29yKE1hdGgubG9nMTAobWF4WCkpOworCQkJCQlhZGp1c3RlZE1heFggPSAoTWF0aC5jZWlsKG1heFgvTWF0aC5wb3coMTAsIGxvZykpKSpNYXRoLnBvdygxMCwgbG9nKTsKKwkJCQkgICAgLy9pZihhZGp1c3RlZE1heFggPD0gMS4wKSBhZGp1c3RlZE1heFggPSAxLjA7CisJCQkJfS8vIG1heFgKKwkJCX0vLyBmb3IgYWxsIHBvaW50cworCQkJCisJCQkKKwkJCQorCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFkanVzdGVkTWF4WCA9ICIrYWRqdXN0ZWRNYXhYKTsKKwkJCXhBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1pbihOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDAuMCkpOworCQkJeEF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWF4KE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoYWRqdXN0ZWRNYXhYKSk7CisJCQlkb3VibGUgc3RlcFggPSBhZGp1c3RlZE1heFggLyAxMC4wOworCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInN0ZXAgPSAiK3N0ZXBYKTsKKwkJCXhBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldFN0ZXAoc3RlcFgpOworCQkJeEF4aXNQcmltYXJ5LnNldFR5cGUoQXhpc1R5cGUuTElORUFSX0xJVEVSQUwpOworCisKKwkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1pbihOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKG1pblkpKTsKKwkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKGFkanVzdGVkTWF4WSkpOworCQkJZG91YmxlIHN0ZXBZID0gYWRqdXN0ZWRNYXhZIC8gMTAuMDsKKwkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldFN0ZXAoc3RlcFkpOworCQkJeUF4aXNQcmltYXJ5LnNldFR5cGUoQXhpc1R5cGUuTElORUFSX0xJVEVSQUwpOworCisJCQkvLyBBbnkgdmFsdWVzPworCQkJaWYgKGRvdWJsZVZhbHVlc1gubGVuZ3RoID4gMCkgeworCQkJCWlmIChtYXhQb2ludHMgPCBkb3VibGVWYWx1ZXNYLmxlbmd0aCkgeworCQkJCQltYXhQb2ludHMgPSBkb3VibGVWYWx1ZXNYLmxlbmd0aDsKKwkJCQl9CisJCQkKKwkJCQlmb3IgKGludCBjeWNsZU51bWJlciA9IDA7IGN5Y2xlTnVtYmVyIDwgZG91YmxlVmFsdWVzWC5sZW5ndGg7IGN5Y2xlTnVtYmVyKyspIHsKKwkJCQkJRG91YmxlIHZhbHVlWCA9IG5ldyBEb3VibGUoZG91YmxlVmFsdWVzWFtjeWNsZU51bWJlcl0pOworCQkJCQlEb3VibGUgdmFsdWVZID0gbmV3IERvdWJsZShkb3VibGVWYWx1ZXNZW2N5Y2xlTnVtYmVyXSk7CisJCQkJCXNlcmllcy5hZGRWYWx1ZSh2YWx1ZVgsdmFsdWVZKTsKKwkJCQl9IC8vIGZvciBjeWNsZU51bWJlcgorCQkJCQorCQkJfSBlbHNlIHsKKwkJCQkvL3Jlc2V0RGF0YSgpOworCQkJfQorCQkJCisJCX0vLyB4eSBkYXRhIGFuZCBmaXQKKwkJCisKKwkJaWYgKCF0aGlzLmlzRGlzcG9zZWQoKSkgeworCQkJcmVkcmF3KCk7CisJCX0KKwkJCisJCQorCQkKKwkJcmV0dXJuOworCX0gLy8gcGFpbnRDb250cm9sCisKKwkvKioKKwkgKiBAcGFyYW0gZGF0YVhZU2VyaWVzTWFwCisJICogICAgICAgICAgICB0aGUge0BsaW5rIExpc3R9IHRoYXQgd2lsbCBjb250YWluIHRoZSByZWxhdGl2ZSB2YWx1ZXMKKwkgKiAgICAgICAgICAgICgwLjAtMS4wKSB0byBwbG90CisJICogQHBhcmFtIHNlcmllc0lkZW50aWZpZXIKKwkgKiAgICAgICAgICAgIHRoZSB0aXRsZSBvZiB0aGUgY2hhcnQKKwkgKiBAcmV0dXJuIGEgPGNvZGU+Q2hhcnQ8L2NvZGU+CisJICovCisJcHVibGljIGZpbmFsIENoYXJ0IGNyZWF0ZVNpbXBsZUxpbmVDaGFydCgKKwkJCWZpbmFsIE1hcDxTdHJpbmcsIERhdGFYWVNlcmllcz4gZGF0YVhZU2VyaWVzTWFwLCBmaW5hbCBTdHJpbmcgc2VyaWVzSWRlbnRpZmllcikgeworCQkKKwkJZmluYWwgQ2hhcnRXaXRoQXhlcyByZXRWYWx1ZSA9IENoYXJ0V2l0aEF4ZXNJbXBsLmNyZWF0ZSgpOworCisJCQorCQkvLyBQbG90CisJCXJldFZhbHVlLmdldEJsb2NrKCkuc2V0QmFja2dyb3VuZChmcmFtZUNvbG9yKTsKKwkJZmluYWwgUGxvdCBwID0gcmV0VmFsdWUuZ2V0UGxvdCgpOworCQlwLmdldENsaWVudEFyZWEoKS5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRHcm91bmQpOworCisJCS8vIFRpdGxlCisJCS8vIGN3YUxpbmUuZ2V0VGl0bGUoICkuZ2V0TGFiZWwoICkuZ2V0Q2FwdGlvbiggKS5zZXRWYWx1ZSggIkxpbmUgQ2hhcnQiCisJCS8vICk7Ly8kTk9OLU5MUy0xJAorCQlyZXRWYWx1ZS5nZXRUaXRsZSgpLnNldFZpc2libGUoZmFsc2UpOworCisJCS8vIExlZ2VuZAorCQlsZWdlbmQgPSByZXRWYWx1ZS5nZXRMZWdlbmQoKTsKKwkJZmluYWwgTGluZUF0dHJpYnV0ZXMgbGlhID0gbGVnZW5kLmdldE91dGxpbmUoKTsKKwkJbGVnZW5kLmdldFRleHQoKS5nZXRGb250KCkuc2V0U2l6ZSg4KTsKKwkJbGlhLnNldFN0eWxlKExpbmVTdHlsZS5TT0xJRF9MSVRFUkFMKTsKKwkJbGVnZW5kLmdldEluc2V0cygpLnNldCgxMCwgNSwgMCwgMCk7CisJCWxlZ2VuZC5nZXRPdXRsaW5lKCkuc2V0VmlzaWJsZShmYWxzZSk7CisJCWxlZ2VuZC5zZXRBbmNob3IoQW5jaG9yLk5PUlRIX0xJVEVSQUwpOworCQlsZWdlbmQuc2V0UG9zaXRpb24oUG9zaXRpb24uQkVMT1dfTElURVJBTCk7CisJCWxlZ2VuZC5nZXRUZXh0KCkuc2V0Q29sb3IoZm9yZUdyb3VuZCk7CisJCWxlZ2VuZC5nZXRPdXRsaW5lKCkuc2V0Q29sb3IoZm9yZUdyb3VuZCk7CisJCQorCQkvLyBjd2FMaW5lLmdldExlZ2VuZCggKS5nZXRUZXh0KCkuZ2V0Rm9udCgpLnNldFNpemUoMTYpOzsKKwkJLy8gY3dhTGluZS5nZXRMZWdlbmQoICkuc2V0VmlzaWJsZSggdHJ1ZSApOworCisJCS8vIC8vLy8vLy8vLworCQkvLyBYLUF4aXMKKwkJeEF4aXNQcmltYXJ5ID0gcmV0VmFsdWUuZ2V0UHJpbWFyeUJhc2VBeGVzKClbMF07CisJCXhBeGlzUHJpbWFyeS5zZXRUeXBlKEF4aXNUeXBlLlRFWFRfTElURVJBTCk7CisJCXhBeGlzUHJpbWFyeS5nZXRNYWpvckdyaWQoKS5zZXRUaWNrU3R5bGUoVGlja1N0eWxlLkJFTE9XX0xJVEVSQUwpOworCQl4QXhpc1ByaW1hcnkuZ2V0T3JpZ2luKCkuc2V0VHlwZShJbnRlcnNlY3Rpb25UeXBlLlZBTFVFX0xJVEVSQUwpOworCQl4QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJeEF4aXNQcmltYXJ5LmdldFRpdGxlKCkuZ2V0Q2FwdGlvbigpLmdldEZvbnQoKS5zZXRTaXplKDkpOworCQl4QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5nZXRDYXB0aW9uKCkuc2V0Q29sb3IoZm9yZUdyb3VuZCk7CisJCXhBeGlzUHJpbWFyeS5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKworCQkvLyAvLy8vLy8vLworCQkvLyBZLUF4aXMKKwkJeUF4aXNQcmltYXJ5ID0gcmV0VmFsdWUuZ2V0UHJpbWFyeU9ydGhvZ29uYWxBeGlzKHhBeGlzUHJpbWFyeSk7CisJCXlBeGlzUHJpbWFyeS5nZXRNYWpvckdyaWQoKS5zZXRUaWNrU3R5bGUoVGlja1N0eWxlLkxFRlRfTElURVJBTCk7CisKKwkJLy8gTnVtYmVyRGF0YVNldFtdIG9ydGhvVmFsdWVzID0gbmV3IE51bWJlckRhdGFTZXRbTUFYX0xJTkVTXTsKKwkJLy8gU2VyaWVzRGVmaW5pdGlvbltdIHNkWSA9IG5ldyBTZXJpZXNEZWZpbml0aW9uW01BWF9MSU5FU107CisKKwkJLy8gZW5kIFktU2VyaWVzCisKKwkJLy8geEF4aXMKKwkJeEF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWluKE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoMC4wKSk7CisJCXhBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDEuMCkpOworCQl4QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRTdGVwKDAuMSk7CisJCXhBeGlzUHJpbWFyeS5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5nZXRGb250KCkuc2V0U2l6ZSg5KTsKKwkJeEF4aXNQcmltYXJ5LmdldExhYmVsKCkuZ2V0Q2FwdGlvbigpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQl4QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5zZXRWaXNpYmxlKHRydWUpOworCQl4QXhpc1ByaW1hcnkuZ2V0VGl0bGUoKS5nZXRDYXB0aW9uKCkuc2V0VmFsdWUoTWVzc2FnZXMuZ2V0U3RyaW5nKCJUUy5USU1FTEFCRUwiKSk7CisKKwkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWluKE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoMC4wKSk7CisJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldE1heChOdW1iZXJEYXRhRWxlbWVudEltcGwuY3JlYXRlKDEuMCkpOworCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRTdGVwKDAuMSk7CisJCXlBeGlzUHJpbWFyeS5nZXRMYWJlbCgpLmdldENhcHRpb24oKS5nZXRGb250KCkuc2V0U2l6ZSg5KTsKKwkJeUF4aXNQcmltYXJ5LmdldExhYmVsKCkuZ2V0Q2FwdGlvbigpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQl5QXhpc1ByaW1hcnkuZ2V0VGl0bGUoICkuZ2V0Q2FwdGlvbiggKS5zZXRWYWx1ZSggT3JkaW5hdGVfQVhJUyApOworCQl5QXhpc1ByaW1hcnkuZ2V0VGl0bGUoICkuc2V0VmlzaWJsZSh0cnVlKTsKKwkJLy8geUF4aXNQcmltYXJ5LmdldE1ham9yR3JpZCgpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoZm9yZUdyb3VuZCk7CisJCQorCQkvLyBmb3Igbm93IGdldCByZWFkeSB0byBjcmVhdGUgb25seSBvbmUgbGluZSAtIHdlIGhhdmUgbm8gZGF0YSB5ZXQuCisJCS8vIHdlIHdpbGwgYWRkIG1vcmUgbGluZXMgYXMgd2UgbmVlZCB0aGVtCisJCS8vIGhhbmRsZSBudWxsCisJCWlmKCFkYXRhWFlTZXJpZXNNYXAuY29udGFpbnNLZXkoZGVmYXVsdEtleSkpIHsKKwkJCURhdGFYWVNlcmllcyBzZXJpZXMgPSBuZXcgRGF0YVhZU2VyaWVzKGRlZmF1bHRLZXkpOworCQkJc2VyaWVzQ291bnQgKys7CisJCQlkYXRhWFlTZXJpZXNNYXAucHV0KGRlZmF1bHRLZXksIHNlcmllcyk7CisJCX0KKworCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBjcmVhdGVTaW1wbGVMaW5lQ2hhcnQKKworCQorCS8qKgorCSAqIENyZWF0ZSB0aGUgdmlldydzIGNvbnRleHQgbWVudSBhbmQgYWRkIHRoZSBhY3Rpb24gaGFuZGxlcnMgdG8gaXQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCS8vIEluaXQgYSBDb250ZXh0IE1lbnUgTWFuYWdlcgorCQlmaW5hbCBNZW51TWFuYWdlciBjb250ZXh0TWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlsaW5lYXJUaW1lQWN0aW9uID0gbmV3IExpbmVhclNjYWxlQWN0aW9uKCk7CisJCWxvZ1RpbWVBY3Rpb24gPSBuZXcgTG9nU2NhbGVBY3Rpb24oKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChsaW5lYXJUaW1lQWN0aW9uKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChsb2dUaW1lQWN0aW9uKTsKKworCisJCQorCQkvLyBQbGFjZSBIb2xkZXIgZm9yIE1lbnUgQWRkaXRpb25zCisJCWNvbnRleHRNZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigKKwkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkKKwkJdmlld0xlZ2VuZCA9IG5ldyBMZWdlbmRWaWV3QWN0aW9uKCk7CisJCWhpZGVMZWdlbmQgPSBuZXcgTGVnZW5kSGlkZUFjdGlvbigpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKHZpZXdMZWdlbmQpOworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKGhpZGVMZWdlbmQpOworCQkKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQorCQkKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQlwb3BVcE1lbnUgPSBjb250ZXh0TWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUocGFyZW50KTsKKworCQkvLyBTZXQgdGhlIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlcgorCQlwYXJlbnQuc2V0TWVudShwb3BVcE1lbnUpOworCisJfSAvLyBjcmVhdGVDb250ZXh0TWVudQorCQorCS8qKgorCSAqIFVwZGF0ZSB0aGUgdmlldydzIGNvbnRleHQgbWVudSBhbmQgYWRkIHRoZSBhY3Rpb24gaGFuZGxlcnMgdG8gaXQuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbnRleHRNZW51KGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlwb3BVcE1lbnUuZGlzcG9zZSgpOworCisJCS8vIEluaXQgYSBDb250ZXh0IE1lbnUgTWFuYWdlcgorCQlmaW5hbCBNZW51TWFuYWdlciBjb250ZXh0TWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlsaW5lYXJUaW1lQWN0aW9uID0gbmV3IExpbmVhclNjYWxlQWN0aW9uKCk7CisJCWxvZ1RpbWVBY3Rpb24gPSBuZXcgTG9nU2NhbGVBY3Rpb24oKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChsaW5lYXJUaW1lQWN0aW9uKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChsb2dUaW1lQWN0aW9uKTsKKwkJCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCisJCXZpZXdMZWdlbmQgPSBuZXcgTGVnZW5kVmlld0FjdGlvbigpOworCQloaWRlTGVnZW5kID0gbmV3IExlZ2VuZEhpZGVBY3Rpb24oKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZCh2aWV3TGVnZW5kKTsKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChoaWRlTGVnZW5kKTsKKwkJCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkKKwkJCisJCS8vIFBsYWNlIEhvbGRlciBmb3IgTWVudSBBZGRpdGlvbnMKKwkJY29udGV4dE1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKAorCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CisKKwkJCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBhZGQgdGhlIGRpc3BsYXlhYmxlIHByb3BlcnRpZXMKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9sLmdldE51bVByb3BlcnRpZXMoY2hhcnRJbmRleCk7IGkgKyspIHsKKwkJCQorCQkJU3RyaW5nIG5leHRQcm9wID0gY29udHJvbC5nZXRQcm9wZXJ0eShjaGFydEluZGV4LGkpOworCQkJRGF0YVhZU2VyaWVzIHNlcmllcyA9IGRhdGFTZXJpZXNNYXAuZ2V0KG5leHRQcm9wKTsKKwkJCURpc3BsYXlhYmxlUHJvcGVydHkgcHJvcGVydHkgPSBuZXcgRGlzcGxheWFibGVQcm9wZXJ0eShuZXh0UHJvcCwgc2VyaWVzLmlzVmlzaWJsZSgpKTsKKwkJCWNvbnRleHRNZW51TWFuYWdlci5hZGQocHJvcGVydHkpOworCQl9CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJLy8gUGxhY2UgSG9sZGVyIGZvciBNZW51IEFkZGl0aW9ucworCQljb250ZXh0TWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCisJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQlmaW5hbCBNZW51IHBvcFVwTWVudSA9IGNvbnRleHRNZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShwYXJlbnQpOworCisJCS8vIFNldCB0aGUgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyCisJCXBhcmVudC5zZXRNZW51KHBvcFVwTWVudSk7CisKKworCX0gLy8gdXBkYXRlQ29udGV4dE1lbnUKKworCisJCisJLyoqCisJICogU2V0cyB0aGUgY29sb3JzIGZvciBhIG4gYXJyYXkgb2YgU2NhdHRlclNlcmllcyBnaXZlbiB0aGUgcHJvcGVydHkgdG8gUGxvdAorCSAqIGZvciBlYWNoLiBUcnkgdG8gc2V0IGNvbG9yIGZyb20gdGhlIHByZWZlcmVuY2VzIChpZiBzcGVjaWZpZWQgZm9yIHRoYXQKKwkgKiBwcm9wZXJ0eSkgb3RoZXJ3aXNlIHNldHMgbGluZSBjb2xvciB0byBibHVlLgorCSAqIAorCSAqIEBwYXJhbSBwcm9wZXJ0aWVzVG9QbG90CisJICogQHBhcmFtIGxzTGlzdAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb2xvckRlZnMoCisJCQlmaW5hbCBMaXN0PFN0cmluZz4gcHJvcGVydGllc1RvUGxvdCwKKwkJCWZpbmFsIExpc3Q8U2NhdHRlclNlcmllcz4gbHNMaXN0KSB7CisJCS8vIHRoZSBkZWZhdWx0IGxpbmUgY29sb3IKKworCQkvLyBpZiBwb3NzaWJsZSBnZXQgY29sb3IgZnJvbSBwcmVmZXJlbmNlcworCQlmaW5hbCBNYXA8U3RyaW5nLCBDb2xvcj4gY29sb3JNYXAgPSBWaXN1YWxpemF0aW9uUHJlZmVyZW5jZVBhZ2UKKwkJCQkuZ2V0Q29sb3JNYXBwaW5nKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbHNMaXN0LnNpemUoKTsgaSsrKSB7CisJCQlDb2xvckRlZmluaXRpb24gY29sb3IgPSBDb2xvckRlZmluaXRpb25JbXBsLkJMVUUoKTsKKworCQkJaWYgKChwcm9wZXJ0aWVzVG9QbG90ICE9IG51bGwpICYmIChwcm9wZXJ0aWVzVG9QbG90LnNpemUoKSA+IGkpKSB7CisJCQkJZmluYWwgU3RyaW5nIGtleSA9IHByb3BlcnRpZXNUb1Bsb3QuZ2V0KGkpOworCQkJCS8vIGxvb2sgb3IgdGhlIHByZWZlcmVuY2UgY29sb3IgYnkgbmFtZQorCQkJCWlmIChjb2xvck1hcC5jb250YWluc0tleShrZXkpKSB7CisJCQkJCWZpbmFsIENvbG9yIGMgPSBjb2xvck1hcC5nZXQoa2V5KTsKKwkJCQkJY29sb3IgPSBDb2xvckRlZmluaXRpb25JbXBsLmNyZWF0ZShjLmdldFJlZCgpLAorCQkJCQkJCWMuZ2V0R3JlZW4oKSwgYy5nZXRCbHVlKCkpOworCQkJCX0KKwkJCQlsc0xpc3QuZ2V0KGkpLnNldFNlcmllc0lkZW50aWZpZXIoa2V5KTsKKwkJCQlsc0xpc3QuZ2V0KGkpLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoY29sb3IpOworCQkJfSBlbHNlIHsKKworCQkJCWlmIChsc0xpc3QuZ2V0KGkpICE9IG51bGwpIHsKKwkJCQkJbHNMaXN0LmdldChpKS5zZXRTZXJpZXNJZGVudGlmaWVyKCIgIik7CisJCQkJCWxzTGlzdC5nZXQoaSkuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRDb2xvcihjb2xvcik7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybjsKKwl9Ly8gZ2V0Q29sb3JEZWYKKworCisJCisKKwkvKioKKwkgKiBEaXNwb3NlcyB0aGUgQ29sb3Igb2JqZWN0cworCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9CisKKwkvKioKKwkgKiByZXNldAorCSAqLworCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlyZXNldERhdGEoKTsKKwkJcmVkcmF3KCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVzZXREYXRhKCkgeworCQljbGVhckRhdGEoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2xlYXJEYXRhKCkgeworCQkKKwkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gZGF0YVNlcmllc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworCQl3aGlsZSgoaXRlciE9bnVsbCkmJihpdGVyLmhhc05leHQoKSkpIHsKKwkJCVN0cmluZyBrZXkgPSBpdGVyLm5leHQoKTsKKwkJCURhdGFYWVNlcmllcyBzZXJpZXMgPSBkYXRhU2VyaWVzTWFwLmdldChrZXkpOworCQkJc2VyaWVzLnlWYWx1ZXMuY2xlYXIoKTsKKwkJCXNlcmllcy54VmFsdWVzLmNsZWFyKCk7CisJCQlzZXJpZXMuYWRkVmFsdWUobmV3IERvdWJsZSgwLjApLCBuZXcgRG91YmxlKDAuMCkpOworCQl9CisJCQorCX0KKworCQorCS8qKgorCSAqIHRvZ2dsZSB0aGUgc2NhbGUgZnJvbSBsb2dhcml0aG1pYyB0byBsaW5lYXIKKwkgKi8KKwl2b2lkIHRvZ2dsZUF4aXNTY2FsZSgpIHsKKy8vCQlpZiAodXNlTGluZWFyVGltZVNjYWxlKSB7IC8vU3dpdGNoIHRvIGxvZ2FyaXRobWljIHNjYWxlCisvLwkJCWxvZ1RpbWVBY3Rpb24uc2V0Q2hlY2tlZCh0cnVlKTsKKy8vCQkJbGluZWFyVGltZUFjdGlvbi5zZXRDaGVja2VkKGZhbHNlKTsKKy8vCQkJLy9KdXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgYXhpcyB0eXBlLCB0byBtb3ZlIHRvIGxvZyBzY2FsZSwgZGlkbid0IHdvcmsKKy8vCQkJLy95QXhpc1ByaW1hcnkuc2V0VHlwZShBeGlzVHlwZS5MT0dBUklUSE1JQ19MSVRFUkFMKTsKKy8vCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWluKG51bGwpOworLy8JCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNYXgobnVsbCk7CisvLwkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnVuc2V0U3RlcCgpOworLy8JCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS51bnNldFN0ZXBOdW1iZXIoKTsKKy8vCQl9CisvLwkJZWxzZSB7IC8vU3dpdGNoIHRvIGxpbmVhciBzY2FsZQorLy8JCQlsb2dUaW1lQWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOworLy8JCQlsaW5lYXJUaW1lQWN0aW9uLnNldENoZWNrZWQodHJ1ZSk7CisvLwkJCS8veUF4aXNQcmltYXJ5LnNldFR5cGUoQXhpc1R5cGUuTElORUFSX0xJVEVSQUwpOworLy8JCQl5QXhpc1ByaW1hcnkuZ2V0U2NhbGUoKS5zZXRNaW4oTnVtYmVyRGF0YUVsZW1lbnRJbXBsLmNyZWF0ZSgwLjApKTsKKy8vCQkJeUF4aXNQcmltYXJ5LmdldFNjYWxlKCkuc2V0TWF4KE51bWJlckRhdGFFbGVtZW50SW1wbC5jcmVhdGUoMS4wKSk7CisvLwkJCXlBeGlzUHJpbWFyeS5nZXRTY2FsZSgpLnNldFN0ZXAoMC4yNSk7CisvLwkJfQorLy8JCXVzZUxpbmVhclRpbWVTY2FsZSA9ICF1c2VMaW5lYXJUaW1lU2NhbGU7CisvLwkJZHJhdygpOworCX0KKwkKKworCS8qKgorCSAqIHRvZ2dsZSB0aGUgc2NhbGUgZnJvbSBsb2dhcml0aG1pYyB0byBsaW5lYXIKKwkgKi8KKwl2b2lkIHRvZ2dsZUxlZ2VuZCgpIHsKKwkJaWYgKHNob3dMZWdlbmQpIHsgLy9Td2l0Y2ggdG8gaGlkZQorCQkJdmlld0xlZ2VuZC5zZXRDaGVja2VkKGZhbHNlKTsKKwkJCWhpZGVMZWdlbmQuc2V0Q2hlY2tlZCh0cnVlKTsKKwkJCWxlZ2VuZC5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJfQorCQllbHNlIHsgLy9Td2l0Y2ggdG8gdmlldworCQkJdmlld0xlZ2VuZC5zZXRDaGVja2VkKHRydWUpOworCQkJaGlkZUxlZ2VuZC5zZXRDaGVja2VkKGZhbHNlKTsKKwkJCWxlZ2VuZC5zZXRWaXNpYmxlKHRydWUpOworCQl9CisJCXNob3dMZWdlbmQgPSAhc2hvd0xlZ2VuZDsKKwkJZHJhdygpOworCX0KKworCisJLyoqCisJICogQWN0aW9uIHRvIHNob3cgdGhlIGxlZ2VuZAorCSAqLworCXByb3RlY3RlZCBjbGFzcyBMZWdlbmRWaWV3QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKwkJcHVibGljIExlZ2VuZFZpZXdBY3Rpb24oKQorCQl7CisJCQlzdXBlcihNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbnRleHRNZW51LlNob3dMZWdlbmQiKSwgSUFjdGlvbi5BU19DSEVDS19CT1gpOworCQkJc2V0Q2hlY2tlZChzaG93TGVnZW5kKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZ2V0VGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCQkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiQ29udGV4dE1lbnUuU2hvd0xlZ2VuZCIpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCWlmIChzaG93TGVnZW5kKSB7CisJCQkJc2V0Q2hlY2tlZCh0cnVlKTsKKwkJCQkvL05vdGhpbmcgdG8gZG8uIEl0J3MgYWxyZWFkeSBsaW5lYXItdGltZS4KKwkJCX0KKwkJCWVsc2UgeworCQkJCXRvZ2dsZUxlZ2VuZCgpOworCQkJfQorCQkJZHJhdygpOworCQl9CisJfSAvL0xlZ2VuZFZpZXdBY3Rpb24KKwkKKwkvKioKKwkgKiBBY3Rpb24gdG8gaGlkZSB0aGUgbGVnZW5kCisJICovCisJY2xhc3MgTGVnZW5kSGlkZUFjdGlvbiBleHRlbmRzIEFjdGlvbiAJeworCQlwdWJsaWMgTGVnZW5kSGlkZUFjdGlvbigpCisJCXsKKwkJCXN1cGVyKE1lc3NhZ2VzLmdldFN0cmluZygiQ29udGV4dE1lbnUuSGlkZUxlZ2VuZCIpLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7CisJCQlzZXRDaGVja2VkKCFzaG93TGVnZW5kKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZ2V0VGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCQkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiQ29udGV4dE1lbnUuSGlkZUxlZ2VuZCIpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCWlmICghc2hvd0xlZ2VuZCkgeworCQkJCXNldENoZWNrZWQodHJ1ZSk7CisJCQkJLy9Ob3RoaW5nIHRvIGRvLiBJdCdzIGFscmVhZHkgbG9nLXRpbWUuCisJCQl9CisJCQllbHNlIHsKKwkJCQl0b2dnbGVMZWdlbmQoKTsKKwkJCX0KKwkJCWRyYXcoKTsKKwkJfQorCX0vL0xlZ2VuZEhpZGVBY3Rpb24KKworCQorCS8qKgorCSAqIHN3aXRjaCB0byBsaW5lYXIgcGxvdCAKKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgY2xhc3MgTGluZWFyU2NhbGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCQlwdWJsaWMgTGluZWFyU2NhbGVBY3Rpb24oKQorCQl7CisJCQlzdXBlcihNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbnRleHRNZW51LkxpbmVhclRpbWVTY2FsZSIpLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7CisJCQlzZXRDaGVja2VkKHVzZUxpbmVhclRpbWVTY2FsZSk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI2dldFRleHQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbnRleHRNZW51LkxpbmVhclRpbWVTY2FsZSIpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCWlmICh1c2VMaW5lYXJUaW1lU2NhbGUpIHsKKwkJCQlzZXRDaGVja2VkKHRydWUpOworCQkJCS8vTm90aGluZyB0byBkby4gSXQncyBhbHJlYWR5IGxpbmVhci10aW1lLgorCQkJfQorCQkJZWxzZSB7CisJCQkJdG9nZ2xlQXhpc1NjYWxlKCk7CisJCQl9CisJCQlkcmF3KCk7CisJCX0KKwl9IC8vTGluZWFyU2NhbGVBY3Rpb24KKworCS8qKgorCSAqIHN3aXRjaCB0byBzZW1pLWxvZyBwbG90IChsb2cgc2NhbGUgb24geSBheGlzKQorCSAqIAorCSAqLworCWNsYXNzIExvZ1NjYWxlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIAl7CisJCXB1YmxpYyBMb2dTY2FsZUFjdGlvbigpCisJCXsKKwkJCXN1cGVyKE1lc3NhZ2VzLmdldFN0cmluZygiQ29udGV4dE1lbnUuTG9nVGltZVNjYWxlIiksIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKKwkJCXNldENoZWNrZWQoIXVzZUxpbmVhclRpbWVTY2FsZSk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI2dldFRleHQoKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbnRleHRNZW51LkxvZ1RpbWVTY2FsZSIpOworCQl9CisKKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCWlmICghdXNlTGluZWFyVGltZVNjYWxlKSB7CisJCQkJc2V0Q2hlY2tlZCh0cnVlKTsKKwkJCQkvL05vdGhpbmcgdG8gZG8uIEl0J3MgYWxyZWFkeSBsb2ctdGltZS4KKwkJCX0KKwkJCWVsc2UgeworCQkJCXRvZ2dsZUF4aXNTY2FsZSgpOworCQkJfQorCQkJZHJhdygpOworCQl9CisJfS8vTG9nU2NhbGVBY3Rpb24KKwkKKwkvKioKKwkgKiBEaXNwbGF5YWJsZVByb3BlcnR5CisJICoKKwkgKi8KKwlwcm90ZWN0ZWQgY2xhc3MgRGlzcGxheWFibGVQcm9wZXJ0eSBleHRlbmRzIEFjdGlvbgorCXsKKwkJU3RyaW5nIHByb3BlcnR5ID0gbnVsbDsKKwkJcHVibGljIERpc3BsYXlhYmxlUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5LCBib29sZWFuIHZpc2liaWxpdHkpCisJCXsKKwkJCQkJc3VwZXIocHJvcGVydHksIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKKwkJCQkJdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworCQkJCQlzZXRDaGVja2VkKHZpc2liaWxpdHkpOworCQl9CisJCQorCQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZ2V0VGV4dCgpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCQkJcmV0dXJuIHByb3BlcnR5OworCQl9CisKKwkJLyoqCisJCSAqIFRvZ2dsZSB0aGUgc3RhdGUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCURhdGFYWVNlcmllcyBzZXJpZXMgPSBkYXRhU2VyaWVzTWFwLmdldChwcm9wZXJ0eSk7CisJCQkJc2VyaWVzLnRvZ2dsZVZpc2libGUoKTsKKwkJCQlkYXRhU2VyaWVzTWFwLnB1dChwcm9wZXJ0eSxzZXJpZXMpOworCQkJCXNldENoZWNrZWQoc2VyaWVzLmlzVmlzaWJsZSgpKTsKKwkJCQlkcmF3KCk7CisJCX0KKwl9Ly8gRGlzcGxheWFibGVQcm9wZXJ0eQorCQorCQorCS8qKgorCSAqIElubmVyIGNsYXNzIERhdGFYWVNlcmllcworCSAqIGFsbCB0aGUgZGF0YSBvYmplY3RzIGZvciBhIHBsb3QKKwkgKgorCSAqLworCXByb3RlY3RlZCBjbGFzcyBEYXRhWFlTZXJpZXMgCisJeworCQlwdWJsaWMgU3RyaW5nIHByb3BlcnR5TmFtZSA9ICIiOworCQkKKwkJcHVibGljIExpc3Q8RG91YmxlPiB5VmFsdWVzID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCXB1YmxpYyBMaXN0PERvdWJsZT4geFZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkKKwkJcHVibGljIFNlcmllcyBzZXJpZXNYID0gbnVsbDsKKwkJcHVibGljIFNjYXR0ZXJTZXJpZXMgc2NhdHRlclNlcmllc1kgPSBudWxsOworCQlwcml2YXRlIGJvb2xlYW4gdmlzaWJsZSA9IHRydWU7CisJCXByaXZhdGUgU2VyaWVzRGVmaW5pdGlvbiBzZFkgPSBudWxsOworCQlwcml2YXRlIFNlcmllc0RlZmluaXRpb24gc2RYID0gbnVsbDsKKwkJCisJCQorCQlwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisJCQlyZXR1cm4gdmlzaWJsZTsKKwkJfQorCQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gc3RhdGUpIHsKKwkJCXZpc2libGUgPSBzdGF0ZTsKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgdG9nZ2xlVmlzaWJsZSgpIHsKKwkJCXZpc2libGUgPSAhdmlzaWJsZTsKKwkJfQorCisJCS8qKgorCQkgKiAKKwkJICogQHBhcmFtIHByb3BlcnR5TmFtZQorCQkgKi8KKwkJcHVibGljIERhdGFYWVNlcmllcyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKwkJCXlWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCXlWYWx1ZXMuYWRkKG5ldyBEb3VibGUoMC4wKSk7CisJCQkKKwkJCXhWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCXhWYWx1ZXMuYWRkKG5ldyBEb3VibGUoMC4wKSk7CisJCQkKKwkJCWFkZFNjYXR0ZXJTZXJpZXMocHJvcGVydHlOYW1lKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIGFkZCBhbiBYWSB2YWx1ZSBwYWlyCisJCSAqIEBwYXJhbSB2YWxYCisJCSAqIEBwYXJhbSB2YWxZCisJCSAqLworCQlwdWJsaWMgdm9pZCBhZGRWYWx1ZShEb3VibGUgdmFsWCwgRG91YmxlIHZhbFkpIHsKKwkJCWlmKHlWYWx1ZXM9PW51bGwpIHlWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCWlmKHhWYWx1ZXM9PW51bGwpIHhWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJCXhWYWx1ZXMuYWRkKHZhbFgpOworCQkJeVZhbHVlcy5hZGQodmFsWSk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCisJCSAqIAorCQkgKi8KKwkJcHVibGljIHZvaWQgYWRkU2NhdHRlclNlcmllcyhmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCQkKKwkJCWZpbmFsIE51bWJlckRhdGFTZXQgb3J0aG9WYWx1ZXMgPSBOdW1iZXJEYXRhU2V0SW1wbC5jcmVhdGUoeVZhbHVlcyk7CisJCQlmaW5hbCBOdW1iZXJEYXRhU2V0IHhBeGlzVmFsdWVzID0gTnVtYmVyRGF0YVNldEltcGwuY3JlYXRlKHhWYWx1ZXMpOworCQkJCisJCQlzZFggPSBTZXJpZXNEZWZpbml0aW9uSW1wbC5jcmVhdGUoKTsKKwkJCS8vRnJhY3Rpb25OdW1iZXJGb3JtYXRTcGVjaWZpZXIgc2YgPSBGcmFjdGlvbk51bWJlckZvcm1hdFNwZWNpZmllckltcGwuY3JlYXRlKCk7CisJCQkvL3NmLnNldFByZWNpc2UodHJ1ZSk7CisJCQkvL3NkWC5zZXRGb3JtYXRTcGVjaWZpZXIoc2YpOworCQkJeEF4aXNQcmltYXJ5LmdldFNlcmllc0RlZmluaXRpb25zKCkuYWRkKHNkWCk7CisJCQkKKwkJCQorCQkJaWYoc2NhdHRlclNlcmllc1kgPT0gbnVsbCkgeworCQkJCXNkWSA9IFNlcmllc0RlZmluaXRpb25JbXBsLmNyZWF0ZSgpOworCQkJCQorCQkJCXNjYXR0ZXJTZXJpZXNZID0gKFNjYXR0ZXJTZXJpZXMpU2NhdHRlclNlcmllc0ltcGwuY3JlYXRlKCk7CisJCQkJc2VyaWVzWCA9IFNlcmllc0ltcGwuY3JlYXRlKCk7CisJCQl9IC8vIGlmIHNjYXR0ZXJTZXJpZXNZPT1udWxsCisJCQkvLyBuZXcgY29sb3JzCisJCQlzZXJpZXNYLmdldExhYmVsKCkuZ2V0Q2FwdGlvbigpLnNldENvbG9yKGZvcmVHcm91bmQpOworCQkJc2VyaWVzWC5nZXRMYWJlbCgpLmdldE91dGxpbmUoKS5zZXRDb2xvcihmb3JlR3JvdW5kKTsKKwkJCXNlcmllc1guc2V0RGF0YVNldCh4QXhpc1ZhbHVlcyk7CisJCQlzZFguZ2V0U2VyaWVzKCkuYWRkKHNlcmllc1gpOworCQkKKwkJCXNjYXR0ZXJTZXJpZXNZLnNldERhdGFTZXQob3J0aG9WYWx1ZXMpOworCQkJCisJCQkvLyBBc3NpZ24gdGhlIGxpbmUgY29sb3IKKwkJCS8vIGJhc2VkIG9uIHNlbGVjdGVkIHByb3BlcnR5LiBEZWZhdWx0IGlzIEJsdWUKKwkJCXNldENvbG9yRGVmcyhwcm9wZXJ0eU5hbWUpOworCQkJLy8gSWYgdGhpcyBpcyB0aGUgInNlbGVjdGVkIiByZWdpb24gb2YgYSBncmFwaCBzZXQgdGhlIG1hcmtlciB0eXBlCisJCQkKKwkJCS8vIHRoZSBzZXJpZXMgZGVmCisJCQlDb2xvckRlZmluaXRpb24gY29sb3IgPSBDb2xvckRlZmluaXRpb25JbXBsLmNyZWF0ZSgKKwkJCQkJY29sb3JEZWZhdWx0W2NoYXJ0SW5kZXhdWzBdLCAKKwkJCQkJY29sb3JEZWZhdWx0W2NoYXJ0SW5kZXhdWzFdLCAKKwkJCQkJY29sb3JEZWZhdWx0W2NoYXJ0SW5kZXhdWzJdKTsKKwkJCXNkWS5nZXRTZXJpZXNQYWxldHRlKCkudXBkYXRlKGNvbG9yKTsKKwkJCXNkWS5nZXRTZXJpZXMoKS5hZGQoc2NhdHRlclNlcmllc1kpOworCQkJeUF4aXNQcmltYXJ5LmdldFNlcmllc0RlZmluaXRpb25zKCkuYWRkKHNkWSk7CisJCQkKKwkJCXJldHVybjsKKwkJfS8vIGFkZFNjYXR0ZXJTZXJpZXMKKwkJCisJCS8qKiAKKwkJICogaW4gcmVzcG9uc2UgdG8gdXNlciBhY3Rpb24gdGVtcG9yYXJpbHkgcmVtb3ZlIHRoZSBsaW5lIHNlcmllcyBmcm9tIHRoZSBncmFwaAorCQkgKi8KKwkJcHVibGljIHZvaWQgaGlkZSgpIHsKKwkJCXNjYXR0ZXJTZXJpZXNZLnNldFZpc2libGUoZmFsc2UpOworCQkJdmlzaWJsZSA9IGZhbHNlOworCQl9Ly8gaGlkZQorCQkKKwkJLyoqIAorCQkgKiBpbiByZXNwb25zZSB0byB1c2VyIGFjdGlvbiBhZGQgYmFjayB0aGUgbGluZSBzZXJpZXMgdG8gdGhlIGdyYXBoCisJCSAqLworCQlwdWJsaWMgdm9pZCBzaG93KCkgeworCQkJc2NhdHRlclNlcmllc1kuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCXZpc2libGUgPSB0cnVlOworCQl9Ly8gc2hvdworCQkKKworCQkvKioKKwkJICogU2V0cyB0aGUgY29sb3JzIGZvciBhIG4gYXJyYXkgb2YgU2NhdHRlclNlcmllcyBnaXZlbiB0aGUgcHJvcGVydHkgdG8gUGxvdAorCQkgKiBmb3IgZWFjaC4gVHJ5IHRvIHNldCBjb2xvciBmcm9tIHRoZSBwcmVmZXJlbmNlcyAoaWYgc3BlY2lmaWVkIGZvciB0aGF0CisJCSAqIHByb3BlcnR5KSBvdGhlcndpc2Ugc2V0cyBsaW5lIGNvbG9yIHRvIGJsdWUuCisJCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgCisJCSAqCisJCSAqLworCQlAU3VwcHJlc3NXYXJuaW5ncygiY2FzdCIpCisJCXB1YmxpYyB2b2lkIHNldENvbG9yRGVmcyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCQl0aGlzLnNjYXR0ZXJTZXJpZXNZLnNldFNlcmllc0lkZW50aWZpZXIocHJvcGVydHlOYW1lKTsKKwkJCWlmKHByb3BlcnR5TmFtZS5pbmRleE9mKCJYWSIpPj0wKSB7CisJCQkJLy8gdGhlIGRhdGEKKwkJCQlzY2F0dGVyU2VyaWVzWS5zZXRQYWxldHRlTGluZUNvbG9yKHRydWUpOwkJCQkKKwkJCQkvL3NjYXR0ZXJTZXJpZXNZLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0Q29sb3IoY29sb3IpOworCQkJCS8vc2NhdHRlclNlcmllc1kuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRTdHlsZShMaW5lU3R5bGUuU09MSURfTElURVJBTCk7CisJCQkJTWFya2VyIG1hcmtlciA9IE1hcmtlckltcGwuY3JlYXRlKE1hcmtlclR5cGUuQ0lSQ0xFX0xJVEVSQUwsIDIpOworCQkJCXNjYXR0ZXJTZXJpZXNZLmdldE1hcmtlcnMoKS5jbGVhcigpOworCQkJCXNjYXR0ZXJTZXJpZXNZLmdldE1hcmtlcnMoKS5hZGQobWFya2VyKTsKKwkJCQlzY2F0dGVyU2VyaWVzWS5nZXRMaW5lQXR0cmlidXRlcygpLnNldFZpc2libGUoZmFsc2UpOworCQkJfSBlbHNlIHsKKwkJCQkvLyB0aGUgZml0CisJCQkJc2NhdHRlclNlcmllc1kuZ2V0TGluZUF0dHJpYnV0ZXMoKS5zZXRDb2xvcihDb2xvckRlZmluaXRpb25JbXBsLkJMQUNLKCkpOworCQkJCXNjYXR0ZXJTZXJpZXNZLmdldExpbmVBdHRyaWJ1dGVzKCkuc2V0U3R5bGUoTGluZVN0eWxlLkRPVFRFRF9MSVRFUkFMKTsKKwkJCQlzY2F0dGVyU2VyaWVzWS5nZXRMaW5lQXR0cmlidXRlcygpLnNldFZpc2libGUodHJ1ZSk7CisJCQkJaWYgKCFzY2F0dGVyU2VyaWVzWS5nZXRNYXJrZXJzKCkuaXNFbXB0eSgpKSB7CisJCQkJCU1hcmtlciBtYXJrZXIgPSAoTWFya2VyKXNjYXR0ZXJTZXJpZXNZLmdldE1hcmtlcnMoKS5nZXQoMCk7CisJCQkJCW1hcmtlci5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJfS8vIGdldENvbG9yRGVmcworCisJCS8qKgorCQkgKiBsZW5ndGggb2YgdGhlIHNlcmllcworCQkgKiBAcmV0dXJuIG51bWJlciBvZiBkYXRhIHBvaW50cworCQkgKi8KKwkJcHVibGljIGludCBnZXREYXRhU2l6ZSgpIHsKKwkJCXJldHVybiB5VmFsdWVzLnNpemUoKTsKKwkJfQorCQkvLyBBY2Nlc3NvcnMKKwkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7CisJCQlyZXR1cm4gcHJvcGVydHlOYW1lOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJCXRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworCQl9CisKKwkJcHVibGljIExpc3Q8RG91YmxlPiBnZXR5VmFsdWVzKCkgeworCQkJcmV0dXJuIHlWYWx1ZXM7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXR5VmFsdWVzKExpc3Q8RG91YmxlPiB5VmFsdWVzKSB7CisJCQl0aGlzLnlWYWx1ZXMgPSB5VmFsdWVzOworCQl9CisKKwkJCisKKwkJcHVibGljIHZvaWQgc2V0U2NhdHRlclNlcmllcyhTY2F0dGVyU2VyaWVzIGxpbmVTZXJpZXMpIHsKKwkJCXRoaXMuc2NhdHRlclNlcmllc1kgPSBsaW5lU2VyaWVzOworCQl9CisJfS8vIERhdGFYWVNlcmllcworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCit9IC8vIFhZU2VyaWVzQ2FudmFzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9hbmFseXNpcy92aWV3cy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTc0YThkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvYW5hbHlzaXMvdmlld3MvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDE1MSBAQAorIyBtZXNzYWdlcy5wcm9wZXJ0aWVzCisjCisjIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjIENvbW1hIHNlcGFyYXRlZCB2YXJpYWJsZQorQ1NDLnRpdGxlPUNTVgorCisjIENvbW1vbgorQ09NTU9OLk5PVEZPVU5EPVNjZW5hcmlvIGZvbGRlciBub3QgZm91bmQhCitDT01NT04uTk9UREFUQT1JbnZhbGlkIGRhdGEgb3IgcGF0aCEKK0NPTU1PTi5ET05FPURvbmUKK0NPTU1PTi5SRUFEWT1SZWFkeSB0byBQbG90CitDT01NT04uV09SS0lORz1Xb3JraW5nCisKKworIyBFcGlkZW1pYyB2aWV3CitFUElWSUVXLlNFTEVDVERJUj1TZWxlY3QgRm9sZGVyCitFUElWSUVXLkFHR1JFR0FURURBVEE9QWdncmVnYXRlIGRhdGEKK0VQSVZJRVcuUkVGRVJFTkNFRk9MREVSTEFCRUw9VXNlIFJlZmVyZW5jZSBGaWx0ZXIKK0VQSVZJRVcuU0VMRUNURklMRT1TZWxlY3QgRmlsZQorRVBJVklFVy5TRUxFQ1RTQ0VOQVJJT0ZPTERFUj1TZWxlY3Qgc2NlbmFyaW8gZm9sZGVyCitFUElWSUVXLlNFTEVDVFJFRkVSRU5DRUZPTERFUj1TZWxlY3QgcmVmZXJlbmNlIGZvbGRlcgorRVBJVklFVy5TRUxFQ1RBR0dGSUxFPVNlbGVjdCBBZ2dyZWdhdGUgZmlsZQorRVBJVklFVy5TRUxFQ1RJTkNGSUxFPVNlbGVjdCBJbmNpZGVuY2UgZmlsZQorRVBJVklFVy5QTE9UVEVYVD1QbG90CitFUElWSUVXLkFHR1JFR0FURUxFR0VORD1FcGlkZW1pYworRVBJVklFVy5ZQVhJUz1Qb3B1bGF0aW9uCitFUElWSUVXLlNDRU5BUklPRk9MREVSTEFCRUw9U2NlbmFyaW8gRm9sZGVyOgorRVBJVklFVy5BR0dGSUxFTEFCRUw9IFNjZW5hcmlvIEFnZ3JlZ2F0ZSBGaWxlCitFUElWSUVXLklOQ0ZJTEVMQUJFTD0gU2NlbmFyaW8gSW5jaWRlbmNlIEZpbGUKKyMgSW5jaWRlbmNlIGNoYXJ0IHBhcnQgb2YgRVBJVklFVworSU5DVklFVy5JTkNJREVOQ0VMRUdFTkQ9SW5jaWRlbmNlCitJTkNWSUVXLllBWElTPUluY2lkZW5jZQorCisjIEVzdGltYXRvciB2aWV3CitFU1QuVElUTEU9UGFyYW1ldGVyIEVzdGltYXRpb24KK0VTVC5FU1RJTUFURT1Fc3RpbWF0ZSBQYXJhbWV0ZXJzCitFU1QuU0VMRUNURVNUSU1BVE9SPVNlbGVjdAorRVNULlJFU1VMVFM9UmVzdWx0czoKK0VTVC5DT01QTEVURT1QYXJhbWV0ZXIgRXN0aW1hdGlvbiBDb21wbGV0ZQorRVNULlNDRk9MREVSPVNjZW5hcmlvIEZvbGRlcjoKK0VTVC5QQVJBTUVTVElNQVRPUj1QYXJhbWV0ZXIgRXN0aW1hdG9yOgorRVNULlNFTEVDVEZPTERFQlVUVE9OPVNlbGVjdCBTY2VuYXJpbyBGb2xkZXIKK0VTVC5TRUxFQ1RGT0xERURJQUxPR1RJVExFPUNob29zZSBTY2VuYXJpbyBGb2xkZXIKK0VTVC5QQVJBTUVTVFRJVExFPVNlbGVjdCBQYXJhbWV0ZXIgRXN0aW1hdG9yCitFU1QuUEFSQU1FU1RMQUJFTD1TZWxlY3QgUGFyYW1ldGVyIEVzdGltYXRvcjoKK0VTVC5XSVpBUkRQQUdFMVRJVExFPVNlbGVjdCBTY2VuYXJpbyBGb2xkZXIKK0VTVC5DSE9JQ0UxPUZpdCBFYWNoIExvY2F0aW9uIFRoZW4gQXZlcmFnZQorRVNULkNIT0lDRTI9U3VtIE92ZXIgQWxsIExvY2F0aW9ucyBUaGVuIEZpdAorRVNULk1BWFRIUkVTSE9MRFM9TWF4IFMgCitFU1QuTUlOVEhSRVNIT0xEUz1NaW4gUyAKK0VTVC5NQVhUSFJFU0hPTERFPU1heCBFIAorRVNULk1JTlRIUkVTSE9MREU9TWluIEUgCitFU1QuTUFYVEhSRVNIT0xEST1NYXggSSAKK0VTVC5NSU5USFJFU0hPTERJPU1pbiBJIAorRVNULk1BWFRIUkVTSE9MRFI9TWF4IFIgCitFU1QuTUlOVEhSRVNIT0xEUj1NYXggUiAKK0VTVC5SRVNVTFRTPVJlc3VsdHMKK0VTVC5JTlBVVERBVEE9SW5wdXQgRGF0YQorRVNULlJFR1JFU1NJT049UmVncmVzc2lvbgorRVNULkFWRVJBR0U9QXZlcmFnZQorRVNULkRJU1BMQVk9RGF0YSB0byBEaXNwbGF5CitFU1QuRVFVQVRJT04xPUVxLjEKK0VTVC5FUVVBVElPTjI9RXEuMgorRVNULkVRVUFUSU9OMz1FcS4zCitFU1QuRVFVQVRJT040PUVxLjQKK0VTVC5BWElTTEFCRUwxPVMsUyoKK0VTVC5BWElTTEFCRUwyPUUsRSoKK0VTVC5BWElTTEFCRUwzPUksSSoKK0VTVC5BWElTTEFCRUw0PVIsUioKK0VTVC5SQVhJU0xBQkVMMT1mcm9tIGRTL2RUCitFU1QuUkFYSVNMQUJFTDI9ZnJvbSBkRS9kVAorRVNULlJBWElTTEFCRUwzPWZyb20gZEkvZFQKK0VTVC5SQVhJU0xBQkVMND1mcm9tIGRSL2RUCisjCisjIGJldGEoZikKK0VTVC5GUkVRQkVUQT1cdTAzYjIoZikKKyMgYmV0YShyaG8pCitFU1QuREVOU0lUWUJFVEE9XHUwM2IyKFx1MDNjMSkKKworIyBMeWFwdW5vdiB2aWV3CitMWUEuRElWRVJHRU5DRUxFR0VORD1MeWFwdW5vdiBUcmFqZWN0b3J5IERpdmVyZ2VuY2UKK0xZQS5ESVZFUkdFTkNFWUFYSVM9bG5bZGVsdGFdCitMWUEuVElUTEU9THlhcHVub3YgQW5hbHlzaXMKK0xZQS5DT01QQVJJU09OPUNvbXB1dGUgTHlhcHVub3YgRXhwb25lbnQKK0xZQS5SRVNVTFRTPVJlc3VsdHMKK0xZQS5XT1JLSU5HPS4uLndvcmtpbmcKK0xZQS5ET05FPWRvbmUuCitMWUEuRVJST1IxPUludmFsaWQgRm9sZGVyLiBQbGVhc2UgcGljayBhIGNvbXBsZXRlIFNDRU5BUklPIGZvbGRlci4gTm90IChlLmcuKSBhbiBhZ2dyZWdhdGUgZm9sZGVyLiAKK0xZQS5DT01QTEVURT1Db21wYXJpc29uIENvbXBsZXRlCitMWUEuU0VMRUNURk9MREVSPVNlbGVjdCBTY2VuYXJpbyBGb2xkZXIKK0xZQS5TRUxFQ1RGT0xERVJESUFMRz1QaWNrIGEgc2NlbmFyaW8gZm9sZGVyCitMWUEuRk9MREVSMUxBQkVMPVNjZW5hcmlvIEZvbGRlciAxOgorTFlBLkZPTERFUjJMQUJFTD1TY2VuYXJpbyBGb2xkZXIgMjoKKworIyBTY2VuYXJpbyBjb21wYXJpc29uIHZpZXcKK0NPTVAuUk1TRElGRkVSRU5DRUxBQkVMID0gUk1TIGRpZmZlcmVuY2UKK0NPTVAuUk1TU1RSSU5HPVx1MDM5NCBbUk1TXQorQ09NUC5BTkFMWVpFPUFuYWx5emUKK0NPTVAuVElUTEUgPSBTY2VuYXJpbyBDb21wYXJpc29uOiBSTVMgRGlmZmVyZW5jZQorQ09NUC5DT01QQVJFID0gUk1TIENvbXBhcmUKK0NPTVAuUkVTVUxUUyA9IFJlc3VsdHM6CitDT01QLlNFTEVDVEZPTERFUkJVVFRPTj1TZWxlY3QgRm9sZGVyCitDT01QLlNFTEVDVEZPTERFUkRJQUxPRz1QaWNrIGEgc2NlbmFyaW8gZm9sZGVyCitDT01QLkZPTERFUjFMQUJFTD1SZWZlcmVuY2UgU2NlbmFyaW8gRm9sZGVyOgorQ09NUC5GT0xERVIyTEFCRUw9Q29tcGFyZSBTY2VuYXJpbyBGb2xkZXIocyk6CisKKyMgUHJvY2Vzc29yIHZpZXcKK1BST0NFU1NPUi5USVRMRSA9RGF0YSBQcm9jZXNzb3IKK1BST0NFU1NPUi5TT1VSQ0VGT0xERVI9U291cmNlIEZvbGRlcjoKK1BST0NFU1NPUi5TRUxFQ1RTT1VSQ0VGT0xERVI9U2VsZWN0IFNvdXJjZSBGb2xkZXIKK1BST0NFU1NPUi5TRUxFQ1RTT1VSQ0VGT0xERURJQUxPR1RJVExFPUNob29zZSBTb3VyY2UgRm9sZGVyCitQUk9DRVNTT1IuVEFSR0VURk9MREVSPVRhcmdldCBGb2xkZXI6CitQUk9DRVNTT1IuU0VMRUNUVEFSR0VURk9MREVSPVNlbGVjdCBUYXJnZXQgRm9sZGVyCitQUk9DRVNTT1IuU0VMRUNUVEFSR0VURk9MREVESUFMT0dUSVRMRT1DaG9vc2UgVGFyZ2V0IEZvbGRlcgorUFJPQ0VTU09SLlBPUFVMQVRJT05EQVRBRklMRT1Qb3B1bGF0aW9uIERhdGEgRmlsZToKK1BST0NFU1NPUi5TRUxFQ1RQT1BVTEFUSU9OREFUQUZJTEU9U2VsZWN0IFBvcHVsYXRpb24gRGF0YSBGaWxlCitQUk9DRVNTT1IuU0VMRUNUUE9QVUxBVElPTkRBVEFGSUxFRElBTE9HVElUTEU9Q2hvb3NlIFBvcHVsYXRpb24gRGF0YSBGaWxlCitQUk9DRVNTT1IuTkFNRURBVEFGSUxFPU5hbWUgRGF0YSBGaWxlOgorUFJPQ0VTU09SLlNFTEVDVE5BTUVEQVRBRklMRT1TZWxlY3QgTmFtZSBEYXRhIEZpbGUKK1BST0NFU1NPUi5TRUxFQ1ROQU1FREFUQUZJTEVESUFMT0dUSVRMRT1DaG9vc2UgTmFtZSBEYXRhIEZpbGUKK1BST0NFU1NPUi5SRUNPVkVSWVJBVEU9UmVjb3ZlcnkgUmF0ZQorUFJPQ0VTU09SLlNVU0NFUFRJQkxFUkFURT1TdXNjZXB0aWJsZSBSYXRlCitQUk9DRVNTT1IuSU1NVU5JVFlMT1NTUkFURT1JbW11bml0eSBMb3NzIFJhdGUKK1BST0NFU1NPUi5QUk9DRVNTPSBQcm9jZXNzIERhdGEKK1BST0NFU1NPUi5QQVJBTUVURVJTPURpc2Vhc2UgUGFyYW1ldGVyczoKK1BST0NFU1NPUi5QT1BVTEFUSU9OU0laRT1Qb3B1bGF0aW9uIFNpemU6CitQUk9DRVNTT1IuU1RBUlRZRUFSPVN0YXJ0IFllYXIKK1BST0NFU1NPUi5FTkRZRUFSPUVuZCBZZWFyCitQUk9DRVNTT1IuUkVBRElOR0RBVEE9UmVhZGluZyBkYXRhLi4uCitQUk9DRVNTT1IuRkFJTEVEUkVBRERBVEE9SW52YWxpZCBkYXRhCisKKyMgVGltZSBzZXJpZXMgY2hhcnQKK1RTLlRJTUVMQUJFTD1UaW1lCisKKyMgQ29udGV4dCBtZW51IGVudHJpZXMKK0NvbnRleHRNZW51LkxpbmVhclRpbWVTY2FsZT1MaW5lYXIgU2NhbGUKK0NvbnRleHRNZW51LkxvZ1RpbWVTY2FsZT1Mb2cgU2NhbGUKK0NvbnRleHRNZW51LkxpbmVhclNjYWxpbmc9TGluZWFyIFNjYWxlCitDb250ZXh0TWVudS5Mb2dTY2FsaW5nPUxvZyBTY2FsZQorQ29udGV4dE1lbnUuU2hvd0xlZ2VuZD1TaG93IExlZ2VuZAorQ29udGV4dE1lbnUuSGlkZUxlZ2VuZD1IaWRlIExlZ2VuZApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvLmNkdHByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy8uY2R0cHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjJlYTgzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvLmNkdHByb2plY3QKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlLWNkdCB2ZXJzaW9uPSIyLjAiPz4KKworPGNkdHByb2plY3QvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZTg2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLy5jcHJvamVjdCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLy5jcHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjE5YzU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvLmNwcm9qZWN0CkBAIC0wLDAgKzEsMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2ZpbGVWZXJzaW9uIDQuMC4wPz4KKworPGNwcm9qZWN0PgorPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnNldHRpbmdzIj4KKzxjY29uZmlndXJhdGlvbiBpZD0iY29udmVydGVkLmNvbmZpZy45MDc4NDUyNjQiPgorPHN0b3JhZ2VNb2R1bGUgYnVpbGRTeXN0ZW1JZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZGVmYXVsdENvbmZpZ0RhdGFQcm92aWRlciIgaWQ9ImNvbnZlcnRlZC5jb25maWcuOTA3ODQ1MjY0IiBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiIG5hbWU9ImNvbnZlcnRlZENvbmZpZyI+Cis8ZXh0ZXJuYWxTZXR0aW5ncy8+Cis8ZXh0ZW5zaW9ucy8+Cis8L3N0b3JhZ2VNb2R1bGU+Cis8L2Njb25maWd1cmF0aW9uPgorPC9zdG9yYWdlTW9kdWxlPgorPC9jcHJvamVjdD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkZjRmZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLy5wcm9qZWN0CkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5uZXQuc291cmNlZm9yZ2UubWV0cmljcy5idWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm5ldC5zb3VyY2Vmb3JnZS5tZXRyaWNzLm5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OTMwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw3NCBAQAorI01vbiBGZWIgMjUgMTQ6NTk6MTggUFNUIDIwMDgKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODFkYjdhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMCwwICsxLDUwIEBACisjTW9uIEZlYiAyNSAxMjoyOToyMyBQU1QgMjAwOAorY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitjbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPXRydWUKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQorY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCitjbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK2NsZWFudXAudXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQorY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitjbGVhbnVwX3Byb2ZpbGU9X3JlbGVuZyBjb2RlIGNsZWFudXAKK2NsZWFudXBfc2V0dGluZ3NfdmVyc2lvbj0yCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzBmNmUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwxOSBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMuQWN0aXZhdG9yCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5iaXJ0LmNoYXJ0LmVuZ2luZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5iaXJ0LmNvcmUudWksCisgb3JnLmVjbGlwc2Uuc3RlbS51aSwKKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMsCisgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLAorIG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscywKKyBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMubXVsdGlwb3B1bGF0aW9uCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLAorIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLnZpZXdzCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ODM1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNyBAQAorc291cmNlLi4gPSBzcmMvCitvdXRwdXQuLiA9IGJpbi8KK2Jpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIC4sXAorICAgICAgICAgICAgICAgaWNvbnMvLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9pY29ucy9zYW1wbGUuZ2lmIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvaWNvbnMvc2FtcGxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGZiM2M5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvaWNvbnMvc2FtcGxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYmNkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDggQEAKKworcGx1Z2luTmFtZSA9IFNURU0gTG9nZ2luZyBVdGlsaXR5Citwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZworCisjIEFjdGlvbnMKKworX1VJX0NTVl9Mb2dnZXIgPSBDU1YgTG9nZ2VyCitfVUlfTG9nZ2luZyA9IExvZ2dpbmcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OWIyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Cis8cGx1Z2luPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN0ZW0udWkuU1RFTVBlcnNwZWN0aXZlIgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcyI+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KKyAgICAgIDx2aWV3CisgICAgICAgICAgICBhbGxvd011bHRpcGxlPSJ0cnVlIgorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN0ZW0udWkudmlld3MiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMudmlld3MuQ1NWTG9nZ2VyVmlldyIKKyAgICAgICAgICAgIGljb249Imljb25zL3NhbXBsZS5naWYiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMiCisgICAgICAgICAgICBuYW1lPSIlX1VJX0NTVl9Mb2dnZXIiPgorICAgICAgICAgUmVwb3J0cworICAgICAgPC92aWV3PgorICAgICAgCisgICA8L2V4dGVuc2lvbj4KKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KKyAgICAgIDx2aWV3ZXJDb250cmlidXRpb24KKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy52aWV3cyIKKyAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLmNvbnRleHQiPgorICAgICAgICAgPGFjdGlvbgorICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLnZpZXdzLlJlcG9ydHNDb250ZXh0TWVudUFjdGlvbiIKKyAgICAgICAgICAgICAgIGlkPSJDU1ZMb2dnZXIiCisgICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9DU1ZfTG9nZ2VyIgorICAgICAgICAgICAgICAgbWVudWJhclBhdGg9InJlcG9ydHMvYWRkaXRpb25zIgorICAgICAgICAgICAgICAgc3RhdGU9InRydWUiPgorICAgICAgICAgPC9hY3Rpb24+CisgICAgICA8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KKyAgIDwvZXh0ZW5zaW9uPgorCisJPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+CisgICAgICA8cGFnZQorICAgICAJICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zdGVtLnVpLnByZWZlcmVuY2VzLlNURU1QcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy5wcmVmZXJlbmNlcy5Mb2dnaW5nUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMucHJlZmVyZW5jZXMuTG9nZ2luZ1ByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgbmFtZT0iJV9VSV9Mb2dnaW5nIi8+CisgICAgPC9leHRlbnNpb24+Cis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy9BY3RpdmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzRmNmU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9sb2dnZXJzL0FjdGl2YXRvci5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCisvKioKKyAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQorICovCitwdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7CisKKwkvKioKKwkgKiBUaGUgcGx1Zy1pbiBJRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2VycyI7IC8vJE5PTi1OTFMtMSQKKworCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKKwlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOworCisJLyoqCisJICogVGhlIGNvbnN0cnVjdG9yCisJICovCisJcHVibGljIEFjdGl2YXRvcigpIHsKKwkJcGx1Z2luID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXBsdWdpbiA9IG51bGw7CisJCXN1cGVyLnN0b3AoY29udGV4dCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCisJICogCisJICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCisJICovCisJcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbiBwbHVnLWluCisJICogcmVsYXRpdmUgcGF0aAorCSAqIAorCSAqIEBwYXJhbSBwYXRoCisJICogICAgICAgICAgICB0aGUgcGF0aAorCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKKwkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBwYXRoKTsKKwl9CisKKwkvKioKKwkgKiBMb2cgYW4gZXJyb3IgdG8gdGhlIElMb2cgZm9yIHRoaXMgcGx1Z2luCisJICogCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiAgICAgICAgICAgIHRoZSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB0ZXh0CisJICogQHBhcmFtIGV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgdGhlIGFzc29jaWF0ZWQgZXhjZXB0aW9uLCBvciBudWxsCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisJCS8vIERvIHdlIGhhdmUgYSBwbHVnaW4/CisJCWlmIChwbHVnaW4gIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlwbHVnaW4uZ2V0TG9nKCkubG9nKAorCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbi5nZXRCdW5kbGUoKQorCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7CisJCX0gZWxzZSB7CisJCQkvLyBObworCQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOworCQkJLy8gRXhjZXB0aW9uPworCQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJU3lzdGVtLm91dC5wcmludGxuKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworCQkJfSAvLyBpZgorCQl9CisJfSAvLyBsb2dFcnJvcgorCisJLyoqCisJICogTG9nIGluZm9ybWF0aW9uIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogICAgICAgICAgICB0aGUgbG9jYWxpemVkIGluZm9ybWF0aW9uIG1lc3NhZ2UgdGV4dAorCSAqIEBwYXJhbSBleGNlcHRpb24KKwkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dJbmZvcm1hdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQkvLyBEbyB3ZSBoYXZlIGEgcGx1Z2luPworCQlpZiAocGx1Z2luICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJcGx1Z2luLmdldExvZygpLmxvZygKKwkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIHBsdWdpbi5nZXRCdW5kbGUoKQorCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7CisJCX0gZWxzZSB7CisJCQkvLyBObworCQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOworCQkJLy8gRXhjZXB0aW9uPworCQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQkJLy8gWWVzCisJCQkJU3lzdGVtLm91dC5wcmludGxuKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworCQkJfSAvLyBpZgorCQl9CisJfSAvLyBsb2dJbmZvcm1hdGlvbgorfSAvLyBBY3RpdmF0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy9Nb25pdG9yUHJlZmVyZW5jZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy9Nb25pdG9yUHJlZmVyZW5jZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjM1NWI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9sb2dnZXJzL01vbml0b3JQcmVmZXJlbmNlcy5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBNb25pdG9yUHJlZmVyZW5jZXMgeworCisJUGx1Z2luIHBsdWdpbiA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCk7CisKKwkvKioKKwkgKiB0aGUgdXNlcnMgcHJlZmVyZW5jZXMKKwkgKi8KKwlQcmVmZXJlbmNlcyBwcmVmcyA9IHBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCisJLyoqCisJICogVGhpcyBpcyBhIGxpc3Qgb2YgbG9jYXRpb24gSURzIGZyb20gdGhlIHVzZXIgcnVudGltZSBwcmVmZXJlbmNlcyB0aGF0CisJICogcmVtZW1iZXIgd2hhdCBsb2NhdGlvbnMgdGhlIHVzZXIgd2FudHMgdG8gbW9uaXRvci4gSWYgbm8gcHJlZmVyZW5jZXMKKwkgKiBleGlzdCBpdCB3aWxsIGNyZWF0ZSBvbmUgZm9yIHRoZSBhZ2dyZWdhdGVkIGRhdGEgYXQgdGhlIHdvcmxkIGxldmVsCisJICovCisJcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtb25pdG9yTG9jYXRpb25QcmVmZXJlbmNlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworCS8qKgorCSAqIHRoZSBJRCBvZiB0aGUgZGVmYXVsdCBsb2NhdGlvbiB0aGUgbG9jYXRpb24gSUQgZm9yIHRoZSBhZ2dyZWdhdGVkIGRhdGEgYXQKKwkgKiB0aGUgd29ybGQgbGV2ZWwKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MT0NBVElPTl9JRCA9ICJzdGVtOi8vb3JnLmVjbGlwc2Uuc3RlbS9ub2RlL2dlby9yZWdpb24vWlpaIjsKKworCS8qKgorCSAqIFByZWZpeCB0byBhbGwgbm9kZSBVUkkncworCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfUFJFRklYID0gInN0ZW06Ly9vcmcuZWNsaXBzZS5zdGVtL25vZGUvZ2VvL3JlZ2lvbi8iOworCisJLyoqCisJICogYW55IHByZWZlcmVuY2UgbG9jYXRpb24ga2V5IG11c3QgY29udGFpbiB0aGlzIHN1YnN0cmluZworCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9LRVlfU1VCU1RSSU5HID0gImxvY2F0aW9uLiI7CisKKwkvKioKKwkgKiB0aGUga2V5IHRvIHRoZSBkZWZhdWx0IGxvY2F0aW9uIHNob3VsZCBhbHdheXMgYmUgZGVmaW5lZCBhbmQgc2hvdWxkIHBvaW50CisJICogdG8gdGhlIGxvY2F0aW9uIElEIGZvciB0aGUgYWdncmVnYXRlZCBkYXRhIGF0IHRoZSB3b3JsZCBsZXZlbAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xPQ0FUSU9OX0tFWSA9ICJkZWZhdWx0LmxvY2F0aW9uSUQiOworCisJLyoqCisJICogCisJICovCisJcHVibGljIE1vbml0b3JQcmVmZXJlbmNlcygpIHsKKworCQlpZiAocHJlZnMuY29udGFpbnMoREVGQVVMVF9MT0NBVElPTl9LRVkpKSB7CisJCQlTdHJpbmcgdXJpID0gcHJlZnMuZ2V0U3RyaW5nKERFRkFVTFRfTE9DQVRJT05fS0VZKTsKKwkJCWlmICh1cmkgIT0gREVGQVVMVF9MT0NBVElPTl9JRCkgeworCQkJCXNldERlZmF1bHRMb2NhdGlvbigpOworCQkJfSBlbHNlIHsKKwkJCQltb25pdG9yTG9jYXRpb25QcmVmZXJlbmNlcy5hZGQodXJpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIHNldCB0aGUgZGVmYXVsdCBJRAorCQkJc2V0RGVmYXVsdExvY2F0aW9uKCk7CisJCX0KKworCQkvLyBub3cgY2hlY2sgdGhlIG90aGVyIFVSSSdzCisJCVN0cmluZ1tdIGFsbEtleXMgPSBwcmVmcy5wcm9wZXJ0eU5hbWVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsS2V5cy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGFsbEtleXNbaV0uY29udGFpbnMoTE9DQVRJT05fS0VZX1NVQlNUUklORykKKwkJCQkJfHwgYWxsS2V5c1tpXS5jb250YWlucyhERUZBVUxUX0xPQ0FUSU9OX0tFWSkpIHsKKwkJCQlTdHJpbmcgbmV4dElEID0gcHJlZnMuZ2V0U3RyaW5nKGFsbEtleXNbaV0pOworCQkJCW1vbml0b3JMb2NhdGlvblByZWZlcmVuY2VzLmFkZChuZXh0SUQpOworCQkJfQorCQl9IC8vIGZvciBhbGwga2V5cworCisJfSAvLyBjb25zdHJ1Y3RvcgorCisJLyoqCisJICogCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdExvY2F0aW9uKCkgeworCQlwcmVmcy5zZXRWYWx1ZShERUZBVUxUX0xPQ0FUSU9OX0tFWSwgREVGQVVMVF9MT0NBVElPTl9JRCk7CisJCW1vbml0b3JMb2NhdGlvblByZWZlcmVuY2VzLmFkZChERUZBVUxUX0xPQ0FUSU9OX0lEKTsKKwkJcGx1Z2luLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOworCX0KKworCS8qKgorCSAqIAorCSAqIEByZXR1cm4gYSBzZXQgb2YgcHJlZmVycmVkIGxvY2F0aW9ucyB0byBtb25pdG9yCisJICovCisJcHVibGljIFNldDxTdHJpbmc+IGdldE1vbml0b3JMb2NhdGlvblByZWZlcmVuY2VzKCkgeworCQlyZXR1cm4gbW9uaXRvckxvY2F0aW9uUHJlZmVyZW5jZXM7CisJfQorCisJLyoqCisJICogQHBhcmFtIG1vbml0b3JMb2NhdGlvblByZWZlcmVuY2VzCisJICovCisJcHVibGljIHZvaWQgc2V0TW9uaXRvckxvY2F0aW9uUHJlZmVyZW5jZXMoCisJCQlTZXQ8U3RyaW5nPiBtb25pdG9yTG9jYXRpb25QcmVmZXJlbmNlcykgeworCQl0aGlzLm1vbml0b3JMb2NhdGlvblByZWZlcmVuY2VzID0gbW9uaXRvckxvY2F0aW9uUHJlZmVyZW5jZXM7CisJfQorCisJLyoqCisJICogQHBhcmFtIG5ld0lECisJICovCisJcHVibGljIHZvaWQgYWRkTG9jYXRpb25QcmVmKFN0cmluZyBuZXdJRCkgeworCQlpZiAocHJlZnMgIT0gbnVsbCkgeworCQkJLy8gaXMgaXQgcmVhbGx5IG5ldz8KKworCQkJaWYgKCFtb25pdG9yTG9jYXRpb25QcmVmZXJlbmNlcy5jb250YWlucyhuZXdJRCkpIHsKKwkJCQkvLyB3ZSB1c2UgdGhlIHVyaSBiZWluZyBhZGRlZCB0byBnZW5lcmF0ZSBhIHVuaXF1ZSBrZXkKKwkJCQkvLyBieSBjb25jYXRlbmF0aW5nICJsb2NhdGlvbi4iK25ld1VSSQorCQkJCS8vIHByZWZlcmVuY2VzIGtleXMgbXVzdCBiZSB1bmlxdWUKKwkJCQkvLyB0aGlzIGFsc28gZ3VhcmFudGVlcyB3ZSBuZXZlciBkdXBsaWNhdGUgdGhlIHNhbWUgbG9jYXRpb24KKwkJCQlwcmVmcy5zZXRWYWx1ZShMT0NBVElPTl9LRVlfU1VCU1RSSU5HICsgbmV3SUQsIG5ld0lEKTsKKwkJCQl0aGlzLm1vbml0b3JMb2NhdGlvblByZWZlcmVuY2VzLmFkZChuZXdJRCk7CisJCQkJcGx1Z2luLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOworCQkJfSAvLyBpdCBJRCBpcyByZWFsbHkgbmV3CisJCX0gLy8gaWYgcHJlZnMgbm90IG51bGwKKwl9IC8vIGFkZExvY2F0aW9uUHJlZgorCisJLyoqCisJICogQHBhcmFtIG9sZElECisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlTG9jYXRpb25QcmVmKFN0cmluZyBvbGRJRCkgeworCQlpZiAocHJlZnMgIT0gbnVsbCkgeworCQkJLy8gaXMgaXQgcmVhbGx5IG5ldz8KKwkJCWlmICghbW9uaXRvckxvY2F0aW9uUHJlZmVyZW5jZXMuY29udGFpbnMob2xkSUQpKQorCQkJCXRoaXMubW9uaXRvckxvY2F0aW9uUHJlZmVyZW5jZXMucmVtb3ZlKG9sZElEKTsKKwkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTW9uaXRvclByZWZlcmVuY2VzKCkgbmVlZCBtZXRob2QgdG8gcmVtb3ZlCisJCQkvLyBwcmVmZXJlbmNlIG5hbWUgdmFsdWUgcGFpcnMgZm9yICIrb2xkSUQpOworCisJCQkvLyBkb2VzIG5vdCB3b3JrLiBObyByZW1vdmUgbWV0aG9kPworCQkJLy8gcHJlZnMuc2V0VG9EZWZhdWx0KG9sZElEKTsKKwkJCS8vIHByZWZzLnNldFZhbHVlKG9sZElELCAiIik7CisJCQlwbHVnaW4uc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7CisJCX0gLy8gaWYgcHJlZnMgbm90IG51bGwKKwl9IC8vIHJlbW92ZUxvY2F0aW9uUHJlZgorCisJLyoqCisJICogcmVtb3ZlcyB0aGUgdXJpIHByZWZpeCBmcm9tIGFuIHN0cmluZyBJRAorCSAqIAorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcmV0dXJuIFVSSXN1ZmZpeCAtIHRoZSBnZW9ncmFwaGljIGNvZGUgcGFydCBvZiB0aGUgdXJpCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VVJJc3VmZml4KFN0cmluZyB1cmkpIHsKKwkJU3RyaW5nIHJldFZhbCA9IHVyaS5yZXBsYWNlQWxsKFVSSV9QUkVGSVgsICIiKTsKKwkJcmV0dXJuIHJldFZhbDsKKwl9Ly8gZ2V0IHVyaSBzdWZmaXgKKworCS8qKgorCSAqIHJldHVybnMgdGhlIGRlZmF1bHQgbG9jYXRpb24gSUQgYXMgYSBVUkkKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBVUkkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFVSSSBnZXREZWZhdWx0VVJJKCkgeworCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShERUZBVUxUX0xPQ0FUSU9OX0lEKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy9wcmVmZXJlbmNlcy9Mb2dnaW5nUHJlZmVyZW5jZVBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy9wcmVmZXJlbmNlcy9Mb2dnaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTIxNWJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9sb2dnZXJzL3ByZWZlcmVuY2VzL0xvZ2dpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMucHJlZmVyZW5jZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Cb29sZWFuRmllbGRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHByZWZlcmVuY2UgcGFnZSB0aGF0IGlzIGNvbnRyaWJ1dGVkIHRvIHRoZQorICogUHJlZmVyZW5jZXMgZGlhbG9nLiBCeSBzdWItY2xhc3NpbmcgPHNhbXA+RmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTwvc2FtcD4sCisgKiB3ZSBjYW4gdXNlIHRoZSBmaWVsZCBzdXBwb3J0IGJ1aWx0IGludG8gSkZhY2UgdGhhdCBhbGxvd3MgdXMgdG8gY3JlYXRlIGEgcGFnZQorICogdGhhdCBpcyBzbWFsbCBhbmQga25vd3MgaG93IHRvIHNhdmUsIHJlc3RvcmUgYW5kIGFwcGx5IGl0c2VsZi4KKyAqIDxwPgorICogVGhpcyBwYWdlIGlzIHVzZWQgdG8gbW9kaWZ5IHByZWZlcmVuY2VzIG9ubHkuIFRoZXkgYXJlIHN0b3JlZCBpbiB0aGUKKyAqIHByZWZlcmVuY2Ugc3RvcmUgdGhhdCBiZWxvbmdzIHRvIHRoZSBtYWluIHBsdWctaW4gY2xhc3MuIFRoYXQgd2F5LAorICogcHJlZmVyZW5jZXMgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IHZpYSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KKyAqLworCitwdWJsaWMgY2xhc3MgTG9nZ2luZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCisJCUlXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7CisKKwkvKioKKwkgKiBEZWZhdWx0IGxvZ2dpbmcgc2V0dGluZworCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUZBVUxUX0xPR0dJTkdfRkxBRyA9IGZhbHNlOworCQorCS8qKgorCSAqIFRoZSBJRCBvZiB0aGUgU1RFTSBQcmVmZXJlbmNlIHBhZ2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfTE9HR0lOR19QUkVGRVJFTkNFX1BBR0UgPSAib3JnLmVjbGlwc2Uuc3RlbS51aS5wcmVmZXJlbmNlcy5Mb2dnaW5nUHJlZmVyZW5jZVBhZ2UiOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgTG9nZ2luZ1ByZWZlcmVuY2VQYWdlKCkgeworCQlzdXBlcihHUklEKTsKKwkJc2V0UHJlZmVyZW5jZVN0b3JlKG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLkFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOworCQlzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIkxvZ2dpbmdQUGFnZS5Mb2dnaW5nIikpOyAvLyROT04tTkxTLTEkCisJfSAvLyBTVEVNUHJlZmVyZW5jZVBhZ2UKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGZpZWxkIGVkaXRvcnMuIEZpZWxkIGVkaXRvcnMgYXJlIGFic3RyYWN0aW9ucyBvZiB0aGUgY29tbW9uCisJICogR1VJIGJsb2NrcyBuZWVkZWQgdG8gbWFuaXB1bGF0ZSB2YXJpb3VzIHR5cGVzIG9mIHByZWZlcmVuY2VzLiBFYWNoIGZpZWxkCisJICogZWRpdG9yIGtub3dzIGhvdyB0byBzYXZlIGFuZCByZXN0b3JlIGl0c2VsZi4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7CisJCWZpbmFsIEJvb2xlYW5GaWVsZEVkaXRvciBpbnRlZ2VyRmllbGRFZGl0b3IgPSBuZXcgQm9vbGVhbkZpZWxkRWRpdG9yKAorCQkJCVByZWZlcmVuY2VDb25zdGFudHMuTE9HX0lOVEVHRVJfUFJFRkVSRU5DRSwKKwkJCQlNZXNzYWdlcy5nZXRTdHJpbmcoIkxQYWdlSW50ZWdlciIpLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsgLy8kTk9OLU5MUy0xJAorCisJCWFkZEZpZWxkKGludGVnZXJGaWVsZEVkaXRvcik7CisJfSAvLyBjcmVhdGVGaWVsZEVkaXRvcnMKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKS8vJE5PTi1OTFMtMSQKKwkJCUlXb3JrYmVuY2ggd29ya2JlbmNoKSB7CisJCS8vIE5vdGhpbmcKKwl9IC8vIGluaXQKKworfSAvLyBTVEVNUHJlZmVyZW5jZVBhZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy9wcmVmZXJlbmNlcy9NZXNzYWdlcy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9sb2dnZXJzL3ByZWZlcmVuY2VzL01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYzNGJjMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy9wcmVmZXJlbmNlcy9NZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8vIE1lc3NhZ2VzLmphdmEKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMucHJlZmVyZW5jZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXRyaWV2ZXMgbWVzc2FnZXMgZm9yIFNURU0gcHJlZmVyZW5jZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlcyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLnByZWZlcmVuY2VzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKKwkJCS5nZXRCdW5kbGUoQlVORExFX05BTUUpOworCisJcHJpdmF0ZSBNZXNzYWdlcygpIHsKKwkJLy8gTm90aGluZworCX0KKworCS8qKgorCSAqIEBwYXJhbSBrZXkKKwkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgbWF0Y2hpbmcgdGhlIGtleQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7CisJCXRyeSB7CisJCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOworCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuICchJyArIGtleSArICchJzsKKwkJfQorCX0KK30gLy8gTWVzc2FnZXMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OTljOGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMucHJlZmVyZW5jZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIENvbnN0YW50IGRlZmluaXRpb25zIGZvciBwbHVnLWluIHByZWZlcmVuY2VzCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVmZXJlbmNlQ29uc3RhbnRzIHsKKworCS8qKgorCSAqIExvZ2dpbmcgZm9ybWF0CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0lOVEVHRVJfUFJFRkVSRU5DRSA9ICJvcmcuZWNsaXBzZS5zdGVtLmxvZ2dpbmcuaW50ZWdlcnMiOworCit9IC8vIFByZWZlcmVuY2VDb25zdGFudHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2RhZGNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9sb2dnZXJzL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMucHJlZmVyZW5jZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLkFjdGl2YXRvcjsKKworLyoqCisgKiBDbGFzcyB1c2VkIHRvIGluaXRpYWxpemUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KKyAqLworcHVibGljIGNsYXNzIFByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgeworCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKKwkJLy8gZm9yIG1hcCBhbmQgeS1heGlzIGRhdGEgZGlzcGxheQorCQlzdG9yZS5zZXREZWZhdWx0KFByZWZlcmVuY2VDb25zdGFudHMuTE9HX0lOVEVHRVJfUFJFRkVSRU5DRSwKKwkJCQkJCUxvZ2dpbmdQcmVmZXJlbmNlUGFnZS5ERUZBVUxUX0xPR0dJTkdfRkxBRyk7CisJCQorCX0KK30gLy8gUHJlZmVyZW5jZUluaXRpYWxpemVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvcHJlZmVyZW5jZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTc3MzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvcHJlZmVyZW5jZXMvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDE1IEBACisjIFByZWZlcmVuY2VNZXNzYWdlcy5wcm9wZXJ0aWVzCisjCisjIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMb2dnaW5nUFBhZ2UuTG9nZ2luZz1Mb2dnaW5nIHByZWZlcmVuY2VzCitMUGFnZUludGVnZXI9TG9nIGludGVnZXJzIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy91dGlsL1V0aWwuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy91dGlsL1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWUwNjkwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9sb2dnZXJzL3V0aWwvVXRpbC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMudXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwdWJsaWMgY2xhc3MgVXRpbCB7CisJCisJLy8gR2V0IHRoZSBwYXRoIGZyb20gdGhlIHdvcmtzcGFjZSBsb2NhdGlvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIFBBVEggPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNlcCA9IEZpbGUuc2VwYXJhdG9yOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzY2VuYXJpb3NVUkxQcmVmaXggPSAicGxhdGZvcm06L3Jlc291cmNlLyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGJ1aWx0SW5TY2VuYXJpb1Byb2plY3RGb2xkZXIgPSAiQnVpbHRJblNjZW5hcmlvcyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHJlY29yZGVkU2ltdWxhdGlvbnNGb2xkZXJOYW1lID0gIlJlY29yZGVkIFNpbXVsYXRpb25zIjsKKwkKKwkvKioKKwkgKiBHaXZlbiBhIHNjZW5hcmlvLCByZXR1cm4gdGhlIGZvbGRlciB3aGVyZSByZWNvcmRlZCBzaW11bGF0aW9ucyBhcmUgc3RvcmVkLgorCSAqIAorCSAqIEBwYXJhbSBzY2VuYXJpb1VSTAorCSAqIEByZXR1cm4gU3RyaW5nIEZvbGRlciB0byBzdG9yZSByZWNvcmRlZCBzaW11bGF0aW9ucworCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvZ2dpbmdGb2xkZXIoU3RyaW5nIHNjZW5hcmlvVVJMKSB7CisJCWJvb2xlYW4gYnVpbHRJblNjZW5hcmlvID0gc2NlbmFyaW9VUkwuc3RhcnRzV2l0aChzY2VuYXJpb3NVUkxQcmVmaXgpOworCQlJUGF0aCBwYXRoMTsKKwkJaWYoYnVpbHRJblNjZW5hcmlvKSB7CisJCQlTdHJpbmcgc2NlbmFyaW9SZWxhdGl2ZVBhdGggPSBzY2VuYXJpb1VSTC5zdWJzdHJpbmcoc2NlbmFyaW9zVVJMUHJlZml4Lmxlbmd0aCgpKTsKKwkJCXBhdGgxID0gUEFUSC5hcHBlbmQoc2NlbmFyaW9SZWxhdGl2ZVBhdGgpLnJlbW92ZUxhc3RTZWdtZW50cygyKTsKKwkJfSBlbHNlIHsKKwkJCXBhdGgxID0gUEFUSC5hcHBlbmQoYnVpbHRJblNjZW5hcmlvUHJvamVjdEZvbGRlcik7CisJCX0KKwkJU3RyaW5nIHBhdGggPSBwYXRoMS5hcHBlbmQoc2VwKS5hcHBlbmQocmVjb3JkZWRTaW11bGF0aW9uc0ZvbGRlck5hbWUpLnRvT1NTdHJpbmcoKTsKKwkJcmV0dXJuIHBhdGg7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9sb2dnZXJzL3ZpZXdzL0NTVkxvZ2dlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy92aWV3cy9DU1ZMb2dnZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M2ZDYzMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy92aWV3cy9DU1ZMb2dnZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLy8gQ1NWTG9nZ2VyRmFjdG9yeS5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIGZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBMb2dnZXJDb250cm9sfSBpbnN0YW5jZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBDU1ZMb2dnZXJGYWN0b3J5IGltcGxlbWVudHMgTG9nZ2VyQ29udHJvbEZhY3RvcnkgeworCisJLyoqCisJICogcHVibGljIElOU1RBTkNFIGZvciB0aGlzIEZhY3RvcnkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIENTVkxvZ2dlckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgQ1NWTG9nZ2VyRmFjdG9yeSgpOworCisJLyoqCisJICogQ29uc3RhbnRzIAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dFUl9UWVBFID0gIkNTVkxvZ2dlciI7CisJCisJLyoqCisJICogRW1wdHkgY29uc3RydWN0b3IKKwkgKi8KKwlwcml2YXRlIENTVkxvZ2dlckZhY3RvcnkoKSB7CisJCS8qCisJCSAqIGVtcHR5IGNvbnN0cnVjdG9yCisJCSAqLworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gcGFyZW50CisJICogQHBhcmFtIGRpck5hbWUKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbgorCSAqIEBwYXJhbSBkbSAKKwkgKiBAcmV0dXJuIG5ldyBEYXRhSGlzdG9yeUxvZ2dlcigpCisJICovCisJcHVibGljIExvZ2dlckNvbnRyb2wgY3JlYXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkaXJOYW1lLCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uLCBJbnRlZ3JhdGlvbkRlY29yYXRvciBkbSkgeworCQlOZXdDU1ZMb2dXcml0ZXIgIG5ld0NTVldyaXRlciA9IG5ldyBOZXdDU1ZMb2dXcml0ZXIoZGlyTmFtZSwgc2ltdWxhdGlvbiwgZG0pOworCQkKKwkJTG9nZ2VyQ29udHJvbCBjdHJsID0gbmV3IERhdGFIaXN0b3J5TG9nZ2VyKHBhcmVudCwgbmV3Q1NWV3JpdGVyLCBzaW11bGF0aW9uLCBkbSk7CisJCQorCQlyZXR1cm4gY3RybDsKKwl9CisJCisJLyoqCisJICogQHJldHVybiBUT0RPIEpGSworCSAqIAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29udHJvbFR5cGUoKSB7CisJCXJldHVybiBMT0dHRVJfVFlQRTsKKwl9CisKK30gLy8gQ1NWTG9nZ2VyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9sb2dnZXJzL3ZpZXdzL0NTVkxvZ2dlclZpZXcuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy92aWV3cy9DU1ZMb2dnZXJWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4YzA4YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy92aWV3cy9DU1ZMb2dnZXJWaWV3LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8vIENTVkxvZ2dlclZpZXcgCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKKworLyoqCisgKiBUaGlzIHZpZXcgY29udGFpbnMgQklSVCBvdXRwdXQgdGhhdCBwbG90cyB2YWx1ZXMgb2YgdmFyaWFibGVzIGluIFNURU0KKyAqIHNpbXVsYXRpb25zLgorICovCisKK3B1YmxpYyBjbGFzcyBDU1ZMb2dnZXJWaWV3IGV4dGVuZHMgVmlld1BhcnQgaW1wbGVtZW50cyBJU2VsZWN0aW9uTGlzdGVuZXIgeworCisJLy9wcml2YXRlIExpc3Q8SWRlbnRpZmlhYmxlPiBzZWxlY3RlZElkZW50aWZpYWJsZXMgPSBudWxsOworCisJCisJLyoqCisJICogVGhpcyBpcyB0aGUgZGVjb3JhdG9yIHRoYXQgaGFzIGJlZW4gc2VsZWN0ZWQgYnkgdGhlIGNvbWJvIGJveC4KKwkgKi8KKwlwcm90ZWN0ZWQgRGVjb3JhdG9yIHNlbGVjdGVkRGVjb3JhdG9yOworCisJcHJpdmF0ZSBMb2dnZXJWaWV3ZXIgbG9nZ2VyVmlld2VyOworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlsb2dnZXJWaWV3ZXIgPSBuZXcgTG9nZ2VyVmlld2VyKHBhcmVudCwgQ1NWTG9nZ2VyRmFjdG9yeS5JTlNUQU5DRSk7CisJCWxvZ2dlclZpZXdlci5zZXRJbnB1dChTaW11bGF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkpOworCQkKKwkvLwlsb2dnZXJWaWV3ZXIuYWRkQWxsQWN0aW9uQnV0dG9ucyhTaW11bGF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkpOworCisJCWdldFNpdGUoKS5zZXRTZWxlY3Rpb25Qcm92aWRlcihsb2dnZXJWaWV3ZXIpOworCisJCS8vIFJlZ2lzdGVyIHdpdGggdGhlIFNlbGVjdGlvblNlcnZpY2UKKwkJLy8gU3RlZmFuOiBDb21tZW50ZWQgb3V0IHNpbmNlIHdlIGRvbid0IGFsbG93CisJCS8vIGxvZ2dpbmcgb2YgaW5kaXZpZHVhbCBsb2NhdGlvbnMKKwkJCisvKgkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNlbGVjdGlvblNlcnZpY2UoKQorCQkJCS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKKyovCisJfSAvLyBjcmVhdGVQYXJ0Q29udHJvbAorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIEFOWVRISU5HIGlzIHNlbGVjdGVkIGluIHRoZSBFY2xpcHNlCisJICogd29ya2JlbmNoLiBJdCdzIGpvYiBpcyB0byBmaWx0ZXIgb3V0IHNlbGVjdGlvbnMgb2YgSVNpbXVsYXRpb24gaW5zdGFuY2VzCisJICogYW5kIHVwZGF0ZSB0aGUgY2hhcnQgaW4gdGhlIENTVkxvZ2dlckNhbnZhcworCSAqIEBwYXJhbSBwYXJ0IAorCSAqIEBwYXJhbSBzZWxlY3Rpb24gCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwKKwkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKGZpbmFsIElXb3JrYmVuY2hQYXJ0IHBhcnQsCisJCQlmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCSAgICAgLyoKKwkgICAgICAqIHRoaXMgbWV0aG9kIGlzIGVtcHR5IGJlY2F1c2Ugbm93IHdlIGxvZyB0aGUgZW50aXJlIHNpbXVsYXRpb24KKwkgICAgICAqIHdlIG5vdyBsb25nZXIgaGF2ZSB0byB0cmFjayBpbmRpdmlkdWFsIGxvY2F0aW9ucyBvZiBpZGVudGlmaWFibGVzIGFzCisJICAgICAgKiBsb2dnZWQvbm90IGxvZ2dlZAkKKwkgICAgICAqLworCisJfSAvLyBzZWxlY3Rpb25DaGFuZ2VkCisKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpCisJCQkJLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOworCX0gLy8gZGlzcG9zZQorCisJLyoqCisJICogVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgaW50ZXJmYWNlLCBidXQgd2UncmUgbm90IHVzaW5nIGl0LgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJLy8gTm90aGluZworCX0gLy8gc2V0Rm9jdXMKKworfSAvLyBDU1ZMb2dnZXJWaWV3CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvdmlld3MvQ3VzdG9tQ1NWTG9nZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvdmlld3MvQ3VzdG9tQ1NWTG9nZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzYzYzMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy92aWV3cy9DdXN0b21DU1ZMb2dnZXIuamF2YQpAQCAtMCwwICsxLDIyMSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLnRpbWUuVGltZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMudGltZS5UaW1lUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5EaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25MaXN0ZW5lclN5bmM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvblN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CisKKy8qKgorICogRGF0YUhpc3RvcnlMb2dnZXIKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbUNTVkxvZ2dlciAKKwlpbXBsZW1lbnRzIElTaW11bGF0aW9uTGlzdGVuZXJTeW5jIHsKKwkvKioKKwkgKiBUaGUge0BsaW5rIFNpbXVsYXRpb259IGZvciB0aGUgCisJICovCisJcHJvdGVjdGVkIElTaW11bGF0aW9uIHNpbXVsYXRpb24gPSBudWxsOworCS8qKgorCSAqIFRoZSB7QGxpbmsgRGlzZWFzZU1vZGVsfSBmb3IgdGhlIGxvZ2dlZCBkYXRhIAorCSAqLworCXByb3RlY3RlZCBJbnRlZ3JhdGlvbkRlY29yYXRvciBkaXNlYXNlTW9kZWwgPSBudWxsOworCS8qKgorCSAqIGFic3RyYWN0IGxvZyB3cml0ZXIKKwkgKi8KKwlMb2dXcml0ZXIgbG9nV3JpdGVyOworCS8qKgorCSAqIHRoaXMgc2ltdWxhdGlvbnMgZ3JhcGgKKwkgKi8KKwlHcmFwaCBncmFwaCA9IG51bGw7CisJLyoqCisJICogdGhlIHRpbWUgcHJvdmlkZXIgdGVsbHMgc2ltdWxhdGlvbiB0aW1lCisJICovCisJVGltZVByb3ZpZGVyIHRpbWVQcm92aWRlciA9IG51bGw7CisJCisJcHJvdGVjdGVkIE1hcDxOb2RlLCBJbnRlZ2VyPiBub2RlTGV2ZWxzOworCisJLyoqCisJICogQHBhcmFtIG91dHB1dERpcgorCSAqIEBwYXJhbSBzaW11bGF0aW9uIAorCSAqIEBwYXJhbSBkbQorCSAqLworCXB1YmxpYyBDdXN0b21DU1ZMb2dnZXIoZmluYWwgU3RyaW5nIG91dHB1dERpciwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbiwgSW50ZWdyYXRpb25EZWNvcmF0b3IgZG0pIHsKKwkJdGhpcy5sb2dXcml0ZXIgPSBuZXcgTmV3Q1NWTG9nV3JpdGVyKG91dHB1dERpciwgc2ltdWxhdGlvbiwgZG0pOworCQlzZXRTaW11bGF0aW9uKHNpbXVsYXRpb24pOworCQl0aGlzLmRpc2Vhc2VNb2RlbCA9IGRtOworCX0KKwkKKwkvKioKKwkgKiBTZXR0aW5nIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0gaGFzIHRoZSBzaWRlLWVmZmVjdCBvZiBjYXVzaW5nIHRoZSBjb250cm9sCisJICogdG8gcmVtb3ZlIGl0c2VsZiBhcyBhIGxpc3RlbmVyIGZyb20gYW55IHByZXZpb3VzbHkgc2V0IHtAbGluayBTaW11bGF0aW9ufQorCSAqIGFuZCBhZGRpbmcgaXRzZWxmIGFzIGEgbGlzdGVuZXIgdG8gdGhlIG5ldyBvbmUuIEl0IHdpbGwgYWxzbyBjYXVzZSB0aGUKKwkgKiBpbWFnZSB0byBiZSBpbml0aWFsaXplZCBmcm9tIHRoZSBjb250ZW50cyBvZiB0aGUgbmV3IHtAbGluayBTaW11bGF0aW9ufQorCSAqIGFzIGFwcHJvcHJpYXRlLgorCSAqIAorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogICAgICAgICAgICB0aGUgc2ltdWxhdGlvbiB3aG9zZSBMYXQvTG9uZyBkYXRhIHdpbGwgYmUgcmVuZGVyZWQuCisJICovCisJcHVibGljIGZpbmFsIHZvaWQgc2V0U2ltdWxhdGlvbihmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uKSB7CisJCS8vIEFueSBuZWVkIHRvIHN3aXRjaD8KKwkJaWYgKHRoaXMuc2ltdWxhdGlvbiA9PSBzaW11bGF0aW9uKSB7CisJCQkvLyBObworCQkJcmV0dXJuOworCQl9IC8vIGlmIG5vIG5lZWQgdG8gc3dpdGNoPworCisJCS8vIFNob3VsZCB3ZSByZW1vdmUgb3Vyc2VsdmVzIGFzIGxpc3RlbmVycyBmcm9tIHRoZSBjdXJyZW50IHNpbXVsYXRpb24/CisJCWlmICh0aGlzLnNpbXVsYXRpb24gIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQl0aGlzLnNpbXVsYXRpb24ucmVtb3ZlU2ltdWxhdGlvbkxpc3RlbmVyU3luYyh0aGlzKTsKKwkJfQorCisJCXRoaXMubm9kZUxldmVscyA9IHRoaXMuZ2V0Tm9kZUxldmVscyhzaW11bGF0aW9uKTsKKwkJCisJCXRoaXMuc2ltdWxhdGlvbiA9IHNpbXVsYXRpb247CisJCS8vIFdhcyB0aGVyZSBhIG5ldyBzaW11bGF0aW9uIHRvIHN3aXRjaCB0bz8KKwkJaWYgKHRoaXMuc2ltdWxhdGlvbiAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXRoaXMuc2ltdWxhdGlvbi5hZGRTaW11bGF0aW9uTGlzdGVuZXJTeW5jKHRoaXMpOworCQkJaW5pdGlhbGl6ZUZyb21TaW11bGF0aW9uKHRoaXMuc2ltdWxhdGlvbik7CisJCX0gZWxzZSB7CisJCQkvLyBObworCQkJLy8gSnVzdCBkaXNwbGF5IGEgYmxhbmsgc2NyZWVuCisJCQkvL2luaXRpYWxpemVGcm9tU2ltdWxhdGlvbihudWxsKTsKKwkJfQorCisJCWZsdXNoTG9nZ2VyRGF0YSgpOworCX0gLy8gc2V0U2ltdWxhdGlvbgorCQorCS8qKgorCSAqIEluaXRpYWxpemUgdGhlIGNvbnRyb2wgZnJvbSBhIHtAbGluayBTaW11bGF0aW9ufSBpbnN0YW5jZS4KKwkgKiAKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbgorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBTaW11bGF0aW9ufSB3aG9zZSBzdGF0ZSB3aWxsIGJlIHZpc3VhbGl6ZWQgaW4gdGhlCisJICogICAgICAgICAgICBjb250cm9sLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tU2ltdWxhdGlvbihmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uKSB7CisJCWdyYXBoID0gc2ltdWxhdGlvbi5nZXRTY2VuYXJpbygpLmdldENhbm9uaWNhbEdyYXBoKCk7CisKKwkJdGltZVByb3ZpZGVyID0gKFRpbWVQcm92aWRlcikgVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkuYWRhcHQoZ3JhcGgsIFRpbWVQcm92aWRlci5jbGFzcyk7CisJfSAvLyBpbml0aWFsaXplRnJvbVNpbXVsYXRpb24KKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIGZsdXNoTG9nZ2VyRGF0YSgpIHsKKwkJaWYgKGxvZ1dyaXRlciAhPSBudWxsKSB7CisJCQlsb2dXcml0ZXIuZmx1c2hMb2dnZXJEYXRhKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uTGlzdGVuZXJTeW5jI3NpbXVsYXRpb25DaGFuZ2VkU3luYyhvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgc2ltdWxhdGlvbkNoYW5nZWRTeW5jKGZpbmFsIFNpbXVsYXRpb25FdmVudCBldmVudCkgeworCQkvLyBEYXRhIHRvIGxvZyA/CisJCWlmIChldmVudC5nZXRTaW11bGF0aW9uU3RhdGUoKSA9PSBTaW11bGF0aW9uU3RhdGUuUlVOTklORykgeworCQkJaWYgKChsb2dXcml0ZXIgIT0gbnVsbCkgJiYgKGxvZ1dyaXRlci5uZWVkc0hlYWRlcikpIHsKKwkJCQkvLyBUaGlzIHdpbGwgd3JpdGUgdGhlIGhlYWRlcnMgYW5kIHRoZSBmaXJzdCBsaW5lIG9mIGRhdGEgYmVmb3JlIGZpcnN0IGN5Y2xlCisJCQkJbG9nV3JpdGVyLmxvZ0hlYWRlcih0aGlzLnNpbXVsYXRpb24sIHRoaXMuZGlzZWFzZU1vZGVsLCB0aGlzLm5vZGVMZXZlbHMsIHRpbWVQcm92aWRlcik7CisJCQkJLy9sb2dXcml0ZXIubG9nRGF0YSh0aGlzLnNpbXVsYXRpb24sIHRoaXMuZGlzZWFzZU1vZGVsLCB0aGlzLm5vZGVMZXZlbHMsIHRpbWVQcm92aWRlciwgdHJ1ZSk7CisJCQl9CisJCX0gZWxzZSBpZihldmVudC5nZXRTaW11bGF0aW9uU3RhdGUoKSA9PSBTaW11bGF0aW9uU3RhdGUuQ09NUExFVEVEX0NZQ0xFKSB7CisJCQkvLyBXcml0ZSBkYXRhIGFmdGVyIGVhY2ggY3ljbGUgb2Ygc2ltdWxhdGlvbgorCQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7CisJCQlpZiAoKGxvZ1dyaXRlciAhPSBudWxsKSAmJiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgeworCQkJCWlmIChsb2dXcml0ZXIgIT0gbnVsbCkgeworCQkJCQlsb2dXcml0ZXIubG9nRGF0YSh0aGlzLnNpbXVsYXRpb24sIHRoaXMuZGlzZWFzZU1vZGVsLCB0aGlzLm5vZGVMZXZlbHMsIHRpbWVQcm92aWRlciwgZmFsc2UpOworCQkJCX0KKwkJCX0gLy8gaWYKKwkJfSBlbHNlIAorCQkvLyBJcyB0aGUgU2ltdWxhdGlvbiBzdG9wcGluZyAoaS5lLiBiZWluZyBkZWxldGVkPykKKwkJaWYgKGV2ZW50LmdldFNpbXVsYXRpb25TdGF0ZSgpID09IFNpbXVsYXRpb25TdGF0ZS5TVE9QUEVEKSB7CisJCQljbG9zZSgpOworCQl9IC8vIGlmCisKKwl9IC8vIHNpbXVsYXRpb25DaGFuZ2VkCisJCisJLyoqCisJICogUmV0dXJuIGFsbCBub2RlcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBsZXZlbC4gV2UgdXNlIHRoaXMgdG8gbG9nIGRhdGEgdXNpbmcgCisJICogZGlmZmVyZW50IHJlc29sdXRpb25zLgorCSAqIAorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogQHJldHVybiBNYXAgd2l0aCBub2RlIGFuZCBsZXZlbAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQorCXByaXZhdGUgTWFwPE5vZGUsIEludGVnZXI+IGdldE5vZGVMZXZlbHMoSVNpbXVsYXRpb24gc2ltdWxhdGlvbikgeworCQlNYXA8Tm9kZSwgSW50ZWdlcj4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8Tm9kZSwgSW50ZWdlcj4oKTsKKwkJZmluYWwgR3JhcGggZ3JhcGggPSBzaW11bGF0aW9uLmdldFNjZW5hcmlvKCkuZ2V0Q2Fub25pY2FsR3JhcGgoKTsKKwkJaWYgKGdyYXBoICE9IG51bGwpIHsKKwkJCWZpbmFsIEVNYXA8VVJJLE5vZGU+IGFsbE5vZGVzID0gZ3JhcGguZ2V0Tm9kZXMoKTsKKwkJCWZpbmFsIFNldDxVUkk+IGFsbEdyYXBoVVJJcyA9IGFsbE5vZGVzLmtleVNldCgpOworCQkgICAgSXRlcmF0b3I8VVJJPiBncmFwaEl0ZXIyID0gYWxsR3JhcGhVUklzLml0ZXJhdG9yKCk7CisJCSAgCisJCSAgICB3aGlsZSgoZ3JhcGhJdGVyMiE9bnVsbCkmJihncmFwaEl0ZXIyLmhhc05leHQoKSkpIHsKKwkJICAgIAlVUkkgdXJpID0gZ3JhcGhJdGVyMi5uZXh0KCk7CisJCSAgICAJTm9kZSBub2RlID0gYWxsTm9kZXMuZ2V0KHVyaSk7CisJCSAgICAJLy8gQnVnIGZpeC4gTWFrZSBzdXJlIHRoZSBub2RlIGhhcyBsYWJlbHMKKwkJICAgIAlpZihub2RlLmdldExhYmVscygpLnNpemUoKSA9PSAwKSBjb250aW51ZTsKKwkJICAgIAlTdHJpbmcgaWQgPSAgbm9kZS5nZXRVUkkoKS50b1N0cmluZygpOworCQkgICAgCWludCBsZXZlbCA9IGdldEFkbWluTGV2ZWwoaWQpOworCQkgICAgCXJlc3VsdC5wdXQobm9kZSwgbGV2ZWwpOworCQkgICAgfQorCQl9IC8vIGdyYXBoIG5vdCBudWxsCisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCXByaXZhdGUgaW50IGdldEFkbWluTGV2ZWwoU3RyaW5nIHVyaUtleSkgeworCQlpbnQgcmV0VmFsID0gMDsKKwkJU3RyaW5nIHRlc3QgPSB1cmlLZXk7CisJCXdoaWxlKHRlc3QuY29udGFpbnMoIi0iKSkgeworCQkJcmV0VmFsICsrOworCQkJaW50IGlkeDEgPSB0ZXN0LmluZGV4T2YoIi0iKTsKKwkJCVN0cmluZyB0ZXN0MiA9IHRlc3Quc3Vic3RyaW5nKGlkeDErMSwgdGVzdC5sZW5ndGgoKSk7CisJCQl0ZXN0ID0gdGVzdDI7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisKKwkvKioKKwkgKgorCSAqLworCXB1YmxpYyB2b2lkIGNsb3NlKCkgeworCQlpZiAobG9nV3JpdGVyICE9IG51bGwpIHsKKwkJCWxvZ1dyaXRlci5mbHVzaExvZ2dlckRhdGEoKTsKKwkJfQorCQlpZiAobG9nV3JpdGVyICE9IG51bGwpIHsKKwkJCWxvZ1dyaXRlci5jbG9zZUxvZ2dlckRhdGEoKTsKKwkJfQorCQl0aGlzLmxvZ1dyaXRlciA9IG51bGw7CisKKwkJaWYgKHNpbXVsYXRpb24gIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlzaW11bGF0aW9uLnJlbW92ZVNpbXVsYXRpb25MaXN0ZW5lclN5bmModGhpcyk7CisJCX0gLy8gaWYKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvdmlld3MvRGF0YUhpc3RvcnlMb2dnZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy92aWV3cy9EYXRhSGlzdG9yeUxvZ2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MDJiY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvdmlld3MvRGF0YUhpc3RvcnlMb2dnZXIuamF2YQpAQCAtMCwwICsxLDM2NSBAQAorLy8gRGF0YUhpc3RvcnlMb2dnZXIuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5hZGFwdGVycy50aW1lLlRpbWVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmFkYXB0ZXJzLnRpbWUuVGltZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguR3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnJlbGF0aXZldmFsdWUuUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbkxpc3RlbmVyU3luYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuUHJvcGVydHlTZWxlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworCisvKioKKyAqIERhdGFIaXN0b3J5TG9nZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhSGlzdG9yeUxvZ2dlciBleHRlbmRzIExvZ2dlckNvbnRyb2wgaW1wbGVtZW50cworCQlJU2ltdWxhdGlvbkxpc3RlbmVyU3luYyB7CisKKwkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1BSRUZJWF9URVhUID0gIm5vZGUvZ2VvL3JlZ2lvbi8iOworCisJLyoqCisJICogVGhlIGxvY2F0aW9uIChub2RlKSBuYW1lIGxhYmVsCisJICovCisJTGFiZWwgbG9nZ2VyVHlwZUxhYmVsOworCisJLyoqCisJICogVGhlIGxvY2F0aW9uIChub2RlKSBpZCBsYWJlbAorCSAqLworCUxhYmVsIGxvZ2dlckRpc2Vhc2VMYWJlbDsKKworCS8qKgorCSAqIGFic3RyYWN0IGxvZyB3cml0ZXIKKwkgKi8KKwlMb2dXcml0ZXIgbG9nV3JpdGVyOworCisJLyoqCisJICogdGhpcyBzaW11bGF0aW9ucyBncmFwaAorCSAqLworCUdyYXBoIGdyYXBoID0gbnVsbDsKKworCS8qKgorCSAqIHRoZSB0aW1lIHByb3ZpZGVyIHRlbGxzIHNpbXVsYXRpb24gdGltZQorCSAqLworCVRpbWVQcm92aWRlciB0aW1lUHJvdmlkZXIgPSBudWxsOworCisJUHJvcGVydHlTZWxlY3RvciBwcm9wZXJ0eVNlbGVjdG9yOworCS8vTGlzdDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBzZWxlY3RlZFByb3BlcnRpZXM7CisKKwkvKioKKwkgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgc2VsZWN0IG91dCB0aGUgcHJvcGVydGllcworCSAqIHRvIGJlIGRpc3BsYXllZC4KKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5U2lldmUgeworCQkvKioKKwkJICogQHBhcmFtIGR5bmFtaWNMYWJlbAorCQkgKiAgICAgICAgICAgIHRoZSBsYWJlbCB0aGF0IGNvbnRhaW5zIHRoZSBjYW5kaWRhdGUgcHJvcGVydGllcyB0byBiZQorCQkgKiAgICAgICAgICAgIGRpc3BsYXllZC4KKwkJICogQHJldHVybiBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHRoZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlCisJCSAqICAgICAgICAgZGlzcGxheWVkIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgc2hvdWxkIGJlIGRpc3BsYXllZC4KKwkJICovCisJCUxpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gc2lldmUoZmluYWwgRHluYW1pY0xhYmVsIGR5bmFtaWNMYWJlbCk7CisJfSAvLyBQcm9wZXJ0eVNpZXZlCisKKwkvKioKKwkgKiBUaGlzIHNpZXZlIHNlbGVjdHMgYWxsIG9mIHRob3NlIHByb3BlcnRpZXMgdGhhdCBoYXZlIHJlbGF0aXZlIHZhbHVlcy4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIFByb3BlcnR5U2lldmUgcHJvcGVydHlTaWV2ZSA9IG5ldyBQcm9wZXJ0eVNpZXZlKCkgeworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5zdGVtLnVpLndpZGdldHMuUHJvcGVydHlTZWxlY3Rvci5Qcm9wZXJ0eVNpZXZlI3NpZXZlKG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5EeW5hbWljTGFiZWwpCisJCSAqLworCQlwdWJsaWMgTGlzdDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBzaWV2ZSgKKwkJCQlmaW5hbCBEeW5hbWljTGFiZWwgZHluYW1pY0xhYmVsKSB7CisJCQlmaW5hbCBMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHJldFZhbHVlID0gbmV3IEFycmF5TGlzdDxJdGVtUHJvcGVydHlEZXNjcmlwdG9yPigpOworCQkJZmluYWwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciBydnAgPSAoUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlcikgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkJLmFkYXB0KGR5bmFtaWNMYWJlbCwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyLmNsYXNzKTsKKworCQkJLy8gRG9lcyB0aGUgbGFiZWwgaGF2ZSByZWxhdGl2ZSB2YWx1ZXM/CisJCQlpZiAocnZwICE9IG51bGwpIHsKKwkJCQkvLyBZZXMKKwkJCQlydnAuc2V0VGFyZ2V0KGR5bmFtaWNMYWJlbCk7CisKKwkJCQlmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogcnZwLmdldFByb3BlcnRpZXMoKSkgeworCQkJCQlmaW5hbCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5ID0gKEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIGVsZW1lbnQ7CisJCQkJCXJldFZhbHVlLmFkZChwcm9wZXJ0eSk7CisJCQkJfSAvLyBmb3IgZWFjaCBwcm9wZXJ0eQorCQkJfSAvLyBpZiB0aGUgbGFiZWwgaGFzIHJlbGF0aXZlIHZhbHVlcworCQkJcmV0dXJuIHJldFZhbHVlOworCQl9IC8vIHNpZXZlCisJfTsKKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gbG9nV3JpdGVyCisJICogQHBhcmFtIHNpbXVsYXRpb24gCisJICogQHBhcmFtIGRtCisJICovCisJcHVibGljIERhdGFIaXN0b3J5TG9nZ2VyKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExvZ1dyaXRlciBsb2dXcml0ZXIsIElTaW11bGF0aW9uIHNpbXVsYXRpb24sIEludGVncmF0aW9uRGVjb3JhdG9yIGRtKSB7CisJCXN1cGVyKHBhcmVudCwgU1dULk5vbmUpOworCQl0aGlzLmxvZ1dyaXRlciA9IGxvZ1dyaXRlcjsKKwkJc2V0U2ltdWxhdGlvbihzaW11bGF0aW9uKTsKKwkJc2V0RGlzZWFzZU1vZGVsKGRtKTsKKwkJY3JlYXRlQ29udGVudHMoKTsKKwl9IC8vIERhdGFIaXN0b3J5TG9nZ2VyCisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb2dnZXIKKwkgKi8KKwlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7CisJCWZpbmFsIEZpbGxMYXlvdXQgbGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoU1dULkhPUklaT05UQUwpOworCQlzZXRMYXlvdXQobGF5b3V0KTsKKworCQlmaW5hbCBDb21wb3NpdGUgaW5uZXIgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKKwkJZmluYWwgRm9ybUxheW91dCBpbm5lckxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7CisKKwkJaW5uZXIuc2V0TGF5b3V0KGlubmVyTGF5b3V0KTsKKworCQkKKwkJCisJCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHRoaXMuZ2V0RGlzcGxheSgpOworCQkKKwkJZmluYWwgQ29sb3IgY29sb3JDb2x1bW4xID0gbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMTgwLCAxODAsIDIwMCkpOworCQlmaW5hbCBDb2xvciBjb2xvckNvbHVtbjIgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigxOTAsIDE5MCwgMjIwKSk7CisJCWZpbmFsIENvbG9yIGNvbG9yQ29sdW1uMyA9IG5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKDE4MCwgMTgwLCAyMDApKTsKKwkJCisJCWZpbmFsIENvbG9yIGJnQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigxNzAsIDE3MCwgMTkwKSk7CisJCWlubmVyLnNldEJhY2tncm91bmQoYmdDb2xvcik7CisKKwkJcHJvcGVydHlTZWxlY3RvciA9IG5ldyBQcm9wZXJ0eVNlbGVjdG9yKGlubmVyLCBTV1QuTk9ORSwgdHJ1ZSk7CisJCQorCisJCQorCisJCWxvZ2dlclR5cGVMYWJlbCA9IG5ldyBMYWJlbChpbm5lciwgIFNXVC5DRU5URVIpOworCQlsb2dnZXJUeXBlTGFiZWwuc2V0QmFja2dyb3VuZChjb2xvckNvbHVtbjEpOworCQlsb2dnZXJUeXBlTGFiZWwuc2V0VGV4dCgiQ1NWIExvZ2dlciIpOworCQlsb2dnZXJUeXBlTGFiZWwuc2V0QWxpZ25tZW50KFNXVC5DRU5URVIpOworCQkKKwkJaWYoc2ltdWxhdGlvbk5hbWVMYWJlbCA9PSBudWxsKSB7CisJCQlzaW11bGF0aW9uTmFtZUxhYmVsID0gbmV3IExhYmVsKGlubmVyLCAgU1dULkNFTlRFUik7CisJCQlzaW11bGF0aW9uTmFtZUxhYmVsLnNldFRleHQoc2ltdWxhdGlvbi5nZXROYW1lKCkpOworCQkJc2ltdWxhdGlvbk5hbWVMYWJlbC5zZXRCYWNrZ3JvdW5kKGNvbG9yQ29sdW1uMik7CisJCQlzaW11bGF0aW9uTmFtZUxhYmVsLnNldEFsaWdubWVudChTV1QuQ0VOVEVSKTsKKwkJfQorCQkKKwkJbG9nZ2VyRGlzZWFzZUxhYmVsID0gbmV3IExhYmVsKGlubmVyLCAgU1dULkNFTlRFUik7CisJCWxvZ2dlckRpc2Vhc2VMYWJlbC5zZXRCYWNrZ3JvdW5kKGNvbG9yQ29sdW1uMyk7CisJCVN0cmluZyBpZHRleHQgPSBudWxsOworCQlpZih0aGlzLmRpc2Vhc2VNb2RlbCBpbnN0YW5jZW9mIERpc2Vhc2VNb2RlbCkKKwkJCWlkdGV4dCA9ICgoRGlzZWFzZU1vZGVsKXRoaXMuZGlzZWFzZU1vZGVsKS5nZXREaXNlYXNlTmFtZSgpOworCQllbHNlIGlmKHRoaXMuZGlzZWFzZU1vZGVsIGluc3RhbmNlb2YgUG9wdWxhdGlvbk1vZGVsKQorCQkJaWR0ZXh0ID0gKChQb3B1bGF0aW9uTW9kZWwpdGhpcy5kaXNlYXNlTW9kZWwpLmdldE5hbWUoKTsKKwkJCisJCWxvZ2dlckRpc2Vhc2VMYWJlbC5zZXRUZXh0KGlkdGV4dCk7CisJCWxvZ2dlckRpc2Vhc2VMYWJlbC5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7CisKKwkJLy8gTG9nZ2VyIE5hbWUgTGFiZWwKKwkJZmluYWwgRm9ybURhdGEgbG9nZ2VyTmFtZUxhYmVsRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJbG9nZ2VyTmFtZUxhYmVsRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlsb2dnZXJOYW1lTGFiZWxGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlsb2dnZXJOYW1lTGFiZWxGb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgyNSwgMCk7CisJCWxvZ2dlck5hbWVMYWJlbEZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOworCQlsb2dnZXJUeXBlTGFiZWwuc2V0TGF5b3V0RGF0YShsb2dnZXJOYW1lTGFiZWxGb3JtRGF0YSk7CisJCQorCQkvLyBTaW11bGF0aW9uIE5hbWUgTGFiZWwKKwkJZmluYWwgRm9ybURhdGEgc2ltdWxhdGlvbk5hbWVMYWJlbEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCXNpbXVsYXRpb25OYW1lTGFiZWxGb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXNpbXVsYXRpb25OYW1lTGFiZWxGb3JtRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDI1LCAwKTsKKwkJc2ltdWxhdGlvbk5hbWVMYWJlbEZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDUwLCAwKTsKKwkJc2ltdWxhdGlvbk5hbWVMYWJlbEZvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOworCQlzaW11bGF0aW9uTmFtZUxhYmVsLnNldExheW91dERhdGEoc2ltdWxhdGlvbk5hbWVMYWJlbEZvcm1EYXRhKTsKKworCQkvLyBJRCBMYWJlbAorCQlmaW5hbCBGb3JtRGF0YSBsb2dnZXJJZExhYmVsRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJbG9nZ2VySWRMYWJlbEZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJbG9nZ2VySWRMYWJlbEZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIDApOworCQlsb2dnZXJJZExhYmVsRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoOTAsIDApOworCQlsb2dnZXJJZExhYmVsRm9ybURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwMCk7CisJCWxvZ2dlckRpc2Vhc2VMYWJlbC5zZXRMYXlvdXREYXRhKGxvZ2dlcklkTGFiZWxGb3JtRGF0YSk7CisKKwkJLy8gUHJvcGVydHkgU2VsZWN0b3IKKwkJcHJvcGVydHlTZWxlY3Rvci5zZXRTaXplKDAsIDApOworCQlmaW5hbCBGb3JtRGF0YSBwcm9wZXJ0eVNlbGVjdG9yRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJcHJvcGVydHlTZWxlY3RvckZvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJcHJvcGVydHlTZWxlY3RvckZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJcHJvcGVydHlTZWxlY3RvckZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CisJCXByb3BlcnR5U2VsZWN0b3Iuc2V0TGF5b3V0RGF0YShwcm9wZXJ0eVNlbGVjdG9yRm9ybURhdGEpOworCisJCXByb3BlcnR5U2VsZWN0b3Iuc2V0VmlzaWJsZShmYWxzZSk7CisKKwkJCisJfSAvLyBjcmVhdGVDb250ZW50cworCisJLyoqCisJICogQHBhcmFtIGRlY29yYXRvcgorCSAqICAgICAgICAgICAgYSB7QGxpbmsgRGVjb3JhdG9yfSB0aGF0IG1vZGlmaWVzIHRoZSBzdGF0ZSBvZiB0aGUgY2Fub25pY2FsCisJICogICAgICAgICAgICB7QGxpbmsgR3JhcGh9IGluIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0uCisJICogQHBhcmFtIHNpbXVsYXRpb24KKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0KKwkgKiBAcmV0dXJuIGEge0BsaW5rIExpc3R9IG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB7QGxpbmsgRGVjb3JhdG9yfSB0aGF0CisJICogICAgICAgICBjYW4gc2hvdWxkIGJlIGRpc3BsYXllZC4KKwkgKi8KKwlMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnRpZXNUb0Rpc3BsYXkoCisJCQlmaW5hbCBEZWNvcmF0b3IgZGVjb3JhdG9yKSB7CisJCWZpbmFsIExpc3Q8SXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcmV0VmFsdWUgPSBuZXcgQXJyYXlMaXN0PEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+KCk7CisJCS8vIEdvdCBEZWNvcmF0b3I/CisJCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQkvLyBBcmUgdGhlcmUgYW55IGxhYmVscyB0byB1cGRhdGU/CisJCQlpZiAoIWRlY29yYXRvci5nZXRMYWJlbHNUb1VwZGF0ZSgpLmlzRW1wdHkoKSkgeworCQkJCS8vIFllcworCQkJCS8vIFRoZSBmaXJzdCBvbmUgaXMgZ29vZCBlbm91Z2gKKwkJCQlyZXRWYWx1ZS5hZGRBbGwocHJvcGVydHlTaWV2ZS5zaWV2ZShkZWNvcmF0b3IKKwkJCQkJCS5nZXRMYWJlbHNUb1VwZGF0ZSgpLmdldCgwKSkpOworCQkJfSAvLyBpZiBsYWJlbHMgdG8gdXBkYXRlCisJCX0gLy8gaWYgZ290IGRlY29yYXRvcgorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBnZXRQcm9wZXJ0aWVzVG9EaXNwbGF5CisKKwkvKioKKwkgKiB0byByZW1vdmUgdGhlIGNvbnRyb2wgZS5nLiBieSBhIHJlbW92ZSBidXR0b24gZXZlbnQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisJCWlmIChsb2dXcml0ZXIgIT0gbnVsbCkgeworCQkJbG9nV3JpdGVyLmZsdXNoTG9nZ2VyRGF0YSgpOworCQl9CisJCWlmIChsb2dXcml0ZXIgIT0gbnVsbCkgeworCQkJbG9nV3JpdGVyLmNsb3NlTG9nZ2VyRGF0YSgpOworCQl9CisJCXRoaXMubG9nV3JpdGVyID0gbnVsbDsKKwkJcmVtb3ZlTGlzdGVuZXJzLmNsZWFyKCk7CisKKwkJcHJvcGVydHlTZWxlY3Rvci5zZXREZWNvcmF0b3JzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOworCQlkaXNwb3NlKCk7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZSB0aGUgZGVjb3JhdG9ycyBhbmQgbGFiZWxzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2ltdWxhdGlvbgorCSAqIAorCSAqLworCisJcHVibGljIHZvaWQgc2V0SWRlbnRpZmlhYmxlKCkgeworCQkvL25vdGhpbmcKKwl9IAorCQorCS8qKgorCSAqIEluaXRpYWxpemUgdGhlIGNvbnRyb2wgZnJvbSBhIHtAbGluayBTaW11bGF0aW9ufSBpbnN0YW5jZS4KKwkgKiAKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbgorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBTaW11bGF0aW9ufSB3aG9zZSBzdGF0ZSB3aWxsIGJlIHZpc3VhbGl6ZWQgaW4gdGhlCisJICogICAgICAgICAgICBjb250cm9sLgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tU2ltdWxhdGlvbihmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uKSB7CisJCWdyYXBoID0gc2ltdWxhdGlvbi5nZXRTY2VuYXJpbygpLmdldENhbm9uaWNhbEdyYXBoKCk7CisKKwkJdGltZVByb3ZpZGVyID0gKFRpbWVQcm92aWRlcikgVGltZVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKKwkJCQkuYWRhcHQoZ3JhcGgsIFRpbWVQcm92aWRlci5jbGFzcyk7CisJfSAvLyBpbml0aWFsaXplRnJvbVNpbXVsYXRpb24KKworCS8qKgorCSAqIAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlZnJlc2gyKCkgeworCQlpZiAobG9nV3JpdGVyICE9IG51bGwpIHsKKwkJCWxvZ1dyaXRlci5mbHVzaExvZ2dlckRhdGEoKTsKKwkJfQorCX0gLy8gcmVmcmVzaDIKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb25MaXN0ZW5lclN5bmMjc2ltdWxhdGlvbkNoYW5nZWRTeW5jKG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25FdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzaW11bGF0aW9uQ2hhbmdlZFN5bmMoZmluYWwgU2ltdWxhdGlvbkV2ZW50IGV2ZW50KSB7CisJCS8vIERhdGEgdG8gbG9nID8KKwkJaWYgKGV2ZW50LmdldFNpbXVsYXRpb25TdGF0ZSgpID09IFNpbXVsYXRpb25TdGF0ZS5SVU5OSU5HKSB7CisJCQlpZiAoKGxvZ1dyaXRlciAhPSBudWxsKSAmJiAobG9nV3JpdGVyLm5lZWRzSGVhZGVyKSkgeworCQkJCS8vIFRoaXMgd2lsbCB3cml0ZSB0aGUgaGVhZGVycyBhbmQgdGhlIGZpcnN0IGxpbmUgb2YgZGF0YSBiZWZvcmUgZmlyc3QgY3ljbGUKKwkJCQlsb2dXcml0ZXIubG9nSGVhZGVyKHRoaXMuc2ltdWxhdGlvbiwgdGhpcy5kaXNlYXNlTW9kZWwsIHRoaXMubm9kZUxldmVscywgdGltZVByb3ZpZGVyKTsKKwkJCQkvLyBEb24ndCBsb2cgaGVyZSBzaW5jZSB0aGUgbW9kZWxzIGhhdmUgbm90IGNvbXBsZXRseSBiZWVuIGluaXRpYWxpemVkIHlldAorCQkJCS8vIChzZXF1ZW5jZXIgaGFzIG5vdCByZXdpbmRlZCB2YWx1ZXMpCisJCQkJLy9sb2dXcml0ZXIubG9nRGF0YSh0aGlzLnNpbXVsYXRpb24sIHRoaXMuZGlzZWFzZU1vZGVsLCB0aGlzLm5vZGVMZXZlbHMsIHRpbWVQcm92aWRlciwgdHJ1ZSk7CisJCQl9CisJCX0gZWxzZSBpZihldmVudC5nZXRTaW11bGF0aW9uU3RhdGUoKSA9PSBTaW11bGF0aW9uU3RhdGUuQ09NUExFVEVEX0NZQ0xFKSB7CisJCQkvLyBXcml0ZSBkYXRhIGFmdGVyIGVhY2ggY3ljbGUgb2Ygc2ltdWxhdGlvbgorCQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7CisJCQlpZiAoKGxvZ1dyaXRlciAhPSBudWxsKSAmJiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgeworCQkJCWlmIChsb2dXcml0ZXIgIT0gbnVsbCkgeworCQkJCQlsb2dXcml0ZXIubG9nRGF0YSh0aGlzLnNpbXVsYXRpb24sIHRoaXMuZGlzZWFzZU1vZGVsLCB0aGlzLm5vZGVMZXZlbHMsIHRpbWVQcm92aWRlciwgZmFsc2UpOworCQkJCX0KKwkJCX0gLy8gaWYKKwkJfSBlbHNlIAorCQkvLyBJcyB0aGUgU2ltdWxhdGlvbiBzdG9wcGluZyAoaS5lLiBiZWluZyBkZWxldGVkPykKKwkJaWYgKGV2ZW50LmdldFNpbXVsYXRpb25TdGF0ZSgpID09IFNpbXVsYXRpb25TdGF0ZS5TVE9QUEVEKSB7CisJCQkvLyBZZXMKKwkJCWlmIChsb2dXcml0ZXIgIT0gbnVsbCkgeworCQkJCWxvZ1dyaXRlci5jbG9zZUxvZ2dlckRhdGEoKTsKKwkJCX0KKwkJCWRpc3Bvc2UoKTsKKwkJfSAvLyBpZgorCisJfSAvLyBzaW11bGF0aW9uQ2hhbmdlZAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQjZGlzcG9zZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJaWYgKGxvZ1dyaXRlciAhPSBudWxsKSB7CisJCQlsb2dXcml0ZXIuY2xvc2VMb2dnZXJEYXRhKCk7CisJCX0KKwkJdGhpcy5sb2dXcml0ZXIgPSBudWxsOworCisJCWlmIChzaW11bGF0aW9uICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJc2ltdWxhdGlvbi5yZW1vdmVTaW11bGF0aW9uTGlzdGVuZXJTeW5jKHRoaXMpOworCQl9IC8vIGlmCisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9IC8vIGRpc3Bvc2UKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMudmlld3MuTG9nZ2VyQ29udHJvbCNnZXRJZGVudGlmaWFibGUoKQorCSAqLworCS8qQE92ZXJyaWRlCisJcHVibGljIElkZW50aWZpYWJsZSBnZXRJZGVudGlmaWFibGUoKSB7CisJCXJldHVybiBpZGVudGlmaWFibGU7CisJfQorKi8KK30gLy8gRGF0YUhpc3RvcnlMb2dnZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy92aWV3cy9JUmVtb3ZlTGlzdGVuZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy92aWV3cy9JUmVtb3ZlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGYyMjJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9sb2dnZXJzL3ZpZXdzL0lSZW1vdmVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8vIElSZW1vdmVMaXN0ZW5lcgorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworCisvKioKKyAqIFdoZW4gdGhlIHJlbW92ZSBidXR0b24gaXMgcHJlc3NlZCBieSB0aGUgdXNlcgorICogQGF1dGhvciBKYW1lcworICoKKyAqLworcHVibGljIGludGVyZmFjZSBJUmVtb3ZlTGlzdGVuZXIgeworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBpZGVudGlmaWFibGUKKwkgKi8KKwl2b2lkIGlkZW50aWZpYWJsZVJlbW92ZWQoSWRlbnRpZmlhYmxlIGlkZW50aWZpYWJsZSkgOworCQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvdmlld3MvTG9nV3JpdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvdmlld3MvTG9nV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiZTQ2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy92aWV3cy9Mb2dXcml0ZXIuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLy8gTG9nV3JpdGVyIAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMudGltZS5UaW1lUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkludGVncmF0aW9uRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uOworCisvKioKKyAqIEFic3RyYWN0IExvZ1dyaXRlciBjbGFzcworICogCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb2dXcml0ZXIgeworCQorCXByb3RlY3RlZCBzdGF0aWMgQ2FsZW5kYXIgbm93ID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwkKKwkvKioKKwkgKiBUaGlzIHByZWZpeCBwcmVjZWRlcyB0aGUgbm9kZSBpZCBhbmQgbXVzdCBiZSByZW1vdmVkIGluIHRoZSAKKwkgKiBmaWx0ZXJGaWxlbmFtZSBtZXRob2QgdG8gYXV0by1nZW5lcmF0ZSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTklEX1BSRUZJWCA9ICIvbm9kZS9nZW8vcmVnaW9uLyI7CisJCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2VwID0gRmlsZS5zZXBhcmF0b3I7CisJCisJLyoqCisJICogZmxhZyB0byBpbmRpY2F0ZSBIZWFkZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBuZWVkc0hlYWRlciA9IHRydWU7CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gZG9uZSA9IGZhbHNlOworCQorCisJCisJLyoqCisJICogCisJICogQHBhcmFtIHJ2cAorCSAqLworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGxvZ0hlYWRlcihSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyIHJ2cCk7CisJCisJLyoqCisJICogTmV3IG1ldGhvZAorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogQHBhcmFtIGRtIERpc2Vhc2VNb2RlbAorCSAqIEBwYXJhbSBub2RlTGV2ZWxzCisJICogQHBhcmFtIHRpbWVQcm92aWRlciBUaW1lIFByb3ZpZGVyCisJICovCisJCisJcHVibGljIGFic3RyYWN0IHZvaWQgbG9nSGVhZGVyKElTaW11bGF0aW9uIHNpbXVsYXRpb24sIEludGVncmF0aW9uRGVjb3JhdG9yIGRtLCBNYXA8Tm9kZSwgSW50ZWdlcj4gbm9kZUxldmVscywgVGltZVByb3ZpZGVyIHRpbWVQcm92aWRlcik7CisJCisJCisJLyoqCisJICogTXVzdCBGbHVzaCBhbmQgY2xvc2UgdGhlIGZpbGUKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmbHVzaExvZ2dlckRhdGEoKTsKKwkKKwkKKwkvKioKKwkgKiBNdXN0IEZsdXNoIGFuZCBjbG9zZSB0aGUgZmlsZQorCSAqLworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsb3NlTG9nZ2VyRGF0YSgpOworCQorCQorCQorCS8qKgorCSAqIE11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGxvZyBkYXRhIGluIHJ1biB0aHJlYWQKKwkgKiBAcGFyYW0gcnZwIAorCSAqIEBwYXJhbSB0aW1lUHJvdmlkZXIgCisJICogCisJICovCisJcHVibGljIGFic3RyYWN0IHZvaWQgbG9nRGF0YShSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyIHJ2cCwgVGltZVByb3ZpZGVyIHRpbWVQcm92aWRlcik7CisJCisJLyoqCisJICogSW1wbGVtZW50IHRoaXMgb25lIGZvciB0aGUgbmV3IGxvZ2dpbmcgbWV0aG9kCisJICogCisJICogQHBhcmFtIHNpbSBTaW11bGF0aW9uCisJICogQHBhcmFtIGRtIERpc2Vhc2UgbW9kZWwgdG8gbG9nCisJICogQHBhcmFtIG5vZGVMZXZlbHMgCisJICogQHBhcmFtIHRpbWVQcm92aWRlciB0aW1lUHJvdmlkZXIKKwkgKiBAcGFyYW0gYmVmb3JlU3RhcnQKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBsb2dEYXRhKElTaW11bGF0aW9uIHNpbSwgSW50ZWdyYXRpb25EZWNvcmF0b3IgZG0sIE1hcDxOb2RlLCBJbnRlZ2VyPm5vZGVMZXZlbHMsIFRpbWVQcm92aWRlciB0aW1lUHJvdmlkZXIsIGJvb2xlYW4gYmVmb3JlU3RhcnQpOworCQorCS8qKgorCSAqIHJlc2V0cyB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgYSBuZXcgc2V0IG9mIHJ1bnMKKwkgKiBieSByZXNldHRpbmcgdGhlIGNhbGVuZGFycworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpIHsKKwkJLy8gcmVzZXQgdGhlIGNhbGVuZGFyIGluIGNhc2Ugd2Ugc3RhcnQgYWdhaW4KKwkJbm93ID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwl9CisJCisJLyoqCisJICogZ2V0IHRoZSBjdXJyZW50IGRhdGUvdGltZSBpbiBudW1lcmljIGZvcm1hdAorCSAqIGZvciBsb2cgZGlyZWN0b3J5IG5hbWUKKwkgKiBAcmV0dXJuIGRhdGUgdGltZSBzdHJpbmcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREYXRlVGltZU51bWVyaWMoKSB7CisJCQorCQlpbnQgbW9udGggPSBub3cuZ2V0KENhbGVuZGFyLk1PTlRIKSArIDE7CisJCWludCBkYXkgPSBub3cuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCk7CisJCWludCB5ZWFyID0gbm93LmdldChDYWxlbmRhci5ZRUFSKTsKKwkJaW50IGhycyA9IG5vdy5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpKzE7CisJCWludCBtaW5zID0gbm93LmdldChDYWxlbmRhci5NSU5VVEUpOworCQkvL2ludCBzZWMgPSBub3cuZ2V0KENhbGVuZGFyLlNFQ09ORCk7CisJCQorCQkJCQorCQlTdHJpbmcgc21vbnRoID0gIiIrbW9udGg7CisJCWlmIChtb250aCA8IDEwKSBzbW9udGggPSAiMCIrc21vbnRoOworCQlTdHJpbmcgc2RheSA9ICIiK2RheTsKKwkJaWYgKGRheSA8IDEwKSBzZGF5ID0gIjAiK3NkYXk7CisJCVN0cmluZyBzaHJzID0gIiIraHJzOworCQlpZiAoaHJzIDwgMTApIHNocnMgPSAiMCIrc2hyczsKKwkJU3RyaW5nIHNtaW4gPSAiIittaW5zOworCQlpZiAobWlucyA8IDEwKSBzbWluID0gIjAiK3NtaW47CisJCS8vU3RyaW5nIHNzZWMgPSAiIitzZWM7CisJCS8vaWYgKHNlYyA8IDEwKSBzc2VjID0gIjAiK3NzZWM7CisJCVN0cmluZyB0aW1lID0gIiIreWVhcitzbW9udGgrc2RheSsiXyIrc2hycytzbWluOworCQlyZXR1cm4gdGltZTsKKwl9Ly9nZXREYXRlVGltZU51bWVyaWMKKwkKKwkvKioKKwkgKiBmaWx0ZXJzIHRoZSBsb2NhdGlvbiBpZCBwcmVmaXggZnJvbSB0aGUgYmVnaW5uaW5nIG9mCisJICogIGEgbm9kZXMgSUQgZm9yIGdlbmVyYXRpb24gb2YgYSBmaWxlIG5hbWUKKwkgKiBAcGFyYW0gdW5maWx0ZXJlZAorCSAqIEByZXR1cm4gdGhlIGZpbHRlcmVkIGZpbGUgbmFtZSB1c2luZyBsb2NhdGlvbiBpZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWx0ZXJGaWxlbmFtZShTdHJpbmcgdW5maWx0ZXJlZCkgeworCQlpbnQgbGFzdCA9IHVuZmlsdGVyZWQuaW5kZXhPZihMT0NBVElPTklEX1BSRUZJWCk7CisJCWlmIChsYXN0ID49MCkgeworCQkJbGFzdCArPSBMT0NBVElPTklEX1BSRUZJWC5sZW5ndGgoKTsKKwkJCXJldHVybiB1bmZpbHRlcmVkLnN1YnN0cmluZyhsYXN0LCB1bmZpbHRlcmVkLmxlbmd0aCgpKTsKKwkJfSAKKwkJcmV0dXJuIHVuZmlsdGVyZWQ7CisKKwkKKwl9CisKK30KKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvdmlld3MvTG9nZ2VyQ29udHJvbC5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9sb2dnZXJzL3ZpZXdzL0xvZ2dlckNvbnRyb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTYxMDdmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9sb2dnZXJzL3ZpZXdzL0xvZ2dlckNvbnRyb2wuamF2YQpAQCAtMCwwICsxLDMzMiBAQAorLy8gTG9nZ2VyQ29udHJvbAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kZWZpbml0aW9ucy5hZGFwdGVycy5yZWxhdGl2ZXZhbHVlLlJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5JU2ltdWxhdGlvbkxpc3RlbmVyU3luYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CisKKy8qKgorICogTG9nZ2VyQ29udHJvbCBpcyBhIHN1YmNsYXNzIG9mIENhbnZhcyBzdWl0YWJsZSBmb3IgY2hhcnQgZHJhd2luZ3MuCisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBMb2dnZXJDb250cm9sIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMKKwkJSVNpbXVsYXRpb25MaXN0ZW5lclN5bmMsIElTZWxlY3Rpb25Qcm92aWRlciB7CisKKwlwcm90ZWN0ZWQgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciBydnA7CisJcHJvdGVjdGVkIExhYmVsIHNpbXVsYXRpb25OYW1lTGFiZWw7CisJCisJLyoqCisJICogVGhlIHtAbGluayBTaW11bGF0aW9ufSBmb3IgdGhlIAorCSAqLworCXByb3RlY3RlZCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uID0gbnVsbDsKKwkKKwkvKioKKwkgKiBUaGUge0BsaW5rIERpc2Vhc2VNb2RlbH0gZm9yIHRoZSBsb2dnZWQgZGF0YSAKKwkgKi8KKwkKKwlwcm90ZWN0ZWQgSW50ZWdyYXRpb25EZWNvcmF0b3IgZGlzZWFzZU1vZGVsID0gbnVsbDsKKwkKKwlwcm90ZWN0ZWQgTWFwPE5vZGUsIEludGVnZXI+IG5vZGVMZXZlbHM7CisJCisJCisKKwkvKioKKwkgKiBUaGUgY29sbGVjdGlvbiBvZiBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHdhaXRpbmcgdG8gYmUgdG9sZCBhYm91dAorCSAqIHNlbGVjdGlvbnMuCisJICovCisJcHJvdGVjdGVkIGZpbmFsIExpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gbGlzdGVuZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+KCk7CisKKwkvKioKKwkgKiBUaGUgY29sbGVjdGlvbiBvZiBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHdhaXRpbmcgdG8gYmUgdG9sZCBhYm91dAorCSAqIHNlbGVjdGlvbnMuCisJICovCisJcHJvdGVjdGVkIGZpbmFsIExpc3Q8SVJlbW92ZUxpc3RlbmVyPiByZW1vdmVMaXN0ZW5lcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8SVJlbW92ZUxpc3RlbmVyPigpOworCisJLyoqCisJICogVGhlIDxjb2RlPklkZW50aWZpYWJsZTwvY29kZT4gdGhhdCB3YXMgbW9zdCByZWNlbnRseSBzZWxlY3RlZCwgb3IKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGhhcyBiZWVuIHNlbGVjdGVkLgorCSAqLworCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSB3aWR0aCBvZiB0aGUgbGF5b3V0IG1hcmdpbi4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVJHSU5fV0lEVEggPSA1OworCisJLyoqCisJICogVGhlIGhlaWdodCBvZiB0aGUgbGF5b3V0IG1hcmdpbi4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVJHSU5fSEVJR0hUID0gNTsKKworCS8qKgorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gc3R5bGUKKwkgKi8KKwlwdWJsaWMgTG9nZ2VyQ29udHJvbChmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBpbnQgc3R5bGUpIHsKKwkJc3VwZXIocGFyZW50LCBzdHlsZSk7CisKKwkJdGhpcy5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJCS8qKgorCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lciN3aWRnZXREaXNwb3NlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudCkKKwkJCSAqLworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQlmaW5hbCBEaXNwb3NlRXZlbnQgZSkgeworCQkJCWRpc3Bvc2UoKTsKKwkJCX0KKwkJfSk7CisKKwkJZmluYWwgRm9ybUxheW91dCBsYXlvdXQgPSBuZXcgRm9ybUxheW91dCgpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gTUFSR0lOX0hFSUdIVDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gTUFSR0lOX1dJRFRIOworCQlzZXRMYXlvdXQobGF5b3V0KTsKKworCX0gLy8gTG9nZ2VyQ29udHJvbAorCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBTV1QgY29udHJvbCB0aGF0IHRoaXMgY29tcG9zaXRlIHdpbGwgYmUgYSBjaGlsZCBvZgorCSAqIEByZXR1cm4gdGhlIFNXVCBDb21wb3NpdGUgdG8gYmUgZGlzcGxheWVkIGFib3ZlIHRoZSBNYXBDYW52YXMgaW4gdGhlCisJICogICAgICAgICBjb250cm9sCisJICovCisJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworCQkvL2ZpbmFsIENvbXBvc2l0ZSB0b3BDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCisJCQorCQkKKwkJcmV0dXJuIHBhcmVudDsKKwl9IC8vIGNyZWF0ZVRvcENvbXBvc2l0ZQorCisJCisJCisJLyoqCisJICogQWxsIGNvbnRyb2xsZXJzIG11c3QgaW1wbGVtZW50IHRoaXMgCisJICogdG8gcmVtb3ZlIHRoZSBjb250cm9sIGUuZy4gYnkgYSByZW1vdmUgYnV0dG9uIGV2ZW50CisJICovCisJcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlKCkgOworCQorCS8qKgorCSAqIAorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqLworCXB1YmxpYyB2b2lkIGFkZElSZW1vdmVMaXN0ZW5lcihJUmVtb3ZlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJcmVtb3ZlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorCQorCS8qKgorCSAqIAorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUlSZW1vdmVMaXN0ZW5lcihJUmVtb3ZlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJcmVtb3ZlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfQorCQorCS8qKgorCSAqIAorCSAqIEBwYXJhbSBpZGVudAorCSAqLworCXB1YmxpYyB2b2lkIGZpcmVSZW1vdmVFdmVudChJZGVudGlmaWFibGUgaWRlbnQpIHsKKwkJZm9yIChmaW5hbCBJUmVtb3ZlTGlzdGVuZXIgbGlzdGVuZXIgOiByZW1vdmVMaXN0ZW5lcnMpIHsKKwkJCWxpc3RlbmVyLmlkZW50aWZpYWJsZVJlbW92ZWQoaWRlbnQpOworCQl9IC8vIGZvciBlYWNoIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKKwl9CisKKwkvKioKKwkgKiBTZXR0aW5nIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn0gaGFzIHRoZSBzaWRlLWVmZmVjdCBvZiBjYXVzaW5nIHRoZSBjb250cm9sCisJICogdG8gcmVtb3ZlIGl0c2VsZiBhcyBhIGxpc3RlbmVyIGZyb20gYW55IHByZXZpb3VzbHkgc2V0IHtAbGluayBTaW11bGF0aW9ufQorCSAqIGFuZCBhZGRpbmcgaXRzZWxmIGFzIGEgbGlzdGVuZXIgdG8gdGhlIG5ldyBvbmUuIEl0IHdpbGwgYWxzbyBjYXVzZSB0aGUKKwkgKiBpbWFnZSB0byBiZSBpbml0aWFsaXplZCBmcm9tIHRoZSBjb250ZW50cyBvZiB0aGUgbmV3IHtAbGluayBTaW11bGF0aW9ufQorCSAqIGFzIGFwcHJvcHJpYXRlLgorCSAqIAorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogICAgICAgICAgICB0aGUgc2ltdWxhdGlvbiB3aG9zZSBMYXQvTG9uZyBkYXRhIHdpbGwgYmUgcmVuZGVyZWQuCisJICovCisJcHVibGljIGZpbmFsIHZvaWQgc2V0U2ltdWxhdGlvbihmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uKSB7CisJCS8vIEFueSBuZWVkIHRvIHN3aXRjaD8KKwkJaWYgKHRoaXMuc2ltdWxhdGlvbiA9PSBzaW11bGF0aW9uKSB7CisJCQkvLyBObworCQkJcmV0dXJuOworCQl9IC8vIGlmIG5vIG5lZWQgdG8gc3dpdGNoPworCisJCS8vIFNob3VsZCB3ZSByZW1vdmUgb3Vyc2VsdmVzIGFzIGxpc3RlbmVycyBmcm9tIHRoZSBjdXJyZW50IHNpbXVsYXRpb24/CisJCWlmICh0aGlzLnNpbXVsYXRpb24gIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQl0aGlzLnNpbXVsYXRpb24ucmVtb3ZlU2ltdWxhdGlvbkxpc3RlbmVyU3luYyh0aGlzKTsKKwkJfQorCisJCXRoaXMubm9kZUxldmVscyA9IHRoaXMuZ2V0Tm9kZUxldmVscyhzaW11bGF0aW9uKTsKKwkJCisJCXRoaXMuc2ltdWxhdGlvbiA9IHNpbXVsYXRpb247CisJCXNlbGVjdGlvbiA9IG51bGw7CisJCS8vIFdhcyB0aGVyZSBhIG5ldyBzaW11bGF0aW9uIHRvIHN3aXRjaCB0bz8KKwkJaWYgKHRoaXMuc2ltdWxhdGlvbiAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCXRoaXMuc2ltdWxhdGlvbi5hZGRTaW11bGF0aW9uTGlzdGVuZXJTeW5jKHRoaXMpOworCQkJaW5pdGlhbGl6ZUZyb21TaW11bGF0aW9uKHRoaXMuc2ltdWxhdGlvbik7CisJCX0gZWxzZSB7CisJCQkvLyBObworCQkJLy8gSnVzdCBkaXNwbGF5IGEgYmxhbmsgc2NyZWVuCisJCQlpbml0aWFsaXplRnJvbVNpbXVsYXRpb24obnVsbCk7CisJCX0KKworCQlyZWZyZXNoMigpOworCX0gLy8gc2V0U2ltdWxhdGlvbgorCisJLyoqCisJICogc2V0RGlzZWFzZU1vZGVsIFNldCB0aGUgZGlzZWFzZSBtb2RlbCBmb3IgdGhlIGxvZ2dlcgorCSAqCisJICpAcGFyYW0gZG0gVGhlIGRpc2Vhc2UgbW9kZWwKKwkgKi8KKwkKKwlwdWJsaWMgdm9pZCBzZXREaXNlYXNlTW9kZWwoSW50ZWdyYXRpb25EZWNvcmF0b3IgZG0pIHsKKwkJdGhpcy5kaXNlYXNlTW9kZWwgPSBkbTsKKwl9CisJLyoqCisJICogCisJICogQHBhcmFtIHNpbXVsYXRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplRnJvbVNpbXVsYXRpb24oCisJCQlmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uKTsKKworCS8qKgorCSAqIAorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJlZnJlc2gyKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24KKwkgKi8KKwlwdWJsaWMgZmluYWwgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7CisJCXJldHVybiBzZWxlY3Rpb247CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNzZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKwkJZmlyZVNlbGVjdGlvbihzZWxlY3Rpb24pOworCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBpZGVudGlmaWFibGUKKwkgKiBAcGFyYW0gc2ltIAorCSAqLworCS8vcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SWRlbnRpZmlhYmxlKElkZW50aWZpYWJsZSBpZGVudGlmaWFibGUsIElTaW11bGF0aW9uIHNpbSk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgSWRlbnRpZmlhYmxlIGJlaW5nIGRpc3BsYXllZAorCSAqIAorCSAqIEByZXR1cm4gVGhlIGlkZW50aWZpYWJsZSB0byBiZSBtb25pdG9yZWQKKwkgKiAKKwkgKi8KKwkvL3B1YmxpYyBhYnN0cmFjdCBJZGVudGlmaWFibGUgZ2V0SWRlbnRpZmlhYmxlKCk7CisKKwkvKioKKwkgKiBQYXNzIGEge0BsaW5rIFNlbGVjdGlvbkNoYW5nZWRFdmVudH0gYWxvbmcgdG8gbGlzdGVuZXJzLgorCSAqIAorCSAqIEBwYXJhbSBzZWxlY3Rpb24KKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgSVNlbGVjdGlvbn0gdG8gYmUgZ2l2aW5nIHRvIHRoZSBsaXN0ZW5lcnMuCisJICovCisJcHVibGljIHZvaWQgZmlyZVNlbGVjdGlvbihmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCisJCWZpbmFsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywKKwkJCQlzZWxlY3Rpb24pOworCQlmb3IgKGZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKKwkJCWxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOworCQl9IC8vIGZvciBlYWNoIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKKworCX0gLy8gZmlyZVNlbGVjdGlvbgorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKKwkJCWZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNyZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKKwkJCWZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogUmV0dXJuIGFsbCBub2RlcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBsZXZlbC4gV2UgdXNlIHRoaXMgdG8gbG9nIGRhdGEgdXNpbmcgCisJICogZGlmZmVyZW50IHJlc29sdXRpb25zLgorCSAqIAorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogQHJldHVybiBNYXAgd2l0aCBub2RlIGFuZCBsZXZlbAorCSAqLworCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQorCXB1YmxpYyBNYXA8Tm9kZSwgSW50ZWdlcj4gZ2V0Tm9kZUxldmVscyhJU2ltdWxhdGlvbiBzaW11bGF0aW9uKSB7CisJCU1hcDxOb2RlLCBJbnRlZ2VyPiByZXN1bHQgPSBuZXcgSGFzaE1hcDxOb2RlLCBJbnRlZ2VyPigpOworCQlmaW5hbCBHcmFwaCBncmFwaCA9IHNpbXVsYXRpb24uZ2V0U2NlbmFyaW8oKS5nZXRDYW5vbmljYWxHcmFwaCgpOworCQlpZiAoZ3JhcGggIT0gbnVsbCkgeworCQkJZmluYWwgRU1hcDxVUkksTm9kZT4gYWxsTm9kZXMgPSBncmFwaC5nZXROb2RlcygpOworCQkJZmluYWwgU2V0PFVSST4gYWxsR3JhcGhVUklzID0gYWxsTm9kZXMua2V5U2V0KCk7CisJCSAgICBJdGVyYXRvcjxVUkk+IGdyYXBoSXRlcjIgPSBhbGxHcmFwaFVSSXMuaXRlcmF0b3IoKTsKKwkJICAKKwkJICAgIHdoaWxlKChncmFwaEl0ZXIyIT1udWxsKSYmKGdyYXBoSXRlcjIuaGFzTmV4dCgpKSkgeworCQkgICAgCVVSSSB1cmkgPSBncmFwaEl0ZXIyLm5leHQoKTsKKwkJICAgIAlOb2RlIG5vZGUgPSBhbGxOb2Rlcy5nZXQodXJpKTsKKwkJICAgIAkvLyBCdWcgZml4LiBNYWtlIHN1cmUgdGhlIG5vZGUgaGFzIGxhYmVscworCQkgICAgCWlmKG5vZGUuZ2V0TGFiZWxzKCkuc2l6ZSgpID09IDApIGNvbnRpbnVlOworCQkgICAgCVN0cmluZyBpZCA9ICBub2RlLmdldFVSSSgpLnRvU3RyaW5nKCk7CisJCSAgICAJaW50IGxldmVsID0gZ2V0QWRtaW5MZXZlbChpZCk7CisJCSAgICAJcmVzdWx0LnB1dChub2RlLCBsZXZlbCk7CisJCSAgICB9CisJCX0gLy8gZ3JhcGggbm90IG51bGwKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJcHJpdmF0ZSBpbnQgZ2V0QWRtaW5MZXZlbChTdHJpbmcgdXJpS2V5KSB7CisJCWludCByZXRWYWwgPSAwOworCQlTdHJpbmcgdGVzdCA9IHVyaUtleTsKKwkJd2hpbGUodGVzdC5jb250YWlucygiLSIpKSB7CisJCQlyZXRWYWwgKys7CisJCQlpbnQgaWR4MSA9IHRlc3QuaW5kZXhPZigiLSIpOworCQkJU3RyaW5nIHRlc3QyID0gdGVzdC5zdWJzdHJpbmcoaWR4MSsxLCB0ZXN0Lmxlbmd0aCgpKTsKKwkJCXRlc3QgPSB0ZXN0MjsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KK30gLy8gTG9nZ2VyQ29udHJvbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9sb2dnZXJzL3ZpZXdzL0xvZ2dlckNvbnRyb2xGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvdmlld3MvTG9nZ2VyQ29udHJvbEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGU5NDBiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9sb2dnZXJzL3ZpZXdzL0xvZ2dlckNvbnRyb2xGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0MiBAQAorLy8gTG9nZ2VyQ29udHJvbEZhY3RvcnkuamF2YQorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGZhY3RvcmllcyB0aGF0IGNyZWF0ZSBpbnN0YW5jZXMgb2YKKyAqIHtAbGluayBMb2dnZXJDb250cm9sfS4KKyAqLworcHVibGljIGludGVyZmFjZSBMb2dnZXJDb250cm9sRmFjdG9yeSB7CisJLyoqCisJICogTmV3IG1ldGhvZAorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gZGlyTmFtZQorCSAqIEBwYXJhbSBzaW11bGF0aW9uCisJICogQHBhcmFtIGRpc2Vhc2VNb2RlbCAKKwkgKiBAcmV0dXJuIHRoZSBMb2dnZXJDb250cm9sCisJICovCisJCisJTG9nZ2VyQ29udHJvbCBjcmVhdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRpck5hbWUsIElTaW11bGF0aW9uIHNpbXVsYXRpb24sIEludGVncmF0aW9uRGVjb3JhdG9yIGRpc2Vhc2VNb2RlbCk7CisKKwkKKwkvKioKKwkgKiBAcmV0dXJuIFRPRE8gSkZLCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb250cm9sVHlwZSgpOworCit9IC8vIExvZ2dlckNvbnRyb2xGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvdmlld3MvTG9nZ2VyVmlld2VyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvdmlld3MvTG9nZ2VyVmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2NjljMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy92aWV3cy9Mb2dnZXJWaWV3ZXIuamF2YQpAQCAtMCwwICsxLDExMjIgQEAKKy8vIExvZ2dlclZpZXdlci5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dTZXR0aW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uSWRlbnRpZmlhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5HcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuRGVjb3JhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5tb2RlbC5JbnRlZ3JhdGlvbkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5zdGFuZGFyZC5BZ2dyZWdhdGluZ1NJRGlzZWFzZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyU3luYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb25NYW5hZ2VyRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51aS52aWV3cy5nZW9ncmFwaGljLm1hcC5NYXBDb250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLnV0aWwuVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJlc2VudHMgInZpZXdzIiBvZiB0aGUgcnVubmluZyBzaW11bGF0aW9ucy4KKyAqLworcHVibGljIGNsYXNzIExvZ2dlclZpZXdlciBleHRlbmRzIFZpZXdlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsCisJCUlTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyU3luYyB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb2xsZWN0aW9uIG9mIElkZW50aWZpYWJsZXMgdG8gZGlzcGxheSAobm9kZXMgZm9yIG5vdykKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uU2ltdWxhdGlvbn1zIHRoYXQgc2hvdWxkIGJlCisJICogZGlzcGxheWVkLgorCSAqLworCS8vcHJpdmF0ZSBmaW5hbCBTZXQ8SWRlbnRpZmlhYmxlPiBpZGVudGlmaWFibGVzVG9EaXNwbGF5ID0gbmV3IExpbmtlZEhhc2hTZXQ8SWRlbnRpZmlhYmxlPigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJU2ltdWxhdGlvbixTZXQ8SWRlbnRpZmlhYmxlPj4gaWRlbnRpZmlhYmxlc1RvRGlzcGxheU1hcCA9IG5ldyBIYXNoTWFwPElTaW11bGF0aW9uLFNldDxJZGVudGlmaWFibGU+PigpOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbGxlY3Rpb248SVNpbXVsYXRpb24+IHNpbXVsYXRpb25zVG9Mb2cgPSBuZXcgQXJyYXlMaXN0PElTaW11bGF0aW9uPigpOworICAgIAorICAgIAorCS8qKgorCSAqIFRoaXMgaXMgdGhlIHtAbGluayBTaW11bGF0aW9uTWFuYWdlcn0gdGhhdCBpcyB0aGUgaW5wdXQgdG8gdGhlIHZpZXdlci4gSXQKKwkgKiBtYWludGFpbnMgYSBjb2xsZWN0aW9uIG9mIGFjdGl2ZQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5zdGVtLmpvYnMuc2ltdWxhdGlvbi5TaW11bGF0aW9ufXMgaW4gdGhlIHN5c3RlbS4KKwkgKiBUaGlzIHZpZXdlciBsaXN0ZW5zIHRvIGl0IHRvIGRpc2NvdmVyIHdoZW4gbmV3CisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259cyBhcmUgY3JlYXRlZCBhbmQKKwkgKiBvbGQgb25lcyBkaXNhcHBlYXIuCisJICogCisJICogQHNlZSAjc2ltdWxhdGlvbnNDaGFuZ2VkKFNpbXVsYXRpb25NYW5hZ2VyRXZlbnQpCisJICovCisJU2ltdWxhdGlvbk1hbmFnZXIgc2ltdWxhdGlvbk1hbmFnZXI7CisKKwkvKioKKwkgKiBUaGUgPGNvZGU+SWRlbnRpZmlhYmxlPC9jb2RlPiB0aGF0IHdhcyBtb3N0IHJlY2VudGx5IHNlbGVjdGVkIGJ5IGEgdXNlcgorCSAqIGNsaWNraW5nIG9uIG9uZSBvZiB0aGUge0BsaW5rIE1hcENvbnRyb2x9cywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKwkgKiBub25lIGhhcyBiZWVuIHNlbGVjdGVkLgorCSAqLworCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOworCisJLyoqCisJICogVGhpcyBpcyB0aGUgdG9wLWxldmVsIGNvbnRyb2wgb2YgdGhlIHZpZXdlci4gSXQgY29udGFpbnMgdGhlCisJICoge0BsaW5rIE1hcENvbnRyb2x9cyB0aGF0IGRpc3BsYXkgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLlNpbXVsYXRpb259cy4KKwkgKi8KKwlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlOworCQorCS8qKgorCSAqIFRoaXMgaXMgYSB0b3AtbGV2ZWwgc2Nyb2xsZWQgY29udGFpbmVyIGZvciB0aGUgY29udHJvbCBvZiB0aGUgdmlld2VyLiBJdCBjb250YWlucyB0aGUKKwkgKi8KKwlTY3JvbGxlZENvbXBvc2l0ZSBzY3JvbGxlZENvbXBvc2l0ZTsKKwkKKwkvKioKKwkgKiB0aGUgb3V0ZXJtb3N0IGNvbnRhaW5lci4KKwkgKi8KKwlDb21wb3NpdGUgb3V0ZXJDb21wb3NpdGU7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdJRFRIID0gNDAwOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIRUlHSFRfTUlOID0gMjUwOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVVRUT05fSEVJR0hUID0gMjU7CisJCisJLyoqCisJICogYnV0dG9uIHRvIGFkZCBBbGwgbG9jYXRpb25zIGluIGEgcnVubmluZyBzaW11bGF0aW9uCisJICovCisJcHJvdGVjdGVkIEJ1dHRvbiBsb2dnZXJPbkJ1dHRvbiA9IG51bGw7CisJLyoqCisJICogYnV0dG9uIHRvIHJlbW92ZSBBbGwgbG9jYXRpb25zIGluIGEgcnVubmluZyBzaW11bGF0aW9uCisJICovCisJcHJvdGVjdGVkIEJ1dHRvbiBsb2dnZXJPZmZCdXR0b24gPSBudWxsOworCQorCXByb3RlY3RlZCBzdGF0aWMgQ29sb3Igb25Db2xvciA9IG51bGw7CisJcHJvdGVjdGVkIHN0YXRpYyBDb2xvciBvZmZDb2xvciA9IG51bGw7CisJCisJCisJCisJLyoqCisJICogCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBzdGF0dXNMYWJlbCA9IG51bGw7CisJCisJLyoqCisJICogcmVtZW1iZXIgdGhlIHN0YXRlIG9mIHRoZSBsb2dnZXIKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbG9nZ2luZ09uID0gZmFsc2U7CisJCisJLyoqCisJICogYnV0dG9uIHRleHQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPTl9URVhUID0gIk9OIjsKKwkKKwkvKioKKwkgKiBidXR0b24gdGV4dAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9GRl9URVhUID0gIk9GRiI7CisJCisJLyoqCisJICogc3RhdHVzIHRleHQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNT05JVE9SX09OX1RFWFQgPSAiTU9OSVRPUiBPTiI7CisJCisJLyoqCisJICogc3RhdHVzIHRleHQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNT05JVE9SX09GRl9URVhUID0gIk1PTklUT1IgT0ZGIjsKKworCisJLyoqCisJICogdGhlIHVzZXJzIHByZWZlcmVuY2VzIGFyZSBzdG9yZWQgaW4gRGlhbG9nU2V0dGluZ3MKKwkgKi8KKwlwcml2YXRlIERpYWxvZ1NldHRpbmdzIG1hc3RlclNldHRpbmdzID0gbnVsbDsKKworCS8qKgorCSAqIFNldCBvZiBQcmVmZXJyZWQgTG9jYXRpb25zIHRvIG1vbml0b3IgcmVhZCBmcm9tIHRoZSBEaWFsb2dTZXR0aW5ncworCSAqLworCXByaXZhdGUgZmluYWwgU2V0IG1vbml0b3JTZXQgPSBuZXcgSGFzaFNldCgpOworCisJLyoqCisJICogcm9vdCBrZXkgZWxlbWVudCBmb3IgdGhlIERpYWxvZ1NldHRpbmdzIHhtbCBmaWxlCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfS0VZID0gInJvb3QiOworCisJLyoqCisJICogQ29uc3RhbnRzIGZvciBzYXZpbmcgUmVwb3J0Vmlld1ByZWZlcmVuY2VzCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1JUVklFV1BSRUZFUkVOQ0VTX0ZJTEVOQU1FID0gIlByZWZlcmVuY2VzLnR4dCI7CisJCisJLyoqCisJICogZGl2aWRlcyB0aGUgZXhwZXJpbWVudHMgc3VtbWFyeSBmcm9tIHRoZSBzcGVjaWZpYyAgbW9kaWZpY2F0b2luIGxpc3QgaW4gdGhlIGhlYWRlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGSUNBVElPTlNfVEVYVCA9ICJAID09ICBNb2RpZmljYXRpb25zID09IjsKKworCS8qKgorCSAqIENvbnN0YW50cyBub2RlIG5vdGUgZm91bmQgZXJyb3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX05PVF9GT1VORCA9ICJOT0RFTk9URk9VTkQiOworCisJLyoqCisJICogVE9ETyBKRksKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9QUkVGRVJFTkNFX0tFWSA9ICJsb2NhdGlvbi5pZHMiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVBhdGggUEFUSCA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpOworCQorCS8qKgorCSAqIFRoZSBsb2dnZXIgaGVhZGVycworCSAqLworCXN0YXRpYyBMYWJlbCBsb2dnZXJNb2RlSGVhZGVyOworCXN0YXRpYyBMYWJlbCBsb2dnZXJTY2VuYXJpb0hlYWRlcjsKKwlzdGF0aWMgTGFiZWwgbG9nZ2VyRGlzZWFzZUhlYWRlcjsKKwkKKwkKKworCS8qKgorCSAqIFRoaXMgZmFjdG9yeSBpcyB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2Yge0BsaW5rIExvZ2dlckNvbnRyb2x9IGluIHRoZQorCSAqIG1ldGhvZCB7QGxpbmsgI3BvcHVsYXRlVmlldygpfQorCSAqLworCXByaXZhdGUgZmluYWwgTG9nZ2VyQ29udHJvbEZhY3RvcnkgbGNmOworCisJLyoqCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgdGhlIFNXVCBwYXJlbnQgb2YgdGhlIGNvbnRyb2wgdGhhdCBtYWtlcyB1cCB0aGUgdmlld2VyCisJICogQHBhcmFtIGxjZgorCSAqICAgICAgICAgICAgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIGluc3RhbmNlIG9mIHtAbGluayBMb2dnZXJDb250cm9sfQorCSAqLworCXB1YmxpYyBMb2dnZXJWaWV3ZXIoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTG9nZ2VyQ29udHJvbEZhY3RvcnkgbGNmKSB7CisgICAgICAgIAorICAgICAgIAorCQlvdXRlckNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuQk9SREVSKTsKKwkJZmluYWwgRm9ybURhdGEgb3V0ZXJGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlGb3JtTGF5b3V0IG91dGVyTGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKKwkJb3V0ZXJMYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKKwkJb3V0ZXJMYXlvdXQubWFyZ2luV2lkdGggPSA1OworCQlvdXRlckNvbXBvc2l0ZS5zZXRMYXlvdXQob3V0ZXJMYXlvdXQpOworCQlvdXRlckNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG91dGVyRm9ybURhdGEpOworCQkKKwkJLy8gdG9wIGNvbXBvc2l0ZSBob2xkcyB0aGUgYnV0dG9ucworCQkvLworCQlDb21wb3NpdGUgdG9wID0gYWRkQWxsQWN0aW9uQnV0dG9ucyhvdXRlckNvbXBvc2l0ZSk7CQorCQkvLworCQlmaW5hbCBGb3JtRGF0YSB0b3BGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQl0b3Auc2V0TGF5b3V0RGF0YSh0b3BGb3JtRGF0YSk7CisJCXRvcC5zZXRTaXplKFNXVC5ERUZBVUxULCBCVVRUT05fSEVJR0hUKTsKKwkJdG9wRm9ybURhdGEubGVmdCAgID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQl0b3BGb3JtRGF0YS5yaWdodCAgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJLy90b3BGb3JtRGF0YS50b3AgICA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJLy9kb24ndCBzZXQgdGhlIGJvdHRvbSAtIGl0J3MgZml4ZWQKKwkJCisJCS8vIGJvdHRvbSBjb21wb3NpdGUgaG9sZHMgdGhlIHNjcm9sbGVyCisJCUNvbXBvc2l0ZSBib3R0b20gPSBuZXcgQ29tcG9zaXRlKG91dGVyQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWJvdHRvbS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoU1dULlZFUlRJQ0FMKSk7CisJCWZpbmFsIEZvcm1EYXRhIGJvdHRvbUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCWJvdHRvbS5zZXRMYXlvdXREYXRhKGJvdHRvbUZvcm1EYXRhKTsKKwkJYm90dG9tRm9ybURhdGEubGVmdCAgID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlib3R0b21Gb3JtRGF0YS5yaWdodCAgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKKwkJYm90dG9tRm9ybURhdGEudG9wICAgPSBuZXcgRm9ybUF0dGFjaG1lbnQodG9wLCAwLCBTV1QuQk9UVE9NKTsKKwkJYm90dG9tRm9ybURhdGEuYm90dG9tICA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCQkKKwkJQ29sb3IgY29sb3IgPSBwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOworCQlib3R0b20uc2V0QmFja2dyb3VuZChjb2xvcik7CisJCQorCSAgICAvLyBzY3JvbGxlcgorCQlzY3JvbGxlZENvbXBvc2l0ZSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShib3R0b20sIChTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMfCBTV1QuVl9TQ1JPTEwpKTsKKwkJZmluYWwgRmlsbExheW91dCBzY3JvbGxlZExheW91dCA9IG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCk7CisJCXNjcm9sbGVkQ29tcG9zaXRlLnNldExheW91dChzY3JvbGxlZExheW91dCk7CisJCXNjcm9sbGVkQ29tcG9zaXRlLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7CisJCisJCXNjcm9sbGVkQ29tcG9zaXRlLnNldEV4cGFuZFZlcnRpY2FsKGZhbHNlKTsKKwkKKwkJc2Nyb2xsZWRDb21wb3NpdGUuc2V0TWluU2l6ZShTV1QuREVGQVVMVCxIRUlHSFRfTUlOKTsKKwkJc2Nyb2xsZWRDb21wb3NpdGUuc2V0U2l6ZShTV1QuREVGQVVMVCxIRUlHSFRfTUlOKTsKKwkJCisJCS8vIGNvbXBvc2l0ZSBob2xkcyBhbGwgdGhlIG1vbml0b3Igb2JqZWN0cyBzdGFja2VkIHZlcnRpY2FsbHkKKwkJY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzY3JvbGxlZENvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlmaW5hbCBGaWxsTGF5b3V0IGNvbXBvc2l0ZUxheW91dCA9IG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCk7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXQoY29tcG9zaXRlTGF5b3V0KTsKKwkJLy8gYWRkIHRvIHRoZSBzY3JvbGxlcgorCQlzY3JvbGxlZENvbXBvc2l0ZS5zZXRDb250ZW50KGNvbXBvc2l0ZSk7CisJCQorCQkvLyBSZW1lbWJlciB0aGUgZmFjdG9yeSB0aGF0IHdlJ2xsIHVzZSB0byBjcmVhdGUgaW5zdGFuY2VzIG9mCisJCS8vIExvZ2dlckNvbnRyb2wKKwkJdGhpcy5sY2YgPSBsY2Y7CisJCXJlZnJlc2goKTsKKwkJY29tcG9zaXRlLnBhY2soKTsKKwkJTG9nV3JpdGVyLnJlc2V0KCk7CisJCisJfSAvLyBMb2dnZXJWaWV3ZXIKKworCS8qKgorCSAqICBhZGQgdGhlIHJlbW92ZUFsbCBhbmQgYWRkQWxsIEFjdGlvbkJ1dHRvbnMKKwkgKi8KKwlwcml2YXRlIENvbXBvc2l0ZSBhZGRBbGxBY3Rpb25CdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkKKwkJQ29tcG9zaXRlIHRvcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCS8vRmlsbExheW91dCBmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoU1dULkhPUklaT05UQUwpOworCQkKKwkJRm9ybUxheW91dCB0b3BMYXlvdXQgPSBuZXcgRm9ybUxheW91dCgpOworCQkvL0ZpbGxMYXlvdXQgdG9wTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoU1dULkhPUklaT05UQUwpOworCQl0b3BMYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKKwkJdG9wTGF5b3V0Lm1hcmdpbldpZHRoID0gNTsKKwkgICAgdG9wLnNldExheW91dCh0b3BMYXlvdXQpOworCSAgICB0b3Auc2V0U2l6ZShTV1QuREVGQVVMVCwgQlVUVE9OX0hFSUdIVCk7CisJICAgIC8vQ29sb3IgY29sb3IgPSBwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX0dSQVkpOworCSAgICBmaW5hbCBDb2xvciBiZ0NvbG9yID0gbmV3IENvbG9yKHBhcmVudC5nZXREaXNwbGF5KCksIG5ldyBSR0IoMTcwLCAxNzAsIDE5MCkpOworCQlvbkNvbG9yID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pOworCQlvZmZDb2xvciA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfUkVEKTsKKwkgICAgdG9wLnNldEJhY2tncm91bmQoYmdDb2xvcik7CisJICAgIAorCSAgICBpbnQgYnV0dG9uV2lkdGggPSAoaW50KSgwLjMgKiBXSURUSCk7CisJICAgIGludCB0aXRsZVdpZHRoID0gKGludCkoMC40ICogV0lEVEgpOworCSAgICAKKwkgICAgLy8gVElUTEUKKwkgICAgc3RhdHVzTGFiZWwgPSBuZXcgTGFiZWwodG9wLCAgU1dULkJPUkRFUik7Ly8JZG8gYSBzdGF0dXNMYWJlbAorCQlzdGF0dXNMYWJlbC5zZXRUZXh0KE1PTklUT1JfT0ZGX1RFWFQpOworCQlzdGF0dXNMYWJlbC5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7CisJCXN0YXR1c0xhYmVsLnNldFNpemUodGl0bGVXaWR0aCxCVVRUT05fSEVJR0hUKTsKKwkJc3RhdHVzTGFiZWwuc2V0VGV4dChNT05JVE9SX09GRl9URVhUKTsKKwkJc3RhdHVzTGFiZWwuc2V0QmFja2dyb3VuZChvZmZDb2xvcik7CisJCQorCQkvLyBCVVRUT05TCisJICAgIGxvZ2dlck9uQnV0dG9uICAgID0gbmV3IEJ1dHRvbih0b3AsIFNXVC5UT0dHTEUpOworCSAgICBsb2dnZXJPZmZCdXR0b24gPSBuZXcgQnV0dG9uKHRvcCwgU1dULlRPR0dMRSk7CisJCWxvZ2dlck9uQnV0dG9uLnNldFRleHQoT05fVEVYVCk7CisJCWxvZ2dlck9mZkJ1dHRvbi5zZXRUZXh0KE9GRl9URVhUKTsKKwkJbG9nZ2VyT25CdXR0b24uc2V0U2l6ZShidXR0b25XaWR0aCxCVVRUT05fSEVJR0hUKTsKKwkJbG9nZ2VyT2ZmQnV0dG9uLnNldFNpemUoYnV0dG9uV2lkdGgsQlVUVE9OX0hFSUdIVCk7CisJCS8vIGluaXQgdGhlIHRvZ2dsZSBwb3NpdGlvbiAtIG9mZiBhdCBzdGFydAorCQlsb2dnZXJPbkJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQlsb2dnZXJPZmZCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOy8vIG9mZiBhdCBzdGFydAorCQkvLy8vLy8vCisJCQorCQkKKwkJLy8gcmVtb3ZlIGV2ZXJ5dGhpbmcKKwkJLy8gVE9ETyBwcm9iYWJseSB3YW50IGEgZGlhbG9nIHRvIGNvbmZpcm0gdGhpcyBhY3Rpb24uLi4KKwkJbG9nZ2VyT2ZmQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJCWZpbmFsIFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlkaXNhYmxlTG9nZ2luZygpOworCQkJfQorCQl9KTsKKwkJCisJCS8vIGFkZCBldmVyeXRoaW5nCisJCS8vIFRPRE8gcHJvYmFibHkgd2FudCBhIGRpYWxvZyB0byBjb25maXJtIHRoaXMgYWN0aW9uLi4uCisJCWxvZ2dlck9uQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJCWZpbmFsIFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlJU2ltdWxhdGlvbiBbXSBzaW11bGF0aW9ucyA9IG51bGw7CisJCQkJTGlzdDxJU2ltdWxhdGlvbj4gYWN0aXZlc2ltcyA9IHNpbXVsYXRpb25NYW5hZ2VyLmdldEFjdGl2ZVNpbXVsYXRpb25zKCk7CisJCQkJaWYoYWN0aXZlc2ltcyAhPSBudWxsKSB7CisJCQkJCXNpbXVsYXRpb25zID0gbmV3IElTaW11bGF0aW9uIFthY3RpdmVzaW1zLnNpemUoKV07CisJCQkJCWZvcihpbnQgaT0wO2k8YWN0aXZlc2ltcy5zaXplKCk7KytpKSBzaW11bGF0aW9uc1tpXSA9IGFjdGl2ZXNpbXMuZ2V0KGkpOworCQkJCX0KKwkJCQllbmFibGVMb2dnaW5nKHNpbXVsYXRpb25zKTsKKwkJCX0KKwkJfSk7CisJCQorCQkKKwkJLy8gc3RhdHVzTGFiZWwgRm9ybQorCQlmaW5hbCBGb3JtRGF0YSBzdGF0dXNMYWJlbEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCXN0YXR1c0xhYmVsLnNldExheW91dERhdGEoc3RhdHVzTGFiZWxGb3JtRGF0YSk7CisJCXN0YXR1c0xhYmVsRm9ybURhdGEubGVmdCAgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCXN0YXR1c0xhYmVsRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNDAsIDApOworCQlzdGF0dXNMYWJlbEZvcm1EYXRhLnRvcCAgID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlzdGF0dXNMYWJlbEZvcm1EYXRhLmJvdHRvbSAgID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDI1KTsKKwkJdG9wLnNldExheW91dERhdGEoc3RhdHVzTGFiZWxGb3JtRGF0YSk7CisJCQorCQkvLyBCdXR0b24gRm9ybQorCSAgICBmaW5hbCBGb3JtRGF0YSBhZGRCdXR0b25Gb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCSAgICBhZGRCdXR0b25Gb3JtRGF0YS5sZWZ0ICA9IG5ldyBGb3JtQXR0YWNobWVudCg0MCwgMCk7CisJICAgIGFkZEJ1dHRvbkZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDcwLCAwKTsKKwkgICAgYWRkQnV0dG9uRm9ybURhdGEudG9wICAgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJICAgIGFkZEJ1dHRvbkZvcm1EYXRhLmJvdHRvbSAgID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDI1KTsKKwkgICAgbG9nZ2VyT25CdXR0b24uc2V0TGF5b3V0RGF0YShhZGRCdXR0b25Gb3JtRGF0YSk7CisJICAgIC8vIEJ1dHRvbiBGb3JtCisJCWZpbmFsIEZvcm1EYXRhIHJlbW92ZUJ1dHRvbkZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJICAgIHJlbW92ZUJ1dHRvbkZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNzAsIDApOworCSAgICByZW1vdmVCdXR0b25Gb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOworCSAgICByZW1vdmVCdXR0b25Gb3JtRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJICAgIHJlbW92ZUJ1dHRvbkZvcm1EYXRhLmJvdHRvbSAgID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDI1KTsKKwkgICAgbG9nZ2VyT2ZmQnV0dG9uLnNldExheW91dERhdGEocmVtb3ZlQnV0dG9uRm9ybURhdGEpOworCSAgICAKKwkgICAgLy8gSEVBREVSIExBQkVMUworCSAgICAKKwkgICAgaWYobG9nZ2VyTW9kZUhlYWRlcj09bnVsbCkgeworCQkJbG9nZ2VyTW9kZUhlYWRlciA9IG5ldyBMYWJlbCh0b3AsIFNXVC5CT1JERVIpOworCQkJLy9sb2dnZXJNb2RlSGVhZGVyLnNldEJhY2tncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19HUkFZKSk7CisJCQlsb2dnZXJNb2RlSGVhZGVyLnNldFRleHQoIk1vZGUiKTsKKwkJCWxvZ2dlck1vZGVIZWFkZXIuc2V0QWxpZ25tZW50KFNXVC5DRU5URVIpOworCQkJCisJCQlsb2dnZXJTY2VuYXJpb0hlYWRlciA9IG5ldyBMYWJlbCh0b3AsIFNXVC5CT1JERVIpOworCQkJLy9sb2dnZXJTY2VuYXJpb0hlYWRlci5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfR1JBWSkpOworCQkJbG9nZ2VyU2NlbmFyaW9IZWFkZXIuc2V0VGV4dCgiU2NlbmFyaW8iKTsKKwkJCWxvZ2dlclNjZW5hcmlvSGVhZGVyLnNldEFsaWdubWVudChTV1QuQ0VOVEVSKTsKKwkJCQorCQkJbG9nZ2VyRGlzZWFzZUhlYWRlciA9IG5ldyBMYWJlbCh0b3AsIFNXVC5CT1JERVIpOworCQkJLy9sb2dnZXJEaXNlYXNlSGVhZGVyLnNldEJhY2tncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19HUkFZKSk7CisJCQlsb2dnZXJEaXNlYXNlSGVhZGVyLnNldFRleHQoIkRpc2Vhc2UiKTsKKwkJCWxvZ2dlckRpc2Vhc2VIZWFkZXIuc2V0QWxpZ25tZW50KFNXVC5DRU5URVIpOworCQkJCisJCQkvLyBMb2dnZXIgTmFtZSBMYWJlbAorCQkJZmluYWwgRm9ybURhdGEgbG9nZ2VyTW9kZUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCQlsb2dnZXJNb2RlRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDMwKTsKKwkJCWxvZ2dlck1vZGVGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNTApOworCQkJbG9nZ2VyTW9kZUZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCQlsb2dnZXJNb2RlRm9ybURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMjUsIDApOwkKKwkJCWxvZ2dlck1vZGVIZWFkZXIuc2V0TGF5b3V0RGF0YShsb2dnZXJNb2RlRm9ybURhdGEpOworCQkJCisJCQlmaW5hbCBGb3JtRGF0YSBsb2dnZXJTY2VuYXJpb0Zvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCQlsb2dnZXJTY2VuYXJpb0Zvcm1EYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAzMCk7CisJCQlsb2dnZXJTY2VuYXJpb0Zvcm1EYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1MCk7CisJCQlsb2dnZXJTY2VuYXJpb0Zvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMjUsIDApOworCQkJbG9nZ2VyU2NlbmFyaW9Gb3JtRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCwgMCk7CQorCQkJbG9nZ2VyU2NlbmFyaW9IZWFkZXIuc2V0TGF5b3V0RGF0YShsb2dnZXJTY2VuYXJpb0Zvcm1EYXRhKTsKKwkJCQorCQkJZmluYWwgRm9ybURhdGEgbG9nZ2VyRGlzZWFzZUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCQlsb2dnZXJEaXNlYXNlRm9ybURhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDMwKTsKKwkJCWxvZ2dlckRpc2Vhc2VGb3JtRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNTApOworCQkJbG9nZ2VyRGlzZWFzZUZvcm1EYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIDApOworCQkJbG9nZ2VyRGlzZWFzZUZvcm1EYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDkwLCAwKTsJCisJCQlsb2dnZXJEaXNlYXNlSGVhZGVyLnNldExheW91dERhdGEobG9nZ2VyRGlzZWFzZUZvcm1EYXRhKTsKKwkJfQorCSAgICAKKyAgICAgICAgCisJICAgIAorCQlyZXR1cm4gdG9wOwkgCisJCQorCX0gLy8gYWRkQWxsQWN0aW9uQnV0dG9ucworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciNnZXRDb250cm9sKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgeworCQlyZXR1cm4gY29tcG9zaXRlOworCX0gLy8gZ2V0Q29udHJvbAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciNnZXRTZWxlY3Rpb24oKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKKwkJcmV0dXJuIHNlbGVjdGlvbjsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyI3JlZnJlc2goKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7CisJCQorCQlpZiAoc2ltdWxhdGlvbk1hbmFnZXIgIT0gbnVsbCkgeworCQkJLy8gWWVzCQorCQkJTGlzdCBhbGxTaW11bGF0aW9ucyA9IG51bGw7CisJCQl1cGRhdGVQcmVmZXJlbmNlU3RhdGUoc2ltdWxhdGlvbk1hbmFnZXIuZ2V0QWN0aXZlU2ltdWxhdGlvbnMoKSk7CisJCQlpZiAoc2ltdWxhdGlvbk1hbmFnZXIgIT0gbnVsbCkgeworCQkJCQlhbGxTaW11bGF0aW9ucyA9IHNpbXVsYXRpb25NYW5hZ2VyLmdldEFjdGl2ZVNpbXVsYXRpb25zKCk7CisJCQkJCWFkZFRvRGlzcGxheWVkSWRlbnRpZmlhYmxlU2V0KGFsbFNpbXVsYXRpb25zKTsKKwkJCX0KKwkJCQkKKwkJCWlkZW50aWZpYWJsZXNUb0Rpc3BsYXlNYXAuY2xlYXIoKTsKKwkJCWFkZEFsbElkZW50aWZpYWJsZXNCeVNpbXVsYXRpb24oc2ltdWxhdGlvbk1hbmFnZXIuZ2V0QWN0aXZlU2ltdWxhdGlvbnMoKSk7CisJCX0gLy8gaWYKKwkJCQorCX0gLy8gcmVmcmVzaAorCisJLyoqCisJICogU3RhcnQgbG9nZ2luZworCSAqIAorCSAqIEBwYXJhbSBuZXdTaW11bGF0aW9ucyBOZXcgc2ltdWxhdGlvbnMgYWRkZWQgYnkgdGhlIHNpbXVsYXRpb24gbWFuYWdlcgorCSAqLworCXB1YmxpYyB2b2lkIGVuYWJsZUxvZ2dpbmcoSVNpbXVsYXRpb24gW10gbmV3U2ltdWxhdGlvbnMpIHsKKwkJc3luY2hyb25pemVkKHRoaXMpIHsJCQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdTaW11bGF0aW9ucy5sZW5ndGg7IGkrKykgeworCQkJCWZpbmFsIElTaW11bGF0aW9uIHNpbXVsYXRpb24gPSBuZXdTaW11bGF0aW9uc1tpXTsKKwkJCQkvLyBTdGVmYW4gbmV3IGNvZGU6CisJCQkJaWYoIXNpbXVsYXRpb25zVG9Mb2cuY29udGFpbnMoc2ltdWxhdGlvbikpIHsKKwkJCQkJc2ltdWxhdGlvbnNUb0xvZy5hZGQoc2ltdWxhdGlvbik7CisJCQkJCXBvcHVsYXRlVmlldyhuZXdTaW11bGF0aW9ucyk7CisJCQkJfQorCQkJfS8vIGZvciBhbGwgc2ltdWxhdGlvbnMKKwkJCisJCQlzdGF0dXNMYWJlbC5zZXRUZXh0KE1PTklUT1JfT05fVEVYVCk7CisJCQlzdGF0dXNMYWJlbC5zZXRCYWNrZ3JvdW5kKG9uQ29sb3IpOworCQkJbG9nZ2luZ09uID0gdHJ1ZTsKKwkJCS8vIGFuZCB0b2dnbGUgdGhlIGJ1dHRvbnMKKwkJCWxvZ2dlck9uQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKKwkJCWxvZ2dlck9mZkJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQl9Ly9zeW5jaHJvbml6ZWQoKSAKKworCX0gLy8gZW5hYmxlTG9nZ2luZworCisJCisJLyoqCisJICogU3RvcCBsb2dnaW5nCisJICogCisJICovCisJcHVibGljIHZvaWQgZGlzYWJsZUxvZ2dpbmcoKSB7CisJCXNpbXVsYXRpb25zVG9Mb2cuY2xlYXIoKTsKKwkJLy8gcmVtb3ZlIGFsbCBjb250cm9scworCQlmaW5hbCBDb250cm9sW10gYWxsQ29udHJvbHMgPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKKwkJZm9yIChmaW5hbCBDb250cm9sIGVsZW1lbnQgOiBhbGxDb250cm9scykgeworCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIExvZ2dlckNvbnRyb2wpIHsKKwkJCQlmaW5hbCBMb2dnZXJDb250cm9sIGxvZ2dlckNvbnRyb2wgPSAoTG9nZ2VyQ29udHJvbCkgZWxlbWVudDsKKwkJCQlsb2dnZXJDb250cm9sLnJlbW92ZSgpOworCQkJfSBlbHNlIGVsZW1lbnQuZGlzcG9zZSgpOworCQl9IC8vIGZvciBlYWNoIExvZ2dlckNvbnRyb2wKKwkKKwkJc3RhdHVzTGFiZWwuc2V0VGV4dChNT05JVE9SX09GRl9URVhUKTsKKwkJc3RhdHVzTGFiZWwuc2V0QmFja2dyb3VuZChvZmZDb2xvcik7CisJCWxvZ2dpbmdPbiA9IGZhbHNlOworCQkvLyBhbmQgdG9nZ2xlIHRoZSBidXR0b25zCisJCWxvZ2dlck9uQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7CisJCWxvZ2dlck9mZkJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJfSAvLyBkaXNhYmxlTG9nZ2luZworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciNnZXRJbnB1dCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRJbnB1dCgpIHsKKwkJcmV0dXJuIHNpbXVsYXRpb25NYW5hZ2VyOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIjc2V0SW5wdXQoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRJbnB1dChmaW5hbCBPYmplY3QgaW5wdXQpIHsKKwkJZmluYWwgT2JqZWN0IG9sZElucHV0ID0gc2ltdWxhdGlvbk1hbmFnZXI7CisJCXNpbXVsYXRpb25NYW5hZ2VyID0gKFNpbXVsYXRpb25NYW5hZ2VyKSBpbnB1dDsKKwkJaW5wdXRDaGFuZ2VkKGlucHV0LCBvbGRJbnB1dCk7CisJfSAvLyBzZXRJbnB1dAorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciNpbnB1dENoYW5nZWQoamF2YS5sYW5nLk9iamVjdCwKKwkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5wdXRDaGFuZ2VkKGZpbmFsIE9iamVjdCBpbnB1dCwgZmluYWwgT2JqZWN0IG9sZElucHV0KSB7CisJCS8vIElzIHRoZXJlIGFscmVhZHkgYSBzaW11bGF0aW9uIG1hbmFnZXI/CisJCWlmIChvbGRJbnB1dCAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCSgoU2ltdWxhdGlvbk1hbmFnZXIpIG9sZElucHV0KS5yZW1vdmVMaXN0ZW5lclN5bmModGhpcyk7CisJCX0gLy8gaWYKKworCQkvLyBSZWdpc3RlciB3aXRoIHRoZSBTaW11bGF0aW9uTWFuYWdlciB0byBsaXN0ZW4gZm9yIGNoYW5nZXMgaW4gdGhlIHNldAorCQkvLyBvZiBhY3RpdmUgU2ltdWxhdGlvbnMuCisJCS8vIEdvdCBpbnB1dD8KKwkJaWYgKGlucHV0ICE9IG51bGwpIHsKKwkJCS8vIFllcworCQkJKChTaW11bGF0aW9uTWFuYWdlcikgaW5wdXQpLmFkZFNpbXVsYXRpb25NYW5hZ2VyTGlzdGVuZXJTeW5jKHRoaXMpOworCQl9IC8vIGlmCisKKwkJLy8gVXBkYXRlIHRoZSB2aWV3ZXIgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIG5ldyBpbnB1dCBzb3VyY2UKKwkJcmVmcmVzaCgpOworCX0gLy8gaW5wdXRDaGFuZ2VkCisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyI3NldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24sCisJICogICAgICBib29sZWFuKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbiwKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCQkJZmluYWwgYm9vbGVhbiByZXZlYWwpIHsKKwkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKGZpbmFsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCisJCS8vIERpZCB0aGUgZXZlbnQgY29tZSBmcm9tIGEgTG9nZ2VyQ29udHJvbD8KKwkJaWYgKGV2ZW50LmdldFNlbGVjdGlvblByb3ZpZGVyKCkgaW5zdGFuY2VvZiBMb2dnZXJDb250cm9sKSB7CisJCQkvLyBZZXMKKwkJCS8vIEp1c3QgcGFzcyBpdCBhbG9uZworCQkJc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7CisJCQlmaXJlU2VsZWN0aW9uQ2hhbmdlZChldmVudCk7CisJCX0gLy8gaWYKKwl9IC8vIHNlbGVjdGlvbkNoYW5nZWQKKworCS8qKgorCSAqIEBwYXJhbSBldmVudCAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnN0ZW0uam9icy5zaW11bGF0aW9uLklTaW11bGF0aW9uTWFuYWdlckxpc3RlbmVyI3NpbXVsYXRpb25zQ2hhbmdlZChTaW11bGF0aW9uTWFuYWdlckV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIHNpbXVsYXRpb25zQ2hhbmdlZFN5bmMoZmluYWwgU2ltdWxhdGlvbk1hbmFnZXJFdmVudCBldmVudCkgeworCisJCS8vIEluaXQgdGhlIHByZWZlcmVuY2UKKwkJdXBkYXRlUHJlZmVyZW5jZVN0YXRlKEFycmF5cy5hc0xpc3QoZXZlbnQuZ2V0U2ltdWxhdGlvbnNBZGRlZCgpKSk7CisgICAgICAgIExpc3Q8SVNpbXVsYXRpb24+IG5ld1NpbXVsYXRpb25zID0gQXJyYXlzLmFzTGlzdChldmVudC5nZXRTaW11bGF0aW9uc0FkZGVkKCkpOworCQkKKyAgICAgICAgYWRkVG9EaXNwbGF5ZWRJZGVudGlmaWFibGVTZXQobmV3U2ltdWxhdGlvbnMpOworCisJCXJlbW92ZUZyb21EaXNwbGF5ZWRTaW11bGF0aW9uU2V0KEFycmF5cy5hc0xpc3QoZXZlbnQKKwkJCQkuZ2V0U2ltdWxhdGlvbnNSZW1vdmVkKCkpKTsKKwkJCisJCS8vIGxvZ2dpbmcgc3RhdHVzCisJCWlmKGxvZ2dpbmdPbikgeworCQkJLy8gVGhlIGZvbGxvd2luZyB3aWxsIGFsc28gY2FsbCBwb3B1bGF0ZSB2aWV3LgorCQkJZW5hYmxlTG9nZ2luZyhldmVudC5nZXRTaW11bGF0aW9uc0FkZGVkKCkpOworCQl9IGVsc2UgeworCQkJZGlzYWJsZUxvZ2dpbmcoKTsKKwkJfQorCX0gLy8gc2ltdWxhdGlvbnNDaGFuZ2VkCisKKwkvKioKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbnMKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgU2ltdWxhdGlvbn1zIHRvIGFkZCB0byB0aGUgc2V0IGJlaW5nIGRpc3BsYXllZC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgYWRkVG9EaXNwbGF5ZWRJZGVudGlmaWFibGVTZXQoCisJCQlmaW5hbCBMaXN0PElTaW11bGF0aW9uPiBzaW11bGF0aW9ucykgeworCQkKKwkJLy8gbmV3IHNpbXVsYXRpb24KKwkJTG9nV3JpdGVyLnJlc2V0KCk7CisJCS8vIEFueSBzaW11bGF0aW9ucyB0byBhZGQ/CisJCWlmICghc2ltdWxhdGlvbnMuaXNFbXB0eSgpKSB7CisJCQkKKwkJCWZvcihpbnQgaSA9IDA7IGkgPCBzaW11bGF0aW9ucy5zaXplKCk7IGkgKyspIHsKKwkJCQlJU2ltdWxhdGlvbiBzaW0gPSBzaW11bGF0aW9ucy5nZXQoaSk7CisJCQkJU2V0PElkZW50aWZpYWJsZT4gaWRlbnRpZmlhYmxlc1RvRGlzcGxheSA9IGdldElkZW50aWZpYWJsZVNldChzaW0pOworCQkJCQorCQkJCWlkZW50aWZpYWJsZXNUb0Rpc3BsYXkuYWRkQWxsKGdldElkZW50aWZpYWJsZXNJblNpbXVsYXRpb24oc2ltKSk7CisJCQkJCisJCQkJaWRlbnRpZmlhYmxlc1RvRGlzcGxheU1hcC5wdXQoc2ltLGlkZW50aWZpYWJsZXNUb0Rpc3BsYXkpOworCQkJCQorCQkJfS8vIGZvciBhbGwgc2ltdWxhdGlvbnMKKwkJCQorCQkJCisJCQkKKwkJfSAvLyBpZiBhbnkgc2ltdWxhdGlvbnMKKwl9IC8vIGFkZFRvRGlzcGxheWVkU2ltdWxhdGlvblNldAorCisJLyoqCisJICogQHBhcmFtIHNpbXVsYXRpb25zCisJICogICAgICAgICAgICB0aGUge0BsaW5rIFNpbXVsYXRpb259cyB0byByZW1vdmUgZnJvbSB0aGUgc2V0IGJlaW5nCisJICogICAgICAgICAgICBkaXNwbGF5ZWQuCisJICovCisJcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21EaXNwbGF5ZWRTaW11bGF0aW9uU2V0KAorCQkJZmluYWwgTGlzdDxJU2ltdWxhdGlvbj4gc2ltdWxhdGlvbnMpIHsKKwkJLy8gQW55IHNpbXVsYXRpb25zIHRvIHJlbW92ZT8KKwkJaWYgKCFzaW11bGF0aW9ucy5pc0VtcHR5KCkpIHsKKwkJCQorCQkJZm9yKGludCBpID0gMDsgaSA8IHNpbXVsYXRpb25zLnNpemUoKTsgaSArKykgeworCQkJCUlTaW11bGF0aW9uIHNpbSA9IHNpbXVsYXRpb25zLmdldChpKTsKKwkJCQkKKwkJCQlTZXQ8SWRlbnRpZmlhYmxlPiBpZGVudGlmaWFibGVzVG9SZW1vdmUgPSBnZXRJZGVudGlmaWFibGVTZXQoc2ltKTsKKwkJCQljbGVhbnVwKGlkZW50aWZpYWJsZXNUb1JlbW92ZSxzaW0pOworCQkJCWlkZW50aWZpYWJsZXNUb1JlbW92ZS5jbGVhcigpOworCQkJCWlkZW50aWZpYWJsZXNUb0Rpc3BsYXlNYXAucmVtb3ZlKHNpbSk7CisJCQkJCisJCQl9Ly8gZm9yIGFsbCBzaW11bGF0aW9ucworCQkJCisJCX0gLy8gaWYKKwl9IC8vIHJlbW92ZUZyb21EaXNwbGF5ZWRTaW11bGF0aW9uU2V0CisJCisJCisJCisJCisJLyoqCisJICogCisJICogQHBhcmFtIHNpbXVsYXRpb25zCisJICogQHJldHVybgorCSAqLworCVNldDxJZGVudGlmaWFibGU+IGdldElkZW50aWZpYWJsZXNJblNpbXVsYXRpb24oCisJCQlmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uKSB7CisJCWZpbmFsIFNldCByZXRWYWwgPSBuZXcgTGlua2VkSGFzaFNldDxJU2ltdWxhdGlvbj4oKTsKKworCQkvKgorCQkgKiBUaGUgZGVmYXVsdCBtb25pdG9yIGxvY2F0aW9ucyBhbHdheXMgY29udGFpbnMgdGhlIHdvcmtzIChVUklzdWZmaXggPQorCQkgKiBaWlosIG9yIE1vbml0b3JQcmVmZXJlbmNlcy5ERUZBVUxUX0xPQ0FUSU9OX0lEIEhvd2V2ZXIsIGlmIGEgc2NlbmFyaW8KKwkJICogY29udGFpbnMgb25seSBvbmUgY291bnRyeSB0aGVuIHRoZSBaWlogbm9kZXMgZG9lcyBub3QgZXhpc3QgYW5kIHRoZQorCQkgKiB0b3AgbGV2ZWwgbm9kZSB3aWxsIGJlIHRoZSBjb3VudHJ5IGNvZGUuIFNvIGhlcmUgd2UgY2hlY2sgdGhhdCB0aGUKKwkJICogWlpaIG5vZGUgZXhpc3RzLiBJZiBpdCBkb2VzIG5vdCBleGlzdCB3ZSBsb29rIGZvciB0aHJlZSBsZXR0ZXIKKwkJICogY291bnRyeSBjb2RlKHMpIGFuZCBhZGQgdGhhdCAodGhvc2UgLSBidXQgdGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lKQorCQkgKiB0byB0aGUgbGlzdC4KKwkJICovCisJCWZpbmFsIEdyYXBoIGdyYXBoID0gc2ltdWxhdGlvbi5nZXRTY2VuYXJpbygpLmdldENhbm9uaWNhbEdyYXBoKCk7CisJCS8qCisJCSAqIHRoaXMgY29kZSB3YXMgdXNlZCB0byBhdm9pZCBhIGJ1ZyB0aGF0IHNob3VsZCBub3cgYmUgZml4ZWQKKwkJICogCisJCSAqIGlmIChncmFwaCA9PSBudWxsKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiZ3JhcGggaXMgbnVsbCIpOyAvLyB0cnkKKwkJICogc2V2ZXJhbCB0aW1lcyBmb3IgKGludCBpaSA9IDAgOyBpaSA8IDUwOyBpaSArKykgeyB0cnkgeworCQkgKiBUaHJlYWQuc2xlZXAoMTAwKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgLy8gbm90aGluZyB9IGdyYXBoID0KKwkJICogc2ltdWxhdGlvbi5nZXRTY2VuYXJpbygpLmdldENhbm9uaWNhbEdyYXBoKCk7IGlmIChncmFwaCAhPSBudWxsKQorCQkgKiBicmVhazsgfS8vIGZvciAxMCB0cnlzIH0gLy9pZiBncmFwaCBudWxsCisJCSAqLworCisJCWlmIChncmFwaCAhPSBudWxsKSB7CisJCQkvLyBmaW5hbCBFTWFwIGFsbE5vZGVzID0gZ3JhcGguZ2V0Tm9kZXMoKTsKKwkJCS8vIGZpbmFsIFNldCBhbGxHcmFwaFVSSXMgPSBhbGxOb2Rlcy5rZXlTZXQoKTsKKwkJCS8vIGZpbmFsIFVSSSBkZWZhdWx0VVJJID0gTW9uaXRvclByZWZlcmVuY2VzLmdldERlZmF1bHRVUkkoKTsKKworCQkJZmluYWwgSXRlcmF0b3IgaXRlciA9IG1vbml0b3JTZXQuaXRlcmF0b3IoKTsKKwkJCXdoaWxlICgoaXRlciAhPSBudWxsKSAmJiAoaXRlci5oYXNOZXh0KCkpKSB7CisJCQkJZmluYWwgU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworCQkJCUlkZW50aWZpYWJsZSBub2RlID0gbnVsbDsKKwkJCQlVUkkgbG9jVVJJID0gbnVsbDsKKwkJCQl0cnkgeworCQkJCQlsb2NVUkkgPSBVUkkuY3JlYXRlVVJJKGtleSk7CisJCQkJCW5vZGUgPSBncmFwaC5nZXROb2RlKGxvY1VSSSk7CisJCQkJCWlmIChub2RlICE9IG51bGwpIHsKKwkJCQkJCXJldFZhbC5hZGQobm9kZSk7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworCQkJCQlvcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy5BY3RpdmF0b3IubG9nRXJyb3IoCisJCQkJCQkJIkxvZ2dlclZpZXdlci5nZXRJZGVudGlmaWFibGVzSW5TaW11bGF0aW9uKCkgRXJyb3Igc2V0dGluZyBJZGVudGlmaWFibGUgdG8gIgorCQkJCQkJCQkJKyBrZXkgKyAiICIsIGUpOworCQkJCX0KKwkJCX0vLyB3aGlsZSBsb2NhdGlvbnMgdG8gbW9uaXRvcgorCisJCX0vLyBncmFwaCBub3QgbnVsbAorCisJCXJldHVybiByZXRWYWw7CisJfS8vIGdldElkZW50aWZpYWJsZXNJblNpbXVsYXRpb24KKwkKKwkKKwkvKioKKwkgKiBjbGVhbnMgdXAgb2xkIGRpc3BsYXlzCisJICogCisJICogQHBhcmFtIGRlZnVuY3RJZGVudGlmaWFibGVzCisJICovCisJcHJpdmF0ZSB2b2lkIGNsZWFudXAoU2V0IGRlZnVuY3RJZGVudGlmaWFibGVzLCBJU2ltdWxhdGlvbiByZW1vdmVkU2ltdWxhdGlvbikgeworCQlpZihkZWZ1bmN0SWRlbnRpZmlhYmxlcyE9bnVsbCkgeworCQkJCisJCQlJdGVyYXRvciBpdGVyID0gZGVmdW5jdElkZW50aWZpYWJsZXMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlKChpdGVyIT1udWxsKSYmKGl0ZXIuaGFzTmV4dCgpKSkgeworCQkJCUlkZW50aWZpYWJsZSBpZGVudCA9IChJZGVudGlmaWFibGUpaXRlci5uZXh0KCk7CisJCQkJaWYgKG5vT3RoZXJTaW11bGF0aW9uQ29udGFpbnMoaWRlbnQscmVtb3ZlZFNpbXVsYXRpb24pKSBtb25pdG9yU2V0LnJlbW92ZShpZGVudC5nZXRVUkkoKS50b1N0cmluZygpKTsKKwkJCX0gLy8gd2hpbGUKKwkJCQkJCisJCQkJLypmaW5hbCBDb250cm9sW10gYWxsQ29udHJvbHMgPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKKwkJCQlmb3IgKGZpbmFsIENvbnRyb2wgZWxlbWVudCA6IGFsbENvbnRyb2xzKSB7CisJCQkJCWZpbmFsIExvZ2dlckNvbnRyb2wgbG9nZ2VyQ29udHJvbCA9IChMb2dnZXJDb250cm9sKSBlbGVtZW50OworCQkJCQlmaW5hbCBJZGVudGlmaWFibGUgdGVzdElkZW50aWZpYWJsZSA9IGxvZ2dlckNvbnRyb2wuZ2V0SWRlbnRpZmlhYmxlKCk7CisJCQkJCWlmICgodGVzdElkZW50aWZpYWJsZT09bnVsbCl8fCghZGVmdW5jdElkZW50aWZpYWJsZXMuY29udGFpbnModGVzdElkZW50aWZpYWJsZSkpKSB7CisJCQkJCQkvLyBkaXNwb3NlIGlmIHdlIGtub3cgaXQgaXMgdGhlIHJlbW92ZWQgc2ltdWxhdGlvbgorCQkJCQkJaWYobG9nZ2VyQ29udHJvbC5zaW11bGF0aW9uLmdldFNlcXVlbmNlTnVtYmVyKCk9PXJlbW92ZWRTaW11bGF0aW9uLmdldFNlcXVlbmNlTnVtYmVyKCkpIGxvZ2dlckNvbnRyb2wucmVtb3ZlKCk7CisJCQkJCX0gLy8gaWYKKwkJCQl9IC8vIGZvciBlYWNoIExvZ2dlckNvbnRyb2wKKwkJCQkqLworCQl9Ly8gaWYgc2V0IG5vdCBudWxsCisJCQorCX0vLyBjbGVhbnVwCisKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJZGVudGlmaWFibGUoZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50KSB7CisJCS8vIEFueSBzaW11bGF0aW9ucyB0byByZW1vdmU/CisJCWlmIChpZGVudCAhPSBudWxsKSB7CisJCQkvLyBZZXMKKwkJCUl0ZXJhdG9yIGl0ZXIgPSBpZGVudGlmaWFibGVzVG9EaXNwbGF5TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoKGl0ZXIgIT0gbnVsbCkgJiYgKGl0ZXIuaGFzTmV4dCgpKSkgeworCQkJCUlTaW11bGF0aW9uIHNpbSA9IChJU2ltdWxhdGlvbikgaXRlci5uZXh0KCk7CisJCQkJU2V0PElkZW50aWZpYWJsZT4gaWRlbnRpZmlhYmxlc1RvRGlzcGxheSA9IGlkZW50aWZpYWJsZXNUb0Rpc3BsYXlNYXAKKwkJCQkJCS5nZXQoc2ltKTsKKwkJCQlpZGVudGlmaWFibGVzVG9EaXNwbGF5LnJlbW92ZShpZGVudCk7CisJCQl9CisJCQkvLyBwcmVmZXJlbmNlIHN0YXRlIGhhcyBjaGFuZ2VkCisJCQlzYXZlUHJlZmVyZW5jZVN0YXRlKCk7CisJCX0gLy8gaWYKKwl9IC8vIHJlbW92ZUZyb21EaXNwbGF5ZWRTaW11bGF0aW9uU2V0CisKKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBub090aGVyU2ltdWxhdGlvbkNvbnRhaW5zKGZpbmFsIElkZW50aWZpYWJsZSBpZGVudCwgZmluYWwgSVNpbXVsYXRpb24gcmVtb3ZlZFNpbSkgeworCQkvLyBBbnkgc2ltdWxhdGlvbnMgdG8gcmVtb3ZlPworCQlpZiAoaWRlbnQgIT0gbnVsbCkgeworCQkJLy8gWWVzCisJCQlJdGVyYXRvciBpdGVyID0gaWRlbnRpZmlhYmxlc1RvRGlzcGxheU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworCQkJd2hpbGUgKChpdGVyICE9IG51bGwpICYmIChpdGVyLmhhc05leHQoKSkpIHsKKwkJCQlJU2ltdWxhdGlvbiBzaW0gPSAoSVNpbXVsYXRpb24pIGl0ZXIubmV4dCgpOworCQkJCWlmIChzaW0uZ2V0U2VxdWVuY2VOdW1iZXIoKSE9IHJlbW92ZWRTaW0uZ2V0U2VxdWVuY2VOdW1iZXIoKSkgeworCQkJCQlTZXQ8SWRlbnRpZmlhYmxlPiBpZGVudGlmaWFibGVzVG9EaXNwbGF5ID0gaWRlbnRpZmlhYmxlc1RvRGlzcGxheU1hcC5nZXQoc2ltKTsKKwkJCQkgICAgaWYgKGlkZW50aWZpYWJsZXNUb0Rpc3BsYXkuY29udGFpbnMoaWRlbnQpKSByZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9IC8vIGlmCisJCXJldHVybiB0cnVlOworCX0gLy8gcmVtb3ZlRnJvbURpc3BsYXllZFNpbXVsYXRpb25TZXQKKworCQorCS8qKgorCSAqIENyZWF0ZSBhbmQgZGlzcG9zZSBvZiBNYXBDb250cm9scyBhcyBuZWNlc3NhcnkgdG8gZGlzcGxheSB0aGUgc2VsZWN0ZWQKKwkgKiBTaW11bGF0aW9ucy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVZpZXcoSVNpbXVsYXRpb24gW10gbmV3U2ltdWxhdGlvbnMpIHsKKworCQl0cnkgeworCQkJLy8gcHJvYmxlbSBoZXJlIHdoZW4gd2Ugc3RhcnQgdXAKKwkJCS8vIEFyZSB3ZSBkb25lPworCQkJaWYgKGNvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQkvLyBZZXMKKwkJCQlyZXR1cm47CisJCQl9IC8vIGlmCisKKwkJCXNlbGVjdGlvbiA9IG51bGw7CisKKwkJCWlmICgobmV3U2ltdWxhdGlvbnMgIT0gbnVsbCkgJiYgKG5ld1NpbXVsYXRpb25zLmxlbmd0aCA+PSAxKSkgeworCisJCQkJc3luY2hyb25pemVkICh0aGlzKSB7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3U2ltdWxhdGlvbnMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCUlTaW11bGF0aW9uIHNpbSA9IG5ld1NpbXVsYXRpb25zW2ldOworCQkJCQkKKwkJCQkJCVN0cmluZyBzY2VuYXJpb1VSTCA9IHNpbS5nZXRTY2VuYXJpbygpLmdldFVSSSgpLnRvU3RyaW5nKCk7CisJCQkJCQlTdHJpbmcgZGlybmFtZSA9IFV0aWwuZ2V0TG9nZ2luZ0ZvbGRlcihzY2VuYXJpb1VSTCk7CisJCQkJCQkJCisJCQkJCQlFTGlzdDxEZWNvcmF0b3I+IGRlY29yYXRvcnMgPSBzaW0uZ2V0U2NlbmFyaW8oKS5nZXRDYW5vbmljYWxHcmFwaCgpLmdldERlY29yYXRvcnMoKTsKKwkJCQkJCWZvcihEZWNvcmF0b3IgZGVjOmRlY29yYXRvcnMpIHsKKwkJCQkJCQlpZihkZWMgaW5zdGFuY2VvZiBJbnRlZ3JhdGlvbkRlY29yYXRvciAmJiAhKGRlYyBpbnN0YW5jZW9mIEFnZ3JlZ2F0aW5nU0lEaXNlYXNlTW9kZWwpKSB7CisJCQkJCQkJCUludGVncmF0aW9uRGVjb3JhdG9yIGRtID0gKEludGVncmF0aW9uRGVjb3JhdG9yKWRlYzsKKwkJCQkJCQkJLy9TdHJpbmcgZGlzZWFzZU5hbWUgPSBkbS5nZXREaXNlYXNlTmFtZSgpOworCQkJCQkJCQlmaW5hbCBMb2dnZXJDb250cm9sIGxvZ2dlckNvbnRyb2wgPSBsY2YuY3JlYXRlKGNvbXBvc2l0ZSwgZGlybmFtZSwgc2ltLCBkbSk7CisJCQkJCQkJCWxvZ2dlckNvbnRyb2wuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCQkJCQkJCQlsb2dnZXJDb250cm9sLmNyZWF0ZVRvcENvbXBvc2l0ZShjb21wb3NpdGUpOworCQkJCQkJCX0gLy8gRGlzZWFzZU1vZGVsCisJCQkJCQl9IC8vIEZvciBlYWNoIGRlY29yYXRvcgorCQkJCQkJCisJCQkJCX0gLy8gZm9yIGFsbCBzaW11bGF0aW9ucworCisJCQkJfS8vIHN5bmNocm9uaXplZCh0aGlzKQorCisJCQl9Ly8gaWYgKHNpbXVsYXRpb25zLnNpemUoKSA+PTEpCisKKwkJCWNvbXBvc2l0ZS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7CisJCQljb21wb3NpdGUucmVkcmF3KCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkV4Y2VwdGlvbiBpbiBQb3B1bGF0ZVZpZXcoKSAiLCBlKTsKKwkJfQorCX0gLy8gcG9wdWxhdGVWaWV3CisKKwkvKioKKwkgKiBBZGRzIGFsbCBpZGVudGlmaWFibGUgdG8gdGhlIG1hcCBieSB0aGUgc2ltdWxhdGlvbiB0aGV5IGFyZSBpbgorCSAqIEBwYXJhbSBzaW11bGF0aW9ucworCSAqIAorCSAqLworCXByaXZhdGUgdm9pZCBhZGRBbGxJZGVudGlmaWFibGVzQnlTaW11bGF0aW9uKGZpbmFsIExpc3Q8SVNpbXVsYXRpb24+IHNpbXVsYXRpb25MaXN0KSB7CisJCQorCQlmb3IgKGludCBpID0gMDsgaSA8IHNpbXVsYXRpb25MaXN0LnNpemUoKTsgaSsrKSB7CisJCQlmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uID0gc2ltdWxhdGlvbkxpc3QuZ2V0KGkpOworCQkJCisJCQlTZXQ8SWRlbnRpZmlhYmxlPiBpZGVudGlmaWFibGVzVG9EaXNwbGF5U2V0ID1nZXRJZGVudGlmaWFibGVTZXQoc2ltdWxhdGlvbik7CisKKwkJCS8qCisJCQkgKiBUaGUgZGVmYXVsdCBtb25pdG9yIGxvY2F0aW9ucyBhbHdheXMgY29udGFpbnMgdGhlIHdvcmtzCisJCQkgKiAoVVJJc3VmZml4ID0gWlpaLCBvciBNb25pdG9yUHJlZmVyZW5jZXMuREVGQVVMVF9MT0NBVElPTl9JRAorCQkJICogSG93ZXZlciwgaWYgYSBzY2VuYXJpbyBjb250YWlucyBvbmx5IG9uZSBjb3VudHJ5IHRoZW4gdGhlIFpaWgorCQkJICogbm9kZXMgZG9lcyBub3QgZXhpc3QgYW5kIHRoZSB0b3AgbGV2ZWwgbm9kZSB3aWxsIGJlIHRoZSBjb3VudHJ5CisJCQkgKiBjb2RlLiBTbyBoZXJlIHdlIGNoZWNrIHRoYXQgdGhlIFpaWiBub2RlIGV4aXN0cy4gSWYgaXQgZG9lcyBub3QKKwkJCSAqIGV4aXN0IHdlIGxvb2sgZm9yIHRocmVlIGxldHRlciBjb3VudHJ5IGNvZGUocykgYW5kIGFkZCB0aGF0CisJCQkgKiAodGhvc2UgLSBidXQgdGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lKSB0byB0aGUgbGlzdC4KKwkJCSAqLworCQkJZmluYWwgR3JhcGggZ3JhcGggPSBzaW11bGF0aW9uLmdldFNjZW5hcmlvKCkuZ2V0Q2Fub25pY2FsR3JhcGgoKTsKKwkJCS8qCisJCQkgKiB0aGlzIGNvZGUgd2FzIHVzZWQgdG8gYXZvaWQgYSBidWcgdGhhdCBzaG91bGQgbm93IGJlIGZpeGVkCisJCQkgKiAKKwkJCSAqIGlmIChncmFwaCA9PSBudWxsKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiZ3JhcGggaXMgbnVsbCIpOyAvLyB0cnkKKwkJCSAqIHNldmVyYWwgdGltZXMgZm9yIChpbnQgaWkgPSAwIDsgaWkgPCA1MDsgaWkgKyspIHsgdHJ5IHsKKwkJCSAqIFRocmVhZC5zbGVlcCgxMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAvLyBub3RoaW5nIH0gZ3JhcGggPQorCQkJICogc2ltdWxhdGlvbi5nZXRTY2VuYXJpbygpLmdldENhbm9uaWNhbEdyYXBoKCk7IGlmIChncmFwaCAhPSBudWxsKQorCQkJICogYnJlYWs7IH0vLyBmb3IgMTAgdHJ5cyB9IC8vaWYgZ3JhcGggbnVsbAorCQkJICovCisKKwkJCWlmIChncmFwaCAhPSBudWxsKSB7CisJCQkvLwlmaW5hbCBFTWFwIGFsbE5vZGVzID0gZ3JhcGguZ2V0Tm9kZXMoKTsKKwkJCS8vCWZpbmFsIFNldCBhbGxHcmFwaFVSSXMgPSBhbGxOb2Rlcy5rZXlTZXQoKTsKKwkJCS8vCWZpbmFsIFVSSSBkZWZhdWx0VVJJID0gTW9uaXRvclByZWZlcmVuY2VzLmdldERlZmF1bHRVUkkoKTsKKwkJCQkKKworCQkJCWZpbmFsIEl0ZXJhdG9yIGl0ZXIgPSBtb25pdG9yU2V0Lml0ZXJhdG9yKCk7CisJCQkJd2hpbGUgKChpdGVyICE9IG51bGwpICYmIChpdGVyLmhhc05leHQoKSkpIHsKKwkJCQkJZmluYWwgU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworCQkJCQlJZGVudGlmaWFibGUgbm9kZSA9IG51bGw7CisJCQkJCVVSSSBsb2NVUkkgPSBudWxsOworCQkJCQl0cnkgeworCQkJCQkJbG9jVVJJID0gVVJJLmNyZWF0ZVVSSShrZXkpOworCQkJCQkJbm9kZSA9IGdyYXBoLmdldE5vZGUobG9jVVJJKTsKKwkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKKwkJCQkJCQlpZGVudGlmaWFibGVzVG9EaXNwbGF5U2V0LmFkZChub2RlKTsKKwkJCQkJCX0KKwkJCQkJfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKwkJCQkJCW9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLkFjdGl2YXRvci5sb2dFcnJvcigKKwkJCQkJCQkJIkxvZ2dlclZpZXdlci5nZXRJZGVudGlmaWFibGVzSW5TaW11bGF0aW9uKCkgRXJyb3Igc2V0dGluZyBJZGVudGlmaWFibGUgdG8gIgorCQkJCQkJCQkJCSsga2V5ICsgIiAiLCBlKTsKKwkJCQkJfQorCQkJCX0vLyB3aGlsZSBsb2NhdGlvbnMgdG8gbW9uaXRvcgorCisJCQl9Ly8gZ3JhcGggbm90IG51bGwKKworCQl9IC8vIGZvciBhbGwgc2ltdWxhdGlvbnMKKworCX0KKwkKKwkvKioKKwkgKiBGaW5kIG91dCB3aGljaCBzaW11bGF0aW9uIGlzIHJ1bm5pbmcgdGhpcyBub2RlCisJICogVE9ETyBDaGVjayB0aGlzLiBUaGlzIG1heSBub3QgYmUgdW5pcXVlIC0gd2UgbWF5IGJlIHJ1bm5pbmcgdGhlIAorCSAqIHNhbWUgc2NlbmFyaW8gdHdpY2UhIQorCSAqIEBwYXJhbSBzaW11bGF0aW9ucworCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNjZW5hcmlvTmFtZShJZGVudGlmaWFibGUgaWRlbnQpIHsKKwkJU3RyaW5nIHJldFZhbCA9ICJOT0RFX05PVF9GT1VORCI7CisJCUxpc3Q8SVNpbXVsYXRpb24+IHNpbXVsYXRpb25MaXN0ID0gc2ltdWxhdGlvbk1hbmFnZXIuZ2V0QWN0aXZlU2ltdWxhdGlvbnMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaW11bGF0aW9uTGlzdC5zaXplKCk7IGkrKykgeworCQkJZmluYWwgSVNpbXVsYXRpb24gc2ltdWxhdGlvbiA9IHNpbXVsYXRpb25MaXN0LmdldChpKTsKKwkJCQorCQkJZmluYWwgR3JhcGggZ3JhcGggPSBzaW11bGF0aW9uLmdldFNjZW5hcmlvKCkuZ2V0Q2Fub25pY2FsR3JhcGgoKTsKKwkJCQorCQkJaWYgKGdyYXBoICE9IG51bGwpIHsKKwkJCQkvLyBpcyB0aGlzIG5vZGUgaW4gdGhpcyBzaW11bGF0aW9uPworCQkJCWZpbmFsIElkZW50aWZpYWJsZSBub2RlID0gZ3JhcGguZ2V0Tm9kZShpZGVudC5nZXRVUkkoKSk7CisJCQkJaWYgKG5vZGUgIT0gbnVsbCkgeworCQkJCSAgICAvLyBncmFwaCBjb250YWlucyBub2RlCisJCQkJCXJldHVybiBzaW11bGF0aW9uLmdldFNjZW5hcmlvKCkudG9TdHJpbmcoKTsKKwkJCQl9Ly8gbm9kZSBleGlzdHMKKwkJCX0vLyBncmFwaCBub3QgbnVsbAorCQl9IC8vIGZvciBhbGwgc2ltdWxhdGlvbnMKKwkJcmV0dXJuIHJldFZhbDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2ltdWxhdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwkvKnByaXZhdGUgYm9vbGVhbiBpc0Rpc3BsYXllZChmaW5hbCBJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlLAorCQkJSVNpbXVsYXRpb24gc2ltdWxhdGlvbikgeworCQlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7CisJCWZpbmFsIENvbnRyb2xbXSBhbGxDb250cm9scyA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOworCQlmb3IgKGZpbmFsIENvbnRyb2wgZWxlbWVudCA6IGFsbENvbnRyb2xzKSB7CisJCQlmaW5hbCBMb2dnZXJDb250cm9sIGxvZ2dlckNvbnRyb2wgPSAoTG9nZ2VyQ29udHJvbCkgZWxlbWVudDsKKworCQkJaWYgKGxvZ2dlckNvbnRyb2wuc2ltdWxhdGlvbi5nZXRTZXF1ZW5jZU51bWJlcigpID09IHNpbXVsYXRpb24KKwkJCQkJLmdldFNlcXVlbmNlTnVtYmVyKCkpIHsKKworCQkJCWZpbmFsIElkZW50aWZpYWJsZSB0ZXN0SWRlbnRpZmlhYmxlID0gbG9nZ2VyQ29udHJvbC5nZXRJZGVudGlmaWFibGUoKTsKKwkJCQlpZiAodGVzdElkZW50aWZpYWJsZSAhPSBudWxsJiZ0ZXN0SWRlbnRpZmlhYmxlLmVxdWFscyhpZGVudGlmaWFibGUpKSB7CisJCQkJCXJldFZhbHVlID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfSAvLyBpZgorCisJCQl9IC8vIGlmIGNvbnRyb2wgZm9yIHNhbWUgc2ltdWxhdGlvbgorCisJCX0gLy8gZm9yIGVhY2ggTG9nZ2VyQ29udHJvbAorCQlyZXR1cm4gcmV0VmFsdWU7CisJfSAvLyBpc0Rpc3BsYXllZAorKi8KKwkvKioKKwkgKiBzYXZlIHRoZSBzdGF0ZSBvZiBwcmVmZXJyZWQgbG9jYXRpb25zIHRvIG1vbml0b3IKKwkgKi8KKwlwcml2YXRlIHZvaWQgc2F2ZVByZWZlcmVuY2VTdGF0ZSgpIHsKKworCQkvLyB3ZSBuZWVkIHRvIHdyaXRlIHByZWZlcmVuY2VzIGJ5IGFjdGl2ZSBzaW11bGF0aW9uCisJCUxpc3QgYWxsU2ltdWxhdGlvbnMgPSBudWxsOworCQlmaW5hbCBTZXQ8U3RyaW5nPiBub2Rlc0luU2ltdWxhdGlvbiA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwkJaWYgKHNpbXVsYXRpb25NYW5hZ2VyICE9IG51bGwpIHsKKwkJCWFsbFNpbXVsYXRpb25zID0gc2ltdWxhdGlvbk1hbmFnZXIuZ2V0QWN0aXZlU2ltdWxhdGlvbnMoKTsKKwkJfQorCQlpZiAoKGFsbFNpbXVsYXRpb25zICE9IG51bGwpICYmIChhbGxTaW11bGF0aW9ucy5zaXplKCkgPj0gMSkpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsU2ltdWxhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKwkJCQlub2Rlc0luU2ltdWxhdGlvbi5jbGVhcigpOworCQkJCWZpbmFsIElTaW11bGF0aW9uIHNpbSA9IChJU2ltdWxhdGlvbikgYWxsU2ltdWxhdGlvbnMuZ2V0KGkpOworCQkJCWZpbmFsIFN0cmluZyBzY2VuYXJpb05hbWUgPSBzaW0uZ2V0U2NlbmFyaW8oKS5nZXRVUkkoKQorCQkJCQkJLnRvU3RyaW5nKCk7CisKKwkJCQkvLyByZWNyZWF0ZSB0aGUgc3Vic2VjdGlvbiBmb3IgdGhpcyBzY2VuYXJpbyB1c2luZyB0aGUgbG9jYXRpb25zCisJCQkJLy8gbm93IGJlaW5nIG1vbml0b3JlZAorCQkJCWZpbmFsIElEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gbmV3IERpYWxvZ1NldHRpbmdzKHNjZW5hcmlvTmFtZSk7CisKKwkJCQlmaW5hbCBHcmFwaCBncmFwaCA9IHNpbS5nZXRTY2VuYXJpbygpLmdldENhbm9uaWNhbEdyYXBoKCk7CisJCQkJU2V0PElkZW50aWZpYWJsZT4gaWRlbnRpZmlhYmxlc1RvRGlzcGxheSA9IGdldElkZW50aWZpYWJsZVNldChzaW0pOworCQkJCWZpbmFsIEl0ZXJhdG9yIGl0ZXIgPSBpZGVudGlmaWFibGVzVG9EaXNwbGF5Lml0ZXJhdG9yKCk7CisJCQkJd2hpbGUgKChpdGVyICE9IG51bGwpICYmIChpdGVyLmhhc05leHQoKSkpIHsKKwkJCQkJZmluYWwgSWRlbnRpZmlhYmxlIGlkZW50ID0gKElkZW50aWZpYWJsZSkgaXRlci5uZXh0KCk7CisJCQkJCWlmIChpZGVudCAhPSBudWxsKSB7CisJCQkJCQkvLyBpcyB0aGlzIG5vZGUgaW4gdGhpcyBzaW11bGF0aW9uPworCQkJCQkJZmluYWwgSWRlbnRpZmlhYmxlIG5vZGUgPSBncmFwaC5nZXROb2RlKGlkZW50LmdldFVSSSgpKTsKKwkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKKwkJCQkJCQlmaW5hbCBTdHJpbmcgaWQgPSBpZGVudC5nZXRVUkkoKS50b1N0cmluZygpOworCQkJCQkJCWlmIChpZCAhPSBudWxsKSB7CisJCQkJCQkJCW5vZGVzSW5TaW11bGF0aW9uLmFkZChpZCk7CisJCQkJCQkJfQorCQkJCQkJfSAvLyBpZiBub2RlIGluIHNpbXVsYXRpb24KKwkJCQkJfQorCisJCQkJfS8vIGFsbCBjdXJyZW50bHkgZGlzcGxheWVkIG5vZGVzCisKKwkJCQlmaW5hbCBTdHJpbmdbXSBuZXdQcmVmcyA9IG5ldyBTdHJpbmdbbm9kZXNJblNpbXVsYXRpb24uc2l6ZSgpXTsKKwkJCQlmaW5hbCBJdGVyYXRvciBpdGVyMiA9IG5vZGVzSW5TaW11bGF0aW9uLml0ZXJhdG9yKCk7CisJCQkJaW50IGljb3VudCA9IDA7CisJCQkJd2hpbGUgKChpdGVyMiAhPSBudWxsKSAmJiAoaXRlcjIuaGFzTmV4dCgpKSkgeworCQkJCQluZXdQcmVmc1tpY291bnRdID0gKFN0cmluZykgaXRlcjIubmV4dCgpOworCQkJCQlpY291bnQrKzsKKwkJCQl9CisKKwkJCQlzZWN0aW9uLnB1dChMT0NBVElPTl9QUkVGRVJFTkNFX0tFWSwgbmV3UHJlZnMpOworCQkJCWlmIChtYXN0ZXJTZXR0aW5ncz09bnVsbCkgbWFzdGVyU2V0dGluZ3MgPSBuZXcgRGlhbG9nU2V0dGluZ3MoUk9PVF9LRVkpOworCQkJCW1hc3RlclNldHRpbmdzLmFkZFNlY3Rpb24oc2VjdGlvbik7CisJCQkJdHJ5IHsKKwkJCQkJbWFzdGVyU2V0dGluZ3Muc2F2ZShnZXRQcmVmRmlsZU5hbWUoKSk7CisJCQkJfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gaW9lKSB7CisJCQkJCW9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLkFjdGl2YXRvcgorCQkJCQkJCS5sb2dFcnJvcigiZXhjZXB0aW9uIHdyaXRpbmcgZmlsZSBbIgorCQkJCQkJCQkJKyBpb2UuZ2V0TWVzc2FnZSgpICsgIl0iLCBpb2UpOworCQkJCX0KKworCQkJfSAvLyBmb3IgYWxsIHNpbXVsYXRpb25zCisJCX0vLyBpZiBub3QgbnVsbAorCisJfS8vIHNhdmVQcmVmZXJlbmNlU3RhdGUKKwkKKwkvKioKKwkgKiByZXR1cm5zIHRoZSBTZXQ8SWRlbnRpZmlhYmxlPiBpbiB0aGUgaWRlbnRpZmlhYmxlc1RvRGlzcGxheU1hcAorCSAqIGNyZWF0ZXMgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisJICogQHBhcmFtIHNpbXVsYXRpb24KKwkgKiBAcmV0dXJuCisJICovCisJU2V0PElkZW50aWZpYWJsZT4gZ2V0SWRlbnRpZmlhYmxlU2V0KElTaW11bGF0aW9uIHNpbXVsYXRpb24pIHsKKwkJaWYoIWlkZW50aWZpYWJsZXNUb0Rpc3BsYXlNYXAuY29udGFpbnNLZXkoc2ltdWxhdGlvbikpIHsKKwkJCVNldDxJZGVudGlmaWFibGU+IGlkZW50aWZpYWJsZXNUb0Rpc3BsYXlTZXQgPSBuZXcgTGlua2VkSGFzaFNldDxJZGVudGlmaWFibGU+KCk7CisJCQlpZGVudGlmaWFibGVzVG9EaXNwbGF5TWFwLnB1dChzaW11bGF0aW9uLGlkZW50aWZpYWJsZXNUb0Rpc3BsYXlTZXQpOworCQl9CisJCXJldHVybiBpZGVudGlmaWFibGVzVG9EaXNwbGF5TWFwLmdldChzaW11bGF0aW9uKTsKKwl9CisJCisJLyoqCisJICogUmVtb3ZlcyB3aGl0ZXNwYWNlLCAnLCcsICcuJywgZXRjLgorCSAqIEBwYXJhbSBzCisJICogQHJldHVybiBhIGZpbHRlcmVkIHN0cmluZworCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5hbWVGaWx0ZXIgKFN0cmluZyBzKSB7CisJCVN0cmluZyBzMSA9IHMudHJpbSgpOworCQlzMSA9IHMxLnJlcGxhY2UoJyInLCcgJyk7CisJCXMxID0gczEucmVwbGFjZUFsbCgiICIsIiIpOworCQlzMSA9IHMxLnJlcGxhY2UoJywnLCdfJyk7CisJCXMxID0gczEucmVwbGFjZSgnLicsJ18nKTsKKwkJcmV0dXJuIHMxOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHVzZXMgRGlhbG9nIHNldHRpbmdzIHRvIGxvYWQgYW5kIHVwZGF0ZSAKKwkgKiB0aGUgbW9uaXRvclNldCB3aGljaCBjb250YWlucyAoZmlsdGVycykgdGhlIHZhbGlkIGxpc3QgCisJICogb2YgcHJlZmVycmVkIElkZW50aWZpYWJsZXMgdG8gZGlzcGxheSBmcm9tIHRoZSAKKwkgKiB0aGUgc3RhdGUgb2YgdGhlIHByZXZpb3VzbHkgc2F2ZWQgcHJlZmVyZW5jZSBzdGF0ZS4KKwkgKiBmb3Igc2ltdWxhdGlvbnMgdGhhdCBhcmUgcnVubmluZworCSAqIAorCSAqIEBwYXJhbSBydW5uaW5nU2ltdWxhdGlvbnMKKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlUHJlZmVyZW5jZVN0YXRlKExpc3QgcnVubmluZ1NpbXVsYXRpb25zKSB7CisKKwkJLy8gd2hhdCB0eXBlIG9mIHZpZXdlcj8gVGltZVNlcmllcywgUGhhc2VTcGFjZSBldGMKKwkJaWYgKG1hc3RlclNldHRpbmdzPT1udWxsKSByZWFkTWFzdGVyU2V0dGluZ3NGcm9tRmlsZSgpOworCQkKKwkJCisJCQorCQlpZiAoKHJ1bm5pbmdTaW11bGF0aW9ucyAhPSBudWxsKSAmJiAocnVubmluZ1NpbXVsYXRpb25zLnNpemUoKSA+PSAxKSkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydW5uaW5nU2ltdWxhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKwkJCQlmaW5hbCBJU2ltdWxhdGlvbiBzaW0gPSAoSVNpbXVsYXRpb24pIHJ1bm5pbmdTaW11bGF0aW9ucy5nZXQoaSk7CisJCQkJZmluYWwgU3RyaW5nIHNjZW5hcmlvTmFtZSA9IHNpbS5nZXRTY2VuYXJpbygpLmdldFVSSSgpCisJCQkJCQkudG9TdHJpbmcoKTsKKworCQkJCQorCQkJCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gbWFzdGVyU2V0dGluZ3MKKwkJCQkJCS5nZXRTZWN0aW9uKHNjZW5hcmlvTmFtZSk7CisJCQkJaWYgKHNlY3Rpb24gPT0gbnVsbCkgeworCQkJCQlzZWN0aW9uID0gbmV3IERpYWxvZ1NldHRpbmdzKHNjZW5hcmlvTmFtZSk7CisJCQkJCW1hc3RlclNldHRpbmdzLmFkZFNlY3Rpb24oc2VjdGlvbik7CisJCQkJfQorCQkJCS8vIG5vdyBhZGQgdGhlIHByZWZlcmVuY2VzIHRvIHRoZSBtb25pdG9yU2V0CisJCQkJZmluYWwgU3RyaW5nW10gYWxsSURzID0gc2VjdGlvbgorCQkJCQkJLmdldEFycmF5KExPQ0FUSU9OX1BSRUZFUkVOQ0VfS0VZKTsKKwkJCQlpZiAoYWxsSURzICE9IG51bGwpIHsKKwkJCQkJZm9yIChmaW5hbCBTdHJpbmcgZWxlbWVudCA6IGFsbElEcykgeworCQkJCQkJbW9uaXRvclNldC5hZGQoZWxlbWVudCk7CisJCQkJCX0vLyBmb3IgYWxsSURzCisKKwkJCQl9Ly8gaWYgbm90IG51bGwKKworCQkJfS8vIGZvciBhbGwgc2ltdWxhdGlvbnMKKwkJfS8vIGlmIGFjdGl2ZSBzaW11bGF0aW9ucworCisJfS8vIHVwZGF0ZVByZWZlcmVuY2VTdGF0ZQorCQorCS8qKgorCSAqIGdldCB0aGUgRGlhbG9nU2V0dGluZ3MgZnJvbSB0aGUgZmlsZQorCSAqLworCXB1YmxpYyB2b2lkIHJlYWRNYXN0ZXJTZXR0aW5nc0Zyb21GaWxlKCkgeworCQltYXN0ZXJTZXR0aW5ncyA9IG5ldyBEaWFsb2dTZXR0aW5ncyhST09UX0tFWSk7CisKKwkgICAgU3RyaW5nIGZpbGVuYW1lID0gZ2V0UHJlZkZpbGVOYW1lKCk7CisJCWZpbmFsIEZpbGUgZiA9IG5ldyBGaWxlKGZpbGVuYW1lKTsKKwkJaWYgKGYuZXhpc3RzKCkpIHsKKwkJCXRyeSB7CisJCQkJbWFzdGVyU2V0dGluZ3MubG9hZChmaWxlbmFtZSk7CisJCQl9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQlvcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy5BY3RpdmF0b3IubG9nRXJyb3IoCisJCQkJCQkiZXhjZXB0aW9uIGxvYWRpbmcgZmlsZSBbIiArIGlvZS5nZXRNZXNzYWdlKCkKKwkJCQkJCQkJKyAiXSIsIGlvZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBlbHNlIGNyZWF0ZSBpdAorCQkJdHJ5IHsKKwkJCQltYXN0ZXJTZXR0aW5ncy5zYXZlKGZpbGVuYW1lKTsKKwkJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgeworCQkJCW9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLkFjdGl2YXRvci5sb2dFcnJvcigKKwkJCQkJCSJleGNlcHRpb24gY3JlYXRpbmcgZmlsZSBbIiArIGlvZS5nZXRNZXNzYWdlKCkKKwkJCQkJCQkJKyAiXSIsIGlvZSk7CisJCQl9CisJCX0gLy8gZWxzZWlmIGYgIWV4aXN0cworCX0vLyByZWFkIG1hc3RlciBzZXR0dGluZ3MKKwkKKwkvKiogCisJICogZ2V0cyB0aGUgcHJlZmVyZW5jZXMgZmlsZSBuYW1lCisJICogQHJldHVybiBmaWxlIG5hbWUgY29udGFpbmluZyB0aGUgdXNlcnMgcHJlZmVyZW5jZXMKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFByZWZGaWxlTmFtZSgpIHsKKwkJZmluYWwgU3RyaW5nIGNvbnRyb2xDYXRlZ29yeSA9IGxjZi5nZXRDb250cm9sVHlwZSgpOworCQkvLyBHZXQgdGhlIHJpZ2h0IHByZWZlcmVuY2UgZmlsZQorCQlTdHJpbmcgZmlsZW5hbWUgPSBQQVRILmFwcGVuZChjb250cm9sQ2F0ZWdvcnkgKyAiXyIgKyBSRVBPUlRWSUVXUFJFRkVSRU5DRVNfRklMRU5BTUUpLnRvT1NTdHJpbmcoKTsKKwkJcmV0dXJuIGZpbGVuYW1lOworCX0KKworCisKK30gLy8gTG9nZ2VyVmlld2VyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvdmlld3MvTWVzc2FnZXMuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy92aWV3cy9NZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjZjOTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvdmlld3MvTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDQyIEBACisvLyBNZXNzYWdlcy5qYXZhCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cworICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZXMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy52aWV3cy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCisJCQkuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKKworCXByaXZhdGUgTWVzc2FnZXMoKSB7CisJCS8vIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0ga2V5CisJICogQHJldHVybiB0aGUgc3RyaW5nIG1hdGNoaW5nIHRoZSBrZXkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoZmluYWwgU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoZmluYWwgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9Cit9IC8vIE1lc3NhZ2VzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvdmlld3MvTmV3Q1NWTG9nV3JpdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvdmlld3MvTmV3Q1NWTG9nV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVkYTJiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzL3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWwvbG9nZ2Vycy92aWV3cy9OZXdDU1ZMb2dXcml0ZXIuamF2YQpAQCAtMCwwICsxLDgyOCBAQAorLy8gQ1NWTG9nV3JpdGVyCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLnZpZXdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLlByb3BlcnR5U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uYWRhcHRlcnMudGltZS5UaW1lUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmNvbW1vbi5Db21tb25QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5jb21tb24uU3RyaW5nVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLmdyYXBoLkR5bmFtaWNMYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUuZ3JhcGguSW50ZWdyYXRpb25MYWJlbFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uY29yZS5ncmFwaC5Ob2RlTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLkRlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmNvcmUubW9kZWwuSW50ZWdyYXRpb25EZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5jb3JlLm1vZGVsLlNURU1UaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucG9wdWxhdGlvbi5Qb3B1bGF0aW9uRW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRlZmluaXRpb25zLmFkYXB0ZXJzLnBvcHVsYXRpb24uUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucG9wdWxhdGlvbi5Qb3B1bGF0aW9uRW51bWVyYXRvckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGVmaW5pdGlvbnMuYWRhcHRlcnMucmVsYXRpdmV2YWx1ZS5SZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0uZGlzZWFzZW1vZGVscy5tdWx0aXBvcHVsYXRpb24uTXVsdGlQb3B1bGF0aW9uU0lEaXNlYXNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLkRpc2Vhc2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQuRGlzZWFzZU1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5qb2JzLnNpbXVsYXRpb24uSVNpbXVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLkRlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0ucG9wdWxhdGlvbm1vZGVscy5zdGFuZGFyZC5Qb3B1bGF0aW9uR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLlBvcHVsYXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQuUG9wdWxhdGlvbk1vZGVsTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMuQWN0aXZhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN0ZW0udXRpbC5sb2dnZXJzLnByZWZlcmVuY2VzLlByZWZlcmVuY2VDb25zdGFudHM7CisKKy8qKgorICogQSBsb2cgd3JpdGVyIHdyaXRpbmcgQ1NWIGZpbGVzIGNvbnRhaW5pbmcgZGF0YSBmb3IgYSBzaW5nbGUgc3RhdGUgb2YgdGhlIHNpbXVsYXRpb24uCisgKiBDb2x1bW5zIGNvbnRhaW4gbG9jYXRpb24gSURzIGFzIHdlbGwgYXMgc2ltdWxhdGlvbiB0aW1lIGFuZCBpdGVyYXRpb24gaWQuCisgKi8KKworcHVibGljIGNsYXNzIE5ld0NTVkxvZ1dyaXRlciBleHRlbmRzIExvZ1dyaXRlciB7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSUQgPSAiZGF0YSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NWX0VYVCA9ICIuY3N2IjsKKwkKKwlwcml2YXRlIFN0cmluZyBkaXJlY3RvcnlOYW1lOworCisJLy9wcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRFVCTElOX0NPUkVfQ0xBU1MgPSAiRHVibGluQ29yZSI7CisJCisJcHJpdmF0ZSBzdGF0aWMgU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIkVFRSBkIE1NTSB5eSIsIExvY2FsZS5nZXREZWZhdWx0KCkpOworCQorCS8qKgorCSAqIENTViBIZWFkZXIgTGFiZWwgZm9yIHRpbWUgY29sdW1uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRV9MQUJFTCA9ICJ0aW1lIjsKKworCS8qKgorCSAqIENTViBIZWFkZXIgTGFiZWwgZm9yIGl0ZXJhdGlvbiBjb2x1bW4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVEVSQVRJT05fTEFCRUwgPSAiaXRlcmF0aW9uIjsKKworCS8qKgorCSAqIE5hbWUgb2YgYWxsIHJ1biBwYXJhbWV0ZXIgZmlsZXMgKG9uZSBwZXIgc2NlbmFyaW8gZm9sZGVyKQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTl9QQVJBTUVURVJfRklMRV9OQU1FID0gInJ1bnBhcmFtZXRlcnMuY3N2IjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTFVTSF9FQUNIX0lURVJBVElPTiA9IDUwOyAvLyBIb3cgb2Z0ZW4gZG8gd2UgZmx1c2ggdGhlIGZpbGVzPworCisJcHJpdmF0ZSBpbnQgaWNvdW50ID0gMDsKKworCXByaXZhdGUgc3RhdGljIFN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgaXRlbVByb3ZpZGVyRmFjdG9yeTsKKwkKKwlwcml2YXRlIHN0YXRpYyBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBwb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXJGYWN0b3J5OworCQorCS8qKgorCSAqIEZpbGVXcml0ZXJzIGFyZSBzdG9yZWQgaGVyZSwgb3JnYW5pemVkIGJ5IHN0YXRlIChlLmcuIFMsIEUsIEksIFIpIGFuZCBnZW9ncmFwaGljIGxldmVsCisJICovCisJCisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RhdGVMZXZlbE1hcCwgRmlsZVdyaXRlcj4gZmlsZVdyaXRlcnM7CisJCisJcHJpdmF0ZSBib29sZWFuIGxvZ0ludGVnZXJzOworCQorCS8qKgorCSAqIAorCSAqIEBwYXJhbSBkaXJOYW1lCisJICogQHBhcmFtIHNpbXVsYXRpb24KKwkgKiBAcGFyYW0gZG0KKwkgKi8KKwlwdWJsaWMgTmV3Q1NWTG9nV3JpdGVyKGZpbmFsIFN0cmluZyBkaXJOYW1lLCBmaW5hbCBJU2ltdWxhdGlvbiBzaW11bGF0aW9uLCBJbnRlZ3JhdGlvbkRlY29yYXRvciBkbSkgeworCQlsb2dJbnRlZ2VycyA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkxPR19JTlRFR0VSX1BSRUZFUkVOQ0UpOworCQlmaWxlV3JpdGVycyA9IG5ldyBIYXNoTWFwPFN0YXRlTGV2ZWxNYXAsIEZpbGVXcml0ZXI+KCk7CisJCQorCQluZWVkc0hlYWRlciA9IHRydWU7CisJCWRvbmUgPSBmYWxzZTsKKwkJaWNvdW50ID0gMDsKKwkJLy9maW5hbCBTdHJpbmcgY3VycmVudERhdGUgPSBnZXREYXRlVGltZU51bWVyaWMoKTsKKwkJU3RyaW5nIHVuaXF1ZUlEID0gREVGQVVMVF9JRDsKKwkJaWYgKHNpbXVsYXRpb24gIT0gbnVsbCkgeworCQkJdW5pcXVlSUQgPSBzaW11bGF0aW9uLmdldFVuaXF1ZUlEU3RyaW5nKCk7CisJCQl3aGlsZSh1bmlxdWVJRD09bnVsbCkgeworCQkJCXVuaXF1ZUlEID0gc2ltdWxhdGlvbi5nZXRVbmlxdWVJRFN0cmluZygpOworCQkJfQorCQl9CisJCS8vIFVnaAorCQlTdHJpbmcgZGlzZWFzZU5hbWUgPSBudWxsOworCQkvL1N0cmluZyBwb3B1bGF0aW9uTmFtZSA9IG51bGw7CisJCWlmKGRtIGluc3RhbmNlb2YgRGlzZWFzZU1vZGVsKSB7CisJCQlkaXNlYXNlTmFtZSA9ICgoRGlzZWFzZU1vZGVsKWRtKS5nZXREaXNlYXNlTmFtZSgpOworCQkJLy9wb3B1bGF0aW9uTmFtZSA9ICgoRGlzZWFzZU1vZGVsKWRtKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpOworCQl9CisJCWVsc2UgaWYgKGRtIGluc3RhbmNlb2YgUG9wdWxhdGlvbk1vZGVsKSB7CisJCQlkaXNlYXNlTmFtZSA9ICgoUG9wdWxhdGlvbk1vZGVsKWRtKS5nZXROYW1lKCk7CisJCQkvL3BvcHVsYXRpb25OYW1lID0gKChQb3B1bGF0aW9uTW9kZWwpZG0pLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCk7CisJCX0KKwkJCisJCWlmIChkaXNlYXNlTmFtZSA9PSBudWxsKSB7CisJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkZhaWxlZCB0byBmaW5kIGEgZGlzZWFzZSBvciBwb3B1bGF0aW9uIG1vZGVsLiAgQ2Fubm90IGNyZWF0ZSBDU1YgTG9nZ2VyIiwgbnVsbCk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCXRoaXMuZGlyZWN0b3J5TmFtZSA9IGRpck5hbWUgKyBzZXArdW5pcXVlSUQgKyBzZXAgKyBkaXNlYXNlTmFtZS50cmltKCkgKyBzZXA7CisJCQorCQkvLyByZW1vdmUgaWxsZWdhbCBzdHJpbmdzCisJCWRpcmVjdG9yeU5hbWU9IGRpcmVjdG9yeU5hbWUucmVwbGFjZUFsbCgiXCIiLCAiIik7CisJCQkKKwkJZmluYWwgRmlsZSBkaXIgPSBuZXcgRmlsZSh0aGlzLmRpcmVjdG9yeU5hbWUpOworCisJCWlmICgoIWRpci5leGlzdHMoKSkgfHwgKCFkaXIuaXNEaXJlY3RvcnkoKSkpIHsKKwkJCS8vIGNyZWF0ZSBpdC4KKwkJCWJvb2xlYW4gc3VjY2VzcyA9IGRpci5ta2RpcnMoKTsKKwkJCWlmICghc3VjY2VzcykgeworCQkJCUFjdGl2YXRvci5sb2dFcnJvcigKKwkJCQkJCSJGYWlsZWQgdG8gQ3JlYXRlIERyaWVjdG9yeSIgKyBkaXJlY3RvcnlOYW1lLAorCQkJCQkJbmV3IElPRXhjZXB0aW9uKCJGYWlsZWQgdG8gQ3JlYXRlIERyaWVjdG9yeSIKKwkJCQkJCQkJKyBkaXJlY3RvcnlOYW1lKSk7CisJCQl9CisJCQkKKwkJfQorCQlsb2dSdW5QYXJhbWV0ZXJzKGRtKTsKKwkJCisJfSAvLyBDU1ZMb2dXcml0ZXIKKworCisJLyoqCisJICogTXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gbG9nIGRhdGEgaW4gcnVuIHRocmVhZAorCSAqIAorCSAqIEBwYXJhbSBydnAKKwkgKiAKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBsb2dIZWFkZXIoZmluYWwgUmVsYXRpdmVWYWx1ZVByb3ZpZGVyQWRhcHRlciBydnApIHsKKwkJLyoKKwkJICogVE9ETyBkbyB3ZSBuZWVkIGEgaGVhZGVyPworCQkgKi8KKwl9Ly8gbG9nIGhlYWRlcgorCisJLyoqCisJICogbG9nSGVhZGVyIE5ldyBtZXRob2QKKwkgKiAKKwkgKiBAcGFyYW0gc2ltIFNpbXVsYXRpb24gdG8gbG9nCisJICogQHBhcmFtIGRtIERpc2Vhc2UgTW9kZWwKKwkgKiBAcGFyYW0gbm9kZUxldmVscyBMZXZlbCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBub2RlIGluIHRoZSBzaW11bGF0aW9uCisJICogQHBhcmFtIHRpbWVQcm92aWRlciBUaW1lIHByb3ZpZGVyCisJICovCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbG9nSGVhZGVyKElTaW11bGF0aW9uIHNpbSwgSW50ZWdyYXRpb25EZWNvcmF0b3IgZG0sIE1hcDxOb2RlLCBJbnRlZ2VyPm5vZGVMZXZlbHMsIFRpbWVQcm92aWRlciB0aW1lUHJvdmlkZXIpIHsJCisJCQorCQkKKwkJaW50IGhlYWRlckl0ZW1Db3VudCA9IDA7CisJCQorCQlTdHJpbmcgZGlycyA9IHRoaXMuZGlyZWN0b3J5TmFtZTsKKwkJRmlsZSBkaXIgPSBuZXcgRmlsZShkaXJzKTsKKwkJaWYoIWRpci5leGlzdHMoKSkgeworCQkJYm9vbGVhbiBzdWNjZXNzID0gZGlyLm1rZGlycygpOworCQkJaWYoIXN1Y2Nlc3MpIHsKKwkJCQlBY3RpdmF0b3IubG9nRXJyb3IoCisJCQkJCQkiRmFpbGVkIHRvIENyZWF0ZSBEcmllY3RvcnkiICsgZGlyZWN0b3J5TmFtZSwKKwkJCQkJCW5ldyBJT0V4Y2VwdGlvbigiRmFpbGVkIHRvIENyZWF0ZSBEcmllY3RvcnkiCisJCQkJCQkJCSsgZGlyZWN0b3J5TmFtZSkpOworCQkJfQorCQl9CisJCS8vIEZpbmQgbWluL21heCBsZXZlbAorCQlpbnQgbWluTGV2ZWwgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKwkJaW50IG1heExldmVsID0gLTE7CisJCWZvcihpbnQgbGV2ZWw6bm9kZUxldmVscy52YWx1ZXMoKSkgeworCQkJaWYobGV2ZWwgPCBtaW5MZXZlbCltaW5MZXZlbCA9IGxldmVsOworCQkJaWYobGV2ZWwgPiBtYXhMZXZlbCltYXhMZXZlbCA9IGxldmVsOworCQl9CisJCXRyeSB7CisJCQkKKwkJCS8vIEdldCB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgY2Fub25pY2FsIGdyYXBoIGFuZCBsb29rIGF0IHRoZSBsYWJlbHMuCisJCQkvLyBXZSB3aWxsIGdlbmVyYXRlIG9uZSBsb2cgZmlsZSBmb3IgZWFjaCBsYWJlbAorCQkJLy8gRmluZCB0aGUgZmlyc3Qgbm9kZSB0aGF0IGhhcyBzb21lIGxhYmVscyBhbmQgdXNlIHRob3NlIGFzIHJlcHJlc2VudGF0aXZlIGxhYmVscworCQkJLy8gZm9yIGV2ZXJ5IG5vZGUKKwkJCQorCQkJRUxpc3Q8Tm9kZUxhYmVsPiBsYWJlbHMgPSBudWxsOworCQkJSW50ZWdyYXRpb25MYWJlbCBsYWJlbCA9IG51bGw7CisJCQlJdGVyYXRvcjxEeW5hbWljTGFiZWw+IGl0ID0gKChEZWNvcmF0b3IpZG0pLmdldExhYmVsc1RvVXBkYXRlKCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlKGl0Lmhhc05leHQoKSkgeworCQkJCUR5bmFtaWNMYWJlbCBsID0gaXQubmV4dCgpOworCQkJCWlmKGwgaW5zdGFuY2VvZiBJbnRlZ3JhdGlvbkxhYmVsKSB7CisJCQkJCWxhYmVsID0gKEludGVncmF0aW9uTGFiZWwpbDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CisJCQlpZihsYWJlbCA9PSBudWxsKSB7CisJCQkJLy8gV2UgY291bGRuJ3QgZmluZCBhbnkgbGFiZWxzLiBQQU5JQyEKKwkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkNhbm5vdCBsb2csIG5vIGxhYmVsIGZvdW5kIGZvciBkZWNvcmF0b3IhIiwgbmV3IEV4Y2VwdGlvbigpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlJSXRlbVByb3BlcnR5U291cmNlIHByb3BlcnR5U291cmNlID0gbnVsbDsKKwkJCUFycmF5TGlzdDxTdHJpbmc+cG9wdWxhdGlvbklkZW50aWZpZXJzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQkKKwkJCWlmKGRtIGluc3RhbmNlb2YgRGlzZWFzZU1vZGVsKSB7CisJCQkJU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBpdGVtUHJvdmlkZXJGYWN0b3J5ID0gZ2V0SXRlbVByb3ZpZGVyRmFjdG9yeSgpOworCQkJCUludGVncmF0aW9uTGFiZWxWYWx1ZSBkbWx2ID0gKEludGVncmF0aW9uTGFiZWxWYWx1ZSlsYWJlbC5nZXRDdXJyZW50VmFsdWUoKTsKKwkJCQlwcm9wZXJ0eVNvdXJjZSA9IChJSXRlbVByb3BlcnR5U291cmNlKSBpdGVtUHJvdmlkZXJGYWN0b3J5CisJCQkJLmFkYXB0KGRtbHYsIElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOworCQkJCSBwb3B1bGF0aW9uSWRlbnRpZmllcnMuYWRkKCgoRGlzZWFzZU1vZGVsKWRtKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpKTsKKwkJCQkgUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyIGVuID0gKFBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlcilQb3B1bGF0aW9uRW51bWVyYXRvckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KGRtLCBQb3B1bGF0aW9uRW51bWVyYXRvci5jbGFzcyk7CisJCQkJIGlmKGVuICE9IG51bGwpIHsKKwkJCQkJIGVuLnNldFRhcmdldChkbSk7CisJCQkJCSBTdHJpbmcgW10gcG9wcyA9IGVuLmdldFBvcHVsYXRpb25JZGVudGlmaWVycygpOworCQkJCQkgLy8gU2tpcCBmaXJzdCBvbmUsIGl0J3MgYWxyZWFkeSBiZWVuIGFkZGVkLgorCQkJCQkgaWYocG9wcy5sZW5ndGggPiAxKQorCQkJCQkJIGZvcihpbnQgaT0xO2k8cG9wcy5sZW5ndGg7KytpKQorCQkJCQkJCSBwb3B1bGF0aW9uSWRlbnRpZmllcnMuYWRkKHBvcHNbaV0pOworCQkJCSB9CisJCQl9IGVsc2UgaWYgKGRtIGluc3RhbmNlb2YgUG9wdWxhdGlvbk1vZGVsKSB7CisJCQkJb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgaXRlbVByb3ZpZGVyRmFjdG9yeSA9IGdldFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlckZhY3RvcnkoKTsKKwkJCQlJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgZG1sdiA9IChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpbGFiZWwuZ2V0Q3VycmVudFZhbHVlKCk7CisJCQkJcHJvcGVydHlTb3VyY2UgPSAoSUl0ZW1Qcm9wZXJ0eVNvdXJjZSkgaXRlbVByb3ZpZGVyRmFjdG9yeQorCQkJCS5hZGFwdChkbWx2LCBJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKKwkJCQkgcG9wdWxhdGlvbklkZW50aWZpZXJzLmFkZCgoKFBvcHVsYXRpb25Nb2RlbClkbSkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSk7CisJCQkJIAorCQkJCSBpZihkbSBpbnN0YW5jZW9mIERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsKSB7CisJCQkJCSAvLyBXZSBuZWVkIHRvIGNyZWF0ZSBzZXBhcmF0ZSBsb2cgZGlyZWN0b3JpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbiBncm91cAorCQkJCQkgRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwgZHBtID0gKERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsKWRtOworCQkJCQkgZm9yKFBvcHVsYXRpb25Hcm91cCBnOmRwbS5nZXRQb3B1bGF0aW9uR3JvdXBzKCkpIAorCQkJCQkJIHBvcHVsYXRpb25JZGVudGlmaWVycy5hZGQoZy5nZXRJZGVudGlmaWVyKCkpOworCQkJCSB9CisJCQl9CisJCQlpZihwcm9wZXJ0eVNvdXJjZSA9PSBudWxsKSAKKwkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkNhbm5vdCBmaW5kIHByb3BlcnR5IHNvdXJjZSBmb3IgbG9nZ2VyIiwgbnVsbCk7CisJCQlmaW5hbCBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wZXJ0aWVzID0gcHJvcGVydHlTb3VyY2UKKwkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhudWxsKTsKKwkJCQkKKwkJCWZvcihJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eTpwcm9wZXJ0aWVzKSB7CQorCQkJCWZvcihpbnQgbGV2ZWwgPSBtaW5MZXZlbDtsZXZlbCA8PW1heExldmVsOysrbGV2ZWwpIHsKKwkJCQkJZm9yKFN0cmluZyBwaWQ6cG9wdWxhdGlvbklkZW50aWZpZXJzKSB7CisJCQkJCQlTdGF0ZUxldmVsTWFwIHNsbSA9IG5ldyBTdGF0ZUxldmVsTWFwKHBpZCwgcHJvcGVydHkuZ2V0RGlzcGxheU5hbWUocHJvcGVydHkpLCBsZXZlbCk7CisJCQkJCQlGaWxlIHBkaXIgPSBuZXcgRmlsZShkaXJzK3BpZCtzZXApOworCQkJCQkJaWYoIXBkaXIuZXhpc3RzKCkpIHsKKwkJCQkJCQlpZiAoIXBkaXIubWtkaXIoKSkgeworCQkJCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIGxvZyBzdG9yZSBkaXJlY3RvcmllczogIisgcGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJU3RyaW5nIGZpbGUgPSBkaXJzK3BpZCtzZXArcHJvcGVydHkuZ2V0RGlzcGxheU5hbWUocHJvcGVydHkpKyJfIitsZXZlbCtDU1ZfRVhUOworCQkJCQkJRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKGZpbGUpOworCQkJCQkJZmlsZVdyaXRlcnMucHV0KHNsbSwgZncpOworCQkJCQkJSXRlcmF0b3I8Tm9kZT4gbm9kZUl0ZXJhdG9yID0gdGhpcy5nZXROb2RlSXRlcmF0b3IobGV2ZWwsIG5vZGVMZXZlbHMpOworCQkJCQkJLy8gSXRlcmF0ZSBvdmVyIG5vZGVzIGZvciBhIGdpdmVuIHJlc29sdXRpb24KKwkJCQkJCWZ3LndyaXRlKElURVJBVElPTl9MQUJFTCk7CisJCQkJCQlmdy53cml0ZSgiLCIpOworCQkJCQkJZncud3JpdGUoVElNRV9MQUJFTCk7CisJCQkJCQlmdy53cml0ZSgiLCIpOworCQkJCQkJCisJCQkJCQlpbnQgbm9kZUNvdW50ID0gMDsKKwkJCQkJCQorCQkJCQkJd2hpbGUobm9kZUl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQkJCU5vZGUgbm9kZSA9IG5vZGVJdGVyYXRvci5uZXh0KCk7CisJCQkJCQkJU3RyaW5nIGlkID0gdGhpcy5maWx0ZXJMb2NhdGlvbklkKG5vZGUuZ2V0VVJJKCkudG9TdHJpbmcoKSk7CisJCQkJCQkJZncud3JpdGUoaWQpOworCQkJCQkJCWhlYWRlckl0ZW1Db3VudCsrOworCQkJCQkJCW5vZGVDb3VudCsrOworCQkJCQkJCWlmKG5vZGVJdGVyYXRvci5oYXNOZXh0KCkpIGZ3LndyaXRlKCIsIik7CisJCQkJCQl9CisJCisJCQkJCQlmdy53cml0ZSgiXG4iKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCQkJCisJCQluZWVkc0hlYWRlciA9IGZhbHNlOworCQl9IGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgeworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJFcnJvciB3cml0aW5nIGxvZyBoZWFkZXIgIiwgaW9lKTsKKwkJfSAKKworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbG9nIGZpbGUgZm9yIHJ1biBwYXJhbWV0ZXJzLiBPbmx5IG9uZSBvZiB0aGVzZSBpcyBjcmVhdGVkIHBlcgorCSAqIGRpc2Vhc2VGb2xkZXIKKwkgKiAKKwkgKiBAcGFyYW0gZG0gRGlzZWFzZSBNb2RlbAorCSAqLworCQorCXB1YmxpYyB2b2lkIGxvZ1J1blBhcmFtZXRlcnMoSW50ZWdyYXRpb25EZWNvcmF0b3IgZG0pIHsKKwkJaWYgKGRtID09IG51bGwpIHsgLy8gY2hlY2sKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJdHJ5IHsKKwkJCWZpbmFsIEZpbGVXcml0ZXIgZndwID0gbmV3IEZpbGVXcml0ZXIoZGlyZWN0b3J5TmFtZQorCQkJCQkrIFJVTl9QQVJBTUVURVJfRklMRV9OQU1FKTsKKworCQkJCisJCQlmaW5hbCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGl0ZW1Qcm92aWRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgKKwkJCQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5EZXNjcmlwdG9yLlJlZ2lzdHJ5LklOU1RBTkNFKTsKKworCQkJZmluYWwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSBwcm9wZXJ0eVNvdXJjZSA9IChJSXRlbVByb3BlcnR5U291cmNlKSBpdGVtUHJvdmlkZXJGYWN0b3J5CisJCQkJCS5hZGFwdChkbSwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7CisJCQkKKwkJCWZpbmFsIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BlcnRpZXMgPSBwcm9wZXJ0eVNvdXJjZQorCQkJCS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGRtKTsKKwkJCisJCQlTdHJpbmdCdWlsZGVyIGhlYWRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQlTdHJpbmdCdWlsZGVyIHZhbHVlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQkKKwkJCWZvciAoaW50IGk9MDtpPHByb3BlcnRpZXMuc2l6ZSgpOysraSkgeworCQkJCUlJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBwcm9wZXJ0aWVzLmdldChpKTsKKwkJCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGRlc2NyaXB0b3IKKwkJCQkJCS5nZXRGZWF0dXJlKG51bGwpOworCQkJCQorCQkJCUVDbGFzcyBjb250YWluaW5nQ2xhc3MgPSBmZWF0dXJlLmdldEVDb250YWluaW5nQ2xhc3MoKTsKKwkJCQlpZihjb250YWluaW5nQ2xhc3MuZXF1YWxzKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldER1YmxpbkNvcmUoKSkpIGNvbnRpbnVlOworCQkJCQorCQkJCU9iamVjdCB2YWx1ZSA9ICgoRU9iamVjdClkbSkuZUdldChmZWF0dXJlKTsKKwkJCQloZWFkZXIuYXBwZW5kKGZlYXR1cmUuZ2V0TmFtZSgpKTsKKwkJCQloZWFkZXIuYXBwZW5kKCIsIik7CisJCQkJdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpLnJlcGxhY2UoJywnLCAnICcpOworCQkJCXZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKCdcbicsICcgJyk7CisJCQkJdmFsdWVzLmFwcGVuZCh2YWx1ZS50b1N0cmluZygpLnJlcGxhY2UoJywnLCAnICcpKTsKKwkJCQl2YWx1ZXMuYXBwZW5kKCIsIik7CisJCQl9CisJCQloZWFkZXIuc2V0TGVuZ3RoKGhlYWRlci5sZW5ndGgoKS0xKTsgLy8gZHJvcCBsYXN0ICwKKwkJCXZhbHVlcy5zZXRMZW5ndGgodmFsdWVzLmxlbmd0aCgpLTEpOyAvLyBkcm9wIGxhc3QgLAorCQkJZndwLndyaXRlKGhlYWRlci50b1N0cmluZygpKTsKKwkJCWZ3cC53cml0ZSgiXG4iKTsKKwkJCWZ3cC53cml0ZSh2YWx1ZXMudG9TdHJpbmcoKSk7CisJCQlmd3AuZmx1c2goKTsKKwkJCWZ3cC5jbG9zZSgpOworCQl9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBkZWJ1Z2dpbmcgZm9yIG5vdworCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJFcnJvciBjcmVhdGluZyBmaWxlIHdyaXRlciBmb3IgUlVOUEFSQU1FVEVSICIsIGUgKTsKKworCQl9CisJCSAKKwl9Ly8gbG9nUnVuUGFyYW1ldGVycworCisJLyoqCisJICogTXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gbG9nIGRhdGEgaW4gcnVuIHRocmVhZAorCSAqIE5lZWQgdG8gaW1wbGVtZW50IFRpbWVQcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KCkuLi4uLm9ubHkgR3JhcGggd2lsbCB3b3JrIHJpZ2h0IG5vdy4uLi5sYXRlciBpbiBDT1JFCisJICogQHBhcmFtIHJ2cAorCSAqIEBwYXJhbSB0aW1lUHJvdmlkZXIKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBsb2dEYXRhKGZpbmFsIFJlbGF0aXZlVmFsdWVQcm92aWRlckFkYXB0ZXIgcnZwLCBmaW5hbCBUaW1lUHJvdmlkZXIgdGltZVByb3ZpZGVyKSB7CisJCS8vIE5vdCB1c2VkCisJfS8vIGxvZyBkYXRhCisKKwkvKioKKwkgKiBMb2cgZGF0YSBmcm9tIGZyb20gYSBzaW11bGF0aW9uIGFmdGVyIGN5Y2xlCisJICogCisJICogQHBhcmFtIHNpbSBTaW11bGF0aW9uCisJICogQHBhcmFtIGRtIERpc2Vhc2VNb2RlbAorCSAqIEBwYXJhbSBub2RlTGV2ZWxzIE5vZGUgbGV2ZWxzCisJICogQHBhcmFtIHRpbWVQcm92aWRlcgorCSAqIEBwYXJhbSBiZWZvcmVTdGFydAorCSAqLworCisJQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbG9nRGF0YShJU2ltdWxhdGlvbiBzaW0sIEludGVncmF0aW9uRGVjb3JhdG9yIGRtLCBNYXA8Tm9kZSwgSW50ZWdlcj5ub2RlTGV2ZWxzLCBUaW1lUHJvdmlkZXIgdGltZVByb3ZpZGVyLCBib29sZWFuIGJlZm9yZVN0YXJ0KSB7CisJCQorCQkKKwkJaW50IGRhdGFDb2x1bW5Db3VudCA9IDA7CisJCQorCQkKKwkJaW50IHRvdGFsTGFiZWxzID0gMDsKKwkJaW50IGxhYmVsc1dyaXR0ZW4gPSAwOworCQkKKwkJaW50IHRvdGFsUHJvcGVydHlDb3VudCA9IDA7CisJCWludCBza2lwQ291bnQgPSAwOworCQkvLyBJbmNyZW1lbnQgaXRlcmF0aW9uIGNvdW50CisJCXRoaXMuaWNvdW50Kys7CisKKwkJdHJ5IHsKKwkJCS8vIEl0ZXJhdGUgb3ZlciB0aGUgbWFwIHJlc29sdXRpb25zCisJCQlJdGVyYXRvcjxJbnRlZ2VyPiByZXNvbHV0aW9uX2l0ID0gdGhpcy5nZXRSZXNvbHV0aW9uSXRlcmF0b3Iobm9kZUxldmVscyk7CisJCQl3aGlsZShyZXNvbHV0aW9uX2l0Lmhhc05leHQoKSkgeworCQkJCWludCByZXNvbHV0aW9uID0gcmVzb2x1dGlvbl9pdC5uZXh0KCk7CisKKwkJCQlJdGVyYXRvcjxOb2RlPiBub2RlSXRlcmF0b3IgPSB0aGlzLmdldE5vZGVJdGVyYXRvcihyZXNvbHV0aW9uLCBub2RlTGV2ZWxzKTsKKwkJCQlib29sZWFuIGZpcnN0Tm9kZSA9IHRydWU7CisJCQkJLy8gSXRlcmF0ZSBvdmVyIG5vZGVzIGZvciBhIGdpdmVuIHJlc29sdXRpb24KKwkJCQkKKwkJCQlpbnQgbm9kZUNvdW50ID0gMDsKKwkJCQkKKwkJCQl3aGlsZShub2RlSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJCU5vZGUgbiA9IG5vZGVJdGVyYXRvci5uZXh0KCk7CisJCQkJCQorCQkJCQlub2RlQ291bnQrKzsKKwkJCQkJYm9vbGVhbiBmb3VuZEFuZExvZ2dlZExhYmVsVmFsdWUgPSBmYWxzZTsKKwkJCQkJCisJCQkJCUVMaXN0PE5vZGVMYWJlbD4gbGFiZWxzID0gbi5nZXRMYWJlbHMoKTsKKwkJCQkJZm9yKGludCBpPTA7aTxsYWJlbHMuc2l6ZSgpOysraSkgeworCQkJCQkJTm9kZUxhYmVsIGxhYmVsID0gbGFiZWxzLmdldChpKTsKKwkJCQkJCQorCQkJCQkJdG90YWxMYWJlbHMrKzsKKwkJCQkJCQorCQkJCQkJaWYoIShsYWJlbCBpbnN0YW5jZW9mIEludGVncmF0aW9uTGFiZWwpKSB7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWxhYmVsc1dyaXR0ZW4rKzsKKwkJCQkJCQorCQkJCQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSBwcm9wZXJ0eVNvdXJjZSA9IG51bGw7CisJCQkJCQlJbnRlZ3JhdGlvbkxhYmVsVmFsdWUgZG1sdiA9IG51bGw7CisJCQkJCQkKKwkJCQkJCVN0cmluZyBwb3B1bGF0aW9uSWRlbnRpZmllciA9IG51bGw7CisJCQkJCQkKKwkJCQkJCWJvb2xlYW4gbWF0Y2hTdWJQb3AgPSBmYWxzZTsKKwkJCQkJCVBvcHVsYXRpb25FbnVtZXJhdG9yQWRhcHRlciBlbiA9IChQb3B1bGF0aW9uRW51bWVyYXRvckFkYXB0ZXIpUG9wdWxhdGlvbkVudW1lcmF0b3JBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChkbSwgUG9wdWxhdGlvbkVudW1lcmF0b3IuY2xhc3MpOworCQkJCQkJaWYoZW4gIT0gbnVsbCAmJiBsYWJlbCBpbnN0YW5jZW9mIERpc2Vhc2VNb2RlbExhYmVsKSB7CisJCQkJCQkJIGVuLnNldFRhcmdldChkbSk7CisJCQkJCQkJIFN0cmluZyBbXXN1YnBvcHMxID0gZW4uZ2V0UG9wdWxhdGlvbklkZW50aWZpZXJzKCk7CisJCQkJCQkJIFN0cmluZyBsYWJlbFBvcCA9ICgoRGlzZWFzZU1vZGVsTGFiZWwpbGFiZWwpLmdldFBvcHVsYXRpb25Nb2RlbExhYmVsKCkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKwkJCQkJCQkgaWYoc3VicG9wczEubGVuZ3RoID4gMSkKKwkJCQkJCQkJIGZvcihpbnQgaj0xO2o8c3VicG9wczEubGVuZ3RoOysraikKKwkJCQkJCQkJCSBpZihsYWJlbFBvcC5lcXVhbHMoc3VicG9wczFbal0pKSB7bWF0Y2hTdWJQb3AgPSB0cnVlO2JyZWFrO30KKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJaWYobWF0Y2hTdWJQb3ApIHsKKwkJCQkJCQlTdGFuZGFyZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGl0ZW1Qcm92aWRlckZhY3RvcnkgPSBnZXRJdGVtUHJvdmlkZXJGYWN0b3J5KCk7CisJCQkJCQkJSW50ZWdyYXRpb25MYWJlbCBkbUxhYmVsID0gKEludGVncmF0aW9uTGFiZWwpbGFiZWw7CisJCQkJCQkJLy8gVGhlIGN1cnJlbnQgdmFsdWUKKwkJCQkJCQlkbWx2ID0gKEludGVncmF0aW9uTGFiZWxWYWx1ZSlkbUxhYmVsLmdldEN1cnJlbnRWYWx1ZSgpOworCQkJCQkJCXByb3BlcnR5U291cmNlID0gKElJdGVtUHJvcGVydHlTb3VyY2UpIGl0ZW1Qcm92aWRlckZhY3RvcnkuYWRhcHQoZG1sdiwgUHJvcGVydHlTb3VyY2UuY2xhc3MpOworCQkJCQkJCXBvcHVsYXRpb25JZGVudGlmaWVyID0gKChEaXNlYXNlTW9kZWxMYWJlbClsYWJlbCkuZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpOworCQkJCQkJfSBlbHNlIGlmKGRtIGluc3RhbmNlb2YgRGlzZWFzZU1vZGVsICYmIGxhYmVsIGluc3RhbmNlb2YgRGlzZWFzZU1vZGVsTGFiZWwgJiYKKwkJCQkJCQkJKChEaXNlYXNlTW9kZWxMYWJlbClsYWJlbCkuZ2V0UG9wdWxhdGlvbk1vZGVsTGFiZWwoKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpLmVxdWFscygoKERpc2Vhc2VNb2RlbClkbSkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSkpIHsJCQkJCQkJCisJCQkJCQkJU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBpdGVtUHJvdmlkZXJGYWN0b3J5ID0gZ2V0SXRlbVByb3ZpZGVyRmFjdG9yeSgpOworCQkJCQkJCUludGVncmF0aW9uTGFiZWwgZG1MYWJlbCA9IChJbnRlZ3JhdGlvbkxhYmVsKWxhYmVsOworCQkJCQkJCS8vIFRoZSBjdXJyZW50IHZhbHVlCisJCQkJCQkJZG1sdiA9IChJbnRlZ3JhdGlvbkxhYmVsVmFsdWUpZG1MYWJlbC5nZXRDdXJyZW50VmFsdWUoKTsKKwkJCQkJCQlwcm9wZXJ0eVNvdXJjZSA9IChJSXRlbVByb3BlcnR5U291cmNlKSBpdGVtUHJvdmlkZXJGYWN0b3J5LmFkYXB0KGRtbHYsIFByb3BlcnR5U291cmNlLmNsYXNzKTsKKwkJCQkJCQlwb3B1bGF0aW9uSWRlbnRpZmllciA9ICgoRGlzZWFzZU1vZGVsTGFiZWwpbGFiZWwpLmdldFBvcHVsYXRpb25Nb2RlbExhYmVsKCkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKwkJCQkJCX0gZWxzZSBpZiAoZG0gaW5zdGFuY2VvZiBQb3B1bGF0aW9uTW9kZWwgJiYgbGFiZWwgaW5zdGFuY2VvZiBQb3B1bGF0aW9uTW9kZWxMYWJlbCAmJgorCQkJCQkJCQkoKFBvcHVsYXRpb25Nb2RlbExhYmVsKWxhYmVsKS5nZXRQb3B1bGF0aW9uTGFiZWwoKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpLmVxdWFscygoKFBvcHVsYXRpb25Nb2RlbClkbSkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKSkpIHsKKwkJCQkJCQlvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBpdGVtUHJvdmlkZXJGYWN0b3J5ID0gZ2V0UG9wdWxhdGlvbk1vZGVsSXRlbVByb3ZpZGVyRmFjdG9yeSgpOworCQkJCQkJCWRtbHYgPSAoSW50ZWdyYXRpb25MYWJlbFZhbHVlKWxhYmVsLmdldEN1cnJlbnRWYWx1ZSgpOworCQkJCQkJCXByb3BlcnR5U291cmNlID0gKElJdGVtUHJvcGVydHlTb3VyY2UpIGl0ZW1Qcm92aWRlckZhY3RvcnkuYWRhcHQoZG1sdiwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7CisJCQkJCQkJcG9wdWxhdGlvbklkZW50aWZpZXIgPSAoKFBvcHVsYXRpb25Nb2RlbExhYmVsKWxhYmVsKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpOworCQkJCQkJfQorCQkJCQkJaWYocHJvcGVydHlTb3VyY2UgPT0gbnVsbCkgeworCQkJCQkJCXNraXBDb3VudCsrOworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlmaW5hbCBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wZXJ0aWVzID0gcHJvcGVydHlTb3VyY2UKKwkJCQkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhudWxsKTsKKwkJCQkJCQorCQkJCQkJLy9maW5hbCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyIHJ2cCA9IChSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyKSBSZWxhdGl2ZVZhbHVlUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQorCQkJCQkJLy8JLmFkYXB0KGxhYmVsLCBSZWxhdGl2ZVZhbHVlUHJvdmlkZXIuY2xhc3MpOworCQkJCQkJLy9pZihydnAgPT0gbnVsbCkgY29udGludWU7CisJCQkJCQkKKwkJCQkJCQorCQkJCQkJdG90YWxQcm9wZXJ0eUNvdW50ICs9IHByb3BlcnRpZXMuc2l6ZSgpOworCQkJCQkJCisJCQkJCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCQkJCWZvcihJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBpdGVtRGVzY3JpcHRvcjpwcm9wZXJ0aWVzKSB7CisJCQkJCQkJCXNiLnNldExlbmd0aCgwKTsKKwkJCQkJCQkJU3RhdGVMZXZlbE1hcCBzbG0gPSBuZXcgU3RhdGVMZXZlbE1hcChwb3B1bGF0aW9uSWRlbnRpZmllciwgaXRlbURlc2NyaXB0b3IuZ2V0RGlzcGxheU5hbWUoaXRlbURlc2NyaXB0b3IpLCByZXNvbHV0aW9uKTsKKwkJCQkJCQkJRmlsZVdyaXRlciBmdyA9IGZpbGVXcml0ZXJzLmdldChzbG0pOworCQkJCQkJCQlpZihmdyA9PSBudWxsKSB7CisJCQkJCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkVycm9yLCBubyBmaWxlIHdyaXRlciBmb3VuZCBmb3IgIitzbG0sIG51bGwpOworCQkJCQkJCQkJY29udGludWU7CisJCQkJCQkJCX0KKwkJCQkJCQkJLy8gQmVmb3JlIHdyaXRpbmcgdGhlIHZhbHVlcyBmb3IgdGhlIGZpcnN0IGxvY2F0aW9uLAorCQkJCQkJCQkvLyBhZGQgaXRlcmF0aW9uLCB0aW1lIGNvbHVtbnMKKwkJCQkJCQkJCQorCQkJCQkJCQlpZihmaXJzdE5vZGUpIHsKKwkJCQkJCQkJCXNiLmFwcGVuZCh0aGlzLmljb3VudCk7CisJCQkJCQkJCQlzYi5hcHBlbmQoIiwiKTsKKwkJCQkJCQkJCVNURU1UaW1lIHRpbWUgPSB0aW1lUHJvdmlkZXIuZ2V0VGltZSgpOworCQkJCQkJCQkJaWYodGltZSA9PSBudWxsKSB7CisJCQkJCQkJCQkJdGltZSA9IHNpbS5nZXRTY2VuYXJpbygpLmdldFNlcXVlbmNlcigpLmdldFN0YXJ0VGltZSgpOworCQkJCQkJCQkJfQorCQkJCQkJCQkJaWYoIWJlZm9yZVN0YXJ0KQorCQkJCQkJCQkJCS8vIEFkZCBpbmNyZW1lbnQKKwkJCQkJCQkJCQl0aW1lID0gdGltZS5hZGRJbmNyZW1lbnQoc2ltLmdldFNjZW5hcmlvKCkuZ2V0U2VxdWVuY2VyKCkuZ2V0VGltZURlbHRhKCkpOworCQkJCQkJCQkJCisJCQkJCQkJCQlTdHJpbmcgdGltZVN0cmluZzsKKwkJCQkJCQkJCXRpbWVTdHJpbmcgPSBkYXRlRm9ybWF0LmZvcm1hdCh0aW1lLmdldFRpbWUoKSk7CisJCQkJCQkJCQkKKwkJCQkJCQkJCXNiLmFwcGVuZCh0aW1lU3RyaW5nKTsKKwkJCQkJCQkJCXNiLmFwcGVuZCgiLCIpOworCQkJCQkJCQl9CisJCQkJCQkJCQkKKwkJCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVtRGVzY3JpcHRvcgorCQkJCQkJCQkJLmdldEZlYXR1cmUobnVsbCk7CisJCQkJCQkJCQorCQkJCQkJCQlkb3VibGUgdmFsdWUgPSAoKERvdWJsZSkgKChFT2JqZWN0KWRtbHYpLmVHZXQoZmVhdHVyZSkpCisJCQkJCQkJCQkuZG91YmxlVmFsdWUoKTsKKwkJCQkJCQkJCisJCQkJCQkJCS8vIFdyaXRlIHJlbGF0aXZlIHZhbHVlIGZvciB0aGUgcHJvcGVydHkKKwkJCQkJCQkJLy8gSXRlbVByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSA9IChJdGVtUHJvcGVydHlEZXNjcmlwdG9yKWl0ZW1EZXNjcmlwdG9yOworCQkJCQkJCQkvLyBkb3VibGUgdmFsdWUgPSBydnAuZ2V0UmVsYXRpdmVWYWx1ZShwcm9wZXJ0eSkqcnZwLmdldERlbm9taW5hdG9yKCk7IC8vIGxvZyBhYnNvbHV0ZSB2YWx1ZSwgbm90IHJlbGF0aXZlCisJCQkJCQkJCWlmKGxvZ0ludGVnZXJzKQorCQkJCQkJCQkJc2IuYXBwZW5kKChpbnQpdmFsdWUpOworCQkJCQkJCQllbHNlIHNiLmFwcGVuZCh2YWx1ZSk7CisJCQkJCQkJCQorCQkJCQkJCQlkYXRhQ29sdW1uQ291bnQrKzsKKwkJCQkJCQkJCisJCQkJCQkJCWlmKG5vZGVJdGVyYXRvci5oYXNOZXh0KCkpIHNiLmFwcGVuZCgiLCIpOworCQkJCQkJCQllbHNlIHNiLmFwcGVuZCgiXG4iKTsgLy8gbmV3IGxpbmUKKwkJCQkJCQkJZncud3JpdGUoc2IudG9TdHJpbmcoKSk7CisJCQkJCQkJCWZvdW5kQW5kTG9nZ2VkTGFiZWxWYWx1ZSA9IHRydWU7CisJCQkJCQkJfSAvLyBGb3IgZWFjaCBwcm9wZXJ0eSBpbiBsYWJlbAorCQkJCQkJfSAvLyBGb3IgZWFjaCBub2RlIGxhYmVsCisJCQkJCWlmKGZvdW5kQW5kTG9nZ2VkTGFiZWxWYWx1ZSA9PSBmYWxzZSkgeworCQkJCQkJLy8gV2Ugd2VyZSB1bmFibGUgdG8gZmluZCB0aGUgbGFiZWwgZm9yIHRoaXMgZGlzZWFzZSBtb2RlbCBvbiB0aGUgbm9kZS4gU3RpbGwsIHdlIG5lZWQgdG8gbG9nCisJCQkJCQkvLyBzb21ldGhpbmcuIFRha2UgdGhlIGZpcnN0IGxhYmVsIG9uIHRoZSBkZWNvcmF0b3JzIGxpc3Qgb2YgbGFiZWxzIHRvIHVwZGF0ZSBhbmQgdXNlIGl0IGFzIGEKKwkJCQkJCS8vIHRlbXBsYXRlIGZvciBsb2dnaW5nIDAgdmFsdWVzIChyZXByZXNlbnRpbmcgdW5rbm93bikKKwkJCQkJCQorCQkJCQkJSXRlcmF0b3I8RHluYW1pY0xhYmVsPiBpdCA9ICgoRGVjb3JhdG9yKWRtKS5nZXRMYWJlbHNUb1VwZGF0ZSgpLml0ZXJhdG9yKCk7CisJCQkJCQlJbnRlZ3JhdGlvbkxhYmVsIGxhYmVsID0gbnVsbDsKKwkJCQkJCXdoaWxlKGl0Lmhhc05leHQoKSkgeworCQkJCQkJCUR5bmFtaWNMYWJlbCBsID0gaXQubmV4dCgpOworCQkJCQkJCWlmKGwgaW5zdGFuY2VvZiBJbnRlZ3JhdGlvbkxhYmVsKSB7CisJCQkJCQkJCWxhYmVsID0gKEludGVncmF0aW9uTGFiZWwpbDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJaWYobGFiZWwgPT0gbnVsbCkgeworCQkJCQkJCS8vIFdlIGNvdWxkbid0IGZpbmQgYW55IGxhYmVscy4gUEFOSUMhCisJCQkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJDYW5ub3QgbG9nLCBubyBsYWJlbCBmb3VuZCBmb3IgZGVjb3JhdG9yISIsIG5ldyBFeGNlcHRpb24oKSk7CisJCQkJCQkJcmV0dXJuOworCQkJCQkJfQorCQkJCQkJCisKKwkJCQkJCUlJdGVtUHJvcGVydHlTb3VyY2UgcHJvcGVydHlTb3VyY2UgPSBudWxsOworCQkJCQkJSW50ZWdyYXRpb25MYWJlbFZhbHVlIGRtbHYgPSBudWxsOworCQkJCQkJCisJCQkJCQlpZihkbSBpbnN0YW5jZW9mIERpc2Vhc2VNb2RlbCkgeworCQkJCQkJCVN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgaXRlbVByb3ZpZGVyRmFjdG9yeSA9IG51bGw7CisJCQkJCQkJaXRlbVByb3ZpZGVyRmFjdG9yeSA9IGdldEl0ZW1Qcm92aWRlckZhY3RvcnkoKTsKKwkJCQkJCQlkbWx2ID0gKEludGVncmF0aW9uTGFiZWxWYWx1ZSlsYWJlbC5nZXRDdXJyZW50VmFsdWUoKTsKKwkJCQkJCQlwcm9wZXJ0eVNvdXJjZSA9IChJSXRlbVByb3BlcnR5U291cmNlKSBpdGVtUHJvdmlkZXJGYWN0b3J5LmFkYXB0KGRtbHYsIFByb3BlcnR5U291cmNlLmNsYXNzKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYoZG0gaW5zdGFuY2VvZiBQb3B1bGF0aW9uTW9kZWwpIHsKKwkJCQkJCQlkbWx2ID0gKEludGVncmF0aW9uTGFiZWxWYWx1ZSlsYWJlbC5nZXRDdXJyZW50VmFsdWUoKTsKKwkJCQkJCQlwcm9wZXJ0eVNvdXJjZSA9IChJSXRlbVByb3BlcnR5U291cmNlKWdldFBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlckZhY3RvcnkoKS5hZGFwdChkbWx2LCBQcm9wZXJ0eVNvdXJjZS5jbGFzcyk7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWlmKHByb3BlcnR5U291cmNlID09IG51bGwpIHsKKwkJCQkJCQlBY3RpdmF0b3IubG9nRXJyb3IoIkVycm9yLCBwcm9wZXJ0eSBzb3VyY2Ugbm90IGZvdW5kIGZvciAiK2RtbHYsIG5ldyBFeGNlcHRpb24oKSk7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQlTdHJpbmcgW10gcG9waWRzPW51bGw7CisJCQkJCQlpZihkbSBpbnN0YW5jZW9mIE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKSB7CisJCQkJCQkJcG9waWRzID0gbmV3IFN0cmluZ1soKE11bHRpUG9wdWxhdGlvblNJRGlzZWFzZU1vZGVsKWRtKS5nZXRQb3B1bGF0aW9uR3JvdXBzKCkuZ2V0VmFsdWVzKCkuc2l6ZSgpXTsKKwkJCQkJCQlpbnQgaW5kID0gMDsKKwkJCQkJCQlmb3IoU3RyaW5nVmFsdWUgc3Y6KChNdWx0aVBvcHVsYXRpb25TSURpc2Vhc2VNb2RlbClkbSkuZ2V0UG9wdWxhdGlvbkdyb3VwcygpLmdldFZhbHVlcygpKQorCQkJCQkJCQlwb3BpZHNbaW5kKytdPXN2LmdldFZhbHVlKCk7CQkJCQkJCisJCQkJCQl9IGVsc2UgaWYoZG0gaW5zdGFuY2VvZiBEZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbCkgeworCQkJCQkJCXBvcGlkcyA9IG5ldyBTdHJpbmdbKChEZW1vZ3JhcGhpY1BvcHVsYXRpb25Nb2RlbClkbSkuZ2V0UG9wdWxhdGlvbkdyb3VwcygpLnNpemUoKSsxXTsKKwkJCQkJCQlpbnQgaW5kPTA7CisJCQkJCQkJZm9yKFBvcHVsYXRpb25Hcm91cCBnOigoRGVtb2dyYXBoaWNQb3B1bGF0aW9uTW9kZWwpZG0pLmdldFBvcHVsYXRpb25Hcm91cHMoKSkKKwkJCQkJCQkJcG9waWRzW2luZCsrXT1nLmdldElkZW50aWZpZXIoKTsKKwkJCQkJCQlwb3BpZHNbaW5kXT0oKERlbW9ncmFwaGljUG9wdWxhdGlvbk1vZGVsKWRtKS5nZXRQb3B1bGF0aW9uSWRlbnRpZmllcigpOworCQkJCQkJfSBlbHNlIGlmKGRtIGluc3RhbmNlb2YgRGlzZWFzZU1vZGVsKSB7CisJCQkJCQkJcG9waWRzID0gbmV3IFN0cmluZ1sxXTsKKwkJCQkJCQlwb3BpZHNbMF0gPSAoKERpc2Vhc2VNb2RlbClkbSkuZ2V0UG9wdWxhdGlvbklkZW50aWZpZXIoKTsKKwkJCQkJCX0gZWxzZSBpZihkbSBpbnN0YW5jZW9mIFBvcHVsYXRpb25Nb2RlbCkgeworCQkJCQkJCXBvcGlkcyA9IG5ldyBTdHJpbmdbMV07CisJCQkJCQkJcG9waWRzWzBdID0gKChQb3B1bGF0aW9uTW9kZWwpZG0pLmdldFBvcHVsYXRpb25JZGVudGlmaWVyKCk7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWZpbmFsIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BlcnRpZXMgPSBwcm9wZXJ0eVNvdXJjZQorCQkJCQkJLmdldFByb3BlcnR5RGVzY3JpcHRvcnMobnVsbCk7CisJCQkJCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCQkJCWZvcihJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBpdGVtRGVzY3JpcHRvcjpwcm9wZXJ0aWVzKSB7CisJCQkJCQkJCisJCQkJCQkJZm9yKFN0cmluZyBwb3A6cG9waWRzKSB7CisJCQkJCQkJCXNiLnNldExlbmd0aCgwKTsKKwkJCQkJCQkJU3RhdGVMZXZlbE1hcCBzbG0gPSBuZXcgU3RhdGVMZXZlbE1hcChwb3AsIGl0ZW1EZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKGl0ZW1EZXNjcmlwdG9yKSwgcmVzb2x1dGlvbik7CisJCQkJCQkJCUZpbGVXcml0ZXIgZncgPSBmaWxlV3JpdGVycy5nZXQoc2xtKTsKKwkJCQkJCQkJaWYoZncgPT0gbnVsbCkgeworCQkJCQkJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJFcnJvciwgbm8gZmlsZSB3cml0ZXIgZm91bmQgZm9yICIrc2xtLCBudWxsKTsKKwkJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCQl9CisJCQkJCQkJCS8vIEJlZm9yZSB3cml0aW5nIHRoZSB2YWx1ZXMgZm9yIHRoZSBmaXJzdCBsb2NhdGlvbiwKKwkJCQkJCQkJLy8gYWRkIGl0ZXJhdGlvbiwgdGltZSBjb2x1bW5zCisJCQkJCQkJCQkKKwkJCQkJCQkJaWYoZmlyc3ROb2RlKSB7CisJCQkJCQkJCQlzYi5hcHBlbmQodGhpcy5pY291bnQpOworCQkJCQkJCQkJc2IuYXBwZW5kKCIsIik7CisJCQkJCQkJCQlTVEVNVGltZSB0aW1lID0gdGltZVByb3ZpZGVyLmdldFRpbWUoKTsKKwkJCQkJCQkJCWlmKHRpbWUgPT0gbnVsbCkgeworCQkJCQkJCQkJCXRpbWUgPSBzaW0uZ2V0U2NlbmFyaW8oKS5nZXRTZXF1ZW5jZXIoKS5nZXRTdGFydFRpbWUoKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWlmKCFiZWZvcmVTdGFydCkKKwkJCQkJCQkJCQkvLyBBZGQgaW5jcmVtZW50CisJCQkJCQkJCQkJdGltZSA9IHRpbWUuYWRkSW5jcmVtZW50KHNpbS5nZXRTY2VuYXJpbygpLmdldFNlcXVlbmNlcigpLmdldFRpbWVEZWx0YSgpKTsKKwkJCQkJCQkJCQorCQkJCQkJCQkJU3RyaW5nIHRpbWVTdHJpbmc7CisJCQkJCQkJCQl0aW1lU3RyaW5nID0gZGF0ZUZvcm1hdC5mb3JtYXQodGltZS5nZXRUaW1lKCkpOworCQkJCQkJCQkJCisJCQkJCQkJCQlzYi5hcHBlbmQodGltZVN0cmluZyk7CisJCQkJCQkJCQlzYi5hcHBlbmQoIiwiKTsKKwkJCQkJCQkJfQorCQkJCQkJCQkvLyBXcml0ZSByZWxhdGl2ZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5CisJCQkJCQkJCS8vIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkgPSAoSXRlbVByb3BlcnR5RGVzY3JpcHRvcilpdGVtRGVzY3JpcHRvcjsKKwkJCQkJCQkJLy8gZG91YmxlIHZhbHVlID0gcnZwLmdldFJlbGF0aXZlVmFsdWUocHJvcGVydHkpKnJ2cC5nZXREZW5vbWluYXRvcigpOyAvLyBsb2cgYWJzb2x1dGUgdmFsdWUsIG5vdCByZWxhdGl2ZQorCQkJCQkJCQlzYi5hcHBlbmQoIjAiKTsgLy8gRGVmYXVsdCB1bmtub3duIHZhbHVlCisJCQkJCQkJCQorCQkJCQkJCQlkYXRhQ29sdW1uQ291bnQrKzsKKwkJCQkJCQkJCisJCQkJCQkJCWlmKG5vZGVJdGVyYXRvci5oYXNOZXh0KCkpIHNiLmFwcGVuZCgiLCIpOworCQkJCQkJCQllbHNlIHNiLmFwcGVuZCgiXG4iKTsgLy8gbmV3IGxpbmUKKwkJCQkJCQkJZncud3JpdGUoc2IudG9TdHJpbmcoKSk7CisJCQkJCQkJfSAvLyBmb3IgZWFjaCBwb3AgaWQKKwkJCQkJCX0gLy9Gb3IgZWFjaCBwcm9wZXJ0eQorCQkJCQl9Ly8gZWxzZQorCQkJCWZpcnN0Tm9kZSA9IGZhbHNlOworCQkJCX0gLy8gRm9yIGVhY2ggbm9kZQkJCQkKKwkJCX0gLy8gIEZvciBlYWNoIG5vZGUgcmVzb2x1dGlvbgorCQkJbmVlZHNIZWFkZXIgPSBmYWxzZTsKKwkJfSBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCUFjdGl2YXRvci5sb2dFcnJvcigiRXJyb3Igd3JpdGluZyBsb2cgaGVhZGVyICIsIGlvZSk7CisJCX0KKworCQlpZihpY291bnQgJSBGTFVTSF9FQUNIX0lURVJBVElPTiA9PSAwKSB0aGlzLmZsdXNoTG9nZ2VyRGF0YSgpOworCQkKKwkJCisJCQorCX0KKwkKKwkvKgorCSAqIHByaXZhdGUgR3JhcGggZ2V0R3JhcGgoZmluYWwgTm9kZSBub2RlKSB7IHJldHVybiAoR3JhcGgpCisJICogbm9kZS5lQ29udGFpbmVyKCkuZUNvbnRhaW5lcigpOyB9IC8vIGdldEdyYXBoCisJICovCisKKwkvKioKKwkgKiBGbHVzaCBhbmQgQ2xvc2UgdGhlIGZpbGUKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBmbHVzaExvZ2dlckRhdGEoKSB7CisJCUNvbGxlY3Rpb248RmlsZVdyaXRlcj4gd3JpdGVycyA9IGZpbGVXcml0ZXJzLnZhbHVlcygpOworCQlmb3IoRmlsZVdyaXRlciB3cml0ZXI6d3JpdGVycykgeworCQkJdHJ5IHsKKwkJCQl3cml0ZXIuZmx1c2goKTsKKwkJCX0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7CisJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJDYW5ub3QgZmx1c2ggbG9nIGZpbGUiLCBpb2UpOworCQkJfQorCQl9CisJCQorCX0gLy8gZmx1c2ggQWxsIERhdGEKKwkKKwkvKioKKwkgKiBGbHVzaCBhbmQgQ2xvc2UgdGhlIGZpbGUKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjbG9zZUxvZ2dlckRhdGEoKSB7CisJCUNvbGxlY3Rpb248RmlsZVdyaXRlcj4gd3JpdGVycyA9IGZpbGVXcml0ZXJzLnZhbHVlcygpOworCQlmb3IoRmlsZVdyaXRlciB3cml0ZXI6d3JpdGVycykgeworCQkJdHJ5IHsKKwkJCQl3cml0ZXIuY2xvc2UoKTsKKwkJCX0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7CisJCQkJQWN0aXZhdG9yLmxvZ0Vycm9yKCJDYW5ub3QgY2xvc2UgbG9nIGZpbGUiLCBpb2UpOworCQkJfQorCQl9CisJfSAvLyBjbG9zZUxvZ2dlckRhdGEKKworCUBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQorCXByaXZhdGUgSXRlcmF0b3I8SW50ZWdlcj4gZ2V0UmVzb2x1dGlvbkl0ZXJhdG9yKE1hcDxOb2RlLCBJbnRlZ2VyPm5vZGVMZXZlbHMpIHsKKwkJQXJyYXlMaXN0PEludGVnZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUNvbGxlY3Rpb248SW50ZWdlcj52YWxzID0gbm9kZUxldmVscy52YWx1ZXMoKTsKKwkJZm9yKGludCBsZXZlbDp2YWxzKSB7CisJCQlpZighbGlzdC5jb250YWlucyhsZXZlbCkpIGxpc3QuYWRkKGxldmVsKTsKKwkJfQorCQlyZXR1cm4gbGlzdC5pdGVyYXRvcigpOworCX0KKwkKKwkvLyBSZXR1cm4gYWxsIG5vZGVzIGF0IHRoZSBzYW1lIGxldmVsCisJLy8gU29ydCBieSB0aGUgbmFtZSBhbHBoYWJldGljYWxseSBmb3IgY29udmVuaWVuY2UKKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKKwlwcml2YXRlIEl0ZXJhdG9yPE5vZGU+IGdldE5vZGVJdGVyYXRvcihpbnQgbGV2ZWwsIE1hcDxOb2RlLCBJbnRlZ2VyPm5vZGVMZXZlbHMpIHsKKwkJQXJyYXlMaXN0PE5vZGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCS8vU2V0PE5vZGU+bnMgPSBub2RlTGV2ZWxzLmtleVNldCgpOworCQkvL2ZvcihOb2RlIG46bnMpIHsKKwkJZm9yIChFbnRyeTxOb2RlLEludGVnZXI+IGVudHJ5IDogbm9kZUxldmVscy5lbnRyeVNldCgpKSB7CisJCQlpZihlbnRyeS5nZXRWYWx1ZSgpID09IGxldmVsKSB7CisJCQkJCisJCQkJYm9vbGVhbiB3cml0ZSA9IGZhbHNlOworCQkJCWZvciAoTm9kZUxhYmVsIHM6ZW50cnkuZ2V0S2V5KCkuZ2V0TGFiZWxzKCkpIHsKKwkJCQkJaWYocyBpbnN0YW5jZW9mIEludGVncmF0aW9uTGFiZWwpIHsKKwkJCQkJCQorCQkJCQkJd3JpdGUgPSB0cnVlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCF3cml0ZSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJCisJCQkJbGlzdC5hZGQoZW50cnkuZ2V0S2V5KCkpOworCQkJfQorCQl9CisJCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgbmV3IENvbXBhcmF0b3I8Tm9kZT4oKSB7CisKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShOb2RlIG4xLCBOb2RlIG4yKSB7CisJCQkJU3RyaW5nIHMxID0gbjEuZ2V0VVJJKCkudG9TdHJpbmcoKTsKKwkJCQlTdHJpbmcgczIgPSBuMi5nZXRVUkkoKS50b1N0cmluZygpOworCQkJCXJldHVybiBzMS5jb21wYXJlVG8oczIpOworCQkJfQorCQkJCisJCX0pOworCQlyZXR1cm4gbGlzdC5pdGVyYXRvcigpOworCX0KKwkKKwkvKioKKwkgKiBmaWx0ZXJzIHRoZSBsb2NhdGlvbiBpZCBwcmVmaXggZnJvbSB0aGUgYmVnaW5uaW5nIG9mCisJICogIGEgbm9kZXMgSUQgZm9yIGdlbmVyYXRpb24gb2YgYSBmaWxlIG5hbWUKKwkgKiBAcGFyYW0gdW5maWx0ZXJlZAorCSAqIEByZXR1cm4gdGhlIGZpbHRlcmVkIGZpbGUgbmFtZSB1c2luZyBsb2NhdGlvbiBpZC4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBmaWx0ZXJMb2NhdGlvbklkKFN0cmluZyB1bmZpbHRlcmVkKSB7CisJCWludCBsYXN0ID0gdW5maWx0ZXJlZC5pbmRleE9mKExPQ0FUSU9OSURfUFJFRklYKTsKKwkJaWYgKGxhc3QgPj0wKSB7CisJCQlsYXN0ICs9IExPQ0FUSU9OSURfUFJFRklYLmxlbmd0aCgpOworCQkJcmV0dXJuIHVuZmlsdGVyZWQuc3Vic3RyaW5nKGxhc3QsIHVuZmlsdGVyZWQubGVuZ3RoKCkpOworCQl9IAorCQlyZXR1cm4gdW5maWx0ZXJlZDsKKwl9CisJCisJLyoqCisJICogVXNlZCBhcyBrZXkgaW4gbWFwIHdpdGggRmlsZVdyaXRlcnMuIEZpbGVXcml0ZXJzIGFyZSBrZXknZCBieQorCSAqIHRoZSBsYWJlbCAoaS5lLiBkaXNlYXNlIHN0YXRlKSBhbmQgYnkgCisJICovCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhdGVMZXZlbE1hcCB7CisJCXByaXZhdGUgZmluYWwgU3RyaW5nIHBvcElkOworCQlwcml2YXRlIGZpbmFsIFN0cmluZyBzdGF0ZTsKKwkJcHJpdmF0ZSBmaW5hbCBpbnQgbGV2ZWw7CisJCQorCQlwdWJsaWMgU3RhdGVMZXZlbE1hcChTdHJpbmcgcG9wSWQsU3RyaW5nIHN0YXRlLCBpbnQgbGV2ZWwpIHsKKwkJCXRoaXMucG9wSWQgPSBwb3BJZDsKKwkJCXRoaXMuc3RhdGUgPSBzdGF0ZTsKKwkJCXRoaXMubGV2ZWwgPSBsZXZlbDsKKwkJfQorCQkKKwkJcHVibGljIFN0cmluZyBnZXRQb3B1bGF0aW9uSWQoKSB7cmV0dXJuIHRoaXMucG9wSWQ7fQorCQlwdWJsaWMgaW50IGdldExldmVsKCkge3JldHVybiB0aGlzLmxldmVsO30KKwkJcHVibGljIFN0cmluZyBnZXRTdGF0ZSgpIHtyZXR1cm4gdGhpcy5zdGF0ZTt9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJCXJldHVybiBzdGF0ZS5oYXNoQ29kZSgpK3BvcElkLmhhc2hDb2RlKCkgKyBsZXZlbDsgLy8gdWdoCisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwkJCWlmKCEobyBpbnN0YW5jZW9mIFN0YXRlTGV2ZWxNYXApKSByZXR1cm4gZmFsc2U7CisJCQlTdGF0ZUxldmVsTWFwIHNsbSA9IChTdGF0ZUxldmVsTWFwKW87CisJCQlyZXR1cm4gKHNsbS5nZXRTdGF0ZSgpLmVxdWFscyh0aGlzLnN0YXRlKSAmJiBzbG0uZ2V0UG9wdWxhdGlvbklkKCkuZXF1YWxzKHRoaXMucG9wSWQpICYmIHNsbS5nZXRMZXZlbCgpID09IGxldmVsKTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gdGhpcy5wb3BJZCsiIC0gIit0aGlzLnN0YXRlKyJfIit0aGlzLmxldmVsOworCQl9CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2YgdGhlIFN0YW5kYXJkIEl0ZW0gUHJvdmlkZXIgZmFjdG9yeS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdGFuZGFyZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGdldEl0ZW1Qcm92aWRlckZhY3RvcnkoKSB7CisJCWlmIChpdGVtUHJvdmlkZXJGYWN0b3J5ID09IG51bGwpIHsKKwkJCWl0ZW1Qcm92aWRlckZhY3RvcnkgPSBuZXcgU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOworCQl9CisJCXJldHVybiBpdGVtUHJvdmlkZXJGYWN0b3J5OworCX0gLy8gZ2V0SXRlbVByb3ZpZGVyRmFjdG9yeQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoZSBTdGFuZGFyZCBJdGVtIFByb3ZpZGVyIGZhY3RvcnkuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgb3JnLmVjbGlwc2Uuc3RlbS5wb3B1bGF0aW9ubW9kZWxzLnN0YW5kYXJkLnByb3ZpZGVyLlN0YW5kYXJkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZ2V0UG9wdWxhdGlvbk1vZGVsSXRlbVByb3ZpZGVyRmFjdG9yeSgpIHsKKwkJaWYgKHBvcHVsYXRpb25Nb2RlbEl0ZW1Qcm92aWRlckZhY3RvcnkgPT0gbnVsbCkgeworCQkJcG9wdWxhdGlvbk1vZGVsSXRlbVByb3ZpZGVyRmFjdG9yeSA9IG5ldyBvcmcuZWNsaXBzZS5zdGVtLnBvcHVsYXRpb25tb2RlbHMuc3RhbmRhcmQucHJvdmlkZXIuU3RhbmRhcmRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOworCQl9CisJCXJldHVybiBwb3B1bGF0aW9uTW9kZWxJdGVtUHJvdmlkZXJGYWN0b3J5OworCX0gLy8gZ2V0SXRlbVByb3ZpZGVyRmFjdG9yeQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9sb2dnZXJzL3ZpZXdzL1JlcG9ydHNDb250ZXh0TWVudUFjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9sb2dnZXJzL3ZpZXdzL1JlcG9ydHNDb250ZXh0TWVudUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNWE4MmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvdmlld3MvUmVwb3J0c0NvbnRleHRNZW51QWN0aW9uLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLy8gUmVwb3J0c0NvbnRleHRNZW51QWN0aW9uIAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy52aWV3czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zdGVtLnVpLnZpZXdzLmdlb2dyYXBoaWMubWFwLlNlbGVjdGVkUmVwb3J0c01hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7CisKKy8qKgorICogVGhlIGNsYXNzIGlzIGEgZGVsZWdhdGlvbiBmb3IgdGhlIHBvcHVwIG1lbnUgb2YgdGhlCisgKiA8Y29kZT5HZW9ncmFwaGljUmVuZGVyZXI8L2NvZGU+LiBUaGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIGhhbmRsZQorICogdGhlIGFjdGl2aXR5IGluIHRoZSByZXBvcnRzIGNvbnRleHQgbWVudSBhbmQga2VlcCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbGwKKyAqIGVuYWJsZWQvZGlzYWJsZWQgcmVwb3J0cyBmcm9tIHRoYXQgbWVudS4gVGhlIHJlcG9ydCdzIDxjb2RlPlZpZXdQYXJ0PC9jb2RlPgorICogb2JqZWN0IHdpbGwgdXNlIHRoaXMgY2xhc3MgZm9yIGNoZWNraW5nIHdoZXRoZXIgdG8gZ2VuZXJhdGUgYSByZXBvcnQgb3Igbm90LgorICovCitwdWJsaWMgY2xhc3MgUmVwb3J0c0NvbnRleHRNZW51QWN0aW9uIAorCWltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIHJ1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiBhY3Rpb24pIHsKKwkJU3RyaW5nIHJlcG9ydElkID0gYWN0aW9uLmdldElkKCk7CisJCQorCQlpZiAoU2VsZWN0ZWRSZXBvcnRzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmlzUmVwb3J0RW5hYmxlZChyZXBvcnRJZCkpIHsgLy8gVGhlIHJlcG9ydCB3YXMgcHJldmlvdXNseSBlbmFibGVkIHNvIGRpc2FibGUgaXQKKwkJCVNlbGVjdGVkUmVwb3J0c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5kaXNhYmxlUmVwb3J0Rm9ySWRlbnRpZmlhYmxlKHJlcG9ydElkKTsKKwkJCWFjdGlvbi5zZXRDaGVja2VkKGZhbHNlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVNlbGVjdGVkUmVwb3J0c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5lbmFibGVSZXBvcnRGb3JJZGVudGlmaWFibGUocmVwb3J0SWQpOworCQkJYWN0aW9uLnNldENoZWNrZWQodHJ1ZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAorCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24gYWN0aW9uLAorCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCQlvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCS8vIERvIE5vdGhpbmcKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCisJICovCisJcHVibGljIHZvaWQgaW5pdChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwlJVmlld1BhcnQgYXJnMCkgeworCQkvLyBEbyBOb3RoaW5nCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9sb2dnZXJzL3ZpZXdzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWwubG9nZ2Vycy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsL2xvZ2dlcnMvdmlld3MvbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGYyZGM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsLmxvZ2dlcnMvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbC9sb2dnZXJzL3ZpZXdzL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNiBAQAorIyBtZXNzYWdlcy5wcm9wZXJ0aWVzCisjCisjIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjICoKKyMgKiBDb250cmlidXRvcnM6CisjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjIENvbW1hIHNlcGFyYXRlZCB2YXJpYWJsZQorQ1NDLnRpdGxlPUNTVgorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNTAxMTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvLmNsYXNzcGF0aApAQCAtMCwwICsxLDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkMTNhYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS8ucHJvamVjdApAQCAtMCwwICsxLDE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHk8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2Y2IyYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKQEAgLTAsMCArMSwzIEBACisjVHVlIEphbiAxNiAwOTo1MDoyMyBQU1QgMjAwNworZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK2VuY29kaW5nLy9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvbWVzc2FnZXMucHJvcGVydGllcz04ODU5XzEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OTlhNDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsNzcgQEAKKyNUdWUgU2VwIDAxIDE2OjU5OjA5IEVEVCAyMDA5CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlY3JlYXRlTW9kaWZpZWRDbGFzc0ZpbGVJbk91dHB1dEZvbGRlcj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uPXJldHVybl90YWcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWMwYThiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTAsMCArMSwzIEBACisjVHVlIEphbiAxNiAwOToyNjozMCBQU1QgMjAwNworZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9BZG1pbjFMZXhTb3J0ZXIuY29uZmlnIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vQWRtaW4xTGV4U29ydGVyLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWJmZGZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vQWRtaW4xTGV4U29ydGVyLmNvbmZpZwpAQCAtMCwwICsxLDI5IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgKioqKioqKioqKiBDT05GSUdVUkFUSU9OIEZJTEUgRk9SIEFETUlOIDEgTEVYSUNPR1JBUEhJQyBTT1JURVIgKioqKioqKioqKgorIworIyBUTyBDSEFOR0UgREVGQVVMVCBDT05GSUdVUkFUSU9OIFZBTFVFUywgTU9ESUZZIE9SRy5FQ0xJUFNFLlNURU0uVVRJTElUWS5HRU5FUkFUT1JTXEdlbkNvbnN0YW50cy5qYXZhCisjCisjIENPTkZJR1VSQVRJT04gVkFSSUFCTEVTIFNFVCBJTiBUSElTIEZJTEUgT1ZFUlJJREUgVEhFIERFRkFVTFRTCisjCisjIFRoZSBXT1JLU1BBQ0UgVkFSSUFCTEUgSVMgUkVRVUlSRUQsIEFMTCBPVEhFUiBWQVJJQUJMRVMgQVJFIE9QVElPTkFMIChpLmUuIFdPUktTUEFDRT1DOlxzdGVtSUlcKQorV09SS1NQQUNFPUM6XHN0ZW1JSVwKKyMKKyMgSVNPMzE2Ni0xIGZpbGUgKGkuZS4gSVNPMzE2Nl8xPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTFcSVNPMzE2Nl8xX2xpc3QudHh0KQorI0lTMDMxNjZfMT0KKyMKKyMgSVNPMzE2Ni0yIGZpbGUgKGkuZS4gSVNPMzE2Nl8yPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTJcSVNPMzE2Nl8yX2xpc3QudHh0KQorI0lTTzMxNjZfMj0KKyMKKyMgSVNPIGZpeCAgZmlsZSAoaS5lLiBJU09fRklYPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU09GSVhcSVNPX0ZJWC50eHQpCisjSVNPX0ZJWD0KKyMKKyMgRmlsZSB3aXRoIHRhcmdldCBjb3VudHJpZXMgd2Ugd2FudCB0byBwcm9jZXNzIChpLmUuIFRBUkdFVF9MSVNUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXGNvdW50cnlfbmFtZXMudHh0KQorVEFSR0VUX0xJU1QgPSBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcdGFyZ2V0c1xjb3VudHJ5X25hbWVzLnR4dAorIworIyBPdXRwdXQgZGlyZWN0b3J5IGZvciBuZXcgZmlsZXMgKGkuZS4gUFJPUEVSVElFU19PVVRQVVQ9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXCkKK1BST1BFUlRJRVNfT1VUUFVUID0gQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXHNvcnRcCisjCisjICoqKioqKioqKiogRU5EIE9GIENPTkZJR1VSQVRJT04gRklMRSBGT1IgQURNSU4gMSBMRVhJQ09HUkFQSElDIFNPUlRFUiAqKioqKioqKioqCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9BZG1pbjJMZXhTb3J0ZXIuY29uZmlnIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vQWRtaW4yTGV4U29ydGVyLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODgzNzhlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vQWRtaW4yTGV4U29ydGVyLmNvbmZpZwpAQCAtMCwwICsxLDIzIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgKioqKioqKioqKiBDT05GSUdVUkFUSU9OIEZJTEUgRk9SIEFETUlOIDIgTEVYSUNPR1JBUEhJQyBTT1JURVIgKioqKioqKioqKgorIworIyBUTyBDSEFOR0UgREVGQVVMVCBDT05GSUdVUkFUSU9OIFZBTFVFUywgTU9ESUZZIE9SRy5FQ0xJUFNFLlNURU0uVVRJTElUWS5HRU5FUkFUT1JTXEdlbkNvbnN0YW50cy5qYXZhCisjCisjIENPTkZJR1VSQVRJT04gVkFSSUFCTEVTIFNFVCBJTiBUSElTIEZJTEUgT1ZFUlJJREUgVEhFIERFRkFVTFRTCisjCisjIFRoZSBXT1JLU1BBQ0UgVkFSSUFCTEUgSVMgUkVRVUlSRUQsIEFMTCBPVEhFUiBWQVJJQUJMRVMgQVJFIE9QVElPTkFMIChpLmUuIFdPUktTUEFDRT1DOlxzdGVtSUlcKQorV09SS1NQQUNFPUM6XHN0ZW1JSVwKKyMKKyMgSVNPMzE2Ni0xIGZpbGUgKGkuZS4gSVNPMzE2Nl8xPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTFcSVNPMzE2Nl8xX2xpc3QudHh0KQorI0lTMDMxNjZfMT0KKyMKKyMgRmlsZSB3aXRoIHRhcmdldCBjb3VudHJpZXMgd2Ugd2FudCB0byBwcm9jZXNzIChpLmUuIFRBUkdFVF9MSVNUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXGdyb3VwZWREYXRhRmlsZXMudHh0KQorVEFSR0VUX0xJU1QgPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXGdyb3VwZWREYXRhRmlsZXMudHh0CisjCisjIE91dHB1dCBkaXJlY3RvcnkgZm9yIG5ldyBmaWxlcyAoaS5lLiBQUk9QRVJUSUVTX09VVFBVVD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhXHJlc291cmNlc1xkYXRhXGNvdW50cnlcKQorI1BST1BFUlRJRVNfT1VUUFVUPSBDOlx0ZW1wb3V0XAorIworIyAqKioqKioqKioqIEVORCBPRiBDT05GSUdVUkFUSU9OIEZJTEUgRk9SIEFETUlOIDIgTEVYSUNPR1JBUEhJQyBTT1JURVIgKioqKioqKioqKgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vQXJlYUdlbmVyYXRvci5jb25maWcgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9BcmVhR2VuZXJhdG9yLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWUyNTMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vQXJlYUdlbmVyYXRvci5jb25maWcKQEAgLTAsMCArMSw0MSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICoqKioqKioqKiogQ09ORklHVVJBVElPTiBGSUxFIEZPUiBBUkVBIEdFTkVSQVRPUiAqKioqKioqKioqCisjCisjIFRPIENIQU5HRSBERUZBVUxUIENPTkZJR1VSQVRJT04gVkFMVUVTLCBNT0RJRlkgT1JHLkVDTElQU0UuU1RFTS5VVElMSVRZLkdFTkVSQVRPUlNcR2VuQ29uc3RhbnRzLmphdmEKKyMKKyMgQ09ORklHVVJBVElPTiBWQVJJQUJMRVMgU0VUIElOIFRISVMgRklMRSBPVkVSUklERSBUSEUgREVGQVVMVFMKKyMKKyMgVGhlIFdPUktTUEFDRSBWQVJJQUJMRSBJUyBSRVFVSVJFRCwgQUxMIE9USEVSIFZBUklBQkxFUyBBUkUgT1BUSU9OQUwgKGkuZS4gV09SS1NQQUNFPUM6XHN0ZW1JSVwpCitXT1JLU1BBQ0U9Qzpcc3RlbUlJXAorIworIyBJU08zMTY2LTEgZmlsZSAoaS5lLiBJU08zMTY2XzE9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXElTTzMxNjYtMVxJU08zMTY2XzFfbGlzdC50eHQpCisjSVMwMzE2Nl8xPQorIworIyBJU08zMTY2LTIgZmlsZSAoaS5lLiBJU08zMTY2XzI9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXElTTzMxNjYtMlxJU08zMTY2XzJfbGlzdC50eHQpCisjSVNPMzE2Nl8yPQorIworIyBJU08gZml4ICBmaWxlIChpLmUuIElTT19GSVg9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXElTT0ZJWFxJU09fRklYLnR4dCkKKyNJU09fRklYPQorIworIyBGaWxlIHdpdGggdGFyZ2V0IGNvdW50cmllcyB3ZSB3YW50IHRvIHByb2Nlc3MgKGkuZS4gVEFSR0VUX0xJU1Q9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXHRhcmdldHNcZ3JvdXBlZERhdGFGaWxlcy50eHQpCisjVEFSR0VUX0xJU1QgPQorIworIyBQb3B1bGF0aW9uIHByb2ZpbGUgZm9yIHRoaXMgY291bnRyeSAoaS5lLiBQT1BfUFJPRklMRVM9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXHByb2ZpbGVzXCkKKyNQT1BfUFJPRklMRVM9CisjCisjIFBhdGggdG8gYXJlYXMgaW4gcG9seWdvbiB1bml0cyAtIHVzZWQgb25seSBmb3IgY29tcHV0aW5nIGFwcHJveGltYXRlIGFyZWEgb2YgbGV2ZWwgMiByZWdpb25zIChpLmUuIFBPTFlHT05fQVJFQVM9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXFBvbHlnb25BcmVhc1wpCisjUE9MWUdPTl9BUkVBUz0KKyMKKyMgUGF0aCB0byBhcmVhIGFuZCBwb3B1bGF0aW9uIGZpbGVzIChpLmUuIEFSRUFfUE9QPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xBcmVhUG9wdWxhdGlvbkRhdGFcKQorI0FSRUFfUE9QPQorIworIyBQYXRoIHRvIGZvbGRlciB3aXRoIGxleGljb2dyYXBoaWNhbGx5IHNvcnRlZCBmaWxlcyAoaS5lLiBMRVhfRElSPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xzb3J0XCkKKyNMRVhfRElSPQorIworIyBPdXRwdXQgZGlyZWN0b3J5IGZvciBuZXcgZmlsZXMgKGkuZS4gUFJPUEVSVElFU19PVVRQVVQ9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YVxyZXNvdXJjZXNcZGF0YVxjb3VudHJ5XCkKK1BST1BFUlRJRVNfT1VUUFVUPSBDOlx0ZW1wb3V0XAorIworIyAqKioqKioqKioqIEVORCBPRiBDT05GSUdVUkFUSU9OIEZJTEUgRk9SIEFSRUEgR0VORVJBVE9SICoqKioqKioqKioKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL0Rvd25TYW1wbGVyLmNvbmZpZyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL0Rvd25TYW1wbGVyLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDA0Zjc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vRG93blNhbXBsZXIuY29uZmlnCkBAIC0wLDAgKzEsNDIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAqKioqKioqKioqIENPTkZJR1VSQVRJT04gRklMRSBGT1IgRE9XTi1TQU1QTEVSICoqKioqKioqKioKKyMKKyMgVE8gQ0hBTkdFIERFRkFVTFQgQ09ORklHVVJBVElPTiBWQUxVRVMsIE1PRElGWSBPUkcuRUNMSVBTRS5TVEVNLlVUSUxJVFkuR0VORVJBVE9SU1xHZW5Db25zdGFudHMuamF2YQorIworIyBDT05GSUdVUkFUSU9OIFZBUklBQkxFUyBTRVQgSU4gVEhJUyBGSUxFIE9WRVJSSURFIFRIRSBERUZBVUxUUworIworIyBUaGUgV09SS1NQQUNFIFZBUklBQkxFIElTIFJFUVVJUkVELCBBTEwgT1RIRVIgVkFSSUFCTEVTIEFSRSBPUFRJT05BTCAoaS5lLiBXT1JLU1BBQ0U9Qzpcc3RlbUlJXCkKK1dPUktTUEFDRT1DOlxzdGVtSUlcCisjCisjIFRoZSBUSFJFU0hPTEQgdmFyaWFibGUgc3BlY2lmaWVzIGFuIGFuZ2xlIGluIGRlZ3JlZXMgZm9yIHdoaWNoIHdlIHdhbnQgdG8gcmVkdWNlLiBJZiBub3QgcHJvdmlkZWQgaXQgZGVmYXVsdHMgdG8gNSBkZWdyZWVzLgorVEhSRVNIT0xEPTUKKyMKKyMgVGhlIG51bWJlciBvZiByZWR1Y3Rpb24gSVRFUkFUSU9OUy4gSWYgbm90IHByb3ZpZGVkIGl0IGRlZmF1bHRzIHRvIDUgaXRlcmF0aW9ucy4KK0lURVJBVElPTlM9NQorIworIyBJU08zMTY2LTEgZmlsZSAoaS5lLiBJU08zMTY2XzE9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXElTTzMxNjYtMVxJU08zMTY2XzFfbGlzdC50eHQpCisjSVMwMzE2Nl8xPQorIworIyBJU08zMTY2LTIgZmlsZSAoaS5lLiBJU08zMTY2XzI9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXElTTzMxNjYtMlxJU08zMTY2XzJfbGlzdC50eHQpCisjSVNPMzE2Nl8yPQorIworIyBJU08gZml4ICBmaWxlIChpLmUuIElTT19GSVg9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXElTT0ZJWFxJU09fRklYLnR4dCkKKyNJU09fRklYPQorIworIyBGaWxlIHdpdGggdGFyZ2V0IGNvdW50cmllcyB3ZSB3YW50IHRvIHByb2Nlc3MgKGkuZS4gVEFSR0VUX0xJU1Q9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXHRhcmdldHNcZ3JvdXBlZERhdGFGaWxlcy50eHQpCitUQVJHRVRfTElTVCA9IEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXENvdW50cmllc0xpZ2h0LnR4dAorIworIyBGaWxlIHdpdGggdGFyZ2V0IGNvdW50cmllcyB3ZSB3YW50IHRvIHByb2Nlc3MgKGkuZS4gVEFSR0VUX0xJU1Q9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXHRhcmdldHNcZ3JvdXBlZERhdGFGaWxlcy50eHQpCitSRURVQ0VfTElTVCA9IEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXHJlZHVjZUxpc3QudHh0CisjCisjIFBhdGggdG8gZm9sZGVyIHdpdGggbGV4aWNvZ3JhcGhpY2FsbHkgc29ydGVkIGZpbGVzIChpLmUuIExFWF9ESVI9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXHNvcnRcKQorI0xFWF9ESVI9CisjCisjIE91dHB1dCBkaXJlY3RvcnkgZm9yIG5ldyBmaWxlcyAoaS5lLiBQUk9QRVJUSUVTX09VVFBVVD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhXHJlc291cmNlc1xkYXRhXGNvdW50cnlcKQorTUFQX09VVFBVVD0gQzpcdGVtcG91dFwKKyMKKyMgKioqKioqKioqKiBFTkQgT0YgQ09ORklHVVJBVElPTiBGSUxFIEZPUiBET1dOLVNBTVBMRVIgKioqKioqKioqKgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL0V1cm9wZURhdGFDbGVhbmVyLmNvbmZpZyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL0V1cm9wZURhdGFDbGVhbmVyLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDY3ZWQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vRXVyb3BlRGF0YUNsZWFuZXIuY29uZmlnCkBAIC0wLDAgKzEsMjAgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAqKioqKioqKioqIENPTkZJR1VSQVRJT04gRklMRSBFVVJPUEUgREFUQSBDTEVBTkVSICoqKioqKioqKioKKyMKKyMgVE8gQ0hBTkdFIERFRkFVTFQgQ09ORklHVVJBVElPTiBWQUxVRVMsIE1PRElGWSBPUkcuRUNMSVBTRS5TVEVNLlVUSUxJVFkuR0VORVJBVE9SU1xHZW5Db25zdGFudHMuamF2YQorIworIyBDT05GSUdVUkFUSU9OIFZBUklBQkxFUyBTRVQgSU4gVEhJUyBGSUxFIE9WRVJSSURFIFRIRSBERUZBVUxUUworIworIyBUaGUgV09SS1NQQUNFIFZBUklBQkxFIElTIFJFUVVJUkVELCBBTEwgT1RIRVIgVkFSSUFCTEVTIEFSRSBPUFRJT05BTCAoaS5lLiBXT1JLU1BBQ0U9Qzpcc3RlbUlJXCkKK1dPUktTUEFDRT1DOlxzdGVtSUlcCisjCisjIEZpbGUgd2l0aCB0YXJnZXQgY291bnRyaWVzIHdlIHdhbnQgdG8gcHJvY2VzcyAoaS5lLiBUQVJHRVRfTElTVD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcdGFyZ2V0c1xFdXJvcGVDb3VudHJpZXMudHh0KQorVEFSR0VUX0xJU1QgPSBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcdGFyZ2V0c1xFdXJvcGVDb3VudHJpZXMudHh0CisjCisjIE91dHB1dCBkaXJlY3RvcnkgZm9yIG5ldyBmaWxlcyAoaS5lLiBPVVRQVVQ9QzpcRXVyb3BlRGF0YTIwMDdcRXVyb3BlVU5cVU5kYXRhU2hwXCkKK09VVFBVVCA9IEM6XEV1cm9wZURhdGEyMDA3XEV1cm9wZVVOXFVOZGF0YVNocFwKKyMKKyMgKioqKioqKioqKiBFTkQgT0YgQ09ORklHVVJBVElPTiBGSUxFIEZPUiBFVVJPUEUgREFUQSBDTEVBTkVSICoqKioqKioqKioKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL0V1cm9wZURhdGFDb252ZXJ0ZXIuY29uZmlnIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vRXVyb3BlRGF0YUNvbnZlcnRlci5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3MTgzMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL0V1cm9wZURhdGFDb252ZXJ0ZXIuY29uZmlnCkBAIC0wLDAgKzEsMjYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAqKioqKioqKioqIENPTkZJR1VSQVRJT04gRklMRSBGT1IgRVVST1BFIERBVEEgQ09OVkVSVEVSICoqKioqKioqKioKKyMKKyMgVE8gQ0hBTkdFIERFRkFVTFQgQ09ORklHVVJBVElPTiBWQUxVRVMsIE1PRElGWSBPUkcuRUNMSVBTRS5TVEVNLlVUSUxJVFkuR0VORVJBVE9SU1xHZW5Db25zdGFudHMuamF2YQorIworIyBDT05GSUdVUkFUSU9OIFZBUklBQkxFUyBTRVQgSU4gVEhJUyBGSUxFIE9WRVJSSURFIFRIRSBERUZBVUxUUworIworIyBUaGUgV09SS1NQQUNFIFZBUklBQkxFIElTIFJFUVVJUkVELCBBTEwgT1RIRVIgVkFSSUFCTEVTIEFSRSBPUFRJT05BTCAoaS5lLiBXT1JLU1BBQ0U9Qzpcc3RlbUlJXCkKK1dPUktTUEFDRT1DOlxzdGVtSUlcCisjCisjIElTTzMxNjYtMSBmaWxlIChpLmUuIElTTzMxNjZfMT1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcSVNPMzE2Ni0xXElTTzMxNjZfMV9saXN0LnR4dCkKKyNJUzAzMTY2XzE9CisjCisjIEV1cm9wZSBuYW1lcyBmaWxlIChpLmUuIE5BTUVTX0xJU1Q9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXHRhcmdldHNcRXVyb3BlTmFtZXMudHh0KQorTkFNRVNfTElTVD0gQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXHRhcmdldHNcRXVyb3BlTmFtZXMudHh0CisjCisjIEZpbGUgd2l0aCB0YXJnZXQgY291bnRyaWVzIHdlIHdhbnQgdG8gcHJvY2VzcyAoaS5lLiBUQVJHRVRfTElTVD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcdGFyZ2V0c1xFdXJvcGVDb3VudHJpZXMudHh0KQorVEFSR0VUX0xJU1QgPSBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcdGFyZ2V0c1xFdXJvcGVDb3VudHJpZXMudHh0CisjCisjIE91dHB1dCBkaXJlY3RvcnkgZm9yIG5ldyBmaWxlcyAoaS5lLiBPVVRQVVQ9QzpcZGl2YVxFdXJvcGUpCitPVVRQVVQgPSBDOlxkaXZhXEV1cm9wZVwKKyMKKyMgKioqKioqKioqKiBFTkQgT0YgQ09ORklHVVJBVElPTiBGSUxFIEZPUiBFVVJPUEUgREFUQSBDT05WRVJURVIgKioqKioqKioqKgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vRXVyb3BlRGF0YUV4dHJhY3Rvci5jb25maWcgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9FdXJvcGVEYXRhRXh0cmFjdG9yLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGVmNjkwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vRXVyb3BlRGF0YUV4dHJhY3Rvci5jb25maWcKQEAgLTAsMCArMSwyNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICoqKioqKioqKiogQ09ORklHVVJBVElPTiBGSUxFIEZPUiBFVVJPUEUgREFUQSBFWFRSQUNUT1IgKioqKioqKioqKgorIworIyBUTyBDSEFOR0UgREVGQVVMVCBDT05GSUdVUkFUSU9OIFZBTFVFUywgTU9ESUZZIE9SRy5FQ0xJUFNFLlNURU0uVVRJTElUWS5HRU5FUkFUT1JTXEdlbkNvbnN0YW50cy5qYXZhCisjCisjIENPTkZJR1VSQVRJT04gVkFSSUFCTEVTIFNFVCBJTiBUSElTIEZJTEUgT1ZFUlJJREUgVEhFIERFRkFVTFRTCisjCisjIFRoZSBXT1JLU1BBQ0UgVkFSSUFCTEUgSVMgUkVRVUlSRUQsIEFMTCBPVEhFUiBWQVJJQUJMRVMgQVJFIE9QVElPTkFMIChpLmUuIFdPUktTUEFDRT1DOlxzdGVtSUlcKQorV09SS1NQQUNFPUM6XHN0ZW1JSVwKKyMKKyMgSVNPMzE2Ni0xIGZpbGUgKGkuZS4gSVNPMzE2Nl8xPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTFcSVNPMzE2Nl8xX2xpc3QudHh0KQorI0lTMDMxNjZfMT0KKyMKKyMgRXVyb3BlIG5hbWVzIGZpbGUgKGkuZS4gTkFNRVNfTElTVD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcdGFyZ2V0c1xFdXJvcGVOYW1lcy50eHQpCitOQU1FU19MSVNUPSBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcdGFyZ2V0c1xFdXJvcGVOYW1lcy50eHQKKyMKKyMgRmlsZSB3aXRoIHRhcmdldCBjb3VudHJpZXMgd2Ugd2FudCB0byBwcm9jZXNzIChpLmUuIFRBUkdFVF9MSVNUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXEV1cm9wZUNvdW50cmllcy50eHQpCitUQVJHRVRfTElTVCA9IEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXEV1cm9wZUNvdW50cmllcy50eHQKKyMKKyMgT3V0cHV0IGRpcmVjdG9yeSBmb3IgbmV3IGZpbGVzIChpLmUuIE9VVFBVVD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcQXJlYVBvcHVsYXRpb25EYXRhXCkKK09VVFBVVCA9IEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xBcmVhUG9wdWxhdGlvbkRhdGFcCisjCisjICoqKioqKioqKiogRU5EIE9GIENPTkZJR1VSQVRJT04gRklMRSBGT1IgRVVST1BFIERBVEEgRVhUUkFDVE9SICoqKioqKioqKioKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL0V1cm9wZURhdGFGb3JtYXR0ZXIuY29uZmlnIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vRXVyb3BlRGF0YUZvcm1hdHRlci5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzY2M3OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL0V1cm9wZURhdGFGb3JtYXR0ZXIuY29uZmlnCkBAIC0wLDAgKzEsMjYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAqKioqKioqKioqIENPTkZJR1VSQVRJT04gRklMRSBGT1IgRVVST1BFIERBVEEgRk9STUFUVEVSICoqKioqKioqKioKKyMKKyMgVE8gQ0hBTkdFIERFRkFVTFQgQ09ORklHVVJBVElPTiBWQUxVRVMsIE1PRElGWSBPUkcuRUNMSVBTRS5TVEVNLlVUSUxJVFkuR0VORVJBVE9SU1xHZW5Db25zdGFudHMuamF2YQorIworIyBDT05GSUdVUkFUSU9OIFZBUklBQkxFUyBTRVQgSU4gVEhJUyBGSUxFIE9WRVJSSURFIFRIRSBERUZBVUxUUworIworIyBUaGUgV09SS1NQQUNFIFZBUklBQkxFIElTIFJFUVVJUkVELCBBTEwgT1RIRVIgVkFSSUFCTEVTIEFSRSBPUFRJT05BTCAoaS5lLiBXT1JLU1BBQ0U9Qzpcc3RlbUlJXCkKK1dPUktTUEFDRT1DOlxzdGVtSUlcCisjCisjIElTTzMxNjYtMSBmaWxlIChpLmUuIElTTzMxNjZfMT1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcSVNPMzE2Ni0xXElTTzMxNjZfMV9saXN0LnR4dCkKKyNJUzAzMTY2XzE9CisjCisjIElTTyBmaXggIGZpbGUgKGkuZS4gSVNPX0ZJWD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcSVNPRklYXElTT19GSVgudHh0KQorI0lTT19GSVg9CisjCisjIEZpbGUgd2l0aCB0YXJnZXQgY291bnRyaWVzIHdlIHdhbnQgdG8gcHJvY2VzcyAoaS5lLiBUQVJHRVRfTElTVD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcdGFyZ2V0c1xFdXJvcGVDb3VudHJpZXMudHh0KQorVEFSR0VUX0xJU1QgPSBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcdGFyZ2V0c1xFdXJvcGVDb3VudHJpZXMudHh0CisjCisjIE91dHB1dCBkaXJlY3RvcnkgZm9yIG5ldyBmaWxlcyAoaS5lLiBPVVRQVVQ9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVx0ZW1wXCkKK09VVFBVVCA9IEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcdGVtcFwKKyMKKyMgKioqKioqKioqKiBFTkQgT0YgQ09ORklHVVJBVElPTiBGSUxFIEZPUiBFVVJPUEUgREFUQSBGT1JNQVRURVIqKioqKioqKioqCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9HTUxHZW5lcmF0b3IuY29uZmlnIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vR01MR2VuZXJhdG9yLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjk0NWZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vR01MR2VuZXJhdG9yLmNvbmZpZwpAQCAtMCwwICsxLDMyIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgKioqKioqKioqKiBDT05GSUdVUkFUSU9OIEZJTEUgRk9SIEdNTCBHRU5FUkFUT1IgKioqKioqKioqKgorIworIyBUTyBDSEFOR0UgREVGQVVMVCBDT05GSUdVUkFUSU9OIFZBTFVFUywgTU9ESUZZIE9SRy5FQ0xJUFNFLlNURU0uVVRJTElUWS5HRU5FUkFUT1JTXEdlbkNvbnN0YW50cy5qYXZhCisjCisjIENPTkZJR1VSQVRJT04gVkFSSUFCTEVTIFNFVCBJTiBUSElTIEZJTEUgT1ZFUlJJREUgVEhFIERFRkFVTFRTCisjCisjIFRoZSBXT1JLU1BBQ0UgVkFSSUFCTEUgSVMgUkVRVUlSRUQsIEFMTCBPVEhFUiBWQVJJQUJMRVMgQVJFIE9QVElPTkFMIChpLmUuIFdPUktTUEFDRT1DOlxzdGVtSUlcKQorV09SS1NQQUNFPUM6XHN0ZW1JSVwKKyMKKyMgSVNPMzE2Ni0xIGZpbGUgKGkuZS4gSVNPMzE2Nl8xPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTFcSVNPMzE2Nl8xX2xpc3QudHh0KQorI0lTMDMxNjZfMT0KKyMKKyMgSVNPMzE2Ni0yIGZpbGUgKGkuZS4gSVNPMzE2Nl8yPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTJcSVNPMzE2Nl8yX2xpc3QudHh0KQorI0lTTzMxNjZfMj0KKyMKKyMgSVNPIGZpeCAgZmlsZSAoaS5lLiBJU09fRklYPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU09GSVhcSVNPX0ZJWC50eHQpCisjSVNPX0ZJWD0KKyMKKyMgRmlsZSB3aXRoIHRhcmdldCBjb3VudHJpZXMgd2Ugd2FudCB0byBwcm9jZXNzIChpLmUuIFRBUkdFVF9MSVNUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXGdyb3VwZWREYXRhRmlsZXMudHh0KQorI1RBUkdFVF9MSVNUID0KKyMKKyMgUGF0aCB0byBmb2xkZXIgd2l0aCBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgZmlsZXMgKGkuZS4gTEVYX0RJUj1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcc29ydFwpCisjTEVYX0RJUj0KKyMKKyMgT3V0cHV0IGRpcmVjdG9yeSBmb3IgbmV3IGZpbGVzIChpLmUuIFBST1BFUlRJRVNfT1VUUFVUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGFccmVzb3VyY2VzXGRhdGFcY291bnRyeVwpCisjUFJPUEVSVElFU19PVVRQVVQ9IEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeVxyZXNvdXJjZXNcZGF0YVxnZW9cY291bnRyeVwKKyMKKyMgKioqKioqKioqKiBFTkQgT0YgQ09ORklHVVJBVElPTiBGSUxFIEZPUiBHTUwgR0VORVJBVE9SICoqKioqKioqKioKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL0dyb3VwR2VuZXJhdG9yLmNvbmZpZyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL0dyb3VwR2VuZXJhdG9yLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGU1ZjE2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vR3JvdXBHZW5lcmF0b3IuY29uZmlnCkBAIC0wLDAgKzEsMzIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAqKioqKioqKioqIENPTkZJR1VSQVRJT04gRklMRSBGT1IgR1JPVVAgR0VORVJBVE9SICoqKioqKioqKioKKyMKKyMgVE8gQ0hBTkdFIERFRkFVTFQgQ09ORklHVVJBVElPTiBWQUxVRVMsIE1PRElGWSBPUkcuRUNMSVBTRS5TVEVNLlVUSUxJVFkuR0VORVJBVE9SU1xHZW5Db25zdGFudHMuamF2YQorIworIyBDT05GSUdVUkFUSU9OIFZBUklBQkxFUyBTRVQgSU4gVEhJUyBGSUxFIE9WRVJSSURFIFRIRSBERUZBVUxUUworIworIyBUaGUgV09SS1NQQUNFIFZBUklBQkxFIElTIFJFUVVJUkVELCBBTEwgT1RIRVIgVkFSSUFCTEVTIEFSRSBPUFRJT05BTCAoaS5lLiBXT1JLU1BBQ0U9Qzpcc3RlbUlJXCkKK1dPUktTUEFDRT1DOlxzdGVtSUlcCisjCisjIElTTzMxNjYtMSBmaWxlIChpLmUuIElTTzMxNjZfMT1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcSVNPMzE2Ni0xXElTTzMxNjZfMV9saXN0LnR4dCkKKyNJUzAzMTY2XzE9CisjCisjIElTTzMxNjYtMiBmaWxlIChpLmUuIElTTzMxNjZfMj1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcSVNPMzE2Ni0yXElTTzMxNjZfMl9saXN0LnR4dCkKKyNJU08zMTY2XzI9CisjCisjIElTTyBmaXggIGZpbGUgKGkuZS4gSVNPX0ZJWD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcSVNPRklYXElTT19GSVgudHh0KQorI0lTT19GSVg9CisjCisjIEZpbGUgd2l0aCB0YXJnZXQgY291bnRyaWVzIHdlIHdhbnQgdG8gcHJvY2VzcyAoaS5lLiBUQVJHRVRfTElTVD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcdGFyZ2V0c1xncm91cGVkRGF0YUZpbGVzLnR4dCkKKyNUQVJHRVRfTElTVCA9CisjCisjIFBhdGggdG8gZm9sZGVyIHdpdGggbGV4aWNvZ3JhcGhpY2FsbHkgc29ydGVkIGZpbGVzIChpLmUuIExFWF9ESVI9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXHNvcnRcKQorI0xFWF9ESVI9CisjCisjIE91dHB1dCBkaXJlY3RvcnkgZm9yIG5ldyBmaWxlcyAoaS5lLiBQUk9QRVJUSUVTX09VVFBVVD1DOlxkaXZhXGdyb3VwZWRcKQorT1VUUFVUPSBDOlxkaXZhXGdyb3VwZWRcCisjCisjICoqKioqKioqKiogRU5EIE9GIENPTkZJR1VSQVRJT04gRklMRSBGT1IgR1JPVVAgR0VORVJBVE9SICoqKioqKioqKioKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL011bHRpUGFzc0Rvd25TYW1wbGVyLmNvbmZpZyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL011bHRpUGFzc0Rvd25TYW1wbGVyLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzRhYTI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vTXVsdGlQYXNzRG93blNhbXBsZXIuY29uZmlnCkBAIC0wLDAgKzEsMzggQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAqKioqKioqKioqIENPTkZJR1VSQVRJT04gRklMRSBGT1IgTVVMVEkgUEFTUyBET1dOLVNBTVBMRVIgKioqKioqKioqKgorIworIyBUTyBDSEFOR0UgREVGQVVMVCBDT05GSUdVUkFUSU9OIFZBTFVFUywgTU9ESUZZIE9SRy5FQ0xJUFNFLlNURU0uVVRJTElUWS5HRU5FUkFUT1JTXEdlbkNvbnN0YW50cy5qYXZhCisjCisjIENPTkZJR1VSQVRJT04gVkFSSUFCTEVTIFNFVCBJTiBUSElTIEZJTEUgT1ZFUlJJREUgVEhFIERFRkFVTFRTCisjCisjIFRoZSBXT1JLU1BBQ0UgVkFSSUFCTEUgSVMgUkVRVUlSRUQsIEFMTCBPVEhFUiBWQVJJQUJMRVMgQVJFIE9QVElPTkFMIChpLmUuIFdPUktTUEFDRT1DOlxzdGVtSUlcKQorV09SS1NQQUNFPUM6XHN0ZW1JSVwKKyMKKyMgVGhlIFRIUkVTSE9MRCB2YXJpYWJsZSBzcGVjaWZpZXMgYW4gYW5nbGUgaW4gZGVncmVlcyBmb3Igd2hpY2ggd2Ugd2FudCB0byByZWR1Y2UuIElmIG5vdCBwcm92aWRlZCBpdCBkZWZhdWx0cyB0byA1IGRlZ3JlZXMuCisjVEhSRVNIT0xEPTUKKyMKKyMgVGhlIG51bWJlciBvZiByZWR1Y3Rpb24gSVRFUkFUSU9OUy4gSWYgbm90IHByb3ZpZGVkIGl0IGRlZmF1bHRzIHRvIDUgaXRlcmF0aW9ucy4KKyNJVEVSQVRJT05TPTUKKyMKKyMgSVNPMzE2Ni0xIGZpbGUgKGkuZS4gSVNPMzE2Nl8xPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTFcSVNPMzE2Nl8xX2xpc3QudHh0KQorI0lTMDMxNjZfMT0KKyMKKyMgSVNPMzE2Ni0yIGZpbGUgKGkuZS4gSVNPMzE2Nl8yPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTJcSVNPMzE2Nl8yX2xpc3QudHh0KQorI0lTTzMxNjZfMj0KKyMKKyMgSVNPIGZpeCAgZmlsZSAoaS5lLiBJU09fRklYPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU09GSVhcSVNPX0ZJWC50eHQpCisjSVNPX0ZJWD0KKyMKKyMgRmlsZSB3aXRoIHRhcmdldCBjb3VudHJpZXMgd2Ugd2FudCB0byBwcm9jZXNzIChpLmUuIFRBUkdFVF9MSVNUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXGdyb3VwZWREYXRhRmlsZXMudHh0KQorVEFSR0VUX0xJU1QgPSBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcdGFyZ2V0c1xyZWR1Y2VMaXN0LnR4dAorIworIyBQYXRoIHRvIGZvbGRlciB3aXRoIGxleGljb2dyYXBoaWNhbGx5IHNvcnRlZCBmaWxlcyAoaS5lLiBMRVhfRElSPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xzb3J0XCkKKyNMRVhfRElSPQorIworIyBPdXRwdXQgZGlyZWN0b3J5IGZvciBuZXcgZmlsZXMgKGkuZS4gTUFQX09VVFBVVD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHlccmVzb3VyY2VzXGRhdGFcZ2VvXGNvdW50cnlcKQorTUFQX09VVFBVVD0gQzpcdGVtcG91dFwKKyMKKyMgKioqKioqKioqKiBFTkQgT0YgQ09ORklHVVJBVElPTiBGSUxFIEZPUiBNVUxUSSBQQVNTIERPV04tU0FNUExFUiAqKioqKioqKioqCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL05hbWVHZW5lcmF0b3IuY29uZmlnIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vTmFtZUdlbmVyYXRvci5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwMjdhOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL05hbWVHZW5lcmF0b3IuY29uZmlnCkBAIC0wLDAgKzEsMzIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAqKioqKioqKioqIENPTkZJR1VSQVRJT04gRklMRSBGT1IgTkFNRSBHRU5FUkFUT1IgKioqKioqKioqKgorIworIyBUTyBDSEFOR0UgREVGQVVMVCBDT05GSUdVUkFUSU9OIFZBTFVFUywgTU9ESUZZIE9SRy5FQ0xJUFNFLlNURU0uVVRJTElUWS5HRU5FUkFUT1JTXEdlbkNvbnN0YW50cy5qYXZhCisjCisjIENPTkZJR1VSQVRJT04gVkFSSUFCTEVTIFNFVCBJTiBUSElTIEZJTEUgT1ZFUlJJREUgVEhFIERFRkFVTFRTCisjCisjIFRoZSBXT1JLU1BBQ0UgVkFSSUFCTEUgSVMgUkVRVUlSRUQsIEFMTCBPVEhFUiBWQVJJQUJMRVMgQVJFIE9QVElPTkFMIChpLmUuIFdPUktTUEFDRT1DOlxzdGVtSUlcKQorV09SS1NQQUNFPUM6XHN0ZW1JSVwKKyMKKyMgSVNPMzE2Ni0xIGZpbGUgKGkuZS4gSVNPMzE2Nl8xPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTFcSVNPMzE2Nl8xX2xpc3QudHh0KQorI0lTMDMxNjZfMT0KKyMKKyMgSVNPMzE2Ni0yIGZpbGUgKGkuZS4gSVNPMzE2Nl8yPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTJcSVNPMzE2Nl8yX2xpc3QudHh0KQorI0lTTzMxNjZfMj0KKyMKKyMgSVNPIGZpeCAgZmlsZSAoaS5lLiBJU09fRklYPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU09GSVhcSVNPX0ZJWC50eHQpCisjSVNPX0ZJWD0KKyMKKyMgRmlsZSB3aXRoIHRhcmdldCBjb3VudHJpZXMgd2Ugd2FudCB0byBwcm9jZXNzIChpLmUuIFRBUkdFVF9MSVNUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXGdyb3VwZWREYXRhRmlsZXMudHh0KQorI1RBUkdFVF9MSVNUID0KKyMKKyMgUGF0aCB0byBmb2xkZXIgd2l0aCBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgZmlsZXMgKGkuZS4gTEVYX0RJUj1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcc29ydFwpCisjTEVYX0RJUj0KKyMKKyMgT3V0cHV0IGRpcmVjdG9yeSBmb3IgbmV3IGZpbGVzIChpLmUuIFBST1BFUlRJRVNfT1VUUFVUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGFccmVzb3VyY2VzXGRhdGFcY291bnRyeVwpCisjUFJPUEVSVElFU19PVVRQVVQ9IEM6XHRlbXBvdXRcCisjCisjICoqKioqKioqKiogRU5EIE9GIENPTkZJR1VSQVRJT04gRklMRSBGT1IgTkFNRSBHRU5FUkFUT1IgKioqKioqKioqKgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vTm9kZURhdGFHZW5lcmF0b3IuY29uZmlnIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vTm9kZURhdGFHZW5lcmF0b3IuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzN2Y3MTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9Ob2RlRGF0YUdlbmVyYXRvci5jb25maWcKQEAgLTAsMCArMSw0MSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICoqKioqKioqKiogQ09ORklHVVJBVElPTiBGSUxFIEZPUiBOT0RFIERBVEEgR0VORVJBVE9SICoqKioqKioqKioKKyMKKyMgVE8gQ0hBTkdFIERFRkFVTFQgQ09ORklHVVJBVElPTiBWQUxVRVMsIE1PRElGWSBPUkcuRUNMSVBTRS5TVEVNLlVUSUxJVFkuR0VORVJBVE9SU1xHZW5Db25zdGFudHMuamF2YQorIworIyBDT05GSUdVUkFUSU9OIFZBUklBQkxFUyBTRVQgSU4gVEhJUyBGSUxFIE9WRVJSSURFIFRIRSBERUZBVUxUUworIworIyBUaGUgV09SS1NQQUNFIFZBUklBQkxFIElTIFJFUVVJUkVELCBBTEwgT1RIRVIgVkFSSUFCTEVTIEFSRSBPUFRJT05BTCAoaS5lLiBXT1JLU1BBQ0U9Qzpcc3RlbUlJXCkKK1dPUktTUEFDRT1DOlxzdGVtSUlcCisjCisjIElTTzMxNjYtMSBmaWxlIChpLmUuIElTTzMxNjZfMT1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcSVNPMzE2Ni0xXElTTzMxNjZfMV9saXN0LnR4dCkKKyNJUzAzMTY2XzE9CisjCisjIElTTzMxNjYtMiBmaWxlIChpLmUuIElTTzMxNjZfMj1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcSVNPMzE2Ni0yXElTTzMxNjZfMl9saXN0LnR4dCkKKyNJU08zMTY2XzI9CisjCisjIElTTyBmaXggIGZpbGUgKGkuZS4gSVNPX0ZJWD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcSVNPRklYXElTT19GSVgudHh0KQorI0lTT19GSVg9CisjCisjIEZpbGUgd2l0aCB0YXJnZXQgY291bnRyaWVzIHdlIHdhbnQgdG8gcHJvY2VzcyAoaS5lLiBUQVJHRVRfTElTVD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcdGFyZ2V0c1xncm91cGVkRGF0YUZpbGVzLnR4dCkKKyNUQVJHRVRfTElTVCA9CisjCisjIFBvcHVsYXRpb24gcHJvZmlsZSBmb3IgdGhpcyBjb3VudHJ5IChpLmUuIFBPUF9QUk9GSUxFUz1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNccHJvZmlsZXNcKQorI1BPUF9QUk9GSUxFUz0KKyMKKyMgUGF0aCB0byBhcmVhcyBpbiBwb2x5Z29uIHVuaXRzIC0gdXNlZCBvbmx5IGZvciBjb21wdXRpbmcgYXBwcm94aW1hdGUgYXJlYSBvZiBsZXZlbCAyIHJlZ2lvbnMgKGkuZS4gUE9MWUdPTl9BUkVBUz1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcUG9seWdvbkFyZWFzXCkKKyNQT0xZR09OX0FSRUFTPQorIworIyBQYXRoIHRvIGFyZWEgYW5kIHBvcHVsYXRpb24gZmlsZXMgKGkuZS4gQVJFQV9QT1A9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXEFyZWFQb3B1bGF0aW9uRGF0YVwpCisjQVJFQV9QT1A9CisjCisjIFBhdGggdG8gZm9sZGVyIHdpdGggbGV4aWNvZ3JhcGhpY2FsbHkgc29ydGVkIGZpbGVzIChpLmUuIExFWF9ESVI9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXHNvcnRcKQorI0xFWF9ESVI9CisjCisjIE91dHB1dCBkaXJlY3RvcnkgZm9yIG5ldyBmaWxlcyAoaS5lLiBQUk9QRVJUSUVTX09VVFBVVD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhXHJlc291cmNlc1xkYXRhXGNvdW50cnlcKQorUFJPUEVSVElFU19PVVRQVVQ9IEM6XHRlbXBvdXRcCisjCisjICoqKioqKioqKiogRU5EIE9GIENPTkZJR1VSQVRJT04gRklMRSBGT1IgTk9ERSBEQVRBIEdFTkVSQVRPUiAqKioqKioqKioqCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9Qb2x5Z29uQXJlYUdlbmVyYXRvci5jb25maWcgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9Qb2x5Z29uQXJlYUdlbmVyYXRvci5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxZGJhZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL1BvbHlnb25BcmVhR2VuZXJhdG9yLmNvbmZpZwpAQCAtMCwwICsxLDQxIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgKioqKioqKioqKiBDT05GSUdVUkFUSU9OIEZJTEUgRk9SIFBPTFlHT04gQVJFQSBHRU5FUkFUT1IgKioqKioqKioqKgorIworIyBUTyBDSEFOR0UgREVGQVVMVCBDT05GSUdVUkFUSU9OIFZBTFVFUywgTU9ESUZZIE9SRy5FQ0xJUFNFLlNURU0uVVRJTElUWS5HRU5FUkFUT1JTXEdlbkNvbnN0YW50cy5qYXZhCisjCisjIENPTkZJR1VSQVRJT04gVkFSSUFCTEVTIFNFVCBJTiBUSElTIEZJTEUgT1ZFUlJJREUgVEhFIERFRkFVTFRTCisjCisjIFRoZSBXT1JLU1BBQ0UgVkFSSUFCTEUgSVMgUkVRVUlSRUQsIEFMTCBPVEhFUiBWQVJJQUJMRVMgQVJFIE9QVElPTkFMIChpLmUuIFdPUktTUEFDRT1DOlxzdGVtSUlcKQorV09SS1NQQUNFPUM6XHN0ZW1JSVwKKyMKKyMgSVNPMzE2Ni0xIGZpbGUgKGkuZS4gSVNPMzE2Nl8xPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTFcSVNPMzE2Nl8xX2xpc3QudHh0KQorI0lTMDMxNjZfMT0KKyMKKyMgSVNPMzE2Ni0yIGZpbGUgKGkuZS4gSVNPMzE2Nl8yPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTJcSVNPMzE2Nl8yX2xpc3QudHh0KQorI0lTTzMxNjZfMj0KKyMKKyMgSVNPIGZpeCAgZmlsZSAoaS5lLiBJU09fRklYPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU09GSVhcSVNPX0ZJWC50eHQpCisjSVNPX0ZJWD0KKyMKKyMgRmlsZSB3aXRoIHRhcmdldCBjb3VudHJpZXMgd2Ugd2FudCB0byBwcm9jZXNzIChpLmUuIFRBUkdFVF9MSVNUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXGdyb3VwZWREYXRhRmlsZXMudHh0KQorI1RBUkdFVF9MSVNUID0KKyMKKyMgUG9wdWxhdGlvbiBwcm9maWxlIGZvciB0aGlzIGNvdW50cnkgKGkuZS4gUE9QX1BST0ZJTEVTPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xwcm9maWxlc1wpCisjUE9QX1BST0ZJTEVTPQorIworIyBQYXRoIHRvIGFyZWFzIGluIHBvbHlnb24gdW5pdHMgLSB1c2VkIG9ubHkgZm9yIGNvbXB1dGluZyBhcHByb3hpbWF0ZSBhcmVhIG9mIGxldmVsIDIgcmVnaW9ucyAoaS5lLiBQT0xZR09OX0FSRUFTPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xQb2x5Z29uQXJlYXNcKQorI1BPTFlHT05fQVJFQVM9CisjCisjIFBhdGggdG8gYXJlYSBhbmQgcG9wdWxhdGlvbiBmaWxlcyAoaS5lLiBBUkVBX1BPUD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcQXJlYVBvcHVsYXRpb25EYXRhXCkKKyNBUkVBX1BPUD0KKyMKKyMgUGF0aCB0byBmb2xkZXIgd2l0aCBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgZmlsZXMgKGkuZS4gTEVYX0RJUj1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcc29ydFwpCisjTEVYX0RJUj0KKyMKKyMgT3V0cHV0IGRpcmVjdG9yeSBmb3IgbmV3IGZpbGVzIChpLmUuIE9VVFBVVD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhXHBhcmFtZXRlcnNcUG9seWdvbkFyZWFzXCkKK09VVFBVVD0gQzpcdGVtcG91dFwKKyMKKyMgKioqKioqKioqKiBFTkQgT0YgQ09ORklHVVJBVElPTiBGSUxFIEZPUiBQT0xZR09OIEFSRUEgR0VORVJBVE9SICoqKioqKioqKioKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL1BvcHVsYXRpb25HZW5lcmF0b3IuY29uZmlnIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vUG9wdWxhdGlvbkdlbmVyYXRvci5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJlY2I4MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL1BvcHVsYXRpb25HZW5lcmF0b3IuY29uZmlnCkBAIC0wLDAgKzEsNDEgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAqKioqKioqKioqIENPTkZJR1VSQVRJT04gRklMRSBGT1IgUE9QVUxBVElPTiBHRU5FUkFUT1IgKioqKioqKioqKgorIworIyBUTyBDSEFOR0UgREVGQVVMVCBDT05GSUdVUkFUSU9OIFZBTFVFUywgTU9ESUZZIE9SRy5FQ0xJUFNFLlNURU0uVVRJTElUWS5HRU5FUkFUT1JTXEdlbkNvbnN0YW50cy5qYXZhCisjCisjIENPTkZJR1VSQVRJT04gVkFSSUFCTEVTIFNFVCBJTiBUSElTIEZJTEUgT1ZFUlJJREUgVEhFIERFRkFVTFRTCisjCisjIFRoZSBXT1JLU1BBQ0UgVkFSSUFCTEUgSVMgUkVRVUlSRUQsIEFMTCBPVEhFUiBWQVJJQUJMRVMgQVJFIE9QVElPTkFMIChpLmUuIFdPUktTUEFDRT1DOlxzdGVtSUlcKQorV09SS1NQQUNFPUM6XHN0ZW1JSVwKKyMKKyMgSVNPMzE2Ni0xIGZpbGUgKGkuZS4gSVNPMzE2Nl8xPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTFcSVNPMzE2Nl8xX2xpc3QudHh0KQorI0lTMDMxNjZfMT0KKyMKKyMgSVNPMzE2Ni0yIGZpbGUgKGkuZS4gSVNPMzE2Nl8yPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTJcSVNPMzE2Nl8yX2xpc3QudHh0KQorI0lTTzMxNjZfMj0KKyMKKyMgSVNPIGZpeCAgZmlsZSAoaS5lLiBJU09fRklYPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU09GSVhcSVNPX0ZJWC50eHQpCisjSVNPX0ZJWD0KKyMKKyMgRmlsZSB3aXRoIHRhcmdldCBjb3VudHJpZXMgd2Ugd2FudCB0byBwcm9jZXNzIChpLmUuIFRBUkdFVF9MSVNUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXGdyb3VwZWREYXRhRmlsZXMudHh0KQorI1RBUkdFVF9MSVNUID0KKyMKKyMgUG9wdWxhdGlvbiBwcm9maWxlIGZvciB0aGlzIGNvdW50cnkgKGkuZS4gUE9QX1BST0ZJTEVTPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xwcm9maWxlc1wpCisjUE9QX1BST0ZJTEVTPQorIworIyBQYXRoIHRvIGFyZWFzIGluIHBvbHlnb24gdW5pdHMgLSB1c2VkIG9ubHkgZm9yIGNvbXB1dGluZyBhcHByb3hpbWF0ZSBhcmVhIG9mIGxldmVsIDIgcmVnaW9ucyAoaS5lLiBQT0xZR09OX0FSRUFTPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xQb2x5Z29uQXJlYXNcKQorI1BPTFlHT05fQVJFQVM9CisjCisjIFBhdGggdG8gYXJlYSBhbmQgcG9wdWxhdGlvbiBmaWxlcyAoaS5lLiBBUkVBX1BPUD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcQXJlYVBvcHVsYXRpb25EYXRhXCkKKyNBUkVBX1BPUD0KKyMKKyMgUGF0aCB0byBmb2xkZXIgd2l0aCBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgZmlsZXMgKGkuZS4gTEVYX0RJUj1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcc29ydFwpCisjTEVYX0RJUj0KKyMKKyMgT3V0cHV0IGRpcmVjdG9yeSBmb3IgbmV3IGZpbGVzIChpLmUuIFBST1BFUlRJRVNfT1VUUFVUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGFccmVzb3VyY2VzXGRhdGFcY291bnRyeVwpCitQUk9QRVJUSUVTX09VVFBVVD0gQzpcdGVtcG91dFwKKyMKKyMgKioqKioqKioqKiBFTkQgT0YgQ09ORklHVVJBVElPTiBGSUxFIEZPUiBQT1BVTEFUSU9OIEdFTkVSQVRPUiAqKioqKioqKioqCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9Qb3B1bGF0aW9uUHJvZmlsZXIuY29uZmlnIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vUG9wdWxhdGlvblByb2ZpbGVyLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDBkMzdkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vUG9wdWxhdGlvblByb2ZpbGVyLmNvbmZpZwpAQCAtMCwwICsxLDQxIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgKioqKioqKioqKiBDT05GSUdVUkFUSU9OIEZJTEUgRk9SIFBPUFVMQVRJT04gUFJPRklMRVIgKioqKioqKioqKgorIworIyBUTyBDSEFOR0UgREVGQVVMVCBDT05GSUdVUkFUSU9OIFZBTFVFUywgTU9ESUZZIE9SRy5FQ0xJUFNFLlNURU0uVVRJTElUWS5HRU5FUkFUT1JTXEdlbkNvbnN0YW50cy5qYXZhCisjCisjIENPTkZJR1VSQVRJT04gVkFSSUFCTEVTIFNFVCBJTiBUSElTIEZJTEUgT1ZFUlJJREUgVEhFIERFRkFVTFRTCisjCisjIFRoZSBXT1JLU1BBQ0UgVkFSSUFCTEUgSVMgUkVRVUlSRUQsIEFMTCBPVEhFUiBWQVJJQUJMRVMgQVJFIE9QVElPTkFMIChpLmUuIFdPUktTUEFDRT1DOlxzdGVtSUlcKQorV09SS1NQQUNFPUM6XHN0ZW1JSVwKKyMKKyMgSVNPMzE2Ni0xIGZpbGUgKGkuZS4gSVNPMzE2Nl8xPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTFcSVNPMzE2Nl8xX2xpc3QudHh0KQorI0lTMDMxNjZfMT0KKyMKKyMgSVNPMzE2Ni0yIGZpbGUgKGkuZS4gSVNPMzE2Nl8yPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTJcSVNPMzE2Nl8yX2xpc3QudHh0KQorI0lTTzMxNjZfMj0KKyMKKyMgSVNPIGZpeCAgZmlsZSAoaS5lLiBJU09fRklYPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU09GSVhcSVNPX0ZJWC50eHQpCisjSVNPX0ZJWD0KKyMKKyMgRmlsZSB3aXRoIHRhcmdldCBjb3VudHJpZXMgd2Ugd2FudCB0byBwcm9jZXNzIChpLmUuIFRBUkdFVF9MSVNUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXGdyb3VwZWREYXRhRmlsZXMudHh0KQorI1RBUkdFVF9MSVNUID0KKyMKKyMgUG9wdWxhdGlvbiBwcm9maWxlIGZvciB0aGlzIGNvdW50cnkgKGkuZS4gUE9QX1BST0ZJTEVTPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xwcm9maWxlc1wpCisjUE9QX1BST0ZJTEVTPQorIworIyBQYXRoIHRvIGFyZWFzIGluIHBvbHlnb24gdW5pdHMgLSB1c2VkIG9ubHkgZm9yIGNvbXB1dGluZyBhcHByb3hpbWF0ZSBhcmVhIG9mIGxldmVsIDIgcmVnaW9ucyAoaS5lLiBQT0xZR09OX0FSRUFTPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xQb2x5Z29uQXJlYXNcKQorI1BPTFlHT05fQVJFQVM9CisjCisjIFBhdGggdG8gYXJlYSBhbmQgcG9wdWxhdGlvbiBmaWxlcyAoaS5lLiBBUkVBX1BPUD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcQXJlYVBvcHVsYXRpb25EYXRhXCkKKyNBUkVBX1BPUD0KKyMKKyMgUGF0aCB0byBmb2xkZXIgd2l0aCBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgZmlsZXMgKGkuZS4gTEVYX0RJUj1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcc29ydFwpCisjTEVYX0RJUj0KKyMKKyMgT3V0cHV0IGRpcmVjdG9yeSBmb3IgbmV3IGZpbGVzIChpLmUuIFBST1BFUlRJRVNfT1VUUFVUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGFccmVzb3VyY2VzXGRhdGFcY291bnRyeVwpCitQUk9QRVJUSUVTX09VVFBVVD0gQzpcdGVtcG91dFwKKyMKKyMgKioqKioqKioqKiBFTkQgT0YgQ09ORklHVVJBVElPTiBGSUxFIEZPUiBQT1BVTEFUSU9OIFBST0ZJTEVSICoqKioqKioqKioKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL1Byb3BlcnRpZXNHZW5lcmF0b3IuY29uZmlnIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vUHJvcGVydGllc0dlbmVyYXRvci5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwMTRmMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL1Byb3BlcnRpZXNHZW5lcmF0b3IuY29uZmlnCkBAIC0wLDAgKzEsNDQgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAqKioqKioqKioqIENPTkZJR1VSQVRJT04gRklMRSBGT1IgUFJPUEVSVElFUyBHRU5FUkFUT1IgKioqKioqKioqKgorIworIyBUTyBDSEFOR0UgREVGQVVMVCBDT05GSUdVUkFUSU9OIFZBTFVFUywgTU9ESUZZIE9SRy5FQ0xJUFNFLlNURU0uVVRJTElUWS5HRU5FUkFUT1JTXEdlbkNvbnN0YW50cy5qYXZhCisjCisjIENPTkZJR1VSQVRJT04gVkFSSUFCTEVTIFNFVCBJTiBUSElTIEZJTEUgT1ZFUlJJREUgVEhFIERFRkFVTFRTCisjCisjIFRoZSBXT1JLU1BBQ0UgVkFSSUFCTEUgSVMgUkVRVUlSRUQsIEFMTCBPVEhFUiBWQVJJQUJMRVMgQVJFIE9QVElPTkFMIChpLmUuIFdPUktTUEFDRT1DOlxzdGVtSUlcKQorV09SS1NQQUNFPUM6XHN0ZW1JSVwKKyMKKyMgSVNPMzE2Ni0xIGZpbGUgKGkuZS4gSVNPMzE2Nl8xPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTFcSVNPMzE2Nl8xX2xpc3QudHh0KQorI0lTMDMxNjZfMT0KKyMKKyMgSVNPMzE2Ni0yIGZpbGUgKGkuZS4gSVNPMzE2Nl8yPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTJcSVNPMzE2Nl8yX2xpc3QudHh0KQorI0lTTzMxNjZfMj0KKyMKKyMgSVNPIGZpeCAgZmlsZSAoaS5lLiBJU09fRklYPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU09GSVhcSVNPX0ZJWC50eHQpCisjSVNPX0ZJWD0KKyMKKyMgRmlsZSB3aXRoIHRhcmdldCBjb3VudHJpZXMgd2Ugd2FudCB0byBwcm9jZXNzIChpLmUuIFRBUkdFVF9MSVNUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXGdyb3VwZWREYXRhRmlsZXMudHh0KQorI1RBUkdFVF9MSVNUID0KKyMKKyMgUG9wdWxhdGlvbiBwcm9maWxlIGZvciB0aGlzIGNvdW50cnkgKGkuZS4gUE9QX1BST0ZJTEVTPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xwcm9maWxlc1wpCisjUE9QX1BST0ZJTEVTPQorIworIyBQYXRoIHRvIGFyZWFzIGluIHBvbHlnb24gdW5pdHMgLSB1c2VkIG9ubHkgZm9yIGNvbXB1dGluZyBhcHByb3hpbWF0ZSBhcmVhIG9mIGxldmVsIDIgcmVnaW9ucyAoaS5lLiBQT0xZR09OX0FSRUFTPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xQb2x5Z29uQXJlYXNcKQorI1BPTFlHT05fQVJFQVM9CisjCisjIFBhdGggdG8gYXJlYSBhbmQgcG9wdWxhdGlvbiBmaWxlcyAoaS5lLiBBUkVBX1BPUD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcQXJlYVBvcHVsYXRpb25EYXRhXCkKKyNBUkVBX1BPUD0KKyMKKyMgUGF0aCB0byBmb2xkZXIgd2l0aCBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgZmlsZXMgKGkuZS4gTEVYX0RJUj1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcc29ydFwpCisjTEVYX0RJUj0KKyMKKyMgT3V0cHV0IGRpcmVjdG9yeSBmb3IgbmV3IGZpbGVzIChpLmUuIFBST1BFUlRJRVNfT1VUUFVUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGFccmVzb3VyY2VzXGRhdGFcY291bnRyeVwpCitQUk9QRVJUSUVTX09VVFBVVD0gQzpcdGVtcG91dFwKKyMKKyMgT3V0cHV0IGRpcmVjdG9yeSBmb3IgbmV3IGZpbGVzIChpLmUuIE1BUF9PVVRQVVQ9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5XHJlc291cmNlc1xkYXRhXGdlb1xjb3VudHJ5XCkKK01BUF9PVVRQVVQ9IEM6XHRlbXBvdXRcCisjCisjICoqKioqKioqKiogRU5EIE9GIENPTkZJR1VSQVRJT04gRklMRSBGT1IgUFJPUEVSVElFUyBHRU5FUkFUT1IgKioqKioqKioqKgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vUnVzc2lhRGF0YUNsZWFuZXIuY29uZmlnIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vUnVzc2lhRGF0YUNsZWFuZXIuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MzZhZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9SdXNzaWFEYXRhQ2xlYW5lci5jb25maWcKQEAgLTAsMCArMSwyMCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICoqKioqKioqKiogQ09ORklHVVJBVElPTiBGSUxFIFJVU1NJQSBEQVRBIENMRUFORVIgKioqKioqKioqKgorIworIyBUTyBDSEFOR0UgREVGQVVMVCBDT05GSUdVUkFUSU9OIFZBTFVFUywgTU9ESUZZIE9SRy5FQ0xJUFNFLlNURU0uVVRJTElUWS5HRU5FUkFUT1JTXEdlbkNvbnN0YW50cy5qYXZhCisjCisjIENPTkZJR1VSQVRJT04gVkFSSUFCTEVTIFNFVCBJTiBUSElTIEZJTEUgT1ZFUlJJREUgVEhFIERFRkFVTFRTCisjCisjIFRoZSBXT1JLU1BBQ0UgVkFSSUFCTEUgSVMgUkVRVUlSRUQsIEFMTCBPVEhFUiBWQVJJQUJMRVMgQVJFIE9QVElPTkFMIChpLmUuIFdPUktTUEFDRT1DOlxzdGVtSUlcKQorV09SS1NQQUNFPUM6XHN0ZW1JSVwKKyMKKyMgRmlsZSB3aXRoIHRhcmdldCBjb3VudHJpZXMgd2Ugd2FudCB0byBwcm9jZXNzIChpLmUuIFRBUkdFVF9MSVNUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXEV1cm9wZUNvdW50cmllcy50eHQpCitUQVJHRVRfTElTVCA9IEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXEV1cm9wZUNvdW50cmllcy50eHQKKyMKKyMgT3V0cHV0IGRpcmVjdG9yeSBmb3IgbmV3IGZpbGVzIChpLmUuIE9VVFBVVD1DOlxFdXJvcGVEYXRhMjAwN1xSdXNzaWFcKQorT1VUUFVUID0gQzpcRXVyb3BlRGF0YTIwMDdcUnVzc2lhXAorIworIyAqKioqKioqKioqIEVORCBPRiBDT05GSUdVUkFUSU9OIEZJTEUgRk9SIFJVU1NJQSBEQVRBIENMRUFORVIgKioqKioqKioqKgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vUnVzc2lhRGF0YUNvbnZlcnRlci5jb25maWcgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9SdXNzaWFEYXRhQ29udmVydGVyLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWFmNmU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vUnVzc2lhRGF0YUNvbnZlcnRlci5jb25maWcKQEAgLTAsMCArMSwyMyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICoqKioqKioqKiogQ09ORklHVVJBVElPTiBGSUxFIEZPUiBSVVNTSUEgREFUQSBDT05WRVJURVIgKioqKioqKioqKgorIworIyBUTyBDSEFOR0UgREVGQVVMVCBDT05GSUdVUkFUSU9OIFZBTFVFUywgTU9ESUZZIE9SRy5FQ0xJUFNFLlNURU0uVVRJTElUWS5HRU5FUkFUT1JTXEdlbkNvbnN0YW50cy5qYXZhCisjCisjIENPTkZJR1VSQVRJT04gVkFSSUFCTEVTIFNFVCBJTiBUSElTIEZJTEUgT1ZFUlJJREUgVEhFIERFRkFVTFRTCisjCisjIFRoZSBXT1JLU1BBQ0UgVkFSSUFCTEUgSVMgUkVRVUlSRUQsIEFMTCBPVEhFUiBWQVJJQUJMRVMgQVJFIE9QVElPTkFMIChpLmUuIFdPUktTUEFDRT1DOlxzdGVtSUlcKQorV09SS1NQQUNFPUM6XHN0ZW1JSVwKKyMKKyMgSVNPMzE2Ni0xIGZpbGUgKGkuZS4gSVNPMzE2Nl8xPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xJU08zMTY2LTFcSVNPMzE2Nl8xX2xpc3QudHh0KQorI0lTMDMxNjZfMT0KKyMKKyMgRmlsZSB3aXRoIHRhcmdldCBjb3VudHJpZXMgd2Ugd2FudCB0byBwcm9jZXNzIChpLmUuIFRBUkdFVF9MSVNUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXEV1cm9wZUNvdW50cmllcy50eHQpCitUQVJHRVRfTElTVCA9IEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXEV1cm9wZUNvdW50cmllcy50eHQKKyMKKyMgT3V0cHV0IGRpcmVjdG9yeSBmb3IgbmV3IGZpbGVzIChpLmUuIE9VVFBVVD1DOlxkaXZhXEV1cm9wZSkKK09VVFBVVCA9IEM6XGRpdmFcRXVyb3BlCisjCisjICoqKioqKioqKiogRU5EIE9GIENPTkZJR1VSQVRJT04gRklMRSBGT1IgUlVTU0lBIERBVEEgQ09OVkVSVEVSICoqKioqKioqKioKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL1J1c3NpYURhdGFFeHRyYWN0b3IuY29uZmlnIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vUnVzc2lhRGF0YUV4dHJhY3Rvci5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiM2VjMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL1J1c3NpYURhdGFFeHRyYWN0b3IuY29uZmlnCkBAIC0wLDAgKzEsMjMgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAqKioqKioqKioqIENPTkZJR1VSQVRJT04gRklMRSBGT1IgUlVTU0lBIERBVEEgRVhUUkFDVE9SICoqKioqKioqKioKKyMKKyMgVE8gQ0hBTkdFIERFRkFVTFQgQ09ORklHVVJBVElPTiBWQUxVRVMsIE1PRElGWSBPUkcuRUNMSVBTRS5TVEVNLlVUSUxJVFkuR0VORVJBVE9SU1xHZW5Db25zdGFudHMuamF2YQorIworIyBDT05GSUdVUkFUSU9OIFZBUklBQkxFUyBTRVQgSU4gVEhJUyBGSUxFIE9WRVJSSURFIFRIRSBERUZBVUxUUworIworIyBUaGUgV09SS1NQQUNFIFZBUklBQkxFIElTIFJFUVVJUkVELCBBTEwgT1RIRVIgVkFSSUFCTEVTIEFSRSBPUFRJT05BTCAoaS5lLiBXT1JLU1BBQ0U9Qzpcc3RlbUlJXCkKK1dPUktTUEFDRT1DOlxzdGVtSUlcCisjCisjIElTTzMxNjYtMSBmaWxlIChpLmUuIElTTzMxNjZfMT1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcSVNPMzE2Ni0xXElTTzMxNjZfMV9saXN0LnR4dCkKKyNJUzAzMTY2XzE9CisjCisjIEZpbGUgd2l0aCB0YXJnZXQgY291bnRyaWVzIHdlIHdhbnQgdG8gcHJvY2VzcyAoaS5lLiBUQVJHRVRfTElTVD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcdGFyZ2V0c1xFdXJvcGVDb3VudHJpZXMudHh0KQorVEFSR0VUX0xJU1QgPSBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcdGFyZ2V0c1xFdXJvcGVDb3VudHJpZXMudHh0CisjCisjIE91dHB1dCBkaXJlY3RvcnkgZm9yIG5ldyBmaWxlcyAoaS5lLiBPVVRQVVQ9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXEFyZWFQb3B1bGF0aW9uRGF0YVwpCitPVVRQVVQgPSBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcQXJlYVBvcHVsYXRpb25EYXRhXAorIworIyAqKioqKioqKioqIEVORCBPRiBDT05GSUdVUkFUSU9OIEZJTEUgRk9SIFJVU1NJQSBEQVRBIEVYVFJBQ1RPUiAqKioqKioqKioqCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9TaW5nbGVQYXNzRG93blNhbXBsZXIuY29uZmlnIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vU2luZ2xlUGFzc0Rvd25TYW1wbGVyLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTU0MjJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vU2luZ2xlUGFzc0Rvd25TYW1wbGVyLmNvbmZpZwpAQCAtMCwwICsxLDM1IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgKioqKioqKioqKiBDT05GSUdVUkFUSU9OIEZJTEUgRk9SIFNJTkdMRSBQQVNTIERPV04tU0FNUExFUiAqKioqKioqKioqCisjCisjIFRPIENIQU5HRSBERUZBVUxUIENPTkZJR1VSQVRJT04gVkFMVUVTLCBNT0RJRlkgT1JHLkVDTElQU0UuU1RFTS5VVElMSVRZLkdFTkVSQVRPUlNcR2VuQ29uc3RhbnRzLmphdmEKKyMKKyMgQ09ORklHVVJBVElPTiBWQVJJQUJMRVMgU0VUIElOIFRISVMgRklMRSBPVkVSUklERSBUSEUgREVGQVVMVFMKKyMKKyMgVGhlIFdPUktTUEFDRSBWQVJJQUJMRSBJUyBSRVFVSVJFRCwgQUxMIE9USEVSIFZBUklBQkxFUyBBUkUgT1BUSU9OQUwgKGkuZS4gV09SS1NQQUNFPUM6XHN0ZW1JSVwpCitXT1JLU1BBQ0U9Qzpcc3RlbUlJXAorIworIyBUaGUgVEhSRVNIT0xEIHZhcmlhYmxlIHNwZWNpZmllcyBhbiBhbmdsZSBpbiBkZWdyZWVzIGZvciB3aGljaCB3ZSB3YW50IHRvIHJlZHVjZS4gSWYgbm90IHByb3ZpZGVkIGl0IGRlZmF1bHRzIHRvIDUgZGVncmVlcy4KKyNUSFJFU0hPTEQ9NQorIworIyBJU08zMTY2LTEgZmlsZSAoaS5lLiBJU08zMTY2XzE9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXElTTzMxNjYtMVxJU08zMTY2XzFfbGlzdC50eHQpCisjSVMwMzE2Nl8xPQorIworIyBJU08zMTY2LTIgZmlsZSAoaS5lLiBJU08zMTY2XzI9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXElTTzMxNjYtMlxJU08zMTY2XzJfbGlzdC50eHQpCisjSVNPMzE2Nl8yPQorIworIyBJU08gZml4ICBmaWxlIChpLmUuIElTT19GSVg9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXElTT0ZJWFxJU09fRklYLnR4dCkKKyNJU09fRklYPQorIworIyBGaWxlIHdpdGggdGFyZ2V0IGNvdW50cmllcyB3ZSB3YW50IHRvIHByb2Nlc3MgKGkuZS4gVEFSR0VUX0xJU1Q9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXHRhcmdldHNcZ3JvdXBlZERhdGFGaWxlcy50eHQpCitUQVJHRVRfTElTVCA9IEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXENvdW50cmllc0xpZ2h0LnR4dAorIworIyBQYXRoIHRvIGZvbGRlciB3aXRoIGxleGljb2dyYXBoaWNhbGx5IHNvcnRlZCBmaWxlcyAoaS5lLiBMRVhfRElSPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1xzb3J0XCkKKyNMRVhfRElSPQorIworIyBPdXRwdXQgZGlyZWN0b3J5IGZvciBuZXcgZmlsZXMgKGkuZS4gTUFQX09VVFBVVD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHlccmVzb3VyY2VzXGRhdGFcZ2VvXGNvdW50cnlcKQorTUFQX09VVFBVVD0gQzpcdGVtcG91dFwKKyMKKyMgKioqKioqKioqKiBFTkQgT0YgQ09ORklHVVJBVElPTiBGSUxFIEZPUiBTSU5HTEUgUEFTUyBET1dOLVNBTVBMRVIgKioqKioqKioqKgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9VU0EyRGl2YUZvcm1hdENvbnZlcnRlci5jb25maWcgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9VU0EyRGl2YUZvcm1hdENvbnZlcnRlci5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmNzkxNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL1VTQTJEaXZhRm9ybWF0Q29udmVydGVyLmNvbmZpZwpAQCAtMCwwICsxLDIzIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgKioqKioqKioqKiBDT05GSUdVUkFUSU9OIEZJTEUgRk9SIEVVUk9QRSBVU0EgVE8gRElWQSBGT1JNQVQgQ09OVkVSVEVSICoqKioqKioqKioKKyMKKyMgVE8gQ0hBTkdFIERFRkFVTFQgQ09ORklHVVJBVElPTiBWQUxVRVMsIE1PRElGWSBPUkcuRUNMSVBTRS5TVEVNLlVUSUxJVFkuR0VORVJBVE9SU1xHZW5Db25zdGFudHMuamF2YQorIworIyBDT05GSUdVUkFUSU9OIFZBUklBQkxFUyBTRVQgSU4gVEhJUyBGSUxFIE9WRVJSSURFIFRIRSBERUZBVUxUUworIworIyBUaGUgV09SS1NQQUNFIFZBUklBQkxFIElTIFJFUVVJUkVELCBBTEwgT1RIRVIgVkFSSUFCTEVTIEFSRSBPUFRJT05BTCAoaS5lLiBXT1JLU1BBQ0U9Qzpcc3RlbUlJXCkKK1dPUktTUEFDRT1DOlxzdGVtSUlcCisjCisjIE5hbWVzIGZpbGUgKGkuZS4gTkFNRVNfTElTVD1DOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcVVNBX0wxX0RhdGFcVVNBX0wxLnR4dCkKK05BTUVTX0xJU1Q9Qzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxwYXJhbWV0ZXJzXFVTQV9MMV9EYXRhXFVTQV9MMS50eHQKKyMKKyMgRmlsZSB3aXRoIHRhcmdldCBjb3VudHJpZXMgd2Ugd2FudCB0byBwcm9jZXNzIChpLmUuIFRBUkdFVF9MSVNUPUM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlccGFyYW1ldGVyc1x0YXJnZXRzXGZvcm1hdExpc3QudHh0KQorVEFSR0VUX0xJU1QgPSBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHBhcmFtZXRlcnNcdGFyZ2V0c1xmb3JtYXRMaXN0LnR4dAorIworIyBPdXRwdXQgZGlyZWN0b3J5IGZvciBuZXcgZmlsZXMgKGkuZS4gT1VUUFVUPUM6XGRpdmFcTm9ydGhBbWVyaWNhXFVTQVwpCitPVVRQVVQgPSBDOlxkaXZhXE5vcnRoQW1lcmljYVxVU0FcCisjCisjICoqKioqKioqKiogRU5EIE9GIENPTkZJR1VSQVRJT04gRklMRSBGT1IgVVNBIFRPIERJVkEgRk9STUFUIENPTlZFUlRFUioqKioqKioqKioKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9kb2NzL0FuIEludHJvZHVjdGlvbiBUbyBTVEVNIElJIFByb3BlcnRpZXMgRmlsZXMudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2RvY3MvQW4gSW50cm9kdWN0aW9uIFRvIFNURU0gSUkgUHJvcGVydGllcyBGaWxlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUyNWFlYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9kb2NzL0FuIEludHJvZHVjdGlvbiBUbyBTVEVNIElJIFByb3BlcnRpZXMgRmlsZXMudHh0CkBAIC0wLDAgKzEsOTQgQEAKKworSmFuIC0gMTAgLSAyMDA3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKypBbiBJbnRyb2R1Y3Rpb24gdG8gU1RFTSdzIFByb3BlcnRpZXMgRmlsZXMqCisKKyAgIEluIFNURU0gSUksIHdlIHN0b3JlIGRhdGEgYWJvdXQgYSBjb3VudHJ5IGFuZCBpdHMgYWRtaW5pc3RyYXRpdmUgZGl2aXNpb25zIGluIHByb3BlcnRpZXMgZmlsZXMuIFByb3BlcnRpZXMgZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGlkZW50aWZpZXJzIGFuZCB0byBzZXQgcG9wdWxhdGlvbiBhbmQgYXJlYSBkYXRhCithdCBhbGwgbGV2ZWxzIChpLmUuIGNvdW50cnksIHN0YXRlLCBvciBjb3VudHkgbGV2ZWwpLiBUaGVyZSBhcmUgZm91ciBtYWluIHR5cGVzIG9mIHByb3BlcnRpZXMgZmlsZXMgOiBhcmVhLCBwb3B1bGF0aW9uLCBub2RlcywgYW5kIG5hbWVzLiBUaGUgcHVycG9zZSBvZiBlYWNoIHByb3BlcnR5IGZpbGUgd2lsbCBiZQorZXhwbGFpbmVkIGxhdGVyLgorCisgICBJbiBTVEVNIElJLCBtb3N0IG9mIHRoZSBkYXRhIGlzIHN0YW5kYXJkaXplZCBJU08gMzE2NiBvciBGSVBTIChGZWRlcmFsIEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgU3RhbnRhbmRhcmRzKSBkYXRhLiBBY2NvcmRpbmcgdG8gV2lraXBlZGlhLCAiSVNPIDMxNjYgaXMgYSB0aHJlZS1wYXJ0IGdlb2dyYXBoaWMgY29kaW5nIHN0YW5kYXJkIGZvciAKK2NvZGluZyB0aGUgbmFtZXMgb2YgY291bnRyaWVzIGFuZCBkZXBlbmRlbnQgYXJlYXMsIGFuZCB0aGUgcHJpbmNpcGFsIHN1YmRpdmlzaW9ucyB0aGVyZW9mLiIgSVNPIDMxNjYgc3BlY2lmaWVzIHN0YW5kYXJkIGFscGhhLTIgY29kZXMsIGFscGhhLTMgY29kZXMsIGFuZCB0aHJlZS1kaWdpdCBjb3VudHJ5IGNvZGVzIGFzIHdlbGwuIEZvciBleGFtcGxlLAorZm9yIHRoZSBVU0EsIHRoZSBhbHBoYS0yIGNvZGUgd291bGQgYmUgVVMsIHRoZSBhbHBoYS0zIGNvZGUgaXMgVVNBICwgYW5kIHRoZSB0aHJlZS1kaWdpdCBjb3VudHJ5IGNvZGUgaXMgODQwLiBJbiBhZGRpdHRpb24sIHdlIHVzZSBGSVBTIGNvZGVzIHdoZW5ldmVyIHBvc3NpYmxlIHRvIGNyZWF0ZSBpZGVudGlmaWVycyB0aGF0IHJlcHJlc2VudCBhIAorcG9saXRpY2FsIGFkbWluaXN0cmF0aW9uLiBGb3IgaW5zdGFuY2UsIHRoZSBGSVBTIGZvciBOZXcgWW9yayBDb3VudHkgKGkuZS4sIE1hbmhhdHRhbikgaXMgMzYwNjEgd2hpbGUgS2luZ3MgQ291bnR5IChpLmUuLCBCcm9va2x5bikgaXMgMzYwNDcuIFRoZSBmaXJzdCB0d28gZGlnaXRzIG9mIHRoZSBGSVBTIGlkZW50aWZpZXMgdGhlIHN0YXRlLiAgCisKKyoqQWRtaW5pc3RyYXRpdmUgTGV2ZWxzIGFuZCBQcm9wZXJ0aWVzIEZpbGVzKioKKworICAgQWRtaW5pc3RyYXRpdmUgbGV2ZWxzIGNvcnJlc3BvbmQgdG8gcG9saXRpY2FsIGRpdmlzaW9ucyBvZiBhIGNvdW50cnkuIEEgbGV2ZWwgMCBhZG1pbmlzdHJhdGlvbiBpZGVudGlmaWVzIGFuIGVudGlyZSBjb3VudHJ5IChlLmcuIFVTQSBvciBNZXhpY28pLiBBIGxldmVsIDEgYWRtaW5pc3RyYXRpb24gY29ycmVzcG9uZHMgdG8gYSBzdWJkaXZpc2lvbiBvZiBhIGNvdW50cnkKK3doaWNoIGNhbiBiZSBhIHN0YXRlLCB0ZXJyaXRvcnksIHBhcmlzaCwgb3IgYSBwcm92aW5jZS4gQXMgYW4gZXhhbXBsZSB3ZSBoYXZlIHRoYXQgQ2FsaWZvcm5pYSwgQ29sb3JhZG8sIGFuZCBOZXcgWW9yayBhcmUgYWxsIGxldmVsIDEgYWRtaW5pc3RyYXRpb25zIG9mIHRoZSBVU0EuIFNpbWlsYXJseSwgbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbnMgYXJlIHN1YmRpdmlzaW9ucyBvZiBhIGxldmVsIAorMSBhZG1pbmlzdHJhdGlvbi4gT3JhbmdlIENvdW50eSwgTW9udGVyZXkgQ291bnR5LCBhbmQgTmFwYSBDb3VudHkgYXJlIGFsbCBsZXZlbCAyIGFkbWluaXN0cmF0aW9ucyB0aGF0IGJlbG9uZyB0byBDYWxpZm9ybmlhLiAKKworICAgQSBwcm9wZXJ0eSBmaWxlIGlzIGEgcGxhaW4tdGV4dCBmaWxlIHRoYXQgY29udGFpbnMgZWl0aGVyIGFyZWEgZGF0YSwgcG9wdWxhdGlvbiBkYXRhLCBvciBvdGhlciByZWxldmFudCBkYXRhIHJlbGF0ZWQgdG8gdGhlIHBvbGl0aWNhbCBkaXZpc2lvbnMgb2YgYSBjb3VudHJ5IGF0IGRpZmZlcmVudCBhZG1pbmlzdHJhdGlvbiBsZXZlbHMuIFByb3BlcnRpZXMgZmlsZXMgYXJlIGxvY2F0ZWQKK3VuZGVyIG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YVxyZXNvdXJjZXNcZGF0YVxjb3VudHJ5LiBUaGVyZSBhcmUgZm91ciB0eXBlcyBvZiBwcm9wZXJ0aWVzIGZpbGVzIDoKKworICAgICAgIE5hbWVzIHByb3BlcnR5IGZpbGUgOiAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGlkZW50aWZpZXJzIGZvciBldmVyeSBhZG1pbmlzdHJhdGl2ZSBkaXZpc2lvbiBpbiBhIGNvdW50cnkgYXQgZWFjaCBsZXZlbC4gRm9yIGV4YW1wbGUsIGZvciB0aGUgVVNBLCBhdCBsZXZlbCAwIHdlIHdvdWxkIGhhdmUgIlVTQSA9IFVuaXRlZCBTdGF0ZXMiLiBBdCBsZXZlbCAxLCB3ZSB3b3VsZCBoYXZlICJVUy1DQSA9IENhbGlmb3JuaWEiICwgIlVTLUNPID0gQ29sb3JhZG8iLCBhbmQgIlVTLU5ZID0gTmV3IFlvcmsiLiAKK0F0IGxldmVsIDIsIGZvciBPcmFuZ2UsIE1vbnRlcmV5LCBhbmQgTmFwYSBjb3VudGllcyB3aXRoaW4gQ2FsaWZvcm5pYSB3ZSBoYXZlICJVUy1DQS0wNjA1OSA9IE9yYW5nZSBDb3VudHkiLCAiVVMtQ0EtMDYwNTMgPSBNb250ZXJleSBDb3VudHkiLCBhbmQgIlVTLUNBLTA2MDU1ID0gTmFwYSBDb3VudHkiLiBUaGVyZSBpcyBhIHNpbmdsZSBuYW1lcyBwcm9wZXJ0eQorZmlsZSBmb3IgZXZlcnkgY291bnRyeS4gVGhlIGNvcnJlc3BvbmRpbmcgbmFtZXMgcHJvcGVydHkgZmlsZSBmb3IgdGhlIFVTQSBpcyBVU0FfbmFtZXMucHJvcGVydGllcy4gRm9yIGxldmVsIDIgYWRtaW5pc3RyYXRpb25zLCB0aGUgZml2ZSBkaWdpdHMgZm91bmQgb24gdGhlIGlkZW50aWZpZXJzIChpLmUuCisiMDYwNTMiIGZvciBpZGVudGlmaWVyICJVUy1DQS0wNjA1MyIgYXJlIGRlZmluZWQgYXMgZm9sbG93cyA6IHRoZSBsZWZ0bW9zdCB0d28gZGlnaXRzIGlkZW50aWZ5IHRoZSBsZXZlbCAxIGFkbWluaXN0cmF0aW9uICggIjA2IiAtPiBDYWxpZm9ybmlhICkgd2hpbGUgdGhlIHJlbWFpbmluZworZGlnaXRzLCB3aGljaCBjYW4gYmUgdXAgdG8gZm91ciwgaWRlbnRpZnkgdGhlIGxldmVsIDIgYWRtaW5pc3RyYXRpb24gKCIwNTMiIC0+IE1vbnRlcmV5IENvdW50eSkuICAgICAgIAorCisgICAgICAgTm9kZXMgcHJvcGVydHkgZmlsZSA6IFRoaXMgZmlsZSBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGlkZW50aWZpZXJzIG9mIGFkbWluaXN0cmF0aXZlIGRpdmlzaW9ucy4gVGhlcmUgaXMgYSBub2RlcyBwcm9wZXJ0eSBmaWxlIGZvciBlYWNoIGFkbWluaXN0cmF0aW9uIGxldmVsLiBUaGVyZSBpcyBhIGZpeGVkIGZvcm1hdCB0aGF0IGlzIHVzZWQgaW4gdGhlc2UgZmlsZXMgYW5kIGl0IGlzIGFzIGZvbGxvd3MgOgorCisiICMgRm9ybWF0OiBDb2RlID0gTmFtZSwgSVNPLTMxNjYtMiBudW1lcmljIGNvZGUsIFR3byBsZXR0ZXIgY29kZSAiIEZvciBleGFtcGxlLCBhdCBsZXZlbCAwIGZvciB0aGUgVVNBIHdlIGhhdmUgIlVTQSA9IFVuaXRlZCBTdGF0ZXMsIDg0MCwgVVMiLiBBdCBsZXZlbCAxLCBmb3IgQ2FsaWZvcm5pYSwgQ29sb3JhZG8sIGFuZCBOZXcgWW9yayB3ZSBoYXZlIDoKKyJVUy1DQSA9IENhbGlmb3JuaWEsIDA2LCBDQSIgLCAiVVMtQ08gPSBDb2xvcmFkbywgMDgsIENPIiwgYW5kICAiVVMtTlkgPSBOZXcgWW9yaywgMzYsIE5ZIi4gVGhlIG5vZGVzIHByb3BlcnR5IGZpbGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFVTQSBhcmUgVVNBXzBfbm9kZS5wcm9wZXJ0aWVzLCBVU0FfMV9ub2RlLnByb3BlcnRpZXMsIGFuZCBVU0FfMl9ub2RlLnByb3BlcnRpZXMuCisKKyAgICAgICBBcmVhIHByb3BlcnR5IGZpbGUgOiBUaGlzIGZpbGUgY29udGFpbnMgYXJlYSBkYXRhIChpbiBzcXVhcmUga2lsb21ldGVycykgZm9yIGFkbWluaXN0cmF0aXZlIGRpdmlzaW9ucy4gVGhlcmUgaXMgYW4gYXJlYSBwcm9wZXJ0eSBmaWxlIGZvciBlYWNoIGFkbWluaXN0cmF0aW9uIGxldmVsLiBJbiB0aGUgY2FzZSBvZiB0aGUgVVNBIGF0IGxldmVsIDAsIHdlIGhhdmUgIlVTQSA9IDkxNjE5MjMiLgorQXQgbGV2ZWwgMSwgd2UgaGF2ZSAiVVMtQ0EgPSAxNjM2OTUuNTciLCAiVVMtQ08gPSAxMDQwOTMuNTciLCBhbmQgIlVTLU5ZID0gNTQ1NTYuMDAiIGZvciBDYWxpZm9ybmlhLCBDb2xvcmFkbyBhbmQgTmV3IFlvcmsgcmVzcGVjdGl2ZWx5LiBBdCBsZXZlbCAyLCBmb3IgT3JhbmdlLCBNb250ZXJleSwgYW5kIE5hcGEgY291bnRpZXMgd2l0aGluIENhbGlmb3JuaWEgCit3ZSBoYXZlICJVUy1DQS0wNjA1OSA9IDIwNDMuNTAwNiIsICJVUy1DQS0wNjA1MyA9IDg2MDMuOTQwNSIsIGFuZCAiVVMtQ0EtMDYwNTUgPSAxOTUyLjg1MTAiLiBUaGUgYXJlYSBwcm9wZXJ0eSBmaWxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBVU0EgYXJlIFVTQV8wX2FyZWEucHJvcGVydGllcywgVVNBXzFfYXJlYS5wcm9wZXJ0aWVzLCBhbmQgVVNBXzJfYXJlYS5wcm9wZXJ0aWVzLgorCisKKyAgICAgICBQb3B1bGF0aW9uIHByb3BlcnR5IGZpbGUgOiBUaGlzIGZpbGUgY29udGFpbnMgcG9wdWxhdGlvbiBkYXRhIGZvciBhZG1pbmlzdHJhdGl2ZSBkaXZpc2lvbnMuIFRoZXJlIGlzIGEgcG9wdWxhdGlvbiBwcm9wZXJ0eSBmaWxlIGZvciBlYWNoIGFkbWluaXN0cmF0aW9uIGxldmVsLiAgSW4gdGhlIGNhc2Ugb2YgdGhlIFVTQSBhdCBsZXZlbCAwLCB3ZSBoYXZlICJVU0EgPSAyOTg0NDQyMTUiLgorQXQgbGV2ZWwgMSwgd2UgaGF2ZSAiVVMtQ0EgPSAzMzg3MTY0OCAiLCAiVVMtQ08gPSA0MzAxMjYxIiwgYW5kICJVUy1OWSA9IDE4OTc2NDU3IiBmb3IgQ2FsaWZvcm5pYSwgQ29sb3JhZG8gYW5kIE5ldyBZb3JrIHJlc3BlY3RpdmVseS4gQXQgbGV2ZWwgMiwgZm9yIE9yYW5nZSwgTW9udGVyZXksIGFuZCBOYXBhIGNvdW50aWVzIHdpdGhpbiBDYWxpZm9ybmlhIAord2UgaGF2ZSAiVVMtQ0EtMDYwNTkgPSAyODQ2Mjg5IiwgIlVTLUNBLTA2MDUzID0gNDAxNzYyIiwgYW5kICJVUy1DQS0wNjA1NSA9IDEyNDI3OSIuIFRoZSBwb3B1bGF0aW9uIHByb3BlcnR5IGZpbGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFVTQSBhcmUgVVNBXzBfaHVtYW4ucHJvcGVydGllcywgVVNBXzFfaHVtYW4ucHJvcGVydGllcywgYW5kIFVTQV8yX2h1bWFuLnByb3BlcnRpZXMuCisKKwkKKyoqVXBkYXRpbmcgdmFsdWVzIGluIGEgcHJvcGVydHkgZmlsZSoqCisKKyAgIFRvIHVwZGF0ZSBhIHZhbHVlIGluIGEgcHJvcGVydHkgZmlsZSB5b3Ugc2hvdWxkIGZvbGxvdyBhIGZldyBzaW1wbGUgc3RlcHMuIEZpcnN0LCBnaXZlbiB0aGF0IHlvdSBrbm93IHRoZSBuYW1lIG9mIHRoZSBjb3VudHJ5IGFuZC9vciBhZG1pbmlzdHJhdGl2ZSBkaXZpc2lvbiB0byBiZSB1cGRhdGVkLCBsb29rIHVuZGVyIG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YVxyZXNvdXJjZXNcZGF0YVxjb3VudHJ5XDx0aHJlZSBsZXR0ZXIgaWRlbnRpZmllciBmb3IgdGhlIGNvdW50cnk+IGZvciB0aGUgCitmb2xkZXIgdGhhdCBiZWxvbmdzIHRvIGEgZ2l2ZW4gY291bnRyeS4gSW4gdGhlIGNhc2Ugb2YgdGhlIFVTQSwgd2Ugd291bGQgZ28gdG8gIG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YVxyZXNvdXJjZXNcZGF0YVxjb3VudHJ5XFVTQSB3aGVyZSBhbGwgdGhlIHByb3BlcnR5IGZpbGVzIGFyZSBsb2NhdGVkLiBTZWNvbmQsIHNlYXJjaCBpbiB0aGUgbmFtZXMgcHJvcGVydHkgZmlsZSB0byBmaW5kIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBhZG1pbmlzdHJhdGlvbiB3ZSB3YW50IHRvIHVwZGF0ZS4gVGhpcmQsCitvcGVuIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUgKGFyZWEsIHBvcHVsYXRpb24sIG9yIG5vZGUgZmlsZSkgd2hlcmUgdGhlIHVwZGF0ZSB3aWxsIHRha2UgcGxhY2UuIEZpbmFsbHksIHNlYXJjaCBmb3IgdGhlIGlkZW50aWZpZXIgYW5kIG9uY2UgZm91bmQsIHVwZGF0ZSBpdHMgdmFsdWUuIEFzIGFuIGV4YW1wbGUsCitsZXRzIHNheSB3ZSB3YW50IHRvIHVwZGF0ZSBieSBpbmNyZWFzaW5nIDEwMCBzcXVhcmUga2lsb21ldGVycyB0aGUgYXJlYSBvZiBPcmFuZ2UgQ291bnR5IHdoaWNoIGJlbG9uZ3MgdG8gQ2FsaWZvcm5pYSwgVVNBLiBUaGVuLCB3ZSB3b3VsZCBvcGVuIG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YVxyZXNvdXJjZXNcZGF0YVxjb3VudHJ5XFVTQVxVU0FfbmFtZXMucHJvcGVydGllcyBhbmQgZG8gYSBzZWFyY2ggZm9yIHRoZSBpZGVudGlmaWVyIG9mICJPcmFuZ2UgQ291bnR5Igord2hpY2ggaXMgICJVUy1DQS0wNjA1OSIuIFRoZW4sIHNpbmNlIHdlIGxlYXJuIGZyb20gdGhlIG5hbWVzIHByb3BlcnR5IGZpbGUgdGhhdCBPcmFuZ2UgQ291bnR5IGlzIGEgbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbiwgd2Ugd291bGQgb3BlbiAib3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhXHJlc291cmNlc1xkYXRhXGNvdW50cnlcVVNBXFVTQV8yX2FyZWEucHJvcGVydGllcyIKK2FuZCBkbyBhIG5ldyBzZWFyY2ggZm9yIGlkZW50aWZpZXIgIlVTLUNBLTA2MDU5Ii4gT3VyIHNlYXJjaCB3aWxsIGZpbmQgIiJVUy1DQS0wNjA1OSA9IDIwNDMuNTAwNiIgRmluYWxseSwgd2UgZG8gdGhlIHVwZGF0ZSBieSBhZGRpbmcgMTAwIHNxdWFyZSBraWxvbWV0ZXJzIHRvIHRoZSBjdXJyZW50IHZhbHVlICJVUy1DQS0wNjA1OSA9IDIxNDMuNTAwNiIuCisKKyAgICBPbmNlIHRoZSB1cGRhdGluZyBoYXMgYmVlbiBkb25lIHRvIHRoZSBjb3JyZWN0IGZpbGUocyksICBvbmUgbmVlZHMgdG8gcnVuIG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YVxyZXNvdXJjZXNcc3JjXE1haW4uamF2YS4gQnkgcnVubmluZyBNYWluLmphdmEgd2UgY3JlYXRlIGEgbmV3IHNlcmlhbGl6ZWQgZmlsZSB0aGF0IHdpbGwgdGFrZSB0aGUgY2hhbmdlcyBpbnRvIGFjY291bnQuCitUaGUgbmV3IHNlcmlhbGl6ZWQgZmlsZSBjYW4gYmUgZm91bmQgdW5kZXIgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhXHRlbXBcZGF0YVxzY2VuYXJpb1xkaXNlYXNlLiBOZXh0IHRpbWUgU1RFTSBJSSBleGVjdXRlcyBhIHNjZW5hcmlvLCBpdCB3aWxsIGxvYWQgdGhlIG5ldyBzZXJpYWxpemVkIGZpbGUuCisKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworKkFuIEludHJvZHVjdGlvbiB0byBTVEVNIE1hcCBGaWxlcyoKKworU1RFTSBNYXBzIAorCisKKyAgTWFwcyBmb3IgU1RFTSBhcmUgWE1MIGZpbGVzIHRoYXQgZm9sbG93IGEgR01MIGZvcm1hdC4gVGhlc2UgZmlsZXMgYXJlIGxvY2F0ZWQgdW5kZXIgb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHlccmVzb3VyY2VzXGRhdGFcZ2VvXGNvdW50cnlcPHRocmVlIGxldHRlciBpZGVudGlmaWVyIGZvciB0aGUgY291bnRyeT4uIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSBtYXAgZmlsZXMgZm9yIGEgY291bnRyeSwgb25lIGZvciBlYWNoIGFkbWluaXN0cmF0aW9uIGxldmVsLgorQXMgYW4gZXhhbXBsZSwgZm9yIHRoZSBVU0Egd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHR3byBtYXBzOiBVU0FfMV9NQVAueG1sIGFuZCBVU0FfMl9NQVAueG1sLiBBY2NvcmRpbmcgdG8gV2lraXBlZGlhLCBHTUwgaXMgYW4gWE1MIGdyYW1tYXIgZGVmaW5lZCBieSB0aGUgT3BlbiBHZW9zcGF0aWFsIENvbnNvcnRpdW0gKE9HQykgdG8gZXhwcmVzcyBnZW9ncmFwaGljYWwgZmVhdHVyZXMuIEFzIGFuIGV4YW1wbGUsIHRoZSBzZXQgb2YgR01MIGVsZW1lbnRzIHRoYXQgZGVmaW5lCitPcmFuZ2UgY291bnR5IGFyZSA6CisKKy8vU2FtcGxlIHRha2VuIGZyb20gb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHlccmVzb3VyY2VzXGRhdGFcZ2VvXGNvdW50cnlcVVNBXFVTQV8yX01BUC54bWwKKworLi4uCis8Z21sOlBvbHlnb24gZ21sOmlkPSJVUy1DQS0wNjA1MyI+Cis8Z21sOm91dGVyQm91bmRhcnlJcz4KKzxnbWw6TGluZWFyUmluZz4KKzxnbWw6cG9zTGlzdD4KKzM2LjkxODYgLTEyMS43MDE5IDM2LjkxOTcgLTEyMS42OTk5IC4uLiAzNi45MTg2IC0xMjEuNzAxOQorPC9nbWw6cG9zTGlzdD4KKzwvZ21sOkxpbmVhclJpbmc+PC9nbWw6b3V0ZXJCb3VuZGFyeUlzPgorPC9nbWw6UG9seWdvbj4KKy4uLgorCisqKlVwZGF0aW5nIGEgTWFwKiogICAgCisKKyAgICBUbyB1cGRhdGUgYSBtYXAsIHRoYXQgaXMsIHRvIHByb3ZpZGUgbW9yZSBhY2N1cmF0ZSBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGRhdGEgZm9yIGEgZ2l2ZW4gbG9jYXRpb24gd2UgZm9sbG93IGEgZmV3IHN0ZXBzLiBXZSBmaW5kIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgbG9jYXRpb24KK3dlIGFyZSB0cnlpbmcgdG8gdXBkYXRlLiBUaGlzIHN0ZXAgaXMgc2ltaWxhciB0byB0aGUgc3RlcCBkZXNjcmliZWQgZm9yIHVwZGF0aW5nIHZhbHVlcyBpbiBhIHByb3BlcnR5IGZpbGUuIE9uY2Ugd2UgaGF2ZSBmb3VuZCBpdCwgd2UgcmVwbGFjZSB0aGUgbGF0aXR1dGUgYW5kIGxvbmdpdHVkZQordmFsdWVzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIDxnbWw6cG9zdExpc3Q+IDwvZ21sOnBvc3RMaXN0PiB0YWdzLiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIGxhdGl0dXRlIGFuZCBsb25naXR1ZGUgdmFsdWVzIGFyZSB0aGUgc2FtZSwgb3RoZXJ3aXNlIGl0Cit3b250IGJlIGFjY2VwdGVkIGFzIGEgY2xvc2VkIHBvbHlnb24uIEluIHRoZSBleGFtcGxlIGFib3ZlLCBub3RlIHRoYXQgZm9yIE1vbnRlcmV5IENvdW50eSAoIlVTLUNBLTA2MDUzIikgdGhlIHN0YXJ0aW5nIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgdmFsdWVzICIzNi45MTg2IC0xMjEuNzAxOSIgYXJlIHRoZSBzYW1lIGFzIHRoZSBlbmRpbmcgb25lcworIjM2LjkxODYgLTEyMS43MDE5Ii4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvZG9jcy9BbiBJbnRyb2R1Y3Rpb24gdG8gU1RFTSBJSSBEYXRhIENvbnZlcnNpb24gVXRpbGl0aWVzIGZvciBFdXJvcGUgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvZG9jcy9BbiBJbnRyb2R1Y3Rpb24gdG8gU1RFTSBJSSBEYXRhIENvbnZlcnNpb24gVXRpbGl0aWVzIGZvciBFdXJvcGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY4MDEzZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9kb2NzL0FuIEludHJvZHVjdGlvbiB0byBTVEVNIElJIERhdGEgQ29udmVyc2lvbiBVdGlsaXRpZXMgZm9yIEV1cm9wZQpAQCAtMCwwICsxLDQ1IEBACitGZWIgLSAwNSAtIDIwMDcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworKkFuIEludHJvZHVjdGlvbiB0byBTVEVNIElJIERhdGEgQ29udmVyc2lvbiBVdGlsaXRpZXMgZm9yIEV1cm9wZSoKKworCisJIFRoZSBzZXQgb2YgZGF0YSBnZW5lcmF0b3JzIHdlcmUgaW5pdGlhbGx5IGRldmVsb3BlZCBmb3IgdGhlIERpdmEgZm9ybWF0LiBIb3dldmVyLCB0aGUgY291bnRyaWVzIGluIHRoZSBFdXJvcGVhbiBkYXRhIHNldCBjb21lIGluIGEgZGlmZmVyZW50IGZvcm1hdC4KK0JlZm9yZSB3ZSBjYW4gcnVuIHRoZSBkYXRhIGdlbmVyYXRpb24gdXRpbGl0aWVzIHRvIGdlbmVyYXRlIHByb3BlcnRpZXMgZmlsZXMgYW5kIG1hcHMgb24gdGhlIEV1cm9wZWFuIGRhdGEgc2V0LCB3ZSBuZWVkIHRvIHJ1biBhIHNldCBvZiB1dGlsaXRpZXMKK3RoYXQgd2lsbCBjb252ZXJ0IHRoZSBFdXJvcGVhbiBkYXRhIGludG8gdGhlIERpdmEgZm9ybWF0IHRoYXQgdGhlIGdlbmVyYXRvcnMgZXhwZWN0LiAKKworTk9URTogQWxsIG9mIHRoZSBjb252ZXJzaW9uIHV0aWxpdGllcyBmb3IgRXVyb3BlIGFyZSBmb3VuZCB1bmRlciBvcmcuZWNsaXBzZS5zdGVtXHNyY1xnZW5lcmF0b3JzLgorCisqKk92ZXJ2aWV3IG9mIHRoZSBkYXRhIGNvbnZlcnNpb24gcHJvY2VzcyBmcm9tIHRoZSBFdXJvcGUgZGF0YSBzZXQgZm9ybWF0IGludG8gdGhlIERpdmEgc2V0IGZvcm1hdCA6KioKKyAgCisgICAgICAxKSBEYXRhIENsZWFuaW5nL0dyb3VwaW5nIDogc3RhcnQgYnkgcnVubmluZyBFdXJvcGVEYXRhQ2xlYW5lci4gVGhpcyBwcm9ncmFtIHdpbGwKKyAgcmVtb3ZlIGFsbCB1bm5lY2VzYXJ5IGRhdGEgKGkuZS4gY29sdW1ucykgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBJbgorICBhZGRpdGlvbiwgdGhpcyBwcm9ncmFtIHdpbGwgZ3JvdXAgdGhlIGRhdGEgYmFzZWQgb24gaXRzIElEIChpLmUuIE5PLElULEZSLFVLLAorICBldGMpLiBUaGUgcmVzdWx0IHdpbGwgYmUgYSBmaWxlIG5hbWVkIEV1cm9wZVNvcnRlZC50eHQgd2l0aCBjbGVhbmVkIGRhdGEuCisgIAorICBJbiBvdGhlciB3b3JkcyA6IEV1cm9wZS50eHQgKGlucHV0KSAtLT4gfHxFdXJvcGVEYXRhQ2xlYW5lcnx8IC0tPiBFdXJvcGVTb3J0ZWQudHh0IChvdXRwdXQpCisgIAorICBOT1RFOiBFdXJvcGVTb3J0ZWQudHh0IHdpbGwgYmUgdXNlZCBhcyB0aGUgaW5wdXQgZm9yIHRoZSByZW1haW5pbmcgcGFydCBvZgorICB0aGUgcHJvY2Vzcy4KKyAgCisgICAgICAyKSBEYXRhIEZvcm1hdHRpbmcgOiBydW4gRXVyb3BlRGF0YUZvcm1hdHRlciB0byBicmVhayBkb3duIHRoZSBkYXRhIHNvdXJjZQorICAoRXVyb3BlU29ydGVkLnR4dCkgaW50byBtdWx0aXBsZSBkYXRhIGZpbGVzLCBvbmUgZm9yIGVhY2ggY291bnRyeSBhcworICBpbmRpY2F0ZWQgYnkgdGhlIElEIChpLmUuIE5PLElULEZSLFVLLCBldGMpLiBUaGUgcmVzdWx0IHdpbGwgYmUgbXVsdGlwbGUgZGF0YQorICBmaWxlcyAoaS5lLiBpdGFseS50eHQsIHNwYWluLnR4dCwgZXRjKS4gRWFjaCBmaWxlIHdpbGwgYmUgZm91bmQgdW5kZXIgYQorICBmb2xkZXIgd2l0aCBzYW1lIG5hbWUgYXMgdGhlIGNvdW50cnkgKGkuZS4gSVRBTFlcaXRhbHkudHh0LCBTUEFJTlxzcGFpbi50eHQsCisgIGV0YykuCisgIAorICAgICAgMykgRGF0YSBDb252ZXJ0ZXIgOiBydW4gRXVyb3BlRGF0YUNvbnZlcnRlciB0byBjb252ZXJ0IGludG8gRGl2YSBmb3JtYXQuCisgIAorICAKKyAgICAgIDQpIEFyZWEgYW5kIFBvcHVsYXRpb24gRGF0YSBFeHRyYWN0aW9uIDogcnVuIEV1cm9wZURhdGFFeHRyYWN0b3IgdG8gZXh0cmFjdAorICBhbGwgYXJlYSBhbmQgcG9wdWxhdGlvbiBkYXRhIGZvciBlYWNoIGNvdW50cnkuIFRoZSBuZXcgYXJlYSBhbmQgcG9wdWxhdGlvbiBkYXRhIGZpbGVzIHdpbGwgYmUgZm91bmQgdW5kZXIKK29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9kYXRhTWlncmF0aW9uL2lucHV0L0FyZWFQb3B1bGF0aW9uRGF0YS4gRm9yIGV2ZXJ5IGNvdW50cnksIHNheSBmb3IgU3BhaW4sIHRoZXJlIHdpbGwKK2JlIGNvcnJlc3BvbmRpbmcgYXJlYSBhbmQgcG9wdWxhdGlvbiBkYXRhIGZpbGVzIDogU1BBSU5fQVJFQS50eHQgYW5kIFNQQUlOX1BPUFVMQVRJT04udHh0LgorICAKKyAgCisgICAgICBBZnRlciBhbGwgZm91ciBzdGVwcyBhcmUgZG9uZSBhbmQgd2UgaGF2ZSBjb252ZXJ0ZWQgdGhlIEV1cm9wZSBkYXRhIHNldCBpbnRvIGEgRGl2YSBmb3JtYXQsIHdlIG5vdyBjYW4gcnVuIHRoZQorc2V0IG9mIGRhdGEgZ2VuZXJhdG9ycyB0byBjcmVhdGUgdGhlIHByb3BlcnRpZXMgZmlsZXMgYW5kIG1hcHMgYXMgZXhwbGFpbmVkIGluICJBbiBJbnRyb2R1Y3Rpb24gdG8gU1RFTSBJSSBEYXRhIEdlbmVyYXRpb24gVXRpbGl0aWVzIGZvciBEaXZhIi4KKworCSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvZG9jcy9BbiBJbnRyb2R1Y3Rpb24gdG8gU1RFTSBJSSBEYXRhIEdlbmVyYXRpb24gVXRpbGl0aWVzIGZvciBEaXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2RvY3MvQW4gSW50cm9kdWN0aW9uIHRvIFNURU0gSUkgRGF0YSBHZW5lcmF0aW9uIFV0aWxpdGllcyBmb3IgRGl2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTE0ZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2RvY3MvQW4gSW50cm9kdWN0aW9uIHRvIFNURU0gSUkgRGF0YSBHZW5lcmF0aW9uIFV0aWxpdGllcyBmb3IgRGl2YQpAQCAtMCwwICsxLDUwMyBAQAorCitKYW4gLSAxMSAtIDIwMDcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworKkFuIEludHJvZHVjdGlvbiB0byBTVEVNIElJIERhdGEgR2VuZXJhdGlvbiBVdGlsaXRpZXMgZm9yIERpdmEqCisKKworCisgICAgIERhdGEgZ2VuZXJhdGlvbiBmb3IgU1RFTSBJSSB3YXMgZG9uZSB1c2luZyBhIHNldCBvZiBjdXN0b20gc29mdHdhcmUgdXRpbGl0aWVzIGFuZCBkYXRhIGdlbmVyYXRvcnMgd3JpdHRlbiBpbiBKYXZhIGZvciB0aGUgcHVycG9zZS4gVGhleSBjYW4gYmUgZm91bmQgCit1bmRlciBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcc3JjXGdlbmVyYXRvcnMuIFRoZXNlIGdlbmVyYXRvcnMgd2VyZSB1c2VkIHRvIGNyZWF0ZSBTVEVNJ3MgcHJvcGVydGllcyBmaWxlcyBhbmQgbWFwcyBmb3IgYWxsIGNvdW50cmllcyBpbiB0aGUgRGl2YSAKK2RhdGEgc2V0IChodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5odG0pLiBUaGVyZSBhcmUgbXVsdGlwbGUgc3RlcHMgaW52b2x2ZWQgaW4gdGhlIHByb2Nlc3Mgb2YgZGF0YSBnZW5lcmF0aW9uLiBCZWZvcmUgcnVubmluZyBhIGRhdGEgCitnZW5lcmF0b3IgdGhlcmUgYXJlIGEgZmV3IGludGVybWVkaWF0ZSBzdGVwcyB0byBiZSBkb25lIGJ5IGN1c3RvbSB1dGlsaXRpZXMgZm91bmQgaW4gb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHNyY1xnZW5lcmF0b3JzLiBGdXJ0aGVybW9yZSwgdGhlIGludGVybWVkaWF0ZSAKK3N0ZXBzIHZhcnkgYWNjb3JkaW5nIHRvIHRoZSBwYXJ0aWN1bGFyIGRvY3VtZW50IChpLmUuIGFyZWEgcHJvcGVyaXR5IGZpbGUsIG5vZGVzIHByb3BlcnR5IGZpbGUsIG9yIG1hcCkgIHdlIHdhbnQgdG8gZ2VuZXJhdGUuIFNvLCB3ZSBjYW4gdGhpbmsgb2YgZGF0YSAKK2dlbmVyYXRpb24gZm9yIFNURU0gSUkgIGFzIGNvbnNpc3Rpbmcgb2YgYSBzZXQgb2YgZGF0YSBnZW5lcmF0aW9uIHByb2Nlc3NlcyB3aGVyZSBlYWNoIHByb2Nlc3MgY29uc2lzdHMgb2YgYSBzZXQgb2Ygc3RlcHMuIE92ZXJhbGwsIHdlIGNhbiBpZGVudGlmeSB0aGUKK2ZvbGxvd2luZyBmaXZlIGRhdGEgZ2VuZXJhdGlvbiBwcm9jZXNzZXMgOgorCisKKyAgICAgIC0tR2VuZXJhdGlvbiBvZiBBcmVhIFByb3BlcnRpZXMgRmlsZXMgCisKKyAgICAgIC0tR2VuZXJhdGlvbiBvZiBQb3B1bGF0aW9uIFByb3BlcnRpZXMgRmlsZXMgCisKKyAgICAgIC0tR2VuZXJhdGlvbiBvZiBOb2RlcyBQcm9wZXJ0aWVzIEZpbGVzIAorCisgICAgICAtLUdlbmVyYXRpb24gb2YgTmFtZXMgUHJvcGVydGllcyBGaWxlcyAKKworICAgICAgLS1NYXAgR2VuZXJhdGlvbgorCisKKyAgICAgRWFjaCBwcm9jZXNzIHdpbGwgYmUgZXhwbGFpbmVkIGluIGRldGFpbCwgYnV0IGJlZm9yZSwgd2UgaGF2ZSB0byBtZW50aW9uIG91ciBkYXRhIHNvdXJjZXMgYW5kIHRoZSBuYXR1cmUgb2YgdGhlIGRhdGEgd2UgYXJlIGRlYWxpbmcgd2l0aC4KKworCisqKkRhdGEgU291cmNlcyBmb3IgU1RFTSBJSSoqCisKKyAgICAgIE91ciBtYWluIHNvdXJjZSBvZiBkYXRhIHdhcyBESVZBLUdJUyAoaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuaHRtKSwgd2hpY2ggaXMgYSByZXBvc2l0b3J5IGZvciBtYXBzIGFuZCBHSVMgZGF0YS4gQWxsIERJVkEtR0lTCitkYXRhIGlzIGZyZWUgYW5kIGluIHRoZSBwdWJsaWMgZG9tYWluLiBUaGUgZGF0YSBmaWxlcyBhcmUgaW4gc2hhcGVmaWxlIGZvcm1hdCAoaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaGFwZWZpbGUpLiAgQWNjb3JkaW5nIHRvIFdpa2lwZWRpYSwgIlRoZSBFU1JJIAorU2hhcGVmaWxlIGlzIGEgcG9wdWxhciBnZW9zcGF0aWFsIHZlY3RvciBkYXRhIGZvcm1hdCBmb3IgZ2VvZ3JhcGhpYyBpbmZvcm1hdGlvbiBzeXN0ZW1zIHNvZnR3YXJlLiBJdCBpcyBkZXZlbG9wZWQgYW5kIHJlZ3VsYXRlZCBieSBFU1JJIGFzIGEgKG1vc3RseSkgb3BlbiAKK3NwZWNpZmljYXRpb24gZm9yIGRhdGEgaW50ZXJvcGVyYWJpbGl0eSBhbW9uZyBFU1JJIGFuZCBvdGhlciBzb2Z0d2FyZSBwcm9kdWN0cy4gQSAic2hhcGVmaWxlIiBjb21tb25seSByZWZlcnMgdG8gYSBjb2xsZWN0aW9uIG9mIGZpbGVzIHdpdGggIi5zaHAiLCAiLnNoeCIsIAorIi5kYmYiICIgQWxsIHNoYXBlZmlsZXMgZG93bmxvYWRlZCBmcm9tIERJVkEtR0lTIGFyZSB6aXAgY29tcHJlc3NlZC4gQmVmb3JlIGdldHRpbmcgdG8gZGF0YSBnZW5lcmF0aW9uLCB0aGVyZSBhcmUgdHdvIHN0ZXBzIHRvIGJlIGRvbmUgOiAKKworCisqKipVbmNvbXByZXNzaW5nKioqCisKKyAgICAgVGhlIGZpcnN0IHN0ZXAgaXMgdG8gdW56aXAgYWxsIHRoZSBkb3dubG9hZGVkIERJVkEtR0lTIHNoYXBlZmlsZXMgYnkgdXNpbmcgYSBjb21wcmVzc2luZyBzb2Z0d2FyZSBsaWtlIFdpbnppcCBvciA3LXppcC4KKworKioqRXh0cmFjdGlvbioqKioKKworICAgICBUaGUgc2Vjb25kIHN0ZXAgaXMgdG8gZXh0cmFjdCBkYXRhIGZvciBldmVyeSBwb3NzaWJsZSBzaGFwZWZpbGUgaW50byBhIHBsYWluIHRleHQgZG9jdW1lbnQuIFRvIGRvIHRoaXMsIHdlIHJ1biBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcc3JjXGdlbmVyYXRvcnNcV29ybGRSZWFkZXIuamF2YS4gCitXb3JsZFJlYWRlciB0YWtlcyBhcyBhbiBhcmd1bWVudCBhIGxpc3Qgd2lsbCBhbGwgdGhlIGZpbGVzIHdlIHdhbnQgdG8gZXh0cmFjdCBkYXRhIGZyb20uIFN1Y2ggYSBsaXN0IGxvb2tzIGFzIGZvbGxvd3MgOgorCisKKy8vVGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFx3b3JsZFxXb3JsZC50eHQKKy4uLgorI1RISVMgRklMRSBJUyBUSEUgSU5QVVQgVE8gV29ybGRSZWFkZXIuamF2YQorI0lUIENPTlNJU1RTIE9GIFBBSVJTIE9GIFRIRSBGT1JNIDogW0xPQ0FUSU9OO0ZJTEVOQU1FXQorQzpcZGl2YVxBZnJpY2FcQWxnZXJpYTtDOlxkaXZhXEFmcmljYVxBbGdlcmlhXEFsZ2VyaWEudHh0CitDOlxkaXZhXEFmcmljYVxBbmdvbGE7QzpcZGl2YVxBZnJpY2FcQW5nb2xhXEFuZ29sYS50eHQKK0M6XGRpdmFcQWZyaWNhXEJlbmluO0M6XGRpdmFcQWZyaWNhXEJlbmluXEJlbmluLnR4dAorQzpcZGl2YVxBZnJpY2FcQnVya2luYUZhc287QzpcZGl2YVxBZnJpY2FcQnVya2luYUZhc29cQnVya2luYUZhc28udHh0CQorQzpcZGl2YVxBZnJpY2FcQnVydW5kaTtDOlxkaXZhXEFmcmljYVxCdXJ1bmRpXEJ1cnVuZGkudHh0CQorLi4uCisKKyAgICAgVGhlIHJlc3VsdCBpcyBhIHNldCBvZiBwbGFpbi10ZXh0IGZpbGVzIGNvbnRhaW5pbmcgR0lTIGRhdGEuIFdlIGNhbGwgaXQgYSBEaXZhIGZpbGUuIE5leHQsIHdlIGV4cGxhaW4gaG93IGEgRGl2YSBmaWxlIGxvb2tzIGxpa2UuCisKKyoqKk92ZXJ2aWV3IG9mIERpdmEgRmlsZXMqKioKKworQSBkaXZhIGZpbGUgaXMgYSBzaW1wbGUtdGV4dCBmaWxlIHRoYXQgY29udGFpbnMgR0lTIGRhdGEgYW5kIHRoYXQgbG9va3MgYXMgZm9sbG93cyA6CisKKy8vIEV4dHJhY3RlZCBmcm9tIEFyZ2VudGluYS50eHQKKworLy8gU2FtcGxlIGxldmVsIDAgZGF0YQorQVJHLEFSR0VOVElOQSwtMC41NTU5NzY3LC0xLjAxNDY4ODEsLTAuNTU1OTgyNSwtMS4wMTQ3MTEzLCAuLi4KKworLy8gU2FtcGxlIGxldmVsIDEgZGF0YQorQVJHLEFSR0VOVElOQSxCVUVOT1MgQUlSRVMsLTAuNzAyMDA1NzQsLTEuMDg0MDM3MiwgLi4uCisKKy8vIFNhbXBsZSBsZXZlbCAyIGRhdGEKK0FSRyxBUkdFTlRJTkEsSlVKVVksU2FudGEgQ2F0YWxpbmEsLTAuMzgwMjQ4NTgsLTEuMTU2MTE4NiwgLi4uCisKKyAgICBJbiBvdGhlciB3b3JkcywgaXQgaXMganVzdCBhIHNldCBvZiByb3dzIHdpdGggbG9jYXRpb24gZGF0YSAoaS5lLiBBUkcsQVJHRU5USU5BLEpVSlVZLFNhbnRhIENhdGFsaW5hKSBhbmQgZm9sbG93ZWQgYnkgcG9seWdvbiBkYXRhIGNvcnJlc3BvbmRpbmcKK3RvIGEgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIChpLmUuIC0wLjM4MDI0ODU4LC0xLjE1NjExODYsLTAuMzgwMjM2OTUsLTEuMTU2MTE0OCwtMC4zODAyNDAwMiwtMS4xNTYwOTIyLC0wLjM4MDI0Njg1LC0xLjE1NjA0MTQsIC4uLikuIE9uZSByZXN0cmljdGlvbiBhYm91dAordGhlIERpdmEgZmlsZXMgaXMgdGhhdCBkYXRhIGhhcyB0byBhcHBlYXIgaW4gdGhlIGZpbGUgYmFzZWQgb24gYWRtaW5pc3RyYXRpb24gbGV2ZWwuIEluIG90aGVyIHdvcmRzLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBsZXZlbCAwIGRhdGEgY29tZXMgYmVmb3JlCit0aGUgbGV2ZWwgMSBkYXRhIGFuZCB0aGF0IGFsbCBsZXZlbCAyIGRhdGEgY29tZXMgYWZ0ZXIgbGV2ZWwgMCBhbmQgbGV2ZWwgMSBkYXRhIHJlc3BlY3RpdmVseS4gVGhlIGRhdGEgZ2VuZXJhdGlvbiB1dGlsaXRpZXMgYXJlIHNlbnNpdGl2ZSB0byB0aGUgb3JkZXJpbmcgb2YKK2RhdGEgYmFzZWQgb24gdGhlIGFkbWluaXN0cmF0aW9uIGxldmVsLiBBIGRhdGEgZ2VuZXJhdG9yIGdvZXMgdGhyb3VnaCBpbnRlcm5hbCB0cmFuc2l0aW9ucyBiYXNlZCBvbiB0aGUgYWRtaW5pc3RyYXRpb24gbGV2ZWwgb2YgdGhlIGRhdGEgaXQgaXMgY3VycmVudGx5IHByb2Nlc3NpbmcuCitJbnRlcm5hbCB0cmFuc2l0aW9ucyBvZiB0aGUgZGF0YSBnZW5lcmF0b3IgbXVzdCBmb2xsb3cgdGhlIHBhdHRlcm4gOiBMZXZlbF8wIC0+IExldmVsXzEgLT4gTGV2ZWxfMi4gT3RoZXJ3aXNlLCBpZiBkYXRhIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIExldmVsXzAgLT4gTGV2ZWxfMSAtPiBMZXZlbF8yIHJ1bGUsIAordW5leHBlY3RlZCBiZWhhdmlvciBtaWdodCBhcmlzZSBmcm9tIHRoZSBkYXRhIGdlbmVyYXRpb24gdXRpbGl0aWVzLgorCisKKyoqR3JvdXBpbmcqKgorCisgICAgICBBZnRlciB3ZSB1bmNvbXByZXNzIGFuZCBleHRyYWN0IHNoYXBlZmlsZXMgaW50byBwbGFpbiB0ZXh0IGRvY3VtZW50cywgd2Ugbm90aWNlIHRoYXQgZm9yIHNvbWUgZmlsZXMgdGhlIGRhdGEgZm9yIGEgc2luZ2xlIGFkbWluaXN0cmF0aW9uIGlzIHNjYXR0ZXJlZCBhbGwgb3ZlcgordGhlIGRhdGEgZmlsZS4gQXMgYW4gZXhhbXBsZSwgZm9yIFdpc2NvbnNpbiwgd2UgZG9udCBmaW5kIGFsbCB0aGUgcm93cyBvZiBkYXRhIGZvciBpdCBjb25zZWN1dGl2ZWx5LCBidXQgc2NhdHRlcmVkIGFsbCBvdmVyLCBhcyBmb2xsb3dzIDoKKworICBVU0EsVW5pdGVkIFN0YXRlcywgV2lzY29uc2luLCAwLjc5MTc5MzYsLTEuNTE3NTIwMyAuLi4gCisgIFVTQSxVbml0ZWQgU3RhdGVzLFdpc2NvbnNpbiwwLjgxOTc0NTI0LC0xLjU4MDA2OTMgLi4uCisgIFVTQSxVbml0ZWQgU3RhdGVzLCBOZXcgSGFtcHNoaXJlLDAuNzkwNzI2NTQsLTEuMjQwNjU1NyAgLi4uCisgIFVTQSxVbml0ZWQgU3RhdGVzLCBNaWNoaWdhbiwwLjc4ODE2MzEsLTEuNTAxNTYyMSAuLi4KKyAgLi4uCisgIFVTQSxVbml0ZWQgU3RhdGVzLCBXaXNjb25zaW4sIC4uLgorICAgIC4uLiAJCQorICBVU0EsVW5pdGVkIFN0YXRlcywgV2lzY29uc2luLCAuLi4KKyAgICAuLi4KKyAgICAgICBhbmQgc28gb24uLi4KKworICAgIFdlIHdhbnQgdG8gZ3JvdXAgYWxsIGRhdGEgdGhhdCBiZWxvbmdzIHRvIFdpc2NvbnNpbiBjb25zZWN1dGl2ZWx5LiBCeSBkb2luZyB0aGlzLCB3ZSB3aWxsIHByb2R1Y2UgYSBwb2x5Z29uIHdpdGggdW5pcXVlIElEIGZvciBXaXNjb25zaW4gaW5zdGVhZCBvZiBtdWx0aXBsZSAKK3BvbHlnb25zIHdpdGggc2FtZSBJRC4gQnkgZGVmaW5pdGlvbiwgcG9seWdvbiBJRHMgc2hvdWxkIGJlIHVuaXF1ZS4gV2UgYWNoaWV2ZXRoZSBncm91cGluZyBieSBydW5uaW5nIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxzcmNcZ2VuZXJhdG9yc1xHcm91cEdlbmVyYXRvci5qYXZhLiAKK1RoZSByZXN1bHRpbmcgImdyb3VwZWQiIGRhdGEgZmlsZSB3aWxsIGxvb2sgYXMgZm9sbG93cyA6CisKK1VTQSxVbml0ZWQgU3RhdGVzLEtlbnR1Y2t5LDAuNjM3MDA0OSwtMS41NjE4MDk4IC4uLgorVVNBLFVuaXRlZCBTdGF0ZXMsV2lzY29uc2luLDAuODIxNjUzMywtMS41Nzc3ODYyIC4uLgorVVNBLFVuaXRlZCBTdGF0ZXMsV2lzY29uc2luLDAuODE5NzQ1MjQsLTEuNTgwMDY5MyAuLi4KK1VTQSxVbml0ZWQgU3RhdGVzLFdpc2NvbnNpbiwwLjgxMjczMTYsLTEuNTc4MDk0MiAuLi4KK1VTQSxVbml0ZWQgU3RhdGVzLFdpc2NvbnNpbiwwLjgxNzU4NjMsLTEuNTgwODEzIC4uLgorVVNBLFVuaXRlZCBTdGF0ZXMsV2lzY29uc2luLDAuNzkxNzkzNiwtMS41MTc1MjAzIC4uLgorVVNBLFVuaXRlZCBTdGF0ZXMsV2lzY29uc2luLDAuNzg2NDY0OCwtMS41MjcxNjQ5IC4uLgorVVNBLFVuaXRlZCBTdGF0ZXMsTWlubmVzb3RhLDAuODU4NTgxNywtMS42NjA3Mzg3IC4uLgorCisgICAgIFJ1bm5pbmcgR3JvdXBHZW5lcmF0b3Igd2lsbCBwcm9kdWNlIGFzIG91dHB1dCBmaWxlcyB3aXRoIHRoZSAiX0dST1VQRUQiIHN1ZmZpeCBhdHRhY2hlZC4gU28gZm9yIGV4YW1wbGUsIGlmIHRoZSBvcmlnaW5hbCBkYXRhIGZpbGUgZm9yIHRoZSBVU0EgaXMgIlVTQS50eHQiLCAKK3RoZW4gdGhlIGNvcnJlc3BvbmRpbmcgZ3JvdXBlZCBmaWxlIHdpbGwgaGF2ZSBuYW1lICJVU0FfR1JPVVBFRC50eHQiCisKK05PVEUgOiBGcm9tIHRoaXMgaW50cm9kdWN0aW9uIHdlIGFzc3VtZSB0aGF0IGFsbCB0aGUgZ2VuZXJhdG9ycyBhbmQgdXRpbGl0aWVzIGFyZSBsb2NhdGVkIHVuZGVyICBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcc3JjXGdlbmVyYXRvcnNcIGV4Y2VwdCB3aGVyZSBleHBsaWNpdGx5IAorbWVudGlvbmVkIG90aGVyd2lzZS4KKworKipMZXhpY29ncmFwaGljIFNvcnRpbmcqKgorCisgICAgQWZ0ZXIgd2UgaGF2ZSBydW4gR3JvdXBHZW5lcmF0b3IsIHdlIHdhbnQgdG8gcnVuIGEgcGFpciBvZiB1dGlsaXRpZXMgdGhhdCB3aWxsIGRvIGEgbGV4aWNvZ3JhcGhpYyBzb3J0aW5nIG9mIHRoZSAgZGF0YSBmaWxlcyBhdCBhZG1pbmlzdHJhdGlvbiBsZXZlbHMgMSBhbmQgMi4gCisgICAgVGhlc2UgdXRpbGl0aWVzIGFyZSA6IEFkbWluMUxleFNvcnRlciBhbmQgQWRtaW4yTGV4U29ydGVyLiBOZXh0LCB3ZSBleHBsYWluIGJvdGggdXRpbGl0aWVzIGluIGRldGFpbC4gVGhlIGZpbGVzIHByb2R1Y2VkIGJ5IHRoZXNlIHV0aWxpdGllcyB3aWxsIGJlIGxvY2F0ZWQgdW5kZXIgCisgICAgb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRcc29ydFw8VGhyZWUgbGV0dGVyIGlkZW50aWZpZXIgZm9yIGNvdW50cnk+CisKKyoqKkFkbWluMUxleFNvcnRlcjogTGV4aWNvZ3JhcGhpYyBTb3J0aW5nIG9mIExldmVsIDEgQWRtaW5pc3RyYXRpb25zKioqCisgCisgICAgIFRoZSBnb2FsIG9mIHRoaXMgcHJvZ3JhbSBpcyB0byBnbyB0aHJvdWdoIHRoZSBzb3VyY2UgZGF0YSBmaWxlIChpLmUuIFVTQS50eHQgb3IgVVNBX0dST1VQRUQudHh0KSwgZG8gYSBsZXhpY29ncmFwaGljIHNvcnRpbmcsIGFuZCBwcm9kdWNlIGFzIGEgcmVzdWx0IGEgZmlsZSB3aGVyZSAKK2VhY2ggcm93IGNvcnJlc3BvbmRzIHRvIGEgbGV2ZWwgMSBhZG1pbmlzdHJhdGlvbiBieSBsZXhpY29ncmFwaGljIG9yZGVyaW5nLiBBcyBhbiBleGFtcGxlLCBmb3IgdGhlIGNhc2Ugb2YgQXJnZW50aW5hLCB0aGUgcmVzdWx0IHdvdWxkIGxvb2tzIGxpa2UgdGhpcyA6CisKKzE6QVItQjpBUjpCVUVOT1MgQUlSRVMKKzI6QVItQzpBUjpCVUVOT1MgQUlSRVMgRC5GLgorMzpBUi1LOkFSOkNBVEFNQVJDQQorNDpBUi1IOkFSOkNIQUNPCis1OkFSLVU6QVI6Q0hVQlVUCis2OkFSLVg6QVI6Q09SRE9CQQorNzpBUi1XOkFSOkNPUlJJRU5URVMKKzg6QVItRTpBUjpFTlRSRSBSSU9TCis5OkFSLVA6QVI6Rk9STU9TQQorMTA6QVItWTpBUjpKVUpVWQorMTE6QVItTDpBUjpMQSBQQU1QQQorMTI6QVItRjpBUjpMQSBSSU9KQQorMTM6QVItTTpBUjpNRU5ET1pBCisxNDpBUi1OOkFSOk1JU0lPTkVTCisxNTpBUi1ROkFSOk5FVVFVRU4KKzE2OkFSLVI6QVI6UklPIE5FR1JPCisxNzpBUi1BOkFSOlNBTFRBCisxODpBUi1KOkFSOlNBTiBKVUFOCisxOTpBUi1EOkFSOlNBTiBMVUlTCisyMDpBUi1aOkFSOlNBTlRBIENSVVoKKzIxOkFSLVM6QVI6U0FOVEEgRkUKKzIyOkFSLUc6QVI6U0FOVElBR08gREVMIEVTVEVSTworMjM6QVItVjpBUjpUSUVSUkEgREVMIEZVRUdPCisyNDpBUi1UOkFSOlRVQ1VNQU4KKworICAgVGhlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyBsZXhpY29ncmFwaGljYWxseS1zb3J0ZWQgZmlsZSBmb3IgQXJnZW50aW5hIGlzIEFSR19BRE1JTjFfTEVYLnR4dCBhbmQgZm91bmQgdW5kZXIgb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRcc29ydFxBUkcgCisKKyoqKkFkbWluMkxleFNvcnRlcjogTGV4aWNvZ3JhcGhpYyBTb3J0aW5nIG9mIExldmVsIDIgQWRtaW5pc3RyYXRpb25zKioqCisKKyAgICAgIFNpbWlsYXIgdG8gQWRtaW4yTGV4U29ydGVyLCBleGNlcHQgdGhhdCBub3cgd2Ugc29ydCBsZXhpY29ncmFwaGljYWxseSBiYXNlZCBvbiBhIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBsZXZlbCAxIGFuZCBsZXZlbCAyIGFkbWluaXN0cmF0aW9ucy4gVGhpcyBjb25jYXRlbmF0aW9uIGhhcyAKK3RoZSBlZmZlY3Qgb2Ygc29ydGluZyBhbGwgbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbnMgd2l0aGluIGl0cyBsZXZlbCAxIGNvbnRhaW5lci4gQXMgYW4gZXhhbXBsZSwgdGhlIHJlc3VsdCBvZiBzb3J0aW5nIGFsbCBsZXZlbCAyIGFkbWluaXN0cmF0aW9ucyB0aGF0IGJlbG9uZyB0byB0aGUgcHJvdmluY2UgCisobGV2ZWwgMSBhZG1pbmlzdHJhdGlvbikgb2YgTGEgUmlvamEgaW4gQXJnZW50aW5hLCB3ZSBnZXQgOgorCisvLyBFeHRyYWN0ZWQgZnJvbSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxzb3J0XEFSR19BRE1JTjJfTEVYLnR4dAorLi4uCisxOkFSOkFSRzpBUkdFTlRJTkE6TEEgUklPSkE6QXJhdWNvCisyOkFSOkFSRzpBUkdFTlRJTkE6TEEgUklPSkE6Q2FwaXRhbAorMzpBUjpBUkc6QVJHRU5USU5BOkxBIFJJT0pBOkNhc3RybyBCYXJyb3MKKzQ6QVI6QVJHOkFSR0VOVElOQTpMQSBSSU9KQTpDaGlsZWNpdG8KKzU6QVI6QVJHOkFSR0VOVElOQTpMQSBSSU9KQTpGYW1hdGluYQorNjpBUjpBUkc6QVJHRU5USU5BOkxBIFJJT0pBOkdlbmVyYWwgQW5nZWwgVi4gUGVzYWxvemEKKzc6QVI6QVJHOkFSR0VOVElOQTpMQSBSSU9KQTpHZW5lcmFsIEJlbGdyYW5vCis4OkFSOkFSRzpBUkdFTlRJTkE6TEEgUklPSkE6R2VuZXJhbCBKdWFuIEYuIFF1aXJvZ2EKKzk6QVI6QVJHOkFSR0VOVElOQTpMQSBSSU9KQTpHZW5lcmFsIExhbWFkcmlkCisxMDpBUjpBUkc6QVJHRU5USU5BOkxBIFJJT0pBOkdlbmVyYWwgTGF2YWxsZQorMTE6QVI6QVJHOkFSR0VOVElOQTpMQSBSSU9KQTpHZW5lcmFsIE9jYW1wbworMTI6QVI6QVJHOkFSR0VOVElOQTpMQSBSSU9KQTpHZW5lcmFsIFNhbiBNYXJ0aW4KKzEzOkFSOkFSRzpBUkdFTlRJTkE6TEEgUklPSkE6R2VuZXJhbCBTYXJtaWVudG8KKzE0OkFSOkFSRzpBUkdFTlRJTkE6TEEgUklPSkE6R29iZXJuYWRvciBHb3JkaWxsbworMTU6QVI6QVJHOkFSR0VOVElOQTpMQSBSSU9KQTpJbmRlcGVuZGVuY2lhCisxNjpBUjpBUkc6QVJHRU5USU5BOkxBIFJJT0pBOlJvc2FyaW8gVmVyYSBQZW5hbG96YQorMTc6QVI6QVJHOkFSR0VOVElOQTpMQSBSSU9KQTpTYW4gQmxhcyBkZSBsb3MgU2F1Y2VzCisxODpBUjpBUkc6QVJHRU5USU5BOkxBIFJJT0pBOlNhbmFnYXN0YQorLi4uCisgICAgICAKK1NpbWlsYXJseSwgdGhlIHByb3ZpbmNlIG9mIENvcmRvYmEgaW4gQXJnZW50aW5hLCB0aGUgc29ydGluZyBwcm9kdWNlcyA7CisKKy8vIEV4dHJhY3RlZCBmcm9tIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXGlucHV0XHNvcnRcQVJHX0FETUlOMl9MRVgudHh0CisuLi4KKzE6QVI6QVJHOkFSR0VOVElOQTpNRU5ET1pBOkNhcGl0YWwKKzI6QVI6QVJHOkFSR0VOVElOQTpNRU5ET1pBOkdlbmVyYWwgQWx2ZWFyCiszOkFSOkFSRzpBUkdFTlRJTkE6TUVORE9aQTpHb2RveSBDcnV6Cis0OkFSOkFSRzpBUkdFTlRJTkE6TUVORE9aQTpHdWF5bWFsbGVuCis1OkFSOkFSRzpBUkdFTlRJTkE6TUVORE9aQTpKdW5pbgorNjpBUjpBUkc6QVJHRU5USU5BOk1FTkRPWkE6TGEgUGF6Cis3OkFSOkFSRzpBUkdFTlRJTkE6TUVORE9aQTpMYXMgSGVyYXMKKzg6QVI6QVJHOkFSR0VOVElOQTpNRU5ET1pBOkxhdmFsbGUKKzk6QVI6QVJHOkFSR0VOVElOQTpNRU5ET1pBOkx1amFuCisxMDpBUjpBUkc6QVJHRU5USU5BOk1FTkRPWkE6TWFpcHUKKzExOkFSOkFSRzpBUkdFTlRJTkE6TUVORE9aQTpNYWxhcmdlCisxMjpBUjpBUkc6QVJHRU5USU5BOk1FTkRPWkE6Uml2YWRhdmlhCisxMzpBUjpBUkc6QVJHRU5USU5BOk1FTkRPWkE6U2FuIENhcmxvcworMTQ6QVI6QVJHOkFSR0VOVElOQTpNRU5ET1pBOlNhbiBNYXJ0aW4KKzE1OkFSOkFSRzpBUkdFTlRJTkE6TUVORE9aQTpTYW4gUmFmYWVsCisxNjpBUjpBUkc6QVJHRU5USU5BOk1FTkRPWkE6U2F0YSBSb3NhCisxNzpBUjpBUkc6QVJHRU5USU5BOk1FTkRPWkE6VHVudXlhbgorMTg6QVI6QVJHOkFSR0VOVElOQTpNRU5ET1pBOlR1cHVuZ2F0bworLi4uICAgICAgCisKKypPdGhlciBTb3VyY2VzIG9mIERhdGEgVXNlZCBmb3IgRGF0YSBHZW5lcmF0aW9uKgorICAgICAgCisqKkFyZWEgYW5kIFBvcHVsYXRpb24gRGF0YSA6IEdlb0hpdmUgYW5kIENpdHlQb3B1bGF0aW9uKioKKworICAgTW9zdCBvZiB0aGUgYXJlYSBhbmQgcG9wdWxhdGlvbiBkYXRhIHdlIHVzZSB3YXMgZG93bmxvYWRlZCBmcm9tIEdlb0hpdmUgKGh0dHA6Ly93d3cuZ2VvaGl2ZS5jb20vZGVmYXVsdDEuYXNweCkuIEdlb0hpdmUgCitpcyBhIHNpdGUgd2l0aCBnZW9wb2xpdGljYWwgZGF0YSBhbmQgc3RhdGlzdGljcyBvbiB0aGUgaHVtYW4gcG9wdWxhdGlvbi4gSG93ZXZlciwgd2UgYWxzbyBmb3VuZCBkYXRhIGF0IENpdHkgUG9wdWxhdGlvbiAoaHR0cDovL3d3dy5jaXR5cG9wdWxhdGlvbi5kZS8pLgorQ2l0eSBQb3B1bGF0aW9uJ3Mgc2l0ZSBwcm92aWRlcyBnbG9iYWwgcG9wdWxhdGlvbiBzdGF0aXN0aWNzLgorCisKKyoqSVNPIDMxNjYgRGF0YSoqCisKKyAgIFRoZSBtYWluIHNvdXJjZSBvZiBJU08gMzE2NiBkYXRhIGlzIGFuIG9mZmljaWFsIElTTyAzMTY2IGRhdGFiYXNlIHB1cmNoYXNlZCBmcm9tIElTTyAoSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24KK2ZvciBTdGFuZGFyZGl6YXRpb24pLiBUaGUgZGF0YWJhc2UgY29udGFpbnMgZGF0YSBmb3IgYm90aCBJU08gMzE2Ni0xIGFuZCBJU08gMzE2Ni0yLgorCisqKkxleGljb2dyYXBoaWNhbGx5IFNvcnRlZCBEYXRhKioKKworICAgVGhpcyBpcyBhIHNldCBvZiBkYXRhIGZpbGVzIGdlbmVyYXRlZCBieSBydW5uaW5nIEFkbWluMUxleFNvcnRlciBhbmQgQWRtaW4yTGV4U29ydGVyLiBUaGlzIGRhdGEgd2lsbCBiZSB1c2VmdWwgd2hlbiBjcmVhdGluZyAKK2lkZW50aWZpZXJzIGZvciBlYWNoIGxvY2F0aW9uIGR1cmluZyB0aGUgZGF0YSBnZW5lcmF0aW9uIHByb2Nlc3MuCisKKyoqVVJMcyoqCisKKyAgIFRoaXMgaXMgdGhlIHNldCBvZiBkYXRhIGZpbGVzIGNvbnRhaW5pbmcgVVJMcyBmb3IgZXZlcnkgZGF0YSB3ZSBmb3VuZCBvbmxpbmUuIFdlIGtlcHQgdHJhY2sgb2YgYWxsIHRoZSBzb3VyY2VzIG9mIG91ciBkYXRhIGFuZCBhbGwgb2YgdGhlbQorYXJlIGFjY291bnRlZCBmb3IuIEZvciBlYWNoIGNvdW50cnksIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyBVUkwgZmlsZSBmb3VuZCB1bmRlciBvcmcuZWNsaXBzZS5zdGVtL2RhdGFNaWdyYXRpb24vaW5wdXQvdXJscy4gQSBVUkwgZmlsZSBjb25zaXN0cyAKK29mIHJvd3Mgb2YgdGhlIGZvcm0gOiBLRVlXT1JEOlVSTCBGb3IgZXhhbXBsZSwgZm9yIHRoZSBjb3VudHJ5IG9mIElyYWssIGl0cyBjb3JyZXNwb25kaW5nIFVSTCBmaWxlIGxvb2tzIGxpa2UgOgorCisvLyBFeHRyYWN0ZWQgZnJvbSBvcmcuZWNsaXBzZS5zdGVtL2RhdGFNaWdyYXRpb24vaW5wdXQvdXJscworR0VPSElWRSpodHRwOi8vd3d3Lnhpc3Qub3JnL2NudHJ5L2lyYXEuYXNweAorV0lLSSpodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lyYWsKK0NJVFlQT1AqaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JcmFrCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPUlSUSZUSEVNRT1fYWRtCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvaXouaHRtbAorICAgICAgCisgICAgICAKKypEYXRhIEdlbmVyYXRvcnMqCisKKyoqSW50cm9kdWN0aW9uKioKKworICAgQSBkYXRhIGdlbmVyYXRvciBpcyBhIHNpbXBsZSBKYXZhIHByb2dyYW0gdGhhdCB0YWtlcyBhcyBpbnB1dCBhIGZpbGUgb3IgYSBzZXQgb2YgZmlsZXMgZnJvbSB0aGUgRGl2YSBzZXQgYW5kIHByb2R1Y2VzIGFzIG91dHB1dCBhIHByb3BlcnR5IGZpbGUgZm9yIFNURU0uCitBcyBpdCBwcm9jZXNzZXMgZGF0YSwgYSBnZW5lcmF0b3IgZ29lcyB0aHJvdWdoIHRyYW5zaXRpb25zIGFjY29yZGluZyB0byB0aGUgYWRtaW5pc3RyYXRpdmUgbGV2ZWwgb2YgdGhlIGRhdGEgdGhhdCBpdCBpcyBjdXJyZW50bHkgcHJvY2Vzc2luZy4gSXQgaXMgZXhwZWN0ZWQKK3RoYXQgdGhlIGxldmVsIG9mIGRhdGEgd2lsbCBmb2xsb3cgdGhlIHBhdHRlcm4gb2YgdHJhbnNpdGlvbnMgOiBMZXZlbF8wIC0+IExldmVsXzEgLT4gTGV2ZWxfMi4gV2Ugbm93IGV4cGxhaW4gdGhlIGZ1bmN0aW9uIG9mIGVhY2ggZGF0YSBnZW5lcmF0b3IuCisgCisqKkdlbmVyYXRpb24gb2YgTmFtZXMgUHJvcGVydGllcyBGaWxlcyoqCisgICAKKyAgICAgIFRvIGdlbmVyYXRlIGEgbmFtZSBwcm9wZXJ0eSBmaWxlLCB3ZSBydW4gb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHNyY1xnZW5lcmF0b3JzXE5hbWVHZW5lcmF0b3IuamF2YS4gQWZ0ZXIgcnVubmluZyBOYW1lR2VuZXJhdG9yLCB0aGUgcmVzdWx0IGlzIGEgCituZXcgbmFtZSBwcm9wZXJ0eSBmaWxlIGZvciBhIGdpdmVuIGNvdW50cnkuIFRoZSBjb3JyZXNwb25kaW5nIG5hbWUgZmlsZSBmb3IgQXJnZW50aW5hIGxvb2tzIGFzIGZvbGxvd3MgOgorCisvLyBFeHRyYWN0ZWQgZnJvbSBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhXHJlc291cmNlc1xkYXRhXGNvdW50cnlcQUdPXEFHT19uYW1lcy5wcm9wZXJ0aWVzLgorLi4uCisjIExldmVsIDEgKGFkbWluIDEgPSBlLmcuLCBzdGF0ZSkKK0FPLUJHTyA9IEJFTkdPCitBTy1CR1UgPSBCRU5HVUVMQQorQU8tQklFID0gQklFCitBTy1DQUIgPSBDQUJJTkRBCitBTy1DQ1UgPSBDVUFORE8gQ1VCQU5HTworLi4uCisKKyAgICAgIFRoZSBwdXJwb3NlIG9mIGEgbmFtZXMgcHJvcGVydHkgZmlsZSBpcyB0byBkZWZpbmUgdGhlIGlkZW50aWZpZXJzIGZvciBldmVyeSBhZG1pbmlzdHJhdGl2ZSBkaXZpc2lvbiBpbiBhIGNvdW50cnkgYXQgZWFjaCBsZXZlbC4KK0Egc2luZ2xlIG5hbWVzIHByb3BlcnR5IGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIGV2ZXJ5IGNvdW50cnkuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFNURU0ncyBwcm9wZXJ0aWVzIGZpbGVzLCBwbGVhc2UgcmVhZCAiQW4gSW50cm9kdWN0aW9uIFRvIFNURU0gUHJvcGVydGllcyBGaWxlcyIgCitmb3VuZCBhdCBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZG9jcy4KKyAgICAgIAorKipHZW5lcmF0aW9uIG9mIE5vZGVzIFByb3BlcnRpZXMgRmlsZXMqKgorCisgICAgIFRvIGdlbmVyYXRlIGEgbm9kZSBwcm9wZXJ0eSBmaWxlLCB3ZSBydW4gb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XHNyY1xnZW5lcmF0b3JzXE5vZGVHZW5lcmF0b3IuamF2YS4gQWZ0ZXIgcnVubmluZyBOb2RlR2VuZXJhdG9yLCB0aGUgcmVzdWx0IGlzIGEgCituZXcgbm9kZSBwcm9wZXJ0eSBmaWxlIGZvciBhIGdpdmVuIGNvdW50cnkuIEZvciBhIHNpbmdsZSBjb3VudHJ5LCBhIG5vZGUgcHJvcGVydHkgZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgZWFjaCBhZG1pbmlzdHJhdGl2ZSBsZXZlbC4gRm9yIEFyZ2VudGluYSwgdGhlIGNvcnJlc3BvbmRpbmcgbm9kZQorcHJvcGVydHkgZmlsZXMgcHJvZHVjZWQgd2lsbCBiZSA6CisKK0FSR18wX25vZGUucHJvcGVydGllcworQVJHXzFfbm9kZS5wcm9wZXJ0aWVzCitBUkdfMl9ub2RlLnByb3BlcnRpZXMKKworICAgICAgQSBzYW1wbGUgbm9kZSBwcm9wZXJ0eSBmaWxlIGZvciBBcmdlbnRpbmEgbG9va3MgYXMgZm9sbG93cyA6CisgICAgICAgICAgIAorLy8gRXh0cmFjdGVkIGZyb20gb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhXHJlc291cmNlc1xkYXRhXGNvdW50cnlcQVJHXzFfbm9kZS5wcm9wZXJ0aWVzCisuLi4KK0FSLUIgPSBCVUVOT1MgQUlSRVMsIDAxLCBCCitBUi1DID0gQlVFTk9TIEFJUkVTIEQuRi4sIDAyLCBDCitBUi1LID0gQ0FUQU1BUkNBLCAwMywgSworQVItSCA9IENIQUNPLCAwNCwgSAorQVItVSA9IENIVUJVVCwgMDUsIFUKK0FSLVggPSBDT1JET0JBLCAwNiwgWAorQVItVyA9IENPUlJJRU5URVMsIDA3LCBXCitBUi1FID0gRU5UUkUgUklPUywgMDgsIEUKK0FSLVAgPSBGT1JNT1NBLCAwOSwgUAorQVItWSA9IEpVSlVZLCAxMCwgWQorQVItTCA9IExBIFBBTVBBLCAxMSwgTAorQVItRiA9IExBIFJJT0pBLCAxMiwgRgorQVItTSA9IE1FTkRPWkEsIDEzLCBNCitBUi1RID0gTkVVUVVFTiwgMTUsIFEKK0FSLVIgPSBSSU8gTkVHUk8sIDE2LCBSCitBUi1BID0gU0FMVEEsIDE3LCBBCitBUi1KID0gU0FOIEpVQU4sIDE4LCBKCitBUi1EID0gU0FOIExVSVMsIDE5LCBECitBUi1aID0gU0FOVEEgQ1JVWiwgMjAsIFoKK0FSLVMgPSBTQU5UQSBGRSwgMjEsIFMKK0FSLUcgPSBTQU5USUFHTyBERUwgRVNURVJPLCAyMiwgRworQVItViA9IFRJRVJSQSBERUwgRlVFR08sIDIzLCBWCitBUi1UID0gVFVDVU1BTiwgMjQsIFQKK0FSLU4gPSBNSVNJT05FUywgMTQsIE4KKy4uLiAgICAgICAgICAgIAorCisJIFRoZSBwdXJwb3NlIG9mIGEgbm9kZSBwcm9wZXJ0eSBmaWxlIGlzIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBpZGVudGlmaWVycyBvZiBhZG1pbmlzdHJhdGl2ZSBkaXZpc2lvbnMuIEZvciBtb3JlCitpbmZvcm1hdGlvbiBvbiBTVEVNJ3MgcHJvcGVydGllcyBmaWxlcywgcGxlYXNlIHJlYWQgIkFuIEludHJvZHVjdGlvbiBUbyBTVEVNIFByb3BlcnRpZXMgRmlsZXMiIGZvdW5kIGF0IG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkb2NzLgorCisgICAgCisqKkdlbmVyYXRpb24gb2YgUG9wdWxhdGlvbiBQcm9wZXJ0aWVzIEZpbGVzKioKKworCQlUaGVyZSBhcmUgdHdvIGludGVybWVkaWF0ZSBzdGVwcyB0byBiZSBkb25lIGJlZm9yZSBnZW5lcmF0aW5nIGEgcG9wdWxhdGlvbiBwcm9wZXJ0eSBmaWxlLiBGaXJzdCwgd2UgaGF2ZSB0byBydW4gYm90aCwgQWRtaW4xTGV4U29ydGVyIGFuZCBBZG1pbjJMZXhTb3J0ZXIgdG8gZ2VuZXJhdGUgYSBzZXQgb2YgZmlsZXMgd2VyZQorYWRtaW5pc3RyYXRpb25zIGZvciBhIGdpdmVuIGNvdW50cnkgYXJlIHNvcnRlZCBsZXhpY29ncmFwaGljYWxseSBhcyB3YXMgcHJldmlvdXNseSBleHBsYWluZWQgaW4gdGhpcyBkb2N1bWVudC4gTmV4dCwgd2UgcnVuIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzXFBvcHVsYXRpb25Qcm9maWxlci5qYXZhLgorUG9wdWxhdGlvblByb2ZpbGVyLmphdmEgaXMgYSBwcm9ncmFtIHRoYXQgY3JlYXRlcyBhIHByb2ZpbGUgb2YgYWxsIHRoZSBsZXZlbCAxIGFkbWluaXN0cmF0aW9ucyBvZiBhIGNvdW50cnkgYmFzZWQgb24gcG9wdWxhdGlvbiBhbmQgb24gdGhlIG51bWJlciBvZgorbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbnMgdGhhdCBiZWxvbmcgb3IgYXJlIGNvbnRhaW5lZCBpbiBpdC4gVGhpcyBpcyBhIG5lY2Vzc2FyeSBzdGVwIHNpbmNlIHdlIGFyZSBtaXNzaW5nIHNvbWUgZXhhY3QgcG9wdWxhdGlvbiBkYXRhIGFuZCBieSBrbm93aW5nIHRoZSByZWxhdGlvbnNoaXAgb2YgbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbiB0byBpdHMgCitjb250YWluZXIgd2UgY2FuIGVhc2lseSBjb21wdXRlIGFuIGFwcHJveGltYXRlIHBvcHVsYXRpb24gdmFsdWUuIEZpbmFsbHksIHdlIHJ1biBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcUG9wdWxhdGlvbkdlbmVyYXRvci5qYXZhIHRvIGdlbmVyZXJhdGUgYSBwb3B1bGF0aW9uIHByb3BlcnR5IGZpbGUuIEZvciBhIHNpbmdsZSBjb3VudHJ5LCAKK2EgcG9wdWxhdGlvbiBwcm9wZXJ0eSBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBlYWNoIGFkbWluaXN0cmF0aXZlIGxldmVsLiBGb3IgQXJnZW50aW5hLCB0aGUgY29ycmVzcG9uZGluZyBwb3B1bGF0aW9uIHByb3BlcnR5IGZpbGVzIHByb2R1Y2VkIHdpbGwgYmUgOgorCitBUkdfMF9odW1hbl8yMDA2LnByb3BlcnRpZXMKK0FSR18xX2h1bWFuXzIwMDYucHJvcGVydGllcworQVJHXzJfaHVtYW5fMjAwNi5wcm9wZXJ0aWVzCisJCQorCQkgQSBzYW1wbGUgbm9kZSBwcm9wZXJ0eSBmaWxlIGZvciBBcmdlbnRpbmEgbG9va3MgYXMgZm9sbG93cyA6CisKKy8vIEV4dHJhY3RlZCBmcm9tIG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YVxyZXNvdXJjZXNcZGF0YVxjb3VudHJ5XEFSR18xX2h1bWFuXzIwMDYucHJvcGVydGllcworLi4uCisjIFRoZSBwb3B1bGF0aW9uIGlkZW50aWZpZXIKK1BPUFVMQVRJT04gPSBodW1hbgorCisjIFN0YXRlL1Byb3ZpbmNlCitBUi1CID0gMTM4MjcyMDMKK0FSLUMgPSAyNzc2MTM4CitBUi1LID0gMzM0NTY4CitBUi1IID0gOTg0NDQ2CitBUi1VID0gNDEzMjM3CitBUi1YID0gMzA2NjgwMQorQVItVyA9IDkzMDk5MQorQVItRSA9IDExNTgxNDcKK0FSLVAgPSA0ODY1NTkKK0FSLVkgPSA2MTE4ODgKK0FSLUwgPSAyOTkyOTQKK0FSLUYgPSAyODk5ODMKK0FSLU0gPSAxNTc5NjUxCitBUi1RID0gNDc0MTU1CisuLi4KKworICAgIFRoZSBwdXJwb3NlIG9mIGEgcG9wdWxhdGlvbiBwcm9wZXJ0eSBmaWxlIGlzIHRvIHByb3ZpZGUgcG9wdWxhdGlvbiBkYXRhIG9mIGFkbWluaXN0cmF0aXZlIGRpdmlzaW9ucy4gRm9yIG1vcmUgCitpbmZvcm1hdGlvbiBvbiBTVEVNJ3MgcHJvcGVydGllcyBmaWxlcywgcGxlYXNlIHJlYWQgIkFuIEludHJvZHVjdGlvbiBUbyBTVEVNIFByb3BlcnRpZXMgRmlsZXMiIGZvdW5kIGF0IG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkb2NzLgorICAgIAorCisqKkdlbmVyYXRpb24gb2YgQXJlYSBQcm9wZXJ0aWVzIEZpbGVzKioKKworCUluIGEgc2ltaWxhciB3YXkgdG8gdGhlIHBvcHVsYXRpb24gZ2VuZXJhdGlvbiBwcm9jZXNzLCB0aGVyZSBpcyBhbiBpbnRlcm1lZGlhdGUgc3RlcCB0byBiZSBkb25lIGJlZm9yZSBnZW5lcmF0aW5nIGFuIGFyZWEgcHJvcGVydHkgZmlsZS4gV2UgaGF2ZSB0byBydW4KK29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxQb2x5Z29uQXJlYUdlbmVyYXRvci5qYXZhIHRvIGdlbmVyYXRlIGEgc2V0IG9mIGZpbGVzIHdpdGggYXJlYXMgaW4gcG9seWdvbiB1bml0cyBmb3IgZXZlcnkgYWRtaW5pc3RyYXRpb24gaW4gYSBjb3VudHJ5LiBUaGlzIGlzIAorYSBuZWNlc3Nhcnkgc3RlcCBzaW5jZSB3ZSBhcmUgbWlzc2luZyBzb21lIGV4YWN0IGFyZWEgZGF0YS4gSGF2aW5nIHBvbHlnb24gYXJlYSB2YWx1ZXMgKGluIHBvbHlnb24gdW5pdHMpIGhlbHBzIHRvIGNvbXB1dGUgYW4gYXBwcm94aW1hdGUgYXJlYSB2YWx1ZS4gRmluYWxseSwgCit3ZSBydW4gb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XEFyZWFHZW5lcmF0b3IuamF2YSB0byBnZW5lcmVyYXRlIGFuIGFyZWEgcHJvcGVydHkgZmlsZS4gRm9yIGEgc2luZ2xlIGNvdW50cnksIGFuIGFyZWEgcHJvcGVydHkgZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgZWFjaCAKK2FkbWluaXN0cmF0aXZlIGxldmVsLiAgRm9yIEFyZ2VudGluYSwgdGhlIGNvcnJlc3BvbmRpbmcgYXJlYSBwcm9wZXJ0eSBmaWxlcyBwcm9kdWNlZCB3aWxsIGJlIDoKKworQVJHXzBfYXJlYS5wcm9wZXJ0aWVzCitBUkdfMV9hcmVhLnByb3BlcnRpZXMKK0FSR18yX2FyZWEucHJvcGVydGllcworCQkKKwkJIEEgc2FtcGxlIGFyZWEgcHJvcGVydHkgZmlsZSBmb3IgQXJnZW50aW5hIGxvb2tzIGFzIGZvbGxvd3MgOgorCisvLyBFeHRyYWN0ZWQgZnJvbSBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGFccmVzb3VyY2VzXGRhdGFcY291bnRyeVxBUkdfMV9hcmVhLnByb3BlcnRpZXMKKy4uLgorIyBUaGlzIGlzIHRoZSBzb3VyY2Ugb2YgdGhlIGRhdGEKK1NPVVJDRSA9IGh0dHA6Ly93d3cueGlzdC5vcmcvY250cnkvYXJnZW50aW5hLmFzcHgKKyMgU09VUkNFID0gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BcmdlbnRpbmEKKworIyBTdGF0ZS9Qcm92aW5jZQorQVItQiA9IDMwNzU3MQorQVItQyA9IDIwMAorQVItSyA9IDEwMjYwMgorQVItSCA9IDk5NjMzCitBUi1VID0gMjI0Njg2CitBUi1YID0gMTY1MzIxCitBUi1XID0gODgxOTkKK0FSLUUgPSA3ODc4MQorQVItUCA9IDcyMDY2CitBUi1ZID0gNTMyMTkKK0FSLUwgPSAxNDM0NDAKK0FSLUYgPSA4OTY4MAorQVItTSA9IDE0ODgyNworQVItUSA9IDk0MDc4CitBUi1SID0gMjAzMDEzCisuLi4KKworICAgIFRoZSBwdXJwb3NlIG9mIGFuIGFyZWEgcHJvcGVydHkgZmlsZSBpcyB0byBwcm92aWRlIGFyZWEgZGF0YSBvZiBhZG1pbmlzdHJhdGl2ZSBkaXZpc2lvbnMuIEZvciBtb3JlIAoraW5mb3JtYXRpb24gb24gU1RFTSdzIHByb3BlcnRpZXMgZmlsZXMsIHBsZWFzZSByZWFkICJBbiBJbnRyb2R1Y3Rpb24gVG8gU1RFTSBQcm9wZXJ0aWVzIEZpbGVzIiBmb3VuZCBhdCBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZG9jcy4KKyAgICAKKworKipNYXAgR2VuZXJhdGlvbioqCisgIAorICAgICBUbyBnZW5lcmF0ZSBtYXBzIHdlIHJ1biBhbiBpbnN0YW5jZSBvZiBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcc3JjXGdlbmVyYXRvcnNcR01MR2VuZXJhdG9yLiBHTUxHZW5lcmF0b3Igd2lsbCBjcmVhdGUgYW5kIFhNTCBmaWxlIGZvciBlYWNoIGNvdW50cnkgaW4gb3VyIGRhdGFzZXQuCitUaGUgbWFwcyBhcmUgY3JlYXRlZCB1c2luZyBHTUwgKEdlb2dyYXBoeSBNYXJrdXAgTGFuZ3VhZ2UpIHdoaWNoIGlzIGFuIFhNTCBncmFtbWFyLiBBY2NvcmRpbmcgdG8gV2lraXBlZGlhLCAiIFRoZSBHZW9ncmFwaHkgTWFya3VwIExhbmd1YWdlIChHTUwpIGlzIHRoZSBYTUwgZ3JhbW1hciBkZWZpbmVkIGJ5IHRoZSBPcGVuIEdlb3NwYXRpYWwgQ29uc29ydGl1bSAoT0dDKSB0byBleHByZXNzIAorZ2VvZ3JhcGhpY2FsIGZlYXR1cmVzLiBHTUwgc2VydmVzIGFzIGEgbW9kZWxpbmcgbGFuZ3VhZ2UgZm9yIGdlb2dyYXBoaWMgc3lzdGVtcyBhcyB3ZWxsIGFzIGFuIG9wZW4gaW50ZXJjaGFuZ2UgZm9ybWF0IGZvciBnZW9ncmFwaGljIHRyYW5zYWN0aW9ucyBvbiB0aGUgSW50ZXJuZXQuIiAgQWxsIG1hcHMgYXJlIGZvdW5kIHVuZGVyCitvcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeVxyZXNvdXJjZXNcZGF0YVxnZW9cY291bnRyeVwuIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIG1hcCBmb3IgZWFjaCBjb3VudHJ5LiBJbiBmYWN0LCB0aGVyZSBpcyBhIG1hcCBmb3IgZXZlcnkgYWRtaW5pc3RyYXRpdmUgbGV2ZWwgZm9yIHdoaWNoIHdlIGhhdmUgcG9seWdvbiBkYXRhIGF2YWlsYWJsZS4KK0ZvciBBcmdlbnRpbmEsIHRoZXJlIGFyZSB0aHJlZSBjb3JyZXNwb25kaW5nIG1hcHMgOgorCisJQVJHXzBfTUFQLnhtbAorCUFSR18xX01BUC54bWwKKwlBUkdfMl9NQVAueG1sCisJCitBcyBhbiBleGFtcGxlLCBmb3IgQXJtZW5pYSB0aGUgY29udGVudHMgb2YgdGhlIGxldmVsIDEgbWFwIGxvb2tzIGFzIGZvbGxvd3MgOgorCisjIFRha2VuIGZyb20gQVJNXzFfTUFQLnhtbAorPE1hcD4KKworPHRpdGxlPkFSTSBMZXZlbCAxIE1hcDwvdGl0bGU+CisKKzxzdWJUaXRsZT5BZG1pbmlzdHJhdGl2ZSBCb3VuZGFyaWVzPC9zdWJUaXRsZT4KKworPHVwZGF0ZWQ+VHVlIE5vdiAwNyAxNjo1Nzo1NSBQU1QgMjAwNiA8L3VwZGF0ZWQ+CisKKwk8ZW50cnk+CisKKwk8Z2VvcnNzOndoZXJlPgorCisJICA8Z21sOlBvbHlnb24gZ21sOmlkPSJBTS1FUiI+CisKKwkgICAgPGdtbDpvdXRlckJvdW5kYXJ5SXM+CisKKwkgICAgICAgPGdtbDpMaW5lYXJSaW5nPgorCisJICAgICAgICAgPGdtbDpwb3NMaXN0PgorCisJCSAgICAgICAgIDQxLjMwMTQyMiA0NS4wMDQwNTUgLi4uIDQxLjMwMTYyNCA0NS4wMDAwMDIgNDEuMzAxNDIyIDQ1LjAwNDA1NSAKKwkJCisgICAJICAgICAgICA8L2dtbDpwb3NMaXN0PgorCisgICAgICAgICAgPC9nbWw6TGluZWFyUmluZz4KKworICAgICAgIDwvZ21sOm91dGVyQm91bmRhcnlJcz4KKworICAgICA8L2dtbDpQb2x5Z29uPgorCisgICAgPC9nZW9yc3M6d2hlcmU+CisKKyAgIDwvZW50cnk+CisKKzwvTWFwPgorCisKKyoqUHV0dGluZyBJdCBBbGwgVG9nZXRoZXIgOiBydW5uaW5nIFByb3BlcnRpZXMgR2VuZXJhdG9yKioKKworICAgVG8gYmUgYWJsZSB0byBydW4gcHJvcGVydGllcyBmaWxlcyBhbmQgbWFwcyB3ZSBoYXZlIGRldmVsb3BlZCBhIHByb2dyYW0gd2hvc2UgcHVycG9zZSBpcyB0byBydW4gYWxsIHRoZSBnZW5lcmF0b3JzIG9uIGEgZ2l2ZW4gbGlzdCBvZgorY291bnRyaWVzLiBUbyBkbyB0aGlzLCB3ZSBydW4gb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9nZW5lcmF0b3JzL1Byb3BlcnRpZXNHZW5lcmF0b3IuamF2YS4gVGhlIGdlbmVyYXRvciB3aWxsIGdvIHRocm91Z2ggZWFjaCBzaW5nbGUKK2NvdW50cnkgaW4gdGhlIGxpc3QgYW5kIGRvIGFsbCBuZWNlc3Nhcnkgd29yay4gVGhlIG1haW4gbG9naWMgZm9yIFByb3BlcnRpZXNHZW5lcmF0b3IgaXMgc2hvd24gbmV4dCA6CisKKworCQkuLi4KKwkJZmluYWwgaW50IENPTkZJR19GSUxFID0gMDsKKwkJZmluYWwgaW50IFBBUkFNUyA9IDE7CisKKwkJaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tV3JvbmcgYXJndW1lbnRzLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRUbyBydW4sIHBsZWFzZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnQocykgOiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IENvbmZpZ3VyYXRpb24gZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJfQorCisJCS8vIEdlbmVyYXRlIHRoZSBuYW1lcy5wcm9wZXJ0aWVzIGZpbGVzIGZvciBlYWNoIGNvdW50cnkuCisJCU5hbWVHZW5lcmF0b3IgbmFtZUdlbiA9IG5ldyBOYW1lR2VuZXJhdG9yKGFyZ3NbQ09ORklHX0ZJTEVdKTsKKwkJbmFtZUdlbi5ydW4oKTsKKworCQkvLyBSdW4gZ2FyYmFnZSBjb2xsZWN0aW9uCisJCVN5c3RlbS5nYygpOworCisJCS8vIEdlbmVyYXRlIHRoZSBwb3B1bGF0aW9uLnByb3BlcnRpZXMgZmlsZXMgZm9yIGVhY2ggY291bnRyeS4KKwkJUG9wdWxhdGlvbkdlbmVyYXRvciBwb3BHZW4gPSBuZXcgUG9wdWxhdGlvbkdlbmVyYXRvcihhcmdzW0NPTkZJR19GSUxFXSk7CisJCXBvcEdlbi5ydW4oKTsKKworCQkvLyBSdW4gZ2FyYmFnZSBjb2xsZWN0aW9uCisJCVN5c3RlbS5nYygpOworCisJCS8vIEdlbmVyYXRlIHRoZSBhcmVhLnByb3BlcnRpZXMgZmlsZXMgZm9yIGVhY2ggY291bnRyeS4KKwkJQXJlYUdlbmVyYXRvciBhcmVhR2VuID0gbmV3IEFyZWFHZW5lcmF0b3IoYXJnc1tDT05GSUdfRklMRV0pOworCQlhcmVhR2VuLnJ1bigpOworCisJCS8vIFJ1biBnYXJiYWdlIGNvbGxlY3Rpb24KKwkJU3lzdGVtLmdjKCk7CisKKwkJLy8gR2VuZXJhdGUgdGhlIG5vZGUucHJvcGVydGllcyBmaWxlcyBmb3IgZWFjaCBjb3VudHJ5LgorCQlOb2RlRGF0YUdlbmVyYXRvciBub2RlRGF0YUdlbiA9IG5ldyBOb2RlRGF0YUdlbmVyYXRvcihhcmdzW0NPTkZJR19GSUxFXSk7CisJCW5vZGVEYXRhR2VuLnJ1bigpOworCisJCS8vIFJ1biBnYXJiYWdlIGNvbGxlY3Rpb24KKwkJU3lzdGVtLmdjKCk7CisKKwkJLy8gR2VuZXJhdGUgdGhlIEdNTCBmaWxlcyBmb3IgZWFjaCBjb3VudHJ5LgorCQlHTUxHZW5lcmF0b3IgZ21sR2VuID0gbmV3IEdNTEdlbmVyYXRvcihhcmdzW0NPTkZJR19GSUxFXSk7CisJCWdtbEdlbi5ydW4oKTsKKwkJLi4uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvZG9jcy9BbiBJbnRyb2R1Y3Rpb24gdG8gU1RFTSBJSSBEYXRhIFJlZHVjdGlvbiBVdGlsaXRpZXMgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvZG9jcy9BbiBJbnRyb2R1Y3Rpb24gdG8gU1RFTSBJSSBEYXRhIFJlZHVjdGlvbiBVdGlsaXRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0ZWU0MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9kb2NzL0FuIEludHJvZHVjdGlvbiB0byBTVEVNIElJIERhdGEgUmVkdWN0aW9uIFV0aWxpdGllcwpAQCAtMCwwICsxLDE3NSBAQAorRmViIC0gMDUgLSAyMDA3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKypBbiBJbnRyb2R1Y3Rpb24gdG8gU1RFTSBJSSBEYXRhIFJlZHVjdGlvbiBVdGlsaXRpZXMqCisKKworCSBUaGUgc2l6ZSBvZiB0aGUgbWFwcyBwcm9kdWNlZCBieSB0aGUgZGF0YSBnZW5lcmF0aW9uIHV0aWxpdGllcyBjYW4gYmUgcXVpdGUgbGFyZ2UuIFdoZW4gd2UgcnVuIGEgc2ltdWxhdGlvbiBpbiBTVEVNIElJCit0aGF0IGludm9sdmVzIHRoZSB3aG9sZSB3b3JsZCBpdCBtaWdodCB0YWtlIGEgZmV3IHNlY29uZHMgdG8gbG9hZC4gVGhpcyBpcyBub3RpY2VhYmxlIGFuZCBpcyBleHBlY3RlZCBzaW5jZSBmb3Igc3VjaCBhIAorZ2xvYmFsIHNpbXVsYXRpb24gd2UgZGVhbCB3aXRoIGh1bmRyZWRzIG9mIG1hcHMsIGVhY2ggb2Ygd2hpbGUgY2FuIGJlIHF1aXRlIGJpZy4gQXMgYW4gZXhhbXBsZSwgZm9yIEFyZ2VudGluYSwgd2UgaGF2ZSB0aGUKK2ZvbGxvd2luZyBmaWxlIHNpemVzIDoKKworIEFSR18wX01BUC54bWwgICAgMzE4IEtCCisgQVJHXzFfTUFQLnhtbCAgMSwzNzUgS0IKKyBBUkdfMl9NQVAueG1sICA0LDgxMyBLQiAKKyAKKyAKKyAqKkRhdGEgUmVkdWN0aW9uKioKKyAKKyAgICAgVG8gb3ZlcmNvbWUgdGhpcyBwcm9ibGVtLCB3ZSBjcmVhdGVkIGEgc2V0IG9mIHV0aWxpdGllcyB0aGF0IHByb2R1Y2UgYSByZWR1Y2VkIGRhdGEgc2V0LiBJZGVhbGx5LCB3ZSB3YW50IHRvIHJlZHVjZSB0aGUgCitzaXplIG9mIGEgZmlsZSBieSA1MCUgYnV0IHN0aWxsIGhhdmluZyB0aGUgbWFwcyB0byBkaXNwbGF5IG5pY2VseSB3aXRoIGFzIGZldyBnYXBzIGFuZCBvdmVybGFwcyBhcyBwb3NzaWJsZS4gV2UgY3JlYXRlZCBhIERvd24tc2FtcGxpbmcKK29yIHJlZHVjdGlvbiBhbGdvcml0aG0gZm9yIG91ciBtYXAncyBwb2x5Z29ucyBiYXNlZCBvbiB0aGUgTGF3IG9mIENvc2luZXMgZnJvbSBUcmlnb25vbWV0cnkuIEJ5IGRlcml2YXRpb24gZnJvbSB0aGUgZm9ybXVsYSBmb3IgdGhlIGxhdyBvZiBjb3NpbmVzLAord2UgY2FuIGZpbmQgZWFjaCBvZiB0aGUgaW50ZXJuYWwgYW5nbGVzIG9mIGEgdHJpYW5nbGU6IGFscGhhLCBiZXRhLCBhbmQgZ2FtbWEuIE91ciBEb3duLXNhbXBsaW5nIHdpbGwgY29uc2lzdCBvZiBtYXJraW5nIGZvciBkZWxldGlvbiBhbGwgcG9pbnRzIGluIAorb3VyIHBvbHlnb24gd2hlcmUgdGhlIGFuZ2xlIGlzIGxlc3MgdGhhbiBhIGdpdmVuIHRocmVzaG9sZCwgc2F5IDUgZGVncmVlcywgd2l0aCB0aGUgY29uZGl0aW9uIHRoYXQgb24gYSBzaW5nbGUgcGFzcyB3ZSBjYW5ub3QgZGVsZXRlIHR3byBjb25zZWN1dGl2ZSBwb2ludHMuCitCeSBhdm9pZGluZyB0byBkZWxldGUgdHdvIGNvbnNlY3V0aXZlIHBvaW50cyBkdXJpbmcgdGhlIHNhbWUgcGFzcywgd2UgcmVkdWNlIHRoZSBjaGFuY2Ugb2YgaGF2aW5nIHVuZGVzaXJhYmxlIHZpc3VhbCBhcnRpZmFjdHMgbGlrZSBnYXBzLgorCisqKlRoZSBEb3duLXNhbXBsaW5nIEFsZ29yaXRobSoqCisgCisgICAgIFRoZSBhbGdvcml0aG0gd2UgZGVzaWduZWQgaXMgYW4gaXRlcmF0aXZlIG9uZS4gSXQgaXMgYSByYXRoZXIgc2ltcGxlIG9uZS4gSXQgdGFrZXMgdHdvIGFyZ3VtZW50cywgYSB0aHJlc2hvbGQgaW4gZGVncmVlcyBhbmQgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zLgorVGhlIGFsZ29yaXRobSB3b3JrcyBhcyBmb2xsb3dzLCBldmVyeSB0aHJlZSBwb2ludHMgd2UgYXBwbHkgdGhlIGRlcml2YXRpb24gb2YgdGhlIGxhdyBvZiBjb3NpbmVzIHRvIGZpbmQgZWFjaCBvZiB0aGUgdGhyZWUgaW50ZXJpb3IgYW5nbGVzIGZvciB0aGUgdHJpYW5nbGUgZm9ybWVkCitieSB0aHJlZSBjb25zZWN1dGl2ZSBwb2ludHMuIE5leHQsIHdlIGFwcGx5IGEgY2xldmVyIGFsZ29yaXRobSB0byBkZWNpZGUgd2hpY2ggaXMgdGhlIGJlc3QgcG9pbnQgdG8gcmVtb3ZlIChpZiBhbnkpIGZyb20gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBUaGUgbG9naWMgdGhhdAorZGVhbHMgd2l0aCBtYXJraW5nIHBvaW50cyBmb3IgZGVsZXRpb24gYW5kICJzbGlkaW5nIiB0byB0aGUgbmV4dCBzZWxlY3Rpb24gaXMgdGhlIGZvbGxvd2luZyA6CisKKyMgVGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvZ2VuZXJhdG9ycy9TaW5nbGVQYXNzRG93blNhbXBsZXIgCisKKwkvLyBDaGVjayB0byBzZWUgaWYgdGhlIGluaXRpYWwsIGxlZnRtb3N0IHBvaW50IGlzIGdyZWF0ZXIgdGhhbgorCQkJLy8gYWxwaGEgb3IgaWYgaXQgaXMgVU5TQUZFLiBJZiBzbywgdGhlbiBzbGlkZSBmb3J3YXJkIHRoZSB3aW5kb3cuCisJCQlpZiAoYTEgPiBhbHBoYSkgeworCQkJCS8vIEp1c3Qgc2xpZGUgZm9yd2FyZCB0aGUgd2luZG93IG9uZSB1bml0LgorCQkJCWxlZnRfYm9yZGVyICs9IDE7CisJCQkJcmlnaHRfYm9yZGVyICs9IDE7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChzMS5lcXVhbHMoVU5TQUZFKSkgeworCisJCQkJaWYgKGEyIDwgYWxwaGEgJiYgYTIgPD0gYTMpIHsKKwkJCQkJLy8gWyBQMSA9IFVOU0FGRSwgUDIgPSBTQUZFLCBQMyA9IFVOU0FGRSBdCisJCQkJCS8vIEFkdmFuY2Ugc2xpZGluZyB3aW5kb3cgYWZ0ZXIgUDIKKwkJCQkJczIgPSBTQUZFOworCQkJCQlzMyA9IFVOU0FGRTsKKwkJCQl9IGVsc2UgaWYgKGEzIDwgYWxwaGEpIHsKKwkJCQkJLy8gWyBQMSA9IFVOU0FGRSwgUDIgPSBVTlNBRkUsIFAzID0gU0FGRSBdCisJCQkJCS8vIEFkdmFuY2Ugc2xpZGluZyB3aW5kb3cgYWZ0ZXIgUDIKKwkJCQkJczMgPSBTQUZFOworCQkJCQlzMiA9IFVOU0FGRTsKKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoYTEgPCBhbHBoYSAmJiBhMSA8IGEyKSB7CisJCQkJLy8gWyBQMSA9IFNBRkUsIFAyID0gVU5TQUZFLCBQMyA9IFVOS05PV04gXQorCQkJCS8vIEFkdmFuY2Ugc2xpZGluZyB3aW5kb3cgYWZ0ZXIgUDIKKwkJCQlzMSA9IFNBRkU7CisJCQkJczIgPSBVTlNBRkU7CisJCQkJLy8gTm93IGNoZWNrIHRvIHNlZSBpZiBpcyBzYWZlIHRvIG1hcmsgUDMgdG9vLgorCQkJCWlmIChhMyA8IGFscGhhKSB7CisJCQkJCS8vIFsgUDEgPSBTQUZFLCBQMiA9IFVOU0FGRSwgUDMgPSBTQUZFIF0KKwkJCQkJLy8gQWR2YW5jZSBzbGlkaW5nIHdpbmRvdyBhZnRlciBQMgorCQkJCQlzMyA9IFNBRkU7CisJCQkJfQorCQkJfSBlbHNlIGlmIChhMSA8IGFscGhhICYmIGExID4gYTIpIHsKKwkJCQkvLyBbIFAxID0gVU5TQUZFLCBQMiA9IFNBRkUsIFAzID0gVU5TQUZFIF0KKwkJCQkvLyBTUEVDSUFMIENBU0UgOiBBZHZhbmNlIHNsaWRpbmcgd2luZG93IGFmdGVyIFAzCisJCQkJczEgPSBVTlNBRkU7CisJCQkJczIgPSBTQUZFOworCQkJCXMzID0gVU5TQUZFOworCQkJCS8vIFNwZWNpYWwgY2FzZSA6IHNldCBmbGFnIHRvIGFkdmFuY2Ugc2xpZGluZyB3aW5kb3cgYWZ0ZXIgUDMKKwkJCQlmbGFnID0gdHJ1ZTsKKworCQkJfSBlbHNlIGlmIChhMSA+IGFscGhhICYmIGEyID4gYWxwaGEpIHsKKwkJCQkvLyBbIFAxID0gVU5TQUZFLCBQMiA9IFVOU0FGRSwgUDMgPSBVTktOT1dOIF0KKwkJCQkvLyBBZHZhbmNlIHNsaWRpbmcgd2luZG93IGFmdGVyIFAyCisJCQkJczEgPSBVTlNBRkU7CisJCQkJczIgPSBVTlNBRkU7CisJCQl9IAorCitOT1RFOiBBIHNsaWRpbmcgd2luZG93IHJlZmVycyBvbmx5IHRvIGEgc2VsZWN0aW9uIG9mIHRocmVlIGNvbnNlY3V0aXZlIHBvaW50cy4KKyAKKworKipEb3duLXNhbXBsaW5nIFV0aWxpdGllcyoqCisKKworICAgVG8gcmVkdWNlIGEgZGF0YSBzZXQsIHdlIHJ1biBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL2dlbmVyYXRvcnMvRG93blNhbXBsZXIuamF2YS4gV2UgbmVlZCB0byBzcGVjaWZ5IHR3byBhcmd1bWVudHMgOiBhIHRocmVzaG9sZAorYW5kIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucy4gSW50ZXJuYWxseSwgRG93blNhbXBsZXIgd2lsbCBydW4gYm90aCBTaW5nbGVQYXNzRG93blNhbXBsZXIgZm9yIHRoZSBmaXJzdCBydW4gYW5kIHRoZSBNdWx0aVBhc3NEb3duU2FtcGxlcgorZm9yIHRoZSByZW1haW5pbmcgaXRlcmF0aW9ucy4KKworICAgQXQgZWFjaCBpdGVyYXRpb24sIHR3byBmaWxlcyBhcmUgZ2VuZXJhdGVkIDogYSByZWR1Y2VkIG1hcCBhbmQgYSByZWR1Y2VkIGRhdGEgZmlsZS4gVGhlIG5hbWUgb2YgdGhlIHJlZHVjZWQgbWFwIHRlbGxzIHVzIGR1cmluZyB3aGljaCBpdGVyYXRpb24KK2l0IHdhcyBnZW5lcmF0ZWQuIEZvciBleGFtcGxlLCBmb3IgQVJHXzFfUkVEVUNFRF9NQVBfMi54bWwgd291bGQgdGVsbCB1cyB0aGF0IHRoaXMgaXMgYSBsZXZlbCAxIG1hcCBmb3IgQXJnZW50aW5hIGNyZWF0ZWQgZHVyaW5nIHRoZSBzZWNvbmQgaXRlcmF0aW9uLgorU2ltaWxhcmx5LCBBUkdfUkVEVUNFRF8yLnR4dCBpcyB0aGUgcmVkdWNlZCBkYXRhIGZpbGUgdGhhdCB3YXMgcHJvZHVjZWQgZHVyaW5nIHRoZSBzZWNvbmQgaXRlcmF0aW9uLiBBUkdfUkVEVUNFRF8yLnR4dCB3aWxsIGJlIHRoZSBpbnB1dCBkYXRhIHNvdXJjZSBmb3IgdGhlCitkb3duLXNhbXBsaW5nIGFsZ29yaXRobSBkdXJpbmcgdGhlIHRoaXJkIGl0ZXJhdGlvbi4gV2hhdCdzIG1vcmUsIEFSR18xX1JFRFVDRURfTUFQXzIueG1sIGNhbiBiZSByZWdlbmVyYXRlZCBmcm9tIHRoaXMgZmlsZS4gRm9yIGEgdGhyZXNob2xkIG9mIGZpdmUgZGVncmVlcyBhbmQKK2ZvciBmaXZlIGl0ZXJhdGlvbnMsIGluIHRoZSBwYXJ0aWN1bGFyIGNhc2Ugb2YgQXVzdHJpYSB3ZSBoYXZlIHRoYXQgYWxsIHRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGdlbmVyYXRlZCA6CisKKworIyBSZWR1Y2VkIG1hcHMgOgorIEFVVF8xX1JFRFVDRURfTUFQXzEueG1sCisgQVVUXzFfUkVEVUNFRF9NQVBfMi54bWwKKyBBVVRfMV9SRURVQ0VEX01BUF8zLnhtbAorIEFVVF8xX1JFRFVDRURfTUFQXzQueG1sCisgQVVUXzFfUkVEVUNFRF9NQVBfNS54bWwKKwkKKyMgUmVkdWNlZCBkYXRhIGZpbGVzIDoKKyBBVVRfUkVEVUNFRF8xLnR4dAorIEFVVF9SRURVQ0VEXzIudHh0CisgQVVUX1JFRFVDRURfMy50eHQKKyBBVVRfUkVEVUNFRF80LnR4dAorIEFVVF9SRURVQ0VEXzUudHh0CisgCisgKipEb3duLXNhbXBsaW5nIHN0YXRpc3RpY3MqKgorIAorICAgIFRoZSBmb2xsb3dpbmcgdHdvIG1ldHJpY3Mgd2VyZSBjb25zaWRlcmVkIHdoZW4gZ2VuZXJhdGluZyBhIHJlZHVjZWQgZGF0YSBzZXQgb3V0IG9mIHRoZSBEaXZhIHNldCA6IHBvaW50cy1wZXItcG9seWdvbiBhbmQgbWFwIGZpbGUgc2l6ZS4gVGhlIHJlc3VsdHMgYXJlCitjYXB0dXJlZCBpbiB0aGUgZm9sbG93aW5nIHR3byB0YWJsZXMgOgorCisKKworCisjIFJFRFVDVElPTiBNRVRSSUMgOiBBVkcgUE9JTlRTLVBFUi1QT0xZR09OCisKKworVGhyZXNob2xkIChpbiBkZWdyZWVzKSAgICBBdmcuIHBvaW50cy1wZXItcG9seWdvbiAoYWZ0ZXIgNSBpdGVyYXRpb25zKSAgICAgICAgIFBlcmNlbnRhZ2Ugb2YgcmVkdWN0aW9uCisKKyAgSU5JVElBTCBWQUxVRSAgICAgICAgICAgICAgICAgIDI1MAkJCQkJCQkJICAgICAgICAgICAgICAgICAgICAgIHgKKyAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgIDE3OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjklCisgICAgICAyICAgICAgICAgICAgICAgICAgICAgICAgICAxNjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLjQwJQorICAgICAgMwkJCQkJCSAgICAgMTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNC40MCUKKyAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzYlCisgICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAgICAxNTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3LjI1JQorCisKKworCisjIFJFRFVDVElPTiBNRVRSSUMgOiBGSUxFIFNJWkUgCisgICAgCisgVGhyZXNob2xkIChpbiBkZWdyZWVzKSAgIFNpemUgKGluIEtCLCBhZnRlciA1IGl0ZXJhdGlvbnMpICAgICAgICAgICAgICAgICAgICAgIFBlcmNlbnRhZ2Ugb2YgcmVkdWN0aW9uCisgCisgICAgT1JJR0lOQUwgU0laRSAgICAgICAgICAgICAgIFVTQV8xX01BUC54bWwgPSAyOTg3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgKKyAgICAJCQkJCQkJVVNBXzJfTUFQLnhtbCA9IDE3MjY2CQkJCQkJCQkJCXgKKyAKKyAJCQkJCQkJICAgIFVTQV8xX01BUC54bWwgPSAyMjE2ICAgCQkJCQkJCQkJCTI2JQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FfMl9NQVAueG1sID0gMTQyNTkJCQkJCQkJCQkJMTYlCisgICAgCisgIAkJCQkJCQkgICAgVVNBXzFfTUFQLnhtbCA9IDE3NDIgICAJCQkJCQkJCQkJNDIlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQV8yX01BUC54bWwgPSAxMjA5MQkJCQkJCQkJCQkzMCUKKyAKKyAgCQkJCQkJCSAgICBVU0FfMV9NQVAueG1sID0gMTY4OSAgIAkJCQkJCQkJCQk0NC41MCUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBXzJfTUFQLnhtbCA9IDExNzIwCQkJCQkJCQkJCTMyJQorIAorICAJCQkJCQkJICAgIFVTQV8xX01BUC54bWwgPSAxNjQ5ICAgCQkJCQkJCQkJCTQ1JQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FfMl9NQVAueG1sID0gMTE0NjQJCQkJCQkJCQkJMzMuNzAlCisgCisgIAkJCQkJCQkgICAgVVNBXzFfTUFQLnhtbCA9IDE2MDcgICAJCQkJCQkJCQkJNDYuMzAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQV8yX01BUC54bWwgPSAxMTIzOQkJCQkJCQkJCQkzNSUKKyAgICAKKyAgICAKKyAgICAKKyAgICBXZSBzZWUgdGhhdCBieSBydW5uaW5nIHRoZSBkb3duLXNhbXBsaW5nIHV0aWxpdHkgd2UgZ2V0IGEgcmVkdWN0aW9uIG9mIGFyb3VuZCAzNy4yNSUgaW4gdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHBvaW50cy1wZXItcG9seWdvbiwgYSAKK3JlZHVjdGlvbiBvZiA0Ni4zMCUgb24gdGhlIGxldmVsIDEgbWFwIGFuZCBhIHJlZHVjdGlvbiBvZiAzNSUgb24gdGhlIGxldmVsIDIgbWFwLiBUaGUgYXZlcmFnZSByZWR1Y3Rpb24gb2YgYm90aCBtYXBzIGNvbWJpbmVkIGlzIGFwcHJveCA0MSUuCisgICAgCisgICAgCisqKlJlZHVjdGlvbiBpbiBQcmVjaXNpb24qKgorCisgICAgV2UgY29tZSBjbG9zZSB0byBhY2hpZXZpbmcgYSA1MCUgcmVkdWN0aW9uIGluIGZpbGUgc2l6ZSBieSBkZWNyZWFzaW5nIHRoZSBwcmVjaXNpb24gb24gdGhlIHJlZHVjZWQgZGF0YSBmaWxlcyBmcm9tIHNpeCBkZWNpbWFsIGRpZ2l0cyB0byBmb3VyLgorICAgIAorICAgIAorICAgIAorICAgIAorCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9kb2NzL1NURU1JSURhdGFTb3VyY2VzLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9kb2NzL1NURU1JSURhdGFTb3VyY2VzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGY0NWVmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2RvY3MvU1RFTUlJRGF0YVNvdXJjZXMudHh0CkBAIC0wLDAgKzEsMTU1IEBACisKKworU1RFTSBJSSBEYXRhIFNvdXJjZXMKKworRmViIC0gMDcgLSAyMDA3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICBUaGVyZSB3aGVyZSB0aHJlZSBtYWpvciBkYXRhIHNvdXJjZXMgb2YgR0lTIGRhdGEgZm9yIFNURU0gSUkgOiBVLlMuIENlbnN1cyBCdXJlYXUsIERpdmEtR0lTIGFuZCB0aGUgVW5pdGVkIE5hdGlvbnMgR2xvYmFsIFJlc291cmNlIEluZm9ybWF0aW9uIERhdGFiYXNlIChHUklEKSAtIEV1cm9wZS4gVGhlIGRpZmZlcmVuY2UgYW1vbmcgdGhlc2UgZGF0YQorc291cmNlcyBpcyB0aGF0IHRoZSBEaXZhLUdJUyBkYXRhIHNldCBET0VTIE5PVCBjb250YWluIGFyZWEgb3IgcG9wdWxhdGlvbiBkYXRhLCB3aGVyZWFzIHRoZSBkYXRhIHNldCBmb3IgRXVyb3BlIGZyb20gdGhlIFVOLUdSSUQgYWxyZWFkeSBjb21lcyB3aXRoIGJvdGggYXJlYSBhbmQgcG9wdWxhdGlvbiBkYXRhLiBTaW1pbGFybHksIGFyZWEgYW5kIHBvcHVsYXRpb24KK2RhdGEgZm9yIHRoZSBVU0EsIFB1ZXJ0byBSaWNvLCBBbGFza2EgYW5kIG90aGVyIFUuUy4gVGVycml0b3JpZXMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBVLlMuIENlbnN1cyBCdXJlYSBpbiBzZXBhcmF0ZSBmaWxlcy4gQW5vdGhlciBkaWZmZXJlbmNlCitpcyB0aGF0IHRoZSBEaXZhLUdJUyBwcm92aWRlcyBkYXRhIGF0IGFkbWluaXN0cmF0aW9uIGxldmVscyAwLCAxLCBhbmQgMi4gT24gdGhlIG90aGVyIGhhbmQsIGFsbCBkYXRhIGZyb20gVU4tR1JJRCBpcyBvbmx5IGxldmVsIDEuIFRvIGJlIGFibGUgdG8gdXNlIHRoZSBEaXZhLUdJUyBkYXRhLCB3ZSBoYWQgdG8gY29tcGxlbWVudCBpdCBieSBzZWFyY2ggYm90aCB0aGUKK2FyZWEgYW5kIHBvcHVsYXRpb24gZGF0YSBmb3IgbG9jYXRpb25zIHVzaW5nIGEgdmFyaWV0eSBvZiBvbmxpbmUgc291cmNlcyA6IENJQSBGYWN0Ym9vaywgQ2l0eSBQb3B1bGF0aW9uLiBBbGwgb2YgdGhlIGRhdGEgd2FzIGluIHRoZSBwdWJsaWMgZG9tYWluLgorCisKKyAgICAgVGhlIG1hcHBpbmcgb2YgZGF0YSBzb3VyY2VzIHRvIGNvdW50cmllcyBpcyBhcyBmb2xsb3dzIDoKKworCSAgICAgIFUuUy4gQ2Vuc3VzIEJ1cmVhdSA6IFUuUy5BLiBhbmQgUHVlcnRvIFJpY28sIEFsYXNrYSwgYW5kICBVUyBUZXJyaXRvcmllcy4KKworCSAgICAgIFVuaXRlZCBOYXRpb25zIEdsb2JhbCBSZXNvdXJjZSBJbmZvcm1hdGlvbiBEYXRhYmFzZSAoVU5HUklEKSA6IEV1cm9wZSBhbmQgUnVzc2lhLgorCisJICAgICAgRGl2YSAtIEdJUyA6IFJlc3Qgb2YgdGhlIFdvcmxkIChNZXhpY28sIFNvdXRoIEFtZXJpY2EsIEFmcmljYSwgQXNpYSkKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisKK1UuUy4gQ2Vuc3VzIEJ1cmVhdQorCisgICAgIEdJUyBEYXRhIGZvciB0aGUgVVNBLCBQdWVydG8gUmljbywgQWxhc2thIGFuZCBVUyBUZXJyaXRvcmllcyB3YXMgZG93bmxvYWVkIGZyb20gdGhlIFUuUy4gQ2Vuc3VzIEJ1cmVhdSB3ZWIgc2l0ZS4gQXJlYSBhbmQgcG9wdWxhdGlvbiBkYXRhIHdhcyBwcm92aWRlZCBhcyB3ZWxsIGZyb20gdGhlIFUuUy4gQ2Vuc3VzIEJ1cmVhIHNpdGUgaW4gdGhlIGZvcm0KK29mIEV4Y2VsIHNwcmVhaHNoZWV0cy4KKworICAgICAgIFVSTCA6ICBodHRwOi8vd3d3LmNlbnN1cy5nb3YvcG9wdWxhdGlvbi93d3cvY2Vuc3VzZGF0YS9kZW5zaXR5Lmh0bWwKKworICAgICAgIFN0YXRlbWVudCA6ICJBbGwgVVMgQ2Vuc3VzIEJ1cmVhdSBtYXRlcmlhbHMsIHJlZ2FyZGxlc3Mgb2YgdGhlIG1lZGlhLCBhcmUgZW50aXJlbHkgaW4gdGhlIHB1YmxpYyBkb21haW4uIFRoZXJlIGFyZSBubyB1c2VyIGZlZXMsIHNpdGUgbGljZW5zZXMsIG9yIGFueSBzcGVjaWFsIGFncmVlbWVudHMgZXRjIGZvciB0aGUgcHVibGljIG9yIHByaXZhdGUgdXNlLCBhbmQgb3IgCityZXVzZSBvZiBhbnkgY2Vuc3VzIHRpdGxlLiBBcyB0YXggZnVuZGVkIHByb2R1Y3QsIGl0J3MgYWxsIGluIHRoZSBwdWJsaWMgcmVjb3JkLiIKKworICAgICAgIENvbnRhY3QgOiAKKworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0RJVkEtR0lTCisgICAgCisgICAgVVJMIDogaHR0cDovL3d3dy5kaXZhLWdpcy5vcmcvZGF0YS9EYXRhU2VydmVyLmh0bQorCisgICAgTGljZW5zZSBTdGF0ZW1lbnQgOiAgIkZyb20gdGhpcyBwYWdlIHlvdSBjYW4gZG93bmxvYWQgdmFyaW91cyB0aGVtYXRpYyBtYXBzIGFuZC9vciBnZW8tcmVmZXJlbmNlZCBkYXRhYmFzZXMuIEFsbCB0aGVzZSBtYXBzIGFuZCBkYXRhYmFzZXMgYXJlIGluIHRoZSBwdWJsaWMgZG9tYWluLiBUaGUgZGF0YSBpcyBlaXRoZXIgaW4KK3NoYXBlZmlsZSBvciBpbiBncmlkZmlsZSBmb3JtYXQuIEZpbGVzIGhhdmUgYmVlbiBjb21wcmVzc2VkIHVzaW5nIHRoZSBaSVAgZm9ybWF0LiBUaGUgZGF0YSBhcmUgbm90IHByb2plY3RlZCAoaS5lLiwgaW4gbGF0aXR1ZGUvbG9uZ2l0dWRlKS4gVGhlIG1hcHMgYXBwZWFyIGFzIGdyYXBoaWNzIGZpbGVzIChHSUYpIHRoYXQgY2FuIGJlIGNvcGllZCBhbmQKK3Bhc3RlZCBpbnRvIGFub3RoZXIgYXBwbGljYXRpb24uIgorCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ0lBIEZBQ1RCT09LCisKKyAgICBXZSBnb3QgYSBmZXcgYXJlYSBhbmQgcG9wdWxhdGlvbiBkYXRhIHZhbHVlcyBmcm9tIHRoZSBDSUEgRmFjdGJvb2suCisKKyAgICAgVVJMIDogaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2luZGV4Lmh0bWwKKworICAgICBTdGF0ZW1lbnQgOiAiVGhlIFdvcmxkIEZhY3Rib29rIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluIGFuZCBtYXkgYmUgdXNlZCBmcmVlbHkgYnkgYW55b25lIGF0IGFueXRpbWUgd2l0aG91dCBzZWVraW5nIHBlcm1pc3Npb24uIEhvd2V2ZXIsIFVTIENvZGUgcHJvaGliaXRzIHVzZSBvZiB0aGUgQ0lBIHNlYWwgaW4gYSBtYW5uZXIKK3doaWNoIGltcGxpZXMgdGhhdCB0aGUgQ0lBIGFwcHJvdmVkLCBlbmRvcnNlZCwgb3IgYXV0aG9yaXplZCBzdWNoIHVzZS4gSWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyBhYm91dCB5b3VyIGludGVuZGVkIHVzZSwgeW91IHNob3VsZCBjb25zdWx0IHdpdGggbGVnYWwgY291bnNlbC4gRnVydGhlciBpbmZvcm1hdGlvbiBvbiBUaGUgV29ybGQgRmFjdGJvb2sncyAKK3VzZSBpcyBkZXNjcmliZWQgb24gdGhlIENvbnRyaWJ1dG9ycyBhbmQgQ29weXJpZ2h0IEluZm9ybWF0aW9uIHBhZ2UuIEFzIGEgY291cnRlc3ksIHBsZWFzZSBjaXRlIFRoZSBXb3JsZCBGYWN0Ym9vayB3aGVuIHVzZWQuIgorCisgICAgIENvbnRhY3QgOgorCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ0lUWSBQT1BVTEFUSU9OCisKKyAgICAgVGhlIHNlY29uZCBtYWluIHNvdXJjZSBvZiBhcmVhIGFuZCBwb3B1bGF0aW9uIHZhbHVlcyB3YXMgQ2l0eSBQb3B1bGF0aW9uLgorCisgICAgIFVSTCA6IGh0dHA6Ly93d3cuY2l0eXBvcHVsYXRpb24uZGUvCisKKyAgICAgU3RhdGVtZW50IDogIlBsZWFzZSwgcmVmZXJlbmNlIGRhdGEgdGFrZW4gZnJvbSB0aGVzZSB3ZWIgcGFnZXMgYXMgZm9sbG93czoKK1Rob21hcyBCcmlua2hvZmY6IENpdHkgUG9wdWxhdGlvbiwgaHR0cDovL3d3dy5jaXR5cG9wdWxhdGlvbi5kZS4iCisKKyAgICAgQ29udGFjdCA6IFRob21hcyBCcmlua2hvZmYgOiAgbWFpbEBjaXR5cG9wdWxhdGlvbi5kZSAKKworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBVTklURUQgTkFUSU9OUyBHTE9CQUwgUkVTT1VSQ0UgSU5GT1JNQVRJT04gREFUQUJBU0UgKEdSSUQpIC0gRXVyb3BlCisKKyAgICAgIFRoaXMgaXMgdGhlIG1haW4gc291cmNlIG9mIG91ciBkYXRhIGZvciBFdXJvcGUuIEl0IGluY2x1ZGVzIGFyZWEgYW5kIHBvcHVsYXRpb24gZm9yIGVhY2ggbG9jYXRpb24uCisKKyAgICAgIFVSTCA6IGh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZAorCisgICAgICBTdGF0ZW1lbnQgOiAiTW9zdCBvZiB0aGUgVU5FUC9HUklEIGRhdGEgc2V0cyBhcmUgZnJlZWx5IGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgYnkgdXNlcnMgdmlhIHRoZSBJbnRlcm5ldC4gVU5FUC9HUklEIGRvZXMgbm90IHBsYWNlIGFueSByZXN0cmljdGlvbnMgb24gdGhlIHVzZSBvZiB0aGlzIGRhdGEsIGJ1dCBkb2VzIHJlcXVlc3QgdGhhdCB1c2VycyBjaXRlCisgVU5FUC9HUklEIChhbmQgYW55IG90aGVyIHNvdXJjZXMgbWVudGlvbmVkIGluIGRvY3VtZW50YXRpb24gb2YgdGhlIGRhdGEgcHJvdmlkZWQpIGFzIGRhdGEgZnVybmlzaGVyKHMpLiBGb3IgZGF0YSBzZXRzIG5vdCBhdmFpbGFibGUgJ29uLWxpbmUnLCByZXF1ZXN0cyBtYWRlIGJ5IG5vbi1jb21tZXJjaWFsIGFuZCBub24tcHJpdmF0ZSBwZXJzb25zIChpLmUuIHRob3NlCisgd2l0aCBubyBhZmZpbGlhdGlvbikgd2lsbCBiZSBmaWxsZWQgYXQgbm8gY29zdCwgYnV0IHdpbGwgZGVwZW5kIG9uIGRhdGEgYXZhaWxhYmlsaXR5LCBVTkVQL0dSSUQgd29ya2xvYWQgYW5kIHRoZSBuYXR1cmUgb2YgdGhlIGRhdGEgc2V0IGJlaW5nIHJlcXVlc3RlZC4gUmVxdWVzdHMgd2lsbCBiZSBxdWV1ZWQgd2l0aCBwcmlvcml0eSBnaXZlbiB0byB0aG9zZSByZWxhdGVkIHRvIGpvaW50IAorYWN0aXZpdGllcyB3aXRoIFVORVAgcHJvZ3JhbW1lIGFyZWFzIGFuZCBvdGhlciBVTiBhZ2VuY2llcy4gRGF0YSBzZXRzIHdpdGggYSAicmVzdHJpY3RlZCBhY2Nlc3MiIHJhdGluZyB3aWxsIG5vdCBiZSBkaXN0cmlidXRlZDsgaG93ZXZlciwgaW5mb3JtYXRpb24gYWJvdXQgc3VjaCBkYXRhIHNldHMsIGluY2x1ZGluZyB0aGUgZGlzdHJpYnV0b3IncyBuYW1lLCB3aWxsIGJlIHNlbnQgCit0byBlbGlnaWJsZSBvcmdhbmlzYXRpb25zIHVwb24gcmVxdWVzdC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VycyBvZiBkYXRhIHNldHMgc3VwcGxpZWQgdGhyb3VnaCBVTkVQL0dSSUQgYXJlIHJlcXVlc3RlZCB0byBpbmNvcnBvcmF0ZSBpbiBvdXRwdXQgcHJvZHVjdHMgYW5kIHJlcG9ydHMgYWNrbm93bGVkZ2VtZW50cyB0byB0aGUgb3JpZ2luYXRvciBvZiB0aGUgZGF0YSBhbmQgdG8gdGhlIGZhY3QgdGhhdCB0aGV5IHdlcmUgYWNxdWlyZWQKKyB0aHJvdWdoIFVORVAvR1JJRC4gQXBwcm9wcmlhdGUgd29yZGluZyBtYXkgYmUgIlVORVNDTyAoMTk4NykgdGhyb3VnaCBVTkVQL0dSSUQtRXVyb3BlIiAiLgorCisgICAgICAgQ29udGFjdCA6IGluZm9ncmlkQGdyaWQudW5lcC5jaAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK09USEVSIChNSU5PUikgU09VUkNFUyBPRiBEQVRBIDogKG1vc3RseSBhcmVhIGFuZCBwb3B1bGF0aW9uIGRhdGEpCisKKyAgIEEgZmV3IChvbmUgb3IgdHdvKSBhcmVhLCBwb3B1bGF0aW9uLCBhbmQgbG9jYXRpb24gbmFtZXMgd2hlcmUgdGFrZW4gZm9yIGEgZmV3IGNvdW50cmllcyBmcm9tIG90aGVyIG9ubGluZSBzb3VyY2VzIDoKKworCitDSElMRSA6CisKK1VSTCA6IGh0dHA6Ly93d3cuaW5lLmNsL2luZS9jYW5hbGVzL2NoaWxlX2VzdGFkaXN0aWNvL2hvbWUucGhwCitVUkwgOiBodHRwOi8vd3d3LnZpc2l0aW5nY2hpbGUuY29tL3JlZ2lvbmVzL3JlZ2lvbi1zdXIvcmVnaW9uLWJpby1iaW8vcHJvdmluY2lhLWFyYXVjby9wcm92aW5jaWEtYXJhdWNvLnBocAorVVJMIDogaHR0cDovL3d3dy5pbmUuY2wvaW5lL2NhbmFsZXMvY2hpbGVfZXN0YWRpc3RpY28vZGVtb2dyYWZpYV95X3ZpdGFsZXMvZGVtb2dyYWZpYS9kZW1vZ3JhZmlhLnBocAorCisKK0JSQVpJTCA6IAorCisKK1VSTCA6IGh0dHA6Ly93d3cubGlicmFyeS51dS5ubC93ZXNwL3BvcHVsc3RhdC9BbWVyaWNhcy9icmF6aWx0Lmh0bQorVVJMIDogaHR0cDovL3d3dy5pYmdlLmdvdi5ici9lbmdsaXNoL2RlZmF1bHQucGhwCitVUkwgOiBodHRwOi8vd3d3LmdvbGRmaWVsZHMuY28uemEvSW52ZXN0b3IvQW5udWFsX1JlcG9ydHMvRnlfMjAwMy9nZl9hcjAzL3NkXzAzL3N0b3J5L3N0dWR5XzYuaHRtCisKKworQ0hBRCA6CisKK1VSTCA6IGh0dHA6Ly93d3cuaW5zZWVkLXRjaGFkLm9yZy8KKworQ09MT01CSUEgOgorCitVUkwgOiBodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KKworCitJTlNPTkVTSUEgOgorCitVUkwgOiBodHRwOi8vd3d3LmJwcy5nby5pZC9pbmRleC5zaHRtbAorCitLQVpIQUtTVEFOIDoKKworVVJMIDogaHR0cDovL3d3dy5zdGF0Lmt6L3N0YXQvaW5kZXguYXNweD9zbD1uZXdzJmw9ZW4KKworTElCRVJJQSA6CisKK1VSTCA6IGh0dHA6Ly93d3cuc3RhdG9pZHMuY29tL3Vsci5odG1sCisKK05BTUlCSUEgOgorCitVUkwgOiBodHRwOi8vd3d3LmxpYnJhcnkudXUubmwvd2VzcC9wb3B1bHN0YXQvQWZyaWNhL25hbWliaWFwLmh0bQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2VwbC12MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDRiMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoreG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKK3htbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgorPGxpbmsgcmVsPUZpbGUtTGlzdAoraHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOkRvY3VtZW50UHJvcGVydGllcz4KKyAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KKyAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgorICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+CisgIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+CisgIDxvOlBhZ2VzPjQ8L286UGFnZXM+CisgIDxvOldvcmRzPjE2MjY8L286V29yZHM+CisgIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgorICAgPG86TGluZXM+Nzc8L286TGluZXM+CisgIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KKyAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+CisgIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+CisgPC9vOkRvY3VtZW50UHJvcGVydGllcz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OldvcmREb2N1bWVudD4KKyAgPHc6VHJhY2tSZXZpc2lvbnMvPgorIDwvdzpXb3JkRG9jdW1lbnQ+Cis8L3htbD48IVtlbmRpZl0tLT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlRhaG9tYTsKKwlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKKwltc28tZm9udC1jaGFyc2V0OjA7CisJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7CisJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7CisJbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KK3AuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bXNvLXN0eWxlLXBhcmVudDoiIjsKKwltYXJnaW46MGluOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9CitwCisJe21hcmdpbi1yaWdodDowaW47CisJbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CisJbWFyZ2luLWxlZnQ6MGluOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK3AuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKKwl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7CisJbWFyZ2luOjBpbjsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZTo4LjBwdDsKKwlmb250LWZhbWlseTpUYWhvbWE7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorQHBhZ2UgU2VjdGlvbjEKKwl7c2l6ZTo4LjVpbiAxMS4waW47CisJbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47CisJbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKKwltc28tZm9vdGVyLW1hcmdpbjouNWluOworCW1zby1wYXBlci1zb3VyY2U6MDt9CitkaXYuU2VjdGlvbjEKKwl7cGFnZTpTZWN0aW9uMTt9CistLT4KKzwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgorPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCitUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAorUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCitPRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQoraW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCithZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKK3N1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKK2J5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgoraWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KK3N1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCit3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKK2VudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKK2NsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCitvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucworZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KK3JlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKK1N1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50CithIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KK3N0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5CitkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCitTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCitSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAorYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCitjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgorb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKK2J5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCit0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCithbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCitSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCitDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgordGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Citmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQordG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKK2lmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKK3RoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQorRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKK3JpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KK3RoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Cis8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKK2l0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQorZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAorY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQorYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKK2FuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCitlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAoraW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAorYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCitzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0CitDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCitzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCitpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCitjb2RlIGZvcm06PC9zcGFuPiA8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCitpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQorY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQorY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCitvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+CisKKzxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KKworPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQorYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycworYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKK29mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAorbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCitDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKK2Nvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCit0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCitjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKK3RvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK3RvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCithbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQoraW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCit3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcworc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCitvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCitjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUworQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAorV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKK1dJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKK01FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQorUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcworQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKK2VxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgorCis8cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCitBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgorVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgorVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KKworPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKK29yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKK2Z1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgorYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAorb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCitzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCitwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+CisKKzxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQorY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKK3RoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKK0FncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCitzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCisoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAorZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgorCis8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCitTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCitBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKK0FncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKK2l0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L25vdGljZS5odG1sIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L25vdGljZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YWY5NjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvbm90aWNlLmh0bWwKQEAgLTAsMCArMSw3OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5NYXJjaCAxNywgMjAwNTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisgICAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKKyAgIAorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCisgICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKyAgIAorPHVsPgorCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucworICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPiAgIAorIAorPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisJCQorPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisJPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQorCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisgICAKKzxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0FGR0hBTklTVEFOX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0FGR0hBTklTVEFOX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYWEzYjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQUZHSEFOSVNUQU5fQVJFQS50eHQKQEAgLTAsMCArMSwzNSBAQAorQWZnaGFuaXN0YW46MDo2NTIwOTAKK0JBREFLSFNIQU4JOgkxCToJNDQwNTkuMzAKK0JBREdISVMJOgkxCToJMjA1OTAuNjAKK0JBR0hMQU4gW0JBR0hJQU5dCToJMQk6CTIxMTE4LjQwCitCQUxLSAk6CTEJOgkxNzI0OC41MAorQkFNSUFOCToJMQk6CTE0MTc1LjMwCitEWUtPTkQJOgkxCToJMAorRkFSQUgJOgkxCToJNDg0NzAuOTAKK0ZBUllBQgk6CTEJOgkyMDI5Mi44MAorR0hBWk5JIFtHSEFaTl0JOgkxCToJMjI5MTQuNjAKK0dIT1dSCToJMQk6CTM2NDc4LjgwCitIRUxNQU5ECToJMQk6CTU4NTgzLjcwCitIRVJBVAk6CTEJOgk1NDc3OC4wMAorSk9XWkpBTgk6CTEJOgkxMTc5OC4zMAorS0FCVUwgW0tBQk9MXQk6CTEJOgk0NDYxLjYwCitLQU5EQUhBUgk6CTEJOgk1NDAyMi4wMAorS0FQSVNBCToJMQk6CTE4NDIuMTAKK0tIT1dTVAk6CTEJOgk0MTUxLjUwCitLT05BUiBbS1VOQVJdCToJMQk6CTQ5NDEuNTAKK0tPTkRPWiBbS1VORFVaXSBbS09ORFVaXQk6CTEJOgk4MDM5LjcwCitMQUdITUFOCToJMQk6CTM4NDIuNjAKK0xPV0dBUgk6CTEJOgkzODc5LjgwCitOQU5HUkFIQVIgW05BTkdBUkhBUl0gW05BTkdBUkhBXQk6CTEJOgk3NzI3LjQwCitOSU1SVVoJOgkxCToJNDEwMDUuNDAKK05SRVNUTgk6CTEJOgk5MjI1LjAwCitPUlVaR0FOIFtVUlVaR0FOXQk6CTEJOgkxOTQ4Mi40MAorUEFLVElBCToJMQk6CTY0MzEuNzAKK1BBS1RJS0EJOgkxCToJMAorUEFOSlNIUgk6CTEJOgk5NTg0LjQwCitQQVJXQU4gW1BBUlZBTl0JOgkxCToJMTEyNjEuOTAKK1NBTUFOR0FOCToJMQk6CTE1OTk5LjIwCitTQVIgRSBQT0wJOgkxCToJMTIzMzMuMDAKK1RBS0hBUgk6CTEJOgkzMDc4NC41MAorV0FSREFLIFtXQVJEQUddIFtWQVJEQUtdCToJMQk6CTg5MzguMTAKK1pBQk9MIFtaQUJVTF0JOgkxCToJMTczNDMuNTAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BRkdIQU5JU1RBTl9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BRkdIQU5JU1RBTl9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjk3ZWYzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0FGR0hBTklTVEFOX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMzUgQEAKK0FmZ2hhbmlzdGFuOjA6Mjk4NjMwMDAKK0JBREFLSFNIQU4JOgkxCToJNzE1MDAwCitCQURHSElTCToJMQk6CTMwMTAwMAorQkFHSExBTiBbQkFHSElBTl0JOgkxCToJNzQ1MDAwCitCQUxLSAk6CTEJOgk4NjkwMDAKK0JBTUlBTgk6CTEJOgkzNTYwMDAKK0RZS09ORAk6CTEJOgkwIAorRkFSQUgJOgkxCToJMzM4MDAwCitGQVJZQUIJOgkxCToJNzgyMDAwCitHSEFaTkkgW0dIQVpOXQk6CTEJOgk5MzEwMDAKK0dIT1dSCToJMQk6CTQ4NTAwMAorSEVMTUFORAk6CTEJOgk3NDUwMDAKK0hFUkFUCToJMQk6CTExODIwMDAKK0pPV1pKQU4JOgkxCToJNDQxMDAwCitLQUJVTCBbS0FCT0xdCToJMQk6CTMzMTQwMDAKK0tBTkRBSEFSCToJMQk6CTg4NjAwMAorS0FQSVNBCToJMQk6CTM2MDAwMAorS0hPV1NUCToJMQk6CTMwMDAwMAorS09OQVIgW0tVTkFSXQk6CTEJOgkzMjEwMDAKK0tPTkRPWiBbS1VORFVaXSBbS09ORFVaXQk6CTEJOgk4MjAwMDAKK0xBR0hNQU4JOgkxCToJMzczMDAwCitMT1dHQVIJOgkxCToJMjkyMDAwCitOQU5HUkFIQVIgW05BTkdBUkhBUl0gW05BTkdBUkhBXQk6CTEJOgkxMDg5MDAwCitOSU1SVVoJOgkxCToJMTQ5MDAwCitOUkVTVE4JOgkxCToJMTEyMDAwCitPUlVaR0FOIFtVUlVaR0FOXQk6CTEJOgkzNTIwMDAKK1BBS1RJQQk6CTEJOgk0MTUwMDAKK1BBS1RJS0EJOgkxCToJMCAKK1BBTkpTSFIJOgkxCToJNzI2MDAwCitQQVJXQU4gW1BBUlZBTl0JOgkxCToJMzc4MDAwCitTQU1BTkdBTgk6CTEJOgk0NjgwMDAKK1NBUiBFIFBPTAk6CTEJOgk3NTAwMDAKK1RBS0hBUgk6CTEJOgk2MjcwMDAKK1dBUkRBSyBbV0FSREFHXSBbVkFSREFLXQk6CTEJOgk0MTMwMDAKK1pBQk9MIFtaQUJVTF0JOgkxCToJMjU4MDAwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQUxCQU5JQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BTEJBTklBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOTU1NWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQUxCQU5JQV9BUkVBLnR4dApAQCAtMCwwICsxIEBACisgU2hxaXCJcmlhIDogMSA6IDI4NzQ4LjAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BTEJBTklBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0FMQkFOSUFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjNzI4ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BTEJBTklBX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEgQEAKKyBTaHFpcIlyaWEgOiAxIDogMzI1NTg5MQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0FMR0VSSUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQUxHRVJJQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGZiNzJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0FMR0VSSUFfQVJFQS50eHQKQEAgLTAsMCArMSw1MSBAQAorQUxHRVJJQQk6CTAJOgkyMzgxNzQwCitFbCBUQVJGIDogMSA6IDMzMzkKK0FEUkFSIFtBRFJBUjFdCToJMQk6CTQ2NDkwMAorQUlOIERBRkxBCToJMQk6CTQyNjAKK0FJTiBUQU1PVUNIRU5UCToJMQk6CTI2MzAKK0FMR0VSCToJMQk6CTI3MworQU5OQUJBCToJMQk6CTE0MTIKK0JBVE5BCToJMQk6CTEyMDI4CitFTCBCQVlBREgJOgkxCToJNzA1MzkKK0JFQ0hBUgk6CTEJOgkxNjE0MDAKK0JFSkFJQQk6CTEJOgkzMzI5CitCSVNLUkEJOgkxCToJMjE2NzEKK0JMSURBCToJMQk6CTE1NDEKK0JPUkpCT1VBUklSRUoJOgkxCToJMzkyMAorQk9VSVJBCToJMQk6CTQ1MTcKK0JPVU1FUkRFUwk6CTEJOgkxNTU4CitDSExFRgk6CTEJOgk0NjUxCitDT05TVEFOVElORQk6CTEJOgkyMjg4CitESkVMRkEJOgkxCToJMjkwMzUKK0dIQVJEQUlBIFtHSEFSREFTQV0gOgkxCToJODYxMDUKK0dVRUxNQQk6CTEJOgkzOTExCitJTExJWkkJOgkxCToJMjg0NjE4CitKSUpFTAk6CTEJOgkyMzk5CitLSEVOQ0hFTEEJOgkxCToJOTgxMQorTEFHSE9VQVQJOgkxCToJMjUwNTIKK01BU0NBUkEJOgkxCToJNTk2MgorTUVESUEJOgkxCToJODcwMAorTUlMQQk6CTEJOgkzNDA4CitNT1NUQUdIQU5FTQk6CTEJOgkyMjY5CitNU0lMQQk6CTEJOgkxODQ0NworTkFBTUEJOgkxCToJMzA2NDQKK09SQU4JOgkxCToJMjExNAorT1VBUkdMQQk6CTEJOgkyNzAwMzAKK0VMIE9VRUQJOgkxCToJODAwMDAKK09VTSBFTCBCT1VBR0hJCToJMQk6CTc2MzgKK1JFTElaQU5FCToJMQk6CTQ4NDAKK1NBSURBCToJMQk6CTY2MzEKK1NFVElGCToJMQk6CTY1MDQKK1NJREkgQkVMIEFCQkVTCToJMQk6CTkxNTEKK1NLSUtEQQk6CTEJOgk0MTM3CitTT1VLIEFIUkFTCToJMQk6CTQzNjAKK1RBTUFOR0hBU1NFVAk6CTEJOgk1NTYwMDAKK1RBTUFOUkFTU0VUCToJMQk6CTI5OTgKK1RFQkVTU0EJOgkxCToJMTM4NzgKK1RFTkRPVUYJOgkxCToJMjAwODcKK1RJQVJFVAk6CTEJOgkyMTUKK1RJUEFaQQk6CTEJOgkyMjE5CitUSVNTRU1TSUxUCToJMQk6CTMxNTEKK1RJWkkgT1VaT1UJOgkxCToJMjk5MworVExFTUNFTgk6CTEJOgk5MDE4CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BTEdFUklBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0FMR0VSSUFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjliMWFlMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BTEdFUklBX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsNTEgQEAKK0FMR0VSSUEJOgkwCToJMzI5MzAwOTEKK0VsIFRBUkYgOiAxIDogMzUyNTg4CitBRFJBUiBbQURSQVIxXQk6CTEJOgkzMTE2MTUKK0FJTiBEQUZMQQk6CTEJOgk2NjAzNDIKK0FJTiBUQU1PVUNIRU5UCToJMQk6CTMyNzMzMQorQUxHRVIJOgkxCToJMjU2MjQyOAorQU5OQUJBCToJMQk6CTU1NzgxOAorQkFUTkEJOgkxCToJOTYyNjIzCitFTCBCQVlBREgJOgkxCToJMTY4Nzg5CitCRUNIQVIJOgkxCToJMjI1NTQ2CitCRUpBSUEJOgkxCToJODU2ODQwCitCSVNLUkEJOgkxCToJNTc1ODU4CitCTElEQQk6CTEJOgk3ODQyODMKK0JPUkpCT1VBUklSRUoJOgkxCToJNTU1NDAyCitCT1VJUkEJOgkxCToJNjI5NTYwCitCT1VNRVJERVMJOgkxCToJNjQ3Mzg5CitDSExFRgk6CTEJOgk4NTg2OTUKK0NPTlNUQU5USU5FCToJMQk6CTgxMDkxNAorREpFTEZBCToJMQk6CTc5NzcwNgorR0hBUkRBSUEgW0dIQVJEQVNBXQk6CTEJOgkzMDA1MTYKK0dVRUxNQQk6CTEJOgk0MzAwMDAKK0lMTElaSQk6CTEJOgkzNDEwOAorSklKRUwJOgkxCToJNTczMjA4CitLSEVOQ0hFTEEJOgkxCToJMzI3OTE3CitMQUdIT1VBVAk6CTEJOgkzMTcxMjUKK01BU0NBUkEJOgkxCToJNjc2MTkyCitNRURJQQk6CTEJOgk4MDIwNzgKK01JTEEJOgkxCToJNjc0NDgwCitNT1NUQUdIQU5FTQk6CTEJOgk2MzEwNTcKK01TSUxBCToJMQk6CTgwNTUxOQorTkFBTUEJOgkxCToJMTI3MzE0CitPUkFOCToJMQk6CTEyMTM4MzkKK09VQVJHTEEJOgkxCToJNDQ1NjE5CitFTCBPVUVECToJMQk6CTUwNDQwMQorT1VNIEVMIEJPVUFHSEkJOgkxCToJNTE5MTcwCitSRUxJWkFORQk6CTEJOgk2NDIyMDUKK1NBSURBCToJMQk6CTI3OTUyNgorU0VUSUYJOgkxCToJMTMxMTQxMworU0lESSBCRUwgQUJCRVMJOgkxCToJNTI1NjMyCitTS0lLREEJOgkxCToJNzg2MTU0CitTT1VLIEFIUkFTCToJMQk6CTM2NzQ1NQorVEFNQU5HSEFTU0VUCToJMQk6CTEzNzE3NQorVEFNQU5SQVNTRVQJOgkxCToJMzUyNTg4CitURUJFU1NBCToJMQk6CTU0OTA2NgorVEVORE9VRgk6CTEJOgk3MjU4NTMKK1RJQVJFVAk6CTEJOgkyNzA2MAorVElQQVpBCToJMQk6CTUwNjA1MworVElTU0VNU0lMVAk6CTEJOgkyNjQyNDAKK1RJWkkgT1VaT1UJOgkxCToJMTEwODcwOAorVExFTUNFTgk6CTEJOgk4NDIwNTMKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0FORE9SUkFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQU5ET1JSQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWRmYTY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0FORE9SUkFfQVJFQS50eHQKQEAgLTAsMCArMSBAQAorIEFuZG9ycmEgOiAxIDogMS4wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQU5ET1JSQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BTkRPUlJBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MWM3ODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQU5ET1JSQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxIEBACisgQW5kb3JyYSA6IDEgOiA2NzMxMwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0FOR09MQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BTkdPTEFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc0YTk4ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BTkdPTEFfQVJFQS50eHQKQEAgLTAsMCArMSwxOSBAQAorQU5HT0xBCToJMAk6CTEyNDY3MDAKK0JFTkdPCToJMQk6CTMzMDE2CitCRU5HVUVMQQk6CTEJOgkzMTc4MAorQklFCToJMQk6CTcwMzE0CitDQUJJTkRBCToJMQk6CTcyNzAKK0NVQU5ETyBDVUJBTkdPCToJMQk6CTE5OTA0OQorQ1VBTlpBIE5PUlRFCToJMQk6CTg3MzQyCitDVUFOWkEgU1VMCToJMQk6CTM0MjcwCitDVU5FTkUJOgkxCToJNzUwMDIKK0hVQU1CTwk6CTEJOgkyNDExMAorSFVJTEEJOgkxCToJNTU2NjAKK0xVQU5EQQk6CTEJOgkyMjU3CitMVU5EQSBOT1JURQk6CTEJOgkxMDMwMDAKK0xVTkRBIFNVTAk6CTEJOgk3NzYzNworTUFMQU5KRQk6CTEJOgk5NzYwMgorTU9YSUNPCToJMQk6CTIyMzAyMworTkFNSUJFCToJMQk6CTU4MTM3CitVSUdFCToJMQk6CTU4Njk4CitaQUlSRQk6CTEJOgk0MDEzMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0FOR09MQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BTkdPTEFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViYTRiMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BTkdPTEFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxOSBAQAorQU5HT0xBCToJMAk6CTEyMTI3MDcxCitCRU5HTwk6CTEJOgkxOTAwMDAKK0JFTkdVRUxBCToJMQk6CTcxODAwMAorQklFCToJMQk6CTEyODAwMDAKK0NBQklOREEJOgkxCToJMTk5MDAwCitDVUFORE8gQ1VCQU5HTwk6CTEJOgkxMzkwMDAKK0NVQU5aQSBOT1JURQk6CTEJOgkyNTUwMDAKK0NVQU5aQSBTVUwJOgkxCToJMTczMDAwMAorQ1VORU5FCToJMQk6CTk1NDAwMAorSFVBTUJPCToJMQk6CTQ0MDAwMAorSFVJTEEJOgkxCToJNzEwMDAwCitMVUFOREEJOgkxCToJMjAyMjAwMAorTFVOREEgTk9SVEUJOgkxCToJMzIwMDAwCitMVU5EQSBTVUwJOgkxCToJMTY1MDAwCitNQUxBTkpFCToJMQk6CTEwMjAwMDAKK01PWElDTwk6CTEJOgkzNjAwMDAKK05BTUlCRQk6CTEJOgkxNTQwMDAKK1VJR0UJOgkxCToJOTg1MDAwCitaQUlSRQk6CTEJOgkyNjIwMDAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BUkdFTlRJTkFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQVJHRU5USU5BX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NmY5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQVJHRU5USU5BX0FSRUEudHh0CkBAIC0wLDAgKzEsMjUgQEAKK0FyZ2VudGluYQk6CTAJOgkyNzY2ODkwCisgQnVlbm9zIEFpcmVzICAJOgkxCToJMzA3NTcxCitCdWVub3MgQWlyZXMgRC5GLgk6CTEJOgkyMDAKKyBDYXRhbWFyY2EgCToJMQk6CTEwMjYwMgorQ2hhY28gCToJMQk6CTk5NjMzCitDaHVidXQgCToJMQk6CTIyNDY4NgorIENvcmRvYmEgCToJMQk6CTE2NTMyMQorIENvcnJpZW50ZXMgCToJMQk6CTg4MTk5CisgRW50cmUgUmlvcyAJOgkxCToJNzg3ODEKKyBGb3Jtb3NhIAk6CTEJOgk3MjA2NgorIEp1anV5IAk6CTEJOgk1MzIxOQorIExhIFBhbXBhIAk6CTEJOgkxNDM0NDAKKyBMYSBSaW9qYSAJOgkxCToJODk2ODAKKyBNZW5kb3phIAk6CTEJOgkxNDg4MjcKKyBNaXNpb25lcyAJOgkxCToJMjk4MDEKK05ldXF1ZW4JOgkxCToJOTQwNzgKKyBSaW8gTmVncm8gCToJMQk6CTIwMzAxMworIFNhbHRhIAk6CTEJOgkxNTU0ODgKKyBTYW4gSnVhbiAJOgkxCToJODk2NTEKKyBTYW4gTHVpcyAJOgkxCToJNzY3NDgKKyBTYW50YSBDcnV6IAk6CTEJOgkyNDM5NDMKKyBTYW50YSBGZSAJOgkxCToJMTMzMDA3CisgU2FudGlhZ28gZGVsIEVzdGVybyAJOgkxCToJMTM2MzUxCitUaWVycmEgZGVsIEZ1ZWdvIAk6CTEJOgkyMTU3MQorIFR1Y3VtYW4JOgkxCToJMjI1MjQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BUkdFTlRJTkFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQVJHRU5USU5BX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjcwMzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQVJHRU5USU5BX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMjYgQEAKK0FyZ2VudGluYQk6CTAJOgkzOTkyMTgzMworIEJ1ZW5vcyBBaXJlcyAgCToJMQk6CTEzODI3MjAzCitCdWVub3MgQWlyZXMgRC5GLgk6CTEJOgkyNzc2MTM4CisgQ2F0YW1hcmNhIAk6CTEJOgkzMzQ1NjgKK0NoYWNvIAk6CTEJOgk5ODQ0NDYKK0NodWJ1dCAJOgkxCToJNDEzMjM3CisgQ29yZG9iYSAJOgkxCToJMzA2NjgwMQorIENvcnJpZW50ZXMgCToJMQk6CTkzMDk5MQorIEVudHJlIFJpb3MgCToJMQk6CTExNTgxNDcKKyBGb3Jtb3NhIAk6CTEJOgk0ODY1NTkKKyBKdWp1eSAJOgkxCToJNjExODg4CisgTGEgUGFtcGEgCToJMQk6CTI5OTI5NAorIExhIFJpb2phIAk6CTEJOgkyODk5ODMKKyBNZW5kb3phIAk6CTEJOgkxNTc5NjUxCisgTWlzaW9uZXMgCToJMQk6CTk2NTUyMgorTmV1cXVlbgk6CTEJOgk0NzQxNTUKKyBSaW8gTmVncm8gCToJMQk6CTU1MjgyMgorIFNhbHRhIAk6CTEJOgkxMDc5MDUxCisgU2FuIEp1YW4gCToJMQk6CTYyMDAyMworIFNhbiBMdWlzIAk6CTEJOgkzNjc5MzMKKyBTYW50YSBDcnV6IAk6CTEJOgkxOTY5NTgKKyBTYW50YSBGZSAJOgkxCToJMzAwMDcwMQorIFNhbnRpYWdvIGRlbCBFc3Rlcm8gCToJMQk6CTgwNDQ1NworVGllcnJhIGRlbCBGdWVnbyAJOgkxCToJMTAxMDc5CisgVHVjdW1hbgk6CTEJOgkxMzM4NTIzCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BUk1FTklBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0FSTUVOSUFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4N2VjZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BUk1FTklBX0FSRUEudHh0CkBAIC0wLDAgKzEsMTIgQEAKK0FybWVuaWEJOgkwCToJMjk4MDAKK0FyYWdhdHNvdG5pCToJMQk6CTI3NTMKK0FyYXJhdGkJOgkxCToJMjA5NgorQXJtYXZpcmkJOgkxCToJMTI0MgorR2VnaGFya3VuaWtpCToJMQk6CTUzNDgKK0tvdGF5a2kJOgkxCToJMjA4OQorTG9yaQk6CTEJOgkzNzg5CitTaGlyYWtpCToJMQk6CTI2ODEKK1N5dW5pa2kJOgkxCToJNDUwNgorVGF2dXNoaQk6CTEJOgkyNzA0CitWYXlvdHMgZHpvcmkJOgkxCToJMjMwOAorQXJtZW5pYSBYIFllcmV2YW4JOgkxCToJMjI3CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQVJNRU5JQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BUk1FTklBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNzNkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQVJNRU5JQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDEyIEBACitBcm1lbmlhCToJMAk6CTI5NzYzNzIKK0FyYWdhdHNvdG5pCToJMQk6CTEyNjI3OAorQXJhcmF0aQk6CTEJOgkyNTI2NjUKK0FybWF2aXJpCToJMQk6CTI1NTg2MQorR2VnaGFya3VuaWtpCToJMQk6CTIxNTM3MQorS290YXlraQk6CTEJOgkyNDEzMzcKK0xvcmkJOgkxCToJMjUzMzUxCitTaGlyYWtpCToJMQk6CTI1NzI0MgorU3l1bmlraQk6CTEJOgkxMzQwNjEKK1RhdnVzaGkJOgkxCToJMTIxOTYzCitWYXlvdHMgZHpvcmkJOgkxCToJNTMyMzAKK0FybWVuaWEgWCBZZXJldmFuCToJMQk6CTEwOTEyMzUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BVVNUUkFMSUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQVVTVFJBTElBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYWM0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQVVTVFJBTElBX0FSRUEudHh0CkBAIC0wLDAgKzEsMTIgQEAKK0FVU1RSQUxJQSA6IDAgOiA3NjkyMDMwCitBVVNUUkFMSUEgQ0FQSVRBTCBURVJSSVRPUlkgOiAxIDoJMjM2MAorTkVXIFNPVVRIIFdBTEVTIDogMSA6IDgwMDY0MAorTk9SVEhFUk4gVEVSUklUT1JZIDogMSA6IDEzNDkxMzAKK1FVRUVOU0xBTkQgOiAxIDogMTczMDY1MAorU09VVEggQVVTVFJBTElBIDogMSA6IDk4MzQ4MAorVEFTTUFOSUEgOiAxIDogNjg0MDAKK1ZJQ1RPUklBIDogMSA6IDIyNzQyMAorV0VTVEVSTiBBVVNUUkFMSUEgOiAxIDogMjUyOTg4MAorCisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0FVU1RSQUxJQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BVVNUUkFMSUFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5NjY2NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BVVNUUkFMSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxMyBAQAorQVVTVFJBTElBIDogMCA6IDIwMzI1OTI2CitBVVNUUkFMSUEgQ0FQSVRBTCBURVJSSVRPUlkgOiAxIDogMzI1MTYxCitORVcgU09VVEggV0FMRVMgOiAxIDogNjc3NDI0OQorTk9SVEhFUk4gVEVSUklUT1JZIDogMSA6IDIwMjc5MworUVVFRU5TTEFORCA6IDEgOiAzOTYzOTY4CitTT1VUSCBBVVNUUkFMSUEgOiAxIDogMTU0MjAzMworVEFTTUFOSUEgOiAxIDogNDg1MjYzCitWSUNUT1JJQSA6IDEgOiA1MDIyMzQ2CitXRVNURVJOIEFVU1RSQUxJQSA6IDEgOiAyMDEwMTEzCisKKworCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BVVNUUklBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0FVU1RSSUFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjMTIzNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BVVNUUklBX0FSRUEudHh0CkBAIC0wLDAgKzEsOSBAQAorIE5pZWRlcpRzdGVycmVpY2ggOiAxIDogMTkxNzMuMAorIE9iZXKUc3RlcnJlaWNoIDogMSA6IDExOTc5LjAKKyBXaWVuIDogMSA6IDQxNC4wCisgQnVyZ2VubGFuZCA6IDEgOiAzOTY1LjAKKyBTYWx6YnVyZyA6IDEgOiA3MTU0LjAKKyBTdGVpZXJtYXJrIDogMSA6IDE2Mzg4LjAKKyBUaXJvbCA6IDEgOiAxMjY0OC4wCisgVm9yYWxiZXJnIDogMSA6IDI2MDEuMAorIEuEcm50ZW4gOiAxIDogOTUzMy4wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQVVTVFJJQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BVVNUUklBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MjcxYmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQVVTVFJJQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDkgQEAKKyBOaWVkZXKUc3RlcnJlaWNoIDogMSA6IDE0NDU4MTAKKyBPYmVylHN0ZXJyZWljaCA6IDEgOiAxMzI5ODQ0CisgV2llbiA6IDEgOiAxNTA4MTIwCisgQnVyZ2VubGFuZCA6IDEgOiAyNjk3MTcKKyBTYWx6YnVyZyA6IDEgOiA0NzU3NjYKKyBTdGVpZXJtYXJrIDogMSA6IDExODcyMTEKKyBUaXJvbCA6IDEgOiA2Mjg3NzAKKyBWb3JhbGJlcmcgOiAxIDogMzI3Nzg0CisgS4RybnRlbiA6IDEgOiA1NDUyMjYKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BWkVSQkFJSkFOX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0FaRVJCQUlKQU5fQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5MTg2ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9BWkVSQkFJSkFOX0FSRUEudHh0CkBAIC0wLDAgKzEsODAgQEAKK0F6ZXJiYWlqYW4JOgkwCToJODY2MDAKK05hZ29ybm8tS2FyYWJha2ggOiAxIDogMjcwMAorQXplcmJheWR6aGFuIFRlcnJpdG9yIDogMSA6IDkwMDAKK1hpcmRhbGFuICAJOgkxCToJMTM2MAorQWdkYXNoIAk6CTEJOgkxMDUwCitBZ2RqYWJhZGkgCToJMQk6CTE3NjAKK0FsaWJha2hsaSAJOgkxCToJMTE1MAorQWdzdGFmYSAJOgkxCToJMTUwMAorQWdoc3UgCToJMQk6CTEwMjAKK0FsaSBCYXlyYW1saSBDaXR5IHQuZC4gCToJMQk6CTMwCitBc3RhcmEgCToJMQk6CTYyMAorQmFrdSBDaXR5IAk6CTEJOgkyMTMwCitCYWxha2FuIAk6CTEJOgk5MjAKK0JhcmRhIAk6CTEJOgk5NjAKK0JleWxhZ2FuIAk6CTEJOgkxMTMwCitCaWxhc3V2YXIgCToJMQk6CTE0MDAKK0Rhc2hrYXNhbiAJOgkxCToJMTA1MAorRGF2YWNoaSAJOgkxCToJMTA5MAorQWxraGFubGkgCToJMQk6CTEzOTAKK0dhYmFsYSAJOgkxCToJMTU1MAorR2FkYWJheSAJOgkxCToJMTI5MAorR2FraCAJOgkxCToJMTQ5MAorR2FuamEgQ2l0eSB0LmQuIAk6CTEJOgkxMTAKK0dhemFraCAJOgkxCToJNzAwCitNYXJhemEgCToJMQk6CTEzNzAKK0dvcmFuYm95IAk6CTEJOgkxNzkwCitHb3ljaGF5IAk6CTEJOgk3NDAKK0d1YmEgCToJMQk6CTI1ODAKK0d1YmFkbHkgcmF5b24gCToJMQk6CTgwMAorR3VzYXIgCToJMQk6CTE1NDAKK0hhamlnYWJ1bCAJOgkxCToJMTY0MAorSW1pc2hsaSAJOgkxCToJMTgyMAorSXNtYXlpbGx5IAk6CTEJOgkyMDYwCitKYWJyYWlsIHJheW9uIAk6CTEJOgkxMDUwCitKYWxpbGFiYWQgCToJMQk6CTE0NDAKK0thbGJhamFyIAk6CTEJOgkzMDUwCitLaGFjaG1heiAJOgkxCToJMTA1MAorS2hhbmtlbmRpIENpdHkgdC5kLiAJOgkxCToJOAorS2hhbmxhciAJOgkxCToJMTAzMAorS2hvamFseSByYXlvbiAJOgkxCToJOTQwCitLaG9qYXZhbmQgcmF5b24gCToJMQk6CTE0NjAKK0toeXppIAk6CTEJOgkxODUwCitLdXJkYW1pciAJOgkxCToJMTYzMAorTGFjaGluIHJheW9uIAk6CTEJOgkxODQwCitMYW5rYXJhbiAJOgkxCToJMTU0MAorTGVyaWsgCToJMQk6CTEwODAKK01hc2FsbHkgCToJMQk6CTcyMAorTWluZ2VjaGV2aXIgQ2l0eSAJOgkxCToJMTMwCitOYWZ0YWxhbiBDaXR5IAk6CTEJOgkyCitOYWtoaWNoZXZhbiAJOgkxCToJNTUwMAorTmFraGNoZXZhbiBDaXR5IAk6CTEJOgkxMzAKK0JhYmVrIAk6CTEJOgkxMTcwCitKdWxmYSAJOgkxCToJMTAwMAorR2l2cmFoayAJOgkxCToJNjgyCitPcmR1YmFkIAk6CTEJOgk5NzAKK0hleWRhcmFiYWQgCToJMQk6CTE1MAorU2hhaGJ1eiAJOgkxCToJOTIwCitTaGFydXIgCToJMQk6CTQ3OAorTmVmdGNoYWxhIAk6CTEJOgkxNDUwCitPZ3V6IAk6CTEJOgkxMjIwCitTYWF0bHkgCToJMQk6CTExODAKK1NhYmlyYWJhZCAJOgkxCToJMTQ3MAorU2FseWFuIAk6CTEJOgkxNzkwCitOYWJpYWdhbGkgCToJMQk6CTE0NTAKK1NoYWtpIAk6CTEJOgkyNDMwCitTaGFtYWtoeSAJOgkxCToJMTYxMAorU2hhbWtpciAJOgkxCToJMTY2MAorU2h1c2hhIHJheW9uIAk6CTEJOgkyOTAKK1NpeWF6YW4gCToJMQk6CTcwMAorU3VtZ2FpdCBDaXR5IHQuZC4gCToJMQk6CTgwCitUYXJ0YXIgCToJMQk6CTk2MAorVG92dXogCToJMQk6CTE5MDAKK1VqYXIgCToJMQk6CTg1MAorWWFyZGltbHkgCToJMQk6CTY3MAorWWV2bGFraCAJOgkxCToJMTU0MAorWmFnYXRhbGEgCToJMQk6CTEzNTAKK1phbmdpbGFuIHJheW9uIAk6CTEJOgk3MTAKK1phcmRhYiAJOgkxCToJODYwCisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0FaRVJCQUlKQU5fUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQVpFUkJBSUpBTl9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmVkMmM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0FaRVJCQUlKQU5fUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSw3OCBAQAorQXplcmJhaWphbgk6CTAJOgk3OTYxNjE5CitOYWdvcm5vLUthcmFiYWtoIDogMSA6IDE0NjAwMAorQXplcmJheWR6aGFuIFRlcnJpdG9yIDogMSA6IDcwMDAwMCAKK1hpcmRhbGFuICAJOgkxCToJOTE2MDAKK0FnZGFzaCAJOgkxCToJOTQ0MDAKK0FnZGphYmFkaSAJOgkxCToJMTE0MTAwCitBbGliYWtobGkgCToJMQk6CTE2NTAwMAorQWdzdGFmYSAJOgkxCToJNzY3MDAKK0FnaHN1IAk6CTEJOgk2NjcwMAorQWxpIEJheXJhbWxpIENpdHkgdC5kLiAJOgkxCToJNzI4MDAKK0FzdGFyYSAJOgkxCToJOTA5MDAKK0Jha3UgQ2l0eSAJOgkxCToJMTg1NTMwMAorQmFsYWthbiAJOgkxCToJODY1MDAKK0JhcmRhIAk6CTEJOgkxMzY2MDAKK0JleWxhZ2FuIAk6CTEJOgk4MTkwMAorQmlsYXN1dmFyIAk6CTEJOgk4MTMwMAorRGFzaGthc2FuIAk6CTEJOgkzMTkwMAorRGF2YWNoaSAJOgkxCToJNDg2MDAKK0Fsa2hhbmxpIAk6CTEJOgkxNDUzMDAKK0dhYmFsYSAJOgkxCToJODkyMDAKK0dhZGFiYXkgCToJMQk6CTkwMTAwCitHYWtoIAk6CTEJOgk1MzQwMAorR2FuamEgQ2l0eSB0LmQuIAk6CTEJOgkzMDQ1MDAKK0dhemFraCAJOgkxCToJODQ1MDAKK01hcmF6YSAJOgkxCToJMzc0MDAKK0dvcmFuYm95IAk6CTEJOgk5MTEwMAorR295Y2hheSAJOgkxCToJMTA1MzAwCitHdWJhIAk6CTEJOgkxNDM4MDAKK0d1YmFkbHkgcmF5b24gCToJMQk6CTM1MTAwCitHdXNhciAJOgkxCToJODQ2MDAKK0hhamlnYWJ1bCAJOgkxCToJNjE0MDAKK0ltaXNobGkgCToJMQk6CTEwOTEwMAorSXNtYXlpbGx5IAk6CTEJOgk3NjMwMAorSmFicmFpbCByYXlvbiAJOgkxCToJNjU0MDAKK0phbGlsYWJhZCAJOgkxCToJMTgyMTAwCitLYWxiYWphciAJOgkxCToJNzIyMDAKK0toYWNobWF6IAk6CTEJOgkxNTI4MDAKK0toYW5rZW5kaSBDaXR5IHQuZC4gCToJMQk6CTU0NzAwCitLaGFubGFyIAk6CTEJOgk1NTEwMAorS2hvamFseSByYXlvbiAJOgkxCToJMjQ4MDAKK0tob2phdmFuZCByYXlvbiAJOgkxCToJNDA2MDAKK0toeXppIAk6CTEJOgkxMzkwMAorS3VyZGFtaXIgCToJMQk6CTk4NDAwCitMYWNoaW4gcmF5b24gCToJMQk6CTY4MTAwCitMYW5rYXJhbiAJOgkxCToJMTk3OTAwCitMZXJpayAJOgkxCToJNjk2MDAKK01hc2FsbHkgCToJMQk6CTE4NDkwMAorTWluZ2VjaGV2aXIgQ2l0eSAJOgkxCToJOTUzMDAKK05hZnRhbGFuIENpdHkgCToJMQk6CTc1MDAKK05ha2hpY2hldmFuIAk6CTEJOgkzNzI5MDAKK05ha2hjaGl2YW4gQ2l0eSAJOgkxCToJNzAwMDAKK0JhYmVrIAk6CTEJOgk2NjAwMAorSnVsZmEgCToJMQk6CTM4MzAwCitHaXZyYWhrIAk6CTEJOgkyNTUwMAorT3JkdWJhZCAJOgkxCToJNDI3MDAKK0hleWRhcmFiYWQgCToJMQk6CTEyOTAwCitTaGFoYnV6IAk6CTEJOgkyMTUwMAorU2hhcnVyIAk6CTEJOgk5NjAwMAorTmVmdGNoYWxhIAk6CTEJOgk3NTUwMAorT2d1eiAJOgkxCToJMzg4MDAKK1NhYXRseSAJOgkxCToJODc1MDAKK1NhYmlyYWJhZCAJOgkxCToJMTQzODAwCitTYWx5YW4gCToJMQk6CTExNzQwMAorTmFiaWFnYWxpIAk6CTEJOgk1MDkwMAorU2hha2kgCToJMQk6CTE2NDcwMAorU2hhbWFraHkgCToJMQk6CTg2MDAwCitTaGFta2lyIAk6CTEJOgkxODE0MDAKK1NodXNoYSByYXlvbiAJOgkxCToJMjYwMDAKK1NpeWF6YW4gCToJMQk6CTM1ODAwCitTdW1nYWl0IENpdHkgdC5kLiAJOgkxCToJMjkyNTAwCitUYXJ0YXIgCToJMQk6CTk1NTAwCitUb3Z1eiAJOgkxCToJMTUwMzAwCitVamFyIAk6CTEJOgk3NDcwMAorWWFyZGltbHkgCToJMQk6CTU0MzAwCitZZXZsYWtoIAk6CTEJOgkxMTI3MDAKK1phZ2F0YWxhIAk6CTEJOgkxMTE1MDAKK1phbmdpbGFuIHJheW9uIAk6CTEJOgkzNzEwMAorWmFyZGFiIAk6CTEJOgk0OTMwMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JBSFJBSU5fQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkFIUkFJTl9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODA2YjNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JBSFJBSU5fQVJFQS50eHQKQEAgLTAsMCArMSwxNyBAQAorQmFocmFpbgk6CTAJOgk2NTUKK0JhaHJhaW4gOiAxIDogNjY1CitDZW50cmFsIFJlZ2lvbiAgCToJMQk6CTM1LjQyCitIYW1hZCBUb3duIAk6CTEJOgkxMy4xMgorSGlkZCAJOgkxCToJMTMuNzMKK0lzYSBUb3duIAk6CTEJOgkxMi40MworSmlkaGFmcyAJOgkxCToJMjQuMzMKK01hbmFtYSAJOgkxCToJMjcuNDgKK011aGFycmFxIAk6CTEJOgkyNC4zMQorTm9ydGhlcm4gUmVnaW9uIAk6CTEJOgkzNy40MworUmlmZmEgCToJMQk6CTI5Mi41CitTaXRyYSAJOgkxCToJMzAuMQorU291dGhlcm4gUmVnaW9uIAk6CTEJOgk1Mi4wOQorV2VzdGVybiBSZWdpb24gCToJMQk6CTE1Ny4yCisKKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkFIUkFJTl9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CQUhSQUlOX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NTJmODUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkFIUkFJTl9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDE0IEBACitCYWhyYWluCToJMAk6CTY5ODU4NQorQmFocmFpbiA6IDEgOiA2OTg1ODUKK0NlbnRyYWwgUmVnaW9uICAJOgkxCToJNDk5NjkKK0hhbWFkIFRvd24gCToJMQk6CTUyNzE4CitIaWRkIAk6CTEJOgkxMTYzNworSXNhIFRvd24gCToJMQk6CTM2ODMzCitKaWRoYWZzIAk6CTEJOgk1MjQ1MAorTWFuYW1hIAk6CTEJOgkxNTMzOTUKK011aGFycmFxIAk6CTEJOgk5MTkzOQorTm9ydGhlcm4gUmVnaW9uIAk6CTEJOgk0MzY5MQorUmlmZmEgCToJMQk6CTc5OTg1CitTaXRyYSAJOgkxCToJNDM5MTAKK1NvdXRoZXJuIFJlZ2lvbiAJOgkxCToJMzg3NQorV2VzdGVybiBSZWdpb24gCToJMQk6CTI2MTQ5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkFOR0xBREVTSF9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CQU5HTEFERVNIX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YWEyMzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkFOR0xBREVTSF9BUkVBLnR4dApAQCAtMCwwICsxLDcxIEBACitCYW5nbGFkZXNoCToJMAk6CTE0NDAwMAorQmFyaXNhbCBEaXYJOgkxCToJMTMyOTcKK0Jhcmd1bmEgWkwJOgkxCToJMTgzMgorQmFyaXNhbCBaTAk6CTEJOgkyNzkxCitCaG9sYSBaTAk6CTEJOgkzNDAzCitKaGFsYWtoYXRpIAk6CTEJOgk3NTgKK1BhdHVha2hhbGkgCToJMQk6CTMyMDUKK1Bpcm9qcHVyIAk6CTEJOgkxMzA4CitDaGl0dGFnb25nIERpdgk6CTEJOgkzMzc3MQorQmFuZGFyYmFuIFpMCToJMQk6CTQ0NzkKK0JyYWhtYW5iYXJpYSAJOgkxCToJMTkyNworQ2hhbmRwdXIgWkwJOgkxCToJMTcwNAorQ2hpdHRhZ29uZyBaTAk6CTEJOgk1MjgzCitDb21pbGxhIAk6CTEJOgkzMDg1CitDb3ggQmF6YXIgCToJMQk6CTI0OTIKK0ZlbmkgWkwJOgkxCToJOTI4CitLaGFncmFjaGhhcmkgWkwJOgkxCToJMjcwMAorTGFrc21pcHVyIAk6CTEJOgkxNDU2CitOb2FraGFsaSBaTAk6CTEJOgkzNjAxCitSYW5nYW1hdGkgWkwJOgkxCToJNjExNgorRGhha2EgWklMQQk6CTEJOgkzMTExOQorRGhha2EgRGl2CToJMQk6CTE0NjQKK0ZhcmlkcHVyIFpMCToJMQk6CTIwNzMKK0dhemlwdXIgWkwJOgkxCToJMTc0MQorR29wYWxnYW5qIAk6CTEJOgkxNDkwCitKYW1hbHB1ciBaTAk6CTEJOgkyMDMyCitLaXNob3JlZ2FuaiBaTAk6CTEJOgkyNjg5CitNYWRhcmlwdXIgWkwJOgkxCToJMTE0NQorTWFuaWtnYW5qIFpMCToJMQk6CTEzNzkKK011bnNoaWdhbmogWkwJOgkxCToJOTU1CitNeW1lbnNpbmdoIFpMCToJMQk6CTQzNjMKK05hcmF5YW5nYW5qIFpMCToJMQk6CTc1OQorTmFyc2luZ2RpIFpMCToJMQk6CTExNDEKK05ldHJva29uYSBaTAk6CTEJOgkyODEwCitSYWpiYXJpIFpMCToJMQk6CTExMTkKK1NoYXJpYXRwdXIgCToJMQk6CTExODEKK1NoZXJwdXIgCToJMQk6CTEzNjQKK1RhbmdhaWwgCToJMQk6CTM0MTQKK0todWxuYSAJOgkxCToJMjIyNzQKK0JhZ2VyaGF0IAk6CTEJOgkzOTU5CitDaHVhZGFuZ2EgCToJMQk6CTExNTgKK0plc3NvcmUgCToJMQk6CTI1NjcKK0poZW5haWRhaCAJOgkxCToJMTk2MQorS2h1bG5hIERpdgk6CTEJOgk0Mzk1CitLdXNodGlhIAk6CTEJOgkxNjIxCitNYWd1cmEgCToJMQk6CTEwNDkKK01laGVycHVyIAk6CTEJOgk3MTYKK05hcmFpbCAJOgkxCToJOTkwCitTYXRraGlyYSAJOgkxCToJMzg1OAorUmFqc2hhaGkgCToJMQk6CTM0NTEzCitCb2dyYSAJOgkxCToJMjkyMAorRGluYWpwdXIgCToJMQk6CTM0MzgKK0dhaWJhbmRoYSAJOgkxCToJMjE3OQorSm95cHVyaGF0IAk6CTEJOgk5NjUKK0t1cmlncmFtIAk6CTEJOgkyMjk2CitMYWxtb25pcmhhdCAJOgkxCToJMTI0MgorTmFvZ2FvbiAJOgkxCToJMzQzNgorTmF0b3JlIAk6CTEJOgkxODk2CitOYXdhYmdhbmogCToJMQk6CTE3MDIKK05pbHBoYW1hcmkgCToJMQk6CTE2NDEKK1BhYm5hIAk6CTEJOgkyMzcxCitQYW5jaGFnYXJoIAk6CTEJOgkxNDA1CitSYWpzaGFoaSBEaXYJOgkxCToJMjQwNworUmFuZ3B1ciAJOgkxCToJMjMwNgorU2lyYWpnYW5qIAk6CTEJOgkyNDk4CitUaGFrdXJnYW9uIAk6CTEJOgkxODA5CitTeWxoZXQgCToJMQk6CTEyNTk2CitIYWJpZ2FuaiAJOgkxCToJMjYzNworTW91bHZpYmF6YXIgCToJMQk6CTI3OTkKK1N1bmFtZ2FuaiAJOgkxCToJMzY3MAorU3lsaGV0IAk6CTEJOgkzNDkwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkFOR0xBREVTSF9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CQU5HTEFERVNIX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYTkyMTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkFOR0xBREVTSF9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDcxIEBACitCYW5nbGFkZXNoCToJMAk6CTE0NzM2NTM1MgorQmFyaXNhbCBEaXYJOgkxCToJODExMjQzNQorQmFyZ3VuYSBaTAk6CTEJOgk4Mzc5NTUKK0JhcmlzYWwgWkwJOgkxCToJMjMzMDk2MAorQmhvbGEgWkwJOgkxCToJMTY3NjYwMAorSmhhbGFraGF0aSAJOgkxCToJNjk2MDU1CitQYXR1YWtoYWxpIAk6CTEJOgkxNDQ0MzQwCitQaXJvanB1ciAJOgkxCToJMTEyNjUyNQorQ2hpdHRhZ29uZyBEaXYJOgkxCToJMjM5OTkzNDUKK0JhbmRhcmJhbiBaTAk6CTEJOgkyOTI5MDAKK0JyYWhtYW5iYXJpYSAJOgkxCToJMjM2NTg4MAorQ2hhbmRwdXIgWkwJOgkxCToJMjIxMDE2MgorQ2hpdHRhZ29uZyBaTAk6CTEJOgk2NTQ1MDc4CitDb21pbGxhIAk6CTEJOgk0NTg2ODc5CitDb3ggQmF6YXIgCToJMQk6CTE3NTczMjEKK0ZlbmkgWkwJOgkxCToJMTE5NjIxOQorS2hhZ3JhY2hoYXJpIFpMCToJMQk6CTUyNDk2MQorTGFrc21pcHVyIAk6CTEJOgkxNDc5MzcxCitOb2FraGFsaSBaTAk6CTEJOgkyNTMzMzk0CitSYW5nYW1hdGkgWkwJOgkxCToJNTA3MTgwCitEaGFrYSBaSUxBCToJMQk6CTM4Njc3ODc2CitEaGFrYSBEaXYJOgkxCToJODU3NTUzMworRmFyaWRwdXIgWkwJOgkxCToJMTcxOTQ5NgorR2F6aXB1ciBaTAk6CTEJOgkyMDI2MjQ0CitHb3BhbGdhbmogCToJMQk6CTExMzIwNDYKK0phbWFscHVyIFpMCToJMQk6CTIwODkzNjYKK0tpc2hvcmVnYW5qIFpMCToJMQk6CTI1MjUyMjEKK01hZGFyaXB1ciBaTAk6CTEJOgkxMTM3MDA4CitNYW5pa2dhbmogWkwJOgkxCToJMTI3NDgyOQorTXVuc2hpZ2FuaiBaTAk6CTEJOgkxMjkzNTM2CitNeW1lbnNpbmdoIFpMCToJMQk6CTQ0MzkwMTcKK05hcmF5YW5nYW5qIFpMCToJMQk6CTIxMzg0OTIKK05hcnNpbmdkaSBaTAk6CTEJOgkxODkxMjgxCitOZXRyb2tvbmEgWkwJOgkxCToJMTkzNzc5NAorUmFqYmFyaSBaTAk6CTEJOgk5NDAzNjAKK1NoYXJpYXRwdXIgCToJMQk6CTEwNTcxODEKK1NoZXJwdXIgCToJMQk6CTEyNDY1MTEKK1RhbmdhaWwgCToJMQk6CTMyNTM5NjEKK0todWxuYSBEaXYJOgkxCToJMTQ0Njg4MTkKK0JhZ2VyaGF0IAk6CTEJOgkxNTE1ODE1CitDaHVhZGFuZ2EgCToJMQk6CTk4NzM4MgorSmVzc29yZSAJOgkxCToJMjQ0MDY5MworSmhlbmFpZGFoIAk6CTEJOgkxNTU0NTE0CitLaHVsbmEgCToJMQk6CTIzMzQyODUKK0t1c2h0aWEgCToJMQk6CTE3MTMyMjQKK01hZ3VyYSAJOgkxCToJODExMTYwCitNZWhlcnB1ciAJOgkxCToJNTc5NTMxCitOYXJhaWwgCToJMQk6CTY4OTAyMQorU2F0a2hpcmEgCToJMQk6CTE4NDMxOTQKK1JhanNoYWhpIAk6CTEJOgkyOTk5Mjk1NQorQm9ncmEgCToJMQk6CTI5ODg1NjcKK0RpbmFqcHVyIAk6CTEJOgkyNjE3OTQyCitHYWliYW5kaGEgCToJMQk6CTIxMTc5NTkKK0pveXB1cmhhdCAJOgkxCToJODQ0ODE0CitLdXJpZ3JhbSAJOgkxCToJMTc4MjI3NworTGFsbW9uaXJoYXQgCToJMQk6CTEwODg5MTgKK05hb2dhb24gCToJMQk6CTIzNzczMTQKK05hdG9yZSAJOgkxCToJMTUyMTM1OQorTmF3YWJnYW5qIAk6CTEJOgkxNDE5NTM2CitOaWxwaGFtYXJpIAk6CTEJOgkxNTUwNjg2CitQYWJuYSAJOgkxCToJMjE1MzkyMQorUGFuY2hhZ2FyaCAJOgkxCToJODI5Mzc0CitSYWpzaGFoaSBEaXYJOgkxCToJMjI2MjQ4MworUmFuZ3B1ciAJOgkxCToJMjUzNDM2NQorU2lyYWpnYW5qIAk6CTEJOgkyNzA3MDExCitUaGFrdXJnYW9uIAk6CTEJOgkxMTk2NDI5CitTeWxoZXQgCToJMQk6CTc4OTk4MTYKK0hhYmlnYW5qIAk6CTEJOgkxNzU3MzMxCitNb3VsdmliYXphciAJOgkxCToJMTYwNDAyOAorU3VuYW1nYW5qIAk6CTEJOgkxOTY4NjY5CitTeWxoZXQgCToJMQk6CTI1Njk3ODgKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CRUxBUlVTX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JFTEFSVVNfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRkNDBlMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CRUxBUlVTX0FSRUEudHh0CkBAIC0wLDAgKzEgQEAKK0JFTEFSVVMgOiAwIDogMjA3NjAwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkVMQVJVU19QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CRUxBUlVTX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZjMxN2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkVMQVJVU19QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDIgQEAKK0JFTEFSVVMgOiAwIDogOTc1MDUwMAorIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JFTEdJVU1fQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkVMR0lVTV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRmMDM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JFTEdJVU1fQVJFQS50eHQKQEAgLTAsMCArMSwxMiBAQAorIEJFTEdJVU0gOiAwIDogMzA1MjguMAorIEFOVFdFUlBFTiA6IDEgOiAyODY3LjAKKyBXRVNULVZMQUFOREVSRU4gOiAxIDogMzEzNC4wCisgT09TVC1WTEFBTkRFUkVOIDogMSA6IDI5ODIuMAorIExJTUJVUkcgOiAxIDogMjQyMi4wCisgVU5LTk9XTiA6IDEgOiAxLjAKKyBCUlVYRUxMRVMtQlJVU1NFTCA6IDEgOiAxNjEuMAorIExJRUdFIDogMSA6IDM4NjIuMAorIEhBSU5BVVQgOiAxIDogMzc4NS4wCisgTklWRUxMRVMgOiAxIDogMTA5MS4wCisgTkFNVVIgOiAxIDogMzY2Ni4wCisgTFVYRU1CT1VSRyA6IDEgOiA0NDM5LjAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CRUxHSVVNX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JFTEdJVU1fUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlN2E2YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CRUxHSVVNX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMTEgQEAKKyBBTlRXRVJQRU4gOiAxIDogMTYwNDYwMAorIFdFU1QtVkxBQU5ERVJFTiA6IDEgOiAxMzM1NzAwCisgT09TVC1WTEFBTkRFUkVOIDogMSA6IDEzMzE2MDAKKyBMSU1CVVJHIDogMSA6IDExMDk4MDAKKyBVTktOT1dOIDogMSA6IDAKKyBCUlVYRUxMRVMtQlJVU1NFTCA6IDEgOiA5NjQ0MDAKKyBMSUVHRSA6IDEgOiAxMDAwNzAwCisgSEFJTkFVVCA6IDEgOiAxMjgwMzAwCisgTklWRUxMRVMgOiAxIDogMjQyOTAgCisgTkFNVVIgOiAxIDogNDIzNzAwCisgTFVYRU1CT1VSRyA6IDEgOiAzNzg0MDAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CRUxJWkVfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkVMSVpFX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzM5NjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkVMSVpFX0FSRUEudHh0CkBAIC0wLDAgKzEgQEAKK0JFTElaRSA6IDAgOiAyMjk2NApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JFTElaRV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CRUxJWkVfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2ZjA4MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CRUxJWkVfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSBAQAorQkVMSVpFIDogMCA6IDI5MTgwMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JFTklOX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JFTklOX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NzA3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkVOSU5fQVJFQS50eHQKQEAgLTAsMCArMSwxNCBAQAorQmVuaW4JOgkwCToJMTEyNjIwCisgQWxpYm9yaSAgCToJMQk6CTI2MzAzCisgQXRhY29yYSBbQXRha29yYV0JOgkxCToJMjM4NDcKKyBBdGxhbnRpcXVlIAk6CTEJOgkzMjM5CisgQm9yZ291IAk6CTEJOgkyNTMxMAorIENvbGxpbmVzIAk6CTEJOgkxMzg1OAorIERvbmdhIAk6CTEJOgkxMTE2NgorIExpdHRvcmFsIAk6CTEJOgk3OQorIE1vbm8gCToJMQk6CTE1ODcKKyBPdWVtZSAJOgkxCToJMTY3NgorIFBsYXRlYXUgCToJMQk6CTM4MDcKKyBab3UgCToJMQk6CTU2NjcKKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkVOSU5fUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkVOSU5fUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2YzViNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CRU5JTl9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDEyIEBACitCZW5pbgk6CTAJOgk3ODYyOTQ0CisgQWxpYm9yaSAgCToJMQk6CTUyMTA5MworIEF0YWNvcmEgW0F0YWtvcmFdCToJMQk6CTU0OTQxNworIEF0bGFudGlxdWUgCToJMQk6CTgwMTY4MworIEJvcmdvdSAJOgkxCToJNzI0MTcxCisgQ29sbGluZXMgCToJMQk6CTUzNTkyMworIERvbmdhIAk6CTEJOgkzNTAwNjIKKyBMaXR0b3JhbCAJOgkxCToJNjY1MTAwCisgTW9ubyAJOgkxCToJMzYwMDM3CisgT3VlbWUgCToJMQk6CTczMDc3MgorIFBsYXRlYXUgCToJMQk6CTQwNzExNgorIFpvdSAJOgkxCToJNTk5OTU0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkhVVEFOX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JIVVRBTl9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjY2OGE2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JIVVRBTl9BUkVBLnR4dApAQCAtMCwwICsxLDIxIEBACitCaHV0YW4JOgkwCToJNDcwMDAKK0J1bXRoYW5nICAJOgkxCToJMjk5MAorQ2h1a2hhIAk6CTEJOgkyMzkwCitEYWdhbmEgW0RhZ2FdCToJMQk6CTE0MDAKK0dhc2EgCToJMQk6CTQ5MTAKK1NhcnBhbmcgW0dheWxlZ3BodWcgKFNhcmJoYW5nKV0JOgkxCToJMTg4NAorSGFhIAk6CTEJOgkxNzA0CitMaHVudHNoaSAJOgkxCToJMjkxMAorTW9uZ2FyIAk6CTEJOgkxODMwCitQYXJvIAk6CTEJOgkxMjgxCitQZW1hIGdhdHNoZWwgCToJMQk6CTM4MAorUHVuYWtoYSAJOgkxCToJNjA0MAorU2FtZHJ1cCBKb25na2hhciAJOgkxCToJMjM0MAorU2FtdHNlIFtTYW1jaGldCToJMQk6CTE1NzYKK1RoaW1waHUgCToJMQk6CTE4MTkKK1RyYXNoaWdhbmcgW1Rhc2hpZ2FuZ10JOgkxCToJMzE1NgorVHJhc2hpeWFuZ3RzZSAJOgkxCToJMAorVHJvbmdzYSBbVG9uZ3NhXQk6CTEJOgkxODA1CitUc2lyYW5nIFtDaGlyYW5nXQk6CTEJOgk2NDAKK1dhbmdkdWUgUGhvZHJhbmcgW1dhbmdkaXBob2RyYW5nXQk6CTEJOgkzMDAwCitaaGVtZ2FuZyBbU2hlbmdhbmddCToJMQk6CTE4MTcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CSFVUQU5fUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkhVVEFOX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMzA2ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQkhVVEFOX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMjEgQEAKK0JodXRhbgk6CTAJOgkyMjc5NzIzCitCdW10aGFuZyAgCToJMQk6CTIzODQyCitDaHVraGEgCToJMQk6CTc0Mzg3CitEYWdhbmEgW0RhZ2FdCToJMQk6CTI4MzUyCitHYXNhIAk6CTEJOgkxNjkwNworU2FycGFuZyBbR2F5bGVncGh1ZyAoU2FyYmhhbmcpXQk6CTEJOgkxMTEyODMKK0hhYSAJOgkxCToJMTY3MTUKK0xodW50c2hpIAk6CTEJOgkzOTYzNQorTW9uZ2FyIAk6CTEJOgk3MzIzOQorUGFybyAJOgkxCToJNDY2MTUKK1BlbWEgZ2F0c2hlbCAJOgkxCToJMzcxNDEKK1B1bmFraGEgCToJMQk6CTE2NzAwCitTYW1kcnVwIEpvbmdraGFyIAk6CTEJOgk3MzA0NAorU2FtdHNlIFtTYW1jaGldCToJMQk6CTE3MjEwOQorVGhpbXBodSAJOgkxCToJNTg2NjAKK1RyYXNoaWdhbmcgW1Rhc2hpZ2FuZ10gCToJMQk6CTE3NzcxOAorVHJhc2hpeWFuZ3RzZSAJOgkxCToJMAorVHJvbmdzYSBbVG9uZ3NhXQk6CTEJOgkyNjAxNworVHNpcmFuZyAgW0NoaXJhbmddCToJMQk6CTEwODgwNworV2FuZ2R1ZSBQaG9kcmFuZyBbV2FuZ2RpcGhvZHJhbmddCToJMQk6CTQ3MTUyCitaaGVtZ2FuZyBbU2hlbmdhbmddCToJMQk6CTQ0NTE2CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQk9MSVZJQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CT0xJVklBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYWFkYTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQk9MSVZJQV9BUkVBLnR4dApAQCAtMCwwICsxLDEyNiBAQAorQm9saXZpYQk6CTAJOgkxMDk4NTgwCitCZW5pIDogMSA6IDIxMzU2NCAKK0NodXF1aXNhY2EgOiAxIDogNTE1MjQKK1BhbmRvIDogMSA6IDYzODI3CitMYSBQYXogIAk6CTEJOgkxMzM5ODUKK1BhbGNhIAk6CTEJOgkwCitBY2hhY2FjaGkgCToJMQk6CTAKK0Nvcm9jb3JvIAk6CTEJOgkwCitQdWVydG8gQWNvc3RhIAk6CTEJOgkwCitDaHVtYSAJOgkxCToJMAorU29yYXRhIAk6CTEJOgkwCitBcG9sbyAJOgkxCToJMAorVmlhY2hhIAk6CTEJOgkwCitMdXJpYmF5IAk6CTEJOgkwCitJbnF1aXNpdmkgCToJMQk6CTAKK0NodWx1bWFuaSAJOgkxCToJMAorUHVjYXJhbmkgCToJMQk6CTAKK1ZpbGxhIEFyb21hIAk6CTEJOgkwCitDb3JvaWNvIAk6CTEJOgkwCitJeGlhbWFzIAk6CTEJOgkwCitWaWxsYSBHZW5lcmFsIFBlcmV6IAk6CTEJOgkwCitDb3BhY2FiYW5hIAk6CTEJOgkwCitTYW4gUGVkcm8gZGUgQ3VyYWh1YXJhIAk6CTEJOgkwCitTYW50aWFnbyBkZSBNYWNoYWNhIAk6CTEJOgkwCitDYXJhbmF2aSAJOgkxCToJMAorT3J1cm8gCToJMQk6CTUzNTg4CitPcnVybyAJOgkxCToJMAorQ2hhbGxhcGF0YSAJOgkxCToJMAorQ29ycXVlIAk6CTEJOgkwCitDaXVkYWQgZGUgQ2FyYW5nYXMgCToJMQk6CTAKK0h1YWNoYWNhbGxhIAk6CTEJOgkwCitQb29w8yAJOgkxCToJMAorSHVhbnVuaSAJOgkxCToJMAorU2FsaW5hcyBkZSBHLiBNLiAJOgkxCToJMAorU2FiYXlhIAk6CTEJOgkwCitUb2xlZG8gCToJMQk6CTAKK0V1Y2FsaXB0dXMgCToJMQk6CTAKK0FuZGFtYXJjYSAJOgkxCToJMAorVG90b3JhIAk6CTEJOgkwCitTYW50aWFnbyBkZSBILiAJOgkxCToJMAorTGEgUml2ZXJhIAk6CTEJOgkwCitIdWF5bGxhbWFyY2EgCToJMQk6CTAKK1BvdG9zaSAJOgkxCToJMTE4MjE4CitVbmNpYSAJOgkxCToJMAorQmV0YW56b3MgCToJMQk6CTAKK0NvbHF1ZWNoYXF1YSAJOgkxCToJMAorU2FuIFBlZHJvIAk6CTEJOgkwCitDb3RhZ2FpdGEgCToJMQk6CTAKK1NhY2FjYSAJOgkxCToJMAorVHVwaW5pIAk6CTEJOgkwCitDb2xjaGEgCToJMQk6CTAKK1NhbiBQYWJsbyBkZSBM7XBleiAJOgkxCToJMAorUHVuYSAJOgkxCToJMAorVXl1bmkgCToJMQk6CTAKK0FyYW1wYW1wYSAJOgkxCToJMAorTGxpY2EgCToJMQk6CTAKK1ZpbGxhem9uIAk6CTEJOgkwCitTYW4gQWd1c3RpbiAJOgkxCToJMAorU2FudGEgQ3J1eiBbU2FudGEgQ3J1eiBkZSBsYSBTaWVycmFdIAk6CTEJOgkzNzA2MjEKK0FuZHJlcyBJYmFuZXoJOgkxCToJMAorV2FybmVzIAk6CTEJOgkwCitTYW4gSWduYWNpbyAJOgkxCToJMAorQnVlbmEgVmlzdGEgCToJMQk6CTAKK1NhbiBKb3NlIAk6CTEJOgkwCitQb3J0YWNodWVsbyAJOgkxCToJMAorTGFndW5pbGxhcyAJOgkxCToJMAorVmFsbGVncmFuZGUgCToJMQk6CTAKK1NhbWFpcGF0YSAJOgkxCToJMAorTW9udGVybyAJOgkxCToJMAorQ29uY2VwY2nzbiAJOgkxCToJMAorU2FuIE1hdGlhcyAJOgkxCToJMAorQ29tYXJhcGEgCToJMQk6CTAKK1B1ZXJ0byBTdWFyZXogCToJMQk6CTAKK0FzY2VuY2lvbiBkZSBHdWFyYXlvcyAJOgkxCToJMAorVHJpbmlkYWQgCToJMQk6CTIxMzU2NAorVHJpbmlkYWQgZGUgTW9qb3MgCToJMQk6CTAKK1JpYmVyYWx0YSAJOgkxCToJMAorUmV5ZXMgCToJMQk6CTAKK1NhbnRhIEFuYSAJOgkxCToJMAorU2FuIElnbmFjaW8gCToJMQk6CTAKK0xvcmV0byAJOgkxCToJMAorU2FuIEpvYXF1aW4gCToJMQk6CTAKK01hZ2RhbGVuYSAJOgkxCToJMAorQ29iaWphIAk6CTEJOgk2MzgyNworQ29iaWphIAk6CTEJOgkwCitQdWVydG8gUmljbyAJOgkxCToJMAorUHVlcnRvIEcuIE0uIAk6CTEJOgkwCitTYW50YSBSb3NhIGRlbCBBYnVu4SAJOgkxCToJMAorTnVldmEgRXNwZXJhbnphIAk6CTEJOgkwCitTdWNyZSAJOgkxCToJNTE1MjQKK1N1Y3JlIAk6CTEJOgkwCitBenVyZHV5IAk6CTEJOgkwCitWaWxsYSBadWRh8WV6IAk6CTEJOgkwCitQYWRpbGxhIAk6CTEJOgkwCitNb250ZWFndWRvIAk6CTEJOgkwCitUYXJhYnVjbyAJOgkxCToJMAorQ2FtYXJnbyAJOgkxCToJMAorVmlsbGEgU2VycmFubyAJOgkxCToJMAorQ2FtYXRhcXVpIAk6CTEJOgkwCitWaWxsYSBWaXR0b3JpbyBHdXptYW4gCToJMQk6CTAKK0NvY2hhYmFtYmEgCToJMQk6CTU1NjMxCitDb2NoYWJhbWJhIAk6CTEJOgkwCitBaXF1aWxlIAk6CTEJOgkwCitJbmRlcGVuZGVuY2lhIAk6CTEJOgkwCitUYXJhdGEgCToJMQk6CTAKK0FyYW5pIAk6CTEJOgkwCitBcnF1ZSAJOgkxCToJMAorQ2FwaW5vdGEgCToJMQk6CTAKK0NsaXphIAk6CTEJOgkwCitRdWlsbGFjb2xsbyAJOgkxCToJMAorU2FjYWJhIAk6CTEJOgkwCitUYXBhY2Fy7SAJOgkxCToJMAorVG90b3JhIAk6CTEJOgkwCitNaXpxdWUgCToJMQk6CTAKK1B1bmF0YSAJOgkxCToJMAorQm9s7XZhciAJOgkxCToJMAorVGlyYXF1ZSAJOgkxCToJMAorVGFyaWphIAk6CTEJOgkzNzYyMworVGFyaWphIAk6CTEJOgkwCitQYWRjYXlhIAk6CTEJOgkwCitZYWN1aWJhIAk6CTEJOgkwCitVcmlvbmRvIAk6CTEJOgkwCitTYW4gTG9yZW56byAJOgkxCToJMAorRW50cmUgUmlvcyAJOgkxCToJMAorCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CT0xJVklBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JPTElWSUFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmZGU0YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CT0xJVklBX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMTI1IEBACitCb2xpdmlhCToJMAk6CTg5ODkwNDYKK0JlbmkgOiAxIDogNDE0ODAwCitDaHVxdWlzYWNhIDogMSA6IDYxMTcwMAorUGFuZG8gOiAxIDogNjk1MDAKK0xhIFBheiAgCToJMQk6CTI2MzAzODEKK1BhbGNhIAk6CTEJOgkxNjgzOTIwCitBY2hhY2FjaGkgCToJMQk6CTkzMzc0CitDb3JvY29ybyAJOgkxCToJNTMxMTMKK1B1ZXJ0byBBY29zdGEgCToJMQk6CTYxMDgxCitDaHVtYSAJOgkxCToJMjk2OTgKK1NvcmF0YSAJOgkxCToJNjkyOTUKK0Fwb2xvIAk6CTEJOgkxOTIyMAorVmlhY2hhIAk6CTEJOgkxMDY4NzQKK0x1cmliYXkgCToJMQk6CTQ4NjA3CitJbnF1aXNpdmkgCToJMQk6CTYyMDMwCitDaHVsdW1hbmkgCToJMQk6CTcwNjYwCitQdWNhcmFuaSAJOgkxCToJNzQ2OTMKK1ZpbGxhIEFyb21hIAk6CTEJOgk5OTE2MgorQ29yb2ljbyAJOgkxCToJMjU3NTkKK0l4aWFtYXMgCToJMQk6CTE0MDYwCitWaWxsYSBHZW5lcmFsIFBlcmV6IAk6CTEJOgkxMjQzNworQ29wYWNhYmFuYSAJOgkxCToJMjQ1MDIKK1NhbiBQZWRybyBkZSBDdXJhaHVhcmEgCToJMQk6CTE4NjIyCitTYW50aWFnbyBkZSBNYWNoYWNhIAk6CTEJOgk3MTA3CitDYXJhbmF2aSAJOgkxCToJNTYxNjcKK09ydXJvIAk6CTEJOgk0MzM0ODEKK09ydXJvIAk6CTEJOgkyNjI4NDcKK0NoYWxsYXBhdGEgCToJMQk6CTMwODkwCitDb3JxdWUgCToJMQk6CTEyMjQ2CitDaXVkYWQgZGUgQ2FyYW5nYXMgCToJMQk6CTk5OTUKK0h1YWNoYWNhbGxhIAk6CTEJOgk2NTA5CitQb29w8yAJOgkxCToJMTQ1ODkKK0h1YW51bmkgCToJMQk6CTIzOTQ2CitTYWxpbmFzIGRlIEcuIE0uIAk6CTEJOgkxNDcwNgorU2FiYXlhIAk6CTEJOgk5Nzk0CitUb2xlZG8gCToJMQk6CTkyNDUKK0V1Y2FsaXB0dXMgCToJMQk6CTU4MTIKK0FuZGFtYXJjYSAJOgkxCToJNzU3NgorVG90b3JhIAk6CTEJOgk1NTcwCitTYW50aWFnbyBkZSBILiAJOgkxCToJMTE5MzkKK0xhIFJpdmVyYSAJOgkxCToJMTM4MgorSHVheWxsYW1hcmNhIAk6CTEJOgk2NDM1CitQb3Rvc+0gCToJMQk6CTc2ODIwMworUG90b3NpIAk6CTEJOgkxOTgxNjMKK1VuY2lhIAk6CTEJOgk3ODY3NAorQmV0YW56b3MgCToJMQk6CTYzNzk5CitDb2xxdWVjaGFxdWEgCToJMQk6CTEwMjE5OAorU2FuIFBlZHJvIAk6CTEJOgk0MzA4NAorQ290YWdhaXRhIAk6CTEJOgkzNTUzNAorU2FjYWNhIAk6CTEJOgkzMDg3OQorVHVwaW5pIAk6CTEJOgk0Nzk2MQorQ29sY2hhIAk6CTEJOgkxMTk0MworU2FuIFBhYmxvIGRlIEztcGV6IAk6CTEJOgk1NDU4CitQdW5hIAk6CTEJOgk1Mjk0NgorVXl1bmkgCToJMQk6CTM5MTE1CitBcmFtcGFtcGEgCToJMQk6CTExMjk0CitMbGljYSAJOgkxCToJNTQ2OQorVmlsbGF6b24gCToJMQk6CTM5ODE1CitTYW4gQWd1c3RpbiAJOgkxCToJMTg3MQorU2FudGEgQ3J1eiBbU2FudGEgQ3J1eiBkZSBsYSBTaWVycmFdIAk6CTEJOgkyMzg4Nzk5CitBbmRyZXMgSWJhbmV6CToJMQk6CTE1MjYxODcKK1dhcm5lcyAJOgkxCToJNjA3MDUKK1NhbiBJZ25hY2lvIAk6CTEJOgk2MzMxMgorQnVlbmEgVmlzdGEgCToJMQk6CTgxMTE4CitTYW4gSm9zZSAJOgkxCToJNjg0NDUKK1BvcnRhY2h1ZWxvIAk6CTEJOgk0MTUxMQorTGFndW5pbGxhcyAJOgkxCToJMTA3MjE1CitWYWxsZWdyYW5kZSAJOgkxCToJMjc4NzAKK1NhbWFpcGF0YSAJOgkxCToJMjk1MTkKK01vbnRlcm8gCToJMQk6CTE2MTMwNworQ29uY2VwY2nzbiAJOgkxCToJMTExODEzCitTYW4gTWF0aWFzIAk6CTEJOgkxNDEzNQorQ29tYXJhcGEgCToJMQk6CTIxNzk4CitQdWVydG8gU3VhcmV6IAk6CTEJOgkzNjU4OQorQXNjZW5jaW9uIGRlIEd1YXJheW9zIAk6CTEJOgkzNzI3NQorVHJpbmlkYWQgCToJMQk6CTQwNjk4MgorVHJpbmlkYWQgZGUgTW9qb3MgCToJMQk6CTkyNTUzCitSaWJlcmFsdGEgCToJMQk6CTEzMjk3NAorUmV5ZXMgCToJMQk6CTc5MzE4CitTYW50YSBBbmEgCToJMQk6CTI5MjUxCitTYW4gSWduYWNpbyAJOgkxCToJMjM2MDgKK0xvcmV0byAJOgkxCToJMTU2NTgKK1NhbiBKb2FxdWluIAk6CTEJOgkxMzUzNAorTWFnZGFsZW5hIAk6CTEJOgkyMDA4NgorQ29iaWphIAk6CTEJOgk2NjY4OQorQ29iaWphIAk6CTEJOgkzOTU3NworUHVlcnRvIFJpY28gCToJMQk6CTk1MDUKK1B1ZXJ0byBHLiBNLiAJOgkxCToJMTEyMjAKK1NhbnRhIFJvc2EgZGVsIEFidW7hIAk6CTEJOgkzNDc1CitOdWV2YSBFc3BlcmFuemEgCToJMQk6CTI5MTIKK1N1Y3JlIAk6CTEJOgk2MDE4MjMKK1N1Y3JlIAk6CTEJOgkyODk3NDkKK0F6dXJkdXkgCToJMQk6CTI5Mzk3CitWaWxsYSBadWRh8WV6IAk6CTEJOgkzNjQ2OAorUGFkaWxsYSAJOgkxCToJNDA0NjIKK01vbnRlYWd1ZG8gCToJMQk6CTM5MDk0CitUYXJhYnVjbyAJOgkxCToJMzA0NzIKK0NhbWFyZ28gCToJMQk6CTc0OTQ5CitWaWxsYSBTZXJyYW5vIAk6CTEJOgkxMjgwOAorQ2FtYXRhcXVpIAk6CTEJOgkyNTI0NAorVmlsbGEgVml0dG9yaW8gR3V6bWFuIAk6CTEJOgkyMzE4MAorQ29jaGFiYW1iYSAJOgkxCToJMTY3MTg2MAorQ29jaGFiYW1iYSAJOgkxCToJNTc4MjE5CitBaXF1aWxlIAk6CTEJOgk0MDk4NgorSW5kZXBlbmRlbmNpYSAJOgkxCToJNjUxMDQKK1RhcmF0YSAJOgkxCToJMzM3NDAKK0FyYW5pIAk6CTEJOgkyNTAwOQorQXJxdWUgCToJMQk6CTI2NTY0CitDYXBpbm90YSAJOgkxCToJMjY3MjUKK0NsaXphIAk6CTEJOgkzNDQyNgorUXVpbGxhY29sbG8gCToJMQk6CTMxMzIwNAorU2FjYWJhIAk6CTEJOgkyMjExMTkKK1RhcGFjYXLtIAk6CTEJOgkyOTkzNworVG90b3JhIAk6CTEJOgkxMzk5MTcKK01penF1ZSAJOgkxCToJNDEwNjIKK1B1bmF0YSAJOgkxCToJNDg4NjQKK0JvbO12YXIgCToJMQk6CTk1NjMKK1RpcmFxdWUgCToJMQk6CTM3NDIxCitUYXJpamEgCToJMQk6CTQ1OTAwMQorVGFyaWphIAk6CTEJOgkxODMwMDEKK1BhZGNheWEgCToJMQk6CTU4MDc1CitZYWN1aWJhIAk6CTEJOgkxNDQzNjAKK1VyaW9uZG8gCToJMQk6CTE4Njk5CitTYW4gTG9yZW56byAJOgkxCToJMzQwNzAKK0VudHJlIFJpb3MgCToJMQk6CTIwNzk2CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQk9TTklBIEFORCBIRVJaRUdPVklOQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CT1NOSUEgQU5EIEhFUlpFR09WSU5BX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NjA3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQk9TTklBIEFORCBIRVJaRUdPVklOQV9BUkVBLnR4dApAQCAtMCwwICsxIEBACisgQm9zbmEgaSBIZXJjZWdvdmluYSA6IDEgOiA1MTEyOS4wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQk9TTklBIEFORCBIRVJaRUdPVklOQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CT1NOSUEgQU5EIEhFUlpFR09WSU5BX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMTJmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQk9TTklBIEFORCBIRVJaRUdPVklOQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxIEBACisgQm9zbmEgaSBIZXJjZWdvdmluYSA6IDEgOiA0NDgwNzkxCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQk9UU1dBTkFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQk9UU1dBTkFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4MjhmNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CT1RTV0FOQV9BUkVBLnR4dApAQCAtMCwwICsxIEBACitCT1RTV0FOQSA6IDAgOiA1ODE3MzAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CT1RTV0FOQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CT1RTV0FOQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGU0YzY5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JPVFNXQU5BX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEgQEAKK0JPVFNXQU5BIDogMCA6IDE2ODA4NjMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CUkFTSUxfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQlJBU0lMX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMzcwNTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQlJBU0lMX0FSRUEudHh0CkBAIC0wLDAgKzEsMzUgQEAKK0JyYXNpbAk6CTAJOgk4NTExOTY1CitDYXBhbmVtYSA6IDEgOiA0MDAwCitQb3J0byBYYXZpZXIgOiAxIDogMjY5MTUKK1JlZ2lhbyBDZW50cm8tT2VzdGUgIAk6CTEJOgkxNjEyMDc1CitEaXN0cml0byBGZWRlcmFsIAk6CTEJOgk1ODIyCitHb2lhcyAJOgkxCToJMzQxMjg5CitNYXRvIEdyb3NzbyAJOgkxCToJOTA2ODA2CitNYXRvIEdyb3NzbyBkbyBTdWwgCToJMQk6CTM1ODE1OAorUmVnaWFvIE5vcmRlc3RlIAk6CTEJOgkxNTU4MTk2CitBbGFnb2FzIAk6CTEJOgkyNzkzMworQmFoaWEgCToJMQk6CTU2NzI5NQorQ2VhcmEJOgkxCToJMTQ2MzQ4CitNYXJhbmhhbwk6CTEJOgkzMzMzNjUKK1BhcmFpYmEgCToJMQk6CTU2NTg0CitQZXJuYW1idWNvIAk6CTEJOgk5ODkzNworUGlhdWkgW01hcmFuaGFvL1BpYXVpXQk6CTEJOgkyNTIzNzgKK1JpbyBHcmFuZGUgZG8gTm9ydGUgCToJMQk6CTUzMzA2CitTZXJnaXBlIAk6CTEJOgkyMjA1MAorUmVnaWFvIE5vcnRlIAk6CTEJOgkzODY5NjM0CitBY3JlIAk6CTEJOgkxNTMxNDkKK0FtYXBhCToJMQk6CTE0MzQ1MworQW1hem9uYXMgCToJMQk6CTE1Nzc4MjAKK1BhcmEJOgkxCToJMTI1MzE2NAorUm9uZG9uaWEJOgkxCToJMjM4NTEyCitSb3JhaW1hIAk6CTEJOgkyMjUxMTYKK1RvY2FudGlucyAJOgkxCToJMjc4NDIwCitSZWdpYW8gU3VkZXN0ZSAJOgkxCToJOTI3Mjg0CitFc3Bpcml0dSBTYW50byBbRXNwaXJpdG8gU2FudG9dIAk6CTEJOgk0NjE4NAorTWluYXMgR2VyYWlzIAk6CTEJOgk1ODgzODMKK1JpbyBkZSBKYW5laXJvIAk6CTEJOgk0MzkwOQorU2FvIFBhdWxvIAk6CTEJOgkyNDg4MDgKK1JlZ2njbyBTdWwgCToJMQk6CTU3NzIxMworUGFyYW5hCToJMQk6CTE5OTcwOQorUmlvIEdyYW5kZSBkbyBTdWwgW1JpbyBHcmFhbmRlIGRvIHN1bF0gW1JpbyBHcm5kZSBEbyBTdWxdCToJMQk6CTI4MjA2MgorU2FudGEgQ2F0YXJpbmEgCToJMQk6CTk1NDQyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQlJBU0lMX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JSQVNJTF9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDc2ZWYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JSQVNJTF9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDM1IEBACitCcmFzaWwJOgkwCToJMTg4MDc4MjI3CitDYXBhbmVtYSA6IDEgOiA0NjMwMAorUG9ydG8gWGF2aWVyIDogMSA6IDExMzIxIAorUmVnaWFvIENlbnRyby1PZXN0ZSAgCToJMQk6CTEzMDIwNzY3CitEaXN0cml0byBGZWRlcmFsIAk6CTEJOgkyMzMzMTA4CitHb2lhcyAJOgkxCToJNTYxOTkxNworTWF0byBHcm9zc28gCToJMQk6CTI4MDMyNzQKK01hdG8gR3Jvc3NvIGRvIFN1bCAJOgkxCToJMjI2NDQ2OAorUmVnaWFvIE5vcmRlc3RlIAk6CTEJOgk1MTAxOTA5MQorQWxhZ29hcyAJOgkxCToJMzAxNTkxMgorQmFoaWEgCToJMQk6CTEzODE1MzM0CitDZWFyYQk6CTEJOgk4MDk3Mjc2CitNYXJhbmhhbwk6CTEJOgk2MTAzMzI3CitQYXJhaWJhIAk6CTEJOgkzNTk1ODg2CitQZXJuYW1idWNvIAk6CTEJOgk4NDEzNTkzCitQaWF1aSBbTWFyYW5oYW8vUGlhdWldCToJMQk6CTMwMDY4ODUKK1JpbyBHcmFuZGUgZG8gTm9ydGUgCToJMQk6CTMwMDMwODcKK1NlcmdpcGUgCToJMQk6CTE5Njc3OTEKK1JlZ2lhbyBOb3J0ZSAJOgkxCToJMTQ2OTg4NzgKK0FjcmUgCToJMQk6CTY2OTczNgorQW1hcGEJOgkxCToJNTk0NTg3CitBbWF6b25hcyAJOgkxCToJMzIzMjMzMAorUGFyYQk6CTEJOgk2OTcwNTg2CitSb25kb25pYQk6CTEJOgkxNTM0NTk0CitSb3JhaW1hIAk6CTEJOgkzOTEzMTcKK1RvY2FudGlucyAJOgkxCToJMTMwNTcyOAorUmVnaWFvIFN1ZGVzdGUgCToJMQk6CTc4NDcyMDE3CitFc3Bpcml0dSBTYW50byBbRXNwaXJpdG8gU2FudG9dIAk6CTEJOgkzNDA4MzY1CitNaW5hcyBHZXJhaXMgCToJMQk6CTE5MjM3NDUwCitSaW8gZGUgSmFuZWlybyAJOgkxCToJMTUzODM0MDcKK1NhbyBQYXVsbyAJOgkxCToJNDA0NDI3OTUKK1JlZ2njbyBTdWwgCToJMQk6CTI2OTczNTExCitQYXJhbmEJOgkxCToJMTAyNjE4NTYKK1JpbyBHcmFuZGUgZG8gU3VsIFtSaW8gR3JhYW5kZSBkbyBzdWxdIFtSaW8gR3JuZGUgRG8gU3VsXQk6CTEJOgkxMDg0NTA4NworU2FudGEgQ2F0YXJpbmEgCToJMQk6CTU4NjY1NjgKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CUkFaSUxfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQlJBWklMX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZjEyZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQlJBWklMX0FSRUEudHh0CkBAIC0wLDAgKzEsMzUgQEAKK0JyYXNpbAk6CTAJOgk4NTExOTY1CitDYXBhbmVtYSA6IDEgOiA0MDAwCitQb3J0byBYYXZpZXIgOiAxIDogMjY5MTUKK1JlZ2lhbyBDZW50cm8tT2VzdGUgIAk6CTEJOgkxNjEyMDc1CitEaXN0cml0byBGZWRlcmFsIAk6CTEJOgk1ODIyCitHb2lhcyAJOgkxCToJMzQxMjg5CitNYXRvIEdyb3NzbyAJOgkxCToJOTA2ODA2CitNYXRvIEdyb3NzbyBkbyBTdWwgCToJMQk6CTM1ODE1OAorUmVnaWFvIE5vcmRlc3RlIAk6CTEJOgkxNTU4MTk2CitBbGFnb2FzIAk6CTEJOgkyNzkzMworQmFoaWEgCToJMQk6CTU2NzI5NQorQ2VhcmEJOgkxCToJMTQ2MzQ4CitNYXJhbmhhbwk6CTEJOgkzMzMzNjUKK1BhcmFpYmEgCToJMQk6CTU2NTg0CitQZXJuYW1idWNvIAk6CTEJOgk5ODkzNworUGlhdWkgW01hcmFuaGFvL1BpYXVpXQk6CTEJOgkyNTIzNzgKK1JpbyBHcmFuZGUgZG8gTm9ydGUgCToJMQk6CTUzMzA2CitTZXJnaXBlIAk6CTEJOgkyMjA1MAorUmVnaWFvIE5vcnRlIAk6CTEJOgkzODY5NjM0CitBY3JlIAk6CTEJOgkxNTMxNDkKK0FtYXBhCToJMQk6CTE0MzQ1MworQW1hem9uYXMgCToJMQk6CTE1Nzc4MjAKK1BhcmEJOgkxCToJMTI1MzE2NAorUm9uZG9uaWEJOgkxCToJMjM4NTEyCitSb3JhaW1hIAk6CTEJOgkyMjUxMTYKK1RvY2FudGlucyAJOgkxCToJMjc4NDIwCitSZWdpYW8gU3VkZXN0ZSAJOgkxCToJOTI3Mjg0CitFc3Bpcml0dSBTYW50byBbRXNwaXJpdG8gU2FudG9dIAk6CTEJOgk0NjE4NAorTWluYXMgR2VyYWlzIAk6CTEJOgk1ODgzODMKK1JpbyBkZSBKYW5laXJvIAk6CTEJOgk0MzkwOQorU2FvIFBhdWxvIAk6CTEJOgkyNDg4MDgKK1JlZ2njbyBTdWwgCToJMQk6CTU3NzIxMworUGFyYW5hCToJMQk6CTE5OTcwOQorUmlvIEdyYW5kZSBkbyBTdWwgW1JpbyBHcmFhbmRlIGRvIHN1bF0gW1JpbyBHcm5kZSBEbyBTdWxdCToJMQk6CTI4MjA2MgorU2FudGEgQ2F0YXJpbmEgCToJMQk6CTk1NDQyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JSQVpJTF9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CUkFaSUxfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3NmVmMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CUkFaSUxfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwzNSBAQAorQnJhc2lsCToJMAk6CTE4ODA3ODIyNworQ2FwYW5lbWEgOiAxIDogNDYzMDAKK1BvcnRvIFhhdmllciA6IDEgOiAxMTMyMSAKK1JlZ2lhbyBDZW50cm8tT2VzdGUgIAk6CTEJOgkxMzAyMDc2NworRGlzdHJpdG8gRmVkZXJhbCAJOgkxCToJMjMzMzEwOAorR29pYXMgCToJMQk6CTU2MTk5MTcKK01hdG8gR3Jvc3NvIAk6CTEJOgkyODAzMjc0CitNYXRvIEdyb3NzbyBkbyBTdWwgCToJMQk6CTIyNjQ0NjgKK1JlZ2lhbyBOb3JkZXN0ZSAJOgkxCToJNTEwMTkwOTEKK0FsYWdvYXMgCToJMQk6CTMwMTU5MTIKK0JhaGlhIAk6CTEJOgkxMzgxNTMzNAorQ2VhcmEJOgkxCToJODA5NzI3NgorTWFyYW5oYW8JOgkxCToJNjEwMzMyNworUGFyYWliYSAJOgkxCToJMzU5NTg4NgorUGVybmFtYnVjbyAJOgkxCToJODQxMzU5MworUGlhdWkgW01hcmFuaGFvL1BpYXVpXQk6CTEJOgkzMDA2ODg1CitSaW8gR3JhbmRlIGRvIE5vcnRlIAk6CTEJOgkzMDAzMDg3CitTZXJnaXBlIAk6CTEJOgkxOTY3NzkxCitSZWdpYW8gTm9ydGUgCToJMQk6CTE0Njk4ODc4CitBY3JlIAk6CTEJOgk2Njk3MzYKK0FtYXBhCToJMQk6CTU5NDU4NworQW1hem9uYXMgCToJMQk6CTMyMzIzMzAKK1BhcmEJOgkxCToJNjk3MDU4NgorUm9uZG9uaWEJOgkxCToJMTUzNDU5NAorUm9yYWltYSAJOgkxCToJMzkxMzE3CitUb2NhbnRpbnMgCToJMQk6CTEzMDU3MjgKK1JlZ2lhbyBTdWRlc3RlIAk6CTEJOgk3ODQ3MjAxNworRXNwaXJpdHUgU2FudG8gW0VzcGlyaXRvIFNhbnRvXSAJOgkxCToJMzQwODM2NQorTWluYXMgR2VyYWlzIAk6CTEJOgkxOTIzNzQ1MAorUmlvIGRlIEphbmVpcm8gCToJMQk6CTE1MzgzNDA3CitTYW8gUGF1bG8gCToJMQk6CTQwNDQyNzk1CitSZWdp428gU3VsIAk6CTEJOgkyNjk3MzUxMQorUGFyYW5hCToJMQk6CTEwMjYxODU2CitSaW8gR3JhbmRlIGRvIFN1bCBbUmlvIEdyYWFuZGUgZG8gc3VsXSBbUmlvIEdybmRlIERvIFN1bF0JOgkxCToJMTA4NDUwODcKK1NhbnRhIENhdGFyaW5hIAk6CTEJOgk1ODY2NTY4CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQlJVTkVJX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JSVU5FSV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzdjYWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JSVU5FSV9BUkVBLnR4dApAQCAtMCwwICsxLDcgQEAKK0JydW5laQk6CTAJOgk1NzcwCitCZWxhaXQgZGlzdHJpY3QgIAk6CTEJOgkyNzI0CitCcnVuZWktTXVhcmEgZGlzdHJpY3QgCToJMQk6CTU3MAorVGVtYnVyb25nCToJMQk6CTEzMDYKK011YXJhL1NlcmlhL1R1dG9uZwk6CTEJOgkxMTY2CisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JSVU5FSV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CUlVORUlfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlNTMzYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CUlVORUlfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSw2IEBACitCcnVuZWkJOgkwCToJMzc5NDQ0CitCZWxhaXQgZGlzdHJpY3QgIAk6CTEJOgk1OTYwMAorQnJ1bmVpLU11YXJhIGRpc3RyaWN0IAk6CTEJOgkyNDcyMDAKK1RlbWJ1cm9uZwk6CTEJOgk5NDAwCitNdWFyYS9TZXJpYS9UdXRvbmcJOgkxCToJNDE2MDAKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JVTEdBUklBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JVTEdBUklBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YjAwMGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQlVMR0FSSUFfQVJFQS50eHQKQEAgLTAsMCArMSw5IEBACisgTWloYWpsb3ZncmFkIDogMSA6IDEwNjA3LjAKKyBSYXpncmFkIDogMSA6IDEwODQyLjAKKyBWYXJuYSA6IDEgOiAxMTkyOS4wCisgTG92ZWMgOiAxIDogMTUxNTAuMAorIEdyYWQgU29maWphIChtdW4uKSA6IDEgOiAxODk3OS4wCisgQnVyZ2FzIDogMSA6IDE0NjU3LjAKKyBTb2ZpamEgLSBjaXR5IDogMSA6IDEzMTEuMAorIFBsb3ZkaXYgOiAxIDogMTM2MjguMAorIEhhc2tvdm8gOiAxIDogMTM4OTIuMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JVTEdBUklBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JVTEdBUklBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYzAwMGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQlVMR0FSSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSw5IEBACisgTWloYWpsb3ZncmFkIDogMSA6IDY1NTgwNgorIFJhemdyYWQgOiAxIDogODQzNTg0CisgVmFybmEgOiAxIDogOTg5ODIxCisgTG92ZWMgOiAxIDogMTA0ODY3MQorIEdyYWQgU29maWphIChtdW4uKSA6IDEgOiAxMjIwOTE0CisgQnVyZ2FzIDogMSA6IDg3NTQyNgorIFNvZmlqYSAtIGNpdHkgOiAxIDogMTAxMDk1NQorIFBsb3ZkaXYgOiAxIDogMTI4NzYxNAorIEhhc2tvdm8gOiAxIDogMTA1NjM3NApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JVUktJTkFGQVNPX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JVUktJTkFGQVNPX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MWRkN2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQlVSS0lOQUZBU09fQVJFQS50eHQKQEAgLTAsMCArMSw1OSBAQAorQnVya2luYSA6CTAJOgkyNzQyMDAKK0JvdWNsZSBkdSBNb3Vob3VuICAJOgkxCToJMzQxNTMKK0JhbGUgCToJMQk6CTQ1OTUKK0JhbndhIAk6CTEJOgk1ODgyCitLb3NzaSAJOgkxCToJNzMyNAorTW91IEhvdW4gCToJMQk6CTY2NjgKK05heWFsYSAJOgkxCToJMzkxOQorU291cm91IAk6CTEJOgk1NzY1CitDYXNjYWRlcyAJOgkxCToJMTg0MDYKK0NvbW9lIAk6CTEJOgkxNTI3NworTGVyYWJhIAk6CTEJOgkzMTI5CitDZW50cmUgCToJMQk6CTI4MDUKK0thZGlvZ28gCToJMQk6CTI4MDUKK0NlbnRyZS1Fc3QgCToJMQk6CTExODExCitCb3VsZ291IAk6CTEJOgk2NjkyCitLb3VscGVsb2dvIAk6CTEJOgkyNDk3CitLb3VyaXRlbmdhIAk6CTEJOgkyNjIyCitDZW50cmUtTm9yZCAJOgkxCToJMTk4MjkKK0JhbSAJOgkxCToJNDA4NAorTmFtZW50ZW5nYSAJOgkxCToJNjQ2NAorU2FubWF0ZW5nYSAJOgkxCToJOTI4MQorQ2VudHJlLU91ZXN0IAk6CTEJOgkyMTcyMgorQm91bGtpZW1kZSAJOgkxCToJNDI2OQorU2FuZ3VpZSAJOgkxCToJNTE3OAorU2lzc2lsaSAJOgkxCToJNzEzNgorWmlybyAJOgkxCToJNTEzOQorQ2VudHJlLVN1ZCAJOgkxCToJMTEzMjEKK0JhemVnYSAJOgkxCToJMzk2MworTmFob3VyaSAJOgkxCToJMzc1NAorWm91bmR36W9nbyBbWm91bmR3ZW9nb10gCToJMQk6CTM2MDQKK0VzdCAJOgkxCToJNDYyNTYKK0duYWduYSAJOgkxCToJODQ2OAorR291cm1hIAk6CTEJOgkxMTExNworS29tYW5kamFyaSAJOgkxCToJNTA0OAorS29tcGllbmdhIAk6CTEJOgk3MDI5CitUYXBvYSAJOgkxCToJMTQ1OTQKK0hhdXRzLUJhc3NpbnMgCToJMQk6CTI1MzQ0CitIb3VldCAJOgkxCToJMTE1NjgKK0tlbmVkb3Vnb3UgCToJMQk6CTgxMzcKK1R1eSAJOgkxCToJNTYzOQorTm9yZCAJOgkxCToJMTYyMDcKK0xvcnVtIAk6CTEJOgkzNTkyCitQYXNzb3JlIAk6CTEJOgkzODY3CitZYXRlbmdhIAk6CTEJOgk2OTkwCitaYW5kb21hIAk6CTEJOgkxNzU4CitQbGF0ZWF1IENlbnRyYWwgCToJMQk6CTg1NDQKK0dhbnpvdXJnb3UgCToJMQk6CTQxNzgKK0tvdXJ3ZW9nbyAJOgkxCToJMTU4OAorT3Vicml0ZW5nYSAJOgkxCToJMjc3OAorU2FoZWwgCToJMQk6CTM1MzUwCitPdWRhbGFuIAk6CTEJOgk5Nzk3CitTZW5vIAk6CTEJOgk2ODYzCitTb3VtIAk6CTEJOgkxMjIyMgorWWFnaGEgCToJMQk6CTY0NjgKK1N1ZC1PdWVzdCAJOgkxCToJMTYyMDIKK0JvdWdvdXJpYmEgCToJMQk6CTI4MTIKK0lvYmEgCToJMQk6CTMyODkKK05vdW1iaWVsIAk6CTEJOgkyNzM2CitQb25pIAk6CTEJOgk3MzY1CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQlVSS0lOQUZBU09fUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQlVSS0lOQUZBU09fUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjOTAzOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CVVJLSU5BRkFTT19QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDU5IEBACitCdXJraW5hCToJMAk6CTEzOTAyOTc5CitCb3VjbGUgZHUgTW91aG91biAgCToJMQk6CTE0NjQxNjMKK0JhbGUgCToJMQk6CTE5ODE0MQorQmFud2EgCToJMQk6CTI3MTU5MQorS29zc2kgCToJMQk6CTI4OTAxMworTW91IEhvdW4gCToJMQk6CTI5NjU2MQorTmF5YWxhIAk6CTEJOgkxNzEwNTUKK1NvdXJvdSAJOgkxCToJMjM3ODAyCitDYXNjYWRlcyAJOgkxCToJNDIxNzE1CitDb21vZSAJOgkxCToJMzA0NDg5CitMZXJhYmEgCToJMQk6CTExNzIyNgorQ2VudHJlIAk6CTEJOgkxNDg4MTc2CitLYWRpb2dvIAk6CTEJOgkxNDg4MTc2CitDZW50cmUtRXN0IAk6CTEJOgkxMDgwMzQ0CitCb3VsZ291IAk6CTEJOgk1MjQ0MjkKK0tvdWxwZWxvZ28gCToJMQk6CTIzNjM5OAorS291cml0ZW5nYSAJOgkxCToJMzE5NTE3CitDZW50cmUtTm9yZCAJOgkxCToJMTE2MDk2MQorQmFtIAk6CTEJOgkyNzE3NjAKK05hbWVudGVuZ2EgCToJMQk6CTMwMzgzNQorU2FubWF0ZW5nYSAJOgkxCToJNTg1MzY2CitDZW50cmUtT3Vlc3QgCToJMQk6CTEyNDUwNTIKK0JvdWxraWVtZGUgCToJMQk6CTU4NjI2NQorU2FuZ3VpZSAJOgkxCToJMzE0ODQyCitTaXNzaWxpIAk6CTEJOgkxOTM1NTMKK1ppcm8gCToJMQk6CTE1MDM5MgorQ2VudHJlLVN1ZCAJOgkxCToJNjY4OTYwCitCYXplZ2EgCToJMQk6CTI2OTIzNQorTmFob3VyaSAJOgkxCToJMTUxMDQ3Citab3VuZHfpb2dvIFtab3VuZHdlb2dvXSAJOgkxCToJMjQ4Njc4CitFc3QgCToJMQk6CTEwNzMxNTkKK0duYWduYSAJOgkxCToJMzgzOTc0CitHb3VybWEgCToJMQk6CTI3NzY3MAorS29tYW5kamFyaSAJOgkxCToJNjM2ODQKK0tvbXBpZW5nYSAJOgkxCToJNTE0MjUKK1RhcG9hIAk6CTEJOgkyOTY0MDYKK0hhdXRzLUJhc3NpbnMgCToJMQk6CTEzMDE3NzYKK0hvdWV0IAk6CTEJOgk4NDM1MDUKK0tlbmVkb3Vnb3UgCToJMQk6CTI1NTUyNQorVHV5IAk6CTEJOgkyMDI3NDYKK05vcmQgCToJMQk6CTExOTY0NzAKK0xvcnVtIAk6CTEJOgkxNDA0NTAKK1Bhc3NvcmUgCToJMQk6CTMzNDE4NAorWWF0ZW5nYSAJOgkxCToJNTYwODA0CitaYW5kb21hIAk6CTEJOgkxNjEwMzIKK1BsYXRlYXUgQ2VudHJhbCAJOgkxCToJNzM4MjUyCitHYW56b3VyZ291IAk6CTEJOgkzNDA1OTQKK0tvdXJ3ZW9nbyAJOgkxCToJMTQ4ODQ4CitPdWJyaXRlbmdhIAk6CTEJOgkyNDg4MTAKK1NhaGVsIAk6CTEJOgk4ODU0MjEKK091ZGFsYW4gCToJMQk6CTE2NDkwMQorU2VubyAJOgkxCToJMjU0NTE1CitTb3VtIAk6CTEJOgkzMTkxNDQKK1lhZ2hhIAk6CTEJOgkxNDY4NjEKK1N1ZC1PdWVzdCAJOgkxCToJNjExODMyCitCb3Vnb3VyaWJhIAk6CTEJOgk5NjEyMgorSW9iYSAJOgkxCToJMjAzNzA3CitOb3VtYmllbCAJOgkxCToJNjQ4ODAKK1BvbmkgCToJMQk6CTI0NzEyMwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JVUktJTkFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQlVSS0lOQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDFkZDdmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JVUktJTkFfQVJFQS50eHQKQEAgLTAsMCArMSw1OSBAQAorQnVya2luYSA6CTAJOgkyNzQyMDAKK0JvdWNsZSBkdSBNb3Vob3VuICAJOgkxCToJMzQxNTMKK0JhbGUgCToJMQk6CTQ1OTUKK0JhbndhIAk6CTEJOgk1ODgyCitLb3NzaSAJOgkxCToJNzMyNAorTW91IEhvdW4gCToJMQk6CTY2NjgKK05heWFsYSAJOgkxCToJMzkxOQorU291cm91IAk6CTEJOgk1NzY1CitDYXNjYWRlcyAJOgkxCToJMTg0MDYKK0NvbW9lIAk6CTEJOgkxNTI3NworTGVyYWJhIAk6CTEJOgkzMTI5CitDZW50cmUgCToJMQk6CTI4MDUKK0thZGlvZ28gCToJMQk6CTI4MDUKK0NlbnRyZS1Fc3QgCToJMQk6CTExODExCitCb3VsZ291IAk6CTEJOgk2NjkyCitLb3VscGVsb2dvIAk6CTEJOgkyNDk3CitLb3VyaXRlbmdhIAk6CTEJOgkyNjIyCitDZW50cmUtTm9yZCAJOgkxCToJMTk4MjkKK0JhbSAJOgkxCToJNDA4NAorTmFtZW50ZW5nYSAJOgkxCToJNjQ2NAorU2FubWF0ZW5nYSAJOgkxCToJOTI4MQorQ2VudHJlLU91ZXN0IAk6CTEJOgkyMTcyMgorQm91bGtpZW1kZSAJOgkxCToJNDI2OQorU2FuZ3VpZSAJOgkxCToJNTE3OAorU2lzc2lsaSAJOgkxCToJNzEzNgorWmlybyAJOgkxCToJNTEzOQorQ2VudHJlLVN1ZCAJOgkxCToJMTEzMjEKK0JhemVnYSAJOgkxCToJMzk2MworTmFob3VyaSAJOgkxCToJMzc1NAorWm91bmR36W9nbyBbWm91bmR3ZW9nb10gCToJMQk6CTM2MDQKK0VzdCAJOgkxCToJNDYyNTYKK0duYWduYSAJOgkxCToJODQ2OAorR291cm1hIAk6CTEJOgkxMTExNworS29tYW5kamFyaSAJOgkxCToJNTA0OAorS29tcGllbmdhIAk6CTEJOgk3MDI5CitUYXBvYSAJOgkxCToJMTQ1OTQKK0hhdXRzLUJhc3NpbnMgCToJMQk6CTI1MzQ0CitIb3VldCAJOgkxCToJMTE1NjgKK0tlbmVkb3Vnb3UgCToJMQk6CTgxMzcKK1R1eSAJOgkxCToJNTYzOQorTm9yZCAJOgkxCToJMTYyMDcKK0xvcnVtIAk6CTEJOgkzNTkyCitQYXNzb3JlIAk6CTEJOgkzODY3CitZYXRlbmdhIAk6CTEJOgk2OTkwCitaYW5kb21hIAk6CTEJOgkxNzU4CitQbGF0ZWF1IENlbnRyYWwgCToJMQk6CTg1NDQKK0dhbnpvdXJnb3UgCToJMQk6CTQxNzgKK0tvdXJ3ZW9nbyAJOgkxCToJMTU4OAorT3Vicml0ZW5nYSAJOgkxCToJMjc3OAorU2FoZWwgCToJMQk6CTM1MzUwCitPdWRhbGFuIAk6CTEJOgk5Nzk3CitTZW5vIAk6CTEJOgk2ODYzCitTb3VtIAk6CTEJOgkxMjIyMgorWWFnaGEgCToJMQk6CTY0NjgKK1N1ZC1PdWVzdCAJOgkxCToJMTYyMDIKK0JvdWdvdXJpYmEgCToJMQk6CTI4MTIKK0lvYmEgCToJMQk6CTMyODkKK05vdW1iaWVsIAk6CTEJOgkyNzM2CitQb25pIAk6CTEJOgk3MzY1CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQlVSS0lOQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CVVJLSU5BX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZTg1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQlVSS0lOQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDU5IEBACitCdXJraW5hIDoJMAk6CTEzOTAyOTc5CitCb3VjbGUgZHUgTW91aG91biAgCToJMQk6CTE0NjQxNjMKK0JhbGUgCToJMQk6CTE5ODE0MQorQmFud2EgCToJMQk6CTI3MTU5MQorS29zc2kgCToJMQk6CTI4OTAxMworTW91IEhvdW4gCToJMQk6CTI5NjU2MQorTmF5YWxhIAk6CTEJOgkxNzEwNTUKK1NvdXJvdSAJOgkxCToJMjM3ODAyCitDYXNjYWRlcyAJOgkxCToJNDIxNzE1CitDb21vZSAJOgkxCToJMzA0NDg5CitMZXJhYmEgCToJMQk6CTExNzIyNgorQ2VudHJlIAk6CTEJOgkxNDg4MTc2CitLYWRpb2dvIAk6CTEJOgkxNDg4MTc2CitDZW50cmUtRXN0IAk6CTEJOgkxMDgwMzQ0CitCb3VsZ291IAk6CTEJOgk1MjQ0MjkKK0tvdWxwZWxvZ28gCToJMQk6CTIzNjM5OAorS291cml0ZW5nYSAJOgkxCToJMzE5NTE3CitDZW50cmUtTm9yZCAJOgkxCToJMTE2MDk2MQorQmFtIAk6CTEJOgkyNzE3NjAKK05hbWVudGVuZ2EgCToJMQk6CTMwMzgzNQorU2FubWF0ZW5nYSAJOgkxCToJNTg1MzY2CitDZW50cmUtT3Vlc3QgCToJMQk6CTEyNDUwNTIKK0JvdWxraWVtZGUgCToJMQk6CTU4NjI2NQorU2FuZ3VpZSAJOgkxCToJMzE0ODQyCitTaXNzaWxpIAk6CTEJOgkxOTM1NTMKK1ppcm8gCToJMQk6CTE1MDM5MgorQ2VudHJlLVN1ZCAJOgkxCToJNjY4OTYwCitCYXplZ2EgCToJMQk6CTI2OTIzNQorTmFob3VyaSAJOgkxCToJMTUxMDQ3Citab3VuZHfpb2dvIFtab3VuZHdlb2dvXQk6CTEJOgkyNDg2NzgKK0VzdCAJOgkxCToJMTA3MzE1OQorR25hZ25hIAk6CTEJOgkzODM5NzQKK0dvdXJtYSAJOgkxCToJMjc3NjcwCitLb21hbmRqYXJpIAk6CTEJOgk2MzY4NAorS29tcGllbmdhIAk6CTEJOgk1MTQyNQorVGFwb2EgCToJMQk6CTI5NjQwNgorSGF1dHMtQmFzc2lucyAJOgkxCToJMTMwMTc3NgorSG91ZXQgCToJMQk6CTg0MzUwNQorS2VuZWRvdWdvdSAJOgkxCToJMjU1NTI1CitUdXkgCToJMQk6CTIwMjc0NgorTm9yZCAJOgkxCToJMTE5NjQ3MAorTG9ydW0gCToJMQk6CTE0MDQ1MAorUGFzc29yZSAJOgkxCToJMzM0MTg0CitZYXRlbmdhIAk6CTEJOgk1NjA4MDQKK1phbmRvbWEgCToJMQk6CTE2MTAzMgorUGxhdGVhdSBDZW50cmFsIAk6CTEJOgk3MzgyNTIKK0dhbnpvdXJnb3UgCToJMQk6CTM0MDU5NAorS291cndlb2dvIAk6CTEJOgkxNDg4NDgKK091YnJpdGVuZ2EgCToJMQk6CTI0ODgxMAorU2FoZWwgCToJMQk6CTg4NTQyMQorT3VkYWxhbiAJOgkxCToJMTY0OTAxCitTZW5vIAk6CTEJOgkyNTQ1MTUKK1NvdW0gCToJMQk6CTMxOTE0NAorWWFnaGEgCToJMQk6CTE0Njg2MQorU3VkLU91ZXN0IAk6CTEJOgk2MTE4MzIKK0JvdWdvdXJpYmEgCToJMQk6CTk2MTIyCitJb2JhIAk6CTEJOgkyMDM3MDcKK05vdW1iaWVsIAk6CTEJOgk2NDg4MAorUG9uaSAJOgkxCToJMjQ3MTIzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQlVSVU5ESV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9CVVJVTkRJX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNDhjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQlVSVU5ESV9BUkVBLnR4dApAQCAtMCwwICsxLDEzMCBAQAorQlVSVU5ESTowOjI3ODMwCitDSUJJVE9LRToxOjY2MS45MDMKK05HT1pJOjE6NTM5LjU0NQorQlVCQU5aQToxOjM3Ni4wNzQKK0tBWUFOWkE6MTo0NDguMzY1CitCVUpVTUJVUkE6MTo3MjUuNDcxCitHSVRFR0E6MTo3MDAuNzg3CitCVVJVUkk6MToxMjYzLjAxMQorS0FSVVpJOjE6NTE3LjU1MgorTVVZSU5HQToxOjY3Ni41NDEKK01BS0FNQkE6MToxMTE0LjM2MAorTVVSQU1WSVlBOjE6NTg4LjIzOAorUlVUQU5BOjE6NDc1LjAxMgorUlVZSUdJOjE6ODYyLjc1NAorS0lSVU5ETzoxOjc3Ni4xNzkKK0NBTktVWk86MTo3OTYuOTI4CitSVVlJR0k6MjoxMDYuODQ0NjMzCitCVUdBQklSQToyOjk1LjkxMzQ5MAorTVVSV0k6Mjo5Ni44OTAxMDAKK0dJU0hVQkk6MjoxMDAuMjc3ODk2CitHSVNBR0FSQToyOjc3LjIwOTI1NQorTVVCSU1CSToyOjMxLjU3NzI2NAorTVdBS0lSTzoyOjc3LjAyODc3OAorQlVLRU1CQToyOjc0LjA2OTM3NQorR0FIT01CTzoyOjM3LjU0NzI2NworQlVSQU1CSToyOjgzLjUzMjI1NQorUlVTQUtBOjI6NTUuMjEwNTgxCitHSVRBTkdBOjI6MzkuMjkyNDMwCitNVVRJTUJVWkk6Mjo4Ni41MDQ5MTMKK0dBU09SV0U6Mjo4MC4wMDAxOTAKK0dJSEFSTzoyOjE0OC45MDQ1NTcKK01VR0FNQkE6MjoxMTcuNzI2OTI1CitOWUFCSUdJTkE6Mjo1My43MDAxNDgKK0dJVEVSQU5ZSToyOjEyNS4yODI4NTIKK01BQkFZOjI6MTQ2LjkyODE2MAorS0lSRU1CQToyOjgxLjgwODkwMworQlVHRU5EQU5BOjI6OTguNTM0OTE4CitLSUdBTUJBOjI6MjM2LjEyMDQxOAorQklTT1JPOjI6MjkuMTI2NjQzCitSVVRFR0FNQToyOjQ2LjA0ODAzOQorS0FCRVpJOjI6MTM2LjYxNjY1NgorTlRFR0E6MjoxMTkuNTAyOTU2CitHQVNIT0hPOjI6NjkuNDU2MTAwCitUQU5HQVJBOjI6ODAuMTk2NTI1CitNVVJBTVZJWUE6Mjo4Mi42MzE3NzIKK0tBWU9LV0U6Mjo0MS40NTc1MjUKK0dBU0hJS0FOV0E6Mjo1NS42MDA0NTYKK0dJU09aSToyOjU3LjQ2MTE4NAorUllBTlNPUk86Mjo2Ni4xNDYzNDEKK0dBVEFSQToyOjYwLjEzODk5MworUlVHQVpJOjI6NTIuODI3MjQ5CitLSUdBTkRBOjI6MzYuMjk2ODcxCitTT05HQToyOjEwNi4zMjAyODUKK01BVEFOQToyOjc4LjY1MTk2NworTVVTSElIQToyOjE1NS4zMTE0NjIKK01VR09OR09NQU5HQToyOjYzLjI2MDE1NQorQlVISU5WVVpBOjI6OTcuMzE0MDQ0CitNVVNPTkdBVEk6Mjo2NC44NzI2MDgKK0tBTllPU0hBOjI6NTUuMjQ2NjI2CitJVEFCQToyOjY5LjkzNTQ4NworTVVIQU5HQToyOjUxLjQ2MjEyMworU0hPTUJPOjI6NTIuMjQzMjQyCitNVVlJTkdBOjI6MTE1LjU2MDY5MQorQlVLSU5BTlZBTkE6MjoxMjIuNzI1MDkzCitOWUFCSUtFUkU6Mjo4My43MjMzMjYKK01BUkFOR0FSQToyOjY4Ljc5NDcxNQorVllBTkRBOjI6NzQuMzY2ODI1CitNUElOR0EtS0FZT1ZFOjI6NzYuMDQ4NDUwCitCVUtFWUU6Mjo4OC4wMjIwNzYKK0JVR0VOWVVaSToyOjg0LjM0OTIxNQorQlVZRU5HRVJPOjI6NzYuNzI3NzUzCitCVVRFWkk6Mjo5NS40MzA3MzAKK05ZQU5aQSBMQUM6Mjo0NjcuOTExNDM3CitSVVRBTkE6Mjo3MS44MjQ1ODAKK1JVTU9OR0U6Mjo0NDMuNzg3Nzg5CitJU0FMRS1NVUdBUlVSTzoyOjI3LjUyNzc4NgorQlVTT05JOjI6MjEwLjQxNjY1MgorQlVISUdBOjI6OTIuMzgwNDExCitNVUhVVEE6MjoxNzEuMDkyNzY0CitSVUdPTUJPOjI6ODMuMTMxMzcyCitNVUtJS0U6MjoyOC45MzM3NjkKK0JXRVJVOjI6MTUyLjA4NTE3MgorS0lSVU5ETzoyOjEwMi4yNTUxMjIKK1JVVE9WVToyOjEyMC43NTUzMDEKK01VVFVNQkE6Mjo3MS4wNDU2MTYKK01VU0lHQVRJOjI6OTUuOTEzOTYxCitNVVJVVEE6Mjo0Ni4yMTYzODYKK0dJVEFSQU1VS0E6Mjo2Ny43OTg1NzEKK0dJVEVHQToyOjEwNi42NDc2NDkKK0dJVE9CRToyOjc1Ljk5OTgzNgorUkFOR086Mjo1Mi4xNjE2MzEKK01VVEFNQlU6Mjo0OS4yMzU1MTQKK0tBWUFOWkE6MjozOC44OTE4NzUKK0JVUlVSSToyOjE2MS4xNDE5MDAKK01CVVlFOjI6MzkuNzQwNzE1CitOWUFCSUdJTkEgKEJVSik6Mjo3NS40NzU1NTMKK05EQVZBOjI6NTguNTQyNDQ3CitOWUFCSVRTSU5EQToyOjg4Ljk4MTMwNgorTVVUQUhPOjI6NTYuNjg2OTc5CitCVVRBR0FOWldBTDoyOjQ2LjAzNzE0MworQldBTUJBUkFOR1dFOjI6ODIuMzMwNjc5CitLQUJBUk9SRToyOjU5LjkxMDI4NgorR0lTVVJVOjI6MTg2LjY4MTQwMworQ0VOREFKVVJVOjI6MTE0LjY2Mzk3NworQlVCQU5aQToyOjgzLjA4NzY2NworTlZBTVVSRU5aQToyOjM3LjM4OTg1MAorTkdPWkk6Mjo1OC41NTY1NDUKK01VR0lOQToyOjExNy4wNTYzMTUKK01XVU1CQToyOjQ3LjM5MTcwNworTUFUT05HTzoyOjU1Ljk5OTI5NworR0lIRVRBOjI6NTcuMTM5ODc3CitLSU5ZSU5ZQToyOjg4LjI2NzkxMAorS0FZT0dPUk86MjoxMTYuNTI2MjU1CitCVVNJR0E6Mjo1Mi4wNDU2NDMKK0dJSE9HQVpJOjI6NjYuMDExNjE4CitCVUdBTkRBOjI6OTUuMTcxOTYwCitDQU5LVVpPOjI6MjEzLjYyMjg4OQorUlVIT1JPUk86Mjo1Ny43NjA2NTUKK0JVS0lSQVNBWkk6MjozNC44MDQ4OTgKK0JVVElISU5EQToyOjExMS44OTgzNDUKK1ZVR0laTzoyOjk3LjUzNTQ0NgorTVBBTkRBOjI6NDAuNDQ5NDYwCitCVVRBR0FOWldBMjoyOjE0NC40NjI4NDcKK0tJQkFHTzoyOjExNi4xMTUxOTIKK01BS0FNQkE6MjoxNTIuMDMzNDAzCitNQUtFQlVLTzoyOjUyLjc3MzM1MworTUFCQU5EQToyOjE2NC4yMzgyNjgKK0JVUkFaQToyOjU3LjgzOTYwMgorVlVNQkktQlVLVUJBOjI6ODkuNzYwMjY1CitHSUhBTkdBOjI6MTAzLjc5NTY2MwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JVUlVORElfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQlVSVU5ESV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzdkNWQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0JVUlVORElfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxMzAgQEAKK0JVUlVOREk6MDo2MzcwNjA5OjIyOC45MTE1NzAKK0JVQkFOWkE6MToyNTM0NDY6NjczLjkyNTg3NgorQlVKVU1CVVJBOjE6NjY5MDMxOjkyMi4yMDIyNjYKK0JVUlVSSToxOjQ0MDkxOTozNDkuMTAxNDczCitDQU5LVVpPOjE6MTU5NTY4OjIwMC4yMjg4NzkKK0NJQklUT0tFOjE6MzE3MTU5OjQ3OS4xNjIzNTUKK0dJVEVHQToxOjYzMzA1Njo5MDMuMzUwMDkxCitLQVJVWkk6MTozMzg1MTA6NjU0LjA1OTg4MgorS0FZQU5aQToxOjQ5Nzg4ODoxMTEwLjQ1MjQyMgorS0lSVU5ETzoxOjQ1Mzk5Njo1ODQuOTExNDcwCitNQUtBTUJBOjE6MjcwMTU3OjI0Mi40MzI0MjgKK01VUkFNVklZQToxOjQ5NDM4Mjo4NDAuNDQ1NTM0CitNVVlJTkdBOjE6NDMyNjI0OjYzOS40NjQ1NzEKK05HT1pJOjE6NTQyOTMwOjEwMDYuMjczODA1CitSVVRBTkE6MToyMjIyMDY6NDY3Ljc5MDI4NworUlVZSUdJOjE6Mjg1MTY3OjMzMC41MzEwNjcKK0dJVEVSQU5ZSToyOjYxODAzOjQ5My4zMTExNTYKK0JVR0FCSVJBOjI6NjQ4NTY6Njc2LjE5ODYzOQorQlVTT05JOjI6NjQ4NTY6MzA4LjIyOTI3MgorQldBTUJBUkFOR1dFOjI6NjQ4NTY6Nzg3Ljc1NzAzMworS0lSVU5ETzoyOjY0ODU2OjYzNC4yNjIzMjUKK05URUdBOjI6NjQ4NTY6NTQyLjcxOTM5MAorR0lUT0JFOjI6NjQ4NTY6ODUzLjM3Nzc4MQorQlVUSUhJTkRBOjI6NjE4MDM6NTUyLjMxNzYyOQorTVVHSU5BOjI6NTI4NTk6NDUxLjU3NjA5MworVlVNQkktQlVLVUJBOjI6NjQ4NTY6NzIyLjU1MzI1MworTUFCQVk6Mjo1Mjg1OTozNTkuNzY2NTI0CitNQVJBTkdBUkE6Mjo2MDMyNTo4NzYuODkyMjk2CitNVVlJTkdBOjI6NjE4MDM6NTM0LjgxMzU5NQorR0FTSE9ITzoyOjYxODAzOjg4OS44MjAwMjQKK1JVR09NQk86Mjo1Mjg1OTo2MzUuODU5MDI3CitOVkFNVVJFTlpBOjI6NjAzMjU6MTYxMy40MjA2MzYKK0tJUkVNQkE6Mjo2MDMyNTo3MzcuMzk1OTcyCitNV1VNQkE6Mjo2MDMyNToxMjcyLjkxMzc1MgorQlVLSU5BTlZBTkE6Mjo1Mjg1OTo0MzAuNzE3NDAzCitHQVNPUldFOjI6NjE4MDM6NzcyLjU0MTAyMgorTVVSV0k6Mjo1Mjg1OTo1NDUuNTY0ODU1CitCVVNJR0E6Mjo2MDMyNToxMTU5LjA4OTQ0NworS0FCQVJPUkU6Mjo1NTMyMDo5MjMuMzk1NTA3CitHQVNISUtBTldBOjI6NjAzMjU6MTA4NC45ODMxMDgKK1RBTkdBUkE6Mjo2MDMyNTo3NTIuMjIxNTY1CitCVUhJTlZVWkE6Mjo2MTgwMzo2MzUuMDkyNTkzCitLQVlBTlpBOjI6NTUzMjA6MTQyMi40Mjc5MjEKK0JVR0FOREE6Mjo1Mjg1OTo1NTUuNDEzOTQxCitOR09aSToyOjYwMzI1OjEwMzAuMjEwMjk2CitNVVJVVEE6Mjo1NTMyMDoxMTk2Ljk5NzI5MgorR0FUQVJBOjI6NTUzMjA6OTE5Ljg4Mzg1OAorR0FIT01CTzoyOjU1MzIwOjE0NzMuMzY2NTk0CitLSUdBTUJBOjI6MzE5MTM6MTM1LjE1ODE1NQorR0lUQVJBTVVLQToyOjQ4MzU4OjcxMy4yNjgyOTkKK01VU0lHQVRJOjI6NTA2ODk6NTI4LjQ4NjE1MAorUlVIT1JPUk86Mjo2MDMyNToxMDQ0LjQwNTY2OQorQlVCQU5aQToyOjUwNjg5OjYxMC4wNjg4ODEKK01VU0hJSEE6MjozMTkxMzoyMDUuNDgxMjkzCitCVUdFTllVWkk6Mjo0ODM1ODo1NzMuMzEzODI5CitNVUhBTkdBOjI6NTUzMjA6MTA3NC45ODI2NDEKK0JVSElHQToyOjQ4MzU4OjUyMy40NzIxNDAKK01BVE9OR086Mjo1NTMyMDo5ODcuODg1NDE3CitNV0FLSVJPOjI6NjE4MDM6ODAyLjM0MjA2MgorR0lIT0dBWkk6Mjo0ODM1ODo3MzIuNTc2NjcyCitCVVRBR0FOWldBTDoyOjU1MzIwOjEyMDEuNjU3NzMzCitNVVRBSE86Mjo2MzMwNToxMTE2Ljc1NzM0MgorQ0FOS1VaTzoyOjMxOTEzOjE0OS4zOTIyMzEKK0dJSEFOR0E6Mjo1MDY4OTo0ODguMzU1NjY1CitCVUtFWUU6Mjo0NDk0Mzo1MTAuNTk3MTE2CitSQU5HTzoyOjU1MzIwOjEwNjAuNTY2NzAxCitNVVRVTUJBOjI6NDgzNTg6NjgwLjY2OTMyNAorTVBBTkRBOjI6NTA2ODk6MTI1My4xNDg5OTEKK1JVR0FaSToyOjUwNjg5Ojk1OS41Mjc1MzUKK0dJU0FHQVJBOjI6MzE5MTM6NDEzLjMzOTA0OQorQlVHRU5EQU5BOjI6NjMzMDU6NjQyLjQ2ODY5MworTllBQklLRVJFOjI6NDgzNTg6NTc3LjU5OTc0MQorU0hPTUJPOjI6NDgzNTg6OTI1LjY0MjYyMQorTUJVWUU6Mjo0NDk0MzoxMTMwLjkyNjI2MAorQldFUlU6Mjo0MDczODoyNjcuODY0MDAyCitDRU5EQUpVUlU6MjozMTkxMzoyNzguMzIyODA4CitSVVRFR0FNQToyOjQ0OTQzOjk3Ni4wMjAyNDIKK01VUkFNVklZQToyOjQ0OTQzOjU0My45MDQ4MDkKK0dJSEVUQToyOjYzMzA1OjExMDcuOTA1NzgwCitNVVRJTUJVWkk6Mjo2NjkwMzo3NzMuNDAyMzE1CitNVUJJTUJJOjI6NjY5MDM6MjExOC43MTExMDgKK0JVVEVaSToyOjQwNzM4OjQyNi44ODcwNTEKK0tJR0FOREE6Mjo0NDk0MzoxMjM4LjIyODQ0NgorTkRBVkE6Mjo0NDk0Mzo3NjcuNzEzMzUxCitOWUFCSUdJTkEgKEJVSik6Mjo2NjkwMzo4ODYuNDIwNzk5CitHSVNVUlU6Mjo0MDczODoyMTguMjIyODIzCitJU0FMRS1NVUdBUlVSTzoyOjY2OTAzOjI0MzAuMzg0MzQwCitSVVlJR0k6Mjo0MDczODozODEuMjgzOTQyCitOWUFCSUdJTkE6Mjo0NDk0Mzo4MzYuOTQwMzA0CitHSVRFR0E6Mjo2MzMwNTo1OTMuNTk1ODMzCitNVUdPTkdPTUFOR0E6Mjo2NjkwMzoxMDU3LjU4NjcyMworS0FOWU9TSEE6Mjo2NjkwMzoxMjEwLjk4OTc5MAorUlVTQUtBOjI6NDQ5NDM6ODE0LjA0MzU2NQorQlVUQUdBTlpXQTI6Mjo0MDczODoyODEuOTk3MzcwCitLQUJFWkk6Mjo2NjkwMzo0ODkuNzE0MDgwCitLQVlPS1dFOjI6NDQ5NDM6MTA4NC4wOTMxMzMKK05ZQUJJVFNJTkRBOjI6NDA3Mzg6NDU3LjgyODEwNworSVRBQkE6Mjo2MzMwNTo5MDUuMTk5OTU5CitNVVRBTUJVOjI6NjY5MDM6MTM1OC44MzgyNTYKK0tJTllJTllBOjI6NDA3Mzg6NDYxLjUyODM1MAorTUFLRUJVS086Mjo2MzMwNToxMTk5LjU3NTA5NgorTVVLSUtFOjI6NjY5MDM6MjMxMi4yODQzMDcKK0dJU0hVQkk6Mjo2MzMwNTo2MzEuMzAxNjM4CitHSVNPWkk6Mjo0NDk0Mzo3ODIuMTU5NjI2CitNVUdBTUJBOjI6NDg5OTE6NDE2LjE0MDk5NworQklTT1JPOjI6NDQ5NDM6MTU0My4wNDgzNDIKK01VSFVUQToyOjY2OTAzOjM5MS4wMzQwNzEKK1JZQU5TT1JPOjI6NjMzMDU6OTU3LjA1MzY5NAorQlVLSVJBU0FaSToyOjYzMzA1OjE4MTguODcwNDM2CitNVVNPTkdBVEk6MjozNzAzNDo1NzAuODc3ODI1CitHSUhBUk86MjozNzAzNDoyNDguNzExODg3CitNUElOR0EtS0FZT1ZFOjI6MzcwMzQ6NDg2Ljk4MzQwOAorTUFUQU5BOjI6NDg5OTE6NjIyLjg4MzM0MQorQlVSQVpBOjI6NjMzMDU6MTA5NC41MDI2OTAKK0JVUkFNQkk6Mjo0ODk5MTo1ODYuNDkyMDA4CitSVU1PTkdFOjI6NDg5OTE6MTEwLjM5Mjg1MworUlVUT1ZVOjI6NDg5OTE6NDA1LjcwNDc1NworQlVZRU5HRVJPOjI6NDg5OTE6NjM4LjUwNDI5NworU09OR0E6Mjo0ODk5MTo0NjAuNzg2OTUxCitSVVRBTkE6MjozNzAzNDo1MTUuNjIxOTk2CitCVVJVUkk6Mjo0ODk5MTozMDQuMDIzOTY5CitCVUtFTUJBOjI6MzcwMzQ6NDk5Ljk5NTIxOAorR0lUQU5HQToyOjM3MDM0Ojk0Mi41MzEwMDAKK01BS0FNQkE6Mjo0NTAyNjoyOTYuMTU5Njk4CitWWUFOREE6Mjo0ODk5MTo2NTguNzc0OTMxCitLQVlPR09STzoyOjQ1MDI2OjM4Ni40MDM2MTkKK1ZVR0laTzoyOjQ1MDI2OjQ2MS42MzkwMDkKK05ZQU5aQSBMQUM6Mjo0NTAyNjo5Ni4yMjc5NjgKK01BQkFOREE6Mjo0NTAyNjoyNzQuMTUxNDk1CitLSUJBR086Mjo0NTAyNjozODcuNzcxNTM5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ0FNQk9ESUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ0FNQk9ESUFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5NjAzNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DQU1CT0RJQV9BUkVBLnR4dApAQCAtMCwwICsxLDIxMSBAQAorQ2FtYm9kaWEJOgkwCToJMTgxMDQwCitCYW50ZWF5IE1lYW5jaGV5CToJMQk6CTY2NzkKK01vbmdrb2wgQm9yZWkgCToJCToJMAorUGhudW0gU3JvayAJOgkJOgkwCitQcmVhaCBOZXRyIFByZWFoIAk6CQk6CTAKK091IENocm92IAk6CQk6CTAKK1NlcmVpIFNhb3Bob2FuIAk6CQk6CTAKK1RobWEgUHVvayAJOgkJOgkwCitTdmF5IENoZWsgCToJCToJMAorTWFsYWkgCToJCToJMAorQmF0dGFtYmFuZyAJOgkxCToJMTE3MDIKK0JhbmFuIAk6CQk6CTAKK1RobWEgS291bCAJOgkJOgkwCitCYXQgRGFtYmFuZyAJOgkJOgkwCitCYXZlbCAJOgkJOgkwCitBZWsgUGhudW0gCToJCToJMAorTW91bmcgUnVlc3NlaSAJOgkJOgkwCitSb3RhbmFrIE1vbmRvbCAJOgkJOgkwCitTYW5na2FlIAk6CQk6CTAKK1NhbWxvdXQgCToJCToJMAorU2FtcG92IEx1biAJOgkJOgkwCitQaG51bSBQcm9layAJOgkJOgkwCitLYW1yaWVuZyAJOgkJOgkwCitLb2FzIEtyYWxhIAk6CQk6CTAKK0thbXBvbmcgQ2hhbSAJOgkxCToJOTc5OQorQmF0aGVheSAJOgkJOgkwCitDaGFta2FyIExldSAJOgkJOgkwCitDaGV1bmcgUHJleSAJOgkJOgkwCitEYW1iYWUgCToJCToJMAorS2FtcG9uZyBDaGFtIAk6CQk6CTAKK0thbXBvbmcgU2llbSAJOgkJOgkwCitLYW5nIE1lYXMgCToJCToJMAorS2FvaCBTb3V0aW4gCToJCToJMAorS3JvdWNoIENoaG1hciAJOgkJOgkwCitNZW1vdCAJOgkJOgkwCitPdSBSZWFuZyBPdiAJOgkJOgkwCitQb25oYWUgS3JhZWsgCToJCToJMAorUHJleSBDaGhvciAJOgkJOgkwCitTcmVpIFNhbnRob3IgCToJCToJMAorU3R1ZW5nIFRyYW5nIAk6CQk6CTAKK1Rib3VuZyBLaG11bSAJOgkJOgkwCitLYW1wb25nIENoaG5hbmcgCToJMQk6CTU1MjEKK0Jhcmlib3VyIAk6CQk6CTAKK0Nob2wgS2lyaSAJOgkJOgkwCitLYW1wb25nIENobm5hbmcgCToJCToJMAorS2FtcG9uZyBMZWFlbmcgCToJCToJMAorS2FtcG9uZyBUcmFsYWNoIAk6CQk6CTAKK1JvbGVhIEInaWVyIAk6CQk6CTAKK1NhbWVha2tpIE1lYW4gQ2hleSAJOgkJOgkwCitUdWVrIFBob3MgCToJCToJMAorS2FtcG9uZyBTcGV1IAk6CTEJOgk3MDE3CitCYXNlZHRoIAk6CQk6CTAKK0NoYmFyIE1vbiAJOgkJOgkwCitLb25nIFBpc2VpIAk6CQk6CTAKK0FvcmFsIAk6CQk6CTAKK09kb25nayAJOgkJOgkwCitQaG51bSBTcnVvY2ggCToJCToJMAorU2FtcmFvbmcgVG9uZyAJOgkJOgkwCitUaHBvbmcgCToJCToJMAorS2FtcG9uZyBUaG9tIAk6CTEJOgkxMzgxNAorQmFyYXkgCToJCToJMAorS2FtcG9uZyBTdmF5IAk6CQk6CTAKK1N0dWVuZyBTYWVuIAk6CQk6CTAKK1ByYXNhdCBCYWxhbmdrIAk6CQk6CTAKK1ByYXNhdCBTYW1ib3VyIAk6CQk6CTAKK1NhbmRhbiAJOgkJOgkwCitTYW50dWsgCToJCToJMAorU3RvdW5nIAk6CQk6CTAKK0thbXBvdCAJOgkxCToJNDg3MworQW5na29yIENoZXkgCToJCToJMAorQmFudGVheSBNZWFzIAk6CQk6CTAKK0NoaHVrIAk6CQk6CTAKK0NodW0gS2lyaSAJOgkJOgkwCitEYW5nIFRvbmcgCToJCToJMAorS2FtcG9uZyBUcmFjaCAJOgkJOgkwCitLYW1wb3QgCToJCToJMAorVG9ubGUgU2FwICAJOgkxCToJNDg3MworS2FtcG9uZyBCYXkgCToJCToJMAorS2hldCBLYW5kYWwgCToJCToJMzU2OAorS2FuZGFsIFN0dWVuZyAJOgkJOgkwCitLaWVuIFN2YXkgCToJCToJMAorS2hzYWNoIEthbmRhbCAJOgkJOgkwCitLYW9oIFRodW0gCToJCToJMAorTGV1ayBEYWVrIAk6CQk6CTAKK0x2ZWEgQWVtIAk6CQk6CTAKK011a2ggS2FtcHVsIAk6CQk6CTAKK0FuZ2sgU251b2wgCToJCToJMAorUG9uaGVhIEx1ZXUgCToJCToJMAorUydhbmcgCToJCToJMAorVGEgS2htYXUgW0thbmRhbF0JOgkxCToJMzU2OAorS29oIEtvbmcgCToJMQk6CTExMTYwCitCb3R1bSBTYWtvciAJOgkJOgkwCitLaXJpIFNha29yIAk6CQk6CTAKK0thb2ggS29uZyAJOgkJOgkwCitTbWFjaCBNZWFuIENoZXkgCToJCToJMAorTW9uZG9sIFNlaW1hIAk6CQk6CTAKK1NyYWUgQW1iZWwgCToJCToJMAorVGhtYSBCYW5nIAk6CQk6CTAKK0thbXBvbmcgU2VpbGEgCToJCToJMAorS3JhdGllIAk6CTEJOgkxMTA5NAorQ2hobG91bmcgCToJCToJMAorS3JhY2hlaCAJOgkJOgkwCitQcmVhZWsgUHJhc2FiIAk6CQk6CTAKK1NhbWJvdXIgCToJCToJMAorU251b2wgCToJCToJMAorU2VubW9ub3Vyb20gW01vbmR1bCBLaXJpXQk6CTEJOgkxNDI4OAorS2FldiBTZWltYSAJOgkJOgkwCitLYW9oIE5oZWFlayAJOgkJOgkwCitPdSBSZWFuZyAJOgkJOgkwCitQZWNociBDaGVuZGEgCToJCToJMAorU2FlbiBNb25vdXJvbSAJOgkJOgkwCitQaG5vbSBQZW5oIAk6CTEJOgkyOTAKK0NoYW1rYXIgTW9uIAk6CQk6CTAKK0RvdW4gUGVuaCAJOgkJOgkwCitQcmFtcGlyIE1lYWtrYXJhIAk6CQk6CTAKK1R1b2wgS291ayAJOgkJOgkwCitEYW5na2FvIAk6CQk6CTAKK01lYW4gQ2hleSAJOgkJOgkwCitSdWVzc2VpIEthZXYgCToJCToJMAorUGhudW0gVGJlbmcgTWVhbmNoZXkgW1ByZWFoIFZpaGVhcl0JOgkxCToJMTM3ODgKK0NoZXkgU2FlbiAJOgkJOgkwCitDaGhhZWIgCToJCToJMAorQ2hvYW0gS2hzYW50IAk6CQk6CTAKK0t1bGVhZW4gCToJCToJMAorUm92aWVuZyAJOgkJOgkwCitTYW5na29tIFRobWVpIAk6CQk6CTAKK1RiYWVuZyBNZWFuIENoZXkgCToJCToJMAorUHJleSBWZW5nIAk6CTEJOgk0ODgzCitCYSBQaG51bSAJOgkJOgkwCitLYW1jaGF5IE1lYXIgCToJCToJMAorS2FtcG9uZyBUcmFiYWVrIAk6CQk6CTAKK0thbmhjaHJpZWNoIAk6CQk6CTAKK01lIFNhbmcgCToJCToJMAorUGVhbSBDaG9yIAk6CQk6CTAKK1BlYW0gUm8gCToJCToJMAorUGVhIFJlYW5nIAk6CQk6CTAKK1ByZWFoIFNkYWNoIAk6CQk6CTAKK1ByZXkgVmVhZW5nIAk6CQk6CTAKK0thbXBvbmcgTGVhdiAJOgkJOgkwCitTaXRob3IgS2FuZGFsIAk6CQk6CTAKK1B1cnNhdCAJOgkxCToJMTI2OTIKK0Jha2FuIAk6CQk6CTAKK0thbmRpZW5nIAk6CQk6CTAKK0tyYWtvciAJOgkJOgkwCitQaG51bSBLcmF2YW5oIAk6CQk6CTAKK1NhbXBvdiBNZWFzIAk6CQk6CTAKK1ZlYWwgVmVhZW5nIAk6CQk6CTAKK0x1bXBoYXQgW1JhdGFuYSBLaXJpXQk6CTEJOgkxMDc4MgorQW5kb3VuZyBNZWFzIAk6CQk6CTAKK0JhbiBMdW5nIAk6CQk6CTAKK0JhciBLYWV2IAk6CQk6CTAKK0tvdW4gTW9tIAk6CQk6CTAKK0x1bXBoYXQgCToJCToJMAorT3UgQ2h1bSAJOgkJOgkwCitPdSBZYSBEYXYgCToJCToJMAorVGEgVmVhZW5nIAk6CQk6CTAKK1ZldW4gU2FpIAk6CQk6CTAKK1NpZW0gcmVhcCAJOgkxCToJMTAyOTkKK0FuZ2tvciBDaHVtIAk6CQk6CTAKK0FuZ2tvciBUaHVtIAk6CQk6CTAKK0JhbnRlYXkgc3JlaSAJOgkJOgkwCitDaGkgS3JhZW5nIAk6CQk6CTAKK0tyYWxhbmggCToJCToJMAorUHVvayAJOgkJOgkwCitQcmFzYXQgQmFrb25nIAk6CQk6CTAKK1NpZW0gUmVhYiAJOgkJOgkwCitTb3V0ciBOaWtvbSAJOgkJOgkwCitTcmVpIFNuYW0gCToJCToJMAorU3ZheSBMZXUgCToJCToJMAorVmFyaW4gCToJCToJMAorU2loYW5vdWt2aWxsZSAJOgkxCToJODY4CitNaXR0YWtwaGVhcCAJOgkJOgkwCitQcmV5IE5vYiAJOgkJOgkwCitTdHVlbmcgaGF2IAk6CQk6CTAKK1N0dW5nIFRyZW5nIAk6CTEJOgkxMTA5MgorU2VzYW4gCToJCToJMAorU2llbSBCb3VrIAk6CQk6CTAKK1NpZW0gUGFuZyAJOgkJOgkwCitTdHVlbmcgVHJhZW5nIAk6CQk6CTAKK1RoYWxhIEJhcml2YXQgCToJCToJMAorU3ZheSBSaWVuZyAJOgkxCToJMjk2NgorQ2hhbnRyZWEgCToJCToJMAorS2FtcG9uZyBSb3UgCToJCToJMAorUnVtZHVvbCAJOgkJOgkwCitSb21lYXMgSGFlayAJOgkJOgkwCitTdmF5IENocnVtIAk6CQk6CTAKK1N2YXkgUmllbmcgCToJCToJMAorU3ZheSBUZWFiIAk6CQk6CTAKK1Rha2VvIAk6CTEJOgkzNTYzCitBbmdrb3IgQm9yZWkgCToJCToJMAorQmF0aSAJOgkJOgkwCitCb3VyZWkgQ2hvbHNhciAJOgkJOgkwCitLaXJpIFZvbmcgCToJCToJMAorS2FvaCBBbmRhZXQgCToJCToJMAorUHJleSBLYWJiYXMgCToJCToJMAorU2FtcmFvbmcgCToJCToJMAorRG91biBLYWV2IAk6CQk6CTAKK1RyYW0gS2FrIAk6CQk6CTAKK1RyZWFuZyAJOgkJOgkwCitLaGV0IE9kZGFyIE1lYW5jaGV5IAk6CQk6CTYxNTgKK0FubG9uZyBWZWFlbmcgCToJCToJMAorQmFudGVheSBBbXBpbCAJOgkJOgkwCitDaG9uZyBLYWwgCToJCToJMAorU2FtcmFvbmcgCToJCToJMAorVHJhcGVhbmcgUHJhc2F0IAk6CQk6CTAKK0tlcCAJOgkxCToJMzM2CitEYW1uYWsgQ2hhbmcnYWV1ciAJOgkJOgkwCitLYWViIAk6CQk6CTAKK1BhaWxpbiAJOgkxCToJODAzCitQYWlsaW4gCToJCToJMAorU2FsYSBLcmF1IAk6CQk6CTAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DQU1CT0RJQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DQU1CT0RJQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTMxNWE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NBTUJPRElBX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMjExIEBACitDYW1ib2RpYQk6CTAJOgkxMzg4MTQyNworQmFudGVheSBNZWFuY2hleQk6CTEJOgk3NzMwOTIKK01vbmdrb2wgQm9yZWkgCToJCToJMAorUGhudW0gU3JvayAJOgkJOgkwCitQcmVhaCBOZXRyIFByZWFoIAk6CQk6CTAKK091IENocm92IAk6CQk6CTAKK1NlcmVpIFNhb3Bob2FuIAk6CQk6CTAKK1RobWEgUHVvayAJOgkJOgkwCitTdmF5IENoZWsgCToJCToJMAorTWFsYWkgCToJCToJMAorQmF0dGFtYmFuZyAJOgkxCToJOTk3ODQwCitCYW5hbiAJOgkJOgkwCitUaG1hIEtvdWwgCToJCToJMAorQmF0IERhbWJhbmcgCToJCToJMAorQmF2ZWwgCToJCToJMAorQWVrIFBobnVtIAk6CQk6CTAKK01vdW5nIFJ1ZXNzZWkgCToJCToJMAorUm90YW5hayBNb25kb2wgCToJCToJMAorU2FuZ2thZSAJOgkJOgkwCitTYW1sb3V0IAk6CQk6CTAKK1NhbXBvdiBMdW4gCToJCToJMAorUGhudW0gUHJvZWsgCToJCToJMAorS2FtcmllbmcgCToJCToJMAorS29hcyBLcmFsYSAJOgkJOgkwCitLYW1wb25nIENoYW0gCToJMQk6CTE4NTc1MDAKK0JhdGhlYXkgCToJCToJMAorQ2hhbWthciBMZXUgCToJCToJMAorQ2hldW5nIFByZXkgCToJCToJMAorRGFtYmFlIAk6CQk6CTAKK0thbXBvbmcgQ2hhbSAJOgkJOgkwCitLYW1wb25nIFNpZW0gCToJCToJMAorS2FuZyBNZWFzIAk6CQk6CTAKK0thb2ggU291dGluIAk6CQk6CTAKK0tyb3VjaCBDaGhtYXIgCToJCToJMAorTWVtb3QgCToJCToJMAorT3UgUmVhbmcgT3YgCToJCToJMAorUG9uaGFlIEtyYWVrIAk6CQk6CTAKK1ByZXkgQ2hob3IgCToJCToJMAorU3JlaSBTYW50aG9yIAk6CQk6CTAKK1N0dWVuZyBUcmFuZyAJOgkJOgkwCitUYm91bmcgS2htdW0gCToJCToJMAorS2FtcG9uZyBDaGhuYW5nIAk6CTEJOgk1MTMxNzkKK0Jhcmlib3VyIAk6CQk6CTAKK0Nob2wgS2lyaSAJOgkJOgkwCitLYW1wb25nIENobm5hbmcgCToJCToJMAorS2FtcG9uZyBMZWFlbmcgCToJCToJMAorS2FtcG9uZyBUcmFsYWNoIAk6CQk6CTAKK1JvbGVhIEInaWVyIAk6CQk6CTAKK1NhbWVha2tpIE1lYW4gQ2hleSAJOgkJOgkwCitUdWVrIFBob3MgCToJCToJMAorS2FtcG9uZyBTcGV1IAk6CTEJOgk3Mjk1NTIKK0Jhc2VkdGggCToJCToJMAorQ2hiYXIgTW9uIAk6CQk6CTAKK0tvbmcgUGlzZWkgCToJCToJMAorQW9yYWwgCToJCToJMAorT2RvbmdrIAk6CQk6CTAKK1BobnVtIFNydW9jaCAJOgkJOgkwCitTYW1yYW9uZyBUb25nIAk6CQk6CTAKK1RocG9uZyAJOgkJOgkwCitLYW1wb25nIFRob20gCToJMQk6CTY4MTY5MgorQmFyYXkgCToJCToJMAorS2FtcG9uZyBTdmF5IAk6CQk6CTAKK1N0dWVuZyBTYWVuIAk6CQk6CTAKK1ByYXNhdCBCYWxhbmdrIAk6CQk6CTAKK1ByYXNhdCBTYW1ib3VyIAk6CQk6CTAKK1NhbmRhbiAJOgkJOgkwCitTYW50dWsgCToJCToJMAorU3RvdW5nIAk6CQk6CTAKK0thbXBvdCAJOgkxCToJNjAyNjI0CitBbmdrb3IgQ2hleSAJOgkJOgkwCitCYW50ZWF5IE1lYXMgCToJCToJMAorQ2hodWsgCToJCToJMAorQ2h1bSBLaXJpIAk6CQk6CTAKK0RhbmcgVG9uZyAJOgkJOgkwCitLYW1wb25nIFRyYWNoIAk6CQk6CTAKK1RvbmxlIFNhcCAgCToJMQk6CTQ4NzMKK0thbXBvdCAJOgkxCToJNjAyNjAwCitLYW1wb25nIEJheSAJOgkJOgkwCitLaGV0IEthbmRhbCAJOgkJOgkxMjQyNTA2CitLYW5kYWwgU3R1ZW5nIAk6CQk6CTAKK0tpZW4gU3ZheSAJOgkJOgkwCitLaHNhY2ggS2FuZGFsIAk6CQk6CTAKK0thb2ggVGh1bSAJOgkJOgkwCitMZXVrIERhZWsgCToJCToJMAorTHZlYSBBZW0gCToJCToJMAorTXVraCBLYW1wdWwgCToJCToJMAorQW5nayBTbnVvbCAJOgkJOgkwCitQb25oZWEgTHVldSAJOgkJOgkwCitTJ2FuZyAJOgkJOgkwCitUYSBLaG1hdSBbS2FuZGFsXQk6CTEJOgkxMjQyNTAwCitLb2ggS29uZyAJOgkxCToJMTkxNDY4CitCb3R1bSBTYWtvciAJOgkJOgkwCitLaXJpIFNha29yIAk6CQk6CTAKK0thb2ggS29uZyAJOgkJOgkwCitTbWFjaCBNZWFuIENoZXkgCToJCToJMAorTW9uZG9sIFNlaW1hIAk6CQk6CTAKK1NyYWUgQW1iZWwgCToJCToJMAorVGhtYSBCYW5nIAk6CQk6CTAKK0thbXBvbmcgU2VpbGEgCToJCToJMAorS3JhdGllIAk6CTEJOgkzMzM3NjEKK0NoaGxvdW5nIAk6CQk6CTAKK0tyYWNoZWggCToJCToJMAorUHJlYWVrIFByYXNhYiAJOgkJOgkwCitTYW1ib3VyIAk6CQk6CTAKK1NudW9sIAk6CQk6CTAKK1Nlbm1vbm91cm9tICBbTW9uZHVsIEtpcmldCToJMQk6CTQyNDEyCitLYWV2IFNlaW1hIAk6CQk6CTAKK0thb2ggTmhlYWVrIAk6CQk6CTAKK091IFJlYW5nIAk6CQk6CTAKK1BlY2hyIENoZW5kYSAJOgkJOgkwCitTYWVuIE1vbm91cm9tIAk6CQk6CTAKK1Bobm9tIFBlbmggCToJMQk6CTEzMTM4NTEKK0NoYW1rYXIgTW9uIAk6CQk6CTAKK0RvdW4gUGVuaCAJOgkJOgkwCitQcmFtcGlyIE1lYWtrYXJhIAk6CQk6CTAKK1R1b2wgS291ayAJOgkJOgkwCitEYW5na2FvIAk6CQk6CTAKK01lYW4gQ2hleSAJOgkJOgkwCitSdWVzc2VpIEthZXYgCToJCToJMAorUGhudW0gVGJlbmcgTWVhbmNoZXkgW1ByZWFoIFZpaGVhcl0JOgkxCToJMTUyMzc4CitDaGV5IFNhZW4gCToJCToJMAorQ2hoYWViIAk6CQk6CTAKK0Nob2FtIEtoc2FudCAJOgkJOgkwCitLdWxlYWVuIAk6CQk6CTAKK1JvdmllbmcgCToJCToJMAorU2FuZ2tvbSBUaG1laSAJOgkJOgkwCitUYmFlbmcgTWVhbiBDaGV5IAk6CQk6CTAKK1ByZXkgVmVuZyAJOgkxCToJMTA0NDM3NgorQmEgUGhudW0gCToJCToJMAorS2FtY2hheSBNZWFyIAk6CQk6CTAKK0thbXBvbmcgVHJhYmFlayAJOgkJOgkwCitLYW5oY2hyaWVjaCAJOgkJOgkwCitNZSBTYW5nIAk6CQk6CTAKK1BlYW0gQ2hvciAJOgkJOgkwCitQZWFtIFJvIAk6CQk6CTAKK1BlYSBSZWFuZyAJOgkJOgkwCitQcmVhaCBTZGFjaCAJOgkJOgkwCitQcmV5IFZlYWVuZyAJOgkJOgkwCitLYW1wb25nIExlYXYgCToJCToJMAorU2l0aG9yIEthbmRhbCAJOgkJOgkwCitQdXJzYXQgCToJMQk6CTQyODE3MworQmFrYW4gCToJCToJMAorS2FuZGllbmcgCToJCToJMAorS3Jha29yIAk6CQk6CTAKK1BobnVtIEtyYXZhbmggCToJCToJMAorU2FtcG92IE1lYXMgCToJCToJMAorVmVhbCBWZWFlbmcgCToJCToJMAorTHVtcGhhdCBbUmF0YW5hIEtpcmldCToJMQk6CTEyMTAyOAorQW5kb3VuZyBNZWFzIAk6CQk6CTAKK0JhbiBMdW5nIAk6CQk6CTAKK0JhciBLYWV2IAk6CQk6CTAKK0tvdW4gTW9tIAk6CQk6CTAKK0x1bXBoYXQgCToJCToJMAorT3UgQ2h1bSAJOgkJOgkwCitPdSBZYSBEYXYgCToJCToJMAorVGEgVmVhZW5nIAk6CQk6CTAKK1ZldW4gU2FpIAk6CQk6CTAKK1NpZW0gcmVhcCAJOgkxCToJODYxMjE0CitBbmdrb3IgQ2h1bSAJOgkJOgkwCitBbmdrb3IgVGh1bSAJOgkJOgkwCitCYW50ZWF5IHNyZWkgCToJCToJMAorQ2hpIEtyYWVuZyAJOgkJOgkwCitLcmFsYW5oIAk6CQk6CTAKK1B1b2sgCToJCToJMAorUHJhc2F0IEJha29uZyAJOgkJOgkwCitTaWVtIFJlYWIgCToJCToJMAorU291dHIgTmlrb20gCToJCToJMAorU3JlaSBTbmFtIAk6CQk6CTAKK1N2YXkgTGV1IAk6CQk6CTAKK1ZhcmluIAk6CQk6CTAKK1NpaGFub3VrdmlsbGUgCToJMQk6CTIwOTAwNQorTWl0dGFrcGhlYXAgCToJCToJMAorUHJleSBOb2IgCToJCToJMAorU3R1ZW5nIGhhdiAJOgkJOgkwCitTdHVuZyBUcmVuZyAJOgkxCToJMTAzOTMzCitTZXNhbiAJOgkJOgkwCitTaWVtIEJvdWsgCToJCToJMAorU2llbSBQYW5nIAk6CQk6CTAKK1N0dWVuZyBUcmFlbmcgCToJCToJMAorVGhhbGEgQmFyaXZhdCAJOgkJOgkwCitTdmF5IFJpZW5nIAk6CTEJOgk1MzgxODAKK0NoYW50cmVhIAk6CQk6CTAKK0thbXBvbmcgUm91IAk6CQk6CTAKK1J1bWR1b2wgCToJCToJMAorUm9tZWFzIEhhZWsgCToJCToJMAorU3ZheSBDaHJ1bSAJOgkJOgkwCitTdmF5IFJpZW5nIAk6CQk6CTAKK1N2YXkgVGVhYiAJOgkJOgkwCitUYWtlbyAJOgkxCToJOTAwODgwCitBbmdrb3IgQm9yZWkgCToJCToJMAorQmF0aSAJOgkJOgkwCitCb3VyZWkgQ2hvbHNhciAJOgkJOgkwCitLaXJpIFZvbmcgCToJCToJMAorS2FvaCBBbmRhZXQgCToJCToJMAorUHJleSBLYWJiYXMgCToJCToJMAorU2FtcmFvbmcgCToJCToJMAorRG91biBLYWV2IAk6CQk6CTAKK1RyYW0gS2FrIAk6CQk6CTAKK1RyZWFuZyAJOgkJOgkwCitLaGV0IE9kZGFyIE1lYW5jaGV5IAk6CQk6CTk3ODAzCitBbmxvbmcgVmVhZW5nIAk6CQk6CTAKK0JhbnRlYXkgQW1waWwgCToJCToJMAorQ2hvbmcgS2FsIAk6CQk6CTAKK1NhbXJhb25nIAk6CQk6CTAKK1RyYXBlYW5nIFByYXNhdCAJOgkJOgkwCitLZXAgCToJMQk6CTM3Nzg2CitEYW1uYWsgQ2hhbmcnYWV1ciAJOgkJOgkwCitLYWViIAk6CQk6CTAKK1BhaWxpbiAJOgkxCToJMzI2OTAKK1BhaWxpbiAJOgkJOgkwCitTYWxhIEtyYXUgCToJCToJMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NBTUVST09OX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NBTUVST09OX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMDNkNjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ0FNRVJPT05fQVJFQS50eHQKQEAgLTAsMCArMSBAQAorQ0FNRVJPT04gOiAwIDogNDY0OTUyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ0FNRVJPT05fUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ0FNRVJPT05fUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZlZTdlZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DQU1FUk9PTl9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxIEBACitDQU1FUk9PTiA6IDAgOiAxMDQ5MzY1NQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NBTkFEQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DQU5BREFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4MThjNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DQU5BREFfQVJFQS50eHQKQEAgLTAsMCArMSwxNiBAQAorQ2FuYWRhCToJMAk6CTk5ODQ2NzAKK0FsYmVydGEgIAk6CTEJOgk2NjE4NDgKK0JyaXRpc2ggQ29sdW1iaWEgCToJMQk6CTk0NDczNQorTWFuaXRvYmEgCToJMQk6CTY0Nzc5NworTmV3IEJydW5zd2ljayAJOgkxCToJNzI5MDgKK05ld2ZvdW5kbGFuZCAJOgkxCToJNDA1MjEyCitOb3J0aHdlc3QgVGVycml0b3JpZXMgCToJMQk6CTEzNDYxMDYKK05vdmEgU2NvdGlhIAk6CTEJOgk1NTI4NAorTnVuYXZ1dCAJOgkxCToJMjA5MzE5MAorT250YXJpbyAJOgkxCToJMTA3NjM5NQorUHJpbmNlIEVkd2FyZCBJc2xhbmQgCToJMQk6CTU2NjAKK1F1ZWJlYyAJOgkxCToJMTU0MjA1NgorU2Fza2F0Y2hld2FuIAk6CTEJOgk2NTEwMzYKK1l1a29uIFRlcnJpdG9yeSAJOgkxCToJNDgyNDQzCisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NBTkFEQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DQU5BREFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZlY2Q2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DQU5BREFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxNyBAQAorQ2FuYWRhCToJMAk6CTMyNDIyOTE5CitBbGJlcnRhICAJOgkxCToJMzMwNjM1OQorQnJpdGlzaCBDb2x1bWJpYSAJOgkxCToJNDI3OTQ2MgorTWFuaXRvYmEgCToJMQk6CTExNzgzNDgKK05ldyBCcnVuc3dpY2sgCToJMQk6CTc1MTExMQorTmV3Zm91bmRsYW5kIGFuZCBMYWJyYWRvciAJOgkxCToJNTE0NDA5CitOb3J0aHdlc3QgVGVycml0b3JpZXMgCToJMQk6CTQyNTI2CitOb3ZhIFNjb3RpYSAJOgkxCToJOTM2OTg4CitOdW5hdnV0IAk6CTEJOgkzMDI0NQorT250YXJpbyAJOgkxCToJMTI1OTkzNjQKK1ByaW5jZSBFZHdhcmQgSXNsYW5kIAk6CTEJOgkxMzgxNTcKK1F1ZWJlYyAJOgkxCToJNzYyMzg3MAorU2Fza2F0Y2hld2FuIAk6CTEJOgk5OTA5MzAKK1l1a29uIFRlcnJpdG9yeSAJOgkxCToJMzExNTAKKworCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DQVBFIFZFUkRFX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NBUEUgVkVSREVfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2OTg1OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DQVBFIFZFUkRFX0FSRUEudHh0CkBAIC0wLDAgKzEsMjAgQEAKK0NhcGUgVmVyZGUJOgkwCToJNDAzMworSWxoYXMgZGUgQmFybG92ZW50byAgCToJMQk6CTIyMzAKK0JvYSBWaXN0YSAJOgkxCToJNjIwCitQYWwJOgkxCToJNTQKK1BvcnRvIE5vdm8gW1NhbnRvIEFudGFvXQk6CTEJOgk1NTgKK1JpYmVpcmEgR3JhbmRlIAk6CTEJOgkxNjcKK1NhbCAJOgkxCToJMjE2CitTYW8gTmljb2xhdSAJOgkxCToJMzg4CitTYW8gVmljZW50ZSAJOgkxCToJMjI3CitJbGhhcyBkZSBTb3RhdmVudG8gCToJMQk6CTE4MDMKK0JyYXZhIAk6CTEJOgk2NworQ2FsaGV0YSBkZSBTbyBNaWd1ZWwgCToJMQk6CSAgMQorTWFpbyAJOgkxCToJMjY5CitNb3N0ZWlyb3MgCToJMQk6CSAgMQorUHJhaWEgW1NhbnRpYWdvXQk6CTEJOgkzOTYKK1NhbnRhIENhdGFyaW5hIAk6CTEJOgkyNDMKK1NhbnRhIENydXogCToJMQk6CTE0OQorU28gRG9taW5nb3MJOgkxCToJICAxCitTbyBGaWxpcGUgW0ZvZ29dCToJMQk6CSAgMQorVGFycmFmYWwgCToJMQk6CTIwMwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NBUEUgVkVSREVfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ0FQRSBWRVJERV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2EwZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NBUEUgVkVSREVfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwyMCBAQAorQ2FwZSBWZXJkZQk6CTAJOgk0MjA5NzkKK0lsaGFzIGRlIEJhcmxvdmVudG8gIAk6CTEJOgkxNDY2NjgKK0JvYSBWaXN0YSAJOgkxCToJNDIwOQorUGFsCToJMQk6CTgzODUKK1BvcnRvIE5vdm8gW1NhbnRvIEFudGFvXQk6CTEJOgkxNzE5MQorUmliZWlyYSBHcmFuZGUgCToJMQk6CTIxNTk0CitTYWwgCToJMQk6CTE0ODE2CitTYW8gTmljb2xhdSAJOgkxCToJMTMzMTAKK1NhbyBWaWNlbnRlIAk6CTEJOgk2NzE2MworSWxoYXMgZGUgU290YXZlbnRvIAk6CTEJOgkyODc2MDYKK0JyYXZhIAk6CTEJOgk2ODA0CitDYWxoZXRhIGRlIFNvIE1pZ3VlbCAJOgkxCToJMTYxMjgKK01haW8gCToJMQk6CTY3NTQKK01vc3RlaXJvcyAJOgkxCToJOTUzNQorUHJhaWEgW1NhbnRpYWdvXQk6CTEJOgkxMDYzNDgKK1NhbnRhIENhdGFyaW5hIAk6CTEJOgk1MDAyNAorU2FudGEgQ3J1eiAJOgkxCToJMzMwMTUKK1NvIERvbWluZ29zCToJMQk6CTEzMzIwCitTbyBGaWxpcGUgW0ZvZ29dCToJMQk6CTI3ODg2CitUYXJyYWZhbCAJOgkxCToJMTc3OTIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DQVBFVkVSREVfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ0FQRVZFUkRFX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYWIzYTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ0FQRVZFUkRFX0FSRUEudHh0CkBAIC0wLDAgKzEsMjEgQEAKK0NhcGUgVmVyZGUJOgkwCToJNDAzMworSWxoYXMgZGUgQmFybG92ZW50byAgCToJMQk6CTIyMzAKK0JvYSBWaXN0YSAJOgkxCToJNjIwCitQYWwJOgkxCToJNTQKK1BvcnRvIE5vdm8gW1NhbnRvIEFudGFvXQk6CTEJOgk1NTgKK1JpYmVpcmEgR3JhbmRlIAk6CTEJOgkxNjcKK1NhbCAJOgkxCToJMjE2CitTYW8gTmljb2xhdSAJOgkxCToJMzg4CitTYW8gVmljZW50ZSAJOgkxCToJMjI3CitJbGhhcyBkZSBTb3RhdmVudG8gCToJMQk6CTE4MDMKK0JyYXZhIAk6CTEJOgk2NworQ2FsaGV0YSBkZSBTbyBNaWd1ZWwgCToJMQk6CSAgMQorTWFpbyAJOgkxCToJMjY5CitNb3N0ZWlyb3MgCToJMQk6CSAgMQorUHJhaWEgW1NhbnRpYWdvXQk6CTEJOgkzOTYKK1NhbnRhIENhdGFyaW5hIAk6CTEJOgkyNDMKK1NhbnRhIENydXogCToJMQk6CTE0OQorU28gRG9taW5nb3MJOgkxCToJICAxCitTbyBGaWxpcGUgW0ZvZ29dCToJMQk6CSAgMQorVGFycmFmYWwgCToJMQk6CTIwMworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ0FQRVZFUkRFX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NBUEVWRVJERV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2EwZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NBUEVWRVJERV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDIwIEBACitDYXBlIFZlcmRlCToJMAk6CTQyMDk3OQorSWxoYXMgZGUgQmFybG92ZW50byAgCToJMQk6CTE0NjY2OAorQm9hIFZpc3RhIAk6CTEJOgk0MjA5CitQYWwJOgkxCToJODM4NQorUG9ydG8gTm92byBbU2FudG8gQW50YW9dCToJMQk6CTE3MTkxCitSaWJlaXJhIEdyYW5kZSAJOgkxCToJMjE1OTQKK1NhbCAJOgkxCToJMTQ4MTYKK1NhbyBOaWNvbGF1IAk6CTEJOgkxMzMxMAorU2FvIFZpY2VudGUgCToJMQk6CTY3MTYzCitJbGhhcyBkZSBTb3RhdmVudG8gCToJMQk6CTI4NzYwNgorQnJhdmEgCToJMQk6CTY4MDQKK0NhbGhldGEgZGUgU28gTWlndWVsIAk6CTEJOgkxNjEyOAorTWFpbyAJOgkxCToJNjc1NAorTW9zdGVpcm9zIAk6CTEJOgk5NTM1CitQcmFpYSBbU2FudGlhZ29dCToJMQk6CTEwNjM0OAorU2FudGEgQ2F0YXJpbmEgCToJMQk6CTUwMDI0CitTYW50YSBDcnV6IAk6CTEJOgkzMzAxNQorU28gRG9taW5nb3MJOgkxCToJMTMzMjAKK1NvIEZpbGlwZSBbRm9nb10JOgkxCToJMjc4ODYKK1RhcnJhZmFsIAk6CTEJOgkxNzc5MgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQ19BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DRU5UUkFMIEFGUklDQU4gUkVQVUJMSUNfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwOWM4NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DRU5UUkFMIEFGUklDQU4gUkVQVUJMSUNfQVJFQS50eHQKQEAgLTAsMCArMSwxOCBAQAorQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljCToJMAk6CTYyMjk4NAorQmFtaW5ndWkgQmFuZ29yYW4gIFtCYW1pbmd1aSBCYW5nb3JhXQk6CTEJOgk1ODIwMAorQmFuZ3VpIAk6CTEJOgk2NworQmFzc2UgS290dG8gCToJMQk6CTE3NjA0CitIYXV0IE1ib21vdSAJOgkxCToJNTU1MzAKK0hhdXRlIEtvdHRvIAk6CTEJOgk4NjY1MAorS2VtbyAJOgkxCToJMTcyMDQKK0xvYmF5ZSAJOgkxCToJMTkyMzUKK01hbWJlcmUgS2FkZWkgCToJMQk6CTMwMjAzCitNYm9tb3UgCToJMQk6CTYxMTUwCitOYW5hIEdyZWJpemkgIFtuYW5hIGdyaWJpbmd1aV0JOgkxCToJMTk5OTYKK05hbmEgTWFtYmVyZSAJOgkxCToJMjY2MDAKK09tYmVsbGEgTXBva28gCToJMQk6CTMxODM1CitPdWFrYSAJOgkxCToJNDk5MDAKK091aGFtIAk6CTEJOgk1MDI1MAorT3VoYW0gUGVuZGUJOgkxCToJMzIxMDAKK1NhbmdoYSBNYmFlcmUgW1NhbmdoYTFdIFtTYW5naGFdCToJMQk6CTE5NDEyCitWYWthZ2EgCToJMQk6CTQ2NTAwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ0VOVFJBTCBBRlJJQ0FOIFJFUFVCTElDX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQ19QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTA5Yzg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQ19QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDE4IEBACitDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMJOgkwCToJNjIyOTg0CitCYW1pbmd1aSBCYW5nb3JhbiAgW0JhbWluZ3VpIEJhbmdvcmFdCToJMQk6CTU4MjAwCitCYW5ndWkgCToJMQk6CTY3CitCYXNzZSBLb3R0byAJOgkxCToJMTc2MDQKK0hhdXQgTWJvbW91IAk6CTEJOgk1NTUzMAorSGF1dGUgS290dG8gCToJMQk6CTg2NjUwCitLZW1vIAk6CTEJOgkxNzIwNAorTG9iYXllIAk6CTEJOgkxOTIzNQorTWFtYmVyZSBLYWRlaSAJOgkxCToJMzAyMDMKK01ib21vdSAJOgkxCToJNjExNTAKK05hbmEgR3JlYml6aSAgW25hbmEgZ3JpYmluZ3VpXQk6CTEJOgkxOTk5NgorTmFuYSBNYW1iZXJlIAk6CTEJOgkyNjYwMAorT21iZWxsYSBNcG9rbyAJOgkxCToJMzE4MzUKK091YWthIAk6CTEJOgk0OTkwMAorT3VoYW0gCToJMQk6CTUwMjUwCitPdWhhbSBQZW5kZQk6CTEJOgkzMjEwMAorU2FuZ2hhIE1iYWVyZSBbU2FuZ2hhMV0gW1NhbmdoYV0JOgkxCToJMTk0MTIKK1Zha2FnYSAJOgkxCToJNDY1MDAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DSEFEX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NIQURfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiOTAzOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DSEFEX0FSRUEudHh0CkBAIC0wLDAgKzEsMzUgQEAKK0NoYWQJOgkwCToJMTI4NDAwMAorQXNzb25naGEgIAk6CTEJOgkwCitDaGFyaS1CYWd1aXJtaSAJOgkxCToJODI5MTAKK0JhaHIgRWwgR2F6YWwgCToJMQk6CTAKK0JhaHIgS2hvIAk6CTEJOgkwCitCYXRoYSBFc3QgCToJMQk6CTAKK0JhdGhhIE91ZXN0IAk6CTEJOgkwCitCb3Jrb3UtRW5uZWRpLVRpYmVzdGkgOiAxIDogNjAwMzUwCitNYXlvLUtlYmJpIDogMSA6IDMwMTA1CitNb3llbi1DaGFyaSA6IDEgOiA0NTE4MAorQmF0aGEJOgkxCToJODg4MDAKK0JpbHRpbmUgCToJMQk6CTQ2ODUwCitCb3Jrb3UgCToJMQk6CTAKK0RhYmFiYSAJOgkxCToJMAorRW5uZWRpIAk6CTEJOgkwCitHdWVyYSAJOgkxCToJNTg5NTAKK0hhZGplciBMYW1pcyAJOgkxCToJMAorS2FiaWEgCToJMQk6CTAKK0thbmVtIAk6CTEJOgkxMTQ1MjAKK0xha2UgW0xhY10gCToJMQk6CTIyMzIwCitMYWMgSXJvIAk6CTEJOgkwCitMb2dvbmUgb2NjaWRlbnRhbCBbTG9nb25lIE9jY2lkZW5dCToJMQk6CTg2OTUKK0xvZ29uZSBvcmllbnRhbCBbTG9nb25lIE9yaWVudGFdIAk6CTEJOgkyODAzNQorTWFuZG91bCAJOgkxCToJMAorTWF5byBCb25leWUgCToJMQk6CTAKK01heW8gRGFsYSAJOgkxCToJMAorTW9udHMgZGUgTGFtIAk6CTEJOgkwCitOJ0RqYW3pbmEgCToJMQk6CTgyOTEwCitPdWFkZGHvIFtPdWFkZGFpXQk6CTEJOgk3NjI0MAorU2FsYW1hdCAJOgkxCToJNjMwMDAKK1NpbGEgCToJMQk6CTAKK1RhbmRqaWzpIEVzdCAJOgkxCToJMAorVGFuZGppbOkgT3Vlc3QgCToJMQk6CTAKK1RhbmRpbGUgW1RhbmRqaWxlXSAJOgkxCToJMTgwNDUKK1RpYmVzdGkgCToJMQk6CTAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DSEFEX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NIQURfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQxODk2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DSEFEX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMzUgQEAKK0NoYWQJOgkwCToJOTk0NDIwMQorQXNzb25naGEgIAk6CTEJOgkxNDU0ODYKK0NoYXJpLUJhZ3Vpcm1pIAk6CTEJOgkzMTY0NzAKK0JhaHIgRWwgR2F6YWwgCToJMQk6CTEwMDQzOQorQmFociBLaG8gCToJMQk6CTMzMDg5MQorQmF0aGEgRXN0IAk6CTEJOgkxNTc5NjMKK0JhdGhhIE91ZXN0IAk6CTEJOgkyMjY4NzEKK0JvcmtvdS1Fbm5lZGktVGliZXN0aSA6IDEgOiAxMDE4MDIKK01heW8tS2ViYmkgOiAxIDogODIwMjQ5CitNb3llbi1DaGFyaSA6IDEgOiA3Mzg1OTUKK0JhdGhhCToJMQk6CTM4NDgzNAorQmlsdGluZSAJOgkxCToJMjM1NjI5CitCb3Jrb3UgCToJMQk6CTUzOTU4CitEYWJhYmEgCToJMQk6CTE3ODc5NAorRW5uZWRpIAk6CTEJOgkzNjk3OQorR3VlcmEgCToJMQk6CTM3NzkzOQorSGFkamVyIExhbWlzIAk6CTEJOgk0Mzk3MDEKK0thYmlhIAk6CTEJOgk0MTYzNDIKK0thbmVtIAk6CTEJOgkyMzk3MjQKK0xha2UgW0xhY10gCToJMQk6CTMxMDg5MAorTGFjIElybyAJOgkxCToJMTI2NTQ2CitMb2dvbmUgb2NjaWRlbnRhbCBbTG9nb25lIE9jY2lkZW5dCToJMQk6CTU5MjQ2OAorTG9nb25lIG9yaWVudGFsIFtMb2dvbmUgT3JpZW50YV0JOgkxCToJMjg1NjU4CitNYW5kb3VsIAk6CTEJOgk0OTI1ODIKK01heW8gQm9uZXllIAk6CTEJOgkyMzg0OTQKK01heW8gRGFsYSAJOgkxCToJMzcwMTY3CitNb250cyBkZSBMYW0gCToJMQk6CTE2NjkwOAorTidEamFt6W5hIAk6CTEJOgk2MzkwMDAKK091YWRkYe8gW091YWRkYWldCToJMQk6CTMxOTg4NgorU2FsYW1hdCAJOgkxCToJMjI4ODQ4CitTaWxhIAk6CTEJOgkxODU3MjgKK1RhbmRqaWzpIEVzdCAJOgkxCToJMjIxNTEzCitUYW5kamls6SBPdWVzdCAJOgkxCToJMzUyNTA5CitUYW5kaWxlIFtUYW5kamlsZV0JOgkxCToJNTc0MDIyCitUaWJlc3RpIAk6CTEJOgkxMDg2NQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NISUxFX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NISUxFX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZGEyNDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ0hJTEVfQVJFQS50eHQKQEAgLTAsMCArMSw1OSBAQAorQ2hpbGUJOgkwCToJNzU2OTUwCitUYXJhcGFjYQk6CTEJOgk1OTA5OS4xMAorQW50b2ZhZ2FzdGEJOgkxCToJMTI2MDQ5LjEwCitBdGFjYW1hCToJMQk6CTc1MTc2LjIwCitDb3F1aW1ibwk6CTEJOgk0MDU3OS45MAorVmFscGFyYWlzbwk6CTEJOgkxNjM5Ni4xMAorUmVnaW9uIGRlbCBMaWJlcnRhZG9yIEdlbmVyYWwgQmVybmFyZG8gTydIaWdnaW5zIChWSSkgCToJMQk6CTE2Mzg3LjAwCitNYXVsZQk6CTEJOgkzMDI5Ni4xMAorQmlvQmlvCToJMQk6CTM3MDYyLjYwCitBcmF1Y2FuaWEJOgkxCToJMzE4NDIuMzAKK0xhZ29zCToJMQk6CTY3MDEzLjAwCitSZWdpb24gQXlzZW4gZGVsIEdlbmVyYWwgQ2FybG9zIEliYfFleiBkZWwgQ2FtcG8gKFhJKSAJOgkxCToJMTA4NDk0LjQwCitNYWdhbGxhbmVzCToJMQk6CTEzMjI5Ny4yMAorU2FudGlhZ28gCToJMQk6CTE1NDAzLjIwCitBSVNFTiA6IDEgOiAxMDg0OTQKK0FOVEFSVElDQSBDSElMRU5BIDogMSA6IDEyNTAwMDAKK0FSQVVDTyA6IDEgOiA1NDIwNgorQVJJQ0EgOiAxIDogNzU2OTUwCitDQUNIQVBPQUwgOiAxIDogNTUxCitDQVBJVEFOIFBSQVQgOiAxIDogMTI4MAorQ0FSREVOQUwgQ0FSTyA6IDEgOiAyNDMwCitDQVVRVUVORVMgOiAxIDogMjcwMDAKK0NBVVRJTiA6IDEgOiA5NDAwMAorQ0hBQ0FCVUNPIDogMSA6IDM2NTAwCitDSEFOQVJBTCA6IDEgOiAyMTAwMAorQ0hJTE9FIDogMSA6IDI4NDAwCitDSE9BUEEgOiAxIDogMjQwMDAKK0NPSUhBSVFVRSA6IDEgOiAxODI3MAorQ09MQ0hBR1VBIDogMSA6IDg1MTAwCitDT1BJQVBPIDogMSA6IDc5MDAwCitDT1JESUxMRVJBIDogMSA6IDk2MDAwCitDVVJJQ08gOiAxIDogNTAwMDAKK0VMIExPQSA6IDEgOiAyNDAwMAorRUxRVUkgOiAxIDogMTA1MDAwCitHRU5FUkFMIENBUlJFUkEgOiAxIDogMTExMAorSFVBU0NPIDogMSA6IDE3NjAwCitJUVVJUVVFIDogMSA6IDU5MDk5CitMSU1BUkkgOiAxIDogMjcwMDAKK0xJTkFSRVMgOiAxIDogNTQwMDAKK0xMQU5RVUlIVUUgOiAxIDogNzAwMDAKK0xPUyBBTkRFUyA6IDEgOiA0MDAwMAorTUFJUE8gOiAxIDogODcwMDAKK01BTExFQ08gOiAxIDogNTIwMDAKK01FTElQSUxMQSA6IDEgOiAyNjAwMAorTlVCTEUgOiAxIDogODc5MDAKK09TT1JOTyA6IDEgOiA1NzAwMAorUEFMRU5BIDogMSA6IDM2MDAKK1BBUklOQUNPVEEgOiAxIDogODQwCitQRVRPUkNBIDogMSA6IDU4MDAwCitRVUlMTE9UQSA6IDEgOiA5MzQwMAorU0FOIEFOVE9OSU8gOiAxIDogOTIwMDAKK1NBTiBGRUxJUEUgREUgQUNPTkNBR1VBIDogMSA6IDM2MDAwCitUQUxBR0FOVEUgOiAxIDogNTkwMDAKK1RBTENBIDogMSA6ICA1ODAwMAorVElFUlJBIERFTCBGVUVHTyA6IDEgOiAyNjMwCitUT0NPUElMTEEgOiAxIDogMjAwMAorVUxUSU1BIEVTUEVSQU5aQSA6IDEgOiA1NTcwCitWQUxESVZJQSA6IDEgOiA4ODAwMAorQ09OQ0VQQ0lPTiA6IDEgOiAyNjUwMDAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DSElMRV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DSElMRV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGYyYzhjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NISUxFX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsNjAgQEAKK0NoaWxlCToJMAk6CTE2MTM0MjE5CitUYXJhcGFjYQk6CTEJOgk0Mjg1OTQKK0FudG9mYWdhc3RhCToJMQk6CTQ5Mzk4NAorQXRhY2FtYQk6CTEJOgkyNTQzMzYKK0NvcXVpbWJvCToJMQk6CTYwMzIxMAorVmFscGFyYWlzbwk6CTEJOgkxNTM5ODUyCitSZWdpb24gZGVsIExpYmVydGFkb3IgR2VuZXJhbCBCZXJuYXJkbyBPJ0hpZ2dpbnMgKFZJKSAJOgkxCToJNzgwNjI3CitNYXVsZQk6CTEJOgk5MDgwOTcKK0Jpb0Jpbwk6CTEJOgkxODYxNTYyCitBcmF1Y2FuaWEJOgkxCToJODY5NTM1CitMYWdvcwk6CTEJOgkxMDczMTM1CitSZWdpb24gQXlzZW4gZGVsIEdlbmVyYWwgQ2FybG9zIEliYfFleiBkZWwgQ2FtcG8gKFhJKSAJOgkxCToJOTE0OTIKK01hZ2FsbGFuZXMJOgkxCToJMTUwODI2CitTYW50aWFnbyAJOgkxCToJNjA2MTE4NQorQUlTRU4gOiAxIDogOTE0OTIKK0FOVEFSVElDQSBDSElMRU5BIDogMSA6IDEzMAorQVJBVUNPIDogMSA6IDE2MDYwNgorQVJJQ0EgOiAxIDogMTc1NDQxIAorQ0FDSEFQT0FMIDogMSA6IDMwMDAwMAorQ0FQSVRBTiBQUkFUIDogMSA6IDIyMTcKK0NBUkRFTkFMIENBUk8gOiAxIDogNDMyICAKK0NBVVFVRU5FUyA6IDEgOiAzMDc3MQorQ0FVVElOIDogMSA6IDMwMDAwMAorQ0hBQ0FCVUNPIDogMSA6IDg1MDAwCitDSEFOQVJBTCA6IDEgOiAzMTMwMAorQ0hJTE9FIDogMSA6IDg3MDAwCitDSE9BUEEgOiAxIDogNDYwMDAgCitDT0lIQUlRVUUgOiAxIDogIDQ0ODUwCitDT0xDSEFHVUEgOiAxIDogMTA4MDAwCitDT1BJQVBPIDogMSA6IDEyNTk4MworQ09SRElMTEVSQSA6IDEgOiA1MDcwMDAKK0NVUklDTyA6IDEgOiA5MzQ0NyAKK0VMIExPQSA6IDEgOiAxMzUwMDAKK0VMUVVJIDogMSA6IDMxMDAwMAorR0VORVJBTCBDQVJSRVJBIDogMSA6ICAzMDQyCitIVUFTQ08gOiAxIDogNTEwMDAKK0lRVUlRVUUgOiAxIDogNDI4NTk0CitMSU1BUkkgOiAxIDogNzgwMDAKK0xJTkFSRVMgOiAxIDogNjUxMzMKK0xMQU5RVUlIVUUgOiAxIDogMjE1MDAwCitMT1MgQU5ERVMgOiAxIDogNTU2MDgKK01BSVBPIDogMSA6IDI5MjAwMAorTUFMTEVDTyA6IDEgOiAxMzIwMDAKK01FTElQSUxMQSA6IDEgOiA1MzUyMiAKK05VQkxFIDogMSA6IDIzMDAwMAorT1NPUk5PIDogMSA6IDEzMjI0NQorUEFMRU5BIDogMSA6IDgwMDAKK1BBUklOQUNPVEEgOiAxIDogMTIzNQorUEVUT1JDQSA6IDEgOiA0NTAwMAorUVVJTExPVEEgOiAxIDogNDc4MzYgCitTQU4gQU5UT05JTyA6IDEgOiA4MzQzNQorU0FOIEZFTElQRSBERSBBQ09OQ0FHVUEgOiAxIDogNTMzNTgKK1RBTEFHQU5URSA6IDEgOiA0OTk1NworVEFMQ0EgOiAxIDogMTg5NTA1CitUSUVSUkEgREVMIEZVRUdPIDogMSA6IDQ3MzQKK1RPQ09QSUxMQSA6IDEgOiAyMzM1MgorVUxUSU1BIEVTUEVSQU5aQSA6IDEgOiAxNjk3OAorVkFMRElWSUEgOiAxIDogMTI3NzUwCitDT05DRVBDSU9OIDogMSA6IDgwMTU5CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DSElOQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DSElOQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzc3MzM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NISU5BX0FSRUEudHh0CkBAIC0wLDAgKzEsNDAgQEAKK0NoaW5hCToJMAk6CTk1OTY5NjAKK0hvbmdrb25nIElzbGFuZCA6IDEgOiAxMTA0CitKYW1tdSBhbmQgS2FzaG1pciA6IDEgOiAyMjIyMzYKK0tvd0xvb24gYW5kIG5ldyBLb3dsb29uIDogMSA6IDQ3CitOZXcgVGVycml0b3JpZXMgOiAxIDogMzMwCitUYWl3YW4gOiAxIDogMzYxNzkKK0JlaWppbmcJOgkxCToJMTY4MDgKK1RpYW5qaW4JOgkxCToJMTEzMDAKK0hlYmVpCToJMQk6CTIwMjcwMAorU2hhbnhpCToJMQk6CTE1NzEwMAorTmVpIE1vbmdvbCBaaXpoaXF1IAk6CTEJOgkxMTc3NTAwCitMaWFvbmluZwk6CTEJOgkxNTEwMDAKK0ppbGluCToJMQk6CTE4NzAwMAorSGVpbG9uZ2ppYW5nIAk6CTEJOgk0NjM2MDAKK1NoYW5naGFpCToJMQk6CTYyMDAKK0ppYW5nc3UJOgkxCToJMTAyNjAwCitaaGVqaWFuZwk6CTEJOgkxMDE4MDAKK0FuaHVpCToJMQk6CTEzOTkwMAorRnVqaWFuCToJMQk6CTEyMzEwMAorSmlhbmd4aQk6CTEJOgkxNjQ4MDAKK1NoYW5kb25nIAk6CTEJOgkxNTMzMDAKK0hlbmFuCToJMQk6CTE2NzAwMAorSHViZWkJOgkxCToJMTg3NTAwCitIdW5hbgk6CTEJOgkyMTA1MDAKK0d1YW5nZG9uZwk6CTEJOgkxOTcxMDAKK0d1YW5neGkJOgkxCToJMjIwNDAwCitNYXJpbmUgOiAxIDogMTUwCitIYWluYW4JOgkxCToJMzQzMDAKK0Nob25ncWluZwk6CTEJOgk4MjQwMAorU2ljaHVhbgk6CTEJOgk0ODgwMDAKK0d1aXpob3UJOgkxCToJMTc0MDAwCitZdW5uYW4JOgkxCToJNDM2MjAwCitYaXphbmcgWml6aGlxdSAoVElCRVQpCToJMQk6CTEyMjE2MDAKK1NoYWFueGkJOgkxCToJMTk1ODAwCitHYW5zdQk6CTEJOgkzNjY1MDAKK1FpbmdoYWkJOgkxCToJNzIxMDAwCitOaW5neGlhIFtOaW5neGlhIEh1aXp1IFppemhpcXVdIAk6CTEJOgk2NjQwMAorWGluamlhbmcgVXlndXIgCToJMQk6CTE2NDY5MDAKK1hpYW5nZ2FuZyBTQVIgCToJMQk6CTEwMzgKK0FvbWVuIFNBUiAJOgkxCToJMjEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DSElOQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DSElOQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODY1YzA3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NISU5BX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsNDAgQEAKK0NoaW5hCToJMAk6CTEzMTM5NzM3MTMKK0hvbmdrb25nIElzbGFuZCA6IDEgOiA3MDQxMDAwCitKYW1tdSBhbmQgS2FzaG1pciA6IDEgOiAxMDA2OTkxNyAKK0tvd0xvb24gYW5kIG5ldyBLb3dsb29uIDogMSA6IDIwNzEwMDAKK05ldyBUZXJyaXRvcmllcyA6IDEgOiAzMzQzMDQ2CitUYWl3YW4gOiAxIDogMjI4OTQzODQKK0JlaWppbmcJOgkxCToJMTQ5MzAwMDAKK1RpYW5qaW4JOgkxCToJMTAyNDAwMDAKK0hlYmVpCToJMQk6CTY4MDkwMDAwCitTaGFueGkJOgkxCToJMzMzNTAwMDAKK05laSBNb25nb2wgWml6aGlxdSAJOgkxCToJMjM4NDAwMDAKK0xpYW9uaW5nCToJMQk6CTQyMTcwMDAwCitKaWxpbgk6CTEJOgkyNzA5MDAwMAorSGVpbG9uZ2ppYW5nIAk6CTEJOgkzODE3MDAwMAorU2hhbmdoYWkJOgkxCToJMTc0MjAwMDAKK0ppYW5nc3UJOgkxCToJNzQzMzAwMDAKK1poZWppYW5nCToJMQk6CTQ3MjAwMDAwCitBbmh1aQk6CTEJOgk2NDYxMDAwMAorRnVqaWFuCToJMQk6CTM1MTEwMDAwCitKaWFuZ3hpCToJMQk6CTQyODQwMDAwCitTaGFuZG9uZyAJOgkxCToJOTE4MDAwMDAKK0hlbmFuCToJMQk6CTk3MTcwMDAwCitIdWJlaQk6CTEJOgk2MDE2MDAwMAorSHVuYW4JOgkxCToJNjY5ODAwMDAKK0d1YW5nZG9uZwk6CTEJOgk4MzA0MDAwMAorR3Vhbmd4aQk6CTEJOgk0ODg5MDAwMAorSGFpbmFuCToJMQk6CTgxODAwMDAKK0Nob25ncWluZwk6CTEJOgkzMTIyMDAwMAorU2ljaHVhbgk6CTEJOgk4NzI1MDAwMAorR3VpemhvdQk6CTEJOgkzOTA0MDAwMAorWXVubmFuCToJMQk6CTQ0MTUwMDAwCitNYXJpbmUgOiAxIDogMTU1NjAwCitYaXphbmcgWml6aGlxdSAoVElCRVQpCToJMQk6CTI3NDAwMDAKK1NoYWFueGkJOgkxCToJMzcwNTAwMDAKK0dhbnN1CToJMQk6CTI2MTkwMDAwCitRaW5naGFpCToJMQk6CTUzOTAwMDAKK05pbmd4aWEgW05pbmd4aWEgSHVpenUgWml6aGlxdV0gCToJMQk6CTU4ODAwMDAKK1hpbmppYW5nIFV5Z3VyIAk6CTEJOgkxOTYzMDAwMAorWGlhbmdnYW5nIFNBUiAJOgkxCToJNjg5NTUwMAorQW9tZW4gU0FSIAk6CTEJOgk0NjUzMDAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DT0xPTUJJQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DT0xPTUJJQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjRiN2QzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NPTE9NQklBX0FSRUEudHh0CkBAIC0wLDAgKzEsMzUgQEAKK0NvbG9tYmlhCToJMAk6CTExMzg5MTAKK0J1ZW5hdmVudHVyYSA6IDEgOiAxMjkwCithbWF6b25hcwk6CTEJOgkxMDk2NjUKK2FudGlvcXVpYQk6CTEJOgk2MzYxMgorYXJhdWNhCToJMQk6CTIzODE4CitBdGxhbnRpY28JOgkxCToJMzM4OAorYm9nb3RhCToJMQk6CTE1ODcKK0JvbGl2YXIJOgkxCToJMjU5NzgKK0JveWFjYQk6CTEJOgkyMzE4OQorQ2FsZGFzCToJMQk6CTc4ODgKK0NhcXVldGEJOgkxCToJODg5NjUKK0Nhc2FuYXJlCToJMQk6CTQ0NjQwCitDYXVjYQk6CTEJOgkyOTMwOAorQ2VzYXIJOgkxCToJMjI5MDUKK0Nob2NvCToJMQk6CTQ2NTMwCitDb3Jkb2JhCToJMQk6CTI1MDIwCitDdW5kaW5hbWFyY2EJOgkxCToJMjI2MjMKK0d1YW5pYQk6CTEJOgk3MjIzOAorR3VhdmlhcmUJOgkxCToJNDIzMjcKK0h1aWxhCToJMQk6CTE5ODkwCitHdWFqaXJhCToJMQk6CTIwODQ4CittYWdkYWxlbmEJOgkxCToJMjMxODgKK21ldGEJOgkxCToJODU2MzUKK25hcmlubwk6CTEJOgkzMzI2OAorbm9ydGUgZGUgc2FudGFuZGVyCToJMQk6CTIxNjU4CitwdXR1bWF5bwk6CTEJOgkyNDg4NQorcXVpbmRpbwk6CTEJOgkxODQ1CityaXNhcmFsZGEJOgkxCToJNDE0MAorU2FuIEFuZHJlcyBZIFByb3ZpZGVuY2lhCToJMQk6CTQ0CitTYW50YW5kZXIJOgkxCToJMzA1MzcKK1N1Y3JlCToJMQk6CTEwOTE3CitUb2xpbWEJOgkxCToJMjM1NjIKK1ZhbGxlIGRlbCBjYXVjYQk6CTEJOgkyMjE0MAorVmF1cGVzCToJMQk6CTY1MjY4Cit2aWNoYWRhCToJMQk6CTEwMDI0MgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NPTE9NQklBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NPTE9NQklBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNTYxODkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ09MT01CSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwzNSBAQAorQ29sb21iaWEJOgkwCToJNDM1OTMwMzUKK0J1ZW5hdmVudHVyYSA6IDEgOiAzMjQyMDcKK2FtYXpvbmFzCToJMQk6CTgwNDg3CithbnRpb3F1aWEJOgkxCToJNTc2MTE3NQorYXJhdWNhCToJMQk6CTI4MTQzNQorQXRsYW50aWNvCToJMQk6CTIzNzA3NTMKK2JvZ290YQk6CTEJOgk3MTg1ODg5CitCb2xpdmFyCToJMQk6CTIyMzExNjMKK0JveWFjYQk6CTEJOgkxNDEzMDY0CitDYWxkYXMJOgkxCToJMTE3MjUxMAorQ2FxdWV0YQk6CTEJOgk0NjUwNzgKK0Nhc2FuYXJlCToJMQk6CTMyNTM4OQorQ2F1Y2EJOgkxCToJMTM2NzQ5NgorQ2VzYXIJOgkxCToJMTA1MzEyMworQ2hvY28JOgkxCToJNDE2MzE4CitDb3Jkb2JhCToJMQk6CTEzOTY3NjQKK0N1bmRpbmFtYXJjYQk6CTEJOgkyMzQwODk0CitHdWFuaWEJOgkxCToJNDMxOTQKK0d1YXZpYXJlCToJMQk6CTEzMzQxMQorSHVpbGEJOgkxCToJOTk2NjE3CitHdWFqaXJhCToJMQk6CTUyNjE0OAorbWFnZGFsZW5hCToJMQk6CTE0MDYxMjYKK21ldGEJOgkxCToJNzcyODUzCituYXJpbm8JOgkxCToJMTc3NTk3Mworbm9ydGUgZGUgc2FudGFuZGVyCToJMQk6CTE0OTQyMTkKK3B1dHVtYXlvCToJMQk6CTM3ODc5MAorcXVpbmRpbwk6CTEJOgk2MTI3MTkKK3Jpc2FyYWxkYQk6CTEJOgkxMDI1NTM5CitTYW4gQW5kcmVzIFkgUHJvdmlkZW5jaWEJOgkxCToJODM0MDMKK1NhbnRhbmRlcgk6CTEJOgkyMDg2NjQ5CitTdWNyZQk6CTEJOgk4NzAyMTkKK1RvbGltYQk6CTEJOgkxMzE2MDUzCitWYWxsZSBkZWwgY2F1Y2EJOgkxCToJNDUzMjM3OAorVmF1cGVzCToJMQk6CTMzMTQyCit2aWNoYWRhCToJMQk6CTk2MTM4CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ09NT1JPU19BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DT01PUk9TX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMDdlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ09NT1JPU19BUkVBLnR4dApAQCAtMCwwICsxLDQgQEAKK256d2FuaSBbQW5qb3Vhbl0JOgkxCToJNDI0CitHcmFuZCBDb21vcmUJOgkxCToJMTE0OAorTXdhbGkJOgkxCToJMjkwCitJbGUgZGUgTWF5b3R0ZSAoRlIuKSA6IDEgOiAzNjMyOQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NPTU9ST1NfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ09NT1JPU19QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGEzZTEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NPTU9ST1NfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSw1IEBACituendhbmkgW0Fuam91YW5dCToJMQk6CTI0MzczMgorR3JhbmQgQ29tb3JlCToJMQk6CTI5NjE3NworTXdhbGkJOgkxCToJMzU3NTEKK0lsZSBkZSBNYXlvdHRlIChGUi4pIDogMSA6IDE0MDQ0NworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ09OR09fQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ09OR09fQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxN2UwYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DT05HT19BUkVBLnR4dApAQCAtMCwwICsxLDE4IEBACitDb25nbyAJOgkwCToJMzQyMDAwCisgQm91ZW56YSAgIAk6CTEJOgkxMjI2MAorQ29tbXVuZSBkZSBCcmF6emF2aWxsZSAJOgkxCToJMTAwCisgQ3V2ZXR0ZSAJOgkxCToJNzQ4NTAKKyBsYSBDdXZldHRlIE91ZXN0IAk6CTEJOgkwICAKK0NvbW11bmUgZGUgRG9saXNpZSAJOgkxCToJIDAgCisgS291aWxvdSAJOgkxCToJMTM2NTAKKyBsYSBM6WtvdW1vdSBbTGVrb3Vtb3VdCToJMQk6CTIwOTUwCisgTGlrb3VhbGEgCToJMQk6CTY2MDQ0CitDb21tdW5lIGRlIE1vc3NlbmRqbyAJOgkxCTowCSAgCisgTmlhcmkgCToJMQk6CTI1OTI1CitDb21tdW5lIGRlIE5rYXlpIAk6CTEJOgkgIDAKK0NvbW11bmUgZGUgT3Vlc3NvIAk6CTEJOgkgIDAKK1BsYXRlYXV4MSAgW1BsYXRlYXV4XQk6CTEJOgkzODQwMAorQ29tbXVuZSBkZSBQb2ludGUtTm9pcmUgCToJMQk6CTAgIAorIFBvb2wgCToJMQk6CTMzOTU1CisgU2FuZ2hhIAk6CTEJOgk1NTc5NQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ09OR09fUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ09OR09fUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllMDkwZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DT05HT19QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDE3IEBACitDb25nbyAJOgkwCToJMzcwMjMxNAorIEJvdWVuemEgICAJOgkxCToJMjI5ODIwCitDb21tdW5lIGRlIEJyYXp6YXZpbGxlIAk6CTEJOgkxMTc0MDA1CisgQ3V2ZXR0ZSAJOgkxCToJMTM1NzY3CisgbGEgQ3V2ZXR0ZSBPdWVzdCAJOgkxCToJNTU3NjUKK0NvbW11bmUgZGUgRG9saXNpZSAJOgkxCToJMTA2MjYyCisgS291aWxvdSAJOgkxCToJODA5NTEKKyBsYSBM6WtvdW1vdSBbTGVrb3Vtb3VdCToJMQk6CTgxNjcyCisgTGlrb3VhbGEgCToJMQk6CTg0NTEzCitDb21tdW5lIGRlIE1vc3NlbmRqbyAJOgkxCToJMTgyMDkKKyBOaWFyaSAJOgkxCToJMTA1MTQ3CitDb21tdW5lIGRlIE5rYXlpIAk6CTEJOgk1NjY4NgorQ29tbXVuZSBkZSBPdWVzc28gCToJMQk6CTI0MzIyCitQbGF0ZWF1eDEgIFtQbGF0ZWF1eF0JOgkxCToJMTcwOTc4CitDb21tdW5lIGRlIFBvaW50ZS1Ob2lyZSAJOgkxCToJNjYzMzU5CisgUG9vbCAJOgkxCToJMzYyMzU3CisgU2FuZ2hhIAk6CTEJOgk0NjcyNwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NPU1RBUklDQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DT1NUQVJJQ0FfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJmYWQxZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DT1NUQVJJQ0FfQVJFQS50eHQKQEAgLTAsMCArMSBAQAorQ09TVEEgUklDQSA6IDAgOiA1MTEwMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NPU1RBUklDQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DT1NUQVJJQ0FfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkNDkyYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DT1NUQVJJQ0FfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSBAQAorQ09TVEEgUklDQSA6IDAgOiA0MjE1NTY5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ1JPQVRJQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DUk9BVElBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZjI1YTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ1JPQVRJQV9BUkVBLnR4dApAQCAtMCwwICsxIEBACisgSHJ2YXRza2EgOiAxIDogNTY1MzguMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NST0FUSUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvQ1JPQVRJQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzQxYjAzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NST0FUSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSBAQAorIEhydmF0c2thIDogMSA6IDQ2ODQ5NzIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DWkVDSCBSRVBVQkxJQ19BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DWkVDSCBSRVBVQkxJQ19BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzdlNTNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NaRUNIIFJFUFVCTElDX0FSRUEudHh0CkBAIC0wLDAgKzEsMTIgQEAKKyBTZXZlcm9jZXNreSBrcmFqIDogMSA6IDc4MjAuMAorIFZ5Y2hvZG9jZXNreSBrcmFqIDogMSA6IDExMjQwLjAKKyBTdHJlZG9jZXNreSBrcmFqIDogMSA6IDEwOTk0LjAKKyBaYXBhZG9jZXNreSBrcmFqIDogMSA6IDEwODc1LjAKKyBTZXZlcm9tb3JhdnNreSBrcmFqIDogMSA6IDExMDY3LjAKKyBQcmFoYSA6IDEgOiA0OTYuMAorIEppaG9tb3JhdnNreSBrcmFqIDogMSA6IDE1MDI3LjAKKyBKaWhvY2Vza3kga3JhaiA6IDEgOiAxMTM0NS4wCisgU3RyZWRvbHNsb3ZlbnNreSBrcmFqIDogMSA6IDE3OTgyLjAKKyBZY2hvZG9zbG92ZW5za2kga3JhaiA6IDEgOiAxNjE5NC4wCisgWmFwYWRvc2xvdmVuc2t5IGtyYWogOiAxIDogMTQ0OTIuMAorIEJyYXRpc2xhdmEgOiAxIDogMzY4LjAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DWkVDSCBSRVBVQkxJQ19QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9DWkVDSCBSRVBVQkxJQ19QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2Y4MjEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0NaRUNIIFJFUFVCTElDX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMTIgQEAKKyBTZXZlcm9jZXNreSBrcmFqIDogMSA6IDExODk1OTIKKyBWeWNob2RvY2Vza3kga3JhaiA6IDEgOiAxMjM5ODA0CisgU3RyZWRvY2Vza3kga3JhaiA6IDEgOiAxMTU4MTA4CisgWmFwYWRvY2Vza3kga3JhaiA6IDEgOiA4NjkxODgKKyBTZXZlcm9tb3JhdnNreSBrcmFqIDogMSA6IDE5NzU2NTQKKyBQcmFoYSA6IDEgOiAxMDI1MTA3OQorIEppaG9tb3JhdnNreSBrcmFqIDogMSA6IDExMjMyMDEKKyBKaWhvY2Vza3kga3JhaiA6IDEgOiA2Mjc3NjYKKyBTdHJlZG9sc2xvdmVuc2t5IGtyYWogOiAxIDogMTU5NTM1NAorIFljaG9kb3Nsb3ZlbnNraSBrcmFqIDogMSA6IDE1MDU0OTUKKyBaYXBhZG9zbG92ZW5za3kga3JhaiA6IDEgOiAxNzEyMTgxCisgQnJhdGlzbGF2YSA6IDEgOiA2MDExMzIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9ERU5NQVJLX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0RFTk1BUktfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4ZWJjOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9ERU5NQVJLX0FSRUEudHh0CkBAIC0wLDAgKzEsMyBAQAorIFZFU1QgRk9SIFNUT1JFQkFFTFQgOiAxIDogMzMyNTIuMAorIEhPVkVEU1RBRFNSRUdJT05FTiA6IDEgOiAyODU3LjAKKyBPU1QgRk9SIFNUT1JFQkFFTFQgOiAxIDogNjk2OS4wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvREVOTUFSS19QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9ERU5NQVJLX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMzY3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvREVOTUFSS19QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDMgQEAKKyBWRVNUIEZPUiBTVE9SRUJBRUxUIDogMSA6IDI4NDU3MDAKKyBIT1ZFRFNUQURTUkVHSU9ORU4gOiAxIDogMTcxMzcwMAorIE9TVCBGT1IgU1RPUkVCQUVMVCA6IDEgOiA1ODcwMDAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9FQ1VBRE9SX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VDVUFET1JfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwMWMxMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9FQ1VBRE9SX0FSRUEudHh0CkBAIC0wLDAgKzEsMjggQEAKK0VjdWFkb3IJOgkwCToJMjgzNTYwCitSZWdpb24gIEFtYXpvbmljYSAgIAk6CTEJOgkxMTU3NDQuOTAKK01vcm9uYSBTYW50aWFnbyAJOgkxCToJMjM3OTYuODAKK05hcG8gCToJMQk6CTEyNDgzLjQwCitPcmVsbGFuYSAJOgkxCToJMjE2NzUuMTAKK1Bhc3RhemEgCToJMQk6CTI5MzI1LjAwCitTdWN1bWJpb3MgCToJMQk6CTE4MDA4LjMwCitaYW1vcmEgQ2hpbmNoaXBlIAk6CTEJOgkxMDQ1Ni4zMAorUmVnaW9uIENvc3RhIAk6CTEJOgk2ODMyMy43MAorRWwgT3JvIAk6CTEJOgk1ODE3LjQwCitFc21lcmFsZGFzIAk6CTEJOgkxNTg5NS43MAorR3VheWFzIAk6CTEJOgkyMDU2Ni4wMAorTG9zIFJpb3MgCToJMQk6CTcxNTAuOTAKK01hbmFiaQk6CTEJOgkxODg5My43MAorUmVnaW9uIEluc3VsYXIgCToJMQk6CTgwMTAuMDAKK0dhbGFwYWdvcyAJOgkxCToJODAxMC4wMAorUmVnaW9uIFNpZXJyYSAJOgkxCToJNjM1MTUuOTAKK0F6dWF5IAk6CTEJOgk3OTk0LjcwCitCb2xpdmFyIAk6CTEJOgkzOTI2LjAwCitDYW5hciAJOgkxCToJMzE0MS42MAorQ2FyY2hpIAk6CTEJOgkzNzQ5LjcwCitDaGltYm9yYXpvIAk6CTEJOgk2NDcwLjQwCitDb3RvcGF4aSAJOgkxCToJNTk4NC41MAorSW1iYWJ1cmEgCToJMQk6CTQ2MTQuNjAKK0xvamEgCToJMQk6CTEwOTk0LjkwCitQaWNoaW5jaGEgCToJMQk6CTEzMjcwLjEwCitUdW5ndXJhaHVhIAk6CTEJOgkzMzY5LjQwCitab25hIG5vIERlbGltdGRhCToJMQk6CTc3NS4yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRUNVQURPUl9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9FQ1VBRE9SX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNmYyYWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRUNVQURPUl9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDI4IEBACitFY3VhZG9yCToJMAk6CTEzNTQ3NTEwCitSZWdpb24gIEFtYXpvbmljYSAgIAk6CTEJOgk1NDg0MTkKK01vcm9uYSBTYW50aWFnbyAJOgkxCToJMTE1NDEyCitOYXBvIAk6CTEJOgk3OTEzOQorT3JlbGxhbmEgCToJMQk6CTg2NDkzCitQYXN0YXphIAk6CTEJOgk2MTc3OQorU3VjdW1iaW9zIAk6CTEJOgkxMjg5OTUKK1phbW9yYSBDaGluY2hpcGUgCToJMQk6CTc2NjAxCitSZWdpb24gQ29zdGEgCToJMQk6CTYwNTYyMjMKK0VsIE9ybyAJOgkxCToJNTI1NzYzCitFc21lcmFsZGFzIAk6CTEJOgkzODUyMjMKK0d1YXlhcyAJOgkxCToJMzMwOTAzNAorTG9zIFJpb3MgCToJMQk6CTY1MDE3OAorTWFuYWJpCToJMQk6CTExODYwMjUKK1JlZ2lvbiBJbnN1bGFyIAk6CTEJOgkxODY0MAorR2FsYXBhZ29zIAk6CTEJOgkxODY0MAorUmVnaW9uIFNpZXJyYSAJOgkxCToJNTQ2MDczOAorQXp1YXkgCToJMQk6CTU5OTU0NgorQm9saXZhciAJOgkxCToJMTY5MzcwCitDYW5hciAJOgkxCToJMjA2OTgxCitDYXJjaGkgCToJMQk6CTE1MjkzOQorQ2hpbWJvcmF6byAJOgkxCToJNDAzNjMyCitDb3RvcGF4aSAJOgkxCToJMzQ5NTQwCitJbWJhYnVyYSAJOgkxCToJMzQ0MDQ0CitMb2phIAk6CTEJOgk0MDQ4MzUKK1BpY2hpbmNoYSAJOgkxCToJMjM4ODgxNworVHVuZ3VyYWh1YSAJOgkxCToJNDQxMDM0Citab25hIG5vIERlbGltdGRhCToJMQk6CTcyNTg4CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRUdZUFRfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRUdZUFRfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU5NzkxMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9FR1lQVF9BUkVBLnR4dApAQCAtMCwwICsxLDUgQEAKK0VneXB0CToJMAk6CTEwMDE0NTAKK0Zyb250aWVyIEdvdmVybmF0ZXMJOgkxCToJODUzMDE2CitMb3dlciBFZ3lwdCAJOgkxCToJMjc3MjQKK1VwcGVyIEVneXB0IAk6CTEJOgk5NjE5NAorVXJiYW4gR292ZXJuYXRlcwk6CTEJOgkyMDg2MApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VHWVBUX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VHWVBUX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNzJjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRUdZUFRfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSw1IEBACitFZ3lwdAk6CTAJOgk3ODg4NzAwNworRnJvbnRpZXIgR292ZXJuYXRlcwk6CTEJOgk5NzY4NTgKK0xvd2VyIEVneXB0IAk6CTEJOgkyOTcyOTY1NQorVXBwZXIgRWd5cHQgCToJMQk6CTI1MTMzNTgzCitVcmJhbiBHb3Zlcm5hdGVzCToJMQk6CTEyODExNjkzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRUxTQUxWQURPUl9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9FTFNBTFZBRE9SX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZDZlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRUxTQUxWQURPUl9BUkVBLnR4dApAQCAtMCwwICsxIEBACitFTCBTQUxWQURPUiA6IDAgOiAyMTA0MApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VMU0FMVkFET1JfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRUxTQUxWQURPUl9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjRkMDYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VMU0FMVkFET1JfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSBAQAorRUwgU0FMVkFET1IgOiAwIDogNjk5MDY1NwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VRVUFUT1JJQUwgR1VJTkVBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VRVUFUT1JJQUwgR1VJTkVBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Mzc3M2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRVFVQVRPUklBTCBHVUlORUFfQVJFQS50eHQKQEAgLTAsMCArMSwxNyBAQAorRVFVQVRPUklBTCBHVUlORUE6MDoyODA1MQorQklPS08gU1VSOjE6NTQ4LjU2MAorTElUT1JBTDoxOjI3NTcuODY0CitBTk5PQk9OOjE6Mjc1Ny44NjQKK0NFTlRSTyBTVVI6MTozMjkwLjc0OQorV0VMRU5aQVM6MToyMzQyLjA2MworQklPS08gTk9SVEU6MToyMjUuOTU5CitLSUVOVEVNOjE6MTI5Mi40NDEKK0xJVE9SQUwtMjoyOjEuMDAwMDAwCitBTk5PQk9OOjI6Mjc1Ny44NjQwMDAKK0JJT0tPIFNVUjoyOjU0OC41NjAwMDAKK0JJT0tPIE5PUlRFOjI6MjI1Ljk1OTAwMAorQ0VOVFJPIFNVUjoyOjMyOTAuNzQ5MDAwCitMSVRPUkFMLTM6Mjo2LjIyMTMyMAorV0VMRU5aQVM6MjoyMzQyLjA2MzAwMAorTElUT1JBTC0xOjI6Mjc1MC45NDM5NzAKK0tJRU5URU06MjoxMjkyLjQ0MTAwMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VRVUFUT1JJQUwgR1VJTkVBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VRVUFUT1JJQUwgR1VJTkVBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNjM0MjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRVFVQVRPUklBTCBHVUlORUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxNyBAQAorRVFVQVRPUklBTCBHVUlORUE6MDo0ODA4OTg6MTcuMTQzNzAzCitBTk5PQk9OOjE6OTQ1MjU6MzQuMjc0NzE0CitCSU9LTyBOT1JURToxOjY5OTQ5OjMwOS41NjUwMTAKK0JJT0tPIFNVUjoxOjE1NjY5OjI4LjU2Mzg3NgorQ0VOVFJPIFNVUjoxOjYxMjQ3OjE4LjYxMTg3MgorS0lFTlRFTToxOjgzNDg2OjY0LjU5NTU5OQorTElUT1JBTDoxOjk0NTI1OjM0LjI3NDcxNAorV0VMRU5aQVM6MTo2MTQ5NzoyNi4yNTc2MjAKK0JJT0tPIE5PUlRFOjI6Njk5NDk6MzA5LjU2NTAxMAorQklPS08gU1VSOjI6MTU2Njk6MjguNTYzODc2CitMSVRPUkFMLTE6MjozMTUwODoxMS40NTM2NDQKK0tJRU5URU06Mjo4MzQ4Njo2NC41OTU1OTkKK0NFTlRSTyBTVVI6Mjo2MTI0NzoxOC42MTE4NzIKK1dFTEVOWkFTOjI6NjE0OTc6MjYuMjU3NjIwCitMSVRPUkFMLTI6MjozMTUwODozMTUwOC4zMzMzMzMKK0xJVE9SQUwtMzoyOjMxNTA4OjUwNjQuNTczNjQ5CitBTk5PQk9OOjI6OTQ1MjU6MzQuMjc0NzE0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRVFVQVRPUklBTEdVSU5FQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9FUVVBVE9SSUFMR1VJTkVBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZGFkODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRVFVQVRPUklBTEdVSU5FQV9BUkVBLnR4dApAQCAtMCwwICsxLDE3IEBACitFUVVBVE9SSUFMIEdVSU5FQTowOjI4MDUxCitCSU9LTyBTVVI6MTo1NDguNTYwCitMSVRPUkFMOjE6Mjc1Ny44NjQKK0FOTk9CT046MToyNzU3Ljg2NAorQ0VOVFJPIFNVUjoxOjMyOTAuNzQ5CitXRUxFTlpBUzoxOjIzNDIuMDYzCitCSU9LTyBOT1JURToxOjIyNS45NTkKK0tJRU5URU06MToxMjkyLjQ0MQorTElUT1JBTC0yOjI6MS4wMDAwMDAKK0FOTk9CT046MjoyNzU3Ljg2NDAwMAorQklPS08gU1VSOjI6NTQ4LjU2MDAwMAorQklPS08gTk9SVEU6MjoyMjUuOTU5MDAwCitDRU5UUk8gU1VSOjI6MzI5MC43NDkwMDAKK0xJVE9SQUwtMzoyOjYuMjIxMzIwCitXRUxFTlpBUzoyOjIzNDIuMDYzMDAwCitMSVRPUkFMLTE6MjoyNzUwLjk0Mzk3MAorS0lFTlRFTToyOjEyOTIuNDQxMDAwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VRVUFUT1JJQUxHVUlORUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRVFVQVRPUklBTEdVSU5FQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2E4NjQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VRVUFUT1JJQUxHVUlORUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxNyBAQAorRVFVQVRPUklBTCBHVUlORUE6MDo0ODA4OTg6MTcuMTQzNzAzCitBTk5PQk9OOjE6OTQ1MjU6MzQuMjc0NzE0CitCSU9LTyBOT1JURToxOjY5OTQ5OjMwOS41NjUwMTAKK0JJT0tPIFNVUjoxOjE1NjY5OjI4LjU2Mzg3NgorQ0VOVFJPIFNVUjoxOjYxMjQ3OjE4LjYxMTg3MgorS0lFTlRFTToxOjgzNDg2OjY0LjU5NTU5OQorTElUT1JBTDoxOjk0NTI1OjM0LjI3NDcxNAorV0VMRU5aQVM6MTo2MTQ5NzoyNi4yNTc2MjAKK0JJT0tPIE5PUlRFOjI6Njk5NDk6MzA5LjU2NTAxMAorQklPS08gU1VSOjI6MTU2Njk6MjguNTYzODc2CitMSVRPUkFMLTE6MjozMTUwODoxMS40NTM2NDQKK0tJRU5URU06Mjo4MzQ4Njo2NC41OTU1OTkKK0NFTlRSTyBTVVI6Mjo2MTI0NzoxOC42MTE4NzIKK1dFTEVOWkFTOjI6NjE0OTc6MjYuMjU3NjIwCitMSVRPUkFMLTI6MjozMTUwODozMTUwOC4zMzMzMzMKK0xJVE9SQUwtMzoyOjMxNTA4OjUwNjQuNTczNjQ5CitBTk5PQk9OOjI6OTQ1MjU6MzQuMjc0NzE0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VSSVRSRUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRVJJVFJFQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjQ0ZDhhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VSSVRSRUFfQVJFQS50eHQKQEAgLTAsMCArMSwxNSBAQAorRXJpdHJlYQk6CTAJOgkxMjEzMjAKK1pvYmEgQS1uc2ViYSAgCToJMQk6CTIzMjAwCitab2JhIERlYnViIAk6CTEJOgk4MDAwCitrZXkgYmFoaXIJOgkxCToJMjc2MDAKK1pvYmEgR2FzaCBCYXJrYSAJOgkxCToJMzMyMDAKK1pvYmEgTWFhLWtlbCAJOgkxCToJMTMwMAorWm9iYSBTZW1lLW5hd2kgS2V5aWggQmFocmktIAk6CTEJOgkyNzgwMAorQWtvcmRhdCA6IDEgOiAzMzIwMAorQXNzZWIgOiAxIDogMjc2MDAKK0dhc2ggJiBTZXRpdCA6IDEgOiAyMTQwCitIYW1hc3NpZW4gOiAxIDogMjUwMAorS2VyZW4gOiAxIDogMTUxMAorU2FoZWwgOiAxIDogMzQwMAorU2VyYXllIDoxIDogNTIwNAorQWtlbGUgR3V6YXkgOiAxIDogMjEyNQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VSSVRSRUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRVJJVFJFQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTY1YTg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VSSVRSRUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxNSBAQAorRXJpdHJlYQk6CTAJOgk0Nzg2OTQ0Citab2JhIEEtbnNlYmEgIAk6CTEJOgk1NDkwMDAKK1pvYmEgRGVidWIgCToJMQk6CTk1MjEwMAora2V5IGJhaGlyCToJMQk6CTgzNTAwCitab2JhIEdhc2ggQmFya2EgCToJMQk6CTcwODgwMAorWm9iYSBNYWEta2VsIAk6CTEJOgk2NzU3MDAKK1pvYmEgU2VtZS1uYXdpIEtleWloIEJhaHJpLSAJOgkxCToJNjUzMzAwCitBa29yZGF0IDogMSA6IDI1MDAwCitBc3NlYiA6IDEgOiAyMTMwMAorR2FzaCAmIFNldGl0IDogMSA6IDIzMDk0CitIYW1hc3NpZW4gOiAxIDogMjMzOTIKK0tlcmVuIDogMSA6IDI3MjMKK1NhaGVsIDogMSA6IDI3NDIwCitTZXJheWUgOjEgOiAzNTgwCitBa2VsZSBHdXpheSA6IDEgOiAyODAyNQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VTVE9OSUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRVNUT05JQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTI4YWU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VTVE9OSUFfQVJFQS50eHQKQEAgLTAsMCArMSBAQAorRVNUT05JQSA6IDAgOiA0NTIyNwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VTVE9OSUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRVNUT05JQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTIzNTg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0VTVE9OSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSBAQAorRVNUT05JQSA6IDAgOiAxMzUxMDY5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRVRISU9QSUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRVRISU9QSUFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4OWJiMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9FVEhJT1BJQV9BUkVBLnR4dApAQCAtMCwwICsxIEBACitFVEhJT1BJQSA6IDAgOiAxMTI3MTI3CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRVRISU9QSUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRVRISU9QSUFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1ZDVmNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9FVEhJT1BJQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxIEBACitFVEhJT1BJQSA6IDAgOiA3NTA2NzAwMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0ZBUk9FIElTTEFORFNfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRkFST0UgSVNMQU5EU19BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0ZBUk9FIElTTEFORFNfQVJFQS50eHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9GQVJPRSBJU0xBTkRTX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0ZBUk9FIElTTEFORFNfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9GQVJPRSBJU0xBTkRTX1BPUFVMQVRJT04udHh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRklOTEFORF9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9GSU5MQU5EX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYzIyZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRklOTEFORF9BUkVBLnR4dApAQCAtMCwwICsxLDEyIEBACisgTGFwcGkvTGFwcGxhbmQgOiAxIDogOTg5MzcuMAorIE91bHUvVWxlYWJvcmcgOiAxIDogNjE1ODIuMAorIFZhYXNhL1Zhc2EgOiAxIDogMjczMTkuMAorIEt1b3BpbyA6IDEgOiAxOTk1My4wCisgUG9oam9pcy1LYXJqYWxhL05vcnJhLUthcmVsZW4gOiAxIDogMjE1ODUuMAorIEtlc2tpLVN1b21pL01lbGxlcnN0YS1GaW5sYW5kIDogMSA6IDE5MzU3LjAKKyBNaWtrZWxpL1N0IE1pY2hlbCA6IDEgOiAyMTY2MC4wCisgSIRtZS9UYXZhc3RlaHVzIDogMSA6IDE5MTA0LjAKKyBUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnIDogMSA6IDIzODYzLjAKKyBLeW1pL0t5bW1lbmUgOiAxIDogMTI4MjguMAorIFV1ZGVubWFhL055bGFuZCA6IDEgOiAxMDQwNC4wCisgQWxhbmQvQWh2ZW5hbm1hYSA6IDEgOiAxNTUyLjAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9GSU5MQU5EX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0ZJTkxBTkRfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyZTc0NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9GSU5MQU5EX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMTIgQEAKKyBMYXBwaS9MYXBwbGFuZCA6IDEgOiAyMDAzMjQKKyBPdWx1L1VsZWFib3JnIDogMSA6IDQzODY2MAorIFZhYXNhL1Zhc2EgOiAxIDogNDQ1MTU1CisgS3VvcGlvIDogMSA6IDI1NjU4MQorIFBvaGpvaXMtS2FyamFsYS9Ob3JyYS1LYXJlbGVuIDogMSA6IDE3NjcwMQorIEtlc2tpLVN1b21pL01lbGxlcnN0YS1GaW5sYW5kIDogMSA6IDI1MjAxNgorIE1pa2tlbGkvU3QgTWljaGVsIDogMSA6IDIwODE5MAorIEiEbWUvVGF2YXN0ZWh1cyA6IDEgOiA2ODQ5MjgKKyBUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnIDogMSA6IDcyMjM5OAorIEt5bWkvS3ltbWVuZSA6IDEgOiAzMzUzMTMKKyBVdWRlbm1hYS9OeWxhbmQgOiAxIDogMTI0MTc1MQorIEFsYW5kL0FodmVuYW5tYWEgOiAxIDogMjQ0MTgKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9GUkFOQ0VfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRlJBTkNFX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMWI1MWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvRlJBTkNFX0FSRUEudHh0CkBAIC0wLDAgKzEsMjIgQEAKKyBOT1JEIC0gUEFTLURFLUNBTEFJUyA6IDEgOiAxMjQxNC4wCisgUElDQVJESUUgOiAxIDogMTkzOTkuMAorIENIQU1QQUdORS1BUkRFTk5FIDogMSA6IDI1NjA1LjAKKyBIQVVURS1OT1JNQU5ESUUgOiAxIDogMTIzMTcuMAorIEJBU1NFLU5PUk1BTkRJRSA6IDEgOiAxNzU4OS4wCisgTE9SUkFJTkUgOiAxIDogMjM1NDcuMAorIElMRSBERSBGUkFOQ0UgOiAxIDogNTk5MS4wCisgQUxTQUNFIDogMSA6IDgyODAuMAorIENFTlRSRSA6IDEgOiAzOTE1MC4wCisgQlJFVEFHTkUgOiAxIDogMjcyMDcuMAorIFBBWVMgREUgTEEgTE9JUkUgOiAxIDogMzIwODEuMAorIEJPVVJHT0dORSA6IDEgOiAzMTU4MS4wCisgRlJBTkNIRS1DT01URSA6IDEgOiAxNjIwMi4wCisgUE9JVE9VLUNIQVJFTlRFUyA6IDEgOiAyNTgwOS4wCisgQVVWRVJHTkUgOiAxIDogMjYwMTIuMAorIFJIT05FLUFMUEVTIDogMSA6IDQzNjk4LjAKKyBMSU1PVVNJTiA6IDEgOiAxNjk0Mi4wCisgQVFVSVRBSU5FIDogMSA6IDQxMzA4LjAKKyBQUk9WRU5DRS1BTFBFUy1DT1RFIEQnQVpVUiA6IDEgOiAzMTM5OS4wCisgTUlESS1QWVJFTkVFUyA6IDEgOiA0NTM0Ny4wCisgTEFOR1VFRE9DLVJPVVNTSUxMT04gOiAxIDogMjczNzUuMAorIENPUlNFIDogMSA6IDg2NzkuMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0ZSQU5DRV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9GUkFOQ0VfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1NTEwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9GUkFOQ0VfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwyMiBAQAorIE5PUkQgLSBQQVMtREUtQ0FMQUlTIDogMSA6IDM5NjcwMDAKKyBQSUNBUkRJRSA6IDEgOiAxODA5ODAwCisgQ0hBTVBBR05FLUFSREVOTkUgOiAxIDogMTM0ODYwMAorIEhBVVRFLU5PUk1BTkRJRSA6IDEgOiAxNzM2NTAwCisgQkFTU0UtTk9STUFORElFIDogMSA6IDEzOTE0MDAKKyBMT1JSQUlORSA6IDEgOiAyMzA3NTAwCisgSUxFIERFIEZSQU5DRSA6IDEgOiAxMDY1MTQwMAorIEFMU0FDRSA6IDEgOiAxNjIzODAwCisgQ0VOVFJFIDogMSA6IDIzNzAyMDAKKyBCUkVUQUdORSA6IDEgOiAyNzk1MzAwCisgUEFZUyBERSBMQSBMT0lSRSA6IDEgOiAzMDU4MTAwCisgQk9VUkdPR05FIDogMSA6IDE2MTA0MDAKKyBGUkFOQ0hFLUNPTVRFIDogMSA6IDEwOTc4MDAKKyBQT0lUT1UtQ0hBUkVOVEVTIDogMSA6IDE1OTU2MDAKKyBBVVZFUkdORSA6IDEgOiAxMzIyNTAwCisgUkhPTkUtQUxQRVMgOiAxIDogNTM0NjgwMAorIExJTU9VU0lOIDogMSA6IDcyMzgwMAorIEFRVUlUQUlORSA6IDEgOiAyNzk0NjAwCisgUFJPVkVOQ0UtQUxQRVMtQ09URSBEJ0FaVVIgOiAxIDogNDI1NDQwMAorIE1JREktUFlSRU5FRVMgOiAxIDogMjQzMDAwMAorIExBTkdVRURPQy1ST1VTU0lMTE9OIDogMSA6IDIxMTIyMDAKKyBDT1JTRSA6IDEgOiAyNDk3MDAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HQUJPTl9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HQUJPTl9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjI0ZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dBQk9OX0FSRUEudHh0CkBAIC0wLDAgKzEsMTQgQEAKK0dhYm9uCToJMAk6CTI2NzY2NworRXN0dWFpcmUgW1dlc3Rlcm4yXSAJOgkxCToJMjA3NDAKK0hhdXQtT2dvb3VlIAk6CTEJOgkzNjU0NworTW95ZW4gT2dvb3VlIAk6CTEJOgkxODUzNQorTmdvdW5pZSBbQ2VudHJhbDFdCToJMQk6CTM3NzUwCitOeWFuZ2EgCToJMQk6CTIxMjg1CitPZ29vdWUtSXZpbmRvIFtFYXN0ZXJuM10JOgkxCToJNDYwNzUKK09nb291ZS1Mb2xvIAk6CTEJOgkyNTM4MAorT2dvb3VlLU1hcml0aW1lIAk6CTEJOgkyMjg5MAorV291bGV1LU50ZW0gCToJMQk6CTM4NDY1CisKKworCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HQUJPTl9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HQUJPTl9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDQwZDg1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dBQk9OX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMTAgQEAKK0dhYm9uCToJMAk6CTE0MjQ5MDYKK0VzdHVhaXJlIFtXZXN0ZXJuMl0gCToJMQk6CTQ2MzE4NworSGF1dC1PZ29vdWUgCToJMQk6CTEwNDMwMQorTW95ZW4gT2dvb3VlIAk6CTEJOgk0MjMxNgorTmdvdW5pZSBbQ2VudHJhbDFdCToJMQk6CTc3NzgxCitOeWFuZ2EgCToJMQk6CTM5NDMwCitPZ29vdWUtSXZpbmRvIFtFYXN0ZXJuM10gCToJMQk6CTQ4ODYyCitPZ29vdWUtTG9sbyAJOgkxCToJNDM5MTUKK09nb291ZS1NYXJpdGltZSAJOgkxCToJOTc5MTMKK1dvdWxldS1OdGVtIAk6CTEJOgk5NzI3MQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HQU1CSUEgVEhFX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dBTUJJQSBUSEVfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllZDVhMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HQU1CSUEgVEhFX0FSRUEudHh0CkBAIC0wLDAgKzEsNTAgQEAKK0dhbWJpYQk6CTAJOgkxMTMwMAorQmFuanVsCToJMQk6CTEyCisgQmFuanVsIFNvdXRoIAk6CTEJOgkxCisgQmFuanVsIENlbnRyYWwgCToJMQk6CTEKKyBCYW5qdWwgTm9ydGggCToJMQk6CTEKK1VwcGVyIFJpdmVyCToJMQk6CTIwNjkKKyBGdWxsYWR1IEVhc3QgCToJMQk6CTEKKyBLYW50b3JhIAk6CTEJOgkxCisgV3VsaSAJOgkxCToJMQorIFNhbmR1IAk6CTEJOgkxCitXZXN0ZXJuCToJMQk6CTE3NjQKKyBLb21ibyBOb3J0aCAJOgkxCToJMQorIEtvbWJvIFNvdXRoIAk6CTEJOgkxCisgS29tYm8gQ2VudHJhbCAJOgkxCToJMQorIEtvbWJvIEVhc3QgCToJMQk6CTEKKyBGb25pIEJyZWZldCAJOgkxCToJMQorIEZvbmkgQmludGFuZyBLYXJhbmFpIAk6CTEJOgkxCisgRm9uaSBLYW5zYWxhIAk6CTEJOgkxCisgRm9uaSBCb25kYWxpIAk6CTEJOgkxCisgRm9uaSBKYXJyb2wgCToJMQk6CTEKK0dlb3JnZXRvd24JOgkxCToJMjg5NAorIE5pYW1pbmEgRGFua3Vua3UgCToJMQk6CTEKKyBOaWFtaW5hIFdlc3QgCToJMQk6CTEKKyBOaWFtaW5hIEVhc3QgCToJMQk6CTEKKyBGdWxsYWR1IFdlc3QgCToJMQk6CTEKK01hY2NhcnRoeSBpc2xhbmQJOgkxCToJMQorS2FuaWZpbmcgTEdBIAk6CTEJOgk3NgorIEsuVS5ELkMuIAk6CTEJOgkxCitOb3J0aCBCYW5rCToJMQk6CTIyNTYKKyBMb3dlciBOdWltaSAJOgkxCToJMQorIFVwcGVyIE51aW1pIAk6CTEJOgkxCisgSm9rYWR1IAk6CTEJOgkxCisgTG93ZXIgQmFkZGlidSAJOgkxCToJMQorIENlbnRyYWwgQmFkZGlidSAJOgkxCToJMQorIFVwcGVyIEJhZGRpYnUgCToJMQk6CTEKK0t1bnRhdXIJOgkxCToJMQorIExvd2VyIFNhbG91bSAJOgkxCToJMQorIFVwcGVyIFNhbG91bSAJOgkxCToJMQorIE5pYW5pamEgCToJMQk6CTEKKyBOaWFuaSAJOgkxCToJMQorIFNhbWkgCToJMQk6CTEKK0xvd2VyIFJpdmVyCToJMQk6CTE2MTgKKyBLaWFuZyBXZXN0IAk6CTEJOgkxCisgS2lhbmcgQ2VudHJhbCAJOgkxCToJMQorIEtpYW5nIEVhc3QgCToJMQk6CTEKKyBKYXJyYSBXZXN0IAk6CTEJOgkxCisgSmFycmEgQ2VudHJhbCAJOgkxCToJMQorIEphcnJhIEVhc3QgCToJMQk6CTEKKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR0FNQklBIFRIRV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HQU1CSUEgVEhFX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzY2IwOGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR0FNQklBIFRIRV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDQ4IEBACitHYW1iaWEJOgkwCToJMTY0MTU2NAorQmFuanVsCToJMQk6CTM0ODI4CitEaXN0cmljdCBvZiBCYW5qdWwgU291dGggCToJMQk6CTg1MDcKK0Rpc3RyaWN0IG9mIEJhbmp1bCBDZW50cmFsIAk6CTEJOgk4ODIyCitEaXN0cmljdCBvZiBCYW5qdWwgTm9ydGggCToJMQk6CTE3NDk5CitVcHBlciBSaXZlcgk6CTEJOgkxODMwMzMKK0RzdHJjdCBvZiBGdWxsYWR1IEVhc3QgCToJMQk6CTk4NDU0CitEc3RyY3Qgb2YgS2FudG9yYSAJOgkxCToJMzA0MDIKK0RzdHJjdCBvZiBXdWwgCToJMQk6CTM1ODU2CitEc3RyY3Qgb2YgU2FuZHUgCToJMQk6CTE4MzIxCitXZXN0ZXJuCToJMQk6CTM5Mjk4NworRHN0cmN0IG9mIEtvbWJvIE5vcnRoIAk6CTEJOgkxNjYzNTEKK0RzdHJjdCBvZiBLb21ibyBTb3V0aCAJOgkxCToJNjI1MzEKK0RzdHJjdCBvZiBLb21ibyBDZW50cmFsIAk6CTEJOgk4NDMxNQorRHN0cmN0IG9mIEtvbWJvIEVhc3QgCToJMQk6CTI4MTQ2CitEc3RyY3Qgb2YgRm9uIEJyZWZldCAJOgkxCToJMTE0MTEKK0RzdHJjdCBvZiBGb24gQm50YW5nIEthcmFuYSAJOgkxCToJMTU5OTQKK0RzdHJjdCBvZiBGb24gS2Fuc2FsYSAJOgkxCToJMTIyNDcKK0RzdHJjdCBvZiBGb24gQm9uZGFsIAk6CTEJOgk2MDQ5CitEc3RyY3Qgb2YgRm9uIEphcnJvbCAJOgkxCToJNTk0MworR2VvcmdldG93bgk6CTEJOgkxMDY3OTkKK0RzdHJjdCBvZiBOYW1uYSBEYW5rdW5rdSAJOgkxCToJNjAwMAorRHN0cmN0IG9mIE5hbW5hIFdlc3QgCToJMQk6CTY2MzAKK0RzdHJjdCBvZiBOYW1uYSBFYXN0IAk6CTEJOgkxOTAzNAorRHN0cmN0IG9mIEZ1bGxhZHUgV2VzdCAJOgkxCToJNzE2NjkKK01hY2NhcnRoeSBpc2xhbmQJOgkxCToJMzQ2NgorS2FuZm5nIExHQSAJOgkxCToJMzIyNDEwCitEc3RyY3Qgb2YgSy5VLkQuQy4gCToJMQk6CTMyMjQxMAorTm9ydGggQmFuawk6CTEJOgkxNzI4MDYKK0RzdHJjdCBvZiBMb3dlciBOdW0gCToJMQk6CTQ0NDkxCitEc3RyY3Qgb2YgVXBwZXIgTnVtIAk6CTEJOgkyNDk0MAorRHN0cmN0IG9mIEpva2FkdSAJOgkxCToJMTc4NTAKK0RzdHJjdCBvZiBMb3dlciBCYWRkYnUgCToJMQk6CTE1MTU3CitEc3RyY3Qgb2YgQ2VudHJhbCBCYWRkYnUgCToJMQk6CTE0OTk4CitEc3RyY3Qgb2YgVXBwZXIgQmFkZGJ1IAk6CTEJOgk1NTM3MAorS3VudGF1cgk6CTEJOgk3OTA5OAorRHN0cmN0IG9mIExvd2VyIFNhbG91bSAJOgkxCToJMTM1MjQKK0RzdHJjdCBvZiBVcHBlciBTYWxvdW0gCToJMQk6CTE1OTcwCitEc3RyY3Qgb2YgTmFuamEgCToJMQk6CTgyMDUKK0RzdHJjdCBvZiBOYW4gCToJMQk6CTIyMjQyCitEc3RyY3Qgb2YgU2FtIAk6CTEJOgkxOTE1NworTG93ZXIgUml2ZXIJOgkxCToJNzI1NDYKK0RzdHJjdCBvZiBLYW5nIFdlc3QgCToJMQk6CTE0NzExCitEc3RyY3Qgb2YgS2FuZyBDZW50cmFsIAk6CTEJOgk3ODg2CitEc3RyY3Qgb2YgS2FuZyBFYXN0IAk6CTEJOgk2NTM0CitEc3RyY3Qgb2YgSmFycmEgV2VzdCAJOgkxCToJMjQ0MTYKK0RzdHJjdCBvZiBKYXJyYSBDZW50cmFsIAk6CTEJOgk2NDk0CitEc3RyY3Qgb2YgSmFycmEgRWFzdCAJOgkxCToJMTI1MDUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HQU1CSUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR0FNQklBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzViYmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR0FNQklBX0FSRUEudHh0CkBAIC0wLDAgKzEsNTAgQEAKK0dhbWJpYQk6CTAJOgkxMTMwMAorQmFuanVsCToJMQk6CTEyCisgQmFuanVsIFNvdXRoIAk6CTEJOgkxCisgQmFuanVsIENlbnRyYWwgCToJMQk6CTEKKyBCYW5qdWwgTm9ydGggCToJMQk6CTEKK1VwcGVyIFJpdmVyCToJMQk6CTIwNjkKKyBGdWxsYWR1IEVhc3QgCToJMQk6CTEKKyBLYW50b3JhIAk6CTEJOgkxCisgV3VsaSAJOgkxCToJMQorIFNhbmR1IAk6CTEJOgkxCitXZXN0ZXJuMQk6CTEJOgkxNzY0CisgS29tYm8gTm9ydGggCToJMQk6CTEKKyBLb21ibyBTb3V0aCAJOgkxCToJMQorIEtvbWJvIENlbnRyYWwgCToJMQk6CTEKKyBLb21ibyBFYXN0IAk6CTEJOgkxCisgRm9uaSBCcmVmZXQgCToJMQk6CTEKKyBGb25pIEJpbnRhbmcgS2FyYW5haSAJOgkxCToJMQorIEZvbmkgS2Fuc2FsYSAJOgkxCToJMQorIEZvbmkgQm9uZGFsaSAJOgkxCToJMQorIEZvbmkgSmFycm9sIAk6CTEJOgkxCitHZW9yZ2V0b3duCToJMQk6CTI4OTQKKyBOaWFtaW5hIERhbmt1bmt1IAk6CTEJOgkxCisgTmlhbWluYSBXZXN0IAk6CTEJOgkxCisgTmlhbWluYSBFYXN0IAk6CTEJOgkxCisgRnVsbGFkdSBXZXN0IAk6CTEJOgkxCitNYWNjYXJ0aHkgaXNsYW5kCToJMQk6CTEKK0thbmlmaW5nIExHQSAJOgkxCToJNzYKKyBLLlUuRC5DLiAJOgkxCToJMQorTm9ydGggQmFuawk6CTEJOgkyMjU2CisgTG93ZXIgTnVpbWkgCToJMQk6CTEKKyBVcHBlciBOdWltaSAJOgkxCToJMQorIEpva2FkdSAJOgkxCToJMQorIExvd2VyIEJhZGRpYnUgCToJMQk6CTEKKyBDZW50cmFsIEJhZGRpYnUgCToJMQk6CTEKKyBVcHBlciBCYWRkaWJ1IAk6CTEJOgkxCitLdW50YXVyCToJMQk6CTEKKyBMb3dlciBTYWxvdW0gCToJMQk6CTEKKyBVcHBlciBTYWxvdW0gCToJMQk6CTEKKyBOaWFuaWphIAk6CTEJOgkxCisgTmlhbmkgCToJMQk6CTEKKyBTYW1pIAk6CTEJOgkxCitMb3dlciBSaXZlcgk6CTEJOgkxNjE4CisgS2lhbmcgV2VzdCAJOgkxCToJMQorIEtpYW5nIENlbnRyYWwgCToJMQk6CTEKKyBLaWFuZyBFYXN0IAk6CTEJOgkxCisgSmFycmEgV2VzdCAJOgkxCToJMQorIEphcnJhIENlbnRyYWwgCToJMQk6CTEKKyBKYXJyYSBFYXN0IAk6CTEJOgkxCisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dBTUJJQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HQU1CSUFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUyZDdkYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HQU1CSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSw0OCBAQAorR2FtYmlhCToJMAk6CTE2NDE1NjQKK0Jhbmp1bAk6CTEJOgkzNDgyOAorRGlzdHJpY3Qgb2YgQmFuanVsIFNvdXRoIAk6CTEJOgk4NTA3CitEaXN0cmljdCBvZiBCYW5qdWwgQ2VudHJhbCAJOgkxCToJODgyMgorRGlzdHJpY3Qgb2YgQmFuanVsIE5vcnRoIAk6CTEJOgkxNzQ5OQorVXBwZXIgUml2ZXIJOgkxCToJMTgzMDMzCitEc3RyY3Qgb2YgRnVsbGFkdSBFYXN0IAk6CTEJOgk5ODQ1NAorRHN0cmN0IG9mIEthbnRvcmEgCToJMQk6CTMwNDAyCitEc3RyY3Qgb2YgV3VsIAk6CTEJOgkzNTg1NgorRHN0cmN0IG9mIFNhbmR1IAk6CTEJOgkxODMyMQorV2VzdGVybgk6CTEJOgkzOTI5ODcKK0RzdHJjdCBvZiBLb21ibyBOb3J0aCAJOgkxCToJMTY2MzUxCitEc3RyY3Qgb2YgS29tYm8gU291dGggCToJMQk6CTYyNTMxCitEc3RyY3Qgb2YgS29tYm8gQ2VudHJhbCAJOgkxCToJODQzMTUKK0RzdHJjdCBvZiBLb21ibyBFYXN0IAk6CTEJOgkyODE0NgorRHN0cmN0IG9mIEZvbiBCcmVmZXQgCToJMQk6CTExNDExCitEc3RyY3Qgb2YgRm9uIEJudGFuZyBLYXJhbmEgCToJMQk6CTE1OTk0CitEc3RyY3Qgb2YgRm9uIEthbnNhbGEgCToJMQk6CTEyMjQ3CitEc3RyY3Qgb2YgRm9uIEJvbmRhbCAJOgkxCToJNjA0OQorRHN0cmN0IG9mIEZvbiBKYXJyb2wgCToJMQk6CTU5NDMKK0dlb3JnZXRvd24JOgkxCToJMTA2Nzk5CitEc3RyY3Qgb2YgTmFtbmEgRGFua3Vua3UgCToJMQk6CTYwMDAKK0RzdHJjdCBvZiBOYW1uYSBXZXN0IAk6CTEJOgk2NjMwCitEc3RyY3Qgb2YgTmFtbmEgRWFzdCAJOgkxCToJMTkwMzQKK0RzdHJjdCBvZiBGdWxsYWR1IFdlc3QgCToJMQk6CTcxNjY5CitNYWNjYXJ0aHkgSXNsYW5kCToJMQk6CTM0NjYKK0thbmZuZyBMR0EgCToJMQk6CTMyMjQxMAorRHN0cmN0IG9mIEsuVS5ELkMuIAk6CTEJOgkzMjI0MTAKK05vcnRoIEJhbmsJOgkxCToJMTcyODA2CitEc3RyY3Qgb2YgTG93ZXIgTnVtIAk6CTEJOgk0NDQ5MQorRHN0cmN0IG9mIFVwcGVyIE51bSAJOgkxCToJMjQ5NDAKK0RzdHJjdCBvZiBKb2thZHUgCToJMQk6CTE3ODUwCitEc3RyY3Qgb2YgTG93ZXIgQmFkZGJ1IAk6CTEJOgkxNTE1NworRHN0cmN0IG9mIENlbnRyYWwgQmFkZGJ1IAk6CTEJOgkxNDk5OAorRHN0cmN0IG9mIFVwcGVyIEJhZGRidSAJOgkxCToJNTUzNzAKK0t1bnRhdXIJOgkxCToJNzkwOTgKK0RzdHJjdCBvZiBMb3dlciBTYWxvdW0gCToJMQk6CTEzNTI0CitEc3RyY3Qgb2YgVXBwZXIgU2Fsb3VtIAk6CTEJOgkxNTk3MAorRHN0cmN0IG9mIE5hbmphIAk6CTEJOgk4MjA1CitEc3RyY3Qgb2YgTmFuIAk6CTEJOgkyMjI0MgorRHN0cmN0IG9mIFNhbSAJOgkxCToJMTkxNTcKK0xvd2VyIFJpdmVyCToJMQk6CTcyNTQ2CitEc3RyY3Qgb2YgS2FuZyBXZXN0IAk6CTEJOgkxNDcxMQorRHN0cmN0IG9mIEthbmcgQ2VudHJhbCAJOgkxCToJNzg4NgorRHN0cmN0IG9mIEthbmcgRWFzdCAJOgkxCToJNjUzNAorRHN0cmN0IG9mIEphcnJhIFdlc3QgCToJMQk6CTI0NDE2CitEc3RyY3Qgb2YgSmFycmEgQ2VudHJhbCAJOgkxCToJNjQ5NAorRHN0cmN0IG9mIEphcnJhIEVhc3QgCToJMQk6CTEyNTA1CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR0VSTUFOWV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HRVJNQU5ZX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MTE0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR0VSTUFOWV9BUkVBLnR4dApAQCAtMCwwICsxLDQxIEBACisgR0VSTUFOWSA6IDAgOiAzNTcwNTAuMAorIFNDSExFU1dJRy1IT0xTVEVJTiA6IDEgOiAxNTcyMS4wCisgQ0hFTU5JVFogOiAxIDogMS4wCisgTUVDS0xFTkJVUkctVk9SUE9NTUVSTiA6IDEgOiAxLjAKKyBXRVNFUi1FTVMgOiAxIDogMTQ5NjQuMAorIExVRU5FQlVSRyA6IDEgOiAxNTM0Ni4wCisgSEFNQlVSRyA6IDEgOiA3NTQuMAorIEJSQU5ERU5CVVJHIDogMSA6IDEuMAorIEJSRU1FTiA6IDEgOiA0MDQuMAorIEhBTk5PVkVSIDogMSA6IDkwNDMuMAorIE1BR0RFQlVSRyA6IDEgOiAxLjAKKyBCUkFVTlNDSFdFSUcgOiAxIDogODA5My4wCisgQkVSTElOIDogMSA6IDEuMAorIERFVE1PTEQgOiAxIDogNjUxNC4wCisgTVVFTlNURVIgOiAxIDogNjg5Ny4wCisgREVTU0FVIDogMSA6IDEuMAorIEhBTExFIDogMSA6IDEuMAorIERVRVNTRUxET1JGIDogMSA6IDUyODcuMAorIEFSTlNCRVJHIDogMSA6IDc5OTguMAorIExFSVBaSUcgOiAxIDogMS4wCisgS0FTU0VMIDogMSA6IDgyODguMAorIFRIVVJJTkdFTiA6IDEgOiAxLjAKKyBEUkVTREVOIDogMSA6IDEuMAorIEtPRUxOIDogMSA6IDczNjMuMAorIEdJRVNTRU4gOiAxIDogNTM4MC4wCisgS09CTEVOWiA6IDEgOiA4MDkyLjAKKyBVTlRFUkZSQU5LRU4gOiAxIDogODUzMS4wCisgT0JFUkZSQU5LRU4gOiAxIDogNzIzMS4wCisgREFSTVNUQURUIDogMSA6IDc0NDUuMAorIFRSSUVSIDogMSA6IDQ5MjUuMAorIFJIRUlOSEVTU0VOLVBGQUxaIDogMSA6IDY4MjkuMAorIE9CRVJQRkFMWiA6IDEgOiA5NjkxLjAKKyBTVFVUVEdBUlQgOiAxIDogMTA1NTcuMAorIE1JVFRFTEZSQU5LRU4gOiAxIDogNzI0NC4wCisgS0FSTFNSVUhFIDogMSA6IDY5MTkuMAorIFNBQVJMQU5EIDogMSA6IDI1NzEuMAorIE5JRURFUkJBWUVSTiA6IDEgOiAxMDMzMS4wCisgT0JFUkJBWUVSTiA6IDEgOiAxNzUyOC4wCisgU0NIV0FCRU4gOiAxIDogOTk5My4wCisgRlJFSUJVUkcgOiAxIDogOTM1Ni4wCisgVFVFQklOR0VOIDogMSA6IDg5MTcuMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dFUk1BTllfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR0VSTUFOWV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmEyNTMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dFUk1BTllfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSw0MCBAQAorIFNDSExFU1dJRy1IT0xTVEVJTiA6IDEgOiAyNTk0NjAwCisgQ0hFTU5JVFogOiAxIDogMjQ2MTEwCisgTUVDS0xFTkJVUkctVk9SUE9NTUVSTiA6IDEgOiAxNzAwMDA0CisgV0VTRVItRU1TIDogMSA6IDIxNjk4MDAKKyBMVUVORUJVUkcgOiAxIDogMTQ2NzQwMAorIEhBTUJVUkcgOiAxIDogMTYyNjIwMAorIEJSQU5ERU5CVVJHIDogMSA6IDc0MTI5CisgQlJFTUVOIDogMSA6IDY3MzcwMAorIEhBTk5PVkVSIDogMSA6IDIwMzI0MDAKKyBNQUdERUJVUkcgOiAxIDogMjI4NTE1CisgQlJBVU5TQ0hXRUlHIDogMSA6IDE2MTQyMDAKKyBCRVJMSU4gOiAxIDogMjEzMDUwMAorIERFVE1PTEQgOiAxIDogMTg0OTcwMAorIE1VRU5TVEVSIDogMSA6IDI0Mzc4MDAKKyBERVNTQVUgOiAxIDogNzg5NTMKKyBIQUxMRSA6IDEgOiAyNDMwNDUKKyBEVUVTU0VMRE9SRiA6IDEgOiA1MTY3NzAwCisgQVJOU0JFUkcgOiAxIDogMzY4NTIwMAorIExFSVBaSUcgOiAxIDogNTAyMDAwCisgS0FTU0VMIDogMSA6IDExODc3MDAKKyBUSFVSSU5HRU4gOiAxIDogMjQwMDAwMAorIERSRVNERU4gOiAxIDogNTAwMDY4CisgS09FTE4gOiAxIDogMzk2MzEwMAorIEdJRVNTRU4gOiAxIDogOTgxNTAwCisgS09CTEVOWiA6IDEgOiAxMzc3MDAwCisgVU5URVJGUkFOS0VOIDogMSA6IDEyMzQ5MDAKKyBPQkVSRlJBTktFTiA6IDEgOiAxMDU1ODAwCisgREFSTVNUQURUIDogMSA6IDM0OTE0MDAKKyBUUklFUiA6IDEgOiA0NzgwMDAKKyBSSEVJTkhFU1NFTi1QRkFMWiA6IDEgOiAxODQ2NzAwCisgT0JFUlBGQUxaIDogMSA6IDk5MTMwMAorIFNUVVRUR0FSVCA6IDEgOiAzNjEwMDAwCisgTUlUVEVMRlJBTktFTiA6IDEgOiAxNTY2MTAwCisgS0FSTFNSVUhFIDogMSA6IDI0ODQwMDAKKyBTQUFSTEFORCA6IDEgOiAxMDY0OTAwCisgTklFREVSQkFZRVJOIDogMSA6IDEwNTc0MDAKKyBPQkVSQkFZRVJOIDogMSA6IDM3MjEzMDAKKyBTQ0hXQUJFTiA6IDEgOiAxNTkzOTAwCisgRlJFSUJVUkcgOiAxIDogMTkzNDgwMAorIFRVRUJJTkdFTiA6IDEgOiAxNTg5OTAwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR0hBTkFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR0hBTkFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkZDlhMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HSEFOQV9BUkVBLnR4dApAQCAtMCwwICsxLDEyIEBACitHaGFuYSAJOgkwCQk6CTIzOTQ2MAorQXNoYW50aSAgCToJMQkJOgkyNDM4OQorQnJvbmcgQWhhZm8gCToJMQkJOgkzOTU1NworQ2VudHJhbAk6CTEJCToJOTgyNgorRWFzdGVybiAJOgkxCQk6CTE5MzIzCitHcmVhdGVyIEFjY3JhIAk6CTEJCToJMzI0NQorTm9ydGhlcm4gCToJMQkJOgk3MDM4NAorVXBwZXIgRWFzdCAJOgkxCQk6CTg4NDIKK1VwcGVyIFdlc3QgCToJMQkJOgkxODQ3NgorVm9sdGEgCToJMQkJOgkyMDU3MAorV2VzdGVybiAJOgkxCQk6CTIzOTIxCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HSEFOQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HSEFOQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWQ2MjMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dIQU5BX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMTIgQEAKK0doYW5hIAk6CTAJCToJMjIsNDA5LDU3MgorQXNoYW50aSAgCToJMQkJOgkzNjEyOTUwCitCcm9uZyBBaGFmbyAJOgkxCQk6CTE4MTU0MDgKK0NlbnRyYWwgCToJMQkJOgkxNTkzODIzCitFYXN0ZXJuIAk6CTEJCToJMjEwNjY5NgorR3JlYXRlciBBY2NyYSAJOgkxCQk6CTI5MDU3MjYKK05vcnRoZXJuIAk6CTEJCToJMTgyMDgwNgorVXBwZXIgRWFzdCAJOgkxCQk6CTkyMDA4OQorVXBwZXIgV2VzdCAJOgkxCQk6CTU2NzU4MworVm9sdGEgCToJMQkJOgkxNjM1NDIxCitXZXN0ZXJuIAk6CTEJCToJMTkyNDU3NworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR0lCUkFMVEFSX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dJQlJBTFRBUl9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDQ0MTI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dJQlJBTFRBUl9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxIEBACitHSUJSQUxUQVI6MDoyODc0MzoxMTQ5NwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dSRUVDRV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HUkVFQ0VfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwMzY2NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HUkVFQ0VfQVJFQS50eHQKQEAgLTAsMCArMSwxMyBAQAorIEFOQVRPTElLSSBNQUtFRE9OSUEgOiAxIDogMTQxNTUuMAorIEtFTlRSSUtJIE1BS0VET05JQSA6IDEgOiAxOTE0OS4wCisgRFlUSUtJIE1BS0VET05JQSA6IDEgOiA5NDUxLjAKKyBJUEVJUk9TIDogMSA6IDkyMDMuMAorIFRIRVNTQUxJQSA6IDEgOiAxMzkyOS4wCisgVk9SRUlPIEFJR0FJTyA6IDEgOiAzODM2LjAKKyBJT05JQSBOSVNJQSA6IDEgOiAyMzA3LjAKKyBTVEVSRUEgRUxMQURBIDogMSA6IDE1NjUzLjAKKyBEWVRJS0kgRUxMQURBIDogMSA6IDExMzM3LjAKKyBBVFRJS0kgOiAxIDogMzgwOC4wCisgUEVMT1BPTk5JU09TIDogMSA6IDE1NTQ5LjAKKyBOT1RJTyBBSUdBSU8gOiAxIDogNTI3Ny4wCisgS1JJVEkgOiAxIDogODMzNi4wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR1JFRUNFX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dSRUVDRV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDRlODE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dSRUVDRV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDEzIEBACisgQU5BVE9MSUtJIE1BS0VET05JQSA6IDEgOiA1NzAzMDAKKyBLRU5UUklLSSBNQUtFRE9OSUEgOiAxIDogMTczNzYwMAorIERZVElLSSBNQUtFRE9OSUEgOiAxIDogMjkyODAwCisgSVBFSVJPUyA6IDEgOiAzMzkyMDAKKyBUSEVTU0FMSUEgOiAxIDogNzMxMjAwCisgVk9SRUlPIEFJR0FJTyA6IDEgOiAxOTgyMDAKKyBJT05JQSBOSVNJQSA6IDEgOiAxOTEwMDAKKyBTVEVSRUEgRUxMQURBIDogMSA6IDU3ODkwMAorIERZVElLSSBFTExBREEgOiAxIDogNzAyMDAwCisgQVRUSUtJIDogMSA6IDM4MDYwMDAKKyBQRUxPUE9OTklTT1MgOiAxIDogNjA1NzAwCisgTk9USU8gQUlHQUlPIDogMSA6IDI1NzUwMAorIEtSSVRJIDogMSA6IDUzNzAwMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dVQVRFTUFMQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HVUFURU1BTEFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyYTU4NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HVUFURU1BTEFfQVJFQS50eHQKQEAgLTAsMCArMSBAQAorR1VBVEVNQUxBIDogMCA6IDEwODg4OQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dVQVRFTUFMQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HVUFURU1BTEFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjMDViYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HVUFURU1BTEFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSBAQAorR1VBVEVNQUxBIDogMCA6IDExMjM3MTk2CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR1VJTkVBIEJJU1NBVV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HVUlORUEgQklTU0FVX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMTJmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR1VJTkVBIEJJU1NBVV9BUkVBLnR4dApAQCAtMCwwICsxLDc1IEBACitHVUlORUEgQklTU0FVCToJMAk6CTEyOTg2LjYyNQorQkFGQVRBCToJMQk6CTIzMjMuMzYKK09JTwk6CTEJOgkyMDkzLjAwOQorQ0FDSEVVCToJMQk6CTE5MzEuMjI0CitCSVNTQVUJOgkxCToJNTYuOTY0CitUT01CQUxJCToJMQk6CTEyNTMuMDUyCitCT0xBTUEJOgkxCToJNjA3LjMyMworR0FCVQk6CTEJOgkzNDg0LjQ3NQorQklPTUJPCToJMQk6CTI0OS40NzYKK1FVSU5BUkEJOgkxCToJOTg3Ljc0MgorQ09OVFVCT0VMCToJMQk6CTUzMC4wNzM4NgorQ0FSQVZFTEEgKFVOTykJOgkxCToJMTYuNzc1NTk4CitTT05BQ08JOgkxCToJMzA2Ljc2MTU4MworTUFOU0FCQQk6CTEJOgk0NjguMTM1NjkxCitDQVJBVkVMQSAoVU5PKQk6CTEJOgk1My45ODQ0MTkKK0NBUkFWRUxBIChVTk8pCToJMQk6CTE5LjI0NTM5NAorRlVMQUNVTkRBCToJMQk6CTI2Ny42NTY2MDIKK1BJUkFEQQk6CTEJOgkzODEuODE1MTM1CitUSVRFCToJMQk6CTIyMS42MzU0NDcKK0dBTE9NQVJPCToJMQk6CTM0MC45ODM3NTYKK0JBRkFUQQk6CTEJOgkyNDEuNzc5OTI1CitCVUJBUVVFCToJMQk6CTQyLjYzOTAzOQorQlVCQVFVRQk6CTEJOgk0NS4yMjM0MTkKK05IQUNSQQk6CTEJOgkyNTUuMDE3MjY4CitGQVJJTQk6CTEJOgk2MDYuMjAyMTUxCitDQVRJTwk6CTEJOgkzMTkuMjExNjg1CitCT0xBTUEJOgkxCToJMzkuNjc3NzUzCitHQUJVCToJMQk6CTEwODAuOTY5MDc1CitUSVRFCToJMQk6CTMuNzg3NjQ0CitQUkFCSVMJOgkxCToJNDguODY4MzUyCitRVUlOSEFNRUwJOgkxCToJMTQ1LjUxNTcwNQorQlVCQVFVRQk6CTEJOgkyOC4wMDU3NzEKK0JFREFOREEJOgkxCToJMTguNzQ0ODg1CitQSUNIRQk6CTEJOgk3NTEuMDAzMTc4CitCVUJBUVVFCToJMQk6CTQuMzcxOTgzCitDQUlPCToJMQk6CTQyLjUxNjA5CitHQU1BTVVORE8JOgkxCToJNDA0LjUyOTI5MgorQ0FJTwk6CTEJOgkyLjUxODEwOAorQk9FCToJMQk6CTk2My45MjYwMjgKK0NBUkFWRUxBIChVTk8pCToJMQk6CTEuNDgzNDUzCitCVUJBCToJMQk6CTI3MS4xMTg5MDIKK0NBTkdIVU5HTwk6CTEJOgkyNjAuMDYwOTI1CitCVUJBUVVFCToJMQk6CTIuMzA2MjgKK0JVTEEJOgkxCToJMjYyLjc0OTU0NgorQklTU0FVCToJMQk6CTU2LjQxNDU1NworQlVCQVFVRQk6CTEJOgk1LjgwMTQzOAorQ0FSQVZFTEEgKFVOTykJOgkxCToJMi4zMjM3MDQKK0JVQkFRVUUJOgkxCToJMTEuNDIyNjY0CitDQU5HSFVOR08JOgkxCToJMS44MTQ0MzMKK1NBRklNCToJMQk6CTU0LjM4Nzg1MworQ0FSQVZFTEEgKFVOTykJOgkxCToJMS4zNTA4NjQKK0NBUkFWRUxBIChVTk8pCToJMQk6CTYuMTA2NTE3CitCRURBTkRBCToJMQk6CTMzMy4zNjAzOTcKK0NBUkFWRUxBIChVTk8pCToJMQk6CTMzLjA3Nzk5NAorQlVCQVFVRQk6CTEJOgkzNy4xODc4MgorQ0FSQVZFTEEgKFVOTykJOgkxCToJNDIuMjM2MDcKK0NBQ0hFVQk6CTEJOgkzOTEuNzE3Nzk3CitCVUJBUVVFCToJMQk6CTExNS43NTY5NzcKK0JPTEFNQQk6CTEJOgkxNS45MDEwOTIKK0NBSU8JOgkxCToJOTEuNTY0ODM5CitDQVJBVkVMQSAoVU5PKQk6CTEJOgk4LjQ0MjE2NworU0FPIERPTUlOR09TCToJMQk6CTQyOC44OTk5MDQKK01BTlNPQQk6CTEJOgk0NTYuODMxODg0CitCSVNTT1JBCToJMQk6CTMwNi44MjIwMDYKK0NBUkFWRUxBIChVTk8pCToJMQk6CTEuNTkyNjkxCitCQU1CQURJTkNBCToJMQk6CTMxOC44NDUyMDIKK0NBUkFWRUxBIChVTk8pCToJMQk6CTEzLjczNDgyMgorQ0FJTwk6CTEJOgk2OC4yODkwMDQKK0NBUkFWRUxBIChVTk8pCToJMQk6CTUyLjI5MjE4MgorQlVCQVFVRQk6CTEJOgkxLjA1MjM3NQorUVVFQk8JOgkxCToJMzcyLjYyMDkzOAorQ0FDSU5FCToJMQk6CTIwNy4zNDg4NzUKK0VNUEFEQQk6CTEJOgkyMjEuNjU5MzIyCitYSVRPTEUJOgkxCToJNDg3LjE0Nzk2NgorQklHRU5FCToJMQk6CTM4MS4wOTMzNTMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HVUlORUEgQklTU0FVX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dVSU5FQSBCSVNTQVVfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVlNWQ1NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HVUlORUEgQklTU0FVX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsNjEgQEAKK0dVSU5FQSBCSVNTQVUJOgkwCToJMTA4NTc3NworQkFGQVRBCToJMQk6CTE2MTcyNgorQklPTUJPCToJMQk6CTc4Njk5CitCSVNTQVUJOgkxCToJMTUyMjIzCitCT0xBTUEJOgkxCToJMzU4ODEKK0NBQ0hFVQk6CTEJOgkxODE1MTIKK0dBQlUJOgkxCToJMTQ1Mzk1CitPSU8JOgkxCToJMjA0MDE5CitRVUlOQVJBCToJMQk6CTQ5NTI1CitUT01CQUxJCToJMQk6CTc2Nzk3CitGQVJJTQk6CTEJOgk0MDgwMworQ09OVFVCT0VMCToJMQk6CTI2OTU0CitQSVJBREEJOgkxCToJMjkwNzkKK1BJQ0hFCToJMQk6CTI5MDc5CitTT05BQ08JOgkxCToJMjkwNzkKK0JJR0VORQk6CTEJOgkxODE1MQorR0FNQU1VTkRPCToJMQk6CTI2OTU0CitNQU5TQUJBCToJMQk6CTQwODAzCitTQU8gRE9NSU5HT1MJOgkxCToJMTgxNTEKK0JBRkFUQQk6CTEJOgkyNjk1NAorR0FCVQk6CTEJOgkyOTA3OQorQklTU09SQQk6CTEJOgk0MDgwMworQ0FDSEVVCToJMQk6CTE4MTUxCitCVUxBCToJMQk6CTE4MTUxCitDQU5HSFVOR08JOgkxCToJMTgxNTEKK05IQUNSQQk6CTEJOgk0MDgwMworTUFOU09BCToJMQk6CTQwODAzCitCQU1CQURJTkNBCToJMQk6CTI2OTU0CitHQUxPTUFSTwk6CTEJOgkyNjk1NAorQk9FCToJMQk6CTI5MDc5CitDQUlPCToJMQk6CTE4MTUxCitTQUZJTQk6CTEJOgkxNTczOQorUVVJTkhBTUVMCToJMQk6CTE1NzM5CitDQUlPCToJMQk6CTE4MTUxCitGVUxBQ1VOREEJOgkxCToJNjE5MAorQklTU0FVCToJMQk6CTc2MTExCitYSVRPTEUJOgkxCToJMjY5NTQKK0NBTkdIVU5HTwk6CTEJOgkxODE1MQorQ0FJTwk6CTEJOgkxODE1MQorVElURQk6CTEJOgk2MTkwCitRVUlOSEFNRUwJOgkxCToJMTU3MzkKK1RJVEUJOgkxCToJNjE5MAorVElURQk6CTEJOgk2MTkwCitQUkFCSVMJOgkxCToJMTU3MzkKK0JJU1NBVQk6CTEJOgk3NjExMQorQ0FJTwk6CTEJOgkxODE1MQorQlVCQQk6CTEJOgk2MTkwCitRVUlOSEFNRUwJOgkxCToJMTU3MzkKK1RJVEUJOgkxCToJNjE5MAorUVVFQk8JOgkxCToJODUzMworRU1QQURBCToJMQk6CTYxOTAKK0JPTEFNQQk6CTEJOgkxMDU1CitDQVJBVkVMQSAoVU5PKQk6CTEJOgkxMDU1CitFTVBBREEJOgkxCToJNjE5MAorQk9MQU1BCToJMQk6CTEwNTUKK0NBVElPCToJMQk6CTg1MzMKK0JFREFOREEJOgkxCToJODUzMworQ0FDSU5FCToJMQk6CTg1MzMKK0NBVElPCToJMQk6CTg1MzMKK0JVQkFRVUUJOgkxCToJMTA1NQorQ0FDSU5FCToJMQk6CTg1MzMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR1VJTkVBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dVSU5FQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjAyMmJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dVSU5FQV9BUkVBLnR4dApAQCAtMCwwICsxLDkgQEAKK0d1aW5lYSA6IDAgOiAyNDU4NTcKK0Jva2UJOgkxCToJMzExODYJCitDb25ha3J5CToJMQk6CQk0NTAKK0ZhcmFuYWgJOgkxCToJCTM1NTgxCitLYW5rYW4JOgkxCToJCTcyMTQ1CitLaW5kaWEJOgkxCToJCTI4ODczCitMYWJlCToJMQk6CQkyMjg2OQorTWFtb3UJOgkxCToJCTE3MDc0ICAJCitOemVyZWtvcmUJOgkxCToJCTM3NjU4CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR1VJTkVBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dVSU5FQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGYzZTZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0dVSU5FQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDkgQEAKK0d1aW5lYSA6IDAgOiA5NjkwMjIyCitCb2tlCToJMQk6CQk3NjAxMTkKK0NvbmFrcnkJOgkxCToJCTEwOTI5MzYKK0ZhcmFuYWgJOgkxCToJCTYwMjg0NQorS2Fua2FuCToJMQk6CQkxMDExNjQ0CitLaW5kaWEJOgkxCToJCTkyODMxMgorTGFiZQk6CTEJOgkJNzk5NTQ1CitNYW1vdQk6CTEJOgkJNjEyMjE4CitOemVyZWtvcmUJOgkxCToJCTEzNDg3ODcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HVVlBTkFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR1VZQU5BX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZDllZmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR1VZQU5BX0FSRUEudHh0CkBAIC0wLDAgKzEsMTIgQEAKK0d1eWFuYQk6CTAJOgkyMTQ5NzAKK0JhcmltYS9XYWluaSAgCToJMQk6CTIwMzMwCitDdXl1bmkvTWF6YXJ1bmkgCToJMQk6CTQ3MTkzCitEZW1lcmFyYS9NYWhhaWNhIAk6CTEJOgkyMjMyCitFYXN0IEJlcmJpY2UvQ29yZW50eW5lIAk6CTEJOgkzNjIzOQorRXNzZXF1aWJvIEkuL1dlc3QgRC4gCToJMQk6CTM3NTQKK01haGFpY2EvQmVyYmljZSAJOgkxCToJNDE2OAorUG9tZXJvb24vU3VwZW5hYW0gCToJMQk6CTYxOTMKK1BvdGFyby9TaXBhcnVuaSAJOgkxCToJMjAwNDMKK1VwcGVyIERlbWVyYXJhL0JlcmJpY2UgCToJMQk6CTE3MDc0CitVcHBlciBUYWt1dHUvVS5Fc3NlcXVpYm8gCToJMQk6CTU3NzY2CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9HVVlBTkFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR1VZQU5BX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNjFhNDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvR1VZQU5BX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMTEgQEAKK0d1eWFuYQk6CTAJOgk3NjcyNDUKK0JhcmltYS9XYWluaSAgCToJMQk6CTE4MzAyCitDdXl1bmkvTWF6YXJ1bmkgCToJMQk6CTE0NjgyCitEZW1lcmFyYS9NYWhhaWNhIAk6CTEJOgkyOTQ2OTAKK0Vhc3QgQmVyYmljZS9Db3JlbnR5bmUgCToJMQk6CTE0MTQ0NQorRXNzZXF1aWJvIEkuL1dlc3QgRC4gCToJMQk6CTk1MjIwCitNYWhhaWNhL0JlcmJpY2UgCToJMQk6CTUxMjc3CitQb21lcm9vbi9TdXBlbmFhbSAJOgkxCToJNDMxOTQKK1BvdGFyby9TaXBhcnVuaSAJOgkxCToJNTU3NAorVXBwZXIgRGVtZXJhcmEvQmVyYmljZSAJOgkxCToJMzkyNzIKK1VwcGVyIFRha3V0dS9VLkVzc2VxdWlibyAJOgkxCToJMTQ5NDcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9IT05EVVJBU19BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9IT05EVVJBU19BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmVjZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0hPTkRVUkFTX0FSRUEudHh0CkBAIC0wLDAgKzEgQEAKK0hPTkRVUkFTIDogMCA6IDExMjQ5MgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0hPTkRVUkFTX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0hPTkRVUkFTX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMjU4YmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSE9ORFVSQVNfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSBAQAorSE9ORFVSQVMgOiAwIDogNjUzNTM0NApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0hVTkdBUllfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSFVOR0FSWV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmNkNDYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0hVTkdBUllfQVJFQS50eHQKQEAgLTAsMCArMSwxOSBAQAorIEJvcnNvZC1BYmF1ai1aZW1wbGVuIDogMSA6IDcyNDcuMAorIFN6YWJvbGNzLVN6YXRhci1CZXJlZyA6IDEgOiA1OTM3LjAKKyBOb2dyYWQgOiAxIDogMjU0NC4wCisgSGV2ZXMgOiAxIDogMzYzNy4wCisgUGVzdCA6IDEgOiA2Mzk0LjAKKyBHeZRyLU1vc29uLVNvcHJvbiA6IDEgOiA0MDEyLjAKKyBIYWpkdS1CaWhhciA6IDEgOiA2MjExLjAKKyBLb21hcm9tLUVzenRlcmdvbSA6IDEgOiAyMjUxLjAKKyBKYXN6LU5hZ3lrdW4tU3pvbG5vayA6IDEgOiA1NjA3LjAKKyBGZWplciA6IDEgOiA0MzczLjAKKyBWZXN6cHJlbSA6IDEgOiA0Njg5LjAKKyBWYXMgOiAxIDogMzMzNi4wCisgQmVrZXMgOiAxIDogNTYzMS4wCisgQmFjcy1LaXNrdW4gOiAxIDogODM2Mi4wCisgWmFsYSA6IDEgOiAzNzg0LjAKKyBTb21vZ3kgOiAxIDogNjAzNi4wCisgVG9sbmEgOiAxIDogMzcwMy4wCisgQ3NvbmdyYWQgOiAxIDogNDI2My4wCisgQmFyYW55YSA6IDEgOiA0NDg3LjAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9IVU5HQVJZX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0hVTkdBUllfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3MTQyZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9IVU5HQVJZX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMTkgQEAKKyBCb3Jzb2QtQWJhdWotWmVtcGxlbiA6IDEgOiA3NjE5NjMKKyBTemFib2xjcy1TemF0YXItQmVyZWcgOiAxIDogNTcyMzAxCisgTm9ncmFkIDogMSA6IDIyNzEzNworIEhldmVzIDogMSA6IDMzNDQwOAorIFBlc3QgOiAxIDogOTQ5NzQ5CisgR3mUci1Nb3Nvbi1Tb3Byb24gOiAxIDogNDI0NDM5CisgSGFqZHUtQmloYXIgOiAxIDogNTQ4NzI4CisgS29tYXJvbS1Fc3p0ZXJnb20gOiAxIDogMzE1MjA4CisgSmFzei1OYWd5a3VuLVN6b2xub2sgOiAxIDogNDI2NDkxCisgRmVqZXIgOiAxIDogNDIwNjI4CisgVmVzenByZW0gOiAxIDogMzgyMTUzCisgVmFzIDogMSA6IDI3NTk0NAorIEJla2VzIDogMSA6IDQxMTg4NworIEJhY3MtS2lza3VuIDogMSA6IDU0NDc0OAorIFphbGEgOiAxIDogMzA2Mzk4CisgU29tb2d5IDogMSA6IDM0NDcwOAorIFRvbG5hIDogMSA6IDI1MzY3NQorIENzb25ncmFkIDogMSA6IDQzODg0MgorIEJhcmFueWEgOiAxIDogNDE4NjQyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSUNFTEFORF9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JQ0VMQU5EX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYmNlNzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSUNFTEFORF9BUkVBLnR4dApAQCAtMCwwICsxIEBACisgSXNsYW5kIDogMSA6IDEwMzAwMC4wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSUNFTEFORF9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JQ0VMQU5EX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjIwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSUNFTEFORF9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxIEBACisgSXNsYW5kIDogMSA6IDI1Mjc0NgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0lORElBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0lORElBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjQ0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSU5ESUFfQVJFQS50eHQKQEAgLTAsMCArMSwzOCBAQAorSW5kaWEJOgkwCToJMzI4NzU5MAorIEphbW11IGFuZCBLYXNobWlyICAJOgkxCToJMTAxMzg3CitIaW1hY2hhbCBQcmFkZXNoIAk6CTEJOgk1NTY3MworUHVuamFiIAk6CTEJOgk1MDM2MgorQ2hhbmRpZ2FyaAk6CTEJOgkxMTQKK1V0dGFyYW5jaGFsIAk6CTEJOgk1MzQ4MworSGFyeWFuYSAJOgkxCToJNDQyMTIKK0RlbGhpCToJMQk6CTE0ODMKK1JhamFzdGhhbiAJOgkxCToJMzQyMjM5CitVdHRhciBQcmFkZXNoIAk6CTEJOgkyNDA5MjgKK0JpaGFyIAk6CTEJOgk5NDE2MworU2lra2ltIAk6CTEJOgk3MDk2CitBcnVuYWNoYWwgUHJhZGVzaCAJOgkxCToJODM3NDMKK05hZ2FsYW5kIAk6CTEJOgkxNjU3OQorTWFuaXB1ciAJOgkxCToJMjIzMjcKK01pem9yYW0gCToJMQk6CTIxMDgxCitUcmlwdXJhIAk6CTEJOgkxMDQ4NgorTWVnaGFsYXlhIAk6CTEJOgkyMjQyOQorQXNzYW0gCToJMQk6CTc4NDM4CitXZXN0IEJlbmdhbCAJOgkxCToJODg3NTIKK0poYXJraGFuZCAJOgkxCToJNzk3MTQKK09yaXNzYSAJOgkxCToJMTU1NzA3CitDaGhhdHRpc2dhcmggCToJMQk6CTEzNTE5MQorTWFkaHlhIFByYWRlc2ggCToJMQk6CTMwODI0NQorR3VqYXJhdCAJOgkxCToJMTk2MDIyCitEYW1hbiBhbmQgRGl1CToJMQk6CTExMgorRGFkcmEgYW5kIE5hZ2FyIEhhdmVsaQk6CTEJOgk0OTEKK01haGFyYXNodHJhIAk6CTEJOgkzMDc3MTMKK0FuZGhyYSBQcmFkZXNoIAk6CTEJOgkyNzUwNjkKK0thcm5hdGFrYSAJOgkxCToJMTkxNzkxCitHb2EgCToJMQk6CTM3MDIKK0xha3NoYWR3ZWVwCToJMQk6CTMyCitLZXJhbGEgCToJMQk6CTM4ODYzCitUYW1pbCBOYWR1IAk6CTEJOgkxMzAwNTgKK1BvbmRpY2hlcnJ5IAk6CTEJOgk0ODAKK0FuZGFtYW4gJiBOaWNvYmFyCToJMQk6CTgyNDkKKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSU5ESUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSU5ESUFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2MzE3YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JTkRJQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDM2IEBACitJbmRpYQk6CTAJOgkxMDk1MzUxOTk1CisgSmFtbXUgYW5kIEthc2htaXIgIAk6CTEJOgkxMDk0MTAwMAorSGltYWNoYWwgUHJhZGVzaCAJOgkxCToJNjQ1NTAwMAorUHVuamFiIAk6CTEJOgkyNjA1OTAwMAorQ2hhbmRpZ2FyaAk6CTEJOgkxMTAzMDAwCitVdHRhcmFuY2hhbCAJOgkxCToJOTIxOTAwMAorSGFyeWFuYSAJOgkxCToJMjMzMTQwMDAKK0RlbGhpCToJMQk6CTE2MDIxMDAwCitSYWphc3RoYW4gCToJMQk6CTYyMjc2MDAwCitVdHRhciBQcmFkZXNoIAk6CTEJOgkxODMyODIwMDAKK0JpaGFyIAk6CTEJOgk5MDc1MjAwMAorU2lra2ltIAk6CTEJOgk1NzYwMDAKK0FydW5hY2hhbCBQcmFkZXNoIAk6CTEJOgkxMTY5MDAwCitOYWdhbGFuZCAJOgkxCToJMjExOTAwMAorTWFuaXB1ciAJOgkxCToJMjMwODAwMAorTWl6b3JhbSAJOgkxCToJOTQ2MDAwCitUcmlwdXJhIAk6CTEJOgkzNDA3MDAwCitNZWdoYWxheWEgCToJMQk6CTI0NzAwMDAKK0Fzc2FtIAk6CTEJOgkyODY2NTAwMAorV2VzdCBCZW5nYWwgCToJMQk6CTg1MjE2MDAwCitKaGFya2hhbmQgCToJMQk6CTI5Mjk5MDAwCitPcmlzc2EgCToJMQk6CTM4ODg3MDAwCitDaGhhdHRpc2dhcmggCToJMQk6CTIyNTk0MDAwCitNYWRoeWEgUHJhZGVzaCAJOgkxCToJNjYzOTAwMDAKK0d1amFyYXQgCToJMQk6CTU0OTc5MDAwCitEYW1hbiBhbmQgRGl1CToJMQk6CTIxNjAwMAorRGFkcmEgYW5kIE5hZ2FyIEhhdmVsaQk6CTEJOgkyNjYwMDAKK01haGFyYXNodHJhIAk6CTEJOgkxMDQ4MDQwMDAKK0FuZGhyYSBQcmFkZXNoIAk6CTEJOgk4MDcxMjAwMAorS2FybmF0YWthIAk6CTEJOgk1NjI1ODAwMAorR29hIAk6CTEJOgkxNDkyMDAwCitMYWtzaGFkd2VlcAk6CTEJOgk3MjAwMAorS2VyYWxhIAk6CTEJOgkzMzI2NTAwMAorVGFtaWwgTmFkdSAJOgkxCToJNjUxMzUwMDAKK1BvbmRpY2hlcnJ5IAk6CTEJOgkxMDk4MDAwCitBbmRhbWFuICYgTmljb2Jhcgk6CTEJOgk0MTkwMDAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JTkRPTkVTSUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSU5ET05FU0lBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOGU0ODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSU5ET05FU0lBX0FSRUEudHh0CkBAIC0wLDAgKzEsMzUgQEAKK0luZG9uZXNpYQk6CTAJOgkxOTE5NDQwCitBY2VoICBbTmFuZ2dyb2UgQWNlaCBEYXJ1c3NhbGFtXSAgIAk6CTEJOgk1NTM5MAorIFN1bWF0ZXJhIFV0YXJhIAk6CTEJOgk3MTY4MAorU3VtYXRlcmEgQmFyYXQgCToJMQk6CTQyMjk3CisgUmlhdSAJOgkxCToJOTQ1NjEKKyBKYW1iaSAJOgkxCToJNTM0MzYKKyBTdW1hdGVyYSBTZWxhdGFuIAk6CTEJOgk3NDc5NQorIEJlbmdrdWx1IAk6CTEJOgkxOTc4OQorIExhbXB1bmcgCToJMQk6CTM1Mzg1CisgS2VwdWxhdWFuIEJhbmdrYSBCZWxpdHVuZyAJOgkxCToJMzQ0NTkKKyBLZXB1bGF1YW4gUmlhdSAJOgkxCToJMAorREtJIEpha2FydGEgCToJMQk6CTY2NAorIEphd2EgQmFyYXQgCToJMQk6CTM0ODE3CisgSmF3YSBUZW5nYWggCToJMQk6CTMyNTQ0CisgRC5JIFlvZ3lha2FydGEgCToJMQk6CTMxODYKKyBKYXdhIFRpbXVyIAk6CTEJOgk0NzkyMworIEJhbnRlbiAJOgkxCToJODgwMQorIEJhbGkgCToJMQk6CTU2MzMKKyBOdXNhIFRlbmdnYXJhIEJhcmF0IAk6CTEJOgkyMDE1MworIE51c2EgVGVuZ2dhcmEgVGltdXIgCToJMQk6CTQ3MzUwCisgVGltb3IgVGltdXIgOiAxIDogMzA3NzcKKyBLYWxpbWFudGFuIEJhcmF0IAk6CTEJOgkxNDY4MDcKKyBLYWxpbWFudGFuIFRlbmdhaCAJOgkxCToJMTUzNTY0CisgS2FsaW1hbnRhbiBTZWxhdGFuIAk6CTEJOgkzNjUzNQorIEthbGltYW50YW4gVGltdXIgCToJMQk6CTIxMDk4NQorIFN1bGF3ZXNpIFV0YXJhIAk6CTEJOgkxNTkyNgorIFN1bGF3ZXNpIFRlbmdhaCAJOgkxCToJNjM2ODkKKyBTdWxhd2VzaSBTZWxhdGFuIAk6CTEJOgk2MjY0MQorIFN1bGF3ZXNpIFRlbmdnYXJhIAk6CTEJOgkzODE0MAorIEdvcm9udGFsbyAJOgkxCToJMTE1NjIKKyBTdWxhd2VzaSBCYXJhdCAJOgkxCToJMTY3OTYKKyBNYWx1a3UgCToJMQk6CTUxODMwCisgTWFsdWt1IFV0YXJhIAk6CTEJOgkyNjA0MQorIElyaWFuIEpheWEgCToJMQk6CTQyMTk4MQorIFBhcHVhIAk6CTEJOgk0MjE5ODEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JTkRPTkVTSUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSU5ET05FU0lBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YTA1MDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSU5ET05FU0lBX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMzUgQEAKK0luZG9uZXNpYQk6CTAJOgkyNDU0NTI3MzkKKyBBY2VoIFtOYW5nZ3JvZSBBY2VoIERhcnVzc2FsYW1dICAgCToJMQk6CTQwMzc5MDAKKyBTdW1hdGVyYSBVdGFyYSAJOgkxCToJMTI0NTI4MDAKK1N1bWF0ZXJhIEJhcmF0IAk6CTEJOgk0NDAyMTAwCisgUmlhdSAJOgkxCToJNjEwODQwMAorIEphbWJpIAk6CTEJOgkyNjU3MzAwCisgU3VtYXRlcmEgU2VsYXRhbiAJOgkxCToJNzUyNjgwMAorIEJlbmdrdWx1IAk6CTEJOgkxNzQ0MjAwCisgTGFtcHVuZyAJOgkxCToJNzI5MTMwMAorIEtlcHVsYXVhbiBCYW5na2EgQmVsaXR1bmcgCToJMQk6CTk3MTUwMAorIEtlcHVsYXVhbiBSaWF1IAk6CTEJOgkwCitES0kgSmFrYXJ0YSAJOgkxCToJODY5OTYwMAorIEphd2EgQmFyYXQgCToJMQk6CTM5MTQwODEyCisgSmF3YSBUZW5nYWggCToJMQk6CTMxODg3MjAwCisgRC5JIFlvZ3lha2FydGEgCToJMQk6CTMyNTcwMDAKKyBKYXdhIFRpbXVyIAk6CTEJOgkzNTU1MDQwMAorIEJhbnRlbiAJOgkxCToJOTMwOTAwMAorIEJhbGkgCToJMQk6CTMzNzg1MDAKKyBOdXNhIFRlbmdnYXJhIEJhcmF0IAk6CTEJOgk0MzU1NTAwCisgTnVzYSBUZW5nZ2FyYSBUaW11ciAJOgkxCToJNDEyNzMwMAorIFRpbW9yIFRpbXVyIDogMSA6IDgwMDAwMAorIEthbGltYW50YW4gQmFyYXQgCToJMQk6CTQzOTQzMDAKKyBLYWxpbWFudGFuIFRlbmdhaCAJOgkxCToJMjEzNzkwMAorIEthbGltYW50YW4gU2VsYXRhbiAJOgkxCToJMzI0MDEwMAorIEthbGltYW50YW4gVGltdXIgCToJMQk6CTI4MTA5MDAKKyBTdWxhd2VzaSBVdGFyYSAJOgkxCToJMjE0MTkwMAorIFN1bGF3ZXNpIFRlbmdhaCAJOgkxCToJMjQwNDAwMAorIFN1bGF3ZXNpIFNlbGF0YW4gCToJMQk6CTg0OTM3MDAKKyBTdWxhd2VzaSBUZW5nZ2FyYSAJOgkxCToJMjA4NTkwMAorIEdvcm9udGFsbyAJOgkxCToJODcyMjAwCisgU3VsYXdlc2kgQmFyYXQgCToJMQk6CTAKKyBNYWx1a3UgCToJMQk6CTExNzIwMDAKKyBNYWx1a3UgVXRhcmEgCToJMQk6CTc4MDMwMAorIElyaWFuIEpheWEgCToJMQk6CTcwMTQzNQorIFBhcHVhIAk6CTEJOgkxOTQ1MDU0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSVJBS19BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JUkFLX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZWI3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSVJBS19BUkVBLnR4dApAQCAtMCwwICsxLDE5IEBACitpcmFxCToJMAk6CTQzNzA3MgorYWwgYW5iYXIJOgkxCToJMTM3ODA4CithbC1iYXNyYWgJOgkxCToJMTkwNzAKK0FsLW11dGhhbm5pYQk6CTEJOgk1MTc0MAorQWwtUWFkaXNpeWFoCToJMQk6CTgxNTMKK2FuLW5hamFmCToJMQk6CTI4ODI0CitBcmJpbAk6CTEJOgkxNTA3NAorU3VsYXltYW5peWFoCToJMQk6CTE3MDIzCitLaXJrdWsJOgkxCToJOTY3OQorQmFiaWwgW0JhYnlsb25dCToJMQk6CTU2MDMKK0JhZ2hkYWQJOgkxCToJNDA3MQorRGlob2sJOgkxCToJNjU1MworTmFzaXJpeWFoCToJMQk6CTEyOTAwCitEaXlhbGEJOgkxCToJMTc2ODUKK0thcmJhbGEJOgkxCToJNTAzNAorTWlzYW4JOgkxCToJMTYwNzIKK05laW5ldmEJOgkxCToJMzczMjMKK1NhbGFodWRkaW4JOgkxCToJMjQzNjMKK1dhc2l0CToJMQk6CTE3MTUzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSVJBS19QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JUkFLX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNjRmNDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSVJBS19QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDE5IEBACitpcmFxCToJMAk6CTI2NzgzMzgzCithbCBhbmJhcgk6CTEJOgkxMjMwMTQwCithbC1iYXNyYWgJOgkxCToJMTg4MDE3NgorQWwtbXV0aGFubmlhCToJMQk6CTUzNzY1OAorQWwtUWFkaXNpeWFoCToJMQk6CTg4NjU5NAorYW4tbmFqYWYJOgkxCToJOTI5OTk1CitBcmJpbAk6CTEJOgkxMzEzNzE5CitTdWxheW1hbml5YWgJOgkxCToJMTU0NjY1MworS2lya3VrCToJMQk6CTg0ODAwNworQmFiaWwgW0JhYnlsb25dCToJMQk6CTEzODU3ODIKK0JhZ2hkYWQJOgkxCToJNjAyNDI5OQorRGlob2sJOgkxCToJNzgyNDg5CitOYXNpcml5YWgJOgkxCToJMTQ3MjA5OAorRGl5YWxhCToJMQk6CTEyMjQzNTgKK0thcmJhbGEJOgkxCToJNzIzODQwCitNaXNhbgk6CTEJOgk4MDMyMjUKK05laW5ldmEJOgkxCToJMjQ1MzExNgorU2FsYWh1ZGRpbgk6CTEJOgk5NDIzMTQKK1dhc2l0CToJMQk6CTkxMzM4NgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0lSQU5fQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSVJBTl9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTdlNWVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0lSQU5fQVJFQS50eHQKQEAgLTAsMCArMSwzMyBAQAorSXJhbgk6CTAJOgkxNjQ4MDAwCitCYWtodGFyYW4gOiAxIDogMjQ0MzQKK05vcnRoIGFuZCBTb3V0aCBIb3JhemFuIFtIb3Jhc2FuXSA6IDEgOiA5Nzk4OQorQXJkZWJpbAk6CTEJOgkxNzgwMAorQnVzaGVocgk6CTEJOgkyMjc0MworQ2hhaGFybWFoYWwgYW5kIEJha2h0aWFyCToJMQk6CTE2MzMyCitlYXN0IGF6YXJiYXllamFuCToJMQk6CTQ1NjUwCitFc2ZhaGFuCToJMQk6CTEwNzAyOQorRmFycwk6CTEJOgkxMjI2MDgKK0dpbGFuCToJMQk6CTE0MDQyCitHb2xlc3Rhbgk6CTEJOgkyMDE5NQorSGFtYWRhbgk6CTEJOgkxOTM2OAorSG9ybW96Z2FuCToJMQk6CTcwNjY5CitJbGFtCToJMQk6CTIwMTMzCitLZXJtYW4JOgkxCToJMTgwODM2CitLZXJtYW5zaGFoCToJMQk6CTI0OTk4CitLaHV6ZXN0YW4JOgkxCToJNjQwNTUKK0tvaGdpbHV5ZWggJiBCb3llciBhaG1hZCAJOgkxCToJMTU1MDQKK0tvcmRlc3Rhbgk6CTEJOgkyOTEzNworTG9yZXN0YW4JOgkxCToJMjgyOTQKK01hcmthemkJOgkxCToJMjkxMzAKK01hemFuZGFyYW4JOgkxCToJMjM3MDEKK05vcnRoIEtob3Jhc2FuCToJMQk6CTI4NDM0CitLaG9yYXNhbi1lLVJhemF2aQk6CTEJOgkxNDQ2ODEKK1FhenZpbgk6CTEJOgkxNTU0OQorUW9tCToJMQk6CTExNTI2CitTZW1uYW4JOgkxCToJOTc0OTEKK1Npc3RhbiBhbmQgQmFsdWNoZXN0YW4JOgkxCToJMTgxNzg1CitTb3V0aCBLaG9yYXNhbgk6CTEJOgk2OTU1NQorVGVocmFuCToJMQk6CTE4ODE0CitXZXN0IEF6YXJiYXllamFuCToJMQk6CTM3NDM3CitZYXpkCToJMQk6CTEyOTI4NQorWmFuamFuCToJMQk6CTIxNzczCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSVJBTl9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JUkFOX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYmI0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSVJBTl9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDMzIEBACitJcmFuCToJMAk6CTY4Njg4NDMzCitCYWtodGFyYW4gOiAxIDogNjkwMDAwCitOb3J0aCBhbmQgU291dGggSG9yYXphbiBbSG9yYXNhbl0gOiAxIDogMTI5NzEzNgorQXJkZWJpbAk6CTEJOgkxMjU3NjI0CitCdXNoZWhyCToJMQk6CTgxNjExNQorQ2hhaGFybWFoYWwgYW5kIEJha2h0aWFyCToJMQk6CTg0MjAwMgorZWFzdCBhemFyYmF5ZWphbgk6CTEJOgkzNTAwMTgzCitFc2ZhaGFuCToJMQk6CTQ0NTQ1OTUKK0ZhcnMJOgkxCToJNDM4NTg2OQorR2lsYW4JOgkxCToJMjQxMDUyMworR29sZXN0YW4JOgkxCToJMTYzNzA2MworSGFtYWRhbgk6CTEJOgkxNzM4NzcyCitIb3Jtb3pnYW4JOgkxCToJMTMxNDY2NworSWxhbQk6CTEJOgk1NDUwOTMKK0tlcm1hbgk6CTEJOgkyNDMyOTI3CitLZXJtYW5zaGFoCToJMQk6CTE5MzgwNjAKK0todXplc3Rhbgk6CTEJOgk0MzQ1NjA3CitLb2hnaWx1eWVoICYgQm95ZXIgYWhtYWQgCToJMQk6CTY5NTA5OQorS29yZGVzdGFuCToJMQk6CTE1NzQxMTgKK0xvcmVzdGFuCToJMQk6CTE3NTg2MjgKK01hcmthemkJOgkxCToJMTM2MTM5NAorTWF6YW5kYXJhbgk6CTEJOgkyODE4ODMxCitOb3J0aCBLaG9yYXNhbgk6CTEJOgk3ODY5MTgKK0tob3Jhc2FuLWUtUmF6YXZpCToJMQk6CTUyMDI3NzAKK1FhenZpbgk6CTEJOgkxMTY2ODYxCitRb20JOgkxCToJMTA2NDQ1NgorU2VtbmFuCToJMQk6CTU4OTUxMgorU2lzdGFuIGFuZCBCYWx1Y2hlc3Rhbgk6CTEJOgkyMjkwMDc2CitTb3V0aCBLaG9yYXNhbgk6CTEJOgk1MTAyMTgKK1RlaHJhbgk6CTEJOgkxMjE1MDc0MgorV2VzdCBBemFyYmF5ZWphbgk6CTEJOgkyOTQ5NDI2CitZYXpkCToJMQk6CTk1ODMxOAorWmFuamFuCToJMQk6CTk3MDk0NgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0lSQVFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSVJBUV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWViOTY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0lSQVFfQVJFQS50eHQKQEAgLTAsMCArMSwyMCBAQAoraXJhcQk6CTAJOgk0MzcwNzIKK2FsIGFuYmFyCToJMQk6CTEzNzgwOAorYWwtYmFzcmFoCToJMQk6CTE5MDcwCitBbC1tdXRoYW5uaWEJOgkxCToJNTE3NDAKK0FsLVFhZGlzaXlhaAk6CTEJOgk4MTUzCithbi1uYWphZgk6CTEJOgkyODgyNAorQXJiaWwJOgkxCToJMTUwNzQKK1N1bGF5bWFuaXlhaAk6CTEJOgkxNzAyMworS2lya3VrIFtBdC1UYW1pbV0JOgkxCToJOTY3OQorQmFiaWwgW0JhYnlsb25dCToJMQk6CTU2MDMKK0JhZ2hkYWQJOgkxCToJNDA3MQorRGlob2sJOgkxCToJNjU1MworTmFzaXJpeWFoIFtEaGktUWFyXQk6CTEJOgkxMjkwMAorRGl5YWxhCToJMQk6CTE3Njg1CitLYXJiYWxhCToJMQk6CTUwMzQKK01pc2FuCToJMQk6CTE2MDcyCitOZWluZXZhCToJMQk6CTM3MzIzCitTYWxhaHVkZGluCToJMQk6CTI0MzYzCitXYXNpdAk6CTEJOgkxNzE1MworSVJRL1NBVSBOZXV0cmFsIFpvbmUgOiAxIDogNzA0NApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0lSQVFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSVJBUV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjMxZWIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0lSQVFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwyMCBAQAoraXJhcQk6CTAJOgkyNjc4MzM4MworTmFzaXJpeWFoIFtEaGktUWFyXQk6CTEJOgkxNDcyMDk4CitLaXJrdWsgW0F0LVRhbWltXQk6CTEJOgk4NDgwMDcKK0JhYmlsIFtCYWJ5bG9uXQk6CTEJOgkxMzg1NzgyCitJUlEvU0FVIE5ldXRyYWwgWm9uZSA6IDEgOiAwCithbCBhbmJhcgk6CTEJOgkxMjMwMTQwCithbC1iYXNyYWgJOgkxCToJMTg4MDE3NgorQWwtbXV0aGFubmlhCToJMQk6CTUzNzY1OAorQWwtUWFkaXNpeWFoCToJMQk6CTg4NjU5NAorYW4tbmFqYWYJOgkxCToJOTI5OTk1CitBcmJpbAk6CTEJOgkxMzEzNzE5CitTdWxheW1hbml5YWgJOgkxCToJMTU0NjY1MworQmFnaGRhZAk6CTEJOgk2MDI0Mjk5CitEaWhvawk6CTEJOgk3ODI0ODkKK0RpeWFsYQk6CTEJOgkxMjI0MzU4CitLYXJiYWxhCToJMQk6CTcyMzg0MAorTWlzYW4JOgkxCToJODAzMjI1CitOZWluZXZhCToJMQk6CTI0NTMxMTYKK1NhbGFodWRkaW4JOgkxCToJOTQyMzE0CitXYXNpdAk6CTEJOgk5MTMzODYKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JUkVMQU5EX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0lSRUxBTkRfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg2ZjBjMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JUkVMQU5EX0FSRUEudHh0CkBAIC0wLDAgKzEgQEAKKyBJUkVMQU5EIDogMSA6IDY4ODk1LjAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JUkVMQU5EX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0lSRUxBTkRfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyZWZmYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JUkVMQU5EX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEgQEAKKyBJUkVMQU5EIDogMSA6IDM1MDY1MDAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JVEFMWV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JVEFMWV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2EyNjM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0lUQUxZX0FSRUEudHh0CkBAIC0wLDAgKzEsMjAgQEAKKyBUUkVOVElOTy1BTFRPIEFESUdFIDogMSA6IDEzNjIwLjAKKyBWRU5FVE8gOiAxIDogMTgzNjMuMAorIEZSSVVMSS1WRU5FWklBIEdJVUxJQSA6IDEgOiA3ODQ2LjAKKyBMT01CQVJESUEgOiAxIDogMjM4NTkuMAorIFBJRU1PTlRFIDogMSA6IDI1Mzk4LjAKKyBWQUxMRSBEJ0FPU1RBIDogMSA6IDMyNjIuMAorIEVNSUxJQS1ST01BR05BIDogMSA6IDIyMTIzLjAKKyBMSUdVUklBIDogMSA6IDU0MTYuMAorIFRPU0NBTkEgOiAxIDogMjI5OTIuMAorIE1BUkNIRSA6IDEgOiA5NjkzLjAKKyBVTUJSSUEgOiAxIDogODQ1Ni4wCisgQUJSVVpaSSA6IDEgOiAxMDc5NC4wCisgTEFaSU8gOiAxIDogMTcyMDMuMAorIFBVR0xJQSA6IDEgOiAxOTM0Ny4wCisgTU9MSVNFIDogMSA6IDQ0MzcuMAorIENBTVBBTklBIDogMSA6IDEzNTk1LjAKKyBTQVJERUdOQSA6IDEgOiAyNDA5MC4wCisgQkFTSUxJQ0FUQSA6IDEgOiA5OTkyLjAKKyBDQUxBQlJJQSA6IDEgOiAxNTA4MC4wCisgU0lDSUxJQSA6IDEgOiAyNTcwNy4wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSVRBTFlfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSVRBTFlfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQyZTE2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JVEFMWV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDIwIEBACisgVFJFTlRJTk8tQUxUTyBBRElHRSA6IDEgOiA4OTE0MDAKKyBWRU5FVE8gOiAxIDogNDM5ODEwMAorIEZSSVVMSS1WRU5FWklBIEdJVUxJQSA6IDEgOiAxMjAyOTAwCisgTE9NQkFSRElBIDogMSA6IDg5Mzk0MDAKKyBQSUVNT05URSA6IDEgOiA0MzU3NjAwCisgVkFMTEUgRCdBT1NUQSA6IDEgOiAxMTYwMDAKKyBFTUlMSUEtUk9NQUdOQSA6IDEgOiAzOTI4NzAwCisgTElHVVJJQSA6IDEgOiAxNzI3MjAwCisgVE9TQ0FOQSA6IDEgOiAzNTYyNTAwCisgTUFSQ0hFIDogMSA6IDE0MzU2MDAKKyBVTUJSSUEgOiAxIDogODIyODAwCisgQUJSVVpaSSA6IDEgOiAxMjcyNDAwCisgTEFaSU8gOiAxIDogNTE5MTUwMAorIFBVR0xJQSA6IDEgOiA0MDgxNTAwCisgTU9MSVNFIDogMSA6IDMzNjUwMAorIENBTVBBTklBIDogMSA6IDU4NTM5MDAKKyBTQVJERUdOQSA6IDEgOiAxNjY0NDAwCisgQkFTSUxJQ0FUQSA6IDEgOiA2MjQ1MDAKKyBDQUxBQlJJQSA6IDEgOiAyMTUzNzAwCisgU0lDSUxJQSA6IDEgOiA1MTk2ODAwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSVZPUlkgQ09BU1RfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSVZPUlkgQ09BU1RfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ4YzQyMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JVk9SWSBDT0FTVF9BUkVBLnR4dApAQCAtMCwwICsxLDcwIEBACitJdm9yeSBDb2FzdAk6CTAJOgkzMjI0NjAKK0FnbmViaSBbQWduaWJpbGVrcm9dICAJOgkxCToJOTA4MAorQmFmbmcgCToJMQk6CTg3MjAKK1Nhc3NhbmRyYSAJOgkxCToJMjU4MDAKK0Rlbmd1ZWxlIAk6CTEJOgkyMDYwMAorTW9udGFnbmVzIAk6CTEJOgkxNjYwMAorRnJvbWFnZXIgCToJMQk6CTY5MDAKK0hhdXQtU2Fzc2FuZHJhIAk6CTEJOgkxNTIwMAorTGFjcyAJOgkxCToJODk0MAorTGFndW5lcyAJOgkxCToJMTQyMDAKK01hcmFob3VlIAk6CTEJOgk4NTAwCitNb3llbi1DYXZhbGx5IAk6CTEJOgkxNDE1MAorTW95ZW4tQ29tb2UgCToJMQk6CTY5MDAKK056LUNvbW9lIAk6CTEJOgkxOTU2MAorU2F2YW5lcyAJOgkxCToJNDAzMjMKK1N1ZC1CYW5kYW1hIAk6CTEJOgkxMDY1MAorU3VkLUNvbW9lIAk6CTEJOgk2MjUwCitWYWxsZWUgZHUgQmFuZGFtYSAJOgkxCToJMjg1MzAKK1dvcm9kb3Vnb3UgCToJMQk6CTIxOTAwCitaYW56YW4gCToJMQk6CTM4MDAwCitBQkVOR09VUk9VCToJMQk6CTY1ODAKK0FCSURKQU4JOgkxCToJNjU4MAorQUJPSVNTTwk6CTEJOgk2NTgwCitBRFpPUEUJOgkxCToJNjU4MAorQUdCT1ZJTExFCToJMQk6CTY1ODAKK0FHTklCSUxFS1JPCToJMQk6CTY1ODAKK0JBTkdPTE8JOgkxCToJNjU4MAorQkVPVU1JCToJMQk6CTY1ODAKK0JJQU5LT1VNQQk6CTEJOgk2NTgwCitCT05ET1VLT1UJOgkxCToJNjU4MAorQk9OR09VQU5PVQk6CTEJOgk2NTgwCitCT1VBRkxFCToJMQk6CTY1ODAKK0JPVUFLRQk6CTEJOgk2NTgwCitCT1VOQQk6CTEJOgk2NTgwCitCT1VORElBTEkJOgkxCToJNjU4MAorREFCQUtBTEEJOgkxCToJNjU4MAorREFMT0EJOgkxCToJNjU4MAorREFOQU5FCToJMQk6CTY1ODAKK0RBT1VLUk8JOgkxCToJNjU4MAorRElNQk9LUk8JOgkxCToJNjU4MAorRElWTwk6CTEJOgk2NTgwCitEVUVLT1VFCToJMQk6CTY1ODAKK0ZFUktFU1NFRE9VR09VCToJMQk6CTY1ODAKK0dBR05PQQk6CTEJOgk2NTgwCitHUkFORC1MQUhPVQk6CTEJOgk2NTgwCitHVUlHTE8JOgkxCToJNjU4MAorSVNTSUEJOgkxCToJNjU4MAorS0FUSU9MQQk6CTEJOgk2NTgwCitLT1JIT0dPCToJMQk6CTY1ODAKK0xBS09UQQk6CTEJOgk2NTgwCitNJ0JBSElBS1JPCToJMQk6CTY1ODAKK01BTgk6CTEJOgk2NTgwCitNQU5LT05PCToJMQk6CTY1ODAKK09ESUVOTkUJOgkxCToJNjU4MAorT1VNRQk6CTEJOgk2NTgwCitTQUtBU1NPVQk6CTEJOgk2NTgwCitTQU4tUEVEUk8JOgkxCToJNjU4MAorU0VHVUVMQQk6CTEJOgk2NTgwCitTSU5GUkEJOgkxCToJNjU4MAorU09VQlJFCToJMQk6CTY1ODAKK1RBQk9VCToJMQk6CTY1ODAKK1RBTkRBCToJMQk6CTY1ODAKK1RFTkdSRUxBCToJMQk6CTY1ODAKK1RJQVNTQUxFCToJMQk6CTY1ODAKK1RPVUJBCToJMQk6CTY1ODAKK1RPVU1PREkJOgkxCToJNjU4MAorVkFWT1VBCToJMQk6CTY1ODAKK1lBTU9VU1NPVUtSTwk6CTEJOgk2NTgwCitaVUVOT1VMQQk6CTEJOgk2NTgwCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JVk9SWSBDT0FTVF9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JVk9SWSBDT0FTVF9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmZhOGEwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0lWT1JZIENPQVNUX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsNzAgQEAKK0l2b3J5IENvYXN0CToJMAk6CTE3NjU0ODQzCitBZ25lYmkgIFtBZ25pYmlsZWtyb10gCToJMQk6CTcyMDkwMAorQmFmaW5nIAk6CTEJOgkxNzg0MDAKK1Nhc3NhbmRyYSAJOgkxCToJNDQzMjAwCitEZW5ndWVsZSAJOgkxCToJMjc3MDAwCitNb250YWduZXMgCToJMQk6CTExMjU4MDAKK0Zyb21hZ2VyIAk6CTEJOgk2Nzk5MDAKK0hhdXQtU2Fzc2FuZHJhIAk6CTEJOgkxMTg2NjAwCitMYWNzIAk6CTEJOgk1OTc1MDAKK0xhZ3VuZXMgCToJMQk6CTQyMTAyMDAKK01hcmFob3VlIAk6CTEJOgk2NTE3MDAKK01veWVuLUNhdmFsbHkgCToJMQk6CTQ0MzIwMAorTW95ZW4tQ29tb2UgCToJMQk6CTQ4ODIwMAorTnppLUNvbW9lIAk6CTEJOgk5MDk4MDAKK1NhdmFuZXMgCToJMQk6CTEyMTUxMDAKK1N1ZC1CYW5kYW1hIAk6CTEJOgk4MjYzMDAKK1N1ZC1Db21vZSAJOgkxCToJNTM2NTAwCitWYWxsZWUgZHUgQmFuZGFtYSAJOgkxCToJMTMzNTUwMAorV29yb2RvdWdvdSAJOgkxCToJNDAwMjAwCitaYW56YW4gCToJMQk6CTgzOTAwMAorQUJFTkdPVVJPVQk6CTEJOgk1ODk3NAorQUJJREpBTgk6CTEJOgkxOTM0MzQyCitBQk9JU1NPCToJMQk6CTIxMzQ4CitBRFpPUEUJOgkxCToJMzUwODUKK0FHQk9WSUxMRQk6CTEJOgk0NjM1OQorQUdOSUJJTEVLUk8JOgkxCToJMjQ0MTMKK0JBTkdPTE8JOgkxCToJMTAwNDIKK0JFT1VNSQk6CTEJOgkxMzA3MAorQklBTktPVU1BCToJMQk6CTEyOTY1CitCT05ET1VLT1UJOgkxCToJMzMwNTEKK0JPTkdPVUFOT1UJOgkxCToJMTk1MDYKK0JPVUFGTEUJOgkxCToJMzQ1NjIKK0JPVUFLRQk6CTEJOgkzMzI5OTkKK0JPVU5BCToJMQk6CTIxMTU0CitCT1VORElBTEkJOgkxCToJMjIwNDIKK0RBQkFLQUxBCToJMQk6CTIzMzQwCitEQUxPQQk6CTEJOgkxMjI5MzMKK0RBTkFORQk6CTEJOgkzMDUwNgorREFPVUtSTwk6CTEJOgkyMjc3NworRElNQk9LUk8JOgkxCToJMzgxODMKK0RJVk8JOgkxCToJNzI0OTQKK0RVRUtPVUUJOgkxCToJMjY3NTkKK0ZFUktFU1NFRE9VR09VCToJMQk6CTM1MTU1CitHQUdOT0EJOgkxCToJODU1NjMKK0dSQU5ELUxBSE9VCToJMQk6CTEzNDAwCitHVUlHTE8JOgkxCToJMjIxODcKK0lTU0lBCToJMQk6CTI4NTI1CitLQVRJT0xBCToJMQk6CTMzODEzCitLT1JIT0dPCToJMQk6CTEwOTY2NQorTEFLT1RBCToJMQk6CTIxNTc1CitNJ0JBSElBS1JPCToJMQk6CTEwNzgyCitNQU4JOgkxCToJODgyOTQKK01BTktPTk8JOgkxCToJMTA4MjYKK09ESUVOTkUJOgkxCToJMjgyNjYKK09VTUUJOgkxCToJMjk1MjEKK1NBS0FTU09VCToJMQk6CTIyMjAwCitTQU4tUEVEUk8JOgkxCToJNzA2MDEKK1NFR1VFTEEJOgkxCToJMjkwMDMKK1NJTkZSQQk6CTEJOgkzMzk3MQorU09VQlJFCToJMQk6CTMzMTYyCitUQUJPVQk6CTEJOgk5NzE0CitUQU5EQQk6CTEJOgkxMTQzMAorVEVOR1JFTEEJOgkxCToJMjIyNjgKK1RJQVNTQUxFCToJMQk6CTE5ODk0CitUT1VCQQk6CTEJOgkxNTU5MworVE9VTU9ESQk6CTEJOgkyMjExNAorVkFWT1VBCToJMQk6CTE3NzE3CitZQU1PVVNTT1VLUk8JOgkxCToJMTEwMDEzCitaVUVOT1VMQQk6CTEJOgkxOTUyMworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSVZPUllDT0FTVF9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JVk9SWUNPQVNUX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNTVmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSVZPUllDT0FTVF9BUkVBLnR4dApAQCAtMCwwICsxLDY5IEBACitJdm9yeSBDb2FzdAk6CTAJOgkzMjI0NjAKK0FnbmViaSA6CTEJOgk5MDgwCitCYWZuZyAJOgkxCToJODcyMAorU2Fzc2FuZHJhIAk6CTEJOgkyNTgwMAorRGVuZ3VlbGUgCToJMQk6CTIwNjAwCitNb250YWduZXMgCToJMQk6CTE2NjAwCitGcm9tYWdlciAJOgkxCToJNjkwMAorSGF1dC1TYXNzYW5kcmEgCToJMQk6CTE1MjAwCitMYWNzIAk6CTEJOgk4OTQwCitMYWd1bmVzIAk6CTEJOgkxNDIwMAorTWFyYWhvdWUgCToJMQk6CTg1MDAKK01veWVuLUNhdmFsbHkgCToJMQk6CTE0MTUwCitNb3llbi1Db21vZSAJOgkxCToJNjkwMAorTnotQ29tb2UgCToJMQk6CTE5NTYwCitTYXZhbmVzIAk6CTEJOgk0MDMyMworU3VkLUJhbmRhbWEgCToJMQk6CTEwNjUwCitTdWQtQ29tb2UgCToJMQk6CTYyNTAKK1ZhbGxlZSBkdSBCYW5kYW1hIAk6CTEJOgkyODUzMAorV29yb2RvdWdvdSAJOgkxCToJMjE5MDAKK1phbnphbiAJOgkxCToJMzgwMDAKK0FCRU5HT1VST1UJOgkxCToJNjU4MAorQUJJREpBTgk6CTEJOgk2NTgwCitBQk9JU1NPCToJMQk6CTY1ODAKK0FEWk9QRQk6CTEJOgk2NTgwCitBR0JPVklMTEUJOgkxCToJNjU4MAorQUdOSUJJTEVLUk8JOgkxCToJNjU4MAorQkFOR09MTwk6CTEJOgk2NTgwCitCRU9VTUkJOgkxCToJNjU4MAorQklBTktPVU1BCToJMQk6CTY1ODAKK0JPTkRPVUtPVQk6CTEJOgk2NTgwCitCT05HT1VBTk9VCToJMQk6CTY1ODAKK0JPVUFGTEUJOgkxCToJNjU4MAorQk9VQUtFCToJMQk6CTY1ODAKK0JPVU5BCToJMQk6CTY1ODAKK0JPVU5ESUFMSQk6CTEJOgk2NTgwCitEQUJBS0FMQQk6CTEJOgk2NTgwCitEQUxPQQk6CTEJOgk2NTgwCitEQU5BTkUJOgkxCToJNjU4MAorREFPVUtSTwk6CTEJOgk2NTgwCitESU1CT0tSTwk6CTEJOgk2NTgwCitESVZPCToJMQk6CTY1ODAKK0RVRUtPVUUJOgkxCToJNjU4MAorRkVSS0VTU0VET1VHT1UJOgkxCToJNjU4MAorR0FHTk9BCToJMQk6CTY1ODAKK0dSQU5ELUxBSE9VCToJMQk6CTY1ODAKK0dVSUdMTwk6CTEJOgk2NTgwCitJU1NJQQk6CTEJOgk2NTgwCitLQVRJT0xBCToJMQk6CTY1ODAKK0tPUkhPR08JOgkxCToJNjU4MAorTEFLT1RBCToJMQk6CTY1ODAKK00nQkFISUFLUk8JOgkxCToJNjU4MAorTUFOCToJMQk6CTY1ODAKK01BTktPTk8JOgkxCToJNjU4MAorT0RJRU5ORQk6CTEJOgk2NTgwCitPVU1FCToJMQk6CTY1ODAKK1NBS0FTU09VCToJMQk6CTY1ODAKK1NBTi1QRURSTwk6CTEJOgk2NTgwCitTRUdVRUxBCToJMQk6CTY1ODAKK1NJTkZSQQk6CTEJOgk2NTgwCitTT1VCUkUJOgkxCToJNjU4MAorVEFCT1UJOgkxCToJNjU4MAorVEFOREEJOgkxCToJNjU4MAorVEVOR1JFTEEJOgkxCToJNjU4MAorVElBU1NBTEUJOgkxCToJNjU4MAorVE9VQkEJOgkxCToJNjU4MAorVE9VTU9ESQk6CTEJOgk2NTgwCitWQVZPVUEJOgkxCToJNjU4MAorWUFNT1VTU09VS1JPCToJMQk6CTY1ODAKK1pVRU5PVUxBCToJMQk6CTY1ODAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JVk9SWUNPQVNUX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0lWT1JZQ09BU1RfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIyNGY4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9JVk9SWUNPQVNUX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsNjkgQEAKK0l2b3J5IENvYXN0CToJMAk6CTE3NjU0ODQzCitBZ25lYmkgOgkxCToJNzIwOTAwCitCYWZpbmcgCToJMQk6CTE3ODQwMAorU2Fzc2FuZHJhIAk6CTEJOgk0NDMyMDAKK0Rlbmd1ZWxlIAk6CTEJOgkyNzcwMDAKK01vbnRhZ25lcyAJOgkxCToJMTEyNTgwMAorRnJvbWFnZXIgCToJMQk6CTY3OTkwMAorSGF1dC1TYXNzYW5kcmEgCToJMQk6CTExODY2MDAKK0xhY3MgCToJMQk6CTU5NzUwMAorTGFndW5lcyAJOgkxCToJNDIxMDIwMAorTWFyYWhvdWUgCToJMQk6CTY1MTcwMAorTW95ZW4tQ2F2YWxseSAJOgkxCToJNDQzMjAwCitNb3llbi1Db21vZSAJOgkxCToJNDg4MjAwCitOemktQ29tb2UgCToJMQk6CTkwOTgwMAorU2F2YW5lcyAJOgkxCToJMTIxNTEwMAorU3VkLUJhbmRhbWEgCToJMQk6CTgyNjMwMAorU3VkLUNvbW9lIAk6CTEJOgk1MzY1MDAKK1ZhbGxlZSBkdSBCYW5kYW1hIAk6CTEJOgkxMzM1NTAwCitXb3JvZG91Z291IAk6CTEJOgk0MDAyMDAKK1phbnphbiAJOgkxCToJODM5MDAwCitBQkVOR09VUk9VCToJMQk6CTU4OTc0CitBQklESkFOCToJMQk6CTE5MzQzNDIKK0FCT0lTU08JOgkxCToJMjEzNDgKK0FEWk9QRQk6CTEJOgkzNTA4NQorQUdCT1ZJTExFCToJMQk6CTQ2MzU5CitBR05JQklMRUtSTwk6CTEJOgkyNDQxMworQkFOR09MTwk6CTEJOgkxMDA0MgorQkVPVU1JCToJMQk6CTEzMDcwCitCSUFOS09VTUEJOgkxCToJMTI5NjUKK0JPTkRPVUtPVQk6CTEJOgkzMzA1MQorQk9OR09VQU5PVQk6CTEJOgkxOTUwNgorQk9VQUZMRQk6CTEJOgkzNDU2MgorQk9VQUtFCToJMQk6CTMzMjk5OQorQk9VTkEJOgkxCToJMjExNTQKK0JPVU5ESUFMSQk6CTEJOgkyMjA0MgorREFCQUtBTEEJOgkxCToJMjMzNDAKK0RBTE9BCToJMQk6CTEyMjkzMworREFOQU5FCToJMQk6CTMwNTA2CitEQU9VS1JPCToJMQk6CTIyNzc3CitESU1CT0tSTwk6CTEJOgkzODE4MworRElWTwk6CTEJOgk3MjQ5NAorRFVFS09VRQk6CTEJOgkyNjc1OQorRkVSS0VTU0VET1VHT1UJOgkxCToJMzUxNTUKK0dBR05PQQk6CTEJOgk4NTU2MworR1JBTkQtTEFIT1UJOgkxCToJMTM0MDAKK0dVSUdMTwk6CTEJOgkyMjE4NworSVNTSUEJOgkxCToJMjg1MjUKK0tBVElPTEEJOgkxCToJMzM4MTMKK0tPUkhPR08JOgkxCToJMTA5NjY1CitMQUtPVEEJOgkxCToJMjE1NzUKK00nQkFISUFLUk8JOgkxCToJMTA3ODIKK01BTgk6CTEJOgk4ODI5NAorTUFOS09OTwk6CTEJOgkxMDgyNgorT0RJRU5ORQk6CTEJOgkyODI2NgorT1VNRQk6CTEJOgkyOTUyMQorU0FLQVNTT1UJOgkxCToJMjIyMDAKK1NBTi1QRURSTwk6CTEJOgk3MDYwMQorU0VHVUVMQQk6CTEJOgkyOTAwMworU0lORlJBCToJMQk6CTMzOTcxCitTT1VCUkUJOgkxCToJMzMxNjIKK1RBQk9VCToJMQk6CTk3MTQKK1RBTkRBCToJMQk6CTExNDMwCitURU5HUkVMQQk6CTEJOgkyMjI2OAorVElBU1NBTEUJOgkxCToJMTk4OTQKK1RPVUJBCToJMQk6CTE1NTkzCitUT1VNT0RJCToJMQk6CTIyMTE0CitWQVZPVUEJOgkxCToJMTc3MTcKK1lBTU9VU1NPVUtSTwk6CTEJOgkxMTAwMTMKK1pVRU5PVUxBCToJMQk6CTE5NTIzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSkFQQU5fQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSkFQQU5fQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZmOTZhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9KQVBBTl9BUkVBLnR4dApAQCAtMCwwICsxLDYwIEBACitKYXBhbgk6CTAJOgkzNzc4MzUKK0hva2thaWRvICAgCToJMQk6CTgzNDUzCitBb21vcmkgIAk6CTEJOgk5NjA2CitJd2F0ZSAgCToJMQk6CTE1Mjc4CitNaXlhZ2kgIAk6CTEJOgk3Mjg1CitBa2l0YSAgCToJMQk6CTExNjEyCitZYW1hZ2F0YSAgCToJMQk6CTkzMjMKK0Z1a3VzaGltYSAgCToJMQk6CTEzNzgyCitJYmFyYWtpICAJOgkxCToJNjA5NgorVG9jaGlnaSAgCToJMQk6CTY0MDgKK0d1bW1hICAJOgkxCToJNjM2MworU2FpdGFtYSAgCToJMQk6CTM3OTcKK0NoaWJhICAJOgkxCToJNTE1NgorQ2h1YnUJOgkxCTogNDQ1MAorQ2h1Z29rdQk6CTEJOiA0MjAwCitUb2t5byAtdG8gCToJMQk6CTIxOTcKK0thbmFnYXdhICAJOgkxCToJMjQxNQorTmlpZ2F0YSAgCToJMQk6CTEyNTgyCitUb3lhbWEgIAk6CTEJOgk0MjQ3CitJc2hpa2F3YSAgCToJMQk6CTQxODUKK0Z1a3VpICAJOgkxCToJNDE4OQorWWFtYW5hc2hpICAJOgkxCToJNDQ2NQorTmFnYW5vICAJOgkxCToJMTM1ODUKK0dpZnUgIAk6CTEJOgkxMDU5OAorU2hpenVva2EgIAk6CTEJOgk3Nzc5CitBaWNoaSAgCToJMQk6CTUxNTYKK01pZSAgCToJMQk6CTU3NzYKK1NoaWdhICAJOgkxCToJNDAxNworS3lvdG8gIAk6CTEJOgk0NjEzCitPc2FrYSAgCToJMQk6CTE4OTMKK0h5b2dvICAJOgkxCToJODM5MgorTmFyYSAgCToJMQk6CTM2OTEKK1dha2F5YW1hICAJOgkxCToJNDcyNgorVG90dG9yaSAgCToJMQk6CTM1MDcKK1NoaW1hbmUgIAk6CTEJOgk2NzA3CitPa2F5YW1hICAJOgkxCToJNzExMgorSGlyb3NoaW1hICAJOgkxCToJODQ3NworWWFtYWd1Y2hpICAJOgkxCToJNjExMAorVG9rdXNoaW1hICAJOgkxCToJNDE0NQorS2FnYXdhICAJOgkxCToJMTg3NgorRWhpbWUgIAk6CTEJOgk1Njc2CitLb2NoaSAgCToJMQk6CTcxMDUKK0thbnRvCToJMQk6IDQxMDAKK0tpbmtpCToJMQk6IDUxNTAKK0t5dXNodQk6CTEJOiA0NTAwCitGdWt1b2thICAJOgkxCToJNDk3MQorU2FnYSAgCToJMQk6CTI0MzkKK05hZ2FzYWtpICAJOgkxCToJNDA5MgorS3VtYW1vdG8gIAk6CTEJOgk3NDA0CitPaXRhICAJOgkxCToJNjMzOAorTWl5YXpha2kgIAk6CTEJOgk3NzM0CitLYWdvc2hpbWEgIAk6CTEJOgk5MTg3CitPa2luYXdhICAJOgkxCToJMjI3MQorSG9rdXJpa3UJOgkxCTogNTMwMAorUnl1a2l1LUlzbGFuZHMJOgkxCTogNDUwMAorU2hpa29rdQk6CTEJOiA2MTIwCitUb2hva3UgOgkxCTogNDc1MAorVG9rYWkJOgkxCTogNDQwMAorCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9KQVBBTl9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9KQVBBTl9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWRlNWZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0pBUEFOX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsNjMgQEAKK0phcGFuCToJMAk6CTEyNzQ2MzYxMQorSG9ra2FpZG8gICAJOgkxCToJNTYyNzQyNAorQW9tb3JpICAJOgkxCToJMTQzNjYyOAorSXdhdGUgIAk6CTEJOgkxMzg1MDM3CitNaXlhZ2kgIAk6CTEJOgkyMzU5OTkxCitBa2l0YSAgCToJMQk6CTExNDU0NzEKK1lhbWFnYXRhICAJOgkxCToJMTIxNjExNgorRnVrdXNoaW1hICAJOgkxCToJMjA5MTIyMworSWJhcmFraSAgCToJMQk6CTI5NzUwMjMKK1RvY2hpZ2kgIAk6CTEJOgkyMDE2NDUyCitHdW1tYSAgCToJMQk6CTIwMjQwNDQKK1NhaXRhbWEgIAk6CTEJOgk3MDUzNjg5CitDaGliYSAgCToJMQk6CTYwNTYxNTkKK0NodWJ1CToJMQk6IDc5NTY3CitDaHVnb2t1CToJMQk6IDExMDE0MAorVG9reW8gIAk6CTEJOgkxMjU3MDkwNAorS2FuYWdhd2EgIAk6CTEJOgk4NzkwOTAwCitOaWlnYXRhICAJOgkxCToJMjQzMTM5NgorVG95YW1hICAJOgkxCToJMTExMTYwMgorSXNoaWthd2EgIAk6CTEJOgkxMTczOTk0CitGdWt1aSAgCToJMQk6CTgyMTU4OQorWWFtYW5hc2hpICAJOgkxCToJODg0NTMxCitOYWdhbm8gIAk6CTEJOgkyMTk2MDEyCitHaWZ1ICAJOgkxCToJMjEwNzI5MworU2hpenVva2EgIAk6CTEJOgkzNzkyNDU3CitBaWNoaSAgCToJMQk6CTcyNTQ0MzIKK01pZSAgCToJMQk6CTE4NjcxNjYKK1NoaWdhICAJOgkxCToJMTM4MDM0MworS3lvdG8gIAk6CTEJOgkyNjQ3NTIzCitLYW50byA6CTEJOiAyNDU2MjYKK0tpbmtpCToJMQk6IDYxMDU4CitLeXVzaHUJOgkxCTogNTYwMDQ4CitPc2FrYSAgCToJMQk6CTg4MTcwMTAKK0h5b2dvICAJOgkxCToJNTU5MDM4MQorTmFyYSAgCToJMQk6CTE0MjEzNjcKK1dha2F5YW1hICAJOgkxCToJMTAzNjA2MQorVG90dG9yaSAgCToJMQk6CTYwNjk0NworU2hpbWFuZSAgCToJMQk6CTc0MjEzNQorT2theWFtYSAgCToJMQk6CTE5NTcwNTYKK0hpcm9zaGltYSAgCToJMQk6CTI4NzY3NjIKK1lhbWFndWNoaSAgCToJMQk6CTE0OTI1NzUKK1Rva3VzaGltYSAgCToJMQk6CTgwOTk3NAorS2FnYXdhICAJOgkxCToJMTAxMjI2MQorRWhpbWUgIAk6CTEJOgkxNDY3ODI0CitLb2NoaSAgCToJMQk6CTc5NjIxMQorRnVrdW9rYSAgCToJMQk6CTUwNDkxMjYKK1NhZ2EgIAk6CTEJOgk4NjY0MDIKK05hZ2FzYWtpICAJOgkxCToJMTQ3ODYzMAorS3VtYW1vdG8gIAk6CTEJOgkxODQyMTQwCitPaXRhICAJOgkxCToJMTIwOTU4NworTWl5YXpha2kgIAk6CTEJOgkxMTUyOTkzCitLYWdvc2hpbWEgIAk6CTEJOgkxNzUzMTQ0CitPa2luYXdhICAJOgkxCToJMTM2MDgzMAorSG9rdXJpa3UJOgkxCTogMjE2MTQ2CitSeXVraXUtSXNsYW5kcwk6CTEJOiA1NjUwMworU2hpa29rdQk6CTEJOiAxMTUyODYKK1RvaG9rdQk6CTEJOiAxNDQ5MTcKK1Rva2FpCToJMQk6IDc5MzMyCisKKworCisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0pPUkRBTl9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9KT1JEQU5fQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyOWE5MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9KT1JEQU5fQVJFQS50eHQKQEAgLTAsMCArMSwxMyBAQAoram9yZGFuCToJMAk6CTkyMzAwCithamx1bgk6CTEJOgk0MTIKK0FtbWFuCToJMQk6CTgyMzEKK2FsIGFxYWJhaAk6CTEJOgk2NTgzCitTYWx0IChCQUxRQSkJOgkxCToJMTA3NgorSXJiaWQJOgkxCToJMTYyMQoramFyYXNoCToJMQk6CTQwMgorS2FyYWsJOgkxCToJMzIxNworTWEtYW4JOgkxCToJMzMxNjMKK21hZGFiYQk6CTEJOgkyMDA4CitNYWZyYXEJOgkxCToJMjY0MzUKK1RhZmlsYQk6CTEJOgkyMTE0CitaYXJxYQk6CTEJOgk0MDgwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvSk9SREFOX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0pPUkRBTl9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTRhNzA2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0pPUkRBTl9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDEzIEBACitqb3JkYW4JOgkwCToJNTkwNjc2MAorYWpsdW4JOgkxCToJMTE4NDk2CitBbW1hbgk6CTEJOgkxOTM5NDA1CithbCBhcWFiYWgJOgkxCToJMTAxNzM2CitTYWx0IChCQUxRQSkJOgkxCToJMzQ0OTg1CitJcmJpZAk6CTEJOgk5MjU3MzYKK2phcmFzaAk6CTEJOgkxNTM2NTAKK0thcmFrCToJMQk6CTIwNDEzNQorTWEtYW4JOgkxCToJOTI2NzIKK21hZGFiYQk6CTEJOgkxMjk3OTIKK01hZnJhcQk6CTEJOgkyNDA1MTUKK1RhZmlsYQk6CTEJOgk3NTI5MAorWmFycWEJOgkxCToJNzc0NTY5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvS0FaQUtIU1RBTl9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9LQVpBS0hTVEFOX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTE0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvS0FaQUtIU1RBTl9BUkVBLnR4dApAQCAtMCwwICsxLDI3IEBACitrYXpha2hzdGFuCToJMAk6CTI3MTczMDAKK0FsbWEtYXRhCToJMQk6CTIyMzkwMAorQWxtYXR5IHFhbGEgCToJMQk6CTMwMAorQXFtb2xhCToJMQk6CTEyMTQwMAorQXF0b2JlCToJMQk6CTMwMDYwMAorQXN0YW5hIHFhbGEgCToJMQk6CTMwMAorQXR5cmF1CToJMQk6CTExODYwMAorTm9ydGggS2F6YWtoc3Rhbgk6CTEJOgkxNTEzMDAKK01hbmdnaHlzdGF1CToJMQk6CTE2NTYwMAorRWFzdCBLYXpha2hzdGFuCToJMQk6CTExNzMwMAorUGF2bG9kYXIJOgkxCToJMTI0ODAwCitLYXJhZ2FuZGEgW0R6aGV6a2F6Z2FuXQk6CTEJOgk0MjgwMDAKK0t1c3RhbmF5CToJMQk6CTE5NjAwMAorS3p5bC1vcmRhCToJMQk6CTIyNjAwMAorU2h5Z2h5cyBRYXphcXN0YW4JOgkxCToJMjgzMzAwCitTb2x0/HN0aWsgUWF6YXFzdGFuCToJMQk6CTEyMzIwMAorWmhhbWJ5bAk6CTEJOgkxNDQzMDAKK0FrdHl1Ymluc2sgOiAxIDogMzAwNjAwCitBcmFsIFNlYSA6IDEgOiA2ODAwMAorQ2hpbWtlbnQgOiAxIDogMTE3MzAwCitEemhhbWJ1bCA6IDEgOiAxNDQzMDAgCitHdXJ5ZXYgOiAxIDogMTE4NjAwCitLb2NoZXRhdiA6IDEgIDogMTQ2MjAwCitTZW1pcGFsYXRpbnNrIDogMSA6IDIyNjAwMAorVGFsZHkgS3VyZ2FuIDogMSA6IDEyNDgwMAorVHNlbGlub2dyYWQgOiAxIDogNzAwCitVcmFsc2sgOiAxIDogMTUxMzAwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvS0FaQUtIU1RBTl9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9LQVpBS0hTVEFOX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NjQ1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvS0FaQUtIU1RBTl9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDI5IEBACitrYXpha2hzdGFuCToJMAk6CTE1MjMzMjQ0CitBbG1hLWF0YQk6CTEJOgkxNTU4NTAwCitBbG1hdHkgcWFsYSAJOgkxCToJMTEyOTQwMAorQXFtb2xhCToJMQk6CTgzNjMwMAorQXF0b2JlCToJMQk6CTY4MjYwMAorQXN0YW5hIHFhbGEgCToJMQk6CTMxOTMwMAorQXR5cmF1CToJMQk6CTQ0MDMwMAorTm9ydGggS2F6YWtoc3Rhbgk6CTEJOgk2MTY4MDAKK01hbmdnaHlzdGF1CToJMQk6CTMxNDcwMAorRWFzdCBLYXpha2hzdGFuCToJMQk6CTE5NzgzMDAKK1BhdmxvZGFyCToJMQk6CTgwNzAwMAorS2FyYWdhbmRhCToJMQk6CTE0MTAyMDAKK0t1c3RhbmF5CToJMQk6CTEwMTc3MDAKK0t6eWwtb3JkYQk6CTEJOgk1OTYyMDAKK1NoeWdoeXMgUWF6YXFzdGFuCToJMQk6CTE1MzEwMDAKK1NvbHT8c3RpayBRYXphcXN0YW4JOgkxCToJNzI2MDAwCitaaGFtYnlsCToJMQk6CTk4ODgwMAorQWt0eXViaW5zayA6IDEgOiAyNTMwODgKK0FyYWwgU2VhIDogMSA6IDAKK0NoaW1rZW50IDogMSA6IDM2MDA3OAorRHpoYW1idWwgOiAxIDogMzMwMTI1CitEemhlemthemdhbiA6IDEgOiA5MDAwMAorR3VyeWV2IDogMSA6IDE0MjQ5NworS29jaGV0YXYgOiAxICA6IDEyMzM4OQorU2VtaXBhbGF0aW5zayA6IDEgOiAyNjk1NzQKK1RhbGR5IEt1cmdhbiA6IDEgOiA5ODAwMAorVHNlbGlub2dyYWQgOiAxIDogMzEyOTY1CitVcmFsc2sgOiAxIDogMTk1NDU5CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9LRU5ZQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9LRU5ZQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWVhNDBmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0tFTllBX0FSRUEudHh0CkBAIC0wLDAgKzEsMTEgQEAKK0tlbnlhCToJMAk6CTU4MjY1MAorQ2VudHJhbDIgW0NlbnRyYWxdICAJOgkxCToJMTMyMjMKK0NvYXN0IAk6CTEJOgk4MzM1OQorRWFzdGVybiAJOgkxCToJMTY3NTI1CitOYWlyb2JpIAk6CTEJOgk2OTYKK04uIEVhc3Rlcm4gCToJMQk6CTEyNzE5NworTnlhbnphIAk6CTEJOgkxNjE4MgorUmlmdCBWYWxsZXkgCToJMQk6CTE4NTI5OAorV2VzdGVybiAJOgkxCToJODQwMAorCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9LRU5ZQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9LRU5ZQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGYxZTdmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0tFTllBX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsOSBAQAorS2VueWEJOgkwCToJMzQ3MDc4MTcKK0NlbnRyYWwyIFtDZW50cmFsXSAgCToJMQk6CTM3MjQxNTkKK0NvYXN0IAk6CTEJOgkyNDg3MjY0CitFYXN0ZXJuIAk6CTEJOgk0NjMxNzc5CitOYWlyb2JpIAk6CTEJOgkyMTQzMjU0CitOLiBFYXN0ZXJuIAk6CTEJOgk5NjIxNDMKK055YW56YSAJOgkxCToJNDM5MjE5NgorUmlmdCBWYWxsZXkgCToJMQk6CTY5ODcwMzYKK1dlc3Rlcm4gCToJMQk6CTMzNTg3NzYKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9LVVdBSVRfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvS1VXQUlUX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTNhMDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvS1VXQUlUX0FSRUEudHh0CkBAIC0wLDAgKzEsOCBAQAorS3V3YWl0CToJMAk6CTE3ODIwCitLdXdhaXQgOiAxIDogMTc4MTgKK2FsIGFobWFkaQk6CTEJOgkwCithbCBmYXJhbml5YWgJOgkxCToJMAorYWwgamFocmEJOgkxCToJMAorY2FwaXRhbAk6CTEJOgkwCittdWhhZmF6YXQJOgkxCToJMAorYWwta2FiZWVyCToJMQk6CTAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9LVVdBSVRfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvS1VXQUlUX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYzhiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvS1VXQUlUX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsOCBAQAorS3V3YWl0CToJMAk6CTI0MTgzOTMKK0t1d2FpdCA6IDEgOiAyNDE4MzkzCithbCBhaG1hZGkJOgkxCToJMzY0NDg0CithbCBmYXJhbml5YWgJOgkxCToJNTcyMjUyCithbCBqYWhyYQk6CTEJOgkyODIzNTMKK2NhcGl0YWwJOgkxCToJMzg4NTMyCittdWhhZmF6YXQJOgkxCToJNDg4Mjk0CithbC1rYWJlZXIJOgkxCToJMTQ0OTgxCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvS1lSR1laU1RBTl9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9LWVJHWVpTVEFOX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNTY2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvS1lSR1laU1RBTl9BUkVBLnR4dApAQCAtMCwwICsxLDEwIEBACitLeXJneXpzdGFuCToJMAk6CTE5ODUwMAorQmF0a2VuCToJMQk6CTE3MDIzLjkwCitDaHVpCToJMQk6CTE4Njg0LjQwCitJc3N5ay1rdWwJOgkxCToJNDMxMTQuMDAKK0phbGFsLUFiYWQJOgkxCToJMzM2NDcuNTAKK1NoYWFyeSBCaXNoa2VrIAk6CTEJOgkxMjcuMworTmFyeW4JOgkxCToJNDY3MDYuOTAKK09zaAk6CTEJOgkyOTE2NS4xMAorVGFsYXMJOgkxCToJMTE0NDUuOTAKK0tpcmdoaXppc3RhbiBUZXJyaXRvcmllcyA6IDEgOiAxODE0MwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0tZUkdZWlNUQU5fUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvS1lSR1laU1RBTl9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGYyYjEzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0tZUkdZWlNUQU5fUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxMCBAQAorS3lyZ3l6c3Rhbgk6CTAJOgk1MjEzODk4CitCYXRrZW4JOgkxCToJMzgyNDI2CitDaHVpCToJMQk6CTc3MDgxMQorSXNzeWsta3VsCToJMQk6CTQxMzE0OQorSmFsYWwtQWJhZAk6CTEJOgk4NjkyNTkKK1NoYWFyeSBCaXNoa2VrIAk6CTEJOgk3NjIzMDgKK05hcnluCToJMQk6CTI0OTExNQorT3NoCToJMQk6CTExNzU5OTgKK1RhbGFzCToJMQk6CTE5OTg3MgorS2lyZ2hpemlzdGFuIFRlcnJpdG9yaWVzIDogMSA6IDI1MDAwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTEFPU19BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MQU9TX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZWJkYTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTEFPU19BUkVBLnR4dApAQCAtMCwwICsxLDIwIEBACitMYW9zCToJMAk6CTIzNjgwMAorQXR0b3B1ICAJOgkxCToJMTAzMjAKK0Jva2VvIAk6CTEJOgk2MTk2CitCb2xpa2hhbXhhaSBbQm9saWtoYW1zYWldIAk6CTEJOgkxNDg2MworQ2hhbXBhc3NhayBbQ2hhbXBhc3NhY2tdCToJMQk6CTE1NDE1CitIb3VhcGhhbiBbSG91YXBoYW5oXQk6CTEJOgkxNjUwMAorS2hhbW1vdWFuIFtLaGFtbW91YW5lXQk6CTEJOgkxNjMxNQorTG91YW5nIE5hbXRoYSBbTmFtdGhhXQk6CTEJOgk5MzI1CitMb3VhbmdwaGFiYW5nIFtMdWFuZyBQcmFiYW5nXQk6CTEJOgkxNjg3NQorT3Vkb214YWkgW091ZG9teGF5XQk6CTEJOgkxNTM3MAorUGhvbmdzYWxpIFtQaG9uZ3NhbHldCToJMQk6CTE2MjcwCitTYWxhdmFuIFtTYXJhdmFuZV0gOgkxCToJMTA2OTEKK1NhdmFubmFraGV0IAk6CTEJOgkyMTc3NAorVmllbnRpYW5lIFtWaWVudGlhbmUgKE11bmljLildIAk6CTEJOgkxNTkyNworTmFraG9uIFZpZW50aWFuZSBbVmllbnRpYW5lIDJdCToJMQk6CTM5MjAKK0tob3XobmcgWGFpZ25hYm91bGkgW1NheWFib3VyaV0JOgkxCToJMTYzODkKK0to6XRwaGlz6XQgWGFpc29tYm91biAJOgkxCToJNzEwNQorS2hvdehuZyBYZWtvbmcgW1Nla29uZ10JOgkxCToJNzY2NQorWGlhbmdraG91YW5nIAk6CTEJOgkxNTg4MAorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTEFPU19QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MQU9TX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNDAxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTEFPU19QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDE5IEBACitMYW9zCToJMAk6CTYzNjg0ODEKK0F0dG9wdSAgCToJMQk6CTg3NzAwCitCb2tlbyAJOgkxCToJMTE0OTAwCitCb2xpa2hhbXhhaSBbQm9saWtoYW1zYWldIAk6CTEJOgkxNjQ5MDAKK0NoYW1wYXNzYWsgW0NoYW1wYXNzYWNrXQk6CTEJOgk1MDMzMDAKK0hvdWFwaGFuIFtIb3VhcGhhbmhdIAk6CTEJOgkyNDczMDAKK0toYW1tb3VhbiBbS2hhbW1vdWFuZV0gCToJMQk6CTI3NTQwMAorTG91YW5nIE5hbXRoYSBbTmFtdGhhXQk6CTEJOgkxMTUyMDAKK0xvdWFuZ3BoYWJhbmcgW0x1YW5nIFByYWJhbmddCToJMQk6CTM2NzIwMAorT3Vkb214YWkgW091ZG9teGF5XQk6CTEJOgkyMTEzMDAKK1Bob25nc2FsaSBbUGhvbmdzYWx5XQk6CTEJOgkxNTM0MDAKK1NhbGF2YW4gW1NhcmF2YW5lXSAJOgkxCToJMjU4MzAwCitTYXZhbm5ha2hldCAJOgkxCToJNjc0OTAwCitWaWVudGlhbmUgW1ZpZW50aWFuZSAoTXVuaWMuKV0gOgkxCToJMjg2ODAwCitOYWtob24gVmllbnRpYW5lIFtWaWVudGlhbmUgMl0JOgkxCToJNTMxODAwCitLaG916G5nIFhhaWduYWJvdWxpIFtTYXlhYm91cmldCToJMQk6CTI5MzMwMAorS2jpdHBoaXPpdCBYYWlzb21ib3VuIDoJMQk6CTAKK0tob3XobmcgWGVrb25nIFtTZWtvbmddCToJMQk6CTY0MjAwCitYaWFuZ2tob3VhbmcgCToJMQk6CTIwMTIwMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MQVRWSUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTEFUVklBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDk2MjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTEFUVklBX0FSRUEudHh0CkBAIC0wLDAgKzEgQEAKK0xBVFZJQSA6IDAgOiA2NDU4OQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0xBVFZJQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MQVRWSUFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkzMTgwMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MQVRWSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSBAQAorTEFUVklBIDogMCA6IDIzNzczODMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MRUJBTk9OX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0xFQkFOT05fQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzNzhiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MRUJBTk9OX0FSRUEudHh0CkBAIC0wLDAgKzEsOSBAQAorTGViYW5vbgk6CTAJOgkxMDQwMAorTGViYW5vbiA6IDEgOiAxMDQwMAorQmVpcnV0ICAJOgkxCToJMTkuNgorQmVrYWEgCToJMQk6CTQxNjAuOTAKK01vdW50IExlYmFub24gCToJMQk6CTE5NjguMzAKK05hYmF0aXllIAk6CTEJOgkxMDk4LjAwCitOb3J0aCAJOgkxCToJMjAyNC44MAorU291dGggCToJMQk6CTkyOS42CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MRUJBTk9OX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0xFQkFOT05fUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JkNGYxMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MRUJBTk9OX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsOCBAQAorTGViYW5vbgk6CTAJOgkzODc0MDUwCitMZWJhbm9uIDogMSA6IDM4NzQwNTAKK0JlaXJ1dCAgCToJMQk6CTQwNzQwMworQmVrYWEgCToJMQk6CTM5OTg5MAorTW91bnQgTGViYW5vbiAJOgkxCToJMTE0NTQ1OAorTmFiYXRpeWUgCToJMQk6CTIwNTQxMgorTm9ydGggCToJMQk6CTY3MDYwOQorU291dGggCToJMQk6CTI4MzA1NgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0xFU09USE9fQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTEVTT1RIT19BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODIzOWViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0xFU09USE9fQVJFQS50eHQKQEAgLTAsMCArMSwxMiBAQAorbGVzb3Robwk6CTAJOgkzMDM1NQorQmVyZWEgIAk6CTEJOgkyMjIyCitCdXRoYS1CdXRoZSAJOgkxCToJMTc2NworTGVyaWJlIAk6CTEJOgkyODI4CitNYWZldGVuZyAJOgkxCToJMjExOQorTWFzZXJ1IAk6CTEJOgk0Mjc5CitNb2hhbGUncyBIb2VrIAk6CTEJOgkzNTMwCitNb2tob3Rsb25nIAk6CTEJOgk0MDc1CitRYWNoYSdzIE5layBbUXVhY2hhJ3MgTmVrXQk6CTEJOgkyMzQ5CitRdXRoaW5nIAk6CTEJOgkyOTE2CitUaGFiYSBUc2VrYSAJOgkxCToJNDI3MAorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTEVTT1RIT19QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MRVNPVEhPX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhODFjOTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTEVTT1RIT19QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDEyIEBACitsZXNvdGhvCToJMAk6CTIwMjIzMzEKK0JlcmVhICAJOgkxCToJMzAwNTU3CitCdXRoYS1CdXRoZSAJOgkxCToJMTI2OTA3CitMZXJpYmUgCToJMQk6CTM2MjMzOQorTWFmZXRlbmcgCToJMQk6CTIzODk0NgorTWFzZXJ1IAk6CTEJOgk0Nzc1OTkKK01vaGFsZSdzIEhvZWsgCToJMQk6CTIwNjg0MgorTW9raG90bG9uZyAJOgkxCToJODk3MDUKK1FhY2hhJ3MgTmVrIFtRdWFjaGEncyBOZWtdCToJMQk6CTgwMzIzCitRdXRoaW5nIAk6CTEJOgkxNDA2NDEKK1RoYWJhIFRzZWthIAk6CTEJOgkxMzM2ODAKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0xJQkVSSUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTElCRVJJQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTNiYjhmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0xJQkVSSUFfQVJFQS50eHQKQEAgLTAsMCArMSwxOCBAQAorTGliZXJpYQk6CTAJOgkxMTEzNzAKK0JvbWkgVGVyci4JOgkxCToJMTk1NQorQm9uZwk6CTEJOgk4MDk5CitHYmFycG9sdSBDb3VudHkgCToJMQk6CTc3MjMKK0dyYW5kIEJhc3NhCToJMQk6CTg3NTkKK0dyYW5kIENhcGUgTW91bnQJOgkxCToJNTgyNworR3JhbmQgR2VkZWgJOgkxCToJMTcwMjkKK0dyYW5kIEtydSBDb3VudHkgW0tydSBDb2FzdCBUZXJyLl0JOgkxCToJNDAwMAorTG9mYQk6CTEJOgkxMTYzNworTWFyZ2liaQk6CTEJOgkzMjYzCitNYXJ5bGFuZAk6CTEJOgk1MzUxCitNb250c2VycmFkbwk6CTEJOgkyNzQwCitOaW1iYQk6CTEJOgkxMjA0MworUml2ZXIgQ2VzcyBbUml2ZXJjZXNzIFRlcnIuXQk6CTEJOgk0Mzg1CitSaXZlciBHZWUJOgkxCToJMAorU2lub2UJOgkxCToJMTAyNTQKK1Nhc3N0b3duIFRlcnIuIDogMSA6IDUzNTEKK01hcnNoYWxsIFRlcnIuIDogMSA6IDI3NDAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTElCRVJJQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MSUJFUklBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNzY3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTElCRVJJQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDE4IEBACitMaWJlcmlhCToJMAk6CTMwNDIwMDQKK0JvbWkgVGVyci4JOgkxCToJMTE0MzE2CitCb25nCToJMQk6CTI5OTgyNQorR2JhcnBvbHUgQ291bnR5IAk6CTEJOgkwCitHcmFuZCBCYXNzYQk6CTEJOgkyMTUzMzgKK0dyYW5kIENhcGUgTW91bnQJOgkxCToJMTIwMTQxCitHcmFuZCBHZWRlaAk6CTEJOgk5NDQ5NworR3JhbmQgS3J1IENvdW50eSBbS3J1IENvYXN0IFRlcnIuXQk6CTEJOgkzOTA2MgorTG9mYQk6CTEJOgkzNTE0OTIKK01hcmdpYmkJOgkxCToJMjE5NDE3CitNYXJ5bGFuZAk6CTEJOgk3MTk3NworTW9udHNlcnJhZG8JOgkxCToJODQzNzgzCitOaW1iYQk6CTEJOgkzMzg4ODcKK1JpdmVyIENlc3MgW1JpdmVyY2VzcyBUZXJyLl0JOgkxCToJMzgxNjcKK1JpdmVyIEdlZQk6CTEJOgkwCitTaW5vZQk6CTEJOgk3OTI0MQorU2Fzc3Rvd24gVGVyci4gOiAxIDogMTE1MjQKK01hcnNoYWxsIFRlcnIuIDogMSA6IDI4NTQzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTElCWUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTElCWUFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjZmRjOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MSUJZQV9BUkVBLnR4dApAQCAtMCwwICsxLDQxIEBACitMaWJ5YQk6CTAJOgkxNzc3MDYwCitBamRhYml5YSAoQWdlZGFiaWEpCToJMQk6CTkxNjIwCitUdWJydXEgKFRvYnJ1aykgW0FsIEJ1dD9uYS1uXSAJOgkxCToJODM4NjAKK0FsIEg/aXphLW0gYWwgQWtoZD9hciAJOgkxCToJMTI4MDAKK0FsIEphYmFsIGFsIEFraGRhciAJOgkxCToJNzgwMAorQWwgQXppeml5YWggW0FsIEppZmEtcmFoXSAJOgkxCToJMTk0MAorQWwgSnVmcmFoIAk6CTEJOgkxMTc0MTAKK0FsIEt1ZnJhaCAJOgkxCToJNDgzNTEwCitBbCBNYXJqIAk6CTEJOgkxMDAwMAorQWwgTWFycWFiIAk6CTEJOgkzMDAwCitBbCBRYXQ/cnUtbiAJOgkxCTogMzMwMAorQWwgUXViYmFoIAk6CTEJOgkxNDcyMgorQWwgV2EtaD9haCAJOgkxCToJMTA4NjcwCitBbCBLaG9tcyAJOgkxCToJNTI1MAorQXNoIFNoYXRpIAk6CTEJOgk1MjUwCitBeiB6YXdpYSAoQXp6YXdpeWEpIAk6CTEJOgkxNTIwCitCYW5naGF6aSAJOgkxCToJODAwCitCYW5pLSBXYWxpLWQgCToJMQk6CTE5NzEwCitEYXJuYWggCToJMQk6CTQ5MDgKK0doYWRhbWlzIAk6CTEJOgk1MTc1MAorR2hhcnlhbiAJOgkxCToJNDY2MAorR2hhLXQgCToJMQk6CTcyNzAwCitKYWdoYnUtYiAJOgkxCToJMzM4NDcKK01pc3VyYXRhIAk6CTEJOgkyNzcwCitNaXpkYWggCToJMQk6CTcyMTgwCitNdXJ6dXEgCToJMQk6CTM0OTc5MAorTmEtbHUtdCAJOgkxCToJMTUzMDAKK1NhYmhhCToJMQk6CTE1MzMwCitTP2FicmEtdGFoIFM/dXJtYS1uIAk6CTEJOgkxMzcwCitTdXJ0IChTaXJ0ZSkJOgkxCToJNzc2NjAKK1RhLWp1LXJhLScgd2EgYW4gTmF3YS1oP2kgYWwgQXJiYS0/IAk6CTEJOgk1ODQwCitUcmlwb2xpIChUYXJhYnVsdXMpCToJMQk6CTE4MzAKK1Rhcmh1bmFoCToJMQk6CTU4NDAKK0F3YmFyaSAodWJhcmkpIFtXYS1kaS0gYWwgSD9heWEtdF0gCToJMQk6CTMxODkwCitZYWZyYW4gKFllZnJlbikgCToJMQk6CTkzMTAKK05VUUFUIEFMIEtIQU1TIFtadXdhcmFdIDogMSA6IDE1NjI0OCAKK0FsIEZhdGFoIDogMSA6IDQzNworU0FXRkFKSklOIChTT0ZVTEpFRU4pIDogMSA6IDI4MjkwCQorWkVMRUlUSU4gKFpMSVRFTikgOiAxIDogMzczOAorCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MSUJZQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MSUJZQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDU0MzAzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0xJQllBX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsNDMgQEAKK0xpYnlhCToJMAk6CTU5MDA3NTQKK0FqZGFiaXlhIChBZ2VkYWJpYSkJOgkxCToJMTY1ODM5CitUdWJydVEgKFRvYnJ1aykgW0FsIEJ1dD9uYS1uXSAJOgkxCToJNDUyNzE0CitBbCBIP2l6YS1tIGFsIEFraGQ/YXIgCToJMQk6CTEwODg2MAorQWwgSmFiYWwgYWwgQWtoZGFyIAk6CTEJOgkxOTQxODUKK0FsIEF6aXppeWFoIFtBbCBKaWZhLXJhaF0gCToJMQk6CTI4OTM0MAorQWwgSnVmcmFoIAk6CTEJOgk0NTExNworQWwgS3VmcmFoIAk6CTEJOgk1MTQzMworQWwgTWFyaiAJOgkxCToJMTE2MzE4CitBbCBNYXJxYWIgCToJMQk6CTMyODI5MgorQWwgUWF0P3J1LW4gCToJMQk6CTgwOTc4IAorQWwgUXViYmFoIAk6CTEJOgk4OTU5MworQWwgV2EtaD9haCAJOgkxCToJMjkyNTcKK0FsIEtob21zIAk6CTEJOgkyMDg5NTQKK0FzaCBTaGF0aSAJOgkxCToJNzcyMDMKK0F6IHphd2lhIChBenphd2l5YSkgCToJMQk6CTE5NzE3NworQmFuZ2hhemkgCToJMQk6CTYzNjk5MgorQmFuaS0gV2FsaS1kIAk6CTEJOgk3NzQyNAorRGFybmFoIAk6CTEJOgk4MTE3NAorR2hhZGFtaXMgCToJMQk6CTE5MDAwCitHaGFyeWFuIAk6CTEJOgkxNjE0MDgKK0doYS10IAk6CTEJOgkyMjc3MAorSmFnaGJ1LWIgCToJMQk6CSA3MDkwCitNaXN1cmF0YSAJOgkxCToJMzYwMjUxCitNaXpkYWggCToJMQk6CTQxNDc2CitNdXJ6dXEgCToJMQk6CTY4NzE4CitOYS1sdS10IAk6CTEJOgk4NjgwMQorU2FiaGEJOgkxCToJMTI2NjEwCitTP2FicmEtdGFoIFM/dXJtYS1uIAk6CTEJOgkxNTI1MjEKK1N1cnQgW1N1cnQgKFNpcnRlKV0JOgkxCToJMTU2Mzg5CitUYS1qdS1yYS0nIHdhIGFuIE5hd2EtaD9pIGFsIEFyYmEtPyAJOgkxCToJIDkwODAKK1RyaXBvbGkgKFRhcmFidWx1cykJOgkxCToJMTE0OTk1NworVGFyaHVuYWgJOgkxCToJMjk2MDkyCitBd2JhcmkgKHViYXJpKSBbV2EtZGktIGFsIEg/YXlhLXRdIAk6CTEJOgk3MjU4NworWWFmcmFuIChZZWZyZW4pIAk6CTEJOgkxMTcKK05VUUFUIEFMIEtIQU1TIFtadXdhcmFdIDogMSA6IDE4MDQwMAorQWwgRmF0YWggOiAxIDogODY4MDAKK1NBV0ZBSkpJTiAoU09GVUxKRUVOKSA6IDEgOiA5MzY4OAkKK1pFTEVJVElOIChaTElURU4pIDogMSA6IDI5NTgwCisKKworCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MSUVDSFRFTlNURUlOX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0xJRUNIVEVOU1RFSU5fQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmNGMyZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MSUVDSFRFTlNURUlOX0FSRUEudHh0CkBAIC0wLDAgKzEgQEAKKyBMaWNodGVuc3RlaW4gOiAxIDogMTYwLjAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MSUVDSFRFTlNURUlOX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0xJRUNIVEVOU1RFSU5fUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljMGE1YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MSUVDSFRFTlNURUlOX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEgQEAKKyBMaWNodGVuc3RlaW4gOiAxIDogMzMzMDcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MSVRIVUFOSUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTElUSFVBTklBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOGE2N2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTElUSFVBTklBX0FSRUEudHh0CkBAIC0wLDAgKzEgQEAKK0xJVEhVQU5JQSA6IDAgOiA2NTMwMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0xJVEhVQU5JQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MSVRIVUFOSUFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzMTJmYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MSVRIVUFOSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSBAQAorTElUSFVBTklBIDogMCA6IDM0ODM5NzIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MVVhFTUJPVVJHX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL0xVWEVNQk9VUkdfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdjMmNlZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MVVhFTUJPVVJHX0FSRUEudHh0CkBAIC0wLDAgKzEgQEAKKyBMVVhFTUJPVVJHIChHUkFORC1EVUNIRSkgOiAxIDogMjU4Ni4wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTFVYRU1CT1VSR19QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9MVVhFTUJPVVJHX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YTFhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTFVYRU1CT1VSR19QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxIEBACisgTFVYRU1CT1VSRyAoR1JBTkQtRFVDSEUpIDogMSA6IDAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NQUNBVV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NQUNBVV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjYxZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01BQ0FVX0FSRUEudHh0CkBAIC0wLDAgKzEsNSBAQAorTUFDQVU6MDoyNQorTUFDQVU6MTo0Ljk4MAorTUFDQVUtMToyOjIuNTY3OTUyCitNQUNBVS0zOjI6MS43MDE4ODMKK01BQ0FVLTI6MjoxLjAwMDAwMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01BQ0FVX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01BQ0FVX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNDBiMjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTUFDQVVfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSw1IEBACitNQUNBVTowOjM4ODU3NjoxNTU0My4wNDAwMDAKK01BQ0FVOjE6Mzg4NTc2Ojc4MDI3LjMwOTIzNworTUFDQVUtMToyOjEyOTUyNTo1MDQzOS4xNTY3MDMKK01BQ0FVLTI6MjoxMjk1MjU6MTI5NTI1LjMzMzMzMworTUFDQVUtMzoyOjEyOTUyNTo3NjEwNy4wNzI3NzQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NQUNFRE9OSUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTUFDRURPTklBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZWI3YmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTUFDRURPTklBX0FSRUEudHh0CkBAIC0wLDAgKzEsMTI3IEBACitNYWNlZG9uaWEJOgkwCToJMjUzMzMKK0FyYWNpbm92byAgCToJMQk6CTAKK0JhYwk6CTEJOgkwCitCZWxjaXN0YSAJOgkxCToJMAorQmVyb3ZvIAk6CTEJOgkwCitCaXN0cmljYSAJOgkxCToJMAorQml0b2xhIAk6CTEJOgkwCitCbGF0ZWMgCToJMQk6CTAKK0JvZ2RhbmNpIAk6CTEJOgkwCitCb2dvbWlsYSAJOgkxCToJMAorQm9nb3ZpbmplIAk6CTEJOgkwCitCb3NpbG92byAJOgkxCToJMAorQnJ2ZW5pY2EgCToJMQk6CTAKK0NhcGFyaSAJOgkxCToJMAorQ2VudGFyIAk6CTEJOgkwCitDZW50YXIgWnVwYSAJOgkxCToJMAorQyhhaXIgCToJMQk6CTAKK0MoYZprYSAJOgkxCToJMAorQyhlZ3JhbmUgCToJMQk6CTAKK0MoZZppbm92byAJOgkxCToJMAorQyh1Yyhlci1TYW5kZXZvIAk6CTEJOgkwCitEZWJhciAJOgkxCToJMAorRGVsYyhldm8gCToJMQk6CTAKK0RlbG9nb55kaSAJOgkxCToJMAorRGVtaXIgSGlzYXIgCToJMQk6CTAKK0RlbWlyIEthcGlqYSAJOgkxCToJMAorRG9icnWaZXZvIAk6CTEJOgkwCitEb2xuYSBCYW5qaWNhIAk6CTEJOgkwCitEb2xuZW5pIAk6CTEJOgkwCitEcnVnb3ZvIAk6CTEJOgkwCitEnmVwYyhpmnRlIAk6CTEJOgkwCitHYXppIEJhYmEgCToJMQk6CTAKK0dldmdlbGlqYSAJOgkxCToJMAorP29yY2hlIFBldHJvdiAJOgkxCToJMAorR29zdGl2YXIgCToJMQk6CTAKK0dyYWRza28gCToJMQk6CTAKK0lsaW5kZW4gCToJMQk6CTAKK0l6dm9yIAk6CTEJOgkwCitKZWd1bm92Y2UgCToJMQk6CTAKK0thbWVuamFuZSAJOgkxCToJMAorS2FyYmluY2kgCToJMQk6CTAKK0thcnBvmiAJOgkxCToJMAorS2F2YWRhcmNpIAk6CTEJOgkwCitLaWMoZXZvIAk6CTEJOgkwCitLaXNlbGEgVm9kYSAJOgkxCToJMAorS2xlYyhldmNlIAk6CTEJOgkwCitLb2MoYW5pIAk6CTEJOgkwCitLb25jKGUgCToJMQk6CTAKK0tvbmRvdm8gCToJMQk6CTAKK0tvbm9waZp0ZSAJOgkxCToJMAorS29zZWwgCToJMQk6CTAKK0tyYXRvdm8gCToJMQk6CTAKK0tyaXZhIFBhbGFua2EgCToJMQk6CTAKK0tyaXZvZ2GadGFuaSAJOgkxCToJMAorS3J1mmV2byAJOgkxCToJMAorS3VrbGmaIAk6CTEJOgkwCitLdWt1cmVjKGFuaSAJOgkxCToJMAorS3VtYW5vdm8gCToJMQk6CTAKK0xhYnVuaZp0YSAJOgkxCToJMAorTGlwa292byAJOgkxCToJMAorTG96b3ZvIAk6CTEJOgkwCitMdWtvdm8gCToJMQk6CTAKK01ha2Vkb25za2EgS2FtZW5pY2EgCToJMQk6CTAKK01ha2Vkb25za2kgQnJvZCAJOgkxCToJMAorTWF2cm92aSBBbm92aSAJOgkxCToJMAorTWWaZWmadGEgCToJMQk6CTAKK01pcmF2Y2kgCToJMQk6CTAKK01vZ2lsYSAJOgkxCToJMAorTXVydGlubyAJOgkxCToJMAorTmVnb3Rpbm8gCToJMQk6CTAKK05lZ290aW5vLVBvbG+aa28gCToJMQk6CTAKK05vdmFjaSAJOgkxCToJMAorTm92byBTZWxvIAk6CTEJOgkwCitPYmxlmmV2byAJOgkxCToJMAorT2hyaWQgCToJMQk6CTAKK09yYZphYyAJOgkxCToJMAorT3JpemFyaSAJOgkxCToJMAorT3Nsb21laiAJOgkxCToJMAorUGVoYyhldm8gCToJMQk6CTAKK1BldHJvdmVjIAk6CTEJOgkwCitQbGFzbmljYSAJOgkxCToJMAorUG9kYXJlmiAJOgkxCToJMAorUHJpbGVwIAk6CTEJOgkwCitQcm9iaZp0aXAgCToJMQk6CTAKK1JhZG92aZogCToJMQk6CTAKK1JhbmtvdmNlIAk6CTEJOgkwCitSZXNlbiAJOgkxCToJMAorUm9zb21hbiAJOgkxCToJMAorUm9zdHWaYSAJOgkxCToJMAorU2Ftb2tvdiAJOgkxCToJMAorU2FyYWogCToJMQk6CTAKK4ppcGtvdmljYSAJOgkxCToJMAorinRpcCAJOgkxCToJMAorinV0byBPcml6YXJpIAk6CTEJOgkwCitTb3BpmnRlIAk6CTEJOgkwCitTb3BvdG5pY2EgCToJMQk6CTAKK1NyYmlub3ZvIAk6CTEJOgkwCitTdGFyIERvanJhbiAJOgkxCToJMAorU3RhcmF2aW5hIAk6CTEJOgkwCitTdGFybyBOYWdvcmljKGFuZSAJOgkxCToJMAorU3RydWdhIAk6CTEJOgkwCitTdHJ1bWljYSAJOgkxCToJMAorU3R1ZGVuaWMoYW5pIAk6CTEJOgkwCitTdmV0aSBOaWtvbGUgCToJMQk6CTAKK1RlYXJjZSAJOgkxCToJMAorVGV0b3ZvIAk6CTEJOgkwCitUb3BvbGMoYW5pIAk6CTEJOgkwCitWYWxhbmRvdm8gCToJMQk6CTAKK1Zhc2lsZXZvIAk6CTEJOgkwCitWZWxlcyAJOgkxCToJMAorVmVsZZp0YSAJOgkxCToJMAorVmV2YyhhbmkgCToJMQk6CTAKK1ZpbmljYSAJOgkxCToJMAorVml0b2xpmnRlIAk6CTEJOgkwCitWcmFuZZp0aWNhIAk6CTEJOgkwCitWcmFwYyhpmnRlIAk6CTEJOgkwCitWcmF0bmljYSAJOgkxCToJMAorVnJ1dG9rIAk6CTEJOgkwCitaYWphcyAJOgkxCToJMAorWmVsZW5pa292byAJOgkxCToJMAorjmVsaW5vIAk6CTEJOgkwCiuOaXRvmmUgCToJMQk6CTAKK1psZXRvdm8gCToJMQk6CTAKK1pybm92Y2kgCToJMQk6CTAKKworCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NQUNFRE9OSUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTUFDRURPTklBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZGVkOWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTUFDRURPTklBX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMyBAQAorOjA6MjEwNDAzNToyMTUKK01BS0VET05JSkE6MToyMjY3MDUxOjE4Mi45MjcwMDgKK01BS0VET05JSkE6MjoyMjY3MDUxOjE4Mi45MjcwMDgKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NQURBR0FTQ0FSX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01BREFHQVNDQVJfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VjYWY2NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NQURBR0FTQ0FSX0FSRUEudHh0CkBAIC0wLDAgKzEsMTE4IEBACitNYWRhZ2FzY2FyCToJMAk6CTU4NzA0MAorQW50YW5hbmFyaXZvIDogMSA6IDU4MjgzCitBbWJhdG9sYW1weSAgCToJMQk6CTE3NTUKK0FtYm9oaWRyYXRyaW1vIAk6CTEJOgkxNDAyCitBbmRyYW1hc2luYSAJOgkxCToJMTM3MAorQW5qb3pvcm9iZSAJOgkxCToJMzcxNAorQW5rYXpvYmUgCToJMQk6CTc0NTgKK0FudGFuYW5hcml2by1BdHNpbW9uZHJhbm8gCToJMQk6CTM2OQorQW50YW5hbmFyaXZvLUF2YXJhZHJhbm8gCToJMQk6CTYxNworQW50YW5hbmFyaXZvLVJlbml2b2hpdHJhIAk6CTEJOgk4OAorQW50YW5pZm90c3kgCToJMQk6CTMwMDUKK0FudHNpcmFiZSBJIAk6CTEJOgkxNDQKK0FudHNpcmFiZSBJSSAJOgkxCToJMjI0MQorQXJpdm9uaW1hbW8gCToJMQk6CTE2MjcKK0JldGFmbyAJOgkxCToJODk5NAorRmFyYXRzaWhvIAk6CTEJOgkyMDM0CitGZW5vYXJpdm8tQWZvdm9hbnkgCToJMQk6CTc3NjEKK01hbmpha2FuZHJpYW5hIAk6CTEJOgkxNjYwCitNaWFyaW5hcml2byAJOgkxCToJMjgxOAorU29hdmluYW5kcmlhbmEgCToJMQk6CTE4NTYKK1RzaXJvYW5vbWFuZGlkeSAJOgkxCToJODk3NworQW50c2lyYW5hbmEgCToJMQk6CTQzMDU2CitBbWJhbmphIAk6CTEJOgk2MzI4CitBbWJpbG9iZSAJOgkxCToJNzcxNAorQW5kYXBhIAk6CTEJOgk0NDQ0CitBbnRhbGFoYSAJOgkxCToJNzA4NQorQW50c2lyYW5hbmEgSSAJOgkxCToJMjIyCitBbnRzaXJhbmFuYSBJSSAJOgkxCToJNjAyNQorTm9zeS1CZSAJOgkxCToJMjQyCitTYW1iYXZhIAk6CTEJOgk0NzgwCitWb2hpbWFyaW5hIAk6CTEJOgk4MjA0CitGaWFuYXJhbnRzb2EgCToJMQk6CTEwMjM3MworQW1iYWxhdmFvIAk6CTEJOgk1MTUxCitBbWJhdG9maW5hbmRyYWhhbmEgCToJMQk6CTEwMzg2CitBbWJvaGltYWhhc29hIAk6CTEJOgkyNTYwCitBbWJvc2l0cmEgCToJMQk6CTMxOTkKK0JlZm90YWthIAk6CTEJOgkzMDk3CitGYW5kcmlhbmEgCToJMQk6CTIyMzIKK0ZhcmFmYW5nYW5hIAk6CTEJOgkyNjIxCitGaWFuYXJhbnRzb2EgSSAJOgkxCToJNDEKK0ZpYW5hcmFudHNvYSBJSSAJOgkxCToJMzk4NworSWFrb3JhIAk6CTEJOgk0NjMzCitJZmFuYWRpYW5hIAk6CTEJOgkzOTU4CitJaG9zeSAJOgkxCToJMTczNTgKK0lrYWxhbWF2b255IAk6CTEJOgk5MTY2CitJa29uZ28gKEZvcnQtQ2Fybm90KSAJOgkxCToJMzI3MgorSXZvaGliZSAJOgkxCToJNDExOQorTWFuYWthcmEtQXRzaW1vIAk6CTEJOgkyOTYxCitNYW5hbmRyaWFuYSAJOgkxCTogMAkgIAorTWFuYW5qYXJ5IAk6CTEJOgk1MjQ1CitNaWRvbmd5LUF0c2ltbyAJOgkxCToJMjcwMAorTm9zeS1WYXJpa2EgCToJMQk6CTM5MjUKK1ZhbmdhaW5kcmFubyAJOgkxCToJNDg2MQorVm9oaXBlbm8gCToJMQk6CTExNjIKK1ZvbmRyb3pvIAk6CTEJOgkyOTUzCitNYWhhamFuZ2EgCToJMQk6CTE1MDAyMworQW1iYXRvLWJvaW5hIAk6CTEJOgk4MDA1CitBbWJhdG9tYWludHkgCToJMQk6CTUxNjYKK0FuYWxhbGF2YSAJOgkxCToJNDM4MAorQW50c2Fsb3ZhIAk6CTEJOgk3MTk1CitBbnRzb2hpaHkgCToJMQk6CTUxMjUKK0JlYWxhbmFuYSAJOgkxCToJNjU0MworQmVmYW5kcmlhbmEtQXZhcmF0cmEgCToJMQk6CTgzOTQKK0Jlc2FsYW1weSAJOgkxCToJMTE3NTMKK0Jvcml6aW55IChQb3J0LUJlcmdlcikgCToJMQk6CTcwNDcKK0thbmRyZWhvIAk6CTEJOgk2ODE2CitNYWV2YXRhbmFuYSAJOgkxCToJMTEwODUKK01haGFqYW5nYSBJIAk6CTEJOgk5MgorTWFoYWphbmdhIElJIAk6CTEJOgk0MzkwCitNYWludGlyYW5vIAk6CTEJOgkxMDAzMQorTWFtcGlrb255IAk6CTEJOgk0NjExCitNYW5kcml0c2FyYSAJOgkxCToJMTA1MTIKK01hcm92b2F5IAk6CTEJOgkzODA0CitNaXRzaW5qbyAJOgkxCToJNTg5NAorTW9yYWZlbm9iZSAJOgkxCToJNjk3NgorU29hbGFsYSAJOgkxCToJNjU3OAorVHNhcmF0YW5hbmEgCToJMQk6CTEzMjE4CitUb2FtYXNpbmEgCToJMQk6CTcxOTExCitBbWJhdG9uZHJhemFrYSAJOgkxCToJNjA3NworQW1wYXJhZmFyYXZvbGEgCToJMQk6CTM4MTUKK0FuZGlsYW1lbmEgCToJMQk6CTc0MDUKK0Fub3NpYmUgCToJMQk6CTI1OTAKK0FudGFuYW1iYW8tTWFuYW1wb3RzeSAJOgkxCToJMTM0MgorRmVub2FyaXZvLUF0c2luYW5hbmEgCToJMQk6CTMzNjUKK01haGFub3JvIAk6CTEJOgkzOTY4CitNYW5hbmFyYSBBdmFyYXRyYSAJOgkxCToJNDYyMQorTWFyb2FudHNldHJhIAk6CTEJOgk2OTE3CitNYXJvbGFtYm8gCToJMQk6CTM1MzEKK01vcmFtYW5nYSAJOgkxCToJNzI3OAorTm9zeS1Cb3JhaGEgKFNhaW50ZSBNYXJpZSkgCToJMQk6CTIyMgorU29hbmllcmFuYS1Jdm9uZ28gCToJMQk6CTQ4MTQKK1RvYW1hc2luYSBJIAk6CTEJOgkzMjIKK1RvYW1hc2luYSBJSSAJOgkxCToJNDgxNgorVmF0b21hbmRyeSAJOgkxCToJMjYyMAorVmF2YXRlbmluYSAJOgkxCToJMjgyNgorVm9oaWJpbmFueSAoQnJpY2thdmlsbGUpIAk6CTEJOgkgIDAKK1RvbGlhcnkgCToJMQk6CTE2MTQwNQorQW1ib2FzYXJ5LUF0c2ltbyAJOgkxCToJMTAyMTEKK0FtYm92b21iZS1BbmRyb3kgCToJMQk6CTU4MjkKK0FtcGFuaWh5IAk6CTEJOgkxMzAzNworQW5rYXpvYWJvLUF0c2ltbyAJOgkxCToJNzM4NQorQmVraWx5IAk6CTEJOgk1MDk3CitCZWxvaGEgCToJMQk6CTQ2NjkKK0JlbG9uJ2kgVHNpcmliaWhpbmEgCToJMQk6CTc1NzMKK0JlbmVuaXRyYSAJOgkxCToJNDkxMgorQmVyb3JvaGEgCToJMQk6CTcyMTAKK0JldGlva3ktQXRzaW1vIAk6CTEJOgk5MTAzCitCZXRyb2thIAk6CTEJOgkxMzMxNQorTWFoYWJvIAk6CTEJOgkxMzg2MworTWFuamEgCToJMQk6CTg3MjUKK01pYW5kcml2YXpvIAk6CTEJOgkxMjU0NQorTW9yb21iZSAJOgkxCToJNzYzNAorTW9yb25kYXZhIAk6CTEJOgk1NjQ4CitTYWthcmFoYSAJOgkxCToJODQ0NworVGFvbGFuYXJvIAk6CTEJOgk1Mjc2CitUb2xpYXJ5IEkgCToJMQk6CTM5CitUb2xpYXJ5IElJIAk6CTEJOgk2Nzc2CitUc2lob21iZSAJOgkxCToJMjIyMwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01BREFHQVNDQVJfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTUFEQUdBU0NBUl9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzBkNmUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01BREFHQVNDQVJfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxMTggQEAKK01hZGFnYXNjYXIJOgkwCToJMTg1OTU0NjkKK0FudGFuYW5hcml2byA6IDEgOiA0NTgwNzg4CitBbWJhdG9sYW1weSAgCToJMQk6CTIxNTU0NAorQW1ib2hpZHJhdHJpbW8gCToJMQk6CTIzNTUxNAorQW5kcmFtYXNpbmEgCToJMQk6CTEzOTIxNworQW5qb3pvcm9iZSAJOgkxCToJMTQ1NDEwCitBbmthem9iZSAJOgkxCToJMTExMDY4CitBbnRhbmFuYXJpdm8tQXRzaW1vbmRyYW5vIAk6CTEJOgkyOTIwNTcKK0FudGFuYW5hcml2by1BdmFyYWRyYW5vIAk6CTEJOgkyMDc5NDIKK0FudGFuYW5hcml2by1SZW5pdm9oaXRyYSAJOgkxCToJOTAzNDUwCitBbnRhbmlmb3RzeSAJOgkxCToJMjc4NzQxCitBbnRzaXJhYmUgSSAJOgkxCToJMTYwMzU2CitBbnRzaXJhYmUgSUkgCToJMQk6CTMzMzk3OQorQXJpdm9uaW1hbW8gCToJMQk6CTI2MDI2MQorQmV0YWZvIAk6CTEJOgkzMDE2NzEKK0ZhcmF0c2lobyAJOgkxCToJMTY1MzI3CitGZW5vYXJpdm8tQWZvdm9hbnkgCToJMQk6CTgyNDAyCitNYW5qYWthbmRyaWFuYSAJOgkxCToJMjAyNzcxCitNaWFyaW5hcml2byAJOgkxCToJMTgxMjE4CitTb2F2aW5hbmRyaWFuYSAJOgkxCToJMTQ3MjE3CitUc2lyb2Fub21hbmRpZHkgCToJMQk6CTIxNjY0MgorQW50c2lyYW5hbmEgCToJMQk6CTExODg0MjUKK0FtYmFuamEgCToJMQk6CTEyNTA1NgorQW1iaWxvYmUgCToJMQk6CTE0MDU1NgorQW5kYXBhIAk6CTEJOgkxNDc3NzIKK0FudGFsYWhhIAk6CTEJOgkxODYzMjIKK0FudHNpcmFuYW5hIEkgCToJMQk6CTczNDkxCitBbnRzaXJhbmFuYSBJSSAJOgkxCToJNzE0MTYKK05vc3ktQmUgCToJMQk6CTM2NjM2CitTYW1iYXZhIAk6CTEJOgkyMzc0ODgKK1ZvaGltYXJpbmEgCToJMQk6CTE2OTY4NworRmlhbmFyYW50c29hIAk6CTEJOgkzMzY2MjkxCitBbWJhbGF2YW8gCToJMQk6CTE5MDAxMgorQW1iYXRvZmluYW5kcmFoYW5hIAk6CTEJOgkxMTYwNjYKK0FtYm9oaW1haGFzb2EgCToJMQk6CTE5NzI3OQorQW1ib3NpdHJhIAk6CTEJOgkyMjkxMjMKK0JlZm90YWthIAk6CTEJOgkyNDA0NQorRmFuZHJpYW5hIAk6CTEJOgkxODk1NDQKK0ZhcmFmYW5nYW5hIAk6CTEJOgkyMDcxNjcKK0ZpYW5hcmFudHNvYSBJIAk6CTEJOgkxNDQyMjUKK0ZpYW5hcmFudHNvYSBJSSAJOgkxCToJNDMxMDExCitJYWtvcmEgCToJMQk6CTI5OTg3CitJZmFuYWRpYW5hIAk6CTEJOgkxMzY4OTkKK0lob3N5IAk6CTEJOgkxMDY1OTEKK0lrYWxhbWF2b255IAk6CTEJOgk1NjE0OAorSWtvbmdvIChGb3J0LUNhcm5vdCkgCToJMQk6CTEwNzc0OAorSXZvaGliZSAJOgkxCToJMzQyODkKK01hbmFrYXJhLUF0c2ltbyAJOgkxCToJMjM1NzY0CitNYW5hbmRyaWFuYSAJOgkxCToJOTA2OTMKK01hbmFuamFyeSAJOgkxCToJMjMzNjk3CitNaWRvbmd5LUF0c2ltbyAJOgkxCToJMjU5MTEKK05vc3ktVmFyaWthIAk6CTEJOgkxNzc4MTcKK1ZhbmdhaW5kcmFubyAJOgkxCToJMjEwMDI4CitWb2hpcGVubyAJOgkxCToJOTg3MDEKK1ZvbmRyb3pvIAk6CTEJOgk5MzU0NworTWFoYWphbmdhIAk6CTEJOgkxNzMzOTE3CitBbWJhdG8tYm9pbmEgCToJMQk6CTEwODgwNworQW1iYXRvbWFpbnR5IAk6CTEJOgkxOTUwOQorQW5hbGFsYXZhIAk6CTEJOgk4OTkxNworQW50c2Fsb3ZhIAk6CTEJOgkzMDA2MgorQW50c29oaWh5IAk6CTEJOgkxMDc3MTcKK0JlYWxhbmFuYSAJOgkxCToJMTAwNzUwCitCZWZhbmRyaWFuYS1BdmFyYXRyYSAJOgkxCToJMTY5NDIzCitCZXNhbGFtcHkgCToJMQk6CTM3NzgyCitCb3JpemlueSAoUG9ydC1CZXJnZXIpIAk6CTEJOgkxMDM2NjgKK0thbmRyZWhvIAk6CTEJOgkxMTg5MgorTWFldmF0YW5hbmEgCToJMQk6CTEwNjYyNAorTWFoYWphbmdhIEkgCToJMQk6CTEzNTY2MAorTWFoYWphbmdhIElJIAk6CTEJOgk0Njc5MAorTWFpbnRpcmFubyAJOgkxCToJNTI3MDAKK01hbXBpa29ueSAJOgkxCToJODQzNzUKK01hbmRyaXRzYXJhIAk6CTEJOgkyMDQ1MDMKK01hcm92b2F5IAk6CTEJOgkxMjQ3MzkKK01pdHNpbmpvIAk6CTEJOgk1MzQwNQorTW9yYWZlbm9iZSAJOgkxCToJMjA0NzUKK1NvYWxhbGEgCToJMQk6CTI3NDM0CitUc2FyYXRhbmFuYSAJOgkxCToJOTc2ODUKK1RvYW1hc2luYSAJOgkxCToJMjU5MzA2MworQW1iYXRvbmRyYXpha2EgCToJMQk6CTI0MDEyMworQW1wYXJhZmFyYXZvbGEgCToJMQk6CTIxMjkyMgorQW5kaWxhbWVuYSAJOgkxCToJNDExMzUKK0Fub3NpYmUgCToJMQk6CTg0OTgyCitBbnRhbmFtYmFvLU1hbmFtcG90c3kgCToJMQk6CTQ2MTc0CitGZW5vYXJpdm8tQXRzaW5hbmFuYSAJOgkxCToJMjQwNTk1CitNYWhhbm9ybyAJOgkxCToJMjEyMTE4CitNYW5hbmFyYSBBdmFyYXRyYSAJOgkxCToJMTA2MTg0CitNYXJvYW50c2V0cmEgCToJMQk6CTE2NzQxNQorTWFyb2xhbWJvIAk6CTEJOgkxMjAwNTEKK01vcmFtYW5nYSAJOgkxCToJMjE3OTUzCitOb3N5LUJvcmFoYSAoU2FpbnRlIE1hcmllKSAJOgkxCToJMTYzMjUKK1NvYW5pZXJhbmEtSXZvbmdvIAk6CTEJOgk5OTM3MworVG9hbWFzaW5hIEkgCToJMQk6CTE3OTA0NQorVG9hbWFzaW5hIElJIAk6CTEJOgkxNjgzODgKK1ZhdG9tYW5kcnkgCToJMQk6CTEyOTE0NgorVmF2YXRlbmluYSAJOgkxCToJMTUxODMzCitWb2hpYmluYW55IChCcmlja2F2aWxsZSkgCToJMQk6CTE1OTMwMQorVG9saWFyeSAJOgkxCToJMjIyOTU1MAorQW1ib2FzYXJ5LUF0c2ltbyAJOgkxCToJMTUxMjQ1CitBbWJvdm9tYmUtQW5kcm95IAk6CTEJOgkxODM3MzQKK0FtcGFuaWh5IAk6CTEJOgkyMDUyODIKK0Fua2F6b2Fiby1BdHNpbW8gCToJMQk6CTQ3OTQ5CitCZWtpbHkgCToJMQk6CTEyNDc2NAorQmVsb2hhIAk6CTEJOgk2MzcwOQorQmVsb24naSBUc2lyaWJpaGluYSAJOgkxCToJNTI2NzQKK0JlbmVuaXRyYSAJOgkxCToJMjYzMTYKK0Jlcm9yb2hhIAk6CTEJOgkzOTI0MQorQmV0aW9reS1BdHNpbW8gCToJMQk6CTE2NTE5OQorQmV0cm9rYSAJOgkxCToJMTM0NzcxCitNYWhhYm8gCToJMQk6CTg2MzgzCitNYW5qYSAJOgkxCToJNTY1MzIKK01pYW5kcml2YXpvIAk6CTEJOgk4MjQ0NworTW9yb21iZSAJOgkxCToJOTY3NjUKK01vcm9uZGF2YSAJOgkxCToJODA1ODYKK1Nha2FyYWhhIAk6CTEJOgk2Nzg3MAorVGFvbGFuYXJvIAk6CTEJOgkyMTMyNzAKK1RvbGlhcnkgSSAJOgkxCToJMTAxNjYxCitUb2xpYXJ5IElJIAk6CTEJOgkxODQyNTYKK1RzaWhvbWJlIAk6CTEJOgk2NDg5NgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01BTEFXSV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NQUxBV0lfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExZjU4YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NQUxBV0lfQVJFQS50eHQKQEAgLTAsMCArMSw0IEBACitNYWxhd2kJOgkwCToJMTE4NDgwCitDZW50cmFsNCBbQ2VudHJhbF0JOgkxCToJMzU1OTIKK05vcnRoZXJuMSBbTm9ydGhlcm5dCToJMQk6CTI2Mjc2CitTb3V0aGVybjIgW1NvdXRoZXJuXQk6CTEJOgkzMTc1MwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01BTEFXSV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NQUxBV0lfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiNGEzYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NQUxBV0lfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSw0IEBACitNYWxhd2kJOgkwCToJMTMwMTM5MjYKK0NlbnRyYWw0IFtDZW50cmFsIFJlZ2lvbl0JOgkxCToJNDk5Mjc1MworTm9ydGhlcm4xIFtOb3J0aGVybiBSZWdpb25dCToJMQk6CTE0Mjc4MDcKK1NvdXRoZXJuMiBbU291dGhlcm4gUmVnaW9uXQk6CTEJOgk1NTE3Mzc0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTUFMSV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NQUxJX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NGM4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTUFMSV9BUkVBLnR4dApAQCAtMCwwICsxIEBACitNQUxJIDogMCA6IDEyNDIyNDgKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NQUxJX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01BTElfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxNmYyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NQUxJX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEgQEAKK01BTEkgOiAwIDogMTA5NTExNzYKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NQVVSSVRBTklBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01BVVJJVEFOSUFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2NGMzNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NQVVSSVRBTklBX0FSRUEudHh0CkBAIC0wLDAgKzEgQEAKK01BVVJJVEFOSUEgOiAwIDogMTAzMDcwMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01BVVJJVEFOSUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTUFVUklUQU5JQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODZhYzQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01BVVJJVEFOSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSBAQAorTUFVUklUQU5JQSA6IDAgOiAyNTA4MTU5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTUFVUklUSVVTX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01BVVJJVElVU19BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2IyNmZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01BVVJJVElVU19BUkVBLnR4dApAQCAtMCwwICsxLDE0IEBACitNYXVyaXRpdXMgOiAwIDogMjA0MAorTWF1cml0aXVzIDogMSA6IDIwNDAKK0JsYWNrIFJpdmVyICAJOgkxCToJMAorRmxhY3EgCToJMQk6CTAKK0dyYW5kIFBvcnQgCToJMQk6CTAKK01va2EgCToJMQk6CTAKK1BhbXBsZW1vdXNzZXMgCToJMQk6CTAKK1BsYWluZSBXaWxoZW1zIAk6CTEJOgkwCitQb3J0IExvdWlzIAk6CTEJOgkwCitSaXZpZXJlIGR1IFJlbXBhcnQgCToJMQk6CTAKK1NhdmFubmUgCToJMQk6CTAKK0lzbGFuZCBvZiBSb2RyaWd1ZXMgCToJMQk6CTEwNAorCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NQVVSSVRJVVNfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTUFVUklUSVVTX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNDRiZmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTUFVUklUSVVTX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMTIgQEAKK01hdXJpdGl1cyA6IDAgOiAxMjQ1MDAwCitNYXVyaXRpdXMgOiAxIDogMTI0NTAwMAorQmxhY2sgUml2ZXIgIAk6CTEJOgk2MDU4NworRmxhY3EgCToJMQk6CTEyNjgzOQorR3JhbmQgUG9ydCAJOgkxCToJMTA2NjY1CitNb2thIAk6CTEJOgk3NTQ3OQorUGFtcGxlbW91c3NlcyAJOgkxCToJMTIyMjUyCitQbGFpbmUgV2lsaGVtcyAJOgkxCToJMzU4MTgyCitQb3J0IExvdWlzIAk6CTEJOgkxMjc4NTUKK1JpdmllcmUgZHUgUmVtcGFydCAJOgkxCToJOTg4NTQKK1NhdmFubmUgCToJMQk6CTY2MzU2CitJc2xhbmQgb2YgUm9kcmlndWVzIAk6CTEJOgkzNTc3OQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01FWElDT19BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NRVhJQ09fQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzNTNjOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NRVhJQ09fQVJFQS50eHQKQEAgLTAsMCArMSwzMyBAQAorTWV4aWNvCToJMAk6CTE5NzI1NTAKK0FndWFzY2FsaWVudGVzICAgCToJMQk6CTU1NjkKK0JhamEgQ2FsaWZvcm5pYSBOb3J0ZSAJOgkxCToJNzAxMTMKK0JhamEgQ2FsaWZvcm5pYSBTdXIgCToJMQk6CTczNjc3CitDYW1wZWNoZSAJOgkxCToJNTY4NTkKK0NoaWFwYXMgCToJMQk6CTc1NjI5CitDaGlodWFodWEgCToJMQk6CTI0NzA4NworQ29haHVpbGEgZGUgWmFyYWdvemEgCToJMQk6CTE1MTU3MQorQ29saW1hIAk6CTEJOgk1NDU1CitEaXN0cml0byBGZWRlcmFsIAk6CTEJOgkxNDk5CitEdXJhbmdvIAk6CTEJOgkxMTk2NDgKK0d1YW5hanVhdG8gCToJMQk6CTMwMzUwCitHdWVycmVybyAJOgkxCToJNjM3NDkKK0hpZGFsZ28gCToJMQk6CTIwOTg3CitKYWxpc2NvIAk6CTEJOgk4MDEzNworTWV4aWNvCToJMQk6CTIxNDYxCitNaWNob2FjYW4gZGUgT2NhbXBvIAk6CTEJOgk1OTg2NAorTW9yZWxvcyAJOgkxCToJNDk0MQorTmF5YXJpdCAJOgkxCToJMjczMzYKK051ZXZvIExlb24JOgkxCToJNjQ1NTUKK09heGFjYSAJOgkxCToJOTQ5NjQKK1B1ZWJsYSAJOgkxCToJMzM5MTkKK1F1ZXJldGFybyBkZSBBcnRlYWdhIAk6CTEJOgkxMTc2OQorUXVpbnRhbmEgUm9vIAk6CTEJOgk1MDg0MworU2FuIEx1aXMgUG90b3NpCToJMQk6CTYwNTQ3CitTaW5hbG9hIAk6CTEJOgk1ODA5MgorU29ub3JhIAk6CTEJOgkxODQ5MzQKK1RhYmFzY28gCToJMQk6CTI0NjYxCitUYW1hdWxpcGFzIAk6CTEJOgk3OTgyOQorVGxheGNhbGEgCToJMQk6CTQwNjEKK1ZlcmFjcnV6LUxsYXZlIAk6CTEJOgk3MjgxNQorWXVjYXRhbiAJOgkxCToJMzkzMzcKK1phY2F0ZWNhcyAJOgkxCToJNzQ1MTYKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NRVhJQ09fUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTUVYSUNPX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZjljZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTUVYSUNPX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMzMgQEAKK01leGljbwk6CTAJOgkxMDc0NDk1MjUKK0FndWFzY2FsaWVudGVzICAgCToJMQk6CTEwNjU0MTYKK0JhamEgQ2FsaWZvcm5pYSBOb3J0ZSAJOgkxCToJMjg0NDQ2OQorQmFqYSBDYWxpZm9ybmlhIFN1ciAJOgkxCToJNTEyMTcwCitDYW1wZWNoZSAJOgkxCToJNzU0NzMwCitDaGlhcGFzIAk6CTEJOgk0MjkzNDU5CitDaGlodWFodWEgCToJMQk6CTMyNDE0NDQKK0NvYWh1aWxhIGRlIFphcmFnb3phIAk6CTEJOgkyNDk1MjAwCitDb2xpbWEgCToJMQk6CTU2Nzk5NgorRGlzdHJpdG8gRmVkZXJhbCAJOgkxCToJODcyMDkxNgorRHVyYW5nbyAJOgkxCToJMTUwOTExNworR3VhbmFqdWF0byAJOgkxCToJNDg5MzgxMgorR3VlcnJlcm8gCToJMQk6CTMxMTUyMDIKK0hpZGFsZ28gCToJMQk6CTIzNDU1MTQKK0phbGlzY28gCToJMQk6CTY3NTIxMTMKK01leGljbwk6CTEJOgkxNDAwNzQ5NQorTWljaG9hY2FuIGRlIE9jYW1wbyAJOgkxCToJMzk2NjA3MworTW9yZWxvcyAJOgkxCToJMTYxMjg5OQorTmF5YXJpdCAJOgkxCToJOTQ5Njg0CitOdWV2byBMZW9uCToJMQk6CTQxOTkyOTIKK09heGFjYSAJOgkxCToJMzUwNjgyMQorUHVlYmxhIAk6CTEJOgk1MzgzMTMzCitRdWVyZXRhcm8gZGUgQXJ0ZWFnYSAJOgkxCToJMTU5ODEzOQorUXVpbnRhbmEgUm9vIAk6CTEJOgkxMTM1MzA5CitTYW4gTHVpcyBQb3Rvc2kJOgkxCToJMjQxMDQxNAorU2luYWxvYSAJOgkxCToJMjYwODQ0MgorU29ub3JhIAk6CTEJOgkyMzk0ODYxCitUYWJhc2NvIAk6CTEJOgkxOTg5OTY5CitUYW1hdWxpcGFzIAk6CTEJOgkzMDI0MjM4CitUbGF4Y2FsYSAJOgkxCToJMTA2ODIwNworVmVyYWNydXotTGxhdmUgCToJMQk6CTcxMTAyMTQKK1l1Y2F0YW4gCToJMQk6CTE4MTg5NDgKK1phY2F0ZWNhcyAJOgkxCToJMTM2NzY5MgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01PTERPVkFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTU9MRE9WQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTk4YTJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01PTERPVkFfQVJFQS50eHQKQEAgLTAsMCArMSwzIEBACitNT0xET1ZBOjA6MTMwNjcKK01PTERBVklBOjE6MTI5NjAuMjEwCitNT0xEQVZJQToyOjEyOTYwLjIxMDAwMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NT0xET1ZBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01PTERPVkFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3OWEzMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NT0xET1ZBX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMyBAQAorOjA6NDQ3MzU3MDozNDIKK01PTERBVklBOjE6NDQ3MzU3MDozNDUuMTc3Mjc3CitNT0xEQVZJQToyOjQ0NzM1NzA6MzQ1LjE3NzI3NwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01PTERPVklBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01PTERPVklBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OGJkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTU9MRE9WSUFfQVJFQS50eHQKQEAgLTAsMCArMSwzIEBACitNT0xET1ZBOjA6MTMwNjcKK01PTERBVklBOjE6MTI5NjAuMjEwCitNT0xEQVZJQToyOjEyOTYwLjIxMDAwMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01PTERPVklBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01PTERPVklBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OGY3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTU9MRE9WSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwzIEBACitNT0xEQVZJQTowOjQ0NzM1NzA6MzQyCitNT0xEQVZJQToxOjQ0NzM1NzA6MzQ1LjE3NzI3NworTU9MREFWSUE6Mjo0NDczNTcwOjM0NS4xNzcyNzcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NT05BQ09fUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTU9OQUNPX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZTI5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTU9OQUNPX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEgQEAKKzowOjI3NDA5OjM2NTQ1CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTU9OR09MSUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTU9OR09MSUFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0NDhlZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NT05HT0xJQV9BUkVBLnR4dApAQCAtMCwwICsxLDIzIEBACitNb25nb2xpYQk6CTAJOgkxNTY0MTE2CitBcmhhbmdheQk6CTEJOgk1NTMwMAorQmF5YW4tT2xnaXkJOgkxCToJNDU3MDAKK0JheWFuaG9uZ29yCToJMQk6CTExNjAwMAorQnVsZ2FuCToJMQk6CTQ4NzAwCitHb3ZpLWFsdGF5CToJMQk6CTE0MTQwMAorQ2hvaXIgCToJMQk6CTU1NDAKK1NhaW5zaGFuZCBbRG9ybm9nb3ZpXQk6CTEJOgkxMDk1MDAKK0Rvcm5vZAk6CTEJOgkxMjM2MDAKK0R1bmRnb3ZpCToJMQk6CTc0NzAwCitEemF2aGFuCToJMQk6CTgyNTAwCitBcnZhaWtoZWVyIFtPdm9yaGFuZ2F5XQk6CTEJOgk2MjkwMAorRGFsYW56YWRnYWQgW09tbm9nb3ZpXSAJOgkxCToJMTY1NDAwCitCYXJ1dW4tVXJ0IAk6CTEJOgk4MjMwMAorU3VoYmFhdGFyIFtTZWxlbmdlXQk6CTEJOgk0MTEwMAorVG92CToJMQk6CTc0MDAwCitVdnMJOgkxCToJNjk2MDAKK0tob3ZkIFtIb3ZkXQk6CTEJOgk3NjEwMAorTXVydW4gW0hvdnNnb2xdCToJMQk6CTEwMDYwMAorVW5kdXJraGFhbiBbSGVudGl5XQk6CTEJOgk4MDMwMAorRGFya2hhbiAJOgkxCToJMzI4MAorRXJkZW5ldCAJOgkxCToJODQwCitVbGFhbmJhYXRhciAJOgkxCToJNDcwMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01PTkdPTElBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01PTkdPTElBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NmNkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTU9OR09MSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwyMyBAQAorTW9uZ29saWEJOgkwCToJMjgzMjIyNAorQXJoYW5nYXkJOgkxCToJOTcwOTEKK0JheWFuLU9sZ2l5CToJMQk6CTkxMDY4CitCYXlhbmhvbmdvcgk6CTEJOgk4NDc3OQorQnVsZ2FuCToJMQk6CTYxNzc2CitHb3ZpLWFsdGF5CToJMQk6CTYzNjczCitDaG9pciAJOgkxCToJMTIyMzAKK1NhaW5zaGFuZCBbRG9ybm9nb3ZpXQk6CTEJOgk1MDU3NQorRG9ybm9kCToJMQk6CTc1MzczCitEdW5kZ292aQk6CTEJOgk1MTUxNworRHphdmhhbgk6CTEJOgk4OTk5OQorQXJ2YWlraGVlciBbT3ZvcmhhbmdheV0gCToJMQk6CTExMTQyMAorRGFsYW56YWRnYWQgW09tbm9nb3ZpXQk6CTEJOgk0Njg1OAorQmFydXVuLVVydCAJOgkxCToJNTYxNjYKK1N1aGJhYXRhciBbU2VsZW5nZV0JOgkxCToJOTk5NTAKK1Rvdgk6CTEJOgk5OTI2OAorVXZzCToJMQk6CTkwMDM3CitLaG92ZCBbSG92ZF0JOgkxCToJODY4MzEKK011cnVuIFtIb3ZzZ29sXQk6CTEJOgkxMTkwNjMKK1VuZHVya2hhYW4gW0hlbnRpeV0JOgkxCToJNzA5NDYKK0RhcmtoYW4gCToJMQk6CTgzMjcxCitFcmRlbmV0IAk6CTEJOgk3MTUyNQorVWxhYW5iYWF0YXIgCToJMQk6CTc2MDA3NwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01PUk9DQ09fQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTU9ST0NDT19BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWViZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01PUk9DQ09fQVJFQS50eHQKQEAgLTAsMCArMSwxNyBAQAorTW9yb2Njbwk6CTAJOgk0NDY1NTAKK0NlbnRyZSBOb3JkIFtDZW50cmVdIFtSZWdpb24gZGUgQ2hhb3VpYSAtIE91YXJkaWdoYV0JOgkxCToJNzAxMAorUmVnaW9uIGRlIERvdWthbGEgLSBBZGJhCToJMQk6CTEzMjg1CitSZWdpb24gZGUgRuhzIC0gQm91bGVtYW5lIAlG6HMJOgkxCToJMTk3OTUKK1JlZ2lvbiBkZSBHaGFyYiAtIENocmFyZGEgLSBC6W5pIEhzc2VuIAk6CTEJOgk4ODA1CitOb3JkIE91ZXN0IFtSZWdpb24gZHUgR3JhbmQtQ2FzYWJsYW5jYV0JOgkxCToJMTYxNQorQ2VudHJlIFN1ZCBbUmVnaW9uIGRlIEd1ZWxtaW0gLSBFcy1TZW1hcmFdIAk6CTEJOgkxMjI4MjUKK1JlZ2lvbiBkZSBMYeJ5b3VuZSAtIEJvdWpkb3VyIC0gU2FraWEgRWwgSGFtcmEJOgkxCToJMTM5NDgwCitUZW5zaWZ0IFtSZWdpb24gZGUgTWFycmFrZWNoIC0gVGVuc2lmdCAtIEFsIEhhb3V6XQk6CTEJOgkzMTE2MAorUmVnaW9uIGRlIE1la27ocyAtIFRhZmlsYWxldCAJOgkxCToJNzkyMTAKK09yaWVudGFsIFtSZWdpb24gZGUgbCdPcmllbnRhbF0JOgkxCToJODI5MDAKK1JlZ2lvbiBkZSBPdWVkIEVkLURhaGFiIC0gTGFnb3VpcmEJOgkxCToJNTA4ODAKK1JlZ2lvbiBkZSBSYWJhdCAtIFNhbOkgLSBaZW1tb3VyIC0gWmFlcgk6CTEJOgk5NTgwCitTdWQgW0FnYWRpcl0gW1JlZ2lvbiBkZSBTb3VzcyAtIE1hc3NhIC0gRGFyYeJdIAk6CTEJOgk3MDg4MAorUmVnaW9uIGRlIFRhZGxhIC0gQXppbGFsCToJMQk6CTE3MTI1CitSZWdpb24gZGUgVGFuZ2VyIC0gVOl0b3VhbiAJCToJMQk6CTExNTcwCitSZWdpb24gZGUgVGF6YSAtIEFsIEhvY2XvbWEgLSBUYW91bmF0ZSAJOgkxCToJMjQxNTUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NT1JPQ0NPX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01PUk9DQ09fUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWViMDUyOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NT1JPQ0NPX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMTggQEAKK01vcm9jY28JOgkwCToJMzMyNDEyNTkKK0NlbnRyZSBOb3JkIFtDZW50cmVdIFtSZWdpb24gZGUgQ2hhb3VpYSAtIE91YXJkaWdoYV0JOgkxCToJMTY1NTY2MAorUmVnaW9uIGRlIERvdWthbGEgLSBBZGJhCToJMQk6CTE5ODQwMzkKK1JlZ2lvbiBkZSBG6HMgLSBCb3VsZW1hbmUgCUbocwk6CTEJOgkxNTczMDU1CitSZWdpb24gZGUgR2hhcmIgLSBDaHJhcmRhIC0gQuluaSBIc3NlbiAJOgkxCToJMTg1OTU0MAorTm9yZCBPdWVzdCBbUmVnaW9uIGR1IEdyYW5kLUNhc2FibGFuY2FdCToJMQk6CTM2MzEwNjEKK0NlbnRyZSBTdWQgW1JlZ2lvbiBkZSBHdWVsbWltIC0gRXMtU2VtYXJhXSAJOgkxCToJNDYyNDEwCitSZWdpb24gZGUgTGHieW91bmUgLSBCb3VqZG91ciAtIFNha2lhIEVsIEhhbXJhCToJMQk6CTI1NjE1MgorVGVuc2lmdCBbUmVnaW9uIGRlIE1hcnJha2VjaCAtIFRlbnNpZnQgLSBBbCBIYW91el0JOgkxCToJMzEwMjY1MgorUmVnaW9uIGRlIE1la27ocyAtIFRhZmlsYWxldCAJOgkxCToJMjE0MTUyNworT3JpZW50YWwgW1JlZ2lvbiBkZSBsJ09yaWVudGFsXQk6CTEJOgkxOTE4MDk0CitSZWdpb24gZGUgT3VlZCBFZC1EYWhhYiAtIExhZ291aXJhCToJMQk6CTk5MzY3CitSZWdpb24gZGUgUmFiYXQgLSBTYWzpIC0gWmVtbW91ciAtIFphZXIJOgkxCToJMjM2NjQ5NAorU3VkIFtBZ2FkaXJdIFtSZWdpb24gZGUgU291c3MgLSBNYXNzYSAtIERhcmHiXSAJOgkxCToJMzExMzY1MworUmVnaW9uIGRlIFRhZGxhIC0gQXppbGFsCToJMQk6CTE0NTA1MTkKK1JlZ2lvbiBkZSBUYW5nZXIgLSBU6XRvdWFuIAkJOgkxCToJMjQ3MDM3MgorUmVnaW9uIGRlIFRhemEgLSBBbCBIb2Nl721hIC0gVGFvdW5hdGUgCToJMQk6CTE4MDcxMTMKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01PWkFNQklRVUVfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTU9aQU1CSVFVRV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGI3ZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01PWkFNQklRVUVfQVJFQS50eHQKQEAgLTAsMCArMSwxMiBAQAorTW96YW1iaXF1ZQk6CTAJOgk4MDE1OTAKK0NhYm8gRGVsZ2FkbyAgCToJMQk6CTgyNjI1CitNYXB1dG8gCToJMQk6CTMwMAorR2F6YSAJOgkxCToJNzU3MDkKK0luaGFtYmFuZSAJOgkxCToJNjg2MTUKK01hbmljYSAJOgkxCToJNjE2NjEKK05hbXB1bGEgCToJMQk6CTgxNjA2CitOaWFzc2EgW05hc3NhXQk6CTEJOgkxMjkwNTYKK1Byb3btbmNpYSBkZSBNYXB1dG8gCToJMQk6CTI2MDU4CitTb2ZhbGEgCToJMQk6CTY4MDE4CitUZXRlIAk6CTEJOgkxMDA3MjQKK1phbWJlemlhIAk6CTEJOgkxMDUwMDgKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NT1pBTUJJUVVFX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL01PWkFNQklRVUVfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyNjMxYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NT1pBTUJJUVVFX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMTIgQEAKK01vemFtYmlxdWUJOgkwCToJMTk2ODY1MDUKK0NhYm8gRGVsZ2FkbyAgCToJMQk6CTE0NjU1MzcKK01hcHV0byAJOgkxCToJMTAxODkzOAorR2F6YSAJOgkxCToJMTIwMzI5NAorSW5oYW1iYW5lIAk6CTEJOgkxMjU2MTM5CitNYW5pY2EgCToJMQk6CTExMzc0NDgKK05hbXB1bGEgCToJMQk6CTMyNjU4NTQKK05pYXNzYSBbTmFzc2FdCToJMQk6CTg3MDU0NAorUHJvdu1uY2lhIGRlIE1hcHV0byAJOgkxCToJOTMzOTUxCitTb2ZhbGEgCToJMQk6CTE0NTM5MjgKK1RldGUgCToJMQk6CTEzMTk5MDQKK1phbWJlemlhIAk6CTEJOgkzMzE2NzAzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTVlBTk1BUl9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NWUFOTUFSX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NTcwMjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTVlBTk1BUl9BUkVBLnR4dApAQCAtMCwwICsxLDcyOCBAQAorTVlBTk1BUiAoQlVSTUEpOjA6MjU4NjE3Ljg1MjAwMAorQ0hJTjoxOjE0MzMwLjY0MAorTUFHV0U6MToxNzA0MC44NjkKK1RFTkFTU0VSSU06MToxNTc2Ny45OTAKK0lSUkFXQUREWToxOjEyOTY2LjQ2MAorS0FZQUg6MTo0NTI0LjQ0MworU0hBTjoxOjYwMjMzLjE0MQorQVJBS0FOIChSQUtISU5FKToxOjEzNjA5LjAyMAorTU9OOjE6NDE3MC42NzkKK0tBV1RIVUxFSSAoS0FSRU4pOjE6MTE2OTEuMzMwCitTQUdBSU5HOjE6MzcxMDguNjcyCitCQUdPIChQRUdVKToxOjE0ODkyLjUzMAorWUFOR09OIChSQU5HT09OKToxOjM3MzYuMzA4CitNQU5EQUxBWToxOjE0MTU1LjA5MAorS0FDSElOOjE6MzQzOTAuNjgwCitMQUJVVFRBOjI6MS4wMDAwMDAKK1RBREEtVToyOjI4OC4wNzg5MTIKK1RIT1VOR09POjI6NzU2LjEyODI1MgorQ0hBVU5HWk9OOjI6MS4wMDAwMDAKK01FUkdVSToyOjMuMTE3MTI4CitQQUxBVzoyOjEuMDAwMDAwCitCT0tQWUlOOjI6MS41OTc1ODIKK0RFREFZRToyOjYuNzQwNTk2CitNRVJHVUk6MjoxLjAwMDAwMAorTUVSR1VJOjI6MS4wMDAwMDAKK0tBV1RIQVVORzoyOjEwLjE4OTU2OQorTVlFQk9OOjI6MS43NDAxODYKK01FUkdVSToyOjEuMDAwMDAwCitDT0NPUyBJU0xBTkRTOjI6NS45NDI0MTcKK01FUkdVSToyOjEuMDAwMDAwCitCT0tQWUlOOjI6MS41ODcyODEKK1dFVExFVDoyOjU0OC4yOTgwNTQKK0tBVEhBOjI6OTY0LjY0NjMwMworU0hXRURBVU5HOjI6MzE0LjQ5OTkxNworWUVCWVU6MjoxLjA4Mzk0MQorS0FXVEhBVU5HOjI6MS4wMDAwMDAKK1RBVU5HVVA6MjoxLjEzMDYwOQorTEFCVVRUQToyOjIuMjYzNDY0CitNQS1VQklOOjI6MzI3LjEzNjEwOQorTUVSR1VJOjI6Ni43MTczOTcKK1BPTk5BR1lVTiBBTkQgUkFUSEVEQVVORzoyOjEuOTE1NTAzCitNRVJHVUk6Mjo0LjM4NTkxMworU0lOR0FJTkc6MjoyMDMuMjY2MTM2CitUQVVOR1VQOjI6MS4wMDAwMDAKK05HQVBVVEFXOjI6MTEwMi45NzAyMjUKK1RBWkU6Mjo2ODIuNzgzODY4CitLQVdUSEFVTkc6MjoxLjAwMDAwMAorWUFORE9PTjoyOjMzNS43Nzg3NzYKK0tZQVVLUFlVOjI6MS4wMDAwMDAKK01FUkdVSToyOjEuMDAwMDAwCitMQUJVVFRBOjI6MS4wMDAwMDAKK0xBQlVUVEE6Mjo5LjQ2NTI3MAorSEVOWkFEQToyOjI4NC45MTA2MDUKK01ZRUJPTjoyOjEuOTQ5ODU3CitQQVVLVEFXOjI6MTE2Ljg2NTkwMgorVFdBTlRFOjI6MTkwLjY1NDI1MAorTVlFQk9OOjI6MS4wMDAwMDAKK0JPS1BZSU46MjoxLjU3Nzk5MworS0FXVEhBVU5HOjI6MS4wMDAwMDAKK0FOOjI6Mi44NjU0MjgKK0tZQVVLUFlVOjI6MjE3Ljc5NTIxNAorQk9LUFlJTjoyOjMuNzQ4MzgwCitMQVVOR0xPTjoyOjEuNDY0MzA0CitCT0dBTEU6MjozLjE2NjMwNQorQk9LUFlJTjoyOjIuNjQ3NTQ3CitNRVJHVUk6MjoxLjAwMDAwMAorUEFMQVc6MjoyLjcxOTU0MworTVlBWURFIChBVU5HTEFOKToyOjk5MC43MjcxOTIKK0tBV1RIQVVORzoyOjEuMjg3NTkwCitNT1VMTUVJTjoyOjIzLjA5MTQyNQorRUlOTUU6MjoyNjMuOTE1MzYzCitTWVJJQU06MjoxNDUuMDcwNjI0CitTSURPS1RBWUE6Mjo5NDIuODc5NTU0CitOQVRNQVVLOjI6OTI2LjMxNzY2NgorTUlOR0lOOjI6MTMxNC45Mzc1ODAKK0JPS1BZSU46MjoxLjAwMDAwMAorS1lBVUtQWVU6MjoxLjAwMDAwMAorTUVSR1VJOjI6MS4wMDAwMDAKK0tZQVVLVEFXOjI6Njc2LjA2OTk3OAorS1lBVUtQWVU6MjoyMDQuMzI0Mjg0CitJTkRBVzoyOjYxMC43ODc0MTgKK01BTlNJOjI6MTExMy4xNDA4NDYKK0JPS1BZSU46MjoxLjAwMDAwMAorTUVSR1VJOjI6MS4wMDAwMDAKK01PTkcgWUFJOjI6OTM5Ljc0NzU0OQorUE9OTkFHWVVOIEFORCBSQVRIRURBVU5HOjI6NTY0Ljk0MjQ1MworS1lBVUtQWVU6MjoxLjY2ODM1MgorTUVSR1VJOjI6MS4wOTIxOTcKK1BBVU5HOjI6MS45NzY5NTkKK0hNQVdCSToyOjU1OS41NjYxMzgKK1RBTVU6Mjo2NzMuOTUyODQyCitNWUVCT046Mjo3LjI5Mzg4MAorTkdBWlVOOjI6NDIyLjgyNTI1NQorSEFLQToyOjE1MTUuMjI4MjcwCitLQVdUSEFVTkc6MjoyLjkwNjExOAorTU9NQVVLOjI6OTQ1LjExNjk0NQorTUVSR1VJOjI6MS4wMDAwMDAKK0tBV1RIQVVORzoyOjEuMDAwMDAwCitCT0tQWUlOOjI6MS4wMDAwMDAKK01ZRUJPTjoyOjEuMDAwMDAwCitNWUlOR1lBTjoyOjM2NS43MjI3NTIKK1RIQVRPTjoyOjEuNDg0MjY3CitUSEFCRUlLS1lJTjoyOjk4Ny44MTE3NDkKK0RFREFZRToyOjEuMDAwMDAwCitCT0tQWUlOOjI6MS4wMDAwMDAKK01PTkcgUEFOOjI6MjAyNi44NjU1NDUKK01FUkdVSToyOjEuMDAwMDAwCitNRVJHVUk6MjoxLjA5NDM1NAorVEhMQU5HVExBTkc6MjoxNTE2LjE1NzcxNworS0FXVEhBVU5HOjI6MS4wMDAwMDAKK0tBV1RIQVVORzoyOjY1LjE0MTQ2MworUEFVTkc6MjozMzEuNTgyMzUyCitNQUJFSU46MjoxODE2Ljg3OTMyOAorWUFXVU5HSFdFOjI6NDkyLjEzMzM4OQorVEFOVEFCSU46MjozMjQuOTI4NDMzCitQQVVOR0RFOjI6MTIxLjg0NDI4MQorTUFXS01BSToyOjEwMDQuNDEwNTkyCitMQVVOR0xPTjoyOjUuNTEwMjk0CitOQVdOR0hLSU86MjoxMzI3LjI5ODYxNQorS1lBTkdJTjoyOjMzOS4yNTE4ODcKK01ZT1RISVQ6Mjo3MjguMzY1ODU3CitXQVc6MjoyMi45MzA3NTQKK01ZQVVOR01ZQToyOjEuMDAwMDAwCitNRVJHVUk6MjoxLjAwMDAwMAorTkdBUFVUQVc6MjoxMS44NDE5NjQKK1RBQkFZSU46Mjo1MzMuNzYwNDg0CitNSU5ET046Mjo5NzIuMDMxMDgyCitNRVJHVUk6MjoxLjAwMDAwMAorTUVSR1VJOjI6MS4wMDAwMDAKK0tZQUlLVE86MjozMjUuMDM5MDIyCitLQVdUSEFVTkc6MjoxLjQyNTkyOQorS0FXVEhBVU5HOjI6MS4wMDAwMDAKK01ZRUJPTjoyOjcuMjY3NjkwCitBUkFLQU4gKFNBTkRPV0FZKToyOjEuMDAwMDAwCitNRVJHVUk6MjoxLjAwMDAwMAorTUVSR1VJOjI6MS4wMDAwMDAKK1RIQU5CWVVaQVlBVDoyOjM1MS44ODgwNDgKK0tBV1RIQVVORzoyOjEuMDAwMDAwCitHQU5HQVc6Mjo4MzUuNTQyMjE1CitSQU1SRUU6MjoxLjAwMDAwMAorTUVSR1VJOjI6MTcxLjI0Mzc2NQorTUFVTkdEQVc6MjoxLjAwMDAwMAorVElHWUFJTkc6Mjo4OTUuMzk3NTU3CitNWUVCT046MjoxLjAwMDAwMAorT0tUV0lOOjI6NTQ3LjU3NDAyMworWUlOTUFCSU46MjoyODAuMDA4OTQ1CitNQVVOR0RBVzoyOjExLjg2ODA0MgorQkFHTyAoUEVHVSk6MjoxMDc4LjI5NDA4NworUEFVS1RBVzoyOjI2Ljc3NDk3NAorQk9LUFlJTjoyOjIuNzk0ODY0CitNRVJHVUk6MjoyLjc1Njg1MworVEhBTkFUUElOOjI6Mjg5LjU2NTM5MQorU0FHQUlORzoyOjQ5MC44NjI5NTEKK05BVE9HWUk6Mjo1MTAuMDYzMjQ4CitNWUVCT046Mjo0LjYzNjU2MgorQk9LUFlJTjoyOjEuMDAwMDAwCitQQVVLVEFXOjI6Mi4yMzEyNTIKK0tZQUlLTEFUOjI6MzI5LjA1MDA3MworUE9OTkFHWVVOIEFORCBSQVRIRURBVU5HOjI6MS44NzUzOTQKK0JPS1BZSU46Mjo4LjY2MDU5OAorUEFMRToyOjc1NC4xMTUyMDkKK0tBV1RIQVVORzoyOjEuMDAwMDAwCitNWUVCT046MjoxNS4yMTE0MTMKK01ZRUJPTjoyOjEuMDAwMDAwCitNWUVCT046Mjo0MjMuNDg4MDc5CitNRVJHVUk6Mjo2LjIxMjcxNgorWUU6MjozLjczMzIwOAorQk9HQUxFOjI6MS4xNjM5NDkKK01PTllXQToyOjIzNS44Njg0MDAKK0RFREFZRToyOjEuMDAwMDAwCitLQVdUSEFVTkc6MjoxLjAwMDAwMAorQ0hBVU5HWk9OOjI6OS4xOTgzMzUKK05HQVBVVEFXOjI6MS4wMDAwMDAKK1BBTEFXOjI6OS42OTYwOTQKK0xBQlVUVEE6MjoxLjAwMDAwMAorTkdBUFVUQVc6MjoyMC41OTQ3OTMKK01FUkdVSToyOjEuMDAwMDAwCitLWUFVS1BZVToyOjEuMDAwMDAwCitQQUxBVzoyOjEuMDAwMDAwCitMT0kgTEVNOjI6NDEwLjc1MTcxNworTkFNVFU6MjoxNjU0LjcwMjg1OAorS0FNQUlORzoyOjI0MDcuNTQxNjk2CitIVElMSU46Mjo0ODEuNTc1MzE1CitCT0tQWUlOOjI6MS4wNjY3NDQKK01FUkdVSToyOjEuMDAwMDAwCitQT05OQUdZVU4gQU5EIFJBVEhFREFVTkc6Mjo0OS40MTM2NDYKK01ZRUJPTjoyOjE0LjMwMzIyMQorTUVSR1VJOjI6MS4wMDAwMDAKK0tBV1RIQVVORzoyOjIuMDQ2MDg2CitNRVJHVUk6MjoxLjAwMDAwMAorTU9OWU86MjoyMDQuMzI1NTQ2CitERURBWUU6MjoxLjIxODkzNQorVEFOQUk6Mjo0Nzc1LjQ2NDA3NgorUEFMQVc6MjoxLjAwMDAwMAorS1lBVUtQWVU6MjoxLjAwMDAwMAorS0FXVEhBVU5HOjI6MS4xMDQ5NDAKK0tBV1RIQVVORzoyOjEuMDAwMDAwCitLQVdLSE1VOjI6MS4wMDAwMDAKK01FUkdVSToyOjEuMDAwMDAwCitNRVJHVUk6Mjo2LjgyODI5MAorTUVSR1VJOjI6MS4wMDAwMDAKK0JPS1BZSU46MjoxLjAwMDAwMAorTU9ORyBLVU5HOjI6MjMyMC40OTEzNTYKK05BTUhLQU46Mjo2ODUuOTY0MzYwCitQQURBVU5HOjI6ODQ5LjQwNTg0OAorVEFDSElMRUs6MjoxMzQ3LjM3ODQ1MgorUE9OTkFHWVVOIEFORCBSQVRIRURBVU5HOjI6MTE4LjE3OTQ1NQorTEFJLUhLQToyOjExOTcuNjcwMzgzCitMQUJVVFRBOjI6MS4wMDAwMDAKK0tBV1RIQVVORzoyOjEuMjUxMjUyCitLQVdUSEFVTkc6Mjo4LjE0MjA4MQorTUVSR1VJOjI6MS4wMDAwMDAKK1dVTlRITzoyOjMzOC44Njk0MjYKK05BTVNBTkc6MjoxMzUzLjg2ODMwMQorTUVSR1VJOjI6MS4wMDAwMDAKK0xBQlVUVEE6MjoxLjAwMDAwMAorQk9LUFlJTjoyOjEuMDAwMDAwCitQQVVLVEFXOjI6MS4wMDAwMDAKK1JBTVJFRToyOjQ0Ny42NDIxNTQKK0tBV0tITVU6MjoxLjAwMDAwMAorTUVSR1VJOjI6MS45MjExMzAKK0JBV0xBS0hFOjI6NzM0LjAzODEzOQorUEFMQVc6MjozNi4zNDEzODIKK1BBS09LS1U6Mjo1MTkuNjAxNjY2CitZRURBU0hFOjI6MTA4MC41Mjc3NTYKK0JPS1BZSU46MjoxOS43NTI1ODQKK01ZRUJPTjoyOjQuNzA5MDkyCitNRVJHVUk6MjoxLjAwMDAwMAorTUVJS1RJTEE6Mjo0MDAuMjIyNDQ1CitNVS1TRToyOjgwMS4zMDk2MzUKK01FUkdVSToyOjEwLjQ3NjM0MQorTUFHV0U6Mjo2MTEuNDQ2MzA4CitNQVVOR0RBVzoyOjEuMDAwMDAwCitLWUFVS0tJOjI6ODMwLjk3NzUwNworVEFVTkdUSEE6Mjo0MTkuNzUwMjE1CitLQVdUSEFVTkc6Mjo4LjI5OTU4MQorTEFCVVRUQToyOjQwLjcyMzg4MQorQVJBS0FOIChTQU5ET1dBWSk6MjoxNDM3LjM0MjU4NQorS0FXTElOOjI6ODE0Ljg0MjUwMQorTUVSR1VJOjI6MS4wMDAwMDAKK1BBVUtUQVc6MjozMC41MjM3NTAKK0JPS1BZSU46MjoxLjAwMDAwMAorUEFORy1ZQU5HOjI6MTc0OC40ODg1NjAKK1BBTEFXOjI6NzcyLjkzMTM4MAorTUlOQllBOjI6NS45Nzg2NTIKK0tBV1RIQVVORzoyOjgxNS41MDk4MTQKK1NFSUtQWVU6Mjo1NjMuMjYxMzI0CitCT0tQWUlOOjI6MTAuMDg0NDQ4CitNWUVCT046MjoxNi4zMjgzNjQKK0tZQVVLUFlVOjI6OS4zNTc5MTUKK01BQ0hBTkJBVzoyOjEwODUuNDQ4Nzc5CitMQVNIRToyOjEwMjIuNzI1MTAwCitLWUFVS1BZVToyOjEuMDAwMDAwCitLWU9OUFlBVzoyOjQyMS42OTg2ODEKK01FUkdVSToyOjEuMDAwMDAwCitNSU5CWUE6MjoyOC43MDc5MjEKK0FOOjI6MjYwMS4xMTk5ODIKK01FUkdVSToyOjEuMDAwMDAwCitNT05HIEhTVToyOjcyNS40MzQxNzIKK01FUkdVSToyOjUuMDk3NjAwCitNRVJHVUk6MjoxLjAwMDAwMAorTU9VTE1FSU5HWVVOOjI6NDMyLjUyMTIwMworTUVSR1VJOjI6MS4wMDAwMDAKK1BBTEVUV0E6MjozNTY0LjAwOTc2MQorUEFMQVc6MjoxLjA2OTE5MQorUElOREFZQToyOjI5Ni4wMTkzNjUKK0tZQVVLUFlVOjI6MS44OTE5MzkKK1RIQVRPTjoyOjUyOC4xNjgyNjIKK0xBQlVUVEE6MjoxLjAwMDAwMAorTU9ORyBUVU5HOjI6MTgzNS45Njg0NTYKK0tBTkJBTFU6MjoxMjQ1LjQ0NTAwMgorUFVUQU86MjoyMDk5LjUwOTExNgorS0FXVEhBVU5HOjI6MS4wMDAwMDAKK1RBTlRBQklOOjI6MjE4LjkwNTc4MgorS0FXVEhBVU5HOjI6MTMuNzk0NzgxCitNRVJHVUk6MjoxLjc1ODc0OQorREVEQVlFOjI6MS4wMDAwMDAKK01JTkJZQToyOjYxLjExNzc2MworTUFOIEFVTkc6MjoxLjAwMDAwMAorTUVSR1VJOjI6OC4xNTIzNDkKK01FUkdVSToyOjEuMDAwMDAwCitNWUVCT046MjoyLjExMjc0OQorQk9HQUxFOjI6MS4wMDAwMDAKK09LUE86MjozOTUuNTM1NjEwCitUQUlLS1lJOjI6NDA3LjUzMzAzMworWkFMVU46MjoyMDQuNTA1NTgwCitLWUFVS01FOjI6MTY0My4wNjEyNDUKK0tBV1RIQVVORzoyOjEuMDAwMDAwCitNRVJHVUk6MjoxLjAwMDAwMAorUEFMQVc6MjoxLjAwMDAwMAorTVlFQk9OOjI6MS4zOTkzNTgKK0RFREFZRToyOjEuMDAwMDAwCitNRVJHVUk6MjoxLjAwMDAwMAorQkFOTUFVSzoyOjEzNTQuMDYwMzkzCitITy1QQU5HOjI6NTU0LjIwNTg1MQorS0hBTVRJOjI6MzMzOS44NzU2MzkKK0tZQVVOR0dPTjoyOjE0My44NTU4MTcKK0JPR0FMRToyOjEuMDAwMDAwCitIU0FUQVc6Mjo4OTIuNDYxMjYxCitLWUEtSU4gU0VJS0tZSToyOjMxNDYuMDIyODA1CitNRVJHVUk6MjoxLjAwMDAwMAorWUU6MjoxLjAwMDAwMAorTUVSR1VJOjI6OTUuMjM4NTI0CitUSEFOREFVTkc6MjoxMzg5LjIzMjg5NworS0FXVEhBVU5HOjI6NC45NDM3OTcKK01ZQUlORzoyOjYzOC4xNjQyNDUKK1dVRFdJTjoyOjc0Mi41Nzc2MzgKK01ZRUJPTjoyOjEuMjI4NjkwCitQQUxBVzoyOjIuMDY5NDc5CitQQVVLVEFXOjI6MS4wNTY3MDAKK0hTQVdMQVc6MjoxMzM5LjUxNjI2MAorUkFNUkVFOjI6Ny44NjU5NzMKK01ZRUJPTjoyOjIxLjg0NTEzMAorTVlFQk9OOjI6MS4wMDAwMDAKK01PVUxNRUlOOjI6NC40MTUwMDYKK1RIT05HV0E6MjozMTYuOTIyOTY1CitNQVVOR0RBVzoyOjMuNTU4NTk4CitCT0tQWUlOOjI6Ni44MDQwNTkKK1BIUlVIU086Mjo2MTQuNDM2NDA2CitLWUFVS1BZVToyOjEuMDAwMDAwCitXQUlOR01BVzoyOjE4ODUuNDY0OTQ4CitUQVZPWToyOjI1NTIuNjg5MjMxCitMQVVOR0xPTjoyOjEuNzQ5Nzc3CitOWUFVTkdJRUJJTjoyOjI5Mi41MjAxMjAKK1BBTEFXOjI6MS4wMDAwMDAKK0dZT0JJTkdBVUs6MjozODUuMzU2NDI5CitOSkFOR1lBTkc6MjoxNzgyLjcwMDMyOQorREFOVUJZVToyOjUyNi4wNjg2OTUKK0NIQVVOR1pPTjoyOjEuMTM4Njc2CitLQVdUSEFVTkc6MjoxLjAwMDAwMAorTUFOREFMQVk6Mjo2Mi4wODEyOTMKK05HQVBFOjI6NDM4LjU2OTk5MAorTVlBVU5HTVlBOjI6MS4wMDAwMDAKK01PVUxNRUlOOjI6NC41NDE5MjkKK01BTiBIUEFORzoyOjY1Ny45MjY2MTUKK0lOR0FQVToyOjY4NS42OTU3MTEKK01FUkdVSToyOjEuMDAwMDAwCitNT05HIEhTQVQ6MjoxOTEyLjg5NjUzMworSExBSU5HQldFOjI6MTcwOC42NDI2ODEKK0JVVEhJREFVTkc6MjoyLjc1NDI1OAorTUVSR1VJOjI6MS4yNTYyNjYKK01FUkdVSToyOjUuODU5MjU4CitCT0dBTEU6MjoyOS4zNjIyMDUKK01PTkdLSEFLOjI6MTAzMC4xNjQ1NTEKK0tZQVVLUFlVOjI6MS41MDE2NDMKK0tVTkdZQU5HT046Mjo3OC4zNTc0MTQKK01FUkdVSToyOjEuMDAwMDAwCitQQUxBVzoyOjEuMDAwMDAwCitOR0FQVVRBVzoyOjIyNS41NDAwMTQKK0JPR0FMRToyOjEuMDAwMDAwCitNRVJHVUk6MjozLjYxMTg1MAorR1dBOjI6MS4wMDAwMDAKK0xBVU5HTE9OOjI6MzExLjUyNzA0OQorUE9OTkFHWVVOIEFORCBSQVRIRURBVU5HOjI6Ni4yMDU1OTMKK0NPQ09TIElTTEFORFM6MjoxLjAwMDAwMAorS1lVTkhMQToyOjEwMTkuOTk5MzgzCitNRVJHVUk6Mjo0My44MzIxNzIKK01JTkhMQToyOjk2OS45MTUzNTIKK1BBVUtUQVc6MjoxNy40ODQ2OTQKK01FUkdVSToyOjMuNzIzNTMzCitNRVJHVUk6MjoxLjAwMDAwMAorS0FXVEhBVU5HOjI6MS4wMDAwMDAKK0tFTkcgVFVORzoyOjIwODguNjg4OTAxCitLWUFJS01BUkFXOjI6NDU4LjMzMDQzNworSFRBTlRBQklOOjI6MTA3Ljg4NzI4NworUFlBUE9OOjI6MzIyLjUzMDkxNQorSFNJUEFXOjI6MTk5NS42MjY5MTIKK01BVFVQSToyOjE5MTQuMDgzNzM4CitLQVdUSEFVTkc6MjoxLjAzNDcyNworTUVSR1VJOjI6MS4wMDAwMDAKK01FUkdVSToyOjIuODIyOTY3CitOQU1IU0FOOjI6Mzg5LjM5MjU5MworQk9LUFlJTjoyOjEuMDAwMDAwCitMQUJVVFRBOjI6Mi42NjU1MTMKK1RBVU5HVVA6MjoxLjI3MzgxMgorTVlFQk9OOjI6MTIuMDQ3NzQxCitCT0tQWUlOOjI6MS4wMDAwMDAKK0xBV0tTQVdLOjI6MTcwNy4yNzY1MTIKK1BIQVVOR0JZSU46MjoxMzUwLjE4MTgyMQorTUVSR1VJOjI6MTAwMy40ODYyNjcKK1lFQllVOjI6MS4zNTEwMjgKK01FUkdVSToyOjQyLjY3MDYwMQorTVlFQk9OOjI6MS4wMDAwMDAKK0JPR0FMRToyOjQ5LjcyMDI1MgorQk9LUFlJTjoyOjY5LjYwMjk5MworTEFTSElPOjI6MTY5Ni4zOTk1OTIKK01FUkdVSToyOjEuMDAwMDAwCitNRVJHVUk6MjoxLjYzNTk4NAorTVlFQk9OOjI6MS4wMDAwMDAKK01PTkcgUElORzoyOjIzODcuOTkzMzQyCitQSU5MRUJVOjI6MTMzOS40ODU4NTYKK0NIQVVOR1pPTjoyOjEzNy4wNzE0ODkKK01FUkdVSToyOjEuMDAwMDAwCitNSU5CWUE6MjoxLjAwMDAwMAorQk9LUFlJTjoyOjEuMDAwMDAwCitNWUFVTkdNWUE6Mjo2OTAuMjg1ODQ2CitLWUFVS1BZVToyOjEuMDAwMDAwCitQQU5UQU5BVzoyOjY0OS42MTkzNDIKK01FUkdVSToyOjYuNjI5Nzc2CitNWUVCT046MjoyNi43NTI0MTQKK0tBV1RIQVVORzoyOjEuMDAwMDAwCitZRVNBR1lPOjI6NDE3Ljc1MjEzMgorTUFOIEFVTkc6MjoxLjAwMDAwMAorUFJPTUU6MjozMzcuMDM1MDg0CitDT0NPUyBJU0xBTkRTOjI6MS40NDM2MzUKK1JBTVJFRToyOjEuMjE1NjczCitLQVdUSEFVTkc6MjoxLjAwMDAwMAorREVEQVlFOjI6NTkuNTYwNzM0CitXQUtFTUE6Mjo0NDAuNDYzNzQzCitOR0FQVVRBVzoyOjQuOTEyMTc1CitLQVdUSEFVTkc6MjoxLjAwMDAwMAorS1lBVUtQWVU6MjoxLjAwMDAwMAorQ0hBVUs6MjozNjQuMzU1Mzk5CitNQUhMQUlORzoyOjMxMy4zOTExOTMKK0tZQVVLUFlVOjI6MS4wMDAwMDAKK0JIQU1POjI6ODgyLjMyODUyMQorQkFTU0VJTiBXRVNUOjI6NjI3LjYwODM0MQorTUVSR1VJOjI6MS4wNTY4MjUKK1BZQVdCV0U6Mjo2NjAuNDg1ODg4CitCVURBTElOOjI6Mzk1LjAyOTIwNworQ0hBVU5HWk9OOjI6MS4wMDAwMDAKK1RBVU5HVVA6MjoxNzQ3LjczNDU4NgorQk9LUFlJTjoyOjEuMDAwMDAwCitITEVHVToyOjEuMDAwMDAwCitUSEFSUkFXQUREWToyOjIxMS4wNzE1MDQKK0xBVU5HTE9OOjI6MS4wMDAwMDAKK1BBVUtLQVVORzoyOjcwOS40MDQ3MDEKK1pJR09OOjI6MTkyLjI0NTA1NAorVEFUS09OOjI6MTA1Mi42NjgxMTYKK0xBSEU6MjoxNzE1Ljg3ODc5NworUEFMQVc6MjoyLjc1MjcyOAorTUVSR1VJOjI6MS4wMDAwMDAKK0ZBTEFNOjI6ODA0LjUwMDIxOAorS0FNQToyOjM2MS4wMzM5NzQKK01JTkRBVDoyOjE1MjYuNDEyNzg3CitLQUxFOjI6MTA0NS45ODAyMzcKK05BTVBBTjoyOjY4Ni4zMjA4NzIKK01FUkdVSToyOjEuMDAwMDAwCitLQVdUSEFVTkc6MjoxLjAwMDAwMAorTEVNWUVUSE5BOjI6Mzk2Ljk1NDYyNworTUVSR1VJOjI6Mi41MDU2MDYKK01ZRUJPTjoyOjIuMDQ1MDMwCitNUkFVSy1PTzoyOjQ0NC4zMzMxMTcKK0JPS1BZSU46Mjo0Ljg3NDM5NQorS0FOSToyOjEyODkuODQ4NzAzCitZQU5HT04gKFJBTkdPT04pOjI6MTA0LjkwMDc5NgorTUVSR1VJOjI6Mi41NDAwNzAKK01PVUxNRUlOOjI6MS4wMDAwMDAKK0tZQVVLUFlVOjI6MS4wMDAwMDAKK1BPTk5BR1lVTiBBTkQgUkFUSEVEQVVORzoyOjEuMDAwMDAwCitTQVc6Mjo3MTIuOTgxNzUyCitBUkFLQU4gKFNBTkRPV0FZKToyOjEuMDAwMDAwCitNRVJHVUk6MjoxLjAwMDAwMAorTUVSR1VJOjI6Mi43MzIxMjIKK01JTkJZQToyOjExMzUuODM4NDM1CitLQVdUSEFVTkc6MjoyLjg1MTY0OQorUEFOR1dBVU06Mjo1MDYuNzQyNjAxCitNRVJHVUk6MjoxLjAwMDAwMAorTUVSR1VJOjI6MS4wMDAwMDAKK1BBVU5HOjI6MS4wMDAwMDAKK01FUkdVSToyOjEuMDAwMDAwCitZRS1OR0FOOjI6MTM0NS4wMTA4MTQKK01BTiBBVU5HOjI6My44NjAyOTkKK01FUkdVSToyOjEuNDI4MjY0CitNRVJHVUk6MjoxLjAwMDAwMAorTUVSR1VJOjI6MS4wMDAwMDAKK0xBTkdLSE86Mjo4ODQuMDA3Njg5CitNWUFVTkdNWUE6MjoxLjAwMDAwMAorTVJBVUstT086MjoyOS45MDI5MTgKK1NIV0VCTzoyOjM2Ny44MDgwODEKK0tBV1RIQVVORzoyOjEuMDAwMDAwCitNRVJHVUk6MjoxLjAwMDAwMAorUEEtQU46MjoxMDUxLjUxODM4NQorUEFUSEVJTkdZSToyOjM5OC44NzY1MjUKK1RJRERJTToyOjExODUuNTE5MDE3CitMQUJVVFRBOjI6ODIwLjg0NjQ4MgorUEFVS1RBVzoyOjkuNDM2MTI2CitCT0tQWUlOOjI6Mi45NzY4NjYKK0tBV0tBUkVJSzoyOjU3MC4wOTkxNzkKK0JPS1BZSU46MjoxLjAwMDAwMAorTE9JLUtBVzoyOjU0MC41ODY1NDAKK1RIQUJBVU5HOjI6Njg3LjQ0NTUwMgorUElOTEFVTkc6MjoxMzcxLjgzMTY1NQorU0FMSU5HWUk6MjozMDUuMTA0OTk5CitNT0dPSzoyOjQ0Ny4yNDU3NzYKK1RFTkFTU0VSSU06Mjo0NTM5LjczMzM3MworTUVSR1VJOjI6MS4wMDAwMDAKK0tBV1RIQVVORzoyOjEuMDAwMDAwCitXQVc6MjoxLjAwMDAwMAorQk9LUFlJTjoyOjEuMDAwMDAwCitNWUVCT046MjoyLjg0MzM1NAorS0FXVEhBVU5HOjI6Mi40MDAzMTgKK0tBV1RIQVVORzoyOjEuMDAwMDAwCitEQUlLLVU6Mjo0OTEuNDUzMjc5CitMQVVOR0xPTjoyOjEuOTIzNzYyCitUSEFOQVRQSU46MjoxLjE1NzQwOAorTVlFQk9OOjI6MTUuMDI0MDA0CitLWUFVS1BZVToyOjYuODkzODA0CitZRToyOjEwMTMuMzU1MDM1CitUSEFaSToyOjYwMS42NDI0NjEKK01FUkdVSToyOjI3LjE5MjI2NQorUEFVS1RBVzoyOjIuNTE4MTU0CitLQVdUSEFVTkc6MjoxNy4yMDkzNDQKK01FUkdVSToyOjEuMDAwMDAwCitNRVJHVUk6MjoxLjAwMDAwMAorTEFCVVRUQToyOjEuMDAwMDAwCitMRVdFOjI6ODg2LjUwNzQzMgorS1lBVUtQWVU6MjoyLjQ0NTY5MAorUFlVOjI6ODUyLjM1MTcwNQorQk9HQUxFOjI6MS4xNjk1MTgKK0tBV1RIQVVORzoyOjEuMDAwMDAwCitOR0FQVVRBVzoyOjEuMDAwMDAwCitNRVJHVUk6MjoxLjAwMDAwMAorSFNJIEhTRU5HOjI6ODE3LjQ1MjI3NgorU0lUVFdFIChBS1lBQik6Mjo0My4yMjc4MjYKK0tBV1RIQVVORzoyOjEuMTg4MzAwCitLQVdLSE1VOjI6MjA3Ljg5MjY4NQorQk9LUFlJTjoyOjEuMDAwMDAwCitLVU5ISU5HOjI6MTA1Ni4wMzM1NTIKK0xBQlVUVEE6MjoxLjc3MzEwNAorUEFVS1RBVzoyOjg1LjM3NjQzMworTUVSR1VJOjI6MS4yNTgzNzcKK1BPTk5BR1lVTiBBTkQgUkFUSEVEQVVORzoyOjEuMDAwMDAwCitCT0tQWUlOOjI6MS4wMDAwMDAKK01FUkdVSToyOjcuODc1MDY2CitLWUFVS1NFOjI6Njc3LjUxMTA0NgorWUVCWVU6MjoxLjAwMDAwMAorUE9OTkFHWVVOIEFORCBSQVRIRURBVU5HOjI6NS41ODY4ODUKK0JPS1BZSU46MjoxNC40MTIxNDEKK0xBQlVUVEE6MjoxLjAwMDAwMAorQk9LUFlJTjoyOjIwNTEuODUyNTU4CitNRVJHVUk6MjoxLjAwMDAwMAorU0lOQkFVTkdXRSAoVEFOVEFCSU4pOjI6ODczLjQ3MDA3OAorQk9HQUxFOjI6My44MDQ3MjIKK1BBTEFXOjI6MS4wMDAwMDAKK05HQVBVVEFXOjI6MS4xMDE4NzYKK0JVVEhJREFVTkc6Mjo1LjczMTc2OAorTVlJVEtZSU5BOjI6MjQzNS43MDM0MTMKK0RFREFZRToyOjI2LjU1NjIyOQorQk9LUFlJTjoyOjEuMDAwMDAwCitHV0E6MjoxLjAwMDAwMAorS0FXVEhBVU5HOjI6MS4wMDAwMDAKK01FUkdVSToyOjUuMzc2NjYxCitNQU4gQVVORzoyOjE3Ny4yNDEwOTkKK0tZQVVLUFlVOjI6NC44ODg0OTEKK0RFREFZRToyOjEuNTUyMDQ1CitLQVdUSEFVTkc6MjoxLjAwMDAwMAorWUU6MjoxLjAwMDAwMAorUEFVS1RBVzoyOjMuODI2Mjk2CitOQU5ZVU46MjoyNjI2Ljc0NTM3OQorUEFMQVc6Mjo2LjA0ODgwMworUEFMQVc6MjoxLjAwMDAwMAorS0FMQVc6Mjo2OTMuNzE2OTA4CitNRVJHVUk6MjoxNS43ODUxNDkKK01ZRUJPTjoyOjEuODg2MTkzCitNT0hOWUlOOjI6MjU2OC4zMDg5NzAKK0tBV1RIQVVORzoyOjEuMDAwMDAwCitNWUlUSEE6MjozODguNDg2NDcyCitNRVJHVUk6MjoxLjAwMDAwMAorQk9LUFlJTjoyOjEuMDAwMDAwCitNT05HIEhQQVlBSzoyOjgyMS4zMjEyNDUKK1RIRUdPTjoyOjQ2MC44MjcxODgKK0JPS1BZSU46Mjo1LjkzMjc3NgorTUlOQllBOjI6MS4wMDAwMDAKK1lBTUVUSElOOjI6ODg3LjgyMTcxNworTVlJTk1VOjI6MjgxLjkzNTA2NQorTUVSR1VJOjI6OTIuMTc4NDcwCitLWUFVS1BZVToyOjEuMDAwMDAwCitQQVBVTjoyOjI2NzIuNjQ3ODg3CitLT05HLUtZQU46Mjo0MzUuMDQyNzYwCitLWUFVS1BZVToyOjQuNDQzNDEwCitOQVRUQUxJTjoyOjQyNy41MDYxNTQKK0tVTkxPTkc6MjozMjQuNTI3MTI0CitUT05aQU5HOjI6MTQ0NS4yODIwNTAKK0tIQVdCVURFOjI6MjE5MC40NDIwOTYKK0JPS1BZSU46MjoyNC4yMTQ1NDgKK0JPS1BZSU46MjoxLjAwMDAwMAorTUlOQlUgKFNBR1UpOjI6Njc0LjcyNDQ5NgorQlVUSElEQVVORzoyOjgxOC43MjI0NDMKK01ZRUJPTjoyOjUuMTUwNDAxCitNQU4gQVVORzoyOjEuMDAwMDAwCitNQVlNWU86Mjo1NTIuNzc2ODM0CitTVU1QUkFOQlVNOjI6MjU2Mi44NTUzODAKK01FUkdVSToyOjEuMDAwMDAwCitNRVJHVUk6MjoxLjAwMDAwMAorU0hXRUdZSU46Mjo5MTYuNDA5MjU2CitLQVdLSE1VOjI6MTM0LjY0MDk1OQorTkdBUFVUQVc6MjoxLjAwMDAwMAorS1lBVUtUQU46MjoyNjkuMzU3Mzg4CitLQU5QRVRMRVQ6Mjo4NTkuNDQ2NDQxCitNRVJHVUk6MjozLjk4MTM3NQorTUVSR1VJOjI6MS44MzgyNjkKK01FUkdVSToyOjEuMDAwMDAwCitNRVJHVUk6MjoxLjEyNzc2MgorTU9VTE1FSU46Mjo1LjgyMjU2MgorVEFVTkdEV0lOR1lJOjI6Nzk1LjEzMzcyOAorUEFMQVc6MjoxLjUwMTYzMQorTllBVU5HVToyOjU4MC41ODUyMzAKK0hPTUFMSU46Mjo0MjI4LjU1MjQ0OQorVEhBWUVUOjI6MzkwLjM3NTMzMQorU0lOR1U6Mjo1MzkuNjMxMTMyCitLWUFVS1BZVToyOjEuMjUyNjAwCitOR0FQVVRBVzoyOjEuMDAwMDAwCitLWUFVS1BZVToyOjEuMDAwMDAwCitLWUFVS1BZVToyOjEuMDAwMDAwCitCT0tQWUlOOjI6MS4wMDAwMDAKK0tZQVVLUEFEQVVORzoyOjgxMi41ODE3MjkKK01FUkdVSToyOjEuMzYwNzg1CitMQVVOR0xPTjoyOjEuMDAwMDAwCitNWUFXQURJOjI6MTE1My4xNjYxNjUKK01PTkcgTUlUOjI6MTEyNC4wOTA3MTMKK01FUkdVSToyOjMuNDIzMTMwCitERURBWUU6MjoyNDcuMjA4MjM1CitNRVJHVUk6Mjo4LjUwNzM1NworS0FXQToyOjQxNC4zNTc3ODAKK01FUkdVSToyOjE3Ljk0MDI2NgorUFdJTkJZVToyOjUxMy40MjgxNjgKK01PVUxNRUlOOjI6MS4wMDAwMDAKK01ZRUJPTjoyOjQuMTMwOTcyCitOT0dNVU5HOjI6MzAwMy43NTM4NjMKK1dBVzoyOjI1LjA1OTE4NgorUEFMQVc6MjoxLjAwMDAwMAorQ0hJUFdJOjI6MTI5NC42NDU5MTUKK0JPR0FMRToyOjEzLjYxOTEwNworS0FXVEhBVU5HOjI6MS4wMDAwMDAKK01ZRUJPTjoyOjEuMDAwMDAwCitNWUVCT046Mjo1Ni40MTU5MTAKK01FUkdVSToyOjEuMTU4NzMxCitQRUtIT046Mjo2OTkuNDc3MTg3CitNT05HIE1BTzoyOjcyNy44OTIzMDYKK01FUkdVSToyOjEuMDAwMDAwCitZRS1VOjI6NTY2LjQyMDE2MAorSU5TRUlOOjI6MTY1LjY1NDI4MAorUEFMQVc6MjoxLjAwMDAwMAorUEFVSzoyOjEwMzEuMDUyODIyCitLWUFVS1BZVToyOjEuMDAzODQ4CitZRUdZSToyOjI4Mi40NTQ2MDIKK0tBTEVXQToyOjg3Ny45OTI1OTQKK1lFOjI6MS4wMDAwMDAKK0JPS1BZSU46Mjo1LjEyMzI2OAorTU9HQVVORzoyOjg3Mi4wNjk3NTMKK1BBU0FXTkc6MjoxMzA5LjgyODA1OQorS0FXVEhBVU5HOjI6MS4wMDAwMDAKK0dXQToyOjEuMDAwMDAwCitBTUFSQVBVUkE6Mjo5Ny45MTg1MjEKK01VRE9OOjI6MjczLjQxMDc3MQorVEFVTkdVUDoyOjEwLjI4ODc5MQorV0FXOjI6MzM0LjY4OTI0MAorUEFMQVc6MjoxLjAwMDAwMAorSE8tUE9ORzoyOjM4My44NjAwNDQKK1NBTElOOjI6ODYxLjI3NzU1OAorTUFVTkdEQVc6MjoxLjAwMDAwMAorTU9VTE1FSU46Mjo3LjI1MjkxNworTVlFQk9OOjI6MzQuOTM1OTU5CitLWUFVS1BZVToyOjEuMDAwMDAwCitIU0VOV0k6Mjo3NTkuMTI0OTA2CitLRS1IU0k6MjoxMjgwLjQ0NTAwNgorQk9LUFlJTjoyOjMuNzQxMTU2CitZRUJZVToyOjE1ODQuNTE2MDQxCitNRVJHVUk6MjoxLjI2ODQzMworTUVSR1VJOjI6MS42NzY5NTMKK0tBV1RIQVVORzoyOjEuMDAwMDAwCitNRVJHVUk6MjoxLjAwMDAwMAorS1lBVUtUQUdBOjI6MTEyNS4xNTc4NTgKK01ZRUJPTjoyOjQwLjU3MzA4NworTVlFQk9OOjI6MTIuNjE0MjgxCitLQVdUSEFVTkc6MjoxLjAwMDAwMAorTUFEQVlBOjI6NDY1LjM1ODQ5MQorRElNQVdIU086Mjo0MzMuMDkyNTk1CitBWUFEQVc6Mjo0OTUuMTUyMDM3CitUSEFZRVRDSEFVTkc6Mjo4NDguMDYzNjg0CitNRVJHVUk6MjoyLjA0MDAwMgorVEFVTkdHWUk6Mjo2MzkuMjYxMjE4CitOR0FQVVRBVzoyOjE2OS4yMjI4ODcKK01FUkdVSToyOjMuMTgyMjUyCitNRVJHVUk6MjoxLjAwMDAwMAorTU9ORyBZQU5HOjI6MTAzNS40Mzg4NjcKK05HQVBVVEFXOjI6MS4wMDAwMDAKK0JPS1BZSU46MjoxLjgyMTI2MAorQklMSU46Mjo2ODUuMTkwMDE1CitQQUxBVzoyOjEuMDAwMDAwCitQQVVLVEFXOjI6NDcuNjU3NTcxCitMRVRQQVRBTjoyOjI3MC44MjQ3NjMKK0xBVU5HTE9OOjI6NS4yOTE0MzkKK01FUkdVSToyOjEuMDAwMDAwCitQQVVLVEFXOjI6MS4wMDAwMDAKK01FUkdVSToyOjEuMzUzMDQzCitNWUFVTkc6MjoyMDguNDk5Njk3CitNT1VMTUVJTkdZVU46MjoxLjAwMDAwMAorWUVOQU5HWUFVTkc6Mjo0MjYuODg1Nzk1CitNT05HIE5BSToyOjEzMDQuMTIwODI1CitNRVJHVUk6MjoxLjAwMDAwMAorTUVSR1VJOjI6MTU2LjQ1Mzg5NworTUFVTkdEQVc6Mjo2NDcuMjkxMzE3CitNRVJHVUk6MjoxLjAwMDAwMAorTUVSR1VJOjI6MS4zNTExODcKK01PVUxNRUlOOjI6MS4wMDAwMDAKK1RBTkdZQU46MjoxODk5LjgwODAzNworQ09DT1MgSVNMQU5EUzoyOjMuNzQ4MDM5CitLVVRLQUk6MjoxNTY5Ljk2ODAxNAorTUVSR1VJOjI6MS4wMDAwMDAKK01ZRUJPTjoyOjEuNTcxMDA4CitNRVJHVUk6MjoxLjQxNjQ2NAorTVlFQk9OOjI6MS4wMDAwMDAKK01PTkcgWUFXTkc6MjoxODE4LjYzMTEwMAorQk9HQUxFOjI6My45ODI1OTUKK0tBV1RIQVVORzoyOjEuMDAwMDAwCitLQVdUSEFVTkc6MjoxLjAwMDAwMAorTUlOSExBOjI6NzM0LjM2MjM3NgorSExFR1U6Mjo4MDEuOTE2MDE1CitQT05OQUdZVU4gQU5EIFJBVEhFREFVTkc6MjoxLjAwMDAwMAorS0hJTi1VOjI6NDEyLjk4NTk5NAorS0FZQU46MjoyMzMuMDc5OTQ4CitCT0dBTEU6Mjo4MzcuOTExODcyCitDSEFVTkctVToyOjE4MC4zNjU5NjgKK05HQVBVVEFXOjI6OS41MTU1OTAKK1BZSU5NQU5BOjI6ODEyLjAyNzA0OAorTUVSR1VJOjI6MS40NDg2NDMKK01BV0xBSUs6MjoxNTUxLjcxNDIxMworQk9HQUxFOjI6MS4wMDAwMDAKK0tBV1RIQVVORzoyOjEuMjMyNjQxCitNWUFOQVVORzoyOjYxOC4wNTg1NjcKK0dXQToyOjk0Ny42ODQ3NDUKK0RFREFZRToyOjEuMDAwMDAwCitNRVJHVUk6MjoxLjAwMDAwMAorU0hXRUdVOjI6MTE0Ni42NjkwOTQKK01FUkdVSToyOjMuMDEwODAzCitJUlJBV0FERFk6MjoyMzYuNjY1OTY1CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTVlBTk1BUl9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9NWUFOTUFSX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZDliYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTVlBTk1BUl9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDcyOCBAQAorTVlBTk1BUiAoQlVSTUEpOjA6NDMzNTU5ODk6MTY3LjY0NDk5NworQVJBS0FOIChSQUtISU5FKToxOjI1ODk0NzA6MTkwLjI3NjAwOAorQkFHTyAoUEVHVSk6MTo0ODA5MzY4OjMyMi45MzgyNzgKK0NISU46MTo0NjcwMjI6MzIuNTg5MDU0CitJUlJBV0FERFk6MTo2MzIwOTUwOjQ4Ny40ODQ2MzMKK0tBQ0hJTjoxOjEwMzc1ODU6MzAuMTcwNTI5CitLQVdUSFVMRUkgKEtBUkVOKToxOjEwNTc1MDU6OTAuNDUyMDcwCitLQVlBSDoxOjIwMjA4Mjo0NC42NjQ1MDMKK01BR1dFOjE6NDEwNDg1NToyNDAuODgyOTYyCitNQU5EQUxBWToxOjU3OTQwNDM6NDA5LjMyNTc2MgorTU9OOjE6MjEyNjMzNTo1MDkuODI5NDU1CitTQUdBSU5HOjE6NDc5OTczNToxMjkuMzQyNjc4CitTSEFOOjE6Mzg3MDkyMTo2NC4yNjU2MzQKK1RFTkFTU0VSSU06MToxMTU2NDg0OjczLjM0Mzc4MQorWUFOR09OIChSQU5HT09OKToxOjUwMTk2MzQ6MTM0My40NzQzNjAKK05PR01VTkc6Mjo1NzY0MzoxOS4xOTA1MjQKK1BVVEFPOjI6NTc2NDM6MjcuNDU1NzU3CitLSEFXQlVERToyOjU3NjQzOjI2LjMxNTk3MQorTUFDSEFOQkFXOjI6NTc2NDM6NTMuMTA1Nzg2CitOQU5ZVU46MjoxMjMwNzA6NDYuODUyNzA2CitUQU5BSToyOjU3NjQzOjEyLjA3MDc4NworU1VNUFJBTkJVTToyOjU3NjQzOjIyLjQ5MTk0OAorSFNBV0xBVzoyOjU3NjQzOjQzLjAzMzE1NQorTEFIRToyOjEyMzA3MDo3MS43MjQyNTUKK05KQU5HWUFORzoyOjU3NjQzOjMyLjMzNDk5OAorS0hBTVRJOjI6MTIzMDcwOjM2Ljg0ODcxNgorQ0hJUFdJOjI6NTc2NDM6NDQuNTI0NjE1CitLQU1BSU5HOjI6NTc2NDM6MjMuOTQyOTM0CitNWUlUS1lJTkE6Mjo1NzY0MzoyMy42NjYxMDQKK1dBSU5HTUFXOjI6NTc2NDM6MzAuNTcyNjI0CitNT0dBVU5HOjI6NTc2NDM6NjYuMDk5NzcxCitMQVNIRToyOjEyMzA3MDoxMjAuMzM1NDkyCitIT01BTElOOjI6MTIzMDcwOjI5LjEwNDU1MworTU9ITllJTjoyOjU3NjQzOjIyLjQ0NDE4OQorQkFOTUFVSzoyOjEyMzA3MDo5MC44ODk2ODkKK01PTUFVSzoyOjU3NjQzOjYwLjk5MDk4MworU0hXRUdVOjI6NTc2NDM6NTAuMjcwNDg1CitUQU1VOjI6MTIzMDcwOjE4Mi42MDk0MDYKK0JIQU1POjI6NTc2NDM6NjUuMzMxMjM0CitJTkRBVzoyOjEyMzA3MDoyMDEuNDk0MjEwCitQSEFVTkdCWUlOOjI6MTIzMDcwOjkxLjE1MDc4MgorS0FUSEE6MjoxMjMwNzA6MTI3LjU4MDU3MworUElOTEVCVToyOjEyMzA3MDo5MS44Nzg2MzIKK1RJR1lBSU5HOjI6MTIzMDcwOjEzNy40NDc0NjkKK01BTlNJOjI6NTc2NDM6NTEuNzg0NjUyCitXVU5USE86MjoxMjMwNzA6MzYzLjE3ODYxMworS09ORy1LWUFOOjI6NzQ0NDA6MTcxLjExMTQyOQorTUFCRUlOOjI6NzQ0NDA6NDAuOTcxNzg1CitNVS1TRToyOjc0NDQwOjkyLjg5ODkwNgorVE9OWkFORzoyOjUxODkxOjM1LjkwMzk0OQorS0FXTElOOjI6MTIzMDcwOjE1MS4wMzU0ODAKK01BV0xBSUs6MjoxMjMwNzA6NzkuMzEyMzY4CitOQU1IS0FOOjI6NzQ0NDA6MTA4LjUxOTkwNworS1VUS0FJOjI6NzQ0NDA6NDcuNDE1NDgxCitLWVVOSExBOjI6MTIzMDcwOjEyMC42NTcwNjEKK0tVTkxPTkc6Mjo3NDQ0MDoyMjkuMzgyMzMyCitLQU5CQUxVOjI6MTIzMDcwOjk4LjgxNjE4OQorTU9ORyBNSVQ6Mjo3NDQ0MDo2Ni4yMjMxMTUKK05BTVRVOjI6NzQ0NDA6NDQuOTg3NDA2CitUSURESU06Mjo1MTg5MTo0My43NzA5ODQKK1RIQUJFSUtLWUlOOjI6MjIyODQ3OjIyNS41OTc0NDYKK0tBTEU6MjoxMjMwNzA6MTE3LjY2MDA4OQorS0FMRVdBOjI6MTIzMDcwOjE0MC4xNzIxNzEKK0hPLVBBTkc6Mjo3NDQ0MDoxMzQuMzE5NzQ1CitIU0VOV0k6Mjo3NDQ0MDo5OC4wNjEzMTgKK0ZBTEFNOjI6NTE4OTE6NjQuNTAxMzI5CitNSU5HSU46MjoxMjMwNzA6OTMuNTkzODk0CitMQVNISU86Mjo3NDQ0MDo0My44ODE2MzUKK1RBWkU6MjoxMjMwNzA6MTgwLjI0NzU2MworTkFNSFNBTjoyOjc0NDQwOjE5MS4xNzE1NTcKK01PTkcgTUFPOjI6NzQ0NDA6MTAyLjI2ODk1OQorUEFOR1dBVU06Mjo3NDQ0MDoxNDYuOTAwNTkzCitUSExBTkdUTEFORzoyOjUxODkxOjM0LjIyNTU1MQorTU9HT0s6MjoyMjI4NDc6NDk4LjI2Njk5MgorVEFOVEFCSU46MjoxMjMwNzA6Mzc4Ljc2MDcyMworWUUtVToyOjEyMzA3MDoyMTcuMjc3MDk3CitLWUFVS01FOjI6NzQ0NDA6NDUuMzA2MTU2CitUQU5HWUFOOjI6NzQ0NDA6MzkuMTgzMzIxCitNQU4gSFBBTkc6Mjo3NDQ0MDoxMTMuMTQ0NTE2CitLSElOLVU6MjoxMjMwNzA6Mjk4LjAwMDczMQorSFNJUEFXOjI6NzQ0NDA6MzcuMzAxOTU3CitIQUtBOjI6NTE4OTE6MzQuMjQ2NTQ1CitLQU5JOjI6MTIzMDcwOjk1LjQxNDM5MQorTU9ORyBZQUk6Mjo3NDQ0MDo3OS4yMTM2MDIKK05BTVBBTjoyOjc0NDQwOjEwOC40NjM1MzYKK05BV05HSEtJTzoyOjc0NDQwOjU2LjA4NDQzMgorU0lOR1U6MjoyMjI4NDc6NDEyLjk2MzIxNgorVEFCQVlJTjoyOjEyMzA3MDoyMzAuNTcxODI0CitTSFdFQk86MjoxMjMwNzA6MzM0LjYwNDE5OQorR0FOR0FXOjI6MTY0MTk0OjE5Ni41MTIxNTMKK0JVREFMSU46MjoxMjMwNzA6MzExLjU0NjkwOAorV0VUTEVUOjI6MTIzMDcwOjIyNC40NTg0NDQKK0FZQURBVzoyOjEyMzA3MDoyNDguNTUwMTgxCitQQU5HLVlBTkc6Mjo3NDQ0MDo0Mi41NzQzNjQKK01BREFZQToyOjIyMjg0Nzo0NzguODczNDExCitNT05ZV0E6MjoxMjMwNzA6NTIxLjc3NDU1MAorUEFUSEVJTkdZSToyOjIyMjg0Nzo1NTguNjg4NzAxCitZSU5NQUJJTjoyOjEyMzA3MDo0MzkuNTIyMTMxCitMQVdLU0FXSzoyOjc0NDQwOjQzLjYwMjA2OQorU0FHQUlORzoyOjEyMzA3MDoyNTAuNzIxOTc0CitNQVRVUEk6Mjo1MTg5MToyNy4xMTAyNzMKK1BBTEU6MjoxMjMwNzA6MTYzLjE5ODA0NgorU0FMSU5HWUk6MjoxMjMwNzA6NDAzLjM2OTc1MworTVlJTk1VOjI6MTIzMDcwOjQzNi41MTk0MTAKK1BBTEVUV0E6Mjo1MTg5MToxNC41NTk4MTgKK01BWU1ZTzoyOjIyMjg0Nzo0MDMuMTQyNDUxCitNQU5EQUxBWToyOjIyMjg0NzozNTg5LjYxMjg2MAorS0UtSFNJOjI6NzQ0NDA6NTguMTM2NjU0CitNT05HIEhTVToyOjc0NDQwOjEwMi42MTU0OTcKK0NIQVVORy1VOjI6MTIzMDcwOjY4Mi4zMzU2NDAKK01PTkcgS1VORzoyOjc0NDQwOjMyLjA3OTc1MworS1lBVUtTRToyOjIyMjg0NzozMjguOTIxMjkxCitIVElMSU46MjoxNjQxOTQ6MzQwLjk1MjI3NworQU1BUkFQVVJBOjI6MjIyODQ3OjIyNzUuODQ5NDA0CitOR0FaVU46MjoxMjMwNzA6MjkxLjA2NjE3MgorTU9OR0tIQUs6Mjo3NDQ0MDo3Mi4yNjEwNjYKK01ZQVVORzoyOjEyMzA3MDo1OTAuMjY1MjYyCitUQURBLVU6MjoyMjI4NDc6NzczLjU2NTE1MworTUlOREFUOjI6NTE4OTE6MzMuOTk1NjEwCitTSU5HQUlORzoyOjIyMjg0NzoxMDk2LjMzNTE0MAorWUVTQUdZTzoyOjE2NDE5NDozOTMuMDQyMTU5CitNWUFJTkc6MjoxNjQxOTQ6MjU3LjI5MTQ0NAorUEFVSzoyOjE2NDE5NDoxNTkuMjQ5MDY3CitNWUlOR1lBTjoyOjIyMjg0Nzo2MDkuMzM1MzY4CitZRS1OR0FOOjI6NzQ0NDA6NTUuMzQ1ODY2CitTQVc6MjoxNjQxOTQ6MjMwLjI5MjI4OQorTkFUT0dZSToyOjIyMjg0Nzo0MzYuOTAyMzAzCitLVU5ISU5HOjI6NzQ0NDA6NzAuNDkwOTMxCitMQUktSEtBOjI6NzQ0NDA6NjIuMTU0NjU0CitNWUlUSEE6MjoyMjI4NDc6NTczLjYzMDgwNQorUEFLT0tLVToyOjE2NDE5NDozMTYuMDAwMTQyCitNQVVOR0RBVzoyOjIwMzg5OjMxLjQ5OTc3MAorVEFVTkdUSEE6MjoyMjI4NDc6NTMwLjkwNTc2MgorQlVUSElEQVVORzoyOjIwMzg5OjI0LjkwNDA3OAorV1VEV0lOOjI6MjIyODQ3OjMwMC4xMDAzNDgKK05ZQVVOR1U6MjoyMjI4NDc6MzgzLjgzMzA2NAorTE9JIExFTToyOjc0NDQwOjE4MS4yMzA2MjAKK0tBTlBFVExFVDoyOjUxODkxOjYwLjM3NzYyMworU0VJS1BZVToyOjE2NDE5NDoyOTEuNTA2MjU3CitNQUhMQUlORzoyOjIyMjg0Nzo3MTEuMDg1MTAwCitLWUFVS1RBVzoyOjIwMzg5OjMwLjE1ODkwMQorS1lBVUtQQURBVU5HOjI6MjIyODQ3OjI3NC4yNDY2MzkKK1BJTkRBWUE6Mjo3NDQ0MDoyNTEuNDcyNjk4CitNQVVOR0RBVzoyOjIwMzg5OjIwMzg5LjUyNzU1OQorTUFVTkdEQVc6MjoyMDM4OToyMDM4OS41Mjc1NTkKK0tBTEFXOjI6NzQ0NDA6MTA3LjMwNzE1NgorTUFVTkdEQVc6MjoyMDM4OToyMDM4OS41Mjc1NTkKK1RIQVpJOjI6MjIyODQ3OjM3MC4zOTkwNjkKK01BVU5HREFXOjI6MjAzODk6MTcxOC4wMTk0OTgKK01FSUtUSUxBOjI6MjIyODQ3OjU1Ni44MDk4NzAKK01BVU5HREFXOjI6MjAzODk6NTcyOS42NTE4MzUKK1NBTElOOjI6MTY0MTk0OjE5MC42NDAyODYKK0NIQVVLOjI6MTY0MTk0OjQ1MC42NDI5NzIKK1NJRE9LVEFZQToyOjE2NDE5NDoxNzQuMTQxMjI0CitNSU5CWUE6MjoyMDM4OToxNy45NTEwODEKK1BPTk5BR1lVTiBBTkQgUkFUSEVEQVVORzoyOjIwMzg5OjM2LjA5MTMzNQorTVJBVUstT086MjoyMDM4OTo0NS44ODc5MzEKK05BVE1BVUs6MjoxNjQxOTQ6MTc3LjI1NDc0MworUFlBV0JXRToyOjIyMjg0NzozMzcuMzk5ODAyCitCVVRISURBVU5HOjI6MjAzODk6NzQwMi45MTEyNTkKK1lFTkFOR1lBVU5HOjI6MTY0MTk0OjM4NC42MzI2MTYKK0JVVEhJREFVTkc6MjoyMDM4OTozNTU3LjI4NDE2OAorUE9OTkFHWVVOIEFORCBSQVRIRURBVU5HOjI6MjAzODk6MTA4NzIuMTMwMTAxCitQT05OQUdZVU4gQU5EIFJBVEhFREFVTkc6MjoyMDM4OToxNzIuNTMwMjIyCitZQU1FVEhJTjoyOjIyMjg0NzoyNTEuMDA1MTMyCitBTjoyOjIwMzg5OjcuODM4NzQ5CitQV0lOQllVOjI6MTY0MTk0OjMxOS43OTk3NTAKK01SQVVLLU9POjI6MjAzODk6NjgxLjg1NzQ1NQorUE9OTkFHWVVOIEFORCBSQVRIRURBVU5HOjI6MjAzODk6MzY0OS41MzQxNDMKK1BPTk5BR1lVTiBBTkQgUkFUSEVEQVVORzoyOjIwMzg5OjQxMi42Mjk0OTAKK1BBVUtUQVc6MjoyMDM4OTo3NjEuNTE0Mzc0CitQT05OQUdZVU4gQU5EIFJBVEhFREFVTkc6MjoyMDM4OToyMDM4OS41Mjc1NTkKK1BPTk5BR1lVTiBBTkQgUkFUSEVEQVVORzoyOjIwMzg5OjEwNjQ0LjQ3Njk2NQorTUlOQllBOjI6MjAzODk6MjAzODkuNTI3NTU5CitQQVVLVEFXOjI6MjAzODk6MTc0LjQ2OTQzMgorUE9OTkFHWVVOIEFORCBSQVRIRURBVU5HOjI6MjAzODk6MjAzODkuNTI3NTU5CitNWU9USElUOjI6MTY0MTk0OjIyNS40MjgxOTQKK01JTkJZQToyOjIwMzg5OjIwMzg5LjUyNzU1OQorTUFHV0U6MjoxNjQxOTQ6MjY4LjUzNDEyNgorVEFUS09OOjI6MjIyODQ3OjIxMS42OTgwNjkKK01JTkJZQToyOjIwMzg5OjMzMy42MTA1MDEKK01JTkJVIChTQUdVKToyOjE2NDE5NDoyNDMuMzQ5OTkxCitNSU5CWUE6MjoyMDM4OTozNDEwLjM4ODc1NgorTVlFQk9OOjI6MjAzODk6NDguMTQ2NjM5CitTSVRUV0UgKEFLWUFCKToyOjIwMzg5OjQ3MS42NzU5ODgKK01JTkJZQToyOjIwMzg5OjcxMC4yNDA0NzkKK1BPTk5BR1lVTiBBTkQgUkFUSEVEQVVORzoyOjIwMzg5OjMyODUuNjY5NDg1CitQT05OQUdZVU4gQU5EIFJBVEhFREFVTkc6MjoyMDM4OToyMDM4OS41Mjc1NTkKK1BBVUtUQVc6MjoyMDM4OToyMDM4OS41Mjc1NTkKK1BBVUtUQVc6MjoyMDM4OTo1MzI4Ljc4OTkyMQorTkdBUEU6MjoxNjQxOTQ6Mzc0LjM4NTM5NworUEFVS1RBVzoyOjIwMzg5OjQyNy44MzM5NjUKK1BBVUtUQVc6MjoyMDM4OToxOTI5NS40NzQxNzMKK01ZRUJPTjoyOjIwMzg5OjUwMi41MzgyMzYKK01ZRUJPTjoyOjIwMzg5OjkzMy4zNjcxODgKK01ZRUJPTjoyOjIwMzg5OjE2OTIuMzk0MjQ3CitQQVVLVEFXOjI6MjAzODk6OTEzOC4xNTU0MjEKK01ZRUJPTjoyOjIwMzg5OjEwNDU2LjkzNDgyMQorUEFVS1RBVzoyOjIwMzg5OjIxNjAuNzk0MzMwCitNWUVCT046MjoyMDM4OToyMDM4OS41Mjc1NTkKK1BBVUtUQVc6MjoyMDM4OToyMzguODE5MTU1CitUQVVOR0RXSU5HWUk6MjoxNjQxOTQ6MjA2LjQ5ODg0OQorUEFVS1RBVzoyOjIwMzg5OjY2Ny45ODg5NDUKK01ZRUJPTjoyOjIwMzg5OjIwMzg5LjUyNzU1OQorUEFVS1RBVzoyOjIwMzg5OjgwOTcuMDEzNzQ5CitQQVVLVEFXOjI6MjAzODk6MjAzODkuNTI3NTU5CitQQVVLVEFXOjI6MjAzODk6MTE2Ni4xMzU3OTYKK01ZRUJPTjoyOjIwMzg5OjEwODA5Ljg4NDAxNQorTVlFQk9OOjI6MjAzODk6MTI5NzguNjI3NDU0CitNSU5ITEE6MjoxNjQxOTQ6MTY5LjI4NzE0NAorUFlJTk1BTkE6MjoyMjI4NDc6Mjc0LjQzMzk3MQorTVlFQk9OOjI6MjAzODk6MTQ1NzAuNjI5OTMxCitNWUVCT046MjoyMDM4OTozNjEuNDE0NDk0CitNWUVCT046MjoyMDM4OTo5NjUwLjcwOTgzOAorTVlFQk9OOjI6MjAzODk6MjAzODkuNTI3NTU5CitNWUVCT046MjoyMDM4OToyMDM4OS41Mjc1NTkKK0xFV0U6MjoyMjI4NDc6MjUxLjM3NzI1OAorTVlFQk9OOjI6MjAzODk6NDM5Ny41NTMwOTIKK01ZRUJPTjoyOjIwMzg5OjcxNzAuOTQyMzMwCitNWUVCT046MjoyMDM4OToxMzQwLjQwOTgzMworTVlFQk9OOjI6MjAzODk6OTk3MC4yODI4NjEKK01ZRUJPTjoyOjIwMzg5OjI3OTUuNDI5NTMzCitNWUVCT046MjoyMDM4OToyMDM4OS41Mjc1NTkKK0FOOjI6MjAzODk6NzExNS43MDA1MzcKK01ZRUJPTjoyOjIwMzg5Ojc2Mi4xNTY1NTAKK01ZRUJPTjoyOjIwMzg5OjEzNTcuMTMwMDY3CitNWUVCT046MjoyMDM4OToyODA1LjUwMzIwMQorTVlFQk9OOjI6MjAzODk6Mzk1OC44MjMzMTUKK01ZRUJPTjoyOjIwMzg5OjQzMjkuODIxNDUyCitNWUVCT046MjoyMDM4OTo1ODMuNjI1ODE1CitNWUVCT046MjoyMDM4OToyMDM4OS41Mjc1NTkKK01ZRUJPTjoyOjIwMzg5OjQ5MzUuNzY5OTc0CitNWUVCT046MjoyMDM4OToxMjQ4LjcxODMzOAorU0lOQkFVTkdXRSAoVEFOVEFCSU4pOjI6MTY0MTk0OjE4Ny45NzkxOTMKK01ZRUJPTjoyOjIwMzg5OjE0MjUuNTE5OTk3CitNWUVCT046MjoyMDM4OToxNjE2LjM4NDQ0MgorTVlFQk9OOjI6MjAzODk6MTY1OTQuNTI1NTE4CitNWUVCT046MjoyMDM4OToyMDM4OS41Mjc1NTkKK01ZRUJPTjoyOjIwMzg5OjExNzE2Ljg2Njc5NAorTVlFQk9OOjI6MjAzODk6MjAzODkuNTI3NTU5CitNWUVCT046MjoyMDM4OToyMDM4OS41Mjc1NTkKK0tZQVVLUFlVOjI6MjAzODk6MjAzODkuNTI3NTU5CitLWUFVS1BZVToyOjIwMzg5OjEyMjIxLjM1ODI5OAorS1lBVUtQWVU6MjoyMDM4OToyMDM4OS41Mjc1NTkKK0tZQVVLUFlVOjI6MjAzODk6MjAzODkuNTI3NTU5CitNSU5ET046MjoxNjQxOTQ6MTY4LjkxODY3MgorS1lBVUtQWVU6MjoyMDM4OTo4MzM2LjkyMjMyNAorS1lBVUtQWVU6MjoyMDM4OTo5My42MTc4ODYKK0tZQVVLUFlVOjI6MjAzODk6MjAzODkuNTI3NTU5CitLWUFVS1BZVToyOjIwMzg5OjIwMzg5LjUyNzU1OQorS1lBVUtQWVU6MjoyMDM4OToyMDM4OS41Mjc1NTkKK0tZQVVLUFlVOjI6MjAzODk6MjE3OC44NTM2ODMKK1RIQVlFVDoyOjE2NDE5NDo0MjAuNjA1OTgzCitLWUFVS1BZVToyOjIwMzg5OjEwNzc3LjA1MzM2MQorS1lBVUtQWVU6MjoyMDM4OToyMDMxMS4zNjk0MTAKK1RIQU5EQVVORzoyOjE1MTA3MjoxMDguNzQ1MDA4CitLWUFVS1BZVToyOjIwMzg5OjQ1ODguNzExNzIzCitZRURBU0hFOjI6MTUwMjkyOjEzOS4wOTE5ODUKK0tZQVVLUFlVOjI6MjAzODk6MjAzODkuNTI3NTU5CitLWUFVS1BZVToyOjIwMzg5OjIwMzg5LjUyNzU1OQorVEFVTkdVUDoyOjIwMzg5OjExLjY2NjI2MQorTVlBWURFIChBVU5HTEFOKToyOjE2NDE5NDoxNjUuNzMwOTkyCitLWUFVS1BZVToyOjIwMzg5OjIwMzg5LjUyNzU1OQorS1lBVUtQWVU6MjoyMDM4OTo5OS43OTAwMzYKK0tZQVVLUFlVOjI6MjAzODk6MjAzODkuNTI3NTU5CitLWUFVS1BZVToyOjIwMzg5OjIwMzg5LjUyNzU1OQorS1lBVUtQWVU6MjoyMDM4OToxNjI3Ny43NjQyOTcKK1JBTVJFRToyOjIwMzg5OjQ1LjU0ODcyMQorS1lBVUtQWVU6MjoyMDM4OTo0MTcwLjkyNDYzOQorUkFNUkVFOjI6MjAzODk6MjAzODkuNTI3NTU5CitLWUFVS1BZVToyOjIwMzg5OjI5NTcuNjU5ODg3CitLWUFVS1BZVToyOjIwMzg5OjEzNTc4LjE0NTc3NworS1lBVUtQWVU6MjoyMDM4OToyMDM4OS41Mjc1NTkKK0tZQVVLUFlVOjI6MjAzODk6MjAzODkuNTI3NTU5CitLWUFVS1BZVToyOjIwMzg5OjIwMzg5LjUyNzU1OQorUEFVS0tBVU5HOjI6MTUwMjkyOjIxMS44NTc1NjEKK1RIT1VOR09POjI6MTUwMjkyOjE5OC43NjYyMTQKK0tBTUE6MjoxNjQxOTQ6NDU0Ljc4ODc3OAorVEFVTkdVUDoyOjIwMzg5OjIwMzg5LjUyNzU1OQorUFJPTUU6MjoxNTAyOTI6NDQ1LjkyNjEyOAorVEFVTkdVUDoyOjIwMzg5OjE4MDM0LjExMDQzMAorVEFVTkdVUDoyOjIwMzg5OjE2MDA2LjcwMDgwMAorUEFEQVVORzoyOjE1MDI5MjoxNzYuOTM4NjgxCitNQU4gQVVORzoyOjIwMzg5OjExNS4wMzgzNzIKK09LVFdJTjoyOjE1MDI5MjoyNzQuNDcwMTk3CitNQU4gQVVORzoyOjIwMzg5OjIwMzg5LjUyNzU1OQorVEFOVEFCSU46MjoxNTAyOTI6Njg2LjU2MzYzOAorVEFVTkdVUDoyOjIwMzg5OjE5ODEuNzIyMzk3CitSQU1SRUU6MjoyMDM4OToyNTkyLjExNzY2NAorVEhFR09OOjI6MTUwMjkyOjMyNi4xMzY4OTkKK1BZVToyOjE1MDI5MjoxNzYuMzI3MTU0CitOQVRUQUxJTjoyOjE1MDI5MjozNTEuNTU2OTI4CitBUkFLQU4gKFNBTkRPV0FZKToyOjIwMzg5OjE0LjE4NTU3MworU0hXRURBVU5HOjI6MTUwMjkyOjQ3Ny44Nzg1MDQKK1JBTVJFRToyOjIwMzg5OjE2NzcyLjIxMzg3NgorTUFOIEFVTkc6MjoyMDM4OToyMDM4OS41Mjc1NTkKK01BTiBBVU5HOjI6MjAzODk6NTI4MS44NTE4ODcKK1BBVU5HREU6MjoxNTAyOTI6MTIzMy40ODIxODUKK0FSQUtBTiAoU0FORE9XQVkpOjI6MjAzODk6MjAzODkuNTI3NTU5CitLWUFOR0lOOjI6ODIwOTA6MjQxLjk3NDM2NAorS1lBVUtUQUdBOjI6MTUwMjkyOjEzMy41NzQ4MTMKK0dZT0JJTkdBVUs6MjoxNTAyOTI6MzkwLjAwOTcxMgorWklHT046MjoxNTAyOTI6NzgxLjc3Njk0MAorTUFOIEFVTkc6MjoyMDM4OToyMDM4OS41Mjc1NTkKK0FSQUtBTiAoU0FORE9XQVkpOjI6MjAzODk6MjAzODkuNTI3NTU5CitNWUFOQVVORzoyOjgyMDkwOjEzMi44MTk1NDgKK09LUE86MjoxNTAyOTI6Mzc5Ljk3Mjc0MQorTU9OWU86MjoxNTAyOTI6NzM1LjU1NTM1NworR1dBOjI6MjAzODk6MjEuNTE1MDk1CitHV0E6MjoyMDM4OToyMDM4OS41Mjc1NTkKK01JTkhMQToyOjE1MDI5MjoyMDQuNjU3NDc2CitOWUFVTkdJRUJJTjoyOjE1MDI5Mjo1MTMuNzg2MDI2CitHV0E6MjoyMDM4OToyMDM4OS41Mjc1NTkKK0lOR0FQVToyOjgyMDkwOjExOS43MTgyMDUKK0xFVFBBVEFOOjI6MTUwMjkyOjU1NC45NDQ2MzgKK0JBR08gKFBFR1UpOjI6MTUwMjkyOjEzOS4zODAxMTEKK0RBSUstVToyOjE1MDI5MjozMDUuODEyODk1CitIRU5aQURBOjI6ODIwOTA6Mjg4LjEyNjM3NQorVEhBUlJBV0FERFk6MjoxNTAyOTI6NzEyLjA0NjYxNQorSE1BV0JJOjI6MjM5MDMwOjQyNy4xNzA1NzgKK0xFTVlFVEhOQToyOjgyMDkwOjIwNi44MDAxMDgKK1dBVzoyOjE1MDI5Mjo0NDkuMDUxNjM0CitEQU5VQllVOjI6ODIwOTA6MTU2LjA0NDc1MworSExFR1U6MjoyMzkwMzA6Mjk4LjA3Mzg0NgorWkFMVU46Mjo4MjA5MDo0MDEuNDA4NDEwCitHV0E6MjoyMDM4OToyMDM4OS41Mjc1NTkKK1RBSUtLWUk6MjoyMzkwMzA6NTg2LjUyOTYwOQorWUVHWUk6Mjo4MjA5MDoyOTAuNjMxNjk1CitLWU9OUFlBVzoyOjgyMDkwOjE5NC42NjU2NzgKK1dBVzoyOjE1MDI5Mjo1OTk3LjUxMTI1MgorVEhBQkFVTkc6Mjo4MjA5MDoxMTkuNDEzNDgwCitXQVc6MjoxNTAyOTI6NjU1NC4yMDAwOTMKK1dBVzoyOjEzNzAwMDoxMzcwMDAuMDAwMDAwCitUSEFOQVRQSU46MjoxNTAyOTI6NTE5LjAyODcwNQorVEhBTkFUUElOOjI6MTUwMjkyOjEyOTg1Mi44Njk1MTUKK1BBTlRBTkFXOjI6ODIwOTA6MTI2LjM2NjcxMQorWUFORE9PTjoyOjgyMDkwOjI0NC40NzcyMTQKK0tZQVVOR0dPTjoyOjgyMDkwOjU3MC42NDI2MTYKK0tBV0E6MjoxNTAyOTI6MzYyLjcxMjUwOQorQkFTU0VJTiBXRVNUOjI6ODIwOTA6MTMwLjc5ODU0OAorRUlOTUU6Mjo4MjA5MDozMTEuMDQ3Njc0CitIVEFOVEFCSU46MjoyMzkwMzA6MjIxNS41NTQ3NDMKK0tBWUFOOjI6MjM5MDMwOjEwMjUuNTI4NzYyCitOR0FQVVRBVzoyOjgyMDkwOjM2My45NzIwNDMKK0lSUkFXQUREWToyOjgyMDkwOjM0Ni44NjEyODEKK1lBTkdPTiAoUkFOR09PTik6MjoyMzkwMzA6MjI3OC42MzA4NTUKK0lOU0VJTjoyOjIzOTAzMDoxNDQyLjk0NjA1OQorVEhPTkdXQToyOjIzOTAzMDo3NTQuMjIxNzQxCitTWVJJQU06MjoyMzkwMzA6MTY0Ny42ODE1NDkKK0hMRUdVOjI6MTM3MDAwOjEzNzAwMC4wMDAwMDAKK01BLVVCSU46Mjo4MjA5MDoyNTAuOTM2MTAxCitXQUtFTUE6Mjo4MjA5MDoxODYuMzcyMzQzCitOR0FQVVRBVzoyOjgyMDkwOjc0LjQyNjU0MgorTVlBVU5HTVlBOjI6ODIwOTA6MTE4LjkyMjEyNQorVFdBTlRFOjI6MjM5MDMwOjEyNTMuNzM2NDkxCitOR0FQVVRBVzoyOjgyMDkwOjY5MzIuMTQ5MDcxCitLWUFVS1RBTjoyOjIzOTAzMDo4ODcuNDA5MDc1CitLWUFJS0xBVDoyOjgyMDkwOjI0OS40NzY0OTgKK0tBV0tITVU6MjoyMzkwMzA6MTE0OS43NzY4MjEKK0tBV0tITVU6MjoyMzkwMzA6MTc3NS4zMTU1NjcKK01PVUxNRUlOR1lVTjoyOjgyMDkwOjE4OS43OTQ3NjQKK05HQVBVVEFXOjI6ODIwOTA6ODIwOTAuMjU5NzQwCitLVU5HWUFOR09OOjI6MjM5MDMwOjMwNTAuNTExNDc0CitERURBWUU6Mjo4MjA5MDozMzIuMDY5Mjc2CitLQVdLSE1VOjI6MTM3MDAwOjEzNzAwMC4wMDAwMDAKK0RFREFZRToyOjgyMDkwOjEyMTc4LjQ4Njg0OQorUFlBUE9OOjI6ODIwOTA6MjU0LjUxOTA0MworREVEQVlFOjI6ODIwOTA6ODIwOTAuMjU5NzQwCitERURBWUU6Mjo4MjA5MDo4MjA5MC4yNTk3NDAKK0JPR0FMRToyOjgyMDkwOjk3Ljk3MDA0MAorTVlBVU5HTVlBOjI6ODIwOTA6ODIwOTAuMjU5NzQwCitERURBWUU6Mjo4MjA5MDo4MjA5MC4yNTk3NDAKK05HQVBVVEFXOjI6ODIwOTA6ODIwOTAuMjU5NzQwCitERURBWUU6Mjo4MjA5MDo4MjA5MC4yNTk3NDAKK0RFREFZRToyOjgyMDkwOjEzNzguMjYxMzg1CitOR0FQVVRBVzoyOjgyMDkwOjM5ODUuOTcxNTg3CitERURBWUU6Mjo4MjA5MDozMDkxLjE4NjYxOQorS0FXS0hNVToyOjEzNzAwMDoxMzcwMDAuMDAwMDAwCitERURBWUU6Mjo4MjA5MDo1Mjg5MS42NzUwMDkKK0xBQlVUVEE6Mjo4MjA5MDoxMDAuMDA2ODM2CitNWUFVTkdNWUE6Mjo4MjA5MDo4MjA5MC4yNTk3NDAKK0RFREFZRToyOjgyMDkwOjgyMDkwLjI1OTc0MAorTkdBUFVUQVc6Mjo4MjA5MDo4NjI2LjkyMjczOAorTVlBVU5HTVlBOjI6ODIwOTA6ODIwOTAuMjU5NzQwCitOR0FQVVRBVzoyOjgyMDkwOjQ4NS4xMDE0MDIKK0RFREFZRToyOjgyMDkwOjY3MzQ1Ljg4Nzc5NQorTkdBUFVUQVc6Mjo4MjA5MDo4MjA5MC4yNTk3NDAKK0xBQlVUVEE6Mjo4MjA5MDo4MjA5MC4yNTk3NDAKK0JPR0FMRToyOjgyMDkwOjYwMjcuNTgwMjAzCitMQUJVVFRBOjI6ODIwOTA6ODIwOTAuMjU5NzQwCitOR0FQVVRBVzoyOjgyMDkwOjc0NTAwLjQ1MTcyMQorTEFCVVRUQToyOjgyMDkwOjgyMDkwLjI1OTc0MAorTU9VTE1FSU5HWVVOOjI6ODIwOTA6ODIwOTAuMjU5NzQwCitCT0dBTEU6Mjo4MjA5MDoyNzk1Ljc3OTgwNAorTEFCVVRUQToyOjgyMDkwOjM2MjY3LjUzNDk1NQorQk9HQUxFOjI6ODIwOTA6MTY1MS4wNDI3MTMKK0xBQlVUVEE6Mjo4MjA5MDo4NjcyLjc4NTg1MgorTEFCVVRUQToyOjgyMDkwOjMwNzk3LjE3MTAyOQorTEFCVVRUQToyOjgyMDkwOjgyMDkwLjI1OTc0MAorTkdBUFVUQVc6Mjo4MjA5MDoxNjcxMS41OTEwNDUKK0JPR0FMRToyOjgyMDkwOjI1OTI2LjIwMDk2MworQk9HQUxFOjI6ODIwOTA6MjA2MTIuMjU0MDA1CitCT0dBTEU6Mjo4MjA5MDo4MjA5MC4yNTk3NDAKK0xBQlVUVEE6Mjo4MjA5MDo4MjA5MC4yNTk3NDAKK0JPR0FMRToyOjgyMDkwOjcwNTI3LjM2ODI0NAorTEFCVVRUQToyOjgyMDkwOjgyMDkwLjI1OTc0MAorTEFCVVRUQToyOjgyMDkwOjIwMTUuNzc2OTI4CitOR0FQVVRBVzoyOjgyMDkwOjgyMDkwLjI1OTc0MAorTEFCVVRUQToyOjgyMDkwOjgyMDkwLjI1OTc0MAorTEFCVVRUQToyOjgyMDkwOjgyMDkwLjI1OTc0MAorTkdBUFVUQVc6Mjo4MjA5MDo4MjA5MC4yNTk3NDAKK0xBQlVUVEE6Mjo4MjA5MDo0NjI5Ny40ODcxOTgKK0JPR0FMRToyOjgyMDkwOjIxNTc1Ljg4OTA1MQorQk9HQUxFOjI6ODIwOTA6NzAxOTEuNTMxNjc0CitCT0dBTEU6Mjo4MjA5MDo4MjA5MC4yNTk3NDAKK0JPR0FMRToyOjgyMDkwOjgyMDkwLjI1OTc0MAorQk9HQUxFOjI6ODIwOTA6ODIwOTAuMjU5NzQwCitDT0NPUyBJU0xBTkRTOjI6MjM5MDMwOjYzNzc0LjczNDA2MQorQ09DT1MgSVNMQU5EUzoyOjEzNzAwMDoxMzcwMDAuMDAwMDAwCitDT0NPUyBJU0xBTkRTOjI6MjM5MDMwOjQwMjI0LjQwNTQwMgorQ09DT1MgSVNMQU5EUzoyOjE5Nzc3NzoxMzcwMDAuMDAwMDAwCitNT05HIFlBTkc6Mjo3NDQ0MDo3MS44OTI5ODMKK0tFTkcgVFVORzoyOjc0NDQwOjM1LjYzOTk2MAorTU9ORyBZQVdORzoyOjc0NDQwOjQwLjkzMjMxOQorTU9ORyBQSU5HOjI6NzQ0NDA6MzEuMTcyOTQ2CitNT05HIEhQQVlBSzoyOjc0NDQwOjkwLjYzNTQxMQorTkFNU0FORzoyOjc0NDQwOjU0Ljk4Mzc3NAorVEFVTkdHWUk6Mjo3NDQ0MDoxMTYuNDQ4MTU0CitUQUNISUxFSzoyOjc0NDQwOjU1LjI0ODYxMQorTU9ORyBOQUk6Mjo3NDQ0MDo1Ny4wODEyMDUKK01PTkcgSFNBVDoyOjc0NDQwOjM4LjkxNTIxOQorSE8tUE9ORzoyOjc0NDQwOjE5My45MjY5MDAKK01PTkcgVFVORzoyOjc0NDQwOjQwLjU0NTc4OAorWUFXVU5HSFdFOjI6NzQ0NDA6MTUxLjI2MTQwNgorSFNJIEhTRU5HOjI6NzQ0NDA6OTEuMDY0Mzg1CitMQU5HS0hPOjI6NzQ0NDA6ODQuMjA4MzA0CitNQVdLTUFJOjI6NzQ0NDA6NzQuMTEzOTAyCitQSU5MQVVORzoyOjc0NDQwOjU0LjI2Mzc5MworTU9ORyBQQU46Mjo3NDQ0MDozNi43MjcwNDgKK0xPSS1LQVc6MjozMzY4MDo2Mi4zMDMzMTUKK1BFS0hPTjoyOjc0NDQwOjEwNi40MjM0NjkKK0hTQVRBVzoyOjMzNjgwOjM3LjczODcwNgorRElNQVdIU086MjozMzY4MDo3Ny43NjcwNTAKK1BIUlVIU086MjozMzY4MDo1NC44MTUwMDMKK1BBU0FXTkc6MjozMzY4MDoyNS43MTM1NTMKK0JBV0xBS0hFOjI6MzM2ODA6NDUuODgzNjI5CitQQVBVTjoyOjE1MTA3Mjo1Ni41MjUyNzAKK0tZQVVLS0k6MjoxNTAyOTI6MTgwLjg2MjU5NworU0hXRUdZSU46MjoxNTAyOTI6MTY0LjAwMTc4MQorSExBSU5HQldFOjI6MTUxMDcyOjg4LjQxNjQ2MworQklMSU46Mjo3NTk0MDoxMTAuODMxMzUyCitQQS1BTjoyOjE1MTA3MjoxNDMuNjcwNDcyCitLWUFJS1RPOjI6NzU5NDA6MjMzLjYzNTEzNQorVEhBVE9OOjI6NzU5NDA6MTQzLjc4MDk1MgorTVlBV0FESToyOjE1MTA3MjoxMzEuMDA2Mzk2CitUSEFUT046Mjo3NTk0MDo1MTE2My42NjI0MTAKK0tBV0tBUkVJSzoyOjE1MTA3MjoyNjQuOTkyNzM5CitQQVVORzoyOjc1OTQwOjIyOS4wMjQ2NjEKK01PVUxNRUlOOjI6NzU5NDA6MTcyMDAuNTUwOTY1CitNT1VMTUVJTjoyOjc1OTQwOjEwNDcwLjM0Mzk2MQorS1lBLUlOIFNFSUtLWUk6MjoxNTEwNzI6NDguMDIwMDQxCitNT1VMTUVJTjoyOjc1OTQwOjc1OTQwLjUzNTcxNAorTU9VTE1FSU46Mjo3NTk0MDoxNjcxOS44ODYxMzUKK01PVUxNRUlOOjI6NzU5NDA6NzU5NDAuNTM1NzE0CitLWUFJS01BUkFXOjI6NzU5NDA6MTY1LjY4OTQ4OQorTU9VTE1FSU46Mjo3NTk0MDoxMzA0Mi40NjA2NDEKK1BBVU5HOjI6NzU5NDA6NzU5NDAuNTM1NzE0CitQQVVORzoyOjc1OTQwOjM4NDEyLjgwMjU0OQorTU9VTE1FSU46Mjo3NTk0MDo3NTk0MC41MzU3MTQKK0NIQVVOR1pPTjoyOjc1OTQwOjc1OTQwLjUzNTcxNAorQ0hBVU5HWk9OOjI6NzU5NDA6NTU0LjAyMTM4MgorTU9VTE1FSU46Mjo3NTk0MDozMjg4LjY4OTg4MAorQ0hBVU5HWk9OOjI6NzU5NDA6NzU5NDAuNTM1NzE0CitNVURPTjoyOjc1OTQwOjI3Ny43NTI1MzkKK0NIQVVOR1pPTjoyOjc1OTQwOjY2NjkxLjk2MTI5MAorQ0hBVU5HWk9OOjI6NzU5NDA6ODI1NS45MDAxOTQKK1RIQU5CWVVaQVlBVDoyOjc1OTQwOjIxNS44MDg3OTUKK1lFOjI6NzU5NDA6NzQuOTM5NzEzCitZRToyOjc1OTQwOjIwMzQxLjg5NzgzMAorWUU6Mjo3NTk0MDo3NTk0MC41MzU3MTQKK1lFQllVOjI6NDcwMToyLjk2NjkzNAorWUU6Mjo3NTk0MDo3NTk0MC41MzU3MTQKK1lFOjI6NzU5NDA6NzU5NDAuNTM1NzE0CitUQVZPWToyOjQ3MDE6MS44NDE2NDgKK1lFQllVOjI6NDcwMTo0NzAxLjE1NDQ3MgorWUVCWVU6Mjo0NzAxOjM0NzkuNjg2OTI5CitZRUJZVToyOjQ3MDE6NDMzNy4wOTQ0MjkKK0xBVU5HTE9OOjI6NDcwMToxNS4wOTA2NzgKK0xBVU5HTE9OOjI6NDcwMTo4ODguNDQ1MzY4CitMQVVOR0xPTjoyOjQ3MDE6MjY4Ni43MTYzNDgKK1RIQVlFVENIQVVORzoyOjQ3MDE6NS41NDMzOTgKK0xBVU5HTE9OOjI6NDcwMToyNDQzLjcyOTc3MQorTEFVTkdMT046Mjo0NzAxOjg1My4xNTg1NTYKK0xBVU5HTE9OOjI6NDcwMTo0NzAxLjE1NDQ3MgorTEFVTkdMT046Mjo0NzAxOjMyMTAuNTA0NDI1CitMQVVOR0xPTjoyOjQ3MDE6NDcwMS4xNTQ0NzIKK1BBTEFXOjI6NDcwMTo2LjA4MjI0MAorVEVOQVNTRVJJTToyOjQ3MDE6MS4wMzU1NTcKK1BBTEFXOjI6NDcwMTo0ODQuODUwMzQwCitQQUxBVzoyOjQ3MDE6NDcwMS4xNTQ0NzIKK1BBTEFXOjI6NDcwMToxMjkuMzYwOTE2CitQQUxBVzoyOjQ3MDE6Nzc3LjIwNDA5NworUEFMQVc6Mjo0NzAxOjIyNzEuNjYwODczCitQQUxBVzoyOjQ3MDE6NDcwMS4xNTQ0NzIKK1BBTEFXOjI6NDcwMTo0NzAxLjE1NDQ3MgorUEFMQVc6Mjo0NzAxOjQ3MDEuMTU0NDcyCitQQUxBVzoyOjQ3MDE6NDcwMS4xNTQ0NzIKK1BBTEFXOjI6NDcwMTo0NzAxLjE1NDQ3MgorUEFMQVc6Mjo0NzAxOjQ3MDEuMTU0NDcyCitQQUxBVzoyOjQ3MDE6MzEzMC42OTg4NjgKK1BBTEFXOjI6NDcwMTo0NzAxLjE1NDQ3MgorUEFMQVc6Mjo0NzAxOjQ3MDEuMTU0NDcyCitQQUxBVzoyOjQ3MDE6NDM5Ni45MjY3MTYKK1BBTEFXOjI6NDcwMTo0NzAxLjE1NDQ3MgorTUVSR1VJOjI6NDcwMTo3MDkuMDk3MDMwCitQQUxBVzoyOjQ3MDE6NDcwMS4xNTQ0NzIKK1BBTEFXOjI6NDcwMTo0NzAxLjE1NDQ3MgorUEFMQVc6Mjo0NzAxOjE3MjguNjU2MDU0CitQQUxBVzoyOjQ3MDE6MTcwNy44MTY1NjMKK01FUkdVSToyOjQ3MDE6MTA3MS44NzU5MDYKK01FUkdVSToyOjQ3MDE6NC42ODQ4MjIKK01FUkdVSToyOjQ3MDE6MjcuNDUyOTk2CitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjY4OC40ODE5NTgKK01FUkdVSToyOjQ3MDE6Mjk3LjgyMTM1NgorTUVSR1VJOjI6NDcwMTo0NzAxLjE1NDQ3MgorTUVSR1VJOjI6NDcwMToyNjIuMDQ0ODU5CitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjM3MzUuODg3MTU2CitNRVJHVUk6Mjo0NzAxOjI0NDcuMDc3NzQ3CitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQwNTcuMTU3NzYzCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjMyNDUuMjEyNTY5CitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjEwNy4yNTM1MTQKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6MTY2NS4zMjM5MjEKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6MzQ1NC43MzcxMzUKK01FUkdVSToyOjQ3MDE6NDQ4Ljc0MDExNgorTUVSR1VJOjI6NDcwMTo0NzAxLjE1NDQ3MgorTUVSR1VJOjI6NDcwMTo0NzAxLjE1NDQ3MgorTUVSR1VJOjI6NDcwMTo0NzAxLjE1NDQ3MgorTUVSR1VJOjI6NDcwMTo0NzAxLjE1NDQ3MgorTUVSR1VJOjI6NDcwMTozNDc0LjUwNDg1NQorTUVSR1VJOjI6NDcwMTo0NzAxLjE1NDQ3MgorTUVSR1VJOjI6NDcwMTo2OTkuODQ3NjQ1CitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjI1NTcuMzgxMTQxCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjE0NzcuMzA0MjcxCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjM0NzkuMjc3NDU5CitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjE4NTAuNzk3MjExCitNRVJHVUk6Mjo0NzAxOjQzMDQuMzEwMDAzCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjExMC4xNzMxNDkKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDI5NS44MjYwOTYKK01FUkdVSToyOjQ3MDE6Mjg3My41OTQ0MDcKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6MTM3My4zNDk2NzUKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDE2OC41Njk2NzMKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6MTI2Mi41NTIxMTcKK01FUkdVSToyOjQ3MDE6MTUwOC4xNjg1NjgKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NTEuMDAwNTcwCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjIzMDQuNDg1MjI3CitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjMzMTguOTM2NzgzCitNRVJHVUk6Mjo0NzAxOjEzMDEuNTkxODM2CitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQ0NDguMzc1NTMyCitNRVJHVUk6Mjo0NzAxOjI4MDMuMzkwNzE2CitNRVJHVUk6Mjo0NzAxOjM3NDIuMTY0ODU0CitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjQ3MDEuMTU0NDcyCitNRVJHVUk6Mjo0NzAxOjU5Ni45NjY5OTMKK01FUkdVSToyOjQ3MDE6NzU2LjY5ODc1NworTUVSR1VJOjI6NDcwMToxNzIwLjY5NzEyNgorQk9LUFlJTjoyOjQ3MDE6Mi4yOTExNzYKK01FUkdVSToyOjQ3MDE6NTc2LjY2MjU2MworTUVSR1VJOjI6NDcwMTo1NTIuNTk4NzA2CitNRVJHVUk6Mjo0NzAxOjMyOTEuNTE2NDY1CitNRVJHVUk6Mjo0NzAxOjExODAuNzg2NjU2CitNRVJHVUk6Mjo0NzAxOjE3MDUuMjYxMjA2CitNRVJHVUk6Mjo0NzAxOjE3Mi44ODU3MjYKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6OTIyLjIyODk4NQorTUVSR1VJOjI6NDcwMToxNTYxLjQyODc4NgorTUVSR1VJOjI6NDcwMTo0NzAxLjE1NDQ3MgorTUVSR1VJOjI6NDcwMTozNzA2LjI2OTQ0NgorTUVSR1VJOjI6NDcwMTo4MDIuMzQ2Mzg0CitNRVJHVUk6Mjo0NzAxOjMwLjA0ODE3OAorTUVSR1VJOjI6NDcwMTo0OS4zNjE5MDAKK01FUkdVSToyOjQ3MDE6ODc0LjM2MzE5MgorTUVSR1VJOjI6NDcwMTo0NzAxLjE1NDQ3MgorTUVSR1VJOjI6NDcwMTo0NzAxLjE1NDQ3MgorTUVSR1VJOjI6NDcwMTo0NzAxLjE1NDQ3MgorTUVSR1VJOjI6NDcwMTo0NzAxLjE1NDQ3MgorQk9LUFlJTjoyOjQ3MDE6NDcwMS4xNTQ0NzIKK01FUkdVSToyOjQ3MDE6MjY3My4wMTA0NTkKK0JPS1BZSU46Mjo0NzAxOjEyNTQuMTgzMDAwCitNRVJHVUk6Mjo0NzAxOjE4NzYuMjU0NDc2CitCT0tQWUlOOjI6NDcwMTo5MTcuNjA4NTQwCitCT0tQWUlOOjI6NDcwMTo0NzAxLjE1NDQ3MgorQk9LUFlJTjoyOjQ3MDE6Mjk2MS43NjU3MzEKK0JPS1BZSU46Mjo0NzAxOjQ3MDEuMTU0NDcyCitCT0tQWUlOOjI6NDcwMToyOTc5LjE5ODU1OQorQk9LUFlJTjoyOjQ3MDE6NDcwMS4xNTQ0NzIKK0JPS1BZSU46Mjo0NzAxOjU0Mi44MjEwMDEKK0JPS1BZSU46Mjo0NzAxOjQ3MDEuMTU0NDcyCitCT0tQWUlOOjI6NDcwMTo0NzAxLjE1NDQ3MgorQk9LUFlJTjoyOjQ3MDE6MTU3OS4yMjk0NTUKK0JPS1BZSU46Mjo0NzAxOjQ3MDEuMTU0NDcyCitCT0tQWUlOOjI6NDcwMTo0NjYuMTc4NjYyCitCT0tQWUlOOjI6NDcwMTo0NzAxLjE1NDQ3MgorQk9LUFlJTjoyOjQ3MDE6NDcwMS4xNTQ0NzIKK0JPS1BZSU46Mjo0NzAxOjE5NC4xNDU4NjkKK0JPS1BZSU46Mjo0NzAxOjEyNTYuNjA0NzY5CitCT0tQWUlOOjI6NDcwMTo2OTAuOTMzODE5CitCT0tQWUlOOjI6NDcwMToxNzc1LjY2NDIxNworQk9LUFlJTjoyOjQ3MDE6OTY0LjQ1OTA3MQorQk9LUFlJTjoyOjQ3MDE6Mjk0Mi42Njg2NTMKK0JPS1BZSU46Mjo0NzAxOjQ3MDEuMTU0NDcyCitCT0tQWUlOOjI6NDcwMTo0NzAxLjE1NDQ3MgorQk9LUFlJTjoyOjQ3MDE6NjcuNTQyNDE4CitCT0tQWUlOOjI6NDcwMTo0NzAxLjE1NDQ3MgorQk9LUFlJTjoyOjQ3MDE6NDcwMS4xNTQ0NzIKK0JPS1BZSU46Mjo0NzAxOjMyNi4xOTQwMzgKK0tBV1RIQVVORzoyOjQ3MDE6NS43NjQ2ODIKK0JPS1BZSU46Mjo0NzAxOjQ3MDEuMTU0NDcyCitCT0tQWUlOOjI6NDcwMTo0NDA3LjAxMjgwOQorQk9LUFlJTjoyOjQ3MDE6NDcwMS4xNTQ0NzIKK0JPS1BZSU46Mjo0NzAxOjIzOC4wMDE5OTkKK0JPS1BZSU46Mjo0NzAxOjc5Mi40MDM4MzgKK0JPS1BZSU46Mjo0NzAxOjQ3MDEuMTU0NDcyCitCT0tQWUlOOjI6NDcwMToyNTgxLjI2NDg3OAorQk9LUFlJTjoyOjQ3MDE6NDcwMS4xNTQ0NzIKK0JPS1BZSU46Mjo0NzAxOjQ3MDEuMTU0NDcyCitCT0tQWUlOOjI6NDcwMToxNjgyLjA2OTEzNQorQk9LUFlJTjoyOjQ3MDE6NDcwMS4xNTQ0NzIKK0JPS1BZSU46Mjo0NzAxOjQ3MDEuMTU0NDcyCitLQVdUSEFVTkc6Mjo0NzAxOjU2Ni40MzI3NDgKK0tBV1RIQVVORzoyOjQ3MDE6NDcwMS4xNTQ0NzIKK0tBV1RIQVVORzoyOjQ3MDE6NDcwMS4xNTQ0NzIKK0tBV1RIQVVORzoyOjQ3MDE6NDcwMS4xNTQ0NzIKK0tBV1RIQVVORzoyOjQ3MDE6NTc3LjM4OTc5NAorS0FXVEhBVU5HOjI6NDcwMTo0NzAxLjE1NDQ3MgorS0FXVEhBVU5HOjI6NDcwMTozNDAuNzkyMjUxCitLQVdUSEFVTkc6Mjo0NzAxOjQ3MDEuMTU0NDcyCitLQVdUSEFVTkc6Mjo0NzAxOjQ3MDEuMTU0NDcyCitLQVdUSEFVTkc6Mjo0NzAxOjQ3MDEuMTU0NDcyCitLQVdUSEFVTkc6Mjo0NzAxOjQ3MDEuMTU0NDcyCitLQVdUSEFVTkc6Mjo0NzAxOjQ3MDEuMTU0NDcyCitLQVdUSEFVTkc6Mjo0NzAxOjQ3MDEuMTU0NDcyCitLQVdUSEFVTkc6Mjo0NzAxOjQ3MDEuMTU0NDcyCitLQVdUSEFVTkc6Mjo0NzAxOjQ3MDEuMTU0NDcyCitLQVdUSEFVTkc6Mjo0NzAxOjQ3MDEuMTU0NDcyCitLQVdUSEFVTkc6Mjo0NzAxOjM2NTEuMTI2ODkwCitLQVdUSEFVTkc6Mjo0NzAxOjQ3MDEuMTU0NDcyCitLQVdUSEFVTkc6Mjo0NzAxOjQ3MDEuMTU0NDcyCitLQVdUSEFVTkc6Mjo0NzAxOjI3My4xNzQ1MzEKK0tBV1RIQVVORzoyOjQ3MDE6MzI5Ni45MDY0MTgKK0tBV1RIQVVORzoyOjQ3MDE6MTY0OC41NzQwMjYKK0tBV1RIQVVORzoyOjQ3MDE6NDcwMS4xNTQ0NzIKK0tBV1RIQVVORzoyOjQ3MDE6NDcwMS4xNTQ0NzIKK0tBV1RIQVVORzoyOjQ3MDE6NDcwMS4xNTQ0NzIKK0tBV1RIQVVORzoyOjQ3MDE6OTUwLjkxOTgwNAorS0FXVEhBVU5HOjI6NDcwMTo0NzAxLjE1NDQ3MgorS0FXVEhBVU5HOjI6NDcwMTo0NzAxLjE1NDQ3MgorS0FXVEhBVU5HOjI6NDcwMTo0NzAxLjE1NDQ3MgorS0FXVEhBVU5HOjI6NDcwMTozOTU2LjIwMTY5MworS0FXVEhBVU5HOjI6NDcwMTo3Mi4xNjgzODkKK0tBV1RIQVVORzoyOjQ3MDE6NDcwMS4xNTQ0NzIKK0tBV1RIQVVORzoyOjQ3MDE6NDcwMS4xNTQ0NzIKK0tBV1RIQVVORzoyOjQ3MDE6NDU0My4zNzY2MzIKK0tBV1RIQVVORzoyOjQ3MDE6MzgxMy44ODc4MDAKK0tBV1RIQVVORzoyOjQ3MDE6NDcwMS4xNTQ0NzIKK0tBV1RIQVVORzoyOjQ3MDE6MTYxNy42NzUwMTMKK0tBV1RIQVVORzoyOjQ3MDE6NDcwMS4xNTQ0NzIKK0tBV1RIQVVORzoyOjQ3MDE6NDYxLjM2OTMxNQorS0FXVEhBVU5HOjI6NDcwMTo0NzAxLjE1NDQ3MgorS0FXVEhBVU5HOjI6NDcwMTozNzU3LjE2MDQwNgorS0FXVEhBVU5HOjI6NDcwMTo0NzAxLjE1NDQ3MgorS0FXVEhBVU5HOjI6NDcwMTo0NzAxLjE1NDQ3MgorS0FXVEhBVU5HOjI6NDcwMToyMjk3LjYzMjg4MgorS0FXVEhBVU5HOjI6NDcwMTo0NzAxLjE1NDQ3MgorS0FXVEhBVU5HOjI6NDcwMTo0MjU0LjY2OTQ1OQorS0FXVEhBVU5HOjI6NDcwMTo0NzAxLjE1NDQ3MgorS0FXVEhBVU5HOjI6NDcwMTo0NzAxLjE1NDQ3MgorS0FXVEhBVU5HOjI6NDcwMToxOTU4LjU1NDg1NQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05BTUlCSUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTkFNSUJJQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzRmMWVmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05BTUlCSUFfQVJFQS50eHQKQEAgLTAsMCArMSwzNCBAQAorTmFtaWJpYQk6CTAJOgk4MjQyOTIKK0NhcHJpdmkJOgkxCToJMTk1MzIuMzAKK0Vyb25nbwlbU1dBS09QTVVORF0gOgkxCToJNjM3MTkuODAKK0hhcmRhcCAJOgkxCToJMTA5ODg4LjEwCitrZWV0bWFuc2hvb3AJOgkxCToJMTYxMzI0LjUwCitCZXJzZWJhIAk6CTEJOgkzNjgwNC43MAorS2FyYXNidXJnIAk6CTEJOgkxNDQyNTQuNjAKK0tlZXRtYW5zaG9vcCBbS2FyYXNdCToJMQk6CTEwNTgyLjAwCitLaG9tYXMgW3dpbmRob2VrXToJCTEJOgk0MzQxNy41MAorS3VuZW5lIFtPdXRqb10JOgkxCToJODQ3MzEuOTAKK09oYW5nd2VuYSBbRWVuaGFuYV0JOgkxCToJMTM2MzcuNjAKK0thdmFuZ28gW09rYXZhbmdvXSBbUnVuZHVdCToJMQk6CTUyOTAuNTAKK09tYWhla2UgW0dvYmFiaXNdCToJMQk6CTI2NjA3LjIwCitPbXVzYXRpIFtVdGFwaV0JOgkxCToJMTA1MzI3LjgwCitPc2hhbmEgW09zaGFrYXRpXQk6CTEJOgkxNjE5NzcKK09zaGlrb3RvIFtUc3VtZWJdCToJMQk6CTE2MDc4OAorT3Rqb3pvbmRqdXBhIFtPdGppd2Fyb25nb10JOgkxCToJMTM1NzIzCitCZXRoYW5pZW4gOiAxIDogMTgwMDQKK0JvZXNtYW5sYW5kIDogMSA6IDE4NDY4CitEYW1hcmFsYW5kIDogMSA6IDQ2NTYwCitHcm9vdGZvbnRlaW4gOiAxIDogMjY1MjAKK0hlcmVyb2xhbmQgRWFzdCA6IDEgOiA1MTk0OQorSGVyZXJvbGFuZCBXZXN0IDogMSA6IDE2NTAwCitLYW9rb2xhbmQgOiAxIDogNTgxOTAKK0thcmliaWIgOiAxIDogMTMyMzAKK0x1ZGVyaXR6IDoxIDogNTMwNjMKK01hbHRhaG9oZSA6IDEgOiAyNTU3MworTWFyaWVudGFsIDogMSAgOiA0NzY4OQorTmFtYWxhbmQgOiAxIDogMjExMjAKK09rYWhhbmRqYSA6IDEgOiAxNzY0MAorT21hcnVydSA6IDEgOiAgODQyNQorT3dhbWJvIDogMSA6IDUxODAwCitSZWhvYm90aCA6IDEgOiAxNDE4MgorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTkFNSUJJQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9OQU1JQklBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NDhhNjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTkFNSUJJQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDMzIEBACitOYW1pYmlhCToJMAk6CTIwMzEwMDAKK0NhcHJpdmkJOgkxCToJNzk4NTIKK0Vyb25nbyBbU1dBS09QTVVORF0JOgkxCToJMTA3NjI5CitIYXJkYXAgCToJMQk6CTY3OTk4CitrZWV0bWFuc2hvb3AJOgkxCToJNjk2NzcKK0JlcnNlYmEgOgkJMQk6CTkxOTUKK0thcmFzYnVyZyAJOgkxCToJMTQ2OTMKK0tlZXRtYW5zaG9vcCBbS2FyYXNdCToJMQk6CTIxMjk0CitLaG9tYXMgW3dpbmRob2VrXQk6CTEJOgkyNTAzMDUKK0t1bmVuZSBbT3V0am9dCToJMQk6CTY4MjI0CitPaGFuZ3dlbmEgW0VlbmhhbmFdCSA6CTEJOgkyMjc3MjgKK0thdmFuZ28gW09rYXZhbmdvXSBbUnVuZHVdCToJMQk6CTIwMTA5MworT21haGVrZSBbR29iYWJpc10JOgkxCToJNjc0OTYKK09tdXNhdGkgW1V0YXBpXQkgOgkxCToJMjI4MzY0CitPc2hhbmEgW09zaGFrYXRpXQk6CTEJOgkxNjE5NzcKK09zaGlrb3RvIFtUc3VtZWJdCToJMQk6CTE2MDc4OAorT3Rqb3pvbmRqdXBhIFtPdGppd2Fyb25nb10JOgkxCToJMTM1NzIzCitCZXRoYW5pZW4gOiAxIDogIDI5MDAKK0JvZXNtYW5sYW5kIDogMSA6IDM4MDAKK0RhbWFyYWxhbmQgOiAxIDogMzI5MDAKK0dyb290Zm9udGVpbiA6IDEgOiAxMzUsMzg0CitIZXJlcm9sYW5kIEVhc3QgOiAxIDogMjUzMDAKK0hlcmVyb2xhbmQgV2VzdCA6IDEgOiAxODgwMAorS2Fva29sYW5kIDogMSA6IDI2MzAwCitLYXJpYmliIDogMSA6IDEyMTAwIAorTHVkZXJpdHogOjEgOiAxNzUwMAorTWFsdGFob2hlIDogMSA6IDQxMDAKK01hcmllbnRhbCA6IDEgIDogMjQ5MDAKK05hbWFsYW5kIDogMSA6IDE2MjAwCitPa2FoYW5kamEgOiAxIDogMjAxMDAgCitPbWFydXJ1IDogMSA6IDc0MDAKK093YW1ibyA6IDEgOiA2MTUxMDAKK1JlaG9ib3RoIDogMSA6IDM0NDAwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTkVQQUxfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTkVQQUxfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2Mzc4NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9ORVBBTF9BUkVBLnR4dApAQCAtMCwwICsxLDE3IEBACitOZXBhbAk6CTAJOgkxNDA4MDAKK0NlbnRyYWwgW0NlbnRyYWwgSGlsbF0JOgkxCToJMTE4MDUKK0NlbnRyYWwgTW91bnRhaW4gCToJMQk6CTYyNzcKK0NlbnRyYWwgVGFyYWkgCToJMQk6CTkzMjgKK0Vhc3QgOiAxIDogMTc3MDcKK0Vhc3Rlcm4gW0Vhc3Rlcm4gSGlsbF0gCToJMQk6CTEwNzQ5CitFYXN0ZXJuIE1vdW50YWluIAk6CTEJOgkxMDQzOAorRWFzdGVybiBUYXJhaSAJOgkxCToJNzI2OQorRmFyIFdlc3QgW0Zhci13ZXN0ZXJuIEhpbGxdIAk6CTEJOgk2NzYyCitGYXItd2VzdGVybiBNb3VudGFpbiAJOgkxCToJNzkzMgorRmFyLXdlc3Rlcm4gVGFyYWkgCToJMQk6CTQ4NDUKK01pZFdlc3QgW01pZC13ZXN0ZXJuIE1vdW50YWluXSAJOgkxCToJMjEzNTEKK01pZC13ZXN0ZXJuIFRhcmFpIAk6CTEJOgk3MzE3CitNaWQtd2VzdGVybiBIaWxsIAk6CTEJOgkxMzcxMAorV2VzdCBbV2VzdGVybiBIaWxsXSAJOgkxCToJMTgzMTkKK1dlc3Rlcm4gTW91bnRhaW4gCToJMQk6CTU4MTkKK1dlc3Rlcm4gVGFyYWkgCToJMQk6CTUyNjAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9ORVBBTF9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9ORVBBTF9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2M5OGVlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05FUEFMX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMTcgQEAKK05lcGFsCToJMAk6CTI4Mjg3MTQ3CitDZW50cmFsIFtDZW50cmFsIEhpbGxdCToJMQk6CTM1NDI3MzIKK0NlbnRyYWwgTW91bnRhaW4gCToJMQk6CTU1NDgxNworQ2VudHJhbCBUYXJhaSAJOgkxCToJMzkzNDA4MAorRWFzdCA6IDEgOiAzNzAxMjMwCitFYXN0ZXJuIFtFYXN0ZXJuIEhpbGxdIAk6CTEJOgkxNjQzMjQ2CitFYXN0ZXJuIE1vdW50YWluIAk6CTEJOgk0MDE1ODcKK0Vhc3Rlcm4gVGFyYWkgCToJMQk6CTMyOTk2NDMKK0ZhciBXZXN0IFtGYXItd2VzdGVybiBIaWxsXSAJOgkxCToJNzk4OTMxCitGYXItd2VzdGVybiBNb3VudGFpbiAJOgkxCToJMzk3ODAzCitGYXItd2VzdGVybiBUYXJhaSAJOgkxCToJOTk0NTk2CitNaWRXZXN0IFtNaWQtd2VzdGVybiBNb3VudGFpbl0gCToJMQk6CTMwOTA4NAorTWlkLXdlc3Rlcm4gVGFyYWkgCToJMQk6CTEyMzA4NjkKK01pZC13ZXN0ZXJuIEhpbGwgCToJMQk6CTE0NzMwMjIKK1dlc3QgW1dlc3Rlcm4gSGlsbF0gCToJMQk6CTI3OTMxODAKK1dlc3Rlcm4gTW91bnRhaW4gCToJMQk6CTI0NTY4CitXZXN0ZXJuIFRhcmFpIAk6CTEJOgkxNzUzMjY1CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTkVUSEVSTEFORFNfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTkVUSEVSTEFORFNfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkOTUwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9ORVRIRVJMQU5EU19BUkVBLnR4dApAQCAtMCwwICsxLDEzIEBACisgTkVUSEVSTEFORFMgOiAwIDogNDE1MjYKKyBHUk9OSU5HRU4gOiAxIDogMjg5MS4wCisgRlJJRVNMQU5EIDogMSA6IDYwNy4wCisgRFJFTlRIRSA6IDEgOiAyNjgwLjAKKyBOT09SRC1IT0xMQU5EIDogMSA6IDM1MTguMAorIE9WRVJJSlNTRUwgOiAxIDogMzQxOS4wCisgRkxFVk9MQU5EIDogMSA6IDIyNDUuMAorIEdFTERFUkxBTkQgOiAxIDogNTE0NC4wCisgWlVJRC1IT0xMQU5EIDogMSA6IDMzNTkuMAorIFVUUkVDSFQgOiAxIDogMTQwMS4wCisgTk9PUkQtQlJBQkFOVCA6IDEgOiA1MDgzLjAKKyBaRUVMQU5EIDogMSA6IDMwNDAuMAorIExJTUJVUkcgOiAxIDogMjE1MwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05FVEhFUkxBTkRTX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05FVEhFUkxBTkRTX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNjA3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTkVUSEVSTEFORFNfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxMiBAQAorIEdST05JTkdFTiA6IDEgOiA1NTQ2MDAKKyBGUklFU0xBTkQgOiAxIDogNjAwMDAwCisgRFJFTlRIRSA6IDEgOiA0NDM1MDAKKyBOT09SRC1IT0xMQU5EIDogMSA6IDIzOTcxMDAKKyBPVkVSSUpTU0VMIDogMSA6IDEwMjYzMDAKKyBGTEVWT0xBTkQgOiAxIDogMjIxNTAwCisgR0VMREVSTEFORCA6IDEgOiAxODE2OTAwCisgWlVJRC1IT0xMQU5EIDogMSA6IDMyNDU0MDAKKyBVVFJFQ0hUIDogMSA6IDEwMjY4MDAKKyBOT09SRC1CUkFCQU5UIDogMSA6IDIyMDkwMDAKKyBaRUVMQU5EIDogMSA6IDM1NzUwMAorTElNQlVSRyA6IDEgOiAxMTMxOTM4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05JQ0FSQUdVQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9OSUNBUkFHVUFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM0Y2IxNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9OSUNBUkFHVUFfQVJFQS50eHQKQEAgLTAsMCArMSBAQAorTklDQVJBR1VBIDogMCA6IDEyMDMzOQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05JQ0FSQUdVQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9OSUNBUkFHVUFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5Yzk3ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9OSUNBUkFHVUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSBAQAorTklDQVJBR1VBIDogMCA6IDUxNDIwOTgKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9OSUdFUklBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05JR0VSSUFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5MzQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9OSUdFUklBX0FSRUEudHh0CkBAIC0wLDAgKzEsMzcgQEAKK05pZ2VyaWEJOgkwCToJOTIzNzY4CitBYmlhICAJOgkxCToJNjMyMAorQWJ1amEgRkNUIFtGQ1RdIAk6CTEJOgk3MzE1CitBZGFtYXdhIFtBZGFtd2FyYV0JOgkxCToJMzY5MTcKK0Frd2FsYm9tIAk6CTEJOgk3MDgxCitBbmFtYnJhIAk6CTEJOgk0ODQ0CitCYXVjaGkgCToJMQk6CTY0NjA1CitCYXllbHNhIAk6CTEJOgkwICAKK0JlbnVlIAk6CTEJOgkzNDA1OQorQm9ybm8gCToJMQk6CTcwODk4CitDcm9zcyBSaXZlciAJOgkxCToJMjAxNTYKK0RlbHRhIAk6CTEJOgkxNzY5OAorRWJvbnlpIAk6CTEJOgkgIDAKK0VkbyAJOgkxCToJMTc4MDIKK0VraXRpIAk6CTEJOgkgIDAKK0VudWd1IAk6CTEJOgkxMjgzMQorR29tYmUgCToJMQk6CSAgMAorSW1vIAk6CTEJOgk1NTMwCitKaWdhd2EgCToJMQk6CTIzMTU0CitLYWR1bmEgCToJMQk6CTQ2MDUzCitLYW5vIAk6CTEJOgkyMDEzMQorS2F0c2luYSAJOgkxCToJMjQxOTIKK0tlYmJpIAk6CTEJOgkzNjgwMAorS29naSAJOgkxCToJMjk4MzMKK0t3YXJhIAk6CTEJOgkzNjgyNQorTGFnb3MgCToJMQk6CTMzNDUKK05hc2FyYXdhIAk6CTEJOgkyNzExNworTmlnZXIgCToJMQk6CTc2MzYzCitPZ3VuIAk6CTEJOgkxNjc2MgorT25kbyAJOgkxCToJMjA5NTkKK09zdW4gCToJMQk6CTkyNTEKK095byAJOgkxCToJMjg0NTQKK1BsYXRlYXUgCToJMQk6CTMwOTEzCitSaXZlcnMgCToJMQk6CTIxODUwCitTb2tvdG8gCToJMQk6CTY1NzM1CitUYXJhYmEgCToJMQk6CTU0NDczCitZb2JlIAk6CTEJOgk0NTUwMgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05JR0VSSUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTklHRVJJQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzE0MDJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05JR0VSSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwzNyBAQAorTmlnZXJpYQk6CTAJOgkxMzE4NTk3MzEKK0FiaWEgIAk6CTEJOgkyNTY5MzYyCitBYnVqYSBGQ1QgW0ZDVF0JOgkxCToJNDIzMzkxCitBZGFtYXdhIFtBZGFtd2FyYV0gCToJMQk6CTIzNzQ4OTIKK0Frd2FsYm9tIAk6CTEJOgkyNjM4NDEzCitBbmFtYnJhIAk6CTEJOgkzMDk0NzgzCitCYXVjaGkgCToJMQk6CTQ4MDE1NjkKK0JheWVsc2EgCToJMQk6CTAKK0JlbnVlIAk6CTEJOgkzMTA4NzU0CitCb3JubyAJOgkxCToJMjkwMzIzOAorQ3Jvc3MgUml2ZXIgCToJMQk6CTIwODU5MjYKK0RlbHRhIAk6CTEJOgkyODczNzExCitFYm9ueWkgCToJMQk6CTAKK0VkbyAJOgkxCToJMjQxNDkxOQorRWtpdGkgCToJMQk6CTAKK0VudWd1IAk6CTEJOgkzNTM0NjMzCitHb21iZSAJOgkxCToJMAorSW1vIAk6CTEJOgkyNzc5MDI4CitKaWdhd2EgCToJMQk6CTMxNjQxMzQKK0thZHVuYSAJOgkxCToJNDQzODAwNworS2FubyAJOgkxCToJNjI5NzE2NQorS2F0c2luYSAJOgkxCToJNDMzNjM2MworS2ViYmkgCToJMQk6CTIzMDU3NjgKK0tvZ2kgCToJMQk6CTIzNDY5MzYKK0t3YXJhIAk6CTEJOgkxNzUxNDY0CitMYWdvcyAJOgkxCToJNjM1NzI1MworTmFzYXJhd2EgCToJMQk6CTAKK05pZ2VyIAk6CTEJOgkyNzc1NTI2CitPZ3VuIAk6CTEJOgkyNjE0NzQ3CitPbmRvIAk6CTEJOgk0MzQzMjMwCitPc3VuIAk6CTEJOgkyNDYzMTg1CitPeW8gCToJMQk6CTM5MDA4MDMKK1BsYXRlYXUgCToJMQk6CTM2NzE0OTgKK1JpdmVycyAJOgkxCToJNDQ1NDMzNworU29rb3RvIAk6CTEJOgk0OTExMTE4CitUYXJhYmEgCToJMQk6CTE2NTU0NDMKK1lvYmUgCToJMQk6CTE1NzgxNzIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTklHRVJfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTklHRVJfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3ZTMzYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9OSUdFUl9BUkVBLnR4dApAQCAtMCwwICsxLDQ4IEBACitOaWdlcgk6CTAJOgkxMjY3MDAwCitBZ2FkZXoJOgkxCToJNjI3MDgwCitBcmxpdCAJOgkxCToJMAorQmlsbWEgCToJMQk6CTAKK1RjaGlyb3rpcmluZSAJOgkxCToJMAorRGlmZmEJOgkxCToJMTQ3MDE3CitEaWZmYSBDb21tLiAJOgkxCToJMAorTWHubukgU29yb2EgCToJMQk6CTAKK04nZ3VpZ21pIAk6CTEJOgkwCitEb3Nzbwk6CTEJOgkzMTc0MAorQm9ib3llIAk6CTEJOgkwCitEb2dvbmRvdXRjaGkgCToJMQk6CTAKK0Rvc3NvIAk6CTEJOgkwCitHYXlhIAk6CTEJOgkwCitMb2dhIAk6CTEJOgkwCitNYXJhZGkJOgkxCToJMzkyMTkKK0FndWnpIAk6CTEJOgkwCitEYWtvcm8gCToJMQk6CTAKK0d1aWRhbiBSb3VtZGppIAk6CTEJOgkwCitNYWRhcm91bmZhIAk6CTEJOgkwCitNYXlhaGkgCToJMQk6CTAKK1Rlc3Nhb3VhIAk6CTEJOgkwCitOaWFtZXkJOgkxCToJNDAyCitOYWltZXkgQ29tbTEgCToJMQk6CTAKK05haW1leSBDb21tMiAJOgkxCToJMAorTmFpbWV5IENvbW0zIAk6CTEJOgkwCitUYWhvdWEJOgkxCToJMTA2Mzk3CitBYmFsYWsgCToJMQk6CTAKK0JpbWkgTidLb25uaSAJOgkxCToJMAorQm91emEgCToJMQk6CTAKK0lsbOlsYSAJOgkxCToJMAorS2VpdGEgCToJMQk6CTAKK01hZGFvdWEgCToJMQk6CTAKK1RhaG91YSAJOgkxCToJMAorVGNoaW50YS1CYXJhZGVuIAk6CTEJOgkwCitUaWxsYWJlcnkJOgkxCToJOTE1MjEKK0ZpbGluZ3XpIAk6CTEJOgkwCitLb2xsbyAJOgkxCToJMAorT3VhbGxhbSAJOgkxCToJMAorU2F5IAk6CTEJOgkwCitU6XJhIAk6CTEJOgkwCitUaWxsYWLpcnkgCToJMQk6CTAKK3ppbmRlcgk6CTEJOgkxNDYxNzAKK0dvdXLpIAk6CTEJOgkwCitNYWdhcmlhIAk6CTEJOgkwCitNYXRhbWV5ZSAJOgkxCToJMAorTWlyaWFoIAk6CTEJOgkwCitUYW5vdXQgCToJMQk6CTAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9OSUdFUl9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9OSUdFUl9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzBkZWRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05JR0VSX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsNDggQEAKK05pZ2VyCToJMAk6CTEyNTI1MDk0CitBZ2FkZXoJOgkxCToJMzEzMjc0CitBcmxpdCAJOgkxCToJOTYzMjUKK0JpbG1hIAk6CTEJOgkxNDExNQorVGNoaXJveulyaW5lIAk6CTEJOgkyMDI4MzQKK0RpZmZhCToJMQk6CTMyOTY1OAorRGlmZmEgQ29tbS4gCToJMQk6CTE0MjUyMgorTWHubukgU29yb2EgCToJMQk6CTEzNTkxMQorTidndWlnbWkgCToJMQk6CTUxMjI1CitEb3Nzbwk6CTEJOgkxNDc5MDk1CitCb2JveWUgCToJMQk6CTI2NDg4NAorRG9nb25kb3V0Y2hpIAk6CTEJOgk0ODI4ODIKK0Rvc3NvIAk6CTEJOgkzNTI0MTMKK0dheWEgCToJMQk6CTI0NzEyNworTG9nYSAJOgkxCToJMTMxNzg5CitNYXJhZGkJOgkxCToJMjIwMjAzNQorQWd1aekgCToJMQk6CTI3MzkyNgorRGFrb3JvIAk6CTEJOgk0Mjk5NzUKK0d1aWRhbiBSb3VtZGppIAk6CTEJOgkzNDE4MzMKK01hZGFyb3VuZmEgCToJMQk6CTQzMTgzMworTWF5YWhpIAk6CTEJOgkzODg2MDcKK1Rlc3Nhb3VhIAk6CTEJOgkzMzU4NjEKK05pYW1leQk6CTEJOgk2NzQ5NTAKK05haW1leSBDb21tMSAJOgkxCToJMjk5Mzg2CitOYWltZXkgQ29tbTIgCToJMQk6CTI4MjM4MgorTmFpbWV5IENvbW0zIAk6CTEJOgk5MzE4MgorVGFob3VhCToJMQk6CTE5MDgxMDAKK0FiYWxhayAJOgkxCToJNzc2NzAKK0JpbWkgTidLb25uaSAJOgkxCToJMzUxNzgxCitCb3V6YSAJOgkxCToJMjY5NTQ5CitJbGzpbGEgCToJMQk6CTI1NjgxMworS2VpdGEgCToJMQk6CTIxMDM2OAorTWFkYW91YSAJOgkxCToJMzExMDU1CitUYWhvdWEgCToJMQk6CTM0NTg1MQorVGNoaW50YS1CYXJhZGVuIAk6CTEJOgk4NTAxMworVGlsbGFiZXJ5CToJMQk6CTE4NTgzNDIKK0ZpbGluZ3XpIAk6CTEJOgk0MDQwODYKK0tvbGxvIAk6CTEJOgkzMTY1ODcKK091YWxsYW0gCToJMQk6CTI4MDIzMworU2F5IAk6CTEJOgkyMjk2MjgKK1TpcmEgCToJMQk6CTQxMzg1MAorVGlsbGFi6XJ5IAk6CTEJOgkyMTM5NTgKK3ppbmRlcgk6CTEJOgkyMDI0ODk4CitHb3Vy6SAJOgkxCToJMjE5ODAyCitNYWdhcmlhIAk6CTEJOgk0ODU3MDMKK01hdGFtZXllIAk6CTEJOgkyMzgyMzIKK01pcmlhaCAJOgkxCToJNzQ5MzMyCitUYW5vdXQgCToJMQk6CTMzMTgyOQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05PUlRIIEtPUkVBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05PUlRIIEtPUkVBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlODIzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTk9SVEggS09SRUFfQVJFQS50eHQKQEAgLTAsMCArMSwxNCBAQAorTm9ydGggS29yZWEJOgkwCToJMTIwNTQwCitDaGFuZ2FuZyAJOgkxCToJMTY5NjgKK1NvdXRoIEhhbWd5b25nCToJMQk6CTE3NTcwCitOb3J0aCBIYW1neW9uZwk6CTEJOgkxODk3MAorTm9ydGggSHdhbmdoYWUgW0h3YW5naGFlYnVrLWRvXSAJOgkxCToJODAwNworU291dGggSHdhbmdoYWUgW0h3YW5naGFlbmFtLWRvXSAJOgkxCToJODAwMgorS2Flc29uZyAJOgkxCToJMTI1NQorS2FuZ3dvbgk6CTEJOgkxMTE1MgorTmFqaW4gU28obmJvbmctc2kgCToJMQk6CTAKK05hbXBvIAk6CTEJOgk3NTMKK1B5b25neWFuZwk6CTEJOgkxMjE5MQorU291dGggUHlvbmdhbgk6CTEJOgkxMTU3NworTm9ydGggUHlvbmdhbgk6CTEJOgkyMDAwCitZYW5nZ2FuZwk6CTEJOgkxNDMxNwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05PUlRIIEtPUkVBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05PUlRIIEtPUkVBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNDAzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTk9SVEggS09SRUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxNCBAQAorTm9ydGggS29yZWEJOgkwCToJMjMxMTMwMTkKK0NoYW5nYW5nIAk6CTEJOgkxMTUyNzMzCitTb3V0aCBIYW1neW9uZwk6CTEJOgkyMDYwNzI1CitOb3J0aCBIYW1neW9uZwk6CTEJOgkyNzMyMjMyCitOb3J0aCBId2FuZ2hhZSBbSHdhbmdoYWVidWstZG9dIAk6CTEJOgkxNTEyMDYwCitTb3V0aCBId2FuZ2hhZSBbSHdhbmdoYWVuYW0tZG9dIAk6CTEJOgkyMDEwOTUzCitLYWVzb25nIAk6CTEJOgkzMzQ0MzMKK0thbmd3b24JOgkxCToJMTMwNDQ4MQorTmFqaW4gU28obmJvbmctc2kgCToJMQk6CTAKK05hbXBvIAk6CTEJOgk3MzE0NDgKK1B5b25neWFuZwk6CTEJOgkyNDA0NDkwCitTb3V0aCBQeW9uZ2FuCToJMQk6CTI4NjYxMDkKK05vcnRoIFB5b25nYW4JOgkxCToJMjc0MTI2MAorWWFuZ2dhbmcJOgkxCToJNjM4NDc0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTk9SVEhLT1JFQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9OT1JUSEtPUkVBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MzZlNjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTk9SVEhLT1JFQV9BUkVBLnR4dApAQCAtMCwwICsxLDE0IEBACitOb3J0aCBLb3JlYQk6CTAJOgkxMjA1NDAKK0NoYW5nYW5nIAk6CTEJOgkxNjk2OAorU291dGggSGFtZ3lvbmcJOgkxCToJMTc1NzAKK05vcnRoIEhhbWd5b25nCToJMQk6CTE4OTcwCitOb3J0aCBId2FuZ2hhZSBbSHdhbmdoYWVidWstZG9dIAk6CTEJOgk4MDA3CitTb3V0aCBId2FuZ2hhZSBbSHdhbmdoYWVuYW0tZG9dIAk6CTEJOgk4MDAyCitLYWVzb25nIAk6CTEJOgkxMjU1CitLYW5nd29uCToJMQk6CTExMTUyCitOYWppbiBTbyhuYm9uZy1zaSAJOgkxCToJMAorTmFtcG8gCToJMQk6CTc1MworUHlvbmd5YW5nCToJMQk6CTEyMTkxCitTb3V0aCBQeW9uZ2FuCToJMQk6CTExNTc3CitOb3J0aCBQeW9uZ2FuCToJMQk6CTIwMDAKK1lhbmdnYW5nCToJMQk6CTE0MzE3ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05PUlRIS09SRUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTk9SVEhLT1JFQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTUwOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05PUlRIS09SRUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxNCBAQAorTm9ydGggS29yZWEJOgkwCToJMjMxMTMwMTkKK0NoYW5nYW5nIAk6CTEJOgkxMTUyNzMzCitTb3V0aCBIYW1neW9uZwk6CTEJOgkyMDYwNzI1CitOb3J0aCBIYW1neW9uZwk6CTEJOgkyNzMyMjMyCitOb3J0aCBId2FuZ2hhZSBbSHdhbmdoYWVidWstZG9dIAk6CTEJOgkxNTEyMDYwCitTb3V0aCBId2FuZ2hhZSBbSHdhbmdoYWVuYW0tZG9dIAk6CTEJOgkyMDEwOTUzCitLYWVzb25nIAk6CTEJOgkzMzQ0MzMKK0thbmd3b24JOgkxCToJMTMwNDQ4MQorTmFqaW4gU28obmJvbmctc2kgCToJMQk6CTAKK05hbXBvIAk6CTEJOgk3MzE0NDgKK1B5b25neWFuZwk6CTEJOgkyNDA0NDkwCitTb3V0aCBQeW9uZ2FuCToJMQk6CTI4NjYxMDkKK05vcnRoIFB5b25nYW4JOgkxCToJMjc0MTI2MAorWWFuZ2dhbmcJOgkxCToJNjM4NDc0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05PUldBWV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9OT1JXQVlfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiZWJhYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9OT1JXQVlfQVJFQS50eHQKQEAgLTAsMCArMSwxOCBAQAorIEZpbm5tYXJrIDogMSA6IDQ4NjM3LjAKKyBUcm9tcyA6IDEgOiAyNTk1NC4wCisgTm9yZGxhbmQgOiAxIDogMzgzMjcuMAorIE5vcmQtVHJvZW5kZWxhZyA6IDEgOiAyMjQ2My4wCisgU29lci1Ucm9lbmRlbGFnIDogMSA6IDE4ODMxLjAKKyBNb2VyZSBvZyBSb21zZGFsIDogMSA6IDE1MTA0LjAKKyBIZWRtYXJrIDogMSA6IDI3Mzg4LjAKKyBPcHBsYW5kIDogMSA6IDI1MjYwLjAKKyBTb2duIG9nIEZqb3JkYW5lIDogMSA6IDE4NjM0LjAKKyBCdXNrZXJ1ZCA6IDEgOiAxNDkyNy4wCisgSG9yZGFsYW5kIDogMSA6IDE1NjM0LjAKKyBPc2xvIG9nIEFrZXJzaHVzIDogMSA6IDUzNzEuMAorIFRlbGVtYXJrIDogMSA6IDE1MzE1LjAKKyBPZXN0Zm9sZCA6IDEgOiA0MTgzLjAKKyBSb2dhbGFuZCA6IDEgOiA5MTQxLjAKKyBWZXN0Zm9sZCA6IDEgOiAyMjE2LjAKKyBBdXN0LUFnZGVyIDogMSA6IDkyMTIuMAorIFZlc3QtQWdkZXIgOiAxIDogNzI4MC4wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvTk9SV0FZX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05PUldBWV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTM5YjA1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL05PUldBWV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDE4IEBACisgRmlubm1hcmsgOiAxIDogNzQ1OTAKKyBUcm9tcyA6IDEgOiAxNDY4MTYKKyBOb3JkbGFuZCA6IDEgOiAyMzk1MzIKKyBOb3JkLVRyb2VuZGVsYWcgOiAxIDogMTI3MjI2CisgU29lci1Ucm9lbmRlbGFnIDogMSA6IDI1MTA3NgorIE1vZXJlIG9nIFJvbXNkYWwgOiAxIDogMjM4MzQ2CisgSGVkbWFyayA6IDEgOiAxODczMTQKKyBPcHBsYW5kIDogMSA6IDE4MjU5MworIFNvZ24gb2cgRmpvcmRhbmUgOiAxIDogMTA2NjE0CisgQnVza2VydWQgOiAxIDogMjI1MjYxCisgSG9yZGFsYW5kIDogMSA6IDQxMTAyMgorIE9zbG8gb2cgQWtlcnNodXMgOiAxIDogODc5NzU4CisgVGVsZW1hcmsgOiAxIDogMTYyOTgxCisgT2VzdGZvbGQgOiAxIDogMjM4MzQ1CisgUm9nYWxhbmQgOiAxIDogMzM3OTA2CisgVmVzdGZvbGQgOiAxIDogMTk4MzU0CisgQXVzdC1BZ2RlciA6IDEgOiA5NzMxNAorIFZlc3QtQWdkZXIgOiAxIDogMTQ1MDkxCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvT01BTl9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9PTUFOX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MGNkMWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvT01BTl9BUkVBLnR4dApAQCAtMCwwICsxLDkgQEAKK09tYW4JOgkwCToJMjEyNDYwCitBIGRha2hsaXlhCToJMQk6CTMxOTAwCitBbCBEaGFoaXJhCToJMQk6CTQ0MDAwCitBbCBCYXRuYWgJOgkxCToJMTI1MDAKK0FsIFd1c3RhCToJMQk6CTc5NzAwCitBIFNoYXJxaXlhCToJMQk6CTM2NDAwCitkaG9mYXIJOgkxCToJOTkzMDAKK011c2FuZGFtCToJMQk6CTE4MDAKK011c2NhdAk6CTEJOgkzOTAwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvT01BTl9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9PTUFOX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjM2NiNzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvT01BTl9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDkgQEAKK09tYW4JOgkwCToJMzEwMjIyOQorQSBkYWtobGl5YQk6CTEJOgkyNjcxNDAKK0FsIERoYWhpcmEJOgkxCToJMjA3MDE1CitBbCBCYXRuYWgJOgkxCToJNjUzNTA1CitBbCBXdXN0YQk6CTEJOgkyMjk4MworQSBTaGFycWl5YQk6CTEJOgkzMTM3NjEKK2Rob2Zhcgk6CTEJOgkyMTU5NjAKK011c2FuZGFtCToJMQk6CTI4Mzc4CitNdXNjYXQJOgkxCToJNjMyMDczCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEFLSVNUQU5fQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEFLSVNUQU5fQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4OWYyYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9QQUtJU1RBTl9BUkVBLnR4dApAQCAtMCwwICsxLDkgQEAKK1Bha2lzdGFuCToJMAk6CTgwMzk0MAorSmFtbXUgYW5kIGthc2htaXIJOgkxCToJMTMyOTcKK0JhbHVjaGlzdGFuCToJMQk6CTM0NzE5MAorRi5BLlQuQS4JOgkxCToJMjcyMjAKK0YuQy5ULgk6CTEJOgk5MDYKK04uVy5GLlAuCToJMQk6CTc0NTIxCitOb3J0aGVybiBBcmVhcyAJOgkxCToJNzI1MjAKK1B1bmphYiAJOgkxCToJMjA1MzQ1CitTaW5kCToJMQk6CTE0MDkxNApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BBS0lTVEFOX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BBS0lTVEFOX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YThjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEFLSVNUQU5fUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSw5IEBACitQYWtpc3Rhbgk6CTAJOgkxNjU4MDM1NjAKK0phbW11IGFuZCBrYXNobWlyCToJMQk6CTI1ODAwMDAKK0JhbHVjaGlzdGFuCToJMQk6CTY1NjU4ODUKK0YuQS5ULkEuCToJMQk6CTMxNzYzMzEKK0YuQy5ULgk6CTEJOgk4MDUyMzUKK04uVy5GLlAuCToJMQk6CTE3NzQzNjQ1CitOb3J0aGVybiBBcmVhcyAJOgkxCToJNzMwMDAwCitQdW5qYWIgCToJMQk6CTczNjIxMjkwCitTaW5kCToJMQk6CTMwNDM5ODkzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEFOQU1BX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BBTkFNQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzdlYmU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BBTkFNQV9BUkVBLnR4dApAQCAtMCwwICsxIEBACitQQU5BTUEgOiAwIDogNzUwMDEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9QQU5BTUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEFOQU1BX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYzg2ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEFOQU1BX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEgQEAKK1BBTkFNQSA6IDAgOiAzMjgzOTU5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BBUFVBIE5FVyBHVUlORUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEFQVUEgTkVXIEdVSU5FQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGM4MWFhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BBUFVBIE5FVyBHVUlORUFfQVJFQS50eHQKQEAgLTAsMCArMSwxMDEzIEBACitQYXB1YSBOZXcgR3VpbmVhCToJMAk6CTQ2Mjg0MAorUEctVU5LLTEJOgkxCToJOTMzCitQRy1VTkstMgk6CTEJOgk5MzMKK1BHLVVOSy0zCToJMQk6CTkzMworUEctVU5LLTQJOgkxCToJOTMzCitQRy1VTkstNQk6CTEJOgk5MzMKK1BHLVVOSy02CToJMQk6CTkzMworUEctVU5LLTcJOgkxCToJOTMzCitQRy1VTkstOAk6CTEJOgk5MzMKK1BHLVVOSy05CToJMQk6CTkzMworUEctVU5LLTEwCToJMQk6CTkzMworUEctVU5LLTExCToJMQk6CTkzMworUEctVU5LLTEyCToJMQk6CTkzMworUEctVU5LLTEzCToJMQk6CTkzMworUEctVU5LLTE0CToJMQk6CTkzMworUEctVU5LLTE1CToJMQk6CTkzMworUEctVU5LLTE2CToJMQk6CTkzMworUEctVU5LLTE3CToJMQk6CTkzMworUEctVU5LLTE4CToJMQk6CTkzMworUEctVU5LLTE5CToJMQk6CTkzMworUEctVU5LLTIwCToJMQk6CTkzMworUEctVU5LLTIxCToJMQk6CTkzMworUEctVU5LLTIyCToJMQk6CTkzMworUEctVU5LLTIzCToJMQk6CTkzMworUEctVU5LLTI0CToJMQk6CTkzMworUEctVU5LLTI1CToJMQk6CTkzMworUEctVU5LLTI2CToJMQk6CTkzMworUEctVU5LLTI3CToJMQk6CTkzMworUEctVU5LLTI4CToJMQk6CTkzMworUEctVU5LLTI5CToJMQk6CTkzMworUEctVU5LLTMwCToJMQk6CTkzMworUEctVU5LLTMxCToJMQk6CTkzMworUEctVU5LLTMyCToJMQk6CTkzMworUEctVU5LLTMzCToJMQk6CTkzMworUEctVU5LLTM0CToJMQk6CTkzMworUEctVU5LLTM1CToJMQk6CTkzMworUEctVU5LLTM2CToJMQk6CTkzMworUEctVU5LLTM3CToJMQk6CTkzMworUEctVU5LLTM4CToJMQk6CTkzMworUEctVU5LLTM5CToJMQk6CTkzMworUEctVU5LLTQwCToJMQk6CTkzMworUEctVU5LLTQxCToJMQk6CTkzMworUEctVU5LLTQyCToJMQk6CTkzMworUEctVU5LLTQzCToJMQk6CTkzMworUEctVU5LLTQ0CToJMQk6CTkzMworUEctVU5LLTQ1CToJMQk6CTkzMworUEctVU5LLTQ2CToJMQk6CTkzMworUEctVU5LLTQ3CToJMQk6CTkzMworUEctVU5LLTQ4CToJMQk6CTkzMworUEctVU5LLTQ5CToJMQk6CTkzMworUEctVU5LLTUwCToJMQk6CTkzMworUEctVU5LLTUxCToJMQk6CTkzMworUEctVU5LLTUyCToJMQk6CTkzMworUEctVU5LLTUzCToJMQk6CTkzMworUEctVU5LLTU0CToJMQk6CTkzMworUEctVU5LLTU1CToJMQk6CTkzMworUEctVU5LLTU2CToJMQk6CTkzMworUEctVU5LLTU3CToJMQk6CTkzMworUEctVU5LLTU4CToJMQk6CTkzMworUEctVU5LLTU5CToJMQk6CTkzMworUEctVU5LLTYwCToJMQk6CTkzMworUEctVU5LLTYxCToJMQk6CTkzMworUEctVU5LLTYyCToJMQk6CTkzMworUEctVU5LLTYzCToJMQk6CTkzMworUEctVU5LLTY0CToJMQk6CTkzMworUEctVU5LLTY1CToJMQk6CTkzMworUEctVU5LLTY2CToJMQk6CTkzMworUEctVU5LLTY3CToJMQk6CTkzMworUEctVU5LLTY4CToJMQk6CTkzMworUEctVU5LLTY5CToJMQk6CTkzMworUEctVU5LLTcwCToJMQk6CTkzMworUEctVU5LLTcxCToJMQk6CTkzMworUEctVU5LLTcyCToJMQk6CTkzMworUEctVU5LLTczCToJMQk6CTkzMworUEctVU5LLTc0CToJMQk6CTkzMworUEctVU5LLTc1CToJMQk6CTkzMworUEctVU5LLTc2CToJMQk6CTkzMworUEctVU5LLTc3CToJMQk6CTkzMworUEctVU5LLTc4CToJMQk6CTkzMworUEctVU5LLTc5CToJMQk6CTkzMworUEctVU5LLTgwCToJMQk6CTkzMworUEctVU5LLTgxCToJMQk6CTkzMworUEctVU5LLTgyCToJMQk6CTkzMworUEctVU5LLTgzCToJMQk6CTkzMworUEctVU5LLTg0CToJMQk6CTkzMworUEctVU5LLTg1CToJMQk6CTkzMworUEctVU5LLTg2CToJMQk6CTkzMworUEctVU5LLTg3CToJMQk6CTkzMworUEctVU5LLTg4CToJMQk6CTkzMworUEctVU5LLTg5CToJMQk6CTkzMworUEctVU5LLTkwCToJMQk6CTkzMworUEctVU5LLTkxCToJMQk6CTkzMworUEctVU5LLTkyCToJMQk6CTkzMworUEctVU5LLTkzCToJMQk6CTkzMworUEctVU5LLTk0CToJMQk6CTkzMworUEctVU5LLTk1CToJMQk6CTkzMworUEctVU5LLTk2CToJMQk6CTkzMworUEctVU5LLTk3CToJMQk6CTkzMworUEctVU5LLTk4CToJMQk6CTkzMworUEctVU5LLTk5CToJMQk6CTkzMworUEctVU5LLTEwMAk6CTEJOgk5MzMKK1BHLVVOSy0xMDEJOgkxCToJOTMzCitQRy1VTkstMTAyCToJMQk6CTkzMworUEctVU5LLTEwMwk6CTEJOgk5MzMKK1BHLVVOSy0xMDQJOgkxCToJOTMzCitQRy1VTkstMTA1CToJMQk6CTkzMworUEctVU5LLTEwNgk6CTEJOgk5MzMKK1BHLVVOSy0xMDcJOgkxCToJOTMzCitQRy1VTkstMTA4CToJMQk6CTkzMworUEctVU5LLTEwOQk6CTEJOgk5MzMKK1BHLVVOSy0xMTAJOgkxCToJOTMzCitQRy1VTkstMTExCToJMQk6CTkzMworUEctVU5LLTExMgk6CTEJOgk5MzMKK1BHLVVOSy0xMTMJOgkxCToJOTMzCitQRy1VTkstMTE0CToJMQk6CTkzMworUEctVU5LLTExNQk6CTEJOgk5MzMKK1BHLVVOSy0xMTYJOgkxCToJOTMzCitQRy1VTkstMTE3CToJMQk6CTkzMworUEctVU5LLTExOAk6CTEJOgk5MzMKK1BHLVVOSy0xMTkJOgkxCToJOTMzCitQRy1VTkstMTIwCToJMQk6CTkzMworUEctVU5LLTEyMQk6CTEJOgk5MzMKK1BHLVVOSy0xMjIJOgkxCToJOTMzCitQRy1VTkstMTIzCToJMQk6CTkzMworUEctVU5LLTEyNAk6CTEJOgk5MzMKK1BHLVVOSy0xMjUJOgkxCToJOTMzCitQRy1VTkstMTI2CToJMQk6CTkzMworUEctVU5LLTEyNwk6CTEJOgk5MzMKK1BHLVVOSy0xMjgJOgkxCToJOTMzCitQRy1VTkstMTI5CToJMQk6CTkzMworUEctVU5LLTEzMAk6CTEJOgk5MzMKK1BHLVVOSy0xMzEJOgkxCToJOTMzCitQRy1VTkstMTMyCToJMQk6CTkzMworUEctVU5LLTEzMwk6CTEJOgk5MzMKK1BHLVVOSy0xMzQJOgkxCToJOTMzCitQRy1VTkstMTM1CToJMQk6CTkzMworUEctVU5LLTEzNgk6CTEJOgk5MzMKK1BHLVVOSy0xMzcJOgkxCToJOTMzCitQRy1VTkstMTM4CToJMQk6CTkzMworUEctVU5LLTEzOQk6CTEJOgk5MzMKK1BHLVVOSy0xNDAJOgkxCToJOTMzCitQRy1VTkstMTQxCToJMQk6CTkzMworUEctVU5LLTE0Mgk6CTEJOgk5MzMKK1BHLVVOSy0xNDMJOgkxCToJOTMzCitQRy1VTkstMTQ0CToJMQk6CTkzMworUEctVU5LLTE0NQk6CTEJOgk5MzMKK1BHLVVOSy0xNDYJOgkxCToJOTMzCitQRy1VTkstMTQ3CToJMQk6CTkzMworUEctVU5LLTE0OAk6CTEJOgk5MzMKK1BHLVVOSy0xNDkJOgkxCToJOTMzCitQRy1VTkstMTUwCToJMQk6CTkzMworUEctVU5LLTE1MQk6CTEJOgk5MzMKK1BHLVVOSy0xNTIJOgkxCToJOTMzCitQRy1VTkstMTUzCToJMQk6CTkzMworUEctVU5LLTE1NAk6CTEJOgk5MzMKK1BHLVVOSy0xNTUJOgkxCToJOTMzCitQRy1VTkstMTU2CToJMQk6CTkzMworUEctVU5LLTE1Nwk6CTEJOgk5MzMKK1BHLVVOSy0xNTgJOgkxCToJOTMzCitQRy1VTkstMTU5CToJMQk6CTkzMworUEctVU5LLTE2MAk6CTEJOgk5MzMKK1BHLVVOSy0xNjEJOgkxCToJOTMzCitQRy1VTkstMTYyCToJMQk6CTkzMworUEctVU5LLTE2Mwk6CTEJOgk5MzMKK1BHLVVOSy0xNjQJOgkxCToJOTMzCitQRy1VTkstMTY1CToJMQk6CTkzMworUEctVU5LLTE2Ngk6CTEJOgk5MzMKK1BHLVVOSy0xNjcJOgkxCToJOTMzCitQRy1VTkstMTY4CToJMQk6CTkzMworUEctVU5LLTE2OQk6CTEJOgk5MzMKK1BHLVVOSy0xNzAJOgkxCToJOTMzCitQRy1VTkstMTcxCToJMQk6CTkzMworUEctVU5LLTE3Mgk6CTEJOgk5MzMKK1BHLVVOSy0xNzMJOgkxCToJOTMzCitQRy1VTkstMTc0CToJMQk6CTkzMworUEctVU5LLTE3NQk6CTEJOgk5MzMKK1BHLVVOSy0xNzYJOgkxCToJOTMzCitQRy1VTkstMTc3CToJMQk6CTkzMworUEctVU5LLTE3OAk6CTEJOgk5MzMKK1BHLVVOSy0xNzkJOgkxCToJOTMzCitQRy1VTkstMTgwCToJMQk6CTkzMworUEctVU5LLTE4MQk6CTEJOgk5MzMKK1BHLVVOSy0xODIJOgkxCToJOTMzCitQRy1VTkstMTgzCToJMQk6CTkzMworUEctVU5LLTE4NAk6CTEJOgk5MzMKK1BHLVVOSy0xODUJOgkxCToJOTMzCitQRy1VTkstMTg2CToJMQk6CTkzMworUEctVU5LLTE4Nwk6CTEJOgk5MzMKK1BHLVVOSy0xODgJOgkxCToJOTMzCitQRy1VTkstMTg5CToJMQk6CTkzMworUEctVU5LLTE5MAk6CTEJOgk5MzMKK1BHLVVOSy0xOTEJOgkxCToJOTMzCitQRy1VTkstMTkyCToJMQk6CTkzMworUEctVU5LLTE5Mwk6CTEJOgk5MzMKK1BHLVVOSy0xOTQJOgkxCToJOTMzCitQRy1VTkstMTk1CToJMQk6CTkzMworUEctVU5LLTE5Ngk6CTEJOgk5MzMKK1BHLVVOSy0xOTcJOgkxCToJOTMzCitQRy1VTkstMTk4CToJMQk6CTkzMworUEctVU5LLTE5OQk6CTEJOgk5MzMKK1BHLVVOSy0yMDAJOgkxCToJOTMzCitQRy1VTkstMjAxCToJMQk6CTkzMworUEctVU5LLTIwMgk6CTEJOgk5MzMKK1BHLVVOSy0yMDMJOgkxCToJOTMzCitQRy1VTkstMjA0CToJMQk6CTkzMworUEctVU5LLTIwNQk6CTEJOgk5MzMKK1BHLVVOSy0yMDYJOgkxCToJOTMzCitQRy1VTkstMjA3CToJMQk6CTkzMworUEctVU5LLTIwOAk6CTEJOgk5MzMKK1BHLVVOSy0yMDkJOgkxCToJOTMzCitQRy1VTkstMjEwCToJMQk6CTkzMworUEctVU5LLTIxMQk6CTEJOgk5MzMKK1BHLVVOSy0yMTIJOgkxCToJOTMzCitQRy1VTkstMjEzCToJMQk6CTkzMworUEctVU5LLTIxNAk6CTEJOgk5MzMKK1BHLVVOSy0yMTUJOgkxCToJOTMzCitQRy1VTkstMjE2CToJMQk6CTkzMworUEctVU5LLTIxNwk6CTEJOgk5MzMKK1BHLVVOSy0yMTgJOgkxCToJOTMzCitQRy1VTkstMjE5CToJMQk6CTkzMworUEctVU5LLTIyMAk6CTEJOgk5MzMKK1BHLVVOSy0yMjEJOgkxCToJOTMzCitQRy1VTkstMjIyCToJMQk6CTkzMworUEctVU5LLTIyMwk6CTEJOgk5MzMKK1BHLVVOSy0yMjQJOgkxCToJOTMzCitQRy1VTkstMjI1CToJMQk6CTkzMworUEctVU5LLTIyNgk6CTEJOgk5MzMKK1BHLVVOSy0yMjcJOgkxCToJOTMzCitQRy1VTkstMjI4CToJMQk6CTkzMworUEctVU5LLTIyOQk6CTEJOgk5MzMKK1BHLVVOSy0yMzAJOgkxCToJOTMzCitQRy1VTkstMjMxCToJMQk6CTkzMworUEctVU5LLTIzMgk6CTEJOgk5MzMKK1BHLVVOSy0yMzMJOgkxCToJOTMzCitQRy1VTkstMjM0CToJMQk6CTkzMworUEctVU5LLTIzNQk6CTEJOgk5MzMKK1BHLVVOSy0yMzYJOgkxCToJOTMzCitQRy1VTkstMjM3CToJMQk6CTkzMworUEctVU5LLTIzOAk6CTEJOgk5MzMKK1BHLVVOSy0yMzkJOgkxCToJOTMzCitQRy1VTkstMjQwCToJMQk6CTkzMworUEctVU5LLTI0MQk6CTEJOgk5MzMKK1BHLVVOSy0yNDIJOgkxCToJOTMzCitQRy1VTkstMjQzCToJMQk6CTkzMworUEctVU5LLTI0NAk6CTEJOgk5MzMKK1BHLVVOSy0yNDUJOgkxCToJOTMzCitQRy1VTkstMjQ2CToJMQk6CTkzMworUEctVU5LLTI0Nwk6CTEJOgk5MzMKK1BHLVVOSy0yNDgJOgkxCToJOTMzCitQRy1VTkstMjQ5CToJMQk6CTkzMworUEctVU5LLTI1MAk6CTEJOgk5MzMKK1BHLVVOSy0yNTEJOgkxCToJOTMzCitQRy1VTkstMjUyCToJMQk6CTkzMworUEctVU5LLTI1Mwk6CTEJOgk5MzMKK1BHLVVOSy0yNTQJOgkxCToJOTMzCitQRy1VTkstMjU1CToJMQk6CTkzMworUEctVU5LLTI1Ngk6CTEJOgk5MzMKK1BHLVVOSy0yNTcJOgkxCToJOTMzCitQRy1VTkstMjU4CToJMQk6CTkzMworUEctVU5LLTI1OQk6CTEJOgk5MzMKK1BHLVVOSy0yNjAJOgkxCToJOTMzCitQRy1VTkstMjYxCToJMQk6CTkzMworUEctVU5LLTI2Mgk6CTEJOgk5MzMKK1BHLVVOSy0yNjMJOgkxCToJOTMzCitQRy1VTkstMjY0CToJMQk6CTkzMworUEctVU5LLTI2NQk6CTEJOgk5MzMKK1BHLVVOSy0yNjYJOgkxCToJOTMzCitQRy1VTkstMjY3CToJMQk6CTkzMworUEctVU5LLTI2OAk6CTEJOgk5MzMKK1BHLVVOSy0yNjkJOgkxCToJOTMzCitQRy1VTkstMjcwCToJMQk6CTkzMworUEctVU5LLTI3MQk6CTEJOgk5MzMKK1BHLVVOSy0yNzIJOgkxCToJOTMzCitQRy1VTkstMjczCToJMQk6CTkzMworUEctVU5LLTI3NAk6CTEJOgk5MzMKK1BHLVVOSy0yNzUJOgkxCToJOTMzCitQRy1VTkstMjc2CToJMQk6CTkzMworUEctVU5LLTI3Nwk6CTEJOgk5MzMKK1BHLVVOSy0yNzgJOgkxCToJOTMzCitQRy1VTkstMjc5CToJMQk6CTkzMworUEctVU5LLTI4MAk6CTEJOgk5MzMKK1BHLVVOSy0yODEJOgkxCToJOTMzCitQRy1VTkstMjgyCToJMQk6CTkzMworUEctVU5LLTI4Mwk6CTEJOgk5MzMKK1BHLVVOSy0yODQJOgkxCToJOTMzCitQRy1VTkstMjg1CToJMQk6CTkzMworUEctVU5LLTI4Ngk6CTEJOgk5MzMKK1BHLVVOSy0yODcJOgkxCToJOTMzCitQRy1VTkstMjg4CToJMQk6CTkzMworUEctVU5LLTI4OQk6CTEJOgk5MzMKK1BHLVVOSy0yOTAJOgkxCToJOTMzCitQRy1VTkstMjkxCToJMQk6CTkzMworUEctVU5LLTI5Mgk6CTEJOgk5MzMKK1BHLVVOSy0yOTMJOgkxCToJOTMzCitQRy1VTkstMjk0CToJMQk6CTkzMworUEctVU5LLTI5NQk6CTEJOgk5MzMKK1BHLVVOSy0yOTYJOgkxCToJOTMzCitQRy1VTkstMjk3CToJMQk6CTkzMworUEctVU5LLTI5OAk6CTEJOgk5MzMKK1BHLVVOSy0yOTkJOgkxCToJOTMzCitQRy1VTkstMzAwCToJMQk6CTkzMworUEctVU5LLTMwMQk6CTEJOgk5MzMKK1BHLVVOSy0zMDIJOgkxCToJOTMzCitQRy1VTkstMzAzCToJMQk6CTkzMworUEctVU5LLTMwNAk6CTEJOgk5MzMKK1BHLVVOSy0zMDUJOgkxCToJOTMzCitQRy1VTkstMzA2CToJMQk6CTkzMworUEctVU5LLTMwNwk6CTEJOgk5MzMKK1BHLVVOSy0zMDgJOgkxCToJOTMzCitQRy1VTkstMzA5CToJMQk6CTkzMworUEctVU5LLTMxMAk6CTEJOgk5MzMKK1BHLVVOSy0zMTEJOgkxCToJOTMzCitQRy1VTkstMzEyCToJMQk6CTkzMworUEctVU5LLTMxMwk6CTEJOgk5MzMKK1BHLVVOSy0zMTQJOgkxCToJOTMzCitQRy1VTkstMzE1CToJMQk6CTkzMworUEctVU5LLTMxNgk6CTEJOgk5MzMKK1BHLVVOSy0zMTcJOgkxCToJOTMzCitQRy1VTkstMzE4CToJMQk6CTkzMworUEctVU5LLTMxOQk6CTEJOgk5MzMKK1BHLVVOSy0zMjAJOgkxCToJOTMzCitQRy1VTkstMzIxCToJMQk6CTkzMworUEctVU5LLTMyMgk6CTEJOgk5MzMKK1BHLVVOSy0zMjMJOgkxCToJOTMzCitQRy1VTkstMzI0CToJMQk6CTkzMworUEctVU5LLTMyNQk6CTEJOgk5MzMKK1BHLVVOSy0zMjYJOgkxCToJOTMzCitQRy1VTkstMzI3CToJMQk6CTkzMworUEctVU5LLTMyOAk6CTEJOgk5MzMKK1BHLVVOSy0zMjkJOgkxCToJOTMzCitQRy1VTkstMzMwCToJMQk6CTkzMworUEctVU5LLTMzMQk6CTEJOgk5MzMKK1BHLVVOSy0zMzIJOgkxCToJOTMzCitQRy1VTkstMzMzCToJMQk6CTkzMworUEctVU5LLTMzNAk6CTEJOgk5MzMKK1BHLVVOSy0zMzUJOgkxCToJOTMzCitQRy1VTkstMzM2CToJMQk6CTkzMworUEctVU5LLTMzNwk6CTEJOgk5MzMKK1BHLVVOSy0zMzgJOgkxCToJOTMzCitQRy1VTkstMzM5CToJMQk6CTkzMworUEctVU5LLTM0MAk6CTEJOgk5MzMKK1BHLVVOSy0zNDEJOgkxCToJOTMzCitQRy1VTkstMzQyCToJMQk6CTkzMworUEctVU5LLTM0Mwk6CTEJOgk5MzMKK1BHLVVOSy0zNDQJOgkxCToJOTMzCitQRy1VTkstMzQ1CToJMQk6CTkzMworUEctVU5LLTM0Ngk6CTEJOgk5MzMKK1BHLVVOSy0zNDcJOgkxCToJOTMzCitQRy1VTkstMzQ4CToJMQk6CTkzMworUEctVU5LLTM0OQk6CTEJOgk5MzMKK1BHLVVOSy0zNTAJOgkxCToJOTMzCitQRy1VTkstMzUxCToJMQk6CTkzMworUEctVU5LLTM1Mgk6CTEJOgk5MzMKK1BHLVVOSy0zNTMJOgkxCToJOTMzCitQRy1VTkstMzU0CToJMQk6CTkzMworUEctVU5LLTM1NQk6CTEJOgk5MzMKK1BHLVVOSy0zNTYJOgkxCToJOTMzCitQRy1VTkstMzU3CToJMQk6CTkzMworUEctVU5LLTM1OAk6CTEJOgk5MzMKK1BHLVVOSy0zNTkJOgkxCToJOTMzCitQRy1VTkstMzYwCToJMQk6CTkzMworUEctVU5LLTM2MQk6CTEJOgk5MzMKK1BHLVVOSy0zNjIJOgkxCToJOTMzCitQRy1VTkstMzYzCToJMQk6CTkzMworUEctVU5LLTM2NAk6CTEJOgk5MzMKK1BHLVVOSy0zNjUJOgkxCToJOTMzCitQRy1VTkstMzY2CToJMQk6CTkzMworUEctVU5LLTM2Nwk6CTEJOgk5MzMKK1BHLVVOSy0zNjgJOgkxCToJOTMzCitQRy1VTkstMzY5CToJMQk6CTkzMworUEctVU5LLTM3MAk6CTEJOgk5MzMKK1BHLVVOSy0zNzEJOgkxCToJOTMzCitQRy1VTkstMzcyCToJMQk6CTkzMworUEctVU5LLTM3Mwk6CTEJOgk5MzMKK1BHLVVOSy0zNzQJOgkxCToJOTMzCitQRy1VTkstMzc1CToJMQk6CTkzMworUEctVU5LLTM3Ngk6CTEJOgk5MzMKK1BHLVVOSy0zNzcJOgkxCToJOTMzCitQRy1VTkstMzc4CToJMQk6CTkzMworUEctVU5LLTM3OQk6CTEJOgk5MzMKK1BHLVVOSy0zODAJOgkxCToJOTMzCitQRy1VTkstMzgxCToJMQk6CTkzMworUEctVU5LLTM4Mgk6CTEJOgk5MzMKK1BHLVVOSy0zODMJOgkxCToJOTMzCitQRy1VTkstMzg0CToJMQk6CTkzMworUEctVU5LLTM4NQk6CTEJOgk5MzMKK1BHLVVOSy0zODYJOgkxCToJOTMzCitQRy1VTkstMzg3CToJMQk6CTkzMworUEctVU5LLTM4OAk6CTEJOgk5MzMKK1BHLVVOSy0zODkJOgkxCToJOTMzCitQRy1VTkstMzkwCToJMQk6CTkzMworUEctVU5LLTM5MQk6CTEJOgk5MzMKK1BHLVVOSy0zOTIJOgkxCToJOTMzCitQRy1VTkstMzkzCToJMQk6CTkzMworUEctVU5LLTM5NAk6CTEJOgk5MzMKK1BHLVVOSy0zOTUJOgkxCToJOTMzCitQRy1VTkstMzk2CToJMQk6CTkzMworUEctVU5LLTM5Nwk6CTEJOgk5MzMKK1BHLVVOSy0zOTgJOgkxCToJOTMzCitQRy1VTkstMzk5CToJMQk6CTkzMworUEctVU5LLTQwMAk6CTEJOgk5MzMKK1BHLVVOSy00MDEJOgkxCToJOTMzCitQRy1VTkstNDAyCToJMQk6CTkzMworUEctVU5LLTQwMwk6CTEJOgk5MzMKK1BHLVVOSy00MDQJOgkxCToJOTMzCitQRy1VTkstNDA1CToJMQk6CTkzMworUEctVU5LLTQwNgk6CTEJOgk5MzMKK1BHLVVOSy00MDcJOgkxCToJOTMzCitQRy1VTkstNDA4CToJMQk6CTkzMworUEctVU5LLTQwOQk6CTEJOgk5MzMKK1BHLVVOSy00MTAJOgkxCToJOTMzCitQRy1VTkstNDExCToJMQk6CTkzMworUEctVU5LLTQxMgk6CTEJOgk5MzMKK1BHLVVOSy00MTMJOgkxCToJOTMzCitQRy1VTkstNDE0CToJMQk6CTkzMworUEctVU5LLTQxNQk6CTEJOgk5MzMKK1BHLVVOSy00MTYJOgkxCToJOTMzCitQRy1VTkstNDE3CToJMQk6CTkzMworUEctVU5LLTQxOAk6CTEJOgk5MzMKK1BHLVVOSy00MTkJOgkxCToJOTMzCitQRy1VTkstNDIwCToJMQk6CTkzMworUEctVU5LLTQyMQk6CTEJOgk5MzMKK1BHLVVOSy00MjIJOgkxCToJOTMzCitQRy1VTkstNDIzCToJMQk6CTkzMworUEctVU5LLTQyNAk6CTEJOgk5MzMKK1BHLVVOSy00MjUJOgkxCToJOTMzCitQRy1VTkstNDI2CToJMQk6CTkzMworUEctVU5LLTQyNwk6CTEJOgk5MzMKK1BHLVVOSy00MjgJOgkxCToJOTMzCitQRy1VTkstNDI5CToJMQk6CTkzMworUEctVU5LLTQzMAk6CTEJOgk5MzMKK1BHLVVOSy00MzEJOgkxCToJOTMzCitQRy1VTkstNDMyCToJMQk6CTkzMworUEctVU5LLTQzMwk6CTEJOgk5MzMKK1BHLVVOSy00MzQJOgkxCToJOTMzCitQRy1VTkstNDM1CToJMQk6CTkzMworUEctVU5LLTQzNgk6CTEJOgk5MzMKK1BHLVVOSy00MzcJOgkxCToJOTMzCitQRy1VTkstNDM4CToJMQk6CTkzMworUEctVU5LLTQzOQk6CTEJOgk5MzMKK1BHLVVOSy00NDAJOgkxCToJOTMzCitQRy1VTkstNDQxCToJMQk6CTkzMworUEctVU5LLTQ0Mgk6CTEJOgk5MzMKK1BHLVVOSy00NDMJOgkxCToJOTMzCitQRy1VTkstNDQ0CToJMQk6CTkzMworUEctVU5LLTQ0NQk6CTEJOgk5MzMKK1BHLVVOSy00NDYJOgkxCToJOTMzCitQRy1VTkstNDQ3CToJMQk6CTkzMworUEctVU5LLTQ0OAk6CTEJOgk5MzMKK1BHLVVOSy00NDkJOgkxCToJOTMzCitQRy1VTkstNDUwCToJMQk6CTkzMworUEctVU5LLTQ1MQk6CTEJOgk5MzMKK1BHLVVOSy00NTIJOgkxCToJOTMzCitQRy1VTkstNDUzCToJMQk6CTkzMworUEctVU5LLTQ1NAk6CTEJOgk5MzMKK1BHLVVOSy00NTUJOgkxCToJOTMzCitQRy1VTkstNDU2CToJMQk6CTkzMworUEctVU5LLTQ1Nwk6CTEJOgk5MzMKK1BHLVVOSy00NTgJOgkxCToJOTMzCitQRy1VTkstNDU5CToJMQk6CTkzMworUEctVU5LLTQ2MAk6CTEJOgk5MzMKK1BHLVVOSy00NjEJOgkxCToJOTMzCitQRy1VTkstNDYyCToJMQk6CTkzMworUEctVU5LLTQ2Mwk6CTEJOgk5MzMKK1BHLVVOSy00NjQJOgkxCToJOTMzCitQRy1VTkstNDY1CToJMQk6CTkzMworUEctVU5LLTQ2Ngk6CTEJOgk5MzMKK1BHLVVOSy00NjcJOgkxCToJOTMzCitQRy1VTkstNDY4CToJMQk6CTkzMworUEctVU5LLTQ2OQk6CTEJOgk5MzMKK1BHLVVOSy00NzAJOgkxCToJOTMzCitQRy1VTkstNDcxCToJMQk6CTkzMworUEctVU5LLTQ3Mgk6CTEJOgk5MzMKK1BHLVVOSy00NzMJOgkxCToJOTMzCitQRy1VTkstNDc0CToJMQk6CTkzMworUEctVU5LLTQ3NQk6CTEJOgk5MzMKK1BHLVVOSy00NzYJOgkxCToJOTMzCitQRy1VTkstNDc3CToJMQk6CTkzMworUEctVU5LLTQ3OAk6CTEJOgk5MzMKK1BHLVVOSy00NzkJOgkxCToJOTMzCitQRy1VTkstNDgwCToJMQk6CTkzMworUEctVU5LLTQ4MQk6CTEJOgk5MzMKK1BHLVVOSy00ODIJOgkxCToJOTMzCitQRy1VTkstNDgzCToJMQk6CTkzMworUEctVU5LLTQ4NAk6CTEJOgk5MzMKK1BHLVVOSy00ODUJOgkxCToJOTMzCitQRy1VTkstNDg2CToJMQk6CTkzMworUEctVU5LLTQ4Nwk6CTEJOgk5MzMKK1BHLVVOSy00ODgJOgkxCToJOTMzCitQRy1VTkstNDg5CToJMQk6CTkzMworUEctVU5LLTQ5MAk6CTEJOgk5MzMKK1BHLVVOSy00OTEJOgkxCToJOTMzCitQRy1VTkstNDkyCToJMQk6CTkzMworUEctVU5LLTQ5Mwk6CTEJOgk5MzMKK1BHLVVOSy00OTQJOgkxCToJOTMzCitQRy1VTkstNDk1CToJMQk6CTkzMworUEctVU5LLTQ5Ngk6CTEJOgk5MzMKK1BORy5MMi4xCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40CQk6CQkyCQk6CQk5MzMKK1BORy5MMi41CQk6CQkyCQk6CQk5MzMKK1BORy5MMi42CQk6CQkyCQk6CQk5MzMKK1BORy5MMi43CQk6CQkyCQk6CQk5MzMKK1BORy5MMi44CQk6CQkyCQk6CQk5MzMKK1BORy5MMi45CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTEJCToJCTIJCToJCTkzMworUE5HLkwyLjEyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTQJCToJCTIJCToJCTkzMworUE5HLkwyLjE1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTcJCToJCTIJCToJCTkzMworUE5HLkwyLjE4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xOQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjAJCToJCTIJCToJCTkzMworUE5HLkwyLjIxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjMJCToJCTIJCToJCTkzMworUE5HLkwyLjI0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjYJCToJCTIJCToJCTkzMworUE5HLkwyLjI3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yOAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjkJCToJCTIJCToJCTkzMworUE5HLkwyLjMwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzIJCToJCTIJCToJCTkzMworUE5HLkwyLjMzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzUJCToJCTIJCToJCTkzMworUE5HLkwyLjM2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzgJCToJCTIJCToJCTkzMworUE5HLkwyLjM5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDEJCToJCTIJCToJCTkzMworUE5HLkwyLjQyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDQJCToJCTIJCToJCTkzMworUE5HLkwyLjQ1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDcJCToJCTIJCToJCTkzMworUE5HLkwyLjQ4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNTAJCToJCTIJCToJCTkzMworUE5HLkwyLjUxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi41MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNTMJCToJCTIJCToJCTkzMworUE5HLkwyLjU0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi41NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNTYJCToJCTIJCToJCTkzMworUE5HLkwyLjU3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi41OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNTkJCToJCTIJCToJCTkzMworUE5HLkwyLjYwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi42MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNjIJCToJCTIJCToJCTkzMworUE5HLkwyLjYzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi42NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNjUJCToJCTIJCToJCTkzMworUE5HLkwyLjY2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi42NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNjgJCToJCTIJCToJCTkzMworUE5HLkwyLjY5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi43MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNzEJCToJCTIJCToJCTkzMworUE5HLkwyLjcyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi43MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNzQJCToJCTIJCToJCTkzMworUE5HLkwyLjc1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi43NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNzcJCToJCTIJCToJCTkzMworUE5HLkwyLjc4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi43OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuODAJCToJCTIJCToJCTkzMworUE5HLkwyLjgxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi44MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuODMJCToJCTIJCToJCTkzMworUE5HLkwyLjg0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi44NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuODYJCToJCTIJCToJCTkzMworUE5HLkwyLjg3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi44OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuODkJCToJCTIJCToJCTkzMworUE5HLkwyLjkwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi45MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuOTIJCToJCTIJCToJCTkzMworUE5HLkwyLjkzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi45NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuOTUJCToJCTIJCToJCTkzMworUE5HLkwyLjk2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi45NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuOTgJCToJCTIJCToJCTkzMworUE5HLkwyLjk5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMDAJCToJCTIJCToJCTkzMworUE5HLkwyLjEwMQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTAyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMDMJCToJCTIJCToJCTkzMworUE5HLkwyLjEwNAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTA1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMDYJCToJCTIJCToJCTkzMworUE5HLkwyLjEwNwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTA4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMDkJCToJCTIJCToJCTkzMworUE5HLkwyLjExMAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTExCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMTIJCToJCTIJCToJCTkzMworUE5HLkwyLjExMwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTE0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMTUJCToJCTIJCToJCTkzMworUE5HLkwyLjExNgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTE3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMTgJCToJCTIJCToJCTkzMworUE5HLkwyLjExOQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTIwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMjEJCToJCTIJCToJCTkzMworUE5HLkwyLjEyMgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTIzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMjQJCToJCTIJCToJCTkzMworUE5HLkwyLjEyNQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTI2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMjcJCToJCTIJCToJCTkzMworUE5HLkwyLjEyOAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTI5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMzAJCToJCTIJCToJCTkzMworUE5HLkwyLjEzMQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTMyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMzMJCToJCTIJCToJCTkzMworUE5HLkwyLjEzNAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTM1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMzYJCToJCTIJCToJCTkzMworUE5HLkwyLjEzNwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTM4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMzkJCToJCTIJCToJCTkzMworUE5HLkwyLjE0MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTQxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNDIJCToJCTIJCToJCTkzMworUE5HLkwyLjE0MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTQ0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNDUJCToJCTIJCToJCTkzMworUE5HLkwyLjE0NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTQ3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNDgJCToJCTIJCToJCTkzMworUE5HLkwyLjE0OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTUwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNTEJCToJCTIJCToJCTkzMworUE5HLkwyLjE1MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTUzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNTQJCToJCTIJCToJCTkzMworUE5HLkwyLjE1NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTU2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNTcJCToJCTIJCToJCTkzMworUE5HLkwyLjE1OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTU5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNjAJCToJCTIJCToJCTkzMworUE5HLkwyLjE2MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTYyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNjMJCToJCTIJCToJCTkzMworUE5HLkwyLjE2NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTY1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNjYJCToJCTIJCToJCTkzMworUE5HLkwyLjE2NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTY4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNjkJCToJCTIJCToJCTkzMworUE5HLkwyLjE3MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTcxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNzIJCToJCTIJCToJCTkzMworUE5HLkwyLjE3MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTc0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNzUJCToJCTIJCToJCTkzMworUE5HLkwyLjE3NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTc3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNzgJCToJCTIJCToJCTkzMworUE5HLkwyLjE3OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTgwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xODEJCToJCTIJCToJCTkzMworUE5HLkwyLjE4MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTgzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xODQJCToJCTIJCToJCTkzMworUE5HLkwyLjE4NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTg2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xODcJCToJCTIJCToJCTkzMworUE5HLkwyLjE4OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTg5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xOTAJCToJCTIJCToJCTkzMworUE5HLkwyLjE5MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTkyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xOTMJCToJCTIJCToJCTkzMworUE5HLkwyLjE5NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTk1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xOTYJCToJCTIJCToJCTkzMworUE5HLkwyLjE5NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTk4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xOTkJCToJCTIJCToJCTkzMworUE5HLkwyLjIwMAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjAxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMDIJCToJCTIJCToJCTkzMworUE5HLkwyLjIwMwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjA0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMDUJCToJCTIJCToJCTkzMworUE5HLkwyLjIwNgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjA3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMDgJCToJCTIJCToJCTkzMworUE5HLkwyLjIwOQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjEwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMTEJCToJCTIJCToJCTkzMworUE5HLkwyLjIxMgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjEzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMTQJCToJCTIJCToJCTkzMworUE5HLkwyLjIxNQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjE2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMTcJCToJCTIJCToJCTkzMworUE5HLkwyLjIxOAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjE5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMjAJCToJCTIJCToJCTkzMworUE5HLkwyLjIyMQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjIyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMjMJCToJCTIJCToJCTkzMworUE5HLkwyLjIyNAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjI1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMjYJCToJCTIJCToJCTkzMworUE5HLkwyLjIyNwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjI4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMjkJCToJCTIJCToJCTkzMworUE5HLkwyLjIzMAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjMxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMzIJCToJCTIJCToJCTkzMworUE5HLkwyLjIzMwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjM0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMzUJCToJCTIJCToJCTkzMworUE5HLkwyLjIzNgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjM3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMzgJCToJCTIJCToJCTkzMworUE5HLkwyLjIzOQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjQwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNDEJCToJCTIJCToJCTkzMworUE5HLkwyLjI0MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjQzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNDQJCToJCTIJCToJCTkzMworUE5HLkwyLjI0NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjQ2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNDcJCToJCTIJCToJCTkzMworUE5HLkwyLjI0OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjQ5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNTAJCToJCTIJCToJCTkzMworUE5HLkwyLjI1MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjUyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNTMJCToJCTIJCToJCTkzMworUE5HLkwyLjI1NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjU1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNTYJCToJCTIJCToJCTkzMworUE5HLkwyLjI1NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjU4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNTkJCToJCTIJCToJCTkzMworUE5HLkwyLjI2MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjYxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNjIJCToJCTIJCToJCTkzMworUE5HLkwyLjI2MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjY0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNjUJCToJCTIJCToJCTkzMworUE5HLkwyLjI2NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjY3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNjgJCToJCTIJCToJCTkzMworUE5HLkwyLjI2OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjcwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNzEJCToJCTIJCToJCTkzMworUE5HLkwyLjI3MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjczCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNzQJCToJCTIJCToJCTkzMworUE5HLkwyLjI3NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjc2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNzcJCToJCTIJCToJCTkzMworUE5HLkwyLjI3OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjc5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yODAJCToJCTIJCToJCTkzMworUE5HLkwyLjI4MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjgyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yODMJCToJCTIJCToJCTkzMworUE5HLkwyLjI4NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjg1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yODYJCToJCTIJCToJCTkzMworUE5HLkwyLjI4NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjg4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yODkJCToJCTIJCToJCTkzMworUE5HLkwyLjI5MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjkxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yOTIJCToJCTIJCToJCTkzMworUE5HLkwyLjI5MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjk0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yOTUJCToJCTIJCToJCTkzMworUE5HLkwyLjI5NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjk3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yOTgJCToJCTIJCToJCTkzMworUE5HLkwyLjI5OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzAwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMDEJCToJCTIJCToJCTkzMworUE5HLkwyLjMwMgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzAzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMDQJCToJCTIJCToJCTkzMworUE5HLkwyLjMwNQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzA2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMDcJCToJCTIJCToJCTkzMworUE5HLkwyLjMwOAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzA5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMTAJCToJCTIJCToJCTkzMworUE5HLkwyLjMxMQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzEyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMTMJCToJCTIJCToJCTkzMworUE5HLkwyLjMxNAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzE1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMTYJCToJCTIJCToJCTkzMworUE5HLkwyLjMxNwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzE4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMTkJCToJCTIJCToJCTkzMworUE5HLkwyLjMyMAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzIxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMjIJCToJCTIJCToJCTkzMworUE5HLkwyLjMyMwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzI0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMjUJCToJCTIJCToJCTkzMworUE5HLkwyLjMyNgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzI3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMjgJCToJCTIJCToJCTkzMworUE5HLkwyLjMyOQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzMwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMzEJCToJCTIJCToJCTkzMworUE5HLkwyLjMzMgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzMzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMzQJCToJCTIJCToJCTkzMworUE5HLkwyLjMzNQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzM2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMzcJCToJCTIJCToJCTkzMworUE5HLkwyLjMzOAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzM5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNDAJCToJCTIJCToJCTkzMworUE5HLkwyLjM0MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzQyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNDMJCToJCTIJCToJCTkzMworUE5HLkwyLjM0NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzQ1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNDYJCToJCTIJCToJCTkzMworUE5HLkwyLjM0NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzQ4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNDkJCToJCTIJCToJCTkzMworUE5HLkwyLjM1MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzUxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNTIJCToJCTIJCToJCTkzMworUE5HLkwyLjM1MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzU0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNTUJCToJCTIJCToJCTkzMworUE5HLkwyLjM1NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzU3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNTgJCToJCTIJCToJCTkzMworUE5HLkwyLjM1OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzYwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNjEJCToJCTIJCToJCTkzMworUE5HLkwyLjM2MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzYzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNjQJCToJCTIJCToJCTkzMworUE5HLkwyLjM2NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzY2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNjcJCToJCTIJCToJCTkzMworUE5HLkwyLjM2OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzY5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNzAJCToJCTIJCToJCTkzMworUE5HLkwyLjM3MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzcyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNzMJCToJCTIJCToJCTkzMworUE5HLkwyLjM3NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzc1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNzYJCToJCTIJCToJCTkzMworUE5HLkwyLjM3NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzc4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNzkJCToJCTIJCToJCTkzMworUE5HLkwyLjM4MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzgxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zODIJCToJCTIJCToJCTkzMworUE5HLkwyLjM4MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzg0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zODUJCToJCTIJCToJCTkzMworUE5HLkwyLjM4NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzg3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zODgJCToJCTIJCToJCTkzMworUE5HLkwyLjM4OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzkwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zOTEJCToJCTIJCToJCTkzMworUE5HLkwyLjM5MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzkzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zOTQJCToJCTIJCToJCTkzMworUE5HLkwyLjM5NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzk2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zOTcJCToJCTIJCToJCTkzMworUE5HLkwyLjM5OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzk5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MDAJCToJCTIJCToJCTkzMworUE5HLkwyLjQwMQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDAyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MDMJCToJCTIJCToJCTkzMworUE5HLkwyLjQwNAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDA1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MDYJCToJCTIJCToJCTkzMworUE5HLkwyLjQwNwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDA4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MDkJCToJCTIJCToJCTkzMworUE5HLkwyLjQxMAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDExCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MTIJCToJCTIJCToJCTkzMworUE5HLkwyLjQxMwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDE0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MTUJCToJCTIJCToJCTkzMworUE5HLkwyLjQxNgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDE3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MTgJCToJCTIJCToJCTkzMworUE5HLkwyLjQxOQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDIwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MjEJCToJCTIJCToJCTkzMworUE5HLkwyLjQyMgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDIzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MjQJCToJCTIJCToJCTkzMworUE5HLkwyLjQyNQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDI2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MjcJCToJCTIJCToJCTkzMworUE5HLkwyLjQyOAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDI5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MzAJCToJCTIJCToJCTkzMworUE5HLkwyLjQzMQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDMyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MzMJCToJCTIJCToJCTkzMworUE5HLkwyLjQzNAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDM1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MzYJCToJCTIJCToJCTkzMworUE5HLkwyLjQzNwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDM4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MzkJCToJCTIJCToJCTkzMworUE5HLkwyLjQ0MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDQxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NDIJCToJCTIJCToJCTkzMworUE5HLkwyLjQ0MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDQ0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NDUJCToJCTIJCToJCTkzMworUE5HLkwyLjQ0NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDQ3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NDgJCToJCTIJCToJCTkzMworUE5HLkwyLjQ0OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDUwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NTEJCToJCTIJCToJCTkzMworUE5HLkwyLjQ1MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDUzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NTQJCToJCTIJCToJCTkzMworUE5HLkwyLjQ1NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDU2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NTcJCToJCTIJCToJCTkzMworUE5HLkwyLjQ1OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDU5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NjAJCToJCTIJCToJCTkzMworUE5HLkwyLjQ2MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDYyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NjMJCToJCTIJCToJCTkzMworUE5HLkwyLjQ2NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDY1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NjYJCToJCTIJCToJCTkzMworUE5HLkwyLjQ2NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDY4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NjkJCToJCTIJCToJCTkzMworUE5HLkwyLjQ3MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDcxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NzIJCToJCTIJCToJCTkzMworUE5HLkwyLjQ3MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDc0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NzUJCToJCTIJCToJCTkzMworUE5HLkwyLjQ3NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDc3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NzgJCToJCTIJCToJCTkzMworUE5HLkwyLjQ3OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDgwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40ODEJCToJCTIJCToJCTkzMworUE5HLkwyLjQ4MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDgzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40ODQJCToJCTIJCToJCTkzMworUE5HLkwyLjQ4NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDg2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40ODcJCToJCTIJCToJCTkzMworUE5HLkwyLjQ4OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDg5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40OTAJCToJCTIJCToJCTkzMworUE5HLkwyLjQ5MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDkyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40OTMJCToJCTIJCToJCTkzMworUE5HLkwyLjQ5NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDk1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40OTYJCToJCTIJCToJCTkzMworQ2VudHJhbCAgCToJMQk6CTI5NTAwCitTaW1idSAJOgkxCToJNjEwMAorRWFzdCBOZXcgQnJpdGFpbiAJOgkxCToJMTU1MDAKK0Vhc3QgU2VwaWsgCToJMQk6CTQyODAwCitFYXN0ZXJuIEhpZ2hsYW5kcyAJOgkxCToJMTEyMDAKK0VuZ2EgCToJMQk6CTEyODAwCitHdWxmIAk6CTEJOgkzNDUwMAorTWFkYW5nIAk6CTEJOgkyOTAwMAorTWFudXMgCToJMQk6CTIxMDAKK01pbG5lIEJheSAJOgkxCToJMTQwMDAKK01vcm9iZSAJOgkxCToJMzQ1MDAKK05hdGlvbmFsIENhcGl0YWwgRGlzdHJpY3QgCToJMQk6CTI0MAorTmV3IElyZWxhbmQgCToJMQk6CTk2MDAKK05vcnRoIFNvbG9tb25zIAk6CTEJOgk5MzAwCitPcm8gKE5vcnRoZXJuKSAJOgkxCToJMjI4MDAKK1NvdXRoZXJuIEhpZ2hsYW5kcyAJOgkxCToJMjM4MDAKK1dlc3QgTmV3IEJyaXRhaW4gCToJMQk6CTIxMDAwCitXZXN0IFNlcGlrIAk6CTEJOgkzNjMwMAorV2VzdGVybiAJOgkxCToJOTkzMDAKK1dlc3Rlcm4gSGlnaGxhbmRzIAk6CTEJOgk4NTAwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEFQVUEgTkVXIEdVSU5FQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9QQVBVQSBORVcgR1VJTkVBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMGE5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEFQVUEgTkVXIEdVSU5FQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDEwMTUgQEAKK1BhcHVhIE5ldyBHdWluZWEJOgkwCToJNTY3MDU0NAorUEctVU5LLTEJOgkxCToJMTE4NjkKK1BHLVVOSy0yCToJMQk6CTExODY5CitQRy1VTkstMwk6CTEJOgkxMTg2OQorUEctVU5LLTQJOgkxCToJMTE4NjkKK1BHLVVOSy01CToJMQk6CTExODY5CitQRy1VTkstNgk6CTEJOgkxMTg2OQorUEctVU5LLTcJOgkxCToJMTE4NjkKK1BHLVVOSy04CToJMQk6CTExODY5CitQRy1VTkstOQk6CTEJOgkxMTg2OQorUEctVU5LLTEwCToJMQk6CTExODY5CitQRy1VTkstMTEJOgkxCToJMTE4NjkKK1BHLVVOSy0xMgk6CTEJOgkxMTg2OQorUEctVU5LLTEzCToJMQk6CTExODY5CitQRy1VTkstMTQJOgkxCToJMTE4NjkKK1BHLVVOSy0xNQk6CTEJOgkxMTg2OQorUEctVU5LLTE2CToJMQk6CTExODY5CitQRy1VTkstMTcJOgkxCToJMTE4NjkKK1BHLVVOSy0xOAk6CTEJOgkxMTg2OQorUEctVU5LLTE5CToJMQk6CTExODY5CitQRy1VTkstMjAJOgkxCToJMTE4NjkKK1BHLVVOSy0yMQk6CTEJOgkxMTg2OQorUEctVU5LLTIyCToJMQk6CTExODY5CitQRy1VTkstMjMJOgkxCToJMTE4NjkKK1BHLVVOSy0yNAk6CTEJOgkxMTg2OQorUEctVU5LLTI1CToJMQk6CTExODY5CitQRy1VTkstMjYJOgkxCToJMTE4NjkKK1BHLVVOSy0yNwk6CTEJOgkxMTg2OQorUEctVU5LLTI4CToJMQk6CTExODY5CitQRy1VTkstMjkJOgkxCToJMTE4NjkKK1BHLVVOSy0zMAk6CTEJOgkxMTg2OQorUEctVU5LLTMxCToJMQk6CTExODY5CitQRy1VTkstMzIJOgkxCToJMTE4NjkKK1BHLVVOSy0zMwk6CTEJOgkxMTg2OQorUEctVU5LLTM0CToJMQk6CTExODY5CitQRy1VTkstMzUJOgkxCToJMTE4NjkKK1BHLVVOSy0zNgk6CTEJOgkxMTg2OQorUEctVU5LLTM3CToJMQk6CTExODY5CitQRy1VTkstMzgJOgkxCToJMTE4NjkKK1BHLVVOSy0zOQk6CTEJOgkxMTg2OQorUEctVU5LLTQwCToJMQk6CTExODY5CitQRy1VTkstNDEJOgkxCToJMTE4NjkKK1BHLVVOSy00Mgk6CTEJOgkxMTg2OQorUEctVU5LLTQzCToJMQk6CTExODY5CitQRy1VTkstNDQJOgkxCToJMTE4NjkKK1BHLVVOSy00NQk6CTEJOgkxMTg2OQorUEctVU5LLTQ2CToJMQk6CTExODY5CitQRy1VTkstNDcJOgkxCToJMTE4NjkKK1BHLVVOSy00OAk6CTEJOgkxMTg2OQorUEctVU5LLTQ5CToJMQk6CTExODY5CitQRy1VTkstNTAJOgkxCToJMTE4NjkKK1BHLVVOSy01MQk6CTEJOgkxMTg2OQorUEctVU5LLTUyCToJMQk6CTExODY5CitQRy1VTkstNTMJOgkxCToJMTE4NjkKK1BHLVVOSy01NAk6CTEJOgkxMTg2OQorUEctVU5LLTU1CToJMQk6CTExODY5CitQRy1VTkstNTYJOgkxCToJMTE4NjkKK1BHLVVOSy01Nwk6CTEJOgkxMTg2OQorUEctVU5LLTU4CToJMQk6CTExODY5CitQRy1VTkstNTkJOgkxCToJMTE4NjkKK1BHLVVOSy02MAk6CTEJOgkxMTg2OQorUEctVU5LLTYxCToJMQk6CTExODY5CitQRy1VTkstNjIJOgkxCToJMTE4NjkKK1BHLVVOSy02Mwk6CTEJOgkxMTg2OQorUEctVU5LLTY0CToJMQk6CTExODY5CitQRy1VTkstNjUJOgkxCToJMTE4NjkKK1BHLVVOSy02Ngk6CTEJOgkxMTg2OQorUEctVU5LLTY3CToJMQk6CTExODY5CitQRy1VTkstNjgJOgkxCToJMTE4NjkKK1BHLVVOSy02OQk6CTEJOgkxMTg2OQorUEctVU5LLTcwCToJMQk6CTExODY5CitQRy1VTkstNzEJOgkxCToJMTE4NjkKK1BHLVVOSy03Mgk6CTEJOgkxMTg2OQorUEctVU5LLTczCToJMQk6CTExODY5CitQRy1VTkstNzQJOgkxCToJMTE4NjkKK1BHLVVOSy03NQk6CTEJOgkxMTg2OQorUEctVU5LLTc2CToJMQk6CTExODY5CitQRy1VTkstNzcJOgkxCToJMTE4NjkKK1BHLVVOSy03OAk6CTEJOgkxMTg2OQorUEctVU5LLTc5CToJMQk6CTExODY5CitQRy1VTkstODAJOgkxCToJMTE4NjkKK1BHLVVOSy04MQk6CTEJOgkxMTg2OQorUEctVU5LLTgyCToJMQk6CTExODY5CitQRy1VTkstODMJOgkxCToJMTE4NjkKK1BHLVVOSy04NAk6CTEJOgkxMTg2OQorUEctVU5LLTg1CToJMQk6CTExODY5CitQRy1VTkstODYJOgkxCToJMTE4NjkKK1BHLVVOSy04Nwk6CTEJOgkxMTg2OQorUEctVU5LLTg4CToJMQk6CTExODY5CitQRy1VTkstODkJOgkxCToJMTE4NjkKK1BHLVVOSy05MAk6CTEJOgkxMTg2OQorUEctVU5LLTkxCToJMQk6CTExODY5CitQRy1VTkstOTIJOgkxCToJMTE4NjkKK1BHLVVOSy05Mwk6CTEJOgkxMTg2OQorUEctVU5LLTk0CToJMQk6CTExODY5CitQRy1VTkstOTUJOgkxCToJMTE4NjkKK1BHLVVOSy05Ngk6CTEJOgkxMTg2OQorUEctVU5LLTk3CToJMQk6CTExODY5CitQRy1VTkstOTgJOgkxCToJMTE4NjkKK1BHLVVOSy05OQk6CTEJOgkxMTg2OQorUEctVU5LLTEwMAk6CTEJOgkxMTg2OQorUEctVU5LLTEwMQk6CTEJOgkxMTg2OQorUEctVU5LLTEwMgk6CTEJOgkxMTg2OQorUEctVU5LLTEwMwk6CTEJOgkxMTg2OQorUEctVU5LLTEwNAk6CTEJOgkxMTg2OQorUEctVU5LLTEwNQk6CTEJOgkxMTg2OQorUEctVU5LLTEwNgk6CTEJOgkxMTg2OQorUEctVU5LLTEwNwk6CTEJOgkxMTg2OQorUEctVU5LLTEwOAk6CTEJOgkxMTg2OQorUEctVU5LLTEwOQk6CTEJOgkxMTg2OQorUEctVU5LLTExMAk6CTEJOgkxMTg2OQorUEctVU5LLTExMQk6CTEJOgkxMTg2OQorUEctVU5LLTExMgk6CTEJOgkxMTg2OQorUEctVU5LLTExMwk6CTEJOgkxMTg2OQorUEctVU5LLTExNAk6CTEJOgkxMTg2OQorUEctVU5LLTExNQk6CTEJOgkxMTg2OQorUEctVU5LLTExNgk6CTEJOgkxMTg2OQorUEctVU5LLTExNwk6CTEJOgkxMTg2OQorUEctVU5LLTExOAk6CTEJOgkxMTg2OQorUEctVU5LLTExOQk6CTEJOgkxMTg2OQorUEctVU5LLTEyMAk6CTEJOgkxMTg2OQorUEctVU5LLTEyMQk6CTEJOgkxMTg2OQorUEctVU5LLTEyMgk6CTEJOgkxMTg2OQorUEctVU5LLTEyMwk6CTEJOgkxMTg2OQorUEctVU5LLTEyNAk6CTEJOgkxMTg2OQorUEctVU5LLTEyNQk6CTEJOgkxMTg2OQorUEctVU5LLTEyNgk6CTEJOgkxMTg2OQorUEctVU5LLTEyNwk6CTEJOgkxMTg2OQorUEctVU5LLTEyOAk6CTEJOgkxMTg2OQorUEctVU5LLTEyOQk6CTEJOgkxMTg2OQorUEctVU5LLTEzMAk6CTEJOgkxMTg2OQorUEctVU5LLTEzMQk6CTEJOgkxMTg2OQorUEctVU5LLTEzMgk6CTEJOgkxMTg2OQorUEctVU5LLTEzMwk6CTEJOgkxMTg2OQorUEctVU5LLTEzNAk6CTEJOgkxMTg2OQorUEctVU5LLTEzNQk6CTEJOgkxMTg2OQorUEctVU5LLTEzNgk6CTEJOgkxMTg2OQorUEctVU5LLTEzNwk6CTEJOgkxMTg2OQorUEctVU5LLTEzOAk6CTEJOgkxMTg2OQorUEctVU5LLTEzOQk6CTEJOgkxMTg2OQorUEctVU5LLTE0MAk6CTEJOgkxMTg2OQorUEctVU5LLTE0MQk6CTEJOgkxMTg2OQorUEctVU5LLTE0Mgk6CTEJOgkxMTg2OQorUEctVU5LLTE0Mwk6CTEJOgkxMTg2OQorUEctVU5LLTE0NAk6CTEJOgkxMTg2OQorUEctVU5LLTE0NQk6CTEJOgkxMTg2OQorUEctVU5LLTE0Ngk6CTEJOgkxMTg2OQorUEctVU5LLTE0Nwk6CTEJOgkxMTg2OQorUEctVU5LLTE0OAk6CTEJOgkxMTg2OQorUEctVU5LLTE0OQk6CTEJOgkxMTg2OQorUEctVU5LLTE1MAk6CTEJOgkxMTg2OQorUEctVU5LLTE1MQk6CTEJOgkxMTg2OQorUEctVU5LLTE1Mgk6CTEJOgkxMTg2OQorUEctVU5LLTE1Mwk6CTEJOgkxMTg2OQorUEctVU5LLTE1NAk6CTEJOgkxMTg2OQorUEctVU5LLTE1NQk6CTEJOgkxMTg2OQorUEctVU5LLTE1Ngk6CTEJOgkxMTg2OQorUEctVU5LLTE1Nwk6CTEJOgkxMTg2OQorUEctVU5LLTE1OAk6CTEJOgkxMTg2OQorUEctVU5LLTE1OQk6CTEJOgkxMTg2OQorUEctVU5LLTE2MAk6CTEJOgkxMTg2OQorUEctVU5LLTE2MQk6CTEJOgkxMTg2OQorUEctVU5LLTE2Mgk6CTEJOgkxMTg2OQorUEctVU5LLTE2Mwk6CTEJOgkxMTg2OQorUEctVU5LLTE2NAk6CTEJOgkxMTg2OQorUEctVU5LLTE2NQk6CTEJOgkxMTg2OQorUEctVU5LLTE2Ngk6CTEJOgkxMTg2OQorUEctVU5LLTE2Nwk6CTEJOgkxMTg2OQorUEctVU5LLTE2OAk6CTEJOgkxMTg2OQorUEctVU5LLTE2OQk6CTEJOgkxMTg2OQorUEctVU5LLTE3MAk6CTEJOgkxMTg2OQorUEctVU5LLTE3MQk6CTEJOgkxMTg2OQorUEctVU5LLTE3Mgk6CTEJOgkxMTg2OQorUEctVU5LLTE3Mwk6CTEJOgkxMTg2OQorUEctVU5LLTE3NAk6CTEJOgkxMTg2OQorUEctVU5LLTE3NQk6CTEJOgkxMTg2OQorUEctVU5LLTE3Ngk6CTEJOgkxMTg2OQorUEctVU5LLTE3Nwk6CTEJOgkxMTg2OQorUEctVU5LLTE3OAk6CTEJOgkxMTg2OQorUEctVU5LLTE3OQk6CTEJOgkxMTg2OQorUEctVU5LLTE4MAk6CTEJOgkxMTg2OQorUEctVU5LLTE4MQk6CTEJOgkxMTg2OQorUEctVU5LLTE4Mgk6CTEJOgkxMTg2OQorUEctVU5LLTE4Mwk6CTEJOgkxMTg2OQorUEctVU5LLTE4NAk6CTEJOgkxMTg2OQorUEctVU5LLTE4NQk6CTEJOgkxMTg2OQorUEctVU5LLTE4Ngk6CTEJOgkxMTg2OQorUEctVU5LLTE4Nwk6CTEJOgkxMTg2OQorUEctVU5LLTE4OAk6CTEJOgkxMTg2OQorUEctVU5LLTE4OQk6CTEJOgkxMTg2OQorUEctVU5LLTE5MAk6CTEJOgkxMTg2OQorUEctVU5LLTE5MQk6CTEJOgkxMTg2OQorUEctVU5LLTE5Mgk6CTEJOgkxMTg2OQorUEctVU5LLTE5Mwk6CTEJOgkxMTg2OQorUEctVU5LLTE5NAk6CTEJOgkxMTg2OQorUEctVU5LLTE5NQk6CTEJOgkxMTg2OQorUEctVU5LLTE5Ngk6CTEJOgkxMTg2OQorUEctVU5LLTE5Nwk6CTEJOgkxMTg2OQorUEctVU5LLTE5OAk6CTEJOgkxMTg2OQorUEctVU5LLTE5OQk6CTEJOgkxMTg2OQorUEctVU5LLTIwMAk6CTEJOgkxMTg2OQorUEctVU5LLTIwMQk6CTEJOgkxMTg2OQorUEctVU5LLTIwMgk6CTEJOgkxMTg2OQorUEctVU5LLTIwMwk6CTEJOgkxMTg2OQorUEctVU5LLTIwNAk6CTEJOgkxMTg2OQorUEctVU5LLTIwNQk6CTEJOgkxMTg2OQorUEctVU5LLTIwNgk6CTEJOgkxMTg2OQorUEctVU5LLTIwNwk6CTEJOgkxMTg2OQorUEctVU5LLTIwOAk6CTEJOgkxMTg2OQorUEctVU5LLTIwOQk6CTEJOgkxMTg2OQorUEctVU5LLTIxMAk6CTEJOgkxMTg2OQorUEctVU5LLTIxMQk6CTEJOgkxMTg2OQorUEctVU5LLTIxMgk6CTEJOgkxMTg2OQorUEctVU5LLTIxMwk6CTEJOgkxMTg2OQorUEctVU5LLTIxNAk6CTEJOgkxMTg2OQorUEctVU5LLTIxNQk6CTEJOgkxMTg2OQorUEctVU5LLTIxNgk6CTEJOgkxMTg2OQorUEctVU5LLTIxNwk6CTEJOgkxMTg2OQorUEctVU5LLTIxOAk6CTEJOgkxMTg2OQorUEctVU5LLTIxOQk6CTEJOgkxMTg2OQorUEctVU5LLTIyMAk6CTEJOgkxMTg2OQorUEctVU5LLTIyMQk6CTEJOgkxMTg2OQorUEctVU5LLTIyMgk6CTEJOgkxMTg2OQorUEctVU5LLTIyMwk6CTEJOgkxMTg2OQorUEctVU5LLTIyNAk6CTEJOgkxMTg2OQorUEctVU5LLTIyNQk6CTEJOgkxMTg2OQorUEctVU5LLTIyNgk6CTEJOgkxMTg2OQorUEctVU5LLTIyNwk6CTEJOgkxMTg2OQorUEctVU5LLTIyOAk6CTEJOgkxMTg2OQorUEctVU5LLTIyOQk6CTEJOgkxMTg2OQorUEctVU5LLTIzMAk6CTEJOgkxMTg2OQorUEctVU5LLTIzMQk6CTEJOgkxMTg2OQorUEctVU5LLTIzMgk6CTEJOgkxMTg2OQorUEctVU5LLTIzMwk6CTEJOgkxMTg2OQorUEctVU5LLTIzNAk6CTEJOgkxMTg2OQorUEctVU5LLTIzNQk6CTEJOgkxMTg2OQorUEctVU5LLTIzNgk6CTEJOgkxMTg2OQorUEctVU5LLTIzNwk6CTEJOgkxMTg2OQorUEctVU5LLTIzOAk6CTEJOgkxMTg2OQorUEctVU5LLTIzOQk6CTEJOgkxMTg2OQorUEctVU5LLTI0MAk6CTEJOgkxMTg2OQorUEctVU5LLTI0MQk6CTEJOgkxMTg2OQorUEctVU5LLTI0Mgk6CTEJOgkxMTg2OQorUEctVU5LLTI0Mwk6CTEJOgkxMTg2OQorUEctVU5LLTI0NAk6CTEJOgkxMTg2OQorUEctVU5LLTI0NQk6CTEJOgkxMTg2OQorUEctVU5LLTI0Ngk6CTEJOgkxMTg2OQorUEctVU5LLTI0Nwk6CTEJOgkxMTg2OQorUEctVU5LLTI0OAk6CTEJOgkxMTg2OQorUEctVU5LLTI0OQk6CTEJOgkxMTg2OQorUEctVU5LLTI1MAk6CTEJOgkxMTg2OQorUEctVU5LLTI1MQk6CTEJOgkxMTg2OQorUEctVU5LLTI1Mgk6CTEJOgkxMTg2OQorUEctVU5LLTI1Mwk6CTEJOgkxMTg2OQorUEctVU5LLTI1NAk6CTEJOgkxMTg2OQorUEctVU5LLTI1NQk6CTEJOgkxMTg2OQorUEctVU5LLTI1Ngk6CTEJOgkxMTg2OQorUEctVU5LLTI1Nwk6CTEJOgkxMTg2OQorUEctVU5LLTI1OAk6CTEJOgkxMTg2OQorUEctVU5LLTI1OQk6CTEJOgkxMTg2OQorUEctVU5LLTI2MAk6CTEJOgkxMTg2OQorUEctVU5LLTI2MQk6CTEJOgkxMTg2OQorUEctVU5LLTI2Mgk6CTEJOgkxMTg2OQorUEctVU5LLTI2Mwk6CTEJOgkxMTg2OQorUEctVU5LLTI2NAk6CTEJOgkxMTg2OQorUEctVU5LLTI2NQk6CTEJOgkxMTg2OQorUEctVU5LLTI2Ngk6CTEJOgkxMTg2OQorUEctVU5LLTI2Nwk6CTEJOgkxMTg2OQorUEctVU5LLTI2OAk6CTEJOgkxMTg2OQorUEctVU5LLTI2OQk6CTEJOgkxMTg2OQorUEctVU5LLTI3MAk6CTEJOgkxMTg2OQorUEctVU5LLTI3MQk6CTEJOgkxMTg2OQorUEctVU5LLTI3Mgk6CTEJOgkxMTg2OQorUEctVU5LLTI3Mwk6CTEJOgkxMTg2OQorUEctVU5LLTI3NAk6CTEJOgkxMTg2OQorUEctVU5LLTI3NQk6CTEJOgkxMTg2OQorUEctVU5LLTI3Ngk6CTEJOgkxMTg2OQorUEctVU5LLTI3Nwk6CTEJOgkxMTg2OQorUEctVU5LLTI3OAk6CTEJOgkxMTg2OQorUEctVU5LLTI3OQk6CTEJOgkxMTg2OQorUEctVU5LLTI4MAk6CTEJOgkxMTg2OQorUEctVU5LLTI4MQk6CTEJOgkxMTg2OQorUEctVU5LLTI4Mgk6CTEJOgkxMTg2OQorUEctVU5LLTI4Mwk6CTEJOgkxMTg2OQorUEctVU5LLTI4NAk6CTEJOgkxMTg2OQorUEctVU5LLTI4NQk6CTEJOgkxMTg2OQorUEctVU5LLTI4Ngk6CTEJOgkxMTg2OQorUEctVU5LLTI4Nwk6CTEJOgkxMTg2OQorUEctVU5LLTI4OAk6CTEJOgkxMTg2OQorUEctVU5LLTI4OQk6CTEJOgkxMTg2OQorUEctVU5LLTI5MAk6CTEJOgkxMTg2OQorUEctVU5LLTI5MQk6CTEJOgkxMTg2OQorUEctVU5LLTI5Mgk6CTEJOgkxMTg2OQorUEctVU5LLTI5Mwk6CTEJOgkxMTg2OQorUEctVU5LLTI5NAk6CTEJOgkxMTg2OQorUEctVU5LLTI5NQk6CTEJOgkxMTg2OQorUEctVU5LLTI5Ngk6CTEJOgkxMTg2OQorUEctVU5LLTI5Nwk6CTEJOgkxMTg2OQorUEctVU5LLTI5OAk6CTEJOgkxMTg2OQorUEctVU5LLTI5OQk6CTEJOgkxMTg2OQorUEctVU5LLTMwMAk6CTEJOgkxMTg2OQorUEctVU5LLTMwMQk6CTEJOgkxMTg2OQorUEctVU5LLTMwMgk6CTEJOgkxMTg2OQorUEctVU5LLTMwMwk6CTEJOgkxMTg2OQorUEctVU5LLTMwNAk6CTEJOgkxMTg2OQorUEctVU5LLTMwNQk6CTEJOgkxMTg2OQorUEctVU5LLTMwNgk6CTEJOgkxMTg2OQorUEctVU5LLTMwNwk6CTEJOgkxMTg2OQorUEctVU5LLTMwOAk6CTEJOgkxMTg2OQorUEctVU5LLTMwOQk6CTEJOgkxMTg2OQorUEctVU5LLTMxMAk6CTEJOgkxMTg2OQorUEctVU5LLTMxMQk6CTEJOgkxMTg2OQorUEctVU5LLTMxMgk6CTEJOgkxMTg2OQorUEctVU5LLTMxMwk6CTEJOgkxMTg2OQorUEctVU5LLTMxNAk6CTEJOgkxMTg2OQorUEctVU5LLTMxNQk6CTEJOgkxMTg2OQorUEctVU5LLTMxNgk6CTEJOgkxMTg2OQorUEctVU5LLTMxNwk6CTEJOgkxMTg2OQorUEctVU5LLTMxOAk6CTEJOgkxMTg2OQorUEctVU5LLTMxOQk6CTEJOgkxMTg2OQorUEctVU5LLTMyMAk6CTEJOgkxMTg2OQorUEctVU5LLTMyMQk6CTEJOgkxMTg2OQorUEctVU5LLTMyMgk6CTEJOgkxMTg2OQorUEctVU5LLTMyMwk6CTEJOgkxMTg2OQorUEctVU5LLTMyNAk6CTEJOgkxMTg2OQorUEctVU5LLTMyNQk6CTEJOgkxMTg2OQorUEctVU5LLTMyNgk6CTEJOgkxMTg2OQorUEctVU5LLTMyNwk6CTEJOgkxMTg2OQorUEctVU5LLTMyOAk6CTEJOgkxMTg2OQorUEctVU5LLTMyOQk6CTEJOgkxMTg2OQorUEctVU5LLTMzMAk6CTEJOgkxMTg2OQorUEctVU5LLTMzMQk6CTEJOgkxMTg2OQorUEctVU5LLTMzMgk6CTEJOgkxMTg2OQorUEctVU5LLTMzMwk6CTEJOgkxMTg2OQorUEctVU5LLTMzNAk6CTEJOgkxMTg2OQorUEctVU5LLTMzNQk6CTEJOgkxMTg2OQorUEctVU5LLTMzNgk6CTEJOgkxMTg2OQorUEctVU5LLTMzNwk6CTEJOgkxMTg2OQorUEctVU5LLTMzOAk6CTEJOgkxMTg2OQorUEctVU5LLTMzOQk6CTEJOgkxMTg2OQorUEctVU5LLTM0MAk6CTEJOgkxMTg2OQorUEctVU5LLTM0MQk6CTEJOgkxMTg2OQorUEctVU5LLTM0Mgk6CTEJOgkxMTg2OQorUEctVU5LLTM0Mwk6CTEJOgkxMTg2OQorUEctVU5LLTM0NAk6CTEJOgkxMTg2OQorUEctVU5LLTM0NQk6CTEJOgkxMTg2OQorUEctVU5LLTM0Ngk6CTEJOgkxMTg2OQorUEctVU5LLTM0Nwk6CTEJOgkxMTg2OQorUEctVU5LLTM0OAk6CTEJOgkxMTg2OQorUEctVU5LLTM0OQk6CTEJOgkxMTg2OQorUEctVU5LLTM1MAk6CTEJOgkxMTg2OQorUEctVU5LLTM1MQk6CTEJOgkxMTg2OQorUEctVU5LLTM1Mgk6CTEJOgkxMTg2OQorUEctVU5LLTM1Mwk6CTEJOgkxMTg2OQorUEctVU5LLTM1NAk6CTEJOgkxMTg2OQorUEctVU5LLTM1NQk6CTEJOgkxMTg2OQorUEctVU5LLTM1Ngk6CTEJOgkxMTg2OQorUEctVU5LLTM1Nwk6CTEJOgkxMTg2OQorUEctVU5LLTM1OAk6CTEJOgkxMTg2OQorUEctVU5LLTM1OQk6CTEJOgkxMTg2OQorUEctVU5LLTM2MAk6CTEJOgkxMTg2OQorUEctVU5LLTM2MQk6CTEJOgkxMTg2OQorUEctVU5LLTM2Mgk6CTEJOgkxMTg2OQorUEctVU5LLTM2Mwk6CTEJOgkxMTg2OQorUEctVU5LLTM2NAk6CTEJOgkxMTg2OQorUEctVU5LLTM2NQk6CTEJOgkxMTg2OQorUEctVU5LLTM2Ngk6CTEJOgkxMTg2OQorUEctVU5LLTM2Nwk6CTEJOgkxMTg2OQorUEctVU5LLTM2OAk6CTEJOgkxMTg2OQorUEctVU5LLTM2OQk6CTEJOgkxMTg2OQorUEctVU5LLTM3MAk6CTEJOgkxMTg2OQorUEctVU5LLTM3MQk6CTEJOgkxMTg2OQorUEctVU5LLTM3Mgk6CTEJOgkxMTg2OQorUEctVU5LLTM3Mwk6CTEJOgkxMTg2OQorUEctVU5LLTM3NAk6CTEJOgkxMTg2OQorUEctVU5LLTM3NQk6CTEJOgkxMTg2OQorUEctVU5LLTM3Ngk6CTEJOgkxMTg2OQorUEctVU5LLTM3Nwk6CTEJOgkxMTg2OQorUEctVU5LLTM3OAk6CTEJOgkxMTg2OQorUEctVU5LLTM3OQk6CTEJOgkxMTg2OQorUEctVU5LLTM4MAk6CTEJOgkxMTg2OQorUEctVU5LLTM4MQk6CTEJOgkxMTg2OQorUEctVU5LLTM4Mgk6CTEJOgkxMTg2OQorUEctVU5LLTM4Mwk6CTEJOgkxMTg2OQorUEctVU5LLTM4NAk6CTEJOgkxMTg2OQorUEctVU5LLTM4NQk6CTEJOgkxMTg2OQorUEctVU5LLTM4Ngk6CTEJOgkxMTg2OQorUEctVU5LLTM4Nwk6CTEJOgkxMTg2OQorUEctVU5LLTM4OAk6CTEJOgkxMTg2OQorUEctVU5LLTM4OQk6CTEJOgkxMTg2OQorUEctVU5LLTM5MAk6CTEJOgkxMTg2OQorUEctVU5LLTM5MQk6CTEJOgkxMTg2OQorUEctVU5LLTM5Mgk6CTEJOgkxMTg2OQorUEctVU5LLTM5Mwk6CTEJOgkxMTg2OQorUEctVU5LLTM5NAk6CTEJOgkxMTg2OQorUEctVU5LLTM5NQk6CTEJOgkxMTg2OQorUEctVU5LLTM5Ngk6CTEJOgkxMTg2OQorUEctVU5LLTM5Nwk6CTEJOgkxMTg2OQorUEctVU5LLTM5OAk6CTEJOgkxMTg2OQorUEctVU5LLTM5OQk6CTEJOgkxMTg2OQorUEctVU5LLTQwMAk6CTEJOgkxMTg2OQorUEctVU5LLTQwMQk6CTEJOgkxMTg2OQorUEctVU5LLTQwMgk6CTEJOgkxMTg2OQorUEctVU5LLTQwMwk6CTEJOgkxMTg2OQorUEctVU5LLTQwNAk6CTEJOgkxMTg2OQorUEctVU5LLTQwNQk6CTEJOgkxMTg2OQorUEctVU5LLTQwNgk6CTEJOgkxMTg2OQorUEctVU5LLTQwNwk6CTEJOgkxMTg2OQorUEctVU5LLTQwOAk6CTEJOgkxMTg2OQorUEctVU5LLTQwOQk6CTEJOgkxMTg2OQorUEctVU5LLTQxMAk6CTEJOgkxMTg2OQorUEctVU5LLTQxMQk6CTEJOgkxMTg2OQorUEctVU5LLTQxMgk6CTEJOgkxMTg2OQorUEctVU5LLTQxMwk6CTEJOgkxMTg2OQorUEctVU5LLTQxNAk6CTEJOgkxMTg2OQorUEctVU5LLTQxNQk6CTEJOgkxMTg2OQorUEctVU5LLTQxNgk6CTEJOgkxMTg2OQorUEctVU5LLTQxNwk6CTEJOgkxMTg2OQorUEctVU5LLTQxOAk6CTEJOgkxMTg2OQorUEctVU5LLTQxOQk6CTEJOgkxMTg2OQorUEctVU5LLTQyMAk6CTEJOgkxMTg2OQorUEctVU5LLTQyMQk6CTEJOgkxMTg2OQorUEctVU5LLTQyMgk6CTEJOgkxMTg2OQorUEctVU5LLTQyMwk6CTEJOgkxMTg2OQorUEctVU5LLTQyNAk6CTEJOgkxMTg2OQorUEctVU5LLTQyNQk6CTEJOgkxMTg2OQorUEctVU5LLTQyNgk6CTEJOgkxMTg2OQorUEctVU5LLTQyNwk6CTEJOgkxMTg2OQorUEctVU5LLTQyOAk6CTEJOgkxMTg2OQorUEctVU5LLTQyOQk6CTEJOgkxMTg2OQorUEctVU5LLTQzMAk6CTEJOgkxMTg2OQorUEctVU5LLTQzMQk6CTEJOgkxMTg2OQorUEctVU5LLTQzMgk6CTEJOgkxMTg2OQorUEctVU5LLTQzMwk6CTEJOgkxMTg2OQorUEctVU5LLTQzNAk6CTEJOgkxMTg2OQorUEctVU5LLTQzNQk6CTEJOgkxMTg2OQorUEctVU5LLTQzNgk6CTEJOgkxMTg2OQorUEctVU5LLTQzNwk6CTEJOgkxMTg2OQorUEctVU5LLTQzOAk6CTEJOgkxMTg2OQorUEctVU5LLTQzOQk6CTEJOgkxMTg2OQorUEctVU5LLTQ0MAk6CTEJOgkxMTg2OQorUEctVU5LLTQ0MQk6CTEJOgkxMTg2OQorUEctVU5LLTQ0Mgk6CTEJOgkxMTg2OQorUEctVU5LLTQ0Mwk6CTEJOgkxMTg2OQorUEctVU5LLTQ0NAk6CTEJOgkxMTg2OQorUEctVU5LLTQ0NQk6CTEJOgkxMTg2OQorUEctVU5LLTQ0Ngk6CTEJOgkxMTg2OQorUEctVU5LLTQ0Nwk6CTEJOgkxMTg2OQorUEctVU5LLTQ0OAk6CTEJOgkxMTg2OQorUEctVU5LLTQ0OQk6CTEJOgkxMTg2OQorUEctVU5LLTQ1MAk6CTEJOgkxMTg2OQorUEctVU5LLTQ1MQk6CTEJOgkxMTg2OQorUEctVU5LLTQ1Mgk6CTEJOgkxMTg2OQorUEctVU5LLTQ1Mwk6CTEJOgkxMTg2OQorUEctVU5LLTQ1NAk6CTEJOgkxMTg2OQorUEctVU5LLTQ1NQk6CTEJOgkxMTg2OQorUEctVU5LLTQ1Ngk6CTEJOgkxMTg2OQorUEctVU5LLTQ1Nwk6CTEJOgkxMTg2OQorUEctVU5LLTQ1OAk6CTEJOgkxMTg2OQorUEctVU5LLTQ1OQk6CTEJOgkxMTg2OQorUEctVU5LLTQ2MAk6CTEJOgkxMTg2OQorUEctVU5LLTQ2MQk6CTEJOgkxMTg2OQorUEctVU5LLTQ2Mgk6CTEJOgkxMTg2OQorUEctVU5LLTQ2Mwk6CTEJOgkxMTg2OQorUEctVU5LLTQ2NAk6CTEJOgkxMTg2OQorUEctVU5LLTQ2NQk6CTEJOgkxMTg2OQorUEctVU5LLTQ2Ngk6CTEJOgkxMTg2OQorUEctVU5LLTQ2Nwk6CTEJOgkxMTg2OQorUEctVU5LLTQ2OAk6CTEJOgkxMTg2OQorUEctVU5LLTQ2OQk6CTEJOgkxMTg2OQorUEctVU5LLTQ3MAk6CTEJOgkxMTg2OQorUEctVU5LLTQ3MQk6CTEJOgkxMTg2OQorUEctVU5LLTQ3Mgk6CTEJOgkxMTg2OQorUEctVU5LLTQ3Mwk6CTEJOgkxMTg2OQorUEctVU5LLTQ3NAk6CTEJOgkxMTg2OQorUEctVU5LLTQ3NQk6CTEJOgkxMTg2OQorUEctVU5LLTQ3Ngk6CTEJOgkxMTg2OQorUEctVU5LLTQ3Nwk6CTEJOgkxMTg2OQorUEctVU5LLTQ3OAk6CTEJOgkxMTg2OQorUEctVU5LLTQ3OQk6CTEJOgkxMTg2OQorUEctVU5LLTQ4MAk6CTEJOgkxMTg2OQorUEctVU5LLTQ4MQk6CTEJOgkxMTg2OQorUEctVU5LLTQ4Mgk6CTEJOgkxMTg2OQorUEctVU5LLTQ4Mwk6CTEJOgkxMTg2OQorUEctVU5LLTQ4NAk6CTEJOgkxMTg2OQorUEctVU5LLTQ4NQk6CTEJOgkxMTg2OQorUEctVU5LLTQ4Ngk6CTEJOgkxMTg2OQorUEctVU5LLTQ4Nwk6CTEJOgkxMTg2OQorUEctVU5LLTQ4OAk6CTEJOgkxMTg2OQorUEctVU5LLTQ4OQk6CTEJOgkxMTg2OQorUEctVU5LLTQ5MAk6CTEJOgkxMTg2OQorUEctVU5LLTQ5MQk6CTEJOgkxMTg2OQorUEctVU5LLTQ5Mgk6CTEJOgkxMTg2OQorUEctVU5LLTQ5Mwk6CTEJOgkxMTg2OQorUEctVU5LLTQ5NAk6CTEJOgkxMTg2OQorUEctVU5LLTQ5NQk6CTEJOgkxMTg2OQorUEctVU5LLTQ5Ngk6CTEJOgkxMTg2OQorUE5HLkwyLjEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQJCToJCTIJCToJCTExODY5CitQTkcuTDIuNQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi42CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjcJCToJCTIJCToJCTExODY5CitQTkcuTDIuOAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi45CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjExCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjUwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjUxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjUyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjUzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjU0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjU1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjU2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjU3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjU4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjU5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjYwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjYxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjYyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjYzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjY0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjY1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjY2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjY3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjY4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjY5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjcwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjcxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjcyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjczCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjc0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjc1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjc2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjc3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjc4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjc5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjgwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjgxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjgyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjgzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjg0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjg1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjg2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjg3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjg4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjg5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjkwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjkxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjkyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjkzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjk0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjk1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjk2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjk3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjk4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjk5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEwMAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMDEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTAyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEwMwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMDQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTA1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEwNgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMDcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTA4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEwOQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMTAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTExCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjExMgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMTMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTE0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjExNQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMTYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTE3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjExOAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMTkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTIwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEyMQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMjIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTIzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEyNAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMjUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTI2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEyNwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMjgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTI5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEzMAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMzEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTMyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEzMwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMzQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTM1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEzNgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMzcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTM4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEzOQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNDAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTQxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE0MgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNDMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTQ0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE0NQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNDYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTQ3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE0OAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNDkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTUwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE1MQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNTIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTUzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE1NAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNTUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTU2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE1NwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNTgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTU5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE2MAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNjEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTYyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE2MwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNjQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTY1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE2NgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNjcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTY4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE2OQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNzAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTcxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE3MgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNzMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTc0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE3NQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNzYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTc3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE3OAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNzkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTgwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE4MQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xODIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTgzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE4NAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xODUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTg2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE4NwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xODgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTg5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE5MAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xOTEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTkyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE5MwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xOTQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTk1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE5NgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xOTcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTk4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE5OQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMDAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjAxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIwMgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMDMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjA0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIwNQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMDYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjA3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIwOAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMDkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjEwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIxMQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMTIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjEzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIxNAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMTUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjE2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIxNwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMTgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjE5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIyMAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMjEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjIyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIyMwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMjQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjI1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIyNgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMjcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjI4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIyOQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMzAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjMxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIzMgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMzMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjM0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIzNQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMzYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjM3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIzOAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMzkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjQwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI0MQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNDIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjQzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI0NAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNDUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjQ2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI0NwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNDgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjQ5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI1MAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNTEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjUyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI1MwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNTQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjU1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI1NgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNTcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjU4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI1OQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNjAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjYxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI2MgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNjMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjY0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI2NQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNjYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjY3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI2OAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNjkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjcwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI3MQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNzIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjczCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI3NAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNzUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjc2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI3NwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNzgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjc5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI4MAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yODEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjgyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI4MwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yODQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjg1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI4NgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yODcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjg4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI4OQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yOTAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjkxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI5MgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yOTMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjk0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI5NQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yOTYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjk3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI5OAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yOTkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzAwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMwMQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMDIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzAzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMwNAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMDUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzA2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMwNwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMDgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzA5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMxMAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMTEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzEyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMxMwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMTQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzE1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMxNgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMTcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzE4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMxOQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMjAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzIxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMyMgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMjMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzI0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMyNQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMjYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzI3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMyOAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMjkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzMwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMzMQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMzIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzMzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMzNAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMzUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzM2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMzNwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMzgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzM5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM0MAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNDEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzQyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM0MwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNDQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzQ1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM0NgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNDcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzQ4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM0OQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNTAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzUxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM1MgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNTMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzU0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM1NQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNTYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzU3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM1OAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNTkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzYwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM2MQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNjIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzYzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM2NAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNjUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzY2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM2NwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNjgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzY5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM3MAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNzEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzcyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM3MwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNzQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzc1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM3NgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNzcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzc4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM3OQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zODAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzgxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM4MgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zODMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzg0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM4NQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zODYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzg3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM4OAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zODkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzkwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM5MQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zOTIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzkzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM5NAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zOTUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzk2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM5NwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zOTgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzk5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQwMAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MDEJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDAyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQwMwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MDQJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDA1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQwNgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MDcJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDA4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQwOQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MTAJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDExCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQxMgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MTMJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDE0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQxNQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MTYJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDE3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQxOAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MTkJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDIwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQyMQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MjIJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDIzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQyNAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MjUJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDI2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQyNwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MjgJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDI5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQzMAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MzEJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDMyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQzMwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MzQJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDM1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQzNgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MzcJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDM4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQzOQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NDAJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDQxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ0MgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NDMJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDQ0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ0NQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NDYJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDQ3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ0OAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NDkJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDUwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ1MQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NTIJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDUzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ1NAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NTUJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDU2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ1NwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NTgJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDU5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ2MAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NjEJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDYyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ2MwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NjQJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDY1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ2NgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NjcJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDY4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ2OQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NzAJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDcxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ3MgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NzMJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDc0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ3NQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NzYJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDc3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ3OAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NzkJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDgwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ4MQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40ODIJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDgzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ4NAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40ODUJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDg2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ4NwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40ODgJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDg5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ5MAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40OTEJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDkyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ5MwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40OTQJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDk1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ5NgkJOgkJMgkJOgkJMTE4NjkKK0NlbnRyYWwgIAk6CTEJOgkxODMxNTMKK1NpbWJ1IAk6CTEJOgkyNTg3NzYKK0Vhc3QgTmV3IEJyaXRhaW4gCToJMQk6CTIyMDAzNQorRWFzdCBTZXBpayAJOgkxCToJMzQxNTgzCitFYXN0ZXJuIEhpZ2hsYW5kcyAJOgkxCToJNDI5NDgwCitFbmdhIAk6CTEJOgkyODkyOTkKK0d1bGYgCToJMQk6CTEwNTA1MAorTWFkYW5nIAk6CTEJOgkzNjI4MDUKK01hbnVzIAk6CTEJOgk0MzU4OQorTWlsbmUgQmF5IAk6CTEJOgkyMDkwNTQKK01vcm9iZSAJOgkxCToJNTM2OTE3CitOYXRpb25hbCBDYXBpdGFsIERpc3RyaWN0IAk6CTEJOgkyNTI0NjkKK05ldyBJcmVsYW5kIAk6CTEJOgkxMTgxNDgKK05vcnRoIFNvbG9tb25zIAk6CTEJOgkxNDExNjEKK09ybyAoTm9ydGhlcm4pIAk6CTEJOgkxMzI3MTQKK1NvdXRoZXJuIEhpZ2hsYW5kcyAJOgkxCToJNTQ0MzUyCitXZXN0IE5ldyBCcml0YWluIAk6CTEJOgkxODQ4MzgKK1dlc3QgU2VwaWsgCToJMQk6CTE4NTc5MAorV2VzdGVybiAJOgkxCToJMTUyMDY3CitXZXN0ZXJuIEhpZ2hsYW5kcyAJOgkxCToJNDM5MDg1CisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BBUFVBTkVXR1VJTkVBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BBUFVBTkVXR1VJTkVBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYzgxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEFQVUFORVdHVUlORUFfQVJFQS50eHQKQEAgLTAsMCArMSwxMDEzIEBACitQYXB1YSBOZXcgR3VpbmVhCToJMAk6CTQ2Mjg0MAorUEctVU5LLTEJOgkxCToJOTMzCitQRy1VTkstMgk6CTEJOgk5MzMKK1BHLVVOSy0zCToJMQk6CTkzMworUEctVU5LLTQJOgkxCToJOTMzCitQRy1VTkstNQk6CTEJOgk5MzMKK1BHLVVOSy02CToJMQk6CTkzMworUEctVU5LLTcJOgkxCToJOTMzCitQRy1VTkstOAk6CTEJOgk5MzMKK1BHLVVOSy05CToJMQk6CTkzMworUEctVU5LLTEwCToJMQk6CTkzMworUEctVU5LLTExCToJMQk6CTkzMworUEctVU5LLTEyCToJMQk6CTkzMworUEctVU5LLTEzCToJMQk6CTkzMworUEctVU5LLTE0CToJMQk6CTkzMworUEctVU5LLTE1CToJMQk6CTkzMworUEctVU5LLTE2CToJMQk6CTkzMworUEctVU5LLTE3CToJMQk6CTkzMworUEctVU5LLTE4CToJMQk6CTkzMworUEctVU5LLTE5CToJMQk6CTkzMworUEctVU5LLTIwCToJMQk6CTkzMworUEctVU5LLTIxCToJMQk6CTkzMworUEctVU5LLTIyCToJMQk6CTkzMworUEctVU5LLTIzCToJMQk6CTkzMworUEctVU5LLTI0CToJMQk6CTkzMworUEctVU5LLTI1CToJMQk6CTkzMworUEctVU5LLTI2CToJMQk6CTkzMworUEctVU5LLTI3CToJMQk6CTkzMworUEctVU5LLTI4CToJMQk6CTkzMworUEctVU5LLTI5CToJMQk6CTkzMworUEctVU5LLTMwCToJMQk6CTkzMworUEctVU5LLTMxCToJMQk6CTkzMworUEctVU5LLTMyCToJMQk6CTkzMworUEctVU5LLTMzCToJMQk6CTkzMworUEctVU5LLTM0CToJMQk6CTkzMworUEctVU5LLTM1CToJMQk6CTkzMworUEctVU5LLTM2CToJMQk6CTkzMworUEctVU5LLTM3CToJMQk6CTkzMworUEctVU5LLTM4CToJMQk6CTkzMworUEctVU5LLTM5CToJMQk6CTkzMworUEctVU5LLTQwCToJMQk6CTkzMworUEctVU5LLTQxCToJMQk6CTkzMworUEctVU5LLTQyCToJMQk6CTkzMworUEctVU5LLTQzCToJMQk6CTkzMworUEctVU5LLTQ0CToJMQk6CTkzMworUEctVU5LLTQ1CToJMQk6CTkzMworUEctVU5LLTQ2CToJMQk6CTkzMworUEctVU5LLTQ3CToJMQk6CTkzMworUEctVU5LLTQ4CToJMQk6CTkzMworUEctVU5LLTQ5CToJMQk6CTkzMworUEctVU5LLTUwCToJMQk6CTkzMworUEctVU5LLTUxCToJMQk6CTkzMworUEctVU5LLTUyCToJMQk6CTkzMworUEctVU5LLTUzCToJMQk6CTkzMworUEctVU5LLTU0CToJMQk6CTkzMworUEctVU5LLTU1CToJMQk6CTkzMworUEctVU5LLTU2CToJMQk6CTkzMworUEctVU5LLTU3CToJMQk6CTkzMworUEctVU5LLTU4CToJMQk6CTkzMworUEctVU5LLTU5CToJMQk6CTkzMworUEctVU5LLTYwCToJMQk6CTkzMworUEctVU5LLTYxCToJMQk6CTkzMworUEctVU5LLTYyCToJMQk6CTkzMworUEctVU5LLTYzCToJMQk6CTkzMworUEctVU5LLTY0CToJMQk6CTkzMworUEctVU5LLTY1CToJMQk6CTkzMworUEctVU5LLTY2CToJMQk6CTkzMworUEctVU5LLTY3CToJMQk6CTkzMworUEctVU5LLTY4CToJMQk6CTkzMworUEctVU5LLTY5CToJMQk6CTkzMworUEctVU5LLTcwCToJMQk6CTkzMworUEctVU5LLTcxCToJMQk6CTkzMworUEctVU5LLTcyCToJMQk6CTkzMworUEctVU5LLTczCToJMQk6CTkzMworUEctVU5LLTc0CToJMQk6CTkzMworUEctVU5LLTc1CToJMQk6CTkzMworUEctVU5LLTc2CToJMQk6CTkzMworUEctVU5LLTc3CToJMQk6CTkzMworUEctVU5LLTc4CToJMQk6CTkzMworUEctVU5LLTc5CToJMQk6CTkzMworUEctVU5LLTgwCToJMQk6CTkzMworUEctVU5LLTgxCToJMQk6CTkzMworUEctVU5LLTgyCToJMQk6CTkzMworUEctVU5LLTgzCToJMQk6CTkzMworUEctVU5LLTg0CToJMQk6CTkzMworUEctVU5LLTg1CToJMQk6CTkzMworUEctVU5LLTg2CToJMQk6CTkzMworUEctVU5LLTg3CToJMQk6CTkzMworUEctVU5LLTg4CToJMQk6CTkzMworUEctVU5LLTg5CToJMQk6CTkzMworUEctVU5LLTkwCToJMQk6CTkzMworUEctVU5LLTkxCToJMQk6CTkzMworUEctVU5LLTkyCToJMQk6CTkzMworUEctVU5LLTkzCToJMQk6CTkzMworUEctVU5LLTk0CToJMQk6CTkzMworUEctVU5LLTk1CToJMQk6CTkzMworUEctVU5LLTk2CToJMQk6CTkzMworUEctVU5LLTk3CToJMQk6CTkzMworUEctVU5LLTk4CToJMQk6CTkzMworUEctVU5LLTk5CToJMQk6CTkzMworUEctVU5LLTEwMAk6CTEJOgk5MzMKK1BHLVVOSy0xMDEJOgkxCToJOTMzCitQRy1VTkstMTAyCToJMQk6CTkzMworUEctVU5LLTEwMwk6CTEJOgk5MzMKK1BHLVVOSy0xMDQJOgkxCToJOTMzCitQRy1VTkstMTA1CToJMQk6CTkzMworUEctVU5LLTEwNgk6CTEJOgk5MzMKK1BHLVVOSy0xMDcJOgkxCToJOTMzCitQRy1VTkstMTA4CToJMQk6CTkzMworUEctVU5LLTEwOQk6CTEJOgk5MzMKK1BHLVVOSy0xMTAJOgkxCToJOTMzCitQRy1VTkstMTExCToJMQk6CTkzMworUEctVU5LLTExMgk6CTEJOgk5MzMKK1BHLVVOSy0xMTMJOgkxCToJOTMzCitQRy1VTkstMTE0CToJMQk6CTkzMworUEctVU5LLTExNQk6CTEJOgk5MzMKK1BHLVVOSy0xMTYJOgkxCToJOTMzCitQRy1VTkstMTE3CToJMQk6CTkzMworUEctVU5LLTExOAk6CTEJOgk5MzMKK1BHLVVOSy0xMTkJOgkxCToJOTMzCitQRy1VTkstMTIwCToJMQk6CTkzMworUEctVU5LLTEyMQk6CTEJOgk5MzMKK1BHLVVOSy0xMjIJOgkxCToJOTMzCitQRy1VTkstMTIzCToJMQk6CTkzMworUEctVU5LLTEyNAk6CTEJOgk5MzMKK1BHLVVOSy0xMjUJOgkxCToJOTMzCitQRy1VTkstMTI2CToJMQk6CTkzMworUEctVU5LLTEyNwk6CTEJOgk5MzMKK1BHLVVOSy0xMjgJOgkxCToJOTMzCitQRy1VTkstMTI5CToJMQk6CTkzMworUEctVU5LLTEzMAk6CTEJOgk5MzMKK1BHLVVOSy0xMzEJOgkxCToJOTMzCitQRy1VTkstMTMyCToJMQk6CTkzMworUEctVU5LLTEzMwk6CTEJOgk5MzMKK1BHLVVOSy0xMzQJOgkxCToJOTMzCitQRy1VTkstMTM1CToJMQk6CTkzMworUEctVU5LLTEzNgk6CTEJOgk5MzMKK1BHLVVOSy0xMzcJOgkxCToJOTMzCitQRy1VTkstMTM4CToJMQk6CTkzMworUEctVU5LLTEzOQk6CTEJOgk5MzMKK1BHLVVOSy0xNDAJOgkxCToJOTMzCitQRy1VTkstMTQxCToJMQk6CTkzMworUEctVU5LLTE0Mgk6CTEJOgk5MzMKK1BHLVVOSy0xNDMJOgkxCToJOTMzCitQRy1VTkstMTQ0CToJMQk6CTkzMworUEctVU5LLTE0NQk6CTEJOgk5MzMKK1BHLVVOSy0xNDYJOgkxCToJOTMzCitQRy1VTkstMTQ3CToJMQk6CTkzMworUEctVU5LLTE0OAk6CTEJOgk5MzMKK1BHLVVOSy0xNDkJOgkxCToJOTMzCitQRy1VTkstMTUwCToJMQk6CTkzMworUEctVU5LLTE1MQk6CTEJOgk5MzMKK1BHLVVOSy0xNTIJOgkxCToJOTMzCitQRy1VTkstMTUzCToJMQk6CTkzMworUEctVU5LLTE1NAk6CTEJOgk5MzMKK1BHLVVOSy0xNTUJOgkxCToJOTMzCitQRy1VTkstMTU2CToJMQk6CTkzMworUEctVU5LLTE1Nwk6CTEJOgk5MzMKK1BHLVVOSy0xNTgJOgkxCToJOTMzCitQRy1VTkstMTU5CToJMQk6CTkzMworUEctVU5LLTE2MAk6CTEJOgk5MzMKK1BHLVVOSy0xNjEJOgkxCToJOTMzCitQRy1VTkstMTYyCToJMQk6CTkzMworUEctVU5LLTE2Mwk6CTEJOgk5MzMKK1BHLVVOSy0xNjQJOgkxCToJOTMzCitQRy1VTkstMTY1CToJMQk6CTkzMworUEctVU5LLTE2Ngk6CTEJOgk5MzMKK1BHLVVOSy0xNjcJOgkxCToJOTMzCitQRy1VTkstMTY4CToJMQk6CTkzMworUEctVU5LLTE2OQk6CTEJOgk5MzMKK1BHLVVOSy0xNzAJOgkxCToJOTMzCitQRy1VTkstMTcxCToJMQk6CTkzMworUEctVU5LLTE3Mgk6CTEJOgk5MzMKK1BHLVVOSy0xNzMJOgkxCToJOTMzCitQRy1VTkstMTc0CToJMQk6CTkzMworUEctVU5LLTE3NQk6CTEJOgk5MzMKK1BHLVVOSy0xNzYJOgkxCToJOTMzCitQRy1VTkstMTc3CToJMQk6CTkzMworUEctVU5LLTE3OAk6CTEJOgk5MzMKK1BHLVVOSy0xNzkJOgkxCToJOTMzCitQRy1VTkstMTgwCToJMQk6CTkzMworUEctVU5LLTE4MQk6CTEJOgk5MzMKK1BHLVVOSy0xODIJOgkxCToJOTMzCitQRy1VTkstMTgzCToJMQk6CTkzMworUEctVU5LLTE4NAk6CTEJOgk5MzMKK1BHLVVOSy0xODUJOgkxCToJOTMzCitQRy1VTkstMTg2CToJMQk6CTkzMworUEctVU5LLTE4Nwk6CTEJOgk5MzMKK1BHLVVOSy0xODgJOgkxCToJOTMzCitQRy1VTkstMTg5CToJMQk6CTkzMworUEctVU5LLTE5MAk6CTEJOgk5MzMKK1BHLVVOSy0xOTEJOgkxCToJOTMzCitQRy1VTkstMTkyCToJMQk6CTkzMworUEctVU5LLTE5Mwk6CTEJOgk5MzMKK1BHLVVOSy0xOTQJOgkxCToJOTMzCitQRy1VTkstMTk1CToJMQk6CTkzMworUEctVU5LLTE5Ngk6CTEJOgk5MzMKK1BHLVVOSy0xOTcJOgkxCToJOTMzCitQRy1VTkstMTk4CToJMQk6CTkzMworUEctVU5LLTE5OQk6CTEJOgk5MzMKK1BHLVVOSy0yMDAJOgkxCToJOTMzCitQRy1VTkstMjAxCToJMQk6CTkzMworUEctVU5LLTIwMgk6CTEJOgk5MzMKK1BHLVVOSy0yMDMJOgkxCToJOTMzCitQRy1VTkstMjA0CToJMQk6CTkzMworUEctVU5LLTIwNQk6CTEJOgk5MzMKK1BHLVVOSy0yMDYJOgkxCToJOTMzCitQRy1VTkstMjA3CToJMQk6CTkzMworUEctVU5LLTIwOAk6CTEJOgk5MzMKK1BHLVVOSy0yMDkJOgkxCToJOTMzCitQRy1VTkstMjEwCToJMQk6CTkzMworUEctVU5LLTIxMQk6CTEJOgk5MzMKK1BHLVVOSy0yMTIJOgkxCToJOTMzCitQRy1VTkstMjEzCToJMQk6CTkzMworUEctVU5LLTIxNAk6CTEJOgk5MzMKK1BHLVVOSy0yMTUJOgkxCToJOTMzCitQRy1VTkstMjE2CToJMQk6CTkzMworUEctVU5LLTIxNwk6CTEJOgk5MzMKK1BHLVVOSy0yMTgJOgkxCToJOTMzCitQRy1VTkstMjE5CToJMQk6CTkzMworUEctVU5LLTIyMAk6CTEJOgk5MzMKK1BHLVVOSy0yMjEJOgkxCToJOTMzCitQRy1VTkstMjIyCToJMQk6CTkzMworUEctVU5LLTIyMwk6CTEJOgk5MzMKK1BHLVVOSy0yMjQJOgkxCToJOTMzCitQRy1VTkstMjI1CToJMQk6CTkzMworUEctVU5LLTIyNgk6CTEJOgk5MzMKK1BHLVVOSy0yMjcJOgkxCToJOTMzCitQRy1VTkstMjI4CToJMQk6CTkzMworUEctVU5LLTIyOQk6CTEJOgk5MzMKK1BHLVVOSy0yMzAJOgkxCToJOTMzCitQRy1VTkstMjMxCToJMQk6CTkzMworUEctVU5LLTIzMgk6CTEJOgk5MzMKK1BHLVVOSy0yMzMJOgkxCToJOTMzCitQRy1VTkstMjM0CToJMQk6CTkzMworUEctVU5LLTIzNQk6CTEJOgk5MzMKK1BHLVVOSy0yMzYJOgkxCToJOTMzCitQRy1VTkstMjM3CToJMQk6CTkzMworUEctVU5LLTIzOAk6CTEJOgk5MzMKK1BHLVVOSy0yMzkJOgkxCToJOTMzCitQRy1VTkstMjQwCToJMQk6CTkzMworUEctVU5LLTI0MQk6CTEJOgk5MzMKK1BHLVVOSy0yNDIJOgkxCToJOTMzCitQRy1VTkstMjQzCToJMQk6CTkzMworUEctVU5LLTI0NAk6CTEJOgk5MzMKK1BHLVVOSy0yNDUJOgkxCToJOTMzCitQRy1VTkstMjQ2CToJMQk6CTkzMworUEctVU5LLTI0Nwk6CTEJOgk5MzMKK1BHLVVOSy0yNDgJOgkxCToJOTMzCitQRy1VTkstMjQ5CToJMQk6CTkzMworUEctVU5LLTI1MAk6CTEJOgk5MzMKK1BHLVVOSy0yNTEJOgkxCToJOTMzCitQRy1VTkstMjUyCToJMQk6CTkzMworUEctVU5LLTI1Mwk6CTEJOgk5MzMKK1BHLVVOSy0yNTQJOgkxCToJOTMzCitQRy1VTkstMjU1CToJMQk6CTkzMworUEctVU5LLTI1Ngk6CTEJOgk5MzMKK1BHLVVOSy0yNTcJOgkxCToJOTMzCitQRy1VTkstMjU4CToJMQk6CTkzMworUEctVU5LLTI1OQk6CTEJOgk5MzMKK1BHLVVOSy0yNjAJOgkxCToJOTMzCitQRy1VTkstMjYxCToJMQk6CTkzMworUEctVU5LLTI2Mgk6CTEJOgk5MzMKK1BHLVVOSy0yNjMJOgkxCToJOTMzCitQRy1VTkstMjY0CToJMQk6CTkzMworUEctVU5LLTI2NQk6CTEJOgk5MzMKK1BHLVVOSy0yNjYJOgkxCToJOTMzCitQRy1VTkstMjY3CToJMQk6CTkzMworUEctVU5LLTI2OAk6CTEJOgk5MzMKK1BHLVVOSy0yNjkJOgkxCToJOTMzCitQRy1VTkstMjcwCToJMQk6CTkzMworUEctVU5LLTI3MQk6CTEJOgk5MzMKK1BHLVVOSy0yNzIJOgkxCToJOTMzCitQRy1VTkstMjczCToJMQk6CTkzMworUEctVU5LLTI3NAk6CTEJOgk5MzMKK1BHLVVOSy0yNzUJOgkxCToJOTMzCitQRy1VTkstMjc2CToJMQk6CTkzMworUEctVU5LLTI3Nwk6CTEJOgk5MzMKK1BHLVVOSy0yNzgJOgkxCToJOTMzCitQRy1VTkstMjc5CToJMQk6CTkzMworUEctVU5LLTI4MAk6CTEJOgk5MzMKK1BHLVVOSy0yODEJOgkxCToJOTMzCitQRy1VTkstMjgyCToJMQk6CTkzMworUEctVU5LLTI4Mwk6CTEJOgk5MzMKK1BHLVVOSy0yODQJOgkxCToJOTMzCitQRy1VTkstMjg1CToJMQk6CTkzMworUEctVU5LLTI4Ngk6CTEJOgk5MzMKK1BHLVVOSy0yODcJOgkxCToJOTMzCitQRy1VTkstMjg4CToJMQk6CTkzMworUEctVU5LLTI4OQk6CTEJOgk5MzMKK1BHLVVOSy0yOTAJOgkxCToJOTMzCitQRy1VTkstMjkxCToJMQk6CTkzMworUEctVU5LLTI5Mgk6CTEJOgk5MzMKK1BHLVVOSy0yOTMJOgkxCToJOTMzCitQRy1VTkstMjk0CToJMQk6CTkzMworUEctVU5LLTI5NQk6CTEJOgk5MzMKK1BHLVVOSy0yOTYJOgkxCToJOTMzCitQRy1VTkstMjk3CToJMQk6CTkzMworUEctVU5LLTI5OAk6CTEJOgk5MzMKK1BHLVVOSy0yOTkJOgkxCToJOTMzCitQRy1VTkstMzAwCToJMQk6CTkzMworUEctVU5LLTMwMQk6CTEJOgk5MzMKK1BHLVVOSy0zMDIJOgkxCToJOTMzCitQRy1VTkstMzAzCToJMQk6CTkzMworUEctVU5LLTMwNAk6CTEJOgk5MzMKK1BHLVVOSy0zMDUJOgkxCToJOTMzCitQRy1VTkstMzA2CToJMQk6CTkzMworUEctVU5LLTMwNwk6CTEJOgk5MzMKK1BHLVVOSy0zMDgJOgkxCToJOTMzCitQRy1VTkstMzA5CToJMQk6CTkzMworUEctVU5LLTMxMAk6CTEJOgk5MzMKK1BHLVVOSy0zMTEJOgkxCToJOTMzCitQRy1VTkstMzEyCToJMQk6CTkzMworUEctVU5LLTMxMwk6CTEJOgk5MzMKK1BHLVVOSy0zMTQJOgkxCToJOTMzCitQRy1VTkstMzE1CToJMQk6CTkzMworUEctVU5LLTMxNgk6CTEJOgk5MzMKK1BHLVVOSy0zMTcJOgkxCToJOTMzCitQRy1VTkstMzE4CToJMQk6CTkzMworUEctVU5LLTMxOQk6CTEJOgk5MzMKK1BHLVVOSy0zMjAJOgkxCToJOTMzCitQRy1VTkstMzIxCToJMQk6CTkzMworUEctVU5LLTMyMgk6CTEJOgk5MzMKK1BHLVVOSy0zMjMJOgkxCToJOTMzCitQRy1VTkstMzI0CToJMQk6CTkzMworUEctVU5LLTMyNQk6CTEJOgk5MzMKK1BHLVVOSy0zMjYJOgkxCToJOTMzCitQRy1VTkstMzI3CToJMQk6CTkzMworUEctVU5LLTMyOAk6CTEJOgk5MzMKK1BHLVVOSy0zMjkJOgkxCToJOTMzCitQRy1VTkstMzMwCToJMQk6CTkzMworUEctVU5LLTMzMQk6CTEJOgk5MzMKK1BHLVVOSy0zMzIJOgkxCToJOTMzCitQRy1VTkstMzMzCToJMQk6CTkzMworUEctVU5LLTMzNAk6CTEJOgk5MzMKK1BHLVVOSy0zMzUJOgkxCToJOTMzCitQRy1VTkstMzM2CToJMQk6CTkzMworUEctVU5LLTMzNwk6CTEJOgk5MzMKK1BHLVVOSy0zMzgJOgkxCToJOTMzCitQRy1VTkstMzM5CToJMQk6CTkzMworUEctVU5LLTM0MAk6CTEJOgk5MzMKK1BHLVVOSy0zNDEJOgkxCToJOTMzCitQRy1VTkstMzQyCToJMQk6CTkzMworUEctVU5LLTM0Mwk6CTEJOgk5MzMKK1BHLVVOSy0zNDQJOgkxCToJOTMzCitQRy1VTkstMzQ1CToJMQk6CTkzMworUEctVU5LLTM0Ngk6CTEJOgk5MzMKK1BHLVVOSy0zNDcJOgkxCToJOTMzCitQRy1VTkstMzQ4CToJMQk6CTkzMworUEctVU5LLTM0OQk6CTEJOgk5MzMKK1BHLVVOSy0zNTAJOgkxCToJOTMzCitQRy1VTkstMzUxCToJMQk6CTkzMworUEctVU5LLTM1Mgk6CTEJOgk5MzMKK1BHLVVOSy0zNTMJOgkxCToJOTMzCitQRy1VTkstMzU0CToJMQk6CTkzMworUEctVU5LLTM1NQk6CTEJOgk5MzMKK1BHLVVOSy0zNTYJOgkxCToJOTMzCitQRy1VTkstMzU3CToJMQk6CTkzMworUEctVU5LLTM1OAk6CTEJOgk5MzMKK1BHLVVOSy0zNTkJOgkxCToJOTMzCitQRy1VTkstMzYwCToJMQk6CTkzMworUEctVU5LLTM2MQk6CTEJOgk5MzMKK1BHLVVOSy0zNjIJOgkxCToJOTMzCitQRy1VTkstMzYzCToJMQk6CTkzMworUEctVU5LLTM2NAk6CTEJOgk5MzMKK1BHLVVOSy0zNjUJOgkxCToJOTMzCitQRy1VTkstMzY2CToJMQk6CTkzMworUEctVU5LLTM2Nwk6CTEJOgk5MzMKK1BHLVVOSy0zNjgJOgkxCToJOTMzCitQRy1VTkstMzY5CToJMQk6CTkzMworUEctVU5LLTM3MAk6CTEJOgk5MzMKK1BHLVVOSy0zNzEJOgkxCToJOTMzCitQRy1VTkstMzcyCToJMQk6CTkzMworUEctVU5LLTM3Mwk6CTEJOgk5MzMKK1BHLVVOSy0zNzQJOgkxCToJOTMzCitQRy1VTkstMzc1CToJMQk6CTkzMworUEctVU5LLTM3Ngk6CTEJOgk5MzMKK1BHLVVOSy0zNzcJOgkxCToJOTMzCitQRy1VTkstMzc4CToJMQk6CTkzMworUEctVU5LLTM3OQk6CTEJOgk5MzMKK1BHLVVOSy0zODAJOgkxCToJOTMzCitQRy1VTkstMzgxCToJMQk6CTkzMworUEctVU5LLTM4Mgk6CTEJOgk5MzMKK1BHLVVOSy0zODMJOgkxCToJOTMzCitQRy1VTkstMzg0CToJMQk6CTkzMworUEctVU5LLTM4NQk6CTEJOgk5MzMKK1BHLVVOSy0zODYJOgkxCToJOTMzCitQRy1VTkstMzg3CToJMQk6CTkzMworUEctVU5LLTM4OAk6CTEJOgk5MzMKK1BHLVVOSy0zODkJOgkxCToJOTMzCitQRy1VTkstMzkwCToJMQk6CTkzMworUEctVU5LLTM5MQk6CTEJOgk5MzMKK1BHLVVOSy0zOTIJOgkxCToJOTMzCitQRy1VTkstMzkzCToJMQk6CTkzMworUEctVU5LLTM5NAk6CTEJOgk5MzMKK1BHLVVOSy0zOTUJOgkxCToJOTMzCitQRy1VTkstMzk2CToJMQk6CTkzMworUEctVU5LLTM5Nwk6CTEJOgk5MzMKK1BHLVVOSy0zOTgJOgkxCToJOTMzCitQRy1VTkstMzk5CToJMQk6CTkzMworUEctVU5LLTQwMAk6CTEJOgk5MzMKK1BHLVVOSy00MDEJOgkxCToJOTMzCitQRy1VTkstNDAyCToJMQk6CTkzMworUEctVU5LLTQwMwk6CTEJOgk5MzMKK1BHLVVOSy00MDQJOgkxCToJOTMzCitQRy1VTkstNDA1CToJMQk6CTkzMworUEctVU5LLTQwNgk6CTEJOgk5MzMKK1BHLVVOSy00MDcJOgkxCToJOTMzCitQRy1VTkstNDA4CToJMQk6CTkzMworUEctVU5LLTQwOQk6CTEJOgk5MzMKK1BHLVVOSy00MTAJOgkxCToJOTMzCitQRy1VTkstNDExCToJMQk6CTkzMworUEctVU5LLTQxMgk6CTEJOgk5MzMKK1BHLVVOSy00MTMJOgkxCToJOTMzCitQRy1VTkstNDE0CToJMQk6CTkzMworUEctVU5LLTQxNQk6CTEJOgk5MzMKK1BHLVVOSy00MTYJOgkxCToJOTMzCitQRy1VTkstNDE3CToJMQk6CTkzMworUEctVU5LLTQxOAk6CTEJOgk5MzMKK1BHLVVOSy00MTkJOgkxCToJOTMzCitQRy1VTkstNDIwCToJMQk6CTkzMworUEctVU5LLTQyMQk6CTEJOgk5MzMKK1BHLVVOSy00MjIJOgkxCToJOTMzCitQRy1VTkstNDIzCToJMQk6CTkzMworUEctVU5LLTQyNAk6CTEJOgk5MzMKK1BHLVVOSy00MjUJOgkxCToJOTMzCitQRy1VTkstNDI2CToJMQk6CTkzMworUEctVU5LLTQyNwk6CTEJOgk5MzMKK1BHLVVOSy00MjgJOgkxCToJOTMzCitQRy1VTkstNDI5CToJMQk6CTkzMworUEctVU5LLTQzMAk6CTEJOgk5MzMKK1BHLVVOSy00MzEJOgkxCToJOTMzCitQRy1VTkstNDMyCToJMQk6CTkzMworUEctVU5LLTQzMwk6CTEJOgk5MzMKK1BHLVVOSy00MzQJOgkxCToJOTMzCitQRy1VTkstNDM1CToJMQk6CTkzMworUEctVU5LLTQzNgk6CTEJOgk5MzMKK1BHLVVOSy00MzcJOgkxCToJOTMzCitQRy1VTkstNDM4CToJMQk6CTkzMworUEctVU5LLTQzOQk6CTEJOgk5MzMKK1BHLVVOSy00NDAJOgkxCToJOTMzCitQRy1VTkstNDQxCToJMQk6CTkzMworUEctVU5LLTQ0Mgk6CTEJOgk5MzMKK1BHLVVOSy00NDMJOgkxCToJOTMzCitQRy1VTkstNDQ0CToJMQk6CTkzMworUEctVU5LLTQ0NQk6CTEJOgk5MzMKK1BHLVVOSy00NDYJOgkxCToJOTMzCitQRy1VTkstNDQ3CToJMQk6CTkzMworUEctVU5LLTQ0OAk6CTEJOgk5MzMKK1BHLVVOSy00NDkJOgkxCToJOTMzCitQRy1VTkstNDUwCToJMQk6CTkzMworUEctVU5LLTQ1MQk6CTEJOgk5MzMKK1BHLVVOSy00NTIJOgkxCToJOTMzCitQRy1VTkstNDUzCToJMQk6CTkzMworUEctVU5LLTQ1NAk6CTEJOgk5MzMKK1BHLVVOSy00NTUJOgkxCToJOTMzCitQRy1VTkstNDU2CToJMQk6CTkzMworUEctVU5LLTQ1Nwk6CTEJOgk5MzMKK1BHLVVOSy00NTgJOgkxCToJOTMzCitQRy1VTkstNDU5CToJMQk6CTkzMworUEctVU5LLTQ2MAk6CTEJOgk5MzMKK1BHLVVOSy00NjEJOgkxCToJOTMzCitQRy1VTkstNDYyCToJMQk6CTkzMworUEctVU5LLTQ2Mwk6CTEJOgk5MzMKK1BHLVVOSy00NjQJOgkxCToJOTMzCitQRy1VTkstNDY1CToJMQk6CTkzMworUEctVU5LLTQ2Ngk6CTEJOgk5MzMKK1BHLVVOSy00NjcJOgkxCToJOTMzCitQRy1VTkstNDY4CToJMQk6CTkzMworUEctVU5LLTQ2OQk6CTEJOgk5MzMKK1BHLVVOSy00NzAJOgkxCToJOTMzCitQRy1VTkstNDcxCToJMQk6CTkzMworUEctVU5LLTQ3Mgk6CTEJOgk5MzMKK1BHLVVOSy00NzMJOgkxCToJOTMzCitQRy1VTkstNDc0CToJMQk6CTkzMworUEctVU5LLTQ3NQk6CTEJOgk5MzMKK1BHLVVOSy00NzYJOgkxCToJOTMzCitQRy1VTkstNDc3CToJMQk6CTkzMworUEctVU5LLTQ3OAk6CTEJOgk5MzMKK1BHLVVOSy00NzkJOgkxCToJOTMzCitQRy1VTkstNDgwCToJMQk6CTkzMworUEctVU5LLTQ4MQk6CTEJOgk5MzMKK1BHLVVOSy00ODIJOgkxCToJOTMzCitQRy1VTkstNDgzCToJMQk6CTkzMworUEctVU5LLTQ4NAk6CTEJOgk5MzMKK1BHLVVOSy00ODUJOgkxCToJOTMzCitQRy1VTkstNDg2CToJMQk6CTkzMworUEctVU5LLTQ4Nwk6CTEJOgk5MzMKK1BHLVVOSy00ODgJOgkxCToJOTMzCitQRy1VTkstNDg5CToJMQk6CTkzMworUEctVU5LLTQ5MAk6CTEJOgk5MzMKK1BHLVVOSy00OTEJOgkxCToJOTMzCitQRy1VTkstNDkyCToJMQk6CTkzMworUEctVU5LLTQ5Mwk6CTEJOgk5MzMKK1BHLVVOSy00OTQJOgkxCToJOTMzCitQRy1VTkstNDk1CToJMQk6CTkzMworUEctVU5LLTQ5Ngk6CTEJOgk5MzMKK1BORy5MMi4xCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40CQk6CQkyCQk6CQk5MzMKK1BORy5MMi41CQk6CQkyCQk6CQk5MzMKK1BORy5MMi42CQk6CQkyCQk6CQk5MzMKK1BORy5MMi43CQk6CQkyCQk6CQk5MzMKK1BORy5MMi44CQk6CQkyCQk6CQk5MzMKK1BORy5MMi45CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTEJCToJCTIJCToJCTkzMworUE5HLkwyLjEyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTQJCToJCTIJCToJCTkzMworUE5HLkwyLjE1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTcJCToJCTIJCToJCTkzMworUE5HLkwyLjE4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xOQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjAJCToJCTIJCToJCTkzMworUE5HLkwyLjIxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjMJCToJCTIJCToJCTkzMworUE5HLkwyLjI0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjYJCToJCTIJCToJCTkzMworUE5HLkwyLjI3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yOAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjkJCToJCTIJCToJCTkzMworUE5HLkwyLjMwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzIJCToJCTIJCToJCTkzMworUE5HLkwyLjMzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzUJCToJCTIJCToJCTkzMworUE5HLkwyLjM2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzgJCToJCTIJCToJCTkzMworUE5HLkwyLjM5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDEJCToJCTIJCToJCTkzMworUE5HLkwyLjQyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDQJCToJCTIJCToJCTkzMworUE5HLkwyLjQ1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDcJCToJCTIJCToJCTkzMworUE5HLkwyLjQ4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNTAJCToJCTIJCToJCTkzMworUE5HLkwyLjUxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi41MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNTMJCToJCTIJCToJCTkzMworUE5HLkwyLjU0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi41NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNTYJCToJCTIJCToJCTkzMworUE5HLkwyLjU3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi41OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNTkJCToJCTIJCToJCTkzMworUE5HLkwyLjYwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi42MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNjIJCToJCTIJCToJCTkzMworUE5HLkwyLjYzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi42NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNjUJCToJCTIJCToJCTkzMworUE5HLkwyLjY2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi42NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNjgJCToJCTIJCToJCTkzMworUE5HLkwyLjY5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi43MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNzEJCToJCTIJCToJCTkzMworUE5HLkwyLjcyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi43MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNzQJCToJCTIJCToJCTkzMworUE5HLkwyLjc1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi43NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNzcJCToJCTIJCToJCTkzMworUE5HLkwyLjc4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi43OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuODAJCToJCTIJCToJCTkzMworUE5HLkwyLjgxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi44MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuODMJCToJCTIJCToJCTkzMworUE5HLkwyLjg0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi44NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuODYJCToJCTIJCToJCTkzMworUE5HLkwyLjg3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi44OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuODkJCToJCTIJCToJCTkzMworUE5HLkwyLjkwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi45MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuOTIJCToJCTIJCToJCTkzMworUE5HLkwyLjkzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi45NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuOTUJCToJCTIJCToJCTkzMworUE5HLkwyLjk2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi45NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuOTgJCToJCTIJCToJCTkzMworUE5HLkwyLjk5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMDAJCToJCTIJCToJCTkzMworUE5HLkwyLjEwMQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTAyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMDMJCToJCTIJCToJCTkzMworUE5HLkwyLjEwNAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTA1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMDYJCToJCTIJCToJCTkzMworUE5HLkwyLjEwNwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTA4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMDkJCToJCTIJCToJCTkzMworUE5HLkwyLjExMAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTExCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMTIJCToJCTIJCToJCTkzMworUE5HLkwyLjExMwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTE0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMTUJCToJCTIJCToJCTkzMworUE5HLkwyLjExNgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTE3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMTgJCToJCTIJCToJCTkzMworUE5HLkwyLjExOQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTIwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMjEJCToJCTIJCToJCTkzMworUE5HLkwyLjEyMgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTIzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMjQJCToJCTIJCToJCTkzMworUE5HLkwyLjEyNQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTI2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMjcJCToJCTIJCToJCTkzMworUE5HLkwyLjEyOAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTI5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMzAJCToJCTIJCToJCTkzMworUE5HLkwyLjEzMQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTMyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMzMJCToJCTIJCToJCTkzMworUE5HLkwyLjEzNAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTM1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMzYJCToJCTIJCToJCTkzMworUE5HLkwyLjEzNwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTM4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xMzkJCToJCTIJCToJCTkzMworUE5HLkwyLjE0MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTQxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNDIJCToJCTIJCToJCTkzMworUE5HLkwyLjE0MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTQ0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNDUJCToJCTIJCToJCTkzMworUE5HLkwyLjE0NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTQ3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNDgJCToJCTIJCToJCTkzMworUE5HLkwyLjE0OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTUwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNTEJCToJCTIJCToJCTkzMworUE5HLkwyLjE1MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTUzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNTQJCToJCTIJCToJCTkzMworUE5HLkwyLjE1NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTU2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNTcJCToJCTIJCToJCTkzMworUE5HLkwyLjE1OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTU5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNjAJCToJCTIJCToJCTkzMworUE5HLkwyLjE2MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTYyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNjMJCToJCTIJCToJCTkzMworUE5HLkwyLjE2NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTY1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNjYJCToJCTIJCToJCTkzMworUE5HLkwyLjE2NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTY4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNjkJCToJCTIJCToJCTkzMworUE5HLkwyLjE3MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTcxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNzIJCToJCTIJCToJCTkzMworUE5HLkwyLjE3MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTc0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNzUJCToJCTIJCToJCTkzMworUE5HLkwyLjE3NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTc3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xNzgJCToJCTIJCToJCTkzMworUE5HLkwyLjE3OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTgwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xODEJCToJCTIJCToJCTkzMworUE5HLkwyLjE4MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTgzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xODQJCToJCTIJCToJCTkzMworUE5HLkwyLjE4NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTg2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xODcJCToJCTIJCToJCTkzMworUE5HLkwyLjE4OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTg5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xOTAJCToJCTIJCToJCTkzMworUE5HLkwyLjE5MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTkyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xOTMJCToJCTIJCToJCTkzMworUE5HLkwyLjE5NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTk1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xOTYJCToJCTIJCToJCTkzMworUE5HLkwyLjE5NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMTk4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4xOTkJCToJCTIJCToJCTkzMworUE5HLkwyLjIwMAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjAxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMDIJCToJCTIJCToJCTkzMworUE5HLkwyLjIwMwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjA0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMDUJCToJCTIJCToJCTkzMworUE5HLkwyLjIwNgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjA3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMDgJCToJCTIJCToJCTkzMworUE5HLkwyLjIwOQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjEwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMTEJCToJCTIJCToJCTkzMworUE5HLkwyLjIxMgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjEzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMTQJCToJCTIJCToJCTkzMworUE5HLkwyLjIxNQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjE2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMTcJCToJCTIJCToJCTkzMworUE5HLkwyLjIxOAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjE5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMjAJCToJCTIJCToJCTkzMworUE5HLkwyLjIyMQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjIyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMjMJCToJCTIJCToJCTkzMworUE5HLkwyLjIyNAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjI1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMjYJCToJCTIJCToJCTkzMworUE5HLkwyLjIyNwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjI4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMjkJCToJCTIJCToJCTkzMworUE5HLkwyLjIzMAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjMxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMzIJCToJCTIJCToJCTkzMworUE5HLkwyLjIzMwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjM0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMzUJCToJCTIJCToJCTkzMworUE5HLkwyLjIzNgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjM3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yMzgJCToJCTIJCToJCTkzMworUE5HLkwyLjIzOQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjQwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNDEJCToJCTIJCToJCTkzMworUE5HLkwyLjI0MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjQzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNDQJCToJCTIJCToJCTkzMworUE5HLkwyLjI0NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjQ2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNDcJCToJCTIJCToJCTkzMworUE5HLkwyLjI0OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjQ5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNTAJCToJCTIJCToJCTkzMworUE5HLkwyLjI1MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjUyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNTMJCToJCTIJCToJCTkzMworUE5HLkwyLjI1NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjU1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNTYJCToJCTIJCToJCTkzMworUE5HLkwyLjI1NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjU4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNTkJCToJCTIJCToJCTkzMworUE5HLkwyLjI2MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjYxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNjIJCToJCTIJCToJCTkzMworUE5HLkwyLjI2MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjY0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNjUJCToJCTIJCToJCTkzMworUE5HLkwyLjI2NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjY3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNjgJCToJCTIJCToJCTkzMworUE5HLkwyLjI2OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjcwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNzEJCToJCTIJCToJCTkzMworUE5HLkwyLjI3MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjczCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNzQJCToJCTIJCToJCTkzMworUE5HLkwyLjI3NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjc2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yNzcJCToJCTIJCToJCTkzMworUE5HLkwyLjI3OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjc5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yODAJCToJCTIJCToJCTkzMworUE5HLkwyLjI4MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjgyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yODMJCToJCTIJCToJCTkzMworUE5HLkwyLjI4NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjg1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yODYJCToJCTIJCToJCTkzMworUE5HLkwyLjI4NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjg4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yODkJCToJCTIJCToJCTkzMworUE5HLkwyLjI5MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjkxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yOTIJCToJCTIJCToJCTkzMworUE5HLkwyLjI5MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjk0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yOTUJCToJCTIJCToJCTkzMworUE5HLkwyLjI5NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMjk3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4yOTgJCToJCTIJCToJCTkzMworUE5HLkwyLjI5OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzAwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMDEJCToJCTIJCToJCTkzMworUE5HLkwyLjMwMgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzAzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMDQJCToJCTIJCToJCTkzMworUE5HLkwyLjMwNQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzA2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMDcJCToJCTIJCToJCTkzMworUE5HLkwyLjMwOAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzA5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMTAJCToJCTIJCToJCTkzMworUE5HLkwyLjMxMQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzEyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMTMJCToJCTIJCToJCTkzMworUE5HLkwyLjMxNAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzE1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMTYJCToJCTIJCToJCTkzMworUE5HLkwyLjMxNwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzE4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMTkJCToJCTIJCToJCTkzMworUE5HLkwyLjMyMAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzIxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMjIJCToJCTIJCToJCTkzMworUE5HLkwyLjMyMwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzI0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMjUJCToJCTIJCToJCTkzMworUE5HLkwyLjMyNgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzI3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMjgJCToJCTIJCToJCTkzMworUE5HLkwyLjMyOQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzMwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMzEJCToJCTIJCToJCTkzMworUE5HLkwyLjMzMgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzMzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMzQJCToJCTIJCToJCTkzMworUE5HLkwyLjMzNQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzM2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zMzcJCToJCTIJCToJCTkzMworUE5HLkwyLjMzOAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzM5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNDAJCToJCTIJCToJCTkzMworUE5HLkwyLjM0MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzQyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNDMJCToJCTIJCToJCTkzMworUE5HLkwyLjM0NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzQ1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNDYJCToJCTIJCToJCTkzMworUE5HLkwyLjM0NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzQ4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNDkJCToJCTIJCToJCTkzMworUE5HLkwyLjM1MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzUxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNTIJCToJCTIJCToJCTkzMworUE5HLkwyLjM1MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzU0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNTUJCToJCTIJCToJCTkzMworUE5HLkwyLjM1NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzU3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNTgJCToJCTIJCToJCTkzMworUE5HLkwyLjM1OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzYwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNjEJCToJCTIJCToJCTkzMworUE5HLkwyLjM2MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzYzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNjQJCToJCTIJCToJCTkzMworUE5HLkwyLjM2NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzY2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNjcJCToJCTIJCToJCTkzMworUE5HLkwyLjM2OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzY5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNzAJCToJCTIJCToJCTkzMworUE5HLkwyLjM3MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzcyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNzMJCToJCTIJCToJCTkzMworUE5HLkwyLjM3NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzc1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNzYJCToJCTIJCToJCTkzMworUE5HLkwyLjM3NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzc4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zNzkJCToJCTIJCToJCTkzMworUE5HLkwyLjM4MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzgxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zODIJCToJCTIJCToJCTkzMworUE5HLkwyLjM4MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzg0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zODUJCToJCTIJCToJCTkzMworUE5HLkwyLjM4NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzg3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zODgJCToJCTIJCToJCTkzMworUE5HLkwyLjM4OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzkwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zOTEJCToJCTIJCToJCTkzMworUE5HLkwyLjM5MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzkzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zOTQJCToJCTIJCToJCTkzMworUE5HLkwyLjM5NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzk2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi4zOTcJCToJCTIJCToJCTkzMworUE5HLkwyLjM5OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuMzk5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MDAJCToJCTIJCToJCTkzMworUE5HLkwyLjQwMQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDAyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MDMJCToJCTIJCToJCTkzMworUE5HLkwyLjQwNAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDA1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MDYJCToJCTIJCToJCTkzMworUE5HLkwyLjQwNwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDA4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MDkJCToJCTIJCToJCTkzMworUE5HLkwyLjQxMAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDExCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MTIJCToJCTIJCToJCTkzMworUE5HLkwyLjQxMwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDE0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MTUJCToJCTIJCToJCTkzMworUE5HLkwyLjQxNgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDE3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MTgJCToJCTIJCToJCTkzMworUE5HLkwyLjQxOQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDIwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MjEJCToJCTIJCToJCTkzMworUE5HLkwyLjQyMgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDIzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MjQJCToJCTIJCToJCTkzMworUE5HLkwyLjQyNQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDI2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MjcJCToJCTIJCToJCTkzMworUE5HLkwyLjQyOAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDI5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MzAJCToJCTIJCToJCTkzMworUE5HLkwyLjQzMQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDMyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MzMJCToJCTIJCToJCTkzMworUE5HLkwyLjQzNAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDM1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MzYJCToJCTIJCToJCTkzMworUE5HLkwyLjQzNwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDM4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40MzkJCToJCTIJCToJCTkzMworUE5HLkwyLjQ0MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDQxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NDIJCToJCTIJCToJCTkzMworUE5HLkwyLjQ0MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDQ0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NDUJCToJCTIJCToJCTkzMworUE5HLkwyLjQ0NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDQ3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NDgJCToJCTIJCToJCTkzMworUE5HLkwyLjQ0OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDUwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NTEJCToJCTIJCToJCTkzMworUE5HLkwyLjQ1MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDUzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NTQJCToJCTIJCToJCTkzMworUE5HLkwyLjQ1NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDU2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NTcJCToJCTIJCToJCTkzMworUE5HLkwyLjQ1OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDU5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NjAJCToJCTIJCToJCTkzMworUE5HLkwyLjQ2MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDYyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NjMJCToJCTIJCToJCTkzMworUE5HLkwyLjQ2NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDY1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NjYJCToJCTIJCToJCTkzMworUE5HLkwyLjQ2NwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDY4CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NjkJCToJCTIJCToJCTkzMworUE5HLkwyLjQ3MAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDcxCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NzIJCToJCTIJCToJCTkzMworUE5HLkwyLjQ3MwkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDc0CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NzUJCToJCTIJCToJCTkzMworUE5HLkwyLjQ3NgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDc3CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40NzgJCToJCTIJCToJCTkzMworUE5HLkwyLjQ3OQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDgwCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40ODEJCToJCTIJCToJCTkzMworUE5HLkwyLjQ4MgkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDgzCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40ODQJCToJCTIJCToJCTkzMworUE5HLkwyLjQ4NQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDg2CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40ODcJCToJCTIJCToJCTkzMworUE5HLkwyLjQ4OAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDg5CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40OTAJCToJCTIJCToJCTkzMworUE5HLkwyLjQ5MQkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDkyCQk6CQkyCQk6CQk5MzMKK1BORy5MMi40OTMJCToJCTIJCToJCTkzMworUE5HLkwyLjQ5NAkJOgkJMgkJOgkJOTMzCitQTkcuTDIuNDk1CQk6CQkyCQk6CQk5MzMKK1BORy5MMi40OTYJCToJCTIJCToJCTkzMworQ2VudHJhbCAgCToJMQk6CTI5NTAwCitTaW1idSAJOgkxCToJNjEwMAorRWFzdCBOZXcgQnJpdGFpbiAJOgkxCToJMTU1MDAKK0Vhc3QgU2VwaWsgCToJMQk6CTQyODAwCitFYXN0ZXJuIEhpZ2hsYW5kcyAJOgkxCToJMTEyMDAKK0VuZ2EgCToJMQk6CTEyODAwCitHdWxmIAk6CTEJOgkzNDUwMAorTWFkYW5nIAk6CTEJOgkyOTAwMAorTWFudXMgCToJMQk6CTIxMDAKK01pbG5lIEJheSAJOgkxCToJMTQwMDAKK01vcm9iZSAJOgkxCToJMzQ1MDAKK05hdGlvbmFsIENhcGl0YWwgRGlzdHJpY3QgCToJMQk6CTI0MAorTmV3IElyZWxhbmQgCToJMQk6CTk2MDAKK05vcnRoIFNvbG9tb25zIAk6CTEJOgk5MzAwCitPcm8gKE5vcnRoZXJuKSAJOgkxCToJMjI4MDAKK1NvdXRoZXJuIEhpZ2hsYW5kcyAJOgkxCToJMjM4MDAKK1dlc3QgTmV3IEJyaXRhaW4gCToJMQk6CTIxMDAwCitXZXN0IFNlcGlrIAk6CTEJOgkzNjMwMAorV2VzdGVybiAJOgkxCToJOTkzMDAKK1dlc3Rlcm4gSGlnaGxhbmRzIAk6CTEJOgk4NTAwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEFQVUFORVdHVUlORUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEFQVUFORVdHVUlORUFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5ODk3MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9QQVBVQU5FV0dVSU5FQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDEwMTMgQEAKK1BhcHVhIE5ldyBHdWluZWEJOgkwCToJNTY3MDU0NAorUEctVU5LLTEJOgkxCToJMTE4NjkKK1BHLVVOSy0yCToJMQk6CTExODY5CitQRy1VTkstMwk6CTEJOgkxMTg2OQorUEctVU5LLTQJOgkxCToJMTE4NjkKK1BHLVVOSy01CToJMQk6CTExODY5CitQRy1VTkstNgk6CTEJOgkxMTg2OQorUEctVU5LLTcJOgkxCToJMTE4NjkKK1BHLVVOSy04CToJMQk6CTExODY5CitQRy1VTkstOQk6CTEJOgkxMTg2OQorUEctVU5LLTEwCToJMQk6CTExODY5CitQRy1VTkstMTEJOgkxCToJMTE4NjkKK1BHLVVOSy0xMgk6CTEJOgkxMTg2OQorUEctVU5LLTEzCToJMQk6CTExODY5CitQRy1VTkstMTQJOgkxCToJMTE4NjkKK1BHLVVOSy0xNQk6CTEJOgkxMTg2OQorUEctVU5LLTE2CToJMQk6CTExODY5CitQRy1VTkstMTcJOgkxCToJMTE4NjkKK1BHLVVOSy0xOAk6CTEJOgkxMTg2OQorUEctVU5LLTE5CToJMQk6CTExODY5CitQRy1VTkstMjAJOgkxCToJMTE4NjkKK1BHLVVOSy0yMQk6CTEJOgkxMTg2OQorUEctVU5LLTIyCToJMQk6CTExODY5CitQRy1VTkstMjMJOgkxCToJMTE4NjkKK1BHLVVOSy0yNAk6CTEJOgkxMTg2OQorUEctVU5LLTI1CToJMQk6CTExODY5CitQRy1VTkstMjYJOgkxCToJMTE4NjkKK1BHLVVOSy0yNwk6CTEJOgkxMTg2OQorUEctVU5LLTI4CToJMQk6CTExODY5CitQRy1VTkstMjkJOgkxCToJMTE4NjkKK1BHLVVOSy0zMAk6CTEJOgkxMTg2OQorUEctVU5LLTMxCToJMQk6CTExODY5CitQRy1VTkstMzIJOgkxCToJMTE4NjkKK1BHLVVOSy0zMwk6CTEJOgkxMTg2OQorUEctVU5LLTM0CToJMQk6CTExODY5CitQRy1VTkstMzUJOgkxCToJMTE4NjkKK1BHLVVOSy0zNgk6CTEJOgkxMTg2OQorUEctVU5LLTM3CToJMQk6CTExODY5CitQRy1VTkstMzgJOgkxCToJMTE4NjkKK1BHLVVOSy0zOQk6CTEJOgkxMTg2OQorUEctVU5LLTQwCToJMQk6CTExODY5CitQRy1VTkstNDEJOgkxCToJMTE4NjkKK1BHLVVOSy00Mgk6CTEJOgkxMTg2OQorUEctVU5LLTQzCToJMQk6CTExODY5CitQRy1VTkstNDQJOgkxCToJMTE4NjkKK1BHLVVOSy00NQk6CTEJOgkxMTg2OQorUEctVU5LLTQ2CToJMQk6CTExODY5CitQRy1VTkstNDcJOgkxCToJMTE4NjkKK1BHLVVOSy00OAk6CTEJOgkxMTg2OQorUEctVU5LLTQ5CToJMQk6CTExODY5CitQRy1VTkstNTAJOgkxCToJMTE4NjkKK1BHLVVOSy01MQk6CTEJOgkxMTg2OQorUEctVU5LLTUyCToJMQk6CTExODY5CitQRy1VTkstNTMJOgkxCToJMTE4NjkKK1BHLVVOSy01NAk6CTEJOgkxMTg2OQorUEctVU5LLTU1CToJMQk6CTExODY5CitQRy1VTkstNTYJOgkxCToJMTE4NjkKK1BHLVVOSy01Nwk6CTEJOgkxMTg2OQorUEctVU5LLTU4CToJMQk6CTExODY5CitQRy1VTkstNTkJOgkxCToJMTE4NjkKK1BHLVVOSy02MAk6CTEJOgkxMTg2OQorUEctVU5LLTYxCToJMQk6CTExODY5CitQRy1VTkstNjIJOgkxCToJMTE4NjkKK1BHLVVOSy02Mwk6CTEJOgkxMTg2OQorUEctVU5LLTY0CToJMQk6CTExODY5CitQRy1VTkstNjUJOgkxCToJMTE4NjkKK1BHLVVOSy02Ngk6CTEJOgkxMTg2OQorUEctVU5LLTY3CToJMQk6CTExODY5CitQRy1VTkstNjgJOgkxCToJMTE4NjkKK1BHLVVOSy02OQk6CTEJOgkxMTg2OQorUEctVU5LLTcwCToJMQk6CTExODY5CitQRy1VTkstNzEJOgkxCToJMTE4NjkKK1BHLVVOSy03Mgk6CTEJOgkxMTg2OQorUEctVU5LLTczCToJMQk6CTExODY5CitQRy1VTkstNzQJOgkxCToJMTE4NjkKK1BHLVVOSy03NQk6CTEJOgkxMTg2OQorUEctVU5LLTc2CToJMQk6CTExODY5CitQRy1VTkstNzcJOgkxCToJMTE4NjkKK1BHLVVOSy03OAk6CTEJOgkxMTg2OQorUEctVU5LLTc5CToJMQk6CTExODY5CitQRy1VTkstODAJOgkxCToJMTE4NjkKK1BHLVVOSy04MQk6CTEJOgkxMTg2OQorUEctVU5LLTgyCToJMQk6CTExODY5CitQRy1VTkstODMJOgkxCToJMTE4NjkKK1BHLVVOSy04NAk6CTEJOgkxMTg2OQorUEctVU5LLTg1CToJMQk6CTExODY5CitQRy1VTkstODYJOgkxCToJMTE4NjkKK1BHLVVOSy04Nwk6CTEJOgkxMTg2OQorUEctVU5LLTg4CToJMQk6CTExODY5CitQRy1VTkstODkJOgkxCToJMTE4NjkKK1BHLVVOSy05MAk6CTEJOgkxMTg2OQorUEctVU5LLTkxCToJMQk6CTExODY5CitQRy1VTkstOTIJOgkxCToJMTE4NjkKK1BHLVVOSy05Mwk6CTEJOgkxMTg2OQorUEctVU5LLTk0CToJMQk6CTExODY5CitQRy1VTkstOTUJOgkxCToJMTE4NjkKK1BHLVVOSy05Ngk6CTEJOgkxMTg2OQorUEctVU5LLTk3CToJMQk6CTExODY5CitQRy1VTkstOTgJOgkxCToJMTE4NjkKK1BHLVVOSy05OQk6CTEJOgkxMTg2OQorUEctVU5LLTEwMAk6CTEJOgkxMTg2OQorUEctVU5LLTEwMQk6CTEJOgkxMTg2OQorUEctVU5LLTEwMgk6CTEJOgkxMTg2OQorUEctVU5LLTEwMwk6CTEJOgkxMTg2OQorUEctVU5LLTEwNAk6CTEJOgkxMTg2OQorUEctVU5LLTEwNQk6CTEJOgkxMTg2OQorUEctVU5LLTEwNgk6CTEJOgkxMTg2OQorUEctVU5LLTEwNwk6CTEJOgkxMTg2OQorUEctVU5LLTEwOAk6CTEJOgkxMTg2OQorUEctVU5LLTEwOQk6CTEJOgkxMTg2OQorUEctVU5LLTExMAk6CTEJOgkxMTg2OQorUEctVU5LLTExMQk6CTEJOgkxMTg2OQorUEctVU5LLTExMgk6CTEJOgkxMTg2OQorUEctVU5LLTExMwk6CTEJOgkxMTg2OQorUEctVU5LLTExNAk6CTEJOgkxMTg2OQorUEctVU5LLTExNQk6CTEJOgkxMTg2OQorUEctVU5LLTExNgk6CTEJOgkxMTg2OQorUEctVU5LLTExNwk6CTEJOgkxMTg2OQorUEctVU5LLTExOAk6CTEJOgkxMTg2OQorUEctVU5LLTExOQk6CTEJOgkxMTg2OQorUEctVU5LLTEyMAk6CTEJOgkxMTg2OQorUEctVU5LLTEyMQk6CTEJOgkxMTg2OQorUEctVU5LLTEyMgk6CTEJOgkxMTg2OQorUEctVU5LLTEyMwk6CTEJOgkxMTg2OQorUEctVU5LLTEyNAk6CTEJOgkxMTg2OQorUEctVU5LLTEyNQk6CTEJOgkxMTg2OQorUEctVU5LLTEyNgk6CTEJOgkxMTg2OQorUEctVU5LLTEyNwk6CTEJOgkxMTg2OQorUEctVU5LLTEyOAk6CTEJOgkxMTg2OQorUEctVU5LLTEyOQk6CTEJOgkxMTg2OQorUEctVU5LLTEzMAk6CTEJOgkxMTg2OQorUEctVU5LLTEzMQk6CTEJOgkxMTg2OQorUEctVU5LLTEzMgk6CTEJOgkxMTg2OQorUEctVU5LLTEzMwk6CTEJOgkxMTg2OQorUEctVU5LLTEzNAk6CTEJOgkxMTg2OQorUEctVU5LLTEzNQk6CTEJOgkxMTg2OQorUEctVU5LLTEzNgk6CTEJOgkxMTg2OQorUEctVU5LLTEzNwk6CTEJOgkxMTg2OQorUEctVU5LLTEzOAk6CTEJOgkxMTg2OQorUEctVU5LLTEzOQk6CTEJOgkxMTg2OQorUEctVU5LLTE0MAk6CTEJOgkxMTg2OQorUEctVU5LLTE0MQk6CTEJOgkxMTg2OQorUEctVU5LLTE0Mgk6CTEJOgkxMTg2OQorUEctVU5LLTE0Mwk6CTEJOgkxMTg2OQorUEctVU5LLTE0NAk6CTEJOgkxMTg2OQorUEctVU5LLTE0NQk6CTEJOgkxMTg2OQorUEctVU5LLTE0Ngk6CTEJOgkxMTg2OQorUEctVU5LLTE0Nwk6CTEJOgkxMTg2OQorUEctVU5LLTE0OAk6CTEJOgkxMTg2OQorUEctVU5LLTE0OQk6CTEJOgkxMTg2OQorUEctVU5LLTE1MAk6CTEJOgkxMTg2OQorUEctVU5LLTE1MQk6CTEJOgkxMTg2OQorUEctVU5LLTE1Mgk6CTEJOgkxMTg2OQorUEctVU5LLTE1Mwk6CTEJOgkxMTg2OQorUEctVU5LLTE1NAk6CTEJOgkxMTg2OQorUEctVU5LLTE1NQk6CTEJOgkxMTg2OQorUEctVU5LLTE1Ngk6CTEJOgkxMTg2OQorUEctVU5LLTE1Nwk6CTEJOgkxMTg2OQorUEctVU5LLTE1OAk6CTEJOgkxMTg2OQorUEctVU5LLTE1OQk6CTEJOgkxMTg2OQorUEctVU5LLTE2MAk6CTEJOgkxMTg2OQorUEctVU5LLTE2MQk6CTEJOgkxMTg2OQorUEctVU5LLTE2Mgk6CTEJOgkxMTg2OQorUEctVU5LLTE2Mwk6CTEJOgkxMTg2OQorUEctVU5LLTE2NAk6CTEJOgkxMTg2OQorUEctVU5LLTE2NQk6CTEJOgkxMTg2OQorUEctVU5LLTE2Ngk6CTEJOgkxMTg2OQorUEctVU5LLTE2Nwk6CTEJOgkxMTg2OQorUEctVU5LLTE2OAk6CTEJOgkxMTg2OQorUEctVU5LLTE2OQk6CTEJOgkxMTg2OQorUEctVU5LLTE3MAk6CTEJOgkxMTg2OQorUEctVU5LLTE3MQk6CTEJOgkxMTg2OQorUEctVU5LLTE3Mgk6CTEJOgkxMTg2OQorUEctVU5LLTE3Mwk6CTEJOgkxMTg2OQorUEctVU5LLTE3NAk6CTEJOgkxMTg2OQorUEctVU5LLTE3NQk6CTEJOgkxMTg2OQorUEctVU5LLTE3Ngk6CTEJOgkxMTg2OQorUEctVU5LLTE3Nwk6CTEJOgkxMTg2OQorUEctVU5LLTE3OAk6CTEJOgkxMTg2OQorUEctVU5LLTE3OQk6CTEJOgkxMTg2OQorUEctVU5LLTE4MAk6CTEJOgkxMTg2OQorUEctVU5LLTE4MQk6CTEJOgkxMTg2OQorUEctVU5LLTE4Mgk6CTEJOgkxMTg2OQorUEctVU5LLTE4Mwk6CTEJOgkxMTg2OQorUEctVU5LLTE4NAk6CTEJOgkxMTg2OQorUEctVU5LLTE4NQk6CTEJOgkxMTg2OQorUEctVU5LLTE4Ngk6CTEJOgkxMTg2OQorUEctVU5LLTE4Nwk6CTEJOgkxMTg2OQorUEctVU5LLTE4OAk6CTEJOgkxMTg2OQorUEctVU5LLTE4OQk6CTEJOgkxMTg2OQorUEctVU5LLTE5MAk6CTEJOgkxMTg2OQorUEctVU5LLTE5MQk6CTEJOgkxMTg2OQorUEctVU5LLTE5Mgk6CTEJOgkxMTg2OQorUEctVU5LLTE5Mwk6CTEJOgkxMTg2OQorUEctVU5LLTE5NAk6CTEJOgkxMTg2OQorUEctVU5LLTE5NQk6CTEJOgkxMTg2OQorUEctVU5LLTE5Ngk6CTEJOgkxMTg2OQorUEctVU5LLTE5Nwk6CTEJOgkxMTg2OQorUEctVU5LLTE5OAk6CTEJOgkxMTg2OQorUEctVU5LLTE5OQk6CTEJOgkxMTg2OQorUEctVU5LLTIwMAk6CTEJOgkxMTg2OQorUEctVU5LLTIwMQk6CTEJOgkxMTg2OQorUEctVU5LLTIwMgk6CTEJOgkxMTg2OQorUEctVU5LLTIwMwk6CTEJOgkxMTg2OQorUEctVU5LLTIwNAk6CTEJOgkxMTg2OQorUEctVU5LLTIwNQk6CTEJOgkxMTg2OQorUEctVU5LLTIwNgk6CTEJOgkxMTg2OQorUEctVU5LLTIwNwk6CTEJOgkxMTg2OQorUEctVU5LLTIwOAk6CTEJOgkxMTg2OQorUEctVU5LLTIwOQk6CTEJOgkxMTg2OQorUEctVU5LLTIxMAk6CTEJOgkxMTg2OQorUEctVU5LLTIxMQk6CTEJOgkxMTg2OQorUEctVU5LLTIxMgk6CTEJOgkxMTg2OQorUEctVU5LLTIxMwk6CTEJOgkxMTg2OQorUEctVU5LLTIxNAk6CTEJOgkxMTg2OQorUEctVU5LLTIxNQk6CTEJOgkxMTg2OQorUEctVU5LLTIxNgk6CTEJOgkxMTg2OQorUEctVU5LLTIxNwk6CTEJOgkxMTg2OQorUEctVU5LLTIxOAk6CTEJOgkxMTg2OQorUEctVU5LLTIxOQk6CTEJOgkxMTg2OQorUEctVU5LLTIyMAk6CTEJOgkxMTg2OQorUEctVU5LLTIyMQk6CTEJOgkxMTg2OQorUEctVU5LLTIyMgk6CTEJOgkxMTg2OQorUEctVU5LLTIyMwk6CTEJOgkxMTg2OQorUEctVU5LLTIyNAk6CTEJOgkxMTg2OQorUEctVU5LLTIyNQk6CTEJOgkxMTg2OQorUEctVU5LLTIyNgk6CTEJOgkxMTg2OQorUEctVU5LLTIyNwk6CTEJOgkxMTg2OQorUEctVU5LLTIyOAk6CTEJOgkxMTg2OQorUEctVU5LLTIyOQk6CTEJOgkxMTg2OQorUEctVU5LLTIzMAk6CTEJOgkxMTg2OQorUEctVU5LLTIzMQk6CTEJOgkxMTg2OQorUEctVU5LLTIzMgk6CTEJOgkxMTg2OQorUEctVU5LLTIzMwk6CTEJOgkxMTg2OQorUEctVU5LLTIzNAk6CTEJOgkxMTg2OQorUEctVU5LLTIzNQk6CTEJOgkxMTg2OQorUEctVU5LLTIzNgk6CTEJOgkxMTg2OQorUEctVU5LLTIzNwk6CTEJOgkxMTg2OQorUEctVU5LLTIzOAk6CTEJOgkxMTg2OQorUEctVU5LLTIzOQk6CTEJOgkxMTg2OQorUEctVU5LLTI0MAk6CTEJOgkxMTg2OQorUEctVU5LLTI0MQk6CTEJOgkxMTg2OQorUEctVU5LLTI0Mgk6CTEJOgkxMTg2OQorUEctVU5LLTI0Mwk6CTEJOgkxMTg2OQorUEctVU5LLTI0NAk6CTEJOgkxMTg2OQorUEctVU5LLTI0NQk6CTEJOgkxMTg2OQorUEctVU5LLTI0Ngk6CTEJOgkxMTg2OQorUEctVU5LLTI0Nwk6CTEJOgkxMTg2OQorUEctVU5LLTI0OAk6CTEJOgkxMTg2OQorUEctVU5LLTI0OQk6CTEJOgkxMTg2OQorUEctVU5LLTI1MAk6CTEJOgkxMTg2OQorUEctVU5LLTI1MQk6CTEJOgkxMTg2OQorUEctVU5LLTI1Mgk6CTEJOgkxMTg2OQorUEctVU5LLTI1Mwk6CTEJOgkxMTg2OQorUEctVU5LLTI1NAk6CTEJOgkxMTg2OQorUEctVU5LLTI1NQk6CTEJOgkxMTg2OQorUEctVU5LLTI1Ngk6CTEJOgkxMTg2OQorUEctVU5LLTI1Nwk6CTEJOgkxMTg2OQorUEctVU5LLTI1OAk6CTEJOgkxMTg2OQorUEctVU5LLTI1OQk6CTEJOgkxMTg2OQorUEctVU5LLTI2MAk6CTEJOgkxMTg2OQorUEctVU5LLTI2MQk6CTEJOgkxMTg2OQorUEctVU5LLTI2Mgk6CTEJOgkxMTg2OQorUEctVU5LLTI2Mwk6CTEJOgkxMTg2OQorUEctVU5LLTI2NAk6CTEJOgkxMTg2OQorUEctVU5LLTI2NQk6CTEJOgkxMTg2OQorUEctVU5LLTI2Ngk6CTEJOgkxMTg2OQorUEctVU5LLTI2Nwk6CTEJOgkxMTg2OQorUEctVU5LLTI2OAk6CTEJOgkxMTg2OQorUEctVU5LLTI2OQk6CTEJOgkxMTg2OQorUEctVU5LLTI3MAk6CTEJOgkxMTg2OQorUEctVU5LLTI3MQk6CTEJOgkxMTg2OQorUEctVU5LLTI3Mgk6CTEJOgkxMTg2OQorUEctVU5LLTI3Mwk6CTEJOgkxMTg2OQorUEctVU5LLTI3NAk6CTEJOgkxMTg2OQorUEctVU5LLTI3NQk6CTEJOgkxMTg2OQorUEctVU5LLTI3Ngk6CTEJOgkxMTg2OQorUEctVU5LLTI3Nwk6CTEJOgkxMTg2OQorUEctVU5LLTI3OAk6CTEJOgkxMTg2OQorUEctVU5LLTI3OQk6CTEJOgkxMTg2OQorUEctVU5LLTI4MAk6CTEJOgkxMTg2OQorUEctVU5LLTI4MQk6CTEJOgkxMTg2OQorUEctVU5LLTI4Mgk6CTEJOgkxMTg2OQorUEctVU5LLTI4Mwk6CTEJOgkxMTg2OQorUEctVU5LLTI4NAk6CTEJOgkxMTg2OQorUEctVU5LLTI4NQk6CTEJOgkxMTg2OQorUEctVU5LLTI4Ngk6CTEJOgkxMTg2OQorUEctVU5LLTI4Nwk6CTEJOgkxMTg2OQorUEctVU5LLTI4OAk6CTEJOgkxMTg2OQorUEctVU5LLTI4OQk6CTEJOgkxMTg2OQorUEctVU5LLTI5MAk6CTEJOgkxMTg2OQorUEctVU5LLTI5MQk6CTEJOgkxMTg2OQorUEctVU5LLTI5Mgk6CTEJOgkxMTg2OQorUEctVU5LLTI5Mwk6CTEJOgkxMTg2OQorUEctVU5LLTI5NAk6CTEJOgkxMTg2OQorUEctVU5LLTI5NQk6CTEJOgkxMTg2OQorUEctVU5LLTI5Ngk6CTEJOgkxMTg2OQorUEctVU5LLTI5Nwk6CTEJOgkxMTg2OQorUEctVU5LLTI5OAk6CTEJOgkxMTg2OQorUEctVU5LLTI5OQk6CTEJOgkxMTg2OQorUEctVU5LLTMwMAk6CTEJOgkxMTg2OQorUEctVU5LLTMwMQk6CTEJOgkxMTg2OQorUEctVU5LLTMwMgk6CTEJOgkxMTg2OQorUEctVU5LLTMwMwk6CTEJOgkxMTg2OQorUEctVU5LLTMwNAk6CTEJOgkxMTg2OQorUEctVU5LLTMwNQk6CTEJOgkxMTg2OQorUEctVU5LLTMwNgk6CTEJOgkxMTg2OQorUEctVU5LLTMwNwk6CTEJOgkxMTg2OQorUEctVU5LLTMwOAk6CTEJOgkxMTg2OQorUEctVU5LLTMwOQk6CTEJOgkxMTg2OQorUEctVU5LLTMxMAk6CTEJOgkxMTg2OQorUEctVU5LLTMxMQk6CTEJOgkxMTg2OQorUEctVU5LLTMxMgk6CTEJOgkxMTg2OQorUEctVU5LLTMxMwk6CTEJOgkxMTg2OQorUEctVU5LLTMxNAk6CTEJOgkxMTg2OQorUEctVU5LLTMxNQk6CTEJOgkxMTg2OQorUEctVU5LLTMxNgk6CTEJOgkxMTg2OQorUEctVU5LLTMxNwk6CTEJOgkxMTg2OQorUEctVU5LLTMxOAk6CTEJOgkxMTg2OQorUEctVU5LLTMxOQk6CTEJOgkxMTg2OQorUEctVU5LLTMyMAk6CTEJOgkxMTg2OQorUEctVU5LLTMyMQk6CTEJOgkxMTg2OQorUEctVU5LLTMyMgk6CTEJOgkxMTg2OQorUEctVU5LLTMyMwk6CTEJOgkxMTg2OQorUEctVU5LLTMyNAk6CTEJOgkxMTg2OQorUEctVU5LLTMyNQk6CTEJOgkxMTg2OQorUEctVU5LLTMyNgk6CTEJOgkxMTg2OQorUEctVU5LLTMyNwk6CTEJOgkxMTg2OQorUEctVU5LLTMyOAk6CTEJOgkxMTg2OQorUEctVU5LLTMyOQk6CTEJOgkxMTg2OQorUEctVU5LLTMzMAk6CTEJOgkxMTg2OQorUEctVU5LLTMzMQk6CTEJOgkxMTg2OQorUEctVU5LLTMzMgk6CTEJOgkxMTg2OQorUEctVU5LLTMzMwk6CTEJOgkxMTg2OQorUEctVU5LLTMzNAk6CTEJOgkxMTg2OQorUEctVU5LLTMzNQk6CTEJOgkxMTg2OQorUEctVU5LLTMzNgk6CTEJOgkxMTg2OQorUEctVU5LLTMzNwk6CTEJOgkxMTg2OQorUEctVU5LLTMzOAk6CTEJOgkxMTg2OQorUEctVU5LLTMzOQk6CTEJOgkxMTg2OQorUEctVU5LLTM0MAk6CTEJOgkxMTg2OQorUEctVU5LLTM0MQk6CTEJOgkxMTg2OQorUEctVU5LLTM0Mgk6CTEJOgkxMTg2OQorUEctVU5LLTM0Mwk6CTEJOgkxMTg2OQorUEctVU5LLTM0NAk6CTEJOgkxMTg2OQorUEctVU5LLTM0NQk6CTEJOgkxMTg2OQorUEctVU5LLTM0Ngk6CTEJOgkxMTg2OQorUEctVU5LLTM0Nwk6CTEJOgkxMTg2OQorUEctVU5LLTM0OAk6CTEJOgkxMTg2OQorUEctVU5LLTM0OQk6CTEJOgkxMTg2OQorUEctVU5LLTM1MAk6CTEJOgkxMTg2OQorUEctVU5LLTM1MQk6CTEJOgkxMTg2OQorUEctVU5LLTM1Mgk6CTEJOgkxMTg2OQorUEctVU5LLTM1Mwk6CTEJOgkxMTg2OQorUEctVU5LLTM1NAk6CTEJOgkxMTg2OQorUEctVU5LLTM1NQk6CTEJOgkxMTg2OQorUEctVU5LLTM1Ngk6CTEJOgkxMTg2OQorUEctVU5LLTM1Nwk6CTEJOgkxMTg2OQorUEctVU5LLTM1OAk6CTEJOgkxMTg2OQorUEctVU5LLTM1OQk6CTEJOgkxMTg2OQorUEctVU5LLTM2MAk6CTEJOgkxMTg2OQorUEctVU5LLTM2MQk6CTEJOgkxMTg2OQorUEctVU5LLTM2Mgk6CTEJOgkxMTg2OQorUEctVU5LLTM2Mwk6CTEJOgkxMTg2OQorUEctVU5LLTM2NAk6CTEJOgkxMTg2OQorUEctVU5LLTM2NQk6CTEJOgkxMTg2OQorUEctVU5LLTM2Ngk6CTEJOgkxMTg2OQorUEctVU5LLTM2Nwk6CTEJOgkxMTg2OQorUEctVU5LLTM2OAk6CTEJOgkxMTg2OQorUEctVU5LLTM2OQk6CTEJOgkxMTg2OQorUEctVU5LLTM3MAk6CTEJOgkxMTg2OQorUEctVU5LLTM3MQk6CTEJOgkxMTg2OQorUEctVU5LLTM3Mgk6CTEJOgkxMTg2OQorUEctVU5LLTM3Mwk6CTEJOgkxMTg2OQorUEctVU5LLTM3NAk6CTEJOgkxMTg2OQorUEctVU5LLTM3NQk6CTEJOgkxMTg2OQorUEctVU5LLTM3Ngk6CTEJOgkxMTg2OQorUEctVU5LLTM3Nwk6CTEJOgkxMTg2OQorUEctVU5LLTM3OAk6CTEJOgkxMTg2OQorUEctVU5LLTM3OQk6CTEJOgkxMTg2OQorUEctVU5LLTM4MAk6CTEJOgkxMTg2OQorUEctVU5LLTM4MQk6CTEJOgkxMTg2OQorUEctVU5LLTM4Mgk6CTEJOgkxMTg2OQorUEctVU5LLTM4Mwk6CTEJOgkxMTg2OQorUEctVU5LLTM4NAk6CTEJOgkxMTg2OQorUEctVU5LLTM4NQk6CTEJOgkxMTg2OQorUEctVU5LLTM4Ngk6CTEJOgkxMTg2OQorUEctVU5LLTM4Nwk6CTEJOgkxMTg2OQorUEctVU5LLTM4OAk6CTEJOgkxMTg2OQorUEctVU5LLTM4OQk6CTEJOgkxMTg2OQorUEctVU5LLTM5MAk6CTEJOgkxMTg2OQorUEctVU5LLTM5MQk6CTEJOgkxMTg2OQorUEctVU5LLTM5Mgk6CTEJOgkxMTg2OQorUEctVU5LLTM5Mwk6CTEJOgkxMTg2OQorUEctVU5LLTM5NAk6CTEJOgkxMTg2OQorUEctVU5LLTM5NQk6CTEJOgkxMTg2OQorUEctVU5LLTM5Ngk6CTEJOgkxMTg2OQorUEctVU5LLTM5Nwk6CTEJOgkxMTg2OQorUEctVU5LLTM5OAk6CTEJOgkxMTg2OQorUEctVU5LLTM5OQk6CTEJOgkxMTg2OQorUEctVU5LLTQwMAk6CTEJOgkxMTg2OQorUEctVU5LLTQwMQk6CTEJOgkxMTg2OQorUEctVU5LLTQwMgk6CTEJOgkxMTg2OQorUEctVU5LLTQwMwk6CTEJOgkxMTg2OQorUEctVU5LLTQwNAk6CTEJOgkxMTg2OQorUEctVU5LLTQwNQk6CTEJOgkxMTg2OQorUEctVU5LLTQwNgk6CTEJOgkxMTg2OQorUEctVU5LLTQwNwk6CTEJOgkxMTg2OQorUEctVU5LLTQwOAk6CTEJOgkxMTg2OQorUEctVU5LLTQwOQk6CTEJOgkxMTg2OQorUEctVU5LLTQxMAk6CTEJOgkxMTg2OQorUEctVU5LLTQxMQk6CTEJOgkxMTg2OQorUEctVU5LLTQxMgk6CTEJOgkxMTg2OQorUEctVU5LLTQxMwk6CTEJOgkxMTg2OQorUEctVU5LLTQxNAk6CTEJOgkxMTg2OQorUEctVU5LLTQxNQk6CTEJOgkxMTg2OQorUEctVU5LLTQxNgk6CTEJOgkxMTg2OQorUEctVU5LLTQxNwk6CTEJOgkxMTg2OQorUEctVU5LLTQxOAk6CTEJOgkxMTg2OQorUEctVU5LLTQxOQk6CTEJOgkxMTg2OQorUEctVU5LLTQyMAk6CTEJOgkxMTg2OQorUEctVU5LLTQyMQk6CTEJOgkxMTg2OQorUEctVU5LLTQyMgk6CTEJOgkxMTg2OQorUEctVU5LLTQyMwk6CTEJOgkxMTg2OQorUEctVU5LLTQyNAk6CTEJOgkxMTg2OQorUEctVU5LLTQyNQk6CTEJOgkxMTg2OQorUEctVU5LLTQyNgk6CTEJOgkxMTg2OQorUEctVU5LLTQyNwk6CTEJOgkxMTg2OQorUEctVU5LLTQyOAk6CTEJOgkxMTg2OQorUEctVU5LLTQyOQk6CTEJOgkxMTg2OQorUEctVU5LLTQzMAk6CTEJOgkxMTg2OQorUEctVU5LLTQzMQk6CTEJOgkxMTg2OQorUEctVU5LLTQzMgk6CTEJOgkxMTg2OQorUEctVU5LLTQzMwk6CTEJOgkxMTg2OQorUEctVU5LLTQzNAk6CTEJOgkxMTg2OQorUEctVU5LLTQzNQk6CTEJOgkxMTg2OQorUEctVU5LLTQzNgk6CTEJOgkxMTg2OQorUEctVU5LLTQzNwk6CTEJOgkxMTg2OQorUEctVU5LLTQzOAk6CTEJOgkxMTg2OQorUEctVU5LLTQzOQk6CTEJOgkxMTg2OQorUEctVU5LLTQ0MAk6CTEJOgkxMTg2OQorUEctVU5LLTQ0MQk6CTEJOgkxMTg2OQorUEctVU5LLTQ0Mgk6CTEJOgkxMTg2OQorUEctVU5LLTQ0Mwk6CTEJOgkxMTg2OQorUEctVU5LLTQ0NAk6CTEJOgkxMTg2OQorUEctVU5LLTQ0NQk6CTEJOgkxMTg2OQorUEctVU5LLTQ0Ngk6CTEJOgkxMTg2OQorUEctVU5LLTQ0Nwk6CTEJOgkxMTg2OQorUEctVU5LLTQ0OAk6CTEJOgkxMTg2OQorUEctVU5LLTQ0OQk6CTEJOgkxMTg2OQorUEctVU5LLTQ1MAk6CTEJOgkxMTg2OQorUEctVU5LLTQ1MQk6CTEJOgkxMTg2OQorUEctVU5LLTQ1Mgk6CTEJOgkxMTg2OQorUEctVU5LLTQ1Mwk6CTEJOgkxMTg2OQorUEctVU5LLTQ1NAk6CTEJOgkxMTg2OQorUEctVU5LLTQ1NQk6CTEJOgkxMTg2OQorUEctVU5LLTQ1Ngk6CTEJOgkxMTg2OQorUEctVU5LLTQ1Nwk6CTEJOgkxMTg2OQorUEctVU5LLTQ1OAk6CTEJOgkxMTg2OQorUEctVU5LLTQ1OQk6CTEJOgkxMTg2OQorUEctVU5LLTQ2MAk6CTEJOgkxMTg2OQorUEctVU5LLTQ2MQk6CTEJOgkxMTg2OQorUEctVU5LLTQ2Mgk6CTEJOgkxMTg2OQorUEctVU5LLTQ2Mwk6CTEJOgkxMTg2OQorUEctVU5LLTQ2NAk6CTEJOgkxMTg2OQorUEctVU5LLTQ2NQk6CTEJOgkxMTg2OQorUEctVU5LLTQ2Ngk6CTEJOgkxMTg2OQorUEctVU5LLTQ2Nwk6CTEJOgkxMTg2OQorUEctVU5LLTQ2OAk6CTEJOgkxMTg2OQorUEctVU5LLTQ2OQk6CTEJOgkxMTg2OQorUEctVU5LLTQ3MAk6CTEJOgkxMTg2OQorUEctVU5LLTQ3MQk6CTEJOgkxMTg2OQorUEctVU5LLTQ3Mgk6CTEJOgkxMTg2OQorUEctVU5LLTQ3Mwk6CTEJOgkxMTg2OQorUEctVU5LLTQ3NAk6CTEJOgkxMTg2OQorUEctVU5LLTQ3NQk6CTEJOgkxMTg2OQorUEctVU5LLTQ3Ngk6CTEJOgkxMTg2OQorUEctVU5LLTQ3Nwk6CTEJOgkxMTg2OQorUEctVU5LLTQ3OAk6CTEJOgkxMTg2OQorUEctVU5LLTQ3OQk6CTEJOgkxMTg2OQorUEctVU5LLTQ4MAk6CTEJOgkxMTg2OQorUEctVU5LLTQ4MQk6CTEJOgkxMTg2OQorUEctVU5LLTQ4Mgk6CTEJOgkxMTg2OQorUEctVU5LLTQ4Mwk6CTEJOgkxMTg2OQorUEctVU5LLTQ4NAk6CTEJOgkxMTg2OQorUEctVU5LLTQ4NQk6CTEJOgkxMTg2OQorUEctVU5LLTQ4Ngk6CTEJOgkxMTg2OQorUEctVU5LLTQ4Nwk6CTEJOgkxMTg2OQorUEctVU5LLTQ4OAk6CTEJOgkxMTg2OQorUEctVU5LLTQ4OQk6CTEJOgkxMTg2OQorUEctVU5LLTQ5MAk6CTEJOgkxMTg2OQorUEctVU5LLTQ5MQk6CTEJOgkxMTg2OQorUEctVU5LLTQ5Mgk6CTEJOgkxMTg2OQorUEctVU5LLTQ5Mwk6CTEJOgkxMTg2OQorUEctVU5LLTQ5NAk6CTEJOgkxMTg2OQorUEctVU5LLTQ5NQk6CTEJOgkxMTg2OQorUEctVU5LLTQ5Ngk6CTEJOgkxMTg2OQorUE5HLkwyLjEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQJCToJCTIJCToJCTExODY5CitQTkcuTDIuNQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi42CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjcJCToJCTIJCToJCTExODY5CitQTkcuTDIuOAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi45CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjExCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjUwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjUxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjUyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjUzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjU0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjU1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjU2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjU3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjU4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjU5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjYwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjYxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjYyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjYzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjY0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjY1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjY2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjY3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjY4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjY5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjcwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjcxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjcyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjczCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjc0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjc1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjc2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjc3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjc4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjc5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjgwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjgxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjgyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjgzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjg0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjg1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjg2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjg3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjg4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjg5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjkwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjkxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjkyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjkzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjk0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjk1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjk2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjk3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjk4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjk5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEwMAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMDEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTAyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEwMwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMDQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTA1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEwNgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMDcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTA4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEwOQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMTAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTExCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjExMgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMTMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTE0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjExNQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMTYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTE3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjExOAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMTkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTIwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEyMQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMjIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTIzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEyNAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMjUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTI2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEyNwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMjgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTI5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEzMAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMzEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTMyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEzMwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMzQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTM1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEzNgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xMzcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTM4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjEzOQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNDAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTQxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE0MgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNDMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTQ0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE0NQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNDYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTQ3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE0OAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNDkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTUwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE1MQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNTIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTUzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE1NAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNTUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTU2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE1NwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNTgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTU5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE2MAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNjEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTYyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE2MwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNjQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTY1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE2NgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNjcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTY4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE2OQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNzAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTcxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE3MgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNzMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTc0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE3NQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNzYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTc3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE3OAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xNzkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTgwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE4MQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xODIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTgzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE4NAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xODUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTg2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE4NwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xODgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTg5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE5MAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xOTEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTkyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE5MwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xOTQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTk1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE5NgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4xOTcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMTk4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjE5OQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMDAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjAxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIwMgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMDMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjA0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIwNQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMDYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjA3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIwOAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMDkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjEwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIxMQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMTIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjEzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIxNAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMTUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjE2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIxNwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMTgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjE5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIyMAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMjEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjIyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIyMwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMjQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjI1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIyNgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMjcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjI4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIyOQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMzAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjMxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIzMgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMzMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjM0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIzNQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMzYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjM3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjIzOAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yMzkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjQwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI0MQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNDIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjQzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI0NAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNDUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjQ2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI0NwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNDgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjQ5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI1MAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNTEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjUyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI1MwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNTQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjU1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI1NgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNTcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjU4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI1OQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNjAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjYxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI2MgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNjMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjY0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI2NQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNjYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjY3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI2OAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNjkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjcwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI3MQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNzIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjczCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI3NAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNzUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjc2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI3NwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yNzgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjc5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI4MAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yODEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjgyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI4MwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yODQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjg1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI4NgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yODcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjg4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI4OQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yOTAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjkxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI5MgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yOTMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjk0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI5NQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yOTYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMjk3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjI5OAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4yOTkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzAwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMwMQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMDIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzAzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMwNAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMDUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzA2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMwNwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMDgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzA5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMxMAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMTEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzEyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMxMwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMTQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzE1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMxNgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMTcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzE4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMxOQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMjAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzIxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMyMgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMjMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzI0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMyNQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMjYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzI3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMyOAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMjkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzMwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMzMQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMzIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzMzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMzNAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMzUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzM2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjMzNwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zMzgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzM5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM0MAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNDEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzQyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM0MwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNDQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzQ1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM0NgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNDcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzQ4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM0OQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNTAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzUxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM1MgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNTMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzU0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM1NQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNTYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzU3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM1OAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNTkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzYwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM2MQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNjIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzYzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM2NAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNjUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzY2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM2NwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNjgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzY5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM3MAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNzEJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzcyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM3MwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNzQJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzc1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM3NgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zNzcJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzc4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM3OQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zODAJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzgxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM4MgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zODMJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzg0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM4NQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zODYJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzg3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM4OAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zODkJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzkwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM5MQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zOTIJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzkzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM5NAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zOTUJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzk2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjM5NwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi4zOTgJCToJCTIJCToJCTExODY5CitQTkcuTDIuMzk5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQwMAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MDEJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDAyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQwMwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MDQJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDA1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQwNgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MDcJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDA4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQwOQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MTAJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDExCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQxMgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MTMJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDE0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQxNQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MTYJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDE3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQxOAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MTkJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDIwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQyMQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MjIJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDIzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQyNAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MjUJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDI2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQyNwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MjgJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDI5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQzMAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MzEJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDMyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQzMwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MzQJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDM1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQzNgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40MzcJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDM4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQzOQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NDAJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDQxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ0MgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NDMJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDQ0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ0NQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NDYJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDQ3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ0OAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NDkJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDUwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ1MQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NTIJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDUzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ1NAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NTUJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDU2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ1NwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NTgJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDU5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ2MAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NjEJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDYyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ2MwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NjQJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDY1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ2NgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NjcJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDY4CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ2OQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NzAJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDcxCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ3MgkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NzMJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDc0CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ3NQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NzYJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDc3CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ3OAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40NzkJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDgwCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ4MQkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40ODIJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDgzCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ4NAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40ODUJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDg2CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ4NwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40ODgJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDg5CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ5MAkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40OTEJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDkyCQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ5MwkJOgkJMgkJOgkJMTE4NjkKK1BORy5MMi40OTQJCToJCTIJCToJCTExODY5CitQTkcuTDIuNDk1CQk6CQkyCQk6CQkxMTg2OQorUE5HLkwyLjQ5NgkJOgkJMgkJOgkJMTE4NjkKK0NlbnRyYWwgIAk6CTEJOgkxODMxNTMKK1NpbWJ1IAk6CTEJOgkyNTg3NzYKK0Vhc3QgTmV3IEJyaXRhaW4gCToJMQk6CTIyMDAzNQorRWFzdCBTZXBpayAJOgkxCToJMzQxNTgzCitFYXN0ZXJuIEhpZ2hsYW5kcyAJOgkxCToJNDI5NDgwCitFbmdhIAk6CTEJOgkyODkyOTkKK0d1bGYgCToJMQk6CTEwNTA1MAorTWFkYW5nIAk6CTEJOgkzNjI4MDUKK01hbnVzIAk6CTEJOgk0MzU4OQorTWlsbmUgQmF5IAk6CTEJOgkyMDkwNTQKK01vcm9iZSAJOgkxCToJNTM2OTE3CitOYXRpb25hbCBDYXBpdGFsIERpc3RyaWN0IAk6CTEJOgkyNTI0NjkKK05ldyBJcmVsYW5kIAk6CTEJOgkxMTgxNDgKK05vcnRoIFNvbG9tb25zIAk6CTEJOgkxNDExNjEKK09ybyAoTm9ydGhlcm4pIAk6CTEJOgkxMzI3MTQKK1NvdXRoZXJuIEhpZ2hsYW5kcyAJOgkxCToJNTQ0MzUyCitXZXN0IE5ldyBCcml0YWluIAk6CTEJOgkxODQ4MzgKK1dlc3QgU2VwaWsgCToJMQk6CTE4NTc5MAorV2VzdGVybiAJOgkxCToJMTUyMDY3CitXZXN0ZXJuIEhpZ2hsYW5kcyAJOgkxCToJNDM5MDg1CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEFSQUdVQVlfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEFSQUdVQVlfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZWIyNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9QQVJBR1VBWV9BUkVBLnR4dApAQCAtMCwwICsxLDIwIEBACitQYXJhZ3VheQk6CTAJOgk0MDY3NTAKK0FsdG8gUGFyYWd1YXkgICAJOgkxCToJODIzNDkKK0FsdG8gUGFyYW5hIAk6CTEJOgkxNDg5NQorQW1hbWJheSAJOgkxCToJMTI5MzMKK0FzdW5jaW9uIAk6CTEJOgkxMTcKK0JvcXVlcm9uIAk6CTEJOgk5MTY2OQorQ2FhZ3VhenUJOgkxCToJMTE0NzQKK0NhYXphcGEgCToJMQk6CTk0OTYKK0NhbmluZGV5dSAJOgkxCToJMTQ2NjcKK0NlbnRyYWwgCToJMQk6CTI0NjUKK0NvbmNlcGNpb24gCToJMQk6CTE4MDUxCitDb3JkaWxsZXJhIAk6CTEJOgk0OTQ4CitHdWFpcmEgCToJMQk6CTM4NDYKK0l0YXB1YSAJOgkxCToJMTY1MjUKK01pc2lvbmVzIAk6CTEJOgk5NTU2CitOZWVtYnVjdSAJOgkxCToJMTIxNDcKK1BhcmFndWFyaQk6CTEJOgk4NzA1CitQcmVzaWRlbnRlIEhheWVzIAk6CTEJOgk3MjkwNworU2FuIFBlZHJvIAk6CTEJOgkyMDAwMgorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEFSQUdVQVlfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEFSQUdVQVlfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlZjhhNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9QQVJBR1VBWV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDE5IEBACitQYXJhZ3VheQk6CTAJOgk2NTA2NDY0CitBbHRvIFBhcmFndWF5ICAgCToJMQk6CTEzMjUwCitBbHRvIFBhcmFuYSAJOgkxCToJNTU5NzY5CitBbWFtYmF5IAk6CTEJOgkxMTUzMjAKK0FzdW5jaW9uIAk6CTEJOgk1MTA5MTAKK0JvcXVlcm9uIAk6CTEJOgk0MzQ4MAorQ2FhZ3VhenUJOgkxCToJNDQzMzExCitDYWF6YXBhIAk6CTEJOgkxMzkwODAKK0NhbmluZGV5dSAJOgkxCToJMTQwMjUwCitDZW50cmFsIAk6CTEJOgkxMzYyNjUwCitDb25jZXBjaW9uIAk6CTEJOgkxNzg5MDAKK0NvcmRpbGxlcmEgCToJMQk6CTIzMzE3MAorR3VhaXJhIAk6CTEJOgkxNzgxMzAKK0l0YXB1YSAJOgkxCToJNDU5NDgwCitNaXNpb25lcyAJOgkxCToJMTAyMjMwCitOZWVtYnVjdSAJOgkxCToJNzY3MzAKK1BhcmFndWFyaQk6CTEJOgkyMjQ4NTAKK1ByZXNpZGVudGUgSGF5ZXMgCToJMQk6CTgyMDMwCitTYW4gUGVkcm8gCToJMQk6CTMxOTU0MApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BFUlVfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEVSVV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWQ0ODMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BFUlVfQVJFQS50eHQKQEAgLTAsMCArMSwyNiBAQAorUGVydQk6CTAJOgkxMjg1MjIwCitBbWF6b25hcwk6CTEJOgkzOTI0OS4xMworQW5jYXNoCToJMQk6CTM1OTE0LjgxCithcHVyaW1hYwk6CTEJOgkyMDg5NS43OQorYXJlcXVpcGEJOgkxCToJNjMzNDUuMzkKK2F5YWN1Y2hvCToJMQk6CTQzODE0LjgwCitjYWphbWFyY2EJOgkxCToJMzMzMTcuNTQKK2VsIGNhbGxhbwk6CTEJOgkxNDYuOTgKK2N1emNvCToJMQk6CTcxOTg2LjUwCitodWFuY2F2ZWxpY2EJOgkxCToJMjIxMzEuNDcKK2h1YW51Y28JOgkxCToJMzY4NDguODUKK2ljYQk6CTEJOgkyMTMyNy44MworanVuaW4JOgkxCToJNDQxOTcuMjMKK2xhIGxpYmVydGFkCToJMQk6CTI1NDk5LjkwCitsYW1iYXllcXVlCToJMQk6CTE0MjEzLjMwCitsaW1hCToJMQk6CTM0ODAxLjU5Citsb3JldG8JOgkxCToJMzY4ODUxLjk1CittYWRyZSBkZSBkaW9zCToJMQk6CTg1MzAwLjU0Cittb3F1ZWd1YQk6CTEJOgkxNTczMy45NworcGFzY28JOgkxCToJMjUzMTkuNTkKK3BpdXJhCToJMQk6CTM1ODkyLjQ5CitwdW5vCToJMQk6CTcxOTk5LjAwCitzYW4gbWFydGluCToJMQk6CTUxMjUzLjMxCit0YWNuYQk6CTEJOgkxNjA3NS44OQordHVtYmVzCToJMQk6CTQ2NjkuMjAKK3VjYXlhbGkJOgkxCToJMTAyNDEwLjU1CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEVSVV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9QRVJVX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYmY1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEVSVV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDI2IEBACitQZXJ1CToJMAk6CTI4MzAyNjAzCitBbWF6b25hcwk6CTEJOgk0MzU1NTYKK0FuY2FzaAk6CTEJOgkxMTIzNDEwCithcHVyaW1hYwk6CTEJOgk0NzA3MTkKK2FyZXF1aXBhCToJMQk6CTExMTM5MTYKK2F5YWN1Y2hvCToJMQk6CTU2MTAyOQorY2FqYW1hcmNhCToJMQk6CTE1MTU4MjcKK2VsIGNhbGxhbwk6CTEJOgk3OTk1MzAKK2N1emNvCToJMQk6CTEyMjMyNDgKK2h1YW5jYXZlbGljYQk6CTEJOgk0NTE1MDgKK2h1YW51Y28JOgkxCToJODIyODA0CitpY2EJOgkxCToJNjk4NDM3CitqdW5pbgk6CTEJOgkxMjYwNzczCitsYSBsaWJlcnRhZAk6CTEJOgkxNTI4NDQ4CitsYW1iYXllcXVlCToJMQk6CTExMzE0NjcKK2xpbWEJOgkxCToJNzg4MDAzOQorbG9yZXRvCToJMQk6CTkxOTUwNQorbWFkcmUgZGUgZGlvcwk6CTEJOgkxMDIxNzQKK21vcXVlZ3VhCToJMQk6CTE2MDIzMgorcGFzY28JOgkxCToJMjcwOTg3CitwaXVyYQk6CTEJOgkxNjYwOTUyCitwdW5vCToJMQk6CTEyODA1NTUKK3NhbiBtYXJ0aW4JOgkxCToJNzY3ODkwCit0YWNuYQk6CTEJOgkzMDE5NjAKK3R1bWJlcwk6CTEJOgkyMDY1NzgKK3VjYXlhbGkJOgkxCToJNDYwNTU3CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEhJTElQUElORVNfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEhJTElQUElORVNfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmYzJjNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9QSElMSVBQSU5FU19BUkVBLnR4dApAQCAtMCwwICsxLDE5IEBACitQaGlsbGlwaW5lcwk6CTAJOgkzMDAwMDAKK1JlZ2lvbiAxCToJMQk6CTEyODQwCitSZWdpb24gMgk6CTEJOgkyNjgzOAorUmVnaW9uIDMJOgkxCToJMjE0NzAKK1JlZ2lvbiA0CToJMQk6CTE2MjI5CitSZWdpb24gVgk6CTEJOgkyNzQ1NgorUmVnaW9uIDUJOgkxCToJMTc2MzQKK1JlZ2lvbiA2CToJMQk6CTIwMjIzCitSZWdpb24gNwk6CTEJOgkxNDk1MQorUmVnaW9uIDggOiAxIDogMjE0MzIKK1JlZ2lvbiBaCToJMQk6CTIxNDMyCitSZWdpb24gOQk6CTEJOgkxNjA0MgorUmVnaW9uIDEwCToJMQk6CTE3MTI1CitSZWdpb24gMTEJOgkxCToJMTk2NzEKK1JlZ2lvbiAxMgk6CTEJOgkxODM0OAorUmVnaW9uIDEzCToJMQk6CTE4ODQ3CitBUk1NIC0gQXV0b25vbW91cyBSZWdpb24gaW4gTXVzbGltIE1pbmRhbmFvIAk6CTEJOgkxMzAxMAorQ0FSCToJMQk6CTE4Mjk0CitOQ1IJOgkxCToJNjM2CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEhJTElQUElORVNfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUEhJTElQUElORVNfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdhNWJiNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9QSElMSVBQSU5FU19QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDE5IEBACitQaGlsbGlwaW5lcwk6CTAJOgk4OTQ2ODY3NworUmVnaW9uIDEJOgkxCToJNDIwMDMyOQorUmVnaW9uIDIJOgkxCToJMjgxMzE1OQorUmVnaW9uIDMJOgkxCToJODIwMDE1MQorUmVnaW9uIDQJOgkxCToJOTMyMDYyOQorUmVnaW9uIFYJOgkxCToJMjI5ODc5NgorUmVnaW9uIDUJOgkxCToJNDYzMjY4OQorUmVnaW9uIDYJOgkxCToJNjIwODczMworUmVnaW9uIDcJOgkxCToJNTcwMDYyOAorUmVnaW9uIDggOiAxIDogMzYxMDM1NQorUmVnaW9uIFoJOgkxCToJMzYxMDE5MQorUmVnaW9uIDkJOgkxCToJMjgzMTM0MgorUmVnaW9uIDEwCToJMQk6CTM0OTM4MDYKK1JlZ2lvbiAxMQk6CTEJOgkzNjc2MTYzCitSZWdpb24gMTIJOgkxCToJMzIwODc3MAorUmVnaW9uIDEzCToJMQk6CTIwOTQwMjEKK0FSTU0gLSBBdXRvbm9tb3VzIFJlZ2lvbiBpbiBNdXNsaW0gTWluZGFuYW8gCToJMQk6CTI4MDMwNDUKK0NBUgk6CTEJOgkxMzY1MjIwCitOQ1IJOgkxCToJOTkwNjA0OApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BPTEFORF9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9QT0xBTkRfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzNjA0NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9QT0xBTkRfQVJFQS50eHQKQEAgLTAsMCArMSw1MCBAQAorIFBPTEFORCA6IDAgOiAzMTI2ODMuMAorIEdkYW5zayA6IDEgOiA3Mzk0LjAKKyBTbHVwc2sgOiAxIDogNzQ1My4wCisgS29zemFsaW4gOiAxIDogODQ3MC4wCisgRWxibGFnIDogMSA6IDYxMDMuMAorIFN1d2Fsc2tpIDogMSA6IDEwNDkwLjAKKyBPbHN6dHluIDogMSA6IDEyMzI3LjAKKyBTemN6ZWNpbiA6IDEgOiA5OTgxLjAKKyBCeWRnb3N6Y3ogOiAxIDogMTAzNDkuMAorIExvbXphIDogMSA6IDY2ODQuMAorIEJpYWx5c3RvayA6IDEgOiAxMDA1NS4wCisgUGlsYSA6IDEgOiA4MjA1LjAKKyBUb3J1biA6IDEgOiA1MzQ4LjAKKyBPc3Ryb2xla2EgOiAxIDogNjQ5OC4wCisgQ2llY2hhbm93IDogMSA6IDYzNjIuMAorIEdvcnpvdyA6IDEgOiA4NDg0LjAKKyBXbG9jbGF3ZWsgOiAxIDogNDQwMi4wCisgUGxvY2sgOiAxIDogNTExNy4wCisgUG96bmFuIDogMSA6IDgxNTEuMAorIFNpZWRsY2UgOiAxIDogODQ5OS4wCisgV2Fyc3phd2EgOiAxIDogMzc4OC4wCisgS29uaW4gOiAxIDogNTEzOS4wCisgQmlhbGEgUG9kbGFza2EgOiAxIDogNTM0OC4wCisgWmllbG9uYSBHb3JhIDogMSA6IDg4NjguMAorIFNraWVybmlld2ljZSA6IDEgOiAzOTYwLjAKKyBMZXN6bm8gOiAxIDogNDE1NC4wCisgS2FsaXN6IDogMSA6IDY1MTIuMAorIExvZHogOiAxIDogMTUyMy4wCisgU2llcmFkeiA6IDEgOiA0ODY5LjAKKyBSYWRvbSA6IDEgOiA3Mjk0LjAKKyBMdWJsaW4gOiAxIDogNjc5Mi4wCisgTGVnbmljYSA6IDEgOiA0MDM3LjAKKyBQaW90cmtvdyA6IDEgOiA2MjY2LjAKKyBDaGVsbSA6IDEgOiAzODY2LjAKKyBXcm9jbGF3IDogMSA6IDYyODcuMAorIEplbGVuaWEgR29yYSA6IDEgOiA0Mzc4LjAKKyBLaWVsY2UgOiAxIDogOTIxMS4wCisgQ3plc3RvY2hvd2EgOiAxIDogNjE4Mi4wCisgT3BvbGUgOiAxIDogODUzNS4wCisgVGFybm9icnplZyA6IDEgOiA2MjgzLjAKKyBXYWxicnp5Y2ggOiAxIDogNDE2OC4wCisgWmFtb3NjIDogMSA6IDY5ODAuMAorIEthdG93aWNlIDogMSA6IDY2NTAuMAorIFJ6ZXN6b3cgOiAxIDogNDM5Ny4wCisgUHJ6ZW15c2wgOiAxIDogNDQzNy4wCisgS3Jha293IDogMSA6IDMyNTQuMAorIFRhcm5vdyA6IDEgOiA0MTUxLjAKKyBCaWVsc2tvLUJpYWxhIDogMSA6IDM3MDQuMAorIEtyb3NubyA6IDEgOiA1NzAyLjAKKyBOb3d5IFNhY3ogOiAxIDogNTU3Ni4wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUE9MQU5EX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BPTEFORF9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGM2NDZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BPTEFORF9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDQ5IEBACisgR2RhbnNrIDogMSA6IDE0MzE1NjkKKyBTbHVwc2sgOiAxIDogNDEzODIwCisgS29zemFsaW4gOiAxIDogNTA4MTcyCisgRWxibGFnIDogMSA6IDQ3ODg2NQorIFN1d2Fsc2tpIDogMSA6IDQ3MTYyMworIE9sc3p0eW4gOiAxIDogNzUzMDMyCisgU3pjemVjaW4gOiAxIDogOTcyMDczCisgQnlkZ29zemN6IDogMSA6IDExMTA3NzIKKyBMb216YSA6IDEgOiAzNDY3MDUKKyBCaWFseXN0b2sgOiAxIDogNjkyODIxCisgUGlsYSA6IDEgOiA0ODA3NDUKKyBUb3J1biA6IDEgOiA2NTkxMTcKKyBPc3Ryb2xla2EgOiAxIDogMzk3Mjc2CisgQ2llY2hhbm93IDogMSA6IDQyODM2MQorIEdvcnpvdyA6IDEgOiA1MDA2NjYKKyBXbG9jbGF3ZWsgOiAxIDogNDI5NDMzCisgUGxvY2sgOiAxIDogNTE2NDMxCisgUG96bmFuIDogMSA6IDEzMzQwOTEKKyBTaWVkbGNlIDogMSA6IDY1MTQzMworIFdhcnN6YXdhIDogMSA6IDI0MjE1OTQKKyBLb25pbiA6IDEgOiA0NjkxOTEKKyBCaWFsYSBQb2RsYXNrYSA6IDEgOiAzMDUzMzcKKyBaaWVsb25hIEdvcmEgOiAxIDogNjU5OTczCisgU2tpZXJuaWV3aWNlIDogMSA6IDQxOTMzOQorIExlc3pubyA6IDEgOiAzODY4MzcKKyBLYWxpc3ogOiAxIDogNzEwNzQ2CisgTG9keiA6IDEgOiAxMTM5NDk4CisgU2llcmFkeiA6IDEgOiA0MDgxNDIKKyBSYWRvbSA6IDEgOiA3NTExMjYKKyBMdWJsaW4gOiAxIDogMTAxNjM1NQorIExlZ25pY2EgOiAxIDogNTE1ODU5CisgUGlvdHJrb3cgOiAxIDogNjQyNjI1CisgQ2hlbG0gOiAxIDogMjQ3MjI2CisgV3JvY2xhdyA6IDEgOiAxMTI4NzkxCisgSmVsZW5pYSBHb3JhIDogMSA6IDUxNzg4MAorIEtpZWxjZSA6IDEgOiAxMTI2NjY4CisgQ3plc3RvY2hvd2EgOiAxIDogNzc2NjYyCisgT3BvbGUgOiAxIDogMTAxODYxMAorIFRhcm5vYnJ6ZWcgOiAxIDogNTk5MDYxCisgV2FsYnJ6eWNoIDogMSA6IDc0MDg5OAorIFphbW9zYyA6IDEgOiA0OTAzOTYKKyBLYXRvd2ljZSA6IDEgOiAzOTg4ODMxCisgUnplc3pvdyA6IDEgOiA3MjM2OTcKKyBQcnplbXlzbCA6IDEgOiA0MDY3NzEKKyBLcmFrb3cgOiAxIDogMTIzMTYzNgorIFRhcm5vdyA6IDEgOiA2NzAyNjEKKyBCaWVsc2tvLUJpYWxhIDogMSA6IDkwMDI1OQorIEtyb3NubyA6IDEgOiA0OTUwMTEKKyBOb3d5IFNhY3ogOiAxIDogNjk3ODc1CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUE9SVFVHQUxfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUE9SVFVHQUxfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4NTNmOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9QT1JUVUdBTF9BUkVBLnR4dApAQCAtMCwwICsxLDUgQEAKKyBOT1JURSA6IDEgOiAyMTI5MC4wCisgQ0VOVFJPIDogMSA6IDIzNjY3LjAKKyBMSVNCT0EgRSBWQUxFIERPIFRFSk8gOiAxIDogMTE5ODIuMAorIEFMRU5URUpPIDogMSA6IDI2OTk2LjAKKyBBTEdBUlZFIDogMSA6IDQ5OTAuMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BPUlRVR0FMX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BPUlRVR0FMX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzFiYTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUE9SVFVHQUxfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSw1IEBACisgTk9SVEUgOiAxIDogMzY0MzMwMAorIENFTlRSTyA6IDEgOiAxNzgwNTAwCisgTElTQk9BIEUgVkFMRSBETyBURUpPIDogMSA6IDM0NzY2MDAKKyBBTEVOVEVKTyA6IDEgOiA1NjM2MDAKKyBBTEdBUlZFIDogMSA6IDM0NDkwMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BVRVJUTyBSSUNPX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BVRVJUTyBSSUNPX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDE3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUFVFUlRPIFJJQ09fQVJFQS50eHQKQEAgLTAsMCArMSw3OSBAQAorUHVlcnRvIFJpY28JOgkxCToJNTMyNC41MAorQWRqdW50YXMgCToJMQk6CTY3LjExCitBZ3VhZGEgCToJMQk6CTQ1LjU1CitBZ3VhZGlsbGEgCToJMQk6CTc1LjU2CitBZ3VhcyBCdWVuYXMgCToJMQk6CTMwLjU3CitBaWJvbml0byAJOgkxCToJMzEuMworQfFhc2NvIAk6CTEJOgk0NC45CitBcmVjaWJvIAk6CTEJOgkxNzEuMjIKK0Fycm95byAJOgkxCToJMzUuNjQKK0JhcmNlbG9uZXRhIAk6CTEJOgkzMC45CitCYXJyYW5xdWl0YXMgCToJMQk6CTM0LjIzCitCYXlhbfNuIAk6CTEJOgk0NC41MworQ2FibyBSb2pvIAk6CTEJOgkxNzcuNAorQ2FndWFzIAk6CTEJOgk1OS4wNworQ2FtdXkgCToJMQk6CTYxLjkxCitDYW7zdmFuYXMgCToJMQk6CTMyLjk3CitDYXJvbGluYSAJOgkxCToJNjAuMzQKK0NhdGHxbyAJOgkxCToJNy4wNAorQ2F5ZXkgCToJMQk6CTUxLjkxCitDZWliYSAJOgkxCToJMTU4LjgyCitDaWFsZXMgCToJMQk6CTY2LjgxCitDaWRyYSAJOgkxCToJMzYuNTEKK0NvYW1vIAk6CTEJOgk3OC4wNQorQ29tZXLtbyAJOgkxCToJMjguNTIKK0Nvcm96YWwgCToJMQk6CTQyLjU5CitDdWxlYnJhIAk6CTEJOgkxNjguODMKK0RvcmFkbyAJOgkxCToJNTMuODMKK0ZhamFyZG8gCToJMQk6CTEwNS4zMgorRmxvcmlkYSAJOgkxCToJMTUuMgorR3XhbmljYSAJOgkxCToJNzkuNDYKK0d1YXlhbWEgCToJMQk6CTEwNi44MQorR3VheWFuaWxsYSAJOgkxCToJNjQuMzEKK0d1YXluYWJvIAk6CTEJOgkyNy4zMQorR3VyYWJvIAk6CTEJOgkyOC4yOAorSGF0aWxsbyAJOgkxCToJNTguNzMKK0hvcm1pZ3Vlcm9zIAk6CTEJOgkxMS4zMgorSHVtYWNhbyAJOgkxCToJNzEuNAorSXNhYmVsYSAJOgkxCToJOTEuOTUKK0pheXV5YSAJOgkxCToJNDQuNTkKK0p1YW5hIETtYXogCToJMQk6CTEwNy4wNAorSnVuY29zIAk6CTEJOgkyNi42CitMYWphcyAJOgkxCToJMTAxLjE0CitMYXJlcyAJOgkxCToJNjEuNjUKK0xhcyBNYXLtYXMgCToJMQk6CTQ2LjQ5CitMYXMgUGllZHJhcyAJOgkxCToJMzMuODkKK0xv7XphIAk6CTEJOgk2NS43MQorTHVxdWlsbG8gCToJMQk6CTQ2LjQyCitNYW5hdO0gCToJMQk6CTcwLjY5CitNYXJpY2FvIAk6CTEJOgkzNi42MworTWF1bmFibyAJOgkxCToJMzguMjUKK01heWFn/GV6IAk6CTEJOgkyNzQuMDkKK01vY2EgCToJMQk6CTUwLjI5CitNb3JvdmlzIAk6CTEJOgkzOC45MgorTmFndWFibyAJOgkxCToJNzIuMjYKK05hcmFuaml0byAJOgkxCToJMjcuNworT3JvY292aXMgCToJMQk6CTYzLjY2CitQYXRpbGxhcyAJOgkxCToJNzUuMzIKK1Bl8XVlbGFzIAk6CTEJOgk2Ny43NworUG9uY2UgCToJMQk6CTE5My42MQorUXVlYnJhZGlsbGFzIAk6CTEJOgkzNC4zMgorUmluY/NuIAk6CTEJOgk1NC40MQorUu1vIEdyYW5kZSAJOgkxCToJODkuNjIKK1NhYmFuYSBHcmFuZGUgCToJMQk6CTM1Ljg5CitTYWxpbmFzIAk6CTEJOgkxMTQuMTQKK1NhbiBHZXJt4W4gCToJMQk6CTU0LjUxCitTYW4gSnVhbiAJOgkxCToJNzYuOTMKK1NhbiBMb3JlbnpvIAk6CTEJOgk1My4yMgorU2FuIFNlYmFzdGnhbiAJOgkxCToJNzEuMjQKK1NhbnRhIElzYWJlbCAJOgkxCToJNzYuOTUKK1RvYSBBbHRhIAk6CTEJOgkyNy41NworVG9hIEJhamEgCToJMQk6CTQxLjcKK1RydWppbGxvIEFsdG8gCToJMQk6CTIxLjM1CitVdHVhZG8gCToJMQk6CTExNC45OQorVmVnYSBBbHRhIAk6CTEJOgkzNy41MQorVmVnYSBCYWphIAk6CTEJOgk2OC4xNworVmllcXVlcyAJOgkxCToJMjYzLjk4CitWaWxsYWxiYSAJOgkxCToJMzcuMDUKK1lhYnVjb2EgCToJMQk6CTgzLjI2CitZYXVjbyAJOgkxCToJNjguNzYKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9QVUVSVE8gUklDT19QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9QVUVSVE8gUklDT19QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGYzNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1BVRVJUTyBSSUNPX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsNzkgQEAKK1B1ZXJ0byBSaWNvIDogMSA6IDM5MTIwNTQKK0FkanVudGFzIAk6CTEJOgkxOTE0MworQWd1YWRhIAk6CTEJOgk0MjA0MgorQWd1YWRpbGxhIAk6CTEJOgk2NDY4NQorQWd1YXMgQnVlbmFzIAk6CTEJOgkyOTAzMgorQWlib25pdG8gCToJMQk6CTI2NDkzCitB8WFzY28gCToJMQk6CTI4MzQ4CitBcmVjaWJvIAk6CTEJOgkxMDAxMzEKK0Fycm95byAJOgkxCToJMTkxMTcKK0JhcmNlbG9uZXRhIAk6CTEJOgkyMjMyMgorQmFycmFucXVpdGFzIAk6CTEJOgkyODkwOQorQmF5YW3zbiAJOgkxCToJMjI0MDQ0CitDYWJvIFJvam8gCToJMQk6CTQ2OTExCitDYWd1YXMgCToJMQk6CTE0MDUwMgorQ2FtdXkgCToJMQk6CTM1MjQ0CitDYW7zdmFuYXMgCToJMQk6CTQzMzM1CitDYXJvbGluYSAJOgkxCToJMTg2MDc2CitDYXRh8W8gCToJMQk6CTMwMDcxCitDYXlleSAJOgkxCToJNDczNzAKK0NlaWJhIAk6CTEJOgkxODAwNAorQ2lhbGVzIAk6CTEJOgkxOTgxMQorQ2lkcmEgCToJMQk6CTQyNzUzCitDb2FtbyAJOgkxCToJMzc1OTcKK0NvbWVy7W8gCToJMQk6CTIwMDAyCitDb3JvemFsIAk6CTEJOgkzNjg2NworQ3VsZWJyYSAJOgkxCToJMTg2OAorRG9yYWRvIAk6CTEJOgkzNDAxNworRmFqYXJkbyAJOgkxCToJNDA3MTIKK0Zsb3JpZGEgCToJMQk6CTEyMzY3CitHdeFuaWNhIAk6CTEJOgkyMTg4OAorR3VheWFtYSAJOgkxCToJNDQzMDEKK0d1YXlhbmlsbGEgCToJMQk6CTIzMDcyCitHdWF5bmFibyAJOgkxCToJMTAwMDUzCitHdXJhYm8gCToJMQk6CTM2NzQzCitIYXRpbGxvIAk6CTEJOgkzODkyNQorSG9ybWlndWVyb3MgCToJMQk6CTE2NjE0CitIdW1hY2FvIAk6CTEJOgk1OTAzNQorSXNhYmVsYSAJOgkxCToJNDQ0NDQKK0pheXV5YSAJOgkxCToJMTczMTgKK0p1YW5hIETtYXogCToJMQk6CTUwNTMxCitKdW5jb3MgCToJMQk6CTM2NDUyCitMYWphcyAJOgkxCToJMjYyNjEKK0xhcmVzIAk6CTEJOgkzNDQxNQorTGFzIE1hcu1hcyAJOgkxCToJMTEwNjEKK0xhcyBQaWVkcmFzIAk6CTEJOgkzNDQ4NQorTG/temEgCToJMQk6CTMyNTM3CitMdXF1aWxsbyAJOgkxCToJMTk4MTcKK01hbmF07SAJOgkxCToJNDU0MDkKK01hcmljYW8gCToJMQk6CTY0NDkKK01hdW5hYm8gCToJMQk6CTEyNzQxCitNYXlhZ/xleiAJOgkxCToJOTg0MzQKK01vY2EgCToJMQk6CTM5Njk3CitNb3JvdmlzIAk6CTEJOgkyOTk2NQorTmFndWFibyAJOgkxCToJMjM3NTMKK05hcmFuaml0byAJOgkxCToJMjk3MDkKK09yb2NvdmlzIAk6CTEJOgkyMzg0NAorUGF0aWxsYXMgCToJMQk6CTIwMTUyCitQZfF1ZWxhcyAJOgkxCToJMjY3MTkKK1BvbmNlIAk6CTEJOgkxODY0NzUKK1F1ZWJyYWRpbGxhcyAJOgkxCToJMjU0NTAKK1JpbmPzbiAJOgkxCToJMTQ3NjcKK1LtbyBHcmFuZGUgCToJMQk6CTUyMzYyCitTYWJhbmEgR3JhbmRlIAk6CTEJOgkyNTkzNQorU2FsaW5hcyAJOgkxCToJMzExMTMKK1NhbiBHZXJt4W4gCToJMQk6CTM3MTA1CitTYW4gSnVhbiAJOgkxCToJNDM0Mzc0CitTYW4gTG9yZW56byAJOgkxCToJNDA5OTcKK1NhbiBTZWJhc3Rp4W4gCToJMQk6CTQ0MjA0CitTYW50YSBJc2FiZWwgCToJMQk6CTIxNjY1CitUb2EgQWx0YSAJOgkxCToJNjM5MjkKK1RvYSBCYWphIAk6CTEJOgk5NDA4NQorVHJ1amlsbG8gQWx0byAJOgkxCToJNzU3MjgKK1V0dWFkbyAJOgkxCToJMzUzMzYKK1ZlZ2EgQWx0YSAJOgkxCToJMzc5MTAKK1ZlZ2EgQmFqYSAJOgkxCToJNjE5MjkKK1ZpZXF1ZXMgCToJMQk6CTkxMDYKK1ZpbGxhbGJhIAk6CTEJOgkyNzkxMworWWFidWNvYSAJOgkxCToJMzkyNDYKK1lhdWNvIAk6CTEJOgk0NjM4NApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1FBVEFSX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1FBVEFSX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlN2M0OGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUUFUQVJfQVJFQS50eHQKQEAgLTAsMCArMSwxMiBAQAorUWF0YXIJOgkwCToJMTE0MzcKK1FhdGFyIDogMSA6IDExNDM3CitBbCBHaHV3YWlyaXlhICAJOgkxCToJNjIyLjcKK0FsIEplbWFpbHlhIAk6CTEJOgkyNjExLjcwCitBbCBLaG9yIAk6CTEJOgkxMDAxLjQwCitBbCBSYXl5YW4gCToJMQk6CTg5My41CitBbCBTaGFtYWwgCToJMQk6CTkwMi4xCitBbCBXYWtyYSAJOgkxCToJMTExNi4zMAorRG9oYSAJOgkxCToJMTU4LjcKK0plcnlhbiBBbCBCZXRuYSAJOgkxCToJMjM4OS40MAorTWVzYWllZWQgCToJMQk6CTEzNTQuODAKK1VtbSBTYWxhbCAJOgkxCToJNDcwLjQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9RQVRBUl9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9RQVRBUl9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWFmMmZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1FBVEFSX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMTQgQEAKK1FhdGFyCToJMAk6CTg4NTM1OQorUWF0YXIgOiAxIDogODg1MzU5CitBbCBHaHV3YWlyaXlhICAJOgkxCToJMjE1OQorQWwgSmVtYWlseWEgCToJMQk6CTEwMzAzCitBbCBLaG9yIAk6CTEJOgkzMTU0NworQWwgUmF5eWFuIAk6CTEJOgkyNzI4NjAKK0FsIFNoYW1hbCAJOgkxCToJNDkxNQorQWwgV2FrcmEgCToJMQk6CTMxNDQxCitEb2hhIAk6CTEJOgkzMzk4NDcKK0plcnlhbiBBbCBCZXRuYSAJOgkxCToJNjY3OAorTWVzYWllZWQgCToJMQk6CTEyNjc0CitVbW0gU2FsYWwgCToJMQk6CTMxNjA1CisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1JPTUFOSUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUk9NQU5JQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzE0M2IzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1JPTUFOSUFfQVJFQS50eHQKQEAgLTAsMCArMSw0MSBAQAorIEJvdG9zYW5pIDogMSA6IDQ5NjUuMAorIFNhdHUgTWFyZSA6IDEgOiA0NDA1LjAKKyBNYXJhbXVyZXMgOiAxIDogNjIxNS4wCisgU3VjZWF2YSA6IDEgOiA4NTU1LjAKKyBCaXN0cml0YS1OYXNhdWQgOiAxIDogNTMwNS4wCisgQmlob3IgOiAxIDogNzUzNS4wCisgSWFzaSA6IDEgOiA1NDY5LjAKKyBTYWxhaiA6IDEgOiAzODUwLjAKKyBDbHVqIDogMSA6IDY2NTAuMAorIE5lYW10IDogMSA6IDU4OTAuMAorIEhhcmdoaXRhIDogMSA6IDY2MTAuMAorIE11cmVzIDogMSA6IDY2OTYuMAorIFZhc2x1aSA6IDEgOiA1Mjk3LjAKKyBCYWNhdSA6IDEgOiA2NjA2LjAKKyBBcmFkIDogMSA6IDc2NTIuMAorIEFsYmEgOiAxIDogNjIzMS4wCisgSHVuZWRvYXJhIDogMSA6IDcwMTYuMAorIENvdmFzbmEgOiAxIDogMzcwNS4wCisgU2liaXUgOiAxIDogNTQyMi4wCisgVGltaXMgOiAxIDogODY5Mi4wCisgQnJhc292IDogMSA6IDUzNTEuMAorIFZyYW5jZWEgOiAxIDogNDg2My4wCisgR2FsYXRpIDogMSA6IDQ0MjUuMAorIEJ1emF1IDogMSA6IDYwNzIuMAorIENhcmFzLVNldmVyaW4gOiAxIDogODUwMy4wCisgQXJnZXMgOiAxIDogNjgwMS4wCisgVmlsY2VhIDogMSA6IDU3MDUuMAorIFByYWhvdmEgOiAxIDogNDY5NC4wCisgQnJhaWxhIDogMSA6IDQ3MjQuMAorIFR1bGNlYSA6IDEgOiA4NDMwLjAKKyBEaW1ib3ZpdGEgOiAxIDogNDAzNi4wCisgR29yaiA6IDEgOiA1NjQxLjAKKyBNZWhlZGludGkgOiAxIDogNDkwMC4wCisgT2x0IDogMSA6IDU1MDcuMAorIElhbG9taXRhIDogMSA6IDQ0NDkuMAorIENhbGFyYXNpIDogMSA6IDUwNzQuMAorIEJ1Y3VyZXN0aSA6IDEgOiAxODIwLjAKKyBEb2xqIDogMSA6IDc0MTMuMAorIENvbnN0YW50YSA6IDEgOiA3MDU1LjAKKyBHaXVyZ2l1IDogMSA6IDM1MTEuMAorIFRlbGVvcm1hbiA6IDEgOiA1NzYwLjAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9ST01BTklBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1JPTUFOSUFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhZDkzNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9ST01BTklBX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsNDEgQEAKKyBCb3Rvc2FuaSA6IDEgOiA0NzAwMTEKKyBTYXR1IE1hcmUgOiAxIDogNDE2ODg5CisgTWFyYW11cmVzIDogMSA6IDU1OTk4OQorIFN1Y2VhdmEgOiAxIDogNzA2MTUyCisgQmlzdHJpdGEtTmFzYXVkIDogMSA6IDMyOTI1OQorIEJpaG9yIDogMSA6IDY2MDEzMQorIElhc2kgOiAxIDogODIxODAxCisgU2FsYWogOiAxIDogMjY5NTY2CisgQ2x1aiA6IDEgOiA3NDQwNDkKKyBOZWFtdCA6IDEgOiA1OTAwMDAKKyBIYXJnaGl0YSA6IDEgOiAzNjE4NTYKKyBNdXJlcyA6IDEgOiA2MjE0OTMKKyBWYXNsdWkgOiAxIDogNDY4OTIxCisgQmFjYXUgOiAxIDogNzQzMzIzCisgQXJhZCA6IDEgOiA1MDgzMDIKKyBBbGJhIDogMSA6IDQyNDI1OAorIEh1bmVkb2FyYSA6IDEgOiA1Njc3NTQKKyBDb3Zhc25hIDogMSA6IDIzNzY2OQorIFNpYml1IDogMSA6IDUwMTU0NgorIFRpbWlzIDogMSA6IDcyMjQyNgorIEJyYXNvdiA6IDEgOiA2OTY0NDEKKyBWcmFuY2VhIDogMSA6IDM5NDkwMQorIEdhbGF0aSA6IDEgOiA2NTE0ODQKKyBCdXphdSA6IDEgOiA1MjEzMzQKKyBDYXJhcy1TZXZlcmluIDogMSA6IDQwMzIzNQorIEFyZ2VzIDogMSA6IDY4MTczNQorIFZpbGNlYSA6IDEgOiA0MzI5NTkKKyBQcmFob3ZhIDogMSA6IDg4MDQ2NQorIEJyYWlsYSA6IDEgOiA0MDM4NTYKKyBUdWxjZWEgOiAxIDogMjcwODg2CisgRGltYm92aXRhIDogMSA6IDU2ODEzNAorIEdvcmogOiAxIDogMzg4NjIxCisgTWVoZWRpbnRpIDogMSA6IDMyNzIzOQorIE9sdCA6IDEgOiA1MzA0MjUKKyBJYWxvbWl0YSA6IDEgOiAzMDQ0NjQKKyBDYWxhcmFzaSA6IDEgOiAzNDE2MzEKKyBCdWN1cmVzdGkgOiAxIDogMjM3NTY3OQorIERvbGogOiAxIDogNzc2MTYxCisgQ29uc3RhbnRhIDogMSA6IDc1Nzk0MQorIEdpdXJnaXUgOiAxIDogMzE0OTQ1CisgVGVsZW9ybWFuIDogMSA6IDQ5NDMyMgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1JVU1NJQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9SVVNTSUFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2YWMzNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9SVVNTSUFfQVJFQS50eHQKQEAgLTAsMCArMSw1MzQ5IEBACitSVS1VTkstMSA6IDEgOiAyOTcuODk5OTkKK1JVLVVOSy0yIDogMSA6IDI3OC41CitSVS1VTkstMyA6IDEgOiAxLjAKK1JVLVVOSy00IDogMSA6IDMyLjU5OTk5OAorUlUtVU5LLTUgOiAxIDogMS41CitSVS1VTkstNiA6IDEgOiAzLjQwMDAwMDEKK1JVLVVOSy03IDogMSA6IDEuMAorUlUtVU5LLTggOiAxIDogMzkuMDk5OTk4CitSVS1VTkstOSA6IDEgOiAzNDQuNzk5OTkKK1JVLVVOSy0xMCA6IDEgOiAxLjAKK1JVLVVOSy0xMSA6IDEgOiA0LjMwMDAwMDIKK1JVLVVOSy0xMiA6IDEgOiAxLjQKK1JVLVVOSy0xMyA6IDEgOiAxNDEuMTAwMDEKK1JVLVVOSy0xNCA6IDEgOiA1MTAuNjAwMDEKK1JVLVVOSy0xNSA6IDEgOiAyLjAKK1JVLVVOSy0xNiA6IDEgOiAxLjAKK1JVLVVOSy0xNyA6IDEgOiAxMC40CitSVS1VTkstMTggOiAxIDogNTcuNzk5OTk5CitSVS1VTkstMTkgOiAxIDogODcyNy41OTk2CitSVS1VTkstMjAgOiAxIDogMS41CitSVS1VTkstMjEgOiAxIDogMS4wCitSVS1VTkstMjIgOiAxIDogMTYyLjEwMDAxCitSVS1VTkstMjMgOiAxIDogNDMuMDk5OTk4CitSVS1VTkstMjQgOiAxIDogNDI5LjAKK1JVLVVOSy0yNSA6IDEgOiAxLjcKK1JVLVVOSy0yNiA6IDEgOiAxLjAKK1JVLVVOSy0yNyA6IDEgOiAxNjU0LjkKK1JVLVVOSy0yOCA6IDEgOiAxMTMuMAorUlUtVU5LLTI5IDogMSA6IDI1LjQKK1JVLVVOSy0zMCA6IDEgOiA0MjUuNQorUlUtVU5LLTMxIDogMSA6IDQwOC41CitSVS1VTkstMzIgOiAxIDogOTMyLjA5OTk4CitSVS1VTkstMzMgOiAxIDogNC4xOTk5OTk4CitSVS1VTkstMzQgOiAxIDogMjcuMQorUlUtVU5LLTM1IDogMSA6IDE1MC41CitSVS1VTkstMzYgOiAxIDogMi41CitSVS1VTkstMzcgOiAxIDogMS4wCitSVS1VTkstMzggOiAxIDogOC44OTk5OTk2CitSVS1VTkstMzkgOiAxIDogMjg0LjI5OTk5CitSVS1VTkstNDAgOiAxIDogMi4wCitSVS1VTkstNDEgOiAxIDogMjc0NC43CitSVS1VTkstNDIgOiAxIDogMjM2LjMKK1JVLVVOSy00MyA6IDEgOiAzMzYuMzk5OTkKK1JVLVVOSy00NCA6IDEgOiAxLjAKK1JVLVVOSy00NSA6IDEgOiAyMDM1LjYKK1JVLVVOSy00NiA6IDEgOiAxMDYzLjEKK1JVLVVOSy00NyA6IDEgOiAzNTEuODk5OTkKK1JVLVVOSy00OCA6IDEgOiAxLjAKK1JVLVVOSy00OSA6IDEgOiAxLjMKK1JVLVVOSy01MCA6IDEgOiAxLjAKK1JVLVVOSy01MSA6IDEgOiAxLjAKK1JVLVVOSy01MiA6IDEgOiA3My45MDAwMDIKK1JVLVVOSy01MyA6IDEgOiAxLjUKK1JVLVVOSy01NCA6IDEgOiAxLjAKK1JVLVVOSy01NSA6IDEgOiAxMTEuMworUlUtVU5LLTU2IDogMSA6IDIxLjIwMDAwMQorUlUtVU5LLTU3IDogMSA6IDE1My4zOTk5OQorUlUtVU5LLTU4IDogMSA6IDQuMzAwMDAwMgorUlUtVU5LLTU5IDogMSA6IDU4LjI5OTk5OQorUlUtVU5LLTYwIDogMSA6IDYuOTAwMDAwMQorUlUtVU5LLTYxIDogMSA6IDEwLjYKK1JVLVVOSy02MiA6IDEgOiA1Ny4wCitSVS1VTkstNjMgOiAxIDogOTc2LjcwMDAxCitSVS1VTkstNjQgOiAxIDogMjUuMjk5OTk5CitSVS1VTkstNjUgOiAxIDogNDIuNDAwMDAyCitSVS1VTkstNjYgOiAxIDogMTQuMAorUlUtVU5LLTY3IDogMSA6IDUwNS41CitSVS1VTkstNjggOiAxIDogMS4xCitSVS1VTkstNjkgOiAxIDogNS4wOTk5OTk5CitSVS1VTkstNzAgOiAxIDogMjAuMQorUlUtVU5LLTcxIDogMSA6IDYzNC43OTk5OQorUlUtVU5LLTcyIDogMSA6IDEuMAorUlUtVU5LLTczIDogMSA6IDEuMworUlUtVU5LLTc0IDogMSA6IDIuMAorUlUtVU5LLTc1IDogMSA6IDExLjcKK1JVLVVOSy03NiA6IDEgOiA3My4wCitSVS1VTkstNzcgOiAxIDogNjIuNQorUlUtVU5LLTc4IDogMSA6IDQuNjk5OTk5OAorUlUtVU5LLTc5IDogMSA6IDIuNTk5OTk5OQorUlUtVU5LLTgwIDogMSA6IDE4Ni4wCitSVS1VTkstODEgOiAxIDogMTkuNgorUlUtVU5LLTgyIDogMSA6IDEyLjEKK1JVLVVOSy04MyA6IDEgOiAxNDA0Ny4wCitSVS1VTkstODQgOiAxIDogNC44MDAwMDAyCitSVS1VTkstODUgOiAxIDogMS4xCitSVS1VTkstODYgOiAxIDogNi41OTk5OTk5CitSVS1VTkstODcgOiAxIDogMS4wCitSVS1VTkstODggOiAxIDogNC4zMDAwMDAyCitSVS1VTkstODkgOiAxIDogMi4yCitSVS1VTkstOTAgOiAxIDogMjczLjYwMDAxCitSVS1VTkstOTEgOiAxIDogMS4wCitSVS1VTkstOTIgOiAxIDogNDMuNQorUlUtVU5LLTkzIDogMSA6IDEuMAorUlUtVU5LLTk0IDogMSA6IDI2MS44OTk5OQorUlUtVU5LLTk1IDogMSA6IDEuMgorUlUtVU5LLTk2IDogMSA6IDE1MzAuNworUlUtVU5LLTk3IDogMSA6IDYuNjk5OTk5OAorUlUtVU5LLTk4IDogMSA6IDMyLjUKK1JVLVVOSy05OSA6IDEgOiAyLjIKK1JVLVVOSy0xMDAgOiAxIDogNS41OTk5OTk5CitSVS1VTkstMTAxIDogMSA6IDIuMworUlUtVU5LLTEwMiA6IDEgOiAxLjgKK1JVLVVOSy0xMDMgOiAxIDogMS4wCitSVS1VTkstMTA0IDogMSA6IDEuNgorUlUtVU5LLTEwNSA6IDEgOiAxLjAKK1JVLVVOSy0xMDYgOiAxIDogMS4wCitSVS1VTkstMTA3IDogMSA6IDQ4LjI5OTk5OQorUlUtVU5LLTEwOCA6IDEgOiAxLjAKK1JVLVVOSy0xMDkgOiAxIDogMS4yCitSVS1VTkstMTEwIDogMSA6IDEzLjIKK1JVLVVOSy0xMTEgOiAxIDogMS4wCitSVS1VTkstMTEyIDogMSA6IDEuNgorUlUtVU5LLTExMyA6IDEgOiAxLjQKK1JVLVVOSy0xMTQgOiAxIDogMS4wCitSVS1VTkstMTE1IDogMSA6IDMyLjIwMDAwMQorUlUtVU5LLTExNiA6IDEgOiAxLjAKK1JVLVVOSy0xMTcgOiAxIDogMjgwLjAKK1JVLVVOSy0xMTggOiAxIDogMS4wCitSVS1VTkstMTE5IDogMSA6IDEuNAorUlUtVU5LLTEyMCA6IDEgOiAxLjAKK1JVLVVOSy0xMjEgOiAxIDogMjIuMjAwMDAxCitSVS1VTkstMTIyIDogMSA6IDMuMgorUlUtVU5LLTEyMyA6IDEgOiAxMC44CitSVS1VTkstMTI0IDogMSA6IDEuMAorUlUtVU5LLTEyNSA6IDEgOiAxMS41CitSVS1VTkstMTI2IDogMSA6IDEuMAorUlUtVU5LLTEyNyA6IDEgOiA0LjUKK1JVLVVOSy0xMjggOiAxIDogMzQuNQorUlUtVU5LLTEyOSA6IDEgOiAxLjAKK1JVLVVOSy0xMzAgOiAxIDogMzAuNgorUlUtVU5LLTEzMSA6IDEgOiAxMDU4Mi43CitSVS1VTkstMTMyIDogMSA6IDEuMAorUlUtVU5LLTEzMyA6IDEgOiAyLjU5OTk5OTkKK1JVLVVOSy0xMzQgOiAxIDogMS4wCitSVS1VTkstMTM1IDogMSA6IDEyLjQKK1JVLVVOSy0xMzYgOiAxIDogMS40CitSVS1VTkstMTM3IDogMSA6IDEuNQorUlUtVU5LLTEzOCA6IDEgOiAxMi4yCitSVS1VTkstMTM5IDogMSA6IDEuMAorUlUtVU5LLTE0MCA6IDEgOiA2LjAKK1JVLVVOSy0xNDEgOiAxIDogMS4yCitSVS1VTkstMTQyIDogMSA6IDEuMQorUlUtVU5LLTE0MyA6IDEgOiAyLjQwMDAwMDEKK1JVLVVOSy0xNDQgOiAxIDogMS4wCitSVS1VTkstMTQ1IDogMSA6IDEuMAorUlUtVU5LLTE0NiA6IDEgOiA0LjY5OTk5OTgKK1JVLVVOSy0xNDcgOiAxIDogMS4wCitSVS1VTkstMTQ4IDogMSA6IDEuMAorUlUtVU5LLTE0OSA6IDEgOiAxLjAKK1JVLVVOSy0xNTAgOiAxIDogMS4wCitSVS1VTkstMTUxIDogMSA6IDcuMzAwMDAwMgorUlUtVU5LLTE1MiA6IDEgOiAxLjQKK1JVLVVOSy0xNTMgOiAxIDogMy4wCitSVS1VTkstMTU0IDogMSA6IDEuMQorUlUtVU5LLTE1NSA6IDEgOiAyLjIKK1JVLVVOSy0xNTYgOiAxIDogMS41CitSVS1VTkstMTU3IDogMSA6IDEuNQorUlUtVU5LLTE1OCA6IDEgOiAxLjAKK1JVLVVOSy0xNTkgOiAxIDogMTA0LjIKK1JVLVVOSy0xNjAgOiAxIDogNC40MDAwMDAxCitSVS1VTkstMTYxIDogMSA6IDEuMAorUlUtVU5LLTE2MiA6IDEgOiAxLjAKK1JVLVVOSy0xNjMgOiAxIDogMTQuOAorUlUtVU5LLTE2NCA6IDEgOiAyNDguNworUlUtVU5LLTE2NSA6IDEgOiAxLjMKK1JVLVVOSy0xNjYgOiAxIDogMS4wCitSVS1VTkstMTY3IDogMSA6IDEuMAorUlUtVU5LLTE2OCA6IDEgOiAxLjAKK1JVLVVOSy0xNjkgOiAxIDogMS4wCitSVS1VTkstMTcwIDogMSA6IDEuMAorUlUtVU5LLTE3MSA6IDEgOiAxLjAKK1JVLVVOSy0xNzIgOiAxIDogMS4wCitSVS1VTkstMTczIDogMSA6IDEuMAorUlUtVU5LLTE3NCA6IDEgOiAyLjU5OTk5OTkKK1JVLVVOSy0xNzUgOiAxIDogMy4zCitSVS1VTkstMTc2IDogMSA6IDUuNDAwMDAwMQorUlUtVU5LLTE3NyA6IDEgOiAyNC4yMDAwMDEKK1JVLVVOSy0xNzggOiAxIDogMi44CitSVS1VTkstMTc5IDogMSA6IDEuMworUlUtVU5LLTE4MCA6IDEgOiAyLjIKK1JVLVVOSy0xODEgOiAxIDogMzIuNQorUlUtVU5LLTE4MiA6IDEgOiAxLjAKK1JVLVVOSy0xODMgOiAxIDogNDguNDAwMDAyCitSVS1VTkstMTg0IDogMSA6IDYuMAorUlUtVU5LLTE4NSA6IDEgOiAxLjgKK1JVLVVOSy0xODYgOiAxIDogMi4wCitSVS1VTkstMTg3IDogMSA6IDEuMgorUlUtVU5LLTE4OCA6IDEgOiA5Mi4wOTk5OTgKK1JVLVVOSy0xODkgOiAxIDogNy45MDAwMDAxCitSVS1VTkstMTkwIDogMSA6IDguODk5OTk5NgorUlUtVU5LLTE5MSA6IDEgOiA4LjMwMDAwMDIKK1JVLVVOSy0xOTIgOiAxIDogMi4wCitSVS1VTkstMTkzIDogMSA6IDE0My4zCitSVS1VTkstMTk0IDogMSA6IDEuMAorUlUtVU5LLTE5NSA6IDEgOiAyNC45CitSVS1VTkstMTk2IDogMSA6IDEuMAorUlUtVU5LLTE5NyA6IDEgOiA1LjAKK1JVLVVOSy0xOTggOiAxIDogNC40MDAwMDAxCitSVS1VTkstMTk5IDogMSA6IDEuNgorUlUtVU5LLTIwMCA6IDEgOiAzMjMuNzk5OTkKK1JVLVVOSy0yMDEgOiAxIDogMS4xCitSVS1VTkstMjAyIDogMSA6IDcuMzAwMDAwMgorUlUtVU5LLTIwMyA6IDEgOiAxLjYKK1JVLVVOSy0yMDQgOiAxIDogNTkuNQorUlUtVU5LLTIwNSA6IDEgOiAxNy4yOTk5OTkKK1JVLVVOSy0yMDYgOiAxIDogMS4yCitSVS1VTkstMjA3IDogMSA6IDEuMgorUlUtVU5LLTIwOCA6IDEgOiAxLjAKK1JVLVVOSy0yMDkgOiAxIDogMS4wCitSVS1VTkstMjEwIDogMSA6IDEuMworUlUtVU5LLTIxMSA6IDEgOiAyLjA5OTk5OTkKK1JVLVVOSy0yMTIgOiAxIDogMS4wCitSVS1VTkstMjEzIDogMSA6IDQuMzAwMDAwMgorUlUtVU5LLTIxNCA6IDEgOiAyNC41CitSVS1VTkstMjE1IDogMSA6IDQ1OTI0LjY5OQorUlUtVU5LLTIxNiA6IDEgOiAxLjAKK1JVLVVOSy0yMTcgOiAxIDogMS4wCitSVS1VTkstMjE4IDogMSA6IDEuNQorUlUtVU5LLTIxOSA6IDEgOiAxLjAKK1JVLVVOSy0yMjAgOiAxIDogMS4wCitSVS1VTkstMjIxIDogMSA6IDcuMDk5OTk5OQorUlUtVU5LLTIyMiA6IDEgOiAxLjYKK1JVLVVOSy0yMjMgOiAxIDogNi41CitSVS1VTkstMjI0IDogMSA6IDQ3LjQwMDAwMgorUlUtVU5LLTIyNSA6IDEgOiAxLjAKK1JVLVVOSy0yMjYgOiAxIDogMS4wCitSVS1VTkstMjI3IDogMSA6IDcuOTAwMDAwMQorUlUtVU5LLTIyOCA6IDEgOiAyLjU5OTk5OTkKK1JVLVVOSy0yMjkgOiAxIDogMS4wCitSVS1VTkstMjMwIDogMSA6IDMuNDAwMDAwMQorUlUtVU5LLTIzMSA6IDEgOiAxLjgKK1JVLVVOSy0yMzIgOiAxIDogNi40MDAwMDAxCitSVS1VTkstMjMzIDogMSA6IDcuOTAwMDAwMQorUlUtVU5LLTIzNCA6IDEgOiAxLjAKK1JVLVVOSy0yMzUgOiAxIDogMTMuOQorUlUtVU5LLTIzNiA6IDEgOiAyLjUKK1JVLVVOSy0yMzcgOiAxIDogMS4wCitSVS1VTkstMjM4IDogMSA6IDEuOAorUlUtVU5LLTIzOSA6IDEgOiA0LjA5OTk5OTkKK1JVLVVOSy0yNDAgOiAxIDogOS4zMDAwMDAyCitSVS1VTkstMjQxIDogMSA6IDYuMAorUlUtVU5LLTI0MiA6IDEgOiAxLjQKK1JVLVVOSy0yNDMgOiAxIDogMS4wCitSVS1VTkstMjQ0IDogMSA6IDM2LjAKK1JVLVVOSy0yNDUgOiAxIDogMS4wCitSVS1VTkstMjQ2IDogMSA6IDEuMgorUlUtVU5LLTI0NyA6IDEgOiAxNDAuMzk5OTkKK1JVLVVOSy0yNDggOiAxIDogNS4wCitSVS1VTkstMjQ5IDogMSA6IDEyLjUKK1JVLVVOSy0yNTAgOiAxIDogMS4wCitSVS1VTkstMjUxIDogMSA6IDEuMAorUlUtVU5LLTI1MiA6IDEgOiA1LjY5OTk5OTgKK1JVLVVOSy0yNTMgOiAxIDogMTUuMgorUlUtVU5LLTI1NCA6IDEgOiAxLjAKK1JVLVVOSy0yNTUgOiAxIDogMS4wCitSVS1VTkstMjU2IDogMSA6IDMuMgorUlUtVU5LLTI1NyA6IDEgOiAxNS4xCitSVS1VTkstMjU4IDogMSA6IDIuNTk5OTk5OQorUlUtVU5LLTI1OSA6IDEgOiAzMy41CitSVS1VTkstMjYwIDogMSA6IDQuNQorUlUtVU5LLTI2MSA6IDEgOiA4LjM5OTk5OTYKK1JVLVVOSy0yNjIgOiAxIDogNjEuMjk5OTk5CitSVS1VTkstMjYzIDogMSA6IDc3LjQwMDAwMgorUlUtVU5LLTI2NCA6IDEgOiA0MC45MDAwMDIKK1JVLVVOSy0yNjUgOiAxIDogMS4wCitSVS1VTkstMjY2IDogMSA6IDEuMAorUlUtVU5LLTI2NyA6IDEgOiAxMy4wCitSVS1VTkstMjY4IDogMSA6IDUuNjk5OTk5OAorUlUtVU5LLTI2OSA6IDEgOiAxLjAKK1JVLVVOSy0yNzAgOiAxIDogNy44MDAwMDAyCitSVS1VTkstMjcxIDogMSA6IDIxMS42MDAwMQorUlUtVU5LLTI3MiA6IDEgOiAxLjMKK1JVLVVOSy0yNzMgOiAxIDogMzEuNQorUlUtVU5LLTI3NCA6IDEgOiAxLjEKK1JVLVVOSy0yNzUgOiAxIDogMS41CitSVS1VTkstMjc2IDogMSA6IDMuOAorUlUtVU5LLTI3NyA6IDEgOiAxLjkKK1JVLVVOSy0yNzggOiAxIDogMS40CitSVS1VTkstMjc5IDogMSA6IDcuNDAwMDAwMQorUlUtVU5LLTI4MCA6IDEgOiAyLjUKK1JVLVVOSy0yODEgOiAxIDogMi43CitSVS1VTkstMjgyIDogMSA6IDExLjEKK1JVLVVOSy0yODMgOiAxIDogNC41CitSVS1VTkstMjg0IDogMSA6IDEuNgorUlUtVU5LLTI4NSA6IDEgOiAxLjkKK1JVLVVOSy0yODYgOiAxIDogNC41OTk5OTk5CitSVS1VTkstMjg3IDogMSA6IDEuMAorUlUtVU5LLTI4OCA6IDEgOiA1LjU5OTk5OTkKK1JVLVVOSy0yODkgOiAxIDogOS44OTk5OTk2CitSVS1VTkstMjkwIDogMSA6IDIwLjI5OTk5OQorUlUtVU5LLTI5MSA6IDEgOiAyLjIKK1JVLVVOSy0yOTIgOiAxIDogMi4zCitSVS1VTkstMjkzIDogMSA6IDIuNworUlUtVU5LLTI5NCA6IDEgOiAxLjAKK1JVLVVOSy0yOTUgOiAxIDogMS4wCitSVS1VTkstMjk2IDogMSA6IDEuMAorUlUtVU5LLTI5NyA6IDEgOiA0Ni4wOTk5OTgKK1JVLVVOSy0yOTggOiAxIDogMS41CitSVS1VTkstMjk5IDogMSA6IDEuOAorUlUtVU5LLTMwMCA6IDEgOiAyLjUKK1JVLVVOSy0zMDEgOiAxIDogMS4yCitSVS1VTkstMzAyIDogMSA6IDIuNworUlUtVU5LLTMwMyA6IDEgOiAxLjIKK1JVLVVOSy0zMDQgOiAxIDogMy41OTk5OTk5CitSVS1VTkstMzA1IDogMSA6IDEuNQorUlUtVU5LLTMwNiA6IDEgOiA0LjkwMDAwMDEKK1JVLVVOSy0zMDcgOiAxIDogNy42OTk5OTk4CitSVS1VTkstMzA4IDogMSA6IDg1LjQwMDAwMgorUlUtVU5LLTMwOSA6IDEgOiAyNS43OTk5OTkKK1JVLVVOSy0zMTAgOiAxIDogMzk4LjcwMDAxCitSVS1VTkstMzExIDogMSA6IDEuMAorUlUtVU5LLTMxMiA6IDEgOiAxLjAKK1JVLVVOSy0zMTMgOiAxIDogNi4wOTk5OTk5CitSVS1VTkstMzE0IDogMSA6IDMuNworUlUtVU5LLTMxNSA6IDEgOiA1My41OTk5OTgKK1JVLVVOSy0zMTYgOiAxIDogMy4yCitSVS1VTkstMzE3IDogMSA6IDIuNworUlUtVU5LLTMxOCA6IDEgOiA0LjAKK1JVLVVOSy0zMTkgOiAxIDogMy4wCitSVS1VTkstMzIwIDogMSA6IDEuMAorUlUtVU5LLTMyMSA6IDEgOiAxLjAKK1JVLVVOSy0zMjIgOiAxIDogNC4xOTk5OTk4CitSVS1VTkstMzIzIDogMSA6IDI0Ljc5OTk5OQorUlUtVU5LLTMyNCA6IDEgOiAyNDY2OS40CitSVS1VTkstMzI1IDogMSA6IDEuMAorUlUtVU5LLTMyNiA6IDEgOiA2MS4yMDAwMDEKK1JVLVVOSy0zMjcgOiAxIDogMS41CitSVS1VTkstMzI4IDogMSA6IDY2LjkwMDAwMgorUlUtVU5LLTMyOSA6IDEgOiAxLjAKK1JVLVVOSy0zMzAgOiAxIDogMS4wCitSVS1VTkstMzMxIDogMSA6IDEuNAorUlUtVU5LLTMzMiA6IDEgOiAxLjAKK1JVLVVOSy0zMzMgOiAxIDogOTIuNDAwMDAyCitSVS1VTkstMzM0IDogMSA6IDQuMTk5OTk5OAorUlUtVU5LLTMzNSA6IDEgOiAxLjMKK1JVLVVOSy0zMzYgOiAxIDogMS4wCitSVS1VTkstMzM3IDogMSA6IDEuMAorUlUtVU5LLTMzOCA6IDEgOiAxLjMKK1JVLVVOSy0zMzkgOiAxIDogMS4wCitSVS1VTkstMzQwIDogMSA6IDEuMgorUlUtVU5LLTM0MSA6IDEgOiAxLjAKK1JVLVVOSy0zNDIgOiAxIDogMS4wCitSVS1VTkstMzQzIDogMSA6IDEuMAorUlUtVU5LLTM0NCA6IDEgOiAxLjAKK1JVLVVOSy0zNDUgOiAxIDogMS4wCitSVS1VTkstMzQ2IDogMSA6IDEuMAorUlUtVU5LLTM0NyA6IDEgOiA5LjEwMDAwMDQKK1JVLVVOSy0zNDggOiAxIDogNC4xOTk5OTk4CitSVS1VTkstMzQ5IDogMSA6IDguMzAwMDAwMgorUlUtVU5LLTM1MCA6IDEgOiAxLjAKK1JVLVVOSy0zNTEgOiAxIDogMS4wCitSVS1VTkstMzUyIDogMSA6IDkuNQorUlUtVU5LLTM1MyA6IDEgOiA4LjYwMDAwMDQKK1JVLVVOSy0zNTQgOiAxIDogMTAxLjUKK1JVLVVOSy0zNTUgOiAxIDogNy42OTk5OTk4CitSVS1VTkstMzU2IDogMSA6IDMwLjYKK1JVLVVOSy0zNTcgOiAxIDogNTguMjk5OTk5CitSVS1VTkstMzU4IDogMSA6IDEuMQorUlUtVU5LLTM1OSA6IDEgOiAxLjAKK1JVLVVOSy0zNjAgOiAxIDogMS44CitSVS1VTkstMzYxIDogMSA6IDE2LjQKK1JVLVVOSy0zNjIgOiAxIDogNTI2LjkwMDAyCitSVS1VTkstMzYzIDogMSA6IDQuOTAwMDAwMQorUlUtVU5LLTM2NCA6IDEgOiAxMy44CitSVS1VTkstMzY1IDogMSA6IDIuOTAwMDAwMQorUlUtVU5LLTM2NiA6IDEgOiAxLjAKK1JVLVVOSy0zNjcgOiAxIDogMS4wCitSVS1VTkstMzY4IDogMSA6IDEuMAorUlUtVU5LLTM2OSA6IDEgOiAxLjAKK1JVLVVOSy0zNzAgOiAxIDogMi40MDAwMDAxCitSVS1VTkstMzcxIDogMSA6IDEuMAorUlUtVU5LLTM3MiA6IDEgOiAyLjMKK1JVLVVOSy0zNzMgOiAxIDogMS4xCitSVS1VTkstMzc0IDogMSA6IDEuMAorUlUtVU5LLTM3NSA6IDEgOiA1LjY5OTk5OTgKK1JVLVVOSy0zNzYgOiAxIDogMS43CitSVS1VTkstMzc3IDogMSA6IDYyMTYuNjAwMQorUlUtVU5LLTM3OCA6IDEgOiAxLjAKK1JVLVVOSy0zNzkgOiAxIDogMS4wCitSVS1VTkstMzgwIDogMSA6IDEuNAorUlUtVU5LLTM4MSA6IDEgOiA3LjMwMDAwMDIKK1JVLVVOSy0zODIgOiAxIDogNDguMjAwMDAxCitSVS1VTkstMzgzIDogMSA6IDEyLjMKK1JVLVVOSy0zODQgOiAxIDogMjU5LjM5OTk5CitSVS1VTkstMzg1IDogMSA6IDEuMAorUlUtVU5LLTM4NiA6IDEgOiA3LjQwMDAwMDEKK1JVLVVOSy0zODcgOiAxIDogMS4wCitSVS1VTkstMzg4IDogMSA6IDEuMAorUlUtVU5LLTM4OSA6IDEgOiAzLjUKK1JVLVVOSy0zOTAgOiAxIDogMS4wCitSVS1VTkstMzkxIDogMSA6IDUuNTk5OTk5OQorUlUtVU5LLTM5MiA6IDEgOiAxMS4yCitSVS1VTkstMzkzIDogMSA6IDQuOTAwMDAwMQorUlUtVU5LLTM5NCA6IDEgOiAyNTMuMzk5OTkKK1JVLVVOSy0zOTUgOiAxIDogMy4wCitSVS1VTkstMzk2IDogMSA6IDEuNgorUlUtVU5LLTM5NyA6IDEgOiAxLjkKK1JVLVVOSy0zOTggOiAxIDogMS4yCitSVS1VTkstMzk5IDogMSA6IDEuMAorUlUtVU5LLTQwMCA6IDEgOiA1LjkwMDAwMDEKK1JVLVVOSy00MDEgOiAxIDogNC40MDAwMDAxCitSVS1VTkstNDAyIDogMSA6IDYuMAorUlUtVU5LLTQwMyA6IDEgOiAyOC4wCitSVS1VTkstNDA0IDogMSA6IDMuMgorUlUtVU5LLTQwNSA6IDEgOiA1NS4wCitSVS1VTkstNDA2IDogMSA6IDIuMDk5OTk5OQorUlUtVU5LLTQwNyA6IDEgOiAxLjIKK1JVLVVOSy00MDggOiAxIDogMi4wCitSVS1VTkstNDA5IDogMSA6IDEuNAorUlUtVU5LLTQxMCA6IDEgOiA4MC45MDAwMDIKK1JVLVVOSy00MTEgOiAxIDogOC4wCitSVS1VTkstNDEyIDogMSA6IDIuMDk5OTk5OQorUlUtVU5LLTQxMyA6IDEgOiAxLjAKK1JVLVVOSy00MTQgOiAxIDogNS4wCitSVS1VTkstNDE1IDogMSA6IDczLjY5OTk5NworUlUtVU5LLTQxNiA6IDEgOiA5LjE5OTk5OTgKK1JVLVVOSy00MTcgOiAxIDogMTQxLjg5OTk5CitSVS1VTkstNDE4IDogMSA6IDE5LjI5OTk5OQorUlUtVU5LLTQxOSA6IDEgOiAxLjAKK1JVLVVOSy00MjAgOiAxIDogNi4wOTk5OTk5CitSVS1VTkstNDIxIDogMSA6IDEzMi4yCitSVS1VTkstNDIyIDogMSA6IDguMTk5OTk5OAorUlUtVU5LLTQyMyA6IDEgOiAxODk0LjkKK1JVLVVOSy00MjQgOiAxIDogMS4wCitSVS1VTkstNDI1IDogMSA6IDEuMAorUlUtVU5LLTQyNiA6IDEgOiAxLjAKK1JVLVVOSy00MjcgOiAxIDogNzguMzAwMDAzCitSVS1VTkstNDI4IDogMSA6IDQuNTk5OTk5OQorUlUtVU5LLTQyOSA6IDEgOiAxLjAKK1JVLVVOSy00MzAgOiAxIDogMS42CitSVS1VTkstNDMxIDogMSA6IDMuNworUlUtVU5LLTQzMiA6IDEgOiAxLjAKK1JVLVVOSy00MzMgOiAxIDogMTMuMAorUlUtVU5LLTQzNCA6IDEgOiAxLjAKK1JVLVVOSy00MzUgOiAxIDogMS4wCitSVS1VTkstNDM2IDogMSA6IDEuOQorUlUtVU5LLTQzNyA6IDEgOiAzMy41CitSVS1VTkstNDM4IDogMSA6IDEuMAorUlUtVU5LLTQzOSA6IDEgOiAxLjAKK1JVLVVOSy00NDAgOiAxIDogMTIuNQorUlUtVU5LLTQ0MSA6IDEgOiAxLjMKK1JVLVVOSy00NDIgOiAxIDogNC44MDAwMDAyCitSVS1VTkstNDQzIDogMSA6IDEuMAorUlUtVU5LLTQ0NCA6IDEgOiAxOS4wCitSVS1VTkstNDQ1IDogMSA6IDQuMDk5OTk5OQorUlUtVU5LLTQ0NiA6IDEgOiAzLjQwMDAwMDEKK1JVLVVOSy00NDcgOiAxIDogMS4xCitSVS1VTkstNDQ4IDogMSA6IDIuMworUlUtVU5LLTQ0OSA6IDEgOiAyMC4xCitSVS1VTkstNDUwIDogMSA6IDkuNjk5OTk5OAorUlUtVU5LLTQ1MSA6IDEgOiAxLjgKK1JVLVVOSy00NTIgOiAxIDogMS4wCitSVS1VTkstNDUzIDogMSA6IDEuMAorUlUtVU5LLTQ1NCA6IDEgOiAxLjAKK1JVLVVOSy00NTUgOiAxIDogODkxLjc5OTk5CitSVS1VTkstNDU2IDogMSA6IDMwNS4zOTk5OQorUlUtVU5LLTQ1NyA6IDEgOiA0MS43OTk5OTkKK1JVLVVOSy00NTggOiAxIDogMS4xCitSVS1VTkstNDU5IDogMSA6IDEuMAorUlUtVU5LLTQ2MCA6IDEgOiAxLjAKK1JVLVVOSy00NjEgOiAxIDogMS45CitSVS1VTkstNDYyIDogMSA6IDkwLjAKK1JVLVVOSy00NjMgOiAxIDogMTA5LjEKK1JVLVVOSy00NjQgOiAxIDogMS4wCitSVS1VTkstNDY1IDogMSA6IDEuMAorUlUtVU5LLTQ2NiA6IDEgOiAxLjAKK1JVLVVOSy00NjcgOiAxIDogMS4wCitSVS1VTkstNDY4IDogMSA6IDEzLjkKK1JVLVVOSy00NjkgOiAxIDogMS4wCitSVS1VTkstNDcwIDogMSA6IDEuMAorUlUtVU5LLTQ3MSA6IDEgOiAxLjAKK1JVLVVOSy00NzIgOiAxIDogMS42CitSVS1VTkstNDczIDogMSA6IDEuMQorUlUtVU5LLTQ3NCA6IDEgOiAyLjAKK1JVLVVOSy00NzUgOiAxIDogMTcuNAorUlUtVU5LLTQ3NiA6IDEgOiAzLjcKK1JVLVVOSy00NzcgOiAxIDogMy45MDAwMDAxCitSVS1VTkstNDc4IDogMSA6IDEuMAorUlUtVU5LLTQ3OSA6IDEgOiAxLjgKK1JVLVVOSy00ODAgOiAxIDogNjEuMjAwMDAxCitSVS1VTkstNDgxIDogMSA6IDEuOAorUlUtVU5LLTQ4MiA6IDEgOiA5LjgwMDAwMDIKK1JVLVVOSy00ODMgOiAxIDogMTAuOQorUlUtVU5LLTQ4NCA6IDEgOiAxLjAKK1JVLVVOSy00ODUgOiAxIDogNS45MDAwMDAxCitSVS1VTkstNDg2IDogMSA6IDI5LjEKK1JVLVVOSy00ODcgOiAxIDogMS4yCitSVS1VTkstNDg4IDogMSA6IDI1LjcwMDAwMQorUlUtVU5LLTQ4OSA6IDEgOiAyLjA5OTk5OTkKK1JVLVVOSy00OTAgOiAxIDogMS4wCitSVS1VTkstNDkxIDogMSA6IDIuMAorUlUtVU5LLTQ5MiA6IDEgOiA2Ni42OTk5OTcKK1JVLVVOSy00OTMgOiAxIDogMS4wCitSVS1VTkstNDk0IDogMSA6IDUyODcuNQorUlUtVU5LLTQ5NSA6IDEgOiAxLjAKK1JVLVVOSy00OTYgOiAxIDogMTAuOQorUlUtVU5LLTQ5NyA6IDEgOiAxLjkKK1JVLVVOSy00OTggOiAxIDogMS4wCitSVS1VTkstNDk5IDogMSA6IDEuMAorUlUtVU5LLTUwMCA6IDEgOiAxLjYKK1JVLVVOSy01MDEgOiAxIDogMS4wCitSVS1VTkstNTAyIDogMSA6IDEuMQorUlUtVU5LLTUwMyA6IDEgOiA4LjgwMDAwMDIKK1JVLVVOSy01MDQgOiAxIDogMS4wCitSVS1VTkstNTA1IDogMSA6IDEuOAorUlUtVU5LLTUwNiA6IDEgOiAzLjA5OTk5OTkKK1JVLVVOSy01MDcgOiAxIDogOC4wCitSVS1VTkstNTA4IDogMSA6IDEuNAorUlUtVU5LLTUwOSA6IDEgOiA3LjE5OTk5OTgKK1JVLVVOSy01MTAgOiAxIDogOC42OTk5OTk4CitSVS1VTkstNTExIDogMSA6IDIuMgorUlUtVU5LLTUxMiA6IDEgOiAxLjAKK1JVLVVOSy01MTMgOiAxIDogMS4yCitSVS1VTkstNTE0IDogMSA6IDEwLjUKK1JVLVVOSy01MTUgOiAxIDogMS42CitSVS1VTkstNTE2IDogMSA6IDEuMAorUlUtVU5LLTUxNyA6IDEgOiA0LjUKK1JVLVVOSy01MTggOiAxIDogMS4wCitSVS1VTkstNTE5IDogMSA6IDYuOTAwMDAwMQorUlUtVU5LLTUyMCA6IDEgOiAxLjEKK1JVLVVOSy01MjEgOiAxIDogMS45CitSVS1VTkstNTIyIDogMSA6IDEuMgorUlUtVU5LLTUyMyA6IDEgOiAzLjcKK1JVLVVOSy01MjQgOiAxIDogMS41CitSVS1VTkstNTI1IDogMSA6IDIuMDk5OTk5OQorUlUtVU5LLTUyNiA6IDEgOiAyMS4yOTk5OTkKK1JVLVVOSy01MjcgOiAxIDogNy40MDAwMDAxCitSVS1VTkstNTI4IDogMSA6IDEuMQorUlUtVU5LLTUyOSA6IDEgOiAxLjAKK1JVLVVOSy01MzAgOiAxIDogMS4yCitSVS1VTkstNTMxIDogMSA6IDEuMAorUlUtVU5LLTUzMiA6IDEgOiAyLjcKK1JVLVVOSy01MzMgOiAxIDogMi4yCitSVS1VTkstNTM0IDogMSA6IDEuMQorUlUtVU5LLTUzNSA6IDEgOiAyLjUKK1JVLVVOSy01MzYgOiAxIDogMS4xCitSVS1VTkstNTM3IDogMSA6IDEuMAorUlUtVU5LLTUzOCA6IDEgOiA3LjAKK1JVLVVOSy01MzkgOiAxIDogNC4zMDAwMDAyCitSVS1VTkstNTQwIDogMSA6IDMyLjU5OTk5OAorUlUtVU5LLTU0MSA6IDEgOiAxLjAKK1JVLVVOSy01NDIgOiAxIDogMTQyLjAKK1JVLVVOSy01NDMgOiAxIDogMjQuNgorUlUtVU5LLTU0NCA6IDEgOiA0Ny4wCitSVS1VTkstNTQ1IDogMSA6IDcuMAorUlUtVU5LLTU0NiA6IDEgOiAxLjAKK1JVLVVOSy01NDcgOiAxIDogMi4wOTk5OTk5CitSVS1VTkstNTQ4IDogMSA6IDEuOQorUlUtVU5LLTU0OSA6IDEgOiAxLjIKK1JVLVVOSy01NTAgOiAxIDogMTk4Ni4yCitSVS1VTkstNTUxIDogMSA6IDUuNTk5OTk5OQorUlUtVU5LLTU1MiA6IDEgOiAyLjUKK1JVLVVOSy01NTMgOiAxIDogMS4xCitSVS1VTkstNTU0IDogMSA6IDEuMworUlUtVU5LLTU1NSA6IDEgOiAxLjMKK1JVLVVOSy01NTYgOiAxIDogNC41CitSVS1VTkstNTU3IDogMSA6IDEuMQorUlUtVU5LLTU1OCA6IDEgOiAxOC4yMDAwMDEKK1JVLVVOSy01NTkgOiAxIDogMS4wCitSVS1VTkstNTYwIDogMSA6IDEuNworUlUtVU5LLTU2MSA6IDEgOiA2LjkwMDAwMDEKK1JVLVVOSy01NjIgOiAxIDogMi41CitSVS1VTkstNTYzIDogMSA6IDMyNTIzLjUKK1JVLVVOSy01NjQgOiAxIDogMTMuMAorUlUtVU5LLTU2NSA6IDEgOiAzLjAKK1JVLVVOSy01NjYgOiAxIDogMS4wCitSVS1VTkstNTY3IDogMSA6IDEuMQorUlUtVU5LLTU2OCA6IDEgOiAxLjAKK1JVLVVOSy01NjkgOiAxIDogNC4xOTk5OTk4CitSVS1VTkstNTcwIDogMSA6IDEuMAorUlUtVU5LLTU3MSA6IDEgOiAyLjAKK1JVLVVOSy01NzIgOiAxIDogMi41OTk5OTk5CitSVS1VTkstNTczIDogMSA6IDMuNDAwMDAwMQorUlUtVU5LLTU3NCA6IDEgOiAxLjUKK1JVLVVOSy01NzUgOiAxIDogMi41CitSVS1VTkstNTc2IDogMSA6IDE4LjIwMDAwMQorUlUtVU5LLTU3NyA6IDEgOiAxLjAKK1JVLVVOSy01NzggOiAxIDogNi42OTk5OTk4CitSVS1VTkstNTc5IDogMSA6IDIuMDk5OTk5OQorUlUtVU5LLTU4MCA6IDEgOiA5LjAKK1JVLVVOSy01ODEgOiAxIDogMy4yCitSVS1VTkstNTgyIDogMSA6IDIuMAorUlUtVU5LLTU4MyA6IDEgOiAyMS43OTk5OTkKK1JVLVVOSy01ODQgOiAxIDogMS4wCitSVS1VTkstNTg1IDogMSA6IDEyLjYKK1JVLVVOSy01ODYgOiAxIDogMy4wCitSVS1VTkstNTg3IDogMSA6IDEwMS4wCitSVS1VTkstNTg4IDogMSA6IDEuMAorUlUtVU5LLTU4OSA6IDEgOiAxLjYKK1JVLVVOSy01OTAgOiAxIDogNi40MDAwMDAxCitSVS1VTkstNTkxIDogMSA6IDEuMAorUlUtVU5LLTU5MiA6IDEgOiAxMy4zCitSVS1VTkstNTkzIDogMSA6IDM3LjI5OTk5OQorUlUtVU5LLTU5NCA6IDEgOiA5LjUKK1JVLVVOSy01OTUgOiAxIDogMi4wOTk5OTk5CitSVS1VTkstNTk2IDogMSA6IDEuMAorUlUtVU5LLTU5NyA6IDEgOiA0LjA5OTk5OTkKK1JVLVVOSy01OTggOiAxIDogMS4wCitSVS1VTkstNTk5IDogMSA6IDMuNDAwMDAwMQorUlUtVU5LLTYwMCA6IDEgOiAxLjAKK1JVLVVOSy02MDEgOiAxIDogMS4wCitSVS1VTkstNjAyIDogMSA6IDEuMAorUlUtVU5LLTYwMyA6IDEgOiAzLjMKK1JVLVVOSy02MDQgOiAxIDogMS4wCitSVS1VTkstNjA1IDogMSA6IDEuMAorUlUtVU5LLTYwNiA6IDEgOiA0LjE5OTk5OTgKK1JVLVVOSy02MDcgOiAxIDogMS4wCitSVS1VTkstNjA4IDogMSA6IDEuMAorUlUtVU5LLTYwOSA6IDEgOiA3My42OTk5OTcKK1JVLVVOSy02MTAgOiAxIDogNi44MDAwMDAyCitSVS1VTkstNjExIDogMSA6IDguNjAwMDAwNAorUlUtVU5LLTYxMiA6IDEgOiAxLjIKK1JVLVVOSy02MTMgOiAxIDogNDExLjg5OTk5CitSVS1VTkstNjE0IDogMSA6IDE1LjIKK1JVLVVOSy02MTUgOiAxIDogMS44CitSVS1VTkstNjE2IDogMSA6IDIuMworUlUtVU5LLTYxNyA6IDEgOiAyMi43MDAwMDEKK1JVLVVOSy02MTggOiAxIDogODIyLjcwMDAxCitSVS1VTkstNjE5IDogMSA6IDEwLjIKK1JVLVVOSy02MjAgOiAxIDogNi41CitSVS1VTkstNjIxIDogMSA6IDUuNDAwMDAwMQorUlUtVU5LLTYyMiA6IDEgOiAxNS4yCitSVS1VTkstNjIzIDogMSA6IDU3LjA5OTk5OAorUlUtVU5LLTYyNCA6IDEgOiAxLjIKK1JVLVVOSy02MjUgOiAxIDogMy44CitSVS1VTkstNjI2IDogMSA6IDExLjEKK1JVLVVOSy02MjcgOiAxIDogMS4wCitSVS1VTkstNjI4IDogMSA6IDEuMAorUlUtVU5LLTYyOSA6IDEgOiAxLjIKK1JVLVVOSy02MzAgOiAxIDogMS4wCitSVS1VTkstNjMxIDogMSA6IDEuMAorUlUtVU5LLTYzMiA6IDEgOiAxNy4xCitSVS1VTkstNjMzIDogMSA6IDIuNDAwMDAwMQorUlUtVU5LLTYzNCA6IDEgOiAxLjAKK1JVLVVOSy02MzUgOiAxIDogNy41CitSVS1VTkstNjM2IDogMSA6IDEuMworUlUtVU5LLTYzNyA6IDEgOiAxLjAKK1JVLVVOSy02MzggOiAxIDogMS4wCitSVS1VTkstNjM5IDogMSA6IDEuNworUlUtVU5LLTY0MCA6IDEgOiAyLjA5OTk5OTkKK1JVLVVOSy02NDEgOiAxIDogMS4wCitSVS1VTkstNjQyIDogMSA6IDMuNDAwMDAwMQorUlUtVU5LLTY0MyA6IDEgOiAxLjkKK1JVLVVOSy02NDQgOiAxIDogNS4wOTk5OTk5CitSVS1VTkstNjQ1IDogMSA6IDMuNTk5OTk5OQorUlUtVU5LLTY0NiA6IDEgOiA2LjgwMDAwMDIKK1JVLVVOSy02NDcgOiAxIDogMS42CitSVS1VTkstNjQ4IDogMSA6IDguODk5OTk5NgorUlUtVU5LLTY0OSA6IDEgOiAyLjkwMDAwMDEKK1JVLVVOSy02NTAgOiAxIDogMS4wCitSVS1VTkstNjUxIDogMSA6IDkuMTAwMDAwNAorUlUtVU5LLTY1MiA6IDEgOiAxLjAKK1JVLVVOSy02NTMgOiAxIDogMS4wCitSVS1VTkstNjU0IDogMSA6IDEuMAorUlUtVU5LLTY1NSA6IDEgOiA4Ljg5OTk5OTYKK1JVLVVOSy02NTYgOiAxIDogMS4wCitSVS1VTkstNjU3IDogMSA6IDEuMAorUlUtVU5LLTY1OCA6IDEgOiAzLjkwMDAwMDEKK1JVLVVOSy02NTkgOiAxIDogMS4wCitSVS1VTkstNjYwIDogMSA6IDIuNQorUlUtVU5LLTY2MSA6IDEgOiAxLjAKK1JVLVVOSy02NjIgOiAxIDogMy4wCitSVS1VTkstNjYzIDogMSA6IDEuMAorUlUtVU5LLTY2NCA6IDEgOiAyLjA5OTk5OTkKK1JVLVVOSy02NjUgOiAxIDogNy41CitSVS1VTkstNjY2IDogMSA6IDIuOAorUlUtVU5LLTY2NyA6IDEgOiAyNy42CitSVS1VTkstNjY4IDogMSA6IDI1LjAKK1JVLVVOSy02NjkgOiAxIDogMS4wCitSVS1VTkstNjcwIDogMSA6IDEuMAorUlUtVU5LLTY3MSA6IDEgOiAxLjAKK1JVLVVOSy02NzIgOiAxIDogMS4wCitSVS1VTkstNjczIDogMSA6IDEwNzIuNQorUlUtVU5LLTY3NCA6IDEgOiAxLjQKK1JVLVVOSy02NzUgOiAxIDogMi41OTk5OTk5CitSVS1VTkstNjc2IDogMSA6IDMuNDAwMDAwMQorUlUtVU5LLTY3NyA6IDEgOiAyLjAKK1JVLVVOSy02NzggOiAxIDogNC40MDAwMDAxCitSVS1VTkstNjc5IDogMSA6IDIuNQorUlUtVU5LLTY4MCA6IDEgOiA1LjQwMDAwMDEKK1JVLVVOSy02ODEgOiAxIDogMy41CitSVS1VTkstNjgyIDogMSA6IDEuNQorUlUtVU5LLTY4MyA6IDEgOiAyOS45CitSVS1VTkstNjg0IDogMSA6IDIuOTAwMDAwMQorUlUtVU5LLTY4NSA6IDEgOiA0LjMwMDAwMDIKK1JVLVVOSy02ODYgOiAxIDogMS4yCitSVS1VTkstNjg3IDogMSA6IDEuMAorUlUtVU5LLTY4OCA6IDEgOiAyLjU5OTk5OTkKK1JVLVVOSy02ODkgOiAxIDogMS44CitSVS1VTkstNjkwIDogMSA6IDEuOQorUlUtVU5LLTY5MSA6IDEgOiAxLjAKK1JVLVVOSy02OTIgOiAxIDogMS4wCitSVS1VTkstNjkzIDogMSA6IDExLjIKK1JVLVVOSy02OTQgOiAxIDogMy40MDAwMDAxCitSVS1VTkstNjk1IDogMSA6IDI0LjYKK1JVLVVOSy02OTYgOiAxIDogMS4xCitSVS1VTkstNjk3IDogMSA6IDIuNQorUlUtVU5LLTY5OCA6IDEgOiAxLjEKK1JVLVVOSy02OTkgOiAxIDogNC41CitSVS1VTkstNzAwIDogMSA6IDEuMAorUlUtVU5LLTcwMSA6IDEgOiAxLjYKK1JVLVVOSy03MDIgOiAxIDogMS45CitSVS1VTkstNzAzIDogMSA6IDQuNQorUlUtVU5LLTcwNCA6IDEgOiAxMC41CitSVS1VTkstNzA1IDogMSA6IDEuMQorUlUtVU5LLTcwNiA6IDEgOiA0LjMwMDAwMDIKK1JVLVVOSy03MDcgOiAxIDogMS4wCitSVS1VTkstNzA4IDogMSA6IDIuMAorUlUtVU5LLTcwOSA6IDEgOiAyLjcKK1JVLVVOSy03MTAgOiAxIDogMS4wCitSVS1VTkstNzExIDogMSA6IDEuMAorUlUtVU5LLTcxMiA6IDEgOiAyLjQwMDAwMDEKK1JVLVVOSy03MTMgOiAxIDogMS44CitSVS1VTkstNzE0IDogMSA6IDEuMAorUlUtVU5LLTcxNSA6IDEgOiAxLjAKK1JVLVVOSy03MTYgOiAxIDogMS41CitSVS1VTkstNzE3IDogMSA6IDIuMAorUlUtVU5LLTcxOCA6IDEgOiAzLjAKK1JVLVVOSy03MTkgOiAxIDogMTguMQorUlUtVU5LLTcyMCA6IDEgOiAyOC43OTk5OTkKK1JVLVVOSy03MjEgOiAxIDogMTUxLjYwMDAxCitSVS1VTkstNzIyIDogMSA6IDE1MS42MDAwMQorUlUtVU5LLTcyMyA6IDEgOiAxLjAKK1JVLVVOSy03MjQgOiAxIDogMTA0MS43CitSVS1VTkstNzI1IDogMSA6IDEwNDEuNworUlUtVU5LLTcyNiA6IDEgOiAxMDQxLjcKK1JVLVVOSy03MjcgOiAxIDogMS4wCitSVS1VTkstNzI4IDogMSA6IDExLjUKK1JVLVVOSy03MjkgOiAxIDogNi45MDAwMDAxCitSVS1VTkstNzMwIDogMSA6IDIuMworUlUtVU5LLTczMSA6IDEgOiA2LjA5OTk5OTkKK1JVLVVOSy03MzIgOiAxIDogMzEuMQorUlUtVU5LLTczMyA6IDEgOiAxLjgKK1JVLVVOSy03MzQgOiAxIDogMS4xCitSVS1VTkstNzM1IDogMSA6IDU2LjkwMDAwMgorUlUtVU5LLTczNiA6IDEgOiAyLjA5OTk5OTkKK1JVLVVOSy03MzcgOiAxIDogMS4wCitSVS1VTkstNzM4IDogMSA6IDEuOQorUlUtVU5LLTczOSA6IDEgOiA3LjgwMDAwMDIKK1JVLVVOSy03NDAgOiAxIDogNC4wOTk5OTk5CitSVS1VTkstNzQxIDogMSA6IDQuODAwMDAwMgorUlUtVU5LLTc0MiA6IDEgOiA2LjE5OTk5OTgKK1JVLVVOSy03NDMgOiAxIDogNC44MDAwMDAyCitSVS1VTkstNzQ0IDogMSA6IDUuNTk5OTk5OQorUlUtVU5LLTc0NSA6IDEgOiAxLjcKK1JVLVVOSy03NDYgOiAxIDogMS4wCitSVS1VTkstNzQ3IDogMSA6IDEuMAorUlUtVU5LLTc0OCA6IDEgOiA0MjAuMTAwMDEKK1JVLVVOSy03NDkgOiAxIDogNzcwNS41CitSVS1VTkstNzUwIDogMSA6IDc3MDUuNQorUlUtVU5LLTc1MSA6IDEgOiA5Ljg5OTk5OTYKK1JVLVVOSy03NTIgOiAxIDogMS4wCitSVS1VTkstNzUzIDogMSA6IDguODk5OTk5NgorUlUtVU5LLTc1NCA6IDEgOiAyLjkwMDAwMDEKK1JVLVVOSy03NTUgOiAxIDogMS4xCitSVS1VTkstNzU2IDogMSA6IDEzLjgKK1JVLVVOSy03NTcgOiAxIDogMy4yCitSVS1VTkstNzU4IDogMSA6IDEuMworUlUtVU5LLTc1OSA6IDEgOiAzLjMKK1JVLVVOSy03NjAgOiAxIDogMS4wCitSVS1VTkstNzYxIDogMSA6IDEuMAorUlUtVU5LLTc2MiA6IDEgOiAxLjAKK1JVLVVOSy03NjMgOiAxIDogMS42CitSVS1VTkstNzY0IDogMSA6IDEuMAorUlUtVU5LLTc2NSA6IDEgOiAxLjAKK1JVLVVOSy03NjYgOiAxIDogMTAuNQorUlUtVU5LLTc2NyA6IDEgOiA0LjA5OTk5OTkKK1JVLVVOSy03NjggOiAxIDogMi40MDAwMDAxCitSVS1VTkstNzY5IDogMSA6IDI5Ljc5OTk5OQorUlUtVU5LLTc3MCA6IDEgOiAxLjAKK1JVLVVOSy03NzEgOiAxIDogMi43CitSVS1VTkstNzcyIDogMSA6IDEuMAorUlUtVU5LLTc3MyA6IDEgOiAyLjQwMDAwMDEKK1JVLVVOSy03NzQgOiAxIDogMi4wCitSVS1VTkstNzc1IDogMSA6IDE1LjYKK1JVLVVOSy03NzYgOiAxIDogNS4wCitSVS1VTkstNzc3IDogMSA6IDguNQorUlUtVU5LLTc3OCA6IDEgOiAxLjIKK1JVLVVOSy03NzkgOiAxIDogMS4wCitSVS1VTkstNzgwIDogMSA6IDEuMAorUlUtVU5LLTc4MSA6IDEgOiAxLjAKK1JVLVVOSy03ODIgOiAxIDogMi4wCitSVS1VTkstNzgzIDogMSA6IDEuMAorUlUtVU5LLTc4NCA6IDEgOiAyLjUKK1JVLVVOSy03ODUgOiAxIDogMi45MDAwMDAxCitSVS1VTkstNzg2IDogMSA6IDEuMgorUlUtVU5LLTc4NyA6IDEgOiAxMi4zCitSVS1VTkstNzg4IDogMSA6IDE4LjkKK1JVLVVOSy03ODkgOiAxIDogMS4yCitSVS1VTkstNzkwIDogMSA6IDE0LjAKK1JVLVVOSy03OTEgOiAxIDogNC4wCitSVS1VTkstNzkyIDogMSA6IDI0LjkKK1JVLVVOSy03OTMgOiAxIDogNzM0LjU5OTk4CitSVS1VTkstNzk0IDogMSA6IDMuMgorUlUtVU5LLTc5NSA6IDEgOiAxLjAKK1JVLVVOSy03OTYgOiAxIDogMS44CitSVS1VTkstNzk3IDogMSA6IDEuOAorUlUtVU5LLTc5OCA6IDEgOiAxLjAKK1JVLVVOSy03OTkgOiAxIDogMjIuMAorUlUtVU5LLTgwMCA6IDEgOiAxLjUKK1JVLVVOSy04MDEgOiAxIDogMS40CitSVS1VTkstODAyIDogMSA6IDIuMworUlUtVU5LLTgwMyA6IDEgOiA2LjY5OTk5OTgKK1JVLVVOSy04MDQgOiAxIDogMS44CitSVS1VTkstODA1IDogMSA6IDEuNQorUlUtVU5LLTgwNiA6IDEgOiAxMC44CitSVS1VTkstODA3IDogMSA6IDEuMAorUlUtVU5LLTgwOCA6IDEgOiAxLjQKK1JVLVVOSy04MDkgOiAxIDogNS40MDAwMDAxCitSVS1VTkstODEwIDogMSA6IDI3LjEKK1JVLVVOSy04MTEgOiAxIDogMi40MDAwMDAxCitSVS1VTkstODEyIDogMSA6IDUyLjkwMDAwMgorUlUtVU5LLTgxMyA6IDEgOiAxLjQKK1JVLVVOSy04MTQgOiAxIDogMjMuNAorUlUtVU5LLTgxNSA6IDEgOiAyMS4wCitSVS1VTkstODE2IDogMSA6IDEuNworUlUtVU5LLTgxNyA6IDEgOiAxOC4xCitSVS1VTkstODE4IDogMSA6IDY0LjAKK1JVLVVOSy04MTkgOiAxIDogMTUuOQorUlUtVU5LLTgyMCA6IDEgOiAyLjUKK1JVLVVOSy04MjEgOiAxIDogNTQuNzk5OTk5CitSVS1VTkstODIyIDogMSA6IDMuNworUlUtVU5LLTgyMyA6IDEgOiA0OS4wCitSVS1VTkstODI0IDogMSA6IDIxLjIwMDAwMQorUlUtVU5LLTgyNSA6IDEgOiAzNTAuNzk5OTkKK1JVLVVOSy04MjYgOiAxIDogMTguNzk5OTk5CitSVS1VTkstODI3IDogMSA6IDI2LjYKK1JVLVVOSy04MjggOiAxIDogMTIuNQorUlUtVU5LLTgyOSA6IDEgOiAyLjgKK1JVLVVOSy04MzAgOiAxIDogNzUuNjk5OTk3CitSVS1VTkstODMxIDogMSA6IDEuMAorUlUtVU5LLTgzMiA6IDEgOiA1LjU5OTk5OTkKK1JVLVVOSy04MzMgOiAxIDogNC4wCitSVS1VTkstODM0IDogMSA6IDYuODAwMDAwMgorUlUtVU5LLTgzNSA6IDEgOiAxNy40CitSVS1VTkstODM2IDogMSA6IDEuMAorUlUtVU5LLTgzNyA6IDEgOiAzMi40MDAwMDIKK1JVLVVOSy04MzggOiAxIDogMS4zCitSVS1VTkstODM5IDogMSA6IDg4LjUKK1JVLVVOSy04NDAgOiAxIDogNDM3LjM5OTk5CitSVS1VTkstODQxIDogMSA6IDcwLjMwMDAwMworUlUtVU5LLTg0MiA6IDEgOiAyLjcKK1JVLVVOSy04NDMgOiAxIDogMy4yCitSVS1VTkstODQ0IDogMSA6IDEuMgorUlUtVU5LLTg0NSA6IDEgOiA5MS40MDAwMDIKK1JVLVVOSy04NDYgOiAxIDogMi4wCitSVS1VTkstODQ3IDogMSA6IDIuOTAwMDAwMQorUlUtVU5LLTg0OCA6IDEgOiAzOC43MDAwMDEKK1JVLVVOSy04NDkgOiAxIDogMS43CitSVS1VTkstODUwIDogMSA6IDcuOTAwMDAwMQorUlUtVU5LLTg1MSA6IDEgOiAyNi41CitSVS1VTkstODUyIDogMSA6IDcuNDAwMDAwMQorUlUtVU5LLTg1MyA6IDEgOiAxMy42CitSVS1VTkstODU0IDogMSA6IDE2LjkKK1JVLVVOSy04NTUgOiAxIDogMy4wCitSVS1VTkstODU2IDogMSA6IDEuMAorUlUtVU5LLTg1NyA6IDEgOiAxLjAKK1JVLVVOSy04NTggOiAxIDogNC41CitSVS1VTkstODU5IDogMSA6IDIuMDk5OTk5OQorUlUtVU5LLTg2MCA6IDEgOiAxLjAKK1JVLVVOSy04NjEgOiAxIDogMS4wCitSVS1VTkstODYyIDogMSA6IDQ5Ni43MDAwMQorUlUtVU5LLTg2MyA6IDEgOiA2Mi43OTk5OTkKK1JVLVVOSy04NjQgOiAxIDogMS4wCitSVS1VTkstODY1IDogMSA6IDEuMQorUlUtVU5LLTg2NiA6IDEgOiAyMS41CitSVS1VTkstODY3IDogMSA6IDIuNQorUlUtVU5LLTg2OCA6IDEgOiAxLjAKK1JVLVVOSy04NjkgOiAxIDogMjQuMjAwMDAxCitSVS1VTkstODcwIDogMSA6IDEuMworUlUtVU5LLTg3MSA6IDEgOiA0NS4yOTk5OTkKK1JVLVVOSy04NzIgOiAxIDogNS44MDAwMDAyCitSVS1VTkstODczIDogMSA6IDMuMDk5OTk5OQorUlUtVU5LLTg3NCA6IDEgOiA2LjAKK1JVLVVOSy04NzUgOiAxIDogNC41CitSVS1VTkstODc2IDogMSA6IDk2LjgwMDAwMworUlUtVU5LLTg3NyA6IDEgOiAzOS45MDAwMDIKK1JVLVVOSy04NzggOiAxIDogNi4wCitSVS1VTkstODc5IDogMSA6IDEuMAorUlUtVU5LLTg4MCA6IDEgOiAyLjkwMDAwMDEKK1JVLVVOSy04ODEgOiAxIDogMS4xCitSVS1VTkstODgyIDogMSA6IDYuMAorUlUtVU5LLTg4MyA6IDEgOiAxLjkKK1JVLVVOSy04ODQgOiAxIDogMjcuMjAwMDAxCitSVS1VTkstODg1IDogMSA6IDEuMQorUlUtVU5LLTg4NiA6IDEgOiAzMjM4LjMKK1JVLVVOSy04ODcgOiAxIDogMi4wOTk5OTk5CitSVS1VTkstODg4IDogMSA6IDEuNAorUlUtVU5LLTg4OSA6IDEgOiA1LjU5OTk5OTkKK1JVLVVOSy04OTAgOiAxIDogMzMuNTk5OTk4CitSVS1VTkstODkxIDogMSA6IDMuNQorUlUtVU5LLTg5MiA6IDEgOiA1Ni4wCitSVS1VTkstODkzIDogMSA6IDEuMAorUlUtVU5LLTg5NCA6IDEgOiAxLjYKK1JVLVVOSy04OTUgOiAxIDogMi41OTk5OTk5CitSVS1VTkstODk2IDogMSA6IDEuMAorUlUtVU5LLTg5NyA6IDEgOiAxLjgKK1JVLVVOSy04OTggOiAxIDogOTguNQorUlUtVU5LLTg5OSA6IDEgOiAxLjAKK1JVLVVOSy05MDAgOiAxIDogNi4wOTk5OTk5CitSVS1VTkstOTAxIDogMSA6IDEuMworUlUtVU5LLTkwMiA6IDEgOiA3MS41OTk5OTgKK1JVLVVOSy05MDMgOiAxIDogNi4xOTk5OTk4CitSVS1VTkstOTA0IDogMSA6IDE4LjI5OTk5OQorUlUtVU5LLTkwNSA6IDEgOiAxMy41CitSVS1VTkstOTA2IDogMSA6IDEuMAorUlUtVU5LLTkwNyA6IDEgOiAxLjAKK1JVLVVOSy05MDggOiAxIDogMS4wCitSVS1VTkstOTA5IDogMSA6IDEuMAorUlUtVU5LLTkxMCA6IDEgOiAxLjQKK1JVLVVOSy05MTEgOiAxIDogMS4wCitSVS1VTkstOTEyIDogMSA6IDEzOC4zOTk5OQorUlUtVU5LLTkxMyA6IDEgOiA1NS41CitSVS1VTkstOTE0IDogMSA6IDIwNDkuOAorUlUtVU5LLTkxNSA6IDEgOiAyLjgKK1JVLVVOSy05MTYgOiAxIDogMS4wCitSVS1VTkstOTE3IDogMSA6IDIuNQorUlUtVU5LLTkxOCA6IDEgOiAzLjA5OTk5OTkKK1JVLVVOSy05MTkgOiAxIDogMTQuMworUlUtVU5LLTkyMCA6IDEgOiA0LjAKK1JVLVVOSy05MjEgOiAxIDogNS4zMDAwMDAyCitSVS1VTkstOTIyIDogMSA6IDEzMC4xMDAwMQorUlUtVU5LLTkyMyA6IDEgOiAyLjIKK1JVLVVOSy05MjQgOiAxIDogMS45CitSVS1VTkstOTI1IDogMSA6IDEuMAorUlUtVU5LLTkyNiA6IDEgOiAzMy43MDAwMDEKK1JVLVVOSy05MjcgOiAxIDogMy45MDAwMDAxCitSVS1VTkstOTI4IDogMSA6IDEuOAorUlUtVU5LLTkyOSA6IDEgOiAyLjQwMDAwMDEKK1JVLVVOSy05MzAgOiAxIDogOS4xMDAwMDA0CitSVS1VTkstOTMxIDogMSA6IDguNjAwMDAwNAorUlUtVU5LLTkzMiA6IDEgOiAyLjA5OTk5OTkKK1JVLVVOSy05MzMgOiAxIDogMS4wCitSVS1VTkstOTM0IDogMSA6IDEuMAorUlUtVU5LLTkzNSA6IDEgOiAxLjAKK1JVLVVOSy05MzYgOiAxIDogNC4xOTk5OTk4CitSVS1VTkstOTM3IDogMSA6IDguMzAwMDAwMgorUlUtVU5LLTkzOCA6IDEgOiA1LjA5OTk5OTkKK1JVLVVOSy05MzkgOiAxIDogMS4zCitSVS1VTkstOTQwIDogMSA6IDIuMgorUlUtVU5LLTk0MSA6IDEgOiAxLjIKK1JVLVVOSy05NDIgOiAxIDogMS4wCitSVS1VTkstOTQzIDogMSA6IDE2LjUKK1JVLVVOSy05NDQgOiAxIDogMTcuMQorUlUtVU5LLTk0NSA6IDEgOiAyLjMKK1JVLVVOSy05NDYgOiAxIDogMzYuNQorUlUtVU5LLTk0NyA6IDEgOiA2LjE5OTk5OTgKK1JVLVVOSy05NDggOiAxIDogNS41OTk5OTk5CitSVS1VTkstOTQ5IDogMSA6IDEuMAorUlUtVU5LLTk1MCA6IDEgOiA1LjUKK1JVLVVOSy05NTEgOiAxIDogMS40CitSVS1VTkstOTUyIDogMSA6IDEuMAorUlUtVU5LLTk1MyA6IDEgOiAyLjQwMDAwMDEKK1JVLVVOSy05NTQgOiAxIDogMTQ5LjMKK1JVLVVOSy05NTUgOiAxIDogMTE0LjcKK1JVLVVOSy05NTYgOiAxIDogMy4yCitSVS1VTkstOTU3IDogMSA6IDIuNDAwMDAwMQorUlUtVU5LLTk1OCA6IDEgOiAzLjU5OTk5OTkKK1JVLVVOSy05NTkgOiAxIDogMS4wCitSVS1VTkstOTYwIDogMSA6IDQuMDk5OTk5OQorUlUtVU5LLTk2MSA6IDEgOiA0OTg5LjI5OTgKK1JVLVVOSy05NjIgOiAxIDogMy44CitSVS1VTkstOTYzIDogMSA6IDYuMAorUlUtVU5LLTk2NCA6IDEgOiAxLjAKK1JVLVVOSy05NjUgOiAxIDogMS4wCitSVS1VTkstOTY2IDogMSA6IDEuMAorUlUtVU5LLTk2NyA6IDEgOiA5LjM5OTk5OTYKK1JVLVVOSy05NjggOiAxIDogNjguNjk5OTk3CitSVS1VTkstOTY5IDogMSA6IDE0LjEKK1JVLVVOSy05NzAgOiAxIDogMS41CitSVS1VTkstOTcxIDogMSA6IDYuMAorUlUtVU5LLTk3MiA6IDEgOiAxLjcKK1JVLVVOSy05NzMgOiAxIDogMTA3LjgKK1JVLVVOSy05NzQgOiAxIDogMS4wCitSVS1VTkstOTc1IDogMSA6IDg1LjkwMDAwMgorUlUtVU5LLTk3NiA6IDEgOiAzLjMKK1JVLVVOSy05NzcgOiAxIDogMi40MDAwMDAxCitSVS1VTkstOTc4IDogMSA6IDIuMAorUlUtVU5LLTk3OSA6IDEgOiAyLjIKK1JVLVVOSy05ODAgOiAxIDogNi41CitSVS1VTkstOTgxIDogMSA6IDEuMAorUlUtVU5LLTk4MiA6IDEgOiAxMC45CitSVS1VTkstOTgzIDogMSA6IDMuNTk5OTk5OQorUlUtVU5LLTk4NCA6IDEgOiAxLjAKK1JVLVVOSy05ODUgOiAxIDogMS40CitSVS1VTkstOTg2IDogMSA6IDEuNAorUlUtVU5LLTk4NyA6IDEgOiAxNi42CitSVS1VTkstOTg4IDogMSA6IDYuOTAwMDAwMQorUlUtVU5LLTk4OSA6IDEgOiAxLjcKK1JVLVVOSy05OTAgOiAxIDogNC41CitSVS1VTkstOTkxIDogMSA6IDEuMAorUlUtVU5LLTk5MiA6IDEgOiAxLjAKK1JVLVVOSy05OTMgOiAxIDogOS41CitSVS1VTkstOTk0IDogMSA6IDEuMAorUlUtVU5LLTk5NSA6IDEgOiAyMC41CitSVS1VTkstOTk2IDogMSA6IDIuMDk5OTk5OQorUlUtVU5LLTk5NyA6IDEgOiA1LjMwMDAwMDIKK1JVLVVOSy05OTggOiAxIDogOS44OTk5OTk2CitSVS1VTkstOTk5IDogMSA6IDEuMAorUlUtVU5LLTEwMDAgOiAxIDogMS4zCitSVS1VTkstMTAwMSA6IDEgOiAzLjgKK1JVLVVOSy0xMDAyIDogMSA6IDE2LjUKK1JVLVVOSy0xMDAzIDogMSA6IDMuMAorUlUtVU5LLTEwMDQgOiAxIDogMzQuMDk5OTk4CitSVS1VTkstMTAwNSA6IDEgOiAyLjA5OTk5OTkKK1JVLVVOSy0xMDA2IDogMSA6IDEuNAorUlUtVU5LLTEwMDcgOiAxIDogMS4wCitSVS1VTkstMTAwOCA6IDEgOiAxLjcKK1JVLVVOSy0xMDA5IDogMSA6IDIuNworUlUtVU5LLTEwMTAgOiAxIDogMS4wCitSVS1VTkstMTAxMSA6IDEgOiAxLjkKK1JVLVVOSy0xMDEyIDogMSA6IDEuMAorUlUtVU5LLTEwMTMgOiAxIDogMS4xCitSVS1VTkstMTAxNCA6IDEgOiAxLjAKK1JVLVVOSy0xMDE1IDogMSA6IDEuMAorUlUtVU5LLTEwMTYgOiAxIDogOS44MDAwMDAyCitSVS1VTkstMTAxNyA6IDEgOiAxLjAKK1JVLVVOSy0xMDE4IDogMSA6IDMuOTAwMDAwMQorUlUtVU5LLTEwMTkgOiAxIDogMy40MDAwMDAxCitSVS1VTkstMTAyMCA6IDEgOiAyLjQwMDAwMDEKK1JVLVVOSy0xMDIxIDogMSA6IDEuNworUlUtVU5LLTEwMjIgOiAxIDogMTA4LjEKK1JVLVVOSy0xMDIzIDogMSA6IDIuMgorUlUtVU5LLTEwMjQgOiAxIDogMS44CitSVS1VTkstMTAyNSA6IDEgOiA2LjAKK1JVLVVOSy0xMDI2IDogMSA6IDYuMTk5OTk5OAorUlUtVU5LLTEwMjcgOiAxIDogNDAuMDk5OTk4CitSVS1VTkstMTAyOCA6IDEgOiAxLjAKK1JVLVVOSy0xMDI5IDogMSA6IDEuMAorUlUtVU5LLTEwMzAgOiAxIDogOC4zOTk5OTk2CitSVS1VTkstMTAzMSA6IDEgOiAyLjgKK1JVLVVOSy0xMDMyIDogMSA6IDM0LjQwMDAwMgorUlUtVU5LLTEwMzMgOiAxIDogMS4wCitSVS1VTkstMTAzNCA6IDEgOiAxLjYKK1JVLVVOSy0xMDM1IDogMSA6IDEuOQorUlUtVU5LLTEwMzYgOiAxIDogNC45MDAwMDAxCitSVS1VTkstMTAzNyA6IDEgOiAyLjQwMDAwMDEKK1JVLVVOSy0xMDM4IDogMSA6IDEuMAorUlUtVU5LLTEwMzkgOiAxIDogMS4wCitSVS1VTkstMTA0MCA6IDEgOiAxLjAKK1JVLVVOSy0xMDQxIDogMSA6IDEuNAorUlUtVU5LLTEwNDIgOiAxIDogMjYuNAorUlUtVU5LLTEwNDMgOiAxIDogMS4wCitSVS1VTkstMTA0NCA6IDEgOiAyLjgKK1JVLVVOSy0xMDQ1IDogMSA6IDEuMworUlUtVU5LLTEwNDYgOiAxIDogMS4zCitSVS1VTkstMTA0NyA6IDEgOiAxLjAKK1JVLVVOSy0xMDQ4IDogMSA6IDEuMAorUlUtVU5LLTEwNDkgOiAxIDogMS42CitSVS1VTkstMTA1MCA6IDEgOiAxLjAKK1JVLVVOSy0xMDUxIDogMSA6IDEuMAorUlUtVU5LLTEwNTIgOiAxIDogOC4zOTk5OTk2CitSVS1VTkstMTA1MyA6IDEgOiAyLjMKK1JVLVVOSy0xMDU0IDogMSA6IDYuOTAwMDAwMQorUlUtVU5LLTEwNTUgOiAxIDogMy45MDAwMDAxCitSVS1VTkstMTA1NiA6IDEgOiA0LjQwMDAwMDEKK1JVLVVOSy0xMDU3IDogMSA6IDEwLjgKK1JVLVVOSy0xMDU4IDogMSA6IDMuNworUlUtVU5LLTEwNTkgOiAxIDogMzIuMjk5OTk5CitSVS1VTkstMTA2MCA6IDEgOiAxMC41CitSVS1VTkstMTA2MSA6IDEgOiAxNC43CitSVS1VTkstMTA2MiA6IDEgOiA0LjMwMDAwMDIKK1JVLVVOSy0xMDYzIDogMSA6IDEuNgorUlUtVU5LLTEwNjQgOiAxIDogMS4wCitSVS1VTkstMTA2NSA6IDEgOiA0LjkwMDAwMDEKK1JVLVVOSy0xMDY2IDogMSA6IDQuNDAwMDAwMQorUlUtVU5LLTEwNjcgOiAxIDogMi44CitSVS1VTkstMTA2OCA6IDEgOiAxLjAKK1JVLVVOSy0xMDY5IDogMSA6IDEuMAorUlUtVU5LLTEwNzAgOiAxIDogMTkuMQorUlUtVU5LLTEwNzEgOiAxIDogOC4xOTk5OTk4CitSVS1VTkstMTA3MiA6IDEgOiA1LjE5OTk5OTgKK1JVLVVOSy0xMDczIDogMSA6IDIuMAorUlUtVU5LLTEwNzQgOiAxIDogMS4yCitSVS1VTkstMTA3NSA6IDEgOiAxLjQKK1JVLVVOSy0xMDc2IDogMSA6IDQuNjk5OTk5OAorUlUtVU5LLTEwNzcgOiAxIDogMS4yCitSVS1VTkstMTA3OCA6IDEgOiAxLjAKK1JVLVVOSy0xMDc5IDogMSA6IDEuNQorUlUtVU5LLTEwODAgOiAxIDogMTI4Ny42CitSVS1VTkstMTA4MSA6IDEgOiAxLjIKK1JVLVVOSy0xMDgyIDogMSA6IDYuNQorUlUtVU5LLTEwODMgOiAxIDogODI0LjkwMDAyCitSVS1VTkstMTA4NCA6IDEgOiA3Ny4wOTk5OTgKK1JVLVVOSy0xMDg1IDogMSA6IDEuMAorUlUtVU5LLTEwODYgOiAxIDogMS4wCitSVS1VTkstMTA4NyA6IDEgOiAxLjAKK1JVLVVOSy0xMDg4IDogMSA6IDQuMzAwMDAwMgorUlUtVU5LLTEwODkgOiAxIDogOC42MDAwMDA0CitSVS1VTkstMTA5MCA6IDEgOiA2OC4zMDAwMDMKK1JVLVVOSy0xMDkxIDogMSA6IDEuNAorUlUtVU5LLTEwOTIgOiAxIDogODAuNDAwMDAyCitSVS1VTkstMTA5MyA6IDEgOiA0LjA5OTk5OTkKK1JVLVVOSy0xMDk0IDogMSA6IDM2LjkwMDAwMgorUlUtVU5LLTEwOTUgOiAxIDogMS44CitSVS1VTkstMTA5NiA6IDEgOiAyMTYuODk5OTkKK1JVLVVOSy0xMDk3IDogMSA6IDIwNy42MDAwMQorUlUtVU5LLTEwOTggOiAxIDogMTAxLjIKK1JVLVVOSy0xMDk5IDogMSA6IDIuMworUlUtVU5LLTExMDAgOiAxIDogMS41CitSVS1VTkstMTEwMSA6IDEgOiA1LjAKK1JVLVVOSy0xMTAyIDogMSA6IDMuOAorUlUtVU5LLTExMDMgOiAxIDogMS44CitSVS1VTkstMTEwNCA6IDEgOiAxLjAKK1JVLVVOSy0xMTA1IDogMSA6IDEuMAorUlUtVU5LLTExMDYgOiAxIDogMzUuOTAwMDAyCitSVS1VTkstMTEwNyA6IDEgOiA0MDUuMTAwMDEKK1JVLVVOSy0xMTA4IDogMSA6IDcyLjE5OTk5NworUlUtVU5LLTExMDkgOiAxIDogMS44CitSVS1VTkstMTExMCA6IDEgOiAxLjAKK1JVLVVOSy0xMTExIDogMSA6IDMuOAorUlUtVU5LLTExMTIgOiAxIDogOTguMzAwMDAzCitSVS1VTkstMTExMyA6IDEgOiA2LjUKK1JVLVVOSy0xMTE0IDogMSA6IDEuNworUlUtVU5LLTExMTUgOiAxIDogNy42OTk5OTk4CitSVS1VTkstMTExNiA6IDEgOiAxLjAKK1JVLVVOSy0xMTE3IDogMSA6IDUuNQorUlUtVU5LLTExMTggOiAxIDogMS4wCitSVS1VTkstMTExOSA6IDEgOiA0LjMwMDAwMDIKK1JVLVVOSy0xMTIwIDogMSA6IDEuMworUlUtVU5LLTExMjEgOiAxIDogMS4wCitSVS1VTkstMTEyMiA6IDEgOiAxLjIKK1JVLVVOSy0xMTIzIDogMSA6IDEuMworUlUtVU5LLTExMjQgOiAxIDogMS4wCitSVS1VTkstMTEyNSA6IDEgOiAxMS4wCitSVS1VTkstMTEyNiA6IDEgOiAxLjAKK1JVLVVOSy0xMTI3IDogMSA6IDEuMAorUlUtVU5LLTExMjggOiAxIDogMi40MDAwMDAxCitSVS1VTkstMTEyOSA6IDEgOiAxLjMKK1JVLVVOSy0xMTMwIDogMSA6IDEuMAorUlUtVU5LLTExMzEgOiAxIDogMS4wCitSVS1VTkstMTEzMiA6IDEgOiA1LjAKK1JVLVVOSy0xMTMzIDogMSA6IDIuMDk5OTk5OQorUlUtVU5LLTExMzQgOiAxIDogNC42OTk5OTk4CitSVS1VTkstMTEzNSA6IDEgOiA0LjkwMDAwMDEKK1JVLVVOSy0xMTM2IDogMSA6IDQuOTAwMDAwMQorUlUtVU5LLTExMzcgOiAxIDogMTMuNAorUlUtVU5LLTExMzggOiAxIDogMS4wCitSVS1VTkstMTEzOSA6IDEgOiAyLjUKK1JVLVVOSy0xMTQwIDogMSA6IDIuNDAwMDAwMQorUlUtVU5LLTExNDEgOiAxIDogMS4wCitSVS1VTkstMTE0MiA6IDEgOiAxNi42CitSVS1VTkstMTE0MyA6IDEgOiAxLjQKK1JVLVVOSy0xMTQ0IDogMSA6IDEuMAorUlUtVU5LLTExNDUgOiAxIDogMjkuNgorUlUtVU5LLTExNDYgOiAxIDogNzQuNDAwMDAyCitSVS1VTkstMTE0NyA6IDEgOiAxNi4xCitSVS1VTkstMTE0OCA6IDEgOiAxLjAKK1JVLVVOSy0xMTQ5IDogMSA6IDEuMAorUlUtVU5LLTExNTAgOiAxIDogMTcuNgorUlUtVU5LLTExNTEgOiAxIDogMi41OTk5OTk5CitSVS1VTkstMTE1MiA6IDEgOiAyMi4xCitSVS1VTkstMTE1MyA6IDEgOiAxLjAKK1JVLVVOSy0xMTU0IDogMSA6IDIuOTAwMDAwMQorUlUtVU5LLTExNTUgOiAxIDogMi44CitSVS1VTkstMTE1NiA6IDEgOiAxLjIKK1JVLVVOSy0xMTU3IDogMSA6IDEuMAorUlUtVU5LLTExNTggOiAxIDogMTcuMjAwMDAxCitSVS1VTkstMTE1OSA6IDEgOiAxLjIKK1JVLVVOSy0xMTYwIDogMSA6IDEuMAorUlUtVU5LLTExNjEgOiAxIDogMS45CitSVS1VTkstMTE2MiA6IDEgOiAxLjAKK1JVLVVOSy0xMTYzIDogMSA6IDI5LjEKK1JVLVVOSy0xMTY0IDogMSA6IDEuMgorUlUtVU5LLTExNjUgOiAxIDogMS4wCitSVS1VTkstMTE2NiA6IDEgOiAxLjAKK1JVLVVOSy0xMTY3IDogMSA6IDEuMAorUlUtVU5LLTExNjggOiAxIDogMS41CitSVS1VTkstMTE2OSA6IDEgOiA1LjMwMDAwMDIKK1JVLVVOSy0xMTcwIDogMSA6IDEuMworUlUtVU5LLTExNzEgOiAxIDogNC4wCitSVS1VTkstMTE3MiA6IDEgOiAyNTMuMAorUlUtVU5LLTExNzMgOiAxIDogMS4wCitSVS1VTkstMTE3NCA6IDEgOiAxLjcKK1JVLVVOSy0xMTc1IDogMSA6IDguMzk5OTk5NgorUlUtVU5LLTExNzYgOiAxIDogMS4xCitSVS1VTkstMTE3NyA6IDEgOiA4OC4wOTk5OTgKK1JVLVVOSy0xMTc4IDogMSA6IDE1LjcKK1JVLVVOSy0xMTc5IDogMSA6IDMuMAorUlUtVU5LLTExODAgOiAxIDogMjkuMjAwMDAxCitSVS1VTkstMTE4MSA6IDEgOiAxLjAKK1JVLVVOSy0xMTgyIDogMSA6IDEuMAorUlUtVU5LLTExODMgOiAxIDogMS45CitSVS1VTkstMTE4NCA6IDEgOiAzLjQwMDAwMDEKK1JVLVVOSy0xMTg1IDogMSA6IDQ5Ljc5OTk5OQorUlUtVU5LLTExODYgOiAxIDogMS4zCitSVS1VTkstMTE4NyA6IDEgOiA4LjYwMDAwMDQKK1JVLVVOSy0xMTg4IDogMSA6IDE0LjgKK1JVLVVOSy0xMTg5IDogMSA6IDEuMAorUlUtVU5LLTExOTAgOiAxIDogNjEuNDAwMDAyCitSVS1VTkstMTE5MSA6IDEgOiAxLjAKK1JVLVVOSy0xMTkyIDogMSA6IDMuOAorUlUtVU5LLTExOTMgOiAxIDogNjMuNQorUlUtVU5LLTExOTQgOiAxIDogMy41CitSVS1VTkstMTE5NSA6IDEgOiAzMi41OTk5OTgKK1JVLVVOSy0xMTk2IDogMSA6IDEuMAorUlUtVU5LLTExOTcgOiAxIDogMS4yCitSVS1VTkstMTE5OCA6IDEgOiAxLjAKK1JVLVVOSy0xMTk5IDogMSA6IDEuNgorUlUtVU5LLTEyMDAgOiAxIDogMS4wCitSVS1VTkstMTIwMSA6IDEgOiAxLjAKK1JVLVVOSy0xMjAyIDogMSA6IDEuMAorUlUtVU5LLTEyMDMgOiAxIDogMy41CitSVS1VTkstMTIwNCA6IDEgOiAyLjA5OTk5OTkKK1JVLVVOSy0xMjA1IDogMSA6IDEuMAorUlUtVU5LLTEyMDYgOiAxIDogMTEuOQorUlUtVU5LLTEyMDcgOiAxIDogMy4zCitSVS1VTkstMTIwOCA6IDEgOiAzMy4yMDAwMDEKK1JVLVVOSy0xMjA5IDogMSA6IDEuMAorUlUtVU5LLTEyMTAgOiAxIDogMS4zCitSVS1VTkstMTIxMSA6IDEgOiAxLjAKK1JVLVVOSy0xMjEyIDogMSA6IDUuMTk5OTk5OAorUlUtVU5LLTEyMTMgOiAxIDogMS4wCitSVS1VTkstMTIxNCA6IDEgOiAxLjEKK1JVLVVOSy0xMjE1IDogMSA6IDEuMAorUlUtVU5LLTEyMTYgOiAxIDogMTEuOQorUlUtVU5LLTEyMTcgOiAxIDogMS4wCitSVS1VTkstMTIxOCA6IDEgOiAxLjAKK1JVLVVOSy0xMjE5IDogMSA6IDEuMAorUlUtVU5LLTEyMjAgOiAxIDogMy41CitSVS1VTkstMTIyMSA6IDEgOiAxLjAKK1JVLVVOSy0xMjIyIDogMSA6IDEwMjE2LjUKK1JVLVVOSy0xMjIzIDogMSA6IDEuNworUlUtVU5LLTEyMjQgOiAxIDogMTc4NDUuNAorUlUtVU5LLTEyMjUgOiAxIDogMTMuMQorUlUtVU5LLTEyMjYgOiAxIDogMS4wCitSVS1VTkstMTIyNyA6IDEgOiAyLjAKK1JVLVVOSy0xMjI4IDogMSA6IDIuMAorUlUtVU5LLTEyMjkgOiAxIDogMS40CitSVS1VTkstMTIzMCA6IDEgOiAyLjAKK1JVLVVOSy0xMjMxIDogMSA6IDEuOAorUlUtVU5LLTEyMzIgOiAxIDogNjMwLjA5OTk4CitSVS1VTkstMTIzMyA6IDEgOiA0LjQwMDAwMDEKK1JVLVVOSy0xMjM0IDogMSA6IDEuMAorUlUtVU5LLTEyMzUgOiAxIDogMS4wCitSVS1VTkstMTIzNiA6IDEgOiAxLjAKK1JVLVVOSy0xMjM3IDogMSA6IDEuMAorUlUtVU5LLTEyMzggOiAxIDogNC4wCitSVS1VTkstMTIzOSA6IDEgOiAxLjAKK1JVLVVOSy0xMjQwIDogMSA6IDEuMAorUlUtVU5LLTEyNDEgOiAxIDogMi4wOTk5OTk5CitSVS1VTkstMTI0MiA6IDEgOiAxLjAKK1JVLVVOSy0xMjQzIDogMSA6IDIuNTk5OTk5OQorUlUtVU5LLTEyNDQgOiAxIDogMS4wCitSVS1VTkstMTI0NSA6IDEgOiAxLjAKK1JVLVVOSy0xMjQ2IDogMSA6IDE1LjAKK1JVLVVOSy0xMjQ3IDogMSA6IDIuNTk5OTk5OQorUlUtVU5LLTEyNDggOiAxIDogMS4wCitSVS1VTkstMTI0OSA6IDEgOiAxLjAKK1JVLVVOSy0xMjUwIDogMSA6IDcuNjk5OTk5OAorUlUtVU5LLTEyNTEgOiAxIDogMS4wCitSVS1VTkstMTI1MiA6IDEgOiAxLjEKK1JVLVVOSy0xMjUzIDogMSA6IDEuMgorUlUtVU5LLTEyNTQgOiAxIDogMS4wCitSVS1VTkstMTI1NSA6IDEgOiAxNy4xCitSVS1VTkstMTI1NiA6IDEgOiAxLjQKK1JVLVVOSy0xMjU3IDogMSA6IDEuMgorUlUtVU5LLTEyNTggOiAxIDogMjAuMAorUlUtVU5LLTEyNTkgOiAxIDogNDcuNzk5OTk5CitSVS1VTkstMTI2MCA6IDEgOiAyMi45CitSVS1VTkstMTI2MSA6IDEgOiA0LjUKK1JVLVVOSy0xMjYyIDogMSA6IDIuMgorUlUtVU5LLTEyNjMgOiAxIDogMTMuMworUlUtVU5LLTEyNjQgOiAxIDogMTUuNQorUlUtVU5LLTEyNjUgOiAxIDogMS45CitSVS1VTkstMTI2NiA6IDEgOiAxLjAKK1JVLVVOSy0xMjY3IDogMSA6IDMuMgorUlUtVU5LLTEyNjggOiAxIDogNi41CitSVS1VTkstMTI2OSA6IDEgOiAzLjQwMDAwMDEKK1JVLVVOSy0xMjcwIDogMSA6IDEuOQorUlUtVU5LLTEyNzEgOiAxIDogMS4wCitSVS1VTkstMTI3MiA6IDEgOiAxOTI3LjcKK1JVLVVOSy0xMjczIDogMSA6IDcuNDAwMDAwMQorUlUtVU5LLTEyNzQgOiAxIDogMS45CitSVS1VTkstMTI3NSA6IDEgOiAyNTUuMgorUlUtVU5LLTEyNzYgOiAxIDogMS4wCitSVS1VTkstMTI3NyA6IDEgOiAxOTMzLjEKK1JVLVVOSy0xMjc4IDogMSA6IDM3LjA5OTk5OAorUlUtVU5LLTEyNzkgOiAxIDogMS4yCitSVS1VTkstMTI4MCA6IDEgOiA1NTM0LjI5OTgKK1JVLVVOSy0xMjgxIDogMSA6IDEyMS43CitSVS1VTkstMTI4MiA6IDEgOiAyMjE0LjYwMDEKK1JVLVVOSy0xMjgzIDogMSA6IDI4MDguMgorUlUtVU5LLTEyODQgOiAxIDogMTExNS42CitSVS1VTkstMTI4NSA6IDEgOiAxLjAKK1JVLVVOSy0xMjg2IDogMSA6IDQ5LjA5OTk5OAorUlUtVU5LLTEyODcgOiAxIDogNjAwLjI5OTk5CitSVS1VTkstMTI4OCA6IDEgOiAxNDkuNworUlUtVU5LLTEyODkgOiAxIDogMS40CitSVS1VTkstMTI5MCA6IDEgOiAzMjYuMjk5OTkKK1JVLVVOSy0xMjkxIDogMSA6IDQwLjI5OTk5OQorUlUtVU5LLTEyOTIgOiAxIDogMTUxNDMuNgorUlUtVU5LLTEyOTMgOiAxIDogMS4wCitSVS1VTkstMTI5NCA6IDEgOiAxNjg5LjkKK1JVLVVOSy0xMjk1IDogMSA6IDkwNzIuMAorUlUtVU5LLTEyOTYgOiAxIDogNDg5LjIwMDAxCitSVS1VTkstMTI5NyA6IDEgOiAyMzc3LjcKK1JVLVVOSy0xMjk4IDogMSA6IDI5NjI2LjQKK1JVLVVOSy0xMjk5IDogMSA6IDI5NjI2LjQKK1JVLVVOSy0xMzAwIDogMSA6IDQwLjQwMDAwMgorUlUtVU5LLTEzMDEgOiAxIDogMTg3MS42CitSVS1VTkstMTMwMiA6IDEgOiAzNzUuNzk5OTkKK1JVLVVOSy0xMzAzIDogMSA6IDI0LjUKK1JVLVVOSy0xMzA0IDogMSA6IDEuMAorUlUtVU5LLTEzMDUgOiAxIDogNS41OTk5OTk5CitSVS1VTkstMTMwNiA6IDEgOiAxLjAKK1JVLVVOSy0xMzA3IDogMSA6IDEyMTYuNgorUlUtVU5LLTEzMDggOiAxIDogNy45MDAwMDAxCitSVS1VTkstMTMwOSA6IDEgOiAyOC4yMDAwMDEKK1JVLVVOSy0xMzEwIDogMSA6IDUuOTAwMDAwMQorUlUtVU5LLTEzMTEgOiAxIDogMy4wOTk5OTk5CitSVS1VTkstMTMxMiA6IDEgOiA1LjgwMDAwMDIKK1JVLVVOSy0xMzEzIDogMSA6IDc0LjA5OTk5OAorUlUtVU5LLTEzMTQgOiAxIDogNjcuOTAwMDAyCitSVS1VTkstMTMxNSA6IDEgOiA1LjMwMDAwMDIKK1JVLVVOSy0xMzE2IDogMSA6IDQuMAorUlUtVU5LLTEzMTcgOiAxIDogMzEuMQorUlUtVU5LLTEzMTggOiAxIDogMS4wCitSVS1VTkstMTMxOSA6IDEgOiAxMi43CitSVS1VTkstMTMyMCA6IDEgOiAxMy4zCitSVS1VTkstMTMyMSA6IDEgOiAxLjEKK1JVLVVOSy0xMzIyIDogMSA6IDE5LjEKK1JVLVVOSy0xMzIzIDogMSA6IDEuMAorUlUtVU5LLTEzMjQgOiAxIDogMS4wCitSVS1VTkstMTMyNSA6IDEgOiAxLjgKK1JVLVVOSy0xMzI2IDogMSA6IDIuNQorUlUtVU5LLTEzMjcgOiAxIDogMi43CitSVS1VTkstMTMyOCA6IDEgOiAxOTAxLjgKK1JVLVVOSy0xMzI5IDogMSA6IDEuNgorUlUtVU5LLTEzMzAgOiAxIDogMy4yCitSVS1VTkstMTMzMSA6IDEgOiAxMS4yCitSVS1VTkstMTMzMiA6IDEgOiAxLjAKK1JVLVVOSy0xMzMzIDogMSA6IDguMAorUlUtVU5LLTEzMzQgOiAxIDogMi41OTk5OTk5CitSVS1VTkstMTMzNSA6IDEgOiAxLjAKK1JVLVVOSy0xMzM2IDogMSA6IDIuNworUlUtVU5LLTEzMzcgOiAxIDogMS4yCitSVS1VTkstMTMzOCA6IDEgOiAxLjAKK1JVLVVOSy0xMzM5IDogMSA6IDEuMAorUlUtVU5LLTEzNDAgOiAxIDogMS4wCitSVS1VTkstMTM0MSA6IDEgOiAxLjAKK1JVLVVOSy0xMzQyIDogMSA6IDEuMgorUlUtVU5LLTEzNDMgOiAxIDogMTU0LjcKK1JVLVVOSy0xMzQ0IDogMSA6IDkuMzk5OTk5NgorUlUtVU5LLTEzNDUgOiAxIDogNTEuNTk5OTk4CitSVS1VTkstMTM0NiA6IDEgOiA3NC4wOTk5OTgKK1JVLVVOSy0xMzQ3IDogMSA6IDM5MzYuMgorUlUtVU5LLTEzNDggOiAxIDogNS45MDAwMDAxCitSVS1VTkstMTM0OSA6IDEgOiAzMC4yOTk5OTkKK1JVLVVOSy0xMzUwIDogMSA6IDEuMAorUlUtVU5LLTEzNTEgOiAxIDogMS4wCitSVS1VTkstMTM1MiA6IDEgOiAyLjA5OTk5OTkKK1JVLVVOSy0xMzUzIDogMSA6IDMuOTAwMDAwMQorUlUtVU5LLTEzNTQgOiAxIDogMjI2OS4zCitSVS1VTkstMTM1NSA6IDEgOiAyLjcKK1JVLVVOSy0xMzU2IDogMSA6IDcuMDk5OTk5OQorUlUtVU5LLTEzNTcgOiAxIDogMjIuMjk5OTk5CitSVS1VTkstMTM1OCA6IDEgOiAxMy44CitSVS1VTkstMTM1OSA6IDEgOiAzMi4yMDAwMDEKK1JVLVVOSy0xMzYwIDogMSA6IDE4Ljc5OTk5OQorUlUtVU5LLTEzNjEgOiAxIDogMy4wOTk5OTk5CitSVS1VTkstMTM2MiA6IDEgOiA2NS4wOTk5OTgKK1JVLVVOSy0xMzYzIDogMSA6IDIuMgorUlUtVU5LLTEzNjQgOiAxIDogMS45CitSVS1VTkstMTM2NSA6IDEgOiAxMi4zCitSVS1VTkstMTM2NiA6IDEgOiAxNi42CitSVS1VTkstMTM2NyA6IDEgOiAyMy41CitSVS1VTkstMTM2OCA6IDEgOiAyLjcKK1JVLVVOSy0xMzY5IDogMSA6IDcuMTk5OTk5OAorUlUtVU5LLTEzNzAgOiAxIDogOC44OTk5OTk2CitSVS1VTkstMTM3MSA6IDEgOiAxOC42CitSVS1VTkstMTM3MiA6IDEgOiAzNC40MDAwMDIKK1JVLVVOSy0xMzczIDogMSA6IDIzNy4zOTk5OQorUlUtVU5LLTEzNzQgOiAxIDogOTQuMAorUlUtVU5LLTEzNzUgOiAxIDogNS4wCitSVS1VTkstMTM3NiA6IDEgOiAyODk5LjMKK1JVLVVOSy0xMzc3IDogMSA6IDMwLjQKK1JVLVVOSy0xMzc4IDogMSA6IDQuMzAwMDAwMgorUlUtVU5LLTEzNzkgOiAxIDogNTE1LjA5OTk4CitSVS1VTkstMTM4MCA6IDEgOiA0LjkwMDAwMDEKK1JVLVVOSy0xMzgxIDogMSA6IDIuNTk5OTk5OQorUlUtVU5LLTEzODIgOiAxIDogMS4wCitSVS1VTkstMTM4MyA6IDEgOiAyLjUKK1JVLVVOSy0xMzg0IDogMSA6IDM0LjA5OTk5OAorUlUtVU5LLTEzODUgOiAxIDogMy41CitSVS1VTkstMTM4NiA6IDEgOiA2LjMwMDAwMDIKK1JVLVVOSy0xMzg3IDogMSA6IDExMC45CitSVS1VTkstMTM4OCA6IDEgOiAxLjYKK1JVLVVOSy0xMzg5IDogMSA6IDEuMAorUlUtVU5LLTEzOTAgOiAxIDogMS4xCitSVS1VTkstMTM5MSA6IDEgOiAxMi4wCitSVS1VTkstMTM5MiA6IDEgOiA2NS41CitSVS1VTkstMTM5MyA6IDEgOiAxNi4wCitSVS1VTkstMTM5NCA6IDEgOiAxMi40CitSVS1VTkstMTM5NSA6IDEgOiAxLjAKK1JVLVVOSy0xMzk2IDogMSA6IDMuMworUlUtVU5LLTEzOTcgOiAxIDogMS4zCitSVS1VTkstMTM5OCA6IDEgOiAxMDkuMworUlUtVU5LLTEzOTkgOiAxIDogMTUuMAorUlUtVU5LLTE0MDAgOiAxIDogNi42OTk5OTk4CitSVS1VTkstMTQwMSA6IDEgOiAxLjAKK1JVLVVOSy0xNDAyIDogMSA6IDMwLjYKK1JVLVVOSy0xNDAzIDogMSA6IDYuMTk5OTk5OAorUlUtVU5LLTE0MDQgOiAxIDogMS43CitSVS1VTkstMTQwNSA6IDEgOiAxLjYKK1JVLVVOSy0xNDA2IDogMSA6IDE3LjEKK1JVLVVOSy0xNDA3IDogMSA6IDEuMAorUlUtVU5LLTE0MDggOiAxIDogMS43CitSVS1VTkstMTQwOSA6IDEgOiAxLjAKK1JVLVVOSy0xNDEwIDogMSA6IDUuODAwMDAwMgorUlUtVU5LLTE0MTEgOiAxIDogMi44CitSVS1VTkstMTQxMiA6IDEgOiAzMy45MDAwMDIKK1JVLVVOSy0xNDEzIDogMSA6IDI5Ny44OTk5OQorUlUtVU5LLTE0MTQgOiAxIDogMjc4LjUKK1JVLVVOSy0xNDE1IDogMSA6IDEuMAorUlUtVU5LLTE0MTYgOiAxIDogMzIuNTk5OTk4CitSVS1VTkstMTQxNyA6IDEgOiAxLjUKK1JVLVVOSy0xNDE4IDogMSA6IDMuNDAwMDAwMQorUlUtVU5LLTE0MTkgOiAxIDogMS4wCitSVS1VTkstMTQyMCA6IDEgOiAzOS4wOTk5OTgKK1JVLVVOSy0xNDIxIDogMSA6IDM0NC43OTk5OQorUlUtVU5LLTE0MjIgOiAxIDogMS4wCitSVS1VTkstMTQyMyA6IDEgOiA0LjMwMDAwMDIKK1JVLVVOSy0xNDI0IDogMSA6IDEuNAorUlUtVU5LLTE0MjUgOiAxIDogMTQxLjEwMDAxCitSVS1VTkstMTQyNiA6IDEgOiA1MTAuNjAwMDEKK1JVLVVOSy0xNDI3IDogMSA6IDIuMAorUlUtVU5LLTE0MjggOiAxIDogMS4wCitSVS1VTkstMTQyOSA6IDEgOiAxMC40CitSVS1VTkstMTQzMCA6IDEgOiA1Ny43OTk5OTkKK1JVLVVOSy0xNDMxIDogMSA6IDg3MjcuNTk5NgorUlUtVU5LLTE0MzIgOiAxIDogMS41CitSVS1VTkstMTQzMyA6IDEgOiAxLjAKK1JVLVVOSy0xNDM0IDogMSA6IDE2Mi4xMDAwMQorUlUtVU5LLTE0MzUgOiAxIDogNDMuMDk5OTk4CitSVS1VTkstMTQzNiA6IDEgOiA0MjkuMAorUlUtVU5LLTE0MzcgOiAxIDogMS43CitSVS1VTkstMTQzOCA6IDEgOiAxLjAKK1JVLVVOSy0xNDM5IDogMSA6IDE2NTQuOQorUlUtVU5LLTE0NDAgOiAxIDogMTEzLjAKK1JVLVVOSy0xNDQxIDogMSA6IDI1LjQKK1JVLVVOSy0xNDQyIDogMSA6IDQyNS41CitSVS1VTkstMTQ0MyA6IDEgOiA0MDguNQorUlUtVU5LLTE0NDQgOiAxIDogOTMyLjA5OTk4CitSVS1VTkstMTQ0NSA6IDEgOiA0LjE5OTk5OTgKK1JVLVVOSy0xNDQ2IDogMSA6IDI3LjEKK1JVLVVOSy0xNDQ3IDogMSA6IDE1MC41CitSVS1VTkstMTQ0OCA6IDEgOiAyLjUKK1JVLVVOSy0xNDQ5IDogMSA6IDEuMAorUlUtVU5LLTE0NTAgOiAxIDogOC44OTk5OTk2CitSVS1VTkstMTQ1MSA6IDEgOiAyODQuMjk5OTkKK1JVLVVOSy0xNDUyIDogMSA6IDIuMAorUlUtVU5LLTE0NTMgOiAxIDogMjc0NC43CitSVS1VTkstMTQ1NCA6IDEgOiAyMzYuMworUlUtVU5LLTE0NTUgOiAxIDogMzM2LjM5OTk5CitSVS1VTkstMTQ1NiA6IDEgOiAxLjAKK1JVLVVOSy0xNDU3IDogMSA6IDIwMzUuNgorUlUtVU5LLTE0NTggOiAxIDogMTA2My4xCitSVS1VTkstMTQ1OSA6IDEgOiAzNTEuODk5OTkKK1JVLVVOSy0xNDYwIDogMSA6IDEuMAorUlUtVU5LLTE0NjEgOiAxIDogMS4zCitSVS1VTkstMTQ2MiA6IDEgOiAxLjAKK1JVLVVOSy0xNDYzIDogMSA6IDEuMAorUlUtVU5LLTE0NjQgOiAxIDogNzMuOTAwMDAyCitSVS1VTkstMTQ2NSA6IDEgOiAxLjUKK1JVLVVOSy0xNDY2IDogMSA6IDEuMAorUlUtVU5LLTE0NjcgOiAxIDogMTExLjMKK1JVLVVOSy0xNDY4IDogMSA6IDIxLjIwMDAwMQorUlUtVU5LLTE0NjkgOiAxIDogMTUzLjM5OTk5CitSVS1VTkstMTQ3MCA6IDEgOiA0LjMwMDAwMDIKK1JVLVVOSy0xNDcxIDogMSA6IDU4LjI5OTk5OQorUlUtVU5LLTE0NzIgOiAxIDogNi45MDAwMDAxCitSVS1VTkstMTQ3MyA6IDEgOiAxMC42CitSVS1VTkstMTQ3NCA6IDEgOiA1Ny4wCitSVS1VTkstMTQ3NSA6IDEgOiA5NzYuNzAwMDEKK1JVLVVOSy0xNDc2IDogMSA6IDI1LjI5OTk5OQorUlUtVU5LLTE0NzcgOiAxIDogNDIuNDAwMDAyCitSVS1VTkstMTQ3OCA6IDEgOiAxNC4wCitSVS1VTkstMTQ3OSA6IDEgOiA1MDUuNQorUlUtVU5LLTE0ODAgOiAxIDogMS4xCitSVS1VTkstMTQ4MSA6IDEgOiA1LjA5OTk5OTkKK1JVLVVOSy0xNDgyIDogMSA6IDIwLjEKK1JVLVVOSy0xNDgzIDogMSA6IDYzNC43OTk5OQorUlUtVU5LLTE0ODQgOiAxIDogMS4wCitSVS1VTkstMTQ4NSA6IDEgOiAxLjMKK1JVLVVOSy0xNDg2IDogMSA6IDIuMAorUlUtVU5LLTE0ODcgOiAxIDogMTEuNworUlUtVU5LLTE0ODggOiAxIDogNzMuMAorUlUtVU5LLTE0ODkgOiAxIDogNjIuNQorUlUtVU5LLTE0OTAgOiAxIDogNC42OTk5OTk4CitSVS1VTkstMTQ5MSA6IDEgOiAyLjU5OTk5OTkKK1JVLVVOSy0xNDkyIDogMSA6IDE4Ni4wCitSVS1VTkstMTQ5MyA6IDEgOiAxOS42CitSVS1VTkstMTQ5NCA6IDEgOiAxMi4xCitSVS1VTkstMTQ5NSA6IDEgOiAxNDA0Ny4wCitSVS1VTkstMTQ5NiA6IDEgOiA0LjgwMDAwMDIKK1JVLVVOSy0xNDk3IDogMSA6IDEuMQorUlUtVU5LLTE0OTggOiAxIDogNi41OTk5OTk5CitSVS1VTkstMTQ5OSA6IDEgOiAxLjAKK1JVLVVOSy0xNTAwIDogMSA6IDQuMzAwMDAwMgorUlUtVU5LLTE1MDEgOiAxIDogMi4yCitSVS1VTkstMTUwMiA6IDEgOiAyNzMuNjAwMDEKK1JVLVVOSy0xNTAzIDogMSA6IDEuMAorUlUtVU5LLTE1MDQgOiAxIDogNDMuNQorUlUtVU5LLTE1MDUgOiAxIDogMS4wCitSVS1VTkstMTUwNiA6IDEgOiAyNjEuODk5OTkKK1JVLVVOSy0xNTA3IDogMSA6IDEuMgorUlUtVU5LLTE1MDggOiAxIDogMTUzMC43CitSVS1VTkstMTUwOSA6IDEgOiA2LjY5OTk5OTgKK1JVLVVOSy0xNTEwIDogMSA6IDMyLjUKK1JVLVVOSy0xNTExIDogMSA6IDIuMgorUlUtVU5LLTE1MTIgOiAxIDogNS41OTk5OTk5CitSVS1VTkstMTUxMyA6IDEgOiAyLjMKK1JVLVVOSy0xNTE0IDogMSA6IDEuOAorUlUtVU5LLTE1MTUgOiAxIDogMS4wCitSVS1VTkstMTUxNiA6IDEgOiAxLjYKK1JVLVVOSy0xNTE3IDogMSA6IDEuMAorUlUtVU5LLTE1MTggOiAxIDogMS4wCitSVS1VTkstMTUxOSA6IDEgOiA0OC4yOTk5OTkKK1JVLVVOSy0xNTIwIDogMSA6IDEuMAorUlUtVU5LLTE1MjEgOiAxIDogMS4yCitSVS1VTkstMTUyMiA6IDEgOiAxMy4yCitSVS1VTkstMTUyMyA6IDEgOiAxLjAKK1JVLVVOSy0xNTI0IDogMSA6IDEuNgorUlUtVU5LLTE1MjUgOiAxIDogMS40CitSVS1VTkstMTUyNiA6IDEgOiAxLjAKK1JVLVVOSy0xNTI3IDogMSA6IDMyLjIwMDAwMQorUlUtVU5LLTE1MjggOiAxIDogMS4wCitSVS1VTkstMTUyOSA6IDEgOiAyODAuMAorUlUtVU5LLTE1MzAgOiAxIDogMS4wCitSVS1VTkstMTUzMSA6IDEgOiAxLjQKK1JVLVVOSy0xNTMyIDogMSA6IDEuMAorUlUtVU5LLTE1MzMgOiAxIDogMjIuMjAwMDAxCitSVS1VTkstMTUzNCA6IDEgOiAzLjIKK1JVLVVOSy0xNTM1IDogMSA6IDEwLjgKK1JVLVVOSy0xNTM2IDogMSA6IDEuMAorUlUtVU5LLTE1MzcgOiAxIDogMTEuNQorUlUtVU5LLTE1MzggOiAxIDogMS4wCitSVS1VTkstMTUzOSA6IDEgOiA0LjUKK1JVLVVOSy0xNTQwIDogMSA6IDM0LjUKK1JVLVVOSy0xNTQxIDogMSA6IDEuMAorUlUtVU5LLTE1NDIgOiAxIDogMzAuNgorUlUtVU5LLTE1NDMgOiAxIDogMTA1ODIuNworUlUtVU5LLTE1NDQgOiAxIDogMS4wCitSVS1VTkstMTU0NSA6IDEgOiAyLjU5OTk5OTkKK1JVLVVOSy0xNTQ2IDogMSA6IDEuMAorUlUtVU5LLTE1NDcgOiAxIDogMTIuNAorUlUtVU5LLTE1NDggOiAxIDogMS40CitSVS1VTkstMTU0OSA6IDEgOiAxLjUKK1JVLVVOSy0xNTUwIDogMSA6IDEyLjIKK1JVLVVOSy0xNTUxIDogMSA6IDEuMAorUlUtVU5LLTE1NTIgOiAxIDogNi4wCitSVS1VTkstMTU1MyA6IDEgOiAxLjIKK1JVLVVOSy0xNTU0IDogMSA6IDEuMQorUlUtVU5LLTE1NTUgOiAxIDogMi40MDAwMDAxCitSVS1VTkstMTU1NiA6IDEgOiAxLjAKK1JVLVVOSy0xNTU3IDogMSA6IDEuMAorUlUtVU5LLTE1NTggOiAxIDogNC42OTk5OTk4CitSVS1VTkstMTU1OSA6IDEgOiAxLjAKK1JVLVVOSy0xNTYwIDogMSA6IDEuMAorUlUtVU5LLTE1NjEgOiAxIDogMS4wCitSVS1VTkstMTU2MiA6IDEgOiAxLjAKK1JVLVVOSy0xNTYzIDogMSA6IDcuMzAwMDAwMgorUlUtVU5LLTE1NjQgOiAxIDogMS40CitSVS1VTkstMTU2NSA6IDEgOiAzLjAKK1JVLVVOSy0xNTY2IDogMSA6IDEuMQorUlUtVU5LLTE1NjcgOiAxIDogMi4yCitSVS1VTkstMTU2OCA6IDEgOiAxLjUKK1JVLVVOSy0xNTY5IDogMSA6IDEuNQorUlUtVU5LLTE1NzAgOiAxIDogMS4wCitSVS1VTkstMTU3MSA6IDEgOiAxMDQuMgorUlUtVU5LLTE1NzIgOiAxIDogNC40MDAwMDAxCitSVS1VTkstMTU3MyA6IDEgOiAxLjAKK1JVLVVOSy0xNTc0IDogMSA6IDEuMAorUlUtVU5LLTE1NzUgOiAxIDogMTQuOAorUlUtVU5LLTE1NzYgOiAxIDogMjQ4LjcKK1JVLVVOSy0xNTc3IDogMSA6IDEuMworUlUtVU5LLTE1NzggOiAxIDogMS4wCitSVS1VTkstMTU3OSA6IDEgOiAxLjAKK1JVLVVOSy0xNTgwIDogMSA6IDEuMAorUlUtVU5LLTE1ODEgOiAxIDogMS4wCitSVS1VTkstMTU4MiA6IDEgOiAxLjAKK1JVLVVOSy0xNTgzIDogMSA6IDEuMAorUlUtVU5LLTE1ODQgOiAxIDogMS4wCitSVS1VTkstMTU4NSA6IDEgOiAxLjAKK1JVLVVOSy0xNTg2IDogMSA6IDIuNTk5OTk5OQorUlUtVU5LLTE1ODcgOiAxIDogMy4zCitSVS1VTkstMTU4OCA6IDEgOiA1LjQwMDAwMDEKK1JVLVVOSy0xNTg5IDogMSA6IDI0LjIwMDAwMQorUlUtVU5LLTE1OTAgOiAxIDogMi44CitSVS1VTkstMTU5MSA6IDEgOiAxLjMKK1JVLVVOSy0xNTkyIDogMSA6IDIuMgorUlUtVU5LLTE1OTMgOiAxIDogMzIuNQorUlUtVU5LLTE1OTQgOiAxIDogMS4wCitSVS1VTkstMTU5NSA6IDEgOiA0OC40MDAwMDIKK1JVLVVOSy0xNTk2IDogMSA6IDYuMAorUlUtVU5LLTE1OTcgOiAxIDogMS44CitSVS1VTkstMTU5OCA6IDEgOiAyLjAKK1JVLVVOSy0xNTk5IDogMSA6IDEuMgorUlUtVU5LLTE2MDAgOiAxIDogOTIuMDk5OTk4CitSVS1VTkstMTYwMSA6IDEgOiA3LjkwMDAwMDEKK1JVLVVOSy0xNjAyIDogMSA6IDguODk5OTk5NgorUlUtVU5LLTE2MDMgOiAxIDogOC4zMDAwMDAyCitSVS1VTkstMTYwNCA6IDEgOiAyLjAKK1JVLVVOSy0xNjA1IDogMSA6IDE0My4zCitSVS1VTkstMTYwNiA6IDEgOiAxLjAKK1JVLVVOSy0xNjA3IDogMSA6IDI0LjkKK1JVLVVOSy0xNjA4IDogMSA6IDEuMAorUlUtVU5LLTE2MDkgOiAxIDogNS4wCitSVS1VTkstMTYxMCA6IDEgOiA0LjQwMDAwMDEKK1JVLVVOSy0xNjExIDogMSA6IDEuNgorUlUtVU5LLTE2MTIgOiAxIDogMzIzLjc5OTk5CitSVS1VTkstMTYxMyA6IDEgOiAxLjEKK1JVLVVOSy0xNjE0IDogMSA6IDcuMzAwMDAwMgorUlUtVU5LLTE2MTUgOiAxIDogMS42CitSVS1VTkstMTYxNiA6IDEgOiA1OS41CitSVS1VTkstMTYxNyA6IDEgOiAxNy4yOTk5OTkKK1JVLVVOSy0xNjE4IDogMSA6IDEuMgorUlUtVU5LLTE2MTkgOiAxIDogMS4yCitSVS1VTkstMTYyMCA6IDEgOiAxLjAKK1JVLVVOSy0xNjIxIDogMSA6IDEuMAorUlUtVU5LLTE2MjIgOiAxIDogMS4zCitSVS1VTkstMTYyMyA6IDEgOiAyLjA5OTk5OTkKK1JVLVVOSy0xNjI0IDogMSA6IDEuMAorUlUtVU5LLTE2MjUgOiAxIDogNC4zMDAwMDAyCitSVS1VTkstMTYyNiA6IDEgOiAyNC41CitSVS1VTkstMTYyNyA6IDEgOiA0NTkyNC42OTkKK1JVLVVOSy0xNjI4IDogMSA6IDEuMAorUlUtVU5LLTE2MjkgOiAxIDogMS4wCitSVS1VTkstMTYzMCA6IDEgOiAxLjUKK1JVLVVOSy0xNjMxIDogMSA6IDEuMAorUlUtVU5LLTE2MzIgOiAxIDogMS4wCitSVS1VTkstMTYzMyA6IDEgOiA3LjA5OTk5OTkKK1JVLVVOSy0xNjM0IDogMSA6IDEuNgorUlUtVU5LLTE2MzUgOiAxIDogNi41CitSVS1VTkstMTYzNiA6IDEgOiA0Ny40MDAwMDIKK1JVLVVOSy0xNjM3IDogMSA6IDEuMAorUlUtVU5LLTE2MzggOiAxIDogMS4wCitSVS1VTkstMTYzOSA6IDEgOiA3LjkwMDAwMDEKK1JVLVVOSy0xNjQwIDogMSA6IDIuNTk5OTk5OQorUlUtVU5LLTE2NDEgOiAxIDogMS4wCitSVS1VTkstMTY0MiA6IDEgOiAzLjQwMDAwMDEKK1JVLVVOSy0xNjQzIDogMSA6IDEuOAorUlUtVU5LLTE2NDQgOiAxIDogNi40MDAwMDAxCitSVS1VTkstMTY0NSA6IDEgOiA3LjkwMDAwMDEKK1JVLVVOSy0xNjQ2IDogMSA6IDEuMAorUlUtVU5LLTE2NDcgOiAxIDogMTMuOQorUlUtVU5LLTE2NDggOiAxIDogMi41CitSVS1VTkstMTY0OSA6IDEgOiAxLjAKK1JVLVVOSy0xNjUwIDogMSA6IDEuOAorUlUtVU5LLTE2NTEgOiAxIDogNC4wOTk5OTk5CitSVS1VTkstMTY1MiA6IDEgOiA5LjMwMDAwMDIKK1JVLVVOSy0xNjUzIDogMSA6IDYuMAorUlUtVU5LLTE2NTQgOiAxIDogMS40CitSVS1VTkstMTY1NSA6IDEgOiAxLjAKK1JVLVVOSy0xNjU2IDogMSA6IDM2LjAKK1JVLVVOSy0xNjU3IDogMSA6IDEuMAorUlUtVU5LLTE2NTggOiAxIDogMS4yCitSVS1VTkstMTY1OSA6IDEgOiAxNDAuMzk5OTkKK1JVLVVOSy0xNjYwIDogMSA6IDUuMAorUlUtVU5LLTE2NjEgOiAxIDogMTIuNQorUlUtVU5LLTE2NjIgOiAxIDogMS4wCitSVS1VTkstMTY2MyA6IDEgOiAxLjAKK1JVLVVOSy0xNjY0IDogMSA6IDUuNjk5OTk5OAorUlUtVU5LLTE2NjUgOiAxIDogMTUuMgorUlUtVU5LLTE2NjYgOiAxIDogMS4wCitSVS1VTkstMTY2NyA6IDEgOiAxLjAKK1JVLVVOSy0xNjY4IDogMSA6IDMuMgorUlUtVU5LLTE2NjkgOiAxIDogMTUuMQorUlUtVU5LLTE2NzAgOiAxIDogMi41OTk5OTk5CitSVS1VTkstMTY3MSA6IDEgOiAzMy41CitSVS1VTkstMTY3MiA6IDEgOiA0LjUKK1JVLVVOSy0xNjczIDogMSA6IDguMzk5OTk5NgorUlUtVU5LLTE2NzQgOiAxIDogNjEuMjk5OTk5CitSVS1VTkstMTY3NSA6IDEgOiA3Ny40MDAwMDIKK1JVLVVOSy0xNjc2IDogMSA6IDQwLjkwMDAwMgorUlUtVU5LLTE2NzcgOiAxIDogMS4wCitSVS1VTkstMTY3OCA6IDEgOiAxLjAKK1JVLVVOSy0xNjc5IDogMSA6IDEzLjAKK1JVLVVOSy0xNjgwIDogMSA6IDUuNjk5OTk5OAorUlUtVU5LLTE2ODEgOiAxIDogMS4wCitSVS1VTkstMTY4MiA6IDEgOiA3LjgwMDAwMDIKK1JVLVVOSy0xNjgzIDogMSA6IDIxMS42MDAwMQorUlUtVU5LLTE2ODQgOiAxIDogMS4zCitSVS1VTkstMTY4NSA6IDEgOiAzMS41CitSVS1VTkstMTY4NiA6IDEgOiAxLjEKK1JVLVVOSy0xNjg3IDogMSA6IDEuNQorUlUtVU5LLTE2ODggOiAxIDogMy44CitSVS1VTkstMTY4OSA6IDEgOiAxLjkKK1JVLVVOSy0xNjkwIDogMSA6IDEuNAorUlUtVU5LLTE2OTEgOiAxIDogNy40MDAwMDAxCitSVS1VTkstMTY5MiA6IDEgOiAyLjUKK1JVLVVOSy0xNjkzIDogMSA6IDIuNworUlUtVU5LLTE2OTQgOiAxIDogMTEuMQorUlUtVU5LLTE2OTUgOiAxIDogNC41CitSVS1VTkstMTY5NiA6IDEgOiAxLjYKK1JVLVVOSy0xNjk3IDogMSA6IDEuOQorUlUtVU5LLTE2OTggOiAxIDogNC41OTk5OTk5CitSVS1VTkstMTY5OSA6IDEgOiAxLjAKK1JVLVVOSy0xNzAwIDogMSA6IDUuNTk5OTk5OQorUlUtVU5LLTE3MDEgOiAxIDogOS44OTk5OTk2CitSVS1VTkstMTcwMiA6IDEgOiAyMC4yOTk5OTkKK1JVLVVOSy0xNzAzIDogMSA6IDIuMgorUlUtVU5LLTE3MDQgOiAxIDogMi4zCitSVS1VTkstMTcwNSA6IDEgOiAyLjcKK1JVLVVOSy0xNzA2IDogMSA6IDEuMAorUlUtVU5LLTE3MDcgOiAxIDogMS4wCitSVS1VTkstMTcwOCA6IDEgOiAxLjAKK1JVLVVOSy0xNzA5IDogMSA6IDQ2LjA5OTk5OAorUlUtVU5LLTE3MTAgOiAxIDogMS41CitSVS1VTkstMTcxMSA6IDEgOiAxLjgKK1JVLVVOSy0xNzEyIDogMSA6IDIuNQorUlUtVU5LLTE3MTMgOiAxIDogMS4yCitSVS1VTkstMTcxNCA6IDEgOiAyLjcKK1JVLVVOSy0xNzE1IDogMSA6IDEuMgorUlUtVU5LLTE3MTYgOiAxIDogMy41OTk5OTk5CitSVS1VTkstMTcxNyA6IDEgOiAxLjUKK1JVLVVOSy0xNzE4IDogMSA6IDQuOTAwMDAwMQorUlUtVU5LLTE3MTkgOiAxIDogNy42OTk5OTk4CitSVS1VTkstMTcyMCA6IDEgOiA4NS40MDAwMDIKK1JVLVVOSy0xNzIxIDogMSA6IDI1Ljc5OTk5OQorUlUtVU5LLTE3MjIgOiAxIDogMzk4LjcwMDAxCitSVS1VTkstMTcyMyA6IDEgOiAxLjAKK1JVLVVOSy0xNzI0IDogMSA6IDEuMAorUlUtVU5LLTE3MjUgOiAxIDogNi4wOTk5OTk5CitSVS1VTkstMTcyNiA6IDEgOiAzLjcKK1JVLVVOSy0xNzI3IDogMSA6IDUzLjU5OTk5OAorUlUtVU5LLTE3MjggOiAxIDogMy4yCitSVS1VTkstMTcyOSA6IDEgOiAyLjcKK1JVLVVOSy0xNzMwIDogMSA6IDQuMAorUlUtVU5LLTE3MzEgOiAxIDogMy4wCitSVS1VTkstMTczMiA6IDEgOiAxLjAKK1JVLVVOSy0xNzMzIDogMSA6IDEuMAorUlUtVU5LLTE3MzQgOiAxIDogNC4xOTk5OTk4CitSVS1VTkstMTczNSA6IDEgOiAyNC43OTk5OTkKK1JVLVVOSy0xNzM2IDogMSA6IDI0NjY5LjQKK1JVLVVOSy0xNzM3IDogMSA6IDEuMAorUlUtVU5LLTE3MzggOiAxIDogNjEuMjAwMDAxCitSVS1VTkstMTczOSA6IDEgOiAxLjUKK1JVLVVOSy0xNzQwIDogMSA6IDY2LjkwMDAwMgorUlUtVU5LLTE3NDEgOiAxIDogMS4wCitSVS1VTkstMTc0MiA6IDEgOiAxLjAKK1JVLVVOSy0xNzQzIDogMSA6IDEuNAorUlUtVU5LLTE3NDQgOiAxIDogMS4wCitSVS1VTkstMTc0NSA6IDEgOiA5Mi40MDAwMDIKK1JVLVVOSy0xNzQ2IDogMSA6IDQuMTk5OTk5OAorUlUtVU5LLTE3NDcgOiAxIDogMS4zCitSVS1VTkstMTc0OCA6IDEgOiAxLjAKK1JVLVVOSy0xNzQ5IDogMSA6IDEuMAorUlUtVU5LLTE3NTAgOiAxIDogMS4zCitSVS1VTkstMTc1MSA6IDEgOiAxLjAKK1JVLVVOSy0xNzUyIDogMSA6IDEuMgorUlUtVU5LLTE3NTMgOiAxIDogMS4wCitSVS1VTkstMTc1NCA6IDEgOiAxLjAKK1JVLVVOSy0xNzU1IDogMSA6IDEuMAorUlUtVU5LLTE3NTYgOiAxIDogMS4wCitSVS1VTkstMTc1NyA6IDEgOiAxLjAKK1JVLVVOSy0xNzU4IDogMSA6IDEuMAorUlUtVU5LLTE3NTkgOiAxIDogOS4xMDAwMDA0CitSVS1VTkstMTc2MCA6IDEgOiA0LjE5OTk5OTgKK1JVLVVOSy0xNzYxIDogMSA6IDguMzAwMDAwMgorUlUtVU5LLTE3NjIgOiAxIDogMS4wCitSVS1VTkstMTc2MyA6IDEgOiAxLjAKK1JVLVVOSy0xNzY0IDogMSA6IDkuNQorUlUtVU5LLTE3NjUgOiAxIDogOC42MDAwMDA0CitSVS1VTkstMTc2NiA6IDEgOiAxMDEuNQorUlUtVU5LLTE3NjcgOiAxIDogNy42OTk5OTk4CitSVS1VTkstMTc2OCA6IDEgOiAzMC42CitSVS1VTkstMTc2OSA6IDEgOiA1OC4yOTk5OTkKK1JVLVVOSy0xNzcwIDogMSA6IDEuMQorUlUtVU5LLTE3NzEgOiAxIDogMS4wCitSVS1VTkstMTc3MiA6IDEgOiAxLjgKK1JVLVVOSy0xNzczIDogMSA6IDE2LjQKK1JVLVVOSy0xNzc0IDogMSA6IDUyNi45MDAwMgorUlUtVU5LLTE3NzUgOiAxIDogNC45MDAwMDAxCitSVS1VTkstMTc3NiA6IDEgOiAxMy44CitSVS1VTkstMTc3NyA6IDEgOiAyLjkwMDAwMDEKK1JVLVVOSy0xNzc4IDogMSA6IDEuMAorUlUtVU5LLTE3NzkgOiAxIDogMS4wCitSVS1VTkstMTc4MCA6IDEgOiAxLjAKK1JVLVVOSy0xNzgxIDogMSA6IDEuMAorUlUtVU5LLTE3ODIgOiAxIDogMi40MDAwMDAxCitSVS1VTkstMTc4MyA6IDEgOiAxLjAKK1JVLVVOSy0xNzg0IDogMSA6IDIuMworUlUtVU5LLTE3ODUgOiAxIDogMS4xCitSVS1VTkstMTc4NiA6IDEgOiAxLjAKK1JVLVVOSy0xNzg3IDogMSA6IDUuNjk5OTk5OAorUlUtVU5LLTE3ODggOiAxIDogMS43CitSVS1VTkstMTc4OSA6IDEgOiA2MjE2LjYwMDEKK1JVLVVOSy0xNzkwIDogMSA6IDEuMAorUlUtVU5LLTE3OTEgOiAxIDogMS4wCitSVS1VTkstMTc5MiA6IDEgOiAxLjQKK1JVLVVOSy0xNzkzIDogMSA6IDcuMzAwMDAwMgorUlUtVU5LLTE3OTQgOiAxIDogNDguMjAwMDAxCitSVS1VTkstMTc5NSA6IDEgOiAxMi4zCitSVS1VTkstMTc5NiA6IDEgOiAyNTkuMzk5OTkKK1JVLVVOSy0xNzk3IDogMSA6IDEuMAorUlUtVU5LLTE3OTggOiAxIDogNy40MDAwMDAxCitSVS1VTkstMTc5OSA6IDEgOiAxLjAKK1JVLVVOSy0xODAwIDogMSA6IDEuMAorUlUtVU5LLTE4MDEgOiAxIDogMy41CitSVS1VTkstMTgwMiA6IDEgOiAxLjAKK1JVLVVOSy0xODAzIDogMSA6IDUuNTk5OTk5OQorUlUtVU5LLTE4MDQgOiAxIDogMTEuMgorUlUtVU5LLTE4MDUgOiAxIDogNC45MDAwMDAxCitSVS1VTkstMTgwNiA6IDEgOiAyNTMuMzk5OTkKK1JVLVVOSy0xODA3IDogMSA6IDMuMAorUlUtVU5LLTE4MDggOiAxIDogMS42CitSVS1VTkstMTgwOSA6IDEgOiAxLjkKK1JVLVVOSy0xODEwIDogMSA6IDEuMgorUlUtVU5LLTE4MTEgOiAxIDogMS4wCitSVS1VTkstMTgxMiA6IDEgOiA1LjkwMDAwMDEKK1JVLVVOSy0xODEzIDogMSA6IDQuNDAwMDAwMQorUlUtVU5LLTE4MTQgOiAxIDogNi4wCitSVS1VTkstMTgxNSA6IDEgOiAyOC4wCitSVS1VTkstMTgxNiA6IDEgOiAzLjIKK1JVLVVOSy0xODE3IDogMSA6IDU1LjAKK1JVLVVOSy0xODE4IDogMSA6IDIuMDk5OTk5OQorUlUtVU5LLTE4MTkgOiAxIDogMS4yCitSVS1VTkstMTgyMCA6IDEgOiAyLjAKK1JVLVVOSy0xODIxIDogMSA6IDEuNAorUlUtVU5LLTE4MjIgOiAxIDogODAuOTAwMDAyCitSVS1VTkstMTgyMyA6IDEgOiA4LjAKK1JVLVVOSy0xODI0IDogMSA6IDIuMDk5OTk5OQorUlUtVU5LLTE4MjUgOiAxIDogMS4wCitSVS1VTkstMTgyNiA6IDEgOiA1LjAKK1JVLVVOSy0xODI3IDogMSA6IDczLjY5OTk5NworUlUtVU5LLTE4MjggOiAxIDogOS4xOTk5OTk4CitSVS1VTkstMTgyOSA6IDEgOiAxNDEuODk5OTkKK1JVLVVOSy0xODMwIDogMSA6IDE5LjI5OTk5OQorUlUtVU5LLTE4MzEgOiAxIDogMS4wCitSVS1VTkstMTgzMiA6IDEgOiA2LjA5OTk5OTkKK1JVLVVOSy0xODMzIDogMSA6IDEzMi4yCitSVS1VTkstMTgzNCA6IDEgOiA4LjE5OTk5OTgKK1JVLVVOSy0xODM1IDogMSA6IDE4OTQuOQorUlUtVU5LLTE4MzYgOiAxIDogMS4wCitSVS1VTkstMTgzNyA6IDEgOiAxLjAKK1JVLVVOSy0xODM4IDogMSA6IDEuMAorUlUtVU5LLTE4MzkgOiAxIDogNzguMzAwMDAzCitSVS1VTkstMTg0MCA6IDEgOiA0LjU5OTk5OTkKK1JVLVVOSy0xODQxIDogMSA6IDEuMAorUlUtVU5LLTE4NDIgOiAxIDogMS42CitSVS1VTkstMTg0MyA6IDEgOiAzLjcKK1JVLVVOSy0xODQ0IDogMSA6IDEuMAorUlUtVU5LLTE4NDUgOiAxIDogMTMuMAorUlUtVU5LLTE4NDYgOiAxIDogMS4wCitSVS1VTkstMTg0NyA6IDEgOiAxLjAKK1JVLVVOSy0xODQ4IDogMSA6IDEuOQorUlUtVU5LLTE4NDkgOiAxIDogMzMuNQorUlUtVU5LLTE4NTAgOiAxIDogMS4wCitSVS1VTkstMTg1MSA6IDEgOiAxLjAKK1JVLVVOSy0xODUyIDogMSA6IDEyLjUKK1JVLVVOSy0xODUzIDogMSA6IDEuMworUlUtVU5LLTE4NTQgOiAxIDogNC44MDAwMDAyCitSVS1VTkstMTg1NSA6IDEgOiAxLjAKK1JVLVVOSy0xODU2IDogMSA6IDE5LjAKK1JVLVVOSy0xODU3IDogMSA6IDQuMDk5OTk5OQorUlUtVU5LLTE4NTggOiAxIDogMy40MDAwMDAxCitSVS1VTkstMTg1OSA6IDEgOiAxLjEKK1JVLVVOSy0xODYwIDogMSA6IDIuMworUlUtVU5LLTE4NjEgOiAxIDogMjAuMQorUlUtVU5LLTE4NjIgOiAxIDogOS42OTk5OTk4CitSVS1VTkstMTg2MyA6IDEgOiAxLjgKK1JVLVVOSy0xODY0IDogMSA6IDEuMAorUlUtVU5LLTE4NjUgOiAxIDogMS4wCitSVS1VTkstMTg2NiA6IDEgOiAxLjAKK1JVLVVOSy0xODY3IDogMSA6IDg5MS43OTk5OQorUlUtVU5LLTE4NjggOiAxIDogMzA1LjM5OTk5CitSVS1VTkstMTg2OSA6IDEgOiA0MS43OTk5OTkKK1JVLVVOSy0xODcwIDogMSA6IDEuMQorUlUtVU5LLTE4NzEgOiAxIDogMS4wCitSVS1VTkstMTg3MiA6IDEgOiAxLjAKK1JVLVVOSy0xODczIDogMSA6IDEuOQorUlUtVU5LLTE4NzQgOiAxIDogOTAuMAorUlUtVU5LLTE4NzUgOiAxIDogMTA5LjEKK1JVLVVOSy0xODc2IDogMSA6IDEuMAorUlUtVU5LLTE4NzcgOiAxIDogMS4wCitSVS1VTkstMTg3OCA6IDEgOiAxLjAKK1JVLVVOSy0xODc5IDogMSA6IDEuMAorUlUtVU5LLTE4ODAgOiAxIDogMTMuOQorUlUtVU5LLTE4ODEgOiAxIDogMS4wCitSVS1VTkstMTg4MiA6IDEgOiAxLjAKK1JVLVVOSy0xODgzIDogMSA6IDEuMAorUlUtVU5LLTE4ODQgOiAxIDogMS42CitSVS1VTkstMTg4NSA6IDEgOiAxLjEKK1JVLVVOSy0xODg2IDogMSA6IDIuMAorUlUtVU5LLTE4ODcgOiAxIDogMTcuNAorUlUtVU5LLTE4ODggOiAxIDogMy43CitSVS1VTkstMTg4OSA6IDEgOiAzLjkwMDAwMDEKK1JVLVVOSy0xODkwIDogMSA6IDEuMAorUlUtVU5LLTE4OTEgOiAxIDogMS44CitSVS1VTkstMTg5MiA6IDEgOiA2MS4yMDAwMDEKK1JVLVVOSy0xODkzIDogMSA6IDEuOAorUlUtVU5LLTE4OTQgOiAxIDogOS44MDAwMDAyCitSVS1VTkstMTg5NSA6IDEgOiAxMC45CitSVS1VTkstMTg5NiA6IDEgOiAxLjAKK1JVLVVOSy0xODk3IDogMSA6IDUuOTAwMDAwMQorUlUtVU5LLTE4OTggOiAxIDogMjkuMQorUlUtVU5LLTE4OTkgOiAxIDogMS4yCitSVS1VTkstMTkwMCA6IDEgOiAyNS43MDAwMDEKK1JVLVVOSy0xOTAxIDogMSA6IDIuMDk5OTk5OQorUlUtVU5LLTE5MDIgOiAxIDogMS4wCitSVS1VTkstMTkwMyA6IDEgOiAyLjAKK1JVLVVOSy0xOTA0IDogMSA6IDY2LjY5OTk5NworUlUtVU5LLTE5MDUgOiAxIDogMS4wCitSVS1VTkstMTkwNiA6IDEgOiA1Mjg3LjUKK1JVLVVOSy0xOTA3IDogMSA6IDEuMAorUlUtVU5LLTE5MDggOiAxIDogMTAuOQorUlUtVU5LLTE5MDkgOiAxIDogMS45CitSVS1VTkstMTkxMCA6IDEgOiAxLjAKK1JVLVVOSy0xOTExIDogMSA6IDEuMAorUlUtVU5LLTE5MTIgOiAxIDogMS42CitSVS1VTkstMTkxMyA6IDEgOiAxLjAKK1JVLVVOSy0xOTE0IDogMSA6IDEuMQorUlUtVU5LLTE5MTUgOiAxIDogOC44MDAwMDAyCitSVS1VTkstMTkxNiA6IDEgOiAxLjAKK1JVLVVOSy0xOTE3IDogMSA6IDEuOAorUlUtVU5LLTE5MTggOiAxIDogMy4wOTk5OTk5CitSVS1VTkstMTkxOSA6IDEgOiA4LjAKK1JVLVVOSy0xOTIwIDogMSA6IDEuNAorUlUtVU5LLTE5MjEgOiAxIDogNy4xOTk5OTk4CitSVS1VTkstMTkyMiA6IDEgOiA4LjY5OTk5OTgKK1JVLVVOSy0xOTIzIDogMSA6IDIuMgorUlUtVU5LLTE5MjQgOiAxIDogMS4wCitSVS1VTkstMTkyNSA6IDEgOiAxLjIKK1JVLVVOSy0xOTI2IDogMSA6IDEwLjUKK1JVLVVOSy0xOTI3IDogMSA6IDEuNgorUlUtVU5LLTE5MjggOiAxIDogMS4wCitSVS1VTkstMTkyOSA6IDEgOiA0LjUKK1JVLVVOSy0xOTMwIDogMSA6IDEuMAorUlUtVU5LLTE5MzEgOiAxIDogNi45MDAwMDAxCitSVS1VTkstMTkzMiA6IDEgOiAxLjEKK1JVLVVOSy0xOTMzIDogMSA6IDEuOQorUlUtVU5LLTE5MzQgOiAxIDogMS4yCitSVS1VTkstMTkzNSA6IDEgOiAzLjcKK1JVLVVOSy0xOTM2IDogMSA6IDEuNQorUlUtVU5LLTE5MzcgOiAxIDogMi4wOTk5OTk5CitSVS1VTkstMTkzOCA6IDEgOiAyMS4yOTk5OTkKK1JVLVVOSy0xOTM5IDogMSA6IDcuNDAwMDAwMQorUlUtVU5LLTE5NDAgOiAxIDogMS4xCitSVS1VTkstMTk0MSA6IDEgOiAxLjAKK1JVLVVOSy0xOTQyIDogMSA6IDEuMgorUlUtVU5LLTE5NDMgOiAxIDogMS4wCitSVS1VTkstMTk0NCA6IDEgOiAyLjcKK1JVLVVOSy0xOTQ1IDogMSA6IDIuMgorUlUtVU5LLTE5NDYgOiAxIDogMS4xCitSVS1VTkstMTk0NyA6IDEgOiAyLjUKK1JVLVVOSy0xOTQ4IDogMSA6IDEuMQorUlUtVU5LLTE5NDkgOiAxIDogMS4wCitSVS1VTkstMTk1MCA6IDEgOiA3LjAKK1JVLVVOSy0xOTUxIDogMSA6IDQuMzAwMDAwMgorUlUtVU5LLTE5NTIgOiAxIDogMzIuNTk5OTk4CitSVS1VTkstMTk1MyA6IDEgOiAxLjAKK1JVLVVOSy0xOTU0IDogMSA6IDE0Mi4wCitSVS1VTkstMTk1NSA6IDEgOiAyNC42CitSVS1VTkstMTk1NiA6IDEgOiA0Ny4wCitSVS1VTkstMTk1NyA6IDEgOiA3LjAKK1JVLVVOSy0xOTU4IDogMSA6IDEuMAorUlUtVU5LLTE5NTkgOiAxIDogMi4wOTk5OTk5CitSVS1VTkstMTk2MCA6IDEgOiAxLjkKK1JVLVVOSy0xOTYxIDogMSA6IDEuMgorUlUtVU5LLTE5NjIgOiAxIDogMTk4Ni4yCitSVS1VTkstMTk2MyA6IDEgOiA1LjU5OTk5OTkKK1JVLVVOSy0xOTY0IDogMSA6IDIuNQorUlUtVU5LLTE5NjUgOiAxIDogMS4xCitSVS1VTkstMTk2NiA6IDEgOiAxLjMKK1JVLVVOSy0xOTY3IDogMSA6IDEuMworUlUtVU5LLTE5NjggOiAxIDogNC41CitSVS1VTkstMTk2OSA6IDEgOiAxLjEKK1JVLVVOSy0xOTcwIDogMSA6IDE4LjIwMDAwMQorUlUtVU5LLTE5NzEgOiAxIDogMS4wCitSVS1VTkstMTk3MiA6IDEgOiAxLjcKK1JVLVVOSy0xOTczIDogMSA6IDYuOTAwMDAwMQorUlUtVU5LLTE5NzQgOiAxIDogMi41CitSVS1VTkstMTk3NSA6IDEgOiAzMjUyMy41CitSVS1VTkstMTk3NiA6IDEgOiAxMy4wCitSVS1VTkstMTk3NyA6IDEgOiAzLjAKK1JVLVVOSy0xOTc4IDogMSA6IDEuMAorUlUtVU5LLTE5NzkgOiAxIDogMS4xCitSVS1VTkstMTk4MCA6IDEgOiAxLjAKK1JVLVVOSy0xOTgxIDogMSA6IDQuMTk5OTk5OAorUlUtVU5LLTE5ODIgOiAxIDogMS4wCitSVS1VTkstMTk4MyA6IDEgOiAyLjAKK1JVLVVOSy0xOTg0IDogMSA6IDIuNTk5OTk5OQorUlUtVU5LLTE5ODUgOiAxIDogMy40MDAwMDAxCitSVS1VTkstMTk4NiA6IDEgOiAxLjUKK1JVLVVOSy0xOTg3IDogMSA6IDIuNQorUlUtVU5LLTE5ODggOiAxIDogMTguMjAwMDAxCitSVS1VTkstMTk4OSA6IDEgOiAxLjAKK1JVLVVOSy0xOTkwIDogMSA6IDYuNjk5OTk5OAorUlUtVU5LLTE5OTEgOiAxIDogMi4wOTk5OTk5CitSVS1VTkstMTk5MiA6IDEgOiA5LjAKK1JVLVVOSy0xOTkzIDogMSA6IDMuMgorUlUtVU5LLTE5OTQgOiAxIDogMi4wCitSVS1VTkstMTk5NSA6IDEgOiAyMS43OTk5OTkKK1JVLVVOSy0xOTk2IDogMSA6IDEuMAorUlUtVU5LLTE5OTcgOiAxIDogMTIuNgorUlUtVU5LLTE5OTggOiAxIDogMy4wCitSVS1VTkstMTk5OSA6IDEgOiAxMDEuMAorUlUtVU5LLTIwMDAgOiAxIDogMS4wCitSVS1VTkstMjAwMSA6IDEgOiAxLjYKK1JVLVVOSy0yMDAyIDogMSA6IDYuNDAwMDAwMQorUlUtVU5LLTIwMDMgOiAxIDogMS4wCitSVS1VTkstMjAwNCA6IDEgOiAxMy4zCitSVS1VTkstMjAwNSA6IDEgOiAzNy4yOTk5OTkKK1JVLVVOSy0yMDA2IDogMSA6IDkuNQorUlUtVU5LLTIwMDcgOiAxIDogMi4wOTk5OTk5CitSVS1VTkstMjAwOCA6IDEgOiAxLjAKK1JVLVVOSy0yMDA5IDogMSA6IDQuMDk5OTk5OQorUlUtVU5LLTIwMTAgOiAxIDogMS4wCitSVS1VTkstMjAxMSA6IDEgOiAzLjQwMDAwMDEKK1JVLVVOSy0yMDEyIDogMSA6IDEuMAorUlUtVU5LLTIwMTMgOiAxIDogMS4wCitSVS1VTkstMjAxNCA6IDEgOiAxLjAKK1JVLVVOSy0yMDE1IDogMSA6IDMuMworUlUtVU5LLTIwMTYgOiAxIDogMS4wCitSVS1VTkstMjAxNyA6IDEgOiAxLjAKK1JVLVVOSy0yMDE4IDogMSA6IDQuMTk5OTk5OAorUlUtVU5LLTIwMTkgOiAxIDogMS4wCitSVS1VTkstMjAyMCA6IDEgOiAxLjAKK1JVLVVOSy0yMDIxIDogMSA6IDczLjY5OTk5NworUlUtVU5LLTIwMjIgOiAxIDogNi44MDAwMDAyCitSVS1VTkstMjAyMyA6IDEgOiA4LjYwMDAwMDQKK1JVLVVOSy0yMDI0IDogMSA6IDEuMgorUlUtVU5LLTIwMjUgOiAxIDogNDExLjg5OTk5CitSVS1VTkstMjAyNiA6IDEgOiAxNS4yCitSVS1VTkstMjAyNyA6IDEgOiAxLjgKK1JVLVVOSy0yMDI4IDogMSA6IDIuMworUlUtVU5LLTIwMjkgOiAxIDogMjIuNzAwMDAxCitSVS1VTkstMjAzMCA6IDEgOiA4MjIuNzAwMDEKK1JVLVVOSy0yMDMxIDogMSA6IDEwLjIKK1JVLVVOSy0yMDMyIDogMSA6IDYuNQorUlUtVU5LLTIwMzMgOiAxIDogNS40MDAwMDAxCitSVS1VTkstMjAzNCA6IDEgOiAxNS4yCitSVS1VTkstMjAzNSA6IDEgOiA1Ny4wOTk5OTgKK1JVLVVOSy0yMDM2IDogMSA6IDEuMgorUlUtVU5LLTIwMzcgOiAxIDogMy44CitSVS1VTkstMjAzOCA6IDEgOiAxMS4xCitSVS1VTkstMjAzOSA6IDEgOiAxLjAKK1JVLVVOSy0yMDQwIDogMSA6IDEuMAorUlUtVU5LLTIwNDEgOiAxIDogMS4yCitSVS1VTkstMjA0MiA6IDEgOiAxLjAKK1JVLVVOSy0yMDQzIDogMSA6IDEuMAorUlUtVU5LLTIwNDQgOiAxIDogMTcuMQorUlUtVU5LLTIwNDUgOiAxIDogMi40MDAwMDAxCitSVS1VTkstMjA0NiA6IDEgOiAxLjAKK1JVLVVOSy0yMDQ3IDogMSA6IDcuNQorUlUtVU5LLTIwNDggOiAxIDogMS4zCitSVS1VTkstMjA0OSA6IDEgOiAxLjAKK1JVLVVOSy0yMDUwIDogMSA6IDEuMAorUlUtVU5LLTIwNTEgOiAxIDogMS43CitSVS1VTkstMjA1MiA6IDEgOiAyLjA5OTk5OTkKK1JVLVVOSy0yMDUzIDogMSA6IDEuMAorUlUtVU5LLTIwNTQgOiAxIDogMy40MDAwMDAxCitSVS1VTkstMjA1NSA6IDEgOiAxLjkKK1JVLVVOSy0yMDU2IDogMSA6IDUuMDk5OTk5OQorUlUtVU5LLTIwNTcgOiAxIDogMy41OTk5OTk5CitSVS1VTkstMjA1OCA6IDEgOiA2LjgwMDAwMDIKK1JVLVVOSy0yMDU5IDogMSA6IDEuNgorUlUtVU5LLTIwNjAgOiAxIDogOC44OTk5OTk2CitSVS1VTkstMjA2MSA6IDEgOiAyLjkwMDAwMDEKK1JVLVVOSy0yMDYyIDogMSA6IDEuMAorUlUtVU5LLTIwNjMgOiAxIDogOS4xMDAwMDA0CitSVS1VTkstMjA2NCA6IDEgOiAxLjAKK1JVLVVOSy0yMDY1IDogMSA6IDEuMAorUlUtVU5LLTIwNjYgOiAxIDogMS4wCitSVS1VTkstMjA2NyA6IDEgOiA4Ljg5OTk5OTYKK1JVLVVOSy0yMDY4IDogMSA6IDEuMAorUlUtVU5LLTIwNjkgOiAxIDogMS4wCitSVS1VTkstMjA3MCA6IDEgOiAzLjkwMDAwMDEKK1JVLVVOSy0yMDcxIDogMSA6IDEuMAorUlUtVU5LLTIwNzIgOiAxIDogMi41CitSVS1VTkstMjA3MyA6IDEgOiAxLjAKK1JVLVVOSy0yMDc0IDogMSA6IDMuMAorUlUtVU5LLTIwNzUgOiAxIDogMS4wCitSVS1VTkstMjA3NiA6IDEgOiAyLjA5OTk5OTkKK1JVLVVOSy0yMDc3IDogMSA6IDcuNQorUlUtVU5LLTIwNzggOiAxIDogMi44CitSVS1VTkstMjA3OSA6IDEgOiAyNy42CitSVS1VTkstMjA4MCA6IDEgOiAyNS4wCitSVS1VTkstMjA4MSA6IDEgOiAxLjAKK1JVLVVOSy0yMDgyIDogMSA6IDEuMAorUlUtVU5LLTIwODMgOiAxIDogMS4wCitSVS1VTkstMjA4NCA6IDEgOiAxLjAKK1JVLVVOSy0yMDg1IDogMSA6IDEwNzIuNQorUlUtVU5LLTIwODYgOiAxIDogMS40CitSVS1VTkstMjA4NyA6IDEgOiAyLjU5OTk5OTkKK1JVLVVOSy0yMDg4IDogMSA6IDMuNDAwMDAwMQorUlUtVU5LLTIwODkgOiAxIDogMi4wCitSVS1VTkstMjA5MCA6IDEgOiA0LjQwMDAwMDEKK1JVLVVOSy0yMDkxIDogMSA6IDIuNQorUlUtVU5LLTIwOTIgOiAxIDogNS40MDAwMDAxCitSVS1VTkstMjA5MyA6IDEgOiAzLjUKK1JVLVVOSy0yMDk0IDogMSA6IDEuNQorUlUtVU5LLTIwOTUgOiAxIDogMjkuOQorUlUtVU5LLTIwOTYgOiAxIDogMi45MDAwMDAxCitSVS1VTkstMjA5NyA6IDEgOiA0LjMwMDAwMDIKK1JVLVVOSy0yMDk4IDogMSA6IDEuMgorUlUtVU5LLTIwOTkgOiAxIDogMS4wCitSVS1VTkstMjEwMCA6IDEgOiAyLjU5OTk5OTkKK1JVLVVOSy0yMTAxIDogMSA6IDEuOAorUlUtVU5LLTIxMDIgOiAxIDogMS45CitSVS1VTkstMjEwMyA6IDEgOiAxLjAKK1JVLVVOSy0yMTA0IDogMSA6IDEuMAorUlUtVU5LLTIxMDUgOiAxIDogMTEuMgorUlUtVU5LLTIxMDYgOiAxIDogMy40MDAwMDAxCitSVS1VTkstMjEwNyA6IDEgOiAyNC42CitSVS1VTkstMjEwOCA6IDEgOiAxLjEKK1JVLVVOSy0yMTA5IDogMSA6IDIuNQorUlUtVU5LLTIxMTAgOiAxIDogMS4xCitSVS1VTkstMjExMSA6IDEgOiA0LjUKK1JVLVVOSy0yMTEyIDogMSA6IDEuMAorUlUtVU5LLTIxMTMgOiAxIDogMS42CitSVS1VTkstMjExNCA6IDEgOiAxLjkKK1JVLVVOSy0yMTE1IDogMSA6IDQuNQorUlUtVU5LLTIxMTYgOiAxIDogMTAuNQorUlUtVU5LLTIxMTcgOiAxIDogMS4xCitSVS1VTkstMjExOCA6IDEgOiA0LjMwMDAwMDIKK1JVLVVOSy0yMTE5IDogMSA6IDEuMAorUlUtVU5LLTIxMjAgOiAxIDogMi4wCitSVS1VTkstMjEyMSA6IDEgOiAyLjcKK1JVLVVOSy0yMTIyIDogMSA6IDEuMAorUlUtVU5LLTIxMjMgOiAxIDogMS4wCitSVS1VTkstMjEyNCA6IDEgOiAyLjQwMDAwMDEKK1JVLVVOSy0yMTI1IDogMSA6IDEuOAorUlUtVU5LLTIxMjYgOiAxIDogMS4wCitSVS1VTkstMjEyNyA6IDEgOiAxLjAKK1JVLVVOSy0yMTI4IDogMSA6IDEuNQorUlUtVU5LLTIxMjkgOiAxIDogMi4wCitSVS1VTkstMjEzMCA6IDEgOiAzLjAKK1JVLVVOSy0yMTMxIDogMSA6IDE4LjEKK1JVLVVOSy0yMTMyIDogMSA6IDI4Ljc5OTk5OQorUlUtVU5LLTIxMzMgOiAxIDogMTUxLjYwMDAxCitSVS1VTkstMjEzNCA6IDEgOiAxNTEuNjAwMDEKK1JVLVVOSy0yMTM1IDogMSA6IDEuMAorUlUtVU5LLTIxMzYgOiAxIDogMTA0MS43CitSVS1VTkstMjEzNyA6IDEgOiAxMDQxLjcKK1JVLVVOSy0yMTM4IDogMSA6IDEwNDEuNworUlUtVU5LLTIxMzkgOiAxIDogMS4wCitSVS1VTkstMjE0MCA6IDEgOiAxMS41CitSVS1VTkstMjE0MSA6IDEgOiA2LjkwMDAwMDEKK1JVLVVOSy0yMTQyIDogMSA6IDIuMworUlUtVU5LLTIxNDMgOiAxIDogNi4wOTk5OTk5CitSVS1VTkstMjE0NCA6IDEgOiAzMS4xCitSVS1VTkstMjE0NSA6IDEgOiAxLjgKK1JVLVVOSy0yMTQ2IDogMSA6IDEuMQorUlUtVU5LLTIxNDcgOiAxIDogNTYuOTAwMDAyCitSVS1VTkstMjE0OCA6IDEgOiAyLjA5OTk5OTkKK1JVLVVOSy0yMTQ5IDogMSA6IDEuMAorUlUtVU5LLTIxNTAgOiAxIDogMS45CitSVS1VTkstMjE1MSA6IDEgOiA3LjgwMDAwMDIKK1JVLVVOSy0yMTUyIDogMSA6IDQuMDk5OTk5OQorUlUtVU5LLTIxNTMgOiAxIDogNC44MDAwMDAyCitSVS1VTkstMjE1NCA6IDEgOiA2LjE5OTk5OTgKK1JVLVVOSy0yMTU1IDogMSA6IDQuODAwMDAwMgorUlUtVU5LLTIxNTYgOiAxIDogNS41OTk5OTk5CitSVS1VTkstMjE1NyA6IDEgOiAxLjcKK1JVLVVOSy0yMTU4IDogMSA6IDEuMAorUlUtVU5LLTIxNTkgOiAxIDogMS4wCitSVS1VTkstMjE2MCA6IDEgOiA0MjAuMTAwMDEKK1JVLVVOSy0yMTYxIDogMSA6IDc3MDUuNQorUlUtVU5LLTIxNjIgOiAxIDogNzcwNS41CitSVS1VTkstMjE2MyA6IDEgOiA5Ljg5OTk5OTYKK1JVLVVOSy0yMTY0IDogMSA6IDEuMAorUlUtVU5LLTIxNjUgOiAxIDogOC44OTk5OTk2CitSVS1VTkstMjE2NiA6IDEgOiAyLjkwMDAwMDEKK1JVLVVOSy0yMTY3IDogMSA6IDEuMQorUlUtVU5LLTIxNjggOiAxIDogMTMuOAorUlUtVU5LLTIxNjkgOiAxIDogMy4yCitSVS1VTkstMjE3MCA6IDEgOiAxLjMKK1JVLVVOSy0yMTcxIDogMSA6IDMuMworUlUtVU5LLTIxNzIgOiAxIDogMS4wCitSVS1VTkstMjE3MyA6IDEgOiAxLjAKK1JVLVVOSy0yMTc0IDogMSA6IDEuMAorUlUtVU5LLTIxNzUgOiAxIDogMS42CitSVS1VTkstMjE3NiA6IDEgOiAxLjAKK1JVLVVOSy0yMTc3IDogMSA6IDEuMAorUlUtVU5LLTIxNzggOiAxIDogMTAuNQorUlUtVU5LLTIxNzkgOiAxIDogNC4wOTk5OTk5CitSVS1VTkstMjE4MCA6IDEgOiAyLjQwMDAwMDEKK1JVLVVOSy0yMTgxIDogMSA6IDI5Ljc5OTk5OQorUlUtVU5LLTIxODIgOiAxIDogMS4wCitSVS1VTkstMjE4MyA6IDEgOiAyLjcKK1JVLVVOSy0yMTg0IDogMSA6IDEuMAorUlUtVU5LLTIxODUgOiAxIDogMi40MDAwMDAxCitSVS1VTkstMjE4NiA6IDEgOiAyLjAKK1JVLVVOSy0yMTg3IDogMSA6IDE1LjYKK1JVLVVOSy0yMTg4IDogMSA6IDUuMAorUlUtVU5LLTIxODkgOiAxIDogOC41CitSVS1VTkstMjE5MCA6IDEgOiAxLjIKK1JVLVVOSy0yMTkxIDogMSA6IDEuMAorUlUtVU5LLTIxOTIgOiAxIDogMS4wCitSVS1VTkstMjE5MyA6IDEgOiAxLjAKK1JVLVVOSy0yMTk0IDogMSA6IDIuMAorUlUtVU5LLTIxOTUgOiAxIDogMS4wCitSVS1VTkstMjE5NiA6IDEgOiAyLjUKK1JVLVVOSy0yMTk3IDogMSA6IDIuOTAwMDAwMQorUlUtVU5LLTIxOTggOiAxIDogMS4yCitSVS1VTkstMjE5OSA6IDEgOiAxMi4zCitSVS1VTkstMjIwMCA6IDEgOiAxOC45CitSVS1VTkstMjIwMSA6IDEgOiAxLjIKK1JVLVVOSy0yMjAyIDogMSA6IDE0LjAKK1JVLVVOSy0yMjAzIDogMSA6IDQuMAorUlUtVU5LLTIyMDQgOiAxIDogMjQuOQorUlUtVU5LLTIyMDUgOiAxIDogNzM0LjU5OTk4CitSVS1VTkstMjIwNiA6IDEgOiAzLjIKK1JVLVVOSy0yMjA3IDogMSA6IDEuMAorUlUtVU5LLTIyMDggOiAxIDogMS44CitSVS1VTkstMjIwOSA6IDEgOiAxLjgKK1JVLVVOSy0yMjEwIDogMSA6IDEuMAorUlUtVU5LLTIyMTEgOiAxIDogMjIuMAorUlUtVU5LLTIyMTIgOiAxIDogMS41CitSVS1VTkstMjIxMyA6IDEgOiAxLjQKK1JVLVVOSy0yMjE0IDogMSA6IDIuMworUlUtVU5LLTIyMTUgOiAxIDogNi42OTk5OTk4CitSVS1VTkstMjIxNiA6IDEgOiAxLjgKK1JVLVVOSy0yMjE3IDogMSA6IDEuNQorUlUtVU5LLTIyMTggOiAxIDogMTAuOAorUlUtVU5LLTIyMTkgOiAxIDogMS4wCitSVS1VTkstMjIyMCA6IDEgOiAxLjQKK1JVLVVOSy0yMjIxIDogMSA6IDUuNDAwMDAwMQorUlUtVU5LLTIyMjIgOiAxIDogMjcuMQorUlUtVU5LLTIyMjMgOiAxIDogMi40MDAwMDAxCitSVS1VTkstMjIyNCA6IDEgOiA1Mi45MDAwMDIKK1JVLVVOSy0yMjI1IDogMSA6IDEuNAorUlUtVU5LLTIyMjYgOiAxIDogMjMuNAorUlUtVU5LLTIyMjcgOiAxIDogMjEuMAorUlUtVU5LLTIyMjggOiAxIDogMS43CitSVS1VTkstMjIyOSA6IDEgOiAxOC4xCitSVS1VTkstMjIzMCA6IDEgOiA2NC4wCitSVS1VTkstMjIzMSA6IDEgOiAxNS45CitSVS1VTkstMjIzMiA6IDEgOiAyLjUKK1JVLVVOSy0yMjMzIDogMSA6IDU0Ljc5OTk5OQorUlUtVU5LLTIyMzQgOiAxIDogMy43CitSVS1VTkstMjIzNSA6IDEgOiA0OS4wCitSVS1VTkstMjIzNiA6IDEgOiAyMS4yMDAwMDEKK1JVLVVOSy0yMjM3IDogMSA6IDM1MC43OTk5OQorUlUtVU5LLTIyMzggOiAxIDogMTguNzk5OTk5CitSVS1VTkstMjIzOSA6IDEgOiAyNi42CitSVS1VTkstMjI0MCA6IDEgOiAxMi41CitSVS1VTkstMjI0MSA6IDEgOiAyLjgKK1JVLVVOSy0yMjQyIDogMSA6IDc1LjY5OTk5NworUlUtVU5LLTIyNDMgOiAxIDogMS4wCitSVS1VTkstMjI0NCA6IDEgOiA1LjU5OTk5OTkKK1JVLVVOSy0yMjQ1IDogMSA6IDQuMAorUlUtVU5LLTIyNDYgOiAxIDogNi44MDAwMDAyCitSVS1VTkstMjI0NyA6IDEgOiAxNy40CitSVS1VTkstMjI0OCA6IDEgOiAxLjAKK1JVLVVOSy0yMjQ5IDogMSA6IDMyLjQwMDAwMgorUlUtVU5LLTIyNTAgOiAxIDogMS4zCitSVS1VTkstMjI1MSA6IDEgOiA4OC41CitSVS1VTkstMjI1MiA6IDEgOiA0MzcuMzk5OTkKK1JVLVVOSy0yMjUzIDogMSA6IDcwLjMwMDAwMworUlUtVU5LLTIyNTQgOiAxIDogMi43CitSVS1VTkstMjI1NSA6IDEgOiAzLjIKK1JVLVVOSy0yMjU2IDogMSA6IDEuMgorUlUtVU5LLTIyNTcgOiAxIDogOTEuNDAwMDAyCitSVS1VTkstMjI1OCA6IDEgOiAyLjAKK1JVLVVOSy0yMjU5IDogMSA6IDIuOTAwMDAwMQorUlUtVU5LLTIyNjAgOiAxIDogMzguNzAwMDAxCitSVS1VTkstMjI2MSA6IDEgOiAxLjcKK1JVLVVOSy0yMjYyIDogMSA6IDcuOTAwMDAwMQorUlUtVU5LLTIyNjMgOiAxIDogMjYuNQorUlUtVU5LLTIyNjQgOiAxIDogNy40MDAwMDAxCitSVS1VTkstMjI2NSA6IDEgOiAxMy42CitSVS1VTkstMjI2NiA6IDEgOiAxNi45CitSVS1VTkstMjI2NyA6IDEgOiAzLjAKK1JVLVVOSy0yMjY4IDogMSA6IDEuMAorUlUtVU5LLTIyNjkgOiAxIDogMS4wCitSVS1VTkstMjI3MCA6IDEgOiA0LjUKK1JVLVVOSy0yMjcxIDogMSA6IDIuMDk5OTk5OQorUlUtVU5LLTIyNzIgOiAxIDogMS4wCitSVS1VTkstMjI3MyA6IDEgOiAxLjAKK1JVLVVOSy0yMjc0IDogMSA6IDQ5Ni43MDAwMQorUlUtVU5LLTIyNzUgOiAxIDogNjIuNzk5OTk5CitSVS1VTkstMjI3NiA6IDEgOiAxLjAKK1JVLVVOSy0yMjc3IDogMSA6IDEuMQorUlUtVU5LLTIyNzggOiAxIDogMjEuNQorUlUtVU5LLTIyNzkgOiAxIDogMi41CitSVS1VTkstMjI4MCA6IDEgOiAxLjAKK1JVLVVOSy0yMjgxIDogMSA6IDI0LjIwMDAwMQorUlUtVU5LLTIyODIgOiAxIDogMS4zCitSVS1VTkstMjI4MyA6IDEgOiA0NS4yOTk5OTkKK1JVLVVOSy0yMjg0IDogMSA6IDUuODAwMDAwMgorUlUtVU5LLTIyODUgOiAxIDogMy4wOTk5OTk5CitSVS1VTkstMjI4NiA6IDEgOiA2LjAKK1JVLVVOSy0yMjg3IDogMSA6IDQuNQorUlUtVU5LLTIyODggOiAxIDogOTYuODAwMDAzCitSVS1VTkstMjI4OSA6IDEgOiAzOS45MDAwMDIKK1JVLVVOSy0yMjkwIDogMSA6IDYuMAorUlUtVU5LLTIyOTEgOiAxIDogMS4wCitSVS1VTkstMjI5MiA6IDEgOiAyLjkwMDAwMDEKK1JVLVVOSy0yMjkzIDogMSA6IDEuMQorUlUtVU5LLTIyOTQgOiAxIDogNi4wCitSVS1VTkstMjI5NSA6IDEgOiAxLjkKK1JVLVVOSy0yMjk2IDogMSA6IDI3LjIwMDAwMQorUlUtVU5LLTIyOTcgOiAxIDogMS4xCitSVS1VTkstMjI5OCA6IDEgOiAzMjM4LjMKK1JVLVVOSy0yMjk5IDogMSA6IDIuMDk5OTk5OQorUlUtVU5LLTIzMDAgOiAxIDogMS40CitSVS1VTkstMjMwMSA6IDEgOiA1LjU5OTk5OTkKK1JVLVVOSy0yMzAyIDogMSA6IDMzLjU5OTk5OAorUlUtVU5LLTIzMDMgOiAxIDogMy41CitSVS1VTkstMjMwNCA6IDEgOiA1Ni4wCitSVS1VTkstMjMwNSA6IDEgOiAxLjAKK1JVLVVOSy0yMzA2IDogMSA6IDEuNgorUlUtVU5LLTIzMDcgOiAxIDogMi41OTk5OTk5CitSVS1VTkstMjMwOCA6IDEgOiAxLjAKK1JVLVVOSy0yMzA5IDogMSA6IDEuOAorUlUtVU5LLTIzMTAgOiAxIDogOTguNQorUlUtVU5LLTIzMTEgOiAxIDogMS4wCitSVS1VTkstMjMxMiA6IDEgOiA2LjA5OTk5OTkKK1JVLVVOSy0yMzEzIDogMSA6IDEuMworUlUtVU5LLTIzMTQgOiAxIDogNzEuNTk5OTk4CitSVS1VTkstMjMxNSA6IDEgOiA2LjE5OTk5OTgKK1JVLVVOSy0yMzE2IDogMSA6IDE4LjI5OTk5OQorUlUtVU5LLTIzMTcgOiAxIDogMTMuNQorUlUtVU5LLTIzMTggOiAxIDogMS4wCitSVS1VTkstMjMxOSA6IDEgOiAxLjAKK1JVLVVOSy0yMzIwIDogMSA6IDEuMAorUlUtVU5LLTIzMjEgOiAxIDogMS4wCitSVS1VTkstMjMyMiA6IDEgOiAxLjQKK1JVLVVOSy0yMzIzIDogMSA6IDEuMAorUlUtVU5LLTIzMjQgOiAxIDogMTM4LjM5OTk5CitSVS1VTkstMjMyNSA6IDEgOiA1NS41CitSVS1VTkstMjMyNiA6IDEgOiAyMDQ5LjgKK1JVLVVOSy0yMzI3IDogMSA6IDIuOAorUlUtVU5LLTIzMjggOiAxIDogMS4wCitSVS1VTkstMjMyOSA6IDEgOiAyLjUKK1JVLVVOSy0yMzMwIDogMSA6IDMuMDk5OTk5OQorUlUtVU5LLTIzMzEgOiAxIDogMTQuMworUlUtVU5LLTIzMzIgOiAxIDogNC4wCitSVS1VTkstMjMzMyA6IDEgOiA1LjMwMDAwMDIKK1JVLVVOSy0yMzM0IDogMSA6IDEzMC4xMDAwMQorUlUtVU5LLTIzMzUgOiAxIDogMi4yCitSVS1VTkstMjMzNiA6IDEgOiAxLjkKK1JVLVVOSy0yMzM3IDogMSA6IDEuMAorUlUtVU5LLTIzMzggOiAxIDogMzMuNzAwMDAxCitSVS1VTkstMjMzOSA6IDEgOiAzLjkwMDAwMDEKK1JVLVVOSy0yMzQwIDogMSA6IDEuOAorUlUtVU5LLTIzNDEgOiAxIDogMi40MDAwMDAxCitSVS1VTkstMjM0MiA6IDEgOiA5LjEwMDAwMDQKK1JVLVVOSy0yMzQzIDogMSA6IDguNjAwMDAwNAorUlUtVU5LLTIzNDQgOiAxIDogMi4wOTk5OTk5CitSVS1VTkstMjM0NSA6IDEgOiAxLjAKK1JVLVVOSy0yMzQ2IDogMSA6IDEuMAorUlUtVU5LLTIzNDcgOiAxIDogMS4wCitSVS1VTkstMjM0OCA6IDEgOiA0LjE5OTk5OTgKK1JVLVVOSy0yMzQ5IDogMSA6IDguMzAwMDAwMgorUlUtVU5LLTIzNTAgOiAxIDogNS4wOTk5OTk5CitSVS1VTkstMjM1MSA6IDEgOiAxLjMKK1JVLVVOSy0yMzUyIDogMSA6IDIuMgorUlUtVU5LLTIzNTMgOiAxIDogMS4yCitSVS1VTkstMjM1NCA6IDEgOiAxLjAKK1JVLVVOSy0yMzU1IDogMSA6IDE2LjUKK1JVLVVOSy0yMzU2IDogMSA6IDE3LjEKK1JVLVVOSy0yMzU3IDogMSA6IDIuMworUlUtVU5LLTIzNTggOiAxIDogMzYuNQorUlUtVU5LLTIzNTkgOiAxIDogNi4xOTk5OTk4CitSVS1VTkstMjM2MCA6IDEgOiA1LjU5OTk5OTkKK1JVLVVOSy0yMzYxIDogMSA6IDEuMAorUlUtVU5LLTIzNjIgOiAxIDogNS41CitSVS1VTkstMjM2MyA6IDEgOiAxLjQKK1JVLVVOSy0yMzY0IDogMSA6IDEuMAorUlUtVU5LLTIzNjUgOiAxIDogMi40MDAwMDAxCitSVS1VTkstMjM2NiA6IDEgOiAxNDkuMworUlUtVU5LLTIzNjcgOiAxIDogMTE0LjcKK1JVLVVOSy0yMzY4IDogMSA6IDMuMgorUlUtVU5LLTIzNjkgOiAxIDogMi40MDAwMDAxCitSVS1VTkstMjM3MCA6IDEgOiAzLjU5OTk5OTkKK1JVLVVOSy0yMzcxIDogMSA6IDEuMAorUlUtVU5LLTIzNzIgOiAxIDogNC4wOTk5OTk5CitSVS1VTkstMjM3MyA6IDEgOiA0OTg5LjI5OTgKK1JVLVVOSy0yMzc0IDogMSA6IDMuOAorUlUtVU5LLTIzNzUgOiAxIDogNi4wCitSVS1VTkstMjM3NiA6IDEgOiAxLjAKK1JVLVVOSy0yMzc3IDogMSA6IDEuMAorUlUtVU5LLTIzNzggOiAxIDogMS4wCitSVS1VTkstMjM3OSA6IDEgOiA5LjM5OTk5OTYKK1JVLVVOSy0yMzgwIDogMSA6IDY4LjY5OTk5NworUlUtVU5LLTIzODEgOiAxIDogMTQuMQorUlUtVU5LLTIzODIgOiAxIDogMS41CitSVS1VTkstMjM4MyA6IDEgOiA2LjAKK1JVLVVOSy0yMzg0IDogMSA6IDEuNworUlUtVU5LLTIzODUgOiAxIDogMTA3LjgKK1JVLVVOSy0yMzg2IDogMSA6IDEuMAorUlUtVU5LLTIzODcgOiAxIDogODUuOTAwMDAyCitSVS1VTkstMjM4OCA6IDEgOiAzLjMKK1JVLVVOSy0yMzg5IDogMSA6IDIuNDAwMDAwMQorUlUtVU5LLTIzOTAgOiAxIDogMi4wCitSVS1VTkstMjM5MSA6IDEgOiAyLjIKK1JVLVVOSy0yMzkyIDogMSA6IDYuNQorUlUtVU5LLTIzOTMgOiAxIDogMS4wCitSVS1VTkstMjM5NCA6IDEgOiAxMC45CitSVS1VTkstMjM5NSA6IDEgOiAzLjU5OTk5OTkKK1JVLVVOSy0yMzk2IDogMSA6IDEuMAorUlUtVU5LLTIzOTcgOiAxIDogMS40CitSVS1VTkstMjM5OCA6IDEgOiAxLjQKK1JVLVVOSy0yMzk5IDogMSA6IDE2LjYKK1JVLVVOSy0yNDAwIDogMSA6IDYuOTAwMDAwMQorUlUtVU5LLTI0MDEgOiAxIDogMS43CitSVS1VTkstMjQwMiA6IDEgOiA0LjUKK1JVLVVOSy0yNDAzIDogMSA6IDEuMAorUlUtVU5LLTI0MDQgOiAxIDogMS4wCitSVS1VTkstMjQwNSA6IDEgOiA5LjUKK1JVLVVOSy0yNDA2IDogMSA6IDEuMAorUlUtVU5LLTI0MDcgOiAxIDogMjAuNQorUlUtVU5LLTI0MDggOiAxIDogMi4wOTk5OTk5CitSVS1VTkstMjQwOSA6IDEgOiA1LjMwMDAwMDIKK1JVLVVOSy0yNDEwIDogMSA6IDkuODk5OTk5NgorUlUtVU5LLTI0MTEgOiAxIDogMS4wCitSVS1VTkstMjQxMiA6IDEgOiAxLjMKK1JVLVVOSy0yNDEzIDogMSA6IDMuOAorUlUtVU5LLTI0MTQgOiAxIDogMTYuNQorUlUtVU5LLTI0MTUgOiAxIDogMy4wCitSVS1VTkstMjQxNiA6IDEgOiAzNC4wOTk5OTgKK1JVLVVOSy0yNDE3IDogMSA6IDIuMDk5OTk5OQorUlUtVU5LLTI0MTggOiAxIDogMS40CitSVS1VTkstMjQxOSA6IDEgOiAxLjAKK1JVLVVOSy0yNDIwIDogMSA6IDEuNworUlUtVU5LLTI0MjEgOiAxIDogMi43CitSVS1VTkstMjQyMiA6IDEgOiAxLjAKK1JVLVVOSy0yNDIzIDogMSA6IDEuOQorUlUtVU5LLTI0MjQgOiAxIDogMS4wCitSVS1VTkstMjQyNSA6IDEgOiAxLjEKK1JVLVVOSy0yNDI2IDogMSA6IDEuMAorUlUtVU5LLTI0MjcgOiAxIDogMS4wCitSVS1VTkstMjQyOCA6IDEgOiA5LjgwMDAwMDIKK1JVLVVOSy0yNDI5IDogMSA6IDEuMAorUlUtVU5LLTI0MzAgOiAxIDogMy45MDAwMDAxCitSVS1VTkstMjQzMSA6IDEgOiAzLjQwMDAwMDEKK1JVLVVOSy0yNDMyIDogMSA6IDIuNDAwMDAwMQorUlUtVU5LLTI0MzMgOiAxIDogMS43CitSVS1VTkstMjQzNCA6IDEgOiAxMDguMQorUlUtVU5LLTI0MzUgOiAxIDogMi4yCitSVS1VTkstMjQzNiA6IDEgOiAxLjgKK1JVLVVOSy0yNDM3IDogMSA6IDYuMAorUlUtVU5LLTI0MzggOiAxIDogNi4xOTk5OTk4CitSVS1VTkstMjQzOSA6IDEgOiA0MC4wOTk5OTgKK1JVLVVOSy0yNDQwIDogMSA6IDEuMAorUlUtVU5LLTI0NDEgOiAxIDogMS4wCitSVS1VTkstMjQ0MiA6IDEgOiA4LjM5OTk5OTYKK1JVLVVOSy0yNDQzIDogMSA6IDIuOAorUlUtVU5LLTI0NDQgOiAxIDogMzQuNDAwMDAyCitSVS1VTkstMjQ0NSA6IDEgOiAxLjAKK1JVLVVOSy0yNDQ2IDogMSA6IDEuNgorUlUtVU5LLTI0NDcgOiAxIDogMS45CitSVS1VTkstMjQ0OCA6IDEgOiA0LjkwMDAwMDEKK1JVLVVOSy0yNDQ5IDogMSA6IDIuNDAwMDAwMQorUlUtVU5LLTI0NTAgOiAxIDogMS4wCitSVS1VTkstMjQ1MSA6IDEgOiAxLjAKK1JVLVVOSy0yNDUyIDogMSA6IDEuMAorUlUtVU5LLTI0NTMgOiAxIDogMS40CitSVS1VTkstMjQ1NCA6IDEgOiAyNi40CitSVS1VTkstMjQ1NSA6IDEgOiAxLjAKK1JVLVVOSy0yNDU2IDogMSA6IDIuOAorUlUtVU5LLTI0NTcgOiAxIDogMS4zCitSVS1VTkstMjQ1OCA6IDEgOiAxLjMKK1JVLVVOSy0yNDU5IDogMSA6IDEuMAorUlUtVU5LLTI0NjAgOiAxIDogMS4wCitSVS1VTkstMjQ2MSA6IDEgOiAxLjYKK1JVLVVOSy0yNDYyIDogMSA6IDEuMAorUlUtVU5LLTI0NjMgOiAxIDogMS4wCitSVS1VTkstMjQ2NCA6IDEgOiA4LjM5OTk5OTYKK1JVLVVOSy0yNDY1IDogMSA6IDIuMworUlUtVU5LLTI0NjYgOiAxIDogNi45MDAwMDAxCitSVS1VTkstMjQ2NyA6IDEgOiAzLjkwMDAwMDEKK1JVLVVOSy0yNDY4IDogMSA6IDQuNDAwMDAwMQorUlUtVU5LLTI0NjkgOiAxIDogMTAuOAorUlUtVU5LLTI0NzAgOiAxIDogMy43CitSVS1VTkstMjQ3MSA6IDEgOiAzMi4yOTk5OTkKK1JVLVVOSy0yNDcyIDogMSA6IDEwLjUKK1JVLVVOSy0yNDczIDogMSA6IDE0LjcKK1JVLVVOSy0yNDc0IDogMSA6IDQuMzAwMDAwMgorUlUtVU5LLTI0NzUgOiAxIDogMS42CitSVS1VTkstMjQ3NiA6IDEgOiAxLjAKK1JVLVVOSy0yNDc3IDogMSA6IDQuOTAwMDAwMQorUlUtVU5LLTI0NzggOiAxIDogNC40MDAwMDAxCitSVS1VTkstMjQ3OSA6IDEgOiAyLjgKK1JVLVVOSy0yNDgwIDogMSA6IDEuMAorUlUtVU5LLTI0ODEgOiAxIDogMS4wCitSVS1VTkstMjQ4MiA6IDEgOiAxOS4xCitSVS1VTkstMjQ4MyA6IDEgOiA4LjE5OTk5OTgKK1JVLVVOSy0yNDg0IDogMSA6IDUuMTk5OTk5OAorUlUtVU5LLTI0ODUgOiAxIDogMi4wCitSVS1VTkstMjQ4NiA6IDEgOiAxLjIKK1JVLVVOSy0yNDg3IDogMSA6IDEuNAorUlUtVU5LLTI0ODggOiAxIDogNC42OTk5OTk4CitSVS1VTkstMjQ4OSA6IDEgOiAxLjIKK1JVLVVOSy0yNDkwIDogMSA6IDEuMAorUlUtVU5LLTI0OTEgOiAxIDogMS41CitSVS1VTkstMjQ5MiA6IDEgOiAxMjg3LjYKK1JVLVVOSy0yNDkzIDogMSA6IDEuMgorUlUtVU5LLTI0OTQgOiAxIDogNi41CitSVS1VTkstMjQ5NSA6IDEgOiA4MjQuOTAwMDIKK1JVLVVOSy0yNDk2IDogMSA6IDc3LjA5OTk5OAorUlUtVU5LLTI0OTcgOiAxIDogMS4wCitSVS1VTkstMjQ5OCA6IDEgOiAxLjAKK1JVLVVOSy0yNDk5IDogMSA6IDEuMAorUlUtVU5LLTI1MDAgOiAxIDogNC4zMDAwMDAyCitSVS1VTkstMjUwMSA6IDEgOiA4LjYwMDAwMDQKK1JVLVVOSy0yNTAyIDogMSA6IDY4LjMwMDAwMworUlUtVU5LLTI1MDMgOiAxIDogMS40CitSVS1VTkstMjUwNCA6IDEgOiA4MC40MDAwMDIKK1JVLVVOSy0yNTA1IDogMSA6IDQuMDk5OTk5OQorUlUtVU5LLTI1MDYgOiAxIDogMzYuOTAwMDAyCitSVS1VTkstMjUwNyA6IDEgOiAxLjgKK1JVLVVOSy0yNTA4IDogMSA6IDIxNi44OTk5OQorUlUtVU5LLTI1MDkgOiAxIDogMjA3LjYwMDAxCitSVS1VTkstMjUxMCA6IDEgOiAxMDEuMgorUlUtVU5LLTI1MTEgOiAxIDogMi4zCitSVS1VTkstMjUxMiA6IDEgOiAxLjUKK1JVLVVOSy0yNTEzIDogMSA6IDUuMAorUlUtVU5LLTI1MTQgOiAxIDogMy44CitSVS1VTkstMjUxNSA6IDEgOiAxLjgKK1JVLVVOSy0yNTE2IDogMSA6IDEuMAorUlUtVU5LLTI1MTcgOiAxIDogMS4wCitSVS1VTkstMjUxOCA6IDEgOiAzNS45MDAwMDIKK1JVLVVOSy0yNTE5IDogMSA6IDQwNS4xMDAwMQorUlUtVU5LLTI1MjAgOiAxIDogNzIuMTk5OTk3CitSVS1VTkstMjUyMSA6IDEgOiAxLjgKK1JVLVVOSy0yNTIyIDogMSA6IDEuMAorUlUtVU5LLTI1MjMgOiAxIDogMy44CitSVS1VTkstMjUyNCA6IDEgOiA5OC4zMDAwMDMKK1JVLVVOSy0yNTI1IDogMSA6IDYuNQorUlUtVU5LLTI1MjYgOiAxIDogMS43CitSVS1VTkstMjUyNyA6IDEgOiA3LjY5OTk5OTgKK1JVLVVOSy0yNTI4IDogMSA6IDEuMAorUlUtVU5LLTI1MjkgOiAxIDogNS41CitSVS1VTkstMjUzMCA6IDEgOiAxLjAKK1JVLVVOSy0yNTMxIDogMSA6IDQuMzAwMDAwMgorUlUtVU5LLTI1MzIgOiAxIDogMS4zCitSVS1VTkstMjUzMyA6IDEgOiAxLjAKK1JVLVVOSy0yNTM0IDogMSA6IDEuMgorUlUtVU5LLTI1MzUgOiAxIDogMS4zCitSVS1VTkstMjUzNiA6IDEgOiAxLjAKK1JVLVVOSy0yNTM3IDogMSA6IDExLjAKK1JVLVVOSy0yNTM4IDogMSA6IDEuMAorUlUtVU5LLTI1MzkgOiAxIDogMS4wCitSVS1VTkstMjU0MCA6IDEgOiAyLjQwMDAwMDEKK1JVLVVOSy0yNTQxIDogMSA6IDEuMworUlUtVU5LLTI1NDIgOiAxIDogMS4wCitSVS1VTkstMjU0MyA6IDEgOiAxLjAKK1JVLVVOSy0yNTQ0IDogMSA6IDUuMAorUlUtVU5LLTI1NDUgOiAxIDogMi4wOTk5OTk5CitSVS1VTkstMjU0NiA6IDEgOiA0LjY5OTk5OTgKK1JVLVVOSy0yNTQ3IDogMSA6IDQuOTAwMDAwMQorUlUtVU5LLTI1NDggOiAxIDogNC45MDAwMDAxCitSVS1VTkstMjU0OSA6IDEgOiAxMy40CitSVS1VTkstMjU1MCA6IDEgOiAxLjAKK1JVLVVOSy0yNTUxIDogMSA6IDIuNQorUlUtVU5LLTI1NTIgOiAxIDogMi40MDAwMDAxCitSVS1VTkstMjU1MyA6IDEgOiAxLjAKK1JVLVVOSy0yNTU0IDogMSA6IDE2LjYKK1JVLVVOSy0yNTU1IDogMSA6IDEuNAorUlUtVU5LLTI1NTYgOiAxIDogMS4wCitSVS1VTkstMjU1NyA6IDEgOiAyOS42CitSVS1VTkstMjU1OCA6IDEgOiA3NC40MDAwMDIKK1JVLVVOSy0yNTU5IDogMSA6IDE2LjEKK1JVLVVOSy0yNTYwIDogMSA6IDEuMAorUlUtVU5LLTI1NjEgOiAxIDogMS4wCitSVS1VTkstMjU2MiA6IDEgOiAxNy42CitSVS1VTkstMjU2MyA6IDEgOiAyLjU5OTk5OTkKK1JVLVVOSy0yNTY0IDogMSA6IDIyLjEKK1JVLVVOSy0yNTY1IDogMSA6IDEuMAorUlUtVU5LLTI1NjYgOiAxIDogMi45MDAwMDAxCitSVS1VTkstMjU2NyA6IDEgOiAyLjgKK1JVLVVOSy0yNTY4IDogMSA6IDEuMgorUlUtVU5LLTI1NjkgOiAxIDogMS4wCitSVS1VTkstMjU3MCA6IDEgOiAxNy4yMDAwMDEKK1JVLVVOSy0yNTcxIDogMSA6IDEuMgorUlUtVU5LLTI1NzIgOiAxIDogMS4wCitSVS1VTkstMjU3MyA6IDEgOiAxLjkKK1JVLVVOSy0yNTc0IDogMSA6IDEuMAorUlUtVU5LLTI1NzUgOiAxIDogMjkuMQorUlUtVU5LLTI1NzYgOiAxIDogMS4yCitSVS1VTkstMjU3NyA6IDEgOiAxLjAKK1JVLVVOSy0yNTc4IDogMSA6IDEuMAorUlUtVU5LLTI1NzkgOiAxIDogMS4wCitSVS1VTkstMjU4MCA6IDEgOiAxLjUKK1JVLVVOSy0yNTgxIDogMSA6IDUuMzAwMDAwMgorUlUtVU5LLTI1ODIgOiAxIDogMS4zCitSVS1VTkstMjU4MyA6IDEgOiA0LjAKK1JVLVVOSy0yNTg0IDogMSA6IDI1My4wCitSVS1VTkstMjU4NSA6IDEgOiAxLjAKK1JVLVVOSy0yNTg2IDogMSA6IDEuNworUlUtVU5LLTI1ODcgOiAxIDogOC4zOTk5OTk2CitSVS1VTkstMjU4OCA6IDEgOiAxLjEKK1JVLVVOSy0yNTg5IDogMSA6IDg4LjA5OTk5OAorUlUtVU5LLTI1OTAgOiAxIDogMTUuNworUlUtVU5LLTI1OTEgOiAxIDogMy4wCitSVS1VTkstMjU5MiA6IDEgOiAyOS4yMDAwMDEKK1JVLVVOSy0yNTkzIDogMSA6IDEuMAorUlUtVU5LLTI1OTQgOiAxIDogMS4wCitSVS1VTkstMjU5NSA6IDEgOiAxLjkKK1JVLVVOSy0yNTk2IDogMSA6IDMuNDAwMDAwMQorUlUtVU5LLTI1OTcgOiAxIDogNDkuNzk5OTk5CitSVS1VTkstMjU5OCA6IDEgOiAxLjMKK1JVLVVOSy0yNTk5IDogMSA6IDguNjAwMDAwNAorUlUtVU5LLTI2MDAgOiAxIDogMTQuOAorUlUtVU5LLTI2MDEgOiAxIDogMS4wCitSVS1VTkstMjYwMiA6IDEgOiA2MS40MDAwMDIKK1JVLVVOSy0yNjAzIDogMSA6IDEuMAorUlUtVU5LLTI2MDQgOiAxIDogMy44CitSVS1VTkstMjYwNSA6IDEgOiA2My41CitSVS1VTkstMjYwNiA6IDEgOiAzLjUKK1JVLVVOSy0yNjA3IDogMSA6IDMyLjU5OTk5OAorUlUtVU5LLTI2MDggOiAxIDogMS4wCitSVS1VTkstMjYwOSA6IDEgOiAxLjIKK1JVLVVOSy0yNjEwIDogMSA6IDEuMAorUlUtVU5LLTI2MTEgOiAxIDogMS42CitSVS1VTkstMjYxMiA6IDEgOiAxLjAKK1JVLVVOSy0yNjEzIDogMSA6IDEuMAorUlUtVU5LLTI2MTQgOiAxIDogMS4wCitSVS1VTkstMjYxNSA6IDEgOiAzLjUKK1JVLVVOSy0yNjE2IDogMSA6IDIuMDk5OTk5OQorUlUtVU5LLTI2MTcgOiAxIDogMS4wCitSVS1VTkstMjYxOCA6IDEgOiAxMS45CitSVS1VTkstMjYxOSA6IDEgOiAzLjMKK1JVLVVOSy0yNjIwIDogMSA6IDMzLjIwMDAwMQorUlUtVU5LLTI2MjEgOiAxIDogMS4wCitSVS1VTkstMjYyMiA6IDEgOiAxLjMKK1JVLVVOSy0yNjIzIDogMSA6IDEuMAorUlUtVU5LLTI2MjQgOiAxIDogNS4xOTk5OTk4CitSVS1VTkstMjYyNSA6IDEgOiAxLjAKK1JVLVVOSy0yNjI2IDogMSA6IDEuMQorUlUtVU5LLTI2MjcgOiAxIDogMS4wCitSVS1VTkstMjYyOCA6IDEgOiAxMS45CitSVS1VTkstMjYyOSA6IDEgOiAxLjAKK1JVLVVOSy0yNjMwIDogMSA6IDEuMAorUlUtVU5LLTI2MzEgOiAxIDogMS4wCitSVS1VTkstMjYzMiA6IDEgOiAzLjUKK1JVLVVOSy0yNjMzIDogMSA6IDEuMAorUlUtVU5LLTI2MzQgOiAxIDogMTAyMTYuNQorUlUtVU5LLTI2MzUgOiAxIDogMS43CitSVS1VTkstMjYzNiA6IDEgOiAxNzg0NS40CitSVS1VTkstMjYzNyA6IDEgOiAxMy4xCitSVS1VTkstMjYzOCA6IDEgOiAxLjAKK1JVLVVOSy0yNjM5IDogMSA6IDIuMAorUlUtVU5LLTI2NDAgOiAxIDogMi4wCitSVS1VTkstMjY0MSA6IDEgOiAxLjQKK1JVLVVOSy0yNjQyIDogMSA6IDIuMAorUlUtVU5LLTI2NDMgOiAxIDogMS44CitSVS1VTkstMjY0NCA6IDEgOiA2MzAuMDk5OTgKK1JVLVVOSy0yNjQ1IDogMSA6IDQuNDAwMDAwMQorUlUtVU5LLTI2NDYgOiAxIDogMS4wCitSVS1VTkstMjY0NyA6IDEgOiAxLjAKK1JVLVVOSy0yNjQ4IDogMSA6IDEuMAorUlUtVU5LLTI2NDkgOiAxIDogMS4wCitSVS1VTkstMjY1MCA6IDEgOiA0LjAKK1JVLVVOSy0yNjUxIDogMSA6IDEuMAorUlUtVU5LLTI2NTIgOiAxIDogMS4wCitSVS1VTkstMjY1MyA6IDEgOiAyLjA5OTk5OTkKK1JVLVVOSy0yNjU0IDogMSA6IDEuMAorUlUtVU5LLTI2NTUgOiAxIDogMi41OTk5OTk5CitSVS1VTkstMjY1NiA6IDEgOiAxLjAKK1JVLVVOSy0yNjU3IDogMSA6IDEuMAorUlUtVU5LLTI2NTggOiAxIDogMTUuMAorUlUtVU5LLTI2NTkgOiAxIDogMi41OTk5OTk5CitSVS1VTkstMjY2MCA6IDEgOiAxLjAKK1JVLVVOSy0yNjYxIDogMSA6IDEuMAorUlUtVU5LLTI2NjIgOiAxIDogNy42OTk5OTk4CitSVS1VTkstMjY2MyA6IDEgOiAxLjAKK1JVLVVOSy0yNjY0IDogMSA6IDEuMQorUlUtVU5LLTI2NjUgOiAxIDogMS4yCitSVS1VTkstMjY2NiA6IDEgOiAxLjAKK1JVLVVOSy0yNjY3IDogMSA6IDE3LjEKK1JVLVVOSy0yNjY4IDogMSA6IDEuNAorUlUtVU5LLTI2NjkgOiAxIDogMS4yCitSVS1VTkstMjY3MCA6IDEgOiAyMC4wCitSVS1VTkstMjY3MSA6IDEgOiA0Ny43OTk5OTkKK1JVLVVOSy0yNjcyIDogMSA6IDIyLjkKK1JVLVVOSy0yNjczIDogMSA6IDQuNQorUlUtVU5LLTI2NzQgOiAxIDogMi4yCitSVS1VTkstMjY3NSA6IDEgOiAxMy4zCitSVS1VTkstMjY3NiA6IDEgOiAxNS41CitSVS1VTkstMjY3NyA6IDEgOiAxLjkKK1JVLVVOSy0yNjc4IDogMSA6IDEuMAorUlUtVU5LLTI2NzkgOiAxIDogMy4yCitSVS1VTkstMjY4MCA6IDEgOiA2LjUKK1JVLVVOSy0yNjgxIDogMSA6IDMuNDAwMDAwMQorUlUtVU5LLTI2ODIgOiAxIDogMS45CitSVS1VTkstMjY4MyA6IDEgOiAxLjAKK1JVLVVOSy0yNjg0IDogMSA6IDE5MjcuNworUlUtVU5LLTI2ODUgOiAxIDogNy40MDAwMDAxCitSVS1VTkstMjY4NiA6IDEgOiAxLjkKK1JVLVVOSy0yNjg3IDogMSA6IDI1NS4yCitSVS1VTkstMjY4OCA6IDEgOiAxLjAKK1JVLVVOSy0yNjg5IDogMSA6IDE5MzMuMQorUlUtVU5LLTI2OTAgOiAxIDogMzcuMDk5OTk4CitSVS1VTkstMjY5MSA6IDEgOiAxLjIKK1JVLVVOSy0yNjkyIDogMSA6IDU1MzQuMjk5OAorUlUtVU5LLTI2OTMgOiAxIDogMTIxLjcKK1JVLVVOSy0yNjk0IDogMSA6IDIyMTQuNjAwMQorUlUtVU5LLTI2OTUgOiAxIDogMjgwOC4yCitSVS1VTkstMjY5NiA6IDEgOiAxMTE1LjYKK1JVLVVOSy0yNjk3IDogMSA6IDEuMAorUlUtVU5LLTI2OTggOiAxIDogNDkuMDk5OTk4CitSVS1VTkstMjY5OSA6IDEgOiA2MDAuMjk5OTkKK1JVLVVOSy0yNzAwIDogMSA6IDE0OS43CitSVS1VTkstMjcwMSA6IDEgOiAxLjQKK1JVLVVOSy0yNzAyIDogMSA6IDMyNi4yOTk5OQorUlUtVU5LLTI3MDMgOiAxIDogNDAuMjk5OTk5CitSVS1VTkstMjcwNCA6IDEgOiAxNTE0My42CitSVS1VTkstMjcwNSA6IDEgOiAxLjAKK1JVLVVOSy0yNzA2IDogMSA6IDE2ODkuOQorUlUtVU5LLTI3MDcgOiAxIDogOTA3Mi4wCitSVS1VTkstMjcwOCA6IDEgOiA0ODkuMjAwMDEKK1JVLVVOSy0yNzA5IDogMSA6IDIzNzcuNworUlUtVU5LLTI3MTAgOiAxIDogMjk2MjYuNAorUlUtVU5LLTI3MTEgOiAxIDogMjk2MjYuNAorUlUtVU5LLTI3MTIgOiAxIDogNDAuNDAwMDAyCitSVS1VTkstMjcxMyA6IDEgOiAxODcxLjYKK1JVLVVOSy0yNzE0IDogMSA6IDM3NS43OTk5OQorUlUtVU5LLTI3MTUgOiAxIDogMjQuNQorUlUtVU5LLTI3MTYgOiAxIDogMS4wCitSVS1VTkstMjcxNyA6IDEgOiA1LjU5OTk5OTkKK1JVLVVOSy0yNzE4IDogMSA6IDEuMAorUlUtVU5LLTI3MTkgOiAxIDogMTIxNi42CitSVS1VTkstMjcyMCA6IDEgOiA3LjkwMDAwMDEKK1JVLVVOSy0yNzIxIDogMSA6IDI4LjIwMDAwMQorUlUtVU5LLTI3MjIgOiAxIDogNS45MDAwMDAxCitSVS1VTkstMjcyMyA6IDEgOiAzLjA5OTk5OTkKK1JVLVVOSy0yNzI0IDogMSA6IDUuODAwMDAwMgorUlUtVU5LLTI3MjUgOiAxIDogNzQuMDk5OTk4CitSVS1VTkstMjcyNiA6IDEgOiA2Ny45MDAwMDIKK1JVLVVOSy0yNzI3IDogMSA6IDUuMzAwMDAwMgorUlUtVU5LLTI3MjggOiAxIDogNC4wCitSVS1VTkstMjcyOSA6IDEgOiAzMS4xCitSVS1VTkstMjczMCA6IDEgOiAxLjAKK1JVLVVOSy0yNzMxIDogMSA6IDEyLjcKK1JVLVVOSy0yNzMyIDogMSA6IDEzLjMKK1JVLVVOSy0yNzMzIDogMSA6IDEuMQorUlUtVU5LLTI3MzQgOiAxIDogMTkuMQorUlUtVU5LLTI3MzUgOiAxIDogMS4wCitSVS1VTkstMjczNiA6IDEgOiAxLjAKK1JVLVVOSy0yNzM3IDogMSA6IDEuOAorUlUtVU5LLTI3MzggOiAxIDogMi41CitSVS1VTkstMjczOSA6IDEgOiAyLjcKK1JVLVVOSy0yNzQwIDogMSA6IDE5MDEuOAorUlUtVU5LLTI3NDEgOiAxIDogMS42CitSVS1VTkstMjc0MiA6IDEgOiAzLjIKK1JVLVVOSy0yNzQzIDogMSA6IDExLjIKK1JVLVVOSy0yNzQ0IDogMSA6IDEuMAorUlUtVU5LLTI3NDUgOiAxIDogOC4wCitSVS1VTkstMjc0NiA6IDEgOiAyLjU5OTk5OTkKK1JVLVVOSy0yNzQ3IDogMSA6IDEuMAorUlUtVU5LLTI3NDggOiAxIDogMi43CitSVS1VTkstMjc0OSA6IDEgOiAxLjIKK1JVLVVOSy0yNzUwIDogMSA6IDEuMAorUlUtVU5LLTI3NTEgOiAxIDogMS4wCitSVS1VTkstMjc1MiA6IDEgOiAxLjAKK1JVLVVOSy0yNzUzIDogMSA6IDEuMAorUlUtVU5LLTI3NTQgOiAxIDogMS4yCitSVS1VTkstMjc1NSA6IDEgOiAxNTQuNworUlUtVU5LLTI3NTYgOiAxIDogOS4zOTk5OTk2CitSVS1VTkstMjc1NyA6IDEgOiA1MS41OTk5OTgKK1JVLVVOSy0yNzU4IDogMSA6IDc0LjA5OTk5OAorUlUtVU5LLTI3NTkgOiAxIDogMzkzNi4yCitSVS1VTkstMjc2MCA6IDEgOiA1LjkwMDAwMDEKK1JVLVVOSy0yNzYxIDogMSA6IDMwLjI5OTk5OQorUlUtVU5LLTI3NjIgOiAxIDogMS4wCitSVS1VTkstMjc2MyA6IDEgOiAxLjAKK1JVLVVOSy0yNzY0IDogMSA6IDIuMDk5OTk5OQorUlUtVU5LLTI3NjUgOiAxIDogMy45MDAwMDAxCitSVS1VTkstMjc2NiA6IDEgOiAyMjY5LjMKK1JVLVVOSy0yNzY3IDogMSA6IDIuNworUlUtVU5LLTI3NjggOiAxIDogNy4wOTk5OTk5CitSVS1VTkstMjc2OSA6IDEgOiAyMi4yOTk5OTkKK1JVLVVOSy0yNzcwIDogMSA6IDEzLjgKK1JVLVVOSy0yNzcxIDogMSA6IDMyLjIwMDAwMQorUlUtVU5LLTI3NzIgOiAxIDogMTguNzk5OTk5CitSVS1VTkstMjc3MyA6IDEgOiAzLjA5OTk5OTkKK1JVLVVOSy0yNzc0IDogMSA6IDY1LjA5OTk5OAorUlUtVU5LLTI3NzUgOiAxIDogMi4yCitSVS1VTkstMjc3NiA6IDEgOiAxLjkKK1JVLVVOSy0yNzc3IDogMSA6IDEyLjMKK1JVLVVOSy0yNzc4IDogMSA6IDE2LjYKK1JVLVVOSy0yNzc5IDogMSA6IDIzLjUKK1JVLVVOSy0yNzgwIDogMSA6IDIuNworUlUtVU5LLTI3ODEgOiAxIDogNy4xOTk5OTk4CitSVS1VTkstMjc4MiA6IDEgOiA4Ljg5OTk5OTYKK1JVLVVOSy0yNzgzIDogMSA6IDE4LjYKK1JVLVVOSy0yNzg0IDogMSA6IDM0LjQwMDAwMgorUlUtVU5LLTI3ODUgOiAxIDogMjM3LjM5OTk5CitSVS1VTkstMjc4NiA6IDEgOiA5NC4wCitSVS1VTkstMjc4NyA6IDEgOiA1LjAKK1JVLVVOSy0yNzg4IDogMSA6IDI4OTkuMworUlUtVU5LLTI3ODkgOiAxIDogMzAuNAorUlUtVU5LLTI3OTAgOiAxIDogNC4zMDAwMDAyCitSVS1VTkstMjc5MSA6IDEgOiA1MTUuMDk5OTgKK1JVLVVOSy0yNzkyIDogMSA6IDQuOTAwMDAwMQorUlUtVU5LLTI3OTMgOiAxIDogMi41OTk5OTk5CitSVS1VTkstMjc5NCA6IDEgOiAxLjAKK1JVLVVOSy0yNzk1IDogMSA6IDIuNQorUlUtVU5LLTI3OTYgOiAxIDogMzQuMDk5OTk4CitSVS1VTkstMjc5NyA6IDEgOiAzLjUKK1JVLVVOSy0yNzk4IDogMSA6IDYuMzAwMDAwMgorUlUtVU5LLTI3OTkgOiAxIDogMTEwLjkKK1JVLVVOSy0yODAwIDogMSA6IDEuNgorUlUtVU5LLTI4MDEgOiAxIDogMS4wCitSVS1VTkstMjgwMiA6IDEgOiAxLjEKK1JVLVVOSy0yODAzIDogMSA6IDEyLjAKK1JVLVVOSy0yODA0IDogMSA6IDY1LjUKK1JVLVVOSy0yODA1IDogMSA6IDE2LjAKK1JVLVVOSy0yODA2IDogMSA6IDEyLjQKK1JVLVVOSy0yODA3IDogMSA6IDEuMAorUlUtVU5LLTI4MDggOiAxIDogMy4zCitSVS1VTkstMjgwOSA6IDEgOiAxLjMKK1JVLVVOSy0yODEwIDogMSA6IDEwOS4zCitSVS1VTkstMjgxMSA6IDEgOiAxNS4wCitSVS1VTkstMjgxMiA6IDEgOiA2LjY5OTk5OTgKK1JVLVVOSy0yODEzIDogMSA6IDEuMAorUlUtVU5LLTI4MTQgOiAxIDogMzAuNgorUlUtVU5LLTI4MTUgOiAxIDogNi4xOTk5OTk4CitSVS1VTkstMjgxNiA6IDEgOiAxLjcKK1JVLVVOSy0yODE3IDogMSA6IDEuNgorUlUtVU5LLTI4MTggOiAxIDogMTcuMQorUlUtVU5LLTI4MTkgOiAxIDogMS4wCitSVS1VTkstMjgyMCA6IDEgOiAxLjcKK1JVLVVOSy0yODIxIDogMSA6IDEuMAorUlUtVU5LLTI4MjIgOiAxIDogNS44MDAwMDAyCitSVS1VTkstMjgyMyA6IDEgOiAyLjgKK1JVLVVOSy0yODI0IDogMSA6IDMzLjkwMDAwMgorTW91cm1hbnNrYe9hIG9ibGFzdDtQZWNoZW5nc2tpeSA6IDEgOiAxMzIyMS44CitOZW5ldHNraSBuYXRpb25hbCBva3JvdWc7TmVuZXRza3kgbmF0LiBva3JvdWcgOiAxIDogMTY4MTQ5LjA5CitNb3VybWFuc2th72Egb2JsYXN0O0tvbHNraXkgOiAxIDogMjM1MDEuMAorTW91cm1hbnNrYe9hIG9ibGFzdDtTZXZlcm9tb3JzayA6IDEgOiA1MDMuNjAwMDEKK01vdXJtYW5za2HvYSBvYmxhc3Q7UG9seWFybnlpIDogMSA6IDQuMDk5OTk5OQorTW91cm1hbnNrYe9hIG9ibGFzdDtNdXJtYW5zayA6IDEgOiA4MC4xOTk5OTcKK01vdXJtYW5za2HvYSBvYmxhc3Q7TG92b3plcnNraXkgOiAxIDogNTI2NzUuNjAyCitLb21pO1Zvcmt1dGEgOiAxIDogMjA4MTcuNjk5CitNb3VybWFuc2th72Egb2JsYXN0O09sZW5lZ29yc2sgOiAxIDogMTc5NS41CitNb3VybWFuc2th72Egb2JsYXN0O01vbmNoZWdvcnNrIDogMSA6IDMzNTkuMgorTW91cm1hbnNrYe9hIG9ibGFzdDtLb3Zkb3Jza2l5IDogMSA6IDQxMDYuMAorTW91cm1hbnNrYe9hIG9ibGFzdDtLaXJvdnNrIDogMSA6IDM2MTIuOAorTW91cm1hbnNrYe9hIG9ibGFzdDtBcGF0aXR5IDogMSA6IDM2NjguODk5OQorTmVuZXRza2kgbmF0aW9uYWwgb2tyb3VnO05hcnlhbi1NYXIgOiAxIDogNjMuNzk5OTk5CitNb3VybWFuc2th72Egb2JsYXN0O0thbmRhbGFrc2hhIDogMSA6IDEyNjY1LjIKK01vdXJtYW5za2HvYSBvYmxhc3Q7UG9seWFybml5ZSBab3J5IDogMSA6IDEwNC41CitNb3VybWFuc2th72Egb2JsYXN0O1RlcnNraXkgOiAxIDogMTkwNzUuMAorS29taTtVc3QtVHNpbGVtc2tpeSA6IDEgOiA0MTA1NS42OTkKK0tvbWk7VXNpbnNraXkgOiAxIDogMzI1NDIuODAxCitLb21pO0ludGEgOiAxIDogMzI2NjQuMzAxCitLYXJlbGlhO0xvdWtoc2tpeSA6IDEgOiAyMTYwOC40CitBcmtoYW5nZWxza2HvYSBvYmxhc3QgculzO01lemVuc2tpeSA6IDEgOiAzNDE1Ni4zMDEKK0tvbWk7SXpoZW1za2l5IDogMSA6IDE5MDAxLjE5OQorS29taTtVc2luc2sgOiAxIDogMS42CitLYXJlbGlhO0tlbXNraXkgOiAxIDogNzY2NC4zOTk5CitBcmtoYW5nZWxza2HvYSBvYmxhc3QgculzO1ByaW1vcnNraXkgOiAxIDogMjMwMTAuMAorS29taTtQZWNob3Jza2l5IDogMSA6IDI4NjU5LjQKK0thcmVsaWE7S2FsZXZhbHNraXkgOiAxIDogMTcwMTUuODAxCitBcmtoYW5nZWxza2HvYSBvYmxhc3QgculzO0xlc2h1a29uc2tpeSA6IDEgOiAyODMxOC42OTkKK0Fya2hhbmdlbHNrYe9hIG9ibGFzdCBy6XM7UGluZXpoc2tpeSA6IDEgOiAzMDQyNi44MDEKK0Fya2hhbmdlbHNrYe9hIG9ibGFzdCBy6XM7U29sb3ZldHNraXkgOiAxIDogNDguMjk5OTk5CitLb21pO1BlY2hvcmEgOiAxIDogNi40MDAwMDAxCitLYXJlbGlhO0tlbScgOiAxIDogMy4zCitLYXJlbGlhO0JlbG9tb3Jza2l5IDogMSA6IDEyOTc3LjIKK0tvbWk7VWRvcnNraXkgOiAxIDogMzU5MTMuMzk4CitSVS1VTkstMjgyNSA6IDEgOiAyMjk4NC44MDEKK1JVLVVOSy0yODI2IDogMSA6IDIyOTg0LjgwMQorQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztLaG9sbW9nb3Jza2l5IDogMSA6IDE1NTY5LjQKK0thcmVsaWE7S29zdG9tdWtzaGEgOiAxIDogNi4wOTk5OTk5CitBcmtoYW5nZWxza2HvYSBvYmxhc3QgculzO0Fya2hhbmdlbHNrIDogMSA6IDQ1LjIwMDAwMQorQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztTZXZlcm9kdmluc2sgOiAxIDogMjEuNAorQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztPbmV6aHNraXkgOiAxIDogMjI2MTIuMAorS29taTtLbnlhemhwb2dvc3Rza2l5IDogMSA6IDI0MjEwLjEKK0thcmVsaWE7TXV5ZXplcnNraXkgOiAxIDogMTc4ODcuNAorS29taTtTb3Nub2dvcnNraXkgOiAxIDogMTcwMjguNjk5CitLb21pO1VraHRhIDogMSA6IDEzNTY2LjMKK0Fya2hhbmdlbHNrYe9hIG9ibGFzdCBy6XM7Tm92b2R2aW5zayA6IDEgOiA5LjAKK0thcmVsaWE7U2VnZXpoc2tpeSA6IDEgOiAxMDc4My4yCitBcmtoYW5nZWxza2HvYSBvYmxhc3QgculzO1BsZXNldHNraXkgOiAxIDogMjcwOTYuMzAxCitBcmtoYW5nZWxza2HvYSBvYmxhc3QgculzO09uZWdhIDogMSA6IDguMzk5OTk5NgorS29taTtWdWt0eWxza2l5IDogMSA6IDguMTk5OTk5OAorS2FyZWxpYTtNZWR2ZXpoeWVnb3Jza2l5IDogMSA6IDEzMzc0LjMKK0thcmVsaWE7U2VnZXpoYSA6IDEgOiA1LjA5OTk5OTkKK0tvbWk7VHJvaXRza28tUGVjaG9yc2tpeSA6IDEgOiAzOTEzOC4xOTkKK0Fya2hhbmdlbHNrYe9hIG9ibGFzdCBy6XM7Vmlub2dyYWRvdnNraXkgOiAxIDogMTI1MzguNQorS29taTtTb3Nub2dvcnNrIDogMSA6IDEuMAorQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztWZXJraG5ldG95ZW1za2l5IDogMSA6IDIwMTYyLjgwMQorS2FyZWxpYTtTdW95YXJ2c2tpeSA6IDEgOiAxMzYyOC4xCitLYXJlbGlhO0tvbmRvcG96aHNraXkgOiAxIDogNjY4Mi4yMDAyCitLb21pO0tvcnRrZXJvc3NraXkgOiAxIDogMTk3MjYuMTk5CitBcmtoYW5nZWxza2HvYSBvYmxhc3QgculzO0xlbnNraXkgOiAxIDogOTA2MC45MDA0CitLYXJlbGlhO1B1ZG96aHNraXkgOiAxIDogMTMxMDEuMQorS29taTtVc3QtVnltc2tpeSA6IDEgOiA0NjQ4LjM5OTkKK0tvbWk7VXN0LUt1bG9tc2tpeSA6IDEgOiAyNjYzNi42OTkKK0Fya2hhbmdlbHNrYe9hIG9ibGFzdCBy6XM7U2hlbmt1cnNraXkgOiAxIDogMTA3ODAuOQorQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztOeWFuZG9tc2tpeSA6IDEgOiA4MDE4LjcwMDIKK0Fya2hhbmdlbHNrYe9hIG9ibGFzdCBy6XM7S3Jhc25vYm9yc2tpeSA6IDEgOiA4ODI5LjkwMDQKK0thcmVsaWE7S29uZG9wb2dhIDogMSA6IDUuMTk5OTk5OAorS2FyZWxpYTtTb3J0YXZhbGEgOiAxIDogMjA3NC4wCitLb21pO1N5a3R5dmRpbnNraXkgOiAxIDogNzI2Ny4zOTk5CitBcmtoYW5nZWxza2HvYSBvYmxhc3QgculzO0thcmdhcG9sc2tpeSA6IDEgOiA5NTIyLjU5OTYKK0thcmVsaWE7UHJ5YXpoaW5za2l5IDogMSA6IDYzNTguODk5OQorS2FyZWxpYTtQcmlvbmV6aHNraXkgOiAxIDogMzc5NC4zCitBcmtoYW5nZWxza2HvYSBvYmxhc3QgculzO1ZlbHNraXkgOiAxIDogMTAwNjMuNQorS2FyZWxpYTtQaXRreWFyYW50c2tpeSA6IDEgOiAxMzg0LjUKK0Fya2hhbmdlbHNrYe9hIG9ibGFzdCBy6XM7VXN0eWFuc2tpeSA6IDEgOiAxMjE5OC4zCitBcmtoYW5nZWxza2HvYSBvYmxhc3QgculzO0tvdGxhc3NraXkgOiAxIDogODU3MS4yOTk4CitLb21pO1N5a3R5dmt2YXIgOiAxIDogNjY5Ljc5OTk5CitLYXJlbGlhO1BldHJvemF2b2RzayA6IDEgOiA3Ni40MDAwMDIKK0thcmVsaWE7TGFraGRlbnBva2hza2l5IDogMSA6IDIxMDIuMzk5OQorQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztWaWxlZ29kc2tpeSA6IDEgOiA2NDE1LjI5OTgKK0thcmVsaWE7UHl0a2lhcmFudGEgOiAxIDogMy4wCitWb2xvZ29kc2th72Egb2JsYXN0O1Z5dGVnb3Jza2l5IDogMSA6IDEzNzQzLjEKK0tvbWk7U3lzb2xza2l5IDogMSA6IDYyNDguMAorS2FyZWxpYTtPbG9uZXRza2l5IDogMSA6IDM5OTEuMworQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztLb25vc2hza2l5IDogMSA6IDk1NDguMDk5NgorQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztLb3J5YXpobWEgOiAxIDogNy40MDAwMDAxCitBcmtoYW5nZWxza2HvYSBvYmxhc3QgculzO0tvdGxhcyA6IDEgOiAxMC4yCitWb2xvZ29kc2th72Egb2JsYXN0O1ZlbGlrb3VzdHl1Z3NraXkgOiAxIDogODAyOS4yOTk4CitLb21pO1ByaWx1enNraXkgOiAxIDogMTM3OTQuMgorVm9sb2dvZHNrYe9hIG9ibGFzdDtUYXJub2dza2l5IDogMSA6IDU1MTQuMjk5OAorS29taTtLb3lnb3JvZHNraXkgOiAxIDogMTAyNjQuMworVm9sb2dvZHNrYe9hIG9ibGFzdDtOeXVrc2Vuc2tpeSA6IDEgOiA1MDM4LjM5OTkKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7VmVya2hvdmF6aHNraXkgOiAxIDogNDQyNy43MDAyCitWb2xvZ29kc2th72Egb2JsYXN0O0tpcmlsbG92c2tpeSA6IDEgOiA1Mjg5Ljg5OTkKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7VmVsaWtpeSBVc3R5dWcgOiAxIDogMTEuNworVm9sb2dvZHNrYe9hIG9ibGFzdDtWb3poZWdvZHNraXkgOiAxIDogNTQ4NC41CitWb2xvZ29kc2th72Egb2JsYXN0O1Zhc2hraW5za2l5IDogMSA6IDMxMjIuMworVm9sb2dvZHNrYe9hIG9ibGFzdDtCZWxvemVyc2tpeSA6IDEgOiA2MTEzLjEwMDEKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7QmFiYXlldnNraXkgOiAxIDogOTEyOC4wOTk2CitWb2xvZ29kc2th72Egb2JsYXN0O0tpY2htZW5nc2tvIEdvcm9kZXRza2l5IDogMSA6IDc0MzEuODk5OQorVm9sb2dvZHNrYe9hIG9ibGFzdDtLaGFyb3Zza2l5IDogMSA6IDM1NDcuODk5OQorVm9sb2dvZHNrYe9hIG9ibGFzdDtUb3RlbXNraXkgOiAxIDogNzg1Ni44OTk5CitWb2xvZ29kc2th72Egb2JsYXN0O1N5YW16aGVuc2tpeSA6IDEgOiAzODkzLjIKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7VWN0LUt1Ymluc2tpeSA6IDEgOiAyNzA4LjcKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7QmFidXNoa2luc2tpeSA6IDEgOiA3MzgwLjM5OTkKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7Tmlrb2xza2l5IDogMSA6IDcwMzQuNzk5OAorVm9sb2dvZHNrYe9hIG9ibGFzdDtWb2xvZ29kc2tpeSA6IDEgOiA0OTAzLjUKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7U29rb2xza2l5IDogMSA6IDM5ODguMAorVm9sb2dvZHNrYe9hIG9ibGFzdDtLYWR1eXNraXkgOiAxIDogMzM0OS42MDAxCitWb2xvZ29kc2th72Egb2JsYXN0O0NoZXJlcG92ZXRza2l5IDogMSA6IDQ4NTYuMjk5OAorVm9sb2dvZHNrYe9hIG9ibGFzdDtTaGVrc25pbnNraXkgOiAxIDogMjQ2OC4yCitWb2xvZ29kc2th72Egb2JsYXN0O01lemhkdXJlY2hlbnNraXkgOiAxIDogMzcwNS43CitWb2xvZ29kc2th72Egb2JsYXN0O1Nva29sIDogMSA6IDcuNQorVm9sb2dvZHNrYe9hIG9ibGFzdDtDaGFnb2Rlc2NoZW5za2l5IDogMSA6IDIzMDcuNworVm9sb2dvZHNrYe9hIG9ibGFzdDtWb2xvZ2RhIDogMSA6IDI0LjQKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7VXN0eXV6aGVuc2tpeSA6IDEgOiAzNjg1LjYwMDEKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7Q2hlcmVwb3ZldHogOiAxIDogMS4wCitWb2xvZ29kc2th72Egb2JsYXN0O0dyeWF6b3ZldHNraXkgOiAxIDogNDUwNy4zOTk5CitSVS1VTkstMjgyNyA6IDEgOiAyMjk4NC44MDEKK1JVLVVOSy0yODI4IDogMSA6IDIyOTg0LjgwMQorVGFtYm92c2th72Egb2JsYXN0O01vcnNoYW5za2l5IDogMSA6IDI3NTUuODk5OQorTGlwZXRza2HvYSBvYmxhc3Q7Q2hhcGx5Z2luc2tpeSA6IDEgOiAxNjI4LjMKK0xpcGV0c2th72Egb2JsYXN0O0RhbmtvdnNraXkgOiAxIDogMTc1Mi44CitUYW1ib3Zza2HvYSBvYmxhc3Q7U3Rhcm95dXJ5ZXZza2l5IDogMSA6IDExNjQuNAorVGFtYm92c2th72Egb2JsYXN0O1Nvc25vdnNraXkgOiAxIDogMjEyMS44OTk5CitUYW1ib3Zza2HvYSBvYmxhc3Q7TW9yc2hhbnNrIDogMSA6IDMwLjcwMDAwMQorTGlwZXRza2HvYSBvYmxhc3Q7TGV2IC1Ub2xzdG92c2tpeSA6IDEgOiA4NTYuMDk5OTgKK1RhbWJvdnNrYe9hIG9ibGFzdDtQZXJ2b21heXNraXkgOiAxIDogOTQyLjc5OTk5CitUYW1ib3Zza2HvYSBvYmxhc3Q7UGljaGF5ZXZza2l5IDogMSA6IDExODMuMgorTGlwZXRza2HvYSBvYmxhc3Q7RGFua292IDogMSA6IDEuMAorVGFtYm92c2th72Egb2JsYXN0O01pY2h1cmluc2tpeSA6IDEgOiAxNTI2LjkKK1RhbWJvdnNrYe9hIG9ibGFzdDtOaWtpZm9yb3Zza2l5IDogMSA6IDEyMTkuOQorTGlwZXRza2HvYSBvYmxhc3Q7TGViZWR5YW5za2l5IDogMSA6IDE1NDQuNgorVGFtYm92c2th72Egb2JsYXN0O0JvbmRhcnNraXkgOiAxIDogMTA4My42CitUYW1ib3Zza2HvYSBvYmxhc3Q7R2F2cmlsb3Zza2l5IDogMSA6IDEwNzAuNworVGFtYm92c2th72Egb2JsYXN0O1RhbWJvdnNraXkgOiAxIDogMjU4Mi44CitMaXBldHNrYe9hIG9ibGFzdDtLcmFzbmluc2tpeSA6IDEgOiA5NzAuNzk5OTkKK0xpcGV0c2th72Egb2JsYXN0O0RvYnJvdnNraXkgOiAxIDogMTExNy41CitMaXBldHNrYe9hIG9ibGFzdDtTdGFub3ZseWFuc2tpeSA6IDEgOiAxMjg4LjQKK1RhbWJvdnNrYe9hIG9ibGFzdDtNaWNodXJpbnNrIDogMSA6IDEwMi4yCitUYW1ib3Zza2HvYSBvYmxhc3Q7S2lyc2Fub3Zza2l5IDogMSA6IDExNTkuMworVGFtYm92c2th72Egb2JsYXN0O1Jhc3NrYXpvdnNraXkgOiAxIDogMTk1MC4yCitMaXBldHNrYe9hIG9ibGFzdDtJem1hbGtvdnNraXkgOiAxIDogMTMxOC45CitUYW1ib3Zza2HvYSBvYmxhc3Q7VW1ldHNraXkgOiAxIDogMTI3OS42CitMaXBldHNrYe9hIG9ibGFzdDtMaXBldHNraXkgOiAxIDogMTQ0Ny40CitUYW1ib3Zza2HvYSBvYmxhc3Q7UGV0cm92c2tpeSA6IDEgOiAxODM4LjMKK0xpcGV0c2th72Egb2JsYXN0O1phZG9uc2tpeSA6IDEgOiAxNjAwLjkKK0xpcGV0c2th72Egb2JsYXN0O1llbGV0c2tpeSA6IDEgOiAxMTQwLjcKK1RhbWJvdnNrYe9hIG9ibGFzdDtUYW1ib3YgOiAxIDogOS41CitMaXBldHNrYe9hIG9ibGFzdDtMaXBldHNrIDogMSA6IDE5NC44OTk5OQorTGlwZXRza2HvYSBvYmxhc3Q7R3J5YXppbnNraXkgOiAxIDogMTYzOS40CitUYW1ib3Zza2HvYSBvYmxhc3Q7UmFzc2them92byA6IDEgOiAzNC45MDAwMDIKK1RhbWJvdnNrYe9hIG9ibGFzdDtLaXJzYW5vdm8gOiAxIDogOS4wCitMaXBldHNrYe9hIG9ibGFzdDtFbGV0eiA6IDEgOiA0MS40MDAwMDIKK1RhbWJvdnNrYe9hIG9ibGFzdDtLb3RvdnNrIDogMSA6IDIyLjUKK1RhbWJvdnNrYe9hIG9ibGFzdDtabmFtZW5za2l5IDogMSA6IDEyMzEuOQorVGFtYm92c2th72Egb2JsYXN0O0luemhhdmluc2tpeSA6IDEgOiAxOTEyLjUKK0xpcGV0c2th72Egb2JsYXN0O0dyeWF6eSA6IDEgOiAxLjEKK0xpcGV0c2th72Egb2JsYXN0O0RvbGdvcnVrb3Zza2l5IDogMSA6IDk5OC41OTk5OAorTGlwZXRza2HvYSBvYmxhc3Q7RG9icmluc2tpeSA6IDEgOiAxNjU1LjEKK1RhbWJvdnNrYe9hIG9ibGFzdDtNb3Jkb3Zza2l5IDogMSA6IDE4MDguMgorVGFtYm92c2th72Egb2JsYXN0O1NhbXB1cnNraXkgOiAxIDogOTg2Ljc5OTk5CitUYW1ib3Zza2HvYSBvYmxhc3Q7UnpoYWtzaW5za2l5IDogMSA6IDExNzIuMAorS291cnNrYe9hIG9ibGFzdDtaaGVsZXpub2dvcnNraXkgOiAxIDogODU3Ljc5OTk5CitLb3Vyc2th72Egb2JsYXN0O1Bvbnlyb3Zza2l5IDogMSA6IDg2Ny41CitLb3Vyc2th72Egb2JsYXN0O0RtaXRyaXlldnNraXkgOiAxIDogMTQ1OC44CitMaXBldHNrYe9hIG9ibGFzdDtVc21hbnNraXkgOiAxIDogMTg1Ni4xCitMaXBldHNrYe9hIG9ibGFzdDtLaGxldmVuc2tpeSA6IDEgOiA3NzEuOTAwMDIKK0tvdXJza2HvYSBvYmxhc3Q7RmF0ZXpoc2tpeSA6IDEgOiAxNTY1LjQKK1JVLVVOSy0yODI5IDogMSA6IDkuNQorTGlwZXRza2HvYSBvYmxhc3Q7VGVyYnVuc2tpeSA6IDEgOiAxMjUwLjAKK1RhbWJvdnNrYe9hIG9ibGFzdDtUb2thcmV2c2tpeSA6IDEgOiAxMjY2LjgKK0xpcGV0c2th72Egb2JsYXN0O1ZvbG92c2tpeSA6IDEgOiA3ODQuOTAwMDIKK0tvdXJza2HvYSBvYmxhc3Q7Wm9sb3R1a2hpbnNraXkgOiAxIDogMTEyNy40CitUYW1ib3Zza2HvYSBvYmxhc3Q7VXZhcm92c2tpeSA6IDEgOiAxMTUyLjAKK0tvdXJza2HvYSBvYmxhc3Q7U2NoaWdyb3Zza2l5IDogMSA6IDE0MzAuNAorVm9yb25lanNrYe9hIG9ibGFzdDtSYW1vbnNraXkgOiAxIDogMTIxOC4wCitUYW1ib3Zza2HvYSBvYmxhc3Q7TXVjaGthcHNraXkgOiAxIDogMTEzNi42CitWb3JvbmVqc2th72Egb2JsYXN0O1NlbWlsdWtza2l5IDogMSA6IDE2MzYuMgorVGFtYm92c2th72Egb2JsYXN0O1poZXJkZXZza2l5IDogMSA6IDE4NTAuMworS291cnNrYe9hIG9ibGFzdDtDaGVyZW1pc2lub3Zza2l5IDogMSA6IDgwMC4wOTk5OAorS291cnNrYe9hIG9ibGFzdDtLaG9tdXRvdnNraXkgOiAxIDogMTEzMy44CitUYW1ib3Zza2HvYSBvYmxhc3Q7VXZhcm92byA6IDEgOiA0MC45MDAwMDIKK0tvdXJza2HvYSBvYmxhc3Q7S29ueXNoZXZza2l5IDogMSA6IDExMTQuNgorS291cnNrYe9hIG9ibGFzdDtTb3ZldHNraXkgOiAxIDogMTI5Ny40CitLb3Vyc2th72Egb2JsYXN0O0thc3RvcmVuc2tpeSA6IDEgOiAxMzc4LjUKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7VmVya2huZWtoYXZza2l5IDogMSA6IDE0NjguMQorVm9yb25lanNrYe9hIG9ibGFzdDtFcnRpbHNraXkgOiAxIDogMTQ0My4yCitLb3Vyc2th72Egb2JsYXN0O0t1cnNraXkgOiAxIDogMTUzMC43CitLb3Vyc2th72Egb2JsYXN0O1RzY2hpZ3J5IDogMSA6IDE5LjkKK0tvdXJza2HvYSBvYmxhc3Q7S3VyY2hhdG92c2tpeSA6IDEgOiA1OTMuMjAwMDEKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7Vm9yb25lemggOiAxIDogNDcxLjI5OTk5CitLb3Vyc2th72Egb2JsYXN0O09rdHlhYnJza2l5IDogMSA6IDU0OS43OTk5OQorVm9yb25lanNrYe9hIG9ibGFzdDtOb3ZvdXNtYW5za2l5IDogMSA6IDExNTQuMworVm9yb25lanNrYe9hIG9ibGFzdDtQYW5pbnNraXkgOiAxIDogMTQxMy41CitLb3Vyc2th72Egb2JsYXN0O0wnZ292c2t5IDogMSA6IDExNjEuNgorS291cnNrYe9hIG9ibGFzdDtLdXJzayA6IDEgOiAxNDkuNworS291cnNrYe9hIG9ibGFzdDtUaW1za2l5IDogMSA6IDgwNC41CitLb3Vyc2th72Egb2JsYXN0O1J5bHNraXkgOiAxIDogMTUzNy4zCitWb3JvbmVqc2th72Egb2JsYXN0O05pemhuZWRldml0c2tpeSA6IDEgOiAxNDIzLjgKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7VGVybm92c2tpeSA6IDEgOiAxMTY3LjIKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7R3JpYmFub3Zza2l5IDogMSA6IDE4NDIuMAorVm9yb25lanNrYe9hIG9ibGFzdDtCb3Jpc29nbGVic2tpeSA6IDEgOiAxNDgyLjgKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7S2hva2hvbHNraXkgOiAxIDogMTUyMy43CitLb3Vyc2th72Egb2JsYXN0O0xnb3YgOiAxIDogMjIuOQorVm9yb25lanNrYe9hIG9ibGFzdDtBbm5pbnNraXkgOiAxIDogMjA5My4zOTk5CitLb3Vyc2th72Egb2JsYXN0O0t1cmNoYXRvdiA6IDEgOiAyLjUKK0tvdXJza2HvYSBvYmxhc3Q7U29sbnRzZXZza2l5IDogMSA6IDEwMTkuMQorS291cnNrYe9hIG9ibGFzdDtHb3JzaGVjaGVuc2tpeSA6IDEgOiAxMjgyLjYKK0tvdXJza2HvYSBvYmxhc3Q7TWVkdmVuc2tpeSA6IDEgOiA5MjEuNTk5OTgKK0tvdXJza2HvYSBvYmxhc3Q7TWFudHVyb3Zza2l5IDogMSA6IDc4OS40MDAwMgorS291cnNrYe9hIG9ibGFzdDtCb2xzaGVzb2xkYXRza2l5IDogMSA6IDczNS45MDAwMgorS291cnNrYe9hIG9ibGFzdDtLb3JlbmV2c2tpeSA6IDEgOiA3MDEuNDAwMDIKK0tvdXJza2HvYSBvYmxhc3Q7R2x1c2hrb3Zza2l5IDogMSA6IDg2OS4wCitWb3JvbmVqc2th72Egb2JsYXN0O0thc2hpcnNraXkgOiAxIDogMTAyNC41CitWb3JvbmVqc2th72Egb2JsYXN0O1Bvdm9yaW5za2l5IDogMSA6IDk4OC4yOTk5OQorS291cnNrYe9hIG9ibGFzdDtTdWR6aGFuc2tpeSA6IDEgOiA4NjAuNzk5OTkKK0JlbGdvcm9kc2th72Egb2JsYXN0O0d1YmtpbnNraXkgOiAxIDogMTU4Ni4xCitCZWxnb3JvZHNrYe9hIG9ibGFzdDtTdGFyb29za29sc2tpeSA6IDEgOiAxNDU4LjcKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7Tm92b2tob3BlcnNraXkgOiAxIDogMjI5NC44CitWb3JvbmVqc2th72Egb2JsYXN0O0Jvcmlzb2dsZWJzayA6IDEgOiA1NS4wCitWb3JvbmVqc2th72Egb2JsYXN0O0JvYnJvdnNraXkgOiAxIDogMjI2OS4wCitLb3Vyc2th72Egb2JsYXN0O09ib3lhbnNraXkgOiAxIDogODIzLjI5OTk5CitLb3Vyc2th72Egb2JsYXN0O1ByaXN0ZW5za2l5IDogMSA6IDc2NC4wCitWb3JvbmVqc2th72Egb2JsYXN0O1RhbG92c2tpeSA6IDEgOiAxNzcyLjcKK0JlbGdvcm9kc2th72Egb2JsYXN0O1N0YXJ5aSBPc2tvbCA6IDEgOiAyLjAKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7UmVwaXlldmthIDogMSA6IDg1OC4wOTk5OAorUlUtVU5LLTI4MzAgOiAxIDogMS4wCitCZWxnb3JvZHNrYe9hIG9ibGFzdDtHdWJraW4gOiAxIDogMS4wCitWb3JvbmVqc2th72Egb2JsYXN0O0xpc2tpbnNraXkgOiAxIDogMTgyNS4yCitLb3Vyc2th72Egb2JsYXN0O0JlbG92c2tpeSA6IDEgOiA4NTkuOTAwMDIKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7T3N0cm9nb3poc2tpeSA6IDEgOiAxODQzLjAKK0JlbGdvcm9kc2th72Egb2JsYXN0O1Byb2tob3JvdnNraXkgOiAxIDogMTQ2MS41CitWb3JvbmVqc2th72Egb2JsYXN0O1Bvdm9yaW5vIDogMSA6IDEuMAorQmVsZ29yb2Rza2HvYSBvYmxhc3Q7SXZueWFuc2tpeSA6IDEgOiA5NTcuNQorQmVsZ29yb2Rza2HvYSBvYmxhc3Q7Q2hlcm55YW5za2l5IDogMSA6IDEzNzUuNgorUlUtVU5LLTI4MzEgOiAxIDogMTI5OC43CitWb3JvbmVqc2th72Egb2JsYXN0O0xpc2tpIDogMSA6IDY4LjU5OTk5OAorQmVsZ29yb2Rza2HvYSBvYmxhc3Q7UmFraXR5YW5za2l5IDogMSA6IDgzNS41OTk5OAorVm9yb25lanNrYe9hIG9ibGFzdDtCdXR1cmxpbm92c2tpeSA6IDEgOiAyMDAxLjAKK0JlbGdvcm9kc2th72Egb2JsYXN0O0tvcm9jaGFuc2tpeSA6IDEgOiAxNDUwLjIKK0JlbGdvcm9kc2th72Egb2JsYXN0O0tyYXNub3lhcnV6c2hza3kgOiAxIDogNjI2LjIwMDAxCitCZWxnb3JvZHNrYe9hIG9ibGFzdDtZYWtvdmxldnNraXkgOiAxIDogMTE1Ni41CitCZWxnb3JvZHNrYe9hIG9ibGFzdDtOb3Zvb3Nrb2xza2l5IDogMSA6IDE2MTIuMQorVm9yb25lanNrYe9hIG9ibGFzdDtPc3Ryb2dvemhzayA6IDEgOiAyOS4xCitCZWxnb3JvZHNrYe9hIG9ibGFzdDtLcmFzbm9ndmFyZGV5c2tpeSA6IDEgOiAxNTYwLjEKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7Vm9yb2J5b3Zza2l5IDogMSA6IDExODUuOAorVm9yb25lanNrYe9hIG9ibGFzdDtLYW1lbnNraXkgOiAxIDogOTE0LjQwMDAyCitWb3JvbmVqc2th72Egb2JsYXN0O1BhdmxvdnNraXkgOiAxIDogMTg3OC4xCitCZWxnb3JvZHNrYe9hIG9ibGFzdDtCZWxnb3JvZHNraXkgOiAxIDogMTMyMS4xCitCZWxnb3JvZHNrYe9hIG9ibGFzdDtCb3Jpc292c2tpeSA6IDEgOiA3NDAuMjk5OTkKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7UG9kZ29yZW5za2l5IDogMSA6IDE2MzYuMAorQmVsZ29yb2Rza2HvYSBvYmxhc3Q7QWxla3NleWV2c2tpeSA6IDEgOiAxNjkwLjUKK0JlbGdvcm9kc2th72Egb2JsYXN0O1NoZWJla2luc2tpeSA6IDEgOiAxNzE1LjAKK0JlbGdvcm9kc2th72Egb2JsYXN0O0dyYWl2b3JvbnNraXkgOiAxIDogNjkxLjU5OTk4CitWb3JvbmVqc2th72Egb2JsYXN0O0thbGFjaGV5ZXZza2l5IDogMSA6IDIxNDkuMworQmVsZ29yb2Rza2HvYSBvYmxhc3Q7QWxla3NlZXZrYSA6IDEgOiAxLjYKK0JlbGdvcm9kc2th72Egb2JsYXN0O0JlbGdvcm9kIDogMSA6IDEyNi4zCitCZWxnb3JvZHNrYe9hIG9ibGFzdDtWb2xva29ub3Zza2l5IDogMSA6IDExODIuNgorVm9yb25lanNrYe9hIG9ibGFzdDtPbGtob3ZhdHNraXkgOiAxIDogNzM2Ljc5OTk5CitWb3JvbmVqc2th72Egb2JsYXN0O1ZlcmtobmVtYW1vbnNraXkgOiAxIDogMTI4MC4wCitCZWxnb3JvZHNrYe9hIG9ibGFzdDtTaGViZWtpbm8gOiAxIDogMS4wCitCZWxnb3JvZHNrYe9hIG9ibGFzdDtWYWx1eXNraXkgOiAxIDogMTYwMy4xCitWb3JvbmVqc2th72Egb2JsYXN0O1Jvc3Nvc2hhbnNraXkgOiAxIDogMjIyNS42MDAxCitCZWxnb3JvZHNrYe9hIG9ibGFzdDtWZXlkZWxldnNraXkgOiAxIDogMTA3Ny40CitWb3JvbmVqc2th72Egb2JsYXN0O1BldHJvcGF2bG92c2tpeSA6IDEgOiAxNTUzLjMKK0JlbGdvcm9kc2th72Egb2JsYXN0O1JvdmVuc2tpeSA6IDEgOiAxMjE5LjMKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7Um9zc29zaCA6IDEgOiAyNS41CitCZWxnb3JvZHNrYe9hIG9ibGFzdDtWYWx1aWt5IDogMSA6IDEuMAorVm9yb25lanNrYe9hIG9ibGFzdDtCb2d1Y2hhcnNraXkgOiAxIDogMjAwNC43CitWb3JvbmVqc2th72Egb2JsYXN0O0thbnRlbWlyb3Zza2l5IDogMSA6IDIzNDMuOAorUlUtVU5LLTI4MzIgOiAxIDogOS41CitSVS1VTkstMjgzMyA6IDEgOiAxLjAKK1JVLVVOSy0yODM0IDogMSA6IDEyOTguNworWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtBbmFiYXJza2l5IDogMSA6IDUzNzI3LjM5OAorWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtCdWx1bnNraXkgOiAxIDogMTc2OTgyLjQxCitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO1VzdC1ZYW5za2l5IDogMSA6IDExODY2Ny43CitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO0FsbGFpa2hvdnNraXkgOiAxIDogMTAxOTYyLjAKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7T2xlbmVrc2tpeSA6IDEgOiAzMTc1NDIuNjkKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7Tml6aG5la29seW1za2l5IDogMSA6IDg0NDIzLjUKK1RjaG91a290c2tpIG5hdC4gb2tyb3VnO0NoYXVuc2tpeSA6IDEgOiA1NTkyMi42MDIKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7VmVya2hveWFuc2tpeSA6IDEgOiAxMTk0NzQuMQorVGNob3Vrb3Rza2kgbmF0LiBva3JvdWc7U2htaWR0b3Zza2l5IDogMSA6IDY0NDY5LjEwMgorWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtTcmVkbmVrb2x5bXNraXkgOiAxIDogMTE5NjAwLjEKK1RjaG91a290c2tpIG5hdC4gb2tyb3VnO0JpbGliaW5za2l5IDogMSA6IDE3MzA5MC43CitSVS1VTkstMjgzNSA6IDEgOiA4MjI1NS44OTgKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7QWJ5aXNraXkgOiAxIDogNjczMjAuNjAyCitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO1poaWdhbnNraXkgOiAxIDogMTQ1MTM5LjkxCitUY2hvdWtvdHNraSBuYXQuIG9rcm91ZztJdWx0aW5za2l5IDogMSA6IDcyNTY3LjIwMworVGNob3Vrb3Rza2kgbmF0LiBva3JvdWc7QW5hZHlyc2tpeSA6IDEgOiAyNDYxNTQuMDkKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7TW9tc2tpeSA6IDEgOiAxMDkzNjcuNgorWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtWZXJraGVrb2x5bXNraXkgOiAxIDogNzEzNjIuNjAyCitUY2hvdWtvdHNraSBuYXQuIG9rcm91ZztDaHVrb3Rza2l5IDogMSA6IDMxNzU1LjkKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7VmlseXV5c2tpeSA6IDEgOiA1NTI1Ni44MDEKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7TWlybmluc2tpeSA6IDEgOiAxNjgyNTUuNQorVGNob3Vrb3Rza2kgbmF0LiBva3JvdWc7UHJvdmlkZW5za2l5IDogMSA6IDI1OTUzLjQKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7VmVya2huZXZpbHl1aXNraXkgOiAxIDogNDEzMDAuODk4CitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO0tvYnlheXNraXkgOiAxIDogMTAzNTY4LjMKK01hZ2FkYW5za2HvYSBvYmxhc3QgculzaWQ7U3JlZG5la2Fuc2tpeSA6IDEgOiA5MDY1MS4xMDIKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7VG9tcG9uc2tpeSA6IDEgOiAxMzA0NjUuNQorWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtMZW5pbnNraXkgOiAxIDogNTE0NjMuMzAxCitNYWdhZGFuc2th72Egb2JsYXN0IHLpc2lkO1NldmVyby1FdmVuc2tpeSA6IDEgOiAxMDA1NzUuMQorWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtPeW15YWtvbnNraXkgOiAxIDogODg5MDcuNzk3CitNYWdhZGFuc2th72Egb2JsYXN0IHLpc2lkO09tc3VrY2hhbnNraXkgOiAxIDogNjEwNjYuODAxCitLb3JpYWtza2kgbmF0aW9uYWwgb2tyb3VnO1BlbnpoaW5za2l5IDogMSA6IDExNDQ5MC44CitUY2hvdWtvdHNraSBuYXQuIG9rcm91ZztBbmFkeXInIDogMSA6IDEzLjkKK01hZ2FkYW5za2HvYSBvYmxhc3QgculzaWQ7U3VzdW1hbnNraXkgOiAxIDogNDc5OTIuODk4CitUY2hvdWtvdHNraSBuYXQuIG9rcm91ZztCZXJpbmdvdnNraXkgOiAxIDogMzk2MjMuNjk5CitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO1N1bnRhcnNraXkgOiAxIDogNTY3MDUuNQorWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtVc3QtQWxkYW5za2l5IDogMSA6IDE4Mjk5LjYKK01hZ2FkYW5za2HvYSBvYmxhc3QgculzaWQ7WWFnb2RuaW5za2l5IDogMSA6IDI5MDMyLjAKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7TmFtc2tpeSA6IDEgOiAxMTY2Mi41CitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO1RhdHRpbnNraXkgOiAxIDogMTk5MTIuNAorWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtHb3JueWkgOiAxIDogNDQ1ODQuMTAyCitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO1VzdC1NYXlza2l5IDogMSA6IDkyNzczLjg5OAorS29yaWFrc2tpIG5hdGlvbmFsIG9rcm91ZztPbHl1dG9yc2tpeSA6IDEgOiA3Mjc2NC4yMDMKK0toYWJhcm92c2tpIGtyYe8gculzaWR1ZWw7T2tob3Rza2l5IDogMSA6IDE1Njk2Ni4wOQorTWFnYWRhbnNrYe9hIG9ibGFzdCBy6XNpZDtUZW5raW5za2l5IDogMSA6IDM1NzgyLjgwMQorWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtNaXJueSA6IDEgOiAxMy4zCitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO0NodXJhcGNoaW5za2l5IDogMSA6IDEwNjU4LjUKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7TWVnaW5vLUthbmdhbGFzc2tpeSA6IDEgOiAxMTQ1OC40CitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO1lha3V0c2sgOiAxIDogMjg4Ny44CitNYWdhZGFuc2th72Egb2JsYXN0IHLpc2lkO0toYXN5bnNraXkgOiAxIDogMTkxOTAuMzAxCitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO09yZHpob25pa2lkemV2c2tpeSA6IDEgOiAyNDYyNC4xOTkKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7T2xla21pbnNraXkgOiAxIDogMTYxODA2LjA5CitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO0xlbnNraXkgOiAxIDogNzQzNTIuNQorWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtBbWdpbnNraXkgOiAxIDogMjcyMTQuMQorTWFnYWRhbnNrYe9hIG9ibGFzdCBy6XNpZDtPbHNraXkgOiAxIDogNDIzMzYuODAxCitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO0FsZGFuc2tpeSA6IDEgOiAxNTI0NTguOAorS29yaWFrc2tpIG5hdGlvbmFsIG9rcm91ZztLYXJhZ2luc2tpeSA6IDEgOiAzODA5NS42MDIKK0tvcmlha3NraSBuYXRpb25hbCBva3JvdWc7VGlnaWxza2l5IDogMSA6IDYyMzI2LjEwMgorTWFnYWRhbnNrYe9hIG9ibGFzdCBy6XNpZDtNYWdhZGFuIDogMSA6IDExOTcuMgorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtBeWFuby1NYXlza2l5IDogMSA6IDE2NTY4MC43CitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO05lcml1bmdyaSA6IDEgOiA5MzgxNy4wCitLYW10Y2hhdHNrYe9hIG9ibGFzdCBy6XNpO1VzdC1LYW1jaGF0c2tpeSA6IDEgOiA0MTcyNS42MDIKK0Ftb3Vyc2th72Egb2JsYXN0O1R5bmRpbnNraXkgOiAxIDogNzIwMjUuMTAyCitLYW10Y2hhdHNrYe9hIG9ibGFzdCBy6XNpO0J5c3RyaW5za2l5IDogMSA6IDIzMzkwLjQKK0thbXRjaGF0c2th72Egb2JsYXN0IHLpc2k7TWlsa292c2tpeSA6IDEgOiAyMTUxMi4xCitLYW10Y2hhdHNrYe9hIG9ibGFzdCBy6XNpO1NvYm9sZXZza2l5IDogMSA6IDIwNjE4LjUKK0toYWJhcm92c2tpIGtyYe8gculzaWR1ZWw7VHVndXJvLUNodW1pa2Fuc2tpeSA6IDEgOiA5MDk1OS4yOTcKK0Ftb3Vyc2th72Egb2JsYXN0O1pleXNraXkgOiAxIDogOTkyNTIuMTAyCitLYW10Y2hhdHNrYe9hIG9ibGFzdCBy6XNpO0FsZXV0c2tpeSA6IDEgOiAxMjU1LjcKK0Ftb3Vyc2th72Egb2JsYXN0O1R5bmRhIDogMSA6IDEyLjgKK0thbXRjaGF0c2th72Egb2JsYXN0IHLpc2k7WWVsaXpvdnNraXkgOiAxIDogNDEzNTYuMTk5CitBbW91cnNrYe9hIG9ibGFzdDtTa292b3JvZGluc2tpeSA6IDEgOiAxODQzOS42CitTYWtoYWxpbnNrYe9hIG9ibGFzdDtPa2hpbnNraXkgOiAxIDogMTQxOTYuMworS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtOaWtvbGF5ZXZza2l5IDogMSA6IDE1MjY3LjMKK0Ftb3Vyc2th72Egb2JsYXN0O01hZ2RhZ2FjaGluc2tpeSA6IDEgOiAxNjMzMi4yCitBbW91cnNrYe9hIG9ibGFzdDtTZWxlbWR6aGluc2tpeSA6IDEgOiA0Njc0OS4xMDIKK0Ftb3Vyc2th72Egb2JsYXN0O1pleWEgOiAxIDogMTAuMQorS2FtdGNoYXRza2HvYSBvYmxhc3QgculzaTtVc3QtQm9sc2hlcmV0c2tpeSA6IDEgOiAyMDg5Ni4xCitLaGFiYXJvdnNraSBrcmHvIHLpc2lkdWVsO1BvbGlueSBPc2lwZW5rby4gaW1lbmkgOiAxIDogMzk0NzYuMAorU2FraGFsaW5za2HvYSBvYmxhc3Q7T2toYSA6IDEgOiAyLjMKK0Ftb3Vyc2th72Egb2JsYXN0O01hemFub3Zza2l5IDogMSA6IDI4OTM4LjEKK0toYWJhcm92c2tpIGtyYe8gculzaWR1ZWw7VWxjaHNraXkgOiAxIDogMzU1MzQuMTk5CitLYW10Y2hhdHNrYe9hIG9ibGFzdCBy6XNpO0VsaXpvdm8gOiAxIDogMjEuNgorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtOaWtvbGF5ZXZzay1OYS1BbXVyZSA6IDEgOiAxNy42CitLYW10Y2hhdHNrYe9hIG9ibGFzdCBy6XNpO1BldHJvcGF2bG92c2stS2FtY2hhdHNrIDogMSA6IDUwLjkwMDAwMgorQW1vdXJza2HvYSBvYmxhc3Q7U2hpbWFub3Zza2l5IDogMSA6IDE0ODY5LjkKK1Nha2hhbGluc2th72Egb2JsYXN0O05vZ2xpa3NraXkgOiAxIDogMTAxNjAuMQorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtWZXJraG5lYnVyZWluc2tpeSA6IDEgOiA2NDE0OS4zOTgKK0toYWJhcm92c2tpIGtyYe8gculzaWR1ZWw7U29sbmVjaG55aSA6IDEgOiAzMDgxNi45CitBbW91cnNrYe9hIG9ibGFzdDtTaGltYW5vdnNrIDogMSA6IDcuMTk5OTk5OAorU2FraGFsaW5za2HvYSBvYmxhc3Q7QWxleGFuZHJvdnNrLVNha2hhbGluc2tpeSA6IDEgOiA1NzQ3LjYwMDEKK0Ftb3Vyc2th72Egb2JsYXN0O1N2b2JvZG5lbnNraXkgOiAxIDogNzk4NS4xMDAxCitTYWtoYWxpbnNrYe9hIG9ibGFzdDtUeW1vdnNraXkgOiAxIDogNjc4OC42MDAxCitLaGFiYXJvdnNraSBrcmHvIHLpc2lkdWVsO0tvbXNvbW9sc2tpeSA6IDEgOiAyNTE3Mi41CitBbW91cnNrYe9hIG9ibGFzdDtTZXJ5c2hldnNraXkgOiAxIDogMzU0MC4wCitBbW91cnNrYe9hIG9ibGFzdDtSb21uZW5za2l5IDogMSA6IDEwMTU3LjQKK0Ftb3Vyc2th72Egb2JsYXN0O1N2b2JvZG55aSA6IDEgOiAxMi4zCitBbW91cnNrYe9hIG9ibGFzdDtCbGFnb3Zlc2NoZW5za2l5IDogMSA6IDMyNDAuNjAwMQorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtWYW5pbnNraXkgOiAxIDogMjYzODcuMzAxCitBbW91cnNrYe9hIG9ibGFzdDtCZWxvZ29yc2tpeSA6IDEgOiAyODk1LjIKK0Ftb3Vyc2th72Egb2JsYXN0O0JlbG9nb3JzayA6IDEgOiAxMC45CitTYWtoYWxpbnNrYe9hIG9ibGFzdDtTZXZlcm8tS3VyaWxza2l5IDogMSA6IDM5NC44OTk5OQorU2FraGFsaW5za2HvYSBvYmxhc3Q7QWxla3MuLVNha2hhbGluc2tpeSA6IDEgOiA0LjE5OTk5OTgKK0Ftb3Vyc2th72Egb2JsYXN0O0l2YW5vdnNraXkgOiAxIDogMjg4My44CitBbW91cnNrYe9hIG9ibGFzdDtCdXJleXNraXkgOiAxIDogNzI4My44OTk5CitLaGFiYXJvdnNraSBrcmHvIHLpc2lkdWVsO0tvbXNvbW9sc2stTmEtQW11cmUgOiAxIDogNDUuOTAwMDAyCitBbW91cnNrYe9hIG9ibGFzdDtPa3R5YWJyc2tpeSA6IDEgOiAzMzU0LjM5OTkKK0Ftb3Vyc2th72Egb2JsYXN0O1phdml0aW5za2l5IDogMSA6IDI3MTcuNjAwMQorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtLaGFiYXJvdnNraXkgOiAxIDogMjMwNDYuNgorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtBbXVyc2tpeSA6IDEgOiAxNjUzMC42OTkKK1Nha2hhbGluc2th72Egb2JsYXN0O1NtaXJueWtob3Zza2l5IDogMSA6IDgxNjEuNjAwMQorQW1vdXJza2HvYSBvYmxhc3Q7QmxhZ292ZXNjaGVuc2sgOiAxIDogMjkuNAorQW1vdXJza2HvYSBvYmxhc3Q7VGFtYm92c2tpeSA6IDEgOiAyNDExLjEwMDEKK0toYWJhcm92c2tpIGtyYe8gculzaWR1ZWw7QW11cnNrIDogMSA6IDEzLjQKK0Ftb3Vyc2th72Egb2JsYXN0O0Fya2hhcmluc2tpeSA6IDEgOiAxNDE2NC4wCitBbW91cnNrYe9hIG9ibGFzdDtNaWtoYXlsb3Zza2l5IDogMSA6IDI4NzYuMAorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtOYW5heXNraXkgOiAxIDogMjcyMjEuMQorQW1vdXJza2HvYSBvYmxhc3Q7S29uc3RhbnRpbm92c2tpeSA6IDEgOiAyMTkwLjcKK1Nha2hhbGluc2th72Egb2JsYXN0O1Bvcm9uYXlza2l5IDogMSA6IDY4MzYuNzAwMgorQW1vdXJza2HvYSBvYmxhc3Q7UmF5Y2hpa2hpbnNrIDogMSA6IDM4Mi43MDAwMQorU2FraGFsaW5za2HvYSBvYmxhc3Q7VWdsZWdvcnNraXkgOiAxIDogNDgwNy42MDAxCitFdnJl73NrYe9hIG9ibGFzdDtPYmx1Y2hlbnNraXkgOiAxIDogMTI4OTguNgorU2FraGFsaW5za2HvYSBvYmxhc3Q7UG9yb25heXNrIDogMSA6IDMuNTk5OTk5OQorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtTb3ZldHNrby1HYXZhbnNraXkgOiAxIDogMTUyMjEuNQorU2FraGFsaW5za2HvYSBvYmxhc3Q7TWFrYXJvdnNraXkgOiAxIDogMTY2MC4zCitTYWtoYWxpbnNrYe9hIG9ibGFzdDtVZ2xlZ29yc2sgOiAxIDogMi45MDAwMDAxCitFdnJl73NrYe9hIG9ibGFzdDtCaXJvYmlkemhhbnNraXkgOiAxIDogNDIzNC4yOTk4CitLaGFiYXJvdnNraSBrcmHvIHLpc2lkdWVsO1NvdmV0c2theWEgR2F2YW4gOiAxIDogMTMuNQorRXZyZe9za2HvYSBvYmxhc3Q7U21pZG92aWNoc2tpeSA6IDEgOiA2NjE0LjI5OTgKK0toYWJhcm92c2tpIGtyYe8gculzaWR1ZWw7TGF6by4gaW1lbmkgOiAxIDogMzIwMzcuNAorRXZyZe9za2HvYSBvYmxhc3Q7Qmlyb2JpZHpoYW4gOiAxIDogMTguNgorU2FraGFsaW5za2HvYSBvYmxhc3Q7VG9tYXJpbnNraXkgOiAxIDogMzg0NC4zOTk5CitFdnJl73NrYe9hIG9ibGFzdDtPa3R5YWJyc2tpeSA6IDEgOiA2NzAzLjAKK0toYWJhcm92c2tpIGtyYe8gculzaWR1ZWw7S2hhYmFyb3ZzayA6IDEgOiA3MS41OTk5OTgKK0V2cmXvc2th72Egb2JsYXN0O0xlbmluc2tpeSA6IDEgOiA2MDA5Ljg5OTkKK1ByaW1vcnNraSBrcmHvO1Rlcm5leXNraXkgOiAxIDogMjQ2MjMuMTk5CitTYWtoYWxpbnNrYe9hIG9ibGFzdDtEb2xpbnNraXkgOiAxIDogMjA0OS44CitLaGFiYXJvdnNraSBrcmHvIHLpc2lkdWVsO1Z5YXplbXNraXkgOiAxIDogNDM4MC4xMDAxCitTYWtoYWxpbnNrYe9hIG9ibGFzdDtLaG9sbXNraXkgOiAxIDogMjU5NC42MDAxCitTYWtoYWxpbnNrYe9hIG9ibGFzdDtEb2xpbnNrIDogMSA6IDExLjYKK1ByaW1vcnNraSBrcmHvO1BvemhhcnNraXkgOiAxIDogMjQwNzUuNjk5CitLaGFiYXJvdnNraSBrcmHvIHLpc2lkdWVsO0Jpa2luc2tpeSA6IDEgOiAyNDk1LjYwMDEKK1Nha2hhbGluc2th72Egb2JsYXN0O1l1emhuby1TYWtoYWxpbnNrIDogMSA6IDYyMy43MDAwMQorU2FraGFsaW5za2HvYSBvYmxhc3Q7S3VyaWxza2l5IDogMSA6IDM1My42MDAwMQorU2FraGFsaW5za2HvYSBvYmxhc3Q7S29yc2Frb3Zza2l5IDogMSA6IDI0NzMuMzk5OQorU2FraGFsaW5za2HvYSBvYmxhc3Q7QW5pdnNraXkgOiAxIDogMjYwOS4xMDAxCitTYWtoYWxpbnNrYe9hIG9ibGFzdDtLaG9sbXNrIDogMSA6IDQuMTk5OTk5OAorU2FraGFsaW5za2HvYSBvYmxhc3Q7TmV2ZWxza2l5IDogMSA6IDE4MjQuOQorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtCaWtpbiA6IDEgOiA4LjAKK1Nha2hhbGluc2th72Egb2JsYXN0O05ldmVsJ3NrIDogMSA6IDQuMAorU2FraGFsaW5za2HvYSBvYmxhc3Q7S29yc2Frb3YgOiAxIDogNS40MDAwMDAxCitQcmltb3Jza2kga3Jh7ztLcmFzbm9hcm1leXNraXkgOiAxIDogMjEyMjYuOQorUHJpbW9yc2tpIGtyYe87RGFsbmVyZWNoZW5za2l5IDogMSA6IDc0MTMuNjAwMQorUHJpbW9yc2tpIGtyYe87RGFsbmVyZWNoZW5zayA6IDEgOiAxNDAuMzk5OTkKK1ByaW1vcnNraSBrcmHvO0xlc296YXZvZHNraXkgOiAxIDogMzQ4My4zCitQcmltb3Jza2kga3Jh7ztMZXNvemF2b2RzayA6IDEgOiAxLjMKK1ByaW1vcnNraSBrcmHvO0toYW5rYXlza2l5IDogMSA6IDI5MDcuMzk5OQorUHJpbW9yc2tpIGtyYe87S2lyb3Zza2l5IDogMSA6IDM3MjIuNjAwMQorUHJpbW9yc2tpIGtyYe87RGFsbmVnb3Jza2l5IDogMSA6IDQ5NzAuODk5OQorUHJpbW9yc2tpIGtyYe87U3Bhc3NraXkgOiAxIDogNDMyNi4zOTk5CitQcmltb3Jza2kga3Jh7ztDaHVndXlldnNraXkgOiAxIDogMTI4MTEuMgorUHJpbW9yc2tpIGtyYe87UG9ncmFuaWNobnlpIDogMSA6IDQxMTQuNzk5OAorUHJpbW9yc2tpIGtyYe87WWFrb3ZsZXZza2l5IDogMSA6IDIzNjguMzk5OQorUHJpbW9yc2tpIGtyYe87S2F2YWxlcm92c2tpeSA6IDEgOiA0MDg0LjEwMDEKK1ByaW1vcnNraSBrcmHvO0tob3JvbHNraXkgOiAxIDogMjExNy4xMDAxCitQcmltb3Jza2kga3Jh7ztEYWxuZWdvcnNrIDogMSA6IDguMzk5OTk5NgorUHJpbW9yc2tpIGtyYe87U3Bhc3NrLURhbG5peSA6IDEgOiAxLjgKK1ByaW1vcnNraSBrcmHvO0NoZXJuaWdvdnNraXkgOiAxIDogMTk3MS45CitTYWtoYWxpbnNrYe9hIG9ibGFzdDtZdXpobm8tS3VyaWxza2l5IDogMSA6IDE1MjMuOQorUHJpbW9yc2tpIGtyYe87QW51Y2hpbnNraXkgOiAxIDogMzcwMC4xMDAxCitQcmltb3Jza2kga3Jh7ztNaWtoYXlsb3Zza2l5IDogMSA6IDI4MDIuNjAwMQorUHJpbW9yc2tpIGtyYe87T2t0eWFicnNraXkgOiAxIDogMTg0NC43CitQcmltb3Jza2kga3Jh7ztBcnNlbnlldiA6IDEgOiAxMjQuNworUHJpbW9yc2tpIGtyYe87T2xnaW5za3kgOiAxIDogNTY5OC43OTk4CitQcmltb3Jza2kga3Jh7ztVc3N1cml5c2tpeSA6IDEgOiAzNzc3LjUKK1JVLVVOSy0yODM2IDogMSA6IDMuMDk5OTk5OQorUHJpbW9yc2tpIGtyYe87UGFydGl6YW5za2l5IDogMSA6IDQxOTEuNQorUHJpbW9yc2tpIGtyYe87U2hrb3RvdnNraXkgOiAxIDogMzMzNy4zOTk5CitQcmltb3Jza2kga3Jh7ztOYWRlemhkaW5za2l5IDogMSA6IDE2MjYuNQorUHJpbW9yc2tpIGtyYe87TGF6b3Zza2l5IDogMSA6IDQyNTYuNzk5OAorUHJpbW9yc2tpIGtyYe87QXJ0eW9tIDogMSA6IDQzOS4zOTk5OQorUHJpbW9yc2tpIGtyYe87UGFydGl6YW5zayA6IDEgOiAxMjU0LjcKK1ByaW1vcnNraSBrcmHvO0toYXNhbnNraXkgOiAxIDogNDEzMC43OTk4CitQcmltb3Jza2kga3Jh7ztWbGFkaXZvc3RvayA6IDEgOiAyODUuMTAwMDEKK1ByaW1vcnNraSBrcmHvO0JvbHNob3kgS2FtZW4gOiAxIDogMS4wCitQcmltb3Jza2kga3Jh7ztOYWtob2RrYSA6IDEgOiAxMTIuMgorUlUtVU5LLTI4MzcgOiAxIDogODIyNTUuODk4CitSVS1VTkstMjgzOCA6IDEgOiAzLjA5OTk5OTkKK0tpcm92c2th72Egb2JsYXN0O0x1enNraXkgOiAxIDogNDU5My42MDAxCitLaXJvdnNrYe9hIG9ibGFzdDtQb2Rvc2lub3Zza2l5IDogMSA6IDQxNzguMjk5OAorS2lyb3Zza2HvYSBvYmxhc3Q7VmVya2huZWthbXNraXkgOiAxIDogMTA4OTIuNgorS2lyb3Zza2HvYSBvYmxhc3Q7T3Bhcmluc2tpeSA6IDEgOiA2MDc0LjcwMDIKK0tpcm92c2th72Egb2JsYXN0O05hZ29yc2tpeSA6IDEgOiA3Njc2LjcwMDIKK0tpcm92c2th72Egb2JsYXN0O011cmFzaGluc2tpeSA6IDEgOiAzMTA3LjAKK0tpcm92c2th72Egb2JsYXN0O0JlbG9raG9sdW5pdHNraXkgOiAxIDogNTA4NS42MDAxCitLaXJvdnNrYe9hIG9ibGFzdDtBZmFuYXN5ZXZza2l5IDogMSA6IDU2NTAuNQorS2lyb3Zza2HvYSBvYmxhc3Q7RGFyb3Zza2l5IDogMSA6IDQxOTQuNzAwMgorS2lyb3Zza2HvYSBvYmxhc3Q7U2xvYm9kc2tveSA6IDEgOiAzMzY1Ljg5OTkKK0tpcm92c2th72Egb2JsYXN0O1l1cnlhbnNraXkgOiAxIDogMzIwNi4yCitLaXJvdnNrYe9hIG9ibGFzdDtPbXV0bmluc2tpeSA6IDEgOiA1MTAwLjEwMDEKK0tpcm92c2th72Egb2JsYXN0O0toYWx0dXJpbnNraXkgOiAxIDogMTgwMy4wCitLaXJvdnNrYe9hIG9ibGFzdDtTaGFiYWxpbnNraXkgOiAxIDogMzM4MS42MDAxCitLaXJvdnNrYe9hIG9ibGFzdDtLb3RlbG5pY2hza2l5IDogMSA6IDM5ODEuNQorS2lyb3Zza2HvYSBvYmxhc3Q7S2lyb3YgOiAxIDogMzI3Ljc5OTk5CitLaXJvdnNrYe9hIG9ibGFzdDtLaXJvdm8tQ2hlcGV0c2tpeSA6IDEgOiAyNDAyLjM5OTkKK0tpcm92c2th72Egb2JsYXN0O1p1eWV2c2tpeSA6IDEgOiAyNzAyLjgKK0tpcm92c2th72Egb2JsYXN0O1N2ZWNoaW5za2l5IDogMSA6IDE2MTkuNQorS2lyb3Zza2HvYSBvYmxhc3Q7RmFsZW5za2l5IDogMSA6IDI2MDIuODk5OQorS2lyb3Zza2HvYSBvYmxhc3Q7T3JpY2hldnNraXkgOiAxIDogMjU1Ny44CitLaXJvdnNrYe9hIG9ibGFzdDtLaXJvdm8tQ2hlcGV0cyA6IDEgOiAzLjA5OTk5OTkKK0tpcm92c2th72Egb2JsYXN0O0t1bWVuc2tpeSA6IDEgOiAxODY3LjIKK0tpcm92c2th72Egb2JsYXN0O0tvdGVsbmljaCcgOiAxIDogMi41OTk5OTk5CitLaXJvdnNrYe9hIG9ibGFzdDtWZXJraG9zaGl6aGVtc2tpeSA6IDEgOiAyMDQzLjYKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287VmV0bHV6aHNraXkgOiAxIDogMjg1OC4wCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO1NoYWtodW5za2l5IDogMSA6IDIzNjkuMzk5OQorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztUb25zaGF5ZXZza2l5IDogMSA6IDI2NTYuNworS2lyb3Zza2HvYSBvYmxhc3Q7Qm9nb3JvZHNraXkgOiAxIDogMTU3Mi4zCitLaXJvdnNrYe9hIG9ibGFzdDtBcmJhemhza2l5IDogMSA6IDE0NjEuMworS2lyb3Zza2HvYSBvYmxhc3Q7U3Vuc2tpeSA6IDEgOiAxMjAyLjcKK0tpcm92c2th72Egb2JsYXN0O05vbGluc2tpeSA6IDEgOiAxOTUwLjAKK0tpcm92c2th72Egb2JsYXN0O1R1emhpbnNraXkgOiAxIDogMTM3OS44CitLaXJvdnNrYe9hIG9ibGFzdDtVbmluc2tpeSA6IDEgOiAyMDc0LjIKK0tpcm92c2th72Egb2JsYXN0O1NvdmV0c2tpeSA6IDEgOiAyMzc1LjAKK0tpcm92c2th72Egb2JsYXN0O05lbXNraXkgOiAxIDogMjA0My4zCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO1Zhcm5hdmluc2tpeSA6IDEgOiAyNTQxLjM5OTkKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287VXJlbnNraXkgOiAxIDogMTcxNS4xCitLaXJvdnNrYe9hIG9ibGFzdDtQaXpoYW5za2l5IDogMSA6IDExODguNQorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztUb25raW5za2l5IDogMSA6IDExNTcuMQorS2lyb3Zza2HvYSBvYmxhc3Q7S2lrbnVyc2tpeSA6IDEgOiAxNjI4LjYKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287S292ZXJuaW5za2l5IDogMSA6IDI3MjYuMTAwMQorS2lyb3Zza2HvYSBvYmxhc3Q7TGVieWF6aHNraXkgOiAxIDogMTM1My4xCitLaXJvdnNrYe9hIG9ibGFzdDtLaWxtZXpza2l5IDogMSA6IDI5NjAuMAorS2lyb3Zza2HvYSBvYmxhc3Q7WWFyYW5za2l5IDogMSA6IDIxOTEuNworS2lyb3Zza2HvYSBvYmxhc3Q7VXJ6aHVtc2tpeSA6IDEgOiAzMDk2Ljg5OTkKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287U2VteW9ub3Zza2l5IDogMSA6IDM1MDIuMzk5OQorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztTaGFyYW5nc2tpeSA6IDEgOiAyMDMxLjUKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287S3Jhc25vYmFrb3Zza2l5IDogMSA6IDE4ODMuMworTWFyaXlza2HvYSByZXNwb3VibGlrYTtTZXJudXJza2l5IDogMSA6IDkxMi41CitLaXJvdnNrYe9hIG9ibGFzdDtTYW5jaHVyc2tpeSA6IDEgOiAxNDY1LjYKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287Vm9za3Jlc2Vuc2tpeSA6IDEgOiAzMzA1LjIKK01hcml5c2th72EgcmVzcG91Ymxpa2E7Tm92b3RhcnlhbHNraXkgOiAxIDogOTUyLjU5OTk4CitNYXJpeXNrYe9hIHJlc3BvdWJsaWthO09yc2hhbnNraXkgOiAxIDogOTQwLjIwMDAxCitNYXJpeXNrYe9hIHJlc3BvdWJsaWthO01hcmktVHVyZWtza2l5IDogMSA6IDEzOTQuMworTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztHb3JvZGV0c2tpeSA6IDEgOiAxMzMyLjYKK01hcml5c2th72EgcmVzcG91Ymxpa2E7S2lsZW1hcnNraXkgOiAxIDogMzUzOC4zCitNYXJpeXNrYe9hIHJlc3BvdWJsaWthO1NvdmV0c2tpeSA6IDEgOiAxNDM3LjEKK01hcml5c2th72EgcmVzcG91Ymxpa2E7UGFyYW5naW5za2l5IDogMSA6IDY4NC45MDAwMgorTWFyaXlza2HvYSByZXNwb3VibGlrYTtNZWR2ZWRldnNraXkgOiAxIDogMjc0MS42MDAxCitNYXJpeXNrYe9hIHJlc3BvdWJsaWthO0t1emhlbmVyc2tpeSA6IDEgOiA3OTkuNzk5OTkKK01hcml5c2th72EgcmVzcG91Ymxpa2E7WXVyaW5za2l5IDogMSA6IDE3OTguMworTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztCb3Jza2l5IDogMSA6IDI4NzMuMworTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztDaGthbG92c2tpeSA6IDEgOiA4NzAuNTk5OTgKK0tpcm92c2th72Egb2JsYXN0O01hbG15emhza2l5IDogMSA6IDIwNzEuNQorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztHb3JvZGV0eiA6IDEgOiAxLjAKK01hcml5c2th72EgcmVzcG91Ymxpa2E7TW9ya2luc2tpeSA6IDEgOiAyMzc2LjIKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287QmFsYWtobmluc2tpeSA6IDEgOiAxMDQ5LjEKK01hcml5c2th72EgcmVzcG91Ymxpa2E7WW9zaGthci1PbGEgOiAxIDogMjAuNAorTWFyaXlza2HvYSByZXNwb3VibGlrYTtHb3Jub21hcml5c2tpeSA6IDEgOiA1NDUuMAorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztCYWxha2huYSA6IDEgOiAyLjMKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287THlza292c2tpeSA6IDEgOiA4NzYuNQorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztWb3JvdHluc2tpeSA6IDEgOiA4NjkuMjk5OTkKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287Vm9sb2RhcnNraXkgOiAxIDogMTcxOS41CitNYXJpeXNrYe9hIHJlc3BvdWJsaWthO1p2ZW5pZ292c2tpeSA6IDEgOiAyNzM5LjAKK0tpcm92c2th72Egb2JsYXN0O1Z5YXRza28tUG9seWFuc2tpeSA6IDEgOiA4ODguNDAwMDIKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287Tml6aG5peSBOb3Znb3JvZCA6IDEgOiAzNDMuNzk5OTkKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287Qm9yIDogMSA6IDEuMAorVGNob3V2YWNoc2th72EgcmVzcG91YmxpaztDaGVib2tzYXJza2l5IDogMSA6IDM1MS4yMDAwMQorTWFyaXlza2HvYSByZXNwb3VibGlrYTtLb3ptb2RlbXlhbnNrIDogMSA6IDEuMAorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztLc3RvdnNraXkgOiAxIDogMTEzNy41CitSVS1VTkstMjgzOSA6IDEgOiAxLjcKK0tpcm92c2th72Egb2JsYXN0O1Z5YXRza3llIFBvbHlhbnkgOiAxIDogMS45CitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO0JvZ29yb2Rza2l5IDogMSA6IDEzOTcuNworTWFyaXlza2HvYSByZXNwb3VibGlrYTtWb2x6aHNraXkgOiAxIDogOTkyLjAKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287UGF2bG92c2tpeSA6IDEgOiAxMjYxLjMKK1RjaG91dmFjaHNrYe9hIHJlc3BvdWJsaWs7TW9yZ2F1c2hza2l5IDogMSA6IDY3NC40MDAwMgorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztLc3Rvdm8gOiAxIDogMS45CitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO1lhZHJpbnNraXkgOiAxIDogMTA3My42CitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO0RhbG5la29uc3RhbnRpbm92c2tpeSA6IDEgOiAxNDU5LjAKK1RjaG91dmFjaHNrYe9hIHJlc3BvdWJsaWs7Q2hlYm9rc2FyeSA6IDEgOiAzLjA5OTk5OTkKK1RjaG91dmFjaHNrYe9hIHJlc3BvdWJsaWs7TWFyaWluc2tvLSBQb3NhZHNraXkgOiAxIDogNDk0LjM5OTk5CitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO0JvZ29yb2RzayA6IDEgOiAxLjAKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287U3Bhc3NraXkgOiAxIDogNjkxLjc5OTk5CitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO05vdm9jaGVib2tzYXJzayA6IDEgOiAyLjkwMDAwMDEKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287VmFjaHNraXkgOiAxIDogMTA3Ny45CitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO1RzeXZpbHNraXkgOiAxIDogODA3LjcwMDAxCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO1Nvc25vdnNraXkgOiAxIDogMTIzOC4xCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO1Bhdmxvdm8gOiAxIDogMS4wCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO0tueWFnaW5pbnNraXkgOiAxIDogNjY3LjkwMDAyCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO0JvbHNoZW11cmFzaGtpbnNraXkgOiAxIDogNTM5LjA5OTk4CitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO0tvemxvdnNraXkgOiAxIDogNTEwLjcwMDAxCitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO0tyYXNub2FybWV5c2tpeSA6IDEgOiAzNzIuNzk5OTkKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287UGlsbmluc2tpeSA6IDEgOiAxMzg4LjEKK01hcml5c2th72EgcmVzcG91Ymxpa2E7Vm9semhzayA6IDEgOiAxLjgKK1RjaG91dmFjaHNrYe9hIHJlc3BvdWJsaWs7QWxpa292c2tpeSA6IDEgOiA2NDguNTk5OTgKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287UGVyZXZvenNraXkgOiAxIDogNjg5LjU5OTk4CitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO0tyYXNub2NoZXRheXNraXkgOiAxIDogNjcxLjQwMDAyCitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO1VybWFyc2tpeSA6IDEgOiA1NjYuNDAwMDIKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287TmF2YXNoaW5za2l5IDogMSA6IDEyMDYuNQorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztTZXJnYWNoc2tpeSA6IDEgOiAxMjIyLjAKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287QnV0dXJsaW5za2l5IDogMSA6IDExNDIuMAorVGNob3V2YWNoc2th72EgcmVzcG91YmxpaztWdXJuYXJza2l5IDogMSA6IDEwMDQuNAorVGNob3V2YWNoc2th72EgcmVzcG91YmxpaztLYW5hc2hza2l5IDogMSA6IDEwODUuMworTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztBcnphbWFzc2tpeSA6IDEgOiAxNzIxLjYKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287VmFkc2tpeSA6IDEgOiA3MjMuNzk5OTkKK1RjaG91dmFjaHNrYe9hIHJlc3BvdWJsaWs7U2h1bWVybGluc2tpeSA6IDEgOiAxMDk2LjAKK1RjaG91dmFjaHNrYe9hIHJlc3BvdWJsaWs7WWFudGlrb3Zza2l5IDogMSA6IDQ1My44OTk5OQorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztBcmRhdG92c2tpeSA6IDEgOiAxODU1LjgKK1RjaG91dmFjaHNrYe9hIHJlc3BvdWJsaWs7U2h1bWVybHlhIDogMSA6IDEuNAorVGNob3V2YWNoc2th72EgcmVzcG91YmxpaztLYW5hc2ggOiAxIDogMS4xCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO1NlY2hlbm92c2tpeSA6IDEgOiAxNjM4LjIKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287S3VsZWJha3NraXkgOiAxIDogMTEzNS4yCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO0tyYXNub29rdHlhYnJza2l5IDogMSA6IDgyNy41OTk5OAorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztBcnphbWFzIDogMSA6IDMuOTAwMDAwMQorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztWeWtzdW5za2l5IDogMSA6IDE3MjcuNAorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztHYWdpbnNraXkgOiAxIDogMTA3NS41CitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO0licmVzaW5za2l5IDogMSA6IDEyMTUuNworTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztLdWxlYmFraSA6IDEgOiAxLjkKK1RjaG91dmFjaHNrYe9hIHJlc3BvdWJsaWs7UG9yZXRza2l5IDogMSA6IDEyNjEuMworTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztTaGF0a292c2tpeSA6IDEgOiAxMjU4LjUKK1RjaG91dmFjaHNrYe9hIHJlc3BvdWJsaWs7S29tc29tb2xza2l5IDogMSA6IDYyMi4wOTk5OAorVGNob3V2YWNoc2th72EgcmVzcG91YmxpaztZYWxjaGlrc2tpeSA6IDEgOiA2MDUuMDk5OTgKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287Vnlrc2EgOiAxIDogMS4wCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO0RpdmV5ZXZza2l5IDogMSA6IDk4Ny40MDAwMgorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztCb2xzaGVib2xkaW5za2l5IDogMSA6IDEwNjEuNQorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztMdWtveWFub3Zza2l5IDogMSA6IDE3ODUuMgorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztQZXJ2b21heXNraXkgOiAxIDogMTE2Ni44CitNb3Jkb3Zza2HvYSByZXNwb3VibGlrYTtCb2xzaGVpZ25hdG92c2tpeSA6IDEgOiA3MDUuNQorVGNob3V2YWNoc2th72EgcmVzcG91YmxpaztCYXR5cmV2c2tpeSA6IDEgOiAxMDc1LjQKK1RjaG91dmFjaHNrYe9hIHJlc3BvdWJsaWs7QWxhdHlyc2tpeSA6IDEgOiAxNzAzLjYKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287Vm96bmVzZW5za2l5IDogMSA6IDg0MS43OTk5OQorTW9yZG92c2th72EgcmVzcG91Ymxpa2E7QXJkYXRvdnNraXkgOiAxIDogMTE4Mi42CitNb3Jkb3Zza2HvYSByZXNwb3VibGlrYTtUZW1uaWtvdnNraXkgOiAxIDogMjE1OC4zCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO1BvY2hpbmtvdnNraXkgOiAxIDogMjE4OS4zOTk5CitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO1NoZW11cnNoaW5za2l5IDogMSA6IDQwMS43OTk5OQorVGNob3V2YWNoc2th72EgcmVzcG91YmxpaztBbGF0eXInIDogMSA6IDEuMgorTW9yZG92c2th72EgcmVzcG91Ymxpa2E7VGVuZ3VzaGV2c2tpeSA6IDEgOiAxMjA3LjUKK01vcmRvdnNrYe9hIHJlc3BvdWJsaWthO0ljaGFsa292c2tpeSA6IDEgOiAxMTc0LjUKK01vcmRvdnNrYe9hIHJlc3BvdWJsaWthO1llbG5pa292c2tpeSA6IDEgOiAxMjEwLjYKK01vcmRvdnNrYe9hIHJlc3BvdWJsaWthO0F0eWFzaGV2c2tpeSA6IDEgOiAxMDQwLjkKK01vcmRvdnNrYe9hIHJlc3BvdWJsaWthO0NoYW16aW5za2l5IDogMSA6IDEwMDcuNgorTW9yZG92c2th72EgcmVzcG91Ymxpa2E7U3Rhcm9zaGF5Z292c2tpeSA6IDEgOiAxNjMzLjMKK01vcmRvdnNrYe9hIHJlc3BvdWJsaWthO1JvbW9kYW5vdnNraXkgOiAxIDogODQxLjc5OTk5CitNb3Jkb3Zza2HvYSByZXNwb3VibGlrYTtLcmFzbm9zbG9ib2Rza2l5IDogMSA6IDEyNDkuMQorTW9yZG92c2th72EgcmVzcG91Ymxpa2E7RHViZW5za2l5IDogMSA6IDY3MS4wOTk5OAorTW9yZG92c2th72EgcmVzcG91Ymxpa2E7THlhbWJpcnNraXkgOiAxIDogODk1LjQwMDAyCitNb3Jkb3Zza2HvYSByZXNwb3VibGlrYTtBdHl1cml5ZXZza2l5IDogMSA6IDg3OS40MDAwMgorTW9yZG92c2th72EgcmVzcG91Ymxpa2E7WnVib3ZvLVBvbHlhbnNraXkgOiAxIDogMzA5OC44CitNb3Jkb3Zza2HvYSByZXNwb3VibGlrYTtUb3JiZXlldnNraXkgOiAxIDogOTE1LjA5OTk4CitNb3Jkb3Zza2HvYSByZXNwb3VibGlrYTtCb2xzaGViZXJlem5pa292c2tpeSA6IDEgOiA2NTYuMDk5OTgKK01vcmRvdnNrYe9hIHJlc3BvdWJsaWthO0tvdnlsa2luc2tpeSA6IDEgOiAyMDE3LjMKK01vcmRvdnNrYe9hIHJlc3BvdWJsaWthO0thZG9zaGtpbnNreSA6IDEgOiA1NTEuNTk5OTgKK01vcmRvdnNrYe9hIHJlc3BvdWJsaWthO1J1emF5ZXZza2l5IDogMSA6IDExMTIuMgorTW9yZG92c2th72EgcmVzcG91Ymxpa2E7U2FyYW5zayA6IDEgOiAxODEuMzk5OTkKK01vcmRvdnNrYe9hIHJlc3BvdWJsaWthO0tvY2hrdXJvdnNraXkgOiAxIDogODI4LjI5OTk5CitNb3Jkb3Zza2HvYSByZXNwb3VibGlrYTtSdXphZXZrYSA6IDEgOiAyMS4yMDAwMDEKK01vcmRvdnNrYe9hIHJlc3BvdWJsaWthO0tvdnlsa2lubyA6IDEgOiAxNC41CitNb3Jkb3Zza2HvYSByZXNwb3VibGlrYTtJbnNhcnNraXkgOiAxIDogOTQxLjkwMDAyCitSVS1VTkstMjg0MCA6IDEgOiAxLjcKK1Rh7215cnNraSBuYXRpb25hbCBva3JvdWc7RGlrc29uc2tpeSA6IDEgOiAxNTc5ODguMDkKK1Rh7215cnNraSBuYXRpb25hbCBva3JvdWc7S2hhdGFuZ3NraXkgOiAxIDogMzg5NzE0LjMxCitUYe9teXJza2kgbmF0aW9uYWwgb2tyb3VnO0R1ZGlua2EgOiAxIDogMTU4NDAwLjkxCitUYe9teXJza2kgbmF0aW9uYWwgb2tyb3VnO1VzdC1ZZW5pc2V5c2tpeSA6IDEgOiA4ODE5NC43MDMKK0V2ZW5raXNraSBuYXRpb25hbCBva3JvdWc7QmF5a2l0c2tpeSA6IDEgOiA1MDI0MTMuNDEKK1JVLVVOSy0yODQxIDogMSA6IDExLjQKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7VHVydWtoYW5za2l5IDogMSA6IDE5MDM4Ny4wOQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtJZ2Fya2EgOiAxIDogMTYyMjEuOAorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtLYXRhbmdza2l5IDogMSA6IDEzNzQ3Ny44CitFdmVua2lza2kgbmF0aW9uYWwgb2tyb3VnO0lsaW1waXlza2l5IDogMSA6IDE0NzcyMS40MQorRXZlbmtpc2tpIG5hdGlvbmFsIG9rcm91ZztUdW5ndXNza28tQ2h1bnNraXkgOiAxIDogMTA3MDEyLjIKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7WWVuaXNleXNraXkgOiAxIDogMTA1Mzg2LjgKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7U2V2ZXJvLVllbmlzZXlza2l5IDogMSA6IDQ1Mzg5LjgwMQorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtCb2RheWJpbnNraXkgOiAxIDogOTA2MzguNzAzCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO0JvZ3VjaGFuc2tpeSA6IDEgOiA1NDUxMS42OTkKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7S2V6aGVtc2tpeSA6IDEgOiAzMjQ5MS42OTkKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7TWFtc2tvLUNodXlza2l5IDogMSA6IDQyNzMyLjg5OAorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtNb3R5Z2luc2tpeSA6IDEgOiAxODc0My4xCitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O1VzdC1JbGltc2tpeSA6IDEgOiAzNTYyNi4wCitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O0tpcmVuc2tpeSA6IDEgOiA0MjA1OS41CitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO0VuaXNleXNrIDogMSA6IDE0LjUKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7S2FsYXJza2l5IDogMSA6IDU0ODg5LjY5OQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtMZXNvc2liaXJzayA6IDEgOiA1MDEuMjk5OTkKK1JVLVVOSy0yODQyIDogMSA6IDM1MDk0LjUKK1JVLVVOSy0yODQzIDogMSA6IDM1MDk0LjUKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7Q2h1bnNraXkgOiAxIDogMjUwNjQuNgorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtVc3QnLUlsaW1zayA6IDEgOiAxNi42CitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO1Bpcm92c2tpeSA6IDEgOiA2MDI3Ljc5OTgKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7S2F6YWNoaW5za2l5IDogMSA6IDUxMjIuMTAwMQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtCaXJpbHl1c3NraXkgOiAxIDogMTEyOTYuOQorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtCb2RheWJvIDogMSA6IDYuNTk5OTk5OQorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtOaXpobmVpbGltc2tpeSA6IDEgOiAxODI3MC4zMDEKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7VHl1a2h0ZXRza2l5IDogMSA6IDk2MzkuNzk5OAorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtUYXlzaGV0c2tpeSA6IDEgOiAyNjk5OC45CitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO1Rhc2V5ZXZza2l5IDogMSA6IDkzMjguNzAwMgorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtLYXphY2hpbnNrby1MZW5za2l5IDogMSA6IDMyODQ2LjUKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7QWJhbnNraXkgOiAxIDogOTI3Ny4yMDAyCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO0JvbHNoZW11cnRpbnNraXkgOiAxIDogNjg1NS43OTk4CitSVS1VTkstMjg0NCA6IDEgOiA3NDk5NC4zOTgKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7RHplcnpoaW5za2l5IDogMSA6IDM1NjYuNQorQm91cmlhdGlhO1NldmVyby1CYXlrYWxza2l5IDogMSA6IDQ3MzUwLjYwMgorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtTdWtob2J1emltc2tpeSA6IDEgOiA1ODM0LjAKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7QnJhdHNraXkgOiAxIDogMjEzMDEuODAxCitCb3VyaWF0aWE7TXV5c2tpeSA6IDEgOiAxMzA3NS40CitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO1llbWVseWFub3Zza2l5IDogMSA6IDY3NzcuNzk5OAorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtCb2xzaGV1bHV5c2tpeSA6IDEgOiAyMTg3LjYwMDEKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7S296dWxza3kgOiAxIDogNTA2NS4yMDAyCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO05pemhuZWluZ2FzaHNraXkgOiAxIDogNjQ4NC44OTk5CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O1VzdCctS3V0IDogMSA6IDIzLjYKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7S2Fuc2tpeSA6IDEgOiA0OTE3LjEwMDEKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7QWNoaW5za2l5IDogMSA6IDI4NzMuNworS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtCb2dvdG9sc2tpeSA6IDEgOiAzMTk4LjYwMDEKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7SWxhbnNraXkgOiAxIDogMzI2OC42MDAxCitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O1VzdC1VZGluc2tpeSA6IDEgOiAxOTQyNS44MDEKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7UnliaW5za2l5IDogMSA6IDMxMjQuMzk5OQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtBY2hpbnNrIDogMSA6IDQyLjU5OTk5OAorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtCZXJ5b3pvdnNraXkgOiAxIDogNDk3NC43OTk4CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O0JyYXRzayA6IDEgOiA2OS40MDAwMDIKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7Qm9nb3RvbCA6IDEgOiAxMi45CitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO1V5YXJza2l5IDogMSA6IDI0MzYuNworS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtLYW5zayA6IDEgOiAzNi41CitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO1Nvc25vdm9ib3JzayA6IDEgOiAyMi43OTk5OTkKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7S3Jhc25veWFyc2sgOiAxIDogMjIyLjYwMDAxCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO05hemFyb3Zza2l5IDogMSA6IDQxNjkuNjAwMQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtNYW5za2l5IDogMSA6IDU2NTUuMjAwMgorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtOYXphcm92byA6IDEgOiAyNC4yMDAwMDEKK1JVLVVOSy0yODQ1IDogMSA6IDUwNjMyLjY5OQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtTaGFyeXBvdnNraXkgOiAxIDogMzc3Mi4zOTk5CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O05pemhuZXVkaW5za2l5IDogMSA6IDUwOTUzLjE5OQorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtUdW5naXJvLU9sZWttaW5za2l5IDogMSA6IDQyMDk3LjE5OQorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtUYXlzaGV0IDogMSA6IDE4LjUKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7RGl2bm9nb3JzayA6IDEgOiA5LjY5OTk5OTgKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7WmFvemVybnlpIDogMSA6IDEzLjkKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7SXJiZXlza2l5IDogMSA6IDEwMzc1LjYKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7Qm9yb2Rpbm8gOiAxIDogMTEuMgorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtaaGlnYWxvdnNraXkgOiAxIDogMjI4OTIuMAorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtCYWxha2h0aW5za2l5IDogMSA6IDQ5ODcuNzAwMgorUlUtVU5LLTI4NDYgOiAxIDogMTguOQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtVemh1cnNraXkgOiAxIDogNDM3OS4xMDAxCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO1NheWFuc2tpeSA6IDEgOiA4MjAxLjkwMDQKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7UGFydGl6YW5za2l5IDogMSA6IDQ3NTYuODk5OQorQm91cmlhdGlhO1NldmVyb2JheWthbHNrIDogMSA6IDYuNTk5OTk5OQorQm91cmlhdGlhO0t1cnVta2Fuc2tpeSA6IDEgOiAxMjA0NC40CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O0JhbGFnYW5za2l5IDogMSA6IDUwODUuMjAwMgorUmVzcC4gS2hha2Fzc2lhO09yZHpob25pa2lkemV2c2tpeSA6IDEgOiA1NzgwLjAKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7Tm92b3NlbG92c2tpeSA6IDEgOiAxNzExLjYKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7S3V5dHVuc2tpeSA6IDEgOiAxMDA2OC4wCitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O1R1bHVuc2tpeSA6IDEgOiAxNDMzMS40CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O0thY2h1Z3NraXkgOiAxIDogMzIxODEuMzAxCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO0lkcmluc2tpeSA6IDEgOiA1NjM4Ljc5OTgKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7S3VyYWdpbnNraXkgOiAxIDogMjQwNzcuMzAxCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO0tyYXNub3R1cmFuc2tpeSA6IDEgOiAyOTkyLjM5OTkKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7Tml6aG5ldWRpbnNrIDogMSA6IDI3LjEKK1Jlc3AuIEtoYWthc3NpYTtTaGlyaW5za2l5IDogMSA6IDYyMTQuMjk5OAorUmVzcC4gS2hha2Fzc2lhO0JvZ3JhZHNraXkgOiAxIDogNDMxMS4yMDAyCitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O1R1bHVuIDogMSA6IDM2LjcwMDAwMQorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtPbGtob25za2l5IDogMSA6IDY1NjYuMzk5OQorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtNb2dvY2hpbnNraXkgOiAxIDogMjU0OTYuNQorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtaaW1pbnNraXkgOiAxIDogNzE0Ny4xMDAxCitSZXNwLiBLaGFrYXNzaWE7VXN0LUFiYWthbnNraXkgOiAxIDogOTEyNC4wOTk2CitCb3VyaWF0aWE7QmFyZ3V6aW5za2l5IDogMSA6IDEyNzQwLjUKK091c3QnLU9yZHluc2tpIG5hdGlvbmFsIG87TnVrdXRza2l5IDogMSA6IDE4MjIuOAorT3VzdCctT3JkeW5za2kgbmF0aW9uYWwgbztPc2luc2tpeSA6IDEgOiAzOTE3LjIKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7TWludXNpbnNraXkgOiAxIDogMjg0OC44CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O1NheWFuc2sgOiAxIDogMTIuNworSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtaaW1hIDogMSA6IDI0LjI5OTk5OQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtLYXJhdHV6c2tpeSA6IDEgOiAxMDQzMy44CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O1phbGFyaW5za2l5IDogMSA6IDc1MjguMAorT3VzdCctT3JkeW5za2kgbmF0aW9uYWwgbztBbGFyc2tpeSA6IDEgOiAyNjg4LjcKK1Jlc3AuIEtoYWthc3NpYTtDaGVybm9nb3JzayA6IDEgOiA0LjMwMDAwMDIKK1Jlc3AuIEtoYWthc3NpYTtBc2tpenNraXkgOiAxIDogNzg1OC4zOTk5CitCb3VyaWF0aWE7WWVyYXZuaW5za2l5IDogMSA6IDMwMDk5LjAKK1Jlc3AuIEtoYWthc3NpYTtBbHRheXNraXkgOiAxIDogMTkxOC4zCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO01pbnVzaW5zayA6IDEgOiAxOC41CitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO0NoZXJueXNoZXZza2l5IDogMSA6IDEyNjM1LjIKK1Jlc3AuIEtoYWthc3NpYTtBYmFrYW4gOiAxIDogMi45MDAwMDAxCitUb3V2YSByZXNwb3VibGlrYTtUb2R6aGluc2tpeSA6IDEgOiA0MzY0My4zOTgKK1JVLVVOSy0yODQ3IDogMSA6IDI4NTguNjAwMQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtTaHVzaGVuc2tpeSA6IDEgOiAzMjM0LjAKK091c3QnLU9yZHluc2tpIG5hdGlvbmFsIG87Qm9raGFuc2tpeSA6IDEgOiAzNDYxLjIKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7WWVybWFrb3Zza2l5IDogMSA6IDE1Mzc1LjIKK091c3QnLU9yZHluc2tpIG5hdGlvbmFsIG87RWtoaXJpdC1CdWxhZ2F0c2tpeSA6IDEgOiA1NDg0Ljc5OTgKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7U3JldGVuc2tpeSA6IDEgOiAxNDg2NC4zCitSZXNwLiBLaGFrYXNzaWE7QmV5c2tpeSA6IDEgOiA0NjU5Ljg5OTkKK0JvdXJpYXRpYTtPa2luc2tpeSA6IDEgOiAyODE1NS4xCitCb3VyaWF0aWE7UHJpYmF5a2Fsc2tpeSA6IDEgOiAxMzE2My43CitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO0dhemltdXJvLSBaYXZvZHNraXkgOiAxIDogMTQ4ODkuOQorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtDaGVyZW1raG92c2tpeSA6IDEgOiAxMDYwNC44CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O0NoZXJlbWtob3ZvIDogMSA6IDIzLjEKK1Jlc3AuIEtoYWthc3NpYTtUYXNodHlwc2tpeSA6IDEgOiAyMDY3Ny42OTkKK1Jlc3AuIEtoYWthc3NpYTtTYXlhbm9nb3JzayA6IDEgOiA3LjE5OTk5OTgKK0JvdXJpYXRpYTtLaG9yaW5za2l5IDogMSA6IDEzNzk1LjMKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7Q2hpdGluc2tpeSA6IDEgOiAxNTcxNS44CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O0lya3V0c2tpeSA6IDEgOiAxMDIzNi45CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O1Vzb2xza2l5IDogMSA6IDY5MTcuNzAwMgorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtOZXJjaGluc2tpeSA6IDEgOiA1MjY2Ljc5OTgKK1RvdXZhIHJlc3BvdWJsaWthO1BpeS1LaHVtc2tpeSA6IDEgOiA4NjEzLjUKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7VXNvbHllLVNpYmlyc2tvZSA6IDEgOiAyMC4yMDAwMDEKK0JvdXJpYXRpYTtLYWJhbnNraXkgOiAxIDogOTMxOS4yMDAyCitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO0thcnltc2tpeSA6IDEgOiA4Njk1LjQwMDQKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7TmVyY2hpbnNraXktWmF2b2Rza2l5IDogMSA6IDk2MjIuMjAwMgorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtBbmdhcnNrIDogMSA6IDUuMAorVG91dmEgcmVzcG91Ymxpa2E7S3l6eWxza2l5IDogMSA6IDYwMTQuNzk5OAorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtTaGlsa2luc2tpeSA6IDEgOiA2MDc2Ljg5OTkKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7SXJrdXRzayA6IDEgOiAyOC43OTk5OTkKK1RvdXZhIHJlc3BvdWJsaWthO0thYS1IZW1za2l5IDogMSA6IDI1NTU3LjQKK0JvdXJpYXRpYTtaYWlncmF5ZXZza2l5IDogMSA6IDY0NjAuMAorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtLaGlsb2tza2l5IDogMSA6IDE1Mjk0LjkKK1RvdXZhIHJlc3BvdWJsaWthO1N1dC1LaG9sc2tpeSA6IDEgOiA3MDk4LjM5OTkKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7U2hlbG9wdWdpbnNraXkgOiAxIDogNDMwNS41CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O1NoZWxla2hvdiA6IDEgOiA5LjM5OTk5OTYKK1JVLVVOSy0yODQ4IDogMSA6IDc4OTEuMjk5OAorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtDaGl0YSA6IDEgOiAyNy45CitCb3VyaWF0aWE7SXZvbGdpbnNraXkgOiAxIDogMjk5Ni4yCitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO0JhbGV5c2tpeSA6IDEgOiA1MDA4LjAKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7U2x5dWR5YW5za2l5IDogMSA6IDUzMzAuNjAwMQorQm91cmlhdGlhO1R1bmtpbnNraXkgOiAxIDogMTE2ODkuOQorQm91cmlhdGlhO1VsYW4tVWRlIDogMSA6IDI2Mi4yOTk5OQorUlUtVU5LLTI4NDkgOiAxIDogNTE3Ny4yOTk4CitUb3V2YSByZXNwb3VibGlrYTtDaGFhLUtob2xza3kgOiAxIDogMzA5Ny44CitCb3VyaWF0aWE7VGFyYmFnYXRheXNraXkgOiAxIDogMzQ2NC44OTk5CitUb3V2YSByZXNwb3VibGlrYTtLeXp5bCA6IDEgOiAyNjguNjAwMDEKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7VWxldG92c2tpeSA6IDEgOiAxNjUzNC42OTkKK1RvdXZhIHJlc3BvdWJsaWthO0JhcnVuLUtoZW1jaGluc2tpeSA6IDEgOiA1NjA1LjcwMDIKK0FndWluc2tpIG5hdGlvbmFsIG9rcm91ZztNb2dveXR1eXNraXkgOiAxIDogNjIxMS41CitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO0JhbGV5IDogMSA6IDcuMzAwMDAwMgorVG91dmEgcmVzcG91Ymxpa2E7QmF5LVRheWdpbnNraXkgOiAxIDogODU1Mi4wOTk2CitUb3V2YSByZXNwb3VibGlrYTtUYW5kaW5za2l5IDogMSA6IDQxODAuODk5OQorQm91cmlhdGlhO1NlbGVuZ2luc2tpeSA6IDEgOiA4MzQ3LjUKK1RvdXZhIHJlc3BvdWJsaWthO0NoZWRpLUtob2xza3kgOiAxIDogMjMzNi4zCitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO0FsZXhhbmRyb3ZvLVphdm9kc2tpeSA6IDEgOiA3NDMzLjEwMDEKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7UGV0cm92c2stWmFiYXlrYWxza2l5IDogMSA6IDkwMDMuMjAwMgorVG91dmEgcmVzcG91Ymxpa2E7RHp1bi1LaGVtY2hpbnNraXkgOiAxIDogNTgwNC4wCitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO09sb3Z5YW5uaW5za2l5IDogMSA6IDYwNzYuNzk5OAorQm91cmlhdGlhO011a2hvcnNoaWJpcnNraXkgOiAxIDogNDU1My4wCitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO0thbGdhbnNraXkgOiAxIDogMzA0MC4xMDAxCitBZ3VpbnNraSBuYXRpb25hbCBva3JvdWc7QWdpbnNraXkgOiAxIDogNjU4My41CitCb3VyaWF0aWE7WmFrYW1lbnNraXkgOiAxIDogMTUwNzUuMworQm91cmlhdGlhO0R6aGlkaW5za2l5IDogMSA6IDg0NDQuNDAwNAorQm91cmlhdGlhO0d1c2lub296ZXJzayA6IDEgOiA1LjY5OTk5OTgKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7UGV0cm92c2stWmFiYXlrYWxza3kgOiAxIDogMTMuMQorQWd1aW5za2kgbmF0aW9uYWwgb2tyb3VnO0R1bGR1cmdpbnNraXkgOiAxIDogNjgyNS4wCitUb3V2YSByZXNwb3VibGlrYTtPdnl1cnNraXkgOiAxIDogNDc2NS42MDAxCitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO0JvcnppbnNraXkgOiAxIDogODkxOC43OTk4CitUb3V2YSByZXNwb3VibGlrYTtUZXMtS2hlbXNraXkgOiAxIDogNzAxNS4xMDAxCitCb3VyaWF0aWE7QmljaHVyc2tpeSA6IDEgOiA1ODc5LjM5OTkKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7UHJpYXJndW5za2l5IDogMSA6IDU1MTQuNjAwMQorQm91cmlhdGlhO0t5YWtodGluc2tpeSA6IDEgOiA0ODQyLjUKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7S3Jhc25vY2hpa295c2tpeSA6IDEgOiAyNzc4Mi4wCitUb3V2YSByZXNwb3VibGlrYTtFcnppbnNraXkgOiAxIDogMTI1ODYuNAorVG91dmEgcmVzcG91Ymxpa2E7TW9uZ3VuLVRheWdpbnNraXkgOiAxIDogNDY4MC4yOTk4CitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO0Frc2hpbnNraXkgOiAxIDogNzgxMS43OTk4CitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO09ub25za2l5IDogMSA6IDU3MTAuMjAwMgorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtLcmFzbm9rYW1lbnNraXkgOiAxIDogNTk4My41CitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO0t5cmluc2tpeSA6IDEgOiAxNjIzMS42CitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO0Jvcnp5YSA6IDEgOiA5LjE5OTk5OTgKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7WmFiYXlrYWxza2l5IDogMSA6IDU5MTEuNzk5OAorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtLcmFzbm9rYW1lbnNrIDogMSA6IDEzLjgKK1JVLVVOSy0yODUwIDogMSA6IDExLjQKK1JVLVVOSy0yODUxIDogMSA6IDM1MDk0LjUKK1JVLVVOSy0yODUyIDogMSA6IDM1MDk0LjUKK1JVLVVOSy0yODUzIDogMSA6IDc0OTk0LjM5OAorUlUtVU5LLTI4NTQgOiAxIDogNTA2MzIuNjk5CitSVS1VTkstMjg1NSA6IDEgOiAxOC45CitSVS1VTkstMjg1NiA6IDEgOiAyODU4LjYwMDEKK1JVLVVOSy0yODU3IDogMSA6IDc4OTEuMjk5OAorUlUtVU5LLTI4NTggOiAxIDogNTE3Ny4yOTk4CitLb3N0cm9tc2th72Egb2JsYXN0O1Zva2hvbXNraXkgOiAxIDogMzQ3My43CitLb3N0cm9tc2th72Egb2JsYXN0O1NvbGlnYWxpY2hza2l5IDogMSA6IDM0MTguOAorS29zdHJvbXNrYe9hIG9ibGFzdDtQYXZpbnNraXkgOiAxIDogMTU1MS42CitLb3N0cm9tc2th72Egb2JsYXN0O09rdHlhYnJza2l5IDogMSA6IDE3NTYuMgorS29zdHJvbXNrYe9hIG9ibGFzdDtDaHVraGxvbXNraXkgOiAxIDogMzM5Ni4yCitLb3N0cm9tc2th72Egb2JsYXN0O0tvbG9ncml2c2tpeSA6IDEgOiAzODYzLjg5OTkKK0tvc3Ryb21za2HvYSBvYmxhc3Q7TWV6aGV2c2tpeSA6IDEgOiAyMjM1Ljg5OTkKK0tvc3Ryb21za2HvYSBvYmxhc3Q7UHlzY2h1Z3NraXkgOiAxIDogMjA0MC41CitLb3N0cm9tc2th72Egb2JsYXN0O0J1eXNraXkgOiAxIDogMzU1NS44OTk5CitJYXJvc2xhdnNrYe9hIG9ibGFzdDtQb3NoZWtob25za2l5IDogMSA6IDMwMjcuOAorSWFyb3NsYXZza2HvYSBvYmxhc3Q7UGVydm9tYXlza2l5IDogMSA6IDIwMjcuOQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtWZXN5ZWdvbnNraXkgOiAxIDogMTU0NS4zCitLb3N0cm9tc2th72Egb2JsYXN0O1BhcmZlbnlldnNraXkgOiAxIDogMjMwMC4zCitLb3N0cm9tc2th72Egb2JsYXN0O1NoYXJ5aW5za2l5IDogMSA6IDM5MTkuMTAwMQorS29zdHJvbXNrYe9hIG9ibGFzdDtOZXlza2l5IDogMSA6IDI4MDEuMAorS29zdHJvbXNrYe9hIG9ibGFzdDtQb25henlyZXZza2l5IDogMSA6IDIxNTQuMworS29zdHJvbXNrYe9hIG9ibGFzdDtHYWxpY2hza2l5IDogMSA6IDI3NTMuMgorSWFyb3NsYXZza2HvYSBvYmxhc3Q7QnJleXRvdnNraXkgOiAxIDogMjA0LjYwMDAxCitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO1NhbmRvdnNraXkgOiAxIDogMTkzNy4yCitLb3N0cm9tc2th72Egb2JsYXN0O01hbnR1cm92c2tpeSA6IDEgOiAyNjMxLjAKK0lhcm9zbGF2c2th72Egb2JsYXN0O0x5dWJpbXNraXkgOiAxIDogMTUyNi4yCitLb3N0cm9tc2th72Egb2JsYXN0O0FudHJvcG92c2tpeSA6IDEgOiAyMzQ1LjMKK0tvc3Ryb21za2HvYSBvYmxhc3Q7QnV5IDogMSA6IDEuNworVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtMZXNub3kgOiAxIDogMTc0OS4wCitLb3N0cm9tc2th72Egb2JsYXN0O1NoYXJ5YSA6IDEgOiAxLjgKK0tvc3Ryb21za2HvYSBvYmxhc3Q7R2FsaXRjaCA6IDEgOiAxLjIKK0lhcm9zbGF2c2th72Egb2JsYXN0O0Rhbmlsb3Zza2l5IDogMSA6IDIxODMuOAorSWFyb3NsYXZza2HvYSBvYmxhc3Q7UnliaW5za2l5IDogMSA6IDIxMDcuMTAwMQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtLcmFzbm9raG9sbXNraXkgOiAxIDogMTQzMy40CitLb3N0cm9tc2th72Egb2JsYXN0O01hbnR1cm92byA6IDEgOiAxLjQKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47TW9sb2tvdnNraXkgOiAxIDogMTA3Mi4yCitLb3N0cm9tc2th72Egb2JsYXN0O0tvc3Ryb21za295IDogMSA6IDEzODMuNworS29zdHJvbXNrYe9hIG9ibGFzdDtOZXlhIDogMSA6IDEuOAorS29zdHJvbXNrYe9hIG9ibGFzdDtTdXNhbmluc2tpeSA6IDEgOiAxMDYyLjMKK0lhcm9zbGF2c2th72Egb2JsYXN0O1R1dGF5ZXZza2l5IDogMSA6IDEzNDMuNQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtVZG9tZWxza2l5IDogMSA6IDI0NzIuOAorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtCb2xvZ292c2tpeSA6IDEgOiAyNzI3LjEwMDEKK0tvc3Ryb21za2HvYSBvYmxhc3Q7TWFrYXJ5ZXZza2l5IDogMSA6IDQzOTEuNjAwMQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtNYWtzYXRpa2hpbnNraXkgOiAxIDogMjU3MS4zOTk5CitJYXJvc2xhdnNrYe9hIG9ibGFzdDtOZWtvdXpza2l5IDogMSA6IDE4MDUuOQorS29zdHJvbXNrYe9hIG9ibGFzdDtPc3Ryb3Zza2l5IDogMSA6IDIyODYuMAorS29zdHJvbXNrYe9hIG9ibGFzdDtTdWRpc2xhdnNraXkgOiAxIDogMTQ3Ny45CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO0JlemhldHNraXkgOiAxIDogMjgyNy4zCitLb3N0cm9tc2th72Egb2JsYXN0O0thZHlpc2tpeSA6IDEgOiAyMDkzLjg5OTkKK0lhcm9zbGF2c2th72Egb2JsYXN0O1J5Ymluc2sgOiAxIDogMi44CitJYXJvc2xhdnNrYe9hIG9ibGFzdDtUdXRhZXYgOiAxIDogNC4wOTk5OTk5CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO1NvbmtvdnNraXkgOiAxIDogMTAyMi4xCitJYXJvc2xhdnNrYe9hIG9ibGFzdDtOZWtyYXNvdnNraXkgOiAxIDogNjQ1LjAKK0lhcm9zbGF2c2th72Egb2JsYXN0O015c2hraW5za2l5IDogMSA6IDEwNjMuNAorSWFyb3NsYXZza2HvYSBvYmxhc3Q7WWFyb3NsYXZza2l5IDogMSA6IDE5MTcuOQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtCb2xvZ295ZSA6IDEgOiAzLjUKK0lhcm9zbGF2c2th72Egb2JsYXN0O0JvbHNoZXNlbHNraXkgOiAxIDogMTI1Ni4zCitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO1Vkb21seWEgOiAxIDogMS40CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO1Z5c2huZXZvbG90c2tpeSA6IDEgOiAzMjUxLjMKK0tvc3Ryb21za2HvYSBvYmxhc3Q7S29zdHJvbWEgOiAxIDogMzAuMjk5OTk5CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO0JlenNoZXRzayA6IDEgOiAxLjMKK0tvc3Ryb21za2HvYSBvYmxhc3Q7S3Jhc25vc2Vsc2tpeSA6IDEgOiA2NDguNTk5OTgKK0lhcm9zbGF2c2th72Egb2JsYXN0O1VnbGljaHNraXkgOiAxIDogMjI3MS4xMDAxCitJdmFub3Zza2HvYSBvYmxhc3Q7WmF2b2x6aHNraXkgOiAxIDogNzk2LjAKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47S2Vzb3ZvZ29yc2tpeSA6IDEgOiAxMDgwLjgKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47Rmlyb3Zza2l5IDogMSA6IDE4MjcuMQorSWFyb3NsYXZza2HvYSBvYmxhc3Q7WWFyb3NsYXZsIDogMSA6IDIuNTk5OTk5OQorSXZhbm92c2th72Egb2JsYXN0O0tpbmVzaGVtc2tpeSA6IDEgOiA0NzQuNzk5OTkKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47U3Bpcm92c2tpeSA6IDEgOiAxMzg5LjMKK0l2YW5vdnNrYe9hIG9ibGFzdDtTb2tvbHNraXkgOiAxIDogMTQyMS43CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO0thc2hpbnNraXkgOiAxIDogMjA1Ni4zCitLb3N0cm9tc2th72Egb2JsYXN0O05lcmVraHRza2l5IDogMSA6IDExMTYuMQorSWFyb3NsYXZza2HvYSBvYmxhc3Q7Qm9yaXNvZ2xlYnNraXkgOiAxIDogMTQ4MC4zCitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO0xpa2hvc2xhdmxza2l5IDogMSA6IDE3MzMuMgorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtWeXNobnkgVm9sb2NoZWsgOiAxIDogMS44CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO1JhbWVzaGtvdnNraXkgOiAxIDogMjQxNC42MDAxCitJYXJvc2xhdnNrYe9hIG9ibGFzdDtVZ2xpY2ggOiAxIDogMi4zCitJdmFub3Zza2HvYSBvYmxhc3Q7S2luZXNobWEgOiAxIDogMTIuOAorSWFyb3NsYXZza2HvYSBvYmxhc3Q7R2F2cmlsb3YtWWFtc2tpeSA6IDEgOiAxMjAyLjQKK0l2YW5vdnNrYe9hIG9ibGFzdDtQcml2b2x6aHNraXkgOiAxIDogNTQ0LjQwMDAyCitJdmFub3Zza2HvYSBvYmxhc3Q7VmljaHVnc2tpeSA6IDEgOiA5OTYuNDAwMDIKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47T3N0YXNoa292c2tpeSA6IDEgOiAyNTgxLjYwMDEKK0l2YW5vdnNrYe9hIG9ibGFzdDtZdXJ5ZXZldHNraXkgOiAxIDogNjQ3LjcwMDAxCitJYXJvc2xhdnNrYe9hIG9ibGFzdDtSb3N0b3Zza2l5IDogMSA6IDIyNDcuMAorS29zdHJvbXNrYe9hIG9ibGFzdDtOZXJla2h0YSA6IDEgOiAxLjQKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47S2FzaGluIDogMSA6IDEuMworVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtLYWx5YXppbnNraXkgOiAxIDogMTY5OS4wCitJdmFub3Zza2HvYSBvYmxhc3Q7RnVybWFub3Zza2l5IDogMSA6IDY2NC43MDAwMQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtLaW1yc2tpeSA6IDEgOiAyNTAwLjIKK0l2YW5vdnNrYe9hIG9ibGFzdDtSb2RuaWtvdnNraXkgOiAxIDogMTAxMS45CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO1Rvcnpob2tza2l5IDogMSA6IDMxMDEuOAorSXZhbm92c2th72Egb2JsYXN0O0tvbXNvbW9sc2tpeSA6IDEgOiAxMDE0LjIKK0lhcm9zbGF2c2th72Egb2JsYXN0O1Jvc3RvdiA6IDEgOiA1Ni4yOTk5OTkKK0l2YW5vdnNrYe9hIG9ibGFzdDtGdXJtYW5vdiA6IDEgOiAxLjAKK0l2YW5vdnNrYe9hIG9ibGFzdDtWaWNodWdhIDogMSA6IDE0LjUKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47UGVub3Zza2l5IDogMSA6IDI1MTAuMAorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtLdXZzaGlub3Zza2l5IDogMSA6IDE5MzQuOAorSXZhbm92c2th72Egb2JsYXN0O0l2YW5vdnNraXkgOiAxIDogMTExNC4wCitJdmFub3Zza2HvYSBvYmxhc3Q7THVraHNraXkgOiAxIDogMTAxNS43CitJdmFub3Zza2HvYSBvYmxhc3Q7SWx5aW5za2l5IDogMSA6IDEzNDMuOAorSWFyb3NsYXZza2HvYSBvYmxhc3Q7UGVyZXNsYXZza2l5IDogMSA6IDMyOTguNQorSXZhbm92c2th72Egb2JsYXN0O1B1Y2hlemhza2l5IDogMSA6IDc1Mi41CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO0thbGluaW5za2l5IDogMSA6IDQ0OTEuMzk5OQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtBbmRyZWFwb2xza2l5IDogMSA6IDI4ODcuODk5OQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtPc3Rhc2hrb3YgOiAxIDogNC40MDAwMDAxCitJdmFub3Zza2HvYSBvYmxhc3Q7SXZhbm92byA6IDEgOiAxMDQuMworVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtTZWxpemhhcm92c2tpeSA6IDEgOiAzMDQ0LjgKK0l2YW5vdnNrYe9hIG9ibGFzdDtTaHVpc2tpeSA6IDEgOiAxMDcxLjcKK0l2YW5vdnNrYe9hIG9ibGFzdDtUZXlrb3Zza2l5IDogMSA6IDE1MTIuNAorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtUb3J6c2hvayA6IDEgOiAxLjMKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47VG9yb3BldHNraXkgOiAxIDogMzE2Ni44OTk5CitJdmFub3Zza2HvYSBvYmxhc3Q7TGV6aG5ldnNraXkgOiAxIDogNzgyLjI5OTk5CitJdmFub3Zza2HvYSBvYmxhc3Q7UGFsZWtoc2tpeSA6IDEgOiA4MjYuNzAwMDEKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7VGFsZG9tc2tpeSA6IDEgOiAxOTU1LjMKK0l2YW5vdnNrYe9hIG9ibGFzdDtWZXJraG5lbGFuZGVraG92c2tpeSA6IDEgOiA2NzguNDAwMDIKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47VHZlciA6IDEgOiAxNTEuMzk5OTkKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47S29uYWtvdnNraXkgOiAxIDogNDc2LjIwMDAxCitJdmFub3Zza2HvYSBvYmxhc3Q7U2h1eWEgOiAxIDogMTMuMQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtLaW1yeSA6IDEgOiAyLjMKK0l2YW5vdnNrYe9hIG9ibGFzdDtUZXlrb3ZvIDogMSA6IDEuNgorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtTdGFyaXRza2l5IDogMSA6IDMzMDYuNjAwMQorSXZhbm92c2th72Egb2JsYXN0O0dhdnJpbG92by1Qb3NhZHNraXkgOiAxIDogOTM5LjA5OTk4CitWbGFkaW1pcnNrYe9hIG9ibGFzdDtZdXJ5ZXYtUG9sc2tpeSA6IDEgOiAxODk4LjAKK0l2YW5vdnNrYe9hIG9ibGFzdDtQZXN0eWFrb3Zza2l5IDogMSA6IDg2NC41OTk5OAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtaYWdvcnNraXkgOiAxIDogMjQ3Mi4zOTk5CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0R1Ym5hIDogMSA6IDQuODAwMDAwMgorSXZhbm92c2th72Egb2JsYXN0O1l1emhza2l5IDogMSA6IDE0OTMuOAorUlUtVU5LLTI4NTkgOiAxIDogMS4yCitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO0tvbmFrb3ZvIDogMSA6IDEuNworSXZhbm92c2th72Egb2JsYXN0O1Nhdmluc2tpeSA6IDEgOiAxMTIzLjEKK1ZsYWRpbWlyc2th72Egb2JsYXN0O0FsZWtzYW5kcm92c2tpeSA6IDEgOiAxNTM2LjgKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47UnpoZXZza2l5IDogMSA6IDI4NTUuODk5OQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtEbWl0cm92c2tpeSA6IDEgOiAyMDc0LjAKK1ZsYWRpbWlyc2th72Egb2JsYXN0O1N1emRhbHNraXkgOiAxIDogMTUxNC4xCitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO05lbGlkb3Zza2l5IDogMSA6IDI3NTcuMgorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtLbGluc2tpeSA6IDEgOiAyMDUxLjMKK1ZsYWRpbWlyc2th72Egb2JsYXN0O0thbWVzaGtvdnNraXkgOiAxIDogMTE4MS4xCitWbGFkaW1pcnNrYe9hIG9ibGFzdDtLb3Zyb3Zza2l5IDogMSA6IDE3MjMuMQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtPbGVuaW5za2l5IDogMSA6IDI3OTUuODk5OQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtaYXBhZG5vZHZpbnNraXkgOiAxIDogMjUzMi4zCitWbGFkaW1pcnNrYe9hIG9ibGFzdDtLb2xjaHVnaW5za2l5IDogMSA6IDEwNTAuNgorVmxhZGltaXJza2HvYSBvYmxhc3Q7Vnlhem5pa292c2tpeSA6IDEgOiAyMTQwLjg5OTkKK1ZsYWRpbWlyc2th72Egb2JsYXN0O1N1emRhbCcgOiAxIDogMTIuMgorVmxhZGltaXJza2HvYSBvYmxhc3Q7R29yb2tob3ZldHNraXkgOiAxIDogMTM3NS45CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0xvdG9zaGluc2tpeSA6IDEgOiA3OTIuMjk5OTkKK1ZsYWRpbWlyc2th72Egb2JsYXN0O0tvdnJvdiA6IDEgOiAyNS43MDAwMDEKK1JVLVVOSy0yODYwIDogMSA6IDIuOAorVmxhZGltaXJza2HvYSBvYmxhc3Q7QWxla3NhbmRyb3YgOiAxIDogMjAuMjAwMDAxCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0tsaW4gOiAxIDogMjEuNzk5OTk5CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1NlcmdpZXYgUG9zYWQgOiAxIDogMTAuMgorVmxhZGltaXJza2HvYSBvYmxhc3Q7S2lyemhhY2hza2l5IDogMSA6IDExNTEuMgorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtadWJ0c292c2tpeSA6IDEgOiAyMDk2LjgKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7U29sbmVjaG5vZ29yc2tpeSA6IDEgOiAxMDg5LjAKK1ZsYWRpbWlyc2th72Egb2JsYXN0O0tvbCdjaHVnaW5vIDogMSA6IDExLjMKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7Vm9sb2tvbGFtc2tpeSA6IDEgOiAxNjE2LjcKK1ZsYWRpbWlyc2th72Egb2JsYXN0O1NvYmluc2tpeSA6IDEgOiAxODEwLjAKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47UnpzaGV2IDogMSA6IDIuMgorVmxhZGltaXJza2HvYSBvYmxhc3Q7Vnlhem5pa2kgOiAxIDogMTYuOQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtTY2hlbGtvdnNraXkgOiAxIDogODM1LjIwMDAxCitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO05lbGlkb3ZvIDogMSA6IDEuOAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtTaGFraG92c2tveSA6IDEgOiAxMDQzLjYKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7U29sbmVjaG5vZ29yc2sgOiAxIDogOS44OTk5OTk2CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1B1c2hraW5za2l5IDogMSA6IDY2OS41OTk5OAorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtaaGFya292c2tpeSA6IDEgOiAyMDcxLjgKK1ZsYWRpbWlyc2th72Egb2JsYXN0O1ZsYWRpbWlyIDogMSA6IDEwNC4wCitWbGFkaW1pcnNrYe9hIG9ibGFzdDtQZXR1c2hraW5za2l5IDogMSA6IDE4NjYuMAorVmxhZGltaXJza2HvYSBvYmxhc3Q7U3Vkb2dvZHNraXkgOiAxIDogMjI5Ny4wCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0tyYXNub2FybWV5c2sgOiAxIDogNS4wOTk5OTk5CitSVS1VTkstMjg2MSA6IDEgOiAxLjAKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7SXN0cmluc2tpeSA6IDEgOiAxMzgzLjEKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7TXl0aXNjaGluc2tpeSA6IDEgOiA0MjYuMAorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtCZWxza2l5IDogMSA6IDE5MDIuMAorU21vbGVuc2th72Egb2JsYXN0O1N5Y2hldmtza2l5IDogMSA6IDE5OTQuMQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtOb2dpbnNraXkgOiAxIDogOTYwLjU5OTk4CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1ZvbG9rb2xhbXNrIDogMSA6IDEwLjQKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7UHVzY2hpbm8gOiAxIDogNC42OTk5OTk4CitWbGFkaW1pcnNrYe9hIG9ibGFzdDtTZWxpdmFub3Zza2l5IDogMSA6IDE0OTcuMQorVmxhZGltaXJza2HvYSBvYmxhc3Q7U29iaW5rYSA6IDEgOiA4LjAKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7UnV6c2tpeSA6IDEgOiAxMzUxLjIKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7UGF2bG92by1Qb3NhZHNraXkgOiAxIDogNjU5Ljc5OTk5CitTbW9sZW5za2HvYSBvYmxhc3Q7R2FnYXJpbnNraXkgOiAxIDogMzM2OC4zCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0xvYm55YSA6IDEgOiAxLjAKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7SXZhbnRleWV2a2EgOiAxIDogOC44MDAwMDAyCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0ZyeWF6aW5vIDogMSA6IDUuNQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtLaGlta2luc2tpeSA6IDEgOiAxMjcuNworTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtEb2xnb3BydWRueWkgOiAxIDogNi44MDAwMDAyCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1NoY2hlbGtvdm8gOiAxIDogOS42OTk5OTk4CitWbGFkaW1pcnNrYe9hIG9ibGFzdDtNdXJvbXNraXkgOiAxIDogMTAyMy44CitNb3NrdmE7TW9zY293IDogMSA6IDk4NC43OTk5OQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtQdXNoa2lubyA6IDEgOiA5LjEwMDAwMDQKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7TXl0eXNoY2h5IDogMSA6IDEwLjIKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7SXN0cmEgOiAxIDogNS42OTk5OTk4CitSVS1VTkstMjg2MiA6IDEgOiAxLjAKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7S2hpbWtpIDogMSA6IDcuNQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtOb2dpbnNrIDogMSA6IDMyLjAKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7S2FsaW5pbmdyYWQgOiAxIDogMTEuOQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtLcmFzbm9nb3Jza2l5IDogMSA6IDIzNi43CitWbGFkaW1pcnNrYe9hIG9ibGFzdDtHdXMtS2hydXN0YWxueWkgOiAxIDogNDQ1OC4xMDAxCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O09yZWtob3ZvLVp1eWV2c2tpeSA6IDEgOiAxODIxLjgKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7QmFsYXNoaWtoaW5za2l5IDogMSA6IDI1OC4zOTk5OQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtPcmVraG92by1adWV2byA6IDEgOiA4LjEwMDAwMDQKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7TW96aGF5c2tpeSA6IDEgOiAyNjE4LjM5OTkKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7S3Jhc25vZ29yc2sgOiAxIDogNy45MDAwMDAxCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1NoYXR1cnNraXkgOiAxIDogMjUwNS44CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0VsZWt0cm9zdGFsIDogMSA6IDE2LjYKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7QmFsYXNoaWtoYSA6IDEgOiAyLjA5OTk5OTkKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7UmV1dG92IDogMSA6IDcuOTAwMDAwMQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtPZGludHNvdnNraXkgOiAxIDogMTE0NC44CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1poZWxlem5vZG9yb3pobnlpIDogMSA6IDguODAwMDAwMgorU21vbGVuc2th72Egb2JsYXN0O05vdm9kdWdpbnNraXkgOiAxIDogMTk0MC4xCitTbW9sZW5za2HvYSBvYmxhc3Q7VmVsaXpoc2tpeSA6IDEgOiAxNTYwLjIKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7WnZlbmlnb3JvZCA6IDEgOiA1LjgwMDAwMDIKK1Ntb2xlbnNrYe9hIG9ibGFzdDtEZW1pZG92c2tpeSA6IDEgOiAyOTI3LjYwMDEKK1Ntb2xlbnNrYe9hIG9ibGFzdDtLaG9sbS1aaGlya292c2tpeSA6IDEgOiAyNTczLjcKK1Ntb2xlbnNrYe9hIG9ibGFzdDtEdWtob3ZzY2hpbnNraXkgOiAxIDogMjgyNS4xMDAxCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0x5dWJlcmV0c2tpeSA6IDEgOiA3NS4zMDAwMDMKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7T2RpbnRzb3ZvIDogMSA6IDEzLjUKK1ZsYWRpbWlyc2th72Egb2JsYXN0O0d1cyctS2hydXN0YWxueSA6IDEgOiAxOS4yMDAwMDEKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7UmFtZW5za2l5IDogMSA6IDE0NDQuNAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtMZW5pbnNraXkgOiAxIDogNDcyLjUKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7TGl1YmVydHN5IDogMSA6IDEuOAorVmxhZGltaXJza2HvYSBvYmxhc3Q7TWVsZW5rb3Zza2l5IDogMSA6IDIxNzAuMTAwMQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtaaHVrb3Zza2l5IDogMSA6IDQuMTk5OTk5OAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtOYXJvLUZvbWluc2tpeSA6IDEgOiAxOTQzLjAKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7UmFtZW5za29lIDogMSA6IDE1LjQKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7U2hhdHVyYSA6IDEgOiA1LjgwMDAwMDIKK1ZsYWRpbWlyc2th72Egb2JsYXN0O011cm9tIDogMSA6IDIzLjc5OTk5OQorU21vbGVuc2th72Egb2JsYXN0O0dhZ2FyaW4gOiAxIDogOS4zMDAwMDAyCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1ZpZG5veWUgOiAxIDogMy4wCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0x5dGthcmlubyA6IDEgOiAxLjMKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7Vm9za3Jlc2Vuc2tpeSA6IDEgOiA4MjguNTk5OTgKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7UG9kb2xza2l5IDogMSA6IDEwNjUuMgorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtNb3pzaGF5c2sgOiAxIDogOS42MDAwMDA0CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1Ryb2l0c2sgOiAxIDogMi41OTk5OTk5CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1llZ29yeWV2c2tpeSA6IDEgOiAxNjEwLjkKK1Ntb2xlbnNrYe9hIG9ibGFzdDtZYXJ0c2V2c2tpeSA6IDEgOiAxNTExLjQKK1JVLVVOSy0yODYzIDogMSA6IDEuMAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtEb21vZGVkb3Zza2l5IDogMSA6IDcyNy43MDAwMQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtQb2RvbHNrIDogMSA6IDI4LjEKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7RG9tb2RlZG92byA6IDEgOiA3LjkwMDAwMDEKK1Ntb2xlbnNrYe9hIG9ibGFzdDtWeWF6ZW1za2l5IDogMSA6IDMzOTYuNworTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtFZ29yeWV2c2sgOiAxIDogMTYuNgorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtOYXJvLUZvbWluc2sgOiAxIDogMjAuMjAwMDAxCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0tsaW1vdnNrIDogMSA6IDguNQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtWb3NrcmVzZW5zayA6IDEgOiAyMi4yOTk5OTkKK1J5YXphbnNrYe9hIG9ibGFzdDtLbGVwaWtvdnNraXkgOiAxIDogMzA2NS4yCitTbW9sZW5za2HvYSBvYmxhc3Q7UnVkbnlhbnNraXkgOiAxIDogMTU5Ny42CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0Jyb25uaXRzeSA6IDEgOiAxLjYKK0thbG91anNrYe9hIG9ibGFzdDtCb3JvdnNraXkgOiAxIDogODcwLjIwMDAxCitTbW9sZW5za2HvYSBvYmxhc3Q7U2Fmb25vdnNraXkgOiAxIDogMjI0OS43CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0NoZWtob3Zza2l5IDogMSA6IDg5MC43OTk5OQorS2Fsb3Vqc2th72Egb2JsYXN0O0l6bm9za292c2tpeSA6IDEgOiAxMzg2LjYKK0thbG91anNrYe9hIG9ibGFzdDtNZWR5bnNraXkgOiAxIDogMTA0OS4xCitTbW9sZW5za2HvYSBvYmxhc3Q7VHlvbWtpbnNraXkgOiAxIDogMTM4MC44CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1N0dXBpbnNraXkgOiAxIDogMTc0My4wCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0tvbG9tZW5za2l5IDogMSA6IDExNDMuMworS2Fsb3Vqc2th72Egb2JsYXN0O1podWtvdnNraXkgOiAxIDogMTM1NC45CitSeWF6YW5za2HvYSBvYmxhc3Q7S2FzaW1vdnNraXkgOiAxIDogMzIzMi4zCitTbW9sZW5za2HvYSBvYmxhc3Q7Vnlhem1hIDogMSA6IDQ2Ljc5OTk5OQorUlUtVU5LLTI4NjQgOiAxIDogMzYuNzk5OTk5CitTbW9sZW5za2HvYSBvYmxhc3Q7U2Fmb25vdm8gOiAxIDogMjUuNzAwMDAxCitLYWxvdWpza2HvYSBvYmxhc3Q7TWFsb3lhcm9zbGF2ZXRza2l5IDogMSA6IDE3MDMuNgorS2Fsb3Vqc2th72Egb2JsYXN0O09ibmluc2sgOiAxIDogMTAuNAorU21vbGVuc2th72Egb2JsYXN0O1Ntb2xlbnNraXkgOiAxIDogMjY5Mi42MDAxCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0x1a2hvdml0c2tpeSA6IDEgOiAxMTYxLjEKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7S29sb21uYSA6IDEgOiAyMS43OTk5OTkKK1Ntb2xlbnNrYe9hIG9ibGFzdDtZYXJ0c2V2byA6IDEgOiAyMS4xCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1NlcnB1a2hvdnNraXkgOiAxIDogOTM4LjkwMDAyCitSeWF6YW5za2HvYSBvYmxhc3Q7Unlibm92c2tpeSA6IDEgOiAxNjY1LjgKK1J5YXphbnNrYe9hIG9ibGFzdDtZZXJtaXNoaW5za2l5IDogMSA6IDEyNzkuMworTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtPenlvcnNraXkgOiAxIDogNTI1LjkwMDAyCitTbW9sZW5za2HvYSBvYmxhc3Q7S2FyZHltb3Zza2l5IDogMSA6IDEwNDQuMAorU21vbGVuc2th72Egb2JsYXN0O1VncmFuc2tpeSA6IDEgOiAyNTEwLjg5OTkKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7U3R1cGlubyA6IDEgOiA3LjMwMDAwMDIKK1Ntb2xlbnNrYe9hIG9ibGFzdDtEb3JvZ29idXpoc2tpeSA6IDEgOiAxOTA2LjIKK0thbG91anNrYe9hIG9ibGFzdDtEemVyemhpbnNraXkgOiAxIDogMTIyNC4zCitSeWF6YW5za2HvYSBvYmxhc3Q7S2FzaW1vdiA6IDEgOiAxNi4yOTk5OTkKK0thbG91anNrYe9hIG9ibGFzdDtZdWtobm92c2tpeSA6IDEgOiAxMzg0LjQKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7U2VycHVraG92IDogMSA6IDI1LjEKK1J5YXphbnNrYe9hIG9ibGFzdDtSeWF6YW5za2l5IDogMSA6IDIwNzEuNjAwMQorUlUtVU5LLTI4NjUgOiAxIDogMi4wOTk5OTk5CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1phcmF5c2tpeSA6IDEgOiA3NzguNDAwMDIKK0thbG91anNrYe9hIG9ibGFzdDtUYXJ1c3NraXkgOiAxIDogODEwLjkwMDAyCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O096ZXJ5IDogMSA6IDExLjQKK1J5YXphbnNrYe9hIG9ibGFzdDtTcGFzc2tpeSA6IDEgOiAyNjI2LjYwMDEKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7S2FzaGlyc2tpeSA6IDEgOiA1MzcuMjk5OTkKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7S2FzaGlyYSA6IDEgOiA2LjA5OTk5OTkKK1J5YXphbnNrYe9hIG9ibGFzdDtTaGlsb3Zza2l5IDogMSA6IDIzNzMuMzk5OQorVG91bHNrYe9hIG9ibGFzdDtaYW9rc2tpeSA6IDEgOiA5MzAuNTk5OTgKK1RvdWxza2HvYSBvYmxhc3Q7WWFzbm9nb3Jza2l5IDogMSA6IDEyNDAuNAorU21vbGVuc2th72Egb2JsYXN0O0dsaW5rb3Zza2l5IDogMSA6IDExODguOQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtaYXJheXNrIDogMSA6IDcuNQorUnlhemFuc2th72Egb2JsYXN0O1BpdGVsaW5za2l5IDogMSA6IDg4NS43OTk5OQorU21vbGVuc2th72Egb2JsYXN0O1Ntb2xlbnNrIDogMSA6IDE5NC41CitLYWxvdWpza2HvYSBvYmxhc3Q7TW9zYWxza2l5IDogMSA6IDEyNTAuOAorUnlhemFuc2th72Egb2JsYXN0O0thZG9tc2tpeSA6IDEgOiA5NDQuMAorS2Fsb3Vqc2th72Egb2JsYXN0O0Zlcnppa292c2tpeSA6IDEgOiAxMzU4LjIKK1RvdWxza2HvYSBvYmxhc3Q7VmVuZXZza2l5IDogMSA6IDE5MzMuOAorS2Fsb3Vqc2th72Egb2JsYXN0O0thbHVnYSA6IDEgOiAzODUuMTAwMDEKK1J5YXphbnNrYe9hIG9ibGFzdDtSeWF6YW4gOiAxIDogMTU2LjAKK1Ntb2xlbnNrYe9hIG9ibGFzdDtLcmFzbmluc2tpeSA6IDEgOiAxMDUwLjIKK1RvdWxza2HvYSBvYmxhc3Q7QWxla3NpbnNraXkgOiAxIDogOTc5LjUKK1Ntb2xlbnNrYe9hIG9ibGFzdDtZZWxuaW5za2l5IDogMSA6IDIxMTEuMAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtTZXJlYnJ5YW5vcHJ1ZHNraXkgOiAxIDogNzg4Ljc5OTk5CitSeWF6YW5za2HvYSBvYmxhc3Q7WmFraGFyb3Zza2l5IDogMSA6IDkxNi45MDAwMgorS2Fsb3Vqc2th72Egb2JsYXN0O0JhYnluaW5za2l5IDogMSA6IDgzOS4yMDAwMQorU21vbGVuc2th72Egb2JsYXN0O1BvY2hpbmtvdnNraXkgOiAxIDogMjI3Ny44CitLYWxvdWpza2HvYSBvYmxhc3Q7U3Bhcy1EZW1lbnNraXkgOiAxIDogMTM1NC41CitLYWxvdWpza2HvYSBvYmxhc3Q7QmFyeWF0aW5za2l5IDogMSA6IDExMjMuMAorS2Fsb3Vqc2th72Egb2JsYXN0O01lc2Nob3Zza2l5IDogMSA6IDEzMDcuMAorUnlhemFuc2th72Egb2JsYXN0O1Nhc292c2tpeSA6IDEgOiAxNzM0LjgKK1J5YXphbnNrYe9hIG9ibGFzdDtDaHVjaGtvdnNraXkgOiAxIDogNzk2LjQwMDAyCitUb3Vsc2th72Egb2JsYXN0O0FsZWtzaW4gOiAxIDogMS4wCitTbW9sZW5za2HvYSBvYmxhc3Q7TW9uYXN0eXJzaGluc2tpeSA6IDEgOiAxMDM1LjkKK0thbG91anNrYe9hIG9ibGFzdDtQZXJlbXlzaGxza2l5IDogMSA6IDk5OS41OTk5OAorUnlhemFuc2th72Egb2JsYXN0O1N0YXJvemhpbG92c2tpeSA6IDEgOiA5ODUuOTAwMDIKK1J5YXphbnNrYe9hIG9ibGFzdDtNaWtoYXlsb3Zza2l5IDogMSA6IDE3NjguNworUnlhemFuc2th72Egb2JsYXN0O1Byb25za2l5IDogMSA6IDEwOTUuMQorVG91bHNrYe9hIG9ibGFzdDtMZW5pbnNraXkgOiAxIDogMTMwNS41CitSeWF6YW5za2HvYSBvYmxhc3Q7U2Fzb3ZvIDogMSA6IDguMTk5OTk5OAorS2Fsb3Vqc2th72Egb2JsYXN0O1N1a2hpbmljaHNraXkgOiAxIDogMTA3NS4yCitUb3Vsc2th72Egb2JsYXN0O05vdm9tb3Nrb3Zza2l5IDogMSA6IDYwMi4wCitLYWxvdWpza2HvYSBvYmxhc3Q7S296ZWxza2l5IDogMSA6IDE3MzcuNAorVG91bHNrYe9hIG9ibGFzdDtEdWJlbnNraXkgOiAxIDogNzI3LjkwMDAyCitSeWF6YW5za2HvYSBvYmxhc3Q7UHV0eWF0aW5za2l5IDogMSA6IDEwMDIuNgorS2Fsb3Vqc2th72Egb2JsYXN0O0t1eWJ5c2hldnNraXkgOiAxIDogMTA5Ni42CitUb3Vsc2th72Egb2JsYXN0O1N1dm9yb3Zza2l5IDogMSA6IDEwMjkuNworVG91bHNrYe9hIG9ibGFzdDtUdWxhIDogMSA6IDE1OS4zOTk5OQorU21vbGVuc2th72Egb2JsYXN0O1Jvc2xhdmxza2l5IDogMSA6IDI0NTEuMzk5OQorUnlhemFuc2th72Egb2JsYXN0O1NoYXRza2l5IDogMSA6IDI0NjAuODk5OQorVG91bHNrYe9hIG9ibGFzdDtLaXJleWV2c2tpeSA6IDEgOiA5MzEuNTk5OTgKK0thbG91anNrYe9hIG9ibGFzdDtLaXJvdnNraXkgOiAxIDogOTM0LjI5OTk5CitTbW9sZW5za2HvYSBvYmxhc3Q7S2hpc2xhdmljaHNraXkgOiAxIDogNjk0LjA5OTk4CitLYWxvdWpza2HvYSBvYmxhc3Q7RHVtaW5pY2hza2l5IDogMSA6IDEwNzguOQorUnlhemFuc2th72Egb2JsYXN0O0tvcmFibGluc2tpeSA6IDEgOiAxMjAxLjMKK1J5YXphbnNrYe9hIG9ibGFzdDtTYXBvemhrb3Zza2l5IDogMSA6IDk4Ny43MDAwMQorVG91bHNrYe9hIG9ibGFzdDtPZG95ZXZza2l5IDogMSA6IDEyMDEuMAorVG91bHNrYe9hIG9ibGFzdDtLaW1vdnNraXkgOiAxIDogMTEzOC43CitLYWxvdWpza2HvYSBvYmxhc3Q7S2lyb3YgOiAxIDogMTAuMworS2Fsb3Vqc2th72Egb2JsYXN0O0x5dWRpbm92c2tpeSA6IDEgOiA5MjcuMjk5OTkKK1RvdWxza2HvYSBvYmxhc3Q7VXpsb3Zza2l5IDogMSA6IDYzMS4wCitUb3Vsc2th72Egb2JsYXN0O1NjaGVraW5za2l5IDogMSA6IDEzMDEuNAorQnJ5YW5za2HvYSBvYmxhc3Q7Um9nbmVkaW5za2l5IDogMSA6IDEwNDIuOAorU21vbGVuc2th72Egb2JsYXN0O0Rlc25vZ29yc2sgOiAxIDogMS45CitUb3Vsc2th72Egb2JsYXN0O05vdm9tb3Nrb3ZzayA6IDEgOiAxLjMKK1Ntb2xlbnNrYe9hIG9ibGFzdDtTaHVteWFjaHNraXkgOiAxIDogMTA3OS43CitUb3Vsc2th72Egb2JsYXN0O0RvbnNrb3kgOiAxIDogMS4wCitSeWF6YW5za2HvYSBvYmxhc3Q7U2FyYXlldnNraXkgOiAxIDogMTkzMS40CitUb3Vsc2th72Egb2JsYXN0O1NjaGVraW5vIDogMSA6IDEuMAorVG91bHNrYe9hIG9ibGFzdDtVemxvdmF5YSA6IDEgOiAxLjAKK1RvdWxza2HvYSBvYmxhc3Q7QmVseWV2c2tpeSA6IDEgOiA5NTguNTk5OTgKK1J5YXphbnNrYe9hIG9ibGFzdDtVa2hvbG92c2tpeSA6IDEgOiAxMDczLjgKK1J5YXphbnNrYe9hIG9ibGFzdDtTa29waW5za2l5IDogMSA6IDE1ODEuNgorU21vbGVuc2th72Egb2JsYXN0O1Jvc2xhdmwnIDogMSA6IDI1LjQKK1RvdWxza2HvYSBvYmxhc3Q7S2ltb3ZzayA6IDEgOiAxLjAKK0thbG91anNrYe9hIG9ibGFzdDtVbHlhbm92c2tpeSA6IDEgOiAxNzA2LjEKK0thbG91anNrYe9hIG9ibGFzdDtMeXVkaW5vdm8gOiAxIDogMTkuNQorS2Fsb3Vqc2th72Egb2JsYXN0O1poaXpkcmluc2tpeSA6IDEgOiAxNDI1LjkKK0JyeWFuc2th72Egb2JsYXN0O0R5YXRrb3Zza2l5IDogMSA6IDEzMzEuMQorUnlhemFuc2th72Egb2JsYXN0O1J5YXpoc2tpeSA6IDEgOiAxMDU1LjQKK0JyeWFuc2th72Egb2JsYXN0O0R1YnJvdnNraXkgOiAxIDogMTA2MS45CitUb3Vsc2th72Egb2JsYXN0O0JvZ29yb2RpdHNraXkgOiAxIDogODg3LjUKK1J5YXphbnNrYe9hIG9ibGFzdDtTa29waW4gOiAxIDogNS41CitUb3Vsc2th72Egb2JsYXN0O1BsYXZza2l5IDogMSA6IDk5OS4yMDAwMQorUnlhemFuc2th72Egb2JsYXN0O01pbG9zbGF2c2tpeSA6IDEgOiAxNDM1LjIKK1RvdWxza2HvYSBvYmxhc3Q7VGVwbG8tT2dhcmV2c2tpeSA6IDEgOiAxMDAxLjUKK1RvdWxza2HvYSBvYmxhc3Q7QXJzZW55ZXZza2l5IDogMSA6IDEwODQuNgorVG91bHNrYe9hIG9ibGFzdDtCb2dvcm9kaXRzayA6IDEgOiAxLjAKK0JyeWFuc2th72Egb2JsYXN0O1podWtvdnNraXkgOiAxIDogMTAyNi4zCitTbW9sZW5za2HvYSBvYmxhc3Q7WWVyc2hpY2hza2l5IDogMSA6IDg0OC41CitLYWxvdWpza2HvYSBvYmxhc3Q7S2h2YXN0b3ZpY2hza2l5IDogMSA6IDE2MTcuNQorVG91bHNrYe9hIG9ibGFzdDtWb2xvdnNraXkgOiAxIDogMTEwMS4zCitUb3Vsc2th72Egb2JsYXN0O0t1cmtpbnNraXkgOiAxIDogMTA4MS4wCitUb3Vsc2th72Egb2JsYXN0O0NoZXJuc2tpeSA6IDEgOiAxMzk0LjYKK0JyeWFuc2th72Egb2JsYXN0O0tsZXRueWFuc2tpeSA6IDEgOiAxNjY3LjgKK1J5YXphbnNrYe9hIG9ibGFzdDtOb3ZvZGVyZXZlbnNraXkgOiAxIDogODUxLjAKK09ybG92c2th72Egb2JsYXN0O0JvbGtob3Zza2l5IDogMSA6IDEzNDAuMQorQnJ5YW5za2HvYSBvYmxhc3Q7RHlhdCdrb3ZvIDogMSA6IDEuMAorQnJ5YW5za2HvYSBvYmxhc3Q7QnJ5YW5za2l5IDogMSA6IDE5NDAuNQorT3Jsb3Zza2HvYSBvYmxhc3Q7Wm5hbWVuc2tpeSA6IDEgOiA3MTEuNTk5OTgKK09ybG92c2th72Egb2JsYXN0O010c2Vuc2tpeSA6IDEgOiAxNjY5LjEKK1RvdWxza2HvYSBvYmxhc3Q7S2FtZW5za2l5IDogMSA6IDcxNi4wCitUb3Vsc2th72Egb2JsYXN0O1llZnJlbW92c2tpeSA6IDEgOiAxNzMxLjEKK09ybG92c2th72Egb2JsYXN0O0tob3R5bmV0c2tpeSA6IDEgOiA4NDguNQorQnJ5YW5za2HvYSBvYmxhc3Q7S2FyYWNoZXZza2l5IDogMSA6IDEzMTQuNgorQnJ5YW5za2HvYSBvYmxhc3Q7U3VyYXpoc2tpeSA6IDEgOiAxMzE5LjYKK0JyeWFuc2th72Egb2JsYXN0O0JyeWFuc2sgOiAxIDogMTM0Ljg5OTk5CitCcnlhbnNrYe9hIG9ibGFzdDtaaGlyeWF0aW5za2l5IDogMSA6IDYxNS4yMDAwMQorUlUtVU5LLTI4NjYgOiAxIDogMS4wCitPcmxvdnNrYe9hIG9ibGFzdDtNemVuc2sgOiAxIDogNS40MDAwMDAxCitCcnlhbnNrYe9hIG9ibGFzdDtNZ2xpbnNraXkgOiAxIDogODY2LjA5OTk4CitPcmxvdnNrYe9hIG9ibGFzdDtLb3JzYWtvdnNraXkgOiAxIDogNjYyLjUKK09ybG92c2th72Egb2JsYXN0O09ybG92c2tpeSA6IDEgOiAxNzg4LjYKK0JyeWFuc2th72Egb2JsYXN0O0tyYXNub2dvcnNraXkgOiAxIDogMTI0OC4yCitCcnlhbnNrYe9hIG9ibGFzdDtWeWdvbmljaHNraXkgOiAxIDogOTk4LjQwMDAyCitCcnlhbnNrYe9hIG9ibGFzdDtQb2NoZXBza2l5IDogMSA6IDIwNzUuMworT3Jsb3Zza2HvYSBvYmxhc3Q7Tm92b3NpbHNraXkgOiAxIDogNjg1LjQwMDAyCitPcmxvdnNrYe9hIG9ibGFzdDtVcml0c2tpeSA6IDEgOiA3MTkuNDAwMDIKK1RvdWxza2HvYSBvYmxhc3Q7RWZyZW1vdiA6IDEgOiAxLjAKK0JyeWFuc2th72Egb2JsYXN0O0dvcmRleWV2c2tpeSA6IDEgOiA4NDIuMjAwMDEKK09ybG92c2th72Egb2JsYXN0O05vdm9kZXJldmVua292c2tpeSA6IDEgOiA4OTMuNDAwMDIKK0JyeWFuc2th72Egb2JsYXN0O05hdmxpbnNraXkgOiAxIDogMTk3Ni4zCitPcmxvdnNrYe9hIG9ibGFzdDtaYWxlZ29zY2hlbnNraXkgOiAxIDogMTA0Ni41CitPcmxvdnNrYe9hIG9ibGFzdDtTaGFibHlraW5za2l5IDogMSA6IDk0OC4yMDAwMQorT3Jsb3Zza2HvYSBvYmxhc3Q7T3J5b2wgOiAxIDogOTEuOTAwMDAyCitCcnlhbnNrYe9hIG9ibGFzdDtVbmVjaHNraXkgOiAxIDogMTA3Ni45CitPcmxvdnNrYe9hIG9ibGFzdDtWZXJraG92c2tpeSA6IDEgOiAxMDk1LjUKK0JyeWFuc2th72Egb2JsYXN0O0tsaW50c292c2tpeSA6IDEgOiAxMzI1LjgKK09ybG92c2th72Egb2JsYXN0O0tyYXNub3pvcmVuc2tpeSA6IDEgOiA2MjYuNQorT3Jsb3Zza2HvYSBvYmxhc3Q7U29za292c2tpeSA6IDEgOiA1NzkuNQorQnJ5YW5za2HvYSBvYmxhc3Q7VHJ1YmNoZXZza2l5IDogMSA6IDE3MDMuMworT3Jsb3Zza2HvYSBvYmxhc3Q7U3ZlcmRsb3Zza2l5IDogMSA6IDExMTMuNAorT3Jsb3Zza2HvYSBvYmxhc3Q7S3JvbXNraXkgOiAxIDogMTAzMi4zCitCcnlhbnNrYe9hIG9ibGFzdDtCcmFzb3Zza2l5IDogMSA6IDExNzMuNgorQnJ5YW5za2HvYSBvYmxhc3Q7S2xpbnRzeSA6IDEgOiAxLjAKK09ybG92c2th72Egb2JsYXN0O1Bva3JvdnNraXkgOiAxIDogMTM3My4zCitCcnlhbnNrYe9hIG9ibGFzdDtOb3Zvenlia292c2tpeSA6IDEgOiAxMzg4LjYKK0JyeWFuc2th72Egb2JsYXN0O1N0YXJvZHVic2tpeSA6IDEgOiAxNzAyLjIKK0JyeWFuc2th72Egb2JsYXN0O1BvZ2Fyc2tpeSA6IDEgOiAxMDk5LjIKK09ybG92c2th72Egb2JsYXN0O0RtaXRyb3Zza2l5IDogMSA6IDEyNTkuMworT3Jsb3Zza2HvYSBvYmxhc3Q7TGl2ZW5za2l5IDogMSA6IDE4MTcuOAorQnJ5YW5za2HvYSBvYmxhc3Q7U3V6ZW1za2l5IDogMSA6IDEyODMuOQorT3Jsb3Zza2HvYSBvYmxhc3Q7R2xhenVub3Zza2l5IDogMSA6IDU4My4yMDAwMQorT3Jsb3Zza2HvYSBvYmxhc3Q7TWFsb2Fya2hhbmdlbHNraXkgOiAxIDogODgyLjc5OTk5CitCcnlhbnNrYe9hIG9ibGFzdDtOb3Zvenlia292IDogMSA6IDEuMAorQnJ5YW5za2HvYSBvYmxhc3Q7S2xpbW92c2tpeSA6IDEgOiAxMTk5LjgKK0JyeWFuc2th72Egb2JsYXN0O0tvbWFyaWNoc2tpeSA6IDEgOiA5MTkuMjk5OTkKK09ybG92c2th72Egb2JsYXN0O1Ryb3NueWFuc2tpeSA6IDEgOiA2MzguNzk5OTkKK09ybG92c2th72Egb2JsYXN0O0xpdm55IDogMSA6IDIxLjAKK0JyeWFuc2th72Egb2JsYXN0O1pseW5rb3Zza2l5IDogMSA6IDc2NS41CitPcmxvdnNrYe9hIG9ibGFzdDtLb2xwbnlhbnNraXkgOiAxIDogMTA5My4xCitCcnlhbnNrYe9hIG9ibGFzdDtTZXZza2l5IDogMSA6IDExMzAuOAorT3Jsb3Zza2HvYSBvYmxhc3Q7RG9semhhbnNraXkgOiAxIDogMTI4NC40CitSVS1VTkstMjg2NyA6IDEgOiAxLjIKK1JVLVVOSy0yODY4IDogMSA6IDIuOAorUlUtVU5LLTI4NjkgOiAxIDogMS4wCitSVS1VTkstMjg3MCA6IDEgOiAxLjAKK1JVLVVOSy0yODcxIDogMSA6IDEuMAorUlUtVU5LLTI4NzIgOiAxIDogMzYuNzk5OTk5CitSVS1VTkstMjg3MyA6IDEgOiAyLjA5OTk5OTkKK1JVLVVOSy0yODc0IDogMSA6IDEuMAorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztWeWJvcmdza2l5IDogMSA6IDY0MjcuMjAwMgorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztQb2Rwb3Jvemhza2l5IDogMSA6IDcyNjIuMzk5OQorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztQcmlvemVyc2tpeSA6IDEgOiA0MjUwLjUKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7UHJpb3plcnNrIDogMSA6IDEuMAorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztMb2RleW5vcG9sc2tpeSA6IDEgOiA1ODk4LjAKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7UG9kcG9yb3poeWUgOiAxIDogMS41CitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO0xvZGV5bm95ZSBQb2xlIDogMSA6IDMuMAorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztWeWJvcmcgOiAxIDogMS4zCitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO1ZvbGtob3Zza2l5IDogMSA6IDczNDUuMzk5OQorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztWc2V2b2x6aHNraXkgOiAxIDogMzM1OC44OTk5CitTYW5rdC1QZXRlcmJ1cmc7U2Fua3QtUGV0ZXJzYnVyZyA6IDEgOiAxMjEyLjIKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7VGlraHZpbnNraXkgOiAxIDogODAzMC43MDAyCitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO0xvbW9ub3NvdnNraXkgOiAxIDogMTY0Ni42CitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO0Jva3NpdG9nb3Jza2l5IDogMSA6IDYzODQuODk5OQorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztWc2V2b2xvemhzayA6IDEgOiAxLjMKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7S2lyb3Zza2l5IDogMSA6IDIxNTQuMTAwMQorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztTb3Nub3Z5aSBCb3IgOiAxIDogMS4wCitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO0tpbmdpc2VwcHNraXkgOiAxIDogMjU5My4yCitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO1ZvbGtob3YgOiAxIDogMS41CitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO0tpcm92c2sgOiAxIDogMS4wCitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO0tpcmlzaHNraXkgOiAxIDogMjUzMi41CitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO1Rvc25lbnNraXkgOiAxIDogMzkwMC42MDAxCitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO0dhdGNoaW5za2l5IDogMSA6IDIxMTUuNworTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztWb2xvc292c2tpeSA6IDEgOiAyMDgzLjM5OTkKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7VGlraHZpbiA6IDEgOiAyLjUKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7R2F0Y2hpbmEgOiAxIDogMS42CitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO1Rvc25vIDogMSA6IDEuMAorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztCb2tzaXRvZ29yc2sgOiAxIDogMS45CitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO0l2YW5nb3JvZCA6IDEgOiAxLjAKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7S2luZ2lzZXBwIDogMSA6IDEuMAorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztQaWthbGV2byA6IDEgOiAzLjA5OTk5OTkKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7U2xhbnRzZXZza2l5IDogMSA6IDI0NzguMTAwMQorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztLaXJpc2hpIDogMSA6IDEuMgorTm92Z29yb2Rza2HvYSBvYmxhc3Q7Q2h1ZG92c2tpeSA6IDEgOiAyMzc3LjgKK05vdmdvcm9kc2th72Egb2JsYXN0O0x5dWJ5dGluc2tpeSA6IDEgOiA0MzU2LjcwMDIKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7THV6aHNraXkgOiAxIDogNjcwNC4yOTk4CitOb3Znb3JvZHNrYe9hIG9ibGFzdDtLaHZveW5pbnNraXkgOiAxIDogMzIwOC41CitOb3Znb3JvZHNrYe9hIG9ibGFzdDtNYWxvdmlzaGVyc2tpeSA6IDEgOiAzMzQ1LjUKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7U2xhbnRzeSA6IDEgOiAxLjIKK05vdmdvcm9kc2th72Egb2JsYXN0O05vdmdvcm9kc2tpeSA6IDEgOiA0NzI5Ljc5OTgKK1Bza292c2th72Egb2JsYXN0O0dkb3Zza2l5IDogMSA6IDI5ODYuMAorUHNrb3Zza2HvYSBvYmxhc3Q7UGx5dXNza2l5IDogMSA6IDIyMTYuNQorTm92Z29yb2Rza2HvYSBvYmxhc3Q7QmF0ZXRza2l5IDogMSA6IDE3NDEuMQorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztMdWdhIDogMSA6IDEuMAorTm92Z29yb2Rza2HvYSBvYmxhc3Q7UGVzdG92c2tpeSA6IDEgOiAxOTM5LjQKK05vdmdvcm9kc2th72Egb2JsYXN0O0Jvcm92aWNoc2tpeSA6IDEgOiAzMDAzLjUKK05vdmdvcm9kc2th72Egb2JsYXN0O01vc2hlbnNraXkgOiAxIDogMy4wOTk5OTk5CitOb3Znb3JvZHNrYe9hIG9ibGFzdDtPa3Vsb3Zza2l5IDogMSA6IDI0MDEuNQorTm92Z29yb2Rza2HvYSBvYmxhc3Q7Tm92Z29yb2QgOiAxIDogMTI3LjUKK1Bza292c2th72Egb2JsYXN0O1N0cnVnby1LcmFzbmVuc2tpeSA6IDEgOiAzMjAzLjgKK05vdmdvcm9kc2th72Egb2JsYXN0O0tyZXN0ZXRza2l5IDogMSA6IDI4NTMuMworTm92Z29yb2Rza2HvYSBvYmxhc3Q7U2hpbXNraXkgOiAxIDogMTg4My4wCitOb3Znb3JvZHNrYe9hIG9ibGFzdDtCb3JvdmljaGkgOiAxIDogNDEuOTAwMDAyCitQc2tvdnNrYe9hIG9ibGFzdDtQc2tvdnNraXkgOiAxIDogMzYyMi44OTk5CitOb3Znb3JvZHNrYe9hIG9ibGFzdDtTb2xldHNraXkgOiAxIDogMTQwMi42CitOb3Znb3JvZHNrYe9hIG9ibGFzdDtTdGFyb3J1c3NraXkgOiAxIDogMzI5OC44CitOb3Znb3JvZHNrYe9hIG9ibGFzdDtQYXJmaW5vIDogMSA6IDE1NDYuMQorTm92Z29yb2Rza2HvYSBvYmxhc3Q7VmFsZGF5c2tpeSA6IDEgOiAyNDkzLjUKK1Bza292c2th72Egb2JsYXN0O1Bvcmtob3Zza2l5IDogMSA6IDMwMzguOAorTm92Z29yb2Rza2HvYSBvYmxhc3Q7RGVteWFuc2tpeSA6IDEgOiAzMjA3Ljg5OTkKK05vdmdvcm9kc2th72Egb2JsYXN0O1ZvbG90b3Zza2l5IDogMSA6IDEyMjUuNworTm92Z29yb2Rza2HvYSBvYmxhc3Q7U3RhcmF5YSBSdXNzYSA6IDEgOiAyOC4yMDAwMDEKK1Bza292c2th72Egb2JsYXN0O1BlY2hvcnNraXkgOiAxIDogMTE0My44CitQc2tvdnNrYe9hIG9ibGFzdDtEbm92c2tpeSA6IDEgOiAxMDQwLjUKK1Bza292c2th72Egb2JsYXN0O1Bza292IDogMSA6IDUuMAorTm92Z29yb2Rza2HvYSBvYmxhc3Q7UG9kZG9yc2tpeSA6IDEgOiAyNzc3LjIKK1Bza292c2th72Egb2JsYXN0O1BhbGtpbnNraXkgOiAxIDogMTIxNC4yCitQc2tvdnNrYe9hIG9ibGFzdDtEZWRvdmljaGVza2l5IDogMSA6IDIzMjUuMgorUHNrb3Zza2HvYSBvYmxhc3Q7T3N0cm92c2tpeSA6IDEgOiAyNTc2LjgKK05vdmdvcm9kc2th72Egb2JsYXN0O01hcmV2c2tpeSA6IDEgOiAxNjE1LjgKK1Bza292c2th72Egb2JsYXN0O0Jlemhhbml0c2tpeSA6IDEgOiAzNTc1LjAKK1Bza292c2th72Egb2JsYXN0O1B5dGFsb3Zza2l5IDogMSA6IDExMzUuNgorTm92Z29yb2Rza2HvYSBvYmxhc3Q7S2hvbG1za2l5IDogMSA6IDIyODYuOAorUHNrb3Zza2HvYSBvYmxhc3Q7Tm92b3J6aGV2c2tpeSA6IDEgOiAxNzExLjQKK1Bza292c2th72Egb2JsYXN0O09zdHJvdiA6IDEgOiAzLjU5OTk5OTkKK1Bza292c2th72Egb2JsYXN0O0xva255YW5za2l5IDogMSA6IDIxNTAuOAorUHNrb3Zza2HvYSBvYmxhc3Q7UHVzaGtpbm8tR29yc2tpeSA6IDEgOiA5ODAuNDAwMDIKK1Bza292c2th72Egb2JsYXN0O0tyYXNub2dvcm9kc2tpeSA6IDEgOiAxMzU3LjQKK1Bza292c2th72Egb2JsYXN0O09wb2NoZW5za2l5IDogMSA6IDE5MTAuNworUHNrb3Zza2HvYSBvYmxhc3Q7VmVsaWtvbHVrc2tpeSA6IDEgOiAzMDA0LjYwMDEKK1Bza292c2th72Egb2JsYXN0O05vdm9zb2tvbG5pY2hlc2tpeSA6IDEgOiAxNzg0LjYKK1Bza292c2th72Egb2JsYXN0O1B1c3Rvc2hraW5za2l5IDogMSA6IDIwMDEuNQorUHNrb3Zza2HvYSBvYmxhc3Q7U2ViZXpoc2tpeSA6IDEgOiAyOTM0LjMKK1Bza292c2th72Egb2JsYXN0O0t1bnlpbnNraXkgOiAxIDogMjkwMy4yCitQc2tvdnNrYe9hIG9ibGFzdDtWZWxpa2llIEx1a2kgOiAxIDogOC4xMDAwMDA0CitQc2tvdnNrYe9hIG9ibGFzdDtOZXZlbHNraXkgOiAxIDogMjU1NC4yCitQc2tvdnNrYe9hIG9ibGFzdDtVc3Z5YXRza2l5IDogMSA6IDEwMTYuNgorUm9zdG92c2th72Egb2JsYXN0O1ZlcmtobmVkb25za295IDogMSA6IDI3NDcuMAorUm9zdG92c2th72Egb2JsYXN0O1Nob2xva2hvdnNraXkgOiAxIDogMzQwNC4zCitSb3N0b3Zza2HvYSBvYmxhc3Q7Q2hlcnRrb3Zza2l5IDogMSA6IDIyNTUuMAorUm9zdG92c2th72Egb2JsYXN0O0Jva292c2tpeSA6IDEgOiAyMDEzLjUKK1Jvc3RvdnNrYe9hIG9ibGFzdDtLYXNoYXJza2l5IDogMSA6IDMwNTIuNQorUm9zdG92c2th72Egb2JsYXN0O01pbGxlcm92c2tpeSA6IDEgOiAzMTY5LjMKK1Jvc3RvdnNrYe9hIG9ibGFzdDtTb3ZldHNraXkgOiAxIDogMTU4NC43CitSb3N0b3Zza2HvYSBvYmxhc3Q7TWlsbGVyb3ZvIDogMSA6IDgzLjMwMDAwMworUm9zdG92c2th72Egb2JsYXN0O01pbHl1dGluc2tpeSA6IDEgOiAyMTcxLjUKK1Jvc3RvdnNrYe9hIG9ibGFzdDtPYmxpdnNraXkgOiAxIDogMTc4Ni43CitSb3N0b3Zza2HvYSBvYmxhc3Q7VGFyYXNvdnNraXkgOiAxIDogMjY5OC44CitSb3N0b3Zza2HvYSBvYmxhc3Q7S2FtZW5za2l5IDogMSA6IDI3NTMuMzk5OQorUm9zdG92c2th72Egb2JsYXN0O0JlbG9rYWxpdHZpbnNraXkgOiAxIDogMjM2Ni44CitSb3N0b3Zza2HvYSBvYmxhc3Q7VGF0c3luc2tpeSA6IDEgOiAyMDI0LjIKK1Jvc3RvdnNrYe9hIG9ibGFzdDtNb3Jvem92c2tpeSA6IDEgOiAyOTc0LjAKK1Jvc3RvdnNrYe9hIG9ibGFzdDtEb25ldHNrIDogMSA6IDk1LjQwMDAwMgorUm9zdG92c2th72Egb2JsYXN0O0thbWVuc2stU2hha2h0aW5za2l5IDogMSA6IDEzNS4zOTk5OQorUm9zdG92c2th72Egb2JsYXN0O0JlbGF5YSBLYWxpdHZhIDogMSA6IDIxLjI5OTk5OQorUm9zdG92c2th72Egb2JsYXN0O0tyYXNub3N1bGluc2tpeSA6IDEgOiAyMDU5LjgKK1Jvc3RvdnNrYe9hIG9ibGFzdDtHdWtvdm8gOiAxIDogNTMuMDk5OTk4CitSb3N0b3Zza2HvYSBvYmxhc3Q7VHN5bWx5YW5za2l5IDogMSA6IDE3NzcuMQorUm9zdG92c2th72Egb2JsYXN0O1p2ZXJldm8gOiAxIDogMS44CitSb3N0b3Zza2HvYSBvYmxhc3Q7S29uc3RhbnRpbm92c2tpeSA6IDEgOiAyMDMxLjQKK1Jvc3RvdnNrYe9hIG9ibGFzdDtLcmFzbnlpIFN1bGluIDogMSA6IDE2NC41CitSb3N0b3Zza2HvYSBvYmxhc3Q7VXN0LURvbmV0c2tpeSA6IDEgOiAxNDUyLjUKK1Jvc3RvdnNrYe9hIG9ibGFzdDtSb2Rpb25vdm8tTmVzdmV0YXlza2l5IDogMSA6IDE2OTkuOAorUm9zdG92c2th72Egb2JsYXN0O0t1eWJ5c2hldnNraXkgOiAxIDogOTU5LjU5OTk4CitSb3N0b3Zza2HvYSBvYmxhc3Q7Tm92b3NoYWtodGluc2sgOiAxIDogMTU5LjYwMDAxCitSb3N0b3Zza2HvYSBvYmxhc3Q7T2t0eWFicnNraXkgOiAxIDogMTkyNS4wCitSb3N0b3Zza2HvYSBvYmxhc3Q7U2hha2h0eSA6IDEgOiAxNjkuNworUm9zdG92c2th72Egb2JsYXN0O01hdHZleWV2by1LdXJnYW5za2l5IDogMSA6IDE3NDMuMQorUm9zdG92c2th72Egb2JsYXN0O0R1Ym92c2tpeSA6IDEgOiA0MTE4LjIwMDIKK1Jvc3RvdnNrYe9hIG9ibGFzdDtWb2xnb2RvbnNraXkgOiAxIDogMTQ2MC40CitSb3N0b3Zza2HvYSBvYmxhc3Q7U2VtaWthcmFrb3Jza2l5IDogMSA6IDEyNTkuNQorUm9zdG92c2th72Egb2JsYXN0O05la2xpbm92c2tpeSA6IDEgOiAyMTI1LjcKK1Jvc3RvdnNrYe9hIG9ibGFzdDtWb2xnb2RvbnNrIDogMSA6IDUuMAorUm9zdG92c2th72Egb2JsYXN0O1phdmV0aW5za2l5IDogMSA6IDQ1MzIuNzk5OAorUm9zdG92c2th72Egb2JsYXN0O0Frc2F5c2tpeSA6IDEgOiAxMjI5LjgKK1Jvc3RvdnNrYe9hIG9ibGFzdDtNeWFzbmlrb3Zza2l5IDogMSA6IDczNC43OTk5OQorUm9zdG92c2th72Egb2JsYXN0O05vdm9jaGVya2Fzc2sgOiAxIDogMTIwLjYKK1Jvc3RvdnNrYe9hIG9ibGFzdDtNYXJ0eW5vdnNraXkgOiAxIDogMTkzMC4xCitSb3N0b3Zza2HvYSBvYmxhc3Q7Wmltb3ZuaWtvdnNraXkgOiAxIDogNDY1OC42MDAxCitSb3N0b3Zza2HvYSBvYmxhc3Q7QmFnYXlldnNraXkgOiAxIDogMTA4My4xCitSb3N0b3Zza2HvYSBvYmxhc3Q7Um9zdG92LW5hLURvbnkgOiAxIDogMzg0Ljc5OTk5CitSb3N0b3Zza2HvYSBvYmxhc3Q7VmVzZWxvdnNraXkgOiAxIDogMTE1Ni4yCitSb3N0b3Zza2HvYSBvYmxhc3Q7VGFnYW5yb2cgOiAxIDogNzYuMDk5OTk4CitSb3N0b3Zza2HvYSBvYmxhc3Q7QXpvdnNraXkgOiAxIDogMjc1MS41CitSb3N0b3Zza2HvYSBvYmxhc3Q7UHJvbGV0YXJza2l5IDogMSA6IDE4NTAuOQorUm9zdG92c2th72Egb2JsYXN0O0JhdGF5c2sgOiAxIDogNzkuOTAwMDAyCitSb3N0b3Zza2HvYSBvYmxhc3Q7T3Jsb3Zza2l5IDogMSA6IDMxMjMuNjAwMQorUm9zdG92c2th72Egb2JsYXN0O0F6b3YgOiAxIDogNTcuNzk5OTk5CitSb3N0b3Zza2HvYSBvYmxhc3Q7S2FnYWxuaXRza2l5IDogMSA6IDEyMDMuMgorUm9zdG92c2th72Egb2JsYXN0O1plcm5vZ3JhZHNraXkgOiAxIDogMjg4Mi4zOTk5CitSb3N0b3Zza2HvYSBvYmxhc3Q7U2Fsc2tpeSA6IDEgOiAyOTc2LjM5OTkKK1Jvc3RvdnNrYe9hIG9ibGFzdDtUc2VsaW5za2l5IDogMSA6IDIxNjQuNjAwMQorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtTY2hlcmJpbm92c2tpeSA6IDEgOiAxNDIwLjAKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7S3VzY2hldnNraXkgOiAxIDogMjQ0Ni4zOTk5CitSb3N0b3Zza2HvYSBvYmxhc3Q7UmVtb250bmVuc2tpeSA6IDEgOiAzNDcwLjM5OTkKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7WWV5c2sgOiAxIDogMTIwLjcKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7WWV5c2tpeSA6IDEgOiAyMTg3LjcKK1Jvc3RvdnNrYe9hIG9ibGFzdDtZZWdvcmx5a3NraXkgOiAxIDogMTIxMC42CitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO1N0YXJvbWluc2tpeSA6IDEgOiAxMjQxLjEKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7S3J5bG92c2tpeSA6IDEgOiAxMTk2LjIKK1Jvc3RvdnNrYe9hIG9ibGFzdDtTYWxzayA6IDEgOiA0MS40MDAwMDIKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7TGVuaW5ncmFkc2tpeSA6IDEgOiAxNjA1LjMKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7S2FuZXZza2l5IDogMSA6IDI0NDEuMzk5OQorUm9zdG92c2th72Egb2JsYXN0O1Blc2NoYW5va29wc2tpeSA6IDEgOiAxNzkyLjkKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7Tm92b3Bva3JvdnNraXkgOiAxIDogMjMxNi41CitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0JlbG9nbGluc2tpeSA6IDEgOiAxMjIzLjUKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7UGF2bG92c2tpeSA6IDEgOiAxODc2LjIKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7QXBhbmFzZW5rb3Zza2l5IDogMSA6IDMyMjUuODk5OQorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtQcmltb3Jza28tQWtodGFyc2tpeSA6IDEgOiAyNzA1LjgKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7SXBhdG92c2tpeSA6IDEgOiAzOTgzLjMKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7VGlraG9yZXRza2l5IDogMSA6IDE4MzIuNQorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtCcnl1a2hvdmV0c2tpeSA6IDEgOiAxNDQxLjkKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7S3Jhc25vZ3ZhcmRleXNraXkgOiAxIDogMjA3OC44OTk5CitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO1Rpa2hvcmV0emsgOiAxIDogMjcuMQorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtWeXNlbGtvdnNraXkgOiAxIDogMTcyMC44CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO1RydW5vdnNraXkgOiAxIDogMTg0Mi44CitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0tvcmVub3Zza2l5IDogMSA6IDExNjEuMAorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtLYWxpbmluc2tpeSA6IDEgOiAxNTM1LjQKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7Tm92b2FsZWtzYW5kcm92c2tpeSA6IDEgOiAyMTEwLjAKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7VGltYXNoZXZza2l5IDogMSA6IDE0MzEuNAorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtTbGF2eWFuc2tpeSA6IDEgOiAyMDQzLjYKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7VHVya21lbnNraXkgOiAxIDogMzEzNC43CitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0thdmthenNraXkgOiAxIDogMTA4Ni4wCitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO0l6b2JpbG5lbnNraXkgOiAxIDogMTg3OC42CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO0Fyemdpcnpza2l5IDogMSA6IDMxOTcuODk5OQorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtUYmlsaXNza2l5IDogMSA6IDExMzIuNAorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtQZXRyb3Zza2l5IDogMSA6IDI3MjguNworS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtLcmFzbm9hcm1leXNraXkgOiAxIDogMTg5OC4yCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0tyYXNub2RhciA6IDEgOiAyNTUuNQorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtLcm9wb3RraW4gOiAxIDogOTIuMTk5OTk3CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO0dyYWNoZXZza2l5IDogMSA6IDE0ODUuOAorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtUZW1yeXVrc2tpeSA6IDEgOiAyMDMzLjkKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7VXN0LUxhYmluc2tpeSA6IDEgOiAxNTA1LjAKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7TGV2b2t1bXNraXkgOiAxIDogNDUxMS4yMDAyCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0d1bGtldmljaHNraXkgOiAxIDogMTU5OC4yCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0RpbnNraXkgOiAxIDogMTQzOC40CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO0JsYWdvZGFybmVuc2tpeSA6IDEgOiAxODIwLjgKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7U2hwYWtvdnNraXkgOiAxIDogMjM4NS42MDAxCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO1NsYXZ5YW5zay1OYS1LdWJhbmkgOiAxIDogMjU0LjAKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7Tm92b2t1YmFuc2tpeSA6IDEgOiAxODE5LjYKK1Jlc3BvdWJsaWthIEFkeWdl72E7S3Jhc25vZ3ZhcmRleXNraXkgOiAxIDogNTk3LjU5OTk4CitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0t1cmdhbmluc2tpeSA6IDEgOiAxNTM5LjYKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7QW5hcHNraXkgOiAxIDogODAzLjAKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7U3RhdnJvcG9sIDogMSA6IDI1Ny4zOTk5OQorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtLcnltc2tpeSA6IDEgOiAxNjYxLjQKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7QWJpbnNraXkgOiAxIDogMTgxMi4wCitSZXNwb3VibGlrYSBBZHlnZe9hO1Nob3ZnZW5vdnNraXkgOiAxIDogNTU0LjU5OTk4CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO0J1ZGVubm92c2tpeSA6IDEgOiAyOTc3Ljg5OTkKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7QXJtYXZpciA6IDEgOiAyNTAuODk5OTkKK1Jlc3BvdWJsaWthIEFkeWdl72E7VGFraHRhbXVrYXlza2l5IDogMSA6IDQ1NS4wCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0FuYXBhIDogMSA6IDY5LjMwMDAwMworS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtTZXZlcnNraXkgOiAxIDogMjI3OC43CitSZXNwb3VibGlrYSBBZHlnZe9hO0tvc2hla2hhYmxza2l5IDogMSA6IDQ2MC4yOTk5OQorUmVzcG91Ymxpa2EgQWR5Z2XvYTtUZXVjaGV6aHNraXkgOiAxIDogNDg4LjYwMDAxCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO1VzcGVuc2tpeSA6IDEgOiA5MTQuMjAwMDEKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7S29jaHViZXlldnNraXkgOiAxIDogMjU3My4zOTk5CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO0FsZWtzYW5kcm92c2tpeSA6IDEgOiAxODIzLjQKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7TmVmdGVrdW1za2l5IDogMSA6IDM4OTAuMzk5OQorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtBbmRyb3BvdnNraXkgOiAxIDogMjU5Mi41CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO05vdm9zZWxpdHNraXkgOiAxIDogMjAzNC4xCitEYWdlc3RhbjtOb2dheXNraXkgOiAxIDogODYwNy43MDAyCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0JlbG9yZWNobnNraXkgOiAxIDogMTI5OC42CitEYWdlc3RhbjtUYXJ1bW92c2tpeSA6IDEgOiAzMDI4LjM5OTkKK1Jlc3BvdWJsaWthIEFkeWdl72E7R2lhZ2luc2tpeSA6IDEgOiA4NTAuNzAwMDEKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7Tm92b3Jvc3NpeXNrIDogMSA6IDU2MS4wOTk5OAorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtLcnltc2sgOiAxIDogNC41OTk5OTk5CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO0J1ZGVubm92c2sgOiAxIDogNjEuNQorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtHb3J5YWNoaXkgS2x5dWNoIDogMSA6IDE2ODEuMAorUlUtVU5LLTI4NzUgOiAxIDogMy44CitSZXNwb3VibGlrYSBBZHlnZe9hO01heWtvcHNraXkgOiAxIDogNDE3NS43OTk4CitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0JlbG9yZWNoZW5zayA6IDEgOiA0Ni4yOTk5OTkKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7R2VsZW5kemhpayA6IDEgOiA4ODMuMDk5OTgKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7TGFiaW5zayA6IDEgOiA2Ni4xOTk5OTcKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7TGFiaW5za2l5IDogMSA6IDE1OTMuMAorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtNb3N0b3Zza2l5IDogMSA6IDMzNjAuNQorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtOZXZpbm5vbXlzc2sgOiAxIDogODYuNjk5OTk3CitSVS1VTkstMjg3NiA6IDEgOiAzLjgKK1Jlc3BvdWJsaWthIEFkeWdl72E7TWF5a29wIDogMSA6IDMuMworS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtBcHNoZXJvbnNraXkgOiAxIDogMjQ2Mi44CitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO090cmFkbmVuc2tpeSA6IDEgOiAyNDQ5LjgKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7R2VvcmdpeWV2c2tpeSA6IDEgOiAxOTIxLjIKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7U292ZXRza2l5IDogMSA6IDE4MzQuOAorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtNaW5lcmFsb3ZvZHNraXkgOiAxIDogMTUzNi45CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO1N0ZXBub3Zza2l5IDogMSA6IDE3MzMuNworS2FyYXRjaGFldm8tVGNoZXJrZXNza2HvYTtBZHlnZS1LaGFibHNraXkgOiAxIDogNjA5LjAKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7VHVhcHNpbnNraXkgOiAxIDogMjA0Mi42CitLYXJhdGNoYWV2by1UY2hlcmtlc3NrYe9hO1ByaWt1YmFuc2tpeSA6IDEgOiAxMDQwLjAKK0RhZ2VzdGFuO0tpemx5YXJza2l5IDogMSA6IDM0MjAuMzk5OQorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtQcmVkZ29ybnlpIDogMSA6IDIyMDcuMgorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtLdXJza2l5IDogMSA6IDM4OTQuNjAwMQorS2FyYXRjaGFldm8tVGNoZXJrZXNza2HvYTtDaGVya2Vzc2sgOiAxIDogNzAuMDk5OTk4CitLYXJhdGNoYWV2by1UY2hlcmtlc3NrYe9hO0toYWJlenNraXkgOiAxIDogNzU0LjIwMDAxCitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO01pbmVyYWxuaXllIFZvZHkgOiAxIDogNjguNQorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtHZW9yZ2l5ZXZzayA6IDEgOiAyNi4yOTk5OTkKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7S2lyb3Zza2l5IDogMSA6IDE0MDkuMQorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtaaGVsZXpub3ZvZHNrIDogMSA6IDg2LjUKK0thcmF0Y2hhZXZvLVRjaGVya2Vzc2th72E7VXN0LUR6aGVndXRpbnNraXkgOiAxIDogOTk2LjkwMDAyCitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO0xlcm1vbnRvdiA6IDEgOiAyNy4yMDAwMDEKK0thcmF0Y2hhZXZvLVRjaGVya2Vzc2th72E7WmVsZW5jaHVnc2tpeSA6IDEgOiAyODMwLjg5OTkKK0thcmF0Y2hhZXZvLVRjaGVya2Vzc2th72E7VXJ1cHNraXkgOiAxIDogMzEyMi41CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO1B5YXRpZ29yc2sgOiAxIDogNTIuOTAwMDAyCitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO1llc3NlbnR1a2kgOiAxIDogMzkuOTAwMDAyCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO1NvY2hpIDogMSA6IDMyOTcuNjAwMQorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtUdWFwc2UgOiAxIDogNC4wCitLYXJhdGNoYWV2by1UY2hlcmtlc3NrYe9hO01hbG9rYXJhY2hheWV2c2tpeSA6IDEgOiAxMTA5LjMKK1RjaGV0Y2hlbmlhKjtOYXVyc2tpeSA6IDEgOiAyMDY2LjMKK0thYmFyZGluby1CYWxrYXJpYTtQcm9raGxhZG5lbnNraXkgOiAxIDogMTQzNS43CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO0tpc2xvdm9kc2sgOiAxIDogNTEuNzAwMDAxCitUY2hldGNoZW5pYSo7U2hlbGtvdnNraXkgOiAxIDogMjY4Ni4zOTk5CitLYWJhcmRpbm8tQmFsa2FyaWE7Wm9sc2tpeSA6IDEgOiAyNDM5LjMKK0RhZ2VzdGFuO01ha2hhY2hrYWxhIDogMSA6IDgxMi4wOTk5OAorS2FyYXRjaGFldm8tVGNoZXJrZXNza2HvYTtLYXJhY2hheWV2c2tpeSA6IDEgOiAzODA5Ljg5OTkKK0RhZ2VzdGFuO0JhYmF5dXJ0b3Zza2l5IDogMSA6IDI5MjMuNworRGFnZXN0YW47S2l6bHlhciA6IDEgOiA1OS41CitLYWJhcmRpbm8tQmFsa2FyaWE7QmFrc2Fuc2tpeSA6IDEgOiAxNjI5LjUKK1NldmVyby1Pc2V0aW5za2HvYSByZXNwb3U7TW96ZG9rc2tpeSA6IDEgOiAxMjUwLjQKK0thcmF0Y2hhZXZvLVRjaGVya2Vzc2th72E7S2FyYWNoYXlldnNrIDogMSA6IDEyLjMKK0thYmFyZGluby1CYWxrYXJpYTtUZXJza2l5IDogMSA6IDg1OC43OTk5OQorS2FiYXJkaW5vLUJhbGthcmlhO1Byb2tobGFkbnlpIDogMSA6IDM2LjkwMDAwMgorS2FiYXJkaW5vLUJhbGthcmlhO01heXNraXkgOiAxIDogMzM2LjI5OTk5CitUY2hldGNoZW5pYSo7TmFkdGVyZWNobnlpIDogMSA6IDEwMTcuNAorS2FiYXJkaW5vLUJhbGthcmlhO1VydmFuc2tpeSA6IDEgOiAxMTc4LjQKK0thYmFyZGluby1CYWxrYXJpYTtDaGVnZW1za2l5IDogMSA6IDEzNjkuMworSW5nb3VjaGV0aWEqO01hbGdvYmVrc2tpeSA6IDEgOiA2MzcuMjAwMDEKK1RjaGV0Y2hlbmlhKjtHcm96bmVuc2tpeSA6IDEgOiAxNDE0LjEKK0RhZ2VzdGFuO0toYXNhdnl1cnRvdnNraXkgOiAxIDogMTU2Ny44CitSVS1VTkstMjg3NyA6IDEgOiAxNDAuNworSW5nb3VjaGV0aWEqO1N1bnpoZW5za2l5IDogMSA6IDE4MTEuMworS2FiYXJkaW5vLUJhbGthcmlhO1NvdmV0c2tpeSA6IDEgOiAxOTg1LjkKK0luZ291Y2hldGlhKjtNYWxnb2JlayA6IDEgOiAxLjAKK1RjaGV0Y2hlbmlhKjtHdWRlcm1lc3NraXkgOiAxIDogNjgxLjI5OTk5CitLYWJhcmRpbm8tQmFsa2FyaWE7VHlybnlhdXogOiAxIDogODYzLjc5OTk5CitTZXZlcm8tT3NldGluc2th72EgcmVzcG91O0tpcm92c2tpeSA6IDEgOiA0MTYuMjk5OTkKK1RjaGV0Y2hlbmlhKjtHcm96bnlpIDogMSA6IDI5My4yMDAwMQorU2V2ZXJvLU9zZXRpbnNrYe9hIHJlc3BvdTtQcmF2b2JlcmV6aG55aSA6IDEgOiA1MzkuMDk5OTgKK0luZ291Y2hldGlhKjtOYXpyYW5vdnNraXkgOiAxIDogNDkxLjUKK0RhZ2VzdGFuO0tpemlseXVydG92c2tpeSA6IDEgOiAxMzczLjUKK1RjaGV0Y2hlbmlhKjtBY2hraG95LU1hcnRhbm92c2tpeSA6IDEgOiA5MjcuMAorVGNoZXRjaGVuaWEqO0d1ZGVybWVzIDogMSA6IDEuMAorVGNoZXRjaGVuaWEqO1NoYWxpbnNraXkgOiAxIDogOTYxLjkwMDAyCitUY2hldGNoZW5pYSo7QXJndW4gOiAxIDogMS4wCitTZXZlcm8tT3NldGluc2th72EgcmVzcG91O1ByaWdvcm9kbnlpIDogMSA6IDEzMjQuNQorU2V2ZXJvLU9zZXRpbnNrYe9hIHJlc3BvdTtJcmFmc2tpeSA6IDEgOiA5ODIuNQorRGFnZXN0YW47S2hhc2F2eXVydCA6IDEgOiAzMi43OTk5OTkKK1NldmVyby1Pc2V0aW5za2HvYSByZXNwb3U7RGlnb3Jza2l5IDogMSA6IDYwNy43OTk5OQorU2V2ZXJvLU9zZXRpbnNrYe9hIHJlc3BvdTtBcmRvbnNraXkgOiAxIDogNDA2LjYwMDAxCitEYWdlc3RhbjtOb3ZvbGFrc2tpeSA6IDEgOiAyNjMuODk5OTkKK0RhZ2VzdGFuO0tpemlseXVydCA6IDEgOiA4NS45MDAwMDIKK1RjaGV0Y2hlbmlhKjtVcnVzLU1hcnRhbm92c2tpeSA6IDEgOiA0OTAuMzk5OTkKK1RjaGV0Y2hlbmlhKjtOb3poYXktWXVydG92c2tpeSA6IDEgOiA3MDYuNzk5OTkKK0RhZ2VzdGFuO0themJla292c2tpeSA6IDEgOiA2NzUuMAorVGNoZXRjaGVuaWEqO1NoYWxpIDogMSA6IDEuMAorVGNoZXRjaGVuaWEqO1VydXMtTWFydGFuIDogMSA6IDEuMAorRGFnZXN0YW47QnV5bmFrc2tpeSA6IDEgOiAyMTQ1LjMKK1NldmVyby1Pc2V0aW5za2HvYSByZXNwb3U7VmxhZGlrYXZrYXogOiAxIDogMjUzLjMKK1NldmVyby1Pc2V0aW5za2HvYSByZXNwb3U7QWxhZ2lyc2tpeSA6IDEgOiAyMDI3LjEKK1RjaGV0Y2hlbmlhKjtWZWRlbnNraXkgOiAxIDogOTQyLjI5OTk5CitUY2hldGNoZW5pYSo7U2hhdG95c2tpeSA6IDEgOiA0MzYuMAorRGFnZXN0YW47S2FzcGl5c2sgOiAxIDogNzEuOTAwMDAyCitEYWdlc3RhbjtHdW1iZXRvdnNraXkgOiAxIDogNjYwLjU5OTk4CitEYWdlc3RhbjtCb3RsaWtoc2tpeSA6IDEgOiA5NDYuMjk5OTkKK0RhZ2VzdGFuO0xlbmluc2tpeSA6IDEgOiAxMjU2LjcKK1RjaGV0Y2hlbmlhKjtJdHVtLUthbGluc2tpeSA6IDEgOiAyMDk5LjgKK0RhZ2VzdGFuO1VudHN1a3Vsc2tpeSA6IDEgOiA1MzUuMjAwMDEKK0RhZ2VzdGFuO0J1eW5ha3NrIDogMSA6IDE2LjkKK0RhZ2VzdGFuO0todW56YWtoc2tpeSA6IDEgOiA0NTQuMjk5OTkKK0RhZ2VzdGFuO0FraHZha2hza2l5IDogMSA6IDMwOC43MDAwMQorRGFnZXN0YW47VHN1bWFkaW5za2l5IDogMSA6IDEyMjEuNAorRGFnZXN0YW47S2F5YWtlbnRza2l5IDogMSA6IDgyMC43OTk5OQorRGFnZXN0YW47TGV2YXNoaW5za2l5IDogMSA6IDEwMzkuNworRGFnZXN0YW47R2VyZ2ViaWxza2l5IDogMSA6IDM4MS42MDAwMQorRGFnZXN0YW47SXpiZXJiYXNoIDogMSA6IDE0LjQKK0RhZ2VzdGFuO1NvdmV0c2tpeSA6IDEgOiAxMDExLjUKK0RhZ2VzdGFuO0d1bmlic2tpeSA6IDEgOiA2MjguMjk5OTkKK0RhZ2VzdGFuO1Nlcmdva2FsaW5za2l5IDogMSA6IDU0MS41OTk5OAorRGFnZXN0YW47VHN1bnRpbnNraXkgOiAxIDogMTE4Ni43CitEYWdlc3RhbjtBa3VzaGluc2tpeSA6IDEgOiA1OTkuNDAwMDIKK0RhZ2VzdGFuO1RseWFyYXRpbnNraXkgOiAxIDogMTM5Ni4xCitEYWdlc3RhbjtDaGFyb2RpbnNraXkgOiAxIDogMTA5OS4xCitEYWdlc3RhbjtEZXJiZW50c2tpeSA6IDEgOiA3MzQuNzAwMDEKK0RhZ2VzdGFuO0xha3NraXkgOiAxIDogNzM5LjAKK0RhZ2VzdGFuO0theXRhZ3NraXkgOiAxIDogNzUxLjUKK0RhZ2VzdGFuO0Rha2hhZGF5ZXZza2l5IDogMSA6IDgwNi41CitEYWdlc3RhbjtLdWxpbnNraXkgOiAxIDogNjgwLjU5OTk4CitEYWdlc3RhbjtEZXJiZW50IDogMSA6IDEwMy4zCitEYWdlc3RhbjtEYWdlc3RhbnNraXllIE9nbmkgOiAxIDogMS41CitEYWdlc3RhbjtUYWJhc2FyYW5za2l5IDogMSA6IDkyNS4wOTk5OAorRGFnZXN0YW47QWd1bHNraXkgOiAxIDogNzMzLjAKK0RhZ2VzdGFuO1J1dHVsc2tpeSA6IDEgOiAyMTc0LjM5OTkKK0RhZ2VzdGFuO01hZ2FyYW1rZW50c2tpeSA6IDEgOiA0MTYuMAorRGFnZXN0YW47S2hpdnNraXkgOiAxIDogNTA3LjcwMDAxCitEYWdlc3RhbjtTdWxleW1hbi1TdGFsc2tpeSA6IDEgOiA1MjkuMjk5OTkKK0RhZ2VzdGFuO0t1cmFraHNraXkgOiAxIDogNjQ5LjcwMDAxCitEYWdlc3RhbjtBa2h0eW5za2l5IDogMSA6IDEyMTcuOAorUlUtVU5LLTI4NzggOiAxIDogMy44CitSVS1VTkstMjg3OSA6IDEgOiAzLjgKK1JVLVVOSy0yODgwIDogMSA6IDE0MC43CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtJdmRlbCA6IDEgOiAyNTk4NS42OTkKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7S3Jhc25vdmlzaGVyc2tpeSA6IDEgOiAxNDYyMS45CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0NoZXJkeW5za2l5IDogMSA6IDIwNzExLjkKK0tvbWktUGVybWlhdHNraSBuYXRpb25hbDtHYXluc2tpeSA6IDEgOiAxNDYwMS43CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtTZXZlcm91cmFsc2sgOiAxIDogMzc1MS43CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtHYXJpbnNraXkgOiAxIDogMTcxMTcuODAxCitLb21pLVBlcm1pYXRza2kgbmF0aW9uYWw7S29zaW5za2l5IDogMSA6IDMwNDEuMTAwMQorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtTb2xpa2Ftc2tpeSA6IDEgOiA1NDYwLjcwMDIKK1N2ZXJkbG92c2th72Egb2JsYXN0O0thcnBpbnNrIDogMSA6IDU1NjcuMTAwMQorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7U2Vyb3Zza2l5IDogMSA6IDk5MDMuNQorS29taS1QZXJtaWF0c2tpIG5hdGlvbmFsO0tvY2hldnNraXkgOiAxIDogMzAxNy44OTk5CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtLcmFzbm90dXJpbnNrIDogMSA6IDYxOS43MDAwMQorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtBbGVrc2FuZHJvdnNrIDogMSA6IDU4MjIuNzAwMgorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtVc29sc2tpeSA6IDEgOiAzMDc0LjYwMDEKK0tvbWktUGVybWlhdHNraSBuYXRpb25hbDtZdXJsaW5za2l5IDogMSA6IDM5NTcuNjAwMQorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7U2Vyb3YgOiAxIDogNDE5Ljc5OTk5CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtOb3ZvbHlhbGluc2tpeSA6IDEgOiA2MDc3LjI5OTgKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7U29saWthbXNrIDogMSA6IDUuNTk5OTk5OQorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtCZXJlem5pa2kgOiAxIDogMzkzLjAKK0tvbWktUGVybWlhdHNraSBuYXRpb25hbDtLdWR5bWthcnNraXkgOiAxIDogNDMwNy4yOTk4CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtUYWJvcmluc2tpeSA6IDEgOiAxMDk1NS42CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0tpemVsIDogMSA6IDExNjguNgorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtHb3Jub3phdm9kc2tpeSA6IDEgOiA2NzM4LjAKK0tvbWktUGVybWlhdHNraSBuYXRpb25hbDtZdXN2aW5za2l5IDogMSA6IDM0MzQuMzk5OQorS29taS1QZXJtaWF0c2tpIG5hdGlvbmFsO0t1ZHlta2FyIDogMSA6IDIuOAorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7QWxhcGF5ZXZza2l5IDogMSA6IDEwNzExLjcKK1N2ZXJkbG92c2th72Egb2JsYXN0O1Zlcmtob3R1cnNraXkgOiAxIDogNTA1MS44OTk5CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0RvYnJ5YW5za2l5IDogMSA6IDQ0NTEuMzk5OQorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtHcmVteWFjaGluc2sgOiAxIDogMTQyMS40CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtOaXpobnlheWEgVHVyYSA6IDEgOiAyMzgzLjUKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7R3ViYWtoYSA6IDEgOiAxMDI1LjAKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7SWx5aW5za2l5IDogMSA6IDIyMjkuMTAwMQorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7S2FjaGthbmFyIDogMSA6IDM0MS4yOTk5OQorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtLYXJhZ2F5c2tpeSA6IDEgOiAyNDE5LjUKK1N2ZXJkbG92c2th72Egb2JsYXN0O1R1cmluc2tpeSA6IDEgOiA3MjI0LjYwMDEKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7Q2h1c292c2tveSA6IDEgOiAzNDk1LjMKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7U2l2aW5za2l5IDogMSA6IDI0NTAuNQorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7VGF2ZGluc2tpeSA6IDEgOiA2NTEzLjYwMDEKK1N2ZXJkbG92c2th72Egb2JsYXN0O0t1c2h2YSA6IDEgOiAyMzM1LjEwMDEKK1N2ZXJkbG92c2th72Egb2JsYXN0O0tyYXNub3VyYWxzayA6IDEgOiAxNTM3LjMKK091ZG1vdXJ0aWE7R2xhem92c2tpeSA6IDEgOiAyMDE1LjgKK091ZG1vdXJ0aWE7QmFsZXppbnNraXkgOiAxIDogMjU3OC4zCitTdmVyZGxvdnNrYe9hIG9ibGFzdDtWZXJraG5lc2FsZGluc2tpeSA6IDEgOiAyNDk1LjEwMDEKK091ZG1vdXJ0aWE7WWFyc2tpeSA6IDEgOiAxMzg0LjgKK091ZG1vdXJ0aWE7S2V6c2tpeSA6IDEgOiAyNTQ5LjEwMDEKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7Tnl0dmVuc2tpeSA6IDEgOiAxNjM3LjUKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7S3Jhc25va2Ftc2sgOiAxIDogOTMwLjIwMDAxCitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0NodXNvdm95IDogMSA6IDMuMAorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtWZXJlc2NoYWdpbnNraXkgOiAxIDogMTU4Ni4xCitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0x5c3ZlbnNraXkgOiAxIDogMzQ0NS41CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtQcmlnb3JvZG55aSA6IDEgOiA3NjEwLjEwMDEKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7UGVybSA6IDEgOiAxMDguMgorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtQZXJtc2tpeSA6IDEgOiAzNTM1LjUKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7THlzdmEgOiAxIDogMi43CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtOaXpobmlheWEgU2FsZGEgOiAxIDogMi45MDAwMDAxCitPdWRtb3VydGlhO1l1a2FtZW5za2l5IDogMSA6IDgzNS4wOTk5OAorT3VkbW91cnRpYTtHbGF6b3YgOiAxIDogMS4wCitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO09jaGVyc2tpeSA6IDEgOiAxMzE4LjAKK1N2ZXJkbG92c2th72Egb2JsYXN0O1ZlcmtobmlheWEgU2FsZGEgOiAxIDogMy43CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtJcmJpdHNraXkgOiAxIDogNDY1MC4wCitTdmVyZGxvdnNrYe9hIG9ibGFzdDtUYXZkYSA6IDEgOiAzLjUKK1N2ZXJkbG92c2th72Egb2JsYXN0O05pemhuaXkgVGFnaWwgOiAxIDogMzA2LjEwMDAxCitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0t1bmd1cnNraXkgOiAxIDogNDQ0OC41CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtBbGFwYXlldnNrIDogMSA6IDEwNDUuNAorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7U2xvYm9kby1UdXJpbnNraXkgOiAxIDogMjYwMy4zOTk5CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO09raGFuc2tpeSA6IDEgOiA4MzYuMDk5OTgKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7QmVyeW96b3Zza2l5IDogMSA6IDIxODguNworUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtCb2xzaGVzb3Nub3Zza2l5IDogMSA6IDI4NTIuOAorT3VkbW91cnRpYTtLcmFzbm9nb3Jza2l5IDogMSA6IDE3ODIuNgorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7QmF5a2Fsb3Zza2l5IDogMSA6IDIyODYuODk5OQorT3VkbW91cnRpYTtEZWJlc3NraXkgOiAxIDogOTI0LjA5OTk4CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtOZXZ5YW5za2l5IDogMSA6IDE5NzMuMQorT3VkbW91cnRpYTtJZ3JpbnNraXkgOiAxIDogMjA4Mi42MDAxCitTdmVyZGxvdnNrYe9hIG9ibGFzdDtTaGFsaW5za2l5IDogMSA6IDQ4MTkuNzk5OAorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7UmV6aGV2c2tpeSA6IDEgOiAyMDgzLjYwMDEKK1N2ZXJkbG92c2th72Egb2JsYXN0O0tpcm92Z3JhZCA6IDEgOiA5NDMuNzk5OTkKK1N2ZXJkbG92c2th72Egb2JsYXN0O0FydHllbW92c2tpeSA6IDEgOiAxODY1LjIKK1N2ZXJkbG92c2th72Egb2JsYXN0O0lyYml0IDogMSA6IDQuMTk5OTk5OAorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7TmV2eWFuc2sgOiAxIDogNC45MDAwMDAxCitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO09zaW5za3kgOiAxIDogNDA2Ljg5OTk5CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0NoYXN0aW5za2l5IDogMSA6IDExNjMuMAorT3VkbW91cnRpYTtTZWx0aW5za2l5IDogMSA6IDE5OTEuNgorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtLaXNoZXJ0c2tpeSA6IDEgOiAxNjYzLjQKK091ZG1vdXJ0aWE7U2hhcmthbnNraXkgOiAxIDogMTQyMS4wCitPdWRtb3VydGlhO1N5dW1zaW5za2l5IDogMSA6IDE3NDUuMworUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtLdW5ndXIgOiAxIDogMi41OTk5OTk5CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtSZXpzaCA6IDEgOiA2LjY5OTk5OTgKK1N2ZXJkbG92c2th72Egb2JsYXN0O1R1Z3VseW1za2l5IDogMSA6IDM0MTQuMworU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7QXJ0eW9tb3Zza2l5IDogMSA6IDMuNDAwMDAwMQorT3VkbW91cnRpYTtZYWtzaHVyLUJvZHlpbnNraXkgOiAxIDogMTYwMS43CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtQZXJ2b3VyYWxzayA6IDEgOiAyMzc2LjcKK1N2ZXJkbG92c2th72Egb2JsYXN0O1ZlcmtobnlheSBQeXNobWEgOiAxIDogMTA2OS45CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtUYWxpdHNraXkgOiAxIDogNDU1My43MDAyCitTdmVyZGxvdnNrYe9hIG9ibGFzdDtQeXNobWluc2tpeSA6IDEgOiAyMTM5LjYwMDEKK091ZG1vdXJ0aWE7VXZpbnNraXkgOiAxIDogMjM0Ni44OTk5CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO1N1a3N1bnNraXkgOiAxIDogMTY0Mi44CitPdWRtb3VydGlhO1ZvdGtpbnNraXkgOiAxIDogMTY4MS43CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtBc2Jlc3QgOiAxIDogNzUzLjU5OTk4CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtLYW15c2hsb3Zza2l5IDogMSA6IDIxNzUuMAorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7QmVyZXpvdnNraXkgOiAxIDogMTA4NC42CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO09yZGluc2t5IDogMSA6IDEwMDQuNAorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7U3VraG9sb3poc2tpeSA6IDEgOiAxNzQ0LjcKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7QmFyZHltc2tpeSA6IDEgOiAyMjA4LjMKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7WWVsb3Zza2l5IDogMSA6IDExMzYuOAorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7Tml6aG5lc2VyZ2luc2tpeSA6IDEgOiA0Nzg5LjAKK1N2ZXJkbG92c2th72Egb2JsYXN0O0FjaGl0c2tpeSA6IDEgOiAyMTkxLjM5OTkKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7VWluc2tpeSA6IDEgOiAxODA2LjUKK091ZG1vdXJ0aWE7WmF2eWFsb3Zza2l5IDogMSA6IDIzNjcuODk5OQorT3VkbW91cnRpYTtWb3RraW5zayA6IDEgOiAxLjgKK1N2ZXJkbG92c2th72Egb2JsYXN0O1lla2F0ZXJpbmJ1cmcgOiAxIDogMTA1Ny4wCitPdWRtb3VydGlhO1Zhdm96aHNraXkgOiAxIDogMTQ2OS45CitPdWRtb3VydGlhO0l6aGV2c2sgOiAxIDogMjU0LjMKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7Q2hheWtvdnNraXkgOiAxIDogMTc4NC4xCitTdmVyZGxvdnNrYe9hIG9ibGFzdDtCZWxveWFyc2tpeSA6IDEgOiAxNzQ4LjAKK1N2ZXJkbG92c2th72Egb2JsYXN0O1N1a2hveSBMb2cgOiAxIDogMS43CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtLcmFzbm91Zmltc2tpeSA6IDEgOiAzMjc5LjYwMDEKK1N2ZXJkbG92c2th72Egb2JsYXN0O0JvZ2Rhbm92aWNoc2tpeSA6IDEgOiAxMjg2LjcKK1N2ZXJkbG92c2th72Egb2JsYXN0O0thbXlzaGxvdiA6IDEgOiAyLjkwMDAwMDEKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7T2t0eWFicnNraXkgOiAxIDogMzE5MS43CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtaYXJlY2hueSA6IDEgOiAxLjQKK1N2ZXJkbG92c2th72Egb2JsYXN0O1JldmRhIDogMSA6IDEwNTcuNworU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7Qm9nZGFub3ZpY2ggOiAxIDogMi44CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0t1eWVkaW5za2l5IDogMSA6IDI4OTUuODk5OQorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtDaGVybnVzaGluc2tpeSA6IDEgOiAxNzQ0LjgKK0tvdXJnYW5za2HvYSBvYmxhc3Q7U2hhdHJvdnNraXkgOiAxIDogMzQ2Ni42MDAxCitPdWRtb3VydGlhO0tpem5lcnNraXkgOiAxIDogMjcwNC42MDAxCitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0NoYXlrb3Zza3kgOiAxIDogMi4zCitPdWRtb3VydGlhO01hbG9wdXJnaW5za2l5IDogMSA6IDk5MC41OTk5OAorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7U3lzZXJ0c2tpeSA6IDEgOiAyMjkxLjAKK1N2ZXJkbG92c2th72Egb2JsYXN0O0FydGluc2tpeSA6IDEgOiAzMDQ0LjIKK091ZG1vdXJ0aWE7TW96aGdpbnNraXkgOiAxIDogMjE1Mi4wCitPdWRtb3VydGlhO1NhcmFwdWxza2l5IDogMSA6IDE5MDEuNgorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7UG9sZXZza295IDogMSA6IDE1NTYuNAorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7S2FtZW5za2l5IDogMSA6IDIyODAuMzk5OQorS291cmdhbnNrYe9hIG9ibGFzdDtEYWxtYXRvdnNraXkgOiAxIDogMzY5Ny44CitLb3VyZ2Fuc2th72Egb2JsYXN0O0thdGF5c2tpeSA6IDEgOiAyNzk4LjUKK1N2ZXJkbG92c2th72Egb2JsYXN0O0thbWVuc2stVXJhbHNraXkgOiAxIDogMTkyLjgKK091ZG1vdXJ0aWE7U2FyYXB1bCA6IDEgOiAyLjUKK0tvdXJnYW5za2HvYSBvYmxhc3Q7U2hhZHJpbnNraXkgOiAxIDogMzkzNy43CitCYWNoa2lyaWE7WWFuYXVsc2tpeSA6IDEgOiAyMjU3LjMKK091ZG1vdXJ0aWE7S2FtYmFyc2tpeSA6IDEgOiA1MTkuMDk5OTgKK091ZG1vdXJ0aWE7S2l5YXNvdnNraXkgOiAxIDogNjQ3Ljc5OTk5CitPdWRtb3VydGlhO01vZ3pzaGEgOiAxIDogMS42CitCYWNoa2lyaWE7VGF0eXNobGluc2tpeSA6IDEgOiAxMjg3LjQKK0JhY2hraXJpYTtBc2tpbnNraXkgOiAxIDogMjM4NC43CitPdWRtb3VydGlhO0FsbmFzaHNraXkgOiAxIDogOTk5Ljc5OTk5CitUY2hlbGlhYmluc2th72Egb2JsYXN0O0thc2xpbnNraXkgOiAxIDogMzMyMy4yCitUY2hlbGlhYmluc2th72Egb2JsYXN0O055YXplcGV0cm92c2tza2l5IDogMSA6IDM0MTEuOAorQmFjaGtpcmlhO1lhbmF1bCA6IDEgOiAyLjkwMDAwMDEKK0tvdXJnYW5za2HvYSBvYmxhc3Q7QmVsb3plcnNraXkgOiAxIDogMzY0MS44CitUY2hlbGlhYmluc2th72Egb2JsYXN0O0t1bmFzaGFrc2tpeSA6IDEgOiAzMjM4LjMKK0JhY2hraXJpYTtLcmFzbm9rYW1za2l5IDogMSA6IDIwMDQuNQorT3VkbW91cnRpYTtHcmFraG92c2tpeSA6IDEgOiAxMDM1LjgKK091ZG1vdXJ0aWE7S2FyYWt1bGluc2tpeSA6IDEgOiA2OTguOTAwMDIKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7VmVya2huaXkgVWZhbGV5IDogMSA6IDE0NjQuMworQmFjaGtpcmlhO0JhbHRhY2hldnNraXkgOiAxIDogMTY4MS4yCitLb3VyZ2Fuc2th72Egb2JsYXN0O0thcmdhcG9sc2tpeSA6IDEgOiAzNDI5Ljg5OTkKK0JhY2hraXJpYTtCZWxva2F0YXlza2l5IDogMSA6IDI3MzguODk5OQorS291cmdhbnNrYe9hIG9ibGFzdDtTaGFkcmluc2sgOiAxIDogMjQuMjk5OTk5CitCYWNoa2lyaWE7S2FsdGFzaW5za2l5IDogMSA6IDE1MDkuNAorQmFjaGtpcmlhO0thcmFpZGVsc2tpeSA6IDEgOiAzNTc4Ljg5OTkKK0JhY2hraXJpYTtNZWNoZXRsaW5za2l5IDogMSA6IDEzMTEuNAorQmFjaGtpcmlhO0R1dmFuc2tpeSA6IDEgOiAzMDA5LjAKK0JhY2hraXJpYTtOZWZ0ZWthbXNrIDogMSA6IDIuNworQmFjaGtpcmlhO0J1cmF5ZXZza2l5IDogMSA6IDE2NjkuMgorS291cmdhbnNrYe9hIG9ibGFzdDtWYXJnYXNoaW5za2l5IDogMSA6IDI4OTkuNworS291cmdhbnNrYe9hIG9ibGFzdDtNb2tyb3Vzb3Zza2l5IDogMSA6IDMyODMuOAorVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtLcmFzbm9hcm1leXNraXkgOiAxIDogMzkzMy44OTk5CitUY2hlbGlhYmluc2th72Egb2JsYXN0O0thc2xpIDogMSA6IDEuNQorUlUtVU5LLTI4ODEgOiAxIDogMy4wCitUY2hlbGlhYmluc2th72Egb2JsYXN0O0t5c2h0eW0gOiAxIDogODk2LjQwMDAyCitLb3VyZ2Fuc2th72Egb2JsYXN0O01pc2hraW5za2l5IDogMSA6IDMyMDAuODk5OQorQmFjaGtpcmlhO01pc2hraW5za2l5IDogMSA6IDQuMTk5OTk5OAorS291cmdhbnNrYe9hIG9ibGFzdDtTY2h1Y2hhbnNraXkgOiAxIDogMjk3MS4zCitLb3VyZ2Fuc2th72Egb2JsYXN0O1NodW1pa2hpbnNraXkgOiAxIDogMjY0NC42MDAxCitCYWNoa2lyaWE7SWxpc2hldnNraXkgOiAxIDogMTkxNy4yCitLb3VyZ2Fuc2th72Egb2JsYXN0O0tldG92c2tpeSA6IDEgOiAzNjAxLjEwMDEKK0JhY2hraXJpYTtEeXVydHl1bGluc2tpeSA6IDEgOiAxNjg1LjAKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7QXJnYXlhc2hza2l5IDogMSA6IDI3OTYuMzk5OQorS291cmdhbnNrYe9hIG9ibGFzdDtDaGFzdG9vemVyc2tpeSA6IDEgOiAyMDU0LjUKK0JhY2hraXJpYTtLaWdpbnNraXkgOiAxIDogMTc3OS44CitUY2hlbGlhYmluc2th72Egb2JsYXN0O0thcmFiYXNoIDogMSA6IDU4NS43OTk5OQorS291cmdhbnNrYe9hIG9ibGFzdDtZdXJnYW15c2hza2l5IDogMSA6IDIyOTkuNworVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtTb3Nub3Zza2l5IDogMSA6IDIwOTIuNjAwMQorQmFjaGtpcmlhO051cmltYW5vdnNraXkgOiAxIDogMjcxMi43CitCYWNoa2lyaWE7Qmlyc2tpeSA6IDEgOiAxNTY4LjkKK0tvdXJnYW5za2HvYSBvYmxhc3Q7TGVieWF6aHlldnNraXkgOiAxIDogMzE5NS4yCitUY2hlbGlhYmluc2th72Egb2JsYXN0O0t1c2luc2tpeSA6IDEgOiAxNDQwLjgKK0JhY2hraXJpYTtTYWxhdmF0c2tpeSA6IDEgOiAzMDUxLjgKK0JhY2hraXJpYTtCbGFnb3Zlc2hjaGVuc2tpeSA6IDEgOiAyMjg3LjEwMDEKK0tvdXJnYW5za2HvYSBvYmxhc3Q7TWFrdXNoaW5za2l5IDogMSA6IDMyNTEuMTAwMQorQmFjaGtpcmlhO0R5dXJ0dWxpIDogMSA6IDIuMgorS291cmdhbnNrYe9hIG9ibGFzdDtLdXJnYW4gOiAxIDogMjAxLjMKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7TWlhc3MgOiAxIDogMTYwNy42CitUY2hlbGlhYmluc2th72Egb2JsYXN0O1psYXRvdXN0IDogMSA6IDE2NDkuMQorQmFjaGtpcmlhO0JpcnNrIDogMSA6IDIuMgorS291cmdhbnNrYe9hIG9ibGFzdDtQZXR1a2hvdnNraXkgOiAxIDogMjUwMS4zCitCYWNoa2lyaWE7QmFrYWxpbnNraXkgOiAxIDogMjE3Mi44CitCYWNoa2lyaWE7Q2hla21hZ3VzaGV2c2tpeSA6IDEgOiAxOTI2LjUKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7Q2hlbHlhYmluc2sgOiAxIDogNDc4LjUKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7U2F0a2luc2tpeSA6IDEgOiAyNTUwLjEwMDEKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7QXNoeW5za2l5IDogMSA6IDIzMjUuOAorQmFjaGtpcmlhO0t1c2huYXJlbmtvdnNraXkgOiAxIDogMTYyMi45CitUY2hlbGlhYmluc2th72Egb2JsYXN0O0tvcGV5c2sgOiAxIDogMTg1LjIKK0JhY2hraXJpYTtJZ2xpbnNraXkgOiAxIDogMjQxMS4wCitLb3VyZ2Fuc2th72Egb2JsYXN0O1ByaXRvYm9sbnlpIDogMSA6IDE2NDkuNQorVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtDaGViYXJrdWxza2l5IDogMSA6IDI5MjUuODk5OQorS291cmdhbnNrYe9hIG9ibGFzdDtTYWZha3VsZXZza2l5IDogMSA6IDIyMjcuMzk5OQorVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtLYXRheWV2LUl2YW5vdnNraXkgOiAxIDogNDc5My4xMDAxCitLb3VyZ2Fuc2th72Egb2JsYXN0O0t1cnRhbXlzaHNraXkgOiAxIDogNDQxOS4zOTk5CitLb3VyZ2Fuc2th72Egb2JsYXN0O1BvbG92aW5za2l5IDogMSA6IDI1ODQuMzk5OQorS291cmdhbnNrYe9hIG9ibGFzdDtBbG1lbmV2c2tpeSA6IDEgOiAyNDU4LjM5OTkKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7WWV0a3Vsc2tpeSA6IDEgOiAyNzIyLjAKK0JhY2hraXJpYTtCbGFnb3Zlc2hjaGVuc2sgOiAxIDogMi4zCitUY2hlbGlhYmluc2th72Egb2JsYXN0O1NhdGthIDogMSA6IDIuNworQmFjaGtpcmlhO1NoYXJhbnNraXkgOiAxIDogMTMwMy4yCitUY2hlbGlhYmluc2th72Egb2JsYXN0O0FzaGEgOiAxIDogMi41CitCYWNoa2lyaWE7VWZpbXNraXkgOiAxIDogMTc1NS42CitUY2hlbGlhYmluc2th72Egb2JsYXN0O0NoZWJhcmt1bCcgOiAxIDogMS42CitCYWNoa2lyaWE7QmxhZ292YXJza2l5IDogMSA6IDIxMTQuMworVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtLb3JraW5vIDogMSA6IDYyLjA5OTk5OAorVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtVc3QtS2F0YXlldiA6IDEgOiAxLjAKK0JhY2hraXJpYTtVY2hhbHkgOiAxIDogNDI5MS4yOTk4CitCYWNoa2lyaWE7QnV6ZHlha3NraXkgOiAxIDogMTM0OS4xCitCYWNoa2lyaWE7VWZhIDogMSA6IDQ1NC4zOTk5OQorQmFjaGtpcmlhO0NoaXNobWluc2tpeSA6IDEgOiAxNjMwLjAKK0JhY2hraXJpYTtBcmtoYW5nZWxza2l5IDogMSA6IDI1MDUuNQorVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtZZW1hbnpoZWxpbnNrIDogMSA6IDUzLjIwMDAwMQorS291cmdhbnNrYe9hIG9ibGFzdDtUc2VsaW5ueWkgOiAxIDogMzU1OS4wCitCYWNoa2lyaWE7VHV5bWF6aW5za2l5IDogMSA6IDI2MzguNjAwMQorVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtVdmVsc2tpeSA6IDEgOiAyMzAwLjM5OTkKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7S2F0YXlldi1JdmFub3ZzayA6IDEgOiAxLjMKK0JhY2hraXJpYTtCZWxvcmV0c2tpeSA6IDEgOiAxMDM2MC4zCitLb3VyZ2Fuc2th72Egb2JsYXN0O1p2ZXJpbm9nb2xvdnNreSA6IDEgOiA5MzUuOTAwMDIKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7T2t0eWFicnNraXkgOiAxIDogNDAxMi43CitUY2hlbGlhYmluc2th72Egb2JsYXN0O1V5c2tpeSA6IDEgOiAyNDQ3LjM5OTkKK0JhY2hraXJpYTtLYXJtYXNrYWxpbnNraXkgOiAxIDogMTcwMS42CitCYWNoa2lyaWE7VHV5bWF6eSA6IDEgOiAzLjIKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7UGxhc3QgOiAxIDogMTI3My4zCitCYWNoa2lyaWE7T2t0eWFicnNraXkgOiAxIDogNi4wCitUY2hlbGlhYmluc2th72Egb2JsYXN0O1l1emhuby1VcmFsc2sgOiAxIDogMi4wOTk5OTk5CitUY2hlbGlhYmluc2th72Egb2JsYXN0O1Ryb2l0c2tpeSA6IDEgOiA0NzI2LjAKK0JhY2hraXJpYTtCZWxlYmV5ZXZza2l5IDogMSA6IDE3NzQuOQorQmFjaGtpcmlhO0Rhdmxla2Fub3Zza2l5IDogMSA6IDE5MTguOAorT3JlbmJvdXJnc2th72Egb2JsYXN0O1NldmVybnlpIDogMSA6IDIxODQuMgorUlUtVU5LLTI4ODIgOiAxIDogMi44CitCYWNoa2lyaWE7R2FmdXJpeXNraXkgOiAxIDogMzA4My4zCitCYWNoa2lyaWE7WWVybWVrZXlldnNraXkgOiAxIDogMTYxNC43CitCYWNoa2lyaWE7QXVyZ2F6aW5za2l5IDogMSA6IDIyMjguNjAwMQorQmFjaGtpcmlhO0Fsc2hleWV2c2tpeSA6IDEgOiAyMTc2LjMKK0JhY2hraXJpYTtEYXZsZWthbm92byA6IDEgOiAxLjUKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7VmVya2huZXVyYWxza2l5IDogMSA6IDMwMTUuMworVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtUcm9pdHNrIDogMSA6IDE1My4wCitCYWNoa2lyaWE7QmVsZWJleSA6IDEgOiAyLjQwMDAwMDEKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtBYmR1bGluc2tpeSA6IDEgOiAxNjg1LjYKK0JhY2hraXJpYTtCZWxvcmV0c2sgOiAxIDogMy41OTk5OTk5CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7QnVndXJ1c2xhbnNraXkgOiAxIDogMjk2Mi4wCitCYWNoa2lyaWE7QWJ6ZWxpbG92c2tpeSA6IDEgOiAzNjUwLjIKK0JhY2hraXJpYTtCaXpoYnVseWFrc2tpeSA6IDEgOiAyMjQ4LjMKK0JhY2hraXJpYTtTdGVybGl0YW1ha3NraXkgOiAxIDogMjE3OC42MDAxCitUY2hlbGlhYmluc2th72Egb2JsYXN0O05hZ2F5YmFrc2tpeSA6IDEgOiAzMTk4LjMKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7Q2hlc21lbnNraXkgOiAxIDogMjUzMi4yCitCYWNoa2lyaWE7TWl5YWtpbnNraXkgOiAxIDogMjI2OC44CitCYWNoa2lyaWE7SXNoaW1iYXlza3kgOiAxIDogNDAzOS43CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7QXNla2V5ZXZza2l5IDogMSA6IDI0MDIuMAorVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtBZ2Fwb3Zza2l5IDogMSA6IDI1NDAuMworT3JlbmJvdXJnc2th72Egb2JsYXN0O0J1Z3VydXNsYW4gOiAxIDogMi40MDAwMDAxCitCYWNoa2lyaWE7U3RlcmxpdGFtYWsgOiAxIDogNS41CitCYWNoa2lyaWE7U3RlcmxpYmFzaGV2c2tpeSA6IDEgOiAxNzkyLjgKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7VmFybmVuc2tpeSA6IDEgOiAzNTI3Ljg5OTkKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtBYmR1bGlubyA6IDEgOiAyLjMKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtNYXR2ZXlldnNraXkgOiAxIDogNTMuNQorQmFjaGtpcmlhO0J1cnp5YW5za2l5IDogMSA6IDQ2MDguNzAwMgorQmFjaGtpcmlhO0lzaGltYmF5IDogMSA6IDMuNTk5OTk5OQorVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtNYWduaXRvZ29yc2sgOiAxIDogMzkzLjIwMDAxCitUY2hlbGlhYmluc2th72Egb2JsYXN0O0thcnRhbGluc2tpeSA6IDEgOiA0ODIxLjEwMDEKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtQb25vbWFyeW92c2tpeSA6IDEgOiAyMDk4LjgKK0JhY2hraXJpYTtNZWxldXpza2l5IDogMSA6IDMwNTIuMTAwMQorQmFjaGtpcmlhO0Z5b2Rvcm92c2tpeSA6IDEgOiAxOTI2LjYKK0JhY2hraXJpYTtTYWxhdmF0IDogMSA6IDIuNDAwMDAwMQorT3JlbmJvdXJnc2th72Egb2JsYXN0O0J1enVsdWtza2l5IDogMSA6IDMyMzcuNQorQmFjaGtpcmlhO0JheW1ha3NraXkgOiAxIDogNjEyMi4wCitPcmVuYm91cmdza2HvYSBvYmxhc3Q7U2hhcmx5a3NraXkgOiAxIDogMzExNi43CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7R3JhY2hldnNraXkgOiAxIDogMTY4My4xCitUY2hlbGlhYmluc2th72Egb2JsYXN0O0tpemlsc2tpeSA6IDEgOiA0NDMzLjI5OTgKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtLcmFzbm9ndmFyZGV5c2tpeSA6IDEgOiAzMDYxLjUKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7S2FydGFseSA6IDEgOiAyLjAKK0JhY2hraXJpYTtLdWdhcmNoaW5za2l5IDogMSA6IDM2NzQuOAorQmFjaGtpcmlhO1ppbGFpcnNraXkgOiAxIDogNTI5MC43MDAyCitCYWNoa2lyaWE7TWVsZXV6IDogMSA6IDIuNworQmFjaGtpcmlhO0t1bWVydGF1c2tpeSA6IDEgOiAyODQ4LjMKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtBbGVrc2FuZHJvdnNraXkgOiAxIDogMjk5OC44OTk5CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7S3VybWFuYXlldnNraXkgOiAxIDogMzE2NC42MDAxCitUY2hlbGlhYmluc2th72Egb2JsYXN0O0JyZWRpbnNraXkgOiAxIDogNTA2My4yMDAyCitPcmVuYm91cmdza2HvYSBvYmxhc3Q7QnV6dWx1ayA6IDEgOiAzLjUKK0JhY2hraXJpYTtLdW1lcnRheSA6IDEgOiAyLjUKK0JhY2hraXJpYTtTaWJheSA6IDEgOiA0LjE5OTk5OTgKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtTb3JvY2hpbnNraXkgOiAxIDogMjY4MC4zCitPcmVuYm91cmdza2HvYSBvYmxhc3Q7T2t0eWFicnNraXkgOiAxIDogMzA0MC44OTk5CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7Tm92b3NlcmdpeWV2c2tpeSA6IDEgOiA0NTgxLjc5OTgKK0JhY2hraXJpYTtCYXltYWsgOiAxIDogMy44CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7VG90c2tpeSA6IDEgOiAzMTU1LjgKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtUeXVsZ2Fuc2tpeSA6IDEgOiAyMDQ0LjQKK0JhY2hraXJpYTtaaWFuY2h1cmluc2tpeSA6IDEgOiAzNzA0LjM5OTkKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtLdmFya2Vuc2tpeSA6IDEgOiA1NTc2LjYwMDEKK0JhY2hraXJpYTtLaGF5YnVsbGluc2tpeSA6IDEgOiA0MzgyLjEwMDEKK1JVLVVOSy0yODgzIDogMSA6IDMuMgorT3JlbmJvdXJnc2th72Egb2JsYXN0O1BlcmV2b2xvdHNraXkgOiAxIDogMjYwOS41CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7UGVydm9tYXlza2l5IDogMSA6IDUwODIuMAorT3JlbmJvdXJnc2th72Egb2JsYXN0O1Nha21hcnNraXkgOiAxIDogMTk2NC4xCitPcmVuYm91cmdza2HvYSBvYmxhc3Q7VGFzaGxpbnNraXkgOiAxIDogMzEwOC44CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7U2FyYWt0YXNoc2tpeSA6IDEgOiA0MTYwLjM5OTkKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtPcmVuYnVyZ3NraXkgOiAxIDogNjAxNS43MDAyCitPcmVuYm91cmdza2HvYSBvYmxhc3Q7QWRhbW92c2tpeSA6IDEgOiA2MjU2LjM5OTkKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtPcmVuYnVyZyA6IDEgOiAzNjMuMTAwMDEKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtLdXZhbmR5a3NraXkgOiAxIDogNjUyNi4xMDAxCitPcmVuYm91cmdza2HvYSBvYmxhc3Q7R2F5c2tpeSA6IDEgOiAyOTE3Ljg5OTkKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtOb3Zvb3Jza2l5IDogMSA6IDM0NTQuMAorT3JlbmJvdXJnc2th72Egb2JsYXN0O0lsZWtza2l5IDogMSA6IDM1MTIuMzk5OQorT3JlbmJvdXJnc2th72Egb2JsYXN0O0JlbHlhZXZza2l5IDogMSA6IDM0MjkuMzk5OQorT3JlbmJvdXJnc2th72Egb2JsYXN0O0t1dmFuZHlrIDogMSA6IDMuMAorT3JlbmJvdXJnc2th72Egb2JsYXN0O1N2ZXRsaW5za2l5IDogMSA6IDUxNzkuODk5OQorT3JlbmJvdXJnc2th72Egb2JsYXN0O0dheSA6IDEgOiAxLjkKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtNZWRub2dvcnNrIDogMSA6IDIuNworT3JlbmJvdXJnc2th72Egb2JsYXN0O1NvbC1JbGV0c2tpeSA6IDEgOiA0Nzc3LjcwMDIKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtZYXNuZW5za2l5IDogMSA6IDM2NzMuNjAwMQorT3JlbmJvdXJnc2th72Egb2JsYXN0O0FrYnVsYWtza2l5IDogMSA6IDM5ODUuNjAwMQorT3JlbmJvdXJnc2th72Egb2JsYXN0O09yc2sgOiAxIDogNzYxLjkwMDAyCitPcmVuYm91cmdza2HvYSBvYmxhc3Q7Tm92b3Ryb2l0c2sgOiAxIDogMjMxLjg5OTk5CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7RG9tYmFyb3Zza2l5IDogMSA6IDM0ODEuNjAwMQorT3JlbmJvdXJnc2th72Egb2JsYXN0O1lhc255IDogMSA6IDEuOAorUlUtVU5LLTI4ODQgOiAxIDogMy4wCitSVS1VTkstMjg4NSA6IDEgOiAyLjgKK1JVLVVOSy0yODg2IDogMSA6IDMuMgorSWFtYWxvLU5lbmV0c2tpIG5hdGlvbmFsO1lhbWFsc2tpeSA6IDEgOiAxMTI0NzYuMAorSWFtYWxvLU5lbmV0c2tpIG5hdGlvbmFsO1Rhem92c2tpeSA6IDEgOiAxMjI4NDYuMQorSWFtYWxvLU5lbmV0c2tpIG5hdGlvbmFsO1ByaXVyYWxza2l5IDogMSA6IDY1MzE4LjEwMgorSWFtYWxvLU5lbmV0c2tpIG5hdGlvbmFsO1B1cm92c2tpeSA6IDEgOiA2MDc0LjYwMDEKK0lhbWFsby1OZW5ldHNraSBuYXRpb25hbDtOYWR5bXNraXkgOiAxIDogOTgwMjUuMzk4CitJYW1hbG8tTmVuZXRza2kgbmF0aW9uYWw7S3Jhbm9zZWxrdXBza2l5IDogMSA6IDEwNTk1OC40CitJYW1hbG8tTmVuZXRza2kgbmF0aW9uYWw7U2h1cnlzaGthcnNraXkgOiAxIDogNTQxNTEuNQorSWFtYWxvLU5lbmV0c2tpIG5hdGlvbmFsO0xhYnl0bmFuZ2kgOiAxIDogMTcuNQorSWFtYWxvLU5lbmV0c2tpIG5hdGlvbmFsO1NhbGVraGFyZCA6IDEgOiAyMC41CitJYW1hbG8tTmVuZXRza2kgbmF0aW9uYWw7Tm92eWkgVXJlbmdveSA6IDEgOiAyOC4yOTk5OTkKK0toYW50eS1NYW5zaXNraSBuYXRpb25hbDtCZXJlem92c2tpeSA6IDEgOiA4NTg3NC4wCitJYW1hbG8tTmVuZXRza2kgbmF0aW9uYWw7TmFkeW0gOiAxIDogNDAuMAorS2hhbnR5LU1hbnNpc2tpIG5hdGlvbmFsO0JlbG95YXJza2l5IDogMSA6IDQyNDAxLjUKK0lhbWFsby1OZW5ldHNraSBuYXRpb25hbDtNdXJhdmxlbmtvIDogMSA6IDIzLjUKK0toYW50eS1NYW5zaXNraSBuYXRpb25hbDtCZWxveWFyc2t5IDogMSA6IDE5LjEKK0toYW50eS1NYW5zaXNraSBuYXRpb25hbDtPa3R5YWJyc2tpeSA6IDEgOiAyNTA2OC45CitLaGFudHktTWFuc2lza2kgbmF0aW9uYWw7U3VyZ3V0c2tpeSA6IDEgOiA5NDAyOC42MDIKK0lhbWFsby1OZW5ldHNraSBuYXRpb25hbDtOb3lhYnJzayA6IDEgOiAyMi4yOTk5OTkKK0toYW50eS1NYW5zaXNraSBuYXRpb25hbDtLaGFudHktTWFuc2l5c2tpeSA6IDEgOiA1NjczOS42OTkKK0toYW50eS1NYW5zaXNraSBuYXRpb25hbDtOaXpobmV2YXJ0b3Zza2l5IDogMSA6IDExODA2OC44CitLaGFudHktTWFuc2lza2kgbmF0aW9uYWw7U292ZXRza2l5IDogMSA6IDI5NzYxLjE5OQorS2hhbnR5LU1hbnNpc2tpIG5hdGlvbmFsO055YWdhbiA6IDEgOiAzLjcKK0toYW50eS1NYW5zaXNraSBuYXRpb25hbDtLb2dhbHltIDogMSA6IDIuMgorS2hhbnR5LU1hbnNpc2tpIG5hdGlvbmFsO1JhZHV6aG55aSA6IDEgOiA0MC43MDAwMDEKK0toYW50eS1NYW5zaXNraSBuYXRpb25hbDtQb2thY2h5IDogMSA6IDUzLjIwMDAwMQorS2hhbnR5LU1hbnNpc2tpIG5hdGlvbmFsO1N1cmd1dCA6IDEgOiAzMy4wCitLaGFudHktTWFuc2lza2kgbmF0aW9uYWw7TGFuZ2VwYXMgOiAxIDogMTMuMQorS2hhbnR5LU1hbnNpc2tpIG5hdGlvbmFsO0tvbmRpbnNraXkgOiAxIDogNTUzNDQuODAxCitLaGFudHktTWFuc2lza2kgbmF0aW9uYWw7TmVmdGV5dWdhbnNraXkgOiAxIDogMjQ5ODEuMTk5CitLaGFudHktTWFuc2lza2kgbmF0aW9uYWw7TmVmdGV1Z2Fuc2sgOiAxIDogMS4wCitLaGFudHktTWFuc2lza2kgbmF0aW9uYWw7S2hhbnR5LU1hbnN5aXNrIDogMSA6IDIuMworVG9tc2th72Egb2JsYXN0O0thcmdhc29rc2tpeSA6IDEgOiA4NTIwMS44OTgKK0toYW50eS1NYW5zaXNraSBuYXRpb25hbDtNZWdpb24gOiAxIDogNDEuNTk5OTk4CitLaGFudHktTWFuc2lza2kgbmF0aW9uYWw7Tml6c2hudmFydG92c2sgOiAxIDogMjQuNQorUlUtVU5LLTI4ODcgOiAxIDogMzcyMzQuODk4CitSVS1VTkstMjg4OCA6IDEgOiAzNzIzNC44OTgKK0toYW50eS1NYW5zaXNraSBuYXRpb25hbDtQeXQtWWFraCA6IDEgOiAzOC4wOTk5OTgKK1RvbXNrYe9hIG9ibGFzdDtTdHJlemhldm9qIDogMSA6IDIuNworS2hhbnR5LU1hbnNpc2tpIG5hdGlvbmFsO1VyYXkgOiAxIDogOC4zOTk5OTk2CitUaW91bWVuc2th72Egb2JsLiBy6XNpZHVlO1V2YXRza2l5IDogMSA6IDQ2OTYwLjgwMQorVG9tc2th72Egb2JsYXN0O1ZlcmtobmVrZXRza2l5IDogMSA6IDQxMDQ3LjEwMgorVG9tc2th72Egb2JsYXN0O1BhcmFiZWxza2l5IDogMSA6IDMzMjE5LjAKK1RvbXNrYe9hIG9ibGFzdDtLb2xwYXNoZXZza2l5IDogMSA6IDE0NDUwLjIKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7VG9ib2xza2l5IDogMSA6IDE4MTQzLjMwMQorVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtWYWdheXNraXkgOiAxIDogMTgyNjMuMQorT21za2HvYSBvYmxhc3Q7VGFyc2tpeSA6IDEgOiAxNTM0OS43CitPbXNrYe9hIG9ibGFzdDtVc3QtSXNoaW1za2l5IDogMSA6IDgzMzUuOTAwNAorVG9tc2th72Egb2JsYXN0O1BlcnZvbWF5c2tpeSA6IDEgOiAxMzQxMi4wCitUb21za2HvYSBvYmxhc3Q7VGVndWxkZXRza2l5IDogMSA6IDEwNzQ1LjQKK1RvbXNrYe9hIG9ibGFzdDtLb2xwYXNoZXZvIDogMSA6IDIuMworVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtUb2JvbHNrIDogMSA6IDE1LjIKK09tc2th72Egb2JsYXN0O1RldnJpenNraXkgOiAxIDogMTAyMzYuOQorVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtOaXpobmV0YXZkaW5za2l5IDogMSA6IDc2OTUuODk5OQorVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtZYXJrb3Zza2l5IDogMSA6IDY1MDMuODk5OQorVG9tc2th72Egb2JsYXN0O01vbGNoYW5vdnNraXkgOiAxIDogNTc3MC4yOTk4CitUb21za2HvYSBvYmxhc3Q7Q2hhaW5za2l5IDogMSA6IDYwMjIuNjAwMQorVG9tc2th72Egb2JsYXN0O0FzaW5vdnNraXkgOiAxIDogNDI0Mi4zOTk5CitUb21za2HvYSBvYmxhc3Q7QmFrY2hhcnNraXkgOiAxIDogMjQzOTAuODAxCitPbXNrYe9hIG9ibGFzdDtabmFtZW5za2l5IDogMSA6IDMyMzguMworVG9tc2th72Egb2JsYXN0O0tyaXZvc2hlaW5za2l5IDogMSA6IDM4MjQuMAorT21za2HvYSBvYmxhc3Q7U2VkZWxuaWtvdnNraXkgOiAxIDogNTE2OS44OTk5CitSVS1VTkstMjg4OSA6IDEgOiAxLjcKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7VHl1bWVuc2tpeSA6IDEgOiA0NzYyLjg5OTkKK1RvbXNrYe9hIG9ibGFzdDtUb21za2l5IDogMSA6IDEyOTE2LjcKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7VmlrdWxvdnNraXkgOiAxIDogNDgyNi4zOTk5CitPbXNrYe9hIG9ibGFzdDtCb2xzaGV1a292c2tpeSA6IDEgOiA5OTUyLjcwMDIKK1RvbXNrYe9hIG9ibGFzdDtaeXJ5YW5za2l5IDogMSA6IDEwODE0LjUKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7QXJvbWFzaGV2c2tpeSA6IDEgOiAzOTUyLjIKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtLeXNodG92c2tpeSA6IDEgOiAxMDM3OC4xCitUaW91bWVuc2th72Egb2JsLiBy6XNpZHVlO1l1cmdpbnNraXkgOiAxIDogNDA2OC44CitUb21za2HvYSBvYmxhc3Q7U2hlZ2Fyc2tpeSA6IDEgOiA0MjQ1LjUKK1RvbXNrYe9hIG9ibGFzdDtBc2lubyA6IDEgOiA0LjE5OTk5OTgKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7VHl1bWVuIDogMSA6IDIzLjUKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtTZXZlcm55aSA6IDEgOiAxNTE1NS41CitUaW91bWVuc2th72Egb2JsLiBy6XNpZHVlO1lhbHV0b3JvdnNraXkgOiAxIDogMzAwMS4zOTk5CitUaW91bWVuc2th72Egb2JsLiBy6XNpZHVlO1Nvcm9raW5za2l5IDogMSA6IDI5MzkuMworVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtaYXZvZG91a292c2tpeSA6IDEgOiAyNzI1LjEwMDEKK09tc2th72Egb2JsYXN0O1RhcmEgOiAxIDogMy4wCitLZW1lcm92c2th72Egb2JsYXN0O01hcmlpbnNraXkgOiAxIDogNTM2MS4xMDAxCitUaW91bWVuc2th72Egb2JsLiBy6XNpZHVlO0dvbHlzaG1hbm92c2tpeSA6IDEgOiA0MDUyLjEwMDEKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7SXNldHNraXkgOiAxIDogMjU0My43CitPbXNrYe9hIG9ibGFzdDtLb2xvc292c2tpeSA6IDEgOiA0ODQ4LjIwMDIKK1RvbXNrYe9hIG9ibGFzdDtUb21zayA6IDEgOiAxNTEuNworVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtPbXV0aW5za2l5IDogMSA6IDMzMTkuOAorT21za2HvYSBvYmxhc3Q7TXVyb210c2V2c2tpeSA6IDEgOiA2Nzk3LjM5OTkKK09tc2th72Egb2JsYXN0O0tydXRpbnNraXkgOiAxIDogNTkwNi4zOTk5CitUaW91bWVuc2th72Egb2JsLiBy6XNpZHVlO0FiYXRza2l5IDogMSA6IDM5MDIuODk5OQorT21za2HvYSBvYmxhc3Q7Qm9sc2hlcmVjaGVuc2tpeSA6IDEgOiAxNy45CitUb21za2HvYSBvYmxhc3Q7S296aGV2bmlrb3Zza2l5IDogMSA6IDM2MzAuNQorVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtZYWx1dG9yb3ZzayA6IDEgOiAxLjMKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7WWF5c2tpeSA6IDEgOiAyOTY0LjUKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7SXNoaW1za2l5IDogMSA6IDU0NzUuMjk5OAorS2VtZXJvdnNrYe9hIG9ibGFzdDtJemhtb3Jza2l5IDogMSA6IDM0MDkuNworTm92b3NpYmlyc2th72Egb2JsYXN0O1ViaW5za2l5IDogMSA6IDEzOTYzLjMKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtLb2x5dmFuc2tpeSA6IDEgOiAxMDA0My4wCitPbXNrYe9hIG9ibGFzdDtUeXVrYWxpbnNraXkgOiAxIDogNjEzNy44OTk5CitLZW1lcm92c2th72Egb2JsYXN0O1R5YXpoaW5za2l5IDogMSA6IDMzMjkuODk5OQorVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtVcG9yb3Zza2l5IDogMSA6IDI5NzMuMTAwMQorVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtaYXZvZG91a292c2sgOiAxIDogMS4zCitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7VmVuZ2Vyb3Zza2l5IDogMSA6IDY1OTYuNzk5OAorVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtBcm1pem9uc2tpeSA6IDEgOiAzMjE2LjAKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtLdXlieXNoZXZza2l5IDogMSA6IDg1MTcuMjk5OAorS2VtZXJvdnNrYe9hIG9ibGFzdDtNYXJpaW5zayA6IDEgOiAxLjAKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7WWFzaGtpbnNraXkgOiAxIDogMzU5OS4wCitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7VXN0LVRhcmtza2l5IDogMSA6IDQzNDMuMjAwMgorS2VtZXJvdnNrYe9hIG9ibGFzdDtZdXJnaW5za2l5IDogMSA6IDI1OTkuOAorS2VtZXJvdnNrYe9hIG9ibGFzdDtDaGVidWxpbnNraXkgOiAxIDogMzU3MS43CitUaW91bWVuc2th72Egb2JsLiBy6XNpZHVlO0lzaGltIDogMSA6IDIuNQorUlUtVU5LLTI4OTAgOiAxIDogMzY5NC41CitLZW1lcm92c2th72Egb2JsYXN0O0Fuemhlcm8tU3VkemhlbnNrIDogMSA6IDEuMAorS2VtZXJvdnNrYe9hIG9ibGFzdDtUYXlnYSA6IDEgOiAxLjAKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtCb2xvdG5pbnNraXkgOiAxIDogMzE1Ni44OTk5CitUaW91bWVuc2th72Egb2JsLiBy6XNpZHVlO0JlcmR5dXpoc2tpeSA6IDEgOiAzMTk5LjcKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtDaHVseW1za2l5IDogMSA6IDg1OTEuNQorT21za2HvYSBvYmxhc3Q7Tml6aG5lb21za2l5IDogMSA6IDI5OTIuNQorS2VtZXJvdnNrYe9hIG9ibGFzdDtUaXN1bHNraXkgOiAxIDogMTA4NjAuMgorT21za2HvYSBvYmxhc3Q7U2FyZ2F0c2tpeSA6IDEgOiA2MDMwLjc5OTgKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7U2xhZGtvdnNraXkgOiAxIDogMzY5My4yCitLZW1lcm92c2th72Egb2JsYXN0O0tlbWVyb3Zza2l5IDogMSA6IDQ0OTkuNzAwMgorT21za2HvYSBvYmxhc3Q7VHVrYWxpbnNrIDogMSA6IDQuNjk5OTk5OAorVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtLYXphbnNraXkgOiAxIDogMjg0NS4xMDAxCitLZW1lcm92c2th72Egb2JsYXN0O0JlcmV6b3Zza2l5IDogMSA6IDEuOAorT21za2HvYSBvYmxhc3Q7R29ya292c2tpeSA6IDEgOiAyNjU4LjEwMDEKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7WXVyZ2EgOiAxIDogMS4wCitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7S2FyZ2F0c2tpeSA6IDEgOiA1NjY2Ljc5OTgKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7VG9wa2luc2tpeSA6IDEgOiAyNzQ5LjcKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtNb3Noa292c2tpeSA6IDEgOiAyNzEwLjgKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtDaGFub3Zza2l5IDogMSA6IDUyODguMTAwMQorTm92b3NpYmlyc2th72Egb2JsYXN0O1RhdGFyc2tpeSA6IDEgOiA1MjE2LjUKK09tc2th72Egb2JsYXN0O0x5dWJpbnNraXkgOiAxIDogMzAzMi4wCitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7S29jaGVuZXZza2l5IDogMSA6IDQ5MjMuMTAwMQorT21za2HvYSBvYmxhc3Q7TmF6eXZheWV2c2sgOiAxIDogMi45MDAwMDAxCitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7VG9ndWNoaW5za2l5IDogMSA6IDYzODkuNQorTm92b3NpYmlyc2th72Egb2JsYXN0O05vdm9zaWJpcnNraXkgOiAxIDogMjczOC41CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7S3V5YmlzaGV2IDogMSA6IDMuMAorT21za2HvYSBvYmxhc3Q7T21za2l5IDogMSA6IDM2NjMuNworTm92b3NpYmlyc2th72Egb2JsYXN0O0JhcmFiaW5za2l5IDogMSA6IDU2MTMuNQorS2VtZXJvdnNrYe9hIG9ibGFzdDtLcmFwaXZpbnNraXkgOiAxIDogNDIwOC43MDAyCitLZW1lcm92c2th72Egb2JsYXN0O0tlbWVyb3ZvIDogMSA6IDMuMDk5OTk5OQorTm92b3NpYmlyc2th72Egb2JsYXN0O0JhcmFiaW5zayA6IDEgOiA0LjAKK09tc2th72Egb2JsYXN0O0thbGFjaGluc2tpeSA6IDEgOiAyNjQ4LjM5OTkKK09tc2th72Egb2JsYXN0O0lzaWxrdWxza2l5IDogMSA6IDMwMjIuODk5OQorS2VtZXJvdnNrYe9hIG9ibGFzdDtUb3BraSA6IDEgOiAxLjAKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtUYXRhcnNrIDogMSA6IDEuNgorT21za2HvYSBvYmxhc3Q7TW9za2FsZW5za2l5IDogMSA6IDI0MTYuMzk5OQorT21za2HvYSBvYmxhc3Q7S29ybWlsb3Zza2l5IDogMSA6IDE4NzAuMworTm92b3NpYmlyc2th72Egb2JsYXN0O05vdm9zaWJpcnNrIDogMSA6IDQ4NS4zOTk5OQorS2VtZXJvdnNrYe9hIG9ibGFzdDtQcm9teXNobGVubm92c2tpeSA6IDEgOiAyOTMxLjM5OTkKK09tc2th72Egb2JsYXN0O01hcnlhbm92c2tpeSA6IDEgOiAxOTM2LjAKK09tc2th72Egb2JsYXN0O09tc2sgOiAxIDogNDI3LjcwMDAxCitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7Q2hpc3Rvb3p5b3JueWkgOiAxIDogNjA1Mi42MDAxCitPbXNrYe9hIG9ibGFzdDtLYWxhY2hpbnNrIDogMSA6IDEuNgorTm92b3NpYmlyc2th72Egb2JsYXN0O1pkdmluc2tpeSA6IDEgOiA1MDAxLjc5OTgKK09tc2th72Egb2JsYXN0O09rb25lc2huaWtvdnNraXkgOiAxIDogMzAzMC4yCitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7SXNraXRpbXNraXkgOiAxIDogMzcwMS44OTk5CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7T2IgOiAxIDogNS4wCitLZW1lcm92c2th72Egb2JsYXN0O0xlbmluc2sta3V6bmV0c2tpeSA6IDEgOiAyMjk0LjYwMDEKK09tc2th72Egb2JsYXN0O0lzaWwna3VsJyA6IDEgOiAyLjA5OTk5OTkKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtLdXBpbnNraXkgOiAxIDogNjAzNC4zOTk5CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7RG92b2xlbnNraXkgOiAxIDogNDA4NS4yCitLZW1lcm92c2th72Egb2JsYXN0O01lemhkdXJlY2hlbnNraXkgOiAxIDogMTE1NDUuOAorT21za2HvYSBvYmxhc3Q7VGF2cmljaGVza2l5IDogMSA6IDI2NDYuNjAwMQorTm92b3NpYmlyc2th72Egb2JsYXN0O01hc2x5YW5pbnNraXkgOiAxIDogMzc3My4zOTk5CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7QmVyZHNrIDogMSA6IDY4LjQwMDAwMgorT21za2HvYSBvYmxhc3Q7QXpvdnNreSBuZW1ldHNreSBuYXRpb25hbCA6IDEgOiA4MzMuMjk5OTkKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtPcmR5bnNraXkgOiAxIDogMzU0OC41CitPbXNrYe9hIG9ibGFzdDtTaGVyYmFrdWxza2l5IDogMSA6IDI1MDMuMTAwMQorTm92b3NpYmlyc2th72Egb2JsYXN0O0lza2l0aW0gOiAxIDogMi4zCitPbXNrYe9hIG9ibGFzdDtDaGVybGFrc2tpeSA6IDEgOiA0NTU1LjUKK09tc2th72Egb2JsYXN0O1BvbHRhdnNraXkgOiAxIDogMjc2MS41CitLZW1lcm92c2th72Egb2JsYXN0O0JlbG92c2tpeSA6IDEgOiAzMjk1LjYwMDEKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7R3VyeWV2c2tpeSA6IDEgOiAyNDA3LjM5OTkKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7TGVuaW5zay1LdXpuZXRza2l5IDogMSA6IDEuMAorTm92b3NpYmlyc2th72Egb2JsYXN0O0tvY2hrb3Zza2l5IDogMSA6IDI1NzMuODk5OQorT21za2HvYSBvYmxhc3Q7T2Rlc3NraXkgOiAxIDogMjAyMC45CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7Q2hlcmVwYW5vdnNraXkgOiAxIDogMzE1Mi43CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7U3V6dW5za2l5IDogMSA6IDUwNTEuNQorT21za2HvYSBvYmxhc3Q7UGF2bG9ncmFkc2tpeSA6IDEgOiAyMDQ5LjAKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7WmFsZXNvdnNraXkgOiAxIDogMjkyMS4zOTk5CitLZW1lcm92c2th72Egb2JsYXN0O0JlbG92byA6IDEgOiAyLjAKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtLcmFzbm96ZXJza2l5IDogMSA6IDU0MzguMAorS2VtZXJvdnNrYe9hIG9ibGFzdDtQcm9rb3B5ZXZza2l5IDogMSA6IDM5MTYuMAorT21za2HvYSBvYmxhc3Q7Tm92b3ZhcnNoYXZza2l5IDogMSA6IDIzNTcuNjAwMQorTm92b3NpYmlyc2th72Egb2JsYXN0O0JhZ2Fuc2tpeSA6IDEgOiAzMjczLjcKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7S3J1dGlraGlua3NpeSA6IDEgOiAyMzYwLjYwMDEKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtLYXJhc3Vrc2tpeSA6IDEgOiA0NzI2LjEwMDEKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7R3VyeWV2c2sgOiAxIDogMS4yCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1phcmluc2tpeSA6IDEgOiA1MDIyLjIwMDIKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7Tm92b2t1em5ldHNraXkgOiAxIDogODY0MC4yOTk4CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1RhbG1lbnNraXkgOiAxIDogMzg1MS41CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1BhbmtydXNoeWtoaW5za2l5IDogMSA6IDI5NDUuNQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtLYW1lbnNraXkgOiAxIDogMzM5MC4yCitPbXNrYe9hIG9ibGFzdDtSdXNza28tUG9seWFuc2tpeSA6IDEgOiAzNDAzLjYwMDEKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7S2lzaWxldnNrIDogMSA6IDEuNworQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtQZXJ2b21heXNraXkgOiAxIDogMzQ1NS44OTk5CitLZW1lcm92c2th72Egb2JsYXN0O1Byb2tvcHlldnNrIDogMSA6IDEuNAorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtLeXRtYW5vdnNraXkgOiAxIDogMjUyOS4zCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0toYWJhcnNraXkgOiAxIDogMzMxMC4wCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0thbWVuJy1uYS1PYmkgOiAxIDogMS4yCitLZW1lcm92c2th72Egb2JsYXN0O01lenNoZHVyZWNoZW5zayA6IDEgOiAxNC43CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1NoZWxhYm9saWtoaW5za2l5IDogMSA6IDIwODMuODk5OQorS2VtZXJvdnNrYe9hIG9ibGFzdDtOb3Zva3V6bmV0c2sgOiAxIDogMi4yCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1RvZ3Vsc2tpeSA6IDEgOiAyMDk2LjAKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7TXlza2kgOiAxIDogMS4wCitSVS1VTkstMjg5MSA6IDEgOiAzLjUKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7QnVybGluc2tpeSA6IDEgOiAzMDc4LjcKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7T3Npbm5pa2kgOiAxIDogMS4wCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1BhdmxvdnNraXkgOiAxIDogMjEzOS44CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0JheWV2c2tpeSA6IDEgOiAyNTg0LjM5OTkKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7S29zaWtoaW5za2l5IDogMSA6IDE5NTEuNworQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtUeXVtZW50c2V2c2tpeSA6IDEgOiAyNTI4LjAKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7VGFzaHRhZ29sc2tpeSA6IDEgOiAxMjkwNS4wCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1llbHRzb3Zza2l5IDogMSA6IDIwMTcuNQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtCYXJuYXVsIDogMSA6IDgzMC4wOTk5OAorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtTdXlldHNraXkgOiAxIDogMTUzOC42CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO05vdm9hbHRheXNrIDogMSA6IDEwMy42CitSVS1VTkstMjg5MiA6IDEgOiAxOTM0LjcKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7UmVicmlraGluc2tpeSA6IDEgOiAyOTAzLjUKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7VHNlbGlubml5IDogMSA6IDI2OTkuMAorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtLYWxtYW5za2l5IDogMSA6IDE5NDUuMQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtTbGF2Z29yb2Rza2l5IDogMSA6IDE0MTUuNQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtUcm9pdHNraXkgOiAxIDogMzgxMi43CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0JsYWdvdmVzY2hlbnNraXkgOiAxIDogMzA5NC43CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1phdnlhbG92c2tpeSA6IDEgOiAxODcwLjgKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7U2xhdmdvcm9kIDogMSA6IDEuMgorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtTb2x0b25za2l5IDogMSA6IDI3NjUuNQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtUb3BjaGlraGluc2tpeSA6IDEgOiAzMDA3LjUKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7VGFidW5za2l5IDogMSA6IDE3NTYuMworQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtNYW1vbnRvdnNraXkgOiAxIDogMjE5Mi4zCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1pvbmFsbnlpIDogMSA6IDIxMDIuMAorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtCaXlza2l5IDogMSA6IDI0NDguMTAwMQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtSb2RpbnNraXkgOiAxIDogMzMyNS44OTk5CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1JvbWFub3Zza2l5IDogMSA6IDIyMDIuMAorS2VtZXJvdnNrYe9hIG9ibGFzdDtUYXNodGFnb2wgOiAxIDogMS4wCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0t1bHVuZGluc2tpeSA6IDEgOiAyMTczLjcKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7QWxleXNraXkgOiAxIDogMzY1Mi4zOTk5CitSZXNwb3VibGlrYSBBbHRh7ztUdXJvY2hha3NraXkgOiAxIDogMTEwOTUuNQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtVc3QtUHJpc3RhbnNraXkgOiAxIDogMjYyOS43CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1NoaXB1bm92c2tpeSA6IDEgOiA0MTIwLjIwMDIKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7S3Jhc25vZ29yc2tpeSA6IDEgOiAzMDYxLjcKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7QnlzdHJvaXN0b2tza2l5IDogMSA6IDE1MjYuNgorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtLbHl1Y2hldnNraXkgOiAxIDogMzIwMC43CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0JpeXNrIDogMSA6IDIuMworQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtBbGV5c2sgOiAxIDogMS4wCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1Ntb2xlbnNraXkgOiAxIDogMjEyMy4zCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1NvdmV0c2tpeSA6IDEgOiAxNTIwLjUKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7Tm92aWNoaWtoaW5za2l5IDogMSA6IDIwNDEuNgorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtQZXRyb3BhdmxvdnNraXkgOiAxIDogMTY2MC43CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1ZvbGNoaWtoaW5za2l5IDogMSA6IDM2MTIuNjAwMQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtVc3QtS2FsbWFuc2tpeSA6IDEgOiAyNTUxLjYwMDEKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7UG9zcGVsaWtoaW5za2l5IDogMSA6IDI1MDUuMzk5OQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtNaWtoYXlsb3Zza2l5IDogMSA6IDMzOTUuNjAwMQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtBbHRheXNraXkgOiAxIDogMzg3NS4zCitSZXNwb3VibGlrYSBBbHRh7ztDaG95c2tpeSA6IDEgOiA0MDY2LjUKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7WWVnb3J5ZXZza2l5IDogMSA6IDIyOTguMAorUmVzcG91Ymxpa2EgQWx0Ye87TWF5bWluc2tpeSA6IDEgOiAxMjQwLjkKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7QmVsb2t1cmlraGEgOiAxIDogMS40CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1NvbG9uZXNoZW5za2l5IDogMSA6IDM1MDUuNjAwMQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtSdWJ0c292c2tpeSA6IDEgOiAzNTY1LjUKK1Jlc3BvdWJsaWthIEFsdGHvO0dvcm5vLUFsdGF5c2sgOiAxIDogNC4wCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0tyYXNub3NoZWtvdnNraXkgOiAxIDogMzQyNC42MDAxCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0NoYXJ5c2hza2l5IDogMSA6IDY5MjguNjAwMQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtVZ2xvdnNraXkgOiAxIDogNDkyMS44OTk5CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0t1cnlpbnNraXkgOiAxIDogMjQ3Mi43CitSZXNwb3VibGlrYSBBbHRh7ztTaGViYWxpbnNraXkgOiAxIDogMzg3NC44CitSZXNwb3VibGlrYSBBbHRh7ztDaGVtYWxza3kgOiAxIDogMjgyOC4wCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1ptZWlub2dvcnNraXkgOiAxIDogMjk4NS44CitSZXNwb3VibGlrYSBBbHRh7ztVbGFnYW5za2l5IDogMSA6IDE4NDA1LjMwMQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtSdWJ0em92c2sgOiAxIDogNy45MDAwMDAxCitSZXNwb3VibGlrYSBBbHRh7ztVc3QtS2Fuc2tpeSA6IDEgOiA2NjQ0LjcwMDIKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7TG9rdGV2c2tpeSA6IDEgOiAyNDgwLjgKK1Jlc3BvdWJsaWthIEFsdGHvO09uZ3VkYXlza2l5IDogMSA6IDExODg0LjcKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7Wm1laW5vZ29yc2sgOiAxIDogMS4wCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1RyZXRpeWFrb3Zza2l5IDogMSA6IDE5MjQuMQorUmVzcG91Ymxpa2EgQWx0Ye87VXN0LUtva3NpbnNraXkgOiAxIDogMTMyMjAuNgorUmVzcG91Ymxpa2EgQWx0Ye87S29zaC1BZ2FjaHNraXkgOiAxIDogMTk3ODQuNAorUlUtVU5LLTI4OTMgOiAxIDogMzcyMzQuODk4CitSVS1VTkstMjg5NCA6IDEgOiAzNzIzNC44OTgKK1JVLVVOSy0yODk1IDogMSA6IDEuNworUlUtVU5LLTI4OTYgOiAxIDogMzY5NC41CitSVS1VTkstMjg5NyA6IDEgOiAzLjUKK1JVLVVOSy0yODk4IDogMSA6IDE5MzQuNworVGF0YXJzdGFuO0JhbHRhc2luc2tpeSA6IDEgOiAxMTQ3LjYKK1RhdGFyc3RhbjtBZ3J5enNraXkgOiAxIDogMTg3NC4wCitUYXRhcnN0YW47QXJza2l5IDogMSA6IDE1ODcuOQorVGF0YXJzdGFuO1Z5c29rb2dvcnNraXkgOiAxIDogMTk4MC43CitUYXRhcnN0YW47QXRuaW5za2l5IDogMSA6IDQ3NS44OTk5OQorVGF0YXJzdGFuO0t1a21vcnNraXkgOiAxIDogMTMxOS45CitUYXRhcnN0YW47U2FiaW5za2l5IDogMSA6IDE1MjkuNAorVGF0YXJzdGFuO01hbWFkeXNoc2tpeSA6IDEgOiAyNTYxLjIKK1RhdGFyc3RhbjtaZWxlbm9kb2xza2l5IDogMSA6IDc0Ny41CitUYXRhcnN0YW47TWVuZGVsZXlldnNraXkgOiAxIDogNTIyLjQwMDAyCitUYXRhcnN0YW47UGVzdHJlY2hpbnNraXkgOiAxIDogMTM1OC4yCitUYXRhcnN0YW47WWVsYWJ1emhza2l5IDogMSA6IDEyODMuOQorVGF0YXJzdGFuO0themFuIDogMSA6IDM3OS42MDAwMQorVGF0YXJzdGFuO0FrdGFueXNoc2tpeSA6IDEgOiAyMTcyLjYwMDEKK1RhdGFyc3RhbjtUdXlsYWNoaW5za2l5IDogMSA6IDUyNi4wCitUYXRhcnN0YW47VHVrYXlldnNraXkgOiAxIDogMTU2NS4wCitUYXRhcnN0YW47TWVuemVsaW5za2l5IDogMSA6IDEyODYuMQorVGF0YXJzdGFuO1plbGVub2RvbCdzayA6IDEgOiAxLjAKK1RhdGFyc3RhbjtSeWJuby1TbG9ib2Rza2l5IDogMSA6IDE3MTkuMAorVGF0YXJzdGFuO0VsYWJ1Z2EgOiAxIDogMy4yCitUYXRhcnN0YW47VmVya2huZXVzbG9uc2tpeSA6IDEgOiA5OTAuNTk5OTgKK1RhdGFyc3RhbjtMYWlzaGV2c2tpeSA6IDEgOiAxNTI1LjMKK1RhdGFyc3RhbjtOYWJlcmV6aG5peWUgQ2hlbG55IDogMSA6IDQuMTk5OTk5OAorVGF0YXJzdGFuO05pemhuZWthbXNraXkgOiAxIDogMTUxMS4yCitUYXRhcnN0YW47Tml6c2huZWthbXNrIDogMSA6IDMuNDAwMDAwMQorUlUtVU5LLTI4OTkgOiAxIDogMTI3Ny4xCitSVS1VTkstMjkwMCA6IDEgOiA3NTAuNDAwMDIKK1RhdGFyc3RhbjtTYXJtYW5vdnNraXkgOiAxIDogMTIzNy43CitUYXRhcnN0YW47WmFpbnNraXkgOiAxIDogMTk5MC40CitUYXRhcnN0YW47S2Ftc2tvLVVzdHlpbnNraXkgOiAxIDogNzY4Ljc5OTk5CitUYXRhcnN0YW47TXVzbHl1bW92c2tpeSA6IDEgOiAxNDA2LjcKK1RhdGFyc3RhbjtDaGlzdG9wb2xza2l5IDogMSA6IDE0NjMuNQorVGF0YXJzdGFuO0NoaXN0b3BvbCcgOiAxIDogMi41OTk5OTk5CitUYXRhcnN0YW47QWxla3NleWV2c2tpeSA6IDEgOiAxNTM2LjIKK1RhdGFyc3RhbjtOb3Zvc2hlc2htaW5za2l5IDogMSA6IDEyNDUuMgorVGF0YXJzdGFuO1phaW5zayA6IDEgOiAxLjQKK1RhdGFyc3RhbjtCdWluc2tpeSA6IDEgOiAxNTM1LjYKK1RhdGFyc3RhbjtBbG1ldHlldnNraXkgOiAxIDogMjczMS4zOTk5CitUYXRhcnN0YW47S3V5YnlzaGV2c2tpeSA6IDEgOiAxNjQyLjgKK1RhdGFyc3RhbjtUZXR5dXNoc2tpeSA6IDEgOiAxNTU5LjgKK1RhdGFyc3RhbjtBem5ha2F5ZXZza2l5IDogMSA6IDE5MzMuMworVGF0YXJzdGFuO0Frc3ViYXlldnNraXkgOiAxIDogMTEyOS4wCitUYXRhcnN0YW47QWxrZXlldnNraXkgOiAxIDogMTc1Ny4yCitUYXRhcnN0YW47Q2hlcmVtc2hhbnNraXkgOiAxIDogMTUxNC40CitUYXRhcnN0YW47QWxtZXR5ZXZzayA6IDEgOiA1LjMwMDAwMDIKK1RhdGFyc3RhbjtPa3R5YWJyc2tpeSA6IDEgOiAyMzg5LjIKK1RhdGFyc3RhbjtBem5ha2Fldm8gOiAxIDogMi4wCitUYXRhcnN0YW47RHJvemhhbm92c2tpeSA6IDEgOiAxMDgzLjgKK091bGlhbm92c2th72Egb2JsYXN0O1N0YXJvbWF5bnNraXkgOiAxIDogMTQ2Ny4xCitUYXRhcnN0YW47TGVuaW5vZ29yc2tpeSA6IDEgOiAxNjEwLjQKK1RhdGFyc3RhbjtZdXRhemluc2tpeSA6IDEgOiA5NDYuMjAwMDEKK1RhdGFyc3RhbjtCdWd1bG1pbnNraXkgOiAxIDogMTI3NS45CitPdWxpYW5vdnNrYe9hIG9ibGFzdDtTdXJza2l5IDogMSA6IDIyNDEuMgorT3VsaWFub3Zza2HvYSBvYmxhc3Q7VHN5bG5pbnNraXkgOiAxIDogMTI5MS41CitPdWxpYW5vdnNrYe9hIG9ibGFzdDtVbHlhbm92c2tpeSA6IDEgOiAxODA3LjAKK1RhdGFyc3RhbjtMZW5pbmlnb3JzayA6IDEgOiAzLjMKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7Q2hlbG5vLVZlcnNoaW5za2l5IDogMSA6IDExMTMuNgorU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtTaGVudGFsaW5za2l5IDogMSA6IDEyNTIuOQorT3VsaWFub3Zza2HvYSBvYmxhc3Q7TWVsZWtlc3NraXkgOiAxIDogMzU4My41CitPdWxpYW5vdnNrYe9hIG9ibGFzdDtNYXluc2tpeSA6IDEgOiAyMzU4LjgKK1RhdGFyc3RhbjtCdWd1bCdtYSA6IDEgOiAzLjIKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7S2x5YXZsaW5za2l5IDogMSA6IDE0NTUuOAorT3VsaWFub3Zza2HvYSBvYmxhc3Q7Tm92b21hbHlrbGluc2tpeSA6IDEgOiAxMDAzLjgKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7S29zaGtpbnNraXkgOiAxIDogMTg5Ny40CitPdWxpYW5vdnNrYe9hIG9ibGFzdDtDaGVyZGFrbGluc2tpeSA6IDEgOiAxNTYyLjUKK1RhdGFyc3RhbjtCYXZsaW5za2l5IDogMSA6IDExNzQuNAorT3VsaWFub3Zza2HvYSBvYmxhc3Q7S2Fyc3Vuc2tpeSA6IDEgOiAxNjYzLjgKK091bGlhbm92c2th72Egb2JsYXN0O1VseWFub3ZzayA6IDEgOiAzNC4wCitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO1NlcmdpeWV2c2tpeSA6IDEgOiAyNDk2LjgKK091bGlhbm92c2th72Egb2JsYXN0O0luemVuc2tpeSA6IDEgOiAyMTg5LjIKK091bGlhbm92c2th72Egb2JsYXN0O0RpbWl0cm92Z3JhZCA6IDEgOiA1LjA5OTk5OTkKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7S2FteXNobGVuc2t5IDogMSA6IDk3OC41CitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO0lzYWtsaW5za2l5IDogMSA6IDE3NjguNQorT3VsaWFub3Zza2HvYSBvYmxhc3Q7VmVzaGtheW1za2l5IDogMSA6IDE2MjQuNAorT3VsaWFub3Zza2HvYSBvYmxhc3Q7U2VuZ2lsZXlldnNraXkgOiAxIDogMTE2NS43CitPdWxpYW5vdnNrYe9hIG9ibGFzdDtUZXJlbmd1bHNraXkgOiAxIDogMjA3NC4yCitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO0Vsa2hvdnNreSA6IDEgOiA5NzYuMAorT3VsaWFub3Zza2HvYSBvYmxhc3Q7S3V6b3ZhdG92c2tpeSA6IDEgOiAyMTA5LjYwMDEKK1BlbnplbnNrYe9hIG9ibGFzdDtOaWtvbHNraXkgOiAxIDogMjMyMS4zCitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO1Bva2h2aXN0bmV2byA6IDEgOiAyMDExLjMKK1BlbnplbnNrYe9hIG9ibGFzdDtCZWRub2RlbXlhbm92c2tpeSA6IDEgOiA2NzQuMjk5OTkKK1BlbnplbnNrYe9hIG9ibGFzdDtOYXJvdmNoYXRza2l5IDogMSA6IDc2Mi4wCitQZW56ZW5za2HvYSBvYmxhc3Q7SXNzaW5za2l5IDogMSA6IDcyOC43MDAwMQorUGVuemVuc2th72Egb2JsYXN0O0x1bmlubyA6IDEgOiAxNjg0LjcKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7U3RhdnJvcG9sc2tpeSA6IDEgOiAxODUxLjEKK091bGlhbm92c2th72Egb2JsYXN0O0JhemFybm9zeXpnYW5za2l5IDogMSA6IDkwNy4wCitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO0tyYXNub3lhcnNraXkgOiAxIDogMjc0Mi4zCitPdWxpYW5vdnNrYe9hIG9ibGFzdDtCYXJ5c2hza2l5IDogMSA6IDE5NzQuMAorUGVuemVuc2th72Egb2JsYXN0O1plbWV0Y2hpbnNraXkgOiAxIDogMTg2NS42CitQZW56ZW5za2HvYSBvYmxhc3Q7VmFkaW5za2l5IDogMSA6IDkzNC41CitQZW56ZW5za2HvYSBvYmxhc3Q7Tml6aG5lbG9tb3Zza2l5IDogMSA6IDE5ODguMAorU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtTaGlnb25za2l5IDogMSA6IDEyNjUuNworUGVuemVuc2th72Egb2JsYXN0O01va3NoYW5za2l5IDogMSA6IDIzMjEuNworU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtLaW5lbC1DaGVya2Fzc2tpeSA6IDEgOiAyNTg0LjM5OTkKK091bGlhbm92c2th72Egb2JsYXN0O0JhcnlzaCA6IDEgOiAxLjgKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7Vm9semhza2l5IDogMSA6IDUwLjU5OTk5OAorUGVuemVuc2th72Egb2JsYXN0O1Nvc25vdm9ib3Jza2l5IDogMSA6IDE1OTkuNworUlUtVU5LLTI5MDEgOiAxIDogMjEuMAorUGVuemVuc2th72Egb2JsYXN0O0Jlc3Nvbm92c2tpeSA6IDEgOiAxMjA5LjQKK1BlbnplbnNrYe9hIG9ibGFzdDtHb3JvZGlzY2hlbnNraXkgOiAxIDogMjE4Ny41CitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO1RvbHlhdHRpIDogMSA6IDYuNjk5OTk5OAorUGVuemVuc2th72Egb2JsYXN0O0Jhc2htYWtvdnNraXkgOiAxIDogMTc0MC42CitQZW56ZW5za2HvYSBvYmxhc3Q7UGFjaGVsbXNraXkgOiAxIDogMTMxNi4zCitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO1N5enJhbnNraXkgOiAxIDogMjIyMi44CitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO0tpbmVsc2tpeSA6IDEgOiAyMTMwLjUKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7WmhpZ3VseW92c2tpeSA6IDEgOiA2LjE5OTk5OTgKK1BlbnplbnNrYe9hIG9ibGFzdDtLdXpuZXRza2l5IDogMSA6IDE4MDUuOAorUGVuemVuc2th72Egb2JsYXN0O0thbWVuc2tpeSA6IDEgOiAyMTk2Ljg5OTkKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7T3RyYWRueWkgOiAxIDogMi44CitPdWxpYW5vdnNrYe9hIG9ibGFzdDtOb3Zvc3Bhc3NraXkgOiAxIDogMTQzMi4xCitPdWxpYW5vdnNrYe9hIG9ibGFzdDtOaWtvbGF5ZXZza2l5IDogMSA6IDIwODYuMgorU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtCb3Jza2l5IDogMSA6IDIzNjMuOAorU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtTYW1hcmEgOiAxIDogMTQyLjgKK1BlbnplbnNrYe9hIG9ibGFzdDtQZW56YSA6IDEgOiAyNjUuMjAwMDEKK1BlbnplbnNrYe9hIG9ibGFzdDtQZW56ZW5za2l5IDogMSA6IDE4NzYuNgorU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtCb2dhdG92c2tpeSA6IDEgOiA2NTEuNDAwMDIKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7S2luZWwgOiAxIDogMS4zCitQZW56ZW5za2HvYSBvYmxhc3Q7QmVsaW5za2l5IDogMSA6IDIzNDAuMTAwMQorUGVuemVuc2th72Egb2JsYXN0O0thbWVua2EgOiAxIDogMzAuOQorU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtPa3R5YWJyc2sgOiAxIDogMS4wCitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO1ByaXZvbHpoc2tpeSA6IDEgOiAxMDk5LjMKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7QmV6ZW5jaHVrc2tpeSA6IDEgOiAxMzcxLjUKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7U3l6cmFuIDogMSA6IDIuOTAwMDAwMQorUGVuemVuc2th72Egb2JsYXN0O0t1em5ldHNrIDogMSA6IDMxLjUKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7Tm92b2t1eWJ5c2hldnNrIDogMSA6IDUuMAorUGVuemVuc2th72Egb2JsYXN0O1NoZW15c2hleXNraXkgOiAxIDogMTM3My4yCitPdWxpYW5vdnNrYe9hIG9ibGFzdDtSYWRpc2NoZXZza2l5IDogMSA6IDE2MDguNAorUGVuemVuc2th72Egb2JsYXN0O0thbWVzaGtpcnNraXkgOiAxIDogMTIwOC4yCitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO05lZnRlZ29yc2tpeSA6IDEgOiAxNDY2LjQKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7Q2hhcGF5ZXZzayA6IDEgOiAyLjIKK1BlbnplbnNrYe9hIG9ibGFzdDtOZXZlcmtpbnNraXkgOiAxIDogMTAwNi4yCitPdWxpYW5vdnNrYe9hIG9ibGFzdDtTdGFyb2t1bGF0a2luc2tpeSA6IDEgOiA5NTYuMjAwMDEKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7S3Jhc25vYXJtZXlza2l5IDogMSA6IDE5ODcuMworUGVuemVuc2th72Egb2JsYXN0O0tvbHlzaGxleXNraXkgOiAxIDogMTYyMy41CitQZW56ZW5za2HvYSBvYmxhc3Q7S29uZG9sc2tpeSA6IDEgOiA5MTQuNDAwMDIKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7QWxla3NleWV2c2tpeSA6IDEgOiAxNzkwLjIKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7S2h2b3Jvc3R5YW5za2l5IDogMSA6IDIwNDYuOQorT3VsaWFub3Zza2HvYSBvYmxhc3Q7UGF2bG92c2tpeSA6IDEgOiA3MDkuMjk5OTkKK1BlbnplbnNrYe9hIG9ibGFzdDtTZXJkb2Jza2l5IDogMSA6IDE1NDkuNgorUGVuemVuc2th72Egb2JsYXN0O1RhbWFsaW5za2l5IDogMSA6IDk3My4wOTk5OAorUGVuemVuc2th72Egb2JsYXN0O0xvcGF0aW5vIDogMSA6IDE2MTIuNgorU2FyYXRvdnNrYe9hIG9ibGFzdDtLaHZhbHluc2tpeSA6IDEgOiAxNjQ1LjYKK1BlbnplbnNrYe9hIG9ibGFzdDtCZWtvdnNraXkgOiAxIDogOTQ4LjQwMDAyCitTYXJhdG92c2th72Egb2JsYXN0O0R1a2hvdm5pdHNraXkgOiAxIDogMTYzMy40CitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO0JvbHNoZWdsdXNoaXRza2l5IDogMSA6IDI4NzMuMAorU2FyYXRvdnNrYe9hIG9ibGFzdDtCYWx0YXlza2l5IDogMSA6IDEzOTIuNworU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtQZXN0cmF2c2tpeSA6IDEgOiAxODMwLjIKK1BlbnplbnNrYe9hIG9ibGFzdDtNYWxvc2VyZG9iaW5za2l5IDogMSA6IDEzMTkuOQorU2FyYXRvdnNrYe9hIG9ibGFzdDtCYXphcm5vLUthcmFidWxha3NraXkgOiAxIDogMjE3NC44OTk5CitTYXJhdG92c2th72Egb2JsYXN0O1ZvbHNraXkgOiAxIDogMzI1Mi42MDAxCitTYXJhdG92c2th72Egb2JsYXN0O1lla2F0ZXJpbm92c2tpeSA6IDEgOiAzMDQwLjIKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7SXZhbnRleWV2c2tpeSA6IDEgOiAyMTExLjAKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7S2h2YWx5bnNrIDogMSA6IDEuOAorU2FyYXRvdnNrYe9hIG9ibGFzdDtQZXRyb3Zza2l5IDogMSA6IDIxMDUuMgorUGVuemVuc2th72Egb2JsYXN0O1NlcmRvYnNrIDogMSA6IDE2LjIwMDAwMQorU2FyYXRvdnNrYe9hIG9ibGFzdDtSdGlzY2hldnNraXkgOiAxIDogMjE3Ni42MDAxCitTYXJhdG92c2th72Egb2JsYXN0O05vdm9idXJhc3NraXkgOiAxIDogMTg3My4yCitTYXJhdG92c2th72Egb2JsYXN0O1B1Z2FjaHlvdnNraXkgOiAxIDogMzg2My42MDAxCitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO0JvbHNoZWNoZXJuaWdvdnNraXkgOiAxIDogMjc2Mi4wCitTYXJhdG92c2th72Egb2JsYXN0O1BldHJvdnNrIDogMSA6IDI3LjIwMDAwMQorU2FyYXRvdnNrYe9hIG9ibGFzdDtUdXJrb3Zza2l5IDogMSA6IDEzNjEuMAorU2FyYXRvdnNrYe9hIG9ibGFzdDtSdGlzaGNoZXZvIDogMSA6IDQyLjUKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7QXRrYXJza2l5IDogMSA6IDI4NDIuMworU2FyYXRvdnNrYe9hIG9ibGFzdDtCYWxha292c2tpeSA6IDEgOiAzMjY3LjcKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7UGVyZWx5dWJza2l5IDogMSA6IDM2ODEuNworU2FyYXRvdnNrYe9hIG9ibGFzdDtBcmthZGFrc2tpeSA6IDEgOiAyNTQwLjYwMDEKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7Vm9za3Jlc2Vuc2tpeSA6IDEgOiAxMzM2LjUKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7Vm9sc2sgOiAxIDogNjYuMzAwMDAzCitTYXJhdG92c2th72Egb2JsYXN0O0JhbGFrb3ZvIDogMSA6IDcyLjUKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7VGF0aXNjaGV2c2tpeSA6IDEgOiAxOTkxLjgKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7UHVnYWNoZXYgOiAxIDogOTQuNQorU2FyYXRvdnNrYe9hIG9ibGFzdDtSb21hbm92c2tpeSA6IDEgOiAxNTM3LjcKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7TWFya3NvdnNraXkgOiAxIDogMjY2OS4wCitTYXJhdG92c2th72Egb2JsYXN0O0tyYXNub3BhcnRpemFuc2tpeSA6IDEgOiAyMjUwLjM5OTkKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7QXRrYXJzayA6IDEgOiAxLjUKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7U2FyYXRvdnNraXkgOiAxIDogNDI4LjI5OTk5CitTYXJhdG92c2th72Egb2JsYXN0O0JhbGFzaG92c2tpeSA6IDEgOiAyOTAxLjg5OTkKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7WWVyc2hvdnNraXkgOiAxIDogNDM3NS41CitTYXJhdG92c2th72Egb2JsYXN0O0thbGluaW5za2l5IDogMSA6IDM1OTkuNjAwMQorU2FyYXRvdnNrYe9hIG9ibGFzdDtNYXJ4IDogMSA6IDEuNgorU2FyYXRvdnNrYe9hIG9ibGFzdDtPemluc2tpeSA6IDEgOiAzMjM5LjcKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7THlzb2dvcnNraXkgOiAxIDogMjQyNy4zOTk5CitTYXJhdG92c2th72Egb2JsYXN0O1NhcmF0b3YgOiAxIDogMjQ3LjYwMDAxCitTYXJhdG92c2th72Egb2JsYXN0O0VuZ2Vsc2tpeSA6IDEgOiAyNzgwLjEwMDEKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7RGVyZ2FjaHlvdnNraXkgOiAxIDogNDIwMi4wCitTYXJhdG92c2th72Egb2JsYXN0O0JhbGFzaG92IDogMSA6IDY3LjA5OTk5OAorU2FyYXRvdnNrYe9hIG9ibGFzdDtGZWRvcm92c2tpeSA6IDEgOiAyNjE1LjEwMDEKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7U292ZXRza2l5IDogMSA6IDE2MTkuNworU2FyYXRvdnNrYe9hIG9ibGFzdDtFbmdlbHMgOiAxIDogOTQuMAorU2FyYXRvdnNrYe9hIG9ibGFzdDtTYW1veWxvdnNraXkgOiAxIDogMjU4NS44OTk5CitTYXJhdG92c2th72Egb2JsYXN0O0tyYXNub2FybWV5c2tpeSA6IDEgOiAyNjY1LjIKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtOb3Zvbmlrb2xheWV2c2tpeSA6IDEgOiAyNjAzLjEwMDEKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7S3Jhc25va3V0c2tpeSA6IDEgOiAyOTQ0LjEwMDEKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtZZWxhbnNraXkgOiAxIDogMjY1OS4xMDAxCitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7VXJ5dXBpbnNraXkgOiAxIDogMzUxNy44OTk5CitTYXJhdG92c2th72Egb2JsYXN0O1JvdmVuc2tpeSA6IDEgOiAyMjkxLjM5OTkKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtaaGlybm92c2tpeSA6IDEgOiAyNTM3LjAKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtLaWt2aWR6ZW5za2l5IDogMSA6IDIxMTAuMgorVm9sZ29ncmFkc2th72Egb2JsYXN0O1J1ZG55YW5za2l5IDogMSA6IDE3OTMuMworU2FyYXRvdnNrYe9hIG9ibGFzdDtLcmFzbm9hcm1leXNrIDogMSA6IDEuNgorU2FyYXRvdnNrYe9hIG9ibGFzdDtQaXRlcnNraXkgOiAxIDogMjUyOC4xMDAxCitTYXJhdG92c2th72Egb2JsYXN0O05vdm91emVuc2tpeSA6IDEgOiA0Mjk1LjI5OTgKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtOb3ZvYW5uaW5za2l5IDogMSA6IDI2MTUuNworVm9sZ29ncmFkc2th72Egb2JsYXN0O1VydXBpbnNrIDogMSA6IDIuNQorVm9sZ29ncmFkc2th72Egb2JsYXN0O0Rhbmlsb3Zza2l5IDogMSA6IDMxNjAuMgorVm9sZ29ncmFkc2th72Egb2JsYXN0O1N0YXJvcG9sdGF2c2tpeSA6IDEgOiAzMTIwLjMKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtLYW15c2hpbnNraXkgOiAxIDogMzUxOS4zCitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7S290b3Zza2l5IDogMSA6IDIzOTguODk5OQorVm9sZ29ncmFkc2th72Egb2JsYXN0O05la2hheWV2c2tpeSA6IDEgOiAyMjU3LjUKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtNaWtoYXlsb3Zza2l5IDogMSA6IDM4MTguNQorU2FyYXRvdnNrYe9hIG9ibGFzdDtBbGVrc2FuZHJvdi1HYXlza2l5IDogMSA6IDIyMDIuMzk5OQorVm9sZ29ncmFkc2th72Egb2JsYXN0O0FsZWtzZXlldnNraXkgOiAxIDogMjM3MC4xMDAxCitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7UGFsbGFzb3Zza2l5IDogMSA6IDEyNzMxLjgKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtOaWtvbGF5ZXZza2l5IDogMSA6IDI1ODEuMzk5OQorVm9sZ29ncmFkc2th72Egb2JsYXN0O0Zyb2xvdnNraXkgOiAxIDogMzc3OC42MDAxCitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7T2xraG92c2tpeSA6IDEgOiAzMzEzLjYwMDEKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtLYW15c2hpbiA6IDEgOiA1LjY5OTk5OTgKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtNaWtoYWlsb3ZrYSA6IDEgOiA1LjkwMDAwMDEKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtQb2R0ZWxrb3Zza2l5IDogMSA6IDI3OTguOAorVm9sZ29ncmFkc2th72Egb2JsYXN0O0J5a292c2tpeSA6IDEgOiAzMTU2LjUKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtTZXJhZmltb3ZpY2hza2l5IDogMSA6IDQwMzEuMTAwMQorVm9sZ29ncmFkc2th72Egb2JsYXN0O0Zyb2xvdm8gOiAxIDogMy40MDAwMDAxCitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7RHVib3Zza2l5IDogMSA6IDIzNjcuMTAwMQorVm9sZ29ncmFkc2th72Egb2JsYXN0O0lsb3ZsaW5za2l5IDogMSA6IDM2NDQuMworVm9sZ29ncmFkc2th72Egb2JsYXN0O0tsZXRza2l5IDogMSA6IDM0MTMuMgorVm9sZ29ncmFkc2th72Egb2JsYXN0O0xlbmluc2tpeSA6IDEgOiAyNjM3LjYwMDEKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtLYWxhY2hldnNraXkgOiAxIDogNjIzLjcwMDAxCitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7R29yb2Rpc2NoZW5za2l5IDogMSA6IDI1NDkuMzk5OQorVm9sZ29ncmFkc2th72Egb2JsYXN0O1NyZWRuZWFraHR1Ymluc2tpeSA6IDEgOiAxOTUwLjgKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtTdXJvdmlraW5za2l5IDogMSA6IDM1MTMuMgorVm9sZ29ncmFkc2th72Egb2JsYXN0O1ZvbGdvZ3JhZCA6IDEgOiAyOTQuMjAwMDEKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtWb2x6aHNraXkgOiAxIDogOTIuMDk5OTk4CitBc3RyYWtoYW5za2HvYSBvYmxhc3Q7QWtodHViaW5za2l5IDogMSA6IDc0MTkuNzk5OAorVm9sZ29ncmFkc2th72Egb2JsYXN0O1N2ZXRsb3lhcnNraXkgOiAxIDogMzQ0Mi4zOTk5CitBc3RyYWtoYW5za2HvYSBvYmxhc3Q7Q2h5b3Jub3lhcnNraXkgOiAxIDogMzg3Mi4wCitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7Q2hlcm55c2hrb3Zza2l5IDogMSA6IDIzODEuMworS2FsbXlraWE7TWFsb2RlcmJldG92c2tpeSA6IDEgOiAzOTUxLjMKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtPa3R5YWJyc2tpeSA6IDEgOiAzNTI3LjUKK0FzdHJha2hhbnNrYe9hIG9ibGFzdDtBa2h0dWJpbnNrIDogMSA6IDIuNTk5OTk5OQorS2FsbXlraWE7T2t0eWFicnNraXkgOiAxIDogNDg5Ny4yOTk4CitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7S290ZWxuaWtvdnNraXkgOiAxIDogMjgyMi41CitBc3RyYWtoYW5za2HvYSBvYmxhc3Q7WWVub3RheWV2c2tpeSA6IDEgOiAyMTM4LjYwMDEKK0thbG15a2lhO1NhcnBpbnNraXkgOiAxIDogMzIzMC4zOTk5CitBc3RyYWtoYW5za2HvYSBvYmxhc3Q7S2hhcmFiYWxpbnNraXkgOiAxIDogODkxNi41OTk2CitLYWxteWtpYTtZdXN0aW5za2l5IDogMSA6IDg5ODIuMjAwMgorS2FsbXlraWE7S2V0Y2hlbmVyb3Zza2l5IDogMSA6IDUwOTcuMAorQXN0cmFraGFuc2th72Egb2JsYXN0O0tyYXNub3lhcnNraXkgOiAxIDogNTExMi41CitLYWxteWtpYTtZYXNoa3Vsc2tpeSA6IDEgOiAxMjMxMy4wCitLYWxteWtpYTtUc2VsaW5ueWkgOiAxIDogNDc1MS43OTk4CitBc3RyYWtoYW5za2HvYSBvYmxhc3Q7TmFyaW1hbm92c2tpeSA6IDEgOiA1MjkzLjg5OTkKK0thbG15a2lhO1lhc2hhbHRpbnNraXkgOiAxIDogMTc5MC4yCitBc3RyYWtoYW5za2HvYSBvYmxhc3Q7Vm9sb2RhcnNraXkgOiAxIDogMjY2OC42MDAxCitBc3RyYWtoYW5za2HvYSBvYmxhc3Q7UHJpdm9semhza2l5IDogMSA6IDcyNi4wCitLYWxteWtpYTtQcml5dXRpbnNraXkgOiAxIDogMzE5Ni44CitBc3RyYWtoYW5za2HvYSBvYmxhc3Q7QXN0cmFraGFuIDogMSA6IDIwNS4xMDAwMQorS2FsbXlraWE7RWxpc3RhIDogMSA6IDE1MS44CitLYWxteWtpYTtDaGVybm96ZW1lbHNraXkgOiAxIDogMTQxOTQuMgorS2FsbXlraWE7R29yb2Rvdmlrb3Zza2l5IDogMSA6IDk5Ny43MDAwMQorQXN0cmFraGFuc2th72Egb2JsYXN0O0lrcnlhbmluc2tpeSA6IDEgOiAxNzU3LjEKK0thbG15a2lhO0lraS1CdXJ1bHNraXkgOiAxIDogNjQwOS4xMDAxCitBc3RyYWtoYW5za2HvYSBvYmxhc3Q7S2FteXp5YWtza2l5IDogMSA6IDI1MDQuNworQXN0cmFraGFuc2th72Egb2JsYXN0O0xpbWFuc2tpeSA6IDEgOiAyMjY5LjEwMDEKK0thbG15a2lhO0thc3BpeXNraXkgOiAxIDogNDUwOC43MDAyCitSVS1VTkstMjkwMiA6IDEgOiAxMjc3LjEKK1JVLVVOSy0yOTAzIDogMSA6IDc1MC40MDAwMgorUlUtVU5LLTI5MDQgOiAxIDogMjEuMAorS2FsaW5pbmdyYWRza2HvYSBvYmxhc3Q7R3ZhcmRleXNraXkgOiAxIDogNzk2LjcwMDAxCitLYWxpbmluZ3JhZHNrYe9hIG9ibGFzdDtHdXJ5ZXZza2l5IDogMSA6IDc0OS41CitLYWxpbmluZ3JhZHNrYe9hIG9ibGFzdDtLYWxpbmluZ3JhZCA6IDEgOiAyODguMjAwMDEKK0thbGluaW5ncmFkc2th72Egb2JsYXN0O05lc3Rlcm92c2tpeSA6IDEgOiAxMDQ3LjIKK0thbGluaW5ncmFkc2th72Egb2JsYXN0O0NoZXJueWFraG92c2sgOiAxIDogMS4wCitLYWxpbmluZ3JhZHNrYe9hIG9ibGFzdDtHdXNldiA6IDEgOiAxLjAKK0thbGluaW5ncmFkc2th72Egb2JsYXN0O1ByYXZkaW5za2l5IDogMSA6IDEzMzcuNgorS2FsaW5pbmdyYWRza2HvYSBvYmxhc3Q7T3plcnNraXkgOiAxIDogODc4LjcwMDAxCitLYWxpbmluZ3JhZHNrYe9hIG9ibGFzdDtTbGF2c2tpeSA6IDEgOiAxMTI3LjgKK0thbGluaW5ncmFkc2th72Egb2JsYXN0O1plbGVub2dyYWRza2l5IDogMSA6IDk1OC4wOTk5OAorS2FsaW5pbmdyYWRza2HvYSBvYmxhc3Q7U292ZXRzayA6IDEgOiAxNy4xCitLYWxpbmluZ3JhZHNrYe9hIG9ibGFzdDtOZW1hbnNraXkgOiAxIDogNjkxLjc5OTk5CitLYWxpbmluZ3JhZHNrYe9hIG9ibGFzdDtLcmF6bm96bmFtZW5za2l5IDogMSA6IDEyOTAuOAorS2FsaW5pbmdyYWRza2HvYSBvYmxhc3Q7TmVtYW4gOiAxIDogMS4wCitLYWxpbmluZ3JhZHNrYe9hIG9ibGFzdDtQb2xlc3NraXkgOiAxIDogODY0LjIwMDAxCitLYWxpbmluZ3JhZHNrYe9hIG9ibGFzdDtTdmV0bG9nb3JzayA6IDEgOiAxLjgKK0thbGluaW5ncmFkc2th72Egb2JsYXN0O0NoZXJueWFraG92c2tpeSA6IDEgOiAxMzgzLjEKK0thbGluaW5ncmFkc2th72Egb2JsYXN0O0d1c2V2c2tpeSA6IDEgOiA2MjcuNzk5OTkKK0thbGluaW5ncmFkc2th72Egb2JsYXN0O1N2ZXRseWkgOiAxIDogMS4wCitLYWxpbmluZ3JhZHNrYe9hIG9ibGFzdDtCYWx0aXlzayA6IDEgOiAxLjAKK0thbGluaW5ncmFkc2th72Egb2JsYXN0O0JhZ3JhdGlvbm92c2tpeSA6IDEgOiAxMzUyLjIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9SVVNTSUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUlVTU0lBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNjYyMmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUlVTU0lBX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsNTM0OSBAQAorUlUtVU5LLTEgOiAxIDogMAorUlUtVU5LLTIgOiAxIDogMAorUlUtVU5LLTMgOiAxIDogMAorUlUtVU5LLTQgOiAxIDogMAorUlUtVU5LLTUgOiAxIDogMAorUlUtVU5LLTYgOiAxIDogMAorUlUtVU5LLTcgOiAxIDogMAorUlUtVU5LLTggOiAxIDogMAorUlUtVU5LLTkgOiAxIDogMAorUlUtVU5LLTEwIDogMSA6IDAKK1JVLVVOSy0xMSA6IDEgOiAwCitSVS1VTkstMTIgOiAxIDogMAorUlUtVU5LLTEzIDogMSA6IDAKK1JVLVVOSy0xNCA6IDEgOiAwCitSVS1VTkstMTUgOiAxIDogMAorUlUtVU5LLTE2IDogMSA6IDAKK1JVLVVOSy0xNyA6IDEgOiAwCitSVS1VTkstMTggOiAxIDogMAorUlUtVU5LLTE5IDogMSA6IDAKK1JVLVVOSy0yMCA6IDEgOiAwCitSVS1VTkstMjEgOiAxIDogMAorUlUtVU5LLTIyIDogMSA6IDAKK1JVLVVOSy0yMyA6IDEgOiAwCitSVS1VTkstMjQgOiAxIDogMAorUlUtVU5LLTI1IDogMSA6IDAKK1JVLVVOSy0yNiA6IDEgOiAwCitSVS1VTkstMjcgOiAxIDogMAorUlUtVU5LLTI4IDogMSA6IDAKK1JVLVVOSy0yOSA6IDEgOiAwCitSVS1VTkstMzAgOiAxIDogMAorUlUtVU5LLTMxIDogMSA6IDAKK1JVLVVOSy0zMiA6IDEgOiAwCitSVS1VTkstMzMgOiAxIDogMAorUlUtVU5LLTM0IDogMSA6IDAKK1JVLVVOSy0zNSA6IDEgOiAwCitSVS1VTkstMzYgOiAxIDogMAorUlUtVU5LLTM3IDogMSA6IDAKK1JVLVVOSy0zOCA6IDEgOiAwCitSVS1VTkstMzkgOiAxIDogMAorUlUtVU5LLTQwIDogMSA6IDAKK1JVLVVOSy00MSA6IDEgOiAwCitSVS1VTkstNDIgOiAxIDogMAorUlUtVU5LLTQzIDogMSA6IDAKK1JVLVVOSy00NCA6IDEgOiAwCitSVS1VTkstNDUgOiAxIDogMAorUlUtVU5LLTQ2IDogMSA6IDAKK1JVLVVOSy00NyA6IDEgOiAwCitSVS1VTkstNDggOiAxIDogMAorUlUtVU5LLTQ5IDogMSA6IDAKK1JVLVVOSy01MCA6IDEgOiAwCitSVS1VTkstNTEgOiAxIDogMAorUlUtVU5LLTUyIDogMSA6IDAKK1JVLVVOSy01MyA6IDEgOiAwCitSVS1VTkstNTQgOiAxIDogMAorUlUtVU5LLTU1IDogMSA6IDAKK1JVLVVOSy01NiA6IDEgOiAwCitSVS1VTkstNTcgOiAxIDogMAorUlUtVU5LLTU4IDogMSA6IDAKK1JVLVVOSy01OSA6IDEgOiAwCitSVS1VTkstNjAgOiAxIDogMAorUlUtVU5LLTYxIDogMSA6IDAKK1JVLVVOSy02MiA6IDEgOiAwCitSVS1VTkstNjMgOiAxIDogMAorUlUtVU5LLTY0IDogMSA6IDAKK1JVLVVOSy02NSA6IDEgOiAwCitSVS1VTkstNjYgOiAxIDogMAorUlUtVU5LLTY3IDogMSA6IDAKK1JVLVVOSy02OCA6IDEgOiAwCitSVS1VTkstNjkgOiAxIDogMAorUlUtVU5LLTcwIDogMSA6IDAKK1JVLVVOSy03MSA6IDEgOiAwCitSVS1VTkstNzIgOiAxIDogMAorUlUtVU5LLTczIDogMSA6IDAKK1JVLVVOSy03NCA6IDEgOiAwCitSVS1VTkstNzUgOiAxIDogMAorUlUtVU5LLTc2IDogMSA6IDAKK1JVLVVOSy03NyA6IDEgOiAwCitSVS1VTkstNzggOiAxIDogMAorUlUtVU5LLTc5IDogMSA6IDAKK1JVLVVOSy04MCA6IDEgOiAwCitSVS1VTkstODEgOiAxIDogMAorUlUtVU5LLTgyIDogMSA6IDAKK1JVLVVOSy04MyA6IDEgOiAwCitSVS1VTkstODQgOiAxIDogMAorUlUtVU5LLTg1IDogMSA6IDAKK1JVLVVOSy04NiA6IDEgOiAwCitSVS1VTkstODcgOiAxIDogMAorUlUtVU5LLTg4IDogMSA6IDAKK1JVLVVOSy04OSA6IDEgOiAwCitSVS1VTkstOTAgOiAxIDogMAorUlUtVU5LLTkxIDogMSA6IDAKK1JVLVVOSy05MiA6IDEgOiAwCitSVS1VTkstOTMgOiAxIDogMAorUlUtVU5LLTk0IDogMSA6IDAKK1JVLVVOSy05NSA6IDEgOiAwCitSVS1VTkstOTYgOiAxIDogMAorUlUtVU5LLTk3IDogMSA6IDAKK1JVLVVOSy05OCA6IDEgOiAwCitSVS1VTkstOTkgOiAxIDogMAorUlUtVU5LLTEwMCA6IDEgOiAwCitSVS1VTkstMTAxIDogMSA6IDAKK1JVLVVOSy0xMDIgOiAxIDogMAorUlUtVU5LLTEwMyA6IDEgOiAwCitSVS1VTkstMTA0IDogMSA6IDAKK1JVLVVOSy0xMDUgOiAxIDogMAorUlUtVU5LLTEwNiA6IDEgOiAwCitSVS1VTkstMTA3IDogMSA6IDAKK1JVLVVOSy0xMDggOiAxIDogMAorUlUtVU5LLTEwOSA6IDEgOiAwCitSVS1VTkstMTEwIDogMSA6IDAKK1JVLVVOSy0xMTEgOiAxIDogMAorUlUtVU5LLTExMiA6IDEgOiAwCitSVS1VTkstMTEzIDogMSA6IDAKK1JVLVVOSy0xMTQgOiAxIDogMAorUlUtVU5LLTExNSA6IDEgOiAwCitSVS1VTkstMTE2IDogMSA6IDAKK1JVLVVOSy0xMTcgOiAxIDogMAorUlUtVU5LLTExOCA6IDEgOiAwCitSVS1VTkstMTE5IDogMSA6IDAKK1JVLVVOSy0xMjAgOiAxIDogMAorUlUtVU5LLTEyMSA6IDEgOiAwCitSVS1VTkstMTIyIDogMSA6IDAKK1JVLVVOSy0xMjMgOiAxIDogMAorUlUtVU5LLTEyNCA6IDEgOiAwCitSVS1VTkstMTI1IDogMSA6IDAKK1JVLVVOSy0xMjYgOiAxIDogMAorUlUtVU5LLTEyNyA6IDEgOiAwCitSVS1VTkstMTI4IDogMSA6IDAKK1JVLVVOSy0xMjkgOiAxIDogMAorUlUtVU5LLTEzMCA6IDEgOiAwCitSVS1VTkstMTMxIDogMSA6IDAKK1JVLVVOSy0xMzIgOiAxIDogMAorUlUtVU5LLTEzMyA6IDEgOiAwCitSVS1VTkstMTM0IDogMSA6IDAKK1JVLVVOSy0xMzUgOiAxIDogMAorUlUtVU5LLTEzNiA6IDEgOiAwCitSVS1VTkstMTM3IDogMSA6IDAKK1JVLVVOSy0xMzggOiAxIDogMAorUlUtVU5LLTEzOSA6IDEgOiAwCitSVS1VTkstMTQwIDogMSA6IDAKK1JVLVVOSy0xNDEgOiAxIDogMAorUlUtVU5LLTE0MiA6IDEgOiAwCitSVS1VTkstMTQzIDogMSA6IDAKK1JVLVVOSy0xNDQgOiAxIDogMAorUlUtVU5LLTE0NSA6IDEgOiAwCitSVS1VTkstMTQ2IDogMSA6IDAKK1JVLVVOSy0xNDcgOiAxIDogMAorUlUtVU5LLTE0OCA6IDEgOiAwCitSVS1VTkstMTQ5IDogMSA6IDAKK1JVLVVOSy0xNTAgOiAxIDogMAorUlUtVU5LLTE1MSA6IDEgOiAwCitSVS1VTkstMTUyIDogMSA6IDAKK1JVLVVOSy0xNTMgOiAxIDogMAorUlUtVU5LLTE1NCA6IDEgOiAwCitSVS1VTkstMTU1IDogMSA6IDAKK1JVLVVOSy0xNTYgOiAxIDogMAorUlUtVU5LLTE1NyA6IDEgOiAwCitSVS1VTkstMTU4IDogMSA6IDAKK1JVLVVOSy0xNTkgOiAxIDogMAorUlUtVU5LLTE2MCA6IDEgOiAwCitSVS1VTkstMTYxIDogMSA6IDAKK1JVLVVOSy0xNjIgOiAxIDogMAorUlUtVU5LLTE2MyA6IDEgOiAwCitSVS1VTkstMTY0IDogMSA6IDAKK1JVLVVOSy0xNjUgOiAxIDogMAorUlUtVU5LLTE2NiA6IDEgOiAwCitSVS1VTkstMTY3IDogMSA6IDAKK1JVLVVOSy0xNjggOiAxIDogMAorUlUtVU5LLTE2OSA6IDEgOiAwCitSVS1VTkstMTcwIDogMSA6IDAKK1JVLVVOSy0xNzEgOiAxIDogMAorUlUtVU5LLTE3MiA6IDEgOiAwCitSVS1VTkstMTczIDogMSA6IDAKK1JVLVVOSy0xNzQgOiAxIDogMAorUlUtVU5LLTE3NSA6IDEgOiAwCitSVS1VTkstMTc2IDogMSA6IDAKK1JVLVVOSy0xNzcgOiAxIDogMAorUlUtVU5LLTE3OCA6IDEgOiAwCitSVS1VTkstMTc5IDogMSA6IDAKK1JVLVVOSy0xODAgOiAxIDogMAorUlUtVU5LLTE4MSA6IDEgOiAwCitSVS1VTkstMTgyIDogMSA6IDAKK1JVLVVOSy0xODMgOiAxIDogMAorUlUtVU5LLTE4NCA6IDEgOiAwCitSVS1VTkstMTg1IDogMSA6IDAKK1JVLVVOSy0xODYgOiAxIDogMAorUlUtVU5LLTE4NyA6IDEgOiAwCitSVS1VTkstMTg4IDogMSA6IDAKK1JVLVVOSy0xODkgOiAxIDogMAorUlUtVU5LLTE5MCA6IDEgOiAwCitSVS1VTkstMTkxIDogMSA6IDAKK1JVLVVOSy0xOTIgOiAxIDogMAorUlUtVU5LLTE5MyA6IDEgOiAwCitSVS1VTkstMTk0IDogMSA6IDAKK1JVLVVOSy0xOTUgOiAxIDogMAorUlUtVU5LLTE5NiA6IDEgOiAwCitSVS1VTkstMTk3IDogMSA6IDAKK1JVLVVOSy0xOTggOiAxIDogMAorUlUtVU5LLTE5OSA6IDEgOiAwCitSVS1VTkstMjAwIDogMSA6IDAKK1JVLVVOSy0yMDEgOiAxIDogMAorUlUtVU5LLTIwMiA6IDEgOiAwCitSVS1VTkstMjAzIDogMSA6IDAKK1JVLVVOSy0yMDQgOiAxIDogMAorUlUtVU5LLTIwNSA6IDEgOiAwCitSVS1VTkstMjA2IDogMSA6IDAKK1JVLVVOSy0yMDcgOiAxIDogMAorUlUtVU5LLTIwOCA6IDEgOiAwCitSVS1VTkstMjA5IDogMSA6IDAKK1JVLVVOSy0yMTAgOiAxIDogMAorUlUtVU5LLTIxMSA6IDEgOiAwCitSVS1VTkstMjEyIDogMSA6IDAKK1JVLVVOSy0yMTMgOiAxIDogMAorUlUtVU5LLTIxNCA6IDEgOiAwCitSVS1VTkstMjE1IDogMSA6IDAKK1JVLVVOSy0yMTYgOiAxIDogMAorUlUtVU5LLTIxNyA6IDEgOiAwCitSVS1VTkstMjE4IDogMSA6IDAKK1JVLVVOSy0yMTkgOiAxIDogMAorUlUtVU5LLTIyMCA6IDEgOiAwCitSVS1VTkstMjIxIDogMSA6IDAKK1JVLVVOSy0yMjIgOiAxIDogMAorUlUtVU5LLTIyMyA6IDEgOiAwCitSVS1VTkstMjI0IDogMSA6IDAKK1JVLVVOSy0yMjUgOiAxIDogMAorUlUtVU5LLTIyNiA6IDEgOiAwCitSVS1VTkstMjI3IDogMSA6IDAKK1JVLVVOSy0yMjggOiAxIDogMAorUlUtVU5LLTIyOSA6IDEgOiAwCitSVS1VTkstMjMwIDogMSA6IDAKK1JVLVVOSy0yMzEgOiAxIDogMAorUlUtVU5LLTIzMiA6IDEgOiAwCitSVS1VTkstMjMzIDogMSA6IDAKK1JVLVVOSy0yMzQgOiAxIDogMAorUlUtVU5LLTIzNSA6IDEgOiAwCitSVS1VTkstMjM2IDogMSA6IDAKK1JVLVVOSy0yMzcgOiAxIDogMAorUlUtVU5LLTIzOCA6IDEgOiAwCitSVS1VTkstMjM5IDogMSA6IDAKK1JVLVVOSy0yNDAgOiAxIDogMAorUlUtVU5LLTI0MSA6IDEgOiAwCitSVS1VTkstMjQyIDogMSA6IDAKK1JVLVVOSy0yNDMgOiAxIDogMAorUlUtVU5LLTI0NCA6IDEgOiAwCitSVS1VTkstMjQ1IDogMSA6IDAKK1JVLVVOSy0yNDYgOiAxIDogMAorUlUtVU5LLTI0NyA6IDEgOiAwCitSVS1VTkstMjQ4IDogMSA6IDAKK1JVLVVOSy0yNDkgOiAxIDogMAorUlUtVU5LLTI1MCA6IDEgOiAwCitSVS1VTkstMjUxIDogMSA6IDAKK1JVLVVOSy0yNTIgOiAxIDogMAorUlUtVU5LLTI1MyA6IDEgOiAwCitSVS1VTkstMjU0IDogMSA6IDAKK1JVLVVOSy0yNTUgOiAxIDogMAorUlUtVU5LLTI1NiA6IDEgOiAwCitSVS1VTkstMjU3IDogMSA6IDAKK1JVLVVOSy0yNTggOiAxIDogMAorUlUtVU5LLTI1OSA6IDEgOiAwCitSVS1VTkstMjYwIDogMSA6IDAKK1JVLVVOSy0yNjEgOiAxIDogMAorUlUtVU5LLTI2MiA6IDEgOiAwCitSVS1VTkstMjYzIDogMSA6IDAKK1JVLVVOSy0yNjQgOiAxIDogMAorUlUtVU5LLTI2NSA6IDEgOiAwCitSVS1VTkstMjY2IDogMSA6IDAKK1JVLVVOSy0yNjcgOiAxIDogMAorUlUtVU5LLTI2OCA6IDEgOiAwCitSVS1VTkstMjY5IDogMSA6IDAKK1JVLVVOSy0yNzAgOiAxIDogMAorUlUtVU5LLTI3MSA6IDEgOiAwCitSVS1VTkstMjcyIDogMSA6IDAKK1JVLVVOSy0yNzMgOiAxIDogMAorUlUtVU5LLTI3NCA6IDEgOiAwCitSVS1VTkstMjc1IDogMSA6IDAKK1JVLVVOSy0yNzYgOiAxIDogMAorUlUtVU5LLTI3NyA6IDEgOiAwCitSVS1VTkstMjc4IDogMSA6IDAKK1JVLVVOSy0yNzkgOiAxIDogMAorUlUtVU5LLTI4MCA6IDEgOiAwCitSVS1VTkstMjgxIDogMSA6IDAKK1JVLVVOSy0yODIgOiAxIDogMAorUlUtVU5LLTI4MyA6IDEgOiAwCitSVS1VTkstMjg0IDogMSA6IDAKK1JVLVVOSy0yODUgOiAxIDogMAorUlUtVU5LLTI4NiA6IDEgOiAwCitSVS1VTkstMjg3IDogMSA6IDAKK1JVLVVOSy0yODggOiAxIDogMAorUlUtVU5LLTI4OSA6IDEgOiAwCitSVS1VTkstMjkwIDogMSA6IDAKK1JVLVVOSy0yOTEgOiAxIDogMAorUlUtVU5LLTI5MiA6IDEgOiAwCitSVS1VTkstMjkzIDogMSA6IDAKK1JVLVVOSy0yOTQgOiAxIDogMAorUlUtVU5LLTI5NSA6IDEgOiAwCitSVS1VTkstMjk2IDogMSA6IDAKK1JVLVVOSy0yOTcgOiAxIDogMAorUlUtVU5LLTI5OCA6IDEgOiAwCitSVS1VTkstMjk5IDogMSA6IDAKK1JVLVVOSy0zMDAgOiAxIDogMAorUlUtVU5LLTMwMSA6IDEgOiAwCitSVS1VTkstMzAyIDogMSA6IDAKK1JVLVVOSy0zMDMgOiAxIDogMAorUlUtVU5LLTMwNCA6IDEgOiAwCitSVS1VTkstMzA1IDogMSA6IDAKK1JVLVVOSy0zMDYgOiAxIDogMAorUlUtVU5LLTMwNyA6IDEgOiAwCitSVS1VTkstMzA4IDogMSA6IDAKK1JVLVVOSy0zMDkgOiAxIDogMAorUlUtVU5LLTMxMCA6IDEgOiAwCitSVS1VTkstMzExIDogMSA6IDAKK1JVLVVOSy0zMTIgOiAxIDogMAorUlUtVU5LLTMxMyA6IDEgOiAwCitSVS1VTkstMzE0IDogMSA6IDAKK1JVLVVOSy0zMTUgOiAxIDogMAorUlUtVU5LLTMxNiA6IDEgOiAwCitSVS1VTkstMzE3IDogMSA6IDAKK1JVLVVOSy0zMTggOiAxIDogMAorUlUtVU5LLTMxOSA6IDEgOiAwCitSVS1VTkstMzIwIDogMSA6IDAKK1JVLVVOSy0zMjEgOiAxIDogMAorUlUtVU5LLTMyMiA6IDEgOiAwCitSVS1VTkstMzIzIDogMSA6IDAKK1JVLVVOSy0zMjQgOiAxIDogMAorUlUtVU5LLTMyNSA6IDEgOiAwCitSVS1VTkstMzI2IDogMSA6IDAKK1JVLVVOSy0zMjcgOiAxIDogMAorUlUtVU5LLTMyOCA6IDEgOiAwCitSVS1VTkstMzI5IDogMSA6IDAKK1JVLVVOSy0zMzAgOiAxIDogMAorUlUtVU5LLTMzMSA6IDEgOiAwCitSVS1VTkstMzMyIDogMSA6IDAKK1JVLVVOSy0zMzMgOiAxIDogMAorUlUtVU5LLTMzNCA6IDEgOiAwCitSVS1VTkstMzM1IDogMSA6IDAKK1JVLVVOSy0zMzYgOiAxIDogMAorUlUtVU5LLTMzNyA6IDEgOiAwCitSVS1VTkstMzM4IDogMSA6IDAKK1JVLVVOSy0zMzkgOiAxIDogMAorUlUtVU5LLTM0MCA6IDEgOiAwCitSVS1VTkstMzQxIDogMSA6IDAKK1JVLVVOSy0zNDIgOiAxIDogMAorUlUtVU5LLTM0MyA6IDEgOiAwCitSVS1VTkstMzQ0IDogMSA6IDAKK1JVLVVOSy0zNDUgOiAxIDogMAorUlUtVU5LLTM0NiA6IDEgOiAwCitSVS1VTkstMzQ3IDogMSA6IDAKK1JVLVVOSy0zNDggOiAxIDogMAorUlUtVU5LLTM0OSA6IDEgOiAwCitSVS1VTkstMzUwIDogMSA6IDAKK1JVLVVOSy0zNTEgOiAxIDogMAorUlUtVU5LLTM1MiA6IDEgOiAwCitSVS1VTkstMzUzIDogMSA6IDAKK1JVLVVOSy0zNTQgOiAxIDogMAorUlUtVU5LLTM1NSA6IDEgOiAwCitSVS1VTkstMzU2IDogMSA6IDAKK1JVLVVOSy0zNTcgOiAxIDogMAorUlUtVU5LLTM1OCA6IDEgOiAwCitSVS1VTkstMzU5IDogMSA6IDAKK1JVLVVOSy0zNjAgOiAxIDogMAorUlUtVU5LLTM2MSA6IDEgOiAwCitSVS1VTkstMzYyIDogMSA6IDAKK1JVLVVOSy0zNjMgOiAxIDogMAorUlUtVU5LLTM2NCA6IDEgOiAwCitSVS1VTkstMzY1IDogMSA6IDAKK1JVLVVOSy0zNjYgOiAxIDogMAorUlUtVU5LLTM2NyA6IDEgOiAwCitSVS1VTkstMzY4IDogMSA6IDAKK1JVLVVOSy0zNjkgOiAxIDogMAorUlUtVU5LLTM3MCA6IDEgOiAwCitSVS1VTkstMzcxIDogMSA6IDAKK1JVLVVOSy0zNzIgOiAxIDogMAorUlUtVU5LLTM3MyA6IDEgOiAwCitSVS1VTkstMzc0IDogMSA6IDAKK1JVLVVOSy0zNzUgOiAxIDogMAorUlUtVU5LLTM3NiA6IDEgOiAwCitSVS1VTkstMzc3IDogMSA6IDAKK1JVLVVOSy0zNzggOiAxIDogMAorUlUtVU5LLTM3OSA6IDEgOiAwCitSVS1VTkstMzgwIDogMSA6IDAKK1JVLVVOSy0zODEgOiAxIDogMAorUlUtVU5LLTM4MiA6IDEgOiAwCitSVS1VTkstMzgzIDogMSA6IDAKK1JVLVVOSy0zODQgOiAxIDogMAorUlUtVU5LLTM4NSA6IDEgOiAwCitSVS1VTkstMzg2IDogMSA6IDAKK1JVLVVOSy0zODcgOiAxIDogMAorUlUtVU5LLTM4OCA6IDEgOiAwCitSVS1VTkstMzg5IDogMSA6IDAKK1JVLVVOSy0zOTAgOiAxIDogMAorUlUtVU5LLTM5MSA6IDEgOiAwCitSVS1VTkstMzkyIDogMSA6IDAKK1JVLVVOSy0zOTMgOiAxIDogMAorUlUtVU5LLTM5NCA6IDEgOiAwCitSVS1VTkstMzk1IDogMSA6IDAKK1JVLVVOSy0zOTYgOiAxIDogMAorUlUtVU5LLTM5NyA6IDEgOiAwCitSVS1VTkstMzk4IDogMSA6IDAKK1JVLVVOSy0zOTkgOiAxIDogMAorUlUtVU5LLTQwMCA6IDEgOiAwCitSVS1VTkstNDAxIDogMSA6IDAKK1JVLVVOSy00MDIgOiAxIDogMAorUlUtVU5LLTQwMyA6IDEgOiAwCitSVS1VTkstNDA0IDogMSA6IDAKK1JVLVVOSy00MDUgOiAxIDogMAorUlUtVU5LLTQwNiA6IDEgOiAwCitSVS1VTkstNDA3IDogMSA6IDAKK1JVLVVOSy00MDggOiAxIDogMAorUlUtVU5LLTQwOSA6IDEgOiAwCitSVS1VTkstNDEwIDogMSA6IDAKK1JVLVVOSy00MTEgOiAxIDogMAorUlUtVU5LLTQxMiA6IDEgOiAwCitSVS1VTkstNDEzIDogMSA6IDAKK1JVLVVOSy00MTQgOiAxIDogMAorUlUtVU5LLTQxNSA6IDEgOiAwCitSVS1VTkstNDE2IDogMSA6IDAKK1JVLVVOSy00MTcgOiAxIDogMAorUlUtVU5LLTQxOCA6IDEgOiAwCitSVS1VTkstNDE5IDogMSA6IDAKK1JVLVVOSy00MjAgOiAxIDogMAorUlUtVU5LLTQyMSA6IDEgOiAwCitSVS1VTkstNDIyIDogMSA6IDAKK1JVLVVOSy00MjMgOiAxIDogMAorUlUtVU5LLTQyNCA6IDEgOiAwCitSVS1VTkstNDI1IDogMSA6IDAKK1JVLVVOSy00MjYgOiAxIDogMAorUlUtVU5LLTQyNyA6IDEgOiAwCitSVS1VTkstNDI4IDogMSA6IDAKK1JVLVVOSy00MjkgOiAxIDogMAorUlUtVU5LLTQzMCA6IDEgOiAwCitSVS1VTkstNDMxIDogMSA6IDAKK1JVLVVOSy00MzIgOiAxIDogMAorUlUtVU5LLTQzMyA6IDEgOiAwCitSVS1VTkstNDM0IDogMSA6IDAKK1JVLVVOSy00MzUgOiAxIDogMAorUlUtVU5LLTQzNiA6IDEgOiAwCitSVS1VTkstNDM3IDogMSA6IDAKK1JVLVVOSy00MzggOiAxIDogMAorUlUtVU5LLTQzOSA6IDEgOiAwCitSVS1VTkstNDQwIDogMSA6IDAKK1JVLVVOSy00NDEgOiAxIDogMAorUlUtVU5LLTQ0MiA6IDEgOiAwCitSVS1VTkstNDQzIDogMSA6IDAKK1JVLVVOSy00NDQgOiAxIDogMAorUlUtVU5LLTQ0NSA6IDEgOiAwCitSVS1VTkstNDQ2IDogMSA6IDAKK1JVLVVOSy00NDcgOiAxIDogMAorUlUtVU5LLTQ0OCA6IDEgOiAwCitSVS1VTkstNDQ5IDogMSA6IDAKK1JVLVVOSy00NTAgOiAxIDogMAorUlUtVU5LLTQ1MSA6IDEgOiAwCitSVS1VTkstNDUyIDogMSA6IDAKK1JVLVVOSy00NTMgOiAxIDogMAorUlUtVU5LLTQ1NCA6IDEgOiAwCitSVS1VTkstNDU1IDogMSA6IDAKK1JVLVVOSy00NTYgOiAxIDogMAorUlUtVU5LLTQ1NyA6IDEgOiAwCitSVS1VTkstNDU4IDogMSA6IDAKK1JVLVVOSy00NTkgOiAxIDogMAorUlUtVU5LLTQ2MCA6IDEgOiAwCitSVS1VTkstNDYxIDogMSA6IDAKK1JVLVVOSy00NjIgOiAxIDogMAorUlUtVU5LLTQ2MyA6IDEgOiAwCitSVS1VTkstNDY0IDogMSA6IDAKK1JVLVVOSy00NjUgOiAxIDogMAorUlUtVU5LLTQ2NiA6IDEgOiAwCitSVS1VTkstNDY3IDogMSA6IDAKK1JVLVVOSy00NjggOiAxIDogMAorUlUtVU5LLTQ2OSA6IDEgOiAwCitSVS1VTkstNDcwIDogMSA6IDAKK1JVLVVOSy00NzEgOiAxIDogMAorUlUtVU5LLTQ3MiA6IDEgOiAwCitSVS1VTkstNDczIDogMSA6IDAKK1JVLVVOSy00NzQgOiAxIDogMAorUlUtVU5LLTQ3NSA6IDEgOiAwCitSVS1VTkstNDc2IDogMSA6IDAKK1JVLVVOSy00NzcgOiAxIDogMAorUlUtVU5LLTQ3OCA6IDEgOiAwCitSVS1VTkstNDc5IDogMSA6IDAKK1JVLVVOSy00ODAgOiAxIDogMAorUlUtVU5LLTQ4MSA6IDEgOiAwCitSVS1VTkstNDgyIDogMSA6IDAKK1JVLVVOSy00ODMgOiAxIDogMAorUlUtVU5LLTQ4NCA6IDEgOiAwCitSVS1VTkstNDg1IDogMSA6IDAKK1JVLVVOSy00ODYgOiAxIDogMAorUlUtVU5LLTQ4NyA6IDEgOiAwCitSVS1VTkstNDg4IDogMSA6IDAKK1JVLVVOSy00ODkgOiAxIDogMAorUlUtVU5LLTQ5MCA6IDEgOiAwCitSVS1VTkstNDkxIDogMSA6IDAKK1JVLVVOSy00OTIgOiAxIDogMAorUlUtVU5LLTQ5MyA6IDEgOiAwCitSVS1VTkstNDk0IDogMSA6IDAKK1JVLVVOSy00OTUgOiAxIDogMAorUlUtVU5LLTQ5NiA6IDEgOiAwCitSVS1VTkstNDk3IDogMSA6IDAKK1JVLVVOSy00OTggOiAxIDogMAorUlUtVU5LLTQ5OSA6IDEgOiAwCitSVS1VTkstNTAwIDogMSA6IDAKK1JVLVVOSy01MDEgOiAxIDogMAorUlUtVU5LLTUwMiA6IDEgOiAwCitSVS1VTkstNTAzIDogMSA6IDAKK1JVLVVOSy01MDQgOiAxIDogMAorUlUtVU5LLTUwNSA6IDEgOiAwCitSVS1VTkstNTA2IDogMSA6IDAKK1JVLVVOSy01MDcgOiAxIDogMAorUlUtVU5LLTUwOCA6IDEgOiAwCitSVS1VTkstNTA5IDogMSA6IDAKK1JVLVVOSy01MTAgOiAxIDogMAorUlUtVU5LLTUxMSA6IDEgOiAwCitSVS1VTkstNTEyIDogMSA6IDAKK1JVLVVOSy01MTMgOiAxIDogMAorUlUtVU5LLTUxNCA6IDEgOiAwCitSVS1VTkstNTE1IDogMSA6IDAKK1JVLVVOSy01MTYgOiAxIDogMAorUlUtVU5LLTUxNyA6IDEgOiAwCitSVS1VTkstNTE4IDogMSA6IDAKK1JVLVVOSy01MTkgOiAxIDogMAorUlUtVU5LLTUyMCA6IDEgOiAwCitSVS1VTkstNTIxIDogMSA6IDAKK1JVLVVOSy01MjIgOiAxIDogMAorUlUtVU5LLTUyMyA6IDEgOiAwCitSVS1VTkstNTI0IDogMSA6IDAKK1JVLVVOSy01MjUgOiAxIDogMAorUlUtVU5LLTUyNiA6IDEgOiAwCitSVS1VTkstNTI3IDogMSA6IDAKK1JVLVVOSy01MjggOiAxIDogMAorUlUtVU5LLTUyOSA6IDEgOiAwCitSVS1VTkstNTMwIDogMSA6IDAKK1JVLVVOSy01MzEgOiAxIDogMAorUlUtVU5LLTUzMiA6IDEgOiAwCitSVS1VTkstNTMzIDogMSA6IDAKK1JVLVVOSy01MzQgOiAxIDogMAorUlUtVU5LLTUzNSA6IDEgOiAwCitSVS1VTkstNTM2IDogMSA6IDAKK1JVLVVOSy01MzcgOiAxIDogMAorUlUtVU5LLTUzOCA6IDEgOiAwCitSVS1VTkstNTM5IDogMSA6IDAKK1JVLVVOSy01NDAgOiAxIDogMAorUlUtVU5LLTU0MSA6IDEgOiAwCitSVS1VTkstNTQyIDogMSA6IDAKK1JVLVVOSy01NDMgOiAxIDogMAorUlUtVU5LLTU0NCA6IDEgOiAwCitSVS1VTkstNTQ1IDogMSA6IDAKK1JVLVVOSy01NDYgOiAxIDogMAorUlUtVU5LLTU0NyA6IDEgOiAwCitSVS1VTkstNTQ4IDogMSA6IDAKK1JVLVVOSy01NDkgOiAxIDogMAorUlUtVU5LLTU1MCA6IDEgOiAwCitSVS1VTkstNTUxIDogMSA6IDAKK1JVLVVOSy01NTIgOiAxIDogMAorUlUtVU5LLTU1MyA6IDEgOiAwCitSVS1VTkstNTU0IDogMSA6IDAKK1JVLVVOSy01NTUgOiAxIDogMAorUlUtVU5LLTU1NiA6IDEgOiAwCitSVS1VTkstNTU3IDogMSA6IDAKK1JVLVVOSy01NTggOiAxIDogMAorUlUtVU5LLTU1OSA6IDEgOiAwCitSVS1VTkstNTYwIDogMSA6IDAKK1JVLVVOSy01NjEgOiAxIDogMAorUlUtVU5LLTU2MiA6IDEgOiAwCitSVS1VTkstNTYzIDogMSA6IDAKK1JVLVVOSy01NjQgOiAxIDogMAorUlUtVU5LLTU2NSA6IDEgOiAwCitSVS1VTkstNTY2IDogMSA6IDAKK1JVLVVOSy01NjcgOiAxIDogMAorUlUtVU5LLTU2OCA6IDEgOiAwCitSVS1VTkstNTY5IDogMSA6IDAKK1JVLVVOSy01NzAgOiAxIDogMAorUlUtVU5LLTU3MSA6IDEgOiAwCitSVS1VTkstNTcyIDogMSA6IDAKK1JVLVVOSy01NzMgOiAxIDogMAorUlUtVU5LLTU3NCA6IDEgOiAwCitSVS1VTkstNTc1IDogMSA6IDAKK1JVLVVOSy01NzYgOiAxIDogMAorUlUtVU5LLTU3NyA6IDEgOiAwCitSVS1VTkstNTc4IDogMSA6IDAKK1JVLVVOSy01NzkgOiAxIDogMAorUlUtVU5LLTU4MCA6IDEgOiAwCitSVS1VTkstNTgxIDogMSA6IDAKK1JVLVVOSy01ODIgOiAxIDogMAorUlUtVU5LLTU4MyA6IDEgOiAwCitSVS1VTkstNTg0IDogMSA6IDAKK1JVLVVOSy01ODUgOiAxIDogMAorUlUtVU5LLTU4NiA6IDEgOiAwCitSVS1VTkstNTg3IDogMSA6IDAKK1JVLVVOSy01ODggOiAxIDogMAorUlUtVU5LLTU4OSA6IDEgOiAwCitSVS1VTkstNTkwIDogMSA6IDAKK1JVLVVOSy01OTEgOiAxIDogMAorUlUtVU5LLTU5MiA6IDEgOiAwCitSVS1VTkstNTkzIDogMSA6IDAKK1JVLVVOSy01OTQgOiAxIDogMAorUlUtVU5LLTU5NSA6IDEgOiAwCitSVS1VTkstNTk2IDogMSA6IDAKK1JVLVVOSy01OTcgOiAxIDogMAorUlUtVU5LLTU5OCA6IDEgOiAwCitSVS1VTkstNTk5IDogMSA6IDAKK1JVLVVOSy02MDAgOiAxIDogMAorUlUtVU5LLTYwMSA6IDEgOiAwCitSVS1VTkstNjAyIDogMSA6IDAKK1JVLVVOSy02MDMgOiAxIDogMAorUlUtVU5LLTYwNCA6IDEgOiAwCitSVS1VTkstNjA1IDogMSA6IDAKK1JVLVVOSy02MDYgOiAxIDogMAorUlUtVU5LLTYwNyA6IDEgOiAwCitSVS1VTkstNjA4IDogMSA6IDAKK1JVLVVOSy02MDkgOiAxIDogMAorUlUtVU5LLTYxMCA6IDEgOiAwCitSVS1VTkstNjExIDogMSA6IDAKK1JVLVVOSy02MTIgOiAxIDogMAorUlUtVU5LLTYxMyA6IDEgOiAwCitSVS1VTkstNjE0IDogMSA6IDAKK1JVLVVOSy02MTUgOiAxIDogMAorUlUtVU5LLTYxNiA6IDEgOiAwCitSVS1VTkstNjE3IDogMSA6IDAKK1JVLVVOSy02MTggOiAxIDogMAorUlUtVU5LLTYxOSA6IDEgOiAwCitSVS1VTkstNjIwIDogMSA6IDAKK1JVLVVOSy02MjEgOiAxIDogMAorUlUtVU5LLTYyMiA6IDEgOiAwCitSVS1VTkstNjIzIDogMSA6IDAKK1JVLVVOSy02MjQgOiAxIDogMAorUlUtVU5LLTYyNSA6IDEgOiAwCitSVS1VTkstNjI2IDogMSA6IDAKK1JVLVVOSy02MjcgOiAxIDogMAorUlUtVU5LLTYyOCA6IDEgOiAwCitSVS1VTkstNjI5IDogMSA6IDAKK1JVLVVOSy02MzAgOiAxIDogMAorUlUtVU5LLTYzMSA6IDEgOiAwCitSVS1VTkstNjMyIDogMSA6IDAKK1JVLVVOSy02MzMgOiAxIDogMAorUlUtVU5LLTYzNCA6IDEgOiAwCitSVS1VTkstNjM1IDogMSA6IDAKK1JVLVVOSy02MzYgOiAxIDogMAorUlUtVU5LLTYzNyA6IDEgOiAwCitSVS1VTkstNjM4IDogMSA6IDAKK1JVLVVOSy02MzkgOiAxIDogMAorUlUtVU5LLTY0MCA6IDEgOiAwCitSVS1VTkstNjQxIDogMSA6IDAKK1JVLVVOSy02NDIgOiAxIDogMAorUlUtVU5LLTY0MyA6IDEgOiAwCitSVS1VTkstNjQ0IDogMSA6IDAKK1JVLVVOSy02NDUgOiAxIDogMAorUlUtVU5LLTY0NiA6IDEgOiAwCitSVS1VTkstNjQ3IDogMSA6IDAKK1JVLVVOSy02NDggOiAxIDogMAorUlUtVU5LLTY0OSA6IDEgOiAwCitSVS1VTkstNjUwIDogMSA6IDAKK1JVLVVOSy02NTEgOiAxIDogMAorUlUtVU5LLTY1MiA6IDEgOiAwCitSVS1VTkstNjUzIDogMSA6IDAKK1JVLVVOSy02NTQgOiAxIDogMAorUlUtVU5LLTY1NSA6IDEgOiAwCitSVS1VTkstNjU2IDogMSA6IDAKK1JVLVVOSy02NTcgOiAxIDogMAorUlUtVU5LLTY1OCA6IDEgOiAwCitSVS1VTkstNjU5IDogMSA6IDAKK1JVLVVOSy02NjAgOiAxIDogMAorUlUtVU5LLTY2MSA6IDEgOiAwCitSVS1VTkstNjYyIDogMSA6IDAKK1JVLVVOSy02NjMgOiAxIDogMAorUlUtVU5LLTY2NCA6IDEgOiAwCitSVS1VTkstNjY1IDogMSA6IDAKK1JVLVVOSy02NjYgOiAxIDogMAorUlUtVU5LLTY2NyA6IDEgOiAwCitSVS1VTkstNjY4IDogMSA6IDAKK1JVLVVOSy02NjkgOiAxIDogMAorUlUtVU5LLTY3MCA6IDEgOiAwCitSVS1VTkstNjcxIDogMSA6IDAKK1JVLVVOSy02NzIgOiAxIDogMAorUlUtVU5LLTY3MyA6IDEgOiAwCitSVS1VTkstNjc0IDogMSA6IDAKK1JVLVVOSy02NzUgOiAxIDogMAorUlUtVU5LLTY3NiA6IDEgOiAwCitSVS1VTkstNjc3IDogMSA6IDAKK1JVLVVOSy02NzggOiAxIDogMAorUlUtVU5LLTY3OSA6IDEgOiAwCitSVS1VTkstNjgwIDogMSA6IDAKK1JVLVVOSy02ODEgOiAxIDogMAorUlUtVU5LLTY4MiA6IDEgOiAwCitSVS1VTkstNjgzIDogMSA6IDAKK1JVLVVOSy02ODQgOiAxIDogMAorUlUtVU5LLTY4NSA6IDEgOiAwCitSVS1VTkstNjg2IDogMSA6IDAKK1JVLVVOSy02ODcgOiAxIDogMAorUlUtVU5LLTY4OCA6IDEgOiAwCitSVS1VTkstNjg5IDogMSA6IDAKK1JVLVVOSy02OTAgOiAxIDogMAorUlUtVU5LLTY5MSA6IDEgOiAwCitSVS1VTkstNjkyIDogMSA6IDAKK1JVLVVOSy02OTMgOiAxIDogMAorUlUtVU5LLTY5NCA6IDEgOiAwCitSVS1VTkstNjk1IDogMSA6IDAKK1JVLVVOSy02OTYgOiAxIDogMAorUlUtVU5LLTY5NyA6IDEgOiAwCitSVS1VTkstNjk4IDogMSA6IDAKK1JVLVVOSy02OTkgOiAxIDogMAorUlUtVU5LLTcwMCA6IDEgOiAwCitSVS1VTkstNzAxIDogMSA6IDAKK1JVLVVOSy03MDIgOiAxIDogMAorUlUtVU5LLTcwMyA6IDEgOiAwCitSVS1VTkstNzA0IDogMSA6IDAKK1JVLVVOSy03MDUgOiAxIDogMAorUlUtVU5LLTcwNiA6IDEgOiAwCitSVS1VTkstNzA3IDogMSA6IDAKK1JVLVVOSy03MDggOiAxIDogMAorUlUtVU5LLTcwOSA6IDEgOiAwCitSVS1VTkstNzEwIDogMSA6IDAKK1JVLVVOSy03MTEgOiAxIDogMAorUlUtVU5LLTcxMiA6IDEgOiAwCitSVS1VTkstNzEzIDogMSA6IDAKK1JVLVVOSy03MTQgOiAxIDogMAorUlUtVU5LLTcxNSA6IDEgOiAwCitSVS1VTkstNzE2IDogMSA6IDAKK1JVLVVOSy03MTcgOiAxIDogMAorUlUtVU5LLTcxOCA6IDEgOiAwCitSVS1VTkstNzE5IDogMSA6IDAKK1JVLVVOSy03MjAgOiAxIDogMAorUlUtVU5LLTcyMSA6IDEgOiAwCitSVS1VTkstNzIyIDogMSA6IDAKK1JVLVVOSy03MjMgOiAxIDogMAorUlUtVU5LLTcyNCA6IDEgOiAwCitSVS1VTkstNzI1IDogMSA6IDAKK1JVLVVOSy03MjYgOiAxIDogMAorUlUtVU5LLTcyNyA6IDEgOiAwCitSVS1VTkstNzI4IDogMSA6IDAKK1JVLVVOSy03MjkgOiAxIDogMAorUlUtVU5LLTczMCA6IDEgOiAwCitSVS1VTkstNzMxIDogMSA6IDAKK1JVLVVOSy03MzIgOiAxIDogMAorUlUtVU5LLTczMyA6IDEgOiAwCitSVS1VTkstNzM0IDogMSA6IDAKK1JVLVVOSy03MzUgOiAxIDogMAorUlUtVU5LLTczNiA6IDEgOiAwCitSVS1VTkstNzM3IDogMSA6IDAKK1JVLVVOSy03MzggOiAxIDogMAorUlUtVU5LLTczOSA6IDEgOiAwCitSVS1VTkstNzQwIDogMSA6IDAKK1JVLVVOSy03NDEgOiAxIDogMAorUlUtVU5LLTc0MiA6IDEgOiAwCitSVS1VTkstNzQzIDogMSA6IDAKK1JVLVVOSy03NDQgOiAxIDogMAorUlUtVU5LLTc0NSA6IDEgOiAwCitSVS1VTkstNzQ2IDogMSA6IDAKK1JVLVVOSy03NDcgOiAxIDogMAorUlUtVU5LLTc0OCA6IDEgOiAwCitSVS1VTkstNzQ5IDogMSA6IDAKK1JVLVVOSy03NTAgOiAxIDogMAorUlUtVU5LLTc1MSA6IDEgOiAwCitSVS1VTkstNzUyIDogMSA6IDAKK1JVLVVOSy03NTMgOiAxIDogMAorUlUtVU5LLTc1NCA6IDEgOiAwCitSVS1VTkstNzU1IDogMSA6IDAKK1JVLVVOSy03NTYgOiAxIDogMAorUlUtVU5LLTc1NyA6IDEgOiAwCitSVS1VTkstNzU4IDogMSA6IDAKK1JVLVVOSy03NTkgOiAxIDogMAorUlUtVU5LLTc2MCA6IDEgOiAwCitSVS1VTkstNzYxIDogMSA6IDAKK1JVLVVOSy03NjIgOiAxIDogMAorUlUtVU5LLTc2MyA6IDEgOiAwCitSVS1VTkstNzY0IDogMSA6IDAKK1JVLVVOSy03NjUgOiAxIDogMAorUlUtVU5LLTc2NiA6IDEgOiAwCitSVS1VTkstNzY3IDogMSA6IDAKK1JVLVVOSy03NjggOiAxIDogMAorUlUtVU5LLTc2OSA6IDEgOiAwCitSVS1VTkstNzcwIDogMSA6IDAKK1JVLVVOSy03NzEgOiAxIDogMAorUlUtVU5LLTc3MiA6IDEgOiAwCitSVS1VTkstNzczIDogMSA6IDAKK1JVLVVOSy03NzQgOiAxIDogMAorUlUtVU5LLTc3NSA6IDEgOiAwCitSVS1VTkstNzc2IDogMSA6IDAKK1JVLVVOSy03NzcgOiAxIDogMAorUlUtVU5LLTc3OCA6IDEgOiAwCitSVS1VTkstNzc5IDogMSA6IDAKK1JVLVVOSy03ODAgOiAxIDogMAorUlUtVU5LLTc4MSA6IDEgOiAwCitSVS1VTkstNzgyIDogMSA6IDAKK1JVLVVOSy03ODMgOiAxIDogMAorUlUtVU5LLTc4NCA6IDEgOiAwCitSVS1VTkstNzg1IDogMSA6IDAKK1JVLVVOSy03ODYgOiAxIDogMAorUlUtVU5LLTc4NyA6IDEgOiAwCitSVS1VTkstNzg4IDogMSA6IDAKK1JVLVVOSy03ODkgOiAxIDogMAorUlUtVU5LLTc5MCA6IDEgOiAwCitSVS1VTkstNzkxIDogMSA6IDAKK1JVLVVOSy03OTIgOiAxIDogMAorUlUtVU5LLTc5MyA6IDEgOiAwCitSVS1VTkstNzk0IDogMSA6IDAKK1JVLVVOSy03OTUgOiAxIDogMAorUlUtVU5LLTc5NiA6IDEgOiAwCitSVS1VTkstNzk3IDogMSA6IDAKK1JVLVVOSy03OTggOiAxIDogMAorUlUtVU5LLTc5OSA6IDEgOiAwCitSVS1VTkstODAwIDogMSA6IDAKK1JVLVVOSy04MDEgOiAxIDogMAorUlUtVU5LLTgwMiA6IDEgOiAwCitSVS1VTkstODAzIDogMSA6IDAKK1JVLVVOSy04MDQgOiAxIDogMAorUlUtVU5LLTgwNSA6IDEgOiAwCitSVS1VTkstODA2IDogMSA6IDAKK1JVLVVOSy04MDcgOiAxIDogMAorUlUtVU5LLTgwOCA6IDEgOiAwCitSVS1VTkstODA5IDogMSA6IDAKK1JVLVVOSy04MTAgOiAxIDogMAorUlUtVU5LLTgxMSA6IDEgOiAwCitSVS1VTkstODEyIDogMSA6IDAKK1JVLVVOSy04MTMgOiAxIDogMAorUlUtVU5LLTgxNCA6IDEgOiAwCitSVS1VTkstODE1IDogMSA6IDAKK1JVLVVOSy04MTYgOiAxIDogMAorUlUtVU5LLTgxNyA6IDEgOiAwCitSVS1VTkstODE4IDogMSA6IDAKK1JVLVVOSy04MTkgOiAxIDogMAorUlUtVU5LLTgyMCA6IDEgOiAwCitSVS1VTkstODIxIDogMSA6IDAKK1JVLVVOSy04MjIgOiAxIDogMAorUlUtVU5LLTgyMyA6IDEgOiAwCitSVS1VTkstODI0IDogMSA6IDAKK1JVLVVOSy04MjUgOiAxIDogMAorUlUtVU5LLTgyNiA6IDEgOiAwCitSVS1VTkstODI3IDogMSA6IDAKK1JVLVVOSy04MjggOiAxIDogMAorUlUtVU5LLTgyOSA6IDEgOiAwCitSVS1VTkstODMwIDogMSA6IDAKK1JVLVVOSy04MzEgOiAxIDogMAorUlUtVU5LLTgzMiA6IDEgOiAwCitSVS1VTkstODMzIDogMSA6IDAKK1JVLVVOSy04MzQgOiAxIDogMAorUlUtVU5LLTgzNSA6IDEgOiAwCitSVS1VTkstODM2IDogMSA6IDAKK1JVLVVOSy04MzcgOiAxIDogMAorUlUtVU5LLTgzOCA6IDEgOiAwCitSVS1VTkstODM5IDogMSA6IDAKK1JVLVVOSy04NDAgOiAxIDogMAorUlUtVU5LLTg0MSA6IDEgOiAwCitSVS1VTkstODQyIDogMSA6IDAKK1JVLVVOSy04NDMgOiAxIDogMAorUlUtVU5LLTg0NCA6IDEgOiAwCitSVS1VTkstODQ1IDogMSA6IDAKK1JVLVVOSy04NDYgOiAxIDogMAorUlUtVU5LLTg0NyA6IDEgOiAwCitSVS1VTkstODQ4IDogMSA6IDAKK1JVLVVOSy04NDkgOiAxIDogMAorUlUtVU5LLTg1MCA6IDEgOiAwCitSVS1VTkstODUxIDogMSA6IDAKK1JVLVVOSy04NTIgOiAxIDogMAorUlUtVU5LLTg1MyA6IDEgOiAwCitSVS1VTkstODU0IDogMSA6IDAKK1JVLVVOSy04NTUgOiAxIDogMAorUlUtVU5LLTg1NiA6IDEgOiAwCitSVS1VTkstODU3IDogMSA6IDAKK1JVLVVOSy04NTggOiAxIDogMAorUlUtVU5LLTg1OSA6IDEgOiAwCitSVS1VTkstODYwIDogMSA6IDAKK1JVLVVOSy04NjEgOiAxIDogMAorUlUtVU5LLTg2MiA6IDEgOiAwCitSVS1VTkstODYzIDogMSA6IDAKK1JVLVVOSy04NjQgOiAxIDogMAorUlUtVU5LLTg2NSA6IDEgOiAwCitSVS1VTkstODY2IDogMSA6IDAKK1JVLVVOSy04NjcgOiAxIDogMAorUlUtVU5LLTg2OCA6IDEgOiAwCitSVS1VTkstODY5IDogMSA6IDAKK1JVLVVOSy04NzAgOiAxIDogMAorUlUtVU5LLTg3MSA6IDEgOiAwCitSVS1VTkstODcyIDogMSA6IDAKK1JVLVVOSy04NzMgOiAxIDogMAorUlUtVU5LLTg3NCA6IDEgOiAwCitSVS1VTkstODc1IDogMSA6IDAKK1JVLVVOSy04NzYgOiAxIDogMAorUlUtVU5LLTg3NyA6IDEgOiAwCitSVS1VTkstODc4IDogMSA6IDAKK1JVLVVOSy04NzkgOiAxIDogMAorUlUtVU5LLTg4MCA6IDEgOiAwCitSVS1VTkstODgxIDogMSA6IDAKK1JVLVVOSy04ODIgOiAxIDogMAorUlUtVU5LLTg4MyA6IDEgOiAwCitSVS1VTkstODg0IDogMSA6IDAKK1JVLVVOSy04ODUgOiAxIDogMAorUlUtVU5LLTg4NiA6IDEgOiAwCitSVS1VTkstODg3IDogMSA6IDAKK1JVLVVOSy04ODggOiAxIDogMAorUlUtVU5LLTg4OSA6IDEgOiAwCitSVS1VTkstODkwIDogMSA6IDAKK1JVLVVOSy04OTEgOiAxIDogMAorUlUtVU5LLTg5MiA6IDEgOiAwCitSVS1VTkstODkzIDogMSA6IDAKK1JVLVVOSy04OTQgOiAxIDogMAorUlUtVU5LLTg5NSA6IDEgOiAwCitSVS1VTkstODk2IDogMSA6IDAKK1JVLVVOSy04OTcgOiAxIDogMAorUlUtVU5LLTg5OCA6IDEgOiAwCitSVS1VTkstODk5IDogMSA6IDAKK1JVLVVOSy05MDAgOiAxIDogMAorUlUtVU5LLTkwMSA6IDEgOiAwCitSVS1VTkstOTAyIDogMSA6IDAKK1JVLVVOSy05MDMgOiAxIDogMAorUlUtVU5LLTkwNCA6IDEgOiAwCitSVS1VTkstOTA1IDogMSA6IDAKK1JVLVVOSy05MDYgOiAxIDogMAorUlUtVU5LLTkwNyA6IDEgOiAwCitSVS1VTkstOTA4IDogMSA6IDAKK1JVLVVOSy05MDkgOiAxIDogMAorUlUtVU5LLTkxMCA6IDEgOiAwCitSVS1VTkstOTExIDogMSA6IDAKK1JVLVVOSy05MTIgOiAxIDogMAorUlUtVU5LLTkxMyA6IDEgOiAwCitSVS1VTkstOTE0IDogMSA6IDAKK1JVLVVOSy05MTUgOiAxIDogMAorUlUtVU5LLTkxNiA6IDEgOiAwCitSVS1VTkstOTE3IDogMSA6IDAKK1JVLVVOSy05MTggOiAxIDogMAorUlUtVU5LLTkxOSA6IDEgOiAwCitSVS1VTkstOTIwIDogMSA6IDAKK1JVLVVOSy05MjEgOiAxIDogMAorUlUtVU5LLTkyMiA6IDEgOiAwCitSVS1VTkstOTIzIDogMSA6IDAKK1JVLVVOSy05MjQgOiAxIDogMAorUlUtVU5LLTkyNSA6IDEgOiAwCitSVS1VTkstOTI2IDogMSA6IDAKK1JVLVVOSy05MjcgOiAxIDogMAorUlUtVU5LLTkyOCA6IDEgOiAwCitSVS1VTkstOTI5IDogMSA6IDAKK1JVLVVOSy05MzAgOiAxIDogMAorUlUtVU5LLTkzMSA6IDEgOiAwCitSVS1VTkstOTMyIDogMSA6IDAKK1JVLVVOSy05MzMgOiAxIDogMAorUlUtVU5LLTkzNCA6IDEgOiAwCitSVS1VTkstOTM1IDogMSA6IDAKK1JVLVVOSy05MzYgOiAxIDogMAorUlUtVU5LLTkzNyA6IDEgOiAwCitSVS1VTkstOTM4IDogMSA6IDAKK1JVLVVOSy05MzkgOiAxIDogMAorUlUtVU5LLTk0MCA6IDEgOiAwCitSVS1VTkstOTQxIDogMSA6IDAKK1JVLVVOSy05NDIgOiAxIDogMAorUlUtVU5LLTk0MyA6IDEgOiAwCitSVS1VTkstOTQ0IDogMSA6IDAKK1JVLVVOSy05NDUgOiAxIDogMAorUlUtVU5LLTk0NiA6IDEgOiAwCitSVS1VTkstOTQ3IDogMSA6IDAKK1JVLVVOSy05NDggOiAxIDogMAorUlUtVU5LLTk0OSA6IDEgOiAwCitSVS1VTkstOTUwIDogMSA6IDAKK1JVLVVOSy05NTEgOiAxIDogMAorUlUtVU5LLTk1MiA6IDEgOiAwCitSVS1VTkstOTUzIDogMSA6IDAKK1JVLVVOSy05NTQgOiAxIDogMAorUlUtVU5LLTk1NSA6IDEgOiAwCitSVS1VTkstOTU2IDogMSA6IDAKK1JVLVVOSy05NTcgOiAxIDogMAorUlUtVU5LLTk1OCA6IDEgOiAwCitSVS1VTkstOTU5IDogMSA6IDAKK1JVLVVOSy05NjAgOiAxIDogMAorUlUtVU5LLTk2MSA6IDEgOiAwCitSVS1VTkstOTYyIDogMSA6IDAKK1JVLVVOSy05NjMgOiAxIDogMAorUlUtVU5LLTk2NCA6IDEgOiAwCitSVS1VTkstOTY1IDogMSA6IDAKK1JVLVVOSy05NjYgOiAxIDogMAorUlUtVU5LLTk2NyA6IDEgOiAwCitSVS1VTkstOTY4IDogMSA6IDAKK1JVLVVOSy05NjkgOiAxIDogMAorUlUtVU5LLTk3MCA6IDEgOiAwCitSVS1VTkstOTcxIDogMSA6IDAKK1JVLVVOSy05NzIgOiAxIDogMAorUlUtVU5LLTk3MyA6IDEgOiAwCitSVS1VTkstOTc0IDogMSA6IDAKK1JVLVVOSy05NzUgOiAxIDogMAorUlUtVU5LLTk3NiA6IDEgOiAwCitSVS1VTkstOTc3IDogMSA6IDAKK1JVLVVOSy05NzggOiAxIDogMAorUlUtVU5LLTk3OSA6IDEgOiAwCitSVS1VTkstOTgwIDogMSA6IDAKK1JVLVVOSy05ODEgOiAxIDogMAorUlUtVU5LLTk4MiA6IDEgOiAwCitSVS1VTkstOTgzIDogMSA6IDAKK1JVLVVOSy05ODQgOiAxIDogMAorUlUtVU5LLTk4NSA6IDEgOiAwCitSVS1VTkstOTg2IDogMSA6IDAKK1JVLVVOSy05ODcgOiAxIDogMAorUlUtVU5LLTk4OCA6IDEgOiAwCitSVS1VTkstOTg5IDogMSA6IDAKK1JVLVVOSy05OTAgOiAxIDogMAorUlUtVU5LLTk5MSA6IDEgOiAwCitSVS1VTkstOTkyIDogMSA6IDAKK1JVLVVOSy05OTMgOiAxIDogMAorUlUtVU5LLTk5NCA6IDEgOiAwCitSVS1VTkstOTk1IDogMSA6IDAKK1JVLVVOSy05OTYgOiAxIDogMAorUlUtVU5LLTk5NyA6IDEgOiAwCitSVS1VTkstOTk4IDogMSA6IDAKK1JVLVVOSy05OTkgOiAxIDogMAorUlUtVU5LLTEwMDAgOiAxIDogMAorUlUtVU5LLTEwMDEgOiAxIDogMAorUlUtVU5LLTEwMDIgOiAxIDogMAorUlUtVU5LLTEwMDMgOiAxIDogMAorUlUtVU5LLTEwMDQgOiAxIDogMAorUlUtVU5LLTEwMDUgOiAxIDogMAorUlUtVU5LLTEwMDYgOiAxIDogMAorUlUtVU5LLTEwMDcgOiAxIDogMAorUlUtVU5LLTEwMDggOiAxIDogMAorUlUtVU5LLTEwMDkgOiAxIDogMAorUlUtVU5LLTEwMTAgOiAxIDogMAorUlUtVU5LLTEwMTEgOiAxIDogMAorUlUtVU5LLTEwMTIgOiAxIDogMAorUlUtVU5LLTEwMTMgOiAxIDogMAorUlUtVU5LLTEwMTQgOiAxIDogMAorUlUtVU5LLTEwMTUgOiAxIDogMAorUlUtVU5LLTEwMTYgOiAxIDogMAorUlUtVU5LLTEwMTcgOiAxIDogMAorUlUtVU5LLTEwMTggOiAxIDogMAorUlUtVU5LLTEwMTkgOiAxIDogMAorUlUtVU5LLTEwMjAgOiAxIDogMAorUlUtVU5LLTEwMjEgOiAxIDogMAorUlUtVU5LLTEwMjIgOiAxIDogMAorUlUtVU5LLTEwMjMgOiAxIDogMAorUlUtVU5LLTEwMjQgOiAxIDogMAorUlUtVU5LLTEwMjUgOiAxIDogMAorUlUtVU5LLTEwMjYgOiAxIDogMAorUlUtVU5LLTEwMjcgOiAxIDogMAorUlUtVU5LLTEwMjggOiAxIDogMAorUlUtVU5LLTEwMjkgOiAxIDogMAorUlUtVU5LLTEwMzAgOiAxIDogMAorUlUtVU5LLTEwMzEgOiAxIDogMAorUlUtVU5LLTEwMzIgOiAxIDogMAorUlUtVU5LLTEwMzMgOiAxIDogMAorUlUtVU5LLTEwMzQgOiAxIDogMAorUlUtVU5LLTEwMzUgOiAxIDogMAorUlUtVU5LLTEwMzYgOiAxIDogMAorUlUtVU5LLTEwMzcgOiAxIDogMAorUlUtVU5LLTEwMzggOiAxIDogMAorUlUtVU5LLTEwMzkgOiAxIDogMAorUlUtVU5LLTEwNDAgOiAxIDogMAorUlUtVU5LLTEwNDEgOiAxIDogMAorUlUtVU5LLTEwNDIgOiAxIDogMAorUlUtVU5LLTEwNDMgOiAxIDogMAorUlUtVU5LLTEwNDQgOiAxIDogMAorUlUtVU5LLTEwNDUgOiAxIDogMAorUlUtVU5LLTEwNDYgOiAxIDogMAorUlUtVU5LLTEwNDcgOiAxIDogMAorUlUtVU5LLTEwNDggOiAxIDogMAorUlUtVU5LLTEwNDkgOiAxIDogMAorUlUtVU5LLTEwNTAgOiAxIDogMAorUlUtVU5LLTEwNTEgOiAxIDogMAorUlUtVU5LLTEwNTIgOiAxIDogMAorUlUtVU5LLTEwNTMgOiAxIDogMAorUlUtVU5LLTEwNTQgOiAxIDogMAorUlUtVU5LLTEwNTUgOiAxIDogMAorUlUtVU5LLTEwNTYgOiAxIDogMAorUlUtVU5LLTEwNTcgOiAxIDogMAorUlUtVU5LLTEwNTggOiAxIDogMAorUlUtVU5LLTEwNTkgOiAxIDogMAorUlUtVU5LLTEwNjAgOiAxIDogMAorUlUtVU5LLTEwNjEgOiAxIDogMAorUlUtVU5LLTEwNjIgOiAxIDogMAorUlUtVU5LLTEwNjMgOiAxIDogMAorUlUtVU5LLTEwNjQgOiAxIDogMAorUlUtVU5LLTEwNjUgOiAxIDogMAorUlUtVU5LLTEwNjYgOiAxIDogMAorUlUtVU5LLTEwNjcgOiAxIDogMAorUlUtVU5LLTEwNjggOiAxIDogMAorUlUtVU5LLTEwNjkgOiAxIDogMAorUlUtVU5LLTEwNzAgOiAxIDogMAorUlUtVU5LLTEwNzEgOiAxIDogMAorUlUtVU5LLTEwNzIgOiAxIDogMAorUlUtVU5LLTEwNzMgOiAxIDogMAorUlUtVU5LLTEwNzQgOiAxIDogMAorUlUtVU5LLTEwNzUgOiAxIDogMAorUlUtVU5LLTEwNzYgOiAxIDogMAorUlUtVU5LLTEwNzcgOiAxIDogMAorUlUtVU5LLTEwNzggOiAxIDogMAorUlUtVU5LLTEwNzkgOiAxIDogMAorUlUtVU5LLTEwODAgOiAxIDogMAorUlUtVU5LLTEwODEgOiAxIDogMAorUlUtVU5LLTEwODIgOiAxIDogMAorUlUtVU5LLTEwODMgOiAxIDogMAorUlUtVU5LLTEwODQgOiAxIDogMAorUlUtVU5LLTEwODUgOiAxIDogMAorUlUtVU5LLTEwODYgOiAxIDogMAorUlUtVU5LLTEwODcgOiAxIDogMAorUlUtVU5LLTEwODggOiAxIDogMAorUlUtVU5LLTEwODkgOiAxIDogMAorUlUtVU5LLTEwOTAgOiAxIDogMAorUlUtVU5LLTEwOTEgOiAxIDogMAorUlUtVU5LLTEwOTIgOiAxIDogMAorUlUtVU5LLTEwOTMgOiAxIDogMAorUlUtVU5LLTEwOTQgOiAxIDogMAorUlUtVU5LLTEwOTUgOiAxIDogMAorUlUtVU5LLTEwOTYgOiAxIDogMAorUlUtVU5LLTEwOTcgOiAxIDogMAorUlUtVU5LLTEwOTggOiAxIDogMAorUlUtVU5LLTEwOTkgOiAxIDogMAorUlUtVU5LLTExMDAgOiAxIDogMAorUlUtVU5LLTExMDEgOiAxIDogMAorUlUtVU5LLTExMDIgOiAxIDogMAorUlUtVU5LLTExMDMgOiAxIDogMAorUlUtVU5LLTExMDQgOiAxIDogMAorUlUtVU5LLTExMDUgOiAxIDogMAorUlUtVU5LLTExMDYgOiAxIDogMAorUlUtVU5LLTExMDcgOiAxIDogMAorUlUtVU5LLTExMDggOiAxIDogMAorUlUtVU5LLTExMDkgOiAxIDogMAorUlUtVU5LLTExMTAgOiAxIDogMAorUlUtVU5LLTExMTEgOiAxIDogMAorUlUtVU5LLTExMTIgOiAxIDogMAorUlUtVU5LLTExMTMgOiAxIDogMAorUlUtVU5LLTExMTQgOiAxIDogMAorUlUtVU5LLTExMTUgOiAxIDogMAorUlUtVU5LLTExMTYgOiAxIDogMAorUlUtVU5LLTExMTcgOiAxIDogMAorUlUtVU5LLTExMTggOiAxIDogMAorUlUtVU5LLTExMTkgOiAxIDogMAorUlUtVU5LLTExMjAgOiAxIDogMAorUlUtVU5LLTExMjEgOiAxIDogMAorUlUtVU5LLTExMjIgOiAxIDogMAorUlUtVU5LLTExMjMgOiAxIDogMAorUlUtVU5LLTExMjQgOiAxIDogMAorUlUtVU5LLTExMjUgOiAxIDogMAorUlUtVU5LLTExMjYgOiAxIDogMAorUlUtVU5LLTExMjcgOiAxIDogMAorUlUtVU5LLTExMjggOiAxIDogMAorUlUtVU5LLTExMjkgOiAxIDogMAorUlUtVU5LLTExMzAgOiAxIDogMAorUlUtVU5LLTExMzEgOiAxIDogMAorUlUtVU5LLTExMzIgOiAxIDogMAorUlUtVU5LLTExMzMgOiAxIDogMAorUlUtVU5LLTExMzQgOiAxIDogMAorUlUtVU5LLTExMzUgOiAxIDogMAorUlUtVU5LLTExMzYgOiAxIDogMAorUlUtVU5LLTExMzcgOiAxIDogMAorUlUtVU5LLTExMzggOiAxIDogMAorUlUtVU5LLTExMzkgOiAxIDogMAorUlUtVU5LLTExNDAgOiAxIDogMAorUlUtVU5LLTExNDEgOiAxIDogMAorUlUtVU5LLTExNDIgOiAxIDogMAorUlUtVU5LLTExNDMgOiAxIDogMAorUlUtVU5LLTExNDQgOiAxIDogMAorUlUtVU5LLTExNDUgOiAxIDogMAorUlUtVU5LLTExNDYgOiAxIDogMAorUlUtVU5LLTExNDcgOiAxIDogMAorUlUtVU5LLTExNDggOiAxIDogMAorUlUtVU5LLTExNDkgOiAxIDogMAorUlUtVU5LLTExNTAgOiAxIDogMAorUlUtVU5LLTExNTEgOiAxIDogMAorUlUtVU5LLTExNTIgOiAxIDogMAorUlUtVU5LLTExNTMgOiAxIDogMAorUlUtVU5LLTExNTQgOiAxIDogMAorUlUtVU5LLTExNTUgOiAxIDogMAorUlUtVU5LLTExNTYgOiAxIDogMAorUlUtVU5LLTExNTcgOiAxIDogMAorUlUtVU5LLTExNTggOiAxIDogMAorUlUtVU5LLTExNTkgOiAxIDogMAorUlUtVU5LLTExNjAgOiAxIDogMAorUlUtVU5LLTExNjEgOiAxIDogMAorUlUtVU5LLTExNjIgOiAxIDogMAorUlUtVU5LLTExNjMgOiAxIDogMAorUlUtVU5LLTExNjQgOiAxIDogMAorUlUtVU5LLTExNjUgOiAxIDogMAorUlUtVU5LLTExNjYgOiAxIDogMAorUlUtVU5LLTExNjcgOiAxIDogMAorUlUtVU5LLTExNjggOiAxIDogMAorUlUtVU5LLTExNjkgOiAxIDogMAorUlUtVU5LLTExNzAgOiAxIDogMAorUlUtVU5LLTExNzEgOiAxIDogMAorUlUtVU5LLTExNzIgOiAxIDogMAorUlUtVU5LLTExNzMgOiAxIDogMAorUlUtVU5LLTExNzQgOiAxIDogMAorUlUtVU5LLTExNzUgOiAxIDogMAorUlUtVU5LLTExNzYgOiAxIDogMAorUlUtVU5LLTExNzcgOiAxIDogMAorUlUtVU5LLTExNzggOiAxIDogMAorUlUtVU5LLTExNzkgOiAxIDogMAorUlUtVU5LLTExODAgOiAxIDogMAorUlUtVU5LLTExODEgOiAxIDogMAorUlUtVU5LLTExODIgOiAxIDogMAorUlUtVU5LLTExODMgOiAxIDogMAorUlUtVU5LLTExODQgOiAxIDogMAorUlUtVU5LLTExODUgOiAxIDogMAorUlUtVU5LLTExODYgOiAxIDogMAorUlUtVU5LLTExODcgOiAxIDogMAorUlUtVU5LLTExODggOiAxIDogMAorUlUtVU5LLTExODkgOiAxIDogMAorUlUtVU5LLTExOTAgOiAxIDogMAorUlUtVU5LLTExOTEgOiAxIDogMAorUlUtVU5LLTExOTIgOiAxIDogMAorUlUtVU5LLTExOTMgOiAxIDogMAorUlUtVU5LLTExOTQgOiAxIDogMAorUlUtVU5LLTExOTUgOiAxIDogMAorUlUtVU5LLTExOTYgOiAxIDogMAorUlUtVU5LLTExOTcgOiAxIDogMAorUlUtVU5LLTExOTggOiAxIDogMAorUlUtVU5LLTExOTkgOiAxIDogMAorUlUtVU5LLTEyMDAgOiAxIDogMAorUlUtVU5LLTEyMDEgOiAxIDogMAorUlUtVU5LLTEyMDIgOiAxIDogMAorUlUtVU5LLTEyMDMgOiAxIDogMAorUlUtVU5LLTEyMDQgOiAxIDogMAorUlUtVU5LLTEyMDUgOiAxIDogMAorUlUtVU5LLTEyMDYgOiAxIDogMAorUlUtVU5LLTEyMDcgOiAxIDogMAorUlUtVU5LLTEyMDggOiAxIDogMAorUlUtVU5LLTEyMDkgOiAxIDogMAorUlUtVU5LLTEyMTAgOiAxIDogMAorUlUtVU5LLTEyMTEgOiAxIDogMAorUlUtVU5LLTEyMTIgOiAxIDogMAorUlUtVU5LLTEyMTMgOiAxIDogMAorUlUtVU5LLTEyMTQgOiAxIDogMAorUlUtVU5LLTEyMTUgOiAxIDogMAorUlUtVU5LLTEyMTYgOiAxIDogMAorUlUtVU5LLTEyMTcgOiAxIDogMAorUlUtVU5LLTEyMTggOiAxIDogMAorUlUtVU5LLTEyMTkgOiAxIDogMAorUlUtVU5LLTEyMjAgOiAxIDogMAorUlUtVU5LLTEyMjEgOiAxIDogMAorUlUtVU5LLTEyMjIgOiAxIDogMAorUlUtVU5LLTEyMjMgOiAxIDogMAorUlUtVU5LLTEyMjQgOiAxIDogMAorUlUtVU5LLTEyMjUgOiAxIDogMAorUlUtVU5LLTEyMjYgOiAxIDogMAorUlUtVU5LLTEyMjcgOiAxIDogMAorUlUtVU5LLTEyMjggOiAxIDogMAorUlUtVU5LLTEyMjkgOiAxIDogMAorUlUtVU5LLTEyMzAgOiAxIDogMAorUlUtVU5LLTEyMzEgOiAxIDogMAorUlUtVU5LLTEyMzIgOiAxIDogMAorUlUtVU5LLTEyMzMgOiAxIDogMAorUlUtVU5LLTEyMzQgOiAxIDogMAorUlUtVU5LLTEyMzUgOiAxIDogMAorUlUtVU5LLTEyMzYgOiAxIDogMAorUlUtVU5LLTEyMzcgOiAxIDogMAorUlUtVU5LLTEyMzggOiAxIDogMAorUlUtVU5LLTEyMzkgOiAxIDogMAorUlUtVU5LLTEyNDAgOiAxIDogMAorUlUtVU5LLTEyNDEgOiAxIDogMAorUlUtVU5LLTEyNDIgOiAxIDogMAorUlUtVU5LLTEyNDMgOiAxIDogMAorUlUtVU5LLTEyNDQgOiAxIDogMAorUlUtVU5LLTEyNDUgOiAxIDogMAorUlUtVU5LLTEyNDYgOiAxIDogMAorUlUtVU5LLTEyNDcgOiAxIDogMAorUlUtVU5LLTEyNDggOiAxIDogMAorUlUtVU5LLTEyNDkgOiAxIDogMAorUlUtVU5LLTEyNTAgOiAxIDogMAorUlUtVU5LLTEyNTEgOiAxIDogMAorUlUtVU5LLTEyNTIgOiAxIDogMAorUlUtVU5LLTEyNTMgOiAxIDogMAorUlUtVU5LLTEyNTQgOiAxIDogMAorUlUtVU5LLTEyNTUgOiAxIDogMAorUlUtVU5LLTEyNTYgOiAxIDogMAorUlUtVU5LLTEyNTcgOiAxIDogMAorUlUtVU5LLTEyNTggOiAxIDogMAorUlUtVU5LLTEyNTkgOiAxIDogMAorUlUtVU5LLTEyNjAgOiAxIDogMAorUlUtVU5LLTEyNjEgOiAxIDogMAorUlUtVU5LLTEyNjIgOiAxIDogMAorUlUtVU5LLTEyNjMgOiAxIDogMAorUlUtVU5LLTEyNjQgOiAxIDogMAorUlUtVU5LLTEyNjUgOiAxIDogMAorUlUtVU5LLTEyNjYgOiAxIDogMAorUlUtVU5LLTEyNjcgOiAxIDogMAorUlUtVU5LLTEyNjggOiAxIDogMAorUlUtVU5LLTEyNjkgOiAxIDogMAorUlUtVU5LLTEyNzAgOiAxIDogMAorUlUtVU5LLTEyNzEgOiAxIDogMAorUlUtVU5LLTEyNzIgOiAxIDogMAorUlUtVU5LLTEyNzMgOiAxIDogMAorUlUtVU5LLTEyNzQgOiAxIDogMAorUlUtVU5LLTEyNzUgOiAxIDogMAorUlUtVU5LLTEyNzYgOiAxIDogMAorUlUtVU5LLTEyNzcgOiAxIDogMAorUlUtVU5LLTEyNzggOiAxIDogMAorUlUtVU5LLTEyNzkgOiAxIDogMAorUlUtVU5LLTEyODAgOiAxIDogMAorUlUtVU5LLTEyODEgOiAxIDogMAorUlUtVU5LLTEyODIgOiAxIDogMAorUlUtVU5LLTEyODMgOiAxIDogMAorUlUtVU5LLTEyODQgOiAxIDogMAorUlUtVU5LLTEyODUgOiAxIDogMAorUlUtVU5LLTEyODYgOiAxIDogMAorUlUtVU5LLTEyODcgOiAxIDogMAorUlUtVU5LLTEyODggOiAxIDogMAorUlUtVU5LLTEyODkgOiAxIDogMAorUlUtVU5LLTEyOTAgOiAxIDogMAorUlUtVU5LLTEyOTEgOiAxIDogMAorUlUtVU5LLTEyOTIgOiAxIDogMAorUlUtVU5LLTEyOTMgOiAxIDogMAorUlUtVU5LLTEyOTQgOiAxIDogMAorUlUtVU5LLTEyOTUgOiAxIDogMAorUlUtVU5LLTEyOTYgOiAxIDogMAorUlUtVU5LLTEyOTcgOiAxIDogMAorUlUtVU5LLTEyOTggOiAxIDogMAorUlUtVU5LLTEyOTkgOiAxIDogMAorUlUtVU5LLTEzMDAgOiAxIDogMAorUlUtVU5LLTEzMDEgOiAxIDogMAorUlUtVU5LLTEzMDIgOiAxIDogMAorUlUtVU5LLTEzMDMgOiAxIDogMAorUlUtVU5LLTEzMDQgOiAxIDogMAorUlUtVU5LLTEzMDUgOiAxIDogMAorUlUtVU5LLTEzMDYgOiAxIDogMAorUlUtVU5LLTEzMDcgOiAxIDogMAorUlUtVU5LLTEzMDggOiAxIDogMAorUlUtVU5LLTEzMDkgOiAxIDogMAorUlUtVU5LLTEzMTAgOiAxIDogMAorUlUtVU5LLTEzMTEgOiAxIDogMAorUlUtVU5LLTEzMTIgOiAxIDogMAorUlUtVU5LLTEzMTMgOiAxIDogMAorUlUtVU5LLTEzMTQgOiAxIDogMAorUlUtVU5LLTEzMTUgOiAxIDogMAorUlUtVU5LLTEzMTYgOiAxIDogMAorUlUtVU5LLTEzMTcgOiAxIDogMAorUlUtVU5LLTEzMTggOiAxIDogMAorUlUtVU5LLTEzMTkgOiAxIDogMAorUlUtVU5LLTEzMjAgOiAxIDogMAorUlUtVU5LLTEzMjEgOiAxIDogMAorUlUtVU5LLTEzMjIgOiAxIDogMAorUlUtVU5LLTEzMjMgOiAxIDogMAorUlUtVU5LLTEzMjQgOiAxIDogMAorUlUtVU5LLTEzMjUgOiAxIDogMAorUlUtVU5LLTEzMjYgOiAxIDogMAorUlUtVU5LLTEzMjcgOiAxIDogMAorUlUtVU5LLTEzMjggOiAxIDogMAorUlUtVU5LLTEzMjkgOiAxIDogMAorUlUtVU5LLTEzMzAgOiAxIDogMAorUlUtVU5LLTEzMzEgOiAxIDogMAorUlUtVU5LLTEzMzIgOiAxIDogMAorUlUtVU5LLTEzMzMgOiAxIDogMAorUlUtVU5LLTEzMzQgOiAxIDogMAorUlUtVU5LLTEzMzUgOiAxIDogMAorUlUtVU5LLTEzMzYgOiAxIDogMAorUlUtVU5LLTEzMzcgOiAxIDogMAorUlUtVU5LLTEzMzggOiAxIDogMAorUlUtVU5LLTEzMzkgOiAxIDogMAorUlUtVU5LLTEzNDAgOiAxIDogMAorUlUtVU5LLTEzNDEgOiAxIDogMAorUlUtVU5LLTEzNDIgOiAxIDogMAorUlUtVU5LLTEzNDMgOiAxIDogMAorUlUtVU5LLTEzNDQgOiAxIDogMAorUlUtVU5LLTEzNDUgOiAxIDogMAorUlUtVU5LLTEzNDYgOiAxIDogMAorUlUtVU5LLTEzNDcgOiAxIDogMAorUlUtVU5LLTEzNDggOiAxIDogMAorUlUtVU5LLTEzNDkgOiAxIDogMAorUlUtVU5LLTEzNTAgOiAxIDogMAorUlUtVU5LLTEzNTEgOiAxIDogMAorUlUtVU5LLTEzNTIgOiAxIDogMAorUlUtVU5LLTEzNTMgOiAxIDogMAorUlUtVU5LLTEzNTQgOiAxIDogMAorUlUtVU5LLTEzNTUgOiAxIDogMAorUlUtVU5LLTEzNTYgOiAxIDogMAorUlUtVU5LLTEzNTcgOiAxIDogMAorUlUtVU5LLTEzNTggOiAxIDogMAorUlUtVU5LLTEzNTkgOiAxIDogMAorUlUtVU5LLTEzNjAgOiAxIDogMAorUlUtVU5LLTEzNjEgOiAxIDogMAorUlUtVU5LLTEzNjIgOiAxIDogMAorUlUtVU5LLTEzNjMgOiAxIDogMAorUlUtVU5LLTEzNjQgOiAxIDogMAorUlUtVU5LLTEzNjUgOiAxIDogMAorUlUtVU5LLTEzNjYgOiAxIDogMAorUlUtVU5LLTEzNjcgOiAxIDogMAorUlUtVU5LLTEzNjggOiAxIDogMAorUlUtVU5LLTEzNjkgOiAxIDogMAorUlUtVU5LLTEzNzAgOiAxIDogMAorUlUtVU5LLTEzNzEgOiAxIDogMAorUlUtVU5LLTEzNzIgOiAxIDogMAorUlUtVU5LLTEzNzMgOiAxIDogMAorUlUtVU5LLTEzNzQgOiAxIDogMAorUlUtVU5LLTEzNzUgOiAxIDogMAorUlUtVU5LLTEzNzYgOiAxIDogMAorUlUtVU5LLTEzNzcgOiAxIDogMAorUlUtVU5LLTEzNzggOiAxIDogMAorUlUtVU5LLTEzNzkgOiAxIDogMAorUlUtVU5LLTEzODAgOiAxIDogMAorUlUtVU5LLTEzODEgOiAxIDogMAorUlUtVU5LLTEzODIgOiAxIDogMAorUlUtVU5LLTEzODMgOiAxIDogMAorUlUtVU5LLTEzODQgOiAxIDogMAorUlUtVU5LLTEzODUgOiAxIDogMAorUlUtVU5LLTEzODYgOiAxIDogMAorUlUtVU5LLTEzODcgOiAxIDogMAorUlUtVU5LLTEzODggOiAxIDogMAorUlUtVU5LLTEzODkgOiAxIDogMAorUlUtVU5LLTEzOTAgOiAxIDogMAorUlUtVU5LLTEzOTEgOiAxIDogMAorUlUtVU5LLTEzOTIgOiAxIDogMAorUlUtVU5LLTEzOTMgOiAxIDogMAorUlUtVU5LLTEzOTQgOiAxIDogMAorUlUtVU5LLTEzOTUgOiAxIDogMAorUlUtVU5LLTEzOTYgOiAxIDogMAorUlUtVU5LLTEzOTcgOiAxIDogMAorUlUtVU5LLTEzOTggOiAxIDogMAorUlUtVU5LLTEzOTkgOiAxIDogMAorUlUtVU5LLTE0MDAgOiAxIDogMAorUlUtVU5LLTE0MDEgOiAxIDogMAorUlUtVU5LLTE0MDIgOiAxIDogMAorUlUtVU5LLTE0MDMgOiAxIDogMAorUlUtVU5LLTE0MDQgOiAxIDogMAorUlUtVU5LLTE0MDUgOiAxIDogMAorUlUtVU5LLTE0MDYgOiAxIDogMAorUlUtVU5LLTE0MDcgOiAxIDogMAorUlUtVU5LLTE0MDggOiAxIDogMAorUlUtVU5LLTE0MDkgOiAxIDogMAorUlUtVU5LLTE0MTAgOiAxIDogMAorUlUtVU5LLTE0MTEgOiAxIDogMAorUlUtVU5LLTE0MTIgOiAxIDogMAorUlUtVU5LLTE0MTMgOiAxIDogMAorUlUtVU5LLTE0MTQgOiAxIDogMAorUlUtVU5LLTE0MTUgOiAxIDogMAorUlUtVU5LLTE0MTYgOiAxIDogMAorUlUtVU5LLTE0MTcgOiAxIDogMAorUlUtVU5LLTE0MTggOiAxIDogMAorUlUtVU5LLTE0MTkgOiAxIDogMAorUlUtVU5LLTE0MjAgOiAxIDogMAorUlUtVU5LLTE0MjEgOiAxIDogMAorUlUtVU5LLTE0MjIgOiAxIDogMAorUlUtVU5LLTE0MjMgOiAxIDogMAorUlUtVU5LLTE0MjQgOiAxIDogMAorUlUtVU5LLTE0MjUgOiAxIDogMAorUlUtVU5LLTE0MjYgOiAxIDogMAorUlUtVU5LLTE0MjcgOiAxIDogMAorUlUtVU5LLTE0MjggOiAxIDogMAorUlUtVU5LLTE0MjkgOiAxIDogMAorUlUtVU5LLTE0MzAgOiAxIDogMAorUlUtVU5LLTE0MzEgOiAxIDogMAorUlUtVU5LLTE0MzIgOiAxIDogMAorUlUtVU5LLTE0MzMgOiAxIDogMAorUlUtVU5LLTE0MzQgOiAxIDogMAorUlUtVU5LLTE0MzUgOiAxIDogMAorUlUtVU5LLTE0MzYgOiAxIDogMAorUlUtVU5LLTE0MzcgOiAxIDogMAorUlUtVU5LLTE0MzggOiAxIDogMAorUlUtVU5LLTE0MzkgOiAxIDogMAorUlUtVU5LLTE0NDAgOiAxIDogMAorUlUtVU5LLTE0NDEgOiAxIDogMAorUlUtVU5LLTE0NDIgOiAxIDogMAorUlUtVU5LLTE0NDMgOiAxIDogMAorUlUtVU5LLTE0NDQgOiAxIDogMAorUlUtVU5LLTE0NDUgOiAxIDogMAorUlUtVU5LLTE0NDYgOiAxIDogMAorUlUtVU5LLTE0NDcgOiAxIDogMAorUlUtVU5LLTE0NDggOiAxIDogMAorUlUtVU5LLTE0NDkgOiAxIDogMAorUlUtVU5LLTE0NTAgOiAxIDogMAorUlUtVU5LLTE0NTEgOiAxIDogMAorUlUtVU5LLTE0NTIgOiAxIDogMAorUlUtVU5LLTE0NTMgOiAxIDogMAorUlUtVU5LLTE0NTQgOiAxIDogMAorUlUtVU5LLTE0NTUgOiAxIDogMAorUlUtVU5LLTE0NTYgOiAxIDogMAorUlUtVU5LLTE0NTcgOiAxIDogMAorUlUtVU5LLTE0NTggOiAxIDogMAorUlUtVU5LLTE0NTkgOiAxIDogMAorUlUtVU5LLTE0NjAgOiAxIDogMAorUlUtVU5LLTE0NjEgOiAxIDogMAorUlUtVU5LLTE0NjIgOiAxIDogMAorUlUtVU5LLTE0NjMgOiAxIDogMAorUlUtVU5LLTE0NjQgOiAxIDogMAorUlUtVU5LLTE0NjUgOiAxIDogMAorUlUtVU5LLTE0NjYgOiAxIDogMAorUlUtVU5LLTE0NjcgOiAxIDogMAorUlUtVU5LLTE0NjggOiAxIDogMAorUlUtVU5LLTE0NjkgOiAxIDogMAorUlUtVU5LLTE0NzAgOiAxIDogMAorUlUtVU5LLTE0NzEgOiAxIDogMAorUlUtVU5LLTE0NzIgOiAxIDogMAorUlUtVU5LLTE0NzMgOiAxIDogMAorUlUtVU5LLTE0NzQgOiAxIDogMAorUlUtVU5LLTE0NzUgOiAxIDogMAorUlUtVU5LLTE0NzYgOiAxIDogMAorUlUtVU5LLTE0NzcgOiAxIDogMAorUlUtVU5LLTE0NzggOiAxIDogMAorUlUtVU5LLTE0NzkgOiAxIDogMAorUlUtVU5LLTE0ODAgOiAxIDogMAorUlUtVU5LLTE0ODEgOiAxIDogMAorUlUtVU5LLTE0ODIgOiAxIDogMAorUlUtVU5LLTE0ODMgOiAxIDogMAorUlUtVU5LLTE0ODQgOiAxIDogMAorUlUtVU5LLTE0ODUgOiAxIDogMAorUlUtVU5LLTE0ODYgOiAxIDogMAorUlUtVU5LLTE0ODcgOiAxIDogMAorUlUtVU5LLTE0ODggOiAxIDogMAorUlUtVU5LLTE0ODkgOiAxIDogMAorUlUtVU5LLTE0OTAgOiAxIDogMAorUlUtVU5LLTE0OTEgOiAxIDogMAorUlUtVU5LLTE0OTIgOiAxIDogMAorUlUtVU5LLTE0OTMgOiAxIDogMAorUlUtVU5LLTE0OTQgOiAxIDogMAorUlUtVU5LLTE0OTUgOiAxIDogMAorUlUtVU5LLTE0OTYgOiAxIDogMAorUlUtVU5LLTE0OTcgOiAxIDogMAorUlUtVU5LLTE0OTggOiAxIDogMAorUlUtVU5LLTE0OTkgOiAxIDogMAorUlUtVU5LLTE1MDAgOiAxIDogMAorUlUtVU5LLTE1MDEgOiAxIDogMAorUlUtVU5LLTE1MDIgOiAxIDogMAorUlUtVU5LLTE1MDMgOiAxIDogMAorUlUtVU5LLTE1MDQgOiAxIDogMAorUlUtVU5LLTE1MDUgOiAxIDogMAorUlUtVU5LLTE1MDYgOiAxIDogMAorUlUtVU5LLTE1MDcgOiAxIDogMAorUlUtVU5LLTE1MDggOiAxIDogMAorUlUtVU5LLTE1MDkgOiAxIDogMAorUlUtVU5LLTE1MTAgOiAxIDogMAorUlUtVU5LLTE1MTEgOiAxIDogMAorUlUtVU5LLTE1MTIgOiAxIDogMAorUlUtVU5LLTE1MTMgOiAxIDogMAorUlUtVU5LLTE1MTQgOiAxIDogMAorUlUtVU5LLTE1MTUgOiAxIDogMAorUlUtVU5LLTE1MTYgOiAxIDogMAorUlUtVU5LLTE1MTcgOiAxIDogMAorUlUtVU5LLTE1MTggOiAxIDogMAorUlUtVU5LLTE1MTkgOiAxIDogMAorUlUtVU5LLTE1MjAgOiAxIDogMAorUlUtVU5LLTE1MjEgOiAxIDogMAorUlUtVU5LLTE1MjIgOiAxIDogMAorUlUtVU5LLTE1MjMgOiAxIDogMAorUlUtVU5LLTE1MjQgOiAxIDogMAorUlUtVU5LLTE1MjUgOiAxIDogMAorUlUtVU5LLTE1MjYgOiAxIDogMAorUlUtVU5LLTE1MjcgOiAxIDogMAorUlUtVU5LLTE1MjggOiAxIDogMAorUlUtVU5LLTE1MjkgOiAxIDogMAorUlUtVU5LLTE1MzAgOiAxIDogMAorUlUtVU5LLTE1MzEgOiAxIDogMAorUlUtVU5LLTE1MzIgOiAxIDogMAorUlUtVU5LLTE1MzMgOiAxIDogMAorUlUtVU5LLTE1MzQgOiAxIDogMAorUlUtVU5LLTE1MzUgOiAxIDogMAorUlUtVU5LLTE1MzYgOiAxIDogMAorUlUtVU5LLTE1MzcgOiAxIDogMAorUlUtVU5LLTE1MzggOiAxIDogMAorUlUtVU5LLTE1MzkgOiAxIDogMAorUlUtVU5LLTE1NDAgOiAxIDogMAorUlUtVU5LLTE1NDEgOiAxIDogMAorUlUtVU5LLTE1NDIgOiAxIDogMAorUlUtVU5LLTE1NDMgOiAxIDogMAorUlUtVU5LLTE1NDQgOiAxIDogMAorUlUtVU5LLTE1NDUgOiAxIDogMAorUlUtVU5LLTE1NDYgOiAxIDogMAorUlUtVU5LLTE1NDcgOiAxIDogMAorUlUtVU5LLTE1NDggOiAxIDogMAorUlUtVU5LLTE1NDkgOiAxIDogMAorUlUtVU5LLTE1NTAgOiAxIDogMAorUlUtVU5LLTE1NTEgOiAxIDogMAorUlUtVU5LLTE1NTIgOiAxIDogMAorUlUtVU5LLTE1NTMgOiAxIDogMAorUlUtVU5LLTE1NTQgOiAxIDogMAorUlUtVU5LLTE1NTUgOiAxIDogMAorUlUtVU5LLTE1NTYgOiAxIDogMAorUlUtVU5LLTE1NTcgOiAxIDogMAorUlUtVU5LLTE1NTggOiAxIDogMAorUlUtVU5LLTE1NTkgOiAxIDogMAorUlUtVU5LLTE1NjAgOiAxIDogMAorUlUtVU5LLTE1NjEgOiAxIDogMAorUlUtVU5LLTE1NjIgOiAxIDogMAorUlUtVU5LLTE1NjMgOiAxIDogMAorUlUtVU5LLTE1NjQgOiAxIDogMAorUlUtVU5LLTE1NjUgOiAxIDogMAorUlUtVU5LLTE1NjYgOiAxIDogMAorUlUtVU5LLTE1NjcgOiAxIDogMAorUlUtVU5LLTE1NjggOiAxIDogMAorUlUtVU5LLTE1NjkgOiAxIDogMAorUlUtVU5LLTE1NzAgOiAxIDogMAorUlUtVU5LLTE1NzEgOiAxIDogMAorUlUtVU5LLTE1NzIgOiAxIDogMAorUlUtVU5LLTE1NzMgOiAxIDogMAorUlUtVU5LLTE1NzQgOiAxIDogMAorUlUtVU5LLTE1NzUgOiAxIDogMAorUlUtVU5LLTE1NzYgOiAxIDogMAorUlUtVU5LLTE1NzcgOiAxIDogMAorUlUtVU5LLTE1NzggOiAxIDogMAorUlUtVU5LLTE1NzkgOiAxIDogMAorUlUtVU5LLTE1ODAgOiAxIDogMAorUlUtVU5LLTE1ODEgOiAxIDogMAorUlUtVU5LLTE1ODIgOiAxIDogMAorUlUtVU5LLTE1ODMgOiAxIDogMAorUlUtVU5LLTE1ODQgOiAxIDogMAorUlUtVU5LLTE1ODUgOiAxIDogMAorUlUtVU5LLTE1ODYgOiAxIDogMAorUlUtVU5LLTE1ODcgOiAxIDogMAorUlUtVU5LLTE1ODggOiAxIDogMAorUlUtVU5LLTE1ODkgOiAxIDogMAorUlUtVU5LLTE1OTAgOiAxIDogMAorUlUtVU5LLTE1OTEgOiAxIDogMAorUlUtVU5LLTE1OTIgOiAxIDogMAorUlUtVU5LLTE1OTMgOiAxIDogMAorUlUtVU5LLTE1OTQgOiAxIDogMAorUlUtVU5LLTE1OTUgOiAxIDogMAorUlUtVU5LLTE1OTYgOiAxIDogMAorUlUtVU5LLTE1OTcgOiAxIDogMAorUlUtVU5LLTE1OTggOiAxIDogMAorUlUtVU5LLTE1OTkgOiAxIDogMAorUlUtVU5LLTE2MDAgOiAxIDogMAorUlUtVU5LLTE2MDEgOiAxIDogMAorUlUtVU5LLTE2MDIgOiAxIDogMAorUlUtVU5LLTE2MDMgOiAxIDogMAorUlUtVU5LLTE2MDQgOiAxIDogMAorUlUtVU5LLTE2MDUgOiAxIDogMAorUlUtVU5LLTE2MDYgOiAxIDogMAorUlUtVU5LLTE2MDcgOiAxIDogMAorUlUtVU5LLTE2MDggOiAxIDogMAorUlUtVU5LLTE2MDkgOiAxIDogMAorUlUtVU5LLTE2MTAgOiAxIDogMAorUlUtVU5LLTE2MTEgOiAxIDogMAorUlUtVU5LLTE2MTIgOiAxIDogMAorUlUtVU5LLTE2MTMgOiAxIDogMAorUlUtVU5LLTE2MTQgOiAxIDogMAorUlUtVU5LLTE2MTUgOiAxIDogMAorUlUtVU5LLTE2MTYgOiAxIDogMAorUlUtVU5LLTE2MTcgOiAxIDogMAorUlUtVU5LLTE2MTggOiAxIDogMAorUlUtVU5LLTE2MTkgOiAxIDogMAorUlUtVU5LLTE2MjAgOiAxIDogMAorUlUtVU5LLTE2MjEgOiAxIDogMAorUlUtVU5LLTE2MjIgOiAxIDogMAorUlUtVU5LLTE2MjMgOiAxIDogMAorUlUtVU5LLTE2MjQgOiAxIDogMAorUlUtVU5LLTE2MjUgOiAxIDogMAorUlUtVU5LLTE2MjYgOiAxIDogMAorUlUtVU5LLTE2MjcgOiAxIDogMAorUlUtVU5LLTE2MjggOiAxIDogMAorUlUtVU5LLTE2MjkgOiAxIDogMAorUlUtVU5LLTE2MzAgOiAxIDogMAorUlUtVU5LLTE2MzEgOiAxIDogMAorUlUtVU5LLTE2MzIgOiAxIDogMAorUlUtVU5LLTE2MzMgOiAxIDogMAorUlUtVU5LLTE2MzQgOiAxIDogMAorUlUtVU5LLTE2MzUgOiAxIDogMAorUlUtVU5LLTE2MzYgOiAxIDogMAorUlUtVU5LLTE2MzcgOiAxIDogMAorUlUtVU5LLTE2MzggOiAxIDogMAorUlUtVU5LLTE2MzkgOiAxIDogMAorUlUtVU5LLTE2NDAgOiAxIDogMAorUlUtVU5LLTE2NDEgOiAxIDogMAorUlUtVU5LLTE2NDIgOiAxIDogMAorUlUtVU5LLTE2NDMgOiAxIDogMAorUlUtVU5LLTE2NDQgOiAxIDogMAorUlUtVU5LLTE2NDUgOiAxIDogMAorUlUtVU5LLTE2NDYgOiAxIDogMAorUlUtVU5LLTE2NDcgOiAxIDogMAorUlUtVU5LLTE2NDggOiAxIDogMAorUlUtVU5LLTE2NDkgOiAxIDogMAorUlUtVU5LLTE2NTAgOiAxIDogMAorUlUtVU5LLTE2NTEgOiAxIDogMAorUlUtVU5LLTE2NTIgOiAxIDogMAorUlUtVU5LLTE2NTMgOiAxIDogMAorUlUtVU5LLTE2NTQgOiAxIDogMAorUlUtVU5LLTE2NTUgOiAxIDogMAorUlUtVU5LLTE2NTYgOiAxIDogMAorUlUtVU5LLTE2NTcgOiAxIDogMAorUlUtVU5LLTE2NTggOiAxIDogMAorUlUtVU5LLTE2NTkgOiAxIDogMAorUlUtVU5LLTE2NjAgOiAxIDogMAorUlUtVU5LLTE2NjEgOiAxIDogMAorUlUtVU5LLTE2NjIgOiAxIDogMAorUlUtVU5LLTE2NjMgOiAxIDogMAorUlUtVU5LLTE2NjQgOiAxIDogMAorUlUtVU5LLTE2NjUgOiAxIDogMAorUlUtVU5LLTE2NjYgOiAxIDogMAorUlUtVU5LLTE2NjcgOiAxIDogMAorUlUtVU5LLTE2NjggOiAxIDogMAorUlUtVU5LLTE2NjkgOiAxIDogMAorUlUtVU5LLTE2NzAgOiAxIDogMAorUlUtVU5LLTE2NzEgOiAxIDogMAorUlUtVU5LLTE2NzIgOiAxIDogMAorUlUtVU5LLTE2NzMgOiAxIDogMAorUlUtVU5LLTE2NzQgOiAxIDogMAorUlUtVU5LLTE2NzUgOiAxIDogMAorUlUtVU5LLTE2NzYgOiAxIDogMAorUlUtVU5LLTE2NzcgOiAxIDogMAorUlUtVU5LLTE2NzggOiAxIDogMAorUlUtVU5LLTE2NzkgOiAxIDogMAorUlUtVU5LLTE2ODAgOiAxIDogMAorUlUtVU5LLTE2ODEgOiAxIDogMAorUlUtVU5LLTE2ODIgOiAxIDogMAorUlUtVU5LLTE2ODMgOiAxIDogMAorUlUtVU5LLTE2ODQgOiAxIDogMAorUlUtVU5LLTE2ODUgOiAxIDogMAorUlUtVU5LLTE2ODYgOiAxIDogMAorUlUtVU5LLTE2ODcgOiAxIDogMAorUlUtVU5LLTE2ODggOiAxIDogMAorUlUtVU5LLTE2ODkgOiAxIDogMAorUlUtVU5LLTE2OTAgOiAxIDogMAorUlUtVU5LLTE2OTEgOiAxIDogMAorUlUtVU5LLTE2OTIgOiAxIDogMAorUlUtVU5LLTE2OTMgOiAxIDogMAorUlUtVU5LLTE2OTQgOiAxIDogMAorUlUtVU5LLTE2OTUgOiAxIDogMAorUlUtVU5LLTE2OTYgOiAxIDogMAorUlUtVU5LLTE2OTcgOiAxIDogMAorUlUtVU5LLTE2OTggOiAxIDogMAorUlUtVU5LLTE2OTkgOiAxIDogMAorUlUtVU5LLTE3MDAgOiAxIDogMAorUlUtVU5LLTE3MDEgOiAxIDogMAorUlUtVU5LLTE3MDIgOiAxIDogMAorUlUtVU5LLTE3MDMgOiAxIDogMAorUlUtVU5LLTE3MDQgOiAxIDogMAorUlUtVU5LLTE3MDUgOiAxIDogMAorUlUtVU5LLTE3MDYgOiAxIDogMAorUlUtVU5LLTE3MDcgOiAxIDogMAorUlUtVU5LLTE3MDggOiAxIDogMAorUlUtVU5LLTE3MDkgOiAxIDogMAorUlUtVU5LLTE3MTAgOiAxIDogMAorUlUtVU5LLTE3MTEgOiAxIDogMAorUlUtVU5LLTE3MTIgOiAxIDogMAorUlUtVU5LLTE3MTMgOiAxIDogMAorUlUtVU5LLTE3MTQgOiAxIDogMAorUlUtVU5LLTE3MTUgOiAxIDogMAorUlUtVU5LLTE3MTYgOiAxIDogMAorUlUtVU5LLTE3MTcgOiAxIDogMAorUlUtVU5LLTE3MTggOiAxIDogMAorUlUtVU5LLTE3MTkgOiAxIDogMAorUlUtVU5LLTE3MjAgOiAxIDogMAorUlUtVU5LLTE3MjEgOiAxIDogMAorUlUtVU5LLTE3MjIgOiAxIDogMAorUlUtVU5LLTE3MjMgOiAxIDogMAorUlUtVU5LLTE3MjQgOiAxIDogMAorUlUtVU5LLTE3MjUgOiAxIDogMAorUlUtVU5LLTE3MjYgOiAxIDogMAorUlUtVU5LLTE3MjcgOiAxIDogMAorUlUtVU5LLTE3MjggOiAxIDogMAorUlUtVU5LLTE3MjkgOiAxIDogMAorUlUtVU5LLTE3MzAgOiAxIDogMAorUlUtVU5LLTE3MzEgOiAxIDogMAorUlUtVU5LLTE3MzIgOiAxIDogMAorUlUtVU5LLTE3MzMgOiAxIDogMAorUlUtVU5LLTE3MzQgOiAxIDogMAorUlUtVU5LLTE3MzUgOiAxIDogMAorUlUtVU5LLTE3MzYgOiAxIDogMAorUlUtVU5LLTE3MzcgOiAxIDogMAorUlUtVU5LLTE3MzggOiAxIDogMAorUlUtVU5LLTE3MzkgOiAxIDogMAorUlUtVU5LLTE3NDAgOiAxIDogMAorUlUtVU5LLTE3NDEgOiAxIDogMAorUlUtVU5LLTE3NDIgOiAxIDogMAorUlUtVU5LLTE3NDMgOiAxIDogMAorUlUtVU5LLTE3NDQgOiAxIDogMAorUlUtVU5LLTE3NDUgOiAxIDogMAorUlUtVU5LLTE3NDYgOiAxIDogMAorUlUtVU5LLTE3NDcgOiAxIDogMAorUlUtVU5LLTE3NDggOiAxIDogMAorUlUtVU5LLTE3NDkgOiAxIDogMAorUlUtVU5LLTE3NTAgOiAxIDogMAorUlUtVU5LLTE3NTEgOiAxIDogMAorUlUtVU5LLTE3NTIgOiAxIDogMAorUlUtVU5LLTE3NTMgOiAxIDogMAorUlUtVU5LLTE3NTQgOiAxIDogMAorUlUtVU5LLTE3NTUgOiAxIDogMAorUlUtVU5LLTE3NTYgOiAxIDogMAorUlUtVU5LLTE3NTcgOiAxIDogMAorUlUtVU5LLTE3NTggOiAxIDogMAorUlUtVU5LLTE3NTkgOiAxIDogMAorUlUtVU5LLTE3NjAgOiAxIDogMAorUlUtVU5LLTE3NjEgOiAxIDogMAorUlUtVU5LLTE3NjIgOiAxIDogMAorUlUtVU5LLTE3NjMgOiAxIDogMAorUlUtVU5LLTE3NjQgOiAxIDogMAorUlUtVU5LLTE3NjUgOiAxIDogMAorUlUtVU5LLTE3NjYgOiAxIDogMAorUlUtVU5LLTE3NjcgOiAxIDogMAorUlUtVU5LLTE3NjggOiAxIDogMAorUlUtVU5LLTE3NjkgOiAxIDogMAorUlUtVU5LLTE3NzAgOiAxIDogMAorUlUtVU5LLTE3NzEgOiAxIDogMAorUlUtVU5LLTE3NzIgOiAxIDogMAorUlUtVU5LLTE3NzMgOiAxIDogMAorUlUtVU5LLTE3NzQgOiAxIDogMAorUlUtVU5LLTE3NzUgOiAxIDogMAorUlUtVU5LLTE3NzYgOiAxIDogMAorUlUtVU5LLTE3NzcgOiAxIDogMAorUlUtVU5LLTE3NzggOiAxIDogMAorUlUtVU5LLTE3NzkgOiAxIDogMAorUlUtVU5LLTE3ODAgOiAxIDogMAorUlUtVU5LLTE3ODEgOiAxIDogMAorUlUtVU5LLTE3ODIgOiAxIDogMAorUlUtVU5LLTE3ODMgOiAxIDogMAorUlUtVU5LLTE3ODQgOiAxIDogMAorUlUtVU5LLTE3ODUgOiAxIDogMAorUlUtVU5LLTE3ODYgOiAxIDogMAorUlUtVU5LLTE3ODcgOiAxIDogMAorUlUtVU5LLTE3ODggOiAxIDogMAorUlUtVU5LLTE3ODkgOiAxIDogMAorUlUtVU5LLTE3OTAgOiAxIDogMAorUlUtVU5LLTE3OTEgOiAxIDogMAorUlUtVU5LLTE3OTIgOiAxIDogMAorUlUtVU5LLTE3OTMgOiAxIDogMAorUlUtVU5LLTE3OTQgOiAxIDogMAorUlUtVU5LLTE3OTUgOiAxIDogMAorUlUtVU5LLTE3OTYgOiAxIDogMAorUlUtVU5LLTE3OTcgOiAxIDogMAorUlUtVU5LLTE3OTggOiAxIDogMAorUlUtVU5LLTE3OTkgOiAxIDogMAorUlUtVU5LLTE4MDAgOiAxIDogMAorUlUtVU5LLTE4MDEgOiAxIDogMAorUlUtVU5LLTE4MDIgOiAxIDogMAorUlUtVU5LLTE4MDMgOiAxIDogMAorUlUtVU5LLTE4MDQgOiAxIDogMAorUlUtVU5LLTE4MDUgOiAxIDogMAorUlUtVU5LLTE4MDYgOiAxIDogMAorUlUtVU5LLTE4MDcgOiAxIDogMAorUlUtVU5LLTE4MDggOiAxIDogMAorUlUtVU5LLTE4MDkgOiAxIDogMAorUlUtVU5LLTE4MTAgOiAxIDogMAorUlUtVU5LLTE4MTEgOiAxIDogMAorUlUtVU5LLTE4MTIgOiAxIDogMAorUlUtVU5LLTE4MTMgOiAxIDogMAorUlUtVU5LLTE4MTQgOiAxIDogMAorUlUtVU5LLTE4MTUgOiAxIDogMAorUlUtVU5LLTE4MTYgOiAxIDogMAorUlUtVU5LLTE4MTcgOiAxIDogMAorUlUtVU5LLTE4MTggOiAxIDogMAorUlUtVU5LLTE4MTkgOiAxIDogMAorUlUtVU5LLTE4MjAgOiAxIDogMAorUlUtVU5LLTE4MjEgOiAxIDogMAorUlUtVU5LLTE4MjIgOiAxIDogMAorUlUtVU5LLTE4MjMgOiAxIDogMAorUlUtVU5LLTE4MjQgOiAxIDogMAorUlUtVU5LLTE4MjUgOiAxIDogMAorUlUtVU5LLTE4MjYgOiAxIDogMAorUlUtVU5LLTE4MjcgOiAxIDogMAorUlUtVU5LLTE4MjggOiAxIDogMAorUlUtVU5LLTE4MjkgOiAxIDogMAorUlUtVU5LLTE4MzAgOiAxIDogMAorUlUtVU5LLTE4MzEgOiAxIDogMAorUlUtVU5LLTE4MzIgOiAxIDogMAorUlUtVU5LLTE4MzMgOiAxIDogMAorUlUtVU5LLTE4MzQgOiAxIDogMAorUlUtVU5LLTE4MzUgOiAxIDogMAorUlUtVU5LLTE4MzYgOiAxIDogMAorUlUtVU5LLTE4MzcgOiAxIDogMAorUlUtVU5LLTE4MzggOiAxIDogMAorUlUtVU5LLTE4MzkgOiAxIDogMAorUlUtVU5LLTE4NDAgOiAxIDogMAorUlUtVU5LLTE4NDEgOiAxIDogMAorUlUtVU5LLTE4NDIgOiAxIDogMAorUlUtVU5LLTE4NDMgOiAxIDogMAorUlUtVU5LLTE4NDQgOiAxIDogMAorUlUtVU5LLTE4NDUgOiAxIDogMAorUlUtVU5LLTE4NDYgOiAxIDogMAorUlUtVU5LLTE4NDcgOiAxIDogMAorUlUtVU5LLTE4NDggOiAxIDogMAorUlUtVU5LLTE4NDkgOiAxIDogMAorUlUtVU5LLTE4NTAgOiAxIDogMAorUlUtVU5LLTE4NTEgOiAxIDogMAorUlUtVU5LLTE4NTIgOiAxIDogMAorUlUtVU5LLTE4NTMgOiAxIDogMAorUlUtVU5LLTE4NTQgOiAxIDogMAorUlUtVU5LLTE4NTUgOiAxIDogMAorUlUtVU5LLTE4NTYgOiAxIDogMAorUlUtVU5LLTE4NTcgOiAxIDogMAorUlUtVU5LLTE4NTggOiAxIDogMAorUlUtVU5LLTE4NTkgOiAxIDogMAorUlUtVU5LLTE4NjAgOiAxIDogMAorUlUtVU5LLTE4NjEgOiAxIDogMAorUlUtVU5LLTE4NjIgOiAxIDogMAorUlUtVU5LLTE4NjMgOiAxIDogMAorUlUtVU5LLTE4NjQgOiAxIDogMAorUlUtVU5LLTE4NjUgOiAxIDogMAorUlUtVU5LLTE4NjYgOiAxIDogMAorUlUtVU5LLTE4NjcgOiAxIDogMAorUlUtVU5LLTE4NjggOiAxIDogMAorUlUtVU5LLTE4NjkgOiAxIDogMAorUlUtVU5LLTE4NzAgOiAxIDogMAorUlUtVU5LLTE4NzEgOiAxIDogMAorUlUtVU5LLTE4NzIgOiAxIDogMAorUlUtVU5LLTE4NzMgOiAxIDogMAorUlUtVU5LLTE4NzQgOiAxIDogMAorUlUtVU5LLTE4NzUgOiAxIDogMAorUlUtVU5LLTE4NzYgOiAxIDogMAorUlUtVU5LLTE4NzcgOiAxIDogMAorUlUtVU5LLTE4NzggOiAxIDogMAorUlUtVU5LLTE4NzkgOiAxIDogMAorUlUtVU5LLTE4ODAgOiAxIDogMAorUlUtVU5LLTE4ODEgOiAxIDogMAorUlUtVU5LLTE4ODIgOiAxIDogMAorUlUtVU5LLTE4ODMgOiAxIDogMAorUlUtVU5LLTE4ODQgOiAxIDogMAorUlUtVU5LLTE4ODUgOiAxIDogMAorUlUtVU5LLTE4ODYgOiAxIDogMAorUlUtVU5LLTE4ODcgOiAxIDogMAorUlUtVU5LLTE4ODggOiAxIDogMAorUlUtVU5LLTE4ODkgOiAxIDogMAorUlUtVU5LLTE4OTAgOiAxIDogMAorUlUtVU5LLTE4OTEgOiAxIDogMAorUlUtVU5LLTE4OTIgOiAxIDogMAorUlUtVU5LLTE4OTMgOiAxIDogMAorUlUtVU5LLTE4OTQgOiAxIDogMAorUlUtVU5LLTE4OTUgOiAxIDogMAorUlUtVU5LLTE4OTYgOiAxIDogMAorUlUtVU5LLTE4OTcgOiAxIDogMAorUlUtVU5LLTE4OTggOiAxIDogMAorUlUtVU5LLTE4OTkgOiAxIDogMAorUlUtVU5LLTE5MDAgOiAxIDogMAorUlUtVU5LLTE5MDEgOiAxIDogMAorUlUtVU5LLTE5MDIgOiAxIDogMAorUlUtVU5LLTE5MDMgOiAxIDogMAorUlUtVU5LLTE5MDQgOiAxIDogMAorUlUtVU5LLTE5MDUgOiAxIDogMAorUlUtVU5LLTE5MDYgOiAxIDogMAorUlUtVU5LLTE5MDcgOiAxIDogMAorUlUtVU5LLTE5MDggOiAxIDogMAorUlUtVU5LLTE5MDkgOiAxIDogMAorUlUtVU5LLTE5MTAgOiAxIDogMAorUlUtVU5LLTE5MTEgOiAxIDogMAorUlUtVU5LLTE5MTIgOiAxIDogMAorUlUtVU5LLTE5MTMgOiAxIDogMAorUlUtVU5LLTE5MTQgOiAxIDogMAorUlUtVU5LLTE5MTUgOiAxIDogMAorUlUtVU5LLTE5MTYgOiAxIDogMAorUlUtVU5LLTE5MTcgOiAxIDogMAorUlUtVU5LLTE5MTggOiAxIDogMAorUlUtVU5LLTE5MTkgOiAxIDogMAorUlUtVU5LLTE5MjAgOiAxIDogMAorUlUtVU5LLTE5MjEgOiAxIDogMAorUlUtVU5LLTE5MjIgOiAxIDogMAorUlUtVU5LLTE5MjMgOiAxIDogMAorUlUtVU5LLTE5MjQgOiAxIDogMAorUlUtVU5LLTE5MjUgOiAxIDogMAorUlUtVU5LLTE5MjYgOiAxIDogMAorUlUtVU5LLTE5MjcgOiAxIDogMAorUlUtVU5LLTE5MjggOiAxIDogMAorUlUtVU5LLTE5MjkgOiAxIDogMAorUlUtVU5LLTE5MzAgOiAxIDogMAorUlUtVU5LLTE5MzEgOiAxIDogMAorUlUtVU5LLTE5MzIgOiAxIDogMAorUlUtVU5LLTE5MzMgOiAxIDogMAorUlUtVU5LLTE5MzQgOiAxIDogMAorUlUtVU5LLTE5MzUgOiAxIDogMAorUlUtVU5LLTE5MzYgOiAxIDogMAorUlUtVU5LLTE5MzcgOiAxIDogMAorUlUtVU5LLTE5MzggOiAxIDogMAorUlUtVU5LLTE5MzkgOiAxIDogMAorUlUtVU5LLTE5NDAgOiAxIDogMAorUlUtVU5LLTE5NDEgOiAxIDogMAorUlUtVU5LLTE5NDIgOiAxIDogMAorUlUtVU5LLTE5NDMgOiAxIDogMAorUlUtVU5LLTE5NDQgOiAxIDogMAorUlUtVU5LLTE5NDUgOiAxIDogMAorUlUtVU5LLTE5NDYgOiAxIDogMAorUlUtVU5LLTE5NDcgOiAxIDogMAorUlUtVU5LLTE5NDggOiAxIDogMAorUlUtVU5LLTE5NDkgOiAxIDogMAorUlUtVU5LLTE5NTAgOiAxIDogMAorUlUtVU5LLTE5NTEgOiAxIDogMAorUlUtVU5LLTE5NTIgOiAxIDogMAorUlUtVU5LLTE5NTMgOiAxIDogMAorUlUtVU5LLTE5NTQgOiAxIDogMAorUlUtVU5LLTE5NTUgOiAxIDogMAorUlUtVU5LLTE5NTYgOiAxIDogMAorUlUtVU5LLTE5NTcgOiAxIDogMAorUlUtVU5LLTE5NTggOiAxIDogMAorUlUtVU5LLTE5NTkgOiAxIDogMAorUlUtVU5LLTE5NjAgOiAxIDogMAorUlUtVU5LLTE5NjEgOiAxIDogMAorUlUtVU5LLTE5NjIgOiAxIDogMAorUlUtVU5LLTE5NjMgOiAxIDogMAorUlUtVU5LLTE5NjQgOiAxIDogMAorUlUtVU5LLTE5NjUgOiAxIDogMAorUlUtVU5LLTE5NjYgOiAxIDogMAorUlUtVU5LLTE5NjcgOiAxIDogMAorUlUtVU5LLTE5NjggOiAxIDogMAorUlUtVU5LLTE5NjkgOiAxIDogMAorUlUtVU5LLTE5NzAgOiAxIDogMAorUlUtVU5LLTE5NzEgOiAxIDogMAorUlUtVU5LLTE5NzIgOiAxIDogMAorUlUtVU5LLTE5NzMgOiAxIDogMAorUlUtVU5LLTE5NzQgOiAxIDogMAorUlUtVU5LLTE5NzUgOiAxIDogMAorUlUtVU5LLTE5NzYgOiAxIDogMAorUlUtVU5LLTE5NzcgOiAxIDogMAorUlUtVU5LLTE5NzggOiAxIDogMAorUlUtVU5LLTE5NzkgOiAxIDogMAorUlUtVU5LLTE5ODAgOiAxIDogMAorUlUtVU5LLTE5ODEgOiAxIDogMAorUlUtVU5LLTE5ODIgOiAxIDogMAorUlUtVU5LLTE5ODMgOiAxIDogMAorUlUtVU5LLTE5ODQgOiAxIDogMAorUlUtVU5LLTE5ODUgOiAxIDogMAorUlUtVU5LLTE5ODYgOiAxIDogMAorUlUtVU5LLTE5ODcgOiAxIDogMAorUlUtVU5LLTE5ODggOiAxIDogMAorUlUtVU5LLTE5ODkgOiAxIDogMAorUlUtVU5LLTE5OTAgOiAxIDogMAorUlUtVU5LLTE5OTEgOiAxIDogMAorUlUtVU5LLTE5OTIgOiAxIDogMAorUlUtVU5LLTE5OTMgOiAxIDogMAorUlUtVU5LLTE5OTQgOiAxIDogMAorUlUtVU5LLTE5OTUgOiAxIDogMAorUlUtVU5LLTE5OTYgOiAxIDogMAorUlUtVU5LLTE5OTcgOiAxIDogMAorUlUtVU5LLTE5OTggOiAxIDogMAorUlUtVU5LLTE5OTkgOiAxIDogMAorUlUtVU5LLTIwMDAgOiAxIDogMAorUlUtVU5LLTIwMDEgOiAxIDogMAorUlUtVU5LLTIwMDIgOiAxIDogMAorUlUtVU5LLTIwMDMgOiAxIDogMAorUlUtVU5LLTIwMDQgOiAxIDogMAorUlUtVU5LLTIwMDUgOiAxIDogMAorUlUtVU5LLTIwMDYgOiAxIDogMAorUlUtVU5LLTIwMDcgOiAxIDogMAorUlUtVU5LLTIwMDggOiAxIDogMAorUlUtVU5LLTIwMDkgOiAxIDogMAorUlUtVU5LLTIwMTAgOiAxIDogMAorUlUtVU5LLTIwMTEgOiAxIDogMAorUlUtVU5LLTIwMTIgOiAxIDogMAorUlUtVU5LLTIwMTMgOiAxIDogMAorUlUtVU5LLTIwMTQgOiAxIDogMAorUlUtVU5LLTIwMTUgOiAxIDogMAorUlUtVU5LLTIwMTYgOiAxIDogMAorUlUtVU5LLTIwMTcgOiAxIDogMAorUlUtVU5LLTIwMTggOiAxIDogMAorUlUtVU5LLTIwMTkgOiAxIDogMAorUlUtVU5LLTIwMjAgOiAxIDogMAorUlUtVU5LLTIwMjEgOiAxIDogMAorUlUtVU5LLTIwMjIgOiAxIDogMAorUlUtVU5LLTIwMjMgOiAxIDogMAorUlUtVU5LLTIwMjQgOiAxIDogMAorUlUtVU5LLTIwMjUgOiAxIDogMAorUlUtVU5LLTIwMjYgOiAxIDogMAorUlUtVU5LLTIwMjcgOiAxIDogMAorUlUtVU5LLTIwMjggOiAxIDogMAorUlUtVU5LLTIwMjkgOiAxIDogMAorUlUtVU5LLTIwMzAgOiAxIDogMAorUlUtVU5LLTIwMzEgOiAxIDogMAorUlUtVU5LLTIwMzIgOiAxIDogMAorUlUtVU5LLTIwMzMgOiAxIDogMAorUlUtVU5LLTIwMzQgOiAxIDogMAorUlUtVU5LLTIwMzUgOiAxIDogMAorUlUtVU5LLTIwMzYgOiAxIDogMAorUlUtVU5LLTIwMzcgOiAxIDogMAorUlUtVU5LLTIwMzggOiAxIDogMAorUlUtVU5LLTIwMzkgOiAxIDogMAorUlUtVU5LLTIwNDAgOiAxIDogMAorUlUtVU5LLTIwNDEgOiAxIDogMAorUlUtVU5LLTIwNDIgOiAxIDogMAorUlUtVU5LLTIwNDMgOiAxIDogMAorUlUtVU5LLTIwNDQgOiAxIDogMAorUlUtVU5LLTIwNDUgOiAxIDogMAorUlUtVU5LLTIwNDYgOiAxIDogMAorUlUtVU5LLTIwNDcgOiAxIDogMAorUlUtVU5LLTIwNDggOiAxIDogMAorUlUtVU5LLTIwNDkgOiAxIDogMAorUlUtVU5LLTIwNTAgOiAxIDogMAorUlUtVU5LLTIwNTEgOiAxIDogMAorUlUtVU5LLTIwNTIgOiAxIDogMAorUlUtVU5LLTIwNTMgOiAxIDogMAorUlUtVU5LLTIwNTQgOiAxIDogMAorUlUtVU5LLTIwNTUgOiAxIDogMAorUlUtVU5LLTIwNTYgOiAxIDogMAorUlUtVU5LLTIwNTcgOiAxIDogMAorUlUtVU5LLTIwNTggOiAxIDogMAorUlUtVU5LLTIwNTkgOiAxIDogMAorUlUtVU5LLTIwNjAgOiAxIDogMAorUlUtVU5LLTIwNjEgOiAxIDogMAorUlUtVU5LLTIwNjIgOiAxIDogMAorUlUtVU5LLTIwNjMgOiAxIDogMAorUlUtVU5LLTIwNjQgOiAxIDogMAorUlUtVU5LLTIwNjUgOiAxIDogMAorUlUtVU5LLTIwNjYgOiAxIDogMAorUlUtVU5LLTIwNjcgOiAxIDogMAorUlUtVU5LLTIwNjggOiAxIDogMAorUlUtVU5LLTIwNjkgOiAxIDogMAorUlUtVU5LLTIwNzAgOiAxIDogMAorUlUtVU5LLTIwNzEgOiAxIDogMAorUlUtVU5LLTIwNzIgOiAxIDogMAorUlUtVU5LLTIwNzMgOiAxIDogMAorUlUtVU5LLTIwNzQgOiAxIDogMAorUlUtVU5LLTIwNzUgOiAxIDogMAorUlUtVU5LLTIwNzYgOiAxIDogMAorUlUtVU5LLTIwNzcgOiAxIDogMAorUlUtVU5LLTIwNzggOiAxIDogMAorUlUtVU5LLTIwNzkgOiAxIDogMAorUlUtVU5LLTIwODAgOiAxIDogMAorUlUtVU5LLTIwODEgOiAxIDogMAorUlUtVU5LLTIwODIgOiAxIDogMAorUlUtVU5LLTIwODMgOiAxIDogMAorUlUtVU5LLTIwODQgOiAxIDogMAorUlUtVU5LLTIwODUgOiAxIDogMAorUlUtVU5LLTIwODYgOiAxIDogMAorUlUtVU5LLTIwODcgOiAxIDogMAorUlUtVU5LLTIwODggOiAxIDogMAorUlUtVU5LLTIwODkgOiAxIDogMAorUlUtVU5LLTIwOTAgOiAxIDogMAorUlUtVU5LLTIwOTEgOiAxIDogMAorUlUtVU5LLTIwOTIgOiAxIDogMAorUlUtVU5LLTIwOTMgOiAxIDogMAorUlUtVU5LLTIwOTQgOiAxIDogMAorUlUtVU5LLTIwOTUgOiAxIDogMAorUlUtVU5LLTIwOTYgOiAxIDogMAorUlUtVU5LLTIwOTcgOiAxIDogMAorUlUtVU5LLTIwOTggOiAxIDogMAorUlUtVU5LLTIwOTkgOiAxIDogMAorUlUtVU5LLTIxMDAgOiAxIDogMAorUlUtVU5LLTIxMDEgOiAxIDogMAorUlUtVU5LLTIxMDIgOiAxIDogMAorUlUtVU5LLTIxMDMgOiAxIDogMAorUlUtVU5LLTIxMDQgOiAxIDogMAorUlUtVU5LLTIxMDUgOiAxIDogMAorUlUtVU5LLTIxMDYgOiAxIDogMAorUlUtVU5LLTIxMDcgOiAxIDogMAorUlUtVU5LLTIxMDggOiAxIDogMAorUlUtVU5LLTIxMDkgOiAxIDogMAorUlUtVU5LLTIxMTAgOiAxIDogMAorUlUtVU5LLTIxMTEgOiAxIDogMAorUlUtVU5LLTIxMTIgOiAxIDogMAorUlUtVU5LLTIxMTMgOiAxIDogMAorUlUtVU5LLTIxMTQgOiAxIDogMAorUlUtVU5LLTIxMTUgOiAxIDogMAorUlUtVU5LLTIxMTYgOiAxIDogMAorUlUtVU5LLTIxMTcgOiAxIDogMAorUlUtVU5LLTIxMTggOiAxIDogMAorUlUtVU5LLTIxMTkgOiAxIDogMAorUlUtVU5LLTIxMjAgOiAxIDogMAorUlUtVU5LLTIxMjEgOiAxIDogMAorUlUtVU5LLTIxMjIgOiAxIDogMAorUlUtVU5LLTIxMjMgOiAxIDogMAorUlUtVU5LLTIxMjQgOiAxIDogMAorUlUtVU5LLTIxMjUgOiAxIDogMAorUlUtVU5LLTIxMjYgOiAxIDogMAorUlUtVU5LLTIxMjcgOiAxIDogMAorUlUtVU5LLTIxMjggOiAxIDogMAorUlUtVU5LLTIxMjkgOiAxIDogMAorUlUtVU5LLTIxMzAgOiAxIDogMAorUlUtVU5LLTIxMzEgOiAxIDogMAorUlUtVU5LLTIxMzIgOiAxIDogMAorUlUtVU5LLTIxMzMgOiAxIDogMAorUlUtVU5LLTIxMzQgOiAxIDogMAorUlUtVU5LLTIxMzUgOiAxIDogMAorUlUtVU5LLTIxMzYgOiAxIDogMAorUlUtVU5LLTIxMzcgOiAxIDogMAorUlUtVU5LLTIxMzggOiAxIDogMAorUlUtVU5LLTIxMzkgOiAxIDogMAorUlUtVU5LLTIxNDAgOiAxIDogMAorUlUtVU5LLTIxNDEgOiAxIDogMAorUlUtVU5LLTIxNDIgOiAxIDogMAorUlUtVU5LLTIxNDMgOiAxIDogMAorUlUtVU5LLTIxNDQgOiAxIDogMAorUlUtVU5LLTIxNDUgOiAxIDogMAorUlUtVU5LLTIxNDYgOiAxIDogMAorUlUtVU5LLTIxNDcgOiAxIDogMAorUlUtVU5LLTIxNDggOiAxIDogMAorUlUtVU5LLTIxNDkgOiAxIDogMAorUlUtVU5LLTIxNTAgOiAxIDogMAorUlUtVU5LLTIxNTEgOiAxIDogMAorUlUtVU5LLTIxNTIgOiAxIDogMAorUlUtVU5LLTIxNTMgOiAxIDogMAorUlUtVU5LLTIxNTQgOiAxIDogMAorUlUtVU5LLTIxNTUgOiAxIDogMAorUlUtVU5LLTIxNTYgOiAxIDogMAorUlUtVU5LLTIxNTcgOiAxIDogMAorUlUtVU5LLTIxNTggOiAxIDogMAorUlUtVU5LLTIxNTkgOiAxIDogMAorUlUtVU5LLTIxNjAgOiAxIDogMAorUlUtVU5LLTIxNjEgOiAxIDogMAorUlUtVU5LLTIxNjIgOiAxIDogMAorUlUtVU5LLTIxNjMgOiAxIDogMAorUlUtVU5LLTIxNjQgOiAxIDogMAorUlUtVU5LLTIxNjUgOiAxIDogMAorUlUtVU5LLTIxNjYgOiAxIDogMAorUlUtVU5LLTIxNjcgOiAxIDogMAorUlUtVU5LLTIxNjggOiAxIDogMAorUlUtVU5LLTIxNjkgOiAxIDogMAorUlUtVU5LLTIxNzAgOiAxIDogMAorUlUtVU5LLTIxNzEgOiAxIDogMAorUlUtVU5LLTIxNzIgOiAxIDogMAorUlUtVU5LLTIxNzMgOiAxIDogMAorUlUtVU5LLTIxNzQgOiAxIDogMAorUlUtVU5LLTIxNzUgOiAxIDogMAorUlUtVU5LLTIxNzYgOiAxIDogMAorUlUtVU5LLTIxNzcgOiAxIDogMAorUlUtVU5LLTIxNzggOiAxIDogMAorUlUtVU5LLTIxNzkgOiAxIDogMAorUlUtVU5LLTIxODAgOiAxIDogMAorUlUtVU5LLTIxODEgOiAxIDogMAorUlUtVU5LLTIxODIgOiAxIDogMAorUlUtVU5LLTIxODMgOiAxIDogMAorUlUtVU5LLTIxODQgOiAxIDogMAorUlUtVU5LLTIxODUgOiAxIDogMAorUlUtVU5LLTIxODYgOiAxIDogMAorUlUtVU5LLTIxODcgOiAxIDogMAorUlUtVU5LLTIxODggOiAxIDogMAorUlUtVU5LLTIxODkgOiAxIDogMAorUlUtVU5LLTIxOTAgOiAxIDogMAorUlUtVU5LLTIxOTEgOiAxIDogMAorUlUtVU5LLTIxOTIgOiAxIDogMAorUlUtVU5LLTIxOTMgOiAxIDogMAorUlUtVU5LLTIxOTQgOiAxIDogMAorUlUtVU5LLTIxOTUgOiAxIDogMAorUlUtVU5LLTIxOTYgOiAxIDogMAorUlUtVU5LLTIxOTcgOiAxIDogMAorUlUtVU5LLTIxOTggOiAxIDogMAorUlUtVU5LLTIxOTkgOiAxIDogMAorUlUtVU5LLTIyMDAgOiAxIDogMAorUlUtVU5LLTIyMDEgOiAxIDogMAorUlUtVU5LLTIyMDIgOiAxIDogMAorUlUtVU5LLTIyMDMgOiAxIDogMAorUlUtVU5LLTIyMDQgOiAxIDogMAorUlUtVU5LLTIyMDUgOiAxIDogMAorUlUtVU5LLTIyMDYgOiAxIDogMAorUlUtVU5LLTIyMDcgOiAxIDogMAorUlUtVU5LLTIyMDggOiAxIDogMAorUlUtVU5LLTIyMDkgOiAxIDogMAorUlUtVU5LLTIyMTAgOiAxIDogMAorUlUtVU5LLTIyMTEgOiAxIDogMAorUlUtVU5LLTIyMTIgOiAxIDogMAorUlUtVU5LLTIyMTMgOiAxIDogMAorUlUtVU5LLTIyMTQgOiAxIDogMAorUlUtVU5LLTIyMTUgOiAxIDogMAorUlUtVU5LLTIyMTYgOiAxIDogMAorUlUtVU5LLTIyMTcgOiAxIDogMAorUlUtVU5LLTIyMTggOiAxIDogMAorUlUtVU5LLTIyMTkgOiAxIDogMAorUlUtVU5LLTIyMjAgOiAxIDogMAorUlUtVU5LLTIyMjEgOiAxIDogMAorUlUtVU5LLTIyMjIgOiAxIDogMAorUlUtVU5LLTIyMjMgOiAxIDogMAorUlUtVU5LLTIyMjQgOiAxIDogMAorUlUtVU5LLTIyMjUgOiAxIDogMAorUlUtVU5LLTIyMjYgOiAxIDogMAorUlUtVU5LLTIyMjcgOiAxIDogMAorUlUtVU5LLTIyMjggOiAxIDogMAorUlUtVU5LLTIyMjkgOiAxIDogMAorUlUtVU5LLTIyMzAgOiAxIDogMAorUlUtVU5LLTIyMzEgOiAxIDogMAorUlUtVU5LLTIyMzIgOiAxIDogMAorUlUtVU5LLTIyMzMgOiAxIDogMAorUlUtVU5LLTIyMzQgOiAxIDogMAorUlUtVU5LLTIyMzUgOiAxIDogMAorUlUtVU5LLTIyMzYgOiAxIDogMAorUlUtVU5LLTIyMzcgOiAxIDogMAorUlUtVU5LLTIyMzggOiAxIDogMAorUlUtVU5LLTIyMzkgOiAxIDogMAorUlUtVU5LLTIyNDAgOiAxIDogMAorUlUtVU5LLTIyNDEgOiAxIDogMAorUlUtVU5LLTIyNDIgOiAxIDogMAorUlUtVU5LLTIyNDMgOiAxIDogMAorUlUtVU5LLTIyNDQgOiAxIDogMAorUlUtVU5LLTIyNDUgOiAxIDogMAorUlUtVU5LLTIyNDYgOiAxIDogMAorUlUtVU5LLTIyNDcgOiAxIDogMAorUlUtVU5LLTIyNDggOiAxIDogMAorUlUtVU5LLTIyNDkgOiAxIDogMAorUlUtVU5LLTIyNTAgOiAxIDogMAorUlUtVU5LLTIyNTEgOiAxIDogMAorUlUtVU5LLTIyNTIgOiAxIDogMAorUlUtVU5LLTIyNTMgOiAxIDogMAorUlUtVU5LLTIyNTQgOiAxIDogMAorUlUtVU5LLTIyNTUgOiAxIDogMAorUlUtVU5LLTIyNTYgOiAxIDogMAorUlUtVU5LLTIyNTcgOiAxIDogMAorUlUtVU5LLTIyNTggOiAxIDogMAorUlUtVU5LLTIyNTkgOiAxIDogMAorUlUtVU5LLTIyNjAgOiAxIDogMAorUlUtVU5LLTIyNjEgOiAxIDogMAorUlUtVU5LLTIyNjIgOiAxIDogMAorUlUtVU5LLTIyNjMgOiAxIDogMAorUlUtVU5LLTIyNjQgOiAxIDogMAorUlUtVU5LLTIyNjUgOiAxIDogMAorUlUtVU5LLTIyNjYgOiAxIDogMAorUlUtVU5LLTIyNjcgOiAxIDogMAorUlUtVU5LLTIyNjggOiAxIDogMAorUlUtVU5LLTIyNjkgOiAxIDogMAorUlUtVU5LLTIyNzAgOiAxIDogMAorUlUtVU5LLTIyNzEgOiAxIDogMAorUlUtVU5LLTIyNzIgOiAxIDogMAorUlUtVU5LLTIyNzMgOiAxIDogMAorUlUtVU5LLTIyNzQgOiAxIDogMAorUlUtVU5LLTIyNzUgOiAxIDogMAorUlUtVU5LLTIyNzYgOiAxIDogMAorUlUtVU5LLTIyNzcgOiAxIDogMAorUlUtVU5LLTIyNzggOiAxIDogMAorUlUtVU5LLTIyNzkgOiAxIDogMAorUlUtVU5LLTIyODAgOiAxIDogMAorUlUtVU5LLTIyODEgOiAxIDogMAorUlUtVU5LLTIyODIgOiAxIDogMAorUlUtVU5LLTIyODMgOiAxIDogMAorUlUtVU5LLTIyODQgOiAxIDogMAorUlUtVU5LLTIyODUgOiAxIDogMAorUlUtVU5LLTIyODYgOiAxIDogMAorUlUtVU5LLTIyODcgOiAxIDogMAorUlUtVU5LLTIyODggOiAxIDogMAorUlUtVU5LLTIyODkgOiAxIDogMAorUlUtVU5LLTIyOTAgOiAxIDogMAorUlUtVU5LLTIyOTEgOiAxIDogMAorUlUtVU5LLTIyOTIgOiAxIDogMAorUlUtVU5LLTIyOTMgOiAxIDogMAorUlUtVU5LLTIyOTQgOiAxIDogMAorUlUtVU5LLTIyOTUgOiAxIDogMAorUlUtVU5LLTIyOTYgOiAxIDogMAorUlUtVU5LLTIyOTcgOiAxIDogMAorUlUtVU5LLTIyOTggOiAxIDogMAorUlUtVU5LLTIyOTkgOiAxIDogMAorUlUtVU5LLTIzMDAgOiAxIDogMAorUlUtVU5LLTIzMDEgOiAxIDogMAorUlUtVU5LLTIzMDIgOiAxIDogMAorUlUtVU5LLTIzMDMgOiAxIDogMAorUlUtVU5LLTIzMDQgOiAxIDogMAorUlUtVU5LLTIzMDUgOiAxIDogMAorUlUtVU5LLTIzMDYgOiAxIDogMAorUlUtVU5LLTIzMDcgOiAxIDogMAorUlUtVU5LLTIzMDggOiAxIDogMAorUlUtVU5LLTIzMDkgOiAxIDogMAorUlUtVU5LLTIzMTAgOiAxIDogMAorUlUtVU5LLTIzMTEgOiAxIDogMAorUlUtVU5LLTIzMTIgOiAxIDogMAorUlUtVU5LLTIzMTMgOiAxIDogMAorUlUtVU5LLTIzMTQgOiAxIDogMAorUlUtVU5LLTIzMTUgOiAxIDogMAorUlUtVU5LLTIzMTYgOiAxIDogMAorUlUtVU5LLTIzMTcgOiAxIDogMAorUlUtVU5LLTIzMTggOiAxIDogMAorUlUtVU5LLTIzMTkgOiAxIDogMAorUlUtVU5LLTIzMjAgOiAxIDogMAorUlUtVU5LLTIzMjEgOiAxIDogMAorUlUtVU5LLTIzMjIgOiAxIDogMAorUlUtVU5LLTIzMjMgOiAxIDogMAorUlUtVU5LLTIzMjQgOiAxIDogMAorUlUtVU5LLTIzMjUgOiAxIDogMAorUlUtVU5LLTIzMjYgOiAxIDogMAorUlUtVU5LLTIzMjcgOiAxIDogMAorUlUtVU5LLTIzMjggOiAxIDogMAorUlUtVU5LLTIzMjkgOiAxIDogMAorUlUtVU5LLTIzMzAgOiAxIDogMAorUlUtVU5LLTIzMzEgOiAxIDogMAorUlUtVU5LLTIzMzIgOiAxIDogMAorUlUtVU5LLTIzMzMgOiAxIDogMAorUlUtVU5LLTIzMzQgOiAxIDogMAorUlUtVU5LLTIzMzUgOiAxIDogMAorUlUtVU5LLTIzMzYgOiAxIDogMAorUlUtVU5LLTIzMzcgOiAxIDogMAorUlUtVU5LLTIzMzggOiAxIDogMAorUlUtVU5LLTIzMzkgOiAxIDogMAorUlUtVU5LLTIzNDAgOiAxIDogMAorUlUtVU5LLTIzNDEgOiAxIDogMAorUlUtVU5LLTIzNDIgOiAxIDogMAorUlUtVU5LLTIzNDMgOiAxIDogMAorUlUtVU5LLTIzNDQgOiAxIDogMAorUlUtVU5LLTIzNDUgOiAxIDogMAorUlUtVU5LLTIzNDYgOiAxIDogMAorUlUtVU5LLTIzNDcgOiAxIDogMAorUlUtVU5LLTIzNDggOiAxIDogMAorUlUtVU5LLTIzNDkgOiAxIDogMAorUlUtVU5LLTIzNTAgOiAxIDogMAorUlUtVU5LLTIzNTEgOiAxIDogMAorUlUtVU5LLTIzNTIgOiAxIDogMAorUlUtVU5LLTIzNTMgOiAxIDogMAorUlUtVU5LLTIzNTQgOiAxIDogMAorUlUtVU5LLTIzNTUgOiAxIDogMAorUlUtVU5LLTIzNTYgOiAxIDogMAorUlUtVU5LLTIzNTcgOiAxIDogMAorUlUtVU5LLTIzNTggOiAxIDogMAorUlUtVU5LLTIzNTkgOiAxIDogMAorUlUtVU5LLTIzNjAgOiAxIDogMAorUlUtVU5LLTIzNjEgOiAxIDogMAorUlUtVU5LLTIzNjIgOiAxIDogMAorUlUtVU5LLTIzNjMgOiAxIDogMAorUlUtVU5LLTIzNjQgOiAxIDogMAorUlUtVU5LLTIzNjUgOiAxIDogMAorUlUtVU5LLTIzNjYgOiAxIDogMAorUlUtVU5LLTIzNjcgOiAxIDogMAorUlUtVU5LLTIzNjggOiAxIDogMAorUlUtVU5LLTIzNjkgOiAxIDogMAorUlUtVU5LLTIzNzAgOiAxIDogMAorUlUtVU5LLTIzNzEgOiAxIDogMAorUlUtVU5LLTIzNzIgOiAxIDogMAorUlUtVU5LLTIzNzMgOiAxIDogMAorUlUtVU5LLTIzNzQgOiAxIDogMAorUlUtVU5LLTIzNzUgOiAxIDogMAorUlUtVU5LLTIzNzYgOiAxIDogMAorUlUtVU5LLTIzNzcgOiAxIDogMAorUlUtVU5LLTIzNzggOiAxIDogMAorUlUtVU5LLTIzNzkgOiAxIDogMAorUlUtVU5LLTIzODAgOiAxIDogMAorUlUtVU5LLTIzODEgOiAxIDogMAorUlUtVU5LLTIzODIgOiAxIDogMAorUlUtVU5LLTIzODMgOiAxIDogMAorUlUtVU5LLTIzODQgOiAxIDogMAorUlUtVU5LLTIzODUgOiAxIDogMAorUlUtVU5LLTIzODYgOiAxIDogMAorUlUtVU5LLTIzODcgOiAxIDogMAorUlUtVU5LLTIzODggOiAxIDogMAorUlUtVU5LLTIzODkgOiAxIDogMAorUlUtVU5LLTIzOTAgOiAxIDogMAorUlUtVU5LLTIzOTEgOiAxIDogMAorUlUtVU5LLTIzOTIgOiAxIDogMAorUlUtVU5LLTIzOTMgOiAxIDogMAorUlUtVU5LLTIzOTQgOiAxIDogMAorUlUtVU5LLTIzOTUgOiAxIDogMAorUlUtVU5LLTIzOTYgOiAxIDogMAorUlUtVU5LLTIzOTcgOiAxIDogMAorUlUtVU5LLTIzOTggOiAxIDogMAorUlUtVU5LLTIzOTkgOiAxIDogMAorUlUtVU5LLTI0MDAgOiAxIDogMAorUlUtVU5LLTI0MDEgOiAxIDogMAorUlUtVU5LLTI0MDIgOiAxIDogMAorUlUtVU5LLTI0MDMgOiAxIDogMAorUlUtVU5LLTI0MDQgOiAxIDogMAorUlUtVU5LLTI0MDUgOiAxIDogMAorUlUtVU5LLTI0MDYgOiAxIDogMAorUlUtVU5LLTI0MDcgOiAxIDogMAorUlUtVU5LLTI0MDggOiAxIDogMAorUlUtVU5LLTI0MDkgOiAxIDogMAorUlUtVU5LLTI0MTAgOiAxIDogMAorUlUtVU5LLTI0MTEgOiAxIDogMAorUlUtVU5LLTI0MTIgOiAxIDogMAorUlUtVU5LLTI0MTMgOiAxIDogMAorUlUtVU5LLTI0MTQgOiAxIDogMAorUlUtVU5LLTI0MTUgOiAxIDogMAorUlUtVU5LLTI0MTYgOiAxIDogMAorUlUtVU5LLTI0MTcgOiAxIDogMAorUlUtVU5LLTI0MTggOiAxIDogMAorUlUtVU5LLTI0MTkgOiAxIDogMAorUlUtVU5LLTI0MjAgOiAxIDogMAorUlUtVU5LLTI0MjEgOiAxIDogMAorUlUtVU5LLTI0MjIgOiAxIDogMAorUlUtVU5LLTI0MjMgOiAxIDogMAorUlUtVU5LLTI0MjQgOiAxIDogMAorUlUtVU5LLTI0MjUgOiAxIDogMAorUlUtVU5LLTI0MjYgOiAxIDogMAorUlUtVU5LLTI0MjcgOiAxIDogMAorUlUtVU5LLTI0MjggOiAxIDogMAorUlUtVU5LLTI0MjkgOiAxIDogMAorUlUtVU5LLTI0MzAgOiAxIDogMAorUlUtVU5LLTI0MzEgOiAxIDogMAorUlUtVU5LLTI0MzIgOiAxIDogMAorUlUtVU5LLTI0MzMgOiAxIDogMAorUlUtVU5LLTI0MzQgOiAxIDogMAorUlUtVU5LLTI0MzUgOiAxIDogMAorUlUtVU5LLTI0MzYgOiAxIDogMAorUlUtVU5LLTI0MzcgOiAxIDogMAorUlUtVU5LLTI0MzggOiAxIDogMAorUlUtVU5LLTI0MzkgOiAxIDogMAorUlUtVU5LLTI0NDAgOiAxIDogMAorUlUtVU5LLTI0NDEgOiAxIDogMAorUlUtVU5LLTI0NDIgOiAxIDogMAorUlUtVU5LLTI0NDMgOiAxIDogMAorUlUtVU5LLTI0NDQgOiAxIDogMAorUlUtVU5LLTI0NDUgOiAxIDogMAorUlUtVU5LLTI0NDYgOiAxIDogMAorUlUtVU5LLTI0NDcgOiAxIDogMAorUlUtVU5LLTI0NDggOiAxIDogMAorUlUtVU5LLTI0NDkgOiAxIDogMAorUlUtVU5LLTI0NTAgOiAxIDogMAorUlUtVU5LLTI0NTEgOiAxIDogMAorUlUtVU5LLTI0NTIgOiAxIDogMAorUlUtVU5LLTI0NTMgOiAxIDogMAorUlUtVU5LLTI0NTQgOiAxIDogMAorUlUtVU5LLTI0NTUgOiAxIDogMAorUlUtVU5LLTI0NTYgOiAxIDogMAorUlUtVU5LLTI0NTcgOiAxIDogMAorUlUtVU5LLTI0NTggOiAxIDogMAorUlUtVU5LLTI0NTkgOiAxIDogMAorUlUtVU5LLTI0NjAgOiAxIDogMAorUlUtVU5LLTI0NjEgOiAxIDogMAorUlUtVU5LLTI0NjIgOiAxIDogMAorUlUtVU5LLTI0NjMgOiAxIDogMAorUlUtVU5LLTI0NjQgOiAxIDogMAorUlUtVU5LLTI0NjUgOiAxIDogMAorUlUtVU5LLTI0NjYgOiAxIDogMAorUlUtVU5LLTI0NjcgOiAxIDogMAorUlUtVU5LLTI0NjggOiAxIDogMAorUlUtVU5LLTI0NjkgOiAxIDogMAorUlUtVU5LLTI0NzAgOiAxIDogMAorUlUtVU5LLTI0NzEgOiAxIDogMAorUlUtVU5LLTI0NzIgOiAxIDogMAorUlUtVU5LLTI0NzMgOiAxIDogMAorUlUtVU5LLTI0NzQgOiAxIDogMAorUlUtVU5LLTI0NzUgOiAxIDogMAorUlUtVU5LLTI0NzYgOiAxIDogMAorUlUtVU5LLTI0NzcgOiAxIDogMAorUlUtVU5LLTI0NzggOiAxIDogMAorUlUtVU5LLTI0NzkgOiAxIDogMAorUlUtVU5LLTI0ODAgOiAxIDogMAorUlUtVU5LLTI0ODEgOiAxIDogMAorUlUtVU5LLTI0ODIgOiAxIDogMAorUlUtVU5LLTI0ODMgOiAxIDogMAorUlUtVU5LLTI0ODQgOiAxIDogMAorUlUtVU5LLTI0ODUgOiAxIDogMAorUlUtVU5LLTI0ODYgOiAxIDogMAorUlUtVU5LLTI0ODcgOiAxIDogMAorUlUtVU5LLTI0ODggOiAxIDogMAorUlUtVU5LLTI0ODkgOiAxIDogMAorUlUtVU5LLTI0OTAgOiAxIDogMAorUlUtVU5LLTI0OTEgOiAxIDogMAorUlUtVU5LLTI0OTIgOiAxIDogMAorUlUtVU5LLTI0OTMgOiAxIDogMAorUlUtVU5LLTI0OTQgOiAxIDogMAorUlUtVU5LLTI0OTUgOiAxIDogMAorUlUtVU5LLTI0OTYgOiAxIDogMAorUlUtVU5LLTI0OTcgOiAxIDogMAorUlUtVU5LLTI0OTggOiAxIDogMAorUlUtVU5LLTI0OTkgOiAxIDogMAorUlUtVU5LLTI1MDAgOiAxIDogMAorUlUtVU5LLTI1MDEgOiAxIDogMAorUlUtVU5LLTI1MDIgOiAxIDogMAorUlUtVU5LLTI1MDMgOiAxIDogMAorUlUtVU5LLTI1MDQgOiAxIDogMAorUlUtVU5LLTI1MDUgOiAxIDogMAorUlUtVU5LLTI1MDYgOiAxIDogMAorUlUtVU5LLTI1MDcgOiAxIDogMAorUlUtVU5LLTI1MDggOiAxIDogMAorUlUtVU5LLTI1MDkgOiAxIDogMAorUlUtVU5LLTI1MTAgOiAxIDogMAorUlUtVU5LLTI1MTEgOiAxIDogMAorUlUtVU5LLTI1MTIgOiAxIDogMAorUlUtVU5LLTI1MTMgOiAxIDogMAorUlUtVU5LLTI1MTQgOiAxIDogMAorUlUtVU5LLTI1MTUgOiAxIDogMAorUlUtVU5LLTI1MTYgOiAxIDogMAorUlUtVU5LLTI1MTcgOiAxIDogMAorUlUtVU5LLTI1MTggOiAxIDogMAorUlUtVU5LLTI1MTkgOiAxIDogMAorUlUtVU5LLTI1MjAgOiAxIDogMAorUlUtVU5LLTI1MjEgOiAxIDogMAorUlUtVU5LLTI1MjIgOiAxIDogMAorUlUtVU5LLTI1MjMgOiAxIDogMAorUlUtVU5LLTI1MjQgOiAxIDogMAorUlUtVU5LLTI1MjUgOiAxIDogMAorUlUtVU5LLTI1MjYgOiAxIDogMAorUlUtVU5LLTI1MjcgOiAxIDogMAorUlUtVU5LLTI1MjggOiAxIDogMAorUlUtVU5LLTI1MjkgOiAxIDogMAorUlUtVU5LLTI1MzAgOiAxIDogMAorUlUtVU5LLTI1MzEgOiAxIDogMAorUlUtVU5LLTI1MzIgOiAxIDogMAorUlUtVU5LLTI1MzMgOiAxIDogMAorUlUtVU5LLTI1MzQgOiAxIDogMAorUlUtVU5LLTI1MzUgOiAxIDogMAorUlUtVU5LLTI1MzYgOiAxIDogMAorUlUtVU5LLTI1MzcgOiAxIDogMAorUlUtVU5LLTI1MzggOiAxIDogMAorUlUtVU5LLTI1MzkgOiAxIDogMAorUlUtVU5LLTI1NDAgOiAxIDogMAorUlUtVU5LLTI1NDEgOiAxIDogMAorUlUtVU5LLTI1NDIgOiAxIDogMAorUlUtVU5LLTI1NDMgOiAxIDogMAorUlUtVU5LLTI1NDQgOiAxIDogMAorUlUtVU5LLTI1NDUgOiAxIDogMAorUlUtVU5LLTI1NDYgOiAxIDogMAorUlUtVU5LLTI1NDcgOiAxIDogMAorUlUtVU5LLTI1NDggOiAxIDogMAorUlUtVU5LLTI1NDkgOiAxIDogMAorUlUtVU5LLTI1NTAgOiAxIDogMAorUlUtVU5LLTI1NTEgOiAxIDogMAorUlUtVU5LLTI1NTIgOiAxIDogMAorUlUtVU5LLTI1NTMgOiAxIDogMAorUlUtVU5LLTI1NTQgOiAxIDogMAorUlUtVU5LLTI1NTUgOiAxIDogMAorUlUtVU5LLTI1NTYgOiAxIDogMAorUlUtVU5LLTI1NTcgOiAxIDogMAorUlUtVU5LLTI1NTggOiAxIDogMAorUlUtVU5LLTI1NTkgOiAxIDogMAorUlUtVU5LLTI1NjAgOiAxIDogMAorUlUtVU5LLTI1NjEgOiAxIDogMAorUlUtVU5LLTI1NjIgOiAxIDogMAorUlUtVU5LLTI1NjMgOiAxIDogMAorUlUtVU5LLTI1NjQgOiAxIDogMAorUlUtVU5LLTI1NjUgOiAxIDogMAorUlUtVU5LLTI1NjYgOiAxIDogMAorUlUtVU5LLTI1NjcgOiAxIDogMAorUlUtVU5LLTI1NjggOiAxIDogMAorUlUtVU5LLTI1NjkgOiAxIDogMAorUlUtVU5LLTI1NzAgOiAxIDogMAorUlUtVU5LLTI1NzEgOiAxIDogMAorUlUtVU5LLTI1NzIgOiAxIDogMAorUlUtVU5LLTI1NzMgOiAxIDogMAorUlUtVU5LLTI1NzQgOiAxIDogMAorUlUtVU5LLTI1NzUgOiAxIDogMAorUlUtVU5LLTI1NzYgOiAxIDogMAorUlUtVU5LLTI1NzcgOiAxIDogMAorUlUtVU5LLTI1NzggOiAxIDogMAorUlUtVU5LLTI1NzkgOiAxIDogMAorUlUtVU5LLTI1ODAgOiAxIDogMAorUlUtVU5LLTI1ODEgOiAxIDogMAorUlUtVU5LLTI1ODIgOiAxIDogMAorUlUtVU5LLTI1ODMgOiAxIDogMAorUlUtVU5LLTI1ODQgOiAxIDogMAorUlUtVU5LLTI1ODUgOiAxIDogMAorUlUtVU5LLTI1ODYgOiAxIDogMAorUlUtVU5LLTI1ODcgOiAxIDogMAorUlUtVU5LLTI1ODggOiAxIDogMAorUlUtVU5LLTI1ODkgOiAxIDogMAorUlUtVU5LLTI1OTAgOiAxIDogMAorUlUtVU5LLTI1OTEgOiAxIDogMAorUlUtVU5LLTI1OTIgOiAxIDogMAorUlUtVU5LLTI1OTMgOiAxIDogMAorUlUtVU5LLTI1OTQgOiAxIDogMAorUlUtVU5LLTI1OTUgOiAxIDogMAorUlUtVU5LLTI1OTYgOiAxIDogMAorUlUtVU5LLTI1OTcgOiAxIDogMAorUlUtVU5LLTI1OTggOiAxIDogMAorUlUtVU5LLTI1OTkgOiAxIDogMAorUlUtVU5LLTI2MDAgOiAxIDogMAorUlUtVU5LLTI2MDEgOiAxIDogMAorUlUtVU5LLTI2MDIgOiAxIDogMAorUlUtVU5LLTI2MDMgOiAxIDogMAorUlUtVU5LLTI2MDQgOiAxIDogMAorUlUtVU5LLTI2MDUgOiAxIDogMAorUlUtVU5LLTI2MDYgOiAxIDogMAorUlUtVU5LLTI2MDcgOiAxIDogMAorUlUtVU5LLTI2MDggOiAxIDogMAorUlUtVU5LLTI2MDkgOiAxIDogMAorUlUtVU5LLTI2MTAgOiAxIDogMAorUlUtVU5LLTI2MTEgOiAxIDogMAorUlUtVU5LLTI2MTIgOiAxIDogMAorUlUtVU5LLTI2MTMgOiAxIDogMAorUlUtVU5LLTI2MTQgOiAxIDogMAorUlUtVU5LLTI2MTUgOiAxIDogMAorUlUtVU5LLTI2MTYgOiAxIDogMAorUlUtVU5LLTI2MTcgOiAxIDogMAorUlUtVU5LLTI2MTggOiAxIDogMAorUlUtVU5LLTI2MTkgOiAxIDogMAorUlUtVU5LLTI2MjAgOiAxIDogMAorUlUtVU5LLTI2MjEgOiAxIDogMAorUlUtVU5LLTI2MjIgOiAxIDogMAorUlUtVU5LLTI2MjMgOiAxIDogMAorUlUtVU5LLTI2MjQgOiAxIDogMAorUlUtVU5LLTI2MjUgOiAxIDogMAorUlUtVU5LLTI2MjYgOiAxIDogMAorUlUtVU5LLTI2MjcgOiAxIDogMAorUlUtVU5LLTI2MjggOiAxIDogMAorUlUtVU5LLTI2MjkgOiAxIDogMAorUlUtVU5LLTI2MzAgOiAxIDogMAorUlUtVU5LLTI2MzEgOiAxIDogMAorUlUtVU5LLTI2MzIgOiAxIDogMAorUlUtVU5LLTI2MzMgOiAxIDogMAorUlUtVU5LLTI2MzQgOiAxIDogMAorUlUtVU5LLTI2MzUgOiAxIDogMAorUlUtVU5LLTI2MzYgOiAxIDogMAorUlUtVU5LLTI2MzcgOiAxIDogMAorUlUtVU5LLTI2MzggOiAxIDogMAorUlUtVU5LLTI2MzkgOiAxIDogMAorUlUtVU5LLTI2NDAgOiAxIDogMAorUlUtVU5LLTI2NDEgOiAxIDogMAorUlUtVU5LLTI2NDIgOiAxIDogMAorUlUtVU5LLTI2NDMgOiAxIDogMAorUlUtVU5LLTI2NDQgOiAxIDogMAorUlUtVU5LLTI2NDUgOiAxIDogMAorUlUtVU5LLTI2NDYgOiAxIDogMAorUlUtVU5LLTI2NDcgOiAxIDogMAorUlUtVU5LLTI2NDggOiAxIDogMAorUlUtVU5LLTI2NDkgOiAxIDogMAorUlUtVU5LLTI2NTAgOiAxIDogMAorUlUtVU5LLTI2NTEgOiAxIDogMAorUlUtVU5LLTI2NTIgOiAxIDogMAorUlUtVU5LLTI2NTMgOiAxIDogMAorUlUtVU5LLTI2NTQgOiAxIDogMAorUlUtVU5LLTI2NTUgOiAxIDogMAorUlUtVU5LLTI2NTYgOiAxIDogMAorUlUtVU5LLTI2NTcgOiAxIDogMAorUlUtVU5LLTI2NTggOiAxIDogMAorUlUtVU5LLTI2NTkgOiAxIDogMAorUlUtVU5LLTI2NjAgOiAxIDogMAorUlUtVU5LLTI2NjEgOiAxIDogMAorUlUtVU5LLTI2NjIgOiAxIDogMAorUlUtVU5LLTI2NjMgOiAxIDogMAorUlUtVU5LLTI2NjQgOiAxIDogMAorUlUtVU5LLTI2NjUgOiAxIDogMAorUlUtVU5LLTI2NjYgOiAxIDogMAorUlUtVU5LLTI2NjcgOiAxIDogMAorUlUtVU5LLTI2NjggOiAxIDogMAorUlUtVU5LLTI2NjkgOiAxIDogMAorUlUtVU5LLTI2NzAgOiAxIDogMAorUlUtVU5LLTI2NzEgOiAxIDogMAorUlUtVU5LLTI2NzIgOiAxIDogMAorUlUtVU5LLTI2NzMgOiAxIDogMAorUlUtVU5LLTI2NzQgOiAxIDogMAorUlUtVU5LLTI2NzUgOiAxIDogMAorUlUtVU5LLTI2NzYgOiAxIDogMAorUlUtVU5LLTI2NzcgOiAxIDogMAorUlUtVU5LLTI2NzggOiAxIDogMAorUlUtVU5LLTI2NzkgOiAxIDogMAorUlUtVU5LLTI2ODAgOiAxIDogMAorUlUtVU5LLTI2ODEgOiAxIDogMAorUlUtVU5LLTI2ODIgOiAxIDogMAorUlUtVU5LLTI2ODMgOiAxIDogMAorUlUtVU5LLTI2ODQgOiAxIDogMAorUlUtVU5LLTI2ODUgOiAxIDogMAorUlUtVU5LLTI2ODYgOiAxIDogMAorUlUtVU5LLTI2ODcgOiAxIDogMAorUlUtVU5LLTI2ODggOiAxIDogMAorUlUtVU5LLTI2ODkgOiAxIDogMAorUlUtVU5LLTI2OTAgOiAxIDogMAorUlUtVU5LLTI2OTEgOiAxIDogMAorUlUtVU5LLTI2OTIgOiAxIDogMAorUlUtVU5LLTI2OTMgOiAxIDogMAorUlUtVU5LLTI2OTQgOiAxIDogMAorUlUtVU5LLTI2OTUgOiAxIDogMAorUlUtVU5LLTI2OTYgOiAxIDogMAorUlUtVU5LLTI2OTcgOiAxIDogMAorUlUtVU5LLTI2OTggOiAxIDogMAorUlUtVU5LLTI2OTkgOiAxIDogMAorUlUtVU5LLTI3MDAgOiAxIDogMAorUlUtVU5LLTI3MDEgOiAxIDogMAorUlUtVU5LLTI3MDIgOiAxIDogMAorUlUtVU5LLTI3MDMgOiAxIDogMAorUlUtVU5LLTI3MDQgOiAxIDogMAorUlUtVU5LLTI3MDUgOiAxIDogMAorUlUtVU5LLTI3MDYgOiAxIDogMAorUlUtVU5LLTI3MDcgOiAxIDogMAorUlUtVU5LLTI3MDggOiAxIDogMAorUlUtVU5LLTI3MDkgOiAxIDogMAorUlUtVU5LLTI3MTAgOiAxIDogMAorUlUtVU5LLTI3MTEgOiAxIDogMAorUlUtVU5LLTI3MTIgOiAxIDogMAorUlUtVU5LLTI3MTMgOiAxIDogMAorUlUtVU5LLTI3MTQgOiAxIDogMAorUlUtVU5LLTI3MTUgOiAxIDogMAorUlUtVU5LLTI3MTYgOiAxIDogMAorUlUtVU5LLTI3MTcgOiAxIDogMAorUlUtVU5LLTI3MTggOiAxIDogMAorUlUtVU5LLTI3MTkgOiAxIDogMAorUlUtVU5LLTI3MjAgOiAxIDogMAorUlUtVU5LLTI3MjEgOiAxIDogMAorUlUtVU5LLTI3MjIgOiAxIDogMAorUlUtVU5LLTI3MjMgOiAxIDogMAorUlUtVU5LLTI3MjQgOiAxIDogMAorUlUtVU5LLTI3MjUgOiAxIDogMAorUlUtVU5LLTI3MjYgOiAxIDogMAorUlUtVU5LLTI3MjcgOiAxIDogMAorUlUtVU5LLTI3MjggOiAxIDogMAorUlUtVU5LLTI3MjkgOiAxIDogMAorUlUtVU5LLTI3MzAgOiAxIDogMAorUlUtVU5LLTI3MzEgOiAxIDogMAorUlUtVU5LLTI3MzIgOiAxIDogMAorUlUtVU5LLTI3MzMgOiAxIDogMAorUlUtVU5LLTI3MzQgOiAxIDogMAorUlUtVU5LLTI3MzUgOiAxIDogMAorUlUtVU5LLTI3MzYgOiAxIDogMAorUlUtVU5LLTI3MzcgOiAxIDogMAorUlUtVU5LLTI3MzggOiAxIDogMAorUlUtVU5LLTI3MzkgOiAxIDogMAorUlUtVU5LLTI3NDAgOiAxIDogMAorUlUtVU5LLTI3NDEgOiAxIDogMAorUlUtVU5LLTI3NDIgOiAxIDogMAorUlUtVU5LLTI3NDMgOiAxIDogMAorUlUtVU5LLTI3NDQgOiAxIDogMAorUlUtVU5LLTI3NDUgOiAxIDogMAorUlUtVU5LLTI3NDYgOiAxIDogMAorUlUtVU5LLTI3NDcgOiAxIDogMAorUlUtVU5LLTI3NDggOiAxIDogMAorUlUtVU5LLTI3NDkgOiAxIDogMAorUlUtVU5LLTI3NTAgOiAxIDogMAorUlUtVU5LLTI3NTEgOiAxIDogMAorUlUtVU5LLTI3NTIgOiAxIDogMAorUlUtVU5LLTI3NTMgOiAxIDogMAorUlUtVU5LLTI3NTQgOiAxIDogMAorUlUtVU5LLTI3NTUgOiAxIDogMAorUlUtVU5LLTI3NTYgOiAxIDogMAorUlUtVU5LLTI3NTcgOiAxIDogMAorUlUtVU5LLTI3NTggOiAxIDogMAorUlUtVU5LLTI3NTkgOiAxIDogMAorUlUtVU5LLTI3NjAgOiAxIDogMAorUlUtVU5LLTI3NjEgOiAxIDogMAorUlUtVU5LLTI3NjIgOiAxIDogMAorUlUtVU5LLTI3NjMgOiAxIDogMAorUlUtVU5LLTI3NjQgOiAxIDogMAorUlUtVU5LLTI3NjUgOiAxIDogMAorUlUtVU5LLTI3NjYgOiAxIDogMAorUlUtVU5LLTI3NjcgOiAxIDogMAorUlUtVU5LLTI3NjggOiAxIDogMAorUlUtVU5LLTI3NjkgOiAxIDogMAorUlUtVU5LLTI3NzAgOiAxIDogMAorUlUtVU5LLTI3NzEgOiAxIDogMAorUlUtVU5LLTI3NzIgOiAxIDogMAorUlUtVU5LLTI3NzMgOiAxIDogMAorUlUtVU5LLTI3NzQgOiAxIDogMAorUlUtVU5LLTI3NzUgOiAxIDogMAorUlUtVU5LLTI3NzYgOiAxIDogMAorUlUtVU5LLTI3NzcgOiAxIDogMAorUlUtVU5LLTI3NzggOiAxIDogMAorUlUtVU5LLTI3NzkgOiAxIDogMAorUlUtVU5LLTI3ODAgOiAxIDogMAorUlUtVU5LLTI3ODEgOiAxIDogMAorUlUtVU5LLTI3ODIgOiAxIDogMAorUlUtVU5LLTI3ODMgOiAxIDogMAorUlUtVU5LLTI3ODQgOiAxIDogMAorUlUtVU5LLTI3ODUgOiAxIDogMAorUlUtVU5LLTI3ODYgOiAxIDogMAorUlUtVU5LLTI3ODcgOiAxIDogMAorUlUtVU5LLTI3ODggOiAxIDogMAorUlUtVU5LLTI3ODkgOiAxIDogMAorUlUtVU5LLTI3OTAgOiAxIDogMAorUlUtVU5LLTI3OTEgOiAxIDogMAorUlUtVU5LLTI3OTIgOiAxIDogMAorUlUtVU5LLTI3OTMgOiAxIDogMAorUlUtVU5LLTI3OTQgOiAxIDogMAorUlUtVU5LLTI3OTUgOiAxIDogMAorUlUtVU5LLTI3OTYgOiAxIDogMAorUlUtVU5LLTI3OTcgOiAxIDogMAorUlUtVU5LLTI3OTggOiAxIDogMAorUlUtVU5LLTI3OTkgOiAxIDogMAorUlUtVU5LLTI4MDAgOiAxIDogMAorUlUtVU5LLTI4MDEgOiAxIDogMAorUlUtVU5LLTI4MDIgOiAxIDogMAorUlUtVU5LLTI4MDMgOiAxIDogMAorUlUtVU5LLTI4MDQgOiAxIDogMAorUlUtVU5LLTI4MDUgOiAxIDogMAorUlUtVU5LLTI4MDYgOiAxIDogMAorUlUtVU5LLTI4MDcgOiAxIDogMAorUlUtVU5LLTI4MDggOiAxIDogMAorUlUtVU5LLTI4MDkgOiAxIDogMAorUlUtVU5LLTI4MTAgOiAxIDogMAorUlUtVU5LLTI4MTEgOiAxIDogMAorUlUtVU5LLTI4MTIgOiAxIDogMAorUlUtVU5LLTI4MTMgOiAxIDogMAorUlUtVU5LLTI4MTQgOiAxIDogMAorUlUtVU5LLTI4MTUgOiAxIDogMAorUlUtVU5LLTI4MTYgOiAxIDogMAorUlUtVU5LLTI4MTcgOiAxIDogMAorUlUtVU5LLTI4MTggOiAxIDogMAorUlUtVU5LLTI4MTkgOiAxIDogMAorUlUtVU5LLTI4MjAgOiAxIDogMAorUlUtVU5LLTI4MjEgOiAxIDogMAorUlUtVU5LLTI4MjIgOiAxIDogMAorUlUtVU5LLTI4MjMgOiAxIDogMAorUlUtVU5LLTI4MjQgOiAxIDogMAorTW91cm1hbnNrYe9hIG9ibGFzdDtQZWNoZW5nc2tpeSA6IDEgOiA1NDk5MQorTmVuZXRza2kgbmF0aW9uYWwgb2tyb3VnO05lbmV0c2t5IG5hdC4gb2tyb3VnIDogMSA6IDIyMTk2CitNb3VybWFuc2th72Egb2JsYXN0O0tvbHNraXkgOiAxIDogNjkxMTgKK01vdXJtYW5za2HvYSBvYmxhc3Q7U2V2ZXJvbW9yc2sgOiAxIDogOTEzMDMKK01vdXJtYW5za2HvYSBvYmxhc3Q7UG9seWFybnlpIDogMSA6IDI2NjQyCitNb3VybWFuc2th72Egb2JsYXN0O011cm1hbnNrIDogMSA6IDQzNTY1OQorTW91cm1hbnNrYe9hIG9ibGFzdDtMb3ZvemVyc2tpeSA6IDEgOiAxNjg3NgorS29taTtWb3JrdXRhIDogMSA6IDIwNDg3OQorTW91cm1hbnNrYe9hIG9ibGFzdDtPbGVuZWdvcnNrIDogMSA6IDQ0MDg3CitNb3VybWFuc2th72Egb2JsYXN0O01vbmNoZWdvcnNrIDogMSA6IDcxMDE0CitNb3VybWFuc2th72Egb2JsYXN0O0tvdmRvcnNraXkgOiAxIDogMzM5NDMKK01vdXJtYW5za2HvYSBvYmxhc3Q7S2lyb3ZzayA6IDEgOiA0NTAzNQorTW91cm1hbnNrYe9hIG9ibGFzdDtBcGF0aXR5IDogMSA6IDgwMTE2CitOZW5ldHNraSBuYXRpb25hbCBva3JvdWc7TmFyeWFuLU1hciA6IDEgOiAyNjk4MAorTW91cm1hbnNrYe9hIG9ibGFzdDtLYW5kYWxha3NoYSA6IDEgOiA3Mzg1OAorTW91cm1hbnNrYe9hIG9ibGFzdDtQb2x5YXJuaXllIFpvcnkgOiAxIDogMjQwODIKK01vdXJtYW5za2HvYSBvYmxhc3Q7VGVyc2tpeSA6IDEgOiA5NTc2CitLb21pO1VzdC1Uc2lsZW1za2l5IDogMSA6IDE2NzMzCitLb21pO1VzaW5za2l5IDogMSA6IDE3MzE2CitLb21pO0ludGEgOiAxIDogNjc5MDQKK0thcmVsaWE7TG91a2hza2l5IDogMSA6IDI0NjIxCitBcmtoYW5nZWxza2HvYSBvYmxhc3QgculzO01lemVuc2tpeSA6IDEgOiAxNzYwNworS29taTtJemhlbXNraXkgOiAxIDogMjM2NDAKK0tvbWk7VXNpbnNrIDogMSA6IDUwNjg1CitLYXJlbGlhO0tlbXNraXkgOiAxIDogNzAyMAorQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztQcmltb3Jza2l5IDogMSA6IDMyNzU1CitLb21pO1BlY2hvcnNraXkgOiAxIDogMjY3NTMKK0thcmVsaWE7S2FsZXZhbHNraXkgOiAxIDogMTE3NjcKK0Fya2hhbmdlbHNrYe9hIG9ibGFzdCBy6XM7TGVzaHVrb25za2l5IDogMSA6IDE1NzM4CitBcmtoYW5nZWxza2HvYSBvYmxhc3QgculzO1BpbmV6aHNraXkgOiAxIDogNDEwMTgKK0Fya2hhbmdlbHNrYe9hIG9ibGFzdCBy6XM7U29sb3ZldHNraXkgOiAxIDogMTQ3NQorS29taTtQZWNob3JhIDogMSA6IDY0MDEzCitLYXJlbGlhO0tlbScgOiAxIDogMTgzOTEKK0thcmVsaWE7QmVsb21vcnNraXkgOiAxIDogMjk3NjIKK0tvbWk7VWRvcnNraXkgOiAxIDogMjEyMDgKK1JVLVVOSy0yODI1IDogMSA6IDcyOTYKK1JVLVVOSy0yODI2IDogMSA6IDcyOTYKK0Fya2hhbmdlbHNrYe9hIG9ibGFzdCBy6XM7S2hvbG1vZ29yc2tpeSA6IDEgOiAzNTMxMworS2FyZWxpYTtLb3N0b211a3NoYSA6IDEgOiAzMjgyOAorQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztBcmtoYW5nZWxzayA6IDEgOiA0MTI1MzcKK0Fya2hhbmdlbHNrYe9hIG9ibGFzdCBy6XM7U2V2ZXJvZHZpbnNrIDogMSA6IDI0ODg2MAorQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztPbmV6aHNraXkgOiAxIDogMjE4MzcKK0tvbWk7S255YXpocG9nb3N0c2tpeSA6IDEgOiAzNTAyMgorS2FyZWxpYTtNdXllemVyc2tpeSA6IDEgOiAyMDI3MAorS29taTtTb3Nub2dvcnNraXkgOiAxIDogMzAyNTUKK0tvbWk7VWtodGEgOiAxIDogMTM3NjU2CitBcmtoYW5nZWxza2HvYSBvYmxhc3QgculzO05vdm9kdmluc2sgOiAxIDogNDg4ODcKK0thcmVsaWE7U2VnZXpoc2tpeSA6IDEgOiAxNzQwMworQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztQbGVzZXRza2l5IDogMSA6IDc5NDc4CitBcmtoYW5nZWxza2HvYSBvYmxhc3QgculzO09uZWdhIDogMSA6IDI1NjczCitLb21pO1Z1a3R5bHNraXkgOiAxIDogMTg0ODQKK0thcmVsaWE7TWVkdmV6aHllZ29yc2tpeSA6IDEgOiA0NTk3OAorS2FyZWxpYTtTZWdlemhhIDogMSA6IDM3Mjc3CitLb21pO1Ryb2l0c2tvLVBlY2hvcnNraXkgOiAxIDogMjQ2MTMKK0Fya2hhbmdlbHNrYe9hIG9ibGFzdCBy6XM7Vmlub2dyYWRvdnNraXkgOiAxIDogMjQzOTQKK0tvbWk7U29zbm9nb3JzayA6IDEgOiAzMDI1NQorQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztWZXJraG5ldG95ZW1za2l5IDogMSA6IDI3MjQ3CitLYXJlbGlhO1N1b3lhcnZza2l5IDogMSA6IDI2MjAzCitLYXJlbGlhO0tvbmRvcG96aHNraXkgOiAxIDogMTEyNzIKK0tvbWk7S29ydGtlcm9zc2tpeSA6IDEgOiAyNjU1OAorQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztMZW5za2l5IDogMSA6IDE5NzcxCitLYXJlbGlhO1B1ZG96aHNraXkgOiAxIDogMzEyNDYKK0tvbWk7VXN0LVZ5bXNraXkgOiAxIDogMzk0OTcKK0tvbWk7VXN0LUt1bG9tc2tpeSA6IDEgOiAzODQyNworQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztTaGVua3Vyc2tpeSA6IDEgOiAyMjEzMgorQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztOeWFuZG9tc2tpeSA6IDEgOiAzOTQ0NAorQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztLcmFzbm9ib3Jza2l5IDogMSA6IDIwMTY1CitLYXJlbGlhO0tvbmRvcG9nYSA6IDEgOiAzNzA3OQorS2FyZWxpYTtTb3J0YXZhbGEgOiAxIDogMzc1NzQKK0tvbWk7U3lrdHl2ZGluc2tpeSA6IDEgOiAyNzQzNAorQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztLYXJnYXBvbHNraXkgOiAxIDogMjU5NjgKK0thcmVsaWE7UHJ5YXpoaW5za2l5IDogMSA6IDIyMjQ4CitLYXJlbGlhO1ByaW9uZXpoc2tpeSA6IDEgOiAyNDQyMworQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztWZWxza2l5IDogMSA6IDY5OTM2CitLYXJlbGlhO1BpdGt5YXJhbnRza2l5IDogMSA6IDEyODU0CitBcmtoYW5nZWxza2HvYSBvYmxhc3QgculzO1VzdHlhbnNraXkgOiAxIDogNDM4NzAKK0Fya2hhbmdlbHNrYe9hIG9ibGFzdCBy6XM7S290bGFzc2tpeSA6IDEgOiAzMDA5OQorS29taTtTeWt0eXZrdmFyIDogMSA6IDIzNDY0OAorS2FyZWxpYTtQZXRyb3phdm9kc2sgOiAxIDogMjc2NDY0CitLYXJlbGlhO0xha2hkZW5wb2toc2tpeSA6IDEgOiAxOTQ3OQorQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztWaWxlZ29kc2tpeSA6IDEgOiAxNjQyNworS2FyZWxpYTtQeXRraWFyYW50YSA6IDEgOiAxNDczMworVm9sb2dvZHNrYe9hIG9ibGFzdDtWeXRlZ29yc2tpeSA6IDEgOiAzNzI1NworS29taTtTeXNvbHNraXkgOiAxIDogMTg3NzYKK0thcmVsaWE7T2xvbmV0c2tpeSA6IDEgOiAzMDU1MworQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztLb25vc2hza2l5IDogMSA6IDM5MTQ5CitBcmtoYW5nZWxza2HvYSBvYmxhc3QgculzO0tvcnlhemhtYSA6IDEgOiA0Mjg4NworQXJraGFuZ2Vsc2th72Egb2JsYXN0IHLpcztLb3RsYXMgOiAxIDogODIyMzIKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7VmVsaWtvdXN0eXVnc2tpeSA6IDEgOiAyNjE5OQorS29taTtQcmlsdXpza2l5IDogMSA6IDI4MTE1CitWb2xvZ29kc2th72Egb2JsYXN0O1Rhcm5vZ3NraXkgOiAxIDogMTc1MzMKK0tvbWk7S295Z29yb2Rza2l5IDogMSA6IDExNzcxCitWb2xvZ29kc2th72Egb2JsYXN0O055dWtzZW5za2l5IDogMSA6IDEzNjQ3CitWb2xvZ29kc2th72Egb2JsYXN0O1Zlcmtob3Zhemhza2l5IDogMSA6IDE4MzI5CitWb2xvZ29kc2th72Egb2JsYXN0O0tpcmlsbG92c2tpeSA6IDEgOiAyMTYxNworVm9sb2dvZHNrYe9hIG9ibGFzdDtWZWxpa2l5IFVzdHl1ZyA6IDEgOiA0NzYxNworVm9sb2dvZHNrYe9hIG9ibGFzdDtWb3poZWdvZHNraXkgOiAxIDogMjIwMTUKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7VmFzaGtpbnNraXkgOiAxIDogMTE5NTQKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7QmVsb3plcnNraXkgOiAxIDogMjQzMDYKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7QmFiYXlldnNraXkgOiAxIDogMjg2OTAKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7S2ljaG1lbmdza28gR29yb2RldHNraXkgOiAxIDogMjYxOTkKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7S2hhcm92c2tpeSA6IDEgOiAyNDYwNQorVm9sb2dvZHNrYe9hIG9ibGFzdDtUb3RlbXNraXkgOiAxIDogMjc4OTMKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7U3lhbXpoZW5za2l5IDogMSA6IDEyMzUyCitWb2xvZ29kc2th72Egb2JsYXN0O1VjdC1LdWJpbnNraXkgOiAxIDogMTA4NTgKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7QmFidXNoa2luc2tpeSA6IDEgOiAxNzczMgorVm9sb2dvZHNrYe9hIG9ibGFzdDtOaWtvbHNraXkgOiAxIDogMzExODAKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7Vm9sb2dvZHNraXkgOiAxIDogNTcxODAKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7U29rb2xza2l5IDogMSA6IDE3NTMzCitWb2xvZ29kc2th72Egb2JsYXN0O0thZHV5c2tpeSA6IDEgOiAyMDEyMworVm9sb2dvZHNrYe9hIG9ibGFzdDtDaGVyZXBvdmV0c2tpeSA6IDEgOiA0NzExOQorVm9sb2dvZHNrYe9hIG9ibGFzdDtTaGVrc25pbnNraXkgOiAxIDogMzQyNjgKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7TWV6aGR1cmVjaGVuc2tpeSA6IDEgOiA5NDY0CitWb2xvZ29kc2th72Egb2JsYXN0O1Nva29sIDogMSA6IDQ2OTE5CitWb2xvZ29kc2th72Egb2JsYXN0O0NoYWdvZGVzY2hlbnNraXkgOiAxIDogMTc2MzIKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7Vm9sb2dkYSA6IDEgOiAyOTY2NTkKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7VXN0eXV6aGVuc2tpeSA6IDEgOiAyMjkxMgorVm9sb2dvZHNrYe9hIG9ibGFzdDtDaGVyZXBvdmV0eiA6IDEgOiAzMTY2ODIKK1ZvbG9nb2Rza2HvYSBvYmxhc3Q7R3J5YXpvdmV0c2tpeSA6IDEgOiA0NTkyMworUlUtVU5LLTI4MjcgOiAxIDogNzI5NgorUlUtVU5LLTI4MjggOiAxIDogNzI5NgorVGFtYm92c2th72Egb2JsYXN0O01vcnNoYW5za2l5IDogMSA6IDQ0Mzc4CitMaXBldHNrYe9hIG9ibGFzdDtDaGFwbHlnaW5za2l5IDogMSA6IDM5NDk0CitMaXBldHNrYe9hIG9ibGFzdDtEYW5rb3Zza2l5IDogMSA6IDE5Mjk1CitUYW1ib3Zza2HvYSBvYmxhc3Q7U3Rhcm95dXJ5ZXZza2l5IDogMSA6IDIxMDQyCitUYW1ib3Zza2HvYSBvYmxhc3Q7U29zbm92c2tpeSA6IDEgOiA0NjE3MworVGFtYm92c2th72Egb2JsYXN0O01vcnNoYW5zayA6IDEgOiA0OTc2MworTGlwZXRza2HvYSBvYmxhc3Q7TGV2IC1Ub2xzdG92c2tpeSA6IDEgOiAxODk5MworVGFtYm92c2th72Egb2JsYXN0O1BlcnZvbWF5c2tpeSA6IDEgOiAzNTQwMworVGFtYm92c2th72Egb2JsYXN0O1BpY2hheWV2c2tpeSA6IDEgOiAxOTA0OAorTGlwZXRza2HvYSBvYmxhc3Q7RGFua292IDogMSA6IDI1MDIzCitUYW1ib3Zza2HvYSBvYmxhc3Q7TWljaHVyaW5za2l5IDogMSA6IDM4MTk1CitUYW1ib3Zza2HvYSBvYmxhc3Q7TmlraWZvcm92c2tpeSA6IDEgOiAyNjEyOAorTGlwZXRza2HvYSBvYmxhc3Q7TGViZWR5YW5za2l5IDogMSA6IDQ2NDI4CitUYW1ib3Zza2HvYSBvYmxhc3Q7Qm9uZGFyc2tpeSA6IDEgOiAxODE1MAorVGFtYm92c2th72Egb2JsYXN0O0dhdnJpbG92c2tpeSA6IDEgOiAxNTM1OAorVGFtYm92c2th72Egb2JsYXN0O1RhbWJvdnNraXkgOiAxIDogODA5NzgKK0xpcGV0c2th72Egb2JsYXN0O0tyYXNuaW5za2l5IDogMSA6IDE2NDgxCitMaXBldHNrYe9hIG9ibGFzdDtEb2Jyb3Zza2l5IDogMSA6IDI3MzM0CitMaXBldHNrYe9hIG9ibGFzdDtTdGFub3ZseWFuc2tpeSA6IDEgOiAyMTkwOAorVGFtYm92c2th72Egb2JsYXN0O01pY2h1cmluc2sgOiAxIDogMTIxMzY3CitUYW1ib3Zza2HvYSBvYmxhc3Q7S2lyc2Fub3Zza2l5IDogMSA6IDI0NTMzCitUYW1ib3Zza2HvYSBvYmxhc3Q7UmFzc2them92c2tpeSA6IDEgOiAyNTEzMQorTGlwZXRza2HvYSBvYmxhc3Q7SXptYWxrb3Zza2l5IDogMSA6IDIwMzAwCitUYW1ib3Zza2HvYSBvYmxhc3Q7VW1ldHNraXkgOiAxIDogMTQ4NTkKK0xpcGV0c2th72Egb2JsYXN0O0xpcGV0c2tpeSA6IDEgOiA0ODIzNworVGFtYm92c2th72Egb2JsYXN0O1BldHJvdnNraXkgOiAxIDogMjc4MjQKK0xpcGV0c2th72Egb2JsYXN0O1phZG9uc2tpeSA6IDEgOiAzODk5MgorTGlwZXRza2HvYSBvYmxhc3Q7WWVsZXRza2l5IDogMSA6IDM0MzY5CitUYW1ib3Zza2HvYSBvYmxhc3Q7VGFtYm92IDogMSA6IDMzNDI4MworTGlwZXRza2HvYSBvYmxhc3Q7TGlwZXRzayA6IDEgOiA1MDY4OTAKK0xpcGV0c2th72Egb2JsYXN0O0dyeWF6aW5za2l5IDogMSA6IDI1NDI1CitUYW1ib3Zza2HvYSBvYmxhc3Q7UmFzc2them92byA6IDEgOiA0OTA2NQorVGFtYm92c2th72Egb2JsYXN0O0tpcnNhbm92byA6IDEgOiAxOTk0NQorTGlwZXRza2HvYSBvYmxhc3Q7RWxldHogOiAxIDogMTE5NDg3CitUYW1ib3Zza2HvYSBvYmxhc3Q7S290b3ZzayA6IDEgOiAzOTE5MgorVGFtYm92c2th72Egb2JsYXN0O1puYW1lbnNraXkgOiAxIDogMjMwMzcKK1RhbWJvdnNrYe9hIG9ibGFzdDtJbnpoYXZpbnNraXkgOiAxIDogMzMyMDkKK0xpcGV0c2th72Egb2JsYXN0O0dyeWF6eSA6IDEgOiA0NzIzMgorTGlwZXRza2HvYSBvYmxhc3Q7RG9sZ29ydWtvdnNraXkgOiAxIDogMjM1MTYKK0xpcGV0c2th72Egb2JsYXN0O0RvYnJpbnNraXkgOiAxIDogNDMyMTIKK1RhbWJvdnNrYe9hIG9ibGFzdDtNb3Jkb3Zza2l5IDogMSA6IDI3NDI1CitUYW1ib3Zza2HvYSBvYmxhc3Q7U2FtcHVyc2tpeSA6IDEgOiAxODc0OQorVGFtYm92c2th72Egb2JsYXN0O1J6aGFrc2luc2tpeSA6IDEgOiAyNDkzMgorS291cnNrYe9hIG9ibGFzdDtaaGVsZXpub2dvcnNraXkgOiAxIDogMjE1MDkKK0tvdXJza2HvYSBvYmxhc3Q7UG9ueXJvdnNraXkgOiAxIDogMTU3ODAKK0tvdXJza2HvYSBvYmxhc3Q7RG1pdHJpeWV2c2tpeSA6IDEgOiAzMDA1MgorTGlwZXRza2HvYSBvYmxhc3Q7VXNtYW5za2l5IDogMSA6IDU2NDc3CitMaXBldHNrYe9hIG9ibGFzdDtLaGxldmVuc2tpeSA6IDEgOiAyMzgxNworS291cnNrYe9hIG9ibGFzdDtGYXRlemhza2l5IDogMSA6IDI3NDM5CitSVS1VTkstMjgyOSA6IDEgOiA5MTc2NAorTGlwZXRza2HvYSBvYmxhc3Q7VGVyYnVuc2tpeSA6IDEgOiAyNTgyNworVGFtYm92c2th72Egb2JsYXN0O1Rva2FyZXZza2l5IDogMSA6IDI1NDMwCitMaXBldHNrYe9hIG9ibGFzdDtWb2xvdnNraXkgOiAxIDogMTgzOTAKK0tvdXJza2HvYSBvYmxhc3Q7Wm9sb3R1a2hpbnNraXkgOiAxIDogMzE1NjAKK1RhbWJvdnNrYe9hIG9ibGFzdDtVdmFyb3Zza2l5IDogMSA6IDEzNzYyCitLb3Vyc2th72Egb2JsYXN0O1NjaGlncm92c2tpeSA6IDEgOiAxNzg5MAorVm9yb25lanNrYe9hIG9ibGFzdDtSYW1vbnNraXkgOiAxIDogNDIwMTYKK1RhbWJvdnNrYe9hIG9ibGFzdDtNdWNoa2Fwc2tpeSA6IDEgOiAyMDg0MworVm9yb25lanNrYe9hIG9ibGFzdDtTZW1pbHVrc2tpeSA6IDEgOiA3Mzg4MAorVGFtYm92c2th72Egb2JsYXN0O1poZXJkZXZza2l5IDogMSA6IDM4OTkzCitLb3Vyc2th72Egb2JsYXN0O0NoZXJlbWlzaW5vdnNraXkgOiAxIDogMTQ0NzMKK0tvdXJza2HvYSBvYmxhc3Q7S2hvbXV0b3Zza2l5IDogMSA6IDIwMjAyCitUYW1ib3Zza2HvYSBvYmxhc3Q7VXZhcm92byA6IDEgOiAzNTIwMworS291cnNrYe9hIG9ibGFzdDtLb255c2hldnNraXkgOiAxIDogMTg0OTMKK0tvdXJza2HvYSBvYmxhc3Q7U292ZXRza2l5IDogMSA6IDI3MTM3CitLb3Vyc2th72Egb2JsYXN0O0thc3RvcmVuc2tpeSA6IDEgOiAyODU0NAorVm9yb25lanNrYe9hIG9ibGFzdDtWZXJraG5la2hhdnNraXkgOiAxIDogMzAyNTYKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7RXJ0aWxza2l5IDogMSA6IDM2Mjg3CitLb3Vyc2th72Egb2JsYXN0O0t1cnNraXkgOiAxIDogNTEyNTkKK0tvdXJza2HvYSBvYmxhc3Q7VHNjaGlncnkgOiAxIDogMjE1MDkKK0tvdXJza2HvYSBvYmxhc3Q7S3VyY2hhdG92c2tpeSA6IDEgOiAyMzkyMQorVm9yb25lanNrYe9hIG9ibGFzdDtWb3JvbmV6aCA6IDEgOiA5NTg4MzMKK0tvdXJza2HvYSBvYmxhc3Q7T2t0eWFicnNraXkgOiAxIDogMjUwMjcKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7Tm92b3VzbWFuc2tpeSA6IDEgOiA2Nzg0OQorVm9yb25lanNrYe9hIG9ibGFzdDtQYW5pbnNraXkgOiAxIDogMzU2ODQKK0tvdXJza2HvYSBvYmxhc3Q7TCdnb3Zza3kgOiAxIDogMjI1MTQKK0tvdXJza2HvYSBvYmxhc3Q7S3Vyc2sgOiAxIDogNDM1NDAxCitLb3Vyc2th72Egb2JsYXN0O1RpbXNraXkgOiAxIDogMTY4ODUKK0tvdXJza2HvYSBvYmxhc3Q7Unlsc2tpeSA6IDEgOiA0NTgzMgorVm9yb25lanNrYe9hIG9ibGFzdDtOaXpobmVkZXZpdHNraXkgOiAxIDogMjg2NDcKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7VGVybm92c2tpeSA6IDEgOiAyOTg1NAorVm9yb25lanNrYe9hIG9ibGFzdDtHcmliYW5vdnNraXkgOiAxIDogNDI5MjEKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7Qm9yaXNvZ2xlYnNraXkgOiAxIDogMTUxNzgKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7S2hva2hvbHNraXkgOiAxIDogMzgxOTcKK0tvdXJza2HvYSBvYmxhc3Q7TGdvdiA6IDEgOiAyNTMyOAorVm9yb25lanNrYe9hIG9ibGFzdDtBbm5pbnNraXkgOiAxIDogNTY3OTIKK0tvdXJza2HvYSBvYmxhc3Q7S3VyY2hhdG92IDogMSA6IDQ1NTMwCitLb3Vyc2th72Egb2JsYXN0O1NvbG50c2V2c2tpeSA6IDEgOiAyMjIxMgorS291cnNrYe9hIG9ibGFzdDtHb3JzaGVjaGVuc2tpeSA6IDEgOiAyNTgzMQorS291cnNrYe9hIG9ibGFzdDtNZWR2ZW5za2l5IDogMSA6IDIxMjA3CitLb3Vyc2th72Egb2JsYXN0O01hbnR1cm92c2tpeSA6IDEgOiAyMDEwMgorS291cnNrYe9hIG9ibGFzdDtCb2xzaGVzb2xkYXRza2l5IDogMSA6IDE3OTkxCitLb3Vyc2th72Egb2JsYXN0O0tvcmVuZXZza2l5IDogMSA6IDIzNTE5CitLb3Vyc2th72Egb2JsYXN0O0dsdXNoa292c2tpeSA6IDEgOiAzMTM1OQorVm9yb25lanNrYe9hIG9ibGFzdDtLYXNoaXJza2l5IDogMSA6IDMwMDU1CitWb3JvbmVqc2th72Egb2JsYXN0O1Bvdm9yaW5za2l5IDogMSA6IDE4Njk2CitLb3Vyc2th72Egb2JsYXN0O1N1ZHpoYW5za2l5IDogMSA6IDM0Mzc0CitCZWxnb3JvZHNrYe9hIG9ibGFzdDtHdWJraW5za2l5IDogMSA6IDMzNjQ5CitCZWxnb3JvZHNrYe9hIG9ibGFzdDtTdGFyb29za29sc2tpeSA6IDEgOiAzMzQ0NQorVm9yb25lanNrYe9hIG9ibGFzdDtOb3Zva2hvcGVyc2tpeSA6IDEgOiA1MTA2MworVm9yb25lanNrYe9hIG9ibGFzdDtCb3Jpc29nbGVic2sgOiAxIDogNzA5NjUKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7Qm9icm92c2tpeSA6IDEgOiA1OTEwNAorS291cnNrYe9hIG9ibGFzdDtPYm95YW5za2l5IDogMSA6IDM5NTAwCitLb3Vyc2th72Egb2JsYXN0O1ByaXN0ZW5za2l5IDogMSA6IDI0MjIyCitWb3JvbmVqc2th72Egb2JsYXN0O1RhbG92c2tpeSA6IDEgOiA1MTk2NworQmVsZ29yb2Rza2HvYSBvYmxhc3Q7U3RhcnlpIE9za29sIDogMSA6IDE5Mjc5NAorVm9yb25lanNrYe9hIG9ibGFzdDtSZXBpeWV2a2EgOiAxIDogMTk3MDEKK1JVLVVOSy0yODMwIDogMSA6IDM4NTk5CitCZWxnb3JvZHNrYe9hIG9ibGFzdDtHdWJraW4gOiAxIDogODAyODgKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7TGlza2luc2tpeSA6IDEgOiA0Nzk0NworS291cnNrYe9hIG9ibGFzdDtCZWxvdnNraXkgOiAxIDogMjUxMjcKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7T3N0cm9nb3poc2tpeSA6IDEgOiAzMDg1OQorQmVsZ29yb2Rza2HvYSBvYmxhc3Q7UHJva2hvcm92c2tpeSA6IDEgOiAzMDM3NgorVm9yb25lanNrYe9hIG9ibGFzdDtQb3ZvcmlubyA6IDEgOiAxODg5NworQmVsZ29yb2Rza2HvYSBvYmxhc3Q7SXZueWFuc2tpeSA6IDEgOiAyNTE2MAorQmVsZ29yb2Rza2HvYSBvYmxhc3Q7Q2hlcm55YW5za2l5IDogMSA6IDM0NTcwCitSVS1VTkstMjgzMSA6IDEgOiAxNjg3NgorVm9yb25lanNrYe9hIG9ibGFzdDtMaXNraSA6IDEgOiA1NDg4MgorQmVsZ29yb2Rza2HvYSBvYmxhc3Q7UmFraXR5YW5za2l5IDogMSA6IDM2MzA5CitWb3JvbmVqc2th72Egb2JsYXN0O0J1dHVybGlub3Zza2l5IDogMSA6IDYwNzEyCitCZWxnb3JvZHNrYe9hIG9ibGFzdDtLb3JvY2hhbnNraXkgOiAxIDogNDE3MjkKK0JlbGdvcm9kc2th72Egb2JsYXN0O0tyYXNub3lhcnV6c2hza3kgOiAxIDogMTQ2MjYKK0JlbGdvcm9kc2th72Egb2JsYXN0O1lha292bGV2c2tpeSA6IDEgOiA0Nzg2NgorQmVsZ29yb2Rza2HvYSBvYmxhc3Q7Tm92b29za29sc2tpeSA6IDEgOiA0ODQ4MAorVm9yb25lanNrYe9hIG9ibGFzdDtPc3Ryb2dvemhzayA6IDEgOiAzNjI4NworQmVsZ29yb2Rza2HvYSBvYmxhc3Q7S3Jhc25vZ3ZhcmRleXNraXkgOiAxIDogNDc0NTcKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7Vm9yb2J5b3Zza2l5IDogMSA6IDIzNTIxCitWb3JvbmVqc2th72Egb2JsYXN0O0thbWVuc2tpeSA6IDEgOiAyMzMyMAorVm9yb25lanNrYe9hIG9ibGFzdDtQYXZsb3Zza2l5IDogMSA6IDYwMjEwCitCZWxnb3JvZHNrYe9hIG9ibGFzdDtCZWxnb3JvZHNraXkgOiAxIDogNzQxNTEKK0JlbGdvcm9kc2th72Egb2JsYXN0O0Jvcmlzb3Zza2l5IDogMSA6IDI1NDY3CitWb3JvbmVqc2th72Egb2JsYXN0O1BvZGdvcmVuc2tpeSA6IDEgOiAzMjU2OAorQmVsZ29yb2Rza2HvYSBvYmxhc3Q7QWxla3NleWV2c2tpeSA6IDEgOiAyODg0MgorQmVsZ29yb2Rza2HvYSBvYmxhc3Q7U2hlYmVraW5za2l5IDogMSA6IDQ1MDAyCitCZWxnb3JvZHNrYe9hIG9ibGFzdDtHcmFpdm9yb25za2l5IDogMSA6IDI3MzA4CitWb3JvbmVqc2th72Egb2JsYXN0O0thbGFjaGV5ZXZza2l5IDogMSA6IDY0MzMxCitCZWxnb3JvZHNrYe9hIG9ibGFzdDtBbGVrc2VldmthIDogMSA6IDM4NDU2CitCZWxnb3JvZHNrYe9hIG9ibGFzdDtCZWxnb3JvZCA6IDEgOiAzMjAyMzIKK0JlbGdvcm9kc2th72Egb2JsYXN0O1ZvbG9rb25vdnNraXkgOiAxIDogMzc4NDMKK1Zvcm9uZWpza2HvYSBvYmxhc3Q7T2xraG92YXRza2l5IDogMSA6IDI2NDM2CitWb3JvbmVqc2th72Egb2JsYXN0O1ZlcmtobmVtYW1vbnNraXkgOiAxIDogMjM1MjEKK0JlbGdvcm9kc2th72Egb2JsYXN0O1NoZWJla2lubyA6IDEgOiA0NjAyNQorQmVsZ29yb2Rza2HvYSBvYmxhc3Q7VmFsdXlza2l5IDogMSA6IDM4NjYxCitWb3JvbmVqc2th72Egb2JsYXN0O1Jvc3Nvc2hhbnNraXkgOiAxIDogMzE4NjQKK0JlbGdvcm9kc2th72Egb2JsYXN0O1ZleWRlbGV2c2tpeSA6IDEgOiAyNTg3NgorVm9yb25lanNrYe9hIG9ibGFzdDtQZXRyb3BhdmxvdnNraXkgOiAxIDogMjU2MzIKK0JlbGdvcm9kc2th72Egb2JsYXN0O1JvdmVuc2tpeSA6IDEgOiAyNTg3NgorVm9yb25lanNrYe9hIG9ibGFzdDtSb3Nzb3NoIDogMSA6IDYwNDExCitCZWxnb3JvZHNrYe9hIG9ibGFzdDtWYWx1aWt5IDogMSA6IDM1Mjg2CitWb3JvbmVqc2th72Egb2JsYXN0O0JvZ3VjaGFyc2tpeSA6IDEgOiAzNjE4NgorVm9yb25lanNrYe9hIG9ibGFzdDtLYW50ZW1pcm92c2tpeSA6IDEgOiA0MzIyMgorUlUtVU5LLTI4MzIgOiAxIDogOTE3NjQKK1JVLVVOSy0yODMzIDogMSA6IDM4NTk5CitSVS1VTkstMjgzNCA6IDEgOiAxNjg3NgorWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtBbmFiYXJza2l5IDogMSA6IDM4NDIKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7QnVsdW5za2l5IDogMSA6IDE0MDI0CitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO1VzdC1ZYW5za2l5IDogMSA6IDI5ODcyCitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO0FsbGFpa2hvdnNraXkgOiAxIDogNDk5NQorWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtPbGVuZWtza2l5IDogMSA6IDQxMzAKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7Tml6aG5la29seW1za2l5IDogMSA6IDExMjM4CitUY2hvdWtvdHNraSBuYXQuIG9rcm91ZztDaGF1bnNraXkgOiAxIDogMTkzMzIKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7VmVya2hveWFuc2tpeSA6IDEgOiAxOTU5NQorVGNob3Vrb3Rza2kgbmF0LiBva3JvdWc7U2htaWR0b3Zza2l5IDogMSA6IDk5NDAKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7U3JlZG5la29seW1za2l5IDogMSA6IDk2MDUKK1RjaG91a290c2tpIG5hdC4gb2tyb3VnO0JpbGliaW5za2l5IDogMSA6IDE4NTQ5CitSVS1VTkstMjgzNSA6IDEgOiAyODgyCitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO0FieWlza2l5IDogMSA6IDU2NjcKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7WmhpZ2Fuc2tpeSA6IDEgOiA1NDc1CitUY2hvdWtvdHNraSBuYXQuIG9rcm91ZztJdWx0aW5za2l5IDogMSA6IDk5NDAKK1RjaG91a290c2tpIG5hdC4gb2tyb3VnO0FuYWR5cnNraXkgOiAxIDogMTU0MTkKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7TW9tc2tpeSA6IDEgOiA1NTcxCitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO1ZlcmtoZWtvbHltc2tpeSA6IDEgOiA4OTMzCitUY2hvdWtvdHNraSBuYXQuIG9rcm91ZztDaHVrb3Rza2l5IDogMSA6IDQ3NzQKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7VmlseXV5c2tpeSA6IDEgOiAyNzc1OQorWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtNaXJuaW5za2l5IDogMSA6IDUwOTA4CitUY2hvdWtvdHNraSBuYXQuIG9rcm91ZztQcm92aWRlbnNraXkgOiAxIDogNjU3NAorWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtWZXJraG5ldmlseXVpc2tpeSA6IDEgOiAyMDc0NworWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtLb2J5YXlza2l5IDogMSA6IDE4MjUwCitNYWdhZGFuc2th72Egb2JsYXN0IHLpc2lkO1NyZWRuZWthbnNraXkgOiAxIDogMTEwNjEKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7VG9tcG9uc2tpeSA6IDEgOiAyMDQ1OQorWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtMZW5pbnNraXkgOiAxIDogMjg4MTYKK01hZ2FkYW5za2HvYSBvYmxhc3QgculzaWQ7U2V2ZXJvLUV2ZW5za2l5IDogMSA6IDYyNDgKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7T3lteWFrb25za2l5IDogMSA6IDI4MzM1CitNYWdhZGFuc2th72Egb2JsYXN0IHLpc2lkO09tc3VrY2hhbnNraXkgOiAxIDogMTI2NjUKK0tvcmlha3NraSBuYXRpb25hbCBva3JvdWc7UGVuemhpbnNraXkgOiAxIDogNDUwOQorVGNob3Vrb3Rza2kgbmF0LiBva3JvdWc7QW5hZHlyJyA6IDEgOiAxMTg5NworTWFnYWRhbnNrYe9hIG9ibGFzdCBy6XNpZDtTdXN1bWFuc2tpeSA6IDEgOiAzMTgzMgorVGNob3Vrb3Rza2kgbmF0LiBva3JvdWc7QmVyaW5nb3Zza2l5IDogMSA6IDU4NzAKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7U3VudGFyc2tpeSA6IDEgOiAyNjAzMAorWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtVc3QtQWxkYW5za2l5IDogMSA6IDIxNzA4CitNYWdhZGFuc2th72Egb2JsYXN0IHLpc2lkO1lhZ29kbmluc2tpeSA6IDEgOiAzNTIwOQorWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtOYW1za2l5IDogMSA6IDE4NDQyCitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO1RhdHRpbnNraXkgOiAxIDogMTY1MjEKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7R29ybnlpIDogMSA6IDEwMTgyCitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO1VzdC1NYXlza2l5IDogMSA6IDE5NDk5CitLb3JpYWtza2kgbmF0aW9uYWwgb2tyb3VnO09seXV0b3Jza2l5IDogMSA6IDEwODIyCitLaGFiYXJvdnNraSBrcmHvIHLpc2lkdWVsO09raG90c2tpeSA6IDEgOiAxODI5OQorTWFnYWRhbnNrYe9hIG9ibGFzdCBy6XNpZDtUZW5raW5za2l5IDogMSA6IDE2ODg3CitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO01pcm55IDogMSA6IDM4NTE3CitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO0NodXJhcGNoaW5za2l5IDogMSA6IDE4NTM4CitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO01lZ2luby1LYW5nYWxhc3NraXkgOiAxIDogMzEzMTMKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7WWFrdXRzayA6IDEgOiAyMjA4MjQKK01hZ2FkYW5za2HvYSBvYmxhc3QgculzaWQ7S2hhc3luc2tpeSA6IDEgOiAyMjAzNworWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtPcmR6aG9uaWtpZHpldnNraXkgOiAxIDogMzUxNTUKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7T2xla21pbnNraXkgOiAxIDogMzA0NDkKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7TGVuc2tpeSA6IDEgOiA0ODUwNgorWWFrb3V0aWEtU2FoYSByZXNwb3VibGlrYTtBbWdpbnNraXkgOiAxIDogMTYyMzMKK01hZ2FkYW5za2HvYSBvYmxhc3QgculzaWQ7T2xza2l5IDogMSA6IDE2MTI3CitZYWtvdXRpYS1TYWhhIHJlc3BvdWJsaWthO0FsZGFuc2tpeSA6IDEgOiA1OTM2MAorS29yaWFrc2tpIG5hdGlvbmFsIG9rcm91ZztLYXJhZ2luc2tpeSA6IDEgOiA4Mjk3CitLb3JpYWtza2kgbmF0aW9uYWwgb2tyb3VnO1RpZ2lsc2tpeSA6IDEgOiAxMDkxMgorTWFnYWRhbnNrYe9hIG9ibGFzdCBy6XNpZDtNYWdhZGFuIDogMSA6IDEyODkzMQorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtBeWFuby1NYXlza2l5IDogMSA6IDQ2MjQKK1lha291dGlhLVNhaGEgcmVzcG91Ymxpa2E7TmVyaXVuZ3JpIDogMSA6IDExMTIyOAorS2FtdGNoYXRza2HvYSBvYmxhc3QgculzaTtVc3QtS2FtY2hhdHNraXkgOiAxIDogMjUxMTIKK0Ftb3Vyc2th72Egb2JsYXN0O1R5bmRpbnNraXkgOiAxIDogMzAxNjkKK0thbXRjaGF0c2th72Egb2JsYXN0IHLpc2k7QnlzdHJpbnNraXkgOiAxIDogMjc4MAorS2FtdGNoYXRza2HvYSBvYmxhc3QgculzaTtNaWxrb3Zza2l5IDogMSA6IDE0OTE5CitLYW10Y2hhdHNrYe9hIG9ibGFzdCBy6XNpO1NvYm9sZXZza2l5IDogMSA6IDQ5MTEKK0toYWJhcm92c2tpIGtyYe8gculzaWR1ZWw7VHVndXJvLUNodW1pa2Fuc2tpeSA6IDEgOiAzMjQ3CitBbW91cnNrYe9hIG9ibGFzdDtaZXlza2l5IDogMSA6IDI4MTkxCitLYW10Y2hhdHNrYe9hIG9ibGFzdCBy6XNpO0FsZXV0c2tpeSA6IDEgOiAxMjA1CitBbW91cnNrYe9hIG9ibGFzdDtUeW5kYSA6IDEgOiA1Njc3OAorS2FtdGNoYXRza2HvYSBvYmxhc3QgculzaTtZZWxpem92c2tpeSA6IDEgOiAyNjQxMAorQW1vdXJza2HvYSBvYmxhc3Q7U2tvdm9yb2RpbnNraXkgOiAxIDogNDE5NDAKK1Nha2hhbGluc2th72Egb2JsYXN0O09raGluc2tpeSA6IDEgOiAxNjk1NQorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtOaWtvbGF5ZXZza2l5IDogMSA6IDE5OTcxCitBbW91cnNrYe9hIG9ibGFzdDtNYWdkYWdhY2hpbnNraXkgOiAxIDogMzM5MjgKK0Ftb3Vyc2th72Egb2JsYXN0O1NlbGVtZHpoaW5za2l5IDogMSA6IDE5NzgzCitBbW91cnNrYe9hIG9ibGFzdDtaZXlhIDogMSA6IDMyMzQ2CitLYW10Y2hhdHNrYe9hIG9ibGFzdCBy6XNpO1VzdC1Cb2xzaGVyZXRza2l5IDogMSA6IDEyNjk1CitLaGFiYXJvdnNraSBrcmHvIHLpc2lkdWVsO1BvbGlueSBPc2lwZW5rby4gaW1lbmkgOiAxIDogODA2NworU2FraGFsaW5za2HvYSBvYmxhc3Q7T2toYSA6IDEgOiAzNDM3OQorQW1vdXJza2HvYSBvYmxhc3Q7TWF6YW5vdnNraXkgOiAxIDogMjExNjgKK0toYWJhcm92c2tpIGtyYe8gculzaWR1ZWw7VWxjaHNraXkgOiAxIDogMjkyMTkKK0thbXRjaGF0c2th72Egb2JsYXN0IHLpc2k7RWxpem92byA6IDEgOiA0NDI5NAorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtOaWtvbGF5ZXZzay1OYS1BbXVyZSA6IDEgOiAzNjAwNworS2FtdGNoYXRza2HvYSBvYmxhc3QgculzaTtQZXRyb3BhdmxvdnNrLUthbWNoYXRzayA6IDEgOiAyNjA2NjYKK0Ftb3Vyc2th72Egb2JsYXN0O1NoaW1hbm92c2tpeSA6IDEgOiA5NDk2CitTYWtoYWxpbnNrYe9hIG9ibGFzdDtOb2dsaWtza2l5IDogMSA6IDE1ODMxCitLaGFiYXJvdnNraSBrcmHvIHLpc2lkdWVsO1ZlcmtobmVidXJlaW5za2l5IDogMSA6IDQ0NzYzCitLaGFiYXJvdnNraSBrcmHvIHLpc2lkdWVsO1NvbG5lY2hueWkgOiAxIDogNDUxNTYKK0Ftb3Vyc2th72Egb2JsYXN0O1NoaW1hbm92c2sgOiAxIDogMjYzMTIKK1Nha2hhbGluc2th72Egb2JsYXN0O0FsZXhhbmRyb3Zzay1TYWtoYWxpbnNraXkgOiAxIDogNzk2MgorQW1vdXJza2HvYSBvYmxhc3Q7U3ZvYm9kbmVuc2tpeSA6IDEgOiAxNzUwOAorU2FraGFsaW5za2HvYSBvYmxhc3Q7VHltb3Zza2l5IDogMSA6IDI0MzU1CitLaGFiYXJvdnNraSBrcmHvIHLpc2lkdWVsO0tvbXNvbW9sc2tpeSA6IDEgOiAzMzU0NworQW1vdXJza2HvYSBvYmxhc3Q7U2VyeXNoZXZza2l5IDogMSA6IDM2Njk4CitBbW91cnNrYe9hIG9ibGFzdDtSb21uZW5za2l5IDogMSA6IDE1MjMzCitBbW91cnNrYe9hIG9ibGFzdDtTdm9ib2RueWkgOiAxIDogODAyMjEKK0Ftb3Vyc2th72Egb2JsYXN0O0JsYWdvdmVzY2hlbnNraXkgOiAxIDogMTg5OTIKK0toYWJhcm92c2tpIGtyYe8gculzaWR1ZWw7VmFuaW5za2l5IDogMSA6IDUwODYyCitBbW91cnNrYe9hIG9ibGFzdDtCZWxvZ29yc2tpeSA6IDEgOiAyOTM3OAorQW1vdXJza2HvYSBvYmxhc3Q7QmVsb2dvcnNrIDogMSA6IDc0Mjg2CitTYWtoYWxpbnNrYe9hIG9ibGFzdDtTZXZlcm8tS3VyaWxza2l5IDogMSA6IDQ2ODQKK1Nha2hhbGluc2th72Egb2JsYXN0O0FsZWtzLi1TYWtoYWxpbnNraXkgOiAxIDogMTgxNzMKK0Ftb3Vyc2th72Egb2JsYXN0O0l2YW5vdnNraXkgOiAxIDogMzQ0MjMKK0Ftb3Vyc2th72Egb2JsYXN0O0J1cmV5c2tpeSA6IDEgOiAyOTk3MgorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtLb21zb21vbHNrLU5hLUFtdXJlIDogMSA6IDMxMTA3NQorQW1vdXJza2HvYSBvYmxhc3Q7T2t0eWFicnNraXkgOiAxIDogMjQ0MzIKK0Ftb3Vyc2th72Egb2JsYXN0O1phdml0aW5za2l5IDogMSA6IDMwNTY1CitLaGFiYXJvdnNraSBrcmHvIHLpc2lkdWVsO0toYWJhcm92c2tpeSA6IDEgOiA3NzcyMAorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtBbXVyc2tpeSA6IDEgOiAzMDM5OQorU2FraGFsaW5za2HvYSBvYmxhc3Q7U21pcm55a2hvdnNraXkgOiAxIDogMTk1NzgKK0Ftb3Vyc2th72Egb2JsYXN0O0JsYWdvdmVzY2hlbnNrIDogMSA6IDIxMzA2NQorQW1vdXJza2HvYSBvYmxhc3Q7VGFtYm92c2tpeSA6IDEgOiAyNTkxNgorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtBbXVyc2sgOiAxIDogNTkxMjYKK0Ftb3Vyc2th72Egb2JsYXN0O0Fya2hhcmluc2tpeSA6IDEgOiAyNjcwNworQW1vdXJza2HvYSBvYmxhc3Q7TWlraGF5bG92c2tpeSA6IDEgOiAyMTA2OQorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtOYW5heXNraXkgOiAxIDogMjE4NDAKK0Ftb3Vyc2th72Egb2JsYXN0O0tvbnN0YW50aW5vdnNraXkgOiAxIDogMTcyMTEKK1Nha2hhbGluc2th72Egb2JsYXN0O1Bvcm9uYXlza2l5IDogMSA6IDE2Njc0CitBbW91cnNrYe9hIG9ibGFzdDtSYXljaGlraGluc2sgOiAxIDogNDc2NzcKK1Nha2hhbGluc2th72Egb2JsYXN0O1VnbGVnb3Jza2l5IDogMSA6IDI2NDE2CitFdnJl73NrYe9hIG9ibGFzdDtPYmx1Y2hlbnNraXkgOiAxIDogNDAxMzcKK1Nha2hhbGluc2th72Egb2JsYXN0O1Bvcm9uYXlzayA6IDEgOiAyMzQxOQorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtTb3ZldHNrby1HYXZhbnNraXkgOiAxIDogMjQ5ODgKK1Nha2hhbGluc2th72Egb2JsYXN0O01ha2Fyb3Zza2l5IDogMSA6IDE0MTQ1CitTYWtoYWxpbnNrYe9hIG9ibGFzdDtVZ2xlZ29yc2sgOiAxIDogMTc5ODYKK0V2cmXvc2th72Egb2JsYXN0O0Jpcm9iaWR6aGFuc2tpeSA6IDEgOiAxNTMzMgorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtTb3ZldHNrYXlhIEdhdmFuIDogMSA6IDM0MTM4CitFdnJl73NrYe9hIG9ibGFzdDtTbWlkb3ZpY2hza2l5IDogMSA6IDI5NDkyCitLaGFiYXJvdnNraSBrcmHvIHLpc2lkdWVsO0xhem8uIGltZW5pIDogMSA6IDYyNTY5CitFdnJl73NrYe9hIG9ibGFzdDtCaXJvYmlkemhhbiA6IDEgOiA4MzMwMAorU2FraGFsaW5za2HvYSBvYmxhc3Q7VG9tYXJpbnNraXkgOiAxIDogMTY1ODAKK0V2cmXvc2th72Egb2JsYXN0O09rdHlhYnJza2l5IDogMSA6IDE2NjAyCitLaGFiYXJvdnNraSBrcmHvIHLpc2lkdWVsO0toYWJhcm92c2sgOiAxIDogNjEwNTQyCitFdnJl73NrYe9hIG9ibGFzdDtMZW5pbnNraXkgOiAxIDogMjc1MzkKK1ByaW1vcnNraSBrcmHvO1Rlcm5leXNraXkgOiAxIDogMTU1OTgKK1Nha2hhbGluc2th72Egb2JsYXN0O0RvbGluc2tpeSA6IDEgOiAyMDc5NgorS2hhYmFyb3Zza2kga3Jh7yBy6XNpZHVlbDtWeWF6ZW1za2l5IDogMSA6IDI5NTE0CitTYWtoYWxpbnNrYe9hIG9ibGFzdDtLaG9sbXNraXkgOiAxIDogMTkyOTcKK1Nha2hhbGluc2th72Egb2JsYXN0O0RvbGluc2sgOiAxIDogMTQ4OTQKK1ByaW1vcnNraSBrcmHvO1BvemhhcnNraXkgOiAxIDogMzc1MTQKK0toYWJhcm92c2tpIGtyYe8gculzaWR1ZWw7QmlraW5za2l5IDogMSA6IDEwNDI4CitTYWtoYWxpbnNrYe9hIG9ibGFzdDtZdXpobm8tU2FraGFsaW5zayA6IDEgOiAxNjA2NTIKK1Nha2hhbGluc2th72Egb2JsYXN0O0t1cmlsc2tpeSA6IDEgOiA5NjQ5CitTYWtoYWxpbnNrYe9hIG9ibGFzdDtLb3JzYWtvdnNraXkgOiAxIDogMTA1ODUKK1Nha2hhbGluc2th72Egb2JsYXN0O0FuaXZza2l5IDogMSA6IDM2NjI3CitTYWtoYWxpbnNrYe9hIG9ibGFzdDtLaG9sbXNrIDogMSA6IDQ3NTg3CitTYWtoYWxpbnNrYe9hIG9ibGFzdDtOZXZlbHNraXkgOiAxIDogMTIxNzgKK0toYWJhcm92c2tpIGtyYe8gculzaWR1ZWw7QmlraW4gOiAxIDogMTgwMDMKK1Nha2hhbGluc2th72Egb2JsYXN0O05ldmVsJ3NrIDogMSA6IDIzMzI1CitTYWtoYWxpbnNrYe9hIG9ibGFzdDtLb3JzYWtvdiA6IDEgOiA0MzI3OAorUHJpbW9yc2tpIGtyYe87S3Jhc25vYXJtZXlza2l5IDogMSA6IDI3NTQzCitQcmltb3Jza2kga3Jh7ztEYWxuZXJlY2hlbnNraXkgOiAxIDogMTcwNzkKK1ByaW1vcnNraSBrcmHvO0RhbG5lcmVjaGVuc2sgOiAxIDogMzkwOTMKK1ByaW1vcnNraSBrcmHvO0xlc296YXZvZHNraXkgOiAxIDogMTI4MzQKK1ByaW1vcnNraSBrcmHvO0xlc296YXZvZHNrIDogMSA6IDQ0NjIyCitQcmltb3Jza2kga3Jh7ztLaGFua2F5c2tpeSA6IDEgOiAyOTcxNQorUHJpbW9yc2tpIGtyYe87S2lyb3Zza2l5IDogMSA6IDI4NTMwCitQcmltb3Jza2kga3Jh7ztEYWxuZWdvcnNraXkgOiAxIDogMTM0MjYKK1ByaW1vcnNraSBrcmHvO1NwYXNza2l5IDogMSA6IDMxOTg1CitQcmltb3Jza2kga3Jh7ztDaHVndXlldnNraXkgOiAxIDogMzEzOTMKK1ByaW1vcnNraSBrcmHvO1BvZ3JhbmljaG55aSA6IDEgOiAyNjg1MgorUHJpbW9yc2tpIGtyYe87WWFrb3ZsZXZza2l5IDogMSA6IDIxMzI0CitQcmltb3Jza2kga3Jh7ztLYXZhbGVyb3Zza2l5IDogMSA6IDM2MjMwCitQcmltb3Jza2kga3Jh7ztLaG9yb2xza2l5IDogMSA6IDQzNDM3CitQcmltb3Jza2kga3Jh7ztEYWxuZWdvcnNrIDogMSA6IDUwMzQ3CitQcmltb3Jza2kga3Jh7ztTcGFzc2stRGFsbml5IDogMSA6IDYwNjE0CitQcmltb3Jza2kga3Jh7ztDaGVybmlnb3Zza2l5IDogMSA6IDQ1NTEwCitTYWtoYWxpbnNrYe9hIG9ibGFzdDtZdXpobm8tS3VyaWxza2l5IDogMSA6IDEzMzAyCitQcmltb3Jza2kga3Jh7ztBbnVjaGluc2tpeSA6IDEgOiAxODc1NworUHJpbW9yc2tpIGtyYe87TWlraGF5bG92c2tpeSA6IDEgOiA0NDQyNAorUHJpbW9yc2tpIGtyYe87T2t0eWFicnNraXkgOiAxIDogMzk5ODIKK1ByaW1vcnNraSBrcmHvO0Fyc2VueWV2IDogMSA6IDcwMzg4CitQcmltb3Jza2kga3Jh7ztPbGdpbnNreSA6IDEgOiAxNTk5MworUHJpbW9yc2tpIGtyYe87VXNzdXJpeXNraXkgOiAxIDogMzEwOTcKK1JVLVVOSy0yODM2IDogMSA6IDE1OTEzNworUHJpbW9yc2tpIGtyYe87UGFydGl6YW5za2l5IDogMSA6IDI5NDE5CitQcmltb3Jza2kga3Jh7ztTaGtvdG92c2tpeSA6IDEgOiAzMjI4MgorUHJpbW9yc2tpIGtyYe87TmFkZXpoZGluc2tpeSA6IDEgOiA0Mjk0MworUHJpbW9yc2tpIGtyYe87TGF6b3Zza2l5IDogMSA6IDIwNjMzCitQcmltb3Jza2kga3Jh7ztBcnR5b20gOiAxIDogMTEzOTIzCitQcmltb3Jza2kga3Jh7ztQYXJ0aXphbnNrIDogMSA6IDYwNDE3CitQcmltb3Jza2kga3Jh7ztLaGFzYW5za2l5IDogMSA6IDQ0OTE4CitQcmltb3Jza2kga3Jh7ztWbGFkaXZvc3RvayA6IDEgOiA2NTkyNTQKK1ByaW1vcnNraSBrcmHvO0JvbHNob3kgS2FtZW4gOiAxIDogODA3NTMKK1ByaW1vcnNraSBrcmHvO05ha2hvZGthIDogMSA6IDE5MjAxMQorUlUtVU5LLTI4MzcgOiAxIDogMjg4MgorUlUtVU5LLTI4MzggOiAxIDogMTU5MTM3CitLaXJvdnNrYe9hIG9ibGFzdDtMdXpza2l5IDogMSA6IDI1Nzk1CitLaXJvdnNrYe9hIG9ibGFzdDtQb2Rvc2lub3Zza2l5IDogMSA6IDI1NDA1CitLaXJvdnNrYe9hIG9ibGFzdDtWZXJraG5la2Ftc2tpeSA6IDEgOiA1MDYxNgorS2lyb3Zza2HvYSBvYmxhc3Q7T3Bhcmluc2tpeSA6IDEgOiAxNjY0NQorS2lyb3Zza2HvYSBvYmxhc3Q7TmFnb3Jza2l5IDogMSA6IDE1ODY2CitLaXJvdnNrYe9hIG9ibGFzdDtNdXJhc2hpbnNraXkgOiAxIDogMTg3ODYKK0tpcm92c2th72Egb2JsYXN0O0JlbG9raG9sdW5pdHNraXkgOiAxIDogMjYyODEKK0tpcm92c2th72Egb2JsYXN0O0FmYW5hc3lldnNraXkgOiAxIDogMTg5ODEKK0tpcm92c2th72Egb2JsYXN0O0Rhcm92c2tpeSA6IDEgOiAxODEwNQorS2lyb3Zza2HvYSBvYmxhc3Q7U2xvYm9kc2tveSA6IDEgOiAzNjMwNworS2lyb3Zza2HvYSBvYmxhc3Q7WXVyeWFuc2tpeSA6IDEgOiAzMzY3OQorS2lyb3Zza2HvYSBvYmxhc3Q7T211dG5pbnNraXkgOiAxIDogNTc4MTkKK0tpcm92c2th72Egb2JsYXN0O0toYWx0dXJpbnNraXkgOiAxIDogMTk0NjgKK0tpcm92c2th72Egb2JsYXN0O1NoYWJhbGluc2tpeSA6IDEgOiAxNjU0NworS2lyb3Zza2HvYSBvYmxhc3Q7S290ZWxuaWNoc2tpeSA6IDEgOiAyNDkxOQorS2lyb3Zza2HvYSBvYmxhc3Q7S2lyb3YgOiAxIDogNTA4OTgxCitLaXJvdnNrYe9hIG9ibGFzdDtLaXJvdm8tQ2hlcGV0c2tpeSA6IDEgOiAzNjExMgorS2lyb3Zza2HvYSBvYmxhc3Q7WnV5ZXZza2l5IDogMSA6IDMzMzg3CitLaXJvdnNrYe9hIG9ibGFzdDtTdmVjaGluc2tpeSA6IDEgOiAxMTQ4NgorS2lyb3Zza2HvYSBvYmxhc3Q7RmFsZW5za2l5IDogMSA6IDE3MTMyCitLaXJvdnNrYe9hIG9ibGFzdDtPcmljaGV2c2tpeSA6IDEgOiAzNTA0MgorS2lyb3Zza2HvYSBvYmxhc3Q7S2lyb3ZvLUNoZXBldHMgOiAxIDogOTc4MjUKK0tpcm92c2th72Egb2JsYXN0O0t1bWVuc2tpeSA6IDEgOiAxOTk1NAorS2lyb3Zza2HvYSBvYmxhc3Q7S290ZWxuaWNoJyA6IDEgOiAzNTQzMQorS2lyb3Zza2HvYSBvYmxhc3Q7VmVya2hvc2hpemhlbXNraXkgOiAxIDogMTI0NTkKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287VmV0bHV6aHNraXkgOiAxIDogMjIxOTcKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287U2hha2h1bnNraXkgOiAxIDogNTAxMTgKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287VG9uc2hheWV2c2tpeSA6IDEgOiAxOTA4MworS2lyb3Zza2HvYSBvYmxhc3Q7Qm9nb3JvZHNraXkgOiAxIDogODQ2OAorS2lyb3Zza2HvYSBvYmxhc3Q7QXJiYXpoc2tpeSA6IDEgOiAxMTM4OQorS2lyb3Zza2HvYSBvYmxhc3Q7U3Vuc2tpeSA6IDEgOiAxMDAyNgorS2lyb3Zza2HvYSBvYmxhc3Q7Tm9saW5za2l5IDogMSA6IDI4MDMzCitLaXJvdnNrYe9hIG9ibGFzdDtUdXpoaW5za2l5IDogMSA6IDExOTczCitLaXJvdnNrYe9hIG9ibGFzdDtVbmluc2tpeSA6IDEgOiAxMjg0OQorS2lyb3Zza2HvYSBvYmxhc3Q7U292ZXRza2l5IDogMSA6IDM0OTQ0CitLaXJvdnNrYe9hIG9ibGFzdDtOZW1za2l5IDogMSA6IDExMjkxCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO1Zhcm5hdmluc2tpeSA6IDEgOiAxNDY2NAorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztVcmVuc2tpeSA6IDEgOiAzNjQ1OQorS2lyb3Zza2HvYSBvYmxhc3Q7UGl6aGFuc2tpeSA6IDEgOiAxNTE4NQorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztUb25raW5za2l5IDogMSA6IDEyNzU2CitLaXJvdnNrYe9hIG9ibGFzdDtLaWtudXJza2l5IDogMSA6IDE1Mzc5CitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO0tvdmVybmluc2tpeSA6IDEgOiAyNDQwNgorS2lyb3Zza2HvYSBvYmxhc3Q7TGVieWF6aHNraXkgOiAxIDogMTI5NDYKK0tpcm92c2th72Egb2JsYXN0O0tpbG1lenNraXkgOiAxIDogMTg3ODYKK0tpcm92c2th72Egb2JsYXN0O1lhcmFuc2tpeSA6IDEgOiAzNjc5NAorS2lyb3Zza2HvYSBvYmxhc3Q7VXJ6aHVtc2tpeSA6IDEgOiAzNzg2NQorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztTZW15b25vdnNraXkgOiAxIDogNTcyNDkKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287U2hhcmFuZ3NraXkgOiAxIDogMTUyNjYKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287S3Jhc25vYmFrb3Zza2l5IDogMSA6IDI2OTE3CitNYXJpeXNrYe9hIHJlc3BvdWJsaWthO1Nlcm51cnNraXkgOiAxIDogMjg1NTUKK0tpcm92c2th72Egb2JsYXN0O1NhbmNodXJza2l5IDogMSA6IDE3MTMyCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO1Zvc2tyZXNlbnNraXkgOiAxIDogMjkzMjgKK01hcml5c2th72EgcmVzcG91Ymxpa2E7Tm92b3RhcnlhbHNraXkgOiAxIDogMjA0MzkKK01hcml5c2th72EgcmVzcG91Ymxpa2E7T3JzaGFuc2tpeSA6IDEgOiAxNjgzMgorTWFyaXlza2HvYSByZXNwb3VibGlrYTtNYXJpLVR1cmVrc2tpeSA6IDEgOiAyODY1NQorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztHb3JvZGV0c2tpeSA6IDEgOiA2OTAwMAorTWFyaXlza2HvYSByZXNwb3VibGlrYTtLaWxlbWFyc2tpeSA6IDEgOiAxNjYzMgorTWFyaXlza2HvYSByZXNwb3VibGlrYTtTb3ZldHNraXkgOiAxIDogMzM4NjUKK01hcml5c2th72EgcmVzcG91Ymxpa2E7UGFyYW5naW5za2l5IDogMSA6IDIwMDM4CitNYXJpeXNrYe9hIHJlc3BvdWJsaWthO01lZHZlZGV2c2tpeSA6IDEgOiA1NDUwNAorTWFyaXlza2HvYSByZXNwb3VibGlrYTtLdXpoZW5lcnNraXkgOiAxIDogMTc4MzQKK01hcml5c2th72EgcmVzcG91Ymxpa2E7WXVyaW5za2l5IDogMSA6IDE0MjI3CitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO0JvcnNraXkgOiAxIDogNjk3MDMKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287Q2hrYWxvdnNraXkgOiAxIDogMjk2MjkKK0tpcm92c2th72Egb2JsYXN0O01hbG15emhza2l5IDogMSA6IDM0OTQ0CitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO0dvcm9kZXR6IDogMSA6IDM0MzUwCitNYXJpeXNrYe9hIHJlc3BvdWJsaWthO01vcmtpbnNraXkgOiAxIDogMzk3NzYKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287QmFsYWtobmluc2tpeSA6IDEgOiA2MDc2NAorTWFyaXlza2HvYSByZXNwb3VibGlrYTtZb3Noa2FyLU9sYSA6IDEgOiAyNzU3MjgKK01hcml5c2th72EgcmVzcG91Ymxpa2E7R29ybm9tYXJpeXNraXkgOiAxIDogMzI4NjMKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287QmFsYWtobmEgOiAxIDogMzEzMzYKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287THlza292c2tpeSA6IDEgOiA0NzMwNgorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztWb3JvdHluc2tpeSA6IDEgOiAyNTgxMgorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztWb2xvZGFyc2tpeSA6IDEgOiA1MjgzMAorTWFyaXlza2HvYSByZXNwb3VibGlrYTtadmVuaWdvdnNraXkgOiAxIDogNTE2OTkKK0tpcm92c2th72Egb2JsYXN0O1Z5YXRza28tUG9seWFuc2tpeSA6IDEgOiAzODI1NAorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztOaXpobml5IE5vdmdvcm9kIDogMSA6IDE0NDUwOTAKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287Qm9yIDogMSA6IDY0MzgwCitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO0NoZWJva3NhcnNraXkgOiAxIDogNTU4ODcKK01hcml5c2th72EgcmVzcG91Ymxpa2E7S296bW9kZW15YW5zayA6IDEgOiAyNTA0OAorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztLc3RvdnNraXkgOiAxIDogNDgwMDkKK1JVLVVOSy0yODM5IDogMSA6IDI5OTUwNAorS2lyb3Zza2HvYSBvYmxhc3Q7VnlhdHNreWUgUG9seWFueSA6IDEgOiA0NDk3MAorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztCb2dvcm9kc2tpeSA6IDEgOiAzNDE0OQorTWFyaXlza2HvYSByZXNwb3VibGlrYTtWb2x6aHNraXkgOiAxIDogMjUyNDgKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287UGF2bG92c2tpeSA6IDEgOiA0NzgwOAorVGNob3V2YWNoc2th72EgcmVzcG91YmxpaztNb3JnYXVzaHNraXkgOiAxIDogMzgyOTEKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287S3N0b3ZvIDogMSA6IDY2ODkxCitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO1lhZHJpbnNraXkgOiAxIDogMzY5OTEKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287RGFsbmVrb25zdGFudGlub3Zza2l5IDogMSA6IDI2MzE1CitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO0NoZWJva3NhcnkgOiAxIDogNDU3NzkwCitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO01hcmlpbnNrby0gUG9zYWRza2l5IDogMSA6IDI4ODkzCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO0JvZ29yb2RzayA6IDEgOiAzNzY2NAorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztTcGFzc2tpeSA6IDEgOiAxNjA3MAorVGNob3V2YWNoc2th72EgcmVzcG91YmxpaztOb3ZvY2hlYm9rc2Fyc2sgOiAxIDogMTIyNzcwCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO1ZhY2hza2l5IDogMSA6IDI4OTI2CitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO1RzeXZpbHNraXkgOiAxIDogMzcwOTEKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287U29zbm92c2tpeSA6IDEgOiAyNDkwOAorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztQYXZsb3ZvIDogMSA6IDcyNTE2CitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO0tueWFnaW5pbnNraXkgOiAxIDogMTM0NTkKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287Qm9sc2hlbXVyYXNoa2luc2tpeSA6IDEgOiAxNDM2MworVGNob3V2YWNoc2th72EgcmVzcG91YmxpaztLb3psb3Zza2l5IDogMSA6IDI4MDkzCitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO0tyYXNub2FybWV5c2tpeSA6IDEgOiAxOTM5NQorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztQaWxuaW5za2l5IDogMSA6IDI5MTI3CitNYXJpeXNrYe9hIHJlc3BvdWJsaWthO1ZvbHpoc2sgOiAxIDogNjM2MjIKK1RjaG91dmFjaHNrYe9hIHJlc3BvdWJsaWs7QWxpa292c2tpeSA6IDEgOiAyMzM5NAorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztQZXJldm96c2tpeSA6IDEgOiAxODI4MAorVGNob3V2YWNoc2th72EgcmVzcG91YmxpaztLcmFzbm9jaGV0YXlza2l5IDogMSA6IDI0MDk0CitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO1VybWFyc2tpeSA6IDEgOiAyOTc5MworTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztOYXZhc2hpbnNraXkgOiAxIDogMzAwMzEKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287U2VyZ2FjaHNraXkgOiAxIDogNDE5ODMKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287QnV0dXJsaW5za2l5IDogMSA6IDE4MDc5CitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO1Z1cm5hcnNraXkgOiAxIDogNDQ4ODkKK1RjaG91dmFjaHNrYe9hIHJlc3BvdWJsaWs7S2FuYXNoc2tpeSA6IDEgOiA0NDE4OQorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztBcnphbWFzc2tpeSA6IDEgOiA1MTAyMgorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztWYWRza2l5IDogMSA6IDE1ODY5CitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO1NodW1lcmxpbnNraXkgOiAxIDogMTU3OTYKK1RjaG91dmFjaHNrYe9hIHJlc3BvdWJsaWs7WWFudGlrb3Zza2l5IDogMSA6IDE5OTk1CitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO0FyZGF0b3Zza2l5IDogMSA6IDMyOTQzCitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO1NodW1lcmx5YSA6IDEgOiA0MTk5MAorVGNob3V2YWNoc2th72EgcmVzcG91YmxpaztLYW5hc2ggOiAxIDogNTQ5ODcKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287U2VjaGVub3Zza2l5IDogMSA6IDE4NjgxCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO0t1bGViYWtza2l5IDogMSA6IDE2NDcyCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO0tyYXNub29rdHlhYnJza2l5IDogMSA6IDE2NTcyCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO0FyemFtYXMgOiAxIDogMTExOTg3CitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO1Z5a3N1bnNraXkgOiAxIDogMzE5MzkKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287R2FnaW5za2l5IDogMSA6IDE3NDc2CitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO0licmVzaW5za2l5IDogMSA6IDI5MTkzCitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO0t1bGViYWtpIDogMSA6IDQ2MDAwCitUY2hvdXZhY2hza2HvYSByZXNwb3VibGlrO1BvcmV0c2tpeSA6IDEgOiAxOTM5NQorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztTaGF0a292c2tpeSA6IDEgOiAzMDQzMgorVGNob3V2YWNoc2th72EgcmVzcG91YmxpaztLb21zb21vbHNraXkgOiAxIDogMjgyOTMKK1RjaG91dmFjaHNrYe9hIHJlc3BvdWJsaWs7WWFsY2hpa3NraXkgOiAxIDogMjcyOTMKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287Vnlrc2EgOiAxIDogNjM1NzcKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287RGl2ZXlldnNraXkgOiAxIDogMTg1ODEKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287Qm9sc2hlYm9sZGluc2tpeSA6IDEgOiAxNDE2MgorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztMdWtveWFub3Zza2l5IDogMSA6IDM4MTY2CitOaWplZ29yb2Rza2HvYSBvYmxhc3QgKEdvO1BlcnZvbWF5c2tpeSA6IDEgOiAyNjkxNworTW9yZG92c2th72EgcmVzcG91Ymxpa2E7Qm9sc2hlaWduYXRvdnNraXkgOiAxIDogMTA1NDEKK1RjaG91dmFjaHNrYe9hIHJlc3BvdWJsaWs7QmF0eXJldnNraXkgOiAxIDogNDIyOTAKK1RjaG91dmFjaHNrYe9hIHJlc3BvdWJsaWs7QWxhdHlyc2tpeSA6IDEgOiAyNDc5NAorTmlqZWdvcm9kc2th72Egb2JsYXN0IChHbztWb3puZXNlbnNraXkgOiAxIDogMjI5MDAKK01vcmRvdnNrYe9hIHJlc3BvdWJsaWthO0FyZGF0b3Zza2l5IDogMSA6IDM1NjAyCitNb3Jkb3Zza2HvYSByZXNwb3VibGlrYTtUZW1uaWtvdnNraXkgOiAxIDogMjY1NTIKK05pamVnb3JvZHNrYe9hIG9ibGFzdCAoR287UG9jaGlua292c2tpeSA6IDEgOiAzNzg2NQorVGNob3V2YWNoc2th72EgcmVzcG91YmxpaztTaGVtdXJzaGluc2tpeSA6IDEgOiAxNzY5NgorVGNob3V2YWNoc2th72EgcmVzcG91YmxpaztBbGF0eXInIDogMSA6IDQ3Njg5CitNb3Jkb3Zza2HvYSByZXNwb3VibGlrYTtUZW5ndXNoZXZza2l5IDogMSA6IDE0NTE5CitNb3Jkb3Zza2HvYSByZXNwb3VibGlrYTtJY2hhbGtvdnNraXkgOiAxIDogMjU1NTgKK01vcmRvdnNrYe9hIHJlc3BvdWJsaWthO1llbG5pa292c2tpeSA6IDEgOiAxNTkxMQorTW9yZG92c2th72EgcmVzcG91Ymxpa2E7QXR5YXNoZXZza2l5IDogMSA6IDI2MzUzCitNb3Jkb3Zza2HvYSByZXNwb3VibGlrYTtDaGFtemluc2tpeSA6IDEgOiAzNjg5NAorTW9yZG92c2th72EgcmVzcG91Ymxpa2E7U3Rhcm9zaGF5Z292c2tpeSA6IDEgOiAxNzgwMQorTW9yZG92c2th72EgcmVzcG91Ymxpa2E7Um9tb2Rhbm92c2tpeSA6IDEgOiAyMjY3NAorTW9yZG92c2th72EgcmVzcG91Ymxpa2E7S3Jhc25vc2xvYm9kc2tpeSA6IDEgOiAzMzAxNgorTW9yZG92c2th72EgcmVzcG91Ymxpa2E7RHViZW5za2l5IDogMSA6IDE4MDk5CitNb3Jkb3Zza2HvYSByZXNwb3VibGlrYTtMeWFtYmlyc2tpeSA6IDEgOiAzNDExMAorTW9yZG92c2th72EgcmVzcG91Ymxpa2E7QXR5dXJpeWV2c2tpeSA6IDEgOiAxNDcxOAorTW9yZG92c2th72EgcmVzcG91Ymxpa2E7WnVib3ZvLVBvbHlhbnNraXkgOiAxIDogNjcxMjYKK01vcmRvdnNrYe9hIHJlc3BvdWJsaWthO1RvcmJleWV2c2tpeSA6IDEgOiAyNjA1NQorTW9yZG92c2th72EgcmVzcG91Ymxpa2E7Qm9sc2hlYmVyZXpuaWtvdnNraXkgOiAxIDogMTgwOTkKK01vcmRvdnNrYe9hIHJlc3BvdWJsaWthO0tvdnlsa2luc2tpeSA6IDEgOiAzMTMyNQorTW9yZG92c2th72EgcmVzcG91Ymxpa2E7S2Fkb3Noa2luc2t5IDogMSA6IDEwNDQyCitNb3Jkb3Zza2HvYSByZXNwb3VibGlrYTtSdXpheWV2c2tpeSA6IDEgOiAyMDY4NQorTW9yZG92c2th72EgcmVzcG91Ymxpa2E7U2FyYW5zayA6IDEgOiAzNDc5NjAKK01vcmRvdnNrYe9hIHJlc3BvdWJsaWthO0tvY2hrdXJvdnNraXkgOiAxIDogMTMzMjYKK01vcmRvdnNrYe9hIHJlc3BvdWJsaWthO1J1emFldmthIDogMSA6IDUwMTIxCitNb3Jkb3Zza2HvYSByZXNwb3VibGlrYTtLb3Z5bGtpbm8gOiAxIDogMjI0NzUKK01vcmRvdnNrYe9hIHJlc3BvdWJsaWthO0luc2Fyc2tpeSA6IDEgOiAxODQ5NworUlUtVU5LLTI4NDAgOiAxIDogMjk5NTA0CitUYe9teXJza2kgbmF0aW9uYWwgb2tyb3VnO0Rpa3NvbnNraXkgOiAxIDogMjI0NQorVGHvbXlyc2tpIG5hdGlvbmFsIG9rcm91ZztLaGF0YW5nc2tpeSA6IDEgOiA4NTEyCitUYe9teXJza2kgbmF0aW9uYWwgb2tyb3VnO0R1ZGlua2EgOiAxIDogMzM5NTQKK1Rh7215cnNraSBuYXRpb25hbCBva3JvdWc7VXN0LVllbmlzZXlza2l5IDogMSA6IDMzNjcKK0V2ZW5raXNraSBuYXRpb25hbCBva3JvdWc7QmF5a2l0c2tpeSA6IDEgOiA2NzA4CitSVS1VTkstMjg0MSA6IDEgOiAyNzY1NjUKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7VHVydWtoYW5za2l5IDogMSA6IDE4MTIwCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO0lnYXJrYSA6IDEgOiAyMTE1NworSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtLYXRhbmdza2l5IDogMSA6IDkyMzQKK0V2ZW5raXNraSBuYXRpb25hbCBva3JvdWc7SWxpbXBpeXNraXkgOiAxIDogOTQ4MAorRXZlbmtpc2tpIG5hdGlvbmFsIG9rcm91ZztUdW5ndXNza28tQ2h1bnNraXkgOiAxIDogNTI3NworS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtZZW5pc2V5c2tpeSA6IDEgOiAzOTY4MworS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtTZXZlcm8tWWVuaXNleXNraXkgOiAxIDogMTc5MTgKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7Qm9kYXliaW5za2l5IDogMSA6IDE1ODE2CitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO0JvZ3VjaGFuc2tpeSA6IDEgOiA2MDQzNQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtLZXpoZW1za2l5IDogMSA6IDM0MjE2CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O01hbXNrby1DaHV5c2tpeSA6IDEgOiAxNjc5OAorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtNb3R5Z2luc2tpeSA6IDEgOiAyNjcyNQorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtVc3QtSWxpbXNraXkgOiAxIDogMjY2MjIKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7S2lyZW5za2l5IDogMSA6IDI5NzY1CitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO0VuaXNleXNrIDogMSA6IDIyOTgwCitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO0thbGFyc2tpeSA6IDEgOiAxNzA3NQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtMZXNvc2liaXJzayA6IDEgOiA3Nzk0OAorUlUtVU5LLTI4NDIgOiAxIDogMjAyMzcKK1JVLVVOSy0yODQzIDogMSA6IDIwMjM3CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O0NodW5za2l5IDogMSA6IDUwNDkzCitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O1VzdCctSWxpbXNrIDogMSA6IDExMjM4MgorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtQaXJvdnNraXkgOiAxIDogMTIxNDgKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7S2F6YWNoaW5za2l5IDogMSA6IDE2Mjk4CitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO0JpcmlseXVzc2tpeSA6IDEgOiAxNzQxMgorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtCb2RheWJvIDogMSA6IDIwNzI4CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O05pemhuZWlsaW1za2l5IDogMSA6IDc2NzIyCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO1R5dWtodGV0c2tpeSA6IDEgOiAxMzI2MQorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtUYXlzaGV0c2tpeSA6IDEgOiAzNDQ4MQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtUYXNleWV2c2tpeSA6IDEgOiAxOTIzNAorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtLYXphY2hpbnNrby1MZW5za2l5IDogMSA6IDI4MTk0CitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO0FiYW5za2l5IDogMSA6IDMzNzEwCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO0JvbHNoZW11cnRpbnNraXkgOiAxIDogMjYzMjAKK1JVLVVOSy0yODQ0IDogMSA6IDEyOTkwCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO0R6ZXJ6aGluc2tpeSA6IDEgOiAyMDY1MQorQm91cmlhdGlhO1NldmVyby1CYXlrYWxza2l5IDogMSA6IDIzMjgyCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO1N1a2hvYnV6aW1za2l5IDogMSA6IDI2MzIwCitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O0JyYXRza2l5IDogMSA6IDc1MzQ3CitCb3VyaWF0aWE7TXV5c2tpeSA6IDEgOiAyNDM4MQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtZZW1lbHlhbm92c2tpeSA6IDEgOiA0ODY5MgorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtCb2xzaGV1bHV5c2tpeSA6IDEgOiAxMDgzMgorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtLb3p1bHNreSA6IDEgOiAyMTM2MAorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtOaXpobmVpbmdhc2hza2l5IDogMSA6IDQyOTIyCitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O1VzdCctS3V0IDogMSA6IDYwMjE5CitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO0thbnNraXkgOiAxIDogMzIyOTMKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7QWNoaW5za2l5IDogMSA6IDE2NTAxCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO0JvZ290b2xza2l5IDogMSA6IDE1Mjg2CitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO0lsYW5za2l5IDogMSA6IDMyMDkwCitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O1VzdC1VZGluc2tpeSA6IDEgOiAxODI3MgorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtSeWJpbnNraXkgOiAxIDogMjM2ODgKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7QWNoaW5zayA6IDEgOiAxMjQ2MTYKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7QmVyeW96b3Zza2l5IDogMSA6IDQwOTk5CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O0JyYXRzayA6IDEgOiAyODI5MTkKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7Qm9nb3RvbCA6IDEgOiAyNzMzMworS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtVeWFyc2tpeSA6IDEgOiAyODk1MgorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtLYW5zayA6IDEgOiAxMTIzNjcKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7U29zbm92b2JvcnNrIDogMSA6IDMxODg4CitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO0tyYXNub3lhcnNrIDogMSA6IDkzMDQyMQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtOYXphcm92c2tpeSA6IDEgOiAyMzE4MgorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtNYW5za2l5IDogMSA6IDIyMjcxCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO05hemFyb3ZvIDogMSA6IDY2MzA3CitSVS1VTkstMjg0NSA6IDEgOiAxODcwNQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtTaGFyeXBvdnNraXkgOiAxIDogMTcxMDgKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7Tml6aG5ldWRpbnNraXkgOiAxIDogMzczMzAKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7VHVuZ2lyby1PbGVrbWluc2tpeSA6IDEgOiAxODIzCitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O1RheXNoZXQgOiAxIDogNTk3MjcKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7RGl2bm9nb3JzayA6IDEgOiAzNTQzMQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtaYW96ZXJueWkgOiAxIDogMTk3NDAKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7SXJiZXlza2l5IDogMSA6IDIyMjcxCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO0Jvcm9kaW5vIDogMSA6IDE5MTMzCitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O1poaWdhbG92c2tpeSA6IDEgOiAxMTM5NQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtCYWxha2h0aW5za2l5IDogMSA6IDI4NDQ2CitSVS1VTkstMjg0NiA6IDEgOiA1NzgwMworS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtVemh1cnNraXkgOiAxIDogNDk1MDIKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7U2F5YW5za2l5IDogMSA6IDE3ODE3CitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO1BhcnRpemFuc2tpeSA6IDEgOiAxNTY5MQorQm91cmlhdGlhO1NldmVyb2JheWthbHNrIDogMSA6IDI4Nzc4CitCb3VyaWF0aWE7S3VydW1rYW5za2l5IDogMSA6IDE4NDg2CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O0JhbGFnYW5za2l5IDogMSA6IDEwOTA0CitSZXNwLiBLaGFrYXNzaWE7T3JkemhvbmlraWR6ZXZza2l5IDogMSA6IDE5MzkxCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO05vdm9zZWxvdnNraXkgOiAxIDogMTg0MjQKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7S3V5dHVuc2tpeSA6IDEgOiA0MTg0OAorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtUdWx1bnNraXkgOiAxIDogMzExNDEKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7S2FjaHVnc2tpeSA6IDEgOiAyMzg3MQorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtJZHJpbnNraXkgOiAxIDogMTg2MjcKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7S3VyYWdpbnNraXkgOiAxIDogNTY2OTAKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7S3Jhc25vdHVyYW5za2l5IDogMSA6IDE5NzQwCitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O05pemhuZXVkaW5zayA6IDEgOiA1MjM2MAorUmVzcC4gS2hha2Fzc2lhO1NoaXJpbnNraXkgOiAxIDogMzkwODMKK1Jlc3AuIEtoYWthc3NpYTtCb2dyYWRza2l5IDogMSA6IDIwMTk0CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O1R1bHVuIDogMSA6IDUyNTU2CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O09sa2hvbnNraXkgOiAxIDogOTAzOAorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtNb2dvY2hpbnNraXkgOiAxIDogMzU0OTIKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7WmltaW5za2l5IDogMSA6IDE1NTIxCitSZXNwLiBLaGFrYXNzaWE7VXN0LUFiYWthbnNraXkgOiAxIDogNTg0NzMKK0JvdXJpYXRpYTtCYXJndXppbnNraXkgOiAxIDogMjg0NzgKK091c3QnLU9yZHluc2tpIG5hdGlvbmFsIG87TnVrdXRza2l5IDogMSA6IDE4MTg1CitPdXN0Jy1PcmR5bnNraSBuYXRpb25hbCBvO09zaW5za2l5IDogMSA6IDIxNzAxCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO01pbnVzaW5za2l5IDogMSA6IDI3MDI5CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O1NheWFuc2sgOiAxIDogNDYxNzEKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7WmltYSA6IDEgOiAzNjc0MAorS3Jhc25v72Fyc2tpIGtyYe8gculzaWR1ZTtLYXJhdHV6c2tpeSA6IDEgOiAyMTU2MgorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtaYWxhcmluc2tpeSA6IDEgOiAzMzk5MAorT3VzdCctT3JkeW5za2kgbmF0aW9uYWwgbztBbGFyc2tpeSA6IDEgOiAyOTMzNworUmVzcC4gS2hha2Fzc2lhO0NoZXJub2dvcnNrIDogMSA6IDgyMjg0CitSZXNwLiBLaGFrYXNzaWE7QXNraXpza2l5IDogMSA6IDUwOTM4CitCb3VyaWF0aWE7WWVyYXZuaW5za2l5IDogMSA6IDIwMzg1CitSZXNwLiBLaGFrYXNzaWE7QWx0YXlza2l5IDogMSA6IDIzMjA4CitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO01pbnVzaW5zayA6IDEgOiA3Nzc0NgorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtDaGVybnlzaGV2c2tpeSA6IDEgOiA0OTMwNgorUmVzcC4gS2hha2Fzc2lhO0FiYWthbiA6IDEgOiAxNTc4MzcKK1RvdXZhIHJlc3BvdWJsaWthO1RvZHpoaW5za2l5IDogMSA6IDY0NTkKK1JVLVVOSy0yODQ3IDogMSA6IDE1MzcyCitLcmFzbm/vYXJza2kga3Jh7yBy6XNpZHVlO1NodXNoZW5za2l5IDogMSA6IDM4OTc0CitPdXN0Jy1PcmR5bnNraSBuYXRpb25hbCBvO0Jva2hhbnNraXkgOiAxIDogMjc2MjkKK0tyYXNub+9hcnNraSBrcmHvIHLpc2lkdWU7WWVybWFrb3Zza2l5IDogMSA6IDI1NzEzCitPdXN0Jy1PcmR5bnNraSBuYXRpb25hbCBvO0VraGlyaXQtQnVsYWdhdHNraXkgOiAxIDogMzAyNDEKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7U3JldGVuc2tpeSA6IDEgOiAzMTM2OAorUmVzcC4gS2hha2Fzc2lhO0JleXNraXkgOiAxIDogMjIxMDMKK0JvdXJpYXRpYTtPa2luc2tpeSA6IDEgOiA0NTk3CitCb3VyaWF0aWE7UHJpYmF5a2Fsc2tpeSA6IDEgOiAzMTE3NgorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtHYXppbXVyby0gWmF2b2Rza2l5IDogMSA6IDEwNzQ0CitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O0NoZXJlbWtob3Zza2l5IDogMSA6IDM1NjYwCitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O0NoZXJlbWtob3ZvIDogMSA6IDg5ODg2CitSZXNwLiBLaGFrYXNzaWE7VGFzaHR5cHNraXkgOiAxIDogMzcwNzMKK1Jlc3AuIEtoYWthc3NpYTtTYXlhbm9nb3JzayA6IDEgOiA3Mzg0NQorQm91cmlhdGlhO0tob3JpbnNraXkgOiAxIDogMjM3ODIKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7Q2hpdGluc2tpeSA6IDEgOiA2MDA0OQorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtJcmt1dHNraXkgOiAxIDogNTYxOTEKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7VXNvbHNraXkgOiAxIDogNTUwMTIKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7TmVyY2hpbnNraXkgOiAxIDogMzI5OTgKK1RvdXZhIHJlc3BvdWJsaWthO1BpeS1LaHVtc2tpeSA6IDEgOiAxMzcyNAorSXJrb3V0c2th72Egb2JsYXN0IHLpc2lkdTtVc29seWUtU2liaXJza29lIDogMSA6IDEwNDkxNgorQm91cmlhdGlhO0thYmFuc2tpeSA6IDEgOiA3MDQ0NgorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtLYXJ5bXNraXkgOiAxIDogNDAwMDEKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7TmVyY2hpbnNraXktWmF2b2Rza2l5IDogMSA6IDE1MDYwCitJcmtvdXRza2HvYSBvYmxhc3QgculzaWR1O0FuZ2Fyc2sgOiAxIDogMjcxMTMxCitUb3V2YSByZXNwb3VibGlrYTtLeXp5bHNraXkgOiAxIDogMjE2OTcKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7U2hpbGtpbnNraXkgOiAxIDogNTUzNDkKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7SXJrdXRzayA6IDEgOiA2MjIyMjUKK1RvdXZhIHJlc3BvdWJsaWthO0thYS1IZW1za2l5IDogMSA6IDE0OTM1CitCb3VyaWF0aWE7WmFpZ3JheWV2c2tpeSA6IDEgOiA1NTU1OAorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtLaGlsb2tza2l5IDogMSA6IDM4Mjc0CitUb3V2YSByZXNwb3VibGlrYTtTdXQtS2hvbHNraXkgOiAxIDogMTE5MDgKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7U2hlbG9wdWdpbnNraXkgOiAxIDogMTIzNzQKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7U2hlbGVraG92IDogMSA6IDU1Nzk4CitSVS1VTkstMjg0OCA6IDEgOiAyMTc4MworVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtDaGl0YSA6IDEgOiAzNTE1NjYKK0JvdXJpYXRpYTtJdm9sZ2luc2tpeSA6IDEgOiAyMTI4NAorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtCYWxleXNraXkgOiAxIDogMTEwMzEKK0lya291dHNrYe9hIG9ibGFzdCBy6XNpZHU7U2x5dWR5YW5za2l5IDogMSA6IDQ0NTAxCitCb3VyaWF0aWE7VHVua2luc2tpeSA6IDEgOiAyNjI4MAorQm91cmlhdGlhO1VsYW4tVWRlIDogMSA6IDM4NjAwNgorUlUtVU5LLTI4NDkgOiAxIDogMTg5NzIKK1RvdXZhIHJlc3BvdWJsaWthO0NoYWEtS2hvbHNreSA6IDEgOiA3OTcyCitCb3VyaWF0aWE7VGFyYmFnYXRheXNraXkgOiAxIDogMTc0ODcKK1RvdXZhIHJlc3BvdWJsaWthO0t5enlsIDogMSA6IDkwMTE3CitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO1VsZXRvdnNraXkgOiAxIDogMzMwOTQKK1RvdXZhIHJlc3BvdWJsaWthO0JhcnVuLUtoZW1jaGluc2tpeSA6IDEgOiAzMDg4MAorQWd1aW5za2kgbmF0aW9uYWwgb2tyb3VnO01vZ295dHV5c2tpeSA6IDEgOiAyOTEyNQorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtCYWxleSA6IDEgOiAyMjM1MQorVG91dmEgcmVzcG91Ymxpa2E7QmF5LVRheWdpbnNraXkgOiAxIDogMTM4MjUKK1RvdXZhIHJlc3BvdWJsaWthO1RhbmRpbnNraXkgOiAxIDogMTM5MjYKK0JvdXJpYXRpYTtTZWxlbmdpbnNraXkgOiAxIDogMjYyODAKK1RvdXZhIHJlc3BvdWJsaWthO0NoZWRpLUtob2xza3kgOiAxIDogODA3MworVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtBbGV4YW5kcm92by1aYXZvZHNraXkgOiAxIDogMTQzODkKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7UGV0cm92c2stWmFiYXlrYWxza2l5IDogMSA6IDIzNjk0CitUb3V2YSByZXNwb3VibGlrYTtEenVuLUtoZW1jaGluc2tpeSA6IDEgOiAyMDc4OAorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtPbG92eWFubmluc2tpeSA6IDEgOiA1OTc2MQorQm91cmlhdGlhO011a2hvcnNoaWJpcnNraXkgOiAxIDogMzAyNzcKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7S2FsZ2Fuc2tpeSA6IDEgOiAxMjI3OAorQWd1aW5za2kgbmF0aW9uYWwgb2tyb3VnO0FnaW5za2l5IDogMSA6IDMzMzI4CitCb3VyaWF0aWE7WmFrYW1lbnNraXkgOiAxIDogMzU0NzMKK0JvdXJpYXRpYTtEemhpZGluc2tpeSA6IDEgOiAzNjg3MgorQm91cmlhdGlhO0d1c2lub296ZXJzayA6IDEgOiAzMTQ3NgorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtQZXRyb3Zzay1aYWJheWthbHNreSA6IDEgOiAyNjY2NworQWd1aW5za2kgbmF0aW9uYWwgb2tyb3VnO0R1bGR1cmdpbnNraXkgOiAxIDogMTY1MTQKK1RvdXZhIHJlc3BvdWJsaWthO092eXVyc2tpeSA6IDEgOiA5MTgzCitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO0JvcnppbnNraXkgOiAxIDogMzA1MDQKK1RvdXZhIHJlc3BvdWJsaWthO1Rlcy1LaGVtc2tpeSA6IDEgOiAxMDQ5NQorQm91cmlhdGlhO0JpY2h1cnNraXkgOiAxIDogMzE1NzYKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7UHJpYXJndW5za2l5IDogMSA6IDI4Nzc4CitCb3VyaWF0aWE7S3lha2h0aW5za2l5IDogMSA6IDQ1NzY1CitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO0tyYXNub2NoaWtveXNraXkgOiAxIDogMjIyNTUKK1RvdXZhIHJlc3BvdWJsaWthO0Vyemluc2tpeSA6IDEgOiA5MDgyCitUb3V2YSByZXNwb3VibGlrYTtNb25ndW4tVGF5Z2luc2tpeSA6IDEgOiA2MjU3CitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO0Frc2hpbnNraXkgOiAxIDogMTQxOTcKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7T25vbnNraXkgOiAxIDogMTYyMTEKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7S3Jhc25va2FtZW5za2l5IDogMSA6IDExMzE5CitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO0t5cmluc2tpeSA6IDEgOiAxODQxOAorVGNoaXRpbnNrYe9hIG9ibGFzdCBy6XNpZDtCb3J6eWEgOiAxIDogMzUzMDEKK1RjaGl0aW5za2HvYSBvYmxhc3QgculzaWQ7WmFiYXlrYWxza2l5IDogMSA6IDIyMTU5CitUY2hpdGluc2th72Egb2JsYXN0IHLpc2lkO0tyYXNub2thbWVuc2sgOiAxIDogNjg5NzAKK1JVLVVOSy0yODUwIDogMSA6IDI3NjU2NQorUlUtVU5LLTI4NTEgOiAxIDogMjAyMzcKK1JVLVVOSy0yODUyIDogMSA6IDIwMjM3CitSVS1VTkstMjg1MyA6IDEgOiAxMjk5MAorUlUtVU5LLTI4NTQgOiAxIDogMTg3MDUKK1JVLVVOSy0yODU1IDogMSA6IDU3ODAzCitSVS1VTkstMjg1NiA6IDEgOiAxNTM3MgorUlUtVU5LLTI4NTcgOiAxIDogMjE3ODMKK1JVLVVOSy0yODU4IDogMSA6IDE4OTcyCitLb3N0cm9tc2th72Egb2JsYXN0O1Zva2hvbXNraXkgOiAxIDogMTY5OTIKK0tvc3Ryb21za2HvYSBvYmxhc3Q7U29saWdhbGljaHNraXkgOiAxIDogMTQ2OTMKK0tvc3Ryb21za2HvYSBvYmxhc3Q7UGF2aW5za2l5IDogMSA6IDc2OTYKK0tvc3Ryb21za2HvYSBvYmxhc3Q7T2t0eWFicnNraXkgOiAxIDogNzY5NgorS29zdHJvbXNrYe9hIG9ibGFzdDtDaHVraGxvbXNraXkgOiAxIDogMTUxOTIKK0tvc3Ryb21za2HvYSBvYmxhc3Q7S29sb2dyaXZza2l5IDogMSA6IDEwNjk1CitLb3N0cm9tc2th72Egb2JsYXN0O01lemhldnNraXkgOiAxIDogNjk5NworS29zdHJvbXNrYe9hIG9ibGFzdDtQeXNjaHVnc2tpeSA6IDEgOiA2ODk3CitLb3N0cm9tc2th72Egb2JsYXN0O0J1eXNraXkgOiAxIDogMTEzOTQKK0lhcm9zbGF2c2th72Egb2JsYXN0O1Bvc2hla2hvbnNraXkgOiAxIDogMjIxNTcKK0lhcm9zbGF2c2th72Egb2JsYXN0O1BlcnZvbWF5c2tpeSA6IDEgOiAxNTEwMgorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtWZXN5ZWdvbnNraXkgOiAxIDogMjAxNTQKK0tvc3Ryb21za2HvYSBvYmxhc3Q7UGFyZmVueWV2c2tpeSA6IDEgOiA4ODk2CitLb3N0cm9tc2th72Egb2JsYXN0O1NoYXJ5aW5za2l5IDogMSA6IDE1OTkyCitLb3N0cm9tc2th72Egb2JsYXN0O05leXNraXkgOiAxIDogNzk5NgorS29zdHJvbXNrYe9hIG9ibGFzdDtQb25henlyZXZza2l5IDogMSA6IDEzNTkzCitLb3N0cm9tc2th72Egb2JsYXN0O0dhbGljaHNraXkgOiAxIDogMTQxOTMKK0lhcm9zbGF2c2th72Egb2JsYXN0O0JyZXl0b3Zza2l5IDogMSA6IDExMzI3CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO1NhbmRvdnNraXkgOiAxIDogMTI0NzIKK0tvc3Ryb21za2HvYSBvYmxhc3Q7TWFudHVyb3Zza2l5IDogMSA6IDg5OTYKK0lhcm9zbGF2c2th72Egb2JsYXN0O0x5dWJpbXNraXkgOiAxIDogMTYxOTUKK0tvc3Ryb21za2HvYSBvYmxhc3Q7QW50cm9wb3Zza2l5IDogMSA6IDExMDk0CitLb3N0cm9tc2th72Egb2JsYXN0O0J1eSA6IDEgOiAzNTE4MgorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtMZXNub3kgOiAxIDogNzk4MgorS29zdHJvbXNrYe9hIG9ibGFzdDtTaGFyeWEgOiAxIDogNDI3NzkKK0tvc3Ryb21za2HvYSBvYmxhc3Q7R2FsaXRjaCA6IDEgOiAyMTQ4OQorSWFyb3NsYXZza2HvYSBvYmxhc3Q7RGFuaWxvdnNraXkgOiAxIDogMzI5ODcKK0lhcm9zbGF2c2th72Egb2JsYXN0O1J5Ymluc2tpeSA6IDEgOiAzNDc3NQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtLcmFzbm9raG9sbXNraXkgOiAxIDogMTg4NTcKK0tvc3Ryb21za2HvYSBvYmxhc3Q7TWFudHVyb3ZvIDogMSA6IDIxNzg5CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO01vbG9rb3Zza2l5IDogMSA6IDkxNzkKK0tvc3Ryb21za2HvYSBvYmxhc3Q7S29zdHJvbXNrb3kgOiAxIDogNDU4NzcKK0tvc3Ryb21za2HvYSBvYmxhc3Q7TmV5YSA6IDEgOiAxMjk5NAorS29zdHJvbXNrYe9hIG9ibGFzdDtTdXNhbmluc2tpeSA6IDEgOiAxMTE5NAorSWFyb3NsYXZza2HvYSBvYmxhc3Q7VHV0YXlldnNraXkgOiAxIDogMTgxODMKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47VWRvbWVsc2tpeSA6IDEgOiAxMTk3MworVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtCb2xvZ292c2tpeSA6IDEgOiAzMTIyOQorS29zdHJvbXNrYe9hIG9ibGFzdDtNYWthcnlldnNraXkgOiAxIDogMjQ1ODgKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47TWFrc2F0aWtoaW5za2l5IDogMSA6IDI0MzQ1CitJYXJvc2xhdnNrYe9hIG9ibGFzdDtOZWtvdXpza2l5IDogMSA6IDIyODUyCitLb3N0cm9tc2th72Egb2JsYXN0O09zdHJvdnNraXkgOiAxIDogMTY3OTIKK0tvc3Ryb21za2HvYSBvYmxhc3Q7U3VkaXNsYXZza2l5IDogMSA6IDE3MDkxCitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO0JlemhldHNraXkgOiAxIDogMTg4NTcKK0tvc3Ryb21za2HvYSBvYmxhc3Q7S2FkeWlza2l5IDogMSA6IDEyNDk0CitJYXJvc2xhdnNrYe9hIG9ibGFzdDtSeWJpbnNrIDogMSA6IDI1MDA4NAorSWFyb3NsYXZza2HvYSBvYmxhc3Q7VHV0YWV2IDogMSA6IDQzNjE4CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO1NvbmtvdnNraXkgOiAxIDogMTI4NzEKK0lhcm9zbGF2c2th72Egb2JsYXN0O05la3Jhc292c2tpeSA6IDEgOiAyNzYyMgorSWFyb3NsYXZza2HvYSBvYmxhc3Q7TXlzaGtpbnNraXkgOiAxIDogMTMxMTUKK0lhcm9zbGF2c2th72Egb2JsYXN0O1lhcm9zbGF2c2tpeSA6IDEgOiA1NTc0MAorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtCb2xvZ295ZSA6IDEgOiAzMjcyNgorSWFyb3NsYXZza2HvYSBvYmxhc3Q7Qm9sc2hlc2Vsc2tpeSA6IDEgOiAxMjQyMAorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtVZG9tbHlhIDogMSA6IDMyNzI2CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO1Z5c2huZXZvbG90c2tpeSA6IDEgOiAzNDcyMQorS29zdHJvbXNrYe9hIG9ibGFzdDtLb3N0cm9tYSA6IDEgOiAzMDAzNTAKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47QmV6c2hldHNrIDogMSA6IDMwMzMxCitLb3N0cm9tc2th72Egb2JsYXN0O0tyYXNub3NlbHNraXkgOiAxIDogMjAzOTAKK0lhcm9zbGF2c2th72Egb2JsYXN0O1VnbGljaHNraXkgOiAxIDogMTc2ODYKK0l2YW5vdnNrYe9hIG9ibGFzdDtaYXZvbHpoc2tpeSA6IDEgOiAyNjk2MAorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtLZXNvdm9nb3Jza2l5IDogMSA6IDEwMzc3CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO0Zpcm92c2tpeSA6IDEgOiAxNDE2OAorSWFyb3NsYXZza2HvYSBvYmxhc3Q7WWFyb3NsYXZsIDogMSA6IDYyNTk1NgorSXZhbm92c2th72Egb2JsYXN0O0tpbmVzaGVtc2tpeSA6IDEgOiAzMDM5MgorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtTcGlyb3Zza2l5IDogMSA6IDE1MTY2CitJdmFub3Zza2HvYSBvYmxhc3Q7U29rb2xza2l5IDogMSA6IDE5MTE3CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO0thc2hpbnNraXkgOiAxIDogMTU3NjQKK0tvc3Ryb21za2HvYSBvYmxhc3Q7TmVyZWtodHNraXkgOiAxIDogMTQ0OTMKK0lhcm9zbGF2c2th72Egb2JsYXN0O0Jvcmlzb2dsZWJza2l5IDogMSA6IDE2MDk2CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO0xpa2hvc2xhdmxza2l5IDogMSA6IDMzODIzCitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO1Z5c2hueSBWb2xvY2hlayA6IDEgOiA2NDA1NQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtSYW1lc2hrb3Zza2l5IDogMSA6IDE3NzYwCitJYXJvc2xhdnNrYe9hIG9ibGFzdDtVZ2xpY2ggOiAxIDogMzk0NDUKK0l2YW5vdnNrYe9hIG9ibGFzdDtLaW5lc2htYSA6IDEgOiAxMDE3NjMKK0lhcm9zbGF2c2th72Egb2JsYXN0O0dhdnJpbG92LVlhbXNraXkgOiAxIDogMzEzOTcKK0l2YW5vdnNrYe9hIG9ibGFzdDtQcml2b2x6aHNraXkgOiAxIDogMzI2NDYKK0l2YW5vdnNrYe9hIG9ibGFzdDtWaWNodWdza2l5IDogMSA6IDI2MDc4CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO09zdGFzaGtvdnNraXkgOiAxIDogODY4MAorSXZhbm92c2th72Egb2JsYXN0O1l1cnlldmV0c2tpeSA6IDEgOiAyMzQzMQorSWFyb3NsYXZza2HvYSBvYmxhc3Q7Um9zdG92c2tpeSA6IDEgOiA0MzUxOQorS29zdHJvbXNrYe9hIG9ibGFzdDtOZXJla2h0YSA6IDEgOiAyOTM4NQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtLYXNoaW4gOiAxIDogMjA1NTQKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47S2FseWF6aW5za2l5IDogMSA6IDI2OTM5CitJdmFub3Zza2HvYSBvYmxhc3Q7RnVybWFub3Zza2l5IDogMSA6IDgxMzcKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47S2ltcnNraXkgOiAxIDogMTg5NTcKK0l2YW5vdnNrYe9hIG9ibGFzdDtSb2RuaWtvdnNraXkgOiAxIDogNDM5MjEKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47VG9yemhva3NraXkgOiAxIDogMjY5MzkKK0l2YW5vdnNrYe9hIG9ibGFzdDtLb21zb21vbHNraXkgOiAxIDogMjczNTIKK0lhcm9zbGF2c2th72Egb2JsYXN0O1Jvc3RvdiA6IDEgOiAzNjA2NworSXZhbm92c2th72Egb2JsYXN0O0Z1cm1hbm92IDogMSA6IDQ0OTk5CitJdmFub3Zza2HvYSBvYmxhc3Q7VmljaHVnYSA6IDEgOiA0ODEzNgorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtQZW5vdnNraXkgOiAxIDogMTAwNzcKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47S3V2c2hpbm92c2tpeSA6IDEgOiAyMDY1MworSXZhbm92c2th72Egb2JsYXN0O0l2YW5vdnNraXkgOiAxIDogNjA5NzkKK0l2YW5vdnNrYe9hIG9ibGFzdDtMdWtoc2tpeSA6IDEgOiAxMDg4MgorSXZhbm92c2th72Egb2JsYXN0O0lseWluc2tpeSA6IDEgOiAxMzYyNworSWFyb3NsYXZza2HvYSBvYmxhc3Q7UGVyZXNsYXZza2l5IDogMSA6IDI2NzI3CitJdmFub3Zza2HvYSBvYmxhc3Q7UHVjaGV6aHNraXkgOiAxIDogMjE1NjgKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47S2FsaW5pbnNraXkgOiAxIDogNTYwNzMKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47QW5kcmVhcG9sc2tpeSA6IDEgOiAxNzU2MAorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtPc3Rhc2hrb3YgOiAxIDogMjYwNDEKK0l2YW5vdnNrYe9hIG9ibGFzdDtJdmFub3ZvIDogMSA6IDQ2NTg3NAorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtTZWxpemhhcm92c2tpeSA6IDEgOiAxODA1OQorSXZhbm92c2th72Egb2JsYXN0O1NodWlza2l5IDogMSA6IDIzNzI1CitJdmFub3Zza2HvYSBvYmxhc3Q7VGV5a292c2tpeSA6IDEgOiAxODAzOQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtUb3J6c2hvayA6IDEgOiA1MDU4NgorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtUb3JvcGV0c2tpeSA6IDEgOiAzMDkzMAorSXZhbm92c2th72Egb2JsYXN0O0xlemhuZXZza2l5IDogMSA6IDIxNTY4CitJdmFub3Zza2HvYSBvYmxhc3Q7UGFsZWtoc2tpeSA6IDEgOiAxNDYwOAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtUYWxkb21za2l5IDogMSA6IDUxOTk3CitJdmFub3Zza2HvYSBvYmxhc3Q7VmVya2huZWxhbmRla2hvdnNraXkgOiAxIDogNjc2NQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtUdmVyIDogMSA6IDQ1MzA3NQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtLb25ha292c2tpeSA6IDEgOiA1NDI3NworSXZhbm92c2th72Egb2JsYXN0O1NodXlhIDogMSA6IDY4MzMyCitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO0tpbXJ5IDogMSA6IDYwMTY0CitJdmFub3Zza2HvYSBvYmxhc3Q7VGV5a292byA6IDEgOiAzODMzMworVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtTdGFyaXRza2l5IDogMSA6IDI4NzM1CitJdmFub3Zza2HvYSBvYmxhc3Q7R2F2cmlsb3ZvLVBvc2Fkc2tpeSA6IDEgOiAyMjc0NQorVmxhZGltaXJza2HvYSBvYmxhc3Q7WXVyeWV2LVBvbHNraXkgOiAxIDogNDIxMjgKK0l2YW5vdnNrYe9hIG9ibGFzdDtQZXN0eWFrb3Zza2l5IDogMSA6IDk1MTAKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7WmFnb3Jza2l5IDogMSA6IDEyMzUxNworTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtEdWJuYSA6IDEgOiA2NjM0MQorSXZhbm92c2th72Egb2JsYXN0O1l1emhza2l5IDogMSA6IDMyMjU0CitSVS1VTkstMjg1OSA6IDEgOiA0MzAyMgorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtLb25ha292byA6IDEgOiA0MzAwMworSXZhbm92c2th72Egb2JsYXN0O1Nhdmluc2tpeSA6IDEgOiAxNzI1NQorVmxhZGltaXJza2HvYSBvYmxhc3Q7QWxla3NhbmRyb3Zza2l5IDogMSA6IDYxNzk1CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO1J6aGV2c2tpeSA6IDEgOiAxNzA2MQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtEbWl0cm92c2tpeSA6IDEgOiA4ODE1NgorVmxhZGltaXJza2HvYSBvYmxhc3Q7U3V6ZGFsc2tpeSA6IDEgOiA0MDEzMgorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtOZWxpZG92c2tpeSA6IDEgOiAxMDc3NgorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtLbGluc2tpeSA6IDEgOiA0NjkxNworVmxhZGltaXJza2HvYSBvYmxhc3Q7S2FtZXNoa292c2tpeSA6IDEgOiA0MTMzMAorVmxhZGltaXJza2HvYSBvYmxhc3Q7S292cm92c2tpeSA6IDEgOiAyOTA1MQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtPbGVuaW5za2l5IDogMSA6IDE4NzU4CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO1phcGFkbm9kdmluc2tpeSA6IDEgOiAyMzU0NworVmxhZGltaXJza2HvYSBvYmxhc3Q7S29sY2h1Z2luc2tpeSA6IDEgOiAxNjM3MgorVmxhZGltaXJza2HvYSBvYmxhc3Q7Vnlhem5pa292c2tpeSA6IDEgOiA2MDI5NworVmxhZGltaXJza2HvYSBvYmxhc3Q7U3V6ZGFsJyA6IDEgOiAxMTk4MAorVmxhZGltaXJza2HvYSBvYmxhc3Q7R29yb2tob3ZldHNraXkgOiAxIDogMjk1NTAKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7TG90b3NoaW5za2l5IDogMSA6IDE4NzI3CitWbGFkaW1pcnNrYe9hIG9ibGFzdDtLb3Zyb3YgOiAxIDogMTYyMTI0CitSVS1VTkstMjg2MCA6IDEgOiA2NTA0NgorVmxhZGltaXJza2HvYSBvYmxhc3Q7QWxla3NhbmRyb3YgOiAxIDogNjU3ODgKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7S2xpbiA6IDEgOiA5NDczMAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtTZXJnaWV2IFBvc2FkIDogMSA6IDExNDQ1MworVmxhZGltaXJza2HvYSBvYmxhc3Q7S2lyemhhY2hza2l5IDogMSA6IDQ5MzE2CitUdmVyc2th72Egb2JsYXN0IChLYWxpbmluO1p1YnRzb3Zza2l5IDogMSA6IDIyMDUwCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1NvbG5lY2hub2dvcnNraXkgOiAxIDogNjg4MzEKK1ZsYWRpbWlyc2th72Egb2JsYXN0O0tvbCdjaHVnaW5vIDogMSA6IDQ0OTI0CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1ZvbG9rb2xhbXNraXkgOiAxIDogMzU5NTkKK1ZsYWRpbWlyc2th72Egb2JsYXN0O1NvYmluc2tpeSA6IDEgOiAyNjA1NgorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtSenNoZXYgOiAxIDogNjkzNDMKK1ZsYWRpbWlyc2th72Egb2JsYXN0O1Z5YXpuaWtpIDogMSA6IDQ0NjI0CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1NjaGVsa292c2tpeSA6IDEgOiA5NzQxOQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtOZWxpZG92byA6IDEgOiAyOTQzMworTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtTaGFraG92c2tveSA6IDEgOiAyNDEwNgorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtTb2xuZWNobm9nb3JzayA6IDEgOiA1NTE4NAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtQdXNoa2luc2tpeSA6IDEgOiA4OTg0OQorVHZlcnNrYe9hIG9ibGFzdCAoS2FsaW5pbjtaaGFya292c2tpeSA6IDEgOiAxMDM3NworVmxhZGltaXJza2HvYSBvYmxhc3Q7VmxhZGltaXIgOiAxIDogMzU2Mjk0CitWbGFkaW1pcnNrYe9hIG9ibGFzdDtQZXR1c2hraW5za2l5IDogMSA6IDc1NzcxCitWbGFkaW1pcnNrYe9hIG9ibGFzdDtTdWRvZ29kc2tpeSA6IDEgOiA0NzAyMAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtLcmFzbm9hcm1leXNrIDogMSA6IDI3NDkzCitSVS1VTkstMjg2MSA6IDEgOiAxNjg3MQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtJc3RyaW5za2l5IDogMSA6IDg4MTU2CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O015dGlzY2hpbnNraXkgOiAxIDogMjY1OTYKK1R2ZXJza2HvYSBvYmxhc3QgKEthbGluaW47QmVsc2tpeSA6IDEgOiAxMDI3NworU21vbGVuc2th72Egb2JsYXN0O1N5Y2hldmtza2l5IDogMSA6IDE4MDIzCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O05vZ2luc2tpeSA6IDEgOiAxMTg0MzcKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7Vm9sb2tvbGFtc2sgOiAxIDogMTc5MzAKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7UHVzY2hpbm8gOiAxIDogMjAxMjEKK1ZsYWRpbWlyc2th72Egb2JsYXN0O1NlbGl2YW5vdnNraXkgOiAxIDogMjQzNTkKK1ZsYWRpbWlyc2th72Egb2JsYXN0O1NvYmlua2EgOiAxIDogNDIyMjgKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7UnV6c2tpeSA6IDEgOiA2NjE0MgorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtQYXZsb3ZvLVBvc2Fkc2tpeSA6IDEgOiA0MDA0NAorU21vbGVuc2th72Egb2JsYXN0O0dhZ2FyaW5za2l5IDogMSA6IDIxNTQ3CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0xvYm55YSA6IDEgOiA2NDY0NworTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtJdmFudGV5ZXZrYSA6IDEgOiA1MTY5OAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtGcnlhemlubyA6IDEgOiA1MzY5MAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtLaGlta2luc2tpeSA6IDEgOiAzNDE2NgorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtEb2xnb3BydWRueWkgOiAxIDogNzY0MDEKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7U2hjaGVsa292byA6IDEgOiAxMDgwNzgKK1ZsYWRpbWlyc2th72Egb2JsYXN0O011cm9tc2tpeSA6IDEgOiAyODc1MQorTW9za3ZhO01vc2NvdyA6IDEgOiA4NzA1NzUwCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1B1c2hraW5vIDogMSA6IDc0ODA4CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O015dHlzaGNoeSA6IDEgOiAxNTM0MDEKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7SXN0cmEgOiAxIDogMzU4NjAKK1JVLVVOSy0yODYyIDogMSA6IDI1NDAxCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0toaW1raSA6IDEgOiAxMzY3NjYKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7Tm9naW5zayA6IDEgOiAxMjA2MjkKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7S2FsaW5pbmdyYWQgOiAxIDogMTY0MjU4CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0tyYXNub2dvcnNraXkgOiAxIDogNDg0MTEKK1ZsYWRpbWlyc2th72Egb2JsYXN0O0d1cy1LaHJ1c3RhbG55aSA6IDEgOiA1NzMwMworTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtPcmVraG92by1adXlldnNraXkgOiAxIDogMTMwMjkxCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0JhbGFzaGlraGluc2tpeSA6IDEgOiAzMTM3NworTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtPcmVraG92by1adWV2byA6IDEgOiAxMzQ4NzMKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7TW96aGF5c2tpeSA6IDEgOiA0MjEzNQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtLcmFzbm9nb3JzayA6IDEgOiA5MDY0NgorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtTaGF0dXJza2l5IDogMSA6IDcwODIzCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0VsZWt0cm9zdGFsIDogMSA6IDE1MTUwOAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtCYWxhc2hpa2hhIDogMSA6IDEzNTc2OQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtSZXV0b3YgOiAxIDogNjk3MjgKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7T2RpbnRzb3Zza2l5IDogMSA6IDEyMzMxOAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtaaGVsZXpub2Rvcm96aG55aSA6IDEgOiAxMDQzOTIKK1Ntb2xlbnNrYe9hIG9ibGFzdDtOb3ZvZHVnaW5za2l5IDogMSA6IDE0Mzk4CitTbW9sZW5za2HvYSBvYmxhc3Q7VmVsaXpoc2tpeSA6IDEgOiAxNzIxOAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtadmVuaWdvcm9kIDogMSA6IDE3MDMzCitTbW9sZW5za2HvYSBvYmxhc3Q7RGVtaWRvdnNraXkgOiAxIDogMjI4NTYKK1Ntb2xlbnNrYe9hIG9ibGFzdDtLaG9sbS1aaGlya292c2tpeSA6IDEgOiAxNDkwMgorU21vbGVuc2th72Egb2JsYXN0O0R1a2hvdnNjaGluc2tpeSA6IDEgOiAyMzE1OAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtMeXViZXJldHNraXkgOiAxIDogMTM4MDYwCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O09kaW50c292byA6IDEgOiAxMzAwOTIKK1ZsYWRpbWlyc2th72Egb2JsYXN0O0d1cyctS2hydXN0YWxueSA6IDEgOiA4MDg2MgorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtSYW1lbnNraXkgOiAxIDogMTMzMjc5CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0xlbmluc2tpeSA6IDEgOiA2OTcyOAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtMaXViZXJ0c3kgOiAxIDogMTYyNzY0CitWbGFkaW1pcnNrYe9hIG9ibGFzdDtNZWxlbmtvdnNraXkgOiAxIDogNDc0MTkKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7Wmh1a292c2tpeSA6IDEgOiAxMDA1MDcKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7TmFyby1Gb21pbnNraXkgOiAxIDogMTEyMzYxCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1JhbWVuc2tvZSA6IDEgOiA4Nzg1NworTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtTaGF0dXJhIDogMSA6IDMxNTc3CitWbGFkaW1pcnNrYe9hIG9ibGFzdDtNdXJvbSA6IDEgOiAxNDM3NTUKK1Ntb2xlbnNrYe9hIG9ibGFzdDtHYWdhcmluIDogMSA6IDI5NjAyCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1ZpZG5veWUgOiAxIDogNTU4ODIKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7THl0a2FyaW5vIDogMSA6IDUxNDk5CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1Zvc2tyZXNlbnNraXkgOiAxIDogNzY5MDAKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7UG9kb2xza2l5IDogMSA6IDczNjEyCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O01venNoYXlzayA6IDEgOiAzMDg3OQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtUcm9pdHNrIDogMSA6IDMwMzgxCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1llZ29yeWV2c2tpeSA6IDEgOiAzMTA3OQorU21vbGVuc2th72Egb2JsYXN0O1lhcnRzZXZza2l5IDogMSA6IDEwNDcyCitSVS1VTkstMjg2MyA6IDEgOiAyODc4OAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtEb21vZGVkb3Zza2l5IDogMSA6IDY1MTQ1CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1BvZG9sc2sgOiAxIDogMjA0MjAyCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0RvbW9kZWRvdm8gOiAxIDogNTU4ODIKK1Ntb2xlbnNrYe9hIG9ibGFzdDtWeWF6ZW1za2l5IDogMSA6IDI1MjczCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0Vnb3J5ZXZzayA6IDEgOiA3MzMxNAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtOYXJvLUZvbWluc2sgOiAxIDogNTg3NzAKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7S2xpbW92c2sgOiAxIDogNTc4NzQKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7Vm9za3Jlc2Vuc2sgOiAxIDogODExODMKK1J5YXphbnNrYe9hIG9ibGFzdDtLbGVwaWtvdnNraXkgOiAxIDogMzM2ODkKK1Ntb2xlbnNrYe9hIG9ibGFzdDtSdWRueWFuc2tpeSA6IDEgOiAzMzczMQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtCcm9ubml0c3kgOiAxIDogMTY1MzUKK0thbG91anNrYe9hIG9ibGFzdDtCb3JvdnNraXkgOiAxIDogNTQ0NjgKK1Ntb2xlbnNrYe9hIG9ibGFzdDtTYWZvbm92c2tpeSA6IDEgOiAxNzExNworTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtDaGVraG92c2tpeSA6IDEgOiAzNTA2MworS2Fsb3Vqc2th72Egb2JsYXN0O0l6bm9za292c2tpeSA6IDEgOiA4NDczCitLYWxvdWpza2HvYSBvYmxhc3Q7TWVkeW5za2l5IDogMSA6IDE0NTI1CitTbW9sZW5za2HvYSBvYmxhc3Q7VHlvbWtpbnNraXkgOiAxIDogODM1NworTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtTdHVwaW5za2l5IDogMSA6IDQ4NjEwCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0tvbG9tZW5za2l5IDogMSA6IDQzMjMxCitLYWxvdWpza2HvYSBvYmxhc3Q7Wmh1a292c2tpeSA6IDEgOiA1MDAzMAorUnlhemFuc2th72Egb2JsYXN0O0thc2ltb3Zza2l5IDogMSA6IDQwMTI5CitTbW9sZW5za2HvYSBvYmxhc3Q7Vnlhem1hIDogMSA6IDYwNjE0CitSVS1VTkstMjg2NCA6IDEgOiA1OTA2OQorU21vbGVuc2th72Egb2JsYXN0O1NhZm9ub3ZvIDogMSA6IDU2Njg3CitLYWxvdWpza2HvYSBvYmxhc3Q7TWFsb3lhcm9zbGF2ZXRza2l5IDogMSA6IDUxNjQzCitLYWxvdWpza2HvYSBvYmxhc3Q7T2JuaW5zayA6IDEgOiAxMDY1MTQKK1Ntb2xlbnNrYe9hIG9ibGFzdDtTbW9sZW5za2l5IDogMSA6IDQ5NDM4CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0x1a2hvdml0c2tpeSA6IDEgOiA2NTE0NQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtLb2xvbW5hIDogMSA6IDE2MjM2NQorU21vbGVuc2th72Egb2JsYXN0O1lhcnRzZXZvIDogMSA6IDU1OTgzCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1NlcnB1a2hvdnNraXkgOiAxIDogMzQ5NjMKK1J5YXphbnNrYe9hIG9ibGFzdDtSeWJub3Zza2l5IDogMSA6IDM4MDQ4CitSeWF6YW5za2HvYSBvYmxhc3Q7WWVybWlzaGluc2tpeSA6IDEgOiAxMzA3OQorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtPenlvcnNraXkgOiAxIDogMTEzNTYKK1Ntb2xlbnNrYe9hIG9ibGFzdDtLYXJkeW1vdnNraXkgOiAxIDogMTM3OTQKK1Ntb2xlbnNrYe9hIG9ibGFzdDtVZ3JhbnNraXkgOiAxIDogMTM3OTQKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7U3R1cGlubyA6IDEgOiA3MzcxMgorU21vbGVuc2th72Egb2JsYXN0O0Rvcm9nb2J1emhza2l5IDogMSA6IDM3MTU0CitLYWxvdWpza2HvYSBvYmxhc3Q7RHplcnpoaW5za2l5IDogMSA6IDYyMDMzCitSeWF6YW5za2HvYSBvYmxhc3Q7S2FzaW1vdiA6IDEgOiAzODE0NworS2Fsb3Vqc2th72Egb2JsYXN0O1l1a2hub3Zza2l5IDogMSA6IDEzNzE4CitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O1NlcnB1a2hvdiA6IDEgOiAxMzk5NTMKK1J5YXphbnNrYe9hIG9ibGFzdDtSeWF6YW5za2l5IDogMSA6IDcyNTMwCitSVS1VTkstMjg2NSA6IDEgOiAzNjc1NgorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtaYXJheXNraXkgOiAxIDogMTgyMjkKK0thbG91anNrYe9hIG9ibGFzdDtUYXJ1c3NraXkgOiAxIDogMTYyMzkKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7T3plcnkgOiAxIDogMjgyODkKK1J5YXphbnNrYe9hIG9ibGFzdDtTcGFzc2tpeSA6IDEgOiA0MDAzMAorTW9za292c2th72Egb2JsYXN0IHLpc2lkdTtLYXNoaXJza2l5IDogMSA6IDMyNTczCitNb3Nrb3Zza2HvYSBvYmxhc3QgculzaWR1O0thc2hpcmEgOiAxIDogNDM4MjkKK1J5YXphbnNrYe9hIG9ibGFzdDtTaGlsb3Zza2l5IDogMSA6IDUxMDI4CitUb3Vsc2th72Egb2JsYXN0O1phb2tza2l5IDogMSA6IDE5ODU3CitUb3Vsc2th72Egb2JsYXN0O1lhc25vZ29yc2tpeSA6IDEgOiA0MDExMAorU21vbGVuc2th72Egb2JsYXN0O0dsaW5rb3Zza2l5IDogMSA6IDc2NTIKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7WmFyYXlzayA6IDEgOiAyNzA5NAorUnlhemFuc2th72Egb2JsYXN0O1BpdGVsaW5za2l5IDogMSA6IDg4MTgKK1Ntb2xlbnNrYe9hIG9ibGFzdDtTbW9sZW5zayA6IDEgOiAzNTE0MDIKK0thbG91anNrYe9hIG9ibGFzdDtNb3NhbHNraXkgOiAxIDogMTE5MDIKK1J5YXphbnNrYe9hIG9ibGFzdDtLYWRvbXNraXkgOiAxIDogMTQyNjgKK0thbG91anNrYe9hIG9ibGFzdDtGZXJ6aWtvdnNraXkgOiAxIDogMTcxNDcKK1RvdWxza2HvYSBvYmxhc3Q7VmVuZXZza2l5IDogMSA6IDQwMjA5CitLYWxvdWpza2HvYSBvYmxhc3Q7S2FsdWdhIDogMSA6IDM2NDIyNworUnlhemFuc2th72Egb2JsYXN0O1J5YXphbiA6IDEgOiA1MjM1NjEKK1Ntb2xlbnNrYe9hIG9ibGFzdDtLcmFzbmluc2tpeSA6IDEgOiAxODcyOAorVG91bHNrYe9hIG9ibGFzdDtBbGVrc2luc2tpeSA6IDEgOiAxNDA5OAorU21vbGVuc2th72Egb2JsYXN0O1llbG5pbnNraXkgOiAxIDogMTg3MjgKK01vc2tvdnNrYe9hIG9ibGFzdCBy6XNpZHU7U2VyZWJyeWFub3BydWRza2l5IDogMSA6IDI1MTAyCitSeWF6YW5za2HvYSBvYmxhc3Q7WmFraGFyb3Zza2l5IDogMSA6IDExMjk2CitLYWxvdWpza2HvYSBvYmxhc3Q7QmFieW5pbnNraXkgOiAxIDogMTkzNjYKK1Ntb2xlbnNrYe9hIG9ibGFzdDtQb2NoaW5rb3Zza2l5IDogMSA6IDQzNzk5CitLYWxvdWpza2HvYSBvYmxhc3Q7U3Bhcy1EZW1lbnNraXkgOiAxIDogMTI4MTAKK0thbG91anNrYe9hIG9ibGFzdDtCYXJ5YXRpbnNraXkgOiAxIDogODE3MAorS2Fsb3Vqc2th72Egb2JsYXN0O01lc2Nob3Zza2l5IDogMSA6IDE1MjMxCitSeWF6YW5za2HvYSBvYmxhc3Q7U2Fzb3Zza2l5IDogMSA6IDI1NzYyCitSeWF6YW5za2HvYSBvYmxhc3Q7Q2h1Y2hrb3Zza2l5IDogMSA6IDEyMDg4CitUb3Vsc2th72Egb2JsYXN0O0FsZWtzaW4gOiAxIDogNzIzNzcKK1Ntb2xlbnNrYe9hIG9ibGFzdDtNb25hc3R5cnNoaW5za2l5IDogMSA6IDE3MTE3CitLYWxvdWpza2HvYSBvYmxhc3Q7UGVyZW15c2hsc2tpeSA6IDEgOiAxNTIzMQorUnlhemFuc2th72Egb2JsYXN0O1N0YXJvemhpbG92c2tpeSA6IDEgOiAxODAzMworUnlhemFuc2th72Egb2JsYXN0O01pa2hheWxvdnNraXkgOiAxIDogNDM5OTMKK1J5YXphbnNrYe9hIG9ibGFzdDtQcm9uc2tpeSA6IDEgOiAzNTY3MAorVG91bHNrYe9hIG9ibGFzdDtMZW5pbnNraXkgOiAxIDogNjUyMjkKK1J5YXphbnNrYe9hIG9ibGFzdDtTYXNvdm8gOiAxIDogMzQzODIKK0thbG91anNrYe9hIG9ibGFzdDtTdWtoaW5pY2hza2l5IDogMSA6IDMxMDY3CitUb3Vsc2th72Egb2JsYXN0O05vdm9tb3Nrb3Zza2l5IDogMSA6IDI1OTEzCitLYWxvdWpza2HvYSBvYmxhc3Q7S296ZWxza2l5IDogMSA6IDQ5MjIzCitUb3Vsc2th72Egb2JsYXN0O0R1YmVuc2tpeSA6IDEgOiAxNTM4OQorUnlhemFuc2th72Egb2JsYXN0O1B1dHlhdGluc2tpeSA6IDEgOiAxMDUwMworS2Fsb3Vqc2th72Egb2JsYXN0O0t1eWJ5c2hldnNraXkgOiAxIDogMTE2MDAKK1RvdWxza2HvYSBvYmxhc3Q7U3V2b3JvdnNraXkgOiAxIDogNDQ4NzYKK1RvdWxza2HvYSBvYmxhc3Q7VHVsYSA6IDEgOiA1ODA3MDQKK1Ntb2xlbnNrYe9hIG9ibGFzdDtSb3NsYXZsc2tpeSA6IDEgOiAyODM5NAorUnlhemFuc2th72Egb2JsYXN0O1NoYXRza2l5IDogMSA6IDM2NTYyCitUb3Vsc2th72Egb2JsYXN0O0tpcmV5ZXZza2l5IDogMSA6IDkwNjQ1CitLYWxvdWpza2HvYSBvYmxhc3Q7S2lyb3Zza2l5IDogMSA6IDk1ODIKK1Ntb2xlbnNrYe9hIG9ibGFzdDtLaGlzbGF2aWNoc2tpeSA6IDEgOiAxNDM5OAorS2Fsb3Vqc2th72Egb2JsYXN0O0R1bWluaWNoc2tpeSA6IDEgOiAxNzM0OQorUnlhemFuc2th72Egb2JsYXN0O0tvcmFibGluc2tpeSA6IDEgOiAyODIzOQorUnlhemFuc2th72Egb2JsYXN0O1NhcG96aGtvdnNraXkgOiAxIDogMTU1NTYKK1RvdWxza2HvYSBvYmxhc3Q7T2RveWV2c2tpeSA6IDEgOiAxNTM4OQorVG91bHNrYe9hIG9ibGFzdDtLaW1vdnNraXkgOiAxIDogMTk1NTkKK0thbG91anNrYe9hIG9ibGFzdDtLaXJvdiA6IDEgOiAzOTQzOQorS2Fsb3Vqc2th72Egb2JsYXN0O0x5dWRpbm92c2tpeSA6IDEgOiA2NTU2CitUb3Vsc2th72Egb2JsYXN0O1V6bG92c2tpeSA6IDEgOiAxMzAwNgorVG91bHNrYe9hIG9ibGFzdDtTY2hla2luc2tpeSA6IDEgOiA0NTk2OAorQnJ5YW5za2HvYSBvYmxhc3Q7Um9nbmVkaW5za2l5IDogMSA6IDExMDgwCitTbW9sZW5za2HvYSBvYmxhc3Q7RGVzbm9nb3JzayA6IDEgOiAzNDQzNQorVG91bHNrYe9hIG9ibGFzdDtOb3ZvbW9za292c2sgOiAxIDogMTQzMzY0CitTbW9sZW5za2HvYSBvYmxhc3Q7U2h1bXlhY2hza2l5IDogMSA6IDE3NTIwCitUb3Vsc2th72Egb2JsYXN0O0RvbnNrb3kgOiAxIDogNzQxNjQKK1J5YXphbnNrYe9hIG9ibGFzdDtTYXJheWV2c2tpeSA6IDEgOiAyNzU0NQorVG91bHNrYe9hIG9ibGFzdDtTY2hla2lubyA6IDEgOiA3OTMyNworVG91bHNrYe9hIG9ibGFzdDtVemxvdmF5YSA6IDEgOiA4NDY4OAorVG91bHNrYe9hIG9ibGFzdDtCZWx5ZXZza2l5IDogMSA6IDI4OTkxCitSeWF6YW5za2HvYSBvYmxhc3Q7VWtob2xvdnNraXkgOiAxIDogMTMzNzYKK1J5YXphbnNrYe9hIG9ibGFzdDtTa29waW5za2l5IDogMSA6IDM3NTUzCitTbW9sZW5za2HvYSBvYmxhc3Q7Um9zbGF2bCcgOiAxIDogNjA5MTYKK1RvdWxza2HvYSBvYmxhc3Q7S2ltb3ZzayA6IDEgOiAzNzMzMAorS2Fsb3Vqc2th72Egb2JsYXN0O1VseWFub3Zza2l5IDogMSA6IDEyMDAzCitLYWxvdWpza2HvYSBvYmxhc3Q7THl1ZGlub3ZvIDogMSA6IDQ1NDkxCitLYWxvdWpza2HvYSBvYmxhc3Q7WmhpemRyaW5za2l5IDogMSA6IDEzNzE4CitCcnlhbnNrYe9hIG9ibGFzdDtEeWF0a292c2tpeSA6IDEgOiA0OTY1NgorUnlhemFuc2th72Egb2JsYXN0O1J5YXpoc2tpeSA6IDEgOiAzNTQ3MgorQnJ5YW5za2HvYSBvYmxhc3Q7RHVicm92c2tpeSA6IDEgOiAyMzE2NgorVG91bHNrYe9hIG9ibGFzdDtCb2dvcm9kaXRza2l5IDogMSA6IDEzODAwCitSeWF6YW5za2HvYSBvYmxhc3Q7U2tvcGluIDogMSA6IDM3OTQ5CitUb3Vsc2th72Egb2JsYXN0O1BsYXZza2l5IDogMSA6IDI4NzkyCitSeWF6YW5za2HvYSBvYmxhc3Q7TWlsb3NsYXZza2l5IDogMSA6IDIwNjEwCitUb3Vsc2th72Egb2JsYXN0O1RlcGxvLU9nYXJldnNraXkgOiAxIDogMTUzODkKK1RvdWxza2HvYSBvYmxhc3Q7QXJzZW55ZXZza2l5IDogMSA6IDEyOTA3CitUb3Vsc2th72Egb2JsYXN0O0JvZ29yb2RpdHNrIDogMSA6IDUxNjI3CitCcnlhbnNrYe9hIG9ibGFzdDtaaHVrb3Zza2l5IDogMSA6IDM4NDc2CitTbW9sZW5za2HvYSBvYmxhc3Q7WWVyc2hpY2hza2l5IDogMSA6IDExMTc2CitLYWxvdWpza2HvYSBvYmxhc3Q7S2h2YXN0b3ZpY2hza2l5IDogMSA6IDE0ODI3CitUb3Vsc2th72Egb2JsYXN0O1ZvbG92c2tpeSA6IDEgOiAxNzU3MworVG91bHNrYe9hIG9ibGFzdDtLdXJraW5za2l5IDogMSA6IDE1MDkxCitUb3Vsc2th72Egb2JsYXN0O0NoZXJuc2tpeSA6IDEgOiAyMjkzNAorQnJ5YW5za2HvYSBvYmxhc3Q7S2xldG55YW5za2l5IDogMSA6IDI0MTczCitSeWF6YW5za2HvYSBvYmxhc3Q7Tm92b2RlcmV2ZW5za2l5IDogMSA6IDEzNDc1CitPcmxvdnNrYe9hIG9ibGFzdDtCb2xraG92c2tpeSA6IDEgOiAyMzUyNAorQnJ5YW5za2HvYSBvYmxhc3Q7RHlhdCdrb3ZvIDogMSA6IDM1MjUzCitCcnlhbnNrYe9hIG9ibGFzdDtCcnlhbnNraXkgOiAxIDogNTM3ODYKK09ybG92c2th72Egb2JsYXN0O1puYW1lbnNraXkgOiAxIDogNzIzOAorT3Jsb3Zza2HvYSBvYmxhc3Q7TXRzZW5za2l5IDogMSA6IDIyODIwCitUb3Vsc2th72Egb2JsYXN0O0thbWVuc2tpeSA6IDEgOiAxMTMxOAorVG91bHNrYe9hIG9ibGFzdDtZZWZyZW1vdnNraXkgOiAxIDogMjQ5MjAKK09ybG92c2th72Egb2JsYXN0O0tob3R5bmV0c2tpeSA6IDEgOiAxMzE2OQorQnJ5YW5za2HvYSBvYmxhc3Q7S2FyYWNoZXZza2l5IDogMSA6IDQxODAwCitCcnlhbnNrYe9hIG9ibGFzdDtTdXJhemhza2l5IDogMSA6IDMwNzIwCitCcnlhbnNrYe9hIG9ibGFzdDtCcnlhbnNrIDogMSA6IDQ4MTk1OQorQnJ5YW5za2HvYSBvYmxhc3Q7WmhpcnlhdGluc2tpeSA6IDEgOiA5MzY3CitSVS1VTkstMjg2NiA6IDEgOiAyMDQ0NworT3Jsb3Zza2HvYSBvYmxhc3Q7TXplbnNrIDogMSA6IDUwODY3CitCcnlhbnNrYe9hIG9ibGFzdDtNZ2xpbnNraXkgOiAxIDogMjQ1NzYKK09ybG92c2th72Egb2JsYXN0O0tvcnNha292c2tpeSA6IDEgOiA2MDMyCitPcmxvdnNrYe9hIG9ibGFzdDtPcmxvdnNraXkgOiAxIDogNjQ0MzkKK0JyeWFuc2th72Egb2JsYXN0O0tyYXNub2dvcnNraXkgOiAxIDogMTYyMTYKK0JyeWFuc2th72Egb2JsYXN0O1Z5Z29uaWNoc2tpeSA6IDEgOiAyMzg3MQorQnJ5YW5za2HvYSBvYmxhc3Q7UG9jaGVwc2tpeSA6IDEgOiA0ODg1MQorT3Jsb3Zza2HvYSBvYmxhc3Q7Tm92b3NpbHNraXkgOiAxIDogMTIyNjQKK09ybG92c2th72Egb2JsYXN0O1VyaXRza2l5IDogMSA6IDE5NzA0CitUb3Vsc2th72Egb2JsYXN0O0VmcmVtb3YgOiAxIDogNTU0OTkKK0JyeWFuc2th72Egb2JsYXN0O0dvcmRleWV2c2tpeSA6IDEgOiAxNDcwNgorT3Jsb3Zza2HvYSBvYmxhc3Q7Tm92b2RlcmV2ZW5rb3Zza2l5IDogMSA6IDE1NDgxCitCcnlhbnNrYe9hIG9ibGFzdDtOYXZsaW5za2l5IDogMSA6IDMyMTMxCitPcmxvdnNrYe9hIG9ibGFzdDtaYWxlZ29zY2hlbnNraXkgOiAxIDogMTk5MDUKK09ybG92c2th72Egb2JsYXN0O1NoYWJseWtpbnNraXkgOiAxIDogMTA5NTgKK09ybG92c2th72Egb2JsYXN0O09yeW9sIDogMSA6IDM0NDgxMworQnJ5YW5za2HvYSBvYmxhc3Q7VW5lY2hza2l5IDogMSA6IDQ4OTUxCitPcmxvdnNrYe9hIG9ibGFzdDtWZXJraG92c2tpeSA6IDEgOiAyNDYzMAorQnJ5YW5za2HvYSBvYmxhc3Q7S2xpbnRzb3Zza2l5IDogMSA6IDI3Mzk3CitPcmxvdnNrYe9hIG9ibGFzdDtLcmFzbm96b3JlbnNraXkgOiAxIDogOTQ1MAorT3Jsb3Zza2HvYSBvYmxhc3Q7U29za292c2tpeSA6IDEgOiA5NTUwCitCcnlhbnNrYe9hIG9ibGFzdDtUcnViY2hldnNraXkgOiAxIDogNDQ3MjEKK09ybG92c2th72Egb2JsYXN0O1N2ZXJkbG92c2tpeSA6IDEgOiAxOTcwNAorT3Jsb3Zza2HvYSBvYmxhc3Q7S3JvbXNraXkgOiAxIDogMjUzMzMKK0JyeWFuc2th72Egb2JsYXN0O0JyYXNvdnNraXkgOiAxIDogMjc0OTcKK0JyeWFuc2th72Egb2JsYXN0O0tsaW50c3kgOiAxIDogNzg3NjUKK09ybG92c2th72Egb2JsYXN0O1Bva3JvdnNraXkgOiAxIDogMjA1MDgKK0JyeWFuc2th72Egb2JsYXN0O05vdm96eWJrb3Zza2l5IDogMSA6IDE1MzEwCitCcnlhbnNrYe9hIG9ibGFzdDtTdGFyb2R1YnNraXkgOiAxIDogNTAyNjEKK0JyeWFuc2th72Egb2JsYXN0O1BvZ2Fyc2tpeSA6IDEgOiAzODU3NworT3Jsb3Zza2HvYSBvYmxhc3Q7RG1pdHJvdnNraXkgOiAxIDogMTc5OTUKK09ybG92c2th72Egb2JsYXN0O0xpdmVuc2tpeSA6IDEgOiAzNTA4NAorQnJ5YW5za2HvYSBvYmxhc3Q7U3V6ZW1za2l5IDogMSA6IDIxMTUyCitPcmxvdnNrYe9hIG9ibGFzdDtHbGF6dW5vdnNraXkgOiAxIDogMTY4ODkKK09ybG92c2th72Egb2JsYXN0O01hbG9hcmtoYW5nZWxza2l5IDogMSA6IDE1ODg0CitCcnlhbnNrYe9hIG9ibGFzdDtOb3Zvenlia292IDogMSA6IDQyNTA1CitCcnlhbnNrYe9hIG9ibGFzdDtLbGltb3Zza2l5IDogMSA6IDQwMzkwCitCcnlhbnNrYe9hIG9ibGFzdDtLb21hcmljaHNraXkgOiAxIDogMjE3NTYKK09ybG92c2th72Egb2JsYXN0O1Ryb3NueWFuc2tpeSA6IDEgOiAxNDI3NQorT3Jsb3Zza2HvYSBvYmxhc3Q7TGl2bnkgOiAxIDogNTM1ODIKK0JyeWFuc2th72Egb2JsYXN0O1pseW5rb3Zza2l5IDogMSA6IDE1MzEwCitPcmxvdnNrYe9hIG9ibGFzdDtLb2xwbnlhbnNraXkgOiAxIDogMjIxMTYKK0JyeWFuc2th72Egb2JsYXN0O1NldnNraXkgOiAxIDogMjE1NTUKK09ybG92c2th72Egb2JsYXN0O0RvbHpoYW5za2l5IDogMSA6IDE1MzgxCitSVS1VTkstMjg2NyA6IDEgOiA0MzAyMgorUlUtVU5LLTI4NjggOiAxIDogNjUwNDYKK1JVLVVOSy0yODY5IDogMSA6IDE2ODcxCitSVS1VTkstMjg3MCA6IDEgOiAyNTQwMQorUlUtVU5LLTI4NzEgOiAxIDogMjg3ODgKK1JVLVVOSy0yODcyIDogMSA6IDU5MDY5CitSVS1VTkstMjg3MyA6IDEgOiAzNjc1NgorUlUtVU5LLTI4NzQgOiAxIDogMjA0NDcKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7Vnlib3Jnc2tpeSA6IDEgOiAxMTA5MDYKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7UG9kcG9yb3poc2tpeSA6IDEgOiAxNzg2NQorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztQcmlvemVyc2tpeSA6IDEgOiA0MzE1OAorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztQcmlvemVyc2sgOiAxIDogMjAyNzQKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7TG9kZXlub3BvbHNraXkgOiAxIDogMTM4NTEKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7UG9kcG9yb3poeWUgOiAxIDogMjMyODUKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7TG9kZXlub3llIFBvbGUgOiAxIDogMjU0OTMKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7Vnlib3JnIDogMSA6IDgwNzk2CitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO1ZvbGtob3Zza2l5IDogMSA6IDU4MTEzCitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO1ZzZXZvbHpoc2tpeSA6IDEgOiAxNDI1MjIKK1Nhbmt0LVBldGVyYnVyZztTYW5rdC1QZXRlcnNidXJnIDogMSA6IDQ4NDA1NDMKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7VGlraHZpbnNraXkgOiAxIDogMTY4NjIKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7TG9tb25vc292c2tpeSA6IDEgOiA2NzQ0NworTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztCb2tzaXRvZ29yc2tpeSA6IDEgOiAyMzg4OAorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztWc2V2b2xvemhzayA6IDEgOiAzMzAyMQorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztLaXJvdnNraXkgOiAxIDogNzU2NzcKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7U29zbm92eWkgQm9yIDogMSA6IDU4NzE1CitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO0tpbmdpc2VwcHNraXkgOiAxIDogMjM5ODgKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7Vm9sa2hvdiA6IDEgOiA0ODg3OQorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztLaXJvdnNrIDogMSA6IDIzNjg3CitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO0tpcmlzaHNraXkgOiAxIDogMTQzNTMKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7VG9zbmVuc2tpeSA6IDEgOiA3NzE4MworTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztHYXRjaGluc2tpeSA6IDEgOiAxMzI0ODUKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7Vm9sb3NvdnNraXkgOiAxIDogNDY1NzEKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7VGlraHZpbiA6IDEgOiA3MTc2MworTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztHYXRjaGluYSA6IDEgOiA4MjcwMworTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztUb3NubyA6IDEgOiAzNDUyNgorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztCb2tzaXRvZ29yc2sgOiAxIDogMjE2NzkKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7SXZhbmdvcm9kIDogMSA6IDExNjQzCitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO0tpbmdpc2VwcCA6IDEgOiA1MTM4OAorTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztQaWthbGV2byA6IDEgOiAyNTI5MworTGVuaW5ncmFkc2th72Egb2JsYXN0IHLpcztTbGFudHNldnNraXkgOiAxIDogMTEwNDAKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7S2lyaXNoaSA6IDEgOiA1NDYwMAorTm92Z29yb2Rza2HvYSBvYmxhc3Q7Q2h1ZG92c2tpeSA6IDEgOiAyNjcyMworTm92Z29yb2Rza2HvYSBvYmxhc3Q7THl1Ynl0aW5za2l5IDogMSA6IDE0NzAyCitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO0x1emhza2l5IDogMSA6IDQ1OTY4CitOb3Znb3JvZHNrYe9hIG9ibGFzdDtLaHZveW5pbnNraXkgOiAxIDogMTg4NzUKK05vdmdvcm9kc2th72Egb2JsYXN0O01hbG92aXNoZXJza2l5IDogMSA6IDIzOTQxCitMZW5pbmdyYWRza2HvYSBvYmxhc3QgculzO1NsYW50c3kgOiAxIDogNDE3NTMKK05vdmdvcm9kc2th72Egb2JsYXN0O05vdmdvcm9kc2tpeSA6IDEgOiA1NTAzNAorUHNrb3Zza2HvYSBvYmxhc3Q7R2RvdnNraXkgOiAxIDogMTk5OTYKK1Bza292c2th72Egb2JsYXN0O1BseXVzc2tpeSA6IDEgOiAxMzgyOAorTm92Z29yb2Rza2HvYSBvYmxhc3Q7QmF0ZXRza2l5IDogMSA6IDc0NTEKK0xlbmluZ3JhZHNrYe9hIG9ibGFzdCBy6XM7THVnYSA6IDEgOiA0MTQ1MgorTm92Z29yb2Rza2HvYSBvYmxhc3Q7UGVzdG92c2tpeSA6IDEgOiAyNTYzMAorTm92Z29yb2Rza2HvYSBvYmxhc3Q7Qm9yb3ZpY2hza2l5IDogMSA6IDIwOTYxCitOb3Znb3JvZHNrYe9hIG9ibGFzdDtNb3NoZW5za2l5IDogMSA6IDEwNTMwCitOb3Znb3JvZHNrYe9hIG9ibGFzdDtPa3Vsb3Zza2l5IDogMSA6IDM1MjY2CitOb3Znb3JvZHNrYe9hIG9ibGFzdDtOb3Znb3JvZCA6IDEgOiAyMzk0MTAKK1Bza292c2th72Egb2JsYXN0O1N0cnVnby1LcmFzbmVuc2tpeSA6IDEgOiAxNjAxNworTm92Z29yb2Rza2HvYSBvYmxhc3Q7S3Jlc3RldHNraXkgOiAxIDogMTY1OTAKK05vdmdvcm9kc2th72Egb2JsYXN0O1NoaW1za2l5IDogMSA6IDEzMzEyCitOb3Znb3JvZHNrYe9hIG9ibGFzdDtCb3JvdmljaGkgOiAxIDogNjE3OTAKK1Bza292c2th72Egb2JsYXN0O1Bza292c2tpeSA6IDEgOiAzNjkwOAorTm92Z29yb2Rza2HvYSBvYmxhc3Q7U29sZXRza2l5IDogMSA6IDE5ODY4CitOb3Znb3JvZHNrYe9hIG9ibGFzdDtTdGFyb3J1c3NraXkgOiAxIDogMTg1NzcKK05vdmdvcm9kc2th72Egb2JsYXN0O1BhcmZpbm8gOiAxIDogMTY5ODcKK05vdmdvcm9kc2th72Egb2JsYXN0O1ZhbGRheXNraXkgOiAxIDogMzIyODYKK1Bza292c2th72Egb2JsYXN0O1Bvcmtob3Zza2l5IDogMSA6IDMzNzI1CitOb3Znb3JvZHNrYe9hIG9ibGFzdDtEZW15YW5za2l5IDogMSA6IDE4Mjc5CitOb3Znb3JvZHNrYe9hIG9ibGFzdDtWb2xvdG92c2tpeSA6IDEgOiA2ODU0CitOb3Znb3JvZHNrYe9hIG9ibGFzdDtTdGFyYXlhIFJ1c3NhIDogMSA6IDQwMDM0CitQc2tvdnNrYe9hIG9ibGFzdDtQZWNob3Jza2l5IDogMSA6IDI3NTU3CitQc2tvdnNrYe9hIG9ibGFzdDtEbm92c2tpeSA6IDEgOiAxOTIwMAorUHNrb3Zza2HvYSBvYmxhc3Q7UHNrb3YgOiAxIDogMjA2OTI1CitOb3Znb3JvZHNrYe9hIG9ibGFzdDtQb2Rkb3Jza2l5IDogMSA6IDY2NTYKK1Bza292c2th72Egb2JsYXN0O1BhbGtpbnNraXkgOiAxIDogMTE5MzgKK1Bza292c2th72Egb2JsYXN0O0RlZG92aWNoZXNraXkgOiAxIDogMTg3MDMKK1Bza292c2th72Egb2JsYXN0O09zdHJvdnNraXkgOiAxIDogMTMzMzEKK05vdmdvcm9kc2th72Egb2JsYXN0O01hcmV2c2tpeSA6IDEgOiA2NDU3CitQc2tvdnNrYe9hIG9ibGFzdDtCZXpoYW5pdHNraXkgOiAxIDogMjEyODkKK1Bza292c2th72Egb2JsYXN0O1B5dGFsb3Zza2l5IDogMSA6IDE1NTE5CitOb3Znb3JvZHNrYe9hIG9ibGFzdDtLaG9sbXNraXkgOiAxIDogODg0MQorUHNrb3Zza2HvYSBvYmxhc3Q7Tm92b3J6aGV2c2tpeSA6IDEgOiAxNTEyMQorUHNrb3Zza2HvYSBvYmxhc3Q7T3N0cm92IDogMSA6IDI4ODUwCitQc2tvdnNrYe9hIG9ibGFzdDtMb2tueWFuc2tpeSA6IDEgOiAxNTgxOAorUHNrb3Zza2HvYSBvYmxhc3Q7UHVzaGtpbm8tR29yc2tpeSA6IDEgOiAxMzAzMgorUHNrb3Zza2HvYSBvYmxhc3Q7S3Jhc25vZ29yb2Rza2l5IDogMSA6IDExNzM5CitQc2tvdnNrYe9hIG9ibGFzdDtPcG9jaGVuc2tpeSA6IDEgOiAyODA1NAorUHNrb3Zza2HvYSBvYmxhc3Q7VmVsaWtvbHVrc2tpeSA6IDEgOiAyODQ1MgorUHNrb3Zza2HvYSBvYmxhc3Q7Tm92b3Nva29sbmljaGVza2l5IDogMSA6IDIwNzkyCitQc2tvdnNrYe9hIG9ibGFzdDtQdXN0b3Noa2luc2tpeSA6IDEgOiAxMzgyOAorUHNrb3Zza2HvYSBvYmxhc3Q7U2ViZXpoc2tpeSA6IDEgOiAyNjQ2MworUHNrb3Zza2HvYSBvYmxhc3Q7S3VueWluc2tpeSA6IDEgOiAxNjUxNAorUHNrb3Zza2HvYSBvYmxhc3Q7VmVsaWtpZSBMdWtpIDogMSA6IDExNTQwMQorUHNrb3Zza2HvYSBvYmxhc3Q7TmV2ZWxza2l5IDogMSA6IDM3NTA1CitQc2tvdnNrYe9hIG9ibGFzdDtVc3Z5YXRza2l5IDogMSA6IDc5NTkKK1Jvc3RvdnNrYe9hIG9ibGFzdDtWZXJraG5lZG9uc2tveSA6IDEgOiAyNjYzNgorUm9zdG92c2th72Egb2JsYXN0O1Nob2xva2hvdnNraXkgOiAxIDogMzAxNjgKK1Jvc3RvdnNrYe9hIG9ibGFzdDtDaGVydGtvdnNraXkgOiAxIDogNDA2NjEKK1Jvc3RvdnNrYe9hIG9ibGFzdDtCb2tvdnNraXkgOiAxIDogMTg3NjcKK1Jvc3RvdnNrYe9hIG9ibGFzdDtLYXNoYXJza2l5IDogMSA6IDMwMjY5CitSb3N0b3Zza2HvYSBvYmxhc3Q7TWlsbGVyb3Zza2l5IDogMSA6IDM3MDI5CitSb3N0b3Zza2HvYSBvYmxhc3Q7U292ZXRza2l5IDogMSA6IDg5ODAKK1Jvc3RvdnNrYe9hIG9ibGFzdDtNaWxsZXJvdm8gOiAxIDogMzg4NDUKK1Jvc3RvdnNrYe9hIG9ibGFzdDtNaWx5dXRpbnNraXkgOiAxIDogMjAxNzkKK1Jvc3RvdnNrYe9hIG9ibGFzdDtPYmxpdnNraXkgOiAxIDogMjEwODcKK1Jvc3RvdnNrYe9hIG9ibGFzdDtUYXJhc292c2tpeSA6IDEgOiAzNDYwNworUm9zdG92c2th72Egb2JsYXN0O0thbWVuc2tpeSA6IDEgOiA1Mzg3OAorUm9zdG92c2th72Egb2JsYXN0O0JlbG9rYWxpdHZpbnNraXkgOiAxIDogMjg0NTMKK1Jvc3RvdnNrYe9hIG9ibGFzdDtUYXRzeW5za2l5IDogMSA6IDQ0NDk1CitSb3N0b3Zza2HvYSBvYmxhc3Q7TW9yb3pvdnNraXkgOiAxIDogNDYxMDkKK1Jvc3RvdnNrYe9hIG9ibGFzdDtEb25ldHNrIDogMSA6IDU1MTkwCitSb3N0b3Zza2HvYSBvYmxhc3Q7S2FtZW5zay1TaGFraHRpbnNraXkgOiAxIDogOTcyNjQKK1Jvc3RvdnNrYe9hIG9ibGFzdDtCZWxheWEgS2FsaXR2YSA6IDEgOiA5NTk1MgorUm9zdG92c2th72Egb2JsYXN0O0tyYXNub3N1bGluc2tpeSA6IDEgOiAzNDQwNQorUm9zdG92c2th72Egb2JsYXN0O0d1a292byA6IDEgOiA3ODM5NgorUm9zdG92c2th72Egb2JsYXN0O1RzeW1seWFuc2tpeSA6IDEgOiAzNTAxMQorUm9zdG92c2th72Egb2JsYXN0O1p2ZXJldm8gOiAxIDogMzMyOTYKK1Jvc3RvdnNrYe9hIG9ibGFzdDtLb25zdGFudGlub3Zza2l5IDogMSA6IDM3NzM1CitSb3N0b3Zza2HvYSBvYmxhc3Q7S3Jhc255aSBTdWxpbiA6IDEgOiA0NjYxNAorUm9zdG92c2th72Egb2JsYXN0O1VzdC1Eb25ldHNraXkgOiAxIDogMzEzNzkKK1Jvc3RvdnNrYe9hIG9ibGFzdDtSb2Rpb25vdm8tTmVzdmV0YXlza2l5IDogMSA6IDIyNjAxCitSb3N0b3Zza2HvYSBvYmxhc3Q7S3V5YnlzaGV2c2tpeSA6IDEgOiAxNDgzMgorUm9zdG92c2th72Egb2JsYXN0O05vdm9zaGFraHRpbnNrIDogMSA6IDEyMzM5NQorUm9zdG92c2th72Egb2JsYXN0O09rdHlhYnJza2l5IDogMSA6IDY4NDA3CitSb3N0b3Zza2HvYSBvYmxhc3Q7U2hha2h0eSA6IDEgOiAyNTk4MDcKK1Jvc3RvdnNrYe9hIG9ibGFzdDtNYXR2ZXlldm8tS3VyZ2Fuc2tpeSA6IDEgOiA0NDM5NAorUm9zdG92c2th72Egb2JsYXN0O0R1Ym92c2tpeSA6IDEgOiAyNzE0MQorUm9zdG92c2th72Egb2JsYXN0O1ZvbGdvZG9uc2tpeSA6IDEgOiAyNjkzOQorUm9zdG92c2th72Egb2JsYXN0O1NlbWlrYXJha29yc2tpeSA6IDEgOiA1NDc4NgorUm9zdG92c2th72Egb2JsYXN0O05la2xpbm92c2tpeSA6IDEgOiA3OTQwNQorUm9zdG92c2th72Egb2JsYXN0O1ZvbGdvZG9uc2sgOiAxIDogMTkzMDE0CitSb3N0b3Zza2HvYSBvYmxhc3Q7WmF2ZXRpbnNraXkgOiAxIDogMjAwNzgKK1Jvc3RvdnNrYe9hIG9ibGFzdDtBa3NheXNraXkgOiAxIDogNzQ5NjYKK1Jvc3RvdnNrYe9hIG9ibGFzdDtNeWFzbmlrb3Zza2l5IDogMSA6IDM0MTAzCitSb3N0b3Zza2HvYSBvYmxhc3Q7Tm92b2NoZXJrYXNzayA6IDEgOiAyMDIyOTYKK1Jvc3RvdnNrYe9hIG9ibGFzdDtNYXJ0eW5vdnNraXkgOiAxIDogMzUxMTIKK1Jvc3RvdnNrYe9hIG9ibGFzdDtaaW1vdm5pa292c2tpeSA6IDEgOiAzOTY1MgorUm9zdG92c2th72Egb2JsYXN0O0JhZ2F5ZXZza2l5IDogMSA6IDM0NTA2CitSb3N0b3Zza2HvYSBvYmxhc3Q7Um9zdG92LW5hLURvbnkgOiAxIDogMTAyMjY4MAorUm9zdG92c2th72Egb2JsYXN0O1Zlc2Vsb3Zza2l5IDogMSA6IDI0NjE5CitSb3N0b3Zza2HvYSBvYmxhc3Q7VGFnYW5yb2cgOiAxIDogMjkzNjA3CitSb3N0b3Zza2HvYSBvYmxhc3Q7QXpvdnNraXkgOiAxIDogODcyNzUKK1Jvc3RvdnNrYe9hIG9ibGFzdDtQcm9sZXRhcnNraXkgOiAxIDogMzc3MzUKK1Jvc3RvdnNrYe9hIG9ibGFzdDtCYXRheXNrIDogMSA6IDk1MTQ1CitSb3N0b3Zza2HvYSBvYmxhc3Q7T3Jsb3Zza2l5IDogMSA6IDQwMTU3CitSb3N0b3Zza2HvYSBvYmxhc3Q7QXpvdiA6IDEgOiA4MjIzMAorUm9zdG92c2th72Egb2JsYXN0O0thZ2Fsbml0c2tpeSA6IDEgOiAyOTQ2MgorUm9zdG92c2th72Egb2JsYXN0O1plcm5vZ3JhZHNraXkgOiAxIDogNjU4ODUKK1Jvc3RvdnNrYe9hIG9ibGFzdDtTYWxza2l5IDogMSA6IDUwNjUwCitSb3N0b3Zza2HvYSBvYmxhc3Q7VHNlbGluc2tpeSA6IDEgOiAzNjUyNAorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtTY2hlcmJpbm92c2tpeSA6IDEgOiAzOTE3MQorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtLdXNjaGV2c2tpeSA6IDEgOiA3MTQzNgorUm9zdG92c2th72Egb2JsYXN0O1JlbW9udG5lbnNraXkgOiAxIDogMjQ2MTkKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7WWV5c2sgOiAxIDogOTIwNTIKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7WWV5c2tpeSA6IDEgOiA0MzkxMworUm9zdG92c2th72Egb2JsYXN0O1llZ29ybHlrc2tpeSA6IDEgOiAzNTIxMworS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtTdGFyb21pbnNraXkgOiAxIDogNDA3MTcKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7S3J5bG92c2tpeSA6IDEgOiAzNzQxOQorUm9zdG92c2th72Egb2JsYXN0O1NhbHNrIDogMSA6IDYzODY3CitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0xlbmluZ3JhZHNraXkgOiAxIDogNjc4MjgKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7S2FuZXZza2l5IDogMSA6IDk2Mjc5CitSb3N0b3Zza2HvYSBvYmxhc3Q7UGVzY2hhbm9rb3Bza2l5IDogMSA6IDM1MjEzCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO05vdm9wb2tyb3Zza2l5IDogMSA6IDQ5Nzg5CitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0JlbG9nbGluc2tpeSA6IDEgOiAzNjI4NQorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtQYXZsb3Zza2l5IDogMSA6IDY4ODU5CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO0FwYW5hc2Vua292c2tpeSA6IDEgOiAzODIxNgorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtQcmltb3Jza28tQWtodGFyc2tpeSA6IDEgOiA1OTA2NgorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtJcGF0b3Zza2l5IDogMSA6IDcxNzk3CitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO1Rpa2hvcmV0c2tpeSA6IDEgOiA2MTc0NgorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtCcnl1a2hvdmV0c2tpeSA6IDEgOiA1NDExOAorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtLcmFzbm9ndmFyZGV5c2tpeSA6IDEgOiA0MzI2NAorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtUaWtob3JldHprIDogMSA6IDcwNDA1CitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO1Z5c2Vsa292c2tpeSA6IDEgOiA2MDgxOAorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtUcnVub3Zza2l5IDogMSA6IDM1MzMyCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0tvcmVub3Zza2l5IDogMSA6IDg0MDEyCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0thbGluaW5za2l5IDogMSA6IDQ4NjU1CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO05vdm9hbGVrc2FuZHJvdnNraXkgOiAxIDogNjU1MTQKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7VGltYXNoZXZza2l5IDogMSA6IDEwMjI1NworS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtTbGF2eWFuc2tpeSA6IDEgOiA2NTA0NQorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtUdXJrbWVuc2tpeSA6IDEgOiAzMDA3OQorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtLYXZrYXpza2l5IDogMSA6IDQ1NzY4CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO0l6b2JpbG5lbnNraXkgOiAxIDogOTU3OTgKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7QXJ6Z2lyenNraXkgOiAxIDogMzIzNDUKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7VGJpbGlzc2tpeSA6IDEgOiA0ODY1NQorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtQZXRyb3Zza2l5IDogMSA6IDg0NDY3CitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0tyYXNub2FybWV5c2tpeSA6IDEgOiA5ODk1OQorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtLcmFzbm9kYXIgOiAxIDogNzc0NjYxCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0tyb3BvdGtpbiA6IDEgOiA3OTU3OQorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtHcmFjaGV2c2tpeSA6IDEgOiAzNTk1MAorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtUZW1yeXVrc2tpeSA6IDEgOiAxMTM0OTMKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7VXN0LUxhYmluc2tpeSA6IDEgOiAxMDczMDgKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7TGV2b2t1bXNraXkgOiAxIDogNDUxMTgKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7R3Vsa2V2aWNoc2tpeSA6IDEgOiAxMDAwOTMKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7RGluc2tpeSA6IDEgOiAxMTQyMTUKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7QmxhZ29kYXJuZW5za2l5IDogMSA6IDYzMTQ1CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO1NocGFrb3Zza2l5IDogMSA6IDkxMjY2CitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO1NsYXZ5YW5zay1OYS1LdWJhbmkgOiAxIDogNjE3NDYKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7Tm92b2t1YmFuc2tpeSA6IDEgOiA4MzU5OQorUmVzcG91Ymxpa2EgQWR5Z2XvYTtLcmFzbm9ndmFyZGV5c2tpeSA6IDEgOiAzMTQ5NgorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtLdXJnYW5pbnNraXkgOiAxIDogMTAwNjA4CitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0FuYXBza2l5IDogMSA6IDYxNzQ2CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO1N0YXZyb3BvbCA6IDEgOiAzNDE3ODQKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7S3J5bXNraXkgOiAxIDogNzIxNTcKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7QWJpbnNraXkgOiAxIDogOTA3MTIKK1Jlc3BvdWJsaWthIEFkeWdl72E7U2hvdmdlbm92c2tpeSA6IDEgOiAxNzcxMAorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtCdWRlbm5vdnNraXkgOiAxIDogNTI4NDQKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7QXJtYXZpciA6IDEgOiAxODMyODAKK1Jlc3BvdWJsaWthIEFkeWdl72E7VGFraHRhbXVrYXlza2l5IDogMSA6IDY1OTEwCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0FuYXBhIDogMSA6IDU5ODkxCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO1NldmVyc2tpeSA6IDEgOiAxMDQzMTkKK1Jlc3BvdWJsaWthIEFkeWdl72E7S29zaGVraGFibHNraXkgOiAxIDogMzEwOTQKK1Jlc3BvdWJsaWthIEFkeWdl72E7VGV1Y2hlemhza2l5IDogMSA6IDIxNzM1CitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO1VzcGVuc2tpeSA6IDEgOiAzOTQ4MAorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtLb2NodWJleWV2c2tpeSA6IDEgOiA3Nzg3NQorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtBbGVrc2FuZHJvdnNraXkgOiAxIDogNTMzNTkKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7TmVmdGVrdW1za2l5IDogMSA6IDY4MDg5CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO0FuZHJvcG92c2tpeSA6IDEgOiAzNjA1MworU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtOb3Zvc2VsaXRza2l5IDogMSA6IDI1ODU1CitEYWdlc3RhbjtOb2dheXNraXkgOiAxIDogMTg2MzgKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7QmVsb3JlY2huc2tpeSA6IDEgOiA0MTk1NAorRGFnZXN0YW47VGFydW1vdnNraXkgOiAxIDogMzYyMTYKK1Jlc3BvdWJsaWthIEFkeWdl72E7R2lhZ2luc2tpeSA6IDEgOiAzNDQxNAorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtOb3Zvcm9zc2l5c2sgOiAxIDogMjQ0OTIzCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0tyeW1zayA6IDEgOiA1NDczNworU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtCdWRlbm5vdnNrIDogMSA6IDYwODc4CitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0dvcnlhY2hpeSBLbHl1Y2ggOiAxIDogNTE3NDcKK1JVLVVOSy0yODc1IDogMSA6IDEyNjc5CitSZXNwb3VibGlrYSBBZHlnZe9hO01heWtvcHNraXkgOiAxIDogNTg3NjYKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7QmVsb3JlY2hlbnNrIDogMSA6IDU4OTYzCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0dlbGVuZHpoaWsgOiAxIDogNzg1NDgKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7TGFiaW5zayA6IDEgOiA2MzM5NQorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtMYWJpbnNraXkgOiAxIDogNDAyMDIKK0tyYXNub2RhcnNraSBrcmHvIHLpc2lkdWU7TW9zdG92c2tpeSA6IDEgOiA3MTk1MQorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtOZXZpbm5vbXlzc2sgOiAxIDogMTI5NzkxCitSVS1VTkstMjg3NiA6IDEgOiAxMzM0MworUmVzcG91Ymxpa2EgQWR5Z2XvYTtNYXlrb3AgOiAxIDogMTc1MjkxCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO0Fwc2hlcm9uc2tpeSA6IDEgOiA5Mjg3NworS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtPdHJhZG5lbnNraXkgOiAxIDogNjc2MjIKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7R2VvcmdpeWV2c2tpeSA6IDEgOiA3MDE0OQorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtTb3ZldHNraXkgOiAxIDogNzE3OTcKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7TWluZXJhbG92b2Rza2l5IDogMSA6IDQyOTU1CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO1N0ZXBub3Zza2l5IDogMSA6IDIyNjYyCitLYXJhdGNoYWV2by1UY2hlcmtlc3NrYe9hO0FkeWdlLUtoYWJsc2tpeSA6IDEgOiAyODUwNQorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtUdWFwc2luc2tpeSA6IDEgOiA1MzkxMgorS2FyYXRjaGFldm8tVGNoZXJrZXNza2HvYTtQcmlrdWJhbnNraXkgOiAxIDogMzM4NDMKK0RhZ2VzdGFuO0tpemx5YXJza2l5IDogMSA6IDUzNDc3CitTdGF2cm9wb2xza2kga3Jh7yBy6XNpZHVlO1ByZWRnb3JueWkgOiAxIDogOTUyODMKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7S3Vyc2tpeSA6IDEgOiA0ODUxNworS2FyYXRjaGFldm8tVGNoZXJrZXNza2HvYTtDaGVya2Vzc2sgOiAxIDogMTE5MzU5CitLYXJhdGNoYWV2by1UY2hlcmtlc3NrYe9hO0toYWJlenNraXkgOiAxIDogMjc5MDEKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7TWluZXJhbG5peWUgVm9keSA6IDEgOiA4NzQ1NQorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtHZW9yZ2l5ZXZzayA6IDEgOiA3NTE5NworU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtLaXJvdnNraXkgOiAxIDogNjIzMjAKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7WmhlbGV6bm92b2RzayA6IDEgOiA0ODQxNAorS2FyYXRjaGFldm8tVGNoZXJrZXNza2HvYTtVc3QtRHpoZWd1dGluc2tpeSA6IDEgOiA1MDY2NAorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtMZXJtb250b3YgOiAxIDogMjU0NDMKK0thcmF0Y2hhZXZvLVRjaGVya2Vzc2th72E7WmVsZW5jaHVnc2tpeSA6IDEgOiA1Mzg4OAorS2FyYXRjaGFldm8tVGNoZXJrZXNza2HvYTtVcnVwc2tpeSA6IDEgOiAyMjY2MworU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtQeWF0aWdvcnNrIDogMSA6IDE4OTAyMQorU3RhdnJvcG9sc2tpIGtyYe8gculzaWR1ZTtZZXNzZW50dWtpIDogMSA6IDkxMTYzCitLcmFzbm9kYXJza2kga3Jh7yBy6XNpZHVlO1NvY2hpIDogMSA6IDM4OTk1OQorS3Jhc25vZGFyc2tpIGtyYe8gculzaWR1ZTtUdWFwc2UgOiAxIDogNjcwMDMKK0thcmF0Y2hhZXZvLVRjaGVya2Vzc2th72E7TWFsb2thcmFjaGF5ZXZza2l5IDogMSA6IDM3NjcxCitUY2hldGNoZW5pYSo7TmF1cnNraXkgOiAxIDogNDE1MjkKK0thYmFyZGluby1CYWxrYXJpYTtQcm9raGxhZG5lbnNraXkgOiAxIDogNDMzNzEKK1N0YXZyb3BvbHNraSBrcmHvIHLpc2lkdWU7S2lzbG92b2RzayA6IDEgOiAxMTg1NjMKK1RjaGV0Y2hlbmlhKjtTaGVsa292c2tpeSA6IDEgOiAzOTM4OQorS2FiYXJkaW5vLUJhbGthcmlhO1pvbHNraXkgOiAxIDogNDE1NTUKK0RhZ2VzdGFuO01ha2hhY2hrYWxhIDogMSA6IDM5MjEzMQorS2FyYXRjaGFldm8tVGNoZXJrZXNza2HvYTtLYXJhY2hheWV2c2tpeSA6IDEgOiAyNjQ5MQorRGFnZXN0YW47QmFiYXl1cnRvdnNraXkgOiAxIDogMzQyMDQKK0RhZ2VzdGFuO0tpemx5YXIgOiAxIDogNDU2NDEKK0thYmFyZGluby1CYWxrYXJpYTtCYWtzYW5za2l5IDogMSA6IDEwMDQ1OAorU2V2ZXJvLU9zZXRpbnNrYe9hIHJlc3BvdTtNb3pkb2tza2l5IDogMSA6IDgwNjM0CitLYXJhdGNoYWV2by1UY2hlcmtlc3NrYe9hO0thcmFjaGF5ZXZzayA6IDEgOiAzMzc0MworS2FiYXJkaW5vLUJhbGthcmlhO1RlcnNraXkgOiAxIDogNDk2MjQKK0thYmFyZGluby1CYWxrYXJpYTtQcm9raGxhZG55aSA6IDEgOiA1OTIwNgorS2FiYXJkaW5vLUJhbGthcmlhO01heXNraXkgOiAxIDogMzc1MjEKK1RjaGV0Y2hlbmlhKjtOYWR0ZXJlY2hueWkgOiAxIDogMzI2MjQKK0thYmFyZGluby1CYWxrYXJpYTtVcnZhbnNraXkgOiAxIDogODU2MzIKK0thYmFyZGluby1CYWxrYXJpYTtDaGVnZW1za2l5IDogMSA6IDUxOTQ0CitJbmdvdWNoZXRpYSo7TWFsZ29iZWtza2l5IDogMSA6IDM4MzMwCitUY2hldGNoZW5pYSo7R3Jvem5lbnNraXkgOiAxIDogOTE1MzYKK0RhZ2VzdGFuO0toYXNhdnl1cnRvdnNraXkgOiAxIDogMTAyMjk1CitSVS1VTkstMjg3NyA6IDEgOiAyNTcwOTYKK0luZ291Y2hldGlhKjtTdW56aGVuc2tpeSA6IDEgOiA3OTE5OAorS2FiYXJkaW5vLUJhbGthcmlhO1NvdmV0c2tpeSA6IDEgOiAyMjA4OQorSW5nb3VjaGV0aWEqO01hbGdvYmVrIDogMSA6IDI2OTA3CitUY2hldGNoZW5pYSo7R3VkZXJtZXNza2l5IDogMSA6IDQ1MDQwCitLYWJhcmRpbm8tQmFsa2FyaWE7VHlybnlhdXogOiAxIDogMzgwMjUKK1NldmVyby1Pc2V0aW5za2HvYSByZXNwb3U7S2lyb3Zza2l5IDogMSA6IDI1NzMwCitUY2hldGNoZW5pYSo7R3Jvem55aSA6IDEgOiAzMDk5NzMKK1NldmVyby1Pc2V0aW5za2HvYSByZXNwb3U7UHJhdm9iZXJlemhueWkgOiAxIDogNTIxNjkKK0luZ291Y2hldGlhKjtOYXpyYW5vdnNraXkgOiAxIDogMTIxNTg5CitEYWdlc3RhbjtLaXppbHl1cnRvdnNraXkgOiAxIDogNDg5MjQKK1RjaGV0Y2hlbmlhKjtBY2hraG95LU1hcnRhbm92c2tpeSA6IDEgOiA1MzI2MQorVGNoZXRjaGVuaWEqO0d1ZGVybWVzIDogMSA6IDMyNDUzCitUY2hldGNoZW5pYSo7U2hhbGluc2tpeSA6IDEgOiA4MDQ5MAorVGNoZXRjaGVuaWEqO0FyZ3VuIDogMSA6IDIzNjMzCitTZXZlcm8tT3NldGluc2th72EgcmVzcG91O1ByaWdvcm9kbnlpIDogMSA6IDcwNzA2CitTZXZlcm8tT3NldGluc2th72EgcmVzcG91O0lyYWZza2l5IDogMSA6IDE1OTA0CitEYWdlc3RhbjtLaGFzYXZ5dXJ0IDogMSA6IDc5MTA0CitTZXZlcm8tT3NldGluc2th72EgcmVzcG91O0RpZ29yc2tpeSA6IDEgOiAyMDQ2MgorU2V2ZXJvLU9zZXRpbnNrYe9hIHJlc3BvdTtBcmRvbnNraXkgOiAxIDogMjU0MjYKK0RhZ2VzdGFuO05vdm9sYWtza2l5IDogMSA6IDE1MjQ5CitEYWdlc3RhbjtLaXppbHl1cnQgOiAxIDogNDM5NDcKK1RjaGV0Y2hlbmlhKjtVcnVzLU1hcnRhbm92c2tpeSA6IDEgOiA0NTY0MAorVGNoZXRjaGVuaWEqO05vemhheS1ZdXJ0b3Zza2l5IDogMSA6IDQwMTU5CitEYWdlc3RhbjtLYXpiZWtvdnNraXkgOiAxIDogMjY1ODAKK1RjaGV0Y2hlbmlhKjtTaGFsaSA6IDEgOiAyMzIwNQorVGNoZXRjaGVuaWEqO1VydXMtTWFydGFuIDogMSA6IDMzMjI0CitEYWdlc3RhbjtCdXluYWtza2l5IDogMSA6IDU1MzgzCitTZXZlcm8tT3NldGluc2th72EgcmVzcG91O1ZsYWRpa2F2a2F6IDogMSA6IDMyMzI0NAorU2V2ZXJvLU9zZXRpbnNrYe9hIHJlc3BvdTtBbGFnaXJza2l5IDogMSA6IDQ0MDY1CitUY2hldGNoZW5pYSo7VmVkZW5za2l5IDogMSA6IDI5Mjg1CitUY2hldGNoZW5pYSo7U2hhdG95c2tpeSA6IDEgOiAxMDc4OQorRGFnZXN0YW47S2FzcGl5c2sgOiAxIDogNjY2MDgKK0RhZ2VzdGFuO0d1bWJldG92c2tpeSA6IDEgOiAxNDA4NAorRGFnZXN0YW47Qm90bGlraHNraXkgOiAxIDogMzM1NjkKK0RhZ2VzdGFuO0xlbmluc2tpeSA6IDEgOiA0Mzg0MQorVGNoZXRjaGVuaWEqO0l0dW0tS2FsaW5za2l5IDogMSA6IDI2NTQKK0RhZ2VzdGFuO1VudHN1a3Vsc2tpeSA6IDEgOiAxOTgwMgorRGFnZXN0YW47QnV5bmFrc2sgOiAxIDogNjE2MzEKK0RhZ2VzdGFuO0todW56YWtoc2tpeSA6IDEgOiAyNDg4NQorRGFnZXN0YW47QWtodmFraHNraXkgOiAxIDogMTYwOTYKK0RhZ2VzdGFuO1RzdW1hZGluc2tpeSA6IDEgOiAxNzg5NgorRGFnZXN0YW47S2F5YWtlbnRza2l5IDogMSA6IDM3Njk5CitEYWdlc3RhbjtMZXZhc2hpbnNraXkgOiAxIDogNDYwNjUKK0RhZ2VzdGFuO0dlcmdlYmlsc2tpeSA6IDEgOiAxMzY2MQorRGFnZXN0YW47SXpiZXJiYXNoIDogMSA6IDM1Njg3CitEYWdlc3RhbjtTb3ZldHNraXkgOiAxIDogMjEwNzMKK0RhZ2VzdGFuO0d1bmlic2tpeSA6IDEgOiAyMDU0NAorRGFnZXN0YW47U2VyZ29rYWxpbnNraXkgOiAxIDogMjEyODUKK0RhZ2VzdGFuO1RzdW50aW5za2l5IDogMSA6IDE1MjQ5CitEYWdlc3RhbjtBa3VzaGluc2tpeSA6IDEgOiA0MTUxMQorRGFnZXN0YW47VGx5YXJhdGluc2tpeSA6IDEgOiAyMDMzMgorRGFnZXN0YW47Q2hhcm9kaW5za2l5IDogMSA6IDExMzMxCitEYWdlc3RhbjtEZXJiZW50c2tpeSA6IDEgOiA3NDc2MgorRGFnZXN0YW47TGFrc2tpeSA6IDEgOiA5ODQ4CitEYWdlc3RhbjtLYXl0YWdza2l5IDogMSA6IDI2MDUwCitEYWdlc3RhbjtEYWtoYWRheWV2c2tpeSA6IDEgOiAzMzg4NworRGFnZXN0YW47S3VsaW5za2l5IDogMSA6IDExMzMxCitEYWdlc3RhbjtEZXJiZW50IDogMSA6IDg2ODM0CitEYWdlc3RhbjtEYWdlc3RhbnNraXllIE9nbmkgOiAxIDogMjUyMDMKK0RhZ2VzdGFuO1RhYmFzYXJhbnNraXkgOiAxIDogNDY1OTQKK0RhZ2VzdGFuO0FndWxza2l5IDogMSA6IDgwNDgKK0RhZ2VzdGFuO1J1dHVsc2tpeSA6IDEgOiAxODUzMgorRGFnZXN0YW47TWFnYXJhbWtlbnRza2l5IDogMSA6IDM5ODE3CitEYWdlc3RhbjtLaGl2c2tpeSA6IDEgOiAyMDAxNAorRGFnZXN0YW47U3VsZXltYW4tU3RhbHNraXkgOiAxIDogNDI2NzYKK0RhZ2VzdGFuO0t1cmFraHNraXkgOiAxIDogMTI4MTMKK0RhZ2VzdGFuO0FraHR5bnNraXkgOiAxIDogMzM4ODcKK1JVLVVOSy0yODc4IDogMSA6IDEyNjc5CitSVS1VTkstMjg3OSA6IDEgOiAxMzM0MworUlUtVU5LLTI4ODAgOiAxIDogMjU3MDk2CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtJdmRlbCA6IDEgOiAzNzY5MgorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtLcmFzbm92aXNoZXJza2l5IDogMSA6IDMwMzk0CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0NoZXJkeW5za2l5IDogMSA6IDQxMDgxCitLb21pLVBlcm1pYXRza2kgbmF0aW9uYWw7R2F5bnNraXkgOiAxIDogMjA2NTUKK1N2ZXJkbG92c2th72Egb2JsYXN0O1NldmVyb3VyYWxzayA6IDEgOiA1OTU4NworU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7R2FyaW5za2l5IDogMSA6IDg4OTgKK0tvbWktUGVybWlhdHNraSBuYXRpb25hbDtLb3NpbnNraXkgOiAxIDogMTAyNzgKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7U29saWthbXNraXkgOiAxIDogMTgxMzgKK1N2ZXJkbG92c2th72Egb2JsYXN0O0thcnBpbnNrIDogMSA6IDUzNjg4CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtTZXJvdnNraXkgOiAxIDogMzA1OTMKK0tvbWktUGVybWlhdHNraSBuYXRpb25hbDtLb2NoZXZza2l5IDogMSA6IDE0MTMzCitTdmVyZGxvdnNrYe9hIG9ibGFzdDtLcmFzbm90dXJpbnNrIDogMSA6IDczMjg0CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0FsZWtzYW5kcm92c2sgOiAxIDogNDM2MzAKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7VXNvbHNraXkgOiAxIDogMTUxOTcKK0tvbWktUGVybWlhdHNraSBuYXRpb25hbDtZdXJsaW5za2l5IDogMSA6IDE1NDE3CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtTZXJvdiA6IDEgOiAxMDU1NzcKK1N2ZXJkbG92c2th72Egb2JsYXN0O05vdm9seWFsaW5za2l5IDogMSA6IDI5Mjk0CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO1NvbGlrYW1zayA6IDEgOiAxMDcwNjUKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7QmVyZXpuaWtpIDogMSA6IDE5NTMwNgorS29taS1QZXJtaWF0c2tpIG5hdGlvbmFsO0t1ZHlta2Fyc2tpeSA6IDEgOiAzNTY3NworU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7VGFib3JpbnNraXkgOiAxIDogNjc5OQorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtLaXplbCA6IDEgOiA1Nzg0NworUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtHb3Jub3phdm9kc2tpeSA6IDEgOiAzNjk2MworS29taS1QZXJtaWF0c2tpIG5hdGlvbmFsO1l1c3ZpbnNraXkgOiAxIDogMjg3NTkKK0tvbWktUGVybWlhdHNraSBuYXRpb25hbDtLdWR5bWthciA6IDEgOiAzMzEwOAorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7QWxhcGF5ZXZza2l5IDogMSA6IDQ4MDg5CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtWZXJraG90dXJza2l5IDogMSA6IDIxMzk1CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0RvYnJ5YW5za2l5IDogMSA6IDYyODQ3CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0dyZW15YWNoaW5zayA6IDEgOiAyODUzMQorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7Tml6aG55YXlhIFR1cmEgOiAxIDogMzc0OTIKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7R3ViYWtoYSA6IDEgOiA1NDkwNQorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtJbHlpbnNraXkgOiAxIDogMjQ3MDcKK1N2ZXJkbG92c2th72Egb2JsYXN0O0thY2hrYW5hciA6IDEgOiA1MTM4OQorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtLYXJhZ2F5c2tpeSA6IDEgOiAyNTk4MgorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7VHVyaW5za2l5IDogMSA6IDQxMDkxCitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0NodXNvdnNrb3kgOiAxIDogMjg2MjkKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7U2l2aW5za2l5IDogMSA6IDE5MDIxCitTdmVyZGxvdnNrYe9hIG9ibGFzdDtUYXZkaW5za2l5IDogMSA6IDEwOTk4CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtLdXNodmEgOiAxIDogNzA3ODQKK1N2ZXJkbG92c2th72Egb2JsYXN0O0tyYXNub3VyYWxzayA6IDEgOiAzNTI5MgorT3VkbW91cnRpYTtHbGF6b3Zza2l5IDogMSA6IDIwNjk3CitPdWRtb3VydGlhO0JhbGV6aW5za2l5IDogMSA6IDQwNjk1CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtWZXJraG5lc2FsZGluc2tpeSA6IDEgOiA0OTk5CitPdWRtb3VydGlhO1lhcnNraXkgOiAxIDogMjA1OTcKK091ZG1vdXJ0aWE7S2V6c2tpeSA6IDEgOiAyOTg5NgorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtOeXR2ZW5za2l5IDogMSA6IDUxNzY4CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0tyYXNub2thbXNrIDogMSA6IDc1MDA1CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0NodXNvdm95IDogMSA6IDU1Mzk2CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO1ZlcmVzY2hhZ2luc2tpeSA6IDEgOiA0NjA4MQorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtMeXN2ZW5za2l5IDogMSA6IDE2Mzc0CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtQcmlnb3JvZG55aSA6IDEgOiA1MDI4OQorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtQZXJtIDogMSA6IDEwODMxMDcKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7UGVybXNraXkgOiAxIDogODY4NjgKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7THlzdmEgOiAxIDogNzcxNjIKK1N2ZXJkbG92c2th72Egb2JsYXN0O05pemhuaWF5YSBTYWxkYSA6IDEgOiAyMDY5NQorT3VkbW91cnRpYTtZdWthbWVuc2tpeSA6IDEgOiAxMzM5OAorT3VkbW91cnRpYTtHbGF6b3YgOiAxIDogMTA3NDg3CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO09jaGVyc2tpeSA6IDEgOiAyNTE5OAorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7VmVya2huaWF5YSBTYWxkYSA6IDEgOiA1NTA4OAorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7SXJiaXRza2l5IDogMSA6IDM1NjkyCitTdmVyZGxvdnNrYe9hIG9ibGFzdDtUYXZkYSA6IDEgOiA0NjM5MAorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7Tml6aG5peSBUYWdpbCA6IDEgOiA0MzMyMDUKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7S3VuZ3Vyc2tpeSA6IDEgOiA0Njc2OAorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7QWxhcGF5ZXZzayA6IDEgOiA1ODA4NworU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7U2xvYm9kby1UdXJpbnNraXkgOiAxIDogMTkzOTYKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7T2toYW5za2l5IDogMSA6IDE5MTE5CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0Jlcnlvem92c2tpeSA6IDEgOiAxOTAyMQorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtCb2xzaGVzb3Nub3Zza2l5IDogMSA6IDE2NzY2CitPdWRtb3VydGlhO0tyYXNub2dvcnNraXkgOiAxIDogMTQyOTgKK1N2ZXJkbG92c2th72Egb2JsYXN0O0JheWthbG92c2tpeSA6IDEgOiAyMTY5NQorT3VkbW91cnRpYTtEZWJlc3NraXkgOiAxIDogMTQzOTgKK1N2ZXJkbG92c2th72Egb2JsYXN0O05ldnlhbnNraXkgOiAxIDogMzEwOTMKK091ZG1vdXJ0aWE7SWdyaW5za2l5IDogMSA6IDQ2OTk0CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtTaGFsaW5za2l5IDogMSA6IDMxMzkzCitTdmVyZGxvdnNrYe9hIG9ibGFzdDtSZXpoZXZza2l5IDogMSA6IDEwODk4CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtLaXJvdmdyYWQgOiAxIDogNTA5ODkKK1N2ZXJkbG92c2th72Egb2JsYXN0O0FydHllbW92c2tpeSA6IDEgOiAzNDA5MworU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7SXJiaXQgOiAxIDogNTA0ODkKK1N2ZXJkbG92c2th72Egb2JsYXN0O05ldnlhbnNrIDogMSA6IDI5MTk0CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO09zaW5za3kgOiAxIDogMzYwODEKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7Q2hhc3RpbnNraXkgOiAxIDogMTQ2MDkKK091ZG1vdXJ0aWE7U2VsdGluc2tpeSA6IDEgOiAxNTQ5OAorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtLaXNoZXJ0c2tpeSA6IDEgOiAxNzE1OAorT3VkbW91cnRpYTtTaGFya2Fuc2tpeSA6IDEgOiAyMjM5NworT3VkbW91cnRpYTtTeXVtc2luc2tpeSA6IDEgOiAxODc5OAorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtLdW5ndXIgOiAxIDogNzgzMzgKK1N2ZXJkbG92c2th72Egb2JsYXN0O1JlenNoIDogMSA6IDQzMjkwCitTdmVyZGxvdnNrYe9hIG9ibGFzdDtUdWd1bHltc2tpeSA6IDEgOiAzMDY5MworU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7QXJ0eW9tb3Zza2l5IDogMSA6IDQxNzkxCitPdWRtb3VydGlhO1lha3NodXItQm9keWluc2tpeSA6IDEgOiAyMjY5NworU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7UGVydm91cmFsc2sgOiAxIDogMTcxODYyCitTdmVyZGxvdnNrYe9hIG9ibGFzdDtWZXJraG55YXkgUHlzaG1hIDogMSA6IDg1MjgxCitTdmVyZGxvdnNrYe9hIG9ibGFzdDtUYWxpdHNraXkgOiAxIDogNjM1ODYKK1N2ZXJkbG92c2th72Egb2JsYXN0O1B5c2htaW5za2l5IDogMSA6IDI1Njk0CitPdWRtb3VydGlhO1V2aW5za2l5IDogMSA6IDQxOTk1CitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO1N1a3N1bnNraXkgOiAxIDogMjM0MzMKK091ZG1vdXJ0aWE7Vm90a2luc2tpeSA6IDEgOiAyMzY5NworU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7QXNiZXN0IDogMSA6IDExOTQ3NAorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7S2FteXNobG92c2tpeSA6IDEgOiAyMTI5NQorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7QmVyZXpvdnNraXkgOiAxIDogNjU3ODYKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7T3JkaW5za3kgOiAxIDogMTc4NDQKK1N2ZXJkbG92c2th72Egb2JsYXN0O1N1a2hvbG96aHNraXkgOiAxIDogMTM0OTcKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7QmFyZHltc2tpeSA6IDEgOiAyNzg0NQorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtZZWxvdnNraXkgOiAxIDogMTQyMTcKK1N2ZXJkbG92c2th72Egb2JsYXN0O05pemhuZXNlcmdpbnNraXkgOiAxIDogNzEwODQKK1N2ZXJkbG92c2th72Egb2JsYXN0O0FjaGl0c2tpeSA6IDEgOiAyMzM5NQorUGVybXNrYe9hIG9ibGFzdCBy6XNpZHVlbDtVaW5za2l5IDogMSA6IDE0MTE5CitPdWRtb3VydGlhO1phdnlhbG92c2tpeSA6IDEgOiA1Mjc5NAorT3VkbW91cnRpYTtWb3RraW5zayA6IDEgOiAxMDQ5ODcKK1N2ZXJkbG92c2th72Egb2JsYXN0O1lla2F0ZXJpbmJ1cmcgOiAxIDogMTQwMDg5MgorT3VkbW91cnRpYTtWYXZvemhza2l5IDogMSA6IDE4NTk4CitPdWRtb3VydGlhO0l6aGV2c2sgOiAxIDogNjUyNDIwCitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0NoYXlrb3Zza2l5IDogMSA6IDE3NTUwCitTdmVyZGxvdnNrYe9hIG9ibGFzdDtCZWxveWFyc2tpeSA6IDEgOiA0MTA5MQorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7U3VraG95IExvZyA6IDEgOiAzNzA5MgorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7S3Jhc25vdWZpbXNraXkgOiAxIDogMzY4OTIKK1N2ZXJkbG92c2th72Egb2JsYXN0O0JvZ2Rhbm92aWNoc2tpeSA6IDEgOiAxOTA5NgorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7S2FteXNobG92IDogMSA6IDMyMTkzCitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO09rdHlhYnJza2l5IDogMSA6IDM3NzQ3CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtaYXJlY2hueSA6IDEgOiAyOTc5MworU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7UmV2ZGEgOiAxIDogODU0ODEKK1N2ZXJkbG92c2th72Egb2JsYXN0O0JvZ2Rhbm92aWNoIDogMSA6IDM1NTkyCitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0t1eWVkaW5za2l5IDogMSA6IDMzNDMzCitQZXJtc2th72Egb2JsYXN0IHLpc2lkdWVsO0NoZXJudXNoaW5za2l5IDogMSA6IDUyNjUwCitLb3VyZ2Fuc2th72Egb2JsYXN0O1NoYXRyb3Zza2l5IDogMSA6IDI4MzIwCitPdWRtb3VydGlhO0tpem5lcnNraXkgOiAxIDogMjYzOTcKK1Blcm1za2HvYSBvYmxhc3QgculzaWR1ZWw7Q2hheWtvdnNreSA6IDEgOiA4NjY3MgorT3VkbW91cnRpYTtNYWxvcHVyZ2luc2tpeSA6IDEgOiAzMTU5NgorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7U3lzZXJ0c2tpeSA6IDEgOiA4MDA4MgorU3ZlcmRsb3Zza2HvYSBvYmxhc3Q7QXJ0aW5za2l5IDogMSA6IDM5MTkxCitPdWRtb3VydGlhO01vemhnaW5za2l5IDogMSA6IDI4Nzk2CitPdWRtb3VydGlhO1NhcmFwdWxza2l5IDogMSA6IDI2NTk3CitTdmVyZGxvdnNrYe9hIG9ibGFzdDtQb2xldnNrb3kgOiAxIDogNzk4ODIKK1N2ZXJkbG92c2th72Egb2JsYXN0O0thbWVuc2tpeSA6IDEgOiAzMTk5MworS291cmdhbnNrYe9hIG9ibGFzdDtEYWxtYXRvdnNraXkgOiAxIDogMzk1ODgKK0tvdXJnYW5za2HvYSBvYmxhc3Q7S2F0YXlza2l5IDogMSA6IDMxNzEwCitTdmVyZGxvdnNrYe9hIG9ibGFzdDtLYW1lbnNrLVVyYWxza2l5IDogMSA6IDIwODU1NAorT3VkbW91cnRpYTtTYXJhcHVsIDogMSA6IDExMDQ4NgorS291cmdhbnNrYe9hIG9ibGFzdDtTaGFkcmluc2tpeSA6IDEgOiAzNjY5NgorQmFjaGtpcmlhO1lhbmF1bHNraXkgOiAxIDogMjM2NDEKK091ZG1vdXJ0aWE7S2FtYmFyc2tpeSA6IDEgOiAyMzI5NworT3VkbW91cnRpYTtLaXlhc292c2tpeSA6IDEgOiAxMzA5OAorT3VkbW91cnRpYTtNb2d6c2hhIDogMSA6IDQ4MTk0CitCYWNoa2lyaWE7VGF0eXNobGluc2tpeSA6IDEgOiAyNjg3NAorQmFjaGtpcmlhO0Fza2luc2tpeSA6IDEgOiAyNDE0NgorT3VkbW91cnRpYTtBbG5hc2hza2l5IDogMSA6IDIxMzk3CitUY2hlbGlhYmluc2th72Egb2JsYXN0O0thc2xpbnNraXkgOiAxIDogMTcwODcKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7TnlhemVwZXRyb3Zza3NraXkgOiAxIDogMjc4MDQKK0JhY2hraXJpYTtZYW5hdWwgOiAxIDogMjYxNjYKK0tvdXJnYW5za2HvYSBvYmxhc3Q7QmVsb3plcnNraXkgOiAxIDogMjQ2MzAKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7S3VuYXNoYWtza2l5IDogMSA6IDM1OTkzCitCYWNoa2lyaWE7S3Jhc25va2Ftc2tpeSA6IDEgOiAyNTc2MgorT3VkbW91cnRpYTtHcmFraG92c2tpeSA6IDEgOiAxMTk5OQorT3VkbW91cnRpYTtLYXJha3VsaW5za2l5IDogMSA6IDE0OTk4CitUY2hlbGlhYmluc2th72Egb2JsYXN0O1Zlcmtobml5IFVmYWxleSA6IDEgOiA0NzAxNAorQmFjaGtpcmlhO0JhbHRhY2hldnNraXkgOiAxIDogMjUxNTYKK0tvdXJnYW5za2HvYSBvYmxhc3Q7S2FyZ2Fwb2xza2l5IDogMSA6IDM4NTkxCitCYWNoa2lyaWE7QmVsb2thdGF5c2tpeSA6IDEgOiAyMjgzMgorS291cmdhbnNrYe9hIG9ibGFzdDtTaGFkcmluc2sgOiAxIDogODc1NTMKK0JhY2hraXJpYTtLYWx0YXNpbnNraXkgOiAxIDogMjgzODkKK0JhY2hraXJpYTtLYXJhaWRlbHNraXkgOiAxIDogMzA4MTQKK0JhY2hraXJpYTtNZWNoZXRsaW5za2l5IDogMSA6IDI0NjUxCitCYWNoa2lyaWE7RHV2YW5za2l5IDogMSA6IDMxMDE2CitCYWNoa2lyaWE7TmVmdGVrYW1zayA6IDEgOiAxMjQxNjQKK0JhY2hraXJpYTtCdXJheWV2c2tpeSA6IDEgOiAyOTUwMAorS291cmdhbnNrYe9hIG9ibGFzdDtWYXJnYXNoaW5za2l5IDogMSA6IDI0OTMwCitLb3VyZ2Fuc2th72Egb2JsYXN0O01va3JvdXNvdnNraXkgOiAxIDogMTcxNTIKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7S3Jhc25vYXJtZXlza2l5IDogMSA6IDQ3MjE2CitUY2hlbGlhYmluc2th72Egb2JsYXN0O0thc2xpIDogMSA6IDMwMTI5CitSVS1VTkstMjg4MSA6IDEgOiAyMDYxMAorVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtLeXNodHltIDogMSA6IDU0NTk3CitLb3VyZ2Fuc2th72Egb2JsYXN0O01pc2hraW5za2l5IDogMSA6IDI1ODI3CitCYWNoa2lyaWE7TWlzaGtpbnNraXkgOiAxIDogMjgxODcKK0tvdXJnYW5za2HvYSBvYmxhc3Q7U2NodWNoYW5za2l5IDogMSA6IDMwNzEzCitLb3VyZ2Fuc2th72Egb2JsYXN0O1NodW1pa2hpbnNraXkgOiAxIDogMzgxOTIKK0JhY2hraXJpYTtJbGlzaGV2c2tpeSA6IDEgOiAzNjc3NAorS291cmdhbnNrYe9hIG9ibGFzdDtLZXRvdnNraXkgOiAxIDogNTQyNDcKK0JhY2hraXJpYTtEeXVydHl1bGluc2tpeSA6IDEgOiAzMjIyOAorVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtBcmdheWFzaHNraXkgOiAxIDogNDUxOTQKK0tvdXJnYW5za2HvYSBvYmxhc3Q7Q2hhc3Rvb3plcnNraXkgOiAxIDogOTE3NAorQmFjaGtpcmlhO0tpZ2luc2tpeSA6IDEgOiAxOTYwMAorVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtLYXJhYmFzaCA6IDEgOiAxNjg4NQorS291cmdhbnNrYe9hIG9ibGFzdDtZdXJnYW15c2hza2l5IDogMSA6IDI3NDIzCitUY2hlbGlhYmluc2th72Egb2JsYXN0O1Nvc25vdnNraXkgOiAxIDogNTY1MTgKK0JhY2hraXJpYTtOdXJpbWFub3Zza2l5IDogMSA6IDIyNjMwCitCYWNoa2lyaWE7Qmlyc2tpeSA6IDEgOiAxOTQ5OAorS291cmdhbnNrYe9hIG9ibGFzdDtMZWJ5YXpoeWV2c2tpeSA6IDEgOiAyMzYzMworVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtLdXNpbnNraXkgOiAxIDogMzc3MTIKK0JhY2hraXJpYTtTYWxhdmF0c2tpeSA6IDEgOiAyNzI3OAorQmFjaGtpcmlhO0JsYWdvdmVzaGNoZW5za2l5IDogMSA6IDE4NTg5CitLb3VyZ2Fuc2th72Egb2JsYXN0O01ha3VzaGluc2tpeSA6IDEgOiAyNjAyNworQmFjaGtpcmlhO0R5dXJ0dWxpIDogMSA6IDI4MDg2CitLb3VyZ2Fuc2th72Egb2JsYXN0O0t1cmdhbiA6IDEgOiAzNjU4NjcKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7TWlhc3MgOiAxIDogMTg1ODMxCitUY2hlbGlhYmluc2th72Egb2JsYXN0O1psYXRvdXN0IDogMSA6IDIxMjExOAorQmFjaGtpcmlhO0JpcnNrIDogMSA6IDM2Nzc0CitLb3VyZ2Fuc2th72Egb2JsYXN0O1BldHVraG92c2tpeSA6IDEgOiAyNzAyNAorQmFjaGtpcmlhO0Jha2FsaW5za2l5IDogMSA6IDMyNDMwCitCYWNoa2lyaWE7Q2hla21hZ3VzaGV2c2tpeSA6IDEgOiAzMjkzNQorVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtDaGVseWFiaW5zayA6IDEgOiAxMTc0NTM1CitUY2hlbGlhYmluc2th72Egb2JsYXN0O1NhdGtpbnNraXkgOiAxIDogNDU5MDIKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7QXNoeW5za2l5IDogMSA6IDQ0MTgzCitCYWNoa2lyaWE7S3VzaG5hcmVua292c2tpeSA6IDEgOiAyNzk4NQorVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtLb3BleXNrIDogMSA6IDE0ODIyMAorQmFjaGtpcmlhO0lnbGluc2tpeSA6IDEgOiA0MzEzOQorS291cmdhbnNrYe9hIG9ibGFzdDtQcml0b2JvbG55aSA6IDEgOiAxOTI0NgorVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtDaGViYXJrdWxza2l5IDogMSA6IDMxMDM5CitLb3VyZ2Fuc2th72Egb2JsYXN0O1NhZmFrdWxldnNraXkgOiAxIDogMjA1NDIKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7S2F0YXlldi1JdmFub3Zza2l5IDogMSA6IDIzNDU2CitLb3VyZ2Fuc2th72Egb2JsYXN0O0t1cnRhbXlzaHNraXkgOiAxIDogNDI4NzkKK0tvdXJnYW5za2HvYSBvYmxhc3Q7UG9sb3ZpbnNraXkgOiAxIDogMTczNTEKK0tvdXJnYW5za2HvYSBvYmxhc3Q7QWxtZW5ldnNraXkgOiAxIDogMTk1NDUKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7WWV0a3Vsc2tpeSA6IDEgOiAzMTAzOQorQmFjaGtpcmlhO0JsYWdvdmVzaGNoZW5zayA6IDEgOiAyODg5NAorVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtTYXRrYSA6IDEgOiA1MTc2NgorQmFjaGtpcmlhO1NoYXJhbnNraXkgOiAxIDogMjQ1NTAKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7QXNoYSA6IDEgOiAzODYyMgorQmFjaGtpcmlhO1VmaW1za2l5IDogMSA6IDQ3OTg5CitUY2hlbGlhYmluc2th72Egb2JsYXN0O0NoZWJhcmt1bCcgOiAxIDogNTE0NjIKK0JhY2hraXJpYTtCbGFnb3ZhcnNraXkgOiAxIDogMjQ3NTIKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7S29ya2lubyA6IDEgOiA3Mjg5NworVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtVc3QtS2F0YXlldiA6IDEgOiAzNTk5MworQmFjaGtpcmlhO1VjaGFseSA6IDEgOiAzMzAzNgorQmFjaGtpcmlhO0J1emR5YWtza2l5IDogMSA6IDMxMjE4CitCYWNoa2lyaWE7VWZhIDogMSA6IDExMTAzMDMKK0JhY2hraXJpYTtDaGlzaG1pbnNraXkgOiAxIDogNTE5MjkKK0JhY2hraXJpYTtBcmtoYW5nZWxza2l5IDogMSA6IDIwMTA1CitUY2hlbGlhYmluc2th72Egb2JsYXN0O1llbWFuemhlbGluc2sgOiAxIDogNTU5MTEKK0tvdXJnYW5za2HvYSBvYmxhc3Q7VHNlbGlubnlpIDogMSA6IDI1OTI3CitCYWNoa2lyaWE7VHV5bWF6aW5za2l5IDogMSA6IDMwNTExCitUY2hlbGlhYmluc2th72Egb2JsYXN0O1V2ZWxza2l5IDogMSA6IDMxNDQ0CitUY2hlbGlhYmluc2th72Egb2JsYXN0O0thdGF5ZXYtSXZhbm92c2sgOiAxIDogMjUzNzcKK0JhY2hraXJpYTtCZWxvcmV0c2tpeSA6IDEgOiAzMzEzNworS291cmdhbnNrYe9hIG9ibGFzdDtadmVyaW5vZ29sb3Zza3kgOiAxIDogMTA5NjkKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7T2t0eWFicnNraXkgOiAxIDogMzEyNDEKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7VXlza2l5IDogMSA6IDMwODM3CitCYWNoa2lyaWE7S2FybWFza2FsaW5za2l5IDogMSA6IDQ2NTc0CitCYWNoa2lyaWE7VHV5bWF6eSA6IDEgOiA5NDU2MworVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtQbGFzdCA6IDEgOiAyNjk5NQorQmFjaGtpcmlhO09rdHlhYnJza2l5IDogMSA6IDEwODEwMAorVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtZdXpobm8tVXJhbHNrIDogMSA6IDQyNDY0CitUY2hlbGlhYmluc2th72Egb2JsYXN0O1Ryb2l0c2tpeSA6IDEgOiAzNjM5OAorQmFjaGtpcmlhO0JlbGViZXlldnNraXkgOiAxIDogMTY3NzEKK0JhY2hraXJpYTtEYXZsZWthbm92c2tpeSA6IDEgOiAxODE4NQorT3JlbmJvdXJnc2th72Egb2JsYXN0O1NldmVybnlpIDogMSA6IDIxMDgyCitSVS1VTkstMjg4MiA6IDEgOiAzOTA5OAorQmFjaGtpcmlhO0dhZnVyaXlza2l5IDogMSA6IDM2MDY3CitCYWNoa2lyaWE7WWVybWVrZXlldnNraXkgOiAxIDogMTgwODQKK0JhY2hraXJpYTtBdXJnYXppbnNraXkgOiAxIDogMzkwOTgKK0JhY2hraXJpYTtBbHNoZXlldnNraXkgOiAxIDogNDgzOTMKK0JhY2hraXJpYTtEYXZsZWthbm92byA6IDEgOiAyMjkzMworVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtWZXJraG5ldXJhbHNraXkgOiAxIDogNDU5MDIKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7VHJvaXRzayA6IDEgOiA4ODk3MgorQmFjaGtpcmlhO0JlbGViZXkgOiAxIDogODA0MTkKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtBYmR1bGluc2tpeSA6IDEgOiAxNzY2OQorQmFjaGtpcmlhO0JlbG9yZXRzayA6IDEgOiA5MTAyNworT3JlbmJvdXJnc2th72Egb2JsYXN0O0J1Z3VydXNsYW5za2l5IDogMSA6IDIzOTkzCitCYWNoa2lyaWE7QWJ6ZWxpbG92c2tpeSA6IDEgOiA0MDYxMworQmFjaGtpcmlhO0JpemhidWx5YWtza2l5IDogMSA6IDI4MDg2CitCYWNoa2lyaWE7U3RlcmxpdGFtYWtza2l5IDogMSA6IDM0MDQ3CitUY2hlbGlhYmluc2th72Egb2JsYXN0O05hZ2F5YmFrc2tpeSA6IDEgOiAyNjI4NworVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtDaGVzbWVuc2tpeSA6IDEgOiAyMDkyOQorQmFjaGtpcmlhO01peWFraW5za2l5IDogMSA6IDMxNjIyCitCYWNoa2lyaWE7SXNoaW1iYXlza3kgOiAxIDogMjUzNTgKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtBc2VrZXlldnNraXkgOiAxIDogMjUyOTgKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7QWdhcG92c2tpeSA6IDEgOiAzNzUxMAorT3JlbmJvdXJnc2th72Egb2JsYXN0O0J1Z3VydXNsYW4gOiAxIDogNTMwMDYKK0JhY2hraXJpYTtTdGVybGl0YW1hayA6IDEgOiAyNTY4MTQKK0JhY2hraXJpYTtTdGVybGliYXNoZXZza2l5IDogMSA6IDIyMzI3CitUY2hlbGlhYmluc2th72Egb2JsYXN0O1Zhcm5lbnNraXkgOiAxIDogMzI1NTYKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtBYmR1bGlubyA6IDEgOiAyMjA4NgorT3JlbmJvdXJnc2th72Egb2JsYXN0O01hdHZleWV2c2tpeSA6IDEgOiAxNjM2NAorQmFjaGtpcmlhO0J1cnp5YW5za2l5IDogMSA6IDE1MDUzCitCYWNoa2lyaWE7SXNoaW1iYXkgOiAxIDogNzI0MzcKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7TWFnbml0b2dvcnNrIDogMSA6IDQ0NDg2MQorVGNoZWxpYWJpbnNrYe9hIG9ibGFzdDtLYXJ0YWxpbnNraXkgOiAxIDogMjMyNTQKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtQb25vbWFyeW92c2tpeSA6IDEgOiAxODY3MworQmFjaGtpcmlhO01lbGV1enNraXkgOiAxIDogMjY0NjkKK0JhY2hraXJpYTtGeW9kb3JvdnNraXkgOiAxIDogMjAxMDUKK0JhY2hraXJpYTtTYWxhdmF0IDogMSA6IDE1NjY5NQorT3JlbmJvdXJnc2th72Egb2JsYXN0O0J1enVsdWtza2l5IDogMSA6IDMyOTI4CitCYWNoa2lyaWE7QmF5bWFrc2tpeSA6IDEgOiA0MzU0MworT3JlbmJvdXJnc2th72Egb2JsYXN0O1NoYXJseWtza2l5IDogMSA6IDIzNjkyCitPcmVuYm91cmdza2HvYSBvYmxhc3Q7R3JhY2hldnNraXkgOiAxIDogMTY5NjYKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7S2l6aWxza2l5IDogMSA6IDMzNDY2CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7S3Jhc25vZ3ZhcmRleXNraXkgOiAxIDogMjY5MDUKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7S2FydGFseSA6IDEgOiAzNzIwNworQmFjaGtpcmlhO0t1Z2FyY2hpbnNraXkgOiAxIDogMzI1MzEKK0JhY2hraXJpYTtaaWxhaXJza2l5IDogMSA6IDE4OTkzCitCYWNoa2lyaWE7TWVsZXV6IDogMSA6IDU5MDAxCitCYWNoa2lyaWE7S3VtZXJ0YXVza2l5IDogMSA6IDI0MDQ1CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7QWxla3NhbmRyb3Zza2l5IDogMSA6IDIxMjgzCitPcmVuYm91cmdza2HvYSBvYmxhc3Q7S3VybWFuYXlldnNraXkgOiAxIDogMjI1ODgKK1RjaGVsaWFiaW5za2HvYSBvYmxhc3Q7QnJlZGluc2tpeSA6IDEgOiAzMzY2OAorT3JlbmJvdXJnc2th72Egb2JsYXN0O0J1enVsdWsgOiAxIDogODQ1MjkKK0JhY2hraXJpYTtLdW1lcnRheSA6IDEgOiA3MjIzNQorQmFjaGtpcmlhO1NpYmF5IDogMSA6IDUzMDQwCitPcmVuYm91cmdza2HvYSBvYmxhc3Q7U29yb2NoaW5za2l5IDogMSA6IDE2OTY2CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7T2t0eWFicnNraXkgOiAxIDogMjI1ODgKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtOb3Zvc2VyZ2l5ZXZza2l5IDogMSA6IDM4OTUyCitCYWNoa2lyaWE7QmF5bWFrIDogMSA6IDE3NDc4CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7VG90c2tpeSA6IDEgOiAzNDYzNQorT3JlbmJvdXJnc2th72Egb2JsYXN0O1R5dWxnYW5za2l5IDogMSA6IDI1NzAwCitCYWNoa2lyaWE7WmlhbmNodXJpbnNraXkgOiAxIDogMjgxODcKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtLdmFya2Vuc2tpeSA6IDEgOiAyNDQ5NQorQmFjaGtpcmlhO0toYXlidWxsaW5za2l5IDogMSA6IDMxNDIwCitSVS1VTkstMjg4MyA6IDEgOiAyNzYwNworT3JlbmJvdXJnc2th72Egb2JsYXN0O1BlcmV2b2xvdHNraXkgOiAxIDogMzAwMTcKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtQZXJ2b21heXNraXkgOiAxIDogMjYzMDIKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtTYWttYXJza2l5IDogMSA6IDI4MDA5CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7VGFzaGxpbnNraXkgOiAxIDogMjQ4OTcKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtTYXJha3Rhc2hza2l5IDogMSA6IDQyMjY1CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7T3JlbmJ1cmdza2l5IDogMSA6IDU2NjIwCitPcmVuYm91cmdza2HvYSBvYmxhc3Q7QWRhbW92c2tpeSA6IDEgOiAzMTAyMQorT3JlbmJvdXJnc2th72Egb2JsYXN0O09yZW5idXJnIDogMSA6IDU3MzQzMgorT3JlbmJvdXJnc2th72Egb2JsYXN0O0t1dmFuZHlrc2tpeSA6IDEgOiAyNTgwMAorT3JlbmJvdXJnc2th72Egb2JsYXN0O0dheXNraXkgOiAxIDogMTM1NTMKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtOb3Zvb3Jza2l5IDogMSA6IDM0MjMzCitPcmVuYm91cmdza2HvYSBvYmxhc3Q7SWxla3NraXkgOiAxIDogMjg3MTIKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtCZWx5YWV2c2tpeSA6IDEgOiAyMDU4MAorT3JlbmJvdXJnc2th72Egb2JsYXN0O0t1dmFuZHlrIDogMSA6IDI5ODE2CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7U3ZldGxpbnNraXkgOiAxIDogMjA5ODIKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtHYXkgOiAxIDogNDQzNzMKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtNZWRub2dvcnNrIDogMSA6IDM5NzU1CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7U29sLUlsZXRza2l5IDogMSA6IDUzMTA3CitPcmVuYm91cmdza2HvYSBvYmxhc3Q7WWFzbmVuc2tpeSA6IDEgOiA4NDMzCitPcmVuYm91cmdza2HvYSBvYmxhc3Q7QWtidWxha3NraXkgOiAxIDogMzA0MTgKK09yZW5ib3VyZ3NrYe9hIG9ibGFzdDtPcnNrIDogMSA6IDI3OTY4OQorT3JlbmJvdXJnc2th72Egb2JsYXN0O05vdm90cm9pdHNrIDogMSA6IDExNTM0OQorT3JlbmJvdXJnc2th72Egb2JsYXN0O0RvbWJhcm92c2tpeSA6IDEgOiAyMDc4MQorT3JlbmJvdXJnc2th72Egb2JsYXN0O1lhc255IDogMSA6IDI4MTA5CitSVS1VTkstMjg4NCA6IDEgOiAyMDYxMAorUlUtVU5LLTI4ODUgOiAxIDogMzkwOTgKK1JVLVVOSy0yODg2IDogMSA6IDI3NjA3CitJYW1hbG8tTmVuZXRza2kgbmF0aW9uYWw7WWFtYWxza2l5IDogMSA6IDE0MDgwCitJYW1hbG8tTmVuZXRza2kgbmF0aW9uYWw7VGF6b3Zza2l5IDogMSA6IDE3MzQ1CitJYW1hbG8tTmVuZXRza2kgbmF0aW9uYWw7UHJpdXJhbHNraXkgOiAxIDogNjkzOAorSWFtYWxvLU5lbmV0c2tpIG5hdGlvbmFsO1B1cm92c2tpeSA6IDEgOiA1NTUwNQorSWFtYWxvLU5lbmV0c2tpIG5hdGlvbmFsO05hZHltc2tpeSA6IDEgOiAyNzAzOAorSWFtYWxvLU5lbmV0c2tpIG5hdGlvbmFsO0tyYW5vc2Vsa3Vwc2tpeSA6IDEgOiA4NjczCitJYW1hbG8tTmVuZXRza2kgbmF0aW9uYWw7U2h1cnlzaGthcnNraXkgOiAxIDogOTQ4OQorSWFtYWxvLU5lbmV0c2tpIG5hdGlvbmFsO0xhYnl0bmFuZ2kgOiAxIDogMzQwNzgKK0lhbWFsby1OZW5ldHNraSBuYXRpb25hbDtTYWxla2hhcmQgOiAxIDogMzE1MjgKK0lhbWFsby1OZW5ldHNraSBuYXRpb25hbDtOb3Z5aSBVcmVuZ295IDogMSA6IDEwMTExMworS2hhbnR5LU1hbnNpc2tpIG5hdGlvbmFsO0JlcmV6b3Zza2l5IDogMSA6IDI4NTI2CitJYW1hbG8tTmVuZXRza2kgbmF0aW9uYWw7TmFkeW0gOiAxIDogNTEyMjAKK0toYW50eS1NYW5zaXNraSBuYXRpb25hbDtCZWxveWFyc2tpeSA6IDEgOiA4NzcwCitJYW1hbG8tTmVuZXRza2kgbmF0aW9uYWw7TXVyYXZsZW5rbyA6IDEgOiAyODM2NQorS2hhbnR5LU1hbnNpc2tpIG5hdGlvbmFsO0JlbG95YXJza3kgOiAxIDogMTgxNDQKK0toYW50eS1NYW5zaXNraSBuYXRpb25hbDtPa3R5YWJyc2tpeSA6IDEgOiAzMjk2MQorS2hhbnR5LU1hbnNpc2tpIG5hdGlvbmFsO1N1cmd1dHNraXkgOiAxIDogNzM5ODcKK0lhbWFsby1OZW5ldHNraSBuYXRpb25hbDtOb3lhYnJzayA6IDEgOiA5Nzc0NgorS2hhbnR5LU1hbnNpc2tpIG5hdGlvbmFsO0toYW50eS1NYW5zaXlza2l5IDogMSA6IDIwMzYxCitLaGFudHktTWFuc2lza2kgbmF0aW9uYWw7Tml6aG5ldmFydG92c2tpeSA6IDEgOiAzMjI1NgorS2hhbnR5LU1hbnNpc2tpIG5hdGlvbmFsO1NvdmV0c2tpeSA6IDEgOiA3NDE4OAorS2hhbnR5LU1hbnNpc2tpIG5hdGlvbmFsO055YWdhbiA6IDEgOiA2Mjg5OQorS2hhbnR5LU1hbnNpc2tpIG5hdGlvbmFsO0tvZ2FseW0gOiAxIDogNDg3ODcKK0toYW50eS1NYW5zaXNraSBuYXRpb25hbDtSYWR1emhueWkgOiAxIDogNDcwNzMKK0toYW50eS1NYW5zaXNraSBuYXRpb25hbDtQb2thY2h5IDogMSA6IDEzMTA0CitLaGFudHktTWFuc2lza2kgbmF0aW9uYWw7U3VyZ3V0IDogMSA6IDI2Mjg4NQorS2hhbnR5LU1hbnNpc2tpIG5hdGlvbmFsO0xhbmdlcGFzIDogMSA6IDMxMDQ2CitLaGFudHktTWFuc2lza2kgbmF0aW9uYWw7S29uZGluc2tpeSA6IDEgOiAzNjU5MAorS2hhbnR5LU1hbnNpc2tpIG5hdGlvbmFsO05lZnRleXVnYW5za2l5IDogMSA6IDI2NzEyCitLaGFudHktTWFuc2lza2kgbmF0aW9uYWw7TmVmdGV1Z2Fuc2sgOiAxIDogOTYxNjMKK0toYW50eS1NYW5zaXNraSBuYXRpb25hbDtLaGFudHktTWFuc3lpc2sgOiAxIDogMzU2ODMKK1RvbXNrYe9hIG9ibGFzdDtLYXJnYXNva3NraXkgOiAxIDogMzA2MjgKK0toYW50eS1NYW5zaXNraSBuYXRpb25hbDtNZWdpb24gOiAxIDogNDg5ODkKK0toYW50eS1NYW5zaXNraSBuYXRpb25hbDtOaXpzaG52YXJ0b3ZzayA6IDEgOiAyNDY5NTgKK1JVLVVOSy0yODg3IDogMSA6IDEyNjQ4CitSVS1VTkstMjg4OCA6IDEgOiAxMjY0OAorS2hhbnR5LU1hbnNpc2tpIG5hdGlvbmFsO1B5dC1ZYWtoIDogMSA6IDM5MTEwCitUb21za2HvYSBvYmxhc3Q7U3RyZXpoZXZvaiA6IDEgOiA0NjgzMAorS2hhbnR5LU1hbnNpc2tpIG5hdGlvbmFsO1VyYXkgOiAxIDogNDAzMjAKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7VXZhdHNraXkgOiAxIDogMTkzMjIKK1RvbXNrYe9hIG9ibGFzdDtWZXJraG5la2V0c2tpeSA6IDEgOiAyNjg2NAorVG9tc2th72Egb2JsYXN0O1BhcmFiZWxza2l5IDogMSA6IDE3MTQzCitUb21za2HvYSBvYmxhc3Q7S29scGFzaGV2c2tpeSA6IDEgOiAyNDU2NQorVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtUb2JvbHNraXkgOiAxIDogMjY3MzAKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7VmFnYXlza2l5IDogMSA6IDI3ODMyCitPbXNrYe9hIG9ibGFzdDtUYXJza2l5IDogMSA6IDI1Nzk1CitPbXNrYe9hIG9ibGFzdDtVc3QtSXNoaW1za2l5IDogMSA6IDIxNDk2CitUb21za2HvYSBvYmxhc3Q7UGVydm9tYXlza2l5IDogMSA6IDI1Mjk3CitUb21za2HvYSBvYmxhc3Q7VGVndWxkZXRza2l5IDogMSA6IDk4MjYKK1RvbXNrYe9hIG9ibGFzdDtLb2xwYXNoZXZvIDogMSA6IDMyMDkxCitUaW91bWVuc2th72Egb2JsLiBy6XNpZHVlO1RvYm9sc2sgOiAxIDogMTE3OTM0CitPbXNrYe9hIG9ibGFzdDtUZXZyaXpza2l5IDogMSA6IDIwODk2CitUaW91bWVuc2th72Egb2JsLiBy6XNpZHVlO05pemhuZXRhdmRpbnNraXkgOiAxIDogMjczMzEKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7WWFya292c2tpeSA6IDEgOiAyNjIzMAorVG9tc2th72Egb2JsYXN0O01vbGNoYW5vdnNraXkgOiAxIDogMjA1OTMKK1RvbXNrYe9hIG9ibGFzdDtDaGFpbnNraXkgOiAxIDogMTgyOTMKK1RvbXNrYe9hIG9ibGFzdDtBc2lub3Zza2l5IDogMSA6IDE2OTM0CitUb21za2HvYSBvYmxhc3Q7QmFrY2hhcnNraXkgOiAxIDogMTkxMjkKK09tc2th72Egb2JsYXN0O1puYW1lbnNraXkgOiAxIDogMTUxOTcKK1RvbXNrYe9hIG9ibGFzdDtLcml2b3NoZWluc2tpeSA6IDEgOiAyMDQ4OAorT21za2HvYSBvYmxhc3Q7U2VkZWxuaWtvdnNraXkgOiAxIDogMTM4OTcKK1JVLVVOSy0yODg5IDogMSA6IDUwMTcKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7VHl1bWVuc2tpeSA6IDEgOiA4ODkwMQorVG9tc2th72Egb2JsYXN0O1RvbXNraXkgOiAxIDogOTg0NjgKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7VmlrdWxvdnNraXkgOiAxIDogMjEyMjQKK09tc2th72Egb2JsYXN0O0JvbHNoZXVrb3Zza2l5IDogMSA6IDExNDk4CitUb21za2HvYSBvYmxhc3Q7WnlyeWFuc2tpeSA6IDEgOiAxOTQ0MworVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtBcm9tYXNoZXZza2l5IDogMSA6IDE2ODE5CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7S3lzaHRvdnNraXkgOiAxIDogMTg5NjUKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7WXVyZ2luc2tpeSA6IDEgOiAxNTcxOAorVG9tc2th72Egb2JsYXN0O1NoZWdhcnNraXkgOiAxIDogMjU1MDYKK1RvbXNrYe9hIG9ibGFzdDtBc2lubyA6IDEgOiAzNDcwNAorVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtUeXVtZW4gOiAxIDogNTQ0MTE4CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7U2V2ZXJueWkgOiAxIDogMTI1NDUKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7WWFsdXRvcm92c2tpeSA6IDEgOiAxNzExOQorVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtTb3Jva2luc2tpeSA6IDEgOiAxMzMxNQorVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtaYXZvZG91a292c2tpeSA6IDEgOiAyMzYyNworT21za2HvYSBvYmxhc3Q7VGFyYSA6IDEgOiAyNjU5NQorS2VtZXJvdnNrYe9hIG9ibGFzdDtNYXJpaW5za2l5IDogMSA6IDIyMDgzCitUaW91bWVuc2th72Egb2JsLiBy6XNpZHVlO0dvbHlzaG1hbm92c2tpeSA6IDEgOiAyOTMzMworVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtJc2V0c2tpeSA6IDEgOiAyNjEzMAorT21za2HvYSBvYmxhc3Q7S29sb3NvdnNraXkgOiAxIDogMTgwOTcKK1RvbXNrYe9hIG9ibGFzdDtUb21zayA6IDEgOiA1MjM0OTEKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7T211dGluc2tpeSA6IDEgOiAyNDUyOAorT21za2HvYSBvYmxhc3Q7TXVyb210c2V2c2tpeSA6IDEgOiAzMjI5NAorT21za2HvYSBvYmxhc3Q7S3J1dGluc2tpeSA6IDEgOiAyMzc5NgorVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtBYmF0c2tpeSA6IDEgOiAyNzQzMQorT21za2HvYSBvYmxhc3Q7Qm9sc2hlcmVjaGVuc2tpeSA6IDEgOiAzNzc5MworVG9tc2th72Egb2JsYXN0O0tvemhldm5pa292c2tpeSA6IDEgOiAyNjAyOAorVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtZYWx1dG9yb3ZzayA6IDEgOiAzNzE0MgorS2VtZXJvdnNrYe9hIG9ibGFzdDtZYXlza2l5IDogMSA6IDI2NDgxCitUaW91bWVuc2th72Egb2JsLiBy6XNpZHVlO0lzaGltc2tpeSA6IDEgOiAzNjM0MQorS2VtZXJvdnNrYe9hIG9ibGFzdDtJemhtb3Jza2l5IDogMSA6IDE5MTUyCitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7VWJpbnNraXkgOiAxIDogMjEwNDAKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtLb2x5dmFuc2tpeSA6IDEgOiAyODQ0OAorT21za2HvYSBvYmxhc3Q7VHl1a2FsaW5za2l5IDogMSA6IDIyMjk2CitLZW1lcm92c2th72Egb2JsYXN0O1R5YXpoaW5za2l5IDogMSA6IDMzOTA3CitUaW91bWVuc2th72Egb2JsLiBy6XNpZHVlO1Vwb3JvdnNraXkgOiAxIDogMjIyMjUKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7WmF2b2RvdWtvdnNrIDogMSA6IDI1NjI5CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7VmVuZ2Vyb3Zza2l5IDogMSA6IDI0OTkxCitUaW91bWVuc2th72Egb2JsLiBy6XNpZHVlO0FybWl6b25za2l5IDogMSA6IDEzOTE2CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7S3V5YnlzaGV2c2tpeSA6IDEgOiAyMTkyOQorS2VtZXJvdnNrYe9hIG9ibGFzdDtNYXJpaW5zayA6IDEgOiAzOTI4MQorS2VtZXJvdnNrYe9hIG9ibGFzdDtZYXNoa2luc2tpeSA6IDEgOiAzNjQ0OAorTm92b3NpYmlyc2th72Egb2JsYXN0O1VzdC1UYXJrc2tpeSA6IDEgOiAxNTcwNgorS2VtZXJvdnNrYe9hIG9ibGFzdDtZdXJnaW5za2l5IDogMSA6IDIzMDYxCitLZW1lcm92c2th72Egb2JsYXN0O0NoZWJ1bGluc2tpeSA6IDEgOiAxODE3NQorVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtJc2hpbSA6IDEgOiA2NDE3MworUlUtVU5LLTI4OTAgOiAxIDogMjQ0OTUKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7QW56aGVyby1TdWR6aGVuc2sgOiAxIDogMTA5MTQ3CitLZW1lcm92c2th72Egb2JsYXN0O1RheWdhIDogMSA6IDI2MDkwCitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7Qm9sb3RuaW5za2l5IDogMSA6IDM2MzUwCitUaW91bWVuc2th72Egb2JsLiBy6XNpZHVlO0JlcmR5dXpoc2tpeSA6IDEgOiAxNTExNworTm92b3NpYmlyc2th72Egb2JsYXN0O0NodWx5bXNraXkgOiAxIDogMzEyMTQKK09tc2th72Egb2JsYXN0O05pemhuZW9tc2tpeSA6IDEgOiAyMjQ5NgorS2VtZXJvdnNrYe9hIG9ibGFzdDtUaXN1bHNraXkgOiAxIDogMzM0MTgKK09tc2th72Egb2JsYXN0O1NhcmdhdHNraXkgOiAxIDogMjIyOTYKK1Rpb3VtZW5za2HvYSBvYmwuIHLpc2lkdWU7U2xhZGtvdnNraXkgOiAxIDogMTc3MjAKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7S2VtZXJvdnNraXkgOiAxIDogMzY3NDEKK09tc2th72Egb2JsYXN0O1R1a2FsaW5zayA6IDEgOiAxMjQ5OAorVGlvdW1lbnNrYe9hIG9ibC4gculzaWR1ZTtLYXphbnNraXkgOiAxIDogMjQ0MjgKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7QmVyZXpvdnNraXkgOiAxIDogNTY3NzIKK09tc2th72Egb2JsYXN0O0dvcmtvdnNraXkgOiAxIDogMjg2OTUKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7WXVyZ2EgOiAxIDogOTI2MzMKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtLYXJnYXRza2l5IDogMSA6IDI1MDg5CitLZW1lcm92c2th72Egb2JsYXN0O1RvcGtpbnNraXkgOiAxIDogMTkyNTAKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtNb3Noa292c2tpeSA6IDEgOiA0MTY4NAorTm92b3NpYmlyc2th72Egb2JsYXN0O0NoYW5vdnNraXkgOiAxIDogMzM1ODQKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtUYXRhcnNraXkgOiAxIDogMjA5NDEKK09tc2th72Egb2JsYXN0O0x5dWJpbnNraXkgOiAxIDogNDQyOTIKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtLb2NoZW5ldnNraXkgOiAxIDogNDcwMTgKK09tc2th72Egb2JsYXN0O05henl2YXlldnNrIDogMSA6IDE0MDk3CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7VG9ndWNoaW5za2l5IDogMSA6IDY2OTcxCitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7Tm92b3NpYmlyc2tpeSA6IDEgOiAxMDgxNjEKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtLdXliaXNoZXYgOiAxIDogNTE5NTcKK09tc2th72Egb2JsYXN0O09tc2tpeSA6IDEgOiA4OTQ4NAorTm92b3NpYmlyc2th72Egb2JsYXN0O0JhcmFiaW5za2l5IDogMSA6IDE4MzczCitLZW1lcm92c2th72Egb2JsYXN0O0tyYXBpdmluc2tpeSA6IDEgOiAzMDY4MgorS2VtZXJvdnNrYe9hIG9ibGFzdDtLZW1lcm92byA6IDEgOiA1NDA5NDgKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtCYXJhYmluc2sgOiAxIDogMzQ1NzIKK09tc2th72Egb2JsYXN0O0thbGFjaGluc2tpeSA6IDEgOiAyMzU5NgorT21za2HvYSBvYmxhc3Q7SXNpbGt1bHNraXkgOiAxIDogMjIwOTYKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7VG9wa2kgOiAxIDogMzI5MzAKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtUYXRhcnNrIDogMSA6IDI4MzQ5CitPbXNrYe9hIG9ibGFzdDtNb3NrYWxlbnNraXkgOiAxIDogMzM3OTQKK09tc2th72Egb2JsYXN0O0tvcm1pbG92c2tpeSA6IDEgOiAyNjc5NQorTm92b3NpYmlyc2th72Egb2JsYXN0O05vdm9zaWJpcnNrIDogMSA6IDE0NDI1NDcKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7UHJvbXlzaGxlbm5vdnNraXkgOiAxIDogNDkwNTMKK09tc2th72Egb2JsYXN0O01hcnlhbm92c2tpeSA6IDEgOiAyODM5NQorT21za2HvYSBvYmxhc3Q7T21zayA6IDEgOiAxMTkwMjgxCitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7Q2hpc3Rvb3p5b3JueWkgOiAxIDogMjQwMDMKK09tc2th72Egb2JsYXN0O0thbGFjaGluc2sgOiAxIDogMjUzOTUKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtaZHZpbnNraXkgOiAxIDogMjE3MzEKK09tc2th72Egb2JsYXN0O09rb25lc2huaWtvdnNraXkgOiAxIDogMTk2OTYKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtJc2tpdGltc2tpeSA6IDEgOiA2OTkzNAorTm92b3NpYmlyc2th72Egb2JsYXN0O09iIDogMSA6IDI0OTkxCitLZW1lcm92c2th72Egb2JsYXN0O0xlbmluc2sta3V6bmV0c2tpeSA6IDEgOiAyOTQxMgorT21za2HvYSBvYmxhc3Q7SXNpbCdrdWwnIDogMSA6IDI2Mjk1CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7S3VwaW5za2l5IDogMSA6IDQwNTk4CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7RG92b2xlbnNraXkgOiAxIDogMjI2MjAKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7TWV6aGR1cmVjaGVuc2tpeSA6IDEgOiAzMDI5CitPbXNrYe9hIG9ibGFzdDtUYXZyaWNoZXNraXkgOiAxIDogNDIxOTIKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtNYXNseWFuaW5za2l5IDogMSA6IDI2ODY3CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7QmVyZHNrIDogMSA6IDgwODk5CitPbXNrYe9hIG9ibGFzdDtBem92c2t5IG5lbWV0c2t5IG5hdGlvbmFsIDogMSA6IDE5MDk2CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7T3JkeW5za2l5IDogMSA6IDM4NDI0CitPbXNrYe9hIG9ibGFzdDtTaGVyYmFrdWxza2l5IDogMSA6IDI3MTk1CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7SXNraXRpbSA6IDEgOiA2ODE1NworT21za2HvYSBvYmxhc3Q7Q2hlcmxha3NraXkgOiAxIDogMzc4OTMKK09tc2th72Egb2JsYXN0O1BvbHRhdnNraXkgOiAxIDogMjUwOTUKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7QmVsb3Zza2l5IDogMSA6IDMzNTE2CitLZW1lcm92c2th72Egb2JsYXN0O0d1cnlldnNraXkgOiAxIDogMTMxOTEKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7TGVuaW5zay1LdXpuZXRza2l5IDogMSA6IDE2Nzg3MworTm92b3NpYmlyc2th72Egb2JsYXN0O0tvY2hrb3Zza2l5IDogMSA6IDE2ODkxCitPbXNrYe9hIG9ibGFzdDtPZGVzc2tpeSA6IDEgOiAxOTE5NgorTm92b3NpYmlyc2th72Egb2JsYXN0O0NoZXJlcGFub3Zza2l5IDogMSA6IDUzMDQ0CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7U3V6dW5za2l5IDogMSA6IDM2MjUxCitPbXNrYe9hIG9ibGFzdDtQYXZsb2dyYWRza2l5IDogMSA6IDIzMzk2CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1phbGVzb3Zza2l5IDogMSA6IDIwODM5CitLZW1lcm92c2th72Egb2JsYXN0O0JlbG92byA6IDEgOiAxNzE1ODcKK05vdm9zaWJpcnNrYe9hIG9ibGFzdDtLcmFzbm96ZXJza2l5IDogMSA6IDQwMzAxCitLZW1lcm92c2th72Egb2JsYXN0O1Byb2tvcHlldnNraXkgOiAxIDogMzUxNzcKK09tc2th72Egb2JsYXN0O05vdm92YXJzaGF2c2tpeSA6IDEgOiAyOTQ5NQorTm92b3NpYmlyc2th72Egb2JsYXN0O0JhZ2Fuc2tpeSA6IDEgOiAxOTI2MgorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtLcnV0aWtoaW5rc2l5IDogMSA6IDE0NzI3CitOb3Zvc2liaXJza2HvYSBvYmxhc3Q7S2FyYXN1a3NraXkgOiAxIDogNTExNjcKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7R3VyeWV2c2sgOiAxIDogMzkzNzkKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7WmFyaW5za2l5IDogMSA6IDI0NDQ1CitLZW1lcm92c2th72Egb2JsYXN0O05vdm9rdXpuZXRza2l5IDogMSA6IDQ5MzQ2CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1RhbG1lbnNraXkgOiAxIDogNTA3OTQKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7UGFua3J1c2h5a2hpbnNraXkgOiAxIDogMTgzMzQKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7S2FtZW5za2l5IDogMSA6IDE3ODMzCitPbXNrYe9hIG9ibGFzdDtSdXNza28tUG9seWFuc2tpeSA6IDEgOiAyODY5NQorS2VtZXJvdnNrYe9hIG9ibGFzdDtLaXNpbGV2c2sgOiAxIDogMTI4NDk1CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1BlcnZvbWF5c2tpeSA6IDEgOiA1MTg5NworS2VtZXJvdnNrYe9hIG9ibGFzdDtQcm9rb3B5ZXZzayA6IDEgOiAyNjA2MDUKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7S3l0bWFub3Zza2l5IDogMSA6IDE5MzM2CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0toYWJhcnNraXkgOiAxIDogMjEzNDAKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7S2FtZW4nLW5hLU9iaSA6IDEgOiA0NDY4MworS2VtZXJvdnNrYe9hIG9ibGFzdDtNZXpzaGR1cmVjaGVuc2sgOiAxIDogMTA1NDM0CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1NoZWxhYm9saWtoaW5za2l5IDogMSA6IDE2MzMwCitLZW1lcm92c2th72Egb2JsYXN0O05vdm9rdXpuZXRzayA6IDEgOiA2MDAxNjMKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7VG9ndWxza2l5IDogMSA6IDEyMTIzCitLZW1lcm92c2th72Egb2JsYXN0O015c2tpIDogMSA6IDQ3Njg1CitSVS1VTkstMjg5MSA6IDEgOiA1Mjg5OAorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtCdXJsaW5za2l5IDogMSA6IDE2NDMxCitLZW1lcm92c2th72Egb2JsYXN0O09zaW5uaWtpIDogMSA6IDEwNTE0MQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtQYXZsb3Zza2l5IDogMSA6IDQwODc2CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0JheWV2c2tpeSA6IDEgOiAxNTMyOQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtLb3Npa2hpbnNraXkgOiAxIDogMjI1NDIKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7VHl1bWVudHNldnNraXkgOiAxIDogMTg4MzUKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7VGFzaHRhZ29sc2tpeSA6IDEgOiAzNzQyNQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtZZWx0c292c2tpeSA6IDEgOiA5NjE4CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0Jhcm5hdWwgOiAxIDogNjU5MzI2CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1N1eWV0c2tpeSA6IDEgOiA3NDE0CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO05vdm9hbHRheXNrIDogMSA6IDY5MjI5CitSVS1VTkstMjg5MiA6IDEgOiAyMDUzOAorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtSZWJyaWtoaW5za2l5IDogMSA6IDI5ODU2CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1RzZWxpbm5peSA6IDEgOiAyMTk0MQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtLYWxtYW5za2l5IDogMSA6IDE1ODI5CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1NsYXZnb3JvZHNraXkgOiAxIDogMTMyMjUKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7VHJvaXRza2l5IDogMSA6IDMzODYzCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0JsYWdvdmVzY2hlbnNraXkgOiAxIDogMzY5NjkKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7WmF2eWFsb3Zza2l5IDogMSA6IDIyNTQyCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1NsYXZnb3JvZCA6IDEgOiA1OTQxMQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtTb2x0b25za2l5IDogMSA6IDEyNTIzCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1RvcGNoaWtoaW5za2l5IDogMSA6IDI4NDUzCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1RhYnVuc2tpeSA6IDEgOiAxMzMyNQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtNYW1vbnRvdnNraXkgOiAxIDogMjc0NTEKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7Wm9uYWxueWkgOiAxIDogMjA1MzgKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7Qml5c2tpeSA6IDEgOiAzNDU2NAorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtSb2RpbnNraXkgOiAxIDogMjU5NDgKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7Um9tYW5vdnNraXkgOiAxIDogMTY1MzEKK0tlbWVyb3Zza2HvYSBvYmxhc3Q7VGFzaHRhZ29sIDogMSA6IDI1NDA2CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0t1bHVuZGluc2tpeSA6IDEgOiAyNzg1MgorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtBbGV5c2tpeSA6IDEgOiAyMzE0MworUmVzcG91Ymxpa2EgQWx0Ye87VHVyb2NoYWtza2l5IDogMSA6IDE0NTMyCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1VzdC1QcmlzdGFuc2tpeSA6IDEgOiAxOTQzNgorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtTaGlwdW5vdnNraXkgOiAxIDogMzg4NzIKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7S3Jhc25vZ29yc2tpeSA6IDEgOiAyMDYzOAorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtCeXN0cm9pc3Rva3NraXkgOiAxIDogMTQzMjcKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7S2x5dWNoZXZza2l5IDogMSA6IDIwMjM4CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0JpeXNrIDogMSA6IDI0MDc0OAorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtBbGV5c2sgOiAxIDogMzA0NTcKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7U21vbGVuc2tpeSA6IDEgOiAyNjc1MAorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtTb3ZldHNraXkgOiAxIDogMTg1MzQKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7Tm92aWNoaWtoaW5za2l5IDogMSA6IDEyNTIzCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1BldHJvcGF2bG92c2tpeSA6IDEgOiAxNDcyNworQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtWb2xjaGlraGluc2tpeSA6IDEgOiAyMjk0MworQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtVc3QtS2FsbWFuc2tpeSA6IDEgOiAyMDgzOQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtQb3NwZWxpa2hpbnNraXkgOiAxIDogMzAxNTYKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7TWlraGF5bG92c2tpeSA6IDEgOiAyNDg0NgorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtBbHRheXNraXkgOiAxIDogMjcwNTAKK1Jlc3BvdWJsaWthIEFsdGHvO0Nob3lza2l5IDogMSA6IDk3NTUKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7WWVnb3J5ZXZza2l5IDogMSA6IDE2MTMwCitSZXNwb3VibGlrYSBBbHRh7ztNYXltaW5za2l5IDogMSA6IDI0Mjg3CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0JlbG9rdXJpa2hhIDogMSA6IDEzMjI1CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1NvbG9uZXNoZW5za2l5IDogMSA6IDE0NzI3CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO1J1YnRzb3Zza2l5IDogMSA6IDI3MTUxCitSZXNwb3VibGlrYSBBbHRh7ztHb3Juby1BbHRheXNrIDogMSA6IDQ3MzU1CitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0tyYXNub3NoZWtvdnNraXkgOiAxIDogMjQ4NDYKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7Q2hhcnlzaHNraXkgOiAxIDogMTYzMzAKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7VWdsb3Zza2l5IDogMSA6IDE2NTMxCitBbHRh73NraSBrcmHvIHLpc2lkdWVsO0t1cnlpbnNraXkgOiAxIDogMTUzMjkKK1Jlc3BvdWJsaWthIEFsdGHvO1NoZWJhbGluc2tpeSA6IDEgOiAxNDQzMAorUmVzcG91Ymxpa2EgQWx0Ye87Q2hlbWFsc2t5IDogMSA6IDk1NTIKK0FsdGHvc2tpIGtyYe8gculzaWR1ZWw7Wm1laW5vZ29yc2tpeSA6IDEgOiAxMzgyNgorUmVzcG91Ymxpa2EgQWx0Ye87VWxhZ2Fuc2tpeSA6IDEgOiAxMjE5NAorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtSdWJ0em92c2sgOiAxIDogMTcxOTIwCitSZXNwb3VibGlrYSBBbHRh7ztVc3QtS2Fuc2tpeSA6IDEgOiAxNzM3NworQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtMb2t0ZXZza2l5IDogMSA6IDM1NDY2CitSZXNwb3VibGlrYSBBbHRh7ztPbmd1ZGF5c2tpeSA6IDEgOiAxNzI3NQorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtabWVpbm9nb3JzayA6IDEgOiAxMjgyNAorQWx0Ye9za2kga3Jh7yBy6XNpZHVlbDtUcmV0aXlha292c2tpeSA6IDEgOiAxNjUzMQorUmVzcG91Ymxpa2EgQWx0Ye87VXN0LUtva3NpbnNraXkgOiAxIDogMTg1OTYKK1Jlc3BvdWJsaWthIEFsdGHvO0tvc2gtQWdhY2hza2l5IDogMSA6IDE0NjMzCitSVS1VTkstMjg5MyA6IDEgOiAxMjY0OAorUlUtVU5LLTI4OTQgOiAxIDogMTI2NDgKK1JVLVVOSy0yODk1IDogMSA6IDUwMTcKK1JVLVVOSy0yODk2IDogMSA6IDI0NDk1CitSVS1VTkstMjg5NyA6IDEgOiA1Mjg5OAorUlUtVU5LLTI4OTggOiAxIDogMjA1MzgKK1RhdGFyc3RhbjtCYWx0YXNpbnNraXkgOiAxIDogMzAzODEKK1RhdGFyc3RhbjtBZ3J5enNraXkgOiAxIDogMzg4MzEKK1RhdGFyc3RhbjtBcnNraXkgOiAxIDogNDg0ODgKK1RhdGFyc3RhbjtWeXNva29nb3Jza2l5IDogMSA6IDUxODA4CitUYXRhcnN0YW47QXRuaW5za2l5IDogMSA6IDE0Njg3CitUYXRhcnN0YW47S3VrbW9yc2tpeSA6IDEgOiA1MjExMAorVGF0YXJzdGFuO1NhYmluc2tpeSA6IDEgOiAzMTk5MAorVGF0YXJzdGFuO01hbWFkeXNoc2tpeSA6IDEgOiA1MDkwMworVGF0YXJzdGFuO1plbGVub2RvbHNraXkgOiAxIDogNTk0NTQKK1RhdGFyc3RhbjtNZW5kZWxleWV2c2tpeSA6IDEgOiAyOTQ3NQorVGF0YXJzdGFuO1Blc3RyZWNoaW5za2l5IDogMSA6IDI4NTcwCitUYXRhcnN0YW47WWVsYWJ1emhza2l5IDogMSA6IDEwNDYyCitUYXRhcnN0YW47S2F6YW4gOiAxIDogMTA5NzMyNworVGF0YXJzdGFuO0FrdGFueXNoc2tpeSA6IDEgOiAzMjU5NAorVGF0YXJzdGFuO1R1eWxhY2hpbnNraXkgOiAxIDogMTM0ODAKK1RhdGFyc3RhbjtUdWtheWV2c2tpeSA6IDEgOiAyNzE2MgorVGF0YXJzdGFuO01lbnplbGluc2tpeSA6IDEgOiAzMDQ4MQorVGF0YXJzdGFuO1plbGVub2RvbCdzayA6IDEgOiAxMDE0MDMKK1RhdGFyc3RhbjtSeWJuby1TbG9ib2Rza2l5IDogMSA6IDMwOTg0CitUYXRhcnN0YW47RWxhYnVnYSA6IDEgOiA2NDI4MgorVGF0YXJzdGFuO1ZlcmtobmV1c2xvbnNraXkgOiAxIDogMTk1MTYKK1RhdGFyc3RhbjtMYWlzaGV2c2tpeSA6IDEgOiAzNTkxNAorVGF0YXJzdGFuO05hYmVyZXpobml5ZSBDaGVsbnkgOiAxIDogNTMwOTU4CitUYXRhcnN0YW47Tml6aG5la2Ftc2tpeSA6IDEgOiAzOTEzMworVGF0YXJzdGFuO05penNobmVrYW1zayA6IDEgOiAyMDU3MjQKK1JVLVVOSy0yODk5IDogMSA6IDE1ODk1CitSVS1VTkstMjkwMCA6IDEgOiAyMjYzNQorVGF0YXJzdGFuO1Nhcm1hbm92c2tpeSA6IDEgOiAzNDgwNworVGF0YXJzdGFuO1phaW5za2l5IDogMSA6IDE2MDk2CitUYXRhcnN0YW47S2Ftc2tvLVVzdHlpbnNraXkgOiAxIDogMTkwMTMKK1RhdGFyc3RhbjtNdXNseXVtb3Zza2l5IDogMSA6IDIzODQyCitUYXRhcnN0YW47Q2hpc3RvcG9sc2tpeSA6IDEgOiAyMTkzMAorVGF0YXJzdGFuO0NoaXN0b3BvbCcgOiAxIDogNjc0MDEKK1RhdGFyc3RhbjtBbGVrc2V5ZXZza2l5IDogMSA6IDI1NDUxCitUYXRhcnN0YW47Tm92b3NoZXNobWluc2tpeSA6IDEgOiAxNTI5MQorVGF0YXJzdGFuO1phaW5zayA6IDEgOiA0MDU0MQorVGF0YXJzdGFuO0J1aW5za2l5IDogMSA6IDQ2MDc0CitUYXRhcnN0YW47QWxtZXR5ZXZza2l5IDogMSA6IDM1NTExCitUYXRhcnN0YW47S3V5YnlzaGV2c2tpeSA6IDEgOiAyMzMzOQorVGF0YXJzdGFuO1RldHl1c2hza2l5IDogMSA6IDI4MzY5CitUYXRhcnN0YW47QXpuYWtheWV2c2tpeSA6IDEgOiAyOTQ3NQorVGF0YXJzdGFuO0Frc3ViYXlldnNraXkgOiAxIDogMzM2MDAKK1RhdGFyc3RhbjtBbGtleWV2c2tpeSA6IDEgOiAyMzY0MQorVGF0YXJzdGFuO0NoZXJlbXNoYW5za2l5IDogMSA6IDIyMTMyCitUYXRhcnN0YW47QWxtZXR5ZXZzayA6IDEgOiAxNDUzNjUKK1RhdGFyc3RhbjtPa3R5YWJyc2tpeSA6IDEgOiA1NjMzNQorVGF0YXJzdGFuO0F6bmFrYWV2byA6IDEgOiAzNTEwOQorVGF0YXJzdGFuO0Ryb3poYW5vdnNraXkgOiAxIDogMjg2NzEKK091bGlhbm92c2th72Egb2JsYXN0O1N0YXJvbWF5bnNraXkgOiAxIDogMjE1NjMKK1RhdGFyc3RhbjtMZW5pbm9nb3Jza2l5IDogMSA6IDIzNDM5CitUYXRhcnN0YW47WXV0YXppbnNraXkgOiAxIDogMjM3NDEKK1RhdGFyc3RhbjtCdWd1bG1pbnNraXkgOiAxIDogMjExMjYKK091bGlhbm92c2th72Egb2JsYXN0O1N1cnNraXkgOiAxIDogMjc4NjkKK091bGlhbm92c2th72Egb2JsYXN0O1RzeWxuaW5za2l5IDogMSA6IDMxNzM0CitPdWxpYW5vdnNrYe9hIG9ibGFzdDtVbHlhbm92c2tpeSA6IDEgOiA1Nzk3NgorVGF0YXJzdGFuO0xlbmluaWdvcnNrIDogMSA6IDY1Mjg4CitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO0NoZWxuby1WZXJzaGluc2tpeSA6IDEgOiAyMTcwOQorU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtTaGVudGFsaW5za2l5IDogMSA6IDIwMzA5CitPdWxpYW5vdnNrYe9hIG9ibGFzdDtNZWxla2Vzc2tpeSA6IDEgOiA0MjIxMQorT3VsaWFub3Zza2HvYSBvYmxhc3Q7TWF5bnNraXkgOiAxIDogMzQ5ODkKK1RhdGFyc3RhbjtCdWd1bCdtYSA6IDEgOiA5Mjc1MgorU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtLbHlhdmxpbnNraXkgOiAxIDogMTg0MDgKK091bGlhbm92c2th72Egb2JsYXN0O05vdm9tYWx5a2xpbnNraXkgOiAxIDogMTk3MzIKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7S29zaGtpbnNraXkgOiAxIDogMjUwMTEKK091bGlhbm92c2th72Egb2JsYXN0O0NoZXJkYWtsaW5za2l5IDogMSA6IDQzMzMwCitUYXRhcnN0YW47QmF2bGluc2tpeSA6IDEgOiAzNjMxNgorT3VsaWFub3Zza2HvYSBvYmxhc3Q7S2Fyc3Vuc2tpeSA6IDEgOiAzMzc2OQorT3VsaWFub3Zza2HvYSBvYmxhc3Q7VWx5YW5vdnNrIDogMSA6IDY5MDkzMworU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtTZXJnaXlldnNraXkgOiAxIDogNDgzMjAKK091bGlhbm92c2th72Egb2JsYXN0O0luemVuc2tpeSA6IDEgOiA0NjI3OQorT3VsaWFub3Zza2HvYSBvYmxhc3Q7RGltaXRyb3ZncmFkIDogMSA6IDEzMjYzMworU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtLYW15c2hsZW5za3kgOiAxIDogMTE2MDUKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7SXNha2xpbnNraXkgOiAxIDogMTU4MDcKK091bGlhbm92c2th72Egb2JsYXN0O1Zlc2hrYXltc2tpeSA6IDEgOiAyNzE1NworT3VsaWFub3Zza2HvYSBvYmxhc3Q7U2VuZ2lsZXlldnNraXkgOiAxIDogMzA2MTUKK091bGlhbm92c2th72Egb2JsYXN0O1RlcmVuZ3Vsc2tpeSA6IDEgOiAyMjk4NworU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtFbGtob3Zza3kgOiAxIDogOTcwNAorT3VsaWFub3Zza2HvYSBvYmxhc3Q7S3V6b3ZhdG92c2tpeSA6IDEgOiAzMDgxOQorUGVuemVuc2th72Egb2JsYXN0O05pa29sc2tpeSA6IDEgOiA0NzMxNworU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtQb2todmlzdG5ldm8gOiAxIDogMzIzMTQKK1BlbnplbnNrYe9hIG9ibGFzdDtCZWRub2RlbXlhbm92c2tpeSA6IDEgOiAxNTk3NgorUGVuemVuc2th72Egb2JsYXN0O05hcm92Y2hhdHNraXkgOiAxIDogMTU1NjkKK1BlbnplbnNrYe9hIG9ibGFzdDtJc3NpbnNraXkgOiAxIDogMTU3NzIKK1BlbnplbnNrYe9hIG9ibGFzdDtMdW5pbm8gOiAxIDogMjYyNTMKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7U3RhdnJvcG9sc2tpeSA6IDEgOiAzOTkxNworT3VsaWFub3Zza2HvYSBvYmxhc3Q7QmF6YXJub3N5emdhbnNraXkgOiAxIDogMTM3MzEKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7S3Jhc25veWFyc2tpeSA6IDEgOiA1MTQyMgorT3VsaWFub3Zza2HvYSBvYmxhc3Q7QmFyeXNoc2tpeSA6IDEgOiAzNjUxNQorUGVuemVuc2th72Egb2JsYXN0O1plbWV0Y2hpbnNraXkgOiAxIDogMzgxNTkKK1BlbnplbnNrYe9hIG9ibGFzdDtWYWRpbnNraXkgOiAxIDogMTQyNDYKK1BlbnplbnNrYe9hIG9ibGFzdDtOaXpobmVsb21vdnNraXkgOiAxIDogMjU3NDUKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7U2hpZ29uc2tpeSA6IDEgOiAyNTQxMQorUGVuemVuc2th72Egb2JsYXN0O01va3NoYW5za2l5IDogMSA6IDM1MDA1CitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO0tpbmVsLUNoZXJrYXNza2l5IDogMSA6IDUwMzIxCitPdWxpYW5vdnNrYe9hIG9ibGFzdDtCYXJ5c2ggOiAxIDogMjIwNzIKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7Vm9semhza2l5IDogMSA6IDYyODI3CitQZW56ZW5za2HvYSBvYmxhc3Q7U29zbm92b2JvcnNraXkgOiAxIDogMjQ1MjQKK1JVLVVOSy0yOTAxIDogMSA6IDI3Njc4CitQZW56ZW5za2HvYSBvYmxhc3Q7QmVzc29ub3Zza2l5IDogMSA6IDQ1NzkxCitQZW56ZW5za2HvYSBvYmxhc3Q7R29yb2Rpc2NoZW5za2l5IDogMSA6IDYwNDQ0CitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO1RvbHlhdHRpIDogMSA6IDY4ODY5MQorUGVuemVuc2th72Egb2JsYXN0O0Jhc2htYWtvdnNraXkgOiAxIDogMjkwMDEKK1BlbnplbnNrYe9hIG9ibGFzdDtQYWNoZWxtc2tpeSA6IDEgOiAyMjQ4OAorU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtTeXpyYW5za2l5IDogMSA6IDI0NjEwCitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO0tpbmVsc2tpeSA6IDEgOiAzMTExMworU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtaaGlndWx5b3Zza2l5IDogMSA6IDU4MDI0CitQZW56ZW5za2HvYSBvYmxhc3Q7S3V6bmV0c2tpeSA6IDEgOiA0MzA0MworUGVuemVuc2th72Egb2JsYXN0O0thbWVuc2tpeSA6IDEgOiAyNzA2NworU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtPdHJhZG55aSA6IDEgOiA1MTEyMgorT3VsaWFub3Zza2HvYSBvYmxhc3Q7Tm92b3NwYXNza2l5IDogMSA6IDI1MDIxCitPdWxpYW5vdnNrYe9hIG9ibGFzdDtOaWtvbGF5ZXZza2l5IDogMSA6IDM1MTkzCitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO0JvcnNraXkgOiAxIDogMjUzMTEKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7U2FtYXJhIDogMSA6IDEyNjcwMzUKK1BlbnplbnNrYe9hIG9ibGFzdDtQZW56YSA6IDEgOiA1NTgwMzgKK1BlbnplbnNrYe9hIG9ibGFzdDtQZW56ZW5za2l5IDogMSA6IDQzMTQ1CitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO0JvZ2F0b3Zza2l5IDogMSA6IDE2MDA3CitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO0tpbmVsIDogMSA6IDQ5NTIxCitQZW56ZW5za2HvYSBvYmxhc3Q7QmVsaW5za2l5IDogMSA6IDQwMDkyCitQZW56ZW5za2HvYSBvYmxhc3Q7S2FtZW5rYSA6IDEgOiA0MzM0OQorU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtPa3R5YWJyc2sgOiAxIDogMzEzMTMKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7UHJpdm9semhza2l5IDogMSA6IDIzOTEwCitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO0JlemVuY2h1a3NraXkgOiAxIDogNDM4MTgKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7U3l6cmFuIDogMSA6IDE4NDk3OAorUGVuemVuc2th72Egb2JsYXN0O0t1em5ldHNrIDogMSA6IDEwMzg5NAorU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtOb3Zva3V5YnlzaGV2c2sgOiAxIDogMTE1MTQ5CitQZW56ZW5za2HvYSBvYmxhc3Q7U2hlbXlzaGV5c2tpeSA6IDEgOiAyMjg5NQorT3VsaWFub3Zza2HvYSBvYmxhc3Q7UmFkaXNjaGV2c2tpeSA6IDEgOiAxNzM5MworUGVuemVuc2th72Egb2JsYXN0O0thbWVzaGtpcnNraXkgOiAxIDogMTY4OTIKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7TmVmdGVnb3Jza2l5IDogMSA6IDMyOTE0CitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO0NoYXBheWV2c2sgOiAxIDogOTQ3NDAKK1BlbnplbnNrYe9hIG9ibGFzdDtOZXZlcmtpbnNraXkgOiAxIDogMTk5NDQKK091bGlhbm92c2th72Egb2JsYXN0O1N0YXJva3VsYXRraW5za2l5IDogMSA6IDIwMjQxCitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO0tyYXNub2FybWV5c2tpeSA6IDEgOiAxOTEwOAorUGVuemVuc2th72Egb2JsYXN0O0tvbHlzaGxleXNraXkgOiAxIDogMzA5MzQKK1BlbnplbnNrYe9hIG9ibGFzdDtLb25kb2xza2l5IDogMSA6IDEyNjE4CitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO0FsZWtzZXlldnNraXkgOiAxIDogMTQ0MDYKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7S2h2b3Jvc3R5YW5za2l5IDogMSA6IDE1NjA3CitPdWxpYW5vdnNrYe9hIG9ibGFzdDtQYXZsb3Zza2l5IDogMSA6IDE3ODAwCitQZW56ZW5za2HvYSBvYmxhc3Q7U2VyZG9ic2tpeSA6IDEgOiAyMTk4MAorUGVuemVuc2th72Egb2JsYXN0O1RhbWFsaW5za2l5IDogMSA6IDIxNzc2CitQZW56ZW5za2HvYSBvYmxhc3Q7TG9wYXRpbm8gOiAxIDogMTgzMTYKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7S2h2YWx5bnNraXkgOiAxIDogMTU0NzQKK1BlbnplbnNrYe9hIG9ibGFzdDtCZWtvdnNraXkgOiAxIDogMjE5ODAKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7RHVraG92bml0c2tpeSA6IDEgOiAxNjk4MQorU2FtYXJza2HvYSAoS29172J5Y2hldnNrYTtCb2xzaGVnbHVzaGl0c2tpeSA6IDEgOiAyMTkwOQorU2FyYXRvdnNrYe9hIG9ibGFzdDtCYWx0YXlza2l5IDogMSA6IDEyNjYwCitTYW1hcnNrYe9hIChLb3XvYnljaGV2c2thO1Blc3RyYXZza2l5IDogMSA6IDE4OTA4CitQZW56ZW5za2HvYSBvYmxhc3Q7TWFsb3NlcmRvYmluc2tpeSA6IDEgOiAxMjcyMAorU2FyYXRvdnNrYe9hIG9ibGFzdDtCYXphcm5vLUthcmFidWxha3NraXkgOiAxIDogMzY3NzYKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7Vm9sc2tpeSA6IDEgOiAzMTA0OAorU2FyYXRvdnNrYe9hIG9ibGFzdDtZZWthdGVyaW5vdnNraXkgOiAxIDogMjM4MTQKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7SXZhbnRleWV2c2tpeSA6IDEgOiAxNjg4MQorU2FyYXRvdnNrYe9hIG9ibGFzdDtLaHZhbHluc2sgOiAxIDogMTQ2NzAKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7UGV0cm92c2tpeSA6IDEgOiAxNjE3NworUGVuemVuc2th72Egb2JsYXN0O1NlcmRvYnNrIDogMSA6IDQ2MDk2CitTYXJhdG92c2th72Egb2JsYXN0O1J0aXNjaGV2c2tpeSA6IDEgOiAyMTYwMworU2FyYXRvdnNrYe9hIG9ibGFzdDtOb3ZvYnVyYXNza2l5IDogMSA6IDE3NDgzCitTYXJhdG92c2th72Egb2JsYXN0O1B1Z2FjaHlvdnNraXkgOiAxIDogMjU1MjIKK1NhbWFyc2th72EgKEtvde9ieWNoZXZza2E7Qm9sc2hlY2hlcm5pZ292c2tpeSA6IDEgOiAyMjEwOQorU2FyYXRvdnNrYe9hIG9ibGFzdDtQZXRyb3ZzayA6IDEgOiAzNTQ2OQorU2FyYXRvdnNrYe9hIG9ibGFzdDtUdXJrb3Zza2l5IDogMSA6IDE4MTg3CitTYXJhdG92c2th72Egb2JsYXN0O1J0aXNoY2hldm8gOiAxIDogNDI4MDQKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7QXRrYXJza2l5IDogMSA6IDE3Njg0CitTYXJhdG92c2th72Egb2JsYXN0O0JhbGFrb3Zza2l5IDogMSA6IDIwMDk2CitTYXJhdG92c2th72Egb2JsYXN0O1BlcmVseXVic2tpeSA6IDEgOiAxOTM5MworU2FyYXRvdnNrYe9hIG9ibGFzdDtBcmthZGFrc2tpeSA6IDEgOiAzMzg2MgorU2FyYXRvdnNrYe9hIG9ibGFzdDtWb3NrcmVzZW5za2l5IDogMSA6IDEyNzYxCitTYXJhdG92c2th72Egb2JsYXN0O1ZvbHNrIDogMSA6IDgxNjkwCitTYXJhdG92c2th72Egb2JsYXN0O0JhbGFrb3ZvIDogMSA6IDIwODI5NAorU2FyYXRvdnNrYe9hIG9ibGFzdDtUYXRpc2NoZXZza2l5IDogMSA6IDM3Mzc4CitTYXJhdG92c2th72Egb2JsYXN0O1B1Z2FjaGV2IDogMSA6IDQxODAwCitTYXJhdG92c2th72Egb2JsYXN0O1JvbWFub3Zza2l5IDogMSA6IDE5MTkyCitTYXJhdG92c2th72Egb2JsYXN0O01hcmtzb3Zza2l5IDogMSA6IDMzNDYwCitTYXJhdG92c2th72Egb2JsYXN0O0tyYXNub3BhcnRpemFuc2tpeSA6IDEgOiAxOTQ5MworU2FyYXRvdnNrYe9hIG9ibGFzdDtBdGthcnNrIDogMSA6IDI3NDMxCitTYXJhdG92c2th72Egb2JsYXN0O1NhcmF0b3Zza2l5IDogMSA6IDQwNjk0CitTYXJhdG92c2th72Egb2JsYXN0O0JhbGFzaG92c2tpeSA6IDEgOiAzNDU2NQorU2FyYXRvdnNrYe9hIG9ibGFzdDtZZXJzaG92c2tpeSA6IDEgOiA1NDA1OAorU2FyYXRvdnNrYe9hIG9ibGFzdDtLYWxpbmluc2tpeSA6IDEgOiA0MDQ5MworU2FyYXRvdnNrYe9hIG9ibGFzdDtNYXJ4IDogMSA6IDMyNzU2CitTYXJhdG92c2th72Egb2JsYXN0O096aW5za2l5IDogMSA6IDI4MDM0CitTYXJhdG92c2th72Egb2JsYXN0O0x5c29nb3Jza2l5IDogMSA6IDIxODA0CitTYXJhdG92c2th72Egb2JsYXN0O1NhcmF0b3YgOiAxIDogOTEzMjYwCitTYXJhdG92c2th72Egb2JsYXN0O0VuZ2Vsc2tpeSA6IDEgOiA0MzkxMAorU2FyYXRvdnNrYe9hIG9ibGFzdDtEZXJnYWNoeW92c2tpeSA6IDEgOiAzMTM1MAorU2FyYXRvdnNrYe9hIG9ibGFzdDtCYWxhc2hvdiA6IDEgOiA5NjM2MAorU2FyYXRvdnNrYe9hIG9ibGFzdDtGZWRvcm92c2tpeSA6IDEgOiAyMzAxMAorU2FyYXRvdnNrYe9hIG9ibGFzdDtTb3ZldHNraXkgOiAxIDogMjk3NDIKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7RW5nZWxzIDogMSA6IDIxODQ0MworU2FyYXRvdnNrYe9hIG9ibGFzdDtTYW1veWxvdnNraXkgOiAxIDogMjcxMzAKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7S3Jhc25vYXJtZXlza2l5IDogMSA6IDIyNjA4CitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7Tm92b25pa29sYXlldnNraXkgOiAxIDogMjg2MTMKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7S3Jhc25va3V0c2tpeSA6IDEgOiAzODY4NQorVm9sZ29ncmFkc2th72Egb2JsYXN0O1llbGFuc2tpeSA6IDEgOiAzODMyMAorVm9sZ29ncmFkc2th72Egb2JsYXN0O1VyeXVwaW5za2l5IDogMSA6IDMzOTcyCitTYXJhdG92c2th72Egb2JsYXN0O1JvdmVuc2tpeSA6IDEgOiAxOTU5NAorVm9sZ29ncmFkc2th72Egb2JsYXN0O1poaXJub3Zza2l5IDogMSA6IDQ5MzQwCitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7S2lrdmlkemVuc2tpeSA6IDEgOiAxOTgxNworVm9sZ29ncmFkc2th72Egb2JsYXN0O1J1ZG55YW5za2l5IDogMSA6IDIxNzM4CitTYXJhdG92c2th72Egb2JsYXN0O0tyYXNub2FybWV5c2sgOiAxIDogMjUzMjEKK1NhcmF0b3Zza2HvYSBvYmxhc3Q7UGl0ZXJza2l5IDogMSA6IDE5OTk1CitTYXJhdG92c2th72Egb2JsYXN0O05vdm91emVuc2tpeSA6IDEgOiAzNTI2OAorVm9sZ29ncmFkc2th72Egb2JsYXN0O05vdm9hbm5pbnNraXkgOiAxIDogNDUwOTQKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtVcnVwaW5zayA6IDEgOiA0NDU4OAorVm9sZ29ncmFkc2th72Egb2JsYXN0O0Rhbmlsb3Zza2l5IDogMSA6IDIyMTQzCitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7U3Rhcm9wb2x0YXZza2l5IDogMSA6IDI2NTkxCitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7S2FteXNoaW5za2l5IDogMSA6IDQwMjQxCitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7S290b3Zza2l5IDogMSA6IDQxMTUxCitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7TmVraGF5ZXZza2l5IDogMSA6IDIwMTIwCitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7TWlraGF5bG92c2tpeSA6IDEgOiAyNjc5MworU2FyYXRvdnNrYe9hIG9ibGFzdDtBbGVrc2FuZHJvdi1HYXlza2l5IDogMSA6IDE3Nzg1CitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7QWxla3NleWV2c2tpeSA6IDEgOiAyMDEyMAorVm9sZ29ncmFkc2th72Egb2JsYXN0O1BhbGxhc292c2tpeSA6IDEgOiA0OTk0NworVm9sZ29ncmFkc2th72Egb2JsYXN0O05pa29sYXlldnNraXkgOiAxIDogMzY4MDMKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtGcm9sb3Zza2l5IDogMSA6IDE2ODg1CitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7T2xraG92c2tpeSA6IDEgOiAyMDAxOQorVm9sZ29ncmFkc2th72Egb2JsYXN0O0thbXlzaGluIDogMSA6IDEyODkxMgorVm9sZ29ncmFkc2th72Egb2JsYXN0O01pa2hhaWxvdmthIDogMSA6IDY0MDAxCitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7UG9kdGVsa292c2tpeSA6IDEgOiAyNTM3OAorVm9sZ29ncmFkc2th72Egb2JsYXN0O0J5a292c2tpeSA6IDEgOiAyODYxMworVm9sZ29ncmFkc2th72Egb2JsYXN0O1NlcmFmaW1vdmljaHNraXkgOiAxIDogMjkwMTgKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtGcm9sb3ZvIDogMSA6IDQyNjY3CitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7RHVib3Zza2l5IDogMSA6IDMwNzM3CitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7SWxvdmxpbnNraXkgOiAxIDogMzQwNzMKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtLbGV0c2tpeSA6IDEgOiAxOTgxNworVm9sZ29ncmFkc2th72Egb2JsYXN0O0xlbmluc2tpeSA6IDEgOiAzMTg0OQorVm9sZ29ncmFkc2th72Egb2JsYXN0O0thbGFjaGV2c2tpeSA6IDEgOiA1NTgxMQorVm9sZ29ncmFkc2th72Egb2JsYXN0O0dvcm9kaXNjaGVuc2tpeSA6IDEgOiA1MTg2OAorVm9sZ29ncmFkc2th72Egb2JsYXN0O1NyZWRuZWFraHR1Ymluc2tpeSA6IDEgOiA1MDI1MAorVm9sZ29ncmFkc2th72Egb2JsYXN0O1N1cm92aWtpbnNraXkgOiAxIDogNDAwMzkKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtWb2xnb2dyYWQgOiAxIDogMTAzNjc1NgorVm9sZ29ncmFkc2th72Egb2JsYXN0O1ZvbHpoc2tpeSA6IDEgOiAyOTI0MDMKK0FzdHJha2hhbnNrYe9hIG9ibGFzdDtBa2h0dWJpbnNraXkgOiAxIDogMzY4NDEKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtTdmV0bG95YXJza2l5IDogMSA6IDM3NDEwCitBc3RyYWtoYW5za2HvYSBvYmxhc3Q7Q2h5b3Jub3lhcnNraXkgOiAxIDogMjM2NDgKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtDaGVybnlzaGtvdnNraXkgOiAxIDogMjA2MjYKK0thbG15a2lhO01hbG9kZXJiZXRvdnNraXkgOiAxIDogMTM1MTAKK1ZvbGdvZ3JhZHNrYe9hIG9ibGFzdDtPa3R5YWJyc2tpeSA6IDEgOiAyNjE4NworQXN0cmFraGFuc2th72Egb2JsYXN0O0FraHR1Ymluc2sgOiAxIDogNTE0NTYKK0thbG15a2lhO09rdHlhYnJza2l5IDogMSA6IDEyMDIwCitWb2xnb2dyYWRza2HvYSBvYmxhc3Q7S290ZWxuaWtvdnNraXkgOiAxIDogNDAxNDAKK0FzdHJha2hhbnNrYe9hIG9ibGFzdDtZZW5vdGF5ZXZza2l5IDogMSA6IDMxMDU2CitLYWxteWtpYTtTYXJwaW5za2l5IDogMSA6IDE3Mjg1CitBc3RyYWtoYW5za2HvYSBvYmxhc3Q7S2hhcmFiYWxpbnNraXkgOiAxIDogNDM3NDMKK0thbG15a2lhO1l1c3RpbnNraXkgOiAxIDogMTU0OTYKK0thbG15a2lhO0tldGNoZW5lcm92c2tpeSA6IDEgOiAxNDkwMAorQXN0cmFraGFuc2th72Egb2JsYXN0O0tyYXNub3lhcnNraXkgOiAxIDogNDM1NDAKK0thbG15a2lhO1lhc2hrdWxza2l5IDogMSA6IDIwNjYyCitLYWxteWtpYTtUc2VsaW5ueWkgOiAxIDogMjIxNTIKK0FzdHJha2hhbnNrYe9hIG9ibGFzdDtOYXJpbWFub3Zza2l5IDogMSA6IDQ1NjcxCitLYWxteWtpYTtZYXNoYWx0aW5za2l5IDogMSA6IDE4NDc3CitBc3RyYWtoYW5za2HvYSBvYmxhc3Q7Vm9sb2RhcnNraXkgOiAxIDogNDkzMjUKK0FzdHJha2hhbnNrYe9hIG9ibGFzdDtQcml2b2x6aHNraXkgOiAxIDogNDA4MDAKK0thbG15a2lhO1ByaXl1dGluc2tpeSA6IDEgOiAxNTM5NworQXN0cmFraGFuc2th72Egb2JsYXN0O0FzdHJha2hhbiA6IDEgOiA1MTQ5NjgKK0thbG15a2lhO0VsaXN0YSA6IDEgOiA5Mzc3MworS2FsbXlraWE7Q2hlcm5vemVtZWxza2l5IDogMSA6IDE1ODk0CitLYWxteWtpYTtHb3JvZG92aWtvdnNraXkgOiAxIDogMjAzNjQKK0FzdHJha2hhbnNrYe9hIG9ibGFzdDtJa3J5YW5pbnNraXkgOiAxIDogNTEyNTMKK0thbG15a2lhO0lraS1CdXJ1bHNraXkgOiAxIDogMTYwOTIKK0FzdHJha2hhbnNrYe9hIG9ibGFzdDtLYW15enlha3NraXkgOiAxIDogNTI2NzQKK0FzdHJha2hhbnNrYe9hIG9ibGFzdDtMaW1hbnNraXkgOiAxIDogMzYzMzQKK0thbG15a2lhO0thc3BpeXNraXkgOiAxIDogMjM1NDMKK1JVLVVOSy0yOTAyIDogMSA6IDE1ODk1CitSVS1VTkstMjkwMyA6IDEgOiAyMjYzNQorUlUtVU5LLTI5MDQgOiAxIDogMjc2NzgKK0thbGluaW5ncmFkc2th72Egb2JsYXN0O0d2YXJkZXlza2l5IDogMSA6IDI5NDU1CitLYWxpbmluZ3JhZHNrYe9hIG9ibGFzdDtHdXJ5ZXZza2l5IDogMSA6IDM5NjQ2CitLYWxpbmluZ3JhZHNrYe9hIG9ibGFzdDtLYWxpbmluZ3JhZCA6IDEgOiA0MjA1MTcKK0thbGluaW5ncmFkc2th72Egb2JsYXN0O05lc3Rlcm92c2tpeSA6IDEgOiAxNjYxMworS2FsaW5pbmdyYWRza2HvYSBvYmxhc3Q7Q2hlcm55YWtob3ZzayA6IDEgOiA0MjA5MgorS2FsaW5pbmdyYWRza2HvYSBvYmxhc3Q7R3VzZXYgOiAxIDogMjg1MzcKK0thbGluaW5ncmFkc2th72Egb2JsYXN0O1ByYXZkaW5za2l5IDogMSA6IDIwNzkxCitLYWxpbmluZ3JhZHNrYe9hIG9ibGFzdDtPemVyc2tpeSA6IDEgOiAxNzczNAorS2FsaW5pbmdyYWRza2HvYSBvYmxhc3Q7U2xhdnNraXkgOiAxIDogMjE3MDkKK0thbGluaW5ncmFkc2th72Egb2JsYXN0O1plbGVub2dyYWRza2l5IDogMSA6IDI5MjUxCitLYWxpbmluZ3JhZHNrYe9hIG9ibGFzdDtTb3ZldHNrIDogMSA6IDQ0MjMzCitLYWxpbmluZ3JhZHNrYe9hIG9ibGFzdDtOZW1hbnNraXkgOiAxIDogOTY4MgorS2FsaW5pbmdyYWRza2HvYSBvYmxhc3Q7S3Jhem5vem5hbWVuc2tpeSA6IDEgOiAxMzU1NQorS2FsaW5pbmdyYWRza2HvYSBvYmxhc3Q7TmVtYW4gOiAxIDogMTQ0NzIKK0thbGluaW5ncmFkc2th72Egb2JsYXN0O1BvbGVzc2tpeSA6IDEgOiAxNzczNAorS2FsaW5pbmdyYWRza2HvYSBvYmxhc3Q7U3ZldGxvZ29yc2sgOiAxIDogMzM1MzEKK0thbGluaW5ncmFkc2th72Egb2JsYXN0O0NoZXJueWFraG92c2tpeSA6IDEgOiAxMzg2MQorS2FsaW5pbmdyYWRza2HvYSBvYmxhc3Q7R3VzZXZza2l5IDogMSA6IDgxNTQKK0thbGluaW5ncmFkc2th72Egb2JsYXN0O1N2ZXRseWkgOiAxIDogMjg5NDUKK0thbGluaW5ncmFkc2th72Egb2JsYXN0O0JhbHRpeXNrIDogMSA6IDI5MzUzCitLYWxpbmluZ3JhZHNrYe9hIG9ibGFzdDtCYWdyYXRpb25vdnNraXkgOiAxIDogNDM1MTkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9SV0FOREFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUldBTkRBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Nzk2YTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUldBTkRBX0FSRUEudHh0CkBAIC0wLDAgKzEsMTE5IEBACitSd2FuZGEJOgkwCToJMjYzODgKK0J1dGFyZQk6CTEJOgkxODcyCitCdXRhcmUgVG93biAJOgkyCToJMAorRGlzdHJpY3Qgb2YgR2lrb25rbyAJOgkyCToJMAorRGlzdHJpY3Qgb2YgS2liaW5nbyAJOgkyCToJMAorRGlzdHJpY3Qgb2YgS2lydWh1cmEgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIE1hcmFiYSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgTXVnb21id2EgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIE55YWtpenUgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIE55YW11cmUgCToJMgk6CTAKK055YW56YSBUb3duIAk6CTIJOgkwCitEaXN0cmljdCBvZiBTYXZlIAk6CTIJOgkwCitCeXVtYmEJOgkxCToJMTY5NAorRGlzdHJpY3Qgb2YgQnVuZ3dlIAk6CTIJOgkwCitCeXVtYmEgVG93biAJOgkyCToJMAorRGlzdHJpY3Qgb2YgSHVtdXJlIAk6CTIJOgkwCitEaXN0cmljdCBvZiBLaW5paGlyYSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgS2lzYXJvIAk6CTIJOgkwCitEaXN0cmljdCBvZiBOZ2FyYW1hIAk6CTIJOgkwCitEaXN0cmljdCBvZiBSZWJlcm8gCToJMgk6CTAKK0Rpc3RyaWN0IG9mIFJ1c2hha2kgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIFJ3YW1pa28gCToJMgk6CTAKK0N5YW5ndWd1CToJMQk6CTE4OTQKK0Rpc3RyaWN0IG9mIEJ1Z2FyYW1hIAk6CTIJOgkwCitEaXN0cmljdCBvZiBCdWt1bnppIAk6CTIJOgkwCitDeWFuZ3VndSBUb3duIAk6CTIJOgkwCitEaXN0cmljdCBvZiBHYXNob25nYSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgR2F0YXJlIAk6CTIJOgkwCitEaXN0cmljdCBvZiBJbXBhbGEgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIE55YW1hc2hla2UgCToJMgk6CTAKK0dpa29uZ29ybwk6CTEJOgkxOTc0CitHaWtvbmdvcm8gVG93biAJOgkyCToJMAorRGlzdHJpY3Qgb2YgS2FkdWhhIAk6CTIJOgkwCitEaXN0cmljdCBvZiBLYXJhYmEgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIE11ZGFzb213YSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgTXVzaHViaSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgTnNoaWxpIAk6CTIJOgkwCitEaXN0cmljdCBvZiBOeWFydWd1cnUgCToJMgk6CTAKK0dpc2VueWkJOgkxCToJMjA0NworRGlzdHJpY3Qgb2YgQ3lhbnphcndlIAk6CTIJOgkwCitEaXN0cmljdCBvZiBHYXNla2UgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIEdhc2l6YSAJOgkyCToJMAorR2lzZW55aSBUb3duIAk6CTIJOgkwCitEaXN0cmljdCBvZiBLYWdleW8gCToJMgk6CTAKK0Rpc3RyaWN0IG9mIEthbmFtYSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgS2F5b3ZlIAk6CTIJOgkwCitEaXN0cmljdCBvZiBNdXR1cmEgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIE55YWdpc2FnYXJhIAk6CTIJOgkwCitEaXN0cmljdCBvZiBOeWFteXVtYmEgCToJMgk6CTAKK0dpdGFyYW1hCToJMQk6CTIxNDEKK0dpdGFyYW1hIFRvd24gCToJMgk6CTAKK0Rpc3RyaWN0IG9mIEthYmFnYXJpIAk6CTIJOgkwCitEaXN0cmljdCBvZiBLYW1vbnlpIAk6CTIJOgkwCitEaXN0cmljdCBvZiBLYXl1bWJ1IAk6CTIJOgkwCitEaXN0cmljdCBvZiBNdWhhbmdhIAk6CTIJOgkwCitEaXN0cmljdCBvZiBOZGl6YSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgTnRlbnlvIAk6CTIJOgkwCitEaXN0cmljdCBvZiBOdG9uZ3dlIAk6CTIJOgkwCitUb3duUnVoYW5nbyAJOgkyCToJMAorRGlzdHJpY3Qgb2YgUnV5dW1iYSAJOgkyCToJMAorS2lidW5ndQk6CTEJOgkyOTY0CitEaXN0cmljdCBvZiBDeXVyYWJhcmUgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIEthYmFyb25kYSAJOgkyCToJMAorS2lidW5nbyBUb3duIAk6CTIJOgkwCitEaXN0cmljdCBvZiBLaWdhcmFtYSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgTWlyZW5nZSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgTXVoYXppIAk6CTIJOgkwCitEaXN0cmljdCBvZiBOeWFydWJ1eWUgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIFJ1a2lyYSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgUnVzdW1vIAk6CTIJOgkwCitSd2FtYWdhbmEgVG93biAJOgkyCToJMAorS2lidXllCToJMQk6CTE3NDgKK0Rpc3RyaWN0IG9mIEJ1ZGFoYSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgR2lzdW56dSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgSXRhYmlyZSAJOgkyCToJMAorS2lidXllIFRvd24gCToJMgk6CTAKK0Rpc3RyaWN0IG9mIFJ1c2VueWkgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIFJ1dHNpcm8gCToJMgk6CTAKK0tpZ2FsaQk6CTEJOgkzMTMKK0Rpc3RyaWN0IG9mIEJ1dGFtd2EgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIEdpa29uZG8gCToJMgk6CTAKK0Rpc3RyaWN0IG9mIEdpc296aSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgS2FjeWlydSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgS2Fub21iZSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgS2ljdWtpcm8gCToJMgk6CTAKK0Rpc3RyaWN0IG9mIE55YW1pcmFtYm8gCToJMgk6CTAKK0Rpc3RyaWN0IG9mIE55YXJ1Z2VuZ2UgCToJMgk6CTAKK01hc2FrYQk6CTEJOgkyNzgwCitEaXN0cmljdCBvZiBCaWN1bWJpIAk6CTIJOgkwCitEaXN0cmljdCBvZiBCdWxpemEgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIEdhc2FibyAJOgkyCToJMAorRGlzdHJpY3Qgb2YgR2FzaG9yYSAJOgkyCToJMAorS2FidWdhIFRvd24gCToJMgk6CTAKK0Rpc3RyaWN0IG9mIE5nZW5kYSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgTnlhbWF0YSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgUnVsaW5kbyAJOgkyCToJMAorRGlzdHJpY3Qgb2YgUnVzaGFzaGkgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIFNoeW9yb25naSAJOgkyCToJMAorUnVoZW5nZXJpCToJMQk6CTE2NTcKK0Rpc3RyaWN0IG9mIEJ1Z2FydXJhIAk6CTIJOgkwCitEaXN0cmljdCBvZiBCdWhvbWEgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIEJ1a2FtYmEgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIEJ1a29ueWEgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIEJ1dGFybyAJOgkyCToJMAorRGlzdHJpY3Qgb2YgQ3llcnUgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIEtpbmlnaSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgTXV0b2JvIAk6CTIJOgkwCitEaXN0cmljdCBvZiBOeWFtdWdhbGkgCToJMgk6CTAKK0Rpc3RyaWN0IG9mIE55dXJhdG92dSAJOgkyCToJMAorUnVoZW5nZXJpIFRvd24gCToJMgk6CTAKK055YWdhdGFyZQk6CTEJOgk0MjMwCitEaXN0cmljdCBvZiBCdWdhcmFnYXJhIAk6CTIJOgkwCitEaXN0cmljdCBvZiBHYWJpcm8gCToJMgk6CTAKK0Rpc3RyaWN0IG9mIEthYmFyZSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgS2FoaSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgTXVyYW1iaSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgTXV2dW1iYSAJOgkyCToJMAorRGlzdHJpY3Qgb2YgUnVrYXJhIAk6CTIJOgkwCitVbXV0dXJhIFRvd24gCToJMgk6CTAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9SV0FOREFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUldBTkRBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNjE3YTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvUldBTkRBX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMTE5IEBACitSd2FuZGEJOgkwCToJODY0ODI0OAorQnV0YXJlCToJMQk6CTcyNTkxNAorQnV0YXJlIFRvd24gCToJMgk6CTc3NDQ5CitEaXN0cmljdCBvZiBHaWtvbmtvIAk6CTIJOgk3MDQ3NQorRGlzdHJpY3Qgb2YgS2liaW5nbyAJOgkyCToJOTg4NTYKK0Rpc3RyaWN0IG9mIEtpcnVodXJhIAk6CTIJOgk1MTE2MworRGlzdHJpY3Qgb2YgTWFyYWJhIAk6CTIJOgk2MjE0OQorRGlzdHJpY3Qgb2YgTXVnb21id2EgCToJMgk6CTc2NTU4CitEaXN0cmljdCBvZiBOeWFraXp1IAk6CTIJOgk4NTU4NworRGlzdHJpY3Qgb2YgTnlhbXVyZSAJOgkyCToJODI3MTYKK055YW56YSBUb3duIAk6CTIJOgk1NTY5OQorRGlzdHJpY3Qgb2YgU2F2ZSAJOgkyCToJNjE5NjQKK0J5dW1iYQk6CTEJOgk3MDc3ODYKK0Rpc3RyaWN0IG9mIEJ1bmd3ZSAJOgkyCToJODAwNjgKK0J5dW1iYSBUb3duIAk6CTIJOgk2NjUzNgorRGlzdHJpY3Qgb2YgSHVtdXJlIAk6CTIJOgk3MTQ4NQorRGlzdHJpY3Qgb2YgS2luaWhpcmEgCToJMgk6CTkyMDAzCitEaXN0cmljdCBvZiBLaXNhcm8gCToJMgk6CTc3MzIwCitEaXN0cmljdCBvZiBOZ2FyYW1hIAk6CTIJOgk3MzYyNgorRGlzdHJpY3Qgb2YgUmViZXJvIAk6CTIJOgk3OTg5NAorRGlzdHJpY3Qgb2YgUnVzaGFraSAJOgkyCToJNzk0ODQKK0Rpc3RyaWN0IG9mIFJ3YW1pa28gCToJMgk6CTkxOTU2CitDeWFuZ3VndQk6CTEJOgk2MDc0OTUKK0Rpc3RyaWN0IG9mIEJ1Z2FyYW1hIAk6CTIJOgk5OTQ3MQorRGlzdHJpY3Qgb2YgQnVrdW56aSAJOgkyCToJODc3MDYKK0N5YW5ndWd1IFRvd24gCToJMgk6CTU5NDI5CitEaXN0cmljdCBvZiBHYXNob25nYSAJOgkyCToJNzQ5ODgKK0Rpc3RyaWN0IG9mIEdhdGFyZSAJOgkyCToJODM0MjgKK0Rpc3RyaWN0IG9mIEltcGFsYSAJOgkyCToJMTI5OTg2CitEaXN0cmljdCBvZiBOeWFtYXNoZWtlIAk6CTIJOgk3NDQ5NgorR2lrb25nb3JvCToJMQk6CTQ4OTcyOQorR2lrb25nb3JvIFRvd24gCToJMgk6CTMyNDc2CitEaXN0cmljdCBvZiBLYWR1aGEgCToJMgk6CTYwOTYxCitEaXN0cmljdCBvZiBLYXJhYmEgCToJMgk6CTkwMjgwCitEaXN0cmljdCBvZiBNdWRhc29td2EgCToJMgk6CTcwMTgzCitEaXN0cmljdCBvZiBNdXNodWJpIAk6CTIJOgk5MDMzNgorRGlzdHJpY3Qgb2YgTnNoaWxpIAk6CTIJOgk4MTI3NworRGlzdHJpY3Qgb2YgTnlhcnVndXJ1IAk6CTIJOgk2NzA5MgorR2lzZW55aQk6CTEJOgk4NjQzNzcKK0Rpc3RyaWN0IG9mIEN5YW56YXJ3ZSAJOgkyCToJNzExNDIKK0Rpc3RyaWN0IG9mIEdhc2VrZSAJOgkyCToJNzg0NTgKK0Rpc3RyaWN0IG9mIEdhc2l6YSAJOgkyCToJMTIyNjgxCitHaXNlbnlpIFRvd24gCToJMgk6CTY3MTkyCitEaXN0cmljdCBvZiBLYWdleW8gCToJMgk6CTg0MzQ1CitEaXN0cmljdCBvZiBLYW5hbWEgCToJMgk6CTc3NzA5CitEaXN0cmljdCBvZiBLYXlvdmUgCToJMgk6CTk2MDkwCitEaXN0cmljdCBvZiBNdXR1cmEgCToJMgk6CTEyMjMyNQorRGlzdHJpY3Qgb2YgTnlhZ2lzYWdhcmEgCToJMgk6CTgxNzI3CitEaXN0cmljdCBvZiBOeWFteXVtYmEgCToJMgk6CTY1NTU2CitHaXRhcmFtYQk6CTEJOgk4NTY0ODgKK0dpdGFyYW1hIFRvd24gCToJMgk6CTg0NjY5CitEaXN0cmljdCBvZiBLYWJhZ2FyaSAJOgkyCToJODMwMDYKK0Rpc3RyaWN0IG9mIEthbW9ueWkgCToJMgk6CTExNjI1NQorRGlzdHJpY3Qgb2YgS2F5dW1idSAJOgkyCToJNzQyNjQKK0Rpc3RyaWN0IG9mIE11aGFuZ2EgCToJMgk6CTc5ODExCitEaXN0cmljdCBvZiBOZGl6YSAJOgkyCToJOTk0OTAKK0Rpc3RyaWN0IG9mIE50ZW55byAJOgkyCToJMTA5NjU2CitEaXN0cmljdCBvZiBOdG9uZ3dlIAk6CTIJOgk4NDg3MAorVG93blJ1aGFuZ28gCToJMgk6CTQzNzgwCitEaXN0cmljdCBvZiBSdXl1bWJhIAk6CTIJOgk4ODc5MworS2lidW5ndQk6CTEJOgk3MDIyNDgKK0Rpc3RyaWN0IG9mIEN5dXJhYmFyZSAJOgkyCToJNjcxODQKK0Rpc3RyaWN0IG9mIEthYmFyb25kYSAJOgkyCToJNjc3NTAKK0tpYnVuZ28gVG93biAJOgkyCToJNDM1ODIKK0Rpc3RyaWN0IG9mIEtpZ2FyYW1hIAk6CTIJOgk2Mjc3MworRGlzdHJpY3Qgb2YgTWlyZW5nZSAJOgkyCToJMTAxMDI2CitEaXN0cmljdCBvZiBNdWhhemkgCToJMgk6CTU4NDkyCitEaXN0cmljdCBvZiBOeWFydWJ1eWUgCToJMgk6CTQ5NTY1CitEaXN0cmljdCBvZiBSdWtpcmEgCToJMgk6CTYwMzMwCitEaXN0cmljdCBvZiBSdXN1bW8gCToJMgk6CTE0OTY0MworUndhbWFnYW5hIFRvd24gCToJMgk6CTQ3MjAzCitLaWJ1eWUJOgkxCToJNDY5MDE2CitEaXN0cmljdCBvZiBCdWRhaGEgCToJMgk6CTg1NDIwCitEaXN0cmljdCBvZiBHaXN1bnp1IAk6CTIJOgk3NzA4OQorRGlzdHJpY3Qgb2YgSXRhYmlyZSAJOgkyCToJNzgwODYKK0tpYnV5ZSBUb3duIAk6CTIJOgk0NjUwMAorRGlzdHJpY3Qgb2YgUnVzZW55aSAJOgkyCToJMTA1ODI2CitEaXN0cmljdCBvZiBSdXRzaXJvIAk6CTIJOgk3NDgyNAorS2lnYWxpCToJMQk6CTYwMzA0OQorRGlzdHJpY3Qgb2YgQnV0YW13YSAJOgkyCToJMzA0NjQKK0Rpc3RyaWN0IG9mIEdpa29uZG8gCToJMgk6CTc3NjgwCitEaXN0cmljdCBvZiBHaXNvemkgCToJMgk6CTY2ODc1CitEaXN0cmljdCBvZiBLYWN5aXJ1IAk6CTIJOgkxMjExOTEKK0Rpc3RyaWN0IG9mIEthbm9tYmUgCToJMgk6CTUzMDEwCitEaXN0cmljdCBvZiBLaWN1a2lybyAJOgkyCToJNTkxNjUKK0Rpc3RyaWN0IG9mIE55YW1pcmFtYm8gCToJMgk6CTk4ODI3CitEaXN0cmljdCBvZiBOeWFydWdlbmdlIAk6CTIJOgkxMDA5MjkKK01hc2FrYQk6CTEJOgk3ODkzMzAKK0Rpc3RyaWN0IG9mIEJpY3VtYmkgCToJMgk6CTEwMTA1NworRGlzdHJpY3Qgb2YgQnVsaXphIAk6CTIJOgk4NTM5NAorRGlzdHJpY3Qgb2YgR2FzYWJvIAk6CTIJOgk5MDUzNAorRGlzdHJpY3Qgb2YgR2FzaG9yYSAJOgkyCToJODY2MDYKK0thYnVnYSBUb3duIAk6CTIJOgk1MTEyOAorRGlzdHJpY3Qgb2YgTmdlbmRhIAk6CTIJOgkxMDYxMTIKK0Rpc3RyaWN0IG9mIE55YW1hdGEgCToJMgk6CTc2NDU2CitEaXN0cmljdCBvZiBSdWxpbmRvIAk6CTIJOgk3MTcxNQorRGlzdHJpY3Qgb2YgUnVzaGFzaGkgCToJMgk6CTY4NTk0CitEaXN0cmljdCBvZiBTaHlvcm9uZ2kgCToJMgk6CTU0OTQ2CitSdWhlbmdlcmkJOgkxCToJODkxNDk4CitEaXN0cmljdCBvZiBCdWdhcnVyYSAJOgkyCToJOTk1MjAKK0Rpc3RyaWN0IG9mIEJ1aG9tYSAJOgkyCToJODkwOTEKK0Rpc3RyaWN0IG9mIEJ1a2FtYmEgCToJMgk6CTExOTkzNQorRGlzdHJpY3Qgb2YgQnVrb255YSAJOgkyCToJODQzNTgKK0Rpc3RyaWN0IG9mIEJ1dGFybyAJOgkyCToJNjI2NTgKK0Rpc3RyaWN0IG9mIEN5ZXJ1IAk6CTIJOgk4NTEwMgorRGlzdHJpY3Qgb2YgS2luaWdpIAk6CTIJOgk2MjY0NAorRGlzdHJpY3Qgb2YgTXV0b2JvIAk6CTIJOgk5ODM1NQorRGlzdHJpY3Qgb2YgTnlhbXVnYWxpIAk6CTIJOgk1NDc0MworRGlzdHJpY3Qgb2YgTnl1cmF0b3Z1IAk6CTIJOgk2NzI0OAorUnVoZW5nZXJpIFRvd24gCToJMgk6CTcwNTI1CitOeWFnYXRhcmUJOgkxCToJNDIxNjIzCitEaXN0cmljdCBvZiBCdWdhcmFnYXJhIAk6CTIJOgkzMzA3OAorRGlzdHJpY3Qgb2YgR2FiaXJvIAk6CTIJOgkzNDI1MAorRGlzdHJpY3Qgb2YgS2FiYXJlIAk6CTIJOgkyOTIyOAorRGlzdHJpY3Qgb2YgS2FoaSAJOgkyCToJNjU3NTAKK0Rpc3RyaWN0IG9mIE11cmFtYmkgCToJMgk6CTgzNDE4CitEaXN0cmljdCBvZiBNdXZ1bWJhIAk6CTIJOgk5NTk5NgorRGlzdHJpY3Qgb2YgUnVrYXJhIAk6CTIJOgk3MzkxOQorVW11dHVyYSBUb3duIAk6CTIJOgk4MDAzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0FOIE1BUklOT19BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TQU4gTUFSSU5PX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MzZmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0FOIE1BUklOT19BUkVBLnR4dApAQCAtMCwwICsxIEBACisgU2FuIE1hcmlubyA6IDEgOiAxLjAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TQU4gTUFSSU5PX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NBTiBNQVJJTk9fUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyZTIwMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TQU4gTUFSSU5PX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEgQEAKKyBTYW4gTWFyaW5vIDogMSA6IDI5NTIxCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0FPIFRPTUUgQU5EIFBSSU5DSVBFX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NBTyBUT01FIEFORCBQUklOQ0lQRV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmYyZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NBTyBUT01FIEFORCBQUklOQ0lQRV9BUkVBLnR4dApAQCAtMCwwICsxLDE0IEBACitTYW8gdG9tZSBhbmQgcHJpbmNpcGUJOgkwCToJMTAwMQorUmVnaeNvIENlbnRybyAgCToJMQk6CTEzOC41CivBZ3VhIEdyYW5kZSBkaXN0cml0byAJOgkxCToJMTYuNQorTektWvNjaGkgZGlzdHJpdG8gCToJMQk6CTEyMgorUmVnaeNvIE5vcnRlIAk6CTEJOgkzMzQuNQorTGVtYuEgZGlzdHJpdG8gCToJMQk6CTIyOS41CitMb2JhdGEgZGlzdHJpdG8gCToJMQk6CTEwNQorUmVnaeNvIFN1bCAJOgkxCToJMzg2CitDYW50YWdhbG8gZGlzdHJpdG8gCToJMQk6CTExOQorQ2F16SBkaXN0cml0byAJOgkxCToJMjY3CitSZWdp428gUHJpbmNpcGUgW1ByaW5jaXBlXQk6CTEJOgkxNDIKK1NhbyBUb21lIDogMSA6IDg1NAorUGFndekgZGlzdHJpdG8gCToJMQk6CTE0MgorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0FPIFRPTUUgQU5EIFBSSU5DSVBFX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NBTyBUT01FIEFORCBQUklOQ0lQRV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWJjODg2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NBTyBUT01FIEFORCBQUklOQ0lQRV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDEzIEBACitTYW8gdG9tZSBhbmQgcHJpbmNpcGUJOgkwCToJMTkzNDEzCitSZWdp428gQ2VudHJvICAJOgkxCToJODY5OTEKK8FndWEgR3JhbmRlIGRpc3RyaXRvIAk6CTEJOgk1MTg4NgorTektWvNjaGkgZGlzdHJpdG8gCToJMQk6CTM1MTA1CitSZWdp428gTm9ydGUgCToJMQk6CTI1ODgzCitMZW1i4SBkaXN0cml0byAJOgkxCToJMTA2OTYKK0xvYmF0YSBkaXN0cml0byAJOgkxCToJMTUxODcKK1JlZ2njbyBTdWwgCToJMQk6CTE4NzU5CitDYW50YWdhbG8gZGlzdHJpdG8gCToJMQk6CTEzMjU4CitDYXXpIGRpc3RyaXRvIAk6CTEJOgk1NTAxCitSZWdp428gUHJpbmNpcGUgW1ByaW5jaXBlXQk6CTEJOgk1OTY2CitTYW8gVG9tZSAgOiAxIDogMTMzNjAwCitQYWd16SBkaXN0cml0byAJOgkxCToJNTk2NgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TQU9UT01FUFJJTkNJUEVfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0FPVE9NRVBSSU5DSVBFX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMGU3MTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0FPVE9NRVBSSU5DSVBFX0FSRUEudHh0CkBAIC0wLDAgKzEsMTMgQEAKK1NhbyB0b21lIGFuZCBwcmluY2lwZQk6CTAJOgkxMDAxCitSZWdp428gQ2VudHJvICAJOgkxCToJMTM4LjUKK8FndWEgR3JhbmRlIGRpc3RyaXRvIAk6CTEJOgkxNi41CitN6S1a82NoaSBkaXN0cml0byAJOgkxCToJMTIyCitSZWdp428gTm9ydGUgCToJMQk6CTMzNC41CitMZW1i4SBkaXN0cml0byAJOgkxCToJMjI5LjUKK0xvYmF0YSBkaXN0cml0byAJOgkxCToJMTA1CitSZWdp428gU3VsIAk6CTEJOgkzODYKK0NhbnRhZ2FsbyBkaXN0cml0byAJOgkxCToJMTE5CitDYXXpIGRpc3RyaXRvIAk6CTEJOgkyNjcKK1JlZ2njbyBQcmluY2lwZSBbUHJpbmNpcGVdCToJMQk6CTE0MgorU2FvIFRvbWUgOiAxIDogODU0CitQYWd16SBkaXN0cml0byAJOgkxCToJMTQyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NBT1RPTUVQUklOQ0lQRV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TQU9UT01FUFJJTkNJUEVfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliYzg4NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TQU9UT01FUFJJTkNJUEVfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxMyBAQAorU2FvIHRvbWUgYW5kIHByaW5jaXBlCToJMAk6CTE5MzQxMworUmVnaeNvIENlbnRybyAgCToJMQk6CTg2OTkxCivBZ3VhIEdyYW5kZSBkaXN0cml0byAJOgkxCToJNTE4ODYKK03pLVrzY2hpIGRpc3RyaXRvIAk6CTEJOgkzNTEwNQorUmVnaeNvIE5vcnRlIAk6CTEJOgkyNTg4MworTGVtYuEgZGlzdHJpdG8gCToJMQk6CTEwNjk2CitMb2JhdGEgZGlzdHJpdG8gCToJMQk6CTE1MTg3CitSZWdp428gU3VsIAk6CTEJOgkxODc1OQorQ2FudGFnYWxvIGRpc3RyaXRvIAk6CTEJOgkxMzI1OAorQ2F16SBkaXN0cml0byAJOgkxCToJNTUwMQorUmVnaeNvIFByaW5jaXBlIFtQcmluY2lwZV0JOgkxCToJNTk2NgorU2FvIFRvbWUgIDogMSA6IDEzMzYwMAorUGFndekgZGlzdHJpdG8gCToJMQk6CTU5NjYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0FVREkgQVJBQklBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NBVURJIEFSQUJJQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODc3YWQzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NBVURJIEFSQUJJQV9BUkVBLnR4dApAQCAtMCwwICsxLDE2IEBACitTYXVkaSBBcmFiaWEJOgkwCToJMTk2MDU4MgorQmFoYQk6CTEJOgk5OTIxCitBbCBKYXdmIFtKYXdmXQk6CTEJOgkxMDAyMTIKK1F1cmF5IFlhdCBbSW5jbC4gaW4gQWwgSmF3Zl0gOiAxIDogMTAwMjEyCitBc2lyCToJMQk6CTc2NjkzCitFYXN0ZXJuIFByb3ZpbmNlCToJMQk6CTY3MjUyMgorSGFpbAk6CTEJOgkxMDM4ODcKK0ppemFuCToJMQk6CTExNjcxCitNYWRpbmFoCToJMQk6CTE1MTk5MAorTWFra2FoCToJMQk6CTE1MzEyOAorTmFqcmFuCToJMQk6CTE0OTUxMQorTm9ydGhlcm4gRnJvbnRpZXIJOgkxCToJMTExNzk3CitRdWFzc2ltCToJMQk6CTU4MDQ2CitSaXlhZAk6CTEJOgk0MDQyNDAKK1RhYnVrCToJMQk6CTE0NjA3MgorSVJRL1NBVSBOZXV0cmFsIFpvbmUgOiAxIDogNzA0NApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NBVURJIEFSQUJJQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TQVVESSBBUkFCSUFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmViNjRkNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TQVVESSBBUkFCSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxNyBAQAorU2F1ZGkgQXJhYmlhCToJMAk6CTI3MDE5NzMxCitCYWhhCToJMQk6CTM3NzczOQorQWwgSmF3ZiBbSmF3Zl0JOgkxCToJMzYxNjc2CitRdXJheSBZYXQgW0luY2wuIGluIEFsIEphd2ZdIDogMSA6IDM2MTY3NgorQXNpcgk6CTEJOgkxNjg4MzY4CitFYXN0ZXJuIFByb3ZpbmNlCToJMQk6CTMzNjAxNTcKK0hhaWwJOgkxCToJNTI3MDMzCitKaXphbgk6CTEJOgkxMTg2MTM5CitNYWRpbmFoCToJMQk6CTE1MTIwNzYKK01ha2thaAk6CTEJOgk1Nzk3OTcxCitOYWpyYW4JOgkxCToJNDE5NDU3CitOb3J0aGVybiBGcm9udGllcgk6CTEJOgkyNzkyODYKK1F1YXNzaW0JOgkxCToJMTAxNjc1NgorUml5YWQJOgkxCToJNTQ1NTM2MworVGFidWsJOgkxCToJNjkxNTE3CitJUlEvU0FVIE5ldXRyYWwgWm9uZSA6IDEgOiAwCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TQVVESUFSQUJJQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TQVVESUFSQUJJQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDZjMTllCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NBVURJQVJBQklBX0FSRUEudHh0CkBAIC0wLDAgKzEsMTYgQEAKK1NhdWRpIEFyYWJpYQk6CTAJOgkxOTYwNTgyCitCYWhhCToJMQk6CTk5MjEKK0FsIEphd2YgW0phd2ZdCToJMQk6CTEwMDIxMgorUXVyYXkgWWF0IFtJbmNsLiBpbiBBbCBKYXdmXSA6IDEgOiAxMDAyMTIKK0FzaXIJOgkxCToJNzY2OTMKK0Vhc3Rlcm4gUHJvdmluY2UJOgkxCToJNjcyNTIyCitIYWlsCToJMQk6CTEwMzg4NworSml6YW4JOgkxCToJMTE2NzEKK01hZGluYWgJOgkxCToJMTUxOTkwCitNYWtrYWgJOgkxCToJMTUzMTI4CitOYWpyYW4JOgkxCToJMTQ5NTExCitOb3J0aGVybiBGcm9udGllcgk6CTEJOgkxMTE3OTcKK1F1YXNzaW0JOgkxCToJNTgwNDYKK1JpeWFkCToJMQk6CTQwNDI0MAorVGFidWsJOgkxCToJMTQ2MDcyCitJUlEvU0FVIE5ldXRyYWwgWm9uZSA6IDEgOiA3MDQ0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NBVURJQVJBQklBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NBVURJQVJBQklBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YWQ5YTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0FVRElBUkFCSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxNiBAQAorU2F1ZGkgQXJhYmlhCToJMAk6CTI3MDE5NzMxCitCYWhhCToJMQk6CTM3NzczOQorQWwgSmF3ZiBbSmF3Zl0JOgkxCToJMzYxNjc2CitRdXJheSBZYXQgW0luY2wuIGluIEFsIEphd2ZdIDogMSA6IDM2MTY3NgorQXNpcgk6CTEJOgkxNjg4MzY4CitFYXN0ZXJuIFByb3ZpbmNlCToJMQk6CTMzNjAxNTcKK0hhaWwJOgkxCToJNTI3MDMzCitKaXphbgk6CTEJOgkxMTg2MTM5CitNYWRpbmFoCToJMQk6CTE1MTIwNzYKK01ha2thaAk6CTEJOgk1Nzk3OTcxCitOYWpyYW4JOgkxCToJNDE5NDU3CitOb3J0aGVybiBGcm9udGllcgk6CTEJOgkyNzkyODYKK1F1YXNzaW0JOgkxCToJMTAxNjc1NgorUml5YWQJOgkxCToJNTQ1NTM2MworVGFidWsJOgkxCToJNjkxNTE3CitJUlEvU0FVIE5ldXRyYWwgWm9uZSA6IDEgOiAwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0VORUdBTF9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TRU5FR0FMX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTExMWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0VORUdBTF9BUkVBLnR4dApAQCAtMCwwICsxLDQ2IEBACitTZW5lZ2FsCToJMAk6CTE5NjE5MAorRGFrYXIJOgkxCToJNTUwCitEZXBhcnRlbWVudCBkZSBEYWthciAJOgkxCToJODMKK0d1ZWRpYXdheWUJOgkxCToJMAorUGlraW5lCToJMQk6CTk1CitSdWZpc3F1ZS1CYXJnbnkJOgkxCToJMzcyCitEaW91cmJlbAk6CTEJOgk0MzU5CitCYW1iZXkJOgkxCToJMTM1MQorRGVwYXJ0ZW1lbnQgZGUgRGlvdXJiZWwgCToJMQk6CTExNzUKK01iYWNrZSBbRGVwYXJ0ZW1lbnQgZGUgTWJhY2tlXSAJOgkxCToJMTgzMworRmF0aWNrCToJMQk6CTc5MzAKK0RlcGFydGVtZW50IGRlIEZhdGljayAJOgkxCToJMjY0NgorRm91bmRpb3VnbmUJOgkxCToJMjk1OQorR29zc2FzCToJMQk6CTIzMzAKK0thb2xhYwk6CTEJOgkxNjAxMAorS2FmZnJpbmUJOgkxCToJMTExMDIKK0thb2xhY2sgW0RlcGFydGVtZW50IGRlIEthb2xhY2tdIAk6CTEJOgkxODgwCitOaW9ybyBkdSBSaXAJOgkxCToJMjI3NworS29sZGEJOgkxCToJMjEwMTEKK0RlcGFydGVtZW50IGRlIEtvbGRhIAk6CTEJOgk4Mjg0CitTZWRoaW91CToJMQk6CTcyOTMKK1ZlbGluZ2FyYQk6CTEJOgk1NDM0CitMb3VnYQk6CTEJOgkyOTE4OAorS2ViZW1lcgk6CTEJOgkzODIzCitMaW5ndWVyZQk6CTEJOgkxOTcxNgorRGVwYXJ0ZW1lbnQgZGUgTG91Z2EgCToJMQk6CTU2NDkKK01hdGFtCToJMQk6CTI1MDgzCitLYW5lbAk6CTEJOgkwCitEZXBhcnRlbWVudCBkZSBNYXRhbSAJOgkxCToJMAorUmFuZXJvdQk6CTEJOgkwCitTYWludC1Mb3Vpcwk6CTEJOgkxOTA0NAorRGFnYW5hCToJMQk6CTYwODcKK1BvZG9yCToJMQk6CTEyOTQ3CitEZXBhcnRlbWVudCBkZSBTYWludC1Mb3VpcyAJOgkxCToJMAorQmFrZWwJOgkxCToJNTk2MDIKK0RlcGFydGVtZW50IGRlIEJha2VsIAk6CTEJOgkyMjM3OAorS2Vkb3Vnb3UJOgkxCToJMTY4OTYKK1RhbWJhY291bmRhIFtEZXBhcnRlbWVudCBkZSBUYW1iYWNvdW5kYV0gCToJMQk6CTIwMzI4CitS6Wdpb24gZGUgVGhp6HMgCToJMQk6CTY2MDEKK01ib3VyCToJMQk6CTE2MDcKK1RoaWVzCToJMQk6CTE4NzMKK1RpdmFvdWFuZQk6CTEJOgkzMTIxCitaaWd1aW5jaG9yCToJMQk6CTczMzkKK0JpZ25vbmEJOgkxCToJNTI5NQorT3Vzc291eWUJOgkxCToJODkxCitEZXBhcnRlbWVudCBkZSBaaWd1aW5jaG9yIAk6CTEJOgkxMTUzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0VORUdBTF9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TRU5FR0FMX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZWE3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0VORUdBTF9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDQ2IEBACitTZW5lZ2FsCToJMAk6CTExOTg3MTIxCitEYWthcgk6CTEJOgkyNDUyNjU2CitEZXBhcnRlbWVudCBkZSBEYWthciAJOgkxCToJMTAzMDU5NAorR3VlZGlhd2F5ZQk6CTEJOgkyODAzNTMKK1Bpa2luZQk6CTEJOgk4MzQyNDYKK1J1ZmlzcXVlLUJhcmdueQk6CTEJOgkzMDc0NjMKK0Rpb3VyYmVsCToJMQk6CTExODMwOTUKK0JhbWJleQk6CTEJOgkyNTI1MzIKK0RlcGFydGVtZW50IGRlIERpb3VyYmVsIAk6CTEJOgkyMjAyMjEKK01iYWNrZSBbRGVwYXJ0ZW1lbnQgZGUgTWJhY2tlXSAJOgkxCToJNzEwMzQyCitGYXRpY2sJOgkxCToJNjUyMzYxCitEZXBhcnRlbWVudCBkZSBGYXRpY2sgCToJMQk6CTI2Nzc1NgorRm91bmRpb3VnbmUJOgkxCToJMjI0NjU5CitHb3NzYXMJOgkxCToJMTU5OTQ2CitLYW9sYWMJOgkxCToJMTEzMjcwNworS2FmZnJpbmUJOgkxCToJNDY3NzQ4CitLYW9sYWNrIFtEZXBhcnRlbWVudCBkZSBLYW9sYWNrXSAJOgkxCToJMzgyNzg0CitOaW9ybyBkdSBSaXAJOgkxCToJMjgyMTc1CitLb2xkYQk6CTEJOgk5MTI1MDMKK0RlcGFydGVtZW50IGRlIEtvbGRhIAk6CTEJOgkzMDY1OTEKK1NlZGhpb3UJOgkxCToJMzk5MzY1CitWZWxpbmdhcmEJOgkxCToJMjA2NTQ3CitMb3VnYQk6CTEJOgk3Mjk2MDYKK0tlYmVtZXIJOgkxCToJMjE1NjQ4CitMaW5ndWVyZQk6CTEJOgkyMTQ4ODMKK0RlcGFydGVtZW50IGRlIExvdWdhIAk6CTEJOgkyOTkwNzUKK01hdGFtCToJMQk6CTQ3ODU3MworS2FuZWwJOgkxCToJMTk2OTE5CitEZXBhcnRlbWVudCBkZSBNYXRhbSAJOgkxCToJMjMzMTc5CitSYW5lcm91CToJMQk6CTQ4NDc1CitTYWludC1Mb3Vpcwk6CTEJOgk3NjQzNDcKK0RhZ2FuYQk6CTEJOgkyMDc5OTEKK1BvZG9yCToJMQk6CTMyOTM3OQorRGVwYXJ0ZW1lbnQgZGUgU2FpbnQtTG91aXMgCToJMQk6CTIyNjk3NworQmFrZWwJOgkxCToJNjY5MDkxCitEZXBhcnRlbWVudCBkZSBCYWtlbCAJOgkxCToJMjE1NjgwCitLZWRvdWdvdQk6CTEJOgkxMTEyMDcKK1RhbWJhY291bmRhIFtEZXBhcnRlbWVudCBkZSBUYW1iYWNvdW5kYV0gCToJMQk6CTM0MjIwNAorUulnaW9uIGRlIFRoaehzIAk6CTEJOgkxMzg1MDU4CitNYm91cgk6CTEJOgk1MTMyNzgKK1RoaWVzCToJMQk6CTUyOTI2MQorVGl2YW91YW5lCToJMQk6CTM0MjUxOQorWmlndWluY2hvcgk6CTEJOgk0NTc4NDcKK0JpZ25vbmEJOgkxCToJMjI5MDE2CitPdXNzb3V5ZQk6CTEJOgkzNjUwNgorRGVwYXJ0ZW1lbnQgZGUgWmlndWluY2hvciAJOgkxCToJMTkyMzI1CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0VSQklBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NFUkJJQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjFmODYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NFUkJJQV9BUkVBLnR4dApAQCAtMCwwICsxLDUgQEAKKyBWb2p2b2RpbmEgOiAxIDogMjE1MDYuMAorIFNyYmlqYSA6IDEgOiA1NTk2OC4wCisgQ3JuYSBHb3JhIDogMSA6IDEzODEyLjAKKyBLb3Nvdm8gOiAxIDogMTA4ODcuMAorIE1ha2Vkb25pamEgOiAxIDogMjU3MTMuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TRVJCSUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0VSQklBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YTQwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0VSQklBX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsNSBAQAorIFZvanZvZGluYSA6IDEgOiAyMDMxOTkyCisgU3JiaWphIDogMSA6IDE1NzYxMjQKKyBDcm5hIEdvcmEgOiAxIDogNjM4NDYxCisgS29zb3ZvIDogMSA6IDIxMDAwMDAKKyBNYWtlZG9uaWphIDogMSA6IDk4MzI1ODEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0VZQ0hFTExFU19BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TRVlDSEVMTEVTX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MDVmMjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0VZQ0hFTExFU19BUkVBLnR4dApAQCAtMCwwICsxLDI3IEBACitTZXljaGVsbGVzCToJMAk6CTQ1NQorQW5zZSBhdXggUGlucyAgCToJMQk6CTIKK0Fuc2UgQm9pbGVhdSAJOgkxCToJMTEKK0Fuc2UgRXRvaWxlIAk6CTEJOgk1CitBbnNlIFJveWFsZSAJOgkxCToJNgorQXUgQ2FwIAk6CTEJOgk4CitCYWllIExhemFyZSAJOgkxCToJMTIKK0JhaWUgU2FpbnRlIEFubmUgUHJhc2xpbiAJOgkxCToJMjUKK0JlYXUgVmFsbG9uIAk6CTEJOgk0CitCZWwgQWlyIAk6CTEJOgk0CitCZWwgT21icmUgCToJMQk6CTkKK0Nhc2NhZGUgCToJMQk6CTEwCitFbmdsaXNoIFJpdmVyIAk6CTEJOgkxCitHbGFjaXMgCToJMQk6CTcKK01haGUgSXNsYW5kCToJMQk6CTE1CitQcmFzbGluIElzbGFuZAk6CTEJOgkxNAorTGEgRGlndWUgLSBJbm5lciBJc2xhbmRzIAk6CTEJOgk1NgorTGVzIE1hbWVsbGVzIAk6CTEJOgk0CitNb250IEJ1eHRvbiAJOgkxCToJMQorTW9udCBGbGV1cmkgCToJMQk6CTIKK091dGVyIElzbGFuZHMgCToJMQk6CTIxMQorUGxhaXNhbmNlIAk6CTEJOgkzCitQb2ludGUgTGEgUnVlIAk6CTEJOgk0CitQb3J0IEdsYXVkIAk6CTEJOgkyNQorUm9jaGUgQ2FpbWFuIAk6CTEJOgkzCitTYWludCBMb3VpcyAJOgkxCToJMQorVGFrYW1ha2EgCToJMQk6CTE0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0VZQ0hFTExFU19QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TRVlDSEVMTEVTX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YmVlM2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0VZQ0hFTExFU19QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDI2IEBACitBbnNlIGF1eCBQaW5zICAJOgkxCToJMzUzNQorQW5zZSBCb2lsZWF1IAk6CTEJOgkzOTk0CitBbnNlIEV0b2lsZSAJOgkxCToJNDI3MgorQW5zZSBSb3lhbGUgCToJMQk6CTM2ODgKK0F1IENhcCAJOgkxCToJMjk5NworQmFpZSBMYXphcmUgCToJMQk6CTI5NTcKK0JhaWUgU2FpbnRlIEFubmUgUHJhc2xpbiAJOgkxCToJMzY2NQorQmVhdSBWYWxsb24gCToJMQk6CTM3OTcKK0JlbCBBaXIgCToJMQk6CTI5MDAKK0JlbCBPbWJyZSAJOgkxCToJMzUzOAorQ2FzY2FkZSAJOgkxCToJMzQzOQorRW5nbGlzaCBSaXZlciAJOgkxCToJMzYyNAorR2xhY2lzIAk6CTEJOgkzNTc2CitNYWhlIElzbGFuZAk6CTEJOgkyNTg3CitQcmFzbGluIElzbGFuZAk6CTEJOgkzMzM1CitMYSBEaWd1ZSAtIElubmVyIElzbGFuZHMgCToJMQk6CTIwOTkKK0xlcyBNYW1lbGxlcyAJOgkxCToJMjM1MgorTW9udCBCdXh0b24gCToJMQk6CTMxMDcKK01vbnQgRmxldXJpIAk6CTEJOgkzNjExCitPdXRlciBJc2xhbmRzIAk6CTEJOgkgMAorUGxhaXNhbmNlIAk6CTEJOgkzMzk5CitQb2ludGUgTGEgUnVlIAk6CTEJOgkyNzE1CitQb3J0IEdsYXVkIAk6CTEJOgkyMTc0CitSb2NoZSBDYWltYW4gCToJMQk6CTI2NTIKK1NhaW50IExvdWlzIAk6CTEJOgkzMzI1CitUYWthbWFrYSAJOgkxCToJMjU4OQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NJRVJSQSBMRU9ORV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TSUVSUkEgTEVPTkVfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0NWY3YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TSUVSUkEgTEVPTkVfQVJFQS50eHQKQEAgLTAsMCArMSwyMyBAQAorU2llcnJhIExlb25lCToJMAk6CTcxNzQwCitFYXN0ZXJuMgk6CTEJOgkxNTU1MworTm9ydGhlcm4yIDogMSA6IDM1OTM2CitXZXN0ZXJuMyA6IDEgOiA1NTcKK1NvdXRoZXJuIDogMSA6IDE5Njk0CitLYWlsYWh1biBEaXN0cmljdCAJOgkxCToJMzg1OQorS2VuZW1hIERpc3RyaWN0IAk6CTEJOgk2MDUzCitLb25vIERpc3RyaWN0IAk6CTEJOgk1NjQxCitOb3J0aGVybgk6CTEJOgkzNTkzNgorQm9tYmFsaSBEaXN0cmljdCAJOgkxCToJNzk4NQorS2FtYmlhIERpc3RyaWN0IAk6CTEJOgkzMTA4CitLb2luYWR1Z3UgRGlzdHJpY3QgCToJMQk6CTEyMTIxCitQb3J0IExva28gRGlzdHJpY3QgCToJMQk6CTU3MTkKK1RvbmtvbGlsaSBEaXN0cmljdCAJOgkxCToJNzAwMworU291dHRoZXJuCToJMQk6CTE5Njk0CitCbyBEaXN0cmljdCAJOgkxCToJNTIxOQorQm9udGhlIERpc3RyaWN0IAk6CTEJOgkzNDU4CitNb3lhbWJhIERpc3RyaWN0IAk6CTEJOgk2OTAyCitQdWplaHVuIERpc3RyaWN0IAk6CTEJOgk0MTA1CitTaGVyYnJvIFVyYmFuIERpc3RyaWN0IAk6CTEJOgkxMAorV2VzdGVybgk6CTEJOgk1NTcKK1J1cmFsIERpc3RyaWN0IAk6CTEJOgk1NDQKK1VyYmFuIERpc3RyaWN0IAk6CTEJOgkxMwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TSUVSUkEgTEVPTkVfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0lFUlJBIExFT05FX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjU1MjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0lFUlJBIExFT05FX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMjMgQEAKK1NpZXJyYSBMZW9uZQk6CTAJOgk2MDA1MjUwCitFYXN0ZXJuMgk6CTEJOgkxMTkxNTM5CitOb3J0aGVybjIgOiAxIDogMTcxODI0MAorV2VzdGVybjMgOiAxIDogOTUwOTI0CitTb3V0aGVybiA6IDEgOiAxMDkyNjU3CitLYWlsYWh1biBEaXN0cmljdCAJOgkxCToJMzU4MTkwCitLZW5lbWEgRGlzdHJpY3QgCToJMQk6CTQ5Nzk0OAorS29ubyBEaXN0cmljdCAJOgkxCToJMzM1NDAxCitOb3J0aGVybgk6CTEJOgkxNzQ1NTUzCitCb21iYWxpIERpc3RyaWN0IAk6CTEJOgk0MDgzOTAKK0thbWJpYSBEaXN0cmljdCAJOgkxCToJMjcwNDYyCitLb2luYWR1Z3UgRGlzdHJpY3QgCToJMQk6CTI2NTc1OAorUG9ydCBMb2tvIERpc3RyaWN0IAk6CTEJOgk0NTM3NDYKK1RvbmtvbGlsaSBEaXN0cmljdCAJOgkxCToJMzQ3MTk3CitTb3V0dGhlcm4JOgkxCToJMTA5MjY1NworQm8gRGlzdHJpY3QgCToJMQk6CTQ2MzY2OAorQm9udGhlIERpc3RyaWN0IAk6CTEJOgkxMjk5NDcKK01veWFtYmEgRGlzdHJpY3QgCToJMQk6CTI2MDkxMAorUHVqZWh1biBEaXN0cmljdCAJOgkxCToJMjI4MzkyCitTaGVyYnJvIFVyYmFuIERpc3RyaWN0IAk6CTEJOgk5NzQwCitXZXN0ZXJuCToJMQk6CTk0NzEyMgorUnVyYWwgRGlzdHJpY3QgCToJMQk6CTE3NDI0OQorVXJiYW4gRGlzdHJpY3QgCToJMQk6CTc3Mjg3MwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NJRVJSQUxFT05FX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NJRVJSQUxFT05FX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZWIwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0lFUlJBTEVPTkVfQVJFQS50eHQKQEAgLTAsMCArMSwyMyBAQAorU2llcnJhIExlb25lCToJMAk6CTcxNzQwCitFYXN0ZXJuMgk6CTEJOgkxNTU1MworTm9ydGhlcm4yIDogMSA6IDM1OTM2CitXZXN0ZXJuMyA6IDEgOiA1NTcKK1NvdXRoZXJuIDogMSA6IDE5Njk0CitLYWlsYWh1biBEaXN0cmljdCAJOgkxCToJMzg1OQorS2VuZW1hIERpc3RyaWN0IAk6CTEJOgk2MDUzCitLb25vIERpc3RyaWN0IAk6CTEJOgk1NjQxCitOb3J0aGVybgk6CTEJOgkzNTkzNgorQm9tYmFsaSBEaXN0cmljdCAJOgkxCToJNzk4NQorS2FtYmlhIERpc3RyaWN0IAk6CTEJOgkzMTA4CitLb2luYWR1Z3UgRGlzdHJpY3QgCToJMQk6CTEyMTIxCitQb3J0IExva28gRGlzdHJpY3QgCToJMQk6CTU3MTkKK1RvbmtvbGlsaSBEaXN0cmljdCAJOgkxCToJNzAwMworU291dHRoZXJuCToJMQk6CTE5Njk0CitCbyBEaXN0cmljdCAJOgkxCToJNTIxOQorQm9udGhlIERpc3RyaWN0IAk6CTEJOgkzNDU4CitNb3lhbWJhIERpc3RyaWN0IAk6CTEJOgk2OTAyCitQdWplaHVuIERpc3RyaWN0IAk6CTEJOgk0MTA1CitTaGVyYnJvIFVyYmFuIERpc3RyaWN0IAk6CTEJOgkxMAorV2VzdGVybgk6CTEJOgk1NTcKK1J1cmFsIERpc3RyaWN0IAk6CTEJOgk1NDQKK1VyYmFuIERpc3RyaWN0IAk6CTEJOgkxMwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NJRVJSQUxFT05FX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NJRVJSQUxFT05FX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMjRjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0lFUlJBTEVPTkVfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwyMyBAQAorU2llcnJhIExlb25lCToJMAk6CTYwMDUyNTAKK0Vhc3Rlcm4yCToJMQk6CTExOTE1MzkKK05vcnRoZXJuMiA6IDEgOiAxNzE4MjQwCitXZXN0ZXJuMyA6IDEgOiA5NTA5MjQKK1NvdXRoZXJuIDogMSA6IDEwOTI2NTcKK0thaWxhaHVuIERpc3RyaWN0IAk6CTEJOgkzNTgxOTAKK0tlbmVtYSBEaXN0cmljdCAJOgkxCToJNDk3OTQ4CitLb25vIERpc3RyaWN0IAk6CTEJOgkzMzU0MDEKK05vcnRoZXJuCToJMQk6CTE3NDU1NTMKK0JvbWJhbGkgRGlzdHJpY3QgCToJMQk6CTQwODM5MAorS2FtYmlhIERpc3RyaWN0IAk6CTEJOgkyNzA0NjIKK0tvaW5hZHVndSBEaXN0cmljdCAJOgkxCToJMjY1NzU4CitQb3J0IExva28gRGlzdHJpY3QgCToJMQk6CTQ1Mzc0NgorVG9ua29saWxpIERpc3RyaWN0IAk6CTEJOgkzNDcxOTcKK1NvdXR0aGVybgk6CTEJOgkxMDkyNjU3CitCbyBEaXN0cmljdCAJOgkxCToJNDYzNjY4CitCb250aGUgRGlzdHJpY3QgCToJMQk6CTEyOTk0NworTW95YW1iYSBEaXN0cmljdCAJOgkxCToJMjYwOTEwCitQdWplaHVuIERpc3RyaWN0IAk6CTEJOgkyMjgzOTIKK1NoZXJicm8gVXJiYW4gRGlzdHJpY3QgCToJMQk6CTk3NDAKK1dlc3Rlcm4JOgkxCToJOTQ3MTIyCitSdXJhbCBEaXN0cmljdCAJOgkxCToJMTc0MjQ5CitVcmJhbiBEaXN0cmljdCAJOgkxCToJNzcyODczClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NJTkdBUE9SRV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TSU5HQVBPUkVfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUyN2MwZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TSU5HQVBPUkVfQVJFQS50eHQKQEAgLTAsMCArMSw3IEBACitTSU5HQVBPUkUJOgkwCToJNjkzCitDZW50cmFsIFJlZ2lvbiBbU2luZ2Fwb3JlXSAJOgkxCToJMTMyLjcKK0Vhc3QgUmVnaW9uIAk6CTEJOgk5My4xCitOb3J0aCBFYXN0IFJlZ2lvbiAJOgkxCToJMTQxLjEKK05vcnRoIFJlZ2lvbiAJOgkxCToJOTcuMworU0lOR0FQT1JFIFtXZXN0IFJlZ2lvbl0JOgkxCToJMjAxLjMKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NJTkdBUE9SRV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TSU5HQVBPUkVfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwMTBiOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TSU5HQVBPUkVfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSw2IEBACitTSU5HQVBPUkUJOgkwCToJNDQ5MjE1MCAKK0NlbnRyYWwgUmVnaW9uIFtTaW5nYXBvcmVdIAk6CTEJOgkzMDAwMDAwCitFYXN0IFJlZ2lvbiAJOgkxCToJMAorTm9ydGggRWFzdCBSZWdpb24gCToJMQk6CTAKK05vcnRoIFJlZ2lvbiAJOgkxCToJMAorU0lOR0FQT1JFIFtXZXN0IFJlZ2lvbl0JOgkxCToJMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NMT1ZBS0lBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NMT1ZBS0lBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNWZjNjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0xPVkFLSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSBAQAorU0xPVkFLSUE6MDo1Mzc0MzYyOjI4NQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NMT1ZFTklBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NMT1ZFTklBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YzQ4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0xPVkVOSUFfQVJFQS50eHQKQEAgLTAsMCArMSBAQAorIFNsb3ZlbmlqYSA6IDEgOiAyMDI1MS4wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0xPVkVOSUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU0xPVkVOSUFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlYWUxNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TTE9WRU5JQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxIEBACisgU2xvdmVuaWphIDogMSA6IDE5NDgwNjAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TT01BTElBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NPTUFMSUFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcxMWUwNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TT01BTElBX0FSRUEudHh0CkBAIC0wLDAgKzEsMTA1IEBACitTT01BTElBOjA6NjM3NjU3CitTQU5BQUc6MToyMzI5My42MDkKK0ouIEhPT1NFOjE6MTg2OTMuOTEwCitXLiBHQUxCRUVEOjE6MTA0MjAuOTkwCitCQU5BQURJUjoxOjE5OS4wOTQKK05VR0FBTDoxOjgzOTguNzU2CitHQUxHVURVVUQ6MToxNzI1NC43NDAKK0ouIERIRVhFOjE6MTE2MTYuNjEwCitTSC4gREhFWEU6MTo4MDQzLjc0NQorQkFSSToxOjI4MTUzLjE1MAorQkFZOjE6MTQ3ODIuMDAwCitTSC4gSE9PU0U6MToxMTQ5MC41NTAKK0hJSVJBTjoxOjEzNjYyLjgzMAorQkFLT09MOjE6MTAzNjMuMjAwCitNVURVRzoxOjI2MzYzLjA5MAorVE9HLURIRUVSOjE6MTIyNDUuNDcwCitHQURPOjE6MTI0OTAuOTAwCitLSVNNQUFZTzoyOjEuMDAwMDAwCitCQUtJOjI6ODQ1LjAyOTk5MworS0lTTUFBWU86MjoyLjI3MTMwOAorTUFSS0E6Mjo0MzAuMzc2NzY1CitKQVdIQVI6MjoyMDUxLjczNjQ4MAorQ0FZTkFCTzoyOjI1NDYuNTcyMTcxCitCVSdBQUxFOjI6MzQxMS41ODgzMzcKK0JVVUxPIEJVUkRPIChCVUxBLUJSSUYpOjI6NjQwNi44NTg5MjIKK1dBTkxBIFdFWU46MjoyNTc1LjcxMTg5NgorUU9SWU9PTEVZOjI6MTQ1MC44NDE5NTAKK0NBREFBRE86MjoyMzgwLjAzOTQzMgorVEFMRUVYOjI6MTMxNC4zNTg1NzMKK0NFRUwtQUZXRUlOOjI6NjU4OC44NjI4NDEKK1NBWUxBQzoyOjEuMTIwNjM0CitESFVVU0FNQVJFRUI6Mjo0NDY0LjA0NjUzMAorVElZRUVHTE9XOjI6MjY2Ny4xMDcxMzEKK0JVVVIgWEFLQUJBIChCVVIgSEFDQUJBKToyOjU4ODguNDc2NjIyCitCQU5ERVItQkVZTEEgKEJFTkRFUkJFTEE6Mjo0NTM1LjY1ODA2NQorSE9CWU86MjoxMTM4MC41ODYwMTUKK0JFUkJFUkE6MjoyNTA3Ljg3Mzc4MAorQkVMRUQgWEFBV08gKEJVTEEtSEFXQSk6MjoxMTM1LjU3NzQ5MAorQk9TQUFTTzoyOjMyODcuNTIxODgxCitYVURVUiAoSFVEVVIpOjI6MjExOS44OTM1NTIKK1NBWUxBQzoyOjE0OTIuNDUxNjIyCitYQVJBUkRIRUVSRSAoSEFSQVJERVJFKToyOjIyMzkuMTMyMDkwCitTQUFLT1c6Mjo1MDc5LjQwNTk2NworQUZNQURPVzoyOjEwNjQzLjYwMjIyNworQ0VFUklHQUFCTyAoRVJJR0FWTyk6MjoxMTE0NS4zNzI4NjcKK0pBUklJQkFOOjI6NTA2MS45NDY5MTkKK1JBQiBESFVVUkU6MjoxMzMxLjMzNjY4MQorS0lTTUFBWU86MjozLjk2MzU5OAorSkFMQUxBUVNJOjI6MTMwMi41ODg3NDIKK1NBWUxBQzoyOjEuMDAwMDAwCitCQUFSLURIRUVSRToyOjQwNzIuNzc3MTkzCitHQUFMS0FDQVlPOjI6Njg0NC40NjM1MDcKK0tJU01BQVlPOjI6Mi4zNzQ1MzEKK1FBTlNBWCBESEVFUkU6MjoxMTc5Ljc2NjM0OQorQkFESEFOOjI6NTU1OS4zNzMyOTIKK0hBUkdFWVNBOjI6MzEyMy4wMTUxMjkKK0pBTUFBTUU6Mjo4MTEuNjIxMjQwCitTSEVFS0g6Mjo5NDIuOTgxMTYzCitLSVNNQUFZTzoyOjMzNzEuMzM5NDA1CitTQVlMQUM6MjoxLjAwMDAwMAorQlVVSE9PRExFOjI6MTk2OS43NzI1NzUKK0JVUlRJTkxFOjI6MTM4MS4wOTkwMzMKK0tJU01BQVlPOjI6MS4wMDAwMDAKK0pJTElCOjI6MzEyNS42MTU2OTYKK0JVUkFPOjI6NDQ3Mi42NzQ4OTkKK0JPT1JBTUE6Mjo2ODcuMTE3OTI5CitCQURIQUFESEU6MjozODUzLjA3NDk5MgorTEFTQ0FBTk9EIChMQVNBTk9EKToyOjE2NjEuMDUxNzg3CitDRUVMIEJBUkRFIChFTCBCQVJERSk6MjozMTQ2Ljk2OTUyMworU0FCTEFMRToyOjI3OTUuNTgzMTExCitET0xPVzoyOjQ5NS41OTAwMjQKK0tJU01BQVlPOjI6MS4wMDAwMDAKK0dBUk9PV0U6MjoxMjg3LjA5NDQ4NAorQ0FBQlVEV0FBUToyOjIwODQuOTExMDI1CitDRUVMIERIRUVSIChFTCBERVJFKToyOjM2NTQuMDA2MjQ4CitCQVJBQVdFOjI6MTI4OC4xMzE2MjAKK0tJU01BQVlPOjI6MS4wMDAwMDAKK0tJU01BQVlPOjI6MS4wNzgzMjYKK0JBREhBQURIRToyOjEuMDAwMDAwCitLSVNNQUFZTzoyOjEuMDAwMDAwCitDRUVMIFdBQVEgKEVMIFdBSyk6MjoyMjY3LjMzNjA3OAorTU9HQURJU0hPOjI6MTk5LjA5NDAwMAorQkFESEFBREhFOjI6MS41MjM1MjEKK09PRFdFWU5FOjI6MjMxMy40NjkxOTIKK1FBUkRITzoyOjc1MjQuNjQ3ODM0CitFWUw6MjoxMzk4LjU4NzAyOQorUUFOREFMQToyOjMzMTguNTA2NDg2CitHQUJJTEVZOjI6OTU3LjUxMTgwNAorWFVEVU46MjoxMzU2LjU2NTA5MworR0FSQkFIQUFSQVk6MjoyMjEyLjQ4Mjc5OAorTFVVSzoyOjIzMDcuMTM2NDE3CitLVU5UVVdBQVJBWToyOjExNDAuNzY1NjMxCitESUlOU09PUjoyOjMyNjEuNTEzMDcxCitDRUVMIEJVVVIgKEVMIEJVUik6Mjo0NjcxLjczNjc2NQorQkFZREhBQk86Mjo0NDUyLjI0Mzk1OAorQUZHT09ZRSAoQUZHT0kpOjI6MTgwOS4xMzkwMjgKK0JFTEVEIFdFWU46Mjo1OTUzLjM4MjMzNworQ0FMQVdMQSAoQUxVTEEpOjI6MjA0NS4wOTM3OTMKK0lTS1VTSFVCQU46Mjo3NDQxLjcyMTk0MgorV0FKSUQ6MjoxMDk3Ljg5MzExMgorQkFMQ0FEOjI6MTczOC41NzE2OTYKK0NBREFMRToyOjI0ODYuNDU0NjcwCitHT0xET0dPQjoyOjgzNi45NjE0NjkKK0FBREFOOjI6MTc2Ni45ODIxNTMKK0xVR0hBWUE6Mjo4MDUuODg2MzI3CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU09NQUxJQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TT01BTElBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNjg1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU09NQUxJQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDEwNSBAQAorU09NQUxJQTowOjg1OTE2Mjk6MTMuNDczNzQ3CitCQUtPT0w6MToyOTE2ODg6MjguMTQ2NTE4CitCQU5BQURJUjoxOjEwMjAwNjY6NTEyMy41Mzk2MzUKK0JBUkk6MTo0MzU5NjU6MTUuNDg1NDc5CitCQVk6MTo4ODQ1MDk6NTkuODM2ODk2CitHQURPOjE6NDYxMDIwOjM2LjkwODQ2OQorR0FMR1VEVVVEOjE6NTAxODA0OjI5LjA4MjA5NgorSElJUkFOOjE6NDMwMTYzOjMxLjQ4NDE4MAorSi4gREhFWEU6MToyODk4OTY6MjQuOTU1MzAxCitKLiBIT09TRToxOjUzNDE4OToyOC41NzU1NjMKK01VRFVHOjE6NjEwNDA4OjIzLjE1Mzg4NworTlVHQUFMOjE6MjE5OTgwOjI2LjE5MTk3NAorU0FOQUFHOjE6NDI0NjkzOjE4LjIzMjE2OAorU0guIERIRVhFOjE6NjkwNDQ3Ojg1LjgzNjUxMAorU0guIEhPT1NFOjE6MTExOTIwMTo5Ny40MDE4NjUKK1RPRy1ESEVFUjoxOjc1Mjg2OTo2MS40ODE0MjkKK1cuIEdBTEJFRUQ6MToxMjg0NjE3OjEyMy4yNzIwNjkKK0NBTEFXTEEgKEFMVUxBKToyOjcyNjYwOjM1LjUyOTM0MAorUUFOREFMQToyOjcyNjYwOjIxLjg5NTY0MworU0FZTEFDOjI6MTI4NDYxOjEyODQ2MS43MDAwMDAKK1NBWUxBQzoyOjEyODQ2MToxMjg0NjEuNzAwMDAwCitTQVlMQUM6MjoxMjg0NjE6ODYuMDc0MjgxCitJU0tVU0hVQkFOOjI6NzI2NjA6OS43NjM5ODEKK1NBWUxBQzoyOjEyODQ2MToxMTQ2MzMuMDU1OTMxCitCT1NBQVNPOjI6NzI2NjA6MjIuMTAyMDA4CitCQURIQU46MjoxNDE1NjQ6MjUuNDY0MDgxCitDRUVSSUdBQUJPIChFUklHQVZPKToyOjE0MTU2NDoxMi43MDE2MjQKK0xVR0hBWUE6MjoxMjg0NjE6MTU5LjQwNDI0MworQkVSQkVSQToyOjEyODQ2MTo1MS4yMjMzNTEKK0NFRUwtQUZXRUlOOjI6MTQxNTY0OjIxLjQ4NTM5NworQkFLSToyOjEyODQ2MToxNTIuMDIwMjg1CitRQVJESE86Mjo3MjY2MDo5LjY1NjM3NworQk9PUkFNQToyOjEyODQ2MToxODYuOTU3MjgxCitIQVJHRVlTQToyOjEyODQ2MTo0MS4xMzM4NzEKK0dBQklMRVk6MjoxMjg0NjE6MTM0LjE2MjAwMQorU0hFRUtIOjI6MTUwNTczOjE1OS42Nzg0ODEKK0JVUkFPOjI6MTUwNTczOjMzLjY2NTI2OAorQ0FZTkFCTzoyOjE1MDU3Mzo1OS4xMjgwMzIKK09PRFdFWU5FOjI6MTUwNTczOjY1LjA4NTcxNworQkFOREVSLUJFWUxBIChCRU5ERVJCRUxBOjI6NzI2NjA6MTYuMDE5OTEwCitUQUxFRVg6MjozNjY2MzoyNy44OTQ0NjgKK1hVRFVOOjI6MzY2NjM6MjcuMDI2NTk0CitHQVJPT1dFOjI6MzY2NjM6MjguNDg1MzQ3CitMQVNDQUFOT0QgKExBU0FOT0QpOjI6MzY2NjM6MjIuMDcyMzYwCitCVVVIT09ETEU6MjoxNTA1NzM6NzYuNDQyMjI2CitFWUw6MjozNjY2MzoyNi4yMTQ1NTMKK0JVUlRJTkxFOjI6MzY2NjM6MjYuNTQ2NDkxCitKQVJJSUJBTjoyOjEyMjA4MToyNC4xMTc1MTkKK0dBQUxLQUNBWU86MjoxMjIwODE6MTcuODM2NTQ4CitHT0xET0dPQjoyOjEyMjA4MToxNDUuODYyODY4CitIT0JZTzoyOjEyMjA4MToxMC43MjcxODAKK0NBREFBRE86MjoxMDAzNjA6NDIuMTY3NzA1CitDQUFCVURXQUFROjI6MTAwMzYwOjQ4LjEzNjczMAorREhVVVNBTUFSRUVCOjI6MTAwMzYwOjIyLjQ4MjAyNAorQkVMRUQgV0VZTjoyOjE0MzM4NzoyNC4wODUwNzYKK0NFRUwgQlVVUiAoRUwgQlVSKToyOjEwMDM2MDoyMS40ODI1NDYKK1hBUkFSREhFRVJFIChIQVJBUkRFUkUpOjI6MTIyMDgxOjU0LjUyMTgzOQorQ0VFTCBCQVJERSAoRUwgQkFSREUpOjI6NTgzMzc6MTguNTM3NzA3CitSQUIgREhVVVJFOjI6NTgzMzc6NDMuODE4ODE4CitDRUVMIERIRUVSIChFTCBERVJFKToyOjEwMDM2MDoyNy40NjU5NjMKK1hVRFVSIChIVURVUik6Mjo1ODMzNzoyNy41MTkxMTgKK1RJWUVFR0xPVzoyOjU4MzM3OjIxLjg3Mjk4NworQlVVTE8gQlVSRE8gKEJVTEEtQlJJRik6MjoxNDMzODc6MjIuMzgwMzM4CitMVVVLOjI6NzY4MzY6MzMuMzAzOTExCitET0xPVzoyOjc2ODM2OjE1NS4wNDA3ODYKK1dBSklEOjI6NTgzMzc6NTMuMTM1OTU2CitCQVlESEFCTzoyOjIyMTEyNzo0OS42NjY0NzIKK0JFTEVEIFhBQVdPIChCVUxBLUhBV0EpOjI6NzY4MzY6NjcuNjYzMDc3CitBQURBTjoyOjE3MjYxMTo5Ny42ODczMTkKK0dBUkJBSEFBUkFZOjI6NzY4MzY6MzQuNzI4NzA3CitKQUxBTEFRU0k6MjoxNDMzODc6MTEwLjA3OTAwMAorQ0FEQUxFOjI6MTcyNjExOjY5LjQyMDgzMQorQlVVUiBYQUtBQkEgKEJVUiBIQUNBQkEpOjI6MjIxMTI3OjM3LjU1MjUzOQorV0FOTEEgV0VZTjoyOjE1OTg4NTo2Mi4wNzQ0MzQKK0pBV0hBUjoyOjE3MjYxMTo4NC4xMjk1OTEKK0NFRUwgV0FBUSAoRUwgV0FLKToyOjc2ODM2OjMzLjg4ODUyMQorUUFOU0FYIERIRUVSRToyOjIyMTEyNzoxODcuNDMzMDg4CitCQUFSLURIRUVSRToyOjc2ODM2OjE4Ljg2NTkxNQorQkFMQ0FEOjI6MTcyNjExOjk5LjI4MzY1NAorQUZHT09ZRSAoQUZHT0kpOjI6MTU5ODg1Ojg4LjM3Njc2NgorRElJTlNPT1I6MjoyMjExMjc6NjcuNzk4OTc3CitRT1JZT09MRVk6MjoxNTk4ODU6MTEwLjIwMjExOQorTU9HQURJU0hPOjI6MTAyMDA2Njo1MTIzLjUzOTYzNQorU0FBS09XOjI6OTY2MzI6MTkuMDI0MjcyCitNQVJLQToyOjE1OTg4NTozNzEuNTAyMDY2CitLVU5UVVdBQVJBWToyOjE1OTg4NToxNDAuMTU2NjIyCitTQUJMQUxFOjI6MTU5ODg1OjU3LjE5MjMxMAorQkFSQUFXRToyOjE1OTg4NToxMjQuMTIyMjk4CitCVSdBQUxFOjI6OTY2MzI6MjguMzI0NjM3CitBRk1BRE9XOjI6MzU2MTI6My4zNDU5MTYKK0pJTElCOjI6OTY2MzI6MzAuOTE2MTQ5CitKQU1BQU1FOjI6MzU2MTI6NDMuODc4MzQ5CitLSVNNQUFZTzoyOjM1NjEyOjEwLjU2MzMzOQorQkFESEFBREhFOjI6MzU2MTI6OS4yNDI2NDQKK0tJU01BQVlPOjI6MzU2MTI6MzU2MTIuNjAwMDAwCitLSVNNQUFZTzoyOjM1NjEyOjE1Njc5LjMzNTQzMQorS0lTTUFBWU86MjozNTYxMjozMzAyNS44MTk2NTAKK0tJU01BQVlPOjI6MzU2MTI6MzU2MTIuNjAwMDAwCitLSVNNQUFZTzoyOjM1NjEyOjM1NjEyLjYwMDAwMAorS0lTTUFBWU86MjozNTYxMjo4OTg0LjkxNzIzOQorS0lTTUFBWU86MjozNTYxMjozNTYxMi42MDAwMDAKK0tJU01BQVlPOjI6MzU2MTI6MzU2MTIuNjAwMDAwCitLSVNNQUFZTzoyOjM1NjEyOjE0OTk3Ljc0MDYwNgorQkFESEFBREhFOjI6MzU2MTI6MzU2MTIuNjAwMDAwCitCQURIQUFESEU6MjozNTYxMjoyMzM3NS4xOTQ2OTcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TT1VUSCBBRlJJQ0FfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU09VVEggQUZSSUNBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YmYzOWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU09VVEggQUZSSUNBX0FSRUEudHh0CkBAIC0wLDAgKzEsNDA3IEBACitTT1VUSCBBRlJJQ0E6MDoxMjE5OTEyCitPUkFOR0UgRlJFRSBTVEFURToxOjUwMjE2LjM5OAorV0VTVEVSTiBDQVBFOjE6NTIwNjEuNTMxCitPUkFOR0U6MTo2OTkwLjk1NQorTk9SVEhFUk4gQ0FQRToxOjE0MDUyMS41OTQKK0VBU1RFUk4gVFZMOjE6Njc4ODYuNjQ4CitQV1YgW0dhdXRlbmddOjE6MTcwMTAKK05PUlRIRVJOIFRWTDoxOjE0MDUyMS41OTQKK0VBU1RFUk4gQ0FQRToxOjY3ODg2LjY0OAorTk9SVEggV0VTVDoxOjQzODQ4Ljg3OQorTkFUQUw6MTozNTY3Mi4wMzkKK0xPV0VSIFVNRk9MT1pJOjI6NDQ5LjQ2MjU4OAorTkdPVFNIRToyOjEyOTAuOTI1ODQyCitOT1JUSEVSTiBUVkwtMjY6MjoyMzYuNTk2OTYyCitLT1BQSUVTOjI6NjEzLjU2NTg3NgorQkFSS0xZIFdFU1Q6MjoyNTUzLjAzNDcxNAorTkFUQUwtMTQ6MjoxMzIuNjA1MjYyCitTVEVMTEVOQk9TQ0g6MjoxOTIuNTA5OTIzCitEVVJCQU4vQ0hBVFMuOjI6MTAxLjA4NjU5NgorTkFUQUwtNTc6MjozNjQuOTk1OTU3CitDQVJPTElOQToyOjM3ODYuNjgyODU1CitOQVRBTC0xNjoyOjYwLjI3NzU2MQorTktBTkRBTEE6Mjo2NjYuMjQxNDg0CitLVUlMU1JJVkVSOjI6NDYuOTMxODMwCitOT1JUSCBXRVNULTIzOjI6MTA1Ny44Mzc2OTQKK05BVEFMLTU0OjI6MzUuMjEzMzgwCitTT1VUUEFOU0JFUkc6Mjo0NDcxLjYwMjU4NAorRlJBU0VSQlVSRzoyOjQ1NzEuODY4NTkzCitIVU1BTlNET1JQOjI6MTU0Ny44MTU2NDIKK0hFUkJFUlQ6MjoyODcwLjMxNTAwNworQ0FMRURPTjoyOjE1ODIuODIxOTg0CitFQVNURVJOIENBUEUtMToyOjE1NTUzLjkxODIxNgorUE9UR0lFVEVSU1JVUzoyOjE1MDczLjI4MDkyNAorTUFMQU1VRUxFOjI6MTQzOS4xOTEyNzEKK0VTVENPVVJUOjI6MTAwMy4yMDI3MzYKK1FVRUVOU1RPV046Mjo0Mi41OTc2MzkKK1BBVUxQSUVURVJTQlVSRzoyOjU3MC4zMTIyMTYKK01PVVRTRToyOjI4Ni42MjIxNDUKK0hPRVZFTERSSUY6MjoxMzk1Ljg0ODI2MgorQ0FMVklOSUE6MjoxNDcwNi42Mzg2ODkKK0xZREVOQlVSRzoyOjQ1MDkuOTQ0MDExCitEVVJCQU4vQ0hBVFMuOjI6MTAuMTE5MjkyCitLVVJVTUFOOjI6NjYyMS42MjE3MjkKK1dFUEVORVI6Mjo3MzAuNzM5NzM0CitPQkVSSE9MWkVSOjI6NC4wODU1MzgKK1RBUktBU1RBRDoyOjEyNzUuMzUxMDA1CitOQVRBTC04MDoyOjQ3LjMyNzQ1MgorTVRPTkpBTkVOSToyOjMzMy44ODMxMjgKK05PUlRIRVJOIFRWTC0yODoyOjMyNi4xMDM3NjYKK1ZSWUJVUkc6Mjo0MTkyLjk2NDIwNQorRUVSU1RFSE9FSzoyOjUzLjYyNDEwOQorRk9SVCBCRUFVRk9SVDoyOjUzMi4wOTE2ODMKK0JFUkdWSUxMRToyOjk5Ni4yMzIzMzMKK1dBUlJFTlRPTjoyOjYzMy4zOTEzNDkKK0dST0JMRVJTREFMOjI6MjI1NC41MzY5NzcKK05BVEFMLTQ0OjI6MzQuMzc3MTc3CitUSEVVTklTU0VOOjI6NzMwLjkzNDExNAorQkVERk9SRDoyOjExMDguNzA1ODk4CitOQVRBTC01MToyOjYuNTI0MTQ2CitOSUdFTDoyOjYuNzY0OTI3CitNQUhMQUJBVElOSToyOjU1Mi4yNjc3OTIKK1JPT0RFIFBPUlQ6MjoxLjg4NDI5MAorRUFTVEVSTiBUVkwtMjE6Mjo3MC4yMTkzOTIKK1NURVlOU0JVUkc6MjoxMDk0LjA4NDQwMworRURFTkJVUkc6Mjo4MDAuNTE0MDMyCitMQURJU01JVEg6MjoxNDg3LjMzNjgzMAorSU5BTkRBOjI6MTM0LjM4NzExNQorWkFTVFJPTjoyOjc1MC4yMjY4OTgKK0JSSVRTVE9XTjoyOjI4NDMuMTQ5MTc5CitWRVJFRU5JR0lORzoyOjEyLjA4MTE5MworVEhBQkFNT09QTzoyOjI5MDkuNzY0OTM5CitMQURZQlJBTkQ6Mjo4NTguNjI0MjQyCitXSUxMSVNUT046Mjo1MTU0Ljg4Mjk4MQorTkVCTzoyOjMyOTQuNDQ0Mjc3CitOT1JUSEVSTiBUVkwtNDM6Mjo4NTUuMzQzNDI0CitRVUVFTlNUT1dOOjI6MzQuODIzOTIyCitMT1dFUiBUVUdVTEE6MjozNzcuODQ2NjkyCitCQVJCRVJUT046MjozMTMyLjE0ODA4MAorTkFUQUwtNTM6MjoxODAuNjA0ODcyCitNQVJJQ086MjoyMzE0LjgxNjcxNAorTkFUQUwtNDk6MjoyMC42MDEyMzcKK0xJT04gUklWRVI6Mjo2MTEuMTYyNzQ5CitHTEVOQ09FOjI6MjQ4LjYzOTA1NworTUlERExFQlVSRzoyOjIyOTkuNzMwODc0CitQT1RDSEVGU1RST09NOjI6MTI5Ny4yODQ5MzkKK1ZVTEFNLi9FTVpVTUJFOjI6OTcuNzE1MzUyCitIT09QU1RBRDoyOjEzNTUuMDAxNDMzCitWVUxBTS4vRU1aVU1CRToyOjk0LjI4NDM5NQorU0VLR09TRVNFOjI6MzY0Ljg3MjM3NAorUklWRVJTREFMRToyOjE2MjEuOTk4NTEwCitXT0xNQVJBTlNTVEFEOjI6MTkxNy42ODk1MzYKK0FMRlJFRDoyOjMwNC40MTMxNjkKK05BVEFMLTYxOjI6MTYxLjk0MjA3NQorU1RPQ0hFTlNUUk9NOjI6ODkuMzY0NDQ3CitSSVRBVkk6MjozNDIuODc2MTI1CitOQVRBTC02MDoyOjQ5LjUyOTUwMAorRUxMSU9UOjI6ODQyLjAwMzkxMworV09OREVSQk9PTToyOjEwLjM4MTUxNgorTUVTU0lOQToyOjU1MTYuMDU3Nzc5CitXQVRFUlZBTCBCT1ZFTjoyOjk1OS40MzU2MDMKK05PUlRIIFdFU1QtMTQ6Mjo2MTgzLjUxNjkzMgorTkFUQUwtMjk6MjoxMTQuMDYwMTQyCitGT1VSSUVTQlVSRzoyOjQ2Mi4yNTE5MzMKK0JFTExFVklMTEU6MjoxNzIuNTIyMDY4CitNT1VUU0U6MjoyOTIuNzk2NzcyCitIRUlERUxCRVJHOjI6OC4zNzgyMTgKK1NVVEhFUkxBTkQ6MjozNjAwLjUxODYyNgorUEhJTElQUE9MSVM6MjoxMjU4Ljc0NDcxNgorRUFTVCBMT05ET046Mjo0ODguNDQ5OTYxCitNT1VOVCBDVVJSSUU6MjoxNzgyLjMzNjQ0NQorSEVJTEJST046MjoxNDk0LjY3NDM2OQorV09ERUhPVVNFOjI6MTIxNi4wODk1OTQKK05BVEFMLTg2OjI6MTUuNDg3MjcwCitOT1JUSEVSTiBUVkwtMTg6Mjo3MC4xMTg3MzQKK05BVEFMLTQ2OjI6MjU2Ljc2MzQyNworTElORExFWToyOjExMTMuMjA4NjAxCitSRUlUWjoyOjEwNzQuNDA1OTYyCitDQVBFOjI6NjIuODczNDA2CitTV0FSVFJVR0dFTjoyOjYxOS41ODczMjAKK05PUlRIRVJOIFRWTC0yMjoyOjc3OS4xODA5OTEKK0hBTktFWToyOjY3OS45MTAyODUKK0VBU1RFUk4gVFZMLTg6Mjo4NDIuMTQwODg1CitOT1JUSEVSTiBUVkwtMzI6MjozMTMuNjg4ODMxCitOQVRBTC00ODoyOjIzLjk5MjgyNAorQkVUSExFSEVNOjI6MTQyMi4xMzQ4OTkKK0hMQUJJU0E6MjoxMDE5LjkzMTIxMgorTURBTlRTQU5FOjI6MjkuODkzODAyCitOQVRBTC05MzoyOjM3OS4zMDY5NTAKK0VBU1RFUk4gQ0FQRS0zOjI6Njc3LjczODA3NAorRUFTVEVSTiBUVkwtMTc6Mjo5MjUuNTk0OTU5CitKT1VCRVJUSU5BOjI6NTM2LjI2Mzc3NAorSEFOT1ZFUjoyOjE0MzUuNjc2MTg1CitOQVRBTC03MzoyOjE0MC43OTk2NDMKK01BTE1FU0JVUlk6MjoxLjMxODUyMQorTkFUQUwtNDU6MjoxOC4wMDcwMDUKK1JBTkRGT05URUlOOjI6Ni4zODkyNjcKK1BFQVJTVE9OOjI6MTA0OS4zNTAxODgKK0xBSU5HU0JVUkc6MjozNTIzLjY0Mzg4MgorTEFEWSBHUkVZOjI6NTgzLjUwNzM5MAorV0VTU0VMUyBCUk9OOjI6NjYwLjAxODE2MgorTkFUQUwtMjg6MjoxMS4zNDYxOTEKK01PS0VST05HOjI6NzAxLjgxODI1NAorQlJJVFM6Mjo3OTMuMTYwODU3CitTTUlUSEZJRUxEOjI6MTEzMC41Mjk4NzEKK05BVEFMLTk6MjoyNC43NDMxNzgKK0tJUktXT09EOjI6Njk4LjcxNDQwMQorU0NIV0VJWkVSIFIuOjI6MjkyNC43MzM1MzIKK0VSTUVMTzoyOjY5NjYuODk4ODQwCitXSVRCQU5LOjI6MjYzOS4xMTMwMTkKK0pBTlNFTlZJTExFOjI6MTgzNy4zMjIyMjYKK05PUlRIRVJOIFRWTC0zMDoyOjM5LjA2NzcxNQorS0lORyBXSUxMSUFNIFRPV046MjoyNjIuOTQ2OTQzCitGUkFOS0ZPUlQ6MjoxMTkxLjA2NDM4MgorVkVOVEVSU0JVUkc6Mjo0OTYuMzAxMDQ4CitFQVNURVJOIFRWTC03OjI6Njg3LjQyNjMzOQorU1RFWUxFUlZJTExFOjI6MTQ3Ny4xNzEwMDkKK1NVVFRFUkhFSU06Mjo2NTEuOTc4NzMyCitQSUVURVJTQlVSRzoyOjUzNDguODExNzk4CitOT1JUSCBXRVNULTEwOjI6MTk2NC44MTQ0MjEKK0VNQlVNQlVMVToyOjI2MS45OTM5MzMKK05BVEFMLTc4OjI6NDkuMjM4MTUwCitCQUJBTkFOR086MjozMTguMTYzNDk1CitXRUVORU46MjozNjIuMzkyNDg1CitORFdFRFdFOjI6MjYzLjkyNzIyMAorS0VOSEFSRFQ6MjoxNDA5MC44MzU4ODIKK0VFUlNURUhPRUs6MjozMy44Njg4NDkKK1FVRUVOU1RPV046Mjo2ODkuNTQyNTQ3CitNT0tFUk9ORzoyOjc0MS45MTE5MjkKK0dJWUFOSToyOjM3NDcuOTAwOTkzCitNU0lOR0E6Mjo3NTAuOTQ1MTU5CitQSUVURVJNQVJJVFpCVVJHOjI6MjQzLjE0ODM2NworVlJFREVOREFMOjI6MS4wMDAwMDAKK1ZFTlRFUlNET1JQOjI6MTM1Mi44MzQ5NjkKK0VBU1RFUk4gVFZMLTEzOjI6OTQxLjg2MTg0MAorTk9SVEhFUk4gVFZMLTc6Mjo5NTcuMzg5MDc2CitNT1VOVCBDVVJSSUU6MjoxMTIuODYxOTIyCitVQk9NQk86Mjo4NTcuMjgyNzY1CitTVEFOREVSVE9OOjI6NDYwNS45NjQ1MTYKK05BVEFMLTQwOjI6MTQ3LjMzNjcwNAorSE9GTUVZUjoyOjk1My43NDk5MDQKK0FMRVhBTkRSSUE6Mjo5NjMuNzEzNTQ1CitNQUxNRVNCVVJZOjI6MTc5NC40NzIyODYKK1BPU1RNQVNCVVJHOjI6NzE4NS43MDcxMzcKK1JBTkRCVVJHOjI6Mi42ODc2OTAKK0JSSVRTOjI6MTUuMDMxMzg4CitVTVZPVEk6Mjo2NTMuOTU4MzMwCitBTUVSU0ZPUlQ6MjoxODAxLjgxODgzNgorQkVMRkFTVDoyOjI4NjAuMTA2MzIwCitDQUxJVFpET1JQOjI6NDQwLjk5NDUxNQorTkFQSFVOTzoyOjU4MS42NzAwMzgKK1ZJQ1RPUklBIEVBU1Q6MjozMjExLjQ4NDY1MQorTk9SVEggV0VTVC0zOjI6Mjg3NS40NDgwNTYKK1RST01QU0JVUkc6Mjo3ODIuMDgyNzYwCitSVVNURU5CVVJHOjI6MTIwLjAyMjE3MQorQkVBVUZPUlQgV0VTVDoyOjY2ODEuNDA1NjI1CitBQkVSREVFTjoyOjI4MDYuOTEyMzI3CitORUxTUFJVSVQ6MjoyMDY1LjA0MjU0OAorU1dFTExFTkRBTToyOjE2MzQuNjg1MjMwCitWT0xLU1JVU1Q6MjoxNzIzLjkzNTgyNAorUklDSE1PTkQ6MjozOTUuODgzMjQ2CitBTElXQUwgTk9SVEg6Mjo3OTYuOTYzMjc2CitTQVNPTFNCVVJHOjI6MzgyLjIyMjgxNAorV0lOQkVSRzoyOjE1Mi4yOTczNDIKK0NVTExJTkFOOjI6MTEuMTkwMDE0CitCUkVEQVNET1JQOjI6MTc5MC4zNDA1NTQKK0JBUktMWSBFQVNUOjI6MTU0MS44MDA5NDQKK0dPT0RXT09EOjI6MTYuMzgxODIwCitQSUxHUklNJ1MgUkVTVDoyOjEzMDE5Ljk0NDIwMgorTkFUQUwtMzA6MjozMTUuNjc4ODY5CitOQVRBTC0xMToyOjEwOS44NTE0MDIKK1BISUxJUFNUT1dOOjI6MjIyNy44MzY1NjEKK0JSQU5ERk9SVDoyOjE0ODAuNjUwODk5CitPREVOREFBTFNSVVM6Mjo1NTcuMjUwMDM1CitWRVRFUlNUQUQ6Mjo4MTkuMzU0Njc1CitEQU5OSEFVU0VSOjI6MjQxLjU2MDAzMAorS1JVR0VSU0RPUlA6MjoxMC4zNDQxMTgKK05PUlRIRVJOIFRWTC00NToyOjExMi4xMTE2OTYKK1NURVJLU1RST09NOjI6Njg0Ljk3MzU0NQorUFJJRVNLQToyOjU0ODIuODE0MjQwCitQUkVUT1JJQToyOjkuOTM0NzkwCitOQVRBTC03MjoyOjQ1LjQyOTM3NgorQlJBS1BBTjoyOjEuOTMzMjA1CitOQVBIVU5POjI6MjkxLjUxNTc3MAorT1JBTkdFIEZSRUUgU1RBVEUtMzM6Mjo0OTguMjM3NDY5CitOQVRBTC01NToyOjE2MC40OTcwNjcKK05PUlRIRVJOIFRWTC00MjoyOjQ4MC4zMzE2MzAKK05FVyBIQU5PVkVSOjI6NDQ1LjIzOTUzNQorQUxCRVJUT046MjoxLjAwMDAwMAorUElORVRPV046MjoxMzEuODA4Nzk4CitXQVJNQkFEOjI6NDgxOS44ODQ2NjUKK1VOREVSQkVSRzoyOjcxMi43MTUyNTEKK05BVEFMLTYyOjI6NzIuODIxMDYzCitNVVJSQVlTQlVSRzoyOjIxMzAuNzM1ODc4CitOQVRBTC0zMjoyOjMuODE2ODY0CitIQVk6Mjo0OTI0LjU0NTkxMgorVVRSRUNIVDoyOjE0ODcuODEwMzcwCitDT0xJR05ZOjI6NTg5LjgyNzA1MAorTVRVTlpJTkk6MjoxNTAuOTYyMTM3CitKQUdFUlNGT05URUlOOjI6NDgxLjg1NTkzNAorTkFUQUwtOTE6Mjo4NTYuMDMzMjE5CitOT1JUSCBXRVNULTI6Mjo5NzUuMDI5MjQ1CitLUk9PTlNUQUQ6MjoxNjA1LjEyMjM3MAorTkFUQUwtMzc6Mjo2My4wODg2MTAKK0lOR1dBVlVNQToyOjE1MzcuNDUyNDIwCitXQUxWSVMgQkFZOjI6NDEyLjkzMTQ2NworTkFUQUwtOTA6MjoxMDUuNTQ1NTU0CitHRVJNSVNUT046MjoxLjE5MTQ0MworVU5JT05EQUxFOjI6MTI0Ny41NzY0ODAKK1VNWklOVE86MjoyNzcuOTQyNzU2CitBREVMQUlERToyOjYxMC4xNDgzOTkKK1dFU1RPTkFSSUE6Mjo0LjUxMzM2MQorU1BSSU5HUzoyOjIuMTU3MDE5CitEVU5ERUU6Mjo3MDYuMzI3NTUzCitMRVRBQkE6MjoxMTM3Ni4xNzQzMjIKK1NPTUVSU0VUIEVBU1Q6MjoyMzA4LjUxODQ0MQorV0lUWklFU0hPRUsgKFFBUVdBKToyOjY5OTAuOTU1MDAwCitLTElQUklWRVI6MjoxMTgwLjE5MjkxNworTUFQVU1VTE86MjozMDAuMTMzMjI3CitTVFJBTkQ6Mjo0OC44MzA3MjYKK01PT0lSSVZJRVI6Mjo1NjIuOTk2NDAyCitNRFVUSkFOQToyOjY5OS41NzAzOTMKK05PUlRIRVJOIFRWTC0zNzoyOjg3LjAzMjk2MgorQkVOT05JOjI6Mi4zODg3ODgKK0VTSE9XRToyOjQwOC4wNDQzMjkKK0hPUEVUT1dOOjI6MzI0NC43NDA1MjMKK0JPS1NCVVJHOjI6MS40ODM4MjgKK0tPTUdBOjI6NTg1LjE0OTExMgorTk9SVEhFUk4gVFZMLTIwOjI6MjgwLjg1Mzc3MAorTk9SVEhFUk4gVFZMLTQ0OjI6NDgxLjI5NTYzOQorQUxCRVJUOjI6MTU5My4xMDMxODgKK1dPUkNFU1RFUjoyOjE2MzIuMTU2NjIyCitNT0tFUk9ORzoyOjI4MTkuMjMzMTY2CitOQVRBTC05ODoyOjIwLjQ5MDMzMQorTU9MVEVOTzoyOjc4Mi40NjA1NzkKK05PUlRIRVJOIFRWTC00OjI6NjYwNy42NTg1MDcKK05PUlRIRVJOIFRWTC00NjoyOjIwMC40MTA1NjgKK05PUlRIRVJOIFRWTC0yNDoyOjU3LjIxMDUwOQorQ0FNUEVSIERPV046MjoyODIuNzA4MzQxCitOQVRBTC0zNDoyOjQ1Ny43MDM2NTkKK0xJQ0hURU5CVVJHOjI6MTkwMy43MTAxNDMKK1ZSRURFTkRBTDoyOjE1MDguODMyMzYyCitCUk9OS0hPUlNUU1BSVUlUOjI6MTMuODE0MTkwCitTT1VUUEFOU0JFUkc6MjoxMDQxOS42ODY4MzYKK1JPVVhWSUxMRToyOjExMjMuODY3ODkwCitOT05HT01BOjI6NzMwLjgxMDEyMAorREVMQVJFWVZJTExFOjI6MTIwOS4xMDE5OTQKK1ZSWUJVUkcgMS9NQUZFS0lORyAxOjI6NzE2Mi4zMzU3MzAKK0VYQ0VMU0lPUjoyOjY4My40MDEyODUKK05PUlRIRVJOIFRWTC0zOToyOjE2OS4zNjA5MzgKK0NBUEU6MjoxLjYzNzY2OAorRUVSU1RFSE9FSzoyOjI0LjAzMjc0MAorREVXVFMgRE9PUlA6Mjo5OTAuNjE0NzgzCitWQU5ERVJCSUpMIFAuOjI6Ny4wMDMwODYKK0JFVEhVTElFOjI6MTA2NC4wOTA2NDMKK05PUlRIIFdFU1QtNToyOjEyMDcuNDIyMzQyCitOUVVUVToyOjY0OC42NzY3NjYKK0lORFdFOjI6MzYwLjk3Mzg0NgorTU9TU0VMIEJBQUk6Mjo4MDUuNzA2Njc2CitFRVJTVEVIT0VLOjI6MTA3OC4xMDM4NTQKK05FV0NBU1RMRToyOjY3Mi4wNTgwOTAKK1ZJQ1RPUklBIFdFU1Q6Mjo0NDYwLjY1MTc1OAorU0VLSFVLSFVORUxBTkQ6MjozNzU5LjE2NDA0OQorRUFTVEVSTiBUVkwtOToyOjIzLjAzMjIwMAorSEVSTUFOVVM6MjoyOTUuOTI1NDMwCitSVVNURU5CVVJHOjI6NzQ5LjM2NjYxMQorREUgQUFSOjI6MTI3Mi44OTQ2MjUKK1BPUlQgRUxJU0FCRVRIOjI6NjA0LjAyODQxMworTU9VVFNFOjI6NDkuNTEzNTgyCitCTE9FTUZPTlRFSU4vQk9UUzoyOjIxOTguMzQ3MzkwCitDTEFOV0lMTElBTjoyOjI5NDguNjY4NTA0CitHRU9SR0U6MjoxMDM0LjQ5NjQyNgorVkFOSFlOU0RPUlA6MjozNzM1Ljc5NDU3OQorTkFUQUwtMTc6MjozMy4yMjcwODIKK0VBU1RFUk4gVFZMLTIwOjI6MTcuMDEzMTU1CitOT1JUSEVSTiBUVkwtMzE6MjoyNjYuMTIxNzIzCitIQVJSSVNNSVRIOjI6Mjg1My40ODUwNDgKK05BVEFMLTI3OjI6NjguODAwMzU3CitDQVJOQVJWT046Mjo2MjQ0LjI1MDM0NAorVlVMQU0uL0VNWlVNQkU6MjozMzcuNDQ3NDc4CitPVURUU0hPT1JOOjI6MTM1OC44ODkyMjkKK05BVEFMLTEyOjI6NTIuODg5OTYwCitNQUNMRUFSOjI6MTAwNy4xNzQyMjQKK1BSSU5DRSBBTEJFUlQ6MjozMTg0LjI2MTU5MAorUElLRVRCRVJHOjI6MTc2My41NjQyODQKK0NMT0NPTEFOOjI6NDMwLjk4MDQ4NgorQUxCQU5ZOjI6MTc5NC41MTg2NjAKK0JBVEhVUlNUOjI6NjA4LjQyMjMxNgorQkVUSEFMOjI6MjMyOS4xNjkxMDMKK1dJTExPV01PUkU6MjozMDgzLjI5MjM4OAorTk9VUE9PUlQ6Mjo1ODEuOTYwNzM4CitOQU1BS1dBTEFORDoyOjE4MzE5LjcxMjc1MQorTk9SVEhFUk4gVFZMLTMzOjI6MTQxLjA5MzI2MAorVFVMQkFHSDoyOjM1NS4yOTg5NzgKK1VJVEVOSEFHRToyOjEyNTIuODEwOTY2CitCT0xPQkVEVToyOjg3OS41Mzk5NTYKK1ZJTEpPRU5TS1JPT046Mjo4NDMuMDY0Mjc3CitXSVRSSVZFUjoyOjMxOTguODUzNzg4CitJWE9QTzoyOjU2OS4zNDkxNzAKK1JJQ0hNT05EOjI6Mjg4Ni41OTg3ODcKK1VCT01CTzoyOjc2Ni41OTI5MDAKK05BVEFMLTE4OjI6MjExLjg2OTU1MQorTk9SVEhFUk4gVFZMLTE5OjI6NTEuNzYzMDAwCitLTllTTkE6Mjo4MTYuMTIxNTQ5CitXSU5CVVJHOjI6MTE0Ny40NDIwNTEKK0hFTk5FTk1BTjoyOjI0Ny44Mzk1NzQKK0JBTEZPVVI6MjoxOTg4Ljk0NjQ0NgorTkFUQUwtNzQ6MjoxNjcuODU4MTE5CitOQVRBTC04ODoyOjQ2Ljg3MjcyMgorVlJFREVGT1JUOjI6NTExLjk3NzQzOQorTURBTlRTQU5FIDQ6MjozMi4zNDAwOTQKK01QRU5ETEU6Mjo0OTIuNTM2ODQ5CitIQVJUU1dBVEVSOjI6MjY3LjI4NzcwOQorS1JBTlNLT1A6MjoyNzcuMjg2NTM3CitUSEFCQVpJTUJJOjI6MTE3NDMuMzQyOTAzCitQQUFSTDoyOjQ0Ny41Mzc0NTIKK1ZSRURFTkJVUkc6MjoyODIuMDI2ODYxCitKT0hBTk5FU0JVUkc6Mjo0LjM3MTA0MgorQk9USEFWSUxMRToyOjEwMTcuNjg2OTY0CitDSEFUQ0FSVDoyOjEwMjcuOTc5ODQyCitOQVRBTC0yNDoyOjE3OS40MzI1MDgKK0VFUlNURUhPRUs6Mjo0ODQuNzQ2NjA4CitCVUxGT05URUlOOjI6MTI1My43Njc5NzUKK1dBVEVSQkVSRzoyOjE2MjQzLjMzMjk1MgorUEFSWVM6MjozNTUuNTIwNzk2CitOQVRBTC0zOToyOjEzLjY5OTU2NworTU9OVEFHVToyOjEwMjMuMDc5MjA3CitOT1JUSEVSTiBUVkwtNDA6MjoxNjU0LjQzMzM4NgorTUFSUVVBUkQ6Mjo0OTguMjg0NzM0CitQSUVUIFJFVElFRjoyOjQyNzUuMDA0MTQ2CitFWklOR09MV0VOSToyOjE5Mi43MzIyMjMKK05BVEFMLTY5OjI6MTM1Ljc2NjE1OAorV0FLS0VSU1RST09NOjI6MjIwMC4xOTgxNjAKK0hPUEVGSUVMRDoyOjUwOC4yNTQxODMKK05BVEFMLTMzOjI6NS43NzMwMDUKK0JPQ0hVTToyOjI2NjYuNDk0NTA2CitLTEVSS1NET1JQOjI6MTM0Ny45NzIyNTAKK0tFTVBUT04gUEFSSzoyOjMuNTQxNzQ5CitQT1JUIFNIRVBTVE9ORToyOjMwNS4wNzk5MzgKK1JFRERFU1NCVVJHOjI6NTg2LjczNDgwOQorUE9MRUxBOjI6MjUxLjIyMTY2OAorVlJZSEVJRDoyOjE0NDUuMzEwNzk2CitHT1JET05JQToyOjIwNDI1LjkxNDc1NAorRklDS1NCVVJHOjI6NTEwLjMxNzkxNworTkFUQUwtMjY6MjoyMzEuNzMyOTQxCitTRU5FS0FMOjI6MTQyNC42ODk3MzUKK0tJTUJFUkxFWToyOjEzNDUuOTQ1NTI0CitERUxNQVM6MjoxMTg2LjQyMDI3MAorQ1JBRE9DSzoyOjIzMjIuMjU0NTA4CitFQVNURVJOIFRWTC0xMToyOjY4NS45MDM2MzYKK05BVEFMLTg1OjI6MjQuMjMzNTQyCitQRVRSVVNCVVJHOjI6MTE3NC41MTk5NDIKK0VBU1RFUk4gVFZMLTE1OjI6OTQuMTcyMDAwCitLT1NURVI6MjoxMDc0LjM3MDkwNAorVlJFREU6MjoyMTEyLjAxNDAzNgorU0VTSEVHTzoyOjM3ODEuOTEwMzAxCitST0JFUlRTT046Mjo2NjYuNTg3OTMyCitCTy9KQUsvS09GL0ZBVToyOjcyNTcuMzg3Njc1CitNSURERUxTQlVSRzoyOjUzODguMTYyNDA4CitXRUxMSU5HVE9OOjI6MTgxLjQxMzk0OAorU0lNT05TVE9XTjoyOjExMC40NzE5MzkKK05BVEFMLTc2OjI6MzAuMDE1NjE4CitHUkFBRkYtUkVJTkVUOjI6MjcyMi4yOTE2NjkKK05BVEFMLTEwMToyOjExNi42ODk5NjAKK0NPTEVTQkVSRzoyOjIxNTUuODY4MjM1CitDRVJFUzoyOjM5NzUuNjkyODA5CitFRVJTVEVIT0VLOjI6MTMyOC4xNzQ1MzEKK0hFSURFTEJFUkc6Mjo3OTUuMjU1MjAyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU09VVEggQUZSSUNBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NPVVRIIEFGUklDQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTRkNTkzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NPVVRIIEFGUklDQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDQwNyBAQAorU09VVEggQUZSSUNBCToJMAk6CTM3MTEwMjkxCitFQVNURVJOIENBUEUJOgkxCToJNjAwNzc0MAorRUFTVEVSTiBUVkwJOgkxCToJNjAwNzc0MAorTkFUQUwJOgkxCToJNzk1NTUyNAorTk9SVEggV0VTVAk6CTEJOgkzMjg1Mzg0CitOT1JUSEVSTiBDQVBFCToJMQk6CTcyMDk3NAorTk9SVEhFUk4gVFZMCToJMQk6CTcyMDk3NAorT1JBTkdFCToJMQk6CTY0NTgzMzMKK09SQU5HRSBGUkVFIFNUQVRFCToJMQk6CTI1MzU5NDcKK1BXViBbR2F1dGVuZ10gCToJMQk6CTg4MzcxNzgKK1dFU1RFUk4gQ0FQRQk6CTEJOgkzNDE3Njc1CitNRVNTSU5BCToJMgk6CTE1NjczCitTT1VUUEFOU0JFUkcJOgkyCToJMTU2NzMKK1NPVVRQQU5TQkVSRwk6CTIJOgkxNTY3MworTk9SVEhFUk4gVFZMLTQJOgkyCToJMTU2NzMKK1BPVEdJRVRFUlNSVVMJOgkyCToJMTU2NzMKK1dBTFZJUyBCQVkJOgkyCToJMjY3MDIKK01BTEFNVUVMRQk6CTIJOgkxNTY3MworTk9SVEhFUk4gVFZMLTcJOgkyCToJMTU2NzMKK0JPQ0hVTQk6CTIJOgkxNTY3MworR0lZQU5JCToJMgk6CTE1NjczCitMRVRBQkEJOgkyCToJMTU2NzMKK01PS0VST05HCToJMgk6CTE1NjczCitXQVRFUkJFUkcJOgkyCToJMTU2NzMKK1BJRVRFUlNCVVJHCToJMgk6CTE1NjczCitTRVNIRUdPCToJMgk6CTE1NjczCitTRUtHT1NFU0UJOgkyCToJMTU2NzMKK01PS0VST05HCToJMgk6CTE1NjczCitCT0xPQkVEVQk6CTIJOgkxNTY3MworTk9SVEhFUk4gVFZMLTE4CToJMgk6CTE1NjczCitOT1JUSEVSTiBUVkwtMTkJOgkyCToJMTU2NzMKK05PUlRIRVJOIFRWTC0yMAk6CTIJOgkxNTY3MworVEhBQkFaSU1CSQk6CTIJOgkxNTY3MworTk9SVEhFUk4gVFZMLTIyCToJMgk6CTE1NjczCitUSEFCQU1PT1BPCToJMgk6CTE1NjczCitOT1JUSEVSTiBUVkwtMjQJOgkyCToJMTU2NzMKK1JJVEFWSQk6CTIJOgkxNTY3MworTk9SVEhFUk4gVFZMLTI2CToJMgk6CTE1NjczCitOQVBIVU5PCToJMgk6CTE1NjczCitOT1JUSEVSTiBUVkwtMjgJOgkyCToJMTU2NzMKK1BJTEdSSU0nUyBSRVNUCToJMgk6CTE1NjczCitOT1JUSEVSTiBUVkwtMzAJOgkyCToJMTU2NzMKK05PUlRIRVJOIFRWTC0zMQk6CTIJOgkxNTY3MworTk9SVEhFUk4gVFZMLTMyCToJMgk6CTE1NjczCitOT1JUSEVSTiBUVkwtMzMJOgkyCToJMTU2NzMKK05BUEhVTk8JOgkyCToJMTU2NzMKK1NFS0hVS0hVTkVMQU5ECToJMgk6CTE1NjczCitNT0tFUk9ORwk6CTIJOgkxNTY3MworTk9SVEhFUk4gVFZMLTM3CToJMgk6CTE1NjczCitORUJPCToJMgk6CTE1NjczCitOT1JUSEVSTiBUVkwtMzkJOgkyCToJMTU2NzMKK05PUlRIRVJOIFRWTC00MAk6CTIJOgkxNTY3MworV0FSTUJBRAk6CTIJOgkxNTY3MworTFlERU5CVVJHCToJMgk6CTE1NDA0NAorTk9SVEhFUk4gVFZMLTQyCToJMgk6CTE1NjczCitOT1JUSEVSTiBUVkwtNDMJOgkyCToJMTU2NzMKK05PUlRIRVJOIFRWTC00NAk6CTIJOgkxNTY3MworTUFSSUNPCToJMgk6CTE0Mjg0MgorTk9SVEggV0VTVC0yCToJMgk6CTE0Mjg0MgorTk9SVEggV0VTVC0zCToJMgk6CTE0Mjg0MgorR09SRE9OSUEJOgkyCToJMjY3MDIKK05PUlRIRVJOIFRWTC00NQk6CTIJOgkxNTY3MworR1JPQkxFUlNEQUwJOgkyCToJMTU0MDQ0CitOT1JUSEVSTiBUVkwtNDYJOgkyCToJMTU2NzMKK01PVVRTRQk6CTIJOgkxNTQwNDQKK01EVVRKQU5BCToJMgk6CTE1NDA0NAorV0lUUklWRVIJOgkyCToJMTU0MDQ0CitCUklUUwk6CTIJOgkxNDI4NDIKK01PVVRTRQk6CTIJOgkxNTQwNDQKK05PUlRIIFdFU1QtNQk6CTIJOgkxNDI4NDIKK0VBU1RFUk4gVFZMLTcJOgkyCToJMTU0MDQ0CitFQVNURVJOIFRWTC04CToJMgk6CTE1NDA0NAorRUFTVEVSTiBUVkwtOQk6CTIJOgkxNTQwNDQKK0JFTEZBU1QJOgkyCToJMTU0MDQ0CitFQVNURVJOIFRWTC0xMQk6CTIJOgkxNTQwNDQKK1JVU1RFTkJVUkcJOgkyCToJMTQyODQyCitNSURERUxTQlVSRwk6CTIJOgkxNTQwNDQKK0VBU1RFUk4gVFZMLTEzCToJMgk6CTE1NDA0NAorTU9VVFNFCToJMgk6CTE1NDA0NAorQ1VMTElOQU4JOgkyCToJMAorRUFTVEVSTiBUVkwtMTUJOgkyCToJMTU0MDQ0CitORUxTUFJVSVQJOgkyCToJMTU0MDQ0CitWUllCVVJHIDEvTUFGRUtJTkcgMQk6CTIJOgkxNDI4NDIKK1dPTkRFUkJPT00JOgkyCToJMAorRUFTVEVSTiBUVkwtMTcJOgkyCToJMTU0MDQ0CitCQVJCRVJUT04JOgkyCToJMTU0MDQ0CitTV0FSVFJVR0dFTgk6CTIJOgkxNDI4NDIKK1JVU1RFTkJVUkcJOgkyCToJMTQyODQyCitXSVRCQU5LCToJMgk6CTE1NDA0NAorRUFTVEVSTiBUVkwtMjAJOgkyCToJMTU0MDQ0CitFQVNURVJOIFRWTC0yMQk6CTIJOgkxNTQwNDQKK1dBVEVSVkFMIEJPVkVOCToJMgk6CTE1NDA0NAorQlJPTktIT1JTVFNQUlVJVAk6CTIJOgkwCitFRVJTVEVIT0VLCToJMgk6CTE1NDA0NAorTk9SVEggV0VTVC0xMAk6CTIJOgkxNDI4NDIKK0VFUlNURUhPRUsJOgkyCToJMTU0MDQ0CitCUklUUwk6CTIJOgkxNDI4NDIKK0tPU1RFUgk6CTIJOgkxNDI4NDIKK1BSRVRPUklBCToJMgk6CTAKK0NBUk9MSU5BCToJMgk6CTE1NDA0NAorS1JVR0VSU0RPUlAJOgkyCToJMAorTElDSFRFTkJVUkcJOgkyCToJMTQyODQyCitOT1JUSCBXRVNULTE0CToJMgk6CTE0Mjg0MgorRUVSU1RFSE9FSwk6CTIJOgkxNTQwNDQKK0tFTVBUT04gUEFSSwk6CTIJOgkwCitSQU5EQlVSRwk6CTIJOgkwCitERUxNQVMJOgkyCToJMTU0MDQ0CitWRU5URVJTRE9SUAk6CTIJOgkxNDI4NDIKK0JFTk9OSQk6CTIJOgkwCitST09ERSBQT1JUCToJMgk6CTAKK0NPTElHTlkJOgkyCToJMTQyODQyCitSQU5ERk9OVEVJTgk6CTIJOgkwCitCRVRIQUwJOgkyCToJMTU0MDQ0CitFUk1FTE8JOgkyCToJMTU0MDQ0CitKT0hBTk5FU0JVUkcJOgkyCToJMAorR0VSTUlTVE9OCToJMgk6CTAKK0tVUlVNQU4JOgkyCToJMjY3MDIKK1NQUklOR1MJOgkyCToJMAorSE9FVkVMRFJJRgk6CTIJOgkxNTQwNDQKK0JPS1NCVVJHCToJMgk6CTAKK0VFUlNURUhPRUsJOgkyCToJMTU0MDQ0CitCUkFLUEFOCToJMgk6CTAKK1dFU1RPTkFSSUEJOgkyCToJMAorT0JFUkhPTFpFUgk6CTIJOgkwCitBTEJFUlRPTgk6CTIJOgkwCitWRVJFRU5JR0lORwk6CTIJOgkwCitERUxBUkVZVklMTEUJOgkyCToJMTQyODQyCitOSUdFTAk6CTIJOgkwCitFRVJTVEVIT0VLCToJMgk6CTE1NDA0NAorVlJZQlVSRwk6CTIJOgkxNDI4NDIKK0hFSURFTEJFUkcJOgkyCToJMAorUE9UQ0hFRlNUUk9PTQk6CTIJOgkxNDI4NDIKK1ZBTkRFUkJJSkwgUC4JOgkyCToJMAorQkFMRk9VUgk6CTIJOgkxNTQwNDQKK0VFUlNURUhPRUsJOgkyCToJMTU0MDQ0CitLTEVSS1NET1JQCToJMgk6CTE0Mjg0MgorU1RBTkRFUlRPTgk6CTIJOgkxNTQwNDQKK1BJRVQgUkVUSUVGCToJMgk6CTE1NDA0NAorU0FTT0xTQlVSRwk6CTIJOgk1NjM1NAorUEFSWVMJOgkyCToJNTYzNTQKK0FNRVJTRk9SVAk6CTIJOgkxNTQwNDQKK1dBS0tFUlNUUk9PTQk6CTIJOgkxNTQwNDQKK1NDSFdFSVpFUiBSLgk6CTIJOgkxNDI4NDIKK0lOR1dBVlVNQQk6CTIJOgk3ODc2NworV09MTUFSQU5TU1RBRAk6CTIJOgkxNDI4NDIKK1ZSRURFRk9SVAk6CTIJOgk1NjM1NAorSEVJTEJST04JOgkyCToJNTYzNTQKK1ZJTEpPRU5TS1JPT04JOgkyCToJNTYzNTQKK0ZSQU5LRk9SVAk6CTIJOgk1NjM1NAorVlJFREUJOgkyCToJNTYzNTQKK1ZPTEtTUlVTVAk6CTIJOgkxNTQwNDQKK0tPUFBJRVMJOgkyCToJNTYzNTQKK1BPU1RNQVNCVVJHCToJMgk6CTI2NzAyCitCT1RIQVZJTExFCToJMgk6CTU2MzU0CitVQk9NQk8JOgkyCToJNzg3NjcKK05PUlRIIFdFU1QtMjMJOgkyCToJMTQyODQyCitVVFJFQ0hUCToJMgk6CTc4NzY3CitQQVVMUElFVEVSU0JVUkcJOgkyCToJNzg3NjcKK0tST09OU1RBRAk6CTIJOgk1NjM1NAorTkdPVFNIRQk6CTIJOgk3ODc2NworTkVXQ0FTVExFCToJMgk6CTc4NzY3CitWUllIRUlECToJMgk6CTc4NzY3CitSRUlUWgk6CTIJOgk1NjM1NAorV0VTU0VMUyBCUk9OCToJMgk6CTU2MzU0CitVQk9NQk8JOgkyCToJNzg3NjcKK0xJTkRMRVkJOgkyCToJNTYzNTQKK0hPT1BTVEFECToJMgk6CTU2MzU0CitIQVJUU1dBVEVSCToJMgk6CTI2NzAyCitOQVRBTC05CToJMgk6CTc4NzY3CitIQVJSSVNNSVRICToJMgk6CTU2MzU0CitOT05HT01BCToJMgk6CTc4NzY3CitPREVOREFBTFNSVVMJOgkyCToJNTYzNTQKK0JBUktMWSBXRVNUCToJMgk6CTI2NzAyCitOQVRBTC0xMQk6CTIJOgk3ODc2NworTkFUQUwtMTIJOgkyCToJNzg3NjcKK0hMQUJJU0EJOgkyCToJNzg3NjcKK0hFTk5FTk1BTgk6CTIJOgk1NjM1NAorQk8vSkFLL0tPRi9GQVUJOgkyCToJNTYzNTQKK05BVEFMLTE0CToJMgk6CTc4NzY3CitEQU5OSEFVU0VSCToJMgk6CTc4NzY3CitOQVRBTC0xNgk6CTIJOgk3ODc2NworQkVUSExFSEVNCToJMgk6CTU2MzU0CitOQVRBTC0xNwk6CTIJOgk3ODc2NworVkVOVEVSU0JVUkcJOgkyCToJNTYzNTQKK05BVEFMLTE4CToJMgk6CTc4NzY3CitXQVJSRU5UT04JOgkyCToJMjY3MDIKK05RVVRVCToJMgk6CTc4NzY3CitNQUhMQUJBVElOSQk6CTIJOgk3ODc2NworU0VORUtBTAk6CTIJOgk1NjM1NAorRFVOREVFCToJMgk6CTc4NzY3CitCVUxGT05URUlOCToJMgk6CTU2MzU0CitXSU5CVVJHCToJMgk6CTU2MzU0CitHTEVOQ09FCToJMgk6CTc4NzY3CitOQU1BS1dBTEFORAk6CTIJOgkyNjcwMgorVEhFVU5JU1NFTgk6CTIJOgk1NjM1NAorS0xJUFJJVkVSCToJMgk6CTc4NzY3CitOQVRBTC0yNAk6CTIJOgk3ODc2NworQkFCQU5BTkdPCToJMgk6CTc4NzY3CitOQVRBTC0yNgk6CTIJOgk3ODc2NworTkFUQUwtMjcJOgkyCToJNzg3NjcKK05BVEFMLTI4CToJMgk6CTc4NzY3CitOQVRBTC0yOQk6CTIJOgk3ODc2NworTkFUQUwtMzAJOgkyCToJNzg3NjcKK0xPV0VSIFVNRk9MT1pJCToJMgk6CTc4NzY3CitOQVRBTC0zMgk6CTIJOgk3ODc2NworSEVSQkVSVAk6CTIJOgkyNjcwMgorTkFUQUwtMzMJOgkyCToJNzg3NjcKK05BVEFMLTM0CToJMgk6CTc4NzY3CitGT1VSSUVTQlVSRwk6CTIJOgk1NjM1NAorQlJBTkRGT1JUCToJMgk6CTU2MzU0CitXSVRaSUVTSE9FSyAoUUFRV0EpCToJMgk6CTY0NTgzMzMKK01UT05KQU5FTkkJOgkyCToJNzg3NjcKK0hBWQk6CTIJOgkyNjcwMgorTktBTkRBTEEJOgkyCToJNzg3NjcKK05BVEFMLTM3CToJMgk6CTc4NzY3CitLRU5IQVJEVAk6CTIJOgkyNjcwMgorS0lNQkVSTEVZCToJMgk6CTI2NzAyCitCRVJHVklMTEUJOgkyCToJNzg3NjcKK05BVEFMLTM5CToJMgk6CTc4NzY3CitOQVRBTC00MAk6CTIJOgk3ODc2NworTUFSUVVBUkQJOgkyCToJNTYzNTQKK01TSU5HQQk6CTIJOgk3ODc2NworRklDS1NCVVJHCToJMgk6CTU2MzU0CitFU1RDT1VSVAk6CTIJOgk3ODc2NworV0VFTkVOCToJMgk6CTc4NzY3CitOQVRBTC00NAk6CTIJOgk3ODc2NworTkFUQUwtNDUJOgkyCToJNzg3NjcKK0NMT0NPTEFOCToJMgk6CTU2MzU0CitOQVRBTC00Ngk6CTIJOgk3ODc2NworS1JBTlNLT1AJOgkyCToJNzg3NjcKK05BVEFMLTQ4CToJMgk6CTc4NzY3CitOQVRBTC00OQk6CTIJOgk3ODc2NworRVhDRUxTSU9SCToJMgk6CTU2MzU0CitCTE9FTUZPTlRFSU4vQk9UUwk6CTIJOgk1NjM1NAorRVNIT1dFCToJMgk6CTc4NzY3CitOQVRBTC01MQk6CTIJOgk3ODc2NworTVRVTlpJTkkJOgkyCToJNzg3NjcKK05BVEFMLTUzCToJMgk6CTc4NzY3CitQUklFU0tBCToJMgk6CTI2NzAyCitOQVRBTC01NAk6CTIJOgk3ODc2NworTkFUQUwtNTUJOgkyCToJNzg3NjcKK1BFVFJVU0JVUkcJOgkyCToJNTYzNTQKK1VNVk9USQk6CTIJOgk3ODc2NworTkFUQUwtNTcJOgkyCToJNzg3NjcKK09SQU5HRSBGUkVFIFNUQVRFLTMzCToJMgk6CTU2MzU0CitNT09JUklWSUVSCToJMgk6CTc4NzY3CitMQURZQlJBTkQJOgkyCToJNTYzNTQKK01BUFVNVUxPCToJMgk6CTc4NzY3CitOQVRBTC02MAk6CTIJOgk3ODc2NworSE9QRVRPV04JOgkyCToJMjY3MDIKK05BVEFMLTYxCToJMgk6CTc4NzY3CitOQVRBTC02Mgk6CTIJOgk3ODc2NworTE9XRVIgVFVHVUxBCToJMgk6CTc4NzY3CitORVcgSEFOT1ZFUgk6CTIJOgk3ODc2NworTElPTiBSSVZFUgk6CTIJOgk3ODc2NworREVXVFMgRE9PUlAJOgkyCToJNTYzNTQKK01QRU5ETEUJOgkyCToJNzg3NjcKK05EV0VEV0UJOgkyCToJNzg3NjcKK1JFRERFU1NCVVJHCToJMgk6CTU2MzU0CitQSUVURVJNQVJJVFpCVVJHCToJMgk6CTc4NzY3CitOQVRBTC02OQk6CTIJOgk3ODc2NworRURFTkJVUkcJOgkyCToJNTYzNTQKK1VOREVSQkVSRwk6CTIJOgk3ODc2NworV0VQRU5FUgk6CTIJOgk1NjM1NAorSkFHRVJTRk9OVEVJTgk6CTIJOgk1NjM1NAorSU5BTkRBCToJMgk6CTc4NzY3CitOQVRBTC03Mgk6CTIJOgk3ODc2NworTkFUQUwtNzMJOgkyCToJNzg3NjcKK05BVEFMLTc0CToJMgk6CTc4NzY3CitNT1VOVCBDVVJSSUUJOgkyCToJNzg3NjcKK05BVEFMLTc2CToJMgk6CTc4NzY3CitDQU1QRVIgRE9XTgk6CTIJOgk3ODc2NworQ0FMVklOSUEJOgkyCToJMjY3MDIKK05BVEFMLTc4CToJMgk6CTc4NzY3CitQT0xFTEEJOgkyCToJNzg3NjcKK05BVEFMLTgwCToJMgk6CTc4NzY3CitQSU5FVE9XTgk6CTIJOgk3ODc2NworUklDSE1PTkQJOgkyCToJNzg3NjcKK0RVUkJBTi9DSEFUUy4JOgkyCToJNzg3NjcKK1BISUxJUFNUT1dOCToJMgk6CTI2NzAyCitEVVJCQU4vQ0hBVFMuCToJMgk6CTc4NzY3CitUUk9NUFNCVVJHCToJMgk6CTU2MzU0CitOQVRBTC04NQk6CTIJOgk3ODc2NworTkFUQUwtODYJOgkyCToJNzg3NjcKK0VNQlVNQlVMVQk6CTIJOgk3ODc2NworTkFUQUwtODgJOgkyCToJNzg3NjcKK1NNSVRIRklFTEQJOgkyCToJNTYzNTQKK0lYT1BPCToJMgk6CTc4NzY3CitCUklUU1RPV04JOgkyCToJMjY3MDIKK1BISUxJUFBPTElTCToJMgk6CTU2MzU0CitDQVJOQVJWT04JOgkyCToJMjY3MDIKK1pBU1RST04JOgkyCToJNTYzNTQKK05BVEFMLTkwCToJMgk6CTc4NzY3CitFQVNURVJOIENBUEUtMQk6CTIJOgkxMjAxNTQKK05BVEFMLTkxCToJMgk6CTc4NzY3CitST1VYVklMTEUJOgkyCToJNTYzNTQKK1dJTExJU1RPTgk6CTIJOgkyNjcwMgorVlVMQU0uL0VNWlVNQkUJOgkyCToJNzg3NjcKK05BVEFMLTkzCToJMgk6CTc4NzY3CitCRVRIVUxJRQk6CTIJOgk1NjM1NAorVU1aSU5UTwk6CTIJOgk3ODc2NworQ09MRVNCRVJHCToJMgk6CTI2NzAyCitNT1VOVCBDVVJSSUUJOgkyCToJMTIwMTU0CitERSBBQVIJOgkyCToJMjY3MDIKK0VBU1RFUk4gQ0FQRS0zCToJMgk6CTEyMDE1NAorVkFOSFlOU0RPUlAJOgkyCToJODEzNzMKK1ZVTEFNLi9FTVpVTUJFCToJMgk6CTc4NzY3CitWSUNUT1JJQSBXRVNUCToJMgk6CTI2NzAyCitWVUxBTS4vRU1aVU1CRQk6CTIJOgk3ODc2NworQUxCRVJUCToJMgk6CTEyMDE1NAorQUxGUkVECToJMgk6CTc4NzY3CitWRVRFUlNUQUQJOgkyCToJMTIwMTU0CitOQVRBTC05OAk6CTIJOgk3ODc2NworTEFEWSBHUkVZCToJMgk6CTEyMDE1NAorUE9SVCBTSEVQU1RPTkUJOgkyCToJNzg3NjcKK0FMSVdBTCBOT1JUSAk6CTIJOgkxMjAxNTQKK0VaSU5HT0xXRU5JCToJMgk6CTc4NzY3CitCQVJLTFkgRUFTVAk6CTIJOgkxMjAxNTQKK01BQ0xFQVIJOgkyCToJMTIwMTU0CitIQU5PVkVSCToJMgk6CTI2NzAyCitOQVRBTC0xMDEJOgkyCToJNzg3NjcKK1JJQ0hNT05ECToJMgk6CTI2NzAyCitXT0RFSE9VU0UJOgkyCToJMTIwMTU0CitTVEVZTlNCVVJHCToJMgk6CTEyMDE1NAorTk9VUE9PUlQJOgkyCToJMjY3MDIKK0VMTElPVAk6CTIJOgkxMjAxNTQKK1ZSRURFTkRBTAk6CTIJOgk4MTM3MworRlJBU0VSQlVSRwk6CTIJOgkyNjcwMgorTU9MVEVOTwk6CTIJOgkxMjAxNTQKK01JRERMRUJVUkcJOgkyCToJMTIwMTU0CitJTkRXRQk6CTIJOgkxMjAxNTQKK0hPRk1FWVIJOgkyCToJMTIwMTU0CitTVEVSS1NUUk9PTQk6CTIJOgkxMjAxNTQKK0JFQVVGT1JUIFdFU1QJOgkyCToJODEzNzMKK1RBUktBU1RBRAk6CTIJOgkxMjAxNTQKK01VUlJBWVNCVVJHCToJMgk6CTgxMzczCitWUkVERU5EQUwJOgkyCToJODEzNzMKK0dSQUFGRi1SRUlORVQJOgkyCToJMTIwMTU0CitRVUVFTlNUT1dOCToJMgk6CTEyMDE1NAorQ1JBRE9DSwk6CTIJOgkxMjAxNTQKK1NVVEhFUkxBTkQJOgkyCToJMjY3MDIKK0NMQU5XSUxMSUFOCToJMgk6CTgxMzczCitWSUNUT1JJQSBFQVNUCToJMgk6CTEyMDE1NAorQ0hBVENBUlQJOgkyCToJMTIwMTU0CitBQkVSREVFTgk6CTIJOgkxMjAxNTQKK0NFUkVTCToJMgk6CTgxMzczCitRVUVFTlNUT1dOCToJMgk6CTEyMDE1NAorU1VUVEVSSEVJTQk6CTIJOgkxMjAxNTQKK0JFREZPUkQJOgkyCToJMTIwMTU0CitQRUFSU1RPTgk6CTIJOgkxMjAxNTQKK1BJS0VUQkVSRwk6CTIJOgk4MTM3MworU09NRVJTRVQgRUFTVAk6CTIJOgkxMjAxNTQKK1FVRUVOU1RPV04JOgkyCToJMTIwMTU0CitBREVMQUlERQk6CTIJOgkxMjAxNTQKK0ZPUlQgQkVBVUZPUlQJOgkyCToJMTIwMTU0CitLT01HQQk6CTIJOgkxMjAxNTQKK1NUT0NIRU5TVFJPTQk6CTIJOgkxMjAxNTQKK0xBSU5HU0JVUkcJOgkyCToJODEzNzMKK1BSSU5DRSBBTEJFUlQJOgkyCToJODEzNzMKK0tJTkcgV0lMTElBTSBUT1dOCToJMgk6CTEyMDE1NAorTURBTlRTQU5FIDQJOgkyCToJMTIwMTU0CitKQU5TRU5WSUxMRQk6CTIJOgkxMjAxNTQKK1ZSRURFTkJVUkcJOgkyCToJODEzNzMKK0VBU1QgTE9ORE9OCToJMgk6CTEyMDE1NAorV0lMTE9XTU9SRQk6CTIJOgkxMjAxNTQKK01EQU5UU0FORQk6CTIJOgkxMjAxNTQKK0hPUEVGSUVMRAk6CTIJOgk4MTM3MworTUFMTUVTQlVSWQk6CTIJOgk4MTM3MworQUxCQU5ZCToJMgk6CTEyMDE1NAorU1RFWUxFUlZJTExFCToJMgk6CTEyMDE1NAorVFVMQkFHSAk6CTIJOgk4MTM3MworV09SQ0VTVEVSCToJMgk6CTgxMzczCitVSVRFTkhBR0UJOgkyCToJMTIwMTU0CitLSVJLV09PRAk6CTIJOgkxMjAxNTQKK0JBVEhVUlNUCToJMgk6CTEyMDE1NAorQUxFWEFORFJJQQk6CTIJOgkxMjAxNTQKK09VRFRTSE9PUk4JOgkyCToJODEzNzMKK0NBTElUWkRPUlAJOgkyCToJODEzNzMKK1dFTExJTkdUT04JOgkyCToJODEzNzMKK1VOSU9OREFMRQk6CTIJOgk4MTM3MworTEFESVNNSVRICToJMgk6CTgxMzczCitNQUxNRVNCVVJZCToJMgk6CTgxMzczCitNT05UQUdVCToJMgk6CTgxMzczCitQQUFSTAk6CTIJOgk4MTM3MworSk9VQkVSVElOQQk6CTIJOgkxMjAxNTQKK1BPUlQgRUxJU0FCRVRICToJMgk6CTEyMDE1NAorSEFOS0VZCToJMgk6CTEyMDE1NAorR0VPUkdFCToJMgk6CTgxMzczCitTV0VMTEVOREFNCToJMgk6CTgxMzczCitST0JFUlRTT04JOgkyCToJODEzNzMKK0hVTUFOU0RPUlAJOgkyCToJMTIwMTU0CitCRUxMRVZJTExFCToJMgk6CTgxMzczCitDQVBFCToJMgk6CTgxMzczCitLTllTTkEJOgkyCToJODEzNzMKK1NURUxMRU5CT1NDSAk6CTIJOgk4MTM3MworQ0FQRQk6CTIJOgk4MTM3MworUklWRVJTREFMRQk6CTIJOgk4MTM3MworTU9TU0VMIEJBQUkJOgkyCToJODEzNzMKK0NBTEVET04JOgkyCToJODEzNzMKK0dPT0RXT09ECToJMgk6CTgxMzczCitLVUlMU1JJVkVSCToJMgk6CTgxMzczCitIRUlERUxCRVJHCToJMgk6CTgxMzczCitXSU5CRVJHCToJMgk6CTgxMzczCitTSU1PTlNUT1dOCToJMgk6CTgxMzczCitTVFJBTkQJOgkyCToJODEzNzMKK0JSRURBU0RPUlAJOgkyCToJODEzNzMKK0hFUk1BTlVTCToJMgk6CTgxMzczClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NPVVRIIEtPUkVBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NPVVRIIEtPUkVBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NjcwOTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU09VVEggS09SRUFfQVJFQS50eHQKQEAgLTAsMCArMSwxNyBAQAorU291dGggS29yZWEJOgkwCToJOTg0ODAKK0J1c2FuIFtQdXNhbl0JOgkxCToJNzYyLjkyCitDaHVuZ2Nob25nYnVrLWRvIAk6CTEJOgk3NDMxLjYwCitDaHVuZ2Nob25nbmFtLWRvIAk6CTEJOgk4NTk3Ljk0CitEYWVndSBbVGFlZ3VdCToJMQk6CTg4NS43CitEYWVqZW9uIFtUYWVqb25dCToJMQk6CTUzOS43CitLYW5nLXdvbi1kbyAJOgkxCToJMTY4NzMuMzgKK0t3YW5nanUJOgkxCToJNTAxLjQ0CitLeW9uZ3NhbmdidWstZG8gCToJMQk6CTE5MDI0LjgxCitLeW9uZ3NhbmduYW0tZG8gCToJMQk6CTEwNTE3Ljc0CitLeW9uZ2dpLWRvIAk6CTEJOgkxMDE4MS4yOQorSW5jaG9uCToJMQk6CTk4Ni40NQorQ2hlanUtZG8gCToJMQk6CTE4NDcuMTkKK2Nob2xsYWJ1ay1kbyAJOgkxCToJODA1MC45NAorY2hvbGxhbmFtLWRvIAk6CTEJOgkxMjAzNi45NQorU2VvdWwJOgkxCToJNjA1LjUyCitVbHNhbgk6CTEJOgkxMDU2LjM4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NPVVRIIEtPUkVBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NPVVRIIEtPUkVBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMWQyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU09VVEggS09SRUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxNyBAQAorU291dGggS29yZWEJOgkwCToJNDg4NDY4MjMKK0J1c2FuIFtQdXNhbl0JOgkxCToJMzY4NDE1MworQ2h1bmdjaG9uZ2J1ay1kbyAJOgkxCToJMTUwMDYxMAorQ2h1bmdjaG9uZ25hbS1kbyAJOgkxCToJMTk3MjU1MworRGFlZ3UgW1RhZWd1XQk6CTEJOgkyNTM5NzM4CitEYWVqZW9uIFtUYWVqb25dCToJMQk6CTE0NTA3NTAKK0thbmctd29uLWRvIAk6CTEJOgkxNTI4NjQwCitLd2FuZ2p1CToJMQk6CTE0MDY5MTUKK0t5b25nc2FuZ2J1ay1kbyAJOgkxCToJMjcxODYxMworS3lvbmdzYW5nbmFtLWRvIAk6CTEJOgkzMTY4NzM0CitLeW9uZ2dpLWRvIAk6CTEJOgkxMDYyODg0MgorSW5jaG9uCToJMQk6CTI2MTA3MTUKK0NoZWp1LWRvIAk6CTEJOgk1NTcyMzUKK2Nob2xsYWJ1ay1kbyAJOgkxCToJMTkxNTY3NAorY2hvbGxhbmFtLWRvIAk6CTEJOgkxOTk0MDExCitTZW91bAk6CTEJOgkxMDI4Nzg0NworVWxzYW4JOgkxCToJMTA4Nzk1OApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TT1VUSEFGUklDQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TT1VUSEFGUklDQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjNkYmNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NPVVRIQUZSSUNBX0FSRUEudHh0CkBAIC0wLDAgKzEsNDA3IEBACitTT1VUSCBBRlJJQ0E6MDoxMjE5OTEyCitPUkFOR0UgRlJFRSBTVEFURToxOjUwMjE2LjM5OAorV0VTVEVSTiBDQVBFOjE6NTIwNjEuNTMxCitPUkFOR0U6MTo2OTkwLjk1NQorTk9SVEhFUk4gQ0FQRToxOjE0MDUyMS41OTQKK0VBU1RFUk4gVFZMOjE6Njc4ODYuNjQ4CitQV1Y6MToxMjcyODMKK05PUlRIRVJOIFRWTDoxOjE0MDUyMS41OTQKK0VBU1RFUk4gQ0FQRToxOjY3ODg2LjY0OAorTk9SVEggV0VTVDoxOjQzODQ4Ljg3OQorTkFUQUw6MTozNTY3Mi4wMzkKK0xPV0VSIFVNRk9MT1pJOjI6NDQ5LjQ2MjU4OAorTkdPVFNIRToyOjEyOTAuOTI1ODQyCitOT1JUSEVSTiBUVkwtMjY6MjoyMzYuNTk2OTYyCitLT1BQSUVTOjI6NjEzLjU2NTg3NgorQkFSS0xZIFdFU1Q6MjoyNTUzLjAzNDcxNAorTkFUQUwtMTQ6MjoxMzIuNjA1MjYyCitTVEVMTEVOQk9TQ0g6MjoxOTIuNTA5OTIzCitEVVJCQU4vQ0hBVFMuOjI6MTAxLjA4NjU5NgorTkFUQUwtNTc6MjozNjQuOTk1OTU3CitDQVJPTElOQToyOjM3ODYuNjgyODU1CitOQVRBTC0xNjoyOjYwLjI3NzU2MQorTktBTkRBTEE6Mjo2NjYuMjQxNDg0CitLVUlMU1JJVkVSOjI6NDYuOTMxODMwCitOT1JUSCBXRVNULTIzOjI6MTA1Ny44Mzc2OTQKK05BVEFMLTU0OjI6MzUuMjEzMzgwCitTT1VUUEFOU0JFUkc6Mjo0NDcxLjYwMjU4NAorRlJBU0VSQlVSRzoyOjQ1NzEuODY4NTkzCitIVU1BTlNET1JQOjI6MTU0Ny44MTU2NDIKK0hFUkJFUlQ6MjoyODcwLjMxNTAwNworQ0FMRURPTjoyOjE1ODIuODIxOTg0CitFQVNURVJOIENBUEUtMToyOjE1NTUzLjkxODIxNgorUE9UR0lFVEVSU1JVUzoyOjE1MDczLjI4MDkyNAorTUFMQU1VRUxFOjI6MTQzOS4xOTEyNzEKK0VTVENPVVJUOjI6MTAwMy4yMDI3MzYKK1FVRUVOU1RPV046Mjo0Mi41OTc2MzkKK1BBVUxQSUVURVJTQlVSRzoyOjU3MC4zMTIyMTYKK01PVVRTRToyOjI4Ni42MjIxNDUKK0hPRVZFTERSSUY6MjoxMzk1Ljg0ODI2MgorQ0FMVklOSUE6MjoxNDcwNi42Mzg2ODkKK0xZREVOQlVSRzoyOjQ1MDkuOTQ0MDExCitEVVJCQU4vQ0hBVFMuOjI6MTAuMTE5MjkyCitLVVJVTUFOOjI6NjYyMS42MjE3MjkKK1dFUEVORVI6Mjo3MzAuNzM5NzM0CitPQkVSSE9MWkVSOjI6NC4wODU1MzgKK1RBUktBU1RBRDoyOjEyNzUuMzUxMDA1CitOQVRBTC04MDoyOjQ3LjMyNzQ1MgorTVRPTkpBTkVOSToyOjMzMy44ODMxMjgKK05PUlRIRVJOIFRWTC0yODoyOjMyNi4xMDM3NjYKK1ZSWUJVUkc6Mjo0MTkyLjk2NDIwNQorRUVSU1RFSE9FSzoyOjUzLjYyNDEwOQorRk9SVCBCRUFVRk9SVDoyOjUzMi4wOTE2ODMKK0JFUkdWSUxMRToyOjk5Ni4yMzIzMzMKK1dBUlJFTlRPTjoyOjYzMy4zOTEzNDkKK0dST0JMRVJTREFMOjI6MjI1NC41MzY5NzcKK05BVEFMLTQ0OjI6MzQuMzc3MTc3CitUSEVVTklTU0VOOjI6NzMwLjkzNDExNAorQkVERk9SRDoyOjExMDguNzA1ODk4CitOQVRBTC01MToyOjYuNTI0MTQ2CitOSUdFTDoyOjYuNzY0OTI3CitNQUhMQUJBVElOSToyOjU1Mi4yNjc3OTIKK1JPT0RFIFBPUlQ6MjoxLjg4NDI5MAorRUFTVEVSTiBUVkwtMjE6Mjo3MC4yMTkzOTIKK1NURVlOU0JVUkc6MjoxMDk0LjA4NDQwMworRURFTkJVUkc6Mjo4MDAuNTE0MDMyCitMQURJU01JVEg6MjoxNDg3LjMzNjgzMAorSU5BTkRBOjI6MTM0LjM4NzExNQorWkFTVFJPTjoyOjc1MC4yMjY4OTgKK0JSSVRTVE9XTjoyOjI4NDMuMTQ5MTc5CitWRVJFRU5JR0lORzoyOjEyLjA4MTE5MworVEhBQkFNT09QTzoyOjI5MDkuNzY0OTM5CitMQURZQlJBTkQ6Mjo4NTguNjI0MjQyCitXSUxMSVNUT046Mjo1MTU0Ljg4Mjk4MQorTkVCTzoyOjMyOTQuNDQ0Mjc3CitOT1JUSEVSTiBUVkwtNDM6Mjo4NTUuMzQzNDI0CitRVUVFTlNUT1dOOjI6MzQuODIzOTIyCitMT1dFUiBUVUdVTEE6MjozNzcuODQ2NjkyCitCQVJCRVJUT046MjozMTMyLjE0ODA4MAorTkFUQUwtNTM6MjoxODAuNjA0ODcyCitNQVJJQ086MjoyMzE0LjgxNjcxNAorTkFUQUwtNDk6MjoyMC42MDEyMzcKK0xJT04gUklWRVI6Mjo2MTEuMTYyNzQ5CitHTEVOQ09FOjI6MjQ4LjYzOTA1NworTUlERExFQlVSRzoyOjIyOTkuNzMwODc0CitQT1RDSEVGU1RST09NOjI6MTI5Ny4yODQ5MzkKK1ZVTEFNLi9FTVpVTUJFOjI6OTcuNzE1MzUyCitIT09QU1RBRDoyOjEzNTUuMDAxNDMzCitWVUxBTS4vRU1aVU1CRToyOjk0LjI4NDM5NQorU0VLR09TRVNFOjI6MzY0Ljg3MjM3NAorUklWRVJTREFMRToyOjE2MjEuOTk4NTEwCitXT0xNQVJBTlNTVEFEOjI6MTkxNy42ODk1MzYKK0FMRlJFRDoyOjMwNC40MTMxNjkKK05BVEFMLTYxOjI6MTYxLjk0MjA3NQorU1RPQ0hFTlNUUk9NOjI6ODkuMzY0NDQ3CitSSVRBVkk6MjozNDIuODc2MTI1CitOQVRBTC02MDoyOjQ5LjUyOTUwMAorRUxMSU9UOjI6ODQyLjAwMzkxMworV09OREVSQk9PTToyOjEwLjM4MTUxNgorTUVTU0lOQToyOjU1MTYuMDU3Nzc5CitXQVRFUlZBTCBCT1ZFTjoyOjk1OS40MzU2MDMKK05PUlRIIFdFU1QtMTQ6Mjo2MTgzLjUxNjkzMgorTkFUQUwtMjk6MjoxMTQuMDYwMTQyCitGT1VSSUVTQlVSRzoyOjQ2Mi4yNTE5MzMKK0JFTExFVklMTEU6MjoxNzIuNTIyMDY4CitNT1VUU0U6MjoyOTIuNzk2NzcyCitIRUlERUxCRVJHOjI6OC4zNzgyMTgKK1NVVEhFUkxBTkQ6MjozNjAwLjUxODYyNgorUEhJTElQUE9MSVM6MjoxMjU4Ljc0NDcxNgorRUFTVCBMT05ET046Mjo0ODguNDQ5OTYxCitNT1VOVCBDVVJSSUU6MjoxNzgyLjMzNjQ0NQorSEVJTEJST046MjoxNDk0LjY3NDM2OQorV09ERUhPVVNFOjI6MTIxNi4wODk1OTQKK05BVEFMLTg2OjI6MTUuNDg3MjcwCitOT1JUSEVSTiBUVkwtMTg6Mjo3MC4xMTg3MzQKK05BVEFMLTQ2OjI6MjU2Ljc2MzQyNworTElORExFWToyOjExMTMuMjA4NjAxCitSRUlUWjoyOjEwNzQuNDA1OTYyCitDQVBFOjI6NjIuODczNDA2CitTV0FSVFJVR0dFTjoyOjYxOS41ODczMjAKK05PUlRIRVJOIFRWTC0yMjoyOjc3OS4xODA5OTEKK0hBTktFWToyOjY3OS45MTAyODUKK0VBU1RFUk4gVFZMLTg6Mjo4NDIuMTQwODg1CitOT1JUSEVSTiBUVkwtMzI6MjozMTMuNjg4ODMxCitOQVRBTC00ODoyOjIzLjk5MjgyNAorQkVUSExFSEVNOjI6MTQyMi4xMzQ4OTkKK0hMQUJJU0E6MjoxMDE5LjkzMTIxMgorTURBTlRTQU5FOjI6MjkuODkzODAyCitOQVRBTC05MzoyOjM3OS4zMDY5NTAKK0VBU1RFUk4gQ0FQRS0zOjI6Njc3LjczODA3NAorRUFTVEVSTiBUVkwtMTc6Mjo5MjUuNTk0OTU5CitKT1VCRVJUSU5BOjI6NTM2LjI2Mzc3NAorSEFOT1ZFUjoyOjE0MzUuNjc2MTg1CitOQVRBTC03MzoyOjE0MC43OTk2NDMKK01BTE1FU0JVUlk6MjoxLjMxODUyMQorTkFUQUwtNDU6MjoxOC4wMDcwMDUKK1JBTkRGT05URUlOOjI6Ni4zODkyNjcKK1BFQVJTVE9OOjI6MTA0OS4zNTAxODgKK0xBSU5HU0JVUkc6MjozNTIzLjY0Mzg4MgorTEFEWSBHUkVZOjI6NTgzLjUwNzM5MAorV0VTU0VMUyBCUk9OOjI6NjYwLjAxODE2MgorTkFUQUwtMjg6MjoxMS4zNDYxOTEKK01PS0VST05HOjI6NzAxLjgxODI1NAorQlJJVFM6Mjo3OTMuMTYwODU3CitTTUlUSEZJRUxEOjI6MTEzMC41Mjk4NzEKK05BVEFMLTk6MjoyNC43NDMxNzgKK0tJUktXT09EOjI6Njk4LjcxNDQwMQorU0NIV0VJWkVSIFIuOjI6MjkyNC43MzM1MzIKK0VSTUVMTzoyOjY5NjYuODk4ODQwCitXSVRCQU5LOjI6MjYzOS4xMTMwMTkKK0pBTlNFTlZJTExFOjI6MTgzNy4zMjIyMjYKK05PUlRIRVJOIFRWTC0zMDoyOjM5LjA2NzcxNQorS0lORyBXSUxMSUFNIFRPV046MjoyNjIuOTQ2OTQzCitGUkFOS0ZPUlQ6MjoxMTkxLjA2NDM4MgorVkVOVEVSU0JVUkc6Mjo0OTYuMzAxMDQ4CitFQVNURVJOIFRWTC03OjI6Njg3LjQyNjMzOQorU1RFWUxFUlZJTExFOjI6MTQ3Ny4xNzEwMDkKK1NVVFRFUkhFSU06Mjo2NTEuOTc4NzMyCitQSUVURVJTQlVSRzoyOjUzNDguODExNzk4CitOT1JUSCBXRVNULTEwOjI6MTk2NC44MTQ0MjEKK0VNQlVNQlVMVToyOjI2MS45OTM5MzMKK05BVEFMLTc4OjI6NDkuMjM4MTUwCitCQUJBTkFOR086MjozMTguMTYzNDk1CitXRUVORU46MjozNjIuMzkyNDg1CitORFdFRFdFOjI6MjYzLjkyNzIyMAorS0VOSEFSRFQ6MjoxNDA5MC44MzU4ODIKK0VFUlNURUhPRUs6MjozMy44Njg4NDkKK1FVRUVOU1RPV046Mjo2ODkuNTQyNTQ3CitNT0tFUk9ORzoyOjc0MS45MTE5MjkKK0dJWUFOSToyOjM3NDcuOTAwOTkzCitNU0lOR0E6Mjo3NTAuOTQ1MTU5CitQSUVURVJNQVJJVFpCVVJHOjI6MjQzLjE0ODM2NworVlJFREVOREFMOjI6MS4wMDAwMDAKK1ZFTlRFUlNET1JQOjI6MTM1Mi44MzQ5NjkKK0VBU1RFUk4gVFZMLTEzOjI6OTQxLjg2MTg0MAorTk9SVEhFUk4gVFZMLTc6Mjo5NTcuMzg5MDc2CitNT1VOVCBDVVJSSUU6MjoxMTIuODYxOTIyCitVQk9NQk86Mjo4NTcuMjgyNzY1CitTVEFOREVSVE9OOjI6NDYwNS45NjQ1MTYKK05BVEFMLTQwOjI6MTQ3LjMzNjcwNAorSE9GTUVZUjoyOjk1My43NDk5MDQKK0FMRVhBTkRSSUE6Mjo5NjMuNzEzNTQ1CitNQUxNRVNCVVJZOjI6MTc5NC40NzIyODYKK1BPU1RNQVNCVVJHOjI6NzE4NS43MDcxMzcKK1JBTkRCVVJHOjI6Mi42ODc2OTAKK0JSSVRTOjI6MTUuMDMxMzg4CitVTVZPVEk6Mjo2NTMuOTU4MzMwCitBTUVSU0ZPUlQ6MjoxODAxLjgxODgzNgorQkVMRkFTVDoyOjI4NjAuMTA2MzIwCitDQUxJVFpET1JQOjI6NDQwLjk5NDUxNQorTkFQSFVOTzoyOjU4MS42NzAwMzgKK1ZJQ1RPUklBIEVBU1Q6MjozMjExLjQ4NDY1MQorTk9SVEggV0VTVC0zOjI6Mjg3NS40NDgwNTYKK1RST01QU0JVUkc6Mjo3ODIuMDgyNzYwCitSVVNURU5CVVJHOjI6MTIwLjAyMjE3MQorQkVBVUZPUlQgV0VTVDoyOjY2ODEuNDA1NjI1CitBQkVSREVFTjoyOjI4MDYuOTEyMzI3CitORUxTUFJVSVQ6MjoyMDY1LjA0MjU0OAorU1dFTExFTkRBTToyOjE2MzQuNjg1MjMwCitWT0xLU1JVU1Q6MjoxNzIzLjkzNTgyNAorUklDSE1PTkQ6MjozOTUuODgzMjQ2CitBTElXQUwgTk9SVEg6Mjo3OTYuOTYzMjc2CitTQVNPTFNCVVJHOjI6MzgyLjIyMjgxNAorV0lOQkVSRzoyOjE1Mi4yOTczNDIKK0NVTExJTkFOOjI6MTEuMTkwMDE0CitCUkVEQVNET1JQOjI6MTc5MC4zNDA1NTQKK0JBUktMWSBFQVNUOjI6MTU0MS44MDA5NDQKK0dPT0RXT09EOjI6MTYuMzgxODIwCitQSUxHUklNJ1MgUkVTVDoyOjEzMDE5Ljk0NDIwMgorTkFUQUwtMzA6MjozMTUuNjc4ODY5CitOQVRBTC0xMToyOjEwOS44NTE0MDIKK1BISUxJUFNUT1dOOjI6MjIyNy44MzY1NjEKK0JSQU5ERk9SVDoyOjE0ODAuNjUwODk5CitPREVOREFBTFNSVVM6Mjo1NTcuMjUwMDM1CitWRVRFUlNUQUQ6Mjo4MTkuMzU0Njc1CitEQU5OSEFVU0VSOjI6MjQxLjU2MDAzMAorS1JVR0VSU0RPUlA6MjoxMC4zNDQxMTgKK05PUlRIRVJOIFRWTC00NToyOjExMi4xMTE2OTYKK1NURVJLU1RST09NOjI6Njg0Ljk3MzU0NQorUFJJRVNLQToyOjU0ODIuODE0MjQwCitQUkVUT1JJQToyOjkuOTM0NzkwCitOQVRBTC03MjoyOjQ1LjQyOTM3NgorQlJBS1BBTjoyOjEuOTMzMjA1CitOQVBIVU5POjI6MjkxLjUxNTc3MAorT1JBTkdFIEZSRUUgU1RBVEUtMzM6Mjo0OTguMjM3NDY5CitOQVRBTC01NToyOjE2MC40OTcwNjcKK05PUlRIRVJOIFRWTC00MjoyOjQ4MC4zMzE2MzAKK05FVyBIQU5PVkVSOjI6NDQ1LjIzOTUzNQorQUxCRVJUT046MjoxLjAwMDAwMAorUElORVRPV046MjoxMzEuODA4Nzk4CitXQVJNQkFEOjI6NDgxOS44ODQ2NjUKK1VOREVSQkVSRzoyOjcxMi43MTUyNTEKK05BVEFMLTYyOjI6NzIuODIxMDYzCitNVVJSQVlTQlVSRzoyOjIxMzAuNzM1ODc4CitOQVRBTC0zMjoyOjMuODE2ODY0CitIQVk6Mjo0OTI0LjU0NTkxMgorVVRSRUNIVDoyOjE0ODcuODEwMzcwCitDT0xJR05ZOjI6NTg5LjgyNzA1MAorTVRVTlpJTkk6MjoxNTAuOTYyMTM3CitKQUdFUlNGT05URUlOOjI6NDgxLjg1NTkzNAorTkFUQUwtOTE6Mjo4NTYuMDMzMjE5CitOT1JUSCBXRVNULTI6Mjo5NzUuMDI5MjQ1CitLUk9PTlNUQUQ6MjoxNjA1LjEyMjM3MAorTkFUQUwtMzc6Mjo2My4wODg2MTAKK0lOR1dBVlVNQToyOjE1MzcuNDUyNDIwCitXQUxWSVMgQkFZOjI6NDEyLjkzMTQ2NworTkFUQUwtOTA6MjoxMDUuNTQ1NTU0CitHRVJNSVNUT046MjoxLjE5MTQ0MworVU5JT05EQUxFOjI6MTI0Ny41NzY0ODAKK1VNWklOVE86MjoyNzcuOTQyNzU2CitBREVMQUlERToyOjYxMC4xNDgzOTkKK1dFU1RPTkFSSUE6Mjo0LjUxMzM2MQorU1BSSU5HUzoyOjIuMTU3MDE5CitEVU5ERUU6Mjo3MDYuMzI3NTUzCitMRVRBQkE6MjoxMTM3Ni4xNzQzMjIKK1NPTUVSU0VUIEVBU1Q6MjoyMzA4LjUxODQ0MQorV0lUWklFU0hPRUsgKFFBUVdBKToyOjY5OTAuOTU1MDAwCitLTElQUklWRVI6MjoxMTgwLjE5MjkxNworTUFQVU1VTE86MjozMDAuMTMzMjI3CitTVFJBTkQ6Mjo0OC44MzA3MjYKK01PT0lSSVZJRVI6Mjo1NjIuOTk2NDAyCitNRFVUSkFOQToyOjY5OS41NzAzOTMKK05PUlRIRVJOIFRWTC0zNzoyOjg3LjAzMjk2MgorQkVOT05JOjI6Mi4zODg3ODgKK0VTSE9XRToyOjQwOC4wNDQzMjkKK0hPUEVUT1dOOjI6MzI0NC43NDA1MjMKK0JPS1NCVVJHOjI6MS40ODM4MjgKK0tPTUdBOjI6NTg1LjE0OTExMgorTk9SVEhFUk4gVFZMLTIwOjI6MjgwLjg1Mzc3MAorTk9SVEhFUk4gVFZMLTQ0OjI6NDgxLjI5NTYzOQorQUxCRVJUOjI6MTU5My4xMDMxODgKK1dPUkNFU1RFUjoyOjE2MzIuMTU2NjIyCitNT0tFUk9ORzoyOjI4MTkuMjMzMTY2CitOQVRBTC05ODoyOjIwLjQ5MDMzMQorTU9MVEVOTzoyOjc4Mi40NjA1NzkKK05PUlRIRVJOIFRWTC00OjI6NjYwNy42NTg1MDcKK05PUlRIRVJOIFRWTC00NjoyOjIwMC40MTA1NjgKK05PUlRIRVJOIFRWTC0yNDoyOjU3LjIxMDUwOQorQ0FNUEVSIERPV046MjoyODIuNzA4MzQxCitOQVRBTC0zNDoyOjQ1Ny43MDM2NTkKK0xJQ0hURU5CVVJHOjI6MTkwMy43MTAxNDMKK1ZSRURFTkRBTDoyOjE1MDguODMyMzYyCitCUk9OS0hPUlNUU1BSVUlUOjI6MTMuODE0MTkwCitTT1VUUEFOU0JFUkc6MjoxMDQxOS42ODY4MzYKK1JPVVhWSUxMRToyOjExMjMuODY3ODkwCitOT05HT01BOjI6NzMwLjgxMDEyMAorREVMQVJFWVZJTExFOjI6MTIwOS4xMDE5OTQKK1ZSWUJVUkcgMS9NQUZFS0lORyAxOjI6NzE2Mi4zMzU3MzAKK0VYQ0VMU0lPUjoyOjY4My40MDEyODUKK05PUlRIRVJOIFRWTC0zOToyOjE2OS4zNjA5MzgKK0NBUEU6MjoxLjYzNzY2OAorRUVSU1RFSE9FSzoyOjI0LjAzMjc0MAorREVXVFMgRE9PUlA6Mjo5OTAuNjE0NzgzCitWQU5ERVJCSUpMIFAuOjI6Ny4wMDMwODYKK0JFVEhVTElFOjI6MTA2NC4wOTA2NDMKK05PUlRIIFdFU1QtNToyOjEyMDcuNDIyMzQyCitOUVVUVToyOjY0OC42NzY3NjYKK0lORFdFOjI6MzYwLjk3Mzg0NgorTU9TU0VMIEJBQUk6Mjo4MDUuNzA2Njc2CitFRVJTVEVIT0VLOjI6MTA3OC4xMDM4NTQKK05FV0NBU1RMRToyOjY3Mi4wNTgwOTAKK1ZJQ1RPUklBIFdFU1Q6Mjo0NDYwLjY1MTc1OAorU0VLSFVLSFVORUxBTkQ6MjozNzU5LjE2NDA0OQorRUFTVEVSTiBUVkwtOToyOjIzLjAzMjIwMAorSEVSTUFOVVM6MjoyOTUuOTI1NDMwCitSVVNURU5CVVJHOjI6NzQ5LjM2NjYxMQorREUgQUFSOjI6MTI3Mi44OTQ2MjUKK1BPUlQgRUxJU0FCRVRIOjI6NjA0LjAyODQxMworTU9VVFNFOjI6NDkuNTEzNTgyCitCTE9FTUZPTlRFSU4vQk9UUzoyOjIxOTguMzQ3MzkwCitDTEFOV0lMTElBTjoyOjI5NDguNjY4NTA0CitHRU9SR0U6MjoxMDM0LjQ5NjQyNgorVkFOSFlOU0RPUlA6MjozNzM1Ljc5NDU3OQorTkFUQUwtMTc6MjozMy4yMjcwODIKK0VBU1RFUk4gVFZMLTIwOjI6MTcuMDEzMTU1CitOT1JUSEVSTiBUVkwtMzE6MjoyNjYuMTIxNzIzCitIQVJSSVNNSVRIOjI6Mjg1My40ODUwNDgKK05BVEFMLTI3OjI6NjguODAwMzU3CitDQVJOQVJWT046Mjo2MjQ0LjI1MDM0NAorVlVMQU0uL0VNWlVNQkU6MjozMzcuNDQ3NDc4CitPVURUU0hPT1JOOjI6MTM1OC44ODkyMjkKK05BVEFMLTEyOjI6NTIuODg5OTYwCitNQUNMRUFSOjI6MTAwNy4xNzQyMjQKK1BSSU5DRSBBTEJFUlQ6MjozMTg0LjI2MTU5MAorUElLRVRCRVJHOjI6MTc2My41NjQyODQKK0NMT0NPTEFOOjI6NDMwLjk4MDQ4NgorQUxCQU5ZOjI6MTc5NC41MTg2NjAKK0JBVEhVUlNUOjI6NjA4LjQyMjMxNgorQkVUSEFMOjI6MjMyOS4xNjkxMDMKK1dJTExPV01PUkU6MjozMDgzLjI5MjM4OAorTk9VUE9PUlQ6Mjo1ODEuOTYwNzM4CitOQU1BS1dBTEFORDoyOjE4MzE5LjcxMjc1MQorTk9SVEhFUk4gVFZMLTMzOjI6MTQxLjA5MzI2MAorVFVMQkFHSDoyOjM1NS4yOTg5NzgKK1VJVEVOSEFHRToyOjEyNTIuODEwOTY2CitCT0xPQkVEVToyOjg3OS41Mzk5NTYKK1ZJTEpPRU5TS1JPT046Mjo4NDMuMDY0Mjc3CitXSVRSSVZFUjoyOjMxOTguODUzNzg4CitJWE9QTzoyOjU2OS4zNDkxNzAKK1JJQ0hNT05EOjI6Mjg4Ni41OTg3ODcKK1VCT01CTzoyOjc2Ni41OTI5MDAKK05BVEFMLTE4OjI6MjExLjg2OTU1MQorTk9SVEhFUk4gVFZMLTE5OjI6NTEuNzYzMDAwCitLTllTTkE6Mjo4MTYuMTIxNTQ5CitXSU5CVVJHOjI6MTE0Ny40NDIwNTEKK0hFTk5FTk1BTjoyOjI0Ny44Mzk1NzQKK0JBTEZPVVI6MjoxOTg4Ljk0NjQ0NgorTkFUQUwtNzQ6MjoxNjcuODU4MTE5CitOQVRBTC04ODoyOjQ2Ljg3MjcyMgorVlJFREVGT1JUOjI6NTExLjk3NzQzOQorTURBTlRTQU5FIDQ6MjozMi4zNDAwOTQKK01QRU5ETEU6Mjo0OTIuNTM2ODQ5CitIQVJUU1dBVEVSOjI6MjY3LjI4NzcwOQorS1JBTlNLT1A6MjoyNzcuMjg2NTM3CitUSEFCQVpJTUJJOjI6MTE3NDMuMzQyOTAzCitQQUFSTDoyOjQ0Ny41Mzc0NTIKK1ZSRURFTkJVUkc6MjoyODIuMDI2ODYxCitKT0hBTk5FU0JVUkc6Mjo0LjM3MTA0MgorQk9USEFWSUxMRToyOjEwMTcuNjg2OTY0CitDSEFUQ0FSVDoyOjEwMjcuOTc5ODQyCitOQVRBTC0yNDoyOjE3OS40MzI1MDgKK0VFUlNURUhPRUs6Mjo0ODQuNzQ2NjA4CitCVUxGT05URUlOOjI6MTI1My43Njc5NzUKK1dBVEVSQkVSRzoyOjE2MjQzLjMzMjk1MgorUEFSWVM6MjozNTUuNTIwNzk2CitOQVRBTC0zOToyOjEzLjY5OTU2NworTU9OVEFHVToyOjEwMjMuMDc5MjA3CitOT1JUSEVSTiBUVkwtNDA6MjoxNjU0LjQzMzM4NgorTUFSUVVBUkQ6Mjo0OTguMjg0NzM0CitQSUVUIFJFVElFRjoyOjQyNzUuMDA0MTQ2CitFWklOR09MV0VOSToyOjE5Mi43MzIyMjMKK05BVEFMLTY5OjI6MTM1Ljc2NjE1OAorV0FLS0VSU1RST09NOjI6MjIwMC4xOTgxNjAKK0hPUEVGSUVMRDoyOjUwOC4yNTQxODMKK05BVEFMLTMzOjI6NS43NzMwMDUKK0JPQ0hVTToyOjI2NjYuNDk0NTA2CitLTEVSS1NET1JQOjI6MTM0Ny45NzIyNTAKK0tFTVBUT04gUEFSSzoyOjMuNTQxNzQ5CitQT1JUIFNIRVBTVE9ORToyOjMwNS4wNzk5MzgKK1JFRERFU1NCVVJHOjI6NTg2LjczNDgwOQorUE9MRUxBOjI6MjUxLjIyMTY2OAorVlJZSEVJRDoyOjE0NDUuMzEwNzk2CitHT1JET05JQToyOjIwNDI1LjkxNDc1NAorRklDS1NCVVJHOjI6NTEwLjMxNzkxNworTkFUQUwtMjY6MjoyMzEuNzMyOTQxCitTRU5FS0FMOjI6MTQyNC42ODk3MzUKK0tJTUJFUkxFWToyOjEzNDUuOTQ1NTI0CitERUxNQVM6MjoxMTg2LjQyMDI3MAorQ1JBRE9DSzoyOjIzMjIuMjU0NTA4CitFQVNURVJOIFRWTC0xMToyOjY4NS45MDM2MzYKK05BVEFMLTg1OjI6MjQuMjMzNTQyCitQRVRSVVNCVVJHOjI6MTE3NC41MTk5NDIKK0VBU1RFUk4gVFZMLTE1OjI6OTQuMTcyMDAwCitLT1NURVI6MjoxMDc0LjM3MDkwNAorVlJFREU6MjoyMTEyLjAxNDAzNgorU0VTSEVHTzoyOjM3ODEuOTEwMzAxCitST0JFUlRTT046Mjo2NjYuNTg3OTMyCitCTy9KQUsvS09GL0ZBVToyOjcyNTcuMzg3Njc1CitNSURERUxTQlVSRzoyOjUzODguMTYyNDA4CitXRUxMSU5HVE9OOjI6MTgxLjQxMzk0OAorU0lNT05TVE9XTjoyOjExMC40NzE5MzkKK05BVEFMLTc2OjI6MzAuMDE1NjE4CitHUkFBRkYtUkVJTkVUOjI6MjcyMi4yOTE2NjkKK05BVEFMLTEwMToyOjExNi42ODk5NjAKK0NPTEVTQkVSRzoyOjIxNTUuODY4MjM1CitDRVJFUzoyOjM5NzUuNjkyODA5CitFRVJTVEVIT0VLOjI6MTMyOC4xNzQ1MzEKK0hFSURFTEJFUkc6Mjo3OTUuMjU1MjAyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU09VVEhBRlJJQ0FfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU09VVEhBRlJJQ0FfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0ZDU5MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TT1VUSEFGUklDQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDQwNyBAQAorU09VVEggQUZSSUNBCToJMAk6CTM3MTEwMjkxCitFQVNURVJOIENBUEUJOgkxCToJNjAwNzc0MAorRUFTVEVSTiBUVkwJOgkxCToJNjAwNzc0MAorTkFUQUwJOgkxCToJNzk1NTUyNAorTk9SVEggV0VTVAk6CTEJOgkzMjg1Mzg0CitOT1JUSEVSTiBDQVBFCToJMQk6CTcyMDk3NAorTk9SVEhFUk4gVFZMCToJMQk6CTcyMDk3NAorT1JBTkdFCToJMQk6CTY0NTgzMzMKK09SQU5HRSBGUkVFIFNUQVRFCToJMQk6CTI1MzU5NDcKK1BXViBbR2F1dGVuZ10gCToJMQk6CTg4MzcxNzgKK1dFU1RFUk4gQ0FQRQk6CTEJOgkzNDE3Njc1CitNRVNTSU5BCToJMgk6CTE1NjczCitTT1VUUEFOU0JFUkcJOgkyCToJMTU2NzMKK1NPVVRQQU5TQkVSRwk6CTIJOgkxNTY3MworTk9SVEhFUk4gVFZMLTQJOgkyCToJMTU2NzMKK1BPVEdJRVRFUlNSVVMJOgkyCToJMTU2NzMKK1dBTFZJUyBCQVkJOgkyCToJMjY3MDIKK01BTEFNVUVMRQk6CTIJOgkxNTY3MworTk9SVEhFUk4gVFZMLTcJOgkyCToJMTU2NzMKK0JPQ0hVTQk6CTIJOgkxNTY3MworR0lZQU5JCToJMgk6CTE1NjczCitMRVRBQkEJOgkyCToJMTU2NzMKK01PS0VST05HCToJMgk6CTE1NjczCitXQVRFUkJFUkcJOgkyCToJMTU2NzMKK1BJRVRFUlNCVVJHCToJMgk6CTE1NjczCitTRVNIRUdPCToJMgk6CTE1NjczCitTRUtHT1NFU0UJOgkyCToJMTU2NzMKK01PS0VST05HCToJMgk6CTE1NjczCitCT0xPQkVEVQk6CTIJOgkxNTY3MworTk9SVEhFUk4gVFZMLTE4CToJMgk6CTE1NjczCitOT1JUSEVSTiBUVkwtMTkJOgkyCToJMTU2NzMKK05PUlRIRVJOIFRWTC0yMAk6CTIJOgkxNTY3MworVEhBQkFaSU1CSQk6CTIJOgkxNTY3MworTk9SVEhFUk4gVFZMLTIyCToJMgk6CTE1NjczCitUSEFCQU1PT1BPCToJMgk6CTE1NjczCitOT1JUSEVSTiBUVkwtMjQJOgkyCToJMTU2NzMKK1JJVEFWSQk6CTIJOgkxNTY3MworTk9SVEhFUk4gVFZMLTI2CToJMgk6CTE1NjczCitOQVBIVU5PCToJMgk6CTE1NjczCitOT1JUSEVSTiBUVkwtMjgJOgkyCToJMTU2NzMKK1BJTEdSSU0nUyBSRVNUCToJMgk6CTE1NjczCitOT1JUSEVSTiBUVkwtMzAJOgkyCToJMTU2NzMKK05PUlRIRVJOIFRWTC0zMQk6CTIJOgkxNTY3MworTk9SVEhFUk4gVFZMLTMyCToJMgk6CTE1NjczCitOT1JUSEVSTiBUVkwtMzMJOgkyCToJMTU2NzMKK05BUEhVTk8JOgkyCToJMTU2NzMKK1NFS0hVS0hVTkVMQU5ECToJMgk6CTE1NjczCitNT0tFUk9ORwk6CTIJOgkxNTY3MworTk9SVEhFUk4gVFZMLTM3CToJMgk6CTE1NjczCitORUJPCToJMgk6CTE1NjczCitOT1JUSEVSTiBUVkwtMzkJOgkyCToJMTU2NzMKK05PUlRIRVJOIFRWTC00MAk6CTIJOgkxNTY3MworV0FSTUJBRAk6CTIJOgkxNTY3MworTFlERU5CVVJHCToJMgk6CTE1NDA0NAorTk9SVEhFUk4gVFZMLTQyCToJMgk6CTE1NjczCitOT1JUSEVSTiBUVkwtNDMJOgkyCToJMTU2NzMKK05PUlRIRVJOIFRWTC00NAk6CTIJOgkxNTY3MworTUFSSUNPCToJMgk6CTE0Mjg0MgorTk9SVEggV0VTVC0yCToJMgk6CTE0Mjg0MgorTk9SVEggV0VTVC0zCToJMgk6CTE0Mjg0MgorR09SRE9OSUEJOgkyCToJMjY3MDIKK05PUlRIRVJOIFRWTC00NQk6CTIJOgkxNTY3MworR1JPQkxFUlNEQUwJOgkyCToJMTU0MDQ0CitOT1JUSEVSTiBUVkwtNDYJOgkyCToJMTU2NzMKK01PVVRTRQk6CTIJOgkxNTQwNDQKK01EVVRKQU5BCToJMgk6CTE1NDA0NAorV0lUUklWRVIJOgkyCToJMTU0MDQ0CitCUklUUwk6CTIJOgkxNDI4NDIKK01PVVRTRQk6CTIJOgkxNTQwNDQKK05PUlRIIFdFU1QtNQk6CTIJOgkxNDI4NDIKK0VBU1RFUk4gVFZMLTcJOgkyCToJMTU0MDQ0CitFQVNURVJOIFRWTC04CToJMgk6CTE1NDA0NAorRUFTVEVSTiBUVkwtOQk6CTIJOgkxNTQwNDQKK0JFTEZBU1QJOgkyCToJMTU0MDQ0CitFQVNURVJOIFRWTC0xMQk6CTIJOgkxNTQwNDQKK1JVU1RFTkJVUkcJOgkyCToJMTQyODQyCitNSURERUxTQlVSRwk6CTIJOgkxNTQwNDQKK0VBU1RFUk4gVFZMLTEzCToJMgk6CTE1NDA0NAorTU9VVFNFCToJMgk6CTE1NDA0NAorQ1VMTElOQU4JOgkyCToJMAorRUFTVEVSTiBUVkwtMTUJOgkyCToJMTU0MDQ0CitORUxTUFJVSVQJOgkyCToJMTU0MDQ0CitWUllCVVJHIDEvTUFGRUtJTkcgMQk6CTIJOgkxNDI4NDIKK1dPTkRFUkJPT00JOgkyCToJMAorRUFTVEVSTiBUVkwtMTcJOgkyCToJMTU0MDQ0CitCQVJCRVJUT04JOgkyCToJMTU0MDQ0CitTV0FSVFJVR0dFTgk6CTIJOgkxNDI4NDIKK1JVU1RFTkJVUkcJOgkyCToJMTQyODQyCitXSVRCQU5LCToJMgk6CTE1NDA0NAorRUFTVEVSTiBUVkwtMjAJOgkyCToJMTU0MDQ0CitFQVNURVJOIFRWTC0yMQk6CTIJOgkxNTQwNDQKK1dBVEVSVkFMIEJPVkVOCToJMgk6CTE1NDA0NAorQlJPTktIT1JTVFNQUlVJVAk6CTIJOgkwCitFRVJTVEVIT0VLCToJMgk6CTE1NDA0NAorTk9SVEggV0VTVC0xMAk6CTIJOgkxNDI4NDIKK0VFUlNURUhPRUsJOgkyCToJMTU0MDQ0CitCUklUUwk6CTIJOgkxNDI4NDIKK0tPU1RFUgk6CTIJOgkxNDI4NDIKK1BSRVRPUklBCToJMgk6CTAKK0NBUk9MSU5BCToJMgk6CTE1NDA0NAorS1JVR0VSU0RPUlAJOgkyCToJMAorTElDSFRFTkJVUkcJOgkyCToJMTQyODQyCitOT1JUSCBXRVNULTE0CToJMgk6CTE0Mjg0MgorRUVSU1RFSE9FSwk6CTIJOgkxNTQwNDQKK0tFTVBUT04gUEFSSwk6CTIJOgkwCitSQU5EQlVSRwk6CTIJOgkwCitERUxNQVMJOgkyCToJMTU0MDQ0CitWRU5URVJTRE9SUAk6CTIJOgkxNDI4NDIKK0JFTk9OSQk6CTIJOgkwCitST09ERSBQT1JUCToJMgk6CTAKK0NPTElHTlkJOgkyCToJMTQyODQyCitSQU5ERk9OVEVJTgk6CTIJOgkwCitCRVRIQUwJOgkyCToJMTU0MDQ0CitFUk1FTE8JOgkyCToJMTU0MDQ0CitKT0hBTk5FU0JVUkcJOgkyCToJMAorR0VSTUlTVE9OCToJMgk6CTAKK0tVUlVNQU4JOgkyCToJMjY3MDIKK1NQUklOR1MJOgkyCToJMAorSE9FVkVMRFJJRgk6CTIJOgkxNTQwNDQKK0JPS1NCVVJHCToJMgk6CTAKK0VFUlNURUhPRUsJOgkyCToJMTU0MDQ0CitCUkFLUEFOCToJMgk6CTAKK1dFU1RPTkFSSUEJOgkyCToJMAorT0JFUkhPTFpFUgk6CTIJOgkwCitBTEJFUlRPTgk6CTIJOgkwCitWRVJFRU5JR0lORwk6CTIJOgkwCitERUxBUkVZVklMTEUJOgkyCToJMTQyODQyCitOSUdFTAk6CTIJOgkwCitFRVJTVEVIT0VLCToJMgk6CTE1NDA0NAorVlJZQlVSRwk6CTIJOgkxNDI4NDIKK0hFSURFTEJFUkcJOgkyCToJMAorUE9UQ0hFRlNUUk9PTQk6CTIJOgkxNDI4NDIKK1ZBTkRFUkJJSkwgUC4JOgkyCToJMAorQkFMRk9VUgk6CTIJOgkxNTQwNDQKK0VFUlNURUhPRUsJOgkyCToJMTU0MDQ0CitLTEVSS1NET1JQCToJMgk6CTE0Mjg0MgorU1RBTkRFUlRPTgk6CTIJOgkxNTQwNDQKK1BJRVQgUkVUSUVGCToJMgk6CTE1NDA0NAorU0FTT0xTQlVSRwk6CTIJOgk1NjM1NAorUEFSWVMJOgkyCToJNTYzNTQKK0FNRVJTRk9SVAk6CTIJOgkxNTQwNDQKK1dBS0tFUlNUUk9PTQk6CTIJOgkxNTQwNDQKK1NDSFdFSVpFUiBSLgk6CTIJOgkxNDI4NDIKK0lOR1dBVlVNQQk6CTIJOgk3ODc2NworV09MTUFSQU5TU1RBRAk6CTIJOgkxNDI4NDIKK1ZSRURFRk9SVAk6CTIJOgk1NjM1NAorSEVJTEJST04JOgkyCToJNTYzNTQKK1ZJTEpPRU5TS1JPT04JOgkyCToJNTYzNTQKK0ZSQU5LRk9SVAk6CTIJOgk1NjM1NAorVlJFREUJOgkyCToJNTYzNTQKK1ZPTEtTUlVTVAk6CTIJOgkxNTQwNDQKK0tPUFBJRVMJOgkyCToJNTYzNTQKK1BPU1RNQVNCVVJHCToJMgk6CTI2NzAyCitCT1RIQVZJTExFCToJMgk6CTU2MzU0CitVQk9NQk8JOgkyCToJNzg3NjcKK05PUlRIIFdFU1QtMjMJOgkyCToJMTQyODQyCitVVFJFQ0hUCToJMgk6CTc4NzY3CitQQVVMUElFVEVSU0JVUkcJOgkyCToJNzg3NjcKK0tST09OU1RBRAk6CTIJOgk1NjM1NAorTkdPVFNIRQk6CTIJOgk3ODc2NworTkVXQ0FTVExFCToJMgk6CTc4NzY3CitWUllIRUlECToJMgk6CTc4NzY3CitSRUlUWgk6CTIJOgk1NjM1NAorV0VTU0VMUyBCUk9OCToJMgk6CTU2MzU0CitVQk9NQk8JOgkyCToJNzg3NjcKK0xJTkRMRVkJOgkyCToJNTYzNTQKK0hPT1BTVEFECToJMgk6CTU2MzU0CitIQVJUU1dBVEVSCToJMgk6CTI2NzAyCitOQVRBTC05CToJMgk6CTc4NzY3CitIQVJSSVNNSVRICToJMgk6CTU2MzU0CitOT05HT01BCToJMgk6CTc4NzY3CitPREVOREFBTFNSVVMJOgkyCToJNTYzNTQKK0JBUktMWSBXRVNUCToJMgk6CTI2NzAyCitOQVRBTC0xMQk6CTIJOgk3ODc2NworTkFUQUwtMTIJOgkyCToJNzg3NjcKK0hMQUJJU0EJOgkyCToJNzg3NjcKK0hFTk5FTk1BTgk6CTIJOgk1NjM1NAorQk8vSkFLL0tPRi9GQVUJOgkyCToJNTYzNTQKK05BVEFMLTE0CToJMgk6CTc4NzY3CitEQU5OSEFVU0VSCToJMgk6CTc4NzY3CitOQVRBTC0xNgk6CTIJOgk3ODc2NworQkVUSExFSEVNCToJMgk6CTU2MzU0CitOQVRBTC0xNwk6CTIJOgk3ODc2NworVkVOVEVSU0JVUkcJOgkyCToJNTYzNTQKK05BVEFMLTE4CToJMgk6CTc4NzY3CitXQVJSRU5UT04JOgkyCToJMjY3MDIKK05RVVRVCToJMgk6CTc4NzY3CitNQUhMQUJBVElOSQk6CTIJOgk3ODc2NworU0VORUtBTAk6CTIJOgk1NjM1NAorRFVOREVFCToJMgk6CTc4NzY3CitCVUxGT05URUlOCToJMgk6CTU2MzU0CitXSU5CVVJHCToJMgk6CTU2MzU0CitHTEVOQ09FCToJMgk6CTc4NzY3CitOQU1BS1dBTEFORAk6CTIJOgkyNjcwMgorVEhFVU5JU1NFTgk6CTIJOgk1NjM1NAorS0xJUFJJVkVSCToJMgk6CTc4NzY3CitOQVRBTC0yNAk6CTIJOgk3ODc2NworQkFCQU5BTkdPCToJMgk6CTc4NzY3CitOQVRBTC0yNgk6CTIJOgk3ODc2NworTkFUQUwtMjcJOgkyCToJNzg3NjcKK05BVEFMLTI4CToJMgk6CTc4NzY3CitOQVRBTC0yOQk6CTIJOgk3ODc2NworTkFUQUwtMzAJOgkyCToJNzg3NjcKK0xPV0VSIFVNRk9MT1pJCToJMgk6CTc4NzY3CitOQVRBTC0zMgk6CTIJOgk3ODc2NworSEVSQkVSVAk6CTIJOgkyNjcwMgorTkFUQUwtMzMJOgkyCToJNzg3NjcKK05BVEFMLTM0CToJMgk6CTc4NzY3CitGT1VSSUVTQlVSRwk6CTIJOgk1NjM1NAorQlJBTkRGT1JUCToJMgk6CTU2MzU0CitXSVRaSUVTSE9FSyAoUUFRV0EpCToJMgk6CTY0NTgzMzMKK01UT05KQU5FTkkJOgkyCToJNzg3NjcKK0hBWQk6CTIJOgkyNjcwMgorTktBTkRBTEEJOgkyCToJNzg3NjcKK05BVEFMLTM3CToJMgk6CTc4NzY3CitLRU5IQVJEVAk6CTIJOgkyNjcwMgorS0lNQkVSTEVZCToJMgk6CTI2NzAyCitCRVJHVklMTEUJOgkyCToJNzg3NjcKK05BVEFMLTM5CToJMgk6CTc4NzY3CitOQVRBTC00MAk6CTIJOgk3ODc2NworTUFSUVVBUkQJOgkyCToJNTYzNTQKK01TSU5HQQk6CTIJOgk3ODc2NworRklDS1NCVVJHCToJMgk6CTU2MzU0CitFU1RDT1VSVAk6CTIJOgk3ODc2NworV0VFTkVOCToJMgk6CTc4NzY3CitOQVRBTC00NAk6CTIJOgk3ODc2NworTkFUQUwtNDUJOgkyCToJNzg3NjcKK0NMT0NPTEFOCToJMgk6CTU2MzU0CitOQVRBTC00Ngk6CTIJOgk3ODc2NworS1JBTlNLT1AJOgkyCToJNzg3NjcKK05BVEFMLTQ4CToJMgk6CTc4NzY3CitOQVRBTC00OQk6CTIJOgk3ODc2NworRVhDRUxTSU9SCToJMgk6CTU2MzU0CitCTE9FTUZPTlRFSU4vQk9UUwk6CTIJOgk1NjM1NAorRVNIT1dFCToJMgk6CTc4NzY3CitOQVRBTC01MQk6CTIJOgk3ODc2NworTVRVTlpJTkkJOgkyCToJNzg3NjcKK05BVEFMLTUzCToJMgk6CTc4NzY3CitQUklFU0tBCToJMgk6CTI2NzAyCitOQVRBTC01NAk6CTIJOgk3ODc2NworTkFUQUwtNTUJOgkyCToJNzg3NjcKK1BFVFJVU0JVUkcJOgkyCToJNTYzNTQKK1VNVk9USQk6CTIJOgk3ODc2NworTkFUQUwtNTcJOgkyCToJNzg3NjcKK09SQU5HRSBGUkVFIFNUQVRFLTMzCToJMgk6CTU2MzU0CitNT09JUklWSUVSCToJMgk6CTc4NzY3CitMQURZQlJBTkQJOgkyCToJNTYzNTQKK01BUFVNVUxPCToJMgk6CTc4NzY3CitOQVRBTC02MAk6CTIJOgk3ODc2NworSE9QRVRPV04JOgkyCToJMjY3MDIKK05BVEFMLTYxCToJMgk6CTc4NzY3CitOQVRBTC02Mgk6CTIJOgk3ODc2NworTE9XRVIgVFVHVUxBCToJMgk6CTc4NzY3CitORVcgSEFOT1ZFUgk6CTIJOgk3ODc2NworTElPTiBSSVZFUgk6CTIJOgk3ODc2NworREVXVFMgRE9PUlAJOgkyCToJNTYzNTQKK01QRU5ETEUJOgkyCToJNzg3NjcKK05EV0VEV0UJOgkyCToJNzg3NjcKK1JFRERFU1NCVVJHCToJMgk6CTU2MzU0CitQSUVURVJNQVJJVFpCVVJHCToJMgk6CTc4NzY3CitOQVRBTC02OQk6CTIJOgk3ODc2NworRURFTkJVUkcJOgkyCToJNTYzNTQKK1VOREVSQkVSRwk6CTIJOgk3ODc2NworV0VQRU5FUgk6CTIJOgk1NjM1NAorSkFHRVJTRk9OVEVJTgk6CTIJOgk1NjM1NAorSU5BTkRBCToJMgk6CTc4NzY3CitOQVRBTC03Mgk6CTIJOgk3ODc2NworTkFUQUwtNzMJOgkyCToJNzg3NjcKK05BVEFMLTc0CToJMgk6CTc4NzY3CitNT1VOVCBDVVJSSUUJOgkyCToJNzg3NjcKK05BVEFMLTc2CToJMgk6CTc4NzY3CitDQU1QRVIgRE9XTgk6CTIJOgk3ODc2NworQ0FMVklOSUEJOgkyCToJMjY3MDIKK05BVEFMLTc4CToJMgk6CTc4NzY3CitQT0xFTEEJOgkyCToJNzg3NjcKK05BVEFMLTgwCToJMgk6CTc4NzY3CitQSU5FVE9XTgk6CTIJOgk3ODc2NworUklDSE1PTkQJOgkyCToJNzg3NjcKK0RVUkJBTi9DSEFUUy4JOgkyCToJNzg3NjcKK1BISUxJUFNUT1dOCToJMgk6CTI2NzAyCitEVVJCQU4vQ0hBVFMuCToJMgk6CTc4NzY3CitUUk9NUFNCVVJHCToJMgk6CTU2MzU0CitOQVRBTC04NQk6CTIJOgk3ODc2NworTkFUQUwtODYJOgkyCToJNzg3NjcKK0VNQlVNQlVMVQk6CTIJOgk3ODc2NworTkFUQUwtODgJOgkyCToJNzg3NjcKK1NNSVRIRklFTEQJOgkyCToJNTYzNTQKK0lYT1BPCToJMgk6CTc4NzY3CitCUklUU1RPV04JOgkyCToJMjY3MDIKK1BISUxJUFBPTElTCToJMgk6CTU2MzU0CitDQVJOQVJWT04JOgkyCToJMjY3MDIKK1pBU1RST04JOgkyCToJNTYzNTQKK05BVEFMLTkwCToJMgk6CTc4NzY3CitFQVNURVJOIENBUEUtMQk6CTIJOgkxMjAxNTQKK05BVEFMLTkxCToJMgk6CTc4NzY3CitST1VYVklMTEUJOgkyCToJNTYzNTQKK1dJTExJU1RPTgk6CTIJOgkyNjcwMgorVlVMQU0uL0VNWlVNQkUJOgkyCToJNzg3NjcKK05BVEFMLTkzCToJMgk6CTc4NzY3CitCRVRIVUxJRQk6CTIJOgk1NjM1NAorVU1aSU5UTwk6CTIJOgk3ODc2NworQ09MRVNCRVJHCToJMgk6CTI2NzAyCitNT1VOVCBDVVJSSUUJOgkyCToJMTIwMTU0CitERSBBQVIJOgkyCToJMjY3MDIKK0VBU1RFUk4gQ0FQRS0zCToJMgk6CTEyMDE1NAorVkFOSFlOU0RPUlAJOgkyCToJODEzNzMKK1ZVTEFNLi9FTVpVTUJFCToJMgk6CTc4NzY3CitWSUNUT1JJQSBXRVNUCToJMgk6CTI2NzAyCitWVUxBTS4vRU1aVU1CRQk6CTIJOgk3ODc2NworQUxCRVJUCToJMgk6CTEyMDE1NAorQUxGUkVECToJMgk6CTc4NzY3CitWRVRFUlNUQUQJOgkyCToJMTIwMTU0CitOQVRBTC05OAk6CTIJOgk3ODc2NworTEFEWSBHUkVZCToJMgk6CTEyMDE1NAorUE9SVCBTSEVQU1RPTkUJOgkyCToJNzg3NjcKK0FMSVdBTCBOT1JUSAk6CTIJOgkxMjAxNTQKK0VaSU5HT0xXRU5JCToJMgk6CTc4NzY3CitCQVJLTFkgRUFTVAk6CTIJOgkxMjAxNTQKK01BQ0xFQVIJOgkyCToJMTIwMTU0CitIQU5PVkVSCToJMgk6CTI2NzAyCitOQVRBTC0xMDEJOgkyCToJNzg3NjcKK1JJQ0hNT05ECToJMgk6CTI2NzAyCitXT0RFSE9VU0UJOgkyCToJMTIwMTU0CitTVEVZTlNCVVJHCToJMgk6CTEyMDE1NAorTk9VUE9PUlQJOgkyCToJMjY3MDIKK0VMTElPVAk6CTIJOgkxMjAxNTQKK1ZSRURFTkRBTAk6CTIJOgk4MTM3MworRlJBU0VSQlVSRwk6CTIJOgkyNjcwMgorTU9MVEVOTwk6CTIJOgkxMjAxNTQKK01JRERMRUJVUkcJOgkyCToJMTIwMTU0CitJTkRXRQk6CTIJOgkxMjAxNTQKK0hPRk1FWVIJOgkyCToJMTIwMTU0CitTVEVSS1NUUk9PTQk6CTIJOgkxMjAxNTQKK0JFQVVGT1JUIFdFU1QJOgkyCToJODEzNzMKK1RBUktBU1RBRAk6CTIJOgkxMjAxNTQKK01VUlJBWVNCVVJHCToJMgk6CTgxMzczCitWUkVERU5EQUwJOgkyCToJODEzNzMKK0dSQUFGRi1SRUlORVQJOgkyCToJMTIwMTU0CitRVUVFTlNUT1dOCToJMgk6CTEyMDE1NAorQ1JBRE9DSwk6CTIJOgkxMjAxNTQKK1NVVEhFUkxBTkQJOgkyCToJMjY3MDIKK0NMQU5XSUxMSUFOCToJMgk6CTgxMzczCitWSUNUT1JJQSBFQVNUCToJMgk6CTEyMDE1NAorQ0hBVENBUlQJOgkyCToJMTIwMTU0CitBQkVSREVFTgk6CTIJOgkxMjAxNTQKK0NFUkVTCToJMgk6CTgxMzczCitRVUVFTlNUT1dOCToJMgk6CTEyMDE1NAorU1VUVEVSSEVJTQk6CTIJOgkxMjAxNTQKK0JFREZPUkQJOgkyCToJMTIwMTU0CitQRUFSU1RPTgk6CTIJOgkxMjAxNTQKK1BJS0VUQkVSRwk6CTIJOgk4MTM3MworU09NRVJTRVQgRUFTVAk6CTIJOgkxMjAxNTQKK1FVRUVOU1RPV04JOgkyCToJMTIwMTU0CitBREVMQUlERQk6CTIJOgkxMjAxNTQKK0ZPUlQgQkVBVUZPUlQJOgkyCToJMTIwMTU0CitLT01HQQk6CTIJOgkxMjAxNTQKK1NUT0NIRU5TVFJPTQk6CTIJOgkxMjAxNTQKK0xBSU5HU0JVUkcJOgkyCToJODEzNzMKK1BSSU5DRSBBTEJFUlQJOgkyCToJODEzNzMKK0tJTkcgV0lMTElBTSBUT1dOCToJMgk6CTEyMDE1NAorTURBTlRTQU5FIDQJOgkyCToJMTIwMTU0CitKQU5TRU5WSUxMRQk6CTIJOgkxMjAxNTQKK1ZSRURFTkJVUkcJOgkyCToJODEzNzMKK0VBU1QgTE9ORE9OCToJMgk6CTEyMDE1NAorV0lMTE9XTU9SRQk6CTIJOgkxMjAxNTQKK01EQU5UU0FORQk6CTIJOgkxMjAxNTQKK0hPUEVGSUVMRAk6CTIJOgk4MTM3MworTUFMTUVTQlVSWQk6CTIJOgk4MTM3MworQUxCQU5ZCToJMgk6CTEyMDE1NAorU1RFWUxFUlZJTExFCToJMgk6CTEyMDE1NAorVFVMQkFHSAk6CTIJOgk4MTM3MworV09SQ0VTVEVSCToJMgk6CTgxMzczCitVSVRFTkhBR0UJOgkyCToJMTIwMTU0CitLSVJLV09PRAk6CTIJOgkxMjAxNTQKK0JBVEhVUlNUCToJMgk6CTEyMDE1NAorQUxFWEFORFJJQQk6CTIJOgkxMjAxNTQKK09VRFRTSE9PUk4JOgkyCToJODEzNzMKK0NBTElUWkRPUlAJOgkyCToJODEzNzMKK1dFTExJTkdUT04JOgkyCToJODEzNzMKK1VOSU9OREFMRQk6CTIJOgk4MTM3MworTEFESVNNSVRICToJMgk6CTgxMzczCitNQUxNRVNCVVJZCToJMgk6CTgxMzczCitNT05UQUdVCToJMgk6CTgxMzczCitQQUFSTAk6CTIJOgk4MTM3MworSk9VQkVSVElOQQk6CTIJOgkxMjAxNTQKK1BPUlQgRUxJU0FCRVRICToJMgk6CTEyMDE1NAorSEFOS0VZCToJMgk6CTEyMDE1NAorR0VPUkdFCToJMgk6CTgxMzczCitTV0VMTEVOREFNCToJMgk6CTgxMzczCitST0JFUlRTT04JOgkyCToJODEzNzMKK0hVTUFOU0RPUlAJOgkyCToJMTIwMTU0CitCRUxMRVZJTExFCToJMgk6CTgxMzczCitDQVBFCToJMgk6CTgxMzczCitLTllTTkEJOgkyCToJODEzNzMKK1NURUxMRU5CT1NDSAk6CTIJOgk4MTM3MworQ0FQRQk6CTIJOgk4MTM3MworUklWRVJTREFMRQk6CTIJOgk4MTM3MworTU9TU0VMIEJBQUkJOgkyCToJODEzNzMKK0NBTEVET04JOgkyCToJODEzNzMKK0dPT0RXT09ECToJMgk6CTgxMzczCitLVUlMU1JJVkVSCToJMgk6CTgxMzczCitIRUlERUxCRVJHCToJMgk6CTgxMzczCitXSU5CRVJHCToJMgk6CTgxMzczCitTSU1PTlNUT1dOCToJMgk6CTgxMzczCitTVFJBTkQJOgkyCToJODEzNzMKK0JSRURBU0RPUlAJOgkyCToJODEzNzMKK0hFUk1BTlVTCToJMgk6CTgxMzczClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NPVVRIS09SRUFfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU09VVEhLT1JFQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTZjMGE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NPVVRIS09SRUFfQVJFQS50eHQKQEAgLTAsMCArMSwxNyBAQAorU291dGggS29yZWEJOgkwCToJOTg0ODAKK0J1c2FuIFtQdXNhbl0JOgkxCToJNzYyLjkyCitDaHVuZ2Nob25nYnVrLWRvIAk6CTEJOgk3NDMxLjYwCitDaHVuZ2Nob25nbmFtLWRvIAk6CTEJOgk4NTk3Ljk0CitEYWVndSBbVGFlZ3VdCToJMQk6CTg4NS43CitEYWVqZW9uIFtUYWVqb25dCToJMQk6CTUzOS43CitLYW5nLXdvbi1kbyAJOgkxCToJMTY4NzMuMzgKK0t3YW5nanUJOgkxCToJNTAxLjQ0CitLeW9uZ3NhbmdidWstZG8gCToJMQk6CTE5MDI0LjgxCitLeW9uZ3NhbmduYW0tZG8gCToJMQk6CTEwNTE3Ljc0CitLeW9uZ2dpLWRvIAk6CTEJOgkxMDE4MS4yOQorSW5jaG9uCToJMQk6CTk4Ni40NQorQ2hlanUtZG8gCToJMQk6CTE4NDcuMTkKK2Nob2xsYWJ1ay1kbyAJOgkxCToJODA1MC45NAorY2hvbGxhbmFtLWRvIAk6CTEJOgkxMjAzNi45NQorU2VvdWwJOgkxCToJNjA1LjUyCitVbHNhbgk6CTEJOgkxMDU2LjM4CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU09VVEhLT1JFQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TT1VUSEtPUkVBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMWQyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU09VVEhLT1JFQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDE3IEBACitTb3V0aCBLb3JlYQk6CTAJOgk0ODg0NjgyMworQnVzYW4gW1B1c2FuXQk6CTEJOgkzNjg0MTUzCitDaHVuZ2Nob25nYnVrLWRvIAk6CTEJOgkxNTAwNjEwCitDaHVuZ2Nob25nbmFtLWRvIAk6CTEJOgkxOTcyNTUzCitEYWVndSBbVGFlZ3VdCToJMQk6CTI1Mzk3MzgKK0RhZWplb24gW1RhZWpvbl0JOgkxCToJMTQ1MDc1MAorS2FuZy13b24tZG8gCToJMQk6CTE1Mjg2NDAKK0t3YW5nanUJOgkxCToJMTQwNjkxNQorS3lvbmdzYW5nYnVrLWRvIAk6CTEJOgkyNzE4NjEzCitLeW9uZ3NhbmduYW0tZG8gCToJMQk6CTMxNjg3MzQKK0t5b25nZ2ktZG8gCToJMQk6CTEwNjI4ODQyCitJbmNob24JOgkxCToJMjYxMDcxNQorQ2hlanUtZG8gCToJMQk6CTU1NzIzNQorY2hvbGxhYnVrLWRvIAk6CTEJOgkxOTE1Njc0CitjaG9sbGFuYW0tZG8gCToJMQk6CTE5OTQwMTEKK1Nlb3VsCToJMQk6CTEwMjg3ODQ3CitVbHNhbgk6CTEJOgkxMDg3OTU4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NQQUlOX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NQQUlOX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYzI0NmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU1BBSU5fQVJFQS50eHQKQEAgLTAsMCArMSwxNyBAQAorIEdBTElDSUEgOiAxIDogMjk0MzQuMAorIEFTVFVSSUFTIDogMSA6IDEwNTY1LjAKKyBDQU5UQUJSSUEgOiAxIDogNTI5OC4wCisgUEFJUyBWQVNDTyA6IDEgOiA3MjYxLjAKKyBOQVZBUlJBIDogMSA6IDEwNDIxLjAKKyBDQVNUSUxMQSAtIExFT04gOiAxIDogOTQxOTMuMAorIEFSQUdPTiA6IDEgOiA0NzY1MC4wCisgQ0FUQUxVTkEgOiAxIDogMzE5MzAuMAorIFJJT0pBIDogMSA6IDUwMzQuMAorIENBU1RJTExBIC0gTEEgTUFOQ0hBIDogMSA6IDc5MjMwLjAKKyBNQURSSUQgOiAxIDogNzk5NS4wCisgQ09NVU5JREFEIFZBTEVOQ0lBTkEgOiAxIDogMjMzMDUuMAorIEVYVFJFTUFEVVJBIDogMSA6IDQxNjAyLjAKKyBCQUxFQVJFUyA6IDEgOiA1MDE0LjAKKyBNVVJDSUEgOiAxIDogMTEzMTcuMAorIEFOREFMVUNJQSA6IDEgOiA4NzI2OC4wCisgQ0FOQVJJQVMgOiAxIDogNzI0Mi4wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU1BBSU5fUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU1BBSU5fUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3ZDg3NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TUEFJTl9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDE3IEBACisgR0FMSUNJQSA6IDEgOiAyODA2NTAwCisgQVNUVVJJQVMgOiAxIDogMTEyNzUwMAorIENBTlRBQlJJQSA6IDEgOiA1MjcyMDAKKyBQQUlTIFZBU0NPIDogMSA6IDIxMjk4MDAKKyBOQVZBUlJBIDogMSA6IDUyMTQwMAorIENBU1RJTExBIC0gTEVPTiA6IDEgOiAyNjI3ODAwCisgQVJBR09OIDogMSA6IDEyMTM5MDAKKyBDQVRBTFVOQSA6IDEgOiA2MDEwNDAwCisgUklPSkEgOiAxIDogMjYxMDAwCisgQ0FTVElMTEEgLSBMQSBNQU5DSEEgOiAxIDogMTcxNDAwMAorIE1BRFJJRCA6IDEgOiA0ODg2NTAwCisgQ09NVU5JREFEIFZBTEVOQ0lBTkEgOiAxIDogMzc4OTcwMAorIEVYVFJFTUFEVVJBIDogMSA6IDExMjg4MDAKKyBCQUxFQVJFUyA6IDEgOiA2ODMxMDAKKyBNVVJDSUEgOiAxIDogMTAyOTQwMAorIEFOREFMVUNJQSA6IDEgOiA2OTM2NTAwCisgQ0FOQVJJQVMgOiAxIDogMTQ4OTEwMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NVREFOX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NVREFOX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZjYxZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU1VEQU5fQVJFQS50eHQKQEAgLTAsMCArMSwxMDIgQEAKK1N1ZGFuCToJMAk6CTI1MDU4MTAKK0RhcmZ1ciA6IDEgOiAzMTgxMzMKK0tvcmR1ZmFuIDogMSA6IDM3NjE0NQorVXBwZXIgTmlsZQk6CTEJOgk3Nzc3MworUG9ydCBTdWRhbiAJOgkxCToJMjE4ODg3CitIYWxheWViIAk6CTEJOgkwCitSZWQgU2VhIAk6CTEJOgkwCitTaW5rYXQgCToJMQk6CTAKK1Rva2FyIAk6CTEJOgkwCitSdW1iZWsgCToJMQk6CTQwMjM1CitXYWQgTWVkYW5pIAk6CTEJOgkyMzM3MworS2FtbGluIAk6CTEJOgkwCitIYXNhaGVzYSAJOgkxCToJMAorQnV0YW5hIAk6CTEJOgkwCitHZXppcmEgCToJMQk6CTAKK01hbmFnaWwgCToJMQk6CTAKK1VtIEVsZ29yYSAJOgkxCToJMAorS2hhcnRvdW0gCToJMQk6CTIyMTQyCitLaGFydG91bSAJOgkxCToJMAorT21kdXJtYW4gCToJMQk6CTAKK0Vhc3QgTmlsZSAJOgkxCToJMAorR2VkYXJpZiAgW0Vhc3Rlcm4xXSBbRWFzdGVybl0JOgkxCToJNzUyNjMKK0dlZGFyZWYgCToJMQk6CTAKK1JhaGFkIAk6CTEJOgkwCitHYWxhYmF0IAk6CTEJOgkwCitGYXNoZ2EgCToJMQk6CTAKK0JhbnRpbyAJOgkxCToJMzYwCitSYWJhayAJOgkxCToJMzA0MTEKK0dpdGFpbmEgCToJMQk6CTAKK0R1ZW0gCToJMQk6CTAKK0tvc3RpIAk6CTEJOgkwCitHYWJhbGFpbiAJOgkxCToJMAorQWwtRGFtYXppbiAJOgkxCToJNDU4NDQKK0RhbWF6aW4gCToJMQk6CTAKK0t1cm11ayAJOgkxCToJMAorUm9zYWlyaXMgCToJMQk6CTAKK0JhdyAJOgkxCToJMAorTm9ydGhlcm4zIFtOb3J0aGVybl0JOgkxCToJMzQ4NzY1CitXYWRpIEhhbGZhIAk6CTEJOgkwCitEb25nbGEgCToJMQk6CTAKK01lcmF3aSAJOgkxCToJMAorRWxkYWJhIAk6CTEJOgkwCitCYWhyIEVsIEdoYXphbAk6CTEJOgkyMjk1NgorWWFtYmlvIAk6CTEJOgk3OTMxOQorV2F1IAk6CTEJOgk5MzkwMAorR2VuZWluYSAJOgkxCToJNzk0NjAKK0VsZ2luZWluYSAJOgkxCToJMAorWmFsaW5naSAJOgkxCToJMAorSmFiZWwgTWFycmEgCToJMQk6CTAKK0hpYmlsYSAJOgkxCToJMAorS2lsYmVzcyAJOgkxCToJMAorV2FkaSBTYWxpaCAJOgkxCToJMAorQWwtRnVsYSAJOgkxCToJMTExMzczCitFbG51aHVkIAk6CTEJOgkwCitHYWJpZXNoIAk6CTEJOgkwCitFbHNhbGFtIAk6CTEJOgkwCitMYWdhd2EgCToJMQk6CTAKK055YWxhIAk6CTEJOgkxMjczMDAKK055YWxhIAk6CTEJOgkwCitSYWhldCBFbGJ1cmRpIAk6CTEJOgkwCitJZGRlbGZpcnNhbiAJOgkxCToJMAorQWRpZWxhIAk6CTEJOgkwCitEZWFpbiAJOgkxCToJMAorU2hlcmlhIAk6CTEJOgkwCitCdXJhbSAJOgkxCToJMAorS2FkdWdsaSAJOgkxCToJNzk0NzAKK1Jhc2hhZCAJOgkxCToJMAorQWJ1IEppYmVoYSAJOgkxCToJMAorSWRkZWxmaXJzYW4gCToJMQk6CTAKK0thZHVnbGkgCToJMQk6CTAKK1RhbHVkaSAJOgkxCToJMAorQm9yIAk6CTEJOgkxMjI0NzkKK0thc3NhbGEgCToJMQk6CTM2NzEwCitLYXNzYWxhIAk6CTEJOgkwCitBdGJhcmEgUml2ZXIgCToJMQk6CTAKK1NldHRldCAJOgkxCToJMAorRWwgR2FzaCAJOgkxCToJMAorSGFtYXNrb3JhYmUgCToJMQk6CTAKK0FsLURhbWFyIAk6CTEJOgkxMjIxMjMKK0JlcmJlciAJOgkxCToJMAorRWRkYW1lciAJOgkxCToJMAorU2hlbmRpIAk6CTEJOgkwCitNYXRhbW1hIAk6CTEJOgkwCitBYm8gSGFtZWQgCToJMQk6CTAKK0F3aWwgCToJMQk6CTMzNTU4CitBbC1GYXNoaXIgCToJMQk6CTI5NjQyMAorS3V0dW0gCToJMQk6CTAKK0Zhc2hpciAJOgkxCToJMAorVW1rYWRhZGEgCToJMQk6CTAKK0thYmthZGlhIAk6CTEJOgkwCitBbC1PYmVpZCAJOgkxCToJMTg1MzAyCitTb2RhcmkgCToJMQk6CTAKK0JhcmEgCToJMQk6CTAKK1VtcndhYmEgCToJMQk6CTAKK1NoaWthbiAJOgkxCToJMAorSGFtcmF0IEVsc2hpZWsgCToJMQk6CTAKK0thcG9pdGEgW0VxdWF0b3JpYV0JOgkxCToJODI1NDIKK1Nlbm5hciBbQ2VudHJhbF0gCToJMQk6CTM3ODQ0CitTZW5uYXIgCToJMQk6CTAKK0RpbmRpciAJOgkxCToJMAorU2luZ2EgCToJMQk6CTAKK1dhcmFwIAk6CTEJOgkzMTAyNwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NVREFOX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NVREFOX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NDBjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU1VEQU5fUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxMDIgQEAKK1N1ZGFuCToJMAk6CTQxMjM2Mzc4CitEYXJmdXIgOiAxIDogNjQ3MDAwMAorS29yZHVmYW4gOiAxIDogMzgyNzAwMAorR2VkYXJpZiBbRWFzdGVybjFdIFtFYXN0ZXJuXQk6CTEJOgkxNTY3MDAwCitLYXBvaXRhIFtFcXVhdG9yaWFdCToJMQk6CSAzNTkwNTYKK1Nlbm5hciAgW0NlbnRyYWxdCToJMQk6CTEyMzYwMDAKK0JhaHIgRWwgR2hhemFsCToJMQk6CTE1MDAKK05vcnRoZXJuMyBbTm9ydGhlcm5dCToJMQk6CTYwMzAwMAorVXBwZXIgTmlsZQk6CTEJOgkxMzQyOTQzCitQb3J0IFN1ZGFuIAk6CTEJOgk3MjgwMDAKK0hhbGF5ZWIgCToJMQk6CTczMDAwCitSZWQgU2VhIAk6CTEJOgkxMzgwMDAKK1NpbmthdCAJOgkxCToJMjg0MDAwCitUb2thciAJOgkxCToJMjMzMDAwCitSdW1iZWsgCToJMQk6CTIyNTY5NDIKK1dhZCBNZWRhbmkgCToJMQk6CTM1ODMwMDAKK0thbWxpbiAJOgkxCToJNDMwMDAwCitIYXNhaGVzYSAJOgkxCToJNjQ1MDAwCitCdXRhbmEgCToJMQk6CTUwMjAwMAorR2V6aXJhIAk6CTEJOgk3ODgwMDAKK01hbmFnaWwgCToJMQk6CTEwNzUwMDAKK1VtIEVsZ29yYSAJOgkxCToJMTQzMDAwCitLaGFydG91bSAJOgkxCToJNTEzOTAwMAorS2hhcnRvdW0gCToJMQk6CTYxNzAwMAorT21kdXJtYW4gCToJMQk6CTE2OTYwMDAKK0Vhc3QgTmlsZSAJOgkxCToJMjgyNjAwMAorR2VkYXJlZiAJOgkxCToJMjE5MDAwCitSYWhhZCAJOgkxCToJNzA1MDAwCitHYWxhYmF0IAk6CTEJOgk2MjYwMDAKK0Zhc2hnYSAJOgkxCToJMTcwMDAKK0JhbnRpbyAJOgkxCToJMAorUmFiYWsgCToJMQk6CTE1NTUwMDAKK0dpdGFpbmEgCToJMQk6CTI5NTAwMAorRHVlbSAJOgkxCToJMzEyMDAwCitLb3N0aSAJOgkxCToJNjUzMDAwCitHYWJhbGFpbiAJOgkxCToJMjk1MDAwCitBbC1EYW1hemluIAk6CTEJOgk2NzUwMDAKK0RhbWF6aW4gCToJMQk6CTE2MjAwMAorS3VybXVrIAk6CTEJOgkxMzUwMDAKK1Jvc2FpcmlzIAk6CTEJOgkzNjUwMDAKK0JhdyAJOgkxCToJMTMwMDAKK1dhZGkgSGFsZmEgCToJMQk6CTEwOTAwMAorRG9uZ2xhIAk6CTEJOgkyMTEwMDAKK01lcmF3aSAJOgkxCToJMjcyMDAwCitFbGRhYmEgCToJMQk6CTExMDAwCitZYW1iaW8gCToJMQk6CTAKK1dhdSAJOgkxCToJMAorR2VuZWluYSAJOgkxCToJMTY1MzAwMAorRWxnaW5laW5hIAk6CTEJOgkwCitaYWxpbmdpIAk6CTEJOgkwCitKYWJlbCBNYXJyYSAJOgkxCToJMAorSGliaWxhIAk6CTEJOgkwCitLaWxiZXNzIAk6CTEJOgkwCitXYWRpIFNhbGloIAk6CTEJOgkwCitBbC1GdWxhIAk6CTEJOgkxMTY0MDAwCitFbG51aHVkIAk6CTEJOgkwCitHYWJpZXNoIAk6CTEJOgkwCitFbHNhbGFtIAk6CTEJOgkwCitMYWdhd2EgCToJMQk6CTAKK055YWxhIAk6CTEJOgkwCitOeWFsYSAJOgkxCToJMAorUmFoZXQgRWxidXJkaSAJOgkxCToJMAorSWRkZWxmaXJzYW4gCToJMQk6CTAKK0FkaWVsYSAJOgkxCToJMAorRGVhaW4gCToJMQk6CTAKK1NoZXJpYSAJOgkxCToJMAorQnVyYW0gCToJMQk6CTAKK0thZHVnbGkgCToJMQk6CTExNDMwMDAKK1Jhc2hhZCAJOgkxCToJMAorQWJ1IEppYmVoYSAJOgkxCToJMAorSWRkZWxmaXJzYW4gCToJMQk6CTAKK0thZHVnbGkgCToJMQk6CTAKK1RhbHVkaSAJOgkxCToJMAorQm9yIAk6CTEJOgkwCitLYXNzYWxhIAk6CTEJOgkxMjEzMDAwCitLYXNzYWxhIAk6CTEJOgk5NTcwMDAKK0F0YmFyYSBSaXZlciAJOgkxCToJMjU2MDAwCitTZXR0ZXQgCToJMQk6CTAKK0VsIEdhc2ggCToJMQk6CTAKK0hhbWFza29yYWJlIAk6CTEJOgkwCitBbC1EYW1hciAJOgkxCToJOTM2MDAwCitCZXJiZXIgCToJMQk6CTMwODAwMAorRWRkYW1lciAJOgkxCToJMjk5MDAwCitTaGVuZGkgCToJMQk6CTE2ODAwMAorTWF0YW1tYSAJOgkxCToJMTQwMDAwCitBYm8gSGFtZWQgCToJMQk6CTIxMDAwCitBd2lsIAk6CTEJOgkwCitBbC1GYXNoaXIgCToJMQk6CTE1NTIwMDAKK0t1dHVtIAk6CTEJOgkwCitGYXNoaXIgCToJMQk6CTAKK1Vta2FkYWRhIAk6CTEJOgkwCitLYWJrYWRpYSAJOgkxCToJMAorQWwtT2JlaWQgCToJMQk6CTE1MzAwMDAKK1NvZGFyaSAJOgkxCToJMTIyMDAwCitCYXJhIAk6CTEJOgk0MTMwMDAKK1VtcndhYmEgCToJMQk6CTc4MDAwMAorU2hpa2FuIAk6CTEJOgkxODQwMDAKK0hhbXJhdCBFbHNoaWVrIAk6CTEJOgkzMTAwMAorU2VubmFyIAk6CTEJOgk2MDYwMDAKK0RpbmRpciAJOgkxCToJMzcxMDAwCitTaW5nYSAJOgkxCToJMjU5MDAwCitXYXJhcCAJOgkxCToJMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NVUklOQU1FX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NVUklOQU1FX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MjQyNTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU1VSSU5BTUVfQVJFQS50eHQKQEAgLTAsMCArMSwxMSBAQAorU3VyaW5hbWUJOgkwCToJMTYzMjcwCitCcm9rb3BvbmRvICAJOgkxCToJNzM2NAorQ29tbWV3aWpuZSAJOgkxCToJMjM1MworQ29yb25pZSAJOgkxCToJMzkwMgorTWFyb3dpam5lIAk6CTEJOgk0NjI3CitOaWNrZXJpZSAJOgkxCToJNTM1MworUGFyYSAJOgkxCToJNTM5MworUGFyYW1hcmlibyAJOgkxCToJMTgzCitTYXJhbWFjY2EgCToJMQk6CTM2MzYKK1NpcGFsaXdpbmkgCToJMQk6CTEzMDU2NworV2FuaWNhIAk6CTEJOgk0NDMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TVVJJTkFNRV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TVVJJTkFNRV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjEyYTNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NVUklOQU1FX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMTIgQEAKK1N1cmluYW1lCToJMAk6CTQzOTExNworQnJva29wb25kbyAgCToJMQk6CTE0MjE1CitDb21tZXdpam5lIAk6CTEJOgkyNDY0OQorQ29yb25pZSAJOgkxCToJMjg4NworTWFyb3dpam5lIAk6CTEJOgkxNjY0MgorTmlja2VyaWUgCToJMQk6CTM2NjM5CitQYXJhIAk6CTEJOgkxODc0OQorUGFyYW1hcmlibyAJOgkxCToJMjQyOTQ2CitTYXJhbWFjY2EgCToJMQk6CTE1OTgwCitTaXBhbGl3aW5pIAk6CTEJOgkzNDEzNgorV2FuaWNhIAk6CTEJOgk4NTk4NgorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU1dFREVOX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NXRURFTl9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGRkNTE2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NXRURFTl9BUkVBLnR4dApAQCAtMCwwICsxLDI1IEBACisgU1dFREVOIDogMCAgOiA0NDk5NjQKKyBOb3JyYm90dGVuIDogMSA6IDk4OTEwLjAKKyBWhHN0ZXJib3R0ZW4gOiAxIDogNTU0MDEuMAorIEqEbXRsYW5kIDogMSA6IDQ5NDQzLjAKKyBWhHN0ZXJub3JybGFuZCA6IDEgOiAyMTY3OC4wCisgR4R2bGVib3JnIDogMSA6IDE4MTkxLjAKKyBLb3BwYXJiZXJnIDogMSA6IDI4MTkzLjAKKyBWhHJtbGFuZCA6IDEgOiAxNzU4My4wCisgVXBwc2FsYSA6IDEgOiA2OTg5LjAKKyBWIHN0bWFubGFuZCA6IDEgOiA2MzAyLjAKKyBTdG9ja2hvbG0gOiAxIDogNjQ4Ny4wCisgT3JlYnJvIDogMSA6IDg1MTguMAorIFOUcm1sYW5kIDogMSA6IDYwNjAuMAorIFpsdnNib3JnIDogMSA6IDExMzk1LjAKKyBClGh1cyA6IDEgOiA1NDEwLjAKKyBTa2FyYWJvcmcgOiAxIDogNzkzNi4wCisgT3N0ZXJnlHRsYW5kIDogMSA6IDEwNTYyLjAKKyBHb3RsYW5kIDogMSA6IDMxNDAuMAorIEqUbmuUcGluZyA6IDEgOiA5OTQzLjAKKyBLYWxtYXIgOiAxIDogMTExNzEuMAorIEhhbGxhbmQgOiAxIDogNTQ1NC4wCisgS3Jvbm9iZXJnIDogMSA6IDg0NTcuMAorIEtyaXN0aWFuc3RhZCA6IDEgOiA2MDg4LjAKKyBCbGVraW5nZSA6IDEgOiAyOTQxLjAKKyBNYWxtlGh1cyA6IDEgOiA0OTM4LjAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TV0VERU5fUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU1dFREVOX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Y2M2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU1dFREVOX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMjQgQEAKKyBOb3JyYm90dGVuIDogMSA6IDI2MzczNQorIFaEc3RlcmJvdHRlbiA6IDEgOiAyNTE5NjgKKyBKhG10bGFuZCA6IDEgOiAxMzU3MjYKKyBWhHN0ZXJub3JybGFuZCA6IDEgOiAyNjExNTUKKyBHhHZsZWJvcmcgOiAxIDogMjg5Mjk0CisgS29wcGFyYmVyZyA6IDEgOiAyODkwNjcKKyBWhHJtbGFuZCA6IDEgOiAyODMxMTAKKyBVcHBzYWxhIDogMSA6IDI2ODgzNQorIFYgc3RtYW5sYW5kIDogMSA6IDI1ODQ4NworIFN0b2NraG9sbSA6IDEgOiAxNjQxNjY5CisgT3JlYnJvIDogMSA6IDI3MjUxMworIFOUcm1sYW5kIDogMSA6IDI1NTYzNgorIFpsdnNib3JnIDogMSA6IDQ0MTM5MQorIEKUaHVzIDogMSA6IDczOTk0NQorIFNrYXJhYm9yZyA6IDEgOiAyNzY4MzAKKyBPc3RlcmeUdGxhbmQgOiAxIDogNDAzMDExCisgR290bGFuZCA6IDEgOiA1NzEwOAorIEqUbmuUcGluZyA6IDEgOiAzMDgyOTAKKyBLYWxtYXIgOiAxIDogMjQxMTAyCisgSGFsbGFuZCA6IDEgOiAyNTQ3MjUKKyBLcm9ub2JlcmcgOiAxIDogMTc3ODgyCisgS3Jpc3RpYW5zdGFkIDogMSA6IDI4OTI3OAorIEJsZWtpbmdlIDogMSA6IDE1MDU2NAorIE1hbG2UaHVzIDogMSA6IDc3OTMwOQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NXSVRaRVJMQU5EX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NXSVRaRVJMQU5EX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMWQwZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU1dJVFpFUkxBTkRfQVJFQS50eHQKQEAgLTAsMCArMSwyNiBAQAorIFNXSVRaRVJMQU5EIDogMCAgOjQxMjg1CisgU2NoYWZmaGF1c2VuIDogMSA6IDI5OC4wCisgVGh1cmdhdSA6IDEgOiAxMDEyLjAKKyBadXJpY2ggOiAxIDogMTcyOC4wCisgQWFyZ2F1IDogMSA6IDE0MDQuMAorIEJhc2VsLVN0YWR0IDogMSA6IDM3LjAKKyBCYXNlbC1MYW5kc2NoYWZ0IDogMSA6IDQyOC4wCisgU2Fua3QgR2FsbGVuIDogMSA6IDIwMTQuMAorIEJlcm4vQmVybmUgOiAxIDogNjA0OS4wCisgU29sb3RodXJuIDogMSA6IDc5MC4wCisgQXBwZW56ZWxsIEF1c3NlcnJob2RlbiA6IDEgOiAyNDMuMAorIEFwcGVuemVsbCBJbm5lcnJob2RlbiA6IDEgOiAxNzIuMAorIEx1emVybiA6IDEgOiAxNDkyLjAKKyBadWcgOiAxIDogMjM4LjAKKyBTY2h3eXogOiAxIDogOTA4LjAKKyBHbGFydXMgOiAxIDogNjg0LjAKKyBOZXVjaGF0ZWwgOiAxIDogNzk2LjAKKyBHcmF1Yj9uZGVuL0dyaWdpb25pL0dyaXNjaHVuIDogMSA6IDcxMDUuMAorIEZyaWJvdXJnL0ZyZWlidXJnIDogMSA6IDE2NzAuMAorIE1pZHdhbGRlbiA6IDEgOiAyNzUuMAorIFVyaSA6IDEgOiAxMDc2LjAKKyBPYndhbGRlbiA6IDEgOiA0OTAuMAorIFZhdWQgOiAxIDogMzIxOS4wCisgVmFsYWlzL1dhbGxpcyA6IDEgOiA1MjI1LjAKKyBUaWNpbm8gOiAxIDogMjgxMC4wCisgR2VuinZlIDogMSA6IDI4Mi4wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU1dJVFpFUkxBTkRfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU1dJVFpFUkxBTkRfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiZjE4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TV0lUWkVSTEFORF9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDI1IEBACisgU2NoYWZmaGF1c2VuIDogMSA6IDcxNjk3CisgVGh1cmdhdSA6IDEgOiAyMDU5NDYKKyBadXJpY2ggOiAxIDogMTE1MDU0NgorIEFhcmdhdSA6IDEgOiA0OTYyODAKKyBCYXNlbC1TdGFkdCA6IDEgOiAxOTE3ODcKKyBCYXNlbC1MYW5kc2NoYWZ0IDogMSA6IDIzMDExMgorIFNhbmt0IEdhbGxlbiA6IDEgOiA0MjAyNjgKKyBCZXJuL0Jlcm5lIDogMSA6IDk0NTU3MworIFNvbG90aHVybiA6IDEgOiAyMjY2NTUKKyBBcHBlbnplbGwgQXVzc2VycmhvZGVuIDogMSA6IDUxNDcwCisgQXBwZW56ZWxsIElubmVycmhvZGVuIDogMSA6IDEzNTczCisgTHV6ZXJuIDogMSA6IDMxOTUyNQorIFp1ZyA6IDEgOiA4NDkwOAorIFNjaHd5eiA6IDEgOiAxMTA1MjYKKyBHbGFydXMgOiAxIDogMzc2NDgKKyBOZXVjaGF0ZWwgOiAxIDogMTYwNjA5CisgR3JhdWI/bmRlbi9HcmlnaW9uaS9HcmlzY2h1biA6IDEgOiAxNzA0MTEKKyBGcmlib3VyZy9GcmVpYnVyZyA6IDEgOiAyMDc3NTEKKyBNaWR3YWxkZW4gOiAxIDogMzI2MjgKKyBVcmkgOiAxIDogMzM2NTAKKyBPYndhbGRlbiA6IDEgOiAyODgxMworIFZhdWQgOiAxIDogNTgzNjI1CisgVmFsYWlzL1dhbGxpcyA6IDEgOiAyNDgzMTMKKyBUaWNpbm8gOiAxIDogMjg2NzI1CisgR2VuinZlIDogMSA6IDM3NTk1NwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NZUklBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NZUklBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NTg2MDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvU1lSSUFfQVJFQS50eHQKQEAgLTAsMCArMSwxNSBAQAorU3lyaWEJOgkwCToJMTg1MTgwCitIYXNha2EgKEFMIEhha3NhKQk6CTEJOgkyMzMzNAorTGF0dGFraWEgKEFsIExhZGhpcWl5YWgJOgkxCToJMjI5NworS3VuZWl0cmEgKEVsIFF1bmF5dGlyYWgJOgkxCToJMTg2MQorQXIgUmFxcWFoCToJMQk6CTE5NjE2CitBcyBTdXdheWRhCToJMQk6CTU1NTAKK0RhcmEJOgkxCToJMzczMAorRGF5ciBBeiBaYXdyCToJMQk6CTMzMDYwCitEaW1hc2hxCToJMQk6CTEwNQorQWxlcHBvIChIYWxhYikgCToJMQk6CTE4NTAwCitIYW1haCAJOgkxCToJODg4MworSG9tcyAoSGltcykgCToJMQk6CTQyMjIzCitJZGxpYiAJOgkxCToJNjA5NworUmlmIERpbWFzaHEgCToJMQk6CTE4MDMyCitUYXJ0dXMgCToJMQk6CTE4OTIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TWVJJQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9TWVJJQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjExYmNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1NZUklBX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMTUgQEAKK1N5cmlhCToJMAk6CTE4ODgxMzYxCitIYXNha2EgKEFMIEhha3NhKQk6CTEJOgkxMjY1MDAwCitMYXR0YWtpYSAoQWwgTGFkaGlxaXlhaAk6CTEJOgk4NzYwMDAKK0t1bmVpdHJhIChFbCBRdW5heXRpcmFoCToJMQk6CTY2MDAwCitBciBSYXFxYWgJOgkxCToJNjkxMDAwCitBcyBTdXdheWRhCToJMQk6CTMwNzAwMAorRGFyYQk6CTEJOgk3ODAwMDAKK0RheXIgQXogWmF3cgk6CTEJOgk5MTkwMDAKK0RpbWFzaHEJOgkxCToJMTY1MzAwMAorQWxlcHBvIChIYWxhYikgCToJMQk6CTM3MTkwMDAKK0hhbWFoIAk6CTEJOgkxMzM1MDAwCitIb21zIChIaW1zKSAJOgkxCToJMTQ5MDAwMAorSWRsaWIgCToJMQk6CTExMjAwMDAKK1JpZiBEaW1hc2hxIAk6CTEJOgkyMjM1MDAwCitUYXJ0dXMgCToJMQk6CTY3NDAwMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1RBSklLSVNUQU5fQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVEFKSUtJU1RBTl9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTMyYzYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1RBSklLSVNUQU5fQVJFQS50eHQKQEAgLTAsMCArMSw2IEBACitUYWppa2lzdGFuCToJMAk6CTE0MzEwMAorRHVzaGFuYmUJOgkxCToJMTAwCitLaGF0bG9uCToJMQk6CTI0ODAwCitHb3Juby1CYWRha2hzaGFuCToJMQk6CTY0MjAwCitSUlMgW1RhZHpoaWtpc3RhbiBUZXJyaXRvcmllc10JOgkxCToJMjg2MDAKK0todWphbmQgW0xlbmluYWJhZF0JOgkxCToJMjU0MDAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9UQUpJS0lTVEFOX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1RBSklLSVNUQU5fUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3MTA3YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9UQUpJS0lTVEFOX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsNiBAQAorVGFqaWtpc3Rhbgk6CTAJOgk3MzIwODE1CitEdXNoYW5iZQk6CTEJOgk2MzE3MDAKK0toYXRsb24JOgkxCToJMjQyNDEwMAorR29ybm8tQmFkYWtoc2hhbgk6CTEJOgkyMTc5MDAKK1JSUyBbVGFkemhpa2lzdGFuIFRlcnJpdG9yaWVzXQk6CTEJOgkxNDk4OTAwCitLaHVqYW5kIFtMZW5pbmFiYWRdCToJMQk6CTIwMjc4MDAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9UQU5aQU5JQSBVTklURUQgUkVQVUJMSUNfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZDM1NWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDX0FSRUEudHh0CkBAIC0wLDAgKzEsMjggQEAKK1RhbnphbmlhIFVuaXRlZCBSZXB1YmxpYwk6CTAJOgk5NDUwODcKK0wuIFZpY3RvcmlhIDogMSA6IDY4ODAwCitBcnVzaGEgICAJOgkxCToJMzY0ODYKK0Rhci1lcy1TYWxhYW0gCToJMQk6CTEzOTMKK0RvZG9tYSAJOgkxCToJNDEzMTEKK0lyaW5nYSAJOgkxCToJNTY4NjQKK0thZ2VyYSAJOgkxCToJMjgzODgKK0thc2themluaS1QZW1iYSAJOgkxCToJNTc0CitLYXNrYXppbmktVW5ndWphIAk6CTEJOgk0NzAKK0tpZ29tYSAJOgkxCToJMzcwMzcKK0tpbGltYW5qYXJvIAk6CTEJOgkxMzMwOQorS3VzaW5pIFBlbWJhIAk6CTEJOgkzMzIKK0t1c2luaSBVbmd1amEgCToJMQk6CTg1NAorTGluZGkgCToJMQk6CTY2MDQ2CitNYW55YXJhIAk6CTEJOgk0NTgyMAorTWFyYSAJOgkxCToJMTk1NjYKK01iZXlhIAk6CTEJOgk2MDM1MAorTWppbmktTWFnaGFyaWJpCToJMQk6CTIzMAorTW9yb2dvcm8gCToJMQk6CTcwNzk5CitNdHdhcmEgCToJMQk6CTE2NzA3CitNd2FuemEgCToJMQk6CTE5NTkyCitQd2FuaSAJOgkxCToJMzI0MDcKK1J1a3dhIAk6CTEJOgk2ODYzNQorUnV2dW1hIAk6CTEJOgk2MzQ5OAorU2hpbnlhbmdhIAk6CTEJOgk1MDc4MQorU2luZ2lkYSAJOgkxCToJNDkzNDEKK1RhYm9yYSAJOgkxCToJNzYxNTEKK1RhbmdhIAk6CTEJOgkyNjgwOApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1RBTlpBTklBIFVOSVRFRCBSRVBVQkxJQ19QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9UQU5aQU5JQSBVTklURUQgUkVQVUJMSUNfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5OGEyYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9UQU5aQU5JQSBVTklURUQgUkVQVUJMSUNfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwyOCBAQAorVGFuemFuaWEgVW5pdGVkIFJlcHVibGljCToJMAk6CTM3NDQ1MzkyCitMLiBWaWN0b3JpYSA6IDEgOiAwCitBcnVzaGEgICAJOgkxCToJMTI4ODA4OAorRGFyLWVzLVNhbGFhbSAJOgkxCToJMjQ4NzI4OAorRG9kb21hIAk6CTEJOgkxNjkyMDI1CitJcmluZ2EgCToJMQk6CTE0OTA4OTIKK0thZ2VyYSAJOgkxCToJMjAyODE1NworS2Fza2F6aW5pLVBlbWJhIAk6CTEJOgkxODUzMjYKK0thc2themluaS1Vbmd1amEgCToJMQk6CTEzNjYzOQorS2lnb21hIAk6CTEJOgkxNjc0MDQ3CitLaWxpbWFuamFybyAJOgkxCToJMTM3NjcwMgorS3VzaW5pIFBlbWJhIAk6CTEJOgkxNzU0NzEKK0t1c2luaSBVbmd1amEgCToJMQk6CTk0MjQ0CitMaW5kaSAJOgkxCToJNzg3NjI0CitNYW55YXJhIAk6CTEJOgkxMDM3NjA1CitNYXJhIAk6CTEJOgkxMzYzMzk3CitNYmV5YSAJOgkxCToJMjA2MzMyOAorTWppbmktTWFnaGFyaWJpCToJMQk6CTM5MDA3NAorTW9yb2dvcm8gCToJMQk6CTE3NTMzNjIKK010d2FyYSAJOgkxCToJMTEyNDQ4MQorTXdhbnphIAk6CTEJOgkyOTI5NjQ0CitQd2FuaSAJOgkxCToJODg1MDE3CitSdWt3YSAJOgkxCToJMTEzNjM1NAorUnV2dW1hIAk6CTEJOgkxMTEzNzE1CitTaGlueWFuZ2EgCToJMQk6CTI3OTY2MzAKK1NpbmdpZGEgCToJMQk6CTEwODY3NDgKK1RhYm9yYSAJOgkxCToJMTcxMDQ2NQorVGFuZ2EgCToJMQk6CTE2MzYyODAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9UQU5aQU5JQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9UQU5aQU5JQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWQzNTViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1RBTlpBTklBX0FSRUEudHh0CkBAIC0wLDAgKzEsMjggQEAKK1RhbnphbmlhIFVuaXRlZCBSZXB1YmxpYwk6CTAJOgk5NDUwODcKK0wuIFZpY3RvcmlhIDogMSA6IDY4ODAwCitBcnVzaGEgICAJOgkxCToJMzY0ODYKK0Rhci1lcy1TYWxhYW0gCToJMQk6CTEzOTMKK0RvZG9tYSAJOgkxCToJNDEzMTEKK0lyaW5nYSAJOgkxCToJNTY4NjQKK0thZ2VyYSAJOgkxCToJMjgzODgKK0thc2themluaS1QZW1iYSAJOgkxCToJNTc0CitLYXNrYXppbmktVW5ndWphIAk6CTEJOgk0NzAKK0tpZ29tYSAJOgkxCToJMzcwMzcKK0tpbGltYW5qYXJvIAk6CTEJOgkxMzMwOQorS3VzaW5pIFBlbWJhIAk6CTEJOgkzMzIKK0t1c2luaSBVbmd1amEgCToJMQk6CTg1NAorTGluZGkgCToJMQk6CTY2MDQ2CitNYW55YXJhIAk6CTEJOgk0NTgyMAorTWFyYSAJOgkxCToJMTk1NjYKK01iZXlhIAk6CTEJOgk2MDM1MAorTWppbmktTWFnaGFyaWJpCToJMQk6CTIzMAorTW9yb2dvcm8gCToJMQk6CTcwNzk5CitNdHdhcmEgCToJMQk6CTE2NzA3CitNd2FuemEgCToJMQk6CTE5NTkyCitQd2FuaSAJOgkxCToJMzI0MDcKK1J1a3dhIAk6CTEJOgk2ODYzNQorUnV2dW1hIAk6CTEJOgk2MzQ5OAorU2hpbnlhbmdhIAk6CTEJOgk1MDc4MQorU2luZ2lkYSAJOgkxCToJNDkzNDEKK1RhYm9yYSAJOgkxCToJNzYxNTEKK1RhbmdhIAk6CTEJOgkyNjgwOApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1RBTlpBTklBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1RBTlpBTklBX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOThhMmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVEFOWkFOSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwyOCBAQAorVGFuemFuaWEgVW5pdGVkIFJlcHVibGljCToJMAk6CTM3NDQ1MzkyCitMLiBWaWN0b3JpYSA6IDEgOiAwCitBcnVzaGEgICAJOgkxCToJMTI4ODA4OAorRGFyLWVzLVNhbGFhbSAJOgkxCToJMjQ4NzI4OAorRG9kb21hIAk6CTEJOgkxNjkyMDI1CitJcmluZ2EgCToJMQk6CTE0OTA4OTIKK0thZ2VyYSAJOgkxCToJMjAyODE1NworS2Fza2F6aW5pLVBlbWJhIAk6CTEJOgkxODUzMjYKK0thc2themluaS1Vbmd1amEgCToJMQk6CTEzNjYzOQorS2lnb21hIAk6CTEJOgkxNjc0MDQ3CitLaWxpbWFuamFybyAJOgkxCToJMTM3NjcwMgorS3VzaW5pIFBlbWJhIAk6CTEJOgkxNzU0NzEKK0t1c2luaSBVbmd1amEgCToJMQk6CTk0MjQ0CitMaW5kaSAJOgkxCToJNzg3NjI0CitNYW55YXJhIAk6CTEJOgkxMDM3NjA1CitNYXJhIAk6CTEJOgkxMzYzMzk3CitNYmV5YSAJOgkxCToJMjA2MzMyOAorTWppbmktTWFnaGFyaWJpCToJMQk6CTM5MDA3NAorTW9yb2dvcm8gCToJMQk6CTE3NTMzNjIKK010d2FyYSAJOgkxCToJMTEyNDQ4MQorTXdhbnphIAk6CTEJOgkyOTI5NjQ0CitQd2FuaSAJOgkxCToJODg1MDE3CitSdWt3YSAJOgkxCToJMTEzNjM1NAorUnV2dW1hIAk6CTEJOgkxMTEzNzE1CitTaGlueWFuZ2EgCToJMQk6CTI3OTY2MzAKK1NpbmdpZGEgCToJMQk6CTEwODY3NDgKK1RhYm9yYSAJOgkxCToJMTcxMDQ2NQorVGFuZ2EgCToJMQk6CTE2MzYyODAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9USEFJTEFORF9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9USEFJTEFORF9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2RlNWFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1RIQUlMQU5EX0FSRUEudHh0CkBAIC0wLDAgKzEsODYgQEAKK1RoYWlsYW5kCToJMAk6CTUxNDAwMAorQmFuZ2tvawk6CTEJOgk3NzYxLjYwCitLcnVuZyBUaGVwIE1hbmFraG9uIFtDZW50cmFsXQk6CTEJOgkxNTY4LjcwCitOYWtob24gUGF0aG9tIAk6CTEJOgkyMTY4LjMwCitOb250aGFidXJpIAk6CTEJOgk2MjIuMworUGF0aHVtIFRoYW5pIAk6CTEJOgkxNTI1LjkwCitTYW11dCBQcmFrYW4gCToJMQk6CTEwMDQuMTAKK1NhbXV0IFNha2hvbiAJOgkxCToJODcyLjMKK0Vhc3Rlcm4JOgkxCToJMzY1MDIuNTAKK0NoYWNob2VuZ3NhbyAJOgkxCToJNTM1MS4wMAorQ2hhbnRoYWJ1cmkgCToJMQk6CTYzMzguMDAKK0Nob24gQnVyaSAJOgkxCToJNDM2My4wMAorTmFraG9uIE5heW9rIAk6CTEJOgkyMTIyLjAwCitQcmFjaGluIEJ1cmkgCToJMQk6CTQ3NjIuNDAKK1JheW9uZyAJOgkxCToJMzU1Mi4wMAorU2EgS2FlbyAJOgkxCToJNzE5NS4xMAorVHJhdCAJOgkxCToJMjgxOS4wMAorTm9ydGhlYXN0ZXJuCToJMQk6CTE2ODg1NS4zMAorQW1uYXQgQ2hhcm9lbiAJOgkxCToJMzE2MS4yMAorQnVyaSBSYW0gCToJMQk6CTEwMzIyLjkwCitDaGFpeWFwaHVtIAk6CTEJOgkxMjc3OC4zMAorS2FsYXNpbiAJOgkxCToJNjk0Ni43MAorS2hvbiBLYWVuIAk6CTEJOgkxMDg4Ni4wMAorTG9laSAJOgkxCToJMTE0MjQuNjAKK01haGEgU2FyYWtoYW0gCToJMQk6CTUyOTEuNzAKK011a2RhaGFuIAk6CTEJOgk0MzM5LjgwCitOYWtob24gUGhhbm9tIAk6CTEJOgk1NTEyLjcwCitOYWtob24gUmF0Y2hhc2ltYSAJOgkxCToJMjA0OTQuMDAKK05vbmcgQnVhIExhbSBQaHUgCToJMQk6CTM4NTkuMDAKK05vbmcgS2hhaSAJOgkxCToJNzMzMi4zMAorUm9pIEV0IAk6CTEJOgk4Mjk5LjQwCitTYWtvbiBOYWtob24gCToJMQk6CTk2MDUuODAKK1NpIFNhIEtldCAJOgkxCToJODg0MC4wMAorU3VyaW4gCToJMQk6CTgxMjQuMTAKK1Vib24gUmF0Y2hhdGhhbmkgCToJMQk6CTE1NzQ0LjgwCitVZG9uIFRoYW5pIAk6CTEJOgkxMTczMC4zMAorWWFzb3Rob24gCToJMQk6CTQxNjEuNzAKK05vcnRoZXJuCToJMQk6CTE2OTY0NC4zMAorQ2hpYW5nIE1haSAJOgkxCToJMjAxMDcuMDAKK0NoaWFuZyBSYWkgCToJMQk6CTExNjc4LjQwCitLYW1waGFlbmcgUGhldCAJOgkxCToJODYwNy41MAorTGFtcGFuZyAJOgkxCToJMTI1MzQuMDAKK0xhbXBodW4gCToJMQk6CTQ1MDUuOTAKK01hZSBIb25nIFNvbiAJOgkxCToJMTI2ODEuMzAKK05ha2hvbiBTYXdhbiAJOgkxCToJOTU5Ny43MAorTmFuIAk6CTEJOgkxMTQ3Mi4xMAorUGhheWFvIAk6CTEJOgk2MzM1LjEwCitQaGV0Y2hhYnVuIAk6CTEJOgkxMjY2OC40MAorUGhpY2hpdCAJOgkxCToJNDUzMS4wMAorUGhpdHNhbnVsb2sgCToJMQk6CTEwODE1LjgwCitQaHJhZSAJOgkxCToJNjUzOC42MAorU3VraG90aGFpIAk6CTEJOgk2NTk2LjEwCitUYWsgCToJMQk6CTE2NDA2LjYwCitVdGhhaSBUaGFuaSAJOgkxCToJNjczMC4yMAorVXR0YXJhZGl0IAk6CTEJOgk3ODM4LjYwCitTb3V0aGVybgk6CTEJOgk3MDcxNS4yMAorQ2h1bXBob24gCToJMQk6CTYwMDkuMDAKK0tyYWJpIAk6CTEJOgk0NzA4LjUwCitOYWtob24gU2kgVGhhbW1hcmF0IAk6CTEJOgk5OTQyLjUwCitOYXJhdGhpd2F0IAk6CTEJOgk0NDc1LjQwCitQYXR0YW5pIAk6CTEJOgkxOTQwLjQwCitQaGFuZ25nYSAJOgkxCToJNDE3MC45MAorUGhhdHRoYWx1bmcgCToJMQk6CTM0MjQuNTAKK1BodWtldCAJOgkxCToJNTQzCitSYW5vbmcgCToJMQk6CTMyOTguMDAKK1NhdHVuIAk6CTEJOgkyNDc5LjAwCitTb25na2hsYSAJOgkxCToJNzM5My45MAorU3VyYXQgVGhhbmkgCToJMQk6CTEyODkxLjUwCitUcmFuZyAJOgkxCToJNDkxNy41MAorWWFsYSAJOgkxCToJNDUyMS4xMAorU3ViIENlbnRyYWwJOgkxCToJMTY1OTMuNTAKK0FuZyBUaG9uZyAJOgkxCToJOTY4LjQKK0NoYWkgTmF0IAk6CTEJOgkyNDY5LjcwCitMb3AgQnVyaSAJOgkxCToJNjE5OS44MAorUGhyYSBOYWtob24gU2kgQXl1dHRoYXlhIAk6CTEJOgkyNTU2LjYwCitTYXJhYnVyaSAJOgkxCToJMzU3Ni41MAorU2luZyBCdXJpIAk6CTEJOgk4MjIuNQorV2VzdGVybiBSZWdpb24gCToJMQk6CTQzMDQ3LjEwCitLYW5jaGFuYWJ1cmkgCToJMQk6CTE5NDgzLjIwCitQaGV0Y2hhYnVyaSAJOgkxCToJNjIyNS4xMAorUHJhY2h1YXAgS2hpcmkgS2hhbiAJOgkxCToJNjM2Ny42MAorUmF0Y2hhYnVyaSAJOgkxCToJNTE5Ni41MAorU2FtdXQgU29uZ2tocmFtIAk6CTEJOgk0MTYuNworU3VwaGFuIEJ1cmkgCToJMQk6CTUzNTguMDAKKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVEhBSUxBTkRfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVEhBSUxBTkRfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdjZWQyZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9USEFJTEFORF9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDg0IEBACitUaGFpbGFuZAk6CTAJOgk2NDYzMTU5NQorQmFuZ2tvawk6CTEJOgk5NjY4ODU0CitLcnVuZyBUaGVwIE1hbmFraG9uIFtDZW50cmFsXQk6CTEJOgk1NzgyMTU5CitOYWtob24gUGF0aG9tIAk6CTEJOgk4MDE5NTYKK05vbnRoYWJ1cmkgCToJMQk6CTkwNTE5NworUGF0aHVtIFRoYW5pIAk6CTEJOgk3MDg5MDkKK1NhbXV0IFByYWthbiAJOgkxCToJMTAyNzcxOQorU2FtdXQgU2FraG9uIAk6CTEJOgk0NDI5MTQKK0Vhc3Rlcm4JOgkxCToJNDMwMDUxMworQ2hhY2hvZW5nc2FvIAk6CTEJOgk2NDk3NTgKK0NoYW50aGFidXJpIAk6CTEJOgk1MDYwMTEKK0Nob24gQnVyaSAJOgkxCToJMTEyOTg4NgorTmFraG9uIE5heW9rIAk6CTEJOgkyNTEwNjQKK1ByYWNoaW4gQnVyaSAJOgkxCToJNDUyODIyCitSYXlvbmcgCToJMQk6CTU0NjU3MAorU2EgS2FlbyAJOgkxCToJNTM5MTA3CitUcmF0IAk6CTEJOgkyMjUyOTUKK05vcnRoZWFzdGVybgk6CTEJOgkyMTYwOTE4NQorQW1uYXQgQ2hhcm9lbiAJOgkxCToJMzcwMzYwCitCdXJpIFJhbSAJOgkxCToJMTU0NTc3OQorQ2hhaXlhcGh1bSAJOgkxCToJMTEzNjUwOAorS2FsYXNpbiAJOgkxCToJOTkwMjEyCitLaG9uIEthZW4gCToJMQk6CTE3Njc2NDMKK0xvZWkgCToJMQk6CTYzNTU4NworTWFoYSBTYXJha2hhbSAJOgkxCToJOTQyOTA5CitNdWtkYWhhbiAJOgkxCToJMzM4Mjc2CitOYWtob24gUGhhbm9tIAk6CTEJOgk3MjE1NDAKK05ha2hvbiBSYXRjaGFzaW1hIAk6CTEJOgkyNTgxMjQ0CitOb25nIEJ1YSBMYW0gUGh1IAk6CTEJOgk0OTg1MTMKK05vbmcgS2hhaSAJOgkxCToJOTA5NTQzCitSb2kgRXQgCToJMQk6CTEzMjI4NjQKK1Nha29uIE5ha2hvbiAJOgkxCToJMTEwNzc1MgorU2kgU2EgS2V0IAk6CTEJOgkxNDU4OTY5CitTdXJpbiAJOgkxCToJMTM5OTM3NworVWJvbiBSYXRjaGF0aGFuaSAJOgkxCToJMTc5Mjc3NAorVWRvbiBUaGFuaSAJOgkxCToJMTUzNTQ3MQorWWFzb3Rob24gCToJMQk6CTU1Mzg2NAorTm9ydGhlcm4JOgkxCToJMTIxNTI1MDIKK0NoaWFuZyBNYWkgCToJMQk6CTE1OTU4NTUKK0NoaWFuZyBSYWkgCToJMQk6CTEyNzQyMTQKK0thbXBoYWVuZyBQaGV0IAk6CTEJOgk3NjgxMzAKK0xhbXBhbmcgCToJMQk6CTgwMDc3NQorTGFtcGh1biAJOgkxCToJNDA3MjAyCitNYWUgSG9uZyBTb24gCToJMQk6CTI0MDAxNAorTmFraG9uIFNhd2FuIAk6CTEJOgkxMTMwODQxCitOYW4gCToJMQk6CTQ4Nzc0MgorUGhheWFvIAk6CTEJOgk1MDg1NTQKK1BoZXRjaGFidW4gCToJMQk6CTEwNDA3ODYKK1BoaWNoaXQgCToJMQk6CTU5MTk1MworUGhpdHNhbnVsb2sgCToJMQk6CTg2NzY4NQorUGhyYWUgCToJMQk6CTQ4NTEyMQorU3VraG90aGFpIAk6CTEJOgk2MjUwOTkKK1RhayAJOgkxCToJNTA3MzcxCitVdGhhaSBUaGFuaSAJOgkxCToJMzM2MTc2CitVdHRhcmFkaXQgCToJMQk6CTQ4NDk4NAorU291dGhlcm4JOgkxCToJODQxNTkwOAorQ2h1bXBob24gCToJMQk6CTQ3MzgxOAorS3JhYmkgCToJMQk6CTM3Nzk1NAorTmFraG9uIFNpIFRoYW1tYXJhdCAJOgkxCToJMTUzMzg5NAorTmFyYXRoaXdhdCAJOgkxCToJNjk5OTUxCitQYXR0YW5pIAk6CTEJOgk2Mjc5NTUKK1BoYW5nbmdhIAk6CTEJOgkyMzk0MDEKK1BoYXR0aGFsdW5nIAk6CTEJOgk1MDQ0NTQKK1BodWtldCAJOgkxCToJMjcwNDM4CitSYW5vbmcgCToJMQk6CTE2MzE2MAorU2F0dW4gCToJMQk6CTI3MDgwMgorU29uZ2tobGEgCToJMQk6CTEyNzEwNjcKK1N1cmF0IFRoYW5pIAk6CTEJOgk5MjAyODMKK1RyYW5nIAk6CTEJOgk2MDMwNzIKK1lhbGEgCToJMQk6CTQ1OTY1OQorU3ViIENlbnRyYWwJOgkxCToJMzAwMjU0NAorQW5nIFRob25nIAk6CTEJOgkyOTA0MjMKK0NoYWkgTmF0IAk6CTEJOgkzNTA1NDcKK0xvcCBCdXJpIAk6CTEJOgk3Njc5ODUKK1BocmEgTmFraG9uIFNpIEF5dXR0aGF5YSAJOgkxCToJNzQ4MjQzCitTYXJhYnVyaSAJOgkxCToJNjIxOTk0CitTaW5nIEJ1cmkgCToJMQk6CTIyMzM1MgorV2VzdGVybiBSZWdpb24gCToJMQk6CTM2NTAzNjYKK0thbmNoYW5hYnVyaSAJOgkxCToJODAxODM2CitQaGV0Y2hhYnVyaSAJOgkxCToJNDYxMzM5CitQcmFjaHVhcCBLaGlyaSBLaGFuIAk6CTEJOgk0ODg0NzcKK1JhdGNoYWJ1cmkgCToJMQk6CTgzMDI3NQorU2FtdXQgU29uZ2tocmFtIAk6CTEJOgkyMDUxMzUKK1N1cGhhbiBCdXJpIAk6CTEJOgk4NjMzMDQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9UT0dPX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1RPR09fQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhYzYyYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9UT0dPX0FSRUEudHh0CkBAIC0wLDAgKzEsMzYgQEAKK1RvZ28JOgkwCToJNTY3ODUKK0NlbnRyZQk6CTEJOgkxMzMxNworQmxpdHRhIAk6CTIJOgkyOTczCitTb3RvdWJvdWEgCToJMgk6CTQ0ODcKK1RjaGFtYmEgCToJMgk6CTMxNDkKK1RjaGFvdWRqbyAJOgkyCToJMjcwOAorS2FyYQk6CTEJOgkxMTczOAorQXNzb2xpIAk6CTIJOgk5MzgKK0Jhc3NhciAJOgkyCToJMzYyMAorQmluYWggCToJMgk6CTQ4MAorRGFua3BlbiAJOgkyCToJMjY5MAorRG91ZmVsZ291IAk6CTIJOgkxMjc1CitLZXJhbiAJOgkyCToJMTY2MAorS296YWggCToJMgk6CTEwNzUKK01hcml0aW1lCToJMQk6CTYxMDAKK0F2ZSAJOgkyCToJMTE0NgorR29sZmUgCToJMgk6CTI4MAorTGFjcyAJOgkyCToJNzA2CitWbyAJOgkyCToJNzE0CitZb3RvIAk6CTIJOgkxMjAwCitaaW8gCToJMgk6CTIwNTQKK1BsYXRlYXV4CToJMQk6CTE2OTc1CitBZ291IAk6CTIJOgkxMDI2CitBbW91IAk6CTIJOgkyMDAzCitEYW55aSAJOgkyCToJMzg3CitFc3QtTW9ubyAJOgkyCToJMjQ3NAorSGFobyAJOgkyCToJMzAzNAorS2xvdG8gCToJMgk6CTEzNjQKK01veWVuLU1vbm8gCToJMgk6CTYwNworT2dvdSAJOgkyCToJMzYwOQorV2F3YSAJOgkyCToJMjQ3MQorU2F2YW5lcwk6CTEJOgk4NDcwCitLcGVuZGphbCAJOgkyCToJMTc5NAorT3RpIAk6CTIJOgk0MzEzCitUYW5kam9hcmUgCToJMgk6CTg0OAorVG9uZSAJOgkyCToJMTUxNQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1RPR09fUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVE9HT19QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDU0MTJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1RPR09fUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwzNiBAQAorVG9nbwk6CTAJOgk1NTQ4NzAyCitDZW50cmUxCToJMQk6CTUxMDQ0NgorQmxpdHRhIAk6CTIJOgkxMTE5OTcKK1NvdG91Ym91YSAJOgkyCToJMTQxMDczCitUY2hhbWJhIAk6CTIJOgk4Mzk5NworVGNoYW91ZGpvIAk6CTIJOgkxNzMzNzkKK0thcmEJOgkxCToJNjg5MjEwCitBc3NvbGkgCToJMgk6CTUzODQ1CitCYXNzYXIgCToJMgk6CTEwODc2NgorQmluYWggCToJMgk6CTY3ODQ0CitEYW5rcGVuIAk6CTIJOgk3NzUzNgorRG91ZmVsZ291IAk6CTIJOgk4NzIyOAorS2VyYW4gCToJMgk6CTczMjI5CitLb3phaCAJOgkyCToJMjIwNzYzCitNYXJpdGltZQk6CTEJOgkyMTk2ODU3CitBdmUgCToJMgk6CTkxNTM2CitHb2xmZSAJOgkyCToJMTIyNDQyNQorTGFjcyAJOgkyCToJMjM0NzYyCitWbyAJOgkyCToJMjI1MDcwCitZb3RvIAk6CTIJOgkxNTkzODAKK1ppbyAJOgkyCToJMjYxNjg0CitQbGF0ZWF1eAk6CTEJOgkxMjAxODEwCitBZ291IAk6CTIJOgk4ODMwNQorQW1vdSAJOgkyCToJMTAwMTUxCitEYW55aSAJOgkyCToJNDMwNzYKK0VzdC1Nb25vIAk6CTIJOgk3OTY5MAorSGFobyAJOgkyCToJMTk0OTE3CitLbG90byAJOgkyCToJMTkyNzYzCitNb3llbi1Nb25vIAk6CTIJOgk3NTM4MgorT2dvdSAJOgkyCToJMjY0OTE1CitXYXdhIAk6CTIJOgkxNjI2MTAKK1NhdmFuZXMJOgkxCToJNjI4OTA0CitLcGVuZGphbCAJOgkyCToJMTIwNjEyCitPdGkgCToJMgk6CTEzODkxOQorVGFuZGpvYXJlIAk6CTIJOgk5MjYxMworVG9uZSAJOgkyCToJMjc2NzYxCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVFVOSVNJQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9UVU5JU0lBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YTk2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVFVOSVNJQV9BUkVBLnR4dApAQCAtMCwwICsxLDMzIEBACitUdW5pc2lhCToJMAk6CTE2MzYxMAorUmVnaW9uIDEgOiAxIDogMjY2NQorUmVnaW9uIDIgOiAxIDogOTI0MQorUmVnaW9uIDMgOiAxIDogMTMxNTQKK1JlZ2lvbiA0IDogMSA6IDIxNzcyCitSZWdpb24gNSA6IDEgOiAxNDE1MQorUmVnaW9uIDYgOiAxIDogMzU3OTMKK1JlZ2lvbiA3IDogMSA6IDU0NjUyCitBcmlhbmEgCToJMQk6CTE1NTgKK0LpamEgCToJMQk6CTM1NTgKK0JlbiBBcm91cyAJOgkxCToJNzYxCitCaXplcnRlIAk6CTEJOgkzNjg1CitHYWLocyAJOgkxCToJNzE3NQorR2Fmc2EgCToJMQk6CTg5OTAKK0plbmRvdWJhIAk6CTEJOgkzMTAyCitLYWlyb3VhbiAJOgkxCToJNjcxMgorS2Fzc2VyaW5lIAk6CTEJOgk4MDY2CitL6WJpbGkgCToJMQk6CTIyMDg0CitMZSBLZWYgCToJMQk6CTQ5NjUKK01haGRpYSAJOgkxCToJMjk2NgorTWFub3ViYSAJOgkxCToJMAorTelkZW5pbmUgCToJMQk6CTg1ODgKK01vbmFzdGlyIAk6CTEJOgkxMDE5CitOYWJldWwgCToJMQk6CTI3ODgKK1NmYXggCToJMQk6CTc1NDUKK1NpZGkgQm91emlkIAk6CTEJOgk2OTk0CitTaWxpYW5hIAk6CTEJOgk0NjMxCitTb3Vzc2UgCToJMQk6CTI2MjEKK1RhdGFvdWluZSAJOgkxCToJMzg4ODkKK1RvemV1ciAJOgkxCToJNDcxOQorVHVuaXMgCToJMQk6CTM0NgorWmFnaG91YW4gCToJMQk6CTI3NjgKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1RVTklTSUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVFVOSVNJQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTE3Yzk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1RVTklTSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwzMiBAQAorVHVuaXNpYQk6CTAJOgkxMDE3NTAxNAorUmVnaW9uIDEgOiAxIDogMTk0MzYwMAorUmVnaW9uIDIgOiAxIDogMTM5NzgwMAorUmVnaW9uIDMgOiAxIDogNzk1NjAwCitSZWdpb24gNCA6IDEgOiAxMzYxMjAwCitSZWdpb24gNSA6IDEgOiAyMjc2MzAwCitSZWdpb24gNiA6IDEgOiA1Njg4MDAKK1JlZ2lvbiA3IDogMSA6IDkyNjkwMAorQXJpYW5hICAJOgkxCToJNDM2NjAwCitC6WphIAk6CTEJOgkzMDM3MDAKK0JlbiBBcm91cyAJOgkxCToJNTIxMDAwCitCaXplcnRlIAk6CTEJOgk1MjkzMDAKK0dhYuhzIAk6CTEJOgkzNDU5MDAKK0dhZnNhIAk6CTEJOgkzMjU5MDAKK0plbmRvdWJhIAk6CTEJOgk0MTgwMDAKK0thaXJvdWFuIAk6CTEJOgk1NDc3MDAKK0thc3NlcmluZSAJOgkxCToJNDE1NDAwCitL6WJpbGkgCToJMQk6CTE0NDQwMAorTGUgS2VmIAk6CTEJOgkyNTgyMDAKK01haGRpYSAJOgkxCToJMzgyMzAwCitNYW5vdWJhIAk6CTEJOgkzNDIwMDAKK03pZGVuaW5lIAk6CTEJOgk0MzcwMDAKK01vbmFzdGlyIAk6CTEJOgk0NjY3MDAKK05hYmV1bCAJOgkxCToJNzA1MjAwCitTZmF4IAk6CTEJOgk4Njk2MDAKK1NpZGkgQm91emlkIAk6CTEJOgkzOTgxMDAKK1NpbGlhbmEgCToJMQk6CTIzMzcwMAorU291c3NlIAk6CTEJOgk1NTc3MDAKK1RhdGFvdWluZSAJOgkxCToJMTQ0MDAwCitUb3pldXIgCToJMQk6CTk4NTAwCitUdW5pcyAJOgkxCToJOTg2MDAwCitaYWdob3VhbiAJOgkxCToJMTYzMzAwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVFVSS0VZX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1RVUktFWV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjUxZDhiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1RVUktFWV9BUkVBLnR4dApAQCAtMCwwICsxLDkwIEBACitUdXJrZXkJOgkwCToJNzgwNTgwCitNYXJtYXJhIEL2bGdlc2kgIAk6CTEJOgk3MzAyNy41NworQmFsaWtlc2lyIAk6CTEJOgkxNDQ3Mi43MworQmlsZWNpayAJOgkxCToJNDMwNi43NworQnVyc2EgCToJMQk6CTEwODg2LjM4CitDYW5ha2thbGUgCToJMQk6CTk5NTAuNDMKK0VkaXJuZSAJOgkxCToJNjA5Ny45MQorSXN0YW5idWwgCToJMQk6CTUzMTUuMzMKK0tpcmtsYXJlbGkgCToJMQk6CTYyOTkuNzgKK0l6bWl0IFtLb2NhZWxpXQk6CTEJOgkzNjI1LjI5CitTYWthcnlhIAk6CTEJOgk0ODgwLjE5CitUZWtpcmRhZwk6CTEJOgk2MzQyLjMwCitZYWxvdmEgCToJMQk6CTg1MC40NgorRWdlIEL2bGdlc2kgCToJMQk6CTg5OTk3LjIzCitBZnlvbiAJOgkxCToJMTQ3MTguNjMKK0F5ZGluIAk6CTEJOgk3OTA0LjQzCitEZW5pemxpIAk6CTEJOgkxMTgwNC4xOQorSXptaXIgCToJMQk6CTEyMDE1LjYxCitLdXRhaHlhIAk6CTEJOgkxMjAxMy41NworTWFuaXNhIAk6CTEJOgkxMzIyOC41MAorTXVnbGEgCToJMQk6CTEyOTQ5LjIxCitVc2FrIAk6CTEJOgk1MzYzLjA5CitBa2Rlbml6IEL2bGdlc2kgCToJMQk6CTg5ODM4LjQ5CitBZGFuYSAJOgkxCToJMTQwNDUuNTYKK0FudGFseWEgCToJMQk6CTIwNzkwLjU2CitCdXJkdXIgCToJMQk6CTcxMzQuOTUKK0FudGFreWEgKEFudGlvY2hpYSkgCToJMQk6CTU4MzEuMzYKK01lcnNpbiBbSWNlbF0JOgkxCToJMTU1MTIuMjUKK0lzcGFydGEgCToJMQk6CTg4NzEuMDgKK0suIE1hcmFzIAk6CTEJOgkxNDQ1Ni43NAorT3NtYW5peWUgCToJMQk6CTMxOTUuOTkKK0ku5yBBbmFkb2x1IEL2bGdlc2kgCToJMQk6CTE4ODA1MS41NgorQWtzYXJheSAJOgkxCToJNzk2NS41MQorQW5rYXJhIAk6CTEJOgkyNTQwMS45NAorQ2Fua2lyaSAJOgkxCToJNzQ5MS44OQorRXNraXNlaGlyIAk6CTEJOgkxMzkwMi4wMworS2FyYW1hbiAJOgkxCToJODg2OC45MAorS2F5c2VyaSAJOgkxCToJMTcxMDkuMzMKK0tpbmtrYWxlIAk6CTEJOgk0NTY5Ljc2CitLaXJzZWhpciAJOgkxCToJNjUzMC4zMgorS29ueWEgCToJMQk6CTQwODEzLjUyCitOZXZzZWhpciAJOgkxCToJNTM5MS42NAorTmlnZGUgCToJMQk6CTczNjUuMjkKK1NpdmFzIAk6CTEJOgkyODU2Ny4zNAorWW96Z2F0IAk6CTEJOgkxNDA3NC4wOQorS2FyYWRlbml6IEL2bGdlc2kgCToJMQk6CTExNjIzOS44OAorQW1hc3lhIAk6CTEJOgk1NzAzLjc4CitBcnR2aW4gCToJMQk6CTczNjcuMTAKK0JhcnQ/biAJOgkxCToJMjA4MC4zNgorQmF5YnVydCAJOgkxCToJMzczOS4wOAorQm9sdSAJOgkxCToJODMyMy4zOQorQ29ydW0gCToJMQk6CTEyNzk2LjIxCitE/HpjZSAJOgkxCToJMjU5Mi45NQorR2lyZXN1biAJOgkxCToJNjgzMS41OAorR3VtdXNoYW5lIAk6CTEJOgk2NDM3LjAxCitLYXJhYvxrIAk6CTEJOgk0MTA4LjgwCitLYXN0YW1vbnUgCToJMQk6CTEzMTU3Ljk4CitPcmR1IAk6CTEJOgk1OTUyLjQ5CitSaXplIAk6CTEJOgkzOTIxLjk4CitTYW1zdW4gCToJMQk6CTkzNjQuMTAKK1Npbm9wIAk6CTEJOgk1ODE2LjU1CitUb2thdCAJOgkxCToJMTAwNzIuNjIKK1RyYWJ6b24gCToJMQk6CTQ2NjQuMDQKK1ppbmd1bGRhayAJOgkxCToJMzMwOS44NgorRG9nKHUgQW5hZG9sdSBC9mxnZXNpIAk6CTEJOgkxNDk4OTguNTcKK0FncmkJOgkxCToJMTE0OTguNjcKK0FyZGFoYW4gCToJMQk6CTQ5NjcuNjMKK0JpbmdvbCAJOgkxCToJODI1My41MQorQml0bGlzIAk6CTEJOgk3MDk0LjUwCitFbGF6aWcJOgkxCToJOTI4MS40NQorRXJ6aW5jYW4gCToJMQk6CTExNzI3LjU1CitFcnp1cnVtIAk6CTEJOgkyNTMzMC45MAorSGFra2FyaSAJOgkxCToJNzE3OC44OAorSWcoZD9yIAk6CTEJOgkzNTg3LjgxCitLYXJzIAk6CTEJOgkxMDEzOS4wOQorTWFsYXR5YSAJOgkxCToJMTIxMDIuNzAKK011cyAJOgkxCToJODA2Ny4xNgorVHVuY2VsaSAJOgkxCToJNzY4NS42NgorVmFuIAk6CTEJOgkyMjk4My4wNgorR/xuZXlkb2codSBBbmFkb2x1IEL2bGdlc2kgCToJMQk6CTc2NTA5LjA4CitBZGl5YW1hbiAJOgkxCToJNzYwNi4xNgorQmF0bWFuIAk6CTEJOgk0NjU5LjIxCitEaXlhcmJha2lyIAk6CTEJOgkxNTIwNC4wMAorR2F6aWFudGVwIAk6CTEJOgk2ODQ0Ljg0CitLaWxpcyAJOgkxCToJMTQyNy43NgorTWFyZGluIAk6CTEJOgk4ODA2LjA0CitTYW5saXVyZmEgCToJMQk6CTE5MzM2LjIxCitTaWlydCAJOgkxCToJNTQ3My4yOQorU2lybmFrIAk6CTEJOgk3MTUxLjU3CitIYXRheSAgOiAxIDogNTU0NQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1RVUktFWV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9UVVJLRVlfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzYjg1ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9UVVJLRVlfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSw5MCBAQAorVHVya2V5CToJMAk6CTcwNDEzOTU4CitNYXJtYXJhIEL2bGdlc2kgIAk6CTEJOgkxOTE0NzAwMAorQmFsaWtlc2lyIAk6CTEJOgkxMDk3MDAwCitCaWxlY2lrIAk6CTEJOgkxOTgwMDAKK0J1cnNhIAk6CTEJOgkyMzYyMDAwCitDYW5ha2thbGUgCToJMQk6CTQ2NzAwMAorRWRpcm5lIAk6CTEJOgkzODYwMDAKK0lzdGFuYnVsIAk6CTEJOgkxMTMzMjAwMAorS2lya2xhcmVsaSAJOgkxCToJMzI3MDAwCitJem1pdCBbS29jYWVsaV0JOgkxCToJMTMzMjAwMAorU2FrYXJ5YSAJOgkxCToJNzcxMDAwCitUZWtpcmRhZwk6CTEJOgk2OTMwMDAKK1lhbG92YSAJOgkxCToJMTgyMDAwCitFZ2UgQvZsZ2VzaSAJOgkxCToJOTQwNzAwMAorQWZ5b24gCToJMQk6CTgyNjAwMAorQXlkaW4gCToJMQk6CTk5MDAwMAorRGVuaXpsaSAJOgkxCToJODc3MDAwCitJem1pciAJOgkxCToJMzY0OTAwMAorS3V0YWh5YSAJOgkxCToJNjgwMDAwCitNYW5pc2EgCToJMQk6CTEyNzYwMDAKK011Z2xhIAk6CTEJOgk3ODAwMDAKK1VzYWsgCToJMQk6CTMyOTAwMAorQWtkZW5peiBC9mxnZXNpIAk6CTEJOgk5Mzg0MDAwCitBZGFuYSAJOgkxCToJMTk2MDAwMAorQW50YWx5YSAJOgkxCToJMjAwNzAwMAorQnVyZHVyIAk6CTEJOgkyNDgwMDAKK0FudGFreWEgKEFudGlvY2hpYSkgCToJMQk6CTEyOTMwMDAKK01lcnNpbiBbSWNlbF0gCToJMQk6CTE4MTkwMDAKK0lzcGFydGEgCToJMQk6CTU0MjAwMAorSy4gTWFyYXMgCToJMQk6CTEwMjkwMDAKK09zbWFuaXllIAk6CTEJOgk0ODYwMDAKK0ku5yBBbmFkb2x1IEL2bGdlc2kgCToJMQk6CTEyMTg5MDAwCitBa3NhcmF5IAk6CTEJOgk0MjAwMDAKK0Fua2FyYSAJOgkxCToJNDMxOTAwMAorQ2Fua2lyaSAJOgkxCToJMjczMDAwCitFc2tpc2VoaXIgCToJMQk6CTcxODAwMAorS2FyYW1hbiAJOgkxCToJMjUxMDAwCitLYXlzZXJpIAk6CTEJOgkxMDkwMDAwCitLaW5ra2FsZSAJOgkxCToJMzg5MDAwCitLaXJzZWhpciAJOgkxCToJMjQyMDAwCitLb255YSAJOgkxCToJMjM3MzAwMAorTmV2c2VoaXIgCToJMQk6CTMxMTAwMAorTmlnZGUgCToJMQk6CTM2MzAwMAorU2l2YXMgCToJMQk6CTcyMDAwMAorWW96Z2F0IAk6CTEJOgk3MjAwMDAKK0thcmFkZW5peiBC9mxnZXNpIAk6CTEJOgk4MzA0MDAwCitBbWFzeWEgCToJMQk6CTM1NTAwMAorQXJ0dmluIAk6CTEJOgkxNzIwMDAKK0JhcnQ/biAJOgkxCToJMTY0MDAwCitCYXlidXJ0IAk6CTEJOgk4ODAwMAorQm9sdSAJOgkxCToJMjY1MDAwCitDb3J1bSAJOgkxCToJNTY4MDAwCitE/HpjZSAJOgkxCToJMzI3MDAwCitHaXJlc3VuIAk6CTEJOgk1MTkwMDAKK0d1bXVzaGFuZSAJOgkxCToJMTkxMDAwCitLYXJhYvxrIAk6CTEJOgkyMDUwMDAKK0thc3RhbW9udSAJOgkxCToJMzMzMDAwCitPcmR1IAk6CTEJOgk4OTEwMDAKK1JpemUgCToJMQk6CTM2MjAwMAorU2Ftc3VuIAk6CTEJOgkxMTkzMDAwCitTaW5vcCAJOgkxCToJMTkzMDAwCitUb2thdCAJOgkxCToJODYyMDAwCitUcmFiem9uIAk6CTEJOgkxMDQ2MDAwCitaaW5ndWxkYWsgCToJMQk6CTU3MDAwMAorRG9nKHUgQW5hZG9sdSBC9mxnZXNpIAk6CTEJOgk2NDAzMDAwCitBZ3JpCToJMQk6CTU2NDAwMAorQXJkYWhhbiAJOgkxCToJMTIyMDAwCitCaW5nb2wgCToJMQk6CTI0NzAwMAorQml0bGlzIAk6CTEJOgk0MDkwMDAKK0VsYXppZwk6CTEJOgk1OTEwMDAKK0VyemluY2FuIAk6CTEJOgkzMTUwMDAKK0VyenVydW0gCToJMQk6CTk1NjAwMAorSGFra2FyaSAJOgkxCToJMjY2MDAwCitJZyhkP3IgCToJMQk6CTE3ODAwMAorS2FycyAJOgkxCToJMjk0MDAwCitNYWxhdHlhIAk6CTEJOgk5MTEwMDAKK011cyAJOgkxCToJNDgzMDAwCitUdW5jZWxpIAk6CTEJOgk3OTAwMAorVmFuIAk6CTEJOgk5ODgwMDAKK0f8bmV5ZG9nKHUgQW5hZG9sdSBC9mxnZXNpIAk6CTEJOgk3MjMxMDAwCitBZGl5YW1hbiAJOgkxCToJNjY4MDAwCitCYXRtYW4gCToJMQk6CTUwNzAwMAorRGl5YXJiYWtpciAJOgkxCToJMTQ3MTAwMAorR2F6aWFudGVwIAk6CTEJOgkxNDAyMDAwCitLaWxpcyAJOgkxCToJMTAxMDAwCitNYXJkaW4gCToJMQk6CTc2NzAwMAorU2FubGl1cmZhIAk6CTEJOgkxNjU0MDAwCitTaWlydCAJOgkxCToJMjY2MDAwCitTaXJuYWsgCToJMQk6CTM5NTAwMAorSGF0YXkgIDogMSA6IDEyNTM3MjYKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9UVVJLTUVOSVNUQU5fQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVFVSS01FTklTVEFOX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNTBmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVFVSS01FTklTVEFOX0FSRUEudHh0CkBAIC0wLDAgKzEsMTAgQEAKK1R1cmttZW5pc3Rhbgk6CTAJOgk0ODgxMDAKK0FubmF1ICAJOgkxCToJOTc0MjgKK0FzaGdhYmF0IAk6CTEJOgkwCitCYWxrYW5hYmF0IAk6CTEJOgkxMzg1MDAKK0Rhc2hob3d1eiAJOgkxCToJNzM2MDAKK1R1cmttZW5hYmF0IAk6CTEJOgk5MzgwMAorTWFyeSAJOgkxCToJODY4MDAKK0NoYXJkemhvdSA6IDEgOiA5MzIwMAorVGFzaGF1eiA6IDEgOiA3MjgwMDAgCitUdXJrbWVuaXN0YW4gVGVycml0b3JpZXMgOiAxIDogIDEzODAwMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1RVUktNRU5JU1RBTl9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9UVVJLTUVOSVNUQU5fUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg0ZDEzZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9UVVJLTUVOSVNUQU5fUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwxMCBAQAorVHVya21lbmlzdGFuCToJMAk6CTUwNDI5MjAKK0FubmF1ICAJOgkxCToJNzc5NDAwCitBc2hnYWJhdCAJOgkxCToJNzEyMDAwCitCYWxrYW5hYmF0IAk6CTEJOgk0Nzc2MDAKK0Rhc2hob3d1eiAJOgkxCToJMTE4MzEwMAorVHVya21lbmFiYXQgCToJMQk6CTExNDcwMDAKK01hcnkgCToJMQk6CTEyNzEyMDAKK0NoYXJkemhvdSA6IDEgOiAyMDMwMDAKK1Rhc2hhdXogOiAxIDogMTY1NDAwIAorVHVya21lbmlzdGFuIFRlcnJpdG9yaWVzIDogMSA6ICA1MzI4MApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VHQU5EQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9VR0FOREFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhNDM5MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9VR0FOREFfQVJFQS50eHQKQEAgLTAsMCArMSw2MiBAQAorVWdhbmRhCToJMAk6CTIzNjA0MAorTGFrZSBWaWN0b3JpYSA6IDEgOiA2ODgwMAorQ2VudHJhbCAgCToJMQk6CTYxNDAzLjIwCitLYWxhbmdhbGEgCToJMQk6CTkwNjguMzAKK0thbXBhbGEgCToJMQk6CTE5NworS2F5dW5nYSAJOgkxCToJMTcwMi40MAorS2lib2dhIAk6CTEJOgk0MDQ1LjUwCitMdXdlcm8gCToJMQk6CTU2OTMuOTAKK01hc2FrYSAJOgkxCToJNDY5MS43MAorTXBpZ2kgCToJMQk6CTM2MDUuNjAKK011YmVuZGUgCToJMQk6CTYxOTcuNzAKK011a29ubyAJOgkxCToJMTI2NTUuNzAKK05ha2Fzb25nb2xhIAk6CTEJOgkzNTA5LjkwCitSYWthaSAJOgkxCToJNDkwOC43MAorU2VtYmFidWxlIAk6CTEJOgkyMzE5LjIwCitXYWtpc28gCToJMQk6CTI4MDcuNzAKK0Vhc3Rlcm4gCToJMQk6CTM5NDc4LjgwCitCdWdpcmkgCToJMQk6CTU2NzAuOTAKK0J1c2lhIAk6CTEJOgk3NTkuNAorSWdhbmdhIAk6CTEJOgkyNDgyLjMwCitKaW5qYSAJOgkxCToJNzIyLjcKK0thYmVyYW1haWRvIAk6CTEJOgkxNjIzLjkwCitLYW11bGkgCToJMQk6CTQzMDEuNTAKK0thcGNob3J3YSAJOgkxCToJMTczMS43MAorS2F0YWt3aSAJOgkxCToJNTAxNC40MAorS3VtaSAJOgkxCToJMjg0OC4xMAorTWF5dWdlIAk6CTEJOgk0NjM4LjUwCitNYmFsZSAJOgkxCToJMTM3Mi44MAorUGFsbGlzYSAJOgkxCToJMTk5MS43MAorU2lyb25rbyAJOgkxCToJMTA5My45MAorU29yb3RpIAk6CTEJOgkzMzc3LjcwCitUb3Jvcm8gCToJMQk6CTE4NDkuMzAKK05vcnRoZXJuIAk6CTEJOgk4NTM5MS43MAorQWRqdW1hbmkgCToJMQk6CTMwODcuMDAKK0FwYWMgCToJMQk6CTY1NDEuMjAKK0FydWEgCToJMQk6CTU0NzYuMjAKK0d1bHUgCToJMQk6CTExNzE1LjUwCitLaXRndW0gCToJMQk6CTk2MzQuNTAKK0tvdGlkbyAJOgkxCToJMTMyNDUuMTAKK0xpcmEgCToJMQk6CTcyMDAuNzAKK01vcm90byAJOgkxCToJODUxNy42MAorTW95byAJOgkxCToJMTg5MC43MAorTmFrYXBpcmlwaXJpdCAJOgkxCToJNTgzMy44MAorTmViYmkgCToJMQk6CTI5MTcuMjAKK1BhZGVyIAk6CTEJOgk2OTI5LjIwCitZdW1iZSAJOgkxCToJMjQwMy4wMAorV2VzdGVybiAJOgkxCToJNTUyNzYuNjAKK0J1bmRpYnVneW8gCToJMQk6CTIyNjEuNzAKK0J1c2hlbnlpIAk6CTEJOgk0MjkyLjUwCitIb2ltYSAJOgkxCToJNTkzMi44MAorS2FiYWxlIAk6CTEJOgkxNzI5LjYwCitLYWJhcm9sZSAJOgkxCToJMTgyNC40MAorS2Ftd2VuZ2UgCToJMQk6CTI0MzkuNDAKK0thbnVuZ3UgCToJMQk6CTEyOTIuMTAKK0thc2VzZSAJOgkxCToJMzM4OS42MAorS2liYWFsZSAJOgkxCToJNDI0Ni4wMAorS2lzb3JvIAk6CTEJOgk3MjkuNgorS3llbmpvam8gCToJMQk6CTQwNTQuNDAKK01hc2luZGkgCToJMQk6CTk0NDMuMDAKK01iYXJhcmEgCToJMQk6CTEwMDE5LjEwCitOdHVuZ2FtbyAJOgkxCToJMjA1NS41MAorUnVrdW5naXJpIAk6CTEJOgkxNTY2LjgwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVUdBTkRBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VHQU5EQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWUwM2NjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VHQU5EQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDYyIEBACitVZ2FuZGEJOgkwCToJMjgxOTU3NTQKK0xha2UgVmljdG9yaWEgOiAxIDogMAorQ2VudHJhbCAgCToJMQk6CTcyMDU1MDAKK0thbGFuZ2FsYSAJOgkxCToJNDQzMDAKK0thbXBhbGEgCToJMQk6CTEzMzc5MDAKK0theXVuZ2EgCToJMQk6CTMxMjMwMAorS2lib2dhIAk6CTEJOgkyNTk0MDAKK0x1d2VybyAJOgkxCToJNTA4MzAwCitNYXNha2EgCToJMQk6CTc4MjQwMAorTXBpZ2kgCToJMQk6CTQyOTUwMAorTXViZW5kZSAJOgkxCToJNzYzMDAwCitNdWtvbm8gCToJMQk6CTg2NzMwMAorTmFrYXNvbmdvbGEgCToJMQk6CTEzMTQwMAorUmFrYWkgCToJMQk6CTQ5MzMwMAorU2VtYmFidWxlIAk6CTEJOgkxOTQ0MDAKK1dha2lzbyAJOgkxCToJMTA4MTgwMAorRWFzdGVybiAJOgkxCToJNjk1MDYwMAorQnVnaXJpIAk6CTEJOgk0ODc0MDAKK0J1c2lhIAk6CTEJOgkyNDU5MDAKK0lnYW5nYSAJOgkxCToJNzgwODAwCitKaW5qYSAJOgkxCToJNDQ4NzAwCitLYWJlcmFtYWlkbyAJOgkxCToJMTM1MDAwCitLYW11bGkgCToJMQk6CTc3NjgwMAorS2FwY2hvcndhIAk6CTEJOgkyMTc0MDAKK0thdGFrd2kgCToJMQk6CTM2NTkwMAorS3VtaSAJOgkxCToJNDM0NjAwCitNYXl1Z2UgCToJMQk6CTM1ODQwMAorTWJhbGUgCToJMQk6CTc4MzYwMAorUGFsbGlzYSAJOgkxCToJNTY5MDAwCitTaXJvbmtvIAk6CTEJOgkzMTM1MDAKK1Nvcm90aSAJOgkxCToJNDI3MzAwCitUb3Jvcm8gCToJMQk6CTYwNjMwMAorTm9ydGhlcm4gCToJMQk6CTYwOTE4MDAKK0FkanVtYW5pIAk6CTEJOgkyMzkzMDAKK0FwYWMgCToJMQk6CTc0MDEwMAorQXJ1YSAJOgkxCToJOTUwNjAwCitHdWx1IAk6CTEJOgk1MDM4MDAKK0tpdGd1bSAJOgkxCToJMzIwMDAwCitLb3RpZG8gCToJMQk6CTc3NDQwMAorTGlyYSAJOgkxCToJODMyNjAwCitNb3JvdG8gCToJMQk6CTE5NDMwMAorTW95byAJOgkxCToJMjQ4MjAwCitOYWthcGlyaXBpcml0IAk6CTEJOgkxODA0MDAKK05lYmJpIAk6CTEJOgk0NjQ5MDAKK1BhZGVyIAk6CTEJOgkzMjc5MDAKK1l1bWJlIAk6CTEJOgkzMTUxMDAKK1dlc3Rlcm4gCToJMQk6CTY5NjAwMDAKK0J1bmRpYnVneW8gCToJMQk6CTI0NDcwMAorQnVzaGVueWkgCToJMQk6CTc1OTIwMAorSG9pbWEgCToJMQk6CTM5ODIwMAorS2FiYWxlIAk6CTEJOgk0ODM0MDAKK0thYmFyb2xlIAk6CTEJOgkzNzMzMDAKK0thbXdlbmdlIAk6CTEJOgkzMjIwMDAKK0thbnVuZ3UgCToJMQk6CTIxNjQwMAorS2FzZXNlIAk6CTEJOgk1ODkyMDAKK0tpYmFhbGUgCToJMQk6CTQ3ODMwMAorS2lzb3JvIAk6CTEJOgkyMjY5MDAKK0t5ZW5qb2pvIAk6CTEJOgk0MjAzMDAKK01hc2luZGkgCToJMQk6CTUzODQwMAorTWJhcmFyYSAJOgkxCToJMTE3MjgwMAorTnR1bmdhbW8gCToJMQk6CTQwNzQwMAorUnVrdW5naXJpIAk6CTEJOgkzMjk2MDAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9VS1JBSU5FX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VLUkFJTkVfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI4MmFhZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9VS1JBSU5FX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMjMgQEAKKzoxOjE1NzExODU6NzQKKzoxOjE0NDkxNDE6NDYKKzoxOjk2MzAxNzoxMTkKKzoxOjM5OTg3Mjc6MTI2Cis6MTo1NDc1NTU5OjIwNgorOjE6MTQ2NzYwMjoxMDYKKzoxOjMyNzg3NzI6MTA0Cis6MToxNTYxOTU1Ojc3Cis6MToxMjcxNzE2OjUyCis6MToyNTY0OTcwOjEwMAorOjE6NDY4ODk0MToxNjQKKzoxOjA6MAorOjE6MjgyNDQ0MToxMzAKKzoxOjI3MDU0NzQ6ODMKKzoxOjE4MDE5NDA6NjQKKzoxOjEyMDMwMDM6NTkKKzoxOjE0Njc2MDI6NjIKKzoxOjEyMDE5Nzc6ODYKKzoxOjE5NzUyNjI6NzQKKzoxOjEwOTAxODk6NTUKKzoxOjA6MAorOjE6MjE0NTUwODo3OQorOjE6MTU3NjMxMzo1MwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VOSVRFRCBLSU5HRE9NX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VOSVRFRCBLSU5HRE9NX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYjUwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVU5JVEVEIEtJTkdET01fQVJFQS50eHQKQEAgLTAsMCArMSwzNiBAQAorIEhJR0hMQU5EUyA6IDEgOiAzMTcwMy4wCisgR1JBTVBJQU4gOiAxIDogODc1Mi4wCisgQk9SRC1DRU5UUi1GSUZFLUxPVEhJQU4tVEFZIDogMSA6IDE4MTI0LjAKKyBEVU1GUklFUy1HQUxMTyA6IDEgOiAyMDIwNC4wCisgTk9SVEhVTUJFUkxBTkQgOiAxIDogNTU3Mi4wCisgTk9SVEhFUk4gSVJFTEFORCA6IDEgOiAxNDEyMC4wCisgQ1VNQlJJQSA6IDEgOiA2ODEwLjAKKyBDTEVWRUxBTkQgOiAxIDogMzAxOS4wCisgTk9SVEggWU9SS1NISVJFIDogMSA6IDgzMDkuMAorIFVOSVRFRCBLSU5HRE9NIDogMSA6IDI0NDExMS4wCisgTEFOQ0FTSElSRSA6IDEgOiAzMDYzLjAKKyBIVU1CRVJTSURFIDogMSA6IDM1MTIuMAorIFdFU1QgWU9SS1NISVJFIDogMSA6IDIwMzkuMAorIE1FUlNFWVNJREUgOiAxIDogNjUyLjAKKyBHUkVBVEVSIE1BTkNIRVNURVIgOiAxIDogMTI4Ny4wCisgU09VVEggWU9SS1NISVJFIDogMSA6IDE1NjAuMAorIExJTkNPTE5TSElSRSA6IDEgOiA1OTE1LjAKKyBERVJCWVNISVJFIDogMSA6IDQ3OTUuMAorIENIRVNISVJFIDogMSA6IDIzMjguMAorIENMV1lEIDogMSA6IDE3MTQxLjAKKyBTSFJPUFNISVJFIDogMSA6IDYyMDYuMAorIEVBU1QgQU5HTElBIDogMSA6IDEyNTczLjAKKyBMRUlDRVNURVJTSElSRSA6IDEgOiA0OTIwLjAKKyBIRVJFRk9SRCA6IDEgOiA1OTA3LjAKKyBXRVNUIE1JRExBTkRTIChDT1VOVFkpIDogMSA6IDg5OS4wCisgQkVERk9SRFNISVJFIDogMSA6IDI4NjkuMAorIEJFUktTIDogMSA6IDU3NTAuMAorIEFWT04gOiAxIDogNzQ3MC4wCisgRVNTRVggOiAxIDogMzY3Mi4wCisgR1dFTlQgOiAxIDogMzYyNy4wCisgR1JFQVRFUiBMT05ET04gOiAxIDogMTU3OS4wCisgS0VOVCA6IDEgOiAzNzMxLjAKKyBTVVJSRVkgOiAxIDogNTQ2My4wCisgSEFNUFNISVJFIDogMSA6IDQxNTguMAorIERPUlNFVCA6IDEgOiA2MTA1LjAKKyBDT1JOV0FMTCA6IDEgOiAxMDI3NS4wCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVU5JVEVEIEtJTkdET01fUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVU5JVEVEIEtJTkdET01fUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY3YjE0ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9VTklURUQgS0lOR0RPTV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDM2IEBACisgSElHSExBTkRTIDogMSA6IDI3NTQwMAorIEdSQU1QSUFOIDogMSA6IDUwNDgwMAorIEJPUkQtQ0VOVFItRklGRS1MT1RISUFOLVRBWSA6IDEgOiAxODU5NzAwCisgRFVNRlJJRVMtR0FMTE8gOiAxIDogMjQ1NjYwMAorIE5PUlRIVU1CRVJMQU5EIDogMSA6IDE0MzE3MDAKKyBOT1JUSEVSTiBJUkVMQU5EIDogMSA6IDE1ODYzMDAKKyBDVU1CUklBIDogMSA6IDQ5MTkwMAorIENMRVZFTEFORCA6IDEgOiAxMTUwNjAwCisgTk9SVEggWU9SS1NISVJFIDogMSA6IDcyNDQwMAorIFVOSVRFRCBLSU5HRE9NIDogMSA6IDU3MzIzNTAwCisgTEFOQ0FTSElSRSA6IDEgOiAxMzkzMDAwCisgSFVNQkVSU0lERSA6IDEgOiA4NTc3MDAKKyBXRVNUIFlPUktTSElSRSA6IDEgOiAyMDY4NDAwCisgTUVSU0VZU0lERSA6IDEgOiAxNDQ1ODAwCisgR1JFQVRFUiBNQU5DSEVTVEVSIDogMSA6IDI1ODY1MDAKKyBTT1VUSCBZT1JLU0hJUkUgOiAxIDogMTI5NTcwMAorIExJTkNPTE5TSElSRSA6IDEgOiA1ODkwMDAKKyBERVJCWVNISVJFIDogMSA6IDE5NDcwMDAKKyBDSEVTSElSRSA6IDEgOiA5NTg4MDAKKyBDTFdZRCA6IDEgOiA0MDI5MjcKKyBTSFJPUFNISVJFIDogMSA6IDE0NDQxMDAKKyBFQVNUIEFOR0xJQSA6IDEgOiAyMDUxODAwCisgTEVJQ0VTVEVSU0hJUkUgOiAxIDogMTQ3MjkwMAorIEhFUkVGT1JEIDogMSA6IDExNTg2MDAKKyBXRVNUIE1JRExBTkRTIChDT1VOVFkpIDogMSA6IDI2MTUwMDAKKyBCRURGT1JEU0hJUkUgOiAxIDogMzk3NzAwCisgQkVSS1MgOiAxIDogMTk3MTkwMAorIEFWT04gOiAxIDogMjA0MzEwMAorIEVTU0VYIDogMSA6IDE1MzI4MDAKKyBHV0VOVCA6IDEgOiAxNzU0NTAwCisgR1JFQVRFUiBMT05ET04gOiAxIDogNjc3NTQwMAorIEtFTlQgOiAxIDogMTUyNDYwMAorIFNVUlJFWSA6IDEgOiAyNDE4NDAwCisgSEFNUFNISVJFIDogMSA6IDE2NzY2MDAKKyBET1JTRVQgOiAxIDogMTEyMDQwMAorIENPUk5XQUxMIDogMSA6IDE0OTU5MDAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9VTklURURBUkFCRU1JUkFURVNfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVU5JVEVEQVJBQkVNSVJBVEVTX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZmM3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVU5JVEVEQVJBQkVNSVJBVEVTX0FSRUEudHh0CkBAIC0wLDAgKzEsOSBAQAorVW5pdGVkIEFyYWIgRW1pcmF0CToJMAk6CTgyODgwCitBam1hbgk6CTEJOgkyNTkKK0FidSBEaGFiaQk6CTEJOgk2NzM0MAorQWwgRnVqYXlyYWgJOgkxCToJMTE2NAorU2hhcmlxYWgJOgkxCToJMjU5MAorRHViYWkJOgkxCToJMzg4NQorUkFTIEFsIEtoYXltYWgJOgkxCToJMTY4NAorVU1NIEFsIFFheXdheW4JOgkxCToJNzc3CitOZXV0cmFsIFpvbmUgOiAxIDogMzAwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVU5JVEVEQVJBQkVNSVJBVEVTX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VOSVRFREFSQUJFTUlSQVRFU19QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjA4YTlmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VOSVRFREFSQUJFTUlSQVRFU19QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDkgQEAKK1VuaXRlZCBBcmFiIEVtaXJhdAk6CTAJOgkyNjAyNzEzCitBam1hbgk6CTEJOgkxODk4NDkKK0FidSBEaGFiaQk6CTEJOgkxMjkyMTE5CitBbCBGdWpheXJhaAk6CTEJOgkxMTg2MTcKK1NoYXJpcWFoCToJMQk6CTcyNDg1OQorRHViYWkJOgkxCToJMTIwMDMwOQorUkFTIEFsIEtoYXltYWgJOgkxCToJMTk3NTcxCitVTU0gQWwgUWF5d2F5bgk6CTEJOgk0NTc1NgorTmV1dHJhbCBab25lIDogMSA6IDAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9VUlVHVUFZX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VSVUdVQVlfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5OWY5OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9VUlVHVUFZX0FSRUEudHh0CkBAIC0wLDAgKzEsMjMgQEAKK1VydWd1YXkJOgkwCToJMTc2MjIwCitBcnRpZ2FzICAJOgkxCToJMTE5MjgKK0NhbmVsb25lcyAJOgkxCToJNDUzNgorQ2Vycm8gTGFyZ28gCToJMQk6CTEzNjQ4CitDb2xvbmlhIAk6CTEJOgk2MTA2CitEdXJhem5vIAk6CTEJOgkxMTY0MworRmxvcmVzIAk6CTEJOgk1MTQ0CitGbG9yaWRhIAk6CTEJOgkxMDQxNworTGF2YWxsZWphIAk6CTEJOgkxMDAxNgorTWFsZG9uYWRvIAk6CTEJOgk0NzkzCitNb250ZXZpZGVvIAk6CTEJOgk1MzAKK1BheXNhbmR1IAk6CTEJOgkxMzkyMgorUmlvIE5lZ3JvIAk6CTEJOgk5MjgyCitSaXZlcmEgCToJMQk6CTkzNzAKK1JvY2hhIAk6CTEJOgkxMDU1MQorU2FsdG8gCToJMQk6CTE0MTYzCitTYW4gSm9zZSAJOgkxCToJNDk5MgorU29yaWFubyAJOgkxCToJOTAwOAorVGFjdWFyZW1ibyAJOgkxCToJMTU0MzgKK1RyZWludGEgeSBUcmVzIAk6CTEJOgk5NTI5CisKKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVVJVR1VBWV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9VUlVHVUFZX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjJiODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVVJVR1VBWV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDIwIEBACitVcnVndWF5CToJMAk6CTM0MzE5MzIKK0FydGlnYXMgIAk6CTEJOgk3OTM2NworQ2FuZWxvbmVzIAk6CTEJOgk0OTgzNDQKK0NlcnJvIExhcmdvIAk6CTEJOgk4ODQzMgorQ29sb25pYSAJOgkxCToJMTIwOTQ4CitEdXJhem5vIAk6CTEJOgk2MDE3MgorRmxvcmVzIAk6CTEJOgkyNTUyOAorRmxvcmlkYSAJOgkxCToJNjk0NzIKK0xhdmFsbGVqYSAJOgkxCToJNjE4NTIKK01hbGRvbmFkbyAJOgkxCToJMTQ0MTA3CitNb250ZXZpZGVvIAk6CTEJOgkxMzQ3ODg4CitQYXlzYW5kdSAJOgkxCToJMTE1MjIyCitSaW8gTmVncm8gCToJMQk6CTU1MTI0CitSaXZlcmEgCToJMQk6CTEwNzUxMworUm9jaGEgCToJMQk6CTcwODY5CitTYWx0byAJOgkxCToJMTI1NjYyCitTYW4gSm9zZSAJOgkxCToJMTA1Njg1CitTb3JpYW5vIAk6CTEJOgk4NjI3MQorVGFjdWFyZW1ibyAJOgkxCToJOTMyNzYKK1RyZWludGEgeSBUcmVzIAk6CTEJOgk0OTk5MQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VTQV8yX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VTQV8yX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDE1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVVNBXzJfQVJFQS50eHQKQEAgLTAsMCArMSwzMTQxIEBACitBdXRhdWdhIAk6CTEJOgkxNTY1LjUyNTUKK0JhbGR3aW4gCToJMQk6CTUyNDkuNzQ4NworQmFyYm91ciAJOgkxCToJMjM0Mi43MDY4CitCaWJiIAk6CTEJOgkxNjIxLjc1NDQKK0Jsb3VudCAJOgkxCToJMTY4NS4wNTQKK0J1bGxvY2sgCToJMQk6CTE2MjEuNDk1NAorQnV0bGVyIAk6CTEJOgkyMDE0LjgxMjgKK0NhbGhvdW4gCToJMQk6CTE1ODUuOTA4OAorQ2hhbWJlcnMgCToJMQk6CTE1NjIuMDU0OQorQ2hlcm9rZWUgCToJMQk6CTE1NTMuODcwNQorQ2hpbHRvbiAJOgkxCToJMTgxNC45Njg0CitDaG9jdGF3IAk6CTEJOgkyMzg1LjAwMTUKK0NsYXJrZSAJOgkxCToJMzI0NC4wMDA5CitDbGF5IAk6CTEJOgkxNTY5LjU0CitDbGVidXJuZSAJOgkxCToJMTQ1My4wNDE4CitDb2ZmZWUgCToJMQk6CTE3NjIuNDQzMgorQ29sYmVydCAJOgkxCToJMTYxNS4xNDk5CitDb25lY3VoIAk6CTEJOgkyMjA4LjAwMDkKK0Nvb3NhIAk6CTEJOgkxNzI1Ljg3MjQKK0NvdmluZ3RvbiAJOgkxCToJMjcwMy41OTc0CitDcmVuc2hhdyAJOgkxCToJMTU4Mi4xNzkyCitDdWxsbWFuIAk6CTEJOgkxOTU0Ljk4MzgKK0RhbGUgCToJMQk6CTE0NTcuMzE1MworRGFsbGFzIAk6CTEJOgkyNTcyLjgyODMKK0RlS2FsYiAJOgkxCToJMjAxNi43MDM1CitFbG1vcmUgCToJMQk6CTE3MDIuMTczOQorRXNjYW1iaWEgCToJMQk6CTI0NjguMTQwNQorRXRvd2FoIAk6CTEJOgkxNDIxLjI2MjUKK0ZheWV0dGUgCToJMQk6CTE2MjkuOTkwNgorRnJhbmtsaW4gCToJMQk6CTE2NzQuNDYwOQorR2VuZXZhIAk6CTEJOgkxNDk5LjM1MQorR3JlZW5lIAk6CTEJOgkxNzA5LjIxODcKK0hhbGUgCToJMQk6CTE3MDAuMjU3MworSGVucnkgCToJMQk6CTE0NzEuOTc0NworSG91c3RvbiAJOgkxCToJMTUwNi40NzM1CitKYWNrc29uIAk6CTEJOgkyOTE4LjMzNDMKK0plZmZlcnNvbiAJOgkxCToJMjkxMC42NDIKK0xhbWFyIAk6CTEJOgkxNTY4LjE2NzMKK0xhdWRlcmRhbGUgCToJMQk6CTE4NjEuNjQwMgorTGF3cmVuY2UgCToJMQk6CTE4NTkuODAxMworTGVlIAk6CTEJOgkxNTk0LjI3NDUKK0xpbWVzdG9uZSAJOgkxCToJMTU3Mi4zMzcyCitMb3duZGVzIAk6CTEJOgkxODc3LjgyNzcKK01hY29uIAk6CTEJOgkxNTg4LjI5MTYKK01hZGlzb24gCToJMQk6CTIxMDUuMjgxNQorTWFyZW5nbyAJOgkxCToJMjU0NS41ODE1CitNYXJpb24gCToJMQk6CTE5MjUuODQ2MworTWFyc2hhbGwgCToJMQk6CTE2MTMuOTg0NAorTW9iaWxlIAk6CTEJOgk0MjU4LjAxMTgKK01vbnJvZSAJOgkxCToJMjY3OS40MzI3CitNb250Z29tZXJ5IAk6CTEJOgkyMDcxLjM3ODQKK01vcmdhbiAJOgkxCToJMTU1MS41NjU0CitQZXJyeSAJOgkxCToJMTg3NS4zNjcyCitQaWNrZW5zIAk6CTEJOgkyMzA1LjIyOTUKK1Bpa2UgCToJMQk6CTE3NDAuNzM5CitSYW5kb2xwaCAJOgkxCToJMTUxMi44NDQ5CitSdXNzZWxsIAk6CTEJOgkxNjc2LjcxNDIKK1N0LiBDbGFpciAJOgkxCToJMTY5Mi44NDk5CitTaGVsYnkgCToJMQk6CTIwOTYuNjgyNworU3VtdGVyIAk6CTEJOgkyMzY1LjQ0NworVGFsbGFkZWdhIAk6CTEJOgkxOTY5LjA0NzUKK1RhbGxhcG9vc2EgCToJMQk6CTE5ODQuNTM1NworVHVzY2Fsb29zYSAJOgkxCToJMzQ5OS42ODU3CitXYWxrZXIgCToJMQk6CTIwODUuNzI3CitXYXNoaW5ndG9uIAk6CTEJOgkyODE5LjMxODYKK1dpbGNveCAJOgkxCToJMjM1MC4zMjE0CitXaW5zdG9uIAk6CTEJOgkxNjM2LjUxNzQKK0FsZXV0aWFucyBFYXN0IAk6CTIJOgkzODg4MC4wNDQKK0FsZXV0aWFucyBXZXN0IAk6CTIJOgkzNjU2MS43NjA5CitBbmNob3JhZ2UgCToJMgk6CTUwNzkuMjIzMQorQmV0aGVsIAk6CTIJOgkxMTc4NjYuOTExNAorQnJpc3RvbCBCYXkgCToJMgk6CTIyOTkuMDkxMgorRGVuYWxpIAk6CTIJOgkzMzA4Ni4wMzI3CitEaWxsaW5naGFtIAk6CTIJOgk1NDIwNC41ODE5CitGYWlyYmFua3MgTm9ydGggU3RhciAJOgkyCToJMTkyODAuMDExOAorSGFpbmVzIAk6CTIJOgk3MDU5Ljg3MzgKK0p1bmVhdSAJOgkyCToJODQzMC40NzU5CitLZW5haSBQZW5pbnN1bGEgCToJMgk6CTY0MTE0LjQxNAorS2V0Y2hpa2FuIEdhdGV3YXkgCToJMgk6CTQ1NDIuODA4MgorS29kaWFrIElzbGFuZCAJOgkyCToJMzExNDEuMzA1MworTGFrZSBhbmQgUGVuaW5zdWxhIAk6CTIJOgk4MDA0OS4wMjY0CitNYXRhbnVza2EtU3VzaXRuYSAJOgkyCToJNjU0MjIuODU2MQorTm9tZSAJOgkyCToJNzMyNTMuODI0NworTm9ydGggU2xvcGUgCToJMgk6CTI0NTQzNS4yMzc2CitOb3J0aHdlc3QgQXJjdGljIAk6CTIJOgkxMDU1NzMuNTgKK1ByaW5jZSBvZiBXYWxlcy1PdXRlciBLZXRjaGlrYW4gCToJMgk6CTMyOTA5LjMxNworU2l0a2EgCToJMgk6CTEyNDYxLjg2MjcKK1NrYWd3YXktSG9vbmFoLUFuZ29vbiAJOgkyCToJMjk0NjUuNzMwNworU291dGhlYXN0IEZhaXJiYW5rcyAJOgkyCToJNjQ5MDguNDgyMQorVmFsZGV6LUNvcmRvdmEgCToJMgk6CTEwNDExNS43OTg1CitXYWRlIEhhbXB0b24gCToJMgk6CTUwOTQzLjMzMTYKK1dyYW5nZWxsLVBldGVyc2J1cmcgCToJMgk6CTIzMzY0LjkzMzkKK1lha3V0YXQgCToJMgk6CTI0NDk5LjUzNTIKK1l1a29uLUtveXVrdWsgCToJMgk6CTM4MjkxMi4xMDA5CitBcGFjaGUgCToJNAk6CTI5MDU1LjcwNzgKK0NvY2hpc2UgCToJNAk6CTE2MTA2LjYxNDMKK0NvY29uaW5vIAk6CTQJOgk0ODMzMi41MzM5CitHaWxhIAk6CTQJOgkxMjQyMC45NjY2CitHcmFoYW0gCToJNAk6CTEyMDIwLjU1MjYKK0dyZWVubGVlIAk6CTQJOgk0Nzg3LjQwNzgKK0xhIFBheiAJOgk0CToJMTE2ODkuNjAyNAorTWFyaWNvcGEgCToJNAk6CTIzODkwLjg1OTMKK01vaGF2ZSAJOgk0CToJMzQ4ODYuNTQ4OQorTmF2YWpvIAk6CTQJOgkyNTc5NS4wNzkxCitQaW1hIAk6CTQJOgkyMzc5OS4wNjk3CitQaW5hbCAJOgk0CToJMTM5MTguODkzMQorU2FudGEgQ3J1eiAJOgk0CToJMzIwNi43MDQ5CitZYXZhcGFpIAk6CTQJOgkyMTA1MC45NTAyCitZdW1hIAk6CTQJOgkxNDI5NC4xMDY0CitBcmthbnNhcyAJOgk1CToJMjY3Ny41MTYxCitBc2hsZXkgCToJNQk6CTI0MzIuMjE3MgorQmF4dGVyIAk6CTUJOgkxNTE5LjY1NjYKK0JlbnRvbiAJOgk1CToJMjI3OS44MjE2CitCb29uZSAJOgk1CToJMTU1OC43MTM4CitCcmFkbGV5IAk6CTUJOgkxNjk0Ljg0NDIKK0NhbGhvdW4gCToJNQk6CTE2MzguMjc4NgorQ2Fycm9sbCAJOgk1CToJMTY1NC41MTc5CitDaGljb3QgCToJNQk6CTE3ODkuMzc5MgorQ2xhcmsgCToJNQk6CTIyODUuOTM0CitDbGF5IAk6CTUJOgkxNjYxLjI3NzgKK0NsZWJ1cm5lIAk6CTUJOgkxNTMzLjA0NjkKK0NsZXZlbGFuZCAJOgk1CToJMTU1MC44OTIKK0NvbHVtYmlhIAk6CTUJOgkxOTg2LjE2NzQKK0NvbndheSAJOgk1CToJMTQ2Ny42NDk0CitDcmFpZ2hlYWQgCToJNQk6CTE4NDYuNjE4MgorQ3Jhd2ZvcmQgCToJNQk6CTE1NjQuODc4CitDcml0dGVuZGVuIAk6CTUJOgkxNjQ5LjAyNzEKK0Nyb3NzIAk6CTUJOgkxNjExLjgzNDcKK0RhbGxhcyAJOgk1CToJMTczMC41MzQ0CitEZXNoYSAJOgk1CToJMjEyMi41NTY4CitEcmV3IAk6CTUJOgkyMTY0LjMzMzUKK0ZhdWxrbmVyIAk6CTUJOgkxNzE5Ljc4NTkKK0ZyYW5rbGluIAk6CTUJOgkxNjA0Ljk5NzEKK0Z1bHRvbiAJOgk1CToJMTYwNi42MDI5CitHYXJsYW5kIAk6CTUJOgkxOTAyLjUzNjMKK0dyYW50IAk6CTUJOgkxNjM5LjQ5NTkKK0dyZWVuZSAJOgk1CToJMTUwMS4yOTM1CitIZW1wc3RlYWQgCToJNQk6CTE5MjAuMTIyNAorSG90IFNwcmluZyAJOgk1CToJMTYxMS4zOTQ0CitIb3dhcmQgCToJNQk6CTE1NDEuNTY4CitJbmRlcGVuZGVuY2UgCToJNQk6CTE5OTguMzY2MworSXphcmQgCToJNQk6CTE1MTIuNjExOAorSmFja3NvbiAJOgk1CToJMTY2MS4zNTU1CitKZWZmZXJzb24gCToJNQk6CTIzNjYuNDgzCitKb2huc29uIAk6CTUJOgkxNzY4LjI5NjYKK0xhZmF5ZXR0ZSAJOgk1CToJMTQxMS43MzEzCitMYXdyZW5jZSAJOgk1CToJMTUzNC4xNjA2CitMZWUgCToJNQk6CTE2MDQuNDI3MworTGluY29sbiAJOgk1CToJMTQ4MS45MjAzCitMaXR0bGUgUml2ZXIgCToJNQk6CTE0NjMuMDEzMworTG9nYW4gCToJNQk6CTE4OTQuNTg1CitMb25va2UgCToJNQk6CTIwNzguMjkzNworTWFkaXNvbiAJOgk1CToJMjE2Ny45ODU0CitNYXJpb24gCToJNQk6CTE2NTguNTA2NQorTWlsbGVyIAk6CTUJOgkxNjUxLjA3MzIKK01pc3Npc3NpcHBpIAk6CTUJOgkyMzgyLjEwMDcKK01vbnJvZSAJOgk1CToJMTYwOS40NTE5CitNb250Z29tZXJ5IAk6CTUJOgkyMDcyLjc1MTEKK05ldmFkYSAJOgk1CToJMTYwNy44MjAyCitOZXd0b24gCToJNQk6CTIxMzIuMDM2MgorT3VhY2hpdGEgCToJNQk6CTE5MTUuNjQxNworUGVycnkgCToJNQk6CTE0NTEuNjE3MworUGhpbGxpcHMgCToJNQk6CTE4ODMuNjgxMQorUGlrZSAJOgk1CToJMTU4OS45NDkyCitQb2luc2V0dCAJOgk1CToJMTk3Ny4xODAxCitQb2xrIAk6CTUJOgkyMjMzLjY2NzgKK1BvcGUgCToJNQk6CTIxNTEuNzQ2MQorUHJhaXJpZSAJOgk1CToJMTc1MC4yMTg0CitQdWxhc2tpIAk6CTUJOgkyMDkyLjMwNTYKK1JhbmRvbHBoIAk6CTUJOgkxNjk5LjE0MzYKK1N0LiBGcmFuY2lzIAk6CTUJOgkxNjYzLjgxNgorU2FsaW5lIAk6CTUJOgkxODkxLjg5MTQKK1Njb3R0IAk6CTUJOgkyMzI2LjA1MzEKK1NlYXJjeSAJOgk1CToJMTczMS40NDA5CitTZWJhc3RpYW4gCToJNQk6CTE0MTQuMjQzNgorU2V2aWVyIAk6CTUJOgkxNTA1LjY5NjUKK1NoYXJwIAk6CTUJOgkxNTcwLjQ0NjUKK1N0b25lIAk6CTUJOgkxNTc4LjQyMzcKK1VuaW9uIAk6CTUJOgkyNzMzLjE0OTMKK1ZhbiBCdXJlbiAJOgk1CToJMTg3NS45ODg4CitXYXNoaW5ndG9uIAk6CTUJOgkyNDc2LjA2NTkKK1doaXRlIAk6CTUJOgkyNjk5LjcxMjQKK1dvb2RydWZmIAk6CTUJOgkxNTM4LjU4OTUKK1llbGwgCToJNQk6CTI0NTcuNDk1NgorQWxhbWVkYSAJOgk2CToJMjEyNi43Nzg1CitBbHBpbmUgCToJNgk6CTE5MjQuODYyMQorQW1hZG9yIAk6CTYJOgkxNTY2LjE0NzEKK0J1dHRlIAk6CTYJOgk0MzQzLjcxNDkKK0NhbGF2ZXJhcyAJOgk2CToJMjY4NS40MTU2CitDb2x1c2EgCToJNgk6CTI5OTQuNjA5OAorQ29udHJhIENvc3RhIAk6CTYJOgkyMDc3LjU2ODUKK0RlbCBOb3J0ZSAJOgk2CToJMzE4NS4wNTI1CitFbCBEb3JhZG8gCToJNgk6CTQ2MzEuMTc5CitGcmVzbm8gCToJNgk6CTE1NTg1LjExNzgKK0dsZW5uIAk6CTYJOgkzNDM3LjM0NDQKK0h1bWJvbGR0IAk6CTYJOgkxMDQ5NS4yNDk4CitJbXBlcmlhbCAJOgk2CToJMTE2MDcuNjgwNworSW55byAJOgk2CToJMjY0ODcuODc4MgorS2VybiAJOgk2CToJMjExMzguMDc3OAorS2luZ3MgCToJNgk6CTM2MDMuOTU5MQorTGFrZSAJOgk2CToJMzQ0My4zNTMyCitMYXNzZW4gCToJNgk6CTEyMjI1Ljc1ODMKK0xvcyBBbmdlbGVzIAk6CTYJOgkxMjMwOC41MDg4CitNYWRlcmEgCToJNgk6CTU1NzcuMDk4OAorTWFyaW4gCToJNgk6CTIxNDUuMDM4CitNYXJpcG9zYSAJOgk2CToJMzc4OC42MjYxCitNZW5kb2Npbm8gCToJNgk6CTEwMDQ0LjM4MjYKK01lcmNlZCAJOgk2CToJNTEwNy4xNDMzCitNb2RvYyAJOgk2CToJMTA4ODYuNzI4MworTW9ubyAJOgk2CToJODExMS4zNjIKK01vbnRlcmV5IAk6CTYJOgk5NzY3LjA3MTMKK05hcGEgCToJNgk6CTIwNDEuNjE5MworTmV2YWRhIAk6CTYJOgkyNTIzLjkyOTEKK09yYW5nZSAJOgk2CToJMjQ1NS4yNjgyCitQbGFjZXIgCToJNgk6CTM4OTIuMjAwMgorUGx1bWFzIAk6CTYJOgk2NzY4LjkxMzIKK1JpdmVyc2lkZSAJOgk2CToJMTg5MTUuMTA2NworU2FjcmFtZW50byAJOgk2CToJMjU3OC4yOTMyCitTYW4gQmVuaXRvIAk6CTYJOgkzNjAxLjk5MDcKK1NhbiBCZXJuYXJkaW5vIAk6CTYJOgk1MjA3Mi43Nzg4CitTYW4gRGllZ28gCToJNgk6CTExNzIxLjA5NjgKK1NhbiBGcmFuY2lzY28gCToJNgk6CTYwMC42NzI4CitTYW4gSm9hcXVpbiAJOgk2CToJMzY5My45ODc1CitTYW4gTHVpcyBPYmlzcG8gCToJNgk6CTkzNjQuMjQ4NgorU2FuIE1hdGVvIAk6CTYJOgkxOTE5LjIxNTkKK1NhbnRhIEJhcmJhcmEgCToJNgk6CTk4MTMuNzE3MgorU2FudGEgQ2xhcmEgCToJNgk6CTMzNzcuMzg1OQorU2FudGEgQ3J1eiAJOgk2CToJMTU3Mi41NDQ0CitTaGFzdGEgCToJNgk6CTk5NjQuODY5NgorU2llcnJhIAk6CTYJOgkyNDkxLjUwMjMKK1Npc2tpeW91IAk6CTYJOgkxNjQzOS45MjE0CitTb2xhbm8gCToJNgk6CTIzNDguMjc1MworU29ub21hIAk6CTYJOgk0NTc5LjcxNTcKK1N0YW5pc2xhdXMgCToJNgk6CTM5MjIuOTk1MworU3V0dGVyIAk6CTYJOgkxNTc2LjIyMjIKK1RlaGFtYSAJOgk2CToJNzY3Mi4yNzkzCitUcmluaXR5IAk6CTYJOgk4MzA3LjUyODYKK1R1bGFyZSAJOgk2CToJMTI1MzMuMjQzMQorVHVvbHVtbmUgCToJNgk6CTU4OTAuNTQwNgorVmVudHVyYSAJOgk2CToJNTcxOS4yMzgKK1lvbG8gCToJNgk6CTI2NDkuMjg1MQorWXViYSAJOgk2CToJMTY2Ny4yNjA3CitBZGFtcyAJOgk4CToJMzEwMi4wNjg5CitBbGFtb3NhIAk6CTgJOgkxODczLjk0MjcKK0FyYXBhaG9lIAk6CTgJOgkyMDg2LjA2MzcKK0FyY2h1bGV0YSAJOgk4CToJMzUxMC42OTMyCitCYWNhIAk6CTgJOgk2NjIyLjg2MzEKK0JlbnQgCToJOAk6CTM5OTEuNTAwOAorQm91bGRlciAJOgk4CToJMTk0Ni4wNDgzCitDaGFmZmVlIAk6CTgJOgkyNjI4Ljg3NTkKK0NoZXllbm5lIAk6CTgJOgk0NjEzLjc0ODMKK0NsZWFyIENyZWVrIAk6CTgJOgkxMDI2LjgzMTQKK0NvbmVqb3MgCToJOAk6CTMzNDMuMzUzMworQ29zdGlsbGEgCToJOAk6CTMxODYuODM5NgorQ3Jvd2xleSAJOgk4CToJMjA3Mi44NTQ3CitDdXN0ZXIgCToJOAk6CTE5MTYuMzQxCitEZWx0YSAJOgk4CToJMjk3NC42NjY4CitEZW52ZXIgCToJOAk6CTQwMS4yOTQ2CitEb2xvcmVzIAk6CTgJOgkyNzY2LjM1MzEKK0RvdWdsYXMgCToJOAk6CTIxODIuNzIyNQorRWFnbGUgCToJOAk6CTQzODEuNzYyCitFbGJlcnQgCToJOAk6CTQ3OTMuODA1MQorRWwgUGFzbyAJOgk4CToJNTUxNS41NjA0CitGcmVtb250IAk6CTgJOgkzOTcyLjkzMDUKK0dhcmZpZWxkIAk6CTgJOgk3NjU1LjQxODQKK0dpbHBpbiAJOgk4CToJMzg5LjE0NzUKK0dyYW5kIAk6CTgJOgk0ODQyLjI2NAorR3Vubmlzb24gCToJOAk6CTg0NDIuNzUyNQorSGluc2RhbGUgCToJOAk6CTI5MDguOTMyNgorSHVlcmZhbm8gCToJOAk6CTQxMjYuNDkxNgorSmFja3NvbiAJOgk4CToJNDE5OC4yNjA1CitKZWZmZXJzb24gCToJOAk6CTIwMTUuMTc1NAorS2lvd2EgCToJOAk6CTQ2MjUuMTE4NAorS2l0IENhcnNvbiAJOgk4CToJNTU5OC40NDA0CitMYWtlIAk6CTgJOgk5OTQuMzAxCitMYSBQbGF0YSAJOgk4CToJNDQwMi44MTg3CitMYXJpbWVyIAk6CTgJOgk2ODIxLjY5NzQKK0xhcyBBbmltYXMgCToJOAk6CTEyMzY4LjMzNzgKK0xpbmNvbG4gCToJOAk6CTY2OTguNzUwMQorTG9nYW4gCToJOAk6CTQ3NzguMTg3NAorTWVzYSAJOgk4CToJODY1My40NzQ5CitNaW5lcmFsIAk6CTgJOgkyMjczLjI0MworTW9mZmF0IAk6CTgJOgkxMjMwNC45MzQ2CitNb250ZXp1bWEgCToJOAk6CTUyODMuNTIyMworTW9udHJvc2UgCToJOAk6CTU4MDguMjU2MworTW9yZ2FuIAk6CTgJOgkzMzUxLjEyMzMKK090ZXJvIAk6CTgJOgkzMjg4LjYyNjYKK091cmF5IAk6CTgJOgkxNDA0LjMyMzkKK1BhcmsgCToJOAk6CTU3MjUuNjg3MQorUGhpbGxpcHMgCToJOAk6CTE3ODEuMjQ2NgorUGl0a2luIAk6CTgJOgkyNTIwLjY2NTcKK1Byb3dlcnMgCToJOAk6CTQyNTguODY2NQorUHVlYmxvIAk6CTgJOgk2MjEwLjEyMDcKK1JpbyBCbGFuY28gCToJOAk6CTgzNDcuMzM2OQorUmlvIEdyYW5kZSAJOgk4CToJMjM2Mi40NDI2CitSb3V0dCAJOgk4CToJNjEzMy4xNzE4CitTYWd1YWNoZSAJOgk4CToJODIxMC45NDc1CitTYW4gSnVhbiAJOgk4CToJMTAwNS42NzExCitTYW4gTWlndWVsIAk6CTgJOgkzMzM3LjE4OTEKK1NlZGd3aWNrIAk6CTgJOgkxNDIzLjQ2NAorU3VtbWl0IAk6CTgJOgkxNjAzLjg1NzUKK1RlbGxlciAJOgk4CToJMTQ0Ny43MDY0CitXYXNoaW5ndG9uIAk6CTgJOgk2NTM3LjQ3MDgKK1dlbGQgCToJOAk6CTEwNDE1Ljg0MDQKK1l1bWEgCToJOAk6CTYxMzUuOTY5CitGYWlyZmllbGQgCToJOQk6CTIxNjcuNzI2NAorSGFydGZvcmQgCToJOQk6CTE5NDMuOTc2MworTGl0Y2hmaWVsZCAJOgk5CToJMjQ0Ni40MzYzCitNaWRkbGVzZXggCToJOQk6CTExMzcuMTkxMworTmV3IEhhdmVuIAk6CTkJOgkyMjMyLjYzMTgKK05ldyBMb25kb24gCToJOQk6CTE5OTguNTk5NAorVG9sbGFuZCAJOgk5CToJMTA4MC4wNTU5CitXaW5kaGFtIAk6CTkJOgkxMzUwLjYwNzMKK0tlbnQgCToJMTAJOgkyMDcyLjMxMDgKK05ldyBDYXN0bGUgCToJMTAJOgkxMjc4LjE5MDkKK1N1c3NleCAJOgkxMAk6CTMwOTYuNzMzNQorRGlzdHJpY3Qgb2YgQ29sdW1iaWEJOgkxMQk6CTE3Ny4wMDA2CitBbGFjaHVhIAk6CTEyCToJMjUxMC4wMjA4CitCYWtlciAJOgkxMgk6CTE1MjUuMjI1MQorQmF5IAk6CTEyCToJMjY3Ni4xNjkzCitCcmFkZm9yZCAJOgkxMgk6CTc3Ny4xMDM2CitCcmV2YXJkIAk6CTEyCToJNDAzMi41MDA1CitCcm93YXJkIAk6CTEyCToJMzQxNy44NDE3CitDYWxob3VuIAk6CTEyCToJMTQ4Ny41NDA2CitDaGFybG90dGUgCToJMTIJOgkyMjI1LjEyMDgKK0NpdHJ1cyAJOgkxMgk6CTIwMDIuNDU4NQorQ2xheSAJOgkxMgk6CTE2NjcuMTU3MQorQ29sbGllciAJOgkxMgk6CTU5NjkuNzY4NworQ29sdW1iaWEgCToJMTIJOgkyMDc0LjY5MzYKK0RlU290byAJOgkxMgk6CTE2NTYuMzA1CitEaXhpZSAJOgkxMgk6CTIyMzYuODc5NAorRHV2YWwgCToJMTIJOgkyMzc4LjI0MTYKK0VzY2FtYmlhIAk6CTEyCToJMjI2Ny43MjYzCitGbGFnbGVyIAk6CTEyCToJMTQ3OC4yNjg0CitGcmFua2xpbiAJOgkxMgk6CTI2ODcuMDczMgorR2Fkc2RlbiAJOgkxMgk6CTEzNjguNzg5MQorR2lsY2hyaXN0IAk6CTEyCToJOTIwLjY2NzMKK0dsYWRlcyAJOgkxMgk6CTI1NTQuODUzNworR3VsZiAJOgkxMgk6CTE5MjguNDg4MQorSGFtaWx0b24gCToJMTIJOgkxMzQ1LjAxMjkKK0hhcmRlZSAJOgkxMgk6CTE2NTMuMjc0NworSGVuZHJ5IAk6CTEyCToJMzA4MS41NTYxCitIZXJuYW5kbyAJOgkxMgk6CTE1MjUuNzE3MgorSGlnaGxhbmRzIAk6CTEyCToJMjg2NS4yNjUyCitIaWxsc2Jvcm91Z2ggCToJMTIJOgkzMjc5LjUwOTgKK0hvbG1lcyAJOgkxMgk6CTEyNjUuNzU4OQorSW5kaWFuIFJpdmVyIAk6CTEyCToJMTU5Ny44MjI4CitKYWNrc29uIAk6CTEyCToJMjQ3Mi4zNjIyCitKZWZmZXJzb24gCToJMTIJOgkxNjQ4LjkyMzUKK0xhZmF5ZXR0ZSAJOgkxMgk6CTE0MTkuMTEyOAorTGFrZSAJOgkxMgk6CTI5OTUuMDc2CitMZWUgCToJMTIJOgkzMTM4Ljc5NTEKK0xlb24gCToJMTIJOgkxODE3LjYxMDIKK0xldnkgCToJMTIJOgkzNjU3LjkwODgKK0xpYmVydHkgCToJMTIJOgkyMTgzLjc4NDQKK01hZGlzb24gCToJMTIJOgkxODUzLjkyMgorTWFuYXRlZSAJOgkxMgk6CTIzMTIuMjIyNQorTWFyaW9uIAk6CTEyCToJNDMwNy4xOTU5CitNYXJ0aW4gCToJMTIJOgkxOTQ5LjcyNjEKK01pYW1pLURhZGUgCToJMTIJOgk2Mjk2Ljk2MzQKK01vbnJvZSAJOgkxMgk6CTk2NzkuMjE4NQorTmFzc2F1IAk6CTEyCToJMTg3OS45Nzc0CitPa2Fsb29zYSAJOgkxMgk6CTI4MDIuMzgKK09rZWVjaG9iZWUgCToJMTIJOgkyMzA5LjE2NjMKK09yYW5nZSAJOgkxMgk6CTI2MDAuODUyMQorT3NjZW9sYSAJOgkxMgk6CTM5MDEuNDQ2NQorUGFsbSBCZWFjaCAJOgkxMgk6CTYxODAuNTk0NworUGFzY28gCToJMTIJOgkyMjQ3Ljk5MDUKK1BpbmVsbGFzIAk6CTEyCToJMTU3My44NjUzCitQb2xrIAk6CTEyCToJNTIwNS44NzQxCitQdXRuYW0gCToJMTIJOgkyMTQyLjM0NDQKK1N0LiBKb2hucyAJOgkxMgk6CTIxMjcuNTAzNworU3QuIEx1Y2llIAk6CTEyCToJMTc4Mi4xMjcyCitTYW50YSBSb3NhIAk6CTEyCToJMzAzOS41NDYzCitTYXJhc290YSAJOgkxMgk6CTE4NzguMjE2MgorU2VtaW5vbGUgCToJMTIJOgk4OTMuMjEzMworU3VtdGVyIAk6CTEyCToJMTUwMy4wMDI5CitTdXdhbm5lZSAJOgkxMgk6CTE3OTIuMDIxCitUYXlsb3IgCToJMTIJOgkzMTkwLjkwNTkKK1VuaW9uIAk6CTEyCToJNjQ2Ljc0ODkKK1ZvbHVzaWEgCToJMTIJOgkzNzEwLjAxOTYKK1dha3VsbGEgCToJMTIJOgkxOTA1LjU2NjYKK1dhbHRvbiAJOgkxMgk6CTMyMDYuNDk3NworV2FzaGluZ3RvbiAJOgkxMgk6CTE1OTQuODk2MQorQXBwbGluZyAJOgkxMwk6CTEzMjYuMzY0OQorQXRraW5zb24gCToJMTMJOgk4OTEuMjE5CitCYWNvbiAJOgkxMwk6CTc0MC41MzI4CitCYWtlciAJOgkxMwk6CTkwNC4zNTAzCitCYWxkd2luIAk6CTEzCToJNjkyLjgyNQorQmFua3MgCToJMTMJOgk2MDUuNzIzMworQmFycm93IAk6CTEzCToJNDIxLjc1NTYKK0JhcnRvdyAJOgkxMwk6CTEyMTcuNTg0OQorQmVuIEhpbGwgCToJMTMJOgk2NTcuOTM3NworQmVycmllbiAJOgkxMwk6CTExODUuNjUwMgorQmliYiAJOgkxMwk6CTY2MC43ODY3CitCbGVja2xleSAJOgkxMwk6CTU2Ny41NzI2CitCcmFudGxleSAJOgkxMwk6CTExNTguODE3OAorQnJvb2tzIAk6CTEzCToJMTI4OS4yMjQzCitCcnlhbiAJOgkxMwk6CTExNzcuMTI5MQorQnVsbG9jaCAJOgkxMwk6CTE3ODQuMDk1NgorQnVya2UgCToJMTMJOgkyMTYyLjYyNDEKK0J1dHRzIAk6CTEzCToJNDkyLjEyNTkKK0NhbGhvdW4gCToJMTMJOgk3MzQuNDQ2MworQ2FtZGVuIAk6CTEzCToJMjAyNi43MjY4CitDYW5kbGVyIAk6CTEzCToJNjQ0LjQxNzkKK0NhcnJvbGwgCToJMTMJOgkxMzA0LjkxOTcKK0NhdG9vc2EgCToJMTMJOgk0MjEuMjg5NAorQ2hhcmx0b24gCToJMTMJOgkyMDI3Ljg5MjMKK0NoYXRoYW0gCToJMTMJOgkxNjM3LjYwNTIKK0NoYXR0YWhvb2NoZWUgCToJMTMJOgk2NTAuNTMwMworQ2hhdHRvb2dhIAk6CTEzCToJODEyLjA5NDUKK0NoZXJva2VlIAk6CTEzCToJMTEyNC4wMzQxCitDbGFya2UgCToJMTMJOgkzMTQuMTE1MgorQ2xheSAJOgkxMwk6CTU2Mi4wMDQxCitDbGF5dG9uIAk6CTEzCToJMzczLjY4NTIKK0NsaW5jaCAJOgkxMwk6CTIxMzQuNjAwMworQ29iYiAJOgkxMwk6CTg5Mi4yODA5CitDb2ZmZWUgCToJMTMJOgkxNTYwLjc1OTkKK0NvbHF1aXR0IAk6CTEzCToJMTQ0MS40NjQ1CitDb2x1bWJpYSAJOgkxMwk6CTc5Ny4xNTAyCitDb29rIAk6CTEzCToJNjA0LjAzOTgKK0Nvd2V0YSAJOgkxMwk6CTExNTUuMDg4MgorQ3Jhd2ZvcmQgCToJMTMJOgk4NDUuNTA1NQorQ3Jpc3AgCToJMTMJOgk3MjguMzA4CitEYWRlIAk6CTEzCToJNDUxLjA3NDQKK0Rhd3NvbiAJOgkxMwk6CTU1NC4wNzg3CitEZWNhdHVyIAk6CTEzCToJMTYxMy45ODQ0CitEZUthbGIgCToJMTMJOgk3MDEuNjU2OQorRG9kZ2UgCToJMTMJOgkxMzAzLjIxMDMKK0Rvb2x5IAk6CTEzCToJMTAyOC40MTEzCitEb3VnaGVydHkgCToJMTMJOgk4NjYuNzE3NgorRG91Z2xhcyAJOgkxMwk6CTUxOC42NzM0CitFYXJseSAJOgkxMwk6CTEzMzcuMTM5MworRWNob2xzIAk6CTEzCToJMTA4OS44NzIKK0VmZmluZ2hhbSAJOgkxMwk6CTEyNTAuNTAzOAorRWxiZXJ0IAk6CTEzCToJOTcwLjA1ODYKK0VtYW51ZWwgCToJMTMJOgkxNzg3Ljk1NDcKK0V2YW5zIAk6CTEzCToJNDg0LjAxOTIKK0Zhbm5pbiAJOgkxMwk6CTEwMTMuODAzNworRmF5ZXR0ZSAJOgkxMwk6CTUxNi4wNTc1CitGbG95ZCAJOgkxMwk6CTEzNDIuODExNAorRm9yc3l0aCAJOgkxMwk6CTY0MC42ODgzCitGcmFua2xpbiAJOgkxMwk6CTY4OS44OTgzCitGdWx0b24gCToJMTMJOgkxMzg0LjYzOTkKK0dpbG1lciAJOgkxMwk6CTExMTguNDM5NworR2xhc2NvY2sgCToJMTMJOgkzNzQuMTI1NQorR2x5bm4gCToJMTMJOgkxNTE1LjU5MDMKK0dvcmRvbiAJOgkxMwk6CTkyNy4yNDU5CitHcmFkeSAJOgkxMwk6CTExOTIuMjgwNgorR3JlZW5lIAk6CTEzCToJMTA1Mi4xNjE2CitHd2lubmV0dCAJOgkxMwk6CTExMzEuMTA0OAorSGFiZXJzaGFtIAk6CTEzCToJNzIzLjEyOAorSGFsbCAJOgkxMwk6CTExMTEuNjAyMQorSGFuY29jayAJOgkxMwk6CTEyMzkuOTg4NAorSGFyYWxzb24gCToJMTMJOgk3MzMuMzg0NAorSGFycmlzIAk6CTEzCToJMTIyNC44ODg3CitIYXJ0IAk6CTEzCToJNjY0LjEyNzgKK0hlYXJkIAk6CTEzCToJNzc5Ljc5NzIKK0hlbnJ5IAk6CTEzCToJODQwLjQwMzIKK0hvdXN0b24gCToJMTMJOgk5ODMuNzU5NworSXJ3aW4gCToJMTMJOgk5MzkuNDcwNworSmFja3NvbiAJOgkxMwk6CTg4OC4zNworSmFzcGVyIAk6CTEzCToJOTY3LjU3MjIKK0plZmYgRGF2aXMgCToJMTMJOgk4NjguNzM3OAorSmVmZmVyc29uIAk6CTEzCToJMTM3MS41NjA0CitKZW5raW5zIAk6CTEzCToJOTEyLjg0NTUKK0pvaG5zb24gCToJMTMJOgk3OTMuODg2OAorSm9uZXMgCToJMTMJOgkxMDI0LjA2MDEKK0xhbWFyIAk6CTEzCToJNDgxLjE5NjEKK0xhbmllciAJOgkxMwk6CTUxNy41NTk3CitMYXVyZW5zIAk6CTEzCToJMjExOS45NDA5CitMZWUgCToJMTMJOgk5MzcuNjA1OQorTGliZXJ0eSAJOgkxMwk6CTE1NjAuNTI2OAorTGluY29sbiAJOgkxMwk6CTY2Ni4zNTUyCitMb25nIAk6CTEzCToJMTA0NS4wMzkxCitMb3duZGVzIAk6CTEzCToJMTMyMi41MzE3CitMdW1wa2luIAk6CTEzCToJNzM3LjgxMzMKK01jRHVmZmllIAk6CTEzCToJNjg5LjcxNworTWNJbnRvc2ggCToJMTMJOgkxNDg4LjAzMjcKK01hY29uIAk6CTEzCToJMTA1MS40MTA1CitNYWRpc29uIAk6CTEzCToJNzM5LjYyNjMKK01hcmlvbiAJOgkxMwk6CTk1MS43OTkxCitNZXJpd2V0aGVyIAk6CTEzCToJMTMwOC44MzA2CitNaWxsZXIgCToJMTMJOgk3MzQuODM0OAorTWl0Y2hlbGwgCToJMTMJOgkxMzMwLjc2NzkKK01vbnJvZSAJOgkxMwk6CTEwMzAuMzAyCitNb250Z29tZXJ5IAk6CTEzCToJNjQwLjU1ODgKK01vcmdhbiAJOgkxMwk6CTkxOC40MTQKK011cnJheSAJOgkxMwk6CTg5OC40MTkyCitNdXNjb2dlZSAJOgkxMwk6CTU3Mi4zOQorTmV3dG9uIAk6CTEzCToJNzIzLjEwMjEKK09jb25lZSAJOgkxMwk6CTQ4Mi4xMDI2CitPZ2xldGhvcnBlIAk6CTEzCToJMTE0NS4yMjAzCitQYXVsZGluZyAJOgkxMwk6CTgxNi4wMDU0CitQZWFjaCAJOgkxMwk6CTM5Mi4yODE0CitQaWNrZW5zIAk6CTEzCToJNjAyLjkwMDIKK1BpZXJjZSAJOgkxMwk6CTg5MC43MDEKK1Bpa2UgCToJMTMJOgk1NjguMzIzNworUG9sayAJOgkxMwk6CTgwOC40MTY3CitQdWxhc2tpIAk6CTEzCToJNjQ3LjIxNTEKK1B1dG5hbSAJOgkxMwk6CTkzNC4wMzE3CitRdWl0bWFuIAk6CTEzCToJNDE2Ljc4MjgKK1JhYnVuIAk6CTEzCToJOTc2LjQwNDEKK1JhbmRvbHBoIAk6CTEzCToJMTExNi4wMDUxCitSaWNobW9uZCAJOgkxMwk6CTg1MC42ODU1CitSb2NrZGFsZSAJOgkxMwk6CTM0Mi4yMTY3CitTY2hsZXkgCToJMTMJOgk0MzQuNjUzOAorU2NyZXZlbiAJOgkxMwk6CTE2OTcuOTc4MQorU2VtaW5vbGUgCToJMTMJOgk2NjQuNDkwNAorU3BhbGRpbmcgCToJMTMJOgk1MTYuOTY0CitTdGVwaGVucyAJOgkxMwk6CTQ3Ny4xNTU3CitTdGV3YXJ0IAk6CTEzCToJMTE5OS43NjU3CitTdW10ZXIgCToJMTMJOgkxMjc1LjY3ODYKK1RhbGJvdCAJOgkxMwk6CTEwMjIuMzc2NgorVGFsaWFmZXJybyAJOgkxMwk6CTUwNi4yNjczCitUYXR0bmFsbCAJOgkxMwk6CTEyNjQuNDg5OAorVGF5bG9yIAk6CTEzCToJOTgzLjE4OTkKK1RlbGZhaXIgCToJMTMJOgkxMTUwLjE2NzIKK1RlcnJlbGwgCToJMTMJOgk4NzQuNDYxNworVGhvbWFzIAk6CTEzCToJMTQyOS44ODcyCitUaWZ0IAk6CTEzCToJNjk2LjM0NzQKK1Rvb21icyAJOgkxMwk6CTk1NC43Nzc2CitUb3ducyAJOgkxMwk6CTQ0NS41MDU5CitUcmV1dGxlbiAJOgkxMwk6CTUyMy42NzIxCitUcm91cCAJOgkxMwk6CTExNTUuMDM2NAorVHVybmVyIAk6CTEzCToJNzUwLjcxMTUKK1R3aWdncyAJOgkxMwk6CTk0MC4wNDA1CitVbmlvbiAJOgkxMwk6CTg1Mi4xNjE4CitVcHNvbiAJOgkxMwk6CTg0OC41ODc2CitXYWxrZXIgCToJMTMJOgkxMTU3LjgwNzcKK1dhbHRvbiAJOgkxMwk6CTg1NC44Mjk1CitXYXJlIAk6CTEzCToJMjM0Ny4zNDI5CitXYXJyZW4gCToJMTMJOgk3NDIuNjU2NgorV2FzaGluZ3RvbiAJOgkxMwk6CTE3NzIuNTE4MworV2F5bmUgCToJMTMJOgkxNjgwLjM5MgorV2Vic3RlciAJOgkxMwk6CTU0NC41NzM0CitXaGVlbGVyIAk6CTEzCToJNzc3LjM2MjYKK1doaXRlIAk6CTEzCToJNjI3LjE5NDQKK1doaXRmaWVsZCAJOgkxMwk6CTc1Mi43ODM1CitXaWxjb3ggCToJMTMJOgk5OTIuNzQ3CitXaWxrZXMgCToJMTMJOgkxMjI3LjY2CitXaWxraW5zb24gCToJMTMJOgkxMTcwLjcwNTkKK1dvcnRoIAk6CTEzCToJMTQ4OC4xNjIyCitIYXdhaWkgCToJMTUJOgkxMzE3NC41NTMKK0hvbm9sdWx1IAk6CTE1CToJNTUwOC41NDE1CitLYWxhd2FvIAk6CTE1CToJMTM1LjUzNDcKK0thdWFpIAk6CTE1CToJMzI3OS44OTgzCitNYXVpIAk6CTE1CToJNjIxMi43MzY2CitBZGEgCToJMTYJOgkyNzQ2LjI1NDcKK0FkYW1zIAk6CTE2CToJMzU0OC4zCitCYW5ub2NrIAk6CTE2CToJMjk3MS45MjE0CitCZWFyIExha2UgCToJMTYJOgkyNzE4LjA0OTYKK0JlbmV3YWggCToJMTYJOgkyMDMwLjUwODIKK0JpbmdoYW0gCToJMTYJOgk1NDkxLjQyMTYKK0JsYWluZSAJOgkxNgk6CTY4OTIuMDQxOAorQm9pc2UgCToJMTYJOgk0OTM4LjUwODQKK0Jvbm5lciAJOgkxNgk6CTQ5NzEuNzM4MQorQm9ubmV2aWxsZSAJOgkxNgk6CTQ5MjIuNjgzNQorQm91bmRhcnkgCToJMTYJOgkzMzEwLjU2MzkKK0J1dHRlIAk6CTE2CToJNTc4NC45OTgxCitDYW1hcyAJOgkxNgk6CTI3OTQuNjYxOAorQ2FueW9uIAk6CTE2CToJMTU2My4wOTA5CitDYXJpYm91IAk6CTE2CToJNDY1OC40MjU4CitDYXNzaWEgCToJMTYJOgk2NjgzLjAwMjkKK0NsYXJrIAk6CTE2CToJNDU3MS44OTM5CitDbGVhcndhdGVyIAk6CTE2CToJNjQ0NC4xNzkKK0N1c3RlciAJOgkxNgk6CTEyNzg2LjI4NjEKK0VsbW9yZSAJOgkxNgk6CTgwMzAuMzIwOQorRnJhbmtsaW4gCToJMTYJOgkxNzMxLjA1MjQKK0ZyZW1vbnQgCToJMTYJOgk0OTA5LjU3ODEKK0dlbSAJOgkxNgk6CTE0NjUuMjkyNQorR29vZGluZyAJOgkxNgk6CTE5MDAuNjQ1NgorSWRhaG8gCToJMTYJOgkyMjAyMS40MjMyCitKZWZmZXJzb24gCToJMTYJOgkyODYzLjM3NDUKK0plcm9tZSAJOgkxNgk6CTE1NTguODQzMworS29vdGVuYWkgCToJMTYJOgkzNDA3LjYzNzEKK0xhdGFoIAk6CTE2CToJMjc4OS4xNDUxCitMZW1oaSAJOgkxNgk6CTExODM1LjAwNQorTGV3aXMgCToJMTYJOgkxMjQyLjcwNzkKK0xpbmNvbG4gCToJMTYJOgkzMTIzLjE3NzQKK01hZGlzb24gCToJMTYJOgkxMjI2LjAwMjQKK01pbmlkb2thIAk6CTE2CToJMTk3Ni4xMTgyCitOZXogUGVyY2UgCToJMTYJOgkyMjE3Ljk3MjQKK09uZWlkYSAJOgkxNgk6CTMxMTIuMTY5OQorT3d5aGVlIAk6CTE2CToJMTk5MzQuNDc4OQorUGF5ZXR0ZSAJOgkxNgk6CTEwNjIuMzkyMQorUG93ZXIgCToJMTYJOgkzNzM2LjMzNAorU2hvc2hvbmUgCToJMTYJOgk2ODI1Ljk0NQorVGV0b24gCToJMTYJOgkxMTY2Ljk3NjMKK1R3aW4gRmFsbHMgCToJMTYJOgk0OTk0LjczNzMKK1ZhbGxleSAJOgkxNgk6CTk2NzAuMTc5NAorV2FzaGluZ3RvbiAJOgkxNgk6CTM4MTYuNDY4NgorQWRhbXMgCToJMTcJOgkyMjU2LjYxNTIKK0FsZXhhbmRlciAJOgkxNwk6CTY1NC4wNzg2CitCb25kIAk6CTE3CToJOTkxLjExNTMKK0Jvb25lIAk6CTE3CToJNzMwLjIyNDYKK0Jyb3duIAk6CTE3CToJNzk1Ljc1MTYKK0J1cmVhdSAJOgkxNwk6CTIyNjEuODQ3CitDYWxob3VuIAk6CTE3CToJNzM0Ljc1NzEKK0NhcnJvbGwgCToJMTcJOgkxMjA2LjM0NDMKK0Nhc3MgCToJMTcJOgk5OTMuODYwNworQ2hhbXBhaWduIAk6CTE3CToJMjU4My42MDI3CitDaHJpc3RpYW4gCToJMTcJOgkxODUzLjY4ODkKK0NsYXJrIAk6CTE3CToJMTMwNy42MzkyCitDbGF5IAk6CTE3CToJMTIxNi44ODU2CitDbGludG9uIAk6CTE3CToJMTMwNC4wMTMyCitDb2xlcyAJOgkxNwk6CTEzMjEuMDgxMworQ29vayAJOgkxNwk6CTQyMzQuNzUzNgorQ3Jhd2ZvcmQgCToJMTcJOgkxMTU0LjQ2NjYKK0N1bWJlcmxhbmQgCToJMTcJOgk4OTguNzMKK0RlS2FsYiAJOgkxNwk6CTE2NDQuNTcyMworRGUgV2l0dCAJOgkxNwk6CTEwNDkuMzM4NQorRG91Z2xhcyAJOgkxNwk6CTEwODEuMTE3OAorRHVQYWdlIAk6CTE3CToJODcxLjY2NDUKK0VkZ2FyIAk6CTE3CToJMTYxNi42MjYyCitFZHdhcmRzIAk6CTE3CToJNTc2LjY4OTQKK0VmZmluZ2hhbSAJOgkxNwk6CTEyNDIuOTQxCitGYXlldHRlIAk6CTE3CToJMTg3OC42ODI0CitGb3JkIAk6CTE3CToJMTI1OS44Mjc4CitGcmFua2xpbiAJOgkxNwk6CTExMTcuMzI2CitGdWx0b24gCToJMTcJOgkyMjg1LjkwODEKK0dhbGxhdGluIAk6CTE3CToJODUwLjU4MTkKK0dyZWVuZSAJOgkxNwk6CTE0MTUuMDIwNgorR3J1bmR5IAk6CTE3CToJMTExNC43ODc4CitIYW1pbHRvbiAJOgkxNwk6CTExMjguODI1NgorSGFuY29jayAJOgkxNwk6CTIxMDkuNjU4NgorSGFyZGluIAk6CTE3CToJNDcwLjE2MjcKK0hlbmRlcnNvbiAJOgkxNwk6CTEwMjMuMzYwOAorSGVucnkgCToJMTcJOgkyMTM4LjMwNAorSXJvcXVvaXMgCToJMTcJOgkyODk1LjY5NzcKK0phY2tzb24gCToJMTcJOgkxNTYwLjU1MjcKK0phc3BlciAJOgkxNwk6CTEyODkuODcxOAorSmVmZmVyc29uIAk6CTE3CToJMTUxMS44MDg5CitKZXJzZXkgCToJMTcJOgk5NzYuNDgxOAorSm8gRGF2aWVzcyAJOgkxNwk6CTE2MDIuNDg0OAorSm9obnNvbiAJOgkxNwk6CTkwMy41OTkyCitLYW5lIAk6CTE3CToJMTM1Ny4zNjcyCitLYW5rYWtlZSAJOgkxNwk6CTE3NjQuOTI5NgorS2VuZGFsbCAJOgkxNwk6CTgzNS43MTUzCitLbm94IAk6CTE3CToJMTg2NC4wMjMKK0xha2UgCToJMTcJOgkzNTQyLjk5MDUKK0xhIFNhbGxlIAk6CTE3CToJMjk3My40MjM2CitMYXdyZW5jZSAJOgkxNwk6CTk2OC41MDQ2CitMZWUgCToJMTcJOgkxODg4Ljg2MTEKK0xpdmluZ3N0b24gCToJMTcJOgkyNzA3LjY2MzcKK0xvZ2FuIAk6CTE3CToJMTYwMy4yMzU5CitNY0Rvbm91Z2ggCToJMTcJOgkxNTI4LjE1MTgKK01jSGVucnkgCToJMTcJOgkxNTgyLjgyNjcKK01jTGVhbiAJOgkxNwk6CTMwNzIuNDkxMQorTWFjb24gCToJMTcJOgkxNTE2LjEzNDIKK01hY291cGluIAk6CTE3CToJMjI0Ny4xMDk5CitNYWRpc29uIAk6CTE3CToJMTkxNy41MDY1CitNYXJpb24gCToJMTcJOgkxNDkxLjA4ODkKK01hcnNoYWxsIAk6CTE3CToJMTAzMi4xNjY4CitNYXNvbiAJOgkxNwk6CTE0NTkuMTI4MworTWFzc2FjIAk6CTE3CToJNjI3LjA5MDgKK01lbmFyZCAJOgkxNwk6CTgxNi44MDgzCitNZXJjZXIgCToJMTcJOgkxNDczLjM5OTIKK01vbnJvZSAJOgkxNwk6CTEwMzAuMDY4OQorTW9udGdvbWVyeSAJOgkxNwk6CTE4MzguMjUyNQorTW9yZ2FuIAk6CTE3CToJMTQ4Mi4xNTM0CitNb3VsdHJpZSAJOgkxNwk6CTg5Mi4xNzczCitPZ2xlIAk6CTE3CToJMTk3Ni44NjkzCitQZW9yaWEgCToJMTcJOgkxNjM0LjAwNTEKK1BlcnJ5IAk6CTE3CToJMTE1Ny4yMzc5CitQaWF0dCAJOgkxNwk6CTExNDAuNDU0NworUGlrZSAJOgkxNwk6CTIxOTguNTczMworUG9wZSAJOgkxNwk6CTk3MC4zMTc2CitQdWxhc2tpIAk6CTE3CToJNTI2LjYyNDcKK1B1dG5hbSAJOgkxNwk6CTQ0Ni4xMDE2CitSYW5kb2xwaCAJOgkxNwk6CTE1NDYuOTAzNAorUmljaGxhbmQgCToJMTcJOgk5MzcuNjA1OQorUm9jayBJc2xhbmQgCToJMTcJOgkxMTY4LjUwNDQKK1N0LiBDbGFpciAJOgkxNwk6CTE3NDUuNTMwNQorU2FsaW5lIAk6CTE3CToJMTAwMi4yNzgyCitTYW5nYW1vbiAJOgkxNwk6CTIyNzEuNDU1OQorU2NodXlsZXIgCToJMTcJOgkxMTQzLjIwMDEKK1Njb3R0IAk6CTE3CToJNjU0LjY3NDMKK1NoZWxieSAJOgkxNwk6CTE5ODkuMjQ5NQorU3RhcmsgCToJMTcJOgk3NDYuNDYzOQorU3RlcGhlbnNvbiAJOgkxNwk6CTE0NjIuNjI0OAorVGF6ZXdlbGwgCToJMTcJOgkxNzAzLjkzNTEKK1VuaW9uIAk6CTE3CToJMTA5My4zMTY3CitWZXJtaWxpb24gCToJMTcJOgkyMzM2LjU0MjYKK1dhYmFzaCAJOgkxNwk6CTU4OS44OTg0CitXYXJyZW4gCToJMTcJOgkxNDA2LjgxMDMKK1dhc2hpbmd0b24gCToJMTcJOgkxNDYxLjA3MDgKK1dheW5lIAk6CTE3CToJMTg1My4zMDA0CitXaGl0ZSAJOgkxNwk6CTEyOTkuNDAzCitXaGl0ZXNpZGUgCToJMTcJOgkxODA1LjI1NTkKK1dpbGwgCToJMTcJOgkyMTk5LjkyMDEKK1dpbGxpYW1zb24gCToJMTcJOgkxMTUwLjk0NDIKK1dpbm5lYmFnbyAJOgkxNwk6CTEzNDQuOTA5MworV29vZGZvcmQgCToJMTcJOgkxNDA1LjY5NjYKK0FkYW1zIAk6CTE4CToJODgwLjQxODcKK0FsbGVuIAk6CTE4CToJMTcwOS42NTkKK0JhcnRob2xvbWV3IAk6CTE4CToJMTA2MC4yNDI0CitCZW50b24gCToJMTgJOgkxMDUyLjU3NgorQmxhY2tmb3JkIAk6CTE4CToJNDI4LjM4NgorQm9vbmUgCToJMTgJOgkxMDk2LjI5NTIKK0Jyb3duIAk6CTE4CToJODIwLjA0NTgKK0NhcnJvbGwgCToJMTgJOgk5NzEuMzc5NQorQ2FzcyAJOgkxOAk6CTEwNzQuNjQyOAorQ2xhcmsgCToJMTgJOgk5NzQuMzU4CitDbGF5IAk6CTE4CToJOTMzLjQxMDEKK0NsaW50b24gCToJMTgJOgkxMDQ5LjY3NTIKK0NyYXdmb3JkIAk6CTE4CToJNzk5LjkyMTUKK0Rhdmllc3MgCToJMTgJOgkxMTMxLjQ2NzQKK0RlYXJib3JuIAk6CTE4CToJNzk1LjI1OTUKK0RlY2F0dXIgCToJMTgJOgk5NjcuMTU3OAorRGVLYWxiIAk6CTE4CToJOTQyLjM0NTYKK0RlbGF3YXJlIAk6CTE4CToJMTAyNS40MzI4CitEdWJvaXMgCToJMTgJOgkxMTI3LjI0NTcKK0Vsa2hhcnQgCToJMTgJOgkxMjExLjczMTUKK0ZheWV0dGUgCToJMTgJOgk1NTcuMTYwOAorRmxveWQgCToJMTgJOgkzODQuMTIyOQorRm91bnRhaW4gCToJMTgJOgkxMDMwLjYxMjgKK0ZyYW5rbGluIAk6CTE4CToJMTAxMy41NzA2CitGdWx0b24gCToJMTgJOgk5NjEuODQ4MworR2lic29uIAk6CTE4CToJMTI5Mi41Mzk1CitHcmFudCAJOgkxOAk6CTEwNzQuNDA5NworR3JlZW5lIAk6CTE4CToJMTQxMy45MDY5CitIYW1pbHRvbiAJOgkxOAk6CTEwNDMuMDcwNworSGFuY29jayAJOgkxOAk6CTc5NC40MzA3CitIYXJyaXNvbiAJOgkxOAk6CTEyNjEuMDE5MgorSGVuZHJpY2tzIAk6CTE4CToJMTA1OC45OTkyCitIZW5yeSAJOgkxOAk6CTEwMjIuNzkxCitIb3dhcmQgCToJMTgJOgk3NjEuMjc4NworSHVudGluZ3RvbiAJOgkxOAk6CTEwMDQuNzY0NgorSmFja3NvbiAJOgkxOAk6CTEzMzAuNjEyNQorSmFzcGVyIAk6CTE4CToJMTQ1My41NTk4CitKYXkgCToJMTgJOgk5OTQuMDkzOAorSmVmZmVyc29uIAk6CTE4CToJOTQwLjAxNDYKK0plbm5pbmdzIAk6CTE4CToJOTc5LjkyNjUKK0pvaG5zb24gCToJMTgJOgk4MzIuODQwNAorS25veCAJOgkxOAk6CTEzNTcuMzE1NAorS29zY2l1c2tvIAk6CTE4CToJMTQzNS43NDA2CitMYWdyYW5nZSAJOgkxOAk6CTEwMDEuNjA0OAorTGFrZSAJOgkxOAk6CTE2MjIuMjIwNgorTGFQb3J0ZSAJOgkxOAk6CTE1ODcuNzczNgorTGF3cmVuY2UgCToJMTgJOgkxMTcwLjg2MTMKK01hZGlzb24gCToJMTgJOgkxMTczLjAzNjkKK01hcmlvbiAJOgkxOAk6CTEwNDMuODczNgorTWFyc2hhbGwgCToJMTgJOgkxMTY1LjI5MjgKK01hcnRpbiAJOgkxOAk6CTg4MS45NzI3CitNaWFtaSAJOgkxOAk6CTk3Ny4zNjI0CitNb25yb2UgCToJMTgJOgkxMDY1LjMxODgKK01vbnRnb21lcnkgCToJMTgJOgkxMzA4LjgzMDYKK01vcmdhbiAJOgkxOAk6CTEwNjAuMzIwMQorTmV3dG9uIAk6CTE4CToJMTA0NS4xNDI3CitOb2JsZSAJOgkxOAk6CTEwODEuNjA5OQorT2hpbyAJOgkxOAk6CTIyNi41NDczCitPcmFuZ2UgCToJMTgJOgkxMDU3LjIzOAorT3dlbiAJOgkxOAk6CTEwMDQuNDc5NworUGFya2UgCToJMTgJOgkxMTY1Ljc1OQorUGVycnkgCToJMTgJOgkxMDAwLjYyMDYKK1Bpa2UgCToJMTgJOgk4ODMuMzk3MgorUG9ydGVyIAk6CTE4CToJMTM1MC45Njk5CitQb3NleSAJOgkxOAk6CTEwODYuMzc1NQorUHVsYXNraSAJOgkxOAk6CTExMjUuNTM2MworUHV0bmFtIAk6CTE4CToJMTI0OS44ODIyCitSYW5kb2xwaCAJOgkxOAk6CTExNzMuODY1NworUmlwbGV5IAk6CTE4CToJMTE2MC4wODY5CitSdXNoIAk6CTE4CToJMTA1OC4zMjU4CitTdC4gSm9zZXBoIAk6CTE4CToJMTE5My45MTIzCitTY290dCAJOgkxOAk6CTQ5OS4xNzA3CitTaGVsYnkgCToJMTgJOgkxMDY5Ljk1NDkKK1NwZW5jZXIgCToJMTgJOgkxMDM5LjE4NTcKK1N0YXJrZSAJOgkxOAk6CTgwOC44ODI5CitTdGV1YmVuIAk6CTE4CToJODM1LjIyMzIKK1N1bGxpdmFuIAk6CTE4CToJMTE3NS45NjM2CitTd2l0emVybGFuZCAJOgkxOAk6CTU3OC45MTY4CitUaXBwZWNhbm9lIAk6CTE4CToJMTMwMi45NTEzCitUaXB0b24gCToJMTgJOgk2NzQuNDYxOQorVW5pb24gCToJMTgJOgk0MjcuOTk3NQorVmFuZGVyYnVyZ2ggCToJMTgJOgk2MTAuNTY2NgorVmVybWlsbGlvbiAJOgkxOAk6CTY3My4yNDQ2CitWaWdvIAk6CTE4CToJMTA2My4xMTczCitXYWJhc2ggCToJMTgJOgkxMDkwLjU3MTMKK1dhcnJlbiAJOgkxOAk6CTk0OS40OTQKK1dhcnJpY2sgCToJMTgJOgkxMDEyLjMyNzQKK1dhc2hpbmd0b24gCToJMTgJOgkxMzM3LjgxMjcKK1dheW5lIAk6CTE4CToJMTA0Ny4yNDA2CitXZWxscyAJOgkxOAk6CTk1OS4zNjE5CitXaGl0ZSAJOgkxOAk6CTEzMTcuNzkyCitXaGl0bGV5IAk6CTE4CToJODc1LjE2MQorQWRhaXIgCToJMTkJOgkxNDc3LjEwMjkKK0FkYW1zIAk6CTE5CToJMTEwMS44MTE5CitBbGxhbWFrZWUgCToJMTkJOgkxNzA2LjA1ODkKK0FwcGFub29zZSAJOgkxOQk6CTEzMzcuMzQ2NQorQXVkdWJvbiAJOgkxOQk6CTExNDguODcyMgorQmVudG9uIAk6CTE5CToJMTg2MC43ODU1CitCbGFjayBIYXdrIAk6CTE5CToJMTQ4MS4yNDY5CitCb29uZSAJOgkxOQk6CTE0ODUuMzkwOQorQnJlbWVyIAk6CTE5CToJMTEzOC41NjQKK0J1Y2hhbmFuIAk6CTE5CToJMTQ4NC45NzY1CitCdWVuYSBWaXN0YSAJOgkxOQk6CTE1MDIuMzgxMworQnV0bGVyIAk6CTE5CToJMTUwNi4yNDA0CitDYWxob3VuIAk6CTE5CToJMTQ4Mi4yMzExCitDYXJyb2xsIAk6CTE5CToJMTQ3Ni45MjE2CitDYXNzIAk6CTE5CToJMTQ2My4zNzU5CitDZWRhciAJOgkxOQk6CTE1MDcuMjc2NAorQ2Vycm8gR29yZG8gCToJMTkJOgkxNDg5LjU2MDgKK0NoZXJva2VlIAk6CTE5CToJMTQ5NS4zMTA2CitDaGlja2FzYXcgCToJMTkJOgkxMzA5LjE5MzIKK0NsYXJrZSAJOgkxOQk6CTExMTguMTU0OAorQ2xheSAJOgkxOQk6CTE0ODIuODAwOQorQ2xheXRvbiAJOgkxOQk6CTIwNTMuMzc3OQorQ2xpbnRvbiAJOgkxOQk6CTE4MzkuMzkyMQorQ3Jhd2ZvcmQgCToJMTkJOgkxODUxLjgyNDEKK0RhbGxhcyAJOgkxOQk6CTE1MzIuNTgwNworRGF2aXMgCToJMTkJOgkxMzA3LjY2NTEKK0RlY2F0dXIgCToJMTkJOgkxMzgxLjI5ODgKK0RlbGF3YXJlIAk6CTE5CToJMTQ5OS43Mzk1CitEZXMgTW9pbmVzIAk6CTE5CToJMTExMy4xODIKK0RpY2tpbnNvbiAJOgkxOQk6CTEwNDUuNTU3MQorRHVidXF1ZSAJOgkxOQk6CTE1OTYuODkwNAorRW1tZXQgCToJMTkJOgkxMDQyLjE2NDIKK0ZheWV0dGUgCToJMTkJOgkxODk0LjQ1NTUKK0Zsb3lkIAk6CTE5CToJMTI5OC4zOTI5CitGcmFua2xpbiAJOgkxOQk6CTE1MDkuOTk1OQorRnJlbW9udCAJOgkxOQk6CTEzMzguNDA4NAorR3JlZW5lIAk6CTE5CToJMTQ3OS4yMjY3CitHcnVuZHkgCToJMTkJOgkxMzAxLjYwNDUKK0d1dGhyaWUgCToJMTkJOgkxNTM2LjAyNTQKK0hhbWlsdG9uIAk6CTE5CToJMTQ5NS41Njk2CitIYW5jb2NrIAk6CTE5CToJMTQ4NC40MzI2CitIYXJkaW4gCToJMTkJOgkxNDc2LjExODcKK0hhcnJpc29uIAk6CTE5CToJMTgxNS40MDg3CitIZW5yeSAJOgkxOQk6CTExMzEuMDAxMgorSG93YXJkIAk6CTE5CToJMTIyNy4wMzg0CitIdW1ib2xkdCAJOgkxOQk6CTExMjguNTQwNworSWRhIAk6CTE5CToJMTExOS40NzU3CitJb3dhIAk6CTE5CToJMTUyMS4yMzY1CitKYWNrc29uIAk6CTE5CToJMTY4Mi44NTI1CitKYXNwZXIgCToJMTkJOgkxODk4LjI4ODcKK0plZmZlcnNvbiAJOgkxOQk6CTExMzEuMTA0OAorSm9obnNvbiAJOgkxOQk6CTE2MTQuNDc2NQorSm9uZXMgCToJMTkJOgkxNDkzLjY1MworS2Vva3VrIAk6CTE5CToJMTUwMi4wNDQ2CitLb3NzdXRoIAk6CTE5CToJMjUyMy42NzAxCitMZWUgCToJMTkJOgkxMzk1LjQxNDMKK0xpbm4gCToJMTkJOgkxODc2LjU4NDUKK0xvdWlzYSAJOgkxOQk6CTEwODEuNjg3NgorTHVjYXMgCToJMTkJOgkxMTI0LjUwMDMKK0x5b24gCToJMTkJOgkxNTIxLjk2MTcKK01hZGlzb24gCToJMTkJOgkxNDU2LjM1NworTWFoYXNrYSAJOgkxOQk6CTE0ODUuMTA2CitNYXJpb24gCToJMTkJOgkxNDc3LjY3MjcKK01hcnNoYWxsIAk6CTE5CToJMTQ4NC4xMjE4CitNaWxscyAJOgkxOQk6CTExMzguNzQ1MworTWl0Y2hlbGwgCToJMTkJOgkxMjE1Ljc0NgorTW9ub25hIAk6CTE5CToJMTgxMC4wMjE1CitNb25yb2UgCToJMTkJOgkxMTI0LjM0NDkKK01vbnRnb21lcnkgCToJMTkJOgkxMTAwLjI1NzkKK011c2NhdGluZSAJOgkxOQk6CTExNjMuMDkxMworTydCcmllbiAJOgkxOQk6CTE0ODQuNzE3NQorT3NjZW9sYSAJOgkxOQk6CTEwMzQuNjUzMgorUGFnZSAJOgkxOQk6CTEzODYuNTU2NQorUGFsbyBBbHRvIAk6CTE5CToJMTQ3NC43NDYKK1BseW1vdXRoIAk6CTE5CToJMjIzNy42NTY0CitQb2NhaG9udGFzIAk6CTE5CToJMTQ5OS45NDY3CitQb2xrIAk6CTE5CToJMTUzMy4wMjEKK1BvdHRhd2F0dGFtaWUgCToJMTkJOgkyNDg2LjI0NDYKK1Bvd2VzaGllayAJOgkxOQk6CTE1MTguMTgwMworUmluZ2dvbGQgCToJMTkJOgkxMzk1LjgwMjgKK1NhYyAJOgkxOQk6CTE0OTguMDA0MgorU2NvdHQgCToJMTkJOgkxMjEyLjU2MDMKK1NoZWxieSAJOgkxOQk6CTE1MzEuNjQ4MworU2lvdXggCToJMTkJOgkxOTkwLjYyMjIKK1N0b3J5IAk6CTE5CToJMTQ4NS44ODMKK1RhbWEgCToJMTkJOgkxODcwLjkzODMKK1RheWxvciAJOgkxOQk6CTEzODUuMjA5NworVW5pb24gCToJMTkJOgkxMTAzLjIxMDUKK1ZhbiBCdXJlbiAJOgkxOQk6CTEyNzAuNTI0NQorV2FwZWxsbyAJOgkxOQk6CTExMjkuMTg4MgorV2FycmVuIAk6CTE5CToJMTQ4NC42MTM5CitXYXNoaW5ndG9uIAk6CTE5CToJMTQ3OC4yOTQzCitXYXluZSAJOgkxOQk6CTEzNjUuMTM3MgorV2Vic3RlciAJOgkxOQk6CTE4NTkuNzQ5NQorV2lubmViYWdvIAk6CTE5CToJMTA0MC4wNjYzCitXaW5uZXNoaWVrIAk6CTE5CToJMTc4Ni43ODkyCitXb29kYnVyeSAJOgkxOQk6CTIyNzIuNDQwMQorV29ydGggCToJMTkJOgkxMDQwLjQyODkKK1dyaWdodCAJOgkxOQk6CTE1MDguNzc4NgorQWxsZW4gCToJMjAJOgkxMzA4LjQxNjIKK0FuZGVyc29uIAk6CTIwCToJMTUxMy4zMTExCitBdGNoaXNvbiAJOgkyMAk6CTExMjYuNzUzNgorQmFyYmVyIAk6CTIwCToJMjk0Mi43ODM5CitCYXJ0b24gCToJMjAJOgkyMzMyLjE5MTQKK0JvdXJib24gCToJMjAJOgkxNjU0LjU0MzgKK0Jyb3duIAk6CTIwCToJMTQ4MS45OTgKK0J1dGxlciAJOgkyMAk6CTM3NDYuMjI3OAorQ2hhc2UgCToJMjAJOgkyMDE1LjA0NTkKK0NoYXV0YXVxdWEgCToJMjAJOgkxNjcwLjEwOTcKK0NoZXJva2VlIAk6CTIwCToJMTUzMC41ODY0CitDaGV5ZW5uZSAJOgkyMAk6CTI2NDMuOTc1NgorQ2xhcmsgCToJMjAJOgkyNTMwLjk0OAorQ2xheSAJOgkyMAk6CTE2OTcuNTg5NgorQ2xvdWQgCToJMjAJOgkxODYwLjgzNzMKK0NvZmZleSAJOgkyMAk6CTE2OTUuMzM2MworQ29tYW5jaGUgCToJMjAJOgkyMDQ1LjMyMworQ293bGV5IAk6CTIwCToJMjkzMy40MzQKK0NyYXdmb3JkIAk6CTIwCToJMTU0MS4xNzk1CitEZWNhdHVyIAk6CTIwCToJMjMxNS45MjYyCitEaWNraW5zb24gCToJMjAJOgkyMjA2Ljk5MDgKK0RvbmlwaGFuIAk6CTIwCToJMTAyOC40MTEzCitEb3VnbGFzIAk6CTIwCToJMTIyOC44NzczCitFZHdhcmRzIAk6CTIwCToJMTYxMS4yMzkKK0VsayAJOgkyMAk6CTE2ODQuNDMyNAorRWxsaXMgCToJMjAJOgkyMzMyLjIxNzMKK0VsbHN3b3J0aCAJOgkyMAk6CTE4NzMuNzA5NgorRmlubmV5IAk6CTIwCToJMzM3My43ODU4CitGb3JkIAk6CTIwCToJMjg0Ny4xNjExCitGcmFua2xpbiAJOgkyMAk6CTE0OTMuNTIzNQorR2VhcnkgCToJMjAJOgkxMDQ3LjM3MDEKK0dvdmUgCToJMjAJOgkyNzc1LjEwNzMKK0dyYWhhbSAJOgkyMAk6CTIzMjcuNTU1MworR3JhbnQgCToJMjAJOgkxNDg5LjM1MzYKK0dyYXkgCToJMjAJOgkyMjUxLjU5MDYKK0dyZWVsZXkgCToJMjAJOgkyMDE1LjA0NTkKK0dyZWVud29vZCAJOgkyMAk6CTI5ODUuMjA4MQorSGFtaWx0b24gCToJMjAJOgkyNTgzLjgzNTgKK0hhcnBlciAJOgkyMAk6CTIwNzkuNjQwNQorSGFydmV5IAk6CTIwCToJMTM5OS44OTUKK0hhc2tlbGwgCToJMjAJOgkxNDk2LjMyMDcKK0hvZGdlbWFuIAk6CTIwCToJMjIyOC4wMjE2CitKYWNrc29uIAk6CTIwCToJMTcwMy44NTc0CitKZWZmZXJzb24gCToJMjAJOgkxNDQyLjQ3NDYKK0pld2VsbCAJOgkyMAk6CTIzNjguNDc3MworSm9obnNvbiAJOgkyMAk6CTEyNDMuNTg4NQorS2Vhcm55IAk6CTIwCToJMjI1Ny4xODUKK0tpbmdtYW4gCToJMjAJOgkyMjQ0Ljc1MworS2lvd2EgCToJMjAJOgkxODcxLjU4NTgKK0xhYmV0dGUgCToJMjAJOgkxNjkyLjA0NworTGFuZSAJOgkyMAk6CTE4NTguMTQzNworTGVhdmVud29ydGggCToJMjAJOgkxMjEyLjk3NDcKK0xpbmNvbG4gCToJMjAJOgkxODY0LjY0NDYKK0xpbm4gCToJMjAJOgkxNTcwLjI5MTEKK0xvZ2FuIAk6CTIwCToJMjc3OS4zMDMxCitMeW9uIAk6CTIwCToJMjIxNC44MTI2CitNY1BoZXJzb24gCToJMjAJOgkyMzM0LjIxMTYKK01hcmlvbiAJOgkyMAk6CTI0NjkuNjY4NgorTWFyc2hhbGwgCToJMjAJOgkyMzQyLjI5MjQKK01lYWRlIAk6CTIwCToJMjUzNy4zMTk0CitNaWFtaSAJOgkyMAk6CTE1MjguNDg4NQorTWl0Y2hlbGwgCToJMjAJOgkxODYxLjIyNTgKK01vbnRnb21lcnkgCToJMjAJOgkxNjg3LjEyNgorTW9ycmlzIAk6CTIwCToJMTgyMC4zNTU2CitNb3J0b24gCToJMjAJOgkxODkwLjU0NDYKK05lbWFoYSAJOgkyMAk6CTE4NjMuMjQ2CitOZW9zaG8gCToJMjAJOgkxNDk3LjA3MTgKK05lc3MgCToJMjAJOgkyNzg0LjI1CitOb3J0b24gCToJMjAJOgkyMjgyLjgwMDEKK09zYWdlIAk6CTIwCToJMTg2Mi44MDU3CitPc2Jvcm5lIAk6CTIwCToJMjMxNi4xODUyCitPdHRhd2EgCToJMjAJOgkxODY5LjcyMQorUGF3bmVlIAk6CTIwCToJMTk1NC4zMTA0CitQaGlsbGlwcyAJOgkyMAk6CTIzMTcuNTU3OQorUG90dGF3YXRvbWllIAk6CTIwCToJMjIzMi43NjEzCitQcmF0dCAJOgkyMAk6CTE5MDUuNjE4NAorUmF3bGlucyAJOgkyMAk6CTI3NzAuNTc0OAorUmVubyAJOgkyMAk6CTMyOTIuNTM3NQorUmVwdWJsaWMgCToJMjAJOgkxODY1LjYwMjkKK1JpY2UgCToJMjAJOgkxODg2LjI5NworUmlsZXkgCToJMjAJOgkxNjExLjI2NDkKK1Jvb2tzIAk6CTIwCToJMjMxOC45ODI0CitSdXNoIAk6CTIwCToJMTg2MC43MDc4CitSdXNzZWxsIAk6CTIwCToJMjMyOC4zNTgyCitTYWxpbmUgCToJMjAJOgkxODY4LjExNTIKK1Njb3R0IAk6CTIwCToJMTg1OC42ODc2CitTZWRnd2ljayAJOgkyMAk6CTI2MTQuMzcxOQorU2V3YXJkIAk6CTIwCToJMTY1OC45MjA5CitTaGF3bmVlIAk6CTIwCToJMTQ0MC44Njg4CitTaGVyaWRhbiAJOgkyMAk6CTIzMjIuMjE5OQorU2hlcm1hbiAJOgkyMAk6CTI3MzUuMDY1OQorU21pdGggCToJMjAJOgkyMzIyLjAxMjcKK1N0YWZmb3JkIAk6CTIwCToJMjA1OC4zMjQ4CitTdGFudG9uIAk6CTIwCToJMTc2MS4zNTU0CitTdGV2ZW5zIAk6CTIwCToJMTg4NC43Njg5CitTdW1uZXIgCToJMjAJOgkzMDY4LjU4MDIKK1Rob21hcyAJOgkyMAk6CTI3ODMuOTkxCitUcmVnbyAJOgkyMAk6CTIzMjguNDYxOAorV2FiYXVuc2VlIAk6CTIwCToJMjA3MS40ODIKK1dhbGxhY2UgCToJMjAJOgkyMzY3LjM4OTUKK1dhc2hpbmd0b24gCToJMjAJOgkyMzI3Ljk5NTYKK1dpY2hpdGEgCToJMjAJOgkxODYxLjAxODYKK1dpbHNvbiAJOgkyMAk6CTE0ODkuMTcyMworV29vZHNvbiAJOgkyMAk6CTEzMDkuMTE1NQorV3lhbmRvdHRlIAk6CTIwCToJNDAzLjIzNzEKK0FkYWlyIAk6CTIxCToJMTA2Ny42NzU3CitBbGxlbiAJOgkyMQk6CTkxMS43ODM2CitBbmRlcnNvbiAJOgkyMQk6CTUyOS4wODUyCitCYWxsYXJkIAk6CTIxCToJNzA4LjYyNAorQmFycmVuIAk6CTIxCToJMTI5NC44MTg3CitCYXRoIAk6CTIxCToJNzM1LjQwNDYKK0JlbGwgCToJMjEJOgk5MzUuODk2NQorQm9vbmUgCToJMjEJOgk2NjUuNTI2NAorQm91cmJvbiAJOgkyMQk6CTc1NS4zOTk0CitCb3lkIAk6CTIxCToJNDE5LjExMzgKK0JveWxlIAk6CTIxCToJNDczLjk0NDEKK0JyYWNrZW4gCToJMjEJOgk1NDEuMDI1MQorQnJlYXRoaXR0IAk6CTIxCToJMTI4Mi44MDExCitCcmVja2lucmlkZ2UgCToJMjEJOgkxNTE2LjUyMjcKK0J1bGxpdHQgCToJMjEJOgk3NzcuNTE4CitCdXRsZXIgCToJMjEJOgkxMTE3LjYzNjgKK0NhbGR3ZWxsIAk6CTIxCToJOTAxLjc4NjIKK0NhbGxvd2F5IAk6CTIxCToJMTA2My45NDYxCitDYW1wYmVsbCAJOgkyMQk6CTQxMi45MjM3CitDYXJsaXNsZSAJOgkyMQk6CTUxNS40NjE4CitDYXJyb2xsIAk6CTIxCToJMzU1LjUyOTMKK0NhcnRlciAJOgkyMQk6CTEwNjcuNDY4NQorQ2FzZXkgCToJMjEJOgkxMTU0LjQ0MDcKK0NocmlzdGlhbiAJOgkyMQk6CTE4NzUuMTg1OQorQ2xhcmsgCToJMjEJOgk2NjAuODY0NAorQ2xheSAJOgkyMQk6CTEyMjAuMDk3MgorQ2xpbnRvbiAJOgkyMQk6CTUzMi4zNDg2CitDcml0dGVuZGVuIAk6CTIxCToJOTYwLjc2MDUKK0N1bWJlcmxhbmQgCToJMjEJOgk4MDUuMTAxNQorRGF2aWVzcyAJOgkyMQk6CTEyMzMuNTM5MworRWRtb25zb24gCToJMjEJOgk3OTcuNzQ1OQorRWxsaW90dCAJOgkyMQk6CTYwOS4xNjgKK0VzdGlsbCAJOgkyMQk6CTY2Mi4yNjMKK0ZheWV0dGUgCToJMjEJOgk3MzkuNDk2OAorRmxlbWluZyAJOgkyMQk6CTkxMC4zMDczCitGbG95ZCAJOgkyMQk6CTEwMjQuMjQxNAorRnJhbmtsaW4gCToJMjEJOgk1NDkuMzY0OQorRnVsdG9uIAk6CTIxCToJNTk3LjEyNDUKK0dhbGxhdGluIAk6CTIxCToJMjcxLjA5NTMKK0dhcnJhcmQgCToJMjEJOgk2MDUuNzQ5MgorR3JhbnQgCToJMjEJOgk2NzUuNDQ2MQorR3JhdmVzIAk6CTIxCToJMTQ0MS4yMzE0CitHcmF5c29uIAk6CTIxCToJMTMyMy4xMDE1CitHcmVlbiAJOgkyMQk6CTc0Ny45NDAyCitHcmVlbnVwIAk6CTIxCToJOTE4LjE4MDkKK0hhbmNvY2sgCToJMjEJOgk1MTUuMjAyOAorSGFyZGluIAk6CTIxCToJMTYzMS4zMzc0CitIYXJsYW4gCToJMjEJOgkxMjEyLjA0MjMKK0hhcnJpc29uIAk6CTIxCToJODAyLjU4OTIKK0hhcnQgCToJMjEJOgkxMDgyLjM4NjkKK0hlbmRlcnNvbiAJOgkyMQk6CTEyMTAuMTUxNgorSGVucnkgCToJMjEJOgk3NTMuOTc0OQorSGlja21hbiAJOgkyMQk6CTY1NS4xMTQ2CitIb3BraW5zIAk6CTIxCToJMTQzNS40NTU3CitKYWNrc29uIAk6CTIxCToJODk3LjYxNjMKK0plZmZlcnNvbiAJOgkyMQk6CTEwMzIuMzIyMgorSmVzc2FtaW5lIAk6CTIxCToJNDUxLjgyNTUKK0pvaG5zb24gCToJMjEJOgk2ODMuNjA0NgorS2VudG9uIAk6CTIxCToJNDI1Ljc0NDIKK0tub3R0IAk6CTIxCToJOTE0LjI5NTkKK0tub3ggCToJMjEJOgkxMDA0LjE2ODkKK0xhcnVlIAk6CTIxCToJNjgzLjAzNDgKK0xhdXJlbCAJOgkyMQk6CTExNDkuMjg2NgorTGF3cmVuY2UgCToJMjEJOgkxMDg4LjExMDgKK0xlZSAJOgkyMQk6CTU0Ny4wNTk4CitMZXNsaWUgCToJMjEJOgkxMDQ3LjI5MjQKK0xldGNoZXIgCToJMjEJOgk4NzguMzIwOAorTGV3aXMgCToJMjEJOgkxMjgzLjg2MworTGluY29sbiAJOgkyMQk6CTg3MS40NTczCitMaXZpbmdzdG9uIAk6CTIxCToJODg2LjI5OAorTG9nYW4gCToJMjEJOgkxNDQyLjg4OQorTHlvbiAJOgkyMQk6CTY2NC4xMjc4CitNY0NyYWNrZW4gCToJMjEJOgk2OTQuMzI3MgorTWNDcmVhcnkgCToJMjEJOgkxMTE1LjM1NzYKK01jTGVhbiAJOgkyMQk6CTY2My40ODAzCitNYWRpc29uIAk6CTIxCToJMTE0Ny42NTQ5CitNYWdvZmZpbiAJOgkyMQk6CTgwMS40NDk2CitNYXJpb24gCToJMjEJOgk4OTguMzY3NAorTWFyc2hhbGwgCToJMjEJOgk4ODEuNDI4OAorTWFydGluIAk6CTIxCToJNTk3Ljc5NzkKK01hc29uIAk6CTIxCToJNjM4LjY5NAorTWVhZGUgCToJMjEJOgk4MzkuNzI5OAorTWVuaWZlZSAJOgkyMQk6CTUzMy42MTc3CitNZXJjZXIgCToJMjEJOgk2NTUuNTU0OQorTWV0Y2FsZmUgCToJMjEJOgk3NTMuNTg2NAorTW9ucm9lIAk6CTIxCToJODYwLjE2NDkKK01vbnRnb21lcnkgCToJMjEJOgk1MTQuODkyCitNb3JnYW4gCToJMjEJOgk5OTMuODYwNworTXVobGVuYmVyZyAJOgkyMQk6CTEyNDEuNzIzNworTmVsc29uIAk6CTIxCToJMTA5OC4zNDEzCitOaWNob2xhcyAJOgkyMQk6CTUwOS44NDE1CitPaGlvIAk6CTIxCToJMTU0NS41MzA3CitPbGRoYW0gCToJMjEJOgk1MDkuMDM4NgorT3dlbiAJOgkyMQk6CTkxNy4yNzQ0CitPd3NsZXkgCToJMjEJOgk1MTMuMDUzMQorUGVuZGxldG9uIAk6CTIxCToJNzMwLjA0MzMKK1BlcnJ5IAk6CTIxCToJODg3LjQzNzYKK1Bpa2UgCToJMjEJOgkyMDQzLjA5NTYKK1Bvd2VsbCAJOgkyMQk6CTQ2Ni43MTgKK1B1bGFza2kgCToJMjEJOgkxNzUzLjU1OTUKK1JvYmVydHNvbiAJOgkyMQk6CTI1OS4yODQ5CitSb2NrY2FzdGxlIAk6CTIxCToJODIzLjc3NTQKK1Jvd2FuIAk6CTIxCToJNzQxLjM4NzUKK1J1c3NlbGwgCToJMjEJOgk3MzIuNTAzOAorU2NvdHQgCToJMjEJOgk3MzguOTI3CitTaGVsYnkgCToJMjEJOgk5OTguODMzNQorU2ltcHNvbiAJOgkyMQk6CTYxMS43MzIxCitTcGVuY2VyIAk6CTIxCToJNDk2Ljc2MgorVGF5bG9yIAk6CTIxCToJNzE3LjU1OTUKK1RvZGQgCToJMjEJOgk5NzYuMzUyMworVHJpZ2cgCToJMjEJOgkxMjQ2LjEyNjcKK1RyaW1ibGUgCToJMjEJOgk0MDQuNjM1NworVW5pb24gCToJMjEJOgk5NDEuMjgzNworV2FycmVuIAk6CTIxCToJMTQxOC41MTcxCitXYXNoaW5ndG9uIAk6CTIxCToJNzgwLjkzNjgKK1dheW5lIAk6CTIxCToJMTI1NC4wNzgKK1dlYnN0ZXIgCToJMjEJOgk4NjkuNDExMgorV2hpdGxleSAJOgkyMQk6CTExNTIuOTM4NQorV29sZmUgCToJMjEJOgk1NzcuMjA3NAorV29vZGZvcmQgCToJMjEJOgk0OTcuMjI4MgorQWNhZGlhIAk6CTIyCToJMTcwMy4yMzU4CitBbGxlbiAJOgkyMgk6CTE5ODMuMDg1MworQXNjZW5zaW9uIAk6CTIyCToJNzg0LjQ1OTIKK0Fzc3VtcHRpb24gCToJMjIJOgk5NDQuMTg0NQorQXZveWVsbGVzIAk6CTIyCToJMjI0Mi4wODUzCitCZWF1cmVnYXJkIAk6CTIyCToJMzAxOS45MTQxCitCaWVudmlsbGUgCToJMjIJOgkyMTI4LjM4NDMKK0Jvc3NpZXIgCToJMjIJOgkyMjQ1LjM0ODcKK0NhZGRvIAk6CTIyCToJMjQyNi41NzEKK0NhbGNhc2lldSAJOgkyMgk6CTI4MzQuMzQwNgorQ2FsZHdlbGwgCToJMjIJOgkxNDAwLjQ2NDgKK0NhbWVyb24gCToJMjIJOgk1MDAyLjg0NAorQ2F0YWhvdWxhIAk6CTIyCToJMTkxNS4xMjM3CitDbGFpYm9ybmUgCToJMjIJOgkxOTg3Ljk1NDUKK0NvbmNvcmRpYSAJOgkyMgk6CTE5MzkuMDgxMgorRGUgU290byAJOgkyMgk6CTIzMTYuNzI5MQorRWFzdCBCYXRvbiBSb3VnZSAJOgkyMgk6CTEyMTguNjk4NgorRWFzdCBDYXJyb2xsIAk6CTIyCToJMTE0NS45NDU1CitFYXN0IEZlbGljaWFuYSAJOgkyMgk6CTExODAuMjM3MQorRXZhbmdlbGluZSAJOgkyMgk6CTE3NjAuMTg5OQorRnJhbmtsaW4gCToJMjIJOgkxNjQ1Ljc2MzcKK0dyYW50IAk6CTIyCToJMTcyMS4yMTA0CitJYmVyaWEgCToJMjIJOgkyNjY5LjkyNzQKK0liZXJ2aWxsZSAJOgkyMgk6CTE2OTAuODU1NgorSmFja3NvbiAJOgkyMgk6CTE1MDMuMDgwNgorSmVmZmVyc29uIAk6CTIyCToJMTY2My44NDE5CitKZWZmZXJzb24gRGF2aXMgCToJMjIJOgkxNzA1LjcyMjIKK0xhZmF5ZXR0ZSAJOgkyMgk6CTcwMC4wNTExCitMYWZvdXJjaGUgCToJMjIJOgkzODEyLjk3MjEKK0xhIFNhbGxlIAk6CTIyCToJMTcxNS41MTI0CitMaW5jb2xuIAk6CTIyCToJMTIyMy4xNzkzCitMaXZpbmdzdG9uIAk6CTIyCToJMTgyMC4zNTU2CitNYWRpc29uIAk6CTIyCToJMTY4NC44NzI3CitNb3JlaG91c2UgCToJMjIJOgkyMDg1LjQ2OAorTmF0Y2hpdG9jaGVzIAk6CTIyCToJMzM2NS4xODcKK09ybGVhbnMgCToJMjIJOgk5MDcuMDQzOQorT3VhY2hpdGEgCToJMjIJOgkxNjM4LjY5MworUGxhcXVlbWluZXMgCToJMjIJOgk2Mjg5LjkxODYKK1BvaW50ZSBDb3VwZWUgCToJMjIJOgkxNTI5Ljg2MTIKK1JhcGlkZXMgCToJMjIJOgkzNTI3LjQ3NjQKK1JlZCBSaXZlciAJOgkyMgk6CTEwNDEuMzg3MgorUmljaGxhbmQgCToJMjIJOgkxNDYyLjA4MDkKK1NhYmluZSAJOgkyMgk6CTI2MTkuODEwOQorU3QuIEJlcm5hcmQgCToJMjIJOgk0NjQ1LjgxMjUKK1N0LiBDaGFybGVzIAk6CTIyCToJMTA2Mi4zMTQ0CitTdC4gSGVsZW5hIAk6CTIyCToJMTA2MC41MDE0CitTdC4gSmFtZXMgCToJMjIJOgk2NjcuNjc2MQorU3QuIEpvaG4gdGhlIEJhcHRpc3QgCToJMjIJOgk5MDAuOTA1NgorU3QuIExhbmRyeSAJOgkyMgk6CTI0MzEuNTY5NworU3QuIE1hcnRpbiAJOgkyMgk6CTIxMTQuNjMxNAorU3QuIE1hcnkgCToJMjIJOgkyODk3Ljc2OTcKK1N0LiBUYW1tYW55IAk6CTIyCToJMjkxMS4zNjcyCitUYW5naXBhaG9hIAk6CTIyCToJMjEzMS44ODA4CitUZW5zYXMgCToJMjIJOgkxNjYwLjcwOAorVGVycmVib25uZSAJOgkyMgk6CTUzODYuOTQxCitVbmlvbiAJOgkyMgk6CTIzNDQuNjc1MgorVmVybWlsaW9uIAk6CTIyCToJMzk4NC4yMjI5CitWZXJub24gCToJMjIJOgkzNDc0LjUxMDkKK1dhc2hpbmd0b24gCToJMjIJOgkxNzUwLjc2MjMKK1dlYnN0ZXIgCToJMjIJOgkxNTkzLjAzMTMKK1dlc3QgQmF0b24gUm91Z2UgCToJMjIJOgk1MjcuMzc1OAorV2VzdCBDYXJyb2xsIAk6CTIyCToJOTMzLjIyODgKK1dlc3QgRmVsaWNpYW5hIAk6CTIyCToJMTEwMy4zNjU5CitXaW5uIAk6CTIyCToJMjQ3OC4zOTY5CitBbmRyb3Njb2dnaW4gCToJMjMJOgkxMjg3LjgyNTcKK0Fyb29zdG9vayAJOgkyMwk6CTE3Njg2LjU2NjEKK0N1bWJlcmxhbmQgCToJMjMJOgkzMTUxLjc0NTEKK0ZyYW5rbGluIAk6CTIzCToJNDUxNy43NjI5CitIYW5jb2NrIAk6CTIzCToJNjA4OS4xNjc3CitLZW5uZWJlYyAJOgkyMwk6CTI0NjMuNTU2MgorS25veCAJOgkyMwk6CTI5NTguMDM5CitMaW5jb2xuIAk6CTIzCToJMTgxMi41MDc5CitPeGZvcmQgCToJMjMJOgk1NjMzLjkyMzQKK1Blbm9ic2NvdCAJOgkyMwk6CTkyMTAuNDAyNgorUGlzY2F0YXF1aXMgCToJMjMJOgkxMTMzNy4zNjI0CitTYWdhZGFob2MgCToJMjMJOgk5NTguNzkyMQorU29tZXJzZXQgCToJMjMJOgkxMDYwNy4wMDgzCitXYWxkbyAJOgkyMwk6CTIyMDguNTk2NgorV2FzaGluZ3RvbiAJOgkyMwk6CTg0MzAuMjE2OQorWW9yayAJOgkyMwk6CTMyOTIuNzcwNgorQWxsZWdhbnkgCToJMjQJOgkxMTEzLjIzMzgKK0FubmUgQXJ1bmRlbCAJOgkyNAk6CTE1MjIuNjYxCitCYWx0aW1vcmUgCToJMjQJOgkxNzY2LjQ1NzcKK0NhbHZlcnQgCToJMjQJOgk4OTMuNzgzMQorQ2Fyb2xpbmUgCToJMjQJOgk4NDQuNDk1NAorQ2Fycm9sbCAJOgkyNAk6CTExNzEuNzE2CitDZWNpbCAJOgkyNAk6CTEwODIuMzA5MgorQ2hhcmxlcyAJOgkyNAk6CTE2NjUuOTM5OAorRG9yY2hlc3RlciAJOgkyNAk6CTI1NDUuNzYyOAorRnJlZGVyaWNrIAk6CTI0CToJMTcyOC40MTA2CitHYXJyZXR0IAk6CTI0CToJMTY5OC43ODEKK0hhcmZvcmQgCToJMjQJOgkxMzY0LjIwNDgKK0hvd2FyZCAJOgkyNAk6CTY1Ni42OTQ1CitLZW50IAk6CTI0CToJMTA3My4wNjI5CitNb250Z29tZXJ5IAk6CTI0CToJMTMxMy40OTI2CitQcmluY2UgR2VvcmdlJ3MgCToJMjQJOgkxMjkwLjk4NTUKK1F1ZWVuIEFubmUncyAJOgkyNAk6CTEzMjAuMzU2MQorU3QuIE1hcnkncyAJOgkyNAk6CTE5ODAuMDU1CitTb21lcnNldCAJOgkyNAk6CTE1ODEuOTIwMgorVGFsYm90IAk6CTI0CToJMTIzNC44MzQzCitXYXNoaW5ndG9uIAk6CTI0CToJMTIxMC45NTQ1CitXaWNvbWljbyAJOgkyNAk6CTEwMzUuNDU2MQorV29yY2VzdGVyIAk6CTI0CToJMTc5OS4zNTA3CitCYWx0aW1vcmUgY2l0eQk6CTI0CToJMjM4LjQ4NzIKK0Jhcm5zdGFibGUgCToJMjUJOgkzMzgxLjU1NTgKK0JlcmtzaGlyZSAJOgkyNQk6CTI0NTAuODM5MworQnJpc3RvbCAJOgkyNQk6CTE3OTAuMTgyMQorRHVrZXMgCToJMjUJOgkxMjcxLjU2MDUKK0Vzc2V4IAk6CTI1CToJMjE0NS44OTI3CitGcmFua2xpbiAJOgkyNQk6CTE4NzcuMDc2NgorSGFtcGRlbiAJOgkyNQk6CTE2NDIuMzcwOAorSGFtcHNoaXJlIAk6CTI1CToJMTQxMi42ODk2CitNaWRkbGVzZXggCToJMjUJOgkyMTk1LjEyODYKK05hbnR1Y2tldCAJOgkyNQk6CTc4Ni40Mjc2CitOb3Jmb2xrIAk6CTI1CToJMTE0OS44MDQ2CitQbHltb3V0aCAJOgkyNQk6CTI4MzEuODgwMQorU3VmZm9sayAJOgkyNQk6CTMxMS4yOTIxCitXb3JjZXN0ZXIgCToJMjUJOgk0MDg5LjY2MTgKK0FsY29uYSAJOgkyNgk6CTQ2MzcuNDk4NgorQWxnZXIgCToJMjYJOgkxMzA3Ny4xMTcyCitBbGxlZ2FuIAk6CTI2CToJNDc0OC4yNDcKK0FscGVuYSAJOgkyNgk6CTQzOTAuMDUKK0FudHJpbSAJOgkyNgk6CTE1NTguOTIxCitBcmVuYWMgCToJMjYJOgkxNzYzLjI5NzkKK0JhcmFnYSAJOgkyNgk6CTI3NjguMzIxNQorQmFycnkgCToJMjYJOgkxNDk0LjE3MQorQmF5IAk6CTI2CToJMTYzNC4wNTY5CitCZW56aWUgCToJMjYJOgkyMjI2LjQ2NzYKK0JlcnJpZW4gCToJMjYJOgk0MDk1Ljc3NDIKK0JyYW5jaCAJOgkyNgk6CTEzNDUuNDc5MQorQ2FsaG91biAJOgkyNgk6CTE4NjAuNzU5NgorQ2FzcyAJOgkyNgk6CTEzMTYuOTExNAorQ2hhcmxldm9peCAJOgkyNgk6CTM2MDIuMDY4NAorQ2hlYm95Z2FuIAk6CTI2CToJMjI5Mi43NDU3CitDaGlwcGV3YSAJOgkyNgk6CTY5ODcuNzY4MgorQ2xhcmUgCToJMjYJOgkxNDg5LjgxOTgKK0NsaW50b24gCToJMjYJOgkxNDg4LjEzNjMKK0NyYXdmb3JkIAk6CTI2CToJMTQ1OS4xMjgzCitEZWx0YSAJOgkyNgk6CTUxNTguMTkyMgorRGlja2luc29uIAk6CTI2CToJMjAxMi43NDA4CitFYXRvbiAJOgkyNgk6CTE0OTkuNjYxOAorRW1tZXQgCToJMjYJOgkyMjg1LjA1MzQKK0dlbmVzZWUgCToJMjYJOgkxNjgxLjc5MDYKK0dsYWR3aW4gCToJMjYJOgkxMzM3LjU1MzcKK0dvZ2ViaWMgCToJMjYJOgkzODIzLjk1MzcKK0dyYW5kIFRyYXZlcnNlIAk6CTI2CToJMTU1Ni45MjY3CitHcmF0aW90IAk6CTI2CToJMTQ4MC40Njk5CitIaWxsc2RhbGUgCToJMjYJOgkxNTcyLjQ5MjYKK0hvdWdodG9uIAk6CTI2CToJMzg4OS4wNDA0CitIdXJvbiAJOgkyNgk6CTU1MzMuNDU3MworSW5naGFtIAk6CTI2CToJMTQ1Mi44MzQ2CitJb25pYSAJOgkyNgk6CTE1MDIuNzk1NworSW9zY28gCToJMjYJOgk0ODk3LjA5NDMKK0lyb24gCToJMjYJOgkzMTM2LjU0MTgKK0lzYWJlbGxhIAk6CTI2CToJMTQ5Ni4zNzI1CitKYWNrc29uIAk6CTI2CToJMTg3NC41Mzg0CitLYWxhbWF6b28gCToJMjYJOgkxNTAyLjY2NjIKK0thbGthc2thIAk6CTI2CToJMTQ3OC4yNjg0CitLZW50IAk6CTI2CToJMjI1OC45NDYyCitLZXdlZW5hdyAJOgkyNgk6CTE1NDUxLjgzNjQKK0xha2UgCToJMjYJOgkxNDg4LjIxNAorTGFwZWVyIAk6CTI2CToJMTcxNy4zNzcyCitMZWVsYW5hdSAJOgkyNgk6CTY1NTguODY0MgorTGVuYXdlZSAJOgkyNgk6CTE5NzEuNzkyOQorTGl2aW5nc3RvbiAJOgkyNgk6CTE1MTYuMjYzNworTHVjZSAJOgkyNgk6CTQ5NTEuNzk1MQorTWFja2luYWMgCToJMjYJOgk1NDQwLjQyNDUKK01hY29tYiAJOgkyNgk6CTE0NzUuNzMwMgorTWFuaXN0ZWUgCToJMjYJOgkzMzE3LjE5NDMKK01hcnF1ZXR0ZSAJOgkyNgk6CTg4NzEuMTkwMworTWFzb24gCToJMjYJOgkzMjE2LjQxNzQKK01lY29zdGEgCToJMjYJOgkxNDc5LjE0OQorTWVub21pbmVlIAk6CTI2CToJMzQ2NS4zOTQxCitNaWRsYW5kIAk6CTI2CToJMTM2Ny4yMzUxCitNaXNzYXVrZWUgCToJMjYJOgkxNDg2LjE5MzgKK01vbnJvZSAJOgkyNgk6CTE3NjEuMjc3NworTW9udGNhbG0gCToJMjYJOgkxODY3LjMzODIKK01vbnRtb3JlbmN5IAk6CTI2CToJMTQ1Ni43MTk2CitNdXNrZWdvbiAJOgkyNgk6CTM3NzkuNTg3CitOZXdheWdvIAk6CTI2CToJMjIzMS4wMDAxCitPYWtsYW5kIAk6CTI2CToJMjM1MS43MgorT2NlYW5hIAk6CTI2CToJMzM4NC40MzA3CitPZ2VtYXcgCToJMjYJOgkxNDg4LjI5MTcKK09udG9uYWdvbiAJOgkyNgk6CTk2OTAuMzU1NQorT3NjZW9sYSAJOgkyNgk6CTE0ODQuMzI5CitPc2NvZGEgCToJMjYJOgkxNDgwLjM2NjMKK090c2VnbyAJOgkyNgk6CTEzNjIuMjg4MgorT3R0YXdhIAk6CTI2CToJNDIyNi44MDIzCitQcmVzcXVlIElzbGUgCToJMjYJOgk2NjYzLjQyMjUKK1Jvc2NvbW1vbiAJOgkyNgk6CTE1MDEuNzg1NgorU2FnaW5hdyAJOgkyNgk6CTIxMTIuODcwMgorU3QuIENsYWlyIAk6CTI2CToJMjE2Ni44NzE3CitTdC4gSm9zZXBoIAk6CTI2CToJMTM0OS43Nzg1CitTYW5pbGFjIAk6CTI2CToJNDExOC42Njk4CitTY2hvb2xjcmFmdCAJOgkyNgk6CTQ4NzguNzU3MQorU2hpYXdhc3NlZSAJOgkyNgk6CTE0MDAuNDkwNworVHVzY29sYSAJOgkyNgk6CTIzNjYuNzkzOAorVmFuIEJ1cmVuIAk6CTI2CToJMjgyMy41OTIxCitXYXNodGVuYXcgCToJMjYJOgkxODcxLjM1MjcKK1dheW5lIAk6CTI2CToJMTc0MC45OTgKK1dleGZvcmQgCToJMjYJOgkxNDkxLjQyNTYKK0FpdGtpbiAJOgkyNwk6CTUxNjcuODUyOQorQW5va2EgCToJMjcJOgkxMTU1LjgxMzQKK0JlY2tlciAJOgkyNwk6CTM3NDIuODM0OQorQmVsdHJhbWkgCToJMjcJOgk3OTEzLjk3ODEKK0JlbnRvbiAJOgkyNwk6CTEwNjkuNjcKK0JpZyBTdG9uZSAJOgkyNwk6CTEzNjcuMjA5MgorQmx1ZSBFYXJ0aCAJOgkyNwk6CTE5ODMuNjgxCitCcm93biAJOgkyNwk6CTE2MDIuMTc0CitDYXJsdG9uIAk6CTI3CToJMjI2Ni44NDU3CitDYXJ2ZXIgCToJMjcJOgk5NzQuMjI4NQorQ2FzcyAJOgkyNwk6CTYyNTIuODAzOQorQ2hpcHBld2EgCToJMjcJOgkxNTIyLjQ3OTcKK0NoaXNhZ28gCToJMjcJOgkxMTQ2LjA0OTEKK0NsYXkgCToJMjcJOgkyNzI2LjU5NjYKK0NsZWFyd2F0ZXIgCToJMjcJOgkyNjY3LjE1NjEKK0Nvb2sgCToJMjcJOgk4NjQ5Ljg3NDgKK0NvdHRvbndvb2QgCToJMjcJOgkxNjgwLjY3NjkKK0Nyb3cgV2luZyAJOgkyNwk6CTI5OTUuNDkwNAorRGFrb3RhIAk6CTI3CToJMTUxOC41OTQ3CitEb2RnZSAJOgkyNwk6CTExMzguNjQxNworRG91Z2xhcyAJOgkyNwk6CTE4NjQuNjQ0NgorRmFyaWJhdWx0IAk6CTI3CToJMTg2OC45Njk5CitGaWxsbW9yZSAJOgkyNwk6CTIyMzIuOTY4NQorRnJlZWJvcm4gCToJMjcJOgkxODcxLjYxMTcKK0dvb2RodWUgCToJMjcJOgkyMDIxLjMzOTYKK0dyYW50IAk6CTI3CToJMTQ4OS43MTYyCitIZW5uZXBpbiAJOgkyNwk6CTE1NzAuNTI0MgorSG91c3RvbiAJOgkyNwk6CTE0NzMuNDc2OQorSHViYmFyZCAJOgkyNwk6CTI1ODguNDIwMQorSXNhbnRpIAk6CTI3CToJMTE3MC4zNDMzCitJdGFzY2EgCToJMjcJOgk3NTgyLjk1MDIKK0phY2tzb24gCToJMjcJOgkxODYzLjQwMTQKK0thbmFiZWMgCToJMjcJOgkxMzgxLjQ1NDIKK0thbmRpeW9oaSAJOgkyNwk6CTIyMzIuNTAyMworS2l0dHNvbiAJOgkyNwk6CTI4NTguMDkwOQorS29vY2hpY2hpbmcgCToJMjcJOgk4MTY5LjY4ODgKK0xhYyBxdWkgUGFybGUgCToJMjcJOgkyMDE1LjE0OTUKK0xha2UgCToJMjcJOgk3NzQ2LjIyMzgKK0xha2Ugb2YgdGhlIFdvb2RzIAk6CTI3CToJNDU5Ny4zNzk1CitMZSBTdWV1ciAJOgkyNwk6CTEyMjcuMjk3NAorTGluY29sbiAJOgkyNwk6CTE0MjAuNDU5NgorTHlvbiAJOgkyNwk6CTE4NjguNTgxNAorTWNMZW9kIAk6CTI3CToJMTMwOS42ODUzCitNYWhub21lbiAJOgkyNwk6CTE1MDkuOTQ0MQorTWFyc2hhbGwgCToJMjcJOgk0Njk1LjEyNjEKK01hcnRpbiAJOgkyNwk6CTE4ODkuNTYwNAorTWVla2VyIAk6CTI3CToJMTY3MC43NTcyCitNaWxsZSBMYWNzIAk6CTI3CToJMTc2NS43ODQzCitNb3JyaXNvbiAJOgkyNwk6CTI5ODcuMDk4OAorTW93ZXIgCToJMjcJOgkxODQzLjMyODkKK011cnJheSAJOgkyNwk6CTE4NjMuNTU2OAorTmljb2xsZXQgCToJMjcJOgkxMjA5LjQwMDUKK05vYmxlcyAJOgkyNwk6CTE4NzAuODM0NworTm9ybWFuIAk6CTI3CToJMjI3MC45NjM4CitPbG1zdGVkIAk6CTI3CToJMTY5NS4xNTUKK090dGVyIFRhaWwgCToJMjcJOgk1NzYyLjUxNjkKK1Blbm5pbmd0b24gCToJMjcJOgkxNjAxLjUwMDYKK1BpbmUgCToJMjcJOgkzNzE1LjUzNjMKK1BpcGVzdG9uZSAJOgkyNwk6CTEyMDcuMzI4NQorUG9sayAJOgkyNwk6CTUxNzQuMzI3OQorUG9wZSAJOgkyNwk6CTE4NTcuNzgxMQorUmFtc2V5IAk6CTI3CToJNDQwLjYzNjcKK1JlZCBMYWtlIAk6CTI3CToJMTEyMC4yMDA5CitSZWR3b29kIAk6CTI3CToJMjI4Mi40MTE2CitSZW52aWxsZSAJOgkyNwk6CTI1NTYuODk5OAorUmljZSAJOgkyNwk6CTEzMzYuNzc2NworUm9jayAJOgkyNwk6CTEyNTAuNTU1NgorUm9zZWF1IAk6CTI3CToJNDM0Ni44NzQ3CitTdC4gTG91aXMgCToJMjcJOgkxNzc2Ny4xNjY5CitTY290dCAJOgkyNwk6CTk1NC41NzA0CitTaGVyYnVybmUgCToJMjcJOgkxMTY4LjA5CitTaWJsZXkgCToJMjcJOgkxNTU1LjA2MTkKK1N0ZWFybnMgCToJMjcJOgkzNTk5LjkxODcKK1N0ZWVsZSAJOgkyNwk6CTExMTkuMjk0NAorU3RldmVucyAJOgkyNwk6CTE0ODkuODcxNgorU3dpZnQgCToJMjcJOgkxOTQ4LjU4NjUKK1RvZGQgCToJMjcJOgkyNTM2LjQ5MDYKK1RyYXZlcnNlIAk6CTI3CToJMTUxNy42MzY0CitXYWJhc2hhIAk6CTI3CToJMTQyNC4wNTk3CitXYWRlbmEgCToJMjcJOgkxNDA2LjM3CitXYXNlY2EgCToJMjcJOgkxMTIwLjk3NzkKK1dhc2hpbmd0b24gCToJMjcJOgkxMDk1Ljk4NDQKK1dhdG9ud2FuIAk6CTI3CToJMTEzOS4zOTI4CitXaWxraW4gCToJMjcJOgkxOTQ2LjcyMTcKK1dpbm9uYSAJOgkyNwk6CTE2NjEuNzE4MQorV3JpZ2h0IAk6CTI3CToJMTg1MC4yNzAxCitZZWxsb3cgTWVkaWNpbmUgCToJMjcJOgkxOTc3LjE4MDEKK0FkYW1zIAk6CTI4CToJMTI1OS4zODc1CitBbGNvcm4gCToJMjgJOgkxMDM5LjQ5NjUKK0FtaXRlIAk6CTI4CToJMTg5NC45NDc2CitBdHRhbGEgCToJMjgJOgkxOTA5LjA4OQorQmVudG9uIAk6CTI4CToJMTA1OC40MDM1CitCb2xpdmFyIAk6CTI4CToJMjM0NS45MTg0CitDYWxob3VuIAk6CTI4CToJMTUyMi44NDIzCitDYXJyb2xsIAk6CTI4CToJMTY0My40NTg2CitDaGlja2FzYXcgCToJMjgJOgkxMzA2LjA1OTMKK0Nob2N0YXcgCToJMjgJOgkxMDg3LjMwNzkKK0NsYWlib3JuZSAJOgkyOAk6CTEyOTguNTIyNAorQ2xhcmtlIAk6CTI4CToJMTc5NS45MzE5CitDbGF5IAk6CTI4CToJMTA3Ny40OTE4CitDb2Fob21hIAk6CTI4CToJMTUxMC4zMzI2CitDb3BpYWggCToJMjgJOgkyMDE4LjU5NDIKK0NvdmluZ3RvbiAJOgkyOAk6CTEwNzQuNjk0NgorRGVTb3RvIAk6CTI4CToJMTI4Ni42MzQzCitGb3JyZXN0IAk6CTI4CToJMTIxNy43NDAzCitGcmFua2xpbiAJOgkyOAk6CTE0NjcuODU2NgorR2VvcmdlIAk6CTI4CToJMTI1Mi42MDE3CitHcmVlbmUgCToJMjgJOgkxODYxLjQwNzEKK0dyZW5hZGEgCToJMjgJOgkxMTYzLjg5NDIKK0hhbmNvY2sgCToJMjgJOgkxNDMxLjA1MjcKK0hhcnJpc29uIAk6CTI4CToJMjUyOC4yMjg1CitIaW5kcyAJOgkyOAk6CTIyNzIuMzM2NQorSG9sbWVzIAk6CTI4CToJMTk3OS4yMjYyCitIdW1waHJleXMgCToJMjgJOgkxMTE2LjcwNDQKK0lzc2FxdWVuYSAJOgkyOAk6CTExNDMuMTIyNAorSXRhd2FtYmEgCToJMjgJOgkxMzk5LjY4NzgKK0phY2tzb24gCToJMjgJOgkyNzAyLjE0NworSmFzcGVyIAk6CTI4CToJMTc1NC41Njk2CitKZWZmZXJzb24gCToJMjgJOgkxMzY1LjQyMjEKK0plZmZlcnNvbiBEYXZpcyAJOgkyOAk6CTEwNTkuNTY5CitKb25lcyAJOgkyOAk6CTE4MTIuMzAwNworS2VtcGVyIAk6CTI4CToJMTk4Ni41MworTGFmYXlldHRlIAk6CTI4CToJMTc1OS4zNjExCitMYW1hciAJOgkyOAk6CTEyOTYuMjY5MQorTGF1ZGVyZGFsZSAJOgkyOAk6CTE4NTIuNTc1MgorTGF3cmVuY2UgCToJMjgJOgkxMTI4LjU0MDcKK0xlYWtlIAk6CTI4CToJMTUxNi4xNjAxCitMZWUgCToJMjgJOgkxMTczLjYzMjYKK0xlZmxvcmUgCToJMjgJOgkxNTcwLjQ0NjUKK0xpbmNvbG4gCToJMjgJOgkxNTIzLjM2MDMKK0xvd25kZXMgCToJMjgJOgkxMzM3LjYwNTUKK01hZGlzb24gCToJMjgJOgkxOTIxLjcwMjMKK01hcmlvbiAJOgkyOAk6CTE0MjAuODIyMgorTWFyc2hhbGwgCToJMjgJOgkxODM4LjM4MgorTW9ucm9lIAk6CTI4CToJMTk5OS41ODM2CitNb250Z29tZXJ5IAk6CTI4CToJMTA1Ni4zNTc0CitOZXNob2JhIAk6CTI4CToJMTQ4MC41NDc2CitOZXd0b24gCToJMjgJOgkxNTAxLjExMjIKK05veHViZWUgCToJMjgJOgkxODEzLjEyOTUKK09rdGliYmVoYSAJOgkyOAk6CTExOTYuMzIxCitQYW5vbGEgCToJMjgJOgkxODI2LjI4NjcKK1BlYXJsIFJpdmVyIAk6CTI4CToJMjEyMS4wMjg3CitQZXJyeSAJOgkyOAk6CTE2ODQuMDE4CitQaWtlIAk6CTI4CToJMTA2My45MjAyCitQb250b3RvYyAJOgkyOAk6CTEyOTcuNTY0MQorUHJlbnRpc3MgCToJMjgJOgkxMDgzLjI0MTYKK1F1aXRtYW4gCToJMjgJOgkxMDUyLjgwOTEKK1JhbmtpbiAJOgkyOAk6CTIwODcuNzczMQorU2NvdHQgCToJMjgJOgkxNTgwLjg4NDIKK1NoYXJrZXkgCToJMjgJOgkxMTI2LjMzOTIKK1NpbXBzb24gCToJMjgJOgkxNTI5LjQ3MjcKK1NtaXRoIAk6CTI4CToJMTY1MC41MjkzCitTdG9uZSAJOgkyOAk6CTExNjAuNTAxMworU3VuZmxvd2VyIAk6CTI4CToJMTgzMS42OTk4CitUYWxsYWhhdGNoaWUgCToJMjgJOgkxNjg4Ljg4NzIKK1RhdGUgCToJMjgJOgkxMDY0LjM2MDUKK1RpcHBhaCAJOgkyOAk6CTExOTEuMzIyMworVGlzaG9taW5nbyAJOgkyOAk6CTExNTEuMzU4NgorVHVuaWNhIAk6CTI4CToJMTI0NS4yMjAyCitVbmlvbiAJOgkyOAk6CTEwNzkuNjkzMworV2FsdGhhbGwgCToJMjgJOgkxMDQ3LjQ5OTYKK1dhcnJlbiAJOgkyOAk6CTE2MDIuNTg4NAorV2FzaGluZ3RvbiAJOgkyOAk6CTE5NzEuNjYzNAorV2F5bmUgCToJMjgJOgkyMTA2Ljk2NQorV2Vic3RlciAJOgkyOAk6CTEwOTYuNDUwNgorV2lsa2luc29uIAk6CTI4CToJMTc4MS4wMzk0CitXaW5zdG9uIAk6CTI4CToJMTU4MC4xODQ5CitZYWxvYnVzaGEgCToJMjgJOgkxMjgyLjA1CitZYXpvbyAJOgkyOAk6CTI0MTkuMzcwOAorQWRhaXIgCToJMjkJOgkxNDc0LjUzODgKK0FuZHJldyAJOgkyOQk6CTExMzAuNTM1CitBdGNoaXNvbiAJOgkyOQk6CTE0MTcuNjYyNAorQXVkcmFpbiAJOgkyOQk6CTE4MDQuNjg2MQorQmFycnkgCToJMjkJOgkyMDQ4LjQwNTEKK0JhcnRvbiAJOgkyOQk6CTE1NDUuNTA0OAorQmF0ZXMgCToJMjkJOgkyMjA1LjA0ODMKK0JlbnRvbiAJOgkyOQk6CTE5NDguOTIzMgorQm9sbGluZ2VyIAk6CTI5CToJMTYwOC45MDgKK0Jvb25lIAk6CTI5CToJMTc5MC40OTI5CitCdWNoYW5hbiAJOgkyOQk6CTEwNzMuNzM2MworQnV0bGVyIAk6CTI5CToJMTgxMC4zMzIzCitDYWxkd2VsbCAJOgkyOQk6CTExMTIuOTc0OAorQ2FsbGF3YXkgCToJMjkJOgkyMTkzLjgwNzcKK0NhbWRlbiAJOgkyOQk6CTE4MzUuOTQ3NAorQ2FwZSBHaXJhcmRlYXUgCToJMjkJOgkxNTE4LjQ5MTEKK0NhcnJvbGwgCToJMjkJOgkxODE4Ljk1NworQ2FydGVyIAk6CTI5CToJMTMxOC4zNjE4CitDYXNzIAk6CTI5CToJMTgxOS45MTUzCitDZWRhciAJOgkyOQk6CTEyOTEuMTQwOQorQ2hhcml0b24gCToJMjkJOgkxOTg5Ljc2NzUKK0NocmlzdGlhbiAJOgkyOQk6CTE0NjAuODg5NQorQ2xhcmsgCToJMjkJOgkxMzI1LjgyMQorQ2xheSAJOgkyOQk6CTEwNTguOTQ3NAorQ2xpbnRvbiAJOgkyOQk6CTEwOTYuNzg3MworQ29sZSAJOgkyOQk6CTEwMzMuNjE3MgorQ29vcGVyIAk6CTI5CToJMTQ3Ni44Njk4CitDcmF3Zm9yZCAJOgkyOQk6CTE5MjYuNDE2MQorRGFkZSAJOgkyOQk6CTEzMTEuMzE3CitEYWxsYXMgCToJMjkJOgkxNDA1LjkyOTcKK0Rhdmllc3MgCToJMjkJOgkxNDczLjg5MTMKK0RlS2FsYiAJOgkyOQk6CTExMDIuNzQ0MworRGVudCAJOgkyOQk6CTE5NTQuMTgwOQorRG91Z2xhcyAJOgkyOQk6CTIxMDkuODE0CitEdW5rbGluIAk6CTI5CToJMTQxNy4wMTQ5CitGcmFua2xpbiAJOgkyOQk6CTI0MTAuMzgzNQorR2FzY29uYWRlIAk6CTI5CToJMTM2Mi41NzMxCitHZW50cnkgCToJMjkJOgkxMjczLjc4NzkKK0dyZWVuZSAJOgkyOQk6CTE3NTUuNTAyCitHcnVuZHkgCToJMjkJOgkxMTM0LjM2ODIKK0hhcnJpc29uIAk6CTI5CToJMTg4MS41MDU1CitIZW5yeSAJOgkyOQk6CTE4OTcuMzA0NQorSGlja29yeSAJOgkyOQk6CTEwNjYuNDA2NgorSG9sdCAJOgkyOQk6CTEyMTQuODM5NQorSG93YXJkIAk6CTI5CToJMTIxOC43MjQ1CitIb3dlbGwgCToJMjkJOgkyNDA0LjM3NDcKK0lyb24gCToJMjkJOgkxNDI5LjgwOTUKK0phY2tzb24gCToJMjkJOgkxNTk2LjUwMTkKK0phc3BlciAJOgkyOQk6CTE2NjEuMDE4OAorSmVmZmVyc29uIAk6CTI5CToJMTcxOS45OTMxCitKb2huc29uIAk6CTI5CToJMjE1Ny41NDc3CitLbm94IAk6CTI5CToJMTMxMi41MzQzCitMYWNsZWRlIAk6CTI5CToJMTk4OS4xMgorTGFmYXlldHRlIAk6CTI5CToJMTY1NC42NDc0CitMYXdyZW5jZSAJOgkyOQk6CTE1ODguNjU0MgorTGV3aXMgCToJMjkJOgkxMzIzLjEwMTUKK0xpbmNvbG4gCToJMjkJOgkxNjU4LjY2MTkKK0xpbm4gCToJMjkJOgkxNjA5LjU4MTQKK0xpdmluZ3N0b24gCToJMjkJOgkxMzk0LjY2MzIKK01jRG9uYWxkIAk6CTI5CToJMTM5Ny44MjMKK01hY29uIAk6CTI5CToJMjEwNC40NTI3CitNYWRpc29uIAk6CTI5CToJMTI4OC43ODQKK01hcmllcyAJOgkyOQk6CTEzNzIuNjIyMworTWFyaW9uIAk6CTI5CToJMTE1MC4wODk1CitNZXJjZXIgCToJMjkJOgkxMTc4LjkxNjIKK01pbGxlciAJOgkyOQk6CTE1NTMuODQ0NgorTWlzc2lzc2lwcGkgCToJMjkJOgkxMTEwLjg3NjkKK01vbml0ZWF1IAk6CTI5CToJMTA4NC44MjE1CitNb25yb2UgCToJMjkJOgkxNzM1Ljg5NTcKK01vbnRnb21lcnkgCToJMjkJOgkxMzk5LjQ4MDYKK01vcmdhbiAJOgkyOQk6CTE1ODkuOTc1MQorTmV3IE1hZHJpZCAJOgkyOQk6CTE4MDcuODcxOAorTmV3dG9uIAk6CTI5CToJMTYyMy4wNDk0CitOb2Rhd2F5IAk6CTI5CToJMjI3My4zNzI1CitPcmVnb24gCToJMjkJOgkyMDUwLjIxODEKK09zYWdlIAk6CTI5CToJMTU4OC43MzE5CitPemFyayAJOgkyOQk6CTE5NTUuNjMxMworUGVtaXNjb3QgCToJMjkJOgkxMzI3LjE0MTkKK1BlcnJ5IAk6CTI5CToJMTI1NC4yODUyCitQZXR0aXMgCToJMjkJOgkxNzc3LjYyMDYKK1BoZWxwcyAJOgkyOQk6CTE3NDYuMzg1MgorUGlrZSAJOgkyOQk6CTE3NzMuNjU3OQorUGxhdHRlIAk6CTI5CToJMTEwNi40OTk4CitQb2xrIAk6CTI5CToJMTY2My45NzE0CitQdWxhc2tpIAk6CTI5CToJMTQyOC4xNTE5CitQdXRuYW0gCToJMjkJOgkxMzQ1LjkxOTQKK1JhbGxzIAk6CTI5CToJMTI1My4wOTM4CitSYW5kb2xwaCAJOgkyOQk6CTEyNjMuMDEzNQorUmF5IAk6CTI5CToJMTQ4NS41NDYzCitSZXlub2xkcyAJOgkyOQk6CTIxMDkuMzIxOQorUmlwbGV5IAk6CTI5CToJMTYzNS45OTk0CitTdC4gQ2hhcmxlcyAJOgkyOQk6CTE1MzQuMTg2NQorU3QuIENsYWlyIAk6CTI5CToJMTgxNy45MjEKK1N0ZS4gR2VuZXZpZXZlIAk6CTI5CToJMTMxOC4xNTQ2CitTdC4gRnJhbmNvaXMgCToJMjkJOgkxMTcxLjcxNgorU3QuIExvdWlzIAk6CTI5CToJMTM1Ni4zNTcxCitTYWxpbmUgCToJMjkJOgkxOTgwLjI4ODEKK1NjaHV5bGVyIAk6CTI5CToJNzk4LjEzNDQKK1Njb3RsYW5kIAk6CTI5CToJMTEzNy42NTc1CitTY290dCAJOgkyOQk6CTExMDMuNDQzNgorU2hhbm5vbiAJOgkyOQk6CTI2MDAuMzM0MQorU2hlbGJ5IAk6CTI5CToJMTMwMS4yOTM3CitTdG9kZGFyZCAJOgkyOQk6CTIxNDYuOTU0NgorU3RvbmUgCToJMjkJOgkxMzIzLjI1NjkKK1N1bGxpdmFuIAk6CTI5CToJMTY4Ny4yMDM3CitUYW5leSAJOgkyOQk6CTE2ODcuMzMzMgorVGV4YXMgCToJMjkJOgkzMDU0LjIzMTYKK1Zlcm5vbiAJOgkyOQk6CTIxNjcuOTMzNgorV2FycmVuIAk6CTI5CToJMTEzMy43NDY2CitXYXNoaW5ndG9uIAk6CTI5CToJMTk3NC43NzE0CitXYXluZSAJOgkyOQk6CTIwMDQuODkzMQorV2Vic3RlciAJOgkyOQk6CTE1MzcuNjU3MQorV29ydGggCToJMjkJOgk2OTAuODgyNQorV3JpZ2h0IAk6CTI5CToJMTc2OS40MzYyCitTdC4gTG91aXMgY2l0eQk6CTI5CToJMTcxLjMyODUKK0JlYXZlcmhlYWQgCToJMzAJOgkxNDQzMS41ODM2CitCaWcgSG9ybiAJOgkzMAk6CTEyOTg3Ljk0MzUKK0JsYWluZSAJOgkzMAk6CTEwOTc4LjgwMjgKK0Jyb2Fkd2F0ZXIgCToJMzAJOgkzMjA4Ljg1NDYKK0NhcmJvbiAJOgkzMAk6CTUzNDEuMDcyMQorQ2FydGVyIAk6CTMwCToJODY3Mi4wNzExCitDYXNjYWRlIAk6CTMwCToJNzAyMy4xNzM1CitDaG91dGVhdSAJOgkzMAk6CTEwMzUyLjIzCitDdXN0ZXIgCToJMzAJOgk5ODI0LjQzOTgKK0RhbmllbHMgCToJMzAJOgkzNjk0LjY4NjgKK0Rhd3NvbiAJOgkzMAk6CTYxNzIuMzA2NworRGVlciBMb2RnZSAJOgkzMAk6CTE5MTkuNjA0NAorRmFsbG9uIAk6CTMwCToJNDIwMy42MjE4CitGZXJndXMgCToJMzAJOgkxMTI2Ny40MzI0CitGbGF0aGVhZCAJOgkzMAk6CTEzNjE0LjIwNTUKK0dhbGxhdGluIAk6CTMwCToJNjgxNi40NjU2CitHYXJmaWVsZCAJOgkzMAk6CTEyNTU1LjEyODYKK0dsYWNpZXIgCToJMzAJOgk3ODY2LjExNDkKK0dvbGRlbiBWYWxsZXkgCToJMzAJOgkzMDQ2Ljg3NgorR3Jhbml0ZSAJOgkzMAk6CTQ0ODguNzU0OQorSGlsbCAJOgkzMAk6CTc1NTIuNTY5NQorSmVmZmVyc29uIAk6CTMwCToJNDI5Ni4zNjk3CitKdWRpdGggQmFzaW4gCToJMzAJOgk0ODQ1LjEzODkKK0xha2UgCToJMzAJOgk0MjgzLjEzNDgKK0xld2lzIGFuZCBDbGFyayAJOgkzMAk6CTkwNTguNjgwNAorTGliZXJ0eSAJOgkzMAk6CTM3NDguMjIyMQorTGluY29sbiAJOgkzMAk6CTk1MTguNTM0OQorTWNDb25lIAk6CTMwCToJNjk0OC4zNzQzCitNYWRpc29uIAk6CTMwCToJOTMzMS4zODE1CitNZWFnaGVyIAk6CTMwCToJNjIwMi42MDk3CitNaW5lcmFsIAk6CTMwCToJMzE2OC41NTQyCitNaXNzb3VsYSAJOgkzMAk6CTY3ODEuNTAwNgorTXVzc2Vsc2hlbGwgCToJMzAJOgk0ODQ1LjY1NjkKK1BhcmsgCToJMzAJOgk3Mjg3LjE5ODEKK1BldHJvbGV1bSAJOgkzMAk6CTQzMzUuNjg1OQorUGhpbGxpcHMgCToJMzAJOgkxMzQ5OS41MjAzCitQb25kZXJhIAk6CTMwCToJNDI0Ny4yMTE1CitQb3dkZXIgUml2ZXIgCToJMzAJOgk4NTQxLjY2NDYKK1Bvd2VsbCAJOgkzMAk6CTYwNDEuNjQxMgorUHJhaXJpZSAJOgkzMAk6CTQ1MTMuMjMwNAorUmF2YWxsaSAJOgkzMAk6CTYyMTYuODI4OAorUmljaGxhbmQgCToJMzAJOgk1NDQ2LjgyMTgKK1Jvb3NldmVsdCAJOgkzMAk6CTYxMzcuMzkzNQorUm9zZWJ1ZCAJOgkzMAk6CTEzMDE5Ljc3NDYKK1NhbmRlcnMgCToJMzAJOgk3MjI2LjE3NzcKK1NoZXJpZGFuIAk6CTMwCToJNDQxOS4zMTcKK1NpbHZlciBCb3cgCToJMzAJOgkxODYyLjEzMjMKK1N0aWxsd2F0ZXIgCToJMzAJOgk0NjczLjkzOTkKK1N3ZWV0IEdyYXNzIAk6CTMwCToJNDgyMi41OAorVGV0b24gCToJMzAJOgk1OTM3Ljc4MjIKK1Rvb2xlIAk6CTMwCToJNTAzOS43Nzc0CitUcmVhc3VyZSAJOgkzMAk6CTI1NDguODQ0OQorVmFsbGV5IAk6CTMwCToJMTMxMTAuNTI4MgorV2hlYXRsYW5kIAk6CTMwCToJMzY5OS4yNzExCitXaWJhdXggCToJMzAJOgkyMzA1LjMzMzEKK1llbGxvd3N0b25lIAk6CTMwCToJNjg2MS4wMzk1CitBZGFtcyAJOgkzMQk6CTE0NjEuMTc0NAorQW50ZWxvcGUgCToJMzEJOgkyMjIzLjMzMzcKK0FydGh1ciAJOgkzMQk6CTE4NjAuNDQ4OAorQmFubmVyIAk6CTMxCToJMTkzMy4wOTgzCitCbGFpbmUgCToJMzEJOgkxODUwLjE0MDYKK0Jvb25lIAk6CTMxCToJMTc3OS45Nzc1CitCb3ggQnV0dGUgCToJMzEJOgkyNzkxLjYwNTYKK0JveWQgCToJMzEJOgkxNDEwLjQ4ODEKK0Jyb3duIAk6CTMxCToJMzE3Mi45NTcyCitCdWZmYWxvIAk6CTMxCToJMjUyNS45NDkzCitCdXJ0IAk6CTMxCToJMTI4Ny40ODkKK0J1dGxlciAJOgkzMQk6CTE1MTMuNjIxOQorQ2FzcyAJOgkzMQk6CTE0NjYuNDgzOQorQ2VkYXIgCToJMzEJOgkxOTMxLjY0NzkKK0NoYXNlIAk6CTMxCToJMjMyNC44NjE3CitDaGVycnkgCToJMzEJOgkxNTU2NC43MDg2CitDaGV5ZW5uZSAJOgkzMQk6CTMwOTguODA1NQorQ2xheSAJOgkzMQk6CTE0ODUuNDQyNworQ29sZmF4IAk6CTMxCToJMTA4NC4xMjIyCitDdW1pbmcgCToJMzEJOgkxNDg4LjA1ODYKK0N1c3RlciAJOgkzMQk6CTY2NzIuMDQ3MgorRGFrb3RhIAk6CTMxCToJNjkyLjU0MDEKK0Rhd2VzIAk6CTMxCToJMzYyOC4yMjc0CitEYXdzb24gCToJMzEJOgkyNjM5Ljk4NworRGV1ZWwgCToJMzEJOgkxMTQxLjY0NjEKK0RpeG9uIAk6CTMxCToJMTI1MC4yNDQ4CitEb2RnZSAJOgkzMQk6CTE0MDguNzUyOAorRG91Z2xhcyAJOgkzMQk6CTg3OS41NjQKK0R1bmR5IAk6CTMxCToJMjM4NC44NDYxCitGaWxsbW9yZSAJOgkzMQk6CTE0OTMuNDQ1OAorRnJhbmtsaW4gCToJMzEJOgkxNDkyLjEyNDkKK0Zyb250aWVyIAk6CTMxCToJMjUzOC4zNTU0CitGdXJuYXMgCToJMzEJOgkxODY2LjEyMDkKK0dhZ2UgCToJMzEJOgkyMjI3LjI0NDYKK0dhcmRlbiAJOgkzMQk6CTQ0ODMuMjkKK0dhcmZpZWxkIAk6CTMxCToJMTQ3OS43NzA2CitHb3NwZXIgCToJMzEJOgkxMTk4LjQ5NjYKK0dyYW50IAk6CTMxCToJMjAyOC41NjU3CitHcmVlbGV5IAk6CTMxCToJMTQ3OC4xMzg5CitIYWxsIAk6CTMxCToJMTQzMC4yNDk4CitIYW1pbHRvbiAJOgkzMQk6CTE0MTYuMTM0MworSGFybGFuIAk6CTMxCToJMTQ4Ny4xMjYyCitIYXllcyAJOgkzMQk6CTE4NDcuNTI0NworSGl0Y2hjb2NrIAk6CTMxCToJMTg2MS4wOTYzCitIb2x0IAk6CTMxCToJNjI2MS43MTM1CitIb29rZXIgCToJMzEJOgkxODY4LjcxMDkKK0hvd2FyZCAJOgkzMQk6CTE0OTEuMTY2NgorSmVmZmVyc29uIAk6CTMxCToJMTQ5MC41NDUKK0pvaG5zb24gCToJMzEJOgk5NzUuOTYzOAorS2Vhcm5leSAJOgkzMQk6CTEzMzYuNzc2NworS2VpdGggCToJMzEJOgkyODc0LjMwNDMKK0tleWEgUGFoYSAJOgkzMQk6CTIwMDUuMTAwMworS2ltYmFsbCAJOgkzMQk6CTI0NjYuNDgyOQorS25veCAJOgkzMQk6CTI5NTEuNjkzNQorTGFuY2FzdGVyIAk6CTMxCToJMjE5Mi45Nzg5CitMaW5jb2xuIAk6CTMxCToJNjY2OS41MDkKK0xvZ2FuIAk6CTMxCToJMTQ3OS4yNzg1CitMb3VwIAk6CTMxCToJMTQ3OC45NDE4CitNY1BoZXJzb24gCToJMzEJOgkyMjI3LjQ1MTgKK01hZGlzb24gCToJMzEJOgkxNDg5LjM3OTUKK01lcnJpY2sgCToJMzEJOgkxMjgxLjMyNDgKK01vcnJpbGwgCToJMzEJOgkzNzAzLjIwNzkKK05hbmNlIAk6CTMxCToJMTE2MC40MjM2CitOZW1haGEgCToJMzEJOgkxMDY2Ljc5NTEKK051Y2tvbGxzIAk6CTMxCToJMTQ5MS43MzY0CitPdG9lIAk6CTMxCToJMTYwMy40NDMxCitQYXduZWUgCToJMzEJOgkxMTIxLjM0MDUKK1BlcmtpbnMgCToJMzEJOgkyMjkwLjI1OTMKK1BoZWxwcyAJOgkzMQk6CTE0MDAuMTU0CitQaWVyY2UgCToJMzEJOgkxNDg5Ljk0OTMKK1BsYXR0ZSAJOgkzMQk6CTE3ODQuNzE3MgorUG9sayAJOgkzMQk6CTExNDEuNDY0OAorUmVkIFdpbGxvdyAJOgkzMQk6CTE4NTkuNzc1NAorUmljaGFyZHNvbiAJOgkzMQk6CTE0MzkuOTEwNQorUm9jayAJOgkzMQk6CTI2MjAuNjkxNQorU2FsaW5lIAk6CTMxCToJMTQ5MS45OTU0CitTYXJweSAJOgkzMQk6CTY0MC40NTUyCitTYXVuZGVycyAJOgkzMQk6CTE5NjUuMzQzOAorU2NvdHRzIEJsdWZmIAk6CTMxCToJMTkzMC44NDUKK1Nld2FyZCAJOgkzMQk6CTE0OTEuMTQwNworU2hlcmlkYW4gCToJMzEJOgk2Mzk3LjI3NDEKK1NoZXJtYW4gCToJMzEJOgkxNDgwLjUyMTcKK1Npb3V4IAk6CTMxCToJNTM1NC4zNTg4CitTdGFudG9uIAk6CTMxCToJMTExNi40NDU0CitUaGF5ZXIgCToJMzEJOgkxNDkwLjAyNworVGhvbWFzIAk6CTMxCToJMTg0OC4zNTM1CitUaHVyc3RvbiAJOgkzMQk6CTEwMjYuMjg3NQorVmFsbGV5IAk6CTMxCToJMTQ3Ny42MjA5CitXYXNoaW5ndG9uIAk6CTMxCToJMTAxOS44Mzg0CitXYXluZSAJOgkzMQk6CTExNDguNjEzMgorV2Vic3RlciAJOgkzMQk6CTE0ODkuMzAxOAorV2hlZWxlciAJOgkzMQk6CTE0OTAuNzI2MworWW9yayAJOgkzMQk6CTE0OTEuODkxOAorQ2h1cmNoaWxsIAk6CTMyCToJMTMwMTAuNTU0MgorQ2xhcmsgCToJMzIJOgkyMDk1NC44MDk0CitEb3VnbGFzIAk6CTMyCToJMTkxMC41MTM1CitFbGtvIAk6CTMyCToJNDQ1NTUuNjE0NgorRXNtZXJhbGRhIAk6CTMyCToJOTI5NS41MQorRXVyZWthIAk6CTMyCToJMTA4MjYuMDk2NAorSHVtYm9sZHQgCToJMzIJOgkyNTAxMy44ODMzCitMYW5kZXIgCToJMzIJOgkxNDI5NS40MjczCitMaW5jb2xuIAk6CTMyCToJMjc1NDkuMjM0MworTHlvbiAJOgkzMgk6CTUyMjIuNDc2CitNaW5lcmFsIAk6CTMyCToJOTg3NS41OTIzCitOeWUgCToJMzIJOgk0NzAzMS4xMTA3CitQZXJzaGluZyAJOgkzMgk6CTE1NzE0Ljk1NDUKK1N0b3JleSAJOgkzMgk6CTY4My4yNDIKK1dhc2hvZSAJOgkzMgk6CTE2OTY3LjkxODgKK1doaXRlIFBpbmUgCToJMzIJOgkyMzA0Mi4xOTQKK0NhcnNvbiBDaXR5CToJMzIJOgk0MDMuMTU5NAorQmVsa25hcCAJOgkzMwk6CTEyMTMuNTQ0NQorQ2Fycm9sbCAJOgkzMwk6CTI1NjkuOTAxNgorQ2hlc2hpcmUgCToJMzMJOgkxODg4LjQ5ODUKK0Nvb3MgCToJMzMJOgk0NzQzLjQyOTYKK0dyYWZ0b24gCToJMzMJOgk0NTMyLjcwNzIKK0hpbGxzYm9yb3VnaCAJOgkzMwk6CTIzMTAuNzk4CitNZXJyaW1hY2sgCToJMzMJOgkyNDc3LjMwOTEKK1JvY2tpbmdoYW0gCToJMzMJOgkyMDU2LjM1NjQKK1N0cmFmZm9yZCAJOgkzMwk6CTk5NC4zMjY5CitTdWxsaXZhbiAJOgkzMwk6CTE0MjkuNDcyOAorQXRsYW50aWMgCToJMzQJOgkxNzM5LjA1NTUKK0JlcmdlbiAJOgkzNAk6CTYzOS4yMTIKK0J1cmxpbmd0b24gCToJMzQJOgkyMTIyLjMyMzcKK0NhbWRlbiAJOgkzNAk6CTU4OS40MzIyCitDYXBlIE1heSAJOgkzNAk6CTE2MDYuNTI1MgorQ3VtYmVybGFuZCAJOgkzNAk6CTE3NTIuMzY4MQorRXNzZXggCToJMzQJOgkzMzUuNTYwNAorR2xvdWNlc3RlciAJOgkzNAk6CTg3Mi42MjI4CitIdWRzb24gCToJMzQJOgkxNjEuNjkzNworSHVudGVyZG9uIAk6CTM0CToJMTEzMy43OTg0CitNZXJjZXIgCToJMzQJOgk1OTIuNjk1NgorTWlkZGxlc2V4IAk6CTM0CToJODM1LjMwMDkKK01vbm1vdXRoIAk6CTM0CToJMTcyMi42NjA4CitNb3JyaXMgCToJMzQJOgkxMjQ2LjU0MTEKK09jZWFuIAk6CTM0CToJMjM3Mi4xMjkyCitQYXNzYWljIAk6CTM0CToJNTEwLjM1OTUKK1NhbGVtIAk6CTM0CToJOTY0Ljk1NjMKK1NvbWVyc2V0IAk6CTM0CToJNzkwLjA3OTUKK1N1c3NleCAJOgkzNAk6CTEzODguMjE0MQorVW5pb24gCToJMzQJOgkyNzMuMTQxNAorV2FycmVuIAk6CTM0CToJOTM5LjUyMjUKK0Jlcm5hbGlsbG8gCToJMzUJOgkzMDI2LjgwMzUKK0NhdHJvbiAJOgkzNQk6CTE3OTQ2LjE4NzcKK0NoYXZlcyAJOgkzNQk6CTE1NzM0LjQzMTMKK0NpYm9sYSAJOgkzNQk6CTExNzYzLjAyODkKK0NvbGZheCAJOgkzNQk6CTk3NTkuMjQ5NQorQ3VycnkgCToJMzUJOgkzNjQ1Ljg2NTMKK0RlIEJhY2EgCToJMzUJOgk2MDQ0LjYxOTcKK0RvbmEgQW5hIAk6CTM1CToJOTg3OS44NjU4CitFZGR5IAk6CTM1CToJMTA4NzEuNzA2MworR3JhbnQgCToJMzUJOgkxMDI3NS44MjUKK0d1YWRhbHVwZSAJOgkzNQk6CTc4NTEuNzkyMgorSGFyZGluZyAJOgkzNQk6CTU1MDYuMjEwNQorSGlkYWxnbyAJOgkzNQk6CTg5MjQuOTA2OQorTGVhIAk6CTM1CToJMTEzODAuNTExOAorTGluY29sbiAJOgkzNQk6CTEyNTEyLjkzNzUKK0xvcyBBbGFtb3MgCToJMzUJOgkyODMuMjE2NQorTHVuYSAJOgkzNQk6CTc2ODAuMDc1MgorTWNLaW5sZXkgCToJMzUJOgkxNDEyOS4wMTk4CitNb3JhIAk6CTM1CToJNTAwNy43MTMyCitPdGVybyAJOgkzNQk6CTE3MTY1LjA0MzcKK1F1YXkgCToJMzUJOgk3NDYzLjg2MgorUmlvIEFycmliYSAJOgkzNQk6CTE1MjcwLjg5OQorUm9vc2V2ZWx0IAk6CTM1CToJNjM1OC4xMTMzCitTYW5kb3ZhbCAJOgkzNQk6CTk2MjAuMDg4OAorU2FuIEp1YW4gCToJMzUJOgkxNDM0NC4zNTI0CitTYW4gTWlndWVsIAk6CTM1CToJMTIyNjUuMjgxNworU2FudGEgRmUgCToJMzUJOgk0OTQ4Ljk0NjEKK1NpZXJyYSAJOgkzNQk6CTEwOTcyLjAxNworU29jb3JybyAJOgkzNQk6CTE3MjIwLjE1ODkKK1Rhb3MgCToJMzUJOgk1NzA5Ljk2NTgKK1RvcnJhbmNlIAk6CTM1CToJODY2NS42NDc5CitVbmlvbiAJOgkzNQk6CTk5MjEuNzQ2MQorVmFsZW5jaWEgCToJMzUJOgkyNzY2LjY2MzkKK0FsYmFueSAJOgkzNgk6CTEzODEuMDEzOQorQWxsZWdhbnkgCToJMzYJOgkyNjc5LjE0NzgKK0Jyb254IAk6CTM2CToJMTQ4Ljc0MzcKK0Jyb29tZSAJOgkzNgk6CTE4NTMuMDQxNAorQ2F0dGFyYXVndXMgCToJMzYJOgkzNDI0LjYyNzUKK0NheXVnYSAJOgkzNgk6CTIyMzYuODI3NgorQ2hhdXRhdXF1YSAJOgkzNgk6CTM4ODUuMDUxOAorQ2hlbXVuZyAJOgkzNgk6CTEwNjMuOTQ2MQorQ2hlbmFuZ28gCToJMzYJOgkyMzI3LjYzMworQ2xpbnRvbiAJOgkzNgk6CTI4OTQuNjA5OQorQ29sdW1iaWEgCToJMzYJOgkxNjc5LjAxOTMKK0NvcnRsYW5kIAk6CTM2CToJMTI5OC45MzY4CitEZWxhd2FyZSAJOgkzNgk6CTM4MDIuMjIzNgorRHV0Y2hlc3MgCToJMzYJOgkyMTM3LjczNDIKK0VyaWUgCToJMzYJOgkzMTc3LjY0NTEKK0Vzc2V4IAk6CTM2CToJNDk2My43MzUKK0ZyYW5rbGluIAk6CTM2CToJNDM5Ni4zNjk2CitGdWx0b24gCToJMzYJOgkxMzgwLjIxMQorR2VuZXNlZSAJOgkzNgk6CTEyODIuOTA0NworR3JlZW5lIAk6CTM2CToJMTcwNC41NTY3CitIYW1pbHRvbiAJOgkzNgk6CTQ2ODIuMjI3OQorSGVya2ltZXIgCToJMzYJOgkzNzc3LjEyNjUKK0plZmZlcnNvbiAJOgkzNgk6CTQ4MDkuODM3MgorS2luZ3MgCToJMzYJOgkyNTAuOTcxCitMZXdpcyAJOgkzNgk6CTMzNDAuODE1MQorTGl2aW5nc3RvbiAJOgkzNgk6CTE2NTguNzM5NgorTWFkaXNvbiAJOgkzNgk6CTE3MTMuMzg4NgorTW9ucm9lIAk6CTM2CToJMzUzNi45Mjk5CitNb250Z29tZXJ5IAk6CTM2CToJMTA2Mi43Mjg4CitOYXNzYXUgCToJMzYJOgkxMTczLjQ3NzIKK05ldyBZb3JrIAk6CTM2CToJODcuNDY0MworTmlhZ2FyYSAJOgkzNgk6CTI5NTIuMTU5NworT25laWRhIAk6CTM2CToJMzI1NS45MTQ5CitPbm9uZGFnYSAJOgkzNgk6CTIwODYuNzM3MQorT250YXJpbyAJOgkzNgk6CTE3MTUuNjkzNworT3JhbmdlIAk6CTM2CToJMjE3MS44NDQ1CitPcmxlYW5zIAk6CTM2CToJMjExNy4yNDczCitPc3dlZ28gCToJMzYJOgkzMzk4LjU0NjIKK090c2VnbyAJOgkzNgk6CTI2MjkuMTA5CitQdXRuYW0gCToJMzYJOgk2MzcuNzg3NQorUXVlZW5zIAk6CTM2CToJNDYxLjc0NTIKK1JlbnNzZWxhZXIgCToJMzYJOgkxNzIzLjM2MDEKK1JpY2htb25kIAk6CTM2CToJMjY1LjQ3NQorUm9ja2xhbmQgCToJMzYJOgk1MTYuMjkwNgorU3QuIExhd3JlbmNlIAk6CTM2CToJNzMwNy42MzMyCitTYXJhdG9nYSAJOgkzNgk6CTIxODUuMjA4OQorU2NoZW5lY3RhZHkgCToJMzYJOgk1NDIuOTE1OAorU2Nob2hhcmllIAk6CTM2CToJMTYyMi4yNzI0CitTY2h1eWxlciAJOgkzNgk6CTg4Ni4zNDk4CitTZW5lY2EgCToJMzYJOgkxMDExLjQyMDkKK1N0ZXViZW4gCToJMzYJOgkzNjM2LjYxOQorU3VmZm9sayAJOgkzNgk6CTYxNDYuMjUxMworU3VsbGl2YW4gCToJMzYJOgkyNTgxLjg0MTUKK1Rpb2dhIAk6CTM2CToJMTM1NC4zMzY5CitUb21wa2lucyAJOgkzNgk6CTEyNzMuMzIxNworVWxzdGVyIAk6CTM2CToJMzAwNi4zNjg0CitXYXJyZW4gCToJMzYJOgkyNDEyLjk5OTQKK1dhc2hpbmd0b24gCToJMzYJOgkyMTkwLjcyNTYKK1dheW5lIAk6CTM2CToJMzU4NC45MjI2CitXZXN0Y2hlc3RlciAJOgkzNgk6CTEyOTUuMjA3MgorV3lvbWluZyAJOgkzNgk6CTE1NDQuNzc5NgorWWF0ZXMgCToJMzYJOgk5NzMuMjE4NAorQWxhbWFuY2UgCToJMzcJOgkxMTI2LjA1NDMKK0FsZXhhbmRlciAJOgkzNwk6CTY4MS41MzI2CitBbGxlZ2hhbnkgCToJMzcJOgk2MDkuOTk2OAorQW5zb24gCToJMzcJOgkxMzkxLjE2NjcKK0FzaGUgCToJMzcJOgkxMTA1LjM2MDIKK0F2ZXJ5IAk6CTM3CToJNjQwLjI3MzkKK0JlYXVmb3J0IAk6CTM3CToJMjQ4My4wMDcxCitCZXJ0aWUgCToJMzcJOgkxOTE5Ljc1OTgKK0JsYWRlbiAJOgkzNwk6CTIyOTcuNjY2NworQnJ1bnN3aWNrIAk6CTM3CToJMjcxOS41MjU5CitCdW5jb21iZSAJOgkzNwk6CTE3MDguODgyCitCdXJrZSAJOgkzNwk6CTEzMzMuNTY1MQorQ2FiYXJydXMgCToJMzcJOgk5NDUuMjk4MgorQ2FsZHdlbGwgCToJMzcJOgkxMjI4LjQxMTEKK0NhbWRlbiAJOgkzNwk6CTc5MS43NjMKK0NhcnRlcmV0IAk6CTM3CToJMzQ3MS45NzI3CitDYXN3ZWxsIAk6CTM3CToJMTEwOS42MzM3CitDYXRhd2JhIAk6CTM3CToJMTA3MC45OTA5CitDaGF0aGFtIAk6CTM3CToJMTgzNi40Mzk1CitDaGVyb2tlZSAJOgkzNwk6CTEyMDguNzAxMgorQ2hvd2FuIAk6CTM3CToJNjA0LjI3MjkKK0NsYXkgCToJMzcJOgk1NzEuMzU0CitDbGV2ZWxhbmQgCToJMzcJOgkxMjEzLjY3NAorQ29sdW1idXMgCToJMzcJOgkyNDY5LjgyNAorQ3JhdmVuIAk6CTM3CToJMjAwNS4wMjI2CitDdW1iZXJsYW5kIAk6CTM3CToJMTcwNS40MTE0CitDdXJyaXR1Y2sgCToJMzcJOgkxMzYxLjQzMzUKK0RhcmUgCToJMzcJOgk0MDQ0LjMxMDkKK0Rhdmlkc29uIAk6CTM3CToJMTQ2Ny45MzQzCitEYXZpZSAJOgkzNwk6CTY5MS4yNDUxCitEdXBsaW4gCToJMzcJOgkyMTIxLjQ5NDkKK0R1cmhhbSAJOgkzNwk6CTc3MS4yNzYxCitFZGdlY29tYmUgCToJMzcJOgkxMzEyLjA0MjIKK0ZvcnN5dGggCToJMzcJOgkxMDY5LjQ2MjgKK0ZyYW5rbGluIAk6CTM3CToJMTI4MC45ODgxCitHYXN0b24gCToJMzcJOgk5NDEuNTY4NgorR2F0ZXMgCToJMzcJOgk4OTUuMTA0CitHcmFoYW0gCToJMzcJOgk3ODEuMTQ0CitHcmFudmlsbGUgCToJMzcJOgkxMzg5LjY5MDQKK0dyZWVuZSAJOgkzNwk6CTY4OC42NTUxCitHdWlsZm9yZCAJOgkzNwk6CTE3MDMuNDQzCitIYWxpZmF4IAk6CTM3CToJMTg5NC4xOTY1CitIYXJuZXR0IAk6CTM3CToJMTU1Ny4zNjcKK0hheXdvb2QgCToJMzcJOgkxNDM2LjQ2NTgKK0hlbmRlcnNvbiAJOgkzNwk6CTk3MS4zNTM2CitIZXJ0Zm9yZCAJOgkzNwk6CTkzMy40ODc4CitIb2tlIAk6CTM3CToJMTAxNi4xNjA2CitIeWRlIAk6CTM3CToJMzY4OC4xNgorSXJlZGVsbCAJOgkzNwk6CTE1NDYuMjU1OQorSmFja3NvbiAJOgkzNwk6CTEyODAuNzU1CitKb2huc3RvbiAJOgkzNwk6CTIwNjEuMDk2MQorSm9uZXMgCToJMzcJOgkxMjI1Ljg5ODgKK0xlZSAJOgkzNwk6CTY3MS42NjQ3CitMZW5vaXIgCToJMzcJOgkxMDQxLjQxMzEKK0xpbmNvbG4gCToJMzcJOgk3OTUuMjA3NworTWNEb3dlbGwgCToJMzcJOgkxMTU2LjIwMTkKK01hY29uIAk6CTM3CToJMTM0NS40MjczCitNYWRpc29uIAk6CTM3CToJMTE2OS42MTgxCitNYXJ0aW4gCToJMzcJOgkxMTk1LjI1OTEKK01lY2tsZW5idXJnIAk6CTM3CToJMTQxNC43MDk4CitNaXRjaGVsbCAJOgkzNwk6CTU3NS4zNDI2CitNb250Z29tZXJ5IAk6CTM3CToJMTI5OS4yNDc2CitNb29yZSAJOgkzNwk6CTE4MjcuNjg1MworTmFzaCAJOgkzNwk6CTE0MDUuNTY3MQorTmV3IEhhbm92ZXIgCToJMzcJOgk4NDkuMzEyOAorTm9ydGhhbXB0b24gCToJMzcJOgkxNDI2LjA3OTkKK09uc2xvdyAJOgkzNwk6CTIzNTMuMTcwNAorT3JhbmdlIAk6CTM3CToJMTAzOS4xMzM5CitQYW1saWNvIAk6CTM3CToJMTQ2Ni41MzU3CitQYXNxdW90YW5rIAk6CTM3CToJNzQ5LjY0OTYKK1BlbmRlciAJOgkzNwk6CTI0MTUuNTM3NgorUGVycXVpbWFucyAJOgkzNwk6CTg1MS45Mjg3CitQZXJzb24gCToJMzcJOgkxMDQ2LjU5MzEKK1BpdHQgCToJMzcJOgkxNjk1Ljg1NDMKK1BvbGsgCToJMzcJOgk2MTcuOTc0CitSYW5kb2xwaCAJOgkzNwk6CTIwNDUuOTE4NworUmljaG1vbmQgCToJMzcJOgkxMjQyLjExMjIKK1JvYmVzb24gCToJMzcJOgkyNDYzLjE2NzcKK1JvY2tpbmdoYW0gCToJMzcJOgkxNDgyLjMzNDcKK1Jvd2FuIAk6CTM3CToJMTM1Ni43OTc0CitSdXRoZXJmb3JkIAk6CTM3CToJMTQ2NS42ODEKK1NhbXBzb24gCToJMzcJOgkyNDUzLjg5NTUKK1Njb3RsYW5kIAk6CTM3CToJODMwLjQ1NzYKK1N0YW5seSAJOgkzNwk6CTEwNDcuMDMzNAorU3Rva2VzIAk6CTM3CToJMTE4MC43NTUxCitTdXJyeSAJOgkzNwk6CTEzOTIuODc2MQorU3dhaW4gCToJMzcJOgkxNDAwLjI1NzYKK1RyYW5zeWx2YW5pYSAJOgkzNwk6CTk4NS42NTA0CitUeXJyZWxsIAk6CTM3CToJMTU1NC43NzcKK1VuaW9uIAk6CTM3CToJMTY1Ni41MzgxCitWYW5jZSAJOgkzNwk6CTY5OC44MzM4CitXYWtlIAk6CTM3CToJMjIyMC4zMDM0CitXYXJyZW4gCToJMzcJOgkxMTQ5LjQ0MgorV2FzaGluZ3RvbiAJOgkzNwk6CTEwOTkuMTcwMQorV2F0YXVnYSAJOgkzNwk6CTgwOS45NzA3CitXYXluZSAJOgkzNwk6CTE0NDEuODI3MQorV2lsa2VzIAk6CTM3CToJMTk2OC4yMTg3CitXaWxzb24gCToJMzcJOgk5NjkuMzMzNAorWWFka2luIAk6CTM3CToJODc0LjA5OTEKK1lhbmNleSAJOgkzNwk6CTgxMC45NTQ5CitBZGFtcyAJOgkzOAk6CTI1NjEuMDk1NgorQmFybmVzIAk6CTM4CToJMzkxOS4yNjU3CitCZW5zb24gCToJMzgJOgkzNzI3LjcwOTMKK0JpbGxpbmdzIAk6CTM4CToJMjk4Ny4zMDYKK0JvdHRpbmVhdSAJOgkzOAk6CTQzOTcuMTQ2NgorQm93bWFuIAk6CTM4CToJMzAyMi41MDQxCitCdXJrZSAJOgkzOAk6CTI5MjQuNzgzNAorQnVybGVpZ2ggCToJMzgJOgk0MzIwLjIyMzYKK0Nhc3MgCToJMzgJOgk0NTc4Ljg4NjkKK0NhdmFsaWVyIAk6CTM4CToJMzkxMS4yNjI2CitEaWNrZXkgCToJMzgJOgkyOTU2Ljg5OTQKK0RpdmlkZSAJOgkzOAk6CTMzNTEuOTI2MgorRHVubiAJOgkzOAk6CTUzOTMuMDI3NQorRWRkeSAJOgkzOAk6CTE2NjguNTU1NworRW1tb25zIAk6CTM4CToJNDAyNi43MjQ4CitGb3N0ZXIgCToJMzgJOgkxNjc1LjAwNDgKK0dvbGRlbiBWYWxsZXkgCToJMzgJOgkyNTk2LjExMjQKK0dyYW5kIEZvcmtzIAk6CTM4CToJMzcyOS4xNTk3CitHcmFudCAJOgkzOAk6CTQzMTQuNzMyOAorR3JpZ2dzIAk6CTM4CToJMTg1NC44ODAzCitIZXR0aW5nZXIgCToJMzgJOgkyOTM2LjI4MworS2lkZGVyIAk6CTM4CToJMzcxMi4wMTM5CitMYU1vdXJlIAk6CTM4CToJMjk4MC41OTc5CitMb2dhbiAJOgkzOAk6CTI2MTguNjcxMworTWNIZW5yeSAJOgkzOAk6CTQ5NTEuMzI4OQorTWNJbnRvc2ggCToJMzgJOgkyNTc3LjE1MzYKK01jS2VuemllIAk6CTM4CToJNzQwOS43MDUxCitNY0xlYW4gCToJMzgJOgk2MDI5Ljk2MDMKK01lcmNlciAJOgkzOAk6CTI4ODEuMTY3OAorTW9ydG9uIAk6CTM4CToJNTAzOC4yNzUyCitNb3VudHJhaWwgCToJMzgJOgk1MDI3LjM5NzIKK05lbHNvbiAJOgkzOAk6CTI2MTIuNjM2NgorT2xpdmVyIAk6CTM4CToJMTg5My43ODIxCitQZW1iaW5hIAk6CTM4CToJMjkwNS4zMDY2CitQaWVyY2UgCToJMzgJOgkyODAyLjc5NDQKK1JhbXNleSAJOgkzOAk6CTMzNjkuMjc5MgorUmFuc29tIAk6CTM4CToJMjIzOC4wOTY3CitSZW52aWxsZSAJOgkzOAk6CTIzMTAuMzU3NworUmljaGxhbmQgCToJMzgJOgkzNzQ0LjQ0MDcKK1JvbGV0dGUgCToJMzgJOgkyNDMyLjg2NDcKK1NhcmdlbnQgCToJMzgJOgkyMjQ1Ljc2MzEKK1NoZXJpZGFuIAk6CTM4CToJMjYwNC45NzAyCitTaW91eCAJOgkzOAk6CTI5MjIuMjk3CitTbG9wZSAJOgkzOAk6CTMxNTcuNzc5OAorU3RhcmsgCToJMzgJOgkzNDcxLjc5MTQKK1N0ZWVsZSAJOgkzOAk6CTE4NTMuMTE5MQorU3R1dHNtYW4gCToJMzgJOgk1OTUyLjQ5MzQKK1Rvd25lciAJOgkzOAk6CTI2OTcuNjQwNAorVHJhaWxsIAk6CTM4CToJMjIzMy45NTI3CitXYWxzaCAJOgkzOAk6CTMzNTEuNzQ0OQorV2FyZCAJOgkzOAk6CTUzMjUuNjg3NQorV2VsbHMgCToJMzgJOgkzMzQyLjcwNTgKK1dpbGxpYW1zIAk6CTM4CToJNTU2My4yNDIzCitBZGFtcyAJOgkzOQk6CTE1MTcuMTk2MQorQWxsZW4gCToJMzkJOgkxMDUzLjgxOTIKK0FzaGxhbmQgCToJMzkJOgkxMTA1LjU0MTUKK0FzaHRhYnVsYSAJOgkzOQk6CTM1NDQuMzM3MworQXRoZW5zIAk6CTM5CToJMTMxNy4xMTg2CitBdWdsYWl6ZSAJOgkzOQk6CTEwNDAuNDU0OAorQmVsbW9udCAJOgkzOQk6CTE0MDIuMjAwMQorQnJvd24gCToJMzkJOgkxMjgyLjYxOTgKK0J1dGxlciAJOgkzOQk6CTEyMTcuODE4CitDYXJyb2xsIAk6CTM5CToJMTAzMy40MzU5CitDaGFtcGFpZ24gCToJMzkJOgkxMTEyLjk0ODkKK0NsYXJrIAk6CTM5CToJMTA0NS4yMjA0CitDbGVybW9udCAJOgkzOQk6CTExODUuMzY1MworQ2xpbnRvbiAJOgkzOQk6CTEwNjcuODMxMQorQ29sdW1iaWFuYSAJOgkzOQk6CTEzODYuMTE2MgorQ29zaG9jdG9uIAk6CTM5CToJMTQ3MC4wMzIyCitDcmF3Zm9yZCAJOgkzOQk6CTEwNDMuMzI5NworQ3V5YWhvZ2EgCToJMzkJOgkzMjI2LjAwMDQKK0RhcmtlIAk6CTM5CToJMTU1NC43NTExCitEZWZpYW5jZSAJOgkzOQk6CTEwNzIuNzUyMQorRGVsYXdhcmUgCToJMzkJOgkxMTgwLjk2MjMKK0VyaWUgCToJMzkJOgkxNjIxLjcyODUKK0ZhaXJmaWVsZCAJOgkzOQk6CTEzMTcuMjc0CitGYXlldHRlIAk6CTM5CToJMTA1NC4zMzcyCitGcmFua2xpbiAJOgkzOQk6CTE0MDcuMTk4OAorRnVsdG9uIAk6CTM5CToJMTA1NC45NTg4CitHYWxsaWEgCToJMzkJOgkxMjIwLjIyNjcKK0dlYXVnYSAJOgkzOQk6CTEwNTcuNDcxMQorR3JlZW5lIAk6CTM5CToJMTA3Ny45ODM5CitHdWVybnNleSAJOgkzOQk6CTEzNjguMjcxMQorSGFtaWx0b24gCToJMzkJOgkxMDY5LjEwMDIKK0hhbmNvY2sgCToJMzkJOgkxMzgyLjAyNAorSGFyZGluIAk6CTM5CToJMTIxOC42OTg2CitIYXJyaXNvbiAJOgkzOQk6CTEwNjMuOTQ2MQorSGVucnkgCToJMzkJOgkxMDg3Ljc0ODIKK0hpZ2hsYW5kIAk6CTM5CToJMTQ0NC44MDU2CitIb2NraW5nIAk6CTM5CToJMTA5Ny4xMjQKK0hvbG1lcyAJOgkzOQk6CTEwOTguMjExOAorSHVyb24gCToJMzkJOgkxMjgwLjgwNjgKK0phY2tzb24gCToJMzkJOgkxMDkxLjY4NQorSmVmZmVyc29uIAk6CTM5CToJMTA2NC4xNTMzCitLbm94IAk6CTM5CToJMTM3MS40ODI3CitMYWtlIAk6CTM5CToJMjUzNS4yNzMzCitMYXdyZW5jZSAJOgkzOQk6CTExODQuMzU1MgorTGlja2luZyAJOgkzOQk6CTE3ODIuOTA0MgorTG9nYW4gCToJMzkJOgkxMjA4Ljk2MDIKK0xvcmFpbiAJOgkzOQk6CTIzOTAuNjIxOAorTHVjYXMgCToJMzkJOgkxNTQzLjMyOTIKK01hZGlzb24gCToJMzkJOgkxMjA3LjQwNjIKK01haG9uaW5nIAk6CTM5CToJMTA5Ni41NTQyCitNYXJpb24gCToJMzkJOgkxMDQ2Ljc0ODUKK01lZGluYSAJOgkzOQk6CTEwOTUuODU0OQorTWVpZ3MgCToJMzkJOgkxMTE5Ljg2NDIKK01lcmNlciAJOgkzOQk6CTEyMjUuODIxMQorTWlhbWkgCToJMzkJOgkxMDU5Ljg3OTgKK01vbnJvZSAJOgkzOQk6CTExODQuODIxNAorTW9udGdvbWVyeSAJOgkzOQk6CTEyMDIuNjQwNgorTW9yZ2FuIAk6CTM5CToJMTA5Mi42MTc0CitNb3Jyb3cgCToJMzkJOgkxMDU1LjA2MjQKK011c2tpbmd1bSAJOgkzOQk6CTE3NDIuMDA4MQorTm9ibGUgCToJMzkJOgkxMDQ3Ljg4ODEKK090dGF3YSAJOgkzOQk6CTE1MTUuNDYwOAorUGF1bGRpbmcgCToJMzkJOgkxMDg0Ljk1MQorUGVycnkgCToJMzkJOgkxMDY4LjYwODEKK1BpY2thd2F5IAk6CTM5CToJMTMxMi41ODYxCitQaWtlIAk6CTM5CToJMTE0OS44MDQ2CitQb3J0YWdlIAk6CTM5CToJMTMxMy40MTQ5CitQcmVibGUgCToJMzkJOgkxMTA0LjE5NDcKK1B1dG5hbSAJOgkzOQk6CTEyNTQuMTU1NworUmljaGxhbmQgCToJMzkJOgkxMjk1Ljg1NDcKK1Jvc3MgCToJMzkJOgkxNzk0Ljc2NjQKK1NhbmR1c2t5IAk6CTM5CToJMTA4Mi4wMjQzCitTY2lvdG8gCToJMzkJOgkxNTk1LjYyMTMKK1NlbmVjYSAJOgkzOQk6CTE0MzAuNjM4MworU2hlbGJ5IAk6CTM5CToJMTA2NC41Njc3CitTdGFyayAJOgkzOQk6CTE1MDQuNTU2OQorU3VtbWl0IAk6CTM5CToJMTA4Ny45NTU0CitUcnVtYnVsbCAJOgkzOQk6CTE2NDMuOTI0OAorVHVzY2FyYXdhcyAJOgkzOQk6CTE0ODAuMTMzMgorVW5pb24gCToJMzkJOgkxMTMxLjc3ODIKK1ZhbiBXZXJ0IAk6CTM5CToJMTA2My4xNjkxCitWaW50b24gCToJMzkJOgkxMDc0Ljc0NjQKK1dhcnJlbiAJOgkzOQk6CTEwNTQuNDkyNgorV2FzaGluZ3RvbiAJOgkzOQk6CTE2NTcuOTg4NQorV2F5bmUgCToJMzkJOgkxNDQwLjg0MjkKK1dpbGxpYW1zIAk6CTM5CToJMTA5NS42OTk1CitXb29kIAk6CTM5CToJMTYwNy4xOTg2CitXeWFuZG90IAk6CTM5CToJMTA1NS43MzU4CitBZGFpciAJOgk0MAk6CTE0OTQuNTA3NworQWxmYWxmYSAJOgk0MAk6CTIyODIuOTI5NgorQXRva2EgCToJNDAJOgkyNTY0LjEKK0JlYXZlciAJOgk0MAk6CTQ3MDcuNTMyMgorQmVja2hhbSAJOgk0MAk6CTIzNDEuNzIyNgorQmxhaW5lIAk6CTQwCToJMjQzMS42OTkyCitCcnlhbiAJOgk0MAk6CTI0NDMuNDgzNworQ2FkZG8gCToJNDAJOgkzMzQxLjkwMjkKK0NhbmFkaWFuIAk6CTQwCToJMjM0NC4zOTAzCitDYXJ0ZXIgCToJNDAJOgkyMTU5LjMzNDgKK0NoZXJva2VlIAk6CTQwCToJMjAxMC44NzYKK0Nob2N0YXcgCToJNDAJOgkyMDczLjc2MTIKK0NpbWFycm9uIAk6CTQwCToJNDc2OC42MzAzCitDbGV2ZWxhbmQgCToJNDAJOgkxNDQ2LjEwMDYKK0NvYWwgCToJNDAJOgkxMzUwLjE2NworQ29tYW5jaGUgCToJNDAJOgkyODA3LjA5MzgKK0NvdHRvbiAJOgk0MAk6CTE2NjIuNjI0NgorQ3JhaWcgCToJNDAJOgkxOTc1LjQxODkKK0NyZWVrIAk6CTQwCToJMjUxMS43MDQzCitDdXN0ZXIgCToJNDAJOgkyNTk1LjE4CitEZWxhd2FyZSAJOgk0MAk6CTIwNTIuMTM0NworRGV3ZXkgCToJNDAJOgkyNjExLjM5MzQKK0VsbGlzIAk6CTQwCToJMzE5MC40NjU2CitHYXJmaWVsZCAJOgk0MAk6CTI3NDUuMjQ0NgorR2FydmluIAk6CTQwCToJMjEwNy4zNzk0CitHcmFkeSAJOgk0MAk6CTI4NjIuNzI3CitHcmFudCAJOgk0MAk6CTI1OTkuMzQ5OQorR3JlZXIgCToJNDAJOgkxNjY3LjA3OTQKK0hhcm1vbiAJOgk0MAk6CTEzOTQuODcwNAorSGFycGVyIAk6CTQwCToJMjY5Ni4wODY0CitIYXNrZWxsIAk6CTQwCToJMTYxOS40NDkzCitIdWdoZXMgCToJNDAJOgkyMTA5LjkxNzYKK0phY2tzb24gCToJNDAJOgkyMDgyLjc0ODUKK0plZmZlcnNvbiAJOgk0MAk6CTIwMDQuMjE5NworSm9obnN0b24gCToJNDAJOgkxNzA0Ljk3MTEKK0theSAJOgk0MAk6CTI0NDcuODYwOAorS2luZ2Zpc2hlciAJOgk0MAk6CTIzNDYuNDM2NAorS2lvd2EgCToJNDAJOgkyNjY5LjQwOTQKK0xhdGltZXIgCToJNDAJOgkxODg4LjQyMDgKK0xlIEZsb3JlIAk6CTQwCToJNDE2NC43OTc3CitMaW5jb2xuIAk6CTQwCToJMjUwMC45NTU4CitMb2dhbiAJOgk0MAk6CTE5MzkuNzAyOAorTG92ZSAJOgk0MAk6CTEzNzcuNzI0NgorTWNDbGFpbiAJOgk0MAk6CTE1MDIuNTM2NworTWNDdXJ0YWluIAk6CTQwCToJNDkyNC40MTg4CitNY0ludG9zaCAJOgk0MAk6CTE4NDUuMzIzMgorTWFqb3IgCToJNDAJOgkyNDgwLjg4MzMKK01hcnNoYWxsIAk6CTQwCToJMTEwNS44MDA1CitNYXllcyAJOgk0MAk6CTE3NzAuMjkwOQorTXVycmF5IAk6CTQwCToJMTEwMC41NDI4CitNdXNrb2dlZSAJOgk0MAk6CTIxNzIuOTg0MQorTm9ibGUgCToJNDAJOgkxOTIyLjkxOTYKK05vd2F0YSAJOgk0MAk6CTE1MDQuNDUzMworT2tmdXNrZWUgCToJNDAJOgkxNjI4Ljg3NjkKK09rbGFob21hIAk6CTQwCToJMTg2MC40MjI5CitPa211bGdlZSAJOgk0MAk6CTE4MTkuMDA4OAorT3NhZ2UgCToJNDAJOgk1OTY2Ljg0MgorT3R0YXdhIAk6CTQwCToJMTI1NS40NTA3CitQYXduZWUgCToJNDAJOgkxNTQwLjcxMzMKK1BheW5lIAk6CTQwCToJMTgwNS41NjY3CitQaXR0c2J1cmcgCToJNDAJOgkzNTY4LjYzMTUKK1BvbnRvdG9jIAk6CTQwCToJMTg3OC45MTU1CitQb3R0YXdhdG9taWUgCToJNDAJOgkyMDU0LjU0MzQKK1B1c2htYXRhaGEgCToJNDAJOgkzNjg1LjAwMDIKK1JvZ2VyIE1pbGxzIAk6CTQwCToJMjk2OS4zMzE0CitSb2dlcnMgCToJNDAJOgkxODQyLjYyOTYKK1NlbWlub2xlIAk6CTQwCToJMTY1OS4wNzYzCitTZXF1b3lhaCAJOgk0MAk6CTE4NTEuNTM5MgorU3RlcGhlbnMgCToJNDAJOgkyMzA4LjAwMDgKK1RleGFzIAk6CTQwCToJNTMwNi40MTc5CitUaWxsbWFuIAk6CTQwCToJMjI3Ny4xNTM5CitUdWxzYSAJOgk0MAk6CTE1MjAuMzgxOAorV2Fnb25lciAJOgk0MAk6CTE1MzAuNjY0MQorV2FzaGluZ3RvbiAJOgk0MAk6CTEwOTguNTQ4NQorV2FzaGl0YSAJOgk0MAk6CTI2MTMuNDkxMworV29vZHMgCToJNDAJOgkzMzQxLjI4MTMKK1dvb2R3YXJkIAk6CTQwCToJMzIyNy4xNjU5CitCYWtlciAJOgk0MQk6CTc5OTkuMDMzNworQmVudG9uIAk6CTQxCToJMTc1OC41MzIzCitDbGFja2FtYXMgCToJNDEJOgk0ODY2LjYzNTkKK0NsYXRzb3AgCToJNDEJOgkyODA5LjUwMjUKK0NvbHVtYmlhIAk6CTQxCToJMTc4Mi43NzQ3CitDb29zIAk6CTQxCToJNDY3OC41MjQyCitDcm9vayAJOgk0MQk6CTc3MzcuMzkxOQorQ3VycnkgCToJNDEJOgk1MTUwLjM5NjMKK0Rlc2NodXRlcyAJOgk0MQk6CTc5MTEuODU0MworRG91Z2xhcyAJOgk0MQk6CTEzMjk2LjYxOTcKK0dpbGxpYW0gCToJNDEJOgkzMTY3LjE1NTYKK0dyYW50IAk6CTQxCToJMTE3MzAuOTM4OAorSGFybmV5IAk6CTQxCToJMjY0ODYuNjA5MQorSG9vZCBSaXZlciAJOgk0MQk6CTEzODEuOTIwNAorSmFja3NvbiAJOgk0MQk6CTcyNTYuNTg0MworSmVmZmVyc29uIAk6CTQxCToJNDYzOS4xMzAzCitKb3NlcGhpbmUgCToJNDEJOgk0MjUxLjgyMTcKK0tsYW1hdGggCToJNDEJOgkxNTg5MS41OTI1CitMYWtlIAk6CTQxCToJMjE2NDguNDM3MworTGFuZSAJOgk0MQk6CTEyMjI5LjQzNjEKK0xpbmNvbG4gCToJNDEJOgkzMDkxLjkxNjEKK0xpbm4gCToJNDEJOgk1OTgzLjI4ODUKK01hbGhldXIgCToJNDEJOgkyNTcxOC42NzQxCitNYXJpb24gCToJNDEJOgkzMDkyLjc5NjcKK01vcnJvdyAJOgk0MQk6CTUzMDUuNjkyNworTXVsdG5vbWFoIAk6CTQxCToJMTIwNi4wMzM1CitQb2xrIAk6CTQxCToJMTkyNy4zNDg1CitTaGVybWFuIAk6CTQxCToJMjE1Mi44MDgKK1RpbGxhbW9vayAJOgk0MQk6CTM0NTEuOTAwMgorVW1hdGlsbGEgCToJNDEJOgk4MzY4LjkzNzUKK1VuaW9uIAk6CTQxCToJNTI3OS44NDQ1CitXYWxsb3dhIAk6CTQxCToJODE2Mi44NzcxCitXYXNjbyAJOgk0MQk6CTYyMDMuODc4OAorV2FzaGluZ3RvbiAJOgk0MQk6CTE4ODEuMzI0MgorV2hlZWxlciAJOgk0MQk6CTQ0NDMuMDQxNAorWWFtaGlsbCAJOgk0MQk6CTE4NjAuNTUyNAorQWRhbXMgCToJNDIJOgkxMzUwLjczNjgKK0FsbGVnaGVueSAJOgk0Mgk6CTE5MjguNzk4OQorQXJtc3Ryb25nIAk6CTQyCToJMTcyMC44OTk2CitCZWF2ZXIgCToJNDIJOgkxMTQ5LjcwMQorQmVkZm9yZCAJOgk0Mgk6CTI2MzUuMDY2CitCZXJrcyAJOgk0Mgk6CTIyNDIuMDg1MworQmxhaXIgCToJNDIJOgkxMzY1LjIxNDkKK0JyYWRmb3JkIAk6CTQyCToJMzAwNy4wNjc3CitCdWNrcyAJOgk0Mgk6CTE2MTEuMjY0OQorQnV0bGVyIAk6CTQyCToJMjA1OC41MDYxCitDYW1icmlhIAk6CTQyCToJMTc5NS45ODM3CitDYW1lcm9uIAk6CTQyCToJMTAzMi4zNzQKK0NhcmJvbiAJOgk0Mgk6CTEwMDIuOTI1NworQ2VudHJlIAk6CTQyCToJMjg3OS42OTE1CitDaGVzdGVyIAk6CTQyCToJMTk2Ny45MDc5CitDbGFyaW9uIAk6CTQyCToJMTU3Ny4xODA1CitDbGVhcmZpZWxkIAk6CTQyCToJMjk4OC4zNDIKK0NsaW50b24gCToJNDIJOgkyMzI2LjA1MzEKK0NvbHVtYmlhIAk6CTQyCToJMTI2OC41NTYxCitDcmF3Zm9yZCAJOgk0Mgk6CTI2ODcuNzQ2NgorQ3VtYmVybGFuZCAJOgk0Mgk6CTE0MjcuNDUyNgorRGF1cGhpbiAJOgk0Mgk6CTE0NDQuMDAyNworRGVsYXdhcmUgCToJNDIJOgk0OTQuMDE2NgorRWxrIAk6CTQyCToJMjE1NS40NzU3CitFcmllIAk6CTQyCToJNDAzNi4yNTYKK0ZheWV0dGUgCToJNDIJOgkyMDY2LjgyCitGb3Jlc3QgCToJNDIJOgkxMTE3LjMyNgorRnJhbmtsaW4gCToJNDIJOgkyMDAxLjExMTcKK0Z1bHRvbiAJOgk0Mgk6CTExMzQuNDk3NworR3JlZW5lIAk6CTQyCToJMTQ5Ni44OTA1CitIdW50aW5nZG9uIAk6CTQyCToJMjMwMi41ODc3CitJbmRpYW5hIAk6CTQyCToJMjE2MC44MTExCitKZWZmZXJzb24gCToJNDIJOgkxNzAxLjI5MzMKK0p1bmlhdGEgCToJNDIJOgkxMDE5LjM0NjMKK0xhY2thd2FubmEgCToJNDIJOgkxMjAzLjA4MDkKK0xhbmNhc3RlciAJOgk0Mgk6CTI1NDguMDY3OQorTGF3cmVuY2UgCToJNDIJOgk5MzkuNTQ4NAorTGViYW5vbiAJOgk0Mgk6CTkzOS4xMzQKK0xlaGlnaCAJOgk0Mgk6CTkwMi4yMDA2CitMdXplcm5lIAk6CTQyCToJMjM0OS40NjY3CitMeWNvbWluZyAJOgk0Mgk6CTMyMjEuMzY0MworTWNLZWFuIAk6CTQyCToJMjU0OS4wMDAzCitNZXJjZXIgCToJNDIJOgkxNzY3Ljg1NjMKK01pZmZsaW4gCToJNDIJOgkxMDczLjgxNAorTW9ucm9lIAk6CTQyCToJMTU5OS4xMTc4CitNb250Z29tZXJ5IAk6CTQyCToJMTI2Mi40OTU1CitNb250b3VyIAk6CTQyCToJMzQyLjY1NworTm9ydGhhbXB0b24gCToJNDIJOgk5NzcuMzYyNAorTm9ydGh1bWJlcmxhbmQgCToJNDIJOgkxMjM2LjQxNDIKK1BlcnJ5IAk6CTQyCToJMTQzOS40NDQzCitQaGlsYWRlbHBoaWEgCToJNDIJOgkzNjkuNDM3NgorUGlrZSAJOgk0Mgk6CTE0NjcuNTk3NgorUG90dGVyIAk6CTQyCToJMjgwMC44Nzc4CitTY2h1eWxraWxsIAk6CTQyCToJMjAyNi45NTk5CitTbnlkZXIgCToJNDIJOgk4NjAuMjk0NAorU29tZXJzZXQgCToJNDIJOgkyODAwLjIzMDMKK1N1bGxpdmFuIAk6CTQyCToJMTE3MS41ODY1CitTdXNxdWVoYW5uYSAJOgk0Mgk6CTIxNTUuOTE2CitUaW9nYSAJOgk0Mgk6CTI5NDUuNjA3CitVbmlvbiAJOgk0Mgk6CTgyMS4zNDA4CitWZW5hbmdvIAk6CTQyCToJMTc2OS4wMjE4CitXYXJyZW4gCToJNDIJOgkyMzI1LjMyNzkKK1dhc2hpbmd0b24gCToJNDIJOgkyMjI5Ljg2MDUKK1dheW5lIAk6CTQyCToJMTk0My44OTg2CitXZXN0bW9yZWxhbmQgCToJNDIJOgkyNjg0LjEyMDYKK1d5b21pbmcgCToJNDIJOgkxMDQ4LjQwNjEKK1lvcmsgCToJNDIJOgkyMzU3LjU0NzUKK0JyaXN0b2wgCToJNDQJOgkxMTUuNzk4OQorS2VudCAJOgk0NAk6CTQ4Ny4xNzkKK05ld3BvcnQgCToJNDQJOgk4MTIuMzI3NgorUHJvdmlkZW5jZSAJOgk0NAk6CTExMjguNzczOAorV2FzaGluZ3RvbiAJOgk0NAk6CTE0NTcuNTc0MworQWJiZXZpbGxlIAk6CTQ1CToJMTMyMy42MTk1CitBaWtlbiAJOgk0NQk6CTI3OTguMzkxNAorQWxsZW5kYWxlIAk6CTQ1CToJMTA2OC41ODIyCitBbmRlcnNvbiAJOgk0NQk6CTE5NjEuNzk1NQorQmFtYmVyZyAJOgk0NQk6CTEwMjQuMjY3MworQmFybndlbGwgCToJNDUJOgkxNDQzLjI3NzUKK0JlYXVmb3J0IAk6CTQ1CToJMjM5MC4yNTkyCitCZXJrZWxleSAJOgk0NQk6CTMxODAuNzAxMworQ2FsaG91biAJOgk0NQk6CTEwMTYuMTYwNgorQ2hhcmxlc3RvbiAJOgk0NQk6CTM1MTcuNTA0OQorQ2hlcm9rZWUgCToJNDUJOgkxMDI4Ljk1NTIKK0NoZXN0ZXIgCToJNDUJOgkxNTE4LjE1NDQKK0NoZXN0ZXJmaWVsZCAJOgk0NQk6CTIwODYuOTcwMgorQ2xhcmVuZG9uIAk6CTQ1CToJMTgwMS43NTk0CitDb2xsZXRvbiAJOgk0NQk6CTI5MzUuMDEzOQorRGFybGluZ3RvbiAJOgk0NQk6CTE0NjcuOTYwMgorRGlsbG9uIAk6CTQ1CToJMTA1Mi45Mzg2CitEb3JjaGVzdGVyIAk6CTQ1CToJMTQ5My42MjcxCitFZGdlZmllbGQgCToJNDUJOgkxMzExLjkzODYKK0ZhaXJmaWVsZCAJOgk0NQk6CTE4MzguNzE4NworRmxvcmVuY2UgCToJNDUJOgkyMDgxLjY4NjYKK0dlb3JnZXRvd24gCToJNDUJOgkyNjgwLjY1CitHcmVlbnZpbGxlIAk6CTQ1CToJMjA1OC45NDY0CitHcmVlbndvb2QgCToJNDUJOgkxMTk5LjAxNDYKK0hhbXB0b24gCToJNDUJOgkxNDU3LjIxMTcKK0hvcnJ5IAk6CTQ1CToJMzI1MC4zNDY0CitKYXNwZXIgCToJNDUJOgkxODEyLjQ1NjEKK0tlcnNoYXcgCToJNDUJOgkxOTE3LjI0NzUKK0xhbmNhc3RlciAJOgk0NQk6CTE0MzguMjAxMQorTGF1cmVucyAJOgk0NQk6CTE4NzUuMTA4MgorTGVlIAk6CTQ1CToJMTA2NS4yNjcKK0xleGluZ3RvbiAJOgk0NQk6CTE5NjIuOTA5MgorTWNDb3JtaWNrIAk6CTQ1CToJMTAyMC4wNzE1CitNYXJpb24gCToJNDUJOgkxMjc5LjY5MzEKK01hcmxib3JvIAk6CTQ1CToJMTI1Ni44NzUyCitOZXdiZXJyeSAJOgk0NQk6CTE2NzYuNDU1MgorT2NvbmVlIAk6CTQ1CToJMTc0NC41NzIyCitPcmFuZ2VidXJnIAk6CTQ1CToJMjkyMS43NTMxCitQaWNrZW5zIAk6CTQ1CToJMTMyNS42OTE1CitSaWNobGFuZCAJOgk0NQk6CTE5OTguNzU0OAorU2FsdWRhIAk6CTQ1CToJMTE5Ni4wMTAyCitTcGFydGFuYnVyZyAJOgk0NQk6CTIxMjEuNTcyNgorU3VtdGVyIAk6CTQ1CToJMTc2Ni40NTc3CitVbmlvbiAJOgk0NQk6CTEzMzYuMjMyOAorV2lsbGlhbXNidXJnIAk6CTQ1CToJMjQyNi42MjI4CitZb3JrIAk6CTQ1CToJMTgwMS45MTQ4CitBdXJvcmEgCToJNDYJOgkxODQ1LjQ1MjcKK0JlYWRsZSAJOgk0Ngk6CTMyNzUuODgzOAorQmVubmV0dCAJOgk0Ngk6CTMwODMuNjI4MQorQm9uIEhvbW1lIAk6CTQ2CToJMTUwNS42MTg4CitCcm9va2luZ3MgCToJNDYJOgkyMDg0LjMyODQKK0Jyb3duIAk6CTQ2CToJNDQ4My44MzM5CitCcnVsZSAJOgk0Ngk6CTIxOTIuNDA5MQorQnVmZmFsbyAJOgk0Ngk6CTEyNjIuNDQzNworQnV0dGUgCToJNDYJOgk1ODY5Ljg3MjQKK0NhbXBiZWxsIAk6CTQ2CToJMTk5Ny43NzA2CitDaGFybGVzIE1peCAJOgk0Ngk6CTI5NzguOTkyMQorQ2xhcmsgCToJNDYJOgkyNTA2LjU3NjEKK0NsYXkgCToJNDYJOgkxMDc5LjI1MworQ29kaW5ndG9uIAk6CTQ2CToJMTg1Ny4yMzcyCitDb3Jzb24gCToJNDYJOgk2NTUxLjE5NzgKK0N1c3RlciAJOgk0Ngk6CTQwMzguMTcyNgorRGF2aXNvbiAJOgk0Ngk6CTExMzEuMjYwMgorRGF5IAk6CTQ2CToJMjgyNi4yMzM5CitEZXVlbCAJOgk0Ngk6CTE2NDkuMTA0OAorRGV3ZXkgCToJNDYJOgk2MzM0LjI4NTMKK0RvdWdsYXMgCToJNDYJOgkxMTI0LjM5NjcKK0VkbXVuZHMgCToJNDYJOgkyOTgxLjUwNDQKK0ZhbGwgUml2ZXIgCToJNDYJOgk0NTMwLjI3MjYKK0ZhdWxrIAk6CTQ2CToJMjYwNC43MzcxCitHcmFudCAJOgk0Ngk6CTE3ODEuNjg2OQorR3JlZ29yeSAJOgk0Ngk6CTI3MjguNDM1NQorSGFha29uIAk6CTQ2CToJNDczMi40OTk4CitIYW1saW4gCToJNDYJOgkxMzkzLjMxNjQKK0hhbmQgCToJNDYJOgkzNzMwLjE0MzkKK0hhbnNvbiAJOgk0Ngk6CTExMjguMzA3NgorSGFyZGluZyAJOgk0Ngk6CTY5MzQuOTMyMgorSHVnaGVzIAk6CTQ2CToJMjA3Mi43NTExCitIdXRjaGluc29uIAk6CTQ2CToJMjEwOS4yMTgzCitIeWRlIAk6CTQ2CToJMjI0NC40NjgxCitKYWNrc29uIAk6CTQ2CToJNDg0Ni41MTE2CitKZXJhdWxkIAk6CTQ2CToJMTM3OS41MTE3CitKb25lcyAJOgk0Ngk6CTI1MTYuNTk5NAorS2luZ3NidXJ5IAk6CTQ2CToJMjIzNi45MDUzCitMYWtlIAk6CTQ2CToJMTQ4OS40MDU0CitMYXdyZW5jZSAJOgk0Ngk6CTIwNzIuODAyOQorTGluY29sbiAJOgk0Ngk6CTE0OTguNTQ4MQorTHltYW4gCToJNDYJOgk0NDIxLjI4NTQKK01jQ29vayAJOgk0Ngk6CTE0OTQuODQ0NAorTWNQaGVyc29uIAk6CTQ2CToJMjk4My4yOTE1CitNYXJzaGFsbCAJOgk0Ngk6CTIyOTMuNzgxNworTWVhZGUgCToJNDYJOgk5MDE5LjU3MTQKK01lbGxldHRlIAk6CTQ2CToJMzM5Mi4yNTI1CitNaW5lciAJOgk0Ngk6CTE0ODEuNDU0MQorTWlubmVoYWhhIAk6CTQ2CToJMjEwNy40NTcxCitNb29keSAJOgk0Ngk6CTEzNDkuNjQ5CitQZW5uaW5ndG9uIAk6CTQ2CToJNzIxMS4zNjI5CitQZXJraW5zIAk6CTQ2CToJNzQ4Ni45Mzg5CitQb3R0ZXIgCToJNDYJOgkyMzI2LjkzMzcKK1JvYmVydHMgCToJNDYJOgkyOTQwLjU1NjUKK1NhbmJvcm4gCToJNDYJOgkxNDc2Ljg0MzkKK1NoYW5ub24gCToJNDYJOgk1NDMwLjMyMzUKK1NwaW5rIAk6CTQ2CToJMzkxMS4wMjk1CitTdGFubGV5IAk6CTQ2CToJMzkyOS4wMDQxCitTdWxseSAJOgk0Ngk6CTI3NzIuMjMyNAorVG9kZCAJOgk0Ngk6CTM2MDIuNDMxCitUcmlwcCAJOgk0Ngk6CTQxODkuMDY2CitUdXJuZXIgCToJNDYJOgkxNTk5LjE5NTUKK1VuaW9uIAk6CTQ2CToJMTIwOS43MzcyCitXYWx3b3J0aCAJOgk0Ngk6CTE5MjcuNTI5OAorWWFua3RvbiAJOgk0Ngk6CTEzNzkuNDg1OAorWmllYmFjaCAJOgk0Ngk6CTUxMDUuMDE5NQorQW5kZXJzb24gCToJNDcJOgk4OTMuMDgzOAorQmVkZm9yZCAJOgk0Nwk6CTEyMjkuODA5NworQmVudG9uIAk6CTQ3CToJMTEyOS43NTgKK0JsZWRzb2UgCToJNDcJOgkxMDUzLjM3ODkKK0Jsb3VudCAJOgk0Nwk6CTE0NjcuNjIzNQorQnJhZGxleSAJOgk0Nwk6CTg1OC41ODUKK0NhbXBiZWxsIAk6CTQ3CToJMTI5MC40Njc1CitDYW5ub24gCToJNDcJOgk2ODguMTg4OQorQ2Fycm9sbCAJOgk0Nwk6CTE1NTMuNjM3NAorQ2FydGVyIAk6CTQ3CToJOTAwLjMzNTgKK0NoZWF0aGFtIAk6CTQ3CToJNzk1LjQ2NjcKK0NoZXN0ZXIgCToJNDcJOgk3NDcuODM2NgorQ2xhaWJvcm5lIAk6CTQ3CToJMTE0My42MTQ1CitDbGF5IAk6CTQ3CToJNjcxLjQ1NzUKK0NvY2tlIAk6CTQ3CToJMTE0Ny43NTg1CitDb2ZmZWUgCToJNDcJOgkxMTI1LjI1MTQKK0Nyb2NrZXR0IAk6CTQ3CToJNjg3LjU2NzMKK0N1bWJlcmxhbmQgCToJNDcJOgkxNzc0LjAyMDUKK0Rhdmlkc29uIAk6CTQ3CToJMTM2Mi42MjQ5CitEZWNhdHVyIAk6CTQ3CToJODkzLjMxNjkKK0RlS2FsYiAJOgk0Nwk6CTg1Mi4wNTgyCitEaWNrc29uIAk6CTQ3CToJMTI3Mi40MTUyCitEeWVyIAk6CTQ3CToJMTM2My41ODMyCitGYXlldHRlIAk6CTQ3CToJMTgyOS4xMzU3CitGZW50cmVzcyAJOgk0Nwk6CTEyOTIuMzMyMworRnJhbmtsaW4gCToJNDcJOgkxNDkxLjI0NDMKK0dpYnNvbiAJOgk0Nwk6CTE1NjMuMjk4MQorR2lsZXMgCToJNDcJOgkxNTgyLjkzMDMKK0dyYWluZ2VyIAk6CTQ3CToJNzgzLjMxOTYKK0dyZWVuZSAJOgk0Nwk6CTE2MTYuNDQ0OQorR3J1bmR5IAk6CTQ3CToJOTM1LjM1MjYKK0hhbWJsZW4gCToJNDcJOgk0NTUuMjQ0MworSGFtaWx0b24gCToJNDcJOgkxNDkxLjExNDgKK0hhbmNvY2sgCToJNDcJOgk1NzguODY1CitIYXJkZW1hbiAJOgk0Nwk6CTE3MzYuMzEwMQorSGFyZGluIAk6CTQ3CToJMTU0NC40NDI5CitIYXdraW5zIAk6CTQ3CToJMTI5NC4wNDE3CitIYXl3b29kIAk6CTQ3CToJMTM4My40NDg1CitIZW5kZXJzb24gCToJNDcJOgkxMzYyLjEwNjkKK0hlbnJ5IAk6CTQ3CToJMTUzNy4wMzU1CitIaWNrbWFuIAk6CTQ3CToJMTU4Ni44OTMKK0hvdXN0b24gCToJNDcJOgk1MzUuOTIyOAorSHVtcGhyZXlzIAk6CTQ3CToJMTQ0MS45MDQ4CitKYWNrc29uIAk6CTQ3CToJODI3LjY2MDQKK0plZmZlcnNvbiAJOgk0Nwk6CTgxNC4xMTQ3CitKb2huc29uIAk6CTQ3CToJNzg0LjA3MDcKK0tub3ggCToJNDcJOgkxMzYxLjc3MDIKK0xha2UgCToJNDcJOgk1MDEuOTE2MQorTGF1ZGVyZGFsZSAJOgk0Nwk6CTEzMTMuNDkyNgorTGF3cmVuY2UgCToJNDcJOgkxNjAwLjM4NjkKK0xld2lzIAk6CTQ3CToJNzMxLjYyMzIKK0xpbmNvbG4gCToJNDcJOgkxNDc3LjkzMTcKK0xvdWRvbiAJOgk0Nwk6CTY0MC41MzI5CitNY01pbm4gCToJNDcJOgkxMTE5LjQ0OTgKK01jTmFpcnkgCToJNDcJOgkxNDUyLjU3NTYKK01hY29uIAk6CTQ3CToJNzk1LjYyMjEKK01hZGlzb24gCToJNDcJOgkxNDQ2Ljg1MTcKK01hcmlvbiAJOgk0Nwk6CTEzMjYuOTA4OAorTWFyc2hhbGwgCToJNDcJOgk5NzQuMDk5CitNYXVyeSAJOgk0Nwk6CTE1OTQuMTk2OAorTWVpZ3MgCToJNDcJOgk1NjEuNDYwMgorTW9ucm9lIAk6CTQ3CToJMTY5MC4xODIyCitNb250Z29tZXJ5IAk6CTQ3CToJMTQwOC41NDU2CitNb29yZSAJOgk0Nwk6CTMzNy42ODQyCitNb3JnYW4gCToJNDcJOgkxMzUzLjAxNgorT2Jpb24gCToJNDcJOgkxNDM4LjM1NjUKK092ZXJ0b24gCToJNDcJOgkxMTI2LjE4MzgKK1BlcnJ5IAk6CTQ3CToJMTA5NS4zMTEKK1BpY2tldHQgCToJNDcJOgk0NTIuMTYyMgorUG9sayAJOgk0Nwk6CTExNDUuNjg2NQorUHV0bmFtIAk6CTQ3CToJMTA0Mi42MzA0CitSaGVhIAk6CTQ3CToJODcxLjI1MDEKK1JvYW5lIAk6CTQ3CToJMTAyMi45OTgyCitSb2JlcnRzb24gCToJNDcJOgkxMjM0LjU3NTMKK1J1dGhlcmZvcmQgCToJNDcJOgkxNjE2LjAwNDYKK1Njb3R0IAk6CTQ3CToJMTM4MS4wMzk4CitTZXF1YXRjaGllIAk6CTQ3CToJNjg4Ljk5MTgKK1NldmllciAJOgk0Nwk6CTE1NDguMTIwNworU2hlbGJ5IAk6CTQ3CToJMjAyOS42MDE3CitTbWl0aCAJOgk0Nwk6CTg0Mi42NTY1CitTdGV3YXJ0IAk6CTQ3CToJMTI3Ny4zODgKK1N1bGxpdmFuIAk6CTQ3CToJMTExMi44OTcxCitTdW1uZXIgCToJNDcJOgkxNDA2LjY4MDgKK1RpcHRvbiAJOgk0Nwk6CTEyMjkuNTI0OAorVHJvdXNkYWxlIAk6CTQ3CToJMzAyLjA5NzYKK1VuaWNvaSAJOgk0Nwk6CTQ4My4wMDkxCitVbmlvbiAJOgk0Nwk6CTY0MC4wNjY3CitWYW4gQnVyZW4gCToJNDcJOgk3MTEuMTg4MQorV2FycmVuIAk6CTQ3CToJMTEyNC4yNjcyCitXYXNoaW5ndG9uIAk6CTQ3CToJODU0LjE4MgorV2F5bmUgCToJNDcJOgkxOTA1LjE3ODEKK1dlYWtsZXkgCToJNDcJOgkxNTA2Ljg4NzkKK1doaXRlIAk6CTQ3CToJOTgyLjYyMDEKK1dpbGxpYW1zb24gCToJNDcJOgkxNTExLjU3NTgKK1dpbHNvbiAJOgk0Nwk6CTE1MTAuNDg4CitBbmRlcnNvbiAJOgk0OAk6CTI3OTEuODkwNQorQW5kcmV3cyAJOgk0OAk6CTM4ODcuNTY0MQorQW5nZWxpbmEgCToJNDgJOgkyMjM4LjkyNTUKK0FyYW5zYXMgCToJNDgJOgkxMzY3LjM5MDUKK0FyY2hlciAJOgk0OAk6CTIzOTcuNzcwMgorQXJtc3Ryb25nIAk6CTQ4CToJMjM2Ni43Njc5CitBdGFzY29zYSAJOgk0OAk6CTMyMDAuMjI5OQorQXVzdGluIAk6CTQ4CToJMTY5OS45OTgzCitCYWlsZXkgCToJNDgJOgkyMTQyLjkxNDIKK0JhbmRlcmEgCToJNDgJOgkyMDY1LjYyODYKK0Jhc3Ryb3AgCToJNDgJOgkyMzIwLjQzMjgKK0JheWxvciAJOgk0OAk6CTIzMzMuNjE1OQorQmVlIAk6CTQ4CToJMjI4MC4wMDI5CitCZWxsIAk6CTQ4CToJMjgxNy43Mzg3CitCZXhhciAJOgk0OAk6CTMyNTQuNzQ5NAorQmxhbmNvIAk6CTQ4CToJMTg0Ny43MzE5CitCb3JkZW4gCToJNDgJOgkyMzQ2LjY0MzYKK0Jvc3F1ZSAJOgk0OAk6CTI1OTYuODExNworQm93aWUgCToJNDgJOgkyMzg5Ljk3NDMKK0JyYXpvcmlhIAk6CTQ4CToJNDEzNy4zNjk2CitCcmF6b3MgCToJNDgJOgkxNTI4Ljg1MTEKK0JyZXdzdGVyIAk6CTQ4CToJMTYwMzkuMzAwMgorQnJpc2NvZSAJOgk0OAk6CTIzMzUuMTE4MQorQnJvb2tzIAk6CTQ4CToJMjQ0My45NDk5CitCcm93biAJOgk0OAk6CTI0NzguNDc0NgorQnVybGVzb24gCToJNDgJOgkxNzU1LjQ1MDIKK0J1cm5ldCAJOgk0OAk6CTI2NDQuMjg2NAorQ2FsZHdlbGwgCToJNDgJOgkxNDE3Ljc5MTkKK0NhbGhvdW4gCToJNDgJOgkyNjczLjI5NDQKK0NhbGxhaGFuIAk6CTQ4CToJMjMzNC4yNjM0CitDYW1lcm9uIAk6CTQ4CToJMzMwNS42OTQ3CitDYW1wIAk6CTQ4CToJNTI2LjI4OAorQ2Fyc29uIAk6CTQ4CToJMjM5My40MTkKK0Nhc3MgCToJNDgJOgkyNDg3LjMwNjUKK0Nhc3RybyAJOgk0OAk6CTIzMjkuMjM4OAorQ2hhbWJlcnMgCToJNDgJOgkyMjU4LjQ1NDEKK0NoZXJva2VlIAk6CTQ4CToJMjc1MC4zOTg3CitDaGlsZHJlc3MgCToJNDgJOgkxODQ4LjI0OTkKK0NsYXkgCToJNDgJOgkyODkwLjg4MDMKK0NvY2hyYW4gCToJNDgJOgkyMDA4LjA1MjkKK0Nva2UgCToJNDgJOgkyNDAzLjQ0MjMKK0NvbGVtYW4gCToJNDgJOgkzMzE4Ljk1NTUKK0NvbGxpbiAJOgk0OAk6CTIyOTQuMzUxNQorQ29sbGluZ3N3b3J0aCAJOgk0OAk6CTIzODEuMzQ5NgorQ29sb3JhZG8gCToJNDgJOgkyNTIxLjU5ODEKK0NvbWFsIAk6CTQ4CToJMTQ4OC4xODgxCitDb21hbmNoZSAJOgk0OAk6CTI0NTQuNDY1MworQ29uY2hvIAk6CTQ4CToJMjU3My42NTcxCitDb29rZSAJOgk0OAk6CTIzMjcuOTE3OQorQ29yeWVsbCAJOgk0OAk6CTI3MzYuOTMwNworQ290dGxlIAk6CTQ4CToJMjMzNS4xMTgxCitDcmFuZSAJOgk0OAk6CTIwMzQuNjc4MQorQ3JvY2tldHQgCToJNDgJOgk3MjcxLjI0MzcKK0Nyb3NieSAJOgk0OAk6CTIzMzUuMzc3MQorQ3VsYmVyc29uIAk6CTQ4CToJOTg3NC45MTg5CitEYWxsYW0gCToJNDgJOgkzODk4LjYyMzQKK0RhbGxhcyAJOgk0OAk6CTIzNTMuMTcwNAorRGF3c29uIAk6CTQ4CToJMjMzNi40OTA4CitEZWFmIFNtaXRoIAk6CTQ4CToJMzg4MC40OTM0CitEZWx0YSAJOgk0OAk6CTcxOS44MTI4CitEZW50b24gCToJNDgJOgkyNDgwLjkwOTIKK0RlV2l0dCAJOgk0OAk6CTIzNTguMTE3MworRGlja2VucyAJOgk0OAk6CTIzNDQuNDkzOQorRGltbWl0IAk6CTQ4CToJMzQ1Ni4zMDMyCitEb25sZXkgCToJNDgJOgkyNDE2LjU5OTUKK0R1dmFsIAk6CTQ4CToJNDY1MC43ODUzCitFYXN0bGFuZCAJOgk0OAk6CTI0MTMuNjIxCitFY3RvciAJOgk0OAk6CTIzMzUuMzUxMgorRWR3YXJkcyAJOgk0OAk6CTU0OTAuNjcwNQorRWxsaXMgCToJNDgJOgkyNDY0Ljc5OTQKK0VsIFBhc28gCToJNDgJOgkyNjI4LjAyMTIKK0VyYXRoIAk6CTQ4CToJMjgyMi41ODIKK0ZhbGxzIAk6CTQ4CToJMjAwNC4xNjc5CitGYW5uaW4gCToJNDgJOgkyMzI4LjgyNDQKK0ZheWV0dGUgCToJNDgJOgkyNDg1Ljk4NTYKK0Zpc2hlciAJOgk0OAk6CTIzMzUuNTA2NgorRmxveWQgCToJNDgJOgkyNTcwLjYwMDkKK0ZvYXJkIAk6CTQ4CToJMTgzMi45MTcxCitGb3J0IEJlbmQgCToJNDgJOgkyMjk0Ljg2OTUKK0ZyYW5rbGluIAk6CTQ4CToJNzYzLjQ1NDMKK0ZyZWVzdG9uZSAJOgk0OAk6CTIzMTAuNjE2NworRnJpbyAJOgk0OAk6CTI5MzcuNzg1MgorR2FpbmVzIAk6CTQ4CToJMzg5Mi4zNTU2CitHYWx2ZXN0b24gCToJNDgJOgkyMjYwLjg4ODcKK0dhcnphIAk6CTQ4CToJMjMyMS4xMzIxCitHaWxsZXNwaWUgCToJNDgJOgkyNzQ5LjIzMzIKK0dsYXNzY29jayAJOgk0OAk6CTIzMzMuNDA4NworR29saWFkIAk6CTQ4CToJMjIyNS43MTY1CitHb256YWxlcyAJOgk0OAk6CTI3NzAuODMzOAorR3JheSAJOgk0OAk6CTI0MDYuNzU3NQorR3JheXNvbiAJOgk0OAk6CTI1MzYuMTAyMQorR3JlZ2cgCToJNDgJOgk3MTUuNzk4MworR3JpbWVzIAk6CTQ4CToJMjA3NS4wMDQ0CitHdWFkYWx1cGUgCToJNDgJOgkxODQ5LjcwMDMKK0hhbGUgCToJNDgJOgkyNjAyLjM1NDMKK0hhbGwgCToJNDgJOgkyMzQxLjU2NzIKK0hhbWlsdG9uIAk6CTQ4CToJMjE2Ni4yMjQyCitIYW5zZm9yZCAJOgk0OAk6CTIzODMuODM2CitIYXJkZW1hbiAJOgk0OAk6CTE4MDUuMjMKK0hhcmRpbiAJOgk0OAk6CTIzMjQuMTg4MworSGFycmlzIAk6CTQ4CToJNDYwNC4yMTcxCitIYXJyaXNvbiAJOgk0OAk6CTIzNzAuMDgzMQorSGFydGxleSAJOgk0OAk6CTM3ODkuNjg4CitIYXNrZWxsIAk6CTQ4CToJMjM1Ny41NDc1CitIYXlzIAk6CTQ4CToJMTc2MC42NTYxCitIZW1waGlsbCAJOgk0OAk6CTIzNjIuMjM1NAorSGVuZGVyc29uIAk6CTQ4CToJMjQ1Ny45MQorSGlkYWxnbyAJOgk0OAk6CTQwOTkuMDg5NAorSGlsbCAJOgk0OAk6CTI1NTIuODMzNQorSG9ja2xleSAJOgk0OAk6CTIzNTMuMTQ0NQorSG9vZCAJOgk0OAk6CTExMzEuMzEyCitIb3BraW5zIAk6CTQ4CToJMjA1My4xOTY2CitIb3VzdG9uIAk6CTQ4CToJMzIwMy4zODk3CitIb3dhcmQgCToJNDgJOgkyMzQxLjg1MjEKK0h1ZHNwZXRoIAk6CTQ4CToJMTE4NDEuMjk4NworSHVudCAJOgk0OAk6CTIyODQuNDMxOAorSHV0Y2hpbnNvbiAJOgk0OAk6CTIzMTcuOTIwNQorSXJpb24gCToJNDgJOgkyNzIzLjYxODEKK0phY2sgCToJNDgJOgkyMzgzLjA4NDkKK0phY2tzb24gCToJNDgJOgkyMjE5LjcwNzcKK0phc3BlciAJOgk0OAk6CTI1MTEuMzE1OAorSmVmZiBEYXZpcyAJOgk0OAk6CTU4NjUuMzE0CitKZWZmZXJzb24gCToJNDgJOgkyODc4LjE2MzQKK0ppbSBIb2dnIAk6CTQ4CToJMjk0Mi42NTQ0CitKaW0gV2VsbHMgCToJNDgJOgkyMjQ4LjY4OTgKK0pvaG5zb24gCToJNDgJOgkxOTAyLjI1MTQKK0pvbmVzIAk6CTQ4CToJMjQyNy4xNjY3CitLYXJuZXMgCToJNDgJOgkxOTUxLjc3MjIKK0thdWZtYW4gCToJNDgJOgkyMDg5LjYzNzkKK0tlbmRhbGwgCToJNDgJOgkxNzE3LjI3MzYKK0tlbmVkeSAJOgk0OAk6CTUwMzkuMTA0CitLZW50IAk6CTQ4CToJMjMzOC41MzY5CitLZXJyIAk6CTQ4CToJMjg2OC44Mzk0CitLaW1ibGUgCToJNDgJOgkzMjM5Ljg4MjgKK0tpbmcgCToJNDgJOgkyMzY1LjUyNDcKK0tpbm5leSAJOgk0OAk6CTM1MzYuMTUyOQorS2xlYmVyZyAJOgk0OAk6CTI4MjMuODUxMQorS25veCAJOgk0OAk6CTIyMTUuNTYzNworTGFtYXIgCToJNDgJOgkyNDE1LjA5NzMKK0xhbWIgCToJNDgJOgkyNjM1LjkyMDcKK0xhbXBhc2FzIAk6CTQ4CToJMTg0OS4xNTY0CitMYSBTYWxsZSAJOgk0OAk6CTM4NzAuMDU1NworTGF2YWNhIAk6CTQ4CToJMjUxMy4yMDY1CitMZWUgCToJNDgJOgkxNjQyLjEzNzcKK0xlb24gCToJNDgJOgkyNzk4LjE4NDIKK0xpYmVydHkgCToJNDgJOgkzMDQ2LjQwOTgKK0xpbWVzdG9uZSAJOgk0OAk6CTI0MTYuODU4NQorTGlwc2NvbWIgCToJNDgJOgkyNDE0LjQ0OTgKK0xpdmUgT2FrIAk6CTQ4CToJMjc5NC4xNjk3CitMbGFubyAJOgk0OAk6CTI1MDIuNDA2MgorTG92aW5nIAk6CTQ4CToJMTc1My4wNDE1CitMdWJib2NrIAk6CTQ4CToJMjMzMi44MTMKK0x5bm4gCToJNDgJOgkyMzE0LjA2MTQKK01jQ3VsbG9jaCAJOgk0OAk6CTI3NzkuOTc2NQorTWNMZW5uYW4gCToJNDgJOgkyNzQ1Ljk5NTcKK01jTXVsbGVuIAk6CTQ4CToJMjk1OS4zMzQKK01hZGlzb24gCToJNDgJOgkxMjIzLjYxOTYKK01hcmlvbiAJOgk0OAk6CTEwODguNzMyNAorTWFydGluIAk6CTQ4CToJMjM3MS40NTU4CitNYXNvbiAJOgk0OAk6CTI0MTQuMzQ2MgorTWF0YWdvcmRhIAk6CTQ4CToJNDE3NS41NzIxCitNYXZlcmljayAJOgk0OAk6CTMzNDUuNjA2NgorTWVkaW5hIAk6CTQ4CToJMzQ1Ni40MzI3CitNZW5hcmQgCToJNDgJOgkyMzM2LjgyNzUKK01pZGxhbmQgCToJNDgJOgkyMzM2LjEwMjMKK01pbGFtIAk6CTQ4CToJMjY0Ni4xMjUzCitNaWxscyAJOgk0OAk6CTE5NDIuMjE1MQorTWl0Y2hlbGwgCToJNDgJOgkyMzcyLjE4MQorTW9udGFndWUgCToJNDgJOgkyNDMwLjU1OTYKK01vbnRnb21lcnkgCToJNDgJOgkyNzg4LjkzNzkKK01vb3JlIAk6CTQ4CToJMjM1NS44ODk5CitNb3JyaXMgCToJNDgJOgk2NjkuODc3NgorTW90bGV5IAk6CTQ4CToJMjU2My42MDc5CitOYWNvZ2RvY2hlcyAJOgk0OAk6CTI1NDEuNjQ0NworTmF2YXJybyAJOgk0OAk6CTI4MTMuMTgwMworTmV3dG9uIAk6CTQ4CToJMjQzMy4zMzA5CitOb2xhbiAJOgk0OAk6CTIzNjcuMDc4NworTnVlY2VzIAk6CTQ4CToJMzAyMS4wMjc4CitPY2hpbHRyZWUgCToJNDgJOgkyMzc3LjgwMTMKK09sZGhhbSAJOgk0OAk6CTM4ODguNjc3OAorT3JhbmdlIAk6CTQ4CToJOTgzLjAwODYKK1BhbG8gUGludG8gCToJNDgJOgkyNTUyLjQ0NQorUGFub2xhIAk6CTQ4CToJMjEyNy4yNzA2CitQYXJrZXIgCToJNDgJOgkyMzU3LjEzMzEKK1Bhcm1lciAJOgk0OAk6CTIyOTIuNTkwMworUGVjb3MgCToJNDgJOgkxMjM0MC42NTA3CitQb2xrIAk6CTQ4CToJMjg3NC40MDc5CitQb3R0ZXIgCToJNDgJOgkyMzg3LjkyODIKK1ByZXNpZGlvIAk6CTQ4CToJOTk4Ny43MTM0CitSYWlucyAJOgk0OAk6CTY3MC40NzMzCitSYW5kYWxsIAk6CTQ4CToJMjM4OS4wNjc4CitSZWFnYW4gCToJNDgJOgkzMDQ1Ljc4ODIKK1JlYWwgCToJNDgJOgkxODEzLjEwMzYKK1JlZCBSaXZlciAJOgk0OAk6CTI3MzkuMjA5OQorUmVldmVzIAk6CTQ4CToJNjg0Mi42NTA1CitSZWZ1Z2lvIAk6CTQ4CToJMjEyMC4yNzc2CitSb2JlcnRzIAk6CTQ4CToJMjM5My42NTIxCitSb2JlcnRzb24gCToJNDgJOgkyMjQyLjA4NTMKK1JvY2t3YWxsIAk6CTQ4CToJMzg1LjEzMworUnVubmVscyAJOgk0OAk6CTI3MzcuOTY2NworUnVzayAJOgk0OAk6CTI0MzEuMDI1OAorU2FiaW5lIAk6CTQ4CToJMTQ5My40MTk5CitTYW4gQXVndXN0aW5lIAk6CTQ4CToJMTUzMy44MjM5CitTYW4gSmFjaW50byAJOgk0OAk6CTE2MjYuMjYxCitTYW4gUGF0cmljaW8gCToJNDgJOgkxODMxLjI4NTQKK1NhbiBTYWJhIAk6CTQ4CToJMjk0OC4wNjc1CitTY2hsZWljaGVyIAk6CTQ4CToJMzM5NC41ODM1CitTY3VycnkgCToJNDgJOgkyMzUwLjUwMjcKK1NoYWNrZWxmb3JkIAk6CTQ4CToJMjM3MS4yNDg2CitTaGVsYnkgCToJNDgJOgkyMTYxLjQzMjcKK1NoZXJtYW4gCToJNDgJOgkyMzkxLjA4OAorU21pdGggCToJNDgJOgkyNDU5LjA3NTUKK1NvbWVydmVsbCAJOgk0OAk6CTQ5Ny4wMjEKK1N0YXJyIAk6CTQ4CToJMzE4My44MzUyCitTdGVwaGVucyAJOgk0OAk6CTIzODYuNjMzMgorU3RlcmxpbmcgCToJNDgJOgkyMzkxLjgzOTEKK1N0b25ld2FsbCAJOgk0OAk6CTIzODMuMzk1NworU3V0dG9uIAk6CTQ4CToJMzc2Ni44OTYKK1N3aXNoZXIgCToJNDgJOgkyMzMyLjc2MTIKK1RhcnJhbnQgCToJNDgJOgkyMzI0LjQ3MzIKK1RheWxvciAJOgk0OAk6CTIzODAuODU3NQorVGVycmVsbCAJOgk0OAk6CTYxMDYuNTcyNQorVGVycnkgCToJNDgJOgkyMzA3LjUwODcKK1Rocm9ja21vcnRvbiAJOgk0OAk6CTIzNzEuMDY3MworVGl0dXMgCToJNDgJOgkxMTAyLjUzNzEKK1RvbSBHcmVlbiAJOgk0OAk6CTM5ODkuOTk4NgorVHJhdmlzIAk6CTQ4CToJMjY0Ny4xODcyCitUcmluaXR5IAk6CTQ4CToJMTg0OS4yNgorVHlsZXIgCToJNDgJOgkyNDIzLjQ4ODkKK1Vwc2h1ciAJOgk0OAk6CTE1MzUuMDE1MworVXB0b24gCToJNDgJOgkzMjE2LjMzOTcKK1V2YWxkZSAJOgk0OAk6CTQwMzYuNzc0CitWYWwgVmVyZGUgCToJNDgJOgk4MzcxLjkxNgorVmFuIFphbmR0IAk6CTQ4CToJMjIyNi4wNTMyCitWaWN0b3JpYSAJOgk0OAk6CTIzMDEuODEwNworV2Fsa2VyIAk6CTQ4CToJMjA3NS43Mjk2CitXYWxsZXIgCToJNDgJOgkxMzQyLjg4OTEKK1dhcmQgCToJNDgJOgkyMTY0LjU2NjYKK1dhc2hpbmd0b24gCToJNDgJOgkxNjA5LjI5NjUKK1dlYmIgCToJNDgJOgk4NzQyLjYyMjcKK1doYXJ0b24gCToJNDgJOgkyODM0LjU3MzcKK1doZWVsZXIgCToJNDgJOgkyMzcwLjczMDYKK1dpY2hpdGEgCToJNDgJOgkxNjM5LjQ5NTkKK1dpbGJhcmdlciAJOgk0OAk6CTI1MzMuMjc5CitXaWxsYWN5IAk6CTQ4CToJMjAzMS4xNTU3CitXaWxsaWFtc29uIAk6CTQ4CToJMjkzOC45NzY2CitXaWxzb24gCToJNDgJOgkyMDk0LjE5NjMKK1dpbmtsZXIgCToJNDgJOgkyMTc4LjgxMTYKK1dpc2UgCToJNDgJOgkyMzg5Ljk3NDMKK1dvb2QgCToJNDgJOgkxODAyLjEyMgorWW9ha3VtIAk6CTQ4CToJMjA3MS4zNzg0CitZb3VuZyAJOgk0OAk6CTI0MTAuODc1NgorWmFwYXRhIAk6CTQ4CToJMjc0MC40NzkKK1phdmFsYSAJOgk0OAk6CTMzNzEuNDU0OAorQmVhdmVyIAk6CTQ5CToJNjcxNC4wMDUyCitCb3ggRWxkZXIgCToJNDkJOgkxNzQyOC4xODc3CitDYWNoZSAJOgk0OQk6CTMwMzguMjUxMworQ2FyYm9uIAk6CTQ5CToJMzg0NS4wMzYzCitEYWdnZXR0IAk6CTQ5CToJMTg3Mi43MjU0CitEYXZpcyAJOgk0OQk6CTE2NDEuMjgzCitEdWNoZXNuZSAJOgk0OQk6CTg0MzIuOTYyMworRW1lcnkgCToJNDkJOgkxMTU1NS4zODg2CitHYXJmaWVsZCAJOgk0OQk6CTEzNDg5LjIzOAorR3JhbmQgCToJNDkJOgk5NTY3LjY2NzIKK0lyb24gCToJNDkJOgk4NTUxLjc2NTYKK0p1YWIgCToJNDkJOgk4ODIyLjI2NTIKK0thbmUgCToJNDkJOgkxMDY0MC44MDc4CitNaWxsYXJkIAk6CTQ5CToJMTc2ODQuNTQ1OQorTW9yZ2FuIAk6CTQ5CToJMTU4MS45NDYxCitQaXV0ZSAJOgk0OQk6CTE5ODMuMzE4NAorUmljaCAJOgk0OQk6CTI4MTMuNDkxMQorU2FsdCBMYWtlIAk6CTQ5CToJMjA5Mi4xNTAyCitTYW4gSnVhbiAJOgk0OQk6CTIwNTQ2LjcwMzEKK1NhbnBldGUgCToJNDkJOgk0MTUwLjg4OTQKK1NldmllciAJOgk0OQk6CTQ5NjguMzQ1MgorU3VtbWl0IAk6CTQ5CToJNDg3NC41MDk1CitUb29lbGUgCToJNDkJOgkxODg3My42NDA4CitVaW50YWggCToJNDkJOgkxMTY1Mi4zNTgyCitVdGFoIAk6CTQ5CToJNTU0NS4xMzgyCitXYXNhdGNoIAk6CTQ5CToJMzEzMS43NTAzCitXYXNoaW5ndG9uIAk6CTQ5CToJNjI5My40NjY5CitXYXluZSAJOgk0OQk6CTYzODguMTU3MworV2ViZXIgCToJNDkJOgkxNzA4LjAwMTQKK0FkZGlzb24gCToJNTAJOgkyMDkzLjQ5NworQmVubmluZ3RvbiAJOgk1MAk6CTE3NTUuMTY1MworQ2FsZWRvbmlhIAk6CTUwCToJMTcwMi45NzY4CitDaGl0dGVuZGVuIAk6CTUwCToJMTYwNC44Njc2CitFc3NleCAJOgk1MAk6CTE3NDUuMDEyNQorRnJhbmtsaW4gCToJNTAJOgkxNzkyLjMzMTgKK0dyYW5kIElzbGUgCToJNTAJOgk1MDQuMTk1MworTGFtb2lsbGUgCToJNTAJOgkxMjAxLjExMjUKK09yYW5nZSAJOgk1MAk6CTE3OTEuNjA2NgorT3JsZWFucyAJOgk1MAk6CTE4NjcuNzUyNgorUnV0bGFuZCAJOgk1MAk6CTI0NDYuOTU0MworV2FzaGluZ3RvbiAJOgk1MAk6CTE4MDEuMTYzNworV2luZGhhbSAJOgk1MAk6CTIwNjcuMTMwOAorV2luZHNvciAJOgk1MAk6CTI1MjcuMTY2NgorQWNjb21hY2sgCToJNTEJOgkzMzkzLjAyOTUKK0FsYmVtYXJsZSAJOgk1MQk6CTE4ODAuODA2MgorQWxsZWdoYW55IAk6CTUxCToJMTE1NC4yODUzCitBbWVsaWEgCToJNTEJOgk5MjguNjE4NgorQW1oZXJzdCAJOgk1MQk6CTEyNDAuMDQwMgorQXBwb21hdHRveCAJOgk1MQk6CTg2Ni45NTA3CitBcmxpbmd0b24gCToJNTEJOgk2Ny4yMzY0CitBdWd1c3RhIAk6CTUxCToJMjUxNC43MDg3CitCYXRoIAk6CTUxCToJMTM4NC41MTA0CitCZWRmb3JkIAk6CTUxCToJMTk5Mi4zNTc1CitCbGFuZCAJOgk1MQk6CTkyOS4xMTA3CitCb3RldG91cnQgCToJNTEJOgkxNDEzLjk4NDYKK0JydW5zd2ljayAJOgk1MQk6CTE0NzQuNjY4MworQnVjaGFuYW4gCToJNTEJOgkxMzA1LjA0OTIKK0J1Y2tpbmdoYW0gCToJNTEJOgkxNTExLjQyMDQKK0NhbXBiZWxsIAk6CTUxCToJMTMxMy44MDM0CitDYXJvbGluZSAJOgk1MQk6CTEzOTUuNzI1MQorQ2Fycm9sbCAJOgk1MQk6CTEyMzcuMDg3NgorQ2hhcmxlcyBDaXR5ICAJOgk1MQk6CTUyOC45Mjk4CitDaGFybG90dGUgCToJNTEJOgkxMjM2LjU2OTYKK0NoZXN0ZXJmaWVsZCAJOgk1MQk6CTExMzEuODA0MQorQ2xhcmtlIAk6CTUxCToJNDYxLjUxMjEKK0NyYWlnIAk6CTUxCToJODU2LjI3OTkKK0N1bHBlcGVyIAk6CTUxCToJOTkwLjEwNTIKK0N1bWJlcmxhbmQgCToJNTEJOgk3NzYuMzAwNworRGlja2Vuc29uIAk6CTUxCToJODY0LjEwMTcKK0RpbndpZGRpZSAJOgk1MQk6CTEzMTMuMDc4MgorRXNzZXggCToJNTEJOgk3NDAuNTA2OQorRmFpcmZheCAJOgk1MQk6CTEwNTMuMTE5OQorRmF1cXVpZXIgCToJNTEJOgkxNjg3LjE3NzgKK0Zsb3lkIAk6CTUxCToJOTg3LjM4NTcKK0ZsdXZhbm5hIAk6CTUxCToJNzUxLjY0MzkKK0ZyYW5rbGluIAk6CTUxCToJMTg0Mi45NDA0CitGcmVkZXJpY2sgCToJNTEJOgkxMDc2LjQ1NTgKK0dpbGVzIAk6CTUxCToJOTMzLjQzNgorR2xvdWNlc3RlciAJOgk1MQk6CTc0NS45MgorR29vY2hsYW5kIAk6CTUxCToJNzUxLjA3NDEKK0dyYXlzb24gCToJNTEJOgkxMTU0Ljg4MQorR3JlZW5lIAk6CTUxCToJNDA2LjUyNjQKK0dyZWVuc3ZpbGxlIAk6CTUxCToJNzY4LjczNzkKK0hhbGlmYXggCToJNTEJOgkyMTQ4LjU2MDQKK0hhbm92ZXIgCToJNTEJOgkxMjI3Ljg2NzIKK0hlbnJpY28gCToJNTEJOgk2MzMuNTE0CitIZW5yeSAJOgk1MQk6CTk5NS41NzAxCitIaWdobGFuZCAJOgk1MQk6CTEwNzcuMDc3NAorSXNsZSBvZiBXaWdodCAJOgk1MQk6CTkzOS41NDg0CitKYW1lcyBDaXR5IAk6CTUxCToJNDY1LjQ0ODkKK0tpbmcgYW5kIFF1ZWVuIAk6CTUxCToJODQ1LjE5NDcKK0tpbmcgR2VvcmdlIAk6CTUxCToJNDg2LjM3NjEKK0tpbmcgV2lsbGlhbSAJOgk1MQk6CTczOS44MzM1CitMYW5jYXN0ZXIgCToJNTEJOgk1OTkuMTk2NQorTGVlIAk6CTUxCToJMTEzMi42NTg4CitMb3Vkb3VuIAk6CTUxCToJMTM0OS42NDkKK0xvdWlzYSAJOgk1MQk6CTEzMjIuOTQ2MQorTHVuZW5idXJnIAk6CTUxCToJMTExOS44NjQyCitNYWRpc29uIAk6CTUxCToJODMzLjQxMDIKK01hdGhld3MgCToJNTEJOgk2NTIuNTc2NAorTWVja2xlbmJ1cmcgCToJNTEJOgkxNzU5LjM2MTEKK01pZGRsZXNleCAJOgk1MQk6CTU0NS44NDI1CitNb250Z29tZXJ5IAk6CTUxCToJMTAwOC42MjM3CitOZWxzb24gCToJNTEJOgkxMjI4LjQ2MjkKK05ldyBLZW50IAk6CTUxCToJNTc4LjgxMzIKK05vcnRoYW1wdG9uIAk6CTUxCToJMjA1OS45MzA2CitOb3J0aHVtYmVybGFuZCAJOgk1MQk6CTczOS44ODUzCitOb3R0b3dheSAJOgk1MQk6CTgxOC42OTkKK09yYW5nZSAJOgk1MQk6CTg4OS40MzE5CitQYWdlIAk6CTUxCToJODEzLjQ5MzEKK1BhdHJpY2sgCToJNTEJOgkxMjU4LjQwMzMKK1BpdHRzeWx2YW5pYSAJOgk1MQk6CTI1MzMuNDg2MgorUG93aGF0YW4gCToJNTEJOgk2NzkuNjE2CitQcmluY2UgRWR3YXJkIAk6CTUxCToJOTE2LjQ3MTUKK1ByaW5jZSBHZW9yZ2UgCToJNTEJOgk3MjkuOTkxNQorUHJpbmNlIFdpbGxpYW0gCToJNTEJOgk5MDIuMjUyNAorUHVsYXNraSAJOgk1MQk6CTg1My42MzgxCitSYXBwYWhhbm5vY2sgCToJNTEJOgk2OTEuMDg5NworUmljaG1vbmQgCToJNTEJOgk1NjAuNDI0MgorUm9hbm9rZSAJOgk1MQk6CTY1MC4xOTM2CitSb2NrYnJpZGdlIAk6CTUxCToJMTU1Ni41MzgyCitSb2NraW5naGFtIAk6CTUxCToJMjIxMC4wMjExCitSdXNzZWxsIAk6CTUxCToJMTIzNC44MzQzCitTY290dCAJOgk1MQk6CTEzOTUuMDUxNworU2hlbmFuZG9haCAJOgk1MQk6CTEzMjcuNDUyNworU215dGggCToJNTEJOgkxMTcxLjQ4MjkKK1NvdXRoYW1wdG9uIAk6CTUxCToJMTU2MC4wODY1CitTcG90c3lsdmFuaWEgCToJNTEJOgkxMDY3Ljc3OTMKK1N0YWZmb3JkIAk6CTUxCToJNzI1LjA3MDUKK1N1cnJ5IAk6CTUxCToJODAzLjcwMjkKK1N1c3NleCAJOgk1MQk6CTEyNzYuNDI5NworVGF6ZXdlbGwgCToJNTEJOgkxMzQ2LjUxNTEKK1dhcnJlbiAJOgk1MQk6CTU2MC4yNjg4CitXYXNoaW5ndG9uIAk6CTUxCToJMTQ2NS44ODgyCitXZXN0bW9yZWxhbmQgCToJNTEJOgk2NTQuMzM3NgorV2lzZSAJOgk1MQk6CTEwNDkuNTE5OAorV3l0aGUgCToJNTEJOgkxMjAzLjM2NTgKK1lvcmsgCToJNTEJOgk1NTguMTk2OAorQWxleGFuZHJpYSAJOgk1MQk6CTM5LjkxMTkKK0JlZGZvcmQgCToJNTEJOgkxNy44NzEKK0JyaXN0b2wgCToJNTEJOgkzNC4wODQ0CitCdWVuYSBWaXN0YSAJOgk1MQk6CTE3LjY4OTcKK0NoYXJsb3R0ZXN2aWxsZSAJOgk1MQk6CTI2LjU3MzQKK0NoZXNhcGVha2UgCToJNTEJOgk5MDguODMxCitDbGlmdG9uIEZvcmdlIAk6CTUxCToJOC4wMjkKK0NvbG9uaWFsIEhlaWdodHMgCToJNTEJOgkyMC4xNzYxCitDb3Zpbmd0b24gCToJNTEJOgkxNC42ODUzCitEYW52aWxsZSAJOgk1MQk6CTExMy44MDQ2CitFbXBvcmlhIAk6CTUxCToJMTguMDUyMworRmFpcmZheCAJOgk1MQk6CTE2LjM0MjkKK0ZhbGxzIENodXJjaCAJOgk1MQk6CTUuMTU0MQorRnJhbmtsaW4gCToJNTEJOgkyMS43NTYKK0ZyZWRlcmlja3NidXJnIAk6CTUxCToJMjcuMjQ2OAorR2FsYXggCToJNTEJOgkyMS4zMTU3CitIYW1wdG9uIAk6CTUxCToJMzUyLjgzNTcKK0hhcnJpc29uYnVyZyAJOgk1MQk6CTQ1LjU1ODEKK0hvcGV3ZWxsIAk6CTUxCToJMjguMDIzOAorTGV4aW5ndG9uIAk6CTUxCToJNi40NDkxCitMeW5jaGJ1cmcgCToJNTEJOgkxMjguODc4NAorTWFuYXNzYXMgCToJNTEJOgkyNS43OTY0CitNYW5hc3NhcyBQYXJrIAk6CTUxCToJNi40NDkxCitNYXJ0aW5zdmlsbGUgCToJNTEJOgkyOC41MTU5CitOZXdwb3J0IE5ld3MgCToJNTEJOgkzMDguMzM5NQorTm9yZm9sayAJOgk1MQk6CTI0OS40MTcKK05vcnRvbiAJOgk1MQk6CTE5LjUwMjcKK1BldGVyc2J1cmcgCToJNTEJOgk2MC4wNjIxCitQb3F1b3NvbiAJOgk1MQk6CTIwMy4xMzM3CitQb3J0c21vdXRoIAk6CTUxCToJMTIwLjc0NTgKK1JhZGZvcmQgCToJNTEJOgkyNi4zOTIxCitSaWNobW9uZCAJOgk1MQk6CTE2Mi4wMDQ1CitSb2Fub2tlIAk6CTUxCToJMTExLjEzNjkKK1NhbGVtIAk6CTUxCToJMzcuNzg4MQorU3RhdW50b24gCToJNTEJOgk1MS4wNDg5CitTdWZmb2xrIAk6CTUxCToJMTExMS4yOTEzCitWaXJnaW5pYSBCZWFjaCAJOgk1MQk6CTEyODguMDg0NworV2F5bmVzYm9ybyAJOgk1MQk6CTM5LjgzNDIKK1dpbGxpYW1zYnVyZyAJOgk1MQk6CTIyLjQ1NTMKK1dpbmNoZXN0ZXIgCToJNTEJOgkyNC4xNjQ3CitBZGFtcyAJOgk1Mwk6CTQ5OTcuODk3MQorQXNvdGluIAk6CTUzCToJMTY1OS4zODcxCitCZW50b24gCToJNTMJOgk0NTU4LjcxMDgKK0NoZWxhbiAJOgk1Mwk6CTc3NTMuNDc1OAorQ2xhbGxhbSAJOgk1Mwk6CTY5MTYuMTgwNgorQ2xhcmsgCToJNTMJOgkxNjk5LjYwOTgKK0NvbHVtYmlhIAk6CTUzCToJMjI2Mi40NDI3CitDb3dsaXR6IAk6CTUzCToJMzAyMC43OTQ3CitEb3VnbGFzIAk6CTUzCToJNDc4OC4xMDcxCitGZXJyeSAJOgk1Mwk6CTU4NDYuODIxNAorRnJhbmtsaW4gCToJNTMJOgkzMjc3LjI1NjUKK0dhcmZpZWxkIAk6CTUzCToJMTg2MC4xMTIxCitHcmFudCAJOgk1Mwk6CTcyMjkuNDQxMQorR3JheXMgSGFyYm9yIAk6CTUzCToJNTc2MS4yOTk2CitJc2xhbmQgCToJNTMJOgkxMzQwLjA0MDEKK0plZmZlcnNvbiAJOgk1Mwk6CTU2NTUuMzE2OAorS2luZyAJOgk1Mwk6CTU5NzMuOTEyNworS2l0c2FwIAk6CTUzCToJMTQ2NS44ODgyCitLaXR0aXRhcyAJOgk1Mwk6CTYwNDIuNzU0OQorS2xpY2tpdGF0IAk6CTUzCToJNDkzMS44MjYyCitMZXdpcyAJOgk1Mwk6CTYzMDkuOTEzNAorTGluY29sbiAJOgk1Mwk6CTYwNTkuODQ4OQorTWFzb24gCToJNTMJOgkyNzIyLjE2NzcKK09rYW5vZ2FuIAk6CTUzCToJMTM3NjYuMjY0NAorUGFjaWZpYyAJOgk1Mwk6CTMxNjguODY1CitQZW5kIE9yZWlsbGUgCToJNTMJOgkzNjkxLjU3ODgKK1BpZXJjZSAJOgk1Mwk6CTQ2NzguODM1CitTYW4gSnVhbiAJOgk1Mwk6CTE2MDguNTcxMworU2thZ2l0IAk6CTUzCToJNDk3NC4wMTczCitTa2FtYW5pYSAJOgk1Mwk6CTQzNjEuMTk3NAorU25vaG9taXNoIAk6CTUzCToJNTY4OC43MDE5CitTcG9rYW5lIAk6CTUzCToJNDYxMi4wNjQ4CitTdGV2ZW5zIAk6CTUzCToJNjU4MC4yNTc2CitUaHVyc3RvbiAJOgk1Mwk6CTIwMDMuNzI3NgorV2Foa2lha3VtIAk6CTUzCToJNzQyLjUyNzEKK1dhbGxhIFdhbGxhIAk6CTUzCToJMzM2NS4wNTc1CitXaGF0Y29tIAk6CTUzCToJNjQ4NC4xOTQ1CitXaGl0bWFuIAk6CTUzCToJNTYzOS45ODQKK1lha2ltYSAJOgk1Mwk6CTExMTY3LjA2OTkKK0JhcmJvdXIgCToJNTQJOgk4ODcuNzIyNQorQmVya2VsZXkgCToJNTQJOgk4MzIuODkyMgorQm9vbmUgCToJNTQJOgkxMzAzLjIzNjIKK0JyYXh0b24gCToJNTQJOgkxMzM2Ljg4MDMKK0Jyb29rZSAJOgk1NAk6CTIzOC45NTM0CitDYWJlbGwgCToJNTQJOgk3NDUuOTcxOAorQ2FsaG91biAJOgk1NAk6CTcyNi44NTc2CitDbGF5IAk6CTU0CToJODkwLjQ5MzgKK0RvZGRyaWRnZSAJOgk1NAk6CTgzMC4wNDMyCitGYXlldHRlIAk6CTU0CToJMTczMS4wNTI0CitHaWxtZXIgCToJNTQJOgk4ODAuNzgxMworR3JhbnQgCToJNTQJOgkxMjQzLjY5MjEKK0dyZWVuYnJpZXIgCToJNTQJOgkyNjUzLjI3MzcKK0hhbXBzaGlyZSAJOgk1NAk6CTE2NjkuNTY1OAorSGFuY29jayAJOgk1NAk6CTIyOC44MjY1CitIYXJkeSAJOgk1NAk6CTE1MTMuODAzMgorSGFycmlzb24gCToJNTQJOgkxMDc4Ljk5NAorSmFja3NvbiAJOgk1NAk6CTEyMjEuNDE4MQorSmVmZmVyc29uIAk6CTU0CToJNTQ3Ljk2NjMKK0thbmF3aGEgCToJNTQJOgkyMzU5LjQ2NDEKK0xld2lzIAk6CTU0CToJMTAwOS40NTI1CitMaW5jb2xuIAk6CTU0CToJMTEzNS45NDgxCitMb2dhbiAJOgk1NAk6CTExODAuMDI5OQorTWNEb3dlbGwgCToJNTQJOgkxMzg1LjM5MQorTWFyaW9uIAk6CTU0CToJODA2Ljc1OTEKK01hcnNoYWxsIAk6CTU0CToJODA4LjU0NjIKK01hc29uIAk6CTU0CToJMTE1Mi4wMzIKK01lcmNlciAJOgk1NAk6CTEwODkuNTg3MQorTWluZXJhbCAJOgk1NAk6CTg1Mi40NDY3CitNaW5nbyAJOgk1NAk6CTEwOTcuMjI3NgorTW9ub25nYWxpYSAJOgk1NAk6CTk0Ny42NTUxCitNb25yb2UgCToJNTQJOgkxMjI2Ljc3OTQKK01vcmdhbiAJOgk1NAk6CTU5NC44NDUzCitOaWNob2xhcyAJOgk1NAk6CTE2OTQuODk2CitPaGlvIAk6CTU0CToJMjgxLjk0NzQKK1BlbmRsZXRvbiAJOgk1NAk6CTE4MDguMjA4NQorUGxlYXNhbnRzIAk6CTU0CToJMzQ4LjU4ODEKK1BvY2Fob250YXMgCToJNTQJOgkyNDM5LjM5MTUKK1ByZXN0b24gCToJNTQJOgkxNjg3LjEwMDEKK1B1dG5hbSAJOgk1NAk6CTkwNy41MzYKK1JhbGVpZ2ggCToJNTQJOgkxNTc4LjE5MDYKK1JhbmRvbHBoIAk6CTU0CToJMjY5My4zOTI4CitSaXRjaGllIAk6CTU0CToJMTE3NC43NzIyCitSb2FuZSAJOgk1NAk6CTEyNTIuOTEyNQorU3VtbWVycyAJOgk1NAk6CTk1Mi4zOTQ4CitUYXlsb3IgCToJNTQJOgk0NTUuMDM3MQorVHVja2VyIAk6CTU0CToJMTA5MC42NzQ5CitUeWxlciAJOgk1NAk6CTY3NS4xODcxCitVcHNodXIgCToJNTQJOgk5MTkuMDg3NAorV2F5bmUgCToJNTQJOgkxMzI2LjU3MjEKK1dlYnN0ZXIgCToJNTQJOgkxNDQwLjQyODUKK1dldHplbCAJOgk1NAk6CTkzNS45NDgzCitXaXJ0IAk6CTU0CToJNjA4LjIwOTcKK1dvb2QgCToJNTQJOgk5NzYuMjc0NgorV3lvbWluZyAJOgk1NAk6CTEyOTkuNzEzOAorQWRhbXMgCToJNTUJOgkxNzgzLjI0MDkKK0FzaGxhbmQgCToJNTUJOgk1OTQwLjc2MDcKK0JhcnJvbiAJOgk1NQk6CTIzMDUuMTUxOAorQmF5ZmllbGQgCToJNTUJOgk1Mjg3LjU2MjcKK0Jyb3duIAk6CTU1CToJMTU5My45Mzc4CitCdWZmYWxvIAk6CTU1CToJMTgzNy44MTIyCitCdXJuZXR0IAk6CTU1CToJMjI4MC4xODQyCitDYWx1bWV0IAk6CTU1CToJMTAyOC4zMDc3CitDaGlwcGV3YSAJOgk1NQk6CTI2OTcuMDE4OAorQ2xhcmsgCToJNTUJOgkzMTU3LjQxNzIKK0NvbHVtYmlhIAk6CTU1CToJMjA2MC44NjMKK0NyYXdmb3JkIAk6CTU1CToJMTU1MS45Nzk4CitEYW5lIAk6CTU1CToJMzIwNy4yNDg4CitEb2RnZSAJOgk1NQk6CTIzNDkuMTA0MQorRG9vciAJOgk1NQk6CTYxMzcuODU5NworRG91Z2xhcyAJOgk1NQk6CTM4MzIuOTY2OQorRHVubiAJOgk1NQk6CTIyMzcuNTI2OQorRWF1IENsYWlyZSAJOgk1NQk6CTE2NzEuMjc1MgorRmxvcmVuY2UgCToJNTUJOgkxMjg4LjQyMTQKK0ZvbmQgZHUgTGFjIAk6CTU1CToJMTk4My40MjIKK0ZvcmVzdCAJOgk1NQk6CTI3MTAuMTc2CitHcmFudCAJOgk1NQk6CTMwNjQuNzcyOQorR3JlZW4gCToJNTUJOgkxNTE0LjAxMDQKK0dyZWVuIExha2UgCToJNTUJOgk5ODUuMzM5NgorSW93YSAJOgk1NQk6CTE5ODkuMzI3MgorSXJvbiAJOgk1NQk6CTIzODAuODMxNgorSmFja3NvbiAJOgk1NQk6CTI1OTAuMjg0OQorSmVmZmVyc29uIAk6CTU1CToJMTUwOS4zMjI1CitKdW5lYXUgCToJNTUJOgkyMDgyLjY5NjcKK0tlbm9zaGEgCToJNTUJOgkxOTUzLjY2MjkKK0tld2F1bmVlIAk6CTU1CToJMjgwOC45MDY4CitMYSBDcm9zc2UgCToJNTUJOgkxMjQyLjk5MjgKK0xhZmF5ZXR0ZSAJOgk1NQk6CTE2NDMuNTEwNAorTGFuZ2xhZGUgCToJNTUJOgkyMjk5LjYwOTIKK0xpbmNvbG4gCToJNTUJOgkyMzQ5LjI1OTUKK01hbml0b3dvYyAJOgk1NQk6CTM4NjkuMTIzMworTWFyYXRob24gCToJNTUJOgk0MDgyLjIwMjYKK01hcmluZXR0ZSAJOgk1NQk6CTQwMTQuNjgxMworTWFycXVldHRlIAk6CTU1CToJMTIwMi44NDc4CitNZW5vbWluZWUgCToJNTUJOgk5NDUuMzI0MQorTWlsd2F1a2VlIAk6CTU1CToJMzA4MS4zMjMKK01vbnJvZSAJOgk1NQk6CTIzNTIuNDcxMQorT2NvbnRvIAk6CTU1CToJMjk3Ni4wMTM2CitPbmVpZGEgCToJNTUJOgkzMjAwLjkyOTIKK091dGFnYW1pZSAJOgk1NQk6CTE2NjguOTk2CitPemF1a2VlIAk6CTU1CToJMjg5MC45NTgKK1BlcGluIAk6CTU1CToJNjQ0LjA4MTIKK1BpZXJjZSAJOgk1NQk6CTE1MzIuMjE4MQorUG9sayAJOgk1NQk6CTI0NzYuNzY1MgorUG9ydGFnZSAJOgk1NQk6CTIxMzAuOTQ4NAorUHJpY2UgCToJNTUJOgkzMzExLjEzMzcKK1JhY2luZSAJOgk1NQk6CTIwNTEuMDIxCitSaWNobGFuZCAJOgk1NQk6CTE1MjYuNDk0MgorUm9jayAJOgk1NQk6CTE4ODAuODU4CitSdXNrIAk6CTU1CToJMjQxMS4wMDUxCitTdC4gQ3JvaXggCToJNTUJOgkxOTA1Ljc0NzkKK1NhdWsgCToJNTUJOgkyMTk3LjQzMzcKK1Nhd3llciAJOgk1NQk6CTM0OTcuMzI4OAorU2hhd2FubyAJOgk1NQk6CTIzNTUuMTY0NworU2hlYm95Z2FuIAk6CTU1CToJMzI5MS44MTIzCitUYXlsb3IgCToJNTUJOgkyNTQ5LjgyOTEKK1RyZW1wZWFsZWF1IAk6CTU1CToJMTkyMS43MjgyCitWZXJub24gCToJNTUJOgkyMTE0LjUwMTkKK1ZpbGFzIAk6CTU1CToJMjYzNi4yMzE1CitXYWx3b3J0aCAJOgk1NQk6CTE0OTMuMTM1CitXYXNoYnVybiAJOgk1NQk6CTIyMDkuNDI1NAorV2FzaGluZ3RvbiAJOgk1NQk6CTExMjguOTU1MQorV2F1a2VzaGEgCToJNTUJOgkxNTAzLjQ0MzIKK1dhdXBhY2EgCToJNTUJOgkxOTgyLjIwNDcKK1dhdXNoYXJhIAk6CTU1CToJMTY1MC44NDAxCitXaW5uZWJhZ28gCToJNTUJOgkxNDk4LjgzMworV29vZCAJOgk1NQk6CTIwOTYuNTAxNAorQWxiYW55IAk6CTU2CToJMTExNTkuNzY2MQorQmlnIEhvcm4gCToJNTYJOgk4MTgxLjcwNjQKK0NhbXBiZWxsIAk6CTU2CToJMTI0MzYuMDQwNAorQ2FyYm9uIAk6CTU2CToJMjA2MjYuODM3NworQ29udmVyc2UgCToJNTYJOgkxMTA0Ni42MDkKK0Nyb29rIAk6CTU2CToJNzQzNC42NDY4CitGcmVtb250IAk6CTU2CToJMjM5OTguNDIyCitHb3NoZW4gCToJNTYJOgk1NzgxLjI5NDQKK0hvdCBTcHJpbmdzIAk6CTU2CToJNTE5Ni4wODM5CitKb2huc29uIAk6CTU2CToJMTA4MTIuNDk4OQorTGFyYW1pZSAJOgk1Ngk6CTY5NjAuOTYxNworTGluY29sbiAJOgk1Ngk6CTEwNTkwLjUzNTkKK05hdHJvbmEgCToJNTYJOgkxMzkyMy4xMTQ4CitOaW9icmFyYSAJOgk1Ngk6CTY4MDYuMjYxCitQYXJrIAk6CTU2CToJMTgwNDguNDQwOQorUGxhdHRlIAk6CTU2CToJNTQ2Ny4yMzEKK1NoZXJpZGFuIAk6CTU2CToJNjU0NS4xMTEzCitTdWJsZXR0ZSAJOgk1Ngk6CTEyNzgzLjM1OTQKK1N3ZWV0d2F0ZXIgCToJNTYJOgkyNzE3Mi4xMzAzCitUZXRvbiAJOgk1Ngk6CTEwOTM0LjQ2MgorVWludGEgCToJNTYJOgk1NDA2Ljc4MDQKK1dhc2hha2llIAk6CTU2CToJNTgwOC43MjI1CitXZXN0b24gCToJNTYJOgk2MjE2LjE4MTMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVVNBXzJfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVVNBXzJfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRlY2ZhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9VU0FfMl9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDMxNDEgQEAKK0F1dGF1Z2EgCToJMQk6CTQzNjcxCitCYWxkd2luIAk6CTEJOgkxNDA0MTUKK0JhcmJvdXIgCToJMQk6CTI5MDM4CitCaWJiIAk6CTEJOgkyMDgyNgorQmxvdW50IAk6CTEJOgk1MTAyNAorQnVsbG9jayAJOgkxCToJMTE3MTQKK0J1dGxlciAJOgkxCToJMjEzOTkKK0NhbGhvdW4gCToJMQk6CTExMjI0OQorQ2hhbWJlcnMgCToJMQk6CTM2NTgzCitDaGVyb2tlZSAJOgkxCToJMjM5ODgKK0NoaWx0b24gCToJMQk6CTM5NTkzCitDaG9jdGF3IAk6CTEJOgkxNTkyMgorQ2xhcmtlIAk6CTEJOgkyNzg2NworQ2xheSAJOgkxCToJMTQyNTQKK0NsZWJ1cm5lIAk6CTEJOgkxNDEyMworQ29mZmVlIAk6CTEJOgk0MzYxNQorQ29sYmVydCAJOgkxCToJNTQ5ODQKK0NvbmVjdWggCToJMQk6CTE0MDg5CitDb29zYSAJOgkxCToJMTIyMDIKK0NvdmluZ3RvbiAJOgkxCToJMzc2MzEKK0NyZW5zaGF3IAk6CTEJOgkxMzY2NQorQ3VsbG1hbiAJOgkxCToJNzc0ODMKK0RhbGUgCToJMQk6CTQ5MTI5CitEYWxsYXMgCToJMQk6CTQ2MzY1CitEZUthbGIgCToJMQk6CTY0NDUyCitFbG1vcmUgCToJMQk6CTY1ODc0CitFc2NhbWJpYSAJOgkxCToJMzg0NDAKK0V0b3dhaCAJOgkxCToJMTAzNDU5CitGYXlldHRlIAk6CTEJOgkxODQ5NQorRnJhbmtsaW4gCToJMQk6CTMxMjIzCitHZW5ldmEgCToJMQk6CTI1NzY0CitHcmVlbmUgCToJMQk6CTk5NzQKK0hhbGUgCToJMQk6CTE3MTg1CitIZW5yeSAJOgkxCToJMTYzMTAKK0hvdXN0b24gCToJMQk6CTg4Nzg3CitKYWNrc29uIAk6CTEJOgk1MzkyNgorSmVmZmVyc29uIAk6CTEJOgk2NjIwNDcKK0xhbWFyIAk6CTEJOgkxNTkwNAorTGF1ZGVyZGFsZSAJOgkxCToJODc5NjYKK0xhd3JlbmNlIAk6CTEJOgkzNDgwMworTGVlIAk6CTEJOgkxMTUwOTIKK0xpbWVzdG9uZSAJOgkxCToJNjU2NzYKK0xvd25kZXMgCToJMQk6CTEzNDczCitNYWNvbiAJOgkxCToJMjQxMDUKK01hZGlzb24gCToJMQk6CTI3NjcwMAorTWFyZW5nbyAJOgkxCToJMjI1MzkKK01hcmlvbiAJOgkxCToJMzEyMTQKK01hcnNoYWxsIAk6CTEJOgk4MjIzMQorTW9iaWxlIAk6CTEJOgkzOTk4NDMKK01vbnJvZSAJOgkxCToJMjQzMjQKK01vbnRnb21lcnkgCToJMQk6CTIyMzUxMAorTW9yZ2FuIAk6CTEJOgkxMTEwNjQKK1BlcnJ5IAk6CTEJOgkxMTg2MQorUGlja2VucyAJOgkxCToJMjA5NDkKK1Bpa2UgCToJMQk6CTI5NjA1CitSYW5kb2xwaCAJOgkxCToJMjIzODAKK1J1c3NlbGwgCToJMQk6CTQ5NzU2CitTdC4gQ2xhaXIgCToJMQk6CTY0NzQyCitTaGVsYnkgCToJMQk6CTE0MzI5MworU3VtdGVyIAk6CTEJOgkxNDc5OAorVGFsbGFkZWdhIAk6CTEJOgk4MDMyMQorVGFsbGFwb29zYSAJOgkxCToJNDE0NzUKK1R1c2NhbG9vc2EgCToJMQk6CTE2NDg3NQorV2Fsa2VyIAk6CTEJOgk3MDcxMworV2FzaGluZ3RvbiAJOgkxCToJMTgwOTcKK1dpbGNveCAJOgkxCToJMTMxODMKK1dpbnN0b24gCToJMQk6CTI0ODQzCitBbGV1dGlhbnMgRWFzdCAJOgkyCToJMjY5NworQWxldXRpYW5zIFdlc3QgCToJMgk6CTU0NjUKK0FuY2hvcmFnZSAJOgkyCToJMjYwMjgzCitCZXRoZWwgCToJMgk6CTE2MDA2CitCcmlzdG9sIEJheSAJOgkyCToJMTI1OAorRGVuYWxpIAk6CTIJOgkxODkzCitEaWxsaW5naGFtIAk6CTIJOgk0OTIyCitGYWlyYmFua3MgTm9ydGggU3RhciAJOgkyCToJODI4NDAKK0hhaW5lcyAJOgkyCToJMjM5MgorSnVuZWF1IAk6CTIJOgkzMDcxMQorS2VuYWkgUGVuaW5zdWxhIAk6CTIJOgk0OTY5MQorS2V0Y2hpa2FuIEdhdGV3YXkgCToJMgk6CTE0MDcwCitLb2RpYWsgSXNsYW5kIAk6CTIJOgkxMzkxMworTGFrZSBhbmQgUGVuaW5zdWxhIAk6CTIJOgkxODIzCitNYXRhbnVza2EtU3VzaXRuYSAJOgkyCToJNTkzMjIKK05vbWUgCToJMgk6CTkxOTYKK05vcnRoIFNsb3BlIAk6CTIJOgk3Mzg1CitOb3J0aHdlc3QgQXJjdGljIAk6CTIJOgk3MjA4CitQcmluY2Ugb2YgV2FsZXMtT3V0ZXIgS2V0Y2hpa2FuIAk6CTIJOgk2MTQ2CitTaXRrYSAJOgkyCToJODgzNQorU2thZ3dheS1Ib29uYWgtQW5nb29uIAk6CTIJOgkzNDM2CitTb3V0aGVhc3QgRmFpcmJhbmtzIAk6CTIJOgk2MTc0CitWYWxkZXotQ29yZG92YSAJOgkyCToJMTAxOTUKK1dhZGUgSGFtcHRvbiAJOgkyCToJNzAyOAorV3JhbmdlbGwtUGV0ZXJzYnVyZyAJOgkyCToJNjY4NAorWWFrdXRhdCAJOgkyCToJODA4CitZdWtvbi1Lb3l1a3VrIAk6CTIJOgk2NTUxCitBcGFjaGUgCToJNAk6CTY5NDIzCitDb2NoaXNlIAk6CTQJOgkxMTc3NTUKK0NvY29uaW5vIAk6CTQJOgkxMTYzMjAKK0dpbGEgCToJNAk6CTUxMzM1CitHcmFoYW0gCToJNAk6CTMzNDg5CitHcmVlbmxlZSAJOgk0CToJODU0NworTGEgUGF6IAk6CTQJOgkxOTcxNQorTWFyaWNvcGEgCToJNAk6CTMwNzIxNDkKK01vaGF2ZSAJOgk0CToJMTU1MDMyCitOYXZham8gCToJNAk6CTk3NDcwCitQaW1hIAk6CTQJOgk4NDM3NDYKK1BpbmFsIAk6CTQJOgkxNzk3MjcKK1NhbnRhIENydXogCToJNAk6CTM4MzgxCitZYXZhcGFpIAk6CTQJOgkxNjc1MTcKK1l1bWEgCToJNAk6CTE2MDAyNgorQXJrYW5zYXMgCToJNQk6CTIwNzQ5CitBc2hsZXkgCToJNQk6CTI0MjA5CitCYXh0ZXIgCToJNQk6CTM4Mzg2CitCZW50b24gCToJNQk6CTE1MzQwNgorQm9vbmUgCToJNQk6CTMzOTQ4CitCcmFkbGV5IAk6CTUJOgkxMjYwMAorQ2FsaG91biAJOgk1CToJNTc0NAorQ2Fycm9sbCAJOgk1CToJMjUzNTcKK0NoaWNvdCAJOgk1CToJMTQxMTcKK0NsYXJrIAk6CTUJOgkyMzU0NgorQ2xheSAJOgk1CToJMTc2MDkKK0NsZWJ1cm5lIAk6CTUJOgkyNDA0NgorQ2xldmVsYW5kIAk6CTUJOgk4NTcxCitDb2x1bWJpYSAJOgk1CToJMjU2MDMKK0NvbndheSAJOgk1CToJMjAzMzYKK0NyYWlnaGVhZCAJOgk1CToJODIxNDgKK0NyYXdmb3JkIAk6CTUJOgk1MzI0NworQ3JpdHRlbmRlbiAJOgk1CToJNTA4NjYKK0Nyb3NzIAk6CTUJOgkxOTUyNgorRGFsbGFzIAk6CTUJOgk5MjEwCitEZXNoYSAJOgk1CToJMTUzNDEKK0RyZXcgCToJNQk6CTE4NzIzCitGYXVsa25lciAJOgk1CToJODYwMTQKK0ZyYW5rbGluIAk6CTUJOgkxNzc3MQorRnVsdG9uIAk6CTUJOgkxMTY0MgorR2FybGFuZCAJOgk1CToJODgwNjgKK0dyYW50IAk6CTUJOgkxNjQ2NAorR3JlZW5lIAk6CTUJOgkzNzMzMQorSGVtcHN0ZWFkIAk6CTUJOgkyMzU4NworSG90IFNwcmluZyAJOgk1CToJMzAzNTMKK0hvd2FyZCAJOgk1CToJMTQzMDAKK0luZGVwZW5kZW5jZSAJOgk1CToJMzQyMzMKK0l6YXJkIAk6CTUJOgkxMzI0OQorSmFja3NvbiAJOgk1CToJMTg0MTgKK0plZmZlcnNvbiAJOgk1CToJODQyNzgKK0pvaG5zb24gCToJNQk6CTIyNzgxCitMYWZheWV0dGUgCToJNQk6CTg1NTkKK0xhd3JlbmNlIAk6CTUJOgkxNzc3NAorTGVlIAk6CTUJOgkxMjU4MAorTGluY29sbiAJOgk1CToJMTQ0OTIKK0xpdHRsZSBSaXZlciAJOgk1CToJMTM2MjgKK0xvZ2FuIAk6CTUJOgkyMjQ4NgorTG9ub2tlIAk6CTUJOgk1MjgyOAorTWFkaXNvbiAJOgk1CToJMTQyNDMKK01hcmlvbiAJOgk1CToJMTYxNDAKK01pbGxlciAJOgk1CToJNDA0NDMKK01pc3Npc3NpcHBpIAk6CTUJOgk1MTk3OQorTW9ucm9lIAk6CTUJOgkxMDI1NAorTW9udGdvbWVyeSAJOgk1CToJOTI0NQorTmV2YWRhIAk6CTUJOgk5OTU1CitOZXd0b24gCToJNQk6CTg2MDgKK091YWNoaXRhIAk6CTUJOgkyODc5MAorUGVycnkgCToJNQk6CTEwMjA5CitQaGlsbGlwcyAJOgk1CToJMjY0NDUKK1Bpa2UgCToJNQk6CTExMzAzCitQb2luc2V0dCAJOgk1CToJMjU2MTQKK1BvbGsgCToJNQk6CTIwMjI5CitQb3BlIAk6CTUJOgk1NDQ2OQorUHJhaXJpZSAJOgk1CToJOTUzOQorUHVsYXNraSAJOgk1CToJMzYxNDc0CitSYW5kb2xwaCAJOgk1CToJMTgxOTUKK1N0LiBGcmFuY2lzIAk6CTUJOgkyOTMyOQorU2FsaW5lIAk6CTUJOgk4MzUyOQorU2NvdHQgCToJNQk6CTEwOTk2CitTZWFyY3kgCToJNQk6CTgyNjEKK1NlYmFzdGlhbiAJOgk1CToJMTE1MDcxCitTZXZpZXIgCToJNQk6CTE1NzU3CitTaGFycCAJOgk1CToJMTcxMTkKK1N0b25lIAk6CTUJOgkxMTQ5OQorVW5pb24gCToJNQk6CTQ1NjI5CitWYW4gQnVyZW4gCToJNQk6CTE2MTkyCitXYXNoaW5ndG9uIAk6CTUJOgkxNTc3MTUKK1doaXRlIAk6CTUJOgk2NzE2NQorV29vZHJ1ZmYgCToJNQk6CTg3NDEKK1llbGwgCToJNQk6CTIxMTM5CitBbGFtZWRhIAk6CTYJOgkxNDQzNzQxCitBbHBpbmUgCToJNgk6CTEyMDgKK0FtYWRvciAJOgk2CToJMzUxMDAKK0J1dHRlIAk6CTYJOgkyMDMxNzEKK0NhbGF2ZXJhcyAJOgk2CToJNDA1NTQKK0NvbHVzYSAJOgk2CToJMTg4MDQKK0NvbnRyYSBDb3N0YSAJOgk2CToJOTQ4ODE2CitEZWwgTm9ydGUgCToJNgk6CTI3NTA3CitFbCBEb3JhZG8gCToJNgk6CTE1NjI5OQorRnJlc25vIAk6CTYJOgk3OTk0MDcKK0dsZW5uIAk6CTYJOgkyNjQ1MworSHVtYm9sZHQgCToJNgk6CTEyNjUxOAorSW1wZXJpYWwgCToJNgk6CTE0MjM2MQorSW55byAJOgk2CToJMTc5NDUKK0tlcm4gCToJNgk6CTY2MTY0NQorS2luZ3MgCToJNgk6CTEyOTQ2MQorTGFrZSAJOgk2CToJNTgzMDkKK0xhc3NlbiAJOgk2CToJMzM4MjgKK0xvcyBBbmdlbGVzIAk6CTYJOgk5NTE5MzM4CitNYWRlcmEgCToJNgk6CTEyMzEwOQorTWFyaW4gCToJNgk6CTI0NzI4OQorTWFyaXBvc2EgCToJNgk6CTE3MTMwCitNZW5kb2Npbm8gCToJNgk6CTg2MjY1CitNZXJjZWQgCToJNgk6CTIxMDU1NAorTW9kb2MgCToJNgk6CTk0NDkKK01vbm8gCToJNgk6CTEyODUzCitNb250ZXJleSAJOgk2CToJNDAxNzYyCitOYXBhIAk6CTYJOgkxMjQyNzkKK05ldmFkYSAJOgk2CToJOTIwMzMKK09yYW5nZSAJOgk2CToJMjg0NjI4OQorUGxhY2VyIAk6CTYJOgkyNDgzOTkKK1BsdW1hcyAJOgk2CToJMjA4MjQKK1JpdmVyc2lkZSAJOgk2CToJMTU0NTM4NworU2FjcmFtZW50byAJOgk2CToJMTIyMzQ5OQorU2FuIEJlbml0byAJOgk2CToJNTMyMzQKK1NhbiBCZXJuYXJkaW5vIAk6CTYJOgkxNzA5NDM0CitTYW4gRGllZ28gCToJNgk6CTI4MTM4MzMKK1NhbiBGcmFuY2lzY28gCToJNgk6CTc3NjczMworU2FuIEpvYXF1aW4gCToJNgk6CTU2MzU5OAorU2FuIEx1aXMgT2Jpc3BvIAk6CTYJOgkyNDY2ODEKK1NhbiBNYXRlbyAJOgk2CToJNzA3MTYxCitTYW50YSBCYXJiYXJhIAk6CTYJOgkzOTkzNDcKK1NhbnRhIENsYXJhIAk6CTYJOgkxNjgyNTg1CitTYW50YSBDcnV6IAk6CTYJOgkyNTU2MDIKK1NoYXN0YSAJOgk2CToJMTYzMjU2CitTaWVycmEgCToJNgk6CTM1NTUKK1Npc2tpeW91IAk6CTYJOgk0NDMwMQorU29sYW5vIAk6CTYJOgkzOTQ1NDIKK1Nvbm9tYSAJOgk2CToJNDU4NjE0CitTdGFuaXNsYXVzIAk6CTYJOgk0NDY5OTcKK1N1dHRlciAJOgk2CToJNzg5MzAKK1RlaGFtYSAJOgk2CToJNTYwMzkKK1RyaW5pdHkgCToJNgk6CTEzMDIyCitUdWxhcmUgCToJNgk6CTM2ODAyMQorVHVvbHVtbmUgCToJNgk6CTU0NTAxCitWZW50dXJhIAk6CTYJOgk3NTMxOTcKK1lvbG8gCToJNgk6CTE2ODY2MAorWXViYSAJOgk2CToJNjAyMTkKK0FkYW1zIAk6CTgJOgkzNjM4NTcKK0FsYW1vc2EgCToJOAk6CTE0OTY2CitBcmFwYWhvZSAJOgk4CToJNDg3OTY3CitBcmNodWxldGEgCToJOAk6CTk4OTgKK0JhY2EgCToJOAk6CTQ1MTcKK0JlbnQgCToJOAk6CTU5OTgKK0JvdWxkZXIgCToJOAk6CTI5MTI4OAorQ2hhZmZlZSAJOgk4CToJMTYyNDIKK0NoZXllbm5lIAk6CTgJOgkyMjMxCitDbGVhciBDcmVlayAJOgk4CToJOTMyMgorQ29uZWpvcyAJOgk4CToJODQwMAorQ29zdGlsbGEgCToJOAk6CTM2NjMKK0Nyb3dsZXkgCToJOAk6CTU1MTgKK0N1c3RlciAJOgk4CToJMzUwMworRGVsdGEgCToJOAk6CTI3ODM0CitEZW52ZXIgCToJOAk6CTU1NDYzNgorRG9sb3JlcyAJOgk4CToJMTg0NAorRG91Z2xhcyAJOgk4CToJMTc1NzY2CitFYWdsZSAJOgk4CToJNDE2NTkKK0VsYmVydCAJOgk4CToJMTk4NzIKK0VsIFBhc28gCToJOAk6CTUxNjkyOQorRnJlbW9udCAJOgk4CToJNDYxNDUKK0dhcmZpZWxkIAk6CTgJOgk0Mzc5MQorR2lscGluIAk6CTgJOgk0NzU3CitHcmFuZCAJOgk4CToJMTI0NDIKK0d1bm5pc29uIAk6CTgJOgkxMzk1NgorSGluc2RhbGUgCToJOAk6CTc5MAorSHVlcmZhbm8gCToJOAk6CTc4NjIKK0phY2tzb24gCToJOAk6CTE1NzcKK0plZmZlcnNvbiAJOgk4CToJNTI3MDU2CitLaW93YSAJOgk4CToJMTYyMgorS2l0IENhcnNvbiAJOgk4CToJODAxMQorTGFrZSAJOgk4CToJNzgxMgorTGEgUGxhdGEgCToJOAk6CTQzOTQxCitMYXJpbWVyIAk6CTgJOgkyNTE0OTQKK0xhcyBBbmltYXMgCToJOAk6CTE1MjA3CitMaW5jb2xuIAk6CTgJOgk2MDg3CitMb2dhbiAJOgk4CToJMjA1MDQKK01lc2EgCToJOAk6CTExNjI1NQorTWluZXJhbCAJOgk4CToJODMxCitNb2ZmYXQgCToJOAk6CTEzMTg0CitNb250ZXp1bWEgCToJOAk6CTIzODMwCitNb250cm9zZSAJOgk4CToJMzM0MzIKK01vcmdhbiAJOgk4CToJMjcxNzEKK090ZXJvIAk6CTgJOgkyMDMxMQorT3VyYXkgCToJOAk6CTM3NDIKK1BhcmsgCToJOAk6CTE0NTIzCitQaGlsbGlwcyAJOgk4CToJNDQ4MAorUGl0a2luIAk6CTgJOgkxNDg3MgorUHJvd2VycyAJOgk4CToJMTQ0ODMKK1B1ZWJsbyAJOgk4CToJMTQxNDcyCitSaW8gQmxhbmNvIAk6CTgJOgk1OTg2CitSaW8gR3JhbmRlIAk6CTgJOgkxMjQxMworUm91dHQgCToJOAk6CTE5NjkwCitTYWd1YWNoZSAJOgk4CToJNTkxNworU2FuIEp1YW4gCToJOAk6CTU1OAorU2FuIE1pZ3VlbCAJOgk4CToJNjU5NAorU2VkZ3dpY2sgCToJOAk6CTI3NDcKK1N1bW1pdCAJOgk4CToJMjM1NDgKK1RlbGxlciAJOgk4CToJMjA1NTUKK1dhc2hpbmd0b24gCToJOAk6CTQ5MjYKK1dlbGQgCToJOAk6CTE4MDkzNgorWXVtYSAJOgk4CToJOTg0MQorRmFpcmZpZWxkIAk6CTkJOgk4ODI1NjcKK0hhcnRmb3JkIAk6CTkJOgk4NTcxODMKK0xpdGNoZmllbGQgCToJOQk6CTE4MjE5MworTWlkZGxlc2V4IAk6CTkJOgkxNTUwNzEKK05ldyBIYXZlbiAJOgk5CToJODI0MDA4CitOZXcgTG9uZG9uIAk6CTkJOgkyNTkwODgKK1RvbGxhbmQgCToJOQk6CTEzNjM2NAorV2luZGhhbSAJOgk5CToJMTA5MDkxCitLZW50IAk6CTEwCToJMTI2Njk3CitOZXcgQ2FzdGxlIAk6CTEwCToJNTAwMjY1CitTdXNzZXggCToJMTAJOgkxNTY2MzgKK0Rpc3RyaWN0IG9mIENvbHVtYmlhCToJMTEJOgk1NzIwNTkKK0FsYWNodWEgCToJMTIJOgkyMTc5NTUKK0Jha2VyIAk6CTEyCToJMjIyNTkKK0JheSAJOgkxMgk6CTE0ODIxNworQnJhZGZvcmQgCToJMTIJOgkyNjA4OAorQnJldmFyZCAJOgkxMgk6CTQ3NjIzMAorQnJvd2FyZCAJOgkxMgk6CTE2MjMwMTgKK0NhbGhvdW4gCToJMTIJOgkxMzAxNworQ2hhcmxvdHRlIAk6CTEyCToJMTQxNjI3CitDaXRydXMgCToJMTIJOgkxMTgwODUKK0NsYXkgCToJMTIJOgkxNDA4MTQKK0NvbGxpZXIgCToJMTIJOgkyNTEzNzcKK0NvbHVtYmlhIAk6CTEyCToJNTY1MTMKK0RlU290byAJOgkxMgk6CTMyMjA5CitEaXhpZSAJOgkxMgk6CTEzODI3CitEdXZhbCAJOgkxMgk6CTc3ODg3OQorRXNjYW1iaWEgCToJMTIJOgkyOTQ0MTAKK0ZsYWdsZXIgCToJMTIJOgk0OTgzMgorRnJhbmtsaW4gCToJMTIJOgkxMTA1NworR2Fkc2RlbiAJOgkxMgk6CTQ1MDg3CitHaWxjaHJpc3QgCToJMTIJOgkxNDQzNworR2xhZGVzIAk6CTEyCToJMTA1NzYKK0d1bGYgCToJMTIJOgkxMzMzMgorSGFtaWx0b24gCToJMTIJOgkxMzMyNworSGFyZGVlIAk6CTEyCToJMjY5MzgKK0hlbmRyeSAJOgkxMgk6CTM2MjEwCitIZXJuYW5kbyAJOgkxMgk6CTEzMDgwMgorSGlnaGxhbmRzIAk6CTEyCToJODczNjYKK0hpbGxzYm9yb3VnaCAJOgkxMgk6CTk5ODk0OAorSG9sbWVzIAk6CTEyCToJMTg1NjQKK0luZGlhbiBSaXZlciAJOgkxMgk6CTExMjk0NworSmFja3NvbiAJOgkxMgk6CTQ2NzU1CitKZWZmZXJzb24gCToJMTIJOgkxMjkwMgorTGFmYXlldHRlIAk6CTEyCToJNzAyMgorTGFrZSAJOgkxMgk6CTIxMDUyOAorTGVlIAk6CTEyCToJNDQwODg4CitMZW9uIAk6CTEyCToJMjM5NDUyCitMZXZ5IAk6CTEyCToJMzQ0NTAKK0xpYmVydHkgCToJMTIJOgk3MDIxCitNYWRpc29uIAk6CTEyCToJMTg3MzMKK01hbmF0ZWUgCToJMTIJOgkyNjQwMDIKK01hcmlvbiAJOgkxMgk6CTI1ODkxNgorTWFydGluIAk6CTEyCToJMTI2NzMxCitNaWFtaS1EYWRlIAk6CTEyCToJMjI1MzM2MgorTW9ucm9lIAk6CTEyCToJNzk1ODkKK05hc3NhdSAJOgkxMgk6CTU3NjYzCitPa2Fsb29zYSAJOgkxMgk6CTE3MDQ5OAorT2tlZWNob2JlZSAJOgkxMgk6CTM1OTEwCitPcmFuZ2UgCToJMTIJOgk4OTYzNDQKK09zY2VvbGEgCToJMTIJOgkxNzI0OTMKK1BhbG0gQmVhY2ggCToJMTIJOgkxMTMxMTg0CitQYXNjbyAJOgkxMgk6CTM0NDc2NQorUGluZWxsYXMgCToJMTIJOgk5MjE0ODIKK1BvbGsgCToJMTIJOgk0ODM5MjQKK1B1dG5hbSAJOgkxMgk6CTcwNDIzCitTdC4gSm9obnMgCToJMTIJOgkxMjMxMzUKK1N0LiBMdWNpZSAJOgkxMgk6CTE5MjY5NQorU2FudGEgUm9zYSAJOgkxMgk6CTExNzc0MworU2FyYXNvdGEgCToJMTIJOgkzMjU5NTcKK1NlbWlub2xlIAk6CTEyCToJMzY1MTk2CitTdW10ZXIgCToJMTIJOgk1MzM0NQorU3V3YW5uZWUgCToJMTIJOgkzNDg0NAorVGF5bG9yIAk6CTEyCToJMTkyNTYKK1VuaW9uIAk6CTEyCToJMTM0NDIKK1ZvbHVzaWEgCToJMTIJOgk0NDMzNDMKK1dha3VsbGEgCToJMTIJOgkyMjg2MworV2FsdG9uIAk6CTEyCToJNDA2MDEKK1dhc2hpbmd0b24gCToJMTIJOgkyMDk3MworQXBwbGluZyAJOgkxMwk6CTE3NDE5CitBdGtpbnNvbiAJOgkxMwk6CTc2MDkKK0JhY29uIAk6CTEzCToJMTAxMDMKK0Jha2VyIAk6CTEzCToJNDA3NAorQmFsZHdpbiAJOgkxMwk6CTQ0NzAwCitCYW5rcyAJOgkxMwk6CTE0NDIyCitCYXJyb3cgCToJMTMJOgk0NjE0NAorQmFydG93IAk6CTEzCToJNzYwMTkKK0JlbiBIaWxsIAk6CTEzCToJMTc0ODQKK0JlcnJpZW4gCToJMTMJOgkxNjIzNQorQmliYiAJOgkxMwk6CTE1Mzg4NworQmxlY2tsZXkgCToJMTMJOgkxMTY2NgorQnJhbnRsZXkgCToJMTMJOgkxNDYyOQorQnJvb2tzIAk6CTEzCToJMTY0NTAKK0JyeWFuIAk6CTEzCToJMjM0MTcKK0J1bGxvY2ggCToJMTMJOgk1NTk4MworQnVya2UgCToJMTMJOgkyMjI0MworQnV0dHMgCToJMTMJOgkxOTUyMgorQ2FsaG91biAJOgkxMwk6CTYzMjAKK0NhbWRlbiAJOgkxMwk6CTQzNjY0CitDYW5kbGVyIAk6CTEzCToJOTU3NworQ2Fycm9sbCAJOgkxMwk6CTg3MjY4CitDYXRvb3NhIAk6CTEzCToJNTMyODIKK0NoYXJsdG9uIAk6CTEzCToJMTAyODIKK0NoYXRoYW0gCToJMTMJOgkyMzIwNDgKK0NoYXR0YWhvb2NoZWUgCToJMTMJOgkxNDg4MgorQ2hhdHRvb2dhIAk6CTEzCToJMjU0NzAKK0NoZXJva2VlIAk6CTEzCToJMTQxOTAzCitDbGFya2UgCToJMTMJOgkxMDE0ODkKK0NsYXkgCToJMTMJOgkzMzU3CitDbGF5dG9uIAk6CTEzCToJMjM2NTE3CitDbGluY2ggCToJMTMJOgk2ODc4CitDb2JiIAk6CTEzCToJNjA3NzUxCitDb2ZmZWUgCToJMTMJOgkzNzQxMworQ29scXVpdHQgCToJMTMJOgk0MjA1MworQ29sdW1iaWEgCToJMTMJOgk4OTI4OAorQ29vayAJOgkxMwk6CTE1NzcxCitDb3dldGEgCToJMTMJOgk4OTIxNQorQ3Jhd2ZvcmQgCToJMTMJOgkxMjQ5NQorQ3Jpc3AgCToJMTMJOgkyMTk5NgorRGFkZSAJOgkxMwk6CTE1MTU0CitEYXdzb24gCToJMTMJOgkxNTk5OQorRGVjYXR1ciAJOgkxMwk6CTI4MjQwCitEZUthbGIgCToJMTMJOgk2NjU4NjUKK0RvZGdlIAk6CTEzCToJMTkxNzEKK0Rvb2x5IAk6CTEzCToJMTE1MjUKK0RvdWdoZXJ0eSAJOgkxMwk6CTk2MDY1CitEb3VnbGFzIAk6CTEzCToJOTIxNzQKK0Vhcmx5IAk6CTEzCToJMTIzNTQKK0VjaG9scyAJOgkxMwk6CTM3NTQKK0VmZmluZ2hhbSAJOgkxMwk6CTM3NTM1CitFbGJlcnQgCToJMTMJOgkyMDUxMQorRW1hbnVlbCAJOgkxMwk6CTIxODM3CitFdmFucyAJOgkxMwk6CTEwNDk1CitGYW5uaW4gCToJMTMJOgkxOTc5OAorRmF5ZXR0ZSAJOgkxMwk6CTkxMjYzCitGbG95ZCAJOgkxMwk6CTkwNTY1CitGb3JzeXRoIAk6CTEzCToJOTg0MDcKK0ZyYW5rbGluIAk6CTEzCToJMjAyODUKK0Z1bHRvbiAJOgkxMwk6CTgxNjAwNgorR2lsbWVyIAk6CTEzCToJMjM0NTYKK0dsYXNjb2NrIAk6CTEzCToJMjU1NgorR2x5bm4gCToJMTMJOgk2NzU2OAorR29yZG9uIAk6CTEzCToJNDQxMDQKK0dyYWR5IAk6CTEzCToJMjM2NTkKK0dyZWVuZSAJOgkxMwk6CTE0NDA2CitHd2lubmV0dCAJOgkxMwk6CTU4ODQ0OAorSGFiZXJzaGFtIAk6CTEzCToJMzU5MDIKK0hhbGwgCToJMTMJOgkxMzkyNzcKK0hhbmNvY2sgCToJMTMJOgkxMDA3NgorSGFyYWxzb24gCToJMTMJOgkyNTY5MAorSGFycmlzIAk6CTEzCToJMjM2OTUKK0hhcnQgCToJMTMJOgkyMjk5NworSGVhcmQgCToJMTMJOgkxMTAxMgorSGVucnkgCToJMTMJOgkxMTkzNDEKK0hvdXN0b24gCToJMTMJOgkxMTA3NjUKK0lyd2luIAk6CTEzCToJOTkzMQorSmFja3NvbiAJOgkxMwk6CTQxNTg5CitKYXNwZXIgCToJMTMJOgkxMTQyNgorSmVmZiBEYXZpcyAJOgkxMwk6CTEyNjg0CitKZWZmZXJzb24gCToJMTMJOgkxNzI2NgorSmVua2lucyAJOgkxMwk6CTg1NzUKK0pvaG5zb24gCToJMTMJOgk4NTYwCitKb25lcyAJOgkxMwk6CTIzNjM5CitMYW1hciAJOgkxMwk6CTE1OTEyCitMYW5pZXIgCToJMTMJOgk3MjQxCitMYXVyZW5zIAk6CTEzCToJNDQ4NzQKK0xlZSAJOgkxMwk6CTI0NzU3CitMaWJlcnR5IAk6CTEzCToJNjE2MTAKK0xpbmNvbG4gCToJMTMJOgk4MzQ4CitMb25nIAk6CTEzCToJMTAzMDQKK0xvd25kZXMgCToJMTMJOgk5MjExNQorTHVtcGtpbiAJOgkxMwk6CTIxMDE2CitNY0R1ZmZpZSAJOgkxMwk6CTIxMjMxCitNY0ludG9zaCAJOgkxMwk6CTEwODQ3CitNYWNvbiAJOgkxMwk6CTE0MDc0CitNYWRpc29uIAk6CTEzCToJMjU3MzAKK01hcmlvbiAJOgkxMwk6CTcxNDQKK01lcml3ZXRoZXIgCToJMTMJOgkyMjUzNAorTWlsbGVyIAk6CTEzCToJNjM4MworTWl0Y2hlbGwgCToJMTMJOgkyMzkzMgorTW9ucm9lIAk6CTEzCToJMjE3NTcKK01vbnRnb21lcnkgCToJMTMJOgk4MjcwCitNb3JnYW4gCToJMTMJOgkxNTQ1NworTXVycmF5IAk6CTEzCToJMzY1MDYKK011c2NvZ2VlIAk6CTEzCToJMTg2MjkxCitOZXd0b24gCToJMTMJOgk2MjAwMQorT2NvbmVlIAk6CTEzCToJMjYyMjUKK09nbGV0aG9ycGUgCToJMTMJOgkxMjYzNQorUGF1bGRpbmcgCToJMTMJOgk4MTY3OAorUGVhY2ggCToJMTMJOgkyMzY2OAorUGlja2VucyAJOgkxMwk6CTIyOTgzCitQaWVyY2UgCToJMTMJOgkxNTYzNgorUGlrZSAJOgkxMwk6CTEzNjg4CitQb2xrIAk6CTEzCToJMzgxMjcKK1B1bGFza2kgCToJMTMJOgk5NTg4CitQdXRuYW0gCToJMTMJOgkxODgxMgorUXVpdG1hbiAJOgkxMwk6CTI1OTgKK1JhYnVuIAk6CTEzCToJMTUwNTAKK1JhbmRvbHBoIAk6CTEzCToJNzc5MQorUmljaG1vbmQgCToJMTMJOgkxOTk3NzUKK1JvY2tkYWxlIAk6CTEzCToJNzAxMTEKK1NjaGxleSAJOgkxMwk6CTM3NjYKK1NjcmV2ZW4gCToJMTMJOgkxNTM3NAorU2VtaW5vbGUgCToJMTMJOgk5MzY5CitTcGFsZGluZyAJOgkxMwk6CTU4NDE3CitTdGVwaGVucyAJOgkxMwk6CTI1NDM1CitTdGV3YXJ0IAk6CTEzCToJNTI1MgorU3VtdGVyIAk6CTEzCToJMzMyMDAKK1RhbGJvdCAJOgkxMwk6CTY0OTgKK1RhbGlhZmVycm8gCToJMTMJOgkyMDc3CitUYXR0bmFsbCAJOgkxMwk6CTIyMzA1CitUYXlsb3IgCToJMTMJOgk4ODE1CitUZWxmYWlyIAk6CTEzCToJMTE3OTQKK1RlcnJlbGwgCToJMTMJOgkxMDk3MAorVGhvbWFzIAk6CTEzCToJNDI3MzcKK1RpZnQgCToJMTMJOgkzODQwNworVG9vbWJzIAk6CTEzCToJMjYwNjcKK1Rvd25zIAk6CTEzCToJOTMxOQorVHJldXRsZW4gCToJMTMJOgk2ODU0CitUcm91cCAJOgkxMwk6CTU4Nzc5CitUdXJuZXIgCToJMTMJOgk5NTA0CitUd2lnZ3MgCToJMTMJOgkxMDU5MAorVW5pb24gCToJMTMJOgkxNzI4OQorVXBzb24gCToJMTMJOgkyNzU5NworV2Fsa2VyIAk6CTEzCToJNjEwNTMKK1dhbHRvbiAJOgkxMwk6CTYwNjg3CitXYXJlIAk6CTEzCToJMzU0ODMKK1dhcnJlbiAJOgkxMwk6CTYzMzYKK1dhc2hpbmd0b24gCToJMTMJOgkyMTE3NgorV2F5bmUgCToJMTMJOgkyNjU2NQorV2Vic3RlciAJOgkxMwk6CTIzOTAKK1doZWVsZXIgCToJMTMJOgk2MTc5CitXaGl0ZSAJOgkxMwk6CTE5OTQ0CitXaGl0ZmllbGQgCToJMTMJOgk4MzUyNQorV2lsY294IAk6CTEzCToJODU3NworV2lsa2VzIAk6CTEzCToJMTA2ODcKK1dpbGtpbnNvbiAJOgkxMwk6CTEwMjIwCitXb3J0aCAJOgkxMwk6CTIxOTY3CitIYXdhaWkgCToJMTUJOgkxNDg2NzcKK0hvbm9sdWx1IAk6CTE1CToJODc2MTU2CitLYWxhd2FvIAk6CTE1CToJMTQ3CitLYXVhaSAJOgkxNQk6CTU4NDYzCitNYXVpIAk6CTE1CToJMTI4MDk0CitBZGEgCToJMTYJOgkzMDA5MDQKK0FkYW1zIAk6CTE2CToJMzQ3NgorQmFubm9jayAJOgkxNgk6CTc1NTY1CitCZWFyIExha2UgCToJMTYJOgk2NDExCitCZW5ld2FoIAk6CTE2CToJOTE3MQorQmluZ2hhbSAJOgkxNgk6CTQxNzM1CitCbGFpbmUgCToJMTYJOgkxODk5MQorQm9pc2UgCToJMTYJOgk2NjcwCitCb25uZXIgCToJMTYJOgkzNjgzNQorQm9ubmV2aWxsZSAJOgkxNgk6CTgyNTIyCitCb3VuZGFyeSAJOgkxNgk6CTk4NzEKK0J1dHRlIAk6CTE2CToJMjg5OQorQ2FtYXMgCToJMTYJOgk5OTEKK0NhbnlvbiAJOgkxNgk6CTEzMTQ0MQorQ2FyaWJvdSAJOgkxNgk6CTczMDQKK0Nhc3NpYSAJOgkxNgk6CTIxNDE2CitDbGFyayAJOgkxNgk6CTEwMjIKK0NsZWFyd2F0ZXIgCToJMTYJOgk4OTMwCitDdXN0ZXIgCToJMTYJOgk0MzQyCitFbG1vcmUgCToJMTYJOgkyOTEzMAorRnJhbmtsaW4gCToJMTYJOgkxMTMyOQorRnJlbW9udCAJOgkxNgk6CTExODE5CitHZW0gCToJMTYJOgkxNTE4MQorR29vZGluZyAJOgkxNgk6CTE0MTU1CitJZGFobyAJOgkxNgk6CTE1NTExCitKZWZmZXJzb24gCToJMTYJOgkxOTE1NQorSmVyb21lIAk6CTE2CToJMTgzNDIKK0tvb3RlbmFpIAk6CTE2CToJMTA4Njg1CitMYXRhaCAJOgkxNgk6CTM0OTM1CitMZW1oaSAJOgkxNgk6CTc4MDYKK0xld2lzIAk6CTE2CToJMzc0NworTGluY29sbiAJOgkxNgk6CTQwNDQKK01hZGlzb24gCToJMTYJOgkyNzQ2NworTWluaWRva2EgCToJMTYJOgkyMDE3NAorTmV6IFBlcmNlIAk6CTE2CToJMzc0MTAKK09uZWlkYSAJOgkxNgk6CTQxMjUKK093eWhlZSAJOgkxNgk6CTEwNjQ0CitQYXlldHRlIAk6CTE2CToJMjA1NzgKK1Bvd2VyIAk6CTE2CToJNzUzOAorU2hvc2hvbmUgCToJMTYJOgkxMzc3MQorVGV0b24gCToJMTYJOgk1OTk5CitUd2luIEZhbGxzIAk6CTE2CToJNjQyODQKK1ZhbGxleSAJOgkxNgk6CTc2NTEKK1dhc2hpbmd0b24gCToJMTYJOgk5OTc3CitBZGFtcyAJOgkxNwk6CTY4Mjc3CitBbGV4YW5kZXIgCToJMTcJOgk5NTkwCitCb25kIAk6CTE3CToJMTc2MzMKK0Jvb25lIAk6CTE3CToJNDE3ODYKK0Jyb3duIAk6CTE3CToJNjk1MAorQnVyZWF1IAk6CTE3CToJMzU1MDMKK0NhbGhvdW4gCToJMTcJOgk1MDg0CitDYXJyb2xsIAk6CTE3CToJMTY2NzQKK0Nhc3MgCToJMTcJOgkxMzY5NQorQ2hhbXBhaWduIAk6CTE3CToJMTc5NjY5CitDaHJpc3RpYW4gCToJMTcJOgkzNTM3MgorQ2xhcmsgCToJMTcJOgkxNzAwOAorQ2xheSAJOgkxNwk6CTE0NTYwCitDbGludG9uIAk6CTE3CToJMzU1MzUKK0NvbGVzIAk6CTE3CToJNTMxOTYKK0Nvb2sgCToJMTcJOgk1Mzc2NzQxCitDcmF3Zm9yZCAJOgkxNwk6CTIwNDUyCitDdW1iZXJsYW5kIAk6CTE3CToJMTEyNTMKK0RlS2FsYiAJOgkxNwk6CTg4OTY5CitEZSBXaXR0IAk6CTE3CToJMTY3OTgKK0RvdWdsYXMgCToJMTcJOgkxOTkyMgorRHVQYWdlIAk6CTE3CToJOTA0MTYxCitFZGdhciAJOgkxNwk6CTE5NzA0CitFZHdhcmRzIAk6CTE3CToJNjk3MQorRWZmaW5naGFtIAk6CTE3CToJMzQyNjQKK0ZheWV0dGUgCToJMTcJOgkyMTgwMgorRm9yZCAJOgkxNwk6CTE0MjQxCitGcmFua2xpbiAJOgkxNwk6CTM5MDE4CitGdWx0b24gCToJMTcJOgkzODI1MAorR2FsbGF0aW4gCToJMTcJOgk2NDQ1CitHcmVlbmUgCToJMTcJOgkxNDc2MQorR3J1bmR5IAk6CTE3CToJMzc1MzUKK0hhbWlsdG9uIAk6CTE3CToJODYyMQorSGFuY29jayAJOgkxNwk6CTIwMTIxCitIYXJkaW4gCToJMTcJOgk0ODAwCitIZW5kZXJzb24gCToJMTcJOgk4MjEzCitIZW5yeSAJOgkxNwk6CTUxMDIwCitJcm9xdW9pcyAJOgkxNwk6CTMxMzM0CitKYWNrc29uIAk6CTE3CToJNTk2MTIKK0phc3BlciAJOgkxNwk6CTEwMTE3CitKZWZmZXJzb24gCToJMTcJOgk0MDA0NQorSmVyc2V5IAk6CTE3CToJMjE2NjgKK0pvIERhdmllc3MgCToJMTcJOgkyMjI4OQorSm9obnNvbiAJOgkxNwk6CTEyODc4CitLYW5lIAk6CTE3CToJNDA0MTE5CitLYW5rYWtlZSAJOgkxNwk6CTEwMzgzMworS2VuZGFsbCAJOgkxNwk6CTU0NTQ0CitLbm94IAk6CTE3CToJNTU4MzYKK0xha2UgCToJMTcJOgk2NDQzNTYKK0xhIFNhbGxlIAk6CTE3CToJMTExNTA5CitMYXdyZW5jZSAJOgkxNwk6CTE1NDUyCitMZWUgCToJMTcJOgkzNjA2MgorTGl2aW5nc3RvbiAJOgkxNwk6CTM5Njc4CitMb2dhbiAJOgkxNwk6CTMxMTgzCitNY0Rvbm91Z2ggCToJMTcJOgkzMjkxMworTWNIZW5yeSAJOgkxNwk6CTI2MDA3NworTWNMZWFuIAk6CTE3CToJMTUwNDMzCitNYWNvbiAJOgkxNwk6CTExNDcwNgorTWFjb3VwaW4gCToJMTcJOgk0OTAxOQorTWFkaXNvbiAJOgkxNwk6CTI1ODk0MQorTWFyaW9uIAk6CTE3CToJNDE2OTEKK01hcnNoYWxsIAk6CTE3CToJMTMxODAKK01hc29uIAk6CTE3CToJMTYwMzgKK01hc3NhYyAJOgkxNwk6CTE1MTYxCitNZW5hcmQgCToJMTcJOgkxMjQ4NgorTWVyY2VyIAk6CTE3CToJMTY5NTcKK01vbnJvZSAJOgkxNwk6CTI3NjE5CitNb250Z29tZXJ5IAk6CTE3CToJMzA2NTIKK01vcmdhbiAJOgkxNwk6CTM2NjE2CitNb3VsdHJpZSAJOgkxNwk6CTE0Mjg3CitPZ2xlIAk6CTE3CToJNTEwMzIKK1Blb3JpYSAJOgkxNwk6CTE4MzQzMworUGVycnkgCToJMTcJOgkyMzA5NAorUGlhdHQgCToJMTcJOgkxNjM2NQorUGlrZSAJOgkxNwk6CTE3Mzg0CitQb3BlIAk6CTE3CToJNDQxMworUHVsYXNraSAJOgkxNwk6CTczNDgKK1B1dG5hbSAJOgkxNwk6CTYwODYKK1JhbmRvbHBoIAk6CTE3CToJMzM4OTMKK1JpY2hsYW5kIAk6CTE3CToJMTYxNDkKK1JvY2sgSXNsYW5kIAk6CTE3CToJMTQ5Mzc0CitTdC4gQ2xhaXIgCToJMTcJOgkyNTYwODIKK1NhbGluZSAJOgkxNwk6CTI2NzMzCitTYW5nYW1vbiAJOgkxNwk6CTE4ODk1MQorU2NodXlsZXIgCToJMTcJOgk3MTg5CitTY290dCAJOgkxNwk6CTU1MzcKK1NoZWxieSAJOgkxNwk6CTIyODkzCitTdGFyayAJOgkxNwk6CTYzMzIKK1N0ZXBoZW5zb24gCToJMTcJOgk0ODk3OQorVGF6ZXdlbGwgCToJMTcJOgkxMjg0ODUKK1VuaW9uIAk6CTE3CToJMTgyOTMKK1Zlcm1pbGlvbiAJOgkxNwk6CTgzOTE5CitXYWJhc2ggCToJMTcJOgkxMjkzNworV2FycmVuIAk6CTE3CToJMTg3MzUKK1dhc2hpbmd0b24gCToJMTcJOgkxNTE0OAorV2F5bmUgCToJMTcJOgkxNzE1MQorV2hpdGUgCToJMTcJOgkxNTM3MQorV2hpdGVzaWRlIAk6CTE3CToJNjA2NTMKK1dpbGwgCToJMTcJOgk1MDIyNjYKK1dpbGxpYW1zb24gCToJMTcJOgk2MTI5NgorV2lubmViYWdvIAk6CTE3CToJMjc4NDE4CitXb29kZm9yZCAJOgkxNwk6CTM1NDY5CitBZGFtcyAJOgkxOAk6CTMzNjI1CitBbGxlbiAJOgkxOAk6CTMzMTg0OQorQmFydGhvbG9tZXcgCToJMTgJOgk3MTQzNQorQmVudG9uIAk6CTE4CToJOTQyMQorQmxhY2tmb3JkIAk6CTE4CToJMTQwNDgKK0Jvb25lIAk6CTE4CToJNDYxMDcKK0Jyb3duIAk6CTE4CToJMTQ5NTcKK0NhcnJvbGwgCToJMTgJOgkyMDE2NQorQ2FzcyAJOgkxOAk6CTQwOTMwCitDbGFyayAJOgkxOAk6CTk2NDcyCitDbGF5IAk6CTE4CToJMjY1NTYKK0NsaW50b24gCToJMTgJOgkzMzg2NgorQ3Jhd2ZvcmQgCToJMTgJOgkxMDc0MworRGF2aWVzcyAJOgkxOAk6CTI5ODIwCitEZWFyYm9ybiAJOgkxOAk6CTQ2MTA5CitEZWNhdHVyIAk6CTE4CToJMjQ1NTUKK0RlS2FsYiAJOgkxOAk6CTQwMjg1CitEZWxhd2FyZSAJOgkxOAk6CTExODc2OQorRHVib2lzIAk6CTE4CToJMzk2NzQKK0Vsa2hhcnQgCToJMTgJOgkxODI3OTEKK0ZheWV0dGUgCToJMTgJOgkyNTU4OAorRmxveWQgCToJMTgJOgk3MDgyMworRm91bnRhaW4gCToJMTgJOgkxNzk1NAorRnJhbmtsaW4gCToJMTgJOgkyMjE1MQorRnVsdG9uIAk6CTE4CToJMjA1MTEKK0dpYnNvbiAJOgkxOAk6CTMyNTAwCitHcmFudCAJOgkxOAk6CTczNDAzCitHcmVlbmUgCToJMTgJOgkzMzE1NworSGFtaWx0b24gCToJMTgJOgkxODI3NDAKK0hhbmNvY2sgCToJMTgJOgk1NTM5MQorSGFycmlzb24gCToJMTgJOgkzNDMyNQorSGVuZHJpY2tzIAk6CTE4CToJMTA0MDkzCitIZW5yeSAJOgkxOAk6CTQ4NTA4CitIb3dhcmQgCToJMTgJOgk4NDk2NAorSHVudGluZ3RvbiAJOgkxOAk6CTM4MDc1CitKYWNrc29uIAk6CTE4CToJNDEzMzUKK0phc3BlciAJOgkxOAk6CTMwMDQzCitKYXkgCToJMTgJOgkyMTgwNgorSmVmZmVyc29uIAk6CTE4CToJMzE3MDUKK0plbm5pbmdzIAk6CTE4CToJMjc1NTQKK0pvaG5zb24gCToJMTgJOgkxMTUyMDkKK0tub3ggCToJMTgJOgkzOTI1NgorS29zY2l1c2tvIAk6CTE4CToJNzQwNTcKK0xhZ3JhbmdlIAk6CTE4CToJMzQ5MDkKK0xha2UgCToJMTgJOgk0ODQ1NjQKK0xhUG9ydGUgCToJMTgJOgkxMTAxMDYKK0xhd3JlbmNlIAk6CTE4CToJNDU5MjIKK01hZGlzb24gCToJMTgJOgkxMzMzNTgKK01hcmlvbiAJOgkxOAk6CTg2MDQ1NAorTWFyc2hhbGwgCToJMTgJOgk0NTEyOAorTWFydGluIAk6CTE4CToJMTAzNjkKK01pYW1pIAk6CTE4CToJMzYwODIKK01vbnJvZSAJOgkxOAk6CTEyMDU2MworTW9udGdvbWVyeSAJOgkxOAk6CTM3NjI5CitNb3JnYW4gCToJMTgJOgk2NjY4OQorTmV3dG9uIAk6CTE4CToJMTQ1NjYKK05vYmxlIAk6CTE4CToJNDYyNzUKK09oaW8gCToJMTgJOgk1NjIzCitPcmFuZ2UgCToJMTgJOgkxOTMwNgorT3dlbiAJOgkxOAk6CTIxNzg2CitQYXJrZSAJOgkxOAk6CTE3MjQxCitQZXJyeSAJOgkxOAk6CTE4ODk5CitQaWtlIAk6CTE4CToJMTI4MzcKK1BvcnRlciAJOgkxOAk6CTE0Njc5OAorUG9zZXkgCToJMTgJOgkyNzA2MQorUHVsYXNraSAJOgkxOAk6CTEzNzU1CitQdXRuYW0gCToJMTgJOgkzNjAxOQorUmFuZG9scGggCToJMTgJOgkyNzQwMQorUmlwbGV5IAk6CTE4CToJMjY1MjMKK1J1c2ggCToJMTgJOgkxODI2MQorU3QuIEpvc2VwaCAJOgkxOAk6CTI2NTU1OQorU2NvdHQgCToJMTgJOgkyMjk2MAorU2hlbGJ5IAk6CTE4CToJNDM0NDUKK1NwZW5jZXIgCToJMTgJOgkyMDM5MQorU3RhcmtlIAk6CTE4CToJMjM1NTYKK1N0ZXViZW4gCToJMTgJOgkzMzIxNAorU3VsbGl2YW4gCToJMTgJOgkyMTc1MQorU3dpdHplcmxhbmQgCToJMTgJOgk5MDY1CitUaXBwZWNhbm9lIAk6CTE4CToJMTQ4OTU1CitUaXB0b24gCToJMTgJOgkxNjU3NworVW5pb24gCToJMTgJOgk3MzQ5CitWYW5kZXJidXJnaCAJOgkxOAk6CTE3MTkyMgorVmVybWlsbGlvbiAJOgkxOAk6CTE2Nzg4CitWaWdvIAk6CTE4CToJMTA1ODQ4CitXYWJhc2ggCToJMTgJOgkzNDk2MAorV2FycmVuIAk6CTE4CToJODQxOQorV2FycmljayAJOgkxOAk6CTUyMzgzCitXYXNoaW5ndG9uIAk6CTE4CToJMjcyMjMKK1dheW5lIAk6CTE4CToJNzEwOTcKK1dlbGxzIAk6CTE4CToJMjc2MDAKK1doaXRlIAk6CTE4CToJMjUyNjcKK1doaXRsZXkgCToJMTgJOgkzMDcwNworQWRhaXIgCToJMTkJOgk4MjQzCitBZGFtcyAJOgkxOQk6CTQ0ODIKK0FsbGFtYWtlZSAJOgkxOQk6CTE0Njc1CitBcHBhbm9vc2UgCToJMTkJOgkxMzcyMQorQXVkdWJvbiAJOgkxOQk6CTY4MzAKK0JlbnRvbiAJOgkxOQk6CTI1MzA4CitCbGFjayBIYXdrIAk6CTE5CToJMTI4MDEyCitCb29uZSAJOgkxOQk6CTI2MjI0CitCcmVtZXIgCToJMTkJOgkyMzMyNQorQnVjaGFuYW4gCToJMTkJOgkyMTA5MworQnVlbmEgVmlzdGEgCToJMTkJOgkyMDQxMQorQnV0bGVyIAk6CTE5CToJMTUzMDUKK0NhbGhvdW4gCToJMTkJOgkxMTExNQorQ2Fycm9sbCAJOgkxOQk6CTIxNDIxCitDYXNzIAk6CTE5CToJMTQ2ODQKK0NlZGFyIAk6CTE5CToJMTgxODcKK0NlcnJvIEdvcmRvIAk6CTE5CToJNDY0NDcKK0NoZXJva2VlIAk6CTE5CToJMTMwMzUKK0NoaWNrYXNhdyAJOgkxOQk6CTEzMDk1CitDbGFya2UgCToJMTkJOgk5MTMzCitDbGF5IAk6CTE5CToJMTczNzIKK0NsYXl0b24gCToJMTkJOgkxODY3OAorQ2xpbnRvbiAJOgkxOQk6CTUwMTQ5CitDcmF3Zm9yZCAJOgkxOQk6CTE2OTQyCitEYWxsYXMgCToJMTkJOgk0MDc1MAorRGF2aXMgCToJMTkJOgk4NTQxCitEZWNhdHVyIAk6CTE5CToJODY4OQorRGVsYXdhcmUgCToJMTkJOgkxODQwNAorRGVzIE1vaW5lcyAJOgkxOQk6CTQyMzUxCitEaWNraW5zb24gCToJMTkJOgkxNjQyNAorRHVidXF1ZSAJOgkxOQk6CTg5MTQzCitFbW1ldCAJOgkxOQk6CTExMDI3CitGYXlldHRlIAk6CTE5CToJMjIwMDgKK0Zsb3lkIAk6CTE5CToJMTY5MDAKK0ZyYW5rbGluIAk6CTE5CToJMTA3MDQKK0ZyZW1vbnQgCToJMTkJOgk4MDEwCitHcmVlbmUgCToJMTkJOgkxMDM2NgorR3J1bmR5IAk6CTE5CToJMTIzNjkKK0d1dGhyaWUgCToJMTkJOgkxMTM1MworSGFtaWx0b24gCToJMTkJOgkxNjQzOAorSGFuY29jayAJOgkxOQk6CTEyMTAwCitIYXJkaW4gCToJMTkJOgkxODgxMgorSGFycmlzb24gCToJMTkJOgkxNTY2NgorSGVucnkgCToJMTkJOgkyMDMzNgorSG93YXJkIAk6CTE5CToJOTkzMgorSHVtYm9sZHQgCToJMTkJOgkxMDM4MQorSWRhIAk6CTE5CToJNzgzNworSW93YSAJOgkxOQk6CTE1NjcxCitKYWNrc29uIAk6CTE5CToJMjAyOTYKK0phc3BlciAJOgkxOQk6CTM3MjEzCitKZWZmZXJzb24gCToJMTkJOgkxNjE4MQorSm9obnNvbiAJOgkxOQk6CTExMTAwNgorSm9uZXMgCToJMTkJOgkyMDIyMQorS2Vva3VrIAk6CTE5CToJMTE0MDAKK0tvc3N1dGggCToJMTkJOgkxNzE2MworTGVlIAk6CTE5CToJMzgwNTIKK0xpbm4gCToJMTkJOgkxOTE3MDEKK0xvdWlzYSAJOgkxOQk6CTEyMTgzCitMdWNhcyAJOgkxOQk6CTk0MjIKK0x5b24gCToJMTkJOgkxMTc2MworTWFkaXNvbiAJOgkxOQk6CTE0MDE5CitNYWhhc2thIAk6CTE5CToJMjIzMzUKK01hcmlvbiAJOgkxOQk6CTMyMDUyCitNYXJzaGFsbCAJOgkxOQk6CTM5MzExCitNaWxscyAJOgkxOQk6CTE0NTQ3CitNaXRjaGVsbCAJOgkxOQk6CTEwODc0CitNb25vbmEgCToJMTkJOgkxMDAyMAorTW9ucm9lIAk6CTE5CToJODAxNgorTW9udGdvbWVyeSAJOgkxOQk6CTExNzcxCitNdXNjYXRpbmUgCToJMTkJOgk0MTcyMgorTydCcmllbiAJOgkxOQk6CTE1MTAyCitPc2Nlb2xhIAk6CTE5CToJNzAwMworUGFnZSAJOgkxOQk6CTE2OTc2CitQYWxvIEFsdG8gCToJMTkJOgkxMDE0NworUGx5bW91dGggCToJMTkJOgkyNDg0OQorUG9jYWhvbnRhcyAJOgkxOQk6CTg2NjIKK1BvbGsgCToJMTkJOgkzNzQ2MDEKK1BvdHRhd2F0dGFtaWUgCToJMTkJOgk4NzcwNAorUG93ZXNoaWVrIAk6CTE5CToJMTg4MTUKK1Jpbmdnb2xkIAk6CTE5CToJNTQ2OQorU2FjIAk6CTE5CToJMTE1MjkKK1Njb3R0IAk6CTE5CToJMTU4NjY4CitTaGVsYnkgCToJMTkJOgkxMzE3MworU2lvdXggCToJMTkJOgkzMTU4OQorU3RvcnkgCToJMTkJOgk3OTk4MQorVGFtYSAJOgkxOQk6CTE4MTAzCitUYXlsb3IgCToJMTkJOgk2OTU4CitVbmlvbiAJOgkxOQk6CTEyMzA5CitWYW4gQnVyZW4gCToJMTkJOgk3ODA5CitXYXBlbGxvIAk6CTE5CToJMzYwNTEKK1dhcnJlbiAJOgkxOQk6CTQwNjcxCitXYXNoaW5ndG9uIAk6CTE5CToJMjA2NzAKK1dheW5lIAk6CTE5CToJNjczMAorV2Vic3RlciAJOgkxOQk6CTQwMjM1CitXaW5uZWJhZ28gCToJMTkJOgkxMTcyMworV2lubmVzaGllayAJOgkxOQk6CTIxMzEwCitXb29kYnVyeSAJOgkxOQk6CTEwMzg3NworV29ydGggCToJMTkJOgk3OTA5CitXcmlnaHQgCToJMTkJOgkxNDMzNAorQWxsZW4gCToJMjAJOgkxNDM4NQorQW5kZXJzb24gCToJMjAJOgk4MTEwCitBdGNoaXNvbiAJOgkyMAk6CTE2Nzc0CitCYXJiZXIgCToJMjAJOgk1MzA3CitCYXJ0b24gCToJMjAJOgkyODIwNQorQm91cmJvbiAJOgkyMAk6CTE1Mzc5CitCcm93biAJOgkyMAk6CTEwNzI0CitCdXRsZXIgCToJMjAJOgk1OTQ4MgorQ2hhc2UgCToJMjAJOgkzMDMwCitDaGF1dGF1cXVhIAk6CTIwCToJNDM1OQorQ2hlcm9rZWUgCToJMjAJOgkyMjYwNQorQ2hleWVubmUgCToJMjAJOgkzMTY1CitDbGFyayAJOgkyMAk6CTIzOTAKK0NsYXkgCToJMjAJOgk4ODIyCitDbG91ZCAJOgkyMAk6CTEwMjY4CitDb2ZmZXkgCToJMjAJOgk4ODY1CitDb21hbmNoZSAJOgkyMAk6CTE5NjcKK0Nvd2xleSAJOgkyMAk6CTM2MjkxCitDcmF3Zm9yZCAJOgkyMAk6CTM4MjQyCitEZWNhdHVyIAk6CTIwCToJMzQ3MgorRGlja2luc29uIAk6CTIwCToJMTkzNDQKK0RvbmlwaGFuIAk6CTIwCToJODI0OQorRG91Z2xhcyAJOgkyMAk6CTk5OTYyCitFZHdhcmRzIAk6CTIwCToJMzQ0OQorRWxrIAk6CTIwCToJMzI2MQorRWxsaXMgCToJMjAJOgkyNzUwNworRWxsc3dvcnRoIAk6CTIwCToJNjUyNQorRmlubmV5IAk6CTIwCToJNDA1MjMKK0ZvcmQgCToJMjAJOgkzMjQ1OAorRnJhbmtsaW4gCToJMjAJOgkyNDc4NAorR2VhcnkgCToJMjAJOgkyNzk0NworR292ZSAJOgkyMAk6CTMwNjgKK0dyYWhhbSAJOgkyMAk6CTI5NDYKK0dyYW50IAk6CTIwCToJNzkwOQorR3JheSAJOgkyMAk6CTU5MDQKK0dyZWVsZXkgCToJMjAJOgkxNTM0CitHcmVlbndvb2QgCToJMjAJOgk3NjczCitIYW1pbHRvbiAJOgkyMAk6CTI2NzAKK0hhcnBlciAJOgkyMAk6CTY1MzYKK0hhcnZleSAJOgkyMAk6CTMyODY5CitIYXNrZWxsIAk6CTIwCToJNDMwNworSG9kZ2VtYW4gCToJMjAJOgkyMDg1CitKYWNrc29uIAk6CTIwCToJMTI2NTcKK0plZmZlcnNvbiAJOgkyMAk6CTE4NDI2CitKZXdlbGwgCToJMjAJOgkzNzkxCitKb2huc29uIAk6CTIwCToJNDUxMDg2CitLZWFybnkgCToJMjAJOgk0NTMxCitLaW5nbWFuIAk6CTIwCToJODY3MworS2lvd2EgCToJMjAJOgkzMjc4CitMYWJldHRlIAk6CTIwCToJMjI4MzUKK0xhbmUgCToJMjAJOgkyMTU1CitMZWF2ZW53b3J0aCAJOgkyMAk6CTY4NjkxCitMaW5jb2xuIAk6CTIwCToJMzU3OAorTGlubiAJOgkyMAk6CTk1NzAKK0xvZ2FuIAk6CTIwCToJMzA0NgorTHlvbiAJOgkyMAk6CTM1OTM1CitNY1BoZXJzb24gCToJMjAJOgkyOTU1NAorTWFyaW9uIAk6CTIwCToJMTMzNjEKK01hcnNoYWxsIAk6CTIwCToJMTA5NjUKK01lYWRlIAk6CTIwCToJNDYzMQorTWlhbWkgCToJMjAJOgkyODM1MQorTWl0Y2hlbGwgCToJMjAJOgk2OTMyCitNb250Z29tZXJ5IAk6CTIwCToJMzYyNTIKK01vcnJpcyAJOgkyMAk6CTYxMDQKK01vcnRvbiAJOgkyMAk6CTM0OTYKK05lbWFoYSAJOgkyMAk6CTEwNzE3CitOZW9zaG8gCToJMjAJOgkxNjk5NworTmVzcyAJOgkyMAk6CTM0NTQKK05vcnRvbiAJOgkyMAk6CTU5NTMKK09zYWdlIAk6CTIwCToJMTY3MTIKK09zYm9ybmUgCToJMjAJOgk0NDUyCitPdHRhd2EgCToJMjAJOgk2MTYzCitQYXduZWUgCToJMjAJOgk3MjMzCitQaGlsbGlwcyAJOgkyMAk6CTYwMDEKK1BvdHRhd2F0b21pZSAJOgkyMAk6CTE4MjA5CitQcmF0dCAJOgkyMAk6CTk2NDcKK1Jhd2xpbnMgCToJMjAJOgkyOTY2CitSZW5vIAk6CTIwCToJNjQ3OTAKK1JlcHVibGljIAk6CTIwCToJNTgzNQorUmljZSAJOgkyMAk6CTEwNzYxCitSaWxleSAJOgkyMAk6CTYyODQzCitSb29rcyAJOgkyMAk6CTU2ODUKK1J1c2ggCToJMjAJOgkzNTUxCitSdXNzZWxsIAk6CTIwCToJNzM3MAorU2FsaW5lIAk6CTIwCToJNTM1OTcKK1Njb3R0IAk6CTIwCToJNTEyMAorU2VkZ3dpY2sgCToJMjAJOgk0NTI4NjkKK1Nld2FyZCAJOgkyMAk6CTIyNTEwCitTaGF3bmVlIAk6CTIwCToJMTY5ODcxCitTaGVyaWRhbiAJOgkyMAk6CTI4MTMKK1NoZXJtYW4gCToJMjAJOgk2NzYwCitTbWl0aCAJOgkyMAk6CTQ1MzYKK1N0YWZmb3JkIAk6CTIwCToJNDc4OQorU3RhbnRvbiAJOgkyMAk6CTI0MDYKK1N0ZXZlbnMgCToJMjAJOgk1NDYzCitTdW1uZXIgCToJMjAJOgkyNTk0NgorVGhvbWFzIAk6CTIwCToJODE4MAorVHJlZ28gCToJMjAJOgkzMzE5CitXYWJhdW5zZWUgCToJMjAJOgk2ODg1CitXYWxsYWNlIAk6CTIwCToJMTc0OQorV2FzaGluZ3RvbiAJOgkyMAk6CTY0ODMKK1dpY2hpdGEgCToJMjAJOgkyNTMxCitXaWxzb24gCToJMjAJOgkxMDMzMgorV29vZHNvbiAJOgkyMAk6CTM3ODgKK1d5YW5kb3R0ZSAJOgkyMAk6CTE1Nzg4MgorQWRhaXIgCToJMjEJOgkxNzI0NAorQWxsZW4gCToJMjEJOgkxNzgwMAorQW5kZXJzb24gCToJMjEJOgkxOTExMQorQmFsbGFyZCAJOgkyMQk6CTgyODYKK0JhcnJlbiAJOgkyMQk6CTM4MDMzCitCYXRoIAk6CTIxCToJMTEwODUKK0JlbGwgCToJMjEJOgkzMDA2MAorQm9vbmUgCToJMjEJOgk4NTk5MQorQm91cmJvbiAJOgkyMQk6CTE5MzYwCitCb3lkIAk6CTIxCToJNDk3NTIKK0JveWxlIAk6CTIxCToJMjc2OTcKK0JyYWNrZW4gCToJMjEJOgk4Mjc5CitCcmVhdGhpdHQgCToJMjEJOgkxNjEwMAorQnJlY2tpbnJpZGdlIAk6CTIxCToJMTg2NDgKK0J1bGxpdHQgCToJMjEJOgk2MTIzNgorQnV0bGVyIAk6CTIxCToJMTMwMTAKK0NhbGR3ZWxsIAk6CTIxCToJMTMwNjAKK0NhbGxvd2F5IAk6CTIxCToJMzQxNzcKK0NhbXBiZWxsIAk6CTIxCToJODg2MTYKK0Nhcmxpc2xlIAk6CTIxCToJNTM1MQorQ2Fycm9sbCAJOgkyMQk6CTEwMTU1CitDYXJ0ZXIgCToJMjEJOgkyNjg4OQorQ2FzZXkgCToJMjEJOgkxNTQ0NworQ2hyaXN0aWFuIAk6CTIxCToJNzIyNjUKK0NsYXJrIAk6CTIxCToJMzMxNDQKK0NsYXkgCToJMjEJOgkyNDU1NgorQ2xpbnRvbiAJOgkyMQk6CTk2MzQKK0NyaXR0ZW5kZW4gCToJMjEJOgk5Mzg0CitDdW1iZXJsYW5kIAk6CTIxCToJNzE0NworRGF2aWVzcyAJOgkyMQk6CTkxNTQ1CitFZG1vbnNvbiAJOgkyMQk6CTExNjQ0CitFbGxpb3R0IAk6CTIxCToJNjc0OAorRXN0aWxsIAk6CTIxCToJMTUzMDcKK0ZheWV0dGUgCToJMjEJOgkyNjA1MTIKK0ZsZW1pbmcgCToJMjEJOgkxMzc5MgorRmxveWQgCToJMjEJOgk0MjQ0MQorRnJhbmtsaW4gCToJMjEJOgk0NzY4NworRnVsdG9uIAk6CTIxCToJNzc1MgorR2FsbGF0aW4gCToJMjEJOgk3ODcwCitHYXJyYXJkIAk6CTIxCToJMTQ3OTIKK0dyYW50IAk6CTIxCToJMjIzODQKK0dyYXZlcyAJOgkyMQk6CTM3MDI4CitHcmF5c29uIAk6CTIxCToJMjQwNTMKK0dyZWVuIAk6CTIxCToJMTE1MTgKK0dyZWVudXAgCToJMjEJOgkzNjg5MQorSGFuY29jayAJOgkyMQk6CTgzOTIKK0hhcmRpbiAJOgkyMQk6CTk0MTc0CitIYXJsYW4gCToJMjEJOgkzMzIwMgorSGFycmlzb24gCToJMjEJOgkxNzk4MworSGFydCAJOgkyMQk6CTE3NDQ1CitIZW5kZXJzb24gCToJMjEJOgk0NDgyOQorSGVucnkgCToJMjEJOgkxNTA2MAorSGlja21hbiAJOgkyMQk6CTUyNjIKK0hvcGtpbnMgCToJMjEJOgk0NjUxOQorSmFja3NvbiAJOgkyMQk6CTEzNDk1CitKZWZmZXJzb24gCToJMjEJOgk2OTM2MDQKK0plc3NhbWluZSAJOgkyMQk6CTM5MDQxCitKb2huc29uIAk6CTIxCToJMjM0NDUKK0tlbnRvbiAJOgkyMQk6CTE1MTQ2NAorS25vdHQgCToJMjEJOgkxNzY0OQorS25veCAJOgkyMQk6CTMxNzk1CitMYXJ1ZSAJOgkyMQk6CTEzMzczCitMYXVyZWwgCToJMjEJOgk1MjcxNQorTGF3cmVuY2UgCToJMjEJOgkxNTU2OQorTGVlIAk6CTIxCToJNzkxNgorTGVzbGllIAk6CTIxCToJMTI0MDEKK0xldGNoZXIgCToJMjEJOgkyNTI3NworTGV3aXMgCToJMjEJOgkxNDA5MgorTGluY29sbiAJOgkyMQk6CTIzMzYxCitMaXZpbmdzdG9uIAk6CTIxCToJOTgwNAorTG9nYW4gCToJMjEJOgkyNjU3MworTHlvbiAJOgkyMQk6CTgwODAKK01jQ3JhY2tlbiAJOgkyMQk6CTY1NTE0CitNY0NyZWFyeSAJOgkyMQk6CTE3MDgwCitNY0xlYW4gCToJMjEJOgk5OTM4CitNYWRpc29uIAk6CTIxCToJNzA4NzIKK01hZ29mZmluIAk6CTIxCToJMTMzMzIKK01hcmlvbiAJOgkyMQk6CTE4MjEyCitNYXJzaGFsbCAJOgkyMQk6CTMwMTI1CitNYXJ0aW4gCToJMjEJOgkxMjU3OAorTWFzb24gCToJMjEJOgkxNjgwMAorTWVhZGUgCToJMjEJOgkyNjM0OQorTWVuaWZlZSAJOgkyMQk6CTY1NTYKK01lcmNlciAJOgkyMQk6CTIwODE3CitNZXRjYWxmZSAJOgkyMQk6CTEwMDM3CitNb25yb2UgCToJMjEJOgkxMTc1NgorTW9udGdvbWVyeSAJOgkyMQk6CTIyNTU0CitNb3JnYW4gCToJMjEJOgkxMzk0OAorTXVobGVuYmVyZyAJOgkyMQk6CTMxODM5CitOZWxzb24gCToJMjEJOgkzNzQ3NworTmljaG9sYXMgCToJMjEJOgk2ODEzCitPaGlvIAk6CTIxCToJMjI5MTYKK09sZGhhbSAJOgkyMQk6CTQ2MTc4CitPd2VuIAk6CTIxCToJMTA1NDcKK093c2xleSAJOgkyMQk6CTQ4NTgKK1BlbmRsZXRvbiAJOgkyMQk6CTE0MzkwCitQZXJyeSAJOgkyMQk6CTI5MzkwCitQaWtlIAk6CTIxCToJNjg3MzYKK1Bvd2VsbCAJOgkyMQk6CTEzMjM3CitQdWxhc2tpIAk6CTIxCToJNTYyMTcKK1JvYmVydHNvbiAJOgkyMQk6CTIyNjYKK1JvY2tjYXN0bGUgCToJMjEJOgkxNjU4MgorUm93YW4gCToJMjEJOgkyMjA5NAorUnVzc2VsbCAJOgkyMQk6CTE2MzE1CitTY290dCAJOgkyMQk6CTMzMDYxCitTaGVsYnkgCToJMjEJOgkzMzMzNworU2ltcHNvbiAJOgkyMQk6CTE2NDA1CitTcGVuY2VyIAk6CTIxCToJMTE3NjYKK1RheWxvciAJOgkyMQk6CTIyOTI3CitUb2RkIAk6CTIxCToJMTE5NzEKK1RyaWdnIAk6CTIxCToJMTI1OTcKK1RyaW1ibGUgCToJMjEJOgk4MTI1CitVbmlvbiAJOgkyMQk6CTE1NjM3CitXYXJyZW4gCToJMjEJOgk5MjUyMgorV2FzaGluZ3RvbiAJOgkyMQk6CTEwOTE2CitXYXluZSAJOgkyMQk6CTE5OTIzCitXZWJzdGVyIAk6CTIxCToJMTQxMjAKK1doaXRsZXkgCToJMjEJOgkzNTg2NQorV29sZmUgCToJMjEJOgk3MDY1CitXb29kZm9yZCAJOgkyMQk6CTIzMjA4CitBY2FkaWEgCToJMjIJOgk1ODg2MQorQWxsZW4gCToJMjIJOgkyNTQ0MAorQXNjZW5zaW9uIAk6CTIyCToJNzY2MjcKK0Fzc3VtcHRpb24gCToJMjIJOgkyMzM4OAorQXZveWVsbGVzIAk6CTIyCToJNDE0ODEKK0JlYXVyZWdhcmQgCToJMjIJOgkzMjk4NgorQmllbnZpbGxlIAk6CTIyCToJMTU3NTIKK0Jvc3NpZXIgCToJMjIJOgk5ODMxMAorQ2FkZG8gCToJMjIJOgkyNTIxNjEKK0NhbGNhc2lldSAJOgkyMgk6CTE4MzU3NworQ2FsZHdlbGwgCToJMjIJOgkxMDU2MAorQ2FtZXJvbiAJOgkyMgk6CTk5OTEKK0NhdGFob3VsYSAJOgkyMgk6CTEwOTIwCitDbGFpYm9ybmUgCToJMjIJOgkxNjg1MQorQ29uY29yZGlhIAk6CTIyCToJMjAyNDcKK0RlIFNvdG8gCToJMjIJOgkyNTQ5NAorRWFzdCBCYXRvbiBSb3VnZSAJOgkyMgk6CTQxMjg1MgorRWFzdCBDYXJyb2xsIAk6CTIyCToJOTQyMQorRWFzdCBGZWxpY2lhbmEgCToJMjIJOgkyMTM2MAorRXZhbmdlbGluZSAJOgkyMgk6CTM1NDM0CitGcmFua2xpbiAJOgkyMgk6CTIxMjYzCitHcmFudCAJOgkyMgk6CTE4Njk4CitJYmVyaWEgCToJMjIJOgk3MzI2NgorSWJlcnZpbGxlIAk6CTIyCToJMzMzMjAKK0phY2tzb24gCToJMjIJOgkxNTM5NworSmVmZmVyc29uIAk6CTIyCToJNDU1NDY2CitKZWZmZXJzb24gRGF2aXMgCToJMjIJOgkzMTQzNQorTGFmYXlldHRlIAk6CTIyCToJMTkwNTAzCitMYWZvdXJjaGUgCToJMjIJOgk4OTk3NAorTGEgU2FsbGUgCToJMjIJOgkxNDI4MgorTGluY29sbiAJOgkyMgk6CTQyNTA5CitMaXZpbmdzdG9uIAk6CTIyCToJOTE4MTQKK01hZGlzb24gCToJMjIJOgkxMzcyOAorTW9yZWhvdXNlIAk6CTIyCToJMzEwMjEKK05hdGNoaXRvY2hlcyAJOgkyMgk6CTM5MDgwCitPcmxlYW5zIAk6CTIyCToJNDg0Njc0CitPdWFjaGl0YSAJOgkyMgk6CTE0NzI1MAorUGxhcXVlbWluZXMgCToJMjIJOgkyNjc1NworUG9pbnRlIENvdXBlZSAJOgkyMgk6CTIyNzYzCitSYXBpZGVzIAk6CTIyCToJMTI2MzM3CitSZWQgUml2ZXIgCToJMjIJOgk5NjIyCitSaWNobGFuZCAJOgkyMgk6CTIwOTgxCitTYWJpbmUgCToJMjIJOgkyMzQ1OQorU3QuIEJlcm5hcmQgCToJMjIJOgk2NzIyOQorU3QuIENoYXJsZXMgCToJMjIJOgk0ODA3MgorU3QuIEhlbGVuYSAJOgkyMgk6CTEwNTI1CitTdC4gSmFtZXMgCToJMjIJOgkyMTIxNgorU3QuIEpvaG4gdGhlIEJhcHRpc3QgCToJMjIJOgk0MzA0NAorU3QuIExhbmRyeSAJOgkyMgk6CTg3NzAwCitTdC4gTWFydGluIAk6CTIyCToJNDg1ODMKK1N0LiBNYXJ5IAk6CTIyCToJNTM1MDAKK1N0LiBUYW1tYW55IAk6CTIyCToJMTkxMjY4CitUYW5naXBhaG9hIAk6CTIyCToJMTAwNTg4CitUZW5zYXMgCToJMjIJOgk2NjE4CitUZXJyZWJvbm5lIAk6CTIyCToJMTA0NTAzCitVbmlvbiAJOgkyMgk6CTIyODAzCitWZXJtaWxpb24gCToJMjIJOgk1MzgwNworVmVybm9uIAk6CTIyCToJNTI1MzEKK1dhc2hpbmd0b24gCToJMjIJOgk0MzkyNgorV2Vic3RlciAJOgkyMgk6CTQxODMxCitXZXN0IEJhdG9uIFJvdWdlIAk6CTIyCToJMjE2MDEKK1dlc3QgQ2Fycm9sbCAJOgkyMgk6CTEyMzE0CitXZXN0IEZlbGljaWFuYSAJOgkyMgk6CTE1MTExCitXaW5uIAk6CTIyCToJMTY4OTQKK0FuZHJvc2NvZ2dpbiAJOgkyMwk6CTEwMzc5MworQXJvb3N0b29rIAk6CTIzCToJNzM5MzgKK0N1bWJlcmxhbmQgCToJMjMJOgkyNjU2MTIKK0ZyYW5rbGluIAk6CTIzCToJMjk0NjcKK0hhbmNvY2sgCToJMjMJOgk1MTc5MQorS2VubmViZWMgCToJMjMJOgkxMTcxMTQKK0tub3ggCToJMjMJOgkzOTYxOAorTGluY29sbiAJOgkyMwk6CTMzNjE2CitPeGZvcmQgCToJMjMJOgk1NDc1NQorUGVub2JzY290IAk6CTIzCToJMTQ0OTE5CitQaXNjYXRhcXVpcyAJOgkyMwk6CTE3MjM1CitTYWdhZGFob2MgCToJMjMJOgkzNTIxNAorU29tZXJzZXQgCToJMjMJOgk1MDg4OAorV2FsZG8gCToJMjMJOgkzNjI4MAorV2FzaGluZ3RvbiAJOgkyMwk6CTMzOTQxCitZb3JrIAk6CTIzCToJMTg2NzQyCitBbGxlZ2FueSAJOgkyNAk6CTc0OTMwCitBbm5lIEFydW5kZWwgCToJMjQJOgk0ODk2NTYKK0JhbHRpbW9yZSAJOgkyNAk6CTc1NDI5MgorQ2FsdmVydCAJOgkyNAk6CTc0NTYzCitDYXJvbGluZSAJOgkyNAk6CTI5NzcyCitDYXJyb2xsIAk6CTI0CToJMTUwODk3CitDZWNpbCAJOgkyNAk6CTg1OTUxCitDaGFybGVzIAk6CTI0CToJMTIwNTQ2CitEb3JjaGVzdGVyIAk6CTI0CToJMzA2NzQKK0ZyZWRlcmljayAJOgkyNAk6CTE5NTI3NworR2FycmV0dCAJOgkyNAk6CTI5ODQ2CitIYXJmb3JkIAk6CTI0CToJMjE4NTkwCitIb3dhcmQgCToJMjQJOgkyNDc4NDIKK0tlbnQgCToJMjQJOgkxOTE5NworTW9udGdvbWVyeSAJOgkyNAk6CTg3MzM0MQorUHJpbmNlIEdlb3JnZSdzIAk6CTI0CToJODAxNTE1CitRdWVlbiBBbm5lJ3MgCToJMjQJOgk0MDU2MworU3QuIE1hcnkncyAJOgkyNAk6CTg2MjExCitTb21lcnNldCAJOgkyNAk6CTI0NzQ3CitUYWxib3QgCToJMjQJOgkzMzgxMgorV2FzaGluZ3RvbiAJOgkyNAk6CTEzMTkyMworV2ljb21pY28gCToJMjQJOgk4NDY0NAorV29yY2VzdGVyIAk6CTI0CToJNDY1NDMKK0JhbHRpbW9yZSBjaXR5CToJMjQJOgk2NTExNTQKK0Jhcm5zdGFibGUgCToJMjUJOgkyMjIyMzAKK0JlcmtzaGlyZSAJOgkyNQk6CTEzNDk1MworQnJpc3RvbCAJOgkyNQk6CTUzNDY3OAorRHVrZXMgCToJMjUJOgkxNDk4NworRXNzZXggCToJMjUJOgk3MjM0MTkKK0ZyYW5rbGluIAk6CTI1CToJNzE1MzUKK0hhbXBkZW4gCToJMjUJOgk0NTYyMjgKK0hhbXBzaGlyZSAJOgkyNQk6CTE1MjI1MQorTWlkZGxlc2V4IAk6CTI1CToJMTQ2NTM5NgorTmFudHVja2V0IAk6CTI1CToJOTUyMAorTm9yZm9sayAJOgkyNQk6CTY1MDMwOAorUGx5bW91dGggCToJMjUJOgk0NzI4MjIKK1N1ZmZvbGsgCToJMjUJOgk2ODk4MDcKK1dvcmNlc3RlciAJOgkyNQk6CTc1MDk2MworQWxjb25hIAk6CTI2CToJMTE3MTkKK0FsZ2VyIAk6CTI2CToJOTg2MgorQWxsZWdhbiAJOgkyNgk6CTEwNTY2NQorQWxwZW5hIAk6CTI2CToJMzEzMTQKK0FudHJpbSAJOgkyNgk6CTIzMTEwCitBcmVuYWMgCToJMjYJOgkxNzI2OQorQmFyYWdhIAk6CTI2CToJODc0NgorQmFycnkgCToJMjYJOgk1Njc1NQorQmF5IAk6CTI2CToJMTEwMTU3CitCZW56aWUgCToJMjYJOgkxNTk5OAorQmVycmllbiAJOgkyNgk6CTE2MjQ1MworQnJhbmNoIAk6CTI2CToJNDU3ODcKK0NhbGhvdW4gCToJMjYJOgkxMzc5ODUKK0Nhc3MgCToJMjYJOgk1MTEwNAorQ2hhcmxldm9peCAJOgkyNgk6CTI2MDkwCitDaGVib3lnYW4gCToJMjYJOgkyNjQ0OAorQ2hpcHBld2EgCToJMjYJOgkzODU0MworQ2xhcmUgCToJMjYJOgkzMTI1MgorQ2xpbnRvbiAJOgkyNgk6CTY0NzUzCitDcmF3Zm9yZCAJOgkyNgk6CTE0MjczCitEZWx0YSAJOgkyNgk6CTM4NTIwCitEaWNraW5zb24gCToJMjYJOgkyNzQ3MgorRWF0b24gCToJMjYJOgkxMDM2NTUKK0VtbWV0IAk6CTI2CToJMzE0MzcKK0dlbmVzZWUgCToJMjYJOgk0MzYxNDEKK0dsYWR3aW4gCToJMjYJOgkyNjAyMworR29nZWJpYyAJOgkyNgk6CTE3MzcwCitHcmFuZCBUcmF2ZXJzZSAJOgkyNgk6CTc3NjU0CitHcmF0aW90IAk6CTI2CToJNDIyODUKK0hpbGxzZGFsZSAJOgkyNgk6CTQ2NTI3CitIb3VnaHRvbiAJOgkyNgk6CTM2MDE2CitIdXJvbiAJOgkyNgk6CTM2MDc5CitJbmdoYW0gCToJMjYJOgkyNzkzMjAKK0lvbmlhIAk6CTI2CToJNjE1MTgKK0lvc2NvIAk6CTI2CToJMjczMzkKK0lyb24gCToJMjYJOgkxMzEzOAorSXNhYmVsbGEgCToJMjYJOgk2MzM1MQorSmFja3NvbiAJOgkyNgk6CTE1ODQyMgorS2FsYW1hem9vIAk6CTI2CToJMjM4NjAzCitLYWxrYXNrYSAJOgkyNgk6CTE2NTcxCitLZW50IAk6CTI2CToJNTc0MzM1CitLZXdlZW5hdyAJOgkyNgk6CTIzMDEKK0xha2UgCToJMjYJOgkxMTMzMworTGFwZWVyIAk6CTI2CToJODc5MDQKK0xlZWxhbmF1IAk6CTI2CToJMjExMTkKK0xlbmF3ZWUgCToJMjYJOgk5ODg5MAorTGl2aW5nc3RvbiAJOgkyNgk6CTE1Njk1MQorTHVjZSAJOgkyNgk6CTcwMjQKK01hY2tpbmFjIAk6CTI2CToJMTE5NDMKK01hY29tYiAJOgkyNgk6CTc4ODE0OQorTWFuaXN0ZWUgCToJMjYJOgkyNDUyNworTWFycXVldHRlIAk6CTI2CToJNjQ2MzQKK01hc29uIAk6CTI2CToJMjgyNzQKK01lY29zdGEgCToJMjYJOgk0MDU1MworTWVub21pbmVlIAk6CTI2CToJMjUzMjYKK01pZGxhbmQgCToJMjYJOgk4Mjg3NAorTWlzc2F1a2VlIAk6CTI2CToJMTQ0NzgKK01vbnJvZSAJOgkyNgk6CTE0NTk0NQorTW9udGNhbG0gCToJMjYJOgk2MTI2NgorTW9udG1vcmVuY3kgCToJMjYJOgkxMDMxNQorTXVza2Vnb24gCToJMjYJOgkxNzAyMDAKK05ld2F5Z28gCToJMjYJOgk0Nzg3NAorT2FrbGFuZCAJOgkyNgk6CTExOTQxNTYKK09jZWFuYSAJOgkyNgk6CTI2ODczCitPZ2VtYXcgCToJMjYJOgkyMTY0NQorT250b25hZ29uIAk6CTI2CToJNzgxOAorT3NjZW9sYSAJOgkyNgk6CTIzMTk3CitPc2NvZGEgCToJMjYJOgk5NDE4CitPdHNlZ28gCToJMjYJOgkyMzMwMQorT3R0YXdhIAk6CTI2CToJMjM4MzE0CitQcmVzcXVlIElzbGUgCToJMjYJOgkxNDQxMQorUm9zY29tbW9uIAk6CTI2CToJMjU0NjkKK1NhZ2luYXcgCToJMjYJOgkyMTAwMzkKK1N0LiBDbGFpciAJOgkyNgk6CTE2NDIzNQorU3QuIEpvc2VwaCAJOgkyNgk6CTYyNDIyCitTYW5pbGFjIAk6CTI2CToJNDQ1NDcKK1NjaG9vbGNyYWZ0IAk6CTI2CToJODkwMworU2hpYXdhc3NlZSAJOgkyNgk6CTcxNjg3CitUdXNjb2xhIAk6CTI2CToJNTgyNjYKK1ZhbiBCdXJlbiAJOgkyNgk6CTc2MjYzCitXYXNodGVuYXcgCToJMjYJOgkzMjI4OTUKK1dheW5lIAk6CTI2CToJMjA2MTE2MgorV2V4Zm9yZCAJOgkyNgk6CTMwNDg0CitBaXRraW4gCToJMjcJOgkxNTMwMQorQW5va2EgCToJMjcJOgkyOTgwODQKK0JlY2tlciAJOgkyNwk6CTMwMDAwCitCZWx0cmFtaSAJOgkyNwk6CTM5NjUwCitCZW50b24gCToJMjcJOgkzNDIyNgorQmlnIFN0b25lIAk6CTI3CToJNTgyMAorQmx1ZSBFYXJ0aCAJOgkyNwk6CTU1OTQxCitCcm93biAJOgkyNwk6CTI2OTExCitDYXJsdG9uIAk6CTI3CToJMzE2NzEKK0NhcnZlciAJOgkyNwk6CTcwMjA1CitDYXNzIAk6CTI3CToJMjcxNTAKK0NoaXBwZXdhIAk6CTI3CToJMTMwODgKK0NoaXNhZ28gCToJMjcJOgk0MTEwMQorQ2xheSAJOgkyNwk6CTUxMjI5CitDbGVhcndhdGVyIAk6CTI3CToJODQyMworQ29vayAJOgkyNwk6CTUxNjgKK0NvdHRvbndvb2QgCToJMjcJOgkxMjE2NworQ3JvdyBXaW5nIAk6CTI3CToJNTUwOTkKK0Rha290YSAJOgkyNwk6CTM1NTkwNAorRG9kZ2UgCToJMjcJOgkxNzczMQorRG91Z2xhcyAJOgkyNwk6CTMyODIxCitGYXJpYmF1bHQgCToJMjcJOgkxNjE4MQorRmlsbG1vcmUgCToJMjcJOgkyMTEyMgorRnJlZWJvcm4gCToJMjcJOgkzMjU4NAorR29vZGh1ZSAJOgkyNwk6CTQ0MTI3CitHcmFudCAJOgkyNwk6CTYyODkKK0hlbm5lcGluIAk6CTI3CToJMTExNjIwMAorSG91c3RvbiAJOgkyNwk6CTE5NzE4CitIdWJiYXJkIAk6CTI3CToJMTgzNzYKK0lzYW50aSAJOgkyNwk6CTMxMjg3CitJdGFzY2EgCToJMjcJOgk0Mzk5MgorSmFja3NvbiAJOgkyNwk6CTExMjY4CitLYW5hYmVjIAk6CTI3CToJMTQ5OTYKK0thbmRpeW9oaSAJOgkyNwk6CTQxMjAzCitLaXR0c29uIAk6CTI3CToJNTI4NQorS29vY2hpY2hpbmcgCToJMjcJOgkxNDM1NQorTGFjIHF1aSBQYXJsZSAJOgkyNwk6CTgwNjcKK0xha2UgCToJMjcJOgkxMTA1OAorTGFrZSBvZiB0aGUgV29vZHMgCToJMjcJOgk0NTIyCitMZSBTdWV1ciAJOgkyNwk6CTI1NDI2CitMaW5jb2xuIAk6CTI3CToJNjQyOQorTHlvbiAJOgkyNwk6CTI1NDI1CitNY0xlb2QgCToJMjcJOgkzNDg5OAorTWFobm9tZW4gCToJMjcJOgk1MTkwCitNYXJzaGFsbCAJOgkyNwk6CTEwMTU1CitNYXJ0aW4gCToJMjcJOgkyMTgwMgorTWVla2VyIAk6CTI3CToJMjI2NDQKK01pbGxlIExhY3MgCToJMjcJOgkyMjMzMAorTW9ycmlzb24gCToJMjcJOgkzMTcxMgorTW93ZXIgCToJMjcJOgkzODYwMworTXVycmF5IAk6CTI3CToJOTE2NQorTmljb2xsZXQgCToJMjcJOgkyOTc3MQorTm9ibGVzIAk6CTI3CToJMjA4MzIKK05vcm1hbiAJOgkyNwk6CTc0NDIKK09sbXN0ZWQgCToJMjcJOgkxMjQyNzcKK090dGVyIFRhaWwgCToJMjcJOgk1NzE1OQorUGVubmluZ3RvbiAJOgkyNwk6CTEzNTg0CitQaW5lIAk6CTI3CToJMjY1MzAKK1BpcGVzdG9uZSAJOgkyNwk6CTk4OTUKK1BvbGsgCToJMjcJOgkzMTM2OQorUG9wZSAJOgkyNwk6CTExMjM2CitSYW1zZXkgCToJMjcJOgk1MTEwMzUKK1JlZCBMYWtlIAk6CTI3CToJNDI5OQorUmVkd29vZCAJOgkyNwk6CTE2ODE1CitSZW52aWxsZSAJOgkyNwk6CTE3MTU0CitSaWNlIAk6CTI3CToJNTY2NjUKK1JvY2sgCToJMjcJOgk5NzIxCitSb3NlYXUgCToJMjcJOgkxNjMzOAorU3QuIExvdWlzIAk6CTI3CToJMjAwNTI4CitTY290dCAJOgkyNwk6CTg5NDk4CitTaGVyYnVybmUgCToJMjcJOgk2NDQxNworU2libGV5IAk6CTI3CToJMTUzNTYKK1N0ZWFybnMgCToJMjcJOgkxMzMxNjYKK1N0ZWVsZSAJOgkyNwk6CTMzNjgwCitTdGV2ZW5zIAk6CTI3CToJMTAwNTMKK1N3aWZ0IAk6CTI3CToJMTE5NTYKK1RvZGQgCToJMjcJOgkyNDQyNgorVHJhdmVyc2UgCToJMjcJOgk0MTM0CitXYWJhc2hhIAk6CTI3CToJMjE2MTAKK1dhZGVuYSAJOgkyNwk6CTEzNzEzCitXYXNlY2EgCToJMjcJOgkxOTUyNgorV2FzaGluZ3RvbiAJOgkyNwk6CTIwMTEzMAorV2F0b253YW4gCToJMjcJOgkxMTg3NgorV2lsa2luIAk6CTI3CToJNzEzOAorV2lub25hIAk6CTI3CToJNDk5ODUKK1dyaWdodCAJOgkyNwk6CTg5OTg2CitZZWxsb3cgTWVkaWNpbmUgCToJMjcJOgkxMTA4MAorQWRhbXMgCToJMjgJOgkzNDM0MAorQWxjb3JuIAk6CTI4CToJMzQ1NTgKK0FtaXRlIAk6CTI4CToJMTM1OTkKK0F0dGFsYSAJOgkyOAk6CTE5NjYxCitCZW50b24gCToJMjgJOgk4MDI2CitCb2xpdmFyIAk6CTI4CToJNDA2MzMKK0NhbGhvdW4gCToJMjgJOgkxNTA2OQorQ2Fycm9sbCAJOgkyOAk6CTEwNzY5CitDaGlja2FzYXcgCToJMjgJOgkxOTQ0MAorQ2hvY3RhdyAJOgkyOAk6CTk3NTgKK0NsYWlib3JuZSAJOgkyOAk6CTExODMxCitDbGFya2UgCToJMjgJOgkxNzk1NQorQ2xheSAJOgkyOAk6CTIxOTc5CitDb2Fob21hIAk6CTI4CToJMzA2MjIKK0NvcGlhaCAJOgkyOAk6CTI4NzU3CitDb3Zpbmd0b24gCToJMjgJOgkxOTQwNworRGVTb3RvIAk6CTI4CToJMTA3MTk5CitGb3JyZXN0IAk6CTI4CToJNzI2MDQKK0ZyYW5rbGluIAk6CTI4CToJODQ0OAorR2VvcmdlIAk6CTI4CToJMTkxNDQKK0dyZWVuZSAJOgkyOAk6CTEzMjk5CitHcmVuYWRhIAk6CTI4CToJMjMyNjMKK0hhbmNvY2sgCToJMjgJOgk0Mjk2NworSGFycmlzb24gCToJMjgJOgkxODk2MDEKK0hpbmRzIAk6CTI4CToJMjUwODAwCitIb2xtZXMgCToJMjgJOgkyMTYwOQorSHVtcGhyZXlzIAk6CTI4CToJMTEyMDYKK0lzc2FxdWVuYSAJOgkyOAk6CTIyNzQKK0l0YXdhbWJhIAk6CTI4CToJMjI3NzAKK0phY2tzb24gCToJMjgJOgkxMzE0MjAKK0phc3BlciAJOgkyOAk6CTE4MTQ5CitKZWZmZXJzb24gCToJMjgJOgk5NzQwCitKZWZmZXJzb24gRGF2aXMgCToJMjgJOgkxMzk2MgorSm9uZXMgCToJMjgJOgk2NDk1OAorS2VtcGVyIAk6CTI4CToJMTA0NTMKK0xhZmF5ZXR0ZSAJOgkyOAk6CTM4NzQ0CitMYW1hciAJOgkyOAk6CTM5MDcwCitMYXVkZXJkYWxlIAk6CTI4CToJNzgxNjEKK0xhd3JlbmNlIAk6CTI4CToJMTMyNTgKK0xlYWtlIAk6CTI4CToJMjA5NDAKK0xlZSAJOgkyOAk6CTc1NzU1CitMZWZsb3JlIAk6CTI4CToJMzc5NDcKK0xpbmNvbG4gCToJMjgJOgkzMzE2NgorTG93bmRlcyAJOgkyOAk6CTYxNTg2CitNYWRpc29uIAk6CTI4CToJNzQ2NzQKK01hcmlvbiAJOgkyOAk6CTI1NTk1CitNYXJzaGFsbCAJOgkyOAk6CTM0OTkzCitNb25yb2UgCToJMjgJOgkzODAxNAorTW9udGdvbWVyeSAJOgkyOAk6CTEyMTg5CitOZXNob2JhIAk6CTI4CToJMjg2ODQKK05ld3RvbiAJOgkyOAk6CTIxODM4CitOb3h1YmVlIAk6CTI4CToJMTI1NDgKK09rdGliYmVoYSAJOgkyOAk6CTQyOTAyCitQYW5vbGEgCToJMjgJOgkzNDI3NAorUGVhcmwgUml2ZXIgCToJMjgJOgk0ODYyMQorUGVycnkgCToJMjgJOgkxMjEzOAorUGlrZSAJOgkyOAk6CTM4OTQwCitQb250b3RvYyAJOgkyOAk6CTI2NzI2CitQcmVudGlzcyAJOgkyOAk6CTI1NTU2CitRdWl0bWFuIAk6CTI4CToJMTAxMTcKK1JhbmtpbiAJOgkyOAk6CTExNTMyNworU2NvdHQgCToJMjgJOgkyODQyMworU2hhcmtleSAJOgkyOAk6CTY1ODAKK1NpbXBzb24gCToJMjgJOgkyNzYzOQorU21pdGggCToJMjgJOgkxNjE4MgorU3RvbmUgCToJMjgJOgkxMzYyMgorU3VuZmxvd2VyIAk6CTI4CToJMzQzNjkKK1RhbGxhaGF0Y2hpZSAJOgkyOAk6CTE0OTAzCitUYXRlIAk6CTI4CToJMjUzNzAKK1RpcHBhaCAJOgkyOAk6CTIwODI2CitUaXNob21pbmdvIAk6CTI4CToJMTkxNjMKK1R1bmljYSAJOgkyOAk6CTkyMjcKK1VuaW9uIAk6CTI4CToJMjUzNjIKK1dhbHRoYWxsIAk6CTI4CToJMTUxNTYKK1dhcnJlbiAJOgkyOAk6CTQ5NjQ0CitXYXNoaW5ndG9uIAk6CTI4CToJNjI5NzcKK1dheW5lIAk6CTI4CToJMjEyMTYKK1dlYnN0ZXIgCToJMjgJOgkxMDI5NAorV2lsa2luc29uIAk6CTI4CToJMTAzMTIKK1dpbnN0b24gCToJMjgJOgkyMDE2MAorWWFsb2J1c2hhIAk6CTI4CToJMTMwNTEKK1lhem9vIAk6CTI4CToJMjgxNDkKK0FkYWlyIAk6CTI5CToJMjQ5NzcKK0FuZHJldyAJOgkyOQk6CTE2NDkyCitBdGNoaXNvbiAJOgkyOQk6CTY0MzAKK0F1ZHJhaW4gCToJMjkJOgkyNTg1MworQmFycnkgCToJMjkJOgkzNDAxMAorQmFydG9uIAk6CTI5CToJMTI1NDEKK0JhdGVzIAk6CTI5CToJMTY2NTMKK0JlbnRvbiAJOgkyOQk6CTE3MTgwCitCb2xsaW5nZXIgCToJMjkJOgkxMjAyOQorQm9vbmUgCToJMjkJOgkxMzU0NTQKK0J1Y2hhbmFuIAk6CTI5CToJODU5OTgKK0J1dGxlciAJOgkyOQk6CTQwODY3CitDYWxkd2VsbCAJOgkyOQk6CTg5NjkKK0NhbGxhd2F5IAk6CTI5CToJNDA3NjYKK0NhbWRlbiAJOgkyOQk6CTM3MDUxCitDYXBlIEdpcmFyZGVhdSAJOgkyOQk6CTY4NjkzCitDYXJyb2xsIAk6CTI5CToJMTAyODUKK0NhcnRlciAJOgkyOQk6CTU5NDEKK0Nhc3MgCToJMjkJOgk4MjA5MgorQ2VkYXIgCToJMjkJOgkxMzczMworQ2hhcml0b24gCToJMjkJOgk4NDM4CitDaHJpc3RpYW4gCToJMjkJOgk1NDI4NQorQ2xhcmsgCToJMjkJOgk3NDE2CitDbGF5IAk6CTI5CToJMTg0MDA2CitDbGludG9uIAk6CTI5CToJMTg5NzkKK0NvbGUgCToJMjkJOgk3MTM5NworQ29vcGVyIAk6CTI5CToJMTY2NzAKK0NyYXdmb3JkIAk6CTI5CToJMjI4MDQKK0RhZGUgCToJMjkJOgk3OTIzCitEYWxsYXMgCToJMjkJOgkxNTY2MQorRGF2aWVzcyAJOgkyOQk6CTgwMTYKK0RlS2FsYiAJOgkyOQk6CTExNTk3CitEZW50IAk6CTI5CToJMTQ5MjcKK0RvdWdsYXMgCToJMjkJOgkxMzA4NAorRHVua2xpbiAJOgkyOQk6CTMzMTU1CitGcmFua2xpbiAJOgkyOQk6CTkzODA3CitHYXNjb25hZGUgCToJMjkJOgkxNTM0MgorR2VudHJ5IAk6CTI5CToJNjg2MQorR3JlZW5lIAk6CTI5CToJMjQwMzkxCitHcnVuZHkgCToJMjkJOgkxMDQzMgorSGFycmlzb24gCToJMjkJOgk4ODUwCitIZW5yeSAJOgkyOQk6CTIxOTk3CitIaWNrb3J5IAk6CTI5CToJODk0MAorSG9sdCAJOgkyOQk6CTUzNTEKK0hvd2FyZCAJOgkyOQk6CTEwMjEyCitIb3dlbGwgCToJMjkJOgkzNzIzOAorSXJvbiAJOgkyOQk6CTEwNjk3CitKYWNrc29uIAk6CTI5CToJNjU0ODgwCitKYXNwZXIgCToJMjkJOgkxMDQ2ODYKK0plZmZlcnNvbiAJOgkyOQk6CTE5ODA5OQorSm9obnNvbiAJOgkyOQk6CTQ4MjU4CitLbm94IAk6CTI5CToJNDM2MQorTGFjbGVkZSAJOgkyOQk6CTMyNTEzCitMYWZheWV0dGUgCToJMjkJOgkzMjk2MAorTGF3cmVuY2UgCToJMjkJOgkzNTIwNAorTGV3aXMgCToJMjkJOgkxMDQ5NAorTGluY29sbiAJOgkyOQk6CTM4OTQ0CitMaW5uIAk6CTI5CToJMTM3NTQKK0xpdmluZ3N0b24gCToJMjkJOgkxNDU1OAorTWNEb25hbGQgCToJMjkJOgkyMTY4MQorTWFjb24gCToJMjkJOgkxNTc2MgorTWFkaXNvbiAJOgkyOQk6CTExODAwCitNYXJpZXMgCToJMjkJOgk4OTAzCitNYXJpb24gCToJMjkJOgkyODI4OQorTWVyY2VyIAk6CTI5CToJMzc1NworTWlsbGVyIAk6CTI5CToJMjM1NjQKK01pc3Npc3NpcHBpIAk6CTI5CToJMTM0MjcKK01vbml0ZWF1IAk6CTI5CToJMTQ4MjcKK01vbnJvZSAJOgkyOQk6CTkzMTEKK01vbnRnb21lcnkgCToJMjkJOgkxMjEzNgorTW9yZ2FuIAk6CTI5CToJMTkzMDkKK05ldyBNYWRyaWQgCToJMjkJOgkxOTc2MAorTmV3dG9uIAk6CTI5CToJNTI2MzYKK05vZGF3YXkgCToJMjkJOgkyMTkxMgorT3JlZ29uIAk6CTI5CToJMTAzNDQKK09zYWdlIAk6CTI5CToJMTMwNjIKK096YXJrIAk6CTI5CToJOTU0MgorUGVtaXNjb3QgCToJMjkJOgkyMDA0NworUGVycnkgCToJMjkJOgkxODEzMgorUGV0dGlzIAk6CTI5CToJMzk0MDMKK1BoZWxwcyAJOgkyOQk6CTM5ODI1CitQaWtlIAk6CTI5CToJMTgzNTEKK1BsYXR0ZSAJOgkyOQk6CTczNzgxCitQb2xrIAk6CTI5CToJMjY5OTIKK1B1bGFza2kgCToJMjkJOgk0MTE2NQorUHV0bmFtIAk6CTI5CToJNTIyMworUmFsbHMgCToJMjkJOgk5NjI2CitSYW5kb2xwaCAJOgkyOQk6CTI0NjYzCitSYXkgCToJMjkJOgkyMzM1NAorUmV5bm9sZHMgCToJMjkJOgk2Njg5CitSaXBsZXkgCToJMjkJOgkxMzUwOQorU3QuIENoYXJsZXMgCToJMjkJOgkyODM4ODMKK1N0LiBDbGFpciAJOgkyOQk6CTk2NTIKK1N0ZS4gR2VuZXZpZXZlIAk6CTI5CToJMTc4NDIKK1N0LiBGcmFuY29pcyAJOgkyOQk6CTU1NjQxCitTdC4gTG91aXMgCToJMjkJOgkxMDE2MzE1CitTYWxpbmUgCToJMjkJOgkyMzc1NgorU2NodXlsZXIgCToJMjkJOgk0MTcwCitTY290bGFuZCAJOgkyOQk6CTQ5ODMKK1Njb3R0IAk6CTI5CToJNDA0MjIKK1NoYW5ub24gCToJMjkJOgk4MzI0CitTaGVsYnkgCToJMjkJOgk2Nzk5CitTdG9kZGFyZCAJOgkyOQk6CTI5NzA1CitTdG9uZSAJOgkyOQk6CTI4NjU4CitTdWxsaXZhbiAJOgkyOQk6CTcyMTkKK1RhbmV5IAk6CTI5CToJMzk3MDMKK1RleGFzIAk6CTI5CToJMjMwMDMKK1Zlcm5vbiAJOgkyOQk6CTIwNDU0CitXYXJyZW4gCToJMjkJOgkyNDUyNQorV2FzaGluZ3RvbiAJOgkyOQk6CTIzMzQ0CitXYXluZSAJOgkyOQk6CTEzMjU5CitXZWJzdGVyIAk6CTI5CToJMzEwNDUKK1dvcnRoIAk6CTI5CToJMjM4MgorV3JpZ2h0IAk6CTI5CToJMTc5NTUKK1N0LiBMb3VpcyBjaXR5CToJMjkJOgkzNDgxODkKK0JlYXZlcmhlYWQgCToJMzAJOgk5MjAyCitCaWcgSG9ybiAJOgkzMAk6CTEyNjcxCitCbGFpbmUgCToJMzAJOgk3MDA5CitCcm9hZHdhdGVyIAk6CTMwCToJNDM4NQorQ2FyYm9uIAk6CTMwCToJOTU1MgorQ2FydGVyIAk6CTMwCToJMTM2MAorQ2FzY2FkZSAJOgkzMAk6CTgwMzU3CitDaG91dGVhdSAJOgkzMAk6CTU5NzAKK0N1c3RlciAJOgkzMAk6CTExNjk2CitEYW5pZWxzIAk6CTMwCToJMjAxNworRGF3c29uIAk6CTMwCToJOTA1OQorRGVlciBMb2RnZSAJOgkzMAk6CTk0MTcKK0ZhbGxvbiAJOgkzMAk6CTI4MzcKK0Zlcmd1cyAJOgkzMAk6CTExODkzCitGbGF0aGVhZCAJOgkzMAk6CTc0NDcxCitHYWxsYXRpbiAJOgkzMAk6CTY3ODMxCitHYXJmaWVsZCAJOgkzMAk6CTEyNzkKK0dsYWNpZXIgCToJMzAJOgkxMzI0NworR29sZGVuIFZhbGxleSAJOgkzMAk6CTEwNDIKK0dyYW5pdGUgCToJMzAJOgkyODMwCitIaWxsIAk6CTMwCToJMTY2NzMKK0plZmZlcnNvbiAJOgkzMAk6CTEwMDQ5CitKdWRpdGggQmFzaW4gCToJMzAJOgkyMzI5CitMYWtlIAk6CTMwCToJMjY1MDcKK0xld2lzIGFuZCBDbGFyayAJOgkzMAk6CTU1NzE2CitMaWJlcnR5IAk6CTMwCToJMjE1OAorTGluY29sbiAJOgkzMAk6CTE4ODM3CitNY0NvbmUgCToJMzAJOgkxOTc3CitNYWRpc29uIAk6CTMwCToJNjg1MQorTWVhZ2hlciAJOgkzMAk6CTE5MzIKK01pbmVyYWwgCToJMzAJOgkzODg0CitNaXNzb3VsYSAJOgkzMAk6CTk1ODAyCitNdXNzZWxzaGVsbCAJOgkzMAk6CTQ0OTcKK1BhcmsgCToJMzAJOgkxNTY5NAorUGV0cm9sZXVtIAk6CTMwCToJNDkzCitQaGlsbGlwcyAJOgkzMAk6CTQ2MDEKK1BvbmRlcmEgCToJMzAJOgk2NDI0CitQb3dkZXIgUml2ZXIgCToJMzAJOgkxODU4CitQb3dlbGwgCToJMzAJOgk3MTgwCitQcmFpcmllIAk6CTMwCToJMTE5OQorUmF2YWxsaSAJOgkzMAk6CTM2MDcwCitSaWNobGFuZCAJOgkzMAk6CTk2NjcKK1Jvb3NldmVsdCAJOgkzMAk6CTEwNjIwCitSb3NlYnVkIAk6CTMwCToJOTM4MworU2FuZGVycyAJOgkzMAk6CTEwMjI3CitTaGVyaWRhbiAJOgkzMAk6CTQxMDUKK1NpbHZlciBCb3cgCToJMzAJOgkzNDYwNgorU3RpbGx3YXRlciAJOgkzMAk6CTgxOTUKK1N3ZWV0IEdyYXNzIAk6CTMwCToJMzYwOQorVGV0b24gCToJMzAJOgk2NDQ1CitUb29sZSAJOgkzMAk6CTUyNjcKK1RyZWFzdXJlIAk6CTMwCToJODYxCitWYWxsZXkgCToJMzAJOgk3Njc1CitXaGVhdGxhbmQgCToJMzAJOgkyMjU5CitXaWJhdXggCToJMzAJOgkxMDY4CitZZWxsb3dzdG9uZSAJOgkzMAk6CTEyOTM1MgorQWRhbXMgCToJMzEJOgkzMTE1MQorQW50ZWxvcGUgCToJMzEJOgk3NDUyCitBcnRodXIgCToJMzEJOgk0NDQKK0Jhbm5lciAJOgkzMQk6CTgxOQorQmxhaW5lIAk6CTMxCToJNTgzCitCb29uZSAJOgkzMQk6CTYyNTkKK0JveCBCdXR0ZSAJOgkzMQk6CTEyMTU4CitCb3lkIAk6CTMxCToJMjQzOAorQnJvd24gCToJMzEJOgkzNTI1CitCdWZmYWxvIAk6CTMxCToJNDIyNTkKK0J1cnQgCToJMzEJOgk3NzkxCitCdXRsZXIgCToJMzEJOgk4NzY3CitDYXNzIAk6CTMxCToJMjQzMzQKK0NlZGFyIAk6CTMxCToJOTYxNQorQ2hhc2UgCToJMzEJOgk0MDY4CitDaGVycnkgCToJMzEJOgk2MTQ4CitDaGV5ZW5uZSAJOgkzMQk6CTk4MzAKK0NsYXkgCToJMzEJOgk3MDM5CitDb2xmYXggCToJMzEJOgkxMDQ0MQorQ3VtaW5nIAk6CTMxCToJMTAyMDMKK0N1c3RlciAJOgkzMQk6CTExNzkzCitEYWtvdGEgCToJMzEJOgkyMDI1MworRGF3ZXMgCToJMzEJOgk5MDYwCitEYXdzb24gCToJMzEJOgkyNDM2NQorRGV1ZWwgCToJMzEJOgkyMDk4CitEaXhvbiAJOgkzMQk6CTYzMzkKK0RvZGdlIAk6CTMxCToJMzYxNjAKK0RvdWdsYXMgCToJMzEJOgk0NjM1ODUKK0R1bmR5IAk6CTMxCToJMjI5MgorRmlsbG1vcmUgCToJMzEJOgk2NjM0CitGcmFua2xpbiAJOgkzMQk6CTM1NzQKK0Zyb250aWVyIAk6CTMxCToJMzA5OQorRnVybmFzIAk6CTMxCToJNTMyNAorR2FnZSAJOgkzMQk6CTIyOTkzCitHYXJkZW4gCToJMzEJOgkyMjkyCitHYXJmaWVsZCAJOgkzMQk6CTE5MDIKK0dvc3BlciAJOgkzMQk6CTIxNDMKK0dyYW50IAk6CTMxCToJNzQ3CitHcmVlbGV5IAk6CTMxCToJMjcxNAorSGFsbCAJOgkzMQk6CTUzNTM0CitIYW1pbHRvbiAJOgkzMQk6CTk0MDMKK0hhcmxhbiAJOgkzMQk6CTM3ODYKK0hheWVzIAk6CTMxCToJMTA2OAorSGl0Y2hjb2NrIAk6CTMxCToJMzExMQorSG9sdCAJOgkzMQk6CTExNTUxCitIb29rZXIgCToJMzEJOgk3ODMKK0hvd2FyZCAJOgkzMQk6CTY1NjcKK0plZmZlcnNvbiAJOgkzMQk6CTgzMzMKK0pvaG5zb24gCToJMzEJOgk0NDg4CitLZWFybmV5IAk6CTMxCToJNjg4MgorS2VpdGggCToJMzEJOgk4ODc1CitLZXlhIFBhaGEgCToJMzEJOgk5ODMKK0tpbWJhbGwgCToJMzEJOgk0MDg5CitLbm94IAk6CTMxCToJOTM3NAorTGFuY2FzdGVyIAk6CTMxCToJMjUwMjkxCitMaW5jb2xuIAk6CTMxCToJMzQ2MzIKK0xvZ2FuIAk6CTMxCToJNzc0CitMb3VwIAk6CTMxCToJNzEyCitNY1BoZXJzb24gCToJMzEJOgk1MzMKK01hZGlzb24gCToJMzEJOgkzNTIyNgorTWVycmljayAJOgkzMQk6CTgyMDQKK01vcnJpbGwgCToJMzEJOgk1NDQwCitOYW5jZSAJOgkzMQk6CTQwMzgKK05lbWFoYSAJOgkzMQk6CTc1NzYKK051Y2tvbGxzIAk6CTMxCToJNTA1NworT3RvZSAJOgkzMQk6CTE1Mzk2CitQYXduZWUgCToJMzEJOgkzMDg3CitQZXJraW5zIAk6CTMxCToJMzIwMAorUGhlbHBzIAk6CTMxCToJOTc0NworUGllcmNlIAk6CTMxCToJNzg1NworUGxhdHRlIAk6CTMxCToJMzE2NjIKK1BvbGsgCToJMzEJOgk1NjM5CitSZWQgV2lsbG93IAk6CTMxCToJMTE0NDgKK1JpY2hhcmRzb24gCToJMzEJOgk5NTMxCitSb2NrIAk6CTMxCToJMTc1NgorU2FsaW5lIAk6CTMxCToJMTM4NDMKK1NhcnB5IAk6CTMxCToJMTIyNTk1CitTYXVuZGVycyAJOgkzMQk6CTE5ODMwCitTY290dHMgQmx1ZmYgCToJMzEJOgkzNjk1MQorU2V3YXJkIAk6CTMxCToJMTY0OTYKK1NoZXJpZGFuIAk6CTMxCToJNjE5OAorU2hlcm1hbiAJOgkzMQk6CTMzMTgKK1Npb3V4IAk6CTMxCToJMTQ3NQorU3RhbnRvbiAJOgkzMQk6CTY0NTUKK1RoYXllciAJOgkzMQk6CTYwNTUKK1Rob21hcyAJOgkzMQk6CTcyOQorVGh1cnN0b24gCToJMzEJOgk3MTcxCitWYWxsZXkgCToJMzEJOgk0NjQ3CitXYXNoaW5ndG9uIAk6CTMxCToJMTg3ODAKK1dheW5lIAk6CTMxCToJOTg1MQorV2Vic3RlciAJOgkzMQk6CTQwNjEKK1doZWVsZXIgCToJMzEJOgk4ODYKK1lvcmsgCToJMzEJOgkxNDU5OAorQ2h1cmNoaWxsIAk6CTMyCToJMjM5ODIKK0NsYXJrIAk6CTMyCToJMTM3NTc2NQorRG91Z2xhcyAJOgkzMgk6CTQxMjU5CitFbGtvIAk6CTMyCToJNDUyOTEKK0VzbWVyYWxkYSAJOgkzMgk6CTk3MQorRXVyZWthIAk6CTMyCToJMTY1MQorSHVtYm9sZHQgCToJMzIJOgkxNjEwNgorTGFuZGVyIAk6CTMyCToJNTc5NAorTGluY29sbiAJOgkzMgk6CTQxNjUKK0x5b24gCToJMzIJOgkzNDUwMQorTWluZXJhbCAJOgkzMgk6CTUwNzEKK055ZSAJOgkzMgk6CTMyNDg1CitQZXJzaGluZyAJOgkzMgk6CTY2OTMKK1N0b3JleSAJOgkzMgk6CTMzOTkKK1dhc2hvZSAJOgkzMgk6CTMzOTQ4NgorV2hpdGUgUGluZSAJOgkzMgk6CTkxODEKK0NhcnNvbiBDaXR5CToJMzIJOgk1MjQ1NworQmVsa25hcCAJOgkzMwk6CTU2MzI1CitDYXJyb2xsIAk6CTMzCToJNDM2NjYKK0NoZXNoaXJlIAk6CTMzCToJNzM4MjUKK0Nvb3MgCToJMzMJOgkzMzExMQorR3JhZnRvbiAJOgkzMwk6CTgxNzQzCitIaWxsc2Jvcm91Z2ggCToJMzMJOgkzODA4NDEKK01lcnJpbWFjayAJOgkzMwk6CTEzNjIyNQorUm9ja2luZ2hhbSAJOgkzMwk6CTI3NzM1OQorU3RyYWZmb3JkIAk6CTMzCToJMTEyMjMzCitTdWxsaXZhbiAJOgkzMwk6CTQwNDU4CitBdGxhbnRpYyAJOgkzNAk6CTI1MjU1MgorQmVyZ2VuIAk6CTM0CToJODg0MTE4CitCdXJsaW5ndG9uIAk6CTM0CToJNDIzMzk0CitDYW1kZW4gCToJMzQJOgk1MDg5MzIKK0NhcGUgTWF5IAk6CTM0CToJMTAyMzI2CitDdW1iZXJsYW5kIAk6CTM0CToJMTQ2NDM4CitFc3NleCAJOgkzNAk6CTc5MzYzMworR2xvdWNlc3RlciAJOgkzNAk6CTI1NDY3MworSHVkc29uIAk6CTM0CToJNjA4OTc1CitIdW50ZXJkb24gCToJMzQJOgkxMjE5ODkKK01lcmNlciAJOgkzNAk6CTM1MDc2MQorTWlkZGxlc2V4IAk6CTM0CToJNzUwMTYyCitNb25tb3V0aCAJOgkzNAk6CTYxNTMwMQorTW9ycmlzIAk6CTM0CToJNDcwMjEyCitPY2VhbiAJOgkzNAk6CTUxMDkxNgorUGFzc2FpYyAJOgkzNAk6CTQ4OTA0OQorU2FsZW0gCToJMzQJOgk2NDI4NQorU29tZXJzZXQgCToJMzQJOgkyOTc0OTAKK1N1c3NleCAJOgkzNAk6CTE0NDE2NgorVW5pb24gCToJMzQJOgk1MjI1NDEKK1dhcnJlbiAJOgkzNAk6CTEwMjQzNworQmVybmFsaWxsbyAJOgkzNQk6CTU1NjY3OAorQ2F0cm9uIAk6CTM1CToJMzU0MworQ2hhdmVzIAk6CTM1CToJNjEzODIKK0NpYm9sYSAJOgkzNQk6CTI1NTk1CitDb2xmYXggCToJMzUJOgkxNDE4OQorQ3VycnkgCToJMzUJOgk0NTA0NAorRGUgQmFjYSAJOgkzNQk6CTIyNDAKK0RvbmEgQW5hIAk6CTM1CToJMTc0NjgyCitFZGR5IAk6CTM1CToJNTE2NTgKK0dyYW50IAk6CTM1CToJMzEwMDIKK0d1YWRhbHVwZSAJOgkzNQk6CTQ2ODAKK0hhcmRpbmcgCToJMzUJOgk4MTAKK0hpZGFsZ28gCToJMzUJOgk1OTMyCitMZWEgCToJMzUJOgk1NTUxMQorTGluY29sbiAJOgkzNQk6CTE5NDExCitMb3MgQWxhbW9zIAk6CTM1CToJMTgzNDMKK0x1bmEgCToJMzUJOgkyNTAxNgorTWNLaW5sZXkgCToJMzUJOgk3NDc5OAorTW9yYSAJOgkzNQk6CTUxODAKK090ZXJvIAk6CTM1CToJNjIyOTgKK1F1YXkgCToJMzUJOgkxMDE1NQorUmlvIEFycmliYSAJOgkzNQk6CTQxMTkwCitSb29zZXZlbHQgCToJMzUJOgkxODAxOAorU2FuZG92YWwgCToJMzUJOgk4OTkwOAorU2FuIEp1YW4gCToJMzUJOgkxMTM4MDEKK1NhbiBNaWd1ZWwgCToJMzUJOgkzMDEyNgorU2FudGEgRmUgCToJMzUJOgkxMjkyOTIKK1NpZXJyYSAJOgkzNQk6CTEzMjcwCitTb2NvcnJvIAk6CTM1CToJMTgwNzgKK1Rhb3MgCToJMzUJOgkyOTk3OQorVG9ycmFuY2UgCToJMzUJOgkxNjkxMQorVW5pb24gCToJMzUJOgk0MTc0CitWYWxlbmNpYSAJOgkzNQk6CTY2MTUyCitBbGJhbnkgCToJMzYJOgkyOTQ1NjUKK0FsbGVnYW55IAk6CTM2CToJNDk5MjcKK0Jyb254IAk6CTM2CToJMTMzMjY1MAorQnJvb21lIAk6CTM2CToJMjAwNTM2CitDYXR0YXJhdWd1cyAJOgkzNgk6CTgzOTU1CitDYXl1Z2EgCToJMzYJOgk4MTk2MworQ2hhdXRhdXF1YSAJOgkzNgk6CTEzOTc1MAorQ2hlbXVuZyAJOgkzNgk6CTkxMDcwCitDaGVuYW5nbyAJOgkzNgk6CTUxNDAxCitDbGludG9uIAk6CTM2CToJNzk4OTQKK0NvbHVtYmlhIAk6CTM2CToJNjMwOTQKK0NvcnRsYW5kIAk6CTM2CToJNDg1OTkKK0RlbGF3YXJlIAk6CTM2CToJNDgwNTUKK0R1dGNoZXNzIAk6CTM2CToJMjgwMTUwCitFcmllIAk6CTM2CToJOTUwMjY1CitFc3NleCAJOgkzNgk6CTM4ODUxCitGcmFua2xpbiAJOgkzNgk6CTUxMTM0CitGdWx0b24gCToJMzYJOgk1NTA3MworR2VuZXNlZSAJOgkzNgk6CTYwMzcwCitHcmVlbmUgCToJMzYJOgk0ODE5NQorSGFtaWx0b24gCToJMzYJOgk1Mzc5CitIZXJraW1lciAJOgkzNgk6CTY0NDI3CitKZWZmZXJzb24gCToJMzYJOgkxMTE3MzgKK0tpbmdzIAk6CTM2CToJMjQ2NTMyNgorTGV3aXMgCToJMzYJOgkyNjk0NAorTGl2aW5nc3RvbiAJOgkzNgk6CTY0MzI4CitNYWRpc29uIAk6CTM2CToJNjk0NDEKK01vbnJvZSAJOgkzNgk6CTczNTM0MworTW9udGdvbWVyeSAJOgkzNgk6CTQ5NzA4CitOYXNzYXUgCToJMzYJOgkxMzM0NTQ0CitOZXcgWW9yayAJOgkzNgk6CTE1MzcxOTUKK05pYWdhcmEgCToJMzYJOgkyMTk4NDYKK09uZWlkYSAJOgkzNgk6CTIzNTQ2OQorT25vbmRhZ2EgCToJMzYJOgk0NTgzMzYKK09udGFyaW8gCToJMzYJOgkxMDAyMjQKK09yYW5nZSAJOgkzNgk6CTM0MTM2NworT3JsZWFucyAJOgkzNgk6CTQ0MTcxCitPc3dlZ28gCToJMzYJOgkxMjIzNzcKK090c2VnbyAJOgkzNgk6CTYxNjc2CitQdXRuYW0gCToJMzYJOgk5NTc0NQorUXVlZW5zIAk6CTM2CToJMjIyOTM3OQorUmVuc3NlbGFlciAJOgkzNgk6CTE1MjUzOAorUmljaG1vbmQgCToJMzYJOgk0NDM3MjgKK1JvY2tsYW5kIAk6CTM2CToJMjg2NzUzCitTdC4gTGF3cmVuY2UgCToJMzYJOgkxMTE5MzEKK1NhcmF0b2dhIAk6CTM2CToJMjAwNjM1CitTY2hlbmVjdGFkeSAJOgkzNgk6CTE0NjU1NQorU2Nob2hhcmllIAk6CTM2CToJMzE1ODIKK1NjaHV5bGVyIAk6CTM2CToJMTkyMjQKK1NlbmVjYSAJOgkzNgk6CTMzMzQyCitTdGV1YmVuIAk6CTM2CToJOTg3MjYKK1N1ZmZvbGsgCToJMzYJOgkxNDE5MzY5CitTdWxsaXZhbiAJOgkzNgk6CTczOTY2CitUaW9nYSAJOgkzNgk6CTUxNzg0CitUb21wa2lucyAJOgkzNgk6CTk2NTAxCitVbHN0ZXIgCToJMzYJOgkxNzc3NDkKK1dhcnJlbiAJOgkzNgk6CTYzMzAzCitXYXNoaW5ndG9uIAk6CTM2CToJNjEwNDIKK1dheW5lIAk6CTM2CToJOTM3NjUKK1dlc3RjaGVzdGVyIAk6CTM2CToJOTIzNDU5CitXeW9taW5nIAk6CTM2CToJNDM0MjQKK1lhdGVzIAk6CTM2CToJMjQ2MjEKK0FsYW1hbmNlIAk6CTM3CToJMTMwODAwCitBbGV4YW5kZXIgCToJMzcJOgkzMzYwMworQWxsZWdoYW55IAk6CTM3CToJMTA2NzcKK0Fuc29uIAk6CTM3CToJMjUyNzUKK0FzaGUgCToJMzcJOgkyNDM4NAorQXZlcnkgCToJMzcJOgkxNzE2NworQmVhdWZvcnQgCToJMzcJOgk0NDk1OAorQmVydGllIAk6CTM3CToJMTk3NzMKK0JsYWRlbiAJOgkzNwk6CTMyMjc4CitCcnVuc3dpY2sgCToJMzcJOgk3MzE0MworQnVuY29tYmUgCToJMzcJOgkyMDYzMzAKK0J1cmtlIAk6CTM3CToJODkxNDgKK0NhYmFycnVzIAk6CTM3CToJMTMxMDYzCitDYWxkd2VsbCAJOgkzNwk6CTc3NDE1CitDYW1kZW4gCToJMzcJOgk2ODg1CitDYXJ0ZXJldCAJOgkzNwk6CTU5MzgzCitDYXN3ZWxsIAk6CTM3CToJMjM1MDEKK0NhdGF3YmEgCToJMzcJOgkxNDE2ODUKK0NoYXRoYW0gCToJMzcJOgk0OTMyOQorQ2hlcm9rZWUgCToJMzcJOgkyNDI5OAorQ2hvd2FuIAk6CTM3CToJMTQ1MjYKK0NsYXkgCToJMzcJOgk4Nzc1CitDbGV2ZWxhbmQgCToJMzcJOgk5NjI4NworQ29sdW1idXMgCToJMzcJOgk1NDc0OQorQ3JhdmVuIAk6CTM3CToJOTE0MzYKK0N1bWJlcmxhbmQgCToJMzcJOgkzMDI5NjMKK0N1cnJpdHVjayAJOgkzNwk6CTE4MTkwCitEYXJlIAk6CTM3CToJMjk5NjcKK0Rhdmlkc29uIAk6CTM3CToJMTQ3MjQ2CitEYXZpZSAJOgkzNwk6CTM0ODM1CitEdXBsaW4gCToJMzcJOgk0OTA2MworRHVyaGFtIAk6CTM3CToJMjIzMzE0CitFZGdlY29tYmUgCToJMzcJOgk1NTYwNgorRm9yc3l0aCAJOgkzNwk6CTMwNjA2NworRnJhbmtsaW4gCToJMzcJOgk0NzI2MAorR2FzdG9uIAk6CTM3CToJMTkwMzY1CitHYXRlcyAJOgkzNwk6CTEwNTE2CitHcmFoYW0gCToJMzcJOgk3OTkzCitHcmFudmlsbGUgCToJMzcJOgk0ODQ5OAorR3JlZW5lIAk6CTM3CToJMTg5NzQKK0d1aWxmb3JkIAk6CTM3CToJNDIxMDQ4CitIYWxpZmF4IAk6CTM3CToJNTczNzAKK0hhcm5ldHQgCToJMzcJOgk5MTAyNQorSGF5d29vZCAJOgkzNwk6CTU0MDMzCitIZW5kZXJzb24gCToJMzcJOgk4OTE3MworSGVydGZvcmQgCToJMzcJOgkyMjYwMQorSG9rZSAJOgkzNwk6CTMzNjQ2CitIeWRlIAk6CTM3CToJNTgyNgorSXJlZGVsbCAJOgkzNwk6CTEyMjY2MAorSmFja3NvbiAJOgkzNwk6CTMzMTIxCitKb2huc3RvbiAJOgkzNwk6CTEyMTk2NQorSm9uZXMgCToJMzcJOgkxMDM4MQorTGVlIAk6CTM3CToJNDkwNDAKK0xlbm9pciAJOgkzNwk6CTU5NjQ4CitMaW5jb2xuIAk6CTM3CToJNjM3ODAKK01jRG93ZWxsIAk6CTM3CToJNDIxNTEKK01hY29uIAk6CTM3CToJMjk4MTEKK01hZGlzb24gCToJMzcJOgkxOTYzNQorTWFydGluIAk6CTM3CToJMjU1OTMKK01lY2tsZW5idXJnIAk6CTM3CToJNjk1NDU0CitNaXRjaGVsbCAJOgkzNwk6CTE1Njg3CitNb250Z29tZXJ5IAk6CTM3CToJMjY4MjIKK01vb3JlIAk6CTM3CToJNzQ3NjkKK05hc2ggCToJMzcJOgk4NzQyMAorTmV3IEhhbm92ZXIgCToJMzcJOgkxNjAzMDcKK05vcnRoYW1wdG9uIAk6CTM3CToJMjIwODYKK09uc2xvdyAJOgkzNwk6CTE1MDM1NQorT3JhbmdlIAk6CTM3CToJMTE4MjI3CitQYW1saWNvIAk6CTM3CToJMTI5MzQKK1Bhc3F1b3RhbmsgCToJMzcJOgkzNDg5NworUGVuZGVyIAk6CTM3CToJNDEwODIKK1BlcnF1aW1hbnMgCToJMzcJOgkxMTM2OAorUGVyc29uIAk6CTM3CToJMzU2MjMKK1BpdHQgCToJMzcJOgkxMzM3OTgKK1BvbGsgCToJMzcJOgkxODMyNAorUmFuZG9scGggCToJMzcJOgkxMzA0NTQKK1JpY2htb25kIAk6CTM3CToJNDY1NjQKK1JvYmVzb24gCToJMzcJOgkxMjMzMzkKK1JvY2tpbmdoYW0gCToJMzcJOgk5MTkyOAorUm93YW4gCToJMzcJOgkxMzAzNDAKK1J1dGhlcmZvcmQgCToJMzcJOgk2Mjg5OQorU2FtcHNvbiAJOgkzNwk6CTYwMTYxCitTY290bGFuZCAJOgkzNwk6CTM1OTk4CitTdGFubHkgCToJMzcJOgk1ODEwMAorU3Rva2VzIAk6CTM3CToJNDQ3MTEKK1N1cnJ5IAk6CTM3CToJNzEyMTkKK1N3YWluIAk6CTM3CToJMTI5NjgKK1RyYW5zeWx2YW5pYSAJOgkzNwk6CTI5MzM0CitUeXJyZWxsIAk6CTM3CToJNDE0OQorVW5pb24gCToJMzcJOgkxMjM2NzcKK1ZhbmNlIAk6CTM3CToJNDI5NTQKK1dha2UgCToJMzcJOgk2Mjc4NDYKK1dhcnJlbiAJOgkzNwk6CTE5OTcyCitXYXNoaW5ndG9uIAk6CTM3CToJMTM3MjMKK1dhdGF1Z2EgCToJMzcJOgk0MjY5NQorV2F5bmUgCToJMzcJOgkxMTMzMjkKK1dpbGtlcyAJOgkzNwk6CTY1NjMyCitXaWxzb24gCToJMzcJOgk3MzgxNAorWWFka2luIAk6CTM3CToJMzYzNDgKK1lhbmNleSAJOgkzNwk6CTE3Nzc0CitBZGFtcyAJOgkzOAk6CTI1OTMKK0Jhcm5lcyAJOgkzOAk6CTExNzc1CitCZW5zb24gCToJMzgJOgk2OTY0CitCaWxsaW5ncyAJOgkzOAk6CTg4OAorQm90dGluZWF1IAk6CTM4CToJNzE0OQorQm93bWFuIAk6CTM4CToJMzI0MgorQnVya2UgCToJMzgJOgkyMjQyCitCdXJsZWlnaCAJOgkzOAk6CTY5NDE2CitDYXNzIAk6CTM4CToJMTIzMTM4CitDYXZhbGllciAJOgkzOAk6CTQ4MzEKK0RpY2tleSAJOgkzOAk6CTU3NTcKK0RpdmlkZSAJOgkzOAk6CTIyODMKK0R1bm4gCToJMzgJOgkzNjAwCitFZGR5IAk6CTM4CToJMjc1NworRW1tb25zIAk6CTM4CToJNDMzMQorRm9zdGVyIAk6CTM4CToJMzc1OQorR29sZGVuIFZhbGxleSAJOgkzOAk6CTE5MjQKK0dyYW5kIEZvcmtzIAk6CTM4CToJNjYxMDkKK0dyYW50IAk6CTM4CToJMjg0MQorR3JpZ2dzIAk6CTM4CToJMjc1NAorSGV0dGluZ2VyIAk6CTM4CToJMjcxNQorS2lkZGVyIAk6CTM4CToJMjc1MworTGFNb3VyZSAJOgkzOAk6CTQ3MDEKK0xvZ2FuIAk6CTM4CToJMjMwOAorTWNIZW5yeSAJOgkzOAk6CTU5ODcKK01jSW50b3NoIAk6CTM4CToJMzM5MAorTWNLZW56aWUgCToJMzgJOgk1NzM3CitNY0xlYW4gCToJMzgJOgk5MzExCitNZXJjZXIgCToJMzgJOgk4NjQ0CitNb3J0b24gCToJMzgJOgkyNTMwMworTW91bnRyYWlsIAk6CTM4CToJNjYzMQorTmVsc29uIAk6CTM4CToJMzcxNQorT2xpdmVyIAk6CTM4CToJMjA2NQorUGVtYmluYSAJOgkzOAk6CTg1ODUKK1BpZXJjZSAJOgkzOAk6CTQ2NzUKK1JhbXNleSAJOgkzOAk6CTEyMDY2CitSYW5zb20gCToJMzgJOgk1ODkwCitSZW52aWxsZSAJOgkzOAk6CTI2MTAKK1JpY2hsYW5kIAk6CTM4CToJMTc5OTgKK1JvbGV0dGUgCToJMzgJOgkxMzY3NAorU2FyZ2VudCAJOgkzOAk6CTQzNjYKK1NoZXJpZGFuIAk6CTM4CToJMTcxMAorU2lvdXggCToJMzgJOgk0MDQ0CitTbG9wZSAJOgkzOAk6CTc2NworU3RhcmsgCToJMzgJOgkyMjYzNgorU3RlZWxlIAk6CTM4CToJMjI1OAorU3R1dHNtYW4gCToJMzgJOgkyMTkwOAorVG93bmVyIAk6CTM4CToJMjg3NgorVHJhaWxsIAk6CTM4CToJODQ3NworV2Fsc2ggCToJMzgJOgkxMjM4OQorV2FyZCAJOgkzOAk6CTU4Nzk1CitXZWxscyAJOgkzOAk6CTUxMDIKK1dpbGxpYW1zIAk6CTM4CToJMTk3NjEKK0FkYW1zIAk6CTM5CToJMjczMzAKK0FsbGVuIAk6CTM5CToJMTA4NDczCitBc2hsYW5kIAk6CTM5CToJNTI1MjMKK0FzaHRhYnVsYSAJOgkzOQk6CTEwMjcyOAorQXRoZW5zIAk6CTM5CToJNjIyMjMKK0F1Z2xhaXplIAk6CTM5CToJNDY2MTEKK0JlbG1vbnQgCToJMzkJOgk3MDIyNgorQnJvd24gCToJMzkJOgk0MjI4NQorQnV0bGVyIAk6CTM5CToJMzMyODA3CitDYXJyb2xsIAk6CTM5CToJMjg4MzYKK0NoYW1wYWlnbiAJOgkzOQk6CTM4ODkwCitDbGFyayAJOgkzOQk6CTE0NDc0MgorQ2xlcm1vbnQgCToJMzkJOgkxNzc5NzcKK0NsaW50b24gCToJMzkJOgk0MDU0MworQ29sdW1iaWFuYSAJOgkzOQk6CTExMjA3NQorQ29zaG9jdG9uIAk6CTM5CToJMzY2NTUKK0NyYXdmb3JkIAk6CTM5CToJNDY5NjYKK0N1eWFob2dhIAk6CTM5CToJMTM5Mzk3OAorRGFya2UgCToJMzkJOgk1MzMwOQorRGVmaWFuY2UgCToJMzkJOgkzOTUwMAorRGVsYXdhcmUgCToJMzkJOgkxMDk5ODkKK0VyaWUgCToJMzkJOgk3OTU1MQorRmFpcmZpZWxkIAk6CTM5CToJMTIyNzU5CitGYXlldHRlIAk6CTM5CToJMjg0MzMKK0ZyYW5rbGluIAk6CTM5CToJMTA2ODk3OAorRnVsdG9uIAk6CTM5CToJNDIwODQKK0dhbGxpYSAJOgkzOQk6CTMxMDY5CitHZWF1Z2EgCToJMzkJOgk5MDg5NQorR3JlZW5lIAk6CTM5CToJMTQ3ODg2CitHdWVybnNleSAJOgkzOQk6CTQwNzkyCitIYW1pbHRvbiAJOgkzOQk6CTg0NTMwMworSGFuY29jayAJOgkzOQk6CTcxMjk1CitIYXJkaW4gCToJMzkJOgkzMTk0NQorSGFycmlzb24gCToJMzkJOgkxNTg1NgorSGVucnkgCToJMzkJOgkyOTIxMAorSGlnaGxhbmQgCToJMzkJOgk0MDg3NQorSG9ja2luZyAJOgkzOQk6CTI4MjQxCitIb2xtZXMgCToJMzkJOgkzODk0MworSHVyb24gCToJMzkJOgk1OTQ4NworSmFja3NvbiAJOgkzOQk6CTMyNjQxCitKZWZmZXJzb24gCToJMzkJOgk3Mzg5NAorS25veCAJOgkzOQk6CTU0NTAwCitMYWtlIAk6CTM5CToJMjI3NTExCitMYXdyZW5jZSAJOgkzOQk6CTYyMzE5CitMaWNraW5nIAk6CTM5CToJMTQ1NDkxCitMb2dhbiAJOgkzOQk6CTQ2MDA1CitMb3JhaW4gCToJMzkJOgkyODQ2NjQKK0x1Y2FzIAk6CTM5CToJNDU1MDU0CitNYWRpc29uIAk6CTM5CToJNDAyMTMKK01haG9uaW5nIAk6CTM5CToJMjU3NTU1CitNYXJpb24gCToJMzkJOgk2NjIxNworTWVkaW5hIAk6CTM5CToJMTUxMDk1CitNZWlncyAJOgkzOQk6CTIzMDcyCitNZXJjZXIgCToJMzkJOgk0MDkyNAorTWlhbWkgCToJMzkJOgk5ODg2OAorTW9ucm9lIAk6CTM5CToJMTUxODAKK01vbnRnb21lcnkgCToJMzkJOgk1NTkwNjIKK01vcmdhbiAJOgkzOQk6CTE0ODk3CitNb3Jyb3cgCToJMzkJOgkzMTYyOAorTXVza2luZ3VtIAk6CTM5CToJODQ1ODUKK05vYmxlIAk6CTM5CToJMTQwNTgKK090dGF3YSAJOgkzOQk6CTQwOTg1CitQYXVsZGluZyAJOgkzOQk6CTIwMjkzCitQZXJyeSAJOgkzOQk6CTM0MDc4CitQaWNrYXdheSAJOgkzOQk6CTUyNzI3CitQaWtlIAk6CTM5CToJMjc2OTUKK1BvcnRhZ2UgCToJMzkJOgkxNTIwNjEKK1ByZWJsZSAJOgkzOQk6CTQyMzM3CitQdXRuYW0gCToJMzkJOgkzNDcyNgorUmljaGxhbmQgCToJMzkJOgkxMjg4NTIKK1Jvc3MgCToJMzkJOgk3MzM0NQorU2FuZHVza3kgCToJMzkJOgk2MTc5MgorU2Npb3RvIAk6CTM5CToJNzkxOTUKK1NlbmVjYSAJOgkzOQk6CTU4NjgzCitTaGVsYnkgCToJMzkJOgk0NzkxMAorU3RhcmsgCToJMzkJOgkzNzgwOTgKK1N1bW1pdCAJOgkzOQk6CTU0Mjg5OQorVHJ1bWJ1bGwgCToJMzkJOgkyMjUxMTYKK1R1c2NhcmF3YXMgCToJMzkJOgk5MDkxNAorVW5pb24gCToJMzkJOgk0MDkwOQorVmFuIFdlcnQgCToJMzkJOgkyOTY1OQorVmludG9uIAk6CTM5CToJMTI4MDYKK1dhcnJlbiAJOgkzOQk6CTE1ODM4MworV2FzaGluZ3RvbiAJOgkzOQk6CTYzMjUxCitXYXluZSAJOgkzOQk6CTExMTU2NAorV2lsbGlhbXMgCToJMzkJOgkzOTE4OAorV29vZCAJOgkzOQk6CTEyMTA2NQorV3lhbmRvdCAJOgkzOQk6CTIyOTA4CitBZGFpciAJOgk0MAk6CTIxMDM4CitBbGZhbGZhIAk6CTQwCToJNjEwNQorQXRva2EgCToJNDAJOgkxMzg3OQorQmVhdmVyIAk6CTQwCToJNTg1NworQmVja2hhbSAJOgk0MAk6CTE5Nzk5CitCbGFpbmUgCToJNDAJOgkxMTk3NgorQnJ5YW4gCToJNDAJOgkzNjUzNAorQ2FkZG8gCToJNDAJOgkzMDE1MAorQ2FuYWRpYW4gCToJNDAJOgk4NzY5NworQ2FydGVyIAk6CTQwCToJNDU2MjEKK0NoZXJva2VlIAk6CTQwCToJNDI1MjEKK0Nob2N0YXcgCToJNDAJOgkxNTM0MgorQ2ltYXJyb24gCToJNDAJOgkzMTQ4CitDbGV2ZWxhbmQgCToJNDAJOgkyMDgwMTYKK0NvYWwgCToJNDAJOgk2MDMxCitDb21hbmNoZSAJOgk0MAk6CTExNDk5NgorQ290dG9uIAk6CTQwCToJNjYxNAorQ3JhaWcgCToJNDAJOgkxNDk1MAorQ3JlZWsgCToJNDAJOgk2NzM2NworQ3VzdGVyIAk6CTQwCToJMjYxNDIKK0RlbGF3YXJlIAk6CTQwCToJMzcwNzcKK0Rld2V5IAk6CTQwCToJNDc0MworRWxsaXMgCToJNDAJOgk0MDc1CitHYXJmaWVsZCAJOgk0MAk6CTU3ODEzCitHYXJ2aW4gCToJNDAJOgkyNzIxMAorR3JhZHkgCToJNDAJOgk0NTUxNgorR3JhbnQgCToJNDAJOgk1MTQ0CitHcmVlciAJOgk0MAk6CTYwNjEKK0hhcm1vbiAJOgk0MAk6CTMyODMKK0hhcnBlciAJOgk0MAk6CTM1NjIKK0hhc2tlbGwgCToJNDAJOgkxMTc5MgorSHVnaGVzIAk6CTQwCToJMTQxNTQKK0phY2tzb24gCToJNDAJOgkyODQzOQorSmVmZmVyc29uIAk6CTQwCToJNjgxOAorSm9obnN0b24gCToJNDAJOgkxMDUxMworS2F5IAk6CTQwCToJNDgwODAKK0tpbmdmaXNoZXIgCToJNDAJOgkxMzkyNgorS2lvd2EgCToJNDAJOgkxMDIyNworTGF0aW1lciAJOgk0MAk6CTEwNjkyCitMZSBGbG9yZSAJOgk0MAk6CTQ4MTA5CitMaW5jb2xuIAk6CTQwCToJMzIwODAKK0xvZ2FuIAk6CTQwCToJMzM5MjQKK0xvdmUgCToJNDAJOgk4ODMxCitNY0NsYWluIAk6CTQwCToJMjc3NDAKK01jQ3VydGFpbiAJOgk0MAk6CTM0NDAyCitNY0ludG9zaCAJOgk0MAk6CTE5NDU2CitNYWpvciAJOgk0MAk6CTc1NDUKK01hcnNoYWxsIAk6CTQwCToJMTMxODQKK01heWVzIAk6CTQwCToJMzgzNjkKK011cnJheSAJOgk0MAk6CTEyNjIzCitNdXNrb2dlZSAJOgk0MAk6CTY5NDUxCitOb2JsZSAJOgk0MAk6CTExNDExCitOb3dhdGEgCToJNDAJOgkxMDU2OQorT2tmdXNrZWUgCToJNDAJOgkxMTgxNAorT2tsYWhvbWEgCToJNDAJOgk2NjA0NDgKK09rbXVsZ2VlIAk6CTQwCToJMzk2ODUKK09zYWdlIAk6CTQwCToJNDQ0MzcKK090dGF3YSAJOgk0MAk6CTMzMTk0CitQYXduZWUgCToJNDAJOgkxNjYxMgorUGF5bmUgCToJNDAJOgk2ODE5MAorUGl0dHNidXJnIAk6CTQwCToJNDM5NTMKK1BvbnRvdG9jIAk6CTQwCToJMzUxNDMKK1BvdHRhd2F0b21pZSAJOgk0MAk6CTY1NTIxCitQdXNobWF0YWhhIAk6CTQwCToJMTE2NjcKK1JvZ2VyIE1pbGxzIAk6CTQwCToJMzQzNgorUm9nZXJzIAk6CTQwCToJNzA2NDEKK1NlbWlub2xlIAk6CTQwCToJMjQ4OTQKK1NlcXVveWFoIAk6CTQwCToJMzg5NzIKK1N0ZXBoZW5zIAk6CTQwCToJNDMxODIKK1RleGFzIAk6CTQwCToJMjAxMDcKK1RpbGxtYW4gCToJNDAJOgk5Mjg3CitUdWxzYSAJOgk0MAk6CTU2MzI5OQorV2Fnb25lciAJOgk0MAk6CTU3NDkxCitXYXNoaW5ndG9uIAk6CTQwCToJNDg5OTYKK1dhc2hpdGEgCToJNDAJOgkxMTUwOAorV29vZHMgCToJNDAJOgk5MDg5CitXb29kd2FyZCAJOgk0MAk6CTE4NDg2CitCYWtlciAJOgk0MQk6CTE2NzQxCitCZW50b24gCToJNDEJOgk3ODE1MworQ2xhY2thbWFzIAk6CTQxCToJMzM4MzkxCitDbGF0c29wIAk6CTQxCToJMzU2MzAKK0NvbHVtYmlhIAk6CTQxCToJNDM1NjAKK0Nvb3MgCToJNDEJOgk2Mjc3OQorQ3Jvb2sgCToJNDEJOgkxOTE4MgorQ3VycnkgCToJNDEJOgkyMTEzNworRGVzY2h1dGVzIAk6CTQxCToJMTE1MzY3CitEb3VnbGFzIAk6CTQxCToJMTAwMzk5CitHaWxsaWFtIAk6CTQxCToJMTkxNQorR3JhbnQgCToJNDEJOgk3OTM1CitIYXJuZXkgCToJNDEJOgk3NjA5CitIb29kIFJpdmVyIAk6CTQxCToJMjA0MTEKK0phY2tzb24gCToJNDEJOgkxODEyNjkKK0plZmZlcnNvbiAJOgk0MQk6CTE5MDA5CitKb3NlcGhpbmUgCToJNDEJOgk3NTcyNgorS2xhbWF0aCAJOgk0MQk6CTYzNzc1CitMYWtlIAk6CTQxCToJNzQyMgorTGFuZSAJOgk0MQk6CTMyMjk1OQorTGluY29sbiAJOgk0MQk6CTQ0NDc5CitMaW5uIAk6CTQxCToJMTAzMDY5CitNYWxoZXVyIAk6CTQxCToJMzE2MTUKK01hcmlvbiAJOgk0MQk6CTI4NDgzNAorTW9ycm93IAk6CTQxCToJMTA5OTUKK011bHRub21haCAJOgk0MQk6CTY2MDQ4NgorUG9sayAJOgk0MQk6CTYyMzgwCitTaGVybWFuIAk6CTQxCToJMTkzNAorVGlsbGFtb29rIAk6CTQxCToJMjQyNjIKK1VtYXRpbGxhIAk6CTQxCToJNzA1NDgKK1VuaW9uIAk6CTQxCToJMjQ1MzAKK1dhbGxvd2EgCToJNDEJOgk3MjI2CitXYXNjbyAJOgk0MQk6CTIzNzkxCitXYXNoaW5ndG9uIAk6CTQxCToJNDQ1MzQyCitXaGVlbGVyIAk6CTQxCToJMTU0NworWWFtaGlsbCAJOgk0MQk6CTg0OTkyCitBZGFtcyAJOgk0Mgk6CTkxMjkyCitBbGxlZ2hlbnkgCToJNDIJOgkxMjgxNjY2CitBcm1zdHJvbmcgCToJNDIJOgk3MjM5MgorQmVhdmVyIAk6CTQyCToJMTgxNDEyCitCZWRmb3JkIAk6CTQyCToJNDk5ODQKK0JlcmtzIAk6CTQyCToJMzczNjM4CitCbGFpciAJOgk0Mgk6CTEyOTE0NAorQnJhZGZvcmQgCToJNDIJOgk2Mjc2MQorQnVja3MgCToJNDIJOgk1OTc2MzUKK0J1dGxlciAJOgk0Mgk6CTE3NDA4MworQ2FtYnJpYSAJOgk0Mgk6CTE1MjU5OAorQ2FtZXJvbiAJOgk0Mgk6CTU5NzQKK0NhcmJvbiAJOgk0Mgk6CTU4ODAyCitDZW50cmUgCToJNDIJOgkxMzU3NTgKK0NoZXN0ZXIgCToJNDIJOgk0MzM1MDEKK0NsYXJpb24gCToJNDIJOgk0MTc2NQorQ2xlYXJmaWVsZCAJOgk0Mgk6CTgzMzgyCitDbGludG9uIAk6CTQyCToJMzc5MTQKK0NvbHVtYmlhIAk6CTQyCToJNjQxNTEKK0NyYXdmb3JkIAk6CTQyCToJOTAzNjYKK0N1bWJlcmxhbmQgCToJNDIJOgkyMTM2NzQKK0RhdXBoaW4gCToJNDIJOgkyNTE3OTgKK0RlbGF3YXJlIAk6CTQyCToJNTUwODY0CitFbGsgCToJNDIJOgkzNTExMgorRXJpZSAJOgk0Mgk6CTI4MDg0MworRmF5ZXR0ZSAJOgk0Mgk6CTE0ODY0NAorRm9yZXN0IAk6CTQyCToJNDk0NgorRnJhbmtsaW4gCToJNDIJOgkxMjkzMTMKK0Z1bHRvbiAJOgk0Mgk6CTE0MjYxCitHcmVlbmUgCToJNDIJOgk0MDY3MgorSHVudGluZ2RvbiAJOgk0Mgk6CTQ1NTg2CitJbmRpYW5hIAk6CTQyCToJODk2MDUKK0plZmZlcnNvbiAJOgk0Mgk6CTQ1OTMyCitKdW5pYXRhIAk6CTQyCToJMjI4MjEKK0xhY2thd2FubmEgCToJNDIJOgkyMTMyOTUKK0xhbmNhc3RlciAJOgk0Mgk6CTQ3MDY1OAorTGF3cmVuY2UgCToJNDIJOgk5NDY0MworTGViYW5vbiAJOgk0Mgk6CTEyMDMyNworTGVoaWdoIAk6CTQyCToJMzEyMDkwCitMdXplcm5lIAk6CTQyCToJMzE5MjUwCitMeWNvbWluZyAJOgk0Mgk6CTEyMDA0NAorTWNLZWFuIAk6CTQyCToJNDU5MzYKK01lcmNlciAJOgk0Mgk6CTEyMDI5MworTWlmZmxpbiAJOgk0Mgk6CTQ2NDg2CitNb25yb2UgCToJNDIJOgkxMzg2ODcKK01vbnRnb21lcnkgCToJNDIJOgk3NTAwOTcKK01vbnRvdXIgCToJNDIJOgkxODIzNgorTm9ydGhhbXB0b24gCToJNDIJOgkyNjcwNjYKK05vcnRodW1iZXJsYW5kIAk6CTQyCToJOTQ1NTYKK1BlcnJ5IAk6CTQyCToJNDM2MDIKK1BoaWxhZGVscGhpYSAJOgk0Mgk6CTE1MTc1NTAKK1Bpa2UgCToJNDIJOgk0NjMwMgorUG90dGVyIAk6CTQyCToJMTgwODAKK1NjaHV5bGtpbGwgCToJNDIJOgkxNTAzMzYKK1NueWRlciAJOgk0Mgk6CTM3NTQ2CitTb21lcnNldCAJOgk0Mgk6CTgwMDIzCitTdWxsaXZhbiAJOgk0Mgk6CTY1NTYKK1N1c3F1ZWhhbm5hIAk6CTQyCToJNDIyMzgKK1Rpb2dhIAk6CTQyCToJNDEzNzMKK1VuaW9uIAk6CTQyCToJNDE2MjQKK1ZlbmFuZ28gCToJNDIJOgk1NzU2NQorV2FycmVuIAk6CTQyCToJNDM4NjMKK1dhc2hpbmd0b24gCToJNDIJOgkyMDI4OTcKK1dheW5lIAk6CTQyCToJNDc3MjIKK1dlc3Rtb3JlbGFuZCAJOgk0Mgk6CTM2OTk5MworV3lvbWluZyAJOgk0Mgk6CTI4MDgwCitZb3JrIAk6CTQyCToJMzgxNzUxCitCcmlzdG9sIAk6CTQ0CToJNTA2NDgKK0tlbnQgCToJNDQJOgkxNjcwOTAKK05ld3BvcnQgCToJNDQJOgk4NTQzMworUHJvdmlkZW5jZSAJOgk0NAk6CTYyMTYwMgorV2FzaGluZ3RvbiAJOgk0NAk6CTEyMzU0NgorQWJiZXZpbGxlIAk6CTQ1CToJMjYxNjcKK0Fpa2VuIAk6CTQ1CToJMTQyNTUyCitBbGxlbmRhbGUgCToJNDUJOgkxMTIxMQorQW5kZXJzb24gCToJNDUJOgkxNjU3NDAKK0JhbWJlcmcgCToJNDUJOgkxNjY1OAorQmFybndlbGwgCToJNDUJOgkyMzQ3OAorQmVhdWZvcnQgCToJNDUJOgkxMjA5MzcKK0JlcmtlbGV5IAk6CTQ1CToJMTQyNjUxCitDYWxob3VuIAk6CTQ1CToJMTUxODUKK0NoYXJsZXN0b24gCToJNDUJOgkzMDk5NjkKK0NoZXJva2VlIAk6CTQ1CToJNTI1MzcKK0NoZXN0ZXIgCToJNDUJOgkzNDA2OAorQ2hlc3RlcmZpZWxkIAk6CTQ1CToJNDI3NjgKK0NsYXJlbmRvbiAJOgk0NQk6CTMyNTAyCitDb2xsZXRvbiAJOgk0NQk6CTM4MjY0CitEYXJsaW5ndG9uIAk6CTQ1CToJNjczOTQKK0RpbGxvbiAJOgk0NQk6CTMwNzIyCitEb3JjaGVzdGVyIAk6CTQ1CToJOTY0MTMKK0VkZ2VmaWVsZCAJOgk0NQk6CTI0NTk1CitGYWlyZmllbGQgCToJNDUJOgkyMzQ1NAorRmxvcmVuY2UgCToJNDUJOgkxMjU3NjEKK0dlb3JnZXRvd24gCToJNDUJOgk1NTc5NworR3JlZW52aWxsZSAJOgk0NQk6CTM3OTYxNgorR3JlZW53b29kIAk6CTQ1CToJNjYyNzEKK0hhbXB0b24gCToJNDUJOgkyMTM4NgorSG9ycnkgCToJNDUJOgkxOTY2MjkKK0phc3BlciAJOgk0NQk6CTIwNjc4CitLZXJzaGF3IAk6CTQ1CToJNTI2NDcKK0xhbmNhc3RlciAJOgk0NQk6CTYxMzUxCitMYXVyZW5zIAk6CTQ1CToJNjk1NjcKK0xlZSAJOgk0NQk6CTIwMTE5CitMZXhpbmd0b24gCToJNDUJOgkyMTYwMTQKK01jQ29ybWljayAJOgk0NQk6CTk5NTgKK01hcmlvbiAJOgk0NQk6CTM1NDY2CitNYXJsYm9ybyAJOgk0NQk6CTI4ODE4CitOZXdiZXJyeSAJOgk0NQk6CTM2MTA4CitPY29uZWUgCToJNDUJOgk2NjIxNQorT3JhbmdlYnVyZyAJOgk0NQk6CTkxNTgyCitQaWNrZW5zIAk6CTQ1CToJMTEwNzU3CitSaWNobGFuZCAJOgk0NQk6CTMyMDY3NworU2FsdWRhIAk6CTQ1CToJMTkxODEKK1NwYXJ0YW5idXJnIAk6CTQ1CToJMjUzNzkxCitTdW10ZXIgCToJNDUJOgkxMDQ2NDYKK1VuaW9uIAk6CTQ1CToJMjk4ODEKK1dpbGxpYW1zYnVyZyAJOgk0NQk6CTM3MjE3CitZb3JrIAk6CTQ1CToJMTY0NjE0CitBdXJvcmEgCToJNDYJOgkzMDU4CitCZWFkbGUgCToJNDYJOgkxNzAyMworQmVubmV0dCAJOgk0Ngk6CTM1NzQKK0JvbiBIb21tZSAJOgk0Ngk6CTcyNjAKK0Jyb29raW5ncyAJOgk0Ngk6CTI4MjIwCitCcm93biAJOgk0Ngk6CTM1NDYwCitCcnVsZSAJOgk0Ngk6CTUzNjQKK0J1ZmZhbG8gCToJNDYJOgkyMDMyCitCdXR0ZSAJOgk0Ngk6CTkwOTQKK0NhbXBiZWxsIAk6CTQ2CToJMTc4MgorQ2hhcmxlcyBNaXggCToJNDYJOgk5MzUwCitDbGFyayAJOgk0Ngk6CTQxNDMKK0NsYXkgCToJNDYJOgkxMzUzNworQ29kaW5ndG9uIAk6CTQ2CToJMjU4OTcKK0NvcnNvbiAJOgk0Ngk6CTQxODEKK0N1c3RlciAJOgk0Ngk6CTcyNzUKK0Rhdmlzb24gCToJNDYJOgkxODc0MQorRGF5IAk6CTQ2CToJNjI2NworRGV1ZWwgCToJNDYJOgk0NDk4CitEZXdleSAJOgk0Ngk6CTU5NzIKK0RvdWdsYXMgCToJNDYJOgkzNDU4CitFZG11bmRzIAk6CTQ2CToJNDM2NworRmFsbCBSaXZlciAJOgk0Ngk6CTc0NTMKK0ZhdWxrIAk6CTQ2CToJMjY0MAorR3JhbnQgCToJNDYJOgk3ODQ3CitHcmVnb3J5IAk6CTQ2CToJNDc5MgorSGFha29uIAk6CTQ2CToJMjE5NgorSGFtbGluIAk6CTQ2CToJNTU0MAorSGFuZCAJOgk0Ngk6CTM3NDEKK0hhbnNvbiAJOgk0Ngk6CTMxMzkKK0hhcmRpbmcgCToJNDYJOgkxMzUzCitIdWdoZXMgCToJNDYJOgkxNjQ4MQorSHV0Y2hpbnNvbiAJOgk0Ngk6CTgwNzUKK0h5ZGUgCToJNDYJOgkxNjcxCitKYWNrc29uIAk6CTQ2CToJMjkzMAorSmVyYXVsZCAJOgk0Ngk6CTIyOTUKK0pvbmVzIAk6CTQ2CToJMTE5MworS2luZ3NidXJ5IAk6CTQ2CToJNTgxNQorTGFrZSAJOgk0Ngk6CTExMjc2CitMYXdyZW5jZSAJOgk0Ngk6CTIxODAyCitMaW5jb2xuIAk6CTQ2CToJMjQxMzEKK0x5bWFuIAk6CTQ2CToJMzg5NQorTWNDb29rIAk6CTQ2CToJNTgzMgorTWNQaGVyc29uIAk6CTQ2CToJMjkwNAorTWFyc2hhbGwgCToJNDYJOgk0NTc2CitNZWFkZSAJOgk0Ngk6CTI0MjUzCitNZWxsZXR0ZSAJOgk0Ngk6CTIwODMKK01pbmVyIAk6CTQ2CToJMjg4NAorTWlubmVoYWhhIAk6CTQ2CToJMTQ4MjgxCitNb29keSAJOgk0Ngk6CTY1OTUKK1Blbm5pbmd0b24gCToJNDYJOgk4ODU2NQorUGVya2lucyAJOgk0Ngk6CTMzNjMKK1BvdHRlciAJOgk0Ngk6CTI2OTMKK1JvYmVydHMgCToJNDYJOgkxMDAxNgorU2FuYm9ybiAJOgk0Ngk6CTI2NzUKK1NoYW5ub24gCToJNDYJOgkxMjQ2NgorU3BpbmsgCToJNDYJOgk3NDU0CitTdGFubGV5IAk6CTQ2CToJMjc3MgorU3VsbHkgCToJNDYJOgkxNTU2CitUb2RkIAk6CTQ2CToJOTA1MAorVHJpcHAgCToJNDYJOgk2NDMwCitUdXJuZXIgCToJNDYJOgk4ODQ5CitVbmlvbiAJOgk0Ngk6CTEyNTg0CitXYWx3b3J0aCAJOgk0Ngk6CTU5NzQKK1lhbmt0b24gCToJNDYJOgkyMTY1MgorWmllYmFjaCAJOgk0Ngk6CTI1MTkKK0FuZGVyc29uIAk6CTQ3CToJNzEzMzAKK0JlZGZvcmQgCToJNDcJOgkzNzU4NgorQmVudG9uIAk6CTQ3CToJMTY1MzcKK0JsZWRzb2UgCToJNDcJOgkxMjM2NworQmxvdW50IAk6CTQ3CToJMTA1ODIzCitCcmFkbGV5IAk6CTQ3CToJODc5NjUKK0NhbXBiZWxsIAk6CTQ3CToJMzk4NTQKK0Nhbm5vbiAJOgk0Nwk6CTEyODI2CitDYXJyb2xsIAk6CTQ3CToJMjk0NzUKK0NhcnRlciAJOgk0Nwk6CTU2NzQyCitDaGVhdGhhbSAJOgk0Nwk6CTM1OTEyCitDaGVzdGVyIAk6CTQ3CToJMTU1NDAKK0NsYWlib3JuZSAJOgk0Nwk6CTI5ODYyCitDbGF5IAk6CTQ3CToJNzk3NgorQ29ja2UgCToJNDcJOgkzMzU2NQorQ29mZmVlIAk6CTQ3CToJNDgwMTQKK0Nyb2NrZXR0IAk6CTQ3CToJMTQ1MzIKK0N1bWJlcmxhbmQgCToJNDcJOgk0NjgwMgorRGF2aWRzb24gCToJNDcJOgk1Njk4OTEKK0RlY2F0dXIgCToJNDcJOgkxMTczMQorRGVLYWxiIAk6CTQ3CToJMTc0MjMKK0RpY2tzb24gCToJNDcJOgk0MzE1NgorRHllciAJOgk0Nwk6CTM3Mjc5CitGYXlldHRlIAk6CTQ3CToJMjg4MDYKK0ZlbnRyZXNzIAk6CTQ3CToJMTY2MjUKK0ZyYW5rbGluIAk6CTQ3CToJMzkyNzAKK0dpYnNvbiAJOgk0Nwk6CTQ4MTUyCitHaWxlcyAJOgk0Nwk6CTI5NDQ3CitHcmFpbmdlciAJOgk0Nwk6CTIwNjU5CitHcmVlbmUgCToJNDcJOgk2MjkwOQorR3J1bmR5IAk6CTQ3CToJMTQzMzIKK0hhbWJsZW4gCToJNDcJOgk1ODEyOAorSGFtaWx0b24gCToJNDcJOgkzMDc4OTYKK0hhbmNvY2sgCToJNDcJOgk2Nzg2CitIYXJkZW1hbiAJOgk0Nwk6CTI4MTA1CitIYXJkaW4gCToJNDcJOgkyNTU3OAorSGF3a2lucyAJOgk0Nwk6CTUzNTYzCitIYXl3b29kIAk6CTQ3CToJMTk3OTcKK0hlbmRlcnNvbiAJOgk0Nwk6CTI1NTIyCitIZW5yeSAJOgk0Nwk6CTMxMTE1CitIaWNrbWFuIAk6CTQ3CToJMjIyOTUKK0hvdXN0b24gCToJNDcJOgk4MDg4CitIdW1waHJleXMgCToJNDcJOgkxNzkyOQorSmFja3NvbiAJOgk0Nwk6CTEwOTg0CitKZWZmZXJzb24gCToJNDcJOgk0NDI5NAorSm9obnNvbiAJOgk0Nwk6CTE3NDk5CitLbm94IAk6CTQ3CToJMzgyMDMyCitMYWtlIAk6CTQ3CToJNzk1NAorTGF1ZGVyZGFsZSAJOgk0Nwk6CTI3MTAxCitMYXdyZW5jZSAJOgk0Nwk6CTM5OTI2CitMZXdpcyAJOgk0Nwk6CTExMzY3CitMaW5jb2xuIAk6CTQ3CToJMzEzNDAKK0xvdWRvbiAJOgk0Nwk6CTM5MDg2CitNY01pbm4gCToJNDcJOgk0OTAxNQorTWNOYWlyeSAJOgk0Nwk6CTI0NjUzCitNYWNvbiAJOgk0Nwk6CTIwMzg2CitNYWRpc29uIAk6CTQ3CToJOTE4MzcKK01hcmlvbiAJOgk0Nwk6CTI3Nzc2CitNYXJzaGFsbCAJOgk0Nwk6CTI2NzY3CitNYXVyeSAJOgk0Nwk6CTY5NDk4CitNZWlncyAJOgk0Nwk6CTExMDg2CitNb25yb2UgCToJNDcJOgkzODk2MQorTW9udGdvbWVyeSAJOgk0Nwk6CTEzNDc2OAorTW9vcmUgCToJNDcJOgk1NzQwCitNb3JnYW4gCToJNDcJOgkxOTc1NworT2Jpb24gCToJNDcJOgkzMjQ1MAorT3ZlcnRvbiAJOgk0Nwk6CTIwMTE4CitQZXJyeSAJOgk0Nwk6CTc2MzEKK1BpY2tldHQgCToJNDcJOgk0OTQ1CitQb2xrIAk6CTQ3CToJMTYwNTAKK1B1dG5hbSAJOgk0Nwk6CTYyMzE1CitSaGVhIAk6CTQ3CToJMjg0MDAKK1JvYW5lIAk6CTQ3CToJNTE5MTAKK1JvYmVydHNvbiAJOgk0Nwk6CTU0NDMzCitSdXRoZXJmb3JkIAk6CTQ3CToJMTgyMDIzCitTY290dCAJOgk0Nwk6CTIxMTI3CitTZXF1YXRjaGllIAk6CTQ3CToJMTEzNzAKK1NldmllciAJOgk0Nwk6CTcxMTcwCitTaGVsYnkgCToJNDcJOgk4OTc0NzIKK1NtaXRoIAk6CTQ3CToJMTc3MTIKK1N0ZXdhcnQgCToJNDcJOgkxMjM3MAorU3VsbGl2YW4gCToJNDcJOgkxNTMwNDgKK1N1bW5lciAJOgk0Nwk6CTEzMDQ0OQorVGlwdG9uIAk6CTQ3CToJNTEyNzEKK1Ryb3VzZGFsZSAJOgk0Nwk6CTcyNTkKK1VuaWNvaSAJOgk0Nwk6CTE3NjY3CitVbmlvbiAJOgk0Nwk6CTE3ODA4CitWYW4gQnVyZW4gCToJNDcJOgk1NTA4CitXYXJyZW4gCToJNDcJOgkzODI3NgorV2FzaGluZ3RvbiAJOgk0Nwk6CTEwNzE5OAorV2F5bmUgCToJNDcJOgkxNjg0MgorV2Vha2xleSAJOgk0Nwk6CTM0ODk1CitXaGl0ZSAJOgk0Nwk6CTIzMTAyCitXaWxsaWFtc29uIAk6CTQ3CToJMTI2NjM4CitXaWxzb24gCToJNDcJOgk4ODgwOQorQW5kZXJzb24gCToJNDgJOgk1NTEwOQorQW5kcmV3cyAJOgk0OAk6CTEzMDA0CitBbmdlbGluYSAJOgk0OAk6CTgwMTMwCitBcmFuc2FzIAk6CTQ4CToJMjI0OTcKK0FyY2hlciAJOgk0OAk6CTg4NTQKK0FybXN0cm9uZyAJOgk0OAk6CTIxNDgKK0F0YXNjb3NhIAk6CTQ4CToJMzg2MjgKK0F1c3RpbiAJOgk0OAk6CTIzNTkwCitCYWlsZXkgCToJNDgJOgk2NTk0CitCYW5kZXJhIAk6CTQ4CToJMTc2NDUKK0Jhc3Ryb3AgCToJNDgJOgk1NzczMworQmF5bG9yIAk6CTQ4CToJNDA5MworQmVlIAk6CTQ4CToJMzIzNTkKK0JlbGwgCToJNDgJOgkyMzc5NzQKK0JleGFyIAk6CTQ4CToJMTM5MjkzMQorQmxhbmNvIAk6CTQ4CToJODQxOAorQm9yZGVuIAk6CTQ4CToJNzI5CitCb3NxdWUgCToJNDgJOgkxNzIwNAorQm93aWUgCToJNDgJOgk4OTMwNgorQnJhem9yaWEgCToJNDgJOgkyNDE3NjcKK0JyYXpvcyAJOgk0OAk6CTE1MjQxNQorQnJld3N0ZXIgCToJNDgJOgk4ODY2CitCcmlzY29lIAk6CTQ4CToJMTc5MAorQnJvb2tzIAk6CTQ4CToJNzk3NgorQnJvd24gCToJNDgJOgkzNzY3NAorQnVybGVzb24gCToJNDgJOgkxNjQ3MAorQnVybmV0IAk6CTQ4CToJMzQxNDcKK0NhbGR3ZWxsIAk6CTQ4CToJMzIxOTQKK0NhbGhvdW4gCToJNDgJOgkyMDY0NworQ2FsbGFoYW4gCToJNDgJOgkxMjkwNQorQ2FtZXJvbiAJOgk0OAk6CTMzNTIyNworQ2FtcCAJOgk0OAk6CTExNTQ5CitDYXJzb24gCToJNDgJOgk2NTE2CitDYXNzIAk6CTQ4CToJMzA0MzgKK0Nhc3RybyAJOgk0OAk6CTgyODUKK0NoYW1iZXJzIAk6CTQ4CToJMjYwMzEKK0NoZXJva2VlIAk6CTQ4CToJNDY2NTkKK0NoaWxkcmVzcyAJOgk0OAk6CTc2ODgKK0NsYXkgCToJNDgJOgkxMTAwNgorQ29jaHJhbiAJOgk0OAk6CTM3MzAKK0Nva2UgCToJNDgJOgkzODY0CitDb2xlbWFuIAk6CTQ4CToJOTIzNQorQ29sbGluIAk6CTQ4CToJNDkxNjc1CitDb2xsaW5nc3dvcnRoIAk6CTQ4CToJMzIwNgorQ29sb3JhZG8gCToJNDgJOgkyMDM5MAorQ29tYWwgCToJNDgJOgk3ODAyMQorQ29tYW5jaGUgCToJNDgJOgkxNDAyNgorQ29uY2hvIAk6CTQ4CToJMzk2NgorQ29va2UgCToJNDgJOgkzNjM2MworQ29yeWVsbCAJOgk0OAk6CTc0OTc4CitDb3R0bGUgCToJNDgJOgkxOTA0CitDcmFuZSAJOgk0OAk6CTM5OTYKK0Nyb2NrZXR0IAk6CTQ4CToJNDA5OQorQ3Jvc2J5IAk6CTQ4CToJNzA3MgorQ3VsYmVyc29uIAk6CTQ4CToJMjk3NQorRGFsbGFtIAk6CTQ4CToJNjIyMgorRGFsbGFzIAk6CTQ4CToJMjIxODg5OQorRGF3c29uIAk6CTQ4CToJMTQ5ODUKK0RlYWYgU21pdGggCToJNDgJOgkxODU2MQorRGVsdGEgCToJNDgJOgk1MzI3CitEZW50b24gCToJNDgJOgk0MzI5NzYKK0RlV2l0dCAJOgk0OAk6CTIwMDEzCitEaWNrZW5zIAk6CTQ4CToJMjc2MgorRGltbWl0IAk6CTQ4CToJMTAyNDgKK0RvbmxleSAJOgk0OAk6CTM4MjgKK0R1dmFsIAk6CTQ4CToJMTMxMjAKK0Vhc3RsYW5kIAk6CTQ4CToJMTgyOTcKK0VjdG9yIAk6CTQ4CToJMTIxMTIzCitFZHdhcmRzIAk6CTQ4CToJMjE2MgorRWxsaXMgCToJNDgJOgkxMTEzNjAKK0VsIFBhc28gCToJNDgJOgk2Nzk2MjIKK0VyYXRoIAk6CTQ4CToJMzMwMDEKK0ZhbGxzIAk6CTQ4CToJMTg1NzYKK0Zhbm5pbiAJOgk0OAk6CTMxMjQyCitGYXlldHRlIAk6CTQ4CToJMjE4MDQKK0Zpc2hlciAJOgk0OAk6CTQzNDQKK0Zsb3lkIAk6CTQ4CToJNzc3MQorRm9hcmQgCToJNDgJOgkxNjIyCitGb3J0IEJlbmQgCToJNDgJOgkzNTQ0NTIKK0ZyYW5rbGluIAk6CTQ4CToJOTQ1OAorRnJlZXN0b25lIAk6CTQ4CToJMTc4NjcKK0ZyaW8gCToJNDgJOgkxNjI1MgorR2FpbmVzIAk6CTQ4CToJMTQ0NjcKK0dhbHZlc3RvbiAJOgk0OAk6CTI1MDE1OAorR2FyemEgCToJNDgJOgk0ODcyCitHaWxsZXNwaWUgCToJNDgJOgkyMDgxNAorR2xhc3Njb2NrIAk6CTQ4CToJMTQwNgorR29saWFkIAk6CTQ4CToJNjkyOAorR29uemFsZXMgCToJNDgJOgkxODYyOAorR3JheSAJOgk0OAk6CTIyNzQ0CitHcmF5c29uIAk6CTQ4CToJMTEwNTk1CitHcmVnZyAJOgk0OAk6CTExMTM3OQorR3JpbWVzIAk6CTQ4CToJMjM1NTIKK0d1YWRhbHVwZSAJOgk0OAk6CTg5MDIzCitIYWxlIAk6CTQ4CToJMzY2MDIKK0hhbGwgCToJNDgJOgkzNzgyCitIYW1pbHRvbiAJOgk0OAk6CTgyMjkKK0hhbnNmb3JkIAk6CTQ4CToJNTM2OQorSGFyZGVtYW4gCToJNDgJOgk0NzI0CitIYXJkaW4gCToJNDgJOgk0ODA3MworSGFycmlzIAk6CTQ4CToJMzQwMDU3OAorSGFycmlzb24gCToJNDgJOgk2MjExMAorSGFydGxleSAJOgk0OAk6CTU1MzcKK0hhc2tlbGwgCToJNDgJOgk2MDkzCitIYXlzIAk6CTQ4CToJOTc1ODkKK0hlbXBoaWxsIAk6CTQ4CToJMzM1MQorSGVuZGVyc29uIAk6CTQ4CToJNzMyNzcKK0hpZGFsZ28gCToJNDgJOgk1Njk0NjMKK0hpbGwgCToJNDgJOgkzMjMyMQorSG9ja2xleSAJOgk0OAk6CTIyNzE2CitIb29kIAk6CTQ4CToJNDExMDAKK0hvcGtpbnMgCToJNDgJOgkzMTk2MAorSG91c3RvbiAJOgk0OAk6CTIzMTg1CitIb3dhcmQgCToJNDgJOgkzMzYyNworSHVkc3BldGggCToJNDgJOgkzMzQ0CitIdW50IAk6CTQ4CToJNzY1OTYKK0h1dGNoaW5zb24gCToJNDgJOgkyMzg1NworSXJpb24gCToJNDgJOgkxNzcxCitKYWNrIAk6CTQ4CToJODc2MworSmFja3NvbiAJOgk0OAk6CTE0MzkxCitKYXNwZXIgCToJNDgJOgkzNTYwNAorSmVmZiBEYXZpcyAJOgk0OAk6CTIyMDcKK0plZmZlcnNvbiAJOgk0OAk6CTI1MjA1MQorSmltIEhvZ2cgCToJNDgJOgk1MjgxCitKaW0gV2VsbHMgCToJNDgJOgkzOTMyNgorSm9obnNvbiAJOgk0OAk6CTEyNjgxMQorSm9uZXMgCToJNDgJOgkyMDc4NQorS2FybmVzIAk6CTQ4CToJMTU0NDYKK0thdWZtYW4gCToJNDgJOgk3MTMxMworS2VuZGFsbCAJOgk0OAk6CTIzNzQzCitLZW5lZHkgCToJNDgJOgk0MTQKK0tlbnQgCToJNDgJOgk4NTkKK0tlcnIgCToJNDgJOgk0MzY1MworS2ltYmxlIAk6CTQ4CToJNDQ2OAorS2luZyAJOgk0OAk6CTM1NgorS2lubmV5IAk6CTQ4CToJMzM3OQorS2xlYmVyZyAJOgk0OAk6CTMxNTQ5CitLbm94IAk6CTQ4CToJNDI1MworTGFtYXIgCToJNDgJOgk0ODQ5OQorTGFtYiAJOgk0OAk6CTE0NzA5CitMYW1wYXNhcyAJOgk0OAk6CTE3NzYyCitMYSBTYWxsZSAJOgk0OAk6CTU4NjYKK0xhdmFjYSAJOgk0OAk6CTE5MjEwCitMZWUgCToJNDgJOgkxNTY1NworTGVvbiAJOgk0OAk6CTE1MzM1CitMaWJlcnR5IAk6CTQ4CToJNzAxNTQKK0xpbWVzdG9uZSAJOgk0OAk6CTIyMDUxCitMaXBzY29tYiAJOgk0OAk6CTMwNTcKK0xpdmUgT2FrIAk6CTQ4CToJMTIzMDkKK0xsYW5vIAk6CTQ4CToJMTcwNDQKK0xvdmluZyAJOgk0OAk6CTY3CitMdWJib2NrIAk6CTQ4CToJMjQyNjI4CitMeW5uIAk6CTQ4CToJNjU1MAorTWNDdWxsb2NoIAk6CTQ4CToJODIwNQorTWNMZW5uYW4gCToJNDgJOgkyMTM1MTcKK01jTXVsbGVuIAk6CTQ4CToJODUxCitNYWRpc29uIAk6CTQ4CToJMTI5NDAKK01hcmlvbiAJOgk0OAk6CTEwOTQxCitNYXJ0aW4gCToJNDgJOgk0NzQ2CitNYXNvbiAJOgk0OAk6CTM3MzgKK01hdGFnb3JkYSAJOgk0OAk6CTM3OTU3CitNYXZlcmljayAJOgk0OAk6CTQ3Mjk3CitNZWRpbmEgCToJNDgJOgkzOTMwNAorTWVuYXJkIAk6CTQ4CToJMjM2MAorTWlkbGFuZCAJOgk0OAk6CTExNjAwOQorTWlsYW0gCToJNDgJOgkyNDIzOAorTWlsbHMgCToJNDgJOgk1MTUxCitNaXRjaGVsbCAJOgk0OAk6CTk2OTgKK01vbnRhZ3VlIAk6CTQ4CToJMTkxMTcKK01vbnRnb21lcnkgCToJNDgJOgkyOTM3NjgKK01vb3JlIAk6CTQ4CToJMjAxMjEKK01vcnJpcyAJOgk0OAk6CTEzMDQ4CitNb3RsZXkgCToJNDgJOgkxNDI2CitOYWNvZ2RvY2hlcyAJOgk0OAk6CTU5MjAzCitOYXZhcnJvIAk6CTQ4CToJNDUxMjQKK05ld3RvbiAJOgk0OAk6CTE1MDcyCitOb2xhbiAJOgk0OAk6CTE1ODAyCitOdWVjZXMgCToJNDgJOgkzMTM2NDUKK09jaGlsdHJlZSAJOgk0OAk6CTkwMDYKK09sZGhhbSAJOgk0OAk6CTIxODUKK09yYW5nZSAJOgk0OAk6CTg0OTY2CitQYWxvIFBpbnRvIAk6CTQ4CToJMjcwMjYKK1Bhbm9sYSAJOgk0OAk6CTIyNzU2CitQYXJrZXIgCToJNDgJOgk4ODQ5NQorUGFybWVyIAk6CTQ4CToJMTAwMTYKK1BlY29zIAk6CTQ4CToJMTY4MDkKK1BvbGsgCToJNDgJOgk0MTEzMworUG90dGVyIAk6CTQ4CToJMTEzNTQ2CitQcmVzaWRpbyAJOgk0OAk6CTczMDQKK1JhaW5zIAk6CTQ4CToJOTEzOQorUmFuZGFsbCAJOgk0OAk6CTEwNDMxMgorUmVhZ2FuIAk6CTQ4CToJMzMyNgorUmVhbCAJOgk0OAk6CTMwNDcKK1JlZCBSaXZlciAJOgk0OAk6CTE0MzE0CitSZWV2ZXMgCToJNDgJOgkxMzEzNworUmVmdWdpbyAJOgk0OAk6CTc4MjgKK1JvYmVydHMgCToJNDgJOgk4ODcKK1JvYmVydHNvbiAJOgk0OAk6CTE2MDAwCitSb2Nrd2FsbCAJOgk0OAk6CTQzMDgwCitSdW5uZWxzIAk6CTQ4CToJMTE0OTUKK1J1c2sgCToJNDgJOgk0NzM3MgorU2FiaW5lIAk6CTQ4CToJMTA0NjkKK1NhbiBBdWd1c3RpbmUgCToJNDgJOgk4OTQ2CitTYW4gSmFjaW50byAJOgk0OAk6CTIyMjQ2CitTYW4gUGF0cmljaW8gCToJNDgJOgk2NzEzOAorU2FuIFNhYmEgCToJNDgJOgk2MTg2CitTY2hsZWljaGVyIAk6CTQ4CToJMjkzNQorU2N1cnJ5IAk6CTQ4CToJMTYzNjEKK1NoYWNrZWxmb3JkIAk6CTQ4CToJMzMwMgorU2hlbGJ5IAk6CTQ4CToJMjUyMjQKK1NoZXJtYW4gCToJNDgJOgkzMTg2CitTbWl0aCAJOgk0OAk6CTE3NDcwNgorU29tZXJ2ZWxsIAk6CTQ4CToJNjgwOQorU3RhcnIgCToJNDgJOgk1MzU5NworU3RlcGhlbnMgCToJNDgJOgk5Njc0CitTdGVybGluZyAJOgk0OAk6CTEzOTMKK1N0b25ld2FsbCAJOgk0OAk6CTE2OTMKK1N1dHRvbiAJOgk0OAk6CTQwNzcKK1N3aXNoZXIgCToJNDgJOgk4Mzc4CitUYXJyYW50IAk6CTQ4CToJMTQ0NjIxOQorVGF5bG9yIAk6CTQ4CToJMTI2NTU1CitUZXJyZWxsIAk6CTQ4CToJMTA4MQorVGVycnkgCToJNDgJOgkxMjc2MQorVGhyb2NrbW9ydG9uIAk6CTQ4CToJMTg1MAorVGl0dXMgCToJNDgJOgkyODExOAorVG9tIEdyZWVuIAk6CTQ4CToJMTA0MDEwCitUcmF2aXMgCToJNDgJOgk4MTIyODAKK1RyaW5pdHkgCToJNDgJOgkxMzc3OQorVHlsZXIgCToJNDgJOgkyMDg3MQorVXBzaHVyIAk6CTQ4CToJMzUyOTEKK1VwdG9uIAk6CTQ4CToJMzQwNAorVXZhbGRlIAk6CTQ4CToJMjU5MjYKK1ZhbCBWZXJkZSAJOgk0OAk6CTQ0ODU2CitWYW4gWmFuZHQgCToJNDgJOgk0ODE0MAorVmljdG9yaWEgCToJNDgJOgk4NDA4OAorV2Fsa2VyIAk6CTQ4CToJNjE3NTgKK1dhbGxlciAJOgk0OAk6CTMyNjYzCitXYXJkIAk6CTQ4CToJMTA5MDkKK1dhc2hpbmd0b24gCToJNDgJOgkzMDM3MworV2ViYiAJOgk0OAk6CTE5MzExNworV2hhcnRvbiAJOgk0OAk6CTQxMTg4CitXaGVlbGVyIAk6CTQ4CToJNTI4NAorV2ljaGl0YSAJOgk0OAk6CTEzMTY2NAorV2lsYmFyZ2VyIAk6CTQ4CToJMTQ2NzYKK1dpbGxhY3kgCToJNDgJOgkyMDA4MgorV2lsbGlhbXNvbiAJOgk0OAk6CTI0OTk2NworV2lsc29uIAk6CTQ4CToJMzI0MDgKK1dpbmtsZXIgCToJNDgJOgk3MTczCitXaXNlIAk6CTQ4CToJNDg3OTMKK1dvb2QgCToJNDgJOgkzNjc1MgorWW9ha3VtIAk6CTQ4CToJNzMyMgorWW91bmcgCToJNDgJOgkxNzk0MworWmFwYXRhIAk6CTQ4CToJMTIxODIKK1phdmFsYSAJOgk0OAk6CTExNjAwCitCZWF2ZXIgCToJNDkJOgk2MDA1CitCb3ggRWxkZXIgCToJNDkJOgk0Mjc0NQorQ2FjaGUgCToJNDkJOgk5MTM5MQorQ2FyYm9uIAk6CTQ5CToJMjA0MjIKK0RhZ2dldHQgCToJNDkJOgk5MjEKK0RhdmlzIAk6CTQ5CToJMjM4OTk0CitEdWNoZXNuZSAJOgk0OQk6CTE0MzcxCitFbWVyeSAJOgk0OQk6CTEwODYwCitHYXJmaWVsZCAJOgk0OQk6CTQ3MzUKK0dyYW5kIAk6CTQ5CToJODQ4NQorSXJvbiAJOgk0OQk6CTMzNzc5CitKdWFiIAk6CTQ5CToJODIzOAorS2FuZSAJOgk0OQk6CTYwNDYKK01pbGxhcmQgCToJNDkJOgkxMjQwNQorTW9yZ2FuIAk6CTQ5CToJNzEyOQorUGl1dGUgCToJNDkJOgkxNDM1CitSaWNoIAk6CTQ5CToJMTk2MQorU2FsdCBMYWtlIAk6CTQ5CToJODk4Mzg3CitTYW4gSnVhbiAJOgk0OQk6CTE0NDEzCitTYW5wZXRlIAk6CTQ5CToJMjI3NjMKK1NldmllciAJOgk0OQk6CTE4ODQyCitTdW1taXQgCToJNDkJOgkyOTczNgorVG9vZWxlIAk6CTQ5CToJNDA3MzUKK1VpbnRhaCAJOgk0OQk6CTI1MjI0CitVdGFoIAk6CTQ5CToJMzY4NTM2CitXYXNhdGNoIAk6CTQ5CToJMTUyMTUKK1dhc2hpbmd0b24gCToJNDkJOgk5MDM1NAorV2F5bmUgCToJNDkJOgkyNTA5CitXZWJlciAJOgk0OQk6CTE5NjUzMworQWRkaXNvbiAJOgk1MAk6CTM1OTc0CitCZW5uaW5ndG9uIAk6CTUwCToJMzY5OTQKK0NhbGVkb25pYSAJOgk1MAk6CTI5NzAyCitDaGl0dGVuZGVuIAk6CTUwCToJMTQ2NTcxCitFc3NleCAJOgk1MAk6CTY0NTkKK0ZyYW5rbGluIAk6CTUwCToJNDU0MTcKK0dyYW5kIElzbGUgCToJNTAJOgk2OTAxCitMYW1vaWxsZSAJOgk1MAk6CTIzMjMzCitPcmFuZ2UgCToJNTAJOgkyODIyNgorT3JsZWFucyAJOgk1MAk6CTI2Mjc3CitSdXRsYW5kIAk6CTUwCToJNjM0MDAKK1dhc2hpbmd0b24gCToJNTAJOgk1ODAzOQorV2luZGhhbSAJOgk1MAk6CTQ0MjE2CitXaW5kc29yIAk6CTUwCToJNTc0MTgKK0FjY29tYWNrIAk6CTUxCToJMzgzMDUKK0FsYmVtYXJsZSAJOgk1MQk6CTc5MjM2CitBbGxlZ2hhbnkgCToJNTEJOgkxMjkyNgorQW1lbGlhIAk6CTUxCToJMTE0MDAKK0FtaGVyc3QgCToJNTEJOgkzMTg5NAorQXBwb21hdHRveCAJOgk1MQk6CTEzNzA1CitBcmxpbmd0b24gCToJNTEJOgkxODk0NTMKK0F1Z3VzdGEgCToJNTEJOgk2NTYxNQorQmF0aCAJOgk1MQk6CTUwNDgKK0JlZGZvcmQgCToJNTEJOgk2MDM3MQorQmxhbmQgCToJNTEJOgk2ODcxCitCb3RldG91cnQgCToJNTEJOgkzMDQ5NgorQnJ1bnN3aWNrIAk6CTUxCToJMTg0MTkKK0J1Y2hhbmFuIAk6CTUxCToJMjY5NzgKK0J1Y2tpbmdoYW0gCToJNTEJOgkxNTYyMworQ2FtcGJlbGwgCToJNTEJOgk1MTA3OAorQ2Fyb2xpbmUgCToJNTEJOgkyMjEyMQorQ2Fycm9sbCAJOgk1MQk6CTI5MjQ1CitDaGFybGVzIENpdHkgCToJNTEJOgk2OTI2CitDaGFybG90dGUgCToJNTEJOgkxMjQ3MgorQ2hlc3RlcmZpZWxkIAk6CTUxCToJMjU5OTAzCitDbGFya2UgCToJNTEJOgkxMjY1MgorQ3JhaWcgCToJNTEJOgk1MDkxCitDdWxwZXBlciAJOgk1MQk6CTM0MjYyCitDdW1iZXJsYW5kIAk6CTUxCToJOTAxNworRGlja2Vuc29uIAk6CTUxCToJMTYzOTUKK0RpbndpZGRpZSAJOgk1MQk6CTI0NTMzCitFc3NleCAJOgk1MQk6CTk5ODkKK0ZhaXJmYXggCToJNTEJOgk5Njk3NDkKK0ZhdXF1aWVyIAk6CTUxCToJNTUxMzkKK0Zsb3lkIAk6CTUxCToJMTM4NzQKK0ZsdXZhbm5hIAk6CTUxCToJMjAwNDcKK0ZyYW5rbGluIAk6CTUxCToJNDcyODYKK0ZyZWRlcmljayAJOgk1MQk6CTU5MjA5CitHaWxlcyAJOgk1MQk6CTE2NjU3CitHbG91Y2VzdGVyIAk6CTUxCToJMzQ3ODAKK0dvb2NobGFuZCAJOgk1MQk6CTE2ODYzCitHcmF5c29uIAk6CTUxCToJMTc5MTcKK0dyZWVuZSAJOgk1MQk6CTE1MjQ0CitHcmVlbnN2aWxsZSAJOgk1MQk6CTExNTYwCitIYWxpZmF4IAk6CTUxCToJMzczNTUKK0hhbm92ZXIgCToJNTEJOgk4NjMyMAorSGVucmljbyAJOgk1MQk6CTI2MjMwMAorSGVucnkgCToJNTEJOgk1NzkzMAorSGlnaGxhbmQgCToJNTEJOgkyNTM2CitJc2xlIG9mIFdpZ2h0IAk6CTUxCToJMjk3MjgKK0phbWVzIENpdHkgCToJNTEJOgk0ODEwMgorS2luZyBhbmQgUXVlZW4gCToJNTEJOgk2NjMwCitLaW5nIEdlb3JnZSAJOgk1MQk6CTE2ODAzCitLaW5nIFdpbGxpYW0gCToJNTEJOgkxMzE0NgorTGFuY2FzdGVyIAk6CTUxCToJMTE1NjcKK0xlZSAJOgk1MQk6CTIzNTg5CitMb3Vkb3VuIAk6CTUxCToJMTY5NTk5CitMb3Vpc2EgCToJNTEJOgkyNTYyNworTHVuZW5idXJnIAk6CTUxCToJMTMxNDYKK01hZGlzb24gCToJNTEJOgkxMjUyMAorTWF0aGV3cyAJOgk1MQk6CTkyMDcKK01lY2tsZW5idXJnIAk6CTUxCToJMzIzODAKK01pZGRsZXNleCAJOgk1MQk6CTk5MzIKK01vbnRnb21lcnkgCToJNTEJOgk4MzYyOQorTmVsc29uIAk6CTUxCToJMTQ0NDUKK05ldyBLZW50IAk6CTUxCToJMTM0NjIKK05vcnRoYW1wdG9uIAk6CTUxCToJMTMwOTMKK05vcnRodW1iZXJsYW5kIAk6CTUxCToJMTIyNTkKK05vdHRvd2F5IAk6CTUxCToJMTU3MjUKK09yYW5nZSAJOgk1MQk6CTI1ODgxCitQYWdlIAk6CTUxCToJMjMxNzcKK1BhdHJpY2sgCToJNTEJOgkxOTQwNworUGl0dHN5bHZhbmlhIAk6CTUxCToJNjE3NDUKK1Bvd2hhdGFuIAk6CTUxCToJMjIzNzcKK1ByaW5jZSBFZHdhcmQgCToJNTEJOgkxOTcyMAorUHJpbmNlIEdlb3JnZSAJOgk1MQk6CTMzMDQ3CitQcmluY2UgV2lsbGlhbSAJOgk1MQk6CTI4MDgxMworUHVsYXNraSAJOgk1MQk6CTM1MTI3CitSYXBwYWhhbm5vY2sgCToJNTEJOgk2OTgzCitSaWNobW9uZCAJOgk1MQk6CTg4MDkKK1JvYW5va2UgCToJNTEJOgk4NTc3OAorUm9ja2JyaWRnZSAJOgk1MQk6CTIwODA4CitSb2NraW5naGFtIAk6CTUxCToJNjc3MjUKK1J1c3NlbGwgCToJNTEJOgkzMDMwOAorU2NvdHQgCToJNTEJOgkyMzQwMworU2hlbmFuZG9haCAJOgk1MQk6CTM1MDc1CitTbXl0aCAJOgk1MQk6CTMzMDgxCitTb3V0aGFtcHRvbiAJOgk1MQk6CTE3NDgyCitTcG90c3lsdmFuaWEgCToJNTEJOgk5MDM5NQorU3RhZmZvcmQgCToJNTEJOgk5MjQ0NgorU3VycnkgCToJNTEJOgk2ODI5CitTdXNzZXggCToJNTEJOgkxMjUwNAorVGF6ZXdlbGwgCToJNTEJOgk0NDU5OAorV2FycmVuIAk6CTUxCToJMzE1ODQKK1dhc2hpbmd0b24gCToJNTEJOgk1MTEwMworV2VzdG1vcmVsYW5kIAk6CTUxCToJMTY3MTgKK1dpc2UgCToJNTEJOgk0MDEyMworV3l0aGUgCToJNTEJOgkyNzU5OQorWW9yayAJOgk1MQk6CTU2Mjk3CitBbGV4YW5kcmlhIAk6CTUxCToJMTI4MjgzCitCZWRmb3JkIAk6CTUxCToJNjI5OQorQnJpc3RvbCAJOgk1MQk6CTE3MzY3CitCdWVuYSBWaXN0YSAJOgk1MQk6CTYzNDkKK0NoYXJsb3R0ZXN2aWxsZSAJOgk1MQk6CTQ1MDQ5CitDaGVzYXBlYWtlIAk6CTUxCToJMTk5MTg0CitDbGlmdG9uIEZvcmdlIAk6CTUxCToJNDI4OQorQ29sb25pYWwgSGVpZ2h0cyAJOgk1MQk6CTE2ODk3CitDb3Zpbmd0b24gCToJNTEJOgk2MzAzCitEYW52aWxsZSAJOgk1MQk6CTQ4NDExCitFbXBvcmlhIAk6CTUxCToJNTY2NQorRmFpcmZheCAJOgk1MQk6CTIxNDk4CitGYWxscyBDaHVyY2ggCToJNTEJOgkxMDM3NworRnJhbmtsaW4gCToJNTEJOgk4MzQ2CitGcmVkZXJpY2tzYnVyZyAJOgk1MQk6CTE5Mjc5CitHYWxheCAJOgk1MQk6CTY4MzcKK0hhbXB0b24gCToJNTEJOgkxNDY0MzcKK0hhcnJpc29uYnVyZyAJOgk1MQk6CTQwNDY4CitIb3Bld2VsbCAJOgk1MQk6CTIyMzU0CitMZXhpbmd0b24gCToJNTEJOgk2ODY3CitMeW5jaGJ1cmcgCToJNTEJOgk2NTI2OQorTWFuYXNzYXMgCToJNTEJOgkzNTEzNQorTWFuYXNzYXMgUGFyayAJOgk1MQk6CTEwMjkwCitNYXJ0aW5zdmlsbGUgCToJNTEJOgkxNTQxNgorTmV3cG9ydCBOZXdzIAk6CTUxCToJMTgwMTUwCitOb3Jmb2xrIAk6CTUxCToJMjM0NDAzCitOb3J0b24gCToJNTEJOgkzOTA0CitQZXRlcnNidXJnIAk6CTUxCToJMzM3NDAKK1BvcXVvc29uIAk6CTUxCToJMTE1NjYKK1BvcnRzbW91dGggCToJNTEJOgkxMDA1NjUKK1JhZGZvcmQgCToJNTEJOgkxNTg1OQorUmljaG1vbmQgCToJNTEJOgkxOTc3OTAKK1JvYW5va2UgCToJNTEJOgk5NDkxMQorU2FsZW0gCToJNTEJOgkyNDc0NworU3RhdW50b24gCToJNTEJOgkyMzg1MworU3VmZm9sayAJOgk1MQk6CTYzNjc3CitWaXJnaW5pYSBCZWFjaCAJOgk1MQk6CTQyNTI1NworV2F5bmVzYm9ybyAJOgk1MQk6CTE5NTIwCitXaWxsaWFtc2J1cmcgCToJNTEJOgkxMTk5OAorV2luY2hlc3RlciAJOgk1MQk6CTIzNTg1CitBZGFtcyAJOgk1Mwk6CTE2NDI4CitBc290aW4gCToJNTMJOgkyMDU1MQorQmVudG9uIAk6CTUzCToJMTQyNDc1CitDaGVsYW4gCToJNTMJOgk2NjYxNgorQ2xhbGxhbSAJOgk1Mwk6CTY0NTI1CitDbGFyayAJOgk1Mwk6CTM0NTIzOAorQ29sdW1iaWEgCToJNTMJOgk0MDY0CitDb3dsaXR6IAk6CTUzCToJOTI5NDgKK0RvdWdsYXMgCToJNTMJOgkzMjYwMworRmVycnkgCToJNTMJOgk3MjYwCitGcmFua2xpbiAJOgk1Mwk6CTQ5MzQ3CitHYXJmaWVsZCAJOgk1Mwk6CTIzOTcKK0dyYW50IAk6CTUzCToJNzQ2OTgKK0dyYXlzIEhhcmJvciAJOgk1Mwk6CTY3MTk0CitJc2xhbmQgCToJNTMJOgk3MTU1OAorSmVmZmVyc29uIAk6CTUzCToJMjU5NTMKK0tpbmcgCToJNTMJOgkxNzM3MDM0CitLaXRzYXAgCToJNTMJOgkyMzE5NjkKK0tpdHRpdGFzIAk6CTUzCToJMzMzNjIKK0tsaWNraXRhdCAJOgk1Mwk6CTE5MTYxCitMZXdpcyAJOgk1Mwk6CTY4NjAwCitMaW5jb2xuIAk6CTUzCToJMTAxODQKK01hc29uIAk6CTUzCToJNDk0MDUKK09rYW5vZ2FuIAk6CTUzCToJMzk1NjQKK1BhY2lmaWMgCToJNTMJOgkyMDk4NAorUGVuZCBPcmVpbGxlIAk6CTUzCToJMTE3MzIKK1BpZXJjZSAJOgk1Mwk6CTcwMDgyMAorU2FuIEp1YW4gCToJNTMJOgkxNDA3NworU2thZ2l0IAk6CTUzCToJMTAyOTc5CitTa2FtYW5pYSAJOgk1Mwk6CTk4NzIKK1Nub2hvbWlzaCAJOgk1Mwk6CTYwNjAyNAorU3Bva2FuZSAJOgk1Mwk6CTQxNzkzOQorU3RldmVucyAJOgk1Mwk6CTQwMDY2CitUaHVyc3RvbiAJOgk1Mwk6CTIwNzM1NQorV2Foa2lha3VtIAk6CTUzCToJMzgyNAorV2FsbGEgV2FsbGEgCToJNTMJOgk1NTE4MAorV2hhdGNvbSAJOgk1Mwk6CTE2NjgxNAorV2hpdG1hbiAJOgk1Mwk6CTQwNzQwCitZYWtpbWEgCToJNTMJOgkyMjI1ODEKK0JhcmJvdXIgCToJNTQJOgkxNTU1NworQmVya2VsZXkgCToJNTQJOgk3NTkwNQorQm9vbmUgCToJNTQJOgkyNTUzNQorQnJheHRvbiAJOgk1NAk6CTE0NzAyCitCcm9va2UgCToJNTQJOgkyNTQ0NworQ2FiZWxsIAk6CTU0CToJOTY3ODQKK0NhbGhvdW4gCToJNTQJOgk3NTgyCitDbGF5IAk6CTU0CToJMTAzMzAKK0RvZGRyaWRnZSAJOgk1NAk6CTc0MDMKK0ZheWV0dGUgCToJNTQJOgk0NzU3OQorR2lsbWVyIAk6CTU0CToJNzE2MAorR3JhbnQgCToJNTQJOgkxMTI5OQorR3JlZW5icmllciAJOgk1NAk6CTM0NDUzCitIYW1wc2hpcmUgCToJNTQJOgkyMDIwMworSGFuY29jayAJOgk1NAk6CTMyNjY3CitIYXJkeSAJOgk1NAk6CTEyNjY5CitIYXJyaXNvbiAJOgk1NAk6CTY4NjUyCitKYWNrc29uIAk6CTU0CToJMjgwMDAKK0plZmZlcnNvbiAJOgk1NAk6CTQyMTkwCitLYW5hd2hhIAk6CTU0CToJMjAwMDczCitMZXdpcyAJOgk1NAk6CTE2OTE5CitMaW5jb2xuIAk6CTU0CToJMjIxMDgKK0xvZ2FuIAk6CTU0CToJMzc3MTAKK01jRG93ZWxsIAk6CTU0CToJMjczMjkKK01hcmlvbiAJOgk1NAk6CTU2NTk4CitNYXJzaGFsbCAJOgk1NAk6CTM1NTE5CitNYXNvbiAJOgk1NAk6CTI1OTU3CitNZXJjZXIgCToJNTQJOgk2Mjk4MAorTWluZXJhbCAJOgk1NAk6CTI3MDc4CitNaW5nbyAJOgk1NAk6CTI4MjUzCitNb25vbmdhbGlhIAk6CTU0CToJODE4NjYKK01vbnJvZSAJOgk1NAk6CTE0NTgzCitNb3JnYW4gCToJNTQJOgkxNDk0MworTmljaG9sYXMgCToJNTQJOgkyNjU2MgorT2hpbyAJOgk1NAk6CTQ3NDI3CitQZW5kbGV0b24gCToJNTQJOgk4MTk2CitQbGVhc2FudHMgCToJNTQJOgk3NTE0CitQb2NhaG9udGFzIAk6CTU0CToJOTEzMQorUHJlc3RvbiAJOgk1NAk6CTI5MzM0CitQdXRuYW0gCToJNTQJOgk1MTU4OQorUmFsZWlnaCAJOgk1NAk6CTc5MjIwCitSYW5kb2xwaCAJOgk1NAk6CTI4MjYyCitSaXRjaGllIAk6CTU0CToJMTAzNDMKK1JvYW5lIAk6CTU0CToJMTU0NDYKK1N1bW1lcnMgCToJNTQJOgkxMjk5OQorVGF5bG9yIAk6CTU0CToJMTYwODkKK1R1Y2tlciAJOgk1NAk6CTczMjEKK1R5bGVyIAk6CTU0CToJOTU5MgorVXBzaHVyIAk6CTU0CToJMjM0MDQKK1dheW5lIAk6CTU0CToJNDI5MDMKK1dlYnN0ZXIgCToJNTQJOgk5NzE5CitXZXR6ZWwgCToJNTQJOgkxNzY5MworV2lydCAJOgk1NAk6CTU4NzMKK1dvb2QgCToJNTQJOgk4Nzk4NgorV3lvbWluZyAJOgk1NAk6CTI1NzA4CitBZGFtcyAJOgk1NQk6CTE4NjQzCitBc2hsYW5kIAk6CTU1CToJMTY4NjYKK0JhcnJvbiAJOgk1NQk6CTQ0OTYzCitCYXlmaWVsZCAJOgk1NQk6CTE1MDEzCitCcm93biAJOgk1NQk6CTIyNjc3OAorQnVmZmFsbyAJOgk1NQk6CTEzODA0CitCdXJuZXR0IAk6CTU1CToJMTU2NzQKK0NhbHVtZXQgCToJNTUJOgk0MDYzMQorQ2hpcHBld2EgCToJNTUJOgk1NTE5NQorQ2xhcmsgCToJNTUJOgkzMzU1NworQ29sdW1iaWEgCToJNTUJOgk1MjQ2OAorQ3Jhd2ZvcmQgCToJNTUJOgkxNzI0MworRGFuZSAJOgk1NQk6CTQyNjUyNgorRG9kZ2UgCToJNTUJOgk4NTg5NworRG9vciAJOgk1NQk6CTI3OTYxCitEb3VnbGFzIAk6CTU1CToJNDMyODcKK0R1bm4gCToJNTUJOgkzOTg1OAorRWF1IENsYWlyZSAJOgk1NQk6CTkzMTQyCitGbG9yZW5jZSAJOgk1NQk6CTUwODgKK0ZvbmQgZHUgTGFjIAk6CTU1CToJOTcyOTYKK0ZvcmVzdCAJOgk1NQk6CTEwMDI0CitHcmFudCAJOgk1NQk6CTQ5NTk3CitHcmVlbiAJOgk1NQk6CTMzNjQ3CitHcmVlbiBMYWtlIAk6CTU1CToJMTkxMDUKK0lvd2EgCToJNTUJOgkyMjc4MAorSXJvbiAJOgk1NQk6CTY4NjEKK0phY2tzb24gCToJNTUJOgkxOTEwMAorSmVmZmVyc29uIAk6CTU1CToJNzQwMjEKK0p1bmVhdSAJOgk1NQk6CTI0MzE2CitLZW5vc2hhIAk6CTU1CToJMTQ5NTc3CitLZXdhdW5lZSAJOgk1NQk6CTIwMTg3CitMYSBDcm9zc2UgCToJNTUJOgkxMDcxMjAKK0xhZmF5ZXR0ZSAJOgk1NQk6CTE2MTM3CitMYW5nbGFkZSAJOgk1NQk6CTIwNzQwCitMaW5jb2xuIAk6CTU1CToJMjk2NDEKK01hbml0b3dvYyAJOgk1NQk6CTgyODg3CitNYXJhdGhvbiAJOgk1NQk6CTEyNTgzNAorTWFyaW5ldHRlIAk6CTU1CToJNDMzODQKK01hcnF1ZXR0ZSAJOgk1NQk6CTE1ODMyCitNZW5vbWluZWUgCToJNTUJOgk0NTYyCitNaWx3YXVrZWUgCToJNTUJOgk5NDAxNjQKK01vbnJvZSAJOgk1NQk6CTQwODk5CitPY29udG8gCToJNTUJOgkzNTYzNAorT25laWRhIAk6CTU1CToJMzY3NzYKK091dGFnYW1pZSAJOgk1NQk6CTE2MDk3MQorT3phdWtlZSAJOgk1NQk6CTgyMzE3CitQZXBpbiAJOgk1NQk6CTcyMTMKK1BpZXJjZSAJOgk1NQk6CTM2ODA0CitQb2xrIAk6CTU1CToJNDEzMTkKK1BvcnRhZ2UgCToJNTUJOgk2NzE4MgorUHJpY2UgCToJNTUJOgkxNTgyMgorUmFjaW5lIAk6CTU1CToJMTg4ODMxCitSaWNobGFuZCAJOgk1NQk6CTE3OTI0CitSb2NrIAk6CTU1CToJMTUyMzA3CitSdXNrIAk6CTU1CToJMTUzNDcKK1N0LiBDcm9peCAJOgk1NQk6CTYzMTU1CitTYXVrIAk6CTU1CToJNTUyMjUKK1Nhd3llciAJOgk1NQk6CTE2MTk2CitTaGF3YW5vIAk6CTU1CToJNDA2NjQKK1NoZWJveWdhbiAJOgk1NQk6CTExMjY0NgorVGF5bG9yIAk6CTU1CToJMTk2ODAKK1RyZW1wZWFsZWF1IAk6CTU1CToJMjcwMTAKK1Zlcm5vbiAJOgk1NQk6CTI4MDU2CitWaWxhcyAJOgk1NQk6CTIxMDMzCitXYWx3b3J0aCAJOgk1NQk6CTkzNzU5CitXYXNoYnVybiAJOgk1NQk6CTE2MDM2CitXYXNoaW5ndG9uIAk6CTU1CToJMTE3NDkzCitXYXVrZXNoYSAJOgk1NQk6CTM2MDc2NworV2F1cGFjYSAJOgk1NQk6CTUxNzMxCitXYXVzaGFyYSAJOgk1NQk6CTIzMTU0CitXaW5uZWJhZ28gCToJNTUJOgkxNTY3NjMKK1dvb2QgCToJNTUJOgk3NTU1NQorQWxiYW55IAk6CTU2CToJMzIwMTQKK0JpZyBIb3JuIAk6CTU2CToJMTE0NjEKK0NhbXBiZWxsIAk6CTU2CToJMzM2OTgKK0NhcmJvbiAJOgk1Ngk6CTE1NjM5CitDb252ZXJzZSAJOgk1Ngk6CTEyMDUyCitDcm9vayAJOgk1Ngk6CTU4ODcKK0ZyZW1vbnQgCToJNTYJOgkzNTgwNAorR29zaGVuIAk6CTU2CToJMTI1MzgKK0hvdCBTcHJpbmdzIAk6CTU2CToJNDg4MgorSm9obnNvbiAJOgk1Ngk6CTcwNzUKK0xhcmFtaWUgCToJNTYJOgk4MTYwNworTGluY29sbiAJOgk1Ngk6CTE0NTczCitOYXRyb25hIAk6CTU2CToJNjY1MzMKK05pb2JyYXJhIAk6CTU2CToJMjQwNworUGFyayAJOgk1Ngk6CTI1Nzg2CitQbGF0dGUgCToJNTYJOgk4ODA3CitTaGVyaWRhbiAJOgk1Ngk6CTI2NTYwCitTdWJsZXR0ZSAJOgk1Ngk6CTU5MjAKK1N3ZWV0d2F0ZXIgCToJNTYJOgkzNzYxMworVGV0b24gCToJNTYJOgkxODI1MQorVWludGEgCToJNTYJOgkxOTc0MgorV2FzaGFraWUgCToJNTYJOgk4Mjg5CitXZXN0b24gCToJNTYJOgk2NjQ0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VTQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9VU0FfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiNTRhNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9VU0FfQVJFQS50eHQKQEAgLTAsMCArMSw1MiBAQAorVW5pdGVkIFN0YXRlcyA6IDAgOiA5NjMxNDIwCitBbGFiYW1hCToJMQk6CTUyNDE5LjAyCitBbGFza2EJOgkxCToJNjYzMjY3LjI2CitBcml6b25hCToJMQk6CTExMzk5OC4zMAorQXJrYW5zYXMJOgkxCToJNTMxNzguNjIKK0NhbGlmb3JuaWEJOgkxCToJMTYzNjk1LjU3CitDb2xvcmFkbwk6CTEJOgkxMDQwOTMuNTcKK0Nvbm5lY3RpY3V0CToJMQk6CTU1NDMuMzMKK0RlbGF3YXJlCToJMQk6CTI0ODkuMjcKK0Rpc3RyaWN0IG9mIENvbHVtYmlhCToJMQk6CTY4LjM0CitGbG9yaWRhCToJMQk6CTY1NzU0LjU5CitHZW9yZ2lhCToJMQk6CTU5NDI0Ljc3CitIYXdhaWkJOgkxCToJMTA5MzAuOTgKK0lkYWhvCToJMQk6CTgzNTcwLjA4CitJbGxpbm9pcwk6CTEJOgk1NzkxNC4zOAorSW5kaWFuYQk6CTEJOgkzNjQxNy43MworSW93YQk6CTEJOgk1NjI3MS41NQorS2Fuc2FzCToJMQk6CTgyMjc2Ljg0CitLZW50dWNreQk6CTEJOgk0MDQwOS4wMgorTG91aXNpYW5hCToJMQk6CTUxODM5LjcwCitNYWluZQk6CTEJOgkzNTM4NC42NQorTWFyeWxhbmQJOgkxCToJMTI0MDYuNjgKK01hc3NhY2h1c2V0dHMJOgkxCToJMTA1NTQuNTcKK01pY2hpZ2FuCToJMQk6CTk2NzE2LjExCitNaW5uZXNvdGEJOgkxCToJODY5MzguODcKK01pc3Npc3NpcHBpCToJMQk6CTQ4NDMwLjE5CitNaXNzb3VyaQk6CTEJOgk2OTcwNC4zMQorTW9udGFuYQk6CTEJOgkxNDcwNDIuNDAKK05lYnJhc2thCToJMQk6CTc3MzUzLjczCitOZXZhZGEJOgkxCToJMTEwNTYwLjcxCitOZXcgSGFtcHNoaXJlCToJMQk6CTkzNDkuOTQKK05ldyBKZXJzZXkJOgkxCToJODcyMS4zMAorTmV3IE1leGljbwk6CTEJOgkxMjE1ODkuNDgKK05ldyBZb3JrCToJMQk6CTU0NTU2LjAwCitOb3J0aCBDYXJvbGluYQk6CTEJOgk1MzgxOC41MQorTm9ydGggRGFrb3RhCToJMQk6CTcwNjk5Ljc5CitPaGlvCToJMQk6CTQ0ODI0LjkwCitPa2xhaG9tYQk6CTEJOgk2OTg5OC4xOQorT3JlZ29uCToJMQk6CTk4MzgwLjY0CitQZW5uc3lsdmFuaWEJOgkxCToJNDYwNTUuMjQKK1Job2RlIElzbGFuZAk6CTEJOgkxNTQ1LjA1CitTb3V0aCBDYXJvbGluYQk6CTEJOgkzMjAyMC4yMAorU291dGggRGFrb3RhCToJMQk6CTc3MTE2LjQ5CitUZW5uZXNzZWUJOgkxCToJNDIxNDMuMjcKK1RleGFzCToJMQk6CTI2ODU4MC44MgorVXRhaAk6CTEJOgk4NDg5OC44MworVmVybW9udAk6CTEJOgk5NjE0LjI2CitWaXJnaW5pYQk6CTEJOgk0Mjc3NC4yMAorV2FzaGluZ3Rvbgk6CTEJOgk3MTI5OS42NAorV2VzdCBWaXJnaW5pYQk6CTEJOgkyNDIyOS43NgorV2lzY29uc2luCToJMQk6CTY1NDk3LjgyCitXeW9taW5nCToJMQk6CTk3ODEzLjU2CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVVNBX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VTQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmM2MzQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VTQV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDUyIEBACitVbml0ZWQgU3RhdGVzCToJMAk6CTI4MTQyMTkwNgorICAgIENhbGlmb3JuaWEJOgkxCToJMzM4NzE2NDgKKyAgICBUZXhhcwk6CTEJOgkyMDg1MTgyMAorICAgIE5ldyBZb3JrCToJMQk6CTE4OTc2NDU3CisgICAgRmxvcmlkYQk6CTEJOgkxNTk4MjM3OAorICAgIElsbGlub2lzCToJMQk6CTEyNDE5MjkzCisgICAgUGVubnN5bHZhbmlhCToJMQk6CTEyMjgxMDU0CisgICAgT2hpbwk6CTEJOgkxMTM1MzE0MAorICAgIE1pY2hpZ2FuCToJMQk6CTk5Mzg0NDQKKyAgICBOZXcgSmVyc2V5CToJMQk6CTg0MTQzNTAKKyAgICBHZW9yZ2lhCToJMQk6CTgxODY0NTMKKyAgICBOb3J0aCBDYXJvbGluYQk6CTEJOgk4MDQ5MzEzCisgICAgVmlyZ2luaWEJOgkxCToJNzA3ODUxNQorICAgIE1hc3NhY2h1c2V0dHMJOgkxCToJNjM0OTA5NworICAgIEluZGlhbmEJOgkxCToJNjA4MDQ4NQorICAgIFdhc2hpbmd0b24JOgkxCToJNTg5NDEyMQorICAgIFRlbm5lc3NlZQk6CTEJOgk1Njg5MjgzCisgICAgTWlzc291cmkJOgkxCToJNTU5NTIxMQorICAgIFdpc2NvbnNpbgk6CTEJOgk1MzYzNjc1CisgICAgTWFyeWxhbmQJOgkxCToJNTI5NjQ4NgorICAgIEFyaXpvbmEJOgkxCToJNTEzMDYzMgorICAgIE1pbm5lc290YQk6CTEJOgk0OTE5NDc5CisgICAgTG91aXNpYW5hCToJMQk6CTQ0Njg5NzYKKyAgICBBbGFiYW1hCToJMQk6CTQ0NDcxMDAKKyAgICBDb2xvcmFkbwk6CTEJOgk0MzAxMjYxCisgICAgS2VudHVja3kJOgkxCToJNDA0MTc2OQorICAgIFNvdXRoIENhcm9saW5hCToJMQk6CTQwMTIwMTIKKyAgICBPa2xhaG9tYQk6CTEJOgkzNDUwNjU0CisgICAgT3JlZ29uCToJMQk6CTM0MjEzOTkKKyAgICBDb25uZWN0aWN1dAk6CTEJOgkzNDA1NTY1CisgICAgSW93YQk6CTEJOgkyOTI2MzI0CisgICAgTWlzc2lzc2lwcGkJOgkxCToJMjg0NDY1OAorICAgIEthbnNhcwk6CTEJOgkyNjg4NDE4CisgICAgQXJrYW5zYXMJOgkxCToJMjY3MzQwMAorICAgIFV0YWgJOgkxCToJMjIzMzE2OQorICAgIE5ldmFkYQk6CTEJOgkxOTk4MjU3CisgICAgTmV3IE1leGljbwk6CTEJOgkxODE5MDQ2CisgICAgV2VzdCBWaXJnaW5pYQk6CTEJOgkxODA4MzQ0CisgICAgTmVicmFza2EJOgkxCToJMTcxMTI2MworICAgIElkYWhvCToJMQk6CTEyOTM5NTMKKyAgICBNYWluZQk6CTEJOgkxMjc0OTIzCisgICAgTmV3IEhhbXBzaGlyZQk6CTEJOgkxMjM1Nzg2CisgICAgSGF3YWlpCToJMQk6CTEyMTE1MzcKKyAgICBSaG9kZSBJc2xhbmQJOgkxCToJMTA0ODMxOQorICAgIE1vbnRhbmEJOgkxCToJOTAyMTk1CisgICAgRGVsYXdhcmUJOgkxCToJNzgzNjAwCisgICAgU291dGggRGFrb3RhCToJMQk6CTc1NDg0NAorICAgIE5vcnRoIERha290YQk6CTEJOgk2NDIyMDAKKyAgICBBbGFza2EJOgkxCToJNjI2OTMyCisgICAgVmVybW9udAk6CTEJOgk2MDg4MjcKKyAgICBEaXN0cmljdCBvZiBDb2x1bWJpYQk6CTEJOgk1NzIwNTkKKyAgICBXeW9taW5nCToJMQk6CTQ5Mzc4MgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VaQkVLSVNUQU5fQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVVpCRUtJU1RBTl9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWJkMmNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VaQkVLSVNUQU5fQVJFQS50eHQKQEAgLTAsMCArMSwyMSBAQAorVXpiZWtpc3Rhbgk6CTAJOgk0NDc0MDAKK1FvcmFxYWxwb2doaXN0b24gIFtBcmFsIFNlYV0gOiAxIDogMTY0MDAwCitBbmRpamFuIFtBbmRpemhhbl0gCToJMQk6CTQyMDAKK0J1a2hhcmEgCToJMQk6CTM5NDAwCitGZXJnaGFuYSBbRmVyZ2FuYV0JOgkxCToJNjgwMAorSml6emFrIAk6CTEJOgkyMDUwMAorTnVrdXMgCToJMQk6CTE2NTYwMAorS2Fyc2hpIAk6CTEJOgkyODQwMAorVXJnZW5jaCAJOgkxCToJNjMwMAorTmFtYW5nYW4gCToJMQk6CTc5MDAKK05hdm9peSAJOgkxCToJMTEwODAwCitTYW1hcnFhbmQgW1NhbWFya2FuZF0JOgkxCToJMTY0MDAKK1Rlcm1leiAJOgkxCToJMjA4MDAKK0d1bGlzdGFuIAk6CTEJOgk1MTAwCitUYXNoa2VudCBDaXR5CToJMQk6CTMwMAorVGFzaGtlbnQgW1Rhc2hrZW50IE9ibGFzdF0JOgkxCToJMTUwMDAKK0thcmFrYWxwYWsgOiAxIDogMTY0OTAwCitLYXNoa2FkYXJ5YSA6IDEgOiAyODQwMAorS2hvcmV6bSA6IDEgIDogNjMwMAorU3Vya2hhbmRhcnlhIDogMSA6IDIwODAwCitTeXJkYXJ5YSA6IDEgOiA1MTAwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVVpCRUtJU1RBTl9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9VWkJFS0lTVEFOX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzODg0MTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVVpCRUtJU1RBTl9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDI0IEBACitVemJla2lzdGFuCToJMAk6CTI3MzA3MTM0CitRb3JhcWFscG9naGlzdG9uICBbQXJhbCBTZWFdIDogMSA6IDEzNDMwMDAKK0FuZGlqYW4gW0FuZGl6aGFuXSAgCToJMQk6CTIyODYwMDAKK0J1a2hhcmEgCToJMQk6CTE1MzQ5MDAKK0ZlcmdoYW5hIFtGZXJnYW5hXQk6CTEJOgkyNzYxMzAwCitKaXp6YWsgCToJMQk6CTEwMjYwMDAKK051a3VzIAk6CTEJOgkxNjMzOTAwCitLYXJzaGkgCToJMQk6CTIzMDIwMDAKK1VyZ2VuY2ggCToJMQk6CTE0MDI2MDAKK05hbWFuZ2FuIAk6CTEJOgkyMDQ5OTAwCitOYXZvaXkgCToJMQk6CTg3NzEwMAorU2FtYXJxYW5kIFtTYW1hcmthbmRdIAk6CTEJOgkyNzQ5MTAwCitUZXJtZXogCToJMQk6CTE4NDY0MDAKK0d1bGlzdGFuIAk6CTEJOgk2NzA4MDAKK1Rhc2hrZW50IENpdHkJOgkxCToJMjEyMDAwMAorVGFzaGtlbnQgW1Rhc2hrZW50IE9ibGFzdF0gCToJMQk6CTI4NjY4MDAKK0thcmFrYWxwYWsgOiAxIDogMTM0MzAwMAorS2FzaGthZGFyeWEgOiAxIDogMTgxMjAwMAorS2hvcmV6bSA6IDEgIDogMTEzNTAwMAorU3Vya2hhbmRhcnlhIDogMSA6IDE0MzcwMDAKK1N5cmRhcnlhIDogMSA6IDYwMDAwMAorCisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VuaXRlZCBTdGF0ZXNfQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVW5pdGVkIFN0YXRlc19BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzZjMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VuaXRlZCBTdGF0ZXNfQVJFQS50eHQKQEAgLTAsMCArMSw1MyBAQAorVW5pdGVkIFN0YXRlcyA6IDAgOiA5NjMxNDIwIAorQWxhYmFtYQk6CTEJOgk1MjQxOS4wMgorQWxhc2thCToJMQk6CTY2MzI2Ny4yNgorQXJpem9uYQk6CTEJOgkxMTM5OTguMzAKK0Fya2Fuc2FzCToJMQk6CTUzMTc4LjYyCitDYWxpZm9ybmlhCToJMQk6CTE2MzY5NS41NworQ29sb3JhZG8JOgkxCToJMTA0MDkzLjU3CitDb25uZWN0aWN1dAk6CTEJOgk1NTQzLjMzCitEZWxhd2FyZQk6CTEJOgkyNDg5LjI3CitEaXN0cmljdCBvZiBDb2x1bWJpYQk6CTEJOgk2OC4zNAorRmxvcmlkYQk6CTEJOgk2NTc1NC41OQorR2VvcmdpYQk6CTEJOgk1OTQyNC43NworSGF3YWlpCToJMQk6CTEwOTMwLjk4CitJZGFobwk6CTEJOgk4MzU3MC4wOAorSWxsaW5vaXMJOgkxCToJNTc5MTQuMzgKK0luZGlhbmEJOgkxCToJMzY0MTcuNzMKK0lvd2EJOgkxCToJNTYyNzEuNTUKK0thbnNhcwk6CTEJOgk4MjI3Ni44NAorS2VudHVja3kJOgkxCToJNDA0MDkuMDIKK0xvdWlzaWFuYQk6CTEJOgk1MTgzOS43MAorTWFpbmUJOgkxCToJMzUzODQuNjUKK01hcnlsYW5kCToJMQk6CTEyNDA2LjY4CitNYXNzYWNodXNldHRzCToJMQk6CTEwNTU0LjU3CitNaWNoaWdhbgk6CTEJOgk5NjcxNi4xMQorTWlubmVzb3RhCToJMQk6CTg2OTM4Ljg3CitNaXNzaXNzaXBwaQk6CTEJOgk0ODQzMC4xOQorTWlzc291cmkJOgkxCToJNjk3MDQuMzEKK01vbnRhbmEJOgkxCToJMTQ3MDQyLjQwCitOZWJyYXNrYQk6CTEJOgk3NzM1My43MworTmV2YWRhCToJMQk6CTExMDU2MC43MQorTmV3IEhhbXBzaGlyZQk6CTEJOgk5MzQ5Ljk0CitOZXcgSmVyc2V5CToJMQk6CTg3MjEuMzAKK05ldyBNZXhpY28JOgkxCToJMTIxNTg5LjQ4CitOZXcgWW9yawk6CTEJOgk1NDU1Ni4wMAorTm9ydGggQ2Fyb2xpbmEJOgkxCToJNTM4MTguNTEKK05vcnRoIERha290YQk6CTEJOgk3MDY5OS43OQorT2hpbwk6CTEJOgk0NDgyNC45MAorT2tsYWhvbWEJOgkxCToJNjk4OTguMTkKK09yZWdvbgk6CTEJOgk5ODM4MC42NAorUGVubnN5bHZhbmlhCToJMQk6CTQ2MDU1LjI0CitSaG9kZSBJc2xhbmQJOgkxCToJMTU0NS4wNQorU291dGggQ2Fyb2xpbmEJOgkxCToJMzIwMjAuMjAKK1NvdXRoIERha290YQk6CTEJOgk3NzExNi40OQorVGVubmVzc2VlCToJMQk6CTQyMTQzLjI3CitUZXhhcwk6CTEJOgkyNjg1ODAuODIKK1V0YWgJOgkxCToJODQ4OTguODMKK1Zlcm1vbnQJOgkxCToJOTYxNC4yNgorVmlyZ2luaWEJOgkxCToJNDI3NzQuMjAKK1dhc2hpbmd0b24JOgkxCToJNzEyOTkuNjQKK1dlc3QgVmlyZ2luaWEJOgkxCToJMjQyMjkuNzYKK1dpc2NvbnNpbgk6CTEJOgk2NTQ5Ny44MgorV3lvbWluZwk6CTEJOgk5NzgxMy41NgorUHVlcnRvIFJpY28JOgkxCToJNTMyNC41MApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VuaXRlZCBTdGF0ZXNfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVW5pdGVkIFN0YXRlc19QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjUxOTYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1VuaXRlZCBTdGF0ZXNfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSw1MyBAQAorVW5pdGVkIFN0YXRlcwk6CTAJOgkyODE0MjE5MDYKKyAgICBDYWxpZm9ybmlhCToJMQk6CTMzODcxNjQ4CisgICAgVGV4YXMJOgkxCToJMjA4NTE4MjAKKyAgICBOZXcgWW9yawk6CTEJOgkxODk3NjQ1NworICAgIEZsb3JpZGEJOgkxCToJMTU5ODIzNzgKKyAgICBJbGxpbm9pcwk6CTEJOgkxMjQxOTI5MworICAgIFBlbm5zeWx2YW5pYQk6CTEJOgkxMjI4MTA1NAorICAgIE9oaW8JOgkxCToJMTEzNTMxNDAKKyAgICBNaWNoaWdhbgk6CTEJOgk5OTM4NDQ0CisgICAgTmV3IEplcnNleQk6CTEJOgk4NDE0MzUwCisgICAgR2VvcmdpYQk6CTEJOgk4MTg2NDUzCisgICAgTm9ydGggQ2Fyb2xpbmEJOgkxCToJODA0OTMxMworICAgIFZpcmdpbmlhCToJMQk6CTcwNzg1MTUKKyAgICBNYXNzYWNodXNldHRzCToJMQk6CTYzNDkwOTcKKyAgICBJbmRpYW5hCToJMQk6CTYwODA0ODUKKyAgICBXYXNoaW5ndG9uCToJMQk6CTU4OTQxMjEKKyAgICBUZW5uZXNzZWUJOgkxCToJNTY4OTI4MworICAgIE1pc3NvdXJpCToJMQk6CTU1OTUyMTEKKyAgICBXaXNjb25zaW4JOgkxCToJNTM2MzY3NQorICAgIE1hcnlsYW5kCToJMQk6CTUyOTY0ODYKKyAgICBBcml6b25hCToJMQk6CTUxMzA2MzIKKyAgICBNaW5uZXNvdGEJOgkxCToJNDkxOTQ3OQorICAgIExvdWlzaWFuYQk6CTEJOgk0NDY4OTc2CisgICAgQWxhYmFtYQk6CTEJOgk0NDQ3MTAwCisgICAgQ29sb3JhZG8JOgkxCToJNDMwMTI2MQorICAgIEtlbnR1Y2t5CToJMQk6CTQwNDE3NjkKKyAgICBTb3V0aCBDYXJvbGluYQk6CTEJOgk0MDEyMDEyCisgICAgT2tsYWhvbWEJOgkxCToJMzQ1MDY1NAorICAgIE9yZWdvbgk6CTEJOgkzNDIxMzk5CisgICAgQ29ubmVjdGljdXQJOgkxCToJMzQwNTU2NQorICAgIElvd2EJOgkxCToJMjkyNjMyNAorICAgIE1pc3Npc3NpcHBpCToJMQk6CTI4NDQ2NTgKKyAgICBLYW5zYXMJOgkxCToJMjY4ODQxOAorICAgIEFya2Fuc2FzCToJMQk6CTI2NzM0MDAKKyAgICBVdGFoCToJMQk6CTIyMzMxNjkKKyAgICBOZXZhZGEJOgkxCToJMTk5ODI1NworICAgIE5ldyBNZXhpY28JOgkxCToJMTgxOTA0NgorICAgIFdlc3QgVmlyZ2luaWEJOgkxCToJMTgwODM0NAorICAgIE5lYnJhc2thCToJMQk6CTE3MTEyNjMKKyAgICBJZGFobwk6CTEJOgkxMjkzOTUzCisgICAgTWFpbmUJOgkxCToJMTI3NDkyMworICAgIE5ldyBIYW1wc2hpcmUJOgkxCToJMTIzNTc4NgorICAgIEhhd2FpaQk6CTEJOgkxMjExNTM3CisgICAgUmhvZGUgSXNsYW5kCToJMQk6CTEwNDgzMTkKKyAgICBNb250YW5hCToJMQk6CTkwMjE5NQorICAgIERlbGF3YXJlCToJMQk6CTc4MzYwMAorICAgIFNvdXRoIERha290YQk6CTEJOgk3NTQ4NDQKKyAgICBOb3J0aCBEYWtvdGEJOgkxCToJNjQyMjAwCisgICAgQWxhc2thCToJMQk6CTYyNjkzMgorICAgIFZlcm1vbnQJOgkxCToJNjA4ODI3CisgICAgRGlzdHJpY3Qgb2YgQ29sdW1iaWEJOgkxCToJNTcyMDU5CisgICAgV3lvbWluZwk6CTEJOgk0OTM3ODIKKwlQdWVydG8gUmljbyA6IDEgOiAzOTEyMDU0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1ZFTkVaVUVMQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9WRU5FWlVFTEFfQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIxYWI1MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9WRU5FWlVFTEFfQVJFQS50eHQKQEAgLTAsMCArMSwyNyBAQAorVmVuZXp1ZWxhCToJMAk6CTkxMjA1MAorQW1hem9uYXMgICAJOgkxCToJMTgwMTQ1CitBbnpvYXRlZ3VpIAk6CTEJOgk0MzMwMAorQXB1cmUgCToJMQk6CTc2NTAwCitBcmFndWEgCToJMQk6CTcwMTQKK0JhcmluYXMgCToJMQk6CTM1MjAwCitCb2xpdmFyIAk6CTEJOgkyMzgwMDAKK0NhcmFib2JvIAk6CTEJOgk0NjUwCitDb2plZGVzIAk6CTEJOgkxNDgwMAorRGVsdGEgQW1hY3VybyAJOgkxCToJNDAyMDAKK0ZhbGNvbiAJOgkxCToJMjQ4MDAKK0d1YXJpY28gCToJMQk6CTY0OTg2CitMYXJhIAk6CTEJOgkxOTgwMAorTWVyaWRhIAk6CTEJOgkxMTMwMAorTWlyYW5kYSAJOgkxCToJNzk1MAorTW9uYWdhcyAJOgkxCToJMjg5MDAKK051ZXZhIEVzcGFydGEgCToJMQk6CTExNTAKK1BvcnR1Z3Vlc2EgCToJMQk6CTE1MjAwCitTdWNyZSAJOgkxCToJMTE4MDAKK1RhY2hpcmEgCToJMQk6CTExMTAwCitUcnVqaWxsbyAJOgkxCToJNzQwMAorVmFyZ2FzIAk6CTEJOgkxNDk3CitZYXJhY3V5IAk6CTEJOgk3MTAwCitadWxpYSAJOgkxCToJNjMxMDAKK0Rpc3RyaXRvIEZlZGVyYWwgCToJMQk6CTQzMworRGVwZW5kZW5jaWFzIEZlZGVyYWxlcyAoREYpIAk6CTEJOgkxMjAKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1ZFTkVaVUVMQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9WRU5FWlVFTEFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlNTRkMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9WRU5FWlVFTEFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSwyNiBAQAorVmVuZXp1ZWxhCToJMAk6CTI1NzMwNDM1CitBbWF6b25hcyAgIAk6CTEJOgk3MDQ2NAorQW56b2F0ZWd1aSAJOgkxCToJMTIyMjIyNQorQXB1cmUgCToJMQk6CTM3Nzc1NgorQXJhZ3VhIAk6CTEJOgkxNDQ5NjE2CitCYXJpbmFzIAk6CTEJOgk2MjQ1MDgKK0JvbGl2YXIgCToJMQk6CTEyMTQ4NDYKK0NhcmFib2JvIAk6CTEJOgkxOTMyMTY4CitDb2plZGVzIAk6CTEJOgkyNTMxMDUKK0RlbHRhIEFtYWN1cm8gCToJMQk6CTk3OTg3CitGYWxjb24gCToJMQk6CTc2MzE4OAorR3VhcmljbyAJOgkxCToJNjI3MDg2CitMYXJhIAk6CTEJOgkxNTU2NDE1CitNZXJpZGEgCToJMQk6CTcxNTI2OAorTWlyYW5kYSAJOgkxCToJMjMzMDg3MgorTW9uYWdhcyAJOgkxCToJNzEyNjI2CitOdWV2YSBFc3BhcnRhIAk6CTEJOgkzNzM4NTEKK1BvcnR1Z3Vlc2EgCToJMQk6CTcyNTc0MAorU3VjcmUgCToJMQk6CTc4NjQ4MworVGFjaGlyYSAJOgkxCToJOTkyNjY5CitUcnVqaWxsbyAJOgkxCToJNjA4NTYzCitWYXJnYXMgCToJMQk6CTI5ODEwOQorWWFyYWN1eSAJOgkxCToJNDk5MDQ5CitadWxpYSAJOgkxCToJMjk4MzY3OQorRGlzdHJpdG8gRmVkZXJhbCAJOgkxCToJMTgzNjI4NgorRGVwZW5kZW5jaWFzIEZlZGVyYWxlcyAoREYpIAk6CTEJOgkxNjUxCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVklFVE5BTV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9WSUVUTkFNX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNDI1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVklFVE5BTV9BUkVBLnR4dApAQCAtMCwwICsxLDc1IEBACitWaWV0bmFtCToJMAk6CTMyOTU2MAorTm9ydGhFYXN0CToJMQk6CTYzNjI5LjgwCitBbiBHaWFuZyBbQmFjIEdpYW5nIHRvd25dIAk6CTEJOgkzODIyLjcwCitCYWMgS2FuIHRvd24gCToJMQk6CTQ4NTcuMjAKK0NhbyBCYW5nIFtDYW8gQmFuZyB0b3duXSAJOgkxCToJNjY5MC43MAorSGEgR2lhbmcgW0hhIEdpYW5nIHRvd25dIAk6CTEJOgk3ODg0LjMwCitMYW5nIFNvbiBbTGFuZyBTb24gdG93bl0gCToJMQk6CTgzMDUuMjAKK0xhbyBDYWkgW0xhbyBDYWkgY2l0eV0gCToJMQk6CTYzNTcuMDAKK1ZpZXQgVHJpIGNpdHkgCToJMQk6CTM1MTkuNjAKK1F1YW5nIE5pbmggW0hhIExvbmcgY2l0eV0gCToJMQk6CTU4OTkuNjAKK1RoYWkgTmd1eWVuIGNpdHkgCToJMQk6CTM1NDIuNjAKK1R1eWVuIFF1YW5nIFtUdXllbiBRdWFuZyB0b3duXSAJOgkxCToJNTg2OC4wMAorWWVuIEJhaSBbWWVuIEJhaSBjaXR5XSAJOgkxCToJNjg4Mi45MAorTm9ydGhXZXN0CToJMQk6CTM3MzM2LjkwCitEaWVuIEJpZW4gUGh1IENpdHkgCToJMQk6CTk1NjAuMDAKK0hvYSBCaW5oIFtIb2EgQmluaCB0b3duXSAJOgkxCToJNDY2Mi41MAorUGhvbmcgVGhvIHRvd24gCToJMQk6CTkwNTkuNDAKK1NvbiBMYSBbU29uIExhIHRvd25dIAk6CTEJOgkxNDA1NS4wMAorUmVkIFJpdmVyIERlbHRhCToJMQk6CTE0ODEyLjUwCitCYWMgTmluaCB0b3duIFtCYWMgVGhhaV0JOgkxCToJODA3LjYKK05hbSBIYSBbUGh1IEx5IHRvd25dIAk6CTEJOgk4NTIuMgorSGEgTm9pIFtIYW5vaSBDaXR5XSAJOgkxCToJOTIxCitIYSBUYXkgW0hhIERvbmcgdG93bl0gCToJMQk6CTIxOTIuMTAKK0hhaSBEdW9uZyBjaXR5IFtEb25nIFRoYXBdCToJMQk6CTE2NDguNDAKK0hhaSBQaG9uZyBbSGFpIFBob25nIGNpdHldIAk6CTEJOgkxNTI2LjMwCitIdW5nIFllbiB0b3duIFtIYWkgSHVuZ10gCToJMQk6CTkyMy4xCitOYW0gRGluaCBjaXR5ICBbTGFpIENoYXVdCToJMQk6CTE2NDEuMzAKK05pbmggQmluaCBbTmluaCBCaW5oIHRvd25dIAk6CTEJOgkxMzgzLjcwCitUaGFpIEJpbmggW1RoYWkgQmluaCB0b3duXSAJOgkxCToJMTU0NS40MAorVmluaCBQaHUgW1ZpbmggWWVuIHRvd25dIAk6CTEJOgkxMzcxLjQwCitOb3J0aCBDZW50cmFsIENvYXN0CToJMQk6CTUxNTEwLjgwCitIYSBUaW5oIFtIYSBUaW5oIHRvd25dIAk6CTEJOgk2MDU1LjYwCitOZ2hlIEFuIFtWaW5oIGNpdHldIAk6CTEJOgkxNjQ4Ny40MAorUXVhbmcgQmluaCBbRG9uZyBIb2kgdG93bl0gCToJMQk6CTgwNTEuODAKK1F1YW5nIFRyaSBbRG9uZyBIYSB0b3duXSAJOgkxCToJNDc0NS43MAorVGhhbmggSG9hIFtUaGFuaCBIb2EgY2l0eV0gCToJMQk6CTExMTE2LjMwCitUaHVhIFRoaWVuLUh1ZSBbSHXpIENpdHldIAk6CTEJOgk1MDU0LjAwCitTb3V0aCBDZW50cmFsIENvYXN0CToJMQk6CTMzMDY5LjAwCitCaW5oIERpbmggW1F1eSBOaG9uIGNpdHldIAk6CTEJOgk2MDI1LjAwCitEYSBOYW5nIENpdHkgCToJMQk6CTEyNTUuNTAKK0toYW5oIEhvYSBbTmhhIFRyYW5nIENpdHldIAk6CTEJOgk1MTk4LjIwCitQaHUgWWVuIFtUdXkgSG9hIHRvd25dIAk6CTEJOgk1MDQ1LjMwCitRdWFuZyBOYW0tRGEgTmFuZyBbVGFtIEt5IHRvd25dIAk6CTEJOgkxMDQwNy40MAorUXVhbmcgTmdhaSBbUXVhbmcgTmdhaSB0b3duXSAJOgkxCToJNTEzNy42MAorQ2VudHJhbCBIaWdobGFuZHMJOgkxCToJNTQ0NzMuNzAKK0RhYyBMYWMgW0J1b24gTWEgVGh1b3QgY2l0eV0gCToJMQk6CTEzMDg1LjAwCitHaWEgTmdoaWEgdG93biBbSGEgQmFjXQk6CTEJOgk2NTE0LjUwCitHaWEgTGFpIFtQbGVpIEt1IGNpdHldIAk6CTEJOgkxNTQ5NC45MAorS29uIFR1bSBbS29uIFR1bSB0b3duXXMgCToJMQk6CTk2MTQuNTAKK0xhbSBEb25nIFtEYSBMYXQgY2l0eV0gCToJMQk6CTk3NjQuODAKK05vcnRoRWFzdCBTb3V0aAk6CTEJOgkzNDc0My4xMAorQmEgUmlhIC0gVnVuZyBUYXUgW1Z1bmcgVGF1IGNpdHldIAk6CTEJOgkxOTgyLjIwCitUaHUgRGF1IE1vdCB0b3duIFtTb25nIEJlXQk6CTEJOgkyNjk1LjUwCitEb25nIE5haSBbRG9uZyBYb2FpIHRvd25dIAk6CTEJOgk2ODU3LjMwCitCaW5oIFRodWFuIFtQaGFuIFRoaWV0IGNpdHldIAk6CTEJOgk3ODI4LjQwCitCaWVuIEhvYSBjaXR5IFtNaW5oIEhhaV0JOgkxCToJNTg5NC44MAorSG8gQ2hpIE1pbmggQ2l0eSAJOgkxCToJMjA5NS4yMAorTmluaCBUaHVhbiBbUGhhbiBSYW5nLVRoYXAgQ2hhbSB0b3duXSAJOgkxCToJMzM2MC4xMAorVGF5IE5pbmggdG93biAJOgkxCToJNDAyOS42MAorTWVrb25nIFJpdmVyIERlbHRhCToJMQk6CTM5NzM4LjcwCitMb25nIFh1eWVuIGNpdHkgCToJMQk6CTM0MDYuMjAKK0JhYyBMaWV1IHRvd24gCToJMQk6CTI1MjUuNzAgCitCZW4gVHJlIFtCZW4gVHJlIHRvd25dIAk6CTEJOgkyMzIxLjYwCitDYSBNYXUgdG93biAJOgkxCToJNTIwMS41MAorQ2FuIFRobyBbQ2FuIFRobyBjaXR5XSAJOgkxCToJMTM5MC4wMAorU2EgRGVjIHRvd24gCToJMQk6CTMyNDYuMTAKK1ZpIFRoYW5oIFRvd24gCToJMQk6CTE2MDguMDAKK0tpZW4gR2lhbmcgW1JhY2ggR2lhIHRvd25dIAk6CTEJOgk2MjY4LjIwCitMb25nIEFuIFtUYW4gQW4gdG93bl0gCToJMQk6CTQ0OTEuMjAKK1NvYyBUcmFuZyBbU29jIFRyYW5nIHRvd25dIAk6CTEJOgkzMjIzLjMwCitUaWVuIEdpYW5nIFtNeSBUaG8gY2l0eV0gCToJMQk6CTIzNjYuNjAKK1RyYSBWaW5oIFtUcmEgVmluaCB0b3duXSAJOgkxCToJMjIxNS4xMAorVmluaCBMb25nIFtWaW5oIExvbmcgdG93bl0gCToJMQk6CTE0NzUuMjAKKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVklFVE5BTV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9WSUVUTkFNX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzJmZDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvVklFVE5BTV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxLDc2IEBACitWaWV0bmFtCToJMAk6CTg0NDAyOTY2CitOb3J0aEVhc3QJOgkxCToJOTI0NDgwMAorQW4gR2lhbmcgW0JhYyBHaWFuZyB0b3duXSAJOgkxCToJMTU2MzUwMAorQmFjIEthbiB0b3duIAk6CTEJOgkyOTYyMDAKK0NhbyBCYW5nIFtDYW8gQmFuZyB0b3duXSAJOgkxCToJNTA4MjAwCitIYSBHaWFuZyBbSGEgR2lhbmcgdG93bl0gCToJMQk6CTY2MDcwMAorTGFuZyBTb24gW0xhbmcgU29uIHRvd25dIAk6CTEJOgk3MzE3MDAKK0xhbyBDYWkgW0xhbyBDYWkgY2l0eV0gCToJMQk6CTU2NTcwMAorVmlldCBUcmkgY2l0eSAJOgkxCToJMTMxNDUwMAorUXVhbmcgTmluaCBbSGEgTG9uZyBjaXR5XSAJOgkxCToJMTA2NzMwMAorVGhhaSBOZ3V5ZW4gY2l0eSAJOgkxCToJMTA5NTQwMAorVHV5ZW4gUXVhbmcgW1R1eWVuIFF1YW5nIHRvd25dIAk6CTEJOgk3MTgxMDAKK1llbiBCYWkgW1llbiBCYWkgY2l0eV0gCToJMQk6CTcyMzUwMAorTm9ydGhXZXN0CToJMQk6CTI1MjQ5MDAKK0RpZW4gQmllbiBQaHUgQ2l0eSAJOgkxCToJNDQwODAwCitIb2EgQmluaCBbSG9hIEJpbmggdG93bl0gCToJMQk6CTgwMzMwMAorUGhvbmcgVGhvIHRvd24gCToJMQk6CTMwODAwMAorU29uIExhIFtTb24gTGEgdG93bl0gCToJMQk6CTk3MjgwMAorUmVkIFJpdmVyIERlbHRhCToJMQk6CTE3ODM2MDAwCitCYWMgTmluaCB0b3duIFtCYWMgVGhhaV0JOgkxCToJOTg3NDAwCitOYW0gSGEgW1BodSBMeSB0b3duXSAJOgkxCToJODIwMTAwCitIYSBOb2kgW0hhbm9pIENpdHldIAk6CTEJOgkzMDgyODAwCitIYSBUYXkgW0hhIERvbmcgdG93bl0gCToJMQk6CTI1MDAwMDAKK0hhaSBEdW9uZyBjaXR5IFtEb25nIFRoYXBdIAk6CTEJOgkxNjk4MzAwCitIYWkgUGhvbmcgW0hhaSBQaG9uZyBjaXR5XSAJOgkxCToJMTc3MDgwMAorSHVuZyBZZW4gdG93biBbSGFpIEh1bmddCToJMQk6CTExMjAzMDAKK05hbSBEaW5oIGNpdHkgW0xhaSBDaGF1XQk6CTEJOgkxOTQ3MTAwCitOaW5oIEJpbmggW05pbmggQmluaCB0b3duXSAJOgkxCToJOTExNjAwCitUaGFpIEJpbmggW1RoYWkgQmluaCB0b3duXSAJOgkxCToJMTg0MjgwMAorVmluaCBQaHUgW1ZpbmggWWVuIHRvd25dIAk6CTEJOgkxMTU0ODAwCitOb3J0aCBDZW50cmFsIENvYXN0CToJMQk6CTEwNTA0NTAwCitIYSBUaW5oIFtIYSBUaW5oIHRvd25dIAk6CTEJOgkxMjg2NzAwCitOZ2hlIEFuIFtWaW5oIGNpdHldIAk6CTEJOgkzMDAzMjAwCitRdWFuZyBCaW5oIFtEb25nIEhvaSB0b3duXSAJOgkxCToJODMxNjAwCitRdWFuZyBUcmkgW0RvbmcgSGEgdG93bl0gCToJMQk6CTYxNjYwMAorVGhhbmggSG9hIFtUaGFuaCBIb2EgY2l0eV0gCToJMQk6CTM2NDY2MDAKK1RodWEgVGhpZW4tSHVlIFtIdekgQ2l0eV0gCToJMQk6CTExMTk4MDAKK1NvdXRoIENlbnRyYWwgQ29hc3QJOgkxCToJNjk4MTcwMAorQmluaCBEaW5oIFtRdXkgTmhvbiBjaXR5XSAJOgkxCToJMTU0NTMwMAorRGEgTmFuZyBDaXR5IAk6CTEJOgk3NjQ1MDAKK0toYW5oIEhvYSBbTmhhIFRyYW5nIENpdHldIAk6CTEJOgkxMTExMzAwCitQaHUgWWVuIFtUdXkgSG9hIHRvd25dIAk6CTEJOgk4NDg5MDAKK1F1YW5nIE5hbS1EYSBOYW5nIFtUYW0gS3kgdG93bl0gCToJMQk6CTE0NTIzMDAKK1F1YW5nIE5nYWkgW1F1YW5nIE5nYWkgdG93bl0gCToJMQk6CTEyNTk0MDAKK0NlbnRyYWwgSGlnaGxhbmRzCToJMQk6CTQ2NzQyMDAKK0RhYyBMYWMgW0J1b24gTWEgVGh1b3QgY2l0eV0gCToJMQk6CTE2ODc3MDAKK0dpYSBOZ2hpYSB0b3duIFtIYSBCYWNdCToJMQk6CTM4NTgwMAorR2lhIExhaSBbUGxlaSBLdSBjaXR5XSAJOgkxCToJMTA5NTkwMAorS29uIFR1bSBbS29uIFR1bSB0b3duXSAJOgkxCToJMzY2MTAwCitMYW0gRG9uZyBbRGEgTGF0IGNpdHldIAk6CTEJOgkxMTM4NzAwCitOb3J0aEVhc3QgU291dGgJOgkxCToJMTMxOTAxMDAKK0JhIFJpYSAtIFZ1bmcgVGF1IFtWdW5nIFRhdSBjaXR5XSAJOgkxCToJODk3NjAwCitUaHUgRGF1IE1vdCB0b3duICBbU29uZyBCZV0JOgkxCToJODgzMjAwCitEb25nIE5haSBbRG9uZyBYb2FpIHRvd25dIAk6CTEJOgk3ODM2MDAKK0JpbmggVGh1YW4gW1BoYW4gVGhpZXQgY2l0eV0gCToJMQk6CTExMzU5MDAKK0JpZW4gSG9hIGNpdHkgW01pbmggSGFpXQk6CTEJOgkyMTc0NjAwCitIbyBDaGkgTWluaCBDaXR5IAk6CTEJOgk1NzMwNzAwCitOaW5oIFRodWFuIFtQaGFuIFJhbmctVGhhcCBDaGFtIHRvd25dIAk6CTEJOgk1NTQ3MDAKK1RheSBOaW5oIHRvd24gCToJMQk6CTEwMjk4MDAKK01la29uZyBSaXZlciBEZWx0YQk6CTEJOgkxNzA3NjEwMAorTG9uZyBYdXllbiBjaXR5IAk6CTEJOgkyMTcwMTAwCitCYWMgTGlldSB0b3duIAk6CTEJOgk3ODYyMDAKK0JlbiBUcmUgW0JlbiBUcmUgdG93bl0gCToJMQk6CTEzNDU2MDAKK0NhIE1hdSB0b3duIAk6CTEJOgkxMjAwODAwCitDYW4gVGhvIFtDYW4gVGhvIGNpdHldIAk6CTEJOgkxMTIyNTAwCitTYSBEZWMgdG93biAJOgkxCToJMTYzOTQwMAorVmkgVGhhbmggVG93biAJOgkxCToJNzgxMDAwCitLaWVuIEdpYW5nIFtSYWNoIEdpYSB0b3duXSAJOgkxCToJMTYzMDMwMAorTG9uZyBBbiBbVGFuIEFuIHRvd25dIAk6CTEJOgkxNDAwNTAwCitTb2MgVHJhbmcgW1NvYyBUcmFuZyB0b3duXSAJOgkxCToJMTI1NzQwMAorVGllbiBHaWFuZyBbTXkgVGhvIGNpdHldIAk6CTEJOgkxNjgxNjAwCitUcmEgVmluaCBbVHJhIFZpbmggdG93bl0gCToJMQk6CTEwMTU4MDAKK1ZpbmggTG9uZyBbVmluaCBMb25nIHRvd25dIAk6CTEJOgkxMDQ0OTAwCisKKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvWUVNRU5fQVJFQS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvWUVNRU5fQVJFQS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTliMGJlMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9ZRU1FTl9BUkVBLnR4dApAQCAtMCwwICsxLDIxIEBACitZZW1lbgk6CTAJOgk1Mjc5NzAKK011aGFmYXphdCBBYnlhLW4gIAk6CTEJOgkyNDEzMQorRm9ybWVyIFNvdXRoIFllbWVuIFtNdWhhZmF6YXQgJ0FkYW5dIAk6CTEJOgk3MDk5CitNdWhhZmF6YXQgQWQ/IEQ/YS1saScgCToJMQk6CTAKK011aGFmYXphdCBhbCBCYXlkP2EtJyAJOgkxCToJMTA3MTEKK011aGFmYXphdCBhbCBIP3VkYXlkYWggCToJMQk6CTE2NjQ2CitNdWhhZmF6YXQgYWwgSmF3ZiAJOgkxCToJMTMxNzUKK011aGFmYXphdCBhbCBNYWhyYWggCToJMQk6CTk4MjQ5CitNdWhhZmF6YXQgYWwgTWFoP3dpLXQgCToJMQk6CTI1MDEKK011aGFmYXphdCAnQW1yYS1uIAk6CTEJOgkwCitDYXBpdGFsIFNlY3JldGFyaWF0IChTYW4nYScgQ2l0eSkgCToJMQk6CTI0NworTXVoYWZhemF0IERoYW1hLXIgCToJMQk6CTg3NDUKK011aGFmYXphdCBIP2FkP3JhbWF3dCAJOgkxCToJMTQ4MTc4CitNdWhhZmF6YXQgSD9hamphaCAJOgkxCToJMTA2NzcKK011aGFmYXphdCBJYmIgCToJMQk6CTc2MzIKK011aGFmYXphdCBMYWg/aWogCToJMQk6CTE0ODM2CitNdWhhZmF6YXQgTWEncmliIAk6CTEJOgkxMzQ2NgorTXVoYWZhemF0IFM/YS2RZGFoIAk6CTEJOgkyOTYxNworRm9ybWVyIE5vcnRoIFllbWVuIFtNdWhhZmF6YXQgUz9hbpFhLSddIAk6CTEJOgkyODk3NworTXVoYWZhemF0IFNoYWJ3YWggCToJMQk6CTc4OTk1CitNdWhhZmF6YXQgVGEtkWl6eiAJOgkxCToJMTQxOTQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9ZRU1FTl9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9ZRU1FTl9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTdjYzgwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1lFTUVOX1BPUFVMQVRJT04udHh0CkBAIC0wLDAgKzEsMjEgQEAKK1llbWVuCToJMAk6CTIxNDU2MTg4CitNdWhhZmF6YXQgQWJ5YS1uICAJOgkxCToJNDMyNTI5CitGb3JtZXIgU291dGggWWVtZW4gW011aGFmYXphdCAnQWRhbl0gCToJMQk6CTUxOTgyMgorTXVoYWZhemF0IEFkPyBEP2EtbGknIAk6CTEJOgk0MTUwNjYKK011aGFmYXphdCBhbCBCYXlkP2EtJyAJOgkxCToJNTc5OTU1CitNdWhhZmF6YXQgYWwgSD91ZGF5ZGFoIAk6CTEJOgkyMDA0MDQ5CitNdWhhZmF6YXQgYWwgSmF3ZiAJOgkxCToJNDQ3MDIwCitNdWhhZmF6YXQgYWwgTWFocmFoIAk6CTEJOgk3MjU1NQorTXVoYWZhemF0IGFsIE1haD93aS10IAk6CTEJOgk0NjQxNTgKK011aGFmYXphdCAnQW1yYS1uIAk6CTEJOgk5OTM3MjIKK0NhcGl0YWwgU2VjcmV0YXJpYXQgKFNhbidhJyBDaXR5KSAJOgkxCToJMTU5MDYyNAorTXVoYWZhemF0IERoYW1hLXIgCToJMQk6CTEyMzQ0MjQKK011aGFmYXphdCBIP2FkP3JhbWF3dCAJOgkxCToJODkwMjQ2CitNdWhhZmF6YXQgSD9hamphaCAJOgkxCToJMTQwNDU1NAorTXVoYWZhemF0IEliYiAJOgkxCToJMjA3NDEzOQorTXVoYWZhemF0IExhaD9paiAJOgkxCToJNjY0MDcwCitNdWhhZmF6YXQgTWEncmliIAk6CTEJOgkyMzM2OTUKK011aGFmYXphdCBTP2EtkWRhaCAJOgkxCToJNjE0NjgyCitGb3JtZXIgTm9ydGggWWVtZW4gW011aGFmYXphdCBTP2FukWEtJ10gCToJMQk6CTEzOTQ5NDcKK011aGFmYXphdCBTaGFid2FoIAk6CTEJOgk0NjkyNTYKK011aGFmYXphdCBUYS2RaXp6IAk6CTEJOgkyMzYzNDg2CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvWVVHT1NMQVZJQV9BUkVBLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9ZVUdPU0xBVklBX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNGYzNjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvWVVHT1NMQVZJQV9BUkVBLnR4dApAQCAtMCwwICsxLDUgQEAKKyBWb2p2b2RpbmEgOiAxIDogMjE1MDYuMAorIFNyYmlqYSA6IDEgOiA1NTk2OC4wCisgQ3JuYSBHb3JhIDogMSA6IDEzODEyLjAKKyBLb3Nvdm8gOiAxIDogMTA4ODcuMAorIE1ha2Vkb25pamEgOiAxIDogMjU3MTMuMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1lVR09TTEFWSUFfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvWVVHT1NMQVZJQV9QT1BVTEFUSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWYwOTZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1lVR09TTEFWSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSw1IEBACisgVm9qdm9kaW5hIDogMSA6IDIwMzE5OTIKKyBTcmJpamEgOiAxIDogMTU3NjEyNAorIENybmEgR29yYSA6IDEgOiA2Mzg0NjEKKyBLb3Nvdm8gOiAxIDogMjEwMDAwMAorIE1ha2Vkb25pamEgOiAxIDogOTgzMjU4MQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1pBSVJFX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1pBSVJFX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NzlhNTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvWkFJUkVfQVJFQS50eHQKQEAgLTAsMCArMSBAQAorWmFpcmUJOgkwCToJMjM0NTQxMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1pBSVJFX1BPUFVMQVRJT04udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1pBSVJFX1BPUFVMQVRJT04udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNWMyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvWkFJUkVfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSBAQAorWmFpcmUJOgkwCToJNDY0OTg1MzkgCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvWkFNQklBX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1pBTUJJQV9BUkVBLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDk2YzY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1pBTUJJQV9BUkVBLnR4dApAQCAtMCwwICsxLDgzIEBACitaYW1iaWEJOgkwCToJNzUyNjE0CitDZW50cmFsMyBbQ2VudHJhbF1bQ2VudHJhbCBQcm92aW5jZV0JOgkxCToJOTQzOTQKK01vbmd1IFtXZXN0ZXJuNF0gW1dlc3Rlcm5dIDogMSA6IDEyNjM4NgorTm9ydGhlcm40IFtOb3J0aGVybl0gW05vcnRoZXJuIFByb3ZpbmNlXQk6CTEJOgkxNDc4MjYKK0NoaWJvbWJvIAk6CTEJOgkwCitLYWJ3ZSAJOgkxCToJMAorS2FwaXJpIE1wb3NoaSAJOgkxCToJMAorTWt1c2hpIAk6CTEJOgkwCitNdW1id2EgCToJMQk6CTAKK1NlcmVuamUgCToJMQk6CTAKK05kb2xhCToJMQk6CTMxMzI4CitDaGlsaWxhYm9tYndlIAk6CTEJOgkwCitDaGluZ29sYSAJOgkxCToJMAorS2FsdWx1c2hpIAk6CTEJOgkwCitLaXR3ZSAJOgkxCToJMAorTHVhbnNoeWEgCToJMQk6CTAKK0x1ZndhbnlhbWEgCToJMQk6CTAKK01hc2FpdGkgCToJMQk6CTAKK01wb25nd2UgCToJMQk6CTAKK011ZnVsaXJhIAk6CTEJOgkwCitOZG9sYSBbQ29wcGVyYmVsdF0JOgkxCToJMzEzMjgKK0Vhc3Rlcm40IFtFYXN0ZXJuXSBbRWFzdGVybiBQcm92aW5jZV0JOgkxCToJNjkxMDYKK0NoYWRpemEgCToJMQk6CTAKK0NoYW1hIAk6CTEJOgkwCitDaGlwYXRhIAk6CTEJOgkwCitLYXRldGUgCToJMQk6CTAKK0x1bmRhemkgCToJMQk6CTAKK01hbWJ3ZSAJOgkxCToJMAorTnlpbWJhIAk6CTEJOgkwCitQZXRhdWtlIAk6CTEJOgkwCitNYW5zYSBbTHVhcHVsYV0JOgkxCToJNTA1NjcKK0NoaWVuZ2kgCToJMQk6CTAKK0thd2FtYndhIAk6CTEJOgkwCitNYW5zYSAJOgkxCToJMAorTWlsZW5nZSAJOgkxCToJMAorTXdlbnNlIAk6CTEJOgkwCitOY2hlbGVuZ2UgCToJMQk6CTAKK1NhbWZ5YSAJOgkxCToJMAorTHVzYWthIAk6CTEJOgkyMTg5NgorQ2hvbmd3ZSAJOgkxCToJMAorS2FmdWUgCToJMQk6CTAKK0x1YW5nd2EgCToJMQk6CTAKK0x1c2FrYSAJOgkxCToJMAorQ2hpbHViaSAJOgkxCToJMAorQ2hpbnNhbGkgCToJMQk6CTAKK0lzb2thIAk6CTEJOgkwCitLYXB1dGEgCToJMQk6CTAKK0thc2FtYSAJOgkxCToJMAorTHV3aW5ndSAJOgkxCToJMAorTWJhbGEgCToJMQk6CTAKK01waWthIAk6CTEJOgkwCitNcG9yb2tvc28gCToJMQk6CTAKK01wdWx1bmd1IAk6CTEJOgkwCitNdW5nd2kgCToJMQk6CTAKK05ha29uZGUgCToJMQk6CTAKK05vcnRoIFdlc3Rlcm4JOgkxCToJMTI1ODI2CitDaGF2dW1hIAk6CTEJOgkwCitNdWZ1bWJ3ZSAoQ2hpemVyYSkgCToJMQk6CTAKK0thYm9tcG8gCToJMQk6CTAKK0thc2VtcGEgCToJMQk6CTAKK013aW5pbHVuZ2EgCToJMQk6CTAKK1NvbHdlemkgCToJMQk6CTAKK1phbWJlemkgCToJMQk6CTAKK1NvdXRoZXJuMyBbU291dGhlcm5dIFtTb3V0aGVybiBQcm92aW5jZV0JOgkxCToJODUyODMKK0Nob21hIAk6CTEJOgkwCitHd2VtYmUgCToJMQk6CTAKK0l0ZXpoaS10ZXpoaSAJOgkxCToJMAorS2Fsb21vIAk6CTEJOgkwCitLYXp1bmd1bGEgCToJMQk6CTAKK0xpdmluZ3N0b25lIAk6CTEJOgkwCitNYXphYnVrYSAJOgkJOgkwCitNb256ZSAJOgkxCToJMAorTmFtd2FsYSAJOgkxCToJMAorU2lhdm9uZ2EgCToJMQk6CTAKK1NpbmF6b25nd2UgCToJMQk6CTAKK01vbmd1CToJMQk6CTEyNjM4NgorS2FsYWJvIAk6CTEJOgkwCitLYW9tYSAJOgkxCToJMAorTHVrdWx1IAk6CTEJOgkwCitNb25ndSAJOgkxCToJMAorU2VuYW5nYSAJOgkxCToJMAorU2VzaGVrZSAJOgkxCToJMAorU2hhbmcnb21ibyAJOgkxCToJMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1pBTUJJQV9QT1BVTEFUSU9OLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9aQU1CSUFfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiY2IxYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9aQU1CSUFfUE9QVUxBVElPTi50eHQKQEAgLTAsMCArMSw4MyBAQAorWmFtYmlhCToJMAk6CTExNTAyMDEwCitDZW50cmFsMyBbQ2VudHJhbCBQcm92aW5jZV0JOgkxCToJMTAxMjI1NworTW9uZ3UgW1dlc3Rlcm40XSBbV2VzdGVybl0gOiAxIDogNzY1MDg4IAorQ2hpYm9tYm8gCToJMQk6CTI0MTYxMgorS2Fid2UgCToJMQk6CTE3Njc1OAorS2FwaXJpIE1wb3NoaSAJOgkxCToJMTk0NzUyCitNa3VzaGkgCToJMQk6CTEwNzQzOAorTXVtYndhIAk6CTEJOgkxNTg4NjEKK1NlcmVuamUgCToJMQk6CTEzMjgzNgorTmRvbGEJOgkxCToJMTU4MTIyMQorQ2hpbGlsYWJvbWJ3ZSAJOgkxCToJNjc1MzMKK0NoaW5nb2xhIAk6CTEJOgkxNzIwMjYKK0thbHVsdXNoaSAJOgkxCToJNzU4MDYKK0tpdHdlIAk6CTEJOgkzNzYxMjQKK0x1YW5zaHlhIAk6CTEJOgkxNDc5MDgKK0x1ZndhbnlhbWEgCToJMQk6CTYzMTg1CitNYXNhaXRpIAk6CTEJOgk5NTU4MQorTXBvbmd3ZSAJOgkxCToJNjQzNzEKK011ZnVsaXJhIAk6CTEJOgkxNDM5MzAKK05kb2xhIFtDb3BwZXJiZWx0XQk6CTEJOgkzNzQ3NTcKK0Vhc3Rlcm40IFtFYXN0ZXJuIFByb3ZpbmNlXQk6CTEJOgkxMzA2MTczCitDaGFkaXphIAk6CTEJOgk4Mzk4MQorQ2hhbWEgCToJMQk6CTc0ODkwCitDaGlwYXRhIAk6CTEJOgkzNjc1MzkKK0thdGV0ZSAJOgkxCToJMTg5MjUwCitMdW5kYXppIAk6CTEJOgkyMzY4MzMKK01hbWJ3ZSAJOgkxCToJNzA0MjUKK055aW1iYSAJOgkxCToJNDczNzYKK1BldGF1a2UgCToJMQk6CTIzNTg3OQorTWFuc2EgW0x1YXB1bGFdCToJMQk6CTc3NTM1MworQ2hpZW5naSAJOgkxCToJODM4MjQKK0thd2FtYndhIAk6CTEJOgkxMDI1MDMKK01hbnNhIAk6CTEJOgkxNzk3NDkKK01pbGVuZ2UgCToJMQk6CTI4NzkwCitNd2Vuc2UgCToJMQk6CTEwNTc1OQorTmNoZWxlbmdlIAk6CTEJOgkxMTExMTkKK1NhbWZ5YSAJOgkxCToJMTYzNjA5CitMdXNha2EgCToJMQk6CTEzOTEzMjkKK0Nob25nd2UgCToJMQk6CTEzNzQ2MQorS2FmdWUgCToJMQk6CTE1MDIxNworTHVhbmd3YSAJOgkxCToJMTg5NDgKK0x1c2FrYSAJOgkxCToJMTA4NDcwMworTm9ydGhlcm40IFtOb3J0aGVybiBQcm92aW5jZV0JOgkxCToJMTI1ODY5NgorQ2hpbHViaSAJOgkxCToJNjYzMzgKK0NoaW5zYWxpIAk6CTEJOgkxMjg2NDYKK0lzb2thIAk6CTEJOgk5OTMxOQorS2FwdXRhIAk6CTEJOgk4NzIzMworS2FzYW1hIAk6CTEJOgkxNzA5MjkKK0x1d2luZ3UgCToJMQk6CTgwNzU4CitNYmFsYSAJOgkxCToJMTQ5NjM0CitNcGlrYSAJOgkxCToJMTQ2MTk2CitNcG9yb2tvc28gCToJMQk6CTczOTI5CitNcHVsdW5ndSAJOgkxCToJNjc2MDIKK011bmd3aSAJOgkxCToJMTEyOTc3CitOYWtvbmRlIAk6CTEJOgk3NTEzNQorTm9ydGggV2VzdGVybgk6CTEJOgk1ODMzNTAKK0NoYXZ1bWEgCToJMQk6CTI5OTQxCitNdWZ1bWJ3ZSAoQ2hpemVyYSkgCToJMQk6CTcxMjM4CitLYWJvbXBvIAk6CTEJOgk1MTkwNAorS2FzZW1wYSAJOgkxCToJNDQwMDIKK013aW5pbHVuZ2EgCToJMQk6CTExNzUwNQorU29sd2V6aSAJOgkxCToJMjAzNzk3CitaYW1iZXppIAk6CTEJOgk2NDk2MworU291dGhlcm4zIFtTb3V0aGVybiBQcm92aW5jZV0JOgkxCToJMTIxMjEyNAorQ2hvbWEgCToJMQk6CTIwNDg5OAorR3dlbWJlIAk6CTEJOgkzNDEzMworSXRlemhpLXRlemhpIAk6CTEJOgk0MzExMQorS2Fsb21vIAk6CTEJOgkxNjk1MDMKK0thenVuZ3VsYSAJOgkxCToJNjgyNjUKK0xpdmluZ3N0b25lIAk6CTEJOgkxMDMyODgKK01hemFidWthIAk6CTEJOgkyMDMyMTkKK01vbnplIAk6CTEJOgkxNjM1NzgKK05hbXdhbGEgCToJMQk6CTgyODEwCitTaWF2b25nYSAJOgkxCToJNTg4NjQKK1NpbmF6b25nd2UgCToJMQk6CTgwNDU1CitNb25ndQk6CTEJOgk3NjUwODgKK0thbGFibyAJOgkxCToJMTE0ODA2CitLYW9tYSAJOgkxCToJMTYyNTY4CitMdWt1bHUgCToJMQk6CTY4Mzc1CitNb25ndSAJOgkxCToJMTYyMDAyCitTZW5hbmdhIAk6CTEJOgkxMDkxMTkKK1Nlc2hla2UgCToJMQk6CTc4MTY5CitTaGFuZydvbWJvIAk6CTEJOgk3MDA0OQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1pJTUJBQldFX0FSRUEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvQXJlYVBvcHVsYXRpb25EYXRhL1pJTUJBQldFX0FSRUEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwN2VkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvWklNQkFCV0VfQVJFQS50eHQKQEAgLTAsMCArMSBAQAorWmltYmFid2UJOgkwCToJMzkwNzU3CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvWklNQkFCV0VfUE9QVUxBVElPTi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9BcmVhUG9wdWxhdGlvbkRhdGEvWklNQkFCV0VfUE9QVUxBVElPTi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlM2I3ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0FyZWFQb3B1bGF0aW9uRGF0YS9aSU1CQUJXRV9QT1BVTEFUSU9OLnR4dApAQCAtMCwwICsxIEBACitaaW1iYWJ3ZQk6CTAJOgkxMTYzNDY2MwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvSVNPMzE2Ni0xL0ZJUFNfQURNSU4xLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0lTTzMxNjYtMS9GSVBTX0FETUlOMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2YzM3NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0lTTzMxNjYtMS9GSVBTX0FETUlOMS50eHQKQEAgLTAsMCArMSw2MCBAQAorQUxBQkFNQTowMTpBTAorTUlTU09VUkk6Mjk6TU8KK0FMQVNLQTowMjpBSworTU9OVEFOQTozMDpNVAorQVJJWk9OQTowNDpBWgorTkVCUkFTS0E6MzE6TkUKK0FSS0FOU0FTOjA1OkFSCitORVZBREE6MzI6TlYKK0NBTElGT1JOSUE6MDY6Q0EKK05FVyBIQU1QU0hJUkU6MzM6TkgKK0NPTE9SQURPOjA4OkNPCitORVcgSkVSU0VZOjM0Ok5KCitDT05ORUNUSUNVVDowOTpDVAorTkVXIE1FWElDTzozNTpOTQorREVMQVdBUkU6MTA6REUKK05FVyBZT1JLOjM2Ok5ZCitESVNUUklDVCBPRiBDT0xVTUJJQToxMTpEQworTk9SVEggQ0FST0xJTkE6Mzc6TkMKK0ZMT1JJREE6MTI6RkwKK05PUlRIIERBS09UQTozODpORAorR0VPUkdJQToxMzpHQQorT0hJTzozOTpPSAorT0tMQUhPTUE6NDA6T0sKK09SRUdPTjo0MTpPUgorSEFXQUlJOjE1OkhJCitQRU5OU1lMVkFOSUE6NDI6UEEKK0lEQUhPOjE2OklECitSSE9ERSBJU0xBTkQ6NDQ6UkkKK0lMTElOT0lTOjE3OklMCitTT1VUSCBDQVJPTElOQTo0NTpTQworSU5ESUFOQToxODpJTgorU09VVEggREFLT1RBOjQ2OlNECitJT1dBOjE5OklBCitURU5ORVNTRUU6NDc6VE4KK0tBTlNBUzoyMDpLUworVEVYQVM6NDg6VFgKK0tFTlRVQ0tZOjIxOktZCitVVEFIOjQ5OlVUCitMT1VJU0lBTkE6MjI6TEEKK1ZFUk1PTlQ6NTA6VlQKK01BSU5FOjIzOk1FCitWSVJHSU5JQTo1MTpWQQorTUFSWUxBTkQ6MjQ6TUQKK1dBU0hJTkdUT046NTM6V0EKK01BU1NBQ0hVU0VUVFM6MjU6TUEKK1dFU1QgVklSR0lOSUE6NTQ6V1YKK01JQ0hJR0FOOjI2Ok1JCitXSVNDT05TSU46NTU6V0kKK01JTk5FU09UQToyNzpNTgorV1lPTUlORzo1NjpXWQorTUlTU0lTU0lQUEk6Mjg6TVMKK0FNRVJJQ0FOIFNBTU9BOjYwOkFTCitGRURFUkFURUQgU1RBVEVTIE9GIE1JQ1JPTkVTSUE6NjQ6Rk0KK0dVQU06NjY6R1UKK01BUlNIQUxMIElTTEFORFM6Njg6TUgKK05PUlRIRVJOIE1BUklBTkEgSVNMQU5EUzo2OTpNUAorUEFMQVU6NzA6UFIKK1BVRVJUTyBSSUNPOjcyOlBSCitVLlMuIE1JTk9SIE9VVExZSU5HIElTTEFORFM6NzQ6VU0KK1ZJUkdJTiBJU0xBTkRTIE9GIFRIRSBVLlMuOjc4OlZJCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9JU08zMTY2LTEvRklQU19BRE1JTjFfVU5GT1JNQVRURUQudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvSVNPMzE2Ni0xL0ZJUFNfQURNSU4xX1VORk9STUFUVEVELnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDUxMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvSVNPMzE2Ni0xL0ZJUFNfQURNSU4xX1VORk9STUFUVEVELnR4dApAQCAtMCwwICsxLDUzMCBAQAorQWxhYmFtYQorCQorCiswMQorCQorCitBTAorCQorCitNaXNzb3VyaQorCQorCisyOQorCQorCitNTworCitBbGFza2EKKwkKKworMDIKKwkKKworQUsKKwkKKworTW9udGFuYQorCQorCiszMAorCQorCitNVAorCitBcml6b25hCisJCisKKzA0CisJCisKK0FaCisJCisKK05lYnJhc2thCisJCisKKzMxCisJCisKK05FCisKK0Fya2Fuc2FzCisJCisKKzA1CisJCisKK0FSCisJCisKK05ldmFkYQorCQorCiszMgorCQorCitOVgorCitDYWxpZm9ybmlhCisJCisKKzA2CisJCisKK0NBCisJCisKK05ldyBIYW1wc2hpcmUKKwkKKworMzMKKwkKKworTkgKKworQ29sb3JhZG8KKwkKKworMDgKKwkKKworQ08KKwkKKworTmV3IEplcnNleQorCQorCiszNAorCQorCitOSgorCitDb25uZWN0aWN1dAorCQorCiswOQorCQorCitDVAorCQorCitOZXcgTWV4aWNvCisJCisKKzM1CisJCisKK05NCisKK0RlbGF3YXJlCisJCisKKzEwCisJCisKK0RFCisJCisKK05ldyBZb3JrCisJCisKKzM2CisJCisKK05ZCisKK0Rpc3RyaWN0IG9mIENvbHVtYmlhCisJCisKKzExCisJCisKK0RDCisJCisKK05vcnRoIENhcm9saW5hCisJCisKKzM3CisJCisKK05DCisKK0Zsb3JpZGEKKwkKKworMTIKKwkKKworRkwKKwkKKworTm9ydGggRGFrb3RhCisJCisKKzM4CisJCisKK05ECisKK0dlb3JnaWEKKwkKKworMTMKKwkKKworR0EKKwkKKworT2hpbworCQorCiszOQorCQorCitPSAorCisgCisJCisKKyAKKwkKKworIAorCQorCitPa2xhaG9tYQorCQorCis0MAorCQorCitPSworCisgCisJCisKKyAKKwkKKworIAorCQorCitPcmVnb24KKwkKKworNDEKKwkKKworT1IKKworSGF3YWlpCisJCisKKzE1CisJCisKK0hJCisJCisKK1Blbm5zeWx2YW5pYQorCQorCis0MgorCQorCitQQQorCitJZGFobworCQorCisxNgorCQorCitJRAorCQorCitSaG9kZSBJc2xhbmQKKwkKKworNDQKKwkKKworUkkKKworSWxsaW5vaXMKKwkKKworMTcKKwkKKworSUwKKwkKKworU291dGggQ2Fyb2xpbmEKKwkKKworNDUKKwkKKworU0MKKworSW5kaWFuYQorCQorCisxOAorCQorCitJTgorCQorCitTb3V0aCBEYWtvdGEKKwkKKworNDYKKwkKKworU0QKKworSW93YQorCQorCisxOQorCQorCitJQQorCQorCitUZW5uZXNzZWUKKwkKKworNDcKKwkKKworVE4KKworS2Fuc2FzCisJCisKKzIwCisJCisKK0tTCisJCisKK1RleGFzCisJCisKKzQ4CisJCisKK1RYCisKK0tlbnR1Y2t5CisJCisKKzIxCisJCisKK0tZCisJCisKK1V0YWgKKwkKKworNDkKKwkKKworVVQKKworTG91aXNpYW5hCisJCisKKzIyCisJCisKK0xBCisJCisKK1Zlcm1vbnQKKwkKKworNTAKKwkKKworVlQKKworTWFpbmUKKwkKKworMjMKKwkKKworTUUKKwkKKworVmlyZ2luaWEKKwkKKworNTEKKwkKKworVkEKKworTWFyeWxhbmQKKwkKKworMjQKKwkKKworTUQKKwkKKworV2FzaGluZ3RvbgorCQorCis1MworCQorCitXQQorCitNYXNzYWNodXNldHRzCisJCisKKzI1CisJCisKK01BCisJCisKK1dlc3QgVmlyZ2luaWEKKwkKKworNTQKKwkKKworV1YKKworTWljaGlnYW4KKwkKKworMjYKKwkKKworTUkKKwkKKworV2lzY29uc2luCisJCisKKzU1CisJCisKK1dJCisKK01pbm5lc290YQorCQorCisyNworCQorCitNTgorCQorCitXeW9taW5nCisJCisKKzU2CisJCisKK1dZCisKK01pc3Npc3NpcHBpCisJCisKKzI4CisJCisKK01TCisKK0FtZXJpY2FuIFNhbW9hCisJCisKKzYwCisJCisKK0FTCisJCisKK0ZlZGVyYXRlZCBTdGF0ZXMgb2YgTWljcm9uZXNpYQorCQorCis2NAorCQorCitGTQorCQorCitHdWFtCisJCisKKzY2CisJCisKK0dVCisJCisKK01hcnNoYWxsIElzbGFuZHMKKwkKKworNjgKKwkKKworTUgKKwkKKworTm9ydGhlcm4gTWFyaWFuYSBJc2xhbmRzCisJCisKKzY5CisJCisKK01QCisJCisKK1BhbGF1CisJCisKKzcwCisJCisJCisKK1BSCisJCisKK1B1ZXJ0byBSaWNvCisJCisKKzcyCisJCisKK1BSCisJCisKK1UuUy4gTWlub3IgT3V0bHlpbmcgSXNsYW5kcworCQorCis3NAorCQorCitVTQorCQorCitWaXJnaW4gSXNsYW5kcyBvZiB0aGUgVS5TLgorCQorCis3OAorCQorCitWSQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0lTTzMxNjYtMS9JU08zMTY2XzFfQUxQSEEyLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0lTTzMxNjYtMS9JU08zMTY2XzFfQUxQSEEyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDQzNWI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvSVNPMzE2Ni0xL0lTTzMxNjZfMV9BTFBIQTIudHh0CkBAIC0wLDAgKzEsMjQzIEBACitBRkdIQU5JU1RBTjpBRgorxUxBTkQgSVNMQU5EUzpBWAorQUxCQU5JQTpBTAorQUxHRVJJQTpEWgorQU1FUklDQU4gU0FNT0E6QVMKK0FORE9SUkE6QUQKK0FOR09MQTpBTworQU5HVUlMTEE6QUkKK0FOVEFSQ1RJQ0E6QVEKK0FOVElHVUEgQU5EIEJBUkJVREE6QUcKK0FSR0VOVElOQTpBUgorQVJNRU5JQTpBTQorQVJVQkE6QVcKK0FVU1RSQUxJQTpBVQorQVVTVFJJQTpBVAorQVpFUkJBSUpBTjpBWgorQkFIQU1BUzpCUworQkFIUkFJTjpCSAorQkFOR0xBREVTSDpCRAorQkFSQkFET1M6QkIKK0JFTEFSVVM6QlkKK0JFTEdJVU06QkUKK0JFTElaRTpCWgorQkVOSU46QkoKK0JFUk1VREE6Qk0KK0JIVVRBTjpCVAorQk9MSVZJQTpCTworQk9TTklBIEFORCBIRVJaRUdPVklOQTpCQQorQk9UU1dBTkE6QlcKK0JPVVZFVCBJU0xBTkQ6QlYKK0JSQVpJTDpCUgorQlJJVElTSCBJTkRJQU4gT0NFQU4gVEVSUklUT1JZOklPCitCUlVORUkgREFSVVNTQUxBTTpCTgorQlVMR0FSSUE6QkcKK0JVUktJTkEgRkFTTzpCRgorQlVSVU5ESTpCSQorQ0FNQk9ESUE6S0gKK0NBTUVST09OOkNNCitDQU5BREE6Q0EKK0NBUEUgVkVSREU6Q1YKK0NBWU1BTiBJU0xBTkRTOktZCitDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6Q0YKK0NIQUQ6VEQKK0NISUxFOkNMCitDSElOQTpDTgorQ0hSSVNUTUFTIElTTEFORDpDWAorQ09DT1MgKEtFRUxJTkcpIElTTEFORFM6Q0MKK0NPTE9NQklBOkNPCitDT01PUk9TOktNCitDT05HTzpDRworQ09OR08sIFRIRSBERU1PQ1JBVElDIFJFUFVCTElDIE9GIFRIRTpDRAorQ09PSyBJU0xBTkRTOkNLCitDT1NUQSBSSUNBOkNSCitDT1RFIEQnSVZPSVJFOkNJCitDUk9BVElBOkhSCitDVUJBOkNVCitDWVBSVVM6Q1kKK0NaRUNIIFJFUFVCTElDOkNaCitERU5NQVJLOkRLCitESklCT1VUSTpESgorRE9NSU5JQ0E6RE0KK0RPTUlOSUNBTiBSRVBVQkxJQzpETworRUNVQURPUjpFQworRUdZUFQ6RUcKK0VMIFNBTFZBRE9SOlNWCitFUVVBVE9SSUFMIEdVSU5FQTpHUQorRVJJVFJFQTpFUgorRVNUT05JQTpFRQorRVRISU9QSUE6RVQKK0ZBTEtMQU5EIElTTEFORFMgKE1BTFZJTkFTKTpGSworRkFST0UgSVNMQU5EUzpGTworRklKSTpGSgorRklOTEFORDpGSQorRlJBTkNFOkZSCitGUkVOQ0ggR1VJQU5BOkdGCitGUkVOQ0ggUE9MWU5FU0lBOlBGCitGUkVOQ0ggU09VVEhFUk4gVEVSUklUT1JJRVM6VEYKK0dBQk9OOkdBCitHQU1CSUE6R00KK0dFT1JHSUE6R0UKK0dFUk1BTlk6REUKK0dIQU5BOkdICitHSUJSQUxUQVI6R0kKK0dSRUVDRTpHUgorR1JFRU5MQU5EOkdMCitHUkVOQURBOkdECitHVUFERUxPVVBFOkdQCitHVUFNOkdVCitHVUFURU1BTEE6R1QKK0dVRVJOU0VZOiBHRworR1VJTkVBOkdOCitHVUlORUEtQklTU0FVOkdXCitHVVlBTkE6R1kKK0hBSVRJOkhUCitIRUFSRCBJU0xBTkQgQU5EIE1DRE9OQUxEIElTTEFORFM6SE0KK0hPTFkgU0VFIChWQVRJQ0FOIENJVFkgU1RBVEUpOlZBCitIT05EVVJBUzpITgorSE9ORyBLT05HOkhLCitIVU5HQVJZOkhVCitJQ0VMQU5EOklTCitJTkRJQTpJTgorSU5ET05FU0lBOklECitJUkFOLCBJU0xBTUlDIFJFUFVCTElDIE9GOklSCitJUkFROklRCitJUkVMQU5EOklFCitJU0xFIE9GIE1BTjpJTQorSVNSQUVMOklMCitJVEFMWTpJVAorSkFNQUlDQTpKTQorSkFQQU46SlAKK0pFUlNFWTpKRQorSk9SREFOOkpPCitLQVpBS0hTVEFOOktaCitLRU5ZQTpLRQorS0lSSUJBVEk6S0kKK0tPUkVBLCBERU1PQ1JBVElDIFBFT1BMRSdTIFJFUFVCTElDIE9GOktQCitLT1JFQSwgUkVQVUJMSUMgT0Y6S1IKK0tVV0FJVDpLVworS1lSR1laU1RBTjpLRworTEFPIFBFT1BMRSdTIERFTU9DUkFUSUMgUkVQVUJMSUM6TEEKK0xBVFZJQTpMVgorTEVCQU5PTjpMQgorTEVTT1RITzpMUworTElCRVJJQTpMUgorTElCWUFOIEFSQUIgSkFNQUhJUklZQTpMWQorTElFQ0hURU5TVEVJTjpMSQorTElUSFVBTklBOkxUCitMVVhFTUJPVVJHOkxVCitNQUNBTzpNTworTUFDRURPTklBLCBUSEUgRk9STUVSIFlVR09TTEFWIFJFUFVCTElDIE9GOk1LCitNQURBR0FTQ0FSOk1HCitNQUxBV0k6TVcKK01BTEFZU0lBOk1ZCitNQUxESVZFUzpNVgorTUFMSTpNTAorTUFMVEE6TVQKK01BUlNIQUxMIElTTEFORFM6TUgKK01BUlRJTklRVUU6TVEKK01BVVJJVEFOSUE6TVIKK01BVVJJVElVUzpNVQorTUFZT1RURTpZVAorTUVYSUNPOk1YCitNSUNST05FU0lBLCBGRURFUkFURUQgU1RBVEVTIE9GOkZNCitNT0xET1ZBLCBSRVBVQkxJQyBPRjpNRAorTU9OQUNPOk1DCitNT05HT0xJQTpNTgorTU9OVFNFUlJBVDpNUworTU9ST0NDTzpNQQorTU9aQU1CSVFVRTpNWgorTVlBTk1BUjpNTQorTkFNSUJJQTpOQQorTkFVUlU6TlIKK05FUEFMOk5QCitORVRIRVJMQU5EUzpOTAorTkVUSEVSTEFORFMgQU5USUxMRVM6QU4KK05FVyBDQUxFRE9OSUE6TkMKK05FVyBaRUFMQU5EOk5aCitOSUNBUkFHVUE6TkkKK05JR0VSOk5FCitOSUdFUklBOk5HCitOSVVFOk5VCitOT1JGT0xLIElTTEFORDpORgorTk9SVEhFUk4gTUFSSUFOQSBJU0xBTkRTOk1QCitOT1JXQVk6Tk8KK09NQU46T00KK1BBS0lTVEFOOlBLCitQQUxBVTpQVworUEFMRVNUSU5JQU4gVEVSUklUT1JZLCBPQ0NVUElFRDpQUworUEFOQU1BOlBBCitQQVBVQSBORVcgR1VJTkVBOlBHCitQQVJBR1VBWTpQWQorUEVSVTpQRQorUEhJTElQUElORVM6UEgKK1BJVENBSVJOOlBOCitQT0xBTkQ6UEwKK1BPUlRVR0FMOlBUCitQVUVSVE8gUklDTzpQUgorUUFUQVI6UUEKK1JFVU5JT046UkUKK1JPTUFOSUE6Uk8KK1JVU1NJQU4gRkVERVJBVElPTjpSVQorUldBTkRBOlJXCitTQUlOVCBIRUxFTkE6U0gKK1NBSU5UIEtJVFRTIEFORCBORVZJUzpLTgorU0FJTlQgTFVDSUE6TEMKK1NBSU5UIFBJRVJSRSBBTkQgTUlRVUVMT046UE0KK1NBSU5UIFZJTkNFTlQgQU5EIFRIRSBHUkVOQURJTkVTOlZDCitTQU1PQTpXUworU0FOIE1BUklOTzpTTQorU0FPIFRPTUUgQU5EIFBSSU5DSVBFOlNUCitTQVVESSBBUkFCSUE6U0EKK1NFTkVHQUw6U04KK1NFUkJJQSBBTkQgTU9OVEVORUdSTzpDUworU0VZQ0hFTExFUzpTQworU0lFUlJBIExFT05FOlNMCitTSU5HQVBPUkU6U0cKK1NMT1ZBS0lBOlNLCitTTE9WRU5JQTpTSQorU09MT01PTiBJU0xBTkRTOlNCCitTT01BTElBOlNPCitTT1VUSCBBRlJJQ0E6WkEKK1NPVVRIIEdFT1JHSUEgQU5EIFRIRSBTT1VUSCBTQU5EV0lDSCBJU0xBTkRTOkdTCitTUEFJTjpFUworU1JJIExBTktBOkxLCitTVURBTjpTRAorU1VSSU5BTUU6U1IKK1NWQUxCQVJEIEFORCBKQU4gTUFZRU46U0oKK1NXQVpJTEFORDpTWgorU1dFREVOOlNFCitTV0lUWkVSTEFORDpDSAorU1lSSUFOIEFSQUIgUkVQVUJMSUM6U1kKK1RBSVdBTiwgUFJPVklOQ0UgT0YgQ0hJTkE6VFcKK1RBSklLSVNUQU46VEoKK1RBTlpBTklBLCBVTklURUQgUkVQVUJMSUMgT0Y6VFoKK1RIQUlMQU5EOlRICitUSU1PUi1MRVNURTpUTAorVE9HTzpURworVE9LRUxBVTpUSworVE9OR0E6VE8KK1RSSU5JREFEIEFORCBUT0JBR086VFQKK1RVTklTSUE6VE4KK1RVUktFWTpUUgorVFVSS01FTklTVEFOOlRNCitUVVJLUyBBTkQgQ0FJQ09TIElTTEFORFM6VEMKK1RVVkFMVTpUVgorVUdBTkRBOlVHCitVS1JBSU5FOlVBCitVTklURUQgQVJBQiBFTUlSQVRFUzpBRQorVU5JVEVEIEtJTkdET006R0IKK1VOSVRFRCBTVEFURVM6VVMKK1VOSVRFRCBTVEFURVMgTUlOT1IgT1VUTFlJTkcgSVNMQU5EUzpVTQorVVJVR1VBWTpVWQorVVpCRUtJU1RBTjpVWgorVkFOVUFUVTpWVQorVkVORVpVRUxBOlZFCitWSUVUIE5BTTpWTgorVklSR0lOIElTTEFORFMsIEJSSVRJU0g6VkcKK1ZJUkdJTiBJU0xBTkRTLCBVLlMuOlZJCitXQUxMSVMgQU5EIEZVVFVOQTpXRgorV0VTVEVSTiBTQUhBUkE6RUgKK1lFTUVOOllFCitaQU1CSUE6Wk0KK1pJTUJBQldFOlpXCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9JU08zMTY2LTEvSVNPMzE2Nl8xX0FMUEhBMlVSTC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9JU08zMTY2LTEvSVNPMzE2Nl8xX0FMUEhBMlVSTC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjZWMzMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0lTTzMxNjYtMS9JU08zMTY2XzFfQUxQSEEyVVJMLnR4dApAQCAtMCwwICsxIEBACitodHRwOi8vd3d3Lmlzby5jaC9pc28vZW4vcHJvZHMtc2VydmljZXMvaXNvMzE2Nm1hLzAyaXNvLTMxNjYtY29kZS1saXN0cy9saXN0LWVuMS1zZW1pYy50eHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9JU08zMTY2LTEvSVNPMzE2Nl8xX0FMUEhBMy50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9JU08zMTY2LTEvSVNPMzE2Nl8xX0FMUEhBMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhkNmNmMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0lTTzMxNjYtMS9JU08zMTY2XzFfQUxQSEEzLnR4dApAQCAtMCwwICsxLDIzMSBAQAorMDA0OkFGR0hBTklTVEFOOkFGRworMjQ4OsVMQU5EIElTTEFORFM6QUxBCiswMDg6QUxCQU5JQTpBTEIKKzAxMjpBTEdFUklBOkRaQQorMDE2OkFNRVJJQ0FOIFNBTU9BOkFTTQorMDIwOkFORE9SUkE6QU5ECiswMjQ6QU5HT0xBOkFHTworNjYwOkFOR1VJTExBOkFJQQorMDI4OkFOVElHVUEgQU5EIEJBUkJVREE6QVRHCiswMzI6QVJHRU5USU5BOkFSRworMDUxOkFSTUVOSUE6QVJNCis1MzM6QVJVQkE6QUJXCiswMzY6QVVTVFJBTElBOkFVUworMDQwOkFVU1RSSUE6QVVUCiswMzE6QVpFUkJBSUpBTjpBWkUKKzA0NDpCQUhBTUFTOkJIUworMDQ4OkJBSFJBSU46QkhSCiswNTA6QkFOR0xBREVTSDpCR0QKKzA1MjpCQVJCQURPUzpCUkIKKzExMjpCRUxBUlVTOkJMUgorMDU2OkJFTEdJVU06QkVMCiswODQ6QkVMSVpFOkJMWgorMjA0OkJFTklOOkJFTgorMDYwOkJFUk1VREE6Qk1VCiswNjQ6QkhVVEFOOkJUTgorMDY4OkJPTElWSUE6Qk9MCiswNzA6Qk9TTklBIEFORCBIRVJaRUdPVklOQTpCSUgKKzA3MjpCT1RTV0FOQTpCV0EKKzA3NjpCUkFaSUw6QlJBCiswOTI6QlJJVElTSCBWSVJHSU4gSVNMQU5EUzpWR0IKKzA5NjpCUlVORUkgREFSVVNTQUxBTTpCUk4KKzEwMDpCVUxHQVJJQTpCR1IKKzg1NDpCVVJLSU5BIEZBU086QkZBCisxMDg6QlVSVU5ESTpCREkKKzExNjpDQU1CT0RJQTpLSE0KKzEyMDpDQU1FUk9PTjpDTVIKKzEyNDpDQU5BREE6Q0FOCisxMzI6Q0FQRSBWRVJERTpDUFYKKzEzNjpDQVlNQU4gSVNMQU5EUzpDWU0KKzE0MDpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6Q0FGCisxNDg6Q0hBRDpUQ0QKKzE1MjpDSElMRTpDSEwKKzE1NjpDSElOQTpDSE4KKzM0NDpIT05HIEtPTkcgU1BFQ0lBTCBBRE1JTklTVFJBVElWRSBSRUdJT04gT0YgQ0hJTkE6SEtHCis0NDY6TUFDQU8gU1BFQ0lBTCBBRE1JTklTVFJBVElWRSBSRUdJT04gT0YgQ0hJTkE6TUFDCisxNzA6Q09MT01CSUE6Q09MCisxNzQ6Q09NT1JPUzpDT00KKzE3ODpDT05HTzpDT0cKKzE4NDpDT09LIElTTEFORFM6Q09LCisxODg6Q09TVEEgUklDQTpDUkkKKzM4NDpD1FRFIEQnSVZPSVJFOkNJVgorMTkxOkNST0FUSUE6SFJWCisxOTI6Q1VCQTpDVUIKKzE5NjpDWVBSVVM6Q1lQCisyMDM6Q1pFQ0ggUkVQVUJMSUM6Q1pFCis0MDg6REVNT0NSQVRJQyBQRU9QTEUnUyBSRVBVQkxJQyBPRiBLT1JFQTpQUksKKzE4MDpERU1PQ1JBVElDIFJFUFVCTElDIE9GIFRIRSBDT05HTzpDT0QKKzIwODpERU5NQVJLOkROSworMjYyOkRKSUJPVVRJOkRKSQorMjEyOkRPTUlOSUNBOkRNQQorMjE0OkRPTUlOSUNBTiBSRVBVQkxJQzpET00KKzIxODpFQ1VBRE9SOkVDVQorODE4OkVHWVBUOkVHWQorMjIyOkVMIFNBTFZBRE9SOlNMVgorMjI2OkVRVUFUT1JJQUwgR1VJTkVBOkdOUQorMjMyOkVSSVRSRUE6RVJJCisyMzM6RVNUT05JQTpFU1QKKzIzMTpFVEhJT1BJQTpFVEgKKzIzNDpGQUVST0UgSVNMQU5EUzpGUk8KKzIzODpGQUxLTEFORCBJU0xBTkRTIChNQUxWSU5BUyk6RkxLCisyNDI6RklKSTpGSkkKKzI0NjpGSU5MQU5EOkZJTgorMjUwOkZSQU5DRTpGUkEKKzI1NDpGUkVOQ0ggR1VJQU5BOkdVRgorMjU4OkZSRU5DSCBQT0xZTkVTSUE6UFlGCisyNjY6R0FCT046R0FCCisyNzA6R0FNQklBOkdNQgorMjY4OkdFT1JHSUE6R0VPCisyNzY6R0VSTUFOWTpERVUKKzI4ODpHSEFOQTpHSEEKKzI5MjpHSUJSQUxUQVI6R0lCCiszMDA6R1JFRUNFOkdSQworMzA0OkdSRUVOTEFORDpHUkwKKzMwODpHUkVOQURBOkdSRAorMzEyOkdVQURFTE9VUEU6R0xQCiszMTY6R1VBTTpHVU0KKzMyMDpHVUFURU1BTEE6R1RNCiszMjQ6R1VJTkVBOkdJTgorNjI0OkdVSU5FQS1CSVNTQVU6R05CCiszMjg6R1VZQU5BOkdVWQorMzMyOkhBSVRJOkhUSQorMzM2OkhPTFkgU0VFOlZBVAorMzQwOkhPTkRVUkFTOkhORAorMzQ4OkhVTkdBUlk6SFVOCiszNTI6SUNFTEFORDpJU0wKKzM1NjpJTkRJQTpJTkQKKzM2MDpJTkRPTkVTSUE6SUROCiszNjQ6SVJBTiwgSVNMQU1JQyBSRVBVQkxJQyBPRjpJUk4KKzM2ODpJUkFROklSUQorMzcyOklSRUxBTkQ6SVJMCiszNzY6SVNSQUVMOklTUgorMzgwOklUQUxZOklUQQorMzg4OkpBTUFJQ0E6SkFNCiszOTI6SkFQQU46SlBOCis0MDA6Sk9SREFOOkpPUgorMzk4OktBWkFLSFNUQU46S0FaCis0MDQ6S0VOWUE6S0VOCisyOTY6S0lSSUJBVEk6S0lSCis0MTQ6S1VXQUlUOktXVAorNDE3OktZUkdZWlNUQU46S0daCis0MTg6TEFPIFBFT1BMRSdTIERFTU9DUkFUSUMgUkVQVUJMSUM6TEFPCis0Mjg6TEFUVklBOkxWQQorNDIyOkxFQkFOT046TEJOCis0MjY6TEVTT1RITzpMU08KKzQzMDpMSUJFUklBOkxCUgorNDM0OkxJQllBTiBBUkFCIEpBTUFISVJJWUE6TEJZCis0Mzg6TElFQ0hURU5TVEVJTjpMSUUKKzQ0MDpMSVRIVUFOSUE6TFRVCis0NDI6TFVYRU1CT1VSRzpMVVgKKzQ1MDpNQURBR0FTQ0FSOk1ERworNDU0Ok1BTEFXSTpNV0kKKzQ1ODpNQUxBWVNJQTpNWVMKKzQ2MjpNQUxESVZFUzpNRFYKKzQ2NjpNQUxJOk1MSQorNDcwOk1BTFRBOk1MVAorNTg0Ok1BUlNIQUxMIElTTEFORFM6TUhMCis0NzQ6TUFSVElOSVFVRTpNVFEKKzQ3ODpNQVVSSVRBTklBOk1SVAorNDgwOk1BVVJJVElVUzpNVVMKKzE3NTpNQVlPVFRFOk1ZVAorNDg0Ok1FWElDTzpNRVgKKzU4MzpNSUNST05FU0lBLCBGRURFUkFURUQgU1RBVEVTIE9GOkZTTQorNDkyOk1PTkFDTzpNQ08KKzQ5NjpNT05HT0xJQTpNTkcKKzQ5OTpNT05URU5FR1JPOlVOSworNTAwOk1PTlRTRVJSQVQ6TVNSCis1MDQ6TU9ST0NDTzpNQVIKKzUwODpNT1pBTUJJUVVFOk1PWgorMTA0Ok1ZQU5NQVI6TU1SCis1MTY6TkFNSUJJQTpOQU0KKzUyMDpOQVVSVTpOUlUKKzUyNDpORVBBTDpOUEwKKzUyODpORVRIRVJMQU5EUzpOTEQKKzUzMDpORVRIRVJMQU5EUyBBTlRJTExFUzpBTlQKKzU0MDpORVcgQ0FMRURPTklBOk5DTAorNTU0Ok5FVyBaRUFMQU5EOk5aTAorNTU4Ok5JQ0FSQUdVQTpOSUMKKzU2MjpOSUdFUjpORVIKKzU2NjpOSUdFUklBOk5HQQorNTcwOk5JVUU6TklVCis1NzQ6Tk9SRk9MSyBJU0xBTkQ6TkZLCis1ODA6Tk9SVEhFUk4gTUFSSUFOQSBJU0xBTkRTOk1OUAorNTc4Ok5PUldBWTpOT1IKKzI3NTpPQ0NVUElFRCBQQUxFU1RJTklBTiBURVJSSVRPUlk6UFNFCis1MTI6T01BTjpPTU4KKzU4NjpQQUtJU1RBTjpQQUsKKzU4NTpQQUxBVTpQTFcKKzU5MTpQQU5BTUE6UEFOCis1OTg6UEFQVUEgTkVXIEdVSU5FQTpQTkcKKzYwMDpQQVJBR1VBWTpQUlkKKzYwNDpQRVJVOlBFUgorNjA4OlBISUxJUFBJTkVTOlBITAorNjEyOlBJVENBSVJOOlBDTgorNjE2OlBPTEFORDpQT0wKKzYyMDpQT1JUVUdBTDpQUlQKKzYzMDpQVUVSVE8gUklDTzpQUkkKKzYzNDpRQVRBUjpRQVQKKzQxMDpSRVBVQkxJQyBPRiBLT1JFQTpLT1IKKzQ5ODpSRVBVQkxJQyBPRiBNT0xET1ZBOk1EQQorNjM4OlLJVU5JT046UkVVCis2NDI6Uk9NQU5JQTpST1UKKzY0MzpSVVNTSUFOIEZFREVSQVRJT046UlVTCis2NDY6UldBTkRBOlJXQQorNjU0OlNBSU5UIEhFTEVOQTpTSE4KKzY1OTpTQUlOVCBLSVRUUyBBTkQgTkVWSVM6S05BCis2NjI6U0FJTlQgTFVDSUE6TENBCis2NjY6U0FJTlQgUElFUlJFIEFORCBNSVFVRUxPTjpTUE0KKzY3MDpTQUlOVCBWSU5DRU5UIEFORCBUSEUgR1JFTkFESU5FUzpWQ1QKKzg4MjpTQU1PQTpXU00KKzY3NDpTQU4gTUFSSU5POlNNUgorNjc4OlNBTyBUT01FIEFORCBQUklOQ0lQRTpTVFAKKzY4MjpTQVVESSBBUkFCSUE6U0FVCis2ODY6U0VORUdBTDpTRU4KKzY4ODpTRVJCSUE6VU5LCis2OTA6U0VZQ0hFTExFUzpTWUMKKzY5NDpTSUVSUkEgTEVPTkU6U0xFCis3MDI6U0lOR0FQT1JFOlNHUAorNzAzOlNMT1ZBS0lBOlNWSworNzA1OlNMT1ZFTklBOlNWTgorMDkwOlNPTE9NT04gSVNMQU5EUzpTTEIKKzcwNjpTT01BTElBOlNPTQorNzEwOlNPVVRIIEFGUklDQTpaQUYKKzcyNDpTUEFJTjpFU1AKKzE0NDpTUkkgTEFOS0E6TEtBCis3MzY6U1VEQU46U0ROCis3NDA6U1VSSU5BTUU6U1VSCis3NDQ6U1ZBTEJBUkQgQU5EIEpBTiBNQVlFTiBJU0xBTkRTOlNKTQorNzQ4OlNXQVpJTEFORDpTV1oKKzc1MjpTV0VERU46U1dFCis3NTY6U1dJVFpFUkxBTkQ6Q0hFCis3NjA6U1lSSUFOIEFSQUIgUkVQVUJMSUM6U1lSCis3NjI6VEFKSUtJU1RBTjpUSksKKzc2NDpUSEFJTEFORDpUSEEKKzgwNzpUSEUgRk9STUVSIFlVR09TTEFWIFJFUFVCTElDIE9GIE1BQ0VET05JQTpNS0QKKzYyNjpUSU1PUi1MRVNURTpUTFMKKzc2ODpUT0dPOlRHTworNzcyOlRPS0VMQVU6VEtMCis3NzY6VE9OR0E6VE9OCis3ODA6VFJJTklEQUQgQU5EIFRPQkFHTzpUVE8KKzc4ODpUVU5JU0lBOlRVTgorNzkyOlRVUktFWTpUVVIKKzc5NTpUVVJLTUVOSVNUQU46VEtNCis3OTY6VFVSS1MgQU5EIENBSUNPUyBJU0xBTkRTOlRDQQorNzk4OlRVVkFMVTpUVVYKKzgwMDpVR0FOREE6VUdBCis4MDQ6VUtSQUlORTpVS1IKKzc4NDpVTklURUQgQVJBQiBFTUlSQVRFUzpBUkUKKzgyNjpVTklURUQgS0lOR0RPTSBPRiBHUkVBVCBCUklUQUlOIEFORCBOT1JUSEVSTiBJUkVMQU5EOkdCUgorODM0OlVOSVRFRCBSRVBVQkxJQyBPRiBUQU5aQU5JQTpUWkEKKzg0MDpVTklURUQgU1RBVEVTIE9GIEFNRVJJQ0E6VVNBCis4NTA6VU5JVEVEIFNUQVRFUyBWSVJHSU4gSVNMQU5EUzpWSVIKKzg1ODpVUlVHVUFZOlVSWQorODYwOlVaQkVLSVNUQU46VVpCCis1NDg6VkFOVUFUVTpWVVQKKzg2MjpWRU5FWlVFTEEgKEJPTElWQVJJQU4gUkVQVUJMSUMgT0YpOlZFTgorNzA0OlZJRVQgTkFNOlZOTQorODc2OldBTExJUyBBTkQgRlVUVU5BIElTTEFORFM6V0xGCis3MzI6V0VTVEVSTiBTQUhBUkE6RVNICis4ODc6WUVNRU46WUVNCis4OTQ6WkFNQklBOlpNQgorNzE2OlpJTUJBQldFOlpXRQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvSVNPMzE2Ni0xL0lTTzMxNjZfMV9BTFBIQTNVUkwudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvSVNPMzE2Ni0xL0lTTzMxNjZfMV9BTFBIQTNVUkwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YTIyMzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9JU08zMTY2LTEvSVNPMzE2Nl8xX0FMUEhBM1VSTC50eHQKQEAgLTAsMCArMSBAQAoraHR0cDovL3Vuc3RhdHMudW4ub3JnL3Vuc2QvbWV0aG9kcy9tNDkvbTQ5YWxwaGEuaHRtClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvSVNPMzE2Ni0xL0lTTzMxNjZfMV9saXN0LnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0lTTzMxNjYtMS9JU08zMTY2XzFfbGlzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5ZjNkNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL0lTTzMxNjYtMS9JU08zMTY2XzFfbGlzdC50eHQKQEAgLTAsMCArMSwyODAgQEAKKyNUaGlzIElTTyAzMTY2XzEgZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBieSBOZWxzb24gdG8gbWF0Y2ggb3VyIGRpdmEgZGF0YSBzZXQuCitFcXVhdG9yaWFsIEd1aW5lYSwgMjI2LCAgR05RLCBHUQorR3VpbmVhLCAzMjQsIEdJTiwgR04KK0d1aW5lYSBCaXNzYXUsIDYyNCwgR05CLCBHVworQWZnaGFuaXN0YW4sIDAwNCwgQUZHLCBBRgorxWxhbmQgSXNsYW5kcywgMjQ4LCBBTEEsIEFYCitBbGJhbmlhLCAwMDgsIEFMQiwgQUwKK0FsZ2VyaWEsIDAxMiwgRFpBLCBEWgorQW1lcmljYW4gU2Ftb2EsIDAxNiwgQVNNLCBBUworQW5kb3JyYSwgMDIwLCBBTkQsIEFECitBbmdvbGEsIDAyNCwgQUdPLCBBTworQW5ndWlsbGEsIDY2MCwgQUlBLCBBSQorQW50YXJjdGljYSwgMDEwLCAgQVRBLCBBUQorQW50aWd1YSBhbmQgQmFyYnVkYSwgMDI4LCBBVEcsIEFHCitBcmdlbnRpbmEsIDAzMiwgQVJHLCBBUgorQXJtZW5pYSwgMDUxLCAgQVJNLCBBTQorQXJ1YmEsIDUzMywgQUJXLCBBVworQXVzdHJhbGlhLCAwMzYsIEFVUywgQVUKK0F1c3RyaWEsIDA0MCwgIEFVVCwgQVQKK0F6ZXJiYWlqYW4sIDAzMSwgQVpFLCBBWgorQmFoYW1hcywgMDQ0LCBCSFMsIEJTCitCYWhyYWluLCAwNDgsIEJIUiwgQkgKK0JhbmdsYWRlc2gsICAwNTAsIEJHRCwgQkQKK0JhcmJhZG9zLCAwNTIsIEJSQiwgQkIKK0JlbGFydXMsIDExMiwgQkxSLCBCWQorQmVsZ2l1bSwgIDA1NiwgQkVMLCBCRQorQmVsaXplLCAwODQsIEJMWiwgQloKK0JlbmluLCAyMDQsIEJFTiwgQkoKK0Jlcm11ZGEsICAwNjAsIEJNVSwgQk0KK0JodXRhbiwgMDY0LCBCVE4sIEJUCitCb2xpdmlhLCAwNjgsIEJPTCwgQk8KK0Jvc25pYSBhbmQgSGVyemVnb3ZpbmEsICAwNzAsIEJJSCwgQkEKKyNCb3NuaWEgYW5kIEhlcnplZ292aW5hLCAgMDcwLCBCSUgsIEJICitCb3Rzd2FuYSwgMDcyLCBCV0EsIEJXCitCb3V2ZXQgSXNsYW5kLCAwNzQsIEJWVCwgQlYKK0JyYXppbCwgIDA3NiwgQlJBLCBCUgorQnJhc2lsLCAgMDc2LCBCUkEsIEJSCisjQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5LCAwODYsIElPVCwgSU8KKyNCcnVuZWkgRGFydXNzYWxhbSwgMDk2LCBCUk4sIEJOCitCcnVuZWksIDA5NiwgQlJOLCBCTgorQnVsZ2FyaWEsICAxMDAsIEJHUiwgQkcKK0J1cmtpbmEsIDg1NCwgQkZBLCBCRgorQnVya2luYUZhc28sIDg1NCwgQkZBLCBCRgorQnVydW5kaSwgMTA4LCBCREksIEJJCitDYW1ib2RpYSwgMTE2LCBLSE0sIEtICitDYW1lcm9vbiwgMTIwLCBDTVIsIENNCitDYW5hZGEsIDEyNCwgIENBTiwgQ0EKK0NhcGUgVmVyZGUsIDEzMiwgQ1BWLCBDVgorQ2F5bWFuIElzbGFuZHMsIDEzNiwgQ1lNLCBLWQorQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljLCAxNDAsICBDQUYsIENGCitDaGFkLCAxNDgsIFRDRCwgVEQKK0NoaWxlLCAxNTIsIENITCwgQ0wKK0NoaW5hLCAxNTYsICBDSE4sIENOCitDaHJpc3RtYXMgSXNsYW5kLCAxNjIsIENYUiwgQ1gKK0NvY29zIChLZWVsaW5nKSBJc2xhbmRzLCAxNjYsIENDSywgQ0MKK0NvbG9tYmlhLCAxNzAsICBDT0wsIENPCitDb21vcm9zLCAxNzQsIENPTSwgS00KK0NvbmdvLCAxNzgsIENPRywgQ0cKK0NvbmdvICh0aGUgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUpLCAxODAsICBDT0QsIENECitDb29rIElzbGFuZHMsIDE4NCwgQ09LLCBDSworQ29zdGEgUmljYSwgMTg4LCBDUkksIENSCitD9HRlIGQnSXZvaXJlLCAzODQsICBDSVYsIENJCitJdm9yeSBDb2FzdCwgMzg0LCBDSVYsIENJCitDcm9hdGlhLCAxOTEsIEhSViwgSFIKK0N1YmEsIDE5MiwgQ1VCLCBDVQorQ3lwcnVzLCAxOTYsICBDWVAsIENZCisjQ3plY2ggUmVwdWJsaWMsIDIwMywgQ1pFLCBDWgorQ3plY2ggUmVwdWJsaWMsIDIwMywgQ1pFLCBDUworRGVubWFyaywgMjA4LCBETkssIERLCitEamlib3V0aSwgMjYyLCBESkksIERKCitEb21pbmljYSwgIDIxMiwgRE1BLCBETQorRG9taW5pY2FuIFJlcHVibGljLCAyMTQsIERPTSwgRE8KK0VjdWFkb3IsIDIxOCwgRUNVLCAgRUMKK0VneXB0LCA4MTgsIEVHWSwgRUcKK0VsIFNhbHZhZG9yLCAyMjIsIFNMViwgU1YKKyNFcXVhdG9yaWFsIEd1aW5lYSwgMjI2LCAgR05RLCBHUQorRXJpdHJlYSwgMjMyLCBFUkksIEVSCitFc3RvbmlhLCAyMzMsIEVTVCwgRUUKK0V0aGlvcGlhLCAyMzEsICBFVEgsIEVUCisjRmFsa2xhbmQgSXNsYW5kcyAoTWFsdmluYXMpLCAgMjM4LCBGTEssIEZLCisjRmF1bGtsYW5kIElzbGFuZHMsIDIzOCwgRkxLLCBGSworRmFyb2UgSXNsYW5kcywgMjM0LCBGUk8sIEZPCitGaWppLCAyNDIsIEZKSSwgRkoKK0ZpbmxhbmQsICAyNDYsIEZJTiwgRkkKK0ZyYW5jZSwgMjUwLCBGUkEsIEZSCitGcmVuY2ggR3VpYW5hLCAyNTQsIEdVRiwgR0YKK0ZyZW5jaCBQb2x5bmVzaWEsICAyNTgsIFBZRiwgUEYKK0ZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcywgMjYwLCBBVEYsIFRGCitHYWJvbiwgMjY2LCBHQUIsICBHQQorR2FtYmlhLCAyNzAsIEdNQiwgR00KK0dhbWJpYSBUaGUsIDI3MCwgR01CLCBHTQorR2VvcmdpYSwgMjY4LCBHRU8sIEdFCitHZXJtYW55LCAyNzYsICBERVUsIERFCitHaGFuYSwgMjg4LCBHSEEsIEdICitHaWJyYWx0YXIsIDI5MiwgR0lCLCBHSQorR3JlZWNlLCAzMDAsICBHUkMsIEdSCitHcmVlbmxhbmQsIDMwNCwgR1JMLCBHTAorR3JlbmFkYSwgMzA4LCBHUkQsIEdECitHdWFkZWxvdXBlLCAzMTIsICBHTFAsIEdQCitHdWFtLCAzMTYsIEdVTSwgR1UKK0d1YXRlbWFsYSwgMzIwLCBHVE0sIEdUCitHdWVybnNleSwgODMxLCAgR0dZLCBHRworI0d1aW5lYSwgMzI0LCBHSU4sIEdOCisjR3VpbmVhIEJpc3NhdSwgNjI0LCBHTkIsIEdXCisjR3VpbmVhLUJpc3NhdSwgNjI0LCBHTkIsIEdXCitHdXlhbmEsIDMyOCwgIEdVWSwgR1kKK0hhaXRpLCAgMzMyLCBIVEksIEhUCitIZWFyZCBJc2xhbmQgYW5kIE1jRG9uYWxkIElzbGFuZHMsIDMzNCwgSE1ELCBITQorSG9seSBTZWUgKFZhdGljYW4gQ2l0eSBTdGF0ZSksIDMzNiwgVkFULCBWQQorSG9uZHVyYXMsICAzNDAsIEhORCwgSE4KK0hvbmcgS29uZywgMzQ0LCBIS0csIEhLCitIdW5nYXJ5LCAzNDgsIEhVTiwgSFUKK0ljZWxhbmQsIDM1MiwgSVNMLCBJUworSW5kaWEsIDM1NiwgSU5ELCBJTgorSW5kb25lc2lhLCAzNjAsICBJRE4sIElECisjSXJhbiAoSXNsYW1pYyBSZXB1YmxpYyBvZiksIDM2NCwgSVJOLCBJUgorSXJhbiwgMzY0LCBJUk4sIElSCitJcmFxLCAzNjgsIElSUSwgSVEKKyNJcmFrLCAzNjgsIElSUSwgSVEKK0lyZWxhbmQsIDM3MiwgIElSTCwgSUUKK0lzbGUgb2YgTWFuLCA4MzMsIElNTiwgSU0KK0lzcmFlbCwgMzc2LCBJU1IsIElMCitJdGFseSwgMzgwLCAgSVRBLCBJVAorSmFtYWljYSwgIDM4OCwgSkFNLCBKTQorSmFwYW4sIDM5MiwgSlBOLCBKUAorSmVyc2V5LCA4MzIsIEpFWSwgSkUKK0pvcmRhbiwgIDQwMCwgSk9SLCBKTworS2F6YWtoc3RhbiwgMzk4LCBLQVosIEtaCitLZW55YSwgNDA0LCBLRU4sIEtFCitLaXJpYmF0aSwgMjk2LCBLSVIsIEtJCisjS29yZWEgKERlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YpLCA0MDgsIFBSSywgS1AKK05vcnRoIEtvcmVhLCA0MDgsIFBSSyxLUAorI0tvcmVhIChSZXB1YmxpYyBvZiksIDQxMCwgIEtPUiwgS1IKK1NvdXRoIEtvcmVhLCA0MTAsIEtPUiwgS1IKK0t1d2FpdCwgNDE0LCBLV1QsIEtXCitLeXJneXpzdGFuLCA0MTcsIEtHWiwgS0cKKyNMYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYywgNDE4LCBMQU8sIExBCitMYW9zLCA0MTgsIExBTywgTEEKK0xhdHZpYSwgIDQyOCwgTFZBLCBMVgorTGViYW5vbiwgNDIyLCBMQk4sIExCCitMZXNvdGhvLCA0MjYsIExTTywgTFMKK0xpYmVyaWEsICA0MzAsIExCUiwgTFIKKyNMaWJ5YW4gQXJhYiBKYW1haGlyaXlhLCA0MzQsIExCWSwgTFkKK0xpYnlhLCA0MzQsIExCWSwgTFkKK0xpZWNodGVuc3RlaW4sIDQzOCwgTElFLCBMSQorTGl0aHVhbmlhLCAgNDQwLCBMVFUsIExUCisvL0x1eGVtYm91cmcsIDQ0MiwgTFVYLCBMVQorTHV4ZW1ib3VyZywgNDQyLCBMVVgsIExYCisjTWFjYW8sIDQ0NiwgTUFDLCAgTU8KK01hY2F1LCA0NDYsIE1BQywgTU8KKyNNYWNlZG9uaWEgKHRoZSBGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YpLCA4MDcsIE1LRCwgTUsKK01hY2Vkb25pYSwgODA3LCBNS0QsIE1LCitNYWtlZG9uaWphLCA4MDcsIE1LRCwgTUsKK01hZGFnYXNjYXIsIDQ1MCwgTURHLCBNRworTWFsYXdpLCA0NTQsICBNV0ksIE1XCitNYWxheXNpYSwgNDU4LCBNWVMsIE1ZCitNYWxkaXZlcywgNDYyLCBNRFYsIE1WCitNYWxpLCA0NjYsICBNTEksIE1MCitNYWx0YSwgNDcwLCBNTFQsIE1UCitNYXJzaGFsbCBJc2xhbmRzLCA1ODQsIE1ITCwgTUgKK01hcnRpbmlxdWUsIDQ3NCwgIE1UUSwgTVEKK01hdXJpdGFuaWEsIDQ3OCwgTVJULCBNUgorTWF1cml0aXVzLCA0ODAsIE1VUywgTVUKK01heW90dGUsIDE3NSwgIE1ZVCwgWVQKK01leGljbywgNDg0LCBNRVgsIE1YCitNaWNyb25lc2lhIChGZWRlcmF0ZWQgU3RhdGVzIG9mKSwgNTgzLCBGU00sIEZNCitNb2xkb3ZhLCA0OTgsICBNREEsIE1ECitNb2xkb3ZpYSwgNDk4LCBNREEsIE1ECitNb2xkYXZpYSwgNDk4LCBNREEsIE1ECitNb25hY28sIDQ5MiwgTUNPLCBNQworTW9uZ29saWEsIDQ5NiwgTU5HLCBNTgorTW9udGVuZWdybywgNDk5LCAgQ0dSLCAmIzE2MDs/CitNb250c2VycmF0LCA1MDAsIE1TUiwgTVMKK01vcm9jY28sIDUwNCwgTUFSLCBNQQorTW96YW1iaXF1ZSwgNTA4LCAgTU9aLCBNWgorTXlhbm1hciwgMTA0LCBNTVIsIE1NCitNeWFubWFyIChCdXJtYSksIDEwNCwgTU1SLCBNTQorTmFtaWJpYSwgNTE2LCBOQU0sIE5BCitOYXVydSwgNTIwLCBOUlUsIE5SCitOZXBhbCwgIDUyNCwgTlBMLCBOUAorTmV0aGVybGFuZHMsIDUyOCwgTkxELCBOTAorTmV0aGVybGFuZHMgQW50aWxsZXMsIDUzMCwgQU5ULCBBTgorTmV3IENhbGVkb25pYSwgIDU0MCwgTkNMLCBOQworTmV3IFplYWxhbmQsIDU1NCwgTlpMLCBOWgorTmljYXJhZ3VhLCA1NTgsIE5JQywgTkkKK05pZ2VyLCAgNTYyLCBORVIsIE5FCitOaWdlcmlhLCA1NjYsIE5HQSwgTkcKK05pdWUsIDU3MCwgTklVLCBOVQorTm9yZm9sayBJc2xhbmQsICA1NzQsIE5GSywgTkYKK05vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcywgNTgwLCBNTlAsIE1QCitOb3J3YXksIDU3OCwgTk9SLCBOTworT21hbiwgNTEyLCBPTU4sIE9NCitQYWtpc3RhbiwgNTg2LCBQQUssIFBLCitQYWxhdSwgNTg1LCBQTFcsIFBXCitQYWxlc3RpbmlhbiBUZXJyaXRvcnkgKE9jY3VwaWVkKSwgMjc1LCAgUFNFLCBQUworUGFuYW1hLCA1OTEsIFBBTiwgUEEKK1BhcHVhIE5ldyBHdWluZWEsIDU5OCwgUE5HLCBQRworUGFyYWd1YXksIDYwMCwgIFBSWSwgUFkKK1BlcnUsIDYwNCwgUEVSLCBQRQorUGhpbGlwcGluZXMsIDYwOCwgUEhMLCBQSAorUGl0Y2Fpcm4sIDYxMiwgIFBDTiwgUE4KK1BvbGFuZCwgNjE2LCBQT0wsIFBMCitQb3J0dWdhbCwgNjIwLCBQUlQsIFBUCitQdWVydG8gUmljbywgNjMwLCAgUFJJLCBQUgorUWF0YXIsICA2MzQsIFFBVCwgUUEKK1LpdW5pb24sIDYzOCwgUkVVLCBSRQorUm9tYW5pYSwgNjQyLCBST1UsICBSTworUnVzc2lhLCA2NDMsIFJVUywgUlUgCisjUnVzc2lhbiBGZWRlcmF0aW9uLCA2NDMsIFJVUywgUlUKK1J3YW5kYSwgNjQ2LCBSV0EsIFJXCitTYWludCBIZWxlbmEsIDY1NCwgU0hOLCBTSAorU2FpbnQgS2l0dHMgYW5kIE5ldmlzLCAgNjU5LCBLTkEsIEtOCitTYWludCBMdWNpYSwgNjYyLCBMQ0EsIExDCitTYWludCBQaWVycmUgYW5kIE1pcXVlbG9uLCA2NjYsIFNQTSwgUE0KK1NhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzLCAgNjcwLCBWQ1QsIFZDCitTYW1vYSwgODgyLCBXU00sIFdTCitTYW4gTWFyaW5vLCA2NzQsIFNNUiwgU00KK1NhbyBUb21lIGFuZCBQcmluY2lwZSwgIDY3OCwgU1RQLCBTVAorU2F1ZGkgQXJhYmlhLCA2ODIsIFNBVSwgU0EKK1NlbmVnYWwsIDY4NiwgU0VOLCBTTgorU2VyYmlhLCAgNjg4LCBTUkIsICYjMTYwOz8KKyNZdWdvc2xhdmlhLCAgNjg4LCBTUkIsIFJTCitZdWdvc2xhdmlhLCAgNjg4LCBTUkIsIFlVCitTZXljaGVsbGVzLCA2OTAsIFNZQywgU0MKK1NpZXJyYSBMZW9uZSwgNjk0LCBTTEUsIFNMCitTaW5nYXBvcmUsICA3MDIsIFNHUCwgU0cKK1Nsb3Zha2lhLCA3MDMsIFNWSywgU0sKK1Nsb3ZlbmlhLCA3MDUsIFNWTiwgU0kKK1NvbG9tb24gSXNsYW5kcywgIDA5MCwgU0xCLCBTQgorU29tYWxpYSwgNzA2LCBTT00sIFNPCitTb3V0aCBBZnJpY2EsIDcxMCwgWkFGLCBaQQorU291dGggR2VvcmdpYSBhbmQgdGhlIFNvdXRoIFNhbmR3aWNoIElzbGFuZHMsICAyMzksIFNHUywgR1MKK1NwYWluLCA3MjQsIEVTUCwgRVMKK1NyaSBMYW5rYSwgMTQ0LCBMS0EsIExLCitTdWRhbiwgIDczNiwgU0ROLCBTRAorU3VyaW5hbWUsIDc0MCwgU1VSLCBTUgorU3ZhbGJhcmQgYW5kIEphbiBNYXllbiwgNzQ0LCBTSk0sIFNKCitTd2F6aWxhbmQsICA3NDgsIFNXWiwgU1oKK1N3ZWRlbiwgNzUyLCBTV0UsIFNFCitTd2l0emVybGFuZCwgNzU2LCBDSEUsIENICisjU3lyaWFuIEFyYWIgUmVwdWJsaWMsICA3NjAsIFNZUiwgU1kKK1N5cmlhLCAgNzYwLCBTWVIsIFNZCitUYWl3YW4gKFByb3ZpbmNlIG9mIENoaW5hKSwgMTU4LCBUV04sIFRXCitUYWppa2lzdGFuLCA3NjIsIFRKSywgVEoKKyNUYW56YW5pYSAoVW5pdGVkIFJlcHVibGljIG9mKSwgODM0LCBUWkEsIFRaCitUYW56YW5pYSwgODM0LCBUWkEsIFRaCitUYW56YW5pYSBVbml0ZWQgUmVwdWJsaWMsIDgzNCwgVFpBLCBUWgorVGhhaWxhbmQsIDc2NCwgVEhBLCBUSAorVGltb3ItTGVzdGUsIDYyNiwgIFRMUywgVEwKK1RvZ28sIDc2OCwgVEdPLCBURworVG9rZWxhdSwgNzcyLCBUS0wsIFRLCitUb25nYSwgNzc2LCAgVE9OLCBUTworVHJpbmlkYWQgYW5kIFRvYmFnbywgNzgwLCBUVE8sIFRUCitUdW5pc2lhLCA3ODgsIFRVTiwgVE4KK1R1cmtleSwgNzkyLCAgVFVSLCBUUgorVHVya21lbmlzdGFuLCA3OTUsIFRLTSwgVE0KK1R1cmtzIGFuZCBDYWljb3MgSXNsYW5kcywgNzk2LCBUQ0EsIFRDCitUdXZhbHUsIDc5OCwgIFRVViwgVFYKK1VnYW5kYSwgIDgwMCwgVUdBLCBVRworVWtyYWluZSwgODA0LCBVS1IsIFVBCitVbml0ZWQgQXJhYiBFbWlyYXRlcywgNzg0LCBBUkUsIEFFCitVbml0ZWRBcmFiRW1pcmF0ZXMsIDc4NCwgQVJFLCBBRQorI1VuaXRlZCBLaW5nZG9tLCAgODI2LCBHQlIsR0IKK1VuaXRlZCBLaW5nZG9tLCAgODI2LCBHQlIsR0IKK1VuaXRlZCBTdGF0ZXMsIDg0MCwgVVNBLCBVUworVW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRzLCA1ODEsIFVNSSwgVU0KK1VydWd1YXksICA4NTgsIFVSWSwgVVkKK1V6YmVraXN0YW4sIDg2MCwgVVpCLCBVWgorVmFudWF0dSwgNTQ4LCBWVVQsIFZVCitWZW5lenVlbGEsIDg2MiwgVkVOLCBWRQorI1ZpZXQgTmFtLCA3MDQsIFZOTSwgVk4KK1ZpZXRuYW0sIDcwNCwgVk5NLCBWTgorVmlyZ2luIElzbGFuZHMgKEJyaXRpc2gpLCAwOTIsICBWR0IsIFZHCitWaXJnaW4gSXNsYW5kcyAoVS5TLiksIDg1MCwgVklSLCBWSQorV2FsbGlzIGFuZCBGdXR1bmEsIDg3NiwgV0xGLCBXRgorV2VzdGVybiBTYWhhcmEsIDczMiwgRVNILCBFSAorWWVtZW4sIDg4NywgWUVNLCBZRQorWmFtYmlhLCA4OTQsIFpNQiwgWk0KK1phaXJlLCAxODAsIFpBUiwgWlIKK1ppbWJhYndlLCA3MTYsIFpXRSwgWlcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9JU08zMTY2LTIvSVNPMzE2Nl8yX2xpc3QudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvSVNPMzE2Ni0yL0lTTzMxNjZfMl9saXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzhkMzgzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvSVNPMzE2Ni0yL0lTTzMxNjZfMl9saXN0LnR4dApAQCAtMCwwICsxLDQwNTggQEAKK1BSCTsJUFItNzIwMDEJOwlBZGp1bnRhcyAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwMDMJOwlBZ3VhZGEgCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMDA1CTsJQWd1YWRpbGxhIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjAwNwk7CUFndWFzIEJ1ZW5hcyAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwMDkJOwlBaWJvbml0byAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwMTEJOwlB8WFzY28gCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMDEzCTsJQXJlY2libyAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwMTUJOwlBcnJveW8gCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMDE3CTsJQmFyY2Vsb25ldGEgCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMDE5CTsJQmFycmFucXVpdGFzIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjAyMQk7CUJheWFt824gCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMDIzCTsJQ2FibyBSb2pvIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjAyNQk7CUNhZ3VhcyAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwMjcJOwlDYW11eSAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwMjkJOwlDYW7zdmFuYXMgCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMDMxCTsJQ2Fyb2xpbmEgCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMDMzCTsJQ2F0YfFvIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjAzNQk7CUNheWV5IAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjAzNwk7CUNlaWJhIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjAzOQk7CUNpYWxlcyAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwNDEJOwlDaWRyYSAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwNDMJOwlDb2FtbyAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwNDUJOwlDb21lcu1vIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjA0Nwk7CUNvcm96YWwgCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMDQ5CTsJQ3VsZWJyYSAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwNTEJOwlEb3JhZG8gCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMDUzCTsJRmFqYXJkbyAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwNTQJOwlGbG9yaWRhIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjA1NQk7CUd14W5pY2EgCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMDU3CTsJR3VheWFtYSAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwNTkJOwlHdWF5YW5pbGxhIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjA2MQk7CUd1YXluYWJvIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjA2Mwk7CUd1cmFibyAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwNjUJOwlIYXRpbGxvIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjA2Nwk7CUhvcm1pZ3Vlcm9zIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjA2OQk7CUh1bWFjYW8gCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMDcxCTsJSXNhYmVsYSAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwNzMJOwlKYXl1eWEgCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMDc1CTsJSnVhbmEgRO1heiAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwNzcJOwlKdW5jb3MgCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMDc5CTsJTGFqYXMgCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMDgxCTsJTGFyZXMgCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMDgzCTsJTGFzIE1hcu1hcyAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwODUJOwlMYXMgUGllZHJhcyAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwODcJOwlMb+16YSAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwODkJOwlMdXF1aWxsbyAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwOTEJOwlNYW5hdO0gCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMDkzCTsJTWFyaWNhbyAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIwOTUJOwlNYXVuYWJvIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjA5Nwk7CU1heWFn/GV6IAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjA5OQk7CU1vY2EgCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMTAxCTsJTW9yb3ZpcyAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIxMDMJOwlOYWd1YWJvIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjEwNQk7CU5hcmFuaml0byAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIxMDcJOwlPcm9jb3ZpcyAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIxMDkJOwlQYXRpbGxhcyAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIxMTEJOwlQZfF1ZWxhcyAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIxMTMJOwlQb25jZSAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIxMTUJOwlRdWVicmFkaWxsYXMgCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMTE3CTsJUmluY/NuIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjExOQk7CVLtbyBHcmFuZGUgCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMTIxCTsJU2FiYW5hIEdyYW5kZSAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIxMjMJOwlTYWxpbmFzIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjEyNQk7CVNhbiBHZXJt4W4gCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMTI3CTsJU2FuIEp1YW4gCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMTI5CTsJU2FuIExvcmVuem8gCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMTMxCTsJU2FuIFNlYmFzdGnhbiAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIxMzMJOwlTYW50YSBJc2FiZWwgCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMTM1CTsJVG9hIEFsdGEgCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMTM3CTsJVG9hIEJhamEgCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMTM5CTsJVHJ1amlsbG8gQWx0byAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIxNDEJOwlVdHVhZG8gCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMTQzCTsJVmVnYSBBbHRhIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjE0NQk7CVZlZ2EgQmFqYSAJOwkyCTsJMAk7CTAJOwltdW5pY2lwYWxpdHkKK1BSCTsJUFItNzIxNDcJOwlWaWVxdWVzIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjE0OQk7CVZpbGxhbGJhIAk7CTIJOwkwCTsJMAk7CW11bmljaXBhbGl0eQorUFIJOwlQUi03MjE1MQk7CVlhYnVjb2EgCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitQUgk7CVBSLTcyMTUzCTsJWWF1Y28gCTsJMgk7CTAJOwkwCTsJbXVuaWNpcGFsaXR5CitVUztVUy1BTDtBbGFiYW1hOzE7MDswO3N0YXRlCitVUztVUy1BSztBbGFza2E7MjswOzA7c3RhdGUKK1VTO1VTLUFaO0FyaXpvbmE7NDswOzA7c3RhdGUKK1VTO1VTLUFSO0Fya2Fuc2FzOzU7MDswO3N0YXRlCitVUztVUy1EVU1NWTE7QXJsOzA7MDswO3N0YXRlCitVUztVUy1DQTtDYWxpZm9ybmlhOzY7MDswO3N0YXRlCitVUztVUy1EVU1NWTI7Q2FtOzA7MDswO3N0YXRlCitVUztVUy1DTztDb2xvcmFkbzs4OzA7MDtzdGF0ZQorVVM7VVMtQ1Q7Q29ubmVjdGljdXQ7OTswOzA7c3RhdGUKK1VTO1VTLURFO0RlbGF3YXJlOzEwOzA7MDtzdGF0ZQorVVM7VVMtRkw7RmxvcmlkYTsxMjswOzA7c3RhdGUKK1VTO1VTLUdBO0dlb3JnaWE7MTM7MDswO3N0YXRlCitVUztVUy1EVU1NWTM7R2VwOzA7MDswO3N0YXRlCitVUztVUy1ISTtIYXdhaWk7MTU7MDswO3N0YXRlCitVUztVUy1JRDtJZGFobzsxNjswOzA7c3RhdGUKK1VTO1VTLUlMO0lsbGlub2lzOzE3OzA7MDtzdGF0ZQorVVM7VVMtSU47SW5kaWFuYTsxODswOzA7c3RhdGUKK1VTO1VTLUlBO0lvd2E7MTk7MDswO3N0YXRlCitVUztVUy1LUztLYW5zYXM7MjA7MDswO3N0YXRlCitVUztVUy1LWTtLZW50dWNreTsyMTswOzA7c3RhdGUKK1VTO1VTLUxBO0xvdWlzaWFuYTsyMjswOzA7c3RhdGUKK1VTO1VTLU1FO01haW5lOzIzOzA7MDtzdGF0ZQorVVM7VVMtTUQ7TWFyeWxhbmQ7MjQ7MDswO3N0YXRlCitVUztVUy1NQTtNYXNzYWNodXNldHRzOzI1OzA7MDtzdGF0ZQorVVM7VVMtTUk7TWljaGlnYW47MjY7MDswO3N0YXRlCitVUztVUy1NTjtNaW5uZXNvdGE7Mjc7MDswO3N0YXRlCitVUztVUy1NUztNaXNzaXNzaXBwaTsyODswOzA7c3RhdGUKK1VTO1VTLU1PO01pc3NvdXJpOzI5OzA7MDtzdGF0ZQorVVM7VVMtTVQ7TW9udGFuYTszMDswOzA7c3RhdGUKK1VTO1VTLU5FO05lYnJhc2thOzMxOzA7MDtzdGF0ZQorVVM7VVMtTlY7TmV2YWRhOzMyOzA7MDtzdGF0ZQorVVM7VVMtTkg7TmV3IEhhbXBzaGlyZTszMzswOzA7c3RhdGUKK1VTO1VTLU5KO05ldyBKZXJzZXk7MzQ7MDswO3N0YXRlCitVUztVUy1OTTtOZXcgTWV4aWNvOzM1OzA7MDtzdGF0ZQorVVM7VVMtTlk7TmV3IFlvcms7MzY7MDswO3N0YXRlCitVUztVUy1OQztOb3J0aCBDYXJvbGluYTszNzswOzA7c3RhdGUKK1VTO1VTLU5EO05vcnRoIERha290YTszODswOzA7c3RhdGUKK1VTO1VTLU9IO09oaW87Mzk7MDswO3N0YXRlCitVUztVUy1PSztPa2xhaG9tYTs0MDswOzA7c3RhdGUKK1VTO1VTLU9SO09yZWdvbjs0MTswOzA7c3RhdGUKK1VTO1VTLVBBO1Blbm5zeWx2YW5pYTs0MjswOzA7c3RhdGUKK1VTO1VTLVJJO1Job2RlIElzbGFuZDs0NDswOzA7c3RhdGUKK1VTO1VTLVNDO1NvdXRoIENhcm9saW5hOzQ1OzA7MDtzdGF0ZQorVVM7VVMtU0Q7U291dGggRGFrb3RhOzQ2OzA7MDtzdGF0ZQorVVM7VVMtVE47VGVubmVzc2VlOzQ3OzA7MDtzdGF0ZQorVVM7VVMtVFg7VGV4YXM7NDg7MDswO3N0YXRlCitVUztVUy1VVDtVdGFoOzQ5OzA7MDtzdGF0ZQorVVM7VVMtVlQ7VmVybW9udDs1MDswOzA7c3RhdGUKK1VTO1VTLVZBO1ZpcmdpbmlhOzUxOzA7MDtzdGF0ZQorVVM7VVMtRFVNTVk0O1Zpczs1MjswOzA7c3RhdGUKK1VTO1VTLVdBO1dhc2hpbmd0b247NTM7MDswO3N0YXRlCitVUztVUy1XVjtXZXN0IFZpcmdpbmlhOzU0OzA7MDtzdGF0ZQorVVM7VVMtV0k7V2lzY29uc2luOzU1OzA7MDtzdGF0ZQorVVM7VVMtV1k7V3lvbWluZzs1NjswOzA7c3RhdGUKK1VTO1VTLURDO0Rpc3RyaWN0IG9mIENvbHVtYmlhOzExOzA7MDtkaXN0cmljdAorI1VTO1VTLUFTO0FtZXJpY2FuIFNhbW9hOzA7MDswO291dGx5aW5nIGFyZWEKKyNVUztVUy1HVTtHdWFtOzA7MDswO291dGx5aW5nIGFyZWEKKyNVUztVUy1NUDtOb3J0aGVybiBNYXJpYW5hIElzbGFuZHM7MDswOzA7b3V0bHlpbmcgYXJlYQorVVM7VVMtUFI7UHVlcnRvIFJpY287NzI7MDswO291dGx5aW5nIGFyZWEKKyNVUztVUy1VTTtVbml0ZWQgU3RhdGVzIE1pbm9yOzA7MDswO291dGx5aW5nIGFyZWEKKyNVUztVUy1WSTtWaXJnaW4gSXNsYW5kcywgVS5TLjswOzA7MDtvdXRseWluZyBhcmVhCitQUjtQUi1UUjtQdWVydG8gUmljbzswOzA7MDtvdXRseWluZyBhcmVhCitCUjtCUi1ERjtEaXN0cml0byBGZWRlcmFsOzA7MDswO2ZlZGVyYWwgZGlzdHJpY3QKK0JSO0JSLUFDO0FjcmU7MDswOzA7c3RhdGUKK0JSO0JSLUFMO0FsYWdvYXM7MDswOzA7c3RhdGUKK0JSO0JSLUFQO0FtYXBhOzA7MDswO3N0YXRlCitCUjtCUi1BTTtBbWF6b25hczswOzA7MDtzdGF0ZQorQlI7QlItQkE7QmFoaWE7MDswOzA7c3RhdGUKK0JSO0JSLUNFO0NlYXJhOzA7MDswO3N0YXRlCitCUjtCUi1FUztFc3Bpcml0dSBTYW50bzswOzA7MDtzdGF0ZQorQlI7QlItR087R29pYXM7MDswOzA7c3RhdGUKK0JSO0JSLU1BO01hcmFuaGFvOzA7MDswO3N0YXRlCitCUjtCUi1NVDtNYXRvIEdyb3NzbzswOzA7MDtzdGF0ZQorQlI7QlItTVM7TWF0byBHcm9zc28gZG8gU3VsOzA7MDswO3N0YXRlCitCUjtCUi1NRztNaW5hcyBHZXJhaXM7MDswOzA7c3RhdGUKK0JSO0JSLVBBO1BhcmE7MDswOzA7c3RhdGUKK0JSO0JSLVBCO1BhcmFpYmE7MDswOzA7c3RhdGUKK0JSO0JSLVBSO1BhcmFuYTswOzA7MDtzdGF0ZQorQlI7QlItUEU7UGVybmFtYnVjbzswOzA7MDtzdGF0ZQorQlI7QlItUko7UmlvIGRlIEphbmVpcm87MDswOzA7c3RhdGUKK0JSO0JSLVJOO1JpbyBHcmFuZGUgZG8gTm9ydGU7MDswOzA7c3RhdGUKK0JSO0JSLVJTO1JpbyBHcmFuZGUgZG8gU3VsIFtSaW8gR3JhYW5kZSBkbyBzdWxdIFtSaW8gZ3JuZGUgZG8gc3VsXSA7MDswOzA7c3RhdGUKK0JSO0JSLVJPO1JvbmRvbmlhOzA7MDswO3N0YXRlCitCUjtCUi1SUjtSb3JhaW1hOzA7MDswO3N0YXRlCitCUjtCUi1TQztTYW50YSBDYXRhcmluYTswOzA7MDtzdGF0ZQorQlI7QlItU1A7U2FvIFBhdWxvOzA7MDswO3N0YXRlCitCUjtCUi1TRTtTZXJnaXBlOzA7MDswO3N0YXRlCitCUjtCUi1UTztUb2NhbnRpbnM7MDswOzA7c3RhdGUKK0dUO0dULUFWO0FsdGEgVmVyYXBhejswOzA7MAorR1Q7R1QtQlY7QmFqYSBWZXJhcGF6OzA7MDswCitHVDtHVC1DTTtDaGltYWx0ZW5hbmdvOzA7MDswCitHVDtHVC1DUTtDaGlxdWltdWxhOzA7MDswCitHVDtHVC1QUjtFbCBQcm9ncmVzbzswOzA7MAorR1Q7R1QtRVM7RXNjdWludGxhOzA7MDswCitHVDtHVC1HVTtHdWF0ZW1hbGE7MDswOzAKK0dUO0dULUhVO0h1ZWh1ZXRlbmFuZ287MDswOzAKK0dUO0dULUlaO0l6YWJhbDswOzA7MAorR1Q7R1QtSkE7SmFsYXBhOzA7MDswCitHVDtHVC1KVTtKdXRpYXBhOzA7MDswCitHVDtHVC1QRTtQZXRlbjswOzA7MAorR1Q7R1QtUVo7UXVldHphbHRlbmFuZ287MDswOzAKK0dUO0dULVFDO1F1aWNoZTswOzA7MAorR1Q7R1QtUkU7UmV0YWxodWxldTswOzA7MAorR1Q7R1QtU0E7U2FjYXRlcGVxdWV6OzA7MDswCitHVDtHVC1TTTtTYW4gTWFyY29zOzA7MDswCitHVDtHVC1TUjtTYW50YSBSb3NhOzA7MDswCitHVDtHVC1TTztTb2xvbGE7MDswOzAKK0dUO0dULVNVO1N1Y2hpdGVwZXF1ZXo7MDswOzAKK0dUO0dULVRPO1RvdG9uaWNhcGFuOzA7MDswCitHVDtHVC1aQTtaYWNhcGE7MDswOzAKK0dXO0dXLUJTO0Jpc3NhdTswOzA7MGF1dG9ub21vdXMgc2VjdG9yCitHVztHVy1CQTtCYWZhdGE7MDswO0w7cmVnaW9uCitHVztHVy1CTTtCaW9tYm87MDswO047cmVnaW9uCitHVztHVy1CTDtCb2xhbWE7MDswO1M7cmVnaW9uCitHVztHVy1DQTtDYWNoZXU7MDswO047cmVnaW9uCitHVztHVy1HQTtHYWJ1OzA7MDtMO3JlZ2lvbgorR1c7R1ctT0k7T2lvOzA7MDtOO3JlZ2lvbgorR1c7R1ctUVU7UXVpbmFyYTswOzA7UztyZWdpb24KK0dXO0dXLVRPO1RvbWJhbGk7MDswO1M7cmVnaW9uCitITjtITi1BVDtBdGxhbnRpZGE7MDswOzAKK0hOO0hOLUNMO0NvbG9uOzA7MDswCitITjtITi1DTTtDb21heWFndWE7MDswOzAKK0hOO0hOLUNQO0NvcGFuOzA7MDswCitITjtITi1DUjtDb3J0ZXM7MDswOzAKK0hOO0hOLUNIO0Nob2x1dGVjYTswOzA7MAorSE47SE4tRVA7RWwgUGFyYWlzbzswOzA7MAorSE47SE4tRk07RnJhbmNpc2NvIE1vcmF6YW47MDswOzAKK0hOO0hOLUdEO0dyYWNpYXMgYSBEaW9zOzA7MDswCitITjtITi1JTjtJbnRpYnVjYTswOzA7MAorSE47SE4tSUI7SXNsYXMgZGUgbGEgQmFoaWE7MDswOzAKK0hOO0hOLUxQO0xhIFBhejswOzA7MAorSE47SE4tTEU7TGVtcGlyYTswOzA7MAorSE47SE4tT0w7T2xhbmNobzswOzA7MAorSE47SE4tU0I7U2FudGEgQmFyYmFyYTswOzA7MAorSE47SE4tVkE7VmFsbGU7MDswOzAKK0hOO0hOLVlPO1lvcm87MDswOzAKK0hSO0hSLTI7R3JhZCBaYWdyZWI7MDswOzBjaXR5CitIUjtIUi0wNztCamVsb3ZhcnNrby1iaWxvZ29yc2thIHp1cGFuaWphOzA7MDtjb3VudHkKK0hSO0hSLTI7QnJvZHNrby1wb3NhdnNrYSB6dXBhbmlqYTswOzA7Y291bnR5CitIUjtIUi05O0R1YnJvdmFrby1uZXJldHZhbnNrYSB6dXBhbmlqYTswOzA7Y291bnR5CitHWTtHWS1CQTtCYXJpbWEtV2Fpbmk7MDswOzAKK0hSO0hSLTg7SXN0YXJza2EgenVwYW5pamE7MDswO2NvdW50eQorSFI7SFItMDQ7S2FybG92YWthIHp1cGFuaWphOzA7MDtjb3VudHkKK0hSO0hSLTA2O0tvcHJpdm5pa28ta3JpemV2YSBrYSB6dXBhbmlqYTswOzA7Y291bnR5CitIUjtIUi0wMjtLcmFwaW5za28temFnb3Jza2EgenVwYW5pamE7MDswO2NvdW50eQorSFI7SFItMDk7TGlrby1zZW5qc2thIHp1cGFuaWphOzA7MDtjb3VudHkKK0hSO0hSLTIwO01laW11cnNrYSB6dXBhbmlqYTswOzA7Y291bnR5CitIUjtIUi00O09zamVrby1iYXJhbmpza2EgenVwYW5pamE7MDswO2NvdW50eQorSFI7SFItO1BvemVza28tc2xhdm9uc2thIHp1cGFuaWphOzA7MDtjb3VudHkKK0hSO0hSLTA4O1ByaW1vcnNrby1nb3JhbnNrYSB6dXBhbmlqYTswOzA7Y291bnR5CitIUjtIUi0wMztTaXNha28tbW9zbGF2YWthIHp1cGFuaWphOzA7MDtjb3VudHkKK0hSO0hSLTc7U3BsaXRza28tZGFsbWF0aW5za2EgenVwYW5pamE7MDswO2NvdW50eQorSFI7SFItNTtzaWJlbnNrby1rbmluc2thIHp1cGFuaWphOzA7MDtjb3VudHkKK0hSO0hSLTA1O1ZhcmF6ZGluc2thIHp1cGFuaWphOzA7MDtjb3VudHkKK0hSO0hSLTA7Vmlyb3ZpdGlrby1wb2RyYXZza2EgenVwYW5pamE7MDswO2NvdW50eQorSFI7SFItNjtWdWtvdmFyc2tvLXNyaWplbXNrYSB6dXBhbmlqYTswOzA7Y291bnR5CitIUjtIUi0zO1phZGFyc2thIHp1cGFuaWphOzA7MDtjb3VudHkKK0hSO0hSLTA7WmFncmViYWthIHp1cGFuaWphOzA7MDtjb3VudHkKK0hUO0hULUFSO0FydGlib25pdGU7MDswOzAKK0hUO0hULUNFO0NlbnRyZTswOzA7MAorSFQ7SFQtR0E7R3JhbmRlLUFuc2U7MDswOzAKK0hUO0hULU5EO05vcmQ7MDswOzAKK0hUO0hULU5FO05vcmQtRXN0OzA7MDswCitIVDtIVC1OTztOb3JkLU91ZXN0OzA7MDswCitIVDtIVC1PVTtPdWVzdDswOzA7MAorSFQ7SFQtU0Q7U3VkOzA7MDswCitIVDtIVC1TRTtTdWQtRXN0OzA7MDswCitIVTtIVS1CVTtCdWRhcGVzdDswOzA7MDtjYXBpdGFsIGNpdHkKK0hVO0hVLUJLO0JhY3MtS2lza3VuOzA7MDtjb3VudHkKK0hVO0hVLUJBO0JhcmFueWE7MDswO2NvdW50eQorSFU7SFUtQkU7QmVrZXM7MDswO2NvdW50eQorSFU7SFUtQlo7Qm9yc29kLUFiYXVqLVplbXBsZW47MDswO2NvdW50eQorSFU7SFUtQ1M7Q3NvbmdyYWQ7MDswO2NvdW50eQorSFU7SFUtRkU7RmVqZXI7MDswO2NvdW50eQorSFU7SFUtR1M7R3lyLU1vc29uLVNvcHJvbjswOzA7Y291bnR5CitIVTtIVS1IQjtIYWpkdS1CaWhhcjswOzA7Y291bnR5CitIVTtIVS1IRTtIZXZlczswOzA7Y291bnR5CitIVTtIVS1KTjtKYXN6LU5hZ3lrdW4tU3pvbG5vazswOzA7Y291bnR5CitIVTtIVS1LRTtLb21hcm9tLUVzenRlcmdvbTswOzA7Y291bnR5CitIVTtIVS1OTztOb2dyYWQ7MDswO2NvdW50eQorSFU7SFUtUEU7UGVzdDswOzA7Y291bnR5CitIVTtIVS1TTztTb21vZ3k7MDswO2NvdW50eQorSFU7SFUtU1o7U3phYm9sY3MtU3phdG1hci1CZXJlZzswOzA7Y291bnR5CitIVTtIVS1UTztUb2xuYTswOzA7Y291bnR5CitIVTtIVS1WQTtWYXM7MDswO2NvdW50eQorSFU7SFUtVkU7VmVzenByZW07MDswO2NvdW50eQorSFU7SFUtWkE7WmFsYTswOzA7Y291bnR5CitIVTtIVS1CQztCZWtlc2NzYWJhOzA7MDswO2NpdHkgb2YgY291bnR5IHJpZ2h0CitIVTtIVS1ERTtEZWJyZWNlbjswOzA7MDtjaXR5IG9mIGNvdW50eSByaWdodAorSFU7SFUtRFU7RHVuYXVqdmFyb3M7MDswOzA7Y2l0eSBvZiBjb3VudHkgcmlnaHQKK0hVO0hVLUVHO0VnZXI7MDswOzA7Y2l0eSBvZiBjb3VudHkgcmlnaHQKK0hVO0hVLUdZO0d5cjswOzA7MDtjaXR5IG9mIGNvdW50eSByaWdodAorSFU7SFUtSFY7SG9kbWV6dmFzYXJoZWx5OzA7MDswO2NpdHkgb2YgY291bnR5IHJpZ2h0CitIVTtIVS1LVjtLYXBvc3ZhcjswOzA7MDtjaXR5IG9mIGNvdW50eSByaWdodAorSFU7SFUtS007S2Vjc2tlbWV0OzA7MDswO2NpdHkgb2YgY291bnR5IHJpZ2h0CitIVTtIVS1NSTtNaXNrb2xjOzA7MDswO2NpdHkgb2YgY291bnR5IHJpZ2h0CitIVTtIVS1OSztOYWd5a2FuaXpzYTswOzA7MDtjaXR5IG9mIGNvdW50eSByaWdodAorSFU7SFUtTlk7TnlpcmVneWhhemE7MDswOzA7Y2l0eSBvZiBjb3VudHkgcmlnaHQKK0hVO0hVLVBTO1BlY3M7MDswOzA7Y2l0eSBvZiBjb3VudHkgcmlnaHQKK0hVO0hVLVNUO1NhbGdvdGFyamFuOzA7MDswO2NpdHkgb2YgY291bnR5IHJpZ2h0CitIVTtIVS1TTjtTb3Byb247MDswOzA7Y2l0eSBvZiBjb3VudHkgcmlnaHQKK0hVO0hVLVNEO1N6ZWdlZDswOzA7MDtjaXR5IG9mIGNvdW50eSByaWdodAorSFU7SFUtU0Y7U3pla2VzZmVoZXJ2YXI7MDswOzA7Y2l0eSBvZiBjb3VudHkgcmlnaHQKK0hVO0hVLVNTO1N6ZWtzemFyZDswOzA7MDtjaXR5IG9mIGNvdW50eSByaWdodAorSFU7SFUtU0s7U3pvbG5vazswOzA7MDtjaXR5IG9mIGNvdW50eSByaWdodAorSFU7SFUtU0g7U3pvbWJhdGhlbHk7MDswOzA7Y2l0eSBvZiBjb3VudHkgcmlnaHQKK0hVO0hVLVRCO1RhdGFiYW55YTswOzA7MDtjaXR5IG9mIGNvdW50eSByaWdodAorSFU7SFUtVk07VmVzenByZW07MDswOzA7Y2l0eSBvZiBjb3VudHkgcmlnaHQKK0hVO0hVLVpFO1phbGFlZ2Vyc3plZzswOzA7MDtjaXR5IG9mIGNvdW50eSByaWdodAorSUQ7SUQtQkE7QmFsaTswOzA7TlU7cHJvdmluY2UKK0lEO0lELUJCO0JhbmdrYSBCZWxpdHVuZzswOzA7U007cHJvdmluY2UKK0lEO0lELUJUO0JhbnRlbjswOzA7Slc7cHJvdmluY2UKK0lEO0lELUJFO0JlbmdrdWx1OzA7MDtTTTtwcm92aW5jZQorSUQ7SUQtR087R29yb250YWxvOzA7MDtTTDtwcm92aW5jZQorSUQ7SUQtSkE7SmFtYmk7MDswO1NNO3Byb3ZpbmNlCitJRDtJRC1KQjtKYXdhIEJhcmF0OzA7MDtKVztwcm92aW5jZQorSUQ7SUQtSlQ7SmF3YSBUZW5nYWg7MDswO0pXO3Byb3ZpbmNlCitJRDtJRC1KSTtKYXdhIFRpbXVyOzA7MDtKVztwcm92aW5jZQorSUQ7SUQtS0I7S2FsaW1hbnRhbiBCYXJhdDswOzA7S0E7cHJvdmluY2UKK0lEO0lELUtTO0thbGltYW50YW4gU2VsYXRhbjswOzA7S0E7cHJvdmluY2UKK0lEO0lELUtUO0thbGltYW50YW4gVGVuZ2FoOzA7MDtLQTtwcm92aW5jZQorSUQ7SUQtS0k7S2FsaW1hbnRhbiBUaW11cjswOzA7S0E7cHJvdmluY2UKK0lEO0lELUxBO0xhbXB1bmc7MDswO1NNO3Byb3ZpbmNlCitJRDtJRC1NQTtNYWx1a3U7MDswO01BO3Byb3ZpbmNlCitJRDtJRC1NVTtNYWx1a3UgVXRhcmE7MDswO01BO3Byb3ZpbmNlCitJRDtJRC1OQjtOdXNhIFRlbmdnYXJhIEJhcmF0OzA7MDtOVTtwcm92aW5jZQorSUQ7SUQtTlQ7TnVzYSBUZW5nZ2FyYSBUaW11cjswOzA7TlU7cHJvdmluY2UKK0lEO0lELVBBO1BhcHVhOzA7MDtJSjtwcm92aW5jZQorSUQ7SUQtUkk7UmlhdTswOzA7U007cHJvdmluY2UKK0lEO0lELVNOO1N1bGF3ZXNpIFNlbGF0YW47MDswO1NMO3Byb3ZpbmNlCitJRDtJRC1TVDtTdWxhd2VzaSBUZW5nYWg7MDswO1NMO3Byb3ZpbmNlCitJRDtJRC1TRztTdWxhd2VzaSBUZW5nZ2FyYTswOzA7U0w7cHJvdmluY2UKK0lEO0lELVNBO1N1bGF3ZXNpIFV0YXJhOzA7MDtTTDtwcm92aW5jZQorSUQ7SUQtU0I7U3VtYXRlcmEgQmFyYXQ7MDswO1NNO3Byb3ZpbmNlCitJRDtJRC1TUztTdW1hdGVyYSBTZWxhdGFuOzA7MDtTTTtwcm92aW5jZQorSUQ7SUQtU1U7U3VtYXRlcmEgVXRhcmE7MDswO1NNO3Byb3ZpbmNlCitJRDtJRC1KSztKYWthcnRhIFJheWE7MDswO0pXO3NwZWNpYWwgZGlzdHJpY3QKK0lEO0lELUFDO0FjZWg7MDswO1NNO2F1dG9ub21vdXMgcHJvdmluY2UKK0lEO0lELVlPO1lvZ3lha2FydGE7MDswO0pXO3NwZWNpYWwgcmVnaW9uCitJRTtJRS1DVztDYXJsb3c7Q2VhdGhhcmxhY2g7MDtMCitJRTtJRS1DTjtDYXZhbjtBbiBDYWJoYW47MDtVCitJRTtJRS1DRTtDbGFyZTtBbiBDbGFyOzA7TQorSUU7SUUtQztDb3JrO0NvcmNhaWdoOzA7TQorSUU7SUUtREw7RG9uZWdhbDtEdW4gbmEgbkdhbGw7MDtVCitJRTtJRS1EO0R1YmxpbjtCYWlsZSBhdGhhIENsaWF0aDswO0wKK0lFO0lFLUc7R2Fsd2F5O0dhaWxsaW1oOzA7QworSUU7SUUtS1k7S2Vycnk7Q2lhcnJhaTswO00KK0lFO0lFLUtFO0tpbGRhcmU7Q2lsbCBEYXJhOzA7TAorSUU7SUUtS0s7S2lsa2Vubnk7Q2lsbCBDaGFpbm5pZ2g7MDtMCitJRTtJRS1MUztMYW9pcztMYW9pczswO0wKK0lFO0lFLUxNO0xlaXRyaW07TGlhdHJvaW07MDtDCitJRTtJRS1MSztMaW1lcmljaztMdWltbmVhY2g7MDtNCitJRTtJRS1MRDtMb25nZm9yZDtBbiBMb25nZm9ydDswO0wKK0lFO0lFLUxIO0xvdXRoO0x1OzA7TAorSUU7SUUtTU87TWF5bztNYWlnaCBFbzswO0MKK0lFO0lFLU1IO01lYXRoO0FuIE1oaTswO0wKK0lFO0lFLU1OO01vbmFnaGFuO011aW5lYWNoYW47MDtVCitJRTtJRS1PWTtPZmZhbHk7VWliaCBGaGFpbGk7MDtMCitJRTtJRS1STjtSb3Njb21tb247Um9zIENvbWFpbjswO0MKK0lFO0lFLVNPO1NsaWdvO1NsaWdlYWNoOzA7QworSUU7SUUtVEE7VGlwcGVyYXJ5O1Rpb2JyYWlkIGFyYW5uOzA7TQorSUU7SUUtV0Q7V2F0ZXJmb3JkO1BvcnQgTGFpcmdlOzA7TQorSUU7SUUtV0g7V2VzdG1lYXRoO0FuIElhcm1oaTswO0wKK0lFO0lFLVdYO1dleGZvcmQ7TG9jaCBHYXJtYW47MDtMCitJRTtJRS1XVztXaWNrbG93O0NpbGwgTWhhbnRhaW47MDtMCitJTDtJTC1EO0hhRGFyb207RWwgSmFjb2I7MDswCitJTDtJTC1NO0hhTWVya2F6O0VsIEF3c2E7MDswCitJTDtJTC1aO0hhIFphZm9uO0VzaCBTaGFtYWxpOzA7MAorSUw7SUwtSEE7SGFpZmE7P2VpZj87MDswCitJTDtJTC1UQTtUZWwtQXZpdjtUZWxsIEFiP2I7MDswCitJTDtJTC1KTTtZZXJ1c2hhbGF5aW07QWwgUXVkczswOzAKK0lOO0lOLUFQO0FuZGhyYSBQcmFkZXNoOzA7MDswc3RhdGUKK0lOO0lOLUFSO0FydW5hY2hhbCBQcmFkZXNoOzA7MDswc3RhdGUKK0lOO0lOLUFTO0Fzc2FtOzA7MDswc3RhdGUKK0lOO0lOLUJSO0JpaGFyOzA7MDswc3RhdGUKK0lOO0lOLUNUO0NoaGF0dGFzZ2FyaDswOzA7MHN0YXRlCitJTjtJTi1HQTtHb2E7MDswOzBzdGF0ZQorSU47SU4tR0o7R3VqYXJhdDswOzA7MHN0YXRlCitJTjtJTi1IUjtIYXJ5YW5hOzA7MDswc3RhdGUKK0lOO0lOLUhQO0hpbWFjaGFsIFByYWRlc2g7MDswOzBzdGF0ZQorSU47SU4tSks7SmFtbXUgYW5kIEthc2htaXI7MDswOzBzdGF0ZQorSU47SU4tSkg7SmhhcmtoYW5kOzA7MDswc3RhdGUKK0lOO0lOLUtBO0thcm5hdGFrYTswOzA7MHN0YXRlCitJTjtJTi1LTDtLZXJhbGE7MDswOzBzdGF0ZQorSU47SU4tTVA7TWFkaHlhIFByYWRlc2g7MDswOzBzdGF0ZQorSU47SU4tTUg7TWFoYXJhc2h0cmE7MDswOzBzdGF0ZQorSU47SU4tTU47TWFuaXB1cjswOzA7MHN0YXRlCitJTjtJTi1NTDtNZWdoYWxheWE7MDswOzBzdGF0ZQorSU47SU4tTVo7TWl6b3JhbTswOzA7MHN0YXRlCitJTjtJTi1OTDtOYWdhbGFuZDswOzA7MHN0YXRlCitJTjtJTi1PUjtPcmlzc2E7MDswOzBzdGF0ZQorSU47SU4tUEI7UHVuamFiOzA7MDswc3RhdGUKK0lOO0lOLVJKO1JhamFzdGhhbjswOzA7MHN0YXRlCitJTjtJTi1TSztTaWtraW07MDswOzBzdGF0ZQorSU47SU4tVE47VGFtaWwgTmFkdTswOzA7MHN0YXRlCitJTjtJTi1UUjtUcmlwdXJhOzA7MDswc3RhdGUKK0lOO0lOLVVMO1V0dGFyYW5jaGFsOzA7MDswc3RhdGUKK0lOO0lOLVVQO1V0dGFyIFByYWRlc2g7MDswOzBzdGF0ZQorSU47SU4tV0I7V2VzdCBCZW5nYWw7MDswOzBzdGF0ZQorSU47SU4tQU47QW5kYW1hbiBhbmQgTmljb2JhciBJc2xhbmRzOzA7MDswdW5pb24gdGVycml0b3J5CitJTjtJTi1DSDtDaGFuZGlnYXJoOzA7MDswdW5pb24gdGVycml0b3J5CitJTjtJTi1ETjtEYWRyYSBhbmQgTmFnYXIgSGF2ZWxpOzA7MDswdW5pb24gdGVycml0b3J5CitJTjtJTi1ERDtEYW1hbiBhbmQgRGl1OzA7MDswdW5pb24gdGVycml0b3J5CitJTjtJTi1ETDtEZWxoaTswOzA7MHVuaW9uIHRlcnJpdG9yeQorSU47SU4tTEQ7TGFrc2hhZHdlZXA7MDswOzB1bmlvbiB0ZXJyaXRvcnkKK0lOO0lOLVBZO1BvbmRpY2hlcnJ5OzA7MDswdW5pb24gdGVycml0b3J5CitJUTtJUS1BTjtBbCBBbmJyOzA7MDswCitJUTtJUS1CQTtBbCBCYXJhaDswOzA7MAorSVE7SVEtTVU7QWwgTXV0aGFubmE7MDswOzAKK0lRO0lRLVFBO0FsIFFkaXN5YWg7MDswOzAKK0lRO0lRLU5BO0FuIE5hamFmOzA7MDswCitJUTtJUS1BUjtBcmJsOzA7MDswCitJUTtJUS1TVTtBcyBTdWxheW1ueWFoOzA7MDswCitJUTtJUS1UUztBdCBUYW1tOzA7MDswCitJUTtJUS1CQjtCYmlsOzA7MDswCitJUTtJUS1CRztCYWdoZGQ7MDswOzAKK0lRO0lRLURBO0RhaGs7MDswOzAKK0lRO0lRLURRO0RoIFFyOzA7MDswCitJUTtJUS1ESTtEaXlsYTswOzA7MAorSVE7SVEtS0E7S2FyYmFsOzA7MDswCitJUTtJUS1NQTtNYXlzbjswOzA7MAorSVE7SVEtTkk7Tm5hd2E7MDswOzAKK0lRO0lRLVNEO2FsIGFkIERuOzA7MDswCitJUTtJUS1XQTtXc2k7MDswOzAKK0lSO0lSLTAzO0FyZGFibDswOzA7MAorSVI7SVItMDI7emFyYnlqbi1lIEdoYXJiOzA7MDswCitJUjtJUi0wO3phcmJ5am4tZSBTaGFycTswOzA7MAorSVI7SVItMDY7QnNoZWhyOzA7MDswCitJUjtJUi0wODtDaGFociBNYWhsbCB2YSBCYWtodHI7MDswOzAKK0lSO0lSLTA0O0VmYWhuOzA7MDswCitJUjtJUi00O0ZyczswOzA7MAorSVI7SVItOTtHbG47MDswOzAKK0lSO0lSLTI3O0dvbGVzdG47MDswOzAKK0lSO0lSLTI0O0hhbWFkbjswOzA7MAorSVI7SVItMjM7SG9ybW96Z247MDswOzAKK0lSO0lSLTA1O2xtOzA7MDswCitJUjtJUi01O0tlcm1uOzA7MDswCitJUjtJUi03O0tlcm1uc2hoOzA7MDswCitJUjtJUi0wOTtLaG9yc247MDswOzAKK0lSO0lSLTEwO0toemVzdG47MDswOzAKK0lSO0lSLTg7S29oa2x5ZWggdmEgQnllciBBaG1hZDswOzA7MAorSVI7SVItNjtLb3JkZXN0bjswOzA7MAorR1E7R1EtQztSZWdpb24gQ29udGluZW50YWw7MDswO3JlZ2lvbgorR1E7R1EtSTtSZWdpb24gSW5zdWxhcjswOzA7cmVnaW9uCitHUTtHUS1BTjtBbm5vYm9uOzA7MDtJO3Byb3ZpbmNlCitHUTtHUS1CTjtCaW9rbyBOb3J0ZTswOzA7STtwcm92aW5jZQorR1E7R1EtQlM7Qmlva28gU3VyOzA7MDtJO3Byb3ZpbmNlCitHUTtHUS1DUztDZW50cm8gU3VyOzA7MDtDO3Byb3ZpbmNlCitHUTtHUS1LTjtLaWUtTnRlbTswOzA7Qztwcm92aW5jZQorR1E7R1EtTEk7TGl0b3JhbDswOzA7Qztwcm92aW5jZQorR1E7R1EtV047V2VsZS1OemFzOzA7MDtDO3Byb3ZpbmNlCitHUjtHUi0zO0FjaGFpYTswOzA7VklJO2RlcGFydG1lbnQKK0dSO0dSLTA7QWl0b2xpYS1Ba2FybmFuaWE7MDswO1ZJSTtkZXBhcnRtZW50CitHUjtHUi07QXJnb2xpczswOzA7WDtkZXBhcnRtZW50CitHUjtHUi0yO0Fya2FkaWE7MDswO1g7ZGVwYXJ0bWVudAorR1I7R1ItMztBcnRhOzA7MDtJVjtkZXBhcnRtZW50CitHUjtHUi1BO0F0dGlraTswOzA7SVg7ZGVwYXJ0bWVudAorR1I7R1ItNjQ7Q2hhbGtpZGlraTswOzA7SUk7ZGVwYXJ0bWVudAorR1I7R1ItOTQ7Q2hhbmlhOzA7MDtYSUlJO2RlcGFydG1lbnQKK0dSO0dSLTg1O0NoaW9zOzA7MDtYSTtkZXBhcnRtZW50CitHUjtHUi04O0RvZGVrYW5pc29zOzA7MDtYSUk7ZGVwYXJ0bWVudAorR1I7R1ItNTI7RHJhbWE7MDswO0k7ZGVwYXJ0bWVudAorR1I7R1ItNztFdnJvczswOzA7STtkZXBhcnRtZW50CitHUjtHUi0wNTtFdnJ5dGFuaWE7MDswO1ZJSUk7ZGVwYXJ0bWVudAorR1I7R1ItMDQ7RXZ2b2lhOzA7MDtWSUlJO2RlcGFydG1lbnQKK0dSO0dSLTYzO0Zsb3JpbmE7MDswO0lJSTtkZXBhcnRtZW50CitHUjtHUi0wNztGb2tpczswOzA7VklJSTtkZXBhcnRtZW50CitHUjtHUi0wNjtGdGhpb3RpczswOzA7VklJSTtkZXBhcnRtZW50CitHUjtHUi01O0dyZXZlbmE7MDswO0lJSTtkZXBhcnRtZW50CitHUjtHUi00O0lsZWlhOzA7MDtWSUk7ZGVwYXJ0bWVudAorR1I7R1ItNTM7SW1hdGhpYTswOzA7SUk7ZGVwYXJ0bWVudAorR1I7R1ItMzM7SW9hbm5pbmE7MDswO0lWO2RlcGFydG1lbnQKK0dSO0dSLTk7SXJha2xlaW9uOzA7MDtYSUlJO2RlcGFydG1lbnQKK0dSO0dSLTQ7S2FyZGl0c2E7MDswO1Y7ZGVwYXJ0bWVudAorR1I7R1ItNTY7S2FzdG9yaWE7MDswO0lJSTtkZXBhcnRtZW50CitHUjtHUi01NTtLYXZhbGxhOzA7MDtJO2RlcGFydG1lbnQKK0dSO0dSLTIzO0tlZmFsbGluaWE7MDswO1ZJO2RlcGFydG1lbnQKK0dSO0dSLTIyO0tlcmt5cmE7MDswO1ZJO2RlcGFydG1lbnQKK0dSO0dSLTU3O0tpbGtpczswOzA7SUk7ZGVwYXJ0bWVudAorR1I7R1ItNTtLb3JpbnRoaWE7MDswO1g7ZGVwYXJ0bWVudAorR1I7R1ItNTg7S296YW5pOzA7MDtJSUk7ZGVwYXJ0bWVudAorR1I7R1ItODI7S3lrbGFkZXM7MDswO1hJSTtkZXBhcnRtZW50CitHUjtHUi02O0xha29uaWE7MDswO1g7ZGVwYXJ0bWVudAorR1I7R1ItNDI7TGFyaXNhOzA7MDtWO2RlcGFydG1lbnQKK0dSO0dSLTkyO0xhc2l0aGlvbjswOzA7WElJSTtkZXBhcnRtZW50CitHUjtHUi0yNDtMZWZrYXM7MDswO1ZJO2RlcGFydG1lbnQKK0dSO0dSLTgzO0xlc3ZvczswOzA7WEk7ZGVwYXJ0bWVudAorR1I7R1ItNDM7TWFnbmlzaWE7MDswO1Y7ZGVwYXJ0bWVudAorR1I7R1ItNztNZXNzaW5pYTswOzA7WDtkZXBhcnRtZW50CitHUjtHUi01OTtQZWxsYTswOzA7SUk7ZGVwYXJ0bWVudAorR1I7R1ItNjtQaWVyaWE7MDswO0lJO2RlcGFydG1lbnQKK0dSO0dSLTM0O1ByZXZlemE7MDswO0lWO2RlcGFydG1lbnQKK0dSO0dSLTkzO1JldGh5bW5vbjswOzA7WElJSTtkZXBhcnRtZW50CitHUjtHUi03MztSb2RvcGk7MDswO0k7ZGVwYXJ0bWVudAorR1I7R1ItODQ7U2Ftb3M7MDswO1hJO2RlcGFydG1lbnQKK0dSO0dSLTYyO1NlcnJhaTswOzA7SUk7ZGVwYXJ0bWVudAorR1I7R1ItMzI7VGhlc3Byb3RpYTswOzA7SVY7ZGVwYXJ0bWVudAorR1I7R1ItNTQ7VGhlc3NhbG9uaWtpOzA7MDtJSTtkZXBhcnRtZW50CitHUjtHUi00NDtUcmlrYWxhOzA7MDtWO2RlcGFydG1lbnQKK0dSO0dSLTAzO1ZvaW90aWE7MDswO1ZJSUk7ZGVwYXJ0bWVudAorR1I7R1ItNzI7WGFudGhpOzA7MDtJO2RlcGFydG1lbnQKK0dSO0dSLTI7WmFreW50aG9zOzA7MDtWSTtkZXBhcnRtZW50CitHUjtHUi02OTtBZ2lvIE9yb3M7MDswOzBzZWxmLWdvdmVybmVkIHBhcnQKK0lSO0lSLTIwO0xvcmVzdG47MDswOzAKK0lSO0lSLTIyO01hcmthejswOzA7MAorSVI7SVItMjtNemFuZGFybjswOzA7MAorSVI7SVItMjg7UWF6dm47MDswOzAKK0lSO0lSLTI2O1FvbTswOzA7MAorSVI7SVItMjtTZW1ubjswOzA7MAorSVI7SVItMztTc3RuIHZhIEJhbGNoZXN0bjswOzA7MAorSVI7SVItMDc7VGVocm47MDswOzAKK0lSO0lSLTI1O1lhemQ7MDswOzAKK0lSO0lSLTExO1phbmpuOzA7MDswCitJUztJUy03O0F1c3R1cmxhbmQ7MDswOzAKK0lTO0lTLTtIb2Z1b2JvcmdhcnN2YW9pIHV0YW4gUmV5a2phdmlrdXI7MDswOzAKK0lTO0lTLTY7Tm9yb3VybGFuZCBleXN0cmE7MDswOzAKK0lTO0lTLTU7Tm9yb3VybGFuZCB2ZXN0cmE7MDswOzAKK0lTO0lTLTA7UmV5a2phdmlrOzA7MDswCitJUztJUy04O1N1b3VybGFuZDswOzA7MAorSVM7SVMtMjtTdW91cm5lczswOzA7MAorSVM7SVMtNDtWZXN0Zmlyb2lyOzA7MDswCitJUztJUy0zO1Zlc3R1cmxhbmQ7MDswOzAKK0lUO0lULUFHO0FncmlnZW50bzswOzA7ODIKK0lUO0lULUFMO0FsZXNzYW5kcmlhOzA7MDsyCitJVDtJVC1BTjtBbmNvbmE7MDswOzU3CitJVDtJVC1BTztBb3N0YTtBb3N0ZTswOzIzCitJVDtJVC1BUjtBcmV6em87MDswOzUyCitJVDtJVC1BUDtBc2NvbGkgUGljZW5vOzA7MDs1NworSVQ7SVQtQVQ7QXN0aTswOzA7MgorSVQ7SVQtQVY7QXZlbGxpbm87MDswOzcyCitJVDtJVC1CQTtCYXJpOzA7MDs3NQorSVQ7SVQtQkw7QmVsbHVubzswOzA7MzQKK0lUO0lULUJOO0JlbmV2ZW50bzswOzA7NzIKK0lUO0lULUJHO0JlcmdhbW87MDswOzI1CitJVDtJVC1CSTtCaWVsbGE7MDswOzIKK0lUO0lULUJPO0JvbG9nbmE7MDswOzQ1CitJVDtJVC1CWjtCb2x6YW5vO0JvemVuIDswOzMyCitJVDtJVC1CUztCcmVzY2lhOzA7MDsyNQorSVQ7SVQtQlI7QnJpbmRpc2k7MDswOzc1CitJVDtJVC1DQTtDYWdsaWFyaTswOzA7ODgKK0lUO0lULUNMO0NhbHRhbmlzc2V0dGE7MDswOzgyCitJVDtJVC1DQjtDYW1wb2Jhc3NvOzA7MDs2NworSVQ7SVQtQ0U7Q2FzZXJ0YTswOzA7NzIKK0lUO0lULUNUO0NhdGFuaWE7MDswOzgyCitJVDtJVC1DWjtDYXRhbnphcm87MDswOzc4CitJVDtJVC1DSDtDaGlldGk7MDswOzY1CitJVDtJVC1DTztDb21vOzA7MDsyNQorSVQ7SVQtQ1M7Q29zZW56YTswOzA7NzgKK0lUO0lULUNSO0NyZW1vbmE7MDswOzI1CitJVDtJVC1LUjtDcm90b25lOzA7MDs3OAorSVQ7SVQtQ047Q3VuZW87MDswOzIKK0lUO0lULUVOO0VubmE7MDswOzgyCitJVDtJVC1GRTtGZXJyYXJhOzA7MDs0NQorSVQ7SVQtRkk7RmlyZW56ZTswOzA7NTI7CitJVDtJVC1GRztGb2dnaWE7MDswOzc1OworSVQ7SVQtRk87Rm9ybOw7MDswOzQ1OworSVQ7SVQtRlI7RnJvc2lub25lIDswOzA7NjI7CitJVDtJVC1HRTtHZW5vdmE7MDswOzQyOworSVQ7SVQtR087R29yaXppYTswOzA7MzY7CitJVDtJVC1HUjtHcm9zc2V0bzswOzA7NTI7CitJVDtJVC1JTTtJbXBlcmlhOzA7MDs0MjsKK0lUO0lULUlTO0lzZXJuaWE7MDswOzY3OworSVQ7SVQtQVE7TEFxdWlsYTswOzA7NjU7CitJVDtJVC1TUDtMYSBTcGV6aWE7MDswOzQyOworSVQ7SVQtTFQ7TGF0aW5hOzA7MDs2MjsKK0lUO0lULUxFO0xlY2NlOzA7MDs3NTsKK0lUO0lULUxDO0xlY2NvOzA7MDsyNTsKK0lUO0lULUxJO0xpdm9ybm87MDswOzUyOworSVQ7SVQtTE87TG9kaTswOzA7MjU7CitJVDtJVC1MVTtMdWNjYTswOzA7NTI7CitJVDtJVC1NQztNYWNlcmF0YTswOzA7NTc7CitJVDtJVC1NTjtNYW50b3ZhOzA7MDsyNTsKK0lUO0lULU1TO01hc3NhLUNhcnJhcmE7MDswOzUyOworSVQ7SVQtTVQ7TWF0ZXJhOzA7MDs3NzsKK0lUO0lULU1FO01lc3NpbmE7MDswOzgyOworSVQ7SVQtTUk7TWlsYW5vOzA7MDsyNTsKK0lUO0lULU1PO01vZGVuYTswOzA7NDU7CitJVDtJVC1OQTtOYXBvbGk7MDswOzcyOworSVQ7SVQtTk87Tm92YXJhOzA7MDsyOworSVQ7SVQtTlU7TnVvcm87MDswOzg4OworSVQ7SVQtT1I7T3Jpc3Rhbm87MDswOzg4OworSVQ7SVQtUEQ7UGFkb3ZhOzA7MDszNDsKK0lUO0lULVBBO1BhbGVybW87MDswOzgyOworSVQ7SVQtUFI7UGFybWE7MDswOzQ1OworSVQ7SVQtUFY7UGF2aWE7MDswOzI1OworSVQ7SVQtUEc7UGVydWdpYTswOzA7NTU7CitJVDtJVC1QUztQZXNhcm8gZSBVcmJpbm87MDswOzU3OworSVQ7SVQtUEU7UGVzY2FyYTswOzA7NjU7CitJVDtJVC1QQztQaWFjZW56YTswOzA7NDU7CitJVDtJVC1QSTtQaXNhOzA7MDs1MjsKK0lUO0lULVBUO1Bpc3RvaWE7MDswOzUyOworSVQ7SVQtUE47UG9yZGVub25lOzA7MDszNjsKK0lUO0lULVBaO1BvdGVuemE7MDswOzc3OworSVQ7SVQtUE87UHJhdG87MDswOzUyOworSVQ7SVQtUkc7UmFndXNhOzA7MDs4MjsKK0lUO0lULVJBO1JhdmVubmE7MDswOzQ1OworSVQ7SVQtUkM7UmVnZ2lvIENhbGFicmlhOzA7MDs3ODsKK0lUO0lULVJFO1JlZ2dpbyBFbWlsaWE7MDswOzQ1OworSVQ7SVQtUkk7UmlldGk7MDswOzYyOworSVQ7SVQtUk47UmltaW5pOzA7MDs0NTsKK0lUO0lULVJNO1JvbWE7MDswOzYyOworSVQ7SVQtUk87Um92aWdvOzA7MDszNDsKK0lUO0lULVNBO1NhbGVybm87MDswOzcyOworSVQ7SVQtU1M7U2Fzc2FyaTswOzA7ODg7CitJVDtJVC1TVjtTYXZvbmE7MDswOzQyOworSVQ7SVQtU0k7U2llbmE7MDswOzUyOworSVQ7SVQtU1I7U2lyYWN1c2E7MDswOzgyOworSVQ7SVQtU087U29uZHJpbzswOzA7MjU7CitJVDtJVC1UQTtUYXJhbnRvOzA7MDs3NTsKK0lUO0lULVRFO1RlcmFtbzswOzA7NjU7CitJVDtJVC1UUjtUZXJuaTswOzA7NTU7CitJVDtJVC1UTztUb3Jpbm87MDswOzI7CitJVDtJVC1UUDtUcmFwYW5pOzA7MDs4MjsKK0lUO0lULVROO1RyZW50bzswOzA7MzI7CitJVDtJVC1UVjtUcmV2aXNvOzA7MDszNDsKK0lUO0lULVRTO1RyaWVzdGU7MDswOzM2OworSVQ7SVQtVUQ7VWRpbmU7MDswOzM2OworSVQ7SVQtVkE7VmFyZXNlOzA7MDsyNTsKK0lUO0lULVZFO1ZlbmV6aWE7MDswOzM0OworSVQ7SVQtVkI7VmVyYmFuby1DdXNpby1Pc3NvbGE7MDswOzI7CitJVDtJVC1WQztWZXJjZWxsaTswOzA7MjsKK0lUO0lULVZSO1Zlcm9uYTswOzA7MzQ7CitJVDtJVC1WVjtWaWJvIFZhbGVudGlhOzA7MDs3ODsKK0lUO0lULVZJO1ZpY2VuemE7MDswOzM0OworSVQ7SVQtVlQ7Vml0ZXJibzswOzA7NjI7CitKTTtKTS0zO0NsYXJlbmRvbjswOzA7MAorSk07Sk0tMDk7SGFub3ZlcjswOzA7MAorSk07Sk0tMDtLaW5nc3RvbjswOzA7MAorSk07Sk0tMjtNYW5jaGVzdGVyOzA7MDswCitKTTtKTS0wNDtQb3J0bGFuZDswOzA7MAorSk07Sk0tMDI7U2FpbnQgQW5kcmV3OzA7MDswCitKTTtKTS0wNjtTYWludCBBbm47MDswOzAKK0pNO0pNLTQ7U2FpbnQgQ2F0aGVyaW5lOzA7MDswCitKTTtKTS07U2FpbnQgRWxpemFiZXRoOzA7MDswCitKTTtKTS0wODtTYWludCBKYW1lczswOzA7MAorSk07Sk0tMDU7U2FpbnQgTWFyeTswOzA7MAorSk07Sk0tMDM7U2FpbnQgVGhvbWFzOzA7MDswCitKTTtKTS0wNztUcmVsYXdueTswOzA7MAorSk07Sk0tMDtXZXN0bW9yZWxhbmQ7MDswOzAKK0pPO0pPLUFKO2psbjswOzA7MAorSk87Sk8tQVE7QWwgcWFiYTswOzA7MAorSk87Sk8tQkE7QWwgQmFscTswOzA7MAorSk87Sk8tS0E7QWwgS2FyYWs7MDswOzAKK0pPO0pPLU1BO0FsIE1hZnJhcTswOzA7MAorSk87Sk8tQU07bW1uOzA7MDswCitKTztKTy1BVDtBIGFmbGFoOzA7MDswCitKTztKTy1BWjtBeiBaYXJxOzA7MDswCitKTztKTy1JUjtJcmJpZDswOzA7MAorSk87Sk8tSkE7SmFyYXNoOzA7MDswCitKTztKTy1NTjtNYW47MDswOzAKK0pPO0pPLU1EO01kYWJhOzA7MDswCitKUDtKUC0yMztBaXRpIFtBaWNoaV07MDswOzAKK0pQO0pQLTA1O0FraXRhOzA7MDswCitKUDtKUC0wMjtBb21vcmk7MDswOzAKK0pQO0pQLTM4O0VoaW1lOzA7MDswCitKUDtKUC0yO0dpaHUgW0dpZnVdOzA7MDswCitKUDtKUC01MTtHdW5tYTswOzA7MAorSlA7SlAtMzQ7SGlyb3NpbWEgW0hpcm9zaGltYV07MDswOzAKK0pQO0pQLTA7SG9ra2FpZG8gW0hva2thaWRvXTswOzA7MAorSlA7SlAtODtIdWt1aSBbRnVrdWldOzA7MDswCitKUDtKUC00MDtIdWt1b2thIFtGdWt1b2thXTswOzA7MAorSlA7SlAtMDc7SHVrdXNpbWEgW0Z1a3VzaGltYV07MDswOzAKK0pQO0pQLTI4O0h5b2dvIFtIeW9nb107MDswOzAKK0pQO0pQLTA4O0liYXJha2k7MDswOzAKK0pQO0pQLTc7SXNpa2F3YSBbSXNoaWthd2FdOzA7MDswCitKUDtKUC0wMztJd2F0ZTswOzA7MAorSlA7SlAtMzc7S2FnYXdhOzA7MDswCitKUDtKUC00NjtLYWdvc2ltYSBbS2Fnb3NoaW1hXTswOzA7MAorSlA7SlAtNDtLYW5hZ2F3YTswOzA7MAorSlA7SlAtMzk7S290aSBbS29jaGldOzA7MDswCitKUDtKUC00MztLdW1hbW90bzswOzA7MAorSlA7SlAtMjY7S3lvdG8gW0t5b3RvXTswOzA7MAorSlA7SlAtMjQ7TWllOzA7MDswCitKUDtKUC0wNDtNaXlhZ2k7MDswOzAKK0pQO0pQLTQ1O01peWF6YWtpOzA7MDswCitKUDtKUC0yMDtOYWdhbm87MDswOzAKK0pQO0pQLTQyO05hZ2FzYWtpOzA7MDswCitKUDtKUC0yOTtOYXJhOzA7MDswCitKUDtKUC01O05paWdhdGE7MDswOzAKK0pQO0pQLTQ0O2l0YSBbT2l0YV07MDswOzAKK0pQO0pQLTMzO09rYXlhbWE7MDswOzAKK0pQO0pQLTQ3O09raW5hd2E7MDswOzAKK0pQO0pQLTI3O3Nha2EgW09zYWthXTswOzA7MAorSlA7SlAtNDtTYWdhOzA7MDswCitKUDtKUC01MDtTYWl0YW1hOzA7MDswCitKUDtKUC0yNTtTaWdhIFtTaGlnYV07MDswOzAKK0pQO0pQLTMyO1NpbWFuZSBbU2hpbWFuZV07MDswOzAKK0pQO0pQLTIyO1NpenVva2EgW1NoaXp1b2thXTswOzA7MAorSlA7SlAtNTI7VGliYSBbQ2hpYmFdOzA7MDswCitKUDtKUC0wOTtUb3RpZ2kgW1RvY2hpZ2ldOzA7MDswCitKUDtKUC0zNjtUb2t1c2ltYSBbVG9rdXNoaW1hXTswOzA7MAorSlA7SlAtNTM7VG9reW8gW1Rva3lvXTswOzA7MAorSlA7SlAtMztUb3R0b3JpOzA7MDswCitKUDtKUC02O1RveWFtYTswOzA7MAorSlA7SlAtMzA7V2FrYXlhbWE7MDswOzAKK0pQO0pQLTA2O1lhbWFnYXRhOzA7MDswCitKUDtKUC0zNTtZYW1hZ3V0aSBbWWFtYWd1Y2hpXTswOzA7MAorSlA7SlAtOTtZYW1hbmFzaSBbWWFtYW5hc2hpXTswOzA7MAorI0tFO0tFLTA7IE5haXJvYmkgW05haXJvYmkgTXVuaWNpcGFsaXR5XTswOzA7MG11bmljaXBhbGl0eQorS0U7S0UtMDsgTmFpcm9iaSBbTmFpcm9iaSBNdW5pY2lwYWxpdHldOzA7MDswbXVuaWNpcGFsaXR5CitLRTtLRS0yMDA7Q2VudHJhbCBbQ2VudHJhbDJdO0thdGk7MDswO3Byb3ZpbmNlCitLRTtLRS0zMDA7Q29hc3Q7UHdhbmk7MDswO3Byb3ZpbmNlCitLRTtLRS00MDA7RWFzdGVybjtNYXNoYXJpa2k7MDswO3Byb3ZpbmNlCitLRTtLRS01MDA7Tm9ydGgtRWFzdGVybiAgW04uIEVhc3Rlcm5dO0thc2themluaSBNYXNoYXJpa2k7MDswO3Byb3ZpbmNlCitLRTtLRS02MDA7TnlhbnphOzA7MDtwcm92aW5jZQorS0U7S0UtNzAwO1JpZnQgVmFsbGV5OzA7MDtwcm92aW5jZQorS0U7S0UtOTAwO1dlc3Rlcm47TWFnaGFyaWJpOzA7MDtwcm92aW5jZQorS0c7S0ctQztDaPw7Q2h1eXNrYXlhIG9ibGFzdDt1anNrYWphIG9ibGFzdDswO3JlZ2lvbgorS0c7S0ctSjtKYWxhbC1BYmFkO0R6aGFsYWwtQWJhZHNrYXlhIG9ibGFzdDtEYWxhbC1BYmFkc2thamEgb2JsYXN0OzA7cmVnaW9uCitLRztLRy1OO05hcnluO05hcnluc2theWEgb2JsYXN0O05hcnluc2thamEgb2JsYXN0OzA7cmVnaW9uCitLRztLRy1PO09zaDtPc2hza2F5YSBvYmxhc3Q7T3NrYWphIG9ibGFzdDswO3JlZ2lvbgorS0c7S0ctVDtUYWxhcztUYWxhc3NrYXlhIG9ibGFzdDtUYWxhc3NrYWphIG9ibGFzdDswO3JlZ2lvbgorS0c7S0ctWTtZc3lrLUtsO0lzc3lrLUt1bHNrYXlhIG9ibGFzdDtJc3N5ay1LdWxza2FqYSBvYmxhc3Q7MDtyZWdpb24KK0tIO0tILTIzO0tyb25nIEthZWI7MDswOzBhdXRvbm9tb3VzIG11bmljaXBhbGl0eQorS0g7S0gtODtLcm9uZyBQcmVhaCBTaWhhbm91azswOzA7MGF1dG9ub21vdXMgbXVuaWNpcGFsaXR5CitLSDtLSC0yMDtQaG5vbSBQZW5oOzA7MDswYXV0b25vbW91cyBtdW5pY2lwYWxpdHkKK0tIO0tILTI7QmFhdCBEYW1iYW5nOzA7MDtwcm92aW5jZQorS0g7S0gtMTA7QmFudGVheSBNZWFuIENoZXkgW0JhbnRlYXkgTWVhbmNoZXldOzA7MDtwcm92aW5jZQorS0g7S0gtMztLYW1wb25nIENoYWFtOzA7MDtwcm92aW5jZQorS0g7S0gtNDtLYW1wb25nIENoaG5hbmc7MDswO3Byb3ZpbmNlCitLSDtLSC01O0thbXBvbmcgU3B1ZXUgW0thbXBuZyBTcGVdOzA7MDtwcm92aW5jZQorS0g7S0gtNjtLYW1wb25nIFRodW0gW0thbXBuZyBUaHVtXTswOzA7cHJvdmluY2UKK0tIO0tILTc7S2FtcG90IFtLYW1wb3RdOzA7MDtwcm92aW5jZQorS0g7S0gtODtLYW5kYWFsIFtLYW5kYWxdOzA7MDtwcm92aW5jZQorS0g7S0gtOTtLYW9oIEtvbmcgW0thb2ggS25nXTswOzA7cHJvdmluY2UKK0tIO0tILTA7S3JhY2hlaCBbS3JhY2hlaF07MDswO3Byb3ZpbmNlCitLSDtLSC0yNDtNb25kb2wgS2lyaSBbTW9uZGwgS2lyaV07MDswO3Byb3ZpbmNlCitLSDtLSC0yMjtPdGRhciBNZWFuIENoZXkgW3RkYXIgTWVhbmNoZXldIDswOzA7cHJvdmluY2UKK0tIO0tILTU7UG91c2FhdCBbUG90aHN0XTswOzA7cHJvdmluY2UKK0tIO0tILTIxO1ByZWFoIFZpaGVhcjswOzA7cHJvdmluY2UKK0tIO0tILTQ7UHJleSBWZWFlbmcgW1ByZXkgVmVuZ107MDswO3Byb3ZpbmNlCitLSDtLSC02O1JvdGFuYWsgS2lyaSBbUm90YW5va2lyaV07MDswO3Byb3ZpbmNlCitLSDtLSC03O1NpZW0gUmVhYiBbU2ltcmVhYl07MDswO3Byb3ZpbmNlCitLSDtLSC05O1N0dWVuZyBUcmFlbmcgW1N0ZW5nIFRyZW5nXTswOzA7cHJvdmluY2UKK0tIO0tILTIwO1N2YWF5IFJpZW5nIFtTdmF5IFJpbmddOzA7MDtwcm92aW5jZQorS0g7S0gtMjU7VGFha2FldiBbVGFrZXZdOzA7MDtwcm92aW5jZQorS0k7S0ktRztHaWxiZXJ0IElzbGFuZHM7MDswOzAKK0tJO0tJLUw7TGluZSBJc2xhbmRzOzA7MDswCitLSTtLSS1QO1Bob2VuaXggSXNsYW5kczswOzA7MAorS007S00tQTtBbmpvdWFuO05kem91YW5pOzA7MDsKK0tNO0tNLUc7R3JhbmRlIENvbW9yZTtOZ2F6aWRqYTswOzA7CitLTTtLTS1NO01vaGVsaTtNb2lsaTswOzA7CitLUDtLUC1LQUU7S2Flc29uZy1zaTswOzA7MHNwZWNpYWwgY2l0eQorS1A7S1AtTkFNO05hbXBvLXNpOzA7MDswc3BlY2lhbCBjaXR5CitLUDtLUC1QWU87UHlvbmd5YW5nLXNpOzA7MDswc3BlY2lhbCBjaXR5CitLUDtLUC1DSEE7Q2hhZ2FuZy1kbzswOzA7cHJvdmluY2UKK0tQO0tQLUhBQjtIYW1neW9uZ2J1ay1kbzswOzA7cHJvdmluY2UKK0tQO0tQLUhBTjtIYW1neW9uZ25hbS1kbzswOzA7cHJvdmluY2UKK0tQO0tQLUhXQjtId2FuZ2hhZWJ1ay1kbzswOzA7cHJvdmluY2UKK0tQO0tQLUhXTjtId2FuZ2hhZW5hbS1kbzswOzA7cHJvdmluY2UKK0tQO0tQLUtBTjtLYW5nd29uLWRvOzA7MDtwcm92aW5jZQorS1A7S1AtUFlCO1B5b25nYW5idWstZG87MDswO3Byb3ZpbmNlCitLUDtLUC1QWU47UHlvbmdhbm5hbS1kbzswOzA7cHJvdmluY2UKK0tQO0tQLVlBTjtZYW5nZ2FuZy1kbzswOzA7cHJvdmluY2UKK0tSO0tSLTA7U2VvdWwgVGV1Z2J5ZW9sc2kgW1Nlb3VsLVRrcHlsc2hpXTswOzA7MDtjYXBpdGFsIG1ldHJvcG9saXRhbiBjaXR5CitLUjtLUi0yNjtCdXNhbiBHd2FuZ3llb2dzaSBbUHVzYW4tS3dhbmd5a3NoaV07MDswOzBtZXRyb3BvbGl0YW4gY2l0eQorS1I7S1ItMjc7RGFlZ3UgR3dhbmd5ZW9nc2kgW1RhZWd1LUt3YW5neWtzaGldOzA7MDswbWV0cm9wb2xpdGFuIGNpdHkKK0tSO0tSLTMwO0RhZWplb24gR3dhbmd5ZW9nc2kgW1RhZWpuLUt3YW5neWtzaGldOzA7MDswbWV0cm9wb2xpdGFuIGNpdHkKK0tSO0tSLTI5O0d3YW5nanUgR3dhbmd5ZW9nc2kgW0t3YW5nanUtS3dhbmd5a3NoaV07MDswOzBtZXRyb3BvbGl0YW4gY2l0eQorS1I7S1ItMjg7SW5jaGVvbiBHd2FuZ3llb2dzaSBbSW5jaG4tS3dhbmd5a3NoaV07MDswOzBtZXRyb3BvbGl0YW4gY2l0eQorS1I7S1ItMztVbHNhbiBHd2FuZ3llb2dzaSBbVWxzYW4tS3dhbmd5a3NoaV07MDswOzBtZXRyb3BvbGl0YW4gY2l0eQorS1I7S1ItNDM7Q2h1bmdjaGVvbmdidWdkbyBbQ2h1bmdjaG5nYnVrLWRvXTswOzA7cHJvdmluY2UKK0tSO0tSLTQ0O0NodW5nY2hlb25nbmFtZG8gW0NodW5nY2huZ25hbS1kb107MDswO3Byb3ZpbmNlCitLUjtLUi00MjtHYW5nd2VvbmRvIFtLYW5nLXdvbi1kb107MDswO3Byb3ZpbmNlCitLUjtLUi00O0d5ZW9uZ2dpZG8gW0t5bmdnaS1kb107MDswO3Byb3ZpbmNlCitLUjtLUi00NztHeWVvbmdzYW5nYnVnZG8gW0t5bmdzYW5nYnVrLWRvXTswOzA7cHJvdmluY2UKK0tSO0tSLTQ4O0d5ZW9uZ3NhbmduYW1kbyBbS3luZ3NhbmduYW0tZG9dOzA7MDtwcm92aW5jZQorS1I7S1ItNDk7SmVqdWRvIFtDaGVqdS1kb107MDswO3Byb3ZpbmNlCitLUjtLUi00NTtKZW9ucmFidWdkb1tDaGxsYWJ1ay1kb107MDswO3Byb3ZpbmNlCitLUjtLUi00NjtKZW9ucmFuYW1kbyBbQ2hsbGFuYW0tZG9dOzA7MDtwcm92aW5jZQorS1c7S1ctQUg7QWwgQW1hZGk7MDswOzAKK0tXO0tXLUZBO0FsIEZhcndhbml5YWg7MDswOzAKK0tXO0tXLUpBO0FsIEphaHJhaDswOzA7MAorS1c7S1ctS1U7QWwgS3V3YXl0OzA7MDswCitLVztLVy1IQTthd2FsbGk7MDswOzAKK0taO0taLUFMQTtBbG1hdHk7QWxtYXR5O0FsbWF0eTswO2NpdHkKK0taO0taLUFTVDtBc3RhbmE7QXN0YW5hO0FzdGFuYTswO2NpdHkKK0FFO0FFLUFaO0FidSBEaGFiaTswOzA7MAorQUU7QUUtQUo7QWptYW47MDswOzAKK0FFO0FFLUZVO0FsIEZ1amF5cmFoOzA7MDswCitBRTtBRS1TSDtTaGFyaXFhaDswOzA7MAorQUU7QUUtRFU7RHViYWk7MDswOzAKK0FFO0FFLVJLO1JhcyBhbCBLaGF5bWFoOzA7MDswCitBRTtBRS1VUTtVbW0gYWwgUWF5d2F5bjswOzA7MAorQUY7QUYtQkRTO0JhZGFraHNoYW47MDswOzAKK0FGO0FGLUJERztCYWRnaGlzOzA7MDswCitBRjtBRi1CR0w7QmFnaGxhbiBbQmFnaGlhbl07MDswOzAKK0FGO0FGLUJBTDtCYWxraDswOzA7MAorQUY7QUYtQkFNO0JhbWlhbjswOzA7MAorQUY7QUYtRlJBO0ZhcmFoOzA7MDswCitBRjtBRi1GWUI7RmFyeWFiOzA7MDswCitBRjtBRi1HSEE7R2hhem5pIFtHaGF6bl07MDswOzAKK0FGO0FGLUdITztHaG93cjswOzA7MAorQUY7QUYtSEVMO0hlbG1hbmQ7MDswOzAKK0FGO0FGLUhFUjtIZXJhdDswOzA7MAorQUY7QUYtSk9XO0pvd3pqYW47MDswOzAKK0FGO0FGLUtBQjtLYWJ1bCBbS2Fib2xdOzA7MDswCitBRjtBRi1LQU47S2FuZGFoYXI7MDswOzAKK0FGO0FGLUtBUDtLYXBpc2E7MDswOzAKK0FGO0FGLUtOUjtLb25hciBbS3VuYXJdOzA7MDswCitBRjtBRi1LRFo7S29uZG96IFtLdW5kdXpdIFtLb25kdXpdOzA7MDswCitBRjtBRi1MQUc7TGFnaG1hbjswOzA7MAorQUY7QUYtTE9XO0xvd2dhcjswOzA7MAorQUY7QUYtTkFOO05hbmdyYWhhciBbTmFuZ2FyaGFyXSBbTmFuZ2FyaGFdOzA7MDswCitBRjtBRi1OSU07TmltcnV6OzA7MDswCitBRjtBRi1PUlU7T3J1emdhbiBbVXJ1emdhbl07MDswOzAKK0FGO0FGLVBJQTtQYWt0aWE7MDswOzAKK0FGO0FGLVBLQTtQYWt0aWthOzA7MDswCitBRjtBRi1QQVI7UGFyd2FuIFtQYXJ2YW5dOzA7MDswCitBRjtBRi1TQU07U2FtYW5nYW47MDswOzAKK0FGO0FGLVNBUjtTYXItZSBQb2w7MDswOzAKK0FGO0FGLVRBSztUYWtoYXI7MDswOzAKK0FGO0FGLVdBUjtXYXJkYWsgW1dhcmRhZ10gW1ZhcmRha107MDswOzAKK0FGO0FGLVpBQjtaYWJvbCBbWmFidWxdOzA7MDswCitBRDtBRC0wMTtBbmRvcnJhOzA7MDswCitBTDtBTC1CUjtCZXJhdDswOzA7MAorQUw7QUwtQlU7QnVscWl6ZTswOzA7OQorQUw7QUwtREw7RGVsdmluZTswOzA7MgorQUw7QUwtRFY7RGV2b2xsOzA7MDs2CitBTDtBTC1ESTtEaWJlcjswOzA7OQorQUw7QUwtRFI7RHVycmVzOzA7MDsyCitBTDtBTC1FTDtFbGJhc2FuOzA7MDszCitBTDtBTC1GUjtGaWVyOzA7MDs0CitBTDtBTC1HUjtHcmFtc2g7MDswOzMKK0FMO0FMLUdKO0dqaXJva2FzdGVyOzA7MDs1CitBTDtBTC1IQTtIYXM7MDswOzcKK0FMO0FMLUtBO0thdmFqZTswOzA7MAorQUw7QUwtRVI7S29sb25qZTswOzA7NgorQUw7QUwtS087S29yY2U7MDswOzYKK0FMO0FMLUtSO0tydWplOzA7MDsyCitBTDtBTC1LQztLdWNvdmU7MDswOzAKK0FMO0FMLUtVO0t1a2VzOzA7MDs3CitBTDtBTC1LQjtLdXJiaW47MDswOzgKK0FMO0FMLUxFO0xlemhlOzA7MDs4CitLWjtLWi1BTE07QWxtYXR5IG9ibHlzeTtBbG1hdGluc2theWEgb2JsYXN0O0FsbWF0aW5za2FqYSBvYmxhc3Q7MDtyZWdpb24KK0taO0taLUFLTTtBcW1vbGEgb2JseXN5O0FrbW9saW5za2F5YSBvYmxhc3Q7QWttb2xpbnNrYWphIG9ibGFzdDswO3JlZ2lvbgorS1o7S1otQUtUO0FxdGJlIG9ibHlzeTtBa3R5dWJpbnNrYXlhIG9ibGFzdDtBa3RqdWJpbnNrYWphIG9ibGFzdDswO3JlZ2lvbgorS1o7S1otQVRZO0F0eXJhdSBvYmx5c3k7QXR5cmF1c2theWEgb2JsYXN0O0F0eXJhdXNrYWphIG9ibGFzdDswO3JlZ2lvbgorS1o7S1otWkFQO0JhdHlzIFFhemFxc3RhbiBvYmx5c3k7WmFwYWRuby1LYXpha2hzdGFuc2theWEgb2JsYXN0O1phcGFkbm8tS2F6YWhzdGFuc2thamEgb2JsYXN0OzA7cmVnaW9uCitLWjtLWi1NQU47TWFuZ2doeXN0YXUgb2JseXN5O01hbmdpc3RhdXNrYXlhIG9ibGFzdDtNYW5neXN0YXVza2FqYSBvYmxhc3Q7MDtyZWdpb24KK0taO0taLVlVWjtPbmd0/HN0aWsgUWF6YXFzdGFuIG9ibHlzeTtZdXpobm8tS2F6YWtoc3RhbmtheWEgb2JsYXN0O0p1bm8tS2F6YWhzdGFua2FqYSBvYmxhc3Q7MDtyZWdpb24KK0taO0taLVBBVjtQYXZsb2RhciBvYmx5c3k7UGF2bG9kYXJza2F5YSBvYmxhc3Q7UGF2bG9kYXJza2FqYSBvYmxhc3Q7MDtyZWdpb24KK0taO0taLUtBUjtRYXJhZ2hhbmR5IG9ibHlzeTtLYXJhZ2FuZGluc2theWEgb2JsYXN0O0thcmFnYW5kaW5za2FqYSBvYmxhc3Q7MDtyZWdpb24KK0taO0taLUtVUztRb3N0YW5heSBvYmx5c3k7S29zdGFuYXlza2F5YSBvYmxhc3Q7S29zdGFuYWpza2FqYSBvYmxhc3Q7MDtyZWdpb24KK0taO0taLUtaWTtReXp5bG9yZGEgb2JseXN5O0t5enlsb3JkaW5za2F5YSBvYmxhc3Q7S3l6eWxvcmRpbnNrYWphIG9ibGFzdDswO3JlZ2lvbgorS1o7S1otVk9TO1NoeWdoeXMgUWF6YXFzdGFuIG9ibHlzeTtWb3N0b2Nobm8tS2F6YWtoc3RhbnNrYXlhIG9ibGFzdDtWb3N0b2Vuby1LYXphaHN0YW5za2FqYSBvYmxhc3Q7MDtyZWdpb24KK0taO0taLVNFVjtTb2x0/HN0aWsgUWF6YXFzdGFuIG9ibHlzeTtTZXZlcm8tS2F6YWtoc3RhbnNrYXlhIG9ibGFzdDtTZXZlcm8tS2F6YWhzdGFuc2thamEgb2JsYXN0OzA7cmVnaW9uCitLWjtLWi1aSEE7WmhhbWJ5bCBvYmx5c3k7WmhhbWJ5bHNrYXlhIG9ibGFzdDthbWJ5bHNrYWphIG9ibGFzdDswO3JlZ2lvbgorTEE7TEEtVlQ7VmllbnRpYW5lOzA7MDswcHJlZmVjdHVyZQorTEE7TEEtQVQ7QXR0YXB1IFtBdHRvcGV1XTswOzA7cHJvdmluY2UKK0xBO0xBLUJLO0Jva2VvOzA7MDtwcm92aW5jZQorTEE7TEEtQkw7Qm9saWtoYW14YWkgW0JvcmlraGFuZV07MDswO3Byb3ZpbmNlCitMQTtMQS1DSDtDaGFtcGFzYWsgW0NoYW1wYXNzYWtdOzA7MDtwcm92aW5jZQorTEE7TEEtSE87SG91YXBoYW47MDswO3Byb3ZpbmNlCitMQTtMQS1LSDtLaGFtbW91YW47MDswO3Byb3ZpbmNlCitMQTtMQS1MTTtMb3VhbmcgTmFtdGhhOzA7MDtwcm92aW5jZQorTUQ7TUQtVEE7VGFyYWNsaWE7MDswOzA7ZGlzdHJpY3QKK0xBO0xBLUxQO0xvdWFuZ3BoYWJhbmcgW0xvdWFuZyBQcmFiYW5nXTswOzA7cHJvdmluY2UKK0xBO0xBLU9VO091ZG9teGFpIFtPdWRvbXNhaV07MDswO3Byb3ZpbmNlCitMQTtMQS1QSDtQaG9uZ3NhbGkgW1Bob25nIFNhbHldOzA7MDtwcm92aW5jZQorTEE7TEEtU0w7U2FsYXZhbiBbU2FyYXZhbmVdOzA7MDtwcm92aW5jZQorTEE7TEEtU1Y7U2F2YW5uYWtoZXQ7MDswO3Byb3ZpbmNlCitMQTtMQS1WSTtWaWVudGlhbmU7MDswO3Byb3ZpbmNlCitMQTtMQS1YQTtYYWlnbmFib3VsaSBbU2F5YWJvdXJ5XTswOzA7cHJvdmluY2UKK0xBO0xBLVhOO1hhaXNvbWJvdW47MDswOzBzcGVjaWFsIHpvbmUKK0xBO0xBLVhFO1hla29uZyBbU2Vrb25nXTswOzA7cHJvdmluY2UKK0xBO0xBLVhJO1hpYW5na2hvYW5nIFtYaWVuZyBLaG91YW5nXTswOzA7cHJvdmluY2UKK0xCO0xCLUJBO0JlaXJvdXQ7QmF5cnV0OzA7MAorTEI7TEItQkk7RWwgQmVxYWE7QWwgQmlxYTswOzAKK0xCO0xCLUpMO0phYmFsIExvdWJuYW5lO0phYmFsIEx1Ym5hbjswOzAKK0xCO0xCLUFTO0xvdWJuYW5lIGVjaCBDaGVtYWxpO0FzaCBTaGFtYWw7MDswCitMQjtMQi1KQTtMb3VibmFuZSBlaiBKbm91Ymk7QWwgSmFudWI7MDswCitMQjtMQi1OQTtOYWJhdGl5ZTtBbiBOYWJheWFoOzA7MAorTEs7TEstNTI7QW1wYXJhOzA7MDs1CitMSztMSy03O0FudXJhZGhhcHVyYTswOzA7NworTEs7TEstODtCYWR1bGxhOzA7MDs4CitMSztMSy01O0JhdHRpY2Fsb2E7MDswOzUKK0xLO0xLLTtDb2xvbWJvOzA7MDswCitMSztMSy0zO0dhbGxlOzA7MDszCitMSztMSy0yO0dhbXBhaGE7MDswOworTEs7TEstMzM7SGFtYmFudG90YTswOzA7MworTEs7TEstNDtKYWZmbmE7MDswOzQKK0xLO0xLLTM7S2FsdXRhcmE7MDswOzAKK0xLO0xLLTI7S2FuZHk7MDswOzIKK0xLO0xLLTkyO0tlZ2FsbGE7MDswOzkKK0xLO0xLLTQyO0tpbGlub2NoY2hpOzA7MDs0CitMSztMSy02O0t1cnVuZWdhbGE7MDswOzYKK0xLO0xLLTQzO01hbm5hcjswOzA7NAorTEs7TEstMjI7TWF0YWxlOzA7MDsyCitMSztMSy0zMjtNYXRhcmE7MDswOzMKK0xLO0xLLTgyO01vbmFyYWdhbGE7MDswOzgKK0xLO0xLLTQ1O011bGxhaXR0aXZ1OzA7MDs0CitMSztMSy0yMztOdXdhcmEgRWxpeWE7MDswOzIKK0xLO0xLLTcyO1BvbG9ubmFydXdhOzA7MDs3CitMSztMSy02MjtQdXR0YWxhbTswOzA7NgorTEs7TEstOTtSYXRuYXB1cmE7MDswOzkKK0xLO0xLLTUzO1RyaW5jb21hbGVlOzA7MDs1CitMSztMSy00NDtWYXZ1bml5YTswOzA7NAorTFI7TFItQk07Qm9taTswOzA7MAorTFI7TFItQkc7Qm9uZzswOzA7MAorTFI7TFItR0I7R3JhbmQgQmFzc2E7MDswOzAKK0xSO0xSLUNNO0dyYW5kIENhcGUgTW91bnQ7MDswOzAKK0xSO0xSLUdHO0dyYW5kIEdlZGVoOzA7MDswCitMUjtMUi1HSztHcmFuZCBLcnU7MDswOzAKK0xSO0xSLUxPO0xvZmE7MDswOzAKK0xSO0xSLU1HO01hcmdpYmk7MDswOzAKK0xSO0xSLU1ZO01hcnlsYW5kOzA7MDswCitMUjtMUi1NTztNb250c2VycmFkbzswOzA7MAorTFI7TFItTkk7TmltYmE7MDswOzAKK0xSO0xSLVJJO1JpdmVyY2VzczswOzA7MAorTFI7TFItU0k7U2lub2U7MDswOzAKK0xTO0xTLUQ7QmVyZWE7MDswOzAKK0xTO0xTLUI7QnV0aGEtQnV0aGU7MDswOzAKK0xTO0xTLUM7TGVyaWJlOzA7MDswCitMUztMUy1FO01hZmV0ZW5nOzA7MDswCitMUztMUy1BO01hc2VydTswOzA7MAorTFM7TFMtRjtNb2hhbGVzIEhvZWs7MDswOzAKK0xTO0xTLUo7TW9raG90bG9uZzswOzA7MAorTFM7TFMtSDtRYWNoYXMgTmVrOzA7MDswCitMUztMUy1HO1F1dGhpbmc7MDswOzAKK0xTO0xTLUs7VGhhYmEtVHNla2E7MDswOzAKK0xUO0xULUFMO0FseXRhdXMgQXBza3JpdGlzOzA7MDswCitMVDtMVC1LVTtLYXVubyBBcHNrcml0aXM7MDswOzAKK0xUO0xULUtMO0tsYWlwZG9zIEFwc2tyaXRpczswOzA7MAorTFQ7TFQtTVI7TWFyaWphbXBvbHMgQXBza3JpdGlzOzA7MDswCitMVDtMVC1QTjtQYW5ldmlvIEFwc2tyaXRpczswOzA7MAorTFQ7TFQtU0E7aWF1bGkgQXBza3JpdGlzOzA7MDswCitMVDtMVC1UQTtUYXVyYWdzIEFwc2tyaXRpczswOzA7MAorTFQ7TFQtVEU7VGVsaSBBcHNrcml0aXM7MDswOzAKK0xUO0xULVVUO1V0ZW5vcyBBcHNrcml0aXM7MDswOzAKK0xUO0xULVZMO1ZpbG5pYXVzIEFwc2tyaXRpczswOzA7MAorTFU7TFUtRDtEaWVraXJjaDswOzA7MAorTFU7TFUtRztHcmV2ZW5tYWNoZXI7MDswOzAKK0xVO0xVLUw7THV4ZW1ib3VyZztMdXhlbWJ1cmcgOzA7MDsKK0xWO0xWLUFJO0FpemtyYXVrbGVzIEFwcmlpczswOzA7MDtkaXN0cmljdAorTFY7TFYtQUw7QWxrc25lcyBBcHJpaXM7MDswOzA7ZGlzdHJpY3QKK0xWO0xWLUJMO0JhbHZ1IEFwcmlpczswOzA7MDtkaXN0cmljdAorTFY7TFYtQlU7QmF1c2thcyBBcHJpaXM7MDswOzA7ZGlzdHJpY3QKK0xWO0xWLUNFO0NzdSBBcHJpaXM7MDswOzA7ZGlzdHJpY3QKK0xWO0xWLURBO0RhdWdhdnBpbHMgQXByaWlzOzA7MDswO2Rpc3RyaWN0CitMVjtMVi1ETztEb2JlbGVzIEFwcmlpczswOzA7MDtkaXN0cmljdAorTFY7TFYtR1U7R3VsYmVuZXMgQXByaWlzOzA7MDswO2Rpc3RyaWN0CitMVjtMVi1KTDtKZWxnYXZhcyBBcHJpaXM7MDswOzA7ZGlzdHJpY3QKK0xWO0xWLUpLO0prYWJwaWxzIEFwcmlpczswOzA7MDtkaXN0cmljdAorTFY7TFYtS1I7S3JzbGF2YXMgQXByaWlzOzA7MDswO2Rpc3RyaWN0CitMVjtMVi1LVTtLdWxkZ2FzIEFwcmlpczswOzA7MDtkaXN0cmljdAorTFY7TFYtTE07TGltYmF1IEFwcmlpczswOzA7MDtkaXN0cmljdAorTFY7TFYtTEU7TGllcGphcyBBcHJpaXM7MDswOzA7ZGlzdHJpY3QKK0xWO0xWLUxVO0x1ZHphcyBBcHJpaXM7MDswOzA7ZGlzdHJpY3QKK0xWO0xWLU1BO01hZG9uYXMgQXByaWlzOzA7MDswO2Rpc3RyaWN0CitMVjtMVi1PRztPZ3JlcyBBcHJpaXM7MDswOzA7ZGlzdHJpY3QKK0xWO0xWLVBSO1ByZWl1IEFwcmlpczswOzA7MDtkaXN0cmljdAorTFY7TFYtUkU7Unpla25lcyBBcHJpaXM7MDswOzA7ZGlzdHJpY3QKK0xWO0xWLVJJO1JnYXMgQXByaWlzOzA7MDswO2Rpc3RyaWN0CitMVjtMVi1TQTtTYWxkdXMgQXByaWlzOzA7MDswO2Rpc3RyaWN0CitMVjtMVi1UQTtUYWxzdSBBcHJpaXM7MDswOzA7ZGlzdHJpY3QKK0xWO0xWLVRVO1R1a3VtYSBBcHJpaXM7MDswOzA7ZGlzdHJpY3QKK0xWO0xWLVZLO1ZhbGthcyBBcHJpaXM7MDswOzA7ZGlzdHJpY3QKK0xWO0xWLVZNO1ZhbG1pZXJhcyBBcHJpaXM7MDswOzA7ZGlzdHJpY3QKK0xWO0xWLVZFO1ZlbnRzcGlscyBBcHJpaXM7MDswOzA7ZGlzdHJpY3QKK0xWO0xWLURHVjtEYXVnYXZwaWxzOzA7MDswO2NpdHkKK0xWO0xWLUpFTDtKZWxnYXZhOzA7MDswO2NpdHkKK0xWO0xWLUpVUjtKcm1hbGE7MDswOzA7Y2l0eQorTFY7TFYtTFBYO0xpZXBqYTswOzA7MDtjaXR5CitMVjtMVi1SRVo7Unpla25lOzA7MDswO2NpdHkKK0xWO0xWLVJJWDtSZ2E7MDswOzA7Y2l0eQorTFY7TFYtVkVOO1ZlbnRzcGlsczswOzA7MDtjaXR5CitMWTtMWS1CVTtBbCBCdW5uOzA7MDswCitMWTtMWS1KQTtBbCBKYWJhbCBhbCBBa2hhcjswOzA7MAorTFk7TFktSlU7QWwgSnVmcmFoOzA7MDswCitMWTtMWS1XQTtBbCBXYWg7MDswOzAKK0xZO0xZLVpBO0F6IFp3aXlhaDswOzA7MAorTFk7TFktQkE7QmFuZ2h6OzA7MDswCitMWTtMWS1NSTtNaXJ0YWg7MDswOzAKK0xZO0xZLVRCO2FyYnVsdXM7MDswOzAKK01BO01BLUFHRDtBZ2FkaXI7MDswOzMKK01BO01BLUJBSDtBaXQgQmFoYTswOzA7MworTUE7TUEtTUVMO0FpdCBNZWxsb3VsOzA7MDszCitNQTtNQS1IQU87QWwgSGFvdXo7MDswOzAKK01BO01BLUhPQztBbCBIb2NlaW1hOzA7MDswCitNQTtNQS1BU1o7QXNzYS1aYWc7MDswOzQKK01BO01BLUFaSTtBemlsYWw7MDswOzIKK01BO01BLUJFTTtCZW5pIE1lbGxhbDswOzA7MgorTUE7TUEtQkVTO0JlbiBTbGltYW5lOzA7MDswOQorTUE7TUEtQkVSO0JlcmthbmU7MDswOzA0CitNQTtNQS1CT0Q7Qm91amRvdXI7MDswOzUKK01BO01BLUJPTTtCb3VsZW1hbmU7MDswOzA1CitNQTtNQS1DQVM7Q2FzYWJsYW5jYSBbRGFyIGVsIEJlaWRhXTswOzA7MDgKK01BO01BLUNIRTtDaGVmY2hhb3VlbmU7MDswOzAKK01BO01BLUNISTtDaGljaGFvdWE7MDswOzAKK01BO01BLUhBSjtFbCBIYWplYjswOzA7MDYKK01BO01BLUpESTtFbCBKYWRpZGE7MDswOzAKK01BO01BLUVSUjtFcnJhY2hpZGlhOzA7MDswNgorTUE7TUEtRVNJO0Vzc2FvdWlyYTswOzA7MAorTUE7TUEtRVNNO0VzIFNtYXJhOzA7MDs0CitNQTtNQS1GRVM7RmVzOzA7MDswNQorQUw7QUwtTEI7TGlicmF6aGQ7MDswOzMKK0FMO0FMLUxVO0x1c2huamU7MDswOzQKK0FMO0FMLU1NO01hbGVzaSBlIE1hZGhlOzA7MDswCitBTDtBTC1NSztNYWxsYWthc3RlcjswOzA7NAorQUw7QUwtTVQ7TWF0OzA7MDs5CitBTDtBTC1NUjtNaXJkaXRlOzA7MDs4CitBTDtBTC1QUTtQZXFpbjswOzA7MworQUw7QUwtUFI7UGVybWV0OzA7MDs1CitBTDtBTC1QRztQb2dyYWRlYzswOzA7NgorQUw7QUwtUFU7UHVrZTswOzA7MAorQUw7QUwtU1I7U2FyYW5kZTswOzA7MgorQUw7QUwtU0s7U2tyYXBhcjswOzA7MAorQUw7QUwtU0g7U2hrb2RlcjswOzA7MAorQUw7QUwtVEU7VGVwZWxlbmU7MDswOzUKK0FMO0FMLVRSO1RpcmFuZTswOzA7MAorQUw7QUwtVFA7VHJvcG9qZTswOzA7NworQUw7QUwtVkw7VmxvcmU7MDswOzIKK0FNO0FNLUVSO0VyZXZhbiBbWWVyZXZhbl0gW0FybWVuaWEgeCBZZXJldmFuXTswOzA7MDtjaXR5CitBTTtBTS1BRztBcmFnYWNvdG47MDswO3JlZ2lvbgorQU07QU0tQVI7QXJhcmF0OzA7MDtyZWdpb24KK0FNO0FNLUFWO0FybWF2aXI7MDswO3JlZ2lvbgorQU07QU0tR1I7R2Vhcmt1bmlrOzA7MDtyZWdpb24KK0FNO0FNLUtUO0tvdGF5azswOzA7cmVnaW9uCitBTTtBTS1MTztMb3k7MDswO3JlZ2lvbgorQU07QU0tU0g7aXJhazswOzA7cmVnaW9uCitBTTtBTS1TVTtTeXVuaWs7MDswO3JlZ2lvbgorQU07QU0tVFY7VGF2dTswOzA7cmVnaW9uCitBTTtBTS1WRDtWYXlvYyBKb3I7MDswO3JlZ2lvbgorQU87QU8tQkdPO0JlbmdvOzA7MDswCitBTztBTy1CR1U7QmVuZ3VlbGE7MDswOzAKK0FPO0FPLUJJRTtCaWU7MDswOzAKK0FPO0FPLUNBQjtDYWJpbmRhOzA7MDswCitTTjtTTi1NVDtNYXRhbTswOzA7MAorQU87QU8tQ0NVO0N1YW5kby1DdWJhbmdvOzA7MDswCitBTztBTy1DTk87Q3VhbnphIE5vcnRlOzA7MDswCitBTztBTy1DVVM7Q3VhbnphIFN1bDswOzA7MAorQU87QU8tQ05OO0N1bmVuZTswOzA7MAorQU87QU8tSFVBO0h1YW1ibzswOzA7MAorQU87QU8tSFVJO0h1bGE7MDswOzAKK0FPO0FPLUxVQTtMdWFuZGE7MDswOzAKK0FPO0FPLUxOTztMdW5kYSBOb3J0ZTswOzA7MAorQU87QU8tTFNVO0x1bmRhIFN1bDswOzA7MAorQU87QU8tTUFMO01hbGFuZ2U7MDswOzAKK0FPO0FPLU1PWDtNb3hpY287MDswOzAKK0FPO0FPLU5BTTtOYW1pYmU7MDswOzAKK0FPO0FPLVVJRztVZ2U7MDswOzAKK0FPO0FPLVpBSTtaYWlyZTswOzA7MAorQVI7QVItQztDYXBpdGFsIGZlZGVyYWw7MDswOzA7ZmVkZXJhbCBkaXN0cmljdAorQVI7QVItQjtCdWVub3MgQWlyZXM7MDswO3Byb3ZpbmNlCitBUjtBUi1LO0NhdGFtYXJjYTswOzA7cHJvdmluY2UKK0FSO0FSLVg7Q3Jkb2JhOzA7MDtwcm92aW5jZQorQVI7QVItVztDb3JyaWVudGVzOzA7MDtwcm92aW5jZQorQVI7QVItSDtDaGFjbzswOzA7cHJvdmluY2UKK0FSO0FSLVU7Q2h1YnV0OzA7MDtwcm92aW5jZQorQVI7QVItRTtFbnRyZSBSb3M7MDswO3Byb3ZpbmNlCitBUjtBUi1QO0Zvcm1vc2E7MDswO3Byb3ZpbmNlCitBUjtBUi1ZO0p1anV5OzA7MDtwcm92aW5jZQorQVI7QVItTDtMYSBQYW1wYTswOzA7cHJvdmluY2UKK0FSO0FSLUY7TGEgUmlvamE7MDswO3Byb3ZpbmNlCitBUjtBUi1NO01lbmRvemE7MDswO3Byb3ZpbmNlCitBUjtBUi1OO01pc2lvbmVzOzA7MDtwcm92aW5jZQorQVI7QVItUTtOZXVxdWVuOzA7MDtwcm92aW5jZQorQVI7QVItUjtSbyBOZWdybzswOzA7cHJvdmluY2UKK0FSO0FSLUE7U2FsdGE7MDswO3Byb3ZpbmNlCitBUjtBUi1KO1NhbiBKdWFuOzA7MDtwcm92aW5jZQorQVI7QVItRDtTYW4gTHVpczswOzA7cHJvdmluY2UKK0FSO0FSLVo7U2FudGEgQ3J1ejswOzA7cHJvdmluY2UKK0FSO0FSLVM7U2FudGEgRmU7MDswO3Byb3ZpbmNlCitBUjtBUi1HO1NhbnRpYWdvIGRlbCBFc3Rlcm87MDswO3Byb3ZpbmNlCitBUjtBUi1WO1RpZXJyYSBkZWwgRnVlZ287MDswO3Byb3ZpbmNlCitBUjtBUi1UO1R1Y3VtbjswOzA7cHJvdmluY2UKK0FUO0FULTEwO0J1cmdlbmxhbmQ7MDswOzAKK0FUO0FULTI7S3JudGVuOzA7MDswCitBVDtBVC0zO05pZWRlcnN0ZXJyZWljaDswOzA7MAorQVQ7QVQtNDtPYmVyc3RlcnJlaWNoOzA7MDswCitBVDtBVC01O1NhbHpidXJnOzA7MDswCitBVDtBVC02O1N0ZWllcm1hcms7MDswOzAKK0FUO0FULTc7VGlyb2w7MDswOzAKK0FUO0FULTg7Vm9yYXJsYmVyZzswOzA7MAorQVQ7QVQtOTtXaWVuOzA7MDswCitBVTtBVS1OUztOZXcgU291dGggV2FsZXM7MDswOzBzdGF0ZQorQVU7QVUtUUw7UXVlZW5zbGFuZDswOzA7MHN0YXRlCitBVTtBVS1TQTtTb3V0aCBBdXN0cmFsaWE7MDswOzBzdGF0ZQorQVU7QVUtVFM7VGFzbWFuaWE7MDswOzBzdGF0ZQorQVU7QVUtVkk7VmljdG9yaWE7MDswOzBzdGF0ZQorQVU7QVUtV0E7V2VzdGVybiBBdXN0cmFsaWE7MDswOzBzdGF0ZQorQVU7QVUtQ1Q7QXVzdHJhbGlhbiBDYXBpdGFsIFRlcnJpdG9yeTswOzA7MDt0ZXJyaXRvcnkKK0FVO0FVLU5UO05vcnRoZXJuIFRlcnJpdG9yeTswOzA7MDt0ZXJyaXRvcnkKK0FaO0FaLUFCO2xpIEJheXJhbWw7MDswOzA7Y2l0eQorQVo7QVotQkE7QmFrOzA7MDswO2NpdHkKK0FaO0FaLUdBO0duYzswOzA7MDtjaXR5CitBWjtBWi1MQTtMbmtyYW47MDswOzA7Y2l0eQorQVo7QVotTUk7TWluZ2NldmlyOzA7MDswO2NpdHkKK0FaO0FaLU5BO05hZnRhbGFuOzA7MDswO2NpdHkKK0FaO0FaLVNBO2tpOzA7MDswO2NpdHkKK0FaO0FaLVNNO1N1bXFheXQ7MDswOzA7Y2l0eQorQVo7QVotU1M7dWE7MDswOzA7Y2l0eQorQVo7QVotWEE7WGFua25kaTswOzA7MDtjaXR5CitBWjtBWi1ZRTtZZXZsYXg7MDswOzA7Y2l0eQorQVo7QVotQUJTO0FiZXJvbjswOzA7MHJheW9uCitBWjtBWi1BR0M7QWNhYmRpOzA7MDswcmF5b24KK0FaO0FaLUFHTTtBZGFtOzA7MDswcmF5b24KK0FaO0FaLUFHUztBZGE7MDswOzByYXlvbgorQVo7QVotQUdBO0FzdGFmYTswOzA7MHJheW9uCitBWjtBWi1BR1U7QXN1OzA7MDswcmF5b24KK0FaO0FaLUFTVDtBc3RhcmE7MDswOzByYXlvbgorQVo7QVotQkFCO0JhYms7MDswO05YO3JheW9uCitBWjtBWi1CQUw7QmFsYWtuOzA7MDswcmF5b24KK0FaO0FaLUJBUjtCcmQ7MDswOzByYXlvbgorQVo7QVotQkVZO0JleWxxYW47MDswOzByYXlvbgorQVo7QVotQklMO0JpbHN1dmFyOzA7MDswcmF5b24KK0FaO0FaLUNBQjtDYnJheWw7MDswOzByYXlvbgorQVo7QVotQ0FMO0NsaWxhYmFiOzA7MDswcmF5b24KK0FaO0FaLUNVTDtDdWxmYTswOzA7Tlg7cmF5b24KK0FaO0FaLURBUztEYWtzbjswOzA7MHJheW9uCitBWjtBWi1EQVY7RHZjaTswOzA7MHJheW9uCitBWjtBWi1GVVo7Rvx6dWxpOzA7MDswcmF5b24KK0FaO0FaLUdBRDtHZGJ5OzA7MDswcmF5b24KK0FaO0FaLUdPUjtHb3JhbmJveTswOzA7MHJheW9uCitBWjtBWi1HT1k7R3ljYXk7MDswOzByYXlvbgorQVo7QVotSEFDO0hhY3FhYnVsOzA7MDswcmF5b24KK0FaO0FaLUlNSTttaWxpOzA7MDswcmF5b24KK0FaO0FaLUlTTTtzbWF5bGw7MDswOzByYXlvbgorQVo7QVotS0FMO0tsYmNyOzA7MDswcmF5b24KK0FaO0FaLUtVUjtL/HJkbWlyOzA7MDswcmF5b24KK0FaO0FaLUxBQztMYWNuOzA7MDswcmF5b24KK0FaO0FaLUxBTjtMbmtyYW47MDswOzByYXlvbgorQVo7QVotTEVSO0xlcmlrOzA7MDswcmF5b24KK0FaO0FaLU1BUztNYXNhbGw7MDswOzByYXlvbgorQVo7QVotTkVGO05lZnRjYWxhOzA7MDswcmF5b24KK0FaO0FaLU9HVTtPdXo7MDswOzByYXlvbgorQVo7QVotT1JEO09yZHViYWQ7MDswO05YO3JheW9uCitBWjtBWi1RQUI7UWJsOzA7MDswcmF5b24KK0FaO0FaLVFBWDtRYXg7MDswOzByYXlvbgorQVo7QVotUUFaO1FhemF4OzA7MDswcmF5b24KK0FaO0FaLVFPQjtRb2J1c3RhbjswOzA7MHJheW9uCitBWjtBWi1RQkE7UXViYTswOzA7MHJheW9uCitBWjtBWi1RQkk7UXViYWRsOzA7MDswcmF5b24KK0FaO0FaLVFVUztRdXNhcjswOzA7MHJheW9uCitBWjtBWi1TQVQ7U2FhdGw7MDswOzByYXlvbgorQVo7QVotU0FCO1NhYmlyYWJhZDswOzA7MHJheW9uCitBWjtBWi1TQUQ7U2RyazswOzA7Tlg7cmF5b24KK0FaO0FaLVNBSDthaGJ1ejswOzA7Tlg7cmF5b24KK0FaO0FaLVNBSztraTswOzA7MHJheW9uCitBWjtBWi1TQUw7U2FseWFuOzA7MDswcmF5b24KK0FaO0FaLVNNSTthbWF4OzA7MDswcmF5b24KK0FaO0FaLVNLUjtta2lyOzA7MDswcmF5b24KK0FaO0FaLVNNWDtTYW11eDswOzA7MHJheW9uCitBWjtBWi1TQVI7cnVyOzA7MDtOWDtyYXlvbgorQVo7QVotU0lZO1NpeXpuOzA7MDswcmF5b24KK0FaO0FaLVNVUzt1YTswOzA7MHJheW9uCitBWjtBWi1UQVI7VHJ0cjswOzA7MHJheW9uCitBWjtBWi1UT1Y7VG92dXo7MDswOzByYXlvbgorQVo7QVotVUNBO1VjYXI7MDswOzByYXlvbgorQVo7QVotWEFDO1hhY21hejswOzA7MHJheW9uCitBWjtBWi1YQU47WGFubGFyOzA7MDswcmF5b24KK0FaO0FaLVhJWjtYejswOzA7MHJheW9uCitBWjtBWi1YQ0k7WG9jYWw7MDswOzByYXlvbgorQVo7QVotWFZEO1hvY2F2bmQ7MDswOzByYXlvbgorQVo7QVotWUFSO1lhcmRtbDswOzA7MHJheW9uCitBWjtBWi1ZRVY7WWV2bGF4OzA7MDswcmF5b24KK0FaO0FaLVpBTjtabmdpbGFuOzA7MDswcmF5b24KK0FaO0FaLVpBUTtaYXFhdGFsYTswOzA7MHJheW9uCitBWjtBWi1aQVI7WnJkYWI7MDswOzByYXlvbgorQkE7QkEtQklIO0ZlZGVyYWNpamEgQm9zbmEgaSBIZXJjZWdvdmluYTswOzA7MAorQkE7QkEtU1JQO1JlcHVibGlrYSBTcnBza2E7MDswOzAKK0JEO0JELTA1O0JhZ2VyaGF0IHppbGE7MDswOzQKK0JEO0JELTA7QmFuZGFyYmFuIHppbGE7MDswOzIKK0JEO0JELTAyO0Jhcmd1bmEgemlsYTswOzA7MAorQkQ7QkQtMDY7QmFyaXNhbCB6aWxhOzA7MDswCitCRDtCRC0wNztCaG9sYSB6aWxhOzA7MDswCitCRDtCRC0wMztCb2dyYSB6aWxhOzA7MDs1CitCRDtCRC0wNDtCcmFobWFuYmFyaWEgemlsYTswOzA7MgorQkQ7QkQtMDk7Q2hhbmRwdXIgemlsYTswOzA7MgorQkQ7QkQtMDtDaGl0dGFnb25nIHppbGE7MDswOzIKK0JEO0JELTI7Q2h1YWRhbmdhIHppbGE7MDswOzQKK0JEO0JELTA4O0NvbWlsbGEgemlsYTswOzA7MgorQkQ7QkQtMTA7Q294cyBCYXphciB6aWxhOzA7MDsyCitCRDtCRC0zO0RoYWthIHppbGE7MDswOzMKK0JEO0JELTQ7RGluYWpwdXIgemlsYTswOzA7NQorQkQ7QkQtNTtGYXJpZHB1ciB6aWxhOzA7MDszCitCRDtCRC02O0ZlbmkgemlsYTswOzA7MgorQkQ7QkQtOTtHYWliYW5kaGEgemlsYTswOzA7NQorQkQ7QkQtODtHYXppcHVyIHppbGE7MDswOzMKK0JEO0JELTc7R29wYWxnYW5qIHppbGE7MDswOzMKK0JEO0JELTIwO0hhYmlnYW5qIHppbGE7MDswOzYKK0JEO0JELTI0O0phaXB1cmhhdCB6aWxhOzA7MDs1CitCRDtCRC0yO0phbWFscHVyIHppbGE7MDswOzMKK0JEO0JELTIyO0plc3NvcmUgemlsYTswOzA7NAorQkQ7QkQtMjU7SmhhbGFrYXRpIHppbGE7MDswOzAKK0JEO0JELTIzO0poZW5haWRhaCB6aWxhOzA7MDs0CitCRDtCRC0yOTtLaGFncmFjaGFyaSB6aWxhOzA7MDsyCitCRDtCRC0yNztLaHVsbmEgemlsYTswOzA7NAorQkQ7QkQtMjY7S2lzaG9yZWdhbmogemlsYTswOzA7MworQkQ7QkQtMjg7S3VyaWdyYW0gemlsYTswOzA7NQorQkQ7QkQtMzA7S3VzaHRpYSB6aWxhOzA7MDs0CitCRDtCRC0zO0xha3NobWlwdXIgemlsYTswOzA7MgorQkQ7QkQtMzI7TGFsbW9uaXJoYXQgemlsYTswOzA7NQorQkQ7QkQtMzY7TWFkYXJpcHVyIHppbGE7MDswOzMKK0JEO0JELTM3O01hZ3VyYSB6aWxhOzA7MDs0CitCRDtCRC0zMztNYW5pa2dhbmogemlsYTswOzA7MworQkQ7QkQtMzk7TWVoZXJwdXIgemlsYTswOzA7NAorQkQ7QkQtMzg7TW91bHZpYmF6YXIgemlsYTswOzA7NgorQkQ7QkQtMzU7TXVuc2hpZ2FuaiB6aWxhOzA7MDszCitCRDtCRC0zNDtNeW1lbnNpbmdoIHppbGE7MDswOzMKK0JEO0JELTQ4O05hb2dhb24gemlsYTswOzA7NQorQkQ7QkQtNDM7TmFyYWlsIHppbGE7MDswOzQKK0JEO0JELTQwO05hcmF5YW5nYW5qIHppbGE7MDswOzMKK0JEO0JELTQyO05hcnNpbmdkaSB6aWxhOzA7MDszCitCRDtCRC00NDtOYXRvcmUgemlsYTswOzA7NQorQkQ7QkQtNDU7TmF3YWJnYW5qIHppbGE7MDswOzUKK0JEO0JELTQ7TmV0cmFrb25hIHppbGE7MDswOzMKK0JEO0JELTQ2O05pbHBoYW1hcmkgemlsYTswOzA7NQorQkQ7QkQtNDc7Tm9ha2hhbGkgemlsYTswOzA7MgorQkQ7QkQtNDk7UGFibmEgemlsYTswOzA7NQorQkQ7QkQtNTI7UGFuY2hhZ2FyaCB6aWxhOzA7MDs1CitCRDtCRC01O1BhdHVha2hhbGkgemlsYTswOzA7MAorQkQ7QkQtNTA7UGlyb2pwdXIgemlsYTswOzA7MAorQkQ7QkQtNTM7UmFqYmFyaSB6aWxhOzA7MDszCitCRDtCRC01NDtSYWpzaGFoaSB6aWxhOzA7MDs1CitCRDtCRC01NjtSYW5nYW1hdGkgemlsYTswOzA7MgorQkQ7QkQtNTU7UmFuZ3B1ciB6aWxhOzA7MDs1CitCRDtCRC01ODtTYXRraGlyYSB6aWxhOzA7MDs0CitCRDtCRC02MjtTaGFyaWF0cHVyIHppbGE7MDswOzMKK0JEO0JELTU3O1NoZXJwdXIgemlsYTswOzA7MworQkQ7QkQtNTk7U2lyYWpnYW5qIHppbGE7MDswOzUKK0JEO0JELTY7U3VuYW1nYW5qIHppbGE7MDswOzYKK0JEO0JELTYwO1N5bGhldCB6aWxhOzA7MDs2CitCRDtCRC02MztUYW5nYWlsIHppbGE7MDswOzMKK0JEO0JELTY0O1RoYWt1cmdhb24gemlsYTswOzA7NQorQkU7QkUtVkFOO0FudHdlcnBlbjswOzA7VkxHCitCRTtCRS1XQlI7QnJhYmFudCBXYWxsb247MDswO1dBTAorQkU7QkUtV0hUO0hhaW5hdXQ7MDswO1dBTAorQkU7QkUtV0xHO0xpZWdlOzA7MDtXQUwKK0JFO0JFLVZMSTtMaW1idXJnOzA7MDtWTEcKK0JFO0JFLVdMWDtMdXhlbWJvdXJnOzA7MDtXQUwKK0JFO0JFLVdOQTtOYW11cjswOzA7V0FMCitCRTtCRS1WT1Y7T29zdC1WbGFhbmRlcmVuOzA7MDtWTEcKK0JFO0JFLVZCUjtWbGFhbXMgQnJhYmFudDswOzA7VkxHCitCRTtCRS1WV1Y7V2VzdC1WbGFhbmRlcmVuOzA7MDtWTEcKK0JGO0JGLUJBTDtCYWxlOzA7MDswCitCRjtCRi1CQU07QmFtOzA7MDswCitCRjtCRi1CQU47QmFud2E7MDswOzAKK0JGO0JGLUJBWjtCYXplZ2E7MDswOzAKK0JGO0JGLUJHUjtCb3Vnb3VyaWJhOzA7MDswCitCRjtCRi1CTEc7Qm91bGdvdTswOzA7MAorQkY7QkYtQkxLO0JvdWxraWVtZGU7MDswOzAKK0JGO0JGLUNPTTtDb21vZTswOzA7MAorQkY7QkYtR0FOO0dhbnpvdXJnb3U7MDswOzAKK0JGO0JGLUdOQTtHbmFnbmE7MDswOzAKK0JGO0JGLUdPVTtHb3VybWE7MDswOzAKK0JGO0JGLUhPVTtIb3VldDswOzA7MAorQkY7QkYtSU9CO0lvYmE7MDswOzAKK0JGO0JGLUtBRDtLYWRpb2dvOzA7MDswCitCRjtCRi1LRU47S2VuZWRvdWdvdTswOzA7MAorQkY7QkYtS01EO0tvbW9uZGphcmk7MDswOzAKK0JGO0JGLUtNUDtLb21waWVuZ2E7MDswOzAKK0JGO0JGLUtPUztLb3NzaTswOzA7MAorQkY7QkYtS09QO0tvdWxwZWxvZ287MDswOzAKK0JGO0JGLUtPVDtLb3VyaXRlbmdhOzA7MDswCitCRjtCRi1LT1c7S291cndlb2dvOzA7MDswCitCRjtCRi1MRVI7TGVyYWJhOzA7MDswCitCRjtCRi1MT1I7TG9yb3VtOzA7MDswCitCRjtCRi1NT1U7TW91aG91biBbTW91IEhvdW5dOzA7MDswCitCRjtCRi1OQU87TmFob3VyaTswOzA7MAorQkY7QkYtTkFNO05hbWVudGVuZ2E7MDswOzAKK0JGO0JGLU5BWTtOYXlhbGE7MDswOzAKK0JGO0JGLU5PVTtOb3VtYmllbDswOzA7MAorQkY7QkYtT1VCO091YnJpdGVuZ2E7MDswOzAKK0JGO0JGLU9VRDtPdWRhbGFuOzA7MDswCitCRjtCRi1QQVM7UGFzc29yZTswOzA7MAorQkY7QkYtUE9OO1Bvbmk7MDswOzAKK0JGO0JGLVNORztTYW5ndWllOzA7MDswCitCRjtCRi1TTVQ7U2FubWF0ZW5nYTswOzA7MAorQkY7QkYtU0VOO1Nlbm87MDswOzAKK0JGO0JGLVNJUztTaXNzaWxpOzA7MDswCitCRjtCRi1TT007U291bTswOzA7MAorQkY7QkYtU09SO1NvdXJvdTswOzA7MAorQkY7QkYtVEFQO1RhcG9hOzA7MDswCitCRjtCRi1UVUk7VHVpOzA7MDswCitCRjtCRi1ZQUc7WWFnaGE7MDswOzAKK0JGO0JGLVlBVDtZYXRlbmdhOzA7MDswCitCRjtCRi1aSVI7WmlybzswOzA7MAorQkY7QkYtWk9OO1pvbmRvbWE7MDswOzAKK0JGO0JGLVpPVTtab3VuZHdlb2dvOzA7MDswCitCRztCRy0wO0JsYWdvZXZncmFkOzA7MDswCitCRztCRy0wMjtCdXJnYXM7MDswOzAKK0JHO0JHLTA4O0RvYnJpZTswOzA7MAorTUE7TUEtRklHO0ZpZ3VpZzswOzA7MDQKK01BO01BLUdVRTtHdWVsbWltOzA7MDs0CitNQTtNQS1JRlI7SWZyYW5lOzA7MDswNgorTUE7TUEtSlJBO0plcmFkYTswOzA7MDQKK01BO01BLUtFUztLZWxhYXQgU3JhZ2huYTswOzA7MAorTUE7TUEtS0VOO0tlbml0cmE7MDswOzAyCitNQTtNQS1LSEU7S2hlbWlzc2V0OzA7MDswNworTUE7TUEtS0hOO0toZW5pZnJhOzA7MDswNgorTUE7TUEtS0hPO0tob3VyaWJnYTswOzA7MDkKK01BO01BLUxBQTtMYWF5b3VuZTswOzA7NQorTUE7TUEtTEFSO0xhcmFjaGU7MDswOzAKK01BO01BLU1BUjtNYXJyYWtlY2g7MDswOzAKK01BO01BLU1FSztNZWtuZXM7MDswOzA2CitNQTtNQS1OQUQ7TmFkb3I7MDswOzA0CitNQTtNQS1PVUE7T3VhcnphemF0ZTswOzA7MworTUE7TUEtT1VEO091ZWQgZWQgRGFoYWI7MDswOzYKK01BO01BLU9VSjtPdWpkYTswOzA7MDQKK01BO01BLVJCQTtSYWJhdC1TYWxlOzA7MDswNworTUE7TUEtU0FGO1NhZmk7MDswOzAKK01BO01BLVNFRjtTZWZyb3U7MDswOzA1CitNQTtNQS1TRVQ7U2V0dGF0OzA7MDswOQorTUE7TUEtU0lLO1NpZGkgS2FjZW07MDswOzAyCitNQTtNQS1UTkc7VGFuZ2VyOzA7MDswCitNQTtNQS1UTlQ7VGFuLVRhbjswOzA7NAorTUE7TUEtVEFPO1Rhb3VuYXRlOzA7MDswOzMKK01BO01BLVRBUjtUYXJvdWRhbm50OzA7MDszCitNQTtNQS1UQVQ7VGF0YTswOzA7NDsKK01BO01BLVRBWjtUYXphOzA7MDswMzsKK01BO01BLVRFVDtUZXRvdWFuOzA7MDswCitNQTtNQS1USVo7VGl6bml0OzA7MDszCitNRDtNRC1HQTtHZ3V6aWEsIFVuaXRhdGUgVGVyaXRvcmlhbCBBdXRvbm9tOzA7MDswYXV0b25vbW91cyB0ZXJyaXRvcnkKK01EO01ELUNVO0NoaWludTswOzA7MDtjaXR5CitNRDtNRC1TTjtTdGluZ2EgTmlzdHJ1bHVpLCB1bml0YXRlYSB0ZXJpdG9yaWFsIGRpbjswOzA7MHRlcnJpdG9yaWFsIHVuaXQKK01EO01ELUJBO0JsaTswOzA7MDtkaXN0cmljdAorTUQ7TUQtQ0E7Q2FodWw7MDswOzA7ZGlzdHJpY3QKK01EO01ELUNIO0NoaWludTswOzA7MDtkaXN0cmljdAorTUQ7TUQtRUQ7RWRpbmU7MDswOzA7ZGlzdHJpY3QKK01EO01ELUxBO0xwdW5hOzA7MDswO2Rpc3RyaWN0CitNRDtNRC1PUjtPcmhlaTswOzA7MDtkaXN0cmljdAorTUQ7TUQtU087U29yb2NhOzA7MDswO2Rpc3RyaWN0CitNRDtNRC1USTtUaWdoaW5hIFtCZW5kZXJdOzA7MDswO2Rpc3RyaWN0CitNRDtNRC1VTjtVbmdoZW5pOzA7MDswO2Rpc3RyaWN0CitNRztNRy1UO0FudGFuYW5hcml2bzswOzA7MAorTUc7TUctRDtBbnRzaXJhbmFuYTswOzA7MAorTUc7TUctRjtGaWFuYXJhbnRzb2E7MDswOzAKK01HO01HLU07TWFoYWphbmdhOzA7MDswCitNRztNRy1BO1RvYW1hc2luYTswOzA7MAorTUc7TUctVTtUb2xpYXJhOzA7MDswCitNSDtNSC1BTEw7QWlsaW5nbGFwYWxhcDswOzA7TAorTUg7TUgtQUxLO0FpbHVrOzA7MDtUCitNSDtNSC1BUk47QXJubzswOzA7VAorTUg7TUgtQVVSO0F1cjswOzA7VAorTUg7TUgtRUJPO0Vib247MDswO0wKK01IO01ILUVOSTtFbml3ZXRvazswOzA7TAorTUg7TUgtSkFMO0phbHVpdDswOzA7TAorTUg7TUgtS0lMO0tpbGk7MDswO0wKK01IO01ILUtXQTtLd2FqYWxlaW47MDswO0wKK01IO01ILUxBRTtMYWU7MDswO0wKK01IO01ILUxJQjtMaWI7MDswO0wKK01IO01ILUxJSztMaWtpZXA7MDswO1QKK01IO01ILU1BSjtNYWp1cm87MDswO1QKK01IO01ILU1BTDtNYWxvZWxhcDswOzA7VAorTUg7TUgtTUVKO01laml0OzA7MDtUCitNSDtNSC1NSUw7TWlsaTswOzA7VAorTUg7TUgtTk1LO05hbW9yaWs7MDswO0wKK01IO01ILU5NVTtOYW11OzA7MDtMCitNSDtNSC1ST047Um9uZ2VsYXA7MDswO0wKK01IO01ILVVKQTtVamFlOzA7MDtMCitNSDtNSC1VSkw7VWplbGFuZzswOzA7TAorTUg7TUgtVVRJO1V0aXJpazswOzA7VAorTUg7TUgtV1RIO1dvdGhvOzA7MDtMCitNSDtNSC1XVEo7V290amU7MDswO1QKK0JHO0JHLTA3O0dhYnJvdm87MDswOzAKK0JHO0JHLTI2O0hhc2tvdm87MDswOzAKK0JHO0JHLTI4O0phbWJvbDswOzA7MAorQkc7QkctMDk7S3JkYWxpOzA7MDswCitCRztCRy0wO0tqdXN0ZW5kaWw7MDswOzAKK0JHO0JHLTtMb3ZlZTswOzA7MAorQkc7QkctMjtNb250YW5hOzA7MDswCitCRztCRy0zO1BhemFyZGlrOzA7MDswCitCRztCRy00O1Blcm5pazswOzA7MAorQkc7QkctNTtQbGV2ZW47MDswOzAKK0JHO0JHLTY7UGxvdmRpdjswOzA7MAorQkc7QkctNztSYXpncmFkOzA7MDswCitCRztCRy04O1J1c2U7MDswOzAKK0JHO0JHLTk7U2lsaXN0cmE7MDswOzAKK0JHO0JHLTIwO1NsaXZlbjswOzA7MAorQkc7QkctMjtTbW9samFuOzA7MDswCitCRztCRy0yMztTb2ZpamE7MDswOzAKK0JHO0JHLTIyO1NvZmlqYS1HcmFkOzA7MDswCitCRztCRy0yNDtTdGFyYSBaYWdvcmE7MDswOzAKK0JHO0JHLTI3O3VtZW47MDswOzAKK0JHO0JHLTI1O1RyZ292aXRlOzA7MDswCitCRztCRy0wMztWYXJuYTswOzA7MAorQkc7QkctMDQ7VmVsaWtvIFRybm92bzswOzA7MAorQkc7QkctMDU7VmlkaW47MDswOzAKK0JHO0JHLTA2O1ZyYWNhOzA7MDswCitCSDtCSC0wO0FsIGFkZDswOzA7MAorQkg7QkgtMDM7QWwgTWFubWFoOzA7MDswCitCSDtCSC0wO0FsIE1pbmFxYWggYWwgR2hhcmJ5YWg7MDswOzAKK0JIO0JILTA3O0FsIE1pbmFxYWggYWwgV3VzOzA7MDswCitCSDtCSC0wNTtBbCBNaW5hcWFoIGFzaCBTaGFtbHlhaDswOzA7MAorQkg7QkgtMDI7QWwgTXVhcnJhcTswOzA7MAorQkg7QkgtMDk7QXIgUmlmOzA7MDswCitCSDtCSC0wNDtKaWRkIGFmOzA7MDswCitCSDtCSC0yO01hZG5hdCBhbWFkOzA7MDswCitCSDtCSC0wODtNYWRuYXQgczswOzA7MAorQkg7QkgtMTA7TWluYXFhdCBKdXp1ciBhd3I7MDswOzAKK0JIO0JILTA2O1NpdHJhaDswOzA7MAorQkk7QkktQkI7QnViYW56YTswOzA7MAorQkk7QkktQko7QnVqdW1idXJhOzA7MDswCitCSTtCSS1CUjtCdXJ1cmk7MDswOzAKK0JJO0JJLUNBO0Nhbmt1em87MDswOzAKK0JJO0JJLUNJO0NpYml0b2tlOzA7MDswCitCSTtCSS1HSTtHaXRlZ2E7MDswOzAKK0JJO0JJLUtSO0thcnV6aTswOzA7MAorQkk7QkktS1k7S2F5YW56YTswOzA7MAorQkk7QkktS0k7S2lydW5kbzswOzA7MAorQkk7QkktTUE7TWFrYW1iYTswOzA7MAorQkk7QkktTVU7TXVyYW12eWE7MDswOzAKK0JJO0JJLU1ZO011eWluZ2E7MDswOzAKK0JJO0JJLU5HO05nb3ppOzA7MDswCitCSTtCSS1SVDtSdXRhbmE7MDswOzAKK0JJO0JJLVJZO1J1eWlnaTswOzA7MAorQko7QkotQUw7QWxpYm9yaTswOzA7MAorQko7QkotQUs7QXRha29yYTswOzA7MAorQko7QkotQVE7QXRsYW50aXF1ZTswOzA7MAorQko7QkotQk87Qm9yZ291OzA7MDswCitCSjtCSi1DTztDb2xsaW5lczswOzA7MAorQko7QkotRE87RG9uZ2E7MDswOzAKK0JKO0JKLUtPO0tvdWZmbzswOzA7MAorQko7QkotTEk7TGl0dG9yYWw7MDswOzAKK0JKO0JKLU1PO01vbm87MDswOzAKK0JKO0JKLU9VO091ZW1lOzA7MDswCitCSjtCSi1QTDtQbGF0ZWF1OzA7MDswCitCSjtCSi1aTztab3U7MDswOzAKK0JOO0JOLUJFO0JlbGFpdDswOzA7MAorQk47Qk4tQk07QnJ1bmVpLU11YXJhOzA7MDswCitCTjtCTi1URTtUZW1idXJvbmc7MDswOzAKK0JOO0JOLVRVO1R1dG9uZzswOzA7MAorQk87Qk8tQztDb2NoYWJhbWJhOzA7MDswCitCTztCTy1IO0NodXF1aXNhY2E7MDswOzAKK0JPO0JPLUI7RWwgQmVuaTswOzA7MAorQk87Qk8tTDtMYSBQYXo7MDswOzAKK0JPO0JPLU87T3J1cm87MDswOzAKK0JPO0JPLU47UGFuZG87MDswOzAKK0JPO0JPLVA7UG90b3M7MDswOzAKK0JPO0JPLVM7U2FudGEgQ3J1ejswOzA7MAorQk87Qk8tVDtUYXJpamE7MDswOzAKK0JSO0JSLURGO0Rpc3RyaXRvIEZlZGVyYWw7MDswOzA7ZmVkZXJhbCBkaXN0cmljdAorQlI7QlItQUM7QWNyZTswOzA7MHN0YXRlCitCUjtCUi1BTDtBbGFnb2FzOzA7MDswc3RhdGUKK0JSO0JSLUFQO0FtYXA7MDswOzBzdGF0ZQorQlI7QlItQU07QW1hem9uYXM7MDswOzBzdGF0ZQorQlI7QlItQkE7QmFoaWE7MDswOzBzdGF0ZQorQlI7QlItQ0U7Q2VhcjswOzA7MHN0YXRlCitCUjtCUi1FUztFc3ByaXRvIFNhbnRvOzA7MDswc3RhdGUKK0JSO0JSLUdPO0dvaXM7MDswOzBzdGF0ZQorQlI7QlItTUE7TWFyYW5obzswOzA7MHN0YXRlCitCUjtCUi1NVDtNYXRvIEdyb3NzbzswOzA7MHN0YXRlCitCUjtCUi1NUztNYXRvIEdyb3NzbyBkbyBTdWw7MDswOzBzdGF0ZQorQlI7QlItTUc7TWluYXMgR2VyYWlzOzA7MDswc3RhdGUKK0JSO0JSLVBBO1BhcjswOzA7MHN0YXRlCitCUjtCUi1QQjtQYXJhYmE7MDswOzBzdGF0ZQorQlI7QlItUFI7UGFyYW47MDswOzBzdGF0ZQorQlI7QlItUEU7UGVybmFtYnVjbzswOzA7MHN0YXRlCitCUjtCUi1QSTtQaWF1aTswOzA7MHN0YXRlCitCUjtCUi1SSjtSaW8gZGUgSmFuZWlybzswOzA7MHN0YXRlCitCUjtCUi1STjtSaW8gR3JhbmRlIGRvIE5vcnRlOzA7MDswc3RhdGUKK0JSO0JSLVJTO1JpbyBHcmFuZGUgZG8gU3VsOzA7MDswc3RhdGUKK0JSO0JSLVJPO1JvbmRvbmlhOzA7MDswc3RhdGUKK0JSO0JSLVJSO1JvcmFpbWE7MDswOzBzdGF0ZQorQlI7QlItU0M7U2FudGEgQ2F0YXJpbmE7MDswOzBzdGF0ZQorQlI7QlItU1A7U28gUGF1bG87MDswOzBzdGF0ZQorQlI7QlItU0U7U2VyZ2lwZTswOzA7MHN0YXRlCitCUjtCUi1UTztUb2NhbnRpbnM7MDswOzBzdGF0ZQorQlM7QlMtQUM7QWNrbGlucyBhbmQgQ3Jvb2tlZCBJc2xhbmRzOzA7MDswCitCUztCUy1CSTtCaW1pbmk7MDswOzAKK0JTO0JTLUNJO0NhdCBJc2xhbmQ7MDswOzAKK0JTO0JTLUVYO0V4dW1hOzA7MDswCitCUztCUy1GUDtGcmVlcG9ydDswOzA7MAorQlM7QlMtRkM7RnJlc2ggQ3JlZWs7MDswOzAKK0JTO0JTLUdIO0dvdmVybm9ycyBIYXJib3VyOzA7MDswCitCUztCUy1HVDtHcmVlbiBUdXJ0bGUgQ2F5OzA7MDswCitCUztCUy1ISTtIYXJib3VyIElzbGFuZDswOzA7MAorQlM7QlMtSFI7SGlnaCBSb2NrOzA7MDswCitCUztCUy1JTjtJbmFndWE7MDswOzAKK0JTO0JTLUtCO0tlbXBzIEJheTswOzA7MAorQlM7QlMtTEk7TG9uZyBJc2xhbmQ7MDswOzAKK0JTO0JTLU1IO01hcnNoIEhhcmJvdXI7MDswOzAKK0JTO0JTLU1HO01heWFndWFuYTswOzA7MAorQlM7QlMtTlA7TmV3IFByb3ZpZGVuY2U7MDswOzAKK0JTO0JTLU5CO05pY2hvbGxzIFRvd24gYW5kIEJlcnJ5IElzbGFuZHM7MDswOzAKK0JTO0JTLVJJO1JhZ2dlZCBJc2xhbmQ7MDswOzAKK0JTO0JTLVJTO1JvY2sgU291bmQ7MDswOzAKK0JTO0JTLVNQO1NhbmR5IFBvaW50OzA7MDswCitCUztCUy1TUjtTYW4gU2FsdmFkb3IgYW5kIFJ1bSBDYXk7MDswOzAKK0JUO0JULTMzO0J1bXRoYW5nOzA7MDswCitCVDtCVC0yO0NoaHVraGE7MDswOzAKK0JUO0JULTIyO0RhZ2FuYTswOzA7MAorQlQ7QlQtR0E7R2FzYTswOzA7MAorQlQ7QlQtMztIYTswOzA7MAorQlQ7QlQtNDQ7TGh1ZW50c2U7MDswOzAKK0JUO0JULTQyO01vbmdnYXI7MDswOzAKK0JUO0JULTM0O1Bhcm87MDswOzAKK0JUO0JULTQzO1BlbWFnYXRzaGVsOzA7MDswCitCVDtCVC0yMztQdW5ha2hhOzA7MDswCitCVDtCVC00NTtTYW1kcnVwIEpvbmdraGE7MDswOzAKK0JUO0JULTQ7U2FtdHNlOzA7MDswCitCVDtCVC0zNjtTYXJwYW5nOzA7MDswCitCVDtCVC01O1RoaW1waHU7MDswOzAKK0JUO0JULTM1O1RyYXNoaWdhbmc7MDswOzAKK0JUO0JULVRZO1RyYXNoaSBZYW5ndHNlOzA7MDswCitCVDtCVC0zMjtUcm9uZ3NhOzA7MDswCitCVDtCVC0zODtUc2lyYW5nOzA7MDswCitCVDtCVC0yNDtXYW5nZHVlIFBob2RyYW5nOzA7MDswCitCVDtCVC0zNztaaGVtZ2FuZzswOzA7MAorQlc7QlctQ0U7Q2VudHJhbDswOzA7MAorQlc7QlctR0g7R2hhbnppOzA7MDswCitCVztCVy1LRztLZ2FsYWdhZGk7MDswOzAKK0JXO0JXLUtMO0tnYXRsZW5nOzA7MDswCitCVztCVy1LVztLd2VuZW5nOzA7MDswCitCVztCVy1OVztOb3J0aC1XZXN0OzA7MDswCitCVztCVy1ORTtOb3J0aC1FYXN0OzA7MDswCitCVztCVy1TRTtTb3V0aC1FYXN0OzA7MDswCitCVztCVy1TTztTb3V0aGVybjswOzA7MAorQlk7QlktQlI7QnJlc3Rza2F5YSB2b2JsYXN0cyBbQnJlc3Rza2F5YSBvYmxhc3RdO0JyZXNja2FqYSB2b2JsYXNjIFtCcmVzdHNrYWphIG9ibGFzdF07MDswCitCWTtCWS1ITztIb215ZWxza2F5YSB2b2JsYXN0cyBbR29tZWxza2F5YSBvYmxhc3RdO0hvbWVsc2thamEgdm9ibGFzYyBbR29tZWxza2FqYSBvYmxhc3RdOzA7MAorQlk7QlktSFI7SHJvZHplbnNrYXlhIHZvYmxhc3RzIFtHcm9kbmVuc2theWEgb2JsYXN0XTtIcm9kemVuc2thamEgdm9ibGFzYyBbR3JvZG5lbnNrYWphIG9ibGFzdF07MDswCitCWTtCWS1NQTtNYWhpbHlvd3NrYXlhIHZvYmxhc3RzIFtNb2dpbGV2c2theWEgb2JsYXN0XTtNYWhpbGV1c2thamEgdm9ibGFzYyBbTW9naWxldnNrYWphIG9ibGFzdF07MDswCitCWTtCWS1NSTtNaW5za2F5YSB2b2JsYXN0cyBbTWluc2theWEgb2JsYXN0XTtNaW5za2FqYSB2b2JsYXNjIFtNaW5za2FqYSBvYmxhc3RdOzA7MAorQlk7QlktVkk7Vml0c3llYnNrYXlhIHZvYmxhc3RzIFtWaXRlYnNrYXlhIG9ibGFzdF07VmljZWJza2FqYSB2b2JsYXNjIFtWaXRlYnNrYWphIG9ibGFzdF07MDswCitCWjtCWi1CWjtCZWxpemU7MDswOzAKK0JaO0JaLUNZO0NheW87MDswOzAKK0JaO0JaLUNaTDtDb3JvemFsOzA7MDswCitCWjtCWi1PVztPcmFuZ2UgV2FsazswOzA7MAorQlo7QlotU0M7U3Rhbm4gQ3JlZWs7MDswOzAKK0JaO0JaLVRPTDtUb2xlZG87MDswOzAKK0NBO0NBLUFCO0FsYmVydGE7MDswO3Byb3ZpbmNlCitDQTtDQS1CQztCcml0aXNoIENvbHVtYmlhO0NvbG9tYmllLUJyaXRhbm5pcXVlOzA7MDtwcm92aW5jZQorQ0E7Q0EtTUI7TWFuaXRvYmE7MDswO3Byb3ZpbmNlCitDQTtDQS1OQjtOZXcgQnJ1bnN3aWNrO05vdXZlYXUtQnJ1bnN3aWNrOzA7MDtwcm92aW5jZQorQ0E7Q0EtTkw7TmV3Zm91bmRsYW5kIGFuZCBMYWJyYWRvcjtUZXJyZS1OZXV2ZS1ldC1MYWJyYWRvcjswOzA7cHJvdmluY2UKK0NBO0NBLU5TO05vdmEgU2NvdGlhO05vdXZlbGxlLWNvc3NlOzA7MDtwcm92aW5jZQorQ0E7Q0EtT047T250YXJpbzswOzA7cHJvdmluY2UKK0NBO0NBLVBFO1ByaW5jZSBFZHdhcmQgSXNsYW5kO2xlLWR1LVByaW5jZS1kb3VhcmQ7MDswO3Byb3ZpbmNlCitDQTtDQS1RQztRdWViZWM7UXVlYmVjOzA7MDtwcm92aW5jZQorQ0E7Q0EtU0s7U2Fza2F0Y2hld2FuOzA7MDtwcm92aW5jZQorQ0E7Q0EtTlQ7Tm9ydGh3ZXN0IFRlcnJpdG9yaWVzO1RlcnJpdG9pcmVzIGR1IE5vcmQtT3Vlc3Q7MDswO3RlcnJpdG9yeQorQ0E7Q0EtTlU7TnVuYXZ1dDswOzA7MDt0ZXJyaXRvcnkKK0NBO0NBLVlUO1l1a29uIFRlcnJpdG9yeTtUZXJyaXRvaXJlIGR1IFl1a29uOzA7MDt0ZXJyaXRvcnkKK0NEO0NELUtOO0tpbnNoYXNhOzA7MDswO2NpdHkKK0NEO0NELUJOO0JhbmR1bmR1OzA7MDtwcm92aW5jZQorQ0Q7Q0QtQkM7QmFzLUNvbmdvOzA7MDtwcm92aW5jZQorQ0Q7Q0QtRVE7cXVhdGV1cjswOzA7cHJvdmluY2UKK0NEO0NELUtXO0thc2FpLU9jY2lkZW50YWw7MDswO3Byb3ZpbmNlCitDRDtDRC1LRTtLYXNhaS1PcmllbnRhbDswOzA7cHJvdmluY2UKK0NEO0NELUtBO0thdGFuZ2E7MDswO3Byb3ZpbmNlCitDRDtDRC1NQTtNYW5pZW1hOzA7MDtwcm92aW5jZQorQ0Q7Q0QtTks7Tm9yZC1LaXZ1OzA7MDtwcm92aW5jZQorQ0Q7Q0QtT1I7T3JpZW50YWxlOzA7MDtwcm92aW5jZQorQ0Q7Q0QtU0s7U3VkLUtpdnU7MDswO3Byb3ZpbmNlCitDRjtDRi1CR0Y7QmFuZ3VpOzA7MDswO2NhcGl0YWwKK0NGO0NGLUJCO0JhbWluZ3VpLUJhbmdvcmFuIFtCYW1pbmd1aS1CYW5nb3JhXTswOzA7MHByZWZlY3R1cmUKK0NGO0NGLUJLO0Jhc3NlLUtvdHRvOzA7MDswcHJlZmVjdHVyZQorQ0Y7Q0YtSEs7SGF1dGUtS290dG87MDswOzBwcmVmZWN0dXJlCitDRjtDRi1ITTtIYXV0LU1ib21vdTswOzA7MHByZWZlY3R1cmUKK0NGO0NGLUtHO0tlbW87MDswOzBwcmVmZWN0dXJlCitDRjtDRi1MQjtMb2JheWU7MDswOzBwcmVmZWN0dXJlCitDRjtDRi1IUztNYW1iZXJlLUthZGVpOzA7MDswcHJlZmVjdHVyZQorQ0Y7Q0YtTUI7TWJvbW91OzA7MDswcHJlZmVjdHVyZQorQ0Y7Q0YtS0I7TmFuYS1HcmViaXppIFtOYW5hLUdyaWJpbmd1aV07MDswOzBwcmVmZWN0dXJlCitDRjtDRi1OTTtOYW5hLU1hbWJlcmU7MDswOzBwcmVmZWN0dXJlCitDRjtDRi1NUDtPbWJlbGxhLU1wb2tvOzA7MDswcHJlZmVjdHVyZQorQ0Y7Q0YtVUs7T3Vha2E7MDswOzBwcmVmZWN0dXJlCitDRjtDRi1BQztPdWhhbTswOzA7MHByZWZlY3R1cmUKK0NGO0NGLU9QO091aGFtLVBlbmRlOzA7MDswcHJlZmVjdHVyZQorI0NGO0NGLVNFO1NhbmdoYS1NYmFlcmUgW1NhbmdoYTFdIFtTYW5naGFdOzA7MDswcHJlZmVjdHVyZQorQ0Y7Q0YtU0U7U2FuZ2hhMTswOzA7MHByZWZlY3R1cmUKK0NGO0NGLVZLO1Zha2FnYTswOzA7MHByZWZlY3R1cmUKK0NHO0NHLUJaVjtCcmF6emF2aWxsZTswOzA7MDtjYXBpdGFsCitDRztDRy0xMDtCb3VlbnphOzA7MDtyZWdpb24KK0NHO0NHLTg7Q3V2ZXR0ZTswOzA7cmVnaW9uCitDRztDRy01O0N1dmV0dGUtT3Vlc3Q7MDswO3JlZ2lvbgorQ0c7Q0ctMTQ7S291aWxvdTswOzA7cmVnaW9uCitDRztDRy0yO0xla291bW91OzA7MDtyZWdpb24KK0NHO0NHLTc7TGlrb3VhbGE7MDswO3JlZ2lvbgorQ0c7Q0ctOTtOaWFyaTswOzA7cmVnaW9uCitDRztDRy00O1BsYXRlYXV4IFtQbGF0ZWF1eDFdOzA7MDtyZWdpb24KK0NHO0NHLTEyO1Bvb2w7MDswO3JlZ2lvbgorQ0c7Q0ctMztTYW5naGE7MDswO3JlZ2lvbgorQ0g7Q0gtQUc7QWFyZ2F1OzA7MDswCitDSDtDSC1BUjtBcHBlbnplbGwgQXVzc2VycmhvZGVuOzA7MDswCitDSDtDSC1BSTtBcHBlbnplbGwgSW5uZXJyaG9kZW47MDswOzAKK0NIO0NILUJMO0Jhc2VsLUxhbmRzY2hhZnQ7MDswOzAKK0NIO0NILUJTO0Jhc2VsLVN0YWR0OzA7MDswCitDSDtDSC1CRTtCZXJuO0Jlcm5lOzA7MAorQ0g7Q0gtRlI7RnJpYm91cmcgO0ZyZWlidXJnIDswOzAKK0NIO0NILUdFO0dlbmV2ZSA7MDswOzAKK0NIO0NILUdMO0dsYXJ1cyA7MDswOzAKK0NIO0NILUdSO0dyYXVi/G5kZW4gO0dyaWdpb25pIChpdCk7MDswCitDSDtDSC1KVTtKdXJhIDswOzA7MAorQ0g7Q0gtTFU7THV6ZXJuIDswOzA7MAorQ0g7Q0gtTkU7TmV1Y2hhdGVsOzA7MDswCitDSDtDSC1OVztOaWR3YWxkZW4gOzA7MDswCitDSDtDSC1PVztPYndhbGRlbiA7MDswOzAKK0NIO0NILVNHO1Nhbmt0IEdhbGxlbiA7MDswOzAKK0NIO0NILVNIO1NjaGFmZmhhdXNlbiA7MDswOzAKK0NIO0NILVNaO1NjaHd5eiA7MDswOzAKK0NIO0NILVNPO1NvbG90aHVybiA7MDswOzAKK0NIO0NILVRHO1RodXJnYXUgOzA7MDswCitDSDtDSC1USTtUaWNpbm8gKGl0KTswOzA7MAorQ0g7Q0gtVVI7VXJpIDswOzA7MAorQ0g7Q0gtVlM7VmFsYWlzIDtXYWxsaXMgOzA7MAorQ0g7Q0gtVkQ7VmF1ZCA7MDswOzAKK0NIO0NILVpHO1p1ZyA7MDswOzAKK0NIO0NILVpIO1p1cmljaDswOzA7MAorQ0k7Q0ktMDY7OCBNb250YWduZXMgOzA7MDswCitDSTtDSS02O0FnbmViaSA7MDswOzAKK0NJO0NJLTA5O0Jhcy1TYXNzYW5kcmEgOzA7MDswCitDSTtDSS0wO0Rlbmd1ZWxlIDswOzA7MAorQ0k7Q0ktMDI7SGF1dC1TYXNzYW5kcmEgOzA7MDswCitDSTtDSS0wNztMYWNzIDswOzA7MAorQ0k7Q0ktMDtMYWd1bmVzIDswOzA7MAorQ0k7Q0ktMjtNYXJhaG91ZSA7MDswOzAKK0NJO0NJLTA1O01veWVuLUNvbW9lIDswOzA7MAorQ0k7Q0ktMTA7TnppLUNvbW9lIDswOzA7MAorQ0k7Q0ktMDM7U2F2YW5lcyA7MDswOzAKK0NJO0NJLTU7U3VkLUJhbmRhbWEgOzA7MDswCitDSTtDSS0zO1N1ZC1Db21vZSA7MDswOzAKK0NJO0NJLTA0O1ZhbGxlZSBkdSBCYW5kYW1hIDswOzA7MAorQ0k7Q0ktNDtXb3JvZG91Z291IDswOzA7MAorQ0k7Q0ktMDg7WmFuemFuIDswOzA7MAorQ0w7Q0wtQUk7QWlzZW4gZGVsIEdlbmVyYWwgQ2FybG9zIEliZXogZGVsIENhbXBvOzA7MDswCitDTDtDTC1BTjtBbnRvZmFnYXN0YTswOzA7MAorQ0w7Q0wtQVI7QXJhdWNhbmE7MDswOzAKK0NMO0NMLUFUO0F0YWNhbWE7MDswOzAKK0NMO0NMLUJJO0JvLUJvOzA7MDswCitDTDtDTC1DTztDb3F1aW1ibzswOzA7MAorQ0w7Q0wtTEk7TGliZXJ0YWRvciBHZW5lcmFsIEJlcm5hcmRvIE9IaWdnaW5zOzA7MDswCitDTDtDTC1MTDtMb3MgTGFnb3M7MDswOzAKK0NMO0NMLU1BO01hZ2FsbGFuZXM7MDswOzAKK0NMO0NMLU1MO01hdWxlOzA7MDswCitDTDtDTC1STTtSZWdpbiBNZXRyb3BvbGl0YW5hIGRlIFNhbnRpYWdvOzA7MDswCitDTDtDTC1UQTtUYXJhcGFjOzA7MDswCitDTDtDTC1WUztWYWxwYXJhc287MDswOzAKK0NNO0NNLUFEO0FkYW1hb3VhO0FkYW1hb3VhOzA7MDsKK0NNO0NNLUNFO0NlbnRyZTtDZW50cmU7MDswOworQ007Q00tRVM7RWFzdDtFc3Q7MDswOworQ007Q00tRU47RmFyIE5vcnRoO0V4dHJlbWUtTm9yZDswOzAKK0NNO0NNLUxUO0xpdHRvcmFsO0xpdHRvcmFsOzA7MAorQ007Q00tTk87Tm9ydGg7Tm9yZDswOzAKK0NNO0NNLU5XO05vcnRoLVdlc3Q7Tm9yZC1PdWVzdDswOzAKK0NNO0NNLVNVO1NvdXRoO1N1ZDswOzAKK0NNO0NNLVNXO1NvdXRoLVdlc3Q7U3VkLU91ZXN0OzA7MAorQ007Q00tT1U7V2VzdDtPdWVzdDswOzAKK0NOO0NOLTA7QmVpamluZzswOzA7MG11bmljaXBhbGl0eQorQ047Q04tNTA7Q2hvbmdxaW5nOzA7MDswbXVuaWNpcGFsaXR5CitDTjtDTi0zO1NoYW5naGFpOzA7MDswbXVuaWNpcGFsaXR5CitDTjtDTi0yO1RpYW5qaW47MDswOzBtdW5pY2lwYWxpdHkKK0NOO0NOLTM0O0FuaHVpOzA7MDtwcm92aW5jZQorQ047Q04tMzU7RnVqaWFuOzA7MDtwcm92aW5jZQorQ047Q04tNjI7R2Fuc3U7MDswO3Byb3ZpbmNlCitDTjtDTi00NDtHdWFuZ2Rvbmc7MDswO3Byb3ZpbmNlCitDTjtDTi01MjtHdWl6aG91OzA7MDtwcm92aW5jZQorQ047Q04tNDY7SGFpbmFuOzA7MDtwcm92aW5jZQorQ047Q04tNzM7SGViZWk7MDswO3Byb3ZpbmNlCitDTjtDTi0yMztIZWlsb25namlhbmc7MDswO3Byb3ZpbmNlCitDTjtDTi00O0hlbmFuOzA7MDtwcm92aW5jZQorQ047Q04tNDI7SHViZWk7MDswO3Byb3ZpbmNlCitDTjtDTi00MztIdW5hbjswOzA7cHJvdmluY2UKK0NOO0NOLTMyO0ppYW5nc3U7MDswO3Byb3ZpbmNlCitDTjtDTi0zNjtKaWFuZ3hpOzA7MDtwcm92aW5jZQorQ047Q04tMjI7SmlsaW47MDswO3Byb3ZpbmNlCitDTjtDTi03MjtMaWFvbmluZzswOzA7cHJvdmluY2UKK0NOO0NOLTYzO1FpbmdoYWk7MDswO3Byb3ZpbmNlCitDTjtDTi02O1NoYWFueGk7MDswO3Byb3ZpbmNlCitDTjtDTi0zNztTaGFuZG9uZzswOzA7cHJvdmluY2UKK0NOO0NOLTc0O1NoYW54aTswOzA7cHJvdmluY2UKK0NOO0NOLTU7U2ljaHVhbjswOzA7cHJvdmluY2UKK0NOO0NOLTc7VGFpd2FuIDswOzA7cHJvdmluY2UKK0NOO0NOLTUzO1l1bm5hbjswOzA7cHJvdmluY2UKK0NOO0NOLTMzO1poZWppYW5nOzA7MDtwcm92aW5jZQorQ047Q04tNDU7R3Vhbmd4aTswOzA7YXV0b25vbW91cyByZWdpb24KK0NOO0NOLTc1O05laSBNb25nb2wgKG1uKTswOzA7YXV0b25vbW91cyByZWdpb24KK0NOO0NOLTY0O05pbmd4aWE7MDswO2F1dG9ub21vdXMgcmVnaW9uCitDTjtDTi02NTtYaW5qaWFuZzswOzA7YXV0b25vbW91cyByZWdpb24KK0NOO0NOLTU0O1hpemFuZzswOzA7YXV0b25vbW91cyByZWdpb24KK0NOO0NOLTk7WGlhbmdnYW5nICh6aCkgO0hvbmcgS29uZyAoZW4pOzA7MDtzcGVjaWFsIGFkbWluaXN0cmF0aXZlIHJlZ2lvbgorQ047Q04tOTI7QW9tZW4gKHpoKSA7TWFjYW8gKGVuKTswOzA7c3BlY2lhbCBhZG1pbmlzdHJhdGl2ZSByZWdpb24KK0NPO0NPLURDO0Rpc3RyaXRvIENhcGl0YWwgZGUgQm9nb3Q7MDswOzA7Y2FwaXRhbCBkaXN0cmljdAorQ087Q08tQU1BO0FtYXpvbmFzOzA7MDswZGVwYXJ0bWVudAorQ087Q08tQU5UO0FudGlvcXVpYTswOzA7MGRlcGFydG1lbnQKK0NPO0NPLUFSQTtBcmF1Y2E7MDswOzBkZXBhcnRtZW50CitDTztDTy1BVEw7QXRsbnRpY287MDswOzBkZXBhcnRtZW50CitDTztDTy1CT0w7Qm9sdmFyOzA7MDswZGVwYXJ0bWVudAorQ087Q08tQk9ZO0JveWFjOzA7MDswZGVwYXJ0bWVudAorQ087Q08tQ0FMO0NhbGRhczswOzA7MGRlcGFydG1lbnQKK0NPO0NPLUNBUTtDYXF1ZXQ7MDswOzBkZXBhcnRtZW50CitDTztDTy1DQVM7Q2FzYW5hcmU7MDswOzBkZXBhcnRtZW50CitDTztDTy1DQVU7Q2F1Y2E7MDswOzBkZXBhcnRtZW50CitDTztDTy1DRVM7Q2VzYXI7MDswOzBkZXBhcnRtZW50CitDTztDTy1DT1I7Q3Jkb2JhOzA7MDswZGVwYXJ0bWVudAorQ087Q08tQ1VOO0N1bmRpbmFtYXJjYTswOzA7MGRlcGFydG1lbnQKK0NPO0NPLUNITztDaG9jOzA7MDswZGVwYXJ0bWVudAorQ087Q08tR1VBO0d1YWluYTswOzA7MGRlcGFydG1lbnQKK0NPO0NPLUdVVjtHdWF2aWFyZTswOzA7MGRlcGFydG1lbnQKK0NPO0NPLUhVSTtIdWlsYTswOzA7MGRlcGFydG1lbnQKK0NPO0NPLUxBRztMYSBHdWFqaXJhOzA7MDswZGVwYXJ0bWVudAorQ087Q08tTUFHO01hZ2RhbGVuYTswOzA7MGRlcGFydG1lbnQKK0NPO0NPLU1FVDtNZXRhOzA7MDswZGVwYXJ0bWVudAorQ087Q08tTkFSO05hcmlvOzA7MDswZGVwYXJ0bWVudAorQ087Q08tTlNBO05vcnRlIGRlIFNhbnRhbmRlcjswOzA7MGRlcGFydG1lbnQKK0NPO0NPLVBVVDtQdXR1bWF5bzswOzA7MGRlcGFydG1lbnQKK0NPO0NPLVFVSTtRdWluZG87MDswOzBkZXBhcnRtZW50CitDTztDTy1SSVM7UmlzYXJhbGRhOzA7MDswZGVwYXJ0bWVudAorQ087Q08tU0FQO1NhbiBBbmRyZXMsIFByb3ZpZGVuY2lhIHkgU2FudGEgQ2F0YWxpbmE7MDswOzBkZXBhcnRtZW50CitDTztDTy1TQU47U2FudGFuZGVyOzA7MDswZGVwYXJ0bWVudAorQ087Q08tU1VDO1N1Y3JlOzA7MDswZGVwYXJ0bWVudAorQ087Q08tVE9MO1RvbGltYTswOzA7MGRlcGFydG1lbnQKK0NPO0NPLVZBQztWYWxsZSBkZWwgQ2F1Y2E7MDswOzBkZXBhcnRtZW50CitDTztDTy1WQVU7VmF1cGVzOzA7MDswZGVwYXJ0bWVudAorQ087Q08tVklEO1ZpY2hhZGE7MDswOzBkZXBhcnRtZW50CitDUjtDUi1BO0FsYWp1ZWxhOzA7MDswCitDUjtDUi1DO0NhcnRhZ287MDswOzAKK0NSO0NSLUc7R3VhbmFjYXN0ZTswOzA7MAorQ1I7Q1ItSDtIZXJlZGlhOzA7MDswCitDUjtDUi1MO0xpbW47MDswOzAKK0NSO0NSLVA7UHVudGFyZW5hczswOzA7MAorQ1I7Q1ItU0o7U2FuIEpvc2U7MDswOzAKK0NVO0NVLTA5O0NhbWFn/GV5OzA7MDtwcm92aW5jZQorQ1U7Q1UtMDg7Q2llZ28gZGUgdmlsYTswOzA7cHJvdmluY2UKK0NVO0NVLTA2O0NpZW5mdWVnb3M7MDswO3Byb3ZpbmNlCitDVTtDVS0wMztDaXVkYWQgZGUgTGEgSGFiYW5hOzA7MDtwcm92aW5jZQorQ1U7Q1UtMjtHcmFubWE7MDswO3Byb3ZpbmNlCitDVTtDVS00O0d1YW50bmFtbzswOzA7cHJvdmluY2UKK0NVO0NVLTtIb2xndW47MDswO3Byb3ZpbmNlCitDVTtDVS0wMjtMYSBIYWJhbmE7MDswO3Byb3ZpbmNlCitDVTtDVS0wO0xhcyBUdW5hczswOzA7cHJvdmluY2UKK0NVO0NVLTA0O01hdGFuemFzOzA7MDtwcm92aW5jZQorQ1U7Q1UtMDtQaW5hciBkZWwgUm87MDswO3Byb3ZpbmNlCitDVTtDVS0wNztTYW5jdGkgU3ByaXR1czswOzA7cHJvdmluY2UKK0NVO0NVLTM7U2FudGlhZ28gZGUgQ3ViYTswOzA7cHJvdmluY2UKK0NVO0NVLTA1O1ZpbGxhIENsYXJhOzA7MDtwcm92aW5jZQorQ1U7Q1UtOTk7SXNsYSBkZSBsYSBKdXZlbnR1ZDswOzA7MHNwZWNpYWwgbXVuaWNpcGFsaXR5CitDVjtDVi1CVjtCb2EgVmlzdGE7MDswO0IKK0NWO0NWLUJSO0JyYXZhOzA7MDtTCitDVjtDVi1DUztDYWxoZXRhIGRlIFNvIE1pZ3VlbDswOzA7UworQ1Y7Q1YtTUE7TWFpbzswOzA7UworQ1Y7Q1YtTU87TW9zdGVpcm9zOzA7MDtTCitDVjtDVi1QQTtQYWw7MDswO0IKK0NWO0NWLVBOO1BvcnRvIE5vdm87MDswO0IKK0NWO0NWLVBSO1ByYWlhOzA7MDtTCitDVjtDVi1SRztSaWJlaXJhIEdyYW5kZTswOzA7QgorQ1Y7Q1YtU0w7U2FsOzA7MDtCCitDVjtDVi1DQTtTYW50YSBDYXRhcmluYTswOzA7UworQ1Y7Q1YtQ1I7U2FudGEgQ3J1ejswOzA7UworQ1Y7Q1YtU0Q7U28gRG9taW5nb3M7MDswO1MKK0NWO0NWLVNGO1NvIEZpbGlwZTswOzA7UworQ1Y7Q1YtU047U28gTmljb2xhdTswOzA7QgorQ1Y7Q1YtU1Y7U28gVmljZW50ZTswOzA7QgorQ1Y7Q1YtVEE7VGFycmFmYWw7MDswO1MKK0NZO0NZLTA0O0FtbW9jaG9zdG9zO01hdXNhOzA7MAorQ1k7Q1ktMDY7S2VyeW5laWE7R2lybmU7MDswCitDWTtDWS0wMztMYXJuYWthO0xhcm5ha2E7MDswCitDWTtDWS0wO0xlZmtvc2lhO0xlZmtvYTswOzAKK0NZO0NZLTAyO0xlbWVzb3M7TGV5bW9zdW47MDswCitDWTtDWS0wNTtQYWZvcztCYWY7MDswCitDWjtDWi1KQztKaWhvZWVzayBrcmFqOzA7MDswCitDWjtDWi1KTTtKaWhvbW9yYXZzayBrcmFqIDswOzA7MAorQ1o7Q1otS0E7S2FybG92YXJzayBrcmFqOzA7MDswCitDWjtDWi1LUjtLcmxvdmVocmFkZWNrIGtyYWo7MDswOzAKK0NaO0NaLUxJO0xpYmVyZWNrIGtyYWo7MDswOzAKK0NaO0NaLU1PO01vcmF2c2tvc2xlenNrIGtyYWo7MDswOzAKK0NaO0NaLU9MO09sb21vdWNrIGtyYWo7MDswOzAKK0NaO0NaLVBBO1BhcmR1YmljayBrcmFqOzA7MDswCitDWjtDWi1QTDtQbHplc2sga3JhajswOzA7MAorQ1o7Q1otUFI7UHJhaGEsIGhsYXZuIG1zdG87MDswOzAKK0NaO0NaLVNUO1N0ZWRvZWVzayBrcmFqOzA7MDswCitDWjtDWi1VUztzdGVjayBrcmFqIDswOzA7MAorQ1o7Q1otVlk7Vnlzb2VpbmE7MDswOzAKK0NaO0NaLVpMO1psbnNrIGtyYWo7MDswOzAKK0RFO0RFLUJXO0JhZGVuLVf8cnR0ZW1iZXJnOzA7MDswCitERTtERS1CWTtCYXllcm47MDswOzAKK0RFO0RFLUJFO0JlcmxpbjswOzA7MAorREU7REUtQkI7QnJhbmRlbmJ1cmc7MDswOzAKK0RFO0RFLUhCO0JyZW1lbjswOzA7MAorREU7REUtSEg7SGFtYnVyZzswOzA7MAorREU7REUtSEU7SGVzc2VuOzA7MDswCitERTtERS1NVjtNZWNrbGVuYnVyZy1Wb3Jwb21tZXJuOzA7MDswCitERTtERS1OSTtOaWVkZXJzYWNoc2VuOzA7MDswCitERTtERS1OVztOb3JkcmhlaW4tV2VzdGZhbGVuOzA7MDswCitERTtERS1SUDtSaGVpbmxhbmQtUGZhbHo7MDswOzAKK0RFO0RFLVNMO1NhYXJsYW5kOzA7MDswCitERTtERS1TTjtTYWNoc2VuOzA7MDswCitERTtERS1TVDtTYWNoc2VuLUFuaGFsdDswOzA7MAorREU7REUtU0g7U2NobGVzd2lnLUhvbHN0ZWluOzA7MDswCitERTtERS1USDtUaPxyaW5nZW47MDswOzAKK0RKO0RKLUFTO0FsaSBTYWJpZWg7MDswO3JlZ2lvbgorREo7REotREk7RGlraGlsOzA7MDtyZWdpb24KK0RKO0RKLURKO0RqaWJvdXRpOzA7MDswdmlsbGUKK0RKO0RKLU9CO09ib2NrOzA7MDtyZWdpb24KK0RKO0RKLVRBO1RhZGpvdXJhaDswOzA7cmVnaW9uCitESztESy00NztGcmVkZXJpa3NiZXJnOzA7MDswO2NpdHkKK0RLO0RLLTA7S2Jlbmhhdm47MDswOzA7Y2l0eQorREs7REstMDQwO0Jvcm5ob2xtOzA7MDtjb3VudHkKK0RLO0RLLTAyMDtGcmVkZXJpa3Nib3JnOzA7MDtjb3VudHkKK0RLO0RLLTA0MjtGeW47MDswO2NvdW50eQorREs7REstMDU7S2Jlbmhhdm47MDswO2NvdW50eQorREs7REstMDgwO05vcmRqeWxsYW5kOzA7MDtjb3VudHkKK0RLO0RLLTA1NTtSaWJlOzA7MDtjb3VudHkKK0RLO0RLLTA2NTtSaW5na2Jpbmc7MDswO2NvdW50eQorREs7REstMDI1O1Jvc2tpbGRlOzA7MDtjb3VudHkKK0RLO0RLLTAzNTtTdG9yc3RybTswOzA7Y291bnR5CitESztESy0wNTA7U25kZXJqeWxsYW5kOzA7MDtjb3VudHkKK0RLO0RLLTA2MDtWZWpsZTswOzA7Y291bnR5CitESztESy0wMzA7VmVzdHNqbGxhbmQ7MDswO2NvdW50eQorREs7REstMDc2O1ZpYm9yZzswOzA7Y291bnR5CitESztESy0wNzA7cmh1czswOzA7Y291bnR5CitETztETy0wO0Rpc3RyaXRvIE5hY2lvbmFsIChTYW50byBEb21pbmdvKTswOzA7MDtkaXN0cmljdAorRE87RE8tMDI7QXp1YTswOzA7cHJvdmluY2UKK0RPO0RPLTAzO0JhaG9ydWNvOzA7MDtwcm92aW5jZQorRE87RE8tMDQ7QmFyYWhvbmE7MDswO3Byb3ZpbmNlCitETztETy0wNTtEYWphYm47MDswO3Byb3ZpbmNlCitETztETy0wNjtEdWFydGU7MDswO3Byb3ZpbmNlCitETztETy0wODtFbCBTZXlibyBbRWwgU2VpYm9dOzA7MDtwcm92aW5jZQorRE87RE8tMDk7RXNwYWlsbGF0OzA7MDtwcm92aW5jZQorRE87RE8tMzA7SGF0byBNYXlvcjswOzA7cHJvdmluY2UKK0RPO0RPLTA7SW5kZXBlbmRlbmNpYTswOzA7cHJvdmluY2UKK0RPO0RPLTtMYSBBbHRhZ3JhY2lhOzA7MDtwcm92aW5jZQorRE87RE8tMDc7TGEgRXN0cmVsbGV0YSBbRWxhcyBQaWFdOzA7MDtwcm92aW5jZQorRE87RE8tMjtMYSBSb21hbmE7MDswO3Byb3ZpbmNlCitETztETy0zO0xhIFZlZ2E7MDswO3Byb3ZpbmNlCitETztETy00O01hcmEgVHJpbmlkYWQgU25jaGV6OzA7MDtwcm92aW5jZQorRE87RE8tMjg7TW9uc2VvciBOb3VlbDswOzA7cHJvdmluY2UKK0RPO0RPLTU7TW9udGUgQ3Jpc3RpOzA7MDtwcm92aW5jZQorRE87RE8tMjk7TW9udGUgUGxhdGE7MDswO3Byb3ZpbmNlCitETztETy02O1BlZGVybmFsZXM7MDswO3Byb3ZpbmNlCitETztETy03O1BlcmF2aWE7MDswO3Byb3ZpbmNlCitETztETy04O1B1ZXJ0byBQbGF0YTswOzA7cHJvdmluY2UKK0RPO0RPLTk7U2FsY2VkbzswOzA7cHJvdmluY2UKK0RPO0RPLTIwO1NhbWFuOzA7MDtwcm92aW5jZQorRE87RE8tMjtTYW4gQ3Jpc3RiYWw7MDswO3Byb3ZpbmNlCitETztETy0yMjtTYW4gSnVhbjswOzA7cHJvdmluY2UKK0RPO0RPLTIzO1NhbiBQZWRybyBkZSBNYWNvcnM7MDswO3Byb3ZpbmNlCitETztETy0yNDtTbmNoZXogUmFtcmV6OzA7MDtwcm92aW5jZQorRE87RE8tMjU7U2FudGlhZ287MDswO3Byb3ZpbmNlCitETztETy0yNjtTYW50aWFnbyBSb2RyZ3VlejswOzA7cHJvdmluY2UKK0RPO0RPLTI3O1ZhbHZlcmRlOzA7MDtwcm92aW5jZQorRFo7RFotMDtBZHJhciBbQWRyYXIxXTswOzA7MAorRFo7RFotNDQ7QWluIERlZmxhOzA7MDswCitEWjtEWi00NjtBaW4gVGVtb3VjaGVudDswOzA7MAorRFo7RFotNjtBbGdlcjswOzA7MAorRFo7RFotMjM7QW5uYWJhOzA7MDswCitEWjtEWi0wNTtCYXRuYTswOzA7MAorRFo7RFotMDg7QmVjaGFyOzA7MDswCitEWjtEWi0wNjtCZWphaWE7MDswOzAKK0RaO0RaLTA3O0Jpc2tyYTswOzA7MAorRFo7RFotMDk7QmxpZGE7MDswOzAKK0RaO0RaLTM0O0JvcmRqIEJvdSBBcnJlcmlkajswOzA7MAorRFo7RFotNTQ7Qm91aXJhOzA7MDswCitEWjtEWi0zNTtCb3VtZXJkZXM7MDswOzAKK0RaO0RaLTAyO0NobGVmOzA7MDswCitEWjtEWi0yNTtDb25zdGFudGluZTswOzA7MAorRFo7RFotNztEamVsZmE7MDswOzAKK0RaO0RaLTMyO0VsIEJheWFkaDswOzA7MAorRFo7RFotMzk7RWwgT3VlZDswOzA7MAorRFo7RFotMzY7RWwgVGFyZjswOzA7MAorRFo7RFotNDc7R2hhcmRhaWE7MDswOzAKK0RaO0RaLTI0O0d1ZWxtYTswOzA7MAorRFo7RFotMzM7SWxsaXppOzA7MDswCitEWjtEWi04O0ppamVsOzA7MDswCitEWjtEWi00MDtLaGVuY2hlbGE7MDswOzAKK0RaO0RaLTAzO0xhZ2hvdWF0OzA7MDswCitEWjtEWi0yOTtNYXNjYXJhOzA7MDswCitEWjtEWi0yNjtNZWRlYTswOzA7MAorRFo7RFotNDM7TWlsYTswOzA7MAorRFo7RFotMjc7TW9zdGFnYW5lbTswOzA7MAorRFo7RFotMjg7TXNpbGE7MDswOzAKK0RaO0RaLTQ1O05hYW1hOzA7MDswCitEWjtEWi02MztPcmFuOzA7MDswCitEWjtEWi0zMDtPdWFyZ2xhOzA7MDswCitEWjtEWi0wNDtPdW0gZWwgQm91YWdoaTswOzA7MAorRFo7RFotNDg7UmVsaXphbmU7MDswOzAKK0RaO0RaLTIwO1NhaWRhOzA7MDswCitEWjtEWi05O1NldGlmOzA7MDswCitEWjtEWi0yMjtTaWRpIEJlbCBBYmJlczswOzA7MAorRFo7RFotNjI7U2tpa2RhOzA7MDswCitEWjtEWi00O1NvdWsgQWhyYXM7MDswOzAKK0RaO0RaLTE7VGFtYW5naGFzc2V0OzA7MDswCitEWjtEWi01MjtUZWJlc3NhOzA7MDswCitEWjtEWi02NDtUaWFyZXQ7MDswOzAKK0RaO0RaLTM3O1RpbmRvdWY7MDswOzAKK0RaO0RaLTQyO1RpcGF6YTswOzA7MAorRFo7RFotMzg7VGlzc2Vtc2lsdDswOzA7MAorRFo7RFotNTtUaXppIE91em91OzA7MDswCitEWjtEWi02NTtUbGVtY2VuOzA7MDswCitFQztFQy1BO0F6dWF5OzA7MDswCitFQztFQy1CO0JvbHZhcjswOzA7MAorRUM7RUMtRjtDYWFyOzA7MDswCitFQztFQy1DO0NhcmNoaTswOzA7MAorRUM7RUMtWDtDb3RvcGF4aTswOzA7MAorRUM7RUMtSDtDaGltYm9yYXpvOzA7MDswCitFQztFQy1PO0VsIE9ybzswOzA7MAorRUM7RUMtRTtFc21lcmFsZGFzOzA7MDswCitFQztFQy1XO0dhbHBhZ29zOzA7MDswCitFQztFQy1HO0d1YXlhczswOzA7MAorRUM7RUMtSTtJbWJhYnVyYTswOzA7MAorRUM7RUMtTDtMb2phOzA7MDswCitFQztFQy1SO0xvcyBSb3M7MDswOzAKK0VDO0VDLU07TWFuYWI7MDswOzAKK0VDO0VDLVM7TW9yb25hLVNhbnRpYWdvOzA7MDswCitFQztFQy1OO05hcG87MDswOzAKK0VDO0VDLVk7UGFzdGF6YTswOzA7MAorRUM7RUMtUDtQaWNoaW5jaGE7MDswOzAKK0VDO0VDLVU7U3VjdW1ib3M7MDswOzAKK0VDO0VDLVQ7VHVuZ3VyYWh1YTswOzA7MAorRUM7RUMtWjtaYW1vcmEtQ2hpbmNoaXBlOzA7MDswCitFRTtFRS0zNztIYXJqdW1hYTswOzA7MAorRUU7RUUtMzk7SGlpdW1hYTswOzA7MAorRUU7RUUtNDQ7SWRhLVZpcnVtYWE7MDswOzAKK0VFO0VFLTQ5O0pnZXZhbWFhOzA7MDswCitFRTtFRS01O0pydmFtYWE7MDswOzAKK0VFO0VFLTU3O0xuZW1hYTswOzA7MAorRUU7RUUtNTk7TG5lLVZpcnVtYWE7MDswOzAKK0VFO0VFLTY1O1BsdmFtYWE7MDswOzAKK0VFO0VFLTY3O1BybnVtYWE7MDswOzAKK0VFO0VFLTcwO1JhcGxhbWFhOzA7MDswCitFRTtFRS03NDtTYWFyZW1hYTswOzA7MAorRUU7RUUtNzg7VGFydHVtYWE7MDswOzAKK0VFO0VFLTgyO1ZhbGdhbWFhOzA7MDswCitFRTtFRS04NDtWaWxqYW5kaW1hYTswOzA7MAorRUU7RUUtODY7VnJ1bWFhOzA7MDswCitFRztFRy1ESztBZCBEYXFhaGxpeWFoOzA7MDswCitFRztFRy1CQTtBbCBCYXIgYWwgQW1hcjswOzA7MAorRUc7RUctQkg7QWwgQnVheXJhaDswOzA7MAorRUc7RUctRllNO0FsIEZheXl1bTswOzA7MAorRUc7RUctR0g7QWwgR2hhcmJpeWFoOzA7MDswCitFRztFRy1BTFg7QWwgSXNrYW5kYXJpeWFoOzA7MDswCitFRztFRy1JUztBbCBJc21hbHlhaDswOzA7MAorRUc7RUctR1o7QWwgSnphaDswOzA7MAorRUc7RUctTU5GO0FsIE1pbmZ5YWg7MDswOzAKK0VHO0VHLU1OO0FsIE1pbnk7MDswOzAKK0VHO0VHLUM7QWwgUWhpcmFoOzA7MDswCitFRztFRy1LQjtBbCBRYWx5YnlhaDswOzA7MAorRUc7RUctV0FEO0FsIFdkIGFsIEphZGQ7MDswOzAKK0VHO0VHLVNIUjtBc2ggU2hhcnF5YWg7MDswOzAKK0VHO0VHLVNVWjtBcyBTdXdheXM7MDswOzAKK0VHO0VHLUFTTjtBc3duOzA7MDswCitFRztFRy1BU1Q7QXN5OzA7MDswCitFRztFRy1CTlM7QmFuIFN1d2F5ZjswOzA7MAorRUc7RUctUFRTO0JyIFNhZDswOzA7MAorRUc7RUctRFQ7RHVteTswOzA7MAorRUc7RUctSlM7SmFuYiBTbjswOzA7MAorRUc7RUctS0ZTO0thZnIgYXNoIFNoYXlraDswOzA7MAorRUc7RUctTVQ7TWFyOzA7MDswCitFRztFRy1LTjtRaW47MDswOzAKK0VHO0VHLVNJTjtTaGFtbCBTbjswOzA7MAorRUc7RUctU0hHO1NoajswOzA7MAorRVI7RVItQU47QW5zZWJhOzA7MDswCitFUjtFUi1EVTtEZWJ1YjswOzA7MAorRVI7RVItREs7RGVidWJhd2kgS2V5aWggQmFocmkgW0RlYnViLUtlaWgtQmFocmldOzA7MDswCitFUjtFUi1HQjtHYXNoLUJhcmthOzA7MDswCitFUjtFUi1NQTtNYWFrZWwgW01hZWtlbF07MDswOzAKK0VSO0VSLVNLO1NlbWVuYXdpIEtleWloIEJhaHJpIFtTZW1pZW4tS2VpaC1CYWhyaV07MDswOzAKK0VTO0VTLUM7QSBDb3J1YTswOzA7R0E7cHJvdmluY2UKK0VTO0VTLVZJO2xhdmE7MDswO1BWO3Byb3ZpbmNlCitFUztFUy1BQjtBbGJhY2V0ZTswOzA7Q007cHJvdmluY2UKK0VTO0VTLUE7QWxpY2FudGU7MDswO1ZDO3Byb3ZpbmNlCitFUztFUy1BTDtBbG1lcmE7MDswO0FOO3Byb3ZpbmNlCitFUztFUy1PO0FzdHVyaWFzOzA7MDtPO3Byb3ZpbmNlCitFUztFUy1BVjt2aWxhOzA7MDtDTDtwcm92aW5jZQorRVM7RVMtQkE7QmFkYWpvejswOzA7RVg7cHJvdmluY2UKK0VTO0VTLVBNO0JhbGVhcmVzOzA7MDtJQjtwcm92aW5jZQorRVM7RVMtQjtCYXJjZWxvbmE7MDswO0NUO3Byb3ZpbmNlCitFUztFUy1CVTtCdXJnb3M7MDswO0NMO3Byb3ZpbmNlCitFUztFUy1DQztDY2VyZXM7MDswO0VYO3Byb3ZpbmNlCitFUztFUy1DQTtDZGl6OzA7MDtBTjtwcm92aW5jZQorRVM7RVMtUztDYW50YWJyaWE7MDswO1M7cHJvdmluY2UKK0VTO0VTLUNTO0Nhc3RlbGxuOzA7MDtWQztwcm92aW5jZQorRVM7RVMtQ1I7Q2l1ZGFkIFJlYWw7MDswO0NNO3Byb3ZpbmNlCitFUztFUy1DTztDcmRvYmE7MDswO0FOO3Byb3ZpbmNlCitFUztFUy1DVTtDdWVuY2E7MDswO0NNO3Byb3ZpbmNlCitFUztFUy1HSTtHaXJvbmE7MDswO0NUO3Byb3ZpbmNlCitFUztFUy1HUjtHcmFuYWRhOzA7MDtBTjtwcm92aW5jZQorRVM7RVMtR1U7R3VhZGFsYWphcmE7MDswO0NNO3Byb3ZpbmNlCitFUztFUy1TUztHdWlwemNvYTswOzA7UFY7cHJvdmluY2UKK0VTO0VTLUg7SHVlbHZhOzA7MDtBTjtwcm92aW5jZQorRVM7RVMtSFU7SHVlc2NhOzA7MDtBUjtwcm92aW5jZQorRVM7RVMtSjtKYWVuOzA7MDtBTjtwcm92aW5jZQorRVM7RVMtTE87TGEgUmlvamE7MDswO0xPO3Byb3ZpbmNlCitFUztFUy1HQztMYXMgUGFsbWFzOzA7MDtDTjtwcm92aW5jZQorRVM7RVMtTEU7TGVuOzA7MDtDTDtwcm92aW5jZQorRVM7RVMtTDtMbGVpZGE7MDswO0NUO3Byb3ZpbmNlCitFUztFUy1MVTtMdWdvOzA7MDtHQTtwcm92aW5jZQorRVM7RVMtTTtNYWRyaWQ7MDswO007cHJvdmluY2UKK0VTO0VTLU1BO01sYWdhOzA7MDtBTjtwcm92aW5jZQorRVM7RVMtTVU7TXVyY2lhOzA7MDtNVTtwcm92aW5jZQorRVM7RVMtTkE7TmF2YXJyYTswOzA7TkE7cHJvdmluY2UKK0VTO0VTLU9SO091cmVuc2U7MDswO0dBO3Byb3ZpbmNlCitFUztFUy1QO1BhbGVuY2lhOzA7MDtDTDtwcm92aW5jZQorRVM7RVMtUE87UG9udGV2ZWRyYTswOzA7R0E7cHJvdmluY2UKK0VTO0VTLVNBO1NhbGFtYW5jYTswOzA7Q0w7cHJvdmluY2UKK0VTO0VTLVRGO1NhbnRhIENydXogZGUgVGVuZXJpZmU7MDswO0NOO3Byb3ZpbmNlCitFUztFUy1TRztTZWdvdmlhOzA7MDtDTDtwcm92aW5jZQorRVM7RVMtU0U7U2V2aWxsYTswOzA7QU47cHJvdmluY2UKK0VTO0VTLVNPO1NvcmlhOzA7MDtDTDtwcm92aW5jZQorRVM7RVMtVDtUYXJyYWdvbmE7MDswO0NUO3Byb3ZpbmNlCitFUztFUy1URTtUZXJ1ZWw7MDswO0FSO3Byb3ZpbmNlCitFUztFUy1UTztUb2xlZG87MDswO0NNO3Byb3ZpbmNlCitFUztFUy1WO1ZhbGVuY2lhOzA7MDtWQztwcm92aW5jZQorRVM7RVMtVkE7VmFsbGFkb2xpZDswOzA7Q0w7cHJvdmluY2UKK0VTO0VTLUJJO1ZpemNheWE7MDswO1BWO3Byb3ZpbmNlCitFUztFUy1aQTtaYW1vcmE7MDswO0NMO3Byb3ZpbmNlCitFUztFUy1aO1phcmFnb3phOzA7MDtBUjtwcm92aW5jZQorRVM7RVMtQ0U7Q2V1dGE7MDswOzBhdXRvbm9tb3VzIGNpdHkgaW4gTm9ydGggQWZyaWNhCitFUztFUy1NTDtNZWxpbGxhOzA7MDswYXV0b25vbW91cyBjaXR5IGluIE5vcnRoIEFmcmljYQorRVQ7RVQtQUE7ZGlzIGJlYmE7QWRkaXMgQWJhYmE7MDswO2FkbWluaXN0cmF0aW9uCitFVDtFVC1BRjtmYXI7QWZhcjswOzA7c3RhdGUKK0VUO0VULUFNO21hcmE7QW1hcmE7MDswO3N0YXRlCitFVDtFVC1CRTtCaW5zaGFuZ3VsIEd1bXV6O0JlbnNoYW5ndWwtR3VtYXo7MDswO3N0YXRlCitFVDtFVC1HQTtHYW1iY2xhIEhpemJvY2g7R2FtYmVsYSBQZW9wbGVzOzA7MDtzdGF0ZQorRVQ7RVQtSEE7SGFyZXJpIEhpemI7SGFyYXJpIFBlb3BsZTswOzA7c3RhdGUKK0VUO0VULU9SO09yb21peWE7T3JvbWlhOzA7MDtzdGF0ZQorRVQ7RVQtU087U3VtYWxjO1NvbWFsaTswOzA7c3RhdGUKK0VUO0VULVNOO1llRGVidWIgQmloY3JvY2ggQmloY3Jlc2Vib2NoIG5hIEhpemJvY2g7U291dGhlcm4gTmF0aW9ucywgTmF0aW9uYWxpdGllcyBhbmQgUGVvcGxlczswOzA7c3RhdGUKK0VUO0VULVRJO1RpZ3JheTtUaWdyYWk7MDswO3N0YXRlCitGSTtGSS1BTDtBaHZlbmFubWFhbiBsbmk7bGFuZHMgbG47MDswCitGSTtGSS1FUztFdGVsLVN1b21lbiBsbmk7U2RyYSBGaW5sYW5kcyBsbjswOzAKK0ZJO0ZJLUlTO0l0LVN1b21lbiBsbmk7c3RyYSBGaW5sYW5kcyBsbjswOzAKK0ZJO0ZJLUxMO0xhcGluIGxuaTtMYXBwbGFuZHMgbG47MDswCitGSTtGSS1MUztMbnNpLVN1b21lbiBsbmk7VnN0cmEgRmlubGFuZHMgbG47MDswCitGSTtGSS1PTDtPdWx1biBsbmk7VWxlYm9yZ3MgbG47MDswCitGSjtGSi1DO0NlbnRyYWw7MDswOzBkaXZpc2lvbgorRko7RkotRTtFYXN0ZXJuOzA7MDswZGl2aXNpb24KK0ZKO0ZKLU47Tm9ydGhlcm47MDswOzBkaXZpc2lvbgorRko7RkotVztXZXN0ZXJuOzA7MDswZGl2aXNpb24KK0ZKO0ZKLVI7Um90dW1hOzA7MDswZGVwZW5kZW5jeQorRk07Rk0tVFJLO0NodXVrOzA7MDswCitGTTtGTS1LU0E7S29zcmFlOzA7MDswCitGTTtGTS1QTkk7UG9obnBlaTswOzA7MAorRk07Rk0tWUFQO1lhcDswOzA7MAorRlI7RlItMDtBaW47MDswO1Y7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTAyO0Fpc25lOzA7MDtTO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi0wMztBbGxpZXI7MDswO0M7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTA0O0FscGVzLWRlLUhhdXRlLVByb3ZlbmNlOzA7MDtVO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi0wNjtBbHBlcy1NYXJpdGltZXM7MDswO1U7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTA3O0FyZGVjaGU7MDswO1Y7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTA4O0FyZGVubmVzOzA7MDtHO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi0wOTtBcmllZ2U7MDswO047bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTA7QXViZTswOzA7RzttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItO0F1ZGU7MDswO0s7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTI7QXZleXJvbjswOzA7TjttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNjc7QmFzLVJoaW47MDswO0E7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTM7Qm91Y2hlcy1kdS1SaG9uZTswOzA7VTttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNDtDYWx2YWRvczswOzA7UDttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNTtDYW50YWw7MDswO0M7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTY7Q2hhcmVudGU7MDswO1Q7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTc7Q2hhcmVudGUtTWFyaXRpbWU7MDswO1Q7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTg7Q2hlcjswOzA7RjttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItOTtDb3JyZXplOzA7MDtMO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi0yQTtDb3JzZS1kdS1TdWQ7MDswO0g7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTI7Q290ZS1kT3I7MDswO0Q7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTIyO0NvdGVzLWRBcm1vcjswOzA7RTttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItMjM7Q3JldXNlOzA7MDtMO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi03OTtEZXV4LVNldnJlczswOzA7VDttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItMjQ7RG9yZG9nbmU7MDswO0I7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTI1O0RvdWJzOzA7MDtJO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi0yNjtEcm9tZTswOzA7VjttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItOTtFc3Nvbm5lOzA7MDtKO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi0yNztFdXJlOzA7MDtRO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi0yODtFdXJlLWV0LUxvaXI7MDswO0Y7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTI5O0ZpbmlzdGVyZTswOzA7RTttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItMzA7R2FyZDswOzA7SzttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItMzI7R2VyczswOzA7TjttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItMzM7R2lyb25kZTswOzA7QjttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItMkI7SGF1dGUtQ29yc2U7MDswO0g7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTM7SGF1dGUtR2Fyb25uZTswOzA7TjttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNDM7SGF1dGUtTG9pcmU7MDswO0M7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTUyO0hhdXRlLU1hcm5lOzA7MDtHO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi0wNTtIYXV0ZXMtQWxwZXM7MDswO1U7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTcwO0hhdXRlLVNhb25lOzA7MDtJO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi03NDtIYXV0ZS1TYXZvaWU7MDswO1Y7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTY1O0hhdXRlcy1QeXJlbmVlczswOzA7TjttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItODc7SGF1dGUtVmllbm5lOzA7MDtMO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi02ODtIYXV0LVJoaW47MDswO0E7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTkyO0hhdXRzLWRlLVNlaW5lOzA7MDtKO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi0zNDtIZXJhdWx0OzA7MDtLO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi0zNTtJbGxlLWV0LVZpbGFpbmU7MDswO0U7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTM2O0luZHJlOzA7MDtGO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi0zNztJbmRyZS1ldC1Mb2lyZTswOzA7RjttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItMzg7SXNlcmU7MDswO1Y7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTM5O0p1cmE7MDswO0k7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTQwO0xhbmRlczswOzA7QjttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNDtMb2lyLWV0LUNoZXI7MDswO0Y7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTQyO0xvaXJlOzA7MDtWO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi00NDtMb2lyZS1BdGxhbnRpcXVlOzA7MDtSO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi00NTtMb2lyZXQ7MDswO0Y7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTQ2O0xvdDswOzA7TjttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNDc7TG90LWV0LUdhcm9ubmU7MDswO0I7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTQ4O0xvemVyZTswOzA7SzttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNDk7TWFpbmUtZXQtTG9pcmU7MDswO1I7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTUwO01hbmNoZTswOzA7UDttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNTtNYXJuZTswOzA7RzttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNTM7TWF5ZW5uZTswOzA7UjttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNTQ7TWV1cnRoZS1ldC1Nb3NlbGxlOzA7MDtNO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi01NTtNZXVzZTswOzA7TTttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNTY7TW9yYmloYW47MDswO0U7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTU3O01vc2VsbGU7MDswO007bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTU4O05pZXZyZTswOzA7RDttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNTk7Tm9yZDswOzA7TzttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNjA7T2lzZTswOzA7UzttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNjtPcm5lOzA7MDtQO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi03NTtQYXJpczswOzA7SjttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNjI7UGFzLWRlLUNhbGFpczswOzA7TzttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNjM7UHV5LWRlLURvbWU7MDswO0M7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTY0O1B5cmVuZWVzLUF0bGFudGlxdWVzOzA7MDtCO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi02NjtQeXJlbmVlcy1PcmllbnRhbGVzOzA7MDtLO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi02OTtSaG9uZTswOzA7VjttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNztTYW9uZS1ldC1Mb2lyZTswOzA7RDttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItNzI7U2FydGhlOzA7MDtSO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi03MztTYXZvaWU7MDswO1Y7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTc3O1NlaW5lLWV0LU1hcm5lOzA7MDtKO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi03NjtTZWluZS1NYXJpdGltZTswOzA7UTttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItOTM7U2VpbmUtU2FpbnQtRGVuaXM7MDswO0o7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTgwO1NvbW1lOzA7MDtTO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi04O1Rhcm47MDswO047bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTgyO1Rhcm4tZXQtR2Fyb25uZTswOzA7TjttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItOTA7VGVycml0b2lyZSBkZSBCZWxmb3J0OzA7MDtJO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi05NDtWYWwtZGUtTWFybmU7MDswO0o7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTk1O1ZhbC1kT2lzZTswOzA7SjttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItODM7VmFyOzA7MDtVO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi04NDtWYXVjbHVzZTswOzA7VTttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItODU7VmVuZGVlOzA7MDtSO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi04NjtWaWVubmU7MDswO1Q7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTg4O1Zvc2dlczswOzA7TTttZXRyb3BvbGl0YW4gZGVwYXJ0bWVudAorRlI7RlItODk7WW9ubmU7MDswO0Q7bWV0cm9wb2xpdGFuIGRlcGFydG1lbnQKK0ZSO0ZSLTc4O1l2ZWxpbmVzOzA7MDtKO21ldHJvcG9saXRhbiBkZXBhcnRtZW50CitGUjtGUi1ZVDtNYXlvdHRlIChzZWUgYWxzbyBzZXBhcmF0ZSBlbnRyeSB1bmRlciBZVCk7MDswOzB0ZXJyaXRvcmlhbCBjb2xsZWN0aXZpdHkKK0ZSO0ZSLVBNO1NhaW50LVBpZXJyZS1ldC1NaXF1ZWxvbiAoc2VlIGFsc28gc2VwYXJhdGUgZW50cnkgdW5kZXIgUE0pOzA7MDswdGVycml0b3JpYWwgY29sbGVjdGl2aXR5CitGUjtGUi1OQztOb3V2ZWxsZS1DYWxlZG9uaWUgKHNlZSBhbHNvIHNlcGFyYXRlIGVudHJ5IHVuZGVyIE5DKTswOzA7MG92ZXJzZWFzIHRlcnJpdG9yeQorRlI7RlItUEY7UG9seW5lc2llIGZyYW5jYWlzZSAoc2VlIGFsc28gc2VwYXJhdGUgZW50cnkgdW5kZXIgUEYpOzA7MDswb3ZlcnNlYXMgdGVycml0b3J5CitGUjtGUi1URjtUZXJyZXMgQXVzdHJhbGVzIEZyYW5jYWlzZXMgKHNlZSBhbHNvIHNlcGFyYXRlIGVudHJ5IHVuZGVyIFRGKTswOzA7MG92ZXJzZWFzIHRlcnJpdG9yeQorRlI7RlItV0Y7V2FsbGlzIGV0IEZ1dHVuYSAoc2VlIGFsc28gc2VwYXJhdGUgZW50cnkgdW5kZXIgV0YpOzA7MDswb3ZlcnNlYXMgdGVycml0b3J5CitHQTtHQS0xO0VzdHVhaXJlOzA7MDswCitHQTtHQS0yO0hhdXQtT2dvb3VlOzA7MDswCitHQTtHQS0zO01veWVuLU9nb291ZTswOzA7MAorR0E7R0EtNDtOZ291bmllOzA7MDswCitHQTtHQS01O055YW5nYTswOzA7MAorR0E7R0EtNjtPZ29vdWUtSXZpbmRvOzA7MDswCitHQTtHQS03O09nb291ZS1Mb2xvOzA7MDswCitHQTtHQS04O09nb291ZS1NYXJpdGltZTswOzA7MAorR0E7R0EtOTtXb2xldS1OdGVtOzA7MDswCitHQjtHQi1BQkU7QWJlcmRlZW4gQ2l0eTswOzA7U0NUCitHQjtHQi1BQkQ7QWJlcmRlZW5zaGlyZTswOzA7U0NUCitHQjtHQi1BTlM7QW5ndXM7MDswO1NDVAorR0I7R0ItQU5UO0FudHJpbTswOzA7TklSCitHQjtHQi1BUkQ7QXJkczswOzA7TklSCitHQjtHQi1BR0I7QXJneWxsIGFuZCBCdXRlOzA7MDtTQ1QKK0dCO0dCLUFSTTtBcm1hZ2g7MDswO05JUgorR0I7R0ItQkxBO0JhbGx5bWVuYTswOzA7TklSCitHQjtHQi1CTFk7QmFsbHltb25leTswOzA7TklSCitHQjtHQi1CTkI7QmFuYnJpZGdlOzA7MDtOSVIKK0dCO0dCLUJERztCYXJraW5nIGFuZCBEYWdlbmhhbTswOzA7RU5HCitHQjtHQi1CTkU7QmFybmV0OzA7MDtFTkcKK0dCO0dCLUJOUztCYXJuc2xleTswOzA7RU5HCitHQjtHQi1CQVM7QmF0aCBhbmQgTm9ydGggRWFzdCBTb21lcnNldDswOzA7RU5HCitHQjtHQi1CREY7QmVkZm9yZHNoaXJlOzA7MDtFTkcKK0dCO0dCLUJGUztCZWxmYXN0OzA7MDtOSVIKK0dCO0dCLUJFWDtCZXhsZXk7MDswO0VORworR0I7R0ItQklSO0Jpcm1pbmdoYW07MDswO0VORworR0I7R0ItQkJEO0JsYWNrYnVybiB3aXRoIERhcndlbjswOzA7RU5HCitHQjtHQi1CUEw7QmxhY2twb29sOzA7MDtFTkcKK0dCO0dCLUJHVztCbGFlbmF1IEd3ZW50OzA7MDtXTFMKK0dCO0dCLUJPTDtCb2x0b247MDswO0VORworR0I7R0ItQk1IO0JvdXJuZW1vdXRoOzA7MDtFTkcKK0dCO0dCLUJSQztCcmFja25lbGwgRm9yZXN0OzA7MDtFTkcKK0dCO0dCLUJSRDtCcmFkZm9yZDswOzA7RU5HCitHQjtHQi1CRU47QnJlbnQ7MDswO0VORworR0I7R0ItQkdFO0JyaWRnZW5kIFtQZW4teS1ib250IGFyIE9nd3IgR0ItUE9HXTswOzA7V0xTCitHQjtHQi1CTkg7QnJpZ2h0b24gYW5kIEhvdmU7MDswO0VORworR0I7R0ItQlNUO0JyaXN0b2wsIENpdHkgb2Y7MDswO0VORworR0I7R0ItQlJZO0Jyb21sZXk7MDswO0VORworR0I7R0ItQktNO0J1Y2tpbmdoYW1zaGlyZTswOzA7RU5HOworR0I7R0ItQlVSO0J1cnk7MDswO0VORzsKK0dCO0dCLUNBWTtDYWVycGhpbGx5IFtDYWVyZmZpbGkgR0ItQ0FGXTswOzA7V0xTOworR0I7R0ItQ0xEO0NhbGRlcmRhbGU7MDswO0VORzsKK0dCO0dCLUNBTTtDYW1icmlkZ2VzaGlyZTswOzA7RU5HOworR0I7R0ItQ01EO0NhbWRlbjswOzA7RU5HOworR0I7R0ItQ1JGO0NhcmRpZmYgW0NhZXJkeWRkIEdCLUNSRF07MDswO1dMUzsKK0dCO0dCLUNNTjtDYXJtYXJ0aGVuc2hpcmUgW1NpciBHYWVyZnlyZGRpbiBHQi1HRlldOzA7MDtXTFM7CitHQjtHQi1DS0Y7Q2Fycmlja2Zlcmd1czswOzA7TklSOworR0I7R0ItQ1NSO0Nhc3RsZXJlYWdoOzA7MDtOSVI7CitHQjtHQi1DR047Q2VyZWRpZ2lvbiBbU2lyIENlcmVkaWdpb25dOzA7MDtXTFM7CitHQjtHQi1DSFM7Q2hlc2hpcmU7MDswO0VORzsKK0dCO0dCLUNMSztDbGFja21hbm5hbnNoaXJlOzA7MDtTQ1Q7CitHQjtHQi1DTFI7Q29sZXJhaW5lOzA7MDtOSVI7CitHQjtHQi1DV1k7Q29ud3k7MDswO1dMUzsKK0dCO0dCLUNLVDtDb29rc3Rvd247MDswO05JUjsKK0dCO0dCLUNPTjtDb3Jud2FsbDswOzA7RU5HOworR0I7R0ItQ09WO0NvdmVudHJ5OzA7MDtFTkc7CitHQjtHQi1DR1Y7Q3JhaWdhdm9uOzA7MDtOSVI7CitHQjtHQi1DUlk7Q3JveWRvbjswOzA7RU5HOworR0I7R0ItQ01BO0N1bWJyaWE7MDswO0VORzsKK0dCO0dCLURBTDtEYXJsaW5ndG9uOzA7MDtFTkc7CitHQjtHQi1ERU47RGVuYmlnaHNoaXJlIFtTaXIgRGRpbmJ5Y2ggR0ItRERCXTswOzA7V0xTOworR0I7R0ItREVSO0RlcmJ5OzA7MDtFTkc7CitHQjtHQi1EQlk7RGVyYnlzaGlyZTswOzA7RU5HOworR0I7R0ItRFJZO0RlcnJ5OzA7MDtOSVI7CitHQjtHQi1ERVY7RGV2b247MDswO0VORzsKK0dCO0dCLUROQztEb25jYXN0ZXI7MDswO0VORzsKK0dCO0dCLURPUjtEb3JzZXQ7MDswO0VORzsKK0dCO0dCLURPVztEb3duOzA7MDtOSVI7CitHQjtHQi1EVUQ7RHVkbGV5OzA7MDtFTkc7CitHQjtHQi1ER1k7RHVtZnJpZXMgYW5kIEdhbGxvd2F5OzA7MDtTQ1Q7CitHQjtHQi1ETkQ7RHVuZGVlIENpdHk7MDswO1NDVDsKK0dCO0dCLURHTjtEdW5nYW5ub247MDswO05JUjsKK0dCO0dCLURVUjtEdXJoYW07MDswO0VORzsKK0dCO0dCLUVBTDtFYWxpbmc7MDswO0VORzsKK0dCO0dCLUVBWTtFYXN0IEF5cnNoaXJlOzA7MDtTQ1Q7CitHQjtHQi1FRFU7RWFzdCBEdW5iYXJ0b25zaGlyZTswOzA7U0NUOworR0I7R0ItRUxOO0Vhc3QgTG90aGlhbjswOzA7U0NUOworR0I7R0ItRVJXO0Vhc3QgUmVuZnJld3NoaXJlOzA7MDtTQ1Q7CitHQjtHQi1FUlk7RWFzdCBSaWRpbmcgb2YgWW9ya3NoaXJlOzA7MDtFTkc7CitHQjtHQi1FU1g7RWFzdCBTdXNzZXg7MDswO0VORzsKK0dCO0dCLUVESDtFZGluYnVyZ2gsIENpdHkgb2Y7MDswO1NDVDsKK0dCO0dCLUVMUztFaWxlYW4gU2lhcjswOzA7U0NUOworR0I7R0ItRU5GO0VuZmllbGQ7MDswO0VORzsKK0dCO0dCLUVTUztFc3NleDswOzA7RU5HOworR0I7R0ItRkFMO0ZhbGtpcms7MDswO1NDVDsKK0dCO0dCLUZFUjtGZXJtYW5hZ2g7MDswO05JUjsKK0dCO0dCLUZJRjtGaWZlOzA7MDtTQ1Q7CitHQjtHQi1GTE47RmxpbnRzaGlyZSBbU2lyIHkgRmZsaW50IEdCLUZGTF07MDswO1dMUzsKK0dCO0dCLUdBVDtHYXRlc2hlYWQ7MDswO0VORzsKK0dCO0dCLUdMRztHbGFzZ293IENpdHk7MDswO1NDVDsKK0dCO0dCLUdMUztHbG91Y2VzdGVyc2hpcmU7MDswO0VORzsKK0dCO0dCLUdSRTtHcmVlbndpY2g7MDswO0VORzsKK0dCO0dCLUdTWTtHdWVybnNleSBbR3Vlcm5lc2V5XTswOzA7Q0hBOworR0I7R0ItR1dOO0d3eW5lZGQ7MDswO1dMUzsKK0dCO0dCLUhDSztIYWNrbmV5OzA7MDtFTkc7CitHQjtHQi1IQUw7SGFsdG9uOzA7MDtFTkc7CitHQjtHQi1ITUY7SGFtbWVyc21pdGggYW5kIEZ1bGhhbTswOzA7RU5HOworR0I7R0ItSEFNO0hhbXBzaGlyZTswOzA7RU5HOworR0I7R0ItSFJZO0hhcmluZ2V5OzA7MDtFTkc7CitHQjtHQi1IUlc7SGFycm93OzA7MDtFTkc7CitHQjtHQi1IUEw7SGFydGxlcG9vbDswOzA7RU5HOworR0I7R0ItSEFWO0hhdmVyaW5nOzA7MDtFTkc7CitHQjtHQi1IRUY7SGVyZWZvcmRzaGlyZSwgQ291bnR5IG9mOzA7MDtFTkc7CitHQjtHQi1IUlQ7SGVydGZvcmRzaGlyZTswOzA7RU5HOworR0I7R0ItSExEO0hpZ2hsYW5kOzA7MDtTQ1Q7CitHQjtHQi1ISUw7SGlsbGluZ2RvbjswOzA7RU5HOworR0I7R0ItSE5TO0hvdW5zbG93OzA7MDtFTkc7CitHQjtHQi1JVkM7SW52ZXJjbHlkZTswOzA7U0NUOworR0I7R0ItQUdZO0lzbGUgb2YgQW5nbGVzZXkgW1NpciBZbnlzIE1vbiBHQi1ZTk1dOzA7MDtXTFM7CitHQjtHQi1JT1c7SXNsZSBvZiBXaWdodDswOzA7RU5HOworR0I7R0ItSU9TO0lzbGVzIG9mIFNjaWxseTswOzA7RU5HOworR0I7R0ItSVNMO0lzbGluZ3RvbjswOzA7RU5HOworR0I7R0ItSlNZO0plcnNleTswOzA7Q0hBOworR0I7R0ItS0VDO0tlbnNpbmd0b24gYW5kIENoZWxzZWE7MDswO0VORzsKK0dCO0dCLUtFTjtLZW50OzA7MDtFTkc7CitHQjtHQi1LSEw7S2luZ3N0b24gdXBvbiBIdWxsLCBDaXR5IG9mOzA7MDtFTkc7CitHQjtHQi1LVFQ7S2luZ3N0b24gdXBvbiBUaGFtZXM7MDswO0VORzsKK0dCO0dCLUtJUjtLaXJrbGVlczswOzA7RU5HOworR0I7R0ItS1dMO0tub3dzbGV5OzA7MDtFTkc7CitHQjtHQi1MQkg7TGFtYmV0aDswOzA7RU5HOworR0I7R0ItTEFOO0xhbmNhc2hpcmU7MDswO0VORzsKK0dCO0dCLUxSTjtMYXJuZTswOzA7TklSOworR0I7R0ItTERTO0xlZWRzOzA7MDtFTkc7CitHQjtHQi1MQ0U7TGVpY2VzdGVyOzA7MDtFTkc7CitHQjtHQi1MRUM7TGVpY2VzdGVyc2hpcmU7MDswO0VORzsKK0dCO0dCLUxFVztMZXdpc2hhbTswOzA7RU5HOworR0I7R0ItTE1WO0xpbWF2YWR5OzA7MDtOSVI7CitHQjtHQi1MSU47TGluY29sbnNoaXJlOzA7MDtFTkc7CitHQjtHQi1MU0I7TGlzYnVybjswOzA7TklSOworR0I7R0ItTElWO0xpdmVycG9vbDswOzA7RU5HOworR0I7R0ItTE5EO0xvbmRvbiwgQ2l0eSBvZjswOzA7RU5HOworR0I7R0ItTFVUO0x1dG9uOzA7MDtFTkc7CitHQjtHQi1NRlQ7TWFnaGVyYWZlbHQ7MDswO05JUjsKK0dCO0dCLU1BTjtNYW5jaGVzdGVyOzA7MDtFTkc7CitHQjtHQi1NRFc7TWVkd2F5OzA7MDtFTkc7CitHQjtHQi1NVFk7TWVydGh5ciBUeWRmaWwgW01lcnRoeXIgVHVkZnVsIEdCLU1UVV07MDswO1dMUzsKK0dCO0dCLU1SVDtNZXJ0b247MDswO0VORzsKK0dCO0dCLU1EQjtNaWRkbGVzYnJvdWdoOzA7MDtFTkc7CitHQjtHQi1NTE47TWlkbG90aGlhbjswOzA7U0NUOworR0I7R0ItTUlLO01pbHRvbiBLZXluZXM7MDswO0VORzsKK0dCO0dCLU1PTjtNb25tb3V0aHNoaXJlIFtTaXIgRnlud3kgR0ItRllOXTswOzA7V0xTOworR0I7R0ItTVJZO01vcmF5OzA7MDtTQ1Q7CitHQjtHQi1NWUw7TW95bGU7MDswO05JUjsKK0dCO0dCLU5UTDtOZWF0aCBQb3J0IFRhbGJvdCBbQ2FzdGVsbC1uZWRkIFBvcnQgVGFsYm90IEdCLUNUTF07MDswO1dMUzsKK0dCO0dCLU5FVDtOZXdjYXN0bGUgdXBvbiBUeW5lOzA7MDtFTkc7CitHQjtHQi1OV007TmV3aGFtOzA7MDtFTkc7CitHQjtHQi1OV1A7TmV3cG9ydCBbQ2FzbmV3eWRkIEdCLUNOV107MDswO1dMUzsKK0dCO0dCLU5ZTTtOZXdyeSBhbmQgTW91cm5lOzA7MDtOSVI7CitHQjtHQi1OVEE7TmV3dG93bmFiYmV5OzA7MDtOSVI7CitHQjtHQi1ORks7Tm9yZm9sazswOzA7RU5HOworR0I7R0ItTkFZO05vcnRoIEF5cnNoaXJlOzA7MDtTQ1Q7CitHQjtHQi1ORE47Tm9ydGggRG93bjswOzA7TklSOworR0I7R0ItTkVMO05vcnRoIEVhc3QgTGluY29sbnNoaXJlOzA7MDtFTkc7CitHQjtHQi1OTEs7Tm9ydGggTGFuYXJrc2hpcmU7MDswO1NDVDsKK0dCO0dCLU5MTjtOb3J0aCBMaW5jb2xuc2hpcmU7MDswO0VORzsKK0dCO0dCLU5TTTtOb3J0aCBTb21lcnNldDswOzA7RU5HOworR0I7R0ItTlRZO05vcnRoIFR5bmVzaWRlOzA7MDtFTkc7CitHQjtHQi1OWUs7Tm9ydGggWW9ya3NoaXJlOzA7MDtFTkc7CitHQjtHQi1OVEg7Tm9ydGhhbXB0b25zaGlyZTswOzA7RU5HOworR0I7R0ItTkJMO05vcnRodW1iZXJsYW5kOzA7MDtFTkc7CitHQjtHQi1OR007Tm90dGluZ2hhbTswOzA7RU5HOworR0I7R0ItTlRUO05vdHRpbmdoYW1zaGlyZTswOzA7RU5HOworR0I7R0ItT0xEO09sZGhhbTswOzA7RU5HOworR0I7R0ItT01IO09tYWdoOzA7MDtOSVI7CitHQjtHQi1PUks7T3JrbmV5IElzbGFuZHM7MDswO1NDVDsKK0dCO0dCLU9YRjtPeGZvcmRzaGlyZTswOzA7RU5HOworR0I7R0ItUEVNO1BlbWJyb2tlc2hpcmUgW1NpciBCZW5mcm8gR0ItQk5GXTswOzA7V0xTOworR0I7R0ItUEtOO1BlcnRoIGFuZCBLaW5yb3NzOzA7MDtTQ1Q7CitHQjtHQi1QVEU7UGV0ZXJib3JvdWdoOzA7MDtFTkc7CitHQjtHQi1QTFk7UGx5bW91dGg7MDswO0VORzsKK0dCO0dCLVBPTDtQb29sZTswOzA7RU5HOworR0I7R0ItUE9SO1BvcnRzbW91dGg7MDswO0VORzsKK0dCO0dCLVBPVztQb3d5czswOzA7V0xTOworR0I7R0ItUkRHO1JlYWRpbmc7MDswO0VORzsKK0dCO0dCLVJEQjtSZWRicmlkZ2U7MDswO0VORzsKK0dCO0dCLVJDQztSZWRjYXIgYW5kIENsZXZlbGFuZDswOzA7RU5HOworR0I7R0ItUkZXO1JlbmZyZXdzaGlyZTswOzA7U0NUOworR0I7R0ItUkNUO1Job25kZGEsIEN5bm9uLCBUYWZmIFtSaG9uZGRhLCBDeW5vbixUYWZdOzA7MDtXTFM7CitHQjtHQi1SSUM7UmljaG1vbmQgdXBvbiBUaGFtZXM7MDswO0VORzsKK0dCO0dCLVJDSDtSb2NoZGFsZTswOzA7RU5HOworR0I7R0ItUk9UO1JvdGhlcmhhbTswOzA7RU5HOworR0I7R0ItUlVUO1J1dGxhbmQ7MDswO0VORzsKK0dCO0dCLVNITjtTdC4gSGVsZW5zOzA7MDtFTkc7CitHQjtHQi1TTEY7U2FsZm9yZDswOzA7RU5HOworR0I7R0ItU0FXO1NhbmR3ZWxsOzA7MDtFTkc7CitHQjtHQi1TQ0I7U2NvdHRpc2ggQm9yZGVycywgVGhlOzA7MDtTQ1Q7CitHQjtHQi1TRlQ7U2VmdG9uOzA7MDtFTkc7CitHQjtHQi1TSEY7U2hlZmZpZWxkOzA7MDtFTkc7CitHQjtHQi1aRVQ7U2hldGxhbmQgSXNsYW5kczswOzA7U0NUOworR0I7R0ItU0hSO1Nocm9wc2hpcmU7MDswO0VORzsKK0dCO0dCLVNMRztTbG91Z2g7MDswO0VORzsKK0dCO0dCLVNPTDtTb2xpaHVsbDswOzA7RU5HOworR0I7R0ItU09NO1NvbWVyc2V0OzA7MDtFTkc7CitHQjtHQi1TQVk7U291dGggQXlyc2hpcmU7MDswO1NDVDsKK0dCO0dCLVNHQztTb3V0aCBHbG91Y2VzdGVyc2hpcmU7MDswO0VORzsKK0dCO0dCLVNMSztTb3V0aCBMYW5hcmtzaGlyZTswOzA7U0NUOworR0I7R0ItU1RZO1NvdXRoIFR5bmVzaWRlOzA7MDtFTkc7CitHQjtHQi1TVEg7U291dGhhbXB0b247MDswO0VORzsKK0dCO0dCLVNPUztTb3V0aGVuZC1vbi1TZWE7MDswO0VORzsKK0dCO0dCLVNXSztTb3V0aHdhcms7MDswO0VORzsKK0dCO0dCLVNUUztTdGFmZm9yZHNoaXJlOzA7MDtFTkc7CitHQjtHQi1TVEc7U3Rpcmxpbmc7MDswO1NDVDsKK0dCO0dCLVNLUDtTdG9ja3BvcnQ7MDswO0VORzsKK0dCO0dCLVNUVDtTdG9ja3Rvbi1vbi1UZWVzOzA7MDtFTkc7CitHQjtHQi1TVEU7U3Rva2Utb24tVHJlbnQ7MDswO0VORzsKK0dCO0dCLVNUQjtTdHJhYmFuZTswOzA7TklSOworR0I7R0ItU0ZLO1N1ZmZvbGs7MDswO0VORzsKK0dCO0dCLVNORDtTdW5kZXJsYW5kOzA7MDtFTkc7CitHQjtHQi1TUlk7U3VycmV5OzA7MDtFTkc7CitHQjtHQi1TVE47U3V0dG9uOzA7MDtFTkc7CitHQjtHQi1TV0E7U3dhbnNlYSBbQWJlcnRhd2UgR0ItQVRBXTswOzA7V0xTOworR0I7R0ItU1dEO1N3aW5kb247MDswO0VORzsKK0dCO0dCLVRBTTtUYW1lc2lkZTswOzA7RU5HOworR0I7R0ItVEZXO1RlbGZvcmQgYW5kIFdyZWtpbjswOzA7RU5HOworR0I7R0ItVEhSO1RodXJyb2NrOzA7MDtFTkc7CitHQjtHQi1UT0I7VG9yYmF5OzA7MDtFTkc7CitHQjtHQi1UT0Y7VG9yZmFlbiBbVG9yLWZhZW5dOzA7MDtXTFM7CitHQjtHQi1UV0g7VG93ZXIgSGFtbGV0czswOzA7RU5HOworR0I7R0ItVFJGO1RyYWZmb3JkOzA7MDtFTkc7CitHQjtHQi1WR0w7VmFsZSBvZiBHbGFtb3JnYW4sIFRoZSBbQnJvIE1vcmdhbm53ZyBHQi1CTUddOzA7MDtXTFM7CitHQjtHQi1XS0Y7V2FrZWZpZWxkOzA7MDtFTkc7CitHQjtHQi1XTEw7V2Fsc2FsbDswOzA7RU5HOworR0I7R0ItV0ZUO1dhbHRoYW0gRm9yZXN0OzA7MDtFTkc7CitHQjtHQi1XTkQ7V2FuZHN3b3J0aDswOzA7RU5HOworR0I7R0ItV1JUO1dhcnJpbmd0b247MDswO0VORzsKK0dCO0dCLVdBUjtXYXJ3aWNrc2hpcmU7MDswO0VORzsKK0dCO0dCLVdCSztXZXN0IEJlcmtzaGlyZTswOzA7RU5HOworR0I7R0ItV0RVO1dlc3QgRHVuYmFydG9uc2hpcmU7MDswO1NDVDsKK0dCO0dCLVdMTjtXZXN0IExvdGhpYW47MDswO1NDVDsKK0dCO0dCLVdTWDtXZXN0IFN1c3NleDswOzA7RU5HOworR0I7R0ItV1NNO1dlc3RtaW5zdGVyOzA7MDtFTkc7CitHQjtHQi1XR047V2lnYW47MDswO0VORzsKK0dCO0dCLVdJTDtXaWx0c2hpcmU7MDswO0VORzsKK0dCO0dCLVdOTTtXaW5kc29yIGFuZCBNYWlkZW5oZWFkOzA7MDtFTkc7CitHQjtHQi1XUkw7V2lycmFsOzA7MDtFTkc7CitHQjtHQi1XT0s7V29raW5naGFtOzA7MDtFTkc7CitHQjtHQi1XTFY7V29sdmVyaGFtcHRvbjswOzA7RU5HOworR0I7R0ItV09SO1dvcmNlc3RlcnNoaXJlOzA7MDtFTkc7CitHQjtHQi1XUlg7V3JleGhhbSBbV3JlY3NhbSBHQi1XUkNdOzA7MDtXTFM7CitHQjtHQi1ZT1I7WW9yazswOzA7RU5HOworR0g7R0gtQUg7QXNoYW50aTswOzA7MAorR0g7R0gtQkE7QnJvbmctQWhhZm87MDswOzAKK0dIO0dILUNQO0NlbnRyYWwgW0NlbnRyYWwxXTswOzA7MAorR0g7R0gtRVA7RWFzdGVybiBbRWFzdGVybjNdOzA7MDswCitHSDtHSC1BQTtHcmVhdGVyIEFjY3JhOzA7MDswCitHSDtHSC1OUDtOb3J0aGVybjswOzA7MAorR0g7R0gtVUU7VXBwZXIgRWFzdDswOzA7MAorR0g7R0gtVVc7VXBwZXIgV2VzdDswOzA7MAorR0g7R0gtVFY7Vm9sdGE7MDswOzAKK0dIO0dILVdQO1dlc3Rlcm47MDswOzAKK0dNO0dNLUI7QmFuanVsOzA7MDswO2NpdHkKK0dNO0dNLUw7TG93ZXIgUml2ZXI7MDswOzBkaXZpc2lvbgorR007R00tTTtNYWNDYXJ0aHkgSXNsYW5kOzA7MDswZGl2aXNpb24KK0dNO0dNLU47Tm9ydGggQmFuazswOzA7MGRpdmlzaW9uCitHTTtHTS1VO1VwcGVyIFJpdmVyOzA7MDswZGl2aXNpb24KK0dNO0dNLVc7V2VzdGVybiBbV2VzdGVybjFdIDswOzA7MGRpdmlzaW9uCitHTjtHTi1CRTtCZXlsYTswOzA7TgorR047R04tQkY7Qm9mZmE7MDswO0IKK0dOO0dOLUJLO0Jva2U7MDswO0IKK0dOO0dOLUNPO0NveWFoOzA7MDtECitHTjtHTi1EQjtEYWJvbGE7MDswO0YKK0dOO0dOLURMO0RhbGFiYTswOzA7TQorR047R04tREk7RGluZ3VpcmF5ZTswOzA7RgorR047R04tRFU7RHVicmVrYTswOzA7RAorR047R04tRkE7RmFyYW5haDswOzA7RgorR047R04tRk87Rm9yZWNhcmlhaDswOzA7RAorR047R04tRlI7RnJpYTswOzA7QgorR047R04tR0E7R2FvdWFsOzA7MDtCCitHTjtHTi1HVTtHdWVrZWRvdTswOzA7TgorR047R04tS0E7S2Fua2FuOzA7MDtLCitHTjtHTi1LRTtLZXJvdWFuZTswOzA7SworR047R04tS0Q7S2luZGlhOzA7MDtECitHTjtHTi1LUztLaXNzaWRvdWdvdTswOzA7RgorR047R04tS0I7S291YmlhOzA7MDtMCitHTjtHTi1LTjtLb3VuZGFyYTswOzA7QgorR047R04tS087S291cm91c3NhOzA7MDtLCitHTjtHTi1MQTtMYWJlOzA7MDtMCitHTjtHTi1MRTtMZWxvdW1hOzA7MDtMCitHTjtHTi1MTztMb2xhOzA7MDtOCitHTjtHTi1NQztNYWNlbnRhOzA7MDtOCitHTjtHTi1NTDtNYWxpOzA7MDtMCitHTjtHTi1NTTtNYW1vdTswOzA7TQorR047R04tTUQ7TWFuZGlhbmE7MDswO0sKK0dOO0dOLU5aO056ZXJla29yZTswOzA7TgorR047R04tUEk7UGl0YTswOzA7TQorR047R04tU0k7U2lndWlyaTswOzA7SworR047R04tVEU7VGVsaW1lbGU7MDswO0QKK0dOO0dOLVRPO1RvdWd1ZTswOzA7TAorR047R04tWU87WW9tb3U7MDswO04KK01MO01MLUJLTztCYW1ha287MDswOzA7ZGlzdHJpY3QKK01MO01MLTc7R2FvOzA7MDtyZWdpb24KK01MO01MLTk7S2F5ZXM7MDswO3JlZ2lvbgorTUw7TUwtODtLaWRhbDswOzA7cmVnaW9uCitNTDtNTC0yO0tvdWxpa29ybzswOzA7cmVnaW9uCitNTDtNTC01O01vcHRpOzA7MDtyZWdpb24KK01MO01MLTQ7U2Vnb3U7MDswO3JlZ2lvbgorTUw7TUwtMztTaWthc3NvOzA7MDtyZWdpb24KK01MO01MLTY7VG9tYm91Y3RvdTswOzA7cmVnaW9uCitNTTtNTS0wNztBeWV5YXJ3YWR5OzA7MDswZGl2aXNpb24KK01NO01NLTAyO0JhZ287MDswOzBkaXZpc2lvbgorTU07TU0tMDM7TWFnd2F5OzA7MDswZGl2aXNpb24KK01NO01NLTA0O01hbmRhbGF5OzA7MDswZGl2aXNpb24KK01NO01NLTA7U2FnYWluZzswOzA7MGRpdmlzaW9uCitNTTtNTS0wNTtUYW5pbnRoYXJ5aTswOzA7MGRpdmlzaW9uCitNTTtNTS0wNjtZYW5nb247MDswOzBkaXZpc2lvbgorTU07TU0tNDtDaGluOzA7MDswc3RhdGUKK01NO01NLTA4O0thY2hpbjswOzA7MHN0YXRlCitNTTtNTS0yO0theWFoOzA7MDswc3RhdGUKK01NO01NLTM7S2F5aW47MDswOzBzdGF0ZQorTU07TU0tNTtNb247MDswOzBzdGF0ZQorTU07TU0tNjtSYWtoaW5lOzA7MDswc3RhdGUKK01NO01NLTc7U2hhbjswOzA7MHN0YXRlCitNTjtNTi0wMztVbGFhbmJhYXRhcjswOzA7MDtjYXBpdGFsIGNpdHkKK01OO01OLTA3MztBcmhhbmdheTswOzA7cHJvdmluY2UKK01OO01OLTA2OTtCYXlhbmhvbmdvcjswOzA7cHJvdmluY2UKK01OO01OLTA3O0JheWFuLU9sZ2l5IFtCYXlhbi1sZ2l5XTswOzA7cHJvdmluY2UKK01OO01OLTA2NztCdWxnYW47MDswO3Byb3ZpbmNlCitNTjtNTi0wMzc7RGFyaGFuIHV1bDswOzA7cHJvdmluY2UKK01OO01OLTA2O0Rvcm5vZDswOzA7cHJvdmluY2UKK01OO01OLTA2MztEb3Jub2dvdmkgW0Rvcm5vZ292XTswOzA7cHJvdmluY2UKK01OO01OLTA1OTtEdW5kZ292aSBbRHVuZGdvdl07MDswO3Byb3ZpbmNlCitNTjtNTi0wNTc7RHphdmhhbjswOzA7cHJvdmluY2UKK01OO01OLTA2NTtHb3ZpLUFsdGF5IFtHb3YtQWx0YXldOzA7MDtwcm92aW5jZQorTU47TU4tMDY0O0dvdi1T/G1iZXI7MDswO3Byb3ZpbmNlCitNTjtNTi0wMzk7SGVudGl5OzA7MDtwcm92aW5jZQorTU47TU4tMDQzO0hvdmQ7MDswO3Byb3ZpbmNlCitNTjtNTi0wNDtIb3ZzZ29sIFtIdnNnbF07MDswO3Byb3ZpbmNlCitNTjtNTi0wNTM7T21ub2dvdmkgW21uZ292XTswOzA7cHJvdmluY2UKK01OO01OLTAzNTtPcmhvbjswOzA7cHJvdmluY2UKK01OO01OLTA1NTtPdm9yaGFuZ2F5IFt2cmhhbmdheV07MDswO3Byb3ZpbmNlCitNTjtNTi0wNDk7U2VsZW5nZTswOzA7cHJvdmluY2UKK01OO01OLTA1O1N1aGJhYXRhciBbU/xoYmFhdGFyXTswOzA7cHJvdmluY2UKK01OO01OLTA0NztUb3YgW1R2XTswOzA7cHJvdmluY2UKK01OO01OLTA0NjtVdnM7MDswO3Byb3ZpbmNlCitNUjtNUi1OS0M7Tm91YWtjaG90dDswOzA7MDtkaXN0cmljdAorTVI7TVItMDc7QWRyYXI7MDswO3JlZ2lvbgorTVI7TVItMDM7QXNzYWJhOzA7MDtyZWdpb24KK01SO01SLTA1O0JyYWtuYTswOzA7cmVnaW9uCitNUjtNUi0wODtEYWtobGV0IE5vdWFkaGlib3U7MDswO3JlZ2lvbgorTVI7TVItMDQ7R29yZ29sOzA7MDtyZWdpb24KK01SO01SLTA7R3VpZGltYWthOzA7MDtyZWdpb24KK01SO01SLTA7SG9kaCBlY2ggQ2hhcmd1aTswOzA7cmVnaW9uCitNUjtNUi0wMjtIb2RoIGVsIEdoYXJiaTswOzA7cmVnaW9uCitNUjtNUi0yO0luY2hpcmk7MDswO3JlZ2lvbgorTVI7TVItMDk7VGFnYW50OzA7MDtyZWdpb24KK01SO01SLTtUaXJpcyBaZW1tb3VyOzA7MDtyZWdpb24KK01SO01SLTA2O1RyYXJ6YTswOzA7cmVnaW9uCitNVTtNVS1CUjtCZWF1IEJhc3Npbi1Sb3NlIEhpbGw7MDswOzA7Y2l0eQorTVU7TVUtQ1U7Q3VyZXBpcGU7MDswOzA7Y2l0eQorTVU7TVUtUFU7UG9ydCBMb3VpczswOzA7MDtjaXR5CitNVTtNVS1RQjtRdWF0cmUgQm9ybmVzOzA7MDswO2NpdHkKK01VO01VLVZQO1ZhY29hcy1QaG9lbml4OzA7MDswO2NpdHkKK01VO01VLUJMO0JsYWNrIFJpdmVyOzA7MDswO2Rpc3RyaWN0CitNVTtNVS1GTDtGbGFjcTswOzA7MDtkaXN0cmljdAorTVU7TVUtR1A7R3JhbmQgUG9ydDswOzA7MDtkaXN0cmljdAorTVU7TVUtTU87TW9rYTswOzA7MDtkaXN0cmljdAorTVU7TVUtUEE7UGFtcGxlbW91c3NlczswOzA7MDtkaXN0cmljdAorTVU7TVUtUFc7UGxhaW5lcyBXaWxoZW1zOzA7MDswO2Rpc3RyaWN0CitNVTtNVS1QTDtQb3J0IExvdWlzOzA7MDswO2Rpc3RyaWN0CitNVTtNVS1SUjtSaXZpZXJlIGR1IFJlbXBhcnQ7MDswOzA7ZGlzdHJpY3QKK01VO01VLVNBO1NhdmFubmU7MDswOzA7ZGlzdHJpY3QKK01VO01VLUFHO0FnYWxlZ2EgSXNsYW5kczswOzA7MGRlcGVuZGVuY3kKK01VO01VLUNDO0NhcmdhZG9zIENhcmFqb3MgU2hvYWxzIFtTYWludCBCcmFuZG9uIElzbGFuZHNdOzA7MDswZGVwZW5kZW5jeQorTVU7TVUtUk87Um9kcmlndWVzIElzbGFuZDswOzA7MGRlcGVuZGVuY3kKK01WO01WLU1MRTtNYWxlOzA7MDswO2NhcGl0YWwKK01WO01WLTAyO0FsaWY7MDswOzBhZG1pbmlzdHJhdGl2ZSBhdG9sbAorTVY7TVYtMjA7QmFhOzA7MDswYWRtaW5pc3RyYXRpdmUgYXRvbGwKK01WO01WLTc7RGhhYWx1OzA7MDswYWRtaW5pc3RyYXRpdmUgYXRvbGwKK01WO01WLTQ7RmFhZnU7MDswOzBhZG1pbmlzdHJhdGl2ZSBhdG9sbAorTVY7TVYtMjc7R2FhZiBBbGlmOzA7MDswYWRtaW5pc3RyYXRpdmUgYXRvbGwKK01WO01WLTI4O0dhYWZ1IERoYWFsdTswOzA7MGFkbWluaXN0cmF0aXZlIGF0b2xsCitNVjtNVi0yOTtHbmF2aXlhbmk7MDswOzBhZG1pbmlzdHJhdGl2ZSBhdG9sbAorTVY7TVYtMDc7SGFhIEFsaWY7MDswOzBhZG1pbmlzdHJhdGl2ZSBhdG9sbAorTVY7TVYtMjM7SGFhIERoYWFsdTswOzA7MGFkbWluaXN0cmF0aXZlIGF0b2xsCitNVjtNVi0yNjtLYWFmdTswOzA7MGFkbWluaXN0cmF0aXZlIGF0b2xsCitNVjtNVi0wNTtMYWFtdTswOzA7MGFkbWluaXN0cmF0aXZlIGF0b2xsCitNVjtNVi0wMztMaGF2aXlhbmk7MDswOzBhZG1pbmlzdHJhdGl2ZSBhdG9sbAorTVY7TVYtMjtNZWVtdTswOzA7MGFkbWluaXN0cmF0aXZlIGF0b2xsCitNVjtNVi0yNTtOb29udTswOzA7MGFkbWluaXN0cmF0aXZlIGF0b2xsCitNVjtNVi0zO1JhYTswOzA7MGFkbWluaXN0cmF0aXZlIGF0b2xsCitNVjtNVi0wO1NlZW51OzA7MDswYWRtaW5pc3RyYXRpdmUgYXRvbGwKK01WO01WLTI0O1NoYXZpeWFuaTswOzA7MGFkbWluaXN0cmF0aXZlIGF0b2xsCitNVjtNVi0wODtUaGFhOzA7MDswYWRtaW5pc3RyYXRpdmUgYXRvbGwKK01WO01WLTA0O1ZhYXZ1OzA7MDswYWRtaW5pc3RyYXRpdmUgYXRvbGwKK01XO01XLUJBO0JhbGFrYTswOzA7UworTVc7TVctQkw7QmxhbnR5cmU7MDswO1MKK01XO01XLUNLO0NoaWt3YXdhOzA7MDtTCitNVztNVy1DUjtDaGlyYWR6dWx1OzA7MDtTCitNVztNVy1DVDtDaGl0aXBhOzA7MDtOCitNVztNVy1ERTtEZWR6YTswOzA7QworTVc7TVctRE87RG93YTswOzA7QworTVc7TVctS1I7S2Fyb25nYTswOzA7TgorTVc7TVctS1M7S2FzdW5ndTswOzA7QworTVc7TVctTEs7TGlrb21hIElzbGFuZDswOzA7TgorTVc7TVctTEk7TGlsb25nd2U7MDswO0MKK01XO01XLU1IO01hY2hpbmdhOzA7MDtTCitNVztNVy1NRztNYW5nb2NoaTswOzA7UworTVc7TVctTUM7TWNoaW5qaTswOzA7QworTVc7TVctTVU7TXVsYW5qZTswOzA7UworTVc7TVctTVc7TXdhbnphOzA7MDtTCitNVztNVy1NWjtNemltYmE7MDswO04KK01XO01XLU5CO05raGF0YSBCYXk7MDswO04KK01XO01XLU5LO05raG90YWtvdGE7MDswO0MKK01XO01XLU5TO05zYW5qZTswOzA7UworTVc7TVctTlU7TnRjaGV1OzA7MDtDCitNVztNVy1OSTtOdGNoaXNpOzA7MDtDCitNVztNVy1QSDtQaGFsb21iZTswOzA7UworTVc7TVctUlU7UnVtcGhpOzA7MDtOCitNVztNVy1TQTtTYWxpbWE7MDswO0MKK01XO01XLVRIO1RoeW9sbzswOzA7UworTVc7TVctWk87Wm9tYmE7MDswO1MKK01XO01XLUM7Q2VudHJhbCBbQ2VudHJhbDRdOzA7MDtDCitNVztNVy1OO05vcnRoZXJuIFtOb3J0aGVybjFdOzA7MDtOCitNVztNVy1TO1NvdXRoZXJuIFtTb3V0aGVybjJdOzA7MDtTCitNWDtNWC1ESUY7RGlzdHJpdG8gRmVkZXJhbDswOzA7MDtmZWRlcmFsIGRpc3RyaWN0CitNWDtNWC1BR1U7QWd1YXNjYWxpZW50ZXM7MDswOzBzdGF0ZQorTVg7TVgtQkNOO0JhamEgQ2FsaWZvcm5pYTswOzA7MHN0YXRlCitNWDtNWC1CQ1M7QmFqYSBDYWxpZm9ybmlhIFN1cjswOzA7MHN0YXRlCitNWDtNWC1DQU07Q2FtcGVjaGU7MDswOzBzdGF0ZQorTVg7TVgtQ09BO0NvYWh1aWxhOzA7MDswc3RhdGUKK01YO01YLUNPTDtDb2xpbWE7MDswOzBzdGF0ZQorTVg7TVgtQ0hQO0NoaWFwYXM7MDswOzBzdGF0ZQorTVg7TVgtQ0hIO0NoaWh1YWh1YTswOzA7MHN0YXRlCitNWDtNWC1EVVI7RHVyYW5nbzswOzA7MHN0YXRlCitNWDtNWC1HVUE7R3VhbmFqdWF0bzswOzA7MHN0YXRlCitNWDtNWC1HUk87R3VlcnJlcm87MDswOzBzdGF0ZQorTVg7TVgtSElEO0hpZGFsZ287MDswOzBzdGF0ZQorTVg7TVgtSkFMO0phbGlzY287MDswOzBzdGF0ZQorTVg7TVgtTUVYO01leGljbzswOzA7MHN0YXRlCitNWDtNWC1NSUM7TWljaG9hY247MDswOzBzdGF0ZQorTVg7TVgtTU9SO01vcmVsb3M7MDswOzBzdGF0ZQorTVg7TVgtTkFZO05heWFyaXQ7MDswOzBzdGF0ZQorTVg7TVgtTkxFO051ZXZvIExlbjswOzA7MHN0YXRlCitNWDtNWC1PQVg7T2F4YWNhOzA7MDswc3RhdGUKK01YO01YLVBVRTtQdWVibGE7MDswOzBzdGF0ZQorTVg7TVgtUVVFO1F1ZXJldGFybzswOzA7MHN0YXRlCitNWDtNWC1ST087UXVpbnRhbmEgUm9vOzA7MDswc3RhdGUKK01YO01YLVNMUDtTYW4gTHVpcyBQb3RvczswOzA7MHN0YXRlCitNWDtNWC1TSU47U2luYWxvYTswOzA7MHN0YXRlCitNWDtNWC1TT047U29ub3JhOzA7MDswc3RhdGUKK01YO01YLVRBQjtUYWJhc2NvOzA7MDswc3RhdGUKK01YO01YLVRBTTtUYW1hdWxpcGFzOzA7MDswc3RhdGUKK01YO01YLVRMQTtUbGF4Y2FsYTswOzA7MHN0YXRlCitNWDtNWC1WRVI7VmVyYWNydXo7MDswOzBzdGF0ZQorTVg7TVgtWVVDO1l1Y2F0bjswOzA7MHN0YXRlCitNWDtNWC1aQUM7WmFjYXRlY2FzOzA7MDswc3RhdGUKK01ZO01ZLTQ7V2lsYXlhaCBQZXJzZWt1dHVhbiBLdWFsYSBMdW1wdXI7MDswOzA7ZmVkZXJhbCB0ZXJyaXRvcnkKK01ZO01ZLTU7V2lsYXlhaCBQZXJzZWt1dHVhbiBMYWJ1YW47MDswOzA7ZmVkZXJhbCB0ZXJyaXRvcnkKK01ZO01ZLTA7Sm9ob3I7MDswOzBzdGF0ZQorTVk7TVktMDI7S2VkYWg7MDswOzBzdGF0ZQorTVk7TVktMDM7S2VsYW50YW47MDswOzBzdGF0ZQorTVk7TVktMDQ7TWVsYWthOzA7MDswc3RhdGUKK01ZO01ZLTA1O05lZ2VyaSBTZW1iaWxhbjswOzA7MHN0YXRlCitNWTtNWS0wNjtQYWhhbmc7MDswOzBzdGF0ZQorTVk7TVktMDg7UGVyYWs7MDswOzBzdGF0ZQorTVk7TVktMDk7UGVybGlzOzA7MDswc3RhdGUKK01ZO01ZLTA3O1B1bGF1IFBpbmFuZzswOzA7MHN0YXRlCitNWTtNWS0yO1NhYmFoOzA7MDswc3RhdGUKK01ZO01ZLTM7U2FyYXdhazswOzA7MHN0YXRlCitNWTtNWS0wO1NlbGFuZ29yOzA7MDswc3RhdGUKK01ZO01ZLTtUZXJlbmdnYW51OzA7MDswc3RhdGUKK01aO01aLU1QTTtNYXB1dG87MDswOzA7Y2l0eQorTVo7TVotUDtDYWJvIERlbGdhZG87MDswO3Byb3ZpbmNlCitNWjtNWi1HO0dhemE7MDswO3Byb3ZpbmNlCitNWjtNWi1JO0luaGFtYmFuZTswOzA7cHJvdmluY2UKK01aO01aLUI7TWFuaWNhOzA7MDtwcm92aW5jZQorTVo7TVotTDtNYXB1dG87MDswO3Byb3ZpbmNlCitNWjtNWi1OO05hbXB1bGE7MDswO3Byb3ZpbmNlCitNWjtNWi1BO05pYXNzYTswOzA7cHJvdmluY2UKK01aO01aLVM7U29mYWxhOzA7MDtwcm92aW5jZQorTVo7TVotVDtUZXRlOzA7MDtwcm92aW5jZQorTVo7TVotUTtaYW1iZXppYTswOzA7cHJvdmluY2UKK05BO05BLUNBO0NhcHJpdmk7MDswOzAKK05BO05BLUVSO0Vyb25nbzswOzA7MAorTkE7TkEtSEE7SGFyZGFwOzA7MDswCitOQTtOQS1LQTtLYXJhczswOzA7MAorTkE7TkEtS0g7S2hvbWFzOzA7MDswCitOQTtOQS1LVTtLdW5lbmU7MDswOzAKK05BO05BLU9XO09oYW5nd2VuYTswOzA7MAorTkE7TkEtT0s7T2thdmFuZ287MDswOzAKK05BO05BLU9IO09tYWhla2U7MDswOzAKK05BO05BLU9TO09tdXNhdGk7MDswOzAKK05BO05BLU9OO09zaGFuYTswOzA7MAorTkE7TkEtT1Q7T3NoaWtvdG87MDswOzAKK05BO05BLU9EO090am96b25kanVwYTswOzA7MAorTkU7TkUtODtOaWFtZXk7MDswOzB1cmJhbiBjb21tdW5pdHkKK05FO05FLTk7QWdhZGV6OzA7MDswZGVwYXJ0bWVudAorTkU7TkUtMjtEaWZmYTswOzA7MGRlcGFydG1lbnQKK05FO05FLTM7RG9zc287MDswOzBkZXBhcnRtZW50CitORTtORS00O01hcmFkaTswOzA7MGRlcGFydG1lbnQKK05FO05FLTU7VGFob3VhOzA7MDswZGVwYXJ0bWVudAorTkU7TkUtNjtUaWxsYWJlcmk7MDswOzBkZXBhcnRtZW50CitORTtORS03O1ppbmRlcjswOzA7MGRlcGFydG1lbnQKK05HO05HLUZDO0FidWphIENhcGl0YWwgVGVycml0b3J5OzA7MDswO2NhcGl0YWwgdGVycml0b3J5CitORztORy1BQjtBYmlhOzA7MDswc3RhdGUKK05HO05HLUFEO0FkYW1hd2E7MDswOzBzdGF0ZQorTkc7TkctQUs7QWt3YSBJYm9tOzA7MDswc3RhdGUKK05HO05HLUFOO0FuYW1icmE7MDswOzBzdGF0ZQorTkc7TkctQkE7QmF1Y2hpOzA7MDswc3RhdGUKK05HO05HLUJZO0JheWVsc2E7MDswOzBzdGF0ZQorTkc7TkctQkU7QmVudWU7MDswOzBzdGF0ZQorTkc7TkctQk87Qm9ybm87MDswOzBzdGF0ZQorTkc7TkctQ1I7Q3Jvc3MgUml2ZXI7MDswOzBzdGF0ZQorTkc7TkctREU7RGVsdGE7MDswOzBzdGF0ZQorTkc7TkctRUI7RWJvbnlpOzA7MDswc3RhdGUKK05HO05HLUVEO0VkbzswOzA7MHN0YXRlCitORztORy1FSztFa2l0aTswOzA7MHN0YXRlCitORztORy1FTjtFbnVndTswOzA7MHN0YXRlCitORztORy1HTztHb21iZTswOzA7MHN0YXRlCitORztORy1JTTtJbW87MDswOzBzdGF0ZQorTkc7TkctSkk7SmlnYXdhOzA7MDswc3RhdGUKK05HO05HLUtEO0thZHVuYTswOzA7MHN0YXRlCitORztORy1LTjtLYW5vOzA7MDswc3RhdGUKK05HO05HLUtUO0thdHNpbmE7MDswOzBzdGF0ZQorTkc7TkctS0U7S2ViYmk7MDswOzBzdGF0ZQorTkc7TkctS087S29naTswOzA7MHN0YXRlCitORztORy1LVztLd2FyYTswOzA7MHN0YXRlCitORztORy1MQTtMYWdvczswOzA7MHN0YXRlCitORztORy1OQTtOYXNzYXJhd2E7MDswOzBzdGF0ZQorTkc7TkctTkk7TmlnZXI7MDswOzBzdGF0ZQorTkc7TkctT0c7T2d1bjswOzA7MHN0YXRlCitORztORy1PTjtPbmRvOzA7MDswc3RhdGUKK05HO05HLU9TO09zdW47MDswOzBzdGF0ZQorTkc7TkctT1k7T3lvOzA7MDswc3RhdGUKK05HO05HLVBMO1BsYXRlYXU7MDswOzBzdGF0ZQorTkc7TkctUkk7Uml2ZXJzOzA7MDswc3RhdGUKK05HO05HLVNPO1Nva290bzswOzA7MHN0YXRlCitORztORy1UQTtUYXJhYmE7MDswOzBzdGF0ZQorTkc7TkctWU87WW9iZTswOzA7MHN0YXRlCitORztORy1aQTtaYW1mYXJhOzA7MDswc3RhdGUKK05JO05JLUJPO0JvYWNvOzA7MDswZGVwYXJ0bWVudAorTkk7TkktQ0E7Q2FyYXpvOzA7MDswZGVwYXJ0bWVudAorTkk7TkktQ0k7Q2hpbmFuZGVnYTswOzA7MGRlcGFydG1lbnQKK05JO05JLUNPO0Nob250YWxlczswOzA7MGRlcGFydG1lbnQKK05JO05JLUVTO0VzdGVsOzA7MDswZGVwYXJ0bWVudAorTkk7TkktR1I7R3JhbmFkYTswOzA7MGRlcGFydG1lbnQKK05JO05JLUpJO0ppbm90ZWdhOzA7MDswZGVwYXJ0bWVudAorTkk7TkktTEU7TGVuOzA7MDswZGVwYXJ0bWVudAorTkk7TkktTUQ7TWFkcml6OzA7MDswZGVwYXJ0bWVudAorTkk7TkktTU47TWFuYWd1YTswOzA7MGRlcGFydG1lbnQKK05JO05JLU1TO01hc2F5YTswOzA7MGRlcGFydG1lbnQKK05JO05JLU1UO01hdGFnYWxwYTswOzA7MGRlcGFydG1lbnQKK05JO05JLU5TO051ZXZhIFNlZ292aWE7MDswOzBkZXBhcnRtZW50CitOSTtOSS1TSjtSbyBTYW4gSnVhbjswOzA7MGRlcGFydG1lbnQKK05JO05JLVJJO1JpdmFzOzA7MDswZGVwYXJ0bWVudAorTkk7TkktQU47QXRsbnRpY28gTm9ydGU7MDswO2F1dG9ub21vdXMgcmVnaW9uCitOSTtOSS1BUztBdGxudGljbyBTdXI7MDswO2F1dG9ub21vdXMgcmVnaW9uCitOTDtOTC1EUjtEcmVudGhlOzA7MDswCitOTDtOTC1GTDtGbGV2b2xhbmQ7MDswOzAKK05MO05MLUZSO0ZyaWVzbGFuZDswOzA7MAorTkw7TkwtR0U7R2VsZGVybGFuZDswOzA7MAorTkw7TkwtR1I7R3JvbmluZ2VuOzA7MDswCitOTDtOTC1MSTtMaW1idXJnOzA7MDswCitOTDtOTC1OQjtOb29yZC1CcmFiYW50OzA7MDswCitOTDtOTC1OSDtOb29yZC1Ib2xsYW5kOzA7MDswCitOTDtOTC1PVjtPdmVyaWpzc2VsOzA7MDswCitOTDtOTC1VVDtVdHJlY2h0OzA7MDswCitOTDtOTC1aRTtaZWVsYW5kOzA7MDswCitOTDtOTC1aSDtadWlkLUhvbGxhbmQ7MDswOzAKK05PO05PLTAyO0FrZXJzaHVzOzA7MDswCitOTztOTy0wOTtBdXN0LUFnZGVyOzA7MDswCitOTztOTy0wNjtCdXNrZXJ1ZDswOzA7MAorTk87Tk8tMjA7Rmlubm1hcms7MDswOzAKK05PO05PLTA0O0hlZG1hcms7MDswOzAKK05PO05PLTI7SG9yZGFsYW5kOzA7MDswCitOTztOTy01O01yZSBvZyBSb21zZGFsOzA7MDswCitOTztOTy04O05vcmRsYW5kOzA7MDswCitOTztOTy03O05vcmQtVHJuZGVsYWc7MDswOzAKK05PO05PLTA1O09wcGxhbmQ7MDswOzAKK05PO05PLTAzO09zbG87MDswOzAKK05PO05PLTIxO1JvZ2FsYW5kOzA7MDswCitOTztOTy00O1NvZ24gb2cgRmpvcmRhbmU7MDswOzAKK05PO05PLTY7U3ItVHJuZGVsYWc7MDswOzAKK05PO05PLTA4O1RlbGVtYXJrOzA7MDswCitOTztOTy05O1Ryb21zOzA7MDswCitOTztOTy0wO1Zlc3QtQWdkZXI7MDswOzAKK05PO05PLTA3O1Zlc3Rmb2xkOzA7MDswCitOTztOTy0wO3N0Zm9sZDswOzA7MAorTk87Tk8tMjI7SmFuIE1heWVuIChBcmN0aWMgUmVnaW9uKSAoU2VlIGFsc28gY291bnRyeSBjb2RlIFNKKTswOzA7MAorTk87Tk8tMjtTdmFsYmFyZCAoQXJjdGljIFJlZ2lvbikgKFNlZSBhbHNvIGNvdW50cnkgY29kZSBTSik7MDswOzAKK05QO05QLUJBO0JhZ21hdGk7MDswOzAKK05QO05QLUJIO0JoZXJpOzA7MDsyCitOUDtOUC1ESDtEaGF3YWxhZ2lyaTswOzA7MworTlA7TlAtR0E7R2FuZGFraTswOzA7MworTlA7TlAtSkE7SmFuYWtwdXI7MDswOzAKK05QO05QLUtBO0thcm5hbGk7MDswOzIKK05QO05QLUtPO0tvc2kgW0tvc2hpXTswOzA7NAorTlA7TlAtTFU7THVtYmluaTswOzA7MworTlA7TlAtTUE7TWFoYWthbGk7MDswOzUKK05QO05QLU1FO01lY2hpOzA7MDs0CitOUDtOUC1OQTtOYXJheWFuaTswOzA7MAorTlA7TlAtUkE7UmFwdGk7MDswOzIKK05QO05QLVNBO1NhZ2FybWF0aGE7MDswOzQKK05QO05QLVNFO1NldGk7MDswOzUKK05aO05aLUFVSztBdWNrbGFuZDswOzA7TgorTlo7TlotQk9QO0JheSBvZiBQbGVudHk7MDswO04KK05aO05aLUNBTjtDYW50ZXJidXJ5OzA7MDtTCitOWjtOWi1HSVM7R2lzYm9ybmU7MDswO04KK05aO05aLUhLQjtIYXdrZXNzIEJheTswOzA7TgorTlo7TlotTVdUO01hbmF3YXR1LVdhbmdhbnVpOzA7MDtOCitOWjtOWi1NQkg7TWFybGJvcm91Z2g7MDswO1M7CitOWjtOWi1OU047TmVsc29uOzA7MDtTOworTlo7TlotTlRMO05vcnRobGFuZDswOzA7TjsKK05aO05aLU9UQTtPdGFnbzswOzA7UzsKK05aO05aLVNUTDtTb3V0aGxhbmQ7MDswO1M7CitOWjtOWi1US0k7VGFyYW5ha2k7MDswO047CitOWjtOWi1UQVM7VGFzbWFuOzA7MDtTOworTlo7TlotV0tPO1dhaWthdG87MDswO047CitOWjtOWi1XR047V2VsbGluZ3RvbjswOzA7TjsKK05aO05aLVdUQztXZXN0IENvYXN0OzA7MDtTOworT007T00tREE7QWQgRGFraGlsaXlhaDswOzA7MAorT007T00tQkE7QWwgQmFpbmFoOzA7MDswCitPTTtPTS1KQTtBbCBKYW5ieWFoIFtadWZyXTswOzA7MAorT007T00tV1U7QWwgV3VzOzA7MDswCitPTTtPTS1TSDtBc2ggU2hhcnF5YWg7MDswOzAKK09NO09NLVpBO0F6IFpoaXJhaDswOzA7MAorT007T00tTUE7TWFzcWE7MDswOzAKK09NO09NLU1VO011c2FuZGFtOzA7MDswCitQQTtQQS07Qm9jYXMgZGVsIFRvcm87MDswO3Byb3ZpbmNlCitQQTtQQS0yO0NvY2xlOzA7MDtwcm92aW5jZQorUEE7UEEtMztDb2xuOzA7MDtwcm92aW5jZQorUEE7UEEtNDtDaGlyaXF1OzA7MDtwcm92aW5jZQorUEE7UEEtNTtEYXJpZW47MDswO3Byb3ZpbmNlCitQQTtQQS02O0hlcnJlcmE7MDswO3Byb3ZpbmNlCitQQTtQQS03O0xvcyBTYW50b3M7MDswO3Byb3ZpbmNlCitQQTtQQS04O1BhbmFtOzA7MDtwcm92aW5jZQorUEE7UEEtOTtWZXJhZ3VhczswOzA7cHJvdmluY2UKK1BBO1BBLTA7Q29tYXJjYSBkZSBTYW4gQmxhczswOzA7MHNwZWNpYWwgdGVycml0b3J5CitQRTtQRS1DQUw7RWwgQ2FsbGFvOzA7MDswY29uc3RpdHV0aW9uYWwgcHJvdmluY2UKK1BFO1BFLUFNQTtBbWF6b25hczswOzA7MGRlcGFydG1lbnQKK1BFO1BFLUFOQztBbmNhc2g7MDswOzBkZXBhcnRtZW50CitQRTtQRS1BUFU7QXB1cmltYWM7MDswOzBkZXBhcnRtZW50CitQRTtQRS1BUkU7QXJlcXVpcGE7MDswOzBkZXBhcnRtZW50CitQRTtQRS1BWUE7QXlhY3VjaG87MDswOzBkZXBhcnRtZW50CitQRTtQRS1DQUo7Q2FqYW1hcmNhOzA7MDswZGVwYXJ0bWVudAorUEU7UEUtQ1VTO0N1emNvIFtDdXNjb107MDswOzBkZXBhcnRtZW50CitQRTtQRS1IVVY7SHVhbmNhdmVsaWNhOzA7MDswZGVwYXJ0bWVudAorUEU7UEUtSFVDO0h1YW51Y287MDswOzBkZXBhcnRtZW50CitQRTtQRS1JQ0E7SWNhOzA7MDswZGVwYXJ0bWVudAorUEU7UEUtSlVOO0p1bmluOzA7MDswZGVwYXJ0bWVudAorUEU7UEUtTEFMO0xhIExpYmVydGFkOzA7MDswZGVwYXJ0bWVudAorUEU7UEUtTEFNO0xhbWJheWVxdWU7MDswOzBkZXBhcnRtZW50CitQRTtQRS1MSU07TGltYTswOzA7MGRlcGFydG1lbnQKK1BFO1BFLUxPUjtMb3JldG87MDswOzBkZXBhcnRtZW50CitQRTtQRS1NREQ7TWFkcmUgZGUgRGlvczswOzA7MGRlcGFydG1lbnQKK1BFO1BFLU1PUTtNb3F1ZWd1YTswOzA7MGRlcGFydG1lbnQKK1BFO1BFLVBBUztQYXNjbzswOzA7MGRlcGFydG1lbnQKK1BFO1BFLVBJVTtQaXVyYTswOzA7MGRlcGFydG1lbnQKK1BFO1BFLVBVTjtQdW5vOzA7MDswZGVwYXJ0bWVudAorUEU7UEUtU0FNO1NhbiBNYXJ0aW47MDswOzBkZXBhcnRtZW50CitQRTtQRS1UQUM7VGFjbmE7MDswOzBkZXBhcnRtZW50CitQRTtQRS1UVU07VHVtYmVzOzA7MDswZGVwYXJ0bWVudAorUEU7UEUtVUNBO1VjYXlhbGk7MDswOzBkZXBhcnRtZW50CitQRztQRy1OQ0Q7TmF0aW9uYWwgQ2FwaXRhbCBEaXN0cmljdCAoUG9ydCBNb3Jlc2J5KTswOzA7MDtkaXN0cmljdAorUEc7UEctQ1BNO0NlbnRyYWw7MDswO3Byb3ZpbmNlCitQRztQRy1DUEs7Q2hpbWJ1OzA7MDtwcm92aW5jZQorUEc7UEctRUhHO0Vhc3Rlcm4gSGlnaGxhbmRzOzA7MDtwcm92aW5jZQorUEc7UEctRUJSO0Vhc3QgTmV3IEJyaXRhaW47MDswO3Byb3ZpbmNlCitQRztQRy1FU1c7RWFzdCBTZXBpazswOzA7cHJvdmluY2UKK1BHO1BHLUVQVztFbmdhOzA7MDtwcm92aW5jZQorUEc7UEctR1BLO0d1bGY7MDswO3Byb3ZpbmNlCitQRztQRy1NUE07TWFkYW5nOzA7MDtwcm92aW5jZQorUEc7UEctTVJMO01hbnVzOzA7MDtwcm92aW5jZQorUEc7UEctTUJBO01pbG5lIEJheTswOzA7cHJvdmluY2UKK1BHO1BHLU1QTDtNb3JvYmU7MDswO3Byb3ZpbmNlCitQRztQRy1OSUs7TmV3IElyZWxhbmQ7MDswO3Byb3ZpbmNlCitQRztQRy1OUFA7Tm9ydGhlcm47MDswO3Byb3ZpbmNlCitQRztQRy1OU0E7Tm9ydGggU29sb21vbnM7MDswO3Byb3ZpbmNlCitQRztQRy1TQU47U2FuZGF1biBbV2VzdCBTZXBpa107MDswO3Byb3ZpbmNlCitQRztQRy1TSE07U291dGhlcm4gSGlnaGxhbmRzOzA7MDtwcm92aW5jZQorUEc7UEctV1BEO1dlc3Rlcm47MDswO3Byb3ZpbmNlCitQRztQRy1XSE07V2VzdGVybiBIaWdobGFuZHM7MDswO3Byb3ZpbmNlCitQRztQRy1XQks7V2VzdCBOZXcgQnJpdGFpbjswOzA7cHJvdmluY2UKK1BIO1BILUFCUjtBYnJhOzA7MDs1CitQSDtQSC1BR047QWd1c2FuIGRlbCBOb3J0ZTswOzA7MworUEg7UEgtQUdTO0FndXNhbiBkZWwgU3VyOzA7MDszCitQSDtQSC1BS0w7QWtsYW47MDswOzA2CitQSDtQSC1BTEI7QWxiYXk7MDswOzA1CitQSDtQSC1BTlQ7QW50aXF1ZTswOzA7MDYKK1BIO1BILUFQQTtBcGF5YW87MDswOzUKK1BIO1BILUFVUjtBdXJvcmE7MDswOzA0CitQSDtQSC1CQVM7QmFzaWxhbjswOzA7MDkKK1BIO1BILUJBTjtCYXRhYW47MDswOzAzCitQSDtQSC1CVE47QmF0YW5lczswOzA7MDIKK1BIO1BILUJURztCYXRhbmdhczswOzA7MDQKK1BIO1BILUJFTjtCZW5ndWV0OzA7MDs1CitQSDtQSC1CSUw7QmlsaXJhbjswOzA7MDgKK1BIO1BILUJPSDtCb2hvbDswOzA7MDcKK1BIO1BILUJVSztCdWtpZG5vbjswOzA7MAorUEg7UEgtQlVMO0J1bGFjYW47MDswOzAzCitQSDtQSC1DQUc7Q2FnYXlhbjswOzA7MDIKK1BIO1BILUNBTjtDYW1hcmluZXMgTm9ydGU7MDswOzA1CitQSDtQSC1DQVM7Q2FtYXJpbmVzIFN1cjswOzA7MDUKK1BIO1BILUNBTTtDYW1pZ3VpbjswOzA7MAorUEg7UEgtQ0FQO0NhcGl6OzA7MDswNgorUEg7UEgtQ0FUO0NhdGFuZHVhbmVzOzA7MDswNQorUEg7UEgtQ0FWO0Nhdml0ZTswOzA7MDQKK1BIO1BILUNFQjtDZWJ1OzA7MDswNworUEg7UEgtQ09NO0NvbXBvc3RlbGEgVmFsbGV5OzA7MDswCitQSDtQSC1EQVY7RGF2YW8gZGVsIE5vcnRlOzA7MDswCitQSDtQSC1EQVM7RGF2YW8gZGVsIFN1cjswOzA7MAorUEg7UEgtREFPO0RhdmFvIE9yaWVudGFsOzA7MDswCitQSDtQSC1FQVM7RWFzdGVybiBTYW1hcjswOzA7MDgKK1BIO1BILUdVSTtHdWltYXJhczswOzA7MDYKK1BIO1BILUlGVTtJZnVnYW87MDswOzUKK1BIO1BILUlMTjtJbG9jb3MgTm9ydGU7MDswOzAKK1BIO1BILUlMUztJbG9jb3MgU3VyOzA7MDswCitQSDtQSC1JTEk7SWxvaWxvOzA7MDswNgorUEg7UEgtSVNBO0lzYWJlbGE7MDswOzAyCitQSDtQSC1LQUw7S2FsaW5nYTswOzA7NQorUEg7UEgtTEFHO0xhZ3VuYTswOzA7MDQKK1BIO1BILUxBTjtMYW5hbyBkZWwgTm9ydGU7MDswOzIKK1BIO1BILUxBUztMYW5hbyBkZWwgU3VyOzA7MDs0CitQSDtQSC1MVU47TGEgVW5pb247MDswOzAKK1BIO1BILUxFWTtMZXl0ZTswOzA7MDgKK1BIO1BILU1BRztNYWd1aW5kYW5hbzswOzA7NAorUEg7UEgtTUFEO01hcmluZHVxdWU7MDswOzA0CitQSDtQSC1NQVM7TWFzYmF0ZTswOzA7MDUKK1BIO1BILU1EQztNaW5kb3JvIE9jY2lkZW50YWw7MDswOzA0CitQSDtQSC1NRFI7TWluZG9ybyBPcmllbnRhbDswOzA7MDQKK1BIO1BILU1TQztNaXNhbWlzIE9jY2lkZW50YWw7MDswOzAKK1BIO1BILU1TUjtNaXNhbWlzIE9yaWVudGFsOzA7MDswCitQSDtQSC1NT1U7TW91bnRhaW4gUHJvdmluY2U7MDswOzUKK1BIO1BILU5FQztOZWdyb3MgT2NjaWRlbnRhbDswOzA7MDYKK1BIO1BILU5FUjtOZWdyb3MgT3JpZW50YWw7MDswOzA3CitQSDtQSC1OQ087Tm9ydGggQ290YWJhdG87MDswOzIKK1BIO1BILU5TQTtOb3J0aGVybiBTYW1hcjswOzA7MDgKK1BIO1BILU5VRTtOdWV2YSBFY2lqYTswOzA7MDMKK1BIO1BILU5VVjtOdWV2YSBWaXpjYXlhOzA7MDswMgorUEg7UEgtUExXO1BhbGF3YW47MDswOzA0CitQSDtQSC1QQU07UGFtcGFuZ2E7MDswOzAzCitQSDtQSC1QQU47UGFuZ2FzaW5hbjswOzA7MAorUEg7UEgtUVVFO1F1ZXpvbjswOzA7MDQKK1BIO1BILVFVSTtRdWlyaW5vOzA7MDswMgorUEg7UEgtUklaO1JpemFsOzA7MDswNAorUEg7UEgtUk9NO1JvbWJsb247MDswOzA0CitQSDtQSC1TQVI7U2FyYW5nYW5pOzA7MDswCitQSDtQSC1TSUc7U2lxdWlqb3I7MDswOzA3CitQSDtQSC1TT1I7U29yc29nb247MDswOzA1CitQSDtQSC1TQ087U291dGggQ290YWJhdG87MDswOzAKK1BIO1BILVNMRTtTb3V0aGVybiBMZXl0ZTswOzA7MDgKK1BIO1BILVNVSztTdWx0YW4gS3VkYXJhdDswOzA7MgorUEg7UEgtU0xVO1N1bHU7MDswOzQKK1BIO1BILVNVTjtTdXJpZ2FvIGRlbCBOb3J0ZTswOzA7MworUEg7UEgtU1VSO1N1cmlnYW8gZGVsIFN1cjswOzA7MworUEg7UEgtVEFSO1RhcmxhYzswOzA7MDMKK1BIO1BILVRBVztUYXdpLVRhd2k7MDswOzQKK1BIO1BILVdTQTtXZXN0ZXJuIFNhbWFyOzA7MDswOAorUEg7UEgtWk1CO1phbWJhbGVzOzA7MDswMworUEg7UEgtWkFOO1phbWJvYW5nYSBkZWwgTm9ydGU7MDswOzA5CitQSDtQSC1aQVM7WmFtYm9hbmdhIGRlbCBTdXI7MDswOzA5CitQSDtQSC1aU0k7WmFtYm9hbmdhIFNpYnVndWV5IFtaYW1ib2FuZ2EgU2lidWdheV07MDswOzA5CitQSztQSy1JUztJc2xhbWFiYWQ7MDswOzA7ZmVkZXJhbCBjYXBpdGFsIHRlcnJpdG9yeQorUEs7UEstQkE7QmFsdWNoaXN0YW4gW0JhbHVjaGlzdGFuIChlbildO0JhbG9jaGlzdG4gKHVyKTswOzA7cHJvdmluY2UKK1BLO1BLLU5XO04uVy5GLlAuIFtOb3J0aC1XZXN0IEZyb250aWVyXTswOzA7cHJvdmluY2UKK1BLO1BLLVBCO1B1bmphYjswOzA7cHJvdmluY2UKK1BLO1BLLVNEO1NpbmQgW1NpbmQgKGVuKV07U2luZGggKHVyKTswOzA7cHJvdmluY2UKK1BLO1BLLVRBO0YuQS5ULkEuIFtGZWRlcmFsbHkgQWRtaW5pc3RlcmVkIFRyaWJhbCBBcmVhc107MDswOzA7dGVycml0b3J5CitQSztQSy1KSztKYW1tdSBhbmQgS2FzaG1pciBbQXphZCBLYXNobWlyXTswOzA7MDtQYWtpc3RhbiBhZG1pbmlzdGVyZWQgYXJlYQorUEs7UEstTkE7Tm9ydGhlcm4gQXJlYXM7MDswOzA7UGFraXN0YW4gYWRtaW5pc3RlcmVkIGFyZWEKK1BMO1BMLURTO0RvbG5vZWxza2llOzA7MDswCitQTDtQTC1LUDtLdWphd3Nrby1wb21vcnNraWU7MDswOzAKK1BMO1BMLUxVO0x1YmVsc2tpZTswOzA7MAorUEw7UEwtTEI7THVidXNraWU7MDswOzAKK1BMO1BMLUxEO6NkemtpZTswOzA7MAorUEw7UEwtTUE7TWGzb3BvbHNraWU7MDswOzAKK1BMO1BMLU1aO01hem93aWVja2llOzA7MDswCitQTDtQTC1PUDtPcG9sc2tpZTswOzA7MAorUEw7UEwtUEs7UG9ka2FycGFja2llOzA7MDswCitQTDtQTC1QRDtQb2RsYXNraWU7MDswOzAKK1BMO1BMLVBNO1BvbW9yc2tpZTswOzA7MAorUEw7UEwtU0w7ZWxza2llOzA7MDswCitQTDtQTC1TSztld2lldG9rcnp5c2tpZTswOzA7MAorUEw7UEwtV047V2FybWlza28tbWF6dXJza2llOzA7MDswCitQTDtQTC1XUDtXaWVsa29wb2xza2llOzA7MDswCitQTDtQTC1aUDtaYWNob2RuaW9wb21vcnNraWU7MDswOzAKK1BUO1BULTA7QXZlaXJvOzA7MDswO2Rpc3RyaWN0CitQVDtQVC0wMjtCZWphOzA7MDswO2Rpc3RyaWN0CitQVDtQVC0wMztCcmFnYTswOzA7MDtkaXN0cmljdAorUFQ7UFQtMDQ7QnJhZ2FuY2E7MDswOzA7ZGlzdHJpY3QKK1BUO1BULTA1O0Nhc3RlbG8gQnJhbmNvOzA7MDswO2Rpc3RyaWN0CitQVDtQVC0wNjtDb2ltYnJhOzA7MDswO2Rpc3RyaWN0CitQVDtQVC0wNzt2b3JhOzA7MDswO2Rpc3RyaWN0CitQVDtQVC0wODtGYXJvOzA7MDswO2Rpc3RyaWN0CitQVDtQVC0wOTtHdWFyZGE7MDswOzA7ZGlzdHJpY3QKK1BUO1BULTA7TGVpcmlhOzA7MDswO2Rpc3RyaWN0CitQVDtQVC07TGlzYm9hOzA7MDswO2Rpc3RyaWN0CitQVDtQVC0yO1BvcnRhbGVncmU7MDswOzA7ZGlzdHJpY3QKK1BUO1BULTM7UG9ydG87MDswOzA7ZGlzdHJpY3QKK1BUO1BULTQ7U2FudGFyZW07MDswOzA7ZGlzdHJpY3QKK1BUO1BULTU7U2V0YmFsOzA7MDswO2Rpc3RyaWN0CitQVDtQVC02O1ZpYW5hIGRvIENhc3RlbG87MDswOzA7ZGlzdHJpY3QKK1BUO1BULTc7VmlsYSBSZWFsOzA7MDswO2Rpc3RyaWN0CitQVDtQVC04O1Zpc2V1OzA7MDswO2Rpc3RyaWN0CitQVDtQVC0yMDtSZWdpbyBBdXRub21hIGRvcyBBY29yZXM7MDswO2F1dG9ub21vdXMgcmVnaW9uCitQVDtQVC0zMDtSZWdpbyBBdXRub21hIGRhIE1hZGVpcmE7MDswO2F1dG9ub21vdXMgcmVnaW9uCitQWTtQWS1BU1U7QXN1bmNpb247MDswOzA7Y2FwaXRhbAorUFk7UFktNjtBbHRvIFBhcmFndWF5OzA7MDswZGVwYXJ0bWVudAorUFk7UFktMDtBbHRvIFBhcmFuYTswOzA7MGRlcGFydG1lbnQKK1BZO1BZLTM7QW1hbWJheTswOzA7MGRlcGFydG1lbnQKK1BZO1BZLTE5O0JvcXVlcm9uOzA7MDswZGVwYXJ0bWVudAorUFk7UFktNTtDYWFndWF6OzA7MDswZGVwYXJ0bWVudAorUFk7UFktMTY7Q2FhemFwYTswOzA7MGRlcGFydG1lbnQKK1BZO1BZLTE0O0NhbmluZGV5dTswOzA7MGRlcGFydG1lbnQKK1BZO1BZLTE3O0NlbnRyYWw7MDswOzBkZXBhcnRtZW50CitQWTtQWS0xODtDb25jZXBjaW9uOzA7MDswZGVwYXJ0bWVudAorUFk7UFktMTM7Q29yZGlsbGVyYTswOzA7MGRlcGFydG1lbnQKK1BZO1BZLTQ7R3VhaXJhOzA7MDswZGVwYXJ0bWVudAorUFk7UFktNztJdGFwdWE7MDswOzBkZXBhcnRtZW50CitQWTtQWS04O01pc2lvbmVzOzA7MDswZGVwYXJ0bWVudAorUFk7UFktMjtOZWVtYnVjdTswOzA7MGRlcGFydG1lbnQKK1BZO1BZLTk7UGFyYWd1YXJpOzA7MDswZGVwYXJ0bWVudAorUFk7UFktMTU7UHJlc2lkZW50ZSBIYXllczswOzA7MGRlcGFydG1lbnQKK1BZO1BZLTEyO1NhbiBQZWRybzswOzA7MGRlcGFydG1lbnQKK1FBO1FBLURBO0FkIERhd2FoOzA7MDswCitRQTtRQS1HSDtBbCBHaHV3YXlyaXlhaDswOzA7MAorUUE7UUEtSlU7QWwgSnVtYXlsaXlhaDswOzA7MAorUUE7UUEtS0g7QWwgS2hhd3I7MDswOzAKK1FBO1FBLVdBO0FsIFdha3JhaDswOzA7MAorUUE7UUEtUkE7QXIgUmF5eWFuOzA7MDswCitRQTtRQS1KQjtKYXJpeWFuIGFsIEJhbmFoOzA7MDswCitRQTtRQS1NUztNYWRuYXQgYXNoIFNoYW1sOzA7MDswCitRQTtRQS1VUztVbW0gYWxsOzA7MDswCitSTztSTy1CO0J1Y3VyZXRpOzA7MDswbXVuaWNpcGFsaXR5CitSTztSTy1BQjtBbGJhOzA7MDswZGVwYXJ0bWVudAorUk87Uk8tQVI7QXJhZDswOzA7MGRlcGFydG1lbnQKK1JPO1JPLUFHO0FyZ2U7MDswOzBkZXBhcnRtZW50CitSTztSTy1CQztCYWN1OzA7MDswZGVwYXJ0bWVudAorUk87Uk8tQkg7Qmlob3I7MDswOzBkZXBhcnRtZW50CitSTztSTy1CTjtCaXN0cmlhLU5zdWQ7MDswOzBkZXBhcnRtZW50CitSTztSTy1CVDtCb3RvYW5pOzA7MDswZGVwYXJ0bWVudAorUk87Uk8tQlY7QnJhb3Y7MDswOzBkZXBhcnRtZW50CitSTztSTy1CUjtCcmlsYTswOzA7MGRlcGFydG1lbnQKK1JPO1JPLUJaO0J1enU7MDswOzBkZXBhcnRtZW50CitSTztSTy1DUztDYXJhLVNldmVyaW47MDswOzBkZXBhcnRtZW50CitSTztSTy1DTDtDbHJhaTswOzA7MGRlcGFydG1lbnQKK1JPO1JPLUNKO0NsdWo7MDswOzBkZXBhcnRtZW50CitSTztSTy1DVDtDb25zdGFuYTswOzA7MGRlcGFydG1lbnQKK1JPO1JPLUNWO0NvdmFzbmE7MDswOzBkZXBhcnRtZW50CitSTztSTy1EQjtEYW1ib3ZpYTswOzA7MGRlcGFydG1lbnQKK1JPO1JPLURKO0RvbGo7MDswOzBkZXBhcnRtZW50CitSTztSTy1HTDtHYWxhaTswOzA7MGRlcGFydG1lbnQKK1JPO1JPLUdSO0dpdXJnaXU7MDswOzBkZXBhcnRtZW50CitSTztSTy1HSjtHb3JqOzA7MDswZGVwYXJ0bWVudAorUk87Uk8tSFI7SGFyZ2hpdGE7MDswOzBkZXBhcnRtZW50CitSTztSTy1IRDtIdW5lZG9hcmE7MDswOzBkZXBhcnRtZW50CitSTztSTy1JTDtJYWxvbWlhOzA7MDswZGVwYXJ0bWVudAorUk87Uk8tSVM7SWFpOzA7MDswZGVwYXJ0bWVudAorUk87Uk8tTU07TWFyYW11cmU7MDswOzBkZXBhcnRtZW50CitSTztSTy1NSDtNZWhlZGluaTswOzA7MGRlcGFydG1lbnQKK1JPO1JPLU1TO011cmU7MDswOzBkZXBhcnRtZW50CitSTztSTy1OVDtOZWFtOzA7MDswZGVwYXJ0bWVudAorUk87Uk8tT1Q7T2x0OzA7MDswZGVwYXJ0bWVudAorUk87Uk8tUEg7UHJhaG92YTswOzA7MGRlcGFydG1lbnQKK1JPO1JPLVNNO1NhdHUgTWFyZTswOzA7MGRlcGFydG1lbnQKK1JPO1JPLVNKO1NsYWo7MDswOzBkZXBhcnRtZW50CitSTztSTy1TQjtTaWJpdTswOzA7MGRlcGFydG1lbnQKK1JPO1JPLVNWO1N1Y2VhdmE7MDswOzBkZXBhcnRtZW50CitSTztSTy1UUjtUZWxlb3JtYW47MDswOzBkZXBhcnRtZW50CitSTztSTy1UTTtUaW1pOzA7MDswZGVwYXJ0bWVudAorUk87Uk8tVEw7VHVsY2VhOzA7MDswZGVwYXJ0bWVudAorUk87Uk8tVlM7VmFzbHVpOzA7MDswZGVwYXJ0bWVudAorUk87Uk8tVkw7VmFsY2VhOzA7MDswZGVwYXJ0bWVudAorUk87Uk8tVk47VnJhbmNlYTswOzA7MGRlcGFydG1lbnQKK1JVO1JVLUFEO0FkeWdleWEsIFJlc3B1Ymxpa2E7QWR5Z2VqYSwgUmVzcHVibGlrYTswOzA7cmVwdWJsaWMKK1JVO1JVLUFMO0FsdGF5LCBSZXNwdWJsaWthO0FsdGFqLCBSZXNwdWJsaWthOzA7MDtyZXB1YmxpYworUlU7UlUtQkE7QmFzaGtvcnRvc3RhbiwgUmVzcHVibGlrYTtCYWtvcnRvc3RhbiwgUmVzcHVibGlrYTswOzA7cmVwdWJsaWMKK1JVO1JVLUJVO0J1cnlhdGl5YSwgUmVzcHVibGlrYTtCdXJqYXRpamEsIFJlc3B1Ymxpa2E7MDswO3JlcHVibGljCitSVTtSVS1DRTtDaGVjaGVuc2theWEgUmVzcHVibGlrYTtlZWVuc2thamEgUmVzcHVibGlrYTswOzA7cmVwdWJsaWMKK1JVO1JVLUNVO0NodXZhc2hza2F5YSBSZXNwdWJsaWthO3V2YXNrYWphIFJlc3B1Ymxpa2E7MDswO3JlcHVibGljCitSVTtSVS1EQTtEYWdlc3RhbiwgUmVzcHVibGlrYTtEYWdlc3RhbiwgUmVzcHVibGlrYTswOzA7cmVwdWJsaWMKK1JVO1JVLUlOO0luZ3VzaHNrYXlhIFJlc3B1Ymxpa2EgW1Jlc3B1Ymxpa2EgSW5ndXNoZXRpeWFdO0luZ3Vza2FqYSBSZXNwdWJsaWthIFtSZXNwdWJsaWthIEluZ3VldGlqYV07MDswO3JlcHVibGljCitSVTtSVS1LQjtLYWJhcmRpbm8tQmFsa2Fyc2theWEgUmVzcHVibGlrYTtLYWJhcmRpbm8tQmFsa2Fyc2thamEgUmVzcHVibGlrYTswOzA7cmVwdWJsaWMKK1JVO1JVLUtMO0thbG15a2l5YSwgUmVzcHVibGlrYTtLYWxteWtpamEsIFJlc3B1Ymxpa2E7MDswO3JlcHVibGljCitSVTtSVS1LQztLYXJhY2hheWV2by1DaGVya2Vzc2theWEgUmVzcHVibGlrYTtLYXJhZWFqZXZvLWVya2Vzc2thamEgUmVzcHVibGlrYTswOzA7cmVwdWJsaWMKK1JVO1JVLUtSO0thcmVsaXlhLCBSZXNwdWJsaWthO0thcmVsaWphLCBSZXNwdWJsaWthOzA7MDtyZXB1YmxpYworUlU7UlUtS0s7S2hha2FzaXlhLCBSZXNwdWJsaWthO0hha2FzaWphLCBSZXNwdWJsaWthOzA7MDtyZXB1YmxpYworUlU7UlUtS087S29taSwgUmVzcHVibGlrYTtLb21pLCBSZXNwdWJsaWthOzA7MDtyZXB1YmxpYworUlU7UlUtTUU7TWFyaXkgRWwsIFJlc3B1Ymxpa2E7TWFyaWogbCwgUmVzcHVibGlrYTswOzA7cmVwdWJsaWMKK1JVO1JVLU1PO01vcmRvdml5YSwgUmVzcHVibGlrYTtNb3Jkb3ZpamEsIFJlc3B1Ymxpa2E7MDswO3JlcHVibGljCitSVTtSVS1TQTtTYWtoYSwgUmVzcHVibGlrYSBbWWFrdXRpeWFdO1NhaGEsIFJlc3B1Ymxpa2EgW0pha3V0aWphXTswOzA7cmVwdWJsaWMKK1JVO1JVLVNFO1NldmVybmF5YSBPc2V0aXlhLCBSZXNwdWJsaWthIFtBbGFuaXlhXSBbUmVzcHVibGlrYSBTZXZlcm5heWEgT3NldGl5YS1BbGFuaXlhXTtTZXZlcm5hamEgT3NldGlqYSwgUmVzcHVibGlrYSBbQWxhbmlqYV0gW1Jlc3B1Ymxpa2EgU2V2ZXJuYWphIE9zZXRpamEtQWxhbmlqYV07MDswO3JlcHVibGljCitSVTtSVS1UQTtUYXRhcnN0YW4sIFJlc3B1Ymxpa2E7VGF0YXJzdGFuLCBSZXNwdWJsaWthOzA7MDtyZXB1YmxpYworUlU7UlUtVFk7VHl2YSwgUmVzcHVibGlrYSBbVHV2YV07VHl2YSwgUmVzcHVibGlrYSBbVHV2YV07MDswO3JlcHVibGljCitSVTtSVS1VRDtVZG11cnRza2F5YSBSZXNwdWJsaWthO1VkbXVydHNrYWphIFJlc3B1Ymxpa2E7MDswO3JlcHVibGljCitSVTtSVS1BTFQ7QWx0YXlza2l5IGtyYXk7QWx0YWpza2lqIGtyYWo7MDswO2FkbWluaXN0cmF0aXZlIHRlcnJpdG9yeQorUlU7UlUtS0hBO0toYWJhcm92c2tpeSBrcmF5O0hhYmFyb3Zza2lqIGtyYWo7MDswO2FkbWluaXN0cmF0aXZlIHRlcnJpdG9yeQorUlU7UlUtS0RBO0tyYXNub2RhcnNraXkga3JheTtLcmFzbm9kYXJza2lqIGtyYWo7MDswO2FkbWluaXN0cmF0aXZlIHRlcnJpdG9yeQorUlU7UlUtS1lBO0tyYXNub3lhcnNraXkga3JheTtLcmFzbm9qYXJza2lqIGtyYWo7MDswO2FkbWluaXN0cmF0aXZlIHRlcnJpdG9yeQorUlU7UlUtUFJJO1ByaW1vcnNraXkga3JheTtQcmltb3Jza2lqIGtyYWo7MDswO2FkbWluaXN0cmF0aXZlIHRlcnJpdG9yeQorUlU7UlUtU1RBO1N0YXZyb3BvbHNraXkga3JheTtTdGF2cm9wb2xza2lqIGtyYWo7MDswO2FkbWluaXN0cmF0aXZlIHRlcnJpdG9yeQorUlU7UlUtQU1VO0FtdXJza2F5YSBvYmxhc3Q7QW11cnNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1BUks7QXJraGFuZ2Vsc2theWEgb2JsYXN0O0FyaGFuZ2Vsc2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLUFTVDtBc3RyYWtoYW5za2F5YSBvYmxhc3Q7QXN0cmFoYW5za2FqYSBvYmxhc3Q7MDswO2FkbWluaXN0cmF0aXZlIHJlZ2lvbgorUlU7UlUtQkVMO0JlbGdvcm9kc2theWEgb2JsYXN0O0JlbGdvcm9kc2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLUJSWTtCcnlhbnNrYXlhIG9ibGFzdDtCcmphbnNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1DSEU7Q2hlbHlhYmluc2theWEgb2JsYXN0O2VsamFiaW5za2FqYSBvYmxhc3Q7MDswO2FkbWluaXN0cmF0aXZlIHJlZ2lvbgorUlU7UlUtQ0hJO0NoaXRpbnNrYXlhIG9ibGFzdDtpdGluc2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLUlSSztJcmt1dHNrYXlhIG9ibGFzdDtJcmt1dHNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1JVkE7SXZhbm92c2theWEgb2JsYXN0O0l2YW5vdnNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1LR0Q7S2FsaW5pbmdyYWRza2F5YSBvYmxhc3Q7S2FsaW5pbmdyYWRza2FqYSBvYmxhc3Q7MDswO2FkbWluaXN0cmF0aXZlIHJlZ2lvbgorUlU7UlUtS0xVO0thbHV6aHNrYXlhIG9ibGFzdDtLYWx1c2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLUtBTTtLYW1jaGF0c2theWEgb2JsYXN0O0thbWVhdHNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1LRU07S2VtZXJvdnNrYXlhIG9ibGFzdDtLZW1lcm92c2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLUtJUjtLaXJvdnNrYXlhIG9ibGFzdDtLaXJvdnNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1LT1M7S29zdHJvbXNrYXlhIG9ibGFzdDtLb3N0cm9tc2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLUtHTjtLdXJnYW5za2F5YSBvYmxhc3Q7S3VyZ2Fuc2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLUtSUztLdXJza2F5YSBvYmxhc3Q7S3Vyc2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLUxFTjtMZW5pbmdyYWRza2F5YSBvYmxhc3Q7TGVuaW5ncmFkc2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLUxJUDtMaXBldHNrYXlhIG9ibGFzdDtMaXBldHNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1NQUc7TWFnYWRhbnNrYXlhIG9ibGFzdDtNYWdhZGFuc2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLU1PUztNb3Nrb3Zza2F5YSBvYmxhc3Q7TW9za292c2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLU1VUjtNdXJtYW5za2F5YSBvYmxhc3Q7TXVybWFuc2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLU5JWjtOaXpoZWdvcm9kc2theWEgb2JsYXN0O05pZWdvcm9kc2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLU5HUjtOb3Znb3JvZHNrYXlhIG9ibGFzdDtOb3Znb3JvZHNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1OVlM7Tm92b3NpYmlyc2theWEgb2JsYXN0O05vdm9zaWJpcnNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1PTVM7T21za2F5YSBvYmxhc3Q7T21za2FqYSBvYmxhc3Q7MDswO2FkbWluaXN0cmF0aXZlIHJlZ2lvbgorUlU7UlUtT1JFO09yZW5idXJnc2theWEgb2JsYXN0O09yZW5idXJnc2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLU9STDtPcmxvdnNrYXlhIG9ibGFzdDtPcmxvdnNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1QTlo7UGVuemVuc2theWEgb2JsYXN0O1BlbnplbnNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1QRVI7UGVybXNrYXlhIG9ibGFzdDtQZXJtc2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLVBTSztQc2tvdnNrYXlhIG9ibGFzdDtQc2tvdnNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1ST1M7Um9zdG92c2theWEgb2JsYXN0O1Jvc3RvdnNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1SWUE7UnlhemFuc2theWEgb2JsYXN0O1JqYXphbnNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1TQUs7U2FraGFsaW5za2F5YSBvYmxhc3Q7U2FoYWxpbnNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1TQU07U2FtYXJza2F5YSBvYmxhc3Q7U2FtYXJza2FqYSBvYmxhc3Q7MDswO2FkbWluaXN0cmF0aXZlIHJlZ2lvbgorUlU7UlUtU0FSO1NhcmF0b3Zza2F5YSBvYmxhc3Q7U2FyYXRvdnNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1TTU87U21vbGVuc2theWEgb2JsYXN0O1Ntb2xlbnNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1TVkU7U3ZlcmRsb3Zza2F5YSBvYmxhc3Q7U3ZlcmRsb3Zza2FqYSBvYmxhc3Q7MDswO2FkbWluaXN0cmF0aXZlIHJlZ2lvbgorUlU7UlUtVEFNO1RhbWJvdnNrYXlhIG9ibGFzdDtUYW1ib3Zza2FqYSBvYmxhc3Q7MDswO2FkbWluaXN0cmF0aXZlIHJlZ2lvbgorUlU7UlUtVE9NO1RvbXNrYXlhIG9ibGFzdDtUb21za2FqYSBvYmxhc3Q7MDswO2FkbWluaXN0cmF0aXZlIHJlZ2lvbgorUlU7UlUtVFVMO1R1bHNrYXlhIG9ibGFzdDtUdWxza2FqYSBvYmxhc3Q7MDswO2FkbWluaXN0cmF0aXZlIHJlZ2lvbgorUlU7UlUtVFZFO1R2ZXJza2F5YSBvYmxhc3Q7VHZlcnNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1UWVU7VHl1bWVuc2theWEgb2JsYXN0O1RqdW1lbnNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1VTFk7VWx5YW5vdnNrYXlhIG9ibGFzdDtVbGphbm92c2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLVZMQTtWbGFkaW1pcnNrYXlhIG9ibGFzdDtWbGFkaW1pcnNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1WR0c7Vm9sZ29ncmFkc2theWEgb2JsYXN0O1ZvbGdvZ3JhZHNrYWphIG9ibGFzdDswOzA7YWRtaW5pc3RyYXRpdmUgcmVnaW9uCitSVTtSVS1WTEc7Vm9sb2dvZHNrYXlhIG9ibGFzdDtWb2xvZ29kc2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLVZPUjtWb3JvbmV6aHNrYXlhIG9ibGFzdDtWb3JvbmVza2FqYSBvYmxhc3Q7MDswO2FkbWluaXN0cmF0aXZlIHJlZ2lvbgorUlU7UlUtWUFSO1lhcm9zbGF2c2theWEgb2JsYXN0O0phcm9zbGF2c2thamEgb2JsYXN0OzA7MDthZG1pbmlzdHJhdGl2ZSByZWdpb24KK1JVO1JVLU1PVztNb3NrdmE7TW9za3ZhOzA7MDthdXRvbm9tb3VzIGNpdHkKK1JVO1JVLVNQRTtTYW5rdC1QZXRlcmJ1cmc7U2Fua3QtUGV0ZXJidXJnOzA7MDthdXRvbm9tb3VzIGNpdHkKK1JVO1JVLVlFVjtZZXZyZXlza2F5YSBhdnRvbm9tbmF5YSBvYmxhc3Q7RXZyZWpza2FqYSBhdnRvbm9tbmFqYSBvYmxhc3Q7MDswO2F1dG9ub21vdXMgcmVnaW9uCitSVTtSVS1BR0I7QWdpbnNraXkgQnVyeWF0c2tpeSBhdnRvbm9tbnl5IG9rcnVnO0FnaW5za2lqIEJ1cmphdHNraWogYXZ0b25vbW55aiBva3J1ZzswOzA7YXV0b25vbW91cyBkaXN0cmljdAorUlU7UlUtQ0hVO0NodWtvdHNraXkgYXZ0b25vbW55eSBva3J1Zzt1a290c2tpaiBhdnRvbm9tbnlqIG9rcnVnOzA7MDthdXRvbm9tb3VzIGRpc3RyaWN0CitSVTtSVS1FVkU7RXZlbmtpeXNraXkgYXZ0b25vbW55eSBva3J1Zzt2ZW5raWpza2lqIGF2dG9ub21ueWogb2tydWc7MDswO2F1dG9ub21vdXMgZGlzdHJpY3QKK1JVO1JVLUtITTtLaGFudHktTWFuc2l5c2tpeSBhdnRvbm9tbnl5IG9rcnVnIFtZdWdyYV07SGFudHktTWFuc2lqc2tpaiBhdnRvbm9tbnlqIG9rcnVnIFtKdWdyYV07MDswO2F1dG9ub21vdXMgZGlzdHJpY3QKK1JVO1JVLUtPUDtLb21pLVBlcm15YXRza2l5IGF2dG9ub21ueXkgb2tydWc7S29taS1QZXJtamF0c2tpaiBhdnRvbm9tbnlqIG9rcnVnOzA7MDthdXRvbm9tb3VzIGRpc3RyaWN0CitSVTtSVS1LT1I7S29yeWFrc2tpeSBhdnRvbm9tbnl5IG9rcnVnO0tvcmpha3NraWogYXZ0b25vbW55aiBva3J1ZzswOzA7YXV0b25vbW91cyBkaXN0cmljdAorUlU7UlUtTkVOO05lbmV0c2tpeSBhdnRvbm9tbnl5IG9rcnVnO05lbmV0c2tpaiBhdnRvbm9tbnlqIG9rcnVnOzA7MDthdXRvbm9tb3VzIGRpc3RyaWN0CitSVTtSVS1UQVk7VGF5bXlyc2tpeSAoRG9sZ2Fuby1OZW5ldHNraXkpIGF2dG9ub21ueXkgb2tydWc7VGFqbXlyc2tpaiAoRG9sZ2Fuby1OZW5ldHNraWopIGF2dG9ub21ueWogb2tydWc7MDswO2F1dG9ub21vdXMgZGlzdHJpY3QKK1JVO1JVLVVPQjtVc3QtT3JkeW5za2l5IEJ1cnlhdHNraXkgYXZ0b25vbW55eSBva3J1ZztVc3QtT3JkeW5za2lqIEJ1cmphdHNraWogYXZ0b25vbW55aiBva3J1ZzswOzA7YXV0b25vbW91cyBkaXN0cmljdAorUlU7UlUtWUFOO1lhbWFsby1OZW5ldHNraXkgYXZ0b25vbW55eSBva3J1ZztKYW1hbG8tTmVuZXRza2lqIGF2dG9ub21ueWogb2tydWc7MDswO2F1dG9ub21vdXMgZGlzdHJpY3QKK1JXO1JXLUM7QnV0YXJlOzA7MDswCitSVztSVy1JO0J5dW1iYTswOzA7MAorUlc7UlctRTtDeWFuZ3VndTswOzA7MAorUlc7UlctRDtHaWtvbmdvcm87MDswOzAKK1JXO1JXLUc7R2lzZW55aTswOzA7MAorUlc7UlctQjtHaXRhcmFtYTswOzA7MAorUlc7UlctSjtLaWJ1bmdvOzA7MDswCitSVztSVy1GO0tpYnV5ZTswOzA7MAorUlc7UlctSztLaWdhbGktUnVyYWw7S2lnYWxpIHkgSWN5YXJvOzA7MDsKK1JXO1JXLUw7S2lnYWxpLVZpbGxlO0tpZ2FsaSBOZ2FyaTswOzA7CitSVztSVy1NO011dGFyYTswOzA7MAorUlc7UlctSDtSdWhlbmdlcmk7MDswOzAKK1NBO1NBLTEwO0JhaGE7MDswOzAKK1NBO1NBLTA4O05vcnRoZXJuIEZyb250aWVyOzA7MDswCitTQTtTQS0yO0phd2Y7MDswOzAKK1NBO1NBLTAzO01hZGluYWg7MDswOzAKK1NBO1NBLTA1O1F1YXNzaW07MDswOzAKK1NBO1NBLTA7Uml5YWQ7MDswOzAKK1NBO1NBLTA0O0Vhc3Rlcm4gUHJvdmluY2U7MDswOzAKK1NBO1NBLTQ7QXNpcjswOzA7MAorU0E7U0EtMDY7SGFpbDswOzA7MAorU0E7U0EtMDk7Sml6YW47MDswOzAKK1NBO1NBLTAyO01ha2thaDswOzA7MAorU0E7U0EtMTI7TmFqcmFuOzA7MDswCitTQTtTQS0wNztUYWJ1azswOzA7MAorU0I7U0ItQ1Q7Q2FwaXRhbCBUZXJyaXRvcnkgKEhvbmlhcmEpOzA7MDswY2FwaXRhbCB0ZXJyaXRvcnkKK1NCO1NCLUNFO0NlbnRyYWw7MDswO3Byb3ZpbmNlCitTQjtTQi1HVTtHdWFkYWxjYW5hbDswOzA7cHJvdmluY2UKK1NCO1NCLUlTO0lzYWJlbDswOzA7cHJvdmluY2UKK1NCO1NCLU1LO01ha2lyYTswOzA7cHJvdmluY2UKK1NCO1NCLU1MO01hbGFpdGE7MDswO3Byb3ZpbmNlCitTQjtTQi1URTtUZW1vdHU7MDswO3Byb3ZpbmNlCitTQjtTQi1XRTtXZXN0ZXJuOzA7MDtwcm92aW5jZQorU0Q7U0QtMjM7bCBhbiBObDswOzA7MAorU0Q7U0QtMjY7QWwgQmFyIGFsIEFtYXI7MDswOzAKK1NEO1NELTg7QWwgQnVheXJ0OzA7MDswCitTRDtTRC0wNztBbCBKYXpyYWg7MDswOzAKK1NEO1NELTAzO0FsIEtoYXJtOzA7MDswCitTRDtTRC0wNjtBbCBRYXJpZjswOzA7MAorU0Q7U0QtMjI7QWwgV2FkYWg7MDswOzAKK1NEO1NELTA0O0FuIE5sOzA7MDswCitTRDtTRC0wODtBbiBObCBhbCBBYnlhOzA7MDswCitTRDtTRC0yNDtBbiBObCBhbCBBenJhcTswOzA7MAorU0Q7U0QtMDtBc2ggU2hhbWx5YWg7MDswOzAKK1NEO1NELTc7QmFyIGFsIEphYmFsOzA7MDswCitTRDtTRC02O0doYXJiIGFsIElzdGl3eWFoOzA7MDswCitTRDtTRC00O0doYXJiIEJhciBhbCBHaGF6bDswOzA7MAorU0Q7U0QtMjtHaGFyYiBEcmZyOzA7MDswCitTRDtTRC0wO0doYXJiIEt1cmR1Zm47MDswOzAKK1NEO1NELTEwO0phbmIgRHJmcjswOzA7MAorU0Q7U0QtMztKYW5iIEt1cmR1Zm47MDswOzAKK1NEO1NELTIwO0pucWFsOzA7MDswCitTRDtTRC0wNTtLYXNzYWw7MDswOzAKK1NEO1NELTU7U2hhbWwgQmFyIGFsIEdoYXpsOzA7MDswCitTRDtTRC0wMjtTaGFtbCBEcmZyOzA7MDswCitTRDtTRC0wOTtTaGFtbCBLdXJkdWZuOzA7MDswCitTRDtTRC05O1NoYXJxIGFsIElzdGl3eWFoOzA7MDswCitTRDtTRC0yNTtTaW5ucjswOzA7MAorU0Q7U0QtMjtXcmI7MDswOzAKK1NEO1NELUU7RWFzdGVybiBbRWFzdGVybjFdOzA7MDswCitTRDtTRC1OO05vcnRoZXJuIFtOb3J0aGVybjNdIDswOzA7MAorU0Q7U0QtQztDZW50cmFsOzA7MDswCitTRTtTRS1LO0JsZWtpbmdlIGxuIFtTRS0wXTswOzA7MAorU0U7U0UtVztEYWxhcm5hcyBsbiBbU0UtMjBdOzA7MDswCitTRTtTRS1JO0dvdGxhbmRzIGxuIFtTRS0wOV07MDswOzAKK1NFO1NFLVg7R3ZsZWJvcmdzIGxuIFtTRS0yXTswOzA7MAorU0U7U0UtTjtIYWxsYW5kcyBsbiBbU0UtM107MDswOzAKK1NFO1NFLVo7Sm10bGFuZHMgbG4gW1NFLTIzXTswOzA7MAorU0U7U0UtRjtKbmtwaW5ncyBsbiBbU0UtMDZdOzA7MDswCitTRTtTRS1IO0thbG1hciBsbiBbU0UtMDhdOzA7MDswCitTRTtTRS1HO0tyb25vYmVyZ3MgbG4gW1NFLTA3XTswOzA7MAorU0U7U0UtQkQ7Tm9ycmJvdHRlbnMgbG4gW1NFLTI1XTswOzA7MAorU0U7U0UtTTtTa25lIGxuIFtTRS0yXTswOzA7MAorU0U7U0UtQUI7U3RvY2tob2xtcyBsbiBbU0UtMF07MDswOzAKK1NFO1NFLUQ7U2Rlcm1hbmxhbmRzIGxuIFtTRS0wNF07MDswOzAKK1NFO1NFLUM7VXBwc2FsYSBsbiBbU0UtMDNdOzA7MDswCitTRTtTRS1TO1ZybWxhbmRzIGxuIFtTRS03XTswOzA7MAorU0U7U0UtQUM7VnN0ZXJib3R0ZW5zIGxuIFtTRS0yNF07MDswOzAKK1NFO1NFLVk7VnN0ZXJub3JybGFuZHMgbG4gW1NFLTIyXTswOzA7MAorU0U7U0UtVTtWc3RtYW5sYW5kcyBsbiBbU0UtOV07MDswOzAKK1NFO1NFLU87VnN0cmEgR3RhbGFuZHMgbG4gW1NFLTRdOzA7MDswCitTRTtTRS1UO3JlYnJvIGxuIFtTRS04XTswOzA7MAorU0U7U0UtRTtzdGVyZ3RsYW5kcyBsbiBbU0UtMDVdOzA7MDswCitTSDtTSC1TSDtTYWludCBIZWxlbmE7MDswOzBhZG1pbmlzdHJhdGl2ZSBhcmVhCitTSDtTSC1BQztBc2NlbnNpb247MDswOzBkZXBlbmRlbmN5CitTSDtTSC1UQTtUcmlzdGFuIGRhIEN1bmhhOzA7MDswZGVwZW5kZW5jeQorU0s7U0stQkM7QmFuc2tvYnlzdHJpY2sga3JhajswOzA7MAorU0s7U0stQkw7QnJhdGlzbGF2c2sga3JhajswOzA7MAorU0s7U0stS0k7S29pY2sga3JhajswOzA7MAorU0s7U0stTkk7Tml0cmlhbnNreSBrcmFqOzA7MDswCitTSztTSy1QVjtQcmVvdnNrIGtyYWo7MDswOzAKK1NLO1NLLVRDO1RyZW5laWFuc2t5IGtyYWo7MDswOzAKK1NLO1NLLVRBO1RybmF2c2sga3JhajswOzA7MAorU0s7U0stWkk7aWxpbnNrIGtyYWo7MDswOzAKK1NMO1NMLVc7V2VzdGVybiBBcmVhIChGcmVldG93bikgW1dlc3Rlcm4zXSBbV2VzdGVybl07MDswOzBhcmVhCitTTDtTTC1FO0Vhc3Rlcm4gW0Vhc3Rlcm4yXTswOzA7cHJvdmluY2UKK1NMO1NMLU47Tm9ydGhlcm4gW05vcnRoZXJuMl07MDswO3Byb3ZpbmNlCitTTDtTTC1TO1NvdXRoZXJuOzA7MDtwcm92aW5jZQorU047U04tREs7RGFrYXI7MDswOzAKK1NOO1NOLURCO0Rpb3VyYmVsOzA7MDswCitTTjtTTi1GSztGYXRpY2s7MDswOzAKK1NOO1NOLUtMO0thb2xhY2s7MDswOzAKK1NOO1NOLUtEO0tvbGRhOzA7MDswCitTTjtTTi1MRztMb3VnYTswOzA7MAorU047U04tU0w7U2FpbnQtTG91aXM7MDswOzAKK1NOO1NOLVRDO1RhbWJhY291bmRhOzA7MDswCitTTjtTTi1USDtUaGllczswOzA7MAorU047U04tWkc7WmlndWluY2hvcjswOzA7MAorU087U08tQVc7QXdkYWw7MDswOzAKK1NPO1NPLUJLO0Jha29vbDswOzA7MAorU087U08tQk47QmFuYWFkaXI7MDswOzAKK1NPO1NPLUJSO0Jhcmk7MDswOzAKK1NPO1NPLUJZO0JheTswOzA7MAorU087U08tR0E7R2FsZ3VkdXVkOzA7MDswCitTTztTTy1HRTtHZWRvOzA7MDswCitTTztTTy1ISTtIaWlyYWFuOzA7MDswCitTTztTTy1KRDtKdWJiYWRhIERoZXhlOzA7MDswCitTTztTTy1KSDtKdWJiYWRhIEhvb3NlOzA7MDswCitTTztTTy1NVTtNdWR1ZzswOzA7MAorU087U08tTlU7TnVnYWFsOzA7MDswCitTTztTTy1TQTtTYW5hYWc7MDswOzAKK1NPO1NPLVNEO1NoYWJlZWxsYWhhIERoZXhlOzA7MDswCitTTztTTy1TSDtTaGFiZWVsbGFoYSBIb29zZTswOzA7MAorU087U08tU087U29vbDswOzA7MAorU087U08tVE87VG9nZGhlZXI7MDswOzAKK1NPO1NPLVdPO1dvcW9veWkgR2FsYmVlZDswOzA7MAorU1I7U1ItQlI7QnJva29wb25kbzswOzA7MAorU1I7U1ItQ007Q29tbWV3aWpuZTswOzA7MAorU1I7U1ItQ1I7Q29yb25pZTswOzA7MAorU1I7U1ItTUE7TWFyb3dpam5lOzA7MDswCitTUjtTUi1OSTtOaWNrZXJpZTswOzA7MAorU1I7U1ItUFI7UGFyYTswOzA7MAorU1I7U1ItUE07UGFyYW1hcmlibzswOzA7MAorU1I7U1ItU0E7U2FyYW1hY2NhOzA7MDswCitTUjtTUi1TSTtTaXBhbGl3aW5pOzA7MDswCitTUjtTUi1XQTtXYW5pY2E7MDswOzAKK1NUO1NULVA7UHJuY2lwZTswOzA7MAorU1Q7U1QtUztTbyBUb21lOzA7MDswCitTVjtTVi1BSDtBaHVhY2hhcG47MDswOzAKK1NWO1NWLUNBO0NhYmFhczswOzA7MAorU1Y7U1YtQ1U7Q3VzY2F0bG47MDswOzAKK1NWO1NWLUNIO0NoYWxhdGVuYW5nbzswOzA7MAorU1Y7U1YtTEk7TGEgTGliZXJ0YWQ7MDswOzAKK1NWO1NWLVBBO0xhIFBhejswOzA7MAorU1Y7U1YtVU47TGEgVW5pbjswOzA7MAorU1Y7U1YtTU87TW9yYXpuOzA7MDswCitTVjtTVi1TTTtTYW4gTWlndWVsOzA7MDswCitTVjtTVi1TUztTYW4gU2FsdmFkb3I7MDswOzAKK1NWO1NWLVNBO1NhbnRhIEFuYTswOzA7MAorU1Y7U1YtU1Y7U2FuIFZpY2VudGU7MDswOzAKK1NWO1NWLVNPO1NvbnNvbmF0ZTswOzA7MAorU1Y7U1YtVVM7VXN1bHV0bjswOzA7MAorU1k7U1ktSEE7QWwgYXNha2FoOzA7MDswCitTWTtTWS1MQTtBbCBMYWRoaXFpeWFoOzA7MDswCitTWTtTWS1RVTtBbCBRdW5heWlyYWg7MDswOzAKK1NZO1NZLVJBO0FyIFJhcXFhaDswOzA7MAorU1k7U1ktU1U7QXMgU3V3YXlkOzA7MDswCitTWTtTWS1EUjtEYXI7MDswOzAKK1NZO1NZLURZO0RheXIgYXogWmF3cjswOzA7MAorU1k7U1ktREk7RGltYXNocTswOzA7MAorU1k7U1ktSEw7YWxhYjswOzA7MAorU1k7U1ktSE07YW1oOzA7MDswCitTWTtTWS1ISTtpbTswOzA7MAorU1k7U1ktSUQ7SWRsaWI7MDswOzAKK1NZO1NZLVJEO1JmIERpbWFzaHE7MDswOzAKK1NZO1NZLVRBO2FyczswOzA7MAorU1o7U1otSEg7SGhvaGhvOzA7MDswCitTWjtTWi1MVTtMdWJvbWJvOzA7MDswCitTWjtTWi1NQTtNYW56aW5pOzA7MDswCitTWjtTWi1TSDtTaGlzZWx3ZW5pOzA7MDswCitURDtURC1CQTtCYXRoYTswOzA7MAorVEQ7VEQtQkk7QmlsdGluZTswOzA7MAorVEQ7VEQtQkVUO0JvcmtvdS1Fbm5lZGktVGliZXN0aTswOzA7MAorVEQ7VEQtQ0I7Q2hhcmktQmFndWlybWk7MDswOzAKK1REO1RELUdSO0d1ZXJhOzA7MDswCitURDtURC1LQTtLYW5lbTswOzA7MAorVEQ7VEQtTEM7TGFjOzA7MDswCitURDtURC1MTztMb2dvbmUtT2NjaWRlbnRhbDswOzA7MAorVEQ7VEQtTFI7TG9nb25lLU9yaWVudGFsOzA7MDswCitURDtURC1NSztNYXlvLUtlYmJpOzA7MDswCitURDtURC1NQztNb3llbi1DaGFyaTswOzA7MAorVEQ7VEQtT0Q7T3VhZGRhaTswOzA7MAorVEQ7VEQtU0E7U2FsYW1hdDswOzA7MAorVEQ7VEQtVEE7VGFuZGppbGU7MDswOzAKK1RHO1RHLUM7Q2VudHJlIFtDZW50cmUxXTswOzA7MAorVEc7VEctSztLYXJhOzA7MDswCitURztURy1NO01hcml0aW1lIDswOzA7MAorVEc7VEctUDtQbGF0ZWF1eDswOzA7MAorVEc7VEctUztTYXZhbm5lcyBbU2F2YW5lc107MDswOzAKK1RIO1RILTA7S3J1bmcgVGhlcCBNYWhhIE5ha2hvbiBbQmFuZ2tva107MDswOzBtZXRyb3BvbGl0YW4gYWRtaW5pc3RyYXRpb24KK1RIO1RILVM7UGhhdHRoYXlhOzA7MDswc3BlY2lhbCBhZG1pbmlzdHJhdGl2ZSBjaXR5CitUSDtUSC0zNztBbW5hdCBDaGFyb2VuOzA7MDtwcm92aW5jZQorVEg7VEgtNTtBbmcgVGhvbmc7MDswO3Byb3ZpbmNlCitUSDtUSC0zO0J1cmkgUmFtOzA7MDtwcm92aW5jZQorVEg7VEgtMjQ7Q2hhY2hvZW5nc2FvOzA7MDtwcm92aW5jZQorVEg7VEgtODtDaGFpIE5hdDswOzA7cHJvdmluY2UKK1RIO1RILTM2O0NoYWl5YXBodW07MDswO3Byb3ZpbmNlCitUSDtUSC0yMjtDaGFudGhhYnVyaTswOzA7cHJvdmluY2UKK1RIO1RILTUwO0NoaWFuZyBNYWk7MDswO3Byb3ZpbmNlCitUSDtUSC01NztDaGlhbmcgUmFpOzA7MDtwcm92aW5jZQorVEg7VEgtMjA7Q2hvbiBCdXJpOzA7MDtwcm92aW5jZQorVEg7VEgtODY7Q2h1bXBob247MDswO3Byb3ZpbmNlCitUSDtUSC00NjtLYWxhc2luOzA7MDtwcm92aW5jZQorVEg7VEgtNjI7S2FtcGhhZW5nIFBoZXQ7MDswO3Byb3ZpbmNlCitUSDtUSC03O0thbmNoYW5hYnVyaTswOzA7cHJvdmluY2UKK1RIO1RILTQwO0tob24gS2FlbjswOzA7cHJvdmluY2UKK1RIO1RILTg7S3JhYmk7MDswO3Byb3ZpbmNlCitUSDtUSC01MjtMYW1wYW5nOzA7MDtwcm92aW5jZQorVEg7VEgtNTtMYW1waHVuOzA7MDtwcm92aW5jZQorVEg7VEgtNDI7TG9laTswOzA7cHJvdmluY2UKK1RIO1RILTY7TG9wIEJ1cmk7MDswO3Byb3ZpbmNlCitUSDtUSC01ODtNYWUgSG9uZyBTb247MDswO3Byb3ZpbmNlCitUSDtUSC00NDtNYWhhIFNhcmFraGFtOzA7MDtwcm92aW5jZQorVEg7VEgtNDk7TXVrZGFoYW47MDswO3Byb3ZpbmNlCitUSDtUSC0yNjtOYWtob24gTmF5b2s7MDswO3Byb3ZpbmNlCitUSDtUSC03MztOYWtob24gUGF0aG9tOzA7MDtwcm92aW5jZQorVEg7VEgtNDg7TmFraG9uIFBoYW5vbTswOzA7cHJvdmluY2UKK1RIO1RILTMwO05ha2hvbiBSYXRjaGFzaW1hOzA7MDtwcm92aW5jZQorVEg7VEgtNjA7TmFraG9uIFNhd2FuOzA7MDtwcm92aW5jZQorVEg7VEgtODA7TmFraG9uIFNpIFRoYW1tYXJhdDswOzA7cHJvdmluY2UKK1RIO1RILTU1O05hbjswOzA7cHJvdmluY2UKK1RIO1RILTk2O05hcmF0aGl3YXQ7MDswO3Byb3ZpbmNlCitUSDtUSC0zOTtOb25nIEJ1YSBMYW0gUGh1OzA7MDtwcm92aW5jZQorVEg7VEgtNDM7Tm9uZyBLaGFpOzA7MDtwcm92aW5jZQorVEg7VEgtMjtOb250aGFidXJpOzA7MDtwcm92aW5jZQorVEg7VEgtMztQYXRodW0gVGhhbmk7MDswO3Byb3ZpbmNlCitUSDtUSC05NDtQYXR0YW5pOzA7MDtwcm92aW5jZQorVEg7VEgtODI7UGhhbmduZ2E7MDswO3Byb3ZpbmNlCitUSDtUSC05MztQaGF0dGhhbHVuZzswOzA7cHJvdmluY2UKK1RIO1RILTU2O1BoYXlhbzswOzA7cHJvdmluY2UKK1RIO1RILTY3O1BoZXRjaGFidW47MDswO3Byb3ZpbmNlCitUSDtUSC03NjtQaGV0Y2hhYnVyaTswOzA7cHJvdmluY2UKK1RIO1RILTY2O1BoaWNoaXQ7MDswO3Byb3ZpbmNlCitUSDtUSC02NTtQaGl0c2FudWxvazswOzA7cHJvdmluY2UKK1RIO1RILTU0O1BocmFlOzA7MDtwcm92aW5jZQorVEg7VEgtNDtQaHJhIE5ha2hvbiBTaSBBeXV0dGhheWE7MDswO3Byb3ZpbmNlCitUSDtUSC04MztQaHVrZXQ7MDswO3Byb3ZpbmNlCitUSDtUSC0yNTtQcmFjaGluIEJ1cmk7MDswO3Byb3ZpbmNlCitUSDtUSC03NztQcmFjaHVhcCBLaGlyaSBLaGFuOzA7MDtwcm92aW5jZQorVEg7VEgtODU7UmFub25nOzA7MDtwcm92aW5jZQorVEg7VEgtNzA7UmF0Y2hhYnVyaTswOzA7cHJvdmluY2UKK1RIO1RILTI7UmF5b25nOzA7MDtwcm92aW5jZQorVEg7VEgtNDU7Um9pIEV0OzA7MDtwcm92aW5jZQorVEg7VEgtMjc7U2EgS2FlbzswOzA7cHJvdmluY2UKK1RIO1RILTQ3O1Nha29uIE5ha2hvbjswOzA7cHJvdmluY2UKK1RIO1RILTgxO1NhbXV0IFByYWthbjswOzA7cHJvdmluY2UKK1RIO1RILTc0O1NhbXV0IFNha2hvbjswOzA7cHJvdmluY2UKK1RIO1RILTc1O1NhbXV0IFNvbmdraHJhbTswOzA7cHJvdmluY2UKK1RIO1RILTc5O1NhcmFidXJpOzA7MDtwcm92aW5jZQorVEg7VEgtOTtTYXR1bjswOzA7cHJvdmluY2UKK1RIO1RILTc7U2luZyBCdXJpOzA7MDtwcm92aW5jZQorVEg7VEgtMzM7U2kgU2EgS2V0OzA7MDtwcm92aW5jZQorVEg7VEgtOTA7U29uZ2tobGE7MDswO3Byb3ZpbmNlCitUSDtUSC02NDtTdWtob3RoYWk7MDswO3Byb3ZpbmNlCitUSDtUSC03MjtTdXBoYW4gQnVyaTswOzA7cHJvdmluY2UKK1RIO1RILTg0O1N1cmF0IFRoYW5pOzA7MDtwcm92aW5jZQorVEg7VEgtMzI7U3VyaW47MDswO3Byb3ZpbmNlCitUSDtUSC02MztUYWs7MDswO3Byb3ZpbmNlCitUSDtUSC05MjtUcmFuZzswOzA7cHJvdmluY2UKK1RIO1RILTIzO1RyYXQ7MDswO3Byb3ZpbmNlCitUSDtUSC0zNDtVYm9uIFJhdGNoYXRoYW5pOzA7MDtwcm92aW5jZQorVEg7VEgtNDtVZG9uIFRoYW5pOzA7MDtwcm92aW5jZQorVEg7VEgtNjtVdGhhaSBUaGFuaTswOzA7cHJvdmluY2UKK1RIO1RILTUzO1V0dGFyYWRpdDswOzA7cHJvdmluY2UKK1RIO1RILTk1O1lhbGE7MDswO3Byb3ZpbmNlCitUSDtUSC0zNTtZYXNvdGhvbjswOzA7cHJvdmluY2UKK1RKO1RKLUtUO0toYXRsb247MDswO3JlZ2lvbgorVEo7VEotU1U7U3VnaGQ7MDswO3JlZ2lvbgorVEo7VEotR0I7R29ybm8tQmFkYWtoc2hhbjswOzA7YXV0b25vbW91cyByZWdpb24KK1RNO1RNLUE7QWhhbDswOzA7MAorVE07VE0tQjtCYWxrYW47MDswOzAKK1RNO1RNLUQ7RGFvZ3V6OzA7MDswCitUTTtUTS1MO0xlYmFwOzA7MDswCitUTTtUTS1NO01hcnk7MDswOzAKK1ROO1ROLTM7QmVqYTswOzA7MAorVE47VE4tMztCZW4gQXJvdXM7MDswOzAKK1ROO1ROLTIzO0JpemVydGU7MDswOzAKK1ROO1ROLTg7R2FiZXM7MDswOzAKK1ROO1ROLTc7R2Fmc2E7MDswOzAKK1ROO1ROLTMyO0plbmRvdWJhOzA7MDswCitUTjtUTi00O0thaXJvdWFuOzA7MDswCitUTjtUTi00MjtLYXNzZXJpbmU7MDswOzAKK1ROO1ROLTczO0tlYmlsaTswOzA7MAorVE47VE4tMjtMQXJpYW5hOzA7MDswCitUTjtUTi0zMztMZSBLZWY7MDswOzAKK1ROO1ROLTUzO01haGRpYTswOzA7MAorVE47VE4tODI7TWVkZW5pbmU7MDswOzAKK1ROO1ROLTUyO01vbmFzdGlyOzA7MDswCitUTjtUTi0yO05hYmV1bDswOzA7MAorVE47VE4tNjtTZmF4OzA7MDswCitUTjtUTi00MztTaWRpIEJvdXppZDswOzA7MAorVE47VE4tMzQ7U2lsaWFuYTswOzA7MAorVE47VE4tNTtTb3Vzc2U7MDswOzAKK1ROO1ROLTgzO1RhdGFvdWluZTswOzA7MAorVE47VE4tNzI7VG96ZXVyOzA7MDswCitUTjtUTi0xMDtUdW5pczswOzA7MAorVE47VE4tMjI7WmFnaG91YW47MDswOzAKK1RSO1RSLTA7QWRhbmE7MDswOzAKK1RSO1RSLTAyO0FkaXlhbWFuOzA7MDswCitUUjtUUi0wMztBZnlvbjswOzA7MAorVFI7VFItMDQ7QWdyaTswOzA7MAorVFI7VFItNjg7QWtzYXJheTswOzA7MAorVFI7VFItMDU7QW1hc3lhOzA7MDswCitUUjtUUi0wNjtBbmthcmE7MDswOzAKK1RSO1RSLTA3O0FudGFseWE7MDswOzAKK1RSO1RSLTc1O0FyZGFoYW47MDswOzAKK1RSO1RSLTA4O0FydHZpbjswOzA7MAorVFI7VFItMDk7QXlkaW47MDswOzAKK1RSO1RSLTEwO0JhbGlrZXNpcjswOzA7MAorVFI7VFItNzQ7QmFydG47MDswOzAKK1RSO1RSLTcyO0JhdG1hbjswOzA7MAorVFI7VFItNjk7QmF5YnVydDswOzA7MAorVFI7VFItODc7QmlsZWNpazswOzA7MAorVFI7VFItMjtCaW5nb2w7MDswOzAKK1RSO1RSLTgzO0JpdGxpczswOzA7MAorVFI7VFItNDtCb2x1OzA7MDswCitUUjtUUi04NTtCdXJkdXI7MDswOzAKK1RSO1RSLTkwO0J1cnNhOzA7MDswCitUUjtUUi03O0NhbmFra2FsZTswOzA7MAorVFI7VFItODtDYW5raXJpOzA7MDswCitUUjtUUi05O0NvcnVtOzA7MDswCitUUjtUUi0yMDtEZW5pemxpOzA7MDswCitUUjtUUi04MjtEaXlhcmJha2lyOzA7MDswCitUUjtUUi04O0T8emNlOzA7MDswCitUUjtUUi0yMjtFZGlybmU7MDswOzAKK1RSO1RSLTIzO0VsYXppZzswOzA7MAorVFI7VFItMjQ7RXJ6aW5jYW47MDswOzAKK1RSO1RSLTI1O0VyenVydW07MDswOzAKK1RSO1RSLTI2O0Vza2lzZWhpcjswOzA7MAorVFI7VFItMjc7R2F6aWFudGVwOzA7MDswCitUUjtUUi0yODtHaXJlc3VuOzA7MDswCitUUjtUUi0yOTtHdW11c2hhbmU7MDswOzAKK1RSO1RSLTMwO0hha2thcmk7MDswOzAKK1RSO1RSLTM7SGF0YXk7MDswOzAKK1RSO1RSLTc2O0lkcjswOzA7MAorVFI7VFItMzI7SXNwYXJ0YTswOzA7MAorVFI7VFItMzM7SWNlbDswOzA7MAorVFI7VFItMzQ7SXN0YW5idWw7MDswOzAKK1RSO1RSLTM1O0l6bWlyOzA7MDswCitUUjtUUi00NjtLYWhyYW1hbm1hcmE7MDswOzAKK1RSO1RSLTc4O0thcmFi/Gs7MDswOzAKK1RSO1RSLTcwO0thcmFtYW47MDswOzAKK1RSO1RSLTM2O0thcnM7MDswOzAKK1RSO1RSLTM3O0thc3RhbW9udTswOzA7MAorVFI7VFItMzg7S2F5c2VyaTswOzA7MAorVFI7VFItODg7S2lua2thbGU7MDswOzAKK1RSO1RSLTM5O0tpcmtsYXJlbGk7MDswOzAKK1RSO1RSLTQwO0tpcnNlaGlyOzA7MDswCitUUjtUUi03OTtLaWxpczswOzA7MAorVFI7VFItODQ7S29jYWVsaTswOzA7MAorVFI7VFItNDI7S29ueWE7MDswOzAKK1RSO1RSLTQzO0t1dGFoeWE7MDswOzAKK1RSO1RSLTQ0O01hbGF0eWE7MDswOzAKK1RSO1RSLTQ1O01hbmlzYTswOzA7MAorVFI7VFItNDc7TWFyZGluOzA7MDswCitUUjtUUi00ODtNdWdsYTswOzA7MAorVFI7VFItNDk7TXVzOzA7MDswCitUUjtUUi01MDtOZXZzZWhpcjswOzA7MAorVFI7VFItNTtOaWdkZTswOzA7MAorVFI7VFItNTI7T3JkdTswOzA7MAorVFI7VFItODA7T3NtYW5peWU7MDswOzAKK1RSO1RSLTUzO1JpemU7MDswOzAKK1RSO1RSLTU0O1Nha2FyeWE7MDswOzAKK1RSO1RSLTU1O1NhbXN1bjswOzA7MAorVFI7VFItNTY7U2lpcnQ7MDswOzAKK1RSO1RSLTU3O1Npbm9wOzA7MDswCitUUjtUUi01ODtTaXZhczswOzA7MAorVFI7VFItNjM7U2FubGl1cmZhOzA7MDswCitUUjtUUi03MztTaXJuYWs7MDswOzAKK1RSO1RSLTU5O1Rla2lyZGFnOzA7MDswCitUUjtUUi02MDtUb2thdDswOzA7MAorVFI7VFItNjtUcmFiem9uOzA7MDswCitUUjtUUi02MjtUdW5jZWxpOzA7MDswCitUUjtUUi02NDtVc2FrOzA7MDswCitUUjtUUi02NTtWYW47MDswOzAKK1RSO1RSLTc3O1lhbG92YTswOzA7MAorVFI7VFItNjY7WW96Z2F0OzA7MDswCitUUjtUUi02NztaaW5ndWxkYWs7MDswOzAKK1RUO1RULUNUVDtDb3V2YS1UYWJhcXVpdGUtVGFscGFybzswOzA7cmVnaW9uCitUVDtUVC1ETU47RGllZ28gTWFydGluOzA7MDtyZWdpb24KK1RUO1RULUVUTztFYXN0ZXJuIFRvYmFnbzswOzA7cmVnaW9uCitUVDtUVC1QRUQ7UGVuYWwtRGViZTswOzA7cmVnaW9uCitUVDtUVC1QUlQ7UHJpbmNlcyBUb3duOzA7MDtyZWdpb24KK1RUO1RULVJDTTtSaW8gQ2xhcm8tTWF5YXJvOzA7MDtyZWdpb24KK1RUO1RULVNHRTtTYW5ncmUgR3JhbmRlOzA7MDtyZWdpb24KK1RUO1RULVNKTDtTYW4gSnVhbi1MYXZlbnRpbGxlOzA7MDtyZWdpb24KK1RUO1RULVNJUDtTaXBhcmlhOzA7MDtyZWdpb24KK1RUO1RULVRVUDtUdW5hcHVuYS1QaWFyY287MDswO3JlZ2lvbgorVFQ7VFQtV1RPO1dlc3Rlcm4gVG9iYWdvOzA7MDtyZWdpb24KK1RUO1RULUFSSTtBcmltYTswOzA7MG11bmljaXBhbGl0eQorVFQ7VFQtQ0hBO0NoYWd1YW5hczswOzA7MG11bmljaXBhbGl0eQorVFQ7VFQtUFRGO1BvaW50IEZvcnRpbjswOzA7MG11bmljaXBhbGl0eQorVFQ7VFQtUE9TO1BvcnQgb2YgU3BhaW47MDswOzBtdW5pY2lwYWxpdHkKK1RUO1RULVNGTztTYW4gRmVybmFuZG87MDswOzBtdW5pY2lwYWxpdHkKK1RXO1RXLUtISDtLYW9oc2l1bmc7MDswOzBzcGVjaWFsIG11bmljaXBhbGl0eQorVFc7VFctVFBFO1RhaXBlaTswOzA7MHNwZWNpYWwgbXVuaWNpcGFsaXR5CitUVztUVy1DWUk7Q2hpYXlpOzA7MDswbXVuaWNpcGFsaXR5CitUVztUVy1IU1o7SHNpbmNodTswOzA7MG11bmljaXBhbGl0eQorVFc7VFctS0VFO0tlZWx1bmc7MDswOzBtdW5pY2lwYWxpdHkKK1RXO1RXLVRYRztUYWljaHVuZzswOzA7MG11bmljaXBhbGl0eQorVFc7VFctVE5OO1RhaW5hbjswOzA7MG11bmljaXBhbGl0eQorVFc7VFctQ0hBO0NoYW5naHVhOzA7MDswO2Rpc3RyaWN0CitUVztUVy1DWVE7Q2hpYXlpOzA7MDswO2Rpc3RyaWN0CitUVztUVy1IU1E7SHNpbmNodTswOzA7MDtkaXN0cmljdAorVFc7VFctSFVBO0h1YWxpZW47MDswOzA7ZGlzdHJpY3QKK1RXO1RXLUlMQTtJbGFuOzA7MDswO2Rpc3RyaWN0CitUVztUVy1LSFE7S2FvaHNpdW5nOzA7MDswO2Rpc3RyaWN0CitUVztUVy1NSUE7TWlhb2xpOzA7MDswO2Rpc3RyaWN0CitUVztUVy1OQU47TmFudG91OzA7MDswO2Rpc3RyaWN0CitUVztUVy1QRU47UGVuZ2h1OzA7MDswO2Rpc3RyaWN0CitUVztUVy1QSUY7UGluZ3R1bmc7MDswOzA7ZGlzdHJpY3QKK1RXO1RXLVRYUTtUYWljaHVuZzswOzA7MDtkaXN0cmljdAorVFc7VFctVE5RO1RhaW5hbjswOzA7MDtkaXN0cmljdAorVFc7VFctVFBRO1RhaXBlaTswOzA7MDtkaXN0cmljdAorVFc7VFctVFRUO1RhaXR1bmc7MDswOzA7ZGlzdHJpY3QKK1RXO1RXLVRBTztUYW95dWFuOzA7MDswO2Rpc3RyaWN0CitUVztUVy1ZVU47WXVubGluOzA7MDswO2Rpc3RyaWN0CitUWjtUWi0wO0FydXNoYTswOzA7MAorVFo7VFotMDI7RGFyIGVzIFNhbGFhbTswOzA7MAorVFo7VFotMDM7RG9kb21hOzA7MDswCitUWjtUWi0wNDtJcmluZ2E7MDswOzAKK1RaO1RaLTA1O0thZ2VyYTswOzA7MAorVFo7VFotMDY7S2Fza2F6aW5pIFBlbWJhO1BlbWJhIE5vcnRoOzA7MAorVFo7VFotMDc7S2Fza2F6aW5pIFVuZ3VqYTtaYW56aWJhciBOb3J0aDswOzAKK1RaO1RaLTA4O0tpZ29tYTswOzA7MAorVFo7VFotMDk7S2lsaW1hbmphcm87MDswOzAKK1RaO1RaLTEwO0t1c2luaSBQZW1iYTtQZW1iYSBTb3V0aDswOzA7CitUWjtUWi0xMTtLdXNpbmkgVW5ndWphO1phbnppYmFyIFNvdXRoOzA7MAorVFo7VFotMjtMaW5kaTswOzA7MAorVFo7VFotMztNYXJhOzA7MDswCitUWjtUWi00O01iZXlhOzA7MDswCitUWjtUWi01O01qaW5pIE1hZ2hhcmliaTtaYW56aWJhciBXZXN0OzA7MAorVFo7VFotNjtNb3JvZ29ybzswOzA7MAorVFo7VFotNztNdHdhcmE7MDswOzAKK1RaO1RaLTg7TXdhbnphOzA7MDswCitUWjtUWi05O1B3YW5pO0NvYXN0OzA7MAorVFo7VFotMjA7UnVrd2E7MDswOzAKK1RaO1RaLTEyO1J1dnVtYTswOzA7MAorVFo7VFotMjI7U2hpbnlhbmdhOzA7MDswCitUWjtUWi0yMztTaW5naWRhOzA7MDswCitUWjtUWi0yNDtUYWJvcmE7MDswOzAKK1RaO1RaLTI1O1RhbmdhOzA7MDswCitVQTtVQS03O0NoZXJrYXNrYSBPYmxhc3Q7MDswO3JlZ2lvbgorVUE7VUEtNzQ7Q2hlcm5paGl2c2thIE9ibGFzdDswOzA7cmVnaW9uCitVQTtVQS03NztDaGVybml2ZXRza2EgT2JsYXN0OzA7MDtyZWdpb24KK1VBO1VBLTI7RG5pcHJvcGV0cm92c2thIE9ibGFzdDswOzA7cmVnaW9uCitVQTtVQS00O0RvbmV0c2thIE9ibGFzdDswOzA7cmVnaW9uCitVQTtVQS0yNjtJdmFuby1GcmFua2l2c2thIE9ibGFzdDswOzA7cmVnaW9uCitVQTtVQS02MztLaGFya2l2c2thIE9ibGFzdDswOzA7cmVnaW9uCitVQTtVQS02NTtLaGVyc29uc2thIE9ibGFzdDswOzA7cmVnaW9uCitVQTtVQS02ODtLaG1lbG55dHNrYSBPYmxhc3Q7MDswO3JlZ2lvbgorVUE7VUEtMzU7S2lyb3ZvaHJhZHNrYSBPYmxhc3Q7MDswO3JlZ2lvbgorVUE7VUEtMzI7S3lpdnNrYSBPYmxhc3Q7MDswO3JlZ2lvbgorVUE7VUEtMDk7THVoYW5za2EgT2JsYXN0OzA7MDtyZWdpb24KK1VBO1VBLTQ2O0x2aXZza2EgT2JsYXN0OzA7MDtyZWdpb24KK1VBO1VBLTQ4O015a29sYWl2c2thIE9ibGFzdDswOzA7cmVnaW9uCitVQTtVQS01O09kZXNrYSBPYmxhc3Q7MDswO3JlZ2lvbgorVUE7VUEtNTM7UG9sdGF2c2thIE9ibGFzdDswOzA7cmVnaW9uCitVQTtVQS01NjtSaXZuZW5za2EgT2JsYXN0OzA7MDtyZWdpb24KK1VBO1VBLTU5O1N1bXNrYSBPYmxhc3Q7MDswO3JlZ2lvbgorVUE7VUEtNjtUZXJub3BpbHNrYSBPYmxhc3Q7MDswO3JlZ2lvbgorVUE7VUEtMDU7Vmlubnl0c2thIE9ibGFzdDswOzA7cmVnaW9uCitVQTtVQS0wNztWb2x5bnNrYSBPYmxhc3Q7MDswO3JlZ2lvbgorVUE7VUEtMjtaYWthcnBhdHNrYSBPYmxhc3Q7MDswO3JlZ2lvbgorVUE7VUEtMjM7WmFwb3JpemthIE9ibGFzdDswOzA7cmVnaW9uCitVQTtVQS04O1poeXRvbXlyc2thIE9ibGFzdDswOzA7cmVnaW9uCitVQTtVQS00MztSZXNwdWJsaWthIEtyeW07MDswOzByZXB1YmxpYworVUE7VUEtMzA7S3lpdjswOzA7MDtjaXR5CitVQTtVQS00MDtTZXZhc3RvcG9sOzA7MDswO2NpdHkKK1VHO1VHLTMwMjtBcGFjOzA7MDtOCitVRztVRy0zMDM7QXJ1YTswOzA7TgorVUc7VUctNDA7QnVuZGlidWd5bzswOzA7VworVUc7VUctNDAyO0J1c2hlbnlpOzA7MDtXCitVRztVRy0zMDQ7R3VsdTswOzA7TjsKK1VHO1VHLTQwMztIb2ltYTswOzA7VzsKK1VHO1VHLTIwMztJZ2FuZ2E7MDswO0U7CitVRztVRy0yMDQ7SmluamE7MDswO0U7CitVRztVRy00MDQ7S2FiYWxlOzA7MDtXOworVUc7VUctNDA1O0thYmFyb2xlOzA7MDtXCitVRztVRy0wO0thbGFuZ2FsYTswOzA7QzsKK1VHO1VHLTAyO0thbXBhbGE7MDswO0M7CitVRztVRy0yMDU7S2FtdWxpOzA7MDtFOworVUc7VUctMjA2O0thcGNob3J3YTswOzA7RTsKK1VHO1VHLTQwNjtLYXNlc2U7MDswO1cKK1VHO1VHLTQwNztLaWJhYWxlOzA7MDtXCitVRztVRy0wMztLaWJvZ2E7MDswO0M7CitVRztVRy00MDg7S2lzb3JvOzA7MDtXCitVRztVRy0zMDU7S2l0Z3VtOzA7MDtOOworVUc7VUctMzA2O0tvdGlkbzswOzA7TjsKK1VHO1VHLTIwODtLdW1pOzA7MDtFOworVUc7VUctMzA3O0xpcmE7MDswO047CitVRztVRy0wNDtMdXdlcm87MDswO0M7CitVRztVRy0wNTtNYXNha2E7MDswO0M7CitVRztVRy00MDk7TWFzaW5kaTswOzA7VworVUc7VUctMjA5O01iYWxlOzA7MDtFOworVUc7VUctNDE7TWJhcmFyYTswOzA7VworVUc7VUctMzA4O01vcm90bzswOzA7TjsKK1VHO1VHLTMwOTtNb3lvOzA7MDtOOworVUc7VUctMDY7TXBpZ2k7MDswO0M7CitVRztVRy0wNztNdWJlbmRlOzA7MDtDOworVUc7VUctMDg7TXVrb25vOzA7MDtDOworVUc7VUctMzE7TmViYmk7MDswO047CitVRztVRy00O050dW5nYW1vOzA7MDtXCitVRztVRy0yMDtQYWxsaXNhOzA7MDtFOworVUc7VUctMTA7UmFrYWk7MDswO0M7CitVRztVRy00MjtSdWt1bmdpcmk7MDswO1cKK1VHO1VHLTUyO1Nvcm90aTswOzA7RTsKK1VHO1VHLTIyO1Rvcm9ybzswOzA7RTsKK1VNO1VNLTg7QmFrZXIgSXNsYW5kOzA7MDswCitVTTtVTS04NDtIb3dsYW5kIElzbGFuZDswOzA7MAorVU07VU0tODY7SmFydmlzIElzbGFuZDswOzA7MAorVU07VU0tNjc7Sm9obnN0b24gQXRvbGw7MDswOzAKK1VNO1VNLTg5O0tpbmdtYW4gUmVlZjswOzA7MAorVU07VU0tNztNaWR3YXkgSXNsYW5kczswOzA7MAorVU07VU0tNzY7TmF2YXNzYSBJc2xhbmQ7MDswOzAKK1VNO1VNLTk1O1BhbG15cmEgQXRvbGw7MDswOzAKK1VNO1VNLTc5O1dha2UgSXNsYW5kOzA7MDswCisjIFVTIEdPRVMgSEVSRQorVVk7VVktQVI7QXJ0aWdhczswOzA7MAorVVk7VVktQ0E7Q2FuZWxvbmVzOzA7MDswCitVWTtVWS1DTDtDZXJybyBMYXJnbzswOzA7MAorVVk7VVktQ087Q29sb25pYTswOzA7MAorVVk7VVktRFU7RHVyYXpubzswOzA7MAorVVk7VVktRlM7RmxvcmVzOzA7MDswCitVWTtVWS1GRDtGbG9yaWRhOzA7MDswCitVWTtVWS1MQTtMYXZhbGxlamE7MDswOzAKK1VZO1VZLU1BO01hbGRvbmFkbzswOzA7MAorVVk7VVktTU87TW9udGV2aWRlbzswOzA7MAorVVk7VVktUEE7UGF5c2FuZDswOzA7MAorVVk7VVktUk47Um8gTmVncm87MDswOzAKK1VZO1VZLVJWO1JpdmVyYTswOzA7MAorVVk7VVktUk87Um9jaGE7MDswOzAKK1VZO1VZLVNBO1NhbHRvOzA7MDswCitVWTtVWS1TSjtTYW4gSm9zZTswOzA7MAorVVk7VVktU087U29yaWFubzswOzA7MAorVVk7VVktVEE7VGFjdWFyZW1iOzA7MDswCitVWTtVWS1UVDtUcmVpbnRhIHkgVHJlczswOzA7MAorVVo7VVotUVI7S2FyYWthbHBhayBbUW9yYXFhbHBvZ5Fpc3RvbiBSZXNwdWJsaWthc2ldOzA7MDswcmVwdWJsaWMKK1VaO1VaLUFOO0FuZGl6aGFuOzA7MDtyZWdpb24KK1VaO1VaLUJVO0J1a2hhcmE7MDswO3JlZ2lvbgorVVo7VVotRkE7RmVyZ2FuYTswOzA7cmVnaW9uCitVWjtVWi1KSTtKaXp6YXg7MDswO3JlZ2lvbgorVVo7VVotTkc7TmFtYW5nYW47MDswO3JlZ2lvbgorVVo7VVotTlc7TmF2b2l5OzA7MDtyZWdpb24KK1VaO1VaLVFBO0thc2hrYWRhcnlhIFtRYXNocWFkYXJ5b107MDswO3JlZ2lvbgorVVo7VVotU0E7U2FtYXJrYW5kIFtTYW1hcnFhbmRdOzA7MDtyZWdpb24KK1VaO1VaLVNJO1N5cmRhcnlhIFtTaXJkYXJ5b107MDswO3JlZ2lvbgorVVo7VVotU1U7U3Vya2hhbmRhcnlhIFtTdXJ4b25kYXJ5b107MDswO3JlZ2lvbgorVVo7VVotVE87VGFzaGtlbnQgT2JsYXN0IFtUb3Noa2VudF07MDswO3JlZ2lvbgorVVo7VVotWE87S2hvcmV6bSBbWG9yYXptXTswOzA7cmVnaW9uCitWRTtWRS1BO0Rpc3RyaXRvIEZlZGVyYWw7MDswOzA7ZmVkZXJhbCBkaXN0cmljdAorVkU7VkUtQjtBbnpvdGVndWk7MDswOzBzdGF0ZQorVkU7VkUtQztBcHVyZTswOzA7MHN0YXRlCitWRTtWRS1EO0FyYWd1YTswOzA7MHN0YXRlCitWRTtWRS1FO0JhcmluYXM7MDswOzBzdGF0ZQorVkU7VkUtRjtCb2x2YXI7MDswOzBzdGF0ZQorVkU7VkUtRztDYXJhYm9ibzswOzA7MHN0YXRlCitWRTtWRS1IO0NvamVkZXM7MDswOzBzdGF0ZQorVkU7VkUtSTtGYWxjbjswOzA7MHN0YXRlCitWRTtWRS1KO0d1cmljbzswOzA7MHN0YXRlCitWRTtWRS1LO0xhcmE7MDswOzBzdGF0ZQorVkU7VkUtTDtNZXJpZGE7MDswOzBzdGF0ZQorVkU7VkUtTTtNaXJhbmRhOzA7MDswc3RhdGUKK1ZFO1ZFLU47TW9uYWdhczswOzA7MHN0YXRlCitWRTtWRS1PO051ZXZhIEVzcGFydGE7MDswOzBzdGF0ZQorVkU7VkUtUDtQb3J0dWd1ZXNhOzA7MDswc3RhdGUKK1ZFO1ZFLVI7U3VjcmU7MDswOzBzdGF0ZQorVkU7VkUtUztUY2hpcmE7MDswOzBzdGF0ZQorVkU7VkUtVDtUcnVqaWxsbzswOzA7MHN0YXRlCitWRTtWRS1VO1lhcmFjdXk7MDswOzBzdGF0ZQorVkU7VkUtVjtadWxpYTswOzA7MHN0YXRlCitWRTtWRS1aO0FtYXpvbmFzOzA7MDswc3RhdGUKK1ZFO1ZFLVk7RGVsdGEgQW1hY3VybzswOzA7MHN0YXRlCitWRTtWRS1XO0RlcGVuZGVuY2lhcyBGZWRlcmFsZXM7MDswOzA7ZmVkZXJhbCBkZXBlbmRlbmN5CitWTjtWTi00NDtBbiBHaWFuZzswOzA7MAorVk47Vk4tNDM7QmEgUmlhIC0gVnVuZyBUYXU7MDswOzAKK1ZOO1ZOLTUzO0JhYyBDYW47MDswOzAKK1ZOO1ZOLTU0O0JhYyBHaWFuZzswOzA7MAorVk47Vk4tNTU7QmFjIExpZXU7MDswOzAKK1ZOO1ZOLTU2O0JhYyBOaW5oOzA7MDswCitWTjtWTi01MDtCZW4gVHJlOzA7MDswCitWTjtWTi0zO0JpbmggRGluaDswOzA7MAorVk47Vk4tNTc7QmluaCBEdW9uZzswOzA7MAorVk47Vk4tNTg7QmluaCBQaHVvYzswOzA7MAorVk47Vk4tNDA7QmluaCBUaHVhbjswOzA7MAorVk47Vk4tNTk7Q2EgTWF1OzA7MDswCitWTjtWTi00ODtDYW4gVGhvOzA7MDswCitWTjtWTi0wNDtDYW8gQmFuZzswOzA7MAorVk47Vk4tNjA7RGEgTmFuZywgdGhhbmggcGhvOzA7MDswCitWTjtWTi0zMztEYWMgTGFjOzA7MDswCitWTjtWTi0zOTtEb25nIE5haTswOzA7MAorVk47Vk4tNDU7RG9uZyBUaGFwOzA7MDswCitWTjtWTi0zMDtHaWEgTGFpOzA7MDswCitWTjtWTi0wMztIYSBHaWFuZzswOzA7MAorVk47Vk4tNjM7SGEgTmFtOzA7MDswCitWTjtWTi02NDtIYSBOb2ksIHRodSBkbzswOzA7MAorVk47Vk4tNjU7SGEgVGF5OzA7MDswCitWTjtWTi0yMztIYSBUaW5oOzA7MDswCitWTjtWTi02O0hhaSBEdW9uZzswOzA7MAorVk47Vk4tNjI7SGFpIFBob25nLCB0aGFuaCBwaG87MDswOzAKK1ZOO1ZOLTQ7SG9hIEJpbmg7MDswOzAKK1ZOO1ZOLTY2O0hvIENoaSBNaW5oLCB0aGFuaCBwaG8gW1NhaSBHb25dOzA7MDswCitWTjtWTi02NztIdW5nIFllbjswOzA7MAorVk47Vk4tMzQ7S2hhbmggSG9hOzA7MDswCitWTjtWTi00NztLaWVuIEdpYW5nOzA7MDswCitWTjtWTi0yODtLb24gVHVtOzA7MDswCitWTjtWTi0wO0xhaSBDaGF1OzA7MDswCitWTjtWTi0zNTtMYW0gRG9uZzswOzA7MAorVk47Vk4tMDk7TGFuZyBTb247MDswOzAKK1ZOO1ZOLTAyO0xhbyBDYWk7MDswOzAKK1ZOO1ZOLTQxO0xvbmcgQW47MDswOzAKK1ZOO1ZOLTc0O05hbSBEaW5oOzA7MDswCitWTjtWTi0yMjtOZ2hlIEFuOzA7MDswCitWTjtWTi04O05pbmggQmluaDswOzA7MAorVk47Vk4tMzY7TmluaCBUaHVhbjswOzA7MAorVk47Vk4tNjg7UGh1IFRobzswOzA7MAorVk47Vk4tMzI7UGh1IFllbjswOzA7MAorVk47Vk4tMjQ7UXVhbmcgQmluaDswOzA7MAorVk47Vk4tMjc7UXVhbmcgTmFtOzA7MDswCitWTjtWTi0yOTtRdWFuZyBOZ2FpOzA7MDswCitWTjtWTi0zMTtRdWFuZyBOaW5oOzA7MDswCitWTjtWTi0yNTtRdWFuZyBUcmk7MDswOzAKK1ZOO1ZOLTUyO1NvYyBUcmFuZzswOzA7MAorVk47Vk4tMDU7U29uIExhOzA7MDswCitWTjtWTi0zNztUYXkgTmluaDswOzA7MAorVk47Vk4tMjA7VGhhaSBCaW5oOzA7MDswCitWTjtWTi02OTtUaGFpIE5ndXllbjswOzA7MAorVk47Vk4tMjtUaGFuaCBIb2E7MDswOzAKK1ZOO1ZOLTI2O1RodWEgVGhpZW4tSHVlOzA7MDswCitWTjtWTi00NjtUaWVuIEdpYW5nOzA7MDswCitWTjtWTi01MTtUcmEgVmluaDswOzA7MAorVk47Vk4tMDc7VHV5ZW4gUXVhbmc7MDswOzAKK1ZOO1ZOLTQ5O1ZpbmggTG9uZzswOzA7MAorVk47Vk4tNzA7VmluaCBQaHVjOzA7MDswCitWTjtWTi0wNjtZZW4gQmFpOzA7MDswCitWVTtWVS1NQVA7TWFsYW1wYTswOzA7MAorVlU7VlUtUEFNO1BlbmFtYTswOzA7MAorVlU7VlUtU0FNO1Nhbm1hOzA7MDswCitWVTtWVS1TRUU7U2hlZmE7MDswOzAKK1ZVO1ZVLVRBRTtUYWZlYTswOzA7MAorVlU7VlUtVE9CO1RvcmJhOzA7MDswCitXUztXUy1BQTtBYW5hOzA7MDswCitXUztXUy1BTDtBaWdhLWktbGUtVGFpOzA7MDswCitXUztXUy1BVDtBdHVhOzA7MDswCitXUztXUy1GQTtGYWFzYWxlbGVhZ2E7MDswOzAKK1dTO1dTLUdFO0dhZ2FlbWF1Z2E7MDswOzAKK1dTO1dTLUdJO0dhZ2FpZm9tYXVnYTswOzA7MAorV1M7V1MtUEE7UGFsYXVsaTswOzA7MAorV1M7V1MtU0E7U2F0dXBhaXRlYTswOzA7MAorV1M7V1MtVFU7VHVhbWFzYWdhOzA7MDswCitXUztXUy1WRjtWYWEtby1Gb25vdGk7MDswOzAKK1dTO1dTLVZTO1ZhaXNpZ2FubzswOzA7MAorWUU7WUUtQUI7QWJ5YW47MDswOzAKK1lFO1lFLUFEO0FkYW47MDswOzAKK1lFO1lFLUJBO0FsIEJheWE7MDswOzAKK1lFO1lFLUhVO0FsIHVkYXlkYWg7MDswOzAKK1lFO1lFLUpBO0FsIEphd2Y7MDswOzAKK1lFO1lFLU1SO0FsIE1haHJhaDswOzA7MAorWUU7WUUtTVc7QWwgTWF3aXQ7MDswOzAKK1lFO1lFLURIO0RoYW1hcjswOzA7MAorWUU7WUUtSEQ7YXJhbWF3dDswOzA7MAorWUU7WUUtSEo7YWpqYWg7MDswOzAKK1lFO1lFLUlCO0liYjswOzA7MAorWUU7WUUtTEE7TGFpajswOzA7MAorWUU7WUUtTUE7TWFyaWI7MDswOzAKK1lFO1lFLVNEO2RhaDswOzA7MAorWUU7WUUtU047YW47MDswOzAKK1lFO1lFLVNIO1NoYWJ3YWg7MDswOzAKK1lFO1lFLVRBO1Rpeno7MDswOzAKK0NTO0NTLUNHO0NybmEgR29yYTswOzA7MHJlcHVibGljCitDUztDUy1TUjtTcmJpamE7MDswOzByZXB1YmxpYworQ1M7Q1MtS007S29zb3ZvLU1ldG9oaWphOzA7MDtDUy1TUjthdXRvbm9tb3VzIHByb3ZpbmNlCitDUztDUy1WTztWb2p2b2RpbmE7MDswO0NTLVNSO2F1dG9ub21vdXMgcHJvdmluY2UKK1pBO1pBLUVDO0Vhc3Rlcm4gQ2FwZSBbRWFzdGVybiBUVkxdO09vcy1LYWFwOzA7MDsKK1pBO1pBLUZTO0ZyZWUgU3RhdGU7VnJ5c3RhYXQ7MDswOworWkE7WkEtR1Q7R2F1dGVuZzswOzA7MAorWkE7WkEtTkw7S3dhenVsdS1OYXRhbDswOzA7MAorWkE7WkEtTVA7TXB1bWFsYW5nYTswOzA7MAorWkE7WkEtTkM7Tm9ydGhlcm4gQ2FwZSBbTm9ydGhlcm4gVFZMXTtOb29yZC1LYWFwOzA7MDsKK1pBO1pBLUxQO0xpbXBvcG87TGltcG9wbzswOzA7CitaQTtaQS1OVztOb3J0aC1XZXN0O05vb3JkLVdlczswOzA7CitaQTtaQS1XQztXZXN0ZXJuIENhcGU7V2VzLUthYXA7MDswOworWk07Wk0tMDI7Q2VudHJhbDswOzA7MAorWk07Wk0tMDg7Q29wcGVyYmVsdDswOzA7MAorWk07Wk0tMDM7RWFzdGVybjswOzA7MAorWk07Wk0tMDQ7THVhcHVsYTswOzA7MAorWk07Wk0tMDk7THVzYWthOzA7MDswCitaTTtaTS0wNTtOb3J0aGVybjswOzA7MAorWk07Wk0tMDY7Tm9ydGgtV2VzdGVybjswOzA7MAorWk07Wk0tMDc7U291dGhlcm47MDswOzAKK1pNO1pNLTA7V2VzdGVybjswOzA7MAorWlc7WlctQlU7QnVsYXdheW87MDswOzAKK1pXO1pXLUhBO0hhcmFyZTswOzA7MAorWlc7WlctTUE7TWFuaWNhbGFuZDswOzA7MAorWlc7WlctTUM7TWFzaG9uYWxhbmQgQ2VudHJhbDswOzA7MAorWlc7WlctTUU7TWFzaG9uYWxhbmQgRWFzdDswOzA7MAorWlc7WlctTVc7TWFzaG9uYWxhbmQgV2VzdDswOzA7MAorWlc7WlctTVY7TWFzdmluZ287MDswOzAKK1pXO1pXLU1OO01hdGFiZWxlbGFuZCBOb3J0aDswOzA7MAorWlc7WlctTVM7TWF0YWJlbGVsYW5kIFNvdXRoOzA7MDswCitaVztaVy1NSTtNaWRsYW5kczswOzA7MAorR0U7R0UtQUI7QWJraGF6aWE7MDswOzBhdXRvbm9tb3VzIHJlcHVibGljCitHRTtHRS1BSjtBamFyaWE7MDswOzBhdXRvbm9tb3VzIHJlcHVibGljCitHRTtHRS1HVTtHdXJpYTswOzA7cmVnaW9uCitHRTtHRS1JTTtJbWVyZXRpOzA7MDtyZWdpb24KK0dFO0dFLUtBO0tha2hldGk7MDswO3JlZ2lvbgorR0U7R0UtS0s7S3ZlbW8gS2FydGxpOzA7MDtyZWdpb24KK0dFO0dFLU1NO010c2toZXRhLU10aWFuZXRpOzA7MDtyZWdpb24KK0dFO0dFLVJMO1JhY2hhLUxlY2hraHVtaSBbYW5kXSBLdmVtbyBTdmFuZXRpOzA7MDtyZWdpb24KK0dFO0dFLVNaO1NhbWVncmVsby1aZW1vIFN2YW5ldGk7MDswO3JlZ2lvbgorR0U7R0UtU0o7U2FtdHNraGUtSmF2YWtoZXRpOzA7MDtyZWdpb24KK0dFO0dFLVNLO1NoaWRhIEthcnRsaTswOzA7cmVnaW9uCitHRTtHRS1UQjtUYmlsaXNpOzA7MDswO2NpdHkKK1RMO1RMLUFMO0FpbGV1OzA7MDswCitUTDtUTC1BTjtBaW5hcm87MDswOzAKK1RMO1RMLUJBO0JhdWNhdTswOzA7MAorVEw7VEwtQk87Qm9ib25hcm87MDswOzAKK1RMO1RMLUNPO0NvdmEgTGltYTswOzA7MAorVEw7VEwtREk7RGlsaTswOzA7MAorVEw7VEwtRVI7RXJtZXJhOzA7MDswCitUTDtUTC1MQTtMYXV0ZW07MDswOzAKK1RMO1RMLUxJO0xpcXVpY2E7MDswOzAKK1RMO1RMLU1UO01hbmF0dXRvOzA7MDswCitUTDtUTC1NRjtNYW51ZmFoaTswOzA7MAorVEw7VEwtT0U7T2VjdXNzaTswOzA7MAorVEw7VEwtVkk7VmlxdWVxdWU7MDswOzAKK1VHO1VHLTMwO0FkanVtYW5pOzA7MDtOOworVUc7VUctMjE7QnVnaXJpOzA7MDtFOworVUc7VUctMjAyO0J1c2lhOzA7MDtFOworVUc7VUctMjA3O0thdGFrd2k7MDswO0U7CitVRztVRy0wOTtOYWthc29uZ29sYTswOzA7QworVUc7VUctMTE7U2VtYmFidWxlOzA7MDtDCitCSTtCSS1NVztNd2FybzswOzA7MAorRUM7RUMtRDtPcmVsbGFuYTswOzA7MAorRVQ7RVQtREQ7RGlyIERhd2E7RGlyZSBEYXdhOzA7MDthZG1pbmlzdHJhdGlvbgorS0c7S0ctR0I7QmlzaGtlaztHb3JvZCBCaXNoa2VrO0dvcm9kIEJpa2VrOzA7Y2l0eQorS0c7S0ctQjtCYXRrZW47QmF0a2Vuc2theWEgb2JsYXN0O0JhdGtlbnNrYWphIG9ibGFzdDswO3JlZ2lvbgorS0g7S0gtMjQ7S3JvbmcgUGFpbGluIFtLcm5nIFBhaWxuXTswOzA7MGF1dG9ub21vdXMgbXVuaWNpcGFsaXR5CitLUDtLUC1OQUo7TmFqaW4gU29uYm9uZy1zaTswOzA7MHNwZWNpYWwgY2l0eQorUk87Uk8tSUY7SWxmb3Y7MDswOzA7ZGVwYXJ0bWVudAorU0k7U0ktMDA7QWpkb3ZlaW5hOzA7MDswCitTSTtTSS0wMDI7QmVsdGluY2k7MDswOzAKK1NJO1NJLTQ4O0JlbmVkaWt0OzA7MDswCitTSTtTSS00OTtCaXN0cmljYSBvYiBTb3RsaTswOzA7MAorU0k7U0ktMDAzO0JsZWQ7MDswOzAKK1NJO1NJLTUwO0Jsb2tlOzA7MDswCitTSTtTSS0wMDQ7Qm9oaW5qOzA7MDswCitTSTtTSS0wMDU7Qm9yb3ZuaWNhOzA7MDswCitTSTtTSS0wMDY7Qm92ZWM7MDswOzAKK1NJO1NJLTU7QnJhc2xvdmVlOzA7MDswCitTSTtTSS0wMDc7QnJkYTswOzA7MAorU0k7U0ktMDA4O0JyZXpvdmljYTswOzA7MAorU0k7U0ktMDA5O0JyZWljZTswOzA7MAorU0k7U0ktNTI7Q2Fua292YTswOzA7MAorU0k7U0ktMDtDZWxqZTswOzA7MAorU0k7U0ktMDI7Q2Vya2xqZSBuYSBHb3Jlbmpza2VtOzA7MDswCitTSTtTSS0wMztDZXJrbmljYTswOzA7MAorU0k7U0ktMDQ7Q2Vya25vOzA7MDswCitTSTtTSS01MztDZXJrdmVuamFrOzA7MDswCitTSTtTSS0wNTtyZW5vdmNpOzA7MDswCitTSTtTSS0wNjtybmEgbmEgS29yb2tlbTswOzA7MAorU0k7U0ktMDc7cm5vbWVsajswOzA7MAorU0k7U0ktMDg7RGVzdHJuaWs7MDswOzAKK1NJO1NJLTA5O0RpdmFlYTswOzA7MAorU0k7U0ktNTQ7RG9iamU7MDswOzAKK1NJO1NJLTAyMDtEb2JyZXBvbGplOzA7MDswCitTSTtTSS01NTtEb2JybmE7MDswOzAKK1NJO1NJLTAyO0RvYnJvdmEtUG9saG92IEdyYWRlYzswOzA7MAorU0k7U0ktNTY7RG9icm92bmlrW0RvYnJvbmFrXTswOzA7MAorU0k7U0ktMDIyO0RvbCBwcmkgTGp1YmxqYW5pOzA7MDswCitTSTtTSS01NztEb2xlbmpza2UgVG9wbGljZTswOzA7MAorU0k7U0ktMDIzO0RvbWFsZTswOzA7MAorU0k7U0ktMDI0O0Rvcm5hdmE7MDswOzAKK1NJO1NJLTAyNTtEcmF2b2dyYWQ7MDswOzAKK1NJO1NJLTAyNjtEdXBsZWs7MDswOzAKK1NJO1NJLTAyNztHb3JlbmphIHZhcy1Qb2xqYW5lOzA7MDswCitTSTtTSS0wMjg7R29yaW5pY2E7MDswOzAKK1NJO1NJLTAyOTtHb3JuamEgUmFkZ29uYTswOzA7MAorU0k7U0ktMDMwO0dvcm5qaSBHcmFkOzA7MDswCitTSTtTSS0wMztHb3JuamkgUGV0cm92Y2k7MDswOzAKK1NJO1NJLTU4O0dyYWQ7MDswOzAKK1NJO1NJLTAzMjtHcm9zdXBsamU7MDswOzAKK1NJO1NJLTU5O0hhamRpbmE7MDswOzAKK1NJO1NJLTYwO0hvZWUtU2xpdm5pY2E7MDswOzAKK1NJO1NJLTY7SG9kb1tIb2Rvc107MDswOzAKK1NJO1NJLTYyO0hvcmp1bDswOzA7MAorU0k7U0ktMDM0O0hyYXN0bmlrOzA7MDswCitTSTtTSS0wMzU7SHJwZWxqZS1Lb3ppbmE7MDswOzAKK1NJO1NJLTAzNjtJZHJpamE7MDswOzAKK1NJO1NJLTAzNztJZzswOzA7MAorU0k7U0ktMDM4O0lsaXJza2EgQmlzdHJpY2E7MDswOzAKK1NJO1NJLTAzOTtJdmFuZW5hIEdvcmljYTswOzA7MAorU0k7U0ktMDQwO0l6b2xhW0lzb2xhXTswOzA7MAorU0k7U0ktMDQ7SmVzZW5pY2U7MDswOzAKK1NJO1NJLTYzO0plemVyc2tvOzA7MDswCitTSTtTSS0wNDI7SnVyaW5jaTswOzA7MAorU0k7U0ktMDQzO0thbW5pazswOzA7MAorU0k7U0ktMDQ0O0thbmFsOzA7MDswCitTSTtTSS0wNDU7S2lkcmllZXZvOzA7MDswCitTSTtTSS0wNDY7S29iYXJpZDswOzA7MAorU0k7U0ktMDQ3O0tvYmlsamU7MDswOzAKK1NJO1NJLTA0ODtLb2VldmplOzA7MDswCitTSTtTSS0wNDk7S29tZW47MDswOzAKK1NJO1NJLTY0O0tvbWVuZGE7MDswOzAKK1NJO1NJLTA1MDtLb3BlcltDYXBvZGlzdHJpYV07MDswOzAKK1NJO1NJLTY1O0tvc3RlbDswOzA7MAorU0k7U0ktMDU7S296amU7MDswOzAKK1NJO1NJLTA1MjtLcmFuajswOzA7MAorU0k7U0ktMDUzO0tyYW5qc2thIEdvcmE7MDswOzAKK1NJO1NJLTY2O0tyaWV2Y2k7MDswOzAKK1NJO1NJLTA1NDtLcmtvOzA7MDswCitTSTtTSS0wNTU7S3VuZ290YTswOzA7MAorU0k7U0ktMDU2O0t1em1hOzA7MDswCitTSTtTSS0wNTc7TGFrbzswOzA7MAorU0k7U0ktMDU4O0xlbmFydDswOzA7MAorU0k7U0ktMDU5O0xlbmRhdmFbTGVuZHZhXTswOzA7MAorU0k7U0ktMDYwO0xpdGlqYTswOzA7MAorU0k7U0ktMDY7TGp1YmxqYW5hOzA7MDswCitTSTtTSS0wNjI7TGp1Ym5vOzA7MDswCitTSTtTSS0wNjM7TGp1dG9tZXI7MDswOzAKK1NJO1NJLTA2NDtMb2dhdGVjOzA7MDswCitTSTtTSS0wNjU7TG9rYSBkb2xpbmE7MDswOzAKK1NJO1NJLTA2NjtMb2tpIFBvdG9rOzA7MDswCitTSTtTSS02NztMb3ZyZW5jIG5hIFBvaG9yanU7MDswOzAKK1NJO1NJLTA2NztMdWVlOzA7MDswCitTSTtTSS0wNjg7THVrb3ZpY2E7MDswOzAKK1NJO1NJLTA2OTtNYWpwZXJrOzA7MDswCitTSTtTSS0wNzA7TWFyaWJvcjswOzA7MAorU0k7U0ktNjg7TWFya292Y2k7MDswOzAKK1NJO1NJLTA3O01lZHZvZGU7MDswOzAKK1NJO1NJLTA3MjtNZW5nZTswOzA7MAorU0k7U0ktMDczO01ldGxpa2E7MDswOzAKK1NJO1NJLTA3NDtNZWljYTswOzA7MAorU0k7U0ktNjk7TWlrbGF2IG5hIERyYXZza2VtIHBvbGp1OzA7MDswCitTSTtTSS0wNzU7TWlyZW4tS29zdGFuamV2aWNhOzA7MDswCitTSTtTSS03MDtNaXJuYSBQZWU7MDswOzAKK1NJO1NJLTA3NjtNaXNsaW5qYTswOzA7MAorU0k7U0ktMDc3O01vcmF2ZWU7MDswOzAKK1NJO1NJLTA3ODtNb3JhdnNrZSBUb3BsaWNlOzA7MDswCitTSTtTSS0wNzk7TW96aXJqZTswOzA7MAorU0k7U0ktMDgwO011cnNrYSBTb2JvdGE7MDswOzAKK1NJO1NJLTA4O011dGE7MDswOzAKK1NJO1NJLTA4MjtOYWtsbzswOzA7MAorU0k7U0ktMDgzO05hemFyamU7MDswOzAKK1NJO1NJLTA4NDtOb3ZhIEdvcmljYTswOzA7MAorU0k7U0ktMDg1O05vdm8gbWVzdG87MDswOzAKK1NJO1NJLTA4NjtPZHJhbmNpOzA7MDswCitTSTtTSS03O09wbG90bmljYTswOzA7MAorU0k7U0ktMDg3O09ybW87MDswOzAKK1NJO1NJLTA4ODtPc2lsbmljYTswOzA7MAorU0k7U0ktMDg5O1Blc25pY2E7MDswOzAKK1NJO1NJLTA5MDtQaXJhbltQaXJhbm9dOzA7MDswCitTSTtTSS0wOTtQaXZrYTswOzA7MAorU0k7U0ktMDkyO1BvZGVldHJ0ZWs7MDswOzAKK1NJO1NJLTcyO1BvZGxlaG5pazswOzA7MAorU0k7U0ktMDkzO1BvZHZlbGthOzA7MDswCitTSTtTSS03MztQb2x6ZWxhOzA7MDswCitTSTtTSS0wOTQ7UG9zdG9qbmE7MDswOzAKK1NJO1NJLTc0O1ByZWJvbGQ7MDswOzAKK1NJO1NJLTA5NTtQcmVkZHZvcjswOzA7MAorU0k7U0ktNzU7UHJldmFsamU7MDswOzAKK1NJO1NJLTA5NjtQdHVqOzA7MDswCitTSTtTSS0wOTc7UHVjb25jaTswOzA7MAorU0k7U0ktMDk4O1JhZWUtRnJhbTswOzA7MAorU0k7U0ktMDk5O1JhZGVlZTswOzA7MAorU0k7U0ktMDA7UmFkZW5jaTswOzA7MAorU0k7U0ktMDtSYWRsamUgb2IgRHJhdmk7MDswOzAKK1NJO1NJLTAyO1JhZG92bGppY2E7MDswOzAKK1NJO1NJLTAzO1Jhdm5lIG5hIEtvcm9rZW07MDswOzAKK1NJO1NJLTc2O1JhemtyaWplOzA7MDswCitTSTtTSS0wNDtSaWJuaWNhOzA7MDswCitTSTtTSS03NztSaWJuaWNhIG5hIFBvaG9yanU7MDswOzAKK1NJO1NJLTA2O1JvZ2FrYSBTbGF0aW5hOzA7MDswCitTSTtTSS0wNTtSb2dhb3ZjaTswOzA7MAorU0k7U0ktMDc7Um9nYXRlYzswOzA7MAorU0k7U0ktMDg7UnVlOzA7MDswCitTSTtTSS03ODtTZWxuaWNhIG9iIERyYXZpOzA7MDswCitTSTtTSS0wOTtTZW1pZTswOzA7MAorU0k7U0ktMDtTZXZuaWNhOzA7MDswCitTSTtTSS07U2VhbmE7MDswOzAKK1NJO1NJLTI7U2xvdmVuaiBHcmFkZWM7MDswOzAKK1NJO1NJLTM7U2xvdmVuc2thIEJpc3RyaWNhOzA7MDswCitTSTtTSS00O1Nsb3ZlbnNrZSBLb25qaWNlOzA7MDswCitTSTtTSS03OTtTb2RyYWljYTswOzA7MAorU0k7U0ktODA7U29sZWF2YTswOzA7MAorU0k7U0ktNTtTdGFyZTswOzA7MAorU0k7U0ktODtTdmV0YSBBbmE7MDswOzAKK1NJO1NJLTgyO1N2ZXRpIEFuZHJhIHYgU2xvdmVuc2tpaCBnb3JpY2FoOzA7MDswCitTSTtTSS02O1N2ZXRpIEp1cmlqOzA7MDswCitTSTtTSS0wMzM7YWxvdmNpOzA7MDswCitTSTtTSS04MztlbXBldGVyLVZydG9qYmE7MDswOzAKK1NJO1NJLTc7ZW5ldXI7MDswOzAKK1NJO1NJLTg7ZW50aWxqOzA7MDswCitTSTtTSS05O2VudGplcm5lajswOzA7MAorU0k7U0ktMjA7ZW50anVyIHByaSBDZWxqdTswOzA7MAorU0k7U0ktMjtrb2NqYW47MDswOzAKK1NJO1NJLTIyO2tvZmphIExva2E7MDswOzAKK1NJO1NJLTIzO2tvZmxqaWNhOzA7MDswCitTSTtTSS0yNDttYXJqZSBwcmkgSmVsYWg7MDswOzAKK1NJO1NJLTI1O21hcnRubyBvYiBQYWtpOzA7MDswCitTSTtTSS05NDttYXJ0bm8gcHJpIExpdGlqaTswOzA7MAorU0k7U0ktMjY7b3Rhbmo7MDswOzAKK1NJO1NJLTI3O3RvcmU7MDswOzAKK1NJO1NJLTg0O1RhYm9yOzA7MDswCitTSTtTSS0wMDtUaWluYTswOzA7MAorU0k7U0ktMjg7VG9sbWluOzA7MDswCitTSTtTSS0yOTtUcmJvdmxqZTswOzA7MAorU0k7U0ktMzA7VHJlYm5qZTswOzA7MAorU0k7U0ktODU7VHJub3Zza2EgdmFzOzA7MDswCitTSTtTSS0zO1RyaWU7MDswOzAKK1NJO1NJLTg2O1RyemluOzA7MDswCitTSTtTSS0zMjtUdXJuaWVlOzA7MDswCitTSTtTSS0zMztWZWxlbmplOzA7MDswCitTSTtTSS04NztWZWxpa2EgUG9sYW5hOzA7MDswCitTSTtTSS0zNDtWZWxpa2UgTGFlZTswOzA7MAorU0k7U0ktODg7VmVyZWo7MDswOzAKK1NJO1NJLTM1O1ZpZGVtOzA7MDswCitTSTtTSS0zNjtWaXBhdmE7MDswOzAKK1NJO1NJLTM3O1ZpdGFuamU7MDswOzAKK1NJO1NJLTM4O1ZvZGljZTswOzA7MAorU0k7U0ktMzk7Vm9qbmlrOzA7MDswCitTSTtTSS04OTtWcmFuc2tvOzA7MDswCitTSTtTSS00MDtWcmhuaWthOzA7MDswCitTSTtTSS00O1Z1emVuaWNhOzA7MDswCitTSTtTSS00MjtaYWdvcmplIG9iIFNhdmk7MDswOzAKK1NJO1NJLTQzO1phdnJlOzA7MDswCitTSTtTSS00NDtacmVlZTswOzA7MAorU0k7U0ktOTA7YWxlYzswOzA7MAorU0k7U0ktNDY7ZWxlem5pa2k7MDswOzAKK1NJO1NJLTk7ZXRhbGU7MDswOzAKK1NJO1NJLTQ3O2lyaTswOzA7MAorU0k7U0ktOTI7aXJvdm5pY2E7MDswOzAKK1NJO1NJLTkzO3VlbWJlcms7MDswOzAKK1VaO1VaLVRLO1Rvc2hrZW50OzA7MDswO2NpdHkKK1ZFO1ZFLVg7VmFyZ2FzOzA7MDswc3RhdGUKK1lFO1lFLURBO0FkIERsaTswOzA7MAorWUU7WUUtQU07QW1ybjswOzA7MAorSE47SE4tT0M7T2NvdGVwZXF1ZTswOzA7MAorTVk7TVktNjtXaWxheWFoIFBlcnNla3V0dWFuIFB1dHJhamF5YTswOzA7MGZlZGVyYWwgdGVycml0b3J5CitUWjtUWi0yNjtNYW55YXJhOzA7MDswCitVRztVRy0yMztLYWJlcmFtYWlkbzswOzA7RQorVUc7VUctNDM7S2Ftd2VuZ2U7MDswO1cKK1VHO1VHLTQ0O0thbnVuZ3U7MDswO1cKK1VHO1VHLTI7S2F5dW5nYTswOzA7QzsKK1VHO1VHLTQ1O0t5ZW5qb2pvOzA7MDtXCitVRztVRy0yNDtNYXl1Z2U7MDswO0UKK1VHO1VHLTM7TmFrYXBpcmlwaXJpdDswOzA7TgorVUc7VUctMzI7UGFkZXI7MDswO04KK1VHO1VHLTI1O1Npcm9ua287MDswO0UKK1VHO1VHLTM7V2FraXNvOzA7MDtDOworVUc7VUctMzM7WXVtYmU7MDswO04KK0xZO0xZLUFKO0FqZGJpeTswOzA7MAorTFk7TFktSFo7QWwgaXptIGFsIEFraGFyOzA7MDswCitMWTtMWS1KSTtBbCBKaWZyYWg7MDswOzAKK0xZO0xZLUtGO0FsIEt1ZnJhaDswOzA7MAorTFk7TFktTUo7QWwgTWFyajswOzA7MAorTFk7TFktTUI7QWwgTWFycWFiOzA7MDswCitMWTtMWS1RVDtBbCBRYXJuOzA7MDswCitMWTtMWS1RQjtBbCBRdWJiYWg7MDswOzAKK0xZO0xZLU5RO0FuIE51cWEgYWwgS2hhbXM7MDswOzAKK0xZO0xZLVNIO0FzaCBTaGk7MDswOzAKK0xZO0xZLUJXO0JhbiBXYWxkOzA7MDswCitMWTtMWS1EUjtEYXJuYWg7MDswOzAKK0xZO0xZLUdEO0doYWRtaXM7MDswOzAKK0xZO0xZLUdSO0doYXJ5bjswOzA7MAorTFk7TFktR1Q7R2h0OzA7MDswCitMWTtMWS1KQjtKYWdoYmI7MDswOzAKK0xZO0xZLU1aO01pemRhaDswOzA7MAorTFk7TFktTVE7TXVyenVxOzA7MDswCitMWTtMWS1OTDtObHQ7MDswOzAKK0xZO0xZLVNCO1NhYmg7MDswOzAKK0xZO0xZLVNTO2FicnRhaCB1cm1uOzA7MDswCitMWTtMWS1TUjtTdXJ0OzA7MDswCitMWTtMWS1UTjtUanIgd2EgYW4gTmF3IEFyYjswOzA7MAorTFk7TFktVE07VGFyaG5haC1NYXNhbGx0YWg7MDswOzAKK0xZO0xZLVdEO1dkIGFsIGF5dDswOzA7MAorTFk7TFktWUo7WWFmcmFuLUpkOzA7MDswCitUTjtUTi00O0xhIE1hbm91YmE7MDswOzAKK0dZO0dZLUNVO0N1eXVuaS9NYXphcnVuaTswOzA7MAorR1k7R1ktREU7RGVtZXJhcmEvTWFoYWljYTswOzA7MAorR1k7R1ktRUI7RWFzdCBCZXJiaWNlL0NvcmVudHluZTswOzA7MAorR1k7R1ktRVM7RXNzZXF1aWJvIEkuL1dFU1QgRC47MDswOzAKK0dZO0dZLU1BO01haGFpY2EvQmVyYmljZTswOzA7MAorR1k7R1ktUE07UG9tZXJvb24vU3VwZW5hYW07MDswOzAKK0dZO0dZLVBUO1BvdGFyby9TaXBhcnVuaTswOzA7MAorR1k7R1ktVUQ7VXBwZXIgRGVtZXJhcmEvQmVyYmljZTswOzA7MAorR1k7R1ktVVQ7VXBwZXIgVGFrdXR1L1UuRXNzZXF1aWJvOzA7MDswCitBRjtBRi1LSE87S2hvd3N0OzA7MDswCitBRjtBRi1OVVI7TnJlc3RuOzA7MDswCitJRDtJRC1LUjtLZXB1bGF1YW4gUmlhdTswOzA7U007cHJvdmluY2UKK0FGO0FGLURBWTtEeWtvbmQ7MDswOzAKK0FGO0FGLVBBTjtQYW5qc2hyOzA7MDswCitESjtESi1BUjtBcnRhOzA7MDtyZWdpb24KK0lEO0lELVNSO1N1bGF3ZXNpIEJhcmF0OzA7MDtTTDtwcm92aW5jZQorVk47Vk4tNztEaWVuIEJpZW47MDswOzAKK1ZOO1ZOLTcyO0RhayBOb25nOzA7MDswCitWTjtWTi03MztIYXUgR2lhbmc7MDswOzAKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvSVNPRklYL0lTT19GSVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvSVNPRklYL0lTT19GSVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YzU3NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9JU09GSVgvSVNPX0ZJWC50eHQKQEAgLTAsMCArMSwzMjk0IEBACitBbGJhbmlhOlNIUUlQiVJJQTpVTktOT1dOOkFMLVNICitBdXN0cmlhOk5JRURFUpRTVEVSUkVJQ0g6VU5LTk9XTjpBVC0zCitBdXN0cmlhOk9CRVKUU1RFUlJFSUNIOlVOS05PV046QVQtNAorQXVzdHJpYTpWT1JBTEJFUkc6VU5LTk9XTjpBVC04CitBdXN0cmlhOkuEUk5URU46VU5LTk9XTjpBVC0yCitCZWxnaXVtOkJSVVhFTExFUy1CUlVTU0VMOlVOS05PV046QkUtQlJYCitCZWxnaXVtOk5JVkVMTEVTOlVOS05PV046QkUtTlZMCitCdWxnYXJpYTpNSUhBSkxPVkdSQUQ6VU5LTk9XTjpCRy0yMQorQnVsZ2FyaWE6R1JBRCBTT0ZJSkEgKE1VTi4pOlVOS05PV046QkctMjIKK0J1bGdhcmlhOlNPRklKQSAtIENJVFk6VU5LTk9XTjpCRy0yMworQnVsZ2FyaWE6TE9WRUM6VU5LTk9XTjpCRy0yOQorSWNlbGFuZDpJU0xBTkQ6VU5LTk9XTjpJUy1JU0wKK1N3aXR6ZXJsYW5kOkJFUk4vQkVSTkU6VU5LTk9XTjpDSC1CRQorU3dpdHplcmxhbmQ6TkVVQ0hBVEVMOlVOS05PV046Q0gtTkUKK1N3aXR6ZXJsYW5kOkdSQVVCP05ERU4vR1JJR0lPTkkvR1JJU0NIVU46VU5LTk9XTjpDSC1HUgorU3dpdHplcmxhbmQ6RlJJQk9VUkcvRlJFSUJVUkc6VU5LTk9XTjpDSC1GUgorU3dpdHplcmxhbmQ6TUlEV0FMREVOOlVOS05PV046Q0gtTlcKK1N3aXR6ZXJsYW5kOlZBTEFJUy9XQUxMSVM6VU5LTk9XTjpDSC1WUworU3dpdHplcmxhbmQ6QkVSTi9CRVJORTpVTktOT1dOOkNILUJFCitTd2l0emVybGFuZDpHRU6KVkU6VU5LTk9XTjpDSC1HTgorU3dpdHplcmxhbmQ6WlVSSUNIOlVOS05PV046Q0gtWkgKK1N3aXR6ZXJsYW5kOlRJQ0lOTzpVTktOT1dOOkNILVRJCitDWkVDSCBSRVBVQkxJQzpTRVZFUk9DRVNLWSBLUkFKOlVOS05PV046Q1MtU0UKK0NaRUNIIFJFUFVCTElDOlZZQ0hPRE9DRVNLWSBLUkFKOlVOS05PV046Q1MtVlkKK0NaRUNIIFJFUFVCTElDOlNUUkVET0NFU0tZIEtSQUo6VU5LTk9XTjpDUy1TUgorQ1pFQ0ggUkVQVUJMSUM6WkFQQURPQ0VTS1kgS1JBSjpVTktOT1dOOkNTLVpECitDWkVDSCBSRVBVQkxJQzpTRVZFUk9NT1JBVlNLWSBLUkFKOlVOS05PV046Q1MtU1YKK0NaRUNIIFJFUFVCTElDOlBSQUhBOlVOS05PV046Q1MtUFIKK0NaRUNIIFJFUFVCTElDOkpJSE9NT1JBVlNLWSBLUkFKOlVOS05PV046Q1MtSk0KK0NaRUNIIFJFUFVCTElDOkpJSE9DRVNLWSBLUkFKOlVOS05PV046Q1MtSkMKK0NaRUNIIFJFUFVCTElDOlNUUkVET0xTTE9WRU5TS1kgS1JBSjpVTktOT1dOOkNTLVNUCitDWkVDSCBSRVBVQkxJQzpZQ0hPRE9TTE9WRU5TS0kgS1JBSjpVTktOT1dOOkNTLVlDCitDWkVDSCBSRVBVQkxJQzpaQVBBRE9TTE9WRU5TS1kgS1JBSjpVTktOT1dOOkNTLVpBCitDWkVDSCBSRVBVQkxJQzpCUkFUSVNMQVZBOlVOS05PV046Q1MtQlIKK0dFUk1BTlk6Q0hFTU5JVFo6VU5LTk9XTjpERS1DTQorR0VSTUFOWTpXRVNFUi1FTVM6VU5LTk9XTjpERS1XRQorR0VSTUFOWTpMVUVORUJVUkc6VU5LTk9XTjpERS1MVQorR0VSTUFOWTpIQU5OT1ZFUjpVTktOT1dOOkRFLUhBCitHRVJNQU5ZOk1BR0RFQlVSRzpVTktOT1dOOkRFLU1BCitHRVJNQU5ZOkJSQVVOU0NIV0VJRzpVTktOT1dOOkRFLUJSCitHRVJNQU5ZOkRFVE1PTEQ6VU5LTk9XTjpERS1EVAorR0VSTUFOWTpNVUVOU1RFUjpVTktOT1dOOkRFLU1VCitHRVJNQU5ZOkRFU1NBVTpVTktOT1dOOkRFLURBCitHRVJNQU5ZOkhBTExFOlVOS05PV046REUtSEEKK0dFUk1BTlk6RFVFU1NFTERPUkY6VU5LTk9XTjpERS1EVQorR0VSTUFOWTpBUk5TQkVSRzpVTktOT1dOOkRFLUFSCitHRVJNQU5ZOkxFSVBaSUc6VU5LTk9XTjpERC1MUAorR0VSTUFOWTpLQVNTRUw6VU5LTk9XTjpERS1LQQorR0VSTUFOWTpUSFVSSU5HRU46VU5LTk9XTjpERS1USAorR0VSTUFOWTpEUkVTREVOOlVOS05PV046REUtRFIKK0dFUk1BTlk6S09FTE46VU5LTk9XTjpERS1LTworR0VSTUFOWTpHSUVTU0VOOlVOS05PV046REUtR0kKK0dFUk1BTlk6S09CTEVOWjpVTktOT1dOOkRFLUtPCitHRVJNQU5ZOlVOVEVSRlJBTktSRU46VU5LTk9XTjpERS1VTgorR0VSTUFOWTpPQkVSRlJBTktFTjpVTktOT1dOOkRFLU9CCitHRVJNQU5ZOkRBUk1TVEFEVDpVTktOT1dOOkRFLURBCitHRVJNQU5ZOlRSSUVSOlVOS05PV046REUtVEkKK0dFUk1BTlk6UkhFSU5IRVNTRU46VU5LTk9XTjpERS1SSAorR0VSTUFOWTpPQkVSUEZBTFo6VU5LTk9XTjpERS1PQgorR0VSTUFOWTpTVFVUVEdBUlQ6VU5LTk9XTjpERS1TVAorR0VSTUFOWTpNSVRURUxGUkFOS0VOOlVOS05PV046REUtTVQKK0dFUk1BTlk6S0FSTFNSVUhFOlVOS05PV046REUtS0EKK0dFUk1BTlk6TklFREVSQkFZRVJOOlVOS05PV046REUtTkkKK0dFUk1BTlk6T0JFUkJBWUVSTjpVTktOT1dOOkRFLUJZCitHRVJNQU5ZOlNDSFdBQkVOOlVOS05PV046REUtU0gKK0dFUk1BTlk6RlJFSUJVUkc6VU5LTk9XTjpERS1GUgorR0VSTUFOWTpUVUVCSU5HRU46VU5LTk9XTjpERS1UVQorR0VSTUFOWTpVTlRFUkZSQU5LRU46VU5LTk9XTjpERS1VVAorR0VSTUFOWTpSSEVJTkhFU1NFTi1QRkFMWjpVTktOT1dOOkRFLVJQCitERU5NQVJLOlZFU1QgRk9SIFNUT1JFQkFFTFQ6VU5LTk9XTjpESy0wMjEKK0RFTk1BUks6SE9WRURTVEFEU1JFR0lPTkVOOlVOS05PV046REstMDIyCitERU5NQVJLOk9TVCBGT1IgU1RPUkVCQUVMVDpVTktOT1dOOkRLLTAyMworU1BBSU46R0FMSUNJQTpVTktOT1dOOkVTLUdBCitTUEFJTjpQQUlTIFZBU0NPOlVOS05PV046RVMtVkEKK1NQQUlOOkNBU1RJTExBIC0gTEVPTjpVTktOT1dOOkVTLUxFCitTUEFJTjpBUkFHT046VU5LTk9XTjpFUy1BUgorU1BBSU46Q0FUQUxVTkE6VU5LTk9XTjpFUy1DVAorU1BBSU46UklPSkE6VU5LTk9XTjpFUy1SSQorU1BBSU46Q0FTVElMTEEgLSBMQSBNQU5DSEE6VU5LTk9XTjpFUy1NQQorU1BBSU46Q09NVU5JREFEIFZBTEVOQ0lBTkE6VU5LTk9XTjpFUy1WQQorU1BBSU46RVhUUkVNQURVUkE6VU5LTk9XTjpFUy1FVAorU1BBSU46QU5EQUxVQ0lBOlVOS05PV046RVMtQUQKK1NQQUlOOkNBTkFSSUFTOlVOS05PV046RVMtQ04KK0ZJTkxBTkQ6TEFQUEkvTEFQUExBTkQ6VU5LTk9XTjpGSS1MTAorRklOTEFORDpPVUxVL1VMRUFCT1JHOlVOS05PV046RkktVUwKK0ZJTkxBTkQ6VkFBU0EvVkFTQTpVTktOT1dOOkZJLVZBCitGSU5MQU5EOktVT1BJTzpVTktOT1dOOkZJLUtVCitGSU5MQU5EOlBPSEpPSVMtS0FSSkFMQS9OT1JSQS1LQVJFTEVOOlVOS05PV046RkktUE8KK0ZJTkxBTkQ6S0VTS0ktU1VPTUkvTUVMTEVSU1RBLUZJTkxBTkQ6VU5LTk9XTjpGSS1LRQorRklOTEFORDpNSUtLRUxJL1NUIE1JQ0hFTDpVTktOT1dOOkZJLU1LCitGSU5MQU5EOkiETUUvVEFWQVNURUhVUzpVTktOT1dOOkZJLVRBCitGSU5MQU5EOlRVUktVLVBPUkkvQUJPLUJKlFJORUJPUkc6VU5LTk9XTjpGSS1UVQorRklOTEFORDpLWU1JL0tZTU1FTkU6VU5LTk9XTjpGSS1LWQorRklOTEFORDpVVURFTk1BQS9OWUxBTkQ6VU5LTk9XTjpGSS1VVQorRklOTEFORDpBTEFORC9BSFZFTkFOTUFBOlVOS05PV046RkktQUwKK0ZSQU5DRTpOT1JEIC0gUEFTLURFLUNBTEFJUzpVTktOT1dOOkZSLVBDCitGUkFOQ0U6UElDQVJESUU6VU5LTk9XTjpGUi1QSQorRlJBTkNFOkNIQU1QQUdORS1BUkRFTk5FOlVOS05PV046RlItQ0gKK0ZSQU5DRTpIQVVURS1OT1JNQU5ESUU6VU5LTk9XTjpGUi1IQQorRlJBTkNFOkJBU1NFLU5PUk1BTkRJRTpVTktOT1dOOkZSLUJBCitGUkFOQ0U6TE9SUkFJTkU6VU5LTk9XTjpGUi1MTworRlJBTkNFOklMRSBERSBGUkFOQ0U6VU5LTk9XTjpGUi1JRgorRlJBTkNFOkFMU0FDRTpVTktOT1dOOkZSLUFMCitGUkFOQ0U6Q0VOVFJFOlVOS05PV046RlItQ0UKK0ZSQU5DRTpCUkVUQUdORTpVTktOT1dOOkZSLUJSCitGUkFOQ0U6UEFZUyBERSBMQSBMT0lSRTpVTktOT1dOOkZSLVBMCitGUkFOQ0U6Qk9VUkdPR05FOlVOS05PV046RlItQk8KK0ZSQU5DRTpGUkFOQ0hFLUNPTVRFOlVOS05PV046RlItQ08KK0ZSQU5DRTpQT0lUT1UtQ0hBUkVOVEVTOlVOS05PV046RlItUE8KK0ZSQU5DRTpBVVZFUkdORTpVTktOT1dOOkZSLUFVCitGUkFOQ0U6UkhPTkUtQUxQRVM6VU5LTk9XTjpGUi1SSAorRlJBTkNFOkxJTU9VU0lOOlVOS05PV046RlItTEkKK0ZSQU5DRTpBUVVJVEFJTkU6VU5LTk9XTjpGUi1BUQorRlJBTkNFOlBST1ZFTkNFLUFMUEVTLUNPVEUgRCdBWlVSOlVOS05PV046RlItUEEKK0ZSQU5DRTpNSURJLVBZUkVORUVTOlVOS05PV046RlItTVAKK0ZSQU5DRTpMQU5HVUVET0MtUk9VU1NJTExPTjpVTktOT1dOOkZSLUxBCitGUkFOQ0U6Q09SU0U6VU5LTk9XTjpGUi1DTworR1JFRUNFOkFOQVRPTElLSSBNQUtFRE9OSUE6VU5LTk9XTjpHUi04MAorR1JFRUNFOktFTlRSSUtJIE1BS0VET05JQTpVTktOT1dOOkdSLTg2CitHUkVFQ0U6RFlUSUtJIE1BS0VET05JQTpVTktOT1dOOkdSLTYwCitHUkVFQ0U6SVBFSVJPUzpVTktOT1dOOkdSLTYxCitHUkVFQ0U6VEhFU1NBTElBOlVOS05PV046R1ItNjMKK0dSRUVDRTpWT1JFSU8gQUlHQUlPOlVOS05PV046R1ItNjUKK0dSRUVDRTpJT05JQSBOSVNJQTpVTktOT1dOOkdSLTY3CitHUkVFQ0U6U1RFUkVBIEVMTEFEQTpVTktOT1dOOkdSLTcwCitHUkVFQ0U6RFlUSUtJIEVMTEFEQTpVTktOT1dOOkdSLTcxCitHUkVFQ0U6UEVMT1BPTk5JU09TOlVOS05PV046R1ItNzQKK0dSRUVDRTpOT1RJTyBBSUdBSU86VU5LTk9XTjpHUi03NQorR1JFRUNFOktSSVRJOlVOS05PV046R1ItNzYKK0NST0FUSUE6SFJWQVRTS0E6VU5LTk9XTjpIUi0xMQorSFVOR0FSWTpCT1JTT0QtQUJBVUotWkVNUExFTjpVTktOT1dOOkhVLVpFCitIVU5HQVJZOlNaQUJPTENTLVNaQVRBUi1CRVJFRzpVTktOT1dOOkhVLUJFCitIVU5HQVJZOkdZlFItTU9TT04tU09QUk9OOlVOS05PV046SFUtU08KK0lSRUxBTkQ6SVJFTEFORDpVTktOT1dOOklFLUkKK0lUQUxZOlRSRU5USU5PLUFMVE8gQURJR0U6VU5LTk9XTjpJVC1BRAorSVRBTFk6VkVORVRPOlVOS05PV046SVQtVk4KK0lUQUxZOkZSSVVMSS1WRU5FWklBOlVOS05PV046SVQtR0kKK0lUQUxZOkxPTUJBUkRJQTpVTktOT1dOOklULUxCCitJVEFMWTpQSUVNT05URTpVTktOT1dOOklULVBNCitJVEFMWTpWQUxMRSBEJ0FPU1RBOlVOS05PV046SVQtQVMKK0lUQUxZOkVNSUxJQS1ST01BR05BOlVOS05PV046SVQtRVIKK0lUQUxZOkxJR1VSSUE6VU5LTk9XTjpJVC1MRworSVRBTFk6VE9TQ0FOQTpVTktOT1dOOklULVRDCitJVEFMWTpNQVJDSEU6VU5LTk9XTjpJVC1NQQorSVRBTFk6VU1CUklBOlVOS05PV046SVQtVU0KK0lUQUxZOkFCUlVaWkk6VU5LTk9XTjpJVC1BQgorSVRBTFk6TEFaSU86VU5LTk9XTjpJVC1MQQorSVRBTFk6UFVHTElBOlVOS05PV046SVQtUFUKK0lUQUxZOk1PTElTRTpVTktOT1dOOklULU1MCitJVEFMWTpDQU1QQU5JQTpVTktOT1dOOklULUNNCitJVEFMWTpTQVJERUdOQTpVTktOT1dOOklULVNECitJVEFMWTpCQVNJTElDQVRBOlVOS05PV046SVQtQkMKK0lUQUxZOkNBTEFCUklBOlVOS05PV046SVQtQ0kKK0lUQUxZOlNJQ0lMSUE6VU5LTk9XTjpJVC1TQworSVRBTFk6RlJJVUxJLVZFTkVaSUEgR0lVTElBOlVOS05PV046SVQtRlYKK0lDRUxBTkQ6SUNFTEFORDpVTktOT1dOOklTLUkKK0xVWEVNQk9VUkc6TFVYRU1CT1VSRyAoR1JBTkQtRFVDSEUpOlVOS05PV046TFUtTAorTElFQ0hURU5TVEVJTjpMaWNodGVuc3RlaW46VU5LTk9XTjpMSS1MSUUKK05PUldBWTpOT1JELVRST0VOREVMQUc6VU5LTk9XTjpOTy03CitOT1JXQVk6U09FUi1UUk9FTkRFTEFHOlVOS05PV046Tk8tNgorTk9SV0FZOk1PRVJFIE9HIFJPTVNEQUw6VU5LTk9XTjpOTy01CitOT1JXQVk6T1NMTyBPRyBBS0VSU0hVUzpVTktOT1dOOk5PLTAzCitOT1JXQVk6T0VTVEZPTEQ6VU5LTk9XTjpOTy0wCitQT0xBTkQ6R0RBTlNLOlVOS05PV046UEwtR0QKK1BPTEFORDpTTFVQU0s6VU5LTk9XTjpQTC1TUAorUE9MQU5EOktPU1pBTElOOlVOS05PV046UEwtS08KK1BPTEFORDpFTEJMQUc6VU5LTk9XTjpQTC1FTAorUE9MQU5EOlNVV0FMU0tJOlVOS05PV046UEwtU1UKK1BPTEFORDpPTFNaVFlOOlVOS05PV046UEwtT0wKK1BPTEFORDpTWkNaRUNJTjpVTktOT1dOOlBMLUNJCitQT0xBTkQ6QllER09TWkNaOlVOS05PV046UEwtQlkKK1BPTEFORDpMT01aQTpVTktOT1dOOlBMLUxPCitQT0xBTkQ6QklBTFlTVE9LOlVOS05PV046UEwtQkkKK1BPTEFORDpQSUxBOlVOS05PV046UEwtUEkKK1BPTEFORDpUT1JVTjpVTktOT1dOOlBMLVRPCitQT0xBTkQ6T1NUUk9MRUtBOlVOS05PV046UEwtT1MKK1BPTEFORDpDSUVDSEFOT1c6VU5LTk9XTjpQTC1DRQorUE9MQU5EOkdPUlpPVzpVTktOT1dOOlBMLUdPCitQT0xBTkQ6V0xPQ0xBV0VLOlVOS05PV046UEwtV08KK1BPTEFORDpQTE9DSzpVTktOT1dOOlBMLUxPCitQT0xBTkQ6UE9aTkFOOlVOS05PV046UEwtUFoKK1BPTEFORDpTSUVETENFOlVOS05PV046UEwtU0kKK1BPTEFORDpXQVJTWkFXQTpVTktOT1dOOlBMLVdBCitQT0xBTkQ6S09OSU46VU5LTk9XTjpQTC1LTworUE9MQU5EOkJJQUxBIFBPRExBU0tBOlVOS05PV046UEwtQlAKK1BPTEFORDpaSUVMT05BIEdPUkE6VU5LTk9XTjpQTC1aRQorUE9MQU5EOlNLSUVSTklFV0lDRTpVTktOT1dOOlBMLVNLCitQT0xBTkQ6TEVTWk5POlVOS05PV046UEwtTEUKK1BPTEFORDpLQUxJU1o6VU5LTk9XTjpQTC1LQQorUE9MQU5EOkxPRFo6VU5LTk9XTjpQTC1MRAorUE9MQU5EOlNJRVJBRFo6VU5LTk9XTjpQTC1TUgorUE9MQU5EOlJBRE9NOlVOS05PV046UEwtUkEKK1BPTEFORDpMVUJMSU46VU5LTk9XTjpQTC1MTAorUE9MQU5EOkxFR05JQ0E6VU5LTk9XTjpQTC1MRworUE9MQU5EOlBJT1RSS09XOlVOS05PV046UEwtUE8KK1BPTEFORDpDSEVMTTpVTktOT1dOOlBMLUNICitQT0xBTkQ6V1JPQ0xBVzpVTktOT1dOOlBMLVdSCitQT0xBTkQ6SkVMRU5JQSBHT1JBOlVOS05PV046UEwtSkUKK1BPTEFORDpLSUVMQ0U6VU5LTk9XTjpQTC1LTAorUE9MQU5EOkNaRVNUT0NIT1dBOlVOS05PV046UEwtQ1oKK1BPTEFORDpPUE9MRTpVTktOT1dOOlBMLU9QCitQT0xBTkQ6VEFSTk9CUlpFRzpVTktOT1dOOlBMLVRBCitQT0xBTkQ6V0FMQlJaWUNIOlVOS05PV046UEwtV1kKK1BPTEFORDpaQU1PU0M6VU5LTk9XTjpQTC1aTQorUE9MQU5EOktBVE9XSUNFOlVOS05PV046UEwtS1QKK1BPTEFORDpSWkVTWk9XOlVOS05PV046UEwtUloKK1BPTEFORDpQUlpFTVlTTDpVTktOT1dOOlBMLVBSCitQT0xBTkQ6S1JBS09XOlVOS05PV046UEwtS1cKK1BPTEFORDpUQVJOT1c6VU5LTk9XTjpQTC1UVworUE9MQU5EOkJJRUxTS08tQklBTEE6VU5LTk9XTjpQTC1CQgorUE9MQU5EOktST1NOTzpVTktOT1dOOlBMLUtSCitQT0xBTkQ6Tk9XWSBTQUNaOlVOS05PV046UEwtTlMKK1BPUlRVR0FMOk5PUlRFOlVOS05PV046UFQtMTEKK1BPUlRVR0FMOkNFTlRSTzpVTktOT1dOOlBULTEwCitQT1JUVUdBTDpMSVNCT0EgRSBWQUxFIERPIFRFSk86VU5LTk9XTjpQVC0wMQorUE9SVFVHQUw6QUxFTlRFSk86VU5LTk9XTjpQVC0xNAorUE9SVFVHQUw6QUxHQVJWRTpVTktOT1dOOlBULTE1CitST01BTklBOkJPVE9TQU5JOlVOS05PV046Uk8tQlQKK1JPTUFOSUE6TUFSQU1VUkVTOlVOS05PV046Uk8tTU0KK1JPTUFOSUE6QklTVFJJVEEtTkFTQVVEOlVOS05PV046Uk8tQk4KK1JPTUFOSUE6SUFTSTpVTktOT1dOOlJPLUlTCitST01BTklBOlNBTEFKOlVOS05PV046Uk8tU0oKK1JPTUFOSUE6TkVBTVQ6VU5LTk9XTjpSTy1OVAorUk9NQU5JQTpNVVJFUzpVTktOT1dOOlJPLU1TCitST01BTklBOkJBQ0FVOlVOS05PV046Uk8tQkMKK1JPTUFOSUE6VElNSVM6VU5LTk9XTjpSTy1UTQorUk9NQU5JQTpCUkFTT1Y6VU5LTk9XTjpSTy1CVgorUk9NQU5JQTpHQUxBVEk6VU5LTk9XTjpSTy1HTAorUk9NQU5JQTpCVVpBVTpVTktOT1dOOlJPLUJaCitST01BTklBOkNBUkFTLVNFVkVSSU46VU5LTk9XTjpSTy1DUworUk9NQU5JQTpBUkdFUzpVTktOT1dOOlJPLUFHCitST01BTklBOlZJTENFQTpVTktOT1dOOlJPLVZMCitST01BTklBOkJSQUlMQTpVTktOT1dOOlJPLUJSCitST01BTklBOkRJTUJPVklUQTpVTktOT1dOOlJPLURCCitST01BTklBOk1FSEVESU5USTpVTktOT1dOOlJPLU1ICitST01BTklBOklBTE9NSVRBOlVOS05PV046Uk8tSUwKK1JPTUFOSUE6Q0FMQVJBU0k6VU5LTk9XTjpSTy1DQQorUk9NQU5JQTpCVUNVUkVTVEk6VU5LTk9XTjpSTy1CCitST01BTklBOkNPTlNUQU5UQTpVTktOT1dOOlJPLUNUCitSVVNTSUE6TU9VUk1BTlNLQe9BIE9CTEFTVDtQRUNIRU5HU0tJWTpVTktOT1dOOlJVLVBDRworUlVTU0lBOk5FTkVUU0tJIE5BVElPTkFMIE9LUk9VRztORU5FVFNLWSBOQVQuIE9LUk9VRzpVTktOT1dOOlJVLU5OVAorUlVTU0lBOk1PVVJNQU5TS0HvQSBPQkxBU1Q7S09MU0tJWTpVTktOT1dOOlJVLUtMSworUlVTU0lBOk1PVVJNQU5TS0HvQSBPQkxBU1Q7U0VWRVJPTU9SU0s6VU5LTk9XTjpSVS1TVk0KK1JVU1NJQTpNT1VSTUFOU0tB70EgT0JMQVNUO1BPTFlBUk5ZSTpVTktOT1dOOlJVLVBMUgorUlVTU0lBOk1PVVJNQU5TS0HvQSBPQkxBU1Q7TVVSTUFOU0s6VU5LTk9XTjpSVS1NUk4KK1JVU1NJQTpNT1VSTUFOU0tB70EgT0JMQVNUO0xPVk9aRVJTS0lZOlVOS05PV046UlUtTFZSCitSVVNTSUE6S09NSTtWT1JLVVRBOlVOS05PV046UlUtVlJUCitSVVNTSUE6TU9VUk1BTlNLQe9BIE9CTEFTVDtPTEVORUdPUlNLOlVOS05PV046UlUtT0xHCitSVVNTSUE6TU9VUk1BTlNLQe9BIE9CTEFTVDtNT05DSEVHT1JTSzpVTktOT1dOOlJVLU1ORworUlVTU0lBOk1PVVJNQU5TS0HvQSBPQkxBU1Q7S09WRE9SU0tJWTpVTktOT1dOOlJVLUtWUgorUlVTU0lBOk1PVVJNQU5TS0HvQSBPQkxBU1Q7S0lST1ZTSzpVTktOT1dOOlJVLUtSVgorUlVTU0lBOk1PVVJNQU5TS0HvQSBPQkxBU1Q7QVBBVElUWTpVTktOT1dOOlJVLUFQVAorUlVTU0lBOk5FTkVUU0tJIE5BVElPTkFMIE9LUk9VRztOQVJZQU4tTUFSOlVOS05PV046UlUtTlJOCitSVVNTSUE6TU9VUk1BTlNLQe9BIE9CTEFTVDtLQU5EQUxBS1NIQTpVTktOT1dOOlJVLUtOSworUlVTU0lBOk1PVVJNQU5TS0HvQSBPQkxBU1Q7UE9MWUFSTklZRSBaT1JZOlVOS05PV046UlUtUExZCitSVVNTSUE6TU9VUk1BTlNLQe9BIE9CTEFTVDtURVJTS0lZOlVOS05PV046UlUtVFJLCitSVVNTSUE6S09NSTtVU1QtVFNJTEVNU0tJWTpVTktOT1dOOlJVLVVTTAorUlVTU0lBOktPTUk7VVNJTlNLSVk6VU5LTk9XTjpSVS1VU1MKK1JVU1NJQTpLT01JO0lOVEE6VU5LTk9XTjpSVS1JTlQKK1JVU1NJQTpLQVJFTElBO0xPVUtIU0tJWTpVTktOT1dOOlJVLUxVUworUlVTU0lBOkFSS0hBTkdFTFNLQe9BIE9CTEFTVCBS6VM7TUVaRU5TS0lZOlVOS05PV046UlUtTVpTCitSVVNTSUE6S09NSTtJWkhFTVNLSVk6VU5LTk9XTjpSVS1JWlMKK1JVU1NJQTpLT01JO1VTSU5TSzpVTktOT1dOOlJVLVVTTgorUlVTU0lBOktBUkVMSUE7S0VNU0tJWTpVTktOT1dOOlJVLUtNSworUlVTU0lBOkFSS0hBTkdFTFNLQe9BIE9CTEFTVCBS6VM7UFJJTU9SU0tJWTpVTktOT1dOOlJVLVBSUgorUlVTU0lBOktPTUk7UEVDSE9SU0tJWTpVTktOT1dOOlJVLVBDUgorUlVTU0lBOktBUkVMSUE7S0FMRVZBTFNLSVk6VU5LTk9XTjpSVS1LTEwKK1JVU1NJQTpBUktIQU5HRUxTS0HvQSBPQkxBU1QgUulTO0xFU0hVS09OU0tJWTpVTktOT1dOOlJVLUxTTgorUlVTU0lBOkFSS0hBTkdFTFNLQe9BIE9CTEFTVCBS6VM7UElORVpIU0tJWTpVTktOT1dOOlJVLVBOSAorUlVTU0lBOkFSS0hBTkdFTFNLQe9BIE9CTEFTVCBS6VM7U09MT1ZFVFNLSVk6VU5LTk9XTjpSVS1TTFQKK1JVU1NJQTpLT01JO1BFQ0hPUkE6VU5LTk9XTjpSVS1QQ0EKK1JVU1NJQTpLQVJFTElBO0tFTSc6VU5LTk9XTjpSVS1LRU0KK1JVU1NJQTpLQVJFTElBO0JFTE9NT1JTS0lZOlVOS05PV046UlUtQkxSCitSVVNTSUE6S09NSTtVRE9SU0tJWTpVTktOT1dOOlJVLVVEUworUlVTU0lBOkFSS0hBTkdFTFNLQe9BIE9CTEFTVCBS6VM7S0hPTE1PR09SU0tJWTpVTktOT1dOOlJVLUtIUgorUlVTU0lBOktBUkVMSUE7S09TVE9NVUtTSEE6VU5LTk9XTjpSVS1LU0sKK1JVU1NJQTpBUktIQU5HRUxTS0HvQSBPQkxBU1QgUulTO0FSS0hBTkdFTFNLOlVOS05PV046UlUtQVJHCitSVVNTSUE6QVJLSEFOR0VMU0tB70EgT0JMQVNUIFLpUztTRVZFUk9EVklOU0s6VU5LTk9XTjpSVS1TVkQKK1JVU1NJQTpBUktIQU5HRUxTS0HvQSBPQkxBU1QgUulTO09ORVpIU0tJWTpVTktOT1dOOlJVLU9OUworUlVTU0lBOktPTUk7S05ZQVpIUE9HT1NUU0tJWTpVTktOT1dOOlJVLUtORworUlVTU0lBOktBUkVMSUE7TVVZRVpFUlNLSVk6VU5LTk9XTjpSVS1NWVIKK1JVU1NJQTpLT01JO1NPU05PR09SU0tJWTpVTktOT1dOOlJVLVNTUgorUlVTU0lBOktPTUk7VUtIVEE6VU5LTk9XTjpSVS1VS1QKK1JVU1NJQTpBUktIQU5HRUxTS0HvQSBPQkxBU1QgUulTO05PVk9EVklOU0s6VU5LTk9XTjpSVS1OVlYKK1JVU1NJQTpLQVJFTElBO1NFR0VaSFNLSVk6VU5LTk9XTjpSVS1TR0gKK1JVU1NJQTpBUktIQU5HRUxTS0HvQSBPQkxBU1QgUulTO1BMRVNFVFNLSVk6VU5LTk9XTjpSVS1QTFQKK1JVU1NJQTpBUktIQU5HRUxTS0HvQSBPQkxBU1QgUulTO09ORUdBOlVOS05PV046UlUtT05HCitSVVNTSUE6S09NSTtWVUtUWUxTS0lZOlVOS05PV046UlUtVktMCitSVVNTSUE6S0FSRUxJQTtNRURWRVpIWUVHT1JTS0lZOlVOS05PV046UlUtTURHCitSVVNTSUE6S0FSRUxJQTtTRUdFWkhBOlVOS05PV046UlUtU0daCitSVVNTSUE6S09NSTtUUk9JVFNLTy1QRUNIT1JTS0lZOlVOS05PV046UlUtVFJDCitSVVNTSUE6QVJLSEFOR0VMU0tB70EgT0JMQVNUIFLpUztWSU5PR1JBRE9WU0tJWTpVTktOT1dOOlJVLVZORAorUlVTU0lBOktPTUk7U09TTk9HT1JTSzpVTktOT1dOOlJVLVNTRworUlVTU0lBOkFSS0hBTkdFTFNLQe9BIE9CTEFTVCBS6VM7VkVSS0hORVRPWUVNU0tJWTpVTktOT1dOOlJVLVZSWQorUlVTU0lBOktBUkVMSUE7U1VPWUFSVlNLSVk6VU5LTk9XTjpSVS1TT1YKK1JVU1NJQTpLQVJFTElBO0tPTkRPUE9aSFNLSVk6VU5LTk9XTjpSVS1LTloKK1JVU1NJQTpLT01JO0tPUlRLRVJPU1NLSVk6VU5LTk9XTjpSVS1LUlMKK1JVU1NJQTpBUktIQU5HRUxTS0HvQSBPQkxBU1QgUulTO0xFTlNLSVk6VU5LTk9XTjpSVS1MTksKK1JVU1NJQTpLQVJFTElBO1BVRE9aSFNLSVk6VU5LTk9XTjpSVS1QREgKK1JVU1NJQTpLT01JO1VTVC1WWU1TS0lZOlVOS05PV046UlUtVVNNCitSVVNTSUE6S09NSTtVU1QtS1VMT01TS0lZOlVOS05PV046UlUtVVNLCitSVVNTSUE6QVJLSEFOR0VMU0tB70EgT0JMQVNUIFLpUztTSEVOS1VSU0tJWTpVTktOT1dOOlJVLVNIUgorUlVTU0lBOkFSS0hBTkdFTFNLQe9BIE9CTEFTVCBS6VM7TllBTkRPTVNLSVk6VU5LTk9XTjpSVS1OWU0KK1JVU1NJQTpBUktIQU5HRUxTS0HvQSBPQkxBU1QgUulTO0tSQVNOT0JPUlNLSVk6VU5LTk9XTjpSVS1LUlIKK1JVU1NJQTpLQVJFTElBO0tPTkRPUE9HQTpVTktOT1dOOlJVLUtOUAorUlVTU0lBOktBUkVMSUE7U09SVEFWQUxBOlVOS05PV046UlUtU1JWCitSVVNTSUE6S09NSTtTWUtUWVZESU5TS0lZOlVOS05PV046UlUtU1lOCitSVVNTSUE6QVJLSEFOR0VMU0tB70EgT0JMQVNUIFLpUztLQVJHQVBPTFNLSVk6VU5LTk9XTjpSVS1LUkwKK1JVU1NJQTpLQVJFTElBO1BSWUFaSElOU0tJWTpVTktOT1dOOlJVLVBSTgorUlVTU0lBOktBUkVMSUE7UFJJT05FWkhTS0lZOlVOS05PV046UlUtUFJaCitSVVNTSUE6QVJLSEFOR0VMU0tB70EgT0JMQVNUIFLpUztWRUxTS0lZOlVOS05PV046UlUtVkxLCitSVVNTSUE6S0FSRUxJQTtQSVRLWUFSQU5UU0tJWTpVTktOT1dOOlJVLVBUTgorUlVTU0lBOkFSS0hBTkdFTFNLQe9BIE9CTEFTVCBS6VM7VVNUWUFOU0tJWTpVTktOT1dOOlJVLVVTSQorUlVTU0lBOkFSS0hBTkdFTFNLQe9BIE9CTEFTVCBS6VM7S09UTEFTU0tJWTpVTktOT1dOOlJVLUtUUworUlVTU0lBOktPTUk7U1lLVFlWS1ZBUjpVTktOT1dOOlJVLVNZVgorUlVTU0lBOktBUkVMSUE7UEVUUk9aQVZPRFNLOlVOS05PV046UlUtUFRWCitSVVNTSUE6S0FSRUxJQTtMQUtIREVOUE9LSFNLSVk6VU5LTk9XTjpSVS1MS0sKK1JVU1NJQTpBUktIQU5HRUxTS0HvQSBPQkxBU1QgUulTO1ZJTEVHT0RTS0lZOlVOS05PV046UlUtVkxECitSVVNTSUE6S0FSRUxJQTtQWVRLSUFSQU5UQTpVTktOT1dOOlJVLVBZUgorUlVTU0lBOlZPTE9HT0RTS0HvQSBPQkxBU1Q7VllURUdPUlNLSVk6VU5LTk9XTjpSVS1WWVIKK1JVU1NJQTpLT01JO1NZU09MU0tJWTpVTktOT1dOOlJVLVNZUworUlVTU0lBOktBUkVMSUE7T0xPTkVUU0tJWTpVTktOT1dOOlJVLU9MVAorUlVTU0lBOkFSS0hBTkdFTFNLQe9BIE9CTEFTVCBS6VM7S09OT1NIU0tJWTpVTktOT1dOOlJVLUtOSAorUlVTU0lBOkFSS0hBTkdFTFNLQe9BIE9CTEFTVCBS6VM7S09SWUFaSE1BOlVOS05PV046UlUtS1JaCitSVVNTSUE6QVJLSEFOR0VMU0tB70EgT0JMQVNUIFLpUztLT1RMQVM6VU5LTk9XTjpSVS1LT0wKK1JVU1NJQTpWT0xPR09EU0tB70EgT0JMQVNUO1ZFTElLT1VTVFlVR1NLSVk6VU5LTk9XTjpSVS1WTFQKK1JVU1NJQTpLT01JO1BSSUxVWlNLSVk6VU5LTk9XTjpSVS1QUlMKK1JVU1NJQTpWT0xPR09EU0tB70EgT0JMQVNUO1RBUk5PR1NLSVk6VU5LTk9XTjpSVS1UUkcKK1JVU1NJQTpLT01JO0tPWUdPUk9EU0tJWTpVTktOT1dOOlJVLUtZRAorUlVTU0lBOlZPTE9HT0RTS0HvQSBPQkxBU1Q7TllVS1NFTlNLSVk6VU5LTk9XTjpSVS1OWU4KK1JVU1NJQTpWT0xPR09EU0tB70EgT0JMQVNUO1ZFUktIT1ZBWkhTS0lZOlVOS05PV046UlUtVlJaCitSVVNTSUE6Vk9MT0dPRFNLQe9BIE9CTEFTVDtLSVJJTExPVlNLSVk6VU5LTk9XTjpSVS1LUksKK1JVU1NJQTpWT0xPR09EU0tB70EgT0JMQVNUO1ZFTElLSVkgVVNUWVVHOlVOS05PV046UlUtVkwgCitSVVNTSUE6Vk9MT0dPRFNLQe9BIE9CTEFTVDtWT1pIRUdPRFNLSVk6VU5LTk9XTjpSVS1WWkQKK1JVU1NJQTpWT0xPR09EU0tB70EgT0JMQVNUO1ZBU0hLSU5TS0lZOlVOS05PV046UlUtVlNOCitSVVNTSUE6Vk9MT0dPRFNLQe9BIE9CTEFTVDtCRUxPWkVSU0tJWTpVTktOT1dOOlJVLUJMUworUlVTU0lBOlZPTE9HT0RTS0HvQSBPQkxBU1Q7QkFCQVlFVlNLSVk6VU5LTk9XTjpSVS1CQlYKK1JVU1NJQTpWT0xPR09EU0tB70EgT0JMQVNUO0tJQ0hNRU5HU0tPIEdPUk9ERVRTS0lZOlVOS05PV046UlUtS0NHCitSVVNTSUE6Vk9MT0dPRFNLQe9BIE9CTEFTVDtLSEFST1ZTS0lZOlVOS05PV046UlUtS0hWCitSVVNTSUE6Vk9MT0dPRFNLQe9BIE9CTEFTVDtUT1RFTVNLSVk6VU5LTk9XTjpSVS1UVFMKK1JVU1NJQTpWT0xPR09EU0tB70EgT0JMQVNUO1NZQU1aSEVOU0tJWTpVTktOT1dOOlJVLVNZSworUlVTU0lBOlZPTE9HT0RTS0HvQSBPQkxBU1Q7VUNULUtVQklOU0tJWTpVTktOT1dOOlJVLVVDTgorUlVTU0lBOlZPTE9HT0RTS0HvQSBPQkxBU1Q7QkFCVVNIS0lOU0tJWTpVTktOT1dOOlJVLUJCTgorUlVTU0lBOlZPTE9HT0RTS0HvQSBPQkxBU1Q7TklLT0xTS0lZOlVOS05PV046UlUtTktTCitSVVNTSUE6Vk9MT0dPRFNLQe9BIE9CTEFTVDtWT0xPR09EU0tJWTpVTktOT1dOOlJVLVZMUworUlVTU0lBOlZPTE9HT0RTS0HvQSBPQkxBU1Q7U09LT0xTS0lZOlVOS05PV046UlUtU0tTCitSVVNTSUE6Vk9MT0dPRFNLQe9BIE9CTEFTVDtLQURVWVNLSVk6VU5LTk9XTjpSVS1LRFMKK1JVU1NJQTpWT0xPR09EU0tB70EgT0JMQVNUO0NIRVJFUE9WRVRTS0lZOlVOS05PV046UlUtQ0hWCitSVVNTSUE6Vk9MT0dPRFNLQe9BIE9CTEFTVDtTSEVLU05JTlNLSVk6VU5LTk9XTjpSVS1TSE4KK1JVU1NJQTpWT0xPR09EU0tB70EgT0JMQVNUO01FWkhEVVJFQ0hFTlNLSVk6VU5LTk9XTjpSVS1NWkMKK1JVU1NJQTpWT0xPR09EU0tB70EgT0JMQVNUO1NPS09MOlVOS05PV046UlUtU09MCitSVVNTSUE6Vk9MT0dPRFNLQe9BIE9CTEFTVDtDSEFHT0RFU0NIRU5TS0lZOlVOS05PV046UlUtQ0hDCitSVVNTSUE6Vk9MT0dPRFNLQe9BIE9CTEFTVDtWT0xPR0RBOlVOS05PV046UlUtVkxHCitSVVNTSUE6Vk9MT0dPRFNLQe9BIE9CTEFTVDtVU1RZVVpIRU5TS0lZOlVOS05PV046UlUtVVNZCitSVVNTSUE6Vk9MT0dPRFNLQe9BIE9CTEFTVDtDSEVSRVBPVkVUWjpVTktOT1dOOlJVLUNIRQorUlVTU0lBOlZPTE9HT0RTS0HvQSBPQkxBU1Q7R1JZQVpPVkVUU0tJWTpVTktOT1dOOlJVLUdSVAorUlVTU0lBOlRBTUJPVlNLQe9BIE9CTEFTVDtNT1JTSEFOU0tJWTpVTktOT1dOOlJVLU1SUworUlVTU0lBOkxJUEVUU0tB70EgT0JMQVNUO0NIQVBMWUdJTlNLSVk6VU5LTk9XTjpSVS1DSE4KK1JVU1NJQTpMSVBFVFNLQe9BIE9CTEFTVDtEQU5LT1ZTS0lZOlVOS05PV046UlUtRE5WCitSVVNTSUE6VEFNQk9WU0tB70EgT0JMQVNUO1NUQVJPWVVSWUVWU0tJWTpVTktOT1dOOlJVLVNUWQorUlVTU0lBOlRBTUJPVlNLQe9BIE9CTEFTVDtTT1NOT1ZTS0lZOlVOS05PV046UlUtU1NWCitSVVNTSUE6VEFNQk9WU0tB70EgT0JMQVNUO01PUlNIQU5TSzpVTktOT1dOOlJVLU1SSworUlVTU0lBOkxJUEVUU0tB70EgT0JMQVNUO0xFViAtVE9MU1RPVlNLSVk6VU5LTk9XTjpSVS1MVlMKK1JVU1NJQTpUQU1CT1ZTS0HvQSBPQkxBU1Q7UEVSVk9NQVlTS0lZOlVOS05PV046UlUtUFJZCitSVVNTSUE6VEFNQk9WU0tB70EgT0JMQVNUO1BJQ0hBWUVWU0tJWTpVTktOT1dOOlJVLVBDVgorUlVTU0lBOkxJUEVUU0tB70EgT0JMQVNUO0RBTktPVjpVTktOT1dOOlJVLURBSworUlVTU0lBOlRBTUJPVlNLQe9BIE9CTEFTVDtNSUNIVVJJTlNLSVk6VU5LTk9XTjpSVS1NQ04KK1JVU1NJQTpUQU1CT1ZTS0HvQSBPQkxBU1Q7TklLSUZPUk9WU0tJWTpVTktOT1dOOlJVLU5LVgorUlVTU0lBOkxJUEVUU0tB70EgT0JMQVNUO0xFQkVEWUFOU0tJWTpVTktOT1dOOlJVLUxCTgorUlVTU0lBOlRBTUJPVlNLQe9BIE9CTEFTVDtCT05EQVJTS0lZOlVOS05PV046UlUtQk5SCitSVVNTSUE6VEFNQk9WU0tB70EgT0JMQVNUO0dBVlJJTE9WU0tJWTpVTktOT1dOOlJVLUdWVgorUlVTU0lBOlRBTUJPVlNLQe9BIE9CTEFTVDtUQU1CT1ZTS0lZOlVOS05PV046UlUtVE1WCitSVVNTSUE6TElQRVRTS0HvQSBPQkxBU1Q7S1JBU05JTlNLSVk6VU5LTk9XTjpSVS1LUk4KK1JVU1NJQTpMSVBFVFNLQe9BIE9CTEFTVDtET0JST1ZTS0lZOlVOS05PV046UlUtREJWCitSVVNTSUE6TElQRVRTS0HvQSBPQkxBU1Q7U1RBTk9WTFlBTlNLSVk6VU5LTk9XTjpSVS1TVEEKK1JVU1NJQTpUQU1CT1ZTS0HvQSBPQkxBU1Q7TUlDSFVSSU5TSzpVTktOT1dOOlJVLU1DUgorUlVTU0lBOlRBTUJPVlNLQe9BIE9CTEFTVDtLSVJTQU5PVlNLSVk6VU5LTk9XTjpSVS1LUkkKK1JVU1NJQTpUQU1CT1ZTS0HvQSBPQkxBU1Q7UkFTU0tBWk9WU0tJWTpVTktOT1dOOlJVLVJTVgorUlVTU0lBOkxJUEVUU0tB70EgT0JMQVNUO0laTUFMS09WU0tJWTpVTktOT1dOOlJVLUlaVgorUlVTU0lBOlRBTUJPVlNLQe9BIE9CTEFTVDtVTUVUU0tJWTpVTktOT1dOOlJVLVVNUworUlVTU0lBOkxJUEVUU0tB70EgT0JMQVNUO0xJUEVUU0tJWTpVTktOT1dOOlJVLUxQUworUlVTU0lBOlRBTUJPVlNLQe9BIE9CTEFTVDtQRVRST1ZTS0lZOlVOS05PV046UlUtUFRTCitSVVNTSUE6TElQRVRTS0HvQSBPQkxBU1Q7WkFET05TS0lZOlVOS05PV046UlUtWkRTCitSVVNTSUE6TElQRVRTS0HvQSBPQkxBU1Q7WUVMRVRTS0lZOlVOS05PV046UlUtWUxTCitSVVNTSUE6VEFNQk9WU0tB70EgT0JMQVNUO1RBTUJPVjpVTktOT1dOOlJVLVRBQgorUlVTU0lBOkxJUEVUU0tB70EgT0JMQVNUO0xJUEVUU0s6VU5LTk9XTjpSVS1MUFQKK1JVU1NJQTpMSVBFVFNLQe9BIE9CTEFTVDtHUllBWklOU0tJWTpVTktOT1dOOlJVLUdSTgorUlVTU0lBOlRBTUJPVlNLQe9BIE9CTEFTVDtSQVNTS0FaT1ZPOlVOS05PV046UlUtUlNaCitSVVNTSUE6VEFNQk9WU0tB70EgT0JMQVNUO0tJUlNBTk9WTzpVTktOT1dOOlJVLUtSTworUlVTU0lBOkxJUEVUU0tB70EgT0JMQVNUO0VMRVRaOlVOS05PV046UlUtRUxUCitSVVNTSUE6VEFNQk9WU0tB70EgT0JMQVNUO0tPVE9WU0s6VU5LTk9XTjpSVS1LVFYKK1JVU1NJQTpUQU1CT1ZTS0HvQSBPQkxBU1Q7Wk5BTUVOU0tJWTpVTktOT1dOOlJVLVpOTgorUlVTU0lBOlRBTUJPVlNLQe9BIE9CTEFTVDtJTlpIQVZJTlNLSVk6VU5LTk9XTjpSVS1JTk4KK1JVU1NJQTpMSVBFVFNLQe9BIE9CTEFTVDtHUllBWlk6VU5LTk9XTjpSVS1HUloKK1JVU1NJQTpMSVBFVFNLQe9BIE9CTEFTVDtET0xHT1JVS09WU0tJWTpVTktOT1dOOlJVLURMSworUlVTU0lBOkxJUEVUU0tB70EgT0JMQVNUO0RPQlJJTlNLSVk6VU5LTk9XTjpSVS1EQk4KK1JVU1NJQTpUQU1CT1ZTS0HvQSBPQkxBU1Q7TU9SRE9WU0tJWTpVTktOT1dOOlJVLU1SVgorUlVTU0lBOlRBTUJPVlNLQe9BIE9CTEFTVDtTQU1QVVJTS0lZOlVOS05PV046UlUtU01SCitSVVNTSUE6VEFNQk9WU0tB70EgT0JMQVNUO1JaSEFLU0lOU0tJWTpVTktOT1dOOlJVLVJaTgorUlVTU0lBOktPVVJTS0HvQSBPQkxBU1Q7WkhFTEVaTk9HT1JTS0lZOlVOS05PV046UlUtWkhHCitSVVNTSUE6S09VUlNLQe9BIE9CTEFTVDtQT05ZUk9WU0tJWTpVTktOT1dOOlJVLVBOVgorUlVTU0lBOktPVVJTS0HvQSBPQkxBU1Q7RE1JVFJJWUVWU0tJWTpVTktOT1dOOlJVLURNVgorUlVTU0lBOkxJUEVUU0tB70EgT0JMQVNUO1VTTUFOU0tJWTpVTktOT1dOOlJVLVVTIAorUlVTU0lBOkxJUEVUU0tB70EgT0JMQVNUO0tITEVWRU5TS0lZOlVOS05PV046UlUtS0hOCitSVVNTSUE6S09VUlNLQe9BIE9CTEFTVDtGQVRFWkhTS0lZOlVOS05PV046UlUtRlRICitSVVNTSUE6TElQRVRTS0HvQSBPQkxBU1Q7VEVSQlVOU0tJWTpVTktOT1dOOlJVLVRSTgorUlVTU0lBOlRBTUJPVlNLQe9BIE9CTEFTVDtUT0tBUkVWU0tJWTpVTktOT1dOOlJVLVRLVgorUlVTU0lBOkxJUEVUU0tB70EgT0JMQVNUO1ZPTE9WU0tJWTpVTktOT1dOOlJVLVZMSQorUlVTU0lBOktPVVJTS0HvQSBPQkxBU1Q7Wk9MT1RVS0hJTlNLSVk6VU5LTk9XTjpSVS1aTEgKK1JVU1NJQTpUQU1CT1ZTS0HvQSBPQkxBU1Q7VVZBUk9WU0tJWTpVTktOT1dOOlJVLVVWVgorUlVTU0lBOktPVVJTS0HvQSBPQkxBU1Q7U0NISUdST1ZTS0lZOlVOS05PV046UlUtU0NWCitSVVNTSUE6Vk9ST05FSlNLQe9BIE9CTEFTVDtSQU1PTlNLSVk6VU5LTk9XTjpSVS1STVMKK1JVU1NJQTpUQU1CT1ZTS0HvQSBPQkxBU1Q7TVVDSEtBUFNLSVk6VU5LTk9XTjpSVS1NQ1AKK1JVU1NJQTpWT1JPTkVKU0tB70EgT0JMQVNUO1NFTUlMVUtTS0lZOlVOS05PV046UlUtU01LCitSVVNTSUE6VEFNQk9WU0tB70EgT0JMQVNUO1pIRVJERVZTS0lZOlVOS05PV046UlUtWkhWCitSVVNTSUE6S09VUlNLQe9BIE9CTEFTVDtDSEVSRU1JU0lOT1ZTS0lZOlVOS05PV046UlUtQ0hPCitSVVNTSUE6S09VUlNLQe9BIE9CTEFTVDtLSE9NVVRPVlNLSVk6VU5LTk9XTjpSVS1LSFMKK1JVU1NJQTpUQU1CT1ZTS0HvQSBPQkxBU1Q7VVZBUk9WTzpVTktOT1dOOlJVLVVWTworUlVTU0lBOktPVVJTS0HvQSBPQkxBU1Q7S09OWVNIRVZTS0lZOlVOS05PV046UlUtS05WCitSVVNTSUE6S09VUlNLQe9BIE9CTEFTVDtTT1ZFVFNLSVk6VU5LTk9XTjpSVS1TVlMKK1JVU1NJQTpLT1VSU0tB70EgT0JMQVNUO0tBU1RPUkVOU0tJWTpVTktOT1dOOlJVLUtTTgorUlVTU0lBOlZPUk9ORUpTS0HvQSBPQkxBU1Q7VkVSS0hORUtIQVZTS0lZOlVOS05PV046UlUtVlJICitSVVNTSUE6Vk9ST05FSlNLQe9BIE9CTEFTVDtFUlRJTFNLSVk6VU5LTk9XTjpSVS1FUlMKK1JVU1NJQTpLT1VSU0tB70EgT0JMQVNUO0tVUlNLSVk6VU5LTk9XTjpSVS1LUlkKK1JVU1NJQTpLT1VSU0tB70EgT0JMQVNUO1RTQ0hJR1JZOlVOS05PV046UlUtVFNHCitSVVNTSUE6S09VUlNLQe9BIE9CTEFTVDtLVVJDSEFUT1ZTS0lZOlVOS05PV046UlUtS1IgCitSVVNTSUE6Vk9ST05FSlNLQe9BIE9CTEFTVDtWT1JPTkVaSDpVTktOT1dOOlJVLVZSTgorUlVTU0lBOktPVVJTS0HvQSBPQkxBU1Q7T0tUWUFCUlNLSVk6VU5LTk9XTjpSVS1PS1IKK1JVU1NJQTpWT1JPTkVKU0tB70EgT0JMQVNUO05PVk9VU01BTlNLSVk6VU5LTk9XTjpSVS1OVk4KK1JVU1NJQTpWT1JPTkVKU0tB70EgT0JMQVNUO1BBTklOU0tJWTpVTktOT1dOOlJVLVBOUworUlVTU0lBOktPVVJTS0HvQSBPQkxBU1Q7TCdHT1ZTS1k6VU5LTk9XTjpSVS1MR1YKK1JVU1NJQTpLT1VSU0tB70EgT0JMQVNUO0tVUlNLOlVOS05PV046UlUtS1VTCitSVVNTSUE6S09VUlNLQe9BIE9CTEFTVDtUSU1TS0lZOlVOS05PV046UlUtVE1LCitSVVNTSUE6S09VUlNLQe9BIE9CTEFTVDtSWUxTS0lZOlVOS05PV046UlUtUllLCitSVVNTSUE6Vk9ST05FSlNLQe9BIE9CTEFTVDtOSVpITkVERVZJVFNLSVk6VU5LTk9XTjpSVS1OWlYKK1JVU1NJQTpWT1JPTkVKU0tB70EgT0JMQVNUO1RFUk5PVlNLSVk6VU5LTk9XTjpSVS1UUlYKK1JVU1NJQTpWT1JPTkVKU0tB70EgT0JMQVNUO0dSSUJBTk9WU0tJWTpVTktOT1dOOlJVLUdSVgorUlVTU0lBOlZPUk9ORUpTS0HvQSBPQkxBU1Q7Qk9SSVNPR0xFQlNLSVk6VU5LTk9XTjpSVS1CUkwKK1JVU1NJQTpWT1JPTkVKU0tB70EgT0JMQVNUO0tIT0tIT0xTS0lZOlVOS05PV046UlUtS0hMCitSVVNTSUE6S09VUlNLQe9BIE9CTEFTVDtMR09WOlVOS05PV046UlUtTEcgCitSVVNTSUE6Vk9ST05FSlNLQe9BIE9CTEFTVDtBTk5JTlNLSVk6VU5LTk9XTjpSVS1BTlMKK1JVU1NJQTpLT1VSU0tB70EgT0JMQVNUO0tVUkNIQVRPVjpVTktOT1dOOlJVLUtSVAorUlVTU0lBOktPVVJTS0HvQSBPQkxBU1Q7U09MTlRTRVZTS0lZOlVOS05PV046UlUtU0xWCitSVVNTSUE6S09VUlNLQe9BIE9CTEFTVDtHT1JTSEVDSEVOU0tJWTpVTktOT1dOOlJVLUdSSAorUlVTU0lBOktPVVJTS0HvQSBPQkxBU1Q7TUVEVkVOU0tJWTpVTktOT1dOOlJVLU1ETgorUlVTU0lBOktPVVJTS0HvQSBPQkxBU1Q7TUFOVFVST1ZTS0lZOlVOS05PV046UlUtTU5WCitSVVNTSUE6S09VUlNLQe9BIE9CTEFTVDtCT0xTSEVTT0xEQVRTS0lZOlVOS05PV046UlUtQkxMCitSVVNTSUE6S09VUlNLQe9BIE9CTEFTVDtLT1JFTkVWU0tJWTpVTktOT1dOOlJVLUtSMQorUlVTU0lBOktPVVJTS0HvQSBPQkxBU1Q7R0xVU0hLT1ZTS0lZOlVOS05PV046UlUtR0xWCitSVVNTSUE6Vk9ST05FSlNLQe9BIE9CTEFTVDtLQVNISVJTS0lZOlVOS05PV046UlUtS1NSCitSVVNTSUE6Vk9ST05FSlNLQe9BIE9CTEFTVDtQT1ZPUklOU0tJWTpVTktOT1dOOlJVLVBWTgorUlVTU0lBOktPVVJTS0HvQSBPQkxBU1Q7U1VEWkhBTlNLSVk6VU5LTk9XTjpSVS1TRE4KK1JVU1NJQTpCRUxHT1JPRFNLQe9BIE9CTEFTVDtHVUJLSU5TS0lZOlVOS05PV046UlUtR0JOCitSVVNTSUE6QkVMR09ST0RTS0HvQSBPQkxBU1Q7U1RBUk9PU0tPTFNLSVk6VU5LTk9XTjpSVS1TVEsKK1JVU1NJQTpWT1JPTkVKU0tB70EgT0JMQVNUO05PVk9LSE9QRVJTS0lZOlVOS05PV046UlUtTlZQCitSVVNTSUE6Vk9ST05FSlNLQe9BIE9CTEFTVDtCT1JJU09HTEVCU0s6VU5LTk9XTjpSVS1CUkcKK1JVU1NJQTpWT1JPTkVKU0tB70EgT0JMQVNUO0JPQlJPVlNLSVk6VU5LTk9XTjpSVS1CQlMKK1JVU1NJQTpLT1VSU0tB70EgT0JMQVNUO09CT1lBTlNLSVk6VU5LTk9XTjpSVS1PQk4KK1JVU1NJQTpLT1VSU0tB70EgT0JMQVNUO1BSSVNURU5TS0lZOlVOS05PV046UlUtUFJLCitSVVNTSUE6Vk9ST05FSlNLQe9BIE9CTEFTVDtUQUxPVlNLSVk6VU5LTk9XTjpSVS1UTFMKK1JVU1NJQTpCRUxHT1JPRFNLQe9BIE9CTEFTVDtTVEFSWUkgT1NLT0w6VU5LTk9XTjpSVS1TVCAKK1JVU1NJQTpWT1JPTkVKU0tB70EgT0JMQVNUO1JFUElZRVZLQTpVTktOT1dOOlJVLVJQVgorUlVTU0lBOkJFTEdPUk9EU0tB70EgT0JMQVNUO0dVQktJTjpVTktOT1dOOlJVLUdVSworUlVTU0lBOlZPUk9ORUpTS0HvQSBPQkxBU1Q7TElTS0lOU0tJWTpVTktOT1dOOlJVLUxTUworUlVTU0lBOktPVVJTS0HvQSBPQkxBU1Q7QkVMT1ZTS0lZOlVOS05PV046UlUtQkxLCitSVVNTSUE6Vk9ST05FSlNLQe9BIE9CTEFTVDtPU1RST0dPWkhTS0lZOlVOS05PV046UlUtT1NaCitSVVNTSUE6QkVMR09ST0RTS0HvQSBPQkxBU1Q7UFJPS0hPUk9WU0tJWTpVTktOT1dOOlJVLVBSVgorUlVTU0lBOlZPUk9ORUpTS0HvQSBPQkxBU1Q7UE9WT1JJTk86VU5LTk9XTjpSVS1QVlIKK1JVU1NJQTpCRUxHT1JPRFNLQe9BIE9CTEFTVDtJVk5ZQU5TS0lZOlVOS05PV046UlUtSVZOCitSVVNTSUE6QkVMR09ST0RTS0HvQSBPQkxBU1Q7Q0hFUk5ZQU5TS0lZOlVOS05PV046UlUtQ0hTCitSVVNTSUE6Vk9ST05FSlNLQe9BIE9CTEFTVDtMSVNLSTpVTktOT1dOOlJVLUxJSworUlVTU0lBOkJFTEdPUk9EU0tB70EgT0JMQVNUO1JBS0lUWUFOU0tJWTpVTktOT1dOOlJVLVJLTgorUlVTU0lBOlZPUk9ORUpTS0HvQSBPQkxBU1Q7QlVUVVJMSU5PVlNLSVk6VU5LTk9XTjpSVS1CVE4KK1JVU1NJQTpCRUxHT1JPRFNLQe9BIE9CTEFTVDtLT1JPQ0hBTlNLSVk6VU5LTk9XTjpSVS1LUjIKK1JVU1NJQTpCRUxHT1JPRFNLQe9BIE9CTEFTVDtLUkFTTk9ZQVJVWlNIU0tZOlVOS05PV046UlUtS1JVCitSVVNTSUE6QkVMR09ST0RTS0HvQSBPQkxBU1Q7WUFLT1ZMRVZTS0lZOlVOS05PV046UlUtWUtWCitSVVNTSUE6QkVMR09ST0RTS0HvQSBPQkxBU1Q7Tk9WT09TS09MU0tJWTpVTktOT1dOOlJVLU5WTAorUlVTU0lBOlZPUk9ORUpTS0HvQSBPQkxBU1Q7T1NUUk9HT1pIU0s6VU5LTk9XTjpSVS1PU0gKK1JVU1NJQTpCRUxHT1JPRFNLQe9BIE9CTEFTVDtLUkFTTk9HVkFSREVZU0tJWTpVTktOT1dOOlJVLUtSRAorUlVTU0lBOlZPUk9ORUpTS0HvQSBPQkxBU1Q7Vk9ST0JZT1ZTS0lZOlVOS05PV046UlUtVlJWCitSVVNTSUE6Vk9ST05FSlNLQe9BIE9CTEFTVDtLQU1FTlNLSVk6VU5LTk9XTjpSVS1LTVMKK1JVU1NJQTpWT1JPTkVKU0tB70EgT0JMQVNUO1BBVkxPVlNLSVk6VU5LTk9XTjpSVS1QVlYKK1JVU1NJQTpCRUxHT1JPRFNLQe9BIE9CTEFTVDtCRUxHT1JPRFNLSVk6VU5LTk9XTjpSVS1CTEQKK1JVU1NJQTpCRUxHT1JPRFNLQe9BIE9CTEFTVDtCT1JJU09WU0tJWTpVTktOT1dOOlJVLUJSVgorUlVTU0lBOlZPUk9ORUpTS0HvQSBPQkxBU1Q7UE9ER09SRU5TS0lZOlVOS05PV046UlUtUEROCitSVVNTSUE6QkVMR09ST0RTS0HvQSBPQkxBU1Q7QUxFS1NFWUVWU0tJWTpVTktOT1dOOlJVLUFMVgorUlVTU0lBOkJFTEdPUk9EU0tB70EgT0JMQVNUO1NIRUJFS0lOU0tJWTpVTktOT1dOOlJVLVNIUworUlVTU0lBOkJFTEdPUk9EU0tB70EgT0JMQVNUO0dSQUlWT1JPTlNLSVk6VU5LTk9XTjpSVS1HUlMKK1JVU1NJQTpWT1JPTkVKU0tB70EgT0JMQVNUO0tBTEFDSEVZRVZTS0lZOlVOS05PV046UlUtS0xZCitSVVNTSUE6QkVMR09ST0RTS0HvQSBPQkxBU1Q7QUxFS1NFRVZLQTpVTktOT1dOOlJVLUFMRQorUlVTU0lBOkJFTEdPUk9EU0tB70EgT0JMQVNUO0JFTEdPUk9EOlVOS05PV046UlUtQkxPCitSVVNTSUE6QkVMR09ST0RTS0HvQSBPQkxBU1Q7Vk9MT0tPTk9WU0tJWTpVTktOT1dOOlJVLVZMVgorUlVTU0lBOlZPUk9ORUpTS0HvQSBPQkxBU1Q7T0xLSE9WQVRTS0lZOlVOS05PV046UlUtT0xTCitSVVNTSUE6Vk9ST05FSlNLQe9BIE9CTEFTVDtWRVJLSE5FTUFNT05TS0lZOlVOS05PV046UlUtVlJNCitSVVNTSUE6QkVMR09ST0RTS0HvQSBPQkxBU1Q7U0hFQkVLSU5POlVOS05PV046UlUtU0hLCitSVVNTSUE6QkVMR09ST0RTS0HvQSBPQkxBU1Q7VkFMVVlTS0lZOlVOS05PV046UlUtVkxZCitSVVNTSUE6Vk9ST05FSlNLQe9BIE9CTEFTVDtST1NTT1NIQU5TS0lZOlVOS05PV046UlUtUlNOCitSVVNTSUE6QkVMR09ST0RTS0HvQSBPQkxBU1Q7VkVZREVMRVZTS0lZOlVOS05PV046UlUtVllWCitSVVNTSUE6Vk9ST05FSlNLQe9BIE9CTEFTVDtQRVRST1BBVkxPVlNLSVk6VU5LTk9XTjpSVS1QVEwKK1JVU1NJQTpCRUxHT1JPRFNLQe9BIE9CTEFTVDtST1ZFTlNLSVk6VU5LTk9XTjpSVS1SVlMKK1JVU1NJQTpWT1JPTkVKU0tB70EgT0JMQVNUO1JPU1NPU0g6VU5LTk9XTjpSVS1SU1MKK1JVU1NJQTpCRUxHT1JPRFNLQe9BIE9CTEFTVDtWQUxVSUtZOlVOS05PV046UlUtVkwxCitSVVNTSUE6Vk9ST05FSlNLQe9BIE9CTEFTVDtCT0dVQ0hBUlNLSVk6VU5LTk9XTjpSVS1CR1IKK1JVU1NJQTpWT1JPTkVKU0tB70EgT0JMQVNUO0tBTlRFTUlST1ZTS0lZOlVOS05PV046UlUtS05SCitSVVNTSUE6WUFLT1VUSUEtU0FIQSBSRVNQT1VCTElLQTtBTkFCQVJTS0lZOlVOS05PV046UlUtQU5SCitSVVNTSUE6WUFLT1VUSUEtU0FIQSBSRVNQT1VCTElLQTtCVUxVTlNLSVk6VU5LTk9XTjpSVS1CTEkKK1JVU1NJQTpZQUtPVVRJQS1TQUhBIFJFU1BPVUJMSUtBO1VTVC1ZQU5TS0lZOlVOS05PV046UlUtVVMxCitSVVNTSUE6WUFLT1VUSUEtU0FIQSBSRVNQT1VCTElLQTtBTExBSUtIT1ZTS0lZOlVOS05PV046UlUtQUxTCitSVVNTSUE6WUFLT1VUSUEtU0FIQSBSRVNQT1VCTElLQTtPTEVORUtTS0lZOlVOS05PV046UlUtT0xLCitSVVNTSUE6WUFLT1VUSUEtU0FIQSBSRVNQT1VCTElLQTtOSVpITkVLT0xZTVNLSVk6VU5LTk9XTjpSVS1OWkwKK1JVU1NJQTpUQ0hPVUtPVFNLSSBOQVQuIE9LUk9VRztDSEFVTlNLSVk6VU5LTk9XTjpSVS1DSEsKK1JVU1NJQTpZQUtPVVRJQS1TQUhBIFJFU1BPVUJMSUtBO1ZFUktIT1lBTlNLSVk6VU5LTk9XTjpSVS1WUlMKK1JVU1NJQTpUQ0hPVUtPVFNLSSBOQVQuIE9LUk9VRztTSE1JRFRPVlNLSVk6VU5LTk9XTjpSVS1TSFYKK1JVU1NJQTpZQUtPVVRJQS1TQUhBIFJFU1BPVUJMSUtBO1NSRURORUtPTFlNU0tJWTpVTktOT1dOOlJVLVNSTAorUlVTU0lBOlRDSE9VS09UU0tJIE5BVC4gT0tST1VHO0JJTElCSU5TS0lZOlVOS05PV046UlUtQkxOCitSVVNTSUE6WUFLT1VUSUEtU0FIQSBSRVNQT1VCTElLQTtBQllJU0tJWTpVTktOT1dOOlJVLUFCUworUlVTU0lBOllBS09VVElBLVNBSEEgUkVTUE9VQkxJS0E7WkhJR0FOU0tJWTpVTktOT1dOOlJVLVpITgorUlVTU0lBOlRDSE9VS09UU0tJIE5BVC4gT0tST1VHO0lVTFRJTlNLSVk6VU5LTk9XTjpSVS1JTE4KK1JVU1NJQTpUQ0hPVUtPVFNLSSBOQVQuIE9LUk9VRztBTkFEWVJTS0lZOlVOS05PV046UlUtQU5LCitSVVNTSUE6WUFLT1VUSUEtU0FIQSBSRVNQT1VCTElLQTtNT01TS0lZOlVOS05PV046UlUtTU1LCitSVVNTSUE6WUFLT1VUSUEtU0FIQSBSRVNQT1VCTElLQTtWRVJLSEVLT0xZTVNLSVk6VU5LTk9XTjpSVS1WUkwKK1JVU1NJQTpUQ0hPVUtPVFNLSSBOQVQuIE9LUk9VRztDSFVLT1RTS0lZOlVOS05PV046UlUtQ0hUCitSVVNTSUE6WUFLT1VUSUEtU0FIQSBSRVNQT1VCTElLQTtWSUxZVVlTS0lZOlVOS05PV046UlUtVkwyCitSVVNTSUE6WUFLT1VUSUEtU0FIQSBSRVNQT1VCTElLQTtNSVJOSU5TS0lZOlVOS05PV046UlUtTVJJCitSVVNTSUE6VENIT1VLT1RTS0kgTkFULiBPS1JPVUc7UFJPVklERU5TS0lZOlVOS05PV046UlUtUFJJCitSVVNTSUE6WUFLT1VUSUEtU0FIQSBSRVNQT1VCTElLQTtWRVJLSE5FVklMWVVJU0tJWTpVTktOT1dOOlJVLVZSVQorUlVTU0lBOllBS09VVElBLVNBSEEgUkVTUE9VQkxJS0E7S09CWUFZU0tJWTpVTktOT1dOOlJVLUtCWQorUlVTU0lBOk1BR0FEQU5TS0HvQSBPQkxBU1QgUulTSUQ7U1JFRE5FS0FOU0tJWTpVTktOT1dOOlJVLVNSTgorUlVTU0lBOllBS09VVElBLVNBSEEgUkVTUE9VQkxJS0E7VE9NUE9OU0tJWTpVTktOT1dOOlJVLVRNTgorUlVTU0lBOllBS09VVElBLVNBSEEgUkVTUE9VQkxJS0E7TEVOSU5TS0lZOlVOS05PV046UlUtTE5TCitSVVNTSUE6TUFHQURBTlNLQe9BIE9CTEFTVCBS6VNJRDtTRVZFUk8tRVZFTlNLSVk6VU5LTk9XTjpSVS1TVlYKK1JVU1NJQTpZQUtPVVRJQS1TQUhBIFJFU1BPVUJMSUtBO09ZTVlBS09OU0tJWTpVTktOT1dOOlJVLU9ZTgorUlVTU0lBOk1BR0FEQU5TS0HvQSBPQkxBU1QgUulTSUQ7T01TVUtDSEFOU0tJWTpVTktOT1dOOlJVLU9NTgorUlVTU0lBOktPUklBS1NLSSBOQVRJT05BTCBPS1JPVUc7UEVOWkhJTlNLSVk6VU5LTk9XTjpSVS1QTk4KK1JVU1NJQTpUQ0hPVUtPVFNLSSBOQVQuIE9LUk9VRztBTkFEWVInOlVOS05PV046UlUtQU5ZCitSVVNTSUE6TUFHQURBTlNLQe9BIE9CTEFTVCBS6VNJRDtTVVNVTUFOU0tJWTpVTktOT1dOOlJVLVNTTgorUlVTU0lBOlRDSE9VS09UU0tJIE5BVC4gT0tST1VHO0JFUklOR09WU0tJWTpVTktOT1dOOlJVLUJSUworUlVTU0lBOllBS09VVElBLVNBSEEgUkVTUE9VQkxJS0E7U1VOVEFSU0tJWTpVTktOT1dOOlJVLVNOUgorUlVTU0lBOllBS09VVElBLVNBSEEgUkVTUE9VQkxJS0E7VVNULUFMREFOU0tJWTpVTktOT1dOOlJVLVVTMgorUlVTU0lBOk1BR0FEQU5TS0HvQSBPQkxBU1QgUulTSUQ7WUFHT0ROSU5TS0lZOlVOS05PV046UlUtWUdOCitSVVNTSUE6WUFLT1VUSUEtU0FIQSBSRVNQT1VCTElLQTtOQU1TS0lZOlVOS05PV046UlUtTk1LCitSVVNTSUE6WUFLT1VUSUEtU0FIQSBSRVNQT1VCTElLQTtUQVRUSU5TS0lZOlVOS05PV046UlUtVFROCitSVVNTSUE6WUFLT1VUSUEtU0FIQSBSRVNQT1VCTElLQTtHT1JOWUk6VU5LTk9XTjpSVS1HT04KK1JVU1NJQTpZQUtPVVRJQS1TQUhBIFJFU1BPVUJMSUtBO1VTVC1NQVlTS0lZOlVOS05PV046UlUtVVMzCitSVVNTSUE6S09SSUFLU0tJIE5BVElPTkFMIE9LUk9VRztPTFlVVE9SU0tJWTpVTktOT1dOOlJVLU9MUgorUlVTU0lBOktIQUJBUk9WU0tJIEtSQe8gUulTSURVRUw7T0tIT1RTS0lZOlVOS05PV046UlUtT0tTCitSVVNTSUE6TUFHQURBTlNLQe9BIE9CTEFTVCBS6VNJRDtURU5LSU5TS0lZOlVOS05PV046UlUtVE5OCitSVVNTSUE6WUFLT1VUSUEtU0FIQSBSRVNQT1VCTElLQTtNSVJOWTpVTktOT1dOOlJVLU1JTgorUlVTU0lBOllBS09VVElBLVNBSEEgUkVTUE9VQkxJS0E7Q0hVUkFQQ0hJTlNLSVk6VU5LTk9XTjpSVS1DSEgKK1JVU1NJQTpZQUtPVVRJQS1TQUhBIFJFU1BPVUJMSUtBO01FR0lOTy1LQU5HQUxBU1NLSVk6VU5LTk9XTjpSVS1NR0cKK1JVU1NJQTpZQUtPVVRJQS1TQUhBIFJFU1BPVUJMSUtBO1lBS1VUU0s6VU5LTk9XTjpSVS1ZS1QKK1JVU1NJQTpNQUdBREFOU0tB70EgT0JMQVNUIFLpU0lEO0tIQVNZTlNLSVk6VU5LTk9XTjpSVS1LSEsKK1JVU1NJQTpZQUtPVVRJQS1TQUhBIFJFU1BPVUJMSUtBO09SRFpIT05JS0lEWkVWU0tJWTpVTktOT1dOOlJVLU9SRAorUlVTU0lBOllBS09VVElBLVNBSEEgUkVTUE9VQkxJS0E7T0xFS01JTlNLSVk6VU5LTk9XTjpSVS1PTE4KK1JVU1NJQTpZQUtPVVRJQS1TQUhBIFJFU1BPVUJMSUtBO0xFTlNLSVk6VU5LTk9XTjpSVS1MTkkKK1JVU1NJQTpZQUtPVVRJQS1TQUhBIFJFU1BPVUJMSUtBO0FNR0lOU0tJWTpVTktOT1dOOlJVLUFNUworUlVTU0lBOk1BR0FEQU5TS0HvQSBPQkxBU1QgUulTSUQ7T0xTS0lZOlVOS05PV046UlUtT0xJCitSVVNTSUE6WUFLT1VUSUEtU0FIQSBSRVNQT1VCTElLQTtBTERBTlNLSVk6VU5LTk9XTjpSVS1BTEsKK1JVU1NJQTpLT1JJQUtTS0kgTkFUSU9OQUwgT0tST1VHO0tBUkFHSU5TS0lZOlVOS05PV046UlUtS1IzCitSVVNTSUE6S09SSUFLU0tJIE5BVElPTkFMIE9LUk9VRztUSUdJTFNLSVk6VU5LTk9XTjpSVS1UR1MKK1JVU1NJQTpNQUdBREFOU0tB70EgT0JMQVNUIFLpU0lEO01BR0FEQU46VU5LTk9XTjpSVS1NR0QKK1JVU1NJQTpLSEFCQVJPVlNLSSBLUkHvIFLpU0lEVUVMO0FZQU5PLU1BWVNLSVk6VU5LTk9XTjpSVS1BWVkKK1JVU1NJQTpZQUtPVVRJQS1TQUhBIFJFU1BPVUJMSUtBO05FUklVTkdSSTpVTktOT1dOOlJVLU5SRworUlVTU0lBOktBTVRDSEFUU0tB70EgT0JMQVNUIFLpU0k7VVNULUtBTUNIQVRTS0lZOlVOS05PV046UlUtVVNICitSVVNTSUE6QU1PVVJTS0HvQSBPQkxBU1Q7VFlORElOU0tJWTpVTktOT1dOOlJVLVRZTgorUlVTU0lBOktBTVRDSEFUU0tB70EgT0JMQVNUIFLpU0k7QllTVFJJTlNLSVk6VU5LTk9XTjpSVS1CWU4KK1JVU1NJQTpLQU1UQ0hBVFNLQe9BIE9CTEFTVCBS6VNJO01JTEtPVlNLSVk6VU5LTk9XTjpSVS1NTFYKK1JVU1NJQTpLQU1UQ0hBVFNLQe9BIE9CTEFTVCBS6VNJO1NPQk9MRVZTS0lZOlVOS05PV046UlUtU0JWCitSVVNTSUE6S0hBQkFST1ZTS0kgS1JB7yBS6VNJRFVFTDtUVUdVUk8tQ0hVTUlLQU5TS0lZOlVOS05PV046UlUtVEdNCitSVVNTSUE6QU1PVVJTS0HvQSBPQkxBU1Q7WkVZU0tJWTpVTktOT1dOOlJVLVpZSworUlVTU0lBOktBTVRDSEFUU0tB70EgT0JMQVNUIFLpU0k7QUxFVVRTS0lZOlVOS05PV046UlUtQUxJCitSVVNTSUE6QU1PVVJTS0HvQSBPQkxBU1Q7VFlOREE6VU5LTk9XTjpSVS1UWUQKK1JVU1NJQTpLQU1UQ0hBVFNLQe9BIE9CTEFTVCBS6VNJO1lFTElaT1ZTS0lZOlVOS05PV046UlUtWUxWCitSVVNTSUE6QU1PVVJTS0HvQSBPQkxBU1Q7U0tPVk9ST0RJTlNLSVk6VU5LTk9XTjpSVS1TS0QKK1JVU1NJQTpTQUtIQUxJTlNLQe9BIE9CTEFTVDtPS0hJTlNLSVk6VU5LTk9XTjpSVS1PS0sKK1JVU1NJQTpLSEFCQVJPVlNLSSBLUkHvIFLpU0lEVUVMO05JS09MQVlFVlNLSVk6VU5LTk9XTjpSVS1OS0sKK1JVU1NJQTpBTU9VUlNLQe9BIE9CTEFTVDtNQUdEQUdBQ0hJTlNLSVk6VU5LTk9XTjpSVS1NR0gKK1JVU1NJQTpBTU9VUlNLQe9BIE9CTEFTVDtTRUxFTURaSElOU0tJWTpVTktOT1dOOlJVLVNMSAorUlVTU0lBOkFNT1VSU0tB70EgT0JMQVNUO1pFWUE6VU5LTk9XTjpSVS1aRVkKK1JVU1NJQTpLQU1UQ0hBVFNLQe9BIE9CTEFTVCBS6VNJO1VTVC1CT0xTSEVSRVRTS0lZOlVOS05PV046UlUtVVNSCitSVVNTSUE6S0hBQkFST1ZTS0kgS1JB7yBS6VNJRFVFTDtQT0xJTlkgT1NJUEVOS08uIElNRU5JOlVOS05PV046UlUtUExOCitSVVNTSUE6U0FLSEFMSU5TS0HvQSBPQkxBU1Q7T0tIQTpVTktOT1dOOlJVLU9LSAorUlVTU0lBOkFNT1VSU0tB70EgT0JMQVNUO01BWkFOT1ZTS0lZOlVOS05PV046UlUtTVpWCitSVVNTSUE6S0hBQkFST1ZTS0kgS1JB7yBS6VNJRFVFTDtVTENIU0tJWTpVTktOT1dOOlJVLVVMUworUlVTU0lBOktBTVRDSEFUU0tB70EgT0JMQVNUIFLpU0k7RUxJWk9WTzpVTktOT1dOOlJVLUVMVgorUlVTU0lBOktIQUJBUk9WU0tJIEtSQe8gUulTSURVRUw7TklLT0xBWUVWU0stTkEtQU1VUkU6VU5LTk9XTjpSVS1OS04KK1JVU1NJQTpLQU1UQ0hBVFNLQe9BIE9CTEFTVCBS6VNJO1BFVFJPUEFWTE9WU0stS0FNQ0hBVFNLOlVOS05PV046UlUtUFRLCitSVVNTSUE6QU1PVVJTS0HvQSBPQkxBU1Q7U0hJTUFOT1ZTS0lZOlVOS05PV046UlUtU0hJCitSVVNTSUE6U0FLSEFMSU5TS0HvQSBPQkxBU1Q7Tk9HTElLU0tJWTpVTktOT1dOOlJVLU5HSworUlVTU0lBOktIQUJBUk9WU0tJIEtSQe8gUulTSURVRUw7VkVSS0hORUJVUkVJTlNLSVk6VU5LTk9XTjpSVS1WUlIKK1JVU1NJQTpLSEFCQVJPVlNLSSBLUkHvIFLpU0lEVUVMO1NPTE5FQ0hOWUk6VU5LTk9XTjpSVS1TTEMKK1JVU1NJQTpBTU9VUlNLQe9BIE9CTEFTVDtTSElNQU5PVlNLOlVOS05PV046UlUtU0hPCitSVVNTSUE6U0FLSEFMSU5TS0HvQSBPQkxBU1Q7QUxFWEFORFJPVlNLLVNBS0hBTElOU0tJWTpVTktOT1dOOlJVLUFMQQorUlVTU0lBOkFNT1VSU0tB70EgT0JMQVNUO1NWT0JPRE5FTlNLSVk6VU5LTk9XTjpSVS1TVk4KK1JVU1NJQTpTQUtIQUxJTlNLQe9BIE9CTEFTVDtUWU1PVlNLSVk6VU5LTk9XTjpSVS1UWVMKK1JVU1NJQTpLSEFCQVJPVlNLSSBLUkHvIFLpU0lEVUVMO0tPTVNPTU9MU0tJWTpVTktOT1dOOlJVLUtNTAorUlVTU0lBOkFNT1VSU0tB70EgT0JMQVNUO1NFUllTSEVWU0tJWTpVTktOT1dOOlJVLVNSUworUlVTU0lBOkFNT1VSU0tB70EgT0JMQVNUO1JPTU5FTlNLSVk6VU5LTk9XTjpSVS1STU4KK1JVU1NJQTpBTU9VUlNLQe9BIE9CTEFTVDtTVk9CT0ROWUk6VU5LTk9XTjpSVS1TVlkKK1JVU1NJQTpBTU9VUlNLQe9BIE9CTEFTVDtCTEFHT1ZFU0NIRU5TS0lZOlVOS05PV046UlUtQkxDCitSVVNTSUE6S0hBQkFST1ZTS0kgS1JB7yBS6VNJRFVFTDtWQU5JTlNLSVk6VU5LTk9XTjpSVS1WTlMKK1JVU1NJQTpBTU9VUlNLQe9BIE9CTEFTVDtCRUxPR09SU0tJWTpVTktOT1dOOlJVLUJMWQorUlVTU0lBOkFNT1VSU0tB70EgT0JMQVNUO0JFTE9HT1JTSzpVTktOT1dOOlJVLUJMIAorUlVTU0lBOlNBS0hBTElOU0tB70EgT0JMQVNUO1NFVkVSTy1LVVJJTFNLSVk6VU5LTk9XTjpSVS1TVlIKK1JVU1NJQTpTQUtIQUxJTlNLQe9BIE9CTEFTVDtBTEVLUy4tU0FLSEFMSU5TS0lZOlVOS05PV046UlUtQUxICitSVVNTSUE6QU1PVVJTS0HvQSBPQkxBU1Q7SVZBTk9WU0tJWTpVTktOT1dOOlJVLUlWVgorUlVTU0lBOkFNT1VSU0tB70EgT0JMQVNUO0JVUkVZU0tJWTpVTktOT1dOOlJVLUJSSworUlVTU0lBOktIQUJBUk9WU0tJIEtSQe8gUulTSURVRUw7S09NU09NT0xTSy1OQS1BTVVSRTpVTktOT1dOOlJVLUtNTgorUlVTU0lBOkFNT1VSU0tB70EgT0JMQVNUO09LVFlBQlJTS0lZOlVOS05PV046UlUtT0tJCitSVVNTSUE6QU1PVVJTS0HvQSBPQkxBU1Q7WkFWSVRJTlNLSVk6VU5LTk9XTjpSVS1aVk4KK1JVU1NJQTpLSEFCQVJPVlNLSSBLUkHvIFLpU0lEVUVMO0tIQUJBUk9WU0tJWTpVTktOT1dOOlJVLUtISQorUlVTU0lBOktIQUJBUk9WU0tJIEtSQe8gUulTSURVRUw7QU1VUlNLSVk6VU5LTk9XTjpSVS1BTUsKK1JVU1NJQTpTQUtIQUxJTlNLQe9BIE9CTEFTVDtTTUlSTllLSE9WU0tJWTpVTktOT1dOOlJVLVNNSAorUlVTU0lBOkFNT1VSU0tB70EgT0JMQVNUO0JMQUdPVkVTQ0hFTlNLOlVOS05PV046UlUtQkxICitSVVNTSUE6QU1PVVJTS0HvQSBPQkxBU1Q7VEFNQk9WU0tJWTpVTktOT1dOOlJVLVRNUworUlVTU0lBOktIQUJBUk9WU0tJIEtSQe8gUulTSURVRUw7QU1VUlNLOlVOS05PV046UlUtQU1SCitSVVNTSUE6QU1PVVJTS0HvQSBPQkxBU1Q7QVJLSEFSSU5TS0lZOlVOS05PV046UlUtQVJOCitSVVNTSUE6QU1PVVJTS0HvQSBPQkxBU1Q7TUlLSEFZTE9WU0tJWTpVTktOT1dOOlJVLU1LVgorUlVTU0lBOktIQUJBUk9WU0tJIEtSQe8gUulTSURVRUw7TkFOQVlTS0lZOlVOS05PV046UlUtTk5TCitSVVNTSUE6QU1PVVJTS0HvQSBPQkxBU1Q7S09OU1RBTlRJTk9WU0tJWTpVTktOT1dOOlJVLUtOTgorUlVTU0lBOlNBS0hBTElOU0tB70EgT0JMQVNUO1BPUk9OQVlTS0lZOlVOS05PV046UlUtUFIgCitSVVNTSUE6QU1PVVJTS0HvQSBPQkxBU1Q7UkFZQ0hJS0hJTlNLOlVOS05PV046UlUtUllICitSVVNTSUE6U0FLSEFMSU5TS0HvQSBPQkxBU1Q7VUdMRUdPUlNLSVk6VU5LTk9XTjpSVS1VR1IKK1JVU1NJQTpFVlJF71NLQe9BIE9CTEFTVDtPQkxVQ0hFTlNLSVk6VU5LTk9XTjpSVS1PQlMKK1JVU1NJQTpTQUtIQUxJTlNLQe9BIE9CTEFTVDtQT1JPTkFZU0s6VU5LTk9XTjpSVS1QUjEKK1JVU1NJQTpLSEFCQVJPVlNLSSBLUkHvIFLpU0lEVUVMO1NPVkVUU0tPLUdBVkFOU0tJWTpVTktOT1dOOlJVLVNWRworUlVTU0lBOlNBS0hBTElOU0tB70EgT0JMQVNUO01BS0FST1ZTS0lZOlVOS05PV046UlUtTUtTCitSVVNTSUE6U0FLSEFMSU5TS0HvQSBPQkxBU1Q7VUdMRUdPUlNLOlVOS05PV046UlUtVUdTCitSVVNTSUE6RVZSRe9TS0HvQSBPQkxBU1Q7QklST0JJRFpIQU5TS0lZOlVOS05PV046UlUtQlJICitSVVNTSUE6S0hBQkFST1ZTS0kgS1JB7yBS6VNJRFVFTDtTT1ZFVFNLQVlBIEdBVkFOOlVOS05PV046UlUtU1ZBCitSVVNTSUE6RVZSRe9TS0HvQSBPQkxBU1Q7U01JRE9WSUNIU0tJWTpVTktOT1dOOlJVLVNNQworUlVTU0lBOktIQUJBUk9WU0tJIEtSQe8gUulTSURVRUw7TEFaTy4gSU1FTkk6VU5LTk9XTjpSVS1MWk0KK1JVU1NJQTpFVlJF71NLQe9BIE9CTEFTVDtCSVJPQklEWkhBTjpVTktOT1dOOlJVLUJSRAorUlVTU0lBOlNBS0hBTElOU0tB70EgT0JMQVNUO1RPTUFSSU5TS0lZOlVOS05PV046UlUtVE1JCitSVVNTSUE6RVZSRe9TS0HvQSBPQkxBU1Q7T0tUWUFCUlNLSVk6VU5LTk9XTjpSVS1PS1kKK1JVU1NJQTpLSEFCQVJPVlNLSSBLUkHvIFLpU0lEVUVMO0tIQUJBUk9WU0s6VU5LTk9XTjpSVS1LSE8KK1JVU1NJQTpFVlJF71NLQe9BIE9CTEFTVDtMRU5JTlNLSVk6VU5LTk9XTjpSVS1MTlkKK1JVU1NJQTpQUklNT1JTS0kgS1JB7ztURVJORVlTS0lZOlVOS05PV046UlUtVFJZCitSVVNTSUE6U0FLSEFMSU5TS0HvQSBPQkxBU1Q7RE9MSU5TS0lZOlVOS05PV046UlUtRExTCitSVVNTSUE6S0hBQkFST1ZTS0kgS1JB7yBS6VNJRFVFTDtWWUFaRU1TS0lZOlVOS05PV046UlUtVllNCitSVVNTSUE6U0FLSEFMSU5TS0HvQSBPQkxBU1Q7S0hPTE1TS0lZOlVOS05PV046UlUtS0hZCitSVVNTSUE6U0FLSEFMSU5TS0HvQSBPQkxBU1Q7RE9MSU5TSzpVTktOT1dOOlJVLURMTgorUlVTU0lBOlBSSU1PUlNLSSBLUkHvO1BPWkhBUlNLSVk6VU5LTk9XTjpSVS1QWlIKK1JVU1NJQTpLSEFCQVJPVlNLSSBLUkHvIFLpU0lEVUVMO0JJS0lOU0tJWTpVTktOT1dOOlJVLUJLUworUlVTU0lBOlNBS0hBTElOU0tB70EgT0JMQVNUO1lVWkhOTy1TQUtIQUxJTlNLOlVOS05PV046UlUtWVpLCitSVVNTSUE6U0FLSEFMSU5TS0HvQSBPQkxBU1Q7S1VSSUxTS0lZOlVOS05PV046UlUtS1I0CitSVVNTSUE6U0FLSEFMSU5TS0HvQSBPQkxBU1Q7S09SU0FLT1ZTS0lZOlVOS05PV046UlUtS1I1CitSVVNTSUE6U0FLSEFMSU5TS0HvQSBPQkxBU1Q7QU5JVlNLSVk6VU5LTk9XTjpSVS1BTkkKK1JVU1NJQTpTQUtIQUxJTlNLQe9BIE9CTEFTVDtLSE9MTVNLOlVOS05PV046UlUtS0hNCitSVVNTSUE6U0FLSEFMSU5TS0HvQSBPQkxBU1Q7TkVWRUxTS0lZOlVOS05PV046UlUtTlZTCitSVVNTSUE6S0hBQkFST1ZTS0kgS1JB7yBS6VNJRFVFTDtCSUtJTjpVTktOT1dOOlJVLUJJTgorUlVTU0lBOlNBS0hBTElOU0tB70EgT0JMQVNUO05FVkVMJ1NLOlVOS05PV046UlUtTlZLCitSVVNTSUE6U0FLSEFMSU5TS0HvQSBPQkxBU1Q7S09SU0FLT1Y6VU5LTk9XTjpSVS1LUjYKK1JVU1NJQTpQUklNT1JTS0kgS1JB7ztLUkFTTk9BUk1FWVNLSVk6VU5LTk9XTjpSVS1LUk0KK1JVU1NJQTpQUklNT1JTS0kgS1JB7ztEQUxORVJFQ0hFTlNLSVk6VU5LTk9XTjpSVS1ETEgKK1JVU1NJQTpQUklNT1JTS0kgS1JB7ztEQUxORVJFQ0hFTlNLOlVOS05PV046UlUtRExDCitSVVNTSUE6UFJJTU9SU0tJIEtSQe87TEVTT1pBVk9EU0tJWTpVTktOT1dOOlJVLUxTRAorUlVTU0lBOlBSSU1PUlNLSSBLUkHvO0xFU09aQVZPRFNLOlVOS05PV046UlUtTFNWCitSVVNTSUE6UFJJTU9SU0tJIEtSQe87S0hBTktBWVNLSVk6VU5LTk9XTjpSVS1LSCAKK1JVU1NJQTpQUklNT1JTS0kgS1JB7ztLSVJPVlNLSVk6VU5LTk9XTjpSVS1LUjcKK1JVU1NJQTpQUklNT1JTS0kgS1JB7ztEQUxORUdPUlNLSVk6VU5LTk9XTjpSVS1ETFIKK1JVU1NJQTpQUklNT1JTS0kgS1JB7ztTUEFTU0tJWTpVTktOT1dOOlJVLVNQUworUlVTU0lBOlBSSU1PUlNLSSBLUkHvO0NIVUdVWUVWU0tJWTpVTktOT1dOOlJVLUNISQorUlVTU0lBOlBSSU1PUlNLSSBLUkHvO1BPR1JBTklDSE5ZSTpVTktOT1dOOlJVLVBHQworUlVTU0lBOlBSSU1PUlNLSSBLUkHvO1lBS09WTEVWU0tJWTpVTktOT1dOOlJVLVlLUworUlVTU0lBOlBSSU1PUlNLSSBLUkHvO0tBVkFMRVJPVlNLSVk6VU5LTk9XTjpSVS1LVlYKK1JVU1NJQTpQUklNT1JTS0kgS1JB7ztLSE9ST0xTS0lZOlVOS05PV046UlUtS0gxCitSVVNTSUE6UFJJTU9SU0tJIEtSQe87REFMTkVHT1JTSzpVTktOT1dOOlJVLURMRworUlVTU0lBOlBSSU1PUlNLSSBLUkHvO1NQQVNTSy1EQUxOSVk6VU5LTk9XTjpSVS1TUEQKK1JVU1NJQTpQUklNT1JTS0kgS1JB7ztDSEVSTklHT1ZTS0lZOlVOS05PV046UlUtQ0hZCitSVVNTSUE6U0FLSEFMSU5TS0HvQSBPQkxBU1Q7WVVaSE5PLUtVUklMU0tJWTpVTktOT1dOOlJVLVlaUgorUlVTU0lBOlBSSU1PUlNLSSBLUkHvO0FOVUNISU5TS0lZOlVOS05PV046UlUtQU5OCitSVVNTSUE6UFJJTU9SU0tJIEtSQe87TUlLSEFZTE9WU0tJWTpVTktOT1dOOlJVLU1LSworUlVTU0lBOlBSSU1PUlNLSSBLUkHvO09LVFlBQlJTS0lZOlVOS05PV046UlUtT0sgCitSVVNTSUE6UFJJTU9SU0tJIEtSQe87QVJTRU5ZRVY6VU5LTk9XTjpSVS1BUlkKK1JVU1NJQTpQUklNT1JTS0kgS1JB7ztPTEdJTlNLWTpVTktOT1dOOlJVLU9MWQorUlVTU0lBOlBSSU1PUlNLSSBLUkHvO1VTU1VSSVlTS0lZOlVOS05PV046UlUtVVM0CitSVVNTSUE6UFJJTU9SU0tJIEtSQe87UEFSVElaQU5TS0lZOlVOS05PV046UlUtUFIyCitSVVNTSUE6UFJJTU9SU0tJIEtSQe87U0hLT1RPVlNLSVk6VU5LTk9XTjpSVS1TSFkKK1JVU1NJQTpQUklNT1JTS0kgS1JB7ztOQURFWkhESU5TS0lZOlVOS05PV046UlUtTkROCitSVVNTSUE6UFJJTU9SU0tJIEtSQe87TEFaT1ZTS0lZOlVOS05PV046UlUtTFpTCitSVVNTSUE6UFJJTU9SU0tJIEtSQe87QVJUWU9NOlVOS05PV046UlUtQVJPCitSVVNTSUE6UFJJTU9SU0tJIEtSQe87UEFSVElaQU5TSzpVTktOT1dOOlJVLVBSQQorUlVTU0lBOlBSSU1PUlNLSSBLUkHvO0tIQVNBTlNLSVk6VU5LTk9XTjpSVS1LSDIKK1JVU1NJQTpQUklNT1JTS0kgS1JB7ztWTEFESVZPU1RPSzpVTktOT1dOOlJVLVZMTworUlVTU0lBOlBSSU1PUlNLSSBLUkHvO0JPTFNIT1kgS0FNRU46VU5LTk9XTjpSVS1CTEEKK1JVU1NJQTpQUklNT1JTS0kgS1JB7ztOQUtIT0RLQTpVTktOT1dOOlJVLU5LRAorUlVTU0lBOktJUk9WU0tB70EgT0JMQVNUO0xVWlNLSVk6VU5LTk9XTjpSVS1MWksKK1JVU1NJQTpLSVJPVlNLQe9BIE9CTEFTVDtQT0RPU0lOT1ZTS0lZOlVOS05PV046UlUtUERWCitSVVNTSUE6S0lST1ZTS0HvQSBPQkxBU1Q7VkVSS0hORUtBTVNLSVk6VU5LTk9XTjpSVS1WUksKK1JVU1NJQTpLSVJPVlNLQe9BIE9CTEFTVDtPUEFSSU5TS0lZOlVOS05PV046UlUtT1BOCitSVVNTSUE6S0lST1ZTS0HvQSBPQkxBU1Q7TkFHT1JTS0lZOlVOS05PV046UlUtTkdTCitSVVNTSUE6S0lST1ZTS0HvQSBPQkxBU1Q7TVVSQVNISU5TS0lZOlVOS05PV046UlUtTVJZCitSVVNTSUE6S0lST1ZTS0HvQSBPQkxBU1Q7QkVMT0tIT0xVTklUU0tJWTpVTktOT1dOOlJVLUJMVAorUlVTU0lBOktJUk9WU0tB70EgT0JMQVNUO0FGQU5BU1lFVlNLSVk6VU5LTk9XTjpSVS1BRlYKK1JVU1NJQTpLSVJPVlNLQe9BIE9CTEFTVDtEQVJPVlNLSVk6VU5LTk9XTjpSVS1EUlMKK1JVU1NJQTpLSVJPVlNLQe9BIE9CTEFTVDtTTE9CT0RTS09ZOlVOS05PV046UlUtU0xECitSVVNTSUE6S0lST1ZTS0HvQSBPQkxBU1Q7WVVSWUFOU0tJWTpVTktOT1dOOlJVLVlSTgorUlVTU0lBOktJUk9WU0tB70EgT0JMQVNUO09NVVROSU5TS0lZOlVOS05PV046UlUtT01TCitSVVNTSUE6S0lST1ZTS0HvQSBPQkxBU1Q7S0hBTFRVUklOU0tJWTpVTktOT1dOOlJVLUtIMworUlVTU0lBOktJUk9WU0tB70EgT0JMQVNUO1NIQUJBTElOU0tJWTpVTktOT1dOOlJVLVNIIAorUlVTU0lBOktJUk9WU0tB70EgT0JMQVNUO0tPVEVMTklDSFNLSVk6VU5LTk9XTjpSVS1LVEMKK1JVU1NJQTpLSVJPVlNLQe9BIE9CTEFTVDtLSVJPVjpVTktOT1dOOlJVLUtJVgorUlVTU0lBOktJUk9WU0tB70EgT0JMQVNUO0tJUk9WTy1DSEVQRVRTS0lZOlVOS05PV046UlUtS1JQCitSVVNTSUE6S0lST1ZTS0HvQSBPQkxBU1Q7WlVZRVZTS0lZOlVOS05PV046UlUtWllTCitSVVNTSUE6S0lST1ZTS0HvQSBPQkxBU1Q7U1ZFQ0hJTlNLSVk6VU5LTk9XTjpSVS1TVksKK1JVU1NJQTpLSVJPVlNLQe9BIE9CTEFTVDtGQUxFTlNLSVk6VU5LTk9XTjpSVS1GTFMKK1JVU1NJQTpLSVJPVlNLQe9BIE9CTEFTVDtPUklDSEVWU0tJWTpVTktOT1dOOlJVLU9SVgorUlVTU0lBOktJUk9WU0tB70EgT0JMQVNUO0tJUk9WTy1DSEVQRVRTOlVOS05PV046UlUtS1JDCitSVVNTSUE6S0lST1ZTS0HvQSBPQkxBU1Q7S1VNRU5TS0lZOlVOS05PV046UlUtS01JCitSVVNTSUE6S0lST1ZTS0HvQSBPQkxBU1Q7S09URUxOSUNIJzpVTktOT1dOOlJVLUtUTgorUlVTU0lBOktJUk9WU0tB70EgT0JMQVNUO1ZFUktIT1NISVpIRU1TS0lZOlVOS05PV046UlUtVlJFCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztWRVRMVVpIU0tJWTpVTktOT1dOOlJVLVZUSAorUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087U0hBS0hVTlNLSVk6VU5LTk9XTjpSVS1TSDEKK1JVU1NJQTpOSUpFR09ST0RTS0HvQSBPQkxBU1QgKEdPO1RPTlNIQVlFVlNLSVk6VU5LTk9XTjpSVS1UTlYKK1JVU1NJQTpLSVJPVlNLQe9BIE9CTEFTVDtCT0dPUk9EU0tJWTpVTktOT1dOOlJVLUJHRAorUlVTU0lBOktJUk9WU0tB70EgT0JMQVNUO0FSQkFaSFNLSVk6VU5LTk9XTjpSVS1BUkgKK1JVU1NJQTpLSVJPVlNLQe9BIE9CTEFTVDtTVU5TS0lZOlVOS05PV046UlUtU05LCitSVVNTSUE6S0lST1ZTS0HvQSBPQkxBU1Q7Tk9MSU5TS0lZOlVOS05PV046UlUtTkxTCitSVVNTSUE6S0lST1ZTS0HvQSBPQkxBU1Q7VFVaSElOU0tJWTpVTktOT1dOOlJVLVRaTgorUlVTU0lBOktJUk9WU0tB70EgT0JMQVNUO1VOSU5TS0lZOlVOS05PV046UlUtVU5TCitSVVNTSUE6S0lST1ZTS0HvQSBPQkxBU1Q7U09WRVRTS0lZOlVOS05PV046UlUtU1ZJCitSVVNTSUE6S0lST1ZTS0HvQSBPQkxBU1Q7TkVNU0tJWTpVTktOT1dOOlJVLU5NSQorUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087VkFSTkFWSU5TS0lZOlVOS05PV046UlUtVlJJCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztVUkVOU0tJWTpVTktOT1dOOlJVLVVSUworUlVTU0lBOktJUk9WU0tB70EgT0JMQVNUO1BJWkhBTlNLSVk6VU5LTk9XTjpSVS1QWk4KK1JVU1NJQTpOSUpFR09ST0RTS0HvQSBPQkxBU1QgKEdPO1RPTktJTlNLSVk6VU5LTk9XTjpSVS1UTlMKK1JVU1NJQTpLSVJPVlNLQe9BIE9CTEFTVDtLSUtOVVJTS0lZOlVOS05PV046UlUtS0tSCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztLT1ZFUk5JTlNLSVk6VU5LTk9XTjpSVS1LVk4KK1JVU1NJQTpLSVJPVlNLQe9BIE9CTEFTVDtMRUJZQVpIU0tJWTpVTktOT1dOOlJVLUxCSAorUlVTU0lBOktJUk9WU0tB70EgT0JMQVNUO0tJTE1FWlNLSVk6VU5LTk9XTjpSVS1LTFoKK1JVU1NJQTpLSVJPVlNLQe9BIE9CTEFTVDtZQVJBTlNLSVk6VU5LTk9XTjpSVS1ZUlMKK1JVU1NJQTpLSVJPVlNLQe9BIE9CTEFTVDtVUlpIVU1TS0lZOlVOS05PV046UlUtVVJNCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztTRU1ZT05PVlNLSVk6VU5LTk9XTjpSVS1TTVYKK1JVU1NJQTpOSUpFR09ST0RTS0HvQSBPQkxBU1QgKEdPO1NIQVJBTkdTS0lZOlVOS05PV046UlUtU0hHCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztLUkFTTk9CQUtPVlNLSVk6VU5LTk9XTjpSVS1LUjgKK1JVU1NJQTpNQVJJWVNLQe9BIFJFU1BPVUJMSUtBO1NFUk5VUlNLSVk6VU5LTk9XTjpSVS1TUlIKK1JVU1NJQTpLSVJPVlNLQe9BIE9CTEFTVDtTQU5DSFVSU0tJWTpVTktOT1dOOlJVLVNOUworUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087Vk9TS1JFU0VOU0tJWTpVTktOT1dOOlJVLVZTUworUlVTU0lBOk1BUklZU0tB70EgUkVTUE9VQkxJS0E7Tk9WT1RBUllBTFNLSVk6VU5LTk9XTjpSVS1OVlkKK1JVU1NJQTpNQVJJWVNLQe9BIFJFU1BPVUJMSUtBO09SU0hBTlNLSVk6VU5LTk9XTjpSVS1PUk4KK1JVU1NJQTpNQVJJWVNLQe9BIFJFU1BPVUJMSUtBO01BUkktVFVSRUtTS0lZOlVOS05PV046UlUtTVJSCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztHT1JPREVUU0tJWTpVTktOT1dOOlJVLUdSSworUlVTU0lBOk1BUklZU0tB70EgUkVTUE9VQkxJS0E7S0lMRU1BUlNLSVk6VU5LTk9XTjpSVS1LTFIKK1JVU1NJQTpNQVJJWVNLQe9BIFJFU1BPVUJMSUtBO1NPVkVUU0tJWTpVTktOT1dOOlJVLVNWIAorUlVTU0lBOk1BUklZU0tB70EgUkVTUE9VQkxJS0E7UEFSQU5HSU5TS0lZOlVOS05PV046UlUtUFIzCitSVVNTSUE6TUFSSVlTS0HvQSBSRVNQT1VCTElLQTtNRURWRURFVlNLSVk6VU5LTk9XTjpSVS1NRFYKK1JVU1NJQTpNQVJJWVNLQe9BIFJFU1BPVUJMSUtBO0tVWkhFTkVSU0tJWTpVTktOT1dOOlJVLUtaUgorUlVTU0lBOk1BUklZU0tB70EgUkVTUE9VQkxJS0E7WVVSSU5TS0lZOlVOS05PV046UlUtWVJLCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztCT1JTS0lZOlVOS05PV046UlUtQlJJCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztDSEtBTE9WU0tJWTpVTktOT1dOOlJVLUNIIAorUlVTU0lBOktJUk9WU0tB70EgT0JMQVNUO01BTE1ZWkhTS0lZOlVOS05PV046UlUtTUxICitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztHT1JPREVUWjpVTktOT1dOOlJVLUdSRAorUlVTU0lBOk1BUklZU0tB70EgUkVTUE9VQkxJS0E7TU9SS0lOU0tJWTpVTktOT1dOOlJVLU1SIAorUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087QkFMQUtITklOU0tJWTpVTktOT1dOOlJVLUJMMQorUlVTU0lBOk1BUklZU0tB70EgUkVTUE9VQkxJS0E7WU9TSEtBUi1PTEE6VU5LTk9XTjpSVS1ZU1IKK1JVU1NJQTpNQVJJWVNLQe9BIFJFU1BPVUJMSUtBO0dPUk5PTUFSSVlTS0lZOlVOS05PV046UlUtR1JSCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztCQUxBS0hOQTpVTktOT1dOOlJVLUJMMgorUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087TFlTS09WU0tJWTpVTktOT1dOOlJVLUxZVgorUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087Vk9ST1RZTlNLSVk6VU5LTk9XTjpSVS1WUiAKK1JVU1NJQTpOSUpFR09ST0RTS0HvQSBPQkxBU1QgKEdPO1ZPTE9EQVJTS0lZOlVOS05PV046UlUtVkxSCitSVVNTSUE6TUFSSVlTS0HvQSBSRVNQT1VCTElLQTtaVkVOSUdPVlNLSVk6VU5LTk9XTjpSVS1aVlYKK1JVU1NJQTpLSVJPVlNLQe9BIE9CTEFTVDtWWUFUU0tPLVBPTFlBTlNLSVk6VU5LTk9XTjpSVS1WWUwKK1JVU1NJQTpOSUpFR09ST0RTS0HvQSBPQkxBU1QgKEdPO05JWkhOSVkgTk9WR09ST0Q6VU5LTk9XTjpSVS1OWk4KK1JVU1NJQTpOSUpFR09ST0RTS0HvQSBPQkxBU1QgKEdPO0JPUjpVTktOT1dOOlJVLUJPUgorUlVTU0lBOlRDSE9VVkFDSFNLQe9BIFJFU1BPVUJMSUs7Q0hFQk9LU0FSU0tJWTpVTktOT1dOOlJVLUNIUgorUlVTU0lBOk1BUklZU0tB70EgUkVTUE9VQkxJS0E7S09aTU9ERU1ZQU5TSzpVTktOT1dOOlJVLUtaTQorUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087S1NUT1ZTS0lZOlVOS05PV046UlUtS1NTCitSVVNTSUE6S0lST1ZTS0HvQSBPQkxBU1Q7VllBVFNLWUUgUE9MWUFOWTpVTktOT1dOOlJVLVZZIAorUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087Qk9HT1JPRFNLSVk6VU5LTk9XTjpSVS1CR1MKK1JVU1NJQTpNQVJJWVNLQe9BIFJFU1BPVUJMSUtBO1ZPTFpIU0tJWTpVTktOT1dOOlJVLVZMMworUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087UEFWTE9WU0tJWTpVTktOT1dOOlJVLVBWUworUlVTU0lBOlRDSE9VVkFDSFNLQe9BIFJFU1BPVUJMSUs7TU9SR0FVU0hTS0lZOlVOS05PV046UlUtTVJICitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztLU1RPVk86VU5LTk9XTjpSVS1LU1YKK1JVU1NJQTpUQ0hPVVZBQ0hTS0HvQSBSRVNQT1VCTElLO1lBRFJJTlNLSVk6VU5LTk9XTjpSVS1ZRE4KK1JVU1NJQTpOSUpFR09ST0RTS0HvQSBPQkxBU1QgKEdPO0RBTE5FS09OU1RBTlRJTk9WU0tJWTpVTktOT1dOOlJVLURMVAorUlVTU0lBOlRDSE9VVkFDSFNLQe9BIFJFU1BPVUJMSUs7Q0hFQk9LU0FSWTpVTktOT1dOOlJVLUNIQQorUlVTU0lBOlRDSE9VVkFDSFNLQe9BIFJFU1BPVUJMSUs7TUFSSUlOU0tPLSBQT1NBRFNLSVk6VU5LTk9XTjpSVS1NUlAKK1JVU1NJQTpOSUpFR09ST0RTS0HvQSBPQkxBU1QgKEdPO0JPR09ST0RTSzpVTktOT1dOOlJVLUJHSworUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087U1BBU1NLSVk6VU5LTk9XTjpSVS1TUEsKK1JVU1NJQTpUQ0hPVVZBQ0hTS0HvQSBSRVNQT1VCTElLO05PVk9DSEVCT0tTQVJTSzpVTktOT1dOOlJVLU5WQQorUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087VkFDSFNLSVk6VU5LTk9XTjpSVS1WQ1MKK1JVU1NJQTpUQ0hPVVZBQ0hTS0HvQSBSRVNQT1VCTElLO1RTWVZJTFNLSVk6VU5LTk9XTjpSVS1UU0wKK1JVU1NJQTpOSUpFR09ST0RTS0HvQSBPQkxBU1QgKEdPO1NPU05PVlNLSVk6VU5LTk9XTjpSVS1TU1MKK1JVU1NJQTpOSUpFR09ST0RTS0HvQSBPQkxBU1QgKEdPO1BBVkxPVk86VU5LTk9XTjpSVS1QVk8KK1JVU1NJQTpOSUpFR09ST0RTS0HvQSBPQkxBU1QgKEdPO0tOWUFHSU5JTlNLSVk6VU5LTk9XTjpSVS1LTlMKK1JVU1NJQTpOSUpFR09ST0RTS0HvQSBPQkxBU1QgKEdPO0JPTFNIRU1VUkFTSEtJTlNLSVk6VU5LTk9XTjpSVS1CTDMKK1JVU1NJQTpUQ0hPVVZBQ0hTS0HvQSBSRVNQT1VCTElLO0tPWkxPVlNLSVk6VU5LTk9XTjpSVS1LWlYKK1JVU1NJQTpUQ0hPVVZBQ0hTS0HvQSBSRVNQT1VCTElLO0tSQVNOT0FSTUVZU0tJWTpVTktOT1dOOlJVLUtSRQorUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087UElMTklOU0tJWTpVTktOT1dOOlJVLVBMUworUlVTU0lBOk1BUklZU0tB70EgUkVTUE9VQkxJS0E7Vk9MWkhTSzpVTktOT1dOOlJVLVZMSAorUlVTU0lBOlRDSE9VVkFDSFNLQe9BIFJFU1BPVUJMSUs7QUxJS09WU0tJWTpVTktOT1dOOlJVLUFMWQorUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087UEVSRVZPWlNLSVk6VU5LTk9XTjpSVS1QUjQKK1JVU1NJQTpUQ0hPVVZBQ0hTS0HvQSBSRVNQT1VCTElLO0tSQVNOT0NIRVRBWVNLSVk6VU5LTk9XTjpSVS1LUkEKK1JVU1NJQTpUQ0hPVVZBQ0hTS0HvQSBSRVNQT1VCTElLO1VSTUFSU0tJWTpVTktOT1dOOlJVLVVSSworUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087TkFWQVNISU5TS0lZOlVOS05PV046UlUtTlZJCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztTRVJHQUNIU0tJWTpVTktOT1dOOlJVLVNSSAorUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087QlVUVVJMSU5TS0lZOlVOS05PV046UlUtQlRTCitSVVNTSUE6VENIT1VWQUNIU0tB70EgUkVTUE9VQkxJSztWVVJOQVJTS0lZOlVOS05PV046UlUtVlIxCitSVVNTSUE6VENIT1VWQUNIU0tB70EgUkVTUE9VQkxJSztLQU5BU0hTS0lZOlVOS05PV046UlUtS05JCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztBUlpBTUFTU0tJWTpVTktOT1dOOlJVLUFSUworUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087VkFEU0tJWTpVTktOT1dOOlJVLVZESworUlVTU0lBOlRDSE9VVkFDSFNLQe9BIFJFU1BPVUJMSUs7U0hVTUVSTElOU0tJWTpVTktOT1dOOlJVLVNIMgorUlVTU0lBOlRDSE9VVkFDSFNLQe9BIFJFU1BPVUJMSUs7WUFOVElLT1ZTS0lZOlVOS05PV046UlUtWU5WCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztBUkRBVE9WU0tJWTpVTktOT1dOOlJVLUFSVgorUlVTU0lBOlRDSE9VVkFDSFNLQe9BIFJFU1BPVUJMSUs7U0hVTUVSTFlBOlVOS05PV046UlUtU0hMCitSVVNTSUE6VENIT1VWQUNIU0tB70EgUkVTUE9VQkxJSztLQU5BU0g6VU5LTk9XTjpSVS1LQVMKK1JVU1NJQTpOSUpFR09ST0RTS0HvQSBPQkxBU1QgKEdPO1NFQ0hFTk9WU0tJWTpVTktOT1dOOlJVLVNDUworUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087S1VMRUJBS1NLSVk6VU5LTk9XTjpSVS1LTFMKK1JVU1NJQTpOSUpFR09ST0RTS0HvQSBPQkxBU1QgKEdPO0tSQVNOT09LVFlBQlJTS0lZOlVOS05PV046UlUtS1JCCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztBUlpBTUFTOlVOS05PV046UlUtQVJNCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztWWUtTVU5TS0lZOlVOS05PV046UlUtVllOCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztHQUdJTlNLSVk6VU5LTk9XTjpSVS1HR1MKK1JVU1NJQTpUQ0hPVVZBQ0hTS0HvQSBSRVNQT1VCTElLO0lCUkVTSU5TS0lZOlVOS05PV046UlUtSUJOCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztLVUxFQkFLSTpVTktOT1dOOlJVLUtMQgorUlVTU0lBOlRDSE9VVkFDSFNLQe9BIFJFU1BPVUJMSUs7UE9SRVRTS0lZOlVOS05PV046UlUtUFI1CitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztTSEFUS09WU0tJWTpVTktOT1dOOlJVLVNIMworUlVTU0lBOlRDSE9VVkFDSFNLQe9BIFJFU1BPVUJMSUs7S09NU09NT0xTS0lZOlVOS05PV046UlUtS01ZCitSVVNTSUE6VENIT1VWQUNIU0tB70EgUkVTUE9VQkxJSztZQUxDSElLU0tJWTpVTktOT1dOOlJVLVlMSworUlVTU0lBOk5JSkVHT1JPRFNLQe9BIE9CTEFTVCAoR087VllLU0E6VU5LTk9XTjpSVS1WWVMKK1JVU1NJQTpOSUpFR09ST0RTS0HvQSBPQkxBU1QgKEdPO0RJVkVZRVZTS0lZOlVOS05PV046UlUtRFZWCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztCT0xTSEVCT0xESU5TS0lZOlVOS05PV046UlUtQkw0CitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztMVUtPWUFOT1ZTS0lZOlVOS05PV046UlUtTEtWCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztQRVJWT01BWVNLSVk6VU5LTk9XTjpSVS1QUjYKK1JVU1NJQTpNT1JET1ZTS0HvQSBSRVNQT1VCTElLQTtCT0xTSEVJR05BVE9WU0tJWTpVTktOT1dOOlJVLUJMVgorUlVTU0lBOlRDSE9VVkFDSFNLQe9BIFJFU1BPVUJMSUs7QkFUWVJFVlNLSVk6VU5LTk9XTjpSVS1CVFYKK1JVU1NJQTpUQ0hPVVZBQ0hTS0HvQSBSRVNQT1VCTElLO0FMQVRZUlNLSVk6VU5LTk9XTjpSVS1BTFIKK1JVU1NJQTpOSUpFR09ST0RTS0HvQSBPQkxBU1QgKEdPO1ZPWk5FU0VOU0tJWTpVTktOT1dOOlJVLVZaTgorUlVTU0lBOk1PUkRPVlNLQe9BIFJFU1BPVUJMSUtBO0FSREFUT1ZTS0lZOlVOS05PV046UlUtQVJLCitSVVNTSUE6TU9SRE9WU0tB70EgUkVTUE9VQkxJS0E7VEVNTklLT1ZTS0lZOlVOS05PV046UlUtVE1ZCitSVVNTSUE6TklKRUdPUk9EU0tB70EgT0JMQVNUIChHTztQT0NISU5LT1ZTS0lZOlVOS05PV046UlUtUENTCitSVVNTSUE6VENIT1VWQUNIU0tB70EgUkVTUE9VQkxJSztTSEVNVVJTSElOU0tJWTpVTktOT1dOOlJVLVNISAorUlVTU0lBOlRDSE9VVkFDSFNLQe9BIFJFU1BPVUJMSUs7QUxBVFlSJzpVTktOT1dOOlJVLUFMIAorUlVTU0lBOk1PUkRPVlNLQe9BIFJFU1BPVUJMSUtBO1RFTkdVU0hFVlNLSVk6VU5LTk9XTjpSVS1UTksKK1JVU1NJQTpNT1JET1ZTS0HvQSBSRVNQT1VCTElLQTtJQ0hBTEtPVlNLSVk6VU5LTk9XTjpSVS1JQ1YKK1JVU1NJQTpNT1JET1ZTS0HvQSBSRVNQT1VCTElLQTtZRUxOSUtPVlNLSVk6VU5LTk9XTjpSVS1ZTEkKK1JVU1NJQTpNT1JET1ZTS0HvQSBSRVNQT1VCTElLQTtBVFlBU0hFVlNLSVk6VU5LTk9XTjpSVS1BVFYKK1JVU1NJQTpNT1JET1ZTS0HvQSBSRVNQT1VCTElLQTtDSEFNWklOU0tJWTpVTktOT1dOOlJVLUNIMQorUlVTU0lBOk1PUkRPVlNLQe9BIFJFU1BPVUJMSUtBO1NUQVJPU0hBWUdPVlNLSVk6VU5LTk9XTjpSVS1TVEcKK1JVU1NJQTpNT1JET1ZTS0HvQSBSRVNQT1VCTElLQTtST01PREFOT1ZTS0lZOlVOS05PV046UlUtUk1WCitSVVNTSUE6TU9SRE9WU0tB70EgUkVTUE9VQkxJS0E7S1JBU05PU0xPQk9EU0tJWTpVTktOT1dOOlJVLUtSOQorUlVTU0lBOk1PUkRPVlNLQe9BIFJFU1BPVUJMSUtBO0RVQkVOU0tJWTpVTktOT1dOOlJVLURCUworUlVTU0lBOk1PUkRPVlNLQe9BIFJFU1BPVUJMSUtBO0xZQU1CSVJTS0lZOlVOS05PV046UlUtTFlSCitSVVNTSUE6TU9SRE9WU0tB70EgUkVTUE9VQkxJS0E7QVRZVVJJWUVWU0tJWTpVTktOT1dOOlJVLUFUUworUlVTU0lBOk1PUkRPVlNLQe9BIFJFU1BPVUJMSUtBO1pVQk9WTy1QT0xZQU5TS0lZOlVOS05PV046UlUtWkJMCitSVVNTSUE6TU9SRE9WU0tB70EgUkVTUE9VQkxJS0E7VE9SQkVZRVZTS0lZOlVOS05PV046UlUtVFJTCitSVVNTSUE6TU9SRE9WU0tB70EgUkVTUE9VQkxJS0E7Qk9MU0hFQkVSRVpOSUtPVlNLSVk6VU5LTk9XTjpSVS1CTFoKK1JVU1NJQTpNT1JET1ZTS0HvQSBSRVNQT1VCTElLQTtLT1ZZTEtJTlNLSVk6VU5LTk9XTjpSVS1LVlMKK1JVU1NJQTpNT1JET1ZTS0HvQSBSRVNQT1VCTElLQTtLQURPU0hLSU5TS1k6VU5LTk9XTjpSVS1LREsKK1JVU1NJQTpNT1JET1ZTS0HvQSBSRVNQT1VCTElLQTtSVVpBWUVWU0tJWTpVTktOT1dOOlJVLVJaVgorUlVTU0lBOk1PUkRPVlNLQe9BIFJFU1BPVUJMSUtBO1NBUkFOU0s6VU5LTk9XTjpSVS1TUksKK1JVU1NJQTpNT1JET1ZTS0HvQSBSRVNQT1VCTElLQTtLT0NIS1VST1ZTS0lZOlVOS05PV046UlUtS0NWCitSVVNTSUE6TU9SRE9WU0tB70EgUkVTUE9VQkxJS0E7UlVaQUVWS0E6VU5LTk9XTjpSVS1SWksKK1JVU1NJQTpNT1JET1ZTS0HvQSBSRVNQT1VCTElLQTtLT1ZZTEtJTk86VU5LTk9XTjpSVS1LVksKK1JVU1NJQTpNT1JET1ZTS0HvQSBSRVNQT1VCTElLQTtJTlNBUlNLSVk6VU5LTk9XTjpSVS1JTlMKK1JVU1NJQTpUQe9NWVJTS0kgTkFUSU9OQUwgT0tST1VHO0RJS1NPTlNLSVk6VU5LTk9XTjpSVS1ES04KK1JVU1NJQTpUQe9NWVJTS0kgTkFUSU9OQUwgT0tST1VHO0tIQVRBTkdTS0lZOlVOS05PV046UlUtS0hHCitSVVNTSUE6VEHvTVlSU0tJIE5BVElPTkFMIE9LUk9VRztEVURJTktBOlVOS05PV046UlUtREROCitSVVNTSUE6VEHvTVlSU0tJIE5BVElPTkFMIE9LUk9VRztVU1QtWUVOSVNFWVNLSVk6VU5LTk9XTjpSVS1VU0UKK1JVU1NJQTpFVkVOS0lTS0kgTkFUSU9OQUwgT0tST1VHO0JBWUtJVFNLSVk6VU5LTk9XTjpSVS1CWVQKK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO1RVUlVLSEFOU0tJWTpVTktOT1dOOlJVLVRSSQorUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7SUdBUktBOlVOS05PV046UlUtSUdSCitSVVNTSUE6SVJLT1VUU0tB70EgT0JMQVNUIFLpU0lEVTtLQVRBTkdTS0lZOlVOS05PV046UlUtS1RHCitSVVNTSUE6RVZFTktJU0tJIE5BVElPTkFMIE9LUk9VRztJTElNUElZU0tJWTpVTktOT1dOOlJVLUlMWQorUlVTU0lBOkVWRU5LSVNLSSBOQVRJT05BTCBPS1JPVUc7VFVOR1VTU0tPLUNIVU5TS0lZOlVOS05PV046UlUtVE5DCitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtZRU5JU0VZU0tJWTpVTktOT1dOOlJVLVlOWQorUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7U0VWRVJPLVlFTklTRVlTS0lZOlVOS05PV046UlUtU1ZFCitSVVNTSUE6SVJLT1VUU0tB70EgT0JMQVNUIFLpU0lEVTtCT0RBWUJJTlNLSVk6VU5LTk9XTjpSVS1CRE4KK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO0JPR1VDSEFOU0tJWTpVTktOT1dOOlJVLUJHTgorUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7S0VaSEVNU0tJWTpVTktOT1dOOlJVLUtaUworUlVTU0lBOklSS09VVFNLQe9BIE9CTEFTVCBS6VNJRFU7TUFNU0tPLUNIVVlTS0lZOlVOS05PV046UlUtTU1ICitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtNT1RZR0lOU0tJWTpVTktOT1dOOlJVLU1UTgorUlVTU0lBOklSS09VVFNLQe9BIE9CTEFTVCBS6VNJRFU7VVNULUlMSU1TS0lZOlVOS05PV046UlUtVVM1CitSVVNTSUE6SVJLT1VUU0tB70EgT0JMQVNUIFLpU0lEVTtLSVJFTlNLSVk6VU5LTk9XTjpSVS1LRVMKK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO0VOSVNFWVNLOlVOS05PV046UlUtRU5ZCitSVVNTSUE6VENISVRJTlNLQe9BIE9CTEFTVCBS6VNJRDtLQUxBUlNLSVk6VU5LTk9XTjpSVS1LTEkKK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO0xFU09TSUJJUlNLOlVOS05PV046UlUtTFNCCitSVVNTSUE6SVJLT1VUU0tB70EgT0JMQVNUIFLpU0lEVTtDSFVOU0tJWTpVTktOT1dOOlJVLUNIMgorUlVTU0lBOklSS09VVFNLQe9BIE9CTEFTVCBS6VNJRFU7VVNUJy1JTElNU0s6VU5LTk9XTjpSVS1VUzYKK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO1BJUk9WU0tJWTpVTktOT1dOOlJVLVBSNworUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7S0FaQUNISU5TS0lZOlVOS05PV046UlUtS1pOCitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtCSVJJTFlVU1NLSVk6VU5LTk9XTjpSVS1CUlkKK1JVU1NJQTpJUktPVVRTS0HvQSBPQkxBU1QgUulTSURVO0JPREFZQk86VU5LTk9XTjpSVS1CRFkKK1JVU1NJQTpJUktPVVRTS0HvQSBPQkxBU1QgUulTSURVO05JWkhORUlMSU1TS0lZOlVOS05PV046UlUtTlpJCitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtUWVVLSFRFVFNLSVk6VU5LTk9XTjpSVS1UWVQKK1JVU1NJQTpJUktPVVRTS0HvQSBPQkxBU1QgUulTSURVO1RBWVNIRVRTS0lZOlVOS05PV046UlUtVFlLCitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtUQVNFWUVWU0tJWTpVTktOT1dOOlJVLVRTVgorUlVTU0lBOklSS09VVFNLQe9BIE9CTEFTVCBS6VNJRFU7S0FaQUNISU5TS08tTEVOU0tJWTpVTktOT1dOOlJVLUtaTAorUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7QUJBTlNLSVk6VU5LTk9XTjpSVS1BQksKK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO0JPTFNIRU1VUlRJTlNLSVk6VU5LTk9XTjpSVS1CTDUKK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO0RaRVJaSElOU0tJWTpVTktOT1dOOlJVLURaTgorUlVTU0lBOkJPVVJJQVRJQTtTRVZFUk8tQkFZS0FMU0tJWTpVTktOT1dOOlJVLVNWTAorUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7U1VLSE9CVVpJTVNLSVk6VU5LTk9XTjpSVS1TS1oKK1JVU1NJQTpJUktPVVRTS0HvQSBPQkxBU1QgUulTSURVO0JSQVRTS0lZOlVOS05PV046UlUtQlIgCitSVVNTSUE6Qk9VUklBVElBO01VWVNLSVk6VU5LTk9XTjpSVS1NWUsKK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO1lFTUVMWUFOT1ZTS0lZOlVOS05PV046UlUtWU1OCitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtCT0xTSEVVTFVZU0tJWTpVTktOT1dOOlJVLUJMVQorUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7S09aVUxTS1k6VU5LTk9XTjpSVS1LWksKK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO05JWkhORUlOR0FTSFNLSVk6VU5LTk9XTjpSVS1OWkcKK1JVU1NJQTpJUktPVVRTS0HvQSBPQkxBU1QgUulTSURVO1VTVCctS1VUOlVOS05PV046UlUtVVNVCitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtLQU5TS0lZOlVOS05PV046UlUtS05ZCitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtBQ0hJTlNLSVk6VU5LTk9XTjpSVS1BQ1MKK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO0JPR09UT0xTS0lZOlVOS05PV046UlUtQkdMCitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtJTEFOU0tJWTpVTktOT1dOOlJVLUlMUworUlVTU0lBOklSS09VVFNLQe9BIE9CTEFTVCBS6VNJRFU7VVNULVVESU5TS0lZOlVOS05PV046UlUtVVM3CitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtSWUJJTlNLSVk6VU5LTk9XTjpSVS1SWVMKK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO0FDSElOU0s6VU5LTk9XTjpSVS1BQ04KK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO0JFUllPWk9WU0tJWTpVTktOT1dOOlJVLUJSMQorUlVTU0lBOklSS09VVFNLQe9BIE9CTEFTVCBS6VNJRFU7QlJBVFNLOlVOS05PV046UlUtQlJUCitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtCT0dPVE9MOlVOS05PV046UlUtQkdUCitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtVWUFSU0tJWTpVTktOT1dOOlJVLVVZUworUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7S0FOU0s6VU5LTk9XTjpSVS1LQUsKK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO1NPU05PVk9CT1JTSzpVTktOT1dOOlJVLVNTQgorUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7S1JBU05PWUFSU0s6VU5LTk9XTjpSVS1LQVkKK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO05BWkFST1ZTS0lZOlVOS05PV046UlUtTlpTCitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtNQU5TS0lZOlVOS05PV046UlUtTU5LCitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtOQVpBUk9WTzpVTktOT1dOOlJVLU5aUgorUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7U0hBUllQT1ZTS0lZOlVOS05PV046UlUtU0g0CitSVVNTSUE6SVJLT1VUU0tB70EgT0JMQVNUIFLpU0lEVTtOSVpITkVVRElOU0tJWTpVTktOT1dOOlJVLU5aRAorUlVTU0lBOlRDSElUSU5TS0HvQSBPQkxBU1QgUulTSUQ7VFVOR0lSTy1PTEVLTUlOU0tJWTpVTktOT1dOOlJVLVROTQorUlVTU0lBOklSS09VVFNLQe9BIE9CTEFTVCBS6VNJRFU7VEFZU0hFVDpVTktOT1dOOlJVLVRZSAorUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7RElWTk9HT1JTSzpVTktOT1dOOlJVLURWRworUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7WkFPWkVSTllJOlVOS05PV046UlUtWk9SCitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtJUkJFWVNLSVk6VU5LTk9XTjpSVS1JUlMKK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO0JPUk9ESU5POlVOS05PV046UlUtQlJOCitSVVNTSUE6SVJLT1VUU0tB70EgT0JMQVNUIFLpU0lEVTtaSElHQUxPVlNLSVk6VU5LTk9XTjpSVS1aSFMKK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO0JBTEFLSFRJTlNLSVk6VU5LTk9XTjpSVS1CTDYKK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO1VaSFVSU0tJWTpVTktOT1dOOlJVLVVaUworUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7U0FZQU5TS0lZOlVOS05PV046UlUtU1lJCitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtQQVJUSVpBTlNLSVk6VU5LTk9XTjpSVS1QUjgKK1JVU1NJQTpCT1VSSUFUSUE7U0VWRVJPQkFZS0FMU0s6VU5LTk9XTjpSVS1TVjEKK1JVU1NJQTpCT1VSSUFUSUE7S1VSVU1LQU5TS0lZOlVOS05PV046UlUtS1VOCitSVVNTSUE6SVJLT1VUU0tB70EgT0JMQVNUIFLpU0lEVTtCQUxBR0FOU0tJWTpVTktOT1dOOlJVLUJMNworUlVTU0lBOlJFU1AuIEtIQUtBU1NJQTtPUkRaSE9OSUtJRFpFVlNLSVk6VU5LTk9XTjpSVS1PUloKK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO05PVk9TRUxPVlNLSVk6VU5LTk9XTjpSVS1OViAKK1JVU1NJQTpJUktPVVRTS0HvQSBPQkxBU1QgUulTSURVO0tVWVRVTlNLSVk6VU5LTk9XTjpSVS1LWU4KK1JVU1NJQTpJUktPVVRTS0HvQSBPQkxBU1QgUulTSURVO1RVTFVOU0tJWTpVTktOT1dOOlJVLVRMSworUlVTU0lBOklSS09VVFNLQe9BIE9CTEFTVCBS6VNJRFU7S0FDSFVHU0tJWTpVTktOT1dOOlJVLUtDUworUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7SURSSU5TS0lZOlVOS05PV046UlUtSURTCitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtLVVJBR0lOU0tJWTpVTktOT1dOOlJVLUtBTgorUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7S1JBU05PVFVSQU5TS0lZOlVOS05PV046UlUtS0FSCitSVVNTSUE6SVJLT1VUU0tB70EgT0JMQVNUIFLpU0lEVTtOSVpITkVVRElOU0s6VU5LTk9XTjpSVS1OWksKK1JVU1NJQTpSRVNQLiBLSEFLQVNTSUE7U0hJUklOU0tJWTpVTktOT1dOOlJVLVNINQorUlVTU0lBOlJFU1AuIEtIQUtBU1NJQTtCT0dSQURTS0lZOlVOS05PV046UlUtQkdJCitSVVNTSUE6SVJLT1VUU0tB70EgT0JMQVNUIFLpU0lEVTtUVUxVTjpVTktOT1dOOlJVLVRVTgorUlVTU0lBOklSS09VVFNLQe9BIE9CTEFTVCBS6VNJRFU7T0xLSE9OU0tJWTpVTktOT1dOOlJVLU9MIAorUlVTU0lBOlRDSElUSU5TS0HvQSBPQkxBU1QgUulTSUQ7TU9HT0NISU5TS0lZOlVOS05PV046UlUtTUdOCitSVVNTSUE6SVJLT1VUU0tB70EgT0JMQVNUIFLpU0lEVTtaSU1JTlNLSVk6VU5LTk9XTjpSVS1aTVMKK1JVU1NJQTpSRVNQLiBLSEFLQVNTSUE7VVNULUFCQUtBTlNLSVk6VU5LTk9XTjpSVS1VU0EKK1JVU1NJQTpCT1VSSUFUSUE7QkFSR1VaSU5TS0lZOlVOS05PV046UlUtQlIyCitSVVNTSUE6T1VTVCctT1JEWU5TS0kgTkFUSU9OQUwgTztOVUtVVFNLSVk6VU5LTk9XTjpSVS1OS0kKK1JVU1NJQTpPVVNUJy1PUkRZTlNLSSBOQVRJT05BTCBPO09TSU5TS0lZOlVOS05PV046UlUtT1NTCitSVVNTSUE6S1JBU05P70FSU0tJIEtSQe8gUulTSURVRTtNSU5VU0lOU0tJWTpVTktOT1dOOlJVLU1OTgorUlVTU0lBOklSS09VVFNLQe9BIE9CTEFTVCBS6VNJRFU7U0FZQU5TSzpVTktOT1dOOlJVLVNZIAorUlVTU0lBOklSS09VVFNLQe9BIE9CTEFTVCBS6VNJRFU7WklNQTpVTktOT1dOOlJVLVpJTQorUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7S0FSQVRVWlNLSVk6VU5LTk9XTjpSVS1LQVoKK1JVU1NJQTpJUktPVVRTS0HvQSBPQkxBU1QgUulTSURVO1pBTEFSSU5TS0lZOlVOS05PV046UlUtWkxOCitSVVNTSUE6T1VTVCctT1JEWU5TS0kgTkFUSU9OQUwgTztBTEFSU0tJWTpVTktOT1dOOlJVLUFMMQorUlVTU0lBOlJFU1AuIEtIQUtBU1NJQTtDSEVSTk9HT1JTSzpVTktOT1dOOlJVLUNIRworUlVTU0lBOlJFU1AuIEtIQUtBU1NJQTtBU0tJWlNLSVk6VU5LTk9XTjpSVS1BU1MKK1JVU1NJQTpCT1VSSUFUSUE7WUVSQVZOSU5TS0lZOlVOS05PV046UlUtWVJJCitSVVNTSUE6UkVTUC4gS0hBS0FTU0lBO0FMVEFZU0tJWTpVTktOT1dOOlJVLUFMMgorUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7TUlOVVNJTlNLOlVOS05PV046UlUtTU5TCitSVVNTSUE6VENISVRJTlNLQe9BIE9CTEFTVCBS6VNJRDtDSEVSTllTSEVWU0tJWTpVTktOT1dOOlJVLUNIMworUlVTU0lBOlJFU1AuIEtIQUtBU1NJQTtBQkFLQU46VU5LTk9XTjpSVS1BQkEKK1JVU1NJQTpUT1VWQSBSRVNQT1VCTElLQTtUT0RaSElOU0tJWTpVTktOT1dOOlJVLVRETgorUlVTU0lBOktSQVNOT+9BUlNLSSBLUkHvIFLpU0lEVUU7U0hVU0hFTlNLSVk6VU5LTk9XTjpSVS1TSDYKK1JVU1NJQTpPVVNUJy1PUkRZTlNLSSBOQVRJT05BTCBPO0JPS0hBTlNLSVk6VU5LTk9XTjpSVS1CS04KK1JVU1NJQTpLUkFTTk/vQVJTS0kgS1JB7yBS6VNJRFVFO1lFUk1BS09WU0tJWTpVTktOT1dOOlJVLVlSVgorUlVTU0lBOk9VU1QnLU9SRFlOU0tJIE5BVElPTkFMIE87RUtISVJJVC1CVUxBR0FUU0tJWTpVTktOT1dOOlJVLUVLTAorUlVTU0lBOlRDSElUSU5TS0HvQSBPQkxBU1QgUulTSUQ7U1JFVEVOU0tJWTpVTktOT1dOOlJVLVNSSQorUlVTU0lBOlJFU1AuIEtIQUtBU1NJQTtCRVlTS0lZOlVOS05PV046UlUtQllLCitSVVNTSUE6Qk9VUklBVElBO09LSU5TS0lZOlVOS05PV046UlUtT0sxCitSVVNTSUE6Qk9VUklBVElBO1BSSUJBWUtBTFNLSVk6VU5LTk9XTjpSVS1QUkwKK1JVU1NJQTpUQ0hJVElOU0tB70EgT0JMQVNUIFLpU0lEO0dBWklNVVJPLSBaQVZPRFNLSVk6VU5LTk9XTjpSVS1HWloKK1JVU1NJQTpJUktPVVRTS0HvQSBPQkxBU1QgUulTSURVO0NIRVJFTUtIT1ZTS0lZOlVOS05PV046UlUtQ0g0CitSVVNTSUE6SVJLT1VUU0tB70EgT0JMQVNUIFLpU0lEVTtDSEVSRU1LSE9WTzpVTktOT1dOOlJVLUNINQorUlVTU0lBOlJFU1AuIEtIQUtBU1NJQTtUQVNIVFlQU0tJWTpVTktOT1dOOlJVLVRTUAorUlVTU0lBOlJFU1AuIEtIQUtBU1NJQTtTQVlBTk9HT1JTSzpVTktOT1dOOlJVLVNZRworUlVTU0lBOkJPVVJJQVRJQTtLSE9SSU5TS0lZOlVOS05PV046UlUtS0g0CitSVVNTSUE6VENISVRJTlNLQe9BIE9CTEFTVCBS6VNJRDtDSElUSU5TS0lZOlVOS05PV046UlUtQ0g2CitSVVNTSUE6SVJLT1VUU0tB70EgT0JMQVNUIFLpU0lEVTtJUktVVFNLSVk6VU5LTk9XTjpSVS1JUksKK1JVU1NJQTpJUktPVVRTS0HvQSBPQkxBU1QgUulTSURVO1VTT0xTS0lZOlVOS05PV046UlUtVVM4CitSVVNTSUE6VENISVRJTlNLQe9BIE9CTEFTVCBS6VNJRDtORVJDSElOU0tJWTpVTktOT1dOOlJVLU5SUworUlVTU0lBOlRPVVZBIFJFU1BPVUJMSUtBO1BJWS1LSFVNU0tJWTpVTktOT1dOOlJVLVBZTQorUlVTU0lBOklSS09VVFNLQe9BIE9CTEFTVCBS6VNJRFU7VVNPTFlFLVNJQklSU0tPRTpVTktOT1dOOlJVLVVTQgorUlVTU0lBOkJPVVJJQVRJQTtLQUJBTlNLSVk6VU5LTk9XTjpSVS1LQlMKK1JVU1NJQTpUQ0hJVElOU0tB70EgT0JMQVNUIFLpU0lEO0tBUllNU0tJWTpVTktOT1dOOlJVLUtZUworUlVTU0lBOlRDSElUSU5TS0HvQSBPQkxBU1QgUulTSUQ7TkVSQ0hJTlNLSVktWkFWT0RTS0lZOlVOS05PV046UlUtTlJaCitSVVNTSUE6SVJLT1VUU0tB70EgT0JMQVNUIFLpU0lEVTtBTkdBUlNLOlVOS05PV046UlUtQU4gCitSVVNTSUE6VE9VVkEgUkVTUE9VQkxJS0E7S1laWUxTS0lZOlVOS05PV046UlUtS1lLCitSVVNTSUE6VENISVRJTlNLQe9BIE9CTEFTVCBS6VNJRDtTSElMS0lOU0tJWTpVTktOT1dOOlJVLVNINworUlVTU0lBOklSS09VVFNLQe9BIE9CTEFTVCBS6VNJRFU7SVJLVVRTSzpVTktOT1dOOlJVLUlSVAorUlVTU0lBOlRPVVZBIFJFU1BPVUJMSUtBO0tBQS1IRU1TS0lZOlVOS05PV046UlUtS0FNCitSVVNTSUE6Qk9VUklBVElBO1pBSUdSQVlFVlNLSVk6VU5LTk9XTjpSVS1aSVYKK1JVU1NJQTpUQ0hJVElOU0tB70EgT0JMQVNUIFLpU0lEO0tISUxPS1NLSVk6VU5LTk9XTjpSVS1LSDUKK1JVU1NJQTpUT1VWQSBSRVNQT1VCTElLQTtTVVQtS0hPTFNLSVk6VU5LTk9XTjpSVS1TVEwKK1JVU1NJQTpUQ0hJVElOU0tB70EgT0JMQVNUIFLpU0lEO1NIRUxPUFVHSU5TS0lZOlVOS05PV046UlUtU0g4CitSVVNTSUE6SVJLT1VUU0tB70EgT0JMQVNUIFLpU0lEVTtTSEVMRUtIT1Y6VU5LTk9XTjpSVS1TSDkKK1JVU1NJQTpUQ0hJVElOU0tB70EgT0JMQVNUIFLpU0lEO0NISVRBOlVOS05PV046UlUtQ0g3CitSVVNTSUE6Qk9VUklBVElBO0lWT0xHSU5TS0lZOlVOS05PV046UlUtSVZTCitSVVNTSUE6VENISVRJTlNLQe9BIE9CTEFTVCBS6VNJRDtCQUxFWVNLSVk6VU5LTk9XTjpSVS1CTDgKK1JVU1NJQTpJUktPVVRTS0HvQSBPQkxBU1QgUulTSURVO1NMWVVEWUFOU0tJWTpVTktOT1dOOlJVLVNMTgorUlVTU0lBOkJPVVJJQVRJQTtUVU5LSU5TS0lZOlVOS05PV046UlUtVE5JCitSVVNTSUE6Qk9VUklBVElBO1VMQU4tVURFOlVOS05PV046UlUtVUxVCitSVVNTSUE6VE9VVkEgUkVTUE9VQkxJS0E7Q0hBQS1LSE9MU0tZOlVOS05PV046UlUtQ0hMCitSVVNTSUE6Qk9VUklBVElBO1RBUkJBR0FUQVlTS0lZOlVOS05PV046UlUtVFJUCitSVVNTSUE6VE9VVkEgUkVTUE9VQkxJS0E7S1laWUw6VU5LTk9XTjpSVS1LWVkKK1JVU1NJQTpUQ0hJVElOU0tB70EgT0JMQVNUIFLpU0lEO1VMRVRPVlNLSVk6VU5LTk9XTjpSVS1VTFYKK1JVU1NJQTpUT1VWQSBSRVNQT1VCTElLQTtCQVJVTi1LSEVNQ0hJTlNLSVk6VU5LTk9XTjpSVS1CUk0KK1JVU1NJQTpBR1VJTlNLSSBOQVRJT05BTCBPS1JPVUc7TU9HT1lUVVlTS0lZOlVOS05PV046UlUtTUdZCitSVVNTSUE6VENISVRJTlNLQe9BIE9CTEFTVCBS6VNJRDtCQUxFWTpVTktOT1dOOlJVLUJBWQorUlVTU0lBOlRPVVZBIFJFU1BPVUJMSUtBO0JBWS1UQVlHSU5TS0lZOlVOS05PV046UlUtQllHCitSVVNTSUE6VE9VVkEgUkVTUE9VQkxJS0E7VEFORElOU0tJWTpVTktOT1dOOlJVLVROWQorUlVTU0lBOkJPVVJJQVRJQTtTRUxFTkdJTlNLSVk6VU5LTk9XTjpSVS1TTFMKK1JVU1NJQTpUT1VWQSBSRVNQT1VCTElLQTtDSEVESS1LSE9MU0tZOlVOS05PV046UlUtQ0g4CitSVVNTSUE6VENISVRJTlNLQe9BIE9CTEFTVCBS6VNJRDtBTEVYQU5EUk9WTy1aQVZPRFNLSVk6VU5LTk9XTjpSVS1BTFoKK1JVU1NJQTpUQ0hJVElOU0tB70EgT0JMQVNUIFLpU0lEO1BFVFJPVlNLLVpBQkFZS0FMU0tJWTpVTktOT1dOOlJVLVBUQgorUlVTU0lBOlRPVVZBIFJFU1BPVUJMSUtBO0RaVU4tS0hFTUNISU5TS0lZOlVOS05PV046UlUtRFpDCitSVVNTSUE6VENISVRJTlNLQe9BIE9CTEFTVCBS6VNJRDtPTE9WWUFOTklOU0tJWTpVTktOT1dOOlJVLU9MMQorUlVTU0lBOkJPVVJJQVRJQTtNVUtIT1JTSElCSVJTS0lZOlVOS05PV046UlUtTUtCCitSVVNTSUE6VENISVRJTlNLQe9BIE9CTEFTVCBS6VNJRDtLQUxHQU5TS0lZOlVOS05PV046UlUtS0xOCitSVVNTSUE6QUdVSU5TS0kgTkFUSU9OQUwgT0tST1VHO0FHSU5TS0lZOlVOS05PV046UlUtQUdTCitSVVNTSUE6Qk9VUklBVElBO1pBS0FNRU5TS0lZOlVOS05PV046UlUtWktOCitSVVNTSUE6Qk9VUklBVElBO0RaSElESU5TS0lZOlVOS05PV046UlUtRFpTCitSVVNTSUE6Qk9VUklBVElBO0dVU0lOT09aRVJTSzpVTktOT1dOOlJVLUdTWgorUlVTU0lBOlRDSElUSU5TS0HvQSBPQkxBU1QgUulTSUQ7UEVUUk9WU0stWkFCQVlLQUxTS1k6VU5LTk9XTjpSVS1QVEEKK1JVU1NJQTpBR1VJTlNLSSBOQVRJT05BTCBPS1JPVUc7RFVMRFVSR0lOU0tJWTpVTktOT1dOOlJVLURMSQorUlVTU0lBOlRPVVZBIFJFU1BPVUJMSUtBO09WWVVSU0tJWTpVTktOT1dOOlJVLU9WUworUlVTU0lBOlRDSElUSU5TS0HvQSBPQkxBU1QgUulTSUQ7Qk9SWklOU0tJWTpVTktOT1dOOlJVLUJSMworUlVTU0lBOlRPVVZBIFJFU1BPVUJMSUtBO1RFUy1LSEVNU0tJWTpVTktOT1dOOlJVLVRTTQorUlVTU0lBOkJPVVJJQVRJQTtCSUNIVVJTS0lZOlVOS05PV046UlUtQkNSCitSVVNTSUE6VENISVRJTlNLQe9BIE9CTEFTVCBS6VNJRDtQUklBUkdVTlNLSVk6VU5LTk9XTjpSVS1QUjkKK1JVU1NJQTpCT1VSSUFUSUE7S1lBS0hUSU5TS0lZOlVOS05PV046UlUtS1lJCitSVVNTSUE6VENISVRJTlNLQe9BIE9CTEFTVCBS6VNJRDtLUkFTTk9DSElLT1lTS0lZOlVOS05PV046UlUtS0FPCitSVVNTSUE6VE9VVkEgUkVTUE9VQkxJS0E7RVJaSU5TS0lZOlVOS05PV046UlUtRVJLCitSVVNTSUE6VE9VVkEgUkVTUE9VQkxJS0E7TU9OR1VOLVRBWUdJTlNLSVk6VU5LTk9XTjpSVS1NTlkKK1JVU1NJQTpUQ0hJVElOU0tB70EgT0JMQVNUIFLpU0lEO0FLU0hJTlNLSVk6VU5LTk9XTjpSVS1BS04KK1JVU1NJQTpUQ0hJVElOU0tB70EgT0JMQVNUIFLpU0lEO09OT05TS0lZOlVOS05PV046UlUtT05LCitSVVNTSUE6VENISVRJTlNLQe9BIE9CTEFTVCBS6VNJRDtLUkFTTk9LQU1FTlNLSVk6VU5LTk9XTjpSVS1LQUUKK1JVU1NJQTpUQ0hJVElOU0tB70EgT0JMQVNUIFLpU0lEO0tZUklOU0tJWTpVTktOT1dOOlJVLUtZIAorUlVTU0lBOlRDSElUSU5TS0HvQSBPQkxBU1QgUulTSUQ7Qk9SWllBOlVOS05PV046UlUtQk9aCitSVVNTSUE6VENISVRJTlNLQe9BIE9CTEFTVCBS6VNJRDtaQUJBWUtBTFNLSVk6VU5LTk9XTjpSVS1aQlMKK1JVU1NJQTpUQ0hJVElOU0tB70EgT0JMQVNUIFLpU0lEO0tSQVNOT0tBTUVOU0s6VU5LTk9XTjpSVS1LQSAKK1JVU1NJQTpLT1NUUk9NU0tB70EgT0JMQVNUO1ZPS0hPTVNLSVk6VU5LTk9XTjpSVS1WS00KK1JVU1NJQTpLT1NUUk9NU0tB70EgT0JMQVNUO1NPTElHQUxJQ0hTS0lZOlVOS05PV046UlUtU0xLCitSVVNTSUE6S09TVFJPTVNLQe9BIE9CTEFTVDtQQVZJTlNLSVk6VU5LTk9XTjpSVS1QVksKK1JVU1NJQTpLT1NUUk9NU0tB70EgT0JMQVNUO09LVFlBQlJTS0lZOlVOS05PV046UlUtT0syCitSVVNTSUE6S09TVFJPTVNLQe9BIE9CTEFTVDtDSFVLSExPTVNLSVk6VU5LTk9XTjpSVS1DSE0KK1JVU1NJQTpLT1NUUk9NU0tB70EgT0JMQVNUO0tPTE9HUklWU0tJWTpVTktOT1dOOlJVLUtMVgorUlVTU0lBOktPU1RST01TS0HvQSBPQkxBU1Q7TUVaSEVWU0tJWTpVTktOT1dOOlJVLU1aSworUlVTU0lBOktPU1RST01TS0HvQSBPQkxBU1Q7UFlTQ0hVR1NLSVk6VU5LTk9XTjpSVS1QWUcKK1JVU1NJQTpLT1NUUk9NU0tB70EgT0JMQVNUO0JVWVNLSVk6VU5LTk9XTjpSVS1CWUkKK1JVU1NJQTpJQVJPU0xBVlNLQe9BIE9CTEFTVDtQT1NIRUtIT05TS0lZOlVOS05PV046UlUtUFNOCitSVVNTSUE6SUFST1NMQVZTS0HvQSBPQkxBU1Q7UEVSVk9NQVlTS0lZOlVOS05PV046UlUtUFZZCitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtWRVNZRUdPTlNLSVk6VU5LTk9XTjpSVS1WU0sKK1JVU1NJQTpLT1NUUk9NU0tB70EgT0JMQVNUO1BBUkZFTllFVlNLSVk6VU5LTk9XTjpSVS1QRlYKK1JVU1NJQTpLT1NUUk9NU0tB70EgT0JMQVNUO1NIQVJZSU5TS0lZOlVOS05PV046UlUtU0FOCitSVVNTSUE6S09TVFJPTVNLQe9BIE9CTEFTVDtORVlTS0lZOlVOS05PV046UlUtTllLCitSVVNTSUE6S09TVFJPTVNLQe9BIE9CTEFTVDtQT05BWllSRVZTS0lZOlVOS05PV046UlUtUE5LCitSVVNTSUE6S09TVFJPTVNLQe9BIE9CTEFTVDtHQUxJQ0hTS0lZOlVOS05PV046UlUtR0xICitSVVNTSUE6SUFST1NMQVZTS0HvQSBPQkxBU1Q7QlJFWVRPVlNLSVk6VU5LTk9XTjpSVS1CUjQKK1JVU1NJQTpUVkVSU0tB70EgT0JMQVNUIChLQUxJTklOO1NBTkRPVlNLSVk6VU5LTk9XTjpSVS1TTlYKK1JVU1NJQTpLT1NUUk9NU0tB70EgT0JMQVNUO01BTlRVUk9WU0tJWTpVTktOT1dOOlJVLU1OSQorUlVTU0lBOklBUk9TTEFWU0tB70EgT0JMQVNUO0xZVUJJTVNLSVk6VU5LTk9XTjpSVS1MWU0KK1JVU1NJQTpLT1NUUk9NU0tB70EgT0JMQVNUO0FOVFJPUE9WU0tJWTpVTktOT1dOOlJVLUFOVgorUlVTU0lBOktPU1RST01TS0HvQSBPQkxBU1Q7QlVZOlVOS05PV046UlUtQlVZCitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtMRVNOT1k6VU5LTk9XTjpSVS1MRU4KK1JVU1NJQTpLT1NUUk9NU0tB70EgT0JMQVNUO1NIQVJZQTpVTktOT1dOOlJVLVNIQQorUlVTU0lBOktPU1RST01TS0HvQSBPQkxBU1Q7R0FMSVRDSDpVTktOT1dOOlJVLUdMVAorUlVTU0lBOklBUk9TTEFWU0tB70EgT0JMQVNUO0RBTklMT1ZTS0lZOlVOS05PV046UlUtRE5TCitSVVNTSUE6SUFST1NMQVZTS0HvQSBPQkxBU1Q7UllCSU5TS0lZOlVOS05PV046UlUtUllJCitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtLUkFTTk9LSE9MTVNLSVk6VU5LTk9XTjpSVS1LQUwKK1JVU1NJQTpLT1NUUk9NU0tB70EgT0JMQVNUO01BTlRVUk9WTzpVTktOT1dOOlJVLU1OUgorUlVTU0lBOlRWRVJTS0HvQSBPQkxBU1QgKEtBTElOSU47TU9MT0tPVlNLSVk6VU5LTk9XTjpSVS1NTFMKK1JVU1NJQTpLT1NUUk9NU0tB70EgT0JMQVNUO0tPU1RST01TS09ZOlVOS05PV046UlUtS1NNCitSVVNTSUE6S09TVFJPTVNLQe9BIE9CTEFTVDtORVlBOlVOS05PV046UlUtTkVZCitSVVNTSUE6S09TVFJPTVNLQe9BIE9CTEFTVDtTVVNBTklOU0tJWTpVTktOT1dOOlJVLVNTSworUlVTU0lBOklBUk9TTEFWU0tB70EgT0JMQVNUO1RVVEFZRVZTS0lZOlVOS05PV046UlUtVFRWCitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtVRE9NRUxTS0lZOlVOS05PV046UlUtVURMCitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtCT0xPR09WU0tJWTpVTktOT1dOOlJVLUJMOQorUlVTU0lBOktPU1RST01TS0HvQSBPQkxBU1Q7TUFLQVJZRVZTS0lZOlVOS05PV046UlUtTUtJCitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtNQUtTQVRJS0hJTlNLSVk6VU5LTk9XTjpSVS1NS0gKK1JVU1NJQTpJQVJPU0xBVlNLQe9BIE9CTEFTVDtORUtPVVpTS0lZOlVOS05PV046UlUtTktaCitSVVNTSUE6S09TVFJPTVNLQe9BIE9CTEFTVDtPU1RST1ZTS0lZOlVOS05PV046UlUtT1NWCitSVVNTSUE6S09TVFJPTVNLQe9BIE9CTEFTVDtTVURJU0xBVlNLSVk6VU5LTk9XTjpSVS1TRFYKK1JVU1NJQTpUVkVSU0tB70EgT0JMQVNUIChLQUxJTklOO0JFWkhFVFNLSVk6VU5LTk9XTjpSVS1CWlQKK1JVU1NJQTpLT1NUUk9NU0tB70EgT0JMQVNUO0tBRFlJU0tJWTpVTktOT1dOOlJVLUtESQorUlVTU0lBOklBUk9TTEFWU0tB70EgT0JMQVNUO1JZQklOU0s6VU5LTk9XTjpSVS1SWU4KK1JVU1NJQTpJQVJPU0xBVlNLQe9BIE9CTEFTVDtUVVRBRVY6VU5LTk9XTjpSVS1UVUUKK1JVU1NJQTpUVkVSU0tB70EgT0JMQVNUIChLQUxJTklOO1NPTktPVlNLSVk6VU5LTk9XTjpSVS1TTkkKK1JVU1NJQTpJQVJPU0xBVlNLQe9BIE9CTEFTVDtORUtSQVNPVlNLSVk6VU5LTk9XTjpSVS1OS1kKK1JVU1NJQTpJQVJPU0xBVlNLQe9BIE9CTEFTVDtNWVNIS0lOU0tJWTpVTktOT1dOOlJVLU1ZTgorUlVTU0lBOklBUk9TTEFWU0tB70EgT0JMQVNUO1lBUk9TTEFWU0tJWTpVTktOT1dOOlJVLVlSWQorUlVTU0lBOlRWRVJTS0HvQSBPQkxBU1QgKEtBTElOSU47Qk9MT0dPWUU6VU5LTk9XTjpSVS1CTEcKK1JVU1NJQTpJQVJPU0xBVlNLQe9BIE9CTEFTVDtCT0xTSEVTRUxTS0lZOlVOS05PV046UlUtQlNMCitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtVRE9NTFlBOlVOS05PV046UlUtVURZCitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtWWVNITkVWT0xPVFNLSVk6VU5LTk9XTjpSVS1WWU8KK1JVU1NJQTpLT1NUUk9NU0tB70EgT0JMQVNUO0tPU1RST01BOlVOS05PV046UlUtS1NPCitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtCRVpTSEVUU0s6VU5LTk9XTjpSVS1CWlMKK1JVU1NJQTpLT1NUUk9NU0tB70EgT0JMQVNUO0tSQVNOT1NFTFNLSVk6VU5LTk9XTjpSVS1LQUkKK1JVU1NJQTpJQVJPU0xBVlNLQe9BIE9CTEFTVDtVR0xJQ0hTS0lZOlVOS05PV046UlUtVUdICitSVVNTSUE6SVZBTk9WU0tB70EgT0JMQVNUO1pBVk9MWkhTS0lZOlVOS05PV046UlUtWlZICitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtLRVNPVk9HT1JTS0lZOlVOS05PV046UlUtS1NJCitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtGSVJPVlNLSVk6VU5LTk9XTjpSVS1GUlMKK1JVU1NJQTpJQVJPU0xBVlNLQe9BIE9CTEFTVDtZQVJPU0xBVkw6VU5LTk9XTjpSVS1ZUkwKK1JVU1NJQTpJVkFOT1ZTS0HvQSBPQkxBU1Q7S0lORVNIRU1TS0lZOlVOS05PV046UlUtS05NCitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtTUElST1ZTS0lZOlVOS05PV046UlUtU1BWCitSVVNTSUE6SVZBTk9WU0tB70EgT0JMQVNUO1NPS09MU0tJWTpVTktOT1dOOlJVLVNLSworUlVTU0lBOlRWRVJTS0HvQSBPQkxBU1QgKEtBTElOSU47S0FTSElOU0tJWTpVTktOT1dOOlJVLUtTWQorUlVTU0lBOktPU1RST01TS0HvQSBPQkxBU1Q7TkVSRUtIVFNLSVk6VU5LTk9XTjpSVS1OUlQKK1JVU1NJQTpJQVJPU0xBVlNLQe9BIE9CTEFTVDtCT1JJU09HTEVCU0tJWTpVTktOT1dOOlJVLUJSRQorUlVTU0lBOlRWRVJTS0HvQSBPQkxBU1QgKEtBTElOSU47TElLSE9TTEFWTFNLSVk6VU5LTk9XTjpSVS1MS0wKK1JVU1NJQTpUVkVSU0tB70EgT0JMQVNUIChLQUxJTklOO1ZZU0hOWSBWT0xPQ0hFSzpVTktOT1dOOlJVLVZZQworUlVTU0lBOlRWRVJTS0HvQSBPQkxBU1QgKEtBTElOSU47UkFNRVNIS09WU0tJWTpVTktOT1dOOlJVLVJNSworUlVTU0lBOklBUk9TTEFWU0tB70EgT0JMQVNUO1VHTElDSDpVTktOT1dOOlJVLVVHQworUlVTU0lBOklWQU5PVlNLQe9BIE9CTEFTVDtLSU5FU0hNQTpVTktOT1dOOlJVLUtOQQorUlVTU0lBOklBUk9TTEFWU0tB70EgT0JMQVNUO0dBVlJJTE9WLVlBTVNLSVk6VU5LTk9XTjpSVS1HVlkKK1JVU1NJQTpJVkFOT1ZTS0HvQSBPQkxBU1Q7UFJJVk9MWkhTS0lZOlVOS05PV046UlUtUFJICitSVVNTSUE6SVZBTk9WU0tB70EgT0JMQVNUO1ZJQ0hVR1NLSVk6VU5LTk9XTjpSVS1WQ0cKK1JVU1NJQTpUVkVSU0tB70EgT0JMQVNUIChLQUxJTklOO09TVEFTSEtPVlNLSVk6VU5LTk9XTjpSVS1PU0sKK1JVU1NJQTpJVkFOT1ZTS0HvQSBPQkxBU1Q7WVVSWUVWRVRTS0lZOlVOS05PV046UlUtWVJUCitSVVNTSUE6SUFST1NMQVZTS0HvQSBPQkxBU1Q7Uk9TVE9WU0tJWTpVTktOT1dOOlJVLVJTSworUlVTU0lBOktPU1RST01TS0HvQSBPQkxBU1Q7TkVSRUtIVEE6VU5LTk9XTjpSVS1OUksKK1JVU1NJQTpUVkVSU0tB70EgT0JMQVNUIChLQUxJTklOO0tBU0hJTjpVTktOT1dOOlJVLUtBSAorUlVTU0lBOlRWRVJTS0HvQSBPQkxBU1QgKEtBTElOSU47S0FMWUFaSU5TS0lZOlVOS05PV046UlUtS0wgCitSVVNTSUE6SVZBTk9WU0tB70EgT0JMQVNUO0ZVUk1BTk9WU0tJWTpVTktOT1dOOlJVLUZSVgorUlVTU0lBOlRWRVJTS0HvQSBPQkxBU1QgKEtBTElOSU47S0lNUlNLSVk6VU5LTk9XTjpSVS1LTSAKK1JVU1NJQTpJVkFOT1ZTS0HvQSBPQkxBU1Q7Uk9ETklLT1ZTS0lZOlVOS05PV046UlUtUkRWCitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtUT1JaSE9LU0tJWTpVTktOT1dOOlJVLVRSIAorUlVTU0lBOklWQU5PVlNLQe9BIE9CTEFTVDtLT01TT01PTFNLSVk6VU5LTk9XTjpSVS1LTTEKK1JVU1NJQTpJQVJPU0xBVlNLQe9BIE9CTEFTVDtST1NUT1Y6VU5LTk9XTjpSVS1ST1QKK1JVU1NJQTpJVkFOT1ZTS0HvQSBPQkxBU1Q7RlVSTUFOT1Y6VU5LTk9XTjpSVS1GUk4KK1JVU1NJQTpJVkFOT1ZTS0HvQSBPQkxBU1Q7VklDSFVHQTpVTktOT1dOOlJVLVZDQQorUlVTU0lBOlRWRVJTS0HvQSBPQkxBU1QgKEtBTElOSU47UEVOT1ZTS0lZOlVOS05PV046UlUtUE5JCitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtLVVZTSElOT1ZTS0lZOlVOS05PV046UlUtS1ZJCitSVVNTSUE6SVZBTk9WU0tB70EgT0JMQVNUO0lWQU5PVlNLSVk6VU5LTk9XTjpSVS1JVksKK1JVU1NJQTpJVkFOT1ZTS0HvQSBPQkxBU1Q7TFVLSFNLSVk6VU5LTk9XTjpSVS1MS1MKK1JVU1NJQTpJVkFOT1ZTS0HvQSBPQkxBU1Q7SUxZSU5TS0lZOlVOS05PV046UlUtSUxLCitSVVNTSUE6SUFST1NMQVZTS0HvQSBPQkxBU1Q7UEVSRVNMQVZTS0lZOlVOS05PV046UlUtUEVWCitSVVNTSUE6SVZBTk9WU0tB70EgT0JMQVNUO1BVQ0hFWkhTS0lZOlVOS05PV046UlUtUENICitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtLQUxJTklOU0tJWTpVTktOT1dOOlJVLUtMMQorUlVTU0lBOlRWRVJTS0HvQSBPQkxBU1QgKEtBTElOSU47QU5EUkVBUE9MU0tJWTpVTktOT1dOOlJVLUFOTAorUlVTU0lBOlRWRVJTS0HvQSBPQkxBU1QgKEtBTElOSU47T1NUQVNIS09WOlVOS05PV046UlUtT1NPCitSVVNTSUE6SVZBTk9WU0tB70EgT0JMQVNUO0lWQU5PVk86VU5LTk9XTjpSVS1JVk8KK1JVU1NJQTpUVkVSU0tB70EgT0JMQVNUIChLQUxJTklOO1NFTElaSEFST1ZTS0lZOlVOS05PV046UlUtU0xSCitSVVNTSUE6SVZBTk9WU0tB70EgT0JMQVNUO1NIVUlTS0lZOlVOS05PV046UlUtU1VTCitSVVNTSUE6SVZBTk9WU0tB70EgT0JMQVNUO1RFWUtPVlNLSVk6VU5LTk9XTjpSVS1UWVYKK1JVU1NJQTpUVkVSU0tB70EgT0JMQVNUIChLQUxJTklOO1RPUlpTSE9LOlVOS05PV046UlUtVFJICitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtUT1JPUEVUU0tJWTpVTktOT1dOOlJVLVRSMQorUlVTU0lBOklWQU5PVlNLQe9BIE9CTEFTVDtMRVpITkVWU0tJWTpVTktOT1dOOlJVLUxaVgorUlVTU0lBOklWQU5PVlNLQe9BIE9CTEFTVDtQQUxFS0hTS0lZOlVOS05PV046UlUtUExICitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtUQUxET01TS0lZOlVOS05PV046UlUtVExNCitSVVNTSUE6SVZBTk9WU0tB70EgT0JMQVNUO1ZFUktITkVMQU5ERUtIT1ZTS0lZOlVOS05PV046UlUtVlJECitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtUVkVSOlVOS05PV046UlUtVFZSCitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtLT05BS09WU0tJWTpVTktOT1dOOlJVLUtOIAorUlVTU0lBOklWQU5PVlNLQe9BIE9CTEFTVDtTSFVZQTpVTktOT1dOOlJVLVNVWQorUlVTU0lBOlRWRVJTS0HvQSBPQkxBU1QgKEtBTElOSU47S0lNUlk6VU5LTk9XTjpSVS1LSVIKK1JVU1NJQTpJVkFOT1ZTS0HvQSBPQkxBU1Q7VEVZS09WTzpVTktOT1dOOlJVLVRZTworUlVTU0lBOlRWRVJTS0HvQSBPQkxBU1QgKEtBTElOSU47U1RBUklUU0tJWTpVTktOT1dOOlJVLVNUVAorUlVTU0lBOklWQU5PVlNLQe9BIE9CTEFTVDtHQVZSSUxPVk8tUE9TQURTS0lZOlVOS05PV046UlUtR1ZQCitSVVNTSUE6VkxBRElNSVJTS0HvQSBPQkxBU1Q7WVVSWUVWLVBPTFNLSVk6VU5LTk9XTjpSVS1ZUlAKK1JVU1NJQTpJVkFOT1ZTS0HvQSBPQkxBU1Q7UEVTVFlBS09WU0tJWTpVTktOT1dOOlJVLVBTVgorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7WkFHT1JTS0lZOlVOS05PV046UlUtWkdTCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtEVUJOQTpVTktOT1dOOlJVLURVTgorUlVTU0lBOklWQU5PVlNLQe9BIE9CTEFTVDtZVVpIU0tJWTpVTktOT1dOOlJVLVlaUworUlVTU0lBOlRWRVJTS0HvQSBPQkxBU1QgKEtBTElOSU47S09OQUtPVk86VU5LTk9XTjpSVS1LTk8KK1JVU1NJQTpJVkFOT1ZTS0HvQSBPQkxBU1Q7U0FWSU5TS0lZOlVOS05PV046UlUtU1YyCitSVVNTSUE6VkxBRElNSVJTS0HvQSBPQkxBU1Q7QUxFS1NBTkRST1ZTS0lZOlVOS05PV046UlUtQUxPCitSVVNTSUE6VFZFUlNLQe9BIE9CTEFTVCAoS0FMSU5JTjtSWkhFVlNLSVk6VU5LTk9XTjpSVS1SWlMKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO0RNSVRST1ZTS0lZOlVOS05PV046UlUtRE1TCitSVVNTSUE6VkxBRElNSVJTS0HvQSBPQkxBU1Q7U1VaREFMU0tJWTpVTktOT1dOOlJVLVNaTAorUlVTU0lBOlRWRVJTS0HvQSBPQkxBU1QgKEtBTElOSU47TkVMSURPVlNLSVk6VU5LTk9XTjpSVS1OTFYKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO0tMSU5TS0lZOlVOS05PV046UlUtS0wyCitSVVNTSUE6VkxBRElNSVJTS0HvQSBPQkxBU1Q7S0FNRVNIS09WU0tJWTpVTktOT1dOOlJVLUtNVgorUlVTU0lBOlZMQURJTUlSU0tB70EgT0JMQVNUO0tPVlJPVlNLSVk6VU5LTk9XTjpSVS1LVlkKK1JVU1NJQTpUVkVSU0tB70EgT0JMQVNUIChLQUxJTklOO09MRU5JTlNLSVk6VU5LTk9XTjpSVS1PTDIKK1JVU1NJQTpUVkVSU0tB70EgT0JMQVNUIChLQUxJTklOO1pBUEFETk9EVklOU0tJWTpVTktOT1dOOlJVLVpQVgorUlVTU0lBOlZMQURJTUlSU0tB70EgT0JMQVNUO0tPTENIVUdJTlNLSVk6VU5LTk9XTjpSVS1LTDMKK1JVU1NJQTpWTEFESU1JUlNLQe9BIE9CTEFTVDtWWUFaTklLT1ZTS0lZOlVOS05PV046UlUtVllLCitSVVNTSUE6VkxBRElNSVJTS0HvQSBPQkxBU1Q7U1VaREFMJzpVTktOT1dOOlJVLVNaIAorUlVTU0lBOlZMQURJTUlSU0tB70EgT0JMQVNUO0dPUk9LSE9WRVRTS0lZOlVOS05PV046UlUtR1JFCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtMT1RPU0hJTlNLSVk6VU5LTk9XTjpSVS1MVE4KK1JVU1NJQTpWTEFESU1JUlNLQe9BIE9CTEFTVDtLT1ZST1Y6VU5LTk9XTjpSVS1LT1IKK1JVU1NJQTpWTEFESU1JUlNLQe9BIE9CTEFTVDtBTEVLU0FORFJPVjpVTktOT1dOOlJVLUFMTgorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7S0xJTjpVTktOT1dOOlJVLUtMNAorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7U0VSR0lFViBQT1NBRDpVTktOT1dOOlJVLVNSIAorUlVTU0lBOlZMQURJTUlSU0tB70EgT0JMQVNUO0tJUlpIQUNIU0tJWTpVTktOT1dOOlJVLUtSSAorUlVTU0lBOlRWRVJTS0HvQSBPQkxBU1QgKEtBTElOSU47WlVCVFNPVlNLSVk6VU5LTk9XTjpSVS1aQlYKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO1NPTE5FQ0hOT0dPUlNLSVk6VU5LTk9XTjpSVS1TTEcKK1JVU1NJQTpWTEFESU1JUlNLQe9BIE9CTEFTVDtLT0wnQ0hVR0lOTzpVTktOT1dOOlJVLUtMRworUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7Vk9MT0tPTEFNU0tJWTpVTktOT1dOOlJVLVZMTQorUlVTU0lBOlZMQURJTUlSU0tB70EgT0JMQVNUO1NPQklOU0tJWTpVTktOT1dOOlJVLVNCUworUlVTU0lBOlRWRVJTS0HvQSBPQkxBU1QgKEtBTElOSU47UlpTSEVWOlVOS05PV046UlUtUlpICitSVVNTSUE6VkxBRElNSVJTS0HvQSBPQkxBU1Q7VllBWk5JS0k6VU5LTk9XTjpSVS1WWUkKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO1NDSEVMS09WU0tJWTpVTktOT1dOOlJVLVNDSworUlVTU0lBOlRWRVJTS0HvQSBPQkxBU1QgKEtBTElOSU47TkVMSURPVk86VU5LTk9XTjpSVS1OTEQKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO1NIQUtIT1ZTS09ZOlVOS05PV046UlUtU0FWCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtTT0xORUNITk9HT1JTSzpVTktOT1dOOlJVLVNMTworUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7UFVTSEtJTlNLSVk6VU5LTk9XTjpSVS1QU1MKK1JVU1NJQTpUVkVSU0tB70EgT0JMQVNUIChLQUxJTklOO1pIQVJLT1ZTS0lZOlVOS05PV046UlUtWkhLCitSVVNTSUE6VkxBRElNSVJTS0HvQSBPQkxBU1Q7VkxBRElNSVI6VU5LTk9XTjpSVS1WTDQKK1JVU1NJQTpWTEFESU1JUlNLQe9BIE9CTEFTVDtQRVRVU0hLSU5TS0lZOlVOS05PV046UlUtUFRJCitSVVNTSUE6VkxBRElNSVJTS0HvQSBPQkxBU1Q7U1VET0dPRFNLSVk6VU5LTk9XTjpSVS1TREQKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO0tSQVNOT0FSTUVZU0s6VU5LTk9XTjpSVS1LQTEKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO0lTVFJJTlNLSVk6VU5LTk9XTjpSVS1JU04KK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO01ZVElTQ0hJTlNLSVk6VU5LTk9XTjpSVS1NWVMKK1JVU1NJQTpUVkVSU0tB70EgT0JMQVNUIChLQUxJTklOO0JFTFNLSVk6VU5LTk9XTjpSVS1CU0sKK1JVU1NJQTpTTU9MRU5TS0HvQSBPQkxBU1Q7U1lDSEVWS1NLSVk6VU5LTk9XTjpSVS1TWVkKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO05PR0lOU0tJWTpVTktOT1dOOlJVLU5HSQorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7Vk9MT0tPTEFNU0s6VU5LTk9XTjpSVS1WTEwKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO1BVU0NISU5POlVOS05PV046UlUtUFNICitSVVNTSUE6VkxBRElNSVJTS0HvQSBPQkxBU1Q7U0VMSVZBTk9WU0tJWTpVTktOT1dOOlJVLVNMSQorUlVTU0lBOlZMQURJTUlSU0tB70EgT0JMQVNUO1NPQklOS0E6VU5LTk9XTjpSVS1TQk4KK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO1JVWlNLSVk6VU5LTk9XTjpSVS1SWkkKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO1BBVkxPVk8tUE9TQURTS0lZOlVOS05PV046UlUtUFZBCitSVVNTSUE6U01PTEVOU0tB70EgT0JMQVNUO0dBR0FSSU5TS0lZOlVOS05PV046UlUtR0dOCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtMT0JOWUE6VU5LTk9XTjpSVS1MT04KK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO0lWQU5URVlFVktBOlVOS05PV046UlUtSVZZCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtGUllBWklOTzpVTktOT1dOOlJVLUZSWgorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7S0hJTUtJTlNLSVk6VU5LTk9XTjpSVS1LSDYKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO0RPTEdPUFJVRE5ZSTpVTktOT1dOOlJVLURMVQorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7U0hDSEVMS09WTzpVTktOT1dOOlJVLVNDTAorUlVTU0lBOlZMQURJTUlSU0tB70EgT0JMQVNUO01VUk9NU0tJWTpVTktOT1dOOlJVLU1SMQorUlVTU0lBOk1PU0tWQTtNT1NDT1c6VU5LTk9XTjpSVS1NT0MKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO1BVU0hLSU5POlVOS05PV046UlUtUFNLCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtNWVRZU0hDSFk6VU5LTk9XTjpSVS1NWUgKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO0lTVFJBOlVOS05PV046UlUtSVNSCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtLSElNS0k6VU5LTk9XTjpSVS1LSDcKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO05PR0lOU0s6VU5LTk9XTjpSVS1OR04KK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO0tBTElOSU5HUkFEOlVOS05PV046UlUtS0xBCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtLUkFTTk9HT1JTS0lZOlVOS05PV046UlUtS0EyCitSVVNTSUE6VkxBRElNSVJTS0HvQSBPQkxBU1Q7R1VTLUtIUlVTVEFMTllJOlVOS05PV046UlUtR1NTCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtPUkVLSE9WTy1aVVlFVlNLSVk6VU5LTk9XTjpSVS1PUlUKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO0JBTEFTSElLSElOU0tJWTpVTktOT1dOOlJVLUJBSAorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7T1JFS0hPVk8tWlVFVk86VU5LTk9XTjpSVS1PUkUKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO01PWkhBWVNLSVk6VU5LTk9XTjpSVS1NWlkKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO0tSQVNOT0dPUlNLOlVOS05PV046UlUtS1JHCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtTSEFUVVJTS0lZOlVOS05PV046UlUtU0FSCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtFTEVLVFJPU1RBTDpVTktOT1dOOlJVLUVMUworUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7QkFMQVNISUtIQTpVTktOT1dOOlJVLUJBSQorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7UkVVVE9WOlVOS05PV046UlUtUkVUCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtPRElOVFNPVlNLSVk6VU5LTk9XTjpSVS1PRFYKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO1pIRUxFWk5PRE9ST1pITllJOlVOS05PV046UlUtWkhSCitSVVNTSUE6U01PTEVOU0tB70EgT0JMQVNUO05PVk9EVUdJTlNLSVk6VU5LTk9XTjpSVS1OVjEKK1JVU1NJQTpTTU9MRU5TS0HvQSBPQkxBU1Q7VkVMSVpIU0tJWTpVTktOT1dOOlJVLVZMNQorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7WlZFTklHT1JPRDpVTktOT1dOOlJVLVpWRworUlVTU0lBOlNNT0xFTlNLQe9BIE9CTEFTVDtERU1JRE9WU0tJWTpVTktOT1dOOlJVLURNSworUlVTU0lBOlNNT0xFTlNLQe9BIE9CTEFTVDtLSE9MTS1aSElSS09WU0tJWTpVTktOT1dOOlJVLUtIOAorUlVTU0lBOlNNT0xFTlNLQe9BIE9CTEFTVDtEVUtIT1ZTQ0hJTlNLSVk6VU5LTk9XTjpSVS1ES0gKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO0xZVUJFUkVUU0tJWTpVTktOT1dOOlJVLUxZVAorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7T0RJTlRTT1ZPOlVOS05PV046UlUtT0RTCitSVVNTSUE6VkxBRElNSVJTS0HvQSBPQkxBU1Q7R1VTJy1LSFJVU1RBTE5ZOlVOS05PV046UlUtR1NUCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtSQU1FTlNLSVk6VU5LTk9XTjpSVS1STUkKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO0xFTklOU0tJWTpVTktOT1dOOlJVLUxOIAorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7TElVQkVSVFNZOlVOS05PV046UlUtTFVSCitSVVNTSUE6VkxBRElNSVJTS0HvQSBPQkxBU1Q7TUVMRU5LT1ZTS0lZOlVOS05PV046UlUtTUxLCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtaSFVLT1ZTS0lZOlVOS05PV046UlUtWkhJCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtOQVJPLUZPTUlOU0tJWTpVTktOT1dOOlJVLU5STQorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7UkFNRU5TS09FOlVOS05PV046UlUtUk1PCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtTSEFUVVJBOlVOS05PV046UlUtU0FBCitSVVNTSUE6VkxBRElNSVJTS0HvQSBPQkxBU1Q7TVVST006VU5LTk9XTjpSVS1NVU0KK1JVU1NJQTpTTU9MRU5TS0HvQSBPQkxBU1Q7R0FHQVJJTjpVTktOT1dOOlJVLUdHUgorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7VklETk9ZRTpVTktOT1dOOlJVLVZEWQorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7TFlUS0FSSU5POlVOS05PV046UlUtTFlJCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtWT1NLUkVTRU5TS0lZOlVOS05PV046UlUtVlNJCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtQT0RPTFNLSVk6VU5LTk9XTjpSVS1QRFMKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO01PWlNIQVlTSzpVTktOT1dOOlJVLU1aIAorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7VFJPSVRTSzpVTktOT1dOOlJVLVRSMgorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7WUVHT1JZRVZTS0lZOlVOS05PV046UlUtWUdWCitSVVNTSUE6U01PTEVOU0tB70EgT0JMQVNUO1lBUlRTRVZTS0lZOlVOS05PV046UlUtWVIgCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtET01PREVET1ZTS0lZOlVOS05PV046UlUtRE1JCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtQT0RPTFNLOlVOS05PV046UlUtUERMCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtET01PREVET1ZPOlVOS05PV046UlUtRE1ECitSVVNTSUE6U01PTEVOU0tB70EgT0JMQVNUO1ZZQVpFTVNLSVk6VU5LTk9XTjpSVS1WWVkKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO0VHT1JZRVZTSzpVTktOT1dOOlJVLUVHVgorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7TkFSTy1GT01JTlNLOlVOS05PV046UlUtTlJJCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtLTElNT1ZTSzpVTktOT1dOOlJVLUtMNQorUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7Vk9TS1JFU0VOU0s6VU5LTk9XTjpSVS1WU0UKK1JVU1NJQTpSWUFaQU5TS0HvQSBPQkxBU1Q7S0xFUElLT1ZTS0lZOlVOS05PV046UlUtS0w2CitSVVNTSUE6U01PTEVOU0tB70EgT0JMQVNUO1JVRE5ZQU5TS0lZOlVOS05PV046UlUtUkROCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtCUk9OTklUU1k6VU5LTk9XTjpSVS1CUjUKK1JVU1NJQTpLQUxPVUpTS0HvQSBPQkxBU1Q7Qk9ST1ZTS0lZOlVOS05PV046UlUtQlI2CitSVVNTSUE6U01PTEVOU0tB70EgT0JMQVNUO1NBRk9OT1ZTS0lZOlVOS05PV046UlUtU0ZWCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtDSEVLSE9WU0tJWTpVTktOT1dOOlJVLUNIOQorUlVTU0lBOktBTE9VSlNLQe9BIE9CTEFTVDtJWk5PU0tPVlNLSVk6VU5LTk9XTjpSVS1JWksKK1JVU1NJQTpLQUxPVUpTS0HvQSBPQkxBU1Q7TUVEWU5TS0lZOlVOS05PV046UlUtTURTCitSVVNTSUE6U01PTEVOU0tB70EgT0JMQVNUO1RZT01LSU5TS0lZOlVOS05PV046UlUtVFlJCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtTVFVQSU5TS0lZOlVOS05PV046UlUtU1ROCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtLT0xPTUVOU0tJWTpVTktOT1dOOlJVLUtMNworUlVTU0lBOktBTE9VSlNLQe9BIE9CTEFTVDtaSFVLT1ZTS0lZOlVOS05PV046UlUtWkhZCitSVVNTSUE6UllBWkFOU0tB70EgT0JMQVNUO0tBU0lNT1ZTS0lZOlVOS05PV046UlUtS1MgCitSVVNTSUE6U01PTEVOU0tB70EgT0JMQVNUO1ZZQVpNQTpVTktOT1dOOlJVLVZZWgorUlVTU0lBOlNNT0xFTlNLQe9BIE9CTEFTVDtTQUZPTk9WTzpVTktOT1dOOlJVLVNGTgorUlVTU0lBOktBTE9VSlNLQe9BIE9CTEFTVDtNQUxPWUFST1NMQVZFVFNLSVk6VU5LTk9XTjpSVS1NTEwKK1JVU1NJQTpLQUxPVUpTS0HvQSBPQkxBU1Q7T0JOSU5TSzpVTktOT1dOOlJVLU9CSworUlVTU0lBOlNNT0xFTlNLQe9BIE9CTEFTVDtTTU9MRU5TS0lZOlVOS05PV046UlUtU01OCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtMVUtIT1ZJVFNLSVk6VU5LTk9XTjpSVS1MS1QKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO0tPTE9NTkE6VU5LTk9XTjpSVS1LTE0KK1JVU1NJQTpTTU9MRU5TS0HvQSBPQkxBU1Q7WUFSVFNFVk86VU5LTk9XTjpSVS1ZUkUKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO1NFUlBVS0hPVlNLSVk6VU5LTk9XTjpSVS1TUlkKK1JVU1NJQTpSWUFaQU5TS0HvQSBPQkxBU1Q7UllCTk9WU0tJWTpVTktOT1dOOlJVLVJZVgorUlVTU0lBOlJZQVpBTlNLQe9BIE9CTEFTVDtZRVJNSVNISU5TS0lZOlVOS05PV046UlUtWVIxCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtPWllPUlNLSVk6VU5LTk9XTjpSVS1PWlMKK1JVU1NJQTpTTU9MRU5TS0HvQSBPQkxBU1Q7S0FSRFlNT1ZTS0lZOlVOS05PV046UlUtS0RWCitSVVNTSUE6U01PTEVOU0tB70EgT0JMQVNUO1VHUkFOU0tJWTpVTktOT1dOOlJVLVVHSworUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7U1RVUElOTzpVTktOT1dOOlJVLVNUTworUlVTU0lBOlNNT0xFTlNLQe9BIE9CTEFTVDtET1JPR09CVVpIU0tJWTpVTktOT1dOOlJVLURSWgorUlVTU0lBOktBTE9VSlNLQe9BIE9CTEFTVDtEWkVSWkhJTlNLSVk6VU5LTk9XTjpSVS1EWksKK1JVU1NJQTpSWUFaQU5TS0HvQSBPQkxBU1Q7S0FTSU1PVjpVTktOT1dOOlJVLUtTMQorUlVTU0lBOktBTE9VSlNLQe9BIE9CTEFTVDtZVUtITk9WU0tJWTpVTktOT1dOOlJVLVlLSworUlVTU0lBOk1PU0tPVlNLQe9BIE9CTEFTVCBS6VNJRFU7U0VSUFVLSE9WOlVOS05PV046UlUtU1JPCitSVVNTSUE6UllBWkFOU0tB70EgT0JMQVNUO1JZQVpBTlNLSVk6VU5LTk9XTjpSVS1SWVkKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO1pBUkFZU0tJWTpVTktOT1dOOlJVLVpSUworUlVTU0lBOktBTE9VSlNLQe9BIE9CTEFTVDtUQVJVU1NLSVk6VU5LTk9XTjpSVS1UUjMKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO09aRVJZOlVOS05PV046UlUtT1pSCitSVVNTSUE6UllBWkFOU0tB70EgT0JMQVNUO1NQQVNTS0lZOlVOS05PV046UlUtU1BJCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtLQVNISVJTS0lZOlVOS05PV046UlUtS1MyCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtLQVNISVJBOlVOS05PV046UlUtS1NBCitSVVNTSUE6UllBWkFOU0tB70EgT0JMQVNUO1NISUxPVlNLSVk6VU5LTk9XTjpSVS1TSVYKK1JVU1NJQTpUT1VMU0tB70EgT0JMQVNUO1pBT0tTS0lZOlVOS05PV046UlUtWk9TCitSVVNTSUE6VE9VTFNLQe9BIE9CTEFTVDtZQVNOT0dPUlNLSVk6VU5LTk9XTjpSVS1ZU1MKK1JVU1NJQTpTTU9MRU5TS0HvQSBPQkxBU1Q7R0xJTktPVlNLSVk6VU5LTk9XTjpSVS1HTFMKK1JVU1NJQTpNT1NLT1ZTS0HvQSBPQkxBU1QgUulTSURVO1pBUkFZU0s6VU5LTk9XTjpSVS1aUlkKK1JVU1NJQTpSWUFaQU5TS0HvQSBPQkxBU1Q7UElURUxJTlNLSVk6VU5LTk9XTjpSVS1QVFkKK1JVU1NJQTpTTU9MRU5TS0HvQSBPQkxBU1Q7U01PTEVOU0s6VU5LTk9XTjpSVS1TTVMKK1JVU1NJQTpLQUxPVUpTS0HvQSBPQkxBU1Q7TU9TQUxTS0lZOlVOS05PV046UlUtTVNTCitSVVNTSUE6UllBWkFOU0tB70EgT0JMQVNUO0tBRE9NU0tJWTpVTktOT1dOOlJVLUtEWQorUlVTU0lBOktBTE9VSlNLQe9BIE9CTEFTVDtGRVJaSUtPVlNLSVk6VU5LTk9XTjpSVS1GUksKK1JVU1NJQTpUT1VMU0tB70EgT0JMQVNUO1ZFTkVWU0tJWTpVTktOT1dOOlJVLVZOSworUlVTU0lBOktBTE9VSlNLQe9BIE9CTEFTVDtLQUxVR0E6VU5LTk9XTjpSVS1LQUcKK1JVU1NJQTpSWUFaQU5TS0HvQSBPQkxBU1Q7UllBWkFOOlVOS05PV046UlUtUllaCitSVVNTSUE6U01PTEVOU0tB70EgT0JMQVNUO0tSQVNOSU5TS0lZOlVOS05PV046UlUtS0EzCitSVVNTSUE6VE9VTFNLQe9BIE9CTEFTVDtBTEVLU0lOU0tJWTpVTktOT1dOOlJVLUFMMworUlVTU0lBOlNNT0xFTlNLQe9BIE9CTEFTVDtZRUxOSU5TS0lZOlVOS05PV046UlUtWUxOCitSVVNTSUE6TU9TS09WU0tB70EgT0JMQVNUIFLpU0lEVTtTRVJFQlJZQU5PUFJVRFNLSVk6VU5LTk9XTjpSVS1TUlAKK1JVU1NJQTpSWUFaQU5TS0HvQSBPQkxBU1Q7WkFLSEFST1ZTS0lZOlVOS05PV046UlUtWktWCitSVVNTSUE6S0FMT1VKU0tB70EgT0JMQVNUO0JBQllOSU5TS0lZOlVOS05PV046UlUtQkJLCitSVVNTSUE6U01PTEVOU0tB70EgT0JMQVNUO1BPQ0hJTktPVlNLSVk6VU5LTk9XTjpSVS1QQ0sKK1JVU1NJQTpLQUxPVUpTS0HvQSBPQkxBU1Q7U1BBUy1ERU1FTlNLSVk6VU5LTk9XTjpSVS1TUE0KK1JVU1NJQTpLQUxPVUpTS0HvQSBPQkxBU1Q7QkFSWUFUSU5TS0lZOlVOS05PV046UlUtQlI3CitSVVNTSUE6S0FMT1VKU0tB70EgT0JMQVNUO01FU0NIT1ZTS0lZOlVOS05PV046UlUtTVNWCitSVVNTSUE6UllBWkFOU0tB70EgT0JMQVNUO1NBU09WU0tJWTpVTktOT1dOOlJVLVNTSQorUlVTU0lBOlJZQVpBTlNLQe9BIE9CTEFTVDtDSFVDSEtPVlNLSVk6VU5LTk9XTjpSVS1DVVYKK1JVU1NJQTpUT1VMU0tB70EgT0JMQVNUO0FMRUtTSU46VU5LTk9XTjpSVS1BTDQKK1JVU1NJQTpTTU9MRU5TS0HvQSBPQkxBU1Q7TU9OQVNUWVJTSElOU0tJWTpVTktOT1dOOlJVLU1OSAorUlVTU0lBOktBTE9VSlNLQe9BIE9CTEFTVDtQRVJFTVlTSExTS0lZOlVOS05PV046UlUtUEVICitSVVNTSUE6UllBWkFOU0tB70EgT0JMQVNUO1NUQVJPWkhJTE9WU0tJWTpVTktOT1dOOlJVLVNUVgorUlVTU0lBOlJZQVpBTlNLQe9BIE9CTEFTVDtNSUtIQVlMT1ZTS0lZOlVOS05PV046UlUtTUtZCitSVVNTSUE6UllBWkFOU0tB70EgT0JMQVNUO1BST05TS0lZOlVOS05PV046UlUtUE9TCitSVVNTSUE6VE9VTFNLQe9BIE9CTEFTVDtMRU5JTlNLSVk6VU5LTk9XTjpSVS1MTjEKK1JVU1NJQTpSWUFaQU5TS0HvQSBPQkxBU1Q7U0FTT1ZPOlVOS05PV046UlUtU0FPCitSVVNTSUE6S0FMT1VKU0tB70EgT0JMQVNUO1NVS0hJTklDSFNLSVk6VU5LTk9XTjpSVS1TS0MKK1JVU1NJQTpUT1VMU0tB70EgT0JMQVNUO05PVk9NT1NLT1ZTS0lZOlVOS05PV046UlUtTlZPCitSVVNTSUE6S0FMT1VKU0tB70EgT0JMQVNUO0tPWkVMU0tJWTpVTktOT1dOOlJVLUtaSQorUlVTU0lBOlRPVUxTS0HvQSBPQkxBU1Q7RFVCRU5TS0lZOlVOS05PV046UlUtREJLCitSVVNTSUE6UllBWkFOU0tB70EgT0JMQVNUO1BVVFlBVElOU0tJWTpVTktOT1dOOlJVLVBUIAorUlVTU0lBOktBTE9VSlNLQe9BIE9CTEFTVDtLVVlCWVNIRVZTS0lZOlVOS05PV046UlUtS1lWCitSVVNTSUE6VE9VTFNLQe9BIE9CTEFTVDtTVVZPUk9WU0tJWTpVTktOT1dOOlJVLVNWMworUlVTU0lBOlRPVUxTS0HvQSBPQkxBU1Q7VFVMQTpVTktOT1dOOlJVLVRVTAorUlVTU0lBOlNNT0xFTlNLQe9BIE9CTEFTVDtST1NMQVZMU0tJWTpVTktOT1dOOlJVLVJTTAorUlVTU0lBOlJZQVpBTlNLQe9BIE9CTEFTVDtTSEFUU0tJWTpVTktOT1dOOlJVLVNBUworUlVTU0lBOlRPVUxTS0HvQSBPQkxBU1Q7S0lSRVlFVlNLSVk6VU5LTk9XTjpSVS1LRVYKK1JVU1NJQTpLQUxPVUpTS0HvQSBPQkxBU1Q7S0lST1ZTS0lZOlVOS05PV046UlUtS09TCitSVVNTSUE6U01PTEVOU0tB70EgT0JMQVNUO0tISVNMQVZJQ0hTS0lZOlVOS05PV046UlUtS0hDCitSVVNTSUE6S0FMT1VKU0tB70EgT0JMQVNUO0RVTUlOSUNIU0tJWTpVTktOT1dOOlJVLURNQworUlVTU0lBOlJZQVpBTlNLQe9BIE9CTEFTVDtLT1JBQkxJTlNLSVk6VU5LTk9XTjpSVS1LQTQKK1JVU1NJQTpSWUFaQU5TS0HvQSBPQkxBU1Q7U0FQT1pIS09WU0tJWTpVTktOT1dOOlJVLVNQWQorUlVTU0lBOlRPVUxTS0HvQSBPQkxBU1Q7T0RPWUVWU0tJWTpVTktOT1dOOlJVLU9ESworUlVTU0lBOlRPVUxTS0HvQSBPQkxBU1Q7S0lNT1ZTS0lZOlVOS05PV046UlUtS00yCitSVVNTSUE6S0FMT1VKU0tB70EgT0JMQVNUO0tJUk9WOlVOS05PV046UlUtS0kgCitSVVNTSUE6S0FMT1VKU0tB70EgT0JMQVNUO0xZVURJTk9WU0tJWTpVTktOT1dOOlJVLUxZUworUlVTU0lBOlRPVUxTS0HvQSBPQkxBU1Q7VVpMT1ZTS0lZOlVOS05PV046UlUtVVpLCitSVVNTSUE6VE9VTFNLQe9BIE9CTEFTVDtTQ0hFS0lOU0tJWTpVTktOT1dOOlJVLVNDTgorUlVTU0lBOkJSWUFOU0tB70EgT0JMQVNUO1JPR05FRElOU0tJWTpVTktOT1dOOlJVLVJHTgorUlVTU0lBOlNNT0xFTlNLQe9BIE9CTEFTVDtERVNOT0dPUlNLOlVOS05PV046UlUtRFNHCitSVVNTSUE6VE9VTFNLQe9BIE9CTEFTVDtOT1ZPTU9TS09WU0s6VU5LTk9XTjpSVS1OVjIKK1JVU1NJQTpTTU9MRU5TS0HvQSBPQkxBU1Q7U0hVTVlBQ0hTS0lZOlVOS05PV046UlUtU0hDCitSVVNTSUE6VE9VTFNLQe9BIE9CTEFTVDtET05TS09ZOlVOS05PV046UlUtRE5LCitSVVNTSUE6UllBWkFOU0tB70EgT0JMQVNUO1NBUkFZRVZTS0lZOlVOS05PV046UlUtU1IxCitSVVNTSUE6VE9VTFNLQe9BIE9CTEFTVDtTQ0hFS0lOTzpVTktOT1dOOlJVLVNDSQorUlVTU0lBOlRPVUxTS0HvQSBPQkxBU1Q7VVpMT1ZBWUE6VU5LTk9XTjpSVS1VWlYKK1JVU1NJQTpUT1VMU0tB70EgT0JMQVNUO0JFTFlFVlNLSVk6VU5LTk9XTjpSVS1CWVYKK1JVU1NJQTpSWUFaQU5TS0HvQSBPQkxBU1Q7VUtIT0xPVlNLSVk6VU5LTk9XTjpSVS1VS1YKK1JVU1NJQTpSWUFaQU5TS0HvQSBPQkxBU1Q7U0tPUElOU0tJWTpVTktOT1dOOlJVLVNLTgorUlVTU0lBOlNNT0xFTlNLQe9BIE9CTEFTVDtST1NMQVZMJzpVTktOT1dOOlJVLVJTIAorUlVTU0lBOlRPVUxTS0HvQSBPQkxBU1Q7S0lNT1ZTSzpVTktOT1dOOlJVLUtNMworUlVTU0lBOktBTE9VSlNLQe9BIE9CTEFTVDtVTFlBTk9WU0tJWTpVTktOT1dOOlJVLVVMSworUlVTU0lBOktBTE9VSlNLQe9BIE9CTEFTVDtMWVVESU5PVk86VU5LTk9XTjpSVS1MWU4KK1JVU1NJQTpLQUxPVUpTS0HvQSBPQkxBU1Q7WkhJWkRSSU5TS0lZOlVOS05PV046UlUtWkggCitSVVNTSUE6QlJZQU5TS0HvQSBPQkxBU1Q7RFlBVEtPVlNLSVk6VU5LTk9XTjpSVS1EWVYKK1JVU1NJQTpSWUFaQU5TS0HvQSBPQkxBU1Q7UllBWkhTS0lZOlVOS05PV046UlUtUlkgCitSVVNTSUE6QlJZQU5TS0HvQSBPQkxBU1Q7RFVCUk9WU0tJWTpVTktOT1dOOlJVLURCSQorUlVTU0lBOlRPVUxTS0HvQSBPQkxBU1Q7Qk9HT1JPRElUU0tJWTpVTktOT1dOOlJVLUJHWQorUlVTU0lBOlJZQVpBTlNLQe9BIE9CTEFTVDtTS09QSU46VU5LTk9XTjpSVS1TS1AKK1JVU1NJQTpUT1VMU0tB70EgT0JMQVNUO1BMQVZTS0lZOlVOS05PV046UlUtUExLCitSVVNTSUE6UllBWkFOU0tB70EgT0JMQVNUO01JTE9TTEFWU0tJWTpVTktOT1dOOlJVLU1MSQorUlVTU0lBOlRPVUxTS0HvQSBPQkxBU1Q7VEVQTE8tT0dBUkVWU0tJWTpVTktOT1dOOlJVLVRQUgorUlVTU0lBOlRPVUxTS0HvQSBPQkxBU1Q7QVJTRU5ZRVZTS0lZOlVOS05PV046UlUtQVJJCitSVVNTSUE6VE9VTFNLQe9BIE9CTEFTVDtCT0dPUk9ESVRTSzpVTktOT1dOOlJVLUJHIAorUlVTU0lBOkJSWUFOU0tB70EgT0JMQVNUO1pIVUtPVlNLSVk6VU5LTk9XTjpSVS1aSDEKK1JVU1NJQTpTTU9MRU5TS0HvQSBPQkxBU1Q7WUVSU0hJQ0hTS0lZOlVOS05PV046UlUtWVJDCitSVVNTSUE6S0FMT1VKU0tB70EgT0JMQVNUO0tIVkFTVE9WSUNIU0tJWTpVTktOT1dOOlJVLUtISAorUlVTU0lBOlRPVUxTS0HvQSBPQkxBU1Q7Vk9MT1ZTS0lZOlVOS05PV046UlUtVkw2CitSVVNTSUE6VE9VTFNLQe9BIE9CTEFTVDtLVVJLSU5TS0lZOlVOS05PV046UlUtS0tOCitSVVNTSUE6VE9VTFNLQe9BIE9CTEFTVDtDSEVSTlNLSVk6VU5LTk9XTjpSVS1DRVMKK1JVU1NJQTpCUllBTlNLQe9BIE9CTEFTVDtLTEVUTllBTlNLSVk6VU5LTk9XTjpSVS1LTDgKK1JVU1NJQTpSWUFaQU5TS0HvQSBPQkxBU1Q7Tk9WT0RFUkVWRU5TS0lZOlVOS05PV046UlUtTlZFCitSVVNTSUE6T1JMT1ZTS0HvQSBPQkxBU1Q7Qk9MS0hPVlNLSVk6VU5LTk9XTjpSVS1CS1YKK1JVU1NJQTpCUllBTlNLQe9BIE9CTEFTVDtEWUFUJ0tPVk86VU5LTk9XTjpSVS1EWUsKK1JVU1NJQTpCUllBTlNLQe9BIE9CTEFTVDtCUllBTlNLSVk6VU5LTk9XTjpSVS1CUjgKK1JVU1NJQTpPUkxPVlNLQe9BIE9CTEFTVDtaTkFNRU5TS0lZOlVOS05PV046UlUtWk5TCitSVVNTSUE6T1JMT1ZTS0HvQSBPQkxBU1Q7TVRTRU5TS0lZOlVOS05PV046UlUtTVRTCitSVVNTSUE6VE9VTFNLQe9BIE9CTEFTVDtLQU1FTlNLSVk6VU5LTk9XTjpSVS1LTTQKK1JVU1NJQTpUT1VMU0tB70EgT0JMQVNUO1lFRlJFTU9WU0tJWTpVTktOT1dOOlJVLVlGVgorUlVTU0lBOk9STE9WU0tB70EgT0JMQVNUO0tIT1RZTkVUU0tJWTpVTktOT1dOOlJVLUtIVAorUlVTU0lBOkJSWUFOU0tB70EgT0JMQVNUO0tBUkFDSEVWU0tJWTpVTktOT1dOOlJVLUtBVgorUlVTU0lBOkJSWUFOU0tB70EgT0JMQVNUO1NVUkFaSFNLSVk6VU5LTk9XTjpSVS1TUjIKK1JVU1NJQTpCUllBTlNLQe9BIE9CTEFTVDtCUllBTlNLOlVOS05PV046UlUtQlI5CitSVVNTSUE6QlJZQU5TS0HvQSBPQkxBU1Q7WkhJUllBVElOU0tJWTpVTktOT1dOOlJVLVpIMgorUlVTU0lBOk9STE9WU0tB70EgT0JMQVNUO01aRU5TSzpVTktOT1dOOlJVLU1aTgorUlVTU0lBOkJSWUFOU0tB70EgT0JMQVNUO01HTElOU0tJWTpVTktOT1dOOlJVLU1HUworUlVTU0lBOk9STE9WU0tB70EgT0JMQVNUO0tPUlNBS09WU0tJWTpVTktOT1dOOlJVLUtTMworUlVTU0lBOk9STE9WU0tB70EgT0JMQVNUO09STE9WU0tJWTpVTktOT1dOOlJVLU9SUworUlVTU0lBOkJSWUFOU0tB70EgT0JMQVNUO0tSQVNOT0dPUlNLSVk6VU5LTk9XTjpSVS1LQTUKK1JVU1NJQTpCUllBTlNLQe9BIE9CTEFTVDtWWUdPTklDSFNLSVk6VU5LTk9XTjpSVS1WWUgKK1JVU1NJQTpCUllBTlNLQe9BIE9CTEFTVDtQT0NIRVBTS0lZOlVOS05PV046UlUtUENQCitSVVNTSUE6T1JMT1ZTS0HvQSBPQkxBU1Q7Tk9WT1NJTFNLSVk6VU5LTk9XTjpSVS1OVjMKK1JVU1NJQTpPUkxPVlNLQe9BIE9CTEFTVDtVUklUU0tJWTpVTktOT1dOOlJVLVVSSQorUlVTU0lBOlRPVUxTS0HvQSBPQkxBU1Q7RUZSRU1PVjpVTktOT1dOOlJVLUVGTQorUlVTU0lBOkJSWUFOU0tB70EgT0JMQVNUO0dPUkRFWUVWU0tJWTpVTktOT1dOOlJVLUdSSQorUlVTU0lBOk9STE9WU0tB70EgT0JMQVNUO05PVk9ERVJFVkVOS09WU0tJWTpVTktOT1dOOlJVLU5WNAorUlVTU0lBOkJSWUFOU0tB70EgT0JMQVNUO05BVkxJTlNLSVk6VU5LTk9XTjpSVS1OVjUKK1JVU1NJQTpPUkxPVlNLQe9BIE9CTEFTVDtaQUxFR09TQ0hFTlNLSVk6VU5LTk9XTjpSVS1aTEUKK1JVU1NJQTpPUkxPVlNLQe9BIE9CTEFTVDtTSEFCTFlLSU5TS0lZOlVOS05PV046UlUtU0FLCitSVVNTSUE6T1JMT1ZTS0HvQSBPQkxBU1Q7T1JZT0w6VU5LTk9XTjpSVS1PUkwKK1JVU1NJQTpCUllBTlNLQe9BIE9CTEFTVDtVTkVDSFNLSVk6VU5LTk9XTjpSVS1VTksKK1JVU1NJQTpPUkxPVlNLQe9BIE9CTEFTVDtWRVJLSE9WU0tJWTpVTktOT1dOOlJVLVZSMgorUlVTU0lBOkJSWUFOU0tB70EgT0JMQVNUO0tMSU5UU09WU0tJWTpVTktOT1dOOlJVLUtMOQorUlVTU0lBOk9STE9WU0tB70EgT0JMQVNUO0tSQVNOT1pPUkVOU0tJWTpVTktOT1dOOlJVLUtBNgorUlVTU0lBOk9STE9WU0tB70EgT0JMQVNUO1NPU0tPVlNLSVk6VU5LTk9XTjpSVS1TU1kKK1JVU1NJQTpCUllBTlNLQe9BIE9CTEFTVDtUUlVCQ0hFVlNLSVk6VU5LTk9XTjpSVS1UUjQKK1JVU1NJQTpPUkxPVlNLQe9BIE9CTEFTVDtTVkVSRExPVlNLSVk6VU5LTk9XTjpSVS1TVjQKK1JVU1NJQTpPUkxPVlNLQe9BIE9CTEFTVDtLUk9NU0tJWTpVTktOT1dOOlJVLUtPSworUlVTU0lBOkJSWUFOU0tB70EgT0JMQVNUO0JSQVNPVlNLSVk6VU5LTk9XTjpSVS1CQVYKK1JVU1NJQTpCUllBTlNLQe9BIE9CTEFTVDtLTElOVFNZOlVOS05PV046UlUtS0xUCitSVVNTSUE6T1JMT1ZTS0HvQSBPQkxBU1Q7UE9LUk9WU0tJWTpVTktOT1dOOlJVLVBLVgorUlVTU0lBOkJSWUFOU0tB70EgT0JMQVNUO05PVk9aWUJLT1ZTS0lZOlVOS05PV046UlUtTlY2CitSVVNTSUE6QlJZQU5TS0HvQSBPQkxBU1Q7U1RBUk9EVUJTS0lZOlVOS05PV046UlUtU1RCCitSVVNTSUE6QlJZQU5TS0HvQSBPQkxBU1Q7UE9HQVJTS0lZOlVOS05PV046UlUtUEdTCitSVVNTSUE6T1JMT1ZTS0HvQSBPQkxBU1Q7RE1JVFJPVlNLSVk6VU5LTk9XTjpSVS1ETVkKK1JVU1NJQTpPUkxPVlNLQe9BIE9CTEFTVDtMSVZFTlNLSVk6VU5LTk9XTjpSVS1MVksKK1JVU1NJQTpCUllBTlNLQe9BIE9CTEFTVDtTVVpFTVNLSVk6VU5LTk9XTjpSVS1TWlMKK1JVU1NJQTpPUkxPVlNLQe9BIE9CTEFTVDtHTEFaVU5PVlNLSVk6VU5LTk9XTjpSVS1HTEsKK1JVU1NJQTpPUkxPVlNLQe9BIE9CTEFTVDtNQUxPQVJLSEFOR0VMU0tJWTpVTktOT1dOOlJVLU1MTgorUlVTU0lBOkJSWUFOU0tB70EgT0JMQVNUO05PVk9aWUJLT1Y6VU5LTk9XTjpSVS1OVkIKK1JVU1NJQTpCUllBTlNLQe9BIE9CTEFTVDtLTElNT1ZTS0lZOlVOS05PV046UlUtS0lTCitSVVNTSUE6QlJZQU5TS0HvQSBPQkxBU1Q7S09NQVJJQ0hTS0lZOlVOS05PV046UlUtS01DCitSVVNTSUE6T1JMT1ZTS0HvQSBPQkxBU1Q7VFJPU05ZQU5TS0lZOlVOS05PV046UlUtVFI1CitSVVNTSUE6T1JMT1ZTS0HvQSBPQkxBU1Q7TElWTlk6VU5LTk9XTjpSVS1MSU4KK1JVU1NJQTpCUllBTlNLQe9BIE9CTEFTVDtaTFlOS09WU0tJWTpVTktOT1dOOlJVLVpMVgorUlVTU0lBOk9STE9WU0tB70EgT0JMQVNUO0tPTFBOWUFOU0tJWTpVTktOT1dOOlJVLUtQTgorUlVTU0lBOkJSWUFOU0tB70EgT0JMQVNUO1NFVlNLSVk6VU5LTk9XTjpSVS1TVjUKK1JVU1NJQTpPUkxPVlNLQe9BIE9CTEFTVDtET0xaSEFOU0tJWTpVTktOT1dOOlJVLURMWQorUlVTU0lBOkxFTklOR1JBRFNLQe9BIE9CTEFTVCBS6VM7VllCT1JHU0tJWTpVTktOT1dOOlJVLVZZRworUlVTU0lBOkxFTklOR1JBRFNLQe9BIE9CTEFTVCBS6VM7UE9EUE9ST1pIU0tJWTpVTktOT1dOOlJVLVBEWgorUlVTU0lBOkxFTklOR1JBRFNLQe9BIE9CTEFTVCBS6VM7UFJJT1pFUlNLSVk6VU5LTk9XTjpSVS1QSVIKK1JVU1NJQTpMRU5JTkdSQURTS0HvQSBPQkxBU1QgUulTO1BSSU9aRVJTSzpVTktOT1dOOlJVLVBJUworUlVTU0lBOkxFTklOR1JBRFNLQe9BIE9CTEFTVCBS6VM7TE9ERVlOT1BPTFNLSVk6VU5LTk9XTjpSVS1MRFAKK1JVU1NJQTpMRU5JTkdSQURTS0HvQSBPQkxBU1QgUulTO1BPRFBPUk9aSFlFOlVOS05PV046UlUtUERZCitSVVNTSUE6TEVOSU5HUkFEU0tB70EgT0JMQVNUIFLpUztMT0RFWU5PWUUgUE9MRTpVTktOT1dOOlJVLUxEWQorUlVTU0lBOkxFTklOR1JBRFNLQe9BIE9CTEFTVCBS6VM7VllCT1JHOlVOS05PV046UlUtVlkxCitSVVNTSUE6TEVOSU5HUkFEU0tB70EgT0JMQVNUIFLpUztWT0xLSE9WU0tJWTpVTktOT1dOOlJVLVZMNworUlVTU0lBOkxFTklOR1JBRFNLQe9BIE9CTEFTVCBS6VM7VlNFVk9MWkhTS0lZOlVOS05PV046UlUtVlNaCitSVVNTSUE6U0FOS1QtUEVURVJCVVJHO1NBTktULVBFVEVSU0JVUkc6VU5LTk9XTjpSVS1TTlQKK1JVU1NJQTpMRU5JTkdSQURTS0HvQSBPQkxBU1QgUulTO1RJS0hWSU5TS0lZOlVOS05PV046UlUtVEtOCitSVVNTSUE6TEVOSU5HUkFEU0tB70EgT0JMQVNUIFLpUztMT01PTk9TT1ZTS0lZOlVOS05PV046UlUtTE1WCitSVVNTSUE6TEVOSU5HUkFEU0tB70EgT0JMQVNUIFLpUztCT0tTSVRPR09SU0tJWTpVTktOT1dOOlJVLUJLRworUlVTU0lBOkxFTklOR1JBRFNLQe9BIE9CTEFTVCBS6VM7VlNFVk9MT1pIU0s6VU5LTk9XTjpSVS1WU0gKK1JVU1NJQTpMRU5JTkdSQURTS0HvQSBPQkxBU1QgUulTO0tJUk9WU0tJWTpVTktOT1dOOlJVLUtPSQorUlVTU0lBOkxFTklOR1JBRFNLQe9BIE9CTEFTVCBS6VM7U09TTk9WWUkgQk9SOlVOS05PV046UlUtU1MgCitSVVNTSUE6TEVOSU5HUkFEU0tB70EgT0JMQVNUIFLpUztLSU5HSVNFUFBTS0lZOlVOS05PV046UlUtS04xCitSVVNTSUE6TEVOSU5HUkFEU0tB70EgT0JMQVNUIFLpUztWT0xLSE9WOlVOS05PV046UlUtVkw4CitSVVNTSUE6TEVOSU5HUkFEU0tB70EgT0JMQVNUIFLpUztLSVJPVlNLOlVOS05PV046UlUtS09WCitSVVNTSUE6TEVOSU5HUkFEU0tB70EgT0JMQVNUIFLpUztLSVJJU0hTS0lZOlVOS05PV046UlUtS0lICitSVVNTSUE6TEVOSU5HUkFEU0tB70EgT0JMQVNUIFLpUztUT1NORU5TS0lZOlVOS05PV046UlUtVFNOCitSVVNTSUE6TEVOSU5HUkFEU0tB70EgT0JMQVNUIFLpUztHQVRDSElOU0tJWTpVTktOT1dOOlJVLUdUTgorUlVTU0lBOkxFTklOR1JBRFNLQe9BIE9CTEFTVCBS6VM7Vk9MT1NPVlNLSVk6VU5LTk9XTjpSVS1WTDkKK1JVU1NJQTpMRU5JTkdSQURTS0HvQSBPQkxBU1QgUulTO1RJS0hWSU46VU5LTk9XTjpSVS1US0kKK1JVU1NJQTpMRU5JTkdSQURTS0HvQSBPQkxBU1QgUulTO0dBVENISU5BOlVOS05PV046UlUtR1RICitSVVNTSUE6TEVOSU5HUkFEU0tB70EgT0JMQVNUIFLpUztUT1NOTzpVTktOT1dOOlJVLVRPTgorUlVTU0lBOkxFTklOR1JBRFNLQe9BIE9CTEFTVCBS6VM7Qk9LU0lUT0dPUlNLOlVOS05PV046UlUtQktPCitSVVNTSUE6TEVOSU5HUkFEU0tB70EgT0JMQVNUIFLpUztJVkFOR09ST0Q6VU5LTk9XTjpSVS1JVlIKK1JVU1NJQTpMRU5JTkdSQURTS0HvQSBPQkxBU1QgUulTO0tJTkdJU0VQUDpVTktOT1dOOlJVLUtORQorUlVTU0lBOkxFTklOR1JBRFNLQe9BIE9CTEFTVCBS6VM7UElLQUxFVk86VU5LTk9XTjpSVS1QS0wKK1JVU1NJQTpMRU5JTkdSQURTS0HvQSBPQkxBU1QgUulTO1NMQU5UU0VWU0tJWTpVTktOT1dOOlJVLVNMWQorUlVTU0lBOkxFTklOR1JBRFNLQe9BIE9CTEFTVCBS6VM7S0lSSVNISTpVTktOT1dOOlJVLUtJSQorUlVTU0lBOk5PVkdPUk9EU0tB70EgT0JMQVNUO0NIVURPVlNLSVk6VU5LTk9XTjpSVS1DVVMKK1JVU1NJQTpOT1ZHT1JPRFNLQe9BIE9CTEFTVDtMWVVCWVRJTlNLSVk6VU5LTk9XTjpSVS1MWUsKK1JVU1NJQTpMRU5JTkdSQURTS0HvQSBPQkxBU1QgUulTO0xVWkhTS0lZOlVOS05PV046UlUtTFpJCitSVVNTSUE6Tk9WR09ST0RTS0HvQSBPQkxBU1Q7S0hWT1lOSU5TS0lZOlVOS05PV046UlUtS0g5CitSVVNTSUE6Tk9WR09ST0RTS0HvQSBPQkxBU1Q7TUFMT1ZJU0hFUlNLSVk6VU5LTk9XTjpSVS1NTEUKK1JVU1NJQTpMRU5JTkdSQURTS0HvQSBPQkxBU1QgUulTO1NMQU5UU1k6VU5LTk9XTjpSVS1TTCAKK1JVU1NJQTpOT1ZHT1JPRFNLQe9BIE9CTEFTVDtOT1ZHT1JPRFNLSVk6VU5LTk9XTjpSVS1OVkQKK1JVU1NJQTpQU0tPVlNLQe9BIE9CTEFTVDtHRE9WU0tJWTpVTktOT1dOOlJVLUdEUworUlVTU0lBOlBTS09WU0tB70EgT0JMQVNUO1BMWVVTU0tJWTpVTktOT1dOOlJVLVBMSQorUlVTU0lBOk5PVkdPUk9EU0tB70EgT0JMQVNUO0JBVEVUU0tJWTpVTktOT1dOOlJVLUJUSworUlVTU0lBOkxFTklOR1JBRFNLQe9BIE9CTEFTVCBS6VM7TFVHQTpVTktOT1dOOlJVLUxVRworUlVTU0lBOk5PVkdPUk9EU0tB70EgT0JMQVNUO1BFU1RPVlNLSVk6VU5LTk9XTjpSVS1QU0kKK1JVU1NJQTpOT1ZHT1JPRFNLQe9BIE9CTEFTVDtCT1JPVklDSFNLSVk6VU5LTk9XTjpSVS1CUkMKK1JVU1NJQTpOT1ZHT1JPRFNLQe9BIE9CTEFTVDtNT1NIRU5TS0lZOlVOS05PV046UlUtTVNOCitSVVNTSUE6Tk9WR09ST0RTS0HvQSBPQkxBU1Q7T0tVTE9WU0tJWTpVTktOT1dOOlJVLU9LVgorUlVTU0lBOk5PVkdPUk9EU0tB70EgT0JMQVNUO05PVkdPUk9EOlVOS05PV046UlUtTlZSCitSVVNTSUE6UFNLT1ZTS0HvQSBPQkxBU1Q7U1RSVUdPLUtSQVNORU5TS0lZOlVOS05PV046UlUtU1RTCitSVVNTSUE6Tk9WR09ST0RTS0HvQSBPQkxBU1Q7S1JFU1RFVFNLSVk6VU5LTk9XTjpSVS1LRVQKK1JVU1NJQTpOT1ZHT1JPRFNLQe9BIE9CTEFTVDtTSElNU0tJWTpVTktOT1dOOlJVLVNJUworUlVTU0lBOk5PVkdPUk9EU0tB70EgT0JMQVNUO0JPUk9WSUNISTpVTktOT1dOOlJVLUJPQworUlVTU0lBOlBTS09WU0tB70EgT0JMQVNUO1BTS09WU0tJWTpVTktOT1dOOlJVLVBTWQorUlVTU0lBOk5PVkdPUk9EU0tB70EgT0JMQVNUO1NPTEVUU0tJWTpVTktOT1dOOlJVLVNMMQorUlVTU0lBOk5PVkdPUk9EU0tB70EgT0JMQVNUO1NUQVJPUlVTU0tJWTpVTktOT1dOOlJVLVNUSQorUlVTU0lBOk5PVkdPUk9EU0tB70EgT0JMQVNUO1BBUkZJTk86VU5LTk9XTjpSVS1QUk8KK1JVU1NJQTpOT1ZHT1JPRFNLQe9BIE9CTEFTVDtWQUxEQVlTS0lZOlVOS05PV046UlUtVkRTCitSVVNTSUE6UFNLT1ZTS0HvQSBPQkxBU1Q7UE9SS0hPVlNLSVk6VU5LTk9XTjpSVS1QS1MKK1JVU1NJQTpOT1ZHT1JPRFNLQe9BIE9CTEFTVDtERU1ZQU5TS0lZOlVOS05PV046UlUtRE1OCitSVVNTSUE6Tk9WR09ST0RTS0HvQSBPQkxBU1Q7Vk9MT1RPVlNLSVk6VU5LTk9XTjpSVS1WT1YKK1JVU1NJQTpOT1ZHT1JPRFNLQe9BIE9CTEFTVDtTVEFSQVlBIFJVU1NBOlVOS05PV046UlUtU1RSCitSVVNTSUE6UFNLT1ZTS0HvQSBPQkxBU1Q7UEVDSE9SU0tJWTpVTktOT1dOOlJVLVBDSQorUlVTU0lBOlBTS09WU0tB70EgT0JMQVNUO0ROT1ZTS0lZOlVOS05PV046UlUtRE5JCitSVVNTSUE6UFNLT1ZTS0HvQSBPQkxBU1Q7UFNLT1Y6VU5LTk9XTjpSVS1QUyAKK1JVU1NJQTpOT1ZHT1JPRFNLQe9BIE9CTEFTVDtQT0RET1JTS0lZOlVOS05PV046UlUtUERSCitSVVNTSUE6UFNLT1ZTS0HvQSBPQkxBU1Q7UEFMS0lOU0tJWTpVTktOT1dOOlJVLVBMIAorUlVTU0lBOlBTS09WU0tB70EgT0JMQVNUO0RFRE9WSUNIRVNLSVk6VU5LTk9XTjpSVS1EREgKK1JVU1NJQTpQU0tPVlNLQe9BIE9CTEFTVDtPU1RST1ZTS0lZOlVOS05PV046UlUtT1NJCitSVVNTSUE6Tk9WR09ST0RTS0HvQSBPQkxBU1Q7TUFSRVZTS0lZOlVOS05PV046UlUtTVIyCitSVVNTSUE6UFNLT1ZTS0HvQSBPQkxBU1Q7QkVaSEFOSVRTS0lZOlVOS05PV046UlUtQlpLCitSVVNTSUE6UFNLT1ZTS0HvQSBPQkxBU1Q7UFlUQUxPVlNLSVk6VU5LTk9XTjpSVS1QWVYKK1JVU1NJQTpOT1ZHT1JPRFNLQe9BIE9CTEFTVDtLSE9MTVNLSVk6VU5LTk9XTjpSVS1LT1kKK1JVU1NJQTpQU0tPVlNLQe9BIE9CTEFTVDtOT1ZPUlpIRVZTS0lZOlVOS05PV046UlUtTlY3CitSVVNTSUE6UFNLT1ZTS0HvQSBPQkxBU1Q7T1NUUk9WOlVOS05PV046UlUtT1NSCitSVVNTSUE6UFNLT1ZTS0HvQSBPQkxBU1Q7TE9LTllBTlNLSVk6VU5LTk9XTjpSVS1MS04KK1JVU1NJQTpQU0tPVlNLQe9BIE9CTEFTVDtQVVNIS0lOTy1HT1JTS0lZOlVOS05PV046UlUtUFNHCitSVVNTSUE6UFNLT1ZTS0HvQSBPQkxBU1Q7S1JBU05PR09ST0RTS0lZOlVOS05PV046UlUtS0FECitSVVNTSUE6UFNLT1ZTS0HvQSBPQkxBU1Q7T1BPQ0hFTlNLSVk6VU5LTk9XTjpSVS1PUFMKK1JVU1NJQTpQU0tPVlNLQe9BIE9CTEFTVDtWRUxJS09MVUtTS0lZOlVOS05PV046UlUtVklLCitSVVNTSUE6UFNLT1ZTS0HvQSBPQkxBU1Q7Tk9WT1NPS09MTklDSEVTS0lZOlVOS05PV046UlUtTlZDCitSVVNTSUE6UFNLT1ZTS0HvQSBPQkxBU1Q7UFVTVE9TSEtJTlNLSVk6VU5LTk9XTjpSVS1QUzEKK1JVU1NJQTpQU0tPVlNLQe9BIE9CTEFTVDtTRUJFWkhTS0lZOlVOS05PV046UlUtU0JICitSVVNTSUE6UFNLT1ZTS0HvQSBPQkxBU1Q7S1VOWUlOU0tJWTpVTktOT1dOOlJVLUtOMgorUlVTU0lBOlBTS09WU0tB70EgT0JMQVNUO1ZFTElLSUUgTFVLSTpVTktOT1dOOlJVLVZMVQorUlVTU0lBOlBTS09WU0tB70EgT0JMQVNUO05FVkVMU0tJWTpVTktOT1dOOlJVLU5WOAorUlVTU0lBOlBTS09WU0tB70EgT0JMQVNUO1VTVllBVFNLSVk6VU5LTk9XTjpSVS1VU1QKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7VkVSS0hORURPTlNLT1k6VU5LTk9XTjpSVS1WUk8KK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7U0hPTE9LSE9WU0tJWTpVTktOT1dOOlJVLVNPUworUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtDSEVSVEtPVlNLSVk6VU5LTk9XTjpSVS1DRVYKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7Qk9LT1ZTS0lZOlVOS05PV046UlUtQktLCitSVVNTSUE6Uk9TVE9WU0tB70EgT0JMQVNUO0tBU0hBUlNLSVk6VU5LTk9XTjpSVS1LUzQKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7TUlMTEVST1ZTS0lZOlVOS05PV046UlUtTUxZCitSVVNTSUE6Uk9TVE9WU0tB70EgT0JMQVNUO1NPVkVUU0tJWTpVTktOT1dOOlJVLVNWNgorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtNSUxMRVJPVk86VU5LTk9XTjpSVS1NTFIKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7TUlMWVVUSU5TS0lZOlVOS05PV046UlUtTUwgCitSVVNTSUE6Uk9TVE9WU0tB70EgT0JMQVNUO09CTElWU0tJWTpVTktOT1dOOlJVLU9CSQorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtUQVJBU09WU0tJWTpVTktOT1dOOlJVLVRSNgorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtLQU1FTlNLSVk6VU5LTk9XTjpSVS1LTTUKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7QkVMT0tBTElUVklOU0tJWTpVTktOT1dOOlJVLUJPVAorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtUQVRTWU5TS0lZOlVOS05PV046UlUtVFRLCitSVVNTSUE6Uk9TVE9WU0tB70EgT0JMQVNUO01PUk9aT1ZTS0lZOlVOS05PV046UlUtTVIzCitSVVNTSUE6Uk9TVE9WU0tB70EgT0JMQVNUO0RPTkVUU0s6VU5LTk9XTjpSVS1ETlQKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7S0FNRU5TSy1TSEFLSFRJTlNLSVk6VU5LTk9XTjpSVS1LTUgKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7QkVMQVlBIEtBTElUVkE6VU5LTk9XTjpSVS1CQUsKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7S1JBU05PU1VMSU5TS0lZOlVOS05PV046UlUtS0E3CitSVVNTSUE6Uk9TVE9WU0tB70EgT0JMQVNUO0dVS09WTzpVTktOT1dOOlJVLUdVVgorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtUU1lNTFlBTlNLSVk6VU5LTk9XTjpSVS1UU1MKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7WlZFUkVWTzpVTktOT1dOOlJVLVpWTworUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtLT05TVEFOVElOT1ZTS0lZOlVOS05PV046UlUtS04zCitSVVNTSUE6Uk9TVE9WU0tB70EgT0JMQVNUO0tSQVNOWUkgU1VMSU46VU5LTk9XTjpSVS1LQVUKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7VVNULURPTkVUU0tJWTpVTktOT1dOOlJVLVVTOQorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtST0RJT05PVk8tTkVTVkVUQVlTS0lZOlVOS05PV046UlUtUkRTCitSVVNTSUE6Uk9TVE9WU0tB70EgT0JMQVNUO0tVWUJZU0hFVlNLSVk6VU5LTk9XTjpSVS1LWTEKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7Tk9WT1NIQUtIVElOU0s6VU5LTk9XTjpSVS1OVkgKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7T0tUWUFCUlNLSVk6VU5LTk9XTjpSVS1PSzMKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7U0hBS0hUWTpVTktOT1dOOlJVLVNIVAorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtNQVRWRVlFVk8tS1VSR0FOU0tJWTpVTktOT1dOOlJVLU1USworUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtEVUJPVlNLSVk6VU5LTk9XTjpSVS1EQlkKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7Vk9MR09ET05TS0lZOlVOS05PV046UlUtVkxOCitSVVNTSUE6Uk9TVE9WU0tB70EgT0JMQVNUO1NFTUlLQVJBS09SU0tJWTpVTktOT1dOOlJVLVNNTworUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtORUtMSU5PVlNLSVk6VU5LTk9XTjpSVS1OSyAKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7Vk9MR09ET05TSzpVTktOT1dOOlJVLVZHRAorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtaQVZFVElOU0tJWTpVTktOT1dOOlJVLVpWUworUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtBS1NBWVNLSVk6VU5LTk9XTjpSVS1BS1MKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7TVlBU05JS09WU0tJWTpVTktOT1dOOlJVLU1ZVgorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtOT1ZPQ0hFUktBU1NLOlVOS05PV046UlUtTlY5CitSVVNTSUE6Uk9TVE9WU0tB70EgT0JMQVNUO01BUlRZTk9WU0tJWTpVTktOT1dOOlJVLU1SNAorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtaSU1PVk5JS09WU0tJWTpVTktOT1dOOlJVLVpNSworUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtCQUdBWUVWU0tJWTpVTktOT1dOOlJVLUJHVgorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtST1NUT1YtTkEtRE9OWTpVTktOT1dOOlJVLVJTQQorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtWRVNFTE9WU0tJWTpVTktOT1dOOlJVLVZTVgorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtUQUdBTlJPRzpVTktOT1dOOlJVLVRHTgorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtBWk9WU0tJWTpVTktOT1dOOlJVLUFaUworUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtQUk9MRVRBUlNLSVk6VU5LTk9XTjpSVS1QT1IKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7QkFUQVlTSzpVTktOT1dOOlJVLUJUWQorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtPUkxPVlNLSVk6VU5LTk9XTjpSVS1PUksKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7QVpPVjpVTktOT1dOOlJVLUFaVgorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtLQUdBTE5JVFNLSVk6VU5LTk9XTjpSVS1LR1QKK1JVU1NJQTpST1NUT1ZTS0HvQSBPQkxBU1Q7WkVSTk9HUkFEU0tJWTpVTktOT1dOOlJVLVpSRAorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtTQUxTS0lZOlVOS05PV046UlUtU0wyCitSVVNTSUE6Uk9TVE9WU0tB70EgT0JMQVNUO1RTRUxJTlNLSVk6VU5LTk9XTjpSVS1UU0sKK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO1NDSEVSQklOT1ZTS0lZOlVOS05PV046UlUtU0NPCitSVVNTSUE6S1JBU05PREFSU0tJIEtSQe8gUulTSURVRTtLVVNDSEVWU0tJWTpVTktOT1dOOlJVLUtTNQorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtSRU1PTlRORU5TS0lZOlVOS05PV046UlUtUk1ZCitSVVNTSUE6S1JBU05PREFSU0tJIEtSQe8gUulTSURVRTtZRVlTSzpVTktOT1dOOlJVLVlFUworUlVTU0lBOktSQVNOT0RBUlNLSSBLUkHvIFLpU0lEVUU7WUVZU0tJWTpVTktOT1dOOlJVLVlZSworUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtZRUdPUkxZS1NLSVk6VU5LTk9XTjpSVS1ZR1kKK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO1NUQVJPTUlOU0tJWTpVTktOT1dOOlJVLVNUMQorUlVTU0lBOktSQVNOT0RBUlNLSSBLUkHvIFLpU0lEVUU7S1JZTE9WU0tJWTpVTktOT1dOOlJVLUtZMgorUlVTU0lBOlJPU1RPVlNLQe9BIE9CTEFTVDtTQUxTSzpVTktOT1dOOlJVLVNBIAorUlVTU0lBOktSQVNOT0RBUlNLSSBLUkHvIFLpU0lEVUU7TEVOSU5HUkFEU0tJWTpVTktOT1dOOlJVLUxORAorUlVTU0lBOktSQVNOT0RBUlNLSSBLUkHvIFLpU0lEVUU7S0FORVZTS0lZOlVOS05PV046UlUtS040CitSVVNTSUE6Uk9TVE9WU0tB70EgT0JMQVNUO1BFU0NIQU5PS09QU0tJWTpVTktOT1dOOlJVLVBTTworUlVTU0lBOktSQVNOT0RBUlNLSSBLUkHvIFLpU0lEVUU7Tk9WT1BPS1JPVlNLSVk6VU5LTk9XTjpSVS1OT1IKK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO0JFTE9HTElOU0tJWTpVTktOT1dOOlJVLUJPTgorUlVTU0lBOktSQVNOT0RBUlNLSSBLUkHvIFLpU0lEVUU7UEFWTE9WU0tJWTpVTktOT1dOOlJVLVBWSQorUlVTU0lBOlNUQVZST1BPTFNLSSBLUkHvIFLpU0lEVUU7QVBBTkFTRU5LT1ZTS0lZOlVOS05PV046UlUtQVBLCitSVVNTSUE6S1JBU05PREFSU0tJIEtSQe8gUulTSURVRTtQUklNT1JTS08tQUtIVEFSU0tJWTpVTktOT1dOOlJVLVBSVAorUlVTU0lBOlNUQVZST1BPTFNLSSBLUkHvIFLpU0lEVUU7SVBBVE9WU0tJWTpVTktOT1dOOlJVLUlQVgorUlVTU0lBOktSQVNOT0RBUlNLSSBLUkHvIFLpU0lEVUU7VElLSE9SRVRTS0lZOlVOS05PV046UlUtVEtUCitSVVNTSUE6S1JBU05PREFSU0tJIEtSQe8gUulTSURVRTtCUllVS0hPVkVUU0tJWTpVTktOT1dOOlJVLUJZRQorUlVTU0lBOlNUQVZST1BPTFNLSSBLUkHvIFLpU0lEVUU7S1JBU05PR1ZBUkRFWVNLSVk6VU5LTk9XTjpSVS1LQTgKK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO1RJS0hPUkVUWks6VU5LTk9XTjpSVS1US1IKK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO1ZZU0VMS09WU0tJWTpVTktOT1dOOlJVLVZZMgorUlVTU0lBOlNUQVZST1BPTFNLSSBLUkHvIFLpU0lEVUU7VFJVTk9WU0tJWTpVTktOT1dOOlJVLVRSNworUlVTU0lBOktSQVNOT0RBUlNLSSBLUkHvIFLpU0lEVUU7S09SRU5PVlNLSVk6VU5LTk9XTjpSVS1LRUsKK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO0tBTElOSU5TS0lZOlVOS05PV046UlUtS0lOCitSVVNTSUE6U1RBVlJPUE9MU0tJIEtSQe8gUulTSURVRTtOT1ZPQUxFS1NBTkRST1ZTS0lZOlVOS05PV046UlUtTk9OCitSVVNTSUE6S1JBU05PREFSU0tJIEtSQe8gUulTSURVRTtUSU1BU0hFVlNLSVk6VU5LTk9XTjpSVS1UTSAKK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO1NMQVZZQU5TS0lZOlVOS05PV046UlUtU0wzCitSVVNTSUE6U1RBVlJPUE9MU0tJIEtSQe8gUulTSURVRTtUVVJLTUVOU0tJWTpVTktOT1dOOlJVLVRSOAorUlVTU0lBOktSQVNOT0RBUlNLSSBLUkHvIFLpU0lEVUU7S0FWS0FaU0tJWTpVTktOT1dOOlJVLUtWWgorUlVTU0lBOlNUQVZST1BPTFNLSSBLUkHvIFLpU0lEVUU7SVpPQklMTkVOU0tJWTpVTktOT1dOOlJVLUlaTgorUlVTU0lBOlNUQVZST1BPTFNLSSBLUkHvIFLpU0lEVUU7QVJaR0lSWlNLSVk6VU5LTk9XTjpSVS1BUloKK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO1RCSUxJU1NLSVk6VU5LTk9XTjpSVS1UQlMKK1JVU1NJQTpTVEFWUk9QT0xTS0kgS1JB7yBS6VNJRFVFO1BFVFJPVlNLSVk6VU5LTk9XTjpSVS1QVDEKK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO0tSQVNOT0FSTUVZU0tJWTpVTktOT1dOOlJVLUtBOQorUlVTU0lBOktSQVNOT0RBUlNLSSBLUkHvIFLpU0lEVUU7S1JBU05PREFSOlVOS05PV046UlUtS0FBCitSVVNTSUE6S1JBU05PREFSU0tJIEtSQe8gUulTSURVRTtLUk9QT1RLSU46VU5LTk9XTjpSVS1LT1QKK1JVU1NJQTpTVEFWUk9QT0xTS0kgS1JB7yBS6VNJRFVFO0dSQUNIRVZTS0lZOlVOS05PV046UlUtR1JZCitSVVNTSUE6S1JBU05PREFSU0tJIEtSQe8gUulTSURVRTtURU1SWVVLU0tJWTpVTktOT1dOOlJVLVRNMQorUlVTU0lBOktSQVNOT0RBUlNLSSBLUkHvIFLpU0lEVUU7VVNULUxBQklOU0tJWTpVTktOT1dOOlJVLVVUTgorUlVTU0lBOlNUQVZST1BPTFNLSSBLUkHvIFLpU0lEVUU7TEVWT0tVTVNLSVk6VU5LTk9XTjpSVS1MVk0KK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO0dVTEtFVklDSFNLSVk6VU5LTk9XTjpSVS1HTEMKK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO0RJTlNLSVk6VU5LTk9XTjpSVS1ETlkKK1JVU1NJQTpTVEFWUk9QT0xTS0kgS1JB7yBS6VNJRFVFO0JMQUdPREFSTkVOU0tJWTpVTktOT1dOOlJVLUJMRQorUlVTU0lBOlNUQVZST1BPTFNLSSBLUkHvIFLpU0lEVUU7U0hQQUtPVlNLSVk6VU5LTk9XTjpSVS1TUCAKK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO1NMQVZZQU5TSy1OQS1LVUJBTkk6VU5LTk9XTjpSVS1TTEEKK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO05PVk9LVUJBTlNLSVk6VU5LTk9XTjpSVS1OT1MKK1JVU1NJQTpSRVNQT1VCTElLQSBBRFlHRe9BO0tSQVNOT0dWQVJERVlTS0lZOlVOS05PV046UlUtS1NECitSVVNTSUE6S1JBU05PREFSU0tJIEtSQe8gUulTSURVRTtLVVJHQU5JTlNLSVk6VU5LTk9XTjpSVS1LR04KK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO0FOQVBTS0lZOlVOS05PV046UlUtQU4xCitSVVNTSUE6U1RBVlJPUE9MU0tJIEtSQe8gUulTSURVRTtTVEFWUk9QT0w6VU5LTk9XTjpSVS1TVFAKK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO0tSWU1TS0lZOlVOS05PV046UlUtS1kzCitSVVNTSUE6S1JBU05PREFSU0tJIEtSQe8gUulTSURVRTtBQklOU0tJWTpVTktOT1dOOlJVLUFCSQorUlVTU0lBOlJFU1BPVUJMSUtBIEFEWUdF70E7U0hPVkdFTk9WU0tJWTpVTktOT1dOOlJVLVNPSworUlVTU0lBOlNUQVZST1BPTFNLSSBLUkHvIFLpU0lEVUU7QlVERU5OT1ZTS0lZOlVOS05PV046UlUtQkRWCitSVVNTSUE6S1JBU05PREFSU0tJIEtSQe8gUulTSURVRTtBUk1BVklSOlVOS05PV046UlUtQVJSCitSVVNTSUE6UkVTUE9VQkxJS0EgQURZR0XvQTtUQUtIVEFNVUtBWVNLSVk6VU5LTk9XTjpSVS1US0sKK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO0FOQVBBOlVOS05PV046UlUtQU5QCitSVVNTSUE6S1JBU05PREFSU0tJIEtSQe8gUulTSURVRTtTRVZFUlNLSVk6VU5LTk9XTjpSVS1TVjcKK1JVU1NJQTpSRVNQT1VCTElLQSBBRFlHRe9BO0tPU0hFS0hBQkxTS0lZOlVOS05PV046UlUtS1NCCitSVVNTSUE6UkVTUE9VQkxJS0EgQURZR0XvQTtURVVDSEVaSFNLSVk6VU5LTk9XTjpSVS1UVVoKK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO1VTUEVOU0tJWTpVTktOT1dOOlJVLVVQUworUlVTU0lBOlNUQVZST1BPTFNLSSBLUkHvIFLpU0lEVUU7S09DSFVCRVlFVlNLSVk6VU5LTk9XTjpSVS1LQ1kKK1JVU1NJQTpTVEFWUk9QT0xTS0kgS1JB7yBS6VNJRFVFO0FMRUtTQU5EUk9WU0tJWTpVTktOT1dOOlJVLUFMNQorUlVTU0lBOlNUQVZST1BPTFNLSSBLUkHvIFLpU0lEVUU7TkVGVEVLVU1TS0lZOlVOS05PV046UlUtTkZNCitSVVNTSUE6U1RBVlJPUE9MU0tJIEtSQe8gUulTSURVRTtBTkRST1BPVlNLSVk6VU5LTk9XTjpSVS1BTjIKK1JVU1NJQTpTVEFWUk9QT0xTS0kgS1JB7yBS6VNJRFVFO05PVk9TRUxJVFNLSVk6VU5LTk9XTjpSVS1OVlQKK1JVU1NJQTpEQUdFU1RBTjtOT0dBWVNLSVk6VU5LTk9XTjpSVS1OR1kKK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO0JFTE9SRUNITlNLSVk6VU5LTk9XTjpSVS1CT0gKK1JVU1NJQTpEQUdFU1RBTjtUQVJVTU9WU0tJWTpVTktOT1dOOlJVLVRSOQorUlVTU0lBOlJFU1BPVUJMSUtBIEFEWUdF70E7R0lBR0lOU0tJWTpVTktOT1dOOlJVLUdBTgorUlVTU0lBOktSQVNOT0RBUlNLSSBLUkHvIFLpU0lEVUU7Tk9WT1JPU1NJWVNLOlVOS05PV046UlUtTk9JCitSVVNTSUE6S1JBU05PREFSU0tJIEtSQe8gUulTSURVRTtLUllNU0s6VU5LTk9XTjpSVS1LWU0KK1JVU1NJQTpTVEFWUk9QT0xTS0kgS1JB7yBS6VNJRFVFO0JVREVOTk9WU0s6VU5LTk9XTjpSVS1CRE8KK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO0dPUllBQ0hJWSBLTFlVQ0g6VU5LTk9XTjpSVS1HUiAKK1JVU1NJQTpSRVNQT1VCTElLQSBBRFlHRe9BO01BWUtPUFNLSVk6VU5LTk9XTjpSVS1NWVAKK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO0JFTE9SRUNIRU5TSzpVTktOT1dOOlJVLUJPRQorUlVTU0lBOktSQVNOT0RBUlNLSSBLUkHvIFLpU0lEVUU7R0VMRU5EWkhJSzpVTktOT1dOOlJVLUdMRAorUlVTU0lBOktSQVNOT0RBUlNLSSBLUkHvIFLpU0lEVUU7TEFCSU5TSzpVTktOT1dOOlJVLUxCUworUlVTU0lBOktSQVNOT0RBUlNLSSBLUkHvIFLpU0lEVUU7TEFCSU5TS0lZOlVOS05PV046UlUtTEJLCitSVVNTSUE6S1JBU05PREFSU0tJIEtSQe8gUulTSURVRTtNT1NUT1ZTS0lZOlVOS05PV046UlUtTVNLCitSVVNTSUE6U1RBVlJPUE9MU0tJIEtSQe8gUulTSURVRTtORVZJTk5PTVlTU0s6VU5LTk9XTjpSVS1OVk0KK1JVU1NJQTpSRVNQT1VCTElLQSBBRFlHRe9BO01BWUtPUDpVTktOT1dOOlJVLU1BSworUlVTU0lBOktSQVNOT0RBUlNLSSBLUkHvIFLpU0lEVUU7QVBTSEVST05TS0lZOlVOS05PV046UlUtQVBOCitSVVNTSUE6S1JBU05PREFSU0tJIEtSQe8gUulTSURVRTtPVFJBRE5FTlNLSVk6VU5LTk9XTjpSVS1PVE4KK1JVU1NJQTpTVEFWUk9QT0xTS0kgS1JB7yBS6VNJRFVFO0dFT1JHSVlFVlNLSVk6VU5LTk9XTjpSVS1HT1YKK1JVU1NJQTpTVEFWUk9QT0xTS0kgS1JB7yBS6VNJRFVFO1NPVkVUU0tJWTpVTktOT1dOOlJVLVNWOAorUlVTU0lBOlNUQVZST1BPTFNLSSBLUkHvIFLpU0lEVUU7TUlORVJBTE9WT0RTS0lZOlVOS05PV046UlUtTU5PCitSVVNTSUE6U1RBVlJPUE9MU0tJIEtSQe8gUulTSURVRTtTVEVQTk9WU0tJWTpVTktOT1dOOlJVLVNUMgorUlVTU0lBOktBUkFUQ0hBRVZPLVRDSEVSS0VTU0tB70E7QURZR0UtS0hBQkxTS0lZOlVOS05PV046UlUtQURCCitSVVNTSUE6S1JBU05PREFSU0tJIEtSQe8gUulTSURVRTtUVUFQU0lOU0tJWTpVTktOT1dOOlJVLVRBTgorUlVTU0lBOktBUkFUQ0hBRVZPLVRDSEVSS0VTU0tB70E7UFJJS1VCQU5TS0lZOlVOS05PV046UlUtUElOCitSVVNTSUE6REFHRVNUQU47S0laTFlBUlNLSVk6VU5LTk9XTjpSVS1LWlkKK1JVU1NJQTpTVEFWUk9QT0xTS0kgS1JB7yBS6VNJRFVFO1BSRURHT1JOWUk6VU5LTk9XTjpSVS1QRVIKK1JVU1NJQTpTVEFWUk9QT0xTS0kgS1JB7yBS6VNJRFVFO0tVUlNLSVk6VU5LTk9XTjpSVS1LUzYKK1JVU1NJQTpLQVJBVENIQUVWTy1UQ0hFUktFU1NLQe9BO0NIRVJLRVNTSzpVTktOT1dOOlJVLUNFSworUlVTU0lBOktBUkFUQ0hBRVZPLVRDSEVSS0VTU0tB70E7S0hBQkVaU0tJWTpVTktOT1dOOlJVLUtIWgorUlVTU0lBOlNUQVZST1BPTFNLSSBLUkHvIFLpU0lEVUU7TUlORVJBTE5JWUUgVk9EWTpVTktOT1dOOlJVLU1ORQorUlVTU0lBOlNUQVZST1BPTFNLSSBLUkHvIFLpU0lEVUU7R0VPUkdJWUVWU0s6VU5LTk9XTjpSVS1HT1kKK1JVU1NJQTpTVEFWUk9QT0xTS0kgS1JB7yBS6VNJRFVFO0tJUk9WU0tJWTpVTktOT1dOOlJVLUtPIAorUlVTU0lBOlNUQVZST1BPTFNLSSBLUkHvIFLpU0lEVUU7WkhFTEVaTk9WT0RTSzpVTktOT1dOOlJVLVpITworUlVTU0lBOktBUkFUQ0hBRVZPLVRDSEVSS0VTU0tB70E7VVNULURaSEVHVVRJTlNLSVk6VU5LTk9XTjpSVS1VVFQKK1JVU1NJQTpTVEFWUk9QT0xTS0kgS1JB7yBS6VNJRFVFO0xFUk1PTlRPVjpVTktOT1dOOlJVLUxSTgorUlVTU0lBOktBUkFUQ0hBRVZPLVRDSEVSS0VTU0tB70E7WkVMRU5DSFVHU0tJWTpVTktOT1dOOlJVLVpMRworUlVTU0lBOktBUkFUQ0hBRVZPLVRDSEVSS0VTU0tB70E7VVJVUFNLSVk6VU5LTk9XTjpSVS1VUlkKK1JVU1NJQTpTVEFWUk9QT0xTS0kgS1JB7yBS6VNJRFVFO1BZQVRJR09SU0s6VU5LTk9XTjpSVS1QWU8KK1JVU1NJQTpTVEFWUk9QT0xTS0kgS1JB7yBS6VNJRFVFO1lFU1NFTlRVS0k6VU5LTk9XTjpSVS1ZU04KK1JVU1NJQTpLUkFTTk9EQVJTS0kgS1JB7yBS6VNJRFVFO1NPQ0hJOlVOS05PV046UlUtU09ICitSVVNTSUE6S1JBU05PREFSU0tJIEtSQe8gUulTSURVRTtUVUFQU0U6VU5LTk9XTjpSVS1UVVAKK1JVU1NJQTpLQVJBVENIQUVWTy1UQ0hFUktFU1NLQe9BO01BTE9LQVJBQ0hBWUVWU0tJWTpVTktOT1dOOlJVLU1MQQorUlVTU0lBOlRDSEVUQ0hFTklBKjtOQVVSU0tJWTpVTktOT1dOOlJVLU5VUworUlVTU0lBOktBQkFSRElOTy1CQUxLQVJJQTtQUk9LSExBRE5FTlNLSVk6VU5LTk9XTjpSVS1QUkUKK1JVU1NJQTpTVEFWUk9QT0xTS0kgS1JB7yBS6VNJRFVFO0tJU0xPVk9EU0s6VU5LTk9XTjpSVS1LUzcKK1JVU1NJQTpUQ0hFVENIRU5JQSo7U0hFTEtPVlNLSVk6VU5LTk9XTjpSVS1TRVYKK1JVU1NJQTpLQUJBUkRJTk8tQkFMS0FSSUE7Wk9MU0tJWTpVTktOT1dOOlJVLVpMSworUlVTU0lBOkRBR0VTVEFOO01BS0hBQ0hLQUxBOlVOS05PV046UlUtTUtBCitSVVNTSUE6S0FSQVRDSEFFVk8tVENIRVJLRVNTS0HvQTtLQVJBQ0hBWUVWU0tJWTpVTktOT1dOOlJVLUtDRQorUlVTU0lBOkRBR0VTVEFOO0JBQkFZVVJUT1ZTS0lZOlVOS05PV046UlUtQkJUCitSVVNTSUE6REFHRVNUQU47S0laTFlBUjpVTktOT1dOOlJVLUtaQQorUlVTU0lBOktBQkFSRElOTy1CQUxLQVJJQTtCQUtTQU5TS0lZOlVOS05PV046UlUtQktJCitSVVNTSUE6U0VWRVJPLU9TRVRJTlNLQe9BIFJFU1BPVTtNT1pET0tTS0lZOlVOS05PV046UlUtTVpJCitSVVNTSUE6S0FSQVRDSEFFVk8tVENIRVJLRVNTS0HvQTtLQVJBQ0hBWUVWU0s6VU5LTk9XTjpSVS1LQ0sKK1JVU1NJQTpLQUJBUkRJTk8tQkFMS0FSSUE7VEVSU0tJWTpVTktOT1dOOlJVLVRTSQorUlVTU0lBOktBQkFSRElOTy1CQUxLQVJJQTtQUk9LSExBRE5ZSTpVTktOT1dOOlJVLVBSRAorUlVTU0lBOktBQkFSRElOTy1CQUxLQVJJQTtNQVlTS0lZOlVOS05PV046UlUtTVlJCitSVVNTSUE6VENIRVRDSEVOSUEqO05BRFRFUkVDSE5ZSTpVTktOT1dOOlJVLU5EQworUlVTU0lBOktBQkFSRElOTy1CQUxLQVJJQTtVUlZBTlNLSVk6VU5LTk9XTjpSVS1VUiAKK1JVU1NJQTpLQUJBUkRJTk8tQkFMS0FSSUE7Q0hFR0VNU0tJWTpVTktOT1dOOlJVLUNFTQorUlVTU0lBOklOR09VQ0hFVElBKjtNQUxHT0JFS1NLSVk6VU5LTk9XTjpSVS1NTDEKK1JVU1NJQTpUQ0hFVENIRU5JQSo7R1JPWk5FTlNLSVk6VU5LTk9XTjpSVS1HUjEKK1JVU1NJQTpEQUdFU1RBTjtLSEFTQVZZVVJUT1ZTS0lZOlVOS05PV046UlUtS0FUCitSVVNTSUE6SU5HT1VDSEVUSUEqO1NVTlpIRU5TS0lZOlVOS05PV046UlUtU05OCitSVVNTSUE6S0FCQVJESU5PLUJBTEtBUklBO1NPVkVUU0tJWTpVTktOT1dOOlJVLVNWOQorUlVTU0lBOklOR09VQ0hFVElBKjtNQUxHT0JFSzpVTktOT1dOOlJVLU1MQgorUlVTU0lBOlRDSEVUQ0hFTklBKjtHVURFUk1FU1NLSVk6VU5LTk9XTjpSVS1HREsKK1JVU1NJQTpLQUJBUkRJTk8tQkFMS0FSSUE7VFlSTllBVVo6VU5LTk9XTjpSVS1UWVkKK1JVU1NJQTpTRVZFUk8tT1NFVElOU0tB70EgUkVTUE9VO0tJUk9WU0tJWTpVTktOT1dOOlJVLUtPMQorUlVTU0lBOlRDSEVUQ0hFTklBKjtHUk9aTllJOlVOS05PV046UlUtR1IyCitSVVNTSUE6U0VWRVJPLU9TRVRJTlNLQe9BIFJFU1BPVTtQUkFWT0JFUkVaSE5ZSTpVTktOT1dOOlJVLVBBUgorUlVTU0lBOklOR09VQ0hFVElBKjtOQVpSQU5PVlNLSVk6VU5LTk9XTjpSVS1OWlkKK1JVU1NJQTpEQUdFU1RBTjtLSVpJTFlVUlRPVlNLSVk6VU5LTk9XTjpSVS1LWlQKK1JVU1NJQTpUQ0hFVENIRU5JQSo7QUNIS0hPWS1NQVJUQU5PVlNLSVk6VU5LTk9XTjpSVS1BQ1IKK1JVU1NJQTpUQ0hFVENIRU5JQSo7R1VERVJNRVM6VU5LTk9XTjpSVS1HRFIKK1JVU1NJQTpUQ0hFVENIRU5JQSo7U0hBTElOU0tJWTpVTktOT1dOOlJVLVNBSQorUlVTU0lBOlRDSEVUQ0hFTklBKjtBUkdVTjpVTktOT1dOOlJVLUFSIAorUlVTU0lBOlNFVkVSTy1PU0VUSU5TS0HvQSBSRVNQT1U7UFJJR09ST0ROWUk6VU5LTk9XTjpSVS1QSUQKK1JVU1NJQTpTRVZFUk8tT1NFVElOU0tB70EgUkVTUE9VO0lSQUZTS0lZOlVOS05PV046UlUtSVJJCitSVVNTSUE6REFHRVNUQU47S0hBU0FWWVVSVDpVTktOT1dOOlJVLUtIVQorUlVTU0lBOlNFVkVSTy1PU0VUSU5TS0HvQSBSRVNQT1U7RElHT1JTS0lZOlVOS05PV046UlUtREdTCitSVVNTSUE6U0VWRVJPLU9TRVRJTlNLQe9BIFJFU1BPVTtBUkRPTlNLSVk6VU5LTk9XTjpSVS1BUjEKK1JVU1NJQTpEQUdFU1RBTjtOT1ZPTEFLU0tJWTpVTktOT1dOOlJVLU5PSworUlVTU0lBOkRBR0VTVEFOO0tJWklMWVVSVDpVTktOT1dOOlJVLUtaVQorUlVTU0lBOlRDSEVUQ0hFTklBKjtVUlVTLU1BUlRBTk9WU0tJWTpVTktOT1dOOlJVLVVSTgorUlVTU0lBOlRDSEVUQ0hFTklBKjtOT1pIQVktWVVSVE9WU0tJWTpVTktOT1dOOlJVLU5aVAorUlVTU0lBOkRBR0VTVEFOO0tBWkJFS09WU0tJWTpVTktOT1dOOlJVLUtaIAorUlVTU0lBOlRDSEVUQ0hFTklBKjtTSEFMSTpVTktOT1dOOlJVLVNBTAorUlVTU0lBOlRDSEVUQ0hFTklBKjtVUlVTLU1BUlRBTjpVTktOT1dOOlJVLVVSUgorUlVTU0lBOkRBR0VTVEFOO0JVWU5BS1NLSVk6VU5LTk9XTjpSVS1CWVMKK1JVU1NJQTpTRVZFUk8tT1NFVElOU0tB70EgUkVTUE9VO1ZMQURJS0FWS0FaOlVOS05PV046UlUtVkxBCitSVVNTSUE6U0VWRVJPLU9TRVRJTlNLQe9BIFJFU1BPVTtBTEFHSVJTS0lZOlVOS05PV046UlUtQUw2CitSVVNTSUE6VENIRVRDSEVOSUEqO1ZFREVOU0tJWTpVTktOT1dOOlJVLVZESQorUlVTU0lBOlRDSEVUQ0hFTklBKjtTSEFUT1lTS0lZOlVOS05PV046UlUtU0FZCitSVVNTSUE6REFHRVNUQU47S0FTUElZU0s6VU5LTk9XTjpSVS1LUzgKK1JVU1NJQTpEQUdFU1RBTjtHVU1CRVRPVlNLSVk6VU5LTk9XTjpSVS1HTVYKK1JVU1NJQTpEQUdFU1RBTjtCT1RMSUtIU0tJWTpVTktOT1dOOlJVLUJUSAorUlVTU0lBOkRBR0VTVEFOO0xFTklOU0tJWTpVTktOT1dOOlJVLUxOMgorUlVTU0lBOlRDSEVUQ0hFTklBKjtJVFVNLUtBTElOU0tJWTpVTktOT1dOOlJVLUlUTAorUlVTU0lBOkRBR0VTVEFOO1VOVFNVS1VMU0tJWTpVTktOT1dOOlJVLVVOTAorUlVTU0lBOkRBR0VTVEFOO0JVWU5BS1NLOlVOS05PV046UlUtQlkgCitSVVNTSUE6REFHRVNUQU47S0hVTlpBS0hTS0lZOlVOS05PV046UlUtS1VLCitSVVNTSUE6REFHRVNUQU47QUtIVkFLSFNLSVk6VU5LTk9XTjpSVS1BS0gKK1JVU1NJQTpEQUdFU1RBTjtUU1VNQURJTlNLSVk6VU5LTk9XTjpSVS1UU1kKK1JVU1NJQTpEQUdFU1RBTjtLQVlBS0VOVFNLSVk6VU5LTk9XTjpSVS1LWVQKK1JVU1NJQTpEQUdFU1RBTjtMRVZBU0hJTlNLSVk6VU5LTk9XTjpSVS1MVk4KK1JVU1NJQTpEQUdFU1RBTjtHRVJHRUJJTFNLSVk6VU5LTk9XTjpSVS1HUkwKK1JVU1NJQTpEQUdFU1RBTjtJWkJFUkJBU0g6VU5LTk9XTjpSVS1JWkIKK1JVU1NJQTpEQUdFU1RBTjtTT1ZFVFNLSVk6VU5LTk9XTjpSVS1TRVMKK1JVU1NJQTpEQUdFU1RBTjtHVU5JQlNLSVk6VU5LTk9XTjpSVS1HTlMKK1JVU1NJQTpEQUdFU1RBTjtTRVJHT0tBTElOU0tJWTpVTktOT1dOOlJVLVNSMworUlVTU0lBOkRBR0VTVEFOO1RTVU5USU5TS0lZOlVOS05PV046UlUtVFMgCitSVVNTSUE6REFHRVNUQU47QUtVU0hJTlNLSVk6VU5LTk9XTjpSVS1BS0sKK1JVU1NJQTpEQUdFU1RBTjtUTFlBUkFUSU5TS0lZOlVOS05PV046UlUtVExOCitSVVNTSUE6REFHRVNUQU47Q0hBUk9ESU5TS0lZOlVOS05PV046UlUtQ0FOCitSVVNTSUE6REFHRVNUQU47REVSQkVOVFNLSVk6VU5LTk9XTjpSVS1EUlQKK1JVU1NJQTpEQUdFU1RBTjtMQUtTS0lZOlVOS05PV046UlUtTEtJCitSVVNTSUE6REFHRVNUQU47S0FZVEFHU0tJWTpVTktOT1dOOlJVLUtZRworUlVTU0lBOkRBR0VTVEFOO0RBS0hBREFZRVZTS0lZOlVOS05PV046UlUtREtZCitSVVNTSUE6REFHRVNUQU47S1VMSU5TS0lZOlVOS05PV046UlUtS0lLCitSVVNTSUE6REFHRVNUQU47REVSQkVOVDpVTktOT1dOOlJVLURSTgorUlVTU0lBOkRBR0VTVEFOO0RBR0VTVEFOU0tJWUUgT0dOSTpVTktOT1dOOlJVLURHSworUlVTU0lBOkRBR0VTVEFOO1RBQkFTQVJBTlNLSVk6VU5LTk9XTjpSVS1UQk4KK1JVU1NJQTpEQUdFU1RBTjtBR1VMU0tJWTpVTktOT1dOOlJVLUFHSworUlVTU0lBOkRBR0VTVEFOO1JVVFVMU0tJWTpVTktOT1dOOlJVLVJUUworUlVTU0lBOkRBR0VTVEFOO01BR0FSQU1LRU5UU0tJWTpVTktOT1dOOlJVLU1HVAorUlVTU0lBOkRBR0VTVEFOO0tISVZTS0lZOlVOS05PV046UlUtS0lZCitSVVNTSUE6REFHRVNUQU47U1VMRVlNQU4tU1RBTFNLSVk6VU5LTk9XTjpSVS1TTEwKK1JVU1NJQTpEQUdFU1RBTjtLVVJBS0hTS0lZOlVOS05PV046UlUtS0tICitSVVNTSUE6REFHRVNUQU47QUtIVFlOU0tJWTpVTktOT1dOOlJVLUFLSQorUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO0lWREVMOlVOS05PV046UlUtSVZMCitSVVNTSUE6UEVSTVNLQe9BIE9CTEFTVCBS6VNJRFVFTDtLUkFTTk9WSVNIRVJTS0lZOlVOS05PV046UlUtS1NICitSVVNTSUE6UEVSTVNLQe9BIE9CTEFTVCBS6VNJRFVFTDtDSEVSRFlOU0tJWTpVTktOT1dOOlJVLUNFTgorUlVTU0lBOktPTUktUEVSTUlBVFNLSSBOQVRJT05BTDtHQVlOU0tJWTpVTktOT1dOOlJVLUdZUworUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO1NFVkVST1VSQUxTSzpVTktOT1dOOlJVLVNFUgorUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO0dBUklOU0tJWTpVTktOT1dOOlJVLUdSMworUlVTU0lBOktPTUktUEVSTUlBVFNLSSBOQVRJT05BTDtLT1NJTlNLSVk6VU5LTk9XTjpSVS1LUzkKK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO1NPTElLQU1TS0lZOlVOS05PV046UlUtU0xNCitSVVNTSUE6U1ZFUkRMT1ZTS0HvQSBPQkxBU1Q7S0FSUElOU0s6VU5LTk9XTjpSVS1LUFMKK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtTRVJPVlNLSVk6VU5LTk9XTjpSVS1TUjQKK1JVU1NJQTpLT01JLVBFUk1JQVRTS0kgTkFUSU9OQUw7S09DSEVWU0tJWTpVTktOT1dOOlJVLUtDSQorUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO0tSQVNOT1RVUklOU0s6VU5LTk9XTjpSVS1LTjUKK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO0FMRUtTQU5EUk9WU0s6VU5LTk9XTjpSVS1BTEQKK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO1VTT0xTS0lZOlVOS05PV046UlUtVU9TCitSVVNTSUE6S09NSS1QRVJNSUFUU0tJIE5BVElPTkFMO1lVUkxJTlNLSVk6VU5LTk9XTjpSVS1ZUjIKK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtTRVJPVjpVTktOT1dOOlJVLVNFIAorUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO05PVk9MWUFMSU5TS0lZOlVOS05PV046UlUtTk9MCitSVVNTSUE6UEVSTVNLQe9BIE9CTEFTVCBS6VNJRFVFTDtTT0xJS0FNU0s6VU5LTk9XTjpSVS1TTDQKK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO0JFUkVaTklLSTpVTktOT1dOOlJVLUJFTgorUlVTU0lBOktPTUktUEVSTUlBVFNLSSBOQVRJT05BTDtLVURZTUtBUlNLSVk6VU5LTk9XTjpSVS1LRFIKK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtUQUJPUklOU0tJWTpVTktOT1dOOlJVLVRCSworUlVTU0lBOlBFUk1TS0HvQSBPQkxBU1QgUulTSURVRUw7S0laRUw6VU5LTk9XTjpSVS1LSUwKK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO0dPUk5PWkFWT0RTS0lZOlVOS05PV046UlUtR1JPCitSVVNTSUE6S09NSS1QRVJNSUFUU0tJIE5BVElPTkFMO1lVU1ZJTlNLSVk6VU5LTk9XTjpSVS1ZU0sKK1JVU1NJQTpLT01JLVBFUk1JQVRTS0kgTkFUSU9OQUw7S1VEWU1LQVI6VU5LTk9XTjpSVS1LRE0KK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtBTEFQQVlFVlNLSVk6VU5LTk9XTjpSVS1BTDcKK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtWRVJLSE9UVVJTS0lZOlVOS05PV046UlUtVlIzCitSVVNTSUE6UEVSTVNLQe9BIE9CTEFTVCBS6VNJRFVFTDtET0JSWUFOU0tJWTpVTktOT1dOOlJVLURCIAorUlVTU0lBOlBFUk1TS0HvQSBPQkxBU1QgUulTSURVRUw7R1JFTVlBQ0hJTlNLOlVOS05PV046UlUtR1JDCitSVVNTSUE6U1ZFUkRMT1ZTS0HvQSBPQkxBU1Q7TklaSE5ZQVlBIFRVUkE6VU5LTk9XTjpSVS1OWkEKK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO0dVQkFLSEE6VU5LTk9XTjpSVS1HQksKK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO0lMWUlOU0tJWTpVTktOT1dOOlJVLUlMSQorUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO0tBQ0hLQU5BUjpVTktOT1dOOlJVLUtDTgorUlVTU0lBOlBFUk1TS0HvQSBPQkxBU1QgUulTSURVRUw7S0FSQUdBWVNLSVk6VU5LTk9XTjpSVS1LR1kKK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtUVVJJTlNLSVk6VU5LTk9XTjpSVS1USVMKK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO0NIVVNPVlNLT1k6VU5LTk9XTjpSVS1DVUsKK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO1NJVklOU0tJWTpVTktOT1dOOlJVLVNJSworUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO1RBVkRJTlNLSVk6VU5LTk9XTjpSVS1UVk4KK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtLVVNIVkE6VU5LTk9XTjpSVS1LVUgKK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtLUkFTTk9VUkFMU0s6VU5LTk9XTjpSVS1LU0wKK1JVU1NJQTpPVURNT1VSVElBO0dMQVpPVlNLSVk6VU5LTk9XTjpSVS1HTEkKK1JVU1NJQTpPVURNT1VSVElBO0JBTEVaSU5TS0lZOlVOS05PV046UlUtQkVTCitSVVNTSUE6U1ZFUkRMT1ZTS0HvQSBPQkxBU1Q7VkVSS0hORVNBTERJTlNLSVk6VU5LTk9XTjpSVS1WUjQKK1JVU1NJQTpPVURNT1VSVElBO1lBUlNLSVk6VU5LTk9XTjpSVS1ZUjMKK1JVU1NJQTpPVURNT1VSVElBO0tFWlNLSVk6VU5LTk9XTjpSVS1LWjEKK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO05ZVFZFTlNLSVk6VU5LTk9XTjpSVS1OWVMKK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO0tSQVNOT0tBTVNLOlVOS05PV046UlUtS042CitSVVNTSUE6UEVSTVNLQe9BIE9CTEFTVCBS6VNJRFVFTDtDSFVTT1ZPWTpVTktOT1dOOlJVLUNVTworUlVTU0lBOlBFUk1TS0HvQSBPQkxBU1QgUulTSURVRUw7VkVSRVNDSEFHSU5TS0lZOlVOS05PV046UlUtVlJHCitSVVNTSUE6UEVSTVNLQe9BIE9CTEFTVCBS6VNJRFVFTDtMWVNWRU5TS0lZOlVOS05PV046UlUtTFlZCitSVVNTSUE6U1ZFUkRMT1ZTS0HvQSBPQkxBU1Q7UFJJR09ST0ROWUk6VU5LTk9XTjpSVS1QSVkKK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO1BFUk06VU5LTk9XTjpSVS1QRU0KK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO1BFUk1TS0lZOlVOS05PV046UlUtUE1TCitSVVNTSUE6UEVSTVNLQe9BIE9CTEFTVCBS6VNJRFVFTDtMWVNWQTpVTktOT1dOOlJVLUxZQQorUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO05JWkhOSUFZQSBTQUxEQTpVTktOT1dOOlJVLU5aIAorUlVTU0lBOk9VRE1PVVJUSUE7WVVLQU1FTlNLSVk6VU5LTk9XTjpSVS1ZS04KK1JVU1NJQTpPVURNT1VSVElBO0dMQVpPVjpVTktOT1dOOlJVLUdMWgorUlVTU0lBOlBFUk1TS0HvQSBPQkxBU1QgUulTSURVRUw7T0NIRVJTS0lZOlVOS05PV046UlUtT0NTCitSVVNTSUE6U1ZFUkRMT1ZTS0HvQSBPQkxBU1Q7VkVSS0hOSUFZQSBTQUxEQTpVTktOT1dOOlJVLVZSQQorUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO0lSQklUU0tJWTpVTktOT1dOOlJVLUlSWQorUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO1RBVkRBOlVOS05PV046UlUtVEFECitSVVNTSUE6U1ZFUkRMT1ZTS0HvQSBPQkxBU1Q7TklaSE5JWSBUQUdJTDpVTktOT1dOOlJVLU5aMQorUlVTU0lBOlBFUk1TS0HvQSBPQkxBU1QgUulTSURVRUw7S1VOR1VSU0tJWTpVTktOT1dOOlJVLUtONworUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO0FMQVBBWUVWU0s6VU5LTk9XTjpSVS1BTDgKK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtTTE9CT0RPLVRVUklOU0tJWTpVTktOT1dOOlJVLVNMNQorUlVTU0lBOlBFUk1TS0HvQSBPQkxBU1QgUulTSURVRUw7T0tIQU5TS0lZOlVOS05PV046UlUtT0s0CitSVVNTSUE6UEVSTVNLQe9BIE9CTEFTVCBS6VNJRFVFTDtCRVJZT1pPVlNLSVk6VU5LTk9XTjpSVS1CWVkKK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO0JPTFNIRVNPU05PVlNLSVk6VU5LTk9XTjpSVS1CU1MKK1JVU1NJQTpPVURNT1VSVElBO0tSQVNOT0dPUlNLSVk6VU5LTk9XTjpSVS1LTjgKK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtCQVlLQUxPVlNLSVk6VU5LTk9XTjpSVS1CWTEKK1JVU1NJQTpPVURNT1VSVElBO0RFQkVTU0tJWTpVTktOT1dOOlJVLURCMQorUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO05FVllBTlNLSVk6VU5LTk9XTjpSVS1OWUkKK1JVU1NJQTpPVURNT1VSVElBO0lHUklOU0tJWTpVTktOT1dOOlJVLUlHUworUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO1NIQUxJTlNLSVk6VU5LTk9XTjpSVS1TQTEKK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtSRVpIRVZTS0lZOlVOS05PV046UlUtUlpZCitSVVNTSUE6U1ZFUkRMT1ZTS0HvQSBPQkxBU1Q7S0lST1ZHUkFEOlVOS05PV046UlUtS09HCitSVVNTSUE6U1ZFUkRMT1ZTS0HvQSBPQkxBU1Q7QVJUWUVNT1ZTS0lZOlVOS05PV046UlUtQVIyCitSVVNTSUE6U1ZFUkRMT1ZTS0HvQSBPQkxBU1Q7SVJCSVQ6VU5LTk9XTjpSVS1JUiAKK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtORVZZQU5TSzpVTktOT1dOOlJVLU5ZIAorUlVTU0lBOlBFUk1TS0HvQSBPQkxBU1QgUulTSURVRUw7T1NJTlNLWTpVTktOT1dOOlJVLU9TWQorUlVTU0lBOlBFUk1TS0HvQSBPQkxBU1QgUulTSURVRUw7Q0hBU1RJTlNLSVk6VU5LTk9XTjpSVS1DQVMKK1JVU1NJQTpPVURNT1VSVElBO1NFTFRJTlNLSVk6VU5LTk9XTjpSVS1TTDYKK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO0tJU0hFUlRTS0lZOlVOS05PV046UlUtS1NUCitSVVNTSUE6T1VETU9VUlRJQTtTSEFSS0FOU0tJWTpVTktOT1dOOlJVLVNBMgorUlVTU0lBOk9VRE1PVVJUSUE7U1lVTVNJTlNLSVk6VU5LTk9XTjpSVS1TWTEKK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO0tVTkdVUjpVTktOT1dOOlJVLUtVRworUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO1JFWlNIOlVOS05PV046UlUtUkVTCitSVVNTSUE6U1ZFUkRMT1ZTS0HvQSBPQkxBU1Q7VFVHVUxZTVNLSVk6VU5LTk9XTjpSVS1UR0sKK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtBUlRZT01PVlNLSVk6VU5LTk9XTjpSVS1BUjMKK1JVU1NJQTpPVURNT1VSVElBO1lBS1NIVVItQk9EWUlOU0tJWTpVTktOT1dOOlJVLVlLRAorUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO1BFUlZPVVJBTFNLOlVOS05PV046UlUtUFZMCitSVVNTSUE6U1ZFUkRMT1ZTS0HvQSBPQkxBU1Q7VkVSS0hOWUFZIFBZU0hNQTpVTktOT1dOOlJVLVZSUAorUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO1RBTElUU0tJWTpVTktOT1dOOlJVLVRMSQorUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO1BZU0hNSU5TS0lZOlVOS05PV046UlUtUFlOCitSVVNTSUE6T1VETU9VUlRJQTtVVklOU0tJWTpVTktOT1dOOlJVLVVWUworUlVTU0lBOlBFUk1TS0HvQSBPQkxBU1QgUulTSURVRUw7U1VLU1VOU0tJWTpVTktOT1dOOlJVLVNLSQorUlVTU0lBOk9VRE1PVVJUSUE7Vk9US0lOU0tJWTpVTktOT1dOOlJVLVZUTgorUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO0FTQkVTVDpVTktOT1dOOlJVLUFTVAorUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO0tBTVlTSExPVlNLSVk6VU5LTk9XTjpSVS1LTTYKK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtCRVJFWk9WU0tJWTpVTktOT1dOOlJVLUJFVgorUlVTU0lBOlBFUk1TS0HvQSBPQkxBU1QgUulTSURVRUw7T1JESU5TS1k6VU5LTk9XTjpSVS1PUlkKK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtTVUtIT0xPWkhTS0lZOlVOS05PV046UlUtU0tICitSVVNTSUE6UEVSTVNLQe9BIE9CTEFTVCBS6VNJRFVFTDtCQVJEWU1TS0lZOlVOS05PV046UlUtQkRNCitSVVNTSUE6UEVSTVNLQe9BIE9CTEFTVCBS6VNJRFVFTDtZRUxPVlNLSVk6VU5LTk9XTjpSVS1ZTFkKK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtOSVpITkVTRVJHSU5TS0lZOlVOS05PV046UlUtTloyCitSVVNTSUE6U1ZFUkRMT1ZTS0HvQSBPQkxBU1Q7QUNISVRTS0lZOlVOS05PV046UlUtQUNLCitSVVNTSUE6UEVSTVNLQe9BIE9CTEFTVCBS6VNJRFVFTDtVSU5TS0lZOlVOS05PV046UlUtVU5JCitSVVNTSUE6T1VETU9VUlRJQTtaQVZZQUxPVlNLSVk6VU5LTk9XTjpSVS1aVksKK1JVU1NJQTpPVURNT1VSVElBO1ZPVEtJTlNLOlVOS05PV046UlUtVlRTCitSVVNTSUE6U1ZFUkRMT1ZTS0HvQSBPQkxBU1Q7WUVLQVRFUklOQlVSRzpVTktOT1dOOlJVLVlLQgorUlVTU0lBOk9VRE1PVVJUSUE7VkFWT1pIU0tJWTpVTktOT1dOOlJVLVZWSAorUlVTU0lBOk9VRE1PVVJUSUE7SVpIRVZTSzpVTktOT1dOOlJVLUlaIAorUlVTU0lBOlBFUk1TS0HvQSBPQkxBU1QgUulTSURVRUw7Q0hBWUtPVlNLSVk6VU5LTk9XTjpSVS1DQVYKK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtCRUxPWUFSU0tJWTpVTktOT1dOOlJVLUJPUworUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO1NVS0hPWSBMT0c6VU5LTk9XTjpSVS1TS1kKK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtLUkFTTk9VRklNU0tJWTpVTktOT1dOOlJVLUtSRgorUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO0JPR0RBTk9WSUNIU0tJWTpVTktOT1dOOlJVLUJHQworUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO0tBTVlTSExPVjpVTktOT1dOOlJVLUtNTworUlVTU0lBOlBFUk1TS0HvQSBPQkxBU1QgUulTSURVRUw7T0tUWUFCUlNLSVk6VU5LTk9XTjpSVS1PSzUKK1JVU1NJQTpTVkVSRExPVlNLQe9BIE9CTEFTVDtaQVJFQ0hOWTpVTktOT1dOOlJVLVpSQworUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO1JFVkRBOlVOS05PV046UlUtUkVECitSVVNTSUE6U1ZFUkRMT1ZTS0HvQSBPQkxBU1Q7Qk9HREFOT1ZJQ0g6VU5LTk9XTjpSVS1CR0gKK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO0tVWUVESU5TS0lZOlVOS05PV046UlUtS1k0CitSVVNTSUE6UEVSTVNLQe9BIE9CTEFTVCBS6VNJRFVFTDtDSEVSTlVTSElOU0tJWTpVTktOT1dOOlJVLUNFSAorUlVTU0lBOktPVVJHQU5TS0HvQSBPQkxBU1Q7U0hBVFJPVlNLSVk6VU5LTk9XTjpSVS1TQTMKK1JVU1NJQTpPVURNT1VSVElBO0tJWk5FUlNLSVk6VU5LTk9XTjpSVS1LWjIKK1JVU1NJQTpQRVJNU0tB70EgT0JMQVNUIFLpU0lEVUVMO0NIQVlLT1ZTS1k6VU5LTk9XTjpSVS1DQUsKK1JVU1NJQTpPVURNT1VSVElBO01BTE9QVVJHSU5TS0lZOlVOS05PV046UlUtTUxHCitSVVNTSUE6U1ZFUkRMT1ZTS0HvQSBPQkxBU1Q7U1lTRVJUU0tJWTpVTktOT1dOOlJVLVNZVAorUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO0FSVElOU0tJWTpVTktOT1dOOlJVLUFSNAorUlVTU0lBOk9VRE1PVVJUSUE7TU9aSEdJTlNLSVk6VU5LTk9XTjpSVS1NWjEKK1JVU1NJQTpPVURNT1VSVElBO1NBUkFQVUxTS0lZOlVOS05PV046UlUtU1I1CitSVVNTSUE6U1ZFUkRMT1ZTS0HvQSBPQkxBU1Q7UE9MRVZTS09ZOlVOS05PV046UlUtUExPCitSVVNTSUE6U1ZFUkRMT1ZTS0HvQSBPQkxBU1Q7S0FNRU5TS0lZOlVOS05PV046UlUtS003CitSVVNTSUE6S09VUkdBTlNLQe9BIE9CTEFTVDtEQUxNQVRPVlNLSVk6VU5LTk9XTjpSVS1ETFYKK1JVU1NJQTpLT1VSR0FOU0tB70EgT0JMQVNUO0tBVEFZU0tJWTpVTktOT1dOOlJVLUtUSworUlVTU0lBOlNWRVJETE9WU0tB70EgT0JMQVNUO0tBTUVOU0stVVJBTFNLSVk6VU5LTk9XTjpSVS1LTVUKK1JVU1NJQTpPVURNT1VSVElBO1NBUkFQVUw6VU5LTk9XTjpSVS1TUlUKK1JVU1NJQTpLT1VSR0FOU0tB70EgT0JMQVNUO1NIQURSSU5TS0lZOlVOS05PV046UlUtU0E0CitSVVNTSUE6QkFDSEtJUklBO1lBTkFVTFNLSVk6VU5LTk9XTjpSVS1ZTkwKK1JVU1NJQTpPVURNT1VSVElBO0tBTUJBUlNLSVk6VU5LTk9XTjpSVS1LTVIKK1JVU1NJQTpPVURNT1VSVElBO0tJWUFTT1ZTS0lZOlVOS05PV046UlUtS1k1CitSVVNTSUE6T1VETU9VUlRJQTtNT0daU0hBOlVOS05PV046UlUtTUdBCitSVVNTSUE6QkFDSEtJUklBO1RBVFlTSExJTlNLSVk6VU5LTk9XTjpSVS1UVEkKK1JVU1NJQTpCQUNIS0lSSUE7QVNLSU5TS0lZOlVOS05PV046UlUtQVNLCitSVVNTSUE6T1VETU9VUlRJQTtBTE5BU0hTS0lZOlVOS05PV046UlUtQUw5CitSVVNTSUE6VENIRUxJQUJJTlNLQe9BIE9CTEFTVDtLQVNMSU5TS0lZOlVOS05PV046UlUtS0kxCitSVVNTSUE6VENIRUxJQUJJTlNLQe9BIE9CTEFTVDtOWUFaRVBFVFJPVlNLU0tJWTpVTktOT1dOOlJVLU5ZVgorUlVTU0lBOkJBQ0hLSVJJQTtZQU5BVUw6VU5LTk9XTjpSVS1ZQVUKK1JVU1NJQTpLT1VSR0FOU0tB70EgT0JMQVNUO0JFTE9aRVJTS0lZOlVOS05PV046UlUtQk9LCitSVVNTSUE6VENIRUxJQUJJTlNLQe9BIE9CTEFTVDtLVU5BU0hBS1NLSVk6VU5LTk9XTjpSVS1LTjkKK1JVU1NJQTpCQUNIS0lSSUE7S1JBU05PS0FNU0tJWTpVTktOT1dOOlJVLUtPTQorUlVTU0lBOk9VRE1PVVJUSUE7R1JBS0hPVlNLSVk6VU5LTk9XTjpSVS1HUjQKK1JVU1NJQTpPVURNT1VSVElBO0tBUkFLVUxJTlNLSVk6VU5LTk9XTjpSVS1LS1MKK1JVU1NJQTpUQ0hFTElBQklOU0tB70EgT0JMQVNUO1ZFUktITklZIFVGQUxFWTpVTktOT1dOOlJVLVZSRgorUlVTU0lBOkJBQ0hLSVJJQTtCQUxUQUNIRVZTS0lZOlVOS05PV046UlUtQlRJCitSVVNTSUE6S09VUkdBTlNLQe9BIE9CTEFTVDtLQVJHQVBPTFNLSVk6VU5LTk9XTjpSVS1LR0wKK1JVU1NJQTpCQUNIS0lSSUE7QkVMT0tBVEFZU0tJWTpVTktOT1dOOlJVLUJPWQorUlVTU0lBOktPVVJHQU5TS0HvQSBPQkxBU1Q7U0hBRFJJTlNLOlVOS05PV046UlUtU0E1CitSVVNTSUE6QkFDSEtJUklBO0tBTFRBU0lOU0tJWTpVTktOT1dOOlJVLUtUSQorUlVTU0lBOkJBQ0hLSVJJQTtLQVJBSURFTFNLSVk6VU5LTk9XTjpSVS1LSTIKK1JVU1NJQTpCQUNIS0lSSUE7TUVDSEVUTElOU0tJWTpVTktOT1dOOlJVLU1DUworUlVTU0lBOkJBQ0hLSVJJQTtEVVZBTlNLSVk6VU5LTk9XTjpSVS1EVlMKK1JVU1NJQTpCQUNIS0lSSUE7TkVGVEVLQU1TSzpVTktOT1dOOlJVLU5GSworUlVTU0lBOkJBQ0hLSVJJQTtCVVJBWUVWU0tJWTpVTktOT1dOOlJVLUJBUworUlVTU0lBOktPVVJHQU5TS0HvQSBPQkxBU1Q7VkFSR0FTSElOU0tJWTpVTktOT1dOOlJVLVZSNQorUlVTU0lBOktPVVJHQU5TS0HvQSBPQkxBU1Q7TU9LUk9VU09WU0tJWTpVTktOT1dOOlJVLU1LIAorUlVTU0lBOlRDSEVMSUFCSU5TS0HvQSBPQkxBU1Q7S1JBU05PQVJNRVlTS0lZOlVOS05PV046UlUtS1NFCitSVVNTSUE6VENIRUxJQUJJTlNLQe9BIE9CTEFTVDtLQVNMSTpVTktOT1dOOlJVLUsxCitSVVNTSUE6VENIRUxJQUJJTlNLQe9BIE9CTEFTVDtLWVNIVFlNOlVOS05PV046UlUtS1k2CitSVVNTSUE6S09VUkdBTlNLQe9BIE9CTEFTVDtNSVNIS0lOU0tJWTpVTktOT1dOOlJVLU1TSQorUlVTU0lBOkJBQ0hLSVJJQTtNSVNIS0lOU0tJWTpVTktOT1dOOlJVLU1TWQorUlVTU0lBOktPVVJHQU5TS0HvQSBPQkxBU1Q7U0NIVUNIQU5TS0lZOlVOS05PV046UlUtU0NZCitSVVNTSUE6S09VUkdBTlNLQe9BIE9CTEFTVDtTSFVNSUtISU5TS0lZOlVOS05PV046UlUtU1VOCitSVVNTSUE6QkFDSEtJUklBO0lMSVNIRVZTS0lZOlVOS05PV046UlUtSUxWCitSVVNTSUE6S09VUkdBTlNLQe9BIE9CTEFTVDtLRVRPVlNLSVk6VU5LTk9XTjpSVS1LVFkKK1JVU1NJQTpCQUNIS0lSSUE7RFlVUlRZVUxJTlNLSVk6VU5LTk9XTjpSVS1EWUwKK1JVU1NJQTpUQ0hFTElBQklOU0tB70EgT0JMQVNUO0FSR0FZQVNIU0tJWTpVTktOT1dOOlJVLUFSNQorUlVTU0lBOktPVVJHQU5TS0HvQSBPQkxBU1Q7Q0hBU1RPT1pFUlNLSVk6VU5LTk9XTjpSVS1DSFoKK1JVU1NJQTpCQUNIS0lSSUE7S0lHSU5TS0lZOlVOS05PV046UlUtS0dTCitSVVNTSUE6VENIRUxJQUJJTlNLQe9BIE9CTEFTVDtLQVJBQkFTSDpVTktOT1dOOlJVLUtBQgorUlVTU0lBOktPVVJHQU5TS0HvQSBPQkxBU1Q7WVVSR0FNWVNIU0tJWTpVTktOT1dOOlJVLVlSSAorUlVTU0lBOlRDSEVMSUFCSU5TS0HvQSBPQkxBU1Q7U09TTk9WU0tJWTpVTktOT1dOOlJVLVNTMQorUlVTU0lBOkJBQ0hLSVJJQTtOVVJJTUFOT1ZTS0lZOlVOS05PV046UlUtTlJWCitSVVNTSUE6QkFDSEtJUklBO0JJUlNLSVk6VU5LTk9XTjpSVS1CU0kKK1JVU1NJQTpLT1VSR0FOU0tB70EgT0JMQVNUO0xFQllBWkhZRVZTS0lZOlVOS05PV046UlUtTEJZCitSVVNTSUE6VENIRUxJQUJJTlNLQe9BIE9CTEFTVDtLVVNJTlNLSVk6VU5LTk9XTjpSVS1LSTMKK1JVU1NJQTpCQUNIS0lSSUE7U0FMQVZBVFNLSVk6VU5LTk9XTjpSVS1TTDcKK1JVU1NJQTpCQUNIS0lSSUE7QkxBR09WRVNIQ0hFTlNLSVk6VU5LTk9XTjpSVS1CQUMKK1JVU1NJQTpLT1VSR0FOU0tB70EgT0JMQVNUO01BS1VTSElOU0tJWTpVTktOT1dOOlJVLU1LTgorUlVTU0lBOkJBQ0hLSVJJQTtEWVVSVFVMSTpVTktOT1dOOlJVLURZVAorUlVTU0lBOktPVVJHQU5TS0HvQSBPQkxBU1Q7S1VSR0FOOlVOS05PV046UlUtS1VBCitSVVNTSUE6VENIRUxJQUJJTlNLQe9BIE9CTEFTVDtNSUFTUzpVTktOT1dOOlJVLU1JUworUlVTU0lBOlRDSEVMSUFCSU5TS0HvQSBPQkxBU1Q7WkxBVE9VU1Q6VU5LTk9XTjpSVS1aTFUKK1JVU1NJQTpCQUNIS0lSSUE7QklSU0s6VU5LTk9XTjpSVS1CSVMKK1JVU1NJQTpLT1VSR0FOU0tB70EgT0JMQVNUO1BFVFVLSE9WU0tJWTpVTktOT1dOOlJVLVBUMgorUlVTU0lBOkJBQ0hLSVJJQTtCQUtBTElOU0tJWTpVTktOT1dOOlJVLUJLWQorUlVTU0lBOkJBQ0hLSVJJQTtDSEVLTUFHVVNIRVZTS0lZOlVOS05PV046UlUtQ0VFCitSVVNTSUE6VENIRUxJQUJJTlNLQe9BIE9CTEFTVDtDSEVMWUFCSU5TSzpVTktOT1dOOlJVLUNIQgorUlVTU0lBOlRDSEVMSUFCSU5TS0HvQSBPQkxBU1Q7U0FUS0lOU0tJWTpVTktOT1dOOlJVLVNUMworUlVTU0lBOlRDSEVMSUFCSU5TS0HvQSBPQkxBU1Q7QVNIWU5TS0lZOlVOS05PV046UlUtQVNJCitSVVNTSUE6QkFDSEtJUklBO0tVU0hOQVJFTktPVlNLSVk6VU5LTk9XTjpSVS1LRU4KK1JVU1NJQTpUQ0hFTElBQklOU0tB70EgT0JMQVNUO0tPUEVZU0s6VU5LTk9XTjpSVS1LUFkKK1JVU1NJQTpCQUNIS0lSSUE7SUdMSU5TS0lZOlVOS05PV046UlUtSUdLCitSVVNTSUE6S09VUkdBTlNLQe9BIE9CTEFTVDtQUklUT0JPTE5ZSTpVTktOT1dOOlJVLVBJTAorUlVTU0lBOlRDSEVMSUFCSU5TS0HvQSBPQkxBU1Q7Q0hFQkFSS1VMU0tJWTpVTktOT1dOOlJVLUNFTAorUlVTU0lBOktPVVJHQU5TS0HvQSBPQkxBU1Q7U0FGQUtVTEVWU0tJWTpVTktOT1dOOlJVLVNGUworUlVTU0lBOlRDSEVMSUFCSU5TS0HvQSBPQkxBU1Q7S0FUQVlFVi1JVkFOT1ZTS0lZOlVOS05PV046UlUtS1RBCitSVVNTSUE6S09VUkdBTlNLQe9BIE9CTEFTVDtLVVJUQU1ZU0hTS0lZOlVOS05PV046UlUtS1RICitSVVNTSUE6S09VUkdBTlNLQe9BIE9CTEFTVDtQT0xPVklOU0tJWTpVTktOT1dOOlJVLVBMMQorUlVTU0lBOktPVVJHQU5TS0HvQSBPQkxBU1Q7QUxNRU5FVlNLSVk6VU5LTk9XTjpSVS1BTVYKK1JVU1NJQTpUQ0hFTElBQklOU0tB70EgT0JMQVNUO1lFVEtVTFNLSVk6VU5LTk9XTjpSVS1ZVEwKK1JVU1NJQTpCQUNIS0lSSUE7QkxBR09WRVNIQ0hFTlNLOlVOS05PV046UlUtQkFFCitSVVNTSUE6VENIRUxJQUJJTlNLQe9BIE9CTEFTVDtTQVRLQTpVTktOT1dOOlJVLVNBNgorUlVTU0lBOkJBQ0hLSVJJQTtTSEFSQU5TS0lZOlVOS05PV046UlUtU0E3CitSVVNTSUE6VENIRUxJQUJJTlNLQe9BIE9CTEFTVDtBU0hBOlVOS05PV046UlUtQVNICitSVVNTSUE6QkFDSEtJUklBO1VGSU1TS0lZOlVOS05PV046UlUtVUZTCitSVVNTSUE6VENIRUxJQUJJTlNLQe9BIE9CTEFTVDtDSEVCQVJLVUwnOlVOS05PV046UlUtQ0hVCitSVVNTSUE6QkFDSEtJUklBO0JMQUdPVkFSU0tJWTpVTktOT1dOOlJVLUJBUgorUlVTU0lBOlRDSEVMSUFCSU5TS0HvQSBPQkxBU1Q7S09SS0lOTzpVTktOT1dOOlJVLUtLTworUlVTU0lBOlRDSEVMSUFCSU5TS0HvQSBPQkxBU1Q7VVNULUtBVEFZRVY6VU5LTk9XTjpSVS1VU1YKK1JVU1NJQTpCQUNIS0lSSUE7VUNIQUxZOlVOS05PV046UlUtVUNMCitSVVNTSUE6QkFDSEtJUklBO0JVWkRZQUtTS0lZOlVOS05PV046UlUtQlpJCitSVVNTSUE6QkFDSEtJUklBO1VGQTpVTktOT1dOOlJVLVVGQQorUlVTU0lBOkJBQ0hLSVJJQTtDSElTSE1JTlNLSVk6VU5LTk9XTjpSVS1DSU4KK1JVU1NJQTpCQUNIS0lSSUE7QVJLSEFOR0VMU0tJWTpVTktOT1dOOlJVLUFSTAorUlVTU0lBOlRDSEVMSUFCSU5TS0HvQSBPQkxBU1Q7WUVNQU5aSEVMSU5TSzpVTktOT1dOOlJVLVlNTAorUlVTU0lBOktPVVJHQU5TS0HvQSBPQkxBU1Q7VFNFTElOTllJOlVOS05PV046UlUtVFMxCitSVVNTSUE6QkFDSEtJUklBO1RVWU1BWklOU0tJWTpVTktOT1dOOlJVLVRZIAorUlVTU0lBOlRDSEVMSUFCSU5TS0HvQSBPQkxBU1Q7VVZFTFNLSVk6VU5LTk9XTjpSVS1VVksKK1JVU1NJQTpUQ0hFTElBQklOU0tB70EgT0JMQVNUO0tBVEFZRVYtSVZBTk9WU0s6VU5LTk9XTjpSVS1LVE8KK1JVU1NJQTpCQUNIS0lSSUE7QkVMT1JFVFNLSVk6VU5LTk9XTjpSVS1CT0kKK1JVU1NJQTpLT1VSR0FOU0tB70EgT0JMQVNUO1pWRVJJTk9HT0xPVlNLWTpVTktOT1dOOlJVLVpWTAorUlVTU0lBOlRDSEVMSUFCSU5TS0HvQSBPQkxBU1Q7T0tUWUFCUlNLSVk6VU5LTk9XTjpSVS1PSzYKK1JVU1NJQTpUQ0hFTElBQklOU0tB70EgT0JMQVNUO1VZU0tJWTpVTktOT1dOOlJVLVVZSworUlVTU0lBOkJBQ0hLSVJJQTtLQVJNQVNLQUxJTlNLSVk6VU5LTk9XTjpSVS1LTTgKK1JVU1NJQTpCQUNIS0lSSUE7VFVZTUFaWTpVTktOT1dOOlJVLVRZWgorUlVTU0lBOlRDSEVMSUFCSU5TS0HvQSBPQkxBU1Q7UExBU1Q6VU5LTk9XTjpSVS1QTDIKK1JVU1NJQTpCQUNIS0lSSUE7T0tUWUFCUlNLSVk6VU5LTk9XTjpSVS1PSzcKK1JVU1NJQTpUQ0hFTElBQklOU0tB70EgT0JMQVNUO1lVWkhOTy1VUkFMU0s6VU5LTk9XTjpSVS1ZWlUKK1JVU1NJQTpUQ0hFTElBQklOU0tB70EgT0JMQVNUO1RST0lUU0tJWTpVTktOT1dOOlJVLVRPUworUlVTU0lBOkJBQ0hLSVJJQTtCRUxFQkVZRVZTS0lZOlVOS05PV046UlUtQkVLCitSVVNTSUE6QkFDSEtJUklBO0RBVkxFS0FOT1ZTS0lZOlVOS05PV046UlUtRFZOCitSVVNTSUE6T1JFTkJPVVJHU0tB70EgT0JMQVNUO1NFVkVSTllJOlVOS05PV046UlUtU0VOCitSVVNTSUE6QkFDSEtJUklBO0dBRlVSSVlTS0lZOlVOS05PV046UlUtR0ZZCitSVVNTSUE6QkFDSEtJUklBO1lFUk1FS0VZRVZTS0lZOlVOS05PV046UlUtWVI0CitSVVNTSUE6QkFDSEtJUklBO0FVUkdBWklOU0tJWTpVTktOT1dOOlJVLUFSNgorUlVTU0lBOkJBQ0hLSVJJQTtBTFNIRVlFVlNLSVk6VU5LTk9XTjpSVS1BU1YKK1JVU1NJQTpCQUNIS0lSSUE7REFWTEVLQU5PVk86VU5LTk9XTjpSVS1EVk8KK1JVU1NJQTpUQ0hFTElBQklOU0tB70EgT0JMQVNUO1ZFUktITkVVUkFMU0tJWTpVTktOT1dOOlJVLVZSNgorUlVTU0lBOlRDSEVMSUFCSU5TS0HvQSBPQkxBU1Q7VFJPSVRTSzpVTktOT1dOOlJVLVRPVAorUlVTU0lBOkJBQ0hLSVJJQTtCRUxFQkVZOlVOS05PV046UlUtQkxCCitSVVNTSUE6T1JFTkJPVVJHU0tB70EgT0JMQVNUO0FCRFVMSU5TS0lZOlVOS05PV046UlUtQUJOCitSVVNTSUE6QkFDSEtJUklBO0JFTE9SRVRTSzpVTktOT1dOOlJVLUJPIAorUlVTU0lBOk9SRU5CT1VSR1NLQe9BIE9CTEFTVDtCVUdVUlVTTEFOU0tJWTpVTktOT1dOOlJVLUJHQQorUlVTU0lBOkJBQ0hLSVJJQTtBQlpFTElMT1ZTS0lZOlVOS05PV046UlUtQUJWCitSVVNTSUE6QkFDSEtJUklBO0JJWkhCVUxZQUtTS0lZOlVOS05PV046UlUtQlpZCitSVVNTSUE6QkFDSEtJUklBO1NURVJMSVRBTUFLU0tJWTpVTktOT1dOOlJVLVNUTQorUlVTU0lBOlRDSEVMSUFCSU5TS0HvQSBPQkxBU1Q7TkFHQVlCQUtTS0lZOlVOS05PV046UlUtTkcgCitSVVNTSUE6VENIRUxJQUJJTlNLQe9BIE9CTEFTVDtDSEVTTUVOU0tJWTpVTktOT1dOOlJVLUNFSQorUlVTU0lBOkJBQ0hLSVJJQTtNSVlBS0lOU0tJWTpVTktOT1dOOlJVLU1ZWQorUlVTU0lBOkJBQ0hLSVJJQTtJU0hJTUJBWVNLWTpVTktOT1dOOlJVLUlTWQorUlVTU0lBOk9SRU5CT1VSR1NLQe9BIE9CTEFTVDtBU0VLRVlFVlNLSVk6VU5LTk9XTjpSVS1BU1kKK1JVU1NJQTpUQ0hFTElBQklOU0tB70EgT0JMQVNUO0FHQVBPVlNLSVk6VU5LTk9XTjpSVS1BR1YKK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7QlVHVVJVU0xBTjpVTktOT1dOOlJVLUJHMQorUlVTU0lBOkJBQ0hLSVJJQTtTVEVSTElUQU1BSzpVTktOT1dOOlJVLVNUNAorUlVTU0lBOkJBQ0hLSVJJQTtTVEVSTElCQVNIRVZTS0lZOlVOS05PV046UlUtU1RICitSVVNTSUE6VENIRUxJQUJJTlNLQe9BIE9CTEFTVDtWQVJORU5TS0lZOlVOS05PV046UlUtVlI3CitSVVNTSUE6T1JFTkJPVVJHU0tB70EgT0JMQVNUO0FCRFVMSU5POlVOS05PV046UlUtQUJMCitSVVNTSUE6T1JFTkJPVVJHU0tB70EgT0JMQVNUO01BVFZFWUVWU0tJWTpVTktOT1dOOlJVLU1UVgorUlVTU0lBOkJBQ0hLSVJJQTtCVVJaWUFOU0tJWTpVTktOT1dOOlJVLUJaTgorUlVTU0lBOkJBQ0hLSVJJQTtJU0hJTUJBWTpVTktOT1dOOlJVLUlTTQorUlVTU0lBOlRDSEVMSUFCSU5TS0HvQSBPQkxBU1Q7TUFHTklUT0dPUlNLOlVOS05PV046UlUtTUdPCitSVVNTSUE6VENIRUxJQUJJTlNLQe9BIE9CTEFTVDtLQVJUQUxJTlNLSVk6VU5LTk9XTjpSVS1LVCAKK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7UE9OT01BUllPVlNLSVk6VU5LTk9XTjpSVS1QTlkKK1JVU1NJQTpCQUNIS0lSSUE7TUVMRVVaU0tJWTpVTktOT1dOOlJVLU1MWgorUlVTU0lBOkJBQ0hLSVJJQTtGWU9ET1JPVlNLSVk6VU5LTk9XTjpSVS1GWVYKK1JVU1NJQTpCQUNIS0lSSUE7U0FMQVZBVDpVTktOT1dOOlJVLVNMOAorUlVTU0lBOk9SRU5CT1VSR1NLQe9BIE9CTEFTVDtCVVpVTFVLU0tJWTpVTktOT1dOOlJVLUJaIAorUlVTU0lBOkJBQ0hLSVJJQTtCQVlNQUtTS0lZOlVOS05PV046UlUtQlkyCitSVVNTSUE6T1JFTkJPVVJHU0tB70EgT0JMQVNUO1NIQVJMWUtTS0lZOlVOS05PV046UlUtU0E4CitSVVNTSUE6T1JFTkJPVVJHU0tB70EgT0JMQVNUO0dSQUNIRVZTS0lZOlVOS05PV046UlUtR1I1CitSVVNTSUE6VENIRUxJQUJJTlNLQe9BIE9CTEFTVDtLSVpJTFNLSVk6VU5LTk9XTjpSVS1LWjMKK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7S1JBU05PR1ZBUkRFWVNLSVk6VU5LTk9XTjpSVS1LTkQKK1JVU1NJQTpUQ0hFTElBQklOU0tB70EgT0JMQVNUO0tBUlRBTFk6VU5LTk9XTjpSVS1LVEwKK1JVU1NJQTpCQUNIS0lSSUE7S1VHQVJDSElOU0tJWTpVTktOT1dOOlJVLUtHSworUlVTU0lBOkJBQ0hLSVJJQTtaSUxBSVJTS0lZOlVOS05PV046UlUtWkxSCitSVVNTSUE6QkFDSEtJUklBO01FTEVVWjpVTktOT1dOOlJVLU1FVQorUlVTU0lBOkJBQ0hLSVJJQTtLVU1FUlRBVVNLSVk6VU5LTk9XTjpSVS1LTTkKK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7QUxFS1NBTkRST1ZTS0lZOlVOS05PV046UlUtQUVSCitSVVNTSUE6T1JFTkJPVVJHU0tB70EgT0JMQVNUO0tVUk1BTkFZRVZTS0lZOlVOS05PV046UlUtS01FCitSVVNTSUE6VENIRUxJQUJJTlNLQe9BIE9CTEFTVDtCUkVESU5TS0lZOlVOS05PV046UlUtQkVJCitSVVNTSUE6T1JFTkJPVVJHU0tB70EgT0JMQVNUO0JVWlVMVUs6VU5LTk9XTjpSVS1CWkwKK1JVU1NJQTpCQUNIS0lSSUE7S1VNRVJUQVk6VU5LTk9XTjpSVS1LTVQKK1JVU1NJQTpCQUNIS0lSSUE7U0lCQVk6VU5LTk9XTjpSVS1TSVkKK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7U09ST0NISU5TS0lZOlVOS05PV046UlUtU1I2CitSVVNTSUE6T1JFTkJPVVJHU0tB70EgT0JMQVNUO09LVFlBQlJTS0lZOlVOS05PV046UlUtT0s4CitSVVNTSUE6T1JFTkJPVVJHU0tB70EgT0JMQVNUO05PVk9TRVJHSVlFVlNLSVk6VU5LTk9XTjpSVS1OT1kKK1JVU1NJQTpCQUNIS0lSSUE7QkFZTUFLOlVOS05PV046UlUtQkFNCitSVVNTSUE6T1JFTkJPVVJHU0tB70EgT0JMQVNUO1RPVFNLSVk6VU5LTk9XTjpSVS1UVFkKK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7VFlVTEdBTlNLSVk6VU5LTk9XTjpSVS1UWTEKK1JVU1NJQTpCQUNIS0lSSUE7WklBTkNIVVJJTlNLSVk6VU5LTk9XTjpSVS1aQVIKK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7S1ZBUktFTlNLSVk6VU5LTk9XTjpSVS1LViAKK1JVU1NJQTpCQUNIS0lSSUE7S0hBWUJVTExJTlNLSVk6VU5LTk9XTjpSVS1LWUwKK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7UEVSRVZPTE9UU0tJWTpVTktOT1dOOlJVLVBFVAorUlVTU0lBOk9SRU5CT1VSR1NLQe9BIE9CTEFTVDtQRVJWT01BWVNLSVk6VU5LTk9XTjpSVS1QViAKK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7U0FLTUFSU0tJWTpVTktOT1dOOlJVLVNLUgorUlVTU0lBOk9SRU5CT1VSR1NLQe9BIE9CTEFTVDtUQVNITElOU0tJWTpVTktOT1dOOlJVLVRTMgorUlVTU0lBOk9SRU5CT1VSR1NLQe9BIE9CTEFTVDtTQVJBS1RBU0hTS0lZOlVOS05PV046UlUtU1I3CitSVVNTSUE6T1JFTkJPVVJHU0tB70EgT0JMQVNUO09SRU5CVVJHU0tJWTpVTktOT1dOOlJVLU9SUgorUlVTU0lBOk9SRU5CT1VSR1NLQe9BIE9CTEFTVDtBREFNT1ZTS0lZOlVOS05PV046UlUtQURWCitSVVNTSUE6T1JFTkJPVVJHU0tB70EgT0JMQVNUO09SRU5CVVJHOlVOS05PV046UlUtT1JCCitSVVNTSUE6T1JFTkJPVVJHU0tB70EgT0JMQVNUO0tVVkFORFlLU0tJWTpVTktOT1dOOlJVLUtWMQorUlVTU0lBOk9SRU5CT1VSR1NLQe9BIE9CTEFTVDtHQVlTS0lZOlVOS05PV046UlUtR1lLCitSVVNTSUE6T1JFTkJPVVJHU0tB70EgT0JMQVNUO05PVk9PUlNLSVk6VU5LTk9XTjpSVS1OTyAKK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7SUxFS1NLSVk6VU5LTk9XTjpSVS1JTCAKK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7QkVMWUFFVlNLSVk6VU5LTk9XTjpSVS1CWTMKK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7S1VWQU5EWUs6VU5LTk9XTjpSVS1LVkQKK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7U1ZFVExJTlNLSVk6VU5LTk9XTjpSVS1TRUsKK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7R0FZOlVOS05PV046UlUtR0FZCitSVVNTSUE6T1JFTkJPVVJHU0tB70EgT0JMQVNUO01FRE5PR09SU0s6VU5LTk9XTjpSVS1NRE8KK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7U09MLUlMRVRTS0lZOlVOS05PV046UlUtU0w5CitSVVNTSUE6T1JFTkJPVVJHU0tB70EgT0JMQVNUO1lBU05FTlNLSVk6VU5LTk9XTjpSVS1ZU0kKK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7QUtCVUxBS1NLSVk6VU5LTk9XTjpSVS1BS1kKK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7T1JTSzpVTktOT1dOOlJVLU9SIAorUlVTU0lBOk9SRU5CT1VSR1NLQe9BIE9CTEFTVDtOT1ZPVFJPSVRTSzpVTktOT1dOOlJVLU5PVAorUlVTU0lBOk9SRU5CT1VSR1NLQe9BIE9CTEFTVDtET01CQVJPVlNLSVk6VU5LTk9XTjpSVS1ETSAKK1JVU1NJQTpPUkVOQk9VUkdTS0HvQSBPQkxBU1Q7WUFTTlk6VU5LTk9XTjpSVS1ZQU4KK1JVU1NJQTpJQU1BTE8tTkVORVRTS0kgTkFUSU9OQUw7WUFNQUxTS0lZOlVOS05PV046UlUtWU1TCitSVVNTSUE6SUFNQUxPLU5FTkVUU0tJIE5BVElPTkFMO1RBWk9WU0tJWTpVTktOT1dOOlJVLVRaUworUlVTU0lBOklBTUFMTy1ORU5FVFNLSSBOQVRJT05BTDtQUklVUkFMU0tJWTpVTktOT1dOOlJVLVBJSworUlVTU0lBOklBTUFMTy1ORU5FVFNLSSBOQVRJT05BTDtQVVJPVlNLSVk6VU5LTk9XTjpSVS1QT0sKK1JVU1NJQTpJQU1BTE8tTkVORVRTS0kgTkFUSU9OQUw7TkFEWU1TS0lZOlVOS05PV046UlUtTkRTCitSVVNTSUE6SUFNQUxPLU5FTkVUU0tJIE5BVElPTkFMO0tSQU5PU0VMS1VQU0tJWTpVTktOT1dOOlJVLUtBUAorUlVTU0lBOklBTUFMTy1ORU5FVFNLSSBOQVRJT05BTDtTSFVSWVNIS0FSU0tJWTpVTktOT1dOOlJVLVNVSworUlVTU0lBOklBTUFMTy1ORU5FVFNLSSBOQVRJT05BTDtMQUJZVE5BTkdJOlVOS05PV046UlUtTEJBCitSVVNTSUE6SUFNQUxPLU5FTkVUU0tJIE5BVElPTkFMO1NBTEVLSEFSRDpVTktOT1dOOlJVLVNFSAorUlVTU0lBOklBTUFMTy1ORU5FVFNLSSBOQVRJT05BTDtOT1ZZSSBVUkVOR09ZOlVOS05PV046UlUtTlZHCitSVVNTSUE6S0hBTlRZLU1BTlNJU0tJIE5BVElPTkFMO0JFUkVaT1ZTS0lZOlVOS05PV046UlUtQkVZCitSVVNTSUE6SUFNQUxPLU5FTkVUU0tJIE5BVElPTkFMO05BRFlNOlVOS05PV046UlUtTkFZCitSVVNTSUE6S0hBTlRZLU1BTlNJU0tJIE5BVElPTkFMO0JFTE9ZQVJTS0lZOlVOS05PV046UlUtQk8xCitSVVNTSUE6SUFNQUxPLU5FTkVUU0tJIE5BVElPTkFMO01VUkFWTEVOS086VU5LTk9XTjpSVS1NUkwKK1JVU1NJQTpLSEFOVFktTUFOU0lTS0kgTkFUSU9OQUw7QkVMT1lBUlNLWTpVTktOT1dOOlJVLUJPMgorUlVTU0lBOktIQU5UWS1NQU5TSVNLSSBOQVRJT05BTDtPS1RZQUJSU0tJWTpVTktOT1dOOlJVLU9LOQorUlVTU0lBOktIQU5UWS1NQU5TSVNLSSBOQVRJT05BTDtTVVJHVVRTS0lZOlVOS05PV046UlUtU1JUCitSVVNTSUE6SUFNQUxPLU5FTkVUU0tJIE5BVElPTkFMO05PWUFCUlNLOlVOS05PV046UlUtTllCCitSVVNTSUE6S0hBTlRZLU1BTlNJU0tJIE5BVElPTkFMO0tIQU5UWS1NQU5TSVlTS0lZOlVOS05PV046UlUtS1QxCitSVVNTSUE6S0hBTlRZLU1BTlNJU0tJIE5BVElPTkFMO05JWkhORVZBUlRPVlNLSVk6VU5LTk9XTjpSVS1OWk8KK1JVU1NJQTpLSEFOVFktTUFOU0lTS0kgTkFUSU9OQUw7U09WRVRTS0lZOlVOS05PV046UlUtU0VJCitSVVNTSUE6S0hBTlRZLU1BTlNJU0tJIE5BVElPTkFMO05ZQUdBTjpVTktOT1dOOlJVLU5ZRworUlVTU0lBOktIQU5UWS1NQU5TSVNLSSBOQVRJT05BTDtLT0dBTFlNOlVOS05PV046UlUtS0dNCitSVVNTSUE6S0hBTlRZLU1BTlNJU0tJIE5BVElPTkFMO1JBRFVaSE5ZSTpVTktOT1dOOlJVLVJESAorUlVTU0lBOktIQU5UWS1NQU5TSVNLSSBOQVRJT05BTDtQT0tBQ0hZOlVOS05PV046UlUtUEtDCitSVVNTSUE6S0hBTlRZLU1BTlNJU0tJIE5BVElPTkFMO1NVUkdVVDpVTktOT1dOOlJVLVNVRworUlVTU0lBOktIQU5UWS1NQU5TSVNLSSBOQVRJT05BTDtMQU5HRVBBUzpVTktOT1dOOlJVLUxOUAorUlVTU0lBOktIQU5UWS1NQU5TSVNLSSBOQVRJT05BTDtLT05ESU5TS0lZOlVOS05PV046UlUtS0ROCitSVVNTSUE6S0hBTlRZLU1BTlNJU0tJIE5BVElPTkFMO05FRlRFWVVHQU5TS0lZOlVOS05PV046UlUtTkZHCitSVVNTSUE6S0hBTlRZLU1BTlNJU0tJIE5BVElPTkFMO05FRlRFVUdBTlNLOlVOS05PV046UlUtTkZBCitSVVNTSUE6S0hBTlRZLU1BTlNJU0tJIE5BVElPTkFMO0tIQU5UWS1NQU5TWUlTSzpVTktOT1dOOlJVLUtUMgorUlVTU0lBOlRPTVNLQe9BIE9CTEFTVDtLQVJHQVNPS1NLSVk6VU5LTk9XTjpSVS1LR0kKK1JVU1NJQTpLSEFOVFktTUFOU0lTS0kgTkFUSU9OQUw7TUVHSU9OOlVOS05PV046UlUtTUVPCitSVVNTSUE6S0hBTlRZLU1BTlNJU0tJIE5BVElPTkFMO05JWlNITlZBUlRPVlNLOlVOS05PV046UlUtTlozCitSVVNTSUE6S0hBTlRZLU1BTlNJU0tJIE5BVElPTkFMO1BZVC1ZQUtIOlVOS05PV046UlUtUFlZCitSVVNTSUE6VE9NU0tB70EgT0JMQVNUO1NUUkVaSEVWT0o6VU5LTk9XTjpSVS1TVEUKK1JVU1NJQTpLSEFOVFktTUFOU0lTS0kgTkFUSU9OQUw7VVJBWTpVTktOT1dOOlJVLVVSMQorUlVTU0lBOlRJT1VNRU5TS0HvQSBPQkwuIFLpU0lEVUU7VVZBVFNLSVk6VU5LTk9XTjpSVS1VVkkKK1JVU1NJQTpUT01TS0HvQSBPQkxBU1Q7VkVSS0hORUtFVFNLSVk6VU5LTk9XTjpSVS1WUjgKK1JVU1NJQTpUT01TS0HvQSBPQkxBU1Q7UEFSQUJFTFNLSVk6VU5LTk9XTjpSVS1QQUwKK1JVU1NJQTpUT01TS0HvQSBPQkxBU1Q7S09MUEFTSEVWU0tJWTpVTktOT1dOOlJVLUtQVgorUlVTU0lBOlRJT1VNRU5TS0HvQSBPQkwuIFLpU0lEVUU7VE9CT0xTS0lZOlVOS05PV046UlUtVEJJCitSVVNTSUE6VElPVU1FTlNLQe9BIE9CTC4gUulTSURVRTtWQUdBWVNLSVk6VU5LTk9XTjpSVS1WR1MKK1JVU1NJQTpPTVNLQe9BIE9CTEFTVDtUQVJTS0lZOlVOS05PV046UlUtVFMzCitSVVNTSUE6T01TS0HvQSBPQkxBU1Q7VVNULUlTSElNU0tJWTpVTktOT1dOOlJVLVVUTQorUlVTU0lBOlRPTVNLQe9BIE9CTEFTVDtQRVJWT01BWVNLSVk6VU5LTk9XTjpSVS1QVjEKK1JVU1NJQTpUT01TS0HvQSBPQkxBU1Q7VEVHVUxERVRTS0lZOlVOS05PV046UlUtVEdUCitSVVNTSUE6VE9NU0tB70EgT0JMQVNUO0tPTFBBU0hFVk86VU5LTk9XTjpSVS1LTEgKK1JVU1NJQTpUSU9VTUVOU0tB70EgT0JMLiBS6VNJRFVFO1RPQk9MU0s6VU5LTk9XTjpSVS1UQkwKK1JVU1NJQTpPTVNLQe9BIE9CTEFTVDtURVZSSVpTS0lZOlVOS05PV046UlUtVFZaCitSVVNTSUE6VElPVU1FTlNLQe9BIE9CTC4gUulTSURVRTtOSVpITkVUQVZESU5TS0lZOlVOS05PV046UlUtTlo0CitSVVNTSUE6VElPVU1FTlNLQe9BIE9CTC4gUulTSURVRTtZQVJLT1ZTS0lZOlVOS05PV046UlUtWVI1CitSVVNTSUE6VE9NU0tB70EgT0JMQVNUO01PTENIQU5PVlNLSVk6VU5LTk9XTjpSVS1NTDIKK1JVU1NJQTpUT01TS0HvQSBPQkxBU1Q7Q0hBSU5TS0lZOlVOS05PV046UlUtQ0FJCitSVVNTSUE6VE9NU0tB70EgT0JMQVNUO0FTSU5PVlNLSVk6VU5LTk9XTjpSVS1BUyAKK1JVU1NJQTpUT01TS0HvQSBPQkxBU1Q7QkFLQ0hBUlNLSVk6VU5LTk9XTjpSVS1CS1IKK1JVU1NJQTpPTVNLQe9BIE9CTEFTVDtaTkFNRU5TS0lZOlVOS05PV046UlUtWk5LCitSVVNTSUE6VE9NU0tB70EgT0JMQVNUO0tSSVZPU0hFSU5TS0lZOlVOS05PV046UlUtS0k0CitSVVNTSUE6T01TS0HvQSBPQkxBU1Q7U0VERUxOSUtPVlNLSVk6VU5LTk9XTjpSVS1TREsKK1JVU1NJQTpUSU9VTUVOU0tB70EgT0JMLiBS6VNJRFVFO1RZVU1FTlNLSVk6VU5LTk9XTjpSVS1UWTIKK1JVU1NJQTpUT01TS0HvQSBPQkxBU1Q7VE9NU0tJWTpVTktOT1dOOlJVLVRNMgorUlVTU0lBOlRJT1VNRU5TS0HvQSBPQkwuIFLpU0lEVUU7VklLVUxPVlNLSVk6VU5LTk9XTjpSVS1WS1YKK1JVU1NJQTpPTVNLQe9BIE9CTEFTVDtCT0xTSEVVS09WU0tJWTpVTktOT1dOOlJVLUJTTworUlVTU0lBOlRPTVNLQe9BIE9CTEFTVDtaWVJZQU5TS0lZOlVOS05PV046UlUtWllOCitSVVNTSUE6VElPVU1FTlNLQe9BIE9CTC4gUulTSURVRTtBUk9NQVNIRVZTS0lZOlVOS05PV046UlUtQVI3CitSVVNTSUE6Tk9WT1NJQklSU0tB70EgT0JMQVNUO0tZU0hUT1ZTS0lZOlVOS05PV046UlUtS1k3CitSVVNTSUE6VElPVU1FTlNLQe9BIE9CTC4gUulTSURVRTtZVVJHSU5TS0lZOlVOS05PV046UlUtWVI2CitSVVNTSUE6VE9NU0tB70EgT0JMQVNUO1NIRUdBUlNLSVk6VU5LTk9XTjpSVS1TRVkKK1JVU1NJQTpUT01TS0HvQSBPQkxBU1Q7QVNJTk86VU5LTk9XTjpSVS1BU04KK1JVU1NJQTpUSU9VTUVOU0tB70EgT0JMLiBS6VNJRFVFO1RZVU1FTjpVTktOT1dOOlJVLVRZTQorUlVTU0lBOk5PVk9TSUJJUlNLQe9BIE9CTEFTVDtTRVZFUk5ZSTpVTktOT1dOOlJVLVNFMQorUlVTU0lBOlRJT1VNRU5TS0HvQSBPQkwuIFLpU0lEVUU7WUFMVVRPUk9WU0tJWTpVTktOT1dOOlJVLVlMIAorUlVTU0lBOlRJT1VNRU5TS0HvQSBPQkwuIFLpU0lEVUU7U09ST0tJTlNLSVk6VU5LTk9XTjpSVS1TUjgKK1JVU1NJQTpUSU9VTUVOU0tB70EgT0JMLiBS6VNJRFVFO1pBVk9ET1VLT1ZTS0lZOlVOS05PV046UlUtWlZJCitSVVNTSUE6T01TS0HvQSBPQkxBU1Q7VEFSQTpVTktOT1dOOlJVLVRBUgorUlVTU0lBOktFTUVST1ZTS0HvQSBPQkxBU1Q7TUFSSUlOU0tJWTpVTktOT1dOOlJVLU1SNQorUlVTU0lBOlRJT1VNRU5TS0HvQSBPQkwuIFLpU0lEVUU7R09MWVNITUFOT1ZTS0lZOlVOS05PV046UlUtR0xOCitSVVNTSUE6VElPVU1FTlNLQe9BIE9CTC4gUulTSURVRTtJU0VUU0tJWTpVTktOT1dOOlJVLUlTUworUlVTU0lBOk9NU0tB70EgT0JMQVNUO0tPTE9TT1ZTS0lZOlVOS05PV046UlUtS08yCitSVVNTSUE6VE9NU0tB70EgT0JMQVNUO1RPTVNLOlVOS05PV046UlUtVE9LCitSVVNTSUE6VElPVU1FTlNLQe9BIE9CTC4gUulTSURVRTtPTVVUSU5TS0lZOlVOS05PV046UlUtT01LCitSVVNTSUE6T01TS0HvQSBPQkxBU1Q7TVVST01UU0VWU0tJWTpVTktOT1dOOlJVLU1SNgorUlVTU0lBOk9NU0tB70EgT0JMQVNUO0tSVVRJTlNLSVk6VU5LTk9XTjpSVS1LVUkKK1JVU1NJQTpUSU9VTUVOU0tB70EgT0JMLiBS6VNJRFVFO0FCQVRTS0lZOlVOS05PV046UlUtQUJZCitSVVNTSUE6T01TS0HvQSBPQkxBU1Q7Qk9MU0hFUkVDSEVOU0tJWTpVTktOT1dOOlJVLUJTQworUlVTU0lBOlRPTVNLQe9BIE9CTEFTVDtLT1pIRVZOSUtPVlNLSVk6VU5LTk9XTjpSVS1LWk8KK1JVU1NJQTpUSU9VTUVOU0tB70EgT0JMLiBS6VNJRFVFO1lBTFVUT1JPVlNLOlVOS05PV046UlUtWUxSCitSVVNTSUE6S0VNRVJPVlNLQe9BIE9CTEFTVDtZQVlTS0lZOlVOS05PV046UlUtWVlJCitSVVNTSUE6VElPVU1FTlNLQe9BIE9CTC4gUulTSURVRTtJU0hJTVNLSVk6VU5LTk9XTjpSVS1JU0sKK1JVU1NJQTpLRU1FUk9WU0tB70EgT0JMQVNUO0laSE1PUlNLSVk6VU5LTk9XTjpSVS1JWlIKK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7VUJJTlNLSVk6VU5LTk9XTjpSVS1VQlMKK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7S09MWVZBTlNLSVk6VU5LTk9XTjpSVS1LWTgKK1JVU1NJQTpPTVNLQe9BIE9CTEFTVDtUWVVLQUxJTlNLSVk6VU5LTk9XTjpSVS1UWTMKK1JVU1NJQTpLRU1FUk9WU0tB70EgT0JMQVNUO1RZQVpISU5TS0lZOlVOS05PV046UlUtVFk0CitSVVNTSUE6VElPVU1FTlNLQe9BIE9CTC4gUulTSURVRTtVUE9ST1ZTS0lZOlVOS05PV046UlUtVVBWCitSVVNTSUE6VElPVU1FTlNLQe9BIE9CTC4gUulTSURVRTtaQVZPRE9VS09WU0s6VU5LTk9XTjpSVS1aViAKK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7VkVOR0VST1ZTS0lZOlVOS05PV046UlUtVk5WCitSVVNTSUE6VElPVU1FTlNLQe9BIE9CTC4gUulTSURVRTtBUk1JWk9OU0tJWTpVTktOT1dOOlJVLUFSOAorUlVTU0lBOk5PVk9TSUJJUlNLQe9BIE9CTEFTVDtLVVlCWVNIRVZTS0lZOlVOS05PV046UlUtS1k5CitSVVNTSUE6S0VNRVJPVlNLQe9BIE9CTEFTVDtNQVJJSU5TSzpVTktOT1dOOlJVLU1SNworUlVTU0lBOktFTUVST1ZTS0HvQSBPQkxBU1Q7WUFTSEtJTlNLSVk6VU5LTk9XTjpSVS1ZU1kKK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7VVNULVRBUktTS0lZOlVOS05PV046UlUtVVRSCitSVVNTSUE6S0VNRVJPVlNLQe9BIE9CTEFTVDtZVVJHSU5TS0lZOlVOS05PV046UlUtWVI3CitSVVNTSUE6S0VNRVJPVlNLQe9BIE9CTEFTVDtDSEVCVUxJTlNLSVk6VU5LTk9XTjpSVS1DRVkKK1JVU1NJQTpUSU9VTUVOU0tB70EgT0JMLiBS6VNJRFVFO0lTSElNOlVOS05PV046UlUtSVMgCitSVVNTSUE6S0VNRVJPVlNLQe9BIE9CTEFTVDtBTlpIRVJPLVNVRFpIRU5TSzpVTktOT1dOOlJVLUFORAorUlVTU0lBOktFTUVST1ZTS0HvQSBPQkxBU1Q7VEFZR0E6VU5LTk9XTjpSVS1UQUcKK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7Qk9MT1ROSU5TS0lZOlVOS05PV046UlUtQk8zCitSVVNTSUE6VElPVU1FTlNLQe9BIE9CTC4gUulTSURVRTtCRVJEWVVaSFNLSVk6VU5LTk9XTjpSVS1CUloKK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7Q0hVTFlNU0tJWTpVTktOT1dOOlJVLUNVTQorUlVTU0lBOk9NU0tB70EgT0JMQVNUO05JWkhORU9NU0tJWTpVTktOT1dOOlJVLU5aTQorUlVTU0lBOktFTUVST1ZTS0HvQSBPQkxBU1Q7VElTVUxTS0lZOlVOS05PV046UlUtVFM0CitSVVNTSUE6T01TS0HvQSBPQkxBU1Q7U0FSR0FUU0tJWTpVTktOT1dOOlJVLVNSOQorUlVTU0lBOlRJT1VNRU5TS0HvQSBPQkwuIFLpU0lEVUU7U0xBREtPVlNLSVk6VU5LTk9XTjpSVS1TQTkKK1JVU1NJQTpLRU1FUk9WU0tB70EgT0JMQVNUO0tFTUVST1ZTS0lZOlVOS05PV046UlUtS0VJCitSVVNTSUE6T01TS0HvQSBPQkxBU1Q7VFVLQUxJTlNLOlVOS05PV046UlUtVEtTCitSVVNTSUE6VElPVU1FTlNLQe9BIE9CTC4gUulTSURVRTtLQVpBTlNLSVk6VU5LTk9XTjpSVS1LWjQKK1JVU1NJQTpLRU1FUk9WU0tB70EgT0JMQVNUO0JFUkVaT1ZTS0lZOlVOS05PV046UlUtQkUgCitSVVNTSUE6T01TS0HvQSBPQkxBU1Q7R09SS09WU0tJWTpVTktOT1dOOlJVLUdSNgorUlVTU0lBOktFTUVST1ZTS0HvQSBPQkxBU1Q7WVVSR0E6VU5LTk9XTjpSVS1ZVUcKK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7S0FSR0FUU0tJWTpVTktOT1dOOlJVLUtHIAorUlVTU0lBOktFTUVST1ZTS0HvQSBPQkxBU1Q7VE9QS0lOU0tJWTpVTktOT1dOOlJVLVRQTgorUlVTU0lBOk5PVk9TSUJJUlNLQe9BIE9CTEFTVDtNT1NIS09WU0tJWTpVTktOT1dOOlJVLU1TIAorUlVTU0lBOk5PVk9TSUJJUlNLQe9BIE9CTEFTVDtDSEFOT1ZTS0lZOlVOS05PV046UlUtQ0FZCitSVVNTSUE6Tk9WT1NJQklSU0tB70EgT0JMQVNUO1RBVEFSU0tJWTpVTktOT1dOOlJVLVRUIAorUlVTU0lBOk9NU0tB70EgT0JMQVNUO0xZVUJJTlNLSVk6VU5LTk9XTjpSVS1MWSAKK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7S09DSEVORVZTS0lZOlVOS05PV046UlUtS0MgCitSVVNTSUE6T01TS0HvQSBPQkxBU1Q7TkFaWVZBWUVWU0s6VU5LTk9XTjpSVS1OWkUKK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7VE9HVUNISU5TS0lZOlVOS05PV046UlUtVEdJCitSVVNTSUE6Tk9WT1NJQklSU0tB70EgT0JMQVNUO05PVk9TSUJJUlNLSVk6VU5LTk9XTjpSVS1OTzEKK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7S1VZQklTSEVWOlVOS05PV046UlUtS1lICitSVVNTSUE6T01TS0HvQSBPQkxBU1Q7T01TS0lZOlVOS05PV046UlUtT01JCitSVVNTSUE6Tk9WT1NJQklSU0tB70EgT0JMQVNUO0JBUkFCSU5TS0lZOlVOS05PV046UlUtQkFOCitSVVNTSUE6S0VNRVJPVlNLQe9BIE9CTEFTVDtLUkFQSVZJTlNLSVk6VU5LTk9XTjpSVS1LUEsKK1JVU1NJQTpLRU1FUk9WU0tB70EgT0JMQVNUO0tFTUVST1ZPOlVOS05PV046UlUtS0VSCitSVVNTSUE6Tk9WT1NJQklSU0tB70EgT0JMQVNUO0JBUkFCSU5TSzpVTktOT1dOOlJVLUJBIAorUlVTU0lBOk9NU0tB70EgT0JMQVNUO0tBTEFDSElOU0tJWTpVTktOT1dOOlJVLUtDMQorUlVTU0lBOk9NU0tB70EgT0JMQVNUO0lTSUxLVUxTS0lZOlVOS05PV046UlUtSVNMCitSVVNTSUE6S0VNRVJPVlNLQe9BIE9CTEFTVDtUT1BLSTpVTktOT1dOOlJVLVRPSQorUlVTU0lBOk5PVk9TSUJJUlNLQe9BIE9CTEFTVDtUQVRBUlNLOlVOS05PV046UlUtVFRSCitSVVNTSUE6T01TS0HvQSBPQkxBU1Q7TU9TS0FMRU5TS0lZOlVOS05PV046UlUtTVMxCitSVVNTSUE6T01TS0HvQSBPQkxBU1Q7S09STUlMT1ZTS0lZOlVOS05PV046UlUtS0k1CitSVVNTSUE6Tk9WT1NJQklSU0tB70EgT0JMQVNUO05PVk9TSUJJUlNLOlVOS05PV046UlUtTk9CCitSVVNTSUE6S0VNRVJPVlNLQe9BIE9CTEFTVDtQUk9NWVNITEVOTk9WU0tJWTpVTktOT1dOOlJVLVBPTgorUlVTU0lBOk9NU0tB70EgT0JMQVNUO01BUllBTk9WU0tJWTpVTktOT1dOOlJVLU1SOAorUlVTU0lBOk9NU0tB70EgT0JMQVNUO09NU0s6VU5LTk9XTjpSVS1PTSAKK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7Q0hJU1RPT1pZT1JOWUk6VU5LTk9XTjpSVS1DSVoKK1JVU1NJQTpPTVNLQe9BIE9CTEFTVDtLQUxBQ0hJTlNLOlVOS05PV046UlUtS0NICitSVVNTSUE6Tk9WT1NJQklSU0tB70EgT0JMQVNUO1pEVklOU0tJWTpVTktOT1dOOlJVLVpESworUlVTU0lBOk9NU0tB70EgT0JMQVNUO09LT05FU0hOSUtPVlNLSVk6VU5LTk9XTjpSVS1PS08KK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7SVNLSVRJTVNLSVk6VU5LTk9XTjpSVS1JU0kKK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7T0I6VU5LTk9XTjpSVS1PU0IKK1JVU1NJQTpLRU1FUk9WU0tB70EgT0JMQVNUO0xFTklOU0stS1VaTkVUU0tJWTpVTktOT1dOOlJVLUxOWgorUlVTU0lBOk9NU0tB70EgT0JMQVNUO0lTSUwnS1VMJzpVTktOT1dOOlJVLUlTVQorUlVTU0lBOk5PVk9TSUJJUlNLQe9BIE9CTEFTVDtLVVBJTlNLSVk6VU5LTk9XTjpSVS1LUEkKK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7RE9WT0xFTlNLSVk6VU5LTk9XTjpSVS1EVksKK1JVU1NJQTpLRU1FUk9WU0tB70EgT0JMQVNUO01FWkhEVVJFQ0hFTlNLSVk6VU5LTk9XTjpSVS1NWkgKK1JVU1NJQTpPTVNLQe9BIE9CTEFTVDtUQVZSSUNIRVNLSVk6VU5LTk9XTjpSVS1UVkgKK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7TUFTTFlBTklOU0tJWTpVTktOT1dOOlJVLU1TMgorUlVTU0lBOk5PVk9TSUJJUlNLQe9BIE9CTEFTVDtCRVJEU0s6VU5LTk9XTjpSVS1CRUQKK1JVU1NJQTpPTVNLQe9BIE9CTEFTVDtBWk9WU0tZIE5FTUVUU0tZIE5BVElPTkFMOlVOS05PV046UlUtQVpLCitSVVNTSUE6Tk9WT1NJQklSU0tB70EgT0JMQVNUO09SRFlOU0tJWTpVTktOT1dOOlJVLU9SSQorUlVTU0lBOk9NU0tB70EgT0JMQVNUO1NIRVJCQUtVTFNLSVk6VU5LTk9XTjpSVS1TRUwKK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7SVNLSVRJTTpVTktOT1dOOlJVLUlTVAorUlVTU0lBOk9NU0tB70EgT0JMQVNUO0NIRVJMQUtTS0lZOlVOS05PV046UlUtQ0UgCitSVVNTSUE6T01TS0HvQSBPQkxBU1Q7UE9MVEFWU0tJWTpVTktOT1dOOlJVLVBMVgorUlVTU0lBOktFTUVST1ZTS0HvQSBPQkxBU1Q7QkVMT1ZTS0lZOlVOS05PV046UlUtQk80CitSVVNTSUE6S0VNRVJPVlNLQe9BIE9CTEFTVDtHVVJZRVZTS0lZOlVOS05PV046UlUtR1I3CitSVVNTSUE6S0VNRVJPVlNLQe9BIE9CTEFTVDtMRU5JTlNLLUtVWk5FVFNLSVk6VU5LTk9XTjpSVS1MTk4KK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7S09DSEtPVlNLSVk6VU5LTk9XTjpSVS1LQzIKK1JVU1NJQTpPTVNLQe9BIE9CTEFTVDtPREVTU0tJWTpVTktOT1dOOlJVLU9ESQorUlVTU0lBOk5PVk9TSUJJUlNLQe9BIE9CTEFTVDtDSEVSRVBBTk9WU0tJWTpVTktOT1dOOlJVLUNFTworUlVTU0lBOk5PVk9TSUJJUlNLQe9BIE9CTEFTVDtTVVpVTlNLSVk6VU5LTk9XTjpSVS1TWksKK1JVU1NJQTpPTVNLQe9BIE9CTEFTVDtQQVZMT0dSQURTS0lZOlVOS05PV046UlUtUFZECitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtaQUxFU09WU0tJWTpVTktOT1dOOlJVLVpMUworUlVTU0lBOktFTUVST1ZTS0HvQSBPQkxBU1Q7QkVMT1ZPOlVOS05PV046UlUtQkVPCitSVVNTSUE6Tk9WT1NJQklSU0tB70EgT0JMQVNUO0tSQVNOT1pFUlNLSVk6VU5LTk9XTjpSVS1LTzMKK1JVU1NJQTpLRU1FUk9WU0tB70EgT0JMQVNUO1BST0tPUFlFVlNLSVk6VU5LTk9XTjpSVS1QT1YKK1JVU1NJQTpPTVNLQe9BIE9CTEFTVDtOT1ZPVkFSU0hBVlNLSVk6VU5LTk9XTjpSVS1OT0gKK1JVU1NJQTpOT1ZPU0lCSVJTS0HvQSBPQkxBU1Q7QkFHQU5TS0lZOlVOS05PV046UlUtQkcyCitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtLUlVUSUtISU5LU0lZOlVOS05PV046UlUtS1VZCitSVVNTSUE6Tk9WT1NJQklSU0tB70EgT0JMQVNUO0tBUkFTVUtTS0lZOlVOS05PV046UlUtS1UgCitSVVNTSUE6S0VNRVJPVlNLQe9BIE9CTEFTVDtHVVJZRVZTSzpVTktOT1dOOlJVLUdSOAorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7WkFSSU5TS0lZOlVOS05PV046UlUtWlJLCitSVVNTSUE6S0VNRVJPVlNLQe9BIE9CTEFTVDtOT1ZPS1VaTkVUU0tJWTpVTktOT1dOOlJVLU5PRQorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7VEFMTUVOU0tJWTpVTktOT1dOOlJVLVRMWQorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7UEFOS1JVU0hZS0hJTlNLSVk6VU5LTk9XTjpSVS1QTiAKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO0tBTUVOU0tJWTpVTktOT1dOOlJVLUtFWQorUlVTU0lBOk9NU0tB70EgT0JMQVNUO1JVU1NLTy1QT0xZQU5TS0lZOlVOS05PV046UlUtUlNZCitSVVNTSUE6S0VNRVJPVlNLQe9BIE9CTEFTVDtLSVNJTEVWU0s6VU5LTk9XTjpSVS1LSTYKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO1BFUlZPTUFZU0tJWTpVTktOT1dOOlJVLVBWMgorUlVTU0lBOktFTUVST1ZTS0HvQSBPQkxBU1Q7UFJPS09QWUVWU0s6VU5LTk9XTjpSVS1QT1kKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO0tZVE1BTk9WU0tJWTpVTktOT1dOOlJVLUtUMworUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7S0hBQkFSU0tJWTpVTktOT1dOOlJVLUtCUgorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7S0FNRU4nLU5BLU9CSTpVTktOT1dOOlJVLUtNQQorUlVTU0lBOktFTUVST1ZTS0HvQSBPQkxBU1Q7TUVaU0hEVVJFQ0hFTlNLOlVOS05PV046UlUtTVpFCitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtTSEVMQUJPTElLSElOU0tJWTpVTktOT1dOOlJVLVNFMgorUlVTU0lBOktFTUVST1ZTS0HvQSBPQkxBU1Q7Tk9WT0tVWk5FVFNLOlVOS05PV046UlUtTlZaCitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtUT0dVTFNLSVk6VU5LTk9XTjpSVS1UR1kKK1JVU1NJQTpLRU1FUk9WU0tB70EgT0JMQVNUO01ZU0tJOlVOS05PV046UlUtTVkgCitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtCVVJMSU5TS0lZOlVOS05PV046UlUtQklLCitSVVNTSUE6S0VNRVJPVlNLQe9BIE9CTEFTVDtPU0lOTklLSTpVTktOT1dOOlJVLU9TTgorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7UEFWTE9WU0tJWTpVTktOT1dOOlJVLVBWMworUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7QkFZRVZTS0lZOlVOS05PV046UlUtQlk0CitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtLT1NJS0hJTlNLSVk6VU5LTk9XTjpSVS1LSTcKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO1RZVU1FTlRTRVZTS0lZOlVOS05PV046UlUtVFlFCitSVVNTSUE6S0VNRVJPVlNLQe9BIE9CTEFTVDtUQVNIVEFHT0xTS0lZOlVOS05PV046UlUtVFM1CitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtZRUxUU09WU0tJWTpVTktOT1dOOlJVLVlMMQorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7QkFSTkFVTDpVTktOT1dOOlJVLUJSVQorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7U1VZRVRTS0lZOlVOS05PV046UlUtU1kyCitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtOT1ZPQUxUQVlTSzpVTktOT1dOOlJVLU5PQQorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7UkVCUklLSElOU0tJWTpVTktOT1dOOlJVLVJCTgorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7VFNFTElOTklZOlVOS05PV046UlUtVFM2CitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtLQUxNQU5TS0lZOlVOS05PV046UlUtSzIKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO1NMQVZHT1JPRFNLSVk6VU5LTk9XTjpSVS1TQUQKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO1RST0lUU0tJWTpVTktOT1dOOlJVLVRPWQorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7QkxBR09WRVNDSEVOU0tJWTpVTktOT1dOOlJVLUJBMQorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7WkFWWUFMT1ZTS0lZOlVOS05PV046UlUtWlZZCitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtTTEFWR09ST0Q6VU5LTk9XTjpSVS1TVk8KK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO1NPTFRPTlNLSVk6VU5LTk9XTjpSVS1TVDUKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO1RPUENISUtISU5TS0lZOlVOS05PV046UlUtVFBICitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtUQUJVTlNLSVk6VU5LTk9XTjpSVS1UQlkKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO01BTU9OVE9WU0tJWTpVTktOT1dOOlJVLU1NVgorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7Wk9OQUxOWUk6VU5LTk9XTjpSVS1aTkwKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO0JJWVNLSVk6VU5LTk9XTjpSVS1CWTUKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO1JPRElOU0tJWTpVTktOT1dOOlJVLVJESworUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7Uk9NQU5PVlNLSVk6VU5LTk9XTjpSVS1STSAKK1JVU1NJQTpLRU1FUk9WU0tB70EgT0JMQVNUO1RBU0hUQUdPTDpVTktOT1dOOlJVLVRTTworUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7S1VMVU5ESU5TS0lZOlVOS05PV046UlUtS1UxCitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtBTEVZU0tJWTpVTktOT1dOOlJVLUFFUworUlVTU0lBOlJFU1BPVUJMSUtBIEFMVEHvO1RVUk9DSEFLU0tJWTpVTktOT1dOOlJVLVRPIAorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7VVNULVBSSVNUQU5TS0lZOlVOS05PV046UlUtVVRBCitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtTSElQVU5PVlNLSVk6VU5LTk9XTjpSVS1TSUkKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO0tSQVNOT0dPUlNLSVk6VU5LTk9XTjpSVS1LTzQKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO0JZU1RST0lTVE9LU0tJWTpVTktOT1dOOlJVLUJZTworUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7S0xZVUNIRVZTS0lZOlVOS05PV046UlUtS1VWCitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtCSVlTSzpVTktOT1dOOlJVLUJJIAorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7QUxFWVNLOlVOS05PV046UlUtQUVZCitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtTTU9MRU5TS0lZOlVOS05PV046UlUtU01JCitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtTT1ZFVFNLSVk6VU5LTk9XTjpSVS1TRTMKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO05PVklDSElLSElOU0tJWTpVTktOT1dOOlJVLU5JSAorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7UEVUUk9QQVZMT1ZTS0lZOlVOS05PV046UlUtUFRPCitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtWT0xDSElLSElOU0tJWTpVTktOT1dOOlJVLVZDSAorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7VVNULUtBTE1BTlNLSVk6VU5LTk9XTjpSVS1VVFMKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO1BPU1BFTElLSElOU0tJWTpVTktOT1dOOlJVLVBTMgorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7TUlLSEFZTE9WU0tJWTpVTktOT1dOOlJVLU1LMQorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7QUxUQVlTS0lZOlVOS05PV046UlUtQVRLCitSVVNTSUE6UkVTUE9VQkxJS0EgQUxUQe87Q0hPWVNLSVk6VU5LTk9XTjpSVS1DT1MKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO1lFR09SWUVWU0tJWTpVTktOT1dOOlJVLVlHUworUlVTU0lBOlJFU1BPVUJMSUtBIEFMVEHvO01BWU1JTlNLSVk6VU5LTk9XTjpSVS1NWTEKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO0JFTE9LVVJJS0hBOlVOS05PV046UlUtQk9BCitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtTT0xPTkVTSEVOU0tJWTpVTktOT1dOOlJVLVNMRQorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7UlVCVFNPVlNLSVk6VU5LTk9XTjpSVS1SQlYKK1JVU1NJQTpSRVNQT1VCTElLQSBBTFRB7ztHT1JOTy1BTFRBWVNLOlVOS05PV046UlUtR1JBCitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtLUkFTTk9TSEVLT1ZTS0lZOlVOS05PV046UlUtS09PCitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtDSEFSWVNIU0tJWTpVTktOT1dOOlJVLUNBSAorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7VUdMT1ZTS0lZOlVOS05PV046UlUtVUdJCitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtLVVJZSU5TS0lZOlVOS05PV046UlUtS0k4CitSVVNTSUE6UkVTUE9VQkxJS0EgQUxUQe87U0hFQkFMSU5TS0lZOlVOS05PV046UlUtU0U0CitSVVNTSUE6UkVTUE9VQkxJS0EgQUxUQe87Q0hFTUFMU0tZOlVOS05PV046UlUtQ0UxCitSVVNTSUE6QUxUQe9TS0kgS1JB7yBS6VNJRFVFTDtaTUVJTk9HT1JTS0lZOlVOS05PV046UlUtWk1SCitSVVNTSUE6UkVTUE9VQkxJS0EgQUxUQe87VUxBR0FOU0tJWTpVTktOT1dOOlJVLVVMTgorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7UlVCVFpPVlNLOlVOS05PV046UlUtUkJTCitSVVNTSUE6UkVTUE9VQkxJS0EgQUxUQe87VVNULUtBTlNLSVk6VU5LTk9XTjpSVS1VVEsKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO0xPS1RFVlNLSVk6VU5LTk9XTjpSVS1MS1kKK1JVU1NJQTpSRVNQT1VCTElLQSBBTFRB7ztPTkdVREFZU0tJWTpVTktOT1dOOlJVLU9OWQorUlVTU0lBOkFMVEHvU0tJIEtSQe8gUulTSURVRUw7Wk1FSU5PR09SU0s6VU5LTk9XTjpSVS1aTUcKK1JVU1NJQTpBTFRB71NLSSBLUkHvIFLpU0lEVUVMO1RSRVRJWUFLT1ZTS0lZOlVOS05PV046UlUtVFJPCitSVVNTSUE6UkVTUE9VQkxJS0EgQUxUQe87VVNULUtPS1NJTlNLSVk6VU5LTk9XTjpSVS1VVEkKK1JVU1NJQTpSRVNQT1VCTElLQSBBTFRB7ztLT1NILUFHQUNIU0tJWTpVTktOT1dOOlJVLUtTQworUlVTU0lBOlRBVEFSU1RBTjtCQUxUQVNJTlNLSVk6VU5LTk9XTjpSVS1CVCAKK1JVU1NJQTpUQVRBUlNUQU47QUdSWVpTS0lZOlVOS05PV046UlUtQUdJCitSVVNTSUE6VEFUQVJTVEFOO0FSU0tJWTpVTktOT1dOOlJVLUFSOQorUlVTU0lBOlRBVEFSU1RBTjtWWVNPS09HT1JTS0lZOlVOS05PV046UlUtVlkzCitSVVNTSUE6VEFUQVJTVEFOO0FUTklOU0tJWTpVTktOT1dOOlJVLUFUSQorUlVTU0lBOlRBVEFSU1RBTjtLVUtNT1JTS0lZOlVOS05PV046UlUtS0tLCitSVVNTSUE6VEFUQVJTVEFOO1NBQklOU0tJWTpVTktOT1dOOlJVLVNCSworUlVTU0lBOlRBVEFSU1RBTjtNQU1BRFlTSFNLSVk6VU5LTk9XTjpSVS1NTVMKK1JVU1NJQTpUQVRBUlNUQU47WkVMRU5PRE9MU0tJWTpVTktOT1dOOlJVLVpMTAorUlVTU0lBOlRBVEFSU1RBTjtNRU5ERUxFWUVWU0tJWTpVTktOT1dOOlJVLU1OIAorUlVTU0lBOlRBVEFSU1RBTjtQRVNUUkVDSElOU0tJWTpVTktOT1dOOlJVLVBTMworUlVTU0lBOlRBVEFSU1RBTjtZRUxBQlVaSFNLSVk6VU5LTk9XTjpSVS1ZTFoKK1JVU1NJQTpUQVRBUlNUQU47S0FaQU46VU5LTk9XTjpSVS1LWjUKK1JVU1NJQTpUQVRBUlNUQU47QUtUQU5ZU0hTS0lZOlVOS05PV046UlUtQUsgCitSVVNTSUE6VEFUQVJTVEFOO1RVWUxBQ0hJTlNLSVk6VU5LTk9XTjpSVS1UWTUKK1JVU1NJQTpUQVRBUlNUQU47VFVLQVlFVlNLSVk6VU5LTk9XTjpSVS1US1kKK1JVU1NJQTpUQVRBUlNUQU47TUVOWkVMSU5TS0lZOlVOS05PV046UlUtTU4xCitSVVNTSUE6VEFUQVJTVEFOO1pFTEVOT0RPTCdTSzpVTktOT1dOOlJVLVpMRAorUlVTU0lBOlRBVEFSU1RBTjtSWUJOTy1TTE9CT0RTS0lZOlVOS05PV046UlUtUllCCitSVVNTSUE6VEFUQVJTVEFOO0VMQUJVR0E6VU5LTk9XTjpSVS1FTEcKK1JVU1NJQTpUQVRBUlNUQU47VkVSS0hORVVTTE9OU0tJWTpVTktOT1dOOlJVLVZSOQorUlVTU0lBOlRBVEFSU1RBTjtMQUlTSEVWU0tJWTpVTktOT1dOOlJVLUxJVgorUlVTU0lBOlRBVEFSU1RBTjtOQUJFUkVaSE5JWUUgQ0hFTE5ZOlVOS05PV046UlUtTkJZCitSVVNTSUE6VEFUQVJTVEFOO05JWkhORUtBTVNLSVk6VU5LTk9XTjpSVS1OWjUKK1JVU1NJQTpUQVRBUlNUQU47TklaU0hORUtBTVNLOlVOS05PV046UlUtTlo2CitSVVNTSUE6VEFUQVJTVEFOO1NBUk1BTk9WU0tJWTpVTktOT1dOOlJVLVNNWQorUlVTU0lBOlRBVEFSU1RBTjtaQUlOU0tJWTpVTktOT1dOOlJVLVpJUworUlVTU0lBOlRBVEFSU1RBTjtLQU1TS08tVVNUWUlOU0tJWTpVTktOT1dOOlJVLUtLVAorUlVTU0lBOlRBVEFSU1RBTjtNVVNMWVVNT1ZTS0lZOlVOS05PV046UlUtTVMzCitSVVNTSUE6VEFUQVJTVEFOO0NISVNUT1BPTFNLSVk6VU5LTk9XTjpSVS1DSUwKK1JVU1NJQTpUQVRBUlNUQU47Q0hJU1RPUE9MJzpVTktOT1dOOlJVLUNIUAorUlVTU0lBOlRBVEFSU1RBTjtBTEVLU0VZRVZTS0lZOlVOS05PV046UlUtQUVWCitSVVNTSUE6VEFUQVJTVEFOO05PVk9TSEVTSE1JTlNLSVk6VU5LTk9XTjpSVS1OT00KK1JVU1NJQTpUQVRBUlNUQU47WkFJTlNLOlVOS05PV046UlUtWkFOCitSVVNTSUE6VEFUQVJTVEFOO0JVSU5TS0lZOlVOS05PV046UlUtQklJCitSVVNTSUE6VEFUQVJTVEFOO0FMTUVUWUVWU0tJWTpVTktOT1dOOlJVLUFNSQorUlVTU0lBOlRBVEFSU1RBTjtLVVlCWVNIRVZTS0lZOlVOS05PV046UlUtS0JWCitSVVNTSUE6VEFUQVJTVEFOO1RFVFlVU0hTS0lZOlVOS05PV046UlUtVFRICitSVVNTSUE6VEFUQVJTVEFOO0FaTkFLQVlFVlNLSVk6VU5LTk9XTjpSVS1BWkkKK1JVU1NJQTpUQVRBUlNUQU47QUtTVUJBWUVWU0tJWTpVTktOT1dOOlJVLUFLVgorUlVTU0lBOlRBVEFSU1RBTjtBTEtFWUVWU0tJWTpVTktOT1dOOlJVLUFLMQorUlVTU0lBOlRBVEFSU1RBTjtDSEVSRU1TSEFOU0tJWTpVTktOT1dOOlJVLUNFQQorUlVTU0lBOlRBVEFSU1RBTjtBTE1FVFlFVlNLOlVOS05PV046UlUtQU1ZCitSVVNTSUE6VEFUQVJTVEFOO09LVFlBQlJTS0lZOlVOS05PV046UlUtT1RSCitSVVNTSUE6VEFUQVJTVEFOO0FaTkFLQUVWTzpVTktOT1dOOlJVLUFaRQorUlVTU0lBOlRBVEFSU1RBTjtEUk9aSEFOT1ZTS0lZOlVOS05PV046UlUtRFJWCitSVVNTSUE6T1VMSUFOT1ZTS0HvQSBPQkxBU1Q7U1RBUk9NQVlOU0tJWTpVTktOT1dOOlJVLVNUNgorUlVTU0lBOlRBVEFSU1RBTjtMRU5JTk9HT1JTS0lZOlVOS05PV046UlUtTE5SCitSVVNTSUE6VEFUQVJTVEFOO1lVVEFaSU5TS0lZOlVOS05PV046UlUtWVROCitSVVNTSUE6VEFUQVJTVEFOO0JVR1VMTUlOU0tJWTpVTktOT1dOOlJVLUJHMworUlVTU0lBOk9VTElBTk9WU0tB70EgT0JMQVNUO1NVUlNLSVk6VU5LTk9XTjpSVS1TUzIKK1JVU1NJQTpPVUxJQU5PVlNLQe9BIE9CTEFTVDtUU1lMTklOU0tJWTpVTktOT1dOOlJVLVRTNworUlVTU0lBOk9VTElBTk9WU0tB70EgT0JMQVNUO1VMWUFOT1ZTS0lZOlVOS05PV046UlUtVUxJCitSVVNTSUE6VEFUQVJTVEFOO0xFTklOSUdPUlNLOlVOS05PV046UlUtTE5HCitSVVNTSUE6U0FNQVJTS0HvQSAoS09V70JZQ0hFVlNLQTtDSEVMTk8tVkVSU0hJTlNLSVk6VU5LTk9XTjpSVS1DRVIKK1JVU1NJQTpTQU1BUlNLQe9BIChLT1XvQllDSEVWU0tBO1NIRU5UQUxJTlNLSVk6VU5LTk9XTjpSVS1TRTUKK1JVU1NJQTpPVUxJQU5PVlNLQe9BIE9CTEFTVDtNRUxFS0VTU0tJWTpVTktOT1dOOlJVLU1MMworUlVTU0lBOk9VTElBTk9WU0tB70EgT0JMQVNUO01BWU5TS0lZOlVOS05PV046UlUtTVkyCitSVVNTSUE6VEFUQVJTVEFOO0JVR1VMJ01BOlVOS05PV046UlUtQkdNCitSVVNTSUE6U0FNQVJTS0HvQSAoS09V70JZQ0hFVlNLQTtLTFlBVkxJTlNLSVk6VU5LTk9XTjpSVS1LVjIKK1JVU1NJQTpPVUxJQU5PVlNLQe9BIE9CTEFTVDtOT1ZPTUFMWUtMSU5TS0lZOlVOS05PV046UlUtTk8yCitSVVNTSUE6U0FNQVJTS0HvQSAoS09V70JZQ0hFVlNLQTtLT1NIS0lOU0tJWTpVTktOT1dOOlJVLUtLSQorUlVTU0lBOk9VTElBTk9WU0tB70EgT0JMQVNUO0NIRVJEQUtMSU5TS0lZOlVOS05PV046UlUtQ0UyCitSVVNTSUE6VEFUQVJTVEFOO0JBVkxJTlNLSVk6VU5LTk9XTjpSVS1CVk4KK1JVU1NJQTpPVUxJQU5PVlNLQe9BIE9CTEFTVDtLQVJTVU5TS0lZOlVOS05PV046UlUtS1UyCitSVVNTSUE6T1VMSUFOT1ZTS0HvQSBPQkxBU1Q7VUxZQU5PVlNLOlVOS05PV046UlUtVUwgCitSVVNTSUE6U0FNQVJTS0HvQSAoS09V70JZQ0hFVlNLQTtTRVJHSVlFVlNLSVk6VU5LTk9XTjpSVS1TR1YKK1JVU1NJQTpPVUxJQU5PVlNLQe9BIE9CTEFTVDtJTlpFTlNLSVk6VU5LTk9XTjpSVS1JTksKK1JVU1NJQTpPVUxJQU5PVlNLQe9BIE9CTEFTVDtESU1JVFJPVkdSQUQ6VU5LTk9XTjpSVS1ETUcKK1JVU1NJQTpTQU1BUlNLQe9BIChLT1XvQllDSEVWU0tBO0tBTVlTSExFTlNLWTpVTktOT1dOOlJVLUtZRQorUlVTU0lBOlNBTUFSU0tB70EgKEtPVe9CWUNIRVZTS0E7SVNBS0xJTlNLSVk6VU5LTk9XTjpSVS1JUzEKK1JVU1NJQTpPVUxJQU5PVlNLQe9BIE9CTEFTVDtWRVNIS0FZTVNLSVk6VU5LTk9XTjpSVS1WU1kKK1JVU1NJQTpPVUxJQU5PVlNLQe9BIE9CTEFTVDtTRU5HSUxFWUVWU0tJWTpVTktOT1dOOlJVLVNOWQorUlVTU0lBOk9VTElBTk9WU0tB70EgT0JMQVNUO1RFUkVOR1VMU0tJWTpVTktOT1dOOlJVLVRSTAorUlVTU0lBOlNBTUFSU0tB70EgKEtPVe9CWUNIRVZTS0E7RUxLSE9WU0tZOlVOS05PV046UlUtRUxLCitSVVNTSUE6T1VMSUFOT1ZTS0HvQSBPQkxBU1Q7S1VaT1ZBVE9WU0tJWTpVTktOT1dOOlJVLUtaNgorUlVTU0lBOlBFTlpFTlNLQe9BIE9CTEFTVDtOSUtPTFNLSVk6VU5LTk9XTjpSVS1OSzEKK1JVU1NJQTpTQU1BUlNLQe9BIChLT1XvQllDSEVWU0tBO1BPS0hWSVNUTkVWTzpVTktOT1dOOlJVLVBLVAorUlVTU0lBOlBFTlpFTlNLQe9BIE9CTEFTVDtCRUROT0RFTVlBTk9WU0tJWTpVTktOT1dOOlJVLUJEUworUlVTU0lBOlBFTlpFTlNLQe9BIE9CTEFTVDtOQVJPVkNIQVRTS0lZOlVOS05PV046UlUtTlJZCitSVVNTSUE6UEVOWkVOU0tB70EgT0JMQVNUO0lTU0lOU0tJWTpVTktOT1dOOlJVLUlTMgorUlVTU0lBOlBFTlpFTlNLQe9BIE9CTEFTVDtMVU5JTk86VU5LTk9XTjpSVS1MVU4KK1JVU1NJQTpTQU1BUlNLQe9BIChLT1XvQllDSEVWU0tBO1NUQVZST1BPTFNLSVk6VU5LTk9XTjpSVS1TVDcKK1JVU1NJQTpPVUxJQU5PVlNLQe9BIE9CTEFTVDtCQVpBUk5PU1laR0FOU0tJWTpVTktOT1dOOlJVLUJaWgorUlVTU0lBOlNBTUFSU0tB70EgKEtPVe9CWUNIRVZTS0E7S1JBU05PWUFSU0tJWTpVTktOT1dOOlJVLUtPNQorUlVTU0lBOk9VTElBTk9WU0tB70EgT0JMQVNUO0JBUllTSFNLSVk6VU5LTk9XTjpSVS1CWUgKK1JVU1NJQTpQRU5aRU5TS0HvQSBPQkxBU1Q7WkVNRVRDSElOU0tJWTpVTktOT1dOOlJVLVpNTgorUlVTU0lBOlBFTlpFTlNLQe9BIE9CTEFTVDtWQURJTlNLSVk6VU5LTk9XTjpSVS1WRCAKK1JVU1NJQTpQRU5aRU5TS0HvQSBPQkxBU1Q7TklaSE5FTE9NT1ZTS0lZOlVOS05PV046UlUtTlo3CitSVVNTSUE6U0FNQVJTS0HvQSAoS09V70JZQ0hFVlNLQTtTSElHT05TS0lZOlVOS05PV046UlUtU0lOCitSVVNTSUE6UEVOWkVOU0tB70EgT0JMQVNUO01PS1NIQU5TS0lZOlVOS05PV046UlUtTUsyCitSVVNTSUE6U0FNQVJTS0HvQSAoS09V70JZQ0hFVlNLQTtLSU5FTC1DSEVSS0FTU0tJWTpVTktOT1dOOlJVLUtFQQorUlVTU0lBOk9VTElBTk9WU0tB70EgT0JMQVNUO0JBUllTSDpVTktOT1dOOlJVLUJBMgorUlVTU0lBOlNBTUFSU0tB70EgKEtPVe9CWUNIRVZTS0E7Vk9MWkhTS0lZOlVOS05PV046UlUtVlpTCitSVVNTSUE6UEVOWkVOU0tB70EgT0JMQVNUO1NPU05PVk9CT1JTS0lZOlVOS05PV046UlUtU1NPCitSVVNTSUE6UEVOWkVOU0tB70EgT0JMQVNUO0JFU1NPTk9WU0tJWTpVTktOT1dOOlJVLUJTVgorUlVTU0lBOlBFTlpFTlNLQe9BIE9CTEFTVDtHT1JPRElTQ0hFTlNLSVk6VU5LTk9XTjpSVS1HUjkKK1JVU1NJQTpTQU1BUlNLQe9BIChLT1XvQllDSEVWU0tBO1RPTFlBVFRJOlVOS05PV046UlUtVExUCitSVVNTSUE6UEVOWkVOU0tB70EgT0JMQVNUO0JBU0hNQUtPVlNLSVk6VU5LTk9XTjpSVS1CU1kKK1JVU1NJQTpQRU5aRU5TS0HvQSBPQkxBU1Q7UEFDSEVMTVNLSVk6VU5LTk9XTjpSVS1QQ00KK1JVU1NJQTpTQU1BUlNLQe9BIChLT1XvQllDSEVWU0tBO1NZWlJBTlNLSVk6VU5LTk9XTjpSVS1TWTMKK1JVU1NJQTpTQU1BUlNLQe9BIChLT1XvQllDSEVWU0tBO0tJTkVMU0tJWTpVTktOT1dOOlJVLUtFIAorUlVTU0lBOlNBTUFSU0tB70EgKEtPVe9CWUNIRVZTS0E7WkhJR1VMWU9WU0tJWTpVTktOT1dOOlJVLVpIMworUlVTU0lBOlBFTlpFTlNLQe9BIE9CTEFTVDtLVVpORVRTS0lZOlVOS05PV046UlUtS1o3CitSVVNTSUE6UEVOWkVOU0tB70EgT0JMQVNUO0tBTUVOU0tJWTpVTktOT1dOOlJVLUtFMQorUlVTU0lBOlNBTUFSU0tB70EgKEtPVe9CWUNIRVZTS0E7T1RSQUROWUk6VU5LTk9XTjpSVS1PVEQKK1JVU1NJQTpPVUxJQU5PVlNLQe9BIE9CTEFTVDtOT1ZPU1BBU1NLSVk6VU5LTk9XTjpSVS1OTzMKK1JVU1NJQTpPVUxJQU5PVlNLQe9BIE9CTEFTVDtOSUtPTEFZRVZTS0lZOlVOS05PV046UlUtTksyCitSVVNTSUE6U0FNQVJTS0HvQSAoS09V70JZQ0hFVlNLQTtCT1JTS0lZOlVOS05PV046UlUtQlMgCitSVVNTSUE6U0FNQVJTS0HvQSAoS09V70JZQ0hFVlNLQTtTQU1BUkE6VU5LTk9XTjpSVS1TTUEKK1JVU1NJQTpQRU5aRU5TS0HvQSBPQkxBU1Q7UEVOWkE6VU5LTk9XTjpSVS1QRVoKK1JVU1NJQTpQRU5aRU5TS0HvQSBPQkxBU1Q7UEVOWkVOU0tJWTpVTktOT1dOOlJVLVBOMQorUlVTU0lBOlNBTUFSU0tB70EgKEtPVe9CWUNIRVZTS0E7Qk9HQVRPVlNLSVk6VU5LTk9XTjpSVS1CRzQKK1JVU1NJQTpTQU1BUlNLQe9BIChLT1XvQllDSEVWU0tBO0tJTkVMOlVOS05PV046UlUtS0k5CitSVVNTSUE6UEVOWkVOU0tB70EgT0JMQVNUO0JFTElOU0tJWTpVTktOT1dOOlJVLUJJWQorUlVTU0lBOlBFTlpFTlNLQe9BIE9CTEFTVDtLQU1FTktBOlVOS05PV046UlUtS0UyCitSVVNTSUE6U0FNQVJTS0HvQSAoS09V70JZQ0hFVlNLQTtPS1RZQUJSU0s6VU5LTk9XTjpSVS1PS0IKK1JVU1NJQTpTQU1BUlNLQe9BIChLT1XvQllDSEVWU0tBO1BSSVZPTFpIU0tJWTpVTktOT1dOOlJVLVBJWgorUlVTU0lBOlNBTUFSU0tB70EgKEtPVe9CWUNIRVZTS0E7QkVaRU5DSFVLU0tJWTpVTktOT1dOOlJVLUJaMQorUlVTU0lBOlNBTUFSU0tB70EgKEtPVe9CWUNIRVZTS0E7U1laUkFOOlVOS05PV046UlUtU1lSCitSVVNTSUE6UEVOWkVOU0tB70EgT0JMQVNUO0tVWk5FVFNLOlVOS05PV046UlUtS1o4CitSVVNTSUE6U0FNQVJTS0HvQSAoS09V70JZQ0hFVlNLQTtOT1ZPS1VZQllTSEVWU0s6VU5LTk9XTjpSVS1OT1YKK1JVU1NJQTpQRU5aRU5TS0HvQSBPQkxBU1Q7U0hFTVlTSEVZU0tJWTpVTktOT1dOOlJVLVNFNgorUlVTU0lBOk9VTElBTk9WU0tB70EgT0JMQVNUO1JBRElTQ0hFVlNLSVk6VU5LTk9XTjpSVS1SREkKK1JVU1NJQTpQRU5aRU5TS0HvQSBPQkxBU1Q7S0FNRVNIS0lSU0tJWTpVTktOT1dOOlJVLUtFMworUlVTU0lBOlNBTUFSU0tB70EgKEtPVe9CWUNIRVZTS0E7TkVGVEVHT1JTS0lZOlVOS05PV046UlUtTkZSCitSVVNTSUE6U0FNQVJTS0HvQSAoS09V70JZQ0hFVlNLQTtDSEFQQVlFVlNLOlVOS05PV046UlUtQ0FFCitSVVNTSUE6UEVOWkVOU0tB70EgT0JMQVNUO05FVkVSS0lOU0tJWTpVTktOT1dOOlJVLU5FTgorUlVTU0lBOk9VTElBTk9WU0tB70EgT0JMQVNUO1NUQVJPS1VMQVRLSU5TS0lZOlVOS05PV046UlUtU1Q4CitSVVNTSUE6U0FNQVJTS0HvQSAoS09V70JZQ0hFVlNLQTtLUkFTTk9BUk1FWVNLSVk6VU5LTk9XTjpSVS1LT0UKK1JVU1NJQTpQRU5aRU5TS0HvQSBPQkxBU1Q7S09MWVNITEVZU0tJWTpVTktOT1dOOlJVLUszCitSVVNTSUE6UEVOWkVOU0tB70EgT0JMQVNUO0tPTkRPTFNLSVk6VU5LTk9XTjpSVS1LTkwKK1JVU1NJQTpTQU1BUlNLQe9BIChLT1XvQllDSEVWU0tBO0FMRUtTRVlFVlNLSVk6VU5LTk9XTjpSVS1BRUsKK1JVU1NJQTpTQU1BUlNLQe9BIChLT1XvQllDSEVWU0tBO0tIVk9ST1NUWUFOU0tJWTpVTktOT1dOOlJVLUtIQQorUlVTU0lBOk9VTElBTk9WU0tB70EgT0JMQVNUO1BBVkxPVlNLSVk6VU5LTk9XTjpSVS1QVjQKK1JVU1NJQTpQRU5aRU5TS0HvQSBPQkxBU1Q7U0VSRE9CU0tJWTpVTktOT1dOOlJVLVNSQgorUlVTU0lBOlBFTlpFTlNLQe9BIE9CTEFTVDtUQU1BTElOU0tJWTpVTktOT1dOOlJVLVRNMworUlVTU0lBOlBFTlpFTlNLQe9BIE9CTEFTVDtMT1BBVElOTzpVTktOT1dOOlJVLUxQSQorUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7S0hWQUxZTlNLSVk6VU5LTk9XTjpSVS1LVjMKK1JVU1NJQTpQRU5aRU5TS0HvQSBPQkxBU1Q7QkVLT1ZTS0lZOlVOS05PV046UlUtQksgCitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtEVUtIT1ZOSVRTS0lZOlVOS05PV046UlUtREtUCitSVVNTSUE6U0FNQVJTS0HvQSAoS09V70JZQ0hFVlNLQTtCT0xTSEVHTFVTSElUU0tJWTpVTktOT1dOOlJVLUJTSAorUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7QkFMVEFZU0tJWTpVTktOT1dOOlJVLUJUMQorUlVTU0lBOlNBTUFSU0tB70EgKEtPVe9CWUNIRVZTS0E7UEVTVFJBVlNLSVk6VU5LTk9XTjpSVS1QUzQKK1JVU1NJQTpQRU5aRU5TS0HvQSBPQkxBU1Q7TUFMT1NFUkRPQklOU0tJWTpVTktOT1dOOlJVLU1MNAorUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7QkFaQVJOTy1LQVJBQlVMQUtTS0lZOlVOS05PV046UlUtQlpCCitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtWT0xTS0lZOlVOS05PV046UlUtVlMgCitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtZRUtBVEVSSU5PVlNLSVk6VU5LTk9XTjpSVS1ZS08KK1JVU1NJQTpTQVJBVE9WU0tB70EgT0JMQVNUO0lWQU5URVlFVlNLSVk6VU5LTk9XTjpSVS1JVkkKK1JVU1NJQTpTQVJBVE9WU0tB70EgT0JMQVNUO0tIVkFMWU5TSzpVTktOT1dOOlJVLUtWNAorUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7UEVUUk9WU0tJWTpVTktOT1dOOlJVLVBUMworUlVTU0lBOlBFTlpFTlNLQe9BIE9CTEFTVDtTRVJET0JTSzpVTktOT1dOOlJVLVNEQgorUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7UlRJU0NIRVZTS0lZOlVOS05PV046UlUtUlRWCitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtOT1ZPQlVSQVNTS0lZOlVOS05PV046UlUtTk80CitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtQVUdBQ0hZT1ZTS0lZOlVOS05PV046UlUtUEdWCitSVVNTSUE6U0FNQVJTS0HvQSAoS09V70JZQ0hFVlNLQTtCT0xTSEVDSEVSTklHT1ZTS0lZOlVOS05PV046UlUtQlNOCitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtQRVRST1ZTSzpVTktOT1dOOlJVLVBUNAorUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7VFVSS09WU0tJWTpVTktOT1dOOlJVLVRLIAorUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7UlRJU0hDSEVWTzpVTktOT1dOOlJVLVJUQworUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7QVRLQVJTS0lZOlVOS05PV046UlUtQVRZCitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtCQUxBS09WU0tJWTpVTktOT1dOOlJVLUJBMworUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7UEVSRUxZVUJTS0lZOlVOS05PV046UlUtUFJCCitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtBUktBREFLU0tJWTpVTktOT1dOOlJVLUFLMgorUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7Vk9TS1JFU0VOU0tJWTpVTktOT1dOOlJVLVZTMQorUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7Vk9MU0s6VU5LTk9XTjpSVS1WT1MKK1JVU1NJQTpTQVJBVE9WU0tB70EgT0JMQVNUO0JBTEFLT1ZPOlVOS05PV046UlUtQkFPCitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtUQVRJU0NIRVZTS0lZOlVOS05PV046UlUtVFQxCitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtQVUdBQ0hFVjpVTktOT1dOOlJVLVBHSAorUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7Uk9NQU5PVlNLSVk6VU5LTk9XTjpSVS1STTEKK1JVU1NJQTpTQVJBVE9WU0tB70EgT0JMQVNUO01BUktTT1ZTS0lZOlVOS05PV046UlUtTVI5CitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtLUkFTTk9QQVJUSVpBTlNLSVk6VU5LTk9XTjpSVS1LU1oKK1JVU1NJQTpTQVJBVE9WU0tB70EgT0JMQVNUO0FUS0FSU0s6VU5LTk9XTjpSVS1BVFIKK1JVU1NJQTpTQVJBVE9WU0tB70EgT0JMQVNUO1NBUkFUT1ZTS0lZOlVOS05PV046UlUtU1Q5CitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtCQUxBU0hPVlNLSVk6VU5LTk9XTjpSVS1CQTQKK1JVU1NJQTpTQVJBVE9WU0tB70EgT0JMQVNUO1lFUlNIT1ZTS0lZOlVOS05PV046UlUtWVI4CitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtLQUxJTklOU0tJWTpVTktOT1dOOlJVLUs0CitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtNQVJYOlVOS05PV046UlUtTUFSCitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtPWklOU0tJWTpVTktOT1dOOlJVLU9aSworUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7TFlTT0dPUlNLSVk6VU5LTk9XTjpSVS1MWTEKK1JVU1NJQTpTQVJBVE9WU0tB70EgT0JMQVNUO1NBUkFUT1Y6VU5LTk9XTjpSVS1TQVQKK1JVU1NJQTpTQVJBVE9WU0tB70EgT0JMQVNUO0VOR0VMU0tJWTpVTktOT1dOOlJVLUVOUworUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7REVSR0FDSFlPVlNLSVk6VU5LTk9XTjpSVS1EUlkKK1JVU1NJQTpTQVJBVE9WU0tB70EgT0JMQVNUO0JBTEFTSE9WOlVOS05PV046UlUtQkE1CitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtGRURPUk9WU0tJWTpVTktOT1dOOlJVLUZEVgorUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7U09WRVRTS0lZOlVOS05PV046UlUtU0U3CitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtFTkdFTFM6VU5LTk9XTjpSVS1FTkwKK1JVU1NJQTpTQVJBVE9WU0tB70EgT0JMQVNUO1NBTU9ZTE9WU0tJWTpVTktOT1dOOlJVLVNNIAorUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7S1JBU05PQVJNRVlTS0lZOlVOS05PV046UlUtS082CitSVVNTSUE6Vk9MR09HUkFEU0tB70EgT0JMQVNUO05PVk9OSUtPTEFZRVZTS0lZOlVOS05PV046UlUtTk81CitSVVNTSUE6U0FSQVRPVlNLQe9BIE9CTEFTVDtLUkFTTk9LVVRTS0lZOlVOS05PV046UlUtS05UCitSVVNTSUE6Vk9MR09HUkFEU0tB70EgT0JMQVNUO1lFTEFOU0tJWTpVTktOT1dOOlJVLVlMMgorUlVTU0lBOlZPTEdPR1JBRFNLQe9BIE9CTEFTVDtVUllVUElOU0tJWTpVTktOT1dOOlJVLVVSMgorUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7Uk9WRU5TS0lZOlVOS05PV046UlUtUlZLCitSVVNTSUE6Vk9MR09HUkFEU0tB70EgT0JMQVNUO1pISVJOT1ZTS0lZOlVOS05PV046UlUtWkg0CitSVVNTSUE6Vk9MR09HUkFEU0tB70EgT0JMQVNUO0tJS1ZJRFpFTlNLSVk6VU5LTk9XTjpSVS1LS1kKK1JVU1NJQTpWT0xHT0dSQURTS0HvQSBPQkxBU1Q7UlVETllBTlNLSVk6VU5LTk9XTjpSVS1SRFkKK1JVU1NJQTpTQVJBVE9WU0tB70EgT0JMQVNUO0tSQVNOT0FSTUVZU0s6VU5LTk9XTjpSVS1LTzcKK1JVU1NJQTpTQVJBVE9WU0tB70EgT0JMQVNUO1BJVEVSU0tJWTpVTktOT1dOOlJVLVBUNQorUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7Tk9WT1VaRU5TS0lZOlVOS05PV046UlUtTk82CitSVVNTSUE6Vk9MR09HUkFEU0tB70EgT0JMQVNUO05PVk9BTk5JTlNLSVk6VU5LTk9XTjpSVS1OTzcKK1JVU1NJQTpWT0xHT0dSQURTS0HvQSBPQkxBU1Q7VVJVUElOU0s6VU5LTk9XTjpSVS1VUjMKK1JVU1NJQTpWT0xHT0dSQURTS0HvQSBPQkxBU1Q7REFOSUxPVlNLSVk6VU5LTk9XTjpSVS1ETiAKK1JVU1NJQTpWT0xHT0dSQURTS0HvQSBPQkxBU1Q7U1RBUk9QT0xUQVZTS0lZOlVOS05PV046UlUtU1JBCitSVVNTSUE6Vk9MR09HUkFEU0tB70EgT0JMQVNUO0tBTVlTSElOU0tJWTpVTktOT1dOOlJVLUs1CitSVVNTSUE6Vk9MR09HUkFEU0tB70EgT0JMQVNUO0tPVE9WU0tJWTpVTktOT1dOOlJVLUtUNAorUlVTU0lBOlZPTEdPR1JBRFNLQe9BIE9CTEFTVDtORUtIQVlFVlNLSVk6VU5LTk9XTjpSVS1OSzMKK1JVU1NJQTpWT0xHT0dSQURTS0HvQSBPQkxBU1Q7TUlLSEFZTE9WU0tJWTpVTktOT1dOOlJVLU1LMworUlVTU0lBOlNBUkFUT1ZTS0HvQSBPQkxBU1Q7QUxFS1NBTkRST1YtR0FZU0tJWTpVTktOT1dOOlJVLUFMRworUlVTU0lBOlZPTEdPR1JBRFNLQe9BIE9CTEFTVDtBTEVLU0VZRVZTS0lZOlVOS05PV046UlUtQUVJCitSVVNTSUE6Vk9MR09HUkFEU0tB70EgT0JMQVNUO1BBTExBU09WU0tJWTpVTktOT1dOOlJVLVBMMworUlVTU0lBOlZPTEdPR1JBRFNLQe9BIE9CTEFTVDtOSUtPTEFZRVZTS0lZOlVOS05PV046UlUtTks0CitSVVNTSUE6Vk9MR09HUkFEU0tB70EgT0JMQVNUO0ZST0xPVlNLSVk6VU5LTk9XTjpSVS1GUkkKK1JVU1NJQTpWT0xHT0dSQURTS0HvQSBPQkxBU1Q7T0xLSE9WU0tJWTpVTktOT1dOOlJVLU9MVgorUlVTU0lBOlZPTEdPR1JBRFNLQe9BIE9CTEFTVDtLQU1ZU0hJTjpVTktOT1dOOlJVLUs2CitSVVNTSUE6Vk9MR09HUkFEU0tB70EgT0JMQVNUO01JS0hBSUxPVktBOlVOS05PV046UlUtTUtMCitSVVNTSUE6Vk9MR09HUkFEU0tB70EgT0JMQVNUO1BPRFRFTEtPVlNLSVk6VU5LTk9XTjpSVS1QREsKK1JVU1NJQTpWT0xHT0dSQURTS0HvQSBPQkxBU1Q7QllLT1ZTS0lZOlVOS05PV046UlUtQlk2CitSVVNTSUE6Vk9MR09HUkFEU0tB70EgT0JMQVNUO1NFUkFGSU1PVklDSFNLSVk6VU5LTk9XTjpSVS1TUkMKK1JVU1NJQTpWT0xHT0dSQURTS0HvQSBPQkxBU1Q7RlJPTE9WTzpVTktOT1dOOlJVLUZSTworUlVTU0lBOlZPTEdPR1JBRFNLQe9BIE9CTEFTVDtEVUJPVlNLSVk6VU5LTk9XTjpSVS1EQjIKK1JVU1NJQTpWT0xHT0dSQURTS0HvQSBPQkxBU1Q7SUxPVkxJTlNLSVk6VU5LTk9XTjpSVS1JTDEKK1JVU1NJQTpWT0xHT0dSQURTS0HvQSBPQkxBU1Q7S0xFVFNLSVk6VU5LTk9XTjpSVS1LRTQKK1JVU1NJQTpWT0xHT0dSQURTS0HvQSBPQkxBU1Q7TEVOSU5TS0lZOlVOS05PV046UlUtTE4zCitSVVNTSUE6Vk9MR09HUkFEU0tB70EgT0JMQVNUO0tBTEFDSEVWU0tJWTpVTktOT1dOOlJVLUtDMworUlVTU0lBOlZPTEdPR1JBRFNLQe9BIE9CTEFTVDtHT1JPRElTQ0hFTlNLSVk6VU5LTk9XTjpSVS1HT0gKK1JVU1NJQTpWT0xHT0dSQURTS0HvQSBPQkxBU1Q7U1JFRE5FQUtIVFVCSU5TS0lZOlVOS05PV046UlUtU0VUCitSVVNTSUE6Vk9MR09HUkFEU0tB70EgT0JMQVNUO1NVUk9WSUtJTlNLSVk6VU5LTk9XTjpSVS1TT04KK1JVU1NJQTpWT0xHT0dSQURTS0HvQSBPQkxBU1Q7Vk9MR09HUkFEOlVOS05PV046UlUtVkdHCitSVVNTSUE6Vk9MR09HUkFEU0tB70EgT0JMQVNUO1ZPTFpIU0tJWTpVTktOT1dOOlJVLVZaSworUlVTU0lBOkFTVFJBS0hBTlNLQe9BIE9CTEFTVDtBS0hUVUJJTlNLSVk6VU5LTk9XTjpSVS1BSzMKK1JVU1NJQTpWT0xHT0dSQURTS0HvQSBPQkxBU1Q7U1ZFVExPWUFSU0tJWTpVTktOT1dOOlJVLVNFOAorUlVTU0lBOkFTVFJBS0hBTlNLQe9BIE9CTEFTVDtDSFlPUk5PWUFSU0tJWTpVTktOT1dOOlJVLUNZWQorUlVTU0lBOlZPTEdPR1JBRFNLQe9BIE9CTEFTVDtDSEVSTllTSEtPVlNLSVk6VU5LTk9XTjpSVS1DRTMKK1JVU1NJQTpLQUxNWUtJQTtNQUxPREVSQkVUT1ZTS0lZOlVOS05PV046UlUtTUxUCitSVVNTSUE6Vk9MR09HUkFEU0tB70EgT0JMQVNUO09LVFlBQlJTS0lZOlVOS05PV046UlUtT1RTCitSVVNTSUE6QVNUUkFLSEFOU0tB70EgT0JMQVNUO0FLSFRVQklOU0s6VU5LTk9XTjpSVS1BS0IKK1JVU1NJQTpLQUxNWUtJQTtPS1RZQUJSU0tJWTpVTktOT1dOOlJVLU9USworUlVTU0lBOlZPTEdPR1JBRFNLQe9BIE9CTEFTVDtLT1RFTE5JS09WU0tJWTpVTktOT1dOOlJVLUtUNQorUlVTU0lBOkFTVFJBS0hBTlNLQe9BIE9CTEFTVDtZRU5PVEFZRVZTS0lZOlVOS05PV046UlUtWU5TCitSVVNTSUE6S0FMTVlLSUE7U0FSUElOU0tJWTpVTktOT1dOOlJVLVNQTgorUlVTU0lBOkFTVFJBS0hBTlNLQe9BIE9CTEFTVDtLSEFSQUJBTElOU0tJWTpVTktOT1dOOlJVLUtCTAorUlVTU0lBOktBTE1ZS0lBO1lVU1RJTlNLSVk6VU5LTk9XTjpSVS1ZUyAKK1JVU1NJQTpLQUxNWUtJQTtLRVRDSEVORVJPVlNLSVk6VU5LTk9XTjpSVS1LVFIKK1JVU1NJQTpBU1RSQUtIQU5TS0HvQSBPQkxBU1Q7S1JBU05PWUFSU0tJWTpVTktOT1dOOlJVLUtPOAorUlVTU0lBOktBTE1ZS0lBO1lBU0hLVUxTS0lZOlVOS05PV046UlUtWVNMCitSVVNTSUE6S0FMTVlLSUE7VFNFTElOTllJOlVOS05PV046UlUtVFM4CitSVVNTSUE6QVNUUkFLSEFOU0tB70EgT0JMQVNUO05BUklNQU5PVlNLSVk6VU5LTk9XTjpSVS1OUiAKK1JVU1NJQTpLQUxNWUtJQTtZQVNIQUxUSU5TS0lZOlVOS05PV046UlUtWVMxCitSVVNTSUE6QVNUUkFLSEFOU0tB70EgT0JMQVNUO1ZPTE9EQVJTS0lZOlVOS05PV046UlUtVk9SCitSVVNTSUE6QVNUUkFLSEFOU0tB70EgT0JMQVNUO1BSSVZPTFpIU0tJWTpVTktOT1dOOlJVLVBJSAorUlVTU0lBOktBTE1ZS0lBO1BSSVlVVElOU0tJWTpVTktOT1dOOlJVLVBJSQorUlVTU0lBOkFTVFJBS0hBTlNLQe9BIE9CTEFTVDtBU1RSQUtIQU46VU5LTk9XTjpSVS1BU0EKK1JVU1NJQTpLQUxNWUtJQTtFTElTVEE6VU5LTk9XTjpSVS1FTEEKK1JVU1NJQTpLQUxNWUtJQTtDSEVSTk9aRU1FTFNLSVk6VU5LTk9XTjpSVS1DRTQKK1JVU1NJQTpLQUxNWUtJQTtHT1JPRE9WSUtPVlNLSVk6VU5LTk9XTjpSVS1HT0sKK1JVU1NJQTpBU1RSQUtIQU5TS0HvQSBPQkxBU1Q7SUtSWUFOSU5TS0lZOlVOS05PV046UlUtSUtOCitSVVNTSUE6S0FMTVlLSUE7SUtJLUJVUlVMU0tJWTpVTktOT1dOOlJVLUlLTAorUlVTU0lBOkFTVFJBS0hBTlNLQe9BIE9CTEFTVDtLQU1ZWllBS1NLSVk6VU5LTk9XTjpSVS1LWjkKK1JVU1NJQTpBU1RSQUtIQU5TS0HvQSBPQkxBU1Q7TElNQU5TS0lZOlVOS05PV046UlUtTE1TCitSVVNTSUE6S0FMTVlLSUE7S0FTUElZU0tJWTpVTktOT1dOOlJVLUtQIAorUlVTU0lBOktBTElOSU5HUkFEU0tB70EgT0JMQVNUO0dWQVJERVlTS0lZOlVOS05PV046UlUtR1ZTCitSVVNTSUE6S0FMSU5JTkdSQURTS0HvQSBPQkxBU1Q7R1VSWUVWU0tJWTpVTktOT1dOOlJVLUdZVgorUlVTU0lBOktBTElOSU5HUkFEU0tB70EgT0JMQVNUO0tBTElOSU5HUkFEOlVOS05PV046UlUtS0dECitSVVNTSUE6S0FMSU5JTkdSQURTS0HvQSBPQkxBU1Q7TkVTVEVST1ZTS0lZOlVOS05PV046UlUtTlNWCitSVVNTSUE6S0FMSU5JTkdSQURTS0HvQSBPQkxBU1Q7Q0hFUk5ZQUtIT1ZTSzpVTktOT1dOOlJVLUNFNQorUlVTU0lBOktBTElOSU5HUkFEU0tB70EgT0JMQVNUO0dVU0VWOlVOS05PV046UlUtR1UgCitSVVNTSUE6S0FMSU5JTkdSQURTS0HvQSBPQkxBU1Q7UFJBVkRJTlNLSVk6VU5LTk9XTjpSVS1QQU4KK1JVU1NJQTpLQUxJTklOR1JBRFNLQe9BIE9CTEFTVDtPWkVSU0tJWTpVTktOT1dOOlJVLU9aSQorUlVTU0lBOktBTElOSU5HUkFEU0tB70EgT0JMQVNUO1NMQVZTS0lZOlVOS05PV046UlUtUzEKK1JVU1NJQTpLQUxJTklOR1JBRFNLQe9BIE9CTEFTVDtaRUxFTk9HUkFEU0tJWTpVTktOT1dOOlJVLVpMQQorUlVTU0lBOktBTElOSU5HUkFEU0tB70EgT0JMQVNUO1NPVkVUU0s6VU5LTk9XTjpSVS1TVlQKK1JVU1NJQTpLQUxJTklOR1JBRFNLQe9BIE9CTEFTVDtORU1BTlNLSVk6VU5LTk9XTjpSVS1OTVMKK1JVU1NJQTpLQUxJTklOR1JBRFNLQe9BIE9CTEFTVDtLUkFaTk9aTkFNRU5TS0lZOlVOS05PV046UlUtS1pFCitSVVNTSUE6S0FMSU5JTkdSQURTS0HvQSBPQkxBU1Q7TkVNQU46VU5LTk9XTjpSVS1ORSAKK1JVU1NJQTpLQUxJTklOR1JBRFNLQe9BIE9CTEFTVDtQT0xFU1NLSVk6VU5LTk9XTjpSVS1QTDQKK1JVU1NJQTpLQUxJTklOR1JBRFNLQe9BIE9CTEFTVDtTVkVUTE9HT1JTSzpVTktOT1dOOlJVLVNFRworUlVTU0lBOktBTElOSU5HUkFEU0tB70EgT0JMQVNUO0NIRVJOWUFLSE9WU0tJWTpVTktOT1dOOlJVLUNFNgorUlVTU0lBOktBTElOSU5HUkFEU0tB70EgT0JMQVNUO0dVU0VWU0tJWTpVTktOT1dOOlJVLUdTSworUlVTU0lBOktBTElOSU5HUkFEU0tB70EgT0JMQVNUO1NWRVRMWUk6VU5LTk9XTjpSVS1TRTkKK1JVU1NJQTpLQUxJTklOR1JBRFNLQe9BIE9CTEFTVDtCQUxUSVlTSzpVTktOT1dOOlJVLUJUMgorUlVTU0lBOktBTElOSU5HUkFEU0tB70EgT0JMQVNUO0JBR1JBVElPTk9WU0tJWTpVTktOT1dOOlJVLUJHTworU0FOIE1BUklOTzpTQU4gTUFSSU5POlVOS05PV046U00tTQorU0xPVkVOSUE6U0xPVkVOSUpBOlVOS05PV046U0ktMDEKK1NXRURFTjpOT1JSQk9UVEVOOlVOS05PV046U0UtQkQKK1NXRURFTjpWhFNURVJCT1RURU46VU5LTk9XTjpTRS1BQworU1dFREVOOkqETVRMQU5EOlVOS05PV046U0UtWgorU1dFREVOOlaEU1RFUk5PUlJMQU5EOlVOS05PV046U0UtWQorU1dFREVOOkeEVkxFQk9SRzpVTktOT1dOOlNFLVgKK1NXRURFTjpLT1BQQVJCRVJHOlVOS05PV046U0UtS1AKK1NXRURFTjpWhFJNTEFORDpVTktOT1dOOlNFLVMKK1NXRURFTjpVUFBTQUxBOlVOS05PV046U0UtQworU1dFREVOOlYgU1RNQU5MQU5EOlVOS05PV046U0UtVQorU1dFREVOOlNUT0NLSE9MTTpVTktOT1dOOlNFLUFCCitTV0VERU46T1JFQlJPOlVOS05PV046U0UtVAorU1dFREVOOlOUUk1MQU5EOlVOS05PV046U0UtRAorU1dFREVOOlpMVlNCT1JHOlVOS05PV046U0UtTAorU1dFREVOOkKUSFVTOlVOS05PV046U0UtQkgKK1NXRURFTjpTS0FSQUJPUkc6VU5LTk9XTjpTRS1TSworU1dFREVOOk9TVEVSR5RUTEFORDpVTktOT1dOOlNFLVNUCitTV0VERU46R09UTEFORDpVTktOT1dOOlNFLUkKK1NXRURFTjpKlE5LlFBJTkc6VU5LTk9XTjpTRS1GCitTV0VERU46S0FMTUFSOlVOS05PV046U0UtSAorU1dFREVOOkhBTExBTkQ6VU5LTk9XTjpTRS1OCitTV0VERU46S1JPTk9CRVJHOlVOS05PV046U0UtRworU1dFREVOOktSSVNUSUFOU1RBRDpVTktOT1dOOlNFLVJJCitTV0VERU46QkxFS0lOR0U6VU5LTk9XTjpTRS1LCitTV0VERU46TUFMTZRIVVM6VU5LTk9XTjpTRS1NTworVU5JVEVEIEtJTkdET006RFVNRlJJRVMtR0FMTE86VU5LTk9XTjpHQi1ER1kKK1VOSVRFRCBLSU5HRE9NOk5PUlRIRVJOIElSRUxBTkQ6VU5LTk9XTjpHQi1OSVIKK1VOSVRFRCBLSU5HRE9NOkNMRVZFTEFORDpVTktOT1dOOkdCLUNMVgorVU5JVEVEIEtJTkdET006VU5JVEVEIEtJTkdET006VU5LTk9XTjpHQi1VSworVU5JVEVEIEtJTkdET006SFVNQkVSU0lERTpVTktOT1dOOkdCLUhVTQorVU5JVEVEIEtJTkdET006V0VTVCBZT1JLU0hJUkU6VU5LTk9XTjpHQi1XWU8KK1VOSVRFRCBLSU5HRE9NOk1FUlNFWVNJREU6VU5LTk9XTjpHQi1NRVIKK1VOSVRFRCBLSU5HRE9NOkdSRUFURVIgTUFOQ0hFU1RFUjpVTktOT1dOOkdCLU1BTgorVU5JVEVEIEtJTkdET006U09VVEggWU9SS1NISVJFOlVOS05PV046R0ItU1lPCitVTklURUQgS0lOR0RPTTpDTFdZRDpVTktOT1dOOkdCLUNMVworVU5JVEVEIEtJTkdET006RUFTVCBBTkdMSUE6VU5LTk9XTjpHQi1FQUcKK1VOSVRFRCBLSU5HRE9NOkhFUkVGT1JEOlVOS05PV046R0ItSEVGCitVTklURUQgS0lOR0RPTTpXRVNUIE1JRExBTkRTOlVOS05PV046R0ItV01ECitVTklURUQgS0lOR0RPTTpCRVJLUzpVTktOT1dOOkdCLUJFUgorVU5JVEVEIEtJTkdET006QVZPTjpVTktOT1dOOkdCLUFWTworVU5JVEVEIEtJTkdET006R1dFTlQ6VU5LTk9XTjpHQi1HV1QKK1VOSVRFRCBLSU5HRE9NOkdSRUFURVIgTE9ORE9OOlVOS05PV046R0ItTE5ECitVTklURUQgS0lOR0RPTTpHUkFNUElBTjpVTktOT1dOOkdCLUdSQQorVU5JVEVEIEtJTkdET006Qk9SRC1DRU5UUi1GSUZFLUxPVEhJQU4tVEFZOlVOS05PV046R0ItQkNGCitVTklURUQgS0lOR0RPTTpISUdITEFORFM6VU5LTk9XTjpHQi1IR0wKK1VOSVRFRCBLSU5HRE9NOldFU1QgTUlETEFORFMgKENPVU5UWSk6VU5LTk9XTjpHQi1XTUkKK0JPU05JQSBBTkQgSEVSWkVHT1ZJTkE6Qk9TTkEgSSBIRVJDRUdPVklOQTpVTktOT1dOOkJBLUJJSAorWVVHT1NMQVZJQTpWb2p2b2RpbmE6VU5LTk9XTjpZVS1WT0oKK1lVR09TTEFWSUE6U3JiaWphOlVOS05PV046WVUtU1JCCitZVUdPU0xBVklBOkNybmEgR29yYTpVTktOT1dOOllVLUNHTworWVVHT1NMQVZJQTpLb3Nvdm86VU5LTk9XTjpZVS1LT1MKK1lVR09TTEFWSUE6TWFrZWRvbmlqYTpVTktOT1dOOllVLU1LRAorQXplcmJhaWphbjpBemVyYmF5ZHpoYW4gVGVycml0b3I6VU5LTk9XTjpBWi1BVEUKK0F6ZXJiYWlqYW46TmFnb3Juby1LYXJhYmFraDpVTktOT1dOOkFaLU5LQQorQXplcmJhaWphbjpOYWtoaWNoZXZhbjpVTktOT1dOOkFaLU5BSworS2F6YWtoc3RhbjpBa3R5dWJpbnNrOlVOS05PVzpLWi1BS1QKK0themFraHN0YW46QWxtYS1BdGE6VU5LTk9XTjpLWi1BTE0KK0themFraHN0YW46QXJhbCBTZWE6VU5LTk9XTjpLWi1BUlMKK0themFraHN0YW46Q2hpbWtlbnQ6VU5LTk9XTjpLWi1DSEkKK0themFraHN0YW46RHpoYW1idWw6VU5LTk9XTjpLWi1EWkEKK0themFraHN0YW46RHpoZXprYXpnYW46VU5LTk9XTjpLWi1EWkUKK0themFraHN0YW46RWFzdCBLYXpha2hzdGFuOlVOS05PV046S1otRUFLCitLYXpha2hzdGFuOkd1cnlldjpVTktOT1dOOktaLUdVUgorS2F6YWtoc3RhbjpLYXJhZ2FuZGE6VU5LTk9XTjpLWi1LQVIKK0themFraHN0YW46S29jaGV0YXY6VU5LTk9XTjpLWi1LT0MKK0themFraHN0YW46S3VzdGFuYXk6VU5LTk9XTjpLWi1LVVMKK0themFraHN0YW46S3p5bC1PcmRhOlVOS05PV046S1otS1pPCitLYXpha2hzdGFuOk5vcnRoIEthemFraHN0YW46VU5LTk9XTjpLWi1OT0sKK0themFraHN0YW46UGF2bG9kYXI6VU5LTk9XTjpLWi1QQVYKK0themFraHN0YW46U2VtaXBhbGF0aW5zazpVTktOT1dOOktaLVNFTQorS2F6YWtoc3RhbjpUYWxkeSBLdXJnYW46VU5LTk9XTjpLWi1UQUsKK0themFraHN0YW46VHNlbGlub2dyYWQ6VU5LTk9XTjpLWi1UU0UKK0themFraHN0YW46VXJhbHNrOlVOS05PV046S1otVVJBCitLeXJneXpzdGFuOklzc3lrLUt1bDpVTktOT1dOOktHLUlTSworS3lyZ3l6c3RhbjpLaXJnaGl6aXN0YW4gVGVycml0b3JpZXM6VU5LTk9XTjpLRy1LSVQKK01LOk1BS0VET05JSkE6VU5LTk9XTjpNSy1NCitNQUNFRE9OSUE6TUFLRURPTklKQTpVTktOT1dOOk1LLU0KK01PTERPVklBOk1PTERBVklBOlVOS05PV046TUQtTQorUGFraXN0YW46Ri5DLlQuOlVOS05PV046UEstRkMKK1RhamlraXN0YW46TGVuaW5hYmFkOlVOS05PV046VEotTEUKK1RhamlraXN0YW46VGFkemhpa2lzdGFuIFRlcnJpdG9yaWVzOlVOS05PV046VEotVEEKK1R1cmtleTpLLiBNYXJhczpVTktOT1dOOlRSLUtNQQorVHVya21lbmlzdGFuOkNoYXJkemhvdTpVTktOT1dOOlRNLUNIQQorVHVya21lbmlzdGFuOlRhc2hhdXo6VU5LTk9XTjpUTS1UQVMKK1R1cmttZW5pc3RhbjpUdXJrbWVuaXN0YW4gVGVycml0b3JpZXM6VU5LTk9XTjpUTS1UVAorVXpiZWtpc3RhbjpBcmFsIFNlYTpVTktOT1dOOlVaLUFTCitBbGdlcmlhOkFkcmFyOkFkcmFyMTpEWi0wCitBbGdlcmlhOkFpbiBEYWZsYTpBaW4gRGVmbGE6RFotNDQKK0FsZ2VyaWE6QWluIFRhbW91Y2hlbnQ6QWluIHRlbW91Y2hlbnQ6RFotNDYKK0FsZ2VyaWE6Qm9yamJvdWFyaXJlajpCb3JkaiBCb3UgQXJyZXJpZGo6RFotMzQKK0FsZ2VyaWE6R2hhcmRhU2E6R2hhcmRhaWE6RFotNDcKK0FsZ2VyaWE6TWVkaWE6TWVkZWE6RFotMjYKK0FsZ2VyaWE6TW9zdGFnaGFuZW06TW9zdGFnYW5lbTpEWi0yNworQWxnZXJpYTpUYW1hbnJhc3NldDpUYW1hbmdoYXNzZXQ6RFotVEFNCitBbGdlcmlhOlRlbmRvdWY6VGluZG91ZjpEWi0zNworQW5nb2xhOk1hbGFuamU6TWFsYW5nZTpBTy1NQUwKK0FuZ29sYTpVaWdlOlVnZTpBTy1VSUcKK0FuZ29sYTpIdWlsYTpIdWxhOkFPLUhVSQorQnVydW5kaTpNdXJhbXZpeWE6TXVyYW12eWE6QkktTVUKK0NhcGUgVmVyZGU6Rm9nbzpVTktOT1dOOkNWLUZPCitDYXBlIFZlcmRlOlNhbnRvIEFudGFvOlVOS05PV046Q1YtU09OCitDYXBlIFZlcmRlOlNhbyBOaWNvbGF1OlNvIE5pY29sYXU6Q1YtU04KK0NhcGUgVmVyZGU6U2FvIFZpY2VudGU6U28gVmljZW50ZTpDVi1TVgorQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljOlNhbmdoYTE6U2FuZ2hhLU1iYWVyZTpDRi1TQQorQ2hhZDpMYWtlOkxhYzpURC1MQworQ2hhZDpMb2dvbmUgT2NjaWRlbjpMb2dvbmUtT2NjaWRlbnRhbDpURC1MTworQ2hhZDpMb2dvbmUgT3JpZW50YTpMb2dvbmUtT3JpZW50YWw6VEQtTFIKK0NvbW9yb3M6R3JhbmQgQ29tb3JlOkdyYW5kZSBDb21vcmU6S00tRworQ29tb3JvczpJbGUgZGUgTWF5b3R0ZSAoRnIuKTpVTktOT1dOOktNLUlMTQorQ29tb3JvczpNd2FsaTpNb2hlbGk6S00tTQorQ29tb3JvczpOendhbmk6VU5LTk9XTjpLTS1OWgorRWd5cHQ6RnJvbnRpZXIgR292ZXJuYXRlczpVTktOT1dOOkVHLUZSRworRWd5cHQ6TG93ZXIgRWd5cHQ6VU5LTk9XTjpFRy1MT0UKK0VneXB0OlVwcGVyIEVneXB0OlVOS05PV046RUctVVBFCitFZ3lwdDpVcmJhbiBHb3Zlcm5hdGVzOlVOS05PV046RUctVVJHCitFcXVhdG9yaWFsIEd1aW5lYTpLaWVudGVtOktpZS1OdGVtOkdRLUtOCitFcXVhdG9yaWFsIEd1aW5lYTpXZWxlbnphczpXZWxlLU56YXM6R1EtV04KK0VyaXRyZWE6QWtlbGUgR3V6YXk6VU5LTk9XTjpFUi1BS0cKK0VyaXRyZWE6QWtvcmRhdDpVTktOT1dOOkVSLUFLCitFcml0cmVhOkFzc2ViOlVOS05PV046RVItQVMKK0VyaXRyZWE6R2FzaCAmIFNldGl0OlVOS05PV046RVItR0FTCitFcml0cmVhOkhhbWFzc2llbjpVTktOT1dOOkVSLUhBCitFcml0cmVhOktlcmVuOlVOS05PV046RVItS0UKK0VyaXRyZWE6S2V5IEJhaGlyOkRlYnV3YWJpIEtleWloIEJhaHJpOkVSLURLCitFcml0cmVhOlNhaGVsOlVOS05PV046RVItU0EKK0VyaXRyZWE6U2VyYXllOlVOS05PV046RVItU0UKK0dhYm9uOldvdWxldS1OdGVtOldvbGV1LU50ZW06R0EtOQorR2hhbmE6V2VzdGVybjI6V2VzdGVybjpHSC1XUAorSXZvcnkgQ29hc3Q6TWFuOlVOS05PV046Q0ktTU4KK0l2b3J5IENvYXN0OlNhbi1QZWRybzpVTktOT1dOOkNJLVNQCitJdm9yeSBDb2FzdDpBYmVuZ291cm91OlVOS05PV046Q0ktQUJFCitJdm9yeSBDb2FzdDpBYmlkamFuOlVOS05PV046Q0ktQUJJCitJdm9yeSBDb2FzdDpBYm9pc3NvOlVOS05PV046Q0ktQUJPCitJdm9yeSBDb2FzdDpBZHpvcGU6VU5LTk9XTjpDSS1BRAorSXZvcnkgQ29hc3Q6QWdib3ZpbGxlOlVOS05PV046Q0ktQUdCCitJdm9yeSBDb2FzdDpBZ25pYmlsZWtybzpVTktOT1dOOkNJLUFHTgorSXZvcnkgQ29hc3Q6QmFuZ29sbzpVTktOT1dOOkNJLUJBTgorSXZvcnkgQ29hc3Q6QmVvdW1pOlVOS05PV046Q0ktQkVPCitJdm9yeSBDb2FzdDpCaWFua291bWE6VU5LTk9XTjpDSS1CSUEKK0l2b3J5IENvYXN0OkJvbmRvdWtvdTpVTktOT1dOOkNJLUJPRAorSXZvcnkgQ29hc3Q6Qm9uZ291YW5vdTpVTktOT1dOOkNJLUJPRworSXZvcnkgQ29hc3Q6Qm91YWZsZTpVTktOT1dOOkNJLUJPRgorSXZvcnkgQ29hc3Q6Qm91YWtlOlVOS05PV046Q0ktQk9LCitJdm9yeSBDb2FzdDpCb3VuYTpVTktOT1dOOkNJLUJPVQorSXZvcnkgQ29hc3Q6Qm91bmRpYWxpOlVOS05PV046Q0ktQk9OCitJdm9yeSBDb2FzdDpEYWJha2FsYTpVTktOT1dOOkNJLURBSworSXZvcnkgQ29hc3Q6RGFsb2E6VU5LTk9XTjpDSS1EQUwKK0l2b3J5IENvYXN0OkRhbmFuZTpVTktOT1dOOkNJLURBTgorSXZvcnkgQ29hc3Q6RGFvdWtybzpVTktOT1dOOkNJLURBTworSXZvcnkgQ29hc3Q6RGltYm9rcm86VU5LTk9XTjpDSS1ESU0KK0l2b3J5IENvYXN0OkRpdm86VU5LTk9XTjpDSS1ESVYKK0l2b3J5IENvYXN0OkR1ZWtvdWU6VU5LTk9XTjpDSS1EVUUKK0l2b3J5IENvYXN0OkZlcmtlc3NlZG91Z291OlVOS05PV046Q0ktRkVSCitJdm9yeSBDb2FzdDpHYWdub2E6VU5LTk9XTjpDSS1HQUcKK0l2b3J5IENvYXN0OkdyYW5kLUxhaG91OlVOS05PV046Q0ktTEFICitJdm9yeSBDb2FzdDpHdWlnbG86VU5LTk9XTjpDSS1HVUkKK0l2b3J5IENvYXN0Oklzc2lhOlVOS05PV046Q0ktSVNTCitJdm9yeSBDb2FzdDpLYXRpb2xhOlVOS05PV046Q0ktS0FUCitJdm9yeSBDb2FzdDpLb3Job2dvOlVOS05PV046Q0ktS09SCitJdm9yeSBDb2FzdDpMYWtvdGE6VU5LTk9XTjpDSS1MQUsKK0l2b3J5IENvYXN0Ok0nYmFoaWFrcm86VU5LTk9XTjpDSS1NQkEKK0l2b3J5IENvYXN0Ok1hbmtvbm86VU5LTk9XTjpDSS1NQU4KK0l2b3J5IENvYXN0Ok9kaWVubmU6VU5LTk9XTjpDSS1PREkKK0l2b3J5IENvYXN0Ok91bWU6VU5LTk9XTjpDSS1PVQorSXZvcnkgQ29hc3Q6U2FrYXNzb3U6VU5LTk9XTjpDSS1TQUsKK0l2b3J5IENvYXN0OlNhc3NhbmRyYTpVTktOT1dOOkNJLVNBUworSXZvcnkgQ29hc3Q6U2VndWVsYTpVTktOT1dOOkNJLVNFRworSXZvcnkgQ29hc3Q6U2luZnJhOlVOS05PV046Q0ktU0lOCitJdm9yeSBDb2FzdDpTb3VicmU6VU5LTk9XTjpDSS1TT1IKK0l2b3J5IENvYXN0OlRhYm91OlVOS05PV046Q0ktVEFCCitJdm9yeSBDb2FzdDpUYW5kYTpVTktOT1dOOkNJLVRBTgorSXZvcnkgQ29hc3Q6VGVuZ3JlbGE6VU5LTk9XTjpDSS1URU4KK0l2b3J5IENvYXN0OlRpYXNzYWxlOlVOS05PV046Q0ktVElBCitJdm9yeSBDb2FzdDpUb3ViYTpVTktOT1dOOkNJLVRPQgorSXZvcnkgQ29hc3Q6VG91bW9kaTpVTktOT1dOOkNJLVRPTQorSXZvcnkgQ29hc3Q6VmF2b3VhOlVOS05PV046Q0ktVkFWCitJdm9yeSBDb2FzdDpZYW1vdXNzb3Vrcm86VU5LTk9XTjpDSS1ZQU0KK0l2b3J5IENvYXN0Olp1ZW5vdWxhOlVOS05PV046Q0ktWlVFCitMZXNvdGhvOk1vaGFsZSdTIEhvZWs6TW9oYWxlcyBIb2VrOkxTLUYKK0xlc290aG86UXVhY2hhJ1MgTmVrOlF1YWNoYXMgTmVrOkxTLUgKK0xpYmVyaWE6Qm9taSBUZXJyLjpCb21pOkxSLUJNCitMaWJlcmlhOktydSBDb2FzdCBUZXJyLjpHcmFuZCBLcnU6TFItR0sKK0xpYmVyaWE6TWFyc2hhbGwgVGVyci46VU5LTk9XTjpMUi1NUgorTGliZXJpYTpSaXZlcmNlc3MgVGVyci46Uml2ZXJjZXNzOkxSLVJJCitMaWJlcmlhOlNhc3N0b3duIFRlcnIuOlVOS05PV046TFItU0EKK0xpYnlhOkFqZGFiaXlhIChBZ2VkYWJpYSk6VU5LTk9XTjpMWS1BREoKK0xpYnlhOkFsIEF6aXppeWFoOlVOS05PV046TFktQVpZCitMaWJ5YTpBbCBGYXRhaDpVTktOT1dOOkxZLUZUSAorTGlieWE6QWwgSmFiYWwgQWwgQWtoZGFyOkFsIEphYmFsIEFsIEFraGFyOkxZLUpBCitMaWJ5YTpBbCBLaG9tczpVTktOT1dOOkxZLUtITworTGlieWE6QXNoIFNoYXRpOlVOS05PV046TFktQVNICitMaWJ5YTpBd2JhcmkgKFViYXJpKTpVTktOT1dOOkxZLUFXQgorTGlieWE6QXogWmF3aWEgKEF6emF3aXlhKTpBeiBad2l5YWg6TFktWkEKK0xpYnlhOkJhbmdoYXppOkJhbmdoejpMWS1CQQorTGlieWE6R2hhZGFtaXM6VU5LTk9XTjpMWS1HSEEKK0xpYnlhOkdoYXJ5YW46VU5LTk9XTjpMWS1HUlkKK0xpYnlhOk1pc3VyYXRhOlVOS05PV046TFktTUlTCitMaWJ5YTpOdXFhdCBBbCBLaGFtczpVTktOT1dOOkxZLU5VRworTGlieWE6U2FiaGE6VU5LTk9XTjpMWS1TQUIKK0xpYnlhOlNhd2ZhamppbiAoU29mdWxqZWVuKTpVTktOT1dOOkxZLVNBVworTGlieWE6U3VydCAoU2lydGUpOlVOS05PV046TFktU1VSCitMaWJ5YTpUYXJodW5haDpVTktOT1dOOkxZLVRBUgorTGlieWE6VHJpcG9saSAoVGFyYWJ1bHVzKTpVTktOT1dOOkxZLVRSSQorTGlieWE6VHVicnVxIChUb2JydWspOlVOS05PV046TFktVFVCCitMaWJ5YTpZYWZyYW4gKFllZnJlbik6VU5LTk9XTjpMWS1ZQUYKK0xpYnlhOlplbGVpdGluIChabGl0ZW4pOlVOS05PV046TFktWkVMCitNYWRhZ2FzY2FyOlRvbGlhcnk6VG9saWFyYTpNRy1VCitNYXVyaXRpdXM6TWF1cml0aXVzOlVOS05PV046TVVTLU0KK01vcm9jY286Q2VudHJlIE5vcmQ6VU5LTk9XTjpNQS1DRU4KK01vcm9jY286Q2VudHJlIFN1ZDpVTktOT1dOOk1BLUNFUworTW9yb2NjbzpPcmllbnRhbDpVTktOT1dOOk1BLU9SCitNb3JvY2NvOlRlbnNpZnQ6VU5LTk9XTjpNQS1URQorTW9yb2NjbzpOT1JEIE9VRVNUOlVOS05PV046TUEtTgorTW9yb2NjbzpDRU5UUkU6VU5LTk9XTjpNQS1DCitNb3JvY2NvOlNVRDpVTktOT1dOOk1BLVMKK01vemFtYmlxdWU6TmFzc2E6Tmlhc3NhOk1aLUEKK05hbWliaWE6QmV0aGFuaWVuOlVOS05PV046TkEtQkVUCitOYW1pYmlhOkJvZXNtYW5sYW5kOlVOS05PV046TkEtQk8KK05hbWliaWE6RGFtYXJhbGFuZDpVTktOT1dOOk5BLURBCitOYW1pYmlhOkdvYmFiaXM6VU5LTk9XTjpOQS1HTworTmFtaWJpYTpHcm9vdGZvbnRlaW46VU5LTk9XTjpOQS1HUgorTmFtaWJpYTpIZXJlcm9sYW5kIEVhc3Q6VU5LTk9XTjpOQS1IRUEKK05hbWliaWE6SGVyZXJvbGFuZCBXZXN0OlVOS05PV046TkEtSEVXCitOYW1pYmlhOkthb2tvbGFuZDpVTktOT1dOOk5BLUtBSworTmFtaWJpYTpLYXJhc2J1cmc6VU5LTk9XTjpOQS1LQVMKK05hbWliaWE6S2FyaWJpYjpVTktOT1dOOk5BLUtJQgorTmFtaWJpYTpLYXZhbmdvOlVOS05PV046TkEtS0FWCitOYW1pYmlhOktlZXRtYW5zaG9vcDpVTktOT1dOOk5BLUtFCitOYW1pYmlhOkx1ZGVyaXR6OlVOS05PV046TkEtTFUKK05hbWliaWE6TWFsdGFob2hlOlVOS05PV046TkEtTUxUCitOYW1pYmlhOk1hcmllbnRhbDpVTktOT1dOOk5BLU1SSQorTmFtaWJpYTpOYW1hbGFuZDpVTktOT1dOOk5BLU5BTAorTmFtaWJpYTpPa2FoYW5kamE6VU5LTk9XTjpOQS1PS0QKK05hbWliaWE6T21hcnVydTpVTktOT1dOOk5BLU9NVQorTmFtaWJpYTpPdGppd2Fyb25nbzpVTktOT1dOOk5BLU9USQorTmFtaWJpYTpPdXRqbzpVTktOT1dOOk5BLU9VVAorTmFtaWJpYTpPd2FtYm86VU5LTk9XTjpOQS1PV0EKK05hbWliaWE6UmVob2JvdGg6VU5LTk9XTjpOQS1SQkgKK05hbWliaWE6U3dha29wbXVuZDpVTktOT1dOOk5BLVNXSworTmFtaWJpYTpUc3VtZWI6VU5LTk9XTjpOQS1UU0IKK05hbWliaWE6V2luZGhvZWs6VU5LTk9XTjpOQS1XSUgKK05pZ2VyOlRpbGxhYmVyeTpUaWxsYWJlcmk6TkUtNgorTmlnZXJpYTpBZGFtd2FyYTpVTktOT1dOOk5HLUFXTQorTmlnZXJpYTpBa3dhbGJvbTpVTktOT1dOOk5HLUFLVworTmlnZXJpYTpGQ1Q6VU5LTk9XTjpORy1GQ1QKK1J3YW5kYTpLaWJ1bmd1OktpYnVuZ286UlctSgorUndhbmRhOktpZ2FsaTpLaWdhbGktUnVyYWw6UlctSworU2FvIFRvbWUgYW5kIFByaW5jaXBlOlByaW5jaXBlOlBybmNpcGU6U1QtUAorU2FvIFRvbWUgYW5kIFByaW5jaXBlOlNhbyBUb21lOlNvIFRvbWU6U1QtUworU2VuZWdhbDpEYWdhbmE6VU5LTk9XTjpTTi1EQUcKK1NlbmVnYWw6QmFrZWw6VU5LTk9XTjpTTi1CQUsKK1NlbmVnYWw6QmFtYmV5OlVOS05PV046U04tQkJZCitTZW5lZ2FsOkJpZ25vbmE6VU5LTk9XTjpTTi1CR08KK1NlbmVnYWw6Rm91bmRpb3VnbmU6VU5LTk9XTjpTTi1GREkKK1NlbmVnYWw6R29zc2FzOlVOS05PV046U04tR1MKK1NlbmVnYWw6S2FmZnJpbmU6VU5LTk9XTjpTTi1LQUYKK1NlbmVnYWw6S2ViZW1lcjpVTktOT1dOOlNOLUtFTQorU2VuZWdhbDpLZWRvdWdvdTpVTktOT1dOOlNOLUtFVQorU2VuZWdhbDpMaW5ndWVyZTpVTktOT1dOOlNOLUxHRQorU2VuZWdhbDpNYmFja2U6VU5LTk9XTjpTTi1NQksKK1NlbmVnYWw6TWJvdXI6VU5LTk9XTjpTTi1NQlUKK1NlbmVnYWw6Tmlvcm8tRHUtUmlwOlVOS05PV046U04tTkRSCitTZW5lZ2FsOk91c3NvdXllOlVOS05PV046U04tT1VZCitTZW5lZ2FsOlBpa2luZTpVTktOT1dOOlNOLVBLRQorU2VuZWdhbDpQb2RvcjpVTktOT1dOOlNOLVBEUgorU2VuZWdhbDpSdWZpc3F1ZS1CYXJnbnk6VU5LTk9XTjpTTi1SVVEKK1NlbmVnYWw6U2VkaGlvdTpVTktOT1dOOlNOLVNESAorU2VuZWdhbDpUaXZhb3VhbmU6VU5LTk9XTjpTTi1UVk8KK1NlbmVnYWw6VmVsaW5nYXJhOlVOS05PV046U04tVkdSCitTZXljaGVsbGVzOk1haGUgSXNsYW5kOlVOS05PV046U0MtTQorU2V5Y2hlbGxlczpQcmFzbGluIElzbGFuZDpVTktOT1dOOlNDLVAKK1NvbWFsaWE6R2FkbzpHZWRvOlNPLUdFCitTb21hbGlhOkhpaXJhbjpIaWlyYWFuOlNPLUhJCitTb21hbGlhOkouIERoZXhlOkp1YmJhZGEgRGhleGU6U08tSkQKK1NvbWFsaWE6Si4gSG9vc2U6SnViYmFkYSBIb29zZTpTTy1KSAorU29tYWxpYTpTaC4gRGhleGU6U2hhYmVlbGxhaGEgRGhleGU6U08tU0QKK1NvbWFsaWE6U2guIEhvb3NlOlNoYWJlZWxsYWhhIEhvb3NlOlNPLVNICitTb21hbGlhOlRvZy1EaGVlcjpUb2dkaGVlcjpTTy1UTworU29tYWxpYTpXLiBHYWxiZWVkOldvcW9veWkgR2FsYmVlZDpTTy1XTworU291dGggQWZyaWNhOk5hdGFsOlVOS05PV046WkEtTkFUCitTb3V0aCBBZnJpY2E6T3JhbmdlOlVOS05PV046WkEtT1IKK1NvdXRoIEFmcmljYTpPcmFuZ2UgRnJlZSBTdGF0ZTpVTktOT1dOOlpBLU9GUworU291dGggQWZyaWNhOlBXVjpVTktOT1dOOlpBLVBXTQorU3VkYW46QmFociBlbCBHaGF6YWw6VU5LTk9XTjpTRC1CRUcKK1N1ZGFuOkRhcmZ1cjpVTktOT1dOOlNELURBRgorU3VkYW46RXF1YXRvcmlhOlVOS05PV046U0QtRVEKK1N1ZGFuOktoYXJ0b3VtOlVOS05PV046U0QtS0hBCitTdWRhbjpLb3JkdWZhbjpVTktOT1dOOlNELUtPUgorU3VkYW46VXBwZXIgTmlsZTpVTktOT1dOOlNELVVQTgorVGFuemFuaWEgVW5pdGVkIFJlcHVibGljOkwuIFZpY3RvcmlhOlVOS05PV046VFotVkkKK1R1bmlzaWE6UmVnaW9uIDE6VU5LTk9XTjpUTi1SMQorVHVuaXNpYTpSZWdpb24gMjpVTktOT1dOOlROLVIyCitUdW5pc2lhOlJlZ2lvbiAzOlVOS05PV046VE4tUjMKK1R1bmlzaWE6UmVnaW9uIDQ6VU5LTk9XTjpUTi1SNAorVHVuaXNpYTpSZWdpb24gNTpVTktOT1dOOlROLVI1CitUdW5pc2lhOlJlZ2lvbiA2OlVOS05PV046VE4tUjYKK1R1bmlzaWE6UmVnaW9uIDc6VU5LTk9XTjpUTi1SNworVWdhbmRhOkxha2UgVmljdG9yaWE6VU5LTk9XTjpVRy1WCitaYW1iaWE6Q2VudHJhbDM6VU5LTk9XTjpaTS1DMworWmFtYmlhOkVhc3Rlcm40OlVOS05PV046Wk0tRTQKK1phbWJpYTpOb3J0aGVybjQ6VU5LTk9XTjpaTS1ONAorWmFtYmlhOlNvdXRoZXJuMzpVTktOT1dOOlpNLVMzCitaYW1iaWE6V2VzdGVybjQ6VU5LTk9XTjpaTS1XNAorQmFocmFpbjpCYWhyYWluOlVOS05PV046QkgtQgorSXJhcTpBbC1BbmJhcjpBbCBBbmJyOklRLUFOCitJcmFxOkFsLUJhc3JhaDpBbCBCYXJhaDpJUS1CQQorSXJhcTpBbC1NdXRoYW5uaWE6QWwgTXV0aGFubmE6SVEtTVUKK0lyYXE6QWwtUWFkaXNpeWFoOkFsIFFkaXN5YWg6SVEtUUEKK0lyYXE6QXJiaWw6QXJibDpJUS1BUgorSXJhcTpBdC1UYW1pbTpBdCBUYW1tOklRLVRTCitJcmFxOkJhYmlsOkJiaWw6SVEtQkIKK0lyYXE6QmFnaGRhZDpCYWdoZGQ6SVEtQkcKK0lyYXE6RGhpLVFhcjpEaCBRcjpJUS1EUQorSXJhcTpEaWhvazpEYWhrOklRLURBCitJcmFxOkRpeWFsYTpEaXlsYTpJUS1ESQorSXJhcTpJUlEvU0FVIE5ldXRyYWwgWm9uZTpVTktOT1dOOklRLU5FVQorSXJhcTpLYXJiYWxhOkthcmJhbDpJUS1LQQorSXJhcTpNaXNhbjpNYXlzbjpJUS1NQQorSXJhcTpOZWluZXZhOk5uYXdhOklRLU5JCitJcmFxOlNhbGFodWRkaW46YWxhZCBEbjpJUS1TRAorSXJhcTpTdWxheW1hbml5YWg6QXMgU3VsYXltbnlhaDpJUS1TVQorSXJhcTpXYXNpdDpXc2k6SVEtV0EKK0lyYW46QmFraHRhcmFuOlVOS05PV046SVItQktUCitJcmFuOkJ1c2hlaHI6QnNoZWhyOklSLTA2CitJcmFuOkNoYWhhcm1haGFsIGFuZCBCYWtodGlhcjpDaGFociBNYWhsbCB2YSBCYWtodHI6SVItMDgKK0lyYW46RWFzdCBBemFyYmF5ZWphbjpVTktOT1dOOklSLUVBWgorSXJhbjpFc2ZhaGFuOkVmYWhuOklSLTA0CitJcmFuOkZhcnM6RnJzOklSLTQKK0lyYW46R2lsYW46R2xuOklSLTkKK0lyYW46SGFtYWRhbjpIYW1hZG46SVItMjQKK0lyYW46SG9yYXNhbjpVTktOT1dOOklSLUhTQQorSXJhbjpIb3Jtb3pnYW46SG9ybW96Z246SVItMjMKK0lyYW46SWxhbTpsbTpJUi0wNQorSXJhbjpLZXJtYW46S2VybW46SVItNQorSXJhbjpLaHV6ZXN0YW46S2h6ZXN0bjpJUi0wCitJcmFuOktvaGdpbHV5ZWggJiBCb3llciBBaG1hZDpLb2hrbHllaCB2YSBCeWVyIEFobWFkOklSLTgKK0lyYW46S29yZGVzdGFuOktvcmRlc3RuOklSLTYKK0lyYW46TG9yZXN0YW46VU5LTk9XTjpJUi1MUlMKK0lyYW46TWFya2F6aTpVTktOT1dOOklSLU1LWgorSXJhbjpNYXphbmRhcmFuOlVOS05PV046SVItTVpECitJcmFuOlNlbW5hbjpVTktOT1dOOklSLVNFTQorSXJhbjpTaXN0YW4gYW5kIEJhbHVjaGVzdGFuOlVOS05PV046SVItU0JMCitJcmFuOlRlaHJhbjpVTktOT1dOOklSLVRIUgorSXJhbjpXZXN0IEF6YXJiYXllamFuOlVOS05PV046SVItV0FKCitJcmFuOlphbmphbjpVTktOT1dOOklSLVoKK0pvcmRhbjpBbW1hbjptbW46Sk8tQU0KK0pvcmRhbjpLYXJhazpBbCBLYXJhazpKTy1LQQorSm9yZGFuOk1hLWFuOk1hbjpKTy1NTgorSm9yZGFuOk1hZnJhcTpBbCBNYWZyYXE6Sk8tTUEKK0pvcmRhbjpTYWx0IChCYWxxYSk6QWwgQmFscTpKTy1CQQorSm9yZGFuOlRhZmlsYTpBIGFmbGFoOkpPLUFUCitKb3JkYW46WmFycWE6QXogWmFycTpKTy1BWgorS3V3YWl0Okt1d2FpdDpVTktOT1dOOktXLUsKK0xlYmFub246TGViYW5vbjpVTktOT1dOOkxCLUwKK09tYW46QSBEYWtobGl5YTpBZCBEYWtoaWxpeWFoOk9NLURBCitPbWFuOkEgU2hhcnFpeWE6QXNoIFNoYXJxeWFoOk9NLVNICitPbWFuOkFsIEJhdG5haDpBbCBCYWluYWg6T00tQkEKK09tYW46QWwgRGhhaGlyYTpVTktOT1dOOk9NLURIQQorT21hbjpBbCBXdXN0YTpVTktOT1dOOk9NLVdVCitPbWFuOkRob2ZhcjpVTktOT1dOOk9ILURIRgorT21hbjpNdXNjYXQ6TWFzcWE6T00tTUEKK1FhdGFyOlFhdGFyOlVOS05PV046UUEtUQorU3lyaWE6QWxlcHBvIChIYWxhYik6YWxhYjpTWS1ITAorU3lyaWE6QXMgU3V3YXlkYTpBcyBTdXdheWQ6U1ktU1UKK1N5cmlhOkRhcmE6RGFyOlNZLURSCitTeXJpYTpIYW1haDphbWg6U1ktSE0KK1N5cmlhOkhhc2FrYSAoQWwgSGFrc2EpOkFsIGFzYWthaDpTWS1IQQorU3lyaWE6SG9tcyAoSGltcyk6aW06U1ktSEkKK1N5cmlhOkt1bmVpdHJhIChFbCBRdW5heXRpcmFoOkFsIFF1bmF5aXJhaDpTWS1RVQorU3lyaWE6TGF0dGFraWEgKEFsIExhZGhpcWl5YWg6QWwgTGFkaGlxaXlhaDpTWS1MQQorU3lyaWE6VGFydHVzOmFyczpTWS1UQQorVW5pdGVkQXJhYkVtaXJhdGVzOjpOZXV0cmFsIFpvbmU6VU5LTk9XTjpBRS1ORVUKK1llbWVuOkZvcm1lciBOb3J0aCBZZW1lbjpVTktOT1dOOllFLU4KK1llbWVuOkZvcm1lciBTb3V0aCBZZW1lbjpVTktOT1dOOllFLVMKK01leGljbzpCYWphIENhbGlmb3JuaWEgTm9ydGU6QmFqYSBDYWxpZm9ybmlhOiBNWC1CQ04KK01leGljbzpRdWVyZXRhcm8gZGUgQXJ0ZWFnYTpRdWVyZXRhcm86TVgtUVVFCitNZXhpY286TWljaG9hY2FuIGRlIE9jYW1wbzpNaWNob2FjYW46TVgtTUlDCitNZXhpY286WXVjYXRhbjpZdWNhdG46TVgtWVVDCitNZXhpY286Q29haHVpbGEgRGUgWmFyYWdvemE6Q29oYXVpbGE6TVgtQ09BCitNZXhpY286U2FuIEx1aXMgUG90b3NpOlNhbiBMdWlzIFBvdG9zOk1YLVNMUAorTWV4aWNvOk51ZXZvIExlb246TnVldm8gTGVuOk1YLU5MRQorTWV4aWNvOlZlcmFjcnV6LUxsYXZlOlZlcmFjcnV6Ok1YLVZFUgorQVJHRU5USU5BOkJVRU5PUyBBSVJFUyBELkYuOkNhcGl0YWwgZmVkZXJhbDpBUi1DCitBUkdFTlRJTkE6Q09SRE9CQTpDcmRvYmE6QVItWAorQVJHRU5USU5BOkVOVFJFIFJJT1M6RW50cmUgUm9zOkFSLUUKK0FSR0VOVElOQTpSSU8gTkVHUk86Um8gTmVncm86QVItUgorQVJHRU5USU5BOlRVQ1VNQU46VHVjdW1uOkFSLVQKK0JPTElWSUE6QkVOSTpFbCBCZW5pOkJPLUIKK0JPTElWSUE6UE9UT1NJOlBvdG9zOkJPLVAKK0JSQVNJTDpDYXBhbmVtYTpVTktOT1dOOkJSLUNBUAorQlJBU0lMOk1BUkFOSEFPL1BJQVVJOlVOS05PV046QlItTVAKK0JSQVNJTDpQb3J0byBYYXZpZXI6VU5LTk9XTjpCUi1QUlgKK0NISUxFOkFJU0VOOkFpc2VuIGRlbCBHZW5lcmFsIENhcmxvcyBJYmV6IGRlbCBDYW1wbzpDTC1BSQorQ0hJTEU6QU5UQVJUSUNBIENISUxFTkE6VU5LTk9XTjpDTC1BTlQKK0NISUxFOkFSQVVDTzpVTktOT1dOOkNMLUFSQworQ0hJTEU6QVJJQ0E6VU5LTk9XTjpDTC1BUkkKK0NISUxFOkJJT0JJTzpiby1ibzpDTC1CSQorQ0hJTEU6Q0FDSEFQT0FMOlVOS05PV046Q0wtQ0hQCitDSElMRTpDQVBJVEFOIFBSQVQ6VU5LTk9XTjpDTC1DUFQKK0NISUxFOkNBUkRFTkFMIENBUk86VU5LTk9XTjpDTC1DQVIKK0NISUxFOkNBVVFVRU5FUzpVTktOT1dOOkNMLUNBVQorQ0hJTEU6Q0FVVElOOlVOS05PV046Q0wtQ1ROCitDSElMRTpDSEFDQUJVQ086VU5LTk9XTjpDTC1DQlUKK0NISUxFOkNIQU5BUkFMOlVOS05PV046Q0wtQ0hOCitDSElMRTpDSElMT0U6VU5LTk9XTjpDTC1DTEUKK0NISUxFOkNIT0FQQTpVTktOT1dOOkNMLUNQQQorQ0hJTEU6Q09JSEFJUVVFOlVOS05PV046Q0wtQ0hRCitDSElMRTpDT0xDSEFHVUE6VU5LTk9XTjpDTC1DSEcKK0NISUxFOkNPUElBUE86VU5LTk9XTjpDTC1DT1AKK0NISUxFOkNVUklDTzpVTktOT1dOOkNMLUNVUgorQ0hJTEU6RUwgTE9BOlVOS05PV046Q0wtRUwKK0NISUxFOkVMUVVJOlVOS05PV046Q0wtRUxRCitDSElMRTpHRU5FUkFMIENBUlJFUkE6VU5LTk9XTjpDTC1HQ1IKK0NISUxFOkhVQVNDTzpVTktOT1dOOkNMLUhVQQorQ0hJTEU6SVFVSVFVRTpVTktOT1dOOkNMLUlRSQorQ0hJTEU6TElNQVJJOlVOS05PV046Q0wtTElNCitDSElMRTpMSU5BUkVTOlVOS05PV046Q0wtTElOCitDSElMRTpMTEFOUVVJSFVFOlVOS05PV046Q0wtTExBCitDSElMRTpMT1MgQU5ERVM6VU5LTk9XTjpDTC1BTkQKK0NISUxFOk1BSVBPOlVOS05PV046Q0wtTUlQCitDSElMRTpNQUxMRUNPOlVOS05PV046Q0wtTUxMCitDSElMRTpNRUxJUElMTEE6VU5LTk9XTjpDTC1NSUwKK0NISUxFOk5VQkxFOlVOS05PV046Q0wtTlVCCitDSElMRTpPU09STk86VU5LTk9XTjpDTC1PU1IKK0NISUxFOlBBTEVOQTpVTktOT1dOOkNMLVBBTAorQ0hJTEU6UEFSSU5BQ09UQTpVTktOT1dOOkNMLVBBTgorQ0hJTEU6UEVUT1JDQTpVTktOT1dOOkNMLVBFVAorQ0hJTEU6UVVJTExPVEE6VU5LTk9XTjpDTC1RVUkKK0NISUxFOlNBTiBBTlRPTklPOlVOS05PV046Q0wtU0FUCitDSElMRTpTQU4gRkVMSVBFIERFIEFDT05DQUdVQTpVTktOT1dOOkNMLUFDTworQ0hJTEU6VEFMQUdBTlRFOlVOS05PV046Q0wtVEFMCitDSElMRTpUQUxDQTpVTktOT1dOOkNMLVRDQQorQ0hJTEU6VE9DT1BJTExBOlVOS05PV046Q0wtVE9DCitDSElMRTpVTFRJTUEgRVNQRVJBTlpBOlVOS05PV046Q0wtRVNQCitDSElMRTpWQUxESVZJQTpVTktOT1dOOkNMLVZESQorQ0hJTEU6VkFMUEFSQUlTTzpVTktOT1dOOkNMLVZBTAorQ0hJTEU6Q09OQ0VQQ0lPTjpVTktOT1dOOkNMLUNPTgorQ0hJTEU6Q09SRElMTEVSQTpVTktOT1dOOkNMLUNPUgorQ0hJTEU6U0FOVElBR086VU5LTk9XTjpDTC1TR08KK0NISUxFOlRJRVJSQSBERUwgRlVFR086VU5LTk9XTjpDTC1URgorQ09MT01CSUE6QXRsYW50aWNvOkF0bGFudGNvOkNPLUFUTAorQ09MT01CSUE6Qm9saXZhcjpCb2x2YXI6Q08tQk9MCitDT0xPTUJJQTpCb3lhY2E6Qm95YWM6Q08tQk9ZCitDT0xPTUJJQTpCdWVuYXZlbnR1cmE6VU5LTk9XTjpDTy1CVUUKK0NPTE9NQklBOkNhcXVldGE6Q2FxdWV0OkNPLUNBUQorQ09MT01CSUE6Q2hvY286Q2hvYzpDTy1DSE8KK0NPTE9NQklBOkNvcmRvYmE6Q3Jkb2JhOkNPLUNPUgorQ09MT01CSUE6R3VhamlyYTpMYSBHdWFqaXJhOkNPLUxBRworQ09MT01CSUE6R3VhbmlhOkd1YWluYTpDTy1HVUEKK0NPTE9NQklBOk5hcmlubzpOYXJpbzpDTy1OQVIKK0NPTE9NQklBOlF1aW5kaW86UXVpbmRvOkNPLVFVSQorQ09MT01CSUE6U2FuIEFuZHJlcyB5IFByb3ZpZGVuY2lhOlNhbiBBbmRyZXMsIFByb3ZpZGVuY2lhIHkgU2FudGEgQ2F0YWxpbmE6Q08tU0FQCitFQ1VBRE9SOkJPTElWQVI6Qm9sdmFyOkVDLUIKK0VDVUFET1I6Q0FOQVI6Q2FhcjpFQy1GCitFQ1VBRE9SOkxPUyBSSU9TOkxvcyBSb3M6RUMtUgorRUNVQURPUjpNQU5BQkk6TWFuYWI6RUMtTQorRUNVQURPUjpTVUNVTUJJT1M6U3VjdW1ib3M6RUMtVQorRUNVQURPUjpab25hIE5vIERlbGltdGRhOlVOS05PV046RUMtWk5ECitHVVlBTkE6QkFSSU1BL1dBSU5JOlVOS05PV046R1ktQkFXCitQQVJBR1VBWTpDQUFHVUFaVTpVTktOT1dOOlBZLUNBWgorVVJVR1VBWTpQQVlTQU5EVTpQYXlzYW5kOlVZLVBBCitVUlVHVUFZOlJJTyBORUdSTzpSbyBOZWdybzpVWS1STgorVVJVR1VBWTpUQUNVQVJFTUJPOlRhY3VhcmVtYjpVWS1UQQorVkVORVpVRUxBOkFOWk9BVEVHVUk6QW56b3RlZ3VpOlZFLUIKK1ZFTkVaVUVMQTpCT0xJVkFSOkJvbHZhcjpWRS1GCitWRU5FWlVFTEE6RkFMQ09OOkZhbGNuOlZFLUkKK1ZFTkVaVUVMQTpHVUFSSUNPOkd1cmljbzpWRS1KCitWRU5FWlVFTEE6VEFDSElSQTpUY2hpcmE6VkUtUworQmFuZ2xhZGVzaDpCYXJpc2FsIERpdjpCYXJpc2FsIHppbGE6QkQtMDYKK0JhbmdsYWRlc2g6Q2hpdHRhZ29uZyBEaXY6Q2hpdHRhbmdvbmcgemlsYTpCRC0wCitCYW5nbGFkZXNoOkRoYWthIERpdjpEaGFrYSB6aWxhOkJELTMKK0JhbmdsYWRlc2g6S2h1bG5hIERpdjpLaHVsbmEgemlsYTpCRC0yNworQmFuZ2xhZGVzaDpSYWpzaGFoaSBEaXY6UmFqc2hhbmkgemlsYTpCRC01NAorQnJ1bmVpOk11YXJhL1NlcmlhL1R1dG9uZzpUdXRvbmc6Qk4tVFUKK0JodXRhbjpDaGlyYW5nOlVOS05PV046QlQtQ05HCitCaHV0YW46Q2h1a2hhOkNoaHVraGE6QlQtMgorQmh1dGFuOkRhZ2E6VU5LTk9XTjpCVC1EQQorQmh1dGFuOkdheWxlZ3BodWcgKFNhcmJoYW5nKTpTYXJwYW5nOkJULTM2CitCaHV0YW46SGFhOkhhOkJULTMKK0JodXRhbjpMaHVudHNoaTpMaHVlbnRzZTpCVC00NAorQmh1dGFuOk1vbmdhcjpNb25nZ2FyOkJULTQyCitCaHV0YW46UGVtYSBHYXRzaGVsOlBlbWFnYXRzaGVsOkJULTQzCitCaHV0YW46U2FtY2hpOlNhbXRzZTpCVC00CitCaHV0YW46U2FtZHJ1cCBKb25na2hhcjpTYW1kcnVwIEpvbmdraGE6QlQtNDUKK0JodXRhbjpTaGVuZ2FuZzpaaGVtZ2FuZzpCVC0zNworQmh1dGFuOlRhc2hpZ2FuZzpUc2lyYW5nOkJULTM4CitCaHV0YW46VG9uZ3NhOlRyb25nc2E6QlQtMzIKK0JodXRhbjpXYW5nZGlwaG9kcmFuZzpXYW5nZHVlIFBob2RyYW5nOkJULTI0CitDYW1ib2RpYTpCYW50ZWF5IE1lYW5jaGV5OlVOS05PV046S0gtQkVBCitDYW1ib2RpYTpCYXR0YW1iYW5nOlVOS05PV046S0gtQlRHCitDYW1ib2RpYTpLYW1wb25nIENoYW06VU5LTk9XTjpLSC1LUEMKK0NhbWJvZGlhOkthbXBvbmcgU3BldTpVTktOT1dOOktILUtNUworQ2FtYm9kaWE6S2FtcG9uZyBUaG9tOlVOS05PV046S0gtS1RICitDYW1ib2RpYTpLYW5kYWw6VU5LTk9XTjpLSC1LQU4KK0NhbWJvZGlhOktvaCBLb25nOlVOS05PV046S0gtS09ICitDYW1ib2RpYTpLcmF0aWU6VU5LTk9XTjpLSC1LUkUKK0NhbWJvZGlhOk1vbmR1bCBLaXJpOlVOS05PV046S0gtTU9LCitDYW1ib2RpYTpQcmV5IFZlbmc6VU5LTk9XTjpLSC1QVkcKK0NhbWJvZGlhOlB1cnNhdDpVTktOT1dOOktILVBVUgorQ2FtYm9kaWE6UmF0YW5hIEtpcmk6VU5LTk9XTjpLSC1SQUsKK0NhbWJvZGlhOlNpZW0gUmVhcDpVTktOT1dOOktILVNFUgorQ2FtYm9kaWE6U3R1bmcgVHJlbmc6VU5LTk9XTjpLSC1TVFIKK0NhbWJvZGlhOlN2YXkgUmllbmc6VU5LTk9XTjpLSC1TVlkKK0NhbWJvZGlhOlRha2VvOlVOS05PV046S0gtVEtFCitDYW1ib2RpYTpUb25sZSBTYXA6VU5LTk9XTjpLSC1UT0wKK0NoaW5hOkhvbmdrb25nIElzbGFuZDpVTktOT1dOOkNOLUhLCitDaGluYTpKYW1tdSBhbmQgS2FzaG1pcjpVTktOT1dOOkNOLUpLCitDaGluYTpLb3dsb29uIGFuZCBOZXcgS293bG9vbjpVTktOT1dOOkNOLUtPVworQ2hpbmE6TWFyaW5lOlVOS05PV046Q04tTUFSCitDaGluYTpOZWkgTW9uZ29sIFppemhpcXU6TmVpIE1vbmdvbDpDTi03NQorQ2hpbmE6TmV3IFRlcnJpdG9yaWVzOlVOS05PV046Q04tTlQKK0NoaW5hOlhpbmppYW5nIFV5Z3VyOlhpbmppYW5nOkNOLTY1CitDaGluYTpYaXphbmcgWml6aGlxdSAoVGliZXQpOlhpemFuZzpDTi01NAorSW5kaWE6QW5kYW1hbiAmIE5pY29iYXI6VU5LTk9XTjpJTi1OSUMKK0luZG9uZXNpYTpELkkgWW9neWFrYXJ0YTpVTktOT1dOOklELVlPRworSW5kb25lc2lhOkRraSBKYWthcnRhOlVOS05PV046SUQtSkFLCitJbmRvbmVzaWE6SXJpYW4gSmF5YTpVTktOT1dOOklELUlKQQorSW5kb25lc2lhOlRpbW9yIFRpbXVyOlVOS05PV046SUQwLVRJTQorSmFwYW46Q2h1YnU6VU5LTk9XTjpKUC1DSEIKK0phcGFuOkNodWdva3U6VU5LTk9XTjpKUC1DSEcKK0phcGFuOkhva3VyaWt1OlVOS05PV046SlAtSFJJCitKYXBhbjpLYW50bzpVTktOT1dOOkpQLUtOVAorSmFwYW46S2lua2k6VU5LTk9XTjpKUC1LSU4KK0phcGFuOkt5dXNodTpVTktOT1dOOkpQLUtZVQorSmFwYW46Unl1a2l1LUlzbGFuZHM6VU5LTk9XTjpKUC1SWVUKK0phcGFuOlNoaWtva3U6VU5LTk9XTjpKUC1TS08KK0phcGFuOlRvaG9rdTpVTktOT1dOOkpQLVRPSAorSmFwYW46VG9rYWk6VU5LTk9XTjpKUC1UQUkKK0xhb3M6QXR0b3B1OkF0dGFwdTpMQS1BVAorTGFvczpCb2xpa2hhbXNhaTpCb2xpa2hhbXhhaTpMQS1CTAorTGFvczpDaGFtcGFzc2FjazpDaGFtcGFzYWs6TEEtQ0gKK0xhb3M6SG91YXBoYW5oOkhvdWFwaGFuOkxBLUhPCitMYW9zOktoYW1tb3VhbmU6S2hhbW1vdWFuOkxBLUtLCitMYW9zOkx1YW5nIFByYWJhbmc6TG91YW5ncGhhYmFuZzpMQS1MUAorTGFvczpOYW10aGE6TG91YW5nIE5hbXRoYTpMQS1MTQorTGFvczpPdWRvbXhheTpPdWRvbXhhaTpMQS1PVQorTGFvczpQaG9uZ3NhbHk6UGhvbmdzYWxpOkxBLVBICitMYW9zOlNhcmF2YW5lOlVOS05PV046TEEtU1IKK0xhb3M6U2F5YWJvdXJpOlhhaWduYWJvdWxpOkxBLVhBCitMYW9zOlNla29uZzpYRUtPTkc6TEEtWEUKK0xhb3M6VmllbnRpYW5lIChNdW5pYy4pOlZpZW50aWFuZTpMQS1WSQorTGFvczpWaWVudGlhbmUgMjpVTktOT1dOOkxBLVZJMgorTGFvczpYaWFuZ2tob3Vhbmc6WGlhbmdoaG9hbmc6TEEtWEkKK01hY2F1Ok1hY2F1OlVOS05PV046TU8tTQorTmVwYWw6RmFyIFdlc3Q6VU5LTk9XTjpOUC1GQVcKK05lcGFsOk1pZHdlc3Q6VU5LTk9XTjpOUC1NSUQKK05lcGFsOldlc3Q6VU5LTk9XTjpOUC1XCitOZXBhbDpDZW50cmFsOlVOS05PV046TlAtQworTmVwYWw6RWFzdDpVTktOT1dOOk5QLUUKK05vcnRoIEtvcmVhOkNoYW5nYW5nOlVOS05PV046S1AtQ0hHCitOb3J0aCBLb3JlYTpLYWVzb25nOlVOS05PV046S1AtS1NPCitOb3J0aCBLb3JlYTpLYW5nd29uOlVOS05PV046S1AtS0dXCitOb3J0aCBLb3JlYTpOYW1wbzpVTktOT1dOOktQLU5BUAorTm9ydGggS29yZWE6Tm9ydGggSGFtZ3lvbmc6VU5LTk9XTjpLUC1IR1kKK05vcnRoIEtvcmVhOk5vcnRoIEh3YW5naGFlOlVOS05PV046S1AtSFdBCitOb3J0aCBLb3JlYTpOb3J0aCBQeW9uZ2FuOlVOS05PV046S1AtTlBZCitOb3J0aCBLb3JlYTpQeW9uZ3lhbmc6VU5LTk9XTjpLUC1QWQorTm9ydGggS29yZWE6U291dGggSGFtZ3lvbmc6VU5LTk9XTjpLUC1TSE8KK05vcnRoIEtvcmVhOlNvdXRoIEh3YW5naGFlOlVOS05PV046S1AtU0hBCitOb3J0aCBLb3JlYTpTb3V0aCBQeW9uZ2FuOlVOS05PV046S1AtU1BZCitOb3J0aCBLb3JlYTpZYW5nZ2FuZzpVTktOT1dOOktQLVlHTgorUGhpbGlwcGluZXM6Q0FSOlVOS05PV046UEgtQ0FSCitQaGlsaXBwaW5lczpOQ1I6VU5LTk9XTjpQSC1OQ1IKK1BoaWxpcHBpbmVzOlJlZ2lvbiAxOlVOS05PV046UEgtMQorUGhpbGlwcGluZXM6UmVnaW9uIDEwOlVOS05PV046UEgtMTAKK1BoaWxpcHBpbmVzOlJlZ2lvbiAxMTpVTktOT1dOOlBILTExCitQaGlsaXBwaW5lczpSZWdpb24gMTI6VU5LTk9XTjpQSC0xMgorUGhpbGlwcGluZXM6UmVnaW9uIDI6VU5LTk9XTjpQSC0yCitQaGlsaXBwaW5lczpSZWdpb24gMzpVTktOT1dOOlBILTMKK1BoaWxpcHBpbmVzOlJlZ2lvbiA0OlVOS05PV046UEgtNAorUGhpbGlwcGluZXM6UmVnaW9uIDU6VU5LTk9XTjpQSC01CitQaGlsaXBwaW5lczpSZWdpb24gNjpVTktOT1dOOlBILTYKK1BoaWxpcHBpbmVzOlJlZ2lvbiA3OlVOS05PV046UEgtNworUGhpbGlwcGluZXM6UmVnaW9uIDg6VU5LTk9XTjpQSC04CitQaGlsaXBwaW5lczpSZWdpb24gOTpVTktOT1dOOlBILTkKK1NpbmdhcG9yZTpTaW5nYXBvcmU6VU5LTk9XTjpTRy1TCitTYXVkaSBBcmFiaWE6SVJRL1NBVSBORVVUUkFMIFpPTkU6VU5LTk9XTjpTQS1ORVUKK1NhdWRpIEFyYWJpYTpRdXJheSBZYXQ6VU5LTk9XTjpTQS1RQVkKK1NvdXRoIEtvcmVhOkNoZWp1LURvOkplanVkbzpLUi00OQorU291dGggS29yZWE6Q2hvbGxhYnVrLURvOkplb25yYWJ1Z2RvOktSLTQ1CitTb3V0aCBLb3JlYTpDaG9sbGFuYW0tRG86SmVvbnJhbmFtZG86S1ItNDYKK1NvdXRoIEtvcmVhOkNodW5nY2hvbmdidWstRG86Q2h1bmdjaGVvbmdidWdkbzpLUi00MworU291dGggS29yZWE6Q2h1bmdjaG9uZ25hbS1EbzpDaHVuZ2NoZW9uZ25hbWRvOktSLTQ0CitTb3V0aCBLb3JlYTpJbmNob246SW5jaGVvbiBHd2FuZ3lvZ3NpOktSLTI4CitTb3V0aCBLb3JlYTpLYW5nLVdvbi1EbzpHYW5nd2VvbmRvOktSLTQyCitTb3V0aCBLb3JlYTpLd2FuZ2p1Okd3YW5nanUgR3dhbmd5ZW9nc2k6S1ItMjkKK1NvdXRoIEtvcmVhOkt5b25nZ2ktRG86R3llb25nZ2lkbzpLUi00CitTb3V0aCBLb3JlYTpLeW9uZ3NhbmdidWstRG86R3llb25nc2FuZ2J1Z2RvOktSLTQ3CitTb3V0aCBLb3JlYTpLeW9uZ3NhbmduYW0tRG86R3llb25nc2FuZ25hbWRvOktSLTQ4CitTb3V0aCBLb3JlYTpQdXNhbjpCdXNhbiBHd2FuZ3llb2dzaTpLUi0yNgorU291dGggS29yZWE6U2VvdWw6U2VvdWwgVGV1Z2J5ZW9sc2k6S1ItMAorU291dGggS29yZWE6VGFlZ3U6RGFlZ3UgR3dhbmd5ZW9nc2k6S1ItMjcKK1NvdXRoIEtvcmVhOlRhZWpvbjpEYWVqb24gR3dhbmd5ZW9nc2k6S1ItMzAKK1RoYWlsYW5kOkJhbmdrb2s6S3J1bmcgVGhlcCBNYWhhIE5ha2hvbjpUSC0wCitUaGFpbGFuZDpOb3J0aGVhc3Rlcm46VU5LTk9XTjpUSC1ORQorVGhhaWxhbmQ6Q2VudHJhbDpVTktOT1dOOlRILUMKK1RoYWlsYW5kOk5vcnRoZXJuOlVOS05PV046VEgtTgorVGhhaWxhbmQ6U291dGhlcm46VU5LTk9XTjpUSC1TCitWaWV0bmFtOkJhYyBUaGFpOlVOS05PV046Vk4tQlRICitWaWV0bmFtOkhhIEJhYzpVTktOT1dOOlZOLUhCQworVmlldG5hbTpIYSBOb2k6SGEgTm9pOlZOLTY0CitWaWV0bmFtOkhhaSBIdW5nOkhhaSBEdW9uZzpWTi02CitWaWV0bmFtOkhhaSBQaG9uZzpIYWkgUGhvbmc6Vk4tNjIKK1ZpZXRuYW06SG8gQ2hpIE1pbmggQ2l0eTpIbyBDaGkgTWluaDpWTi02NiAJCitWaWV0bmFtOk1pbmggSGFpOlVOS05PV046Vk4tTUhJCitWaWV0bmFtOk5hbSBIYTpIYSBOYW06Vk4tNjMKK1ZpZXRuYW06UXVhbmcgTmFtLURhIE5hbmc6UXVhbmcgTmFtOlZOLTI3CitWaWV0bmFtOlNvbmcgQmU6VU5LTk9XTjpWTi1TQkUKK1ZpZXRuYW06VmluaCBQaHU6VmluaCBQaHVjOlZOLTcwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9JU09GSVgvVVNBX0ZJUFMudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvSVNPRklYL1VTQV9GSVBTLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTI2MTViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvSVNPRklYL1VTQV9GSVBTLnR4dApAQCAtMCwwICsxLDMyNzUgQEAKKyMgT2ZmaWNpYWwgZGVzY3JpcHRvcnMgZm9yIGNvdW50aWVzIGluIHRoZSBVU0EuCisjIFRoZXNlIGRlc2NyaXB0b3JzIHVzZSBGSVBTIGNvZGVzIChmaXZlIGRpZ2l0cykuCisjIExldmVsIDIgKGFkbWluIDIgPSBlLmcuLCBjb3VudHkpIworIyB1bmRlciBBZG1pbiBMZXZlbFsxXSBJRFswMl0gPSBBbGFza2EgCitVUy1BSy0wMjAxMzpBbGV1dGlhbnMgRWFzdCBCb3JvdWdoIAorVVMtQUstMDIwMTY6QWxldXRpYW5zIFdlc3QgCitVUy1BSy0wMjAyMDpBbmNob3JhZ2UgTXVuaWNpcGFsaXR5IAorVVMtQUstMDIwNTA6QmV0aGVsIAorVVMtQUstMDIwNjA6QnJpc3RvbCBCYXkgQm9yb3VnaCAKK1VTLUFLLTAyMDY4OkRlbmFsaSBCb3JvdWdoIAorVVMtQUstMDIwNzA6RGlsbGluZ2hhbSAKK1VTLUFLLTAyMDkwOkZhaXJiYW5rcyBOb3J0aCBTdGFyIEJvcm91Z2ggCitVUy1BSy0wMjEwMDpIYWluZXMgQm9yb3VnaCAKK1VTLUFLLTAyMTEwOkp1bmVhdSBCb3JvdWdoIAorVVMtQUstMDIxMjI6S2VuYWkgUGVuaW5zdWxhIEJvcm91Z2ggCitVUy1BSy0wMjEzMDpLZXRjaGlrYW4gR2F0ZXdheSBCb3JvdWdoIAorVVMtQUstMDIxNTA6S29kaWFrIElzbGFuZCBCb3JvdWdoIAorVVMtQUstMDIxNjQ6TGFrZSBhbmQgUGVuaW5zdWxhIEJvcm91Z2ggCitVUy1BSy0wMjE3MDpNYXRhbnVza2EtU3VzaXRuYSBCb3JvdWdoIAorVVMtQUstMDIxODA6Tm9tZSAKK1VTLUFLLTAyMTg1Ok5vcnRoIFNsb3BlIEJvcm91Z2ggCitVUy1BSy0wMjE4ODpOb3J0aHdlc3QgQXJjdGljIEJvcm91Z2ggCitVUy1BSy0wMjIwMTpQcmluY2Ugb2YgV2FsZXMtT3V0ZXIgS2V0Y2hpa2FuIAorVVMtQUstMDIyMjA6U2l0a2EgQm9yb3VnaCAKK1VTLUFLLTAyMjMyOlNrYWd3YXktSG9vbmFoLUFuZ29vbiAKK1VTLUFLLTAyMjQwOlNvdXRoZWFzdCBGYWlyYmFua3MgCitVUy1BSy0wMjI2MTpWYWxkZXotQ29yZG92YSAKK1VTLUFLLTAyMjcwOldhZGUgSGFtcHRvbiAKK1VTLUFLLTAyMjgwOldyYW5nZWxsLVBldGVyc2J1cmcgCitVUy1BSy0wMjI4MjpZYWt1dGF0IEJvcm91Z2gKK1VTLUFLLTAyMjkwOll1a29uLUtveXVrdWsgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEWzAxXTpBbGFiYW1hIAorVVMtQUwtMDEwMDE6QXV0YXVnYSBDb3VudHkgCitVUy1BTC0wMTAwMzpCYWxkd2luIENvdW50eSAKK1VTLUFMLTAxMDA1OkJhcmJvdXIgQ291bnR5IAorVVMtQUwtMDEwMDc6QmliYiBDb3VudHkgCitVUy1BTC0wMTAwOTpCbG91bnQgQ291bnR5IAorVVMtQUwtMDEwMTE6QnVsbG9jayBDb3VudHkgCitVUy1BTC0wMTAxMzpCdXRsZXIgQ291bnR5IAorVVMtQUwtMDEwMTU6Q2FsaG91biBDb3VudHkgCitVUy1BTC0wMTAxNzpDaGFtYmVycyBDb3VudHkgCitVUy1BTC0wMTAxOTpDaGVyb2tlZSBDb3VudHkgCitVUy1BTC0wMTAyMTpDaGlsdG9uIENvdW50eSAKK1VTLUFMLTAxMDIzOkNob2N0YXcgQ291bnR5IAorVVMtQUwtMDEwMjU6Q2xhcmtlIENvdW50eSAKK1VTLUFMLTAxMDI3OkNsYXkgQ291bnR5IAorVVMtQUwtMDEwMjk6Q2xlYnVybmUgQ291bnR5IAorVVMtQUwtMDEwMzE6Q29mZmVlIENvdW50eSAKK1VTLUFMLTAxMDMzOkNvbGJlcnQgQ291bnR5IAorVVMtQUwtMDEwMzU6Q29uZWN1aCBDb3VudHkgCitVUy1BTC0wMTAzNzpDb29zYSBDb3VudHkgCitVUy1BTC0wMTAzOTpDb3Zpbmd0b24gQ291bnR5IAorVVMtQUwtMDEwNDE6Q3JlbnNoYXcgQ291bnR5IAorVVMtQUwtMDEwNDM6Q3VsbG1hbiBDb3VudHkgCitVUy1BTC0wMTA0NTpEYWxlIENvdW50eSAKK1VTLUFMLTAxMDQ3OkRhbGxhcyBDb3VudHkgCitVUy1BTC0wMTA0OTpEZUthbGIgQ291bnR5IAorVVMtQUwtMDEwNTE6RWxtb3JlIENvdW50eSAKK1VTLUFMLTAxMDUzOkVzY2FtYmlhIENvdW50eSAKK1VTLUFMLTAxMDU1OkV0b3dhaCBDb3VudHkgCitVUy1BTC0wMTA1NzpGYXlldHRlIENvdW50eSAKK1VTLUFMLTAxMDU5OkZyYW5rbGluIENvdW50eSAKK1VTLUFMLTAxMDYxOkdlbmV2YSBDb3VudHkgCitVUy1BTC0wMTA2MzpHcmVlbmUgQ291bnR5IAorVVMtQUwtMDEwNjU6SGFsZSBDb3VudHkgCitVUy1BTC0wMTA2NzpIZW5yeSBDb3VudHkgCitVUy1BTC0wMTA2OTpIb3VzdG9uIENvdW50eSAKK1VTLUFMLTAxMDcxOkphY2tzb24gQ291bnR5IAorVVMtQUwtMDEwNzM6SmVmZmVyc29uIENvdW50eSAKK1VTLUFMLTAxMDc1OkxhbWFyIENvdW50eSAKK1VTLUFMLTAxMDc3OkxhdWRlcmRhbGUgQ291bnR5IAorVVMtQUwtMDEwNzk6TGF3cmVuY2UgQ291bnR5IAorVVMtQUwtMDEwODE6TGVlIENvdW50eSAKK1VTLUFMLTAxMDgzOkxpbWVzdG9uZSBDb3VudHkgCitVUy1BTC0wMTA4NTpMb3duZGVzIENvdW50eSAKK1VTLUFMLTAxMDg3Ok1hY29uIENvdW50eSAKK1VTLUFMLTAxMDg5Ok1hZGlzb24gQ291bnR5IAorVVMtQUwtMDEwOTE6TWFyZW5nbyBDb3VudHkgCitVUy1BTC0wMTA5MzpNYXJpb24gQ291bnR5IAorVVMtQUwtMDEwOTU6TWFyc2hhbGwgQ291bnR5IAorVVMtQUwtMDEwOTc6TW9iaWxlIENvdW50eSAKK1VTLUFMLTAxMDk5Ok1vbnJvZSBDb3VudHkgCitVUy1BTC0wMTEwMTpNb250Z29tZXJ5IENvdW50eSAKK1VTLUFMLTAxMTAzOk1vcmdhbiBDb3VudHkgCitVUy1BTC0wMTEwNTpQZXJyeSBDb3VudHkgCitVUy1BTC0wMTEwNzpQaWNrZW5zIENvdW50eSAKK1VTLUFMLTAxMTA5OlBpa2UgQ291bnR5IAorVVMtQUwtMDExMTE6UmFuZG9scGggQ291bnR5IAorVVMtQUwtMDExMTM6UnVzc2VsbCBDb3VudHkgCitVUy1BTC0wMTExNTpTdC4gQ2xhaXIgQ291bnR5IAorVVMtQUwtMDExMTc6U2hlbGJ5IENvdW50eSAKK1VTLUFMLTAxMTE5OlN1bXRlciBDb3VudHkgCitVUy1BTC0wMTEyMTpUYWxsYWRlZ2EgQ291bnR5IAorVVMtQUwtMDExMjM6VGFsbGFwb29zYSBDb3VudHkgCitVUy1BTC0wMTEyNTpUdXNjYWxvb3NhIENvdW50eSAKK1VTLUFMLTAxMTI3OldhbGtlciBDb3VudHkgCitVUy1BTC0wMTEyOTpXYXNoaW5ndG9uIENvdW50eSAKK1VTLUFMLTAxMTMxOldpbGNveCBDb3VudHkgCitVUy1BTC0wMTEzMzpXaW5zdG9uIENvdW50eSAKKyMgdW5kZXIgQWRtaW4gTGV2ZWxbMV0gSURbMDVdOkFya2Fuc2FzIAorVVMtQVItMDUwMDE6QXJrYW5zYXMgQ291bnR5IAorVVMtQVItMDUwMDM6QXNobGV5IENvdW50eSAKK1VTLUFSLTA1MDA1OkJheHRlciBDb3VudHkgCitVUy1BUi0wNTAwNzpCZW50b24gQ291bnR5IAorVVMtQVItMDUwMDk6Qm9vbmUgQ291bnR5IAorVVMtQVItMDUwMTE6QnJhZGxleSBDb3VudHkgCitVUy1BUi0wNTAxMzpDYWxob3VuIENvdW50eSAKK1VTLUFSLTA1MDE1OkNhcnJvbGwgQ291bnR5IAorVVMtQVItMDUwMTc6Q2hpY290IENvdW50eSAKK1VTLUFSLTA1MDE5OkNsYXJrIENvdW50eSAKK1VTLUFSLTA1MDIxOkNsYXkgQ291bnR5IAorVVMtQVItMDUwMjM6Q2xlYnVybmUgQ291bnR5IAorVVMtQVItMDUwMjU6Q2xldmVsYW5kIENvdW50eSAKK1VTLUFSLTA1MDI3OkNvbHVtYmlhIENvdW50eSAKK1VTLUFSLTA1MDI5OkNvbndheSBDb3VudHkgCitVUy1BUi0wNTAzMTpDcmFpZ2hlYWQgQ291bnR5IAorVVMtQVItMDUwMzM6Q3Jhd2ZvcmQgQ291bnR5IAorVVMtQVItMDUwMzU6Q3JpdHRlbmRlbiBDb3VudHkgCitVUy1BUi0wNTAzNzpDcm9zcyBDb3VudHkgCitVUy1BUi0wNTAzOTpEYWxsYXMgQ291bnR5IAorVVMtQVItMDUwNDE6RGVzaGEgQ291bnR5IAorVVMtQVItMDUwNDM6RHJldyBDb3VudHkgCitVUy1BUi0wNTA0NTpGYXVsa25lciBDb3VudHkgCitVUy1BUi0wNTA0NzpGcmFua2xpbiBDb3VudHkgCitVUy1BUi0wNTA0OTpGdWx0b24gQ291bnR5IAorVVMtQVItMDUwNTE6R2FybGFuZCBDb3VudHkgCitVUy1BUi0wNTA1MzpHcmFudCBDb3VudHkgCitVUy1BUi0wNTA1NTpHcmVlbmUgQ291bnR5IAorVVMtQVItMDUwNTc6SGVtcHN0ZWFkIENvdW50eSAKK1VTLUFSLTA1MDU5OkhvdCBTcHJpbmcgQ291bnR5IAorVVMtQVItMDUwNjE6SG93YXJkIENvdW50eSAKK1VTLUFSLTA1MDYzOkluZGVwZW5kZW5jZSBDb3VudHkgCitVUy1BUi0wNTA2NTpJemFyZCBDb3VudHkgCitVUy1BUi0wNTA2NzpKYWNrc29uIENvdW50eSAKK1VTLUFSLTA1MDY5OkplZmZlcnNvbiBDb3VudHkgCitVUy1BUi0wNTA3MTpKb2huc29uIENvdW50eSAKK1VTLUFSLTA1MDczOkxhZmF5ZXR0ZSBDb3VudHkgCitVUy1BUi0wNTA3NTpMYXdyZW5jZSBDb3VudHkgCitVUy1BUi0wNTA3NzpMZWUgQ291bnR5IAorVVMtQVItMDUwNzk6TGluY29sbiBDb3VudHkgCitVUy1BUi0wNTA4MTpMaXR0bGUgUml2ZXIgQ291bnR5IAorVVMtQVItMDUwODM6TG9nYW4gQ291bnR5IAorVVMtQVItMDUwODU6TG9ub2tlIENvdW50eSAKK1VTLUFSLTA1MDg3Ok1hZGlzb24gQ291bnR5IAorVVMtQVItMDUwODk6TWFyaW9uIENvdW50eSAKK1VTLUFSLTA1MDkxOk1pbGxlciBDb3VudHkgCitVUy1BUi0wNTA5MzpNaXNzaXNzaXBwaSBDb3VudHkgCitVUy1BUi0wNTA5NTpNb25yb2UgQ291bnR5IAorVVMtQVItMDUwOTc6TW9udGdvbWVyeSBDb3VudHkgCitVUy1BUi0wNTA5OTpOZXZhZGEgQ291bnR5IAorVVMtQVItMDUxMDE6TmV3dG9uIENvdW50eSAKK1VTLUFSLTA1MTAzOk91YWNoaXRhIENvdW50eSAKK1VTLUFSLTA1MTA1OlBlcnJ5IENvdW50eSAKK1VTLUFSLTA1MTA3OlBoaWxsaXBzIENvdW50eSAKK1VTLUFSLTA1MTA5OlBpa2UgQ291bnR5IAorVVMtQVItMDUxMTE6UG9pbnNldHQgQ291bnR5IAorVVMtQVItMDUxMTM6UG9sayBDb3VudHkgCitVUy1BUi0wNTExNTpQb3BlIENvdW50eSAKK1VTLUFSLTA1MTE3OlByYWlyaWUgQ291bnR5IAorVVMtQVItMDUxMTk6UHVsYXNraSBDb3VudHkgCitVUy1BUi0wNTEyMTpSYW5kb2xwaCBDb3VudHkgCitVUy1BUi0wNTEyMzpTdC4gRnJhbmNpcyBDb3VudHkgCitVUy1BUi0wNTEyNTpTYWxpbmUgQ291bnR5IAorVVMtQVItMDUxMjc6U2NvdHQgQ291bnR5IAorVVMtQVItMDUxMjk6U2VhcmN5IENvdW50eSAKK1VTLUFSLTA1MTMxOlNlYmFzdGlhbiBDb3VudHkgCitVUy1BUi0wNTEzMzpTZXZpZXIgQ291bnR5IAorVVMtQVItMDUxMzU6U2hhcnAgQ291bnR5IAorVVMtQVItMDUxMzc6U3RvbmUgQ291bnR5IAorVVMtQVItMDUxMzk6VW5pb24gQ291bnR5IAorVVMtQVItMDUxNDE6VmFuIEJ1cmVuIENvdW50eSAKK1VTLUFSLTA1MTQzOldhc2hpbmd0b24gQ291bnR5IAorVVMtQVItMDUxNDU6V2hpdGUgQ291bnR5IAorVVMtQVItMDUxNDc6V29vZHJ1ZmYgQ291bnR5IAorVVMtQVItMDUxNDk6WWVsbCBDb3VudHkgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEWzA0XTpBcml6b25hIAorVVMtQVotMDQwMDE6QXBhY2hlIENvdW50eSAKK1VTLUFaLTA0MDAzOkNvY2hpc2UgQ291bnR5IAorVVMtQVotMDQwMDU6Q29jb25pbm8gQ291bnR5IAorVVMtQVotMDQwMDc6R2lsYSBDb3VudHkgCitVUy1BWi0wNDAwOTpHcmFoYW0gQ291bnR5IAorVVMtQVotMDQwMTE6R3JlZW5sZWUgQ291bnR5IAorVVMtQVotMDQwMTI6TGEgUGF6IENvdW50eSAKK1VTLUFaLTA0MDEzOk1hcmljb3BhIENvdW50eSAKK1VTLUFaLTA0MDE1Ok1vaGF2ZSBDb3VudHkgCitVUy1BWi0wNDAxNzpOYXZham8gQ291bnR5IAorVVMtQVotMDQwMTk6UGltYSBDb3VudHkgCitVUy1BWi0wNDAyMTpQaW5hbCBDb3VudHkgCitVUy1BWi0wNDAyMzpTYW50YSBDcnV6IENvdW50eSAKK1VTLUFaLTA0MDI1OllhdmFwYWkgQ291bnR5IAorVVMtQVotMDQwMjc6WXVtYSBDb3VudHkgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEWzA2XTpDYWxpZm9ybmlhIAorVVMtQ0EtMDYwMDE6QWxhbWVkYSBDb3VudHkgCitVUy1DQS0wNjAwMzpBbHBpbmUgQ291bnR5IAorVVMtQ0EtMDYwMDU6QW1hZG9yIENvdW50eSAKK1VTLUNBLTA2MDA3OkJ1dHRlIENvdW50eSAKK1VTLUNBLTA2MDA5OkNhbGF2ZXJhcyBDb3VudHkgCitVUy1DQS0wNjAxMTpDb2x1c2EgQ291bnR5IAorVVMtQ0EtMDYwMTM6Q29udHJhIENvc3RhIENvdW50eSAKK1VTLUNBLTA2MDE1OkRlbCBOb3J0ZSBDb3VudHkgCitVUy1DQS0wNjAxNzpFbCBEb3JhZG8gQ291bnR5IAorVVMtQ0EtMDYwMTk6RnJlc25vIENvdW50eSAKK1VTLUNBLTA2MDIxOkdsZW5uIENvdW50eSAKK1VTLUNBLTA2MDIzOkh1bWJvbGR0IENvdW50eSAKK1VTLUNBLTA2MDI1OkltcGVyaWFsIENvdW50eSAKK1VTLUNBLTA2MDI3OklueW8gQ291bnR5IAorVVMtQ0EtMDYwMjk6S2VybiBDb3VudHkgCitVUy1DQS0wNjAzMTpLaW5ncyBDb3VudHkgCitVUy1DQS0wNjAzMzpMYWtlIENvdW50eSAKK1VTLUNBLTA2MDM1Okxhc3NlbiBDb3VudHkgCitVUy1DQS0wNjAzNzpMb3MgQW5nZWxlcyBDb3VudHkgCitVUy1DQS0wNjAzOTpNYWRlcmEgQ291bnR5IAorVVMtQ0EtMDYwNDE6TWFyaW4gQ291bnR5IAorVVMtQ0EtMDYwNDM6TWFyaXBvc2EgQ291bnR5IAorVVMtQ0EtMDYwNDU6TWVuZG9jaW5vIENvdW50eSAKK1VTLUNBLTA2MDQ3Ok1lcmNlZCBDb3VudHkgCitVUy1DQS0wNjA0OTpNb2RvYyBDb3VudHkgCitVUy1DQS0wNjA1MTpNb25vIENvdW50eSAKK1VTLUNBLTA2MDUzOk1vbnRlcmV5IENvdW50eSAKK1VTLUNBLTA2MDU1Ok5hcGEgQ291bnR5IAorVVMtQ0EtMDYwNTc6TmV2YWRhIENvdW50eSAKK1VTLUNBLTA2MDU5Ok9yYW5nZSBDb3VudHkgCitVUy1DQS0wNjA2MTpQbGFjZXIgQ291bnR5IAorVVMtQ0EtMDYwNjM6UGx1bWFzIENvdW50eSAKK1VTLUNBLTA2MDY1OlJpdmVyc2lkZSBDb3VudHkgCitVUy1DQS0wNjA2NzpTYWNyYW1lbnRvIENvdW50eSAKK1VTLUNBLTA2MDY5OlNhbiBCZW5pdG8gQ291bnR5IAorVVMtQ0EtMDYwNzE6U2FuIEJlcm5hcmRpbm8gQ291bnR5IAorVVMtQ0EtMDYwNzM6U2FuIERpZWdvIENvdW50eSAKK1VTLUNBLTA2MDc1OlNhbiBGcmFuY2lzY28gQ291bnR5IAorVVMtQ0EtMDYwNzc6U2FuIEpvYXF1aW4gQ291bnR5IAorVVMtQ0EtMDYwNzk6U2FuIEx1aXMgT2Jpc3BvIENvdW50eSAKK1VTLUNBLTA2MDgxOlNhbiBNYXRlbyBDb3VudHkgCitVUy1DQS0wNjA4MzpTYW50YSBCYXJiYXJhIENvdW50eSAKK1VTLUNBLTA2MDg1OlNhbnRhIENsYXJhIENvdW50eSAKK1VTLUNBLTA2MDg3OlNhbnRhIENydXogQ291bnR5IAorVVMtQ0EtMDYwODk6U2hhc3RhIENvdW50eSAKK1VTLUNBLTA2MDkxOlNpZXJyYSBDb3VudHkgCitVUy1DQS0wNjA5MzpTaXNraXlvdSBDb3VudHkgCitVUy1DQS0wNjA5NTpTb2xhbm8gQ291bnR5IAorVVMtQ0EtMDYwOTc6U29ub21hIENvdW50eSAKK1VTLUNBLTA2MDk5OlN0YW5pc2xhdXMgQ291bnR5IAorVVMtQ0EtMDYxMDE6U3V0dGVyIENvdW50eSAKK1VTLUNBLTA2MTAzOlRlaGFtYSBDb3VudHkgCitVUy1DQS0wNjEwNTpUcmluaXR5IENvdW50eSAKK1VTLUNBLTA2MTA3OlR1bGFyZSBDb3VudHkgCitVUy1DQS0wNjEwOTpUdW9sdW1uZSBDb3VudHkgCitVUy1DQS0wNjExMTpWZW50dXJhIENvdW50eSAKK1VTLUNBLTA2MTEzOllvbG8gQ291bnR5IAorVVMtQ0EtMDYxMTU6WXViYSBDb3VudHkgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEWzA4XTpDb2xvcmFkbyAKK1VTLUNPLTA4MDAxOkFkYW1zIENvdW50eSAKK1VTLUNPLTA4MDAzOkFsYW1vc2EgQ291bnR5IAorVVMtQ08tMDgwMDU6QXJhcGFob2UgQ291bnR5IAorVVMtQ08tMDgwMDc6QXJjaHVsZXRhIENvdW50eSAKK1VTLUNPLTA4MDA5OkJhY2EgQ291bnR5IAorVVMtQ08tMDgwMTE6QmVudCBDb3VudHkgCitVUy1DTy0wODAxMzpCb3VsZGVyIENvdW50eSAKK1VTLUNPLTA4MDE1OkNoYWZmZWUgQ291bnR5IAorVVMtQ08tMDgwMTc6Q2hleWVubmUgQ291bnR5IAorVVMtQ08tMDgwMTk6Q2xlYXIgQ3JlZWsgQ291bnR5IAorVVMtQ08tMDgwMjE6Q29uZWpvcyBDb3VudHkgCitVUy1DTy0wODAyMzpDb3N0aWxsYSBDb3VudHkgCitVUy1DTy0wODAyNTpDcm93bGV5IENvdW50eSAKK1VTLUNPLTA4MDI3OkN1c3RlciBDb3VudHkgCitVUy1DTy0wODAyOTpEZWx0YSBDb3VudHkgCitVUy1DTy0wODAzMTpEZW52ZXIgQ291bnR5IAorVVMtQ08tMDgwMzM6RG9sb3JlcyBDb3VudHkgCitVUy1DTy0wODAzNTpEb3VnbGFzIENvdW50eSAKK1VTLUNPLTA4MDM3OkVhZ2xlIENvdW50eSAKK1VTLUNPLTA4MDM5OkVsYmVydCBDb3VudHkgCitVUy1DTy0wODA0MTpFbCBQYXNvIENvdW50eSAKK1VTLUNPLTA4MDQzOkZyZW1vbnQgQ291bnR5IAorVVMtQ08tMDgwNDU6R2FyZmllbGQgQ291bnR5IAorVVMtQ08tMDgwNDc6R2lscGluIENvdW50eSAKK1VTLUNPLTA4MDQ5OkdyYW5kIENvdW50eSAKK1VTLUNPLTA4MDUxOkd1bm5pc29uIENvdW50eSAKK1VTLUNPLTA4MDUzOkhpbnNkYWxlIENvdW50eSAKK1VTLUNPLTA4MDU1Okh1ZXJmYW5vIENvdW50eSAKK1VTLUNPLTA4MDU3OkphY2tzb24gQ291bnR5IAorVVMtQ08tMDgwNTk6SmVmZmVyc29uIENvdW50eSAKK1VTLUNPLTA4MDYxOktpb3dhIENvdW50eSAKK1VTLUNPLTA4MDYzOktpdCBDYXJzb24gQ291bnR5IAorVVMtQ08tMDgwNjU6TGFrZSBDb3VudHkgCitVUy1DTy0wODA2NzpMYSBQbGF0YSBDb3VudHkgCitVUy1DTy0wODA2OTpMYXJpbWVyIENvdW50eSAKK1VTLUNPLTA4MDcxOkxhcyBBbmltYXMgQ291bnR5IAorVVMtQ08tMDgwNzM6TGluY29sbiBDb3VudHkgCitVUy1DTy0wODA3NTpMb2dhbiBDb3VudHkgCitVUy1DTy0wODA3NzpNZXNhIENvdW50eSAKK1VTLUNPLTA4MDc5Ok1pbmVyYWwgQ291bnR5IAorVVMtQ08tMDgwODE6TW9mZmF0IENvdW50eSAKK1VTLUNPLTA4MDgzOk1vbnRlenVtYSBDb3VudHkgCitVUy1DTy0wODA4NTpNb250cm9zZSBDb3VudHkgCitVUy1DTy0wODA4NzpNb3JnYW4gQ291bnR5IAorVVMtQ08tMDgwODk6T3Rlcm8gQ291bnR5IAorVVMtQ08tMDgwOTE6T3VyYXkgQ291bnR5IAorVVMtQ08tMDgwOTM6UGFyayBDb3VudHkgCitVUy1DTy0wODA5NTpQaGlsbGlwcyBDb3VudHkgCitVUy1DTy0wODA5NzpQaXRraW4gQ291bnR5IAorVVMtQ08tMDgwOTk6UHJvd2VycyBDb3VudHkgCitVUy1DTy0wODEwMTpQdWVibG8gQ291bnR5IAorVVMtQ08tMDgxMDM6UmlvIEJsYW5jbyBDb3VudHkgCitVUy1DTy0wODEwNTpSaW8gR3JhbmRlIENvdW50eSAKK1VTLUNPLTA4MTA3OlJvdXR0IENvdW50eSAKK1VTLUNPLTA4MTA5OlNhZ3VhY2hlIENvdW50eSAKK1VTLUNPLTA4MTExOlNhbiBKdWFuIENvdW50eSAKK1VTLUNPLTA4MTEzOlNhbiBNaWd1ZWwgQ291bnR5IAorVVMtQ08tMDgxMTU6U2VkZ3dpY2sgQ291bnR5IAorVVMtQ08tMDgxMTc6U3VtbWl0IENvdW50eSAKK1VTLUNPLTA4MTE5OlRlbGxlciBDb3VudHkgCitVUy1DTy0wODEyMTpXYXNoaW5ndG9uIENvdW50eSAKK1VTLUNPLTA4MTIzOldlbGQgQ291bnR5IAorVVMtQ08tMDgxMjU6WXVtYSBDb3VudHkgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEWzA5XTpDb25uZWN0aWN1dCAKK1VTLUNULTA5MDAxOkZhaXJmaWVsZCBDb3VudHkgCitVUy1DVC0wOTAwMzpIYXJ0Zm9yZCBDb3VudHkgCitVUy1DVC0wOTAwNTpMaXRjaGZpZWxkIENvdW50eSAKK1VTLUNULTA5MDA3Ok1pZGRsZXNleCBDb3VudHkgCitVUy1DVC0wOTAwOTpOZXcgSGF2ZW4gQ291bnR5IAorVVMtQ1QtMDkwMTE6TmV3IExvbmRvbiBDb3VudHkgCitVUy1DVC0wOTAxMzpUb2xsYW5kIENvdW50eSAKK1VTLUNULTA5MDE1OldpbmRoYW0gQ291bnR5IAorIyB1bmRlciBBZG1pbiBMZXZlbFsxXSBJRFsxMV06RGlzdHJpY3Qgb2YgQ29sdW1iaWEgCitVUy1EQy0xMTAwMTpEaXN0cmljdCBvZiBDb2x1bWJpYSAKKyMgdW5kZXIgQWRtaW4gTGV2ZWxbMV0gSURbMTBdOkRlbGF3YXJlIAorVVMtREUtMTAwMDE6S2VudCBDb3VudHkgCitVUy1ERS0xMDAwMzpOZXcgQ2FzdGxlIENvdW50eSAKK1VTLURFLTEwMDA1OlN1c3NleCBDb3VudHkgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEWzEyXTpGbG9yaWRhIAorVVMtRkwtMTIwMDE6QWxhY2h1YSBDb3VudHkgCitVUy1GTC0xMjAwMzpCYWtlciBDb3VudHkgCitVUy1GTC0xMjAwNTpCYXkgQ291bnR5IAorVVMtRkwtMTIwMDc6QnJhZGZvcmQgQ291bnR5IAorVVMtRkwtMTIwMDk6QnJldmFyZCBDb3VudHkgCitVUy1GTC0xMjAxMTpCcm93YXJkIENvdW50eSAKK1VTLUZMLTEyMDEzOkNhbGhvdW4gQ291bnR5IAorVVMtRkwtMTIwMTU6Q2hhcmxvdHRlIENvdW50eSAKK1VTLUZMLTEyMDE3OkNpdHJ1cyBDb3VudHkgCitVUy1GTC0xMjAxOTpDbGF5IENvdW50eSAKK1VTLUZMLTEyMDIxOkNvbGxpZXIgQ291bnR5IAorVVMtRkwtMTIwMjM6Q29sdW1iaWEgQ291bnR5IAorVVMtRkwtMTIwMjc6RGVTb3RvIENvdW50eSAKK1VTLUZMLTEyMDI5OkRpeGllIENvdW50eSAKK1VTLUZMLTEyMDMxOkR1dmFsIENvdW50eSAKK1VTLUZMLTEyMDMzOkVzY2FtYmlhIENvdW50eSAKK1VTLUZMLTEyMDM1OkZsYWdsZXIgQ291bnR5IAorVVMtRkwtMTIwMzc6RnJhbmtsaW4gQ291bnR5IAorVVMtRkwtMTIwMzk6R2Fkc2RlbiBDb3VudHkgCitVUy1GTC0xMjA0MTpHaWxjaHJpc3QgQ291bnR5IAorVVMtRkwtMTIwNDM6R2xhZGVzIENvdW50eSAKK1VTLUZMLTEyMDQ1Okd1bGYgQ291bnR5IAorVVMtRkwtMTIwNDc6SGFtaWx0b24gQ291bnR5IAorVVMtRkwtMTIwNDk6SGFyZGVlIENvdW50eSAKK1VTLUZMLTEyMDUxOkhlbmRyeSBDb3VudHkgCitVUy1GTC0xMjA1MzpIZXJuYW5kbyBDb3VudHkgCitVUy1GTC0xMjA1NTpIaWdobGFuZHMgQ291bnR5IAorVVMtRkwtMTIwNTc6SGlsbHNCb3JvdWdoIENvdW50eQorVVMtRkwtMTIwNTk6SG9sbWVzIENvdW50eSAKK1VTLUZMLTEyMDYxOkluZGlhbiBSaXZlciBDb3VudHkgCitVUy1GTC0xMjA2MzpKYWNrc29uIENvdW50eSAKK1VTLUZMLTEyMDY1OkplZmZlcnNvbiBDb3VudHkgCitVUy1GTC0xMjA2NzpMYWZheWV0dGUgQ291bnR5IAorVVMtRkwtMTIwNjk6TGFrZSBDb3VudHkgCitVUy1GTC0xMjA3MTpMZWUgQ291bnR5IAorVVMtRkwtMTIwNzM6TGVvbiBDb3VudHkgCitVUy1GTC0xMjA3NTpMZXZ5IENvdW50eSAKK1VTLUZMLTEyMDc3OkxpYmVydHkgQ291bnR5IAorVVMtRkwtMTIwNzk6TWFkaXNvbiBDb3VudHkgCitVUy1GTC0xMjA4MTpNYW5hdGVlIENvdW50eSAKK1VTLUZMLTEyMDgzOk1hcmlvbiBDb3VudHkgCitVUy1GTC0xMjA4NTpNYXJ0aW4gQ291bnR5IAorVVMtRkwtMTIwODY6TWlhbWktRGFkZSBDb3VudHkgCitVUy1GTC0xMjA4NzpNb25yb2UgQ291bnR5IAorVVMtRkwtMTIwODk6TmFzc2F1IENvdW50eSAKK1VTLUZMLTEyMDkxOk9rYWxvb3NhIENvdW50eSAKK1VTLUZMLTEyMDkzOk9rZWVjaG9iZWUgQ291bnR5IAorVVMtRkwtMTIwOTU6T3JhbmdlIENvdW50eSAKK1VTLUZMLTEyMDk3Ok9zY2VvbGEgQ291bnR5IAorVVMtRkwtMTIwOTk6UGFsbSBCZWFjaCBDb3VudHkgCitVUy1GTC0xMjEwMTpQYXNjbyBDb3VudHkgCitVUy1GTC0xMjEwMzpQaW5lbGxhcyBDb3VudHkgCitVUy1GTC0xMjEwNTpQb2xrIENvdW50eSAKK1VTLUZMLTEyMTA3OlB1dG5hbSBDb3VudHkgCitVUy1GTC0xMjEwOTpTdC4gSm9obnMgQ291bnR5IAorVVMtRkwtMTIxMTE6U3QuIEx1Y2llIENvdW50eSAKK1VTLUZMLTEyMTEzOlNhbnRhIFJvc2EgQ291bnR5IAorVVMtRkwtMTIxMTU6U2FyYXNvdGEgQ291bnR5IAorVVMtRkwtMTIxMTc6U2VtaW5vbGUgQ291bnR5IAorVVMtRkwtMTIxMTk6U3VtdGVyIENvdW50eSAKK1VTLUZMLTEyMTIxOlN1d2FubmVlIENvdW50eSAKK1VTLUZMLTEyMTIzOlRheWxvciBDb3VudHkgCitVUy1GTC0xMjEyNTpVbmlvbiBDb3VudHkgCitVUy1GTC0xMjEyNzpWb2x1c2lhIENvdW50eSAKK1VTLUZMLTEyMTI5Oldha3VsbGEgQ291bnR5IAorVVMtRkwtMTIxMzE6V2FsdG9uIENvdW50eSAKK1VTLUZMLTEyMTMzOldhc2hpbmd0b24gQ291bnR5IAorIyB1bmRlciBBZG1pbiBMZXZlbFsxXSBJRFsxM106R2VvcmdpYSAKK1VTLUdBLTEzMDAxOkFwcGxpbmcgQ291bnR5IAorVVMtR0EtMTMwMDM6QXRraW5zb24gQ291bnR5IAorVVMtR0EtMTMwMDU6QmFjb24gQ291bnR5IAorVVMtR0EtMTMwMDc6QmFrZXIgQ291bnR5IAorVVMtR0EtMTMwMDk6QmFsZHdpbiBDb3VudHkgCitVUy1HQS0xMzAxMTpCYW5rcyBDb3VudHkgCitVUy1HQS0xMzAxMzpCYXJyb3cgQ291bnR5IAorVVMtR0EtMTMwMTU6QmFydG93IENvdW50eSAKK1VTLUdBLTEzMDE3OkJlbiBIaWxsIENvdW50eSAKK1VTLUdBLTEzMDE5OkJlcnJpZW4gQ291bnR5IAorVVMtR0EtMTMwMjE6QmliYiBDb3VudHkgCitVUy1HQS0xMzAyMzpCbGVja2xleSBDb3VudHkgCitVUy1HQS0xMzAyNTpCcmFudGxleSBDb3VudHkgCitVUy1HQS0xMzAyNzpCcm9va3MgQ291bnR5IAorVVMtR0EtMTMwMjk6QnJ5YW4gQ291bnR5IAorVVMtR0EtMTMwMzE6QnVsbG9jaCBDb3VudHkgCitVUy1HQS0xMzAzMzpCdXJrZSBDb3VudHkgCitVUy1HQS0xMzAzNTpCdXR0cyBDb3VudHkgCitVUy1HQS0xMzAzNzpDYWxob3VuIENvdW50eSAKK1VTLUdBLTEzMDM5OkNhbWRlbiBDb3VudHkgCitVUy1HQS0xMzA0MzpDYW5kbGVyIENvdW50eSAKK1VTLUdBLTEzMDQ1OkNhcnJvbGwgQ291bnR5IAorVVMtR0EtMTMwNDc6Q2F0b29zYSBDb3VudHkgCitVUy1HQS0xMzA0OTpDaGFybHRvbiBDb3VudHkgCitVUy1HQS0xMzA1MTpDaGF0aGFtIENvdW50eSAKK1VTLUdBLTEzMDUzOkNoYXR0YWhvb2NoZWUgQ291bnR5IAorVVMtR0EtMTMwNTU6Q2hhdHRvb2dhIENvdW50eSAKK1VTLUdBLTEzMDU3OkNoZXJva2VlIENvdW50eSAKK1VTLUdBLTEzMDU5OkNsYXJrZSBDb3VudHkgCitVUy1HQS0xMzA2MTpDbGF5IENvdW50eSAKK1VTLUdBLTEzMDYzOkNsYXl0b24gQ291bnR5IAorVVMtR0EtMTMwNjU6Q2xpbmNoIENvdW50eSAKK1VTLUdBLTEzMDY3OkNvYmIgQ291bnR5IAorVVMtR0EtMTMwNjk6Q29mZmVlIENvdW50eSAKK1VTLUdBLTEzMDcxOkNvbHF1aXR0IENvdW50eSAKK1VTLUdBLTEzMDczOkNvbHVtYmlhIENvdW50eSAKK1VTLUdBLTEzMDc1OkNvb2sgQ291bnR5IAorVVMtR0EtMTMwNzc6Q293ZXRhIENvdW50eSAKK1VTLUdBLTEzMDc5OkNyYXdmb3JkIENvdW50eSAKK1VTLUdBLTEzMDgxOkNyaXNwIENvdW50eSAKK1VTLUdBLTEzMDgzOkRhZGUgQ291bnR5IAorVVMtR0EtMTMwODU6RGF3c29uIENvdW50eSAKK1VTLUdBLTEzMDg3OkRlY2F0dXIgQ291bnR5IAorVVMtR0EtMTMwODk6RGVLYWxiIENvdW50eSAKK1VTLUdBLTEzMDkxOkRvZGdlIENvdW50eSAKK1VTLUdBLTEzMDkzOkRvb2x5IENvdW50eSAKK1VTLUdBLTEzMDk1OkRvdWdoZXJ0eSBDb3VudHkgCitVUy1HQS0xMzA5NzpEb3VnbGFzIENvdW50eSAKK1VTLUdBLTEzMDk5OkVhcmx5IENvdW50eSAKK1VTLUdBLTEzMTAxOkVjaG9scyBDb3VudHkgCitVUy1HQS0xMzEwMzpFZmZpbmdoYW0gQ291bnR5IAorVVMtR0EtMTMxMDU6RWxiZXJ0IENvdW50eSAKK1VTLUdBLTEzMTA3OkVtYW51ZWwgQ291bnR5IAorVVMtR0EtMTMxMDk6RXZhbnMgQ291bnR5IAorVVMtR0EtMTMxMTE6RmFubmluIENvdW50eSAKK1VTLUdBLTEzMTEzOkZheWV0dGUgQ291bnR5IAorVVMtR0EtMTMxMTU6RmxveWQgQ291bnR5IAorVVMtR0EtMTMxMTc6Rm9yc3l0aCBDb3VudHkgCitVUy1HQS0xMzExOTpGcmFua2xpbiBDb3VudHkgCitVUy1HQS0xMzEyMTpGdWx0b24gQ291bnR5IAorVVMtR0EtMTMxMjM6R2lsbWVyIENvdW50eSAKK1VTLUdBLTEzMTI1OkdsYXNjb2NrIENvdW50eSAKK1VTLUdBLTEzMTI3OkdseW5uIENvdW50eSAKK1VTLUdBLTEzMTI5OkdvcmRvbiBDb3VudHkgCitVUy1HQS0xMzEzMTpHcmFkeSBDb3VudHkgCitVUy1HQS0xMzEzMzpHcmVlbmUgQ291bnR5IAorVVMtR0EtMTMxMzU6R3dpbm5ldHQgQ291bnR5IAorVVMtR0EtMTMxMzc6SGFiZXJzaGFtIENvdW50eSAKK1VTLUdBLTEzMTM5OkhhbGwgQ291bnR5IAorVVMtR0EtMTMxNDE6SGFuY29jayBDb3VudHkgCitVUy1HQS0xMzE0MzpIYXJhbHNvbiBDb3VudHkgCitVUy1HQS0xMzE0NTpIYXJyaXMgQ291bnR5IAorVVMtR0EtMTMxNDc6SGFydCBDb3VudHkgCitVUy1HQS0xMzE0OTpIZWFyZCBDb3VudHkgCitVUy1HQS0xMzE1MTpIZW5yeSBDb3VudHkgCitVUy1HQS0xMzE1MzpIb3VzdG9uIENvdW50eSAKK1VTLUdBLTEzMTU1Oklyd2luIENvdW50eSAKK1VTLUdBLTEzMTU3OkphY2tzb24gQ291bnR5IAorVVMtR0EtMTMxNTk6SmFzcGVyIENvdW50eSAKK1VTLUdBLTEzMTYxOkplZmYgRGF2aXMgQ291bnR5IAorVVMtR0EtMTMxNjM6SmVmZmVyc29uIENvdW50eSAKK1VTLUdBLTEzMTY1OkplbmtpbnMgQ291bnR5IAorVVMtR0EtMTMxNjc6Sm9obnNvbiBDb3VudHkgCitVUy1HQS0xMzE2OTpKb25lcyBDb3VudHkgCitVUy1HQS0xMzE3MTpMYW1hciBDb3VudHkgCitVUy1HQS0xMzE3MzpMYW5pZXIgQ291bnR5IAorVVMtR0EtMTMxNzU6TGF1cmVucyBDb3VudHkgCitVUy1HQS0xMzE3NzpMZWUgQ291bnR5IAorVVMtR0EtMTMxNzk6TGliZXJ0eSBDb3VudHkgCitVUy1HQS0xMzE4MTpMaW5jb2xuIENvdW50eSAKK1VTLUdBLTEzMTgzOkxvbmcgQ291bnR5IAorVVMtR0EtMTMxODU6TG93bmRlcyBDb3VudHkgCitVUy1HQS0xMzE4NzpMdW1wa2luIENvdW50eSAKK1VTLUdBLTEzMTg5Ok1jRHVmZmllIENvdW50eSAKK1VTLUdBLTEzMTkxOk1jSW50b3NoIENvdW50eSAKK1VTLUdBLTEzMTkzOk1hY29uIENvdW50eSAKK1VTLUdBLTEzMTk1Ok1hZGlzb24gQ291bnR5IAorVVMtR0EtMTMxOTc6TWFyaW9uIENvdW50eSAKK1VTLUdBLTEzMTk5Ok1lcml3ZXRoZXIgQ291bnR5IAorVVMtR0EtMTMyMDE6TWlsbGVyIENvdW50eSAKK1VTLUdBLTEzMjA1Ok1pdGNoZWxsIENvdW50eSAKK1VTLUdBLTEzMjA3Ok1vbnJvZSBDb3VudHkgCitVUy1HQS0xMzIwOTpNb250Z29tZXJ5IENvdW50eSAKK1VTLUdBLTEzMjExOk1vcmdhbiBDb3VudHkgCitVUy1HQS0xMzIxMzpNdXJyYXkgQ291bnR5IAorVVMtR0EtMTMyMTU6TXVzY29nZWUgQ291bnR5IAorVVMtR0EtMTMyMTc6TmV3dG9uIENvdW50eSAKK1VTLUdBLTEzMjE5Ok9jb25lZSBDb3VudHkgCitVUy1HQS0xMzIyMTpPZ2xldGhvcnBlIENvdW50eSAKK1VTLUdBLTEzMjIzOlBhdWxkaW5nIENvdW50eSAKK1VTLUdBLTEzMjI1OlBlYWNoIENvdW50eSAKK1VTLUdBLTEzMjI3OlBpY2tlbnMgQ291bnR5IAorVVMtR0EtMTMyMjk6UGllcmNlIENvdW50eSAKK1VTLUdBLTEzMjMxOlBpa2UgQ291bnR5IAorVVMtR0EtMTMyMzM6UG9sayBDb3VudHkgCitVUy1HQS0xMzIzNTpQdWxhc2tpIENvdW50eSAKK1VTLUdBLTEzMjM3OlB1dG5hbSBDb3VudHkgCitVUy1HQS0xMzIzOTpRdWl0bWFuIENvdW50eSAKK1VTLUdBLTEzMjQxOlJhYnVuIENvdW50eSAKK1VTLUdBLTEzMjQzOlJhbmRvbHBoIENvdW50eSAKK1VTLUdBLTEzMjQ1OlJpY2htb25kIENvdW50eSAKK1VTLUdBLTEzMjQ3OlJvY2tkYWxlIENvdW50eSAKK1VTLUdBLTEzMjQ5OlNjaGxleSBDb3VudHkgCitVUy1HQS0xMzI1MTpTY3JldmVuIENvdW50eSAKK1VTLUdBLTEzMjUzOlNlbWlub2xlIENvdW50eSAKK1VTLUdBLTEzMjU1OlNwYWxkaW5nIENvdW50eSAKK1VTLUdBLTEzMjU3OlN0ZXBoZW5zIENvdW50eSAKK1VTLUdBLTEzMjU5OlN0ZXdhcnQgQ291bnR5IAorVVMtR0EtMTMyNjE6U3VtdGVyIENvdW50eSAKK1VTLUdBLTEzMjYzOlRhbGJvdCBDb3VudHkgCitVUy1HQS0xMzI2NTpUYWxpYWZlcnJvIENvdW50eSAKK1VTLUdBLTEzMjY3OlRhdHRuYWxsIENvdW50eSAKK1VTLUdBLTEzMjY5OlRheWxvciBDb3VudHkgCitVUy1HQS0xMzI3MTpUZWxmYWlyIENvdW50eSAKK1VTLUdBLTEzMjczOlRlcnJlbGwgQ291bnR5IAorVVMtR0EtMTMyNzU6VGhvbWFzIENvdW50eSAKK1VTLUdBLTEzMjc3OlRpZnQgQ291bnR5IAorVVMtR0EtMTMyNzk6VG9vbWJzIENvdW50eSAKK1VTLUdBLTEzMjgxOlRvd25zIENvdW50eSAKK1VTLUdBLTEzMjgzOlRyZXV0bGVuIENvdW50eSAKK1VTLUdBLTEzMjg1OlRyb3VwIENvdW50eSAKK1VTLUdBLTEzMjg3OlR1cm5lciBDb3VudHkgCitVUy1HQS0xMzI4OTpUd2lnZ3MgQ291bnR5IAorVVMtR0EtMTMyOTE6VW5pb24gQ291bnR5IAorVVMtR0EtMTMyOTM6VXBzb24gQ291bnR5IAorVVMtR0EtMTMyOTU6V2Fsa2VyIENvdW50eSAKK1VTLUdBLTEzMjk3OldhbHRvbiBDb3VudHkgCitVUy1HQS0xMzI5OTpXYXJlIENvdW50eSAKK1VTLUdBLTEzMzAxOldhcnJlbiBDb3VudHkgCitVUy1HQS0xMzMwMzpXYXNoaW5ndG9uIENvdW50eSAKK1VTLUdBLTEzMzA1OldheW5lIENvdW50eSAKK1VTLUdBLTEzMzA3OldlYnN0ZXIgQ291bnR5IAorVVMtR0EtMTMzMDk6V2hlZWxlciBDb3VudHkgCitVUy1HQS0xMzMxMTpXaGl0ZSBDb3VudHkgCitVUy1HQS0xMzMxMzpXaGl0ZmllbGQgQ291bnR5IAorVVMtR0EtMTMzMTU6V2lsY294IENvdW50eSAKK1VTLUdBLTEzMzE3OldpbGtlcyBDb3VudHkgCitVUy1HQS0xMzMxOTpXaWxraW5zb24gQ291bnR5IAorVVMtR0EtMTMzMjE6V29ydGggQ291bnR5IAorIyB1bmRlciBBZG1pbiBMZXZlbFsxXSBJRFsxNV06SGF3YWlpIAorVVMtSEktMTUwMDE6SGF3YWlpIENvdW50eSAKK1VTLUhJLTE1MDAzOkhvbm9sdWx1IENvdW50eSAKK1VTLUhJLTE1MDA1OkthbGF3YW8gQ291bnR5IAorVVMtSEktMTUwMDc6S2F1YWkgQ291bnR5IAorVVMtSEktMTUwMDk6TWF1aSBDb3VudHkgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEWzE5XTpJb3dhIAorVVMtSUEtMTkwMDE6QWRhaXIgQ291bnR5IAorVVMtSUEtMTkwMDM6QWRhbXMgQ291bnR5IAorVVMtSUEtMTkwMDU6QWxsYW1ha2VlIENvdW50eSAKK1VTLUlBLTE5MDA3OkFwcGFub29zZSBDb3VudHkgCitVUy1JQS0xOTAwOTpBdWR1Ym9uIENvdW50eSAKK1VTLUlBLTE5MDExOkJlbnRvbiBDb3VudHkgCitVUy1JQS0xOTAxMzpCbGFjayBIYXdrIENvdW50eSAKK1VTLUlBLTE5MDE1OkJvb25lIENvdW50eSAKK1VTLUlBLTE5MDE3OkJyZW1lciBDb3VudHkgCitVUy1JQS0xOTAxOTpCdWNoYW5hbiBDb3VudHkgCitVUy1JQS0xOTAyMTpCdWVuYSBWaXN0YSBDb3VudHkgCitVUy1JQS0xOTAyMzpCdXRsZXIgQ291bnR5IAorVVMtSUEtMTkwMjU6Q2FsaG91biBDb3VudHkgCitVUy1JQS0xOTAyNzpDYXJyb2xsIENvdW50eSAKK1VTLUlBLTE5MDI5OkNhc3MgQ291bnR5IAorVVMtSUEtMTkwMzE6Q2VkYXIgQ291bnR5IAorVVMtSUEtMTkwMzM6Q2Vycm8gR29yZG8gQ291bnR5IAorVVMtSUEtMTkwMzU6Q2hlcm9rZWUgQ291bnR5IAorVVMtSUEtMTkwMzc6Q2hpY2thc2F3IENvdW50eSAKK1VTLUlBLTE5MDM5OkNsYXJrZSBDb3VudHkgCitVUy1JQS0xOTA0MTpDbGF5IENvdW50eSAKK1VTLUlBLTE5MDQzOkNsYXl0b24gQ291bnR5IAorVVMtSUEtMTkwNDU6Q2xpbnRvbiBDb3VudHkgCitVUy1JQS0xOTA0NzpDcmF3Zm9yZCBDb3VudHkgCitVUy1JQS0xOTA0OTpEYWxsYXMgQ291bnR5IAorVVMtSUEtMTkwNTE6RGF2aXMgQ291bnR5IAorVVMtSUEtMTkwNTM6RGVjYXR1ciBDb3VudHkgCitVUy1JQS0xOTA1NTpEZWxhd2FyZSBDb3VudHkgCitVUy1JQS0xOTA1NzpEZXMgTW9pbmVzIENvdW50eSAKK1VTLUlBLTE5MDU5OkRpY2tpbnNvbiBDb3VudHkgCitVUy1JQS0xOTA2MTpEdWJ1cXVlIENvdW50eSAKK1VTLUlBLTE5MDYzOkVtbWV0IENvdW50eSAKK1VTLUlBLTE5MDY1OkZheWV0dGUgQ291bnR5IAorVVMtSUEtMTkwNjc6RmxveWQgQ291bnR5IAorVVMtSUEtMTkwNjk6RnJhbmtsaW4gQ291bnR5IAorVVMtSUEtMTkwNzE6RnJlbW9udCBDb3VudHkgCitVUy1JQS0xOTA3MzpHcmVlbmUgQ291bnR5IAorVVMtSUEtMTkwNzU6R3J1bmR5IENvdW50eSAKK1VTLUlBLTE5MDc3Okd1dGhyaWUgQ291bnR5IAorVVMtSUEtMTkwNzk6SGFtaWx0b24gQ291bnR5IAorVVMtSUEtMTkwODE6SGFuY29jayBDb3VudHkgCitVUy1JQS0xOTA4MzpIYXJkaW4gQ291bnR5IAorVVMtSUEtMTkwODU6SGFycmlzb24gQ291bnR5IAorVVMtSUEtMTkwODc6SGVucnkgQ291bnR5IAorVVMtSUEtMTkwODk6SG93YXJkIENvdW50eSAKK1VTLUlBLTE5MDkxOkh1bWJvbGR0IENvdW50eSAKK1VTLUlBLTE5MDkzOklkYSBDb3VudHkgCitVUy1JQS0xOTA5NTpJb3dhIENvdW50eSAKK1VTLUlBLTE5MDk3OkphY2tzb24gQ291bnR5IAorVVMtSUEtMTkwOTk6SmFzcGVyIENvdW50eSAKK1VTLUlBLTE5MTAxOkplZmZlcnNvbiBDb3VudHkgCitVUy1JQS0xOTEwMzpKb2huc29uIENvdW50eSAKK1VTLUlBLTE5MTA1OkpvbmVzIENvdW50eSAKK1VTLUlBLTE5MTA3Oktlb2t1ayBDb3VudHkgCitVUy1JQS0xOTEwOTpLb3NzdXRoIENvdW50eSAKK1VTLUlBLTE5MTExOkxlZSBDb3VudHkgCitVUy1JQS0xOTExMzpMaW5uIENvdW50eSAKK1VTLUlBLTE5MTE1OkxvdWlzYSBDb3VudHkgCitVUy1JQS0xOTExNzpMdWNhcyBDb3VudHkgCitVUy1JQS0xOTExOTpMeW9uIENvdW50eSAKK1VTLUlBLTE5MTIxOk1hZGlzb24gQ291bnR5IAorVVMtSUEtMTkxMjM6TWFoYXNrYSBDb3VudHkgCitVUy1JQS0xOTEyNTpNYXJpb24gQ291bnR5IAorVVMtSUEtMTkxMjc6TWFyc2hhbGwgQ291bnR5IAorVVMtSUEtMTkxMjk6TWlsbHMgQ291bnR5IAorVVMtSUEtMTkxMzE6TWl0Y2hlbGwgQ291bnR5IAorVVMtSUEtMTkxMzM6TW9ub25hIENvdW50eSAKK1VTLUlBLTE5MTM1Ok1vbnJvZSBDb3VudHkgCitVUy1JQS0xOTEzNzpNb250Z29tZXJ5IENvdW50eSAKK1VTLUlBLTE5MTM5Ok11c2NhdGluZSBDb3VudHkgCitVUy1JQS0xOTE0MTpPJ0JyaWVuIENvdW50eSAKK1VTLUlBLTE5MTQzOk9zY2VvbGEgQ291bnR5IAorVVMtSUEtMTkxNDU6UGFnZSBDb3VudHkgCitVUy1JQS0xOTE0NzpQYWxvIEFsdG8gQ291bnR5IAorVVMtSUEtMTkxNDk6UGx5bW91dGggQ291bnR5IAorVVMtSUEtMTkxNTE6UG9jYWhvbnRhcyBDb3VudHkgCitVUy1JQS0xOTE1MzpQb2xrIENvdW50eSAKK1VTLUlBLTE5MTU1OlBvdHRhd2F0dGFtaWUgQ291bnR5IAorVVMtSUEtMTkxNTc6UG93ZXNoaWVrIENvdW50eSAKK1VTLUlBLTE5MTU5OlJpbmdnb2xkIENvdW50eSAKK1VTLUlBLTE5MTYxOlNhYyBDb3VudHkgCitVUy1JQS0xOTE2MzpTY290dCBDb3VudHkgCitVUy1JQS0xOTE2NTpTaGVsYnkgQ291bnR5IAorVVMtSUEtMTkxNjc6U2lvdXggQ291bnR5IAorVVMtSUEtMTkxNjk6U3RvcnkgQ291bnR5IAorVVMtSUEtMTkxNzE6VGFtYSBDb3VudHkgCitVUy1JQS0xOTE3MzpUYXlsb3IgQ291bnR5IAorVVMtSUEtMTkxNzU6VW5pb24gQ291bnR5IAorVVMtSUEtMTkxNzc6VmFuIEJ1cmVuIENvdW50eSAKK1VTLUlBLTE5MTc5OldhcGVsbG8gQ291bnR5IAorVVMtSUEtMTkxODE6V2FycmVuIENvdW50eSAKK1VTLUlBLTE5MTgzOldhc2hpbmd0b24gQ291bnR5IAorVVMtSUEtMTkxODU6V2F5bmUgQ291bnR5IAorVVMtSUEtMTkxODc6V2Vic3RlciBDb3VudHkgCitVUy1JQS0xOTE4OTpXaW5uZWJhZ28gQ291bnR5IAorVVMtSUEtMTkxOTE6V2lubmVzaGllayBDb3VudHkgCitVUy1JQS0xOTE5MzpXb29kYnVyeSBDb3VudHkgCitVUy1JQS0xOTE5NTpXb3J0aCBDb3VudHkgCitVUy1JQS0xOTE5NzpXcmlnaHQgQ291bnR5IAorIyB1bmRlciBBZG1pbiBMZXZlbFsxXSBJRFsxNl06SWRhaG8gCitVUy1JRC0xNjAwMTpBZGEgQ291bnR5IAorVVMtSUQtMTYwMDM6QWRhbXMgQ291bnR5IAorVVMtSUQtMTYwMDU6QmFubm9jayBDb3VudHkgCitVUy1JRC0xNjAwNzpCZWFyIExha2UgQ291bnR5IAorVVMtSUQtMTYwMDk6QmVuZXdhaCBDb3VudHkgCitVUy1JRC0xNjAxMTpCaW5naGFtIENvdW50eSAKK1VTLUlELTE2MDEzOkJsYWluZSBDb3VudHkgCitVUy1JRC0xNjAxNTpCb2lzZSBDb3VudHkgCitVUy1JRC0xNjAxNzpCb25uZXIgQ291bnR5IAorVVMtSUQtMTYwMTk6Qm9ubmV2aWxsZSBDb3VudHkgCitVUy1JRC0xNjAyMTpCb3VuZGFyeSBDb3VudHkgCitVUy1JRC0xNjAyMzpCdXR0ZSBDb3VudHkgCitVUy1JRC0xNjAyNTpDYW1hcyBDb3VudHkgCitVUy1JRC0xNjAyNzpDYW55b24gQ291bnR5IAorVVMtSUQtMTYwMjk6Q2FyaWJvdSBDb3VudHkgCitVUy1JRC0xNjAzMTpDYXNzaWEgQ291bnR5IAorVVMtSUQtMTYwMzM6Q2xhcmsgQ291bnR5IAorVVMtSUQtMTYwMzU6Q2xlYXJ3YXRlciBDb3VudHkgCitVUy1JRC0xNjAzNzpDdXN0ZXIgQ291bnR5IAorVVMtSUQtMTYwMzk6RWxtb3JlIENvdW50eSAKK1VTLUlELTE2MDQxOkZyYW5rbGluIENvdW50eSAKK1VTLUlELTE2MDQzOkZyZW1vbnQgQ291bnR5IAorVVMtSUQtMTYwNDU6R2VtIENvdW50eSAKK1VTLUlELTE2MDQ3Okdvb2RpbmcgQ291bnR5IAorVVMtSUQtMTYwNDk6SWRhaG8gQ291bnR5IAorVVMtSUQtMTYwNTE6SmVmZmVyc29uIENvdW50eSAKK1VTLUlELTE2MDUzOkplcm9tZSBDb3VudHkgCitVUy1JRC0xNjA1NTpLb290ZW5haSBDb3VudHkgCitVUy1JRC0xNjA1NzpMYXRhaCBDb3VudHkgCitVUy1JRC0xNjA1OTpMZW1oaSBDb3VudHkgCitVUy1JRC0xNjA2MTpMZXdpcyBDb3VudHkgCitVUy1JRC0xNjA2MzpMaW5jb2xuIENvdW50eSAKK1VTLUlELTE2MDY1Ok1hZGlzb24gQ291bnR5IAorVVMtSUQtMTYwNjc6TWluaWRva2EgQ291bnR5IAorVVMtSUQtMTYwNjk6TmV6IFBlcmNlIENvdW50eSAKK1VTLUlELTE2MDcxOk9uZWlkYSBDb3VudHkgCitVUy1JRC0xNjA3MzpPd3loZWUgQ291bnR5IAorVVMtSUQtMTYwNzU6UGF5ZXR0ZSBDb3VudHkgCitVUy1JRC0xNjA3NzpQb3dlciBDb3VudHkgCitVUy1JRC0xNjA3OTpTaG9zaG9uZSBDb3VudHkgCitVUy1JRC0xNjA4MTpUZXRvbiBDb3VudHkgCitVUy1JRC0xNjA4MzpUd2luIEZhbGxzIENvdW50eSAKK1VTLUlELTE2MDg1OlZhbGxleSBDb3VudHkgCitVUy1JRC0xNjA4NzpXYXNoaW5ndG9uIENvdW50eSAKKyMgdW5kZXIgQWRtaW4gTGV2ZWxbMV0gSURbMTddOklsbGlub2lzIAorVVMtSUwtMTcwMDE6QWRhbXMgQ291bnR5IAorVVMtSUwtMTcwMDM6QWxleGFuZGVyIENvdW50eSAKK1VTLUlMLTE3MDA1OkJvbmQgQ291bnR5IAorVVMtSUwtMTcwMDc6Qm9vbmUgQ291bnR5IAorVVMtSUwtMTcwMDk6QnJvd24gQ291bnR5IAorVVMtSUwtMTcwMTE6QnVyZWF1IENvdW50eSAKK1VTLUlMLTE3MDEzOkNhbGhvdW4gQ291bnR5IAorVVMtSUwtMTcwMTU6Q2Fycm9sbCBDb3VudHkgCitVUy1JTC0xNzAxNzpDYXNzIENvdW50eSAKK1VTLUlMLTE3MDE5OkNoYW1wYWlnbiBDb3VudHkgCitVUy1JTC0xNzAyMTpDaHJpc3RpYW4gQ291bnR5IAorVVMtSUwtMTcwMjM6Q2xhcmsgQ291bnR5IAorVVMtSUwtMTcwMjU6Q2xheSBDb3VudHkgCitVUy1JTC0xNzAyNzpDbGludG9uIENvdW50eSAKK1VTLUlMLTE3MDI5OkNvbGVzIENvdW50eSAKK1VTLUlMLTE3MDMxOkNvb2sgQ291bnR5IAorVVMtSUwtMTcwMzM6Q3Jhd2ZvcmQgQ291bnR5IAorVVMtSUwtMTcwMzU6Q3VtYmVybGFuZCBDb3VudHkgCitVUy1JTC0xNzAzNzpEZUthbGIgQ291bnR5IAorVVMtSUwtMTcwMzk6RGUgV2l0dCBDb3VudHkgCitVUy1JTC0xNzA0MTpEb3VnbGFzIENvdW50eSAKK1VTLUlMLTE3MDQzOkR1UGFnZSBDb3VudHkgCitVUy1JTC0xNzA0NTpFZGdhciBDb3VudHkgCitVUy1JTC0xNzA0NzpFZHdhcmRzIENvdW50eSAKK1VTLUlMLTE3MDQ5OkVmZmluZ2hhbSBDb3VudHkgCitVUy1JTC0xNzA1MTpGYXlldHRlIENvdW50eSAKK1VTLUlMLTE3MDUzOkZvcmQgQ291bnR5IAorVVMtSUwtMTcwNTU6RnJhbmtsaW4gQ291bnR5IAorVVMtSUwtMTcwNTc6RnVsdG9uIENvdW50eSAKK1VTLUlMLTE3MDU5OkdhbGxhdGluIENvdW50eSAKK1VTLUlMLTE3MDYxOkdyZWVuZSBDb3VudHkgCitVUy1JTC0xNzA2MzpHcnVuZHkgQ291bnR5IAorVVMtSUwtMTcwNjU6SGFtaWx0b24gQ291bnR5IAorVVMtSUwtMTcwNjc6SGFuY29jayBDb3VudHkgCitVUy1JTC0xNzA2OTpIYXJkaW4gQ291bnR5IAorVVMtSUwtMTcwNzE6SGVuZGVyc29uIENvdW50eSAKK1VTLUlMLTE3MDczOkhlbnJ5IENvdW50eSAKK1VTLUlMLTE3MDc1Oklyb3F1b2lzIENvdW50eSAKK1VTLUlMLTE3MDc3OkphY2tzb24gQ291bnR5IAorVVMtSUwtMTcwNzk6SmFzcGVyIENvdW50eSAKK1VTLUlMLTE3MDgxOkplZmZlcnNvbiBDb3VudHkgCitVUy1JTC0xNzA4MzpKZXJzZXkgQ291bnR5IAorVVMtSUwtMTcwODU6Sm8gRGF2aWVzcyBDb3VudHkgCitVUy1JTC0xNzA4NzpKb2huc29uIENvdW50eSAKK1VTLUlMLTE3MDg5OkthbmUgQ291bnR5IAorVVMtSUwtMTcwOTE6S2Fua2FrZWUgQ291bnR5IAorVVMtSUwtMTcwOTM6S2VuZGFsbCBDb3VudHkgCitVUy1JTC0xNzA5NTpLbm94IENvdW50eSAKK1VTLUlMLTE3MDk3Okxha2UgQ291bnR5IAorVVMtSUwtMTcwOTk6TGEgU2FsbGUgQ291bnR5IAorVVMtSUwtMTcxMDE6TGF3cmVuY2UgQ291bnR5IAorVVMtSUwtMTcxMDM6TGVlIENvdW50eSAKK1VTLUlMLTE3MTA1OkxpdmluZ3N0b24gQ291bnR5IAorVVMtSUwtMTcxMDc6TG9nYW4gQ291bnR5IAorVVMtSUwtMTcxMDk6TWNEb25vdWdoIENvdW50eSAKK1VTLUlMLTE3MTExOk1jSGVucnkgQ291bnR5IAorVVMtSUwtMTcxMTM6TWNMZWFuIENvdW50eSAKK1VTLUlMLTE3MTE1Ok1hY29uIENvdW50eSAKK1VTLUlMLTE3MTE3Ok1hY291cGluIENvdW50eSAKK1VTLUlMLTE3MTE5Ok1hZGlzb24gQ291bnR5IAorVVMtSUwtMTcxMjE6TWFyaW9uIENvdW50eSAKK1VTLUlMLTE3MTIzOk1hcnNoYWxsIENvdW50eSAKK1VTLUlMLTE3MTI1Ok1hc29uIENvdW50eSAKK1VTLUlMLTE3MTI3Ok1hc3NhYyBDb3VudHkgCitVUy1JTC0xNzEyOTpNZW5hcmQgQ291bnR5IAorVVMtSUwtMTcxMzE6TWVyY2VyIENvdW50eSAKK1VTLUlMLTE3MTMzOk1vbnJvZSBDb3VudHkgCitVUy1JTC0xNzEzNTpNb250Z29tZXJ5IENvdW50eSAKK1VTLUlMLTE3MTM3Ok1vcmdhbiBDb3VudHkgCitVUy1JTC0xNzEzOTpNb3VsdHJpZSBDb3VudHkgCitVUy1JTC0xNzE0MTpPZ2xlIENvdW50eSAKK1VTLUlMLTE3MTQzOlBlb3JpYSBDb3VudHkgCitVUy1JTC0xNzE0NTpQZXJyeSBDb3VudHkgCitVUy1JTC0xNzE0NzpQaWF0dCBDb3VudHkgCitVUy1JTC0xNzE0OTpQaWtlIENvdW50eSAKK1VTLUlMLTE3MTUxOlBvcGUgQ291bnR5IAorVVMtSUwtMTcxNTM6UHVsYXNraSBDb3VudHkgCitVUy1JTC0xNzE1NTpQdXRuYW0gQ291bnR5IAorVVMtSUwtMTcxNTc6UmFuZG9scGggQ291bnR5IAorVVMtSUwtMTcxNTk6UmljaGxhbmQgQ291bnR5IAorVVMtSUwtMTcxNjE6Um9jayBJc2xhbmQgQ291bnR5IAorVVMtSUwtMTcxNjM6U3QuIENsYWlyIENvdW50eSAKK1VTLUlMLTE3MTY1OlNhbGluZSBDb3VudHkgCitVUy1JTC0xNzE2NzpTYW5nYW1vbiBDb3VudHkgCitVUy1JTC0xNzE2OTpTY2h1eWxlciBDb3VudHkgCitVUy1JTC0xNzE3MTpTY290dCBDb3VudHkgCitVUy1JTC0xNzE3MzpTaGVsYnkgQ291bnR5IAorVVMtSUwtMTcxNzU6U3RhcmsgQ291bnR5IAorVVMtSUwtMTcxNzc6U3RlcGhlbnNvbiBDb3VudHkgCitVUy1JTC0xNzE3OTpUYXpld2VsbCBDb3VudHkgCitVUy1JTC0xNzE4MTpVbmlvbiBDb3VudHkgCitVUy1JTC0xNzE4MzpWZXJtaWxpb24gQ291bnR5IAorVVMtSUwtMTcxODU6V2FiYXNoIENvdW50eSAKK1VTLUlMLTE3MTg3OldhcnJlbiBDb3VudHkgCitVUy1JTC0xNzE4OTpXYXNoaW5ndG9uIENvdW50eSAKK1VTLUlMLTE3MTkxOldheW5lIENvdW50eSAKK1VTLUlMLTE3MTkzOldoaXRlIENvdW50eSAKK1VTLUlMLTE3MTk1OldoaXRlc2lkZSBDb3VudHkgCitVUy1JTC0xNzE5NzpXaWxsIENvdW50eSAKK1VTLUlMLTE3MTk5OldpbGxpYW1zb24gQ291bnR5IAorVVMtSUwtMTcyMDE6V2lubmViYWdvIENvdW50eSAKK1VTLUlMLTE3MjAzOldvb2Rmb3JkIENvdW50eSAKKyMgdW5kZXIgQWRtaW4gTGV2ZWxbMV0gSURbMThdOkluZGlhbmEgCitVUy1JTi0xODAwMTpBZGFtcyBDb3VudHkgCitVUy1JTi0xODAwMzpBbGxlbiBDb3VudHkgCitVUy1JTi0xODAwNTpCYXJ0aG9sb21ldyBDb3VudHkgCitVUy1JTi0xODAwNzpCZW50b24gQ291bnR5IAorVVMtSU4tMTgwMDk6QmxhY2tmb3JkIENvdW50eSAKK1VTLUlOLTE4MDExOkJvb25lIENvdW50eSAKK1VTLUlOLTE4MDEzOkJyb3duIENvdW50eSAKK1VTLUlOLTE4MDE1OkNhcnJvbGwgQ291bnR5IAorVVMtSU4tMTgwMTc6Q2FzcyBDb3VudHkgCitVUy1JTi0xODAxOTpDbGFyayBDb3VudHkgCitVUy1JTi0xODAyMTpDbGF5IENvdW50eSAKK1VTLUlOLTE4MDIzOkNsaW50b24gQ291bnR5IAorVVMtSU4tMTgwMjU6Q3Jhd2ZvcmQgQ291bnR5IAorVVMtSU4tMTgwMjc6RGF2aWVzcyBDb3VudHkgCitVUy1JTi0xODAyOTpEZWFyYm9ybiBDb3VudHkgCitVUy1JTi0xODAzMTpEZWNhdHVyIENvdW50eSAKK1VTLUlOLTE4MDMzOkRlS2FsYiBDb3VudHkgCitVUy1JTi0xODAzNTpEZWxhd2FyZSBDb3VudHkgCitVUy1JTi0xODAzNzpEdWJvaXMgQ291bnR5IAorVVMtSU4tMTgwMzk6RWxraGFydCBDb3VudHkgCitVUy1JTi0xODA0MTpGYXlldHRlIENvdW50eSAKK1VTLUlOLTE4MDQzOkZsb3lkIENvdW50eSAKK1VTLUlOLTE4MDQ1OkZvdW50YWluIENvdW50eSAKK1VTLUlOLTE4MDQ3OkZyYW5rbGluIENvdW50eSAKK1VTLUlOLTE4MDQ5OkZ1bHRvbiBDb3VudHkgCitVUy1JTi0xODA1MTpHaWJzb24gQ291bnR5IAorVVMtSU4tMTgwNTM6R3JhbnQgQ291bnR5IAorVVMtSU4tMTgwNTU6R3JlZW5lIENvdW50eSAKK1VTLUlOLTE4MDU3OkhhbWlsdG9uIENvdW50eSAKK1VTLUlOLTE4MDU5OkhhbmNvY2sgQ291bnR5IAorVVMtSU4tMTgwNjE6SGFycmlzb24gQ291bnR5IAorVVMtSU4tMTgwNjM6SGVuZHJpY2tzIENvdW50eSAKK1VTLUlOLTE4MDY1OkhlbnJ5IENvdW50eSAKK1VTLUlOLTE4MDY3Okhvd2FyZCBDb3VudHkgCitVUy1JTi0xODA2OTpIdW50aW5ndG9uIENvdW50eSAKK1VTLUlOLTE4MDcxOkphY2tzb24gQ291bnR5IAorVVMtSU4tMTgwNzM6SmFzcGVyIENvdW50eSAKK1VTLUlOLTE4MDc1OkpheSBDb3VudHkgCitVUy1JTi0xODA3NzpKZWZmZXJzb24gQ291bnR5IAorVVMtSU4tMTgwNzk6SmVubmluZ3MgQ291bnR5IAorVVMtSU4tMTgwODE6Sm9obnNvbiBDb3VudHkgCitVUy1JTi0xODA4MzpLbm94IENvdW50eSAKK1VTLUlOLTE4MDg1Oktvc2NpdXNrbyBDb3VudHkgCitVUy1JTi0xODA4NzpMYWdyYW5nZSBDb3VudHkgCitVUy1JTi0xODA4OTpMYWtlIENvdW50eSAKK1VTLUlOLTE4MDkxOkxhUG9ydGUgQ291bnR5IAorVVMtSU4tMTgwOTM6TGF3cmVuY2UgQ291bnR5IAorVVMtSU4tMTgwOTU6TWFkaXNvbiBDb3VudHkgCitVUy1JTi0xODA5NzpNYXJpb24gQ291bnR5IAorVVMtSU4tMTgwOTk6TWFyc2hhbGwgQ291bnR5IAorVVMtSU4tMTgxMDE6TWFydGluIENvdW50eSAKK1VTLUlOLTE4MTAzOk1pYW1pIENvdW50eSAKK1VTLUlOLTE4MTA1Ok1vbnJvZSBDb3VudHkgCitVUy1JTi0xODEwNzpNb250Z29tZXJ5IENvdW50eSAKK1VTLUlOLTE4MTA5Ok1vcmdhbiBDb3VudHkgCitVUy1JTi0xODExMTpOZXd0b24gQ291bnR5IAorVVMtSU4tMTgxMTM6Tm9ibGUgQ291bnR5IAorVVMtSU4tMTgxMTU6T2hpbyBDb3VudHkgCitVUy1JTi0xODExNzpPcmFuZ2UgQ291bnR5IAorVVMtSU4tMTgxMTk6T3dlbiBDb3VudHkgCitVUy1JTi0xODEyMTpQYXJrZSBDb3VudHkgCitVUy1JTi0xODEyMzpQZXJyeSBDb3VudHkgCitVUy1JTi0xODEyNTpQaWtlIENvdW50eSAKK1VTLUlOLTE4MTI3OlBvcnRlciBDb3VudHkgCitVUy1JTi0xODEyOTpQb3NleSBDb3VudHkgCitVUy1JTi0xODEzMTpQdWxhc2tpIENvdW50eSAKK1VTLUlOLTE4MTMzOlB1dG5hbSBDb3VudHkgCitVUy1JTi0xODEzNTpSYW5kb2xwaCBDb3VudHkgCitVUy1JTi0xODEzNzpSaXBsZXkgQ291bnR5IAorVVMtSU4tMTgxMzk6UnVzaCBDb3VudHkgCitVUy1JTi0xODE0MTpTdC4gSm9zZXBoIENvdW50eSAKK1VTLUlOLTE4MTQzOlNjb3R0IENvdW50eSAKK1VTLUlOLTE4MTQ1OlNoZWxieSBDb3VudHkgCitVUy1JTi0xODE0NzpTcGVuY2VyIENvdW50eSAKK1VTLUlOLTE4MTQ5OlN0YXJrZSBDb3VudHkgCitVUy1JTi0xODE1MTpTdGV1YmVuIENvdW50eSAKK1VTLUlOLTE4MTUzOlN1bGxpdmFuIENvdW50eSAKK1VTLUlOLTE4MTU1OlN3aXR6ZXJsYW5kIENvdW50eSAKK1VTLUlOLTE4MTU3OlRpcHBlY2Fub2UgQ291bnR5IAorVVMtSU4tMTgxNTk6VGlwdG9uIENvdW50eSAKK1VTLUlOLTE4MTYxOlVuaW9uIENvdW50eSAKK1VTLUlOLTE4MTYzOlZhbmRlcmJ1cmdoIENvdW50eSAKK1VTLUlOLTE4MTY1OlZlcm1pbGxpb24gQ291bnR5IAorVVMtSU4tMTgxNjc6VmlnbyBDb3VudHkgCitVUy1JTi0xODE2OTpXYWJhc2ggQ291bnR5IAorVVMtSU4tMTgxNzE6V2FycmVuIENvdW50eSAKK1VTLUlOLTE4MTczOldhcnJpY2sgQ291bnR5IAorVVMtSU4tMTgxNzU6V2FzaGluZ3RvbiBDb3VudHkgCitVUy1JTi0xODE3NzpXYXluZSBDb3VudHkgCitVUy1JTi0xODE3OTpXZWxscyBDb3VudHkgCitVUy1JTi0xODE4MTpXaGl0ZSBDb3VudHkgCitVUy1JTi0xODE4MzpXaGl0bGV5IENvdW50eSAKKyMgdW5kZXIgQWRtaW4gTGV2ZWxbMV0gSURbMjBdOkthbnNhcyAKK1VTLUtTLTIwMDAxOkFsbGVuIENvdW50eSAKK1VTLUtTLTIwMDAzOkFuZGVyc29uIENvdW50eSAKK1VTLUtTLTIwMDA1OkF0Y2hpc29uIENvdW50eSAKK1VTLUtTLTIwMDA3OkJhcmJlciBDb3VudHkgCitVUy1LUy0yMDAwOTpCYXJ0b24gQ291bnR5IAorVVMtS1MtMjAwMTE6Qm91cmJvbiBDb3VudHkgCitVUy1LUy0yMDAxMzpCcm93biBDb3VudHkgCitVUy1LUy0yMDAxNTpCdXRsZXIgQ291bnR5IAorVVMtS1MtMjAwMTc6Q2hhc2UgQ291bnR5IAorVVMtS1MtMjAwMTk6Q2hhdXRhdXF1YSBDb3VudHkgCitVUy1LUy0yMDAyMTpDaGVyb2tlZSBDb3VudHkgCitVUy1LUy0yMDAyMzpDaGV5ZW5uZSBDb3VudHkgCitVUy1LUy0yMDAyNTpDbGFyayBDb3VudHkgCitVUy1LUy0yMDAyNzpDbGF5IENvdW50eSAKK1VTLUtTLTIwMDI5OkNsb3VkIENvdW50eSAKK1VTLUtTLTIwMDMxOkNvZmZleSBDb3VudHkgCitVUy1LUy0yMDAzMzpDb21hbmNoZSBDb3VudHkgCitVUy1LUy0yMDAzNTpDb3dsZXkgQ291bnR5IAorVVMtS1MtMjAwMzc6Q3Jhd2ZvcmQgQ291bnR5IAorVVMtS1MtMjAwMzk6RGVjYXR1ciBDb3VudHkgCitVUy1LUy0yMDA0MTpEaWNraW5zb24gQ291bnR5IAorVVMtS1MtMjAwNDM6RG9uaXBoYW4gQ291bnR5IAorVVMtS1MtMjAwNDU6RG91Z2xhcyBDb3VudHkgCitVUy1LUy0yMDA0NzpFZHdhcmRzIENvdW50eSAKK1VTLUtTLTIwMDQ5OkVsayBDb3VudHkgCitVUy1LUy0yMDA1MTpFbGxpcyBDb3VudHkgCitVUy1LUy0yMDA1MzpFbGxzd29ydGggQ291bnR5IAorVVMtS1MtMjAwNTU6RmlubmV5IENvdW50eSAKK1VTLUtTLTIwMDU3OkZvcmQgQ291bnR5IAorVVMtS1MtMjAwNTk6RnJhbmtsaW4gQ291bnR5IAorVVMtS1MtMjAwNjE6R2VhcnkgQ291bnR5IAorVVMtS1MtMjAwNjM6R292ZSBDb3VudHkgCitVUy1LUy0yMDA2NTpHcmFoYW0gQ291bnR5IAorVVMtS1MtMjAwNjc6R3JhbnQgQ291bnR5IAorVVMtS1MtMjAwNjk6R3JheSBDb3VudHkgCitVUy1LUy0yMDA3MTpHcmVlbGV5IENvdW50eSAKK1VTLUtTLTIwMDczOkdyZWVud29vZCBDb3VudHkgCitVUy1LUy0yMDA3NTpIYW1pbHRvbiBDb3VudHkgCitVUy1LUy0yMDA3NzpIYXJwZXIgQ291bnR5IAorVVMtS1MtMjAwNzk6SGFydmV5IENvdW50eSAKK1VTLUtTLTIwMDgxOkhhc2tlbGwgQ291bnR5IAorVVMtS1MtMjAwODM6SG9kZ2VtYW4gQ291bnR5IAorVVMtS1MtMjAwODU6SmFja3NvbiBDb3VudHkgCitVUy1LUy0yMDA4NzpKZWZmZXJzb24gQ291bnR5IAorVVMtS1MtMjAwODk6SmV3ZWxsIENvdW50eSAKK1VTLUtTLTIwMDkxOkpvaG5zb24gQ291bnR5IAorVVMtS1MtMjAwOTM6S2Vhcm55IENvdW50eSAKK1VTLUtTLTIwMDk1OktpbmdtYW4gQ291bnR5IAorVVMtS1MtMjAwOTc6S2lvd2EgQ291bnR5IAorVVMtS1MtMjAwOTk6TGFiZXR0ZSBDb3VudHkgCitVUy1LUy0yMDEwMTpMYW5lIENvdW50eSAKK1VTLUtTLTIwMTAzOkxlYXZlbndvcnRoIENvdW50eSAKK1VTLUtTLTIwMTA1OkxpbmNvbG4gQ291bnR5IAorVVMtS1MtMjAxMDc6TGlubiBDb3VudHkgCitVUy1LUy0yMDEwOTpMb2dhbiBDb3VudHkgCitVUy1LUy0yMDExMTpMeW9uIENvdW50eSAKK1VTLUtTLTIwMTEzOk1jUGhlcnNvbiBDb3VudHkgCitVUy1LUy0yMDExNTpNYXJpb24gQ291bnR5IAorVVMtS1MtMjAxMTc6TWFyc2hhbGwgQ291bnR5IAorVVMtS1MtMjAxMTk6TWVhZGUgQ291bnR5IAorVVMtS1MtMjAxMjE6TWlhbWkgQ291bnR5IAorVVMtS1MtMjAxMjM6TWl0Y2hlbGwgQ291bnR5IAorVVMtS1MtMjAxMjU6TW9udGdvbWVyeSBDb3VudHkgCitVUy1LUy0yMDEyNzpNb3JyaXMgQ291bnR5IAorVVMtS1MtMjAxMjk6TW9ydG9uIENvdW50eSAKK1VTLUtTLTIwMTMxOk5lbWFoYSBDb3VudHkgCitVUy1LUy0yMDEzMzpOZW9zaG8gQ291bnR5IAorVVMtS1MtMjAxMzU6TmVzcyBDb3VudHkgCitVUy1LUy0yMDEzNzpOb3J0b24gQ291bnR5IAorVVMtS1MtMjAxMzk6T3NhZ2UgQ291bnR5IAorVVMtS1MtMjAxNDE6T3Nib3JuZSBDb3VudHkgCitVUy1LUy0yMDE0MzpPdHRhd2EgQ291bnR5IAorVVMtS1MtMjAxNDU6UGF3bmVlIENvdW50eSAKK1VTLUtTLTIwMTQ3OlBoaWxsaXBzIENvdW50eSAKK1VTLUtTLTIwMTQ5OlBvdHRhd2F0b21pZSBDb3VudHkgCitVUy1LUy0yMDE1MTpQcmF0dCBDb3VudHkgCitVUy1LUy0yMDE1MzpSYXdsaW5zIENvdW50eSAKK1VTLUtTLTIwMTU1OlJlbm8gQ291bnR5IAorVVMtS1MtMjAxNTc6UmVwdWJsaWMgQ291bnR5IAorVVMtS1MtMjAxNTk6UmljZSBDb3VudHkgCitVUy1LUy0yMDE2MTpSaWxleSBDb3VudHkgCitVUy1LUy0yMDE2MzpSb29rcyBDb3VudHkgCitVUy1LUy0yMDE2NTpSdXNoIENvdW50eSAKK1VTLUtTLTIwMTY3OlJ1c3NlbGwgQ291bnR5IAorVVMtS1MtMjAxNjk6U2FsaW5lIENvdW50eSAKK1VTLUtTLTIwMTcxOlNjb3R0IENvdW50eSAKK1VTLUtTLTIwMTczOlNlZGd3aWNrIENvdW50eSAKK1VTLUtTLTIwMTc1OlNld2FyZCBDb3VudHkgCitVUy1LUy0yMDE3NzpTaGF3bmVlIENvdW50eSAKK1VTLUtTLTIwMTc5OlNoZXJpZGFuIENvdW50eSAKK1VTLUtTLTIwMTgxOlNoZXJtYW4gQ291bnR5IAorVVMtS1MtMjAxODM6U21pdGggQ291bnR5IAorVVMtS1MtMjAxODU6U3RhZmZvcmQgQ291bnR5IAorVVMtS1MtMjAxODc6U3RhbnRvbiBDb3VudHkgCitVUy1LUy0yMDE4OTpTdGV2ZW5zIENvdW50eSAKK1VTLUtTLTIwMTkxOlN1bW5lciBDb3VudHkgCitVUy1LUy0yMDE5MzpUaG9tYXMgQ291bnR5IAorVVMtS1MtMjAxOTU6VHJlZ28gQ291bnR5IAorVVMtS1MtMjAxOTc6V2FiYXVuc2VlIENvdW50eSAKK1VTLUtTLTIwMTk5OldhbGxhY2UgQ291bnR5IAorVVMtS1MtMjAyMDE6V2FzaGluZ3RvbiBDb3VudHkgCitVUy1LUy0yMDIwMzpXaWNoaXRhIENvdW50eSAKK1VTLUtTLTIwMjA1OldpbHNvbiBDb3VudHkgCitVUy1LUy0yMDIwNzpXb29kc29uIENvdW50eSAKK1VTLUtTLTIwMjA5Old5YW5kb3R0ZSBDb3VudHkgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEWzIxXTpLZW50dWNreSAKK1VTLUtZLTIxMDAxOkFkYWlyIENvdW50eSAKK1VTLUtZLTIxMDAzOkFsbGVuIENvdW50eSAKK1VTLUtZLTIxMDA1OkFuZGVyc29uIENvdW50eSAKK1VTLUtZLTIxMDA3OkJhbGxhcmQgQ291bnR5IAorVVMtS1ktMjEwMDk6QmFycmVuIENvdW50eSAKK1VTLUtZLTIxMDExOkJhdGggQ291bnR5IAorVVMtS1ktMjEwMTM6QmVsbCBDb3VudHkgCitVUy1LWS0yMTAxNTpCb29uZSBDb3VudHkgCitVUy1LWS0yMTAxNzpCb3VyYm9uIENvdW50eSAKK1VTLUtZLTIxMDE5OkJveWQgQ291bnR5IAorVVMtS1ktMjEwMjE6Qm95bGUgQ291bnR5IAorVVMtS1ktMjEwMjM6QnJhY2tlbiBDb3VudHkgCitVUy1LWS0yMTAyNTpCcmVhdGhpdHQgQ291bnR5IAorVVMtS1ktMjEwMjc6QnJlY2tpbnJpZGdlIENvdW50eSAKK1VTLUtZLTIxMDI5OkJ1bGxpdHQgQ291bnR5IAorVVMtS1ktMjEwMzE6QnV0bGVyIENvdW50eSAKK1VTLUtZLTIxMDMzOkNhbGR3ZWxsIENvdW50eSAKK1VTLUtZLTIxMDM1OkNhbGxvd2F5IENvdW50eSAKK1VTLUtZLTIxMDM3OkNhbXBiZWxsIENvdW50eSAKK1VTLUtZLTIxMDM5OkNhcmxpc2xlIENvdW50eSAKK1VTLUtZLTIxMDQxOkNhcnJvbGwgQ291bnR5IAorVVMtS1ktMjEwNDM6Q2FydGVyIENvdW50eSAKK1VTLUtZLTIxMDQ1OkNhc2V5IENvdW50eSAKK1VTLUtZLTIxMDQ3OkNocmlzdGlhbiBDb3VudHkgCitVUy1LWS0yMTA0OTpDbGFyayBDb3VudHkgCitVUy1LWS0yMTA1MTpDbGF5IENvdW50eSAKK1VTLUtZLTIxMDUzOkNsaW50b24gQ291bnR5IAorVVMtS1ktMjEwNTU6Q3JpdHRlbmRlbiBDb3VudHkgCitVUy1LWS0yMTA1NzpDdW1iZXJsYW5kIENvdW50eSAKK1VTLUtZLTIxMDU5OkRhdmllc3MgQ291bnR5IAorVVMtS1ktMjEwNjE6RWRtb25zb24gQ291bnR5IAorVVMtS1ktMjEwNjM6RWxsaW90dCBDb3VudHkgCitVUy1LWS0yMTA2NTpFc3RpbGwgQ291bnR5IAorVVMtS1ktMjEwNjc6RmF5ZXR0ZSBDb3VudHkgCitVUy1LWS0yMTA2OTpGbGVtaW5nIENvdW50eSAKK1VTLUtZLTIxMDcxOkZsb3lkIENvdW50eSAKK1VTLUtZLTIxMDczOkZyYW5rbGluIENvdW50eSAKK1VTLUtZLTIxMDc1OkZ1bHRvbiBDb3VudHkgCitVUy1LWS0yMTA3NzpHYWxsYXRpbiBDb3VudHkgCitVUy1LWS0yMTA3OTpHYXJyYXJkIENvdW50eSAKK1VTLUtZLTIxMDgxOkdyYW50IENvdW50eSAKK1VTLUtZLTIxMDgzOkdyYXZlcyBDb3VudHkgCitVUy1LWS0yMTA4NTpHcmF5c29uIENvdW50eSAKK1VTLUtZLTIxMDg3OkdyZWVuIENvdW50eSAKK1VTLUtZLTIxMDg5OkdyZWVudXAgQ291bnR5IAorVVMtS1ktMjEwOTE6SGFuY29jayBDb3VudHkgCitVUy1LWS0yMTA5MzpIYXJkaW4gQ291bnR5IAorVVMtS1ktMjEwOTU6SGFybGFuIENvdW50eSAKK1VTLUtZLTIxMDk3OkhhcnJpc29uIENvdW50eSAKK1VTLUtZLTIxMDk5OkhhcnQgQ291bnR5IAorVVMtS1ktMjExMDE6SGVuZGVyc29uIENvdW50eSAKK1VTLUtZLTIxMTAzOkhlbnJ5IENvdW50eSAKK1VTLUtZLTIxMTA1OkhpY2ttYW4gQ291bnR5IAorVVMtS1ktMjExMDc6SG9wa2lucyBDb3VudHkgCitVUy1LWS0yMTEwOTpKYWNrc29uIENvdW50eSAKK1VTLUtZLTIxMTExOkplZmZlcnNvbiBDb3VudHkgCitVUy1LWS0yMTExMzpKZXNzYW1pbmUgQ291bnR5IAorVVMtS1ktMjExMTU6Sm9obnNvbiBDb3VudHkgCitVUy1LWS0yMTExNzpLZW50b24gQ291bnR5IAorVVMtS1ktMjExMTk6S25vdHQgQ291bnR5IAorVVMtS1ktMjExMjE6S25veCBDb3VudHkgCitVUy1LWS0yMTEyMzpMYXJ1ZSBDb3VudHkgCitVUy1LWS0yMTEyNTpMYXVyZWwgQ291bnR5IAorVVMtS1ktMjExMjc6TGF3cmVuY2UgQ291bnR5IAorVVMtS1ktMjExMjk6TGVlIENvdW50eSAKK1VTLUtZLTIxMTMxOkxlc2xpZSBDb3VudHkgCitVUy1LWS0yMTEzMzpMZXRjaGVyIENvdW50eSAKK1VTLUtZLTIxMTM1Okxld2lzIENvdW50eSAKK1VTLUtZLTIxMTM3OkxpbmNvbG4gQ291bnR5IAorVVMtS1ktMjExMzk6TGl2aW5nc3RvbiBDb3VudHkgCitVUy1LWS0yMTE0MTpMb2dhbiBDb3VudHkgCitVUy1LWS0yMTE0MzpMeW9uIENvdW50eSAKK1VTLUtZLTIxMTQ1Ok1jQ3JhY2tlbiBDb3VudHkgCitVUy1LWS0yMTE0NzpNY0NyZWFyeSBDb3VudHkgCitVUy1LWS0yMTE0OTpNY0xlYW4gQ291bnR5IAorVVMtS1ktMjExNTE6TWFkaXNvbiBDb3VudHkgCitVUy1LWS0yMTE1MzpNYWdvZmZpbiBDb3VudHkgCitVUy1LWS0yMTE1NTpNYXJpb24gQ291bnR5IAorVVMtS1ktMjExNTc6TWFyc2hhbGwgQ291bnR5IAorVVMtS1ktMjExNTk6TWFydGluIENvdW50eSAKK1VTLUtZLTIxMTYxOk1hc29uIENvdW50eSAKK1VTLUtZLTIxMTYzOk1lYWRlIENvdW50eSAKK1VTLUtZLTIxMTY1Ok1lbmlmZWUgQ291bnR5IAorVVMtS1ktMjExNjc6TWVyY2VyIENvdW50eSAKK1VTLUtZLTIxMTY5Ok1ldGNhbGZlIENvdW50eSAKK1VTLUtZLTIxMTcxOk1vbnJvZSBDb3VudHkgCitVUy1LWS0yMTE3MzpNb250Z29tZXJ5IENvdW50eSAKK1VTLUtZLTIxMTc1Ok1vcmdhbiBDb3VudHkgCitVUy1LWS0yMTE3NzpNdWhsZW5iZXJnIENvdW50eSAKK1VTLUtZLTIxMTc5Ok5lbHNvbiBDb3VudHkgCitVUy1LWS0yMTE4MTpOaWNob2xhcyBDb3VudHkgCitVUy1LWS0yMTE4MzpPaGlvIENvdW50eSAKK1VTLUtZLTIxMTg1Ok9sZGhhbSBDb3VudHkgCitVUy1LWS0yMTE4NzpPd2VuIENvdW50eSAKK1VTLUtZLTIxMTg5Ok93c2xleSBDb3VudHkgCitVUy1LWS0yMTE5MTpQZW5kbGV0b24gQ291bnR5IAorVVMtS1ktMjExOTM6UGVycnkgQ291bnR5IAorVVMtS1ktMjExOTU6UGlrZSBDb3VudHkgCitVUy1LWS0yMTE5NzpQb3dlbGwgQ291bnR5IAorVVMtS1ktMjExOTk6UHVsYXNraSBDb3VudHkgCitVUy1LWS0yMTIwMTpSb2JlcnRzb24gQ291bnR5IAorVVMtS1ktMjEyMDM6Um9ja2Nhc3RsZSBDb3VudHkgCitVUy1LWS0yMTIwNTpSb3dhbiBDb3VudHkgCitVUy1LWS0yMTIwNzpSdXNzZWxsIENvdW50eSAKK1VTLUtZLTIxMjA5OlNjb3R0IENvdW50eSAKK1VTLUtZLTIxMjExOlNoZWxieSBDb3VudHkgCitVUy1LWS0yMTIxMzpTaW1wc29uIENvdW50eSAKK1VTLUtZLTIxMjE1OlNwZW5jZXIgQ291bnR5IAorVVMtS1ktMjEyMTc6VGF5bG9yIENvdW50eSAKK1VTLUtZLTIxMjE5OlRvZGQgQ291bnR5IAorVVMtS1ktMjEyMjE6VHJpZ2cgQ291bnR5IAorVVMtS1ktMjEyMjM6VHJpbWJsZSBDb3VudHkgCitVUy1LWS0yMTIyNTpVbmlvbiBDb3VudHkgCitVUy1LWS0yMTIyNzpXYXJyZW4gQ291bnR5IAorVVMtS1ktMjEyMjk6V2FzaGluZ3RvbiBDb3VudHkgCitVUy1LWS0yMTIzMTpXYXluZSBDb3VudHkgCitVUy1LWS0yMTIzMzpXZWJzdGVyIENvdW50eSAKK1VTLUtZLTIxMjM1OldoaXRsZXkgQ291bnR5IAorVVMtS1ktMjEyMzc6V29sZmUgQ291bnR5IAorVVMtS1ktMjEyMzk6V29vZGZvcmQgQ291bnR5IAorIyB1bmRlciBBZG1pbiBMZXZlbFsxXSBJRFsyMl06TG91aXNpYW5hIAorVVMtTEEtMjIwMDE6QWNhZGlhIFBhcmlzaCAKK1VTLUxBLTIyMDAzOkFsbGVuIFBhcmlzaCAKK1VTLUxBLTIyMDA1OkFzY2Vuc2lvbiBQYXJpc2ggCitVUy1MQS0yMjAwNzpBc3N1bXB0aW9uIFBhcmlzaCAKK1VTLUxBLTIyMDA5OkF2b3llbGxlcyBQYXJpc2ggCitVUy1MQS0yMjAxMTpCZWF1cmVnYXJkIFBhcmlzaCAKK1VTLUxBLTIyMDEzOkJpZW52aWxsZSBQYXJpc2ggCitVUy1MQS0yMjAxNTpCb3NzaWVyIFBhcmlzaCAKK1VTLUxBLTIyMDE3OkNhZGRvIFBhcmlzaCAKK1VTLUxBLTIyMDE5OkNhbGNhc2lldSBQYXJpc2ggCitVUy1MQS0yMjAyMTpDYWxkd2VsbCBQYXJpc2ggCitVUy1MQS0yMjAyMzpDYW1lcm9uIFBhcmlzaCAKK1VTLUxBLTIyMDI1OkNhdGFob3VsYSBQYXJpc2ggCitVUy1MQS0yMjAyNzpDbGFpYm9ybmUgUGFyaXNoIAorVVMtTEEtMjIwMjk6Q29uY29yZGlhIFBhcmlzaCAKK1VTLUxBLTIyMDMxOkRlIFNvdG8gUGFyaXNoIAorVVMtTEEtMjIwMzM6RWFzdCBCYXRvbiBSb3VnZSBQYXJpc2ggCitVUy1MQS0yMjAzNTpFYXN0IENhcnJvbGwgUGFyaXNoIAorVVMtTEEtMjIwMzc6RWFzdCBGZWxpY2lhbmEgUGFyaXNoIAorVVMtTEEtMjIwMzk6RXZhbmdlbGluZSBQYXJpc2ggCitVUy1MQS0yMjA0MTpGcmFua2xpbiBQYXJpc2ggCitVUy1MQS0yMjA0MzpHcmFudCBQYXJpc2ggCitVUy1MQS0yMjA0NTpJYmVyaWEgUGFyaXNoIAorVVMtTEEtMjIwNDc6SWJlcnZpbGxlIFBhcmlzaCAKK1VTLUxBLTIyMDQ5OkphY2tzb24gUGFyaXNoIAorVVMtTEEtMjIwNTE6SmVmZmVyc29uIFBhcmlzaCAKK1VTLUxBLTIyMDUzOkplZmZlcnNvbiBEYXZpcyBQYXJpc2ggCitVUy1MQS0yMjA1NTpMYWZheWV0dGUgUGFyaXNoIAorVVMtTEEtMjIwNTc6TGFmb3VyY2hlIFBhcmlzaCAKK1VTLUxBLTIyMDU5OkxhIFNhbGxlIFBhcmlzaCAKK1VTLUxBLTIyMDYxOkxpbmNvbG4gUGFyaXNoIAorVVMtTEEtMjIwNjM6TGl2aW5nc3RvbiBQYXJpc2ggCitVUy1MQS0yMjA2NTpNYWRpc29uIFBhcmlzaCAKK1VTLUxBLTIyMDY3Ok1vcmVob3VzZSBQYXJpc2ggCitVUy1MQS0yMjA2OTpOYXRjaGl0b2NoZXMgUGFyaXNoIAorVVMtTEEtMjIwNzE6T3JsZWFucyBQYXJpc2ggCitVUy1MQS0yMjA3MzpPdWFjaGl0YSBQYXJpc2ggCitVUy1MQS0yMjA3NTpQbGFxdWVtaW5lcyBQYXJpc2ggCitVUy1MQS0yMjA3NzpQb2ludGUgQ291cGVlIFBhcmlzaCAKK1VTLUxBLTIyMDc5OlJhcGlkZXMgUGFyaXNoIAorVVMtTEEtMjIwODE6UmVkIFJpdmVyIFBhcmlzaCAKK1VTLUxBLTIyMDgzOlJpY2hsYW5kIFBhcmlzaCAKK1VTLUxBLTIyMDg1OlNhYmluZSBQYXJpc2ggCitVUy1MQS0yMjA4NzpTdC4gQmVybmFyZCBQYXJpc2ggCitVUy1MQS0yMjA4OTpTdC4gQ2hhcmxlcyBQYXJpc2ggCitVUy1MQS0yMjA5MTpTdC4gSGVsZW5hIFBhcmlzaCAKK1VTLUxBLTIyMDkzOlN0LiBKYW1lcyBQYXJpc2ggCitVUy1MQS0yMjA5NTpTdC4gSm9obiB0aGUgQmFwdGlzdCBQYXJpc2ggCitVUy1MQS0yMjA5NzpTdC4gTGFuZHJ5IFBhcmlzaCAKK1VTLUxBLTIyMDk5OlN0LiBNYXJ0aW4gUGFyaXNoIAorVVMtTEEtMjIxMDE6U3QuIE1hcnkgUGFyaXNoIAorVVMtTEEtMjIxMDM6U3QuIFRhbW1hbnkgUGFyaXNoIAorVVMtTEEtMjIxMDU6VGFuZ2lwYWhvYSBQYXJpc2ggCitVUy1MQS0yMjEwNzpUZW5zYXMgUGFyaXNoIAorVVMtTEEtMjIxMDk6VGVycmVib25uZSBQYXJpc2ggCitVUy1MQS0yMjExMTpVbmlvbiBQYXJpc2ggCitVUy1MQS0yMjExMzpWZXJtaWxpb24gUGFyaXNoIAorVVMtTEEtMjIxMTU6VmVybm9uIFBhcmlzaCAKK1VTLUxBLTIyMTE3Oldhc2hpbmd0b24gUGFyaXNoIAorVVMtTEEtMjIxMTk6V2Vic3RlciBQYXJpc2ggCitVUy1MQS0yMjEyMTpXZXN0IEJhdG9uIFJvdWdlIFBhcmlzaCAKK1VTLUxBLTIyMTIzOldlc3QgQ2Fycm9sbCBQYXJpc2ggCitVUy1MQS0yMjEyNTpXZXN0IEZlbGljaWFuYSBQYXJpc2ggCitVUy1MQS0yMjEyNzpXaW5uIFBhcmlzaCAKKyMgdW5kZXIgQWRtaW4gTGV2ZWxbMV0gSURbMjVdOk1hc3NhY2h1c2V0dHMgCitVUy1NQS0yNTAwMTpCYXJuc3RhYmxlIENvdW50eSAKK1VTLU1BLTI1MDAzOkJlcmtzaGlyZSBDb3VudHkgCitVUy1NQS0yNTAwNTpCcmlzdG9sIENvdW50eSAKK1VTLU1BLTI1MDA3OkR1a2VzIENvdW50eSAKK1VTLU1BLTI1MDA5OkVzc2V4IENvdW50eSAKK1VTLU1BLTI1MDExOkZyYW5rbGluIENvdW50eSAKK1VTLU1BLTI1MDEzOkhhbXBkZW4gQ291bnR5IAorVVMtTUEtMjUwMTU6SGFtcHNoaXJlIENvdW50eSAKK1VTLU1BLTI1MDE3Ok1pZGRsZXNleCBDb3VudHkgCitVUy1NQS0yNTAxOTpOYW50dWNrZXQgQ291bnR5IAorVVMtTUEtMjUwMjE6Tm9yZm9sayBDb3VudHkgCitVUy1NQS0yNTAyMzpQbHltb3V0aCBDb3VudHkgCitVUy1NQS0yNTAyNTpTdWZmb2xrIENvdW50eSAKK1VTLU1BLTI1MDI3OldvcmNlc3RlciBDb3VudHkgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEWzI0XTpNYXJ5bGFuZCAKK1VTLU1ELTI0MDAxOkFsbGVnYW55IENvdW50eSAKK1VTLU1ELTI0MDAzOkFubmUgQXJ1bmRlbCBDb3VudHkgCitVUy1NRC0yNDAwNTpCYWx0aW1vcmUgQ291bnR5IAorVVMtTUQtMjQwMDk6Q2FsdmVydCBDb3VudHkgCitVUy1NRC0yNDAxMTpDYXJvbGluZSBDb3VudHkgCitVUy1NRC0yNDAxMzpDYXJyb2xsIENvdW50eSAKK1VTLU1ELTI0MDE1OkNlY2lsIENvdW50eSAKK1VTLU1ELTI0MDE3OkNoYXJsZXMgQ291bnR5IAorVVMtTUQtMjQwMTk6RG9yY2hlc3RlciBDb3VudHkgCitVUy1NRC0yNDAyMTpGcmVkZXJpY2sgQ291bnR5IAorVVMtTUQtMjQwMjM6R2FycmV0dCBDb3VudHkgCitVUy1NRC0yNDAyNTpIYXJmb3JkIENvdW50eSAKK1VTLU1ELTI0MDI3Okhvd2FyZCBDb3VudHkgCitVUy1NRC0yNDAyOTpLZW50IENvdW50eSAKK1VTLU1ELTI0MDMxOk1vbnRnb21lcnkgQ291bnR5IAorVVMtTUQtMjQwMzM6UHJpbmNlIEdlb3JnZSdzIENvdW50eSAKK1VTLU1ELTI0MDM1OlF1ZWVuIEFubmUncyBDb3VudHkgCitVUy1NRC0yNDAzNzpTdC4gTWFyeSdzIENvdW50eSAKK1VTLU1ELTI0MDM5OlNvbWVyc2V0IENvdW50eSAKK1VTLU1ELTI0MDQxOlRhbGJvdCBDb3VudHkgCitVUy1NRC0yNDA0MzpXYXNoaW5ndG9uIENvdW50eSAKK1VTLU1ELTI0MDQ1OldpY29taWNvIENvdW50eSAKK1VTLU1ELTI0MDQ3OldvcmNlc3RlciBDb3VudHkgCitVUy1NRC0yNDUxMDpCYWx0aW1vcmUgY2l0eSAKKyMgdW5kZXIgQWRtaW4gTGV2ZWxbMV0gSURbMjNdOk1haW5lIAorVVMtTUUtMjMwMDE6QW5kcm9zY29nZ2luIENvdW50eSAKK1VTLU1FLTIzMDAzOkFyb29zdG9vayBDb3VudHkgCitVUy1NRS0yMzAwNTpDdW1iZXJsYW5kIENvdW50eSAKK1VTLU1FLTIzMDA3OkZyYW5rbGluIENvdW50eSAKK1VTLU1FLTIzMDA5OkhhbmNvY2sgQ291bnR5IAorVVMtTUUtMjMwMTE6S2VubmViZWMgQ291bnR5IAorVVMtTUUtMjMwMTM6S25veCBDb3VudHkgCitVUy1NRS0yMzAxNTpMaW5jb2xuIENvdW50eSAKK1VTLU1FLTIzMDE3Ok94Zm9yZCBDb3VudHkgCitVUy1NRS0yMzAxOTpQZW5vYnNjb3QgQ291bnR5IAorVVMtTUUtMjMwMjE6UGlzY2F0YXF1aXMgQ291bnR5IAorVVMtTUUtMjMwMjM6U2FnYWRhaG9jIENvdW50eSAKK1VTLU1FLTIzMDI1OlNvbWVyc2V0IENvdW50eSAKK1VTLU1FLTIzMDI3OldhbGRvIENvdW50eSAKK1VTLU1FLTIzMDI5Oldhc2hpbmd0b24gQ291bnR5IAorVVMtTUUtMjMwMzE6WW9yayBDb3VudHkgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEWzI2XTpNaWNoaWdhbiAKK1VTLU1JLTI2MDAxOkFsY29uYSBDb3VudHkgCitVUy1NSS0yNjAwMzpBbGdlciBDb3VudHkgCitVUy1NSS0yNjAwNTpBbGxlZ2FuIENvdW50eSAKK1VTLU1JLTI2MDA3OkFscGVuYSBDb3VudHkgCitVUy1NSS0yNjAwOTpBbnRyaW0gQ291bnR5IAorVVMtTUktMjYwMTE6QXJlbmFjIENvdW50eSAKK1VTLU1JLTI2MDEzOkJhcmFnYSBDb3VudHkgCitVUy1NSS0yNjAxNTpCYXJyeSBDb3VudHkgCitVUy1NSS0yNjAxNzpCYXkgQ291bnR5IAorVVMtTUktMjYwMTk6QmVuemllIENvdW50eSAKK1VTLU1JLTI2MDIxOkJlcnJpZW4gQ291bnR5IAorVVMtTUktMjYwMjM6QnJhbmNoIENvdW50eSAKK1VTLU1JLTI2MDI1OkNhbGhvdW4gQ291bnR5IAorVVMtTUktMjYwMjc6Q2FzcyBDb3VudHkgCitVUy1NSS0yNjAyOTpDaGFybGV2b2l4IENvdW50eSAKK1VTLU1JLTI2MDMxOkNoZWJveWdhbiBDb3VudHkgCitVUy1NSS0yNjAzMzpDaGlwcGV3YSBDb3VudHkgCitVUy1NSS0yNjAzNTpDbGFyZSBDb3VudHkgCitVUy1NSS0yNjAzNzpDbGludG9uIENvdW50eSAKK1VTLU1JLTI2MDM5OkNyYXdmb3JkIENvdW50eSAKK1VTLU1JLTI2MDQxOkRlbHRhIENvdW50eSAKK1VTLU1JLTI2MDQzOkRpY2tpbnNvbiBDb3VudHkgCitVUy1NSS0yNjA0NTpFYXRvbiBDb3VudHkgCitVUy1NSS0yNjA0NzpFbW1ldCBDb3VudHkgCitVUy1NSS0yNjA0OTpHZW5lc2VlIENvdW50eSAKK1VTLU1JLTI2MDUxOkdsYWR3aW4gQ291bnR5IAorVVMtTUktMjYwNTM6R29nZWJpYyBDb3VudHkgCitVUy1NSS0yNjA1NTpHcmFuZCBUcmF2ZXJzZSBDb3VudHkgCitVUy1NSS0yNjA1NzpHcmF0aW90IENvdW50eSAKK1VTLU1JLTI2MDU5OkhpbGxzZGFsZSBDb3VudHkgCitVUy1NSS0yNjA2MTpIb3VnaHRvbiBDb3VudHkgCitVUy1NSS0yNjA2MzpIdXJvbiBDb3VudHkgCitVUy1NSS0yNjA2NTpJbmdoYW0gQ291bnR5IAorVVMtTUktMjYwNjc6SW9uaWEgQ291bnR5IAorVVMtTUktMjYwNjk6SW9zY28gQ291bnR5IAorVVMtTUktMjYwNzE6SXJvbiBDb3VudHkgCitVUy1NSS0yNjA3MzpJc2FiZWxsYSBDb3VudHkgCitVUy1NSS0yNjA3NTpKYWNrc29uIENvdW50eSAKK1VTLU1JLTI2MDc3OkthbGFtYXpvbyBDb3VudHkgCitVUy1NSS0yNjA3OTpLYWxrYXNrYSBDb3VudHkgCitVUy1NSS0yNjA4MTpLZW50IENvdW50eSAKK1VTLU1JLTI2MDgzOktld2VlbmF3IENvdW50eSAKK1VTLU1JLTI2MDg1Okxha2UgQ291bnR5IAorVVMtTUktMjYwODc6TGFwZWVyIENvdW50eSAKK1VTLU1JLTI2MDg5OkxlZWxhbmF1IENvdW50eSAKK1VTLU1JLTI2MDkxOkxlbmF3ZWUgQ291bnR5IAorVVMtTUktMjYwOTM6TGl2aW5nc3RvbiBDb3VudHkgCitVUy1NSS0yNjA5NTpMdWNlIENvdW50eSAKK1VTLU1JLTI2MDk3Ok1hY2tpbmFjIENvdW50eSAKK1VTLU1JLTI2MDk5Ok1hY29tYiBDb3VudHkgCitVUy1NSS0yNjEwMTpNYW5pc3RlZSBDb3VudHkgCitVUy1NSS0yNjEwMzpNYXJxdWV0dGUgQ291bnR5IAorVVMtTUktMjYxMDU6TWFzb24gQ291bnR5IAorVVMtTUktMjYxMDc6TWVjb3N0YSBDb3VudHkgCitVUy1NSS0yNjEwOTpNZW5vbWluZWUgQ291bnR5IAorVVMtTUktMjYxMTE6TWlkbGFuZCBDb3VudHkgCitVUy1NSS0yNjExMzpNaXNzYXVrZWUgQ291bnR5IAorVVMtTUktMjYxMTU6TW9ucm9lIENvdW50eSAKK1VTLU1JLTI2MTE3Ok1vbnRjYWxtIENvdW50eSAKK1VTLU1JLTI2MTE5Ok1vbnRtb3JlbmN5IENvdW50eSAKK1VTLU1JLTI2MTIxOk11c2tlZ29uIENvdW50eSAKK1VTLU1JLTI2MTIzOk5ld2F5Z28gQ291bnR5IAorVVMtTUktMjYxMjU6T2FrbGFuZCBDb3VudHkgCitVUy1NSS0yNjEyNzpPY2VhbmEgQ291bnR5IAorVVMtTUktMjYxMjk6T2dlbWF3IENvdW50eSAKK1VTLU1JLTI2MTMxOk9udG9uYWdvbiBDb3VudHkgCitVUy1NSS0yNjEzMzpPc2Nlb2xhIENvdW50eSAKK1VTLU1JLTI2MTM1Ok9zY29kYSBDb3VudHkgCitVUy1NSS0yNjEzNzpPdHNlZ28gQ291bnR5IAorVVMtTUktMjYxMzk6T3R0YXdhIENvdW50eSAKK1VTLU1JLTI2MTQxOlByZXNxdWUgSXNsZSBDb3VudHkgCitVUy1NSS0yNjE0MzpSb3Njb21tb24gQ291bnR5IAorVVMtTUktMjYxNDU6U2FnaW5hdyBDb3VudHkgCitVUy1NSS0yNjE0NzpTdC4gQ2xhaXIgQ291bnR5IAorVVMtTUktMjYxNDk6U3QuIEpvc2VwaCBDb3VudHkgCitVUy1NSS0yNjE1MTpTYW5pbGFjIENvdW50eSAKK1VTLU1JLTI2MTUzOlNjaG9vbGNyYWZ0IENvdW50eSAKK1VTLU1JLTI2MTU1OlNoaWF3YXNzZWUgQ291bnR5IAorVVMtTUktMjYxNTc6VHVzY29sYSBDb3VudHkgCitVUy1NSS0yNjE1OTpWYW4gQnVyZW4gQ291bnR5IAorVVMtTUktMjYxNjE6V2FzaHRlbmF3IENvdW50eSAKK1VTLU1JLTI2MTYzOldheW5lIENvdW50eSAKK1VTLU1JLTI2MTY1OldleGZvcmQgQ291bnR5IAorIyB1bmRlciBBZG1pbiBMZXZlbFsxXSBJRFsyN106TWlubmVzb3RhIAorVVMtTU4tMjcwMDE6QWl0a2luIENvdW50eSAKK1VTLU1OLTI3MDAzOkFub2thIENvdW50eSAKK1VTLU1OLTI3MDA1OkJlY2tlciBDb3VudHkgCitVUy1NTi0yNzAwNzpCZWx0cmFtaSBDb3VudHkgCitVUy1NTi0yNzAwOTpCZW50b24gQ291bnR5IAorVVMtTU4tMjcwMTE6QmlnIFN0b25lIENvdW50eSAKK1VTLU1OLTI3MDEzOkJsdWUgRWFydGggQ291bnR5IAorVVMtTU4tMjcwMTU6QnJvd24gQ291bnR5IAorVVMtTU4tMjcwMTc6Q2FybHRvbiBDb3VudHkgCitVUy1NTi0yNzAxOTpDYXJ2ZXIgQ291bnR5IAorVVMtTU4tMjcwMjE6Q2FzcyBDb3VudHkgCitVUy1NTi0yNzAyMzpDaGlwcGV3YSBDb3VudHkgCitVUy1NTi0yNzAyNTpDaGlzYWdvIENvdW50eSAKK1VTLU1OLTI3MDI3OkNsYXkgQ291bnR5IAorVVMtTU4tMjcwMjk6Q2xlYXJ3YXRlciBDb3VudHkgCitVUy1NTi0yNzAzMTpDb29rIENvdW50eSAKK1VTLU1OLTI3MDMzOkNvdHRvbndvb2QgQ291bnR5IAorVVMtTU4tMjcwMzU6Q3JvdyBXaW5nIENvdW50eSAKK1VTLU1OLTI3MDM3OkRha290YSBDb3VudHkgCitVUy1NTi0yNzAzOTpEb2RnZSBDb3VudHkgCitVUy1NTi0yNzA0MTpEb3VnbGFzIENvdW50eSAKK1VTLU1OLTI3MDQzOkZhcmliYXVsdCBDb3VudHkgCitVUy1NTi0yNzA0NTpGaWxsbW9yZSBDb3VudHkgCitVUy1NTi0yNzA0NzpGcmVlYm9ybiBDb3VudHkgCitVUy1NTi0yNzA0OTpHb29kaHVlIENvdW50eSAKK1VTLU1OLTI3MDUxOkdyYW50IENvdW50eSAKK1VTLU1OLTI3MDUzOkhlbm5lcGluIENvdW50eSAKK1VTLU1OLTI3MDU1OkhvdXN0b24gQ291bnR5IAorVVMtTU4tMjcwNTc6SHViYmFyZCBDb3VudHkgCitVUy1NTi0yNzA1OTpJc2FudGkgQ291bnR5IAorVVMtTU4tMjcwNjE6SXRhc2NhIENvdW50eSAKK1VTLU1OLTI3MDYzOkphY2tzb24gQ291bnR5IAorVVMtTU4tMjcwNjU6S2FuYWJlYyBDb3VudHkgCitVUy1NTi0yNzA2NzpLYW5kaXlvaGkgQ291bnR5IAorVVMtTU4tMjcwNjk6S2l0dHNvbiBDb3VudHkgCitVUy1NTi0yNzA3MTpLb29jaGljaGluZyBDb3VudHkgCitVUy1NTi0yNzA3MzpMYWMgcXVpIFBhcmxlIENvdW50eSAKK1VTLU1OLTI3MDc1Okxha2UgQ291bnR5IAorVVMtTU4tMjcwNzc6TGFrZSBvZiB0aGUgV29vZHMgQ291bnR5IAorVVMtTU4tMjcwNzk6TGUgU3VldXIgQ291bnR5IAorVVMtTU4tMjcwODE6TGluY29sbiBDb3VudHkgCitVUy1NTi0yNzA4MzpMeW9uIENvdW50eSAKK1VTLU1OLTI3MDg1Ok1jTGVvZCBDb3VudHkgCitVUy1NTi0yNzA4NzpNYWhub21lbiBDb3VudHkgCitVUy1NTi0yNzA4OTpNYXJzaGFsbCBDb3VudHkgCitVUy1NTi0yNzA5MTpNYXJ0aW4gQ291bnR5IAorVVMtTU4tMjcwOTM6TWVla2VyIENvdW50eSAKK1VTLU1OLTI3MDk1Ok1pbGxlIExhY3MgQ291bnR5IAorVVMtTU4tMjcwOTc6TW9ycmlzb24gQ291bnR5IAorVVMtTU4tMjcwOTk6TW93ZXIgQ291bnR5IAorVVMtTU4tMjcxMDE6TXVycmF5IENvdW50eSAKK1VTLU1OLTI3MTAzOk5pY29sbGV0IENvdW50eSAKK1VTLU1OLTI3MTA1Ok5vYmxlcyBDb3VudHkgCitVUy1NTi0yNzEwNzpOb3JtYW4gQ291bnR5IAorVVMtTU4tMjcxMDk6T2xtc3RlZCBDb3VudHkgCitVUy1NTi0yNzExMTpPdHRlciBUYWlsIENvdW50eSAKK1VTLU1OLTI3MTEzOlBlbm5pbmd0b24gQ291bnR5IAorVVMtTU4tMjcxMTU6UGluZSBDb3VudHkgCitVUy1NTi0yNzExNzpQaXBlc3RvbmUgQ291bnR5IAorVVMtTU4tMjcxMTk6UG9sayBDb3VudHkgCitVUy1NTi0yNzEyMTpQb3BlIENvdW50eSAKK1VTLU1OLTI3MTIzOlJhbXNleSBDb3VudHkgCitVUy1NTi0yNzEyNTpSZWQgTGFrZSBDb3VudHkgCitVUy1NTi0yNzEyNzpSZWR3b29kIENvdW50eSAKK1VTLU1OLTI3MTI5OlJlbnZpbGxlIENvdW50eSAKK1VTLU1OLTI3MTMxOlJpY2UgQ291bnR5IAorVVMtTU4tMjcxMzM6Um9jayBDb3VudHkgCitVUy1NTi0yNzEzNTpSb3NlYXUgQ291bnR5IAorVVMtTU4tMjcxMzc6U3QuIExvdWlzIENvdW50eSAKK1VTLU1OLTI3MTM5OlNjb3R0IENvdW50eSAKK1VTLU1OLTI3MTQxOlNoZXJidXJuZSBDb3VudHkgCitVUy1NTi0yNzE0MzpTaWJsZXkgQ291bnR5IAorVVMtTU4tMjcxNDU6U3RlYXJucyBDb3VudHkgCitVUy1NTi0yNzE0NzpTdGVlbGUgQ291bnR5IAorVVMtTU4tMjcxNDk6U3RldmVucyBDb3VudHkgCitVUy1NTi0yNzE1MTpTd2lmdCBDb3VudHkgCitVUy1NTi0yNzE1MzpUb2RkIENvdW50eSAKK1VTLU1OLTI3MTU1OlRyYXZlcnNlIENvdW50eSAKK1VTLU1OLTI3MTU3OldhYmFzaGEgQ291bnR5IAorVVMtTU4tMjcxNTk6V2FkZW5hIENvdW50eSAKK1VTLU1OLTI3MTYxOldhc2VjYSBDb3VudHkgCitVUy1NTi0yNzE2MzpXYXNoaW5ndG9uIENvdW50eSAKK1VTLU1OLTI3MTY1OldhdG9ud2FuIENvdW50eSAKK1VTLU1OLTI3MTY3OldpbGtpbiBDb3VudHkgCitVUy1NTi0yNzE2OTpXaW5vbmEgQ291bnR5IAorVVMtTU4tMjcxNzE6V3JpZ2h0IENvdW50eSAKK1VTLU1OLTI3MTczOlllbGxvdyBNZWRpY2luZSBDb3VudHkgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEWzI5XTpNaXNzb3VyaSAKK1VTLU1PLTI5MDAxOkFkYWlyIENvdW50eSAKK1VTLU1PLTI5MDAzOkFuZHJldyBDb3VudHkgCitVUy1NTy0yOTAwNTpBdGNoaXNvbiBDb3VudHkgCitVUy1NTy0yOTAwNzpBdWRyYWluIENvdW50eSAKK1VTLU1PLTI5MDA5OkJhcnJ5IENvdW50eSAKK1VTLU1PLTI5MDExOkJhcnRvbiBDb3VudHkgCitVUy1NTy0yOTAxMzpCYXRlcyBDb3VudHkgCitVUy1NTy0yOTAxNTpCZW50b24gQ291bnR5IAorVVMtTU8tMjkwMTc6Qm9sbGluZ2VyIENvdW50eSAKK1VTLU1PLTI5MDE5OkJvb25lIENvdW50eSAKK1VTLU1PLTI5MDIxOkJ1Y2hhbmFuIENvdW50eSAKK1VTLU1PLTI5MDIzOkJ1dGxlciBDb3VudHkgCitVUy1NTy0yOTAyNTpDYWxkd2VsbCBDb3VudHkgCitVUy1NTy0yOTAyNzpDYWxsYXdheSBDb3VudHkgCitVUy1NTy0yOTAyOTpDYW1kZW4gQ291bnR5IAorVVMtTU8tMjkwMzE6Q2FwZSBHaXJhcmRlYXUgQ291bnR5IAorVVMtTU8tMjkwMzM6Q2Fycm9sbCBDb3VudHkgCitVUy1NTy0yOTAzNTpDYXJ0ZXIgQ291bnR5IAorVVMtTU8tMjkwMzc6Q2FzcyBDb3VudHkgCitVUy1NTy0yOTAzOTpDZWRhciBDb3VudHkgCitVUy1NTy0yOTA0MTpDaGFyaXRvbiBDb3VudHkgCitVUy1NTy0yOTA0MzpDaHJpc3RpYW4gQ291bnR5IAorVVMtTU8tMjkwNDU6Q2xhcmsgQ291bnR5IAorVVMtTU8tMjkwNDc6Q2xheSBDb3VudHkgCitVUy1NTy0yOTA0OTpDbGludG9uIENvdW50eSAKK1VTLU1PLTI5MDUxOkNvbGUgQ291bnR5IAorVVMtTU8tMjkwNTM6Q29vcGVyIENvdW50eSAKK1VTLU1PLTI5MDU1OkNyYXdmb3JkIENvdW50eSAKK1VTLU1PLTI5MDU3OkRhZGUgQ291bnR5IAorVVMtTU8tMjkwNTk6RGFsbGFzIENvdW50eSAKK1VTLU1PLTI5MDYxOkRhdmllc3MgQ291bnR5IAorVVMtTU8tMjkwNjM6RGVLYWxiIENvdW50eSAKK1VTLU1PLTI5MDY1OkRlbnQgQ291bnR5IAorVVMtTU8tMjkwNjc6RG91Z2xhcyBDb3VudHkgCitVUy1NTy0yOTA2OTpEdW5rbGluIENvdW50eSAKK1VTLU1PLTI5MDcxOkZyYW5rbGluIENvdW50eSAKK1VTLU1PLTI5MDczOkdhc2NvbmFkZSBDb3VudHkgCitVUy1NTy0yOTA3NTpHZW50cnkgQ291bnR5IAorVVMtTU8tMjkwNzc6R3JlZW5lIENvdW50eSAKK1VTLU1PLTI5MDc5OkdydW5keSBDb3VudHkgCitVUy1NTy0yOTA4MTpIYXJyaXNvbiBDb3VudHkgCitVUy1NTy0yOTA4MzpIZW5yeSBDb3VudHkgCitVUy1NTy0yOTA4NTpIaWNrb3J5IENvdW50eSAKK1VTLU1PLTI5MDg3OkhvbHQgQ291bnR5IAorVVMtTU8tMjkwODk6SG93YXJkIENvdW50eSAKK1VTLU1PLTI5MDkxOkhvd2VsbCBDb3VudHkgCitVUy1NTy0yOTA5MzpJcm9uIENvdW50eSAKK1VTLU1PLTI5MDk1OkphY2tzb24gQ291bnR5IAorVVMtTU8tMjkwOTc6SmFzcGVyIENvdW50eSAKK1VTLU1PLTI5MDk5OkplZmZlcnNvbiBDb3VudHkgCitVUy1NTy0yOTEwMTpKb2huc29uIENvdW50eSAKK1VTLU1PLTI5MTAzOktub3ggQ291bnR5IAorVVMtTU8tMjkxMDU6TGFjbGVkZSBDb3VudHkgCitVUy1NTy0yOTEwNzpMYWZheWV0dGUgQ291bnR5IAorVVMtTU8tMjkxMDk6TGF3cmVuY2UgQ291bnR5IAorVVMtTU8tMjkxMTE6TGV3aXMgQ291bnR5IAorVVMtTU8tMjkxMTM6TGluY29sbiBDb3VudHkgCitVUy1NTy0yOTExNTpMaW5uIENvdW50eSAKK1VTLU1PLTI5MTE3OkxpdmluZ3N0b24gQ291bnR5IAorVVMtTU8tMjkxMTk6TWNEb25hbGQgQ291bnR5IAorVVMtTU8tMjkxMjE6TWFjb24gQ291bnR5IAorVVMtTU8tMjkxMjM6TWFkaXNvbiBDb3VudHkgCitVUy1NTy0yOTEyNTpNYXJpZXMgQ291bnR5IAorVVMtTU8tMjkxMjc6TWFyaW9uIENvdW50eSAKK1VTLU1PLTI5MTI5Ok1lcmNlciBDb3VudHkgCitVUy1NTy0yOTEzMTpNaWxsZXIgQ291bnR5IAorVVMtTU8tMjkxMzM6TWlzc2lzc2lwcGkgQ291bnR5IAorVVMtTU8tMjkxMzU6TW9uaXRlYXUgQ291bnR5IAorVVMtTU8tMjkxMzc6TW9ucm9lIENvdW50eSAKK1VTLU1PLTI5MTM5Ok1vbnRnb21lcnkgQ291bnR5IAorVVMtTU8tMjkxNDE6TW9yZ2FuIENvdW50eSAKK1VTLU1PLTI5MTQzOk5ldyBNYWRyaWQgQ291bnR5IAorVVMtTU8tMjkxNDU6TmV3dG9uIENvdW50eSAKK1VTLU1PLTI5MTQ3Ok5vZGF3YXkgQ291bnR5IAorVVMtTU8tMjkxNDk6T3JlZ29uIENvdW50eSAKK1VTLU1PLTI5MTUxOk9zYWdlIENvdW50eSAKK1VTLU1PLTI5MTUzOk96YXJrIENvdW50eSAKK1VTLU1PLTI5MTU1OlBlbWlzY290IENvdW50eSAKK1VTLU1PLTI5MTU3OlBlcnJ5IENvdW50eSAKK1VTLU1PLTI5MTU5OlBldHRpcyBDb3VudHkgCitVUy1NTy0yOTE2MTpQaGVscHMgQ291bnR5IAorVVMtTU8tMjkxNjM6UGlrZSBDb3VudHkgCitVUy1NTy0yOTE2NTpQbGF0dGUgQ291bnR5IAorVVMtTU8tMjkxNjc6UG9sayBDb3VudHkgCitVUy1NTy0yOTE2OTpQdWxhc2tpIENvdW50eSAKK1VTLU1PLTI5MTcxOlB1dG5hbSBDb3VudHkgCitVUy1NTy0yOTE3MzpSYWxscyBDb3VudHkgCitVUy1NTy0yOTE3NTpSYW5kb2xwaCBDb3VudHkgCitVUy1NTy0yOTE3NzpSYXkgQ291bnR5IAorVVMtTU8tMjkxNzk6UmV5bm9sZHMgQ291bnR5IAorVVMtTU8tMjkxODE6UmlwbGV5IENvdW50eSAKK1VTLU1PLTI5MTgzOlN0LiBDaGFybGVzIENvdW50eSAKK1VTLU1PLTI5MTg1OlN0LiBDbGFpciBDb3VudHkgCitVUy1NTy0yOTE4NjpTdGUuIEdlbmV2aWV2ZSBDb3VudHkgCitVUy1NTy0yOTE4NzpTdC4gRnJhbmNvaXMgQ291bnR5IAorVVMtTU8tMjkxODk6U3QuIExvdWlzIENvdW50eSAKK1VTLU1PLTI5MTk1OlNhbGluZSBDb3VudHkgCitVUy1NTy0yOTE5NzpTY2h1eWxlciBDb3VudHkgCitVUy1NTy0yOTE5OTpTY290bGFuZCBDb3VudHkgCitVUy1NTy0yOTIwMTpTY290dCBDb3VudHkgCitVUy1NTy0yOTIwMzpTaGFubm9uIENvdW50eSAKK1VTLU1PLTI5MjA1OlNoZWxieSBDb3VudHkgCitVUy1NTy0yOTIwNzpTdG9kZGFyZCBDb3VudHkgCitVUy1NTy0yOTIwOTpTdG9uZSBDb3VudHkgCitVUy1NTy0yOTIxMTpTdWxsaXZhbiBDb3VudHkgCitVUy1NTy0yOTIxMzpUYW5leSBDb3VudHkgCitVUy1NTy0yOTIxNTpUZXhhcyBDb3VudHkgCitVUy1NTy0yOTIxNzpWZXJub24gQ291bnR5IAorVVMtTU8tMjkyMTk6V2FycmVuIENvdW50eSAKK1VTLU1PLTI5MjIxOldhc2hpbmd0b24gQ291bnR5IAorVVMtTU8tMjkyMjM6V2F5bmUgQ291bnR5IAorVVMtTU8tMjkyMjU6V2Vic3RlciBDb3VudHkgCitVUy1NTy0yOTIyNzpXb3J0aCBDb3VudHkgCitVUy1NTy0yOTIyOTpXcmlnaHQgQ291bnR5IAorVVMtTU8tMjk1MTA6U3QuIExvdWlzIGNpdHkgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEWzI4XTpNaXNzaXNzaXBwaSAKK1VTLU1TLTI4MDAxOkFkYW1zIENvdW50eSAKK1VTLU1TLTI4MDAzOkFsY29ybiBDb3VudHkgCitVUy1NUy0yODAwNTpBbWl0ZSBDb3VudHkgCitVUy1NUy0yODAwNzpBdHRhbGEgQ291bnR5IAorVVMtTVMtMjgwMDk6QmVudG9uIENvdW50eSAKK1VTLU1TLTI4MDExOkJvbGl2YXIgQ291bnR5IAorVVMtTVMtMjgwMTM6Q2FsaG91biBDb3VudHkgCitVUy1NUy0yODAxNTpDYXJyb2xsIENvdW50eSAKK1VTLU1TLTI4MDE3OkNoaWNrYXNhdyBDb3VudHkgCitVUy1NUy0yODAxOTpDaG9jdGF3IENvdW50eSAKK1VTLU1TLTI4MDIxOkNsYWlib3JuZSBDb3VudHkgCitVUy1NUy0yODAyMzpDbGFya2UgQ291bnR5IAorVVMtTVMtMjgwMjU6Q2xheSBDb3VudHkgCitVUy1NUy0yODAyNzpDb2Fob21hIENvdW50eSAKK1VTLU1TLTI4MDI5OkNvcGlhaCBDb3VudHkgCitVUy1NUy0yODAzMTpDb3Zpbmd0b24gQ291bnR5IAorVVMtTVMtMjgwMzM6RGVTb3RvIENvdW50eSAKK1VTLU1TLTI4MDM1OkZvcnJlc3QgQ291bnR5IAorVVMtTVMtMjgwMzc6RnJhbmtsaW4gQ291bnR5IAorVVMtTVMtMjgwMzk6R2VvcmdlIENvdW50eSAKK1VTLU1TLTI4MDQxOkdyZWVuZSBDb3VudHkgCitVUy1NUy0yODA0MzpHcmVuYWRhIENvdW50eSAKK1VTLU1TLTI4MDQ1OkhhbmNvY2sgQ291bnR5IAorVVMtTVMtMjgwNDc6SGFycmlzb24gQ291bnR5IAorVVMtTVMtMjgwNDk6SGluZHMgQ291bnR5IAorVVMtTVMtMjgwNTE6SG9sbWVzIENvdW50eSAKK1VTLU1TLTI4MDUzOkh1bXBocmV5cyBDb3VudHkgCitVUy1NUy0yODA1NTpJc3NhcXVlbmEgQ291bnR5IAorVVMtTVMtMjgwNTc6SXRhd2FtYmEgQ291bnR5IAorVVMtTVMtMjgwNTk6SmFja3NvbiBDb3VudHkgCitVUy1NUy0yODA2MTpKYXNwZXIgQ291bnR5IAorVVMtTVMtMjgwNjM6SmVmZmVyc29uIENvdW50eSAKK1VTLU1TLTI4MDY1OkplZmZlcnNvbiBEYXZpcyBDb3VudHkgCitVUy1NUy0yODA2NzpKb25lcyBDb3VudHkgCitVUy1NUy0yODA2OTpLZW1wZXIgQ291bnR5IAorVVMtTVMtMjgwNzE6TGFmYXlldHRlIENvdW50eSAKK1VTLU1TLTI4MDczOkxhbWFyIENvdW50eSAKK1VTLU1TLTI4MDc1OkxhdWRlcmRhbGUgQ291bnR5IAorVVMtTVMtMjgwNzc6TGF3cmVuY2UgQ291bnR5IAorVVMtTVMtMjgwNzk6TGVha2UgQ291bnR5IAorVVMtTVMtMjgwODE6TGVlIENvdW50eSAKK1VTLU1TLTI4MDgzOkxlZmxvcmUgQ291bnR5IAorVVMtTVMtMjgwODU6TGluY29sbiBDb3VudHkgCitVUy1NUy0yODA4NzpMb3duZGVzIENvdW50eSAKK1VTLU1TLTI4MDg5Ok1hZGlzb24gQ291bnR5IAorVVMtTVMtMjgwOTE6TWFyaW9uIENvdW50eSAKK1VTLU1TLTI4MDkzOk1hcnNoYWxsIENvdW50eSAKK1VTLU1TLTI4MDk1Ok1vbnJvZSBDb3VudHkgCitVUy1NUy0yODA5NzpNb250Z29tZXJ5IENvdW50eSAKK1VTLU1TLTI4MDk5Ok5lc2hvYmEgQ291bnR5IAorVVMtTVMtMjgxMDE6TmV3dG9uIENvdW50eSAKK1VTLU1TLTI4MTAzOk5veHViZWUgQ291bnR5IAorVVMtTVMtMjgxMDU6T2t0aWJiZWhhIENvdW50eSAKK1VTLU1TLTI4MTA3OlBhbm9sYSBDb3VudHkgCitVUy1NUy0yODEwOTpQZWFybCBSaXZlciBDb3VudHkgCitVUy1NUy0yODExMTpQZXJyeSBDb3VudHkgCitVUy1NUy0yODExMzpQaWtlIENvdW50eSAKK1VTLU1TLTI4MTE1OlBvbnRvdG9jIENvdW50eSAKK1VTLU1TLTI4MTE3OlByZW50aXNzIENvdW50eSAKK1VTLU1TLTI4MTE5OlF1aXRtYW4gQ291bnR5IAorVVMtTVMtMjgxMjE6UmFua2luIENvdW50eSAKK1VTLU1TLTI4MTIzOlNjb3R0IENvdW50eSAKK1VTLU1TLTI4MTI1OlNoYXJrZXkgQ291bnR5IAorVVMtTVMtMjgxMjc6U2ltcHNvbiBDb3VudHkgCitVUy1NUy0yODEyOTpTbWl0aCBDb3VudHkgCitVUy1NUy0yODEzMTpTdG9uZSBDb3VudHkgCitVUy1NUy0yODEzMzpTdW5mbG93ZXIgQ291bnR5IAorVVMtTVMtMjgxMzU6VGFsbGFoYXRjaGllIENvdW50eSAKK1VTLU1TLTI4MTM3OlRhdGUgQ291bnR5IAorVVMtTVMtMjgxMzk6VGlwcGFoIENvdW50eSAKK1VTLU1TLTI4MTQxOlRpc2hvbWluZ28gQ291bnR5IAorVVMtTVMtMjgxNDM6VHVuaWNhIENvdW50eSAKK1VTLU1TLTI4MTQ1OlVuaW9uIENvdW50eSAKK1VTLU1TLTI4MTQ3OldhbHRoYWxsIENvdW50eSAKK1VTLU1TLTI4MTQ5OldhcnJlbiBDb3VudHkgCitVUy1NUy0yODE1MTpXYXNoaW5ndG9uIENvdW50eSAKK1VTLU1TLTI4MTUzOldheW5lIENvdW50eSAKK1VTLU1TLTI4MTU1OldlYnN0ZXIgQ291bnR5IAorVVMtTVMtMjgxNTc6V2lsa2luc29uIENvdW50eSAKK1VTLU1TLTI4MTU5OldpbnN0b24gQ291bnR5IAorVVMtTVMtMjgxNjE6WWFsb2J1c2hhIENvdW50eSAKK1VTLU1TLTI4MTYzOllhem9vIENvdW50eSAKKyMgdW5kZXIgQWRtaW4gTGV2ZWxbMV0gSURbMzBdOk1vbnRhbmEgCitVUy1NVC0zMDAwMTpCZWF2ZXJoZWFkIENvdW50eSAKK1VTLU1ULTMwMDAzOkJpZyBIb3JuIENvdW50eSAKK1VTLU1ULTMwMDA1OkJsYWluZSBDb3VudHkgCitVUy1NVC0zMDAwNzpCcm9hZHdhdGVyIENvdW50eSAKK1VTLU1ULTMwMDA5OkNhcmJvbiBDb3VudHkgCitVUy1NVC0zMDAxMTpDYXJ0ZXIgQ291bnR5IAorVVMtTVQtMzAwMTM6Q2FzY2FkZSBDb3VudHkgCitVUy1NVC0zMDAxNTpDaG91dGVhdSBDb3VudHkgCitVUy1NVC0zMDAxNzpDdXN0ZXIgQ291bnR5IAorVVMtTVQtMzAwMTk6RGFuaWVscyBDb3VudHkgCitVUy1NVC0zMDAyMTpEYXdzb24gQ291bnR5IAorVVMtTVQtMzAwMjM6RGVlciBMb2RnZSBDb3VudHkgCitVUy1NVC0zMDAyNTpGYWxsb24gQ291bnR5IAorVVMtTVQtMzAwMjc6RmVyZ3VzIENvdW50eSAKK1VTLU1ULTMwMDI5OkZsYXRoZWFkIENvdW50eSAKK1VTLU1ULTMwMDMxOkdhbGxhdGluIENvdW50eSAKK1VTLU1ULTMwMDMzOkdhcmZpZWxkIENvdW50eSAKK1VTLU1ULTMwMDM1OkdsYWNpZXIgQ291bnR5IAorVVMtTVQtMzAwMzc6R29sZGVuIFZhbGxleSBDb3VudHkgCitVUy1NVC0zMDAzOTpHcmFuaXRlIENvdW50eSAKK1VTLU1ULTMwMDQxOkhpbGwgQ291bnR5IAorVVMtTVQtMzAwNDM6SmVmZmVyc29uIENvdW50eSAKK1VTLU1ULTMwMDQ1Okp1ZGl0aCBCYXNpbiBDb3VudHkgCitVUy1NVC0zMDA0NzpMYWtlIENvdW50eSAKK1VTLU1ULTMwMDQ5Okxld2lzIGFuZCBDbGFyayBDb3VudHkgCitVUy1NVC0zMDA1MTpMaWJlcnR5IENvdW50eSAKK1VTLU1ULTMwMDUzOkxpbmNvbG4gQ291bnR5IAorVVMtTVQtMzAwNTU6TWNDb25lIENvdW50eSAKK1VTLU1ULTMwMDU3Ok1hZGlzb24gQ291bnR5IAorVVMtTVQtMzAwNTk6TWVhZ2hlciBDb3VudHkgCitVUy1NVC0zMDA2MTpNaW5lcmFsIENvdW50eSAKK1VTLU1ULTMwMDYzOk1pc3NvdWxhIENvdW50eSAKK1VTLU1ULTMwMDY1Ok11c3NlbHNoZWxsIENvdW50eSAKK1VTLU1ULTMwMDY3OlBhcmsgQ291bnR5IAorVVMtTVQtMzAwNjk6UGV0cm9sZXVtIENvdW50eSAKK1VTLU1ULTMwMDcxOlBoaWxsaXBzIENvdW50eSAKK1VTLU1ULTMwMDczOlBvbmRlcmEgQ291bnR5IAorVVMtTVQtMzAwNzU6UG93ZGVyIFJpdmVyIENvdW50eSAKK1VTLU1ULTMwMDc3OlBvd2VsbCBDb3VudHkgCitVUy1NVC0zMDA3OTpQcmFpcmllIENvdW50eSAKK1VTLU1ULTMwMDgxOlJhdmFsbGkgQ291bnR5IAorVVMtTVQtMzAwODM6UmljaGxhbmQgQ291bnR5IAorVVMtTVQtMzAwODU6Um9vc2V2ZWx0IENvdW50eSAKK1VTLU1ULTMwMDg3OlJvc2VidWQgQ291bnR5IAorVVMtTVQtMzAwODk6U2FuZGVycyBDb3VudHkgCitVUy1NVC0zMDA5MTpTaGVyaWRhbiBDb3VudHkgCitVUy1NVC0zMDA5MzpTaWx2ZXIgQm93IENvdW50eSAKK1VTLU1ULTMwMDk1OlN0aWxsd2F0ZXIgQ291bnR5IAorVVMtTVQtMzAwOTc6U3dlZXQgR3Jhc3MgQ291bnR5IAorVVMtTVQtMzAwOTk6VGV0b24gQ291bnR5IAorVVMtTVQtMzAxMDE6VG9vbGUgQ291bnR5IAorVVMtTVQtMzAxMDM6VHJlYXN1cmUgQ291bnR5IAorVVMtTVQtMzAxMDU6VmFsbGV5IENvdW50eSAKK1VTLU1ULTMwMTA3OldoZWF0bGFuZCBDb3VudHkgCitVUy1NVC0zMDEwOTpXaWJhdXggQ291bnR5IAorVVMtTVQtMzAxMTE6WWVsbG93c3RvbmUgQ291bnR5IAorIyB1bmRlciBBZG1pbiBMZXZlbFsxXSBJRFszN106Tm9ydGggQ2Fyb2xpbmEgCitVUy1OQy0zNzAwMTpBbGFtYW5jZSBDb3VudHkgCitVUy1OQy0zNzAwMzpBbGV4YW5kZXIgQ291bnR5IAorVVMtTkMtMzcwMDU6QWxsZWdoYW55IENvdW50eSAKK1VTLU5DLTM3MDA3OkFuc29uIENvdW50eSAKK1VTLU5DLTM3MDA5OkFzaGUgQ291bnR5IAorVVMtTkMtMzcwMTE6QXZlcnkgQ291bnR5IAorVVMtTkMtMzcwMTM6QmVhdWZvcnQgQ291bnR5IAorVVMtTkMtMzcwMTU6QmVydGllIENvdW50eSAKK1VTLU5DLTM3MDE3OkJsYWRlbiBDb3VudHkgCitVUy1OQy0zNzAxOTpCcnVuc3dpY2sgQ291bnR5IAorVVMtTkMtMzcwMjE6QnVuY29tYmUgQ291bnR5IAorVVMtTkMtMzcwMjM6QnVya2UgQ291bnR5IAorVVMtTkMtMzcwMjU6Q2FiYXJydXMgQ291bnR5IAorVVMtTkMtMzcwMjc6Q2FsZHdlbGwgQ291bnR5IAorVVMtTkMtMzcwMjk6Q2FtZGVuIENvdW50eSAKK1VTLU5DLTM3MDMxOkNhcnRlcmV0IENvdW50eSAKK1VTLU5DLTM3MDMzOkNhc3dlbGwgQ291bnR5IAorVVMtTkMtMzcwMzU6Q2F0YXdiYSBDb3VudHkgCitVUy1OQy0zNzAzNzpDaGF0aGFtIENvdW50eSAKK1VTLU5DLTM3MDM5OkNoZXJva2VlIENvdW50eSAKK1VTLU5DLTM3MDQxOkNob3dhbiBDb3VudHkgCitVUy1OQy0zNzA0MzpDbGF5IENvdW50eSAKK1VTLU5DLTM3MDQ1OkNsZXZlbGFuZCBDb3VudHkgCitVUy1OQy0zNzA0NzpDb2x1bWJ1cyBDb3VudHkgCitVUy1OQy0zNzA0OTpDcmF2ZW4gQ291bnR5IAorVVMtTkMtMzcwNTE6Q3VtYmVybGFuZCBDb3VudHkgCitVUy1OQy0zNzA1MzpDdXJyaXR1Y2sgQ291bnR5IAorVVMtTkMtMzcwNTU6RGFyZSBDb3VudHkgCitVUy1OQy0zNzA1NzpEYXZpZHNvbiBDb3VudHkgCitVUy1OQy0zNzA1OTpEYXZpZSBDb3VudHkgCitVUy1OQy0zNzA2MTpEdXBsaW4gQ291bnR5IAorVVMtTkMtMzcwNjM6RHVyaGFtIENvdW50eSAKK1VTLU5DLTM3MDY1OkVkZ2Vjb21iZSBDb3VudHkgCitVUy1OQy0zNzA2NzpGb3JzeXRoIENvdW50eSAKK1VTLU5DLTM3MDY5OkZyYW5rbGluIENvdW50eSAKK1VTLU5DLTM3MDcxOkdhc3RvbiBDb3VudHkgCitVUy1OQy0zNzA3MzpHYXRlcyBDb3VudHkgCitVUy1OQy0zNzA3NTpHcmFoYW0gQ291bnR5IAorVVMtTkMtMzcwNzc6R3JhbnZpbGxlIENvdW50eSAKK1VTLU5DLTM3MDc5OkdyZWVuZSBDb3VudHkgCitVUy1OQy0zNzA4MTpHdWlsZm9yZCBDb3VudHkgCitVUy1OQy0zNzA4MzpIYWxpZmF4IENvdW50eSAKK1VTLU5DLTM3MDg1Okhhcm5ldHQgQ291bnR5IAorVVMtTkMtMzcwODc6SGF5d29vZCBDb3VudHkgCitVUy1OQy0zNzA4OTpIZW5kZXJzb24gQ291bnR5IAorVVMtTkMtMzcwOTE6SGVydGZvcmQgQ291bnR5IAorVVMtTkMtMzcwOTM6SG9rZSBDb3VudHkgCitVUy1OQy0zNzA5NTpIeWRlIENvdW50eSAKK1VTLU5DLTM3MDk3OklyZWRlbGwgQ291bnR5IAorVVMtTkMtMzcwOTk6SmFja3NvbiBDb3VudHkgCitVUy1OQy0zNzEwMTpKb2huc3RvbiBDb3VudHkgCitVUy1OQy0zNzEwMzpKb25lcyBDb3VudHkgCitVUy1OQy0zNzEwNTpMZWUgQ291bnR5IAorVVMtTkMtMzcxMDc6TGVub2lyIENvdW50eSAKK1VTLU5DLTM3MTA5OkxpbmNvbG4gQ291bnR5IAorVVMtTkMtMzcxMTE6TWNEb3dlbGwgQ291bnR5IAorVVMtTkMtMzcxMTM6TWFjb24gQ291bnR5IAorVVMtTkMtMzcxMTU6TWFkaXNvbiBDb3VudHkgCitVUy1OQy0zNzExNzpNYXJ0aW4gQ291bnR5IAorVVMtTkMtMzcxMTk6TWVja2xlbmJ1cmcgQ291bnR5IAorVVMtTkMtMzcxMjE6TWl0Y2hlbGwgQ291bnR5IAorVVMtTkMtMzcxMjM6TW9udGdvbWVyeSBDb3VudHkgCitVUy1OQy0zNzEyNTpNb29yZSBDb3VudHkgCitVUy1OQy0zNzEyNzpOYXNoIENvdW50eSAKK1VTLU5DLTM3MTI5Ok5ldyBIYW5vdmVyIENvdW50eSAKK1VTLU5DLTM3MTMxOk5vcnRoYW1wdG9uIENvdW50eSAKK1VTLU5DLTM3MTMzOk9uc2xvdyBDb3VudHkgCitVUy1OQy0zNzEzNTpPcmFuZ2UgQ291bnR5IAorVVMtTkMtMzcxMzc6UGFtbGljbyBDb3VudHkgCitVUy1OQy0zNzEzOTpQYXNxdW90YW5rIENvdW50eSAKK1VTLU5DLTM3MTQxOlBlbmRlciBDb3VudHkgCitVUy1OQy0zNzE0MzpQZXJxdWltYW5zIENvdW50eSAKK1VTLU5DLTM3MTQ1OlBlcnNvbiBDb3VudHkgCitVUy1OQy0zNzE0NzpQaXR0IENvdW50eSAKK1VTLU5DLTM3MTQ5OlBvbGsgQ291bnR5IAorVVMtTkMtMzcxNTE6UmFuZG9scGggQ291bnR5IAorVVMtTkMtMzcxNTM6UmljaG1vbmQgQ291bnR5IAorVVMtTkMtMzcxNTU6Um9iZXNvbiBDb3VudHkgCitVUy1OQy0zNzE1NzpSb2NraW5naGFtIENvdW50eSAKK1VTLU5DLTM3MTU5OlJvd2FuIENvdW50eSAKK1VTLU5DLTM3MTYxOlJ1dGhlcmZvcmQgQ291bnR5IAorVVMtTkMtMzcxNjM6U2FtcHNvbiBDb3VudHkgCitVUy1OQy0zNzE2NTpTY290bGFuZCBDb3VudHkgCitVUy1OQy0zNzE2NzpTdGFubHkgQ291bnR5IAorVVMtTkMtMzcxNjk6U3Rva2VzIENvdW50eSAKK1VTLU5DLTM3MTcxOlN1cnJ5IENvdW50eSAKK1VTLU5DLTM3MTczOlN3YWluIENvdW50eSAKK1VTLU5DLTM3MTc1OlRyYW5zeWx2YW5pYSBDb3VudHkgCitVUy1OQy0zNzE3NzpUeXJyZWxsIENvdW50eSAKK1VTLU5DLTM3MTc5OlVuaW9uIENvdW50eSAKK1VTLU5DLTM3MTgxOlZhbmNlIENvdW50eSAKK1VTLU5DLTM3MTgzOldha2UgQ291bnR5IAorVVMtTkMtMzcxODU6V2FycmVuIENvdW50eSAKK1VTLU5DLTM3MTg3Oldhc2hpbmd0b24gQ291bnR5IAorVVMtTkMtMzcxODk6V2F0YXVnYSBDb3VudHkgCitVUy1OQy0zNzE5MTpXYXluZSBDb3VudHkgCitVUy1OQy0zNzE5MzpXaWxrZXMgQ291bnR5IAorVVMtTkMtMzcxOTU6V2lsc29uIENvdW50eSAKK1VTLU5DLTM3MTk3OllhZGtpbiBDb3VudHkgCitVUy1OQy0zNzE5OTpZYW5jZXkgQ291bnR5IAorIyB1bmRlciBBZG1pbiBMZXZlbFsxXSBJRFszOF06Tm9ydGggRGFrb3RhIAorVVMtTkQtMzgwMDE6QWRhbXMgQ291bnR5IAorVVMtTkQtMzgwMDM6QmFybmVzIENvdW50eSAKK1VTLU5ELTM4MDA1OkJlbnNvbiBDb3VudHkgCitVUy1ORC0zODAwNzpCaWxsaW5ncyBDb3VudHkgCitVUy1ORC0zODAwOTpCb3R0aW5lYXUgQ291bnR5IAorVVMtTkQtMzgwMTE6Qm93bWFuIENvdW50eSAKK1VTLU5ELTM4MDEzOkJ1cmtlIENvdW50eSAKK1VTLU5ELTM4MDE1OkJ1cmxlaWdoIENvdW50eSAKK1VTLU5ELTM4MDE3OkNhc3MgQ291bnR5IAorVVMtTkQtMzgwMTk6Q2F2YWxpZXIgQ291bnR5IAorVVMtTkQtMzgwMjE6RGlja2V5IENvdW50eSAKK1VTLU5ELTM4MDIzOkRpdmlkZSBDb3VudHkgCitVUy1ORC0zODAyNTpEdW5uIENvdW50eSAKK1VTLU5ELTM4MDI3OkVkZHkgQ291bnR5IAorVVMtTkQtMzgwMjk6RW1tb25zIENvdW50eSAKK1VTLU5ELTM4MDMxOkZvc3RlciBDb3VudHkgCitVUy1ORC0zODAzMzpHb2xkZW4gVmFsbGV5IENvdW50eSAKK1VTLU5ELTM4MDM1OkdyYW5kIEZvcmtzIENvdW50eSAKK1VTLU5ELTM4MDM3OkdyYW50IENvdW50eSAKK1VTLU5ELTM4MDM5OkdyaWdncyBDb3VudHkgCitVUy1ORC0zODA0MTpIZXR0aW5nZXIgQ291bnR5IAorVVMtTkQtMzgwNDM6S2lkZGVyIENvdW50eSAKK1VTLU5ELTM4MDQ1OkxhTW91cmUgQ291bnR5IAorVVMtTkQtMzgwNDc6TG9nYW4gQ291bnR5IAorVVMtTkQtMzgwNDk6TWNIZW5yeSBDb3VudHkgCitVUy1ORC0zODA1MTpNY0ludG9zaCBDb3VudHkgCitVUy1ORC0zODA1MzpNY0tlbnppZSBDb3VudHkgCitVUy1ORC0zODA1NTpNY0xlYW4gQ291bnR5IAorVVMtTkQtMzgwNTc6TWVyY2VyIENvdW50eSAKK1VTLU5ELTM4MDU5Ok1vcnRvbiBDb3VudHkgCitVUy1ORC0zODA2MTpNb3VudHJhaWwgQ291bnR5IAorVVMtTkQtMzgwNjM6TmVsc29uIENvdW50eSAKK1VTLU5ELTM4MDY1Ok9saXZlciBDb3VudHkgCitVUy1ORC0zODA2NzpQZW1iaW5hIENvdW50eSAKK1VTLU5ELTM4MDY5OlBpZXJjZSBDb3VudHkgCitVUy1ORC0zODA3MTpSYW1zZXkgQ291bnR5IAorVVMtTkQtMzgwNzM6UmFuc29tIENvdW50eSAKK1VTLU5ELTM4MDc1OlJlbnZpbGxlIENvdW50eSAKK1VTLU5ELTM4MDc3OlJpY2hsYW5kIENvdW50eSAKK1VTLU5ELTM4MDc5OlJvbGV0dGUgQ291bnR5IAorVVMtTkQtMzgwODE6U2FyZ2VudCBDb3VudHkgCitVUy1ORC0zODA4MzpTaGVyaWRhbiBDb3VudHkgCitVUy1ORC0zODA4NTpTaW91eCBDb3VudHkgCitVUy1ORC0zODA4NzpTbG9wZSBDb3VudHkgCitVUy1ORC0zODA4OTpTdGFyayBDb3VudHkgCitVUy1ORC0zODA5MTpTdGVlbGUgQ291bnR5IAorVVMtTkQtMzgwOTM6U3R1dHNtYW4gQ291bnR5IAorVVMtTkQtMzgwOTU6VG93bmVyIENvdW50eSAKK1VTLU5ELTM4MDk3OlRyYWlsbCBDb3VudHkgCitVUy1ORC0zODA5OTpXYWxzaCBDb3VudHkgCitVUy1ORC0zODEwMTpXYXJkIENvdW50eSAKK1VTLU5ELTM4MTAzOldlbGxzIENvdW50eSAKK1VTLU5ELTM4MTA1OldpbGxpYW1zIENvdW50eSAKKyMgdW5kZXIgQWRtaW4gTGV2ZWxbMV0gSURbMzFdOk5lYnJhc2thIAorVVMtTkUtMzEwMDE6QWRhbXMgQ291bnR5IAorVVMtTkUtMzEwMDM6QW50ZWxvcGUgQ291bnR5IAorVVMtTkUtMzEwMDU6QXJ0aHVyIENvdW50eSAKK1VTLU5FLTMxMDA3OkJhbm5lciBDb3VudHkgCitVUy1ORS0zMTAwOTpCbGFpbmUgQ291bnR5IAorVVMtTkUtMzEwMTE6Qm9vbmUgQ291bnR5IAorVVMtTkUtMzEwMTM6Qm94IEJ1dHRlIENvdW50eSAKK1VTLU5FLTMxMDE1OkJveWQgQ291bnR5IAorVVMtTkUtMzEwMTc6QnJvd24gQ291bnR5IAorVVMtTkUtMzEwMTk6QnVmZmFsbyBDb3VudHkgCitVUy1ORS0zMTAyMTpCdXJ0IENvdW50eSAKK1VTLU5FLTMxMDIzOkJ1dGxlciBDb3VudHkgCitVUy1ORS0zMTAyNTpDYXNzIENvdW50eSAKK1VTLU5FLTMxMDI3OkNlZGFyIENvdW50eSAKK1VTLU5FLTMxMDI5OkNoYXNlIENvdW50eSAKK1VTLU5FLTMxMDMxOkNoZXJyeSBDb3VudHkgCitVUy1ORS0zMTAzMzpDaGV5ZW5uZSBDb3VudHkgCitVUy1ORS0zMTAzNTpDbGF5IENvdW50eSAKK1VTLU5FLTMxMDM3OkNvbGZheCBDb3VudHkgCitVUy1ORS0zMTAzOTpDdW1pbmcgQ291bnR5IAorVVMtTkUtMzEwNDE6Q3VzdGVyIENvdW50eSAKK1VTLU5FLTMxMDQzOkRha290YSBDb3VudHkgCitVUy1ORS0zMTA0NTpEYXdlcyBDb3VudHkgCitVUy1ORS0zMTA0NzpEYXdzb24gQ291bnR5IAorVVMtTkUtMzEwNDk6RGV1ZWwgQ291bnR5IAorVVMtTkUtMzEwNTE6RGl4b24gQ291bnR5IAorVVMtTkUtMzEwNTM6RG9kZ2UgQ291bnR5IAorVVMtTkUtMzEwNTU6RG91Z2xhcyBDb3VudHkgCitVUy1ORS0zMTA1NzpEdW5keSBDb3VudHkgCitVUy1ORS0zMTA1OTpGaWxsbW9yZSBDb3VudHkgCitVUy1ORS0zMTA2MTpGcmFua2xpbiBDb3VudHkgCitVUy1ORS0zMTA2MzpGcm9udGllciBDb3VudHkgCitVUy1ORS0zMTA2NTpGdXJuYXMgQ291bnR5IAorVVMtTkUtMzEwNjc6R2FnZSBDb3VudHkgCitVUy1ORS0zMTA2OTpHYXJkZW4gQ291bnR5IAorVVMtTkUtMzEwNzE6R2FyZmllbGQgQ291bnR5IAorVVMtTkUtMzEwNzM6R29zcGVyIENvdW50eSAKK1VTLU5FLTMxMDc1OkdyYW50IENvdW50eSAKK1VTLU5FLTMxMDc3OkdyZWVsZXkgQ291bnR5IAorVVMtTkUtMzEwNzk6SGFsbCBDb3VudHkgCitVUy1ORS0zMTA4MTpIYW1pbHRvbiBDb3VudHkgCitVUy1ORS0zMTA4MzpIYXJsYW4gQ291bnR5IAorVVMtTkUtMzEwODU6SGF5ZXMgQ291bnR5IAorVVMtTkUtMzEwODc6SGl0Y2hjb2NrIENvdW50eSAKK1VTLU5FLTMxMDg5OkhvbHQgQ291bnR5IAorVVMtTkUtMzEwOTE6SG9va2VyIENvdW50eSAKK1VTLU5FLTMxMDkzOkhvd2FyZCBDb3VudHkgCitVUy1ORS0zMTA5NTpKZWZmZXJzb24gQ291bnR5IAorVVMtTkUtMzEwOTc6Sm9obnNvbiBDb3VudHkgCitVUy1ORS0zMTA5OTpLZWFybmV5IENvdW50eSAKK1VTLU5FLTMxMTAxOktlaXRoIENvdW50eSAKK1VTLU5FLTMxMTAzOktleWEgUGFoYSBDb3VudHkgCitVUy1ORS0zMTEwNTpLaW1iYWxsIENvdW50eSAKK1VTLU5FLTMxMTA3Oktub3ggQ291bnR5IAorVVMtTkUtMzExMDk6TGFuY2FzdGVyIENvdW50eSAKK1VTLU5FLTMxMTExOkxpbmNvbG4gQ291bnR5IAorVVMtTkUtMzExMTM6TG9nYW4gQ291bnR5IAorVVMtTkUtMzExMTU6TG91cCBDb3VudHkgCitVUy1ORS0zMTExNzpNY1BoZXJzb24gQ291bnR5IAorVVMtTkUtMzExMTk6TWFkaXNvbiBDb3VudHkgCitVUy1ORS0zMTEyMTpNZXJyaWNrIENvdW50eSAKK1VTLU5FLTMxMTIzOk1vcnJpbGwgQ291bnR5IAorVVMtTkUtMzExMjU6TmFuY2UgQ291bnR5IAorVVMtTkUtMzExMjc6TmVtYWhhIENvdW50eSAKK1VTLU5FLTMxMTI5Ok51Y2tvbGxzIENvdW50eSAKK1VTLU5FLTMxMTMxOk90b2UgQ291bnR5IAorVVMtTkUtMzExMzM6UGF3bmVlIENvdW50eSAKK1VTLU5FLTMxMTM1OlBlcmtpbnMgQ291bnR5IAorVVMtTkUtMzExMzc6UGhlbHBzIENvdW50eSAKK1VTLU5FLTMxMTM5OlBpZXJjZSBDb3VudHkgCitVUy1ORS0zMTE0MTpQbGF0dGUgQ291bnR5IAorVVMtTkUtMzExNDM6UG9sayBDb3VudHkgCitVUy1ORS0zMTE0NTpSZWQgV2lsbG93IENvdW50eSAKK1VTLU5FLTMxMTQ3OlJpY2hhcmRzb24gQ291bnR5IAorVVMtTkUtMzExNDk6Um9jayBDb3VudHkgCitVUy1ORS0zMTE1MTpTYWxpbmUgQ291bnR5IAorVVMtTkUtMzExNTM6U2FycHkgQ291bnR5IAorVVMtTkUtMzExNTU6U2F1bmRlcnMgQ291bnR5IAorVVMtTkUtMzExNTc6U2NvdHRzIEJsdWZmIENvdW50eSAKK1VTLU5FLTMxMTU5OlNld2FyZCBDb3VudHkgCitVUy1ORS0zMTE2MTpTaGVyaWRhbiBDb3VudHkgCitVUy1ORS0zMTE2MzpTaGVybWFuIENvdW50eSAKK1VTLU5FLTMxMTY1OlNpb3V4IENvdW50eSAKK1VTLU5FLTMxMTY3OlN0YW50b24gQ291bnR5IAorVVMtTkUtMzExNjk6VGhheWVyIENvdW50eSAKK1VTLU5FLTMxMTcxOlRob21hcyBDb3VudHkgCitVUy1ORS0zMTE3MzpUaHVyc3RvbiBDb3VudHkgCitVUy1ORS0zMTE3NTpWYWxsZXkgQ291bnR5IAorVVMtTkUtMzExNzc6V2FzaGluZ3RvbiBDb3VudHkgCitVUy1ORS0zMTE3OTpXYXluZSBDb3VudHkgCitVUy1ORS0zMTE4MTpXZWJzdGVyIENvdW50eSAKK1VTLU5FLTMxMTgzOldoZWVsZXIgQ291bnR5IAorVVMtTkUtMzExODU6WW9yayBDb3VudHkgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEWzMzXTpOZXcgSGFtcHNoaXJlIAorVVMtTkgtMzMwMDE6QmVsa25hcCBDb3VudHkgCitVUy1OSC0zMzAwMzpDYXJyb2xsIENvdW50eSAKK1VTLU5ILTMzMDA1OkNoZXNoaXJlIENvdW50eSAKK1VTLU5ILTMzMDA3OkNvb3MgQ291bnR5IAorVVMtTkgtMzMwMDk6R3JhZnRvbiBDb3VudHkgCitVUy1OSC0zMzAxMTpIaWxsc0Jvcm91Z2ggQ291bnR5CitVUy1OSC0zMzAxMzpNZXJyaW1hY2sgQ291bnR5IAorVVMtTkgtMzMwMTU6Um9ja2luZ2hhbSBDb3VudHkgCitVUy1OSC0zMzAxNzpTdHJhZmZvcmQgQ291bnR5IAorVVMtTkgtMzMwMTk6U3VsbGl2YW4gQ291bnR5IAorIyB1bmRlciBBZG1pbiBMZXZlbFsxXSBJRFszNF06TmV3IEplcnNleSAKK1VTLU5KLTM0MDAxOkF0bGFudGljIENvdW50eSAKK1VTLU5KLTM0MDAzOkJlcmdlbiBDb3VudHkgCitVUy1OSi0zNDAwNTpCdXJsaW5ndG9uIENvdW50eSAKK1VTLU5KLTM0MDA3OkNhbWRlbiBDb3VudHkgCitVUy1OSi0zNDAwOTpDYXBlIE1heSBDb3VudHkgCitVUy1OSi0zNDAxMTpDdW1iZXJsYW5kIENvdW50eSAKK1VTLU5KLTM0MDEzOkVzc2V4IENvdW50eSAKK1VTLU5KLTM0MDE1Okdsb3VjZXN0ZXIgQ291bnR5IAorVVMtTkotMzQwMTc6SHVkc29uIENvdW50eSAKK1VTLU5KLTM0MDE5Okh1bnRlcmRvbiBDb3VudHkgCitVUy1OSi0zNDAyMTpNZXJjZXIgQ291bnR5IAorVVMtTkotMzQwMjM6TWlkZGxlc2V4IENvdW50eSAKK1VTLU5KLTM0MDI1Ok1vbm1vdXRoIENvdW50eSAKK1VTLU5KLTM0MDI3Ok1vcnJpcyBDb3VudHkgCitVUy1OSi0zNDAyOTpPY2VhbiBDb3VudHkgCitVUy1OSi0zNDAzMTpQYXNzYWljIENvdW50eSAKK1VTLU5KLTM0MDMzOlNhbGVtIENvdW50eSAKK1VTLU5KLTM0MDM1OlNvbWVyc2V0IENvdW50eSAKK1VTLU5KLTM0MDM3OlN1c3NleCBDb3VudHkgCitVUy1OSi0zNDAzOTpVbmlvbiBDb3VudHkgCitVUy1OSi0zNDA0MTpXYXJyZW4gQ291bnR5IAorIyB1bmRlciBBZG1pbiBMZXZlbFsxXSBJRFszNV06TmV3IE1leGljbyAKK1VTLU5NLTM1MDAxOkJlcm5hbGlsbG8gQ291bnR5IAorVVMtTk0tMzUwMDM6Q2F0cm9uIENvdW50eSAKK1VTLU5NLTM1MDA1OkNoYXZlcyBDb3VudHkgCitVUy1OTS0zNTAwNjpDaWJvbGEgQ291bnR5IAorVVMtTk0tMzUwMDc6Q29sZmF4IENvdW50eSAKK1VTLU5NLTM1MDA5OkN1cnJ5IENvdW50eSAKK1VTLU5NLTM1MDExOkRlIEJhY2EgQ291bnR5IAorVVMtTk0tMzUwMTM6RG9uYSBBbmEgQ291bnR5IAorVVMtTk0tMzUwMTU6RWRkeSBDb3VudHkgCitVUy1OTS0zNTAxNzpHcmFudCBDb3VudHkgCitVUy1OTS0zNTAxOTpHdWFkYWx1cGUgQ291bnR5IAorVVMtTk0tMzUwMjE6SGFyZGluZyBDb3VudHkgCitVUy1OTS0zNTAyMzpIaWRhbGdvIENvdW50eSAKK1VTLU5NLTM1MDI1OkxlYSBDb3VudHkgCitVUy1OTS0zNTAyNzpMaW5jb2xuIENvdW50eSAKK1VTLU5NLTM1MDI4OkxvcyBBbGFtb3MgQ291bnR5IAorVVMtTk0tMzUwMjk6THVuYSBDb3VudHkgCitVUy1OTS0zNTAzMTpNY0tpbmxleSBDb3VudHkgCitVUy1OTS0zNTAzMzpNb3JhIENvdW50eSAKK1VTLU5NLTM1MDM1Ok90ZXJvIENvdW50eSAKK1VTLU5NLTM1MDM3OlF1YXkgQ291bnR5IAorVVMtTk0tMzUwMzk6UmlvIEFycmliYSBDb3VudHkgCitVUy1OTS0zNTA0MTpSb29zZXZlbHQgQ291bnR5IAorVVMtTk0tMzUwNDM6U2FuZG92YWwgQ291bnR5IAorVVMtTk0tMzUwNDU6U2FuIEp1YW4gQ291bnR5IAorVVMtTk0tMzUwNDc6U2FuIE1pZ3VlbCBDb3VudHkgCitVUy1OTS0zNTA0OTpTYW50YSBGZSBDb3VudHkgCitVUy1OTS0zNTA1MTpTaWVycmEgQ291bnR5IAorVVMtTk0tMzUwNTM6U29jb3JybyBDb3VudHkgCitVUy1OTS0zNTA1NTpUYW9zIENvdW50eSAKK1VTLU5NLTM1MDU3OlRvcnJhbmNlIENvdW50eSAKK1VTLU5NLTM1MDU5OlVuaW9uIENvdW50eSAKK1VTLU5NLTM1MDYxOlZhbGVuY2lhIENvdW50eSAKKyMgdW5kZXIgQWRtaW4gTGV2ZWxbMV0gSURbMzJdOk5ldmFkYSAKK1VTLU5WLTMyMDAxOkNodXJjaGlsbCBDb3VudHkgCitVUy1OVi0zMjAwMzpDbGFyayBDb3VudHkgCitVUy1OVi0zMjAwNTpEb3VnbGFzIENvdW50eSAKK1VTLU5WLTMyMDA3OkVsa28gQ291bnR5IAorVVMtTlYtMzIwMDk6RXNtZXJhbGRhIENvdW50eSAKK1VTLU5WLTMyMDExOkV1cmVrYSBDb3VudHkgCitVUy1OVi0zMjAxMzpIdW1ib2xkdCBDb3VudHkgCitVUy1OVi0zMjAxNTpMYW5kZXIgQ291bnR5IAorVVMtTlYtMzIwMTc6TGluY29sbiBDb3VudHkgCitVUy1OVi0zMjAxOTpMeW9uIENvdW50eSAKK1VTLU5WLTMyMDIxOk1pbmVyYWwgQ291bnR5IAorVVMtTlYtMzIwMjM6TnllIENvdW50eSAKK1VTLU5WLTMyMDI3OlBlcnNoaW5nIENvdW50eSAKK1VTLU5WLTMyMDI5OlN0b3JleSBDb3VudHkgCitVUy1OVi0zMjAzMTpXYXNob2UgQ291bnR5IAorVVMtTlYtMzIwMzM6V2hpdGUgUGluZSBDb3VudHkgCitVUy1OVi0zMjUxMDpDYXJzb24gQ2l0eSAKKyMgdW5kZXIgQWRtaW4gTGV2ZWxbMV0gSURbMzZdOk5ldyBZb3JrIAorVVMtTlktMzYwMDE6QWxiYW55IENvdW50eSAKK1VTLU5ZLTM2MDAzOkFsbGVnYW55IENvdW50eSAKK1VTLU5ZLTM2MDA1OkJyb254IENvdW50eSAKK1VTLU5ZLTM2MDA3OkJyb29tZSBDb3VudHkgCitVUy1OWS0zNjAwOTpDYXR0YXJhdWd1cyBDb3VudHkgCitVUy1OWS0zNjAxMTpDYXl1Z2EgQ291bnR5IAorVVMtTlktMzYwMTM6Q2hhdXRhdXF1YSBDb3VudHkgCitVUy1OWS0zNjAxNTpDaGVtdW5nIENvdW50eSAKK1VTLU5ZLTM2MDE3OkNoZW5hbmdvIENvdW50eSAKK1VTLU5ZLTM2MDE5OkNsaW50b24gQ291bnR5IAorVVMtTlktMzYwMjE6Q29sdW1iaWEgQ291bnR5IAorVVMtTlktMzYwMjM6Q29ydGxhbmQgQ291bnR5IAorVVMtTlktMzYwMjU6RGVsYXdhcmUgQ291bnR5IAorVVMtTlktMzYwMjc6RHV0Y2hlc3MgQ291bnR5IAorVVMtTlktMzYwMjk6RXJpZSBDb3VudHkgCitVUy1OWS0zNjAzMTpFc3NleCBDb3VudHkgCitVUy1OWS0zNjAzMzpGcmFua2xpbiBDb3VudHkgCitVUy1OWS0zNjAzNTpGdWx0b24gQ291bnR5IAorVVMtTlktMzYwMzc6R2VuZXNlZSBDb3VudHkgCitVUy1OWS0zNjAzOTpHcmVlbmUgQ291bnR5IAorVVMtTlktMzYwNDE6SGFtaWx0b24gQ291bnR5IAorVVMtTlktMzYwNDM6SGVya2ltZXIgQ291bnR5IAorVVMtTlktMzYwNDU6SmVmZmVyc29uIENvdW50eSAKK1VTLU5ZLTM2MDQ3OktpbmdzIENvdW50eSAKK1VTLU5ZLTM2MDQ5Okxld2lzIENvdW50eSAKK1VTLU5ZLTM2MDUxOkxpdmluZ3N0b24gQ291bnR5IAorVVMtTlktMzYwNTM6TWFkaXNvbiBDb3VudHkgCitVUy1OWS0zNjA1NTpNb25yb2UgQ291bnR5IAorVVMtTlktMzYwNTc6TW9udGdvbWVyeSBDb3VudHkgCitVUy1OWS0zNjA1OTpOYXNzYXUgQ291bnR5IAorVVMtTlktMzYwNjE6TmV3IFlvcmsgQ291bnR5IAorVVMtTlktMzYwNjM6TmlhZ2FyYSBDb3VudHkgCitVUy1OWS0zNjA2NTpPbmVpZGEgQ291bnR5IAorVVMtTlktMzYwNjc6T25vbmRhZ2EgQ291bnR5IAorVVMtTlktMzYwNjk6T250YXJpbyBDb3VudHkgCitVUy1OWS0zNjA3MTpPcmFuZ2UgQ291bnR5IAorVVMtTlktMzYwNzM6T3JsZWFucyBDb3VudHkgCitVUy1OWS0zNjA3NTpPc3dlZ28gQ291bnR5IAorVVMtTlktMzYwNzc6T3RzZWdvIENvdW50eSAKK1VTLU5ZLTM2MDc5OlB1dG5hbSBDb3VudHkgCitVUy1OWS0zNjA4MTpRdWVlbnMgQ291bnR5IAorVVMtTlktMzYwODM6UmVuc3NlbGFlciBDb3VudHkgCitVUy1OWS0zNjA4NTpSaWNobW9uZCBDb3VudHkgCitVUy1OWS0zNjA4NzpSb2NrbGFuZCBDb3VudHkgCitVUy1OWS0zNjA4OTpTdC4gTGF3cmVuY2UgQ291bnR5IAorVVMtTlktMzYwOTE6U2FyYXRvZ2EgQ291bnR5IAorVVMtTlktMzYwOTM6U2NoZW5lY3RhZHkgQ291bnR5IAorVVMtTlktMzYwOTU6U2Nob2hhcmllIENvdW50eSAKK1VTLU5ZLTM2MDk3OlNjaHV5bGVyIENvdW50eSAKK1VTLU5ZLTM2MDk5OlNlbmVjYSBDb3VudHkgCitVUy1OWS0zNjEwMTpTdGV1YmVuIENvdW50eSAKK1VTLU5ZLTM2MTAzOlN1ZmZvbGsgQ291bnR5IAorVVMtTlktMzYxMDU6U3VsbGl2YW4gQ291bnR5IAorVVMtTlktMzYxMDc6VGlvZ2EgQ291bnR5IAorVVMtTlktMzYxMDk6VG9tcGtpbnMgQ291bnR5IAorVVMtTlktMzYxMTE6VWxzdGVyIENvdW50eSAKK1VTLU5ZLTM2MTEzOldhcnJlbiBDb3VudHkgCitVUy1OWS0zNjExNTpXYXNoaW5ndG9uIENvdW50eSAKK1VTLU5ZLTM2MTE3OldheW5lIENvdW50eSAKK1VTLU5ZLTM2MTE5Oldlc3RjaGVzdGVyIENvdW50eSAKK1VTLU5ZLTM2MTIxOld5b21pbmcgQ291bnR5IAorVVMtTlktMzYxMjM6WWF0ZXMgQ291bnR5IAorIyB1bmRlciBBZG1pbiBMZXZlbFsxXSBJRFszOV06T2hpbyAKK1VTLU9ILTM5MDAxOkFkYW1zIENvdW50eSAKK1VTLU9ILTM5MDAzOkFsbGVuIENvdW50eSAKK1VTLU9ILTM5MDA1OkFzaGxhbmQgQ291bnR5IAorVVMtT0gtMzkwMDc6QXNodGFidWxhIENvdW50eSAKK1VTLU9ILTM5MDA5OkF0aGVucyBDb3VudHkgCitVUy1PSC0zOTAxMTpBdWdsYWl6ZSBDb3VudHkgCitVUy1PSC0zOTAxMzpCZWxtb250IENvdW50eSAKK1VTLU9ILTM5MDE1OkJyb3duIENvdW50eSAKK1VTLU9ILTM5MDE3OkJ1dGxlciBDb3VudHkgCitVUy1PSC0zOTAxOTpDYXJyb2xsIENvdW50eSAKK1VTLU9ILTM5MDIxOkNoYW1wYWlnbiBDb3VudHkgCitVUy1PSC0zOTAyMzpDbGFyayBDb3VudHkgCitVUy1PSC0zOTAyNTpDbGVybW9udCBDb3VudHkgCitVUy1PSC0zOTAyNzpDbGludG9uIENvdW50eSAKK1VTLU9ILTM5MDI5OkNvbHVtYmlhbmEgQ291bnR5IAorVVMtT0gtMzkwMzE6Q29zaG9jdG9uIENvdW50eSAKK1VTLU9ILTM5MDMzOkNyYXdmb3JkIENvdW50eSAKK1VTLU9ILTM5MDM1OkN1eWFob2dhIENvdW50eSAKK1VTLU9ILTM5MDM3OkRhcmtlIENvdW50eSAKK1VTLU9ILTM5MDM5OkRlZmlhbmNlIENvdW50eSAKK1VTLU9ILTM5MDQxOkRlbGF3YXJlIENvdW50eSAKK1VTLU9ILTM5MDQzOkVyaWUgQ291bnR5IAorVVMtT0gtMzkwNDU6RmFpcmZpZWxkIENvdW50eSAKK1VTLU9ILTM5MDQ3OkZheWV0dGUgQ291bnR5IAorVVMtT0gtMzkwNDk6RnJhbmtsaW4gQ291bnR5IAorVVMtT0gtMzkwNTE6RnVsdG9uIENvdW50eSAKK1VTLU9ILTM5MDUzOkdhbGxpYSBDb3VudHkgCitVUy1PSC0zOTA1NTpHZWF1Z2EgQ291bnR5IAorVVMtT0gtMzkwNTc6R3JlZW5lIENvdW50eSAKK1VTLU9ILTM5MDU5Okd1ZXJuc2V5IENvdW50eSAKK1VTLU9ILTM5MDYxOkhhbWlsdG9uIENvdW50eSAKK1VTLU9ILTM5MDYzOkhhbmNvY2sgQ291bnR5IAorVVMtT0gtMzkwNjU6SGFyZGluIENvdW50eSAKK1VTLU9ILTM5MDY3OkhhcnJpc29uIENvdW50eSAKK1VTLU9ILTM5MDY5OkhlbnJ5IENvdW50eSAKK1VTLU9ILTM5MDcxOkhpZ2hsYW5kIENvdW50eSAKK1VTLU9ILTM5MDczOkhvY2tpbmcgQ291bnR5IAorVVMtT0gtMzkwNzU6SG9sbWVzIENvdW50eSAKK1VTLU9ILTM5MDc3Okh1cm9uIENvdW50eSAKK1VTLU9ILTM5MDc5OkphY2tzb24gQ291bnR5IAorVVMtT0gtMzkwODE6SmVmZmVyc29uIENvdW50eSAKK1VTLU9ILTM5MDgzOktub3ggQ291bnR5IAorVVMtT0gtMzkwODU6TGFrZSBDb3VudHkgCitVUy1PSC0zOTA4NzpMYXdyZW5jZSBDb3VudHkgCitVUy1PSC0zOTA4OTpMaWNraW5nIENvdW50eSAKK1VTLU9ILTM5MDkxOkxvZ2FuIENvdW50eSAKK1VTLU9ILTM5MDkzOkxvcmFpbiBDb3VudHkgCitVUy1PSC0zOTA5NTpMdWNhcyBDb3VudHkgCitVUy1PSC0zOTA5NzpNYWRpc29uIENvdW50eSAKK1VTLU9ILTM5MDk5Ok1haG9uaW5nIENvdW50eSAKK1VTLU9ILTM5MTAxOk1hcmlvbiBDb3VudHkgCitVUy1PSC0zOTEwMzpNZWRpbmEgQ291bnR5IAorVVMtT0gtMzkxMDU6TWVpZ3MgQ291bnR5IAorVVMtT0gtMzkxMDc6TWVyY2VyIENvdW50eSAKK1VTLU9ILTM5MTA5Ok1pYW1pIENvdW50eSAKK1VTLU9ILTM5MTExOk1vbnJvZSBDb3VudHkgCitVUy1PSC0zOTExMzpNb250Z29tZXJ5IENvdW50eSAKK1VTLU9ILTM5MTE1Ok1vcmdhbiBDb3VudHkgCitVUy1PSC0zOTExNzpNb3Jyb3cgQ291bnR5IAorVVMtT0gtMzkxMTk6TXVza2luZ3VtIENvdW50eSAKK1VTLU9ILTM5MTIxOk5vYmxlIENvdW50eSAKK1VTLU9ILTM5MTIzOk90dGF3YSBDb3VudHkgCitVUy1PSC0zOTEyNTpQYXVsZGluZyBDb3VudHkgCitVUy1PSC0zOTEyNzpQZXJyeSBDb3VudHkgCitVUy1PSC0zOTEyOTpQaWNrYXdheSBDb3VudHkgCitVUy1PSC0zOTEzMTpQaWtlIENvdW50eSAKK1VTLU9ILTM5MTMzOlBvcnRhZ2UgQ291bnR5IAorVVMtT0gtMzkxMzU6UHJlYmxlIENvdW50eSAKK1VTLU9ILTM5MTM3OlB1dG5hbSBDb3VudHkgCitVUy1PSC0zOTEzOTpSaWNobGFuZCBDb3VudHkgCitVUy1PSC0zOTE0MTpSb3NzIENvdW50eSAKK1VTLU9ILTM5MTQzOlNhbmR1c2t5IENvdW50eSAKK1VTLU9ILTM5MTQ1OlNjaW90byBDb3VudHkgCitVUy1PSC0zOTE0NzpTZW5lY2EgQ291bnR5IAorVVMtT0gtMzkxNDk6U2hlbGJ5IENvdW50eSAKK1VTLU9ILTM5MTUxOlN0YXJrIENvdW50eSAKK1VTLU9ILTM5MTUzOlN1bW1pdCBDb3VudHkgCitVUy1PSC0zOTE1NTpUcnVtYnVsbCBDb3VudHkgCitVUy1PSC0zOTE1NzpUdXNjYXJhd2FzIENvdW50eSAKK1VTLU9ILTM5MTU5OlVuaW9uIENvdW50eSAKK1VTLU9ILTM5MTYxOlZhbiBXZXJ0IENvdW50eSAKK1VTLU9ILTM5MTYzOlZpbnRvbiBDb3VudHkgCitVUy1PSC0zOTE2NTpXYXJyZW4gQ291bnR5IAorVVMtT0gtMzkxNjc6V2FzaGluZ3RvbiBDb3VudHkgCitVUy1PSC0zOTE2OTpXYXluZSBDb3VudHkgCitVUy1PSC0zOTE3MTpXaWxsaWFtcyBDb3VudHkgCitVUy1PSC0zOTE3MzpXb29kIENvdW50eSAKK1VTLU9ILTM5MTc1Old5YW5kb3QgQ291bnR5IAorIyB1bmRlciBBZG1pbiBMZXZlbFsxXSBJRFs0MF06T2tsYWhvbWEgCitVUy1PSy00MDAwMTpBZGFpciBDb3VudHkgCitVUy1PSy00MDAwMzpBbGZhbGZhIENvdW50eSAKK1VTLU9LLTQwMDA1OkF0b2thIENvdW50eSAKK1VTLU9LLTQwMDA3OkJlYXZlciBDb3VudHkgCitVUy1PSy00MDAwOTpCZWNraGFtIENvdW50eSAKK1VTLU9LLTQwMDExOkJsYWluZSBDb3VudHkgCitVUy1PSy00MDAxMzpCcnlhbiBDb3VudHkgCitVUy1PSy00MDAxNTpDYWRkbyBDb3VudHkgCitVUy1PSy00MDAxNzpDYW5hZGlhbiBDb3VudHkgCitVUy1PSy00MDAxOTpDYXJ0ZXIgQ291bnR5IAorVVMtT0stNDAwMjE6Q2hlcm9rZWUgQ291bnR5IAorVVMtT0stNDAwMjM6Q2hvY3RhdyBDb3VudHkgCitVUy1PSy00MDAyNTpDaW1hcnJvbiBDb3VudHkgCitVUy1PSy00MDAyNzpDbGV2ZWxhbmQgQ291bnR5IAorVVMtT0stNDAwMjk6Q29hbCBDb3VudHkgCitVUy1PSy00MDAzMTpDb21hbmNoZSBDb3VudHkgCitVUy1PSy00MDAzMzpDb3R0b24gQ291bnR5IAorVVMtT0stNDAwMzU6Q3JhaWcgQ291bnR5IAorVVMtT0stNDAwMzc6Q3JlZWsgQ291bnR5IAorVVMtT0stNDAwMzk6Q3VzdGVyIENvdW50eSAKK1VTLU9LLTQwMDQxOkRlbGF3YXJlIENvdW50eSAKK1VTLU9LLTQwMDQzOkRld2V5IENvdW50eSAKK1VTLU9LLTQwMDQ1OkVsbGlzIENvdW50eSAKK1VTLU9LLTQwMDQ3OkdhcmZpZWxkIENvdW50eSAKK1VTLU9LLTQwMDQ5OkdhcnZpbiBDb3VudHkgCitVUy1PSy00MDA1MTpHcmFkeSBDb3VudHkgCitVUy1PSy00MDA1MzpHcmFudCBDb3VudHkgCitVUy1PSy00MDA1NTpHcmVlciBDb3VudHkgCitVUy1PSy00MDA1NzpIYXJtb24gQ291bnR5IAorVVMtT0stNDAwNTk6SGFycGVyIENvdW50eSAKK1VTLU9LLTQwMDYxOkhhc2tlbGwgQ291bnR5IAorVVMtT0stNDAwNjM6SHVnaGVzIENvdW50eSAKK1VTLU9LLTQwMDY1OkphY2tzb24gQ291bnR5IAorVVMtT0stNDAwNjc6SmVmZmVyc29uIENvdW50eSAKK1VTLU9LLTQwMDY5OkpvaG5zdG9uIENvdW50eSAKK1VTLU9LLTQwMDcxOktheSBDb3VudHkgCitVUy1PSy00MDA3MzpLaW5nZmlzaGVyIENvdW50eSAKK1VTLU9LLTQwMDc1Oktpb3dhIENvdW50eSAKK1VTLU9LLTQwMDc3OkxhdGltZXIgQ291bnR5IAorVVMtT0stNDAwNzk6TGUgRmxvcmUgQ291bnR5IAorVVMtT0stNDAwODE6TGluY29sbiBDb3VudHkgCitVUy1PSy00MDA4MzpMb2dhbiBDb3VudHkgCitVUy1PSy00MDA4NTpMb3ZlIENvdW50eSAKK1VTLU9LLTQwMDg3Ok1jQ2xhaW4gQ291bnR5IAorVVMtT0stNDAwODk6TWNDdXJ0YWluIENvdW50eSAKK1VTLU9LLTQwMDkxOk1jSW50b3NoIENvdW50eSAKK1VTLU9LLTQwMDkzOk1ham9yIENvdW50eSAKK1VTLU9LLTQwMDk1Ok1hcnNoYWxsIENvdW50eSAKK1VTLU9LLTQwMDk3Ok1heWVzIENvdW50eSAKK1VTLU9LLTQwMDk5Ok11cnJheSBDb3VudHkgCitVUy1PSy00MDEwMTpNdXNrb2dlZSBDb3VudHkgCitVUy1PSy00MDEwMzpOb2JsZSBDb3VudHkgCitVUy1PSy00MDEwNTpOb3dhdGEgQ291bnR5IAorVVMtT0stNDAxMDc6T2tmdXNrZWUgQ291bnR5IAorVVMtT0stNDAxMDk6T2tsYWhvbWEgQ291bnR5IAorVVMtT0stNDAxMTE6T2ttdWxnZWUgQ291bnR5IAorVVMtT0stNDAxMTM6T3NhZ2UgQ291bnR5IAorVVMtT0stNDAxMTU6T3R0YXdhIENvdW50eSAKK1VTLU9LLTQwMTE3OlBhd25lZSBDb3VudHkgCitVUy1PSy00MDExOTpQYXluZSBDb3VudHkgCitVUy1PSy00MDEyMTpQaXR0c2J1cmcgQ291bnR5IAorVVMtT0stNDAxMjM6UG9udG90b2MgQ291bnR5IAorVVMtT0stNDAxMjU6UG90dGF3YXRvbWllIENvdW50eSAKK1VTLU9LLTQwMTI3OlB1c2htYXRhaGEgQ291bnR5IAorVVMtT0stNDAxMjk6Um9nZXIgTWlsbHMgQ291bnR5IAorVVMtT0stNDAxMzE6Um9nZXJzIENvdW50eSAKK1VTLU9LLTQwMTMzOlNlbWlub2xlIENvdW50eSAKK1VTLU9LLTQwMTM1OlNlcXVveWFoIENvdW50eSAKK1VTLU9LLTQwMTM3OlN0ZXBoZW5zIENvdW50eSAKK1VTLU9LLTQwMTM5OlRleGFzIENvdW50eSAKK1VTLU9LLTQwMTQxOlRpbGxtYW4gQ291bnR5IAorVVMtT0stNDAxNDM6VHVsc2EgQ291bnR5IAorVVMtT0stNDAxNDU6V2Fnb25lciBDb3VudHkgCitVUy1PSy00MDE0NzpXYXNoaW5ndG9uIENvdW50eSAKK1VTLU9LLTQwMTQ5Oldhc2hpdGEgQ291bnR5IAorVVMtT0stNDAxNTE6V29vZHMgQ291bnR5IAorVVMtT0stNDAxNTM6V29vZHdhcmQgQ291bnR5IAorIyB1bmRlciBBZG1pbiBMZXZlbFsxXSBJRFs0MV06T3JlZ29uIAorVVMtT1ItNDEwMDE6QmFrZXIgQ291bnR5IAorVVMtT1ItNDEwMDM6QmVudG9uIENvdW50eSAKK1VTLU9SLTQxMDA1OkNsYWNrYW1hcyBDb3VudHkgCitVUy1PUi00MTAwNzpDbGF0c29wIENvdW50eSAKK1VTLU9SLTQxMDA5OkNvbHVtYmlhIENvdW50eSAKK1VTLU9SLTQxMDExOkNvb3MgQ291bnR5IAorVVMtT1ItNDEwMTM6Q3Jvb2sgQ291bnR5IAorVVMtT1ItNDEwMTU6Q3VycnkgQ291bnR5IAorVVMtT1ItNDEwMTc6RGVzY2h1dGVzIENvdW50eSAKK1VTLU9SLTQxMDE5OkRvdWdsYXMgQ291bnR5IAorVVMtT1ItNDEwMjE6R2lsbGlhbSBDb3VudHkgCitVUy1PUi00MTAyMzpHcmFudCBDb3VudHkgCitVUy1PUi00MTAyNTpIYXJuZXkgQ291bnR5IAorVVMtT1ItNDEwMjc6SG9vZCBSaXZlciBDb3VudHkgCitVUy1PUi00MTAyOTpKYWNrc29uIENvdW50eSAKK1VTLU9SLTQxMDMxOkplZmZlcnNvbiBDb3VudHkgCitVUy1PUi00MTAzMzpKb3NlcGhpbmUgQ291bnR5IAorVVMtT1ItNDEwMzU6S2xhbWF0aCBDb3VudHkgCitVUy1PUi00MTAzNzpMYWtlIENvdW50eSAKK1VTLU9SLTQxMDM5OkxhbmUgQ291bnR5IAorVVMtT1ItNDEwNDE6TGluY29sbiBDb3VudHkgCitVUy1PUi00MTA0MzpMaW5uIENvdW50eSAKK1VTLU9SLTQxMDQ1Ok1hbGhldXIgQ291bnR5IAorVVMtT1ItNDEwNDc6TWFyaW9uIENvdW50eSAKK1VTLU9SLTQxMDQ5Ok1vcnJvdyBDb3VudHkgCitVUy1PUi00MTA1MTpNdWx0bm9tYWggQ291bnR5IAorVVMtT1ItNDEwNTM6UG9sayBDb3VudHkgCitVUy1PUi00MTA1NTpTaGVybWFuIENvdW50eSAKK1VTLU9SLTQxMDU3OlRpbGxhbW9vayBDb3VudHkgCitVUy1PUi00MTA1OTpVbWF0aWxsYSBDb3VudHkgCitVUy1PUi00MTA2MTpVbmlvbiBDb3VudHkgCitVUy1PUi00MTA2MzpXYWxsb3dhIENvdW50eSAKK1VTLU9SLTQxMDY1Oldhc2NvIENvdW50eSAKK1VTLU9SLTQxMDY3Oldhc2hpbmd0b24gQ291bnR5IAorVVMtT1ItNDEwNjk6V2hlZWxlciBDb3VudHkgCitVUy1PUi00MTA3MTpZYW1oaWxsIENvdW50eSAKKyMgdW5kZXIgQWRtaW4gTGV2ZWxbMV0gSURbNDJdOlBlbm5zeWx2YW5pYSAKK1VTLVBBLTQyMDAxOkFkYW1zIENvdW50eSAKK1VTLVBBLTQyMDAzOkFsbGVnaGVueSBDb3VudHkgCitVUy1QQS00MjAwNTpBcm1zdHJvbmcgQ291bnR5IAorVVMtUEEtNDIwMDc6QmVhdmVyIENvdW50eSAKK1VTLVBBLTQyMDA5OkJlZGZvcmQgQ291bnR5IAorVVMtUEEtNDIwMTE6QmVya3MgQ291bnR5IAorVVMtUEEtNDIwMTM6QmxhaXIgQ291bnR5IAorVVMtUEEtNDIwMTU6QnJhZGZvcmQgQ291bnR5IAorVVMtUEEtNDIwMTc6QnVja3MgQ291bnR5IAorVVMtUEEtNDIwMTk6QnV0bGVyIENvdW50eSAKK1VTLVBBLTQyMDIxOkNhbWJyaWEgQ291bnR5IAorVVMtUEEtNDIwMjM6Q2FtZXJvbiBDb3VudHkgCitVUy1QQS00MjAyNTpDYXJib24gQ291bnR5IAorVVMtUEEtNDIwMjc6Q2VudHJlIENvdW50eSAKK1VTLVBBLTQyMDI5OkNoZXN0ZXIgQ291bnR5IAorVVMtUEEtNDIwMzE6Q2xhcmlvbiBDb3VudHkgCitVUy1QQS00MjAzMzpDbGVhcmZpZWxkIENvdW50eSAKK1VTLVBBLTQyMDM1OkNsaW50b24gQ291bnR5IAorVVMtUEEtNDIwMzc6Q29sdW1iaWEgQ291bnR5IAorVVMtUEEtNDIwMzk6Q3Jhd2ZvcmQgQ291bnR5IAorVVMtUEEtNDIwNDE6Q3VtYmVybGFuZCBDb3VudHkgCitVUy1QQS00MjA0MzpEYXVwaGluIENvdW50eSAKK1VTLVBBLTQyMDQ1OkRlbGF3YXJlIENvdW50eSAKK1VTLVBBLTQyMDQ3OkVsayBDb3VudHkgCitVUy1QQS00MjA0OTpFcmllIENvdW50eSAKK1VTLVBBLTQyMDUxOkZheWV0dGUgQ291bnR5IAorVVMtUEEtNDIwNTM6Rm9yZXN0IENvdW50eSAKK1VTLVBBLTQyMDU1OkZyYW5rbGluIENvdW50eSAKK1VTLVBBLTQyMDU3OkZ1bHRvbiBDb3VudHkgCitVUy1QQS00MjA1OTpHcmVlbmUgQ291bnR5IAorVVMtUEEtNDIwNjE6SHVudGluZ2RvbiBDb3VudHkgCitVUy1QQS00MjA2MzpJbmRpYW5hIENvdW50eSAKK1VTLVBBLTQyMDY1OkplZmZlcnNvbiBDb3VudHkgCitVUy1QQS00MjA2NzpKdW5pYXRhIENvdW50eSAKK1VTLVBBLTQyMDY5OkxhY2thd2FubmEgQ291bnR5IAorVVMtUEEtNDIwNzE6TGFuY2FzdGVyIENvdW50eSAKK1VTLVBBLTQyMDczOkxhd3JlbmNlIENvdW50eSAKK1VTLVBBLTQyMDc1OkxlYmFub24gQ291bnR5IAorVVMtUEEtNDIwNzc6TGVoaWdoIENvdW50eSAKK1VTLVBBLTQyMDc5Okx1emVybmUgQ291bnR5IAorVVMtUEEtNDIwODE6THljb21pbmcgQ291bnR5IAorVVMtUEEtNDIwODM6TWNLZWFuIENvdW50eSAKK1VTLVBBLTQyMDg1Ok1lcmNlciBDb3VudHkgCitVUy1QQS00MjA4NzpNaWZmbGluIENvdW50eSAKK1VTLVBBLTQyMDg5Ok1vbnJvZSBDb3VudHkgCitVUy1QQS00MjA5MTpNb250Z29tZXJ5IENvdW50eSAKK1VTLVBBLTQyMDkzOk1vbnRvdXIgQ291bnR5IAorVVMtUEEtNDIwOTU6Tm9ydGhhbXB0b24gQ291bnR5IAorVVMtUEEtNDIwOTc6Tm9ydGh1bWJlcmxhbmQgQ291bnR5IAorVVMtUEEtNDIwOTk6UGVycnkgQ291bnR5IAorVVMtUEEtNDIxMDE6UGhpbGFkZWxwaGlhIENvdW50eSAKK1VTLVBBLTQyMTAzOlBpa2UgQ291bnR5IAorVVMtUEEtNDIxMDU6UG90dGVyIENvdW50eSAKK1VTLVBBLTQyMTA3OlNjaHV5bGtpbGwgQ291bnR5IAorVVMtUEEtNDIxMDk6U255ZGVyIENvdW50eSAKK1VTLVBBLTQyMTExOlNvbWVyc2V0IENvdW50eSAKK1VTLVBBLTQyMTEzOlN1bGxpdmFuIENvdW50eSAKK1VTLVBBLTQyMTE1OlN1c3F1ZWhhbm5hIENvdW50eSAKK1VTLVBBLTQyMTE3OlRpb2dhIENvdW50eSAKK1VTLVBBLTQyMTE5OlVuaW9uIENvdW50eSAKK1VTLVBBLTQyMTIxOlZlbmFuZ28gQ291bnR5IAorVVMtUEEtNDIxMjM6V2FycmVuIENvdW50eSAKK1VTLVBBLTQyMTI1Oldhc2hpbmd0b24gQ291bnR5IAorVVMtUEEtNDIxMjc6V2F5bmUgQ291bnR5IAorVVMtUEEtNDIxMjk6V2VzdG1vcmVsYW5kIENvdW50eSAKK1VTLVBBLTQyMTMxOld5b21pbmcgQ291bnR5IAorVVMtUEEtNDIxMzM6WW9yayBDb3VudHkgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEW1VTLVBSXTpQdWVydG8gUmljbworVVMtUFItNzIwMDE6QWRqdW50YXMgCitVUy1QUi03MjAwMzpBZ3VhZGEgCitVUy1QUi03MjAwNTpBZ3VhZGlsbGEgCitVUy1QUi03MjAwNzpBZ3VhcyBCdWVuYXMgCitVUy1QUi03MjAwOTpBaWJvbml0byAKK1VTLVBSLTcyMDExOkHxYXNjbyAKK1VTLVBSLTcyMDEzOkFyZWNpYm8gCitVUy1QUi03MjAxNTpBcnJveW8gCitVUy1QUi03MjAxNzpCYXJjZWxvbmV0YSAKK1VTLVBSLTcyMDE5OkJhcnJhbnF1aXRhcyAKK1VTLVBSLTcyMDIxOkJheWFt824gCitVUy1QUi03MjAyMzpDYWJvIFJvam8gCitVUy1QUi03MjAyNTpDYWd1YXMgCitVUy1QUi03MjAyNzpDYW11eSAKK1VTLVBSLTcyMDI5OkNhbvN2YW5hcyAKK1VTLVBSLTcyMDMxOkNhcm9saW5hIAorVVMtUFItNzIwMzM6Q2F0YfFvIAorVVMtUFItNzIwMzU6Q2F5ZXkgCitVUy1QUi03MjAzNzpDZWliYSAKK1VTLVBSLTcyMDM5OkNpYWxlcyAKK1VTLVBSLTcyMDQxOkNpZHJhIAorVVMtUFItNzIwNDM6Q29hbW8gCitVUy1QUi03MjA0NTpDb21lcu1vIAorVVMtUFItNzIwNDc6Q29yb3phbCAKK1VTLVBSLTcyMDQ5OkN1bGVicmEgCitVUy1QUi03MjA1MTpEb3JhZG8gCitVUy1QUi03MjA1MzpGYWphcmRvIAorVVMtUFItNzIwNTQ6RmxvcmlkYSAKK1VTLVBSLTcyMDU1Okd14W5pY2EgCitVUy1QUi03MjA1NzpHdWF5YW1hIAorVVMtUFItNzIwNTk6R3VheWFuaWxsYSAKK1VTLVBSLTcyMDYxOkd1YXluYWJvIAorVVMtUFItNzIwNjM6R3VyYWJvIAorVVMtUFItNzIwNjU6SGF0aWxsbyAKK1VTLVBSLTcyMDY3Okhvcm1pZ3Vlcm9zIAorVVMtUFItNzIwNjk6SHVtYWNhbyAKK1VTLVBSLTcyMDcxOklzYWJlbGEgCitVUy1QUi03MjA3MzpKYXl1eWEgCitVUy1QUi03MjA3NTpKdWFuYSBE7WF6IAorVVMtUFItNzIwNzc6SnVuY29zIAorVVMtUFItNzIwNzk6TGFqYXMgCitVUy1QUi03MjA4MTpMYXJlcyAKK1VTLVBSLTcyMDgzOkxhcyBNYXLtYXMgCitVUy1QUi03MjA4NTpMYXMgUGllZHJhcyAKK1VTLVBSLTcyMDg3Okxv7XphIAorVVMtUFItNzIwODk6THVxdWlsbG8gCitVUy1QUi03MjA5MTpNYW5hdO0gCitVUy1QUi03MjA5MzpNYXJpY2FvIAorVVMtUFItNzIwOTU6TWF1bmFibyAKK1VTLVBSLTcyMDk3Ok1heWFn/GV6IAorVVMtUFItNzIwOTk6TW9jYSAKK1VTLVBSLTcyMTAxOk1vcm92aXMgCitVUy1QUi03MjEwMzpOYWd1YWJvIAorVVMtUFItNzIxMDU6TmFyYW5qaXRvIAorVVMtUFItNzIxMDc6T3JvY292aXMgCitVUy1QUi03MjEwOTpQYXRpbGxhcyAKK1VTLVBSLTcyMTExOlBl8XVlbGFzIAorVVMtUFItNzIxMTM6UG9uY2UgCitVUy1QUi03MjExNTpRdWVicmFkaWxsYXMgCitVUy1QUi03MjExNzpSaW5j824gCitVUy1QUi03MjExOTpS7W8gR3JhbmRlIAorVVMtUFItNzIxMjE6U2FiYW5hIEdyYW5kZSAKK1VTLVBSLTcyMTIzOlNhbGluYXMgCitVUy1QUi03MjEyNTpTYW4gR2VybeFuIAorVVMtUFItNzIxMjc6U2FuIEp1YW4gCitVUy1QUi03MjEyOTpTYW4gTG9yZW56byAKK1VTLVBSLTcyMTMxOlNhbiBTZWJhc3Rp4W4gCitVUy1QUi03MjEzMzpTYW50YSBJc2FiZWwgCitVUy1QUi03MjEzNTpUb2EgQWx0YSAKK1VTLVBSLTcyMTM3OlRvYSBCYWphIAorVVMtUFItNzIxMzk6VHJ1amlsbG8gQWx0byAKK1VTLVBSLTcyMTQxOlV0dWFkbyAKK1VTLVBSLTcyMTQzOlZlZ2EgQWx0YSAKK1VTLVBSLTcyMTQ1OlZlZ2EgQmFqYSAKK1VTLVBSLTcyMTQ3OlZpZXF1ZXMgCitVUy1QUi03MjE0OTpWaWxsYWxiYSAKK1VTLVBSLTcyMTUxOllhYnVjb2EgCitVUy1QUi03MjE1MzpZYXVjbyAKKyMgdW5kZXIgQWRtaW4gTGV2ZWxbMV0gSURbNDRdOlJob2RlIElzbGFuZCAKK1VTLVJJLTQ0MDAxOkJyaXN0b2wgQ291bnR5IAorVVMtUkktNDQwMDM6S2VudCBDb3VudHkgCitVUy1SSS00NDAwNTpOZXdwb3J0IENvdW50eSAKK1VTLVJJLTQ0MDA3OlByb3ZpZGVuY2UgQ291bnR5IAorVVMtUkktNDQwMDk6V2FzaGluZ3RvbiBDb3VudHkgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEWzQ1XTpTb3V0aCBDYXJvbGluYSAKK1VTLVNDLTQ1MDAxOkFiYmV2aWxsZSBDb3VudHkgCitVUy1TQy00NTAwMzpBaWtlbiBDb3VudHkgCitVUy1TQy00NTAwNTpBbGxlbmRhbGUgQ291bnR5IAorVVMtU0MtNDUwMDc6QW5kZXJzb24gQ291bnR5IAorVVMtU0MtNDUwMDk6QmFtYmVyZyBDb3VudHkgCitVUy1TQy00NTAxMTpCYXJud2VsbCBDb3VudHkgCitVUy1TQy00NTAxMzpCZWF1Zm9ydCBDb3VudHkgCitVUy1TQy00NTAxNTpCZXJrZWxleSBDb3VudHkgCitVUy1TQy00NTAxNzpDYWxob3VuIENvdW50eSAKK1VTLVNDLTQ1MDE5OkNoYXJsZXN0b24gQ291bnR5IAorVVMtU0MtNDUwMjE6Q2hlcm9rZWUgQ291bnR5IAorVVMtU0MtNDUwMjM6Q2hlc3RlciBDb3VudHkgCitVUy1TQy00NTAyNTpDaGVzdGVyZmllbGQgQ291bnR5IAorVVMtU0MtNDUwMjc6Q2xhcmVuZG9uIENvdW50eSAKK1VTLVNDLTQ1MDI5OkNvbGxldG9uIENvdW50eSAKK1VTLVNDLTQ1MDMxOkRhcmxpbmd0b24gQ291bnR5IAorVVMtU0MtNDUwMzM6RGlsbG9uIENvdW50eSAKK1VTLVNDLTQ1MDM1OkRvcmNoZXN0ZXIgQ291bnR5IAorVVMtU0MtNDUwMzc6RWRnZWZpZWxkIENvdW50eSAKK1VTLVNDLTQ1MDM5OkZhaXJmaWVsZCBDb3VudHkgCitVUy1TQy00NTA0MTpGbG9yZW5jZSBDb3VudHkgCitVUy1TQy00NTA0MzpHZW9yZ2V0b3duIENvdW50eSAKK1VTLVNDLTQ1MDQ1OkdyZWVudmlsbGUgQ291bnR5IAorVVMtU0MtNDUwNDc6R3JlZW53b29kIENvdW50eSAKK1VTLVNDLTQ1MDQ5OkhhbXB0b24gQ291bnR5IAorVVMtU0MtNDUwNTE6SG9ycnkgQ291bnR5IAorVVMtU0MtNDUwNTM6SmFzcGVyIENvdW50eSAKK1VTLVNDLTQ1MDU1OktlcnNoYXcgQ291bnR5IAorVVMtU0MtNDUwNTc6TGFuY2FzdGVyIENvdW50eSAKK1VTLVNDLTQ1MDU5OkxhdXJlbnMgQ291bnR5IAorVVMtU0MtNDUwNjE6TGVlIENvdW50eSAKK1VTLVNDLTQ1MDYzOkxleGluZ3RvbiBDb3VudHkgCitVUy1TQy00NTA2NTpNY0Nvcm1pY2sgQ291bnR5IAorVVMtU0MtNDUwNjc6TWFyaW9uIENvdW50eSAKK1VTLVNDLTQ1MDY5Ok1hcmxib3JvIENvdW50eSAKK1VTLVNDLTQ1MDcxOk5ld2JlcnJ5IENvdW50eSAKK1VTLVNDLTQ1MDczOk9jb25lZSBDb3VudHkgCitVUy1TQy00NTA3NTpPcmFuZ2VidXJnIENvdW50eSAKK1VTLVNDLTQ1MDc3OlBpY2tlbnMgQ291bnR5IAorVVMtU0MtNDUwNzk6UmljaGxhbmQgQ291bnR5IAorVVMtU0MtNDUwODE6U2FsdWRhIENvdW50eSAKK1VTLVNDLTQ1MDgzOlNwYXJ0YW5idXJnIENvdW50eSAKK1VTLVNDLTQ1MDg1OlN1bXRlciBDb3VudHkgCitVUy1TQy00NTA4NzpVbmlvbiBDb3VudHkgCitVUy1TQy00NTA4OTpXaWxsaWFtc2J1cmcgQ291bnR5IAorVVMtU0MtNDUwOTE6WW9yayBDb3VudHkgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEWzQ2XTpTb3V0aCBEYWtvdGEgCitVUy1TRC00NjAwMzpBdXJvcmEgQ291bnR5IAorVVMtU0QtNDYwMDU6QmVhZGxlIENvdW50eSAKK1VTLVNELTQ2MDA3OkJlbm5ldHQgQ291bnR5IAorVVMtU0QtNDYwMDk6Qm9uIEhvbW1lIENvdW50eSAKK1VTLVNELTQ2MDExOkJyb29raW5ncyBDb3VudHkgCitVUy1TRC00NjAxMzpCcm93biBDb3VudHkgCitVUy1TRC00NjAxNTpCcnVsZSBDb3VudHkgCitVUy1TRC00NjAxNzpCdWZmYWxvIENvdW50eSAKK1VTLVNELTQ2MDE5OkJ1dHRlIENvdW50eSAKK1VTLVNELTQ2MDIxOkNhbXBiZWxsIENvdW50eSAKK1VTLVNELTQ2MDIzOkNoYXJsZXMgTWl4IENvdW50eSAKK1VTLVNELTQ2MDI1OkNsYXJrIENvdW50eSAKK1VTLVNELTQ2MDI3OkNsYXkgQ291bnR5IAorVVMtU0QtNDYwMjk6Q29kaW5ndG9uIENvdW50eSAKK1VTLVNELTQ2MDMxOkNvcnNvbiBDb3VudHkgCitVUy1TRC00NjAzMzpDdXN0ZXIgQ291bnR5IAorVVMtU0QtNDYwMzU6RGF2aXNvbiBDb3VudHkgCitVUy1TRC00NjAzNzpEYXkgQ291bnR5IAorVVMtU0QtNDYwMzk6RGV1ZWwgQ291bnR5IAorVVMtU0QtNDYwNDE6RGV3ZXkgQ291bnR5IAorVVMtU0QtNDYwNDM6RG91Z2xhcyBDb3VudHkgCitVUy1TRC00NjA0NTpFZG11bmRzIENvdW50eSAKK1VTLVNELTQ2MDQ3OkZhbGwgUml2ZXIgQ291bnR5IAorVVMtU0QtNDYwNDk6RmF1bGsgQ291bnR5IAorVVMtU0QtNDYwNTE6R3JhbnQgQ291bnR5IAorVVMtU0QtNDYwNTM6R3JlZ29yeSBDb3VudHkgCitVUy1TRC00NjA1NTpIYWFrb24gQ291bnR5IAorVVMtU0QtNDYwNTc6SGFtbGluIENvdW50eSAKK1VTLVNELTQ2MDU5OkhhbmQgQ291bnR5IAorVVMtU0QtNDYwNjE6SGFuc29uIENvdW50eSAKK1VTLVNELTQ2MDYzOkhhcmRpbmcgQ291bnR5IAorVVMtU0QtNDYwNjU6SHVnaGVzIENvdW50eSAKK1VTLVNELTQ2MDY3Okh1dGNoaW5zb24gQ291bnR5IAorVVMtU0QtNDYwNjk6SHlkZSBDb3VudHkgCitVUy1TRC00NjA3MTpKYWNrc29uIENvdW50eSAKK1VTLVNELTQ2MDczOkplcmF1bGQgQ291bnR5IAorVVMtU0QtNDYwNzU6Sm9uZXMgQ291bnR5IAorVVMtU0QtNDYwNzc6S2luZ3NidXJ5IENvdW50eSAKK1VTLVNELTQ2MDc5Okxha2UgQ291bnR5IAorVVMtU0QtNDYwODE6TGF3cmVuY2UgQ291bnR5IAorVVMtU0QtNDYwODM6TGluY29sbiBDb3VudHkgCitVUy1TRC00NjA4NTpMeW1hbiBDb3VudHkgCitVUy1TRC00NjA4NzpNY0Nvb2sgQ291bnR5IAorVVMtU0QtNDYwODk6TWNQaGVyc29uIENvdW50eSAKK1VTLVNELTQ2MDkxOk1hcnNoYWxsIENvdW50eSAKK1VTLVNELTQ2MDkzOk1lYWRlIENvdW50eSAKK1VTLVNELTQ2MDk1Ok1lbGxldHRlIENvdW50eSAKK1VTLVNELTQ2MDk3Ok1pbmVyIENvdW50eSAKK1VTLVNELTQ2MDk5Ok1pbm5laGFoYSBDb3VudHkgCitVUy1TRC00NjEwMTpNb29keSBDb3VudHkgCitVUy1TRC00NjEwMzpQZW5uaW5ndG9uIENvdW50eSAKK1VTLVNELTQ2MTA1OlBlcmtpbnMgQ291bnR5IAorVVMtU0QtNDYxMDc6UG90dGVyIENvdW50eSAKK1VTLVNELTQ2MTA5OlJvYmVydHMgQ291bnR5IAorVVMtU0QtNDYxMTE6U2FuYm9ybiBDb3VudHkgCitVUy1TRC00NjExMzpTaGFubm9uIENvdW50eSAKK1VTLVNELTQ2MTE1OlNwaW5rIENvdW50eSAKK1VTLVNELTQ2MTE3OlN0YW5sZXkgQ291bnR5IAorVVMtU0QtNDYxMTk6U3VsbHkgQ291bnR5IAorVVMtU0QtNDYxMjE6VG9kZCBDb3VudHkgCitVUy1TRC00NjEyMzpUcmlwcCBDb3VudHkgCitVUy1TRC00NjEyNTpUdXJuZXIgQ291bnR5IAorVVMtU0QtNDYxMjc6VW5pb24gQ291bnR5IAorVVMtU0QtNDYxMjk6V2Fsd29ydGggQ291bnR5IAorVVMtU0QtNDYxMzU6WWFua3RvbiBDb3VudHkgCitVUy1TRC00NjEzNzpaaWViYWNoIENvdW50eSAKKyMgdW5kZXIgQWRtaW4gTGV2ZWxbMV0gSURbNDddOlRlbm5lc3NlZSAKK1VTLVROLTQ3MDAxOkFuZGVyc29uIENvdW50eSAKK1VTLVROLTQ3MDAzOkJlZGZvcmQgQ291bnR5IAorVVMtVE4tNDcwMDU6QmVudG9uIENvdW50eSAKK1VTLVROLTQ3MDA3OkJsZWRzb2UgQ291bnR5IAorVVMtVE4tNDcwMDk6QmxvdW50IENvdW50eSAKK1VTLVROLTQ3MDExOkJyYWRsZXkgQ291bnR5IAorVVMtVE4tNDcwMTM6Q2FtcGJlbGwgQ291bnR5IAorVVMtVE4tNDcwMTU6Q2Fubm9uIENvdW50eSAKK1VTLVROLTQ3MDE3OkNhcnJvbGwgQ291bnR5IAorVVMtVE4tNDcwMTk6Q2FydGVyIENvdW50eSAKK1VTLVROLTQ3MDIxOkNoZWF0aGFtIENvdW50eSAKK1VTLVROLTQ3MDIzOkNoZXN0ZXIgQ291bnR5IAorVVMtVE4tNDcwMjU6Q2xhaWJvcm5lIENvdW50eSAKK1VTLVROLTQ3MDI3OkNsYXkgQ291bnR5IAorVVMtVE4tNDcwMjk6Q29ja2UgQ291bnR5IAorVVMtVE4tNDcwMzE6Q29mZmVlIENvdW50eSAKK1VTLVROLTQ3MDMzOkNyb2NrZXR0IENvdW50eSAKK1VTLVROLTQ3MDM1OkN1bWJlcmxhbmQgQ291bnR5IAorVVMtVE4tNDcwMzc6RGF2aWRzb24gQ291bnR5IAorVVMtVE4tNDcwMzk6RGVjYXR1ciBDb3VudHkgCitVUy1UTi00NzA0MTpEZUthbGIgQ291bnR5IAorVVMtVE4tNDcwNDM6RGlja3NvbiBDb3VudHkgCitVUy1UTi00NzA0NTpEeWVyIENvdW50eSAKK1VTLVROLTQ3MDQ3OkZheWV0dGUgQ291bnR5IAorVVMtVE4tNDcwNDk6RmVudHJlc3MgQ291bnR5IAorVVMtVE4tNDcwNTE6RnJhbmtsaW4gQ291bnR5IAorVVMtVE4tNDcwNTM6R2lic29uIENvdW50eSAKK1VTLVROLTQ3MDU1OkdpbGVzIENvdW50eSAKK1VTLVROLTQ3MDU3OkdyYWluZ2VyIENvdW50eSAKK1VTLVROLTQ3MDU5OkdyZWVuZSBDb3VudHkgCitVUy1UTi00NzA2MTpHcnVuZHkgQ291bnR5IAorVVMtVE4tNDcwNjM6SGFtYmxlbiBDb3VudHkgCitVUy1UTi00NzA2NTpIYW1pbHRvbiBDb3VudHkgCitVUy1UTi00NzA2NzpIYW5jb2NrIENvdW50eSAKK1VTLVROLTQ3MDY5OkhhcmRlbWFuIENvdW50eSAKK1VTLVROLTQ3MDcxOkhhcmRpbiBDb3VudHkgCitVUy1UTi00NzA3MzpIYXdraW5zIENvdW50eSAKK1VTLVROLTQ3MDc1OkhheXdvb2QgQ291bnR5IAorVVMtVE4tNDcwNzc6SGVuZGVyc29uIENvdW50eSAKK1VTLVROLTQ3MDc5OkhlbnJ5IENvdW50eSAKK1VTLVROLTQ3MDgxOkhpY2ttYW4gQ291bnR5IAorVVMtVE4tNDcwODM6SG91c3RvbiBDb3VudHkgCitVUy1UTi00NzA4NTpIdW1waHJleXMgQ291bnR5IAorVVMtVE4tNDcwODc6SmFja3NvbiBDb3VudHkgCitVUy1UTi00NzA4OTpKZWZmZXJzb24gQ291bnR5IAorVVMtVE4tNDcwOTE6Sm9obnNvbiBDb3VudHkgCitVUy1UTi00NzA5MzpLbm94IENvdW50eSAKK1VTLVROLTQ3MDk1Okxha2UgQ291bnR5IAorVVMtVE4tNDcwOTc6TGF1ZGVyZGFsZSBDb3VudHkgCitVUy1UTi00NzA5OTpMYXdyZW5jZSBDb3VudHkgCitVUy1UTi00NzEwMTpMZXdpcyBDb3VudHkgCitVUy1UTi00NzEwMzpMaW5jb2xuIENvdW50eSAKK1VTLVROLTQ3MTA1OkxvdWRvbiBDb3VudHkgCitVUy1UTi00NzEwNzpNY01pbm4gQ291bnR5IAorVVMtVE4tNDcxMDk6TWNOYWlyeSBDb3VudHkgCitVUy1UTi00NzExMTpNYWNvbiBDb3VudHkgCitVUy1UTi00NzExMzpNYWRpc29uIENvdW50eSAKK1VTLVROLTQ3MTE1Ok1hcmlvbiBDb3VudHkgCitVUy1UTi00NzExNzpNYXJzaGFsbCBDb3VudHkgCitVUy1UTi00NzExOTpNYXVyeSBDb3VudHkgCitVUy1UTi00NzEyMTpNZWlncyBDb3VudHkgCitVUy1UTi00NzEyMzpNb25yb2UgQ291bnR5IAorVVMtVE4tNDcxMjU6TW9udGdvbWVyeSBDb3VudHkgCitVUy1UTi00NzEyNzpNb29yZSBDb3VudHkgCitVUy1UTi00NzEyOTpNb3JnYW4gQ291bnR5IAorVVMtVE4tNDcxMzE6T2Jpb24gQ291bnR5IAorVVMtVE4tNDcxMzM6T3ZlcnRvbiBDb3VudHkgCitVUy1UTi00NzEzNTpQZXJyeSBDb3VudHkgCitVUy1UTi00NzEzNzpQaWNrZXR0IENvdW50eSAKK1VTLVROLTQ3MTM5OlBvbGsgQ291bnR5IAorVVMtVE4tNDcxNDE6UHV0bmFtIENvdW50eSAKK1VTLVROLTQ3MTQzOlJoZWEgQ291bnR5IAorVVMtVE4tNDcxNDU6Um9hbmUgQ291bnR5IAorVVMtVE4tNDcxNDc6Um9iZXJ0c29uIENvdW50eSAKK1VTLVROLTQ3MTQ5OlJ1dGhlcmZvcmQgQ291bnR5IAorVVMtVE4tNDcxNTE6U2NvdHQgQ291bnR5IAorVVMtVE4tNDcxNTM6U2VxdWF0Y2hpZSBDb3VudHkgCitVUy1UTi00NzE1NTpTZXZpZXIgQ291bnR5IAorVVMtVE4tNDcxNTc6U2hlbGJ5IENvdW50eSAKK1VTLVROLTQ3MTU5OlNtaXRoIENvdW50eSAKK1VTLVROLTQ3MTYxOlN0ZXdhcnQgQ291bnR5IAorVVMtVE4tNDcxNjM6U3VsbGl2YW4gQ291bnR5IAorVVMtVE4tNDcxNjU6U3VtbmVyIENvdW50eSAKK1VTLVROLTQ3MTY3OlRpcHRvbiBDb3VudHkgCitVUy1UTi00NzE2OTpUcm91c2RhbGUgQ291bnR5IAorVVMtVE4tNDcxNzE6VW5pY29pIENvdW50eSAKK1VTLVROLTQ3MTczOlVuaW9uIENvdW50eSAKK1VTLVROLTQ3MTc1OlZhbiBCdXJlbiBDb3VudHkgCitVUy1UTi00NzE3NzpXYXJyZW4gQ291bnR5IAorVVMtVE4tNDcxNzk6V2FzaGluZ3RvbiBDb3VudHkgCitVUy1UTi00NzE4MTpXYXluZSBDb3VudHkgCitVUy1UTi00NzE4MzpXZWFrbGV5IENvdW50eSAKK1VTLVROLTQ3MTg1OldoaXRlIENvdW50eSAKK1VTLVROLTQ3MTg3OldpbGxpYW1zb24gQ291bnR5IAorVVMtVE4tNDcxODk6V2lsc29uIENvdW50eSAKKyMgdW5kZXIgQWRtaW4gTGV2ZWxbMV0gSURbNDhdOlRleGFzIAorVVMtVFgtNDgwMDE6QW5kZXJzb24gQ291bnR5IAorVVMtVFgtNDgwMDM6QW5kcmV3cyBDb3VudHkgCitVUy1UWC00ODAwNTpBbmdlbGluYSBDb3VudHkgCitVUy1UWC00ODAwNzpBcmFuc2FzIENvdW50eSAKK1VTLVRYLTQ4MDA5OkFyY2hlciBDb3VudHkgCitVUy1UWC00ODAxMTpBcm1zdHJvbmcgQ291bnR5IAorVVMtVFgtNDgwMTM6QXRhc2Nvc2EgQ291bnR5IAorVVMtVFgtNDgwMTU6QXVzdGluIENvdW50eSAKK1VTLVRYLTQ4MDE3OkJhaWxleSBDb3VudHkgCitVUy1UWC00ODAxOTpCYW5kZXJhIENvdW50eSAKK1VTLVRYLTQ4MDIxOkJhc3Ryb3AgQ291bnR5IAorVVMtVFgtNDgwMjM6QmF5bG9yIENvdW50eSAKK1VTLVRYLTQ4MDI1OkJlZSBDb3VudHkgCitVUy1UWC00ODAyNzpCZWxsIENvdW50eSAKK1VTLVRYLTQ4MDI5OkJleGFyIENvdW50eSAKK1VTLVRYLTQ4MDMxOkJsYW5jbyBDb3VudHkgCitVUy1UWC00ODAzMzpCb3JkZW4gQ291bnR5IAorVVMtVFgtNDgwMzU6Qm9zcXVlIENvdW50eSAKK1VTLVRYLTQ4MDM3OkJvd2llIENvdW50eSAKK1VTLVRYLTQ4MDM5OkJyYXpvcmlhIENvdW50eSAKK1VTLVRYLTQ4MDQxOkJyYXpvcyBDb3VudHkgCitVUy1UWC00ODA0MzpCcmV3c3RlciBDb3VudHkgCitVUy1UWC00ODA0NTpCcmlzY29lIENvdW50eSAKK1VTLVRYLTQ4MDQ3OkJyb29rcyBDb3VudHkgCitVUy1UWC00ODA0OTpCcm93biBDb3VudHkgCitVUy1UWC00ODA1MTpCdXJsZXNvbiBDb3VudHkgCitVUy1UWC00ODA1MzpCdXJuZXQgQ291bnR5IAorVVMtVFgtNDgwNTU6Q2FsZHdlbGwgQ291bnR5IAorVVMtVFgtNDgwNTc6Q2FsaG91biBDb3VudHkgCitVUy1UWC00ODA1OTpDYWxsYWhhbiBDb3VudHkgCitVUy1UWC00ODA2MTpDYW1lcm9uIENvdW50eSAKK1VTLVRYLTQ4MDYzOkNhbXAgQ291bnR5IAorVVMtVFgtNDgwNjU6Q2Fyc29uIENvdW50eSAKK1VTLVRYLTQ4MDY3OkNhc3MgQ291bnR5IAorVVMtVFgtNDgwNjk6Q2FzdHJvIENvdW50eSAKK1VTLVRYLTQ4MDcxOkNoYW1iZXJzIENvdW50eSAKK1VTLVRYLTQ4MDczOkNoZXJva2VlIENvdW50eSAKK1VTLVRYLTQ4MDc1OkNoaWxkcmVzcyBDb3VudHkgCitVUy1UWC00ODA3NzpDbGF5IENvdW50eSAKK1VTLVRYLTQ4MDc5OkNvY2hyYW4gQ291bnR5IAorVVMtVFgtNDgwODE6Q29rZSBDb3VudHkgCitVUy1UWC00ODA4MzpDb2xlbWFuIENvdW50eSAKK1VTLVRYLTQ4MDg1OkNvbGxpbiBDb3VudHkgCitVUy1UWC00ODA4NzpDb2xsaW5nc3dvcnRoIENvdW50eSAKK1VTLVRYLTQ4MDg5OkNvbG9yYWRvIENvdW50eSAKK1VTLVRYLTQ4MDkxOkNvbWFsIENvdW50eSAKK1VTLVRYLTQ4MDkzOkNvbWFuY2hlIENvdW50eSAKK1VTLVRYLTQ4MDk1OkNvbmNobyBDb3VudHkgCitVUy1UWC00ODA5NzpDb29rZSBDb3VudHkgCitVUy1UWC00ODA5OTpDb3J5ZWxsIENvdW50eSAKK1VTLVRYLTQ4MTAxOkNvdHRsZSBDb3VudHkgCitVUy1UWC00ODEwMzpDcmFuZSBDb3VudHkgCitVUy1UWC00ODEwNTpDcm9ja2V0dCBDb3VudHkgCitVUy1UWC00ODEwNzpDcm9zYnkgQ291bnR5IAorVVMtVFgtNDgxMDk6Q3VsYmVyc29uIENvdW50eSAKK1VTLVRYLTQ4MTExOkRhbGxhbSBDb3VudHkgCitVUy1UWC00ODExMzpEYWxsYXMgQ291bnR5IAorVVMtVFgtNDgxMTU6RGF3c29uIENvdW50eSAKK1VTLVRYLTQ4MTE3OkRlYWYgU21pdGggQ291bnR5IAorVVMtVFgtNDgxMTk6RGVsdGEgQ291bnR5IAorVVMtVFgtNDgxMjE6RGVudG9uIENvdW50eSAKK1VTLVRYLTQ4MTIzOkRlV2l0dCBDb3VudHkgCitVUy1UWC00ODEyNTpEaWNrZW5zIENvdW50eSAKK1VTLVRYLTQ4MTI3OkRpbW1pdCBDb3VudHkgCitVUy1UWC00ODEyOTpEb25sZXkgQ291bnR5IAorVVMtVFgtNDgxMzE6RHV2YWwgQ291bnR5IAorVVMtVFgtNDgxMzM6RWFzdGxhbmQgQ291bnR5IAorVVMtVFgtNDgxMzU6RWN0b3IgQ291bnR5IAorVVMtVFgtNDgxMzc6RWR3YXJkcyBDb3VudHkgCitVUy1UWC00ODEzOTpFbGxpcyBDb3VudHkgCitVUy1UWC00ODE0MTpFbCBQYXNvIENvdW50eSAKK1VTLVRYLTQ4MTQzOkVyYXRoIENvdW50eSAKK1VTLVRYLTQ4MTQ1OkZhbGxzIENvdW50eSAKK1VTLVRYLTQ4MTQ3OkZhbm5pbiBDb3VudHkgCitVUy1UWC00ODE0OTpGYXlldHRlIENvdW50eSAKK1VTLVRYLTQ4MTUxOkZpc2hlciBDb3VudHkgCitVUy1UWC00ODE1MzpGbG95ZCBDb3VudHkgCitVUy1UWC00ODE1NTpGb2FyZCBDb3VudHkgCitVUy1UWC00ODE1NzpGb3J0IEJlbmQgQ291bnR5IAorVVMtVFgtNDgxNTk6RnJhbmtsaW4gQ291bnR5IAorVVMtVFgtNDgxNjE6RnJlZXN0b25lIENvdW50eSAKK1VTLVRYLTQ4MTYzOkZyaW8gQ291bnR5IAorVVMtVFgtNDgxNjU6R2FpbmVzIENvdW50eSAKK1VTLVRYLTQ4MTY3OkdhbHZlc3RvbiBDb3VudHkgCitVUy1UWC00ODE2OTpHYXJ6YSBDb3VudHkgCitVUy1UWC00ODE3MTpHaWxsZXNwaWUgQ291bnR5IAorVVMtVFgtNDgxNzM6R2xhc3Njb2NrIENvdW50eSAKK1VTLVRYLTQ4MTc1OkdvbGlhZCBDb3VudHkgCitVUy1UWC00ODE3NzpHb256YWxlcyBDb3VudHkgCitVUy1UWC00ODE3OTpHcmF5IENvdW50eSAKK1VTLVRYLTQ4MTgxOkdyYXlzb24gQ291bnR5IAorVVMtVFgtNDgxODM6R3JlZ2cgQ291bnR5IAorVVMtVFgtNDgxODU6R3JpbWVzIENvdW50eSAKK1VTLVRYLTQ4MTg3Okd1YWRhbHVwZSBDb3VudHkgCitVUy1UWC00ODE4OTpIYWxlIENvdW50eSAKK1VTLVRYLTQ4MTkxOkhhbGwgQ291bnR5IAorVVMtVFgtNDgxOTM6SGFtaWx0b24gQ291bnR5IAorVVMtVFgtNDgxOTU6SGFuc2ZvcmQgQ291bnR5IAorVVMtVFgtNDgxOTc6SGFyZGVtYW4gQ291bnR5IAorVVMtVFgtNDgxOTk6SGFyZGluIENvdW50eSAKK1VTLVRYLTQ4MjAxOkhhcnJpcyBDb3VudHkgCitVUy1UWC00ODIwMzpIYXJyaXNvbiBDb3VudHkgCitVUy1UWC00ODIwNTpIYXJ0bGV5IENvdW50eSAKK1VTLVRYLTQ4MjA3Okhhc2tlbGwgQ291bnR5IAorVVMtVFgtNDgyMDk6SGF5cyBDb3VudHkgCitVUy1UWC00ODIxMTpIZW1waGlsbCBDb3VudHkgCitVUy1UWC00ODIxMzpIZW5kZXJzb24gQ291bnR5IAorVVMtVFgtNDgyMTU6SGlkYWxnbyBDb3VudHkgCitVUy1UWC00ODIxNzpIaWxsIENvdW50eSAKK1VTLVRYLTQ4MjE5OkhvY2tsZXkgQ291bnR5IAorVVMtVFgtNDgyMjE6SG9vZCBDb3VudHkgCitVUy1UWC00ODIyMzpIb3BraW5zIENvdW50eSAKK1VTLVRYLTQ4MjI1OkhvdXN0b24gQ291bnR5IAorVVMtVFgtNDgyMjc6SG93YXJkIENvdW50eSAKK1VTLVRYLTQ4MjI5Okh1ZHNwZXRoIENvdW50eSAKK1VTLVRYLTQ4MjMxOkh1bnQgQ291bnR5IAorVVMtVFgtNDgyMzM6SHV0Y2hpbnNvbiBDb3VudHkgCitVUy1UWC00ODIzNTpJcmlvbiBDb3VudHkgCitVUy1UWC00ODIzNzpKYWNrIENvdW50eSAKK1VTLVRYLTQ4MjM5OkphY2tzb24gQ291bnR5IAorVVMtVFgtNDgyNDE6SmFzcGVyIENvdW50eSAKK1VTLVRYLTQ4MjQzOkplZmYgRGF2aXMgQ291bnR5IAorVVMtVFgtNDgyNDU6SmVmZmVyc29uIENvdW50eSAKK1VTLVRYLTQ4MjQ3OkppbSBIb2dnIENvdW50eSAKK1VTLVRYLTQ4MjQ5OkppbSBXZWxscyBDb3VudHkgCitVUy1UWC00ODI1MTpKb2huc29uIENvdW50eSAKK1VTLVRYLTQ4MjUzOkpvbmVzIENvdW50eSAKK1VTLVRYLTQ4MjU1Okthcm5lcyBDb3VudHkgCitVUy1UWC00ODI1NzpLYXVmbWFuIENvdW50eSAKK1VTLVRYLTQ4MjU5OktlbmRhbGwgQ291bnR5IAorVVMtVFgtNDgyNjE6S2VuZWR5IENvdW50eSAKK1VTLVRYLTQ4MjYzOktlbnQgQ291bnR5IAorVVMtVFgtNDgyNjU6S2VyciBDb3VudHkgCitVUy1UWC00ODI2NzpLaW1ibGUgQ291bnR5IAorVVMtVFgtNDgyNjk6S2luZyBDb3VudHkgCitVUy1UWC00ODI3MTpLaW5uZXkgQ291bnR5IAorVVMtVFgtNDgyNzM6S2xlYmVyZyBDb3VudHkgCitVUy1UWC00ODI3NTpLbm94IENvdW50eSAKK1VTLVRYLTQ4Mjc3OkxhbWFyIENvdW50eSAKK1VTLVRYLTQ4Mjc5OkxhbWIgQ291bnR5IAorVVMtVFgtNDgyODE6TGFtcGFzYXMgQ291bnR5IAorVVMtVFgtNDgyODM6TGEgU2FsbGUgQ291bnR5IAorVVMtVFgtNDgyODU6TGF2YWNhIENvdW50eSAKK1VTLVRYLTQ4Mjg3OkxlZSBDb3VudHkgCitVUy1UWC00ODI4OTpMZW9uIENvdW50eSAKK1VTLVRYLTQ4MjkxOkxpYmVydHkgQ291bnR5IAorVVMtVFgtNDgyOTM6TGltZXN0b25lIENvdW50eSAKK1VTLVRYLTQ4Mjk1OkxpcHNjb21iIENvdW50eSAKK1VTLVRYLTQ4Mjk3OkxpdmUgT2FrIENvdW50eSAKK1VTLVRYLTQ4Mjk5OkxsYW5vIENvdW50eSAKK1VTLVRYLTQ4MzAxOkxvdmluZyBDb3VudHkgCitVUy1UWC00ODMwMzpMdWJib2NrIENvdW50eSAKK1VTLVRYLTQ4MzA1Okx5bm4gQ291bnR5IAorVVMtVFgtNDgzMDc6TWNDdWxsb2NoIENvdW50eSAKK1VTLVRYLTQ4MzA5Ok1jTGVubmFuIENvdW50eSAKK1VTLVRYLTQ4MzExOk1jTXVsbGVuIENvdW50eSAKK1VTLVRYLTQ4MzEzOk1hZGlzb24gQ291bnR5IAorVVMtVFgtNDgzMTU6TWFyaW9uIENvdW50eSAKK1VTLVRYLTQ4MzE3Ok1hcnRpbiBDb3VudHkgCitVUy1UWC00ODMxOTpNYXNvbiBDb3VudHkgCitVUy1UWC00ODMyMTpNYXRhZ29yZGEgQ291bnR5IAorVVMtVFgtNDgzMjM6TWF2ZXJpY2sgQ291bnR5IAorVVMtVFgtNDgzMjU6TWVkaW5hIENvdW50eSAKK1VTLVRYLTQ4MzI3Ok1lbmFyZCBDb3VudHkgCitVUy1UWC00ODMyOTpNaWRsYW5kIENvdW50eSAKK1VTLVRYLTQ4MzMxOk1pbGFtIENvdW50eSAKK1VTLVRYLTQ4MzMzOk1pbGxzIENvdW50eSAKK1VTLVRYLTQ4MzM1Ok1pdGNoZWxsIENvdW50eSAKK1VTLVRYLTQ4MzM3Ok1vbnRhZ3VlIENvdW50eSAKK1VTLVRYLTQ4MzM5Ok1vbnRnb21lcnkgQ291bnR5IAorVVMtVFgtNDgzNDE6TW9vcmUgQ291bnR5IAorVVMtVFgtNDgzNDM6TW9ycmlzIENvdW50eSAKK1VTLVRYLTQ4MzQ1Ok1vdGxleSBDb3VudHkgCitVUy1UWC00ODM0NzpOYWNvZ2RvY2hlcyBDb3VudHkgCitVUy1UWC00ODM0OTpOYXZhcnJvIENvdW50eSAKK1VTLVRYLTQ4MzUxOk5ld3RvbiBDb3VudHkgCitVUy1UWC00ODM1MzpOb2xhbiBDb3VudHkgCitVUy1UWC00ODM1NTpOdWVjZXMgQ291bnR5IAorVVMtVFgtNDgzNTc6T2NoaWx0cmVlIENvdW50eSAKK1VTLVRYLTQ4MzU5Ok9sZGhhbSBDb3VudHkgCitVUy1UWC00ODM2MTpPcmFuZ2UgQ291bnR5IAorVVMtVFgtNDgzNjM6UGFsbyBQaW50byBDb3VudHkgCitVUy1UWC00ODM2NTpQYW5vbGEgQ291bnR5IAorVVMtVFgtNDgzNjc6UGFya2VyIENvdW50eSAKK1VTLVRYLTQ4MzY5OlBhcm1lciBDb3VudHkgCitVUy1UWC00ODM3MTpQZWNvcyBDb3VudHkgCitVUy1UWC00ODM3MzpQb2xrIENvdW50eSAKK1VTLVRYLTQ4Mzc1OlBvdHRlciBDb3VudHkgCitVUy1UWC00ODM3NzpQcmVzaWRpbyBDb3VudHkgCitVUy1UWC00ODM3OTpSYWlucyBDb3VudHkgCitVUy1UWC00ODM4MTpSYW5kYWxsIENvdW50eSAKK1VTLVRYLTQ4MzgzOlJlYWdhbiBDb3VudHkgCitVUy1UWC00ODM4NTpSZWFsIENvdW50eSAKK1VTLVRYLTQ4Mzg3OlJlZCBSaXZlciBDb3VudHkgCitVUy1UWC00ODM4OTpSZWV2ZXMgQ291bnR5IAorVVMtVFgtNDgzOTE6UmVmdWdpbyBDb3VudHkgCitVUy1UWC00ODM5MzpSb2JlcnRzIENvdW50eSAKK1VTLVRYLTQ4Mzk1OlJvYmVydHNvbiBDb3VudHkgCitVUy1UWC00ODM5NzpSb2Nrd2FsbCBDb3VudHkgCitVUy1UWC00ODM5OTpSdW5uZWxzIENvdW50eSAKK1VTLVRYLTQ4NDAxOlJ1c2sgQ291bnR5IAorVVMtVFgtNDg0MDM6U2FiaW5lIENvdW50eSAKK1VTLVRYLTQ4NDA1OlNhbiBBdWd1c3RpbmUgQ291bnR5IAorVVMtVFgtNDg0MDc6U2FuIEphY2ludG8gQ291bnR5IAorVVMtVFgtNDg0MDk6U2FuIFBhdHJpY2lvIENvdW50eSAKK1VTLVRYLTQ4NDExOlNhbiBTYWJhIENvdW50eSAKK1VTLVRYLTQ4NDEzOlNjaGxlaWNoZXIgQ291bnR5IAorVVMtVFgtNDg0MTU6U2N1cnJ5IENvdW50eSAKK1VTLVRYLTQ4NDE3OlNoYWNrZWxmb3JkIENvdW50eSAKK1VTLVRYLTQ4NDE5OlNoZWxieSBDb3VudHkgCitVUy1UWC00ODQyMTpTaGVybWFuIENvdW50eSAKK1VTLVRYLTQ4NDIzOlNtaXRoIENvdW50eSAKK1VTLVRYLTQ4NDI1OlNvbWVydmVsbCBDb3VudHkgCitVUy1UWC00ODQyNzpTdGFyciBDb3VudHkgCitVUy1UWC00ODQyOTpTdGVwaGVucyBDb3VudHkgCitVUy1UWC00ODQzMTpTdGVybGluZyBDb3VudHkgCitVUy1UWC00ODQzMzpTdG9uZXdhbGwgQ291bnR5IAorVVMtVFgtNDg0MzU6U3V0dG9uIENvdW50eSAKK1VTLVRYLTQ4NDM3OlN3aXNoZXIgQ291bnR5IAorVVMtVFgtNDg0Mzk6VGFycmFudCBDb3VudHkgCitVUy1UWC00ODQ0MTpUYXlsb3IgQ291bnR5IAorVVMtVFgtNDg0NDM6VGVycmVsbCBDb3VudHkgCitVUy1UWC00ODQ0NTpUZXJyeSBDb3VudHkgCitVUy1UWC00ODQ0NzpUaHJvY2ttb3J0b24gQ291bnR5IAorVVMtVFgtNDg0NDk6VGl0dXMgQ291bnR5IAorVVMtVFgtNDg0NTE6VG9tIEdyZWVuIENvdW50eSAKK1VTLVRYLTQ4NDUzOlRyYXZpcyBDb3VudHkgCitVUy1UWC00ODQ1NTpUcmluaXR5IENvdW50eSAKK1VTLVRYLTQ4NDU3OlR5bGVyIENvdW50eSAKK1VTLVRYLTQ4NDU5OlVwc2h1ciBDb3VudHkgCitVUy1UWC00ODQ2MTpVcHRvbiBDb3VudHkgCitVUy1UWC00ODQ2MzpVdmFsZGUgQ291bnR5IAorVVMtVFgtNDg0NjU6VmFsIFZlcmRlIENvdW50eSAKK1VTLVRYLTQ4NDY3OlZhbiBaYW5kdCBDb3VudHkgCitVUy1UWC00ODQ2OTpWaWN0b3JpYSBDb3VudHkgCitVUy1UWC00ODQ3MTpXYWxrZXIgQ291bnR5IAorVVMtVFgtNDg0NzM6V2FsbGVyIENvdW50eSAKK1VTLVRYLTQ4NDc1OldhcmQgQ291bnR5IAorVVMtVFgtNDg0Nzc6V2FzaGluZ3RvbiBDb3VudHkgCitVUy1UWC00ODQ3OTpXZWJiIENvdW50eSAKK1VTLVRYLTQ4NDgxOldoYXJ0b24gQ291bnR5IAorVVMtVFgtNDg0ODM6V2hlZWxlciBDb3VudHkgCitVUy1UWC00ODQ4NTpXaWNoaXRhIENvdW50eSAKK1VTLVRYLTQ4NDg3OldpbGJhcmdlciBDb3VudHkgCitVUy1UWC00ODQ4OTpXaWxsYWN5IENvdW50eSAKK1VTLVRYLTQ4NDkxOldpbGxpYW1zb24gQ291bnR5IAorVVMtVFgtNDg0OTM6V2lsc29uIENvdW50eSAKK1VTLVRYLTQ4NDk1OldpbmtsZXIgQ291bnR5IAorVVMtVFgtNDg0OTc6V2lzZSBDb3VudHkgCitVUy1UWC00ODQ5OTpXb29kIENvdW50eSAKK1VTLVRYLTQ4NTAxOllvYWt1bSBDb3VudHkgCitVUy1UWC00ODUwMzpZb3VuZyBDb3VudHkgCitVUy1UWC00ODUwNTpaYXBhdGEgQ291bnR5IAorVVMtVFgtNDg1MDc6WmF2YWxhIENvdW50eSAKKyMgdW5kZXIgQWRtaW4gTGV2ZWxbMV0gSURbNDldOlV0YWggCitVUy1VVC00OTAwMTpCZWF2ZXIgQ291bnR5IAorVVMtVVQtNDkwMDM6Qm94IEVsZGVyIENvdW50eSAKK1VTLVVULTQ5MDA1OkNhY2hlIENvdW50eSAKK1VTLVVULTQ5MDA3OkNhcmJvbiBDb3VudHkgCitVUy1VVC00OTAwOTpEYWdnZXR0IENvdW50eSAKK1VTLVVULTQ5MDExOkRhdmlzIENvdW50eSAKK1VTLVVULTQ5MDEzOkR1Y2hlc25lIENvdW50eSAKK1VTLVVULTQ5MDE1OkVtZXJ5IENvdW50eSAKK1VTLVVULTQ5MDE3OkdhcmZpZWxkIENvdW50eSAKK1VTLVVULTQ5MDE5OkdyYW5kIENvdW50eSAKK1VTLVVULTQ5MDIxOklyb24gQ291bnR5IAorVVMtVVQtNDkwMjM6SnVhYiBDb3VudHkgCitVUy1VVC00OTAyNTpLYW5lIENvdW50eSAKK1VTLVVULTQ5MDI3Ok1pbGxhcmQgQ291bnR5IAorVVMtVVQtNDkwMjk6TW9yZ2FuIENvdW50eSAKK1VTLVVULTQ5MDMxOlBpdXRlIENvdW50eSAKK1VTLVVULTQ5MDMzOlJpY2ggQ291bnR5IAorVVMtVVQtNDkwMzU6U2FsdCBMYWtlIENvdW50eSAKK1VTLVVULTQ5MDM3OlNhbiBKdWFuIENvdW50eSAKK1VTLVVULTQ5MDM5OlNhbnBldGUgQ291bnR5IAorVVMtVVQtNDkwNDE6U2V2aWVyIENvdW50eSAKK1VTLVVULTQ5MDQzOlN1bW1pdCBDb3VudHkgCitVUy1VVC00OTA0NTpUb29lbGUgQ291bnR5IAorVVMtVVQtNDkwNDc6VWludGFoIENvdW50eSAKK1VTLVVULTQ5MDQ5OlV0YWggQ291bnR5IAorVVMtVVQtNDkwNTE6V2FzYXRjaCBDb3VudHkgCitVUy1VVC00OTA1MzpXYXNoaW5ndG9uIENvdW50eSAKK1VTLVVULTQ5MDU1OldheW5lIENvdW50eSAKK1VTLVVULTQ5MDU3OldlYmVyIENvdW50eSAKKyMgdW5kZXIgQWRtaW4gTGV2ZWxbMV0gSURbNTFdOlZpcmdpbmlhIAorVVMtVkEtNTEwMDE6QWNjb21hY2sgQ291bnR5IAorVVMtVkEtNTEwMDM6QWxiZW1hcmxlIENvdW50eSAKK1VTLVZBLTUxMDA1OkFsbGVnaGFueSBDb3VudHkgCitVUy1WQS01MTAwNzpBbWVsaWEgQ291bnR5IAorVVMtVkEtNTEwMDk6QW1oZXJzdCBDb3VudHkgCitVUy1WQS01MTAxMTpBcHBvbWF0dG94IENvdW50eSAKK1VTLVZBLTUxMDEzOkFybGluZ3RvbiBDb3VudHkgCitVUy1WQS01MTAxNTpBdWd1c3RhIENvdW50eSAKK1VTLVZBLTUxMDE3OkJhdGggQ291bnR5IAorVVMtVkEtNTEwMTk6QmVkZm9yZCBDb3VudHkgCitVUy1WQS01MTAyMTpCbGFuZCBDb3VudHkgCitVUy1WQS01MTAyMzpCb3RldG91cnQgQ291bnR5IAorVVMtVkEtNTEwMjU6QnJ1bnN3aWNrIENvdW50eSAKK1VTLVZBLTUxMDI3OkJ1Y2hhbmFuIENvdW50eSAKK1VTLVZBLTUxMDI5OkJ1Y2tpbmdoYW0gQ291bnR5IAorVVMtVkEtNTEwMzE6Q2FtcGJlbGwgQ291bnR5IAorVVMtVkEtNTEwMzM6Q2Fyb2xpbmUgQ291bnR5IAorVVMtVkEtNTEwMzU6Q2Fycm9sbCBDb3VudHkgCitVUy1WQS01MTAzNjpDaGFybGVzIENpdHkgQ291bnR5IAorVVMtVkEtNTEwMzc6Q2hhcmxvdHRlIENvdW50eSAKK1VTLVZBLTUxMDQxOkNoZXN0ZXJmaWVsZCBDb3VudHkgCitVUy1WQS01MTA0MzpDbGFya2UgQ291bnR5IAorVVMtVkEtNTEwNDU6Q3JhaWcgQ291bnR5IAorVVMtVkEtNTEwNDc6Q3VscGVwZXIgQ291bnR5IAorVVMtVkEtNTEwNDk6Q3VtYmVybGFuZCBDb3VudHkgCitVUy1WQS01MTA1MTpEaWNrZW5zb24gQ291bnR5IAorVVMtVkEtNTEwNTM6RGlud2lkZGllIENvdW50eSAKK1VTLVZBLTUxMDU3OkVzc2V4IENvdW50eSAKK1VTLVZBLTUxMDU5OkZhaXJmYXggQ291bnR5IAorVVMtVkEtNTEwNjE6RmF1cXVpZXIgQ291bnR5IAorVVMtVkEtNTEwNjM6RmxveWQgQ291bnR5IAorVVMtVkEtNTEwNjU6Rmx1dmFubmEgQ291bnR5IAorVVMtVkEtNTEwNjc6RnJhbmtsaW4gQ291bnR5IAorVVMtVkEtNTEwNjk6RnJlZGVyaWNrIENvdW50eSAKK1VTLVZBLTUxMDcxOkdpbGVzIENvdW50eSAKK1VTLVZBLTUxMDczOkdsb3VjZXN0ZXIgQ291bnR5IAorVVMtVkEtNTEwNzU6R29vY2hsYW5kIENvdW50eSAKK1VTLVZBLTUxMDc3OkdyYXlzb24gQ291bnR5IAorVVMtVkEtNTEwNzk6R3JlZW5lIENvdW50eSAKK1VTLVZBLTUxMDgxOkdyZWVuc3ZpbGxlIENvdW50eSAKK1VTLVZBLTUxMDgzOkhhbGlmYXggQ291bnR5IAorVVMtVkEtNTEwODU6SGFub3ZlciBDb3VudHkgCitVUy1WQS01MTA4NzpIZW5yaWNvIENvdW50eSAKK1VTLVZBLTUxMDg5OkhlbnJ5IENvdW50eSAKK1VTLVZBLTUxMDkxOkhpZ2hsYW5kIENvdW50eSAKK1VTLVZBLTUxMDkzOklzbGUgb2YgV2lnaHQgQ291bnR5IAorVVMtVkEtNTEwOTU6SmFtZXMgQ2l0eSBDb3VudHkgCitVUy1WQS01MTA5NzpLaW5nIGFuZCBRdWVlbiBDb3VudHkgCitVUy1WQS01MTA5OTpLaW5nIEdlb3JnZSBDb3VudHkgCitVUy1WQS01MTEwMTpLaW5nIFdpbGxpYW0gQ291bnR5IAorVVMtVkEtNTExMDM6TGFuY2FzdGVyIENvdW50eSAKK1VTLVZBLTUxMTA1OkxlZSBDb3VudHkgCitVUy1WQS01MTEwNzpMb3Vkb3VuIENvdW50eSAKK1VTLVZBLTUxMTA5OkxvdWlzYSBDb3VudHkgCitVUy1WQS01MTExMTpMdW5lbmJ1cmcgQ291bnR5IAorVVMtVkEtNTExMTM6TWFkaXNvbiBDb3VudHkgCitVUy1WQS01MTExNTpNYXRoZXdzIENvdW50eSAKK1VTLVZBLTUxMTE3Ok1lY2tsZW5idXJnIENvdW50eSAKK1VTLVZBLTUxMTE5Ok1pZGRsZXNleCBDb3VudHkgCitVUy1WQS01MTEyMTpNb250Z29tZXJ5IENvdW50eSAKK1VTLVZBLTUxMTI1Ok5lbHNvbiBDb3VudHkgCitVUy1WQS01MTEyNzpOZXcgS2VudCBDb3VudHkgCitVUy1WQS01MTEzMTpOb3J0aGFtcHRvbiBDb3VudHkgCitVUy1WQS01MTEzMzpOb3J0aHVtYmVybGFuZCBDb3VudHkgCitVUy1WQS01MTEzNTpOb3R0b3dheSBDb3VudHkgCitVUy1WQS01MTEzNzpPcmFuZ2UgQ291bnR5IAorVVMtVkEtNTExMzk6UGFnZSBDb3VudHkgCitVUy1WQS01MTE0MTpQYXRyaWNrIENvdW50eSAKK1VTLVZBLTUxMTQzOlBpdHRzeWx2YW5pYSBDb3VudHkgCitVUy1WQS01MTE0NTpQb3doYXRhbiBDb3VudHkgCitVUy1WQS01MTE0NzpQcmluY2UgRWR3YXJkIENvdW50eSAKK1VTLVZBLTUxMTQ5OlByaW5jZSBHZW9yZ2UgQ291bnR5IAorVVMtVkEtNTExNTM6UHJpbmNlIFdpbGxpYW0gQ291bnR5IAorVVMtVkEtNTExNTU6UHVsYXNraSBDb3VudHkgCitVUy1WQS01MTE1NzpSYXBwYWhhbm5vY2sgQ291bnR5IAorVVMtVkEtNTExNTk6UmljaG1vbmQgQ291bnR5IAorVVMtVkEtNTExNjE6Um9hbm9rZSBDb3VudHkgCitVUy1WQS01MTE2MzpSb2NrYnJpZGdlIENvdW50eSAKK1VTLVZBLTUxMTY1OlJvY2tpbmdoYW0gQ291bnR5IAorVVMtVkEtNTExNjc6UnVzc2VsbCBDb3VudHkgCitVUy1WQS01MTE2OTpTY290dCBDb3VudHkgCitVUy1WQS01MTE3MTpTaGVuYW5kb2FoIENvdW50eSAKK1VTLVZBLTUxMTczOlNteXRoIENvdW50eSAKK1VTLVZBLTUxMTc1OlNvdXRoYW1wdG9uIENvdW50eSAKK1VTLVZBLTUxMTc3OlNwb3RzeWx2YW5pYSBDb3VudHkgCitVUy1WQS01MTE3OTpTdGFmZm9yZCBDb3VudHkgCitVUy1WQS01MTE4MTpTdXJyeSBDb3VudHkgCitVUy1WQS01MTE4MzpTdXNzZXggQ291bnR5IAorVVMtVkEtNTExODU6VGF6ZXdlbGwgQ291bnR5IAorVVMtVkEtNTExODc6V2FycmVuIENvdW50eSAKK1VTLVZBLTUxMTkxOldhc2hpbmd0b24gQ291bnR5IAorVVMtVkEtNTExOTM6V2VzdG1vcmVsYW5kIENvdW50eSAKK1VTLVZBLTUxMTk1Oldpc2UgQ291bnR5IAorVVMtVkEtNTExOTc6V3l0aGUgQ291bnR5IAorVVMtVkEtNTExOTk6WW9yayBDb3VudHkgCitVUy1WQS01MTUxMDpBbGV4YW5kcmlhIGNpdHkgCitVUy1WQS01MTUxNTpCZWRmb3JkIGNpdHkgCitVUy1WQS01MTUyMDpCcmlzdG9sIGNpdHkgCitVUy1WQS01MTUzMDpCdWVuYSBWaXN0YSBjaXR5IAorVVMtVkEtNTE1NDA6Q2hhcmxvdHRlc3ZpbGxlIGNpdHkgCitVUy1WQS01MTU1MDpDaGVzYXBlYWtlIGNpdHkgCitVUy1WQS01MTU2MDpDbGlmdG9uIEZvcmdlIGNpdHkgCitVUy1WQS01MTU3MDpDb2xvbmlhbCBIZWlnaHRzIGNpdHkgCitVUy1WQS01MTU4MDpDb3Zpbmd0b24gY2l0eSAKK1VTLVZBLTUxNTkwOkRhbnZpbGxlIGNpdHkgCitVUy1WQS01MTU5NTpFbXBvcmlhIGNpdHkgCitVUy1WQS01MTYwMDpGYWlyZmF4IGNpdHkgCitVUy1WQS01MTYxMDpGYWxscyBDaHVyY2ggY2l0eSAKK1VTLVZBLTUxNjIwOkZyYW5rbGluIGNpdHkgCitVUy1WQS01MTYzMDpGcmVkZXJpY2tzYnVyZyBjaXR5IAorVVMtVkEtNTE2NDA6R2FsYXggY2l0eSAKK1VTLVZBLTUxNjUwOkhhbXB0b24gY2l0eSAKK1VTLVZBLTUxNjYwOkhhcnJpc29uYnVyZyBjaXR5IAorVVMtVkEtNTE2NzA6SG9wZXdlbGwgY2l0eSAKK1VTLVZBLTUxNjc4OkxleGluZ3RvbiBjaXR5IAorVVMtVkEtNTE2ODA6THluY2hidXJnIGNpdHkgCitVUy1WQS01MTY4MzpNYW5hc3NhcyBjaXR5IAorVVMtVkEtNTE2ODU6TWFuYXNzYXMgUGFyayBjaXR5IAorVVMtVkEtNTE2OTA6TWFydGluc3ZpbGxlIGNpdHkgCitVUy1WQS01MTcwMDpOZXdwb3J0IE5ld3MgY2l0eSAKK1VTLVZBLTUxNzEwOk5vcmZvbGsgY2l0eSAKK1VTLVZBLTUxNzIwOk5vcnRvbiBjaXR5IAorVVMtVkEtNTE3MzA6UGV0ZXJzYnVyZyBjaXR5IAorVVMtVkEtNTE3MzU6UG9xdW9zb24gY2l0eSAKK1VTLVZBLTUxNzQwOlBvcnRzbW91dGggY2l0eSAKK1VTLVZBLTUxNzUwOlJhZGZvcmQgY2l0eSAKK1VTLVZBLTUxNzYwOlJpY2htb25kIGNpdHkgCitVUy1WQS01MTc3MDpSb2Fub2tlIGNpdHkgCitVUy1WQS01MTc3NTpTYWxlbSBjaXR5IAorVVMtVkEtNTE3ODA6U291dGggQm9zdG9uIENpdHkgCitVUy1WQS01MTc5MDpTdGF1bnRvbiBjaXR5IAorVVMtVkEtNTE4MDA6U3VmZm9sayBjaXR5IAorVVMtVkEtNTE4MTA6VmlyZ2luaWEgQmVhY2ggY2l0eSAKK1VTLVZBLTUxODIwOldheW5lc2Jvcm8gY2l0eSAKK1VTLVZBLTUxODMwOldpbGxpYW1zYnVyZyBjaXR5IAorVVMtVkEtNTE4NDA6V2luY2hlc3RlciBjaXR5IAorIyB1bmRlciBBZG1pbiBMZXZlbFsxXSBJRFs1MF06VmVybW9udCAKK1VTLVZULTUwMDAxOkFkZGlzb24gQ291bnR5IAorVVMtVlQtNTAwMDM6QmVubmluZ3RvbiBDb3VudHkgCitVUy1WVC01MDAwNTpDYWxlZG9uaWEgQ291bnR5IAorVVMtVlQtNTAwMDc6Q2hpdHRlbmRlbiBDb3VudHkgCitVUy1WVC01MDAwOTpFc3NleCBDb3VudHkgCitVUy1WVC01MDAxMTpGcmFua2xpbiBDb3VudHkgCitVUy1WVC01MDAxMzpHcmFuZCBJc2xlIENvdW50eSAKK1VTLVZULTUwMDE1OkxhbW9pbGxlIENvdW50eSAKK1VTLVZULTUwMDE3Ok9yYW5nZSBDb3VudHkgCitVUy1WVC01MDAxOTpPcmxlYW5zIENvdW50eSAKK1VTLVZULTUwMDIxOlJ1dGxhbmQgQ291bnR5IAorVVMtVlQtNTAwMjM6V2FzaGluZ3RvbiBDb3VudHkgCitVUy1WVC01MDAyNTpXaW5kaGFtIENvdW50eSAKK1VTLVZULTUwMDI3OldpbmRzb3IgQ291bnR5IAorIyB1bmRlciBBZG1pbiBMZXZlbFsxXSBJRFs1M106V2FzaGluZ3RvbiAKK1VTLVdBLTUzMDAxOkFkYW1zIENvdW50eSAKK1VTLVdBLTUzMDAzOkFzb3RpbiBDb3VudHkgCitVUy1XQS01MzAwNTpCZW50b24gQ291bnR5IAorVVMtV0EtNTMwMDc6Q2hlbGFuIENvdW50eSAKK1VTLVdBLTUzMDA5OkNsYWxsYW0gQ291bnR5IAorVVMtV0EtNTMwMTE6Q2xhcmsgQ291bnR5IAorVVMtV0EtNTMwMTM6Q29sdW1iaWEgQ291bnR5IAorVVMtV0EtNTMwMTU6Q293bGl0eiBDb3VudHkgCitVUy1XQS01MzAxNzpEb3VnbGFzIENvdW50eSAKK1VTLVdBLTUzMDE5OkZlcnJ5IENvdW50eSAKK1VTLVdBLTUzMDIxOkZyYW5rbGluIENvdW50eSAKK1VTLVdBLTUzMDIzOkdhcmZpZWxkIENvdW50eSAKK1VTLVdBLTUzMDI1OkdyYW50IENvdW50eSAKK1VTLVdBLTUzMDI3OkdyYXlzIEhhcmJvciBDb3VudHkgCitVUy1XQS01MzAyOTpJc2xhbmQgQ291bnR5IAorVVMtV0EtNTMwMzE6SmVmZmVyc29uIENvdW50eSAKK1VTLVdBLTUzMDMzOktpbmcgQ291bnR5IAorVVMtV0EtNTMwMzU6S2l0c2FwIENvdW50eSAKK1VTLVdBLTUzMDM3OktpdHRpdGFzIENvdW50eSAKK1VTLVdBLTUzMDM5OktsaWNraXRhdCBDb3VudHkgCitVUy1XQS01MzA0MTpMZXdpcyBDb3VudHkgCitVUy1XQS01MzA0MzpMaW5jb2xuIENvdW50eSAKK1VTLVdBLTUzMDQ1Ok1hc29uIENvdW50eSAKK1VTLVdBLTUzMDQ3Ok9rYW5vZ2FuIENvdW50eSAKK1VTLVdBLTUzMDQ5OlBhY2lmaWMgQ291bnR5IAorVVMtV0EtNTMwNTE6UGVuZCBPcmVpbGxlIENvdW50eSAKK1VTLVdBLTUzMDUzOlBpZXJjZSBDb3VudHkgCitVUy1XQS01MzA1NTpTYW4gSnVhbiBDb3VudHkgCitVUy1XQS01MzA1NzpTa2FnaXQgQ291bnR5IAorVVMtV0EtNTMwNTk6U2thbWFuaWEgQ291bnR5IAorVVMtV0EtNTMwNjE6U25vaG9taXNoIENvdW50eSAKK1VTLVdBLTUzMDYzOlNwb2thbmUgQ291bnR5IAorVVMtV0EtNTMwNjU6U3RldmVucyBDb3VudHkgCitVUy1XQS01MzA2NzpUaHVyc3RvbiBDb3VudHkgCitVUy1XQS01MzA2OTpXYWhraWFrdW0gQ291bnR5IAorVVMtV0EtNTMwNzE6V2FsbGEgV2FsbGEgQ291bnR5IAorVVMtV0EtNTMwNzM6V2hhdGNvbSBDb3VudHkgCitVUy1XQS01MzA3NTpXaGl0bWFuIENvdW50eSAKK1VTLVdBLTUzMDc3Ollha2ltYSBDb3VudHkgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEWzU1XTpXaXNjb25zaW4gCitVUy1XSS01NTAwMTpBZGFtcyBDb3VudHkgCitVUy1XSS01NTAwMzpBc2hsYW5kIENvdW50eSAKK1VTLVdJLTU1MDA1OkJhcnJvbiBDb3VudHkgCitVUy1XSS01NTAwNzpCYXlmaWVsZCBDb3VudHkgCitVUy1XSS01NTAwOTpCcm93biBDb3VudHkgCitVUy1XSS01NTAxMTpCdWZmYWxvIENvdW50eSAKK1VTLVdJLTU1MDEzOkJ1cm5ldHQgQ291bnR5IAorVVMtV0ktNTUwMTU6Q2FsdW1ldCBDb3VudHkgCitVUy1XSS01NTAxNzpDaGlwcGV3YSBDb3VudHkgCitVUy1XSS01NTAxOTpDbGFyayBDb3VudHkgCitVUy1XSS01NTAyMTpDb2x1bWJpYSBDb3VudHkgCitVUy1XSS01NTAyMzpDcmF3Zm9yZCBDb3VudHkgCitVUy1XSS01NTAyNTpEYW5lIENvdW50eSAKK1VTLVdJLTU1MDI3OkRvZGdlIENvdW50eSAKK1VTLVdJLTU1MDI5OkRvb3IgQ291bnR5IAorVVMtV0ktNTUwMzE6RG91Z2xhcyBDb3VudHkgCitVUy1XSS01NTAzMzpEdW5uIENvdW50eSAKK1VTLVdJLTU1MDM1OkVhdSBDbGFpcmUgQ291bnR5IAorVVMtV0ktNTUwMzc6RmxvcmVuY2UgQ291bnR5IAorVVMtV0ktNTUwMzk6Rm9uZCBkdSBMYWMgQ291bnR5IAorVVMtV0ktNTUwNDE6Rm9yZXN0IENvdW50eSAKK1VTLVdJLTU1MDQzOkdyYW50IENvdW50eSAKK1VTLVdJLTU1MDQ1OkdyZWVuIENvdW50eSAKK1VTLVdJLTU1MDQ3OkdyZWVuIExha2UgQ291bnR5IAorVVMtV0ktNTUwNDk6SW93YSBDb3VudHkgCitVUy1XSS01NTA1MTpJcm9uIENvdW50eSAKK1VTLVdJLTU1MDUzOkphY2tzb24gQ291bnR5IAorVVMtV0ktNTUwNTU6SmVmZmVyc29uIENvdW50eSAKK1VTLVdJLTU1MDU3Okp1bmVhdSBDb3VudHkgCitVUy1XSS01NTA1OTpLZW5vc2hhIENvdW50eSAKK1VTLVdJLTU1MDYxOktld2F1bmVlIENvdW50eSAKK1VTLVdJLTU1MDYzOkxhIENyb3NzZSBDb3VudHkgCitVUy1XSS01NTA2NTpMYWZheWV0dGUgQ291bnR5IAorVVMtV0ktNTUwNjc6TGFuZ2xhZGUgQ291bnR5IAorVVMtV0ktNTUwNjk6TGluY29sbiBDb3VudHkgCitVUy1XSS01NTA3MTpNYW5pdG93b2MgQ291bnR5IAorVVMtV0ktNTUwNzM6TWFyYXRob24gQ291bnR5IAorVVMtV0ktNTUwNzU6TWFyaW5ldHRlIENvdW50eSAKK1VTLVdJLTU1MDc3Ok1hcnF1ZXR0ZSBDb3VudHkgCitVUy1XSS01NTA3ODpNZW5vbWluZWUgQ291bnR5IAorVVMtV0ktNTUwNzk6TWlsd2F1a2VlIENvdW50eSAKK1VTLVdJLTU1MDgxOk1vbnJvZSBDb3VudHkgCitVUy1XSS01NTA4MzpPY29udG8gQ291bnR5IAorVVMtV0ktNTUwODU6T25laWRhIENvdW50eSAKK1VTLVdJLTU1MDg3Ok91dGFnYW1pZSBDb3VudHkgCitVUy1XSS01NTA4OTpPemF1a2VlIENvdW50eSAKK1VTLVdJLTU1MDkxOlBlcGluIENvdW50eSAKK1VTLVdJLTU1MDkzOlBpZXJjZSBDb3VudHkgCitVUy1XSS01NTA5NTpQb2xrIENvdW50eSAKK1VTLVdJLTU1MDk3OlBvcnRhZ2UgQ291bnR5IAorVVMtV0ktNTUwOTk6UHJpY2UgQ291bnR5IAorVVMtV0ktNTUxMDE6UmFjaW5lIENvdW50eSAKK1VTLVdJLTU1MTAzOlJpY2hsYW5kIENvdW50eSAKK1VTLVdJLTU1MTA1OlJvY2sgQ291bnR5IAorVVMtV0ktNTUxMDc6UnVzayBDb3VudHkgCitVUy1XSS01NTEwOTpTdC4gQ3JvaXggQ291bnR5IAorVVMtV0ktNTUxMTE6U2F1ayBDb3VudHkgCitVUy1XSS01NTExMzpTYXd5ZXIgQ291bnR5IAorVVMtV0ktNTUxMTU6U2hhd2FubyBDb3VudHkgCitVUy1XSS01NTExNzpTaGVib3lnYW4gQ291bnR5IAorVVMtV0ktNTUxMTk6VGF5bG9yIENvdW50eSAKK1VTLVdJLTU1MTIxOlRyZW1wZWFsZWF1IENvdW50eSAKK1VTLVdJLTU1MTIzOlZlcm5vbiBDb3VudHkgCitVUy1XSS01NTEyNTpWaWxhcyBDb3VudHkgCitVUy1XSS01NTEyNzpXYWx3b3J0aCBDb3VudHkgCitVUy1XSS01NTEyOTpXYXNoYnVybiBDb3VudHkgCitVUy1XSS01NTEzMTpXYXNoaW5ndG9uIENvdW50eSAKK1VTLVdJLTU1MTMzOldhdWtlc2hhIENvdW50eSAKK1VTLVdJLTU1MTM1OldhdXBhY2EgQ291bnR5IAorVVMtV0ktNTUxMzc6V2F1c2hhcmEgQ291bnR5IAorVVMtV0ktNTUxMzk6V2lubmViYWdvIENvdW50eSAKK1VTLVdJLTU1MTQxOldvb2QgQ291bnR5IAorIyB1bmRlciBBZG1pbiBMZXZlbFsxXSBJRFs1NF06V2VzdCBWaXJnaW5pYSAKK1VTLVdWLTU0MDAxOkJhcmJvdXIgQ291bnR5IAorVVMtV1YtNTQwMDM6QmVya2VsZXkgQ291bnR5IAorVVMtV1YtNTQwMDU6Qm9vbmUgQ291bnR5IAorVVMtV1YtNTQwMDc6QnJheHRvbiBDb3VudHkgCitVUy1XVi01NDAwOTpCcm9va2UgQ291bnR5IAorVVMtV1YtNTQwMTE6Q2FiZWxsIENvdW50eSAKK1VTLVdWLTU0MDEzOkNhbGhvdW4gQ291bnR5IAorVVMtV1YtNTQwMTU6Q2xheSBDb3VudHkgCitVUy1XVi01NDAxNzpEb2RkcmlkZ2UgQ291bnR5IAorVVMtV1YtNTQwMTk6RmF5ZXR0ZSBDb3VudHkgCitVUy1XVi01NDAyMTpHaWxtZXIgQ291bnR5IAorVVMtV1YtNTQwMjM6R3JhbnQgQ291bnR5IAorVVMtV1YtNTQwMjU6R3JlZW5icmllciBDb3VudHkgCitVUy1XVi01NDAyNzpIYW1wc2hpcmUgQ291bnR5IAorVVMtV1YtNTQwMjk6SGFuY29jayBDb3VudHkgCitVUy1XVi01NDAzMTpIYXJkeSBDb3VudHkgCitVUy1XVi01NDAzMzpIYXJyaXNvbiBDb3VudHkgCitVUy1XVi01NDAzNTpKYWNrc29uIENvdW50eSAKK1VTLVdWLTU0MDM3OkplZmZlcnNvbiBDb3VudHkgCitVUy1XVi01NDAzOTpLYW5hd2hhIENvdW50eSAKK1VTLVdWLTU0MDQxOkxld2lzIENvdW50eSAKK1VTLVdWLTU0MDQzOkxpbmNvbG4gQ291bnR5IAorVVMtV1YtNTQwNDU6TG9nYW4gQ291bnR5IAorVVMtV1YtNTQwNDc6TWNEb3dlbGwgQ291bnR5IAorVVMtV1YtNTQwNDk6TWFyaW9uIENvdW50eSAKK1VTLVdWLTU0MDUxOk1hcnNoYWxsIENvdW50eSAKK1VTLVdWLTU0MDUzOk1hc29uIENvdW50eSAKK1VTLVdWLTU0MDU1Ok1lcmNlciBDb3VudHkgCitVUy1XVi01NDA1NzpNaW5lcmFsIENvdW50eSAKK1VTLVdWLTU0MDU5Ok1pbmdvIENvdW50eSAKK1VTLVdWLTU0MDYxOk1vbm9uZ2FsaWEgQ291bnR5IAorVVMtV1YtNTQwNjM6TW9ucm9lIENvdW50eSAKK1VTLVdWLTU0MDY1Ok1vcmdhbiBDb3VudHkgCitVUy1XVi01NDA2NzpOaWNob2xhcyBDb3VudHkgCitVUy1XVi01NDA2OTpPaGlvIENvdW50eSAKK1VTLVdWLTU0MDcxOlBlbmRsZXRvbiBDb3VudHkgCitVUy1XVi01NDA3MzpQbGVhc2FudHMgQ291bnR5IAorVVMtV1YtNTQwNzU6UG9jYWhvbnRhcyBDb3VudHkgCitVUy1XVi01NDA3NzpQcmVzdG9uIENvdW50eSAKK1VTLVdWLTU0MDc5OlB1dG5hbSBDb3VudHkgCitVUy1XVi01NDA4MTpSYWxlaWdoIENvdW50eSAKK1VTLVdWLTU0MDgzOlJhbmRvbHBoIENvdW50eSAKK1VTLVdWLTU0MDg1OlJpdGNoaWUgQ291bnR5IAorVVMtV1YtNTQwODc6Um9hbmUgQ291bnR5IAorVVMtV1YtNTQwODk6U3VtbWVycyBDb3VudHkgCitVUy1XVi01NDA5MTpUYXlsb3IgQ291bnR5IAorVVMtV1YtNTQwOTM6VHVja2VyIENvdW50eSAKK1VTLVdWLTU0MDk1OlR5bGVyIENvdW50eSAKK1VTLVdWLTU0MDk3OlVwc2h1ciBDb3VudHkgCitVUy1XVi01NDA5OTpXYXluZSBDb3VudHkgCitVUy1XVi01NDEwMTpXZWJzdGVyIENvdW50eSAKK1VTLVdWLTU0MTAzOldldHplbCBDb3VudHkgCitVUy1XVi01NDEwNTpXaXJ0IENvdW50eSAKK1VTLVdWLTU0MTA3Oldvb2QgQ291bnR5IAorVVMtV1YtNTQxMDk6V3lvbWluZyBDb3VudHkgCisjIHVuZGVyIEFkbWluIExldmVsWzFdIElEWzU2XTpXeW9taW5nIAorVVMtV1ktNTYwMDE6QWxiYW55IENvdW50eSAKK1VTLVdZLTU2MDAzOkJpZyBIb3JuIENvdW50eSAKK1VTLVdZLTU2MDA1OkNhbXBiZWxsIENvdW50eSAKK1VTLVdZLTU2MDA3OkNhcmJvbiBDb3VudHkgCitVUy1XWS01NjAwOTpDb252ZXJzZSBDb3VudHkgCitVUy1XWS01NjAxMTpDcm9vayBDb3VudHkgCitVUy1XWS01NjAxMzpGcmVtb250IENvdW50eSAKK1VTLVdZLTU2MDE1Okdvc2hlbiBDb3VudHkgCitVUy1XWS01NjAxNzpIb3QgU3ByaW5ncyBDb3VudHkgCitVUy1XWS01NjAxOTpKb2huc29uIENvdW50eSAKK1VTLVdZLTU2MDIxOkxhcmFtaWUgQ291bnR5IAorVVMtV1ktNTYwMjM6TGluY29sbiBDb3VudHkgCitVUy1XWS01NjAyNTpOYXRyb25hIENvdW50eSAKK1VTLVdZLTU2MDI3Ok5pb2JyYXJhIENvdW50eSAKK1VTLVdZLTU2MDI5OlBhcmsgQ291bnR5IAorVVMtV1ktNTYwMzE6UGxhdHRlIENvdW50eSAKK1VTLVdZLTU2MDMzOlNoZXJpZGFuIENvdW50eSAKK1VTLVdZLTU2MDM1OlN1YmxldHRlIENvdW50eSAKK1VTLVdZLTU2MDM3OlN3ZWV0d2F0ZXIgQ291bnR5IAorVVMtV1ktNTYwMzk6VGV0b24gQ291bnR5IAorVVMtV1ktNTYwNDE6VWludGEgQ291bnR5IAorVVMtV1ktNTYwNDM6V2FzaGFraWUgQ291bnR5IAorVVMtV1ktNTYwNDU6V2VzdG9uIENvdW50eQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvVVNBX0wxX0RhdGEvVVNBX0wxLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL1VTQV9MMV9EYXRhL1VTQV9MMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNhNzY5NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL1VTQV9MMV9EYXRhL1VTQV9MMS50eHQKQEAgLTAsMCArMSw1NyBAQAorVVMJOglVU0EJOglVUy1BTAk6CUFsYWJhbWEJOgkxCitVUwk6CVVTQQk6CVVTLUFLCToJQWxhc2thCToJMgorVVMJOglVU0EJOglVUy1BWgk6CUFyaXpvbmEJOgk0CitVUwk6CVVTQQk6CVVTLUFSCToJQXJrYW5zYXMJOgk1CitVUwk6CVVTQQk6CVVTLUNBCToJQ2FsaWZvcm5pYQk6CTYKK1VTCToJVVNBCToJVVMtQ08JOglDb2xvcmFkbwk6CTgKK1VTCToJVVNBCToJVVMtQ1QJOglDb25uZWN0aWN1dAk6CTkKK1VTCToJVVNBCToJVVMtREUJOglEZWxhd2FyZQk6CTEwCitVUwk6CVVTQQk6CVVTLUZMCToJRmxvcmlkYQk6CTEyCitVUwk6CVVTQQk6CVVTLUdBCToJR2VvcmdpYQk6CTEzCitVUwk6CVVTQQk6CVVTLUhJCToJSGF3YWlpCToJMTUKK1VTCToJVVNBCToJVVMtSUQJOglJZGFobwk6CTE2CitVUwk6CVVTQQk6CVVTLUlMCToJSWxsaW5vaXMJOgkxNworVVMJOglVU0EJOglVUy1JTgk6CUluZGlhbmEJOgkxOAorVVMJOglVU0EJOglVUy1JQQk6CUlvd2EJOgkxOQorVVMJOglVU0EJOglVUy1LUwk6CUthbnNhcwk6CTIwCitVUwk6CVVTQQk6CVVTLUtZCToJS2VudHVja3kJOgkyMQorVVMJOglVU0EJOglVUy1MQQk6CUxvdWlzaWFuYQk6CTIyCitVUwk6CVVTQQk6CVVTLU1FCToJTWFpbmUJOgkyMworVVMJOglVU0EJOglVUy1NRAk6CU1hcnlsYW5kCToJMjQKK1VTCToJVVNBCToJVVMtTUEJOglNYXNzYWNodXNldHRzCToJMjUKK1VTCToJVVNBCToJVVMtTUkJOglNaWNoaWdhbgk6CTI2CitVUwk6CVVTQQk6CVVTLU1OCToJTWlubmVzb3RhCToJMjcKK1VTCToJVVNBCToJVVMtTVMJOglNaXNzaXNzaXBwaQk6CTI4CitVUwk6CVVTQQk6CVVTLU1PCToJTWlzc291cmkJOgkyOQorVVMJOglVU0EJOglVUy1NVAk6CU1vbnRhbmEJOgkzMAorVVMJOglVU0EJOglVUy1ORQk6CU5lYnJhc2thCToJMzEKK1VTCToJVVNBCToJVVMtTlYJOglOZXZhZGEJOgkzMgorVVMJOglVU0EJOglVUy1OSAk6CU5ldyBIYW1wc2hpcmUJOgkzMworVVMJOglVU0EJOglVUy1OSgk6CU5ldyBKZXJzZXkJOgkzNAorVVMJOglVU0EJOglVUy1OTQk6CU5ldyBNZXhpY28JOgkzNQorVVMJOglVU0EJOglVUy1OWQk6CU5ldyBZb3JrCToJMzYKK1VTCToJVVNBCToJVVMtTkMJOglOb3J0aCBDYXJvbGluYQk6CTM3CitVUwk6CVVTQQk6CVVTLU5ECToJTm9ydGggRGFrb3RhCToJMzgKK1VTCToJVVNBCToJVVMtT0gJOglPaGlvCToJMzkKK1VTCToJVVNBCToJVVMtT0sJOglPa2xhaG9tYQk6CTQwCitVUwk6CVVTQQk6CVVTLU9SCToJT3JlZ29uCToJNDEKK1VTCToJVVNBCToJVVMtUEEJOglQZW5uc3lsdmFuaWEJOgk0MgorVVMJOglVU0EJOglVUy1SSQk6CVJob2RlIElzbGFuZAk6CTQ0CitVUwk6CVVTQQk6CVVTLVNDCToJU291dGggQ2Fyb2xpbmEJOgk0NQorVVMJOglVU0EJOglVUy1TRAk6CVNvdXRoIERha290YQk6CTQ2CitVUwk6CVVTQQk6CVVTLVROCToJVGVubmVzc2VlCToJNDcKK1VTCToJVVNBCToJVVMtVFgJOglUZXhhcwk6CTQ4CitVUwk6CVVTQQk6CVVTLVVUCToJVXRhaAk6CTQ5CitVUwk6CVVTQQk6CVVTLVZUCToJVmVybW9udAk6CTUwCitVUwk6CVVTQQk6CVVTLVZBCToJVmlyZ2luaWEJOgk1MQorVVMJOglVU0EJOglVUy1XQQk6CVdhc2hpbmd0b24JOgk1MworVVMJOglVU0EJOglVUy1XVgk6CVdlc3QgVmlyZ2luaWEJOgk1NAorVVMJOglVU0EJOglVUy1XSQk6CVdpc2NvbnNpbgk6CTU1CitVUwk6CVVTQQk6CVVTLVdZCToJV3lvbWluZwk6CTU2CitVUwk6CVVTQQk6CVVTLURDCToJRGlzdHJpY3Qgb2YgQ29sdW1iaWEJOgkxMQorVVMJOglVU0EJOglVUy1BUwk6CUFtZXJpY2FuIFNhbW9hCToJNTcKK1VTCToJVVNBCToJVVMtR1UJOglHdWFtCToJNTgKK1VTCToJVVNBCToJVVMtTVAJOglOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMJOgk1OQorVVMJOglVU0EJOglVUy1QUgk6CVB1ZXJ0byBSaWNvCToJNzIKK1VTCToJVVNBCToJVVMtVU0JOglVbml0ZWQgU3RhdGVzIE1pbm9yIE91dGx5aW5nIElzbGFuZHMJOgk2MQorVVMJOglVU0EJOglVUy1WSQk6CVZpcmdpbiBJc2xhbmRzCToJNjIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FGRy9BRkdfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FGRy9BRkdfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmZDNmOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQUZHL0FGR19BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDM0IEBACisxOkFGLUJEUzpBRjpCQURBS0hTSEFOCisyOkFGLUJERzpBRjpCQURHSElTCiszOkFGLUJHTDpBRjpCQUdITEFOIFtCQUdISUFOXQorNDpBRi1CQUw6QUY6QkFMS0gKKzU6QUYtQkFNOkFGOkJBTUlBTgorNjpBRi1EQVk6QUY6RFlLT05ECis3OkFGLUZSQTpBRjpGQVJBSAorODpBRi1GWUI6QUY6RkFSWUFCCis5OkFGLUdIQTpBRjpHSEFaTkkgW0dIQVpOXQorMTA6QUYtR0hPOkFGOkdIT1dSCisxMTpBRi1IRUw6QUY6SEVMTUFORAorMTI6QUYtSEVSOkFGOkhFUkFUCisxMzpBRi1KT1c6QUY6Sk9XWkpBTgorMTQ6QUYtS0FCOkFGOktBQlVMIFtLQUJPTF0KKzE1OkFGLUtBTjpBRjpLQU5EQUhBUgorMTY6QUYtS0FQOkFGOktBUElTQQorMTc6QUYtS0hPOkFGOktIT1dTVAorMTg6QUYtS05SOkFGOktPTkFSIFtLVU5BUl0KKzE5OkFGLUtEWjpBRjpLT05ET1ogW0tVTkRVWl0gW0tPTkRVWl0KKzIwOkFGLUxBRzpBRjpMQUdITUFOCisyMTpBRi1MT1c6QUY6TE9XR0FSCisyMjpBRi1OQU46QUY6TkFOR1JBSEFSIFtOQU5HQVJIQVJdIFtOQU5HQVJIQV0KKzIzOkFGLU5JTTpBRjpOSU1SVVoKKzI0OkFGLU5VUjpBRjpOUkVTVE4KKzI1OkFGLU9SVTpBRjpPUlVaR0FOIFtVUlVaR0FOXQorMjY6QUYtUElBOkFGOlBBS1RJQQorMjc6QUYtUEtBOkFGOlBBS1RJS0EKKzI4OkFGLVBBTjpBRjpQQU5KU0hSCisyOTpBRi1QQVI6QUY6UEFSV0FOIFtQQVJWQU5dCiszMDpBRi1TQU06QUY6U0FNQU5HQU4KKzMxOkFGLVNBUjpBRjpTQVIgRSBQT0wKKzMyOkFGLVRBSzpBRjpUQUtIQVIKKzMzOkFGLVdBUjpBRjpXQVJEQUsgW1dBUkRBR10gW1ZBUkRBS10KKzM0OkFGLVpBQjpBRjpaQUJPTCBbWkFCVUxdCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FGRy9BRkdfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FGRy9BRkdfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxZGYxNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQUZHL0FGR19BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDI4IEBACisxOkFGOkFGRzpBRkdIQU5JU1RBTjpWYXJkYWs6QUZHLkwyLjI4CisxOkFGOkFGRzpBRkdIQU5JU1RBTjpTYW1hbmdhbjpBRkcuTDIuOQorMTpBRjpBRkc6QUZHSEFOSVNUQU46UGFydmFuOkFGRy5MMi40CisxOkFGOkFGRzpBRkdIQU5JU1RBTjpCYWxraDpBRkcuTDIuMTcKKzE6QUY6QUZHOkFGR0hBTklTVEFOOkthcGlzYTpBRkcuTDIuMTgKKzE6QUY6QUZHOkFGR0hBTklTVEFOOkxhZ2htYW46QUZHLkwyLjI1CisxOkFGOkFGRzpBRkdIQU5JU1RBTjpLYW5kYWhhcjpBRkcuTDIuMjQKKzE6QUY6QUZHOkFGR0hBTklTVEFOOlRha2hhcjpBRkcuTDIuMTIKKzE6QUY6QUZHOkFGR0hBTklTVEFOOktvbmR1ejpBRkcuTDIuMjYKKzE6QUY6QUZHOkFGR0hBTklTVEFOOlphYm9sOkFGRy5MMi4xCisxOkFGOkFGRzpBRkdIQU5JU1RBTjpGYXJ5YWI6QUZHLkwyLjIwCisxOkFGOkFGRzpBRkdIQU5JU1RBTjpKb3d6amFuOkFGRy5MMi4xNQorMTpBRjpBRkc6QUZHSEFOSVNUQU46R2hhem46QUZHLkwyLjUKKzE6QUY6QUZHOkFGR0hBTklTVEFOOkhlcmF0OkFGRy5MMi4yCisxOkFGOkFGRzpBRkdIQU5JU1RBTjpGYXJhaDpBRkcuTDIuMjMKKzE6QUY6QUZHOkFGR0hBTklTVEFOOk5hbmdhcmhhOkFGRy5MMi4xNAorMTpBRjpBRkc6QUZHSEFOSVNUQU46R2hvd3I6QUZHLkwyLjMKKzE6QUY6QUZHOkFGR0hBTklTVEFOOkthYnVsOkFGRy5MMi4xNgorMTpBRjpBRkc6QUZHSEFOSVNUQU46TG93Z2FyOkFGRy5MMi4xMQorMTpBRjpBRkc6QUZHSEFOSVNUQU46TmltcnV6OkFGRy5MMi4xOQorMTpBRjpBRkc6QUZHSEFOSVNUQU46QmFnaGlhbjpBRkcuTDIuNgorMTpBRjpBRkc6QUZHSEFOSVNUQU46UGFrdGlhOkFGRy5MMi44CisxOkFGOkFGRzpBRkdIQU5JU1RBTjpPcnV6Z2FuOkFGRy5MMi4yMgorMTpBRjpBRkc6QUZHSEFOSVNUQU46SGVsbWFuZDpBRkcuTDIuMjcKKzE6QUY6QUZHOkFGR0hBTklTVEFOOkJhbWlhbjpBRkcuTDIuNworMTpBRjpBRkc6QUZHSEFOSVNUQU46S29uYXI6QUZHLkwyLjEzCisxOkFGOkFGRzpBRkdIQU5JU1RBTjpCYWRnaGlzOkFGRy5MMi4yMQorMTpBRjpBRkc6QUZHSEFOSVNUQU46QmFkYWtoc2hhbjpBRkcuTDIuMTAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQUdPL0FHT19BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQUdPL0FHT19BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTQxZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9BR08vQUdPX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMTggQEAKKzE6QU8tQkdPOkFPOkJFTkdPCisyOkFPLUJHVTpBTzpCRU5HVUVMQQorMzpBTy1CSUU6QU86QklFCis0OkFPLUNBQjpBTzpDQUJJTkRBCis1OkFPLUNDVTpBTzpDVUFORE8gQ1VCQU5HTworNjpBTy1DTk86QU86Q1VBTlpBIE5PUlRFCis3OkFPLUNVUzpBTzpDVUFOWkEgU1VMCis4OkFPLUNOTjpBTzpDVU5FTkUKKzk6QU8tSFVBOkFPOkhVQU1CTworMTA6QU8tSFVJOkFPOkhVSUxBCisxMTpBTy1MVUE6QU86TFVBTkRBCisxMjpBTy1MTk86QU86TFVOREEgTk9SVEUKKzEzOkFPLUxTVTpBTzpMVU5EQSBTVUwKKzE0OkFPLU1BTDpBTzpNQUxBTkpFCisxNTpBTy1NT1g6QU86TU9YSUNPCisxNjpBTy1OQU06QU86TkFNSUJFCisxNzpBTy1VSUc6QU86VUlHRQorMTg6QU8tWkFJOkFPOlpBSVJFCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FHTy9BR09fQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FHTy9BR09fQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViODM2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQUdPL0FHT19BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDM0IEBACisxOkFPOkFHTzpBTkdPTEE6SHVhbWJvOkFHTy5MMi4zMQorMTpBTzpBR086QU5HT0xBOkN1YW56YSBOb3J0ZTpBR08uTDIuMTIKKzE6QU86QUdPOkFOR09MQTpNYWxhbmplOkFHTy5MMi4zMAorMTpBTzpBR086QU5HT0xBOkN1YW56YSBTdWw6QUdPLkwyLjEzCisxOkFPOkFHTzpBTkdPTEE6QmllOkFHTy5MMi4yCisxOkFPOkFHTzpBTkdPTEE6Q3VuZW5lOkFHTy5MMi4xCisxOkFPOkFHTzpBTkdPTEE6QmVuZ286QUdPLkwyLjMzCisxOkFPOkFHTzpBTkdPTEE6TmFtaWJlOkFHTy5MMi40CisyOkFPOkFHTzpBTkdPTEE6TmFtaWJlOkFHTy5MMi41CisxOkFPOkFHTzpBTkdPTEE6THVuZGEgTm9ydGU6QUdPLkwyLjE1CisxOkFPOkFHTzpBTkdPTEE6VWlnZTpBR08uTDIuMzQKKzE6QU86QUdPOkFOR09MQTpaYWlyZTpBR08uTDIuMTYKKzI6QU86QUdPOkFOR09MQTpaYWlyZTpBR08uTDIuMTcKKzM6QU86QUdPOkFOR09MQTpaYWlyZTpBR08uTDIuMTgKKzQ6QU86QUdPOkFOR09MQTpaYWlyZTpBR08uTDIuMTkKKzU6QU86QUdPOkFOR09MQTpaYWlyZTpBR08uTDIuMjAKKzY6QU86QUdPOkFOR09MQTpaYWlyZTpBR08uTDIuMjEKKzc6QU86QUdPOkFOR09MQTpaYWlyZTpBR08uTDIuMjIKKzg6QU86QUdPOkFOR09MQTpaYWlyZTpBR08uTDIuMjMKKzk6QU86QUdPOkFOR09MQTpaYWlyZTpBR08uTDIuMjQKKzEwOkFPOkFHTzpBTkdPTEE6WmFpcmU6QUdPLkwyLjI1CisxMTpBTzpBR086QU5HT0xBOlphaXJlOkFHTy5MMi4yNgorMTI6QU86QUdPOkFOR09MQTpaYWlyZTpBR08uTDIuMjcKKzE6QU86QUdPOkFOR09MQTpMdWFuZGE6QUdPLkwyLjEwCisyOkFPOkFHTzpBTkdPTEE6THVhbmRhOkFHTy5MMi42CiszOkFPOkFHTzpBTkdPTEE6THVhbmRhOkFHTy5MMi43Cis0OkFPOkFHTzpBTkdPTEE6THVhbmRhOkFHTy5MMi44Cis1OkFPOkFHTzpBTkdPTEE6THVhbmRhOkFHTy5MMi45CisxOkFPOkFHTzpBTkdPTEE6SHVpbGE6QUdPLkwyLjE0CisxOkFPOkFHTzpBTkdPTEE6THVuZGEgU3VsOkFHTy5MMi4yOAorMTpBTzpBR086QU5HT0xBOkJlbmd1ZWxhOkFHTy5MMi4zCisxOkFPOkFHTzpBTkdPTEE6Q3VhbmRvIEN1YmFuZ286QUdPLkwyLjI5CisxOkFPOkFHTzpBTkdPTEE6TW94aWNvOkFHTy5MMi4xMQorMTpBTzpBR086QU5HT0xBOkNhYmluZGE6QUdPLkwyLjMyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FMQi9BTEJfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FMQi9BTEJfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyZDUyMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQUxCL0FMQl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDM2IEBACisxOkFMLUJSOkFMOkJFUkFUCisyOkFMLUJVOkFMOkJVTFFJWkUKKzM6QUwtREw6QUw6REVMVklORQorNDpBTC1EVjpBTDpERVZPTEwKKzU6QUwtREk6QUw6RElCRVIKKzY6QUwtRFI6QUw6RFVSUkVTCis3OkFMLUVMOkFMOkVMQkFTQU4KKzg6QUwtRlI6QUw6RklFUgorOTpBTC1HSjpBTDpHSklST0tBU1RFUgorMTA6QUwtR1I6QUw6R1JBTVNICisxMTpBTC1IQTpBTDpIQVMKKzEyOkFMLUtBOkFMOktBVkFKRQorMTM6QUwtRVI6QUw6S09MT05KRQorMTQ6QUwtS086QUw6S09SQ0UKKzE1OkFMLUtSOkFMOktSVUpFCisxNjpBTC1LQzpBTDpLVUNPVkUKKzE3OkFMLUtVOkFMOktVS0VTCisxODpBTC1LQjpBTDpLVVJCSU4KKzE5OkFMLUxFOkFMOkxFWkhFCisyMDpBTC1MQjpBTDpMSUJSQVpIRAorMjE6QUwtTFU6QUw6TFVTSE5KRQorMjI6QUwtTU06QUw6TUFMRVNJIEUgTUFESEUKKzIzOkFMLU1LOkFMOk1BTExBS0FTVEVSCisyNDpBTC1NVDpBTDpNQVQKKzI1OkFMLU1SOkFMOk1JUkRJVEUKKzI2OkFMLVBROkFMOlBFUUlOCisyNzpBTC1QUjpBTDpQRVJNRVQKKzI4OkFMLVBHOkFMOlBPR1JBREVDCisyOTpBTC1QVTpBTDpQVUtFCiszMDpBTC1TUjpBTDpTQVJBTkRFCiszMTpBTC1TSDpBTDpTSFFJUIlSSUEKKzMyOkFMLVNLOkFMOlNLUkFQQVIKKzMzOkFMLVRFOkFMOlRFUEVMRU5FCiszNDpBTC1UUjpBTDpUSVJBTkUKKzM1OkFMLVRQOkFMOlRST1BPSkUKKzM2OkFMLVZMOkFMOlZMT1JFCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FMQi9BTEJfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FMQi9BTEJfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQUxCL0FMQl9BRE1JTjJfTEVYLnR4dApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9BTkQvQU5EX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9BTkQvQU5EX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1Yjg2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FORC9BTkRfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSBAQAorMTpBRC0wMTpBRDpBTkRPUlJBCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FORC9BTkRfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FORC9BTkRfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQU5EL0FORF9BRE1JTjJfTEVYLnR4dApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9BUkUvQVJFX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9BUkUvQVJFX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNTdhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FSRS9BUkVfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSw4IEBACisxOkFFLUFaOkFFOkFCVSBESEFCSQorMjpBRS1BSjpBRTpBSk1BTgorMzpBRS1GVTpBRTpBTCBGVUpBWVJBSAorNDpBRS1EVTpBRTpEVUJBSQorNTpBRS1ORVU6QUU6TkVVVFJBTCBaT05FCis2OkFFLVJLOkFFOlJBUyBBTCBLSEFZTUFICis3OkFFLVNIOkFFOlNIQVJJUUFICis4OkFFLVVROkFFOlVNTSBBTCBRQVlXQVlOCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FSRS9BUkVfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FSRS9BUkVfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5MjE0ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQVJFL0FSRV9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDg1IEBACisxOkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6TmV1dHJhbCBab25lOkFSRS5MMi42NAorMjpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOk5ldXRyYWwgWm9uZTpBUkUuTDIuNjUKKzE6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpTaGFyaXFhaDpBUkUuTDIuNjYKKzI6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpTaGFyaXFhaDpBUkUuTDIuNjcKKzE6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpEdWJhaTpBUkUuTDIuODEKKzI6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpEdWJhaTpBUkUuTDIuODIKKzE6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpSYXMgQWwgS2hheW1haDpBUkUuTDIuNzYKKzI6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpSYXMgQWwgS2hheW1haDpBUkUuTDIuNzcKKzM6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpSYXMgQWwgS2hheW1haDpBUkUuTDIuNzgKKzQ6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpSYXMgQWwgS2hheW1haDpBUkUuTDIuNzkKKzU6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpSYXMgQWwgS2hheW1haDpBUkUuTDIuODAKKzE6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpVbW0gQWwgUWF5d2F5bjpBUkUuTDIuNjgKKzI6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpVbW0gQWwgUWF5d2F5bjpBUkUuTDIuNjkKKzM6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpVbW0gQWwgUWF5d2F5bjpBUkUuTDIuNzAKKzQ6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpVbW0gQWwgUWF5d2F5bjpBUkUuTDIuNzEKKzU6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpVbW0gQWwgUWF5d2F5bjpBUkUuTDIuNzIKKzY6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpVbW0gQWwgUWF5d2F5bjpBUkUuTDIuNzMKKzc6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpVbW0gQWwgUWF5d2F5bjpBUkUuTDIuNzQKKzg6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpVbW0gQWwgUWF5d2F5bjpBUkUuTDIuNzUKKzE6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBam1hbjpBUkUuTDIuODMKKzI6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBam1hbjpBUkUuTDIuODQKKzM6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBam1hbjpBUkUuTDIuODUKKzE6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBbCBGdWpheXJhaDpBUkUuTDIuMQorMjpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFsIEZ1amF5cmFoOkFSRS5MMi4yCisxOkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi4xMAorMjpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuMTEKKzM6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjEyCis0OkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi4xMworNTpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuMTQKKzY6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjE1Cis3OkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi4xNgorODpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuMTcKKzk6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjE4CisxMDpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuMTkKKzExOkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi4yMAorMTI6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjIxCisxMzpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuMjIKKzE0OkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi4yMworMTU6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjI0CisxNjpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuMjUKKzE3OkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi4yNgorMTg6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjI3CisxOTpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuMjgKKzIwOkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi4yOQorMjE6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjMKKzIyOkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi4zMAorMjM6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjMxCisyNDpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuMzIKKzI1OkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi4zMworMjY6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjM0CisyNzpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuMzUKKzI4OkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi4zNgorMjk6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjM3CiszMDpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuMzgKKzMxOkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi4zOQorMzI6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjQKKzMzOkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi40MAorMzQ6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjQxCiszNTpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuNDIKKzM2OkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi40MworMzc6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjQ0CiszODpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuNDUKKzM5OkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi40NgorNDA6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjQ3Cis0MTpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuNDgKKzQyOkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi40OQorNDM6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjUKKzQ0OkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi41MAorNDU6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjUxCis0NjpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuNTIKKzQ3OkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi41MworNDg6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjU0Cis0OTpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuNTUKKzUwOkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi41NgorNTE6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjU3Cis1MjpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuNTgKKzUzOkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi41OQorNTQ6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjYKKzU1OkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi42MAorNTY6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjYxCis1NzpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuNjIKKzU4OkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi42MworNTk6QUU6QVJFOlVOSVRFREFSQUJFTUlSQVRFUzpBYnUgRGhhYmk6QVJFLkwyLjcKKzYwOkFFOkFSRTpVTklURURBUkFCRU1JUkFURVM6QWJ1IERoYWJpOkFSRS5MMi44Cis2MTpBRTpBUkU6VU5JVEVEQVJBQkVNSVJBVEVTOkFidSBEaGFiaTpBUkUuTDIuOQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9BUkcvQVJHX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9BUkcvQVJHX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODE0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FSRy9BUkdfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwyNCBAQAorMTpBUi1COkFSOkJVRU5PUyBBSVJFUworMjpBUi1DOkFSOkJVRU5PUyBBSVJFUyBELkYuCiszOkFSLUs6QVI6Q0FUQU1BUkNBCis0OkFSLUg6QVI6Q0hBQ08KKzU6QVItVTpBUjpDSFVCVVQKKzY6QVItWDpBUjpDT1JET0JBCis3OkFSLVc6QVI6Q09SUklFTlRFUworODpBUi1FOkFSOkVOVFJFIFJJT1MKKzk6QVItUDpBUjpGT1JNT1NBCisxMDpBUi1ZOkFSOkpVSlVZCisxMTpBUi1MOkFSOkxBIFBBTVBBCisxMjpBUi1GOkFSOkxBIFJJT0pBCisxMzpBUi1NOkFSOk1FTkRPWkEKKzE0OkFSLU46QVI6TUlTSU9ORVMKKzE1OkFSLVE6QVI6TkVVUVVFTgorMTY6QVItUjpBUjpSSU8gTkVHUk8KKzE3OkFSLUE6QVI6U0FMVEEKKzE4OkFSLUo6QVI6U0FOIEpVQU4KKzE5OkFSLUQ6QVI6U0FOIExVSVMKKzIwOkFSLVo6QVI6U0FOVEEgQ1JVWgorMjE6QVItUzpBUjpTQU5UQSBGRQorMjI6QVItRzpBUjpTQU5USUFHTyBERUwgRVNURVJPCisyMzpBUi1WOkFSOlRJRVJSQSBERUwgRlVFR08KKzI0OkFSLVQ6QVI6VFVDVU1BTgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9BUkcvQVJHX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9BUkcvQVJHX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYTg4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FSRy9BUkdfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSw1MTkgQEAKKzE6QVI6QVJHOkFSR0VOVElOQTpUSUVSUkEgREVMIEZVRUdPOlJpbyBHcmFuZGUKKzI6QVI6QVJHOkFSR0VOVElOQTpUSUVSUkEgREVMIEZVRUdPOlVzaHVhaWEKKzM6QVI6QVJHOkFSR0VOVElOQTpUSUVSUkEgREVMIEZVRUdPOlVzaHVhaWEgKElzLikKKzE6QVI6QVJHOkFSR0VOVElOQTpDQVRBTUFSQ0E6QW1iYXRvCisyOkFSOkFSRzpBUkdFTlRJTkE6Q0FUQU1BUkNBOkFuY2FzdGkKKzM6QVI6QVJHOkFSR0VOVElOQTpDQVRBTUFSQ0E6QW5kYWxnYWxhCis0OkFSOkFSRzpBUkdFTlRJTkE6Q0FUQU1BUkNBOkFudG9mYWdhc3RhIGRlIGxhIFNpZXJyYQorNTpBUjpBUkc6QVJHRU5USU5BOkNBVEFNQVJDQTpCZWxlbgorNjpBUjpBUkc6QVJHRU5USU5BOkNBVEFNQVJDQTpDYXBheWFuCis3OkFSOkFSRzpBUkdFTlRJTkE6Q0FUQU1BUkNBOkNhcGl0YWwKKzg6QVI6QVJHOkFSR0VOVElOQTpDQVRBTUFSQ0E6RWwgQWx0bworOTpBUjpBUkc6QVJHRU5USU5BOkNBVEFNQVJDQTpGcmF5IE1hbWVydG8gRXNxdWl1CisxMDpBUjpBUkc6QVJHRU5USU5BOkNBVEFNQVJDQTpMYSBQYXoKKzExOkFSOkFSRzpBUkdFTlRJTkE6Q0FUQU1BUkNBOlBhY2xpbgorMTI6QVI6QVJHOkFSR0VOVElOQTpDQVRBTUFSQ0E6UG9tYW4KKzEzOkFSOkFSRzpBUkdFTlRJTkE6Q0FUQU1BUkNBOlNhbnRhIE1hcmlhCisxNDpBUjpBUkc6QVJHRU5USU5BOkNBVEFNQVJDQTpTYW50YSBSb3NhCisxNTpBUjpBUkc6QVJHRU5USU5BOkNBVEFNQVJDQTpUaW5vZ2FzdGEKKzE2OkFSOkFSRzpBUkdFTlRJTkE6Q0FUQU1BUkNBOlZhbGxlIFZpZWpvCisxOkFSOkFSRzpBUkdFTlRJTkE6U0FOVElBR08gREVMIEVTVEVSTzpBZ3VpcnJlCisyOkFSOkFSRzpBUkdFTlRJTkE6U0FOVElBR08gREVMIEVTVEVSTzpBbGJlcmRpCiszOkFSOkFSRzpBUkdFTlRJTkE6U0FOVElBR08gREVMIEVTVEVSTzpBdGFtaXNxdWkKKzQ6QVI6QVJHOkFSR0VOVElOQTpTQU5USUFHTyBERUwgRVNURVJPOkF2ZWxsYW5lZGEKKzU6QVI6QVJHOkFSR0VOVElOQTpTQU5USUFHTyBERUwgRVNURVJPOkJhbmRhCis2OkFSOkFSRzpBUkdFTlRJTkE6U0FOVElBR08gREVMIEVTVEVSTzpCZWxncmFubworNzpBUjpBUkc6QVJHRU5USU5BOlNBTlRJQUdPIERFTCBFU1RFUk86Q2FwaXRhbAorODpBUjpBUkc6QVJHRU5USU5BOlNBTlRJQUdPIERFTCBFU1RFUk86Q2hveWEKKzk6QVI6QVJHOkFSR0VOVElOQTpTQU5USUFHTyBERUwgRVNURVJPOkNvcG8KKzEwOkFSOkFSRzpBUkdFTlRJTkE6U0FOVElBR08gREVMIEVTVEVSTzpGaWd1ZXJvYQorMTE6QVI6QVJHOkFSR0VOVElOQTpTQU5USUFHTyBERUwgRVNURVJPOkdlbmVyYWwgVGFib2FkYQorMTI6QVI6QVJHOkFSR0VOVElOQTpTQU5USUFHTyBERUwgRVNURVJPOkd1YXNheWFuCisxMzpBUjpBUkc6QVJHRU5USU5BOlNBTlRJQUdPIERFTCBFU1RFUk86SmltbmV6CisxNDpBUjpBUkc6QVJHRU5USU5BOlNBTlRJQUdPIERFTCBFU1RFUk86SnVhbiBGLiBJYmFycmEKKzE1OkFSOkFSRzpBUkdFTlRJTkE6U0FOVElBR08gREVMIEVTVEVSTzpMb3JldG8KKzE2OkFSOkFSRzpBUkdFTlRJTkE6U0FOVElBR08gREVMIEVTVEVSTzpNaXRyZQorMTc6QVI6QVJHOkFSR0VOVElOQTpTQU5USUFHTyBERUwgRVNURVJPOk1vcmVubworMTg6QVI6QVJHOkFSR0VOVElOQTpTQU5USUFHTyBERUwgRVNURVJPOk9qbyBkZSBBZ3VhCisxOTpBUjpBUkc6QVJHRU5USU5BOlNBTlRJQUdPIERFTCBFU1RFUk86UGVsbGVncmluaQorMjA6QVI6QVJHOkFSR0VOVElOQTpTQU5USUFHTyBERUwgRVNURVJPOlF1ZWJyYWNob3MKKzIxOkFSOkFSRzpBUkdFTlRJTkE6U0FOVElBR08gREVMIEVTVEVSTzpSaW8gSG9uZG8KKzIyOkFSOkFSRzpBUkdFTlRJTkE6U0FOVElBR08gREVMIEVTVEVSTzpSaXZhZGF2aWEKKzIzOkFSOkFSRzpBUkdFTlRJTkE6U0FOVElBR08gREVMIEVTVEVSTzpSb2JsZXMKKzI0OkFSOkFSRzpBUkdFTlRJTkE6U0FOVElBR08gREVMIEVTVEVSTzpTYWxhdmluYQorMjU6QVI6QVJHOkFSR0VOVElOQTpTQU5USUFHTyBERUwgRVNURVJPOlNhbiBNYXJ0aW4KKzI2OkFSOkFSRzpBUkdFTlRJTkE6U0FOVElBR08gREVMIEVTVEVSTzpTYXJtaWVudG8KKzI3OkFSOkFSRzpBUkdFTlRJTkE6U0FOVElBR08gREVMIEVTVEVSTzpTaWxpcGljYQorMTpBUjpBUkc6QVJHRU5USU5BOlNBTFRBOkFudGEKKzI6QVI6QVJHOkFSR0VOVElOQTpTQUxUQTpDYWNoaQorMzpBUjpBUkc6QVJHRU5USU5BOlNBTFRBOkNhZmF5YXRlCis0OkFSOkFSRzpBUkdFTlRJTkE6U0FMVEE6Q2FsZGVyYQorNTpBUjpBUkc6QVJHRU5USU5BOlNBTFRBOkNhbmRlbGFyaWEKKzY6QVI6QVJHOkFSR0VOVElOQTpTQUxUQTpDYXBpdGFsCis3OkFSOkFSRzpBUkdFTlRJTkE6U0FMVEE6Q2VycmlsbG9zCis4OkFSOkFSRzpBUkdFTlRJTkE6U0FMVEE6Q2hpY29hbmEKKzk6QVI6QVJHOkFSR0VOVElOQTpTQUxUQTpHZW5lcmFsIEpvc2UgZGUgU2FuIE1hcnRpCisxMDpBUjpBUkc6QVJHRU5USU5BOlNBTFRBOkdyYWwuIE1hcnRpbiBNLiBHdWVtZXMKKzExOkFSOkFSRzpBUkdFTlRJTkE6U0FMVEE6R3VhY2hpcGFzCisxMjpBUjpBUkc6QVJHRU5USU5BOlNBTFRBOklydXlhCisxMzpBUjpBUkc6QVJHRU5USU5BOlNBTFRBOkxhIFZpbmEKKzE0OkFSOkFSRzpBUkdFTlRJTkE6U0FMVEE6TG9zIEFuZGVzCisxNTpBUjpBUkc6QVJHRU5USU5BOlNBTFRBOk1ldGFuCisxNjpBUjpBUkc6QVJHRU5USU5BOlNBTFRBOk1vbGlub3MKKzE3OkFSOkFSRzpBUkdFTlRJTkE6U0FMVEE6T3JhbgorMTg6QVI6QVJHOkFSR0VOVElOQTpTQUxUQTpQb21hCisxOTpBUjpBUkc6QVJHRU5USU5BOlNBTFRBOlJpdmFkYXZpYQorMjA6QVI6QVJHOkFSR0VOVElOQTpTQUxUQTpSb3NhcmlvIGRlIExlcm1hCisyMTpBUjpBUkc6QVJHRU5USU5BOlNBTFRBOlJvc2FyaW8gZGUgbGEgRnJvbnRlcmEKKzIyOkFSOkFSRzpBUkdFTlRJTkE6U0FMVEE6U2FuIENhcmxvcworMjM6QVI6QVJHOkFSR0VOVElOQTpTQUxUQTpTYW50YSBWaWN0b3JpYQorMTpBUjpBUkc6QVJHRU5USU5BOkNIVUJVVDpCaWVkbWEKKzI6QVI6QVJHOkFSR0VOVElOQTpDSFVCVVQ6QmllZG1hIChJcy4pCiszOkFSOkFSRzpBUkdFTlRJTkE6Q0hVQlVUOkN1c2hhbWVuCis0OkFSOkFSRzpBUkdFTlRJTkE6Q0hVQlVUOkVzY2FsYW50ZQorNTpBUjpBUkc6QVJHRU5USU5BOkNIVUJVVDpFc2NhbGFudGUgKElzLikKKzY6QVI6QVJHOkFSR0VOVElOQTpDSFVCVVQ6RmxvcmVudGlubyBBbWVnaGlubworNzpBUjpBUkc6QVJHRU5USU5BOkNIVUJVVDpGbG9yZW50aW5vIEFtZWdoaW5vIChJcy4pCis4OkFSOkFSRzpBUkdFTlRJTkE6Q0hVQlVUOkZ1dGFsZXVmdQorOTpBUjpBUkc6QVJHRU5USU5BOkNIVUJVVDpHYWltYW4KKzEwOkFSOkFSRzpBUkdFTlRJTkE6Q0hVQlVUOkdhc3RyZQorMTE6QVI6QVJHOkFSR0VOVElOQTpDSFVCVVQ6TGFuZ3VpbmVvCisxMjpBUjpBUkc6QVJHRU5USU5BOkNIVUJVVDpNYXJ0aW5lcworMTM6QVI6QVJHOkFSR0VOVElOQTpDSFVCVVQ6UGFzbyBkZSBJbmRpb3MKKzE0OkFSOkFSRzpBUkdFTlRJTkE6Q0hVQlVUOlJhd3NvbgorMTU6QVI6QVJHOkFSR0VOVElOQTpDSFVCVVQ6UmlvIFNlbmd1ZXJyCisxNjpBUjpBUkc6QVJHRU5USU5BOkNIVUJVVDpTYXJtaWVudG8KKzE3OkFSOkFSRzpBUkdFTlRJTkE6Q0hVQlVUOlRlaHVlbGNoZXMKKzE4OkFSOkFSRzpBUkdFTlRJTkE6Q0hVQlVUOlRlbHNlbgorMTpBUjpBUkc6QVJHRU5USU5BOlNBTlRBIENSVVo6Q29ycGVuIEFpa2UKKzI6QVI6QVJHOkFSR0VOVElOQTpTQU5UQSBDUlVaOkRlc2VhZG8KKzM6QVI6QVJHOkFSR0VOVElOQTpTQU5UQSBDUlVaOkRlc2VhZG8gKElzLikKKzQ6QVI6QVJHOkFSR0VOVElOQTpTQU5UQSBDUlVaOkdlciBBaWtlCis1OkFSOkFSRzpBUkdFTlRJTkE6U0FOVEEgQ1JVWjpHZXIgQWlrZSAoSXMuKQorNjpBUjpBUkc6QVJHRU5USU5BOlNBTlRBIENSVVo6TGFnbyBBcmdlbnRpbm8KKzc6QVI6QVJHOkFSR0VOVElOQTpTQU5UQSBDUlVaOkxhZ28gQnVlbm9zIEFpcmVzCis4OkFSOkFSRzpBUkdFTlRJTkE6U0FOVEEgQ1JVWjpNYWdhbGxhbmVzCis5OkFSOkFSRzpBUkdFTlRJTkE6U0FOVEEgQ1JVWjpNYWdhbGxhbmVzIChJcy4pCisxMDpBUjpBUkc6QVJHRU5USU5BOlNBTlRBIENSVVo6UmlvIENoaWNvCisxOkFSOkFSRzpBUkdFTlRJTkE6VFVDVU1BTjpBbGJlcmRpCisyOkFSOkFSRzpBUkdFTlRJTkE6VFVDVU1BTjpCdXJydXlhY3UKKzM6QVI6QVJHOkFSR0VOVElOQTpUVUNVTUFOOkNhcGl0YWwKKzQ6QVI6QVJHOkFSR0VOVElOQTpUVUNVTUFOOkNoaWNsaWdhc3RhCis1OkFSOkFSRzpBUkdFTlRJTkE6VFVDVU1BTjpDcnV6IEFsdGEKKzY6QVI6QVJHOkFSR0VOVElOQTpUVUNVTUFOOkZhbWFpbGxhCis3OkFSOkFSRzpBUkdFTlRJTkE6VFVDVU1BTjpHcmFuZXJvcworODpBUjpBUkc6QVJHRU5USU5BOlRVQ1VNQU46TGEgQ29jaGEKKzk6QVI6QVJHOkFSR0VOVElOQTpUVUNVTUFOOkxlYWxlcworMTA6QVI6QVJHOkFSR0VOVElOQTpUVUNVTUFOOkx1bGVzCisxMTpBUjpBUkc6QVJHRU5USU5BOlRVQ1VNQU46TW9udGVyb3MKKzEyOkFSOkFSRzpBUkdFTlRJTkE6VFVDVU1BTjpSaW8gQ2hpY28KKzEzOkFSOkFSRzpBUkdFTlRJTkE6VFVDVU1BTjpTaW1vY2EKKzE0OkFSOkFSRzpBUkdFTlRJTkE6VFVDVU1BTjpUYWZpIFZpZWpvCisxNTpBUjpBUkc6QVJHRU5USU5BOlRVQ1VNQU46VGFmaSBkZWwgVmFsbGUKKzE2OkFSOkFSRzpBUkdFTlRJTkE6VFVDVU1BTjpUcmFuY2FzCisxNzpBUjpBUkc6QVJHRU5USU5BOlRVQ1VNQU46WWVyYmEgQnVlbmEKKzE6QVI6QVJHOkFSR0VOVElOQTpSSU8gTkVHUk86MjUgZGUgTWF5bworMjpBUjpBUkc6QVJHRU5USU5BOlJJTyBORUdSTzo5IGRlIEp1bGlvCiszOkFSOkFSRzpBUkdFTlRJTkE6UklPIE5FR1JPOkFkb2xmbyBBbHNpbmEKKzQ6QVI6QVJHOkFSR0VOVElOQTpSSU8gTkVHUk86QXZlbGxhbmVkYQorNTpBUjpBUkc6QVJHRU5USU5BOlJJTyBORUdSTzpCYXJpb2NoZQorNjpBUjpBUkc6QVJHRU5USU5BOlJJTyBORUdSTzpDb25lc2EKKzc6QVI6QVJHOkFSR0VOVElOQTpSSU8gTkVHUk86RWwgQ3V5Cis4OkFSOkFSRzpBUkdFTlRJTkE6UklPIE5FR1JPOkdlbmVyYWwgUm9jYQorOTpBUjpBUkc6QVJHRU5USU5BOlJJTyBORUdSTzpOb3JxdWluY28KKzEwOkFSOkFSRzpBUkdFTlRJTkE6UklPIE5FR1JPOlBpY2hpIE1haHVpZGEKKzExOkFSOkFSRzpBUkdFTlRJTkE6UklPIE5FR1JPOlBpbGNhbml5ZXUKKzEyOkFSOkFSRzpBUkdFTlRJTkE6UklPIE5FR1JPOlNhbiBBbnRvbmlvCisxMzpBUjpBUkc6QVJHRU5USU5BOlJJTyBORUdSTzpWYWxjaGV0YQorMTpBUjpBUkc6QVJHRU5USU5BOkVOVFJFIFJJT1M6Q29sb24KKzI6QVI6QVJHOkFSR0VOVElOQTpFTlRSRSBSSU9TOkNvbmNvcmRpYQorMzpBUjpBUkc6QVJHRU5USU5BOkVOVFJFIFJJT1M6RGlhbWFudGUKKzQ6QVI6QVJHOkFSR0VOVElOQTpFTlRSRSBSSU9TOkZlZGVyYWNpb24KKzU6QVI6QVJHOkFSR0VOVElOQTpFTlRSRSBSSU9TOkZlZGVyYWwKKzY6QVI6QVJHOkFSR0VOVElOQTpFTlRSRSBSSU9TOkZlbGljaWFubworNzpBUjpBUkc6QVJHRU5USU5BOkVOVFJFIFJJT1M6R3VhbGVndWF5Cis4OkFSOkFSRzpBUkdFTlRJTkE6RU5UUkUgUklPUzpHdWFsZWd1YXljaHUKKzk6QVI6QVJHOkFSR0VOVElOQTpFTlRSRSBSSU9TOklzbGEKKzEwOkFSOkFSRzpBUkdFTlRJTkE6RU5UUkUgUklPUzpJc2xhcyBkZWwgSWJpY3V5CisxMTpBUjpBUkc6QVJHRU5USU5BOkVOVFJFIFJJT1M6TGEgUGF6CisxMjpBUjpBUkc6QVJHRU5USU5BOkVOVFJFIFJJT1M6Tm9nb3lhCisxMzpBUjpBUkc6QVJHRU5USU5BOkVOVFJFIFJJT1M6UGFyYW5hCisxNDpBUjpBUkc6QVJHRU5USU5BOkVOVFJFIFJJT1M6VGFsYQorMTU6QVI6QVJHOkFSR0VOVElOQTpFTlRSRSBSSU9TOlVydWd1YXkKKzE2OkFSOkFSRzpBUkdFTlRJTkE6RU5UUkUgUklPUzpWaWN0b3JpYQorMTc6QVI6QVJHOkFSR0VOVElOQTpFTlRSRSBSSU9TOlZpbGxhZ3VheQorMTpBUjpBUkc6QVJHRU5USU5BOk5FVVFVRU46QWx1bWluZQorMjpBUjpBUkc6QVJHRU5USU5BOk5FVVFVRU46QW5lbG8KKzM6QVI6QVJHOkFSR0VOVElOQTpORVVRVUVOOkNhdGFuIExpbAorNDpBUjpBUkc6QVJHRU5USU5BOk5FVVFVRU46Q2hvcyBNYWxhbAorNTpBUjpBUkc6QVJHRU5USU5BOk5FVVFVRU46Q29sbG9uIEN1cmEKKzY6QVI6QVJHOkFSR0VOVElOQTpORVVRVUVOOkNvbmZsdWVuY2lhCis3OkFSOkFSRzpBUkdFTlRJTkE6TkVVUVVFTjpIdWlsaWNoZXMKKzg6QVI6QVJHOkFSR0VOVElOQTpORVVRVUVOOkxhY2FyCis5OkFSOkFSRzpBUkdFTlRJTkE6TkVVUVVFTjpMb25jb3B1ZQorMTA6QVI6QVJHOkFSR0VOVElOQTpORVVRVUVOOkxvcyBMYWdvcworMTE6QVI6QVJHOkFSR0VOVElOQTpORVVRVUVOOk1pbmFzCisxMjpBUjpBUkc6QVJHRU5USU5BOk5FVVFVRU46TnJvcXVpbgorMTM6QVI6QVJHOkFSR0VOVElOQTpORVVRVUVOOlBlaHVlbmNoZXMKKzE0OkFSOkFSRzpBUkdFTlRJTkE6TkVVUVVFTjpQaWN1biBMZXVmdQorMTU6QVI6QVJHOkFSR0VOVElOQTpORVVRVUVOOlBpY3VuY2hlcworMTY6QVI6QVJHOkFSR0VOVElOQTpORVVRVUVOOlphcGFsYQorMTpBUjpBUkc6QVJHRU5USU5BOlNBTiBKVUFOOjI1IERlIE1heW8KKzI6QVI6QVJHOkFSR0VOVElOQTpTQU4gSlVBTjpBbGJhcmRvbgorMzpBUjpBUkc6QVJHRU5USU5BOlNBTiBKVUFOOkFuZ2FjbworNDpBUjpBUkc6QVJHRU5USU5BOlNBTiBKVUFOOkNhbGluZ2FzdGEKKzU6QVI6QVJHOkFSR0VOVElOQTpTQU4gSlVBTjpDYXBpdGFsCis2OkFSOkFSRzpBUkdFTlRJTkE6U0FOIEpVQU46Q2F1Y2V0ZQorNzpBUjpBUkc6QVJHRU5USU5BOlNBTiBKVUFOOkNoaW1iYXMKKzg6QVI6QVJHOkFSR0VOVElOQTpTQU4gSlVBTjpJZ2xlc2lhCis5OkFSOkFSRzpBUkdFTlRJTkE6U0FOIEpVQU46SmFjaGFsCisxMDpBUjpBUkc6QVJHRU5USU5BOlNBTiBKVUFOOlBvY2l0bworMTE6QVI6QVJHOkFSR0VOVElOQTpTQU4gSlVBTjpSYXdzb24KKzEyOkFSOkFSRzpBUkdFTlRJTkE6U0FOIEpVQU46Uml2YWRhdmlhCisxMzpBUjpBUkc6QVJHRU5USU5BOlNBTiBKVUFOOlNhbiBNYXJ0aW4KKzE0OkFSOkFSRzpBUkdFTlRJTkE6U0FOIEpVQU46U2FudGEgTHVjaWEKKzE1OkFSOkFSRzpBUkdFTlRJTkE6U0FOIEpVQU46U2FybWllbnRvCisxNjpBUjpBUkc6QVJHRU5USU5BOlNBTiBKVUFOOlVsbHVuCisxNzpBUjpBUkc6QVJHRU5USU5BOlNBTiBKVUFOOlZhbGxlIEZlcnRpbAorMTg6QVI6QVJHOkFSR0VOVElOQTpTQU4gSlVBTjpab25kYQorMTpBUjpBUkc6QVJHRU5USU5BOkNPUlJJRU5URVM6QmVsbGEgVmlzdGEKKzI6QVI6QVJHOkFSR0VOVElOQTpDT1JSSUVOVEVTOkJlcm9uIGRlIEFzdHJhZGEKKzM6QVI6QVJHOkFSR0VOVElOQTpDT1JSSUVOVEVTOkNhcGl0YWwKKzQ6QVI6QVJHOkFSR0VOVElOQTpDT1JSSUVOVEVTOkNvbmNlcGNpb24KKzU6QVI6QVJHOkFSR0VOVElOQTpDT1JSSUVOVEVTOkN1cnV6dSBDdWF0aWEKKzY6QVI6QVJHOkFSR0VOVElOQTpDT1JSSUVOVEVTOkVtcGVkcmFkbworNzpBUjpBUkc6QVJHRU5USU5BOkNPUlJJRU5URVM6RXNxdWluYQorODpBUjpBUkc6QVJHRU5USU5BOkNPUlJJRU5URVM6R2FuZXJhbCBQYXoKKzk6QVI6QVJHOkFSR0VOVElOQTpDT1JSSUVOVEVTOkdlbmVyYWwgQWx2ZWFyCisxMDpBUjpBUkc6QVJHRU5USU5BOkNPUlJJRU5URVM6R295YQorMTE6QVI6QVJHOkFSR0VOVElOQTpDT1JSSUVOVEVTOkl0YXRpCisxMjpBUjpBUkc6QVJHRU5USU5BOkNPUlJJRU5URVM6SXR1emFpbmdvCisxMzpBUjpBUkc6QVJHRU5USU5BOkNPUlJJRU5URVM6TGF2YWxsZQorMTQ6QVI6QVJHOkFSR0VOVElOQTpDT1JSSUVOVEVTOk1idXJ1Y3V5CisxNTpBUjpBUkc6QVJHRU5USU5BOkNPUlJJRU5URVM6TWVyY2VkZXMKKzE2OkFSOkFSRzpBUkdFTlRJTkE6Q09SUklFTlRFUzpNb250ZSBDYXNlcm9zCisxNzpBUjpBUkc6QVJHRU5USU5BOkNPUlJJRU5URVM6UGFzbyBkZSBsb3MgTGlicmVzCisxODpBUjpBUkc6QVJHRU5USU5BOkNPUlJJRU5URVM6U2FsYWRhcworMTk6QVI6QVJHOkFSR0VOVElOQTpDT1JSSUVOVEVTOlNhbiBDb3NtZQorMjA6QVI6QVJHOkFSR0VOVElOQTpDT1JSSUVOVEVTOlNhbiBMdWlzIGRlbCBQYWxtYXIKKzIxOkFSOkFSRzpBUkdFTlRJTkE6Q09SUklFTlRFUzpTYW4gTWFydGluCisyMjpBUjpBUkc6QVJHRU5USU5BOkNPUlJJRU5URVM6U2FuIE1pZ3VlbAorMjM6QVI6QVJHOkFSR0VOVElOQTpDT1JSSUVOVEVTOlNhbiBSb3F1ZQorMjQ6QVI6QVJHOkFSR0VOVElOQTpDT1JSSUVOVEVTOlNhbnRvIFRvbWUKKzI1OkFSOkFSRzpBUkdFTlRJTkE6Q09SUklFTlRFUzpTYXVjZQorMTpBUjpBUkc6QVJHRU5USU5BOkNIQUNPOjEyIGRlIE9jdHVicmUKKzI6QVI6QVJHOkFSR0VOVElOQTpDSEFDTzoxcm8uIGRlIE1heW8KKzM6QVI6QVJHOkFSR0VOVElOQTpDSEFDTzoyNSBkZSBNYXlvCis0OkFSOkFSRzpBUkdFTlRJTkE6Q0hBQ086OSBkZSBKdWxpbworNTpBUjpBUkc6QVJHRU5USU5BOkNIQUNPOkFsbWlyYW50ZSBCcm93bgorNjpBUjpBUkc6QVJHRU5USU5BOkNIQUNPOkJlcm1lam8KKzc6QVI6QVJHOkFSR0VOVElOQTpDSEFDTzpDaGFjYWJ1Y28KKzg6QVI6QVJHOkFSR0VOVElOQTpDSEFDTzpDb21hbmRhbnRlIEZlcm5hbmRlegorOTpBUjpBUkc6QVJHRU5USU5BOkNIQUNPOkZyYXkgSnVzdG8gU2FudGEgTWFyaWEgZGUKKzEwOkFSOkFSRzpBUkdFTlRJTkE6Q0hBQ086R2VuZXJhbCBCZWxncmFubworMTE6QVI6QVJHOkFSR0VOVElOQTpDSEFDTzpHZW5lcmFsIERvbm92YW4KKzEyOkFSOkFSRzpBUkdFTlRJTkE6Q0hBQ086R2VuZXJhbCBHdWVtZXMKKzEzOkFSOkFSRzpBUkdFTlRJTkE6Q0hBQ086SW5kZXBlbmRlbmNpYQorMTQ6QVI6QVJHOkFSR0VOVElOQTpDSEFDTzpMaWJlcnRhZAorMTU6QVI6QVJHOkFSR0VOVElOQTpDSEFDTzpMaWJlcnRhZG9yIEdlbmVyYWwgU2FuIE1hCisxNjpBUjpBUkc6QVJHRU5USU5BOkNIQUNPOk1haXB1CisxNzpBUjpBUkc6QVJHRU5USU5BOkNIQUNPOk1heW9yIEx1aXMgSi4gRm9udGEKKzE4OkFSOkFSRzpBUkdFTlRJTkE6Q0hBQ086Ty4gSGlnZ2lucworMTk6QVI6QVJHOkFSR0VOVElOQTpDSEFDTzpQcmVzaWRlbnRlIGRlIGxhIFBsYXphCisyMDpBUjpBUkc6QVJHRU5USU5BOkNIQUNPOlF1aXRpbGlwaQorMjE6QVI6QVJHOkFSR0VOVElOQTpDSEFDTzpTYW4gRmVybmFuZG8KKzIyOkFSOkFSRzpBUkdFTlRJTkE6Q0hBQ086U2FuIExvcmVuem8KKzIzOkFSOkFSRzpBUkdFTlRJTkE6Q0hBQ086U2FyZ2VudG8gQ2FicmFsCisyNDpBUjpBUkc6QVJHRU5USU5BOkNIQUNPOlRhcGVuYWcKKzE6QVI6QVJHOkFSR0VOVElOQTpDT1JET0JBOkNhbGFtdWNoaXRhCisyOkFSOkFSRzpBUkdFTlRJTkE6Q09SRE9CQTpDYXBpdGFsCiszOkFSOkFSRzpBUkdFTlRJTkE6Q09SRE9CQTpDb2xvbgorNDpBUjpBUkc6QVJHRU5USU5BOkNPUkRPQkE6Q3J1eiBkZWwgRWplCis1OkFSOkFSRzpBUkdFTlRJTkE6Q09SRE9CQTpHZW5lcmFsIFJvY2EKKzY6QVI6QVJHOkFSR0VOVElOQTpDT1JET0JBOkdlbmVyYWwgU2FuIE1hcnRpbgorNzpBUjpBUkc6QVJHRU5USU5BOkNPUkRPQkE6SXNjaGlsaW4KKzg6QVI6QVJHOkFSR0VOVElOQTpDT1JET0JBOkp1YXJleiBDZWxtYW4KKzk6QVI6QVJHOkFSR0VOVElOQTpDT1JET0JBOk1hcmNvcyBKdWFyZXoKKzEwOkFSOkFSRzpBUkdFTlRJTkE6Q09SRE9CQTpNaW5hcworMTE6QVI6QVJHOkFSR0VOVElOQTpDT1JET0JBOlBvY2hvCisxMjpBUjpBUkc6QVJHRU5USU5BOkNPUkRPQkE6UHJlc2lkZW50ZSBSb3F1ZSBTIGVueiBQZQorMTM6QVI6QVJHOkFSR0VOVElOQTpDT1JET0JBOlB1bmlsbGEKKzE0OkFSOkFSRzpBUkdFTlRJTkE6Q09SRE9CQTpSaW8gQ3VhcnRvCisxNTpBUjpBUkc6QVJHRU5USU5BOkNPUkRPQkE6UmlvIFByaW1lcm8KKzE2OkFSOkFSRzpBUkdFTlRJTkE6Q09SRE9CQTpSaW8gU2VjbworMTc6QVI6QVJHOkFSR0VOVElOQTpDT1JET0JBOlJpbyBTZWd1bmRvCisxODpBUjpBUkc6QVJHRU5USU5BOkNPUkRPQkE6U2FuIEFsYmVydG8KKzE5OkFSOkFSRzpBUkdFTlRJTkE6Q09SRE9CQTpTYW4gSmF2aWVyCisyMDpBUjpBUkc6QVJHRU5USU5BOkNPUkRPQkE6U2FuIEp1c3RvCisyMTpBUjpBUkc6QVJHRU5USU5BOkNPUkRPQkE6U2FudGEgTWFyaWEKKzIyOkFSOkFSRzpBUkdFTlRJTkE6Q09SRE9CQTpTb2JyZW1vbnRlCisyMzpBUjpBUkc6QVJHRU5USU5BOkNPUkRPQkE6VGVyY2VybyBBcnJpYmEKKzI0OkFSOkFSRzpBUkdFTlRJTkE6Q09SRE9CQTpUb3RvcmFsCisyNTpBUjpBUkc6QVJHRU5USU5BOkNPUkRPQkE6VHVsdW1iYQorMjY6QVI6QVJHOkFSR0VOVElOQTpDT1JET0JBOlVuaW9uCisxOkFSOkFSRzpBUkdFTlRJTkE6Rk9STU9TQTpCZXJtZWpvCisyOkFSOkFSRzpBUkdFTlRJTkE6Rk9STU9TQTpGb3Jtb3NhCiszOkFSOkFSRzpBUkdFTlRJTkE6Rk9STU9TQTpMYWlzaGkKKzQ6QVI6QVJHOkFSR0VOVElOQTpGT1JNT1NBOk1hdGFjb3MKKzU6QVI6QVJHOkFSR0VOVElOQTpGT1JNT1NBOlBhdGlubworNjpBUjpBUkc6QVJHRU5USU5BOkZPUk1PU0E6UGlsYWdhcworNzpBUjpBUkc6QVJHRU5USU5BOkZPUk1PU0E6UGlsY29tYXlvCis4OkFSOkFSRzpBUkdFTlRJTkE6Rk9STU9TQTpQaXJhbmUKKzk6QVI6QVJHOkFSR0VOVElOQTpGT1JNT1NBOlJhbW9uIExpc3RhCisxOkFSOkFSRzpBUkdFTlRJTkE6SlVKVVk6Q2FwaXRhbAorMjpBUjpBUkc6QVJHRU5USU5BOkpVSlVZOkNvY2hpbm9jYQorMzpBUjpBUkc6QVJHRU5USU5BOkpVSlVZOkVsIENhcm1lbgorNDpBUjpBUkc6QVJHRU5USU5BOkpVSlVZOkh1bWFodWFjYQorNTpBUjpBUkc6QVJHRU5USU5BOkpVSlVZOkxlZGVzbWEKKzY6QVI6QVJHOkFSR0VOVElOQTpKVUpVWTpQYWxwYWxhCis3OkFSOkFSRzpBUkdFTlRJTkE6SlVKVVk6UmluY29uYWRhCis4OkFSOkFSRzpBUkdFTlRJTkE6SlVKVVk6U2FuIEFudG9uaW8KKzk6QVI6QVJHOkFSR0VOVElOQTpKVUpVWTpTYW4gUGVkcm8KKzEwOkFSOkFSRzpBUkdFTlRJTkE6SlVKVVk6U2FudGEgQmFyYmFyYQorMTE6QVI6QVJHOkFSR0VOVElOQTpKVUpVWTpTYW50YSBDYXRhbGluYQorMTI6QVI6QVJHOkFSR0VOVElOQTpKVUpVWTpTdXNxdWVzCisxMzpBUjpBUkc6QVJHRU5USU5BOkpVSlVZOlRJTENBUkEKKzE0OkFSOkFSRzpBUkdFTlRJTkE6SlVKVVk6VHVtYmF5YQorMTU6QVI6QVJHOkFSR0VOVElOQTpKVUpVWTpWYWxsZSBHcmFuZGUKKzE2OkFSOkFSRzpBUkdFTlRJTkE6SlVKVVk6WWF2aQorMTpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUyBELkYuOkNhcGl0YWwgRmVkZXJhbAorMTpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzoyNSBkZSBNYXlvCisyOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOjkgZGUgSnVsaW8KKzM6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6QVJHLkwyLjEKKzQ6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6QVJHLkwyLjIKKzU6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6QVJHLkwyLjMKKzY6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6QVJHLkwyLjQKKzc6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6QVJHLkwyLjUKKzg6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6QVJHLkwyLjYKKzk6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6QVJHLkwyLjcKKzEwOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkFSRy5MMi44CisxMTpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpBZG9sZm8gQWxzaW5hCisxMjpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpBZG9sZm8gR29uemFsZXMgQ2hhdmVzCisxMzpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpBbGJlcnRpCisxNDpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpBbG1pcmFudGUgQnJvd24KKzE1OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkFtZWdoaW5vCisxNjpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpBdmVsbGFuZWRhCisxNzpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpBeWFjdWNobworMTg6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6QXp1bAorMTk6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6QmFoaWEgQmxhbmNhCisyMDpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpCYWxjYXJjZQorMjE6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6QmFyYWRlcm8KKzIyOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkJhcnRvbG9tZSBNaXRyZQorMjM6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6QmVuaXRvIEp1YXJlegorMjQ6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6QmVyYXphdGVndWkKKzI1OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkJlcmlzc28KKzI2OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkJvbGl2YXIKKzI3OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkJyYWdhZG8KKzI4OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkJyYW5kc2VuCisyOTpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpDYW1wYW5hCiszMDpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpDYW51ZWxhcworMzE6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6Q2FwaXRhbiBTYXJtaWVudG8KKzMyOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkNhcmxvcyBDYXNhcmVzCiszMzpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpDYXJsb3MgVGVqZWRvcgorMzQ6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6Q2FybWVuIGRlIEFyZWNvCiszNTpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpDYXN0ZWxsaQorMzY6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6Q2hhY2FidWNvCiszNzpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpDaGFzY29tdXMKKzM4OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkNoaXZpbGNveQorMzk6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6Q29sb24KKzQwOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkNvcm9uZWwgRG9ycmVnbworNDE6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6Q29yb25lbCBQcmluZ2xlcworNDI6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6Q29yb25lbCBTdWFyZXoKKzQzOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkNvcm9uZWwgZGUgTWFyaWFuYSBMZW9uYXIKKzQ0OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkRhaXJlYXV4Cis0NTpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpEb2xvcmVzCis0NjpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpFbnNlbmFkYQorNDc6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6RXNjb2JhcgorNDg6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6RXN0ZWJhbiBFY2hldmVycmlhCis0OTpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpFeGFsdGFjaW9uIGRlIGxhIENydXoKKzUwOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkZsb3JlbmNpbyBWYXJlbGEKKzUxOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkdlbmVyYWwgQWx2YXJhZG8KKzUyOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkdlbmVyYWwgQWx2ZWFyCis1MzpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpHZW5lcmFsIEFyZW5hbGVzCis1NDpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpHZW5lcmFsIEJlbGdyYW5vCis1NTpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpHZW5lcmFsIEd1aWRvCis1NjpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpHZW5lcmFsIEp1YW4gTWFkYXJpYWdhCis1NzpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpHZW5lcmFsIExhIE1hZHJpZAorNTg6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6R2VuZXJhbCBMYXMgSGVyYXMKKzU5OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkdlbmVyYWwgTGF2YWxsZQorNjA6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6R2VuZXJhbCBQYXoKKzYxOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkdlbmVyYWwgUGludG8KKzYyOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkdlbmVyYWwgUHVleXJyZWRvbgorNjM6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6R2VuZXJhbCBSb2RyaWd1ZXoKKzY0OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkdlbmVyYWwgU2FuIE1hcnRpbgorNjU6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6R2VuZXJhbCBTYXJtaWVudG8KKzY2OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkdlbmVyYWwgVmlhbW9udGUKKzY3OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkdlbmVyYWwgVmlsbGVnYXMKKzY4OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkd1YW1pbgorNjk6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6SGlwb2xpdG8gWXJpZ295ZW4KKzcwOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkp1bmluCis3MTpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpMYSBDb3N0YQorNzI6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6TGEgTWF0YW56YQorNzM6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6TGEgUGxhdGEKKzc0OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOkxhbnVzCis3NTpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpMYXByaWRhCis3NjpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpMYXMgRmxvcmVzCis3NzpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpMZW9uYXJkbyBOLiBBbGVtCis3ODpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpMaW5jb2xuCis3OTpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpMb2JlcmlhCis4MDpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpMb2JvcworODE6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6TG9tYXMgZGUgWmFtb3JhCis4MjpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpMdWphbgorODM6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6TWFnZGFsZW5hCis4NDpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpNYWlwdQorODU6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6TWFyIENoaXF1aXRhCis4NjpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpNYXJjb3MgUGF6Cis4NzpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpNZXJjZWRlcworODg6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6TWVybG8KKzg5OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOk1vbnRlCis5MDpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpNb250ZSBIZXJtb3NvCis5MTpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpNb3Jlbm8KKzkyOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOk1vcm9uCis5MzpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpOYXZhcnJvCis5NDpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpOZWNvY2hlYQorOTU6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6T2xhdmFycmlhCis5NjpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpQYXRhZ29uZXMKKzk3OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOlBhdGFnb25lcyAoSXMuKQorOTg6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6UGVodWFqbworOTk6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6UGVsbGVncmluaQorMTAwOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOlBlcmdhbWlubworMTAxOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOlBpbGEKKzEwMjpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpQaWxhcgorMTAzOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOlBpbmFtYXIKKzEwNDpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpQdWFuCisxMDU6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6UXVpbG1lcworMTA2OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOlJhbWFsbG8KKzEwNzpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpSYXVjaAorMTA4OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOlJpdmFkYXZpYQorMTA5OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOlJvamFzCisxMTA6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6Um9xdWUgUGVyZXoKKzExMTpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpTYWF2ZWRyYQorMTEyOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOlNhbGFkaWxsbworMTEzOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOlNhbGxpcXVlbGxvCisxMTQ6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6U2FsdG8KKzExNTpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpTYW4gQW5kcmVzIGRlIEdpbGVzCisxMTY6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6U2FuIEFudG9uaW8gZGUgQXJlY28KKzExNzpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpTYW4gQ2F5ZXRhbm8KKzExODpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpTYW4gRmVybmFuZG8KKzExOTpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpTYW4gSXNpZHJvCisxMjA6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6U2FuIE5pY29sYXMKKzEyMTpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpTYW4gUGVkcm8KKzEyMjpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpTYW4gVmljZW50ZQorMTIzOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOlN1aXBhY2hhCisxMjQ6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6VGFuZGlsCisxMjU6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6VGFwbHF1ZW4KKzEyNjpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpUaWdyZQorMTI3OkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOlRvcmRpbGxvCisxMjg6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6VG9ybnF1aXN0CisxMjk6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6VHJlbnF1ZSBMYXVxdWVuCisxMzA6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6VHJlcyBBcnJveW9zCisxMzE6QVI6QVJHOkFSR0VOVElOQTpCVUVOT1MgQUlSRVM6VHJlcyBMb21hcworMTMyOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOlRyZXMgZGUgRmVicmVybworMTMzOkFSOkFSRzpBUkdFTlRJTkE6QlVFTk9TIEFJUkVTOlZpY2VudGUgTG9wZXoKKzEzNDpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpWaWxsYSBHZXNlbGwKKzEzNTpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpWaWxsYXJpbm8KKzEzNjpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpWaWxsYXJpbm8gKElzLikKKzEzNzpBUjpBUkc6QVJHRU5USU5BOkJVRU5PUyBBSVJFUzpaYXJhdGUKKzE6QVI6QVJHOkFSR0VOVElOQTpMQSBSSU9KQTpBcmF1Y28KKzI6QVI6QVJHOkFSR0VOVElOQTpMQSBSSU9KQTpDYXBpdGFsCiszOkFSOkFSRzpBUkdFTlRJTkE6TEEgUklPSkE6Q2FzdHJvIEJhcnJvcworNDpBUjpBUkc6QVJHRU5USU5BOkxBIFJJT0pBOkNoaWxlY2l0bworNTpBUjpBUkc6QVJHRU5USU5BOkxBIFJJT0pBOkZhbWF0aW5hCis2OkFSOkFSRzpBUkdFTlRJTkE6TEEgUklPSkE6R2VuZXJhbCBBbmdlbCBWLiBQZXNhbG96YQorNzpBUjpBUkc6QVJHRU5USU5BOkxBIFJJT0pBOkdlbmVyYWwgQmVsZ3Jhbm8KKzg6QVI6QVJHOkFSR0VOVElOQTpMQSBSSU9KQTpHZW5lcmFsIEp1YW4gRi4gUXVpcm9nYQorOTpBUjpBUkc6QVJHRU5USU5BOkxBIFJJT0pBOkdlbmVyYWwgTGFtYWRyaWQKKzEwOkFSOkFSRzpBUkdFTlRJTkE6TEEgUklPSkE6R2VuZXJhbCBMYXZhbGxlCisxMTpBUjpBUkc6QVJHRU5USU5BOkxBIFJJT0pBOkdlbmVyYWwgT2NhbXBvCisxMjpBUjpBUkc6QVJHRU5USU5BOkxBIFJJT0pBOkdlbmVyYWwgU2FuIE1hcnRpbgorMTM6QVI6QVJHOkFSR0VOVElOQTpMQSBSSU9KQTpHZW5lcmFsIFNhcm1pZW50bworMTQ6QVI6QVJHOkFSR0VOVElOQTpMQSBSSU9KQTpHb2Jlcm5hZG9yIEdvcmRpbGxvCisxNTpBUjpBUkc6QVJHRU5USU5BOkxBIFJJT0pBOkluZGVwZW5kZW5jaWEKKzE2OkFSOkFSRzpBUkdFTlRJTkE6TEEgUklPSkE6Um9zYXJpbyBWZXJhIFBlbmFsb3phCisxNzpBUjpBUkc6QVJHRU5USU5BOkxBIFJJT0pBOlNhbiBCbGFzIGRlIGxvcyBTYXVjZXMKKzE4OkFSOkFSRzpBUkdFTlRJTkE6TEEgUklPSkE6U2FuYWdhc3RhCisxOkFSOkFSRzpBUkdFTlRJTkE6TUVORE9aQTpDYXBpdGFsCisyOkFSOkFSRzpBUkdFTlRJTkE6TUVORE9aQTpHZW5lcmFsIEFsdmVhcgorMzpBUjpBUkc6QVJHRU5USU5BOk1FTkRPWkE6R29kb3kgQ3J1egorNDpBUjpBUkc6QVJHRU5USU5BOk1FTkRPWkE6R3VheW1hbGxlbgorNTpBUjpBUkc6QVJHRU5USU5BOk1FTkRPWkE6SnVuaW4KKzY6QVI6QVJHOkFSR0VOVElOQTpNRU5ET1pBOkxhIFBhegorNzpBUjpBUkc6QVJHRU5USU5BOk1FTkRPWkE6TGFzIEhlcmFzCis4OkFSOkFSRzpBUkdFTlRJTkE6TUVORE9aQTpMYXZhbGxlCis5OkFSOkFSRzpBUkdFTlRJTkE6TUVORE9aQTpMdWphbgorMTA6QVI6QVJHOkFSR0VOVElOQTpNRU5ET1pBOk1haXB1CisxMTpBUjpBUkc6QVJHRU5USU5BOk1FTkRPWkE6TWFsYXJnZQorMTI6QVI6QVJHOkFSR0VOVElOQTpNRU5ET1pBOlJpdmFkYXZpYQorMTM6QVI6QVJHOkFSR0VOVElOQTpNRU5ET1pBOlNhbiBDYXJsb3MKKzE0OkFSOkFSRzpBUkdFTlRJTkE6TUVORE9aQTpTYW4gTWFydGluCisxNTpBUjpBUkc6QVJHRU5USU5BOk1FTkRPWkE6U2FuIFJhZmFlbAorMTY6QVI6QVJHOkFSR0VOVElOQTpNRU5ET1pBOlNhdGEgUm9zYQorMTc6QVI6QVJHOkFSR0VOVElOQTpNRU5ET1pBOlR1bnV5YW4KKzE4OkFSOkFSRzpBUkdFTlRJTkE6TUVORE9aQTpUdXB1bmdhdG8KKzE6QVI6QVJHOkFSR0VOVElOQTpTQU5UQSBGRTo5IGRlIEp1bGlvCisyOkFSOkFSRzpBUkdFTlRJTkE6U0FOVEEgRkU6QmVsZ3Jhbm8KKzM6QVI6QVJHOkFSR0VOVElOQTpTQU5UQSBGRTpDYXNlcm9zCis0OkFSOkFSRzpBUkdFTlRJTkE6U0FOVEEgRkU6Q2FzdGVsbGFub3MKKzU6QVI6QVJHOkFSR0VOVElOQTpTQU5UQSBGRTpDb25zdGl0dWNpb24KKzY6QVI6QVJHOkFSR0VOVElOQTpTQU5UQSBGRTpHYXJheQorNzpBUjpBUkc6QVJHRU5USU5BOlNBTlRBIEZFOkdlbmVyYWwgTG9wZXoKKzg6QVI6QVJHOkFSR0VOVElOQTpTQU5UQSBGRTpHZW5lcmFsIE9ibGlnYWRvCis5OkFSOkFSRzpBUkdFTlRJTkE6U0FOVEEgRkU6SXJpb25kbworMTA6QVI6QVJHOkFSR0VOVElOQTpTQU5UQSBGRTpMYSBDYXBpdGFsCisxMTpBUjpBUkc6QVJHRU5USU5BOlNBTlRBIEZFOkxhcyBDb2xvbmlhcworMTI6QVI6QVJHOkFSR0VOVElOQTpTQU5UQSBGRTpSb3NhcmlvCisxMzpBUjpBUkc6QVJHRU5USU5BOlNBTlRBIEZFOlNhbiBDcmlzdG9iYWwKKzE0OkFSOkFSRzpBUkdFTlRJTkE6U0FOVEEgRkU6U2FuIEphdmllcgorMTU6QVI6QVJHOkFSR0VOVElOQTpTQU5UQSBGRTpTYW4gSmVyb25pbW8KKzE2OkFSOkFSRzpBUkdFTlRJTkE6U0FOVEEgRkU6U2FuIEp1c3RvCisxNzpBUjpBUkc6QVJHRU5USU5BOlNBTlRBIEZFOlNhbiBMb3JlbnpvCisxODpBUjpBUkc6QVJHRU5USU5BOlNBTlRBIEZFOlNhbiBNYXJ0aW4KKzE5OkFSOkFSRzpBUkdFTlRJTkE6U0FOVEEgRkU6VmVyYQorMTpBUjpBUkc6QVJHRU5USU5BOkxBIFBBTVBBOkF0cmV1Y28KKzI6QVI6QVJHOkFSR0VOVElOQTpMQSBQQU1QQTpDYWxldSBDYWxldQorMzpBUjpBUkc6QVJHRU5USU5BOkxBIFBBTVBBOkNhcGl0YWwKKzQ6QVI6QVJHOkFSR0VOVElOQTpMQSBQQU1QQTpDYXRyaWxvCis1OkFSOkFSRzpBUkdFTlRJTkE6TEEgUEFNUEE6Q2hhbGlsZW8KKzY6QVI6QVJHOkFSR0VOVElOQTpMQSBQQU1QQTpDaGFwYWxldWZ1Cis3OkFSOkFSRzpBUkdFTlRJTkE6TEEgUEFNUEE6Q2hpY2FsIENvCis4OkFSOkFSRzpBUkdFTlRJTkE6TEEgUEFNUEE6Q29uaGVsbG8KKzk6QVI6QVJHOkFSR0VOVElOQTpMQSBQQU1QQTpDdXJhIENvCisxMDpBUjpBUkc6QVJHRU5USU5BOkxBIFBBTVBBOkd1YXRyYWNoZQorMTE6QVI6QVJHOkFSR0VOVElOQTpMQSBQQU1QQTpIdWNhbAorMTI6QVI6QVJHOkFSR0VOVElOQTpMQSBQQU1QQTpMaWh1ZWwgQ2FsZWwKKzEzOkFSOkFSRzpBUkdFTlRJTkE6TEEgUEFNUEE6TGltYXkgTWFodWlkYQorMTQ6QVI6QVJHOkFSR0VOVElOQTpMQSBQQU1QQTpMb3ZlbnR1ZQorMTU6QVI6QVJHOkFSR0VOVElOQTpMQSBQQU1QQTpNYXJhY28KKzE2OkFSOkFSRzpBUkdFTlRJTkE6TEEgUEFNUEE6UHVsZW4KKzE3OkFSOkFSRzpBUkdFTlRJTkE6TEEgUEFNUEE6UXVlbXUgUXVlbXUKKzE4OkFSOkFSRzpBUkdFTlRJTkE6TEEgUEFNUEE6UmFsaWNvCisxOTpBUjpBUkc6QVJHRU5USU5BOkxBIFBBTVBBOlJhbmN1bAorMjA6QVI6QVJHOkFSR0VOVElOQTpMQSBQQU1QQTpUb2F5CisyMTpBUjpBUkc6QVJHRU5USU5BOkxBIFBBTVBBOlRyZW5lbAorMjI6QVI6QVJHOkFSR0VOVElOQTpMQSBQQU1QQTpVbHRyYWNhbgorMTpBUjpBUkc6QVJHRU5USU5BOlNBTiBMVUlTOkF5YWN1Y2hvCisyOkFSOkFSRzpBUkdFTlRJTkE6U0FOIExVSVM6QmVsZ3Jhbm8KKzM6QVI6QVJHOkFSR0VOVElOQTpTQU4gTFVJUzpDaGFjYWJ1Y28KKzQ6QVI6QVJHOkFSR0VOVElOQTpTQU4gTFVJUzpDb3JvbmVsIFByaW5nbGVzCis1OkFSOkFSRzpBUkdFTlRJTkE6U0FOIExVSVM6R2VuZXJhbCBQZWRlcm5lcmEKKzY6QVI6QVJHOkFSR0VOVElOQTpTQU4gTFVJUzpHb2Jlcm5hZG9yIER1cHV5Cis3OkFSOkFSRzpBUkdFTlRJTkE6U0FOIExVSVM6SnVuaW4KKzg6QVI6QVJHOkFSR0VOVElOQTpTQU4gTFVJUzpMYSBDYXBpdGFsCis5OkFSOkFSRzpBUkdFTlRJTkE6U0FOIExVSVM6TGliZXJ0YWRvciBHZW5lcmFsIFNhbiBNYQorMTpBUjpBUkc6QVJHRU5USU5BOk1JU0lPTkVTOjI1IGRlIE1heW8KKzI6QVI6QVJHOkFSR0VOVElOQTpNSVNJT05FUzpBcG9zdG9sZXMKKzM6QVI6QVJHOkFSR0VOVElOQTpNSVNJT05FUzpDYWluZ3VhcworNDpBUjpBUkc6QVJHRU5USU5BOk1JU0lPTkVTOkNhbmRlbGFyaWEKKzU6QVI6QVJHOkFSR0VOVElOQTpNSVNJT05FUzpDYXBpdGFsCis2OkFSOkFSRzpBUkdFTlRJTkE6TUlTSU9ORVM6Q29uY2VwY2lvbgorNzpBUjpBUkc6QVJHRU5USU5BOk1JU0lPTkVTOkVsZG9yYWRvCis4OkFSOkFSRzpBUkdFTlRJTkE6TUlTSU9ORVM6R2VuZXJhbCBNYW51ZWwgQmVsZ3Jhbm8KKzk6QVI6QVJHOkFSR0VOVElOQTpNSVNJT05FUzpHdWFyYW5pCisxMDpBUjpBUkc6QVJHRU5USU5BOk1JU0lPTkVTOklndWF6dQorMTE6QVI6QVJHOkFSR0VOVElOQTpNSVNJT05FUzpMZWFuZHJvIE4uIEFsZW0KKzEyOkFSOkFSRzpBUkdFTlRJTkE6TUlTSU9ORVM6TGliZXJ0YWRvciBHZW5lcmFsIFNhbiBNYQorMTM6QVI6QVJHOkFSR0VOVElOQTpNSVNJT05FUzpNb250ZWNhcmxvCisxNDpBUjpBUkc6QVJHRU5USU5BOk1JU0lPTkVTOk9iZXJhCisxNTpBUjpBUkc6QVJHRU5USU5BOk1JU0lPTkVTOlNhbiBJZ25hY2lvCisxNjpBUjpBUkc6QVJHRU5USU5BOk1JU0lPTkVTOlNhbiBKYXZpZXIKKzE3OkFSOkFSRzpBUkdFTlRJTkE6TUlTSU9ORVM6U2FuIFBlZHJvCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FSTS9BUk1fQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FSTS9BUk1fQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyOTE2MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQVJNL0FSTV9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDExIEBACisxOkFNLUFHOkFNOkFSQUdBQ09UTgorMjpBTS1BUjpBTTpBUkFSQVQKKzM6QU0tQVY6QU06QVJNQVZJUgorNDpBTS1FUjpBTTpFUkVWQU4gW1lFUkVWQU5dIFtBUk1FTklBIFggWUVSRVZBTl0KKzU6QU0tR1I6QU06R0VBUktVTklLCis2OkFNLVNIOkFNOklSQUsKKzc6QU0tS1Q6QU06S09UQVlLCis4OkFNLUxPOkFNOkxPWQorOTpBTS1TVTpBTTpTWVVOSUsKKzEwOkFNLVRWOkFNOlRBVlUKKzExOkFNLVZEOkFNOlZBWU9DIEpPUgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9BUk0vQVJNX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9BUk0vQVJNX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NWViYmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FSTS9BUk1fQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSBAQAorMTpBTTpBUk06QVJNRU5JQTpBcm1lbmlhIHggWWVyZXZhbjpBUk0uTDIuMQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9BVVQvQVVUX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9BVVQvQVVUX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZTJlNGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FVVC9BVVRfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSw5IEBACisxOkFULTEwOkFUOkJVUkdFTkxBTkQKKzI6QVQtMjpBVDpLhFJOVEVOCiszOkFULTM6QVQ6TklFREVSlFNURVJSRUlDSAorNDpBVC00OkFUOk9CRVKUU1RFUlJFSUNICis1OkFULTU6QVQ6U0FMWkJVUkcKKzY6QVQtNjpBVDpTVEVJRVJNQVJLCis3OkFULTc6QVQ6VElST0wKKzg6QVQtODpBVDpWT1JBTEJFUkcKKzk6QVQtOTpBVDpXSUVOCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FVVC9BVVRfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FVVC9BVVRfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQVVUL0FVVF9BRE1JTjJfTEVYLnR4dApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9BWkUvQVpFX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9BWkUvQVpFX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYzM1N2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FaRS9BWkVfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSw3OSBAQAorMTpBWi1BQlM6QVo6QUJFUk9OCisyOkFaLUFHQzpBWjpBQ0FCREkKKzM6QVotQUdTOkFaOkFEQQorNDpBWi1BR006QVo6QURBTQorNTpBWi1TQUg6QVo6QUhCVVoKKzY6QVotU01JOkFaOkFNQVgKKzc6QVotQUdBOkFaOkFTVEFGQQorODpBWi1BU1Q6QVo6QVNUQVJBCis5OkFaLUFHVTpBWjpBU1UKKzEwOkFaLUFURTpBWjpBWkVSQkFZRFpIQU4gVEVSUklUT1IKKzExOkFaLUJBQjpBWjpCQUJLCisxMjpBWi1CQTpBWjpCQUsKKzEzOkFaLUJBTDpBWjpCQUxBS04KKzE0OkFaLUJFWTpBWjpCRVlMUUFOCisxNTpBWi1CSUw6QVo6QklMU1VWQVIKKzE2OkFaLUJBUjpBWjpCUkQKKzE3OkFaLUNBQjpBWjpDQlJBWUwKKzE4OkFaLUNBTDpBWjpDTElMQUJBQgorMTk6QVotQ1VMOkFaOkNVTEZBCisyMDpBWi1EQVM6QVo6REFLU04KKzIxOkFaLURBVjpBWjpEVkNJCisyMjpBWi1GVVo6QVo6RtxaVUxJCisyMzpBWi1HQUQ6QVo6R0RCWQorMjQ6QVotR0E6QVo6R05DCisyNTpBWi1HT1I6QVo6R09SQU5CT1kKKzI2OkFaLUdPWTpBWjpHWUNBWQorMjc6QVotSEFDOkFaOkhBQ1FBQlVMCisyODpBWi1TQTpBWjpLSQorMjk6QVotU0E6QVo6S0kKKzMwOkFaLUtBTDpBWjpLTEJDUgorMzE6QVotS1VSOkFaOkvcUkRNSVIKKzMyOkFaLUxBQzpBWjpMQUNOCiszMzpBWi1MRVI6QVo6TEVSSUsKKzM0OkFaLUFCOkFaOkxJIEJBWVJBTUwKKzM1OkFaLUxBOkFaOkxOS1JBTgorMzY6QVotTEE6QVo6TE5LUkFOCiszNzpBWi1NQVM6QVo6TUFTQUxMCiszODpBWi1JTUk6QVo6TUlMSQorMzk6QVotTUk6QVo6TUlOR0NFVklSCis0MDpBWi1TS1I6QVo6TUtJUgorNDE6QVotTkE6QVo6TkFGVEFMQU4KKzQyOkFaLU5LQTpBWjpOQUdPUk5PIEtBUkFCQUtICis0MzpBWi1OQUs6QVo6TkFLSElDSEVWQU4KKzQ0OkFaLU5FRjpBWjpORUZUQ0FMQQorNDU6QVotT1JEOkFaOk9SRFVCQUQKKzQ2OkFaLU9HVTpBWjpPVVoKKzQ3OkFaLVFBWDpBWjpRQVgKKzQ4OkFaLVFBWjpBWjpRQVpBWAorNDk6QVotUUFCOkFaOlFCTAorNTA6QVotUU9COkFaOlFPQlVTVEFOCis1MTpBWi1RQkE6QVo6UVVCQQorNTI6QVotUUJJOkFaOlFVQkFETAorNTM6QVotUVVTOkFaOlFVU0FSCis1NDpBWi1TQVI6QVo6UlVSCis1NTpBWi1TQVQ6QVo6U0FBVEwKKzU2OkFaLVNBQjpBWjpTQUJJUkFCQUQKKzU3OkFaLVNBTDpBWjpTQUxZQU4KKzU4OkFaLVNNWDpBWjpTQU1VWAorNTk6QVotU0FEOkFaOlNEUksKKzYwOkFaLVNJWTpBWjpTSVlaTgorNjE6QVotSVNNOkFaOlNNQVlMTAorNjI6QVotU006QVo6U1VNUUFZVAorNjM6QVotVE9WOkFaOlRPVlVaCis2NDpBWi1UQVI6QVo6VFJUUgorNjU6QVotU1M6QVo6VUEKKzY2OkFaLVNTOkFaOlVBCis2NzpBWi1VQ0E6QVo6VUNBUgorNjg6QVotWEFDOkFaOlhBQ01BWgorNjk6QVotWEE6QVo6WEFOS05ESQorNzA6QVotWEFOOkFaOlhBTkxBUgorNzE6QVotWENJOkFaOlhPQ0FMCis3MjpBWi1YVkQ6QVo6WE9DQVZORAorNzM6QVotWElaOkFaOlhaCis3NDpBWi1ZQVI6QVo6WUFSRE1MCis3NTpBWi1ZRTpBWjpZRVZMQVgKKzc2OkFaLVlFOkFaOllFVkxBWAorNzc6QVotWkFROkFaOlpBUUFUQUxBCis3ODpBWi1aQU46QVo6Wk5HSUxBTgorNzk6QVotWkFSOkFaOlpSREFCCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FaRS9BWkVfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0FaRS9BWkVfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU2MmY5OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQVpFL0FaRV9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDE3IEBACisxOkFaOkFaRTpBWkVSQkFJSkFOOkF6ZXJiYXlkemhhbiBUZXJyaXRvcjpBWkUuTDIuMTAKKzI6QVo6QVpFOkFaRVJCQUlKQU46QXplcmJheWR6aGFuIFRlcnJpdG9yOkFaRS5MMi4xMQorMzpBWjpBWkU6QVpFUkJBSUpBTjpBemVyYmF5ZHpoYW4gVGVycml0b3I6QVpFLkwyLjEyCis0OkFaOkFaRTpBWkVSQkFJSkFOOkF6ZXJiYXlkemhhbiBUZXJyaXRvcjpBWkUuTDIuMTMKKzU6QVo6QVpFOkFaRVJCQUlKQU46QXplcmJheWR6aGFuIFRlcnJpdG9yOkFaRS5MMi4xNAorNjpBWjpBWkU6QVpFUkJBSUpBTjpBemVyYmF5ZHpoYW4gVGVycml0b3I6QVpFLkwyLjE1Cis3OkFaOkFaRTpBWkVSQkFJSkFOOkF6ZXJiYXlkemhhbiBUZXJyaXRvcjpBWkUuTDIuMTYKKzg6QVo6QVpFOkFaRVJCQUlKQU46QXplcmJheWR6aGFuIFRlcnJpdG9yOkFaRS5MMi4yCis5OkFaOkFaRTpBWkVSQkFJSkFOOkF6ZXJiYXlkemhhbiBUZXJyaXRvcjpBWkUuTDIuMworMTA6QVo6QVpFOkFaRVJCQUlKQU46QXplcmJheWR6aGFuIFRlcnJpdG9yOkFaRS5MMi40CisxMTpBWjpBWkU6QVpFUkJBSUpBTjpBemVyYmF5ZHpoYW4gVGVycml0b3I6QVpFLkwyLjUKKzEyOkFaOkFaRTpBWkVSQkFJSkFOOkF6ZXJiYXlkemhhbiBUZXJyaXRvcjpBWkUuTDIuNgorMTM6QVo6QVpFOkFaRVJCQUlKQU46QXplcmJheWR6aGFuIFRlcnJpdG9yOkFaRS5MMi43CisxNDpBWjpBWkU6QVpFUkJBSUpBTjpBemVyYmF5ZHpoYW4gVGVycml0b3I6QVpFLkwyLjgKKzE1OkFaOkFaRTpBWkVSQkFJSkFOOkF6ZXJiYXlkemhhbiBUZXJyaXRvcjpBWkUuTDIuOQorMTpBWjpBWkU6QVpFUkJBSUpBTjpOYWtoaWNoZXZhbjpBWkUuTDIuMTcKKzE6QVo6QVpFOkFaRVJCQUlKQU46TmFnb3Juby1LYXJhYmFraDpBWkUuTDIuMQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CREkvQkRJX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CREkvQkRJX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MjA0ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JESS9CRElfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxNiBAQAorMTpCSS1CQjpCSTpCVUJBTlpBCisyOkJJLUJKOkJJOkJVSlVNQlVSQQorMzpCSS1CUjpCSTpCVVJVUkkKKzQ6QkktQ0E6Qkk6Q0FOS1VaTworNTpCSS1DSTpCSTpDSUJJVE9LRQorNjpCSS1HSTpCSTpHSVRFR0EKKzc6QkktS1I6Qkk6S0FSVVpJCis4OkJJLUtZOkJJOktBWUFOWkEKKzk6QkktS0k6Qkk6S0lSVU5ETworMTA6QkktTUE6Qkk6TUFLQU1CQQorMTE6QkktTVU6Qkk6TVVSQU1WSVlBCisxMjpCSS1NWTpCSTpNVVlJTkdBCisxMzpCSS1NVzpCSTpNV0FSTworMTQ6QkktTkc6Qkk6TkdPWkkKKzE1OkJJLVJUOkJJOlJVVEFOQQorMTY6QkktUlk6Qkk6UlVZSUdJCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JESS9CRElfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JESS9CRElfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiZTU4ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQkRJL0JESV9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDExNCBAQAorMTpCSTpCREk6QlVSVU5ESTpDaWJpdG9rZTpCdWdhbmRhCisyOkJJOkJESTpCVVJVTkRJOkNpYml0b2tlOkJ1a2luYW52YW5hCiszOkJJOkJESTpCVVJVTkRJOkNpYml0b2tlOk1hYmF5Cis0OkJJOkJESTpCVVJVTkRJOkNpYml0b2tlOk11Z2luYQorNTpCSTpCREk6QlVSVU5ESTpDaWJpdG9rZTpNdXJ3aQorNjpCSTpCREk6QlVSVU5ESTpDaWJpdG9rZTpSdWdvbWJvCisxOkJJOkJESTpCVVJVTkRJOk11cmFtdml5YTpCaXNvcm8KKzI6Qkk6QkRJOkJVUlVOREk6TXVyYW12aXlhOkJ1a2V5ZQorMzpCSTpCREk6QlVSVU5ESTpNdXJhbXZpeWE6R2lzb3ppCis0OkJJOkJESTpCVVJVTkRJOk11cmFtdml5YTpLYXlva3dlCis1OkJJOkJESTpCVVJVTkRJOk11cmFtdml5YTpLaWdhbmRhCis2OkJJOkJESTpCVVJVTkRJOk11cmFtdml5YTpNYnV5ZQorNzpCSTpCREk6QlVSVU5ESTpNdXJhbXZpeWE6TXVyYW12aXlhCis4OkJJOkJESTpCVVJVTkRJOk11cmFtdml5YTpOZGF2YQorOTpCSTpCREk6QlVSVU5ESTpNdXJhbXZpeWE6TnlhYmlnaW5hCisxMDpCSTpCREk6QlVSVU5ESTpNdXJhbXZpeWE6UnVzYWthCisxMTpCSTpCREk6QlVSVU5ESTpNdXJhbXZpeWE6UnV0ZWdhbWEKKzE6Qkk6QkRJOkJVUlVOREk6S2F5YW56YTpCdXRhZ2FuendhbAorMjpCSTpCREk6QlVSVU5ESTpLYXlhbnphOkdhaG9tYm8KKzM6Qkk6QkRJOkJVUlVOREk6S2F5YW56YTpHYXRhcmEKKzQ6Qkk6QkRJOkJVUlVOREk6S2F5YW56YTpLYWJhcm9yZQorNTpCSTpCREk6QlVSVU5ESTpLYXlhbnphOktheWFuemEKKzY6Qkk6QkRJOkJVUlVOREk6S2F5YW56YTpNYXRvbmdvCis3OkJJOkJESTpCVVJVTkRJOktheWFuemE6TXVoYW5nYQorODpCSTpCREk6QlVSVU5ESTpLYXlhbnphOk11cnV0YQorOTpCSTpCREk6QlVSVU5ESTpLYXlhbnphOlJhbmdvCisxOkJJOkJESTpCVVJVTkRJOkNhbmt1em86Q2Fua3V6bworMjpCSTpCREk6QlVSVU5ESTpDYW5rdXpvOkNlbmRhanVydQorMzpCSTpCREk6QlVSVU5ESTpDYW5rdXpvOkdpc2FnYXJhCis0OkJJOkJESTpCVVJVTkRJOkNhbmt1em86S2lnYW1iYQorNTpCSTpCREk6QlVSVU5ESTpDYW5rdXpvOk11c2hpaGEKKzE6Qkk6QkRJOkJVUlVOREk6S2FydXppOkJ1Z2VueXV6aQorMjpCSTpCREk6QlVSVU5ESTpLYXJ1emk6QnVoaWdhCiszOkJJOkJESTpCVVJVTkRJOkthcnV6aTpHaWhvZ2F6aQorNDpCSTpCREk6QlVSVU5ESTpLYXJ1emk6R2l0YXJhbXVrYQorNTpCSTpCREk6QlVSVU5ESTpLYXJ1emk6TXV0dW1iYQorNjpCSTpCREk6QlVSVU5ESTpLYXJ1emk6TnlhYmlrZXJlCis3OkJJOkJESTpCVVJVTkRJOkthcnV6aTpTaG9tYm8KKzE6Qkk6QkRJOkJVUlVOREk6TWFrYW1iYTpLYXlvZ29ybworMjpCSTpCREk6QlVSVU5ESTpNYWthbWJhOktpYmFnbworMzpCSTpCREk6QlVSVU5ESTpNYWthbWJhOk1hYmFuZGEKKzQ6Qkk6QkRJOkJVUlVOREk6TWFrYW1iYTpNYWthbWJhCis1OkJJOkJESTpCVVJVTkRJOk1ha2FtYmE6TnlhbnphIExhYworNjpCSTpCREk6QlVSVU5ESTpNYWthbWJhOlZ1Z2l6bworMTpCSTpCREk6QlVSVU5ESTpOZ296aTpCdXNpZ2EKKzI6Qkk6QkRJOkJVUlVOREk6Tmdvemk6R2FzaGlrYW53YQorMzpCSTpCREk6QlVSVU5ESTpOZ296aTpLaXJlbWJhCis0OkJJOkJESTpCVVJVTkRJOk5nb3ppOk1hcmFuZ2FyYQorNTpCSTpCREk6QlVSVU5ESTpOZ296aTpNd3VtYmEKKzY6Qkk6QkRJOkJVUlVOREk6Tmdvemk6TmdvemkKKzc6Qkk6QkRJOkJVUlVOREk6Tmdvemk6TnZhbXVyZW56YQorODpCSTpCREk6QlVSVU5ESTpOZ296aTpSdWhvcm9ybworOTpCSTpCREk6QlVSVU5ESTpOZ296aTpUYW5nYXJhCisxOkJJOkJESTpCVVJVTkRJOkJ1cnVyaTpCdXJhbWJpCisyOkJJOkJESTpCVVJVTkRJOkJ1cnVyaTpCdXJ1cmkKKzM6Qkk6QkRJOkJVUlVOREk6QnVydXJpOkJ1eWVuZ2VybworNDpCSTpCREk6QlVSVU5ESTpCdXJ1cmk6TWF0YW5hCis1OkJJOkJESTpCVVJVTkRJOkJ1cnVyaTpNdWdhbWJhCis2OkJJOkJESTpCVVJVTkRJOkJ1cnVyaTpSdW1vbmdlCis3OkJJOkJESTpCVVJVTkRJOkJ1cnVyaTpSdXRvdnUKKzg6Qkk6QkRJOkJVUlVOREk6QnVydXJpOlNvbmdhCis5OkJJOkJESTpCVVJVTkRJOkJ1cnVyaTpWeWFuZGEKKzE6Qkk6QkRJOkJVUlVOREk6TXV5aW5nYTpCdWhpbnZ1emEKKzI6Qkk6QkRJOkJVUlVOREk6TXV5aW5nYTpCdXRpaGluZGEKKzM6Qkk6QkRJOkJVUlVOREk6TXV5aW5nYTpHYXNob2hvCis0OkJJOkJESTpCVVJVTkRJOk11eWluZ2E6R2Fzb3J3ZQorNTpCSTpCREk6QlVSVU5ESTpNdXlpbmdhOkdpdGVyYW55aQorNjpCSTpCREk6QlVSVU5ESTpNdXlpbmdhOk11eWluZ2EKKzc6Qkk6QkRJOkJVUlVOREk6TXV5aW5nYTpNd2FraXJvCisxOkJJOkJESTpCVVJVTkRJOkdpdGVnYTpCdWdlbmRhbmEKKzI6Qkk6QkRJOkJVUlVOREk6R2l0ZWdhOkJ1a2lyYXNhemkKKzM6Qkk6QkRJOkJVUlVOREk6R2l0ZWdhOkJ1cmF6YQorNDpCSTpCREk6QlVSVU5ESTpHaXRlZ2E6R2loZXRhCis1OkJJOkJESTpCVVJVTkRJOkdpdGVnYTpHaXNodWJpCis2OkJJOkJESTpCVVJVTkRJOkdpdGVnYTpHaXRlZ2EKKzc6Qkk6QkRJOkJVUlVOREk6R2l0ZWdhOkl0YWJhCis4OkJJOkJESTpCVVJVTkRJOkdpdGVnYTpNYWtlYnVrbworOTpCSTpCREk6QlVSVU5ESTpHaXRlZ2E6TXV0YWhvCisxMDpCSTpCREk6QlVSVU5ESTpHaXRlZ2E6UnlhbnNvcm8KKzE6Qkk6QkRJOkJVUlVOREk6QnVqdW1idXJhOklzYWxlLU11Z2FydXJvCisyOkJJOkJESTpCVVJVTkRJOkJ1anVtYnVyYTpLYWJlemkKKzM6Qkk6QkRJOkJVUlVOREk6QnVqdW1idXJhOkthbnlvc2hhCis0OkJJOkJESTpCVVJVTkRJOkJ1anVtYnVyYTpNdWJpbWJpCis1OkJJOkJESTpCVVJVTkRJOkJ1anVtYnVyYTpNdWdvbmdvbWFuZ2EKKzY6Qkk6QkRJOkJVUlVOREk6QnVqdW1idXJhOk11aHV0YQorNzpCSTpCREk6QlVSVU5ESTpCdWp1bWJ1cmE6TXVraWtlCis4OkJJOkJESTpCVVJVTkRJOkJ1anVtYnVyYTpNdXRhbWJ1Cis5OkJJOkJESTpCVVJVTkRJOkJ1anVtYnVyYTpNdXRpbWJ1emkKKzEwOkJJOkJESTpCVVJVTkRJOkJ1anVtYnVyYTpOeWFiaWdpbmEgKEJ1aikKKzE6Qkk6QkRJOkJVUlVOREk6S2lydW5kbzpCdWdhYmlyYQorMjpCSTpCREk6QlVSVU5ESTpLaXJ1bmRvOkJ1c29uaQorMzpCSTpCREk6QlVSVU5ESTpLaXJ1bmRvOkJ3YW1iYXJhbmd3ZQorNDpCSTpCREk6QlVSVU5ESTpLaXJ1bmRvOkdpdG9iZQorNTpCSTpCREk6QlVSVU5ESTpLaXJ1bmRvOktpcnVuZG8KKzY6Qkk6QkRJOkJVUlVOREk6S2lydW5kbzpOdGVnYQorNzpCSTpCREk6QlVSVU5ESTpLaXJ1bmRvOlZ1bWJpLUJ1a3ViYQorMTpCSTpCREk6QlVSVU5ESTpSdXlpZ2k6QnV0YWdhbnp3YTIKKzI6Qkk6QkRJOkJVUlVOREk6UnV5aWdpOkJ1dGV6aQorMzpCSTpCREk6QlVSVU5ESTpSdXlpZ2k6QndlcnUKKzQ6Qkk6QkRJOkJVUlVOREk6UnV5aWdpOkdpc3VydQorNTpCSTpCREk6QlVSVU5ESTpSdXlpZ2k6S2lueWlueWEKKzY6Qkk6QkRJOkJVUlVOREk6UnV5aWdpOk55YWJpdHNpbmRhCis3OkJJOkJESTpCVVJVTkRJOlJ1eWlnaTpSdXlpZ2kKKzE6Qkk6QkRJOkJVUlVOREk6UnV0YW5hOkJ1a2VtYmEKKzI6Qkk6QkRJOkJVUlVOREk6UnV0YW5hOkdpaGFybworMzpCSTpCREk6QlVSVU5ESTpSdXRhbmE6R2l0YW5nYQorNDpCSTpCREk6QlVSVU5ESTpSdXRhbmE6TXBpbmdhLUtheW92ZQorNTpCSTpCREk6QlVSVU5ESTpSdXRhbmE6TXVzb25nYXRpCis2OkJJOkJESTpCVVJVTkRJOlJ1dGFuYTpSdXRhbmEKKzE6Qkk6QkRJOkJVUlVOREk6QnViYW56YTpCdWJhbnphCisyOkJJOkJESTpCVVJVTkRJOkJ1YmFuemE6R2loYW5nYQorMzpCSTpCREk6QlVSVU5ESTpCdWJhbnphOk1wYW5kYQorNDpCSTpCREk6QlVSVU5ESTpCdWJhbnphOk11c2lnYXRpCis1OkJJOkJESTpCVVJVTkRJOkJ1YmFuemE6UnVnYXppCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JFTC9CRUxfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JFTC9CRUxfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4NjgwZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQkVML0JFTF9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDEyIEBACisxOkJFLVZBTjpCRTpBTlRXRVJQRU4KKzI6QkUtV0JSOkJFOkJSQUJBTlQgV0FMTE9OCiszOkJFLUJSWDpCRTpCUlVYRUxMRVMgQlJVU1NFTAorNDpCRS1XSFQ6QkU6SEFJTkFVVAorNTpCRS1XTEc6QkU6TElFR0UKKzY6QkUtVkxJOkJFOkxJTUJVUkcKKzc6QkUtV0xYOkJFOkxVWEVNQk9VUkcKKzg6QkUtV05BOkJFOk5BTVVSCis5OkJFLU5WTDpCRTpOSVZFTExFUworMTA6QkUtVk9WOkJFOk9PU1QgVkxBQU5ERVJFTgorMTE6QkUtVkJSOkJFOlZMQUFNUyBCUkFCQU5UCisxMjpCRS1WV1Y6QkU6V0VTVCBWTEFBTkRFUkVOCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JFTC9CRUxfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JFTC9CRUxfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQkVML0JFTF9BRE1JTjJfTEVYLnR4dApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CRU4vQkVOX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CRU4vQkVOX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTcxODgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JFTi9CRU5fQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxMiBAQAorMTpCSi1BTDpCSjpBTElCT1JJCisyOkJKLUFLOkJKOkFUQUtPUkEKKzM6QkotQVE6Qko6QVRMQU5USVFVRQorNDpCSi1CTzpCSjpCT1JHT1UKKzU6QkotQ086Qko6Q09MTElORVMKKzY6QkotRE86Qko6RE9OR0EKKzc6QkotS086Qko6S09VRkZPCis4OkJKLUxJOkJKOkxJVFRPUkFMCis5OkJKLU1POkJKOk1PTk8KKzEwOkJKLU9VOkJKOk9VRU1FCisxMTpCSi1QTDpCSjpQTEFURUFVCisxMjpCSi1aTzpCSjpaT1UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQkVOL0JFTl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQkVOL0JFTl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTMyMGMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CRU4vQkVOX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsNzcgQEAKKzE6Qko6QkVOOkJFTklOOk1vbm86QXBsYWhvdWUKKzI6Qko6QkVOOkJFTklOOk1vbm86QXRoaWVtZQorMzpCSjpCRU46QkVOSU46TW9ubzpCb3BhCis0OkJKOkJFTjpCRU5JTjpNb25vOkNvbWUKKzU6Qko6QkVOOkJFTklOOk1vbm86RGpha290b21lCis2OkJKOkJFTjpCRU5JTjpNb25vOkRvZ2JvLVRvdGEKKzc6Qko6QkVOOkJFTklOOk1vbm86R3JhbmQtUG9wbworODpCSjpCRU46QkVOSU46TW9ubzpIb3VleW9nYmUKKzk6Qko6QkVOOkJFTklOOk1vbm86S2xvdWVrYW5tZQorMTA6Qko6QkVOOkJFTklOOk1vbm86TGFsbworMTE6Qko6QkVOOkJFTklOOk1vbm86VG92aWtsaW4KKzE6Qko6QkVOOkJFTklOOkF0bGFudGlxdWU6QWJvbWV5LUNhbGF2aQorMjpCSjpCRU46QkVOSU46QXRsYW50aXF1ZTpBbGxhZGEKKzM6Qko6QkVOOkJFTklOOkF0bGFudGlxdWU6Q290b25vdQorNDpCSjpCRU46QkVOSU46QXRsYW50aXF1ZTpLcG9tYXNzZQorNTpCSjpCRU46QkVOSU46QXRsYW50aXF1ZTpPdWlkYWgKKzY6Qko6QkVOOkJFTklOOkF0bGFudGlxdWU6U28tQXZhCis3OkJKOkJFTjpCRU5JTjpBdGxhbnRpcXVlOlRvZmZvCis4OkJKOkJFTjpCRU5JTjpBdGxhbnRpcXVlOlRvcmktQm9zc2l0bworOTpCSjpCRU46QkVOSU46QXRsYW50aXF1ZTpaZQorMTpCSjpCRU46QkVOSU46T3VlbWU6QWRqYXJyYQorMjpCSjpCRU46QkVOSU46T3VlbWU6QWRqb2hvdW4KKzM6Qko6QkVOOkJFTklOOk91ZW1lOkFndWVndWUKKzQ6Qko6QkVOOkJFTklOOk91ZW1lOkFrcHJvLU1pc3NlcmV0ZQorNTpCSjpCRU46QkVOSU46T3VlbWU6QXZyYW5rb3UKKzY6Qko6QkVOOkJFTklOOk91ZW1lOkJvbm91Cis3OkJKOkJFTjpCRU5JTjpPdWVtZTpEYW5nYm8KKzg6Qko6QkVOOkJFTklOOk91ZW1lOklmYW5nbmkKKzk6Qko6QkVOOkJFTklOOk91ZW1lOklrcGlubGUgKEFkamEtT3VlcmUpCisxMDpCSjpCRU46QkVOSU46T3VlbWU6S2V0b3UKKzExOkJKOkJFTjpCRU5JTjpPdWVtZTpQb2JlCisxMjpCSjpCRU46QkVOSU46T3VlbWU6UG9ydG8gTm92bworMTM6Qko6QkVOOkJFTklOOk91ZW1lOlNha2V0ZQorMTQ6Qko6QkVOOkJFTklOOk91ZW1lOlNlbWUtS3BvZGppCisxOkJKOkJFTjpCRU5JTjpCb3Jnb3U6QmFuaWtvYXJhCisyOkJKOkJFTjpCRU5JTjpCb3Jnb3U6QmVtYmVyZWtlCiszOkJKOkJFTjpCRU5JTjpCb3Jnb3U6R29nb3Vub3UKKzQ6Qko6QkVOOkJFTklOOkJvcmdvdTpLYWxhbGUKKzU6Qko6QkVOOkJFTklOOkJvcmdvdTpLYW5kaQorNjpCSjpCRU46QkVOSU46Qm9yZ291OkthcmltYW1hCis3OkJKOkJFTjpCRU5JTjpCb3Jnb3U6TWFsYW52aWxsZQorODpCSjpCRU46QkVOSU46Qm9yZ291Ok5kYWxpCis5OkJKOkJFTjpCRU5JTjpCb3Jnb3U6Tmlra2kKKzEwOkJKOkJFTjpCRU5JTjpCb3Jnb3U6UGFyYWtvdQorMTE6Qko6QkVOOkJFTklOOkJvcmdvdTpQZXJlcmUKKzEyOkJKOkJFTjpCRU5JTjpCb3Jnb3U6U2VnYmFuYQorMTM6Qko6QkVOOkJFTklOOkJvcmdvdTpTaW5lbmRlCisxNDpCSjpCRU46QkVOSU46Qm9yZ291OlRjaGFvdXJvdQorMTpCSjpCRU46QkVOSU46Wm91OkFib21leQorMjpCSjpCRU46QkVOSU46Wm91OkFnYmFuZ25pem91bgorMzpCSjpCRU46QkVOSU46Wm91OkJhbnRlCis0OkJKOkJFTjpCRU5JTjpab3U6Qm9oaWNvbgorNTpCSjpCRU46QkVOSU46Wm91OkNvdmUKKzY6Qko6QkVOOkJFTklOOlpvdTpEYXNzYQorNzpCSjpCRU46QkVOSU46Wm91OkRqaWRqYQorODpCSjpCRU46QkVOSU46Wm91OkdsYXpvdWUKKzk6Qko6QkVOOkJFTklOOlpvdTpPdWVzc2UKKzEwOkJKOkJFTjpCRU5JTjpab3U6T3VpbmhpCisxMTpCSjpCRU46QkVOSU46Wm91OlNhdmFsb3UKKzEyOkJKOkJFTjpCRU5JTjpab3U6U2F2ZQorMTM6Qko6QkVOOkJFTklOOlpvdTpaYSBLcG90YQorMTQ6Qko6QkVOOkJFTklOOlpvdTpaYW5nbmFuYWRvCisxNTpCSjpCRU46QkVOSU46Wm91OlpvZ2JvZG9tZQorMTpCSjpCRU46QkVOSU46QXRha29yYTpCYXNzaWxhCisyOkJKOkJFTjpCRU5JTjpBdGFrb3JhOkJvdWtvdW1iZQorMzpCSjpCRU46QkVOSU46QXRha29yYTpDb2JsaQorNDpCSjpCRU46QkVOSU46QXRha29yYTpDb3BhcmdvCis1OkJKOkJFTjpCRU5JTjpBdGFrb3JhOkRqb3Vnb3UgUnVyYWwKKzY6Qko6QkVOOkJFTklOOkF0YWtvcmE6RGpvdWdvdSBVcmJhbgorNzpCSjpCRU46QkVOSU46QXRha29yYTpLZXJvdQorODpCSjpCRU46QkVOSU46QXRha29yYTpLb3VhbmRlCis5OkJKOkJFTjpCRU5JTjpBdGFrb3JhOk1hdGVyaQorMTA6Qko6QkVOOkJFTklOOkF0YWtvcmE6TmF0aW5nb3UKKzExOkJKOkJFTjpCRU5JTjpBdGFrb3JhOk91YWtlCisxMjpCSjpCRU46QkVOSU46QXRha29yYTpQZWhvbmtvCisxMzpCSjpCRU46QkVOSU46QXRha29yYTpUYW5ndWlldGEKKzE0OkJKOkJFTjpCRU5JTjpBdGFrb3JhOlRjaG91a291dG91bmEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQkZBL0JGQV9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQkZBL0JGQV9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGQwYWE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CRkEvQkZBX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsNDUgQEAKKzE6QkYtQkFMOkJGOkJBTEUKKzI6QkYtQkFNOkJGOkJBTQorMzpCRi1CQU46QkY6QkFOV0EKKzQ6QkYtQkFaOkJGOkJBWkVHQQorNTpCRi1CR1I6QkY6Qk9VR09VUklCQQorNjpCRi1CTEc6QkY6Qk9VTEdPVQorNzpCRi1CTEs6QkY6Qk9VTEtJRU1ERQorODpCRi1DT006QkY6Q09NT0UKKzk6QkYtR0FOOkJGOkdBTlpPVVJHT1UKKzEwOkJGLUdOQTpCRjpHTkFHTkEKKzExOkJGLUdPVTpCRjpHT1VSTUEKKzEyOkJGLUhPVTpCRjpIT1VFVAorMTM6QkYtSU9COkJGOklPQkEKKzE0OkJGLUtBRDpCRjpLQURJT0dPCisxNTpCRi1LRU46QkY6S0VORURPVUdPVQorMTY6QkYtS01EOkJGOktPTU9OREpBUkkKKzE3OkJGLUtNUDpCRjpLT01QSUVOR0EKKzE4OkJGLUtPUzpCRjpLT1NTSQorMTk6QkYtS09QOkJGOktPVUxQRUxPR08KKzIwOkJGLUtPVDpCRjpLT1VSSVRFTkdBCisyMTpCRi1LT1c6QkY6S09VUldFT0dPCisyMjpCRi1MRVI6QkY6TEVSQUJBCisyMzpCRi1MT1I6QkY6TE9ST1VNCisyNDpCRi1NT1U6QkY6TU9VSE9VTiBbTU9VIEhPVU5dCisyNTpCRi1OQU86QkY6TkFIT1VSSQorMjY6QkYtTkFNOkJGOk5BTUVOVEVOR0EKKzI3OkJGLU5BWTpCRjpOQVlBTEEKKzI4OkJGLU5PVTpCRjpOT1VNQklFTAorMjk6QkYtT1VCOkJGOk9VQlJJVEVOR0EKKzMwOkJGLU9VRDpCRjpPVURBTEFOCiszMTpCRi1QQVM6QkY6UEFTU09SRQorMzI6QkYtUE9OOkJGOlBPTkkKKzMzOkJGLVNORzpCRjpTQU5HVUlFCiszNDpCRi1TTVQ6QkY6U0FOTUFURU5HQQorMzU6QkYtU0VOOkJGOlNFTk8KKzM2OkJGLVNJUzpCRjpTSVNTSUxJCiszNzpCRi1TT006QkY6U09VTQorMzg6QkYtU09SOkJGOlNPVVJPVQorMzk6QkYtVEFQOkJGOlRBUE9BCis0MDpCRi1UVUk6QkY6VFVJCis0MTpCRi1ZQUc6QkY6WUFHSEEKKzQyOkJGLVlBVDpCRjpZQVRFTkdBCis0MzpCRi1aSVI6QkY6WklSTworNDQ6QkYtWk9OOkJGOlpPTkRPTUEKKzQ1OkJGLVpPVTpCRjpaT1VORFdFT0dPCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JGQS9CRkFfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JGQS9CRkFfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4MDM3NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQkZBL0JGQV9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDMwMSBAQAorMTpCRjpCRkE6QlVSS0lOQTpNb3UgSG91bjpCYWdhc3NpCisyOkJGOkJGQTpCVVJLSU5BOk1vdSBIb3VuOkJhbmEKKzM6QkY6QkZBOkJVUktJTkE6TW91IEhvdW46Qm9uZG9rdWkKKzQ6QkY6QkZBOkJVUktJTkE6TW91IEhvdW46Qm9yb21vCis1OkJGOkJGQTpCVVJLSU5BOk1vdSBIb3VuOkRlZG91Z291Cis2OkJGOkJGQTpCVVJLSU5BOk1vdSBIb3VuOktvbmEKKzc6QkY6QkZBOkJVUktJTkE6TW91IEhvdW46T3VhcmtveWUKKzg6QkY6QkZBOkJVUktJTkE6TW91IEhvdW46T3VyeQorOTpCRjpCRkE6QlVSS0lOQTpNb3UgSG91bjpQYQorMTA6QkY6QkZBOkJVUktJTkE6TW91IEhvdW46UG91cmEKKzExOkJGOkJGQTpCVVJLSU5BOk1vdSBIb3VuOlNhZmFuZQorMTI6QkY6QkZBOkJVUktJTkE6TW91IEhvdW46VGNoZXJpYmEKKzEzOkJGOkJGQTpCVVJLSU5BOk1vdSBIb3VuOllhaG8KKzE6QkY6QkZBOkJVUktJTkE6T3VkYWxhbjpEZW91CisyOkJGOkJGQTpCVVJLSU5BOk91ZGFsYW46R29yb20tR29yb20KKzM6QkY6QkZBOkJVUktJTkE6T3VkYWxhbjpNYXJrb3llCis0OkJGOkJGQTpCVVJLSU5BOk91ZGFsYW46T3Vyc2kKKzU6QkY6QkZBOkJVUktJTkE6T3VkYWxhbjpUaW4tQWtvZgorMTpCRjpCRkE6QlVSS0lOQTpLZW5lZG91Z291OkRqaWdvdWVyYQorMjpCRjpCRkE6QlVSS0lOQTpLZW5lZG91Z291OktvbG9rbworMzpCRjpCRkE6QlVSS0lOQTpLZW5lZG91Z291OktvdXJvdW1hCis0OkJGOkJGQTpCVVJLSU5BOktlbmVkb3Vnb3U6TW9yb2xhYmEKKzU6QkY6QkZBOkJVUktJTkE6S2VuZWRvdWdvdTpOJ2Rvcm9sYQorNjpCRjpCRkE6QlVSS0lOQTpLZW5lZG91Z291Ok9yb2RhcmEKKzc6QkY6QkZBOkJVUktJTkE6S2VuZWRvdWdvdTpPdWVsZW5pCis4OkJGOkJGQTpCVVJLSU5BOktlbmVkb3Vnb3U6U2Ftb2dob2hpcmkKKzk6QkY6QkZBOkJVUktJTkE6S2VuZWRvdWdvdTpTYW1vcm9nb3VhbgorMTA6QkY6QkZBOkJVUktJTkE6S2VuZWRvdWdvdTpTaW5kb3UKKzE6QkY6QkZBOkJVUktJTkE6U2FuZ3VpZTpEYXNzYQorMjpCRjpCRkE6QlVSS0lOQTpTYW5ndWllOkRpZHlyCiszOkJGOkJGQTpCVVJLSU5BOlNhbmd1aWU6R29keXIKKzQ6QkY6QkZBOkJVUktJTkE6U2FuZ3VpZTpLaHlvbgorNTpCRjpCRkE6QlVSS0lOQTpTYW5ndWllOktvcmRpZQorNjpCRjpCRkE6QlVSS0lOQTpTYW5ndWllOlBvdW5pCis3OkJGOkJGQTpCVVJLSU5BOlNhbmd1aWU6UmVvCis4OkJGOkJGQTpCVVJLSU5BOlNhbmd1aWU6VGVuYWRvCis5OkJGOkJGQTpCVVJLSU5BOlNhbmd1aWU6WmF3YXJhCisxOkJGOkJGQTpCVVJLSU5BOlRhcG9hOkJvdG91CisyOkJGOkJGQTpCVVJLSU5BOlRhcG9hOkRpYXBhZ2EKKzM6QkY6QkZBOkJVUktJTkE6VGFwb2E6S2FudGNoYXJpCis0OkJGOkJGQTpCVVJLSU5BOlRhcG9hOkxvZ29ib3UKKzU6QkY6QkZBOkJVUktJTkE6VGFwb2E6TmFtb3Vub3UKKzY6QkY6QkZBOkJVUktJTkE6VGFwb2E6UGFydGlhZ2EKKzc6QkY6QkZBOkJVUktJTkE6VGFwb2E6VGFtYmFnYQorODpCRjpCRkE6QlVSS0lOQTpUYXBvYTpUYW5zYXJnYQorMTpCRjpCRkE6QlVSS0lOQTpIb3VldDpCYWRlbWEKKzI6QkY6QkZBOkJVUktJTkE6SG91ZXQ6QmFtYQorMzpCRjpCRkE6QlVSS0lOQTpIb3VldDpCZWt1eQorNDpCRjpCRkE6QlVSS0lOQTpIb3VldDpCZXJlYmEKKzU6QkY6QkZBOkJVUktJTkE6SG91ZXQ6Qm9iby1EaW91bGFzc28KKzY6QkY6QkZBOkJVUktJTkE6SG91ZXQ6Rm8KKzc6QkY6QkZBOkJVUktJTkE6SG91ZXQ6SG91bmRlCis4OkJGOkJGQTpCVVJLSU5BOkhvdWV0OkthcmFua2Fzc28tVmlndWUKKzk6QkY6QkZBOkJVUktJTkE6SG91ZXQ6S291bWJpYQorMTA6QkY6QkZBOkJVUktJTkE6SG91ZXQ6S291cmlnbm9uCisxMTpCRjpCRkE6QlVSS0lOQTpIb3VldDpMZW5hCisxMjpCRjpCRkE6QlVSS0lOQTpIb3VldDpQZW5pCisxMzpCRjpCRkE6QlVSS0lOQTpIb3VldDpTYXRpcmkKKzE0OkJGOkJGQTpCVVJLSU5BOkhvdWV0OlRvdXNzaWFuYQorMTpCRjpCRkE6QlVSS0lOQTpHbmFnbmE6QmlsYW5nYQorMjpCRjpCRkE6QlVSS0lOQTpHbmFnbmE6Qm9nYW5kZQorMzpCRjpCRkE6QlVSS0lOQTpHbmFnbmE6S29hbGxhCis0OkJGOkJGQTpCVVJLSU5BOkduYWduYTpMaXB0b3Vnb3UKKzU6QkY6QkZBOkJVUktJTkE6R25hZ25hOk1hbm5pCis2OkJGOkJGQTpCVVJLSU5BOkduYWduYTpQaWVsYQorNzpCRjpCRkE6QlVSS0lOQTpHbmFnbmE6VGhpb24KKzE6QkY6QkZBOkJVUktJTkE6QmF6ZWdhOkRvdWxvdWdvdQorMjpCRjpCRkE6QlVSS0lOQTpCYXplZ2E6SXBlbGNlCiszOkJGOkJGQTpCVVJLSU5BOkJhemVnYTpLYXlhbworNDpCRjpCRkE6QlVSS0lOQTpCYXplZ2E6S29tYmlzc2lyaQorNTpCRjpCRkE6QlVSS0lOQTpCYXplZ2E6S29tc2lsZ2EKKzY6QkY6QkZBOkJVUktJTkE6QmF6ZWdhOktvbmtpLUlwYWxhCis3OkJGOkJGQTpCVVJLSU5BOkJhemVnYTpLb3VicmkKKzg6QkY6QkZBOkJVUktJTkE6QmF6ZWdhOlNhcG9uZQorOTpCRjpCRkE6QlVSS0lOQTpCYXplZ2E6VGFuZ2hpbi1EYXNzb3VyaQorMTA6QkY6QkZBOkJVUktJTkE6QmF6ZWdhOlRvZWNlCisxOkJGOkJGQTpCVVJLSU5BOkJhbTpCb3VyemFuZ2EKKzI6QkY6QkZBOkJVUktJTkE6QmFtOkd1aWJhcmUKKzM6QkY6QkZBOkJVUktJTkE6QmFtOktvbmdvdXNzaQorNDpCRjpCRkE6QlVSS0lOQTpCYW06Um9sbG8KKzU6QkY6QkZBOkJVUktJTkE6QmFtOlNhYmNlCis2OkJGOkJGQTpCVVJLSU5BOkJhbTpUaWthcmUKKzE6QkY6QkZBOkJVUktJTkE6UG9uaTpCYXRpZQorMjpCRjpCRkE6QlVSS0lOQTpQb25pOkJvdXJvdW0tQm91cm91bQorMzpCRjpCRkE6QlVSS0lOQTpQb25pOkRqaWdvdWUKKzQ6QkY6QkZBOkJVUktJTkE6UG9uaTpHYW91YQorNTpCRjpCRkE6QlVSS0lOQTpQb25pOkdib21ibG9yYQorNjpCRjpCRkE6QlVSS0lOQTpQb25pOkthbXB0aQorNzpCRjpCRkE6QlVSS0lOQTpQb25pOktwdWVyZQorODpCRjpCRkE6QlVSS0lOQTpQb25pOkxlZ21vaW4KKzk6QkY6QkZBOkJVUktJTkE6UG9uaTpNYWxiYQorMTA6QkY6QkZBOkJVUktJTkE6UG9uaTpNaWRlYmRvCisxMTpCRjpCRkE6QlVSS0lOQTpQb25pOk5ha28KKzEyOkJGOkJGQTpCVVJLSU5BOlBvbmk6UGVyaWdiYW4KKzE6QkY6QkZBOkJVUktJTkE6U2VubzpCYW5pCisyOkJGOkJGQTpCVVJLSU5BOlNlbm86RG9yaQorMzpCRjpCRkE6QlVSS0lOQTpTZW5vOkZhbGFnb3VudG91Cis0OkJGOkJGQTpCVVJLSU5BOlNlbm86R29yZ2FkamkKKzU6QkY6QkZBOkJVUktJTkE6U2VubzpTYW1wZWxnYQorNjpCRjpCRkE6QlVSS0lOQTpTZW5vOlNlYmJhCis3OkJGOkJGQTpCVVJLSU5BOlNlbm86U2V5dGVuZ2EKKzE6QkY6QkZBOkJVUktJTkE6Q29tb2U6QmFuZm9yYQorMjpCRjpCRkE6QlVSS0lOQTpDb21vZTpCZXJlZ2Fkb3Vnb3UKKzM6QkY6QkZBOkJVUktJTkE6Q29tb2U6RGFrb3JvCis0OkJGOkJGQTpCVVJLSU5BOkNvbW9lOkRvdW5hCis1OkJGOkJGQTpCVVJLSU5BOkNvbW9lOkthbmthbGFiYQorNjpCRjpCRkE6QlVSS0lOQTpDb21vZTpMb3JvcGVuaQorNzpCRjpCRkE6QlVSS0lOQTpDb21vZTpMb3VtYW5hCis4OkJGOkJGQTpCVVJLSU5BOkNvbW9lOk1hbmdvZGFyYQorOTpCRjpCRkE6QlVSS0lOQTpDb21vZTpNb3Vzc29kb3Vnb3UKKzEwOkJGOkJGQTpCVVJLSU5BOkNvbW9lOk5pYW5nb2xva28KKzExOkJGOkJGQTpCVVJLSU5BOkNvbW9lOk5pYW5rb3JvZG91Z291CisxMjpCRjpCRkE6QlVSS0lOQTpDb21vZTpPdW8KKzEzOkJGOkJGQTpCVVJLSU5BOkNvbW9lOlNpZGVyYWRvdWdvdQorMTQ6QkY6QkZBOkJVUktJTkE6Q29tb2U6U2luZG91CisxNTpCRjpCRkE6QlVSS0lOQTpDb21vZTpTb3ViYWthbmllZG91Z291CisxNjpCRjpCRkE6QlVSS0lOQTpDb21vZTpUaWVmb3JhCisxNzpCRjpCRkE6QlVSS0lOQTpDb21vZTpXb2xvbmtvdG8KKzE6QkY6QkZBOkJVUktJTkE6WWF0ZW5nYTpCYW5oCisyOkJGOkJGQTpCVVJLSU5BOllhdGVuZ2E6QmFzc2kKKzM6QkY6QkZBOkJVUktJTkE6WWF0ZW5nYTpCb3Vzc291Cis0OkJGOkJGQTpCVVJLSU5BOllhdGVuZ2E6R291cmN5Cis1OkJGOkJGQTpCVVJLSU5BOllhdGVuZ2E6S2FpbgorNjpCRjpCRkE6QlVSS0lOQTpZYXRlbmdhOkthbHNha2EKKzc6QkY6QkZBOkJVUktJTkE6WWF0ZW5nYTpLb3VtYnJpCis4OkJGOkJGQTpCVVJLSU5BOllhdGVuZ2E6TmFtaXNzaWd1aW1hCis5OkJGOkJGQTpCVVJLSU5BOllhdGVuZ2E6T3VhaGlnb3V5YQorMTA6QkY6QkZBOkJVUktJTkE6WWF0ZW5nYTpPdWluZGlndWkKKzExOkJGOkJGQTpCVVJLSU5BOllhdGVuZ2E6T3VsYQorMTI6QkY6QkZBOkJVUktJTkE6WWF0ZW5nYTpSYW1ibworMTM6QkY6QkZBOkJVUktJTkE6WWF0ZW5nYTpTZWd1ZW5lZ2EKKzE0OkJGOkJGQTpCVVJLSU5BOllhdGVuZ2E6U29sbGUKKzE1OkJGOkJGQTpCVVJLSU5BOllhdGVuZ2E6VGFuZ2F5ZQorMTY6QkY6QkZBOkJVUktJTkE6WWF0ZW5nYTpUaGlvdQorMTc6QkY6QkZBOkJVUktJTkE6WWF0ZW5nYTpUaXRhbworMTg6QkY6QkZBOkJVUktJTkE6WWF0ZW5nYTpUb3VnbworMTk6QkY6QkZBOkJVUktJTkE6WWF0ZW5nYTpab2dvcmUKKzE6QkY6QkZBOkJVUktJTkE6UGFzc29yZTpBcmJvbGxlCisyOkJGOkJGQTpCVVJLSU5BOlBhc3NvcmU6QmFnYXJlCiszOkJGOkJGQTpCVVJLSU5BOlBhc3NvcmU6Qm9raW4KKzQ6QkY6QkZBOkJVUktJTkE6UGFzc29yZTpHb21wb25zb20KKzU6QkY6QkZBOkJVUktJTkE6UGFzc29yZTpLaXJzaQorNjpCRjpCRkE6QlVSS0lOQTpQYXNzb3JlOkxhLVRvZGluCis3OkJGOkJGQTpCVVJLSU5BOlBhc3NvcmU6UGlsaW1waWtvdQorODpCRjpCRkE6QlVSS0lOQTpQYXNzb3JlOlNhbWJhCis5OkJGOkJGQTpCVVJLSU5BOlBhc3NvcmU6WWFrbworMTpCRjpCRkE6QlVSS0lOQTpLYWRpb2dvOkthZGlvZ28KKzE6QkY6QkZBOkJVUktJTkE6Qm91bGtpZW1kZTpCaW5nbworMjpCRjpCRkE6QlVSS0lOQTpCb3Vsa2llbWRlOkltYXNnaG8KKzM6QkY6QkZBOkJVUktJTkE6Qm91bGtpZW1kZTpLaW5kaQorNDpCRjpCRkE6QlVSS0lOQTpCb3Vsa2llbWRlOktva29sb2dobworNTpCRjpCRkE6QlVSS0lOQTpCb3Vsa2llbWRlOktvdWRvdWdvdQorNjpCRjpCRkE6QlVSS0lOQTpCb3Vsa2llbWRlOk5hbm9ybworNzpCRjpCRkE6QlVSS0lOQTpCb3Vsa2llbWRlOlBlbGxhCis4OkJGOkJGQTpCVVJLSU5BOkJvdWxraWVtZGU6UG9hCis5OkJGOkJGQTpCVVJLSU5BOkJvdWxraWVtZGU6UmFtb25nbworMTA6QkY6QkZBOkJVUktJTkE6Qm91bGtpZW1kZTpTYWJvdQorMTE6QkY6QkZBOkJVUktJTkE6Qm91bGtpZW1kZTpTaWdsZQorMTI6QkY6QkZBOkJVUktJTkE6Qm91bGtpZW1kZTpTb3VyZ291CisxMzpCRjpCRkE6QlVSS0lOQTpCb3Vsa2llbWRlOlRoeW91CisxOkJGOkJGQTpCVVJLSU5BOkdhbnpvdXJnb3U6Qm91ZHJ5CisyOkJGOkJGQTpCVVJLSU5BOkdhbnpvdXJnb3U6S29naG8KKzM6QkY6QkZBOkJVUktJTkE6R2Fuem91cmdvdTpNZWd1ZXQKKzQ6QkY6QkZBOkJVUktJTkE6R2Fuem91cmdvdTpNb2d0ZWRvCis1OkJGOkJGQTpCVVJLSU5BOkdhbnpvdXJnb3U6WmFtCis2OkJGOkJGQTpCVVJLSU5BOkdhbnpvdXJnb3U6Wm9yZ2hvCis3OkJGOkJGQTpCVVJLSU5BOkdhbnpvdXJnb3U6Wm91bmdvdQorMTpCRjpCRkE6QlVSS0lOQTpTaXNzaWxpOkJpZWhhCisyOkJGOkJGQTpCVVJLSU5BOlNpc3NpbGk6Qm91Z25vdW5vdQorMzpCRjpCRkE6QlVSS0lOQTpTaXNzaWxpOkJvdXJhCis0OkJGOkJGQTpCVVJLSU5BOlNpc3NpbGk6Q2Fzc291Cis1OkJGOkJGQTpCVVJLSU5BOlNpc3NpbGk6RmFyYQorNjpCRjpCRkE6QlVSS0lOQTpTaXNzaWxpOkxlbworNzpCRjpCRkE6QlVSS0lOQTpTaXNzaWxpOk5lYmllbGlhbmF5b3UKKzg6QkY6QkZBOkJVUktJTkE6U2lzc2lsaTpOaWFib3VyaQorOTpCRjpCRkE6QlVSS0lOQTpTaXNzaWxpOk5pZWdvCisxMDpCRjpCRkE6QlVSS0lOQTpTaXNzaWxpOk91ZXNzYQorMTE6QkY6QkZBOkJVUktJTkE6U2lzc2lsaTpTYXBvdXkKKzEyOkJGOkJGQTpCVVJLSU5BOlNpc3NpbGk6U2lsbHkKKzEzOkJGOkJGQTpCVVJLSU5BOlNpc3NpbGk6VG8KKzE6QkY6QkZBOkJVUktJTkE6Wm91bmR3ZW9nbzpCZXJlCisyOkJGOkJGQTpCVVJLSU5BOlpvdW5kd2VvZ286QmluZGUKKzM6QkY6QkZBOkJVUktJTkE6Wm91bmR3ZW9nbzpHb2dvCis0OkJGOkJGQTpCVVJLSU5BOlpvdW5kd2VvZ286R29tYm91c3NvdWdvdQorNTpCRjpCRkE6QlVSS0lOQTpab3VuZHdlb2dvOkd1aWJhCis2OkJGOkJGQTpCVVJLSU5BOlpvdW5kd2VvZ286TWFuZ2EKKzc6QkY6QkZBOkJVUktJTkE6Wm91bmR3ZW9nbzpOb2JlcmUKKzE6QkY6QkZBOkJVUktJTkE6Qm91Z291cmliYTpEYW5vCisyOkJGOkJGQTpCVVJLSU5BOkJvdWdvdXJpYmE6RGllYm91Z291CiszOkJGOkJGQTpCVVJLSU5BOkJvdWdvdXJpYmE6RGlzc2luCis0OkJGOkJGQTpCVVJLSU5BOkJvdWdvdXJpYmE6RG9sbworNTpCRjpCRkE6QlVSS0lOQTpCb3Vnb3VyaWJhOkZvdW56YW4KKzY6QkY6QkZBOkJVUktJTkE6Qm91Z291cmliYTpHdWVndWVyZQorNzpCRjpCRkE6QlVSS0lOQTpCb3Vnb3VyaWJhOktvcGVyCis4OkJGOkJGQTpCVVJLSU5BOkJvdWdvdXJpYmE6S290aQorOTpCRjpCRkE6QlVSS0lOQTpCb3Vnb3VyaWJhOk9yb25rdWEKKzEwOkJGOkJGQTpCVVJLSU5BOkJvdWdvdXJpYmE6VGlhbmtvdXJhCisxMTpCRjpCRkE6QlVSS0lOQTpCb3Vnb3VyaWJhOlphbWJvCisxOkJGOkJGQTpCVVJLSU5BOktvdXJpdGVuZ2E6QW5kZW10ZW5nYQorMjpCRjpCRkE6QlVSS0lOQTpLb3VyaXRlbmdhOkJhc2tvdXJlCiszOkJGOkJGQTpCVVJLSU5BOktvdXJpdGVuZ2E6RGlhbGdheWUKKzQ6QkY6QkZBOkJVUktJTkE6S291cml0ZW5nYTpHb3VuZ2hpbgorNTpCRjpCRkE6QlVSS0lOQTpLb3VyaXRlbmdhOktvdXBlbGEKKzY6QkY6QkZBOkJVUktJTkE6S291cml0ZW5nYTpQb3V5dGVuZ2EKKzc6QkY6QkZBOkJVUktJTkE6S291cml0ZW5nYTpUZW5zb2J0ZW5nYQorODpCRjpCRkE6QlVSS0lOQTpLb3VyaXRlbmdhOllhcmdvCisxOkJGOkJGQTpCVVJLSU5BOkJvdWxnb3U6QmFuZQorMjpCRjpCRkE6QlVSS0lOQTpCb3VsZ291OkJlZ3VlZG8KKzM6QkY6QkZBOkJVUktJTkE6Qm91bGdvdTpCaXR0b3UKKzQ6QkY6QkZBOkJVUktJTkE6Qm91bGdvdTpEb3VydGVuZ2EKKzU6QkY6QkZBOkJVUktJTkE6Qm91bGdvdTpHYXJhbmdvCis2OkJGOkJGQTpCVVJLSU5BOkJvdWxnb3U6S29tdG9lZ2EKKzc6QkY6QkZBOkJVUktJTkE6Qm91bGdvdTpMYWxnYXllCis4OkJGOkJGQTpCVVJLSU5BOkJvdWxnb3U6TmlhZ2hvCis5OkJGOkJGQTpCVVJLSU5BOkJvdWxnb3U6T3VhcmdheWUKKzEwOkJGOkJGQTpCVVJLSU5BOkJvdWxnb3U6U2FuZ2hhCisxMTpCRjpCRkE6QlVSS0lOQTpCb3VsZ291OlRlbmtvZG9nbworMTI6QkY6QkZBOkJVUktJTkE6Qm91bGdvdTpZYXJnYXRlbmdhCisxMzpCRjpCRkE6QlVSS0lOQTpCb3VsZ291OlphYnJlCisxOkJGOkJGQTpCVVJLSU5BOlNvdXJvdTpEaQorMjpCRjpCRkE6QlVSS0lOQTpTb3Vyb3U6R2Fzc2FuCiszOkJGOkJGQTpCVVJLSU5BOlNvdXJvdTpHb21ib3JvCis0OkJGOkJGQTpCVVJLSU5BOlNvdXJvdTpHb3NzaW5hCis1OkJGOkJGQTpCVVJLSU5BOlNvdXJvdTpLYXNzb3VtCis2OkJGOkJGQTpCVVJLSU5BOlNvdXJvdTpLaWVtYmFyYQorNzpCRjpCRkE6QlVSS0lOQTpTb3Vyb3U6S291Z255Cis4OkJGOkJGQTpCVVJLSU5BOlNvdXJvdTpMYW5maWVyYQorOTpCRjpCRkE6QlVSS0lOQTpTb3Vyb3U6TGFua291ZQorMTA6QkY6QkZBOkJVUktJTkE6U291cm91OlRvZW5pCisxMTpCRjpCRkE6QlVSS0lOQTpTb3Vyb3U6VG9tYQorMTI6QkY6QkZBOkJVUktJTkE6U291cm91OlRvdWdhbgorMTM6QkY6QkZBOkJVUktJTkE6U291cm91OllhYmEKKzE0OkJGOkJGQTpCVVJLSU5BOlNvdXJvdTpZZQorMTpCRjpCRkE6QlVSS0lOQTpOYW1lbnRlbmdhOkJvdWxzYQorMjpCRjpCRkE6QlVSS0lOQTpOYW1lbnRlbmdhOkJvdXJvdW0KKzM6QkY6QkZBOkJVUktJTkE6TmFtZW50ZW5nYTpEYXJnbworNDpCRjpCRkE6QlVSS0lOQTpOYW1lbnRlbmdhOkthbmRvCis1OkJGOkJGQTpCVVJLSU5BOk5hbWVudGVuZ2E6VG91Z291cmkKKzY6QkY6QkZBOkJVUktJTkE6TmFtZW50ZW5nYTpZYWxnbworNzpCRjpCRkE6QlVSS0lOQTpOYW1lbnRlbmdhOlplZ3VlZGVndWluCisxOkJGOkJGQTpCVVJLSU5BOlNhbm1hdGVuZ2E6QmFyc2Fsb2dobworMjpCRjpCRkE6QlVSS0lOQTpTYW5tYXRlbmdhOkJvdXNzb3VtYQorMzpCRjpCRkE6QlVSS0lOQTpTYW5tYXRlbmdhOkRhYmxvCis0OkJGOkJGQTpCVVJLSU5BOlNhbm1hdGVuZ2E6S2F5YQorNTpCRjpCRkE6QlVSS0lOQTpTYW5tYXRlbmdhOktvcnNpbW9ybworNjpCRjpCRkE6QlVSS0lOQTpTYW5tYXRlbmdhOk1hbmUKKzc6QkY6QkZBOkJVUktJTkE6U2FubWF0ZW5nYTpOYW1pc3NpZ3VpbWEKKzg6QkY6QkZBOkJVUktJTkE6U2FubWF0ZW5nYTpQZW5zYQorOTpCRjpCRkE6QlVSS0lOQTpTYW5tYXRlbmdhOlBpYmFvcmUKKzEwOkJGOkJGQTpCVVJLSU5BOlNhbm1hdGVuZ2E6UGlzc2lsYQorMTE6QkY6QkZBOkJVUktJTkE6U2FubWF0ZW5nYTpaaWdhCisxOkJGOkJGQTpCVVJLSU5BOktvc3NpOkJhbGF2ZQorMjpCRjpCRkE6QlVSS0lOQTpLb3NzaTpCYXJhbmkKKzM6QkY6QkZBOkJVUktJTkE6S29zc2k6Qm9tYm9yb2t1aQorNDpCRjpCRkE6QlVSS0lOQTpLb3NzaTpEamliYXNzbworNTpCRjpCRkE6QlVSS0lOQTpLb3NzaTpEb2t1aQorNjpCRjpCRkE6QlVSS0lOQTpLb3NzaTpEb3VtYmFsYQorNzpCRjpCRkE6QlVSS0lOQTpLb3NzaTpLb21ib3JpCis4OkJGOkJGQTpCVVJLSU5BOktvc3NpOktvdWthCis5OkJGOkJGQTpCVVJLSU5BOktvc3NpOk1hZG91YmEKKzEwOkJGOkJGQTpCVVJLSU5BOktvc3NpOk5vdW5hCisxMTpCRjpCRkE6QlVSS0lOQTpLb3NzaTpTYW1pCisxMjpCRjpCRkE6QlVSS0lOQTpLb3NzaTpTYW5hYmEKKzEzOkJGOkJGQTpCVVJLSU5BOktvc3NpOlNvbGVuem8KKzE0OkJGOkJGQTpCVVJLSU5BOktvc3NpOlRhbnNpbGEKKzE6QkY6QkZBOkJVUktJTkE6T3Vicml0ZW5nYTpBYnNvdXlhCisyOkJGOkJGQTpCVVJLSU5BOk91YnJpdGVuZ2E6Qm91c3NlCiszOkJGOkJGQTpCVVJLSU5BOk91YnJpdGVuZ2E6RGFwZWxnbworNDpCRjpCRkE6QlVSS0lOQTpPdWJyaXRlbmdhOkxheWUKKzU6QkY6QkZBOkJVUktJTkE6T3Vicml0ZW5nYTpMb3VtYmlsYQorNjpCRjpCRkE6QlVSS0lOQTpPdWJyaXRlbmdhOk5pb3UKKzc6QkY6QkZBOkJVUktJTkE6T3Vicml0ZW5nYTpQYWJyZQorODpCRjpCRkE6QlVSS0lOQTpPdWJyaXRlbmdhOlNhYWJhCis5OkJGOkJGQTpCVVJLSU5BOk91YnJpdGVuZ2E6U291cmdvdWJpbGEKKzEwOkJGOkJGQTpCVVJLSU5BOk91YnJpdGVuZ2E6VG9lZ2hpbgorMTE6QkY6QkZBOkJVUktJTkE6T3Vicml0ZW5nYTpaaW5pYXJlCisxMjpCRjpCRkE6QlVSS0lOQTpPdWJyaXRlbmdhOlppdGVuZ2EKKzE6QkY6QkZBOkJVUktJTkE6TmFob3VyaTpHbmlhcm8KKzI6QkY6QkZBOkJVUktJTkE6TmFob3VyaTpQbworMzpCRjpCRkE6QlVSS0lOQTpOYWhvdXJpOlRpZWJlbGUKKzQ6QkY6QkZBOkJVUktJTkE6TmFob3VyaTpaZWNjbworNTpCRjpCRkE6QlVSS0lOQTpOYWhvdXJpOlppb3UKKzE6QkY6QkZBOkJVUktJTkE6U291bTpBcmliaW5kYQorMjpCRjpCRkE6QlVSS0lOQTpTb3VtOkJhcmFib3VsZQorMzpCRjpCRkE6QlVSS0lOQTpTb3VtOkRpZ3VlbAorNDpCRjpCRkE6QlVSS0lOQTpTb3VtOkRqaWJvCis1OkJGOkJGQTpCVVJLSU5BOlNvdW06S291dG91Z291Cis2OkJGOkJGQTpCVVJLSU5BOlNvdW06TmFzc2FtZm91Cis3OkJGOkJGQTpCVVJLSU5BOlNvdW06UG9iZS1NZW5nYW8KKzg6QkY6QkZBOkJVUktJTkE6U291bTpUb25nb21heWVsCisxOkJGOkJGQTpCVVJLSU5BOkdvdXJtYTpDb21pbi1ZYW5nYQorMjpCRjpCRkE6QlVSS0lOQTpHb3VybWE6RGlhYm8KKzM6QkY6QkZBOkJVUktJTkE6R291cm1hOkRpYXBhbmdvdQorNDpCRjpCRkE6QlVSS0lOQTpHb3VybWE6RmFkYSBOJ2dvdXJtYQorNTpCRjpCRkE6QlVSS0lOQTpHb3VybWE6R2F5ZXJpCis2OkJGOkJGQTpCVVJLSU5BOkdvdXJtYTpNYXRpYWNvYWxpCis3OkJGOkJGQTpCVVJLSU5BOkdvdXJtYTpQYW1hCis4OkJGOkJGQTpCVVJLSU5BOkdvdXJtYTpTb3Vkb3VndWkKKzk6QkY6QkZBOkJVUktJTkE6R291cm1hOlRpYmdhCisxMDpCRjpCRkE6QlVSS0lOQTpHb3VybWE6WWFtYmEKKzExOkJGOkJGQTpCVVJLSU5BOkdvdXJtYTpZb25kZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CR0QvQkdEX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CR0QvQkdEX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZDYwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JHRC9CR0RfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSw1OCBAQAorMTpCRC0wNTpCRDpCQUdFUkhBVCBaSUxBCisyOkJELTAyOkJEOkJBUkdVTkEgWklMQQorMzpCRC0wNjpCRDpCQVJJU0FMIERJVgorNDpCRC0wNzpCRDpCSE9MQSBaSUxBCis1OkJELTAzOkJEOkJPR1JBIFpJTEEKKzY6QkQtMDQ6QkQ6QlJBSE1BTkJBUklBIFpJTEEKKzc6QkQtMDk6QkQ6Q0hBTkRQVVIgWklMQQorODpCRC0wOkJEOkNISVRUQUdPTkcgRElWCis5OkJELTI6QkQ6Q0hVQURBTkdBIFpJTEEKKzEwOkJELTA4OkJEOkNPTUlMTEEgWklMQQorMTE6QkQtMTA6QkQ6Q09YUyBCQVpBUiBaSUxBCisxMjpCRC0zOkJEOkRIQUtBIERJVgorMTM6QkQtNDpCRDpESU5BSlBVUiBaSUxBCisxNDpCRC01OkJEOkZBUklEUFVSIFpJTEEKKzE1OkJELTY6QkQ6RkVOSSBaSUxBCisxNjpCRC05OkJEOkdBSUJBTkRIQSBaSUxBCisxNzpCRC04OkJEOkdBWklQVVIgWklMQQorMTg6QkQtNzpCRDpHT1BBTEdBTkogWklMQQorMTk6QkQtMjA6QkQ6SEFCSUdBTkogWklMQQorMjA6QkQtMjQ6QkQ6SkFJUFVSSEFUIFpJTEEKKzIxOkJELTIyOkJEOkpFU1NPUkUgWklMQQorMjI6QkQtMjU6QkQ6SkhBTEFLQVRJIFpJTEEKKzIzOkJELTIzOkJEOkpIRU5BSURBSCBaSUxBCisyNDpCRC0yOTpCRDpLSEFHUkFDSEFSSSBaSUxBCisyNTpCRC0yNzpCRDpLSFVMTkEgRElWCisyNjpCRC0yNjpCRDpLSVNIT1JFR0FOSiBaSUxBCisyNzpCRC0yODpCRDpLVVJJR1JBTSBaSUxBCisyODpCRC0zMDpCRDpLVVNIVElBIFpJTEEKKzI5OkJELTMyOkJEOkxBTE1PTklSSEFUIFpJTEEKKzMwOkJELTM2OkJEOk1BREFSSVBVUiBaSUxBCiszMTpCRC0zNzpCRDpNQUdVUkEgWklMQQorMzI6QkQtMzM6QkQ6TUFOSUtHQU5KIFpJTEEKKzMzOkJELTM5OkJEOk1FSEVSUFVSIFpJTEEKKzM0OkJELTM4OkJEOk1PVUxWSUJBWkFSIFpJTEEKKzM1OkJELTM1OkJEOk1VTlNISUdBTkogWklMQQorMzY6QkQtMzQ6QkQ6TVlNRU5TSU5HSCBaSUxBCiszNzpCRC00ODpCRDpOQU9HQU9OIFpJTEEKKzM4OkJELTQzOkJEOk5BUkFJTCBaSUxBCiszOTpCRC00MDpCRDpOQVJBWUFOR0FOSiBaSUxBCis0MDpCRC00MjpCRDpOQVJTSU5HREkgWklMQQorNDE6QkQtNDQ6QkQ6TkFUT1JFIFpJTEEKKzQyOkJELTQ1OkJEOk5BV0FCR0FOSiBaSUxBCis0MzpCRC00NjpCRDpOSUxQSEFNQVJJIFpJTEEKKzQ0OkJELTQ3OkJEOk5PQUtIQUxJIFpJTEEKKzQ1OkJELTQ5OkJEOlBBQk5BIFpJTEEKKzQ2OkJELTUyOkJEOlBBTkNIQUdBUkggWklMQQorNDc6QkQtNTA6QkQ6UElST0pQVVIgWklMQQorNDg6QkQtNTM6QkQ6UkFKQkFSSSBaSUxBCis0OTpCRC01NDpCRDpSQUpTSEFISSBESVYKKzUwOkJELTU2OkJEOlJBTkdBTUFUSSBaSUxBCis1MTpCRC01NTpCRDpSQU5HUFVSIFpJTEEKKzUyOkJELTU4OkJEOlNBVEtISVJBIFpJTEEKKzUzOkJELTYyOkJEOlNIQVJJQVRQVVIgWklMQQorNTQ6QkQtNTc6QkQ6U0hFUlBVUiBaSUxBCis1NTpCRC01OTpCRDpTSVJBSkdBTkogWklMQQorNTY6QkQtNjA6QkQ6U1lMSEVUIFpJTEEKKzU3OkJELTYzOkJEOlRBTkdBSUwgWklMQQorNTg6QkQtNjQ6QkQ6VEhBS1VSR0FPTiBaSUxBCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JHRC9CR0RfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JHRC9CR0RfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmNDIyOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQkdEL0JHRF9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDY0IEBACisxOkJEOkJHRDpCQU5HTEFERVNIOkRoYWthIERpdjpEaGFrYSBaaWxhCisyOkJEOkJHRDpCQU5HTEFERVNIOkRoYWthIERpdjpGYXJpZHB1ciBabAorMzpCRDpCR0Q6QkFOR0xBREVTSDpEaGFrYSBEaXY6R2F6aXB1ciBabAorNDpCRDpCR0Q6QkFOR0xBREVTSDpEaGFrYSBEaXY6R29wYWxnYW5qIFpsCis1OkJEOkJHRDpCQU5HTEFERVNIOkRoYWthIERpdjpKYW1hbHB1ciBabAorNjpCRDpCR0Q6QkFOR0xBREVTSDpEaGFrYSBEaXY6S2lzaG9yZWdhbmogWmwKKzc6QkQ6QkdEOkJBTkdMQURFU0g6RGhha2EgRGl2Ok1hZGFyaXB1ciBabAorODpCRDpCR0Q6QkFOR0xBREVTSDpEaGFrYSBEaXY6TWFuaWtnYW5qIFpsCis5OkJEOkJHRDpCQU5HTEFERVNIOkRoYWthIERpdjpNdW5zaGlnYW5qIFpsCisxMDpCRDpCR0Q6QkFOR0xBREVTSDpEaGFrYSBEaXY6TXltZW5zaW5naCBabAorMTE6QkQ6QkdEOkJBTkdMQURFU0g6RGhha2EgRGl2Ok5hcmF5YW5nYW5qIFpsCisxMjpCRDpCR0Q6QkFOR0xBREVTSDpEaGFrYSBEaXY6TmFyc2luZ2RpIFpsCisxMzpCRDpCR0Q6QkFOR0xBREVTSDpEaGFrYSBEaXY6TmV0cm9rb25hIFpsCisxNDpCRDpCR0Q6QkFOR0xBREVTSDpEaGFrYSBEaXY6UmFqYmFyaSBabAorMTU6QkQ6QkdEOkJBTkdMQURFU0g6RGhha2EgRGl2OlNoYXJpYXRwdXIgWmwKKzE2OkJEOkJHRDpCQU5HTEFERVNIOkRoYWthIERpdjpTaGVycHVyIFpsCisxNzpCRDpCR0Q6QkFOR0xBREVTSDpEaGFrYSBEaXY6VGFuZ2FpbCBabAorMTpCRDpCR0Q6QkFOR0xBREVTSDpDaGl0dGFnb25nIERpdjpCYW5kYXJiYW4gWmwKKzI6QkQ6QkdEOkJBTkdMQURFU0g6Q2hpdHRhZ29uZyBEaXY6QnJhaG1hbmJhcmlhIFpsCiszOkJEOkJHRDpCQU5HTEFERVNIOkNoaXR0YWdvbmcgRGl2OkNoYW5kcHVyIFpsCis0OkJEOkJHRDpCQU5HTEFERVNIOkNoaXR0YWdvbmcgRGl2OkNoaXR0YWdvbmcgWmwKKzU6QkQ6QkdEOkJBTkdMQURFU0g6Q2hpdHRhZ29uZyBEaXY6Q29taWxsYSBabAorNjpCRDpCR0Q6QkFOR0xBREVTSDpDaGl0dGFnb25nIERpdjpDb3ggQmF6YXIgWmwKKzc6QkQ6QkdEOkJBTkdMQURFU0g6Q2hpdHRhZ29uZyBEaXY6RmVuaSBabAorODpCRDpCR0Q6QkFOR0xBREVTSDpDaGl0dGFnb25nIERpdjpIYWJpZ2FuaiBabAorOTpCRDpCR0Q6QkFOR0xBREVTSDpDaGl0dGFnb25nIERpdjpLaGFncmFjaGhhcmkgWmwKKzEwOkJEOkJHRDpCQU5HTEFERVNIOkNoaXR0YWdvbmcgRGl2Okxha3NobWlwdXIgWmwKKzExOkJEOkJHRDpCQU5HTEFERVNIOkNoaXR0YWdvbmcgRGl2Ok1hdWx2aWJhemFyIFpsCisxMjpCRDpCR0Q6QkFOR0xBREVTSDpDaGl0dGFnb25nIERpdjpOb2FraGFsaSBabAorMTM6QkQ6QkdEOkJBTkdMQURFU0g6Q2hpdHRhZ29uZyBEaXY6UmFuZ2FtYXRpIFpsCisxNDpCRDpCR0Q6QkFOR0xBREVTSDpDaGl0dGFnb25nIERpdjpTdW5hbWdhbmogWmwKKzE1OkJEOkJHRDpCQU5HTEFERVNIOkNoaXR0YWdvbmcgRGl2OlN5bGhldCBabAorMTpCRDpCR0Q6QkFOR0xBREVTSDpSYWpzaGFoaSBEaXY6Qm9ncmEgWmwKKzI6QkQ6QkdEOkJBTkdMQURFU0g6UmFqc2hhaGkgRGl2OkRpbmFqcHVyIFpsCiszOkJEOkJHRDpCQU5HTEFERVNIOlJhanNoYWhpIERpdjpHYWliYW5kaGEgWmwKKzQ6QkQ6QkdEOkJBTkdMQURFU0g6UmFqc2hhaGkgRGl2OkpveXB1cmhhdCBabAorNTpCRDpCR0Q6QkFOR0xBREVTSDpSYWpzaGFoaSBEaXY6S3VyaWdyYW0gWmwKKzY6QkQ6QkdEOkJBTkdMQURFU0g6UmFqc2hhaGkgRGl2OkxhbG1vbmlyaGF0IFpsCis3OkJEOkJHRDpCQU5HTEFERVNIOlJhanNoYWhpIERpdjpOYW9nYW9uIFpsCis4OkJEOkJHRDpCQU5HTEFERVNIOlJhanNoYWhpIERpdjpOYXRvcmUgWmwKKzk6QkQ6QkdEOkJBTkdMQURFU0g6UmFqc2hhaGkgRGl2Ok5hd2FiZ2FuaiBabAorMTA6QkQ6QkdEOkJBTkdMQURFU0g6UmFqc2hhaGkgRGl2Ok5pbHBoYW1hcmkgWmwKKzExOkJEOkJHRDpCQU5HTEFERVNIOlJhanNoYWhpIERpdjpQYWJuYSBabAorMTI6QkQ6QkdEOkJBTkdMQURFU0g6UmFqc2hhaGkgRGl2OlBhbmNoYWdhcmggWmwKKzEzOkJEOkJHRDpCQU5HTEFERVNIOlJhanNoYWhpIERpdjpSYWpzaGFoaSBabAorMTQ6QkQ6QkdEOkJBTkdMQURFU0g6UmFqc2hhaGkgRGl2OlJhbmdwdXIgWmwKKzE1OkJEOkJHRDpCQU5HTEFERVNIOlJhanNoYWhpIERpdjpTaXJhamdhbmogWmwKKzE2OkJEOkJHRDpCQU5HTEFERVNIOlJhanNoYWhpIERpdjpUaGFrdXJnYW9uIFpsCisxOkJEOkJHRDpCQU5HTEFERVNIOkJhcmlzYWwgRGl2OkJhcmd1bmEgWmwKKzI6QkQ6QkdEOkJBTkdMQURFU0g6QmFyaXNhbCBEaXY6QmFyaXNhbCBabAorMzpCRDpCR0Q6QkFOR0xBREVTSDpCYXJpc2FsIERpdjpCaG9sYSBabAorNDpCRDpCR0Q6QkFOR0xBREVTSDpCYXJpc2FsIERpdjpKaGFsYWthdGkgWmwKKzU6QkQ6QkdEOkJBTkdMQURFU0g6QmFyaXNhbCBEaXY6UGF0dWFraGFsaSBabAorNjpCRDpCR0Q6QkFOR0xBREVTSDpCYXJpc2FsIERpdjpQaXJvanB1ciBabAorMTpCRDpCR0Q6QkFOR0xBREVTSDpLaHVsbmEgRGl2OkJhZ2VyaGF0IFpsCisyOkJEOkJHRDpCQU5HTEFERVNIOktodWxuYSBEaXY6Q2h1YWRhbmdhIFpsCiszOkJEOkJHRDpCQU5HTEFERVNIOktodWxuYSBEaXY6SmVzc29yZSBabAorNDpCRDpCR0Q6QkFOR0xBREVTSDpLaHVsbmEgRGl2OkpoZW5haWRhaGEgWmwKKzU6QkQ6QkdEOkJBTkdMQURFU0g6S2h1bG5hIERpdjpLaHVsbmEgWmwKKzY6QkQ6QkdEOkJBTkdMQURFU0g6S2h1bG5hIERpdjpLdXNodGlhIFpsCis3OkJEOkJHRDpCQU5HTEFERVNIOktodWxuYSBEaXY6TWFndXJhIFpsCis4OkJEOkJHRDpCQU5HTEFERVNIOktodWxuYSBEaXY6TWVoZXJwdXIgWmwKKzk6QkQ6QkdEOkJBTkdMQURFU0g6S2h1bG5hIERpdjpOYXJhaWwgWmwKKzEwOkJEOkJHRDpCQU5HTEFERVNIOktodWxuYSBEaXY6U2F0a2hpcmEgWmwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQkdSL0JHUl9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQkdSL0JHUl9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2IyMGM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CR1IvQkdSX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMjggQEAKKzE6QkctMDpCRzpCTEFHT0VWR1JBRAorMjpCRy0wMjpCRzpCVVJHQVMKKzM6QkctMDg6Qkc6RE9CUklFCis0OkJHLTA3OkJHOkdBQlJPVk8KKzU6QkctMjI6Qkc6R1JBRCBTT0ZJSkEgKE1VTi4pCis2OkJHLTI2OkJHOkhBU0tPVk8KKzc6QkctMjg6Qkc6SkFNQk9MCis4OkJHLTA5OkJHOktSREFMSQorOTpCRy0yOTpCRzpMT1ZFQworMTA6QkctOkJHOkxPVkVFCisxMTpCRy0yMTpCRzpNSUhBSkxPVkdSQUQKKzEyOkJHLTI6Qkc6TU9OVEFOQQorMTM6QkctMzpCRzpQQVpBUkRJSworMTQ6QkctNDpCRzpQRVJOSUsKKzE1OkJHLTU6Qkc6UExFVkVOCisxNjpCRy02OkJHOlBMT1ZESVYKKzE3OkJHLTc6Qkc6UkFaR1JBRAorMTg6QkctODpCRzpSVVNFCisxOTpCRy05OkJHOlNJTElTVFJBCisyMDpCRy0yMDpCRzpTTElWRU4KKzIxOkJHLTIzOkJHOlNPRklKQSAgIENJVFkKKzIyOkJHLTI0OkJHOlNUQVJBIFpBR09SQQorMjM6QkctMjU6Qkc6VFJHT1ZJVEUKKzI0OkJHLTI3OkJHOlVNRU4KKzI1OkJHLTAzOkJHOlZBUk5BCisyNjpCRy0wNDpCRzpWRUxJS08gVFJOT1ZPCisyNzpCRy0wNTpCRzpWSURJTgorMjg6QkctMDY6Qkc6VlJBQ0EKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQkdSL0JHUl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQkdSL0JHUl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CR1IvQkdSX0FETUlOMl9MRVgudHh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JIUi9CSFJfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JIUi9CSFJfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5MWIxNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQkhSL0JIUl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDEyIEBACisxOkJILTA6Qkg6QUwgQURECisyOkJILTAzOkJIOkFMIE1BTk1BSAorMzpCSC0wNzpCSDpBTCBNSU5BUUFIIEFMIFdVUworNDpCSC0wNTpCSDpBTCBNSU5BUUFIIEFTSCBTSEFNTFlBSAorNTpCSC0wMjpCSDpBTCBNVUFSUkFRCis2OkJILTA5OkJIOkFSIFJJRgorNzpCSC1COkJIOkJBSFJBSU4KKzg6QkgtMDQ6Qkg6SklERCBBRgorOTpCSC0yOkJIOk1BRE5BVCBBTUFECisxMDpCSC0wODpCSDpNQUROQVQgUworMTE6QkgtMTA6Qkg6TUlOQVFBVCBKVVpVUiBBV1IKKzEyOkJILTA2OkJIOlNJVFJBSApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CSFIvQkhSX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CSFIvQkhSX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ODE4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JIUi9CSFJfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSw1IEBACisxOkJIOkJIUjpCQUhSQUlOOkJhaHJhaW46QkhSLkwyLjEKKzI6Qkg6QkhSOkJBSFJBSU46QmFocmFpbjpCSFIuTDIuMgorMzpCSDpCSFI6QkFIUkFJTjpCYWhyYWluOkJIUi5MMi4zCis0OkJIOkJIUjpCQUhSQUlOOkJhaHJhaW46QkhSLkwyLjQKKzU6Qkg6QkhSOkJBSFJBSU46QmFocmFpbjpCSFIuTDIuNQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CSUgvQklIX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CSUgvQklIX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMGExZTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JJSC9CSUhfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwyIEBACisxOkJBLUJJSDpCQTpCT1NOQSBJIEhFUkNFR09WSU5BCisyOkJBLVNSUDpCQTpSRVBVQkxJS0EgU1JQU0tBCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JJSC9CSUhfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JJSC9CSUhfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQklIL0JJSF9BRE1JTjJfTEVYLnR4dApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CT0wvQk9MX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CT0wvQk9MX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYjNjMmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JPTC9CT0xfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSw5IEBACisxOkJPLUI6Qk86QkVOSQorMjpCTy1IOkJPOkNIVVFVSVNBQ0EKKzM6Qk8tQzpCTzpDT0NIQUJBTUJBCis0OkJPLUw6Qk86TEEgUEFaCis1OkJPLU86Qk86T1JVUk8KKzY6Qk8tTjpCTzpQQU5ETworNzpCTy1QOkJPOlBPVE9TSQorODpCTy1TOkJPOlNBTlRBIENSVVoKKzk6Qk8tVDpCTzpUQVJJSkEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQk9ML0JPTF9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQk9ML0JPTF9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjIxYjU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CT0wvQk9MX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMTAwIEBACisxOkJPOkJPTDpCT0xJVklBOlBPVE9TSTpCSUxCQU8KKzI6Qk86Qk9MOkJPTElWSUE6UE9UT1NJOkJVU1RJTExPUworMzpCTzpCT0w6Qk9MSVZJQTpQT1RPU0k6Q0hBUkNBUworNDpCTzpCT0w6Qk9MSVZJQTpQT1RPU0k6Q0hBWUFOVEEKKzU6Qk86Qk9MOkJPTElWSUE6UE9UT1NJOkRBTklFTCBDQU1QT1MKKzY6Qk86Qk9MOkJPTElWSUE6UE9UT1NJOklCQU5FWgorNzpCTzpCT0w6Qk9MSVZJQTpQT1RPU0k6TElOQVJFUworODpCTzpCT0w6Qk9MSVZJQTpQT1RPU0k6TU9ERVNUTyBPTUlTVEUKKzk6Qk86Qk9MOkJPTElWSUE6UE9UT1NJOk5PUiBDSElDSEFTCisxMDpCTzpCT0w6Qk9MSVZJQTpQT1RPU0k6Tk9SIExJUEVaCisxMTpCTzpCT0w6Qk9MSVZJQTpQT1RPU0k6UVVJSkFSUk8KKzEyOkJPOkJPTDpCT0xJVklBOlBPVE9TSTpTQUFWRURSQQorMTM6Qk86Qk9MOkJPTElWSUE6UE9UT1NJOlNVRCBDSElDSEFTCisxNDpCTzpCT0w6Qk9MSVZJQTpQT1RPU0k6U1VEIExJUEVaCisxNTpCTzpCT0w6Qk9MSVZJQTpQT1RPU0k6VE9NQVMgRlJJQVMKKzE6Qk86Qk9MOkJPTElWSUE6Q09DSEFCQU1CQTpBUkFOSQorMjpCTzpCT0w6Qk9MSVZJQTpDT0NIQUJBTUJBOkFSQ0UKKzM6Qk86Qk9MOkJPTElWSUE6Q09DSEFCQU1CQTpBUlFVRQorNDpCTzpCT0w6Qk9MSVZJQTpDT0NIQUJBTUJBOkFZT1BBWUEKKzU6Qk86Qk9MOkJPTElWSUE6Q09DSEFCQU1CQTpDQU1QRVJPCis2OkJPOkJPTDpCT0xJVklBOkNPQ0hBQkFNQkE6Q0FQSU5PVEEKKzc6Qk86Qk9MOkJPTElWSUE6Q09DSEFCQU1CQTpDQVJSQVNDTworODpCTzpCT0w6Qk9MSVZJQTpDT0NIQUJBTUJBOkNFUkNBRE8KKzk6Qk86Qk9MOkJPTElWSUE6Q09DSEFCQU1CQTpDSEFQQVJFCisxMDpCTzpCT0w6Qk9MSVZJQTpDT0NIQUJBTUJBOkpPUkRBTgorMTE6Qk86Qk9MOkJPTElWSUE6Q09DSEFCQU1CQTpNSVpPUVVFCisxMjpCTzpCT0w6Qk9MSVZJQTpDT0NIQUJBTUJBOlBVTkFUQQorMTM6Qk86Qk9MOkJPTElWSUE6Q09DSEFCQU1CQTpRVUlMTEFDT0xMTworMTQ6Qk86Qk9MOkJPTElWSUE6Q09DSEFCQU1CQTpUQVBBQ0FSSQorMTpCTzpCT0w6Qk9MSVZJQTpTQU5UQSBDUlVaOkEuU0FORE9WQUwKKzI6Qk86Qk9MOkJPTElWSUE6U0FOVEEgQ1JVWjpBTkRSRVMgSUJBTkVaCiszOkJPOkJPTDpCT0xJVklBOlNBTlRBIENSVVo6Q0FCQUxMRVJPCis0OkJPOkJPTDpCT0xJVklBOlNBTlRBIENSVVo6Q0hJUVVJVE9TCis1OkJPOkJPTDpCT0xJVklBOlNBTlRBIENSVVo6Q09SRElMTEVSQQorNjpCTzpCT0w6Qk9MSVZJQTpTQU5UQSBDUlVaOkZMT1JJREEKKzc6Qk86Qk9MOkJPTElWSUE6U0FOVEEgQ1JVWjpHVVRJRVJSRVoKKzg6Qk86Qk9MOkJPTElWSUE6U0FOVEEgQ1JVWjpJQ0hJTE8KKzk6Qk86Qk9MOkJPTElWSUE6U0FOVEEgQ1JVWjpOVUZMTyBERSBDSEFWRVoKKzEwOkJPOkJPTDpCT0xJVklBOlNBTlRBIENSVVo6U0FOVElFU1RFQkFOCisxMTpCTzpCT0w6Qk9MSVZJQTpTQU5UQSBDUlVaOlZBTExFIEdSQU5ERQorMTI6Qk86Qk9MOkJPTElWSUE6U0FOVEEgQ1JVWjpWRUxBU0NPCisxMzpCTzpCT0w6Qk9MSVZJQTpTQU5UQSBDUlVaOldBUk5FUworMTpCTzpCT0w6Qk9MSVZJQTpCRU5JOkNFUkNBRE8KKzI6Qk86Qk9MOkJPTElWSUE6QkVOSTpHUkFMLkouQkFMTElWSUEKKzM6Qk86Qk9MOkJPTElWSUE6QkVOSTpJVEVORVoKKzQ6Qk86Qk9MOkJPTElWSUE6QkVOSTpNQU1PUkUKKzU6Qk86Qk9MOkJPTElWSUE6QkVOSTpNQVJCQU4KKzY6Qk86Qk9MOkJPTElWSUE6QkVOSTpNT1hPUworNzpCTzpCT0w6Qk9MSVZJQTpCRU5JOlZBQ0EgRElFWgorODpCTzpCT0w6Qk9MSVZJQTpCRU5JOllBQ1VNQQorMTpCTzpCT0w6Qk9MSVZJQTpQQU5ETzpBQlVOQQorMjpCTzpCT0w6Qk9MSVZJQTpQQU5ETzpHUkFMLkZEQ08gUE9NQQorMzpCTzpCT0w6Qk9MSVZJQTpQQU5ETzpNQURSRSBERSBESU9TCis0OkJPOkJPTDpCT0xJVklBOlBBTkRPOk1BTlVSSVBJCis1OkJPOkJPTDpCT0xJVklBOlBBTkRPOk5JQ09MQVMgU1VBUkVaCisxOkJPOkJPTDpCT0xJVklBOkxBIFBBWjpBUk9NQQorMjpCTzpCT0w6Qk9MSVZJQTpMQSBQQVo6Q0FNQUNITworMzpCTzpCT0w6Qk9MSVZJQTpMQSBQQVo6RlJBTlogVEFNQVlPCis0OkJPOkJPTDpCT0xJVklBOkxBIFBBWjpHLlZJTExBUlJPRUwKKzU6Qk86Qk9MOkJPTElWSUE6TEEgUEFaOklOR0FWSQorNjpCTzpCT0w6Qk9MSVZJQTpMQSBQQVo6SU5RVUlTSVZJCis3OkJPOkJPTDpCT0xJVklBOkxBIFBBWjpJT0FZWkEKKzg6Qk86Qk9MOkJPTElWSUE6TEEgUEFaOklUVVJSQUxERQorOTpCTzpCT0w6Qk9MSVZJQTpMQSBQQVo6TEFSRUNBSkEKKzEwOkJPOkJPTDpCT0xJVklBOkxBIFBBWjpMT1MgQU5ERVMKKzExOkJPOkJPTDpCT0xJVklBOkxBIFBBWjpNQU5DTyBLQVBBQworMTI6Qk86Qk9MOkJPTElWSUE6TEEgUEFaOk1VTkVDQVMKKzEzOkJPOkJPTDpCT0xJVklBOkxBIFBBWjpNVVJJTExPCisxNDpCTzpCT0w6Qk9MSVZJQTpMQSBQQVo6Tk9SIFlVTkdBUworMTU6Qk86Qk9MOkJPTElWSUE6TEEgUEFaOk9NQVNVWU9TCisxNjpCTzpCT0w6Qk9MSVZJQTpMQSBQQVo6UEFDQUpFUworMTc6Qk86Qk9MOkJPTElWSUE6TEEgUEFaOlNBQVZFRFJBCisxODpCTzpCT0w6Qk9MSVZJQTpMQSBQQVo6U1VEIFlVTkdBUworMTpCTzpCT0w6Qk9MSVZJQTpUQVJJSkE6QVJDRQorMjpCTzpCT0w6Qk9MSVZJQTpUQVJJSkE6Q0VSQ0FETworMzpCTzpCT0w6Qk9MSVZJQTpUQVJJSkE6R1JBTiBDSEFDTworNDpCTzpCT0w6Qk9MSVZJQTpUQVJJSkE6TUVOREVaCis1OkJPOkJPTDpCT0xJVklBOlRBUklKQTpPQ09OTk9SCis2OkJPOkJPTDpCT0xJVklBOlRBUklKQTpWSUxFUworMTpCTzpCT0w6Qk9MSVZJQTpDSFVRVUlTQUNBOkFaVVJEVVkKKzI6Qk86Qk9MOkJPTElWSUE6Q0hVUVVJU0FDQTpCLkJPRVRPCiszOkJPOkJPTDpCT0xJVklBOkNIVVFVSVNBQ0E6SERPLiBTSUxFUworNDpCTzpCT0w6Qk9MSVZJQTpDSFVRVUlTQUNBOkxVSVMgQ0FMVk8KKzU6Qk86Qk9MOkJPTElWSUE6Q0hVUVVJU0FDQTpOT1IgQ0lOVEkKKzY6Qk86Qk9MOkJPTElWSUE6Q0hVUVVJU0FDQTpPUk9QRVpBCis3OkJPOkJPTDpCT0xJVklBOkNIVVFVSVNBQ0E6U1VEIENJTlRJCis4OkJPOkJPTDpCT0xJVklBOkNIVVFVSVNBQ0E6VE9NSU5BCis5OkJPOkJPTDpCT0xJVklBOkNIVVFVSVNBQ0E6WUFNUEFSQUVaCisxMDpCTzpCT0w6Qk9MSVZJQTpDSFVRVUlTQUNBOlpVREFORVoKKzE6Qk86Qk9MOkJPTElWSUE6T1JVUk86QVRBSFVBTExQQQorMjpCTzpCT0w6Qk9MSVZJQTpPUlVSTzpBVkFST0EKKzM6Qk86Qk9MOkJPTElWSUE6T1JVUk86Q0FSQU5HQVMKKzQ6Qk86Qk9MOkJPTElWSUE6T1JVUk86Q0VSQ0FETworNTpCTzpCT0w6Qk9MSVZJQTpPUlVSTzpEQUxFTkNFCis2OkJPOkJPTDpCT0xJVklBOk9SVVJPOkwuQ0FCUkVSQQorNzpCTzpCT0w6Qk9MSVZJQTpPUlVSTzpMQUdPIFBPT1BPCis4OkJPOkJPTDpCT0xJVklBOk9SVVJPOkxJVE9SQUwKKzk6Qk86Qk9MOkJPTElWSUE6T1JVUk86UE9PUE8KKzEwOkJPOkJPTDpCT0xJVklBOk9SVVJPOlNBSkFNQQorMTE6Qk86Qk9MOkJPTElWSUE6T1JVUk86U0FVQ0FSSQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CUkEvQlJBX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CUkEvQlJBX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNTdiZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JSQS9CUkFfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwzMCBAQAorMTpCUi1BQzpCUjpBQ1JFCisyOkJSLUFMOkJSOkFMQUdPQVMKKzM6QlItQVA6QlI6QU1BUEEKKzQ6QlItQU06QlI6QU1BWk9OQVMKKzU6QlItQkE6QlI6QkFISUEKKzY6QlItQ0FQOkJSOkNBUEFORU1BCis3OkJSLUNFOkJSOkNFQVJBCis4OkJSLURGOkJSOkRJU1RSSVRPIEZFREVSQUwKKzk6QlItRVM6QlI6RVNQSVJJVFUgU0FOVE8KKzEwOkJSLUdPOkJSOkdPSUFTCisxMTpCUi1NQTpCUjpNQVJBTkhBTworMTI6QlItTVA6QlI6TUFSQU5IQU8vUElBVUkKKzEzOkJSLU1UOkJSOk1BVE8gR1JPU1NPCisxNDpCUi1NUzpCUjpNQVRPIEdST1NTTyBETyBTVUwKKzE1OkJSLU1HOkJSOk1JTkFTIEdFUkFJUworMTY6QlItUEE6QlI6UEFSQQorMTc6QlItUEI6QlI6UEFSQUlCQQorMTg6QlItUFI6QlI6UEFSQU5BCisxOTpCUi1QRTpCUjpQRVJOQU1CVUNPCisyMDpCUi1QSTpCUjpQSUFVSQorMjE6QlItUFJYOkJSOlBPUlRPIFhBVklFUgorMjI6QlItUko6QlI6UklPIERFIEpBTkVJUk8KKzIzOkJSLVJOOkJSOlJJTyBHUkFOREUgRE8gTk9SVEUKKzI0OkJSLVJTOkJSOlJJTyBHUkFOREUgRE8gU1VMIFtSSU8gR1JBQU5ERSBETyBTVUxdIFtSSU8gR1JOREUgRE8gU1VMXQorMjU6QlItUk86QlI6Uk9ORE9OSUEKKzI2OkJSLVJSOkJSOlJPUkFJTUEKKzI3OkJSLVNDOkJSOlNBTlRBIENBVEFSSU5BCisyODpCUi1TUDpCUjpTQU8gUEFVTE8KKzI5OkJSLVNFOkJSOlNFUkdJUEUKKzMwOkJSLVRPOkJSOlRPQ0FOVElOUwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CUkEvQlJBX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CUkEvQlJBX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNTllMDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JSQS9CUkFfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSwzOTU1IEBACisxOkJSOkJSQTpCUkFTSUw6Uk9ORE9OSUE6QWx0YSBGbG9yZXN0YQorMjpCUjpCUkE6QlJBU0lMOlJPTkRPTklBOkFsdm9yYWRhICBkbyBPLgorMzpCUjpCUkE6QlJBU0lMOlJPTkRPTklBOkFyaXF1ZW1lcworNDpCUjpCUkE6QlJBU0lMOlJPTkRPTklBOkJvbSBQcmluY2lwaW8KKzU6QlI6QlJBOkJSQVNJTDpST05ET05JQTpDYWNvYWwKKzY6QlI6QlJBOkJSQVNJTDpST05ET05JQTpDZXJlamVpcmFzCis3OkJSOkJSQTpCUkFTSUw6Uk9ORE9OSUE6Q29sb3JhZG8gZG8gTy4KKzg6QlI6QlJBOkJSQVNJTDpST05ET05JQTpDb3N0YSBNYXJxdWVzCis5OkJSOkJSQTpCUkFTSUw6Uk9ORE9OSUE6R3VhamFyYS1NaXJpbQorMTA6QlI6QlJBOkJSQVNJTDpST05ET05JQTpKYXJ1CisxMTpCUjpCUkE6QlJBU0lMOlJPTkRPTklBOk1hY2hhZGluaG8KKzEyOkJSOkJSQTpCUkFTSUw6Uk9ORE9OSUE6Tm92YSBCLiBEbyBPZXN0ZQorMTM6QlI6QlJBOkJSQVNJTDpST05ET05JQTpPdXJvIFByZXRvIGRvCisxNDpCUjpCUkE6QlJBU0lMOlJPTkRPTklBOlBpbWVudGEgQnVlbm8KKzE1OkJSOkJSQTpCUkFTSUw6Uk9ORE9OSUE6UG9ydG8gVmVsaG8KKzE2OkJSOkJSQTpCUkFTSUw6Uk9ORE9OSUE6UHJlcy4gTWVkaWNpCisxNzpCUjpCUkE6QlJBU0lMOlJPTkRPTklBOlJvbGltIGRlIE1vdXJhCisxODpCUjpCUkE6QlJBU0lMOlJPTkRPTklBOlNhbnRhIEx1emlhCisxOTpCUjpCUkE6QlJBU0lMOlJPTkRPTklBOlZpbGEgTm92YQorMTpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOkFpcmFvCisyOkJSOkJSQTpCUkFTSUw6QU1BWk9OQVM6QW5vcmkKKzM6QlI6QlJBOkJSQVNJTDpBTUFaT05BUzpBdGFsYWlhIEQnTm9ydGUKKzQ6QlI6QlJBOkJSQVNJTDpBTUFaT05BUzpBdXRhemVzCis1OkJSOkJSQTpCUkFTSUw6QU1BWk9OQVM6QlJBLkwyLjIKKzY6QlI6QlJBOkJSQVNJTDpBTUFaT05BUzpCYXJjZWxvcworNzpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOkJhcnJlaXJpbmhhCis4OkJSOkJSQTpCUkFTSUw6QU1BWk9OQVM6QmVuamFtaW4gQ29uc3RhbgorOTpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOkJvY2EgRG8gQWNyZQorMTA6QlI6QlJBOkJSQVNJTDpBTUFaT05BUzpCb3JiYQorMTE6QlI6QlJBOkJSQVNJTDpBTUFaT05BUzpDYW51dGFtYQorMTI6QlI6QlJBOkJSQVNJTDpBTUFaT05BUzpDYXJhdWFyaQorMTM6QlI6QlJBOkJSQVNJTDpBTUFaT05BUzpDYXJlaXJvCisxNDpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOkNvYXJpCisxNTpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOkNvZGFqYXMKKzE2OkJSOkJSQTpCUkFTSUw6QU1BWk9OQVM6RWlydW5lcGUKKzE3OkJSOkJSQTpCUkFTSUw6QU1BWk9OQVM6RW52aXJhCisxODpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOkZvbnRlIEJvYQorMTk6QlI6QlJBOkJSQVNJTDpBTUFaT05BUzpIdW1haXRhCisyMDpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOklsaGEgR3JhbmRlCisyMTpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOklwaXh1bmEKKzIyOkJSOkJSQTpCUkFTSUw6QU1BWk9OQVM6SXRhY29hdGlhcmEKKzIzOkJSOkJSQTpCUkFTSUw6QU1BWk9OQVM6SXRhcGlyYW5nYQorMjQ6QlI6QlJBOkJSQVNJTDpBTUFaT05BUzpKVVJVQQorMjU6QlI6QlJBOkJSQVNJTDpBTUFaT05BUzpKYXB1cmEKKzI2OkJSOkJSQTpCUkFTSUw6QU1BWk9OQVM6SnV0YWkKKzI3OkJSOkJSQTpCUkFTSUw6QU1BWk9OQVM6TGFicmVhCisyODpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOk1hbmFjYXB1cnUKKzI5OkJSOkJSQTpCUkFTSUw6QU1BWk9OQVM6TWFuYXVzCiszMDpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOk1hbmljb3JlCiszMTpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOk1hcmFhCiszMjpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOk1hdWVzCiszMzpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOk5oYW11bmRhCiszNDpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOk5vdmEgT2xpbmRhIEQnTi4KKzM1OkJSOkJSQTpCUkFTSUw6QU1BWk9OQVM6Tm92byBBcmlwdWFuYQorMzY6QlI6QlJBOkJSQVNJTDpBTUFaT05BUzpQYXJpbnRpbnMKKzM3OkJSOkJSQTpCUkFTSUw6QU1BWk9OQVM6UGF1aW5pCiszODpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOlMuQW50b25pbyBkbyBJY2EKKzM5OkJSOkJSQTpCUkFTSUw6QU1BWk9OQVM6Uy5HYWJyaWVsIEQnQ2FjLgorNDA6QlI6QlJBOkJSQVNJTDpBTUFaT05BUzpTLlBhdWxvIGQnT2xpdmVuCis0MTpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOlNpbHZlcworNDI6QlI6QlJBOkJSQVNJTDpBTUFaT05BUzpUYXBhdWEKKzQzOkJSOkJSQTpCUkFTSUw6QU1BWk9OQVM6VGVmZQorNDQ6QlI6QlJBOkJSQVNJTDpBTUFaT05BUzpVcnVjYXJhCis0NTpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOlVydWN1cml0dWJhCis0NjpCUjpCUkE6QlJBU0lMOkFNQVpPTkFTOlpvbmEgZW4gTGl0aWdpbworMTpCUjpCUkE6QlJBU0lMOlBvcnRvIFhhdmllcjpQb3J0byBMdWNlbmEKKzE6QlI6QlJBOkJSQVNJTDpQQVJBOkFiYWV0ZXR1YmEKKzI6QlI6QlJBOkJSQVNJTDpQQVJBOkFjYXJhCiszOkJSOkJSQTpCUkFTSUw6UEFSQTpBZnVhCis0OkJSOkJSQTpCUkFTSUw6UEFSQTpBbGVucXVlcgorNTpCUjpCUkE6QlJBU0lMOlBBUkE6QWxtZXJpbQorNjpCUjpCUkE6QlJBU0lMOlBBUkE6QWx0YW1pcmEKKzc6QlI6QlJBOkJSQVNJTDpQQVJBOkFuYWphcworODpCUjpCUkE6QlJBU0lMOlBBUkE6QW5hbmluZGV1YQorOTpCUjpCUkE6QlJBU0lMOlBBUkE6QXVndXN0byBDb3JyZWEKKzEwOkJSOkJSQTpCUkFTSUw6UEFSQTpBdmVpcm8KKzExOkJSOkJSQTpCUkFTSUw6UEFSQTpCYWdyZQorMTI6QlI6QlJBOkJSQVNJTDpQQVJBOkJhaWFvCisxMzpCUjpCUkE6QlJBU0lMOlBBUkE6QmFyY2FyZW5hCisxNDpCUjpCUkE6QlJBU0lMOlBBUkE6QmVsZW0KKzE1OkJSOkJSQTpCUkFTSUw6UEFSQTpCZW5ldmlkZXMKKzE2OkJSOkJSQTpCUkFTSUw6UEFSQTpCb25pdG8KKzE3OkJSOkJSQTpCUkFTSUw6UEFSQTpCcmFnYW5nYQorMTg6QlI6QlJBOkJSQVNJTDpQQVJBOkJyZXZlcworMTk6QlI6QlJBOkJSQVNJTDpQQVJBOkJ1amFydQorMjA6QlI6QlJBOkJSQVNJTDpQQVJBOkNhY2hvZWkuRCdBcmFyaQorMjE6QlI6QlJBOkJSQVNJTDpQQVJBOkNhbWV0YQorMjI6QlI6QlJBOkJSQVNJTDpQQVJBOkNhcGFuZW1hCisyMzpCUjpCUkE6QlJBU0lMOlBBUkE6Q2FwaXRhbyBQb2NvCisyNDpCUjpCUkE6QlJBU0lMOlBBUkE6Q2FzdGFuaGFsCisyNTpCUjpCUkE6QlJBU0lMOlBBUkE6Q2hhdmVzCisyNjpCUjpCUkE6QlJBU0lMOlBBUkE6Q29sYXJlcworMjc6QlI6QlJBOkJSQVNJTDpQQVJBOkNvbmNlaWNhbyBBcmFndQorMjg6QlI6QlJBOkJSQVNJTDpQQVJBOkN1cnVjYQorMjk6QlI6QlJBOkJSQVNJTDpQQVJBOkN1cnZhbGluaG8KKzMwOkJSOkJSQTpCUkFTSUw6UEFSQTpGYXJvCiszMTpCUjpCUkE6QlJBU0lMOlBBUkE6R3VydXBhCiszMjpCUjpCUkE6QlJBU0lMOlBBUkE6SWdhcmFwZS1BY3UKKzMzOkJSOkJSQTpCUkFTSUw6UEFSQTpJZ2FyYXBlLU1pcmkKKzM0OkJSOkJSQTpCUkFTSUw6UEFSQTpJbmhhbmdhcGkKKzM1OkJSOkJSQTpCUkFTSUw6UEFSQTpJcml0dWlhCiszNjpCUjpCUkE6QlJBU0lMOlBBUkE6SXRhaXR1YmEKKzM3OkJSOkJSQTpCUkFTSUw6UEFSQTpJdHVwaXJhbmdhCiszODpCUjpCUkE6QlJBU0lMOlBBUkE6SmFjdW5kYQorMzk6QlI6QlJBOkJSQVNJTDpQQVJBOkp1cnV0aQorNDA6QlI6QlJBOkJSQVNJTDpQQVJBOkxpbW9laXJvIGQnQWp1cnUKKzQxOkJSOkJSQTpCUkFTSUw6UEFSQTpNYWdhbGFoZXMgQmFyYXRhCis0MjpCUjpCUkE6QlJBU0lMOlBBUkE6TWFyYWJhCis0MzpCUjpCUkE6QlJBU0lMOlBBUkE6TWFyYWNhbmEKKzQ0OkJSOkJSQTpCUkFTSUw6UEFSQTpNYXJhcGFuaW0KKzQ1OkJSOkJSQTpCUkFTSUw6UEFSQTpNZWxnYWNvCis0NjpCUjpCUkE6QlJBU0lMOlBBUkE6TW9jYWp1YmEKKzQ3OkJSOkJSQTpCUkFTSUw6UEFSQTpNb2p1Cis0ODpCUjpCUkE6QlJBU0lMOlBBUkE6TW9udGUgQWxlZ3JlCis0OTpCUjpCUkE6QlJBU0lMOlBBUkE6TXVhbmEKKzUwOkJSOkJSQTpCUkFTSUw6UEFSQTpOb3ZhIFRpbWJvdGV1YQorNTE6QlI6QlJBOkJSQVNJTDpQQVJBOk9iaWRvcworNTI6QlI6QlJBOkJSQVNJTDpQQVJBOk9laXJhcyBkJ1BhcmEKKzUzOkJSOkJSQTpCUkFTSUw6UEFSQTpPcml4aW1pbmEKKzU0OkJSOkJSQTpCUkFTSUw6UEFSQTpPdXJlbQorNTU6QlI6QlJBOkJSQVNJTDpQQVJBOlBhcmFnb21pbmFzCis1NjpCUjpCUkE6QlJBU0lMOlBBUkE6UGVpeGUgQm9pCis1NzpCUjpCUkE6QlJBU0lMOlBBUkE6UG9udGEgZGUgUGVkcmFzCis1ODpCUjpCUkE6QlJBU0lMOlBBUkE6UG9ydGVsCis1OTpCUjpCUkE6QlJBU0lMOlBBUkE6UG9ydG8gZGUgTW96Cis2MDpCUjpCUkE6QlJBU0lMOlBBUkE6UHJhaW5oYQorNjE6QlI6QlJBOkJSQVNJTDpQQVJBOlByaW1hdmVyYQorNjI6QlI6QlJBOkJSQVNJTDpQQVJBOlMuQW50b25pbyBkJ1RhdWEKKzYzOkJSOkJSQTpCUkFTSUw6UEFSQTpTLk1pZ3VlbCBEJ0d1YW1hCis2NDpCUjpCUkE6QlJBU0lMOlBBUkE6U2FsaW5vcG9saXMKKzY1OkJSOkJSQTpCUkFTSUw6UEFSQTpTYWx2YXRlcnJhCis2NjpCUjpCUkE6QlJBU0lMOlBBUkE6U2FudGFuYSBBcmFndWFpYQorNjc6QlI6QlJBOkJSQVNJTDpQQVJBOlNhbnRhcmVtCis2ODpCUjpCUkE6QlJBU0lMOlBBUkE6U2FudGFyZW0gTm92bworNjk6QlI6QlJBOkJSQVNJTDpQQVJBOlNhbyBDYWV0YW5vIE9kaXYKKzcwOkJSOkJSQTpCUkFTSUw6UEFSQTpTYW8gRG9taW5nb3MgQ2FwCis3MTpCUjpCUkE6QlJBU0lMOlBBUkE6U2FvIEZjby4gZG8gUGFyYQorNzI6QlI6QlJBOkJSQVNJTDpQQVJBOlNhbyBGZWxpeCBEJ1hpbi4KKzczOkJSOkJSQTpCUkFTSUw6UEFSQTpTYW8gSm9hbyBkJ0FyYWcKKzc0OkJSOkJSQTpCUkFTSUw6UEFSQTpTYW8gU2ViYXN0aWFvIGRhCis3NTpCUjpCUkE6QlJBU0lMOlBBUkE6U2VuLkpvc2UgUG9yZmlyaQorNzY6QlI6QlJBOkJSQVNJTDpQQVJBOlNvdXJlCis3NzpCUjpCUkE6QlJBU0lMOlBBUkE6U3RhLkNydXogRCdBcmFyaQorNzg6QlI6QlJBOkJSQVNJTDpQQVJBOlN0YS5Jc2FiZWwgUGFyYQorNzk6QlI6QlJBOkJSQVNJTDpQQVJBOlN0YS5NYXJpYSBkJ1BhcmEKKzgwOkJSOkJSQTpCUkFTSUw6UEFSQTpUb21lLUFjdQorODE6QlI6QlJBOkJSQVNJTDpQQVJBOlR1Y3VydWkKKzgyOkJSOkJSQTpCUkFTSUw6UEFSQTpWaWdpYQorODM6QlI6QlJBOkJSQVNJTDpQQVJBOlZpc2V1CisxOkJSOkJSQTpCUkFTSUw6UElBVUk6QWdyaWNvbGFuZGlhCisyOkJSOkJSQTpCUkFTSUw6UElBVUk6QWd1YSBCcmFuY2EKKzM6QlI6QlJBOkJSQVNJTDpQSUFVSTpBbHRvIExvbmdhCis0OkJSOkJSQTpCUkFTSUw6UElBVUk6QWx0b3MKKzU6QlI6QlJBOkJSQVNJTDpQSUFVSTpBbWFyYW50ZQorNjpCUjpCUkE6QlJBU0lMOlBJQVVJOkFuZ2ljYWwgZG8gUGlhdWkKKzc6QlI6QlJBOkJSQVNJTDpQSUFVSTpBbmlzaW8gQWJyZXUKKzg6QlI6QlJBOkJSQVNJTDpQSUFVSTpBbnRvbmlvIEFsbWVpZGEKKzk6QlI6QlJBOkJSQVNJTDpQSUFVSTpBcm9hemVzCisxMDpCUjpCUkE6QlJBU0lMOlBJQVVJOkFycmFpYWwKKzExOkJSOkJSQTpCUkFTSUw6UElBVUk6QXZlbGlubyBMb3BlcworMTI6QlI6QlJBOkJSQVNJTDpQSUFVSTpCYXJyYXMKKzEzOkJSOkJSQTpCUkFTSUw6UElBVUk6QmFycmVpcmFzIFBpYXVpCisxNDpCUjpCUkE6QlJBU0lMOlBJQVVJOkJhcnJvIER1cm8KKzE1OkJSOkJSQTpCUkFTSUw6UElBVUk6QmF0YWxoYQorMTY6QlI6QlJBOkJSQVNJTDpQSUFVSTpCZW5lZGl0aW5vcworMTc6QlI6QlJBOkJSQVNJTDpQSUFVSTpCZXJ0b2xpbmlhCisxODpCUjpCUkE6QlJBU0lMOlBJQVVJOkJvY2FpbmEKKzE5OkJSOkJSQTpCUkFTSUw6UElBVUk6Qm9tIEplc3VzCisyMDpCUjpCUkE6QlJBU0lMOlBJQVVJOkJ1cml0aSBkb3MgTG9wZXMKKzIxOkJSOkJSQTpCUkFTSUw6UElBVUk6Q09SUkVOVEVTCisyMjpCUjpCUkE6QlJBU0lMOlBJQVVJOkNhbXBpbmFzIFBpYXVpCisyMzpCUjpCUkE6QlJBU0lMOlBJQVVJOkNhbXBvIE1haW9yCisyNDpCUjpCUkE6QlJBU0lMOlBJQVVJOkNhbnRvIGRvIEJ1cml0aQorMjU6QlI6QlJBOkJSQVNJTDpQSUFVSTpDYXBpdGFvIGRlIENhbXBvCisyNjpCUjpCUkE6QlJBU0lMOlBJQVVJOkNhcmFjb2wKKzI3OkJSOkJSQTpCUkFTSUw6UElBVUk6Q2FzdGVsbyBkbyBQaWF1aQorMjg6QlI6QlJBOkJSQVNJTDpQSUFVSTpDb2NhbAorMjk6QlI6QlJBOkJSQVNJTDpQSUFVSTpDb25jZWljYW8gQ2FuaW5vCiszMDpCUjpCUkE6QlJBU0lMOlBJQVVJOkNyaXN0YWxhbmRpYSBQLgorMzE6QlI6QlJBOkJSQVNJTDpQSUFVSTpDcmlzdGlubyBDYXN0cm8KKzMyOkJSOkJSQTpCUkFTSUw6UElBVUk6Q3VyaW1hdGEKKzMzOkJSOkJSQTpCUkFTSUw6UElBVUk6RGVtZXJ2YWwgTG9iYW8KKzM0OkJSOkJSQTpCUkFTSUw6UElBVUk6RG9tIEV4cGVkaXRvIEwuCiszNTpCUjpCUkE6QlJBU0lMOlBJQVVJOkVsZXNiYW8gVmVsb3NvCiszNjpCUjpCUkE6QlJBU0lMOlBJQVVJOkVsaXNldSBNYXJ0aW5zCiszNzpCUjpCUkE6QlJBU0lMOlBJQVVJOkVzcGVyYW50aW5hCiszODpCUjpCUkE6QlJBU0lMOlBJQVVJOkZsb3JlcyBkbyBQaWF1aQorMzk6QlI6QlJBOkJSQVNJTDpQSUFVSTpGbG9yaWFubworNDA6QlI6QlJBOkJSQVNJTDpQSUFVSTpGcmFuY2lub3BvbGlzCis0MTpCUjpCUkE6QlJBU0lMOlBJQVVJOkZyYW5jaXNjbyBBaXJlcworNDI6QlI6QlJBOkJSQVNJTDpQSUFVSTpGcmFuY2lzY28gU2FudG9zCis0MzpCUjpCUkE6QlJBU0lMOlBJQVVJOkZyb250ZWlyYXMKKzQ0OkJSOkJSQTpCUkFTSUw6UElBVUk6R2lsYnVlcworNDU6QlI6QlJBOkJSQVNJTDpQSUFVSTpHdWFkYWx1cGUKKzQ2OkJSOkJSQTpCUkFTSUw6UElBVUk6SHVnbyBOYXBvbGVhbworNDc6QlI6QlJBOkJSQVNJTDpQSUFVSTpJbmh1bWEKKzQ4OkJSOkJSQTpCUkFTSUw6UElBVUk6SXBpcmFuZ2EgUGlhdWkKKzQ5OkJSOkJSQTpCUkFTSUw6UElBVUk6SXNhaWFzIENvZWxobworNTA6QlI6QlJBOkJSQVNJTDpQSUFVSTpJdGFpbm9wb2xpcworNTE6QlI6QlJBOkJSQVNJTDpQSUFVSTpJdGF1ZWlyYQorNTI6QlI6QlJBOkJSQVNJTDpQSUFVSTpKYWljb3MKKzUzOkJSOkJSQTpCUkFTSUw6UElBVUk6SmVydW1lbmhhCis1NDpCUjpCUkE6QlJBU0lMOlBJQVVJOkpvYXF1aW0gUGlyZXMKKzU1OkJSOkJSQTpCUkFTSUw6UElBVUk6Sm9zZSBkZSBGcmVpdGFzCis1NjpCUjpCUkE6QlJBU0lMOlBJQVVJOkxhbmRyaSBTYWxlcworNTc6QlI6QlJBOkJSQVNJTDpQSUFVSTpMdWlzIENvcnJlaWEKKzU4OkJSOkJSQTpCUkFTSUw6UElBVUk6THV6aWxhbmRpYQorNTk6QlI6QlJBOkJSQVNJTDpQSUFVSTpNYW5vZWwgRW1pbGlvCis2MDpCUjpCUkE6QlJBU0lMOlBJQVVJOk1hcmNvcyBQYXJlbnRlCis2MTpCUjpCUkE6QlJBU0lMOlBJQVVJOk1hdGlhcyBPbGltcGlvCis2MjpCUjpCUkE6QlJBU0lMOlBJQVVJOk1pZ3VlbCBBbHZlcworNjM6QlI6QlJBOkJSQVNJTDpQSUFVSTpNaWd1ZWwgTGVhbworNjQ6QlI6QlJBOkJSQVNJTDpQSUFVSTpNb25zZW5ob3IgR2lsCis2NTpCUjpCUkE6QlJBU0lMOlBJQVVJOk1vbnNlbmhvciBIaXBvbGkKKzY2OkJSOkJSQTpCUkFTSUw6UElBVUk6TW9udGUgQWxlZ3JlCis2NzpCUjpCUkE6QlJBU0lMOlBJQVVJOk5hemFyZSBkbyBQaWF1aQorNjg6QlI6QlJBOkJSQVNJTDpQSUFVSTpOb3NzYSBTZW5ob3JhIGRpCis2OTpCUjpCUkE6QlJBU0lMOlBJQVVJOk5vdm8gT3JpZW50ZSBQLgorNzA6QlI6QlJBOkJSQVNJTDpQSUFVSTpPZWlyYXMKKzcxOkJSOkJSQTpCUkFTSUw6UElBVUk6T2xobyBEJ0FndWEgRy4KKzcyOkJSOkJSQTpCUkFTSUw6UElBVUk6UGFkcmUgTWFyY29zCis3MzpCUjpCUkE6QlJBU0lMOlBJQVVJOlBhZXMgTGFuZGltCis3NDpCUjpCUkE6QlJBU0lMOlBJQVVJOlBhbG1laXJhIFBpYXVpCis3NTpCUjpCUkE6QlJBU0lMOlBJQVVJOlBhbG1laXJhaXMKKzc2OkJSOkJSQTpCUkFTSUw6UElBVUk6UGFybmFndWEKKzc3OkJSOkJSQTpCUkFTSUw6UElBVUk6UGFybmFpYmEKKzc4OkJSOkJSQTpCUkFTSUw6UElBVUk6UGF1bGlzdGFuYQorNzk6QlI6QlJBOkJSQVNJTDpQSUFVSTpQZWRybyBJSQorODA6QlI6QlJBOkJSQVNJTDpQSUFVSTpQaWNvcworODE6QlI6QlJBOkJSQVNJTDpQSUFVSTpQaW1lbnRlaXJhcworODI6QlI6QlJBOkJSQVNJTDpQSUFVSTpQaW8gSVgKKzgzOkJSOkJSQTpCUkFTSUw6UElBVUk6UGlyYWN1cnVjYQorODQ6QlI6QlJBOkJSQVNJTDpQSUFVSTpQaXJpcGlyaQorODU6QlI6QlJBOkJSQVNJTDpQSUFVSTpQb3J0bworODY6QlI6QlJBOkJSQVNJTDpQSUFVSTpQcmF0YSBkbyBQaWF1aQorODc6QlI6QlJBOkJSQVNJTDpQSUFVSTpSZWRlbmNhbyBHdXJndWVpCis4ODpCUjpCUkE6QlJBU0lMOlBJQVVJOlJlZ2VuZXJhY2FvCis4OTpCUjpCUkE6QlJBU0lMOlBJQVVJOlJpYmVpcm8gR29uY2FsdmUKKzkwOkJSOkJSQTpCUkFTSUw6UElBVUk6UmlvIEdyYW5kZSBQaWF1aQorOTE6QlI6QlJBOkJSQVNJTDpQSUFVSTpTLkFudG9uaW8gTGlzYm9hCis5MjpCUjpCUkE6QlJBU0lMOlBJQVVJOlMuRmVsaXggZG8gUGlhdWkKKzkzOkJSOkJSQTpCUkFTSUw6UElBVUk6Uy5Kb2FvIFBpYXVpCis5NDpCUjpCUkE6QlJBU0lMOlBJQVVJOlMuSm9hbyBkYSBTZXJyYQorOTU6QlI6QlJBOkJSQVNJTDpQSUFVSTpTLkpvc2UgZG8gUGVpeGUKKzk2OkJSOkJSQTpCUkFTSUw6UElBVUk6Uy5Kb3NlIGRvIFBpYXVpCis5NzpCUjpCUkE6QlJBU0lMOlBJQVVJOlMuTWlndWVsIFRhcHVpbworOTg6QlI6QlJBOkJSQVNJTDpQSUFVSTpTLlBlZHJvIFBpYXVpCis5OTpCUjpCUkE6QlJBU0lMOlBJQVVJOlMuUmFpbXVuZG8gTm9uYXQKKzEwMDpCUjpCUkE6QlJBU0lMOlBJQVVJOlNhbnRhIEx1egorMTAxOkJSOkJSQTpCUkFTSUw6UElBVUk6U2FudG8gRmlsb21lbmEKKzEwMjpCUjpCUkE6QlJBU0lMOlBJQVVJOlNhbyBGY28uZG8gUGlhdWkKKzEwMzpCUjpCUkE6QlJBU0lMOlBJQVVJOlNhbyBHb25jYWxvIFBpYXUKKzEwNDpCUjpCUkE6QlJBU0lMOlBJQVVJOlNhbyBKdWxpYW8KKzEwNTpCUjpCUkE6QlJBU0lMOlBJQVVJOlNpbW9lcworMTA2OkJSOkJSQTpCUkFTSUw6UElBVUk6U2ltcGxpY2lvIE1lbmRlcworMTA3OkJSOkJSQTpCUkFTSUw6UElBVUk6U29jb3JybyBQaWF1aQorMTA4OkJSOkJSQTpCUkFTSUw6UElBVUk6U3RhLkNydXogUGlhdWkKKzEwOTpCUjpCUkE6QlJBU0lMOlBJQVVJOlN0by5JbmFjaW8gUGlhdWkKKzExMDpCUjpCUkE6QlJBU0lMOlBJQVVJOlRlcmVzaW5hCisxMTE6QlI6QlJBOkJSQVNJTDpQSUFVSTpVbmlhbworMTEyOkJSOkJSQTpCUkFTSUw6UElBVUk6VXJ1Y3VpCisxMTM6QlI6QlJBOkJSQVNJTDpQSUFVSTpWYWxlbmNhIGRvIFBpYXVpCisxMTQ6QlI6QlJBOkJSQVNJTDpQSUFVSTpWYXJ6ZWEgR3JhbmRlCisxOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpBQ0FSSQorMjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6QUNVCiszOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpBRk9OU08gQkVaRVJSQQorNDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6QUdVQSBOT1ZBCis1OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpBTEVYQU5EUklBCis2OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpBTFRPIERPIFJPRFJJR1VFCis3OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpBTkdJQ09TCis4OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpBTlRPTklPIE1BUlRJTlMKKzk6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkFQT0RJCisxMDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6QVJFSUEgQlJBTkNBCisxMTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6QVJFUworMTI6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkFVR1VTVE8gU0VWRVJPCisxMzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6QkFJQSBGT1JNT1NBCisxNDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6QkFSQ0VMT05BCisxNTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6QkVOVE8gRkVSTkFOREVTCisxNjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6Qk9NIEpFU1VTCisxNzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6QlJFSklOSE8KKzE4OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpDLkpPQU8gUEVTU09BCisxOTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6Q0FJQ0FSQSBETyBSLlZFTgorMjA6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkNBSUNPCisyMTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6Q0FNUE8gUkVET05ETworMjI6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkNBTkdVQVJFVEFNQQorMjM6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkNBUkFVQkFTCisyNDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6Q0FSTkFVQkEgRE9TIEQuCisyNTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6Q0FSTkFVQkFJUworMjY6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkNFQVJBLU1JUklNCisyNzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6Q0VSUk8tQ09SQQorMjg6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkNPUk9ORUwgRVpFUVVJRUwKKzI5OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpDUlVaRVRBCiszMDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6Q1VSUkFJUyBOT1ZPUworMzE6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkRPVVRPUiBTRVZFUklBTk8KKzMyOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpFTkNBTlRPCiszMzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6RVFVQURPUgorMzQ6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkVTUElSSVRPIFNBTlRPCiszNTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6RVhUUkVNT1oKKzM2OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpGLiBHVUVSUkEKKzM3OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpGTE9SQU5JQQorMzg6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkZSQU5DSVNDTyBEQU5UQVMKKzM5OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpGUlVUVU9TTyBHT01FUworNDA6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkcuRElYLVNFUFQgUk9TQUQKKzQxOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpHQUxJTkhPUworNDI6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkdPSUFOSU5IQQorNDM6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkdST1NTT1MKKzQ0OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpHVUFNQVJFCis0NTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6SUVMTU8gTUFSSU5ITworNDY6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOklQQU5HVUFDVQorNDc6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOklQVUVJUkEKKzQ4OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpJVEFVCis0OTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6SkFDQU5BCis1MDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6SkFOREFJUkEKKzUxOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpKQU5EVUlTCis1MjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6SkFOVUFSSU8gQ0lDQ08KKzUzOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpKQVBJCis1NDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6SkFSRElNIERFIEFOR0lDTworNTU6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkpBUkRJTSBETyBTRVJJRE8KKzU2OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpKQVJESU0tUElSQU5IQVMKKzU3OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpKT0FPIENBTUFSQQorNTg6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkpPQU8gRElBUworNTk6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkpPU0UgREEgUEVOSEEKKzYwOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpKVUNVUlVUVQorNjE6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkpVTkNPCis2MjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6TEFHT0EgRCdBTlRBCis2MzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6TEFHT0EgREUgUEVEUkFTCis2NDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6TEFHT0EgTk9WQQorNjU6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkxBR09BIFNBTEdBREEKKzY2OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpMQUdPQVMgREUgVkVMSE9TCis2NzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6TEFKRVMKKzY4OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpMQUpFUyBQSU5UQURBUworNjk6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkxVQ1JFQ0lBCis3MDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6TFVJUyBHT01FUworNzE6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOkxhZ28KKzcyOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpNQUNBSUJBCis3MzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6TUFDQVUKKzc0OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpNQVJDRUxJTk8gVklFSVJBCis3NTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6TUFSVElOUworNzY6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOk1BWEFSQU5HVUFQRQorNzc6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOk1PTlRBTkhBUworNzg6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOk1PTlRFIEFMRUdSRQorNzk6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOk1PTlRFLUdBTUVMRUlSQVMKKzgwOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpNT1NTT1JPCis4MTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6TkFUQUwKKzgyOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpOSVNJQSBGTE9SRVNUQQorODM6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOk5PVkEgQ1JVWgorODQ6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOk9MSE8gRCJBR1VBIERPIEIKKzg1OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpPVVJPIEJSQU5DTworODY6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlAuIEQuIEZFUlJPUworODc6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlBBUkFOQQorODg6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlBBUkFVCis4OTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6UEFSQVpJTkhPCis5MDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6UEFSRUxIQVMKKzkxOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpQQVJOQU1JUklNCis5MjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6UEFTU0EgRSBGSUNBCis5MzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6UEFTU0FHRU0KKzk0OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpQQVRVCis5NTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6UEVEUkEgR1JBTkRFCis5NjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6UEVEUkEgUFJFVEEKKzk3OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpQRURSTyBBVkVMSU5PCis5ODpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6UEVEUk8gVkVMSE8KKzk5OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpQRU5ERU5DSUFTCisxMDA6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlBJTE9FUworMTAxOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpQT0NPIEJSQU5DTworMTAyOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpQT1JUQUxFR1JFCisxMDM6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlBSRVMuIEpVU0NFTElOTworMTA0OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpQVVJFWkEKKzEwNTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6Ui4gR09ERUlSTworMTA2OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpSQUZBRUwgRkVSTkFOREVTCisxMDc6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlJJQUNITyBEQSBDUlVaCisxMDg6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlJJQUNITyBTQU5UQU5BCisxMDk6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlJJQUNIVUVMTworMTEwOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpST0RPTEZPIEZFUk5BTkRFCisxMTE6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlJVWSBCQVJCT1NBCisxMTI6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlNBTlRBIENSVVoKKzExMzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6U0FOVEFOQQorMTE0OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpTQU5UQU5BIERPIE1BVE9TCisxMTU6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlNBTlRPIEFOVE9OSU8KKzExNjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6U0FPIEJFTlRPIERPIE5URQorMTE3OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpTQU8gQkVOVE8gVFJBSVJJCisxMTg6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlNBTyBGQ08uIE9FU1RFCisxMTk6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlNBTyBGRVJOQU5ETworMTIwOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpTQU8gR09OQ0FMTyBETyBBCisxMjE6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlNBTyBKLkNBTVBFU1RSRQorMTIyOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpTQU8gSk9BTyBELiBTLgorMTIzOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpTQU8gSk9TRSBERSBNLgorMTI0OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpTQU8gSk9TRSBTRVJJRE8KKzEyNTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6U0FPIE1JR1VFTAorMTI2OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpTQU8gUEFVTE8gUE9URU5HCisxMjc6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlNBTyBQRURSTworMTI4OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpTQU8gUkFGQUVMCisxMjk6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlNBTyBUT01FCisxMzA6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlNBTyBWSUNFTlRFCisxMzE6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlNFTi4gRUxPSSBTT1VaQQorMTMyOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpTRU4uIEdFT1JHSU5PIEEuCisxMzM6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlNFUlJBIE5FR1JBIERPIE4KKzEzNDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6U0VSUkEgU0FPIEJFTlRPCisxMzU6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlNFUlJJTkhBCisxMzY6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlNFVkVSSUFOTyBNRUxPCisxMzc6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlNJVElPIE5PVk8KKzEzODpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6VEFCVUxFSVJPIEdSQU5ERQorMTM5OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpUQUlQVQorMTQwOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpUQU5HQVJBCisxNDE6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlRFTkVOVEUgQU5BTklBUworMTQyOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpUSUJBVSBETyBTVUwKKzE0MzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6VElNQkFVQkEgRE9TIEIuCisxNDQ6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlRPVVJPUworMTQ1OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpVTUFSSVpBTAorMTQ2OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpVUEFORU1BCisxNDc6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIE5PUlRFOlZBUlpFQQorMTQ4OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBOT1JURTpWSUNPU0EKKzE0OTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gTk9SVEU6VklMQSBGTE9SCisxOkJSOkJSQTpCUkFTSUw6R09JQVM6QUJBRElBTklBCisyOkJSOkJSQTpCUkFTSUw6R09JQVM6QUdVQSBMSU1QQQorMzpCUjpCUkE6QlJBU0lMOkdPSUFTOkFMRVhBTklBCis0OkJSOkJSQTpCUkFTSUw6R09JQVM6QUxPQU5ESUEKKzU6QlI6QlJBOkJSQVNJTDpHT0lBUzpBTFRPIFBBUkFJU08gREUKKzY6QlI6QlJBOkJSQVNJTDpHT0lBUzpBTFZPUkFEQSBETk9SVCcKKzc6QlI6QlJBOkJSQVNJTDpHT0lBUzpBTU9SSU5PUE9MSVMKKzg6QlI6QlJBOkJSQVNJTDpHT0lBUzpBTkFQT0xJUworOTpCUjpCUkE6QlJBU0lMOkdPSUFTOkFOSEFOR1VFUkEKKzEwOkJSOkJSQTpCUkFTSUw6R09JQVM6QU5JQ1VOUworMTE6QlI6QlJBOkJSQVNJTDpHT0lBUzpBUEFSRUNJREEgRCdHT0kKKzEyOkJSOkJSQTpCUkFTSUw6R09JQVM6QVBPUkUKKzEzOkJSOkJSQTpCUkFTSUw6R09JQVM6QVJBQ1UKKzE0OkJSOkJSQTpCUkFTSUw6R09JQVM6QVJBR0FSQ0FTCisxNTpCUjpCUkE6QlJBU0lMOkdPSUFTOkFSQUdPSUFOSUEKKzE2OkJSOkJSQTpCUkFTSUw6R09JQVM6QVJVQU5BCisxNzpCUjpCUkE6QlJBU0lMOkdPSUFTOkFVUklMQU5ESUEKKzE4OkJSOkJSQTpCUkFTSUw6R09JQVM6QVZFTElOT1BPTElTCisxOTpCUjpCUkE6QlJBU0lMOkdPSUFTOkJBTElaQQorMjA6QlI6QlJBOkJSQVNJTDpHT0lBUzpCQVJSTyBBTFRPCisyMTpCUjpCUkE6QlJBU0lMOkdPSUFTOkJFTEEgVklTVEEgRGBHTworMjI6QlI6QlJBOkJSQVNJTDpHT0lBUzpCT00gSkFSRElNIEQnR08KKzIzOkJSOkJSQTpCUkFTSUw6R09JQVM6Qk9NIEpFU1VTIEQnR09JCisyNDpCUjpCUkE6QlJBU0lMOkdPSUFTOkJSQVNBQlJBTlRFUworMjU6QlI6QlJBOkJSQVNJTDpHT0lBUzpCUkFTSUxJQQorMjY6QlI6QlJBOkJSQVNJTDpHT0lBUzpCUklUQU5JQQorMjc6QlI6QlJBOkJSQVNJTDpHT0lBUzpCVVJJVEkgQUxFR1JFCisyODpCUjpCUkE6QlJBU0lMOkdPSUFTOkNBQkVDRUlSQVMKKzI5OkJSOkJSQTpCUkFTSUw6R09JQVM6Q0FDSE9FSVJBIEFMVEEKKzMwOkJSOkJSQTpCUkFTSUw6R09JQVM6Q0FDSE9FSVJBIEQnR09JCiszMTpCUjpCUkE6QlJBU0lMOkdPSUFTOkNBQ1UKKzMyOkJSOkJSQTpCUkFTSUw6R09JQVM6Q0FJQVBPTklBCiszMzpCUjpCUkE6QlJBU0lMOkdPSUFTOkNBTERBUyBOT1ZBUworMzQ6QlI6QlJBOkJSQVNJTDpHT0lBUzpDQU1QRVNUUkUgRCdHT0kKKzM1OkJSOkJSQTpCUkFTSUw6R09JQVM6Q0FNUElOT1JURQorMzY6QlI6QlJBOkJSQVNJTDpHT0lBUzpDQU1QTyBBTEVHUkUgRCcKKzM3OkJSOkJSQTpCUkFTSUw6R09JQVM6Q0FNUE9TIEJFTE9TCiszODpCUjpCUkE6QlJBU0lMOkdPSUFTOkNBUk1PIEQnUklPIFZFUgorMzk6QlI6QlJBOkJSQVNJTDpHT0lBUzpDQVRBTEFPCis0MDpCUjpCUkE6QlJBU0lMOkdPSUFTOkNBVFVSQUkKKzQxOkJSOkJSQTpCUkFTSUw6R09JQVM6Q0FWQUxDQU5URQorNDI6QlI6QlJBOkJSQVNJTDpHT0lBUzpDRVJFUworNDM6QlI6QlJBOkJSQVNJTDpHT0lBUzpDSVJJTk9QT0xJUworNDQ6QlI6QlJBOkJSQVNJTDpHT0lBUzpDT1JSRUdPIEQnT1VSTworNDU6QlI6QlJBOkJSQVNJTDpHT0lBUzpDT1JVTUJBIERFIEdPSUEKKzQ2OkJSOkJSQTpCUkFTSUw6R09JQVM6Q09SVU1CQUlCQQorNDc6QlI6QlJBOkJSQVNJTDpHT0lBUzpDUklTVEFMSU5BCis0ODpCUjpCUkE6QlJBU0lMOkdPSUFTOkNSSVNUSUFOT1BPTElTCis0OTpCUjpCUkE6QlJBU0lMOkdPSUFTOkNSSVhBUworNTA6QlI6QlJBOkJSQVNJTDpHT0lBUzpDUk9NSU5JQQorNTE6QlI6QlJBOkJSQVNJTDpHT0lBUzpDVU1BUkkKKzUyOkJSOkJSQTpCUkFTSUw6R09JQVM6REFNSUFOT1BPTElTCis1MzpCUjpCUkE6QlJBU0lMOkdPSUFTOkRBTU9MQU5ESUEKKzU0OkJSOkJSQTpCUkFTSUw6R09JQVM6REFWSU5PUE9MSVMKKzU1OkJSOkJSQTpCUkFTSUw6R09JQVM6RElPUkFNQQorNTY6QlI6QlJBOkJSQVNJTDpHT0lBUzpFREVJQQorNTc6QlI6QlJBOkJSQVNJTDpHT0lBUzpFU1RSRUxBIEROT1JURQorNTg6QlI6QlJBOkJSQVNJTDpHT0lBUzpGQVpFTkRBIE5PVkEKKzU5OkJSOkJSQTpCUkFTSUw6R09JQVM6RklSTUlOT1BPTElTCis2MDpCUjpCUkE6QlJBU0lMOkdPSUFTOkZMT1JFUyBERSBHT0lBUworNjE6QlI6QlJBOkJSQVNJTDpHT0lBUzpGT1JNT1NBCis2MjpCUjpCUkE6QlJBU0lMOkdPSUFTOkZPUk1PU08KKzYzOkJSOkJSQTpCUkFTSUw6R09JQVM6R09JQU5BUE9MSVMKKzY0OkJSOkJSQTpCUkFTSUw6R09JQVM6R09JQU5ESVJBCis2NTpCUjpCUkE6QlJBU0lMOkdPSUFTOkdPSUFORVNJQQorNjY6QlI6QlJBOkJSQVNJTDpHT0lBUzpHT0lBTklBCis2NzpCUjpCUkE6QlJBU0lMOkdPSUFTOkdPSUFOSVJBCis2ODpCUjpCUkE6QlJBU0lMOkdPSUFTOkdPSUFTCis2OTpCUjpCUkE6QlJBU0lMOkdPSUFTOkdPSUFUVUJBCis3MDpCUjpCUkE6QlJBU0lMOkdPSUFTOkdVQVBPCis3MTpCUjpCUkE6QlJBU0lMOkdPSUFTOkdVQVJBTkkgRCdHT0lBUworNzI6QlI6QlJBOkJSQVNJTDpHT0lBUzpIRUlUT1JBSQorNzM6QlI6QlJBOkJSQVNJTDpHT0lBUzpISURST0xBTkRJQQorNzQ6QlI6QlJBOkJSQVNJTDpHT0lBUzpISURST0xJTkEKKzc1OkJSOkJSQTpCUkFTSUw6R09JQVM6SUFDSUFSQQorNzY6QlI6QlJBOkJSQVNJTDpHT0lBUzpJTkhVTUFTCis3NzpCUjpCUkE6QlJBU0lMOkdPSUFTOklQQU1FUkkKKzc4OkJSOkJSQTpCUkFTSUw6R09JQVM6SVBPUkEKKzc5OkJSOkJSQTpCUkFTSUw6R09JQVM6SVNSQUVMQU5ESUEKKzgwOkJSOkJSQTpCUkFTSUw6R09JQVM6SVRBQkVSQUkKKzgxOkJSOkJSQTpCUkFTSUw6R09JQVM6SVRBR1VBUlUKKzgyOkJSOkJSQTpCUkFTSUw6R09JQVM6SVRBSkEKKzgzOkJSOkJSQTpCUkFTSUw6R09JQVM6SVRBUEFDSQorODQ6QlI6QlJBOkJSQVNJTDpHT0lBUzpJVEFQSVJBUFVBCis4NTpCUjpCUkE6QlJBU0lMOkdPSUFTOklUQVBVUkFOR0EKKzg2OkJSOkJSQTpCUkFTSUw6R09JQVM6SVRBUlVNQQorODc6QlI6QlJBOkJSQVNJTDpHT0lBUzpJVEFVQ1UKKzg4OkJSOkJSQTpCUkFTSUw6R09JQVM6SVRVTUJJQVJBCis4OTpCUjpCUkE6QlJBU0lMOkdPSUFTOklWT0xBTkRJQQorOTA6QlI6QlJBOkJSQVNJTDpHT0lBUzpKQU5EQUlBCis5MTpCUjpCUkE6QlJBU0lMOkdPSUFTOkpBUkFHVUEKKzkyOkJSOkJSQTpCUkFTSUw6R09JQVM6SkFUQUkKKzkzOkJSOkJSQTpCUkFTSUw6R09JQVM6SkFVUEFDSQorOTQ6QlI6QlJBOkJSQVNJTDpHT0lBUzpKT1ZJQU5JQQorOTU6QlI6QlJBOkJSQVNJTDpHT0lBUzpKVUNBUkEKKzk2OkJSOkJSQTpCUkFTSUw6R09JQVM6TEVPUE9MRE8gRCdCVUxICis5NzpCUjpCUkE6QlJBU0lMOkdPSUFTOkxVWklBTklBCis5ODpCUjpCUkE6QlJBU0lMOkdPSUFTOk1BSVJJUE9UQUJBCis5OTpCUjpCUkE6QlJBU0lMOkdPSUFTOk1BTUJBSQorMTAwOkJSOkJSQTpCUkFTSUw6R09JQVM6TUFSQSBST1NBCisxMDE6QlI6QlJBOkJSQVNJTDpHT0lBUzpNQVJaQUdBTworMTAyOkJSOkJSQTpCUkFTSUw6R09JQVM6TUFURUlSQQorMTAzOkJSOkJSQTpCUkFTSUw6R09JQVM6TUFVUklMQU5ESUEKKzEwNDpCUjpCUkE6QlJBU0lMOkdPSUFTOk1JTkVJUk9TCisxMDU6QlI6QlJBOkJSQVNJTDpHT0lBUzpNT0lQT1JBCisxMDY6QlI6QlJBOkJSQVNJTDpHT0lBUzpNT05URSBBTEVHUkUgRCcKKzEwNzpCUjpCUkE6QlJBU0lMOkdPSUFTOk1PTlRFUyBDTEFST1MgRworMTA4OkJSOkJSQTpCUkFTSUw6R09JQVM6TU9SUklOSE9TCisxMDk6QlI6QlJBOkJSQVNJTDpHT0lBUzpNT1NTQU1FREVTCisxMTA6QlI6QlJBOkJSQVNJTDpHT0lBUzpNT1pBUkxBTkRJQQorMTExOkJSOkJSQTpCUkFTSUw6R09JQVM6TVVUVU5PUE9MSVMKKzExMjpCUjpCUkE6QlJBU0lMOkdPSUFTOk5BWkFSSU8KKzExMzpCUjpCUkE6QlJBU0lMOkdPSUFTOk5FUk9QT0xJUworMTE0OkJSOkJSQTpCUkFTSUw6R09JQVM6TklRVUVMQU5ESUEKKzExNTpCUjpCUkE6QlJBU0lMOkdPSUFTOk5PVkEgQU1FUklDQQorMTE2OkJSOkJSQTpCUkFTSUw6R09JQVM6Tk9WQSBBVVJPUkEKKzExNzpCUjpCUkE6QlJBU0lMOkdPSUFTOk5PVkEgUk9NQQorMTE4OkJSOkJSQTpCUkFTSUw6R09JQVM6Tk9WQSBWRU5FWkEKKzExOTpCUjpCUkE6QlJBU0lMOkdPSUFTOk5PVk8gQlJBU0lMCisxMjA6QlI6QlJBOkJSQVNJTDpHT0lBUzpPUklaT05BCisxMjE6QlI6QlJBOkJSQVNJTDpHT0lBUzpPVVJPIFZFUkRFIEQnR08KKzEyMjpCUjpCUkE6QlJBU0lMOkdPSUFTOk9VVklET1IKKzEyMzpCUjpCUkE6QlJBU0lMOkdPSUFTOlBBRFJFIEJFUk5BUkRPCisxMjQ6QlI6QlJBOkJSQVNJTDpHT0lBUzpQQUxNRUlSQVMgRCdHT0kKKzEyNTpCUjpCUkE6QlJBU0lMOkdPSUFTOlBBTE1FTE8KKzEyNjpCUjpCUkE6QlJBU0lMOkdPSUFTOlBBTE1JTk9QT0xJUworMTI3OkJSOkJSQTpCUkFTSUw6R09JQVM6UEFOQU1BCisxMjg6QlI6QlJBOkJSQVNJTDpHT0lBUzpQQVJBVU5BCisxMjk6QlI6QlJBOkJSQVNJTDpHT0lBUzpQRVRST0xJTkEgRCdHT0kKKzEzMDpCUjpCUkE6QlJBU0lMOkdPSUFTOlBJTEFSIERFIEdPSUFTCisxMzE6QlI6QlJBOkJSQVNJTDpHT0lBUzpQSVJBQ0FOSlVCQQorMTMyOkJSOkJSQTpCUkFTSUw6R09JQVM6UElSQU5IQVMKKzEzMzpCUjpCUkE6QlJBU0lMOkdPSUFTOlBJUkVOT1BPTElTCisxMzQ6QlI6QlJBOkJSQVNJTDpHT0lBUzpQSVJFUyBETyBSSU8KKzEzNTpCUjpCUkE6QlJBU0lMOkdPSUFTOlBMQU5BTFRJTkEKKzEzNjpCUjpCUkE6QlJBU0lMOkdPSUFTOlBPTlRBTElOQQorMTM3OkJSOkJSQTpCUkFTSUw6R09JQVM6UE9SQU5HQVRVCisxMzg6QlI6QlJBOkJSQVNJTDpHT0lBUzpQT1JURUxBTkRJQQorMTM5OkJSOkJSQTpCUkFTSUw6R09JQVM6UE9TU0UKKzE0MDpCUjpCUkE6QlJBU0lMOkdPSUFTOlFVSVJJTk9QT0xJUworMTQxOkJSOkJSQTpCUkFTSUw6R09JQVM6UklBTE1BCisxNDI6QlI6QlJBOkJSQVNJTDpHT0lBUzpSSUFOQVBPTElTCisxNDM6QlI6QlJBOkJSQVNJTDpHT0lBUzpSSU8gVkVSREUKKzE0NDpCUjpCUkE6QlJBU0lMOkdPSUFTOlJVQklBVEFCQQorMTQ1OkJSOkJSQTpCUkFTSUw6R09JQVM6Uy5CQVJCQVJBIEQnR09JCisxNDY6QlI6QlJBOkJSQVNJTDpHT0lBUzpTLkZDTy5ERSBHT0lBUworMTQ3OkJSOkJSQTpCUkFTSUw6R09JQVM6Uy5IRUxFTkEgRCdHT0lBCisxNDg6QlI6QlJBOkJSQVNJTDpHT0lBUzpTLkpPQU8gREFMSUFOQworMTQ5OkJSOkJSQTpCUkFTSUw6R09JQVM6Uy5MVUlTIEQnTU9OVEVTCisxNTA6QlI6QlJBOkJSQVNJTDpHT0lBUzpTLk1JR1VFTCBEQVJBR1UKKzE1MTpCUjpCUkE6QlJBU0lMOkdPSUFTOlMuUklUQSBEJ0FSQUdVQQorMTUyOkJSOkJSQTpCUkFTSUw6R09JQVM6Uy5ST1NBIERFIEdPSUFTCisxNTM6QlI6QlJBOkJSQVNJTDpHT0lBUzpTLlRFUkVTQSBER09JQVMKKzE1NDpCUjpCUkE6QlJBU0lMOkdPSUFTOlMuVEVSRVpJTkhBIERHCisxNTU6QlI6QlJBOkJSQVNJTDpHT0lBUzpTQU5DTEVSTEFORElBCisxNTY6QlI6QlJBOkJSQVNJTDpHT0lBUzpTQU8gRE9NSU5HT1MKKzE1NzpCUjpCUkE6QlJBU0lMOkdPSUFTOlNBTyBTSU1BTworMTU4OkJSOkJSQTpCUkFTSUw6R09JQVM6U0VSUkFOT1BPTElTCisxNTk6QlI6QlJBOkJSQVNJTDpHT0lBUzpTSUxWQU5JQQorMTYwOkJSOkJSQTpCUkFTSUw6R09JQVM6U0lUSU8gRCdBQkFESUEKKzE2MTpCUjpCUkE6QlJBU0lMOkdPSUFTOlNUQS5DUlVaIEQnR09JQQorMTYyOkJSOkJSQTpCUkFTSUw6R09JQVM6VEFRVUFSQUwgRCdHT0lBCisxNjM6QlI6QlJBOkJSQVNJTDpHT0lBUzpUUkVTIFJBTkNIT1MKKzE2NDpCUjpCUkE6QlJBU0lMOkdPSUFTOlRSSU5EQURFCisxNjU6QlI6QlJBOkJSQVNJTDpHT0lBUzpUVVJWQU5JQQorMTY2OkJSOkJSQTpCUkFTSUw6R09JQVM6VVJVQUNVCisxNjc6QlI6QlJBOkJSQVNJTDpHT0lBUzpVUlVBTkEKKzE2ODpCUjpCUkE6QlJBU0lMOkdPSUFTOlVSVVRBSQorMTY5OkJSOkJSQTpCUkFTSUw6R09JQVM6VkFSSkFPCisxNzA6QlI6QlJBOkJSQVNJTDpHT0lBUzpWSUFOT1BPTElTCisxOkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU086QUNPUklaQUwKKzI6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTzpBTFRPIEFSQUdVQUlBCiszOkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU086QUxUTyBHQVJDQVMKKzQ6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTzpBTFRPIFBBUkFHVUFJCis1OkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU086QVJBR1VBSU5IQQorNjpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPOkFSRU5BUE9MSVMKKzc6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTzpBUklQVUFOQQorODpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPOkJBUkFPIERFIE1FTEdBQworOTpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPOkJBUlJBIERPIEdBUkNBUworMTA6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTzpCQVJSQSBET1MgQlVHUkUKKzExOkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU086Q0FDRVJFUworMTI6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTzpDSEFQQURBIERPUyBHLgorMTM6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTzpDVUlBQkEKKzE0OkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU086RElBTUFOVElOTworMTU6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTzpET00gQVFVSU5PCisxNjpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPOkdSQUwgQ0FSTkVJUk8KKzE3OkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU086R1VJUkFUSU5HQQorMTg6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTzpJVElRVUlSQQorMTk6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTzpKQUNJQVJBCisyMDpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPOkxVQ0lBUkEKKzIxOkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU086TUFUTyBHUk9TU08KKzIyOkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU086TUlSQVNTT0wgRE8gTy4KKzIzOkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU086Ti5TLiBMSVZSQU1FTlRPCisyNDpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPOk5PQlJFUworMjU6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTzpOT1JURUxBTkRJQQorMjY6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTzpQRURSQSBQUkVUQQorMjc6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTzpQT0NPTkUKKzI4OkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU086UE9OVEUgQlJBTkNBCisyOTpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPOlBPWE9SRU8KKzMwOkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU086UFRPIERPUyBHQVVDSE9TCiszMTpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPOlJPTkRPTk9QT0xJUworMzI6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTzpST1NBUklPIE9FU1RFCiszMzpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPOlMuIEEuRE8gTEVWRVJHRQorMzQ6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTzpTQU8gRkVMSVggWElOR1UKKzM1OkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU086VEFOR0FSQSBEQSBTRVJSCiszNjpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPOlRFU09VUk8KKzM3OkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU086VE9SSVhPUkVVCiszODpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPOlZBUlpFQSBHUkFOREUKKzE6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpBZ3VkbworMjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkFqdXJpY2FiYQorMzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkFsZWNyaW0KKzQ6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpBbGVncmV0ZQorNTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkFscGVzdHJlCis2OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6QWx2b3JhZGEKKzc6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpBbnRhIEdvcmRhCis4OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6QW50b25pbyBQcmFkbworOTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkFyYXRpYmEKKzEwOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6QXJyb2lvIEdyYW5kZQorMTE6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpBcnJvaW8gZGUgTWVpbworMTI6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpBcnJvaW8gZG9zIFJhdG9zCisxMzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkFydm9yZXppbmhhCisxNDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkF1Z3VzdG8gUGVzdGFuYQorMTU6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpCYWplCisxNjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkJhcmFvIGRlIENvdGVqaXAKKzE3OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6QmFycmEgZG8gUmliZWlyYQorMTg6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpCYXJyYWNhbworMTk6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpCZW50byBHb25jYWx2ZXMKKzIwOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Qm9hIFZpc3RhIGRvIEJ1cgorMjE6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpCb2Nhcm9jYQorMjI6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpCb20gSmVzdXMKKzIzOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Qm9tIFJldGlybyBkbyBTdQorMjQ6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpCcmFnYQorMjU6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpCdXRpYQorMjY6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpDYWNhcGF2YSBkbyBTdWwKKzI3OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Q2FjZXF1aQorMjg6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpDYWNob2VpcmEgZG8gU3VsCisyOTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkNhY2hvZWlyaW5oYQorMzA6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpDYWNpcXVlIERvYmxlCiszMTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkNhaWJhdGUKKzMyOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Q2FtYXF1YQorMzM6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpDYW1iYXJhIGRvIFN1bAorMzQ6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpDYW1waW5hcyBkYXMgTWlzCiszNTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkNhbXBpbmFzIGRvIFN1bAorMzY6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpDYW1wbyBCb20KKzM3OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Q2FtcG8gTm92bworMzg6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpDYW1wbyBSZWFsCiszOTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkNhbmRlbGFyaWEKKzQwOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Q2FuZGlkbyBHb2RvaQorNDE6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpDYW5lbGEKKzQyOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Q2FuZ3VjdQorNDM6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpDYW5vYXMKKzQ0OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Q2FyYXppbmhvCis0NTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkNhcmxvcyBCYXJib3NhCis0NjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkNhc2NhCis0NzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkNhdHVpcGUKKzQ4OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Q2F4aWFzIGRvIFN1bAorNDk6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpDZXJybyBsYXJnbworNTA6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpDaGFwYWRhCis1MTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkNoaWFwZXRhCis1MjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkNpYWNhcmEKKzUzOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Q2lyaWFjbworNTQ6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpDb2xvcmFkbworNTU6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpDb25kb3IKKzU2OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Q29uc3RhbnRpbmEKKzU3OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Q29yb25lbCBCaWNhY28KKzU4OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Q3JpY2l1bWFsCis1OTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkNydXogQWx0YQorNjA6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpDcnV6ZWlybyBkbyBTdWwKKzYxOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6RGF2aWQgQ2FuYWJhcnJvCis2MjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkRvaXMgSXJtYW9zCis2MzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkRvbSBGZWxpY2lhbm8KKzY0OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6RG9tIFBlZHJpdG8KKzY1OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6RG9uYSBGcmFuY2lzY2EKKzY2OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6RW5jYW50YWRvCis2NzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkVuY3J1emlsaGFkYSBkbworNjg6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpFcmV4aW0KKzY5OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6RXJ2YWwKKzcwOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6RXJ2YWwgR3JhbmRlCis3MTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkVydmFsIFNlY28KKzcyOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6RXNtZXJhbGRhCis3MzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkVzcHVtb3NvCis3NDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkVzdGFuY2lhIFZlbGhhCis3NTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkVzdGVpbworNzY6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpFc3RyZWxhCis3NzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkZhcnJvdXBpbGhhCis3ODpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkZheGluYWwgZG8gU290dXIKKzc5OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6RmVsaXoKKzgwOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6RmxvcmVzIGRhIEN1bmhhCis4MTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkZvbnRvdXJhIFhhdmllcgorODI6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpGb3JtaWd1ZWlybworODM6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpGcmVkZXJpY28gV2VzdHBoCis4NDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkdhcmliYWxkaQorODU6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpHYXVyYW1hCis4NjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkdlbmVyYWwgQ2FtYXJhCis4NzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkdldHVsaW8gVmFyZ2FzCis4ODpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkdyYW1hZG8KKzg5OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6R3JhdmF0YWkKKzkwOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6R3VhaWJhCis5MTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkd1YXBvcmUKKzkyOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6R3VhcmFuaSBkYXMgTWlzcworOTM6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpIb3Jpem9udGluYQorOTQ6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpIdW1haXRhCis5NTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkliaWFjYQorOTY6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpJYmlyYWlhcmFzCis5NzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOklncmVqaW5oYQorOTg6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpJanVpCis5OTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOklsb3BvbGlzCisxMDA6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpJbmRlcGVuZGVuY2lhCisxMDE6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpJcmFpCisxMDI6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpJc2xhCisxMDM6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpJdGFxdWkKKzEwNDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkl0YXRpYmEgZG8gc3VsCisxMDU6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpJdm90aQorMTA2OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6SmFjdXRpbmdhCisxMDc6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpKYWd1YXJhbworMTA4OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6SmFndWFyaQorMTA5OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6SmlydWEKKzExMDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkp1bGlvIGRlIENhc3RpbGgKKzExMTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkxhLiBkYSBsYXZhZ2VtCisxMTI6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpMYS4gZG8gcGVpeGUKKzExMzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkxhLiBkb3MgYmFycm9zCisxMTQ6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpMYS4gaXRhcGV2aQorMTE1OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6TGFnbyBuLm4KKzExNjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkxhZ29hIFZlcm1lbGhhCisxMTc6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpMYWdvYSBtYW5ndWVpcmEKKzExODpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkxhamVhZG8KKzExOTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkxhdnJhcyBkbyBTdWwKKzEyMDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOkxpYmVyYXRvIFNhbHphbm8KKzEyMTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOk1hY2hhZGluaG8KKzEyMjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOk1hcmF1CisxMjM6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpNYXJjaW9uaWxpbyBEaWFzCisxMjQ6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpNYXJpYW5vIE1vcm8KKzEyNTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOk1hdGEKKzEyNjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOk1heGltaWxpYW5vIGRlIEEKKzEyNzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOk1pcmFndWFpCisxMjg6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpNb250ZW5lZ3JvCisxMjk6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpNb3N0YXJkYXMKKzEzMDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOk11Y3VtCisxMzE6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpOb25vYWkKKzEzMjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOk5vdmEgQXJhY2EKKzEzMzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOk5vdmEgQmFzc2FubworMTM0OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Tm92YSBCcmVzY2lhCisxMzU6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpOb3ZhIFBhbG1hCisxMzY6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpOb3ZhIFBldHJvcG9saXMKKzEzNzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOk5vdmEgUHJhdGEKKzEzODpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOk5vdm8gSGFtYnVyZ28KKzEzOTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOk9zb3JpbworMTQwOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6UGFpbSBGaWxobworMTQxOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6UGFsbWVpcmEgZGFzIE1pcworMTQyOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6UGFsbWl0aW5ob3MKKzE0MzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlBhbmFtYmkKKzE0NDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlBhcmFpCisxNDU6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpQYXNzbyBGdW5kbworMTQ2OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6UGVkcm8gT3NvcmlvCisxNDc6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpQZWp1Y2FyYQorMTQ4OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6UGVsb3RhcworMTQ5OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6UGluaGVpcm8gTWFjaGFkbworMTUwOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6UGlyYXRpbmkKKzE1MTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlBsYW5hbHRvCisxNTI6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpQb3J0YW8KKzE1MzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlBvcnRvIEFsZWdyZQorMTU0OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6UG9ydG8gTHVjZW5hCisxNTU6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpQdW50YSBkZSB0YXBlcworMTU2OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6UHV0aW5nYQorMTU3OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6UXVhcmFpCisxNTg6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpSZWRlbnRvcmEKKzE1OTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlJlcHIuIGRlIHBhc3NvIGYKKzE2MDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlJlcHIuZGEgRXJuZXN0aW4KKzE2MTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlJlcHJlLlBvc3NvIFJlYWwKKzE2MjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlJlc3RpbmdhIFNlY2EKKzE2MzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlJpbyBHcmFuZGUKKzE2NDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlJpbyBQYXJkbworMTY1OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Um9jYSBTYWxlcworMTY2OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Um9kZWlvIEJvbml0bworMTY3OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Um9sYW50ZQorMTY4OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Um9uZGEgQWx0YQorMTY5OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Um9uZGluaGEKKzE3MDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlJvcXVlIEdvbnphbGVzCisxNzE6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpSb3NhcmlvIGRvIFN1bAorMTcyOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6Uy5WaWNlbnRlIGRvIFN1bAorMTczOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6U2FsdmFkb3IgZG8gU3VsCisxNzQ6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpTYW5hbmR1dmEKKzE3NTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlNhbnRhIENydXogZG8gU3UKKzE3NjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlNhbnRhIE1hcmlhCisxNzc6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpTYW50YSBSb3NhCisxNzg6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpTYW50YW5hIGRhIEJvYSBWCisxNzk6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpTYW50YW5hIGRvIGxpdnJhCisxODA6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpTYW50aWFnbworMTgxOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6U2FudG8gQW5nZWxvCisxODI6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpTYW50byBBbnRvbmlvCisxODM6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpTYW50byBBdWd1c3RvCisxODQ6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpTYW50byBjcmlzdG8KKzE4NTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlNhbyBCb3JqYQorMTg2OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6U2FvIEZjby4gZGUgQXNzaQorMTg3OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6U2FvIEZjby4gZGUgUGF1bAorMTg4OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6U2FvIEdhYnJpZWwKKzE4OTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlNhbyBKZXJvbmltbworMTkwOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6U2FvIEpvc2UgZG8gTm9ydAorMTkxOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6U2FvIEpvc2UgZG8gT3VybworMTkyOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6U2FvIExlb3BvbGRvCisxOTM6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpTYW8gTG91cmVuY28gZG8KKzE5NDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlNhbyBMdWlzIEdvbnphZ2EKKzE5NTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlNhbyBNYXJjb3MKKzE5NjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlNhbyBNYXJ0aW5obworMTk3OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6U2FvIE5pY29sYXUKKzE5ODpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlNhbyBQYXVsbyBkYXMgTWkKKzE5OTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlNhbyBQZWRybyBkbyBTdWwKKzIwMDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlNhbyBTZWJhc3RpYW8gZG8KKzIwMTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlNhbyBTZXBlCisyMDI6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpTYW8gVmFsZW50aW0KKzIwMzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlNhcGlyYW5nYQorMjA0OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6U2FwdWNhaWEgZG8gU3VsCisyMDU6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpTYXJhbmRpCisyMDY6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpTZWJlcmkKKzIwNzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlNlbGJhY2gKKzIwODpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlNlcmFmaW5hIENvcnJlaWEKKzIwOTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlNlcnRhbworMjEwOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6U2V2ZXJpYW5vIGRlIEFsbQorMjExOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6U29icmFkaW5obworMjEyOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6U29sZWRhZGUKKzIxMzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlN0YS5CYXJiYXJhIGRvIFMKKzIxNDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlN0YS5WaXRvcmlhIGRvIFAKKzIxNTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlN0by5BbnRvbmlvIGRhcworMjE2OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6VGFwZWphcmEKKzIxNzpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlRhcGVyYQorMjE4OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6VGFwZXMKKzIxOTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlRhcXVhcmEKKzIyMDpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlRhcXVhcmkKKzIyMTpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlRlbmVudGUgUG9ydGVsYQorMjIyOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6VG9ycmVzCisyMjM6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpUcmVzIENvcm9hcworMjI0OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6VHJlcyBkZSBNYWlvCisyMjU6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpUcmVzIHBhc3NvcworMjI2OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6VHJpdW5mbworMjI3OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6VHVjdW5kdXZhCisyMjg6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpUdXBhbmNpcmV0YQorMjI5OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6VHVwYXJlbmRpCisyMzA6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpVcnVndWFpYW5hCisyMzE6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpWYWNhcmlhCisyMzI6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpWZW5hbmNpbyBBaXJlcworMjMzOkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6VmVyYSBDcnV6CisyMzQ6QlI6QlJBOkJSQVNJTDpSSU8gR1JBTkRFIERPIFNVTDpWZXJhbm9wb2xpcworMjM1OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6VmlhZHV0b3MKKzIzNjpCUjpCUkE6QlJBU0lMOlJJTyBHUkFOREUgRE8gU1VMOlZpYW1hbworMjM3OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6VmljZW50ZSBEdXRyYQorMjM4OkJSOkJSQTpCUkFTSUw6UklPIEdSQU5ERSBETyBTVUw6VmljdG9yIEdyYWVmZgorMTpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOkFOR1JBIERPUyBSRUlTCisyOkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86QVJBUlVBTUEKKzM6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpBUkFSVUFOQQorNDpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOkJBUlJBIERPIFBJUkFJCis1OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86QkFSUkEgTUFOU0EKKzY6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpCT00gSkFSRElNCis3OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86Q0FCTyBGUklPCis4OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86Q0FDSE9FSVJBUyBEIE1BQworOTpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOkNBTUJVQ0kKKzEwOkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86Q0FNUE9TCisxMTpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOkNBTlRBR0FMTworMTI6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpDQVJNTworMTM6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpDQVNJTUlSTyBEIEFCUkVVCisxNDpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOkNPTkNFSUNBTyBNQUNBQlUKKzE1OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86Q09SREVJUk8KKzE2OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86RFVBUyBCQVJSQVMKKzE3OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86RFVRVUUgREUgQ0FYSUFTCisxODpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOkVOR0VOSEVJUk8gUEFVTE8KKzE5OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86SVRBQk9SQUkKKzIwOkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86SVRBR1VBSQorMjE6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpJVEFPQ0FSQQorMjI6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpJVEFQRVJVTkEKKzIzOkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86TEEuIERFIEFSQVJVQU1BCisyNDpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOkxBLiBERSBJTUJPQUNJQ0EKKzI1OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86TEEuIERFIEpBQ09ORQorMjY6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpMQS4gRE8gQ0FNUEVMTworMjc6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpMQS4gVkVSTUVMSEEKKzI4OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86TEFHT0EgRkVJQQorMjk6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpMQUpFIERPIE1VUklBRQorMzA6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpNQUNBRQorMzE6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpNQUdFCiszMjpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOk1BTkdBUkFUSUJBCiszMzpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOk1BUklDQQorMzQ6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpNRU5ERVMKKzM1OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86TUlHVUVMIFBFUkVJUkEKKzM2OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86TUlSQUNFTUEKKzM3OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86TkFUSVZJREFERQorMzg6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpOSUxPUE9MSVMKKzM5OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86TklURVJPSQorNDA6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpOT1ZBIEZSSUJVUkdPCis0MTpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOk5PVkEgSUdVQUNVCis0MjpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOlBBUkFDQU1CSQorNDM6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpQQVJBSUJBIERPIFNVTAorNDQ6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpQQVJBVEkKKzQ1OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86UEVUUk9QT0xJUworNDY6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpQSVJBSQorNDc6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpQT1JDSVVOQ1VMQQorNDg6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpSRVNFTkRFCis0OTpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOlJFU0VOREUgKEhpZHJvLikKKzUwOkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86UklPIEJPTklUTworNTE6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpSSU8gQ0xBUk8KKzUyOkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86UklPIERBUyBGTE9SRVMKKzUzOkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86UklPIERFIEpBTkVJUk8KKzU0OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86UyBKT0FPIERFIE1FUklUSQorNTU6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpTIE1BUklBIE1BREFMRU5BCis1NjpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOlMgU0VCQVNUSUFPIEQgQUwKKzU3OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86U0FOVE8gQU5UT05JTyBQLgorNTg6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpTQU8gRklERUxJUworNTk6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpTQU8gR09OQ0FMTworNjA6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpTQU8gSk9BTyBCQVJSQQorNjE6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpTQU8gUEVEUk8gQUxERUlBCis2MjpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOlNBUFVDQUlBCis2MzpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOlNBUVVBUkVNQQorNjQ6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpTSUxWQSBKQVJESU0KKzY1OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86U1VNSURPVVJPCis2NjpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOlRFUkVTT1BPTElTCis2NzpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOlRSQUpBTk8gRCJNT1JBSVMKKzY4OkJSOkJSQTpCUkFTSUw6UklPIERFIEpBTkVJUk86VFJFUyBSSU9TCis2OTpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOlZBTEVOQ0lBCis3MDpCUjpCUkE6QlJBU0lMOlJJTyBERSBKQU5FSVJPOlZBU1NPVVJBUworNzE6QlI6QlJBOkJSQVNJTDpSSU8gREUgSkFORUlSTzpWT0xUQSBSRURPTkRBCisxOkJSOkJSQTpCUkFTSUw6QkFISUE6QUJBSVJBCisyOkJSOkJSQTpCUkFTSUw6QkFISUE6QUJBUkUKKzM6QlI6QlJBOkJSQVNJTDpCQUhJQTpBQ0FKVVRJQkEKKzQ6QlI6QlJBOkJSQVNJTDpCQUhJQTpBR1VBIEZSSUEKKzU6QlI6QlJBOkJSQVNJTDpCQUhJQTpBR1VBIFFVRU5URQorNjpCUjpCUkE6QlJBU0lMOkJBSElBOkFJUVVBUkEKKzc6QlI6QlJBOkJSQVNJTDpCQUhJQTpBTEFHT0lOSEFTCis4OkJSOkJSQTpCUkFTSUw6QkFISUE6QUxDT0JBQ0EKKzk6QlI6QlJBOkJSQVNJTDpCQUhJQTpBTE1BRElOQQorMTA6QlI6QlJBOkJSQVNJTDpCQUhJQTpBTUFSR09TQQorMTE6QlI6QlJBOkJSQVNJTDpCQUhJQTpBTUVMSUEgUk9EUklHVUVaCisxMjpCUjpCUkE6QlJBU0lMOkJBSElBOkFOQUdFCisxMzpCUjpCUkE6QlJBU0lMOkJBSElBOkFOREFSQUkKKzE0OkJSOkJSQTpCUkFTSUw6QkFISUE6QU5HSUNBTAorMTU6QlI6QlJBOkJSQVNJTDpCQUhJQTpBTkdVRVJBCisxNjpCUjpCUkE6QlJBU0lMOkJBSElBOkFOVEFTCisxNzpCUjpCUkE6QlJBU0lMOkJBSElBOkFOVE9OSU8gQ0FSRE9TTworMTg6QlI6QlJBOkJSQVNJTDpCQUhJQTpBTlRPTklPIEdPTkNBTFZFCisxOTpCUjpCUkE6QlJBU0lMOkJBSElBOkFQT1JBCisyMDpCUjpCUkE6QlJBU0lMOkJBSElBOkFSQUNBVFUKKzIxOkJSOkJSQTpCUkFTSUw6QkFISUE6QVJBQ0kKKzIyOkJSOkJSQTpCUkFTSUw6QkFISUE6QVJBTUFSSQorMjM6QlI6QlJBOkJSQVNJTDpCQUhJQTpBUkFUVUlQRQorMjQ6QlI6QlJBOkJSQVNJTDpCQUhJQTpBVVJFTElOTyBMRUFMCisyNTpCUjpCUkE6QlJBU0lMOkJBSElBOkJBSUFOT1BPTElTCisyNjpCUjpCUkE6QlJBU0lMOkJBSElBOkJBSVhBIEdSQU5ERQorMjc6QlI6QlJBOkJSQVNJTDpCQUhJQTpCQVJSQQorMjg6QlI6QlJBOkJSQVNJTDpCQUhJQTpCQVJSQSBEQSBDSE9DQQorMjk6QlI6QlJBOkJSQVNJTDpCQUhJQTpCQVJSQSBEQSBFU1RJVkEKKzMwOkJSOkJSQTpCUkFTSUw6QkFISUE6QkFSUkEgRE8gTUVOREVTCiszMTpCUjpCUkE6QlJBU0lMOkJBSElBOkJBUlJBIERPIFJPQ0hBCiszMjpCUjpCUkE6QlJBU0lMOkJBSElBOkJBUlJFSVJBUworMzM6QlI6QlJBOkJSQVNJTDpCQUhJQTpCQVJSTyBQUkVUTworMzQ6QlI6QlJBOkJSQVNJTDpCQUhJQTpCRUxNT05URQorMzU6QlI6QlJBOkJSQVNJTDpCQUhJQTpCRUxPIENBTVBPCiszNjpCUjpCUkE6QlJBU0lMOkJBSElBOkJJUklUSU5HQQorMzc6QlI6QlJBOkJSQVNJTDpCQUhJQTpCT0EgTk9WQQorMzg6QlI6QlJBOkJSQVNJTDpCQUhJQTpCT0EgVklTVEEgVFVQSU0KKzM5OkJSOkJSQTpCUkFTSUw6QkFISUE6Qk9NIEpFU1VTIERBIEwuCis0MDpCUjpCUkE6QlJBU0lMOkJBSElBOkJPTklOQUwKKzQxOkJSOkJSQTpCUkFTSUw6QkFISUE6Qk9RVUlSQQorNDI6QlI6QlJBOkJSQVNJTDpCQUhJQTpCT1RVUE9SQQorNDM6QlI6QlJBOkJSQVNJTDpCQUhJQTpCUkVKT0VTCis0NDpCUjpCUkE6QlJBU0lMOkJBSElBOkJSRUpPTEFORElBCis0NTpCUjpCUkE6QlJBU0lMOkJBSElBOkJST1RBUyBERSBNLgorNDY6QlI6QlJBOkJSQVNJTDpCQUhJQTpCUlVNQURPCis0NzpCUjpCUkE6QlJBU0lMOkJBSElBOkJVRVJBUkVNQQorNDg6QlI6QlJBOkJSQVNJTDpCQUhJQTpDLiBETyBDT0lURQorNDk6QlI6QlJBOkJSQVNJTDpCQUhJQTpDQUFUSUJBCis1MDpCUjpCUkE6QlJBU0lMOkJBSElBOkNBQ0hPRUlSQQorNTE6QlI6QlJBOkJSQVNJTDpCQUhJQTpDQUNVTEUKKzUyOkJSOkJSQTpCUkFTSUw6QkFISUE6Q0FFTQorNTM6QlI6QlJBOkJSQVNJTDpCQUhJQTpDQUVUSVRFCis1NDpCUjpCUkE6QlJBU0lMOkJBSElBOkNBRkFSTkFVTQorNTU6QlI6QlJBOkJSQVNJTDpCQUhJQTpDQUlSVQorNTY6QlI6QlJBOkJSQVNJTDpCQUhJQTpDQUxERUlSQU8gR1JBTkRFCis1NzpCUjpCUkE6QlJBU0lMOkJBSElBOkNBTUFDQU4KKzU4OkJSOkJSQTpCUkFTSUw6QkFISUE6Q0FNQUNBUkkKKzU5OkJSOkJSQTpCUkFTSUw6QkFISUE6Q0FNQU1VCis2MDpCUjpCUkE6QlJBU0lMOkJBSElBOkNBTVBPIEFMRUdSRSBERQorNjE6QlI6QlJBOkJSQVNJTDpCQUhJQTpDQU1QTyBGT1JNT1NPCis2MjpCUjpCUkE6QlJBU0lMOkJBSElBOkNBTkFQT0xJUworNjM6QlI6QlJBOkJSQVNJTDpCQUhJQTpDQU5BUkFOQQorNjQ6QlI6QlJBOkJSQVNJTDpCQUhJQTpDQU5BVklFSVJBUworNjU6QlI6QlJBOkJSQVNJTDpCQUhJQTpDQU5ERUFMCis2NjpCUjpCUkE6QlJBU0lMOkJBSElBOkNBTkRFSUFTCis2NzpCUjpCUkE6QlJBU0lMOkJBSElBOkNBTkRJQkEKKzY4OkJSOkJSQTpCUkFTSUw6QkFISUE6Q0FORElETyBTQUxFUworNjk6QlI6QlJBOkJSQVNJTDpCQUhJQTpDQU5TQU5DQU8KKzcwOkJSOkJSQTpCUkFTSUw6QkFISUE6Q0FSQVZFTEFTCis3MTpCUjpCUkE6QlJBU0lMOkJBSElBOkNBUkRFQUwgREEgU0lMVkEKKzcyOkJSOkJSQTpCUkFTSUw6QkFISUE6Q0FSSU5IQU5IQQorNzM6QlI6QlJBOkJSQVNJTDpCQUhJQTpDQVNBIE5PVkEKKzc0OkJSOkJSQTpCUkFTSUw6QkFISUE6Q0FTVFJPIEFMVkVTCis3NTpCUjpCUkE6QlJBU0lMOkJBSElBOkNBVE9MQU5ESUEKKzc2OkJSOkJSQTpCUkFTSUw6QkFISUE6Q0FUVQorNzc6QlI6QlJBOkJSQVNJTDpCQUhJQTpDRU5UUkFMCis3ODpCUjpCUkE6QlJBU0lMOkJBSElBOkNIT1JST0NITworNzk6QlI6QlJBOkJSQVNJTDpCQUhJQTpDSUNFUk8gREFOVEFTCis4MDpCUjpCUkE6QlJBU0lMOkJBSElBOkNJUE8KKzgxOkJSOkJSQTpCUkFTSUw6QkFISUE6Q09BUkFDSQorODI6QlI6QlJBOkJSQVNJTDpCQUhJQTpDT0NPUworODM6QlI6QlJBOkJSQVNJTDpCQUhJQTpDT05DRUkuRCBKQUNVSVBFCis4NDpCUjpCUkE6QlJBU0lMOkJBSElBOkNPTkNFSUMuRCBBTE1FSUQKKzg1OkJSOkJSQTpCUkFTSUw6QkFISUE6Q09OQ0VJQ0EuRCBGRUlSQQorODY6QlI6QlJBOkJSQVNJTDpCQUhJQTpDT05ERQorODc6QlI6QlJBOkJSQVNJTDpCQUhJQTpDT05ERVVCQQorODg6QlI6QlJBOkJSQVNJTDpCQUhJQTpDT05URU5EQVMgRE8gUy4KKzg5OkJSOkJSQTpCUkFTSUw6QkFISUE6Q09SQUNBTyBERSBNQVJJQQorOTA6QlI6QlJBOkJSQVNJTDpCQUhJQTpDT1JERUlST1MKKzkxOkJSOkJSQTpCUkFTSUw6QkFISUE6Q09SSUJFCis5MjpCUjpCUkE6QlJBU0lMOkJBSElBOkNPUk9ORUwgSk9BTyBTQQorOTM6QlI6QlJBOkJSQVNJTDpCQUhJQTpDT1JSRU5USU5BCis5NDpCUjpCUkE6QlJBU0lMOkJBSElBOkNPVEVHSVBFCis5NTpCUjpCUkE6QlJBU0lMOkJBSElBOkNSQVZPTEFORElBCis5NjpCUjpCUkE6QlJBU0lMOkJBSElBOkNSSVNPUE9MSVMKKzk3OkJSOkJSQTpCUkFTSUw6QkFISUE6Q1JJU1RPUE9MSVMKKzk4OkJSOkJSQTpCUkFTSUw6QkFISUE6Q1JVWiBEQVMgQUxNQVMKKzk5OkJSOkJSQTpCUkFTSUw6QkFISUE6Q1VSQUNBCisxMDA6QlI6QlJBOkJSQVNJTDpCQUhJQTpEQVJJTyBNRUlSQQorMTAxOkJSOkJSQTpCUkFTSUw6QkFISUE6RE9NIEJBU0lMSU8KKzEwMjpCUjpCUkE6QlJBU0lMOkJBSElBOkRPTSBNQUNFRE8gQ09TVEEKKzEwMzpCUjpCUkE6QlJBU0lMOkJBSElBOkVMSVNJTyBNRURSQURPCisxMDQ6QlI6QlJBOkJSQVNJTDpCQUhJQTpFTkNSVVpJTEhBREEKKzEwNTpCUjpCUkE6QlJBU0lMOkJBSElBOkVOVFJFIFJJT1MKKzEwNjpCUjpCUkE6QlJBU0lMOkJBSElBOkVTUExBTkFEQQorMTA3OkJSOkJSQTpCUkFTSUw6QkFISUE6RVVDTElERVMgRCBDVU5IQQorMTA4OkJSOkJSQTpCUkFTSUw6QkFISUE6RkVJUkEgREUgU0FOVEFOQQorMTA5OkJSOkJSQTpCUkFTSUw6QkFISUE6RklSTUlOTyBBTFZFUworMTEwOkJSOkJSQTpCUkFTSUw6QkFISUE6RkxPUkVTVEEgQVpVTAorMTExOkJSOkJSQTpCUkFTSUw6QkFISUE6Rk9STU9TQSBETyBSSU8gUAorMTEyOkJSOkJSQTpCUkFTSUw6QkFISUE6R0FORFUKKzExMzpCUjpCUkE6QlJBU0lMOkJBSElBOkdFTlRJTyBETyBPVVJPCisxMTQ6QlI6QlJBOkJSQVNJTDpCQUhJQTpHTE9SSUEKKzExNTpCUjpCUkE6QlJBU0lMOkJBSElBOkdPTkdPR0kKKzExNjpCUjpCUkE6QlJBU0lMOkJBSElBOkdPVkVSTi5NQU5HQUJFSVIKKzExNzpCUjpCUkE6QlJBU0lMOkJBSElBOkdVQVJBVElOR0EKKzExODpCUjpCUkE6QlJBU0lMOkJBSElBOkdVTkFNQkkKKzExOTpCUjpCUkE6QlJBU0lMOkJBSElBOklBQ1UKKzEyMDpCUjpCUkE6QlJBU0lMOkJBSElBOklCSUFTU1VDRQorMTIxOkJSOkJSQTpCUkFTSUw6QkFISUE6SUJJQ0FSQUkKKzEyMjpCUjpCUkE6QlJBU0lMOkJBSElBOklCSUNPQVJBCisxMjM6QlI6QlJBOkJSQVNJTDpCQUhJQTpJQklDVUkKKzEyNDpCUjpCUkE6QlJBU0lMOkJBSElBOklCSVBFQkEKKzEyNTpCUjpCUkE6QlJBU0lMOkJBSElBOklCSVBJVEFOR0EKKzEyNjpCUjpCUkE6QlJBU0lMOkJBSElBOklCSVFVRVJBCisxMjc6QlI6QlJBOkJSQVNJTDpCQUhJQTpJQklSQVBJVEFOR0EKKzEyODpCUjpCUkE6QlJBU0lMOkJBSElBOklCSVJBUFVBCisxMjk6QlI6QlJBOkJSQVNJTDpCQUhJQTpJQklSQVRBSUEKKzEzMDpCUjpCUkE6QlJBU0lMOkJBSElBOklCSVRJQVJBCisxMzE6QlI6QlJBOkJSQVNJTDpCQUhJQTpJQklUSVRBCisxMzI6QlI6QlJBOkJSQVNJTDpCQUhJQTpJQk9USVJBTUEKKzEzMzpCUjpCUkE6QlJBU0lMOkJBSElBOklDSFUKKzEzNDpCUjpCUkE6QlJBU0lMOkJBSElBOklHQVBPUkEKKzEzNTpCUjpCUkE6QlJBU0lMOkJBSElBOklHVUFJCisxMzY6QlI6QlJBOkJSQVNJTDpCQUhJQTpJTEhFVVMKKzEzNzpCUjpCUkE6QlJBU0lMOkJBSElBOklOSEFNQlVQRQorMTM4OkJSOkJSQTpCUkFTSUw6QkFISUE6SVBFQ0FFVEEKKzEzOTpCUjpCUkE6QlJBU0lMOkJBSElBOklQSUFVCisxNDA6QlI6QlJBOkJSQVNJTDpCQUhJQTpJUElSQQorMTQxOkJSOkJSQTpCUkFTSUw6QkFISUE6SVBVUElBUkEKKzE0MjpCUjpCUkE6QlJBU0lMOkJBSElBOklSQUpVQkEKKzE0MzpCUjpCUkE6QlJBU0lMOkJBSElBOklSQU1BSUEKKzE0NDpCUjpCUkE6QlJBU0lMOkJBSElBOklSQVFVQVJBCisxNDU6QlI6QlJBOkJSQVNJTDpCQUhJQTpJUkFSQQorMTQ2OkJSOkJSQTpCUkFTSUw6QkFISUE6SVJFQ0UKKzE0NzpCUjpCUkE6QlJBU0lMOkJBSElBOklUQUJFUEkKKzE0ODpCUjpCUkE6QlJBU0lMOkJBSElBOklUQUJFUkFCQQorMTQ5OkJSOkJSQTpCUkFTSUw6QkFISUE6SVRBQlVOQQorMTUwOkJSOkJSQTpCUkFTSUw6QkFISUE6SVRBQ0FSRQorMTUxOkJSOkJSQTpCUkFTSUw6QkFISUE6SVRBRVRFCisxNTI6QlI6QlJBOkJSQVNJTDpCQUhJQTpJVEFHSQorMTUzOkJSOkJSQTpCUkFTSUw6QkFISUE6SVRBR0lCQQorMTU0OkJSOkJSQTpCUkFTSUw6QkFISUE6SVRBR0lNSVJJTQorMTU1OkJSOkJSQTpCUkFTSUw6QkFISUE6SVRBSlUgRE8gQ09MT05JQQorMTU2OkJSOkJSQTpCUkFTSUw6QkFISUE6SVRBSlVJUEUKKzE1NzpCUjpCUkE6QlJBU0lMOkJBSElBOklUQU1BUkFKVQorMTU4OkJSOkJSQTpCUkFTSUw6QkFISUE6SVRBTUFSSQorMTU5OkJSOkJSQTpCUkFTSUw6QkFISUE6SVRBTUJFCisxNjA6QlI6QlJBOkJSQVNJTDpCQUhJQTpJVEFOQUdSQQorMTYxOkJSOkJSQTpCUkFTSUw6QkFISUE6SVRBTkhFTQorMTYyOkJSOkJSQTpCUkFTSUw6QkFISUE6SVRBUEFSSUNBCisxNjM6QlI6QlJBOkJSQVNJTDpCQUhJQTpJVEFQRQorMTY0OkJSOkJSQTpCUkFTSUw6QkFISUE6SVRBUEVUSU5HQQorMTY1OkJSOkJSQTpCUkFTSUw6QkFISUE6SVRBUElDVVJVCisxNjY6QlI6QlJBOkJSQVNJTDpCQUhJQTpJVEFQSVJBTkdBCisxNjc6QlI6QlJBOkJSQVNJTDpCQUhJQTpJVEFRVUFSQQorMTY4OkJSOkJSQTpCUkFTSUw6QkFISUE6SVRBUkFOVElNCisxNjk6QlI6QlJBOkJSQVNJTDpCQUhJQTpJVElSVUNVCisxNzA6QlI6QlJBOkJSQVNJTDpCQUhJQTpJVElVQkEKKzE3MTpCUjpCUkE6QlJBU0lMOkJBSElBOklUT1JPUk8KKzE3MjpCUjpCUkE6QlJBU0lMOkJBSElBOklUVUFDVQorMTczOkJSOkJSQTpCUkFTSUw6QkFISUE6SVRVQkVSQQorMTc0OkJSOkJSQTpCUkFTSUw6QkFISUE6SkFDQVJBQ0kKKzE3NTpCUjpCUkE6QlJBU0lMOkJBSElBOkpBQ09CSU5BCisxNzY6QlI6QlJBOkJSQVNJTDpCQUhJQTpKQUdVQVFVQVJBCisxNzc6QlI6QlJBOkJSQVNJTDpCQUhJQTpKQUdVQVJBUkkKKzE3ODpCUjpCUkE6QlJBU0lMOkJBSElBOkpBR1VBUklQRQorMTc5OkJSOkJSQTpCUkFTSUw6QkFISUE6SkFOREFJUkEKKzE4MDpCUjpCUkE6QlJBU0lMOkJBSElBOkpFUVVJRQorMTgxOkJSOkJSQTpCUkFTSUw6QkFISUE6SkVRVUlSSUNBCisxODI6QlI6QlJBOkJSQVNJTDpCQUhJQTpKRVJFTU9BQk8KKzE4MzpCUjpCUkE6QlJBU0lMOkJBSElBOkpJVEFVTkEKKzE4NDpCUjpCUkE6QlJBU0lMOkJBSElBOkpVQVpFSVJPCisxODU6QlI6QlJBOkJSQVNJTDpCQUhJQTpKVVNTQVJBCisxODY6QlI6QlJBOkJSQVNJTDpCQUhJQTpKVVNTSUFQRQorMTg3OkJSOkJSQTpCUkFTSUw6QkFISUE6TEFGQUlFVEUgQ09VVElOSAorMTg4OkJSOkJSQTpCUkFTSUw6QkFISUE6TEFKRQorMTg5OkJSOkJSQTpCUkFTSUw6QkFISUE6TEFKRURBTworMTkwOkJSOkJSQTpCUkFTSUw6QkFISUE6TEFKRURJTkhPCisxOTE6QlI6QlJBOkJSQVNJTDpCQUhJQTpMQU1BUkFPCisxOTI6QlI6QlJBOkJSQVNJTDpCQUhJQTpMQVVSTyBERSBGUkVJVEFTCisxOTM6QlI6QlJBOkJSQVNJTDpCQUhJQTpMRU5DT0lTCisxOTQ6QlI6QlJBOkJSQVNJTDpCQUhJQTpMSUNJTklPIERFIEEuCisxOTU6QlI6QlJBOkJSQVNJTDpCQUhJQTpMSVZSQU1FTlRPIERPIEIuCisxOTY6QlI6QlJBOkJSQVNJTDpCQUhJQTpNQUNBSlVCQQorMTk3OkJSOkJSQTpCUkFTSUw6QkFISUE6TUFDQVJBTkkKKzE5ODpCUjpCUkE6QlJBU0lMOkJBSElBOk1BQ0FVQkFTCisxOTk6QlI6QlJBOkJSQVNJTDpCQUhJQTpNQUNVUlVSRQorMjAwOkJSOkJSQTpCUkFTSUw6QkFISUE6TUFJUVVJTklRVUUKKzIwMTpCUjpCUkE6QlJBU0lMOkJBSElBOk1BSVJJCisyMDI6QlI6QlJBOkJSQVNJTDpCQUhJQTpNQUxIQURBCisyMDM6QlI6QlJBOkJSQVNJTDpCQUhJQTpNQUxIQURBIERFIFBFRC4KKzIwNDpCUjpCUkE6QlJBU0lMOkJBSElBOk1BTlVFTCBWSVRPUklOTworMjA1OkJSOkJSQTpCUkFTSUw6QkFISUE6TUFSQUNBUworMjA2OkJSOkJSQTpCUkFTSUw6QkFISUE6TUFSQUdPR0lQRQorMjA3OkJSOkJSQTpCUkFTSUw6QkFISUE6TUFSQVUKKzIwODpCUjpCUkE6QlJBU0lMOkJBSElBOk1BUkNJT05JTElPIFNPVVoKKzIwOTpCUjpCUkE6QlJBU0lMOkJBSElBOk1BU0NPVEUKKzIxMDpCUjpCUkE6QlJBU0lMOkJBSElBOk1BVEEgREUgU0FPIEpPQU8KKzIxMTpCUjpCUkE6QlJBU0lMOkJBSElBOk1FREVJUk9TIE5FVE8KKzIxMjpCUjpCUkE6QlJBU0lMOkJBSElBOk1JR1VFTCBDQUxNT04KKzIxMzpCUjpCUkE6QlJBU0lMOkJBSElBOk1JTEFHUkVTCisyMTQ6QlI6QlJBOkJSQVNJTDpCQUhJQTpNSVJBTkdBQkEKKzIxNTpCUjpCUkE6QlJBU0lMOkJBSElBOk1PTlRFIFNBTlRPCisyMTY6QlI6QlJBOkJSQVNJTDpCQUhJQTpNT1JQQVJBCisyMTc6QlI6QlJBOkJSQVNJTDpCQUhJQTpNT1JSTyBETyBDSEFQRVUKKzIxODpCUjpCUkE6QlJBU0lMOkJBSElBOk1PUlRVR0FCQQorMjE5OkJSOkJSQTpCUkFTSUw6QkFISUE6TVVDVUdFCisyMjA6QlI6QlJBOkJSQVNJTDpCQUhJQTpNVUNVUkkKKzIyMTpCUjpCUkE6QlJBU0lMOkJBSElBOk1VTkRPIE5PVk8KKzIyMjpCUjpCUkE6QlJBU0lMOkJBSElBOk1VTklaIEZFUlJFSVJBCisyMjM6QlI6QlJBOkJSQVNJTDpCQUhJQTpNVVJJVElCQQorMjI0OkJSOkJSQTpCUkFTSUw6QkFISUE6TVVUVUlQRQorMjI1OkJSOkJSQTpCUkFTSUw6QkFISUE6TkFaQVJFCisyMjY6QlI6QlJBOkJSQVNJTDpCQUhJQTpOSUxPIFBFQ0FOSEEKKzIyNzpCUjpCUkE6QlJBU0lMOkJBSElBOk5PVkEgQ0FOQUEKKzIyODpCUjpCUkE6QlJBU0lMOkJBSElBOk5PVkEgSVRBUkFOQQorMjI5OkJSOkJSQTpCUkFTSUw6QkFISUE6Tk9WQSBTT1VSRQorMjMwOkJSOkJSQTpCUkFTSUw6QkFISUE6Tk9WQSBWSUNPU0EKKzIzMTpCUjpCUkE6QlJBU0lMOkJBSElBOk9MSU5ESU5BCisyMzI6QlI6QlJBOkJSQVNJTDpCQUhJQTpPTElWRVJJQSBET1MgQi4KKzIzMzpCUjpCUkE6QlJBU0lMOkJBSElBOk9VUklDQU5HQVMKKzIzNDpCUjpCUkE6QlJBU0lMOkJBSElBOlAuIEpBTklPIFFVQURST1MKKzIzNTpCUjpCUkE6QlJBU0lMOkJBSElBOlBBTE1BUyBERSBNLkEuCisyMzY6QlI6QlJBOkJSQVNJTDpCQUhJQTpQQUxNRUlSQVMKKzIzNzpCUjpCUkE6QlJBU0lMOkJBSElBOlBBUkFNSVJJTQorMjM4OkJSOkJSQTpCUkFTSUw6QkFISUE6UEFSQVRJTkdBCisyMzk6QlI6QlJBOkJSQVNJTDpCQUhJQTpQQVJJUElSQU5HQQorMjQwOkJSOkJSQTpCUkFTSUw6QkFISUE6UEFVIEJSQVNJTAorMjQxOkJSOkJSQTpCUkFTSUw6QkFISUE6UEFVTE8gQUZPTlNPCisyNDI6QlI6QlJBOkJSQVNJTDpCQUhJQTpQRURSQU8KKzI0MzpCUjpCUkE6QlJBU0lMOkJBSElBOlBFRFJPIEFMRVhBTkRSRQorMjQ0OkJSOkJSQTpCUkFTSUw6QkFISUE6UElBVEEKKzI0NTpCUjpCUkE6QlJBU0lMOkJBSElBOlBJTEFPIEFSQ0FETworMjQ2OkJSOkJSQTpCUkFTSUw6QkFISUE6UElOREFJCisyNDc6QlI6QlJBOkJSQVNJTDpCQUhJQTpQSU5ET0JBQ1UKKzI0ODpCUjpCUkE6QlJBU0lMOkJBSElBOlBJUklQQQorMjQ5OkJSOkJSQTpCUkFTSUw6QkFISUE6UElSSVRJQkEKKzI1MDpCUjpCUkE6QlJBU0lMOkJBSElBOlBMQU5BTFRJTk8KKzI1MTpCUjpCUkE6QlJBU0lMOkJBSElBOlBMQU5BTFRPCisyNTI6QlI6QlJBOkJSQVNJTDpCQUhJQTpQT0NPRVMKKzI1MzpCUjpCUkE6QlJBU0lMOkJBSElBOlBPSlVDQQorMjU0OkJSOkJSQTpCUkFTSUw6QkFISUE6UE9SVE8gU0VHVVJPCisyNTU6QlI6QlJBOkJSQVNJTDpCQUhJQTpQT1RJUkFHVUEKKzI1NjpCUjpCUkE6QlJBU0lMOkJBSElBOlBSQURPCisyNTc6QlI6QlJBOkJSQVNJTDpCQUhJQTpQUkVTLiBEVVRSQQorMjU4OkJSOkJSQTpCUkFTSUw6QkFISUE6UVVFSU1BREFTCisyNTk6QlI6QlJBOkJSQVNJTDpCQUhJQTpRVUlKSU5HVUUKKzI2MDpCUjpCUkE6QlJBU0lMOkJBSElBOlIuIERPIEpBQ1VJUEUKKzI2MTpCUjpCUkE6QlJBU0lMOkJBSElBOlJFTUFOU08KKzI2MjpCUjpCUkE6QlJBU0lMOkJBSElBOlJFVElST0xBTkRJQQorMjYzOkJSOkJSQTpCUkFTSUw6QkFISUE6UklBQ0hBTyBEQVMgTkVWRQorMjY0OkJSOkJSQTpCUkFTSUw6QkFISUE6UklBQ0hPIERFIFNBTlQuCisyNjU6QlI6QlJBOkJSQVNJTDpCQUhJQTpSSUJFSVJBIEQgQU1QQVJPCisyNjY6QlI6QlJBOkJSQVNJTDpCQUhJQTpSSUJFSVJBIEQgUE9NQkFMCisyNjc6QlI6QlJBOkJSQVNJTDpCQUhJQTpSSU8gREUgQ09OVEFTCisyNjg6QlI6QlJBOkJSQVNJTDpCQUhJQTpSSU8gRE8gQU5UT05JTworMjY5OkJSOkJSQTpCUkFTSUw6QkFISUE6UklPIERPIFBJUkVTCisyNzA6QlI6QlJBOkJSQVNJTDpCQUhJQTpSSU8gUkVBTAorMjcxOkJSOkJSQTpCUkFTSUw6QkFISUE6Uk9ERUxBUworMjcyOkJSOkJSQTpCUkFTSUw6QkFISUE6UlVZIEJBUkJPU0EKKzI3MzpCUjpCUkE6QlJBU0lMOkJBSElBOlMuRlNDTy5ETyBDT05ERQorMjc0OkJSOkJSQTpCUkFTSUw6QkFISUE6Uy5HT05DQUxPIEQgQ0FNUAorMjc1OkJSOkJSQTpCUkFTSUw6QkFISUE6Uy5NSUdVRUwgRCBNQVRBUworMjc2OkJSOkJSQTpCUkFTSUw6QkFISUE6Uy5TRUJBU1QuRCBQQVNTRQorMjc3OkJSOkJSQTpCUkFTSUw6QkFISUE6U0FMSU5BUyBNQVJHQVJJRAorMjc4OkJSOkJSQTpCUkFTSUw6QkFISUE6U0FMVkFET1IKKzI3OTpCUjpCUkE6QlJBU0lMOkJBSElBOlNBTlRBIEJBUkJBUkEKKzI4MDpCUjpCUkE6QlJBU0lMOkJBSElBOlNBTlRBIEJSSUdJREEKKzI4MTpCUjpCUkE6QlJBU0lMOkJBSElBOlNBTlRBIElORVMKKzI4MjpCUjpCUkE6QlJBU0lMOkJBSElBOlNBTlRBIE1BUklBIERBIFYKKzI4MzpCUjpCUkE6QlJBU0lMOkJBSElBOlNBTlRBIFRFUkVaSU5IQQorMjg0OkJSOkJSQTpCUkFTSUw6QkFISUE6U0FOVEFMVVoKKzI4NTpCUjpCUkE6QlJBU0lMOkJBSElBOlNBTlRBTkEKKzI4NjpCUjpCUkE6QlJBU0lMOkJBSElBOlNBTlRBTk9QT0xJUworMjg3OkJSOkJSQTpCUkFTSUw6QkFISUE6U0FOVE8gQU1BUk8KKzI4ODpCUjpCUkE6QlJBU0lMOkJBSElBOlNBTlRPIEVTVEVWQU8KKzI4OTpCUjpCUkE6QlJBU0lMOkJBSElBOlNBTyBERVNJREVSSU8KKzI5MDpCUjpCUkE6QlJBU0lMOkJBSElBOlNBTyBGRUxJUEUKKzI5MTpCUjpCUkE6QlJBU0lMOkJBSElBOlNBTyBGRUxJWAorMjkyOkJSOkJSQTpCUkFTSUw6QkFISUE6U0FQRUFDVQorMjkzOkJSOkJSQTpCUkFTSUw6QkFISUE6U0FUSVJPIERJQVMKKzI5NDpCUjpCUkE6QlJBU0lMOkJBSElBOlNBVURFCisyOTU6QlI6QlJBOkJSQVNJTDpCQUhJQTpTRUFCUkEKKzI5NjpCUjpCUkE6QlJBU0lMOkJBSElBOlNFQkFTVElBTyBMLgorMjk3OkJSOkJSQTpCUkFTSUw6QkFISUE6U0VOSE9SIERPIEJPTkZJTQorMjk4OkJSOkJSQTpCUkFTSUw6QkFISUE6U0VOVE8gU0UKKzI5OTpCUjpCUkE6QlJBU0lMOkJBSElBOlNFUlJBIERPVVJBREEKKzMwMDpCUjpCUkE6QlJBU0lMOkJBSElBOlNFUlJBIFBSRVRBCiszMDE6QlI6QlJBOkJSQVNJTDpCQUhJQTpTRVJSSU5IQQorMzAyOkJSOkJSQTpCUkFTSUw6QkFISUE6U0VSUk9MQU5ESUEKKzMwMzpCUjpCUkE6QlJBU0lMOkJBSElBOlNJTU9FUyBGSUxITworMzA0OkJSOkJSQTpCUkFTSUw6QkFISUE6U09VVE8gU09BUkVTCiszMDU6QlI6QlJBOkJSQVNJTDpCQUhJQTpTVEEgUklUQSBEIENBU1NJCiszMDY6QlI6QlJBOkJSQVNJTDpCQUhJQTpTVEEuQ1JVWiBDQUJSQUxJCiszMDc6QlI6QlJBOkJSQVNJTDpCQUhJQTpTVEEuQ1JVWiBEQSBWSVRPCiszMDg6QlI6QlJBOkJSQVNJTDpCQUhJQTpTVE8uQU5UTy5EIEpFU1VTCiszMDk6QlI6QlJBOkJSQVNJTDpCQUhJQTpUQUJPQ0FTIERPIEJSRUpPCiszMTA6QlI6QlJBOkJSQVNJTDpCQUhJQTpUQU5IQUNVCiszMTE6QlI6QlJBOkJSQVNJTDpCQUhJQTpUQU5RVUlOSE8KKzMxMjpCUjpCUkE6QlJBU0lMOkJBSElBOlRBUEVST0EKKzMxMzpCUjpCUkE6QlJBU0lMOkJBSElBOlRBUElSQU1VVEEKKzMxNDpCUjpCUkE6QlJBU0lMOkJBSElBOlRFT0RPUk8gU0FNUEFJTworMzE1OkJSOkJSQTpCUkFTSUw6QkFISUE6VEVPRklMQU5ESUEKKzMxNjpCUjpCUkE6QlJBU0lMOkJBSElBOlRFT0xBTkRJQQorMzE3OkJSOkJSQTpCUkFTSUw6QkFISUE6VEVSUkEgTk9WQQorMzE4OkJSOkJSQTpCUkFTSUw6QkFISUE6VFJFTUVEQUwKKzMxOTpCUjpCUkE6QlJBU0lMOkJBSElBOlRVQ0FOTworMzIwOkJSOkJSQTpCUkFTSUw6QkFISUE6VUFVQQorMzIxOkJSOkJSQTpCUkFTSUw6QkFISUE6VUJBSVJBCiszMjI6QlI6QlJBOkJSQVNJTDpCQUhJQTpVQkFJVEFCQQorMzIzOkJSOkJSQTpCUkFTSUw6QkFISUE6VUJBVEEKKzMyNDpCUjpCUkE6QlJBU0lMOkJBSElBOlVJQkFJCiszMjU6QlI6QlJBOkJSQVNJTDpCQUhJQTpVTkEKKzMyNjpCUjpCUkE6QlJBU0lMOkJBSElBOlVSQU5ESQorMzI3OkJSOkJSQTpCUkFTSUw6QkFISUE6VVJVQ1VDQQorMzI4OkJSOkJSQTpCUkFTSUw6QkFISUE6VVRJTkdBCiszMjk6QlI6QlJBOkJSQVNJTDpCQUhJQTpWQUxFTkNBCiszMzA6QlI6QlJBOkJSQVNJTDpCQUhJQTpWQUxFTlRFCiszMzE6QlI6QlJBOkJSQVNJTDpCQUhJQTpWQVJaRUEgRE8gUE9DTworMzMyOkJSOkJSQTpCUkFTSUw6QkFISUE6VkVSQSBDUlVaCiszMzM6QlI6QlJBOkJSQVNJTDpCQUhJQTpWSVRPUklBIEQgQ09OUVVJCiszMzQ6QlI6QlJBOkJSQVNJTDpCQUhJQTpXQUdORVIKKzMzNTpCUjpCUkE6QlJBU0lMOkJBSElBOldFTkNFU0xBVSBHVUlNQVIKKzMzNjpCUjpCUkE6QlJBU0lMOkJBSElBOlhJUVVFLVhJUVVFCisxOkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86QWZvbnNvIENsYXVkaW8KKzI6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpBbGVncmUKKzM6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpBbGZyZWRvIENoYXZlcworNDpCUjpCUkE6QlJBU0lMOkVTUElSSVRVIFNBTlRPOkFuY2hpZXRhCis1OkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86QXJhY3J1egorNjpCUjpCUkE6QlJBU0lMOkVTUElSSVRVIFNBTlRPOkF0dGlsaW8gVml2YWNxdWEKKzc6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpCYWl4byBHdWFuZHUKKzg6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpCYXJyYSBEZSBTLiBGcmFuCis5OkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86Qm9hIEVzcGVyYW5jYQorMTA6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpCb20gSmVzdXMgRCJOdGUuCisxMTpCUjpCUkE6QlJBU0lMOkVTUElSSVRVIFNBTlRPOkNhY2hvZWlybyBEZSBJdGEKKzEyOkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86Q2FyaWFjaWNhCisxMzpCUjpCUkE6QlJBU0lMOkVTUElSSVRVIFNBTlRPOkNhc3RlbG8KKzE0OkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86Q29sYXRpbmEKKzE1OkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86Q29uY2VpY2FvIEJhcnJhCisxNjpCUjpCUkE6QlJBU0lMOkVTUElSSVRVIFNBTlRPOkNvbmNlaWNhbyBEbyBDYXMKKzE3OkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86RGl2aW5vIERlIFMuIExvdQorMTg6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpEb21pbmdvcyBNYXJ0aW5zCisxOTpCUjpCUkE6QlJBU0lMOkVTUElSSVRVIFNBTlRPOkRvcmVzIERvIFJpbyBQcmUKKzIwOkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86RnVuZGFvCisyMTpCUjpCUkE6QlJBU0lMOkVTUElSSVRVIFNBTlRPOkd1YWN1aQorMjI6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpHdWFyYXBhcmkKKzIzOkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86SWJpcmFndQorMjQ6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpJY29uaGEKKzI1OkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86SXRhZ3VhY3UKKzI2OkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86SXRhcGVtaXJpbQorMjc6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpJdGFyYW5hCisyODpCUjpCUkE6QlJBU0lMOkVTUElSSVRVIFNBTlRPOkl1bmEKKzI5OkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86SmVyb25pbW8gTW9udGVpcgorMzA6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpMYWdvIEp1cGFyYW5hCiszMTpCUjpCUkE6QlJBU0lMOkVTUElSSVRVIFNBTlRPOkxhZ3VpbmEKKzMyOkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86TGFndW5hCiszMzpCUjpCUkE6QlJBU0lMOkVTUElSSVRVIFNBTlRPOkxhZ3VuYSBDYXB1YmEKKzM0OkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86TGFndW5hIERvIEJvYSBWaQorMzU6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpMYWd1bmEgSmFiYWV0ZQorMzY6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpMYWd1bmEgUGlhYmluaGEKKzM3OkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86TGFndW5hIFRhcGVyYQorMzg6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpMaW5oYXJlcworMzk6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpNYW50ZW5vcG9saXMKKzQwOkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86TWltb3NvIERvIFN1bAorNDE6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpNb250YW5oYQorNDI6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpNdWN1cmljaQorNDM6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpNdW5peiBGcmVpcmUKKzQ0OkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86TXVxdWkKKzQ1OkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86Tm92YSBWZW5lY2lhCis0NjpCUjpCUkE6QlJBU0lMOkVTUElSSVRVIFNBTlRPOlBhbmNhcworNDc6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpQaW5oZWlyb3MKKzQ4OkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86UGl1bWEKKzQ5OkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86UmlvIE5vdm8gRG8gU3VsCis1MDpCUjpCUkE6QlJBU0lMOkVTUElSSVRVIFNBTlRPOlMuIEdhYnJpZWwgRGEgUGEKKzUxOkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86U2FudGEgTGVvcG9sZGluYQorNTI6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpTYW50YSBUZXJlc2EKKzUzOkJSOkJSQTpCUkFTSUw6RVNQSVJJVFUgU0FOVE86U2FvIE1hdGV1cworNTQ6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpTZXJyYQorNTU6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpWaWFuYQorNTY6QlI6QlJBOkJSQVNJTDpFU1BJUklUVSBTQU5UTzpWaWxhIFZlbGhhCis1NzpCUjpCUkE6QlJBU0lMOkVTUElSSVRVIFNBTlRPOlZpdG9yaWEKKzE6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6QUxNQVMKKzI6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6QUxWT1JBREEKKzM6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6QU5BTkFTCis0OkJSOkJSQTpCUkFTSUw6VE9DQU5USU5TOkFSQUdVQUNFTUEKKzU6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6QVJBR1VBQ1UKKzY6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6QVJBR1VBSU5BCis3OkJSOkJSQTpCUkFTSUw6VE9DQU5USU5TOkFSQUdVQVRJTlMKKzg6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6QVJBUE9FTUEKKzk6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6QVJSQUlBUworMTA6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6QVVST1JBIERPIE5PUlRFCisxMTpCUjpCUkE6QlJBU0lMOlRPQ0FOVElOUzpBWElYQSBERSBHT0lBUworMTI6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6QkFCQUNVTEFORElBCisxMzpCUjpCUkE6QlJBU0lMOlRPQ0FOVElOUzpCUkVKSU5ITyBEJ05BWkEKKzE0OkJSOkJSQTpCUkFTSUw6VE9DQU5USU5TOkNPTElOQVMgREUgR09JQQorMTU6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6Q09OQ0VJQ0FPIEQnTk9SCisxNjpCUjpCUkE6QlJBU0lMOlRPQ0FOVElOUzpDT1VUTyBNQUdBTEhBRVMKKzE3OkJSOkJSQTpCUkFTSUw6VE9DQU5USU5TOkNSSVNUQUxBTkRJQQorMTg6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6RElBTk9QT0xJUworMTk6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6RE9JUyBJUk1BT1MgRCdHCisyMDpCUjpCUkE6QlJBU0lMOlRPQ0FOVElOUzpEVUVSRQorMjE6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6RklMQURFTEZJQQorMjI6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6Rk9STU9TTyBEJ0FSQUdVCisyMzpCUjpCUkE6QlJBU0lMOlRPQ0FOVElOUzpHVVJVUEkKKzI0OkJSOkJSQTpCUkFTSUw6VE9DQU5USU5TOklUQUNBSkEKKzI1OkJSOkJSQTpCUkFTSUw6VE9DQU5USU5TOklUQUdVQVRJTlMKKzI2OkJSOkJSQTpCUkFTSUw6VE9DQU5USU5TOklUQVBPUkEgREUgR09JQQorMjc6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6TElaQVJEQQorMjg6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6TUlSQUNFTUEgRCdOT1JUCisyOTpCUjpCUkE6QlJBU0lMOlRPQ0FOVElOUzpNSVJBTk9SVEUKKzMwOkJSOkJSQTpCUkFTSUw6VE9DQU5USU5TOk1PTlRFIERPIENBUk1PCiszMTpCUjpCUkE6QlJBU0lMOlRPQ0FOVElOUzpOQVRJVklEQURFCiszMjpCUjpCUkE6QlJBU0lMOlRPQ0FOVElOUzpOQVpBUkUKKzMzOkJSOkJSQTpCUkFTSUw6VE9DQU5USU5TOk5PVk8gQUNPUkRPCiszNDpCUjpCUkE6QlJBU0lMOlRPQ0FOVElOUzpQLkFMVEEgRCdCT00gSkUKKzM1OkJSOkJSQTpCUkFTSUw6VE9DQU5USU5TOlBBUkFJU08gRCdOT1JURQorMzY6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6UEFSQU5BCiszNzpCUjpCUkE6QlJBU0lMOlRPQ0FOVElOUzpQRURSTyBBRk9OU08KKzM4OkJSOkJSQTpCUkFTSUw6VE9DQU5USU5TOlBFSVhFCiszOTpCUjpCUkE6QlJBU0lMOlRPQ0FOVElOUzpQRVFVSVpFSVJPCis0MDpCUjpCUkE6QlJBU0lMOlRPQ0FOVElOUzpQSUFDQQorNDE6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6UElORE9SQU1BIEQnR09JCis0MjpCUjpCUkE6QlJBU0lMOlRPQ0FOVElOUzpQSVVNCis0MzpCUjpCUkE6QlJBU0lMOlRPQ0FOVElOUzpQT05URSBBTFRBIEROTworNDQ6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6UE9SVE8gTkFDSU9OQUwKKzQ1OkJSOkJSQTpCUkFTSUw6VE9DQU5USU5TOlMuU0VCQVNULkQnVE9DQQorNDY6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6U0lUSU8gTk9WTyBEJ0dPCis0NzpCUjpCUkE6QlJBU0lMOlRPQ0FOVElOUzpUQUdVQVRJTkdVQQorNDg6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6VE9DQU5USU5JQQorNDk6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6VE9DQU5USU5PUE9MSVMKKzUwOkJSOkJSQTpCUkFTSUw6VE9DQU5USU5TOlRVUElSQU1BCis1MTpCUjpCUkE6QlJBU0lMOlRPQ0FOVElOUzpUVVBJUkFOVElOUworNTI6QlI6QlJBOkJSQVNJTDpUT0NBTlRJTlM6WEFNQklPQQorMTpCUjpCUkE6QlJBU0lMOkNFQVJBOkFCQUlBUkEKKzI6QlI6QlJBOkJSQVNJTDpDRUFSQTpBQ0FSQVBFCiszOkJSOkJSQTpCUkFTSUw6Q0VBUkE6QUNBUkFVCis0OkJSOkJSQTpCUkFTSUw6Q0VBUkE6QUNPUElBUkEKKzU6QlI6QlJBOkJSQVNJTDpDRUFSQTpBSVVBQkEKKzY6QlI6QlJBOkJSQVNJTDpDRUFSQTpBTENBTlRBUkFTCis3OkJSOkJSQTpCUkFTSUw6Q0VBUkE6QUxUQU5FSVJBCis4OkJSOkJSQTpCUkFTSUw6Q0VBUkE6QUxUTyBTQU5UTworOTpCUjpCUkE6QlJBU0lMOkNFQVJBOkFNT05UQURBCisxMDpCUjpCUkE6QlJBU0lMOkNFQVJBOkFOVE9OSU5BIERPIE5PUi4KKzExOkJSOkJSQTpCUkFTSUw6Q0VBUkE6QVBVSUFSRVMKKzEyOkJSOkJSQTpCUkFTSUw6Q0VBUkE6QVFVSVJBWgorMTM6QlI6QlJBOkJSQVNJTDpDRUFSQTpBUkFDQVRJCisxNDpCUjpCUkE6QlJBU0lMOkNFQVJBOkFSQUNPSUFCQQorMTU6QlI6QlJBOkJSQVNJTDpDRUFSQTpBUkFSQVUKKzE2OkJSOkJSQTpCUkFTSUw6Q0VBUkE6QVJBUklQRQorMTc6QlI6QlJBOkJSQVNJTDpDRUFSQTpBUkFUVUJBCisxODpCUjpCUkE6QlJBU0lMOkNFQVJBOkFSTkVJUk9aCisxOTpCUjpCUkE6QlJBU0lMOkNFQVJBOkFTU0FSRQorMjA6QlI6QlJBOkJSQVNJTDpDRUFSQTpBVVJPUkEKKzIxOkJSOkJSQTpCUkFTSUw6Q0VBUkE6QkFJWElPCisyMjpCUjpCUkE6QlJBU0lMOkNFQVJBOkJBTkFCVUlVCisyMzpCUjpCUkE6QlJBU0lMOkNFQVJBOkJBUkJBTEhBCisyNDpCUjpCUkE6QlJBU0lMOkNFQVJBOkJBUlJFSVJBCisyNTpCUjpCUkE6QlJBU0lMOkNFQVJBOkJBUlJPCisyNjpCUjpCUkE6QlJBU0lMOkNFQVJBOkJBVFVSSVRFCisyNzpCUjpCUkE6QlJBU0lMOkNFQVJBOkJFQkVSSUJFCisyODpCUjpCUkE6QlJBU0lMOkNFQVJBOkJFTEEgQ1JVWgorMjk6QlI6QlJBOkJSQVNJTDpDRUFSQTpCT0EgVklBR0VNCiszMDpCUjpCUkE6QlJBU0lMOkNFQVJBOkJSRUpPIFNBTlRPCiszMTpCUjpCUkE6QlJBU0lMOkNFQVJBOkNBTU9DSU0KKzMyOkJSOkJSQTpCUkFTSUw6Q0VBUkE6Q0FNUE9TIFNBTEVTCiszMzpCUjpCUkE6QlJBU0lMOkNFQVJBOkNBTklOREUKKzM0OkJSOkJSQTpCUkFTSUw6Q0VBUkE6Q0FQSVNUUkFOTworMzU6QlI6QlJBOkJSQVNJTDpDRUFSQTpDQVJJREFERQorMzY6QlI6QlJBOkJSQVNJTDpDRUFSQTpDQVJJUkUKKzM3OkJSOkJSQTpCUkFTSUw6Q0VBUkE6Q0FSSVJJQUNVCiszODpCUjpCUkE6QlJBU0lMOkNFQVJBOkNBUklVUworMzk6QlI6QlJBOkJSQVNJTDpDRUFSQTpDQVJOQVVCQUwKKzQwOkJSOkJSQTpCUkFTSUw6Q0VBUkE6Q0FTQ0FWRUwKKzQxOkJSOkJSQTpCUkFTSUw6Q0VBUkE6Q0FUQVJJTkEKKzQyOkJSOkJSQTpCUkFTSUw6Q0VBUkE6Q0FVQ0FJQQorNDM6QlI6QlJBOkJSQVNJTDpDRUFSQTpDRURSTworNDQ6QlI6QlJBOkJSQVNJTDpDRUFSQTpDSEFWQUwKKzQ1OkJSOkJSQTpCUkFTSUw6Q0VBUkE6Q0hPUk9aSU5ITworNDY6QlI6QlJBOkJSQVNJTDpDRUFSQTpDT0NPQ0kKKzQ3OkJSOkJSQTpCUkFTSUw6Q0VBUkE6Q09SRUFVCis0ODpCUjpCUkE6QlJBU0lMOkNFQVJBOkNSQVRFVVMKKzQ5OkJSOkJSQTpCUkFTSUw6Q0VBUkE6Q1JBVE8KKzUwOkJSOkJSQTpCUkFTSUw6Q0VBUkE6RVVaRUJJTworNTE6QlI6QlJBOkJSQVNJTDpDRUFSQTpGQVJJQVMgQlJJVE8KKzUyOkJSOkJSQTpCUkFTSUw6Q0VBUkE6Rk9SUVVJTEhBCis1MzpCUjpCUkE6QlJBU0lMOkNFQVJBOkZPUlRBTEVaQQorNTQ6QlI6QlJBOkJSQVNJTDpDRUFSQTpGUkVDSEVJUklOSEEKKzU1OkJSOkJSQTpCUkFTSUw6Q0VBUkE6R0VORVJBTCBTQU1QQUlPCis1NjpCUjpCUkE6QlJBU0lMOkNFQVJBOkdSQUNBCis1NzpCUjpCUkE6QlJBU0lMOkNFQVJBOkdSQU5KQQorNTg6QlI6QlJBOkJSQVNJTDpDRUFSQTpHUkFOSkVJUk8KKzU5OkJSOkJSQTpCUkFTSUw6Q0VBUkE6R1JPQUlSQVMKKzYwOkJSOkJSQTpCUkFTSUw6Q0VBUkE6R1VBSVVCQQorNjE6QlI6QlJBOkJSQVNJTDpDRUFSQTpHVUFSQUNJQUJBIERPIE4uCis2MjpCUjpCUkE6QlJBU0lMOkNFQVJBOkdVQVJBTUlSQU5HQQorNjM6QlI6QlJBOkJSQVNJTDpDRUFSQTpISURST0xBTkRJQQorNjQ6QlI6QlJBOkJSQVNJTDpDRUFSQTpIT1JJWk9OVEUKKzY1OkJSOkJSQTpCUkFTSUw6Q0VBUkE6SUJJQVBJTkEKKzY2OkJSOkJSQTpCUkFTSUw6Q0VBUkE6SUNBUFVJCis2NzpCUjpCUkE6QlJBU0lMOkNFQVJBOklDTworNjg6QlI6QlJBOkJSQVNJTDpDRUFSQTpJR0FVVFUKKzY5OkJSOkJSQTpCUkFTSUw6Q0VBUkE6SU5ERVBFTkRFTkNJQQorNzA6QlI6QlJBOkJSQVNJTDpDRUFSQTpJUEFVTUlSSU0KKzcxOkJSOkJSQTpCUkFTSUw6Q0VBUkE6SVBVCis3MjpCUjpCUkE6QlJBU0lMOkNFQVJBOklQVUVJUkFTCis3MzpCUjpCUkE6QlJBU0lMOkNFQVJBOklSQUNFTUEKKzc0OkJSOkJSQTpCUkFTSUw6Q0VBUkE6SVJBVUNVQkEKKzc1OkJSOkJSQTpCUkFTSUw6Q0VBUkE6SVRBSUNBQkEKKzc2OkJSOkJSQTpCUkFTSUw6Q0VBUkE6SVRBUEFHRQorNzc6QlI6QlJBOkJSQVNJTDpDRUFSQTpJVEFQSVBPQ0EKKzc4OkJSOkJSQTpCUkFTSUw6Q0VBUkE6SVRBUElVTkEKKzc5OkJSOkJSQTpCUkFTSUw6Q0VBUkE6SVRBUkVNQQorODA6QlI6QlJBOkJSQVNJTDpDRUFSQTpJVEFUSVJBCis4MTpCUjpCUkE6QlJBU0lMOkNFQVJBOkpBR1VBUkVUQU1BCis4MjpCUjpCUkE6QlJBU0lMOkNFQVJBOkpBR1VBUklCQVJBCis4MzpCUjpCUkE6QlJBU0lMOkNFQVJBOkpBR1VBUklCRQorODQ6QlI6QlJBOkJSQVNJTDpDRUFSQTpKQUdVQVJVQU5BCis4NTpCUjpCUkE6QlJBU0lMOkNFQVJBOkpBUkRJTQorODY6QlI6QlJBOkJSQVNJTDpDRUFSQTpKQVRJCis4NzpCUjpCUkE6QlJBU0lMOkNFQVJBOkpVQVpFSVJPIERPIE5URQorODg6QlI6QlJBOkJSQVNJTDpDRUFSQTpKVUNBUworODk6QlI6QlJBOkJSQVNJTDpDRUFSQTpMQUdPCis5MDpCUjpCUkE6QlJBU0lMOkNFQVJBOkxBVkFTIERBIE1BTkdBQkUKKzkxOkJSOkJSQTpCUkFTSUw6Q0VBUkE6TElNT0VJUk8gRE8gTk9SLgorOTI6QlI6QlJBOkJSQVNJTDpDRUFSQTpNQURBTEVOQQorOTM6QlI6QlJBOkJSQVNJTDpDRUFSQTpNQVJBQ0FOQVUKKzk0OkJSOkJSQTpCUkFTSUw6Q0VBUkE6TUFSQU5HVUFQRQorOTU6QlI6QlJBOkJSQVNJTDpDRUFSQTpNQVJDTworOTY6QlI6QlJBOkJSQVNJTDpDRUFSQTpNQVJUSU5PUE9MRQorOTc6QlI6QlJBOkJSQVNJTDpDRUFSQTpNQVNTQVBFCis5ODpCUjpCUkE6QlJBU0lMOkNFQVJBOk1FUlVPQ0EKKzk5OkJSOkJSQTpCUkFTSUw6Q0VBUkE6TUlMQUdSRVMKKzEwMDpCUjpCUkE6QlJBU0lMOkNFQVJBOk1JTEhBCisxMDE6QlI6QlJBOkJSQVNJTDpDRUFSQTpNSVNTQU8gVkVMSEEKKzEwMjpCUjpCUkE6QlJBU0lMOkNFQVJBOk1PTUJBQ0EKKzEwMzpCUjpCUkE6QlJBU0lMOkNFQVJBOk1PTlNFTkhPUiBUQUJPU0EKKzEwNDpCUjpCUkE6QlJBU0lMOkNFQVJBOk1PUkFEQSBOT1ZBCisxMDU6QlI6QlJBOkJSQVNJTDpDRUFSQTpNT1JBVUpPCisxMDY6QlI6QlJBOkJSQVNJTDpDRUFSQTpNT1JSSU5IT1MKKzEwNzpCUjpCUkE6QlJBU0lMOkNFQVJBOk1VQ0FNQk8KKzEwODpCUjpCUkE6QlJBU0lMOkNFQVJBOk1VTFVOR1UKKzEwOTpCUjpCUkE6QlJBU0lMOkNFQVJBOk5PVkEgT0xJTkRBCisxMTA6QlI6QlJBOkJSQVNJTDpDRUFSQTpOT1ZBIFJVU1NBUworMTExOkJSOkJSQTpCUkFTSUw6Q0VBUkE6Tk9WTyBPUklFTlRFCisxMTI6QlI6QlJBOkJSQVNJTDpDRUFSQTpPUk9TCisxMTM6QlI6QlJBOkJSQVNJTDpDRUFSQTpQQUNBSlVTCisxMTQ6QlI6QlJBOkJSQVNJTDpDRUFSQTpQQUNBVFVCQQorMTE1OkJSOkJSQTpCUkFTSUw6Q0VBUkE6UEFDT1RJCisxMTY6QlI6QlJBOkJSQVNJTDpDRUFSQTpQQUNVSkEKKzExNzpCUjpCUkE6QlJBU0lMOkNFQVJBOlBBTEhBTk8KKzExODpCUjpCUkE6QlJBU0lMOkNFQVJBOlBBTE1BQ0lBCisxMTk6QlI6QlJBOkJSQVNJTDpDRUFSQTpQQVJBQ1VSVQorMTIwOkJSOkJSQTpCUkFTSUw6Q0VBUkE6UEFSQUlQQUJBCisxMjE6QlI6QlJBOkJSQVNJTDpDRUFSQTpQQVJBTUJVCisxMjI6QlI6QlJBOkJSQVNJTDpDRUFSQTpQQVJBTU9USQorMTIzOkJSOkJSQTpCUkFTSUw6Q0VBUkE6UEVEUkEgQlJBTkNBCisxMjQ6QlI6QlJBOkJSQVNJTDpDRUFSQTpQRU5BRk9SVEUKKzEyNTpCUjpCUkE6QlJBU0lMOkNFQVJBOlBFUkVJUk8KKzEyNjpCUjpCUkE6QlJBU0lMOkNFQVJBOlBFVEVOQ09TVEUKKzEyNzpCUjpCUkE6QlJBU0lMOkNFQVJBOlBJUVVFVCBDQVJORUlSTworMTI4OkJSOkJSQTpCUkFTSUw6Q0VBUkE6UElSRVMgRkVSUkVJUkEKKzEyOTpCUjpCUkE6QlJBU0lMOkNFQVJBOlBPUkFOR0EKKzEzMDpCUjpCUkE6QlJBU0lMOkNFQVJBOlBPUlRFSVJBUworMTMxOkJSOkJSQTpCUkFTSUw6Q0VBUkE6UE9URU5HSQorMTMyOkJSOkJSQTpCUkFTSUw6Q0VBUkE6UE9USVJFVEFNQQorMTMzOkJSOkJSQTpCUkFTSUw6Q0VBUkE6UVVJVEVSSUFOT1BPTEVTCisxMzQ6QlI6QlJBOkJSQVNJTDpDRUFSQTpRVUlYQURBCisxMzU6QlI6QlJBOkJSQVNJTDpDRUFSQTpRVUlYRUxPCisxMzY6QlI6QlJBOkJSQVNJTDpDRUFSQTpRVUlYRVJBTU9CSU0KKzEzNzpCUjpCUkE6QlJBU0lMOkNFQVJBOlFVSVhFUkUKKzEzODpCUjpCUkE6QlJBU0lMOkNFQVJBOlJFREVOQ0FPCisxMzk6QlI6QlJBOkJSQVNJTDpDRUFSQTpSRVJJVVRVQkEKKzE0MDpCUjpCUkE6QlJBU0lMOkNFQVJBOlJVU1NBUworMTQxOkJSOkJSQTpCUkFTSUw6Q0VBUkE6U0FCT0VJUk8KKzE0MjpCUjpCUkE6QlJBU0lMOkNFQVJBOlNBTlRBIFFVSVRFUklBCisxNDM6QlI6QlJBOkJSQVNJTDpDRUFSQTpTQU5UQU5BIERPIEEuLi4uCisxNDQ6QlI6QlJBOkJSQVNJTDpDRUFSQTpTQU5UQU5BIERPIENBUklSCisxNDU6QlI6QlJBOkJSQVNJTDpDRUFSQTpTQU8gQkVORURJVE8KKzE0NjpCUjpCUkE6QlJBU0lMOkNFQVJBOlNBTyBHT05DQUxPIERPIEEKKzE0NzpCUjpCUkE6QlJBU0lMOkNFQVJBOlNBTyBKT0FPIERPIEouCisxNDg6QlI6QlJBOkJSQVNJTDpDRUFSQTpTQU8gTFVJWiBETyBDVVJVCisxNDk6QlI6QlJBOkJSQVNJTDpDRUFSQTpTRU5BRE9SIFBPTVBFVQorMTUwOkJSOkJSQTpCUkFTSUw6Q0VBUkE6U0VOQURPUiBTQQorMTUxOkJSOkJSQTpCUkFTSUw6Q0VBUkE6U09CUkFMCisxNTI6QlI6QlJBOkJSQVNJTDpDRUFSQTpTT0xPTk9QT0xFCisxNTM6QlI6QlJBOkJSQVNJTDpDRUFSQTpUQUJVTEVJUk8gRE8gTlRFCisxNTQ6QlI6QlJBOkJSQVNJTDpDRUFSQTpUQU1CT1JJTAorMTU1OkJSOkJSQTpCUkFTSUw6Q0VBUkE6VEFVQQorMTU2OkJSOkJSQTpCUkFTSUw6Q0VBUkE6VElBTkdVQQorMTU3OkJSOkJSQTpCUkFTSUw6Q0VBUkE6VFJBSVJJCisxNTg6QlI6QlJBOkJSQVNJTDpDRUFSQTpUVVJVUlUKKzE1OTpCUjpCUkE6QlJBU0lMOkNFQVJBOlVCQUpBUkEKKzE2MDpCUjpCUkE6QlJBU0lMOkNFQVJBOlVNQVJJCisxNjE6QlI6QlJBOkJSQVNJTDpDRUFSQTpVTUlSSU0KKzE2MjpCUjpCUkE6QlJBU0lMOkNFQVJBOlVSVUJVUkVUQU1BCisxNjM6QlI6QlJBOkJSQVNJTDpDRUFSQTpVUlVPQ0EKKzE2NDpCUjpCUkE6QlJBU0lMOkNFQVJBOlZBUkpPVEEKKzE2NTpCUjpCUkE6QlJBU0lMOkNFQVJBOlZBUlpFQSBBTEVHUkUKKzE2NjpCUjpCUkE6QlJBU0lMOkNFQVJBOlZJQ09TQSBETyBDRUFSQQorMTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBLiBET1MgRE9VUkFET1MKKzI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QUJBRVRFCiszOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkFCUkUgQ0FNUE8KKzQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QUNBSUFDQQorNTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBQ1VDRU5BCis2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkFHVUEgQk9BCis3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkFHVUEgQ09NUFJJREEKKzg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QUdVQU5JTAorOTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBR1VBUyBGT1JNT1NBUworMTA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QUdVQVMgVkVSTUVMSEFTCisxMTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBSU1PUkVTCisxMjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBSVVSVU9DQQorMTM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QUxBR09BCisxNDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBTEJFUlRJTkEKKzE1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkFMRU0gUEFSQUlCQQorMTY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QUxGRU5BUworMTc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QUxNRU5BUkEKKzE4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkFMUEVSQ0FUQQorMTk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QUxQSU5PUE9MSVMKKzIwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkFMVEVST1NBCisyMTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBTFRPIFJJTyBET0NFCisyMjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBTFZBUkVOR0EKKzIzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkFMVklOT1BPTElTCisyNDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBTFZPUkFEQSBERSBNSU5BCisyNTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBTVBBUk8gREEgU0VSUkEKKzI2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkFORFJBREFTCisyNzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBTkRSRSBGRVJOQU5ERVMKKzI4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkFORFJFTEFORElBCisyOTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBTlRPTklPIENBUkxPUworMzA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QU5UT05JTyBESUFTCiszMTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBTlRPTklPIFBSQURPIERFCiszMjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBUkFDQUkKKzMzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkFSQUNJVEFCQQorMzQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QVJBQ1VBSQorMzU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QVJBR1VBUkkKKzM2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkFSQU5USU5BCiszNzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBUkFQT05HQQorMzg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QVJBUFVBCiszOTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBUkFVSk9TCis0MDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBUkFYQQorNDE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QVJDRUJVUkdPCis0MjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBUkNPUworNDM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QVJFQURPCis0NDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBUkdJUklUQQorNDU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QVJJTk9TCis0NjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBU1RPTEZPIERVVFJBCis0NzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBVEFMRUlBCis0ODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpBVUdVU1RPIERFIExJTUEKKzQ5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJBRVBFTkRJCis1MDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpCQUxESU0KKzUxOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJBTUJVSQorNTI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QkFOREVJUkEKKzUzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJBTkRJRVJBIERPIFNVTAorNTQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QkFSQU8gRCdNT05URSBBCis1NTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpCQVJBTyBERSBDT0NBSVMKKzU2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJBUkJBQ0VOQQorNTc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QkFSUkEgTE9OR0EKKzU4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJBUlJFSVJPIEdSQU5ERQorNTk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QkFSUk9TTworNjA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QkVMQSBWSVNUQSBEJ01JCis2MTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpCRUxNSVJPIEJSQUdBCis2MjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpCRUxPIEhPUklaT05URQorNjM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QkVMTyBPUklFTlRFCis2NDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpCRUxPIFZBTEUKKzY1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJFUklMTworNjY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QkVSVE9QT0xJUworNjc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QkVUSU0KKzY4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJJQVMgRk9SVEVTCis2OTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpCSUNBUworNzA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QklRVUlOSEFTCis3MTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpCT0EgRVNQRVJBTkNBCis3MjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpCT0NBSU5BIERFIE1JTkEKKzczOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJPQ0FJVVZBCis3NDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpCT00gREVTUEFDSE8KKzc1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJPTSBKQVJESU0gRCdNSQorNzY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Qk9NIEpFU1VTIEQnQU1QCis3NzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpCT00gSkVTVVMgRCdHQUwKKzc4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJPTSBKRVNVUyBEQSBQRU4KKzc5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJPTSBSRVBPVVNPCis4MDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpCT00gU1VDRVNTTworODE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Qk9ORklNCis4MjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpCT05GSU5PUE9MSVMgRAorODM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Qk9SREEgREEgTUFUQQorODQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Qk9URUxIT1MKKzg1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJPVFVNSVJJTQorODY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QlJBUyBQSVJFUworODc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6QlJBU0lMSUEgREUgTS4KKzg4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJSQVVOQVMKKzg5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJSQVpPUE9MSVMKKzkwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJSVU1BRElOSE8KKzkxOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJVRU5PIEJSQU5EQU8KKzkyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJVRU5PUE9MSVMKKzkzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJVUklUSVMKKzk0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkJVUklUSVpFSVJPCis5NTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQUJPIFZFUkRFCis5NjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQUNIT0VJUkEgRCdNSU4KKzk3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBQ0hPRUlSQSBERSBNQUMKKzk4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBQ0hPRUlSQSBET1VSQQorOTk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0FFVEFOT1BPTElTCisxMDA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0FFVEUKKzEwMTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQUlBTkEKKzEwMjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQUpVUkkKKzEwMzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQUxEQVMKKzEwNDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQU1BQ0hPCisxMDU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0FNQU5EVUNBSUEKKzEwNjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQU1CVUkKKzEwNzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQU1CVVFVSVJBCisxMDg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0FNUEFOQVJJTworMTA5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBTVBBTkhBCisxMTA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0FNUEVTVFJFCisxMTE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0FNUElOQSBWRVJERQorMTEyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBTVBPIEJFTE8KKzExMzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQU1QTyBETyBNRUlPCisxMTQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0FNUE8gRkxPUklETworMTE1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBTVBPUyBBTFRPUworMTE2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBTVBPUyBHRVJBSVMKKzExNzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQU5BIFZFUkRFCisxMTg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0FOQUEKKzExOTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQU5BUE9MSVMKKzEyMDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQU5ERUlBUworMTIxOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBUEFSQU8KKzEyMjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQVBFTEEgTk9WQQorMTIzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBUEVMSU5IQQorMTI0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBUEVUSU5HQQorMTI1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBUElNIEJSQU5DTworMTI2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBUElOT1BPTElTCisxMjc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0FQSVRBTyAgRU5FQVMKKzEyODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQVBJVE9MSU8KKzEyOTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQVBVVElSQQorMTMwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBUkFJCisxMzE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0FSQU5BSUJBCisxMzI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0FSQU5EQUkKKzEzMzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQVJBTkdPTEEKKzEzNDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQVJBVElOR0EKKzEzNTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQVJBVkFMSE9QT0xJUworMTM2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBUkJPTklUQQorMTM3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBUkVBQ1UKKzEzODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQVJMT1MgQ0hBR0FTCisxMzk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0FSTUVTSUEKKzE0MDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQVJNTyBEJ0NBQ0hPRUkKKzE0MTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQVJNTyBEQSBNQVRBCisxNDI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0FSTU8gREUgTUlOQVMKKzE0MzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQVJNTyBETyBDQUpVUlUKKzE0NDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDQVJNTyBETyBQLgorMTQ1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBUk1PIERPIFJJTyBDLgorMTQ2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBUk1PUE9MSVMgRCdNSQorMTQ3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBUlJBTkNBUworMTQ4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBUlZBTEhPUworMTQ5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBU0EgR1JBTkRFCisxNTA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0FTQ0FMSE8gUklDTworMTUxOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBU1NJQQorMTUyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBU1NJVEVSSVRBCisxNTM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0FUQUdVQVNFUworMTU0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBVEFTIEFMVEFTIEQnTgorMTU1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNBWEFNQlUKKzE1NjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDRURSTyBETyBBQkFFVEUKKzE1NzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDRU5UUkFMIERFIE0uCisxNTg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0VOVFJBTElOQQorMTU5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNIQUNBUkEKKzE2MDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDSEFMRQorMTYxOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNIQVBBREEgRE8gTlRFCisxNjI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0hJQURPUgorMTYzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNJUE9UQU5FQQorMTY0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNMQVJBVkFMCisxNjU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0xBUk8gRE9TIFBPQ09FCisxNjY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q0xBVURJTworMTY3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNPSU1CUkEKKzE2ODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDT0xVTkEKKzE2OTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDT01FTkRBRE9SIEdPTUUKKzE3MDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDT01FUkNJTkhPCisxNzE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q09OQy5EJ01BVE8gREVOCisxNzI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q09OQ0UuRE9TIE9VUk9TCisxNzM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q09OQ0VJLkQnSVBBTkVNCisxNzQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q09OQ0VJQ0FPIERBIEEuCisxNzU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q09OQ0VJQ0FPIERBIFBFRAorMTc2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNPTkNFSUNBTyBEQVMgQQorMTc3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNPTkNFSUNBTyBETyBQLgorMTc4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNPTkNFSUNBTyBSLlZFUkQKKzE3OTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDT05HT05IQUwKKzE4MDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDT05HT05IQVMKKzE4MTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDT05HT05IQVMgRCdOT1IKKzE4MjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDT05RVUlTVEEKKzE4MzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDT05TRUxILkxBRkFJRVQKKzE4NDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDT05TRUxIRUlSTyBQRU4KKzE4NTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDT05TT0xBQ0FPCisxODY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q09OVEFHRU0KKzE4NzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDT1FVRUlSQUwKKzE4ODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDT1IuWEFWSUVSIENIQVYKKzE4OTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDT1JESVNCVVJHTworMTkwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNPUkRJU0xBTkRJQQorMTkxOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNPUklOVE8KKzE5MjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDT1JPQUNJCisxOTM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q09ST0NBTyBERSBKRVNVCisxOTQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q09ST01BTkRFTAorMTk1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNPUk9ORUwgRkFCUklDSQorMTk2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNPUk9ORUwgTVVSVEEKKzE5NzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDT1JPTkVMIFBBQ0hFQ08KKzE5ODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDT1JSRUdPIERBTlRBCisxOTk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q09SUkVHTyBETyBCT00gSgorMjAwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNPUlJFR08gTk9WTworMjAxOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNPVVRPIERFIE0uREUgTQorMjAyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNSSVNUQUlTCisyMDM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q1JJU1RBTElBCisyMDQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q1JJU1RJQU5PIE9UT05JCisyMDU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q1JJU1RJTkEKKzIwNjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDUlVDSUxBTkRJQQorMjA3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkNSVVpFSVJPIERBIEYuCisyMDg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Q1JVWklMSUEKKzIwOTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpDVVJWRUxPCisyMTA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6REFUQVMKKzIxMTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpERUxGSU0gTU9SRUlSQQorMjEyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkRFTEZJTk9QT0xJUworMjEzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkRFU0NPQkVSVE8KKzIxNDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpERVNURS5EJ0VOVFJFIFIKKzIxNTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpERVNURVJSTyBETyBNRUwKKzIxNjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpESUFNQU5USU5BCisyMTc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6RElPR08gRCdWQVNDT05DCisyMTg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6RElPTklTSU8KKzIxOTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpESVZJTkVTSUEKKzIyMDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpESVZJTk8KKzIyMTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpESVZJTk8gRCdMQVJBTkoKKzIyMjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpESVZJTk9MQU5ESUEgRAorMjIzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkRJVklOT1BPTElTCisyMjQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6RElWSVNBIE5PVkEKKzIyNTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpET00gQ0FWQVRJCisyMjY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6RE9NIEpPQVFVSU0KKzIyNzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpET00gU0lMVkVSSU8KKzIyODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpET00gVklDT1NPCisyMjk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6RE9OQSBFVVpFQklBCisyMzA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6RE9SRVMgREUgQ0FNUE9TCisyMzE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6RE9SRVMgREUgRy4KKzIzMjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpET1JFUyBETyBJTkRBSUEKKzIzMzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpET1JFUyBETyBUVVJWTworMjM0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkRPUkVTT1BPTElTCisyMzU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6RE9VUkFET1FVQVJBCisyMzY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6RUxPSSBNRU5ERVMKKzIzNzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpFTkdFTkhFSVJPIENBTEQKKzIzODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpFTkdFTkhFSVJPIE4uCisyMzk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6RU5UUkUgUklPUyBERSBNCisyNDA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6RVJWQUxJQQorMjQxOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkVTTUVSQUxEQVMKKzI0MjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpFU1AuU0FOVE8gRCdET1UKKzI0MzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpFU1BFUkEgRkVMSVoKKzI0NDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpFU1BJTk9TQQorMjQ1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkVTVElWQQorMjQ2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkVTVFJFTEEgREFMVkEKKzI0NzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpFU1RSRUxBIERPIEkuCisyNDg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6RVNUUkVMQSBETyBTVUwKKzI0OTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpFVUdFTk9QT0xJUworMjUwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkVXQkFOSyBEJ0NBTUFSQQorMjUxOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkVYVFJFTUEKKzI1MjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpGQU1BCisyNTM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6RkFSSUEgTEVNT1MKKzI1NDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpGRUxJQ0lPIERPUyBTLgorMjU1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkZFTElTQkVSVE8gQy4KKzI1NjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpGRUxJU0JVUkdPCisyNTc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6RkVMSVhMQU5ESUEKKzI1ODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpGRVJOQU5ERVMgVE9VUkkKKzI1OTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpGRVJST1MKKzI2MDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpGTE9SRVNUQUwKKzI2MTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpGT1JNSUdBCisyNjI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Rk9STU9TTworMjYzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkZPUlRBTEVaQSBERSBNLgorMjY0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkZPUlRVTkEgRCdNSU5BUworMjY1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkZSQU5DSVNDTyBCQURBUgorMjY2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkZSQU5DSVNDTyBEVU1PTgorMjY3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkZSQU5DSVNDTyBTQQorMjY4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkZSRUkgR0FTUEFSCisyNjk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6RlJFSSBJTk9DRU5DSU8KKzI3MDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpGUk9OVEVJUkEKKzI3MTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpGUlVUQUwKKzI3MjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpGVU5JTEFORElBCisyNzM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6R0FMSUxFSUEKKzI3NDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpHT05DQUxWRVMKKzI3NTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpHT05aQUdBCisyNzY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6R09VVkVBCisyNzc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6R09WRVJOQURPUiBWLgorMjc4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkdSQU8gTU9HT0wKKzI3OTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpHUlVQSUFSQQorMjgwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkdVQU5IQUVTCisyODE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6R1VBUEUKKzI4MjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpHVUFSQUNJQUJBCisyODM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6R1VBUkFORVNJQQorMjg0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkdVQVJBTkkKKzI4NTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpHVUFSQVJBCisyODY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6R1VBUkRBLU1PUgorMjg3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkdVQVhVUEUKKzI4ODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpHVUlET1ZBTAorMjg5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkdVSU1BUkFOSUEKKzI5MDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpHVUlSSUNFTUEKKzI5MTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpHVVJJTkhBVEEKKzI5MjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpIRUxJT0RPUkEKKzI5MzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJQVBVCisyOTQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SUJFUlRJT0dBCisyOTU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SUJJQQorMjk2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOklCSUFJCisyOTc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SUJJUkFDSQorMjk4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOklCSVJJVEUKKzI5OTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJQklUSVVSQSBERSBNSU5BCiszMDA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SUJJVFVSVU5BCiszMDE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SUdBUkFQRQorMzAyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOklHQVJBVElOR0EKKzMwMzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJR1VBVEFNQQorMzA0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOklKQUNJCiszMDU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SUxJQ0lORUEKKzMwNjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJTkNPTkZJREVOVEVTCiszMDc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SU5ESUFOT1BPTElTCiszMDg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SU5HQUkKKzMwOTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJTkhBUElNCiszMTA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SU5IQVVNQVMKKzMxMTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJTklNVVRBQkEKKzMxMjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJUEFORU1BCiszMTM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SVBBVElOR0EKKzMxNDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJUElBQ1UKKzMxNTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJUFVJVU5BCiszMTY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SVJBSSBERSBNSU5BUworMzE3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOklUQUJJUkEKKzMxODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJVEFCSVJJTkhBIERFIE0KKzMxOTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJVEFCSVJJVE8KKzMyMDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJVEFDQU1CSVJBCiszMjE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SVRBQ0FSQU1CSQorMzIyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOklUQUdVQVJBCiszMjM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SVRBSVBFCiszMjQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SVRBSlVCQQorMzI1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOklUQU1BUkFORElCQQorMzI2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOklUQU1BUkFUSSBEJ01JTgorMzI3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOklUQU1CQUNVUkkKKzMyODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJVEFNQkUgRCdNQVRPIEQKKzMyOTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJVEFNT0dJCiszMzA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SVRBTU9OVEUKKzMzMTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJVEFOSEFORFUKKzMzMjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJVEFOSE9NSQorMzMzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOklUQU9CSU0KKzMzNDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJVEFQQUdJUEUKKzMzNTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJVEFQRUNFUklDQQorMzM2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOklUQVBFVkEKKzMzNzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJVEFUSUFJVUNVCiszMzg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SVRBVU5BCiszMzk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SVRBVkVSQVZBCiszNDA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SVRJTkdBCiszNDE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SVRVRVRBCiszNDI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SVRVSVVUQUJBCiszNDM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SVRVTUlSSU0KKzM0NDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpJVFVSQU1BCiszNDU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SVRVVElOR0EKKzM0NjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpKQUJPVElDQVRVQkFTCiszNDc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SkFDSU5UTworMzQ4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkpBQ1VJCiszNDk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SkFDVVRJTkdBCiszNTA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SkFHVUFSQUNVCiszNTE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SkFOQVVCQQorMzUyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkpBTlVBUklBCiszNTM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SkFQQVJBSUJBCiszNTQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6SkVDRUFCQQorMzU1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkpFUVVFUkkKKzM1NjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpKRVFVSVRBSQorMzU3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkpFUVVJVElCQQorMzU4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkpFUVVJVElOSE9OSEEKKzM1OTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpKRVNVQU5JQQorMzYwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkpPQUlNQQorMzYxOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkpPQU5FU0lBCiszNjI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Sk9BTyBNT05MRVZBREUKKzM2MzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpKT0FPIFBJTkhFSVJPCiszNjQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Sk9BUVVJTSBGRUxJQ0lPCiszNjU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Sk9SREFOSUEKKzM2NjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpKT1NFIERFIE1FTE8KKzM2NzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpKVUlaIERFIEZPUkEKKzM2ODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpKVVJBTUVOVE8KKzM2OTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpKVVJVQUlBCiszNzA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TEFEQUlOSEEKKzM3MTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpMQUdBTUFSCiszNzI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TEFHQU8gRE9TIFBBVE9TCiszNzM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TEFHTworMzc0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkxBR09BIERBIFBSQVRBCiszNzU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TEFHT0EgRE9VUkFEQQorMzc2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkxBR09BIEZPUk1PU0EKKzM3NzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpMQUdPQSBTQU5UQQorMzc4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkxBSklOSEEKKzM3OTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpMQU1CQVJJCiszODA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TEFNSU0KKzM4MTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpMQVJBTkpBTAorMzgyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkxBU1NBTkNFCiszODM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TEFWUkFTCiszODQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TEVBTkRSTyBGRVJSRUlSCiszODU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TEVPUE9MRElOQQorMzg2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkxJQkVSREFERQorMzg3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkxJTUEgRFVBUlRFCiszODg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TFVNSU5BUklBUworMzg5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOkxVWgorMzkwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1BQ0hBQ0FMSVMKKzM5MTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpNQUNIQURPCiszOTI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TUFEUkUgRCdERVVTIEQnCiszOTM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TUFMQUNBQ0hFVEEKKzM5NDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpNQU5HQQorMzk1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1BTkhVQUNVCiszOTY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TUFOSFVNSVJJTQorMzk3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1BTlRFTkEKKzM5ODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpNQVIgREUgRVNQQU5IQQorMzk5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1BUkFWSUxIQVMKKzQwMDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpNQVJJQSBEQSBGRQorNDAxOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1BUklBTkEKKzQwMjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpNQVJJTEFDCis0MDM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TUFSSVBBIERFIE1JTkFTCis0MDQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TUFSTElFUklBCis0MDU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TUFSTUVMT1BPTElTCis0MDY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TUFSVElOSE8gQ0FNUE9TCis0MDc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TUFURVJMQU5ESUEKKzQwODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpNQVRFVVMgTEVNRQorNDA5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1BVElBUyBCQVJCT1NBCis0MTA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TUFUSVBPCis0MTE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TUFUTyBWRVJERQorNDEyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1BVE9aSU5IT1MKKzQxMzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpNRURFSVJPUworNDE0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1FRElOQQorNDE1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1FTkRFUyBQSU1FTlRFTAorNDE2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1FUkNFUworNDE3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1FU1FVSVRBCis0MTg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TUlOQVMgTk9WQVMKKzQxOTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpNSU5EVVJJCis0MjA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TUlSQUJFTEEKKzQyMTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpNSVJBRE9VUk8KKzQyMjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpNSVJBSQorNDIzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1PRURBCis0MjQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TU9FTUEKKzQyNTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpNT05KT0xPUworNDI2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1PTlNFTkhPUiBQQVVMTworNDI3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1PTlRBTFZBTklBCis0Mjg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TU9OVEUgQUxFR1JFIEQKKzQyOTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpNT05URSBBWlVMCis0MzA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TU9OVEUgQkVMTworNDMxOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1PTlRFIENBUk1FTE8KKzQzMjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpNT05URSBTQU5PIERFIE0KKzQzMzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpNT05URSBTSUFPCis0MzQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TU9OVEVTIENMQVJPUworNDM1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1PUkFEQSBOT1ZBIE1JTkEKKzQzNjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpNT1JSTyBERSBHUkFDQQorNDM3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1PUlJPIERPIFBJTEFSCis0Mzg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TVVOSE9aCis0Mzk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TVVSSUFFCis0NDA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TVVUVU0KKzQ0MTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpNVVRVVElOQQorNDQyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk1VWkFNQklOSE8KKzQ0MzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpOQUNJUCBSQVlEQU4KKzQ0NDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpOQU5VUVVFCis0NDU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6TkFURVJDSUEKKzQ0NjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpOQVpBUkVOTworNDQ3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk5FUE9NVUNFTk8KKzQ0ODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpOT1ZBIEVSQQorNDQ5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk5PVkEgTElNQQorNDUwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk5PVkEgTU9ESUNBCis0NTE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Tk9WQSBQT05URQorNDUyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk5PVkEgUkVTRU5ERQorNDUzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk5PVkEgU0VSUkFOQQorNDU0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk5PVk8gQ1JVWkVJUk8KKzQ1NTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpPLlZFUkRFUyBEIE1JTkEKKzQ1NjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpPTEFSSUEKKzQ1NzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpPTElNUE8gTk9ST05IQQorNDU4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOk9MSVZFSVJBCis0NTk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6T0xJVkVJUkEgRk9SVEVTCis0NjA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6T05DQSBERSBQSVRBTkdVCis0NjE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6T1VSTyBCUkFOQ08KKzQ2MjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpPVVJPIEZJTk8KKzQ2MzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpPVVJPIFBSRVRPCis0NjQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEFEUkUgUEFSQUlTTworNDY1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBBSU5FSVJBUworNDY2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBBSU5TCis0Njc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEFJVkEKKzQ2ODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQQUxNQQorNDY5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBBTVBBCis0NzA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEFQQUdBSU9TCis0NzE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEFSQSBERSBNSU5BUworNDcyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBBUkFDQVRVCis0NzM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEFSQUdVQUNVCis0NzQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEFSQUlTT1BPTElTCis0NzU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEFSQU9QRUJBCis0NzY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEFTU0EgUVVBVFJPCis0Nzc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEFTU0EgVEVNUE8KKzQ3ODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQQVNTQSBWSU5URQorNDc5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBBU1NBQkVNCis0ODA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEFTU09TCis0ODE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEFUT1MgREUgTUlOQVMKKzQ4MjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQQVRST0NJTklPCis0ODM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEFUUk9DSU5JTyBEJ01VCis0ODQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEFVTEEgQ0FORElETworNDg1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBBVUxJU1RBCis0ODY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEFWQU8KKzQ4NzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQRUNBTkhBCis0ODg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEVEUkEgQVpVTAorNDg5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBFRFJBIERPIEFOVEEKKzQ5MDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQRURSQSBETyBJTkRBSUEKKzQ5MTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQRURSQSBET1VSQURBCis0OTI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEVEUkFMVkEKKzQ5MzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQRURSSU5PUE9MSVMKKzQ5NDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQRURSTyBMRU9QT0xETworNDk1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBFRFJPIFRFSVhFSVJBCis0OTY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEVRVUVSSQorNDk3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBFUVVJCis0OTg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UEVSRElHQU8KKzQ5OTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQRVJESVpFUworNTAwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBFUkRPRVMKKzUwMTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQRVNDQURPUgorNTAyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBJQVUKKzUwMzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQSUVEQUQuRCdQT05URQorNTA0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBJRURBREUgRCdHRVJBSQorNTA1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBJRURBREUgRCdSSU8gRworNTA2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBJTUVOVEEKKzUwNzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQSVJBQ0VNQQorNTA4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBJUkFKVUJBCis1MDk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UElSQU5HQQorNTEwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBJUkFOR1VDVQorNTExOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBJUkFOR1VJTkhPCis1MTI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UElSQVBFVElOR0EKKzUxMzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQSVJBUE9SQQorNTE0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBJUkFVQkEKKzUxNTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQSVRBTkdVSQorNTE2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBJVUkKKzUxNzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQTEFOVVJBCis1MTg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UE9DTyBGVU5ETworNTE5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBPQ09TIERFIENBTERBUworNTIwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBPQ1JBTkUKKzUyMTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQT01QRVUKKzUyMjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQT05URSBOT1ZBCis1MjM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UE9SVEVJUklOSEEKKzUyNDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQT1JUTyBGSVJNRQorNTI1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBPVEUKKzUyNjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQT1VTTyBBTEVHUkUKKzUyNzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQT1VTTyBBTFRPCis1Mjg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UFJBRE9TCis1Mjk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UFJBVEEKKzUzMDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQUkFUQVBPTElTCis1MzE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UFJBVElOSEEKKzUzMjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQUkVTLkJFUk5BUkRFUworNTMzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBSRVNJRCBPTEVHQVJJTworNTM0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlBSRVNJREVOVEUgSi4KKzUzNTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpQUkVTSURFTlRFIEsuCis1MzY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UFJFU0lERU5URSBTT0FSCis1Mzc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UFJVREVOVEUgRCdNT1JBCis1Mzg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UVVBUlRFTCBHRVJBTAorNTM5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlFVRUxVWklUQQorNTQwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlJBUE9TT1MKKzU0MTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpSQVVMIFNPQVJFUworNTQyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlJFQ1JFSU8KKzU0MzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpSRVNFTkRFIENPU1RBCis1NDQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UkVTUExFTkRPUgorNTQ1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlJFU1NBUVVJTkhBCis1NDY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UklBQ0hPIERPUyBNQUNBCis1NDc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UklCRUlSQU8gRCdORVZFCis1NDg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UklCRUlSQU8gVkVSTUVMCis1NDk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UklPIEFDSU1BCis1NTA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UklPIENBU0NBCis1NTE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UklPIERPIFBSQURPCis1NTI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UklPIERPQ0UKKzU1MzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpSSU8gRVNQRVJBCis1NTQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UklPIE1BTlNPCis1NTU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UklPIE5PVk8KKzU1NjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpSSU8gUEFSQU5BSUJBCis1NTc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UklPIFBBUkRPIEQnTUlOCis1NTg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UklPIFBJUkFDSUNBQkEKKzU1OTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpSSU8gUE9NQkEKKzU2MDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpSSU8gUFJFVE8KKzU2MTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpSSU8gVkVSTUVMSE8KKzU2MjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpSSVRBUE9MSVMKKzU2MzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpST0NIRURPIERFIE1JTkEKKzU2NDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpST0RFSVJPCis1NjU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uk9NQVJJQQorNTY2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlJVQkVMSVRBCis1Njc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6UlVCSU0KKzU2ODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTLkFOVC5EJ1JJTyBBQkEKKzU2OTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTLkFOVE9OLkQnQU1QQVIKKzU3MDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTLkFOVE9OLkQnQVZFTlQKKzU3MTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTLkFOVE9OLkQnR1JBTUEKKzU3MjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTLkJBUkJBUkEgRCdUVUcKKzU3MzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTLkJFTlRPIEFCQURFCis1NzQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5CUkFTIEQnU1VBQ1VJCis1NzU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5DUlVaIEQnRVNDQUxWCis1NzY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5ET01JTkdPUyBEJ1BSCis1Nzc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5GQ08uRCdPTElWRUlSCis1Nzg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5HT05DLkQnUklPIEFCCis1Nzk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5HT05DLkRPIFNBUFVDCis1ODA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5HT05DQUxPIEQnUEFSCis1ODE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5KT0FPIEQnT1JJRU5UCis1ODI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5KT0FPIEQnUEFSQUlTCis1ODM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5KT0FPIE5FUE9NVUNFCis1ODQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5KT1NFIEQnR09JQUJBCis1ODU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5KT1NFIEQnVkFSR0lOCis1ODY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5KT1NFIERPIEFMRUdSCis1ODc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5KT1NFIERPIE1BTlRJCis1ODg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5NQVJJQSBEJ0lUQUJJCis1ODk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5NSUdVRUwgRE8gQU5UCis1OTA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5QRURSTyBEJ0ZFUlJPCis1OTE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5SSVRBIEQnSUJJVElQCis1OTI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5SSVRBIEQnSVRVRVRPCis1OTM6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5SSVRBIEQnSkFDVVRJCis1OTQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5SSVRBIEQnU0FQVUNBCis1OTU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6Uy5TRUJBUy5EJ0JFTEEKKzU5NjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTLlNFQkFTLkQnUklPIFAKKzU5NzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTLlNFQkFTVC5EJ09FU1QKKzU5ODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTLlRPTUUgREFTIExFVFIKKzU5OTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTLlZJQ0VOVEUgRCdNSU4KKzYwMDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTQUJBUkEKKzYwMTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTQUJJTk9QT0xJUworNjAyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBQ1JBTUVOVE8KKzYwMzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTQUxJTkFTCis2MDQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0FMVE8gREEgRElWSVNBCis2MDU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0FOIEFOVE9OSU8gRE8KKzYwNjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTQU5UQSBCQVJCQVJBCis2MDc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0FOVEEgSlVMSUFOQQorNjA4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTlRBIExVWklBCis2MDk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0FOVEEgTUFSR0FSSURBCis2MTA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0FOVEEgTUFSSUEgRE8KKzYxMTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTQU5UQSBSSVRBIERFIEMKKzYxMjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTQU5UQSBWSUNUT1JJQQorNjEzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTlRBTkEgRCdDQVRBRworNjE0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTlRBTkEgRCdERVNFUgorNjE1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTlRBTkEgRCdHQVJBTQorNjE2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTlRBTkEgRCdKQUNBUgorNjE3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTlRBTkEgRCdNQU5IVQorNjE4OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTlRBTkEgRCdNT05URQorNjE5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTlRBTkEgRCdQSVJBUAorNjIwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTlRBTkEgRCdSSUFDSAorNjIxOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTlRBTkEgREEgVi4KKzYyMjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTQU5UTyBBTlQuRE8gSi4KKzYyMzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTQU5UTyBISVBPTElUTworNjI0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTlRPUyBEVU1PTlQKKzYyNTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTQU8gRkNPIERFIFMuCis2MjY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0FPIEZSQU5DSVNDTworNjI3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTyBGUkFOQ0lTQ08gRE8KKzYyODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTQU8gR0VSQUxETworNjI5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTyBHRVJBTERPIERBIFAKKzYzMDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTQU8gR09OU0FMTyBBQkFFCis2MzE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0FPIEdPVEFSRE8KKzYzMjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTQU8gSiBEQSBQT05URQorNjMzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTyBKLkRPIERJVklOTworNjM0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTyBKT0FPIEJBVElTVEEKKzYzNTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTQU8gSk9BTyBEQSBNQVRBCis2MzY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0FPIEpPQU8gREVMIFJFCis2Mzc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0FPIEpPQU8gRS4KKzYzODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTQU8gSk9TRSBETyBKLgorNjM5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTyBKT1NFIFNBRklSQQorNjQwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTyBMT1VSRU5DTworNjQxOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTyBQRURSTyBEQSBVLgorNjQyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTyBQRURSTyBETyBTLgorNjQzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTyBSLiBERSBNSU5BUworNjQ0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTyBST01BTworNjQ1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBTyBTRUJBU1RJQU8gRE8KKzY0NjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTQU8gU0VCQVNUSUFPIE0KKzY0NzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTQU8gVElBR08KKzY0ODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTQU8gVE9NQVMgREUgQVFVCis2NDk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0FQVUNBSS1NSVJJTQorNjUwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNBUkRPQQorNjUxOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNFTi4gTU9ERVNUSU5PCis2NTI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0VOLkpPU0UgQkVOVE8KKzY1MzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTRU5BRE9SIENPUlRFUworNjU0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNFTkFET1IgRklSTUlOTworNjU1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNFTkhPUkEgRE8gUE9SVAorNjU2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNFUklDSVRBCis2NTc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0VSSVRJTkdBCis2NTg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0VSUkEgQVpVTCBERSBNCis2NTk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0VSUkEgRCBBSU1PUkVTCis2NjA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0VSUkEgREEgU0FVREFECis2NjE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0VSUkEgRE8gU0FMSVRSCis2NjI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0VSUkFOSUEKKzY2MzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTRVJSQU5PUworNjY0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNFUlJPCis2NjU6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0VURSBMQUdPQVMKKzY2NjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTSUxWRUlSQU5JQQorNjY3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlNJTFZJQU5PUE9MSVMKKzY2ODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTSU1BTyBQRVJFSVJBCis2Njk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U0lNT05FU0lBCis2NzA6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U09CUkFMSUEKKzY3MTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTT0xFREFERSBEJ01JTkEKKzY3MjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTUkEuREUgT0xJVkVJUkEKKzY3MzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTUkEuRE9TIFJFTUVESU8KKzY3NDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTVEEgTUFSSUEgRC5TVS4KKzY3NTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpTVEEgUk9TQSBEQSBTRVJSCis2NzY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U1RBLkVGSUdFTklBIERFCis2Nzc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U1RBLkZFIERFIE1JTkFTCis2Nzg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6U1RPIEFOVE9OSU8gRE8gTQorNjc5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlRBQlVMRUlSTworNjgwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlRBSU9CRUlSQVMKKzY4MTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpUQVBBQ0lHVUFSQQorNjgyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlRBUElSQQorNjgzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlRBUElSQUkKKzY4NDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpUQVFVQVJBQ1UgTUlOQVMKKzY4NTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpUQVJVTUlSSU0KKzY4NjpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpURUlYRUlSQVMKKzY4NzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpURU9GSUxPIE9UT05JCis2ODg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6VElNT1RFTworNjg5OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlRJUkFERU5URVMKKzY5MDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpUSVJPUworNjkxOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlRPQ0FOVElOUworNjkyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlRPTEVETworNjkzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlRPTUJPUworNjk0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlRSRVMgQ0FSQUNPRVMKKzY5NTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpUUkVTIFBPTlRBUworNjk2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlRVTUlSSVRJTkdBCis2OTc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6VFVSTUFMSU5BCis2OTg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6VFVSVk9MQU5ESUEKKzY5OTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpVQkEKKzcwMDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpVQkFJCis3MDE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6VUJFUkFCQQorNzAyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlVCRVJMQU5ESUEKKzcwMzpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpVTUJVUkFUSUJBCis3MDQ6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6VU5BSQorNzA1OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlVSVUNBTklBCis3MDY6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6VkFSR0VNIEJPTklUQQorNzA3OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlZBUkdJTkhBCis3MDg6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6VkFSWkVBIERBIFBBTE1BCis3MDk6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6VkFSWkVMQU5ESUEKKzcxMDpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpWQVpBTlRFCis3MTE6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6VkVSSVNTSU1PCis3MTI6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6VkVTUEFTSUFOTworNzEzOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlZJQ09TQQorNzE0OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlZJRUlSQVMKKzcxNTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpWSUxBIE1BVElBUworNzE2OkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlZJUkdFTSBEQSBMQVBBCis3MTc6QlI6QlJBOkJSQVNJTDpNSU5BUyBHRVJBSVM6VklSR0lOSUEKKzcxODpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpWSVJHSU5PUE9MSVMKKzcxOTpCUjpCUkE6QlJBU0lMOk1JTkFTIEdFUkFJUzpWSVJHT0xBTkRJQQorNzIwOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlZJU0NPTkRFIEQnUi5CUgorNzIxOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOlZPTFRBIEdSQU5ERQorNzIyOkJSOkJSQTpCUkFTSUw6TUlOQVMgR0VSQUlTOldFTkNFU0xBVSBCUkFaCisxOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpBR1VBIEJSQU5DQQorMjpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6QUdVSUFSCiszOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpBTEFHT0EgR1JBTkRFCis0OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpBTEFHT0EgTk9WQQorNTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6QUxBR09JTkhBCis2OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpBTEhBTkRSQQorNzpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6QU5URU5PUiBOQVZBUlJPCis4OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpBUkFDQUdJCis5OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpBUkFSQQorMTA6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkFSQVJVTkEKKzExOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpBUkVBTAorMTI6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkFSRUlBCisxMzpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6QVJPRUlSQVMKKzE0OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpCQUlBIERBIFRSQUlDQU8KKzE1OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpCQU5BTkVJUkFTCisxNjpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6QkFSUkEgREUgUy4gUk9TQQorMTc6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkJBUlJBIFNBTyBNSUdVRUwKKzE4OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpCQVlFVVgKKzE5OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpCRUxFTQorMjA6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkJFTEVNIERPIEJSRUpPIEMKKzIxOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpCT0EgVkVOVFVSQQorMjI6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkJPTSBKRVNVUworMjM6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkJPTSBTVUNFU1NPCisyNDpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6Qk9OSVRPIERFIFNUQS5GRQorMjU6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkJPUVVFSVJBTworMjY6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkJPUVVFSVJBTyBDT0NIT1MKKzI3OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpCT1JCT1JFTUEKKzI4OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpCUkVKTyBETyBDUlVaCisyOTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6QlJFSk8gRE9TIFNBTlRPUworMzA6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkNBQVBPUkEKKzMxOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpDQUJBQ0VJUkFTCiszMjpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6Q0FCRURFTE8KKzMzOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpDQUNIT0VJUkEgRE9TIEkuCiszNDpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6Q0FDSU1CQSBEIkRFTlRSTworMzU6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkNBQ0lNQkEgREUgQVJFSUEKKzM2OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpDQUlDQVJBCiszNzpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6Q0FKQVpFSVJBUworMzg6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkNBTERBUyBCUkFOREFPCiszOTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6Q0FNQUxBVQorNDA6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkNBTVBJTkEgR1JBTkRFCis0MTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6Q0FSUkFQQVRFSVJBCis0MjpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6Q0FUSU5HVUVJUkEKKzQzOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpDQVRPTEUgRE8gUk9DSEEKKzQ0OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpDT05DRUlDQU8KKzQ1OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpDT05EQURPCis0NjpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6Q09OREUKKzQ3OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpDT05HTworNDg6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkNPUkVNQVMKKzQ5OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpDUlVaIERPIEUuIFNBTlRPCis1MDpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6Q1VCQVRJCis1MTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6Q1VJVEUKKzUyOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpDVUlURUdJCis1MzpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6Q1VSUkFMIFZFTEhPCis1NDpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6REVTVEVSUk8KKzU1OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpERVNURVJSTyBEIk1BTFRBCis1NjpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6RElBTUFOVEUKKzU3OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpET05BIElORVMKKzU4OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpEVUFTIEVTVFJBREFTCis1OTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6RU1BUworNjA6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkVTUEVSQU5DQQorNjE6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkZBR1VOREVTCis2MjpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6RlJFSSBNQVJUSU5ITworNjM6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkdVQVJBQklSQQorNjQ6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkdVUklOSEVNCis2NTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6R1VSSkFPCis2NjpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6SUJJQVJBCis2NzpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6SU1BQ1VMQURBCis2ODpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6SU5HQQorNjk6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOklUQUJBSUFOQQorNzA6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOklUQVBPUkFOR0EKKzcxOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpJVEFQT1JPUk9DQQorNzI6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOklUQVRVQkEKKzczOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpKQUNBUkFVCis3NDpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6SkVSSUNPCis3NTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6Sk9BTyBQRVNTT0EKKzc2OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpKVUFSRVogVEFWT1JBCis3NzpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6SlVBWkVJUklOSE8KKzc4OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpKVU5DTyBETyBTRVJJRE8KKzc5OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpKVVJJUElSQU5HQQorODA6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkpVUlUKKzgxOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpMQUdPQQorODI6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkxBR09BIERFIERFTlRSTworODM6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOkxBR09BIFNFQ0EKKzg0OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpMQVNUUk8KKzg1OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpMSVZSQU1FTlRPCis4NjpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6TFVDRU5BCis4NzpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6TUFDQVJBTkRVQkEKKzg4OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpNQUUgRCJBR1VBCis4OTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6TUFMVEEKKzkwOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpNQU1BTkdVQVBFCis5MTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6TUFOQUlSQQorOTI6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOk1BUkkKKzkzOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpNQVRBUkFDQQorOTQ6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOk1PTkdFSVJPCis5NTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6TU9OVEFEQVMKKzk2OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpNT05URSBIT1JFQkUKKzk3OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpNT05URUlSTworOTg6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOk1VTFVOR1UKKzk5OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpOQVRVQkEKKzEwMDpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6TkFaQVJFWklOSE8KKzEwMTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6Tk9WQSBGTE9SRVNUQQorMTAyOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpOT1ZBIE9MSU5EQQorMTAzOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpOT1ZBIFBBTE1FSVJBCisxMDQ6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOk9MSE8gRCdBR1VBCisxMDU6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOk9MSVZFRE9TCisxMDY6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOk9VUk8gVkVMSE8KKzEwNzpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6UEFTU0FHRU0KKzEwODpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6UEFUT1MKKzEwOTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6UEFVTElTVEEKKzExMDpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6UEVEUkEgQlJBTkNBCisxMTE6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlBFRFJBIExBVkFEUkEKKzExMjpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6UEVEUkFTIERFIEZVRUdPCisxMTM6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlBJQU5DTworMTE0OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpQSUNVSQorMTE1OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpQSUxBUgorMTE2OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpQSUxPRVMKKzExNzpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6UElMT0VaSU5IT1MKKzExODpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6UElSUElSSVRVQkEKKzExOTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6UElUSU1CVQorMTIwOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpQT0NJTkhPUworMTIxOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpQT01CQUwKKzEyMjpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6UFJBVEEKKzEyMzpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6UFJJTkNFU0EgSVNBQkVMCisxMjQ6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlBVWElOQU5BCisxMjU6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlFVRUlNQURBUworMTI2OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpRVUlYQUJBCisxMjc6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlJFTUlHSU8KKzEyODpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6UklDQUhPIEQiQ0FWQUxPUworMTI5OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpSSU8gVElOVE8KKzEzMDpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6Uy4gSi4gRE8gQk9ORklNCisxMzE6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlMuSi4gRE8gQ0FSSVJJCisxMzI6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlMuSi4gRE8gU0FCVUdJCisxMzM6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlMuSi5ERSBFU1BJTkhBUkEKKzEzNDpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6Uy5KLkRPUyBDT1JERUlSTworMTM1OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpTLkouTEFHT0EgVEFQQURBCisxMzY6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlNBTEdBRElOSE8KKzEzNzpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6U0FMR0FETyBTLkZFTElYCisxMzg6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlNBTlRBIENSVVoKKzEzOTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6U0FOVEEgSEVMRU5BCisxNDA6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlNBTlRBIExVWklBCisxNDE6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlNBTlRBIFJJVEEKKzE0MjpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6U0FOVEEgVEVSRVNJTkhBCisxNDM6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlNBTlRBTkEgREUgTS4KKzE0NDpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6U0FOVEFOQSBET1MgRy4KKzE0NTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6U0FPIEJFTlRPCisxNDY6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlNBTyBKLkRFIENBSUFOQQorMTQ3OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpTQU8gSk9BTyBEIlRJR1JFCisxNDg6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlNBTyBKT1NFIERFIFAuCisxNDk6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlNBTyBNQU1FREUKKzE1MDpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6U0FPIE1JR1VFTCBUQUlQVQorMTUxOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpTQU8gU0VCQVNUSUFPIExSCisxNTI6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlNBTyBTRUJBU1RJQU8gVS4KKzE1MzpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6U0FQRQorMTU0OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpTRVJJRE8KKzE1NTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6U0VSUkEgQlJBTkNBCisxNTY6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlNFUlJBIERBIFJBSVoKKzE1NzpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6U0VSUkEgR1JBTkRFCisxNTg6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlNFUlJBIFJFRE9OREEKKzE1OTpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6U0VSUkFSSUEKKzE2MDpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6U09MQU5FQQorMTYxOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpTT0xFREFERQorMTYyOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpTT1VaQQorMTYzOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpTVU1FCisxNjQ6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlRBQ0lNQQorMTY1OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpUQVBFUk9BCisxNjY6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlRBVkFSRVMKKzE2NzpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6VEVJWEVJUkEKKzE2ODpCUjpCUkE6QlJBU0lMOlBBUkFJQkE6VFJJVU5GTworMTY5OkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpVSVJBVU5BCisxNzA6QlI6QlJBOkJSQVNJTDpQQVJBSUJBOlVNQlVaRUlSTworMTcxOkJSOkJSQTpCUkFTSUw6UEFSQUlCQTpWQVJaRUEKKzE6QlI6QlJBOkJSQVNJTDpST1JBSU1BOkJSQS5MMi4xCisxOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpBRk9HQURPUyBEQSBJLgorMjpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086QUZSQU5JTworMzpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086QUdSRVNUSU5BCis0OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpBR1VBIFBSRVRBCis1OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpBR1VBUyBCRUxBUworNjpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086QUxBR09JTkhBCis3OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpBTElBTkNBCis4OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpBTFRJTkhPCis5OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpBTUFSQUpJCisxMDpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086QU5HRUxJTQorMTE6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkFSQVJJUElOQQorMTI6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkFSQ09WRVJERQorMTM6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkJBUlJBIERFIEdVQUJJUkEKKzE0OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpCQVJSRUlST1MKKzE1OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpCRUxFTSBERSBNQVJJQQorMTY6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkJFTEVNIERFIFNBTyBGQ08KKzE3OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpCRUxPIEpBUkRJTQorMTg6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkJFVEFOSUEKKzE5OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpCRVpFUlJPUworMjA6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkJPRE9DTworMjE6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkJPTSBDT05TRUxITworMjI6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkJPTSBKQVJESU0KKzIzOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpCT05JVE8KKzI0OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpCUkEuTDIuMworMjU6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkJSRUpBTworMjY6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkJSRUpJTkhPCisyNzpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086QlJFSk8gREEgTUFEUkUgRAorMjg6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkJVRU5PUyBBSVJFUworMjk6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkJVSVFVRQorMzA6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkNBQk8KKzMxOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpDQUJST0JPCiszMjpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086Q0FDSE9FUklOSEEKKzMzOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpDQUVURVMKKzM0OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpDQUxDQURPCiszNTpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086Q0FMVU1CSQorMzY6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkNBTU9DSU0gUyBGRUxJWAorMzc6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkNBTVVUQU5HQQorMzg6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkNBTkhPVElOSE8KKzM5OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpDQVBPRUlSQVMKKzQwOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpDQVJOQUlCQQorNDE6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkNBUlBJTkEKKzQyOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpDQVJVQVJVCis0MzpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086Q0FURU5ERQorNDQ6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkNFRFJPCis0NTpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086Q0hBIERFIEFMRUdSSUEKKzQ2OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpDSEEgR1JBTkRFCis0NzpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086Q09OREFETworNDg6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkNPUlJFTlRFUworNDk6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkNPUlRFUworNTA6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkNVTUFSVQorNTE6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkNVUElSQQorNTI6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkNVU1RPRElBCis1MzpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086RVNDQURBCis1NDpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086RVhVCis1NTpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086RkVJUkEgTk9WQQorNTY6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkZFUlJFSVJPUworNTc6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkZMT1JFUworNTg6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkZMT1JFU1RBCis1OTpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086RlJFSSBNSUdVRUxJTkhPCis2MDpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086R0FNRUxFSVJBCis2MTpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086R0FSQU5IVU5TCis2MjpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086R0xPUklBIERPIEdPSVRBCis2MzpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086R09JQU5BCis2NDpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086R1JBTklUTworNjU6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkdSQVZBVEEKKzY2OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpJQklNSVJJTQorNjc6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOklCSVJBSlVCQQorNjg6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOklHQVJBQ1UKKzY5OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpJR1VBUkFDSQorNzA6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOklOQUpBCis3MTpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086SU5HQVpFSVJBCis3MjpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086SVBPSlVDQQorNzM6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOklQVUJJCis3NDpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086SVRBQ1VSVUJBCis3NTpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086SVRBSUJBCis3NjpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086SVRBTUFSQUNBCis3NzpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086SVRBUEVUSU0KKzc4OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpJVEFRVUlUSU5HQQorNzk6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkpBQk9BVEFPCis4MDpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086SkFUQVVCQQorODE6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkpBVEkKKzgyOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpKT0FPIEFMRlJFRE8KKzgzOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpKT0FRVUlNIE5BQlVDTworODQ6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkpVUEkKKzg1OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpKVVJFTUEKKzg2OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpMQUdPCis4NzpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086TEFHT0EgRCBHQVRPUworODg6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkxBR09BIEQgT1VSTworODk6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOkxBR09BIERPIElUQUVOR0EKKzkwOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpMQUpFRE8KKzkxOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpMSU1PRUlSTworOTI6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOk1BQ0FQQVJBTkEKKzkzOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpNQUNIQURPUworOTQ6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOk1BUkFJQUwKKzk1OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpNSVJBTkRJQkEKKzk2OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpNT1JFTk8KKzk3OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpOQVpBUkUgREEgTUFUQQorOTg6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOk9MSU5EQQorOTk6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOk9ST0JPCisxMDA6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOk9ST0NPCisxMDE6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOk9VUklDVVJJCisxMDI6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOlBBTE1BUkVTCisxMDM6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOlBBTE1FSVJJTkEKKzEwNDpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086UEFORUxBUworMTA1OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpQQVJBTkFUQU1BCisxMDY6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOlBBUk5BTUlSSU0KKzEwNzpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086UEFTU0lSQQorMTA4OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpQQVVEQUxITworMTA5OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpQQVVMSVNUQQorMTEwOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpQRURSQQorMTExOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpQRVNRVUVJUkEKKzExMjpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086UEVUUk9MQU5ESUEKKzExMzpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086UEVUUk9MSU5BCisxMTQ6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOlBPQ0FPCisxMTU6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOlBPTUJPUworMTE2OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpQUklNQVZFUkEKKzExNzpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086UVVJUEFQQQorMTE4OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpSLlBhamV1CisxMTk6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOlIuZGEgQnJpZ2lkYQorMTIwOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpSRUNJRkUKKzEyMTpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086UklBQ0hPIERBUyBBTE1BUworMTIyOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpSSUJFSVJBTworMTIzOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpSSU8gRk9STU9TTworMTI0OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpSZXByLlBPQ08gRCJDUlVaCisxMjU6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOlJlcHIuUk9TQVJJTworMTI2OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpTIEpPQVFVSU4gRCBNT05UCisxMjc6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOlMuIERPUyBNT1JFSVJBUworMTI4OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpTLkMuRCJDQVBJQkFSSUJFCisxMjk6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOlMuTS5EQSBCT0EgVklTVEEKKzEzMDpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086Uy5NQVJJQSBEIkNBTUJVQworMTMxOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpTLlZJQ0VOVEUgRkVSUkVSCisxMzI6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOlNBSVJFCisxMzM6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOlNBTEdBRElOSE8KKzEzNDpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086U0FMR1VFSVJPCisxMzU6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOlNBTElEQU8KKzEzNjpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086U0FMT0EKKzEzNzpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086U0FOSEFSTworMTM4OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpTQU5UQSBURVJFWklOSEEKKzEzOTpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086U0FPIEJFTklUTyBTVUwKKzE0MDpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086U0FPIEJFTlRPIERPIFVOQQorMTQxOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpTQU8gQ0FFVEFOTworMTQyOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpTQU8gSk9BTworMTQzOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpTQU8gSk9BTyBEIkVHSVRPCisxNDQ6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOlNBTyBKT0FPIERPIEJFTE0KKzE0NTpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086U0FPIEpPU0UgQ09ST0EgRworMTQ2OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpTQU8gTE9VUkVOQ08gTUFUCisxNDc6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOlNFUlJBIFRBTEhBREEKKzE0ODpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086U0VSUklUQQorMTQ5OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpTRVJUQU5JQQorMTUwOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpTSVJJTkhBRU0KKzE1MTpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086U1VSVUJJTQorMTUyOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpUQUJJUkEKKzE1MzpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086VEFDQUlNQk8KKzE1NDpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086VEFDQVJBVFUKKzE1NTpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086VEFNQkUKKzE1NjpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086VEFRVUFSSVRJTkdBIE5URQorMTU3OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpURVJFWklOSEEKKzE1ODpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086VEVSUkEgTk9WQQorMTU5OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpUSU1CQVVCQQorMTYwOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpUT1JJVEFNQQorMTYxOkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpUUkFDVU5IQUVNCisxNjI6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOlRSSU5EQURFCisxNjM6QlI6QlJBOkJSQVNJTDpQRVJOQU1CVUNPOlRSSVVORk8KKzE2NDpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086VFVQQU5BVElOR0EKKzE2NTpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086VFVQQVJFVEFNQQorMTY2OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpWRU5UVVJPU0EKKzE2NzpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086VkVSREVKQU5URQorMTY4OkJSOkJSQTpCUkFTSUw6UEVSTkFNQlVDTzpWRVJURU5URVMKKzE2OTpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086VklDRU5DSUEKKzE3MDpCUjpCUkE6QlJBU0lMOlBFUk5BTUJVQ086VklUT1JJQSBTLkFOVEFPCisxOkJSOkJSQTpCUkFTSUw6QUxBR09BUzpBR1VBIEJSQU5DQQorMjpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6QU5BRElBCiszOkJSOkJSQTpCUkFTSUw6QUxBR09BUzpBUkFQSVJBQ0EKKzQ6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOkFUQUxBSUEKKzU6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOkJBUlJBIEQgUyBNSUdVRUwKKzY6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOkJBUlJBIERFIFMgQU5UT04KKzc6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOkJBVEFMSEEKKzg6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOkJFTEVNCis5OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpCRUxPIE1PTlRFCisxMDpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6Qk9DQSBERSBNQVRBCisxMTpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6QlJBTlFVSU5IQQorMTI6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOkNBQ0lNQklOSEFTCisxMzpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6Q0FKVUVJUk8KKzE0OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpDQU1QTyBBTEVHUkUKKzE1OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpDQU1QTyBHUkFOREUKKzE2OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpDQU5BUEkKKzE3OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpDQVBFTEEKKzE4OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpDQVJORUlST1MKKzE5OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpDSEEgUFJFVEEKKzIwOkJSOkJSQTpCUkFTSUw6QUxBR09BUzpDT0lURSBETyBOT0lBCisyMTpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6Q09MT05JQSBMRU9QT0xESQorMjI6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOkNPUVVFSVJPIFNFQ08KKzIzOkJSOkJSQTpCUkFTSUw6QUxBR09BUzpDT1JVUklQRQorMjQ6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOkRFTE1JUk8gR09VVkVJQQorMjU6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOkRPSVMgUklBQ0hPUworMjY6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOkZFSVJBIEdSQU5ERQorMjc6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOkZFTElaIERFU0VSVE8KKzI4OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpGTEVYRUlSQVMKKzI5OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpHSVJBVSBETyBQT05DSUFOCiszMDpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6SUJBVEVHVUFSQQorMzE6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOklHQUNJCiszMjpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6SUdSRUpBIE5PVkEKKzMzOkJSOkJSQTpCUkFTSUw6QUxBR09BUzpJTkhBUEkKKzM0OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpKQUNBUk8gRE9TIEhPTUVOCiszNTpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6SkFDVUlQRQorMzY6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOkpBUEFSQVRJTkdBCiszNzpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6SkFSQU1BVEFJQQorMzg6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOkpPQVFVSU0gR09NRVMKKzM5OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpKVU5ESUEKKzQwOkJSOkJSQTpCUkFTSUw6QUxBR09BUzpKVU5RVUVJUk8KKzQxOkJSOkJSQTpCUkFTSUw6QUxBR09BUzpMQUdPQSBEQSBDQU5PQQorNDI6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOkxJTU9FSVJPIEQgQU5BREkKKzQzOkJSOkJSQTpCUkFTSUw6QUxBR09BUzpNQUNFSU8KKzQ0OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpNQUpPUiBJU0lET1JPCis0NTpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6TUFSIFZFUk1FTEhPCis0NjpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6TUFSQUdPR0kKKzQ3OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpNQVJBVklMSEEKKzQ4OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpNQVJFQ0hBTCBERU9ET1JPCis0OTpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6TUFSSU1CT05ETworNTA6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOk1BVEEgR1JBTkRFCis1MTpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6TUFUUklaIEQgQ0FNQVJBRworNTI6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOk1FU1NJQVMKKzUzOkJSOkJSQTpCUkFTSUw6QUxBR09BUzpNSVJBRE9SIEQgTkVHUkFPCis1NDpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6TU9OVEVJUk9QT0xJUworNTU6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOk1VUklDSQorNTY6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOk5PVk8gTElOTworNTc6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOk9MSE8gRCBBR1VBICBEIEYKKzU4OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpPTEhPIEQnQUdVQSBETyBDCis1OTpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6T0xITyBELUFHVUEgR1JBTgorNjA6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOk9MSVZFTkNBCis2MTpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6T1VSTyBCUkFOQ08KKzYyOkJSOkJSQTpCUkFTSUw6QUxBR09BUzpQQUxFU1RJTkEKKzYzOkJSOkJSQTpCUkFTSUw6QUxBR09BUzpQQUxNRUlSQSBET1MgSU5ECis2NDpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6UEFPLURFLUFDVUNBUgorNjU6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOlBBU1NPIEQgQ0FNQVJBR0kKKzY2OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpQQVVMTyBKQUNJTlRPCis2NzpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6UEVORURPCis2ODpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6UElBQ0FCVUNVCis2OTpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6UElMQVIKKzcwOkJSOkJSQTpCUkFTSUw6QUxBR09BUzpQSU5ET0JBCis3MTpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6UElSQU5IQVMKKzcyOkJSOkJSQTpCUkFTSUw6QUxBR09BUzpQT0NPIERBUyBUUklOQ0hFCis3MzpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6UE9SVE8gQ0FMVk8KKzc0OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpQT1JUTyBEIFBFRFJBUworNzU6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOlBPUlRPIFJFQUwgRE8gQy4KKzc2OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpRVUVCUkFOR1VMTworNzc6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOlJJTyBMQVJHTworNzg6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOlJPVEVJUk8KKzc5OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpTIEpPU0UgREEgVEFQRVJBCis4MDpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6UyBMVUlTIERPIFFVSVRVTgorODE6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOlMgTUlHVUVMIEQgQ0FNUE8KKzgyOkJSOkJSQTpCUkFTSUw6QUxBR09BUzpTIE1JR1VFTCBNSUxBR1JFCis4MzpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6U0FOVEFOQSBEIE1VTkRBVQorODQ6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOlNBTlRBTkEgRE8gSVBBTkUKKzg1OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpTQU8gQlJBUworODY6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOlNBTyBKT1NFIERBIExBSkUKKzg3OkJSOkJSQTpCUkFTSUw6QUxBR09BUzpTQU8gU0VCQVNUSUFPCis4ODpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6U0FUVUJBCis4OTpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6U1RBIExVWklBIERPIE5URQorOTA6QlI6QlJBOkJSQVNJTDpBTEFHT0FTOlRBTlFVRSBEJ0FSQ0EKKzkxOkJSOkJSQTpCUkFTSUw6QUxBR09BUzpUQVFVQVJBTkEKKzkyOkJSOkJSQTpCUkFTSUw6QUxBR09BUzpUUkFJUFUKKzkzOkJSOkJSQTpCUkFTSUw6QUxBR09BUzpVTklBTyBET1MgUEFMTUFSCis5NDpCUjpCUkE6QlJBU0lMOkFMQUdPQVM6VklDT1NBCisxOkJSOkJSQTpCUkFTSUw6QU1BUEE6QW1hcGEKKzI6QlI6QlJBOkJSQVNJTDpBTUFQQTpDYWxjb2VuZQorMzpCUjpCUkE6QlJBU0lMOkFNQVBBOk1hY2FwYQorNDpCUjpCUkE6QlJBU0lMOkFNQVBBOk1hemFnYW8KKzU6QlI6QlJBOkJSQVNJTDpBTUFQQTpPaWFwb3F1ZQorMTpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkFCRUxBUkRPIExVWgorMjpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkFHUk9MQU5ESUEKKzM6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpBR1JPTk9NSUNBCis0OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6QUdVQSBET0NFCis1OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6QUdVQVMgRE8gQ0hBUEVDCis2OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6QUdVQVMgTU9STkFTCis3OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6QUxGUkVETyBXQUdORVIKKzg6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpBTkNISUVUQQorOTpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkFOR0VMSU5BCisxMDpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkFOSVRBIEdBUklCQUxESQorMTE6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpBTklUQVBPTElTCisxMjpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkFOVE9OSU8gQ0FSTE9TCisxMzpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkFSQVFVQVJJCisxNDpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkFSQVJBTkdVQQorMTU6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpBUk1BWkVNCisxNjpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkFSUk9JTyBUUklOVEEKKzE3OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6QVNDVVJSQQorMTg6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpBVEFMQU5UQQorMTk6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpBVVJPUkEKKzIwOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6Qi5KQVJESU0gRCdTRVJSCisyMTpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkJBTE5FQVIuQ0FNQk9SSQorMjI6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpCQVJSQSBWRUxIQQorMjM6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpCRU5FRElUTyBOT1ZPCisyNDpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkJJR1VBQ1UKKzI1OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6QkxVTUVOQVUKKzI2OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6Qk9NIFJFVElSTworMjc6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpCT1RJVkVSQQorMjg6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpCUkFDTyBETyBOT1JURQorMjk6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpCUlVTUVVFCiszMDpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkNBQ0FET1IKKzMxOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6Q0FJQkkKKzMyOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6Q0FNQk9SSVUKKzMzOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6Q0FNUE8gQUxFR1JFCiszNDpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkNBTVBPIEJFTE8gRCdTVQorMzU6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpDQU1QTyBETyBFUkUKKzM2OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6Q0FNUE9TIE5PVk9TCiszNzpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkNBTkVMSU5IQQorMzg6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpDQU5PSU5IQVMKKzM5OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6Q0FQSU5aQUwKKzQwOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6Q0FUQU5EVVZBUworNDE6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpDQVhBTUJVIERPIFNVTAorNDI6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpDSEFQRUNPCis0MzpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkNPTkNPUkRJQQorNDQ6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpDT1JPTkVMIEZSRUlUQVMKKzQ1OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6Q09SVVBBCis0NjpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkNSSUNJVU1BCis0NzpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkNVTkhBIFBPUkEKKzQ4OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6Q1VSSVRJQkFOT1MKKzQ5OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6REVTQ0FOU08KKzUwOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6RElPTklTSU8gQ0VSUVVFCis1MTpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkRPTkEgRU1NQQorNTI6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpFUlZBTCBWRUxITworNTM6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpGQVhJTkFMIEQgR1VFREUKKzU0OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6RkxPUklBTk9QT0xJUworNTU6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpGUkFJQlVSR08KKzU2OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6R0FMVkFPCis1NzpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkdBUk9QQUJBCis1ODpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkdBUlVWQQorNTk6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpHQVNQQVIKKzYwOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6R09WLkNFTFNPIFJBTU9TCis2MTpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkdSQU8gUEFSQQorNjI6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpHUkFWQVRBTAorNjM6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpHVUFCSVJVQkEKKzY0OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6R1VBUkFDSUFCQQorNjU6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpHVUFSQU1JUklNCis2NjpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkdVQVJVSkEgRE8gU1VMCis2NzpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkhFUlZBTCBELk9FU1RFCis2ODpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOklCSUNBUkUKKzY5OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6SUJJUkFNQQorNzA6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpJQ0FSQQorNzE6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpJTEhPVEEKKzcyOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6SU1BUlVJCis3MzpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOklNQklUVUJBCis3NDpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOklNQlVJQQorNzU6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpJTkRBSUFMCis3NjpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOklQSVJBCis3NzpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOklQVU1JUklNCis3ODpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOklSQU5JCis3OTpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOklSSU5FT1BPTElTCis4MDpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOklUQQorODE6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpJVEFJT1BPTElTCis4MjpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOklUQUpBSQorODM6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpJVEFQRU1BCis4NDpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOklUVVBPUkFOR0EKKzg1OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6SXRhcGlyYW5nYQorODY6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpKQUJPUkEKKzg3OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6SkFDSU5UTyBNQUNIQURPCis4ODpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkpBR1VBUlVOQQorODk6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpKQVJBR1VBIERPIFNVTAorOTA6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpKT0FDQUJBCis5MTpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkpPSU5WSUxFCis5MjpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOkxBQ0VSRE9QT0xJUworOTM6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpMQUdVTkEKKzk0OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6TEFKRVMKKzk1OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6TEFVUkVOVElOTworOTY6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpMQVVSTyBNVUxMRVIKKzk3OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6TEVCT04gUkVHSVMKKzk4OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6TEVPQkVSVE8gTEVBTAorOTk6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpMT05UUkFTCisxMDA6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpMVUlaIEFMVkVTCisxMDE6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpNQUNBUkFORFVCQQorMTAyOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6TUFGUkEKKzEwMzpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOk1BSk9SIEdFUkNJTk8KKzEwNDpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOk1BSk9SIFZJRUlSQQorMTA1OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6TUFSQUNBSkEKKzEwNjpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOk1BUkFWSUxIQQorMTA3OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6TUFUT1MgQ09TVEEKKzEwODpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOk1FTEVJUk8KKzEwOTpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOk1PREVMTworMTEwOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6TU9OREFJCisxMTE6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpNT05URSBDQVNURUxPCisxMTI6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpNT1JSTyBEQSBGVU1BQ0EKKzExMzpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOk5BVkVHQU5URVMKKzExNDpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOk5PVkEgRVJFQ0hJTQorMTE1OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6Tk9WQSBUUkVOVE8KKzExNjpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOk5PVkEgVkVORVpBCisxMTc6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpPUkxFQUVTCisxMTg6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpPVVJPCisxMTk6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpQLkNBU1RFTE8gQlJBTkMKKzEyMDpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlBBTEhPQ0EKKzEyMTpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlBBTE1BIFNPTEEKKzEyMjpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlBBTE1JVE9TCisxMjM6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpQQVBBTkRVVkEKKzEyNDpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlBBVUxPIExPUEVaCisxMjU6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpQRURSQVMgR1JBTkRFUworMTI2OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6UEVOSEEKKzEyNzpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlBFUklUSUJBCisxMjg6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpQRVRST0xBTkRJQQorMTI5OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6UElDQVJSQVMKKzEzMDpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlBJTkhBTFpJTkhPCisxMzE6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpQSU5IRUlSTyBQUkVUTworMTMyOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6UElSQVRVQkEKKzEzMzpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlBPTUVST0RFCisxMzQ6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpQT05UQSBBTFRBCisxMzU6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpQT05URSBTRVJSQURBCisxMzY6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpQT1JUTyBCRUxPCisxMzc6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpQT1JUTyBVTklBTworMTM4OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6UE9VU08gUkVET05ETworMTM5OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6UFJFU0RURS4gR0VUVUxJTworMTQwOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6UFJFU0lERU5URSBORVJFCisxNDE6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpRVUlMT01CTworMTQyOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6UkFOQ0hPIFFVRUlNQURPCisxNDM6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpSSU8gREFTIEFOVEFTCisxNDQ6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpSSU8gRE8gQ0FNUE8KKzE0NTpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlJJTyBETyBPRVNURQorMTQ2OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6UklPIERPIFNVTAorMTQ3OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6UklPIERPUyBDRURST1MKKzE0ODpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlJJTyBGT1JUVU5BCisxNDk6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpSSU8gTkVHUklOSE8KKzE1MDpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlJPREVJTworMTUxOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6Uk9NRUxBTkRJQQorMTUyOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6Uy5CRU5UTyBETyBTVUwKKzE1MzpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlMuSk9BTyBCQVRJU1RBCisxNTQ6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpTLkpPU0UgRCdDRVJSSVQKKzE1NTpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlMuSk9TRSBETyBDRURSTworMTU2OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6Uy5MT1VSRU5DTyBEJ09FCisxNTc6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpTLk1JR1VFTCBEJ09FU1QKKzE1ODpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlNBTEVURQorMTU5OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6U0FMVE8gVkVMT1NPCisxNjA6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpTQU5UQSBDRUNJTElBCisxNjE6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpTQU8gQk9OSUZBQ0lPCisxNjI6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpTQU8gQ0FSTE9TCisxNjM6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpTQU8gRE9NSU5HT1MKKzE2NDpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlNBTyBGQ08uIERPIFNVTAorMTY1OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6U0FPIEpPQU8gRE8gU1VMCisxNjY6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpTQU8gSk9BUVVJTQorMTY3OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6U0FPIEpPU0UKKzE2ODpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlNBTyBMVURHRVJPCisxNjk6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpTQU8gTUFSVElOSE8KKzE3MDpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlNBVURBREVTCisxNzE6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpTQ0hST0VERVIKKzE3MjpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlNFQVJBCisxNzM6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpTSURFUk9QT0xJUworMTc0OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6U09NQlJJTworMTc1OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6U1RBLlJPU0EgREUgTElNCisxNzY6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpTVE8uQU1BUk8gRCdJTVAKKzE3NzpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlRBSU8KKzE3ODpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlRBTkdBUkEKKzE3OTpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlRJSlVDQVMKKzE4MDpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlRJTUJFIERPIFNVTAorMTgxOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6VElNQk8KKzE4MjpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlRSRVMgQkFSUkFTCisxODM6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpUUkVaRSBERSBNQUlPCisxODQ6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpUUkVaRSBUSUxJQVMKKzE4NTpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlRST01CVURPIENFTlRSQQorMTg2OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6VFVCQVJBTworMTg3OkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6VFVSVk8KKzE4ODpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlVSVUJJQ0kKKzE4OTpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlVSVUNBTkdBCisxOTA6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpWQVJHRUFPCisxOTE6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpWSURBTCBSQU1PUworMTkyOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6VklERUlSQQorMTkzOkJSOkJSQTpCUkFTSUw6U0FOVEEgQ0FUQVJJTkE6V0lUTUFSU1VNCisxOTQ6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpYQU5YRVJFCisxOTU6QlI6QlJBOkJSQVNJTDpTQU5UQSBDQVRBUklOQTpYQVZBTlRJTkEKKzE5NjpCUjpCUkE6QlJBU0lMOlNBTlRBIENBVEFSSU5BOlhBWElNCisxOkJSOkJSQTpCUkFTSUw6UklPIEdyYW5kZSBETyBTVUw6QXJyb2lvIGRvIFRpZ3JlCisyOkJSOkJSQTpCUkFTSUw6UklPIEdyYW5kZSBETyBTVUw6QmFycm9zIENhc3NhbAorMTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPL1BJQVVJOlJFUC4gQk9BIEVTUEVSLgorMTpCUjpCUkE6QlJBU0lMOkNhcGFuZW1hOk1lZGlhbmVpcmEKKzE6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6QS4gQ0xBUkEKKzI6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6QU1BTUJBWQorMzpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpBTkFTVEFDSU8KKzQ6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6QU5BVVJJTEFORElBCis1OkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU08gRE8gU1VMOkFOR0VMSUNBCis2OkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU08gRE8gU1VMOkFOVE9OSU8gSk9BTworNzpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpBUEFSRUNJREEgRE8gVEFCCis4OkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU08gRE8gU1VMOkFRVUlEQVVBTkEKKzk6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6QVJBTCBNT1JFSVJBCisxMDpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpCQU5ERUlSQU5URVMKKzExOkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU08gRE8gU1VMOkJBVEFHVUFTU1UKKzEyOkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU08gRE8gU1VMOkJBVEFJUE9SQQorMTM6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6QkVMQSBWSVNUQQorMTQ6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6Qk9OSVRPCisxNTpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpCUkFTSUxBTkRJQQorMTY6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6Q0FNQVBVQQorMTc6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6Q0FNUE8gR1JBTkRFCisxODpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpDQVJBQ09MCisxOTpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpDQVJBUE8KKzIwOkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU08gRE8gU1VMOkNBU1NJTEFORElBCisyMTpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpDT1JHVUlOSE8KKzIyOkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU08gRE8gU1VMOkNPUlVNQkEKKzIzOkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU08gRE8gU1VMOkNPWElNCisyNDpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpERU9EQVBPTElTCisyNTpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpET1VSQURPUworMjY6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6RUwgRE9SQURPCisyNzpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpGQVRJTUEgRE8gU1VMCisyODpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpHTE9SSUEgREUgRE9VUkFECisyOTpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpHVUlBIExPUEVTIERFIExBCiszMDpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpJR1VBVEVNSQorMzE6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6SU5PQ0VOQ0lBCiszMjpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpJVEFQT1JBCiszMzpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpJVklOSEVNQQorMzQ6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6SkFSQUdVQVJJCiszNTpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpKQVJESU0KKzM2OkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU08gRE8gU1VMOkpBVEVJCiszNzpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpMQURBUklPCiszODpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpNQVJBQ0FKVQorMzk6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6TUlSQU5EQQorNDA6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6TVVORE8gTk9WTworNDE6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6TkFWSVJBSQorNDI6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6TklPQVFVRQorNDM6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6Tk9WQSBBTkRSQURJTkEKKzQ0OkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU08gRE8gU1VMOlAuIE1VUlRJTkhPCis0NTpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpQQVJBTkFJQkEKKzQ2OkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU08gRE8gU1VMOlBFRFJPIEdPTUVTCis0NzpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpQT05UQSBQT1JBCis0ODpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpSLiBCUklMSEFOVEUKKzQ5OkJSOkJSQTpCUkFTSUw6TUFUTyBHUk9TU08gRE8gU1VMOlIuIE5FR1JPCis1MDpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpSSUJBUyBETyBSLlBBUkRPCis1MTpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpSSU8gVkVSREUgREUgTS5HCis1MjpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpST0NIRURPCis1MzpCUjpCUkE6QlJBU0lMOk1BVE8gR1JPU1NPIERPIFNVTDpTSURST0xBTkRJQQorNTQ6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6VEVSRU5PUworNTU6QlI6QlJBOkJSQVNJTDpNQVRPIEdST1NTTyBETyBTVUw6VFJFUyBMQUdPQVMKKzE6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpBZm9uc28gQ3VuaGEKKzI6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpBbGNhbnRhcmEKKzM6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpBbGRlaWFzIEFsdGFzCis0OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86QWx0YW1pcmEgZG8gTS4KKzU6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpBbHRvIFBhcm5haWJhCis2OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86QW1hcmFudGUgRG8gTWEKKzc6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpBbmFqYXR1YmEKKzg6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpBbmFwdXJvcworOTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkFyYWlvc2VzCisxMDpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkFyYXJpCisxMTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkF4aXhhCisxMjpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkJhY2FiYWwKKzEzOkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86QmFjYWJpbmhhCisxNDpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkJhY3VyaQorMTU6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpCYWxzYXMKKzE2OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86QmFyYW8gRGUgRy4KKzE3OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86QmFycmEgZG8gQ29yZGEKKzE4OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86QmFycmVpcmluaGFzCisxOTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkJlbmVkaXRvIExlaXRlCisyMDpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkJlcXVpbWFvCisyMTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkJvbSBKYXJkaW4KKzIyOkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86QnJlam8KKzIzOkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86QnVyaXRpCisyNDpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkJ1cml0aSBCcmF2bworMjU6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpDYWphcGlvCisyNjpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkNhamFyaQorMjc6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpDYW5kaWRvIE1lbmRlcworMjg6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpDYW50YW5oZWRlCisyOTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkNhcm9saW5hCiszMDpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkNhcnV0YXBlcmEKKzMxOkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86Q2F4aWFzCiszMjpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkNlZHJhbAorMzM6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpDaGFwYWRpbmhhCiszNDpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkNvZG8KKzM1OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86Q29lbGhvIE5ldG8KKzM2OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86Q29saW5hcworMzc6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpDb3JvYXRhCiszODpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkN1cnVydXB1CiszOTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkRvbSBQZWRybworNDA6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpEdXF1ZSBCYWNlbGFyCis0MTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkVzcGVyYW50aW5vcG9saXMKKzQyOkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86Rm9ydGFsZXphIERhcyBOLgorNDM6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpGb3J0dW5hCis0NDpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkcuIEV1Z2VuaW8gQi4KKzQ1OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86R29kb2ZyZWRvIFZpYW5hCis0NjpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkdvbmNhbHZlcyBEaWFzCis0NzpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkdvdi4gQXJjaGVyCis0ODpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkdyYWNhIEFyYW5oYQorNDk6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpHcmFqYXUKKzUwOkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86R3VpbWFyYWVzCis1MTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkh1bWJlcnRvIENhbXBvcworNTI6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpJY2F0dQorNTM6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpJZ2FyYXBlIEdyYW5kZQorNTQ6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpJbXBlcmF0cml6Cis1NTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOklwaXh1bmEKKzU2OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86SXRhcGVjdXJ1LU1pcmltCis1NzpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkpvYW8gTGlzYm9hCis1ODpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkpvc2VsYW5kaWEKKzU5OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86TGFnbyBEbyBKdW5jbworNjA6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpMYWdvIFZlcmRlCis2MTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkxhZ28gZGEgUGVkcmEKKzYyOkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86TGltYSBDYW1wb3MKKzYzOkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86TG9yZXRvCis2NDpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOkx1aXMgRG9taW5nb3MKKzY1OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86TWFnYWxoYWVzIERlIEEuCis2NjpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOk1hdGEgUm9tYQorNjc6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpNYXRpbmhhCis2ODpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOk1hdG9lcworNjk6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpNaXJhZG9yCis3MDpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOk1pcmluemFsCis3MTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOk1vbmNhbworNzI6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpNb250ZXMgQWx0b3MKKzczOkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86TW9ycm9zCis3NDpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOk5pbmEgUm9kcmlndWVzCis3NTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOk5vdmEgSW9ycXVlCis3NjpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOk9saG8gRGFndWEgRC4gQy4KKzc3OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86UGFjbyBkbyBMdW1pYXIKKzc4OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86UGFsbWVpcmFuZGlhCis3OTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlBhcmFpYmFubworODA6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpQYXJuYXJhbWEKKzgxOkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86UGFzc2FnZW0gRnJhbmNhCis4MjpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlBhc3RvcyBCb25zCis4MzpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlBlZHJlaXJhcworODQ6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpQZW5hbHZhCis4NTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlBlcmktTWlyaW0KKzg2OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86UGluZGFyZS1NaXJpbQorODc6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpQaW5oZWlybworODg6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpQaW8gWElJCis4OTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlBpcmFwZW1hcworOTA6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpQb2NhbyBkZSBQZWRyYXMKKzkxOkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86UG9ydG8gRnJhbmNvCis5MjpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlByZXMuIEp1c2NlbGlubworOTM6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpQcmVzLiBWYXJnYXMKKzk0OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86UHJlc2lkZW50ZSBEdXRyYQorOTU6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpQcmltZWlyYSBDcnV6Cis5NjpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlJpYWNoYW8KKzk3OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86Um9zYXJpbworOTg6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpTLiBCZW5lZGl0byBSLlAKKzk5OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86Uy4gQmVybmFyZG8KKzEwMDpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlMuIERvbWluZ28gRG8gTS4KKzEwMTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlMuIEZjbyBEbyBNYS4KKzEwMjpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlMuIEZlbGl4IGRlIEIKKzEwMzpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlMuIEouIERvcyBQLgorMTA0OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86Uy4gSi4gZGUgUmliYW1hcgorMTA1OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86Uy4gTHV6aWEKKzEwNjpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlMuIFJhaW11bmRvIEQuTQorMTA3OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86Uy5RLiBEbyBNYXJhbmhhbworMTA4OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86U2FtYmFpYmEKKzEwOTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlNhbnRhIEhlbGVuYQorMTEwOkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86U2FudGEgSW5lcworMTExOkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86U2FudGEgUml0YQorMTEyOkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86U2FvIEFudG9uaW8gTC4KKzExMzpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlNhbyBCZW50bworMTE0OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86U2FvIEpvYW8gQmF0aXN0YQorMTE1OkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86U2FvIEx1aXMKKzExNjpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlNhbyBNYXRldXMgZG8gTWEKKzExNzpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlNhbyBWaWNlbnRlIEYuCisxMTg6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpTaXRpbyBOb3ZvCisxMTk6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpTdWN1cGlyYSBEbyBOdGUKKzEyMDpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlRhc3NvIEZyYWdvc28KKzEyMTpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlRpbWJpcmFzCisxMjI6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpUaW1vbgorMTIzOkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86VHVudHVtCisxMjQ6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpUdXJpYWN1CisxMjU6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpUdXRvaWEKKzEyNjpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlVyYmFubyBTYW50b3MKKzEyNzpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlZhcmdlbSBHcmFuZGUKKzEyODpCUjpCUkE6QlJBU0lMOk1BUkFOSEFPOlZpYW5hCisxMjk6QlI6QlJBOkJSQVNJTDpNQVJBTkhBTzpWaWN0b3JpYSBEbyBNLgorMTMwOkJSOkJSQTpCUkFTSUw6TUFSQU5IQU86VmljdG9yaW5vIEZyZWlyZQorMTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpBZGFtYW50aW5hCisyOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkFkb2xmbworMzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpBZ3VhaQorNDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpBZ3VhcyBEYSBQcmF0YQorNTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpBZ3VhcyBEZSBMaW5kb2lhCis2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkFndWFzIERlIFNhbyBQZWQKKzc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QWd1ZG9zCis4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkFsZnJlZG8gTWFyY29uZGUKKzk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QWx0YWlyCisxMDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpBbHRpbm9wb2xpcworMTE6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QWx0byBBbGVncmUKKzEyOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkFsdmFyZXMgRmxvcmVuY2UKKzEzOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkFsdmFyZXMgTWFjaGFkbworMTQ6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QWx2YXJvIERlIENhcnZhbAorMTU6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QWx2aW5sYW5kaWEKKzE2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkFtZXJpY2FuYQorMTc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QW1lcmljbyBCcmFzaWxpZQorMTg6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QW1lcmljbyBEZSBDYW1wbworMTk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QW1wYXJvCisyMDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpBbmFsYW5kaWEKKzIxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkFuZHJhZGluYQorMjI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QW5nYXR1YmEKKzIzOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkFuaGVtYmkKKzI0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkFuaHVtYXMKKzI1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkFwYXJlY2lkYQorMjY6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QXBhcmVjaWRhIEQnT2VzdAorMjc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QXBpYWkKKzI4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkFxdWVyYQorMjk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QXJhY2F0dWJhCiszMDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpBcmFjb2lhYmEgRGEgU2VyCiszMTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpBcmFtaW5hCiszMjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpBcmFuZHUKKzMzOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkFyYXJhcXVhcmEKKzM0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkFyYXJhcworMzU6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QXJlYWx2YQorMzY6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QXJlaWFzCiszNzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpBcmVpb3BvbGlzCiszODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpBcmlyYW5oYQorMzk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QXJ0dXIgTm9ndWVpcmEKKzQwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkFydWphCis0MTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpBc3NpcworNDI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QXRpYmFpYQorNDM6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QXVyaWZsYW1hCis0NDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpBdmFpCis0NTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpBdmFuaGFuZGF2YQorNDY6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QXZhcmUKKzQ3OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkJhZHkgQmFzc2l0Cis0ODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpCYWxiaW5vcworNDk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QmFsc2FtbworNTA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QmFuYW5hbAorNTE6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QmFyYW8gRGUgQW50b25pbgorNTI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QmFyYm9zYQorNTM6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QmFyaXJpCis1NDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpCYXJyYSBCb25pdGEKKzU1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkJhcnJhIERvIFR1cnZvCis1NjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpCYXJyZXRvcworNTc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QmFycmluaGEKKzU4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkJhcnVlcmkKKzU5OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkJhc3RvcworNjA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QmF0YXRhaXMKKzYxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkJhdXJ1Cis2MjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpCZWJlZG91cm8KKzYzOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkJlcm4uIERlIENhbXBvcworNjQ6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QmVydG8gRGUgQWJyZXUKKzY1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkJpbGFjCis2NjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpCaXJpZ3VpCis2NzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpCaXJpdGliYSBNaXJpbQorNjg6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Qm9hIEVzcGVyYW5jYSBEbworNjk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Qm9jYWluYQorNzA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Qm9mZXRlCis3MTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpCb2l0dXZhCis3MjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpCb24gSmVzdXMgRG9zIFBlCis3MzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpCb3JhCis3NDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpCb3JhY2VsYQorNzU6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Qm9yYm9yZW1hCis3NjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpCb3R1Y2F0dQorNzc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QnJhZ2FuY2EgUGF1bGlzdAorNzg6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QnJhdW5hCis3OTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpCcm9kb3NxdWkKKzgwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkJyb3RhcworODE6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QnVyaQorODI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86QnVyaXRhbWEKKzgzOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkJ1cml0aXphbAorODQ6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Q2FicmFsaWEgUGF1bGlzdAorODU6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Q2FicmV1dmEKKzg2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkNhY2FwYXZhCis4NzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDYWNob2VpcmEgUGF1bGlzCis4ODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDYWZlbGFuZGlhCis4OTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDYWlhYnUKKzkwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkNhaWVpcmFzCis5MTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDYWl1YQorOTI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Q2FqYW1hcgorOTM6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Q2Fqb2JpCis5NDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDYWp1cnUKKzk1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkNhbXBpbmFzCis5NjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDYW1wbyBEbyBKb3JkYW8KKzk3OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkNhbXBvIExpbXBvCis5ODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDYW1wb3MgTm92b3MgUGF1Cis5OTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDYW5hbmVpYQorMTAwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkNhbmRpZG8gTW90YQorMTAxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkNhbmRpZG8gUm9kcmlndWUKKzEwMjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDYXBhbyBCb25pdG8KKzEwMzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDYXBlbGEgRG8gQWx0bworMTA0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkNhcGl2YXJpCisxMDU6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Q2FyYWd1YXRhdHViYQorMTA2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkNhcmFwaWN1aWJhCisxMDc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Q2FyZG9zbworMTA4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkNhc2EgQnJhbmNhCisxMDk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Q2Fzc2lhIERvcyBDb3F1ZQorMTEwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkNhc3RpbGhvCisxMTE6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Q2F0YW5kdXZhCisxMTI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Q2F0aW5ndWEKKzExMzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDZWRyYWwKKzExNDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDZXJxdWVpcmEgQ2VzYXIKKzExNTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDZXJxdWlsaG8KKzExNjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDZXNhcmlvIExhbmdlCisxMTc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Q2hhcnF1ZWFkYQorMTE4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkNoYXZhbnRlcworMTE5OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkNsZW1lbnRpbmEKKzEyMDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDb2xpbmEKKzEyMTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDb2xvbWJpYQorMTIyOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkNvbmNoYWwKKzEyMzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDb25jaGFzCisxMjQ6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Q29yZGVpcm9wb2xpcworMTI1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkNvcm9hZG9zCisxMjY6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Q29yb25lbCBNYWNlZG8KKzEyNzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDb3J1bWJhdGFpCisxMjg6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Q29zbW9wb2xpcworMTI5OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkNvc21vcmFtYQorMTMwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkNvdGlhCisxMzE6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Q3JhdmluaG9zCisxMzI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Q3Jpc3RhaXMgUGF1bC4KKzEzMzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpDcnV6YWxpYQorMTM0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkNydXplaXJvCisxMzU6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Q3ViYXRhbworMTM2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkN1bmhhCisxMzc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86RGVzY2FsdmFkbworMTM4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkRpYWRlbWEKKzEzOTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpEaW9zIENvcnJlZ29zCisxNDA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86RGl2aW5vbGFuZGlhCisxNDE6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86RG9icmFkYQorMTQyOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkRvdXJhZG8KKzE0MzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpEcmFjZW5hCisxNDQ6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86RHVhcnRpbmEKKzE0NTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpEdWxjaW5vcG9saXMKKzE0NjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpEdW1vbnQKKzE0NzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpFY2hhcG9yYQorMTQ4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkVsIERvcmFkbworMTQ5OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkVsaWFzIEZhdXN0bworMTUwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkVtYnUKKzE1MTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpFbWJ1IEd1YWN1CisxNTI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86RXN0cmVsYSBEJ09lc3RlCisxNTM6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86RXN0cmVsYSBkbyBub3J0ZQorMTU0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkZhcnR1cmEKKzE1NTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpGZXJuYW5kbyBQcmVzdGVzCisxNTY6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86RmVybmFuZG9wb2xpcworMTU3OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkZlcnJheiBkZSBWYXNjb24KKzE1ODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpGbG9yYSBSaWNhCisxNTk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86RmxvcmVhbAorMTYwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkZsb3JpZGEgUGF1bGlzdGEKKzE2MTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpGcmFuY2EKKzE2MjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpGcmFuY2lzY28gTW9yYXRvCisxNjM6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86RnJhbmNvIERhIFJvY2hhCisxNjQ6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86R2FsYWkKKzE2NTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpHYXJjYQorMTY2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkdhc3RhbyBWaWRpZ2FsCisxNjc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86R2VuZXJhbCBTYWxnYWRvCisxNjg6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86R2V0dWxpbmEKKzE2OTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpHbGljZXJpbworMTcwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkd1YWljYXJhCisxNzE6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86R3VhaW1iZQorMTcyOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkd1YWlyYQorMTczOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkd1YXBpYXJhCisxNzQ6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86R3VhcmEKKzE3NTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpHdWFyYWNhaQorMTc2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkd1YXJhY2kKKzE3NzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpHdWFyYW5pIGQiT2VzdGUKKzE3ODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpHdWFyYW50YQorMTc5OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkd1YXJhbnRpbmd1ZXRhCisxODA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86R3VhcmFyYXBlcworMTgxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkd1YXJhcmVtYQorMTgyOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkd1YXJlaQorMTgzOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkd1YXJpYmEKKzE4NDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpHdWFydWphCisxODU6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86R3VhcnVsaG9zCisxODY6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86R3V6b2xhbmRpYQorMTg3OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkhlcmN1bGFuZGlhCisxODg6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SWFjYW5nYQorMTg5OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOklhY3JpCisxOTA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SWJhdGUKKzE5MTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpJYmlyYQorMTkyOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkliaXJhcmVtYQorMTkzOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkliaXRpbmdhCisxOTQ6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SWJ1aW5hCisxOTU6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SWNlbQorMTk2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkllcGUKKzE5NzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpJZ2FyYWNhIERvIFRpZXRlCisxOTg6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SWdhcmFwYXZhCisxOTk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SWdhcmF0YQorMjAwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOklndWFwZQorMjAxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOklsaGFiZWxhCisyMDI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SW5kYWlhdHViYQorMjAzOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkluZGlhbmEKKzIwNDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpJbmRpYXBvcmEKKzIwNTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpJbnViaWEgUGF1bGlzdGEKKzIwNjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpJcGF1Y3UKKzIwNzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpJcGVybworMjA4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOklwZXVuYQorMjA5OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOklwb3JhbmdhCisyMTA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SXB1YQorMjExOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOklyYWNlbWFwb2xpcworMjEyOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOklyYXB1YQorMjEzOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOklyYXB1cnUKKzIxNDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpJdGFiZXJhCisyMTU6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SXRhaQorMjE2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkl0YWpvYmkKKzIxNzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpJdGFqdQorMjE4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkl0YW5oYWVtCisyMTk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SXRhcGVjZXJpY2EgRGEgUworMjIwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkl0YXBldGluaW5nYQorMjIxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkl0YXBldmEKKzIyMjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpJdGFwZXZpCisyMjM6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SXRhcG9saXMKKzIyNDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpJdGFwb3JhbmdhCisyMjU6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SXRhcHVpCisyMjY6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SXRhcHVyYQorMjI3OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkl0YXF1YXF1ZWNldHViYQorMjI4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkl0YXJhcmUKKzIyOTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpJdGFyaXJpCisyMzA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SXRhdGliYQorMjMxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkl0YXRpbmdhCisyMzI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SXRpcmFwaW5hCisyMzM6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SXRpcmFwdWEKKzIzNDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpJdG9iaQorMjM1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkl0dQorMjM2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkl0dXBldmEKKzIzNzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpJdHV2ZXJhdmEKKzIzODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpKYWJvcmFuZGkKKzIzOTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpKYWJ1dGljYWJhbAorMjQwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkphY2FyZWkKKzI0MTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpKYWNpCisyNDI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SmFjdXBpcmFuZ2EKKzI0MzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpKYWd1YXJpdW5hCisyNDQ6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SmFsZXMKKzI0NTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpKYW1iZWlybworMjQ2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkphbmRpcmEKKzI0NzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpKYXJhZ3VhCisyNDg6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SmFyZGlub3BvbGlzCisyNDk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SmFyaW51CisyNTA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SmF1CisyNTE6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SmVyaXF1YXJhCisyNTI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Sm9hbm9wb2xpcworMjUzOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkpvYW8gUmFtYWxobworMjU0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkpvc2UgQm9uaWZhY2lvCisyNTU6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SnVsaW8gTWVzcXVpdGEKKzI1NjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpKdW5kaWFpCisyNTc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86SnVucXVlaXJvcG9saXMKKzI1ODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpKdXF1aWEKKzI1OTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpKdXF1aXRpYmEKKzI2MDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpMYWdvaW5oYQorMjYxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkxhcmFuamFsIFBhdWxpc3QKKzI2MjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpMYXZpbmlhCisyNjM6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86TGF2cmluaGFzCisyNjQ6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86TGVtZQorMjY1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkxlbmNvaXMgUGF1bGlzdGEKKzI2NjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpMaW1laXJhCisyNjc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86TGluZG9pYQorMjY4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkxpbnMKKzI2OTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpMb3JlbmEKKzI3MDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpMb3V2ZWlyYQorMjcxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkx1Y2VsaWEKKzI3MjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpMdWNpYW5vcG9saXMKKzI3MzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpMdWlzIEFudG9uaW8KKzI3NDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpMdWlzaWFuaWEKKzI3NTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpMdXBlcmNpbworMjc2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOkx1dGVjaWEKKzI3NzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpNYWNhdHViYQorMjc4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk1hY2F1YmFsCisyNzk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86TWFjZWRvbmlhCisyODA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86TWFnZGEKKzI4MTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpNYWlyaW5xdWUKKzI4MjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpNYWlyaXBvcmEKKzI4MzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpNYW5kdXJpCisyODQ6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86TWFyYWJhIFBhdWxpc3RhCisyODU6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86TWFyYWNhaQorMjg2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk1hcmlhcG9saXMKKzI4NzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpNYXJpbGlhCisyODg6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86TWFyaW5vcG9saXMKKzI4OTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpNYXJ0aW5vcG9saXMKKzI5MDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpNYXRhbworMjkxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk1hdWEKKzI5MjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpNZW5kb25jYQorMjkzOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk1lcmlkaWFubworMjk0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk1pZ3VlbG9wb2xpcworMjk1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk1pbmVpcm9zIGRvIFRpZXQKKzI5NjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpNaXJhIEVzdHJlbGEKKzI5NzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpNaXJhY2F0dQorMjk4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk1pcmFuZG9wb2xpcworMjk5OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk1pcmFudGUgRG8gUGFyYW4KKzMwMDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpNaXJhc3NvbAorMzAxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk1pcmFzc29sYW5kaWEKKzMwMjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpNb2NvY2EKKzMwMzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpNb2dpIERhcyBDcnV6ZXMKKzMwNDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpNb2dpIEd1YWN1CiszMDU6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86TW9naSBNaXJpbQorMzA2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk1vbWJ1Y2EKKzMwNzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpNb25jb2VzCiszMDg6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86TW9uZ2FndWEKKzMwOTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpNb250ZSBBbHRvCiszMTA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86TW9udGUgQXByYXppdmVsCiszMTE6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86TW9udGUgQXp1bCBQYXVsaQorMzEyOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk1vbnRlIENhc3RlbG8KKzMxMzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpNb250ZWlybworMzE0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk1vbnRlaXJvIExvYmF0bworMzE1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk1vcnJvIEFndWRvCiszMTY6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86TW9ydW5nYWJhCiszMTc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86TXRlIEFsZWdyZSBEbyBTdQorMzE4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk11cnV0aW5nYSBEbyBTdWwKKzMxOTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpOYXJhbmRpYmEKKzMyMDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpOYXRpdmlkYWRlIERhIFNlCiszMjE6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86TmF6YXJlIFBhdWxpc3RhCiszMjI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86TmV2ZXMgUGF1bGlzdGEKKzMyMzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpOaGFuZGVhcmEKKzMyNDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpOaXBvYQorMzI1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk5vdmEgQWxpYW5jYQorMzI2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk5vdmEgRXVyb3BhCiszMjc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Tm92YSBHcmFuYWRhCiszMjg6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Tm92YSBHdWF0YXBvcmFuZworMzI5OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk5vdmEgSW5kZXBlbmRlbmMKKzMzMDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpOb3ZhIEx1eml0YW5pYQorMzMxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk5vdmEgT2Rlc3NhCiszMzI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86Tm92byBIb3Jpem9udGUKKzMzMzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpOdXBvcmFuZ2EKKzMzNDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpPY2F1Y3UKKzMzNTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpPbGVvCiszMzY6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86T2xpbXBpYQorMzM3OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk9uZGEgVmVyZGUKKzMzODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpPcmllbnRlCiszMzk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86T3JpbmRpdXZhCiszNDA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86T3JsYW5kaWEKKzM0MTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpPc2FzY28KKzM0MjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpPc2NhciBCcmVzc2FuZQorMzQzOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk9zdmFsZG8gQ3J1egorMzQ0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOk91cmluaG9zCiszNDU6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UGFjYWVtYnUKKzM0NjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQYWxlc3RpbmEKKzM0NzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQYWxtYXJlcyBQYXVsaXN0CiszNDg6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UGFsbWVpcmEgRCdPZXN0ZQorMzQ5OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBhbG1pdGFsCiszNTA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UGFub3JhbWEKKzM1MTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQYXJhZ3VhY3UgUGF1bGlzCiszNTI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UGFyYWlidW5hCiszNTM6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UGFyYWlzbworMzU0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBhcmFuYXBhcmVtYQorMzU1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBhcmFuYXB1YQorMzU2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBhcmFwdWEKKzM1NzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQYXJkaW5obworMzU4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBhcmVsaGVpcm9zCiszNTk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UGFyaXF1ZXJhLWFjdQorMzYwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBhdHJvY2luaW8gUGF1bGkKKzM2MTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQYXVsaWNlaWEKKzM2MjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQYXVsaW5pYQorMzYzOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBhdWxvIERlIEZhcmlhCiszNjQ6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UGVkZXJuZWlyYXMKKzM2NTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQZWRyYSBCZWxhCiszNjY6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UGVkcmFub3BvbGlzCiszNjc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UGVkcmVndWxobworMzY4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBlZHJlaXJhCiszNjk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UGVkcm8gRGUgVG9sZWRvCiszNzA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UGVuYXBvbGlzCiszNzE6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UGVyZWlyYSBCYXJyZXRvCiszNzI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UGVyZWlyYXMKKzM3MzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQZXJ1aWJlCiszNzQ6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UGlhY2F0dQorMzc1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBpZWRhZGUKKzM3NjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQaWxhciBEbyBTdWwKKzM3NzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQaW5kYW1vbmhhbmdhYmEKKzM3ODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQaW5kb3JhbWEKKzM3OTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQaW5oYWwKKzM4MDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQaW5oYWx6aW5obworMzgxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBpcXVlcm9iaQorMzgyOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBpcXVldGUKKzM4MzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQaXJhY2FpYQorMzg0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBpcmFjaWNhYmEKKzM4NTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQaXJhY3VudW5nYQorMzg2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBpcmFqdQorMzg3OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBpcmFqdWkKKzM4ODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQaXJhbmdpCiszODk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UGlyYXBvcmEgRG8gQm9tCiszOTA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UGlyYXBvemluaG8KKzM5MTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQaXJhdGluaW5nYQorMzkyOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBpdGFuZ3VlaXJhcworMzkzOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBsYW5hbHRvCiszOTQ6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UGxhdGluYQorMzk1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBvYQorMzk2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBvbG9uaQorMzk3OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBvbXBlaWEKKzM5ODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQb25nYWkKKzM5OTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQb250YWwKKzQwMDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQb250ZXMgR2VzdHJhbAorNDAxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBvcHVsaW5hCis0MDI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UG9yYW5nYWJhCis0MDM6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UG9ydG8gRmVsaXoKKzQwNDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQb3J0byBGZXJyZWlyYQorNDA1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlBvdGlyZW5kYWJhCis0MDY6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UHJhZG9wb2xpcworNDA3OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlByYWlhIEdyYW5kZQorNDA4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlByZXMgQmVybmFyZGVzCis0MDk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UHJlcyBFcGl0YWNpbworNDEwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlByZXMgUHJ1ZGVudGUKKzQxMTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQcmVzIFZlbmNlc2xhdQorNDEyOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlByZXNpZGVudGUgQWx2ZXMKKzQxMzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpQcm9taXNzYW8KKzQxNDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpRdWF0YQorNDE1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlF1ZWlyb3oKKzQxNjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpRdWVsdXoKKzQxNzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpRdWl0YW5hCis0MTg6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UmFmYXJkCis0MTk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UmFuY2hhcmlhCis0MjA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UmViZWlyYW8gVmVybWVsaAorNDIxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlJlZGVuY2FvIERhIFNlcnIKKzQyMjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpSZWdlbnRlIEZlaWpvCis0MjM6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UmVnaW5vcG9saXMKKzQyNDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpSZWdpc3RybworNDI1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlJlc3RpbmdhCis0MjY6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UmliZWlyYQorNDI3OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlJpYmVpcmFvIEJvbml0bworNDI4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlJpYmVpcmFvIERvIFN1bAorNDI5OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlJpYmVpcmFvIFByZXRvCis0MzA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UmliZWlyYW8gYnJhbmNvCis0MzE6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86UmliZXJhbyBDb3JyZW50ZQorNDMyOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlJpZmFpbmEKKzQzMzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpSaW5jYW8KKzQzNDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpSaW5vcG9saXMKKzQzNTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpSaW8gQ2xhcm8KKzQzNjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpSaW8gRGFzIFBlZHJhcworNDM3OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlJpbyBHcmFuZGUgRGEgU2UKKzQzODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpSaW9sYW5kaWEKKzQzOTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpSb2JlaXJhbyBQaXJlcworNDQwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlJvc2VpcmEKKzQ0MTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpSdWJpYWNlYQorNDQyOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlMuIEpvYW8gRGEgQm9hIFYKKzQ0MzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYWJpbm8KKzQ0NDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYWdyZXMKKzQ0NTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYWxlcworNDQ2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbGVzIE9saXZlaXJhCis0NDc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2FsZXNvcG9saXMKKzQ0ODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYWxtb3VyYW8KKzQ0OTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYWx0bworNDUwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbHRvIERvIFBpcmFwb3IKKzQ1MTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYWx0byBHcmFuZGUKKzQ1MjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYW4gUGVkcm8KKzQ1MzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYW5kb3ZhbGluYQorNDU0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbnRhIEFkZWxpYQorNDU1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbnRhIEFsYmVydGluYQorNDU2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbnRhIEJhcmJhcmEgRG8KKzQ1NzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYW50YSBCYXJiYXJhIGQiCis0NTg6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2FudGEgQnJhbmNhCis0NTk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2FudGEgQ3J1eiBEYXMgUAorNDYwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbnRhIENydXogRG8gUmkKKzQ2MTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYW50YSBFcm5lc3RpbmEKKzQ2MjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYW50YSBGZSBEbyBTdWwKKzQ2MzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYW50YSBHZXJ0cnVkZXMKKzQ2NDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYW50YSBJc2FiZWwKKzQ2NTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYW50YSBMdWNpYQorNDY2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbnRhIE1lcmNlZGVzCis0Njc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2FudGEgUm9zYSBEZSBWaQorNDY4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbnRhbmEgRGEgUG9udGUKKzQ2OTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYW50YW5hIERlIFBhcm5hCis0NzA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2FudG8gQW5hc3RhY2lvCis0NzE6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2FudG8gQW5kcmUKKzQ3MjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYW50byBBbnRvbmlvIERvCis0NzM6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2FudG9wb2xpcyBEbyBBZworNDc0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbnRvcworNDc1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbyBCZW50byBEbyBTYXAKKzQ3NjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYW8gQmVybmFyZG8gZG8KKzQ3NzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYW8gQ2FldGFubyBkbyBTCis0Nzg6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2FvIENhcmxvcworNDc5OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbyBGcmFuY2lzY28KKzQ4MDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYW8gSm9hbyBEYXMgRHVhCis0ODE6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2FvIEpvYW8gRG8gUGF1Cis0ODI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2FvIEpvYXF1aW0gZGEgQgorNDgzOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbyBKb3NlIERhIEJlbGEKKzQ4NDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYW8gSm9zZSBEbyBCYXJyCis0ODU6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2FvIEpvc2UgZG8gUmlvCis0ODY6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2FvIEpvc2UgZG9zIENhbQorNDg3OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbyBMdWlzIERvIFBhcmEKKzQ4ODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYW8gTWFudWVsCis0ODk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2FvIE1pZ3VlbCBBcmNhbgorNDkwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbyBQYXVsbworNDkxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbyBQZWRybyBEbyBUdXIKKzQ5MjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTYW8gU2ViYXN0aWFvCis0OTM6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2FvIFNlYmFzdGlhbyBEYQorNDk0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbyBTaW1hbworNDk1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbyByb3F1ZQorNDk2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhbyB2aWNlbnRlCis0OTc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2FyYXB1aQorNDk4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNhcnV0YWlhCis0OTk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2F0LiBDbGFyYSBEJ09lcworNTAwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNlYmFzdGlhbm9wb2xpcworNTAxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNlcnJhIEF6dWwKKzUwMjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTZXJyYSBOZWdyYQorNTAzOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNlcnJhbmEKKzUwNDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTZXJ0YW96aW5obworNTA1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNldGUgQmFycmFzCis1MDY6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2V2ZXJpbmlhCis1MDc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U2lsdmVpcmFzCis1MDg6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U29jb3JybworNTA5OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlNvcm9jYWJhCis1MTA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U3RhLiBDcnV6IERhIENvbgorNTExOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlN0YS4gTWFyaWEgZGEgU2UKKzUxMjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTdGEuIFJpdGEgRG8gT2VzCis1MTM6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86U3RhLlJpdGEgZG8gUGFzcworNTE0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlN0byBFeHBlZGl0bworNTE1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlN0by4gQW50b25pbyBEZQorNTE2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlN0by4gQW50b25pbyBEbworNTE3OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlN0by5BbnRvbmlvIGRhIEEKKzUxODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTdWQgTWVubnVjY2kKKzUxOTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTdXJhbWUKKzUyMDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpTdXphbm8KKzUyMTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpUYWJhcHVhCis1MjI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VGFiYXRpbmdhCis1MjM6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VGFib2FvIERhIFNlcnJhCis1MjQ6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VGFjaWJhCis1MjU6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VGFndWFpCis1MjY6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VGFpYWN1Cis1Mjc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VGFpdXZhCis1Mjg6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VGFtYmF1Cis1Mjk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VGFuYWJpCis1MzA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VGFwaXJhaQorNTMxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlRhcGlyYXRpYmEKKzUzMjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpUYXF1YXJpdGluZ2EKKzUzMzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpUYXF1YXJpdHViYQorNTM0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlRhcmFiYWkKKzUzNTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpUYXR1aQorNTM2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlRhdWJhdGUKKzUzNzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpUZWp1cGEKKzUzODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpUZW9kb3JvIFNhbXBhaW8KKzUzOTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpUZXJyYSBSb3hhCis1NDA6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VGlldGUKKzU0MTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpUaW1idXJpCis1NDI6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VG9ycmluaGEKKzU0MzpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpUcmVtZW1iZQorNTQ0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlRyZXMgRnJvbnRlaXJhcworNTQ1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlR1cGEKKzU0NjpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpUdXBpIFBhdWxpc3RhCis1NDc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VHVyaXViYQorNTQ4OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlR1cm1hbGluYQorNTQ5OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlViYXR1YmEKKzU1MDpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpVYmlyYWphcmEKKzU1MTpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpVY2hvYQorNTUyOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlVuaWFvIFBhdWxpc3RhCis1NTM6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VXJhbmlhCis1NTQ6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VXJ1Cis1NTU6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VXJ1cGVzCis1NTY6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VmFsZW50aW0gR2VudGlsCis1NTc6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VmFsaW5ob3MKKzU1ODpCUjpCUkE6QlJBU0lMOlNBTyBQQVVMTzpWYWxwYXJhaXNvCis1NTk6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VmFyZ2VtIEdyYW5kZSBEbworNTYwOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlZhcnplYSBQYXVsaXN0YQorNTYxOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlZlcmEgQ3J1egorNTYyOkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlZlcmRlCis1NjM6QlI6QlJBOkJSQVNJTDpTQU8gUEFVTE86VmluaGVkbworNTY0OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlZpcmFkb3VybworNTY1OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlZpc3RhIGFsZWdyZSBkbworNTY2OkJSOkJSQTpCUkFTSUw6U0FPIFBBVUxPOlZvdHVwb3JhbmdhCisxOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkFiYXRpYQorMjpCUjpCUkE6QlJBU0lMOlBBUkFOQTpBZHJpYW5vcG9saXMKKzM6QlI6QlJBOkJSQVNJTDpQQVJBTkE6QWd1ZG9zIGRvIFN1bAorNDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpBbG0gVGFtYW5kYXJlCis1OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkFsdG8gUGFyYW5hCis2OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkFsdG8gUGlxdWlyaQorNzpCUjpCUkE6QlJBU0lMOlBBUkFOQTpBbHRvbmlhCis4OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkFsdm9yYWRhIGRvIFN1bAorOTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpBbWFwb3JhCisxMDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpBbXBlcmUKKzExOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkFuZGlyYQorMTI6QlI6QlJBOkJSQVNJTDpQQVJBTkE6QW50b25pbmEKKzEzOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkFudG9uaW8gT2xpbnRvCisxNDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpBcHVjYXJhbmEKKzE1OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkFyYXBvbmdhcworMTY6QlI6QlJBOkJSQVNJTDpQQVJBTkE6QXJhcG90aQorMTc6QlI6QlJBOkJSQVNJTDpQQVJBTkE6QXJhcnVuYQorMTg6QlI6QlJBOkJSQVNJTDpQQVJBTkE6QXJhdWNhcmlhCisxOTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpBc3NhaQorMjA6QlI6QlJBOkJSQVNJTDpQQVJBTkE6QXNzaXMgQ2hhdGVhdWJyaQorMjE6QlI6QlJBOkJSQVNJTDpQQVJBTkE6QXN0b3JnYQorMjI6QlI6QlJBOkJSQVNJTDpQQVJBTkE6QXRhbGFpYQorMjM6QlI6QlJBOkJSQVNJTDpQQVJBTkE6QmFsc2EgTm92YQorMjQ6QlI6QlJBOkJSQVNJTDpQQVJBTkE6QmFuZGVpcmFudGVzCisyNTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpCYXJib3NhIEZlcnJhegorMjY6QlI6QlJBOkJSQVNJTDpQQVJBTkE6QmFycmEgZG8gSmFjYXJlCisyNzpCUjpCUkE6QlJBU0lMOlBBUkFOQTpCYXJyYWNhbworMjg6QlI6QlJBOkJSQVNJTDpQQVJBTkE6QmVsYSAgVmlzdGEgZG8gUAorMjk6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Qml0dXJ1bmEKKzMwOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkJvYSBFc3BlcmFuY2EKKzMxOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkJvY2FpdXZhIGRvIFN1bAorMzI6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Qm9tIFN1Y2Vzc28KKzMzOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkJvcnJhem9wb2xpcworMzQ6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Q2FmZWFyYQorMzU6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Q2FsaWZvcm5pYQorMzY6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Q2FtYmFyYQorMzc6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Q2FtYmUKKzM4OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkNhbWJpcmEKKzM5OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkNhbXBpbmEgR3JhbmRlIGQKKzQwOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkNhbXBpbmEgZGEgbGFnb2EKKzQxOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkNhbXBvCis0MjpCUjpCUkE6QlJBU0lMOlBBUkFOQTpDYW1wbyBNb3VyYW8KKzQzOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkNhbXBvIGRvIFRlbmVudGUKKzQ0OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkNhbmRpZG8gZGUgQWJyZXUKKzQ1OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkNhcC4gTGVvbmlkYXMgTWEKKzQ2OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkNhcmxvcG9saXMKKzQ3OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkNhc2NhdmVsCis0ODpCUjpCUkE6QlJBU0lMOlBBUkFOQTpDYXN0cm8KKzQ5OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkNhdGFuZHV2YXMKKzUwOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkNlbnRlbmFyaW8gZG8gU3UKKzUxOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkNlcnJvIEF6dWwKKzUyOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkNldSAgQXp1bAorNTM6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Q2hvcGluemluaG8KKzU0OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkNpYW5vcnRlCis1NTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpDaWRhZGUgR2F1Y2hhCis1NjpCUjpCUkE6QlJBU0lMOlBBUkFOQTpDbGV2ZWxhbmRpYQorNTc6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Q29sb21ibworNTg6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Q29sb3JhZG8KKzU5OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkNvbmdvbmhpbmhhcworNjA6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Q29ucy4gTWF5cmluY2sKKzYxOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkNvbnRlbmRhCis2MjpCUjpCUkE6QlJBU0lMOlBBUkFOQTpDb3JiZWxpYQorNjM6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Q29ybmVsaW8gUHJvY29waQorNjQ6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Q29yb25lbCBWaXZpZGEKKzY1OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkNydXogTWFjaGFkbworNjY6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Q3J1emVpcm8gZCBPZXN0ZQorNjc6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Q3J1emVpcm8gZG8gU3VsCis2ODpCUjpCUkE6QlJBU0lMOlBBUkFOQTpDdXJpdGliYQorNjk6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Q3VyaXV2YQorNzA6QlI6QlJBOkJSQVNJTDpQQVJBTkE6RGlhbWFudGUgZG8gTm9ydAorNzE6QlI6QlJBOkJSQVNJTDpQQVJBTkE6RG9pcyBWaXppbmhvcworNzI6QlI6QlJBOkJSQVNJTDpQQVJBTkE6RG91dG9yIENhbWFyZ28KKzczOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkVuZWFzIE1hcnF1ZXMKKzc0OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkVuZy4gQmVsdHJhbworNzU6QlI6QlJBOkJSQVNJTDpQQVJBTkE6RmF4aW5hbAorNzY6QlI6QlJBOkJSQVNJTDpQQVJBTkE6RmVuaXgKKzc3OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkZsb3JhaQorNzg6QlI6QlJBOkJSQVNJTDpQQVJBTkE6RmxvcmVzdGEKKzc5OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkZsb3Jlc3RvcG9saXMKKzgwOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkZsb3JpZGEKKzgxOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkZvcm1vc2EKKzgyOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkZveiBkbyBJZ3VhY3UKKzgzOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkZyYW5jaXNjbyBBbHZlcworODQ6QlI6QlJBOkJSQVNJTDpQQVJBTkE6RnJhbmNpc2NvIEJlbHRyYQorODU6QlI6QlJBOkJSQVNJTDpQQVJBTkE6R2VuZXJhbCBDYXJuZWlybworODY6QlI6QlJBOkJSQVNJTDpQQVJBTkE6R29pby1FcmUKKzg3OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkdyYW5kZXMgUmlvcworODg6QlI6QlJBOkJSQVNJTDpQQVJBTkE6R3VhaXJhCis4OTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpHdWFpcmFjYQorOTA6QlI6QlJBOkJSQVNJTDpQQVJBTkE6R3VhcGlyYW1hCis5MTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpHdWFwb3JlbWEKKzkyOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkd1YXJhY2kKKzkzOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkd1YXJhbmlhY3UKKzk0OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkd1YXJhcHVhdmEKKzk1OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkd1YXJhcXVlY2FiYQorOTY6QlI6QlJBOkJSQVNJTDpQQVJBTkE6R3VhcmF0dWJhCis5NzpCUjpCUkE6QlJBU0lMOlBBUkFOQTpJYmFpdGkKKzk4OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkliaXBvcmEKKzk5OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkljYXJhaW1hCisxMDA6QlI6QlJBOkJSQVNJTDpQQVJBTkE6SWd1YXJhY3UKKzEwMTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpJbWJpdHV2YQorMTAyOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkluYWNpbyBNYXJ0aW5zCisxMDM6QlI6QlJBOkJSQVNJTDpQQVJBTkE6SW5hamEKKzEwNDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpJbmRpYW5vcG9saXMKKzEwNTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpJcGlyYW5nYQorMTA2OkJSOkJSQTpCUkFTSUw6UEFSQU5BOklwb3JhCisxMDc6QlI6QlJBOkJSQVNJTDpQQVJBTkE6SXJhdGkKKzEwODpCUjpCUkE6QlJBU0lMOlBBUkFOQTpJcmV0YW1hCisxMDk6QlI6QlJBOkJSQVNJTDpQQVJBTkE6SXRhZ3VhamUKKzExMDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpJdGFtYmFyYWNhCisxMTE6QlI6QlJBOkJSQVNJTDpQQVJBTkE6SXRhbWJlCisxMTI6QlI6QlJBOkJSQVNJTDpQQVJBTkE6SXRhcGVqYXJhIGQnIE9lcworMTEzOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkl0YXVuYSBkbyBTdWwKKzExNDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpJdmFpCisxMTU6QlI6QlJBOkJSQVNJTDpQQVJBTkE6SXZhaXBvcmEKKzExNjpCUjpCUkE6QlJBU0lMOlBBUkFOQTpJdmF0dXZhCisxMTc6QlI6QlJBOkJSQVNJTDpQQVJBTkE6SmFidXRpCisxMTg6QlI6QlJBOkJSQVNJTDpQQVJBTkE6SmFjYXJlemluaG8KKzExOTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpKYWd1YXBpdGEKKzEyMDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpKYWd1YXJhaXZhCisxMjE6QlI6QlJBOkJSQVNJTDpQQVJBTkE6SmFuZGFpYSBkbyBTdWwKKzEyMjpCUjpCUkE6QlJBU0lMOlBBUkFOQTpKYW5pb3BvbGlzCisxMjM6QlI6QlJBOkJSQVNJTDpQQVJBTkE6SmFwaXJhCisxMjQ6QlI6QlJBOkJSQVNJTDpQQVJBTkE6SmFwdXJhCisxMjU6QlI6QlJBOkJSQVNJTDpQQVJBTkE6SmFyZGltIEFsZWdyZQorMTI2OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkphcmRpbSBPbGluZGEKKzEyNzpCUjpCUkE6QlJBU0lMOlBBUkFOQTpKYXRhemluaG8KKzEyODpCUjpCUkE6QlJBU0lMOlBBUkFOQTpKb2FxdWltIFRhdm9yYQorMTI5OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkp1Y2FyYQorMTMwOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkp1bmRpYWkgZG8gU3VsCisxMzE6QlI6QlJBOkJSQVNJTDpQQVJBTkE6S2Fsb3JlCisxMzI6QlI6QlJBOkJSQVNJTDpQQVJBTkE6TGFwYQorMTMzOkJSOkJSQTpCUkFTSUw6UEFSQU5BOkxhcmFuamVpcmFzIGRvIFMKKzEzNDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpMZW9wb2xpcworMTM1OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkxvYW5kYQorMTM2OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkxvYmF0bworMTM3OkJSOkJSQTpCUkFTSUw6UEFSQU5BOkxvbmRyaW5hCisxMzg6QlI6QlJBOkJSQVNJTDpQQVJBTkE6THVwaW9ub3BvbGlzCisxMzk6QlI6QlJBOkJSQVNJTDpQQVJBTkE6TWFsLiBDYW5kaWRvIFJvbgorMTQwOkJSOkJSQTpCUkFTSUw6UEFSQU5BOk1hbGxldAorMTQxOkJSOkJSQTpCUkFTSUw6UEFSQU5BOk1hbWJvcmUKKzE0MjpCUjpCUkE6QlJBU0lMOlBBUkFOQTpNYW5kYWd1YWN1CisxNDM6QlI6QlJBOkJSQVNJTDpQQVJBTkE6TWFuZGFndWFyaQorMTQ0OkJSOkJSQTpCUkFTSUw6UEFSQU5BOk1hbmRpcml0dWJhCisxNDU6QlI6QlJBOkJSQVNJTDpQQVJBTkE6TWFuZ3VlaXJpbmhhCisxNDY6QlI6QlJBOkJSQVNJTDpQQVJBTkE6TWFudWVsIFJpYmFzCisxNDc6QlI6QlJBOkJSQVNJTDpQQVJBTkE6TWFyaWEgSGVsZW5hCisxNDg6QlI6QlJBOkJSQVNJTDpQQVJBTkE6TWFyaWFsdmEKKzE0OTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpNYXJpbGFuZGlhIGRvIFN1CisxNTA6QlI6QlJBOkJSQVNJTDpQQVJBTkE6TWFyaWxlbmEKKzE1MTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpNYXJpbHV6CisxNTI6QlI6QlJBOkJSQVNJTDpQQVJBTkE6TWFyaW5nYQorMTUzOkJSOkJSQTpCUkFTSUw6UEFSQU5BOk1hcmlvcG9saXMKKzE1NDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpNYXJtZWxlaXJvCisxNTU6QlI6QlJBOkJSQVNJTDpQQVJBTkE6TWFydW1iaQorMTU2OkJSOkJSQTpCUkFTSUw6UEFSQU5BOk1hdGVsYW5kaWEKKzE1NzpCUjpCUkE6QlJBU0lMOlBBUkFOQTpNYXRpbmhvcworMTU4OkJSOkJSQTpCUkFTSUw6UEFSQU5BOk1lZGlhbmVpcmEKKzE1OTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpNaXJhZG9yCisxNjA6QlI6QlJBOkJSQVNJTDpQQVJBTkE6TWlyYXNlbHZhCisxNjE6QlI6QlJBOkJSQVNJTDpQQVJBTkE6TW9yZWlyYSBTYWxlcworMTYyOkJSOkJSQTpCUkFTSUw6UEFSQU5BOk1vcnJldGVzCisxNjM6QlI6QlJBOkJSQVNJTDpQQVJBTkE6TXVuaG96IGRlIE1lbG8KKzE2NDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpOb3NzYSBTZW5ob3JhIGRhCisxNjU6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Tm92YSAgTG9uZHJpbmEKKzE2NjpCUjpCUkE6QlJBU0lMOlBBUkFOQTpOb3ZhIEFsaWFuY2EgZG8KKzE2NzpCUjpCUkE6QlJBU0lMOlBBUkFOQTpOb3ZhIEFtZXJpY2EgZGEKKzE2ODpCUjpCUkE6QlJBU0lMOlBBUkFOQTpOb3ZhIEF1cm9yYQorMTY5OkJSOkJSQTpCUkFTSUw6UEFSQU5BOk5vdmEgQ2FudHUKKzE3MDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpOb3ZhIEVzcGVyYW5jYQorMTcxOkJSOkJSQTpCUkFTSUw6UEFSQU5BOk5vdmEgRmF0aW1hCisxNzI6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Tm92YSBPbGltcGlhCisxNzM6QlI6QlJBOkJSQVNJTDpQQVJBTkE6T3J0aWd1ZWlyYQorMTc0OkJSOkJSQTpCUkFTSUw6UEFSQU5BOk91cml6b25hCisxNzU6QlI6QlJBOkJSQVNJTDpQQVJBTkE6UGFpbmNhbmR1CisxNzY6QlI6QlJBOkJSQVNJTDpQQVJBTkE6UGFsbWFzCisxNzc6QlI6QlJBOkJSQVNJTDpQQVJBTkE6UGFsbWVpcmEKKzE3ODpCUjpCUkE6QlJBU0lMOlBBUkFOQTpQYWxtaXRhbAorMTc5OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlBhbG90aW5hCisxODA6QlI6QlJBOkJSQVNJTDpQQVJBTkE6UGFyYWlzbyAgZG8gTm9ydAorMTgxOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlBhcmFuYWNpdHkKKzE4MjpCUjpCUkE6QlJBU0lMOlBBUkFOQTpQYXJhbmFndWEKKzE4MzpCUjpCUkE6QlJBU0lMOlBBUkFOQTpQYXJhbmFwb2VtYQorMTg0OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlBhcmFuYXZhaQorMTg1OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlBhdG8gQnJhbmNvCisxODY6QlI6QlJBOkJSQVNJTDpQQVJBTkE6UGF1bGEgRnJlaXRhcworMTg3OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlBhdWxvIEZyb250aW4KKzE4ODpCUjpCUkE6QlJBU0lMOlBBUkFOQTpQZWFiaXJ1CisxODk6QlI6QlJBOkJSQVNJTDpQQVJBTkE6UGVyb2xhCisxOTA6QlI6QlJBOkJSQVNJTDpQQVJBTkE6UGVyb2xhICBkJyBPZXN0ZQorMTkxOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlBpZW4KKzE5MjpCUjpCUkE6QlJBU0lMOlBBUkFOQTpQaW5oYWxhbworMTkzOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlBpbmhhbworMTk0OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlBpcmFpIGRvIFN1bAorMTk1OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlBpcmFxdWFyYQorMTk2OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlBpdGFuZ2EKKzE5NzpCUjpCUkE6QlJBU0lMOlBBUkFOQTpQbGFuYWx0aW5hIGRvIFBhCisxOTg6QlI6QlJBOkJSQVNJTDpQQVJBTkE6UGxhbmFsdG8KKzE5OTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpQb250YSBHcm9zc2EKKzIwMDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpQb3JlY2F0dQorMjAxOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlBvcnRvICBBbWF6b25hcworMjAyOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlBvcnRvIFZpdG9yaWEKKzIwMzpCUjpCUkE6QlJBU0lMOlBBUkFOQTpQcmVzLiBDLiBCcmFuY28KKzIwNDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpQcmltZWlybyBEZSBNYWlvCisyMDU6QlI6QlJBOkJSQVNJTDpQQVJBTkE6UHJ1ZGVudG9wb2xpcworMjA2OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlB0by4gUmljbworMjA3OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlF1YXRpZ3VhCisyMDg6QlI6QlJBOkJSQVNJTDpQQVJBTkE6UXVhdHJvIEJhcnJhcworMjA5OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlF1ZWRhcyBkbyBJZ3VhY3UKKzIxMDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpRdWVyZW5jaWEgZG8gTm9yCisyMTE6QlI6QlJBOkJSQVNJTDpQQVJBTkE6UXVpbnRhIGRvIFNvbAorMjEyOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlF1aXRhbmRpbmhhCisyMTM6QlI6QlJBOkJSQVNJTDpQQVJBTkE6UklPIFBBUkFOQVBBTkVNQQorMjE0OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlJhbmNobyBBbGVncmUKKzIxNTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpSZWFsZXphCisyMTY6QlI6QlJBOkJSQVNJTDpQQVJBTkE6UmVib3VjYXMKKzIxNzpCUjpCUkE6QlJBU0lMOlBBUkFOQTpSZW5hc2NlbmNhCisyMTg6QlI6QlJBOkJSQVNJTDpQQVJBTkE6UmVzZXJ2YQorMjE5OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlJpYmVpcmFvIENsYXJvCisyMjA6QlI6QlJBOkJSQVNJTDpQQVJBTkE6UmliZXJhbyBkbyBQaW5oYQorMjIxOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlJpbyBBenVsCisyMjI6QlI6QlJBOkJSQVNJTDpQQVJBTkE6UmlvIEJvbQorMjIzOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlJpbyBCcmFuY28gZG8gU3UKKzIyNDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpSaW8gTmVncm8KKzIyNTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpSb2xhbmRpYQorMjI2OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlJvbmNhZG9yCisyMjc6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Um9uZG9uCisyMjg6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Uy4gQW50b25pbyBkZSBTdQorMjI5OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlMuIElzYWJlbCBkJyBPZXMKKzIzMDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpTLiBJc2FiZWwgZG8gQXZhCisyMzE6QlI6QlJBOkJSQVNJTDpQQVJBTkE6Uy4gSm9yZ2UgZCBPZXN0ZQorMjMyOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlMuIEpvc2UgZG9zIFBpbmgKKzIzMzpCUjpCUkE6QlJBU0lMOlBBUkFOQTpTLiBTZWJhc3RpYW8gZGEKKzIzNDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpTLkNydXogZGUgTW9udGUKKzIzNTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpTYWJhdWRpYQorMjM2OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlNhbGdhZG8gRmlsaG8KKzIzNzpCUjpCUkE6QlJBU0lMOlBBUkFOQTpTYWx0byBkZSBJdGFyYXJlCisyMzg6QlI6QlJBOkJSQVNJTDpQQVJBTkE6U2FsdG8gZG8gTG9uZHJhCisyMzk6QlI6QlJBOkJSQVNJTDpQQVJBTkE6U2FuIFBlZHJvIGRvIEl2YQorMjQwOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlNhbmdlcworMjQxOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlNhbnRhIEFtZWxpYQorMjQyOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlNhbnRhIEZlCisyNDM6QlI6QlJBOkJSQVNJTDpQQVJBTkE6U2FudGEgSGVsZW5hCisyNDQ6QlI6QlJBOkJSQVNJTDpQQVJBTkE6U2FudGEgSW5lcworMjQ1OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlNhbnRhIE1hcmlhbmEKKzI0NjpCUjpCUkE6QlJBU0lMOlBBUkFOQTpTYW50YW5hIGRvIEl0YXJhCisyNDc6QlI6QlJBOkJSQVNJTDpQQVJBTkE6U2FudG8gSW5hY2lvCisyNDg6QlI6QlJBOkJSQVNJTDpQQVJBTkE6U2FvIENhcmxvcyBkbyBJdgorMjQ5OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlNhbyBKZXJvbmltbyBkYQorMjUwOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlNhbyBKb2FvCisyNTE6QlI6QlJBOkJSQVNJTDpQQVJBTkE6U2FvIEpvYW8gZG8gQ2FpdQorMjUyOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlNhbyBKb2FvIGRvIEl2YWkKKzI1MzpCUjpCUkE6QlJBU0lMOlBBUkFOQTpTYW8gSm9hbyBkbyBUcml1CisyNTQ6QlI6QlJBOkJSQVNJTDpQQVJBTkE6U2FvIEpvcmdlCisyNTU6QlI6QlJBOkJSQVNJTDpQQVJBTkE6U2FvIEpvc2UgQm9hIFZpcworMjU2OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlNhbyBNYXRldXMgZG8gU3UKKzI1NzpCUjpCUkE6QlJBU0lMOlBBUkFOQTpTYW8gTWlndWVsIGRvIElndWFjdQorMjU4OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlNhbyBQZWRybyBkbyBQYXIKKzI1OTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpTYW8gVG9tZQorMjYwOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlNhcG9wZW1hCisyNjE6QlI6QlJBOkJSQVNJTDpQQVJBTkE6U2VydGFuZWphCisyNjI6QlI6QlJBOkJSQVNJTDpQQVJBTkE6U2VydGFub3BvbGlzCisyNjM6QlI6QlJBOkJSQVNJTDpQQVJBTkE6U2lxdWVpcmEgQ2FtcG9zCisyNjQ6QlI6QlJBOkJSQVNJTDpQQVJBTkE6U3RhLkNlY2lsaWEgZG8gUAorMjY1OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlN0by5BbnRvbmlvIGRhIFAKKzI2NjpCUjpCUkE6QlJBU0lMOlBBUkFOQTpTdG8uQW50b25pbyBkbyBDCisyNjc6QlI6QlJBOkJSQVNJTDpQQVJBTkE6U3RvLkFudG9uaW8gZG8gUAorMjY4OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlRhbWJvYXJhCisyNjk6QlI6QlJBOkJSQVNJTDpQQVJBTkE6VGFwZWphcmEKKzI3MDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpUYXBpcmEKKzI3MTpCUjpCUkE6QlJBU0lMOlBBUkFOQTpUZWxlbWFjbyBCb3JiYQorMjcyOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlRlcnJhIEJvYQorMjczOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlRlcnJhIFJpY2EKKzI3NDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpUZXJyYSBSb3hhCisyNzU6QlI6QlJBOkJSQVNJTDpQQVJBTkE6VGV4ZWlyYSBTb2FyZXMKKzI3NjpCUjpCUkE6QlJBU0lMOlBBUkFOQTpUaWJhamkKKzI3NzpCUjpCUkE6QlJBU0lMOlBBUkFOQTpUaWp1Y2FzIGRvIFN1bAorMjc4OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlRvbGVkbworMjc5OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlRvbWF6aW5hCisyODA6QlI6QlJBOkJSQVNJTDpQQVJBTkE6VHVuZWlyYXMgZCBPZXN0ZQorMjgxOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlViaXJhdGEKKzI4MjpCUjpCUkE6QlJBU0lMOlBBUkFOQTpVbXVhcmFtYQorMjgzOkJSOkJSQTpCUkFTSUw6UEFSQU5BOlVuaWFvIGRhIFZpdG9yaWEKKzI4NDpCUjpCUkE6QlJBU0lMOlBBUkFOQTpVbmlmbG9yCisyODU6QlI6QlJBOkJSQVNJTDpQQVJBTkE6VXJhaQorMjg2OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlZlbmNlc2xhdSBCcmFzCisyODc6QlI6QlJBOkJSQVNJTDpQQVJBTkE6VmVyZQorMjg4OkJSOkJSQTpCUkFTSUw6UEFSQU5BOlZpdG9yaW5vCisyODk6QlI6QlJBOkJSQVNJTDpQQVJBTkE6WGFtYnJlCisxOkJSOkJSQTpCUkFTSUw6QUNSRTpBU1NJUyBCUkFTSUwKKzI6QlI6QlJBOkJSQVNJTDpBQ1JFOkJSQVNJTEVJQQorMzpCUjpCUkE6QlJBU0lMOkFDUkU6Q1JVWkVJUk8gRE8gU1VMCis0OkJSOkJSQTpCUkFTSUw6QUNSRTpGRUlKTworNTpCUjpCUkE6QlJBU0lMOkFDUkU6TUFOQ0lPIExJTUEKKzY6QlI6QlJBOkJSQVNJTDpBQ1JFOk1BTlVFTCBVUkJBTk8KKzc6QlI6QlJBOkJSQVNJTDpBQ1JFOlBMQUNJRE8gREUgQy4KKzg6QlI6QlJBOkJSQVNJTDpBQ1JFOlJJTyBCUkFOQ08KKzk6QlI6QlJBOkJSQVNJTDpBQ1JFOlNFTkEgTUFEVVJFSVJBCisxMDpCUjpCUkE6QlJBU0lMOkFDUkU6U0VOQURPUiBHVUlPTUFSRAorMTE6QlI6QlJBOkJSQVNJTDpBQ1JFOlRBUkFVQUNBCisxMjpCUjpCUkE6QlJBU0lMOkFDUkU6WEFQVVJJCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JSTi9CUk5fQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JSTi9CUk5fQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYxNGQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQlJOL0JSTl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDQgQEAKKzE6Qk4tQkU6Qk46QkVMQUlUCisyOkJOLUJNOkJOOkJSVU5FSSBNVUFSQQorMzpCTi1UVTpCTjpNVUFSQS9TRVJJQS9UVVRPTkcKKzQ6Qk4tVEU6Qk46VEVNQlVST05HCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JSTi9CUk5fQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JSTi9CUk5fQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiYTBhYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQlJOL0JSTl9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDIgQEAKKzE6Qk46QlJOOkJSVU5FSTpNdWFyYS9TZXJpYS9UdXRvbmc6QlJOLkwyLjEKKzE6Qk46QlJOOkJSVU5FSTpUZW1idXJvbmc6QlJOLkwyLjIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQlROL0JUTl9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQlROL0JUTl9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmEyYjJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CVE4vQlROX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMjIgQEAKKzE6QlQtMzM6QlQ6QlVNVEhBTkcKKzI6QlQtQ05HOkJUOkNISVJBTkcKKzM6QlQtMjpCVDpDSFVLSEEKKzQ6QlQtREE6QlQ6REFHQQorNTpCVC0yMjpCVDpEQUdBTkEKKzY6QlQtR0E6QlQ6R0FTQQorNzpCVC0zNjpCVDpHQVlMRUdQSFVHIChTQVJCSEFORykKKzg6QlQtMzpCVDpIQUEKKzk6QlQtNDQ6QlQ6TEhVTlRTSEkKKzEwOkJULTQyOkJUOk1PTkdBUgorMTE6QlQtMzQ6QlQ6UEFSTworMTI6QlQtNDM6QlQ6UEVNQSBHQVRTSEVMCisxMzpCVC0yMzpCVDpQVU5BS0hBCisxNDpCVC00OkJUOlNBTUNISQorMTU6QlQtNDU6QlQ6U0FNRFJVUCBKT05HS0hBUgorMTY6QlQtMzc6QlQ6U0hFTkdBTkcKKzE3OkJULTM4OkJUOlRBU0hJR0FORworMTg6QlQtNTpCVDpUSElNUEhVCisxOTpCVC0zMjpCVDpUT05HU0EKKzIwOkJULVRZOkJUOlRSQVNISSBZQU5HVFNFCisyMTpCVC0zNTpCVDpUUkFTSElHQU5HCisyMjpCVC0yNDpCVDpXQU5HRElQSE9EUkFORwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CVE4vQlROX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9CVE4vQlROX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MTViNjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0JUTi9CVE5fQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSwxOSBAQAorMTpCVDpCVE46QkhVVEFOOkJ1bXRoYW5nOkJUTi5MMi4xMAorMTpCVDpCVE46QkhVVEFOOkxodW50c2hpOkJUTi5MMi4xMworMTpCVDpCVE46QkhVVEFOOlNhbWRydXAgSm9uZ2toYXI6QlROLkwyLjkKKzE6QlQ6QlROOkJIVVRBTjpDaGlyYW5nOkJUTi5MMi4xMgorMTpCVDpCVE46QkhVVEFOOk1vbmdhcjpCVE4uTDIuNworMTpCVDpCVE46QkhVVEFOOlNoZW5nYW5nOkJUTi5MMi4yCisxOkJUOkJUTjpCSFVUQU46Q2h1a2hhOkJUTi5MMi4xNworMTpCVDpCVE46QkhVVEFOOlRoaW1waHU6QlROLkwyLjQKKzE6QlQ6QlROOkJIVVRBTjpUb25nc2E6QlROLkwyLjExCisxOkJUOkJUTjpCSFVUQU46SGFhOkJUTi5MMi41CisxOkJUOkJUTjpCSFVUQU46VGFzaGlnYW5nOkJUTi5MMi44CisxOkJUOkJUTjpCSFVUQU46UHVuYWtoYTpCVE4uTDIuMTkKKzE6QlQ6QlROOkJIVVRBTjpHYXlsZWdwaHVnIChTYXJiaGFuZyk6QlROLkwyLjE4CisxOkJUOkJUTjpCSFVUQU46UGVtYSBHYXRzaGVsOkJUTi5MMi4xNgorMTpCVDpCVE46QkhVVEFOOlBhcm86QlROLkwyLjEKKzE6QlQ6QlROOkJIVVRBTjpXYW5nZGlwaG9kcmFuZzpCVE4uTDIuMTUKKzE6QlQ6QlROOkJIVVRBTjpEYWdhOkJUTi5MMi42CisxOkJUOkJUTjpCSFVUQU46R2FzYTpCVE4uTDIuMworMTpCVDpCVE46QkhVVEFOOlNhbWNoaTpCVE4uTDIuMTQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ0FGL0NBRl9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ0FGL0NBRl9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTA5YjhhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DQUYvQ0FGX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMTggQEAKKzE6Q0YtQkI6Q0Y6QkFNSU5HVUkgQkFOR09SQU4gW0JBTUlOR1VJIEJBTkdPUkFdCisyOkNGLUJHRjpDRjpCQU5HVUkKKzM6Q0YtQks6Q0Y6QkFTU0UgS09UVE8KKzQ6Q0YtSE06Q0Y6SEFVVCBNQk9NT1UKKzU6Q0YtSEs6Q0Y6SEFVVEUgS09UVE8KKzY6Q0YtS0c6Q0Y6S0VNTworNzpDRi1MQjpDRjpMT0JBWUUKKzg6Q0YtSFM6Q0Y6TUFNQkVSRSBLQURFSQorOTpDRi1NQjpDRjpNQk9NT1UKKzEwOkNGLUtCOkNGOk5BTkEgR1JFQklaSSBbTkFOQSBHUklCSU5HVUldCisxMTpDRi1OTTpDRjpOQU5BIE1BTUJFUkUKKzEyOkNGLU1QOkNGOk9NQkVMTEEgTVBPS08KKzEzOkNGLVVLOkNGOk9VQUtBCisxNDpDRi1BQzpDRjpPVUhBTQorMTU6Q0YtT1A6Q0Y6T1VIQU0gUEVOREUKKzE2OkNGLVNFOkNGOlNBTkdIQTEKKzE3OkNGLVNFOkNGOlNBTkdIQTEKKzE4OkNGLVZLOkNGOlZBS0FHQQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DQUYvQ0FGX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DQUYvQ0FGX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTVjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NBRi9DQUZfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSw1MSBAQAorMTpDRjpDQUY6Q0VOVFJBTCBBRlJJQ0FOIFJFUFVCTElDOk9tYmVsbGEtTXBva286QmltYm8KKzI6Q0Y6Q0FGOkNFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQzpPbWJlbGxhLU1wb2tvOkJvYWxpCiszOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6T21iZWxsYS1NcG9rbzpEYW1hcmEKKzQ6Q0Y6Q0FGOkNFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQzpPbWJlbGxhLU1wb2tvOllhbG9rZS1Cb3NzZW1iZWxlCisxOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6S2VtbzpEZWtvYQorMjpDRjpDQUY6Q0VOVFJBTCBBRlJJQ0FOIFJFUFVCTElDOktlbW86U2lidXQKKzE6Q0Y6Q0FGOkNFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQzpPdWFrYTpCYWthbGEKKzI6Q0Y6Q0FGOkNFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQzpPdWFrYTpCYW1iYXJpCiszOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6T3Vha2E6R3JpbWFyaQorNDpDRjpDQUY6Q0VOVFJBTCBBRlJJQ0FOIFJFUFVCTElDOk91YWthOklwcHkKKzU6Q0Y6Q0FGOkNFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQzpPdWFrYTpLb3VhbmdvCisxOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6T3VoYW06QmF0YW5nYWZvCisyOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6T3VoYW06Qm9zc2FuZ29hCiszOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6T3VoYW06Qm91Y2EKKzQ6Q0Y6Q0FGOkNFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQzpPdWhhbTpLYWJvCis1OkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6T3VoYW06TWFya291bmRhCisxOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6SGF1dC1NYm9tb3U6RGplbWFoCisyOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6SGF1dC1NYm9tb3U6T2JvCiszOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6SGF1dC1NYm9tb3U6WmVtaW8KKzE6Q0Y6Q0FGOkNFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQzpNYm9tb3U6QmFrb3VtYQorMjpDRjpDQUY6Q0VOVFJBTCBBRlJJQ0FOIFJFUFVCTElDOk1ib21vdTpCYW5nYXNzb3UKKzM6Q0Y6Q0FGOkNFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQzpNYm9tb3U6R2FtYm8tT3VhbmdvCis0OkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6TWJvbW91OlJhZmFpCisxOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6TmFuYS1HcmliaW5ndWk6S2FnYS1CYW5kb3JvCisyOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6TmFuYS1HcmliaW5ndWk6TWJyZXMKKzE6Q0Y6Q0FGOkNFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQzpCYW5ndWk6QmFuZ3VpCisxOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6SGF1dGUtS290dG86QnJpYQorMjpDRjpDQUY6Q0VOVFJBTCBBRlJJQ0FOIFJFUFVCTElDOkhhdXRlLUtvdHRvOk91YWRkYQorMzpDRjpDQUY6Q0VOVFJBTCBBRlJJQ0FOIFJFUFVCTElDOkhhdXRlLUtvdHRvOllhbGluZ2EKKzE6Q0Y6Q0FGOkNFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQzpPdWhhbS1QZW5kZTpCb2NhcmFuZ2EKKzI6Q0Y6Q0FGOkNFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQzpPdWhhbS1QZW5kZTpCb3pvdW0KKzM6Q0Y6Q0FGOkNFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQzpPdWhhbS1QZW5kZTpQYW91YQorMTpDRjpDQUY6Q0VOVFJBTCBBRlJJQ0FOIFJFUFVCTElDOlNhbmdoYTpCYW1iaW8KKzI6Q0Y6Q0FGOkNFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQzpTYW5naGE6Tm9sYQorMTpDRjpDQUY6Q0VOVFJBTCBBRlJJQ0FOIFJFUFVCTElDOkJhbWluZ3VpLUJhbmdvcmE6QmFtaW5ndWkKKzI6Q0Y6Q0FGOkNFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQzpCYW1pbmd1aS1CYW5nb3JhOk5kZWxlCisxOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6TG9iYXllOkJvZGEKKzI6Q0Y6Q0FGOkNFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQzpMb2JheWU6TWJha2kKKzM6Q0Y6Q0FGOkNFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQzpMb2JheWU6TW9uZ291bWJhCisxOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6VmFrYWdhOkJpcmFvCisyOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6VmFrYWdhOk91YW5kamEtRGphbGxlCisxOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6QmFzc2UtS290dG86QWxpbmRhbworMjpDRjpDQUY6Q0VOVFJBTCBBRlJJQ0FOIFJFUFVCTElDOkJhc3NlLUtvdHRvOktlbWJlCiszOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6QmFzc2UtS290dG86TWluZ2FsYQorNDpDRjpDQUY6Q0VOVFJBTCBBRlJJQ0FOIFJFUFVCTElDOkJhc3NlLUtvdHRvOk1vYmF5ZQorMTpDRjpDQUY6Q0VOVFJBTCBBRlJJQ0FOIFJFUFVCTElDOk1hbWJlcmUtS2FkZWk6QmVyYmVyYXRpCisyOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6TWFtYmVyZS1LYWRlaTpDYXJub3QKKzM6Q0Y6Q0FGOkNFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQzpNYW1iZXJlLUthZGVpOkdhbWJvdWxhCisxOkNGOkNBRjpDRU5UUkFMIEFGUklDQU4gUkVQVUJMSUM6TmFuYS1NYW1iZXJlOkJhYm91YQorMjpDRjpDQUY6Q0VOVFJBTCBBRlJJQ0FOIFJFUFVCTElDOk5hbmEtTWFtYmVyZTpCYW9ybworMzpDRjpDQUY6Q0VOVFJBTCBBRlJJQ0FOIFJFUFVCTElDOk5hbmEtTWFtYmVyZTpCb3VhcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DQU4vQ0FOX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DQU4vQ0FOX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNDNjMDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NBTi9DQU5fQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxMyBAQAorMTpDQS1BQjpDQTpBTEJFUlRBCisyOkNBLUJDOkNBOkJSSVRJU0ggQ09MVU1CSUEKKzM6Q0EtTUI6Q0E6TUFOSVRPQkEKKzQ6Q0EtTkI6Q0E6TkVXIEJSVU5TV0lDSworNTpDQS1OTDpDQTpORVdGT1VORExBTkQgQU5EIExBQlJBRE9SCis2OkNBLU5UOkNBOk5PUlRIV0VTVCBURVJSSVRPUklFUworNzpDQS1OUzpDQTpOT1ZBIFNDT1RJQQorODpDQS1OVTpDQTpOVU5BVlVUCis5OkNBLU9OOkNBOk9OVEFSSU8KKzEwOkNBLVBFOkNBOlBSSU5DRSBFRFdBUkQgSVNMQU5ECisxMTpDQS1RQzpDQTpRVUVCRUMKKzEyOkNBLVNLOkNBOlNBU0tBVENIRVdBTgorMTM6Q0EtWVQ6Q0E6WVVLT04gVEVSUklUT1JZCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NIRS9DSEVfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NIRS9DSEVfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1MTBlMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ0hFL0NIRV9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDI3IEBACisxOkNILUFHOkNIOkFBUkdBVQorMjpDSC1BUjpDSDpBUFBFTlpFTEwgQVVTU0VSUkhPREVOCiszOkNILUFJOkNIOkFQUEVOWkVMTCBJTk5FUlJIT0RFTgorNDpDSC1CTDpDSDpCQVNFTCBMQU5EU0NIQUZUCis1OkNILUJTOkNIOkJBU0VMIFNUQURUCis2OkNILUJFOkNIOkJFUk4vQkVSTkUKKzc6Q0gtRlI6Q0g6RlJJQk9VUkcvRlJFSUJVUkcKKzg6Q0gtR0U6Q0g6R0VORVZFCis5OkNILUdOOkNIOkdFTopWRQorMTA6Q0gtR0w6Q0g6R0xBUlVTCisxMTpDSC1HUjpDSDpHUkFVQj9OREVOL0dSSUdJT05JL0dSSVNDSFVOCisxMjpDSC1KVTpDSDpKVVJBCisxMzpDSC1MVTpDSDpMVVpFUk4KKzE0OkNILU5XOkNIOk1JRFdBTERFTgorMTU6Q0gtTkU6Q0g6TkVVQ0hBVEVMCisxNjpDSC1PVzpDSDpPQldBTERFTgorMTc6Q0gtU0c6Q0g6U0FOS1QgR0FMTEVOCisxODpDSC1TSDpDSDpTQ0hBRkZIQVVTRU4KKzE5OkNILVNaOkNIOlNDSFdZWgorMjA6Q0gtU086Q0g6U09MT1RIVVJOCisyMTpDSC1URzpDSDpUSFVSR0FVCisyMjpDSC1USTpDSDpUSUNJTk8KKzIzOkNILVVSOkNIOlVSSQorMjQ6Q0gtVlM6Q0g6VkFMQUlTL1dBTExJUworMjU6Q0gtVkQ6Q0g6VkFVRAorMjY6Q0gtWkc6Q0g6WlVHCisyNzpDSC1aSDpDSDpaVVJJQ0gKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ0hFL0NIRV9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ0hFL0NIRV9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DSEUvQ0hFX0FETUlOMl9MRVgudHh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NITC9DSExfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NITC9DSExfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdjYzkwNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ0hML0NITF9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDU5IEBACisxOkNMLUFJOkNMOkFJU0VOCisyOkNMLUFOVDpDTDpBTlRBUlRJQ0EgQ0hJTEVOQQorMzpDTC1BTjpDTDpBTlRPRkFHQVNUQQorNDpDTC1BUjpDTDpBUkFVQ0FOQQorNTpDTC1BUkM6Q0w6QVJBVUNPCis2OkNMLUFSSTpDTDpBUklDQQorNzpDTC1BVDpDTDpBVEFDQU1BCis4OkNMLUJJOkNMOkJJT0JJTworOTpDTC1DSFA6Q0w6Q0FDSEFQT0FMCisxMDpDTC1DUFQ6Q0w6Q0FQSVRBTiBQUkFUCisxMTpDTC1DQVI6Q0w6Q0FSREVOQUwgQ0FSTworMTI6Q0wtQ0FVOkNMOkNBVVFVRU5FUworMTM6Q0wtQ1ROOkNMOkNBVVRJTgorMTQ6Q0wtQ0JVOkNMOkNIQUNBQlVDTworMTU6Q0wtQ0hOOkNMOkNIQU5BUkFMCisxNjpDTC1DTEU6Q0w6Q0hJTE9FCisxNzpDTC1DUEE6Q0w6Q0hPQVBBCisxODpDTC1DSFE6Q0w6Q09JSEFJUVVFCisxOTpDTC1DSEc6Q0w6Q09MQ0hBR1VBCisyMDpDTC1DT046Q0w6Q09OQ0VQQ0lPTgorMjE6Q0wtQ09QOkNMOkNPUElBUE8KKzIyOkNMLUNPOkNMOkNPUVVJTUJPCisyMzpDTC1DT1I6Q0w6Q09SRElMTEVSQQorMjQ6Q0wtQ1VSOkNMOkNVUklDTworMjU6Q0wtRUw6Q0w6RUwgTE9BCisyNjpDTC1FTFE6Q0w6RUxRVUkKKzI3OkNMLUdDUjpDTDpHRU5FUkFMIENBUlJFUkEKKzI4OkNMLUhVQTpDTDpIVUFTQ08KKzI5OkNMLUlRSTpDTDpJUVVJUVVFCiszMDpDTC1MSTpDTDpMSUJFUlRBRE9SIEdFTkVSQUwgQkVSTkFSRE8gT0hJR0dJTlMKKzMxOkNMLUxJTTpDTDpMSU1BUkkKKzMyOkNMLUxJTjpDTDpMSU5BUkVTCiszMzpDTC1MTEE6Q0w6TExBTlFVSUhVRQorMzQ6Q0wtQU5EOkNMOkxPUyBBTkRFUworMzU6Q0wtTEw6Q0w6TE9TIExBR09TCiszNjpDTC1NQTpDTDpNQUdBTExBTkVTCiszNzpDTC1NSVA6Q0w6TUFJUE8KKzM4OkNMLU1MTDpDTDpNQUxMRUNPCiszOTpDTC1NTDpDTDpNQVVMRQorNDA6Q0wtTUlMOkNMOk1FTElQSUxMQQorNDE6Q0wtTlVCOkNMOk5VQkxFCis0MjpDTC1PU1I6Q0w6T1NPUk5PCis0MzpDTC1QQUw6Q0w6UEFMRU5BCis0NDpDTC1QQU46Q0w6UEFSSU5BQ09UQQorNDU6Q0wtUEVUOkNMOlBFVE9SQ0EKKzQ2OkNMLVFVSTpDTDpRVUlMTE9UQQorNDc6Q0wtUk06Q0w6UkVHSU4gTUVUUk9QT0xJVEFOQSBERSBTQU5USUFHTworNDg6Q0wtU0FUOkNMOlNBTiBBTlRPTklPCis0OTpDTC1BQ086Q0w6U0FOIEZFTElQRSBERSBBQ09OQ0FHVUEKKzUwOkNMLVNHTzpDTDpTQU5USUFHTworNTE6Q0wtVEFMOkNMOlRBTEFHQU5URQorNTI6Q0wtVENBOkNMOlRBTENBCis1MzpDTC1UQTpDTDpUQVJBUEFDCis1NDpDTC1URjpDTDpUSUVSUkEgREVMIEZVRUdPCis1NTpDTC1UT0M6Q0w6VE9DT1BJTExBCis1NjpDTC1FU1A6Q0w6VUxUSU1BIEVTUEVSQU5aQQorNTc6Q0wtVkRJOkNMOlZBTERJVklBCis1ODpDTC1WQUw6Q0w6VkFMUEFSQUlTTworNTk6Q0wtVlM6Q0w6VkFMUEFSQVNPCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NITC9DSExfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NITC9DSExfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2ODI1MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ0hML0NITF9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDMyNCBAQAorMTpDTDpDSEw6Q0hJTEU6VkFMRElWSUE6Q29ycmFsCisyOkNMOkNITDpDSElMRTpWQUxESVZJQTpGdXRyb25vCiszOkNMOkNITDpDSElMRTpWQUxESVZJQTpMYWdvIFJhbmNvCis0OkNMOkNITDpDSElMRTpWQUxESVZJQTpMYW5jbworNTpDTDpDSEw6Q0hJTEU6VkFMRElWSUE6TG9zIExhZ29zCis2OkNMOkNITDpDSElMRTpWQUxESVZJQTpNYWZpbAorNzpDTDpDSEw6Q0hJTEU6VkFMRElWSUE6TWFyaXF1aW5hCis4OkNMOkNITDpDSElMRTpWQUxESVZJQTpQYWlsbGFjbworOTpDTDpDSEw6Q0hJTEU6VkFMRElWSUE6UGFuZ3VpcHVsbGkKKzEwOkNMOkNITDpDSElMRTpWQUxESVZJQTpSaW8gQnVlbm8KKzExOkNMOkNITDpDSElMRTpWQUxESVZJQTpWYWxkaXZpYQorMTI6Q0w6Q0hMOkNISUxFOlZBTERJVklBOlZhbGRpdmlhIChJcy4pCisxOkNMOkNITDpDSElMRTpOVUJMRTpCdWxuZXMKKzI6Q0w6Q0hMOkNISUxFOk5VQkxFOkNoaWxsYW4KKzM6Q0w6Q0hMOkNISUxFOk5VQkxFOkNvYnF1ZWN1cmEKKzQ6Q0w6Q0hMOkNISUxFOk5VQkxFOkNvZWxlbXUKKzU6Q0w6Q0hMOkNISUxFOk5VQkxFOkNvaWh1ZWNvCis2OkNMOkNITDpDSElMRTpOVUJMRTpFbCBDYXJtZW4KKzc6Q0w6Q0hMOkNISUxFOk5VQkxFOk5pbmh1ZQorODpDTDpDSEw6Q0hJTEU6TlVCTEU6TmlxdWVuCis5OkNMOkNITDpDSElMRTpOVUJMRTpQZW11Y28KKzEwOkNMOkNITDpDSElMRTpOVUJMRTpQaW50bworMTE6Q0w6Q0hMOkNISUxFOk5VQkxFOlBvcnRlenVlbG8KKzEyOkNMOkNITDpDSElMRTpOVUJMRTpRdWlsbG9uCisxMzpDTDpDSEw6Q0hJTEU6TlVCTEU6UXVpcmlodWUKKzE0OkNMOkNITDpDSElMRTpOVUJMRTpSYW5xdWlsCisxNTpDTDpDSEw6Q0hJTEU6TlVCTEU6U2FuIENhcmxvcworMTY6Q0w6Q0hMOkNISUxFOk5VQkxFOlNhbiBGYWJpYW4KKzE3OkNMOkNITDpDSElMRTpOVUJMRTpTYW4gSWduYWNpbworMTg6Q0w6Q0hMOkNISUxFOk5VQkxFOlNhbiBOaWNvbGFzCisxOTpDTDpDSEw6Q0hJTEU6TlVCTEU6VHJlaHVhY28KKzIwOkNMOkNITDpDSElMRTpOVUJMRTpZdW5nYXkKKzE6Q0w6Q0hMOkNISUxFOkVMIExPQTpDYWxhbWEKKzI6Q0w6Q0hMOkNISUxFOkVMIExPQTpPbGxhZ3VlCiszOkNMOkNITDpDSElMRTpFTCBMT0E6U2FuIFBlZHJvIGRlIEF0YWNhbWEKKzE6Q0w6Q0hMOkNISUxFOkFSQVVDTzpBcmF1Y28KKzI6Q0w6Q0hMOkNISUxFOkFSQVVDTzpBcmF1Y28gKElzLikKKzM6Q0w6Q0hMOkNISUxFOkFSQVVDTzpDYW5ldGUKKzQ6Q0w6Q0hMOkNISUxFOkFSQVVDTzpDb250dWxtbworNTpDTDpDSEw6Q0hJTEU6QVJBVUNPOkN1cmFuaWxhaHVlCis2OkNMOkNITDpDSElMRTpBUkFVQ086TGVidQorNzpDTDpDSEw6Q0hJTEU6QVJBVUNPOkxvcyBBbGFtb3MKKzg6Q0w6Q0hMOkNISUxFOkFSQVVDTzpUaXJ1YQorOTpDTDpDSEw6Q0hJTEU6QVJBVUNPOlRpcnVhIChJcy4pCisxOkNMOkNITDpDSElMRTpTQU5USUFHTzpTYW50aWFnbworMTpDTDpDSEw6Q0hJTEU6QU5UQVJUSUNBIENISUxFTkE6TmF2YXJpbm8gKElzLikKKzE6Q0w6Q0hMOkNISUxFOkVMUVVJOkFuZGFjb2xsbworMjpDTDpDSEw6Q0hJTEU6RUxRVUk6Q29xdWltYm8KKzM6Q0w6Q0hMOkNISUxFOkVMUVVJOkxhIEhpZ3VlcmEKKzQ6Q0w6Q0hMOkNISUxFOkVMUVVJOkxhIEhpZ3VlcmEgKElzLikKKzU6Q0w6Q0hMOkNISUxFOkVMUVVJOkxhIFNlcmVuYQorNjpDTDpDSEw6Q0hJTEU6RUxRVUk6UGFpZ3Vhbm8KKzc6Q0w6Q0hMOkNISUxFOkVMUVVJOlZpY3VuYQorMTpDTDpDSEw6Q0hJTEU6R0VORVJBTCBDQVJSRVJBOkNoaWxlIENoaWNvCisyOkNMOkNITDpDSElMRTpHRU5FUkFMIENBUlJFUkE6UmlvIEliYW5legorMTpDTDpDSEw6Q0hJTEU6TUFJUE86QnVpbgorMjpDTDpDSEw6Q0hJTEU6TUFJUE86Q2FsZXJhIERlIFRhbmdvCiszOkNMOkNITDpDSElMRTpNQUlQTzpQYWluZQorNDpDTDpDSEw6Q0hJTEU6TUFJUE86U2FuIEJlcm5hcmRvCisxOkNMOkNITDpDSElMRTpMTEFOUVVJSFVFOkNhbGJ1Y28gKElzLikKKzI6Q0w6Q0hMOkNISUxFOkxMQU5RVUlIVUU6Q29jaGFtbworMzpDTDpDSEw6Q0hJTEU6TExBTlFVSUhVRTpDb2NoYW1vIChJcy4pCis0OkNMOkNITDpDSElMRTpMTEFOUVVJSFVFOkZyZXNpYQorNTpDTDpDSEw6Q0hJTEU6TExBTlFVSUhVRTpGcnV0aWxsYXIKKzY6Q0w6Q0hMOkNISUxFOkxMQU5RVUlIVUU6SXNsYQorNzpDTDpDSEw6Q0hJTEU6TExBTlFVSUhVRTpMTGFucXVpaHVlCis4OkNMOkNITDpDSElMRTpMTEFOUVVJSFVFOkxvcyBNdWVybW9zCis5OkNMOkNITDpDSElMRTpMTEFOUVVJSFVFOk1hdWxsaW4KKzEwOkNMOkNITDpDSElMRTpMTEFOUVVJSFVFOlB1ZXJ0byBNb250dAorMTE6Q0w6Q0hMOkNISUxFOkxMQU5RVUlIVUU6UHVlcnRvIFZhcmFzCisxOkNMOkNITDpDSElMRTpNRUxJUElMTEE6QWxodWUKKzI6Q0w6Q0hMOkNISUxFOk1FTElQSUxMQTpDdXJhY2F2aQorMzpDTDpDSEw6Q0hJTEU6TUVMSVBJTExBOk1hcmlhIFBpbnRvCis0OkNMOkNITDpDSElMRTpNRUxJUElMTEE6TWVsaXBpbGxhCis1OkNMOkNITDpDSElMRTpNRUxJUElMTEE6U2FuIFBlZHJvCisxOkNMOkNITDpDSElMRTpUSUVSUkEgREVMIEZVRUdPOlByaW1hdmVyYQorMjpDTDpDSEw6Q0hJTEU6VElFUlJBIERFTCBGVUVHTzpQcmltYXZlcmEgKElzLikKKzM6Q0w6Q0hMOkNISUxFOlRJRVJSQSBERUwgRlVFR086VGltYXVrZWwKKzQ6Q0w6Q0hMOkNISUxFOlRJRVJSQSBERUwgRlVFR086VGltYXVrZWwgKElzLikKKzE6Q0w6Q0hMOkNISUxFOkNBQ0hBUE9BTDpDb2RlZ3VhCisyOkNMOkNITDpDSElMRTpDQUNIQVBPQUw6Q29pbmNvCiszOkNMOkNITDpDSElMRTpDQUNIQVBPQUw6Q29sdGF1Y28KKzQ6Q0w6Q0hMOkNISUxFOkNBQ0hBUE9BTDpEb25paHVlCis1OkNMOkNITDpDSElMRTpDQUNIQVBPQUw6R3JhbmVyb3MKKzY6Q0w6Q0hMOkNISUxFOkNBQ0hBUE9BTDpMYXMgQ2FicmFzCis3OkNMOkNITDpDSElMRTpDQUNIQVBPQUw6TWFjaGFsaQorODpDTDpDSEw6Q0hJTEU6Q0FDSEFQT0FMOk1hbGxvYQorOTpDTDpDSEw6Q0hJTEU6Q0FDSEFQT0FMOk1vc3RhemFsCisxMDpDTDpDSEw6Q0hJTEU6Q0FDSEFQT0FMOk9saXZhcgorMTE6Q0w6Q0hMOkNISUxFOkNBQ0hBUE9BTDpQZXVtbworMTI6Q0w6Q0hMOkNISUxFOkNBQ0hBUE9BTDpQaWNoaWRlZ3VhCisxMzpDTDpDSEw6Q0hJTEU6Q0FDSEFQT0FMOlF1aW50YSBEZSBUaWxjb2NvCisxNDpDTDpDSEw6Q0hJTEU6Q0FDSEFQT0FMOlJhbmNhZ3VhCisxNTpDTDpDSEw6Q0hJTEU6Q0FDSEFQT0FMOlJlbmdvCisxNjpDTDpDSEw6Q0hJTEU6Q0FDSEFQT0FMOlJlcXVpbmFvCisxNzpDTDpDSEw6Q0hJTEU6Q0FDSEFQT0FMOlNhbiBWaWNlbnRlCisxOkNMOkNITDpDSElMRTpBTlRPRkFHQVNUQTpBbnRvZmFnYXN0YQorMjpDTDpDSEw6Q0hJTEU6QU5UT0ZBR0FTVEE6QW50b2ZhZ2FzdGEgKElzLikKKzM6Q0w6Q0hMOkNISUxFOkFOVE9GQUdBU1RBOk1lamlsbG9uZXMKKzQ6Q0w6Q0hMOkNISUxFOkFOVE9GQUdBU1RBOlNpZXJyYSBHb3JkYQorNTpDTDpDSEw6Q0hJTEU6QU5UT0ZBR0FTVEE6VGFsdGFsCisxOkNMOkNITDpDSElMRTpDT05DRVBDSU9OOkNvbmNlcGNpb24KKzI6Q0w6Q0hMOkNISUxFOkNPTkNFUENJT046Q29yb25lbAorMzpDTDpDSEw6Q0hJTEU6Q09OQ0VQQ0lPTjpGbG9yaWRhCis0OkNMOkNITDpDSElMRTpDT05DRVBDSU9OOkh1YWxxdWkKKzU6Q0w6Q0hMOkNISUxFOkNPTkNFUENJT046TG90YQorNjpDTDpDSEw6Q0hJTEU6Q09OQ0VQQ0lPTjpQZW5jbworNzpDTDpDSEw6Q0hJTEU6Q09OQ0VQQ0lPTjpTYW50YSBKdWFuYQorODpDTDpDSEw6Q0hJTEU6Q09OQ0VQQ0lPTjpUYWxjYWh1YW5vCis5OkNMOkNITDpDSElMRTpDT05DRVBDSU9OOlRhbGNhaHVhbm8gKElzLikKKzEwOkNMOkNITDpDSElMRTpDT05DRVBDSU9OOlRvbWUKKzE6Q0w6Q0hMOkNISUxFOkNISUxPRTpBbmN1ZAorMjpDTDpDSEw6Q0hJTEU6Q0hJTE9FOkNhc3RybworMzpDTDpDSEw6Q0hJTEU6Q0hJTE9FOkNhc3RybyAoSXMuKQorNDpDTDpDSEw6Q0hJTEU6Q0hJTE9FOkNob25jaGkKKzU6Q0w6Q0hMOkNISUxFOkNISUxPRTpDdXJhY28gRGUgVmVsZXoKKzY6Q0w6Q0hMOkNISUxFOkNISUxPRTpEYWxjYWh1ZQorNzpDTDpDSEw6Q0hJTEU6Q0hJTE9FOlB1cXVlbGRvbgorODpDTDpDSEw6Q0hJTEU6Q0hJTE9FOlF1ZWlsZW4KKzk6Q0w6Q0hMOkNISUxFOkNISUxPRTpRdWVpbGVuIChJcy4pCisxMDpDTDpDSEw6Q0hJTEU6Q0hJTE9FOlF1ZWxsb24KKzExOkNMOkNITDpDSElMRTpDSElMT0U6UXVlbGxvbiAoSXMuKQorMTI6Q0w6Q0hMOkNISUxFOkNISUxPRTpRdWVtY2hpCisxMzpDTDpDSEw6Q0hJTEU6Q0hJTE9FOlF1ZW1jaGkgKElzLikKKzE0OkNMOkNITDpDSElMRTpDSElMT0U6UXVpbmNoYW8gKElzLikKKzE6Q0w6Q0hMOkNISUxFOlBBTEVOQTpDaGFpdGVuCisyOkNMOkNITDpDSElMRTpQQUxFTkE6Q2hhaXRlbiAoSXMuKQorMzpDTDpDSEw6Q0hJTEU6UEFMRU5BOkZ1dGFsZXVmdQorNDpDTDpDSEw6Q0hJTEU6UEFMRU5BOkh1YWxhaWh1ZQorNTpDTDpDSEw6Q0hJTEU6UEFMRU5BOkh1YWxhaWh1ZSAoSXMuKQorNjpDTDpDSEw6Q0hJTEU6UEFMRU5BOlBhbGVuYQorMTpDTDpDSEw6Q0hJTEU6SFVBU0NPOkFsdG8gZGVsIENhcm1lbgorMjpDTDpDSEw6Q0hJTEU6SFVBU0NPOkZyZWlyaW5hCiszOkNMOkNITDpDSElMRTpIVUFTQ086RnJlaXJpbmEgKElzLikKKzQ6Q0w6Q0hMOkNISUxFOkhVQVNDTzpIdWFzY28KKzU6Q0w6Q0hMOkNISUxFOkhVQVNDTzpIdWFzY28gKElzLikKKzY6Q0w6Q0hMOkNISUxFOkhVQVNDTzpWYWxsZW5hcgorMTpDTDpDSEw6Q0hJTEU6Q0hPQVBBOklsbGFwZWwKKzI6Q0w6Q0hMOkNISUxFOkNIT0FQQTpMb3MgVmlsb3MKKzM6Q0w6Q0hMOkNISUxFOkNIT0FQQTpMb3MgVmlsb3MgKElzLikKKzQ6Q0w6Q0hMOkNISUxFOkNIT0FQQTpNaW5jaGEKKzU6Q0w6Q0hMOkNISUxFOkNIT0FQQTpTYWxhbWFuY2EKKzE6Q0w6Q0hMOkNISUxFOlFVSUxMT1RBOkNhbGVyYQorMjpDTDpDSEw6Q0hJTEU6UVVJTExPVEE6SGlqdWVsYXMKKzM6Q0w6Q0hMOkNISUxFOlFVSUxMT1RBOkxhIENydXoKKzQ6Q0w6Q0hMOkNISUxFOlFVSUxMT1RBOkxpbWFjaGUKKzU6Q0w6Q0hMOkNISUxFOlFVSUxMT1RBOk5vZ2FsZXMKKzY6Q0w6Q0hMOkNISUxFOlFVSUxMT1RBOk9sbXVlCis3OkNMOkNITDpDSElMRTpRVUlMTE9UQTpRdWlsbG90YQorMTpDTDpDSEw6Q0hJTEU6VEFMQUdBTlRFOkVsIE1vbnRlCisyOkNMOkNITDpDSElMRTpUQUxBR0FOVEU6SXNsYSBEZSBNYWlwbworMzpDTDpDSEw6Q0hJTEU6VEFMQUdBTlRFOlBlbmFmbG9yCis0OkNMOkNITDpDSElMRTpUQUxBR0FOVEU6VGFsYWdhbnRlCisxOkNMOkNITDpDSElMRTpDT0xDSEFHVUE6Q2hlcGljYQorMjpDTDpDSEw6Q0hJTEU6Q09MQ0hBR1VBOkNoaW1iYXJvbmdvCiszOkNMOkNITDpDSElMRTpDT0xDSEFHVUE6TG9sb2wKKzQ6Q0w6Q0hMOkNISUxFOkNPTENIQUdVQTpOYW5jYWd1YQorNTpDTDpDSEw6Q0hJTEU6Q09MQ0hBR1VBOlBhbG1pbGxhCis2OkNMOkNITDpDSElMRTpDT0xDSEFHVUE6UGVyYWxpbGxvCis3OkNMOkNITDpDSElMRTpDT0xDSEFHVUE6UGxhY2lsbGEKKzg6Q0w6Q0hMOkNISUxFOkNPTENIQUdVQTpQdW1hbnF1ZQorOTpDTDpDSEw6Q0hJTEU6Q09MQ0hBR1VBOlNhbiBGZXJuYW5kbworMTA6Q0w6Q0hMOkNISUxFOkNPTENIQUdVQTpTYW50YSBDcnV6CisxOkNMOkNITDpDSElMRTpDQVVRVUVORVM6Q2F1cXVlbmVzCisyOkNMOkNITDpDSElMRTpDQVVRVUVORVM6Q2hhbmNvCiszOkNMOkNITDpDSElMRTpDQVVRVUVORVM6UGVsbHVodWUKKzE6Q0w6Q0hMOkNISUxFOkxJTkFSRVM6Q29sYnVuCisyOkNMOkNITDpDSElMRTpMSU5BUkVTOkxpbmFyZXMKKzM6Q0w6Q0hMOkNISUxFOkxJTkFSRVM6TG9uZ2F2aQorNDpDTDpDSEw6Q0hJTEU6TElOQVJFUzpQYXJyYWwKKzU6Q0w6Q0hMOkNISUxFOkxJTkFSRVM6UmV0aXJvCis2OkNMOkNITDpDSElMRTpMSU5BUkVTOlNhbiBKYXZpZXIKKzc6Q0w6Q0hMOkNISUxFOkxJTkFSRVM6VmlsbGEgQWxlZ3JlCis4OkNMOkNITDpDSElMRTpMSU5BUkVTOlllcmJhcyBidWVuYXMKKzE6Q0w6Q0hMOkNISUxFOkNIQUNBQlVDTzpDSEwuTDIuMQorMjpDTDpDSEw6Q0hJTEU6Q0hBQ0FCVUNPOkNITC5MMi4yCiszOkNMOkNITDpDSElMRTpDSEFDQUJVQ086Q29saW5hCisxOkNMOkNITDpDSElMRTpBSVNFTjpBaXNlbiAoSXMuKQorMjpDTDpDSEw6Q0hJTEU6QUlTRU46Q2lzbmVzCiszOkNMOkNITDpDSElMRTpBSVNFTjpDaXNuZXMgKElzLikKKzQ6Q0w6Q0hMOkNISUxFOkFJU0VOOkd1YWl0YWNhcworNTpDTDpDSEw6Q0hJTEU6QUlTRU46R3VhaXRlY2FzIChJcy4pCisxOkNMOkNITDpDSElMRTpBUklDQTpBcmljYQorMjpDTDpDSEw6Q0hJTEU6QVJJQ0E6Q2FtYXJvbmVzCisxOkNMOkNITDpDSElMRTpJUVVJUVVFOkNhbWluYQorMjpDTDpDSEw6Q0hJTEU6SVFVSVFVRTpDb2xjaGFuZQorMzpDTDpDSEw6Q0hJTEU6SVFVSVFVRTpIdWFyYQorNDpDTDpDSEw6Q0hJTEU6SVFVSVFVRTpJcXVpcXVlCis1OkNMOkNITDpDSElMRTpJUVVJUVVFOlBpY2EKKzY6Q0w6Q0hMOkNISUxFOklRVUlRVUU6UG96byBBbG1vbnRlCisxOkNMOkNITDpDSElMRTpDQVJERU5BTCBDQVJPOkxhIEVzdHJlbGxhCisyOkNMOkNITDpDSElMRTpDQVJERU5BTCBDQVJPOkxpdHVlY2hlCiszOkNMOkNITDpDSElMRTpDQVJERU5BTCBDQVJPOk1hcmNoaWh1ZQorNDpDTDpDSEw6Q0hJTEU6Q0FSREVOQUwgQ0FSTzpOYXZpZGFkCis1OkNMOkNITDpDSElMRTpDQVJERU5BTCBDQVJPOlBhcmVkb25lcworNjpDTDpDSEw6Q0hJTEU6Q0FSREVOQUwgQ0FSTzpQaWNoaWxlbXUKKzE6Q0w6Q0hMOkNISUxFOkNPUElBUE86Q2FsZGVyYQorMjpDTDpDSEw6Q0hJTEU6Q09QSUFQTzpDYWxkZXJhIChJcy4pCiszOkNMOkNITDpDSElMRTpDT1BJQVBPOkNvcGlhcG8KKzQ6Q0w6Q0hMOkNISUxFOkNPUElBUE86VGllcnJhIEFtYXJpbGxhCisxOkNMOkNITDpDSElMRTpMSU1BUkk6Q29tYmFyYmFsYQorMjpDTDpDSEw6Q0hJTEU6TElNQVJJOk1vbnRlIFBhdHJpYQorMzpDTDpDSEw6Q0hJTEU6TElNQVJJOk92YWxsZQorNDpDTDpDSEw6Q0hJTEU6TElNQVJJOlB1bml0YXF1aQorNTpDTDpDSEw6Q0hJTEU6TElNQVJJOlJpbyBIdXJ0YWRvCisxOkNMOkNITDpDSElMRTpUQUxDQTpDb25zdGl0dWNpb24KKzI6Q0w6Q0hMOkNISUxFOlRBTENBOkN1cmVwdG8KKzM6Q0w6Q0hMOkNISUxFOlRBTENBOkVtcGVkcmFkbworNDpDTDpDSEw6Q0hJTEU6VEFMQ0E6TWF1bGUKKzU6Q0w6Q0hMOkNISUxFOlRBTENBOlBlbGFyY28KKzY6Q0w6Q0hMOkNISUxFOlRBTENBOlBlbmNhaHVlCis3OkNMOkNITDpDSElMRTpUQUxDQTpSaW8gQ2xhcm8KKzg6Q0w6Q0hMOkNISUxFOlRBTENBOlNhbiBDbGVtZW50ZQorOTpDTDpDSEw6Q0hJTEU6VEFMQ0E6VGFsY2EKKzE6Q0w6Q0hMOkNISUxFOkNBUElUQU4gUFJBVDpDb2NocmFuZQorMjpDTDpDSEw6Q0hJTEU6Q0FQSVRBTiBQUkFUOk5hdGFsZXMgKElzLikKKzM6Q0w6Q0hMOkNISUxFOkNBUElUQU4gUFJBVDpPJ2hpZ2dpbnMKKzQ6Q0w6Q0hMOkNISUxFOkNBUElUQU4gUFJBVDpUb3J0ZWwgKElzLikKKzE6Q0w6Q0hMOkNISUxFOkJJT0JJTzpBbnR1Y28KKzI6Q0w6Q0hMOkNISUxFOkJJT0JJTzpDYWJyZXJvCiszOkNMOkNITDpDSElMRTpCSU9CSU86TGFqYQorNDpDTDpDSEw6Q0hJTEU6QklPQklPOkxvcyBBbmdlbGVzCis1OkNMOkNITDpDSElMRTpCSU9CSU86TXVsY2hlbgorNjpDTDpDSEw6Q0hJTEU6QklPQklPOk5hY2ltaWVudG8KKzc6Q0w6Q0hMOkNISUxFOkJJT0JJTzpOZWdyZXRlCis4OkNMOkNITDpDSElMRTpCSU9CSU86UXVpbGFnbworOTpDTDpDSEw6Q0hJTEU6QklPQklPOlF1aWxsZWdvCisxMDpDTDpDSEw6Q0hJTEU6QklPQklPOlJvc2VuZG8KKzExOkNMOkNITDpDSElMRTpCSU9CSU86U2FudGEgQmFyYmFyYQorMTI6Q0w6Q0hMOkNISUxFOkJJT0JJTzpUdWNhcGVsCisxMzpDTDpDSEw6Q0hJTEU6QklPQklPOll1bWJlbAorMTpDTDpDSEw6Q0hJTEU6VkFMUEFSQUlTTzpDYXNhIEJsYW5jYQorMjpDTDpDSEw6Q0hJTEU6VkFMUEFSQUlTTzpQdWNodW5jYXZpCiszOkNMOkNITDpDSElMRTpWQUxQQVJBSVNPOlF1aWxwdWUKKzQ6Q0w6Q0hMOkNISUxFOlZBTFBBUkFJU086UXVpbnRlcm8KKzU6Q0w6Q0hMOkNISUxFOlZBTFBBUkFJU086VmFscGFyYWlzbworNjpDTDpDSEw6Q0hJTEU6VkFMUEFSQUlTTzpWaWxsYSBBbGVtYW5hCis3OkNMOkNITDpDSElMRTpWQUxQQVJBSVNPOlZpbmEgZGVsIE1hcgorMTpDTDpDSEw6Q0hJTEU6VE9DT1BJTExBOk1hcmlhIEVsZW5hCisyOkNMOkNITDpDSElMRTpUT0NPUElMTEE6VG9jb3BpbGxhCisxOkNMOkNITDpDSElMRTpDSEFOQVJBTDpDaGFuYXJhbAorMjpDTDpDSEw6Q0hJTEU6Q0hBTkFSQUw6Q2hhbmFyYWwgKElzLikKKzM6Q0w6Q0hMOkNISUxFOkNIQU5BUkFMOkRpZWdvIGRlIEFsbWFncm8KKzE6Q0w6Q0hMOkNISUxFOlNBTiBGRUxJUEUgREUgQUNPTkNBR1VBOkNhdGVtdQorMjpDTDpDSEw6Q0hJTEU6U0FOIEZFTElQRSBERSBBQ09OQ0FHVUE6TGxhaWxsYXkKKzM6Q0w6Q0hMOkNISUxFOlNBTiBGRUxJUEUgREUgQUNPTkNBR1VBOlBhbnF1ZWh1ZQorNDpDTDpDSEw6Q0hJTEU6U0FOIEZFTElQRSBERSBBQ09OQ0FHVUE6UHV0YWVuZG8KKzU6Q0w6Q0hMOkNISUxFOlNBTiBGRUxJUEUgREUgQUNPTkNBR1VBOlNhbiBGZWxpcGUKKzY6Q0w6Q0hMOkNISUxFOlNBTiBGRUxJUEUgREUgQUNPTkNBR1VBOlNhbnRhIE1hcmlhCisxOkNMOkNITDpDSElMRTpDT0lIQUlRVUU6Q29paGFpcXVlCisyOkNMOkNITDpDSElMRTpDT0lIQUlRVUU6TGFnbyBWZXJkZQorMTpDTDpDSEw6Q0hJTEU6UEFSSU5BQ09UQTpHZW5lcmFsIExhZ29zCisyOkNMOkNITDpDSElMRTpQQVJJTkFDT1RBOlB1dHJlCisxOkNMOkNITDpDSElMRTpVTFRJTUEgRVNQRVJBTlpBOk5hdGFsZXMKKzI6Q0w6Q0hMOkNISUxFOlVMVElNQSBFU1BFUkFOWkE6TmF0YWxlcyAoSXMuKQorMzpDTDpDSEw6Q0hJTEU6VUxUSU1BIEVTUEVSQU5aQTpUb3JyZXMgRGUgUGFpbmUKKzE6Q0w6Q0hMOkNISUxFOkNBVVRJTjpDYXJhaHVlCisyOkNMOkNITDpDSElMRTpDQVVUSU46Q3VuY28KKzM6Q0w6Q0hMOkNISUxFOkNBVVRJTjpDdXJhcnJlaHVlCis0OkNMOkNITDpDSElMRTpDQVVUSU46RnJlaXJlCis1OkNMOkNITDpDSElMRTpDQVVUSU46R2FsdmFyaW5vCis2OkNMOkNITDpDSElMRTpDQVVUSU46R29sYmVhCis3OkNMOkNITDpDSElMRTpDQVVUSU46TGF1dGFybworODpDTDpDSEw6Q0hJTEU6Q0FVVElOOkxvbmNvY2hlCis5OkNMOkNITDpDSElMRTpDQVVUSU46TWVsaXBldWNvCisxMDpDTDpDSEw6Q0hJTEU6Q0FVVElOOk51ZXZhIEltcGVyaWFsCisxMTpDTDpDSEw6Q0hJTEU6Q0FVVElOOlBlcnF1ZW5jbworMTI6Q0w6Q0hMOkNISUxFOkNBVVRJTjpQaXRydWZxdWVuCisxMzpDTDpDSEw6Q0hJTEU6Q0FVVElOOlB1Y29uCisxNDpDTDpDSEw6Q0hJTEU6Q0FVVElOOlNhYXZlZHJhCisxNTpDTDpDSEw6Q0hJTEU6Q0FVVElOOlRlbXVjbworMTY6Q0w6Q0hMOkNISUxFOkNBVVRJTjpUZW9kb3JvIFNjaG1pZHQKKzE3OkNMOkNITDpDSElMRTpDQVVUSU46VG9sdGVuCisxODpDTDpDSEw6Q0hJTEU6Q0FVVElOOlZpbGN1bgorMTk6Q0w6Q0hMOkNISUxFOkNBVVRJTjpWaWxsYXJyaWNhCisxOkNMOkNITDpDSElMRTpPU09STk86RW50cmUgTGFnb3MKKzI6Q0w6Q0hMOkNISUxFOk9TT1JOTzpPc29ybm8KKzM6Q0w6Q0hMOkNISUxFOk9TT1JOTzpQdWVydG8gT2N0YXkKKzQ6Q0w6Q0hMOkNISUxFOk9TT1JOTzpQdXJyYW5xdWUKKzU6Q0w6Q0hMOkNISUxFOk9TT1JOTzpSaW8gTmVncm8KKzY6Q0w6Q0hMOkNISUxFOk9TT1JOTzpTYW4gSnVhbiBEZSBMYSBDb3N0YQorNzpDTDpDSEw6Q0hJTEU6T1NPUk5POlNhbiBwYWJsbworMTpDTDpDSEw6Q0hJTEU6TE9TIEFOREVTOkNhbGxlIExhcmdhCisyOkNMOkNITDpDSElMRTpMT1MgQU5ERVM6TG9zIEFuZGVzCiszOkNMOkNITDpDSElMRTpMT1MgQU5ERVM6UmluY29uYWRhCis0OkNMOkNITDpDSElMRTpMT1MgQU5ERVM6U2FuIEVzdGViYW4KKzE6Q0w6Q0hMOkNISUxFOk1BR0FMTEFORVM6Q0hMLkwyLjMKKzI6Q0w6Q0hMOkNISUxFOk1BR0FMTEFORVM6UHVudGEgQXJlbmFzIChJcy4pCiszOkNMOkNITDpDSElMRTpNQUdBTExBTkVTOlJpbyBWZXJkZQorNDpDTDpDSEw6Q0hJTEU6TUFHQUxMQU5FUzpSaW8gVmVyZGUgKElzLikKKzE6Q0w6Q0hMOkNISUxFOkNPUkRJTExFUkE6UGlycXVlCisyOkNMOkNITDpDSElMRTpDT1JESUxMRVJBOlB1ZW50ZSBBbHRvCiszOkNMOkNITDpDSElMRTpDT1JESUxMRVJBOnNhbiBqb2RlIGRlIE1haXBvCisxOkNMOkNITDpDSElMRTpDVVJJQ086Q3VyaWNvCisyOkNMOkNITDpDSElMRTpDVVJJQ086SHVhbGFuZQorMzpDTDpDSEw6Q0hJTEU6Q1VSSUNPOkxpY2FudGVuCis0OkNMOkNITDpDSElMRTpDVVJJQ086TW9saW5hCis1OkNMOkNITDpDSElMRTpDVVJJQ086UmF1Y28KKzY6Q0w6Q0hMOkNISUxFOkNVUklDTzpSb21lcmFsCis3OkNMOkNITDpDSElMRTpDVVJJQ086U2FncmFkYSBGYW1pbGlhCis4OkNMOkNITDpDSElMRTpDVVJJQ086VGVubworOTpDTDpDSEw6Q0hJTEU6Q1VSSUNPOlZpY2h1cXVlbgorMTpDTDpDSEw6Q0hJTEU6UEVUT1JDQTpDYWJpbGRvCisyOkNMOkNITDpDSElMRTpQRVRPUkNBOkxhIExpZ3VhCiszOkNMOkNITDpDSElMRTpQRVRPUkNBOlBhcHVkbworNDpDTDpDSEw6Q0hJTEU6UEVUT1JDQTpQZXRvcmNhCis1OkNMOkNITDpDSElMRTpQRVRPUkNBOlphcGFsbGFyCisxOkNMOkNITDpDSElMRTpNQUxMRUNPOkFuZ29sCisyOkNMOkNITDpDSElMRTpNQUxMRUNPOkNvbGxpcHVsbGkKKzM6Q0w6Q0hMOkNISUxFOk1BTExFQ086Q3VyYWNhdXRpbgorNDpDTDpDSEw6Q0hJTEU6TUFMTEVDTzpFcmNpbGxhCis1OkNMOkNITDpDSElMRTpNQUxMRUNPOkxvbnF1aW1heQorNjpDTDpDSEw6Q0hJTEU6TUFMTEVDTzpMb3MgU2F1Y2VzCis3OkNMOkNITDpDSElMRTpNQUxMRUNPOkx1bWFjbworODpDTDpDSEw6Q0hJTEU6TUFMTEVDTzpQdXJlbgorOTpDTDpDSEw6Q0hJTEU6TUFMTEVDTzpSZW5haWNvCisxMDpDTDpDSEw6Q0hJTEU6TUFMTEVDTzpUcmFpZ3VlbgorMTE6Q0w6Q0hMOkNISUxFOk1BTExFQ086VmljdG9yaWEKKzE6Q0w6Q0hMOkNISUxFOlNBTiBBTlRPTklPOkFsZ2Fycm9ibworMjpDTDpDSEw6Q0hJTEU6U0FOIEFOVE9OSU86Q2FydGFnZW5hCiszOkNMOkNITDpDSElMRTpTQU4gQU5UT05JTzpFbCBRdWlzY28KKzQ6Q0w6Q0hMOkNISUxFOlNBTiBBTlRPTklPOkVsIFRhYm8KKzU6Q0w6Q0hMOkNISUxFOlNBTiBBTlRPTklPOlNhbiBBbnRvbmlvCis2OkNMOkNITDpDSElMRTpTQU4gQU5UT05JTzpTYW50byAgRG9taW5nbwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DSE4vQ0hOX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DSE4vQ0hOX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZDI0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NITi9DSE5fQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwzOSBAQAorMTpDTi0zNDpDTjpBTkhVSQorMjpDTi05MjpDTjpBT01FTiAoWkgpCiszOkNOLTA6Q046QkVJSklORworNDpDTi01MDpDTjpDSE9OR1FJTkcKKzU6Q04tMzU6Q046RlVKSUFOCis2OkNOLTYyOkNOOkdBTlNVCis3OkNOLTQ0OkNOOkdVQU5HRE9ORworODpDTi00NTpDTjpHVUFOR1hJCis5OkNOLTUyOkNOOkdVSVpIT1UKKzEwOkNOLTQ2OkNOOkhBSU5BTgorMTE6Q04tNzM6Q046SEVCRUkKKzEyOkNOLTIzOkNOOkhFSUxPTkdKSUFORworMTM6Q04tNDpDTjpIRU5BTgorMTQ6Q04tSEs6Q046SE9OR0tPTkcgSVNMQU5ECisxNTpDTi00MjpDTjpIVUJFSQorMTY6Q04tNDM6Q046SFVOQU4KKzE3OkNOLUpLOkNOOkpBTU1VIEFORCBLQVNITUlSCisxODpDTi0zMjpDTjpKSUFOR1NVCisxOTpDTi0zNjpDTjpKSUFOR1hJCisyMDpDTi0yMjpDTjpKSUxJTgorMjE6Q04tS09XOkNOOktPV0xPT04gQU5EIE5FVyBLT1dMT09OCisyMjpDTi03MjpDTjpMSUFPTklORworMjM6Q04tTUFSOkNOOk1BUklORQorMjQ6Q04tNzU6Q046TkVJIE1PTkdPTCBaSVpISVFVCisyNTpDTi1OVDpDTjpORVcgVEVSUklUT1JJRVMKKzI2OkNOLTY0OkNOOk5JTkdYSUEKKzI3OkNOLTYzOkNOOlFJTkdIQUkKKzI4OkNOLTY6Q046U0hBQU5YSQorMjk6Q04tMzc6Q046U0hBTkRPTkcKKzMwOkNOLTM6Q046U0hBTkdIQUkKKzMxOkNOLTc0OkNOOlNIQU5YSQorMzI6Q04tNTpDTjpTSUNIVUFOCiszMzpDTi03OkNOOlRBSVdBTgorMzQ6Q04tMjpDTjpUSUFOSklOCiszNTpDTi05OkNOOlhJQU5HR0FORyAoWkgpCiszNjpDTi02NTpDTjpYSU5KSUFORyBVWUdVUgorMzc6Q04tNTQ6Q046WElaQU5HIFpJWkhJUVUgKFRJQkVUKQorMzg6Q04tNTM6Q046WVVOTkFOCiszOTpDTi0zMzpDTjpaSEVKSUFORwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DSE4vQ0hOX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DSE4vQ0hOX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MmE2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NITi9DSE5fQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSwyNDE0IEBACisxOkNOOkNITjpDSElOQTpZdW5uYW46QW5uaW5nCisyOkNOOkNITjpDSElOQTpZdW5uYW46QmFvc2hhbgorMzpDTjpDSE46Q0hJTkE6WXVubmFuOkJpamlhbmcKKzQ6Q046Q0hOOkNISU5BOll1bm5hbjpCaW5jaHVhbgorNTpDTjpDSE46Q0hJTkE6WXVubmFuOkNhbmd5dWFuCis2OkNOOkNITjpDSElOQTpZdW5uYW46Q2hhbmduaW5nCis3OkNOOkNITjpDSElOQTpZdW5uYW46Q2hlbmdqaWFuZworODpDTjpDSE46Q0hJTkE6WXVubmFuOkNoZW5nb25nCis5OkNOOkNITjpDSElOQTpZdW5uYW46Q2h1eGlvbmcKKzEwOkNOOkNITjpDSElOQTpZdW5uYW46RGFndWFuCisxMTpDTjpDSE46Q0hJTkE6WXVubmFuOkRhbGkKKzEyOkNOOkNITjpDSElOQTpZdW5uYW46RGF5YW8KKzEzOkNOOkNITjpDSElOQTpZdW5uYW46RGVxZW4KKzE0OkNOOkNITjpDSElOQTpZdW5uYW46RG9uZ2NodW4gU2hpCisxNTpDTjpDSE46Q0hJTkE6WXVubmFuOkVyeXVhbgorMTY6Q046Q0hOOkNISU5BOll1bm5hbjpFc2hhbgorMTc6Q046Q0hOOkNISU5BOll1bm5hbjpGZW5ncWluZworMTg6Q046Q0hOOkNISU5BOll1bm5hbjpGdWdvbmcKKzE5OkNOOkNITjpDSElOQTpZdW5uYW46RnVtaW5nCisyMDpDTjpDSE46Q0hJTkE6WXVubmFuOkZ1bmluZworMjE6Q046Q0hOOkNISU5BOll1bm5hbjpGdXl1YW4KKzIyOkNOOkNITjpDSElOQTpZdW5uYW46R2VqaXUgU2hpCisyMzpDTjpDSE46Q0hJTkE6WXVubmFuOkdlbmdtYQorMjQ6Q046Q0hOOkNISU5BOll1bm5hbjpHb25nc2hhbgorMjU6Q046Q0hOOkNISU5BOll1bm5hbjpHdWFuZ25hbgorMjY6Q046Q0hOOkNISU5BOll1bm5hbjpIZWtvdQorMjc6Q046Q0hOOkNISU5BOll1bm5hbjpIZXFpbmcKKzI4OkNOOkNITjpDSElOQTpZdW5uYW46SG9uZ2hlCisyOTpDTjpDSE46Q0hJTkE6WXVubmFuOkh1YW5pbmcKKzMwOkNOOkNITjpDSElOQTpZdW5uYW46SHVhcGluZworMzE6Q046Q0hOOkNISU5BOll1bm5hbjpIdWl6ZQorMzI6Q046Q0hOOkNISU5BOll1bm5hbjpKaWFuY2h1YW4KKzMzOkNOOkNITjpDSElOQTpZdW5uYW46SmlhbmdjaGVuZworMzQ6Q046Q0hOOkNISU5BOll1bm5hbjpKaWFuZ2NodWFuCiszNTpDTjpDSE46Q0hJTkE6WXVubmFuOkppYW5zaHVpCiszNjpDTjpDSE46Q0hJTkE6WXVubmFuOkppbmdkb25nCiszNzpDTjpDSE46Q0hJTkE6WXVubmFuOkppbmdndQorMzg6Q046Q0hOOkNISU5BOll1bm5hbjpKaW5naG9uZworMzk6Q046Q0hOOkNISU5BOll1bm5hbjpKaW5uaW5nCis0MDpDTjpDSE46Q0hJTkE6WXVubmFuOkppbnBpbmcKKzQxOkNOOkNITjpDSElOQTpZdW5uYW46S2FpeXVhbiBTaGkKKzQyOkNOOkNITjpDSElOQTpZdW5uYW46S3Vlbm1pbmcgU2hpcXUKKzQzOkNOOkNITjpDSElOQTpZdW5uYW46TGFuY2FuZworNDQ6Q046Q0hOOkNISU5BOll1bm5hbjpMYW5waW5nCis0NTpDTjpDSE46Q0hJTkE6WXVubmFuOkxpYW5naGUKKzQ2OkNOOkNITjpDSElOQTpZdW5uYW46TGlqaWFuZworNDc6Q046Q0hOOkNISU5BOll1bm5hbjpMaW5jYW5nCis0ODpDTjpDSE46Q0hJTkE6WXVubmFuOkxvbmdjaHVhbgorNDk6Q046Q0hOOkNISU5BOll1bm5hbjpMb25nbGluZworNTA6Q046Q0hOOkNISU5BOll1bm5hbjpMdWNodW4KKzUxOkNOOkNITjpDSElOQTpZdW5uYW46THVkaWFuCis1MjpDTjpDSE46Q0hJTkE6WXVubmFuOkx1ZmVuZworNTM6Q046Q0hOOkNISU5BOll1bm5hbjpMdWxpYW5nCis1NDpDTjpDSE46Q0hJTkE6WXVubmFuOkx1bmFuCis1NTpDTjpDSE46Q0hJTkE6WXVubmFuOkx1b3BpbmcKKzU2OkNOOkNITjpDSElOQTpZdW5uYW46THVxdWFuCis1NzpDTjpDSE46Q0hJTkE6WXVubmFuOkx1c2h1aQorNTg6Q046Q0hOOkNISU5BOll1bm5hbjpMdXhpCis1OTpDTjpDSE46Q0hJTkE6WXVubmFuOk1hZ3VhbgorNjA6Q046Q0hOOkNISU5BOll1bm5hbjpNYWxpcG8KKzYxOkNOOkNITjpDSElOQTpZdW5uYW46TWFsb25nCis2MjpDTjpDSE46Q0hJTkE6WXVubmFuOk1lbmdoYWkKKzYzOkNOOkNITjpDSElOQTpZdW5uYW46TWVuZ2xhCis2NDpDTjpDSE46Q0hJTkE6WXVubmFuOk1lbmdsaWFuCis2NTpDTjpDSE46Q0hJTkE6WXVubmFuOk1lbmd6aQorNjY6Q046Q0hOOkNISU5BOll1bm5hbjpNaWR1Cis2NzpDTjpDSE46Q0hJTkE6WXVubmFuOk1pbGUKKzY4OkNOOkNITjpDSElOQTpZdW5uYW46TW9qaWFuZworNjk6Q046Q0hOOkNISU5BOll1bm5hbjpNb3VkaW5nCis3MDpDTjpDSE46Q0hJTkE6WXVubmFuOk5hbmh1YQorNzE6Q046Q0hOOkNISU5BOll1bm5hbjpOYW5qaWFuCis3MjpDTjpDSE46Q0hJTkE6WXVubmFuOk5pbmdsYW5nCis3MzpDTjpDSE46Q0hJTkE6WXVubmFuOlBpbmdiaWFuCis3NDpDTjpDSE46Q0hJTkE6WXVubmFuOlB1ZXIKKzc1OkNOOkNITjpDSElOQTpZdW5uYW46UWlhb2ppYQorNzY6Q046Q0hOOkNISU5BOll1bm5hbjpRaXViZWkKKzc3OkNOOkNITjpDSElOQTpZdW5uYW46UXVqaW5nCis3ODpDTjpDSE46Q0hJTkE6WXVubmFuOlJ1aWxpCis3OTpDTjpDSE46Q0hJTkE6WXVubmFuOlNoaWRpYW4KKzgwOkNOOkNITjpDSElOQTpZdW5uYW46U2hpcGluZworODE6Q046Q0hOOkNISU5BOll1bm5hbjpTaGl6b25nCis4MjpDTjpDSE46Q0hJTkE6WXVubmFuOlNodWFuZ2JhaQorODM6Q046Q0hOOkNISU5BOll1bm5hbjpTaHVhbmdqaWFuZworODQ6Q046Q0hOOkNISU5BOll1bm5hbjpTaHVpZnUKKzg1OkNOOkNITjpDSElOQTpZdW5uYW46U2ltYW8KKzg2OkNOOkNITjpDSElOQTpZdW5uYW46U29uZ21pbmcKKzg3OkNOOkNITjpDSElOQTpZdW5uYW46U3VpamlhbmcKKzg4OkNOOkNITjpDSElOQTpZdW5uYW46VGVuZ2Nob25nCis4OTpDTjpDSE46Q0hJTkE6WXVubmFuOlRvbmdoYWkKKzkwOkNOOkNITjpDSElOQTpZdW5uYW46V2FuZGluZ3poZW4KKzkxOkNOOkNITjpDSElOQTpZdW5uYW46V2Vpc2hhbgorOTI6Q046Q0hOOkNISU5BOll1bm5hbjpXZWl4aQorOTM6Q046Q0hOOkNISU5BOll1bm5hbjpXZWl4aW4KKzk0OkNOOkNITjpDSElOQTpZdW5uYW46V3VkaW5nCis5NTpDTjpDSE46Q0hJTkE6WXVubmFuOld1ZW5zaGFuCis5NjpDTjpDSE46Q0hJTkE6WXVubmFuOlhpYWd1YW4gU2hpCis5NzpDTjpDSE46Q0hJTkE6WXVubmFuOlhpYW5neXVuCis5ODpDTjpDSE46Q0hJTkE6WXVubmFuOlhpY2hvdQorOTk6Q046Q0hOOkNISU5BOll1bm5hbjpYaW1lbmcKKzEwMDpDTjpDSE46Q0hJTkE6WXVubmFuOlhpbnBpbmcKKzEwMTpDTjpDSE46Q0hJTkE6WXVubmFuOlh1YW53ZWkKKzEwMjpDTjpDSE46Q0hJTkE6WXVubmFuOlh1bmRpYW4KKzEwMzpDTjpDSE46Q0hJTkE6WXVubmFuOllhbmdiaQorMTA0OkNOOkNITjpDSElOQTpZdW5uYW46WWFuamluCisxMDU6Q046Q0hOOkNISU5BOll1bm5hbjpZYW5zaGFuCisxMDY6Q046Q0hOOkNISU5BOll1bm5hbjpZYW9hbgorMTA3OkNOOkNITjpDSElOQTpZdW5uYW46WWlsaWFuZworMTA4OkNOOkNITjpDSElOQTpZdW5uYW46WWltZW4KKzEwOTpDTjpDSE46Q0hJTkE6WXVubmFuOllpbmdqaWFuZworMTEwOkNOOkNITjpDSElOQTpZdW5uYW46WW9uZ2RlCisxMTE6Q046Q0hOOkNISU5BOll1bm5hbjpZb25ncGluZworMTEyOkNOOkNITjpDSElOQTpZdW5uYW46WW9uZ3JlbgorMTEzOkNOOkNITjpDSElOQTpZdW5uYW46WW9uZ3NoYW4KKzExNDpDTjpDSE46Q0hJTkE6WXVubmFuOllvbmdzaGVuZworMTE1OkNOOkNITjpDSElOQTpZdW5uYW46WXVhbmppYW5nCisxMTY6Q046Q0hOOkNISU5BOll1bm5hbjpZdWFubW91CisxMTc6Q046Q0hOOkNISU5BOll1bm5hbjpZdWFueWFuZworMTE4OkNOOkNITjpDSElOQTpZdW5uYW46WXVuIFhpYW4KKzExOTpDTjpDSE46Q0hJTkE6WXVubmFuOll1bmxvbmcKKzEyMDpDTjpDSE46Q0hJTkE6WXVubmFuOll1eGkKKzEyMTpDTjpDSE46Q0hJTkE6WXVubmFuOlpoYW55aQorMTIyOkNOOkNITjpDSElOQTpZdW5uYW46Wmhhb3RvbmcKKzEyMzpDTjpDSE46Q0hJTkE6WXVubmFuOlpoYW90b25nIFNoaQorMTI0OkNOOkNITjpDSElOQTpZdW5uYW46WmhlbmthbmcKKzEyNTpDTjpDSE46Q0hJTkE6WXVubmFuOlpoZW54aW9uZworMTI2OkNOOkNITjpDSElOQTpZdW5uYW46Wmhlbnl1YW4KKzEyNzpDTjpDSE46Q0hJTkE6WXVubmFuOlpob25nZGlhbgorMTpDTjpDSE46Q0hJTkE6R3VpemhvdTpBbmxvbmcKKzI6Q046Q0hOOkNISU5BOkd1aXpob3U6QW5zaHVuCiszOkNOOkNITjpDSElOQTpHdWl6aG91OkFuc2h1biBTaGkKKzQ6Q046Q0hOOkNISU5BOkd1aXpob3U6QmlqaWUKKzU6Q046Q0hOOkNISU5BOkd1aXpob3U6Q2VoZW5nCis2OkNOOkNITjpDSElOQTpHdWl6aG91OkNlbmdvbmcKKzc6Q046Q0hOOkNISU5BOkd1aXpob3U6Q2hhbmdzaHVuCis4OkNOOkNITjpDSElOQTpHdWl6aG91OkNoaXNodWkKKzk6Q046Q0hOOkNISU5BOkd1aXpob3U6Q29uZ2ppYW5nCisxMDpDTjpDSE46Q0hJTkE6R3VpemhvdTpEYWZhbmcKKzExOkNOOkNITjpDSElOQTpHdWl6aG91OkRhbnpoYWkKKzEyOkNOOkNITjpDSElOQTpHdWl6aG91OkRhb3poZW4KKzEzOkNOOkNITjpDSElOQTpHdWl6aG91OkRlamlhbmcKKzE0OkNOOkNITjpDSElOQTpHdWl6aG91OkR1c2hhbgorMTU6Q046Q0hOOkNISU5BOkd1aXpob3U6RHV5dW4KKzE2OkNOOkNITjpDSElOQTpHdWl6aG91OkZlbmdnYW5nCisxNzpDTjpDSE46Q0hJTkE6R3VpemhvdTpGdXF1YW4KKzE4OkNOOkNITjpDSElOQTpHdWl6aG91Okd1YW5saW5nCisxOTpDTjpDSE46Q0hJTkE6R3VpemhvdTpHdWlkaW5nCisyMDpDTjpDSE46Q0hJTkE6R3VpemhvdTpHdWl5YW5nIFNoaQorMjE6Q046Q0hOOkNISU5BOkd1aXpob3U6SGV6aGFuZworMjI6Q046Q0hOOkNISU5BOkd1aXpob3U6SHVhbmdwaW5nCisyMzpDTjpDSE46Q0hJTkE6R3VpemhvdTpIdWlzaHVpCisyNDpDTjpDSE46Q0hJTkE6R3VpemhvdTpKaWFuZ2tvdQorMjU6Q046Q0hOOkNISU5BOkd1aXpob3U6SmlhbmhlCisyNjpDTjpDSE46Q0hJTkE6R3VpemhvdTpKaW5waW5nCisyNzpDTjpDSE46Q0hJTkE6R3VpemhvdTpKaW5zaGEKKzI4OkNOOkNITjpDSElOQTpHdWl6aG91OkthaWxpCisyOTpDTjpDSE46Q0hJTkE6R3VpemhvdTpLYWl5YW5nCiszMDpDTjpDSE46Q0hJTkE6R3VpemhvdTpMZWlzaGFuCiszMTpDTjpDSE46Q0hJTkE6R3VpemhvdTpMaWJvCiszMjpDTjpDSE46Q0hJTkE6R3VpemhvdTpMaXBpbmcKKzMzOkNOOkNITjpDSElOQTpHdWl6aG91OkxvbmdsaQorMzQ6Q046Q0hOOkNISU5BOkd1aXpob3U6THVvZGlhbgorMzU6Q046Q0hOOkNISU5BOkd1aXpob3U6THV6aGkKKzM2OkNOOkNITjpDSElOQTpHdWl6aG91Ok1hamlhbmcKKzM3OkNOOkNITjpDSElOQTpHdWl6aG91Ok1laXRhbgorMzg6Q046Q0hOOkNISU5BOkd1aXpob3U6TmF5b25nCiszOTpDTjpDSE46Q0hJTkE6R3VpemhvdTpQYW54aWFuCis0MDpDTjpDSE46Q0hJTkE6R3VpemhvdTpQaW5nYmEKKzQxOkNOOkNITjpDSElOQTpHdWl6aG91OlBpbmd0YW5nCis0MjpDTjpDSE46Q0hJTkE6R3VpemhvdTpQdSBBbgorNDM6Q046Q0hOOkNISU5BOkd1aXpob3U6UHVkaW5nCis0NDpDTjpDSE46Q0hJTkE6R3VpemhvdTpRaWFueGkKKzQ1OkNOOkNITjpDSElOQTpHdWl6aG91OlFpbmdsb25nCis0NjpDTjpDSE46Q0hJTkE6R3VpemhvdTpRaW5nemhlbgorNDc6Q046Q0hOOkNISU5BOkd1aXpob3U6UmVuaHVhaQorNDg6Q046Q0hOOkNISU5BOkd1aXpob3U6Um9uZ2ppYW5nCis0OTpDTjpDSE46Q0hJTkE6R3VpemhvdTpTYW5kdQorNTA6Q046Q0hOOkNISU5BOkd1aXpob3U6U2Fuc3VpCis1MTpDTjpDSE46Q0hJTkE6R3VpemhvdTpTaGliaW5nCis1MjpDTjpDSE46Q0hJTkE6R3VpemhvdTpTaGlxaWFuCis1MzpDTjpDSE46Q0hJTkE6R3VpemhvdTpTaHVpY2hlbmcKKzU0OkNOOkNITjpDSElOQTpHdWl6aG91OlNpbmFuCis1NTpDTjpDSE46Q0hJTkE6R3VpemhvdTpTb25ndGFvCis1NjpDTjpDSE46Q0hJTkE6R3VpemhvdTpTdWl5YW5nCis1NzpDTjpDSE46Q0hJTkE6R3VpemhvdTpUYWlqaWFuZworNTg6Q046Q0hOOkNISU5BOkd1aXpob3U6VGlhbnpodQorNTk6Q046Q0hOOkNISU5BOkd1aXpob3U6VG9uZ3JlbgorNjA6Q046Q0hOOkNISU5BOkd1aXpob3U6VG9uZ3ppCis2MTpDTjpDSE46Q0hJTkE6R3VpemhvdTpXYW5nbW8KKzYyOkNOOkNITjpDSElOQTpHdWl6aG91OldhbnNoYW4KKzYzOkNOOkNITjpDSElOQTpHdWl6aG91OldlaW5pbmcKKzY0OkNOOkNITjpDSElOQTpHdWl6aG91OldlbmcgQW4KKzY1OkNOOkNITjpDSElOQTpHdWl6aG91Old1Y2h1YW4KKzY2OkNOOkNITjpDSElOQTpHdWl6aG91OlhpZmVuZworNjc6Q046Q0hOOkNISU5BOkd1aXpob3U6WGluZ3JlbgorNjg6Q046Q0hOOkNISU5BOkd1aXpob3U6WGluZ3lpCis2OTpDTjpDSE46Q0hJTkE6R3VpemhvdTpYaXNodWkKKzcwOkNOOkNITjpDSElOQTpHdWl6aG91OlhpdXdlbgorNzE6Q046Q0hOOkNISU5BOkd1aXpob3U6WWFuaGUKKzcyOkNOOkNITjpDSElOQTpHdWl6aG91OllpbmppYW5nCis3MzpDTjpDSE46Q0hJTkE6R3VpemhvdTpZdXBpbmcKKzc0OkNOOkNITjpDSElOQTpHdWl6aG91Oll1cWluZworNzU6Q046Q0hOOkNISU5BOkd1aXpob3U6WmhlbmZlbmcKKzc2OkNOOkNITjpDSElOQTpHdWl6aG91OlpoZW5nIEFuCis3NzpDTjpDSE46Q0hJTkE6R3VpemhvdTpaaGVubmluZworNzg6Q046Q0hOOkNISU5BOkd1aXpob3U6Wmhlbnl1YW4KKzc5OkNOOkNITjpDSElOQTpHdWl6aG91OlpoaWppbgorODA6Q046Q0hOOkNISU5BOkd1aXpob3U6Wml5dW4KKzgxOkNOOkNITjpDSElOQTpHdWl6aG91Olp1bnlpCis4MjpDTjpDSE46Q0hJTkE6R3VpemhvdTpadW55aSBTaGkKKzE6Q046Q0hOOkNISU5BOlNoYW54aTpBbnplCisyOkNOOkNITjpDSElOQTpTaGFueGk6QmFvZGUKKzM6Q046Q0hOOkNISU5BOlNoYW54aTpDaGFuZ3poaQorNDpDTjpDSE46Q0hJTkE6U2hhbnhpOkNoYW5nemhpIFNoaQorNTpDTjpDSE46Q0hJTkE6U2hhbnhpOkRhaSBYaWFuCis2OkNOOkNITjpDSElOQTpTaGFueGk6RGFuaW5nCis3OkNOOkNITjpDSElOQTpTaGFueGk6RGF0b25nCis4OkNOOkNITjpDSElOQTpTaGFueGk6RGF0b25nIFNoaQorOTpDTjpDSE46Q0hJTkE6U2hhbnhpOkRpbmd4aWFuZworMTA6Q046Q0hOOkNISU5BOlNoYW54aTpGYW5nc2hhbgorMTE6Q046Q0hOOkNISU5BOlNoYW54aTpGYW5zaGkKKzEyOkNOOkNITjpDSElOQTpTaGFueGk6RmVueGkKKzEzOkNOOkNITjpDSElOQTpTaGFueGk6RmVueWFuZworMTQ6Q046Q0hOOkNISU5BOlNoYW54aTpGdXNoYW4KKzE1OkNOOkNITjpDSElOQTpTaGFueGk6R2FvcGluZworMTY6Q046Q0hOOkNISU5BOlNoYW54aTpHdSBYaWFuCisxNzpDTjpDSE46Q0hJTkE6U2hhbnhpOkd1YW5nbGluZworMTg6Q046Q0hOOkNISU5BOlNoYW54aTpIZWppbgorMTk6Q046Q0hOOkNISU5BOlNoYW54aTpIZXF1CisyMDpDTjpDSE46Q0hJTkE6U2hhbnhpOkhlc2h1bgorMjE6Q046Q0hOOkNISU5BOlNoYW54aTpIb25ndG9uZworMjI6Q046Q0hOOkNISU5BOlNoYW54aTpIb3VtYSBTaGkKKzIzOkNOOkNITjpDSElOQTpTaGFueGk6SHVhaXJlbgorMjQ6Q046Q0hOOkNISU5BOlNoYW54aTpIdWd1YW4KKzI1OkNOOkNITjpDSElOQTpTaGFueGk6SHVueXVhbgorMjY6Q046Q0hOOkNISU5BOlNoYW54aTpIdW8gWGlhbgorMjc6Q046Q0hOOkNISU5BOlNoYW54aTpKaSBYaWFuCisyODpDTjpDSE46Q0hJTkE6U2hhbnhpOkppYW5nIFhpYW4KKzI5OkNOOkNITjpDSElOQTpTaGFueGk6Smlhb2NoZW5nCiszMDpDTjpDSE46Q0hJTkE6U2hhbnhpOkppYW9rb3UKKzMxOkNOOkNITjpDSElOQTpTaGFueGk6SmlleGx1CiszMjpDTjpDSE46Q0hJTkE6U2hhbnhpOkppbmdjaGVuZworMzM6Q046Q0hOOkNISU5BOlNoYW54aTpKaW5nbGUKKzM0OkNOOkNITjpDSElOQTpTaGFueGk6Smluc2hhbgorMzU6Q046Q0hOOkNISU5BOlNoYW54aTpLZWxhbgorMzY6Q046Q0hOOkNISU5BOlNoYW54aTpMYW4gWGlhbgorMzc6Q046Q0hOOkNISU5BOlNoYW54aTpMaWNoZW5nCiszODpDTjpDSE46Q0hJTkE6U2hhbnhpOkxpbiBYaWFuCiszOTpDTjpDSE46Q0hJTkE6U2hhbnhpOkxpbmZlbgorNDA6Q046Q0hOOkNISU5BOlNoYW54aTpMaW5mZW4gU2hpCis0MTpDTjpDSE46Q0hJTkE6U2hhbnhpOkxpbmdjaHVhbgorNDI6Q046Q0hOOkNISU5BOlNoYW54aTpMaW5ncWl1Cis0MzpDTjpDSE46Q0hJTkE6U2hhbnhpOkxpbmdzaGkKKzQ0OkNOOkNITjpDSElOQTpTaGFueGk6TGlueWkKKzQ1OkNOOkNITjpDSElOQTpTaGFueGk6TGlzaGkKKzQ2OkNOOkNITjpDSElOQTpTaGFueGk6TGl1bGluCis0NzpDTjpDSE46Q0hJTkE6U2hhbnhpOkxvdWZhbgorNDg6Q046Q0hOOkNISU5BOlNoYW54aTpMdWNoZW5nCis0OTpDTjpDSE46Q0hJTkE6U2hhbnhpOk5pbmd3dQorNTA6Q046Q0hOOkNISU5BOlNoYW54aTpQaWFuZ3VhbgorNTE6Q046Q0hOOkNISU5BOlNoYW54aTpQaW5nZGluZworNTI6Q046Q0hOOkNISU5BOlNoYW54aTpQaW5nbHUKKzUzOkNOOkNITjpDSElOQTpTaGFueGk6UGluZ3NodW4KKzU0OkNOOkNITjpDSElOQTpTaGFueGk6UGluZ3lhbworNTU6Q046Q0hOOkNISU5BOlNoYW54aTpQdSBYaWFuCis1NjpDTjpDSE46Q0hJTkE6U2hhbnhpOlFpIFhpYW4KKzU3OkNOOkNITjpDSElOQTpTaGFueGk6UWluIFhpYW4KKzU4OkNOOkNITjpDSElOQTpTaGFueGk6UWluZ3h1Cis1OTpDTjpDSE46Q0hJTkE6U2hhbnhpOlFpbnNodWkKKzYwOkNOOkNITjpDSElOQTpTaGFueGk6UWlueXVhbgorNjE6Q046Q0hOOkNISU5BOlNoYW54aTpRdXdvCis2MjpDTjpDSE46Q0hJTkE6U2hhbnhpOlJ1aWNoZW5nCis2MzpDTjpDSE46Q0hJTkE6U2hhbnhpOlNoYW55aW4KKzY0OkNOOkNITjpDSElOQTpTaGFueGk6U2hlbmNoaQorNjU6Q046Q0hOOkNISU5BOlNoYW54aTpTaGlsb3UKKzY2OkNOOkNITjpDSElOQTpTaGFueGk6U2hvdXlhbmcKKzY3OkNOOkNITjpDSElOQTpTaGFueGk6U2h1byBYaWFuCis2ODpDTjpDSE46Q0hJTkE6U2hhbnhpOlRhaWd1Cis2OTpDTjpDSE46Q0hJTkE6U2hhbnhpOlRhaXl1YW4gU2hpcXUKKzcwOkNOOkNITjpDSElOQTpTaGFueGk6VGlhbnpoZW4KKzcxOkNOOkNITjpDSElOQTpTaGFueGk6VHVubGl1Cis3MjpDTjpDSE46Q0hJTkE6U2hhbnhpOldhbnJvbmcKKzczOkNOOkNITjpDSElOQTpTaGFueGk6V2Vuc2h1aQorNzQ6Q046Q0hOOkNISU5BOlNoYW54aTpXZW54aQorNzU6Q046Q0hOOkNISU5BOlNoYW54aTpXdXRhaQorNzY6Q046Q0hOOkNISU5BOlNoYW54aTpXdXhpYW5nCis3NzpDTjpDSE46Q0hJTkE6U2hhbnhpOld1emhhaQorNzg6Q046Q0hOOkNISU5BOlNoYW54aTpYaSBYaWFuCis3OTpDTjpDSE46Q0hJTkE6U2hhbnhpOlhpYSBYaWFuCis4MDpDTjpDSE46Q0hJTkE6U2hhbnhpOlhpYW5nZmVuCis4MTpDTjpDSE46Q0hJTkE6U2hhbnhpOlhpYW5nbmluZworODI6Q046Q0hOOkNISU5BOlNoYW54aTpYaWFuZ3l1YW4KKzgzOkNOOkNITjpDSElOQTpTaGFueGk6WGlhb3lpCis4NDpDTjpDSE46Q0hJTkE6U2hhbnhpOlhpbiBYaWFuCis4NTpDTjpDSE46Q0hJTkE6U2hhbnhpOlhpbmcgWGlhbgorODY6Q046Q0hOOkNISU5BOlNoYW54aTpYaW5qaWFuZworODc6Q046Q0hOOkNISU5BOlNoYW54aTpYaXlhbmcKKzg4OkNOOkNITjpDSElOQTpTaGFueGk6WWFuZ2NoZW5nCis4OTpDTjpDSE46Q0hJTkE6U2hhbnhpOllhbmdnYW8KKzkwOkNOOkNITjpDSElOQTpTaGFueGk6WWFuZ3F1Cis5MTpDTjpDSE46Q0hJTkE6U2hhbnhpOllhbmdxdWFuIFNoaQorOTI6Q046Q0hOOkNISU5BOlNoYW54aTpZaWNoZW5nCis5MzpDTjpDSE46Q0hJTkE6U2hhbnhpOllpbmcgWGlhbgorOTQ6Q046Q0hOOkNISU5BOlNoYW54aTpZb25naGUKKzk1OkNOOkNITjpDSElOQTpTaGFueGk6WW9uZ2ppCis5NjpDTjpDSE46Q0hJTkE6U2hhbnhpOllvdXl1Cis5NzpDTjpDSE46Q0hJTkE6U2hhbnhpOll1IFhpYW4KKzk4OkNOOkNITjpDSElOQTpTaGFueGk6WXVhbnBpbmcKKzk5OkNOOkNITjpDSElOQTpTaGFueGk6WXVhbnF1CisxMDA6Q046Q0hOOkNISU5BOlNoYW54aTpZdWNpCisxMDE6Q046Q0hOOkNISU5BOlNoYW54aTpZdWNpIFNoaQorMTAyOkNOOkNITjpDSElOQTpTaGFueGk6WXVuY2hlbmcKKzEwMzpDTjpDSE46Q0hJTkE6U2hhbnhpOll1c2hlCisxMDQ6Q046Q0hOOkNISU5BOlNoYW54aTpaaGFuZ3poaQorMTA1OkNOOkNITjpDSElOQTpTaGFueGk6Wmhvbmd5YW5nCisxMDY6Q046Q0hOOkNISU5BOlNoYW54aTpadW9xdWFuCisxMDc6Q046Q0hOOkNISU5BOlNoYW54aTpadW95dW4KKzE6Q046Q0hOOkNISU5BOlFpbmdoYWk6QmFpbWEKKzI6Q046Q0hOOkNISU5BOlFpbmdoYWk6Q2hpbmR1CiszOkNOOkNITjpDSElOQTpRaW5naGFpOkRhcWFpZGFtCis0OkNOOkNITjpDSElOQTpRaW5naGFpOkRhcmxhZworNTpDTjpDSE46Q0hJTkE6UWluZ2hhaTpEYXRvbmcKKzY6Q046Q0hOOkNISU5BOlFpbmdoYWk6RHVsYW4KKzc6Q046Q0hOOkNISU5BOlFpbmdoYWk6R2FkZQorODpDTjpDSE46Q0hJTkE6UWluZ2hhaTpHYW5nY2EKKzk6Q046Q0hOOkNISU5BOlFpbmdoYWk6R29sbXVkIFNoaQorMTA6Q046Q0hOOkNISU5BOlFpbmdoYWk6R29uZ2hlCisxMTpDTjpDSE46Q0hJTkE6UWluZ2hhaTpHdWlkZQorMTI6Q046Q0hOOkNISU5BOlFpbmdoYWk6R3VpbmFuCisxMzpDTjpDSE46Q0hJTkE6UWluZ2hhaTpIYWl5YW4KKzE0OkNOOkNITjpDSElOQTpRaW5naGFpOkhlbmFuCisxNTpDTjpDSE46Q0hJTkE6UWluZ2hhaTpIdWFsb25nCisxNjpDTjpDSE46Q0hJTkE6UWluZ2hhaTpIdWFuZ3l1YW4KKzE3OkNOOkNITjpDSElOQTpRaW5naGFpOkh1YW5nemhvbmcKKzE4OkNOOkNITjpDSElOQTpRaW5naGFpOkh1emh1CisxOTpDTjpDSE46Q0hJTkE6UWluZ2hhaTpKYWluY2EKKzIwOkNOOkNITjpDSElOQTpRaW5naGFpOkppZ3poaQorMjE6Q046Q0hOOkNISU5BOlFpbmdoYWk6TGVkdQorMjI6Q046Q0hOOkNISU5BOlFpbmdoYWk6TGVuZ2h1CisyMzpDTjpDSE46Q0hJTkE6UWluZ2hhaTpNYWRvaQorMjQ6Q046Q0hOOkNISU5BOlFpbmdoYWk6TWFuZ25haQorMjU6Q046Q0hOOkNISU5BOlFpbmdoYWk6TWFxZW4KKzI2OkNOOkNITjpDSElOQTpRaW5naGFpOk1lbnl1YW4KKzI3OkNOOkNITjpDSElOQTpRaW5naGFpOk1pbmhlCisyODpDTjpDSE46Q0hJTkE6UWluZ2hhaTpOYW5ncWVuCisyOTpDTjpDSE46Q0hJTkE6UWluZ2hhaTpQaW5nIEFuCiszMDpDTjpDSE46Q0hJTkE6UWluZ2hhaTpRaWxpYW4KKzMxOkNOOkNITjpDSElOQTpRaW5naGFpOlF1bWFybGViCiszMjpDTjpDSE46Q0hJTkE6UWluZ2hhaTpUaWFuanVuCiszMzpDTjpDSE46Q0hJTkE6UWluZ2hhaTpUb25nZGUKKzM0OkNOOkNITjpDSElOQTpRaW5naGFpOlRvbmdyZW4KKzM1OkNOOkNITjpDSElOQTpRaW5naGFpOlVsYW4KKzM2OkNOOkNITjpDSElOQTpRaW5naGFpOlhpbmdoYW4KKzM3OkNOOkNITjpDSElOQTpRaW5naGFpOlhpbmluZyBTaGlxdQorMzg6Q046Q0hOOkNISU5BOlFpbmdoYWk6WHVuaHVhCiszOTpDTjpDSE46Q0hJTkE6UWluZ2hhaTpZdXNodQorNDA6Q046Q0hOOkNISU5BOlFpbmdoYWk6WmFkb2kKKzQxOkNOOkNITjpDSElOQTpRaW5naGFpOlpla29nCis0MjpDTjpDSE46Q0hJTkE6UWluZ2hhaTpaaGlkb3QKKzE6Q046Q0hOOkNISU5BOkNob25ncWluZzpCYSBYaWFuCisyOkNOOkNITjpDSElOQTpDaG9uZ3Fpbmc6QmlzaGFuCiszOkNOOkNITjpDSElOQTpDaG9uZ3Fpbmc6Q2hhbmdzaG91Cis0OkNOOkNITjpDSElOQTpDaG9uZ3Fpbmc6Q2hlbmdrb3UKKzU6Q046Q0hOOkNISU5BOkNob25ncWluZzpDaG9uZ3FpbmcgU2hpcXUKKzY6Q046Q0hOOkNISU5BOkNob25ncWluZzpEYXp1Cis3OkNOOkNITjpDSElOQTpDaG9uZ3Fpbmc6RGlhbmppYW5nCis4OkNOOkNITjpDSElOQTpDaG9uZ3Fpbmc6RmVuZ2R1Cis5OkNOOkNITjpDSElOQTpDaG9uZ3Fpbmc6RmVuZ2ppZQorMTA6Q046Q0hOOkNISU5BOkNob25ncWluZzpGdWxpbmcKKzExOkNOOkNITjpDSElOQTpDaG9uZ3Fpbmc6SGVjaHVhbgorMTI6Q046Q0hOOkNISU5BOkNob25ncWluZzpKaWFuZ2JlaQorMTM6Q046Q0hOOkNISU5BOkNob25ncWluZzpKaWFuZ2ppbgorMTQ6Q046Q0hOOkNISU5BOkNob25ncWluZzpLYWkgWGlhbgorMTU6Q046Q0hOOkNISU5BOkNob25ncWluZzpMaWFuZ3BpbmcKKzE2OkNOOkNITjpDSElOQTpDaG9uZ3Fpbmc6TmFuY2h1YW4KKzE3OkNOOkNITjpDSElOQTpDaG9uZ3Fpbmc6UGVuZ3NodWkKKzE4OkNOOkNITjpDSElOQTpDaG9uZ3Fpbmc6UWlhbmppYW5nCisxOTpDTjpDSE46Q0hJTkE6Q2hvbmdxaW5nOlFpamlhbmcKKzIwOkNOOkNITjpDSElOQTpDaG9uZ3Fpbmc6Um9uZ2NoYW5nCisyMTpDTjpDSE46Q0hJTkE6Q2hvbmdxaW5nOlNoaXpodQorMjI6Q046Q0hOOkNISU5BOkNob25ncWluZzpUb25nbGlhbmcKKzIzOkNOOkNITjpDSElOQTpDaG9uZ3Fpbmc6VG9uZ25hbgorMjQ6Q046Q0hOOkNISU5BOkNob25ncWluZzpXYW4gWGlhbgorMjU6Q046Q0hOOkNISU5BOkNob25ncWluZzpXYW54aWFuIFNoaQorMjY6Q046Q0hOOkNISU5BOkNob25ncWluZzpXdWxvbmcKKzI3OkNOOkNITjpDSElOQTpDaG9uZ3Fpbmc6V3VzaGFuCisyODpDTjpDSE46Q0hJTkE6Q2hvbmdxaW5nOld1eGkKKzI5OkNOOkNITjpDSElOQTpDaG9uZ3Fpbmc6WGl1c2hhbgorMzA6Q046Q0hOOkNISU5BOkNob25ncWluZzpZb25nY2h1YW4KKzMxOkNOOkNITjpDSElOQTpDaG9uZ3Fpbmc6WW91eWFuZworMzI6Q046Q0hOOkNISU5BOkNob25ncWluZzpZdW55YW5nCiszMzpDTjpDSE46Q0hJTkE6Q2hvbmdxaW5nOlpob25nIFhpYW4KKzE6Q046Q0hOOkNISU5BOkphbW11IGFuZCBLYXNobWlyOkxhZGFraCAoTGVoKQorMTpDTjpDSE46Q0hJTkE6SGVuYW46QW55YW5nCisyOkNOOkNITjpDSElOQTpIZW5hbjpBbnlhbmcgU2hpCiszOkNOOkNITjpDSElOQTpIZW5hbjpCYW9mZW5nCis0OkNOOkNITjpDSElOQTpIZW5hbjpCaXlhbmcKKzU6Q046Q0hOOkNISU5BOkhlbmFuOkJvYWkKKzY6Q046Q0hOOkNISU5BOkhlbmFuOkNoYW5nZ2UKKzc6Q046Q0hOOkNISU5BOkhlbmFuOkNoYW5neXVhbgorODpDTjpDSE46Q0hJTkE6SGVuYW46RGFuY2hlbmcKKzk6Q046Q0hOOkNISU5BOkhlbmFuOkRlbmcgWGlhbgorMTA6Q046Q0hOOkNISU5BOkhlbmFuOkRlbmdmZW5nCisxMTpDTjpDSE46Q0hJTkE6SGVuYW46RmFuZ2NoZW5nCisxMjpDTjpDSE46Q0hJTkE6SGVuYW46RmFueGlhbgorMTM6Q046Q0hOOkNISU5BOkhlbmFuOkZlbmdxaXUKKzE0OkNOOkNITjpDSElOQTpIZW5hbjpGdWdvdQorMTU6Q046Q0hOOkNISU5BOkhlbmFuOkdvbmcgWGlhbgorMTY6Q046Q0hOOkNISU5BOkhlbmFuOkd1YW5nc2hhbgorMTc6Q046Q0hOOkNISU5BOkhlbmFuOkd1c2hpCisxODpDTjpDSE46Q0hJTkE6SGVuYW46SGViaSBTaGkKKzE5OkNOOkNITjpDSElOQTpIZW5hbjpIb3VqaWEKKzIwOkNOOkNITjpDSElOQTpIZW5hbjpIdWEgWGlhbgorMjE6Q046Q0hOOkNISU5BOkhlbmFuOkh1YWliaW4KKzIyOkNOOkNITjpDSElOQTpIZW5hbjpIdWFpeWFuZworMjM6Q046Q0hOOkNISU5BOkhlbmFuOkh1YW5nY2h1YW4KKzI0OkNOOkNITjpDSElOQTpIZW5hbjpIdWkgWGlhbgorMjU6Q046Q0hOOkNISU5BOkhlbmFuOkppIFhpYW4KKzI2OkNOOkNITjpDSElOQTpIZW5hbjpKaWEgWGlhbgorMjc6Q046Q0hOOkNISU5BOkhlbmFuOkppYW96dW8KKzI4OkNOOkNITjpDSElOQTpIZW5hbjpKaXl1YW4KKzI5OkNOOkNITjpDSElOQTpIZW5hbjpLYWlmZW5nCiszMDpDTjpDSE46Q0hJTkE6SGVuYW46S2FpZmVuZyBTaGkKKzMxOkNOOkNITjpDSElOQTpIZW5hbjpMYW5rYW8KKzMyOkNOOkNITjpDSElOQTpIZW5hbjpMaW4gWGlhbgorMzM6Q046Q0hOOkNISU5BOkhlbmFuOkxpbmdiYW8KKzM0OkNOOkNITjpDSElOQTpIZW5hbjpMaW5ydQorMzU6Q046Q0hOOkNISU5BOkhlbmFuOkxpbnlpbmcKKzM2OkNOOkNITjpDSElOQTpIZW5hbjpMdWFuY2h1YW4KKzM3OkNOOkNITjpDSElOQTpIZW5hbjpMdW9oZSBTaGkKKzM4OkNOOkNITjpDSElOQTpIZW5hbjpMdW9uaW5nCiszOTpDTjpDSE46Q0hJTkE6SGVuYW46THVvc2hhbgorNDA6Q046Q0hOOkNISU5BOkhlbmFuOkx1b3lhbmcgU2hpCis0MTpDTjpDSE46Q0hJTkE6SGVuYW46THVzaGFuCis0MjpDTjpDSE46Q0hJTkE6SGVuYW46THVzaGkKKzQzOkNOOkNITjpDSElOQTpIZW5hbjpMdXlpCis0NDpDTjpDSE46Q0hJTkE6SGVuYW46TWVuZyBYaWFuCis0NTpDTjpDSE46Q0hJTkE6SGVuYW46TWVuamluCis0NjpDTjpDSE46Q0hJTkE6SGVuYW46TWkgWGlhbgorNDc6Q046Q0hOOkNISU5BOkhlbmFuOk1pYW5jaGkKKzQ4OkNOOkNITjpDSElOQTpIZW5hbjpNaW5ncXVhbgorNDk6Q046Q0hOOkNISU5BOkhlbmFuOk5hbmxlCis1MDpDTjpDSE46Q0hJTkE6SGVuYW46TmFueWFuZworNTE6Q046Q0hOOkNISU5BOkhlbmFuOk5hbnlhbmcgU2hpCis1MjpDTjpDSE46Q0hJTkE6SGVuYW46TmFuemhhbworNTM6Q046Q0hOOkNISU5BOkhlbmFuOk5laWh1YW5nCis1NDpDTjpDSE46Q0hJTkE6SGVuYW46TmVpeGlhbmcKKzU1OkNOOkNITjpDSElOQTpIZW5hbjpOaW5nbGluZworNTY6Q046Q0hOOkNISU5BOkhlbmFuOlBpbmdkaW5nc2hhbiBTaGkKKzU3OkNOOkNITjpDSElOQTpIZW5hbjpQaW5neXUKKzU4OkNOOkNITjpDSElOQTpIZW5hbjpQdXlhbmcKKzU5OkNOOkNITjpDSElOQTpIZW5hbjpRaSBYaWFuCis2MDpDTjpDSE46Q0hJTkE6SGVuYW46UWluZ2ZlbmcKKzYxOkNOOkNITjpDSElOQTpIZW5hbjpRaW55YW5nCis2MjpDTjpDSE46Q0hJTkE6SGVuYW46UXVlc2hhbgorNjM6Q046Q0hOOkNISU5BOkhlbmFuOlJ1bmFuCis2NDpDTjpDSE46Q0hJTkE6SGVuYW46UnV5YW5nCis2NTpDTjpDSE46Q0hJTkE6SGVuYW46U2FubWVueGlhIFNoaQorNjY6Q046Q0hOOkNISU5BOkhlbmFuOlNoYW4gWGlhbgorNjc6Q046Q0hOOkNISU5BOkhlbmFuOlNoYW5nY2FpCis2ODpDTjpDSE46Q0hJTkE6SGVuYW46U2hhbmdjaGVuZworNjk6Q046Q0hOOkNISU5BOkhlbmFuOlNoYW5ncWl1Cis3MDpDTjpDSE46Q0hJTkE6SGVuYW46U2hhbmdxaXUgU2hpCis3MTpDTjpDSE46Q0hJTkE6SGVuYW46U2hhbmdzaHVpCis3MjpDTjpDSE46Q0hJTkE6SGVuYW46U2hlbnFpdQorNzM6Q046Q0hOOkNISU5BOkhlbmFuOlNoZXFpCis3NDpDTjpDSE46Q0hJTkE6SGVuYW46U29uZyBYaWFuCis3NTpDTjpDSE46Q0hJTkE6SGVuYW46U3VpIFhpYW4KKzc2OkNOOkNITjpDSElOQTpIZW5hbjpTdWlwaW5nCis3NzpDTjpDSE46Q0hJTkE6SGVuYW46VGFpa2FuZworNzg6Q046Q0hOOkNISU5BOkhlbmFuOlRhaXFpYW4KKzc5OkNOOkNITjpDSElOQTpIZW5hbjpUYW5naGUKKzgwOkNOOkNITjpDSElOQTpIZW5hbjpUYW5neWluCis4MTpDTjpDSE46Q0hJTkE6SGVuYW46VG9uZ2JhaQorODI6Q046Q0hOOkNISU5BOkhlbmFuOlRvbmd4dQorODM6Q046Q0hOOkNISU5BOkhlbmFuOldlaXNoaQorODQ6Q046Q0hOOkNISU5BOkhlbmFuOldlbiBYaWFuCis4NTpDTjpDSE46Q0hJTkE6SGVuYW46V3V5YW5nCis4NjpDTjpDSE46Q0hJTkE6SGVuYW46V3V6aGkKKzg3OkNOOkNITjpDSElOQTpIZW5hbjpYaSBYaWFuCis4ODpDTjpDSE46Q0hJTkE6SGVuYW46WGlhbmdjaGVuZworODk6Q046Q0hOOkNISU5BOkhlbmFuOlhpYXlpCis5MDpDTjpDSE46Q0hJTkE6SGVuYW46WGljaHVhbgorOTE6Q046Q0hOOkNISU5BOkhlbmFuOlhpaHVhCis5MjpDTjpDSE46Q0hJTkE6SGVuYW46WGluIEFuCis5MzpDTjpDSE46Q0hJTkE6SGVuYW46WGluY2FpCis5NDpDTjpDSE46Q0hJTkE6SGVuYW46WGluZ3lhbmcKKzk1OkNOOkNITjpDSElOQTpIZW5hbjpYaW54aWFuCis5NjpDTjpDSE46Q0hJTkE6SGVuYW46WGlueGlhbmcKKzk3OkNOOkNITjpDSElOQTpIZW5hbjpYaW54aWFuZyBTaGkKKzk4OkNOOkNITjpDSElOQTpIZW5hbjpYaW55YW5nCis5OTpDTjpDSE46Q0hJTkE6SGVuYW46WGlueWFuZyBTaGkKKzEwMDpDTjpDSE46Q0hJTkE6SGVuYW46WGlueWUKKzEwMTpDTjpDSE46Q0hJTkE6SGVuYW46WGluemhlbmcKKzEwMjpDTjpDSE46Q0hJTkE6SGVuYW46WGlwaW5nCisxMDM6Q046Q0hOOkNISU5BOkhlbmFuOlhpdXd1CisxMDQ6Q046Q0hOOkNISU5BOkhlbmFuOlhpeGlhCisxMDU6Q046Q0hOOkNISU5BOkhlbmFuOlh1Y2hhbmcKKzEwNjpDTjpDSE46Q0hJTkE6SGVuYW46WHVjaGFuZyBTaGkKKzEwNzpDTjpDSE46Q0hJTkE6SGVuYW46WHVuIFhpYW4KKzEwODpDTjpDSE46Q0hJTkE6SGVuYW46WWFuY2hlbmcKKzEwOTpDTjpDSE46Q0hJTkE6SGVuYW46WWFuamluCisxMTA6Q046Q0hOOkNISU5BOkhlbmFuOllhbmxpbmcKKzExMTpDTjpDSE46Q0hJTkE6SGVuYW46WWFuc2hpCisxMTI6Q046Q0hOOkNISU5BOkhlbmFuOllpY2h1YW4KKzExMzpDTjpDSE46Q0hJTkE6SGVuYW46WWllIFhpYW4KKzExNDpDTjpDSE46Q0hJTkE6SGVuYW46WWltYSBTaGkKKzExNTpDTjpDSE46Q0hJTkE6SGVuYW46WWl5YW5nCisxMTY6Q046Q0hOOkNISU5BOkhlbmFuOllvbmdjaGVuZworMTE3OkNOOkNITjpDSElOQTpIZW5hbjpZdSBYaWFuCisxMTg6Q046Q0hOOkNISU5BOkhlbmFuOll1YW55YW5nCisxMTk6Q046Q0hOOkNISU5BOkhlbmFuOll1Y2hlbmcKKzEyMDpDTjpDSE46Q0hJTkE6SGVuYW46WmhlY2hlbmcKKzEyMTpDTjpDSE46Q0hJTkE6SGVuYW46Wmhlbmd5YW5nCisxMjI6Q046Q0hOOkNISU5BOkhlbmFuOlpoZW5nemhvdSBTaGlxdQorMTIzOkNOOkNITjpDSElOQTpIZW5hbjpaaGVucGluZworMTI0OkNOOkNITjpDSElOQTpIZW5hbjpaaG9uZ21vdQorMTI1OkNOOkNITjpDSElOQTpIZW5hbjpaaG91a291IFNoaQorMTI2OkNOOkNITjpDSElOQTpIZW5hbjpaaHVtYWRpYW4gU2hpCisxOkNOOkNITjpDSElOQTpOZXcgVGVycml0b3JpZXM6Q0hOLkwyLjE4CisyOkNOOkNITjpDSElOQTpOZXcgVGVycml0b3JpZXM6Q0hOLkwyLjE5CiszOkNOOkNITjpDSElOQTpOZXcgVGVycml0b3JpZXM6Q0hOLkwyLjIwCis0OkNOOkNITjpDSElOQTpOZXcgVGVycml0b3JpZXM6Q0hOLkwyLjIxCis1OkNOOkNITjpDSElOQTpOZXcgVGVycml0b3JpZXM6Q0hOLkwyLjIyCis2OkNOOkNITjpDSElOQTpOZXcgVGVycml0b3JpZXM6Q0hOLkwyLjIzCis3OkNOOkNITjpDSElOQTpOZXcgVGVycml0b3JpZXM6Q0hOLkwyLjI0Cis4OkNOOkNITjpDSElOQTpOZXcgVGVycml0b3JpZXM6Q0hOLkwyLjI1Cis5OkNOOkNITjpDSElOQTpOZXcgVGVycml0b3JpZXM6Q0hOLkwyLjI2CisxMDpDTjpDSE46Q0hJTkE6TmV3IFRlcnJpdG9yaWVzOkNITi5MMi4yNworMTE6Q046Q0hOOkNISU5BOk5ldyBUZXJyaXRvcmllczpDSE4uTDIuMjgKKzEyOkNOOkNITjpDSElOQTpOZXcgVGVycml0b3JpZXM6Q0hOLkwyLjI5CisxMzpDTjpDSE46Q0hJTkE6TmV3IFRlcnJpdG9yaWVzOkNITi5MMi4zMAorMTQ6Q046Q0hOOkNISU5BOk5ldyBUZXJyaXRvcmllczpDSE4uTDIuMzEKKzE1OkNOOkNITjpDSElOQTpOZXcgVGVycml0b3JpZXM6Q0hOLkwyLjMyCisxOkNOOkNITjpDSElOQTpTaGFuZ2hhaTpCYW9zaGFuCisyOkNOOkNITjpDSElOQTpTaGFuZ2hhaTpDaG9uZ21pbmcKKzM6Q046Q0hOOkNISU5BOlNoYW5naGFpOkNodWFuc2hhCis0OkNOOkNITjpDSElOQTpTaGFuZ2hhaTpGZW5neGlhbgorNTpDTjpDSE46Q0hJTkE6U2hhbmdoYWk6SmlhZGluZworNjpDTjpDSE46Q0hJTkE6U2hhbmdoYWk6Smluc2hhbgorNzpDTjpDSE46Q0hJTkE6U2hhbmdoYWk6TmFuaHVpCis4OkNOOkNITjpDSElOQTpTaGFuZ2hhaTpRaW5ncHUKKzk6Q046Q0hOOkNISU5BOlNoYW5naGFpOlNoYW5naGFpCisxMDpDTjpDSE46Q0hJTkE6U2hhbmdoYWk6U2hhbmdoYWkgU2hpcXUKKzExOkNOOkNITjpDSElOQTpTaGFuZ2hhaTpTb25namlhbmcKKzE6Q046Q0hOOkNISU5BOk1hcmluZTpDSE4uTDIuMTAKKzI6Q046Q0hOOkNISU5BOk1hcmluZTpDSE4uTDIuMTEKKzM6Q046Q0hOOkNISU5BOk1hcmluZTpDSE4uTDIuMTIKKzQ6Q046Q0hOOkNISU5BOk1hcmluZTpDSE4uTDIuMTMKKzU6Q046Q0hOOkNISU5BOk1hcmluZTpDSE4uTDIuMTQKKzY6Q046Q0hOOkNISU5BOk1hcmluZTpDSE4uTDIuMTUKKzc6Q046Q0hOOkNISU5BOk1hcmluZTpDSE4uTDIuMTYKKzg6Q046Q0hOOkNISU5BOk1hcmluZTpDSE4uTDIuMTcKKzk6Q046Q0hOOkNISU5BOk1hcmluZTpDSE4uTDIuNQorMTA6Q046Q0hOOkNISU5BOk1hcmluZTpDSE4uTDIuNgorMTE6Q046Q0hOOkNISU5BOk1hcmluZTpDSE4uTDIuNworMTI6Q046Q0hOOkNISU5BOk1hcmluZTpDSE4uTDIuOAorMTM6Q046Q0hOOkNISU5BOk1hcmluZTpDSE4uTDIuOQorMTpDTjpDSE46Q0hJTkE6SG9uZ2tvbmcgSXNsYW5kOkNITi5MMi4xCisyOkNOOkNITjpDSElOQTpIb25na29uZyBJc2xhbmQ6Q0hOLkwyLjIKKzE6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpBYmFnIFFpCisyOkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6QWJhZ25hciBRaQorMzpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OkFseGEgWW91cWkKKzQ6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpBbHhhIFp1b3FpCis1OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6QW9oYW4gUWkKKzY6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpBciBIb3JxaW4gUWkKKzc6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpBcnVuIFFpCis4OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6QmFpcmluIFp1b3FpCis5OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6QmFscmluIFlvdXFpCisxMDpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OkJhb3RvdSBTaGlxdQorMTE6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpCdXRoYSBRaQorMTI6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpDaGVuYmFyYWcgUWkKKzEzOkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6Q2hpZmVuZworMTQ6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpDaGlmZW5nIFNoaQorMTU6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpEYWxhZCBRaQorMTY6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpEYXJoYW4gTXVtaW5nZ2FuIExpYQorMTc6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpEZW5na291CisxODpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OkRvbmcgVWppbXFpbiBRaQorMTk6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpEb25nc2hlbmcKKzIwOkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6RHVvbHVuCisyMTpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OkVqaW4gUWkKKzIyOkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6RWppbmhvcm8gUWkKKzIzOkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6RXJlbmhvdCBTaGkKKzI0OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6RXJndW4gWW91cWkKKzI1OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6RXJndW4gWnVvcWkKKzI2OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6RXdlbmtpenUgWml6aGlxaQorMjc6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpGZW5nemhlbgorMjg6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpHdXlhbmcKKzI5OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6SGFnaW4gSG91cWkKKzMwOkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6SGFpbGFyIFNoaQorMzE6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpIYW5nZ2luIFFpCiszMjpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OkhhcnFpbiBRaQorMzM6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpIZXhpZ3RlbiBRaQorMzQ6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpIb2hob3QgU2hpcXUKKzM1OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6SG9yaW5nZXIKKzM2OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6SG9ycWluIFlvdXlpcWlhbnFpCiszNzpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OkhvcnFpbiBZb3V5aXpob25ncWkKKzM4OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6SG9ycWluIFp1b3lpaG91cWkKKzM5OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6SG9ycWluIFp1b3lpemhvbmdxaQorNDA6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpIdWFkZQorNDE6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpIdXJlIFFpCis0MjpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OkphbGFpZCBRaQorNDM6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpKYXJ1ZCBRaQorNDQ6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpKaW5pbmcgU2hpCis0NTpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1Okp1bmdhciBRaQorNDY6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpLYWlsdQorNDc6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpMaWFuZ2NoZW5nCis0ODpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OkxpbmhlCis0OTpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OkxpbnhpCis1MDpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1Ok1hbnpob3VsaSBTaGkKKzUxOkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6TW9yaW5kYXdhIERhdXIgQWIKKzUyOkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6TmFpbWFuIFFpCis1MzpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1Ok5pbmdjaGVuZworNTQ6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpPbmduaXVkIFFpCis1NTpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1Ok9yb3FlbiBaaXpoaXFpCis1NjpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1Ok90b2cgUWkKKzU3OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6T3RvZyBRaWFucWkKKzU4OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6UWFoYXIgWW91eWkgSG91cWkKKzU5OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6UWFoYXIgWW91eWkgUWlhbnFpCis2MDpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OlFhaGFyIFlvdXlpIFpob25ncWkKKzYxOkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6UWluZ3NodWloZQorNjI6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpTaGFuZ2R1Cis2MzpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OlNpeml3YW5nIFFpCis2NDpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OlNvbmlkIFlvdXFpCis2NTpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OlNvbmlkIFp1b3FpCis2NjpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OlRhaWJ1cyBRaQorNjc6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpUb2d0b2gKKzY4OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6VG9uZ2xpYW8KKzY5OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6VG9uZ2xpYW8gU2hpCis3MDpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OlR1bWQgWW91cWkKKzcxOkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6VHVtZCBab3VxaQorNzI6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpUdXF1YW4KKzczOkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6VWxhbmhvdCBTaGkKKzc0OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6VXJhZCBIb3VxaQorNzU6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpVcmFkIFFpYW5xaQorNzY6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpVcmFkIFpob25ncWkKKzc3OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6VXhpbiBRaQorNzg6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpXdWNodWFuCis3OTpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1Old1aGFpIFNoaQorODA6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpXdXl1YW4KKzgxOkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6WGkgVWppbXFpbiBRaQorODI6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpYaWFuZ2h1YW5nIFFpCis4MzpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OlhpbmJhcmFnIFlvdXFpCis4NDpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OlhpbmJhcmFnIFp1b3FpCis4NTpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1OlhpbmdoZQorODY6Q046Q0hOOkNISU5BOk5laSBNb25nb2wgWml6aGlxdTpYdWd1aXQgUWkKKzg3OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6WmhhbmdsYW4gUWkKKzg4OkNOOkNITjpDSElOQTpOZWkgTW9uZ29sIFppemhpcXU6Wmhlbmd4aWFuYmFpIFFpCis4OTpDTjpDSE46Q0hJTkE6TmVpIE1vbmdvbCBaaXpoaXF1Olpob3V6aQorMTpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpBbWRvCisyOkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOkJhaW5hbmcKKzM6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6QmFuYmFyCis0OkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOkJhcWVuCis1OkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOkJheG9pCis2OkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOkJpcnUKKzc6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6Qm9taQorODpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpCdXJhbmcKKzk6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6Q29tYWkKKzEwOkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOkNvbmEKKzExOkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOkNvcWVuCisxMjpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpEYWd6ZQorMTM6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6RGFteHVuZworMTQ6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6RGVuZ3FlbgorMTU6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6RGluZ2d5ZQorMTY6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6RG9pbHVuZ2RlcWVuCisxNzpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpHYW1iYQorMTg6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6R2FyCisxOTpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpHZSBHeWFpCisyMDpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpHZXJ6ZQorMjE6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6R29uZ2JvZ3lhbWRhCisyMjpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpHb25nZ2FyCisyMzpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpHb25qbworMjQ6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6R3lhY2EKKzI1OkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOkd5YW5nemUKKzI2OkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOkd5aXJvbmcKKzI3OkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOkpvbWRhCisyODpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpLYW5nbWFyCisyOTpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpMaGFyaQorMzA6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6TGhhc2EgU2hpcXUKKzMxOkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOkxoYXplCiszMjpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpMaG9yb25nCiszMzpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpMaG96aGFnCiszNDpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpMaHVuemUKKzM1OkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOkxodW56aHViCiszNjpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpNYWlubGluZworMzc6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6TWFpemhva3VuZ2dhcgorMzg6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6TWFya2FtCiszOTpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpNZWRvZworNDA6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6TmFncXUKKzQxOkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOk5hZ3J6ZQorNDI6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6TmFtbGluZworNDM6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6TmFuZyBYaWFuCis0NDpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpOZWRvbmcKKzQ1OkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOk5nYW1yaW5nCis0NjpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpOeWFpbnJvbmcKKzQ3OkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOk55YWxhbQorNDg6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6TnllbW8KKzQ5OkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOk55aW5nY2hpCis1MDpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpRYW1kbworNTE6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6UW9uZ2d5YWkKKzUyOkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOlF1c3VtCis1MzpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpRdXh1Cis1NDpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpSYWluZ29pbgorNTU6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6UmluYnVuZworNTY6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6Uml3b3FlCis1NzpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpSdXRvZworNTg6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6U2FnYQorNTk6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6U2FneWEKKzYwOkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOlNhbmdyaQorNjE6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6U29nIFhpYW4KKzYyOkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOlRpbmdyaQorNjM6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6WGFpbnphCis2NDpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpYYWl0b25nbW9pbgorNjU6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6WGlnYXplCis2NjpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpZYWRvbmcKKzY3OkNOOkNITjpDSElOQTpYaXphbmcgWml6aGlxdSAoVGliZXQpOlphbmRhCis2ODpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpaYXl1Cis2OTpDTjpDSE46Q0hJTkE6WGl6YW5nIFppemhpcXUgKFRpYmV0KTpaaGFnIFlhYgorNzA6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6WmhhbmFuZworNzE6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6WmhvbmdiYQorNzI6Q046Q0hOOkNISU5BOlhpemFuZyBaaXpoaXF1IChUaWJldCk6Wm9nYW5nCisxOkNOOkNITjpDSElOQTpKaWxpbjpBbnR1CisyOkNOOkNITjpDSElOQTpKaWxpbjpCYWljaGVuZyBTaGkKKzM6Q046Q0hOOkNISU5BOkppbGluOkNoYW5nYmFpCis0OkNOOkNITjpDSElOQTpKaWxpbjpDaGFuZ2NodW4gU2hpcXUKKzU6Q046Q0hOOkNISU5BOkppbGluOkNoYW5nbGluZworNjpDTjpDSE46Q0hJTkE6SmlsaW46RGEgQW4KKzc6Q046Q0hOOkNISU5BOkppbGluOkRlaHVpCis4OkNOOkNITjpDSElOQTpKaWxpbjpEb25nZmVuZworOTpDTjpDSE46Q0hJTkE6SmlsaW46RHVuaHVhCisxMDpDTjpDSE46Q0hJTkE6SmlsaW46RnVzb25nCisxMTpDTjpDSE46Q0hJTkE6SmlsaW46RnV5dQorMTI6Q046Q0hOOkNISU5BOkppbGluOkhhaWxvbmcKKzEzOkNOOkNITjpDSElOQTpKaWxpbjpIZWxvbmcKKzE0OkNOOkNITjpDSElOQTpKaWxpbjpIdWFkaWFuCisxNTpDTjpDSE46Q0hJTkE6SmlsaW46SHVhaWRlCisxNjpDTjpDSE46Q0hJTkE6SmlsaW46SHVpbmFuCisxNzpDTjpDSE46Q0hJTkE6SmlsaW46SHVuY2h1bgorMTg6Q046Q0hOOkNISU5BOkppbGluOkh1bmppYW5nIFNoaQorMTk6Q046Q0hOOkNISU5BOkppbGluOkppIEFuCisyMDpDTjpDSE46Q0hJTkE6SmlsaW46Smlhb2hlCisyMTpDTjpDSE46Q0hJTkE6SmlsaW46SmlsaW4gU2hpcXUKKzIyOkNOOkNITjpDSElOQTpKaWxpbjpKaW5neXUKKzIzOkNOOkNITjpDSElOQTpKaWxpbjpKaXV0YWkKKzI0OkNOOkNITjpDSElOQTpKaWxpbjpMaWFveXVhbiBTaGkKKzI1OkNOOkNITjpDSElOQTpKaWxpbjpMaXNodQorMjY6Q046Q0hOOkNISU5BOkppbGluOkxpdWhlCisyNzpDTjpDSE46Q0hJTkE6SmlsaW46Tm9uZyBBbgorMjg6Q046Q0hOOkNISU5BOkppbGluOlBhbnNoaQorMjk6Q046Q0hOOkNISU5BOkppbGluOlFpYW4gQW4KKzMwOkNOOkNITjpDSElOQTpKaWxpbjpRaWFuZ29ybG9zCiszMTpDTjpDSE46Q0hJTkE6SmlsaW46U2h1YW5nbGlhbworMzI6Q046Q0hOOkNISU5BOkppbGluOlNodWFuZ3lhbmcKKzMzOkNOOkNITjpDSElOQTpKaWxpbjpTaHVsYW4KKzM0OkNOOkNITjpDSElOQTpKaWxpbjpTaXBpbmcgU2hpCiszNTpDTjpDSE46Q0hJTkE6SmlsaW46VGFvYW4KKzM2OkNOOkNITjpDSElOQTpKaWxpbjpUb25naHVhCiszNzpDTjpDSE46Q0hJTkE6SmlsaW46VG9uZ2h1YSBTaGkKKzM4OkNOOkNITjpDSElOQTpKaWxpbjpUb25neXUKKzM5OkNOOkNITjpDSElOQTpKaWxpbjpUdW1lbiBTaGkKKzQwOkNOOkNITjpDSElOQTpKaWxpbjpXYW5ncWluZworNDE6Q046Q0hOOkNISU5BOkppbGluOllhbmppCis0MjpDTjpDSE46Q0hJTkE6SmlsaW46WWlhbmppIFNoaQorNDM6Q046Q0hOOkNISU5BOkppbGluOllpdG9uZworNDQ6Q046Q0hOOkNISU5BOkppbGluOllvbmdqaQorNDU6Q046Q0hOOkNISU5BOkppbGluOll1c2h1Cis0NjpDTjpDSE46Q0hJTkE6SmlsaW46WmhlbmxhaQorMTpDTjpDSE46Q0hJTkE6QW5odWk6QW5xaW5nIFNoaQorMjpDTjpDSE46Q0hJTkE6QW5odWk6QmVuZ2J1IFNoaQorMzpDTjpDSE46Q0hJTkE6QW5odWk6Qm94aWFuCis0OkNOOkNITjpDSElOQTpBbmh1aTpDaGFuZ2ZlbmcKKzU6Q046Q0hOOkNISU5BOkFuaHVpOkNoYW8gWGlhbgorNjpDTjpDSE46Q0hJTkE6QW5odWk6Q2h1eGlhbgorNzpDTjpDSE46Q0hJTkE6QW5odWk6RGFuZ3NoYW4KKzg6Q046Q0hOOkNISU5BOkFuaHVpOkRhbmd0dQorOTpDTjpDSE46Q0hJTkE6QW5odWk6RGluZ3l1YW4KKzEwOkNOOkNITjpDSElOQTpBbmh1aTpEb25nemhpCisxMTpDTjpDSE46Q0hJTkE6QW5odWk6RmFuY2hhbmcKKzEyOkNOOkNITjpDSElOQTpBbmh1aTpGZWlkb25nCisxMzpDTjpDSE46Q0hJTkE6QW5odWk6RmVpeGkKKzE0OkNOOkNITjpDSElOQTpBbmh1aTpGZW5ndGFpCisxNTpDTjpDSE46Q0hJTkE6QW5odWk6RmVuZ3lhbmcKKzE2OkNOOkNITjpDSElOQTpBbmh1aTpGdW5hbgorMTc6Q046Q0hOOkNISU5BOkFuaHVpOkZ1eWFuZworMTg6Q046Q0hOOkNISU5BOkFuaHVpOkZ1eWFuZyBTaGkKKzE5OkNOOkNITjpDSElOQTpBbmh1aTpHdWFuZ2RlCisyMDpDTjpDSE46Q0hJTkE6QW5odWk6R3VpY2hpCisyMTpDTjpDSE46Q0hJTkE6QW5odWk6R3VveWFuZworMjI6Q046Q0hOOkNISU5BOkFuaHVpOkd1emhlbgorMjM6Q046Q0hOOkNISU5BOkFuaHVpOkhhbnNoYW4KKzI0OkNOOkNITjpDSElOQTpBbmh1aTpIZSBYaWFuCisyNTpDTjpDSE46Q0hJTkE6QW5odWk6SGVmZWkgU2hpcXUKKzI2OkNOOkNITjpDSElOQTpBbmh1aTpIdWFpYmVpIFNoaXF1CisyNzpDTjpDSE46Q0hJTkE6QW5odWk6SHVhaW5hbiBTaGlxdQorMjg6Q046Q0hOOkNISU5BOkFuaHVpOkh1YWluaW5nCisyOTpDTjpDSE46Q0hJTkE6QW5odWk6SHVhaXl1YW4KKzMwOkNOOkNITjpDSElOQTpBbmh1aTpIdW9xaXUKKzMxOkNOOkNITjpDSElOQTpBbmh1aTpIdW9zaGFuCiszMjpDTjpDSE46Q0hJTkE6QW5odWk6Smlhc2hhbgorMzM6Q046Q0hOOkNISU5BOkFuaHVpOkppZXNob3UKKzM0OkNOOkNITjpDSElOQTpBbmh1aTpKaW5nIFhpYW4KKzM1OkNOOkNITjpDSElOQTpBbmh1aTpKaW5nZGUKKzM2OkNOOkNITjpDSElOQTpBbmh1aTpKaW56aGFpCiszNzpDTjpDSE46Q0hJTkE6QW5odWk6Sml4aQorMzg6Q046Q0hOOkNISU5BOkFuaHVpOkxhaWFuCiszOTpDTjpDSE46Q0hJTkE6QW5odWk6TGFuZ3hpCis0MDpDTjpDSE46Q0hJTkE6QW5odWk6TGluZ2JpCis0MTpDTjpDSE46Q0hJTkE6QW5odWk6TGlucXVhbgorNDI6Q046Q0hOOkNISU5BOkFuaHVpOkxpeGluCis0MzpDTjpDSE46Q0hJTkE6QW5odWk6THUgQW4KKzQ0OkNOOkNITjpDSElOQTpBbmh1aTpMdSBBbiBTaGkKKzQ1OkNOOkNITjpDSElOQTpBbmh1aTpMdWppYW5nCis0NjpDTjpDSE46Q0hJTkE6QW5odWk6TWFhbnNoYW4gU2hpCis0NzpDTjpDSE46Q0hJTkE6QW5odWk6TWVuZ2NoZW5nCis0ODpDTjpDSE46Q0hJTkE6QW5odWk6TmFubGluZworNDk6Q046Q0hOOkNISU5BOkFuaHVpOk5pbmdndW8KKzUwOkNOOkNITjpDSElOQTpBbmh1aTpRaWFuc2hhbgorNTE6Q046Q0hOOkNISU5BOkFuaHVpOlFpbWVuCis1MjpDTjpDSE46Q0hJTkE6QW5odWk6UWluZ3lhbmcKKzUzOkNOOkNITjpDSElOQTpBbmh1aTpRdWF1amlhbworNTQ6Q046Q0hOOkNISU5BOkFuaHVpOlNoZXhpYW4KKzU1OkNOOkNITjpDSElOQTpBbmh1aTpTaGl0YWkKKzU2OkNOOkNITjpDSElOQTpBbmh1aTpTaG91eGlhbgorNTc6Q046Q0hOOkNISU5BOkFuaHVpOlNodWNoZW5nCis1ODpDTjpDSE46Q0hJTkE6QW5odWk6U2l4aWFuCis1OTpDTjpDSE46Q0hJTkE6QW5odWk6U3VjaG91IFNoaQorNjA6Q046Q0hOOkNISU5BOkFuaHVpOlN1aXhpCis2MTpDTjpDSE46Q0hJTkE6QW5odWk6U3Vzb25nCis2MjpDTjpDSE46Q0hJTkE6QW5odWk6U3V4aWFuCis2MzpDTjpDSE46Q0hJTkE6QW5odWk6VGFpaGUKKzY0OkNOOkNITjpDSElOQTpBbmh1aTpUYWlodQorNjU6Q046Q0hOOkNISU5BOkFuaHVpOlRhaXBpbmcKKzY2OkNOOkNITjpDSElOQTpBbmh1aTpUaWFuY2hhbmcKKzY3OkNOOkNITjpDSElOQTpBbmh1aTpUb25nY2hlbmcKKzY4OkNOOkNITjpDSElOQTpBbmh1aTpUb25nbGluZworNjk6Q046Q0hOOkNISU5BOkFuaHVpOlRvbmdsaW5nIFNoaXF1Cis3MDpDTjpDSE46Q0hJTkE6QW5odWk6VHVueGkgU2hpCis3MTpDTjpDSE46Q0hJTkE6QW5odWk6V2FuZ2ppYW5nCis3MjpDTjpDSE46Q0hJTkE6QW5odWk6V3VoZQorNzM6Q046Q0hOOkNISU5BOkFuaHVpOld1aHUKKzc0OkNOOkNITjpDSElOQTpBbmh1aTpXdWh1IFNoaXF1Cis3NTpDTjpDSE46Q0hJTkE6QW5odWk6V3V3ZWkKKzc2OkNOOkNITjpDSElOQTpBbmh1aTpYaWFveGlhbgorNzc6Q046Q0hOOkNISU5BOkFuaHVpOlhpdW5pbmcKKzc4OkNOOkNITjpDSElOQTpBbmh1aTpYdWFuY2hlbmcKKzc5OkNOOkNITjpDSElOQTpBbmh1aTpZaW5nc2hhbmcKKzgwOkNOOkNITjpDSElOQTpBbmh1aTpZaXhpYW4KKzgxOkNOOkNITjpDSElOQTpBbmh1aTpZdWV4aQorODI6Q046Q0hOOkNISU5BOkFuaHVpOlpvbmd5YW5nCisxOkNOOkNITjpDSElOQTpUYWl3YW46R2FveGlvbmcKKzI6Q046Q0hOOkNISU5BOlRhaXdhbjpHYW94aW9uZyBTaGkKKzM6Q046Q0hOOkNISU5BOlRhaXdhbjpIdWFsaWEKKzQ6Q046Q0hOOkNISU5BOlRhaXdhbjpKaWF5aQorNTpDTjpDSE46Q0hJTkE6VGFpd2FuOkppbG9uZyBTaGkKKzY6Q046Q0hOOkNISU5BOlRhaXdhbjpNaWFvbGkKKzc6Q046Q0hOOkNISU5BOlRhaXdhbjpOYW50b3UKKzg6Q046Q0hOOkNISU5BOlRhaXdhbjpQZW5naHUKKzk6Q046Q0hOOkNISU5BOlRhaXdhbjpQaW5nZG9uZworMTA6Q046Q0hOOkNISU5BOlRhaXdhbjpSYW9waW5nCisxMTpDTjpDSE46Q0hJTkE6VGFpd2FuOlRhaWJlaQorMTI6Q046Q0hOOkNISU5BOlRhaXdhbjpUYWliZWkgU2hpCisxMzpDTjpDSE46Q0hJTkE6VGFpd2FuOlRhaWRvbmcKKzE0OkNOOkNITjpDSElOQTpUYWl3YW46VGFpbmFuCisxNTpDTjpDSE46Q0hJTkE6VGFpd2FuOlRhaW5hbiBTaGkKKzE2OkNOOkNITjpDSElOQTpUYWl3YW46VGFpemhvbmcKKzE3OkNOOkNITjpDSElOQTpUYWl3YW46VGFpemhvbmcgU2hpCisxODpDTjpDSE46Q0hJTkE6VGFpd2FuOlRhb3l1YW4KKzE5OkNOOkNITjpDSElOQTpUYWl3YW46WGluemh1CisyMDpDTjpDSE46Q0hJTkE6VGFpd2FuOllpbGFuCisyMTpDTjpDSE46Q0hJTkE6VGFpd2FuOll1bmxpbgorMjI6Q046Q0hOOkNISU5BOlRhaXdhbjpaaGFuZ2h1YQorMTpDTjpDSE46Q0hJTkE6U2ljaHVhbjpBYmEKKzI6Q046Q0hOOkNISU5BOlNpY2h1YW46QW4gWGlhbgorMzpDTjpDSE46Q0hJTkE6U2ljaHVhbjpBbnl1ZQorNDpDTjpDSE46Q0hJTkE6U2ljaHVhbjpCYWlzaGEKKzU6Q046Q0hOOkNISU5BOlNpY2h1YW46QmFpeXUKKzY6Q046Q0hOOkNISU5BOlNpY2h1YW46QmFveGluZworNzpDTjpDSE46Q0hJTkE6U2ljaHVhbjpCYXRhbmcKKzg6Q046Q0hOOkNISU5BOlNpY2h1YW46QmF6aG9uZworOTpDTjpDSE46Q0hJTkE6U2ljaHVhbjpCZWljaHVhbgorMTA6Q046Q0hOOkNISU5BOlNpY2h1YW46QnV0dW8KKzExOkNOOkNITjpDSElOQTpTaWNodWFuOkNhbmd4aQorMTI6Q046Q0hOOkNISU5BOlNpY2h1YW46Q2hhbmduaW5nCisxMzpDTjpDSE46Q0hJTkE6U2ljaHVhbjpDaGVuZ2R1IFNoaXF1CisxNDpDTjpDSE46Q0hJTkE6U2ljaHVhbjpDaG9uZ3FpbmcKKzE1OkNOOkNITjpDSElOQTpTaWNodWFuOkRhIFhpYW4KKzE2OkNOOkNITjpDSElOQTpTaWNodWFuOkRhbmJhCisxNzpDTjpDSE46Q0hJTkE6U2ljaHVhbjpEYW5sZW5nCisxODpDTjpDSE46Q0hJTkE6U2ljaHVhbjpEYW9jaGVuZworMTk6Q046Q0hOOkNISU5BOlNpY2h1YW46RGF3dQorMjA6Q046Q0hOOkNISU5BOlNpY2h1YW46RGF4aWFuIFNoaQorMjE6Q046Q0hOOkNISU5BOlNpY2h1YW46RGF5aQorMjI6Q046Q0hOOkNISU5BOlNpY2h1YW46RGF6aHUKKzIzOkNOOkNITjpDSElOQTpTaWNodWFuOkRlY2hhbmcKKzI0OkNOOkNITjpDSElOQTpTaWNodWFuOkRlZ2UKKzI1OkNOOkNITjpDSElOQTpTaWNodWFuOkRlcm9uZworMjY6Q046Q0hOOkNISU5BOlNpY2h1YW46RGV5YW5nCisyNzpDTjpDSE46Q0hJTkE6U2ljaHVhbjpEdWtvdSBTaGlxdQorMjg6Q046Q0hOOkNISU5BOlNpY2h1YW46RWJpYW4KKzI5OkNOOkNITjpDSElOQTpTaWNodWFuOkVtZWkKKzMwOkNOOkNITjpDSElOQTpTaWNodWFuOkZ1c2h1bgorMzE6Q046Q0hOOkNISU5BOlNpY2h1YW46R2FubHVvCiszMjpDTjpDSE46Q0hJTkE6U2ljaHVhbjpHYW8gWGlhbgorMzM6Q046Q0hOOkNISU5BOlNpY2h1YW46R2FyemUKKzM0OkNOOkNITjpDSElOQTpTaWNodWFuOkd1YW4gWGlhbgorMzU6Q046Q0hOOkNISU5BOlNpY2h1YW46R3VhbmcgQW4KKzM2OkNOOkNITjpDSElOQTpTaWNodWFuOkd1YW5naGFuCiszNzpDTjpDSE46Q0hJTkE6U2ljaHVhbjpHdWFuZ3l1YW4KKzM4OkNOOkNITjpDSElOQTpTaWNodWFuOkd1bGluCiszOTpDTjpDSE46Q0hJTkE6U2ljaHVhbjpIYW55dWFuCis0MDpDTjpDSE46Q0hJTkE6U2ljaHVhbjpIZWlzaHVpCis0MTpDTjpDSE46Q0hJTkE6U2ljaHVhbjpIZWppYW5nCis0MjpDTjpDSE46Q0hJTkE6U2ljaHVhbjpIb25neWEKKzQzOkNOOkNITjpDSElOQTpTaWNodWFuOkhvbmd5dWFuCis0NDpDTjpDSE46Q0hJTkE6U2ljaHVhbjpIdWF5dW4KKzQ1OkNOOkNITjpDSElOQTpTaWNodWFuOkh1aWRvbmcKKzQ2OkNOOkNITjpDSElOQTpTaWNodWFuOkh1aWxpCis0NzpDTjpDSE46Q0hJTkE6U2ljaHVhbjpKaWFqaWFuZworNDg6Q046Q0hOOkNISU5BOlNpY2h1YW46SmlhbmcgQW4KKzQ5OkNOOkNITjpDSElOQTpTaWNodWFuOkppYW5nZQorNTA6Q046Q0hOOkNISU5BOlNpY2h1YW46Smlhbmd5b3UKKzUxOkNOOkNITjpDSElOQTpTaWNodWFuOkppYW55YW5nCis1MjpDTjpDSE46Q0hJTkE6U2ljaHVhbjpKaW5jaHVhbgorNTM6Q046Q0hOOkNISU5BOlNpY2h1YW46SmludGFuZworNTQ6Q046Q0hOOkNISU5BOlNpY2h1YW46SmlueWFuCis1NTpDTjpDSE46Q0hJTkE6U2ljaHVhbjpKaW55YW5nCis1NjpDTjpDSE46Q0hJTkE6U2ljaHVhbjpKaXVsb25nCis1NzpDTjpDSE46Q0hJTkE6U2ljaHVhbjpKdW5saWFuCis1ODpDTjpDSE46Q0hJTkE6U2ljaHVhbjpLYWlqaWFuZworNTk6Q046Q0hOOkNISU5BOlNpY2h1YW46S2FuZ2RpbmcKKzYwOkNOOkNITjpDSElOQTpTaWNodWFuOkxhbmd6aG9uZworNjE6Q046Q0hOOkNISU5BOlNpY2h1YW46TGVpYm8KKzYyOkNOOkNITjpDSElOQTpTaWNodWFuOkxlc2hhbiBTaGkKKzYzOkNOOkNITjpDSElOQTpTaWNodWFuOkxlemhpCis2NDpDTjpDSE46Q0hJTkE6U2ljaHVhbjpMaSBYaWFuCis2NTpDTjpDSE46Q0hJTkE6U2ljaHVhbjpMaW5zaHVpCis2NjpDTjpDSE46Q0hJTkE6U2ljaHVhbjpMaXRhbmcKKzY3OkNOOkNITjpDSElOQTpTaWNodWFuOkxvbmdjaGFuZworNjg6Q046Q0hOOkNISU5BOlNpY2h1YW46THUgWGlhbgorNjk6Q046Q0hOOkNISU5BOlNpY2h1YW46THVkaW5nCis3MDpDTjpDSE46Q0hJTkE6U2ljaHVhbjpMdWh1bworNzE6Q046Q0hOOkNISU5BOlNpY2h1YW46THVzaGFuCis3MjpDTjpDSE46Q0hJTkE6U2ljaHVhbjpMdXpob3UgU2hpCis3MzpDTjpDSE46Q0hJTkE6U2ljaHVhbjpNYWJpYW4KKzc0OkNOOkNITjpDSElOQTpTaWNodWFuOk1hb3dlbgorNzU6Q046Q0hOOkNISU5BOlNpY2h1YW46TWFya2FtCis3NjpDTjpDSE46Q0hJTkE6U2ljaHVhbjpNZWlndQorNzc6Q046Q0hOOkNISU5BOlNpY2h1YW46TWVpc2hhbgorNzg6Q046Q0hOOkNISU5BOlNpY2h1YW46TWlhbm5pbmcKKzc5OkNOOkNITjpDSElOQTpTaWNodWFuOk1pYW55YW5nIFNoaQorODA6Q046Q0hOOkNISU5BOlNpY2h1YW46TWlhbnpodQorODE6Q046Q0hOOkNISU5BOlNpY2h1YW46TWluZ3NoYW4KKzgyOkNOOkNITjpDSElOQTpTaWNodWFuOk1peWkKKzgzOkNOOkNITjpDSElOQTpTaWNodWFuOk11Y2h1YW4KKzg0OkNOOkNITjpDSElOQTpTaWNodWFuOk11bGkKKzg1OkNOOkNITjpDSElOQTpTaWNodWFuOk5hbmJ1Cis4NjpDTjpDSE46Q0hJTkE6U2ljaHVhbjpOYW5jaG9uZworODc6Q046Q0hOOkNISU5BOlNpY2h1YW46TmFuY2hvbmcgU2hpCis4ODpDTjpDSE46Q0hJTkE6U2ljaHVhbjpOYW5qaWFuZworODk6Q046Q0hOOkNISU5BOlNpY2h1YW46TmFucGluZworOTA6Q046Q0hOOkNISU5BOlNpY2h1YW46TmFueGkKKzkxOkNOOkNITjpDSElOQTpTaWNodWFuOk5heGkKKzkyOkNOOkNITjpDSElOQTpTaWNodWFuOk5laWppYW5nCis5MzpDTjpDSE46Q0hJTkE6U2ljaHVhbjpOaW5nbmFuCis5NDpDTjpDSE46Q0hJTkE6U2ljaHVhbjpQZW5nIEFuCis5NTpDTjpDSE46Q0hJTkE6U2ljaHVhbjpQZW5nIFhpYW4KKzk2OkNOOkNITjpDSElOQTpTaWNodWFuOlBlbmdzaGFuCis5NzpDTjpDSE46Q0hJTkE6U2ljaHVhbjpQZW5neGkKKzk4OkNOOkNITjpDSElOQTpTaWNodWFuOlBpIFhpYW4KKzk5OkNOOkNITjpDSElOQTpTaWNodWFuOlBpbmdjaGFuZworMTAwOkNOOkNITjpDSElOQTpTaWNodWFuOlBpbmdzaGFuCisxMDE6Q046Q0hOOkNISU5BOlNpY2h1YW46UGluZ3d1CisxMDI6Q046Q0hOOkNISU5BOlNpY2h1YW46UHVnZQorMTAzOkNOOkNITjpDSElOQTpTaWNodWFuOlB1amlhbmcKKzEwNDpDTjpDSE46Q0hJTkE6U2ljaHVhbjpRaWFud2VpCisxMDU6Q046Q0hOOkNISU5BOlNpY2h1YW46UWluZ2NodWFuCisxMDY6Q046Q0hOOkNISU5BOlNpY2h1YW46UWluZ3NoZW4KKzEwNzpDTjpDSE46Q0hJTkE6U2ljaHVhbjpRaW9uZ2xhaQorMTA4OkNOOkNITjpDSElOQTpTaWNodWFuOlF1IFhpYW4KKzEwOTpDTjpDSE46Q0hJTkE6U2ljaHVhbjpSZW5zaG91CisxMTA6Q046Q0hOOkNISU5BOlNpY2h1YW46Um9uZyBYaWFuCisxMTE6Q046Q0hOOkNISU5BOlNpY2h1YW46U2FudGFpCisxMTI6Q046Q0hOOkNISU5BOlNpY2h1YW46U2VydGFyCisxMTM6Q046Q0hOOkNISU5BOlNpY2h1YW46U2VyeHUKKzExNDpDTjpDSE46Q0hJTkE6U2ljaHVhbjpTaGVob25nCisxMTU6Q046Q0hOOkNISU5BOlNpY2h1YW46U2hpZmFuZworMTE2OkNOOkNITjpDSElOQTpTaWNodWFuOlNoaW1pYW4KKzExNzpDTjpDSE46Q0hJTkE6U2ljaHVhbjpTaHVhbmdsaXUKKzExODpDTjpDSE46Q0hJTkE6U2ljaHVhbjpTb25ncGFuCisxMTk6Q046Q0hOOkNISU5BOlNpY2h1YW46U3VpbmluZworMTIwOkNOOkNITjpDSElOQTpTaWNodWFuOlRpYW5xdWFuCisxMjE6Q046Q0hOOkNISU5BOlNpY2h1YW46VG9uZ2ppYW5nCisxMjI6Q046Q0hOOkNISU5BOlNpY2h1YW46V2FuZ2NhbmcKKzEyMzpDTjpDSE46Q0hJTkE6U2ljaHVhbjpXYW55dWFuCisxMjQ6Q046Q0hOOkNISU5BOlNpY2h1YW46V2VpeXVhbgorMTI1OkNOOkNITjpDSElOQTpTaWNodWFuOldlbmNodWFuCisxMjY6Q046Q0hOOkNISU5BOlNpY2h1YW46V2VuamlhbmcKKzEyNzpDTjpDSE46Q0hJTkE6U2ljaHVhbjpXdXNoZW5nCisxMjg6Q046Q0hOOkNISU5BOlNpY2h1YW46WGlhbmdjaGVuZworMTI5OkNOOkNITjpDSElOQTpTaWNodWFuOlhpYW9qaW4KKzEzMDpDTjpDSE46Q0hJTkE6U2ljaHVhbjpYaWNoYW5nCisxMzE6Q046Q0hOOkNISU5BOlNpY2h1YW46WGljaGFuZyBTaGkKKzEzMjpDTjpDSE46Q0hJTkE6U2ljaHVhbjpYaWNob25nCisxMzM6Q046Q0hOOkNISU5BOlNpY2h1YW46WGlkZQorMTM0OkNOOkNITjpDSElOQTpTaWNodWFuOlhpbmR1CisxMzU6Q046Q0hOOkNISU5BOlNpY2h1YW46WGluZ3dlbgorMTM2OkNOOkNITjpDSElOQTpTaWNodWFuOlhpbmppbgorMTM3OkNOOkNITjpDSElOQTpTaWNodWFuOlhpbmxvbmcKKzEzODpDTjpDSE46Q0hJTkE6U2ljaHVhbjpYdWFuaGFuCisxMzk6Q046Q0hOOkNISU5BOlNpY2h1YW46WHV5b25nCisxNDA6Q046Q0hOOkNISU5BOlNpY2h1YW46WWEgQW4KKzE0MTpDTjpDSE46Q0hJTkE6U2ljaHVhbjpZYWppYW5nCisxNDI6Q046Q0hOOkNISU5BOlNpY2h1YW46WWFuYmlhbgorMTQzOkNOOkNITjpDSElOQTpTaWNodWFuOllhbnRpbmcKKzE0NDpDTjpDSE46Q0hJTkE6U2ljaHVhbjpZYW55dWFuCisxNDU6Q046Q0hOOkNISU5BOlNpY2h1YW46WWliaW4KKzE0NjpDTjpDSE46Q0hJTkE6U2ljaHVhbjpZaWJpbiBTaGkKKzE0NzpDTjpDSE46Q0hJTkE6U2ljaHVhbjpZaWxvbmcKKzE0ODpDTjpDSE46Q0hJTkE6U2ljaHVhbjpZaW5namluZworMTQ5OkNOOkNITjpDSElOQTpTaWNodWFuOllpbmdzaGFuCisxNTA6Q046Q0hOOkNISU5BOlNpY2h1YW46WXVlY2hpCisxNTE6Q046Q0hOOkNISU5BOlNpY2h1YW46WXVleGkKKzE1MjpDTjpDSE46Q0hJTkE6U2ljaHVhbjpaYW10YW5nCisxNTM6Q046Q0hOOkNISU5BOlNpY2h1YW46Wmhhb2p1ZQorMTU0OkNOOkNITjpDSElOQTpTaWNodWFuOlpob25namlhbmcKKzE1NTpDTjpDSE46Q0hJTkE6U2ljaHVhbjpaaWdvbmcgU2hpcXUKKzE1NjpDTjpDSE46Q0hJTkE6U2ljaHVhbjpaaXRvbmcKKzE1NzpDTjpDSE46Q0hJTkE6U2ljaHVhbjpaaXlhbmcKKzE1ODpDTjpDSE46Q0hJTkE6U2ljaHVhbjpaaXpob25nCisxNTk6Q046Q0hOOkNISU5BOlNpY2h1YW46Wm9pZ2UKKzE6Q046Q0hOOkNISU5BOktvd2xvb24gYW5kIE5ldyBLb3dsb29uOkNITi5MMi4zCisyOkNOOkNITjpDSElOQTpLb3dsb29uIGFuZCBOZXcgS293bG9vbjpDSE4uTDIuNAorMTpDTjpDSE46Q0hJTkE6SGViZWk6QW5jaQorMjpDTjpDSE46Q0hJTkE6SGViZWk6QW5nb3UKKzM6Q046Q0hOOkNISU5BOkhlYmVpOkFucGluZworNDpDTjpDSE46Q0hJTkE6SGViZWk6QW54aW4KKzU6Q046Q0hOOkNISU5BOkhlYmVpOkJhIFhpYW4KKzY6Q046Q0hOOkNISU5BOkhlYmVpOkJhaXhpYW5nCis3OkNOOkNITjpDSElOQTpIZWJlaTpCYW9kaW5nIFNoaQorODpDTjpDSE46Q0hJTkE6SGViZWk6Qm95ZQorOTpDTjpDSE46Q0hJTkE6SGViZWk6Q2FuZyBYaWFuCisxMDpDTjpDSE46Q0hJTkE6SGViZWk6Q2FuZ3pob3UKKzExOkNOOkNITjpDSElOQTpIZWJlaTpDaGFuZ2xpCisxMjpDTjpDSE46Q0hJTkE6SGViZWk6Q2hlbmcgQW4KKzEzOkNOOkNITjpDSElOQTpIZWJlaTpDaGVuZ2RlCisxNDpDTjpDSE46Q0hJTkE6SGViZWk6Q2hlbmdkZSBTaGkKKzE1OkNOOkNITjpDSElOQTpIZWJlaTpDaGljaGVuZworMTY6Q046Q0hOOkNISU5BOkhlYmVpOkNob25nbGkKKzE3OkNOOkNITjpDSElOQTpIZWJlaTpDaSBYaWFuCisxODpDTjpDSE46Q0hJTkE6SGViZWk6RGFjaGFuZyBIdWkgQWMKKzE5OkNOOkNITjpDSElOQTpIZWJlaTpEYWNoZW5nCisyMDpDTjpDSE46Q0hJTkE6SGViZWk6RGFtaW5nCisyMTpDTjpDSE46Q0hJTkE6SGViZWk6RGluZyBYaWFuCisyMjpDTjpDSE46Q0hJTkE6SGViZWk6RGluZ3hpbmcKKzIzOkNOOkNITjpDSElOQTpIZWJlaTpEb25nZ3VhbmcKKzI0OkNOOkNITjpDSElOQTpIZWJlaTpGZWl4aWFuZworMjU6Q046Q0hOOkNISU5BOkhlYmVpOkZlbmduYW4KKzI2OkNOOkNITjpDSElOQTpIZWJlaTpGZW5nbmluZworMjc6Q046Q0hOOkNISU5BOkhlYmVpOkZlbmdydW4KKzI4OkNOOkNITjpDSElOQTpIZWJlaTpGdWNoZW5nCisyOTpDTjpDSE46Q0hJTkE6SGViZWk6RnVuaW5nCiszMDpDTjpDSE46Q0hJTkE6SGViZWk6RnVwaW5nCiszMTpDTjpDSE46Q0hJTkE6SGViZWk6R2FvY2hlbmcKKzMyOkNOOkNITjpDSElOQTpIZWJlaTpHYW95YW5nCiszMzpDTjpDSE46Q0hJTkE6SGViZWk6R2FveWkKKzM0OkNOOkNITjpDSElOQTpIZWJlaTpHdSBBbgorMzU6Q046Q0hOOkNISU5BOkhlYmVpOkd1YW5ncGluZworMzY6Q046Q0hOOkNISU5BOkhlYmVpOkd1YW50YW8KKzM3OkNOOkNITjpDSElOQTpIZWJlaTpHdWFuem9uZworMzg6Q046Q0hOOkNISU5BOkhlYmVpOkd1Y2hlbmcKKzM5OkNOOkNITjpDSElOQTpIZWJlaTpHdXl1YW4KKzQwOkNOOkNITjpDSElOQTpIZWJlaTpIYWl4aW5nCis0MTpDTjpDSE46Q0hJTkE6SGViZWk6SGFuZGFuCis0MjpDTjpDSE46Q0hJTkE6SGViZWk6SGFuZGFuIFNoaQorNDM6Q046Q0hOOkNISU5BOkhlYmVpOkhlamlhbgorNDQ6Q046Q0hOOkNISU5BOkhlYmVpOkhlbmdzaHVpCis0NTpDTjpDSE46Q0hJTkE6SGViZWk6SGVuZ3NodWkgU2hpCis0NjpDTjpDSE46Q0hJTkE6SGViZWk6SHVhaWFuCis0NzpDTjpDSE46Q0hJTkE6SGViZWk6SHVhaWxhaQorNDg6Q046Q0hOOkNISU5BOkhlYmVpOkh1YW5naHVhCis0OTpDTjpDSE46Q0hJTkE6SGViZWk6SHVlbHUKKzUwOkNOOkNITjpDSElOQTpIZWJlaTpKaSBYaWFuCis1MTpDTjpDSE46Q0hJTkE6SGViZWk6Smlhb2hlCis1MjpDTjpDSE46Q0hJTkE6SGViZWk6SmluZyBYaWFuCis1MzpDTjpDSE46Q0hJTkE6SGViZWk6SmluZ3hpbmcKKzU0OkNOOkNITjpDSElOQTpIZWJlaTpKaXplCis1NTpDTjpDSE46Q0hJTkE6SGViZWk6SnVsdQorNTY6Q046Q0hOOkNISU5BOkhlYmVpOkthbmdiYW8KKzU3OkNOOkNITjpDSElOQTpIZWJlaTpLdWFuY2hlbmcKKzU4OkNOOkNITjpDSElOQTpIZWJlaTpMYWlzaHVpCis1OTpDTjpDSE46Q0hJTkE6SGViZWk6TGFpeXVhbgorNjA6Q046Q0hOOkNISU5BOkhlYmVpOkxldGluZworNjE6Q046Q0hOOkNISU5BOkhlYmVpOkxpIFhpYW4KKzYyOkNOOkNITjpDSElOQTpIZWJlaTpMaW5jaGVuZworNjM6Q046Q0hOOkNISU5BOkhlYmVpOkxpbmdzaG91Cis2NDpDTjpDSE46Q0hJTkE6SGViZWk6TGlueGkKKzY1OkNOOkNITjpDSElOQTpIZWJlaTpMaW56aGFuZworNjY6Q046Q0hOOkNISU5BOkhlYmVpOkxvbmdmYW5nIFNoaQorNjc6Q046Q0hOOkNISU5BOkhlYmVpOkxvbmdodWEKKzY4OkNOOkNITjpDSElOQTpIZWJlaTpMb25neWFvCis2OTpDTjpDSE46Q0hJTkE6SGViZWk6THVhbiBYaWFuCis3MDpDTjpDSE46Q0hJTkE6SGViZWk6THVhbmNoZW5nCis3MTpDTjpDSE46Q0hJTkE6SGViZWk6THVhbm5hbgorNzI6Q046Q0hOOkNISU5BOkhlYmVpOkx1YW5waW5nCis3MzpDTjpDSE46Q0hJTkE6SGViZWk6THVsb25nIFhpYW4KKzc0OkNOOkNITjpDSElOQTpIZWJlaTpNYW5jaGVuZworNzU6Q046Q0hOOkNISU5BOkhlYmVpOk1lbmdjdW4gSHVpIEFjCis3NjpDTjpDSE46Q0hJTkE6SGViZWk6TmFuZ29uZworNzc6Q046Q0hOOkNISU5BOkhlYmVpOk5hbmhlCis3ODpDTjpDSE46Q0hJTkE6SGViZWk6TmFucGkKKzc5OkNOOkNITjpDSElOQTpIZWJlaTpOZWlxaXUKKzgwOkNOOkNITjpDSElOQTpIZWJlaTpOaW5namluCis4MTpDTjpDSE46Q0hJTkE6SGViZWk6UGluZ3F1YW4KKzgyOkNOOkNITjpDSElOQTpIZWJlaTpQaW5nc2hhbgorODM6Q046Q0hOOkNISU5BOkhlYmVpOlBpbmd4aWFuZworODQ6Q046Q0hOOkNISU5BOkhlYmVpOlFpYW4gQW4KKzg1OkNOOkNITjpDSElOQTpIZWJlaTpRaWFueGkKKzg2OkNOOkNITjpDSElOQTpIZWJlaTpRaW5nIFhpYW4KKzg3OkNOOkNITjpDSElOQTpIZWJlaTpRaW5nIFl1YW4KKzg4OkNOOkNITjpDSElOQTpIZWJlaTpRaW5naGUKKzg5OkNOOkNITjpDSElOQTpIZWJlaTpRaW5nbG9uZworOTA6Q046Q0hOOkNISU5BOkhlYmVpOlFpbmh1YW5nZGFvIFNoaQorOTE6Q046Q0hOOkNISU5BOkhlYmVpOlFpdSBYaWFuCis5MjpDTjpDSE46Q0hJTkE6SGViZWk6UXV5YW5nCis5MzpDTjpDSE46Q0hJTkE6SGViZWk6UXV6aG91Cis5NDpDTjpDSE46Q0hJTkE6SGViZWk6UmFveWFuZworOTU6Q046Q0hOOkNISU5BOkhlYmVpOlJlbiBYaWFuCis5NjpDTjpDSE46Q0hJTkE6SGViZWk6UmVucWl1Cis5NzpDTjpDSE46Q0hJTkE6SGViZWk6Um9uZ2NoZW5nCis5ODpDTjpDSE46Q0hJTkE6SGViZWk6U2FuaGUKKzk5OkNOOkNITjpDSElOQTpIZWJlaTpTaGFoZQorMTAwOkNOOkNITjpDSElOQTpIZWJlaTpTaGFuZ3lpCisxMDE6Q046Q0hOOkNISU5BOkhlYmVpOlNoZSBYaWFuCisxMDI6Q046Q0hOOkNISU5BOkhlYmVpOlNoZW4gWGlhbgorMTAzOkNOOkNITjpDSElOQTpIZWJlaTpTaGVuemUKKzEwNDpDTjpDSE46Q0hJTkE6SGViZWk6U2hpamlhemh1YW5nIFNoaQorMTA1OkNOOkNITjpDSElOQTpIZWJlaTpTaHVsdQorMTA2OkNOOkNITjpDSElOQTpIZWJlaTpTdW5pbmcKKzEwNzpDTjpDSE46Q0hJTkE6SGViZWk6VGFuZyBYaWFuCisxMDg6Q046Q0hOOkNISU5BOkhlYmVpOlRhbmdzaGFuIFNoaQorMTA5OkNOOkNITjpDSElOQTpIZWJlaTpXYW4gWGlhbgorMTEwOkNOOkNITjpDSElOQTpIZWJlaTpXYW5nZHUKKzExMTpDTjpDSE46Q0hJTkE6SGViZWk6V2FucXVhbgorMTEyOkNOOkNITjpDSElOQTpIZWJlaTpXZWkgWGlhbgorMTEzOkNOOkNITjpDSElOQTpIZWJlaTpXZWljaGFuZworMTE0OkNOOkNITjpDSElOQTpIZWJlaTpXZW4gQW4KKzExNTpDTjpDSE46Q0hJTkE6SGViZWk6V3UgQW4KKzExNjpDTjpDSE46Q0hJTkE6SGViZWk6V3VqaQorMTE3OkNOOkNITjpDSElOQTpIZWJlaTpXdXFpYW5nCisxMTg6Q046Q0hOOkNISU5BOkhlYmVpOld1cWlhbworMTE5OkNOOkNITjpDSElOQTpIZWJlaTpXdXlpCisxMjA6Q046Q0hOOkNISU5BOkhlYmVpOlhpYW4gWGlhbgorMTIxOkNOOkNITjpDSElOQTpIZWJlaTpYaWFuZ2hlCisxMjI6Q046Q0hOOkNISU5BOkhlYmVpOlhpbmNoZW5nCisxMjM6Q046Q0hOOkNISU5BOkhlYmVpOlhpbmdsb25nCisxMjQ6Q046Q0hOOkNISU5BOkhlYmVpOlhpbmd0YWkKKzEyNTpDTjpDSE46Q0hJTkE6SGViZWk6WGluZ3RhaSBTaGkKKzEyNjpDTjpDSE46Q0hJTkE6SGViZWk6WGluZ3RhbmcKKzEyNzpDTjpDSE46Q0hJTkE6SGViZWk6WGluaGUKKzEyODpDTjpDSE46Q0hJTkE6SGViZWk6WGlubGUKKzEyOTpDTjpDSE46Q0hJTkE6SGViZWk6WGlvbmcgWGlhbgorMTMwOkNOOkNITjpDSElOQTpIZWJlaTpYdWFuaHVhCisxMzE6Q046Q0hOOkNISU5BOkhlYmVpOlh1c2h1aQorMTMyOkNOOkNITjpDSElOQTpIZWJlaTpZYW5neXVhbgorMTMzOkNOOkNITjpDSElOQTpIZWJlaTpZYW5zaGFuCisxMzQ6Q046Q0hOOkNISU5BOkhlYmVpOllpIFhpYW4KKzEzNTpDTjpDSE46Q0hJTkE6SGViZWk6WW9uZ25pYW4KKzEzNjpDTjpDSE46Q0hJTkE6SGViZWk6WW9uZ3FpbmcKKzEzNzpDTjpDSE46Q0hJTkE6SGViZWk6WXUgWGlhbgorMTM4OkNOOkNITjpDSElOQTpIZWJlaTpZdWFuc2hpCisxMzk6Q046Q0hOOkNISU5BOkhlYmVpOll1dGlhbgorMTQwOkNOOkNITjpDSElOQTpIZWJlaTpaYW5odWFuZworMTQxOkNOOkNITjpDSElOQTpIZWJlaTpaYW9xaWFuZworMTQyOkNOOkNITjpDSElOQTpIZWJlaTpaaGFuZ2JlaQorMTQzOkNOOkNITjpDSElOQTpIZWJlaTpaaGFuZ2ppYWtvdSBTaGkKKzE0NDpDTjpDSE46Q0hJTkE6SGViZWk6WmhhbyBYaWFuCisxNDU6Q046Q0hOOkNISU5BOkhlYmVpOlpoZW5nZGluZworMTQ2OkNOOkNITjpDSElOQTpIZWJlaTpaaHVvIFhpYW4KKzE0NzpDTjpDSE46Q0hJTkE6SGViZWk6Wmh1b2x1CisxNDg6Q046Q0hOOkNISU5BOkhlYmVpOlp1bmh1YQorMTpDTjpDSE46Q0hJTkE6RnVqaWFuOkFueGkKKzI6Q046Q0hOOkNISU5BOkZ1amlhbjpDaGFuZ2xlCiszOkNOOkNITjpDSElOQTpGdWppYW46Q2hhbmd0YWkKKzQ6Q046Q0hOOkNISU5BOkZ1amlhbjpDaGFuZ3RpbmcKKzU6Q046Q0hOOkNISU5BOkZ1amlhbjpDaG9uZ2FuCis2OkNOOkNITjpDSElOQTpGdWppYW46RGF0aWFuCis3OkNOOkNITjpDSElOQTpGdWppYW46RGVodWEKKzg6Q046Q0hOOkNISU5BOkZ1amlhbjpEb25nc2hhbgorOTpDTjpDSE46Q0hJTkE6RnVqaWFuOkZ1YW4KKzEwOkNOOkNITjpDSElOQTpGdWppYW46RnVkaW5nCisxMTpDTjpDSE46Q0hJTkE6RnVqaWFuOkZ1cWluZworMTI6Q046Q0hOOkNISU5BOkZ1amlhbjpGdXpob3UgU2hpcXUKKzEzOkNOOkNITjpDSElOQTpGdWppYW46R3Vhbmd6ZQorMTQ6Q046Q0hOOkNISU5BOkZ1amlhbjpHdXRpYW4KKzE1OkNOOkNITjpDSElOQTpGdWppYW46SHVhYW4KKzE2OkNOOkNITjpDSElOQTpGdWppYW46SHVpYW4KKzE3OkNOOkNITjpDSElOQTpGdWppYW46SmlhbmdsZQorMTg6Q046Q0hOOkNISU5BOkZ1amlhbjpKaWFuZ3lhbmcKKzE5OkNOOkNITjpDSElOQTpGdWppYW46Smlhbm5pbmcKKzIwOkNOOkNITjpDSElOQTpGdWppYW46Smlhbm91CisyMTpDTjpDSE46Q0hJTkE6RnVqaWFuOkppbmppYW5nCisyMjpDTjpDSE46Q0hJTkE6RnVqaWFuOkppbm1lbgorMjM6Q046Q0hOOkNISU5BOkZ1amlhbjpMaWFuY2hlbmcKKzI0OkNOOkNITjpDSElOQTpGdWppYW46TGlhbmppYW5nCisyNTpDTjpDSE46Q0hJTkE6RnVqaWFuOkxvbmdoYWkKKzI2OkNOOkNITjpDSElOQTpGdWppYW46TG9uZ3lhbiBTaGkKKzI3OkNOOkNITjpDSElOQTpGdWppYW46THVveXVhbgorMjg6Q046Q0hOOkNISU5BOkZ1amlhbjpNaW5ncWluZworMjk6Q046Q0hOOkNISU5BOkZ1amlhbjpNaW5neGkKKzMwOkNOOkNITjpDSElOQTpGdWppYW46TWluaG91CiszMTpDTjpDSE46Q0hJTkE6RnVqaWFuOk5hbmFuCiszMjpDTjpDSE46Q0hJTkE6RnVqaWFuOk5hbmppbmcKKzMzOkNOOkNITjpDSElOQTpGdWppYW46TmFucGluZyBTaGkKKzM0OkNOOkNITjpDSElOQTpGdWppYW46TmluZ2RlCiszNTpDTjpDSE46Q0hJTkE6RnVqaWFuOk5pbmdodWEKKzM2OkNOOkNITjpDSElOQTpGdWppYW46UGluZ2hlCiszNzpDTjpDSE46Q0hJTkE6RnVqaWFuOlBpbmduYW4KKzM4OkNOOkNITjpDSElOQTpGdWppYW46UGluZ3RhbgorMzk6Q046Q0hOOkNISU5BOkZ1amlhbjpQdWNoZW5nCis0MDpDTjpDSE46Q0hJTkE6RnVqaWFuOlB1dGlhbgorNDE6Q046Q0hOOkNISU5BOkZ1amlhbjpRaW5nbGl1Cis0MjpDTjpDSE46Q0hJTkE6RnVqaWFuOlF1YW56aG91IFNoaQorNDM6Q046Q0hOOkNISU5BOkZ1amlhbjpTaGEgWGlhbgorNDQ6Q046Q0hOOkNISU5BOkZ1amlhbjpTaGFuZ2hhbmcKKzQ1OkNOOkNITjpDSElOQTpGdWppYW46U2hhbm1pbmcgU2hpCis0NjpDTjpDSE46Q0hJTkE6RnVqaWFuOlNoYW93dQorNDc6Q046Q0hOOkNISU5BOkZ1amlhbjpTaG91bmluZworNDg6Q046Q0hOOkNISU5BOkZ1amlhbjpTaHVuY2hhbmcKKzQ5OkNOOkNITjpDSElOQTpGdWppYW46U29uZ3hpCis1MDpDTjpDSE46Q0hJTkE6RnVqaWFuOlRhaW5pbmcKKzUxOkNOOkNITjpDSElOQTpGdWppYW46VG9uZ2FuCis1MjpDTjpDSE46Q0hJTkE6RnVqaWFuOld1cGluZworNTM6Q046Q0hOOkNISU5BOkZ1amlhbjpYaWFtZW4gU2hpcXUKKzU0OkNOOkNITjpDSElOQTpGdWppYW46WGlhbnlvdQorNTU6Q046Q0hOOkNISU5BOkZ1amlhbjpYaWFwdQorNTY6Q046Q0hOOkNISU5BOkZ1amlhbjpZb25nYW4KKzU3OkNOOkNITjpDSElOQTpGdWppYW46WW9uZ2NodW4KKzU4OkNOOkNITjpDSElOQTpGdWppYW46WW9uZ2RpbmcKKzU5OkNOOkNITjpDSElOQTpGdWppYW46WW9uZ3RhaQorNjA6Q046Q0hOOkNISU5BOkZ1amlhbjpZb3V4aQorNjE6Q046Q0hOOkNISU5BOkZ1amlhbjpZdW54aWFvCis2MjpDTjpDSE46Q0hJTkE6RnVqaWFuOlpoYW5ncGluZworNjM6Q046Q0hOOkNISU5BOkZ1amlhbjpaaGFuZ3B1Cis2NDpDTjpDSE46Q0hJTkE6RnVqaWFuOlpoYW5nemhvdSBTaGkKKzY1OkNOOkNITjpDSElOQTpGdWppYW46Wmhhb2FuCis2NjpDTjpDSE46Q0hJTkE6RnVqaWFuOlpoZW5naGUKKzY3OkNOOkNITjpDSElOQTpGdWppYW46Wmhlcm9uZworNjg6Q046Q0hOOkNISU5BOkZ1amlhbjpaaG91bmluZworMTpDTjpDSE46Q0hJTkE6SmlhbmdzdTpCYW95aW5nCisyOkNOOkNITjpDSElOQTpKaWFuZ3N1OkJpbmhhaQorMzpDTjpDSE46Q0hJTkE6SmlhbmdzdTpDaGFuZ3NodQorNDpDTjpDSE46Q0hJTkE6SmlhbmdzdTpDaGFuZ3pob3UgU2hpCis1OkNOOkNITjpDSElOQTpKaWFuZ3N1OkRhaWZlbmcKKzY6Q046Q0hOOkNISU5BOkppYW5nc3U6RGFudHUKKzc6Q046Q0hOOkNISU5BOkppYW5nc3U6RGFueWFuZworODpDTjpDSE46Q0hJTkE6SmlhbmdzdTpEb25naGFpCis5OkNOOkNITjpDSElOQTpKaWFuZ3N1OkRvbmd0YWkKKzEwOkNOOkNITjpDSElOQTpKaWFuZ3N1OkZlbmd4aWFuCisxMTpDTjpDSE46Q0hJTkE6SmlhbmdzdTpGdW5pbmcKKzEyOkNOOkNITjpDSElOQTpKaWFuZ3N1Okdhbnl1CisxMzpDTjpDSE46Q0hJTkE6SmlhbmdzdTpHYW9jaHVuCisxNDpDTjpDSE46Q0hJTkE6SmlhbmdzdTpHYW95aXUKKzE1OkNOOkNITjpDSElOQTpKaWFuZ3N1Okd1YW5uYW4KKzE2OkNOOkNITjpDSElOQTpKaWFuZ3N1Okd1YW55dW4KKzE3OkNOOkNITjpDSElOQTpKaWFuZ3N1OkhhaWFuCisxODpDTjpDSE46Q0hJTkE6SmlhbmdzdTpIYWltZW4KKzE5OkNOOkNITjpDSElOQTpKaWFuZ3N1OkhhbmppYW5nCisyMDpDTjpDSE46Q0hJTkE6SmlhbmdzdTpIb25nemUKKzIxOkNOOkNITjpDSElOQTpKaWFuZ3N1Okh1YWlhbgorMjI6Q046Q0hOOkNISU5BOkppYW5nc3U6SHVhaXlpbgorMjM6Q046Q0hOOkNISU5BOkppYW5nc3U6SmlhbmdkdQorMjQ6Q046Q0hOOkNISU5BOkppYW5nc3U6SmlhbmduaW5nCisyNTpDTjpDSE46Q0hJTkE6SmlhbmdzdTpKaWFuZ3B1CisyNjpDTjpDSE46Q0hJTkE6SmlhbmdzdTpKaWFuZ3lpbgorMjc6Q046Q0hOOkNISU5BOkppYW5nc3U6Smlhbmh1CisyODpDTjpDSE46Q0hJTkE6SmlhbmdzdTpKaW5namlhbmcKKzI5OkNOOkNITjpDSElOQTpKaWFuZ3N1Okppbmh1CiszMDpDTjpDSE46Q0hJTkE6SmlhbmdzdTpKaW50YW4KKzMxOkNOOkNITjpDSElOQTpKaWFuZ3N1Okp1cm9uZworMzI6Q046Q0hOOkNISU5BOkppYW5nc3U6S3Vuc2hhbgorMzM6Q046Q0hOOkNISU5BOkppYW5nc3U6TGlhbnNodWkKKzM0OkNOOkNITjpDSElOQTpKaWFuZ3N1OkxpYW55dW5nYW5nIFNoaQorMzU6Q046Q0hOOkNISU5BOkppYW5nc3U6TGlzaHVpCiszNjpDTjpDSE46Q0hJTkE6SmlhbmdzdTpMaXlhbmcKKzM3OkNOOkNITjpDSElOQTpKaWFuZ3N1Okx1aGUKKzM4OkNOOkNITjpDSElOQTpKaWFuZ3N1Ok5hbmppbmcgU2hpcXUKKzM5OkNOOkNITjpDSElOQTpKaWFuZ3N1Ok5hbnRvbmcKKzQwOkNOOkNITjpDSElOQTpKaWFuZ3N1Ok5hbnRvbmcgU2hpCis0MTpDTjpDSE46Q0hJTkE6SmlhbmdzdTpQZWl4aWFuCis0MjpDTjpDSE46Q0hJTkE6SmlhbmdzdTpRaWRvbmcKKzQzOkNOOkNITjpDSElOQTpKaWFuZ3N1OlFpbmdqaWFuZyBTaGkKKzQ0OkNOOkNITjpDSElOQTpKaWFuZ3N1OlJ1ZG9uZworNDU6Q046Q0hOOkNISU5BOkppYW5nc3U6UnVnYW8KKzQ2OkNOOkNITjpDSElOQTpKaWFuZ3N1OlNoYXpob3UKKzQ3OkNOOkNITjpDSElOQTpKaWFuZ3N1OlNoZXlhbmcKKzQ4OkNOOkNITjpDSElOQTpKaWFuZ3N1OlNodXlhbmcKKzQ5OkNOOkNITjpDSElOQTpKaWFuZ3N1OlNpaG9uZworNTA6Q046Q0hOOkNISU5BOkppYW5nc3U6U2l5YW5nCis1MTpDTjpDSE46Q0hJTkE6SmlhbmdzdTpTdWluaW5nCis1MjpDTjpDSE46Q0hJTkE6SmlhbmdzdTpTdXFpYW4KKzUzOkNOOkNITjpDSElOQTpKaWFuZ3N1OlN1emhvdSBTaGkKKzU0OkNOOkNITjpDSElOQTpKaWFuZ3N1OlRhaWNhbmcKKzU1OkNOOkNITjpDSElOQTpKaWFuZ3N1OlRhaXhpYW4KKzU2OkNOOkNITjpDSElOQTpKaWFuZ3N1OlRhaXhpbmcKKzU3OkNOOkNITjpDSElOQTpKaWFuZ3N1OlRhaXpob3UgU2hpCis1ODpDTjpDSE46Q0hJTkE6SmlhbmdzdTpUb25nc2hhbgorNTk6Q046Q0hOOkNISU5BOkppYW5nc3U6V3VqaWFuZworNjA6Q046Q0hOOkNISU5BOkppYW5nc3U6V3VqaW4KKzYxOkNOOkNITjpDSElOQTpKaWFuZ3N1Old1eGkKKzYyOkNOOkNITjpDSElOQTpKaWFuZ3N1Old1eGkgU2hpCis2MzpDTjpDSE46Q0hJTkE6SmlhbmdzdTpXdXhpYW4KKzY0OkNOOkNITjpDSElOQTpKaWFuZ3N1OlhpYW5nc2h1aQorNjU6Q046Q0hOOkNISU5BOkppYW5nc3U6WGluZ2h1YQorNjY6Q046Q0hOOkNISU5BOkppYW5nc3U6WGlueWkKKzY3OkNOOkNITjpDSElOQTpKaWFuZ3N1Olh1eWkKKzY4OkNOOkNITjpDSElOQTpKaWFuZ3N1Olh1emhvdSBTaGkKKzY5OkNOOkNITjpDSElOQTpKaWFuZ3N1Ollhbmd6aG9uZworNzA6Q046Q0hOOkNISU5BOkppYW5nc3U6WWFuZ3pob3UgU2hpCis3MTpDTjpDSE46Q0hJTkE6SmlhbmdzdTpZaWFuY2hlbmcKKzcyOkNOOkNITjpDSElOQTpKaWFuZ3N1OllpeGluZworNzM6Q046Q0hOOkNISU5BOkppYW5nc3U6WWl6aGVuZworNzQ6Q046Q0hOOkNISU5BOkppYW5nc3U6WmhlbmppYW5nIFNoaQorMTpDTjpDSE46Q0hJTkE6SHVuYW46QW5odWEKKzI6Q046Q0hOOkNISU5BOkh1bmFuOkFucmVuCiszOkNOOkNITjpDSElOQTpIdW5hbjpBbnhpYW5nCis0OkNOOkNITjpDSElOQTpIdW5hbjpCYW9qaW5nCis1OkNOOkNITjpDSElOQTpIdW5hbjpDaGFsaW5nCis2OkNOOkNITjpDSElOQTpIdW5hbjpDaGFuZ2RlCis3OkNOOkNITjpDSElOQTpIdW5hbjpDaGFuZ2RlIFNoaQorODpDTjpDSE46Q0hJTkE6SHVuYW46Q2hhbmduaW5nCis5OkNOOkNITjpDSElOQTpIdW5hbjpDaGFuZ3NoYQorMTA6Q046Q0hOOkNISU5BOkh1bmFuOkNoYW5nc2hhIFNoaXF1CisxMTpDTjpDSE46Q0hJTkE6SHVuYW46Q2hlbiBYaWFuCisxMjpDTjpDSE46Q0hJTkE6SHVuYW46Q2hlbmdidQorMTM6Q046Q0hOOkNISU5BOkh1bmFuOkNoZW54aQorMTQ6Q046Q0hOOkNISU5BOkh1bmFuOkNoZW56aG91IFNoaQorMTU6Q046Q0hOOkNISU5BOkh1bmFuOkNpbGkKKzE2OkNOOkNITjpDSElOQTpIdW5hbjpEYW8gWGlhbgorMTc6Q046Q0hOOkNISU5BOkh1bmFuOkRheW9uZworMTg6Q046Q0hOOkNISU5BOkh1bmFuOkRvbmcgQW4KKzE5OkNOOkNITjpDSElOQTpIdW5hbjpEb25na291CisyMDpDTjpDSE46Q0hJTkE6SHVuYW46RmVuZ2h1YW5nCisyMTpDTjpDSE46Q0hJTkE6SHVuYW46R3VpZG9uZworMjI6Q046Q0hOOkNISU5BOkh1bmFuOkd1aXlhbmcKKzIzOkNOOkNITjpDSElOQTpIdW5hbjpHdXpoYW5nCisyNDpDTjpDSE46Q0hJTkE6SHVuYW46SGFuc2hvdQorMjU6Q046Q0hOOkNISU5BOkh1bmFuOkhlbmdkb25nCisyNjpDTjpDSE46Q0hJTkE6SHVuYW46SGVuZ25hbgorMjc6Q046Q0hOOkNISU5BOkh1bmFuOkhlbmdzaGFuCisyODpDTjpDSE46Q0hJTkE6SHVuYW46SGVuZ3lhbmcKKzI5OkNOOkNITjpDSElOQTpIdW5hbjpIZW5neWFuZyBTaGkKKzMwOkNOOkNITjpDSElOQTpIdW5hbjpIb25namlhbmcgU2hpCiszMTpDTjpDSE46Q0hJTkE6SHVuYW46SHVhaWh1YQorMzI6Q046Q0hOOkNISU5BOkh1bmFuOkh1YWlodWEgU2hpCiszMzpDTjpDSE46Q0hJTkE6SHVuYW46SHVhcm9uZworMzQ6Q046Q0hOOkNISU5BOkh1bmFuOkh1YXl1YW4KKzM1OkNOOkNITjpDSElOQTpIdW5hbjpIdWl0b25nCiszNjpDTjpDSE46Q0hJTkE6SHVuYW46SmlhaGUKKzM3OkNOOkNITjpDSElOQTpIdW5hbjpKaWFuZ2h1YQorMzg6Q046Q0hOOkNISU5BOkh1bmFuOkppYW5neW9uZworMzk6Q046Q0hOOkNISU5BOkh1bmFuOkppbmcgWGlhbgorNDA6Q046Q0hOOkNISU5BOkh1bmFuOkppbnNoaSBTaGkKKzQxOkNOOkNITjpDSElOQTpIdW5hbjpKaXNob3UKKzQyOkNOOkNITjpDSElOQTpIdW5hbjpMYWl5YW5nCis0MzpDTjpDSE46Q0hJTkE6SHVuYW46TGFuc2hhbgorNDQ6Q046Q0hOOkNISU5BOkh1bmFuOkxlbmdzaHVpamFuZyBTaGkKKzQ1OkNOOkNITjpDSElOQTpIdW5hbjpMaSBYaWFuCis0NjpDTjpDSE46Q0hJTkE6SHVuYW46TGlhbnl1YW4KKzQ3OkNOOkNITjpDSElOQTpIdW5hbjpMaWxpbmcKKzQ4OkNOOkNITjpDSElOQTpIdW5hbjpMaW5nIFhpYW4KKzQ5OkNOOkNITjpDSElOQTpIdW5hbjpMaW5nbGluZworNTA6Q046Q0hOOkNISU5BOkh1bmFuOkxpbmxpCis1MTpDTjpDSE46Q0hJTkE6SHVuYW46TGlud3UKKzUyOkNOOkNITjpDSElOQTpIdW5hbjpMaW54aWFuZworNTM6Q046Q0hOOkNISU5BOkh1bmFuOkxpdXlhbmcKKzU0OkNOOkNITjpDSElOQTpIdW5hbjpMb25naHVpCis1NTpDTjpDSE46Q0hJTkE6SHVuYW46TG9uZ3NoYW4KKzU2OkNOOkNITjpDSElOQTpIdW5hbjpMb3VkaSBTaGkKKzU3OkNOOkNITjpDSElOQTpIdW5hbjpMdXhpCis1ODpDTjpDSE46Q0hJTkE6SHVuYW46TWF5YW5nCis1OTpDTjpDSE46Q0hJTkE6SHVuYW46TWlsdW8KKzYwOkNOOkNITjpDSElOQTpIdW5hbjpOYW4gWGlhbgorNjE6Q046Q0hOOkNISU5BOkh1bmFuOk5pbmd4aWFuZworNjI6Q046Q0hOOkNISU5BOkh1bmFuOk5pbmd5dWFuCis2MzpDTjpDSE46Q0hJTkE6SHVuYW46UGluZ2ppYW5nCis2NDpDTjpDSE46Q0hJTkE6SHVuYW46UWlhbnlhbmcKKzY1OkNOOkNITjpDSElOQTpIdW5hbjpRaWRvbmcKKzY2OkNOOkNITjpDSElOQTpIdW5hbjpRaXlhbmcKKzY3OkNOOkNITjpDSElOQTpIdW5hbjpSdWNoZW5nCis2ODpDTjpDSE46Q0hJTkE6SHVuYW46U2FuZ3poaQorNjk6Q046Q0hOOkNISU5BOkh1bmFuOlNoYW9kb25nCis3MDpDTjpDSE46Q0hJTkE6SHVuYW46U2hhb3lhbmcKKzcxOkNOOkNITjpDSElOQTpIdW5hbjpTaGFveWFuZyBTaGkKKzcyOkNOOkNITjpDSElOQTpIdW5hbjpTaGltZW4KKzczOkNOOkNITjpDSElOQTpIdW5hbjpTaHVhbmdmZW5nCis3NDpDTjpDSE46Q0hJTkE6SHVuYW46U2h1YW5ncGFpCis3NTpDTjpDSE46Q0hJTkE6SHVuYW46U3VpbmluZworNzY6Q046Q0hOOkNISU5BOkh1bmFuOlRhb2ppYW5nCis3NzpDTjpDSE46Q0hJTkE6SHVuYW46VGFveXVhbgorNzg6Q046Q0hOOkNISU5BOkh1bmFuOlRvbmdkYW8KKzc5OkNOOkNITjpDSElOQTpIdW5hbjpXYW5nY2hlbmcKKzgwOkNOOkNITjpDSElOQTpIdW5hbjpXdWdhbmcKKzgxOkNOOkNITjpDSElOQTpIdW5hbjpYaWFuZ3RhbgorODI6Q046Q0hOOkNISU5BOkh1bmFuOlhpYW5ndGFuIFNoaQorODM6Q046Q0hOOkNISU5BOkh1bmFuOlhpYW5neGlhbmcKKzg0OkNOOkNITjpDSElOQTpIdW5hbjpYaWFuZ3lpbgorODU6Q046Q0hOOkNISU5BOkh1bmFuOlhpbmh1YQorODY6Q046Q0hOOkNISU5BOkh1bmFuOlhpbmh1YW5nCis4NzpDTjpDSE46Q0hJTkE6SHVuYW46WGlubmluZworODg6Q046Q0hOOkNISU5BOkh1bmFuOlhpbnNoYW8KKzg5OkNOOkNITjpDSElOQTpIdW5hbjpYaW50aWFuCis5MDpDTjpDSE46Q0hJTkE6SHVuYW46WHVwdQorOTE6Q046Q0hOOkNISU5BOkh1bmFuOllpeWFuZworOTI6Q046Q0hOOkNISU5BOkh1bmFuOllpeWFuZyBTaGkKKzkzOkNOOkNITjpDSElOQTpIdW5hbjpZaXpoYW5nCis5NDpDTjpDSE46Q0hJTkE6SHVuYW46WW9uZ3NodW4KKzk1OkNOOkNITjpDSElOQTpIdW5hbjpZb25neGluZworOTY6Q046Q0hOOkNISU5BOkh1bmFuOllvbmd6aG91IFNoaQorOTc6Q046Q0hOOkNISU5BOkh1bmFuOllvdSBYaWFuCis5ODpDTjpDSE46Q0hJTkE6SHVuYW46WXVhbmppYW5nCis5OTpDTjpDSE46Q0hJTkE6SHVuYW46WXVhbmxpbmcKKzEwMDpDTjpDSE46Q0hJTkE6SHVuYW46WXVleWFuZyBTaGkKKzEwMTpDTjpDSE46Q0hJTkE6SHVuYW46WmhpamlhbmcKKzEwMjpDTjpDSE46Q0hJTkE6SHVuYW46Wmh1emhvdQorMTAzOkNOOkNITjpDSElOQTpIdW5hbjpaaHV6aG91IFNoaXF1CisxMDQ6Q046Q0hOOkNISU5BOkh1bmFuOlppeGluZworMTpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkJhbyBBbgorMjpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkJvbG91CiszOkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6Q2hhb2FuCis0OkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6Q2hhb3lhbmcKKzU6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpDaGFvemhvdSBTaGkKKzY6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpDaGVuaGFpCis3OkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6Q29uZ2h1YQorODpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkRhYnUKKzk6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpEZXFpbmcKKzEwOkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6RGlhbmJhaQorMTE6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpEb25nZ3VhbgorMTI6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpEb3VtYW4KKzEzOkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6RW5waW5nCisxNDpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkZlbmdrYWkKKzE1OkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6RmVuZ3NodW4KKzE2OkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6Rm9nYW5nCisxNzpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkZvc2hhbiBTaGkKKzE4OkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6R2FvbWluZworMTk6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpHYW95YW8KKzIwOkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6R2FvemhvdQorMjE6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpHdWFuZ25pbmcKKzIyOkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6R3Vhbmd6aG91IFNoaXF1CisyMzpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkhhaWZlbmcKKzI0OkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6SGFpa2FuZworMjU6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpIZXBpbmcKKzI2OkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6SGVzaGFuCisyNzpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkhleXVhbgorMjg6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpIdWFpamkKKzI5OkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6SHVheGlhbgorMzA6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpIdWF6aG91CiszMTpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkh1aWRvbmcKKzMyOkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6SHVpbGFpCiszMzpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkh1aXlhbmcKKzM0OkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6SHVpemhvdSBTaGkKKzM1OkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6SmlhbmdtZW4gU2hpCiszNjpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkppYW9saW5nCiszNzpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkppZXhpCiszODpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkppZXlhbmcKKzM5OkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6S2FpcGluZworNDA6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpMZWNoYW5nCis0MTpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkxpYW5qaWFuZworNDI6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpMaWFubmFuCis0MzpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkxpYW5waW5nCis0NDpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkxpYW5zaGFuCis0NTpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkxpYW54aWFuCis0NjpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkxvbmdjaHVhbgorNDc6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpMb25nbWVuCis0ODpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOkx1ZmVuZworNDk6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpMdW9kaW5nCis1MDpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOk1hb21pbmcKKzUxOkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6TWVpIFhpYW4KKzUyOkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6TWVpemhvdSBTaGkKKzUzOkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6TmFuYW8KKzU0OkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6TmFuaGFpCis1NTpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOk5hbnhpb25nCis1NjpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlBhbnl1Cis1NzpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlBpbmd5dWFuCis1ODpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlB1bmluZworNTk6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpRaW5neXVhbgorNjA6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpRdWppYW5nCis2MTpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlJhb3BpbmcKKzYyOkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6UmVuaHVhCis2MzpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlJ1eXVhbgorNjQ6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpTYW5zaHVpCis2NTpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlNoYW50b3UgU2hpCis2NjpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlNoYW9ndWFuIFNoaXF1Cis2NzpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlNoZW56aGVuIFNoaXF1Cis2ODpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlNoaXhpbmcKKzY5OkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6U2h1bmRlCis3MDpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlNpaHVpCis3MTpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlN1aXhpCis3MjpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlRhaXNoYW4KKzczOkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6V2VuZ3l1YW4KKzc0OkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6V3VjaHVhbgorNzU6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpXdWh1YQorNzY6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpYaW5mZW5nCis3NzpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlhpbmduaW5nCis3ODpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlhpbmh1aQorNzk6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpYaW54aW5nCis4MDpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlhpbnlpCis4MTpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlh1d2VuCis4MjpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOllhbmdjaHVuCis4MzpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOllhbmdqaWFuZworODQ6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpZYW5nc2hhbgorODU6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpZaW5nZGUKKzg2OkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6WXVuYW4KKzg3OkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6WXVuZnUKKzg4OkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6WmVuZ2NoZW5nCis4OTpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlpoYW5qaWFuZyBTaGkKKzkwOkNOOkNITjpDSElOQTpHdWFuZ2Rvbmc6Wmhhb3FpbmcgU2hpCis5MTpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlpob25nc2hhbgorOTI6Q046Q0hOOkNISU5BOkd1YW5nZG9uZzpaaHVoYWkgU2hpCis5MzpDTjpDSE46Q0hJTkE6R3Vhbmdkb25nOlppamluCisxOkNOOkNITjpDSElOQTpTaGFuZG9uZzpBbnFpdQorMjpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6QmlueGlhbgorMzpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6Qm94aW5nCis0OkNOOkNITjpDSElOQTpTaGFuZG9uZzpDYW5nc2hhbgorNTpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6Q2FveGlhbgorNjpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6Q2hhbmdsZQorNzpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6Q2hhbmdxaW5nCis4OkNOOkNITjpDSElOQTpTaGFuZG9uZzpDaGFuZ3lpCis5OkNOOkNITjpDSElOQTpTaGFuZG9uZzpDaGVuZ3d1CisxMDpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6Q2hpcGluZworMTE6Q046Q0hOOkNISU5BOlNoYW5kb25nOkRlemhvdSBTaGkKKzEyOkNOOkNITjpDSElOQTpTaGFuZG9uZzpEaW5ndGFvCisxMzpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6RG9uZyBFCisxNDpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6RG9uZ21pbmcKKzE1OkNOOkNITjpDSElOQTpTaGFuZG9uZzpEb25ncGluZworMTY6Q046Q0hOOkNISU5BOlNoYW5kb25nOkZlaWNoZW5nCisxNzpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6RmVpeGlhbgorMTg6Q046Q0hOOkNISU5BOlNoYW5kb25nOkZ1c2hhbgorMTk6Q046Q0hOOkNISU5BOlNoYW5kb25nOkdhb21pCisyMDpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6R2FvcWluZworMjE6Q046Q0hOOkNISU5BOlNoYW5kb25nOkdhb3RhbmcKKzIyOkNOOkNITjpDSElOQTpTaGFuZG9uZzpHdWFuZ3JhbworMjM6Q046Q0hOOkNISU5BOlNoYW5kb25nOkd1YW54aWFuCisyNDpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6SGFpeWFuZworMjU6Q046Q0hOOkNISU5BOlNoYW5kb25nOkhlemUKKzI2OkNOOkNITjpDSElOQTpTaGFuZG9uZzpIdWFuZyBYaWFuCisyNzpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6SHVhbnRhaQorMjg6Q046Q0hOOkNISU5BOlNoYW5kb25nOkh1aW1pbgorMjk6Q046Q0hOOkNISU5BOlNoYW5kb25nOkppYW9uYW4KKzMwOkNOOkNITjpDSElOQTpTaGFuZG9uZzpKaWFveGlhbgorMzE6Q046Q0hOOkNISU5BOlNoYW5kb25nOkppYXhpYW5nCiszMjpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6SmltbworMzM6Q046Q0hOOkNISU5BOlNoYW5kb25nOkppbmFuIFNoaXF1CiszNDpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6SmluaW5nCiszNTpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6SmluaW5nIFNoaQorMzY6Q046Q0hOOkNISU5BOlNoYW5kb25nOkppbnhpYW5nCiszNzpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6Sml5YW5nCiszODpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6SnVhbmNoZW5nCiszOTpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6SnVuYW4KKzQwOkNOOkNITjpDSElOQTpTaGFuZG9uZzpKdXhpYW4KKzQxOkNOOkNITjpDSElOQTpTaGFuZG9uZzpKdXllCis0MjpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6S2VubGkKKzQzOkNOOkNITjpDSElOQTpTaGFuZG9uZzpMYWl3dQorNDQ6Q046Q0hOOkNISU5BOlNoYW5kb25nOkxhaXhpCis0NTpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6TGFpeWFuZworNDY6Q046Q0hOOkNISU5BOlNoYW5kb25nOkxhb3NoYW4KKzQ3OkNOOkNITjpDSElOQTpTaGFuZG9uZzpMZWxpbmcKKzQ4OkNOOkNITjpDSElOQTpTaGFuZG9uZzpMaWFuZ3NoYW4KKzQ5OkNOOkNITjpDSElOQTpTaGFuZG9uZzpMaWFvY2hlbmcKKzUwOkNOOkNITjpDSElOQTpTaGFuZG9uZzpMaWNoZW5nCis1MTpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6TGlqaW4KKzUyOkNOOkNITjpDSElOQTpTaGFuZG9uZzpMaW5nIFhpYW4KKzUzOkNOOkNITjpDSElOQTpTaGFuZG9uZzpMaW5xaW5nCis1NDpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6TGlucXUKKzU1OkNOOkNITjpDSElOQTpTaGFuZG9uZzpMaW5zaHUKKzU2OkNOOkNITjpDSElOQTpTaGFuZG9uZzpMaW55aQorNTc6Q046Q0hOOkNISU5BOlNoYW5kb25nOk1lbmd5aW4KKzU4OkNOOkNITjpDSElOQTpTaGFuZG9uZzpNb3VwaW5nCis1OTpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6TmluZ2ppbgorNjA6Q046Q0hOOkNISU5BOlNoYW5kb25nOk5pbmd5YW5nCis2MTpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6UGVuZ2xhaQorNjI6Q046Q0hOOkNISU5BOlNoYW5kb25nOlBpbmdkdQorNjM6Q046Q0hOOkNISU5BOlNoYW5kb25nOlBpbmd5aQorNjQ6Q046Q0hOOkNISU5BOlNoYW5kb25nOlBpbmd5aW4KKzY1OkNOOkNITjpDSElOQTpTaGFuZG9uZzpQaW5neXVhbgorNjY6Q046Q0hOOkNISU5BOlNoYW5kb25nOlFpaGUKKzY3OkNOOkNITjpDSElOQTpTaGFuZG9uZzpRaW5nZGFvIFNoaXF1Cis2ODpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6UWluZ3l1bgorNjk6Q046Q0hOOkNISU5BOlNoYW5kb25nOlFpeGlhCis3MDpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6UXVmdQorNzE6Q046Q0hOOkNISU5BOlNoYW5kb25nOlJpemhhbworNzI6Q046Q0hOOkNISU5BOlNoYW5kb25nOlJvbmdjaGVuZworNzM6Q046Q0hOOkNISU5BOlNoYW5kb25nOlJ1c2hhbgorNzQ6Q046Q0hOOkNISU5BOlNoYW5kb25nOlNoYW5naGUKKzc1OkNOOkNITjpDSElOQTpTaGFuZG9uZzpTaGFueGlhbgorNzY6Q046Q0hOOkNISU5BOlNoYW5kb25nOlNoZW54aWFuCis3NzpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6U2hvdWd1YW5nCis3ODpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6U2lzaHVpCis3OTpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6VGFpIEFuIFNoaQorODA6Q046Q0hOOkNISU5BOlNoYW5kb25nOlRhbmNoZW5nCis4MTpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6VGVuZyBYaWFuCis4MjpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6V2VpZmFuZyBTaGkKKzgzOkNOOkNITjpDSElOQTpTaGFuZG9uZzpXZWloYWkgU2hpCis4NDpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6V2Vpc2hhbgorODU6Q046Q0hOOkNISU5BOlNoYW5kb25nOldlaXhpYW4KKzg2OkNOOkNITjpDSElOQTpTaGFuZG9uZzpXZW5kZW5nCis4NzpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6V2Vuc2hhbmcKKzg4OkNOOkNITjpDSElOQTpTaGFuZG9uZzpXdWNoZW5nCis4OTpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6V3VkaQorOTA6Q046Q0hOOkNISU5BOlNoYW5kb25nOld1bGlhbgorOTE6Q046Q0hOOkNISU5BOlNoYW5kb25nOlhpYWppbgorOTI6Q046Q0hOOkNISU5BOlNoYW5kb25nOlhpbnRhaQorOTM6Q046Q0hOOkNISU5BOlNoYW5kb25nOlhpbndlbgorOTQ6Q046Q0hOOkNISU5BOlNoYW5kb25nOllhbmdndQorOTU6Q046Q0hOOkNISU5BOlNoYW5kb25nOllhbmd4aW4KKzk2OkNOOkNITjpDSElOQTpTaGFuZG9uZzpZYW50YWkgU2hpCis5NzpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6WWFuemhvdQorOTg6Q046Q0hOOkNISU5BOlNoYW5kb25nOllleGlhbgorOTk6Q046Q0hOOkNISU5BOlNoYW5kb25nOllpZHUKKzEwMDpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6WWluYW4KKzEwMTpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6WWlzaHVpCisxMDI6Q046Q0hOOkNISU5BOlNoYW5kb25nOllpeXVhbgorMTAzOkNOOkNITjpDSElOQTpTaGFuZG9uZzpZdWNoZW5nCisxMDQ6Q046Q0hOOkNISU5BOlNoYW5kb25nOll1bmNoZW5nCisxMDU6Q046Q0hOOkNISU5BOlNoYW5kb25nOll1dGFpCisxMDY6Q046Q0hOOkNISU5BOlNoYW5kb25nOlpoYW5ncWl1CisxMDc6Q046Q0hOOkNISU5BOlNoYW5kb25nOlpoYW5odWEKKzEwODpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6Wmhhb3l1YW4KKzEwOTpDTjpDSE46Q0hJTkE6U2hhbmRvbmc6Wmhhb3podWFuZyBTaGlxdQorMTEwOkNOOkNITjpDSElOQTpTaGFuZG9uZzpaaHVjaGVuZworMTExOkNOOkNITjpDSElOQTpTaGFuZG9uZzpaaWJvIFNoaQorMTEyOkNOOkNITjpDSElOQTpTaGFuZG9uZzpab3VwaW5nCisxMTM6Q046Q0hOOkNISU5BOlNoYW5kb25nOlpvdXhpYW4KKzE6Q046Q0hOOkNISU5BOlRpYW5qaW46QmFvZGkKKzI6Q046Q0hOOkNISU5BOlRpYW5qaW46SGFuZ3UKKzM6Q046Q0hOOkNISU5BOlRpYW5qaW46SmkgWGlhbgorNDpDTjpDSE46Q0hJTkE6VGlhbmppbjpKaW5naGFpCis1OkNOOkNITjpDSElOQTpUaWFuamluOk5pbmdoZQorNjpDTjpDSE46Q0hJTkE6VGlhbmppbjpUYW5nZ3UKKzc6Q046Q0hOOkNISU5BOlRpYW5qaW46VGlhbmppbiBTaGlxdQorODpDTjpDSE46Q0hJTkE6VGlhbmppbjpXdXFpbmcKKzE6Q046Q0hOOkNISU5BOkxpYW9uaW5nOkFuc2hhbiBTaGlxdQorMjpDTjpDSE46Q0hJTkE6TGlhb25pbmc6QmVpcGlhbworMzpDTjpDSE46Q0hJTkE6TGlhb25pbmc6QmVpemhlbgorNDpDTjpDSE46Q0hJTkE6TGlhb25pbmc6QmVueGkKKzU6Q046Q0hOOkNISU5BOkxpYW9uaW5nOkJlbnhpIFNoaXF1Cis2OkNOOkNITjpDSElOQTpMaWFvbmluZzpDaGFuZ3R1Cis3OkNOOkNITjpDSElOQTpMaWFvbmluZzpDaGFveWFuZworODpDTjpDSE46Q0hJTkE6TGlhb25pbmc6Q2hhb3lhbmcgU2hpCis5OkNOOkNITjpDSElOQTpMaWFvbmluZzpEYWxpYW4gU2hpcXUKKzEwOkNOOkNITjpDSElOQTpMaWFvbmluZzpEYW5kb25nIFNoaXF1CisxMTpDTjpDSE46Q0hJTkE6TGlhb25pbmc6RGF3YQorMTI6Q046Q0hOOkNISU5BOkxpYW9uaW5nOkRlbmd0YQorMTM6Q046Q0hOOkNISU5BOkxpYW9uaW5nOkRvbmdnb3UKKzE0OkNOOkNITjpDSElOQTpMaWFvbmluZzpGYWt1CisxNTpDTjpDSE46Q0hJTkE6TGlhb25pbmc6RmVuZ2NoZW5nCisxNjpDTjpDSE46Q0hJTkE6TGlhb25pbmc6RnUgWGlhbgorMTc6Q046Q0hOOkNISU5BOkxpYW9uaW5nOkZ1c2h1bgorMTg6Q046Q0hOOkNISU5BOkxpYW9uaW5nOkZ1c2h1biBTaGlxdQorMTk6Q046Q0hOOkNISU5BOkxpYW9uaW5nOkZ1eGluIE1vbmdvbGlhbiBBYworMjA6Q046Q0hOOkNISU5BOkxpYW9uaW5nOkZ1eGluIFNoaXF1CisyMTpDTjpDSE46Q0hJTkE6TGlhb25pbmc6R2FpIFhpYW4KKzIyOkNOOkNITjpDSElOQTpMaWFvbmluZzpIYWljaGVuZworMjM6Q046Q0hOOkNISU5BOkxpYW9uaW5nOkhhcnFpbgorMjQ6Q046Q0hOOkNISU5BOkxpYW9uaW5nOkhlaXNoYW4KKzI1OkNOOkNITjpDSElOQTpMaWFvbmluZzpIdWFucmVuCisyNjpDTjpDSE46Q0hJTkE6TGlhb25pbmc6SmlhbmNoYW5nCisyNzpDTjpDSE46Q0hJTkE6TGlhb25pbmc6SmlhbnBpbmcKKzI4OkNOOkNITjpDSElOQTpMaWFvbmluZzpKaW4gWGlhbgorMjk6Q046Q0hOOkNISU5BOkxpYW9uaW5nOkppbnhpCiszMDpDTjpDSE46Q0hJTkE6TGlhb25pbmc6SmluemhvdSBTaGlxdQorMzE6Q046Q0hOOkNISU5BOkxpYW9uaW5nOkthaXl1YW4KKzMyOkNOOkNITjpDSElOQTpMaWFvbmluZzpLYW5ncGluZworMzM6Q046Q0hOOkNISU5BOkxpYW9uaW5nOkt1YW5kaWFuCiszNDpDTjpDSE46Q0hJTkE6TGlhb25pbmc6TGlhb3lhbmcKKzM1OkNOOkNITjpDSElOQTpMaWFvbmluZzpMaWFveWFuZyBTaGlxdQorMzY6Q046Q0hOOkNISU5BOkxpYW9uaW5nOkxpYW96aG9uZworMzc6Q046Q0hOOkNISU5BOkxpYW9uaW5nOkxpbmd5dWFuCiszODpDTjpDSE46Q0hJTkE6TGlhb25pbmc6UGFuc2hhbgorMzk6Q046Q0hOOkNISU5BOkxpYW9uaW5nOlFpbmd5dWFuCis0MDpDTjpDSE46Q0hJTkE6TGlhb25pbmc6U2hlbnlhbmcgU2hpcXUKKzQxOkNOOkNITjpDSElOQTpMaWFvbmluZzpTdWl6aG9uZworNDI6Q046Q0hOOkNISU5BOkxpYW9uaW5nOlRhaWFuCis0MzpDTjpDSE46Q0hJTkE6TGlhb25pbmc6VGllZmEgU2hpCis0NDpDTjpDSE46Q0hJTkE6TGlhb25pbmc6VGllbGluZworNDU6Q046Q0hOOkNISU5BOkxpYW9uaW5nOlRpZWxpbmcgU2hpCis0NjpDTjpDSE46Q0hJTkE6TGlhb25pbmc6WGlmZW5nCis0NzpDTjpDSE46Q0hJTkE6TGlhb25pbmc6WGluYmluCis0ODpDTjpDSE46Q0hJTkE6TGlhb25pbmc6WGluZ2NoZW5nCis0OTpDTjpDSE46Q0hJTkE6TGlhb25pbmc6WGluamluCis1MDpDTjpDSE46Q0hJTkE6TGlhb25pbmc6WGlubWluCis1MTpDTjpDSE46Q0hJTkE6TGlhb25pbmc6WGl1eWFuCis1MjpDTjpDSE46Q0hJTkE6TGlhb25pbmc6WWkgWGlhbgorNTM6Q046Q0hOOkNISU5BOkxpYW9uaW5nOllpbmdrb3UKKzU0OkNOOkNITjpDSElOQTpMaWFvbmluZzpZaW5na291IFNoaXF1Cis1NTpDTjpDSE46Q0hJTkE6TGlhb25pbmc6Wmhhbmd3dQorNTY6Q046Q0hOOkNISU5BOkxpYW9uaW5nOlpodWFuZ2hlCisxOkNOOkNITjpDSElOQTpIdWJlaTpBbmx1CisyOkNOOkNITjpDSElOQTpIdWJlaTpCYWRvbmcKKzM6Q046Q0hOOkNISU5BOkh1YmVpOkJhb2thbmcKKzQ6Q046Q0hOOkNISU5BOkh1YmVpOkNoYW5neWFuZworNTpDTjpDSE46Q0hJTkE6SHViZWk6Q2hvbmd5YW5nCis2OkNOOkNITjpDSElOQTpIdWJlaTpEYW5neWFuZworNzpDTjpDSE46Q0hJTkE6SHViZWk6RGF3dQorODpDTjpDSE46Q0hJTkE6SHViZWk6RGF5ZQorOTpDTjpDSE46Q0hJTkE6SHViZWk6RWNoZW5nCisxMDpDTjpDSE46Q0hJTkE6SHViZWk6RWNoZW5nIFNoaQorMTE6Q046Q0hOOkNISU5BOkh1YmVpOkVuc2hpCisxMjpDTjpDSE46Q0hJTkE6SHViZWk6RW5zaGkgU2hpCisxMzpDTjpDSE46Q0hJTkE6SHViZWk6RmFuZ3hpYW4KKzE0OkNOOkNITjpDSElOQTpIdWJlaTpHb25nIEFuCisxNTpDTjpDSE46Q0hJTkE6SHViZWk6R3VhbmdodWEKKzE2OkNOOkNITjpDSElOQTpIdWJlaTpHdWFuZ2ppCisxNzpDTjpDSE46Q0hJTkE6SHViZWk6R3VjaGVuZworMTg6Q046Q0hOOkNISU5BOkh1YmVpOkhhbmNodWFuCisxOTpDTjpDSE46Q0hJTkE6SHViZWk6SGFueWFuZworMjA6Q046Q0hOOkNISU5BOkh1YmVpOkhlZmVuZworMjE6Q046Q0hOOkNISU5BOkh1YmVpOkhvbmcgQW4KKzIyOkNOOkNITjpDSElOQTpIdWJlaTpIb25naHUKKzIzOkNOOkNITjpDSElOQTpIdWJlaTpIdWFuZ2dhbmcKKzI0OkNOOkNITjpDSElOQTpIdWJlaTpIdWFuZ21laQorMjU6Q046Q0hOOkNISU5BOkh1YmVpOkh1YW5ncGkKKzI2OkNOOkNITjpDSElOQTpIdWJlaTpIdWFuZ3NoaSBTaGlxdQorMjc6Q046Q0hOOkNISU5BOkh1YmVpOkppYW5nbGluZworMjg6Q046Q0hOOkNISU5BOkh1YmVpOkppYW5saQorMjk6Q046Q0hOOkNISU5BOkh1YmVpOkppYW5zaGkKKzMwOkNOOkNITjpDSElOQTpIdWJlaTpKaWF5dQorMzE6Q046Q0hOOkNISU5BOkh1YmVpOkppbmdtZW4KKzMyOkNOOkNITjpDSElOQTpIdWJlaTpKaW5nbWVuIFNoaQorMzM6Q046Q0hOOkNISU5BOkh1YmVpOkppbmdzaGFuCiszNDpDTjpDSE46Q0hJTkE6SHViZWk6SnVueGlhbgorMzU6Q046Q0hOOkNISU5BOkh1YmVpOkxhaWZlbmcKKzM2OkNOOkNITjpDSElOQTpIdWJlaTpMYW9oZWtvdQorMzc6Q046Q0hOOkNISU5BOkh1YmVpOkxpY2h1YW4KKzM4OkNOOkNITjpDSElOQTpIdWJlaTpMdW90aWFuCiszOTpDTjpDSE46Q0hJTkE6SHViZWk6TWFjaGVuZworNDA6Q046Q0hOOkNISU5BOkh1YmVpOk1pYW55YW5nCis0MTpDTjpDSE46Q0hJTkE6SHViZWk6TmFuemhhbmcKKzQyOkNOOkNITjpDSElOQTpIdWJlaTpQdXFpCis0MzpDTjpDSE46Q0hJTkE6SHViZWk6UWlhbmppYW5nCis0NDpDTjpDSE46Q0hJTkE6SHViZWk6UWljaHVuCis0NTpDTjpDSE46Q0hJTkE6SHViZWk6U2hhc2hpIFNoaQorNDY6Q046Q0hOOkNISU5BOkh1YmVpOlNoZW5ub25namlhCis0NzpDTjpDSE46Q0hJTkE6SHViZWk6U2hpc2hvdQorNDg6Q046Q0hOOkNISU5BOkh1YmVpOlNoaXlhbiBTaGkKKzQ5OkNOOkNITjpDSElOQTpIdWJlaTpTb25nemkKKzUwOkNOOkNITjpDSElOQTpIdWJlaTpTdWkgWGlhbgorNTE6Q046Q0hOOkNISU5BOkh1YmVpOlN1aXpob3UgU2hpCis1MjpDTjpDSE46Q0hJTkE6SHViZWk6VGlhbm1lbgorNTM6Q046Q0hOOkNISU5BOkh1YmVpOlRvbmdjaGVuZworNTQ6Q046Q0hOOkNISU5BOkh1YmVpOlRvbmdzaGFuCis1NTpDTjpDSE46Q0hJTkE6SHViZWk6V3VjaGFuZworNTY6Q046Q0hOOkNISU5BOkh1YmVpOld1ZmVuZworNTc6Q046Q0hOOkNISU5BOkh1YmVpOld1aGFuIFNoaXF1Cis1ODpDTjpDSE46Q0hJTkE6SHViZWk6WGlhbmZlbmcKKzU5OkNOOkNITjpDSElOQTpIdWJlaTpYaWFuZ2ZhbiBTaGkKKzYwOkNOOkNITjpDSElOQTpIdWJlaTpYaWFuZ3lhbmcKKzYxOkNOOkNITjpDSElOQTpIdWJlaTpYaWFubmluZworNjI6Q046Q0hOOkNISU5BOkh1YmVpOlhpYW9nYW4KKzYzOkNOOkNITjpDSElOQTpIdWJlaTpYaW5nc2hhbgorNjQ6Q046Q0hOOkNISU5BOkh1YmVpOlhpbnpob3UKKzY1OkNOOkNITjpDSElOQTpIdWJlaTpYaXNodWkKKzY2OkNOOkNITjpDSElOQTpIdWJlaTpYdWFuIEVuCis2NzpDTjpDSE46Q0hJTkE6SHViZWk6WWFuZ3hpbgorNjg6Q046Q0hOOkNISU5BOkh1YmVpOllpY2hhbmcKKzY5OkNOOkNITjpDSElOQTpIdWJlaTpZaWNoYW5nIFNoaQorNzA6Q046Q0hOOkNISU5BOkh1YmVpOllpY2hlbmcKKzcxOkNOOkNITjpDSElOQTpIdWJlaTpZaWR1Cis3MjpDTjpDSE46Q0hJTkE6SHViZWk6WWluZ2NoZW5nCis3MzpDTjpDSE46Q0hJTkE6SHViZWk6WWluZ3NoYW4KKzc0OkNOOkNITjpDSElOQTpIdWJlaTpZdWFuIEFuCis3NTpDTjpDSE46Q0hJTkE6SHViZWk6WXVuIFhpYW4KKzc2OkNOOkNITjpDSElOQTpIdWJlaTpZdW5tZW5nCis3NzpDTjpDSE46Q0hJTkE6SHViZWk6WXVueGkKKzc4OkNOOkNITjpDSElOQTpIdWJlaTpaYW95YW5nCis3OTpDTjpDSE46Q0hJTkE6SHViZWk6WmhpamlhbmcKKzgwOkNOOkNITjpDSElOQTpIdWJlaTpaaG9uZ3hpYW5nCis4MTpDTjpDSE46Q0hJTkE6SHViZWk6Wmh1c2hhbgorODI6Q046Q0hOOkNISU5BOkh1YmVpOlpodXhpCis4MzpDTjpDSE46Q0hJTkE6SHViZWk6WmlndWkKKzE6Q046Q0hOOkNISU5BOkJlaWppbmc6QmVpamluZyBTaGlxdQorMjpDTjpDSE46Q0hJTkE6QmVpamluZzpDaGFuZ3BpbmcKKzM6Q046Q0hOOkNISU5BOkJlaWppbmc6RGF4aW5nCis0OkNOOkNITjpDSElOQTpCZWlqaW5nOkZhbmdzaGFuCis1OkNOOkNITjpDSElOQTpCZWlqaW5nOkh1YWlyb3UKKzY6Q046Q0hOOkNISU5BOkJlaWppbmc6TWVudG91Z291IFF1Cis3OkNOOkNITjpDSElOQTpCZWlqaW5nOk1peXVuCis4OkNOOkNITjpDSElOQTpCZWlqaW5nOlBpbmdndQorOTpDTjpDSE46Q0hJTkE6QmVpamluZzpTaHVueWkKKzEwOkNOOkNITjpDSElOQTpCZWlqaW5nOlRvbmcgWGlhbgorMTE6Q046Q0hOOkNISU5BOkJlaWppbmc6WWFucWluZworMTI6Q046Q0hOOkNISU5BOkJlaWppbmc6WWFuc2hhbiBRdQorMTpDTjpDSE46Q0hJTkE6SGFpbmFuOkJhaXNoYQorMjpDTjpDSE46Q0hJTkE6SGFpbmFuOkJhb3RpbmcKKzM6Q046Q0hOOkNISU5BOkhhaW5hbjpDaGFuZ2ppYW5nCis0OkNOOkNITjpDSElOQTpIYWluYW46Q2hlbmdtYWkKKzU6Q046Q0hOOkNISU5BOkhhaW5hbjpEYW4gWGlhbgorNjpDTjpDSE46Q0hJTkE6SGFpbmFuOkRpbmcgQW4KKzc6Q046Q0hOOkNISU5BOkhhaW5hbjpEb25nZmFuZworODpDTjpDSE46Q0hJTkE6SGFpbmFuOkhhaWtvdXNoaQorOTpDTjpDSE46Q0hJTkE6SGFpbmFuOkxlZG9uZworMTA6Q046Q0hOOkNISU5BOkhhaW5hbjpMaW5nYW8KKzExOkNOOkNITjpDSElOQTpIYWluYW46TGluZ3NodWkKKzEyOkNOOkNITjpDSElOQTpIYWluYW46UWlvbmdoYWkKKzEzOkNOOkNITjpDSElOQTpIYWluYW46UWlvbmdzaGFuCisxNDpDTjpDSE46Q0hJTkE6SGFpbmFuOlFpb25nemhvbmcKKzE1OkNOOkNITjpDSElOQTpIYWluYW46VHVuY2hhbmcKKzE2OkNOOkNITjpDSElOQTpIYWluYW46V2FubmluZworMTc6Q046Q0hOOkNISU5BOkhhaW5hbjpXZW5jaGFuZworMTg6Q046Q0hOOkNISU5BOkhhaW5hbjpZYSBYaWFuCisxOkNOOkNITjpDSElOQTpOaW5neGlhOkd1eXVhbgorMjpDTjpDSE46Q0hJTkE6TmluZ3hpYTpIYWl5dWFuCiszOkNOOkNITjpDSElOQTpOaW5neGlhOkhlbGFuCis0OkNOOkNITjpDSElOQTpOaW5neGlhOkppbmd5dWFuCis1OkNOOkNITjpDSElOQTpOaW5neGlhOkxpbmd3dQorNjpDTjpDSE46Q0hJTkE6TmluZ3hpYTpMb25nZGUKKzc6Q046Q0hOOkNISU5BOk5pbmd4aWE6UGluZ2x1bworODpDTjpDSE46Q0hJTkE6TmluZ3hpYTpRaW5ndG9uZ3hpYQorOTpDTjpDSE46Q0hJTkE6TmluZ3hpYTpTaGl6dWlzaGFuIFNoaXF1CisxMDpDTjpDSE46Q0hJTkE6TmluZ3hpYTpUYW9sZQorMTE6Q046Q0hOOkNISU5BOk5pbmd4aWE6VG9uZ3hpbgorMTI6Q046Q0hOOkNISU5BOk5pbmd4aWE6V3V6aG9uZworMTM6Q046Q0hOOkNISU5BOk5pbmd4aWE6WGlqaQorMTQ6Q046Q0hOOkNISU5BOk5pbmd4aWE6WWFuY2hpCisxNTpDTjpDSE46Q0hJTkE6TmluZ3hpYTpZaW5jaHVhbiBTaGlxdQorMTY6Q046Q0hOOkNISU5BOk5pbmd4aWE6WW9uZ25pbmcKKzE3OkNOOkNITjpDSElOQTpOaW5neGlhOlpob25nbmluZworMTg6Q046Q0hOOkNISU5BOk5pbmd4aWE6Wmhvbmd3ZWkKKzE6Q046Q0hOOkNISU5BOkd1YW5neGk6QmFtYQorMjpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpCZWloYWkgU2hpCiszOkNOOkNITjpDSElOQTpHdWFuZ3hpOkJlaWxpdQorNDpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpCaW55YW5nCis1OkNOOkNITjpDSElOQTpHdWFuZ3hpOkJvYmFpCis2OkNOOkNITjpDSElOQTpHdWFuZ3hpOkJvc2UKKzc6Q046Q0hOOkNISU5BOkd1YW5neGk6Q2FuZ3d1Cis4OkNOOkNITjpDSElOQTpHdWFuZ3hpOkNlbnhpCis5OkNOOkNITjpDSElOQTpHdWFuZ3hpOkNob25nenVvCisxMDpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpEYXhpbgorMTE6Q046Q0hOOkNISU5BOkd1YW5neGk6RGViYW8KKzEyOkNOOkNITjpDSElOQTpHdWFuZ3hpOkRvbmdsYW4KKzEzOkNOOkNITjpDSElOQTpHdWFuZ3hpOkR1IEFuCisxNDpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpGYW5nY2hlbmcKKzE1OkNOOkNITjpDSElOQTpHdWFuZ3hpOkZlbmdzaGFuCisxNjpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpGdWNodWFuCisxNzpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpGdXN1aQorMTg6Q046Q0hOOkNISU5BOkd1YW5neGk6R29uZ2NoZW5nCisxOTpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpHdWFueWFuZworMjA6Q046Q0hOOkNISU5BOkd1YW5neGk6R3VpIFhpYW4KKzIxOkNOOkNITjpDSElOQTpHdWFuZ3hpOkd1aWxpbiBTaGlxdQorMjI6Q046Q0hOOkNISU5BOkd1YW5neGk6R3VpcGluZworMjM6Q046Q0hOOkNISU5BOkd1YW5neGk6SGUgWGlhbgorMjQ6Q046Q0hOOkNISU5BOkd1YW5neGk6SGVjaGkKKzI1OkNOOkNITjpDSElOQTpHdWFuZ3hpOkhlbmcgWGlhbgorMjY6Q046Q0hOOkNISU5BOkd1YW5neGk6SGVwdQorMjc6Q046Q0hOOkNISU5BOkd1YW5neGk6SGVzaGFuIFNoaQorMjg6Q046Q0hOOkNISU5BOkd1YW5neGk6SHVhbmppYW5nCisyOTpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpKaW5neGkKKzMwOkNOOkNITjpDSElOQTpHdWFuZ3hpOkppbnhpdQorMzE6Q046Q0hOOkNISU5BOkd1YW5neGk6TGFpYmluCiszMjpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpMZXllCiszMzpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpMaW5nY2h1YW4KKzM0OkNOOkNITjpDSElOQTpHdWFuZ3hpOkxpbmdzaGFuCiszNTpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpMaW5ndWkKKzM2OkNOOkNITjpDSElOQTpHdWFuZ3hpOkxpbmd5dW4KKzM3OkNOOkNITjpDSElOQTpHdWFuZ3hpOkxpcHUKKzM4OkNOOkNITjpDSElOQTpHdWFuZ3hpOkxpdWNoZW5nCiszOTpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpMaXVqaWFuZworNDA6Q046Q0hOOkNISU5BOkd1YW5neGk6TGl1emhvdSBTaGkKKzQxOkNOOkNITjpDSElOQTpHdWFuZ3hpOkxvbmcgQW4KKzQyOkNOOkNITjpDSElOQTpHdWFuZ3hpOkxvbmdsaW4KKzQzOkNOOkNITjpDSElOQTpHdWFuZ3hpOkxvbmdzaGVuZworNDQ6Q046Q0hOOkNISU5BOkd1YW5neGk6TG9uZ3pob3UKKzQ1OkNOOkNITjpDSElOQTpHdWFuZ3hpOkx1Y2h1YW4KKzQ2OkNOOkNITjpDSElOQTpHdWFuZ3hpOkx1b2NoZW5nCis0NzpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpMdXpoYWkKKzQ4OkNOOkNITjpDSElOQTpHdWFuZ3hpOk1hc2hhbgorNDk6Q046Q0hOOkNISU5BOkd1YW5neGk6TWVuZ3NoYW4KKzUwOkNOOkNITjpDSElOQTpHdWFuZ3hpOk5hbmRhbgorNTE6Q046Q0hOOkNISU5BOkd1YW5neGk6TmFubmluZworNTI6Q046Q0hOOkNISU5BOkd1YW5neGk6TmFwbworNTM6Q046Q0hOOkNISU5BOkd1YW5neGk6TmluZ21pbmcKKzU0OkNOOkNITjpDSElOQTpHdWFuZ3hpOlBpbmdndW8KKzU1OkNOOkNITjpDSElOQTpHdWFuZ3hpOlBpbmdsZQorNTY6Q046Q0hOOkNISU5BOkd1YW5neGk6UGluZ25hbgorNTc6Q046Q0hOOkNISU5BOkd1YW5neGk6UGluZ3hpYW5nIFNoaQorNTg6Q046Q0hOOkNISU5BOkd1YW5neGk6UHViZWkKKzU5OkNOOkNITjpDSElOQTpHdWFuZ3hpOlFpbnpob3UKKzYwOkNOOkNITjpDSElOQTpHdWFuZ3hpOlF1YW56aG91Cis2MTpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpSb25nIEFuCis2MjpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpSb25nIFhpYW4KKzYzOkNOOkNITjpDSElOQTpHdWFuZ3hpOlJvbmdzaHVpCis2NDpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpTYW5qaWFuZworNjU6Q046Q0hOOkNISU5BOkd1YW5neGk6U2hhbmdsaW4KKzY2OkNOOkNITjpDSElOQTpHdWFuZ3hpOlNoYW5nc2kKKzY3OkNOOkNITjpDSElOQTpHdWFuZ3hpOlRlbmcgWGlhbgorNjg6Q046Q0hOOkNISU5BOkd1YW5neGk6VGlhbiBFCis2OTpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpUaWFuZGVuZworNzA6Q046Q0hOOkNISU5BOkd1YW5neGk6VGlhbmRvbmcKKzcxOkNOOkNITjpDSElOQTpHdWFuZ3hpOlRpYW5saW4KKzcyOkNOOkNITjpDSElOQTpHdWFuZ3hpOlRpYW55YW5nCis3MzpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpXdW1pbmcKKzc0OkNOOkNITjpDSElOQTpHdWFuZ3hpOld1eHVhbgorNzU6Q046Q0hOOkNISU5BOkd1YW5neGk6V3V6aG91IFNoaQorNzY6Q046Q0hOOkNISU5BOkd1YW5neGk6WGlhbmd6aG91Cis3NzpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpYaWxpbgorNzg6Q046Q0hOOkNISU5BOkd1YW5neGk6WGluY2hlbmcKKzc5OkNOOkNITjpDSElOQTpHdWFuZ3hpOlhpbmcgQW4KKzgwOkNOOkNITjpDSElOQTpHdWFuZ3hpOllhbmdzaG91Cis4MTpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpZaXNoYW4KKzgyOkNOOkNITjpDSElOQTpHdWFuZ3hpOllvbmdmdQorODM6Q046Q0hOOkNISU5BOkd1YW5neGk6WW9uZ25pbmcKKzg0OkNOOkNITjpDSElOQTpHdWFuZ3hpOll1bGluCis4NTpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpaaGFvcGluZworODY6Q046Q0hOOkNISU5BOkd1YW5neGk6WmhvbmdzaGFuCis4NzpDTjpDSE46Q0hJTkE6R3Vhbmd4aTpaaXl1YW4KKzE6Q046Q0hOOkNISU5BOlNoYWFueGk6QW5rYW5nCisyOkNOOkNITjpDSElOQTpTaGFhbnhpOkFuc2FpCiszOkNOOkNITjpDSElOQTpTaGFhbnhpOkJhaWhlCis0OkNOOkNITjpDSElOQTpTaGFhbnhpOkJhaXNodWkKKzU6Q046Q0hOOkNISU5BOlNoYWFueGk6QmFvamkKKzY6Q046Q0hOOkNISU5BOlNoYWFueGk6QmFvamkgU2hpcXUKKzc6Q046Q0hOOkNISU5BOlNoYWFueGk6QmluIFhpYW4KKzg6Q046Q0hOOkNISU5BOlNoYWFueGk6Q2hhbmcgQW4KKzk6Q046Q0hOOkNISU5BOlNoYWFueGk6Q2hhbmd3dQorMTA6Q046Q0hOOkNISU5BOlNoYWFueGk6Q2hlbmdjaGVuZworMTE6Q046Q0hOOkNISU5BOlNoYWFueGk6Q2hlbmdndQorMTI6Q046Q0hOOkNISU5BOlNoYWFueGk6Q2h1bmh1YQorMTM6Q046Q0hOOkNISU5BOlNoYWFueGk6RGFsaQorMTQ6Q046Q0hOOkNISU5BOlNoYWFueGk6RGFuZmVuZworMTU6Q046Q0hOOkNISU5BOlNoYWFueGk6RGluZ2JpYW4KKzE2OkNOOkNITjpDSElOQTpTaGFhbnhpOkZlbmcgWGlhbgorMTc6Q046Q0hOOkNISU5BOlNoYWFueGk6RmVuZ3hpYW5nCisxODpDTjpDSE46Q0hJTkE6U2hhYW54aTpGb3BpbmcKKzE5OkNOOkNITjpDSElOQTpTaGFhbnhpOkZ1IFhpYW4KKzIwOkNOOkNITjpDSElOQTpTaGFhbnhpOkZ1ZmVuZworMjE6Q046Q0hOOkNISU5BOlNoYWFueGk6RnVndQorMjI6Q046Q0hOOkNISU5BOlNoYWFueGk6RnVwaW5nCisyMzpDTjpDSE46Q0hJTkE6U2hhYW54aTpHYW5xdWFuCisyNDpDTjpDSE46Q0hJTkE6U2hhYW54aTpHYW9saW5nCisyNTpDTjpDSE46Q0hJTkE6U2hhYW54aTpIYW5jaGVuZworMjY6Q046Q0hOOkNISU5BOlNoYWFueGk6SGFueWluCisyNzpDTjpDSE46Q0hJTkE6U2hhYW54aTpIYW56aG9uZyBTaGkKKzI4OkNOOkNITjpDSElOQTpTaGFhbnhpOkhlbmdzaGFuCisyOTpDTjpDSE46Q0hJTkE6U2hhYW54aTpIZXlhbmcKKzMwOkNOOkNITjpDSElOQTpTaGFhbnhpOkh1IFhpYW4KKzMxOkNOOkNITjpDSElOQTpTaGFhbnhpOkh1YSBYaWFuCiszMjpDTjpDSE46Q0hJTkE6U2hhYW54aTpIdWFuZ2xpbmcKKzMzOkNOOkNITjpDSElOQTpTaGFhbnhpOkh1YW5nbG9uZworMzQ6Q046Q0hOOkNISU5BOlNoYWFueGk6SHVheWluCiszNTpDTjpDSE46Q0hJTkE6U2hhYW54aTpKaWEgWGlhbgorMzY6Q046Q0hOOkNISU5BOlNoYWFueGk6SmluZ2JpYW4KKzM3OkNOOkNITjpDSElOQTpTaGFhbnhpOkppbmd5YW5nCiszODpDTjpDSE46Q0hJTkE6U2hhYW54aTpMYW5nYW8KKzM5OkNOOkNITjpDSElOQTpTaGFhbnhpOkxhbnRpYW4KKzQwOkNOOkNITjpDSElOQTpTaGFhbnhpOkxpbnRvbmcKKzQxOkNOOkNITjpDSElOQTpTaGFhbnhpOkxpbnlvdQorNDI6Q046Q0hOOkNISU5BOlNoYWFueGk6TGlxdWFuCis0MzpDTjpDSE46Q0hJTkE6U2hhYW54aTpMaXViYQorNDQ6Q046Q0hOOkNISU5BOlNoYWFueGk6TG9uZyBYaWFuCis0NTpDTjpDSE46Q0hJTkE6U2hhYW54aTpMdWV5YW5nCis0NjpDTjpDSE46Q0hJTkE6U2hhYW54aTpMdW9jaHVhbgorNDc6Q046Q0hOOkNISU5BOlNoYWFueGk6THVvbmFuCis0ODpDTjpDSE46Q0hJTkE6U2hhYW54aTpNZWkgWGlhbgorNDk6Q046Q0hOOkNISU5BOlNoYWFueGk6TWlhbiBYaWFuCis1MDpDTjpDSE46Q0hJTkE6U2hhYW54aTpNaXpoaQorNTE6Q046Q0hOOkNISU5BOlNoYWFueGk6TmFuemhlbmcKKzUyOkNOOkNITjpDSElOQTpTaGFhbnhpOk5pbmdxaWFuZworNTM6Q046Q0hOOkNISU5BOlNoYWFueGk6TmluZ3NoYW4KKzU0OkNOOkNITjpDSElOQTpTaGFhbnhpOlBpbmdsaQorNTU6Q046Q0hOOkNISU5BOlNoYWFueGk6UHVjaGVuZworNTY6Q046Q0hOOkNISU5BOlNoYWFueGk6UWlhbiBYaWFuCis1NzpDTjpDSE46Q0hJTkE6U2hhYW54aTpRaWFueWFuZworNTg6Q046Q0hOOkNISU5BOlNoYWFueGk6UWluZ2ppYW4KKzU5OkNOOkNITjpDSElOQTpTaGFhbnhpOlFpc2hhbgorNjA6Q046Q0hOOkNISU5BOlNoYWFueGk6U2FueXVhbgorNjE6Q046Q0hOOkNISU5BOlNoYWFueGk6U2hhbmcgWGlhbgorNjI6Q046Q0hOOkNISU5BOlNoYWFueGk6U2hhbmduYW4KKzYzOkNOOkNITjpDSElOQTpTaGFhbnhpOlNoYW55YW5nCis2NDpDTjpDSE46Q0hJTkE6U2hhYW54aTpTaGVubXUKKzY1OkNOOkNITjpDSElOQTpTaGFhbnhpOlNoaXFpYW4KKzY2OkNOOkNITjpDSElOQTpTaGFhbnhpOlN1aWRlCis2NzpDTjpDSE46Q0hJTkE6U2hhYW54aTpUYWliYWkKKzY4OkNOOkNITjpDSElOQTpTaGFhbnhpOlRvbmdjaHVhbiBTaGlxdQorNjk6Q046Q0hOOkNISU5BOlNoYWFueGk6VG9uZ2d1YW4KKzcwOkNOOkNITjpDSElOQTpTaGFhbnhpOldlaW5hbgorNzE6Q046Q0hOOkNISU5BOlNoYWFueGk6V3VidQorNzI6Q046Q0hOOkNISU5BOlNoYWFueGk6V3Vnb25nCis3MzpDTjpDSE46Q0hJTkE6U2hhYW54aTpXdXFpCis3NDpDTjpDSE46Q0hJTkE6U2hhYW54aTpYaSBBbiBTaGlxdQorNzU6Q046Q0hOOkNISU5BOlNoYWFueGk6WGlhbnlhbmcgU2hpCis3NjpDTjpDSE46Q0hJTkE6U2hhYW54aTpYaW5ncGluZworNzc6Q046Q0hOOkNISU5BOlNoYWFueGk6WGl4aWFuZworNzg6Q046Q0hOOkNISU5BOlNoYWFueGk6WHVueWFuZworNzk6Q046Q0hOOkNISU5BOlNoYWFueGk6WHVueWkKKzgwOkNOOkNITjpDSElOQTpTaGFhbnhpOllhbiBBbiBTaGkKKzgxOkNOOkNITjpDSElOQTpTaGFhbnhpOllhbmNoYW5nCis4MjpDTjpDSE46Q0hJTkE6U2hhYW54aTpZYW5jaHVhbgorODM6Q046Q0hOOkNISU5BOlNoYWFueGk6WWFuZyBYaWFuCis4NDpDTjpDSE46Q0hJTkE6U2hhYW54aTpZYW8gWGlhbgorODU6Q046Q0hOOkNISU5BOlNoYWFueGk6WWljaHVhbgorODY6Q046Q0hOOkNISU5BOlNoYWFueGk6WWlqdW4KKzg3OkNOOkNITjpDSElOQTpTaGFhbnhpOllvbmdzaG91Cis4ODpDTjpDSE46Q0hJTkE6U2hhYW54aTpZdWxpbgorODk6Q046Q0hOOkNISU5BOlNoYWFueGk6Wmhhc2h1aQorOTA6Q046Q0hOOkNISU5BOlNoYWFueGk6WmhlbiBBbgorOTE6Q046Q0hOOkNISU5BOlNoYWFueGk6WmhlbmdiYQorOTI6Q046Q0hOOkNISU5BOlNoYWFueGk6WmhlbnBpbmcKKzkzOkNOOkNITjpDSElOQTpTaGFhbnhpOlpoaWRhbgorOTQ6Q046Q0hOOkNISU5BOlNoYWFueGk6WmhvdXpoaQorOTU6Q046Q0hOOkNISU5BOlNoYWFueGk6WmljaGFuZworOTY6Q046Q0hOOkNISU5BOlNoYWFueGk6Wml5YW5nCis5NzpDTjpDSE46Q0hJTkE6U2hhYW54aTpaaXpob3UKKzE6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpBY2hlbmcKKzI6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpBaWh1aQorMzpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOkFuZGEKKzQ6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpCYWlxdWFuCis1OkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6QmFvcWluZworNjpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOkJheWFuCis3OkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6QmVpYW4KKzg6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpCaW4gWGlhbgorOTpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOkJvbGkKKzEwOkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6RGFxaW5hIFNoaQorMTE6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpEZWR1CisxMjpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOkRvbmduaW5nCisxMzpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOkRvcmJvZAorMTQ6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpGYW5nemhlbmcKKzE1OkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6RnVqaW4KKzE2OkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6RnV5dQorMTc6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpGdXl1YW4KKzE4OkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6R2FubmFuCisxOTpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOkhhaWxpbgorMjA6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpIYWlsdW4KKzIxOkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6SGFyYmluIFNoaQorMjI6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpIZWdhbmcgU2hpCisyMzpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOkhlaWhlIFNoaQorMjQ6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpIdWEgTmFuCisyNTpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOkh1YWNodWFuCisyNjpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOkh1bGFuCisyNzpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOkh1bGluCisyODpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOkh1bWEKKzI5OkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6SmlhbXVzaSBTaGkKKzMwOkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6SmlheWluCiszMTpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOkppZG9uZworMzI6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpKaXhpIFNoaQorMzM6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpKaXhpYW4KKzM0OkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6S2Vkb25nCiszNTpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOktlc2hhbgorMzY6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpMYW54aQorMzc6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpMaW5kaWFuCiszODpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOkxpbmtvdQorMzk6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpMb25namlhbmcKKzQwOkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6THVvYmVpCis0MTpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOk1pbmdzaHVpCis0MjpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOk1pc2hhbgorNDM6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpNb2hlCis0NDpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOk11ZGFuamlhbmcgU2hpCis0NTpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOk11bGFuCis0NjpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOk11bGluZworNDc6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpOZWhlCis0ODpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOk5lbmppYW5nCis0OTpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOk5pbmcgQW4KKzUwOkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6UWluZyBBbgorNTE6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpRaW5nZ2FuZworNTI6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpRaXFpaGFyIFNoaQorNTM6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpRaXRhaWhlIFNoaQorNTQ6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpSYW9oZQorNTU6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpTaGFuZ3poaQorNTY6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpTaHVhbmdjaGVuZworNTc6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpTaHVhbmd5YXNoYW4gU2hpCis1ODpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOlN1aWJpbgorNTk6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpTdWlmZW5oZSBTaGkKKzYwOkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6U3VpaHVhCis2MTpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOlN1aWxlbmcKKzYyOkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6U3Vud3UKKzYzOkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6VGFoZQorNjQ6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpUYWlsYWkKKzY1OkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6VGFuZ3l1YW4KKzY2OkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6VGllbGkKKzY3OkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6VG9uZ2hlCis2ODpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOlRvbmdqaWFuZworNjk6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpXYW5na3VpCis3MDpDTjpDSE46Q0hJTkE6SGVpbG9uZ2ppYW5nOld1Y2hhbmcKKzcxOkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6WHVua2UKKzcyOkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6WWFuc2hvdQorNzM6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpZaSBBbgorNzQ6Q046Q0hOOkNISU5BOkhlaWxvbmdqaWFuZzpZaWNodW4gU2hpcXUKKzc1OkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6WWlsYW4KKzc2OkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6Wmhhb2RvbmcKKzc3OkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6Wmhhb3l1YW4KKzc4OkNOOkNITjpDSElOQTpIZWlsb25namlhbmc6Wmhhb3pob3UKKzE6Q046Q0hOOkNISU5BOlpoZWppYW5nOkFuamkKKzI6Q046Q0hOOkNISU5BOlpoZWppYW5nOkNhbmduYW4KKzM6Q046Q0hOOkNISU5BOlpoZWppYW5nOkNoYW5nc2hhbgorNDpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6Q2hhbmd4aW5nCis1OkNOOkNITjpDSElOQTpaaGVqaWFuZzpDaHVuYW4KKzY6Q046Q0hOOkNISU5BOlpoZWppYW5nOkNpeGkKKzc6Q046Q0hOOkNISU5BOlpoZWppYW5nOkRlcWluZworODpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6RGluZ2hhaQorOTpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6RG9uZ3lhbmcKKzEwOkNOOkNITjpDSElOQTpaaGVqaWFuZzpGZW5naHVhCisxMTpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6RnV5YW5nCisxMjpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6SGFpbmluZworMTM6Q046Q0hOOkNISU5BOlpoZWppYW5nOkhhaXlhbgorMTQ6Q046Q0hOOkNISU5BOlpoZWppYW5nOkhhbmd6aG91IFNoaXF1CisxNTpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6SHVhbmd5YW4KKzE2OkNOOkNITjpDSElOQTpaaGVqaWFuZzpIdXpob3UKKzE3OkNOOkNITjpDSElOQTpaaGVqaWFuZzpKaWFuZGUKKzE4OkNOOkNITjpDSElOQTpaaGVqaWFuZzpKaWFuZ3NoYW4KKzE5OkNOOkNITjpDSElOQTpaaGVqaWFuZzpKaWFvamlhbmcgU2hpCisyMDpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6Smlhc2hhbgorMjE6Q046Q0hOOkNISU5BOlpoZWppYW5nOkppYXhpbmcKKzIyOkNOOkNITjpDSElOQTpaaGVqaWFuZzpKaW5odWEgU2hpCisyMzpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6Sml5dW4KKzI0OkNOOkNITjpDSElOQTpaaGVqaWFuZzpLYWlodWEKKzI1OkNOOkNITjpDSElOQTpaaGVqaWFuZzpMYW54aQorMjY6Q046Q0hOOkNISU5BOlpoZWppYW5nOkxlcWluZworMjc6Q046Q0hOOkNISU5BOlpoZWppYW5nOkxpbmFuCisyODpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6TGluaGFpCisyOTpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6TGlzaHVpCiszMDpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6TG9uZ3F1YW4KKzMxOkNOOkNITjpDSElOQTpaaGVqaWFuZzpOaW5nYm8gU2hpcXUKKzMyOkNOOkNITjpDSElOQTpaaGVqaWFuZzpOaW5naGFpCiszMzpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6UGluZ2h1CiszNDpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6UGluZ3lhbmcKKzM1OkNOOkNITjpDSElOQTpaaGVqaWFuZzpQdWppYW5nCiszNjpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6UHV0dW8KKzM3OkNOOkNITjpDSElOQTpaaGVqaWFuZzpRaW5ndGlhbgorMzg6Q046Q0hOOkNISU5BOlpoZWppYW5nOlFpbmd5dWFuCiszOTpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6UXVoYWkKKzQwOkNOOkNITjpDSElOQTpaaGVqaWFuZzpRdXpob3UgU2hpCis0MTpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6UnVpYW4KKzQyOkNOOkNITjpDSElOQTpaaGVqaWFuZzpTYW5tZW4KKzQzOkNOOkNITjpDSElOQTpaaGVqaWFuZzpTaGFuZ3l1Cis0NDpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6U2hhb3hpbmcgU2hpCis0NTpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6U2hlbmcgWGlhbgorNDY6Q046Q0hOOkNISU5BOlpoZWppYW5nOlNodWljaGFuZworNDc6Q046Q0hOOkNISU5BOlpoZWppYW5nOlNvbmd5YW5nCis0ODpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6VGFpc2h1bgorNDk6Q046Q0hOOkNISU5BOlpoZWppYW5nOlRpYW50YWkKKzUwOkNOOkNITjpDSElOQTpaaGVqaWFuZzpUb25nbHUKKzUxOkNOOkNITjpDSElOQTpaaGVqaWFuZzpUb25neGlhbmcKKzUyOkNOOkNITjpDSElOQTpaaGVqaWFuZzpXZW5jaGVuZworNTM6Q046Q0hOOkNISU5BOlpoZWppYW5nOldlbmxpbmcKKzU0OkNOOkNITjpDSElOQTpaaGVqaWFuZzpXZW56aG91IFNoaXF1Cis1NTpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6V3V5aQorNTY6Q046Q0hOOkNISU5BOlpoZWppYW5nOlhpYW5nc2hhbgorNTc6Q046Q0hOOkNISU5BOlpoZWppYW5nOlhpYW5qdQorNTg6Q046Q0hOOkNISU5BOlpoZWppYW5nOlhpYW9zaGFuCis1OTpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6WGluY2hhbmcKKzYwOkNOOkNITjpDSElOQTpaaGVqaWFuZzpZaW4gWGlhbgorNjE6Q046Q0hOOkNISU5BOlpoZWppYW5nOllpd3UKKzYyOkNOOkNITjpDSElOQTpaaGVqaWFuZzpZb25namlhCis2MzpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6WW9uZ2thbmcKKzY0OkNOOkNITjpDSElOQTpaaGVqaWFuZzpZdWhhbmcKKzY1OkNOOkNITjpDSElOQTpaaGVqaWFuZzpZdWh1YW4KKzY2OkNOOkNITjpDSElOQTpaaGVqaWFuZzpZdW5oZQorNjc6Q046Q0hOOkNISU5BOlpoZWppYW5nOll1eWFvCis2ODpDTjpDSE46Q0hJTkE6Wmhlamlhbmc6WmhlbmhhaQorNjk6Q046Q0hOOkNISU5BOlpoZWppYW5nOlpodWppCisxOkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpBa3FpCisyOkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpBa3N1CiszOkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpBa3RvCis0OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpBbHRheQorNTpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6QXJ0dXgKKzY6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOkF3YXQKKzc6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOkJhY2h1Cis4OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpCYWljaGVuZworOTpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6QmFya29sCisxMDpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6Qm9odQorMTE6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOkJvbGUKKzEyOkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpCdXJxaW4KKzEzOkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpDaGFuZ2ppCisxNDpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6RW1pbgorMTU6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOkZ1aGFpCisxNjpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6RnVrYW5nCisxNzpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6RnV5dW4KKzE4OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpHb25nbGl1CisxOTpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6SGFiYWhlCisyMDpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6SGFtaQorMjE6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOkhhbWkgU2hpCisyMjpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6SGVqaW5nCisyMzpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6SG9ib2tzYXIKKzI0OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpIb3RhbgorMjU6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOkhveHVkCisyNjpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6SHVvY2hlbmcKKzI3OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpIdXR1YmkKKzI4OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpKZW1pbmF5CisyOTpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6Smlhc2hpCiszMDpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6Smltc2FyCiszMTpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6SmluZ2hlCiszMjpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6S2FscGluCiszMzpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6S2FyYW1heSBTaGkKKzM0OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpLYXNoaSBTaGkKKzM1OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpLb3JsYQorMzY6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOktvcmxhIFNoaQorMzc6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOkt1cWEKKzM4OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpLdXl0dW4gU2hpCiszOTpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6TG9wCis0MDpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6THVudGFpCis0MTpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6TWFuYXMKKzQyOkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpNYXJraXQKKzQzOkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpNaW5mZW5nCis0NDpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6TWlxdWFuCis0NTpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6TW9yaQorNDY6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOk1veXUKKzQ3OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpOaWxrYQorNDg6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOlBpc2hhbgorNDk6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOlFhcHFhaQorNTA6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOlFpZW1vCis1MTpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6UWluZ2hlCis1MjpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6UWlyYQorNTM6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOlFpdGFpCis1NDpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6UnVvcWlhbmcKKzU1OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpTaGFjaGUKKzU2OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpTaGFuc2hhbgorNTc6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOlNoYXdhbgorNTg6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOlNoaWhlemkgU2hpCis1OTpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6U2h1ZnUKKzYwOkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpTaHVsZQorNjE6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOlRhY2hlbmcKKzYyOkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpUYXhrb3JnYW4KKzYzOkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpUZWtlcworNjQ6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOlRva3N1bgorNjU6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOlRvbGkKKzY2OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpUdXJwYW4KKzY3OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpVcnVtcWkKKzY4OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpVcnVtcWkgU2hpcXUKKzY5OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpVc3UKKzcwOkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpXZW5xdWFuCis3MTpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6V2Vuc3UKKzcyOkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpXdXFpYQorNzM6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOld1c2hpCis3NDpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6WGF5YXIKKzc1OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpYaW5oZQorNzY6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOlhpbnl1YW4KKzc3OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpZYW5xaQorNzg6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOlllY2hlbmcKKzc5OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpZZW5naXNhcgorODA6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOllpbmluZworODE6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOllpbmluZyBTaGkKKzgyOkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpZaXd1Cis4MzpDTjpDSE46Q0hJTkE6WGluamlhbmcgVXlndXI6WW9wdXJnYQorODQ6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOll1bGkKKzg1OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpZdW1pbgorODY6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOll1dGlhbgorODc6Q046Q0hOOkNISU5BOlhpbmppYW5nIFV5Z3VyOlplcHUKKzg4OkNOOkNITjpDSElOQTpYaW5qaWFuZyBVeWd1cjpaaGFvc3UKKzE6Q046Q0hOOkNISU5BOkppYW5neGk6QW5mdQorMjpDTjpDSE46Q0hJTkE6Smlhbmd4aTpBbnlpCiszOkNOOkNITjpDSElOQTpKaWFuZ3hpOkFueXVhbgorNDpDTjpDSE46Q0hJTkE6Smlhbmd4aTpCb3lhbmcKKzU6Q046Q0hOOkNISU5BOkppYW5neGk6Q2hvbmdyZW4KKzY6Q046Q0hOOkNISU5BOkppYW5neGk6Q2hvbmd5aQorNzpDTjpDSE46Q0hJTkE6Smlhbmd4aTpEYXl1Cis4OkNOOkNITjpDSElOQTpKaWFuZ3hpOkRlIEFuCis5OkNOOkNITjpDSElOQTpKaWFuZ3hpOkRleGluZworMTA6Q046Q0hOOkNISU5BOkppYW5neGk6RGluZ25hbgorMTE6Q046Q0hOOkNISU5BOkppYW5neGk6RG9uZ3hpYW5nCisxMjpDTjpDSE46Q0hJTkE6Smlhbmd4aTpEdWNoYW5nCisxMzpDTjpDSE46Q0hJTkE6Smlhbmd4aTpGZW5jaGVuZworMTQ6Q046Q0hOOkNISU5BOkppYW5neGk6RmVuZ3hpbgorMTU6Q046Q0hOOkNISU5BOkppYW5neGk6RmVuZ3lpCisxNjpDTjpDSE46Q0hJTkE6Smlhbmd4aTpGdXpob3UgU2hpCisxNzpDTjpDSE46Q0hJTkE6Smlhbmd4aTpHYW4gWGlhbgorMTg6Q046Q0hOOkNISU5BOkppYW5neGk6R2FuemhvdSBTaGkKKzE5OkNOOkNITjpDSElOQTpKaWFuZ3hpOkdhb2FuCisyMDpDTjpDSE46Q0hJTkE6Smlhbmd4aTpHdWFuZ2NoYW5nCisyMTpDTjpDSE46Q0hJTkE6Smlhbmd4aTpHdWFuZ2ZlbgorMjI6Q046Q0hOOkNISU5BOkppYW5neGk6R3VpeGkKKzIzOkNOOkNITjpDSElOQTpKaWFuZ3hpOkhlbmdmZW5nCisyNDpDTjpDSE46Q0hJTkE6Smlhbmd4aTpIdWljaGFuZworMjU6Q046Q0hOOkNISU5BOkppYW5neGk6SHVrb3UKKzI2OkNOOkNITjpDSElOQTpKaWFuZ3hpOkppIEFuCisyNzpDTjpDSE46Q0hJTkE6Smlhbmd4aTpKaSBBbiBTaGkKKzI4OkNOOkNITjpDSElOQTpKaWFuZ3hpOkppbmcgQW4KKzI5OkNOOkNITjpDSElOQTpKaWFuZ3hpOkppbmdkZXpoZW4gU2hpCiszMDpDTjpDSE46Q0hJTkE6Smlhbmd4aTpKaW5nZ2FuZ3NoYW4KKzMxOkNOOkNITjpDSElOQTpKaWFuZ3hpOkppbnhpCiszMjpDTjpDSE46Q0hJTkE6Smlhbmd4aTpKaW54aWFuCiszMzpDTjpDSE46Q0hJTkE6Smlhbmd4aTpKaXNodWkKKzM0OkNOOkNITjpDSElOQTpKaWFuZ3hpOkppdWppYW5nCiszNTpDTjpDSE46Q0hJTkE6Smlhbmd4aTpKaXVqaWFuZyBTaGkKKzM2OkNOOkNITjpDSElOQTpKaWFuZ3hpOkxlYW4KKzM3OkNOOkNITjpDSElOQTpKaWFuZ3hpOkxlcGluZworMzg6Q046Q0hOOkNISU5BOkppYW5neGk6TGlhbmh1YQorMzk6Q046Q0hOOkNISU5BOkppYW5neGk6TGljaHVhbgorNDA6Q046Q0hOOkNISU5BOkppYW5neGk6TGluY2h1YW4KKzQxOkNOOkNITjpDSElOQTpKaWFuZ3hpOkxvbmduYW4KKzQyOkNOOkNITjpDSElOQTpKaWFuZ3hpOk5hbmNoYW5nCis0MzpDTjpDSE46Q0hJTkE6Smlhbmd4aTpOYW5jaGFuZyBTaGlxdQorNDQ6Q046Q0hOOkNISU5BOkppYW5neGk6TmFuY2hlbmcKKzQ1OkNOOkNITjpDSElOQTpKaWFuZ3hpOk5hbmZlbmcKKzQ2OkNOOkNITjpDSElOQTpKaWFuZ3hpOk5hbmthbmcKKzQ3OkNOOkNITjpDSElOQTpKaWFuZ3hpOk5pbmdkdQorNDg6Q046Q0hOOkNISU5BOkppYW5neGk6TmluZ2dhbmcKKzQ5OkNOOkNITjpDSElOQTpKaWFuZ3hpOlBlbmd6ZQorNTA6Q046Q0hOOkNISU5BOkppYW5neGk6UGluZ3hpYW5nIFNoaQorNTE6Q046Q0hOOkNISU5BOkppYW5neGk6UWlhbnNoYW4KKzUyOkNOOkNITjpDSElOQTpKaWFuZ3hpOlFpbmdqaWFuZworNTM6Q046Q0hOOkNISU5BOkppYW5neGk6UXVhbm5hbgorNTQ6Q046Q0hOOkNISU5BOkppYW5neGk6UnVpY2hhbmcKKzU1OkNOOkNITjpDSElOQTpKaWFuZ3hpOlJ1aWppbgorNTY6Q046Q0hOOkNISU5BOkppYW5neGk6U2hhbmdnYW8KKzU3OkNOOkNITjpDSElOQTpKaWFuZ3hpOlNoYW5ncmFvCis1ODpDTjpDSE46Q0hJTkE6Smlhbmd4aTpTaGFuZ3JhbyBTaGkKKzU5OkNOOkNITjpDSElOQTpKaWFuZ3hpOlNoYW5neW91Cis2MDpDTjpDSE46Q0hJTkE6Smlhbmd4aTpTaGljaGVuZworNjE6Q046Q0hOOkNISU5BOkppYW5neGk6U3VpY2h1YW4KKzYyOkNOOkNITjpDSElOQTpKaWFuZ3hpOlRhaWhlCis2MzpDTjpDSE46Q0hJTkE6Smlhbmd4aTpUb25nZ3UKKzY0OkNOOkNITjpDSElOQTpKaWFuZ3hpOldhbiBBbgorNjU6Q046Q0hOOkNISU5BOkppYW5neGk6V2FubmlhbgorNjY6Q046Q0hOOkNISU5BOkppYW5neGk6V2FuemFpCis2NzpDTjpDSE46Q0hJTkE6Smlhbmd4aTpXdW5pbmcKKzY4OkNOOkNITjpDSElOQTpKaWFuZ3hpOld1eXVhbgorNjk6Q046Q0hOOkNISU5BOkppYW5neGk6WGlhamlhbmcKKzcwOkNOOkNITjpDSElOQTpKaWFuZ3hpOlhpbmZlbmcKKzcxOkNOOkNITjpDSElOQTpKaWFuZ3hpOlhpbmdhbgorNzI6Q046Q0hOOkNISU5BOkppYW5neGk6WGluZ2d1bworNzM6Q046Q0hOOkNISU5BOkppYW5neGk6WGluZ3ppCis3NDpDTjpDSE46Q0hJTkE6Smlhbmd4aTpYaW5qaWFuCis3NTpDTjpDSE46Q0hJTkE6Smlhbmd4aTpYaW55dQorNzY6Q046Q0hOOkNISU5BOkppYW5neGk6WGl1c2h1aQorNzc6Q046Q0hOOkNISU5BOkppYW5neGk6WHVud3UKKzc4OkNOOkNITjpDSElOQTpKaWFuZ3hpOllpY2h1bgorNzk6Q046Q0hOOkNISU5BOkppYW5neGk6WWljaHVuIFNoaQorODA6Q046Q0hOOkNISU5BOkppYW5neGk6WWlmZW5nCis4MTpDTjpDSE46Q0hJTkE6Smlhbmd4aTpZaWh1YW5nCis4MjpDTjpDSE46Q0hJTkE6Smlhbmd4aTpZaW5ndGFuIFNoaQorODM6Q046Q0hOOkNISU5BOkppYW5neGk6WWl5YW5nCis4NDpDTjpDSE46Q0hJTkE6Smlhbmd4aTpZb25nZmVuZworODU6Q046Q0hOOkNISU5BOkppYW5neGk6WW9uZ3hpbgorODY6Q046Q0hOOkNISU5BOkppYW5neGk6WW9uZ3hpdQorODc6Q046Q0hOOkNISU5BOkppYW5neGk6WXVkdQorODg6Q046Q0hOOkNISU5BOkppYW5neGk6WXVnYW4KKzg5OkNOOkNITjpDSElOQTpKaWFuZ3hpOll1amlhbmcKKzkwOkNOOkNITjpDSElOQTpKaWFuZ3hpOll1c2hhbgorOTE6Q046Q0hOOkNISU5BOkppYW5neGk6Wml4aQorMTpDTjpDSE46Q0hJTkE6R2Fuc3U6QWtzYXkKKzI6Q046Q0hOOkNISU5BOkdhbnN1OkFueGkKKzM6Q046Q0hOOkNISU5BOkdhbnN1OkNoZW5nIFhpYW4KKzQ6Q046Q0hOOkNISU5BOkdhbnN1OkNob25neGluCis1OkNOOkNITjpDSElOQTpHYW5zdTpEYW5nY2hhbmcKKzY6Q046Q0hOOkNISU5BOkdhbnN1OkRpbmd4aQorNzpDTjpDSE46Q0hJTkE6R2Fuc3U6RG9vZ3hpYW5nCis4OkNOOkNITjpDSElOQTpHYW5zdTpEdW5odWFuZworOTpDTjpDSE46Q0hJTkE6R2Fuc3U6R2FuZ3UKKzEwOkNOOkNITjpDSElOQTpHYW5zdTpHYW9sYW4KKzExOkNOOkNITjpDSElOQTpHYW5zdTpHYW90YWkKKzEyOkNOOkNITjpDSElOQTpHYW5zdTpHdWFuZ2hlCisxMzpDTjpDSE46Q0hJTkE6R2Fuc3U6R3VsYW5nCisxNDpDTjpDSE46Q0hJTkE6R2Fuc3U6SGVzaHVpCisxNTpDTjpDSE46Q0hJTkE6R2Fuc3U6SGV6aGVuZworMTY6Q046Q0hOOkNISU5BOkdhbnN1Okh1YWNoaQorMTc6Q046Q0hOOkNISU5BOkdhbnN1Okh1YW4gWGlhbgorMTg6Q046Q0hOOkNISU5BOkdhbnN1Okh1YXRpbmcKKzE5OkNOOkNITjpDSElOQTpHYW5zdTpIdWkgWGlhbgorMjA6Q046Q0hOOkNISU5BOkdhbnN1Okh1aW5pbmcKKzIxOkNOOkNITjpDSElOQTpHYW5zdTpKaWF5dWd1YW4gU2hpCisyMjpDTjpDSE46Q0hJTkE6R2Fuc3U6SmluY2hhbmcgU2hpcXUKKzIzOkNOOkNITjpDSElOQTpHYW5zdTpKaW5nY2h1YW4KKzI0OkNOOkNITjpDSElOQTpHYW5zdTpKaW5nbmluZworMjU6Q046Q0hOOkNISU5BOkdhbnN1Okppbmd0YWkKKzI2OkNOOkNITjpDSElOQTpHYW5zdTpKaW5neXVhbgorMjc6Q046Q0hOOkNISU5BOkdhbnN1OkppbnRhCisyODpDTjpDSE46Q0hJTkE6R2Fuc3U6SmlzaGlzaGFuCisyOTpDTjpDSE46Q0hJTkE6R2Fuc3U6Sml1cXVhbgorMzA6Q046Q0hOOkNISU5BOkdhbnN1OkpvbmUKKzMxOkNOOkNITjpDSElOQTpHYW5zdTpLYW5nIFhpYW4KKzMyOkNOOkNITjpDSElOQTpHYW5zdTpLYW5nbGUKKzMzOkNOOkNITjpDSElOQTpHYW5zdTpMYW56aG91IFNoaXF1CiszNDpDTjpDSE46Q0hJTkE6R2Fuc3U6TGkgWGlhbgorMzU6Q046Q0hOOkNISU5BOkdhbnN1OkxpYW5nZGFuZworMzY6Q046Q0hOOkNISU5BOkdhbnN1Okxpbmd0YWkKKzM3OkNOOkNITjpDSElOQTpHYW5zdTpMaW5ndGFvCiszODpDTjpDSE46Q0hJTkE6R2Fuc3U6TGludGFuCiszOTpDTjpDSE46Q0hJTkE6R2Fuc3U6TGlueGlhCis0MDpDTjpDSE46Q0hJTkE6R2Fuc3U6TGluemUKKzQxOkNOOkNITjpDSElOQTpHYW5zdTpMb25neGkKKzQyOkNOOkNITjpDSElOQTpHYW5zdTpMdXF1Cis0MzpDTjpDSE46Q0hJTkE6R2Fuc3U6TWFxdQorNDQ6Q046Q0hOOkNISU5BOkdhbnN1Ok1pbiBYaWFuCis0NTpDTjpDSE46Q0hJTkE6R2Fuc3U6TWlubGUKKzQ2OkNOOkNITjpDSElOQTpHYW5zdTpNaW5xaW4KKzQ3OkNOOkNITjpDSElOQTpHYW5zdTpOaW5nIFhpYW4KKzQ4OkNOOkNITjpDSElOQTpHYW5zdTpQaW5nbGlhbmcKKzQ5OkNOOkNITjpDSElOQTpHYW5zdTpRaW4gQW4KKzUwOkNOOkNITjpDSElOQTpHYW5zdTpRaW5nc2h1aQorNTE6Q046Q0hOOkNISU5BOkdhbnN1OlFpbmd5YW5nCis1MjpDTjpDSE46Q0hJTkE6R2Fuc3U6U2hhbmRhbgorNTM6Q046Q0hOOkNISU5BOkdhbnN1OlN1YmVpCis1NDpDTjpDSE46Q0hJTkE6R2Fuc3U6U3VuYW4KKzU1OkNOOkNITjpDSElOQTpHYW5zdTpUZXdvCis1NjpDTjpDSE46Q0hJTkE6R2Fuc3U6VGlhbnNodWkKKzU3OkNOOkNITjpDSElOQTpHYW5zdTpUaWFuc2h1aSBTaGkKKzU4OkNOOkNITjpDSElOQTpHYW5zdTpUaWFuemh1Cis1OTpDTjpDSE46Q0hJTkE6R2Fuc3U6VG9uZ3dlaQorNjA6Q046Q0hOOkNISU5BOkdhbnN1OldlaXl1YW4KKzYxOkNOOkNITjpDSElOQTpHYW5zdTpXZW4gWGlhbgorNjI6Q046Q0hOOkNISU5BOkdhbnN1Old1ZHUKKzYzOkNOOkNITjpDSElOQTpHYW5zdTpXdXNoYW4KKzY0OkNOOkNITjpDSElOQTpHYW5zdTpXdXdlaQorNjU6Q046Q0hOOkNISU5BOkdhbnN1OlhpYWhlCis2NjpDTjpDSE46Q0hJTkE6R2Fuc3U6WGloZQorNjc6Q046Q0hOOkNISU5BOkdhbnN1OllvbmdjaGFuZworNjg6Q046Q0hOOkNISU5BOkdhbnN1OllvbmdkZW5nCis2OTpDTjpDSE46Q0hJTkE6R2Fuc3U6WW9uZ2ppbmEKKzcwOkNOOkNITjpDSElOQTpHYW5zdTpZdW1lbiBTaGkKKzcxOkNOOkNITjpDSElOQTpHYW5zdTpZdXpob25nCis3MjpDTjpDSE46Q0hJTkE6R2Fuc3U6WmhhbmcgWGlhbgorNzM6Q046Q0hOOkNISU5BOkdhbnN1OlpoYW5namlhY2h1YW4KKzc0OkNOOkNITjpDSElOQTpHYW5zdTpaaGFuZ3llCis3NTpDTjpDSE46Q0hJTkE6R2Fuc3U6WmhlbmduaW5nCis3NjpDTjpDSE46Q0hJTkE6R2Fuc3U6Wmhlbnl1YW4KKzc3OkNOOkNITjpDSElOQTpHYW5zdTpaaHVhbmdsYW5nCis3ODpDTjpDSE46Q0hJTkE6R2Fuc3U6Wmh1Z3F1CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NJVi9DSVZfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NJVi9DSVZfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkwMGVlZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ0lWL0NJVl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDY1IEBACisxOkNJLTA2OkNJOjggTU9OVEFHTkVTCisyOkNJLUFCRTpDSTpBQkVOR09VUk9VCiszOkNJLUFCSTpDSTpBQklESkFOCis0OkNJLUFCTzpDSTpBQk9JU1NPCis1OkNJLUFEOkNJOkFEWk9QRQorNjpDSS1BR0I6Q0k6QUdCT1ZJTExFCis3OkNJLTY6Q0k6QUdORUJJCis4OkNJLUFHTjpDSTpBR05JQklMRUtSTworOTpDSS1CQU46Q0k6QkFOR09MTworMTA6Q0ktMDk6Q0k6QkFTIFNBU1NBTkRSQQorMTE6Q0ktQkVPOkNJOkJFT1VNSQorMTI6Q0ktQklBOkNJOkJJQU5LT1VNQQorMTM6Q0ktQk9EOkNJOkJPTkRPVUtPVQorMTQ6Q0ktQk9HOkNJOkJPTkdPVUFOT1UKKzE1OkNJLUJPRjpDSTpCT1VBRkxFCisxNjpDSS1CT0s6Q0k6Qk9VQUtFCisxNzpDSS1CT1U6Q0k6Qk9VTkEKKzE4OkNJLUJPTjpDSTpCT1VORElBTEkKKzE5OkNJLURBSzpDSTpEQUJBS0FMQQorMjA6Q0ktREFMOkNJOkRBTE9BCisyMTpDSS1EQU46Q0k6REFOQU5FCisyMjpDSS1EQU86Q0k6REFPVUtSTworMjM6Q0ktMDpDSTpERU5HVUVMRQorMjQ6Q0ktRElNOkNJOkRJTUJPS1JPCisyNTpDSS1ESVY6Q0k6RElWTworMjY6Q0ktRFVFOkNJOkRVRUtPVUUKKzI3OkNJLUZFUjpDSTpGRVJLRVNTRURPVUdPVQorMjg6Q0ktR0FHOkNJOkdBR05PQQorMjk6Q0ktTEFIOkNJOkdSQU5EIExBSE9VCiszMDpDSS1HVUk6Q0k6R1VJR0xPCiszMTpDSS0wMjpDSTpIQVVUIFNBU1NBTkRSQQorMzI6Q0ktSVNTOkNJOklTU0lBCiszMzpDSS1LQVQ6Q0k6S0FUSU9MQQorMzQ6Q0ktS09SOkNJOktPUkhPR08KKzM1OkNJLTA3OkNJOkxBQ1MKKzM2OkNJLUxBSzpDSTpMQUtPVEEKKzM3OkNJLU1CQTpDSTpNJ0JBSElBS1JPCiszODpDSS1NTjpDSTpNQU4KKzM5OkNJLU1BTjpDSTpNQU5LT05PCis0MDpDSS0yOkNJOk1BUkFIT1VFCis0MTpDSS0wNTpDSTpNT1lFTiBDT01PRQorNDI6Q0ktMTA6Q0k6TlpJIENPTU9FCis0MzpDSS1PREk6Q0k6T0RJRU5ORQorNDQ6Q0ktT1U6Q0k6T1VNRQorNDU6Q0ktU0FLOkNJOlNBS0FTU09VCis0NjpDSS1TUDpDSTpTQU4gUEVEUk8KKzQ3OkNJLVNBUzpDSTpTQVNTQU5EUkEKKzQ4OkNJLTAzOkNJOlNBVkFORVMKKzQ5OkNJLVNFRzpDSTpTRUdVRUxBCis1MDpDSS1TSU46Q0k6U0lORlJBCis1MTpDSS1TT1I6Q0k6U09VQlJFCis1MjpDSS01OkNJOlNVRCBCQU5EQU1BCis1MzpDSS0zOkNJOlNVRCBDT01PRQorNTQ6Q0ktVEFCOkNJOlRBQk9VCis1NTpDSS1UQU46Q0k6VEFOREEKKzU2OkNJLVRFTjpDSTpURU5HUkVMQQorNTc6Q0ktVElBOkNJOlRJQVNTQUxFCis1ODpDSS1UT0I6Q0k6VE9VQkEKKzU5OkNJLVRPTTpDSTpUT1VNT0RJCis2MDpDSS0wNDpDSTpWQUxMRUUgRFUgQkFOREFNQQorNjE6Q0ktVkFWOkNJOlZBVk9VQQorNjI6Q0ktNDpDSTpXT1JPRE9VR09VCis2MzpDSS1ZQU06Q0k6WUFNT1VTU09VS1JPCis2NDpDSS0wODpDSTpaQU5aQU4KKzY1OkNJLVpVRTpDSTpaVUVOT1VMQQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DSVYvQ0lWX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DSVYvQ0lWX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhM2VjYjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NJVi9DSVZfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSwxODUgQEAKKzE6Q0k6Q0lWOklWT1JZIENPQVNUOlRvdWJhOkJvb2tvCisyOkNJOkNJVjpJVk9SWSBDT0FTVDpUb3ViYTpCb3JvdG91CiszOkNJOkNJVjpJVk9SWSBDT0FTVDpUb3ViYTpHdWludGVndWVsYQorNDpDSTpDSVY6SVZPUlkgQ09BU1Q6VG91YmE6S29vbmFuCis1OkNJOkNJVjpJVk9SWSBDT0FTVDpUb3ViYTpLb3JvCis2OkNJOkNJVjpJVk9SWSBDT0FTVDpUb3ViYTpPdWFuaW5vdQorNzpDSTpDSVY6SVZPUlkgQ09BU1Q6VG91YmE6VG91YmEKKzE6Q0k6Q0lWOklWT1JZIENPQVNUOlNlZ3VlbGE6RGppYnJvc3NvCisyOkNJOkNJVjpJVk9SWSBDT0FTVDpTZWd1ZWxhOkR1YWxsYQorMzpDSTpDSVY6SVZPUlkgQ09BU1Q6U2VndWVsYTpLYW5pCis0OkNJOkNJVjpJVk9SWSBDT0FTVDpTZWd1ZWxhOk1hc3NhbGEKKzU6Q0k6Q0lWOklWT1JZIENPQVNUOlNlZ3VlbGE6TW9yb25kbworNjpDSTpDSVY6SVZPUlkgQ09BU1Q6U2VndWVsYTpTZWd1ZWxhCis3OkNJOkNJVjpJVk9SWSBDT0FTVDpTZWd1ZWxhOlNpZmllCis4OkNJOkNJVjpJVk9SWSBDT0FTVDpTZWd1ZWxhOldvcm9mbGEKKzE6Q0k6Q0lWOklWT1JZIENPQVNUOktvcmhvZ286RGlrb2RvdWdvdQorMjpDSTpDSVY6SVZPUlkgQ09BU1Q6S29yaG9nbzpHdWllbWJlCiszOkNJOkNJVjpJVk9SWSBDT0FTVDpLb3Job2dvOkthcmFrb3JvCis0OkNJOkNJVjpJVk9SWSBDT0FTVDpLb3Job2dvOktvbWJvcm9kb3Vnb3UKKzU6Q0k6Q0lWOklWT1JZIENPQVNUOktvcmhvZ286S29yaG9nbworNjpDSTpDSVY6SVZPUlkgQ09BU1Q6S29yaG9nbzpNJ2Jlbmd1ZQorNzpDSTpDSVY6SVZPUlkgQ09BU1Q6S29yaG9nbzpOYXBpZW9sZWRvdWdvdQorODpDSTpDSVY6SVZPUlkgQ09BU1Q6S29yaG9nbzpOaW9mb2luCis5OkNJOkNJVjpJVk9SWSBDT0FTVDpLb3Job2dvOlNpbmVtYXRpYWxpCisxMDpDSTpDSVY6SVZPUlkgQ09BU1Q6S29yaG9nbzpTaXJhc3NvCisxMTpDSTpDSVY6SVZPUlkgQ09BU1Q6S29yaG9nbzpUaW9yb25pYXJhZG91Z291CisxOkNJOkNJVjpJVk9SWSBDT0FTVDpLYXRpb2xhOkZyb25hbgorMjpDSTpDSVY6SVZPUlkgQ09BU1Q6S2F0aW9sYTpLYXRpb2xhCiszOkNJOkNJVjpJVk9SWSBDT0FTVDpLYXRpb2xhOk5pYWthcm1hZG91Z291Cis0OkNJOkNJVjpJVk9SWSBDT0FTVDpLYXRpb2xhOlRhZmllcmUKKzU6Q0k6Q0lWOklWT1JZIENPQVNUOkthdGlvbGE6VG9ydGl5YQorMTpDSTpDSVY6SVZPUlkgQ09BU1Q6VGlhc3NhbGU6VGFhYm8KKzI6Q0k6Q0lWOklWT1JZIENPQVNUOlRpYXNzYWxlOlRpYXNzYWxlCisxOkNJOkNJVjpJVk9SWSBDT0FTVDpCb3VuYTpCb3VuYQorMjpDSTpDSVY6SVZPUlkgQ09BU1Q6Qm91bmE6RHJvcG8KKzM6Q0k6Q0lWOklWT1JZIENPQVNUOkJvdW5hOk5hc3NpYW4KKzQ6Q0k6Q0lWOklWT1JZIENPQVNUOkJvdW5hOlRlaGluaQorMTpDSTpDSVY6SVZPUlkgQ09BU1Q6U2FuLVBlZHJvOkdyYW5kLUJlcmVieQorMjpDSTpDSVY6SVZPUlkgQ09BU1Q6U2FuLVBlZHJvOlNhbi1QZWRybworMTpDSTpDSVY6SVZPUlkgQ09BU1Q6Qm91bmRpYWxpOkJvdW5kaWFsaQorMjpDSTpDSVY6SVZPUlkgQ09BU1Q6Qm91bmRpYWxpOkdib24KKzM6Q0k6Q0lWOklWT1JZIENPQVNUOkJvdW5kaWFsaTpLYXNzZXJlCis0OkNJOkNJVjpJVk9SWSBDT0FTVDpCb3VuZGlhbGk6S29saWEKKzU6Q0k6Q0lWOklWT1JZIENPQVNUOkJvdW5kaWFsaTpLb3V0bworMTpDSTpDSVY6SVZPUlkgQ09BU1Q6RmVya2Vzc2Vkb3Vnb3U6RGlhd2FsYQorMjpDSTpDSVY6SVZPUlkgQ09BU1Q6RmVya2Vzc2Vkb3Vnb3U6RmVya2Vzc2Vkb3Vnb3UKKzM6Q0k6Q0lWOklWT1JZIENPQVNUOkZlcmtlc3NlZG91Z291OktvbmcKKzQ6Q0k6Q0lWOklWT1JZIENPQVNUOkZlcmtlc3NlZG91Z291OktvdW1iYWxhCis1OkNJOkNJVjpJVk9SWSBDT0FTVDpGZXJrZXNzZWRvdWdvdTpOaWVsbGUKKzY6Q0k6Q0lWOklWT1JZIENPQVNUOkZlcmtlc3NlZG91Z291Ok91YW5nb2xvZG91Z291CisxOkNJOkNJVjpJVk9SWSBDT0FTVDpTYXNzYW5kcmE6R3VleW8KKzI6Q0k6Q0lWOklWT1JZIENPQVNUOlNhc3NhbmRyYTpTYXNzYW5kcmEKKzE6Q0k6Q0lWOklWT1JZIENPQVNUOkdhZ25vYTpHYWdub2EKKzI6Q0k6Q0lWOklWT1JZIENPQVNUOkdhZ25vYTpHdWliZXJvdWEKKzM6Q0k6Q0lWOklWT1JZIENPQVNUOkdhZ25vYTpPdXJhZ2FoaW8KKzE6Q0k6Q0lWOklWT1JZIENPQVNUOkJvdWFmbGU6Qm9ub24KKzI6Q0k6Q0lWOklWT1JZIENPQVNUOkJvdWFmbGU6Qm91YWZsZQorMTpDSTpDSVY6SVZPUlkgQ09BU1Q6RGFsb2E6QmVkaWFsYQorMjpDSTpDSVY6SVZPUlkgQ09BU1Q6RGFsb2E6RGFsb2EKKzM6Q0k6Q0lWOklWT1JZIENPQVNUOkRhbG9hOkdib2d1aGUKKzQ6Q0k6Q0lWOklWT1JZIENPQVNUOkRhbG9hOlpvdWtvdWdiZXUKKzE6Q0k6Q0lWOklWT1JZIENPQVNUOlRhbmRhOkFzc3VlZnJ5CisyOkNJOkNJVjpJVk9SWSBDT0FTVDpUYW5kYTpLb3Vhc3NpLURhdGVrcm8KKzM6Q0k6Q0lWOklWT1JZIENPQVNUOlRhbmRhOktvdW4tRmFvCis0OkNJOkNJVjpJVk9SWSBDT0FTVDpUYW5kYTpUYW5kYQorNTpDSTpDSVY6SVZPUlkgQ09BU1Q6VGFuZGE6VHJhbnN1YQorMTpDSTpDSVY6SVZPUlkgQ09BU1Q6VmF2b3VhOlZhdm91YQorMTpDSTpDSVY6SVZPUlkgQ09BU1Q6QWdib3ZpbGxlOkFnYm92aWxsZQorMjpDSTpDSVY6SVZPUlkgQ09BU1Q6QWdib3ZpbGxlOkF6YWd1aWUKKzM6Q0k6Q0lWOklWT1JZIENPQVNUOkFnYm92aWxsZTpSdWJpbm8KKzE6Q0k6Q0lWOklWT1JZIENPQVNUOlp1ZW5vdWxhOkdvaGl0YWZsYQorMjpDSTpDSVY6SVZPUlkgQ09BU1Q6WnVlbm91bGE6WnVlbm91bGEKKzE6Q0k6Q0lWOklWT1JZIENPQVNUOkd1aWdsbzpCbG9sZXF1aW4KKzI6Q0k6Q0lWOklWT1JZIENPQVNUOkd1aWdsbzpHdWlnbG8KKzM6Q0k6Q0lWOklWT1JZIENPQVNUOkd1aWdsbzpUYWhpCis0OkNJOkNJVjpJVk9SWSBDT0FTVDpHdWlnbG86VG91bGVwbGV1CisxOkNJOkNJVjpJVk9SWSBDT0FTVDpBZHpvcGU6QWR6b3BlCisyOkNJOkNJVjpJVk9SWSBDT0FTVDpBZHpvcGU6QWZmZXJ5CiszOkNJOkNJVjpJVk9SWSBDT0FTVDpBZHpvcGU6QWdvdQorNDpDSTpDSVY6SVZPUlkgQ09BU1Q6QWR6b3BlOkFrb3VwZQorNTpDSTpDSVY6SVZPUlkgQ09BU1Q6QWR6b3BlOllha2Fzc2UtQXR0b2Jyb3UKKzE6Q0k6Q0lWOklWT1JZIENPQVNUOkRpbWJva3JvOkJvY2FuZGEKKzI6Q0k6Q0lWOklWT1JZIENPQVNUOkRpbWJva3JvOkRpbWJva3JvCiszOkNJOkNJVjpJVk9SWSBDT0FTVDpEaW1ib2tybzpLb3Vhc3Npa3JvCisxOkNJOkNJVjpJVk9SWSBDT0FTVDpPdW1lOkRpZWdvbmVmbGEKKzI6Q0k6Q0lWOklWT1JZIENPQVNUOk91bWU6T3VtZQorMTpDSTpDSVY6SVZPUlkgQ09BU1Q6QWJpZGphbjpBYmlkamFuLVZpbGxlCisyOkNJOkNJVjpJVk9SWSBDT0FTVDpBYmlkamFuOkFsZXBlCiszOkNJOkNJVjpJVk9SWSBDT0FTVDpBYmlkamFuOkFueWFtYQorNDpDSTpDSVY6SVZPUlkgQ09BU1Q6QWJpZGphbjpCaW5nZXJ2aWxsZQorNTpDSTpDSVY6SVZPUlkgQ09BU1Q6QWJpZGphbjpCb25vdWEKKzY6Q0k6Q0lWOklWT1JZIENPQVNUOkFiaWRqYW46RGFib3UKKzc6Q0k6Q0lWOklWT1JZIENPQVNUOkFiaWRqYW46R3JhbmQtQmFzc2FtCis4OkNJOkNJVjpJVk9SWSBDT0FTVDpBYmlkamFuOkphY3F1ZXZpbGxlCis5OkNJOkNJVjpJVk9SWSBDT0FTVDpBYmlkamFuOlNpa2Vuc2kKKzEwOkNJOkNJVjpJVk9SWSBDT0FTVDpBYmlkamFuOlNvbmdvbgorMTpDSTpDSVY6SVZPUlkgQ09BU1Q6QmVvdW1pOkJlb3VtaQorMjpDSTpDSVY6SVZPUlkgQ09BU1Q6QmVvdW1pOkJvZG9rcm8KKzE6Q0k6Q0lWOklWT1JZIENPQVNUOkJpYW5rb3VtYTpCaWFua291bWEKKzI6Q0k6Q0lWOklWT1JZIENPQVNUOkJpYW5rb3VtYTpHYm9ubmUKKzM6Q0k6Q0lWOklWT1JZIENPQVNUOkJpYW5rb3VtYTpTaXBpbG91CisxOkNJOkNJVjpJVk9SWSBDT0FTVDpJc3NpYTpJc3NpYQorMjpDSTpDSVY6SVZPUlkgQ09BU1Q6SXNzaWE6U2Fpb3VhCisxOkNJOkNJVjpJVk9SWSBDT0FTVDpCb25nb3Vhbm91OkFycmFoCisyOkNJOkNJVjpJVk9SWSBDT0FTVDpCb25nb3Vhbm91OkJvbmdvdWFub3UKKzM6Q0k6Q0lWOklWT1JZIENPQVNUOkJvbmdvdWFub3U6TSdiYXR0bworNDpDSTpDSVY6SVZPUlkgQ09BU1Q6Qm9uZ291YW5vdTpUaWVtZWxla3JvCisxOkNJOkNJVjpJVk9SWSBDT0FTVDpNYW46RmFjb2JseQorMjpDSTpDSVY6SVZPUlkgQ09BU1Q6TWFuOktvdWlibHkKKzM6Q0k6Q0lWOklWT1JZIENPQVNUOk1hbjpMb2dvdWFsZQorNDpDSTpDSVY6SVZPUlkgQ09BU1Q6TWFuOk1hbgorNTpDSTpDSVY6SVZPUlkgQ09BU1Q6TWFuOlNhbmdvdWluZQorMTpDSTpDSVY6SVZPUlkgQ09BU1Q6VG91bW9kaTpLb2tvdW1ibworMjpDSTpDSVY6SVZPUlkgQ09BU1Q6VG91bW9kaTpUb3Vtb2RpCisxOkNJOkNJVjpJVk9SWSBDT0FTVDpHcmFuZC1MYWhvdTpHcmFuZC1MYWhvdQorMTpDSTpDSVY6SVZPUlkgQ09BU1Q6WWFtb3Vzc291a3JvOkRpZGlldmkKKzI6Q0k6Q0lWOklWT1JZIENPQVNUOllhbW91c3NvdWtybzpUaWUtTidkaWVrcm8KKzM6Q0k6Q0lWOklWT1JZIENPQVNUOllhbW91c3NvdWtybzpUaWViaXNzb3UKKzQ6Q0k6Q0lWOklWT1JZIENPQVNUOllhbW91c3NvdWtybzpZYW1vdXNzb3Vrcm8KKzE6Q0k6Q0lWOklWT1JZIENPQVNUOkFiZW5nb3Vyb3U6QWJlbmdvdXJvdQorMjpDSTpDSVY6SVZPUlkgQ09BU1Q6QWJlbmdvdXJvdTpCZXR0aWUKKzM6Q0k6Q0lWOklWT1JZIENPQVNUOkFiZW5nb3Vyb3U6TmlhYmxlCisxOkNJOkNJVjpJVk9SWSBDT0FTVDpEYW5hbmU6QmluLUhvdXllCisyOkNJOkNJVjpJVk9SWSBDT0FTVDpEYW5hbmU6RGFuYW5lCiszOkNJOkNJVjpJVk9SWSBDT0FTVDpEYW5hbmU6Wm91YW4tSG91bmllbgorMTpDSTpDSVY6SVZPUlkgQ09BU1Q6Qm91YWtlOkJvdHJvCisyOkNJOkNJVjpJVk9SWSBDT0FTVDpCb3Vha2U6Qm91YWtlCiszOkNJOkNJVjpJVk9SWSBDT0FTVDpCb3Vha2U6QnJvYm8KKzQ6Q0k6Q0lWOklWT1JZIENPQVNUOkJvdWFrZTpEaWFibworNTpDSTpDSVY6SVZPUlkgQ09BU1Q6Qm91YWtlOkRqZWJvbm91YQorMTpDSTpDSVY6SVZPUlkgQ09BU1Q6RGl2bzpEaXZvCisyOkNJOkNJVjpJVk9SWSBDT0FTVDpEaXZvOkZyZXNjbworMzpDSTpDSVY6SVZPUlkgQ09BU1Q6RGl2bzpHdWl0cnkKKzQ6Q0k6Q0lWOklWT1JZIENPQVNUOkRpdm86SGlyZQorMTpDSTpDSVY6SVZPUlkgQ09BU1Q6QWJvaXNzbzpBYm9pc3NvCisyOkNJOkNJVjpJVk9SWSBDT0FTVDpBYm9pc3NvOkFkaWFrZQorMzpDSTpDSVY6SVZPUlkgQ09BU1Q6QWJvaXNzbzpBeWFtZQorNDpDSTpDSVY6SVZPUlkgQ09BU1Q6QWJvaXNzbzpNYWZlcmUKKzU6Q0k6Q0lWOklWT1JZIENPQVNUOkFib2lzc286VGlhcG91bQorMTpDSTpDSVY6SVZPUlkgQ09BU1Q6TSdiYWhpYWtybzpNJ2JhaGlha3JvCisyOkNJOkNJVjpJVk9SWSBDT0FTVDpNJ2JhaGlha3JvOlByaWtybworMTpDSTpDSVY6SVZPUlkgQ09BU1Q6T2RpZW5uZTpCYWtvCisyOkNJOkNJVjpJVk9SWSBDT0FTVDpPZGllbm5lOkRpb3VsYXRpZWRvdWdvdQorMzpDSTpDSVY6SVZPUlkgQ09BU1Q6T2RpZW5uZTpHb3VsaWEKKzQ6Q0k6Q0lWOklWT1JZIENPQVNUOk9kaWVubmU6S2FuaWFzc28KKzU6Q0k6Q0lWOklWT1JZIENPQVNUOk9kaWVubmU6TWFkaW5hbmkKKzY6Q0k6Q0lWOklWT1JZIENPQVNUOk9kaWVubmU6TWluaWduYW4KKzc6Q0k6Q0lWOklWT1JZIENPQVNUOk9kaWVubmU6T2RpZW5uZQorODpDSTpDSVY6SVZPUlkgQ09BU1Q6T2RpZW5uZTpTYW1hdGlndWlsYQorOTpDSTpDSVY6SVZPUlkgQ09BU1Q6T2RpZW5uZTpTZWd1ZWxvbgorMTA6Q0k6Q0lWOklWT1JZIENPQVNUOk9kaWVubmU6U2V5ZG91Z291CisxMTpDSTpDSVY6SVZPUlkgQ09BU1Q6T2RpZW5uZTpUaWVtZQorMTI6Q0k6Q0lWOklWT1JZIENPQVNUOk9kaWVubmU6VGllbmtvCisxOkNJOkNJVjpJVk9SWSBDT0FTVDpNYW5rb25vOkRpYW5yYQorMjpDSTpDSVY6SVZPUlkgQ09BU1Q6TWFua29ubzpLb25nYXNzbworMzpDSTpDSVY6SVZPUlkgQ09BU1Q6TWFua29ubzpLb3VuYWhpcmkKKzQ6Q0k6Q0lWOklWT1JZIENPQVNUOk1hbmtvbm86TWFua29ubworNTpDSTpDSVY6SVZPUlkgQ09BU1Q6TWFua29ubzpTYXJoYWxhCis2OkNJOkNJVjpJVk9SWSBDT0FTVDpNYW5rb25vOlRpZW5pbmdib3VlCisxOkNJOkNJVjpJVk9SWSBDT0FTVDpBZ25pYmlsZWtybzpBZ25pYmlsZWtybworMTpDSTpDSVY6SVZPUlkgQ09BU1Q6VGVuZ3JlbGE6S2FuYWtvbm8KKzI6Q0k6Q0lWOklWT1JZIENPQVNUOlRlbmdyZWxhOlRlbmdyZWxhCisxOkNJOkNJVjpJVk9SWSBDT0FTVDpCb25kb3Vrb3U6Qm9uZG91a291CisyOkNJOkNJVjpJVk9SWSBDT0FTVDpCb25kb3Vrb3U6U2FuZGVndWUKKzE6Q0k6Q0lWOklWT1JZIENPQVNUOkRhYmFrYWxhOkJhc3Nhd2EKKzI6Q0k6Q0lWOklWT1JZIENPQVNUOkRhYmFrYWxhOkJvbmllcmVkb3Vnb3UKKzM6Q0k6Q0lWOklWT1JZIENPQVNUOkRhYmFrYWxhOkRhYmFrYWxhCis0OkNJOkNJVjpJVk9SWSBDT0FTVDpEYWJha2FsYTpGb3VtYm9sbworNTpDSTpDSVY6SVZPUlkgQ09BU1Q6RGFiYWthbGE6U2FudGFtYS1Tb2tvcm8KKzY6Q0k6Q0lWOklWT1JZIENPQVNUOkRhYmFrYWxhOlNhdGFtYS1Tb2tvdXJhCisxOkNJOkNJVjpJVk9SWSBDT0FTVDpMYWtvdGE6TGFrb3RhCisyOkNJOkNJVjpJVk9SWSBDT0FTVDpMYWtvdGE6WmlraXNzbworMTpDSTpDSVY6SVZPUlkgQ09BU1Q6U291YnJlOkJ1eW8KKzI6Q0k6Q0lWOklWT1JZIENPQVNUOlNvdWJyZTpHcmFuZC1aYXR0cnkKKzM6Q0k6Q0lWOklWT1JZIENPQVNUOlNvdWJyZTpNZWFndWkgKEduYW1hbmd1aSkKKzQ6Q0k6Q0lWOklWT1JZIENPQVNUOlNvdWJyZTpTb3VicmUKKzE6Q0k6Q0lWOklWT1JZIENPQVNUOkRhb3Vrcm86RGFvdWtybworMjpDSTpDSVY6SVZPUlkgQ09BU1Q6RGFvdWtybzpFdHRyb2tybworMzpDSTpDSVY6SVZPUlkgQ09BU1Q6RGFvdWtybzpPdWVsbGUKKzE6Q0k6Q0lWOklWT1JZIENPQVNUOkJhbmdvbG86QmFuZ29sbworMTpDSTpDSVY6SVZPUlkgQ09BU1Q6VGFib3U6R3JhYm8KKzI6Q0k6Q0lWOklWT1JZIENPQVNUOlRhYm91OlRhYm91CisxOkNJOkNJVjpJVk9SWSBDT0FTVDpTaW5mcmE6U2luZnJhCisxOkNJOkNJVjpJVk9SWSBDT0FTVDpEdWVrb3VlOkR1ZWtvdWUKKzE6Q0k6Q0lWOklWT1JZIENPQVNUOlNha2Fzc291OlNha2Fzc291CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NPRy9DT0dfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NPRy9DT0dfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkZGY5YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ09HL0NPR19BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDExIEBACisxOkNHLTEwOkNHOkJPVUVOWkEKKzI6Q0ctQlpWOkNHOkJSQVpaQVZJTExFCiszOkNHLTg6Q0c6Q1VWRVRURQorNDpDRy01OkNHOkNVVkVUVEUgT1VFU1QKKzU6Q0ctMTQ6Q0c6S09VSUxPVQorNjpDRy0yOkNHOkxFS09VTU9VCis3OkNHLTc6Q0c6TElLT1VBTEEKKzg6Q0ctOTpDRzpOSUFSSQorOTpDRy00OkNHOlBMQVRFQVVYIFtQTEFURUFVWDFdCisxMDpDRy0xMjpDRzpQT09MCisxMTpDRy0zOkNHOlNBTkdIQQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DT0cvQ09HX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DT0cvQ09HX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YmRhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NPRy9DT0dfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSw0NiBAQAorMTpDRzpDT0c6Q09OR086UGxhdGVhdXg6QWJhbGEKKzI6Q0c6Q09HOkNPTkdPOlBsYXRlYXV4OkRqYW1iYWxhCiszOkNHOkNPRzpDT05HTzpQbGF0ZWF1eDpHYW1ib21hCis0OkNHOkNPRzpDT05HTzpQbGF0ZWF1eDpMZWthbmEKKzE6Q0c6Q09HOkNPTkdPOlBvb2w6Qm9rbworMjpDRzpDT0c6Q09OR086UG9vbDpLaW5kYW1iYQorMzpDRzpDT0c6Q09OR086UG9vbDpLaW5rYWxhCis0OkNHOkNPRzpDT05HTzpQb29sOk1heWFtYQorNTpDRzpDT0c6Q09OR086UG9vbDpNaW5kb3VsaQorNjpDRzpDT0c6Q09OR086UG9vbDpOZ2FiZQorNzpDRzpDT0c6Q09OR086UG9vbDpOZ2FtYWJhIChCcmF6emF2aWxsZSkKKzE6Q0c6Q09HOkNPTkdPOkJvdWVuemE6Qm9rby1Tb25naG8KKzI6Q0c6Q09HOkNPTkdPOkJvdWVuemE6TG91ZGltYQorMzpDRzpDT0c6Q09OR086Qm91ZW56YTpNYWRpbmdvdQorNDpDRzpDT0c6Q09OR086Qm91ZW56YTpNZm91YXRpCis1OkNHOkNPRzpDT05HTzpCb3VlbnphOk1vdXlvbmR6aQorNjpDRzpDT0c6Q09OR086Qm91ZW56YTpOa2F5aSBEaXN0cmljdAorMTpDRzpDT0c6Q09OR086TGVrb3Vtb3U6QmFtYmFtYQorMjpDRzpDT0c6Q09OR086TGVrb3Vtb3U6S29tb25vCiszOkNHOkNPRzpDT05HTzpMZWtvdW1vdTpTaWJpdGkKKzQ6Q0c6Q09HOkNPTkdPOkxla291bW91OlphbmFnYQorMTpDRzpDT0c6Q09OR086TGlrb3VhbGE6RG9uZ291CisyOkNHOkNPRzpDT05HTzpMaWtvdWFsYTpFcGVuYQorMzpDRzpDT0c6Q09OR086TGlrb3VhbGE6SW1wZm9uZG8KKzE6Q0c6Q09HOkNPTkdPOlNhbmdoYTpPdWVzc28KKzI6Q0c6Q09HOkNPTkdPOlNhbmdoYTpTZW1iZQorMzpDRzpDT0c6Q09OR086U2FuZ2hhOlNvdWFua2UKKzE6Q0c6Q09HOkNPTkdPOkN1dmV0dGU6Qm91bmRqaQorMjpDRzpDT0c6Q09OR086Q3V2ZXR0ZTpFd28KKzM6Q0c6Q09HOkNPTkdPOkN1dmV0dGU6S2VsbGUKKzQ6Q0c6Q09HOkNPTkdPOkN1dmV0dGU6TG91a2VsYQorNTpDRzpDT0c6Q09OR086Q3V2ZXR0ZTpNYWtvdWEKKzY6Q0c6Q09HOkNPTkdPOkN1dmV0dGU6TWJvbW8KKzc6Q0c6Q09HOkNPTkdPOkN1dmV0dGU6TW9zc2FrYQorODpDRzpDT0c6Q09OR086Q3V2ZXR0ZTpPa295bworOTpDRzpDT0c6Q09OR086Q3V2ZXR0ZTpPd2FuZG8KKzE6Q0c6Q09HOkNPTkdPOk5pYXJpOkRpdmVuaWUKKzI6Q0c6Q09HOkNPTkdPOk5pYXJpOktpYmFuZ291CiszOkNHOkNPRzpDT05HTzpOaWFyaTpLaW1vbmdvCis0OkNHOkNPRzpDT05HTzpOaWFyaTpMb3V2YWtvdSAoTG91Ym9tbykKKzU6Q0c6Q09HOkNPTkdPOk5pYXJpOk1heW9rbworNjpDRzpDT0c6Q09OR086Tmlhcmk6TW9zc2VuZGpvCisxOkNHOkNPRzpDT05HTzpLb3VpbG91Oktha2Ftb2VrYQorMjpDRzpDT0c6Q09OR086S291aWxvdTpMb2FuZGppbGkgKFBvaW50ZSBOb2lyZSkKKzM6Q0c6Q09HOkNPTkdPOktvdWlsb3U6TWFkaW5nby1LYXllcworNDpDRzpDT0c6Q09OR086S291aWxvdTpNdm91dGkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ09ML0NPTF9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ09ML0NPTF9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjNjYmM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DT0wvQ09MX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMzQgQEAKKzE6Q08tQU1BOkNPOkFNQVpPTkFTCisyOkNPLUFOVDpDTzpBTlRJT1FVSUEKKzM6Q08tQVJBOkNPOkFSQVVDQQorNDpDTy1BVEw6Q086QVRMQU5USUNPCis1OkNPLUJPTDpDTzpCT0xJVkFSCis2OkNPLUJPWTpDTzpCT1lBQ0EKKzc6Q08tQlVFOkNPOkJVRU5BVkVOVFVSQQorODpDTy1DQUw6Q086Q0FMREFTCis5OkNPLUNBUTpDTzpDQVFVRVRBCisxMDpDTy1DQVM6Q086Q0FTQU5BUkUKKzExOkNPLUNBVTpDTzpDQVVDQQorMTI6Q08tQ0VTOkNPOkNFU0FSCisxMzpDTy1DSE86Q086Q0hPQ08KKzE0OkNPLUNPUjpDTzpDT1JET0JBCisxNTpDTy1DVU46Q086Q1VORElOQU1BUkNBCisxNjpDTy1EQzpDTzpESVNUUklUTyBDQVBJVEFMIERFIEJPR09UCisxNzpDTy1MQUc6Q086R1VBSklSQQorMTg6Q08tR1VBOkNPOkdVQU5JQQorMTk6Q08tR1VWOkNPOkdVQVZJQVJFCisyMDpDTy1IVUk6Q086SFVJTEEKKzIxOkNPLU1BRzpDTzpNQUdEQUxFTkEKKzIyOkNPLU1FVDpDTzpNRVRBCisyMzpDTy1OQVI6Q086TkFSSU5PCisyNDpDTy1OU0E6Q086Tk9SVEUgREUgU0FOVEFOREVSCisyNTpDTy1QVVQ6Q086UFVUVU1BWU8KKzI2OkNPLVFVSTpDTzpRVUlORElPCisyNzpDTy1SSVM6Q086UklTQVJBTERBCisyODpDTy1TQVA6Q086U0FOIEFORFJFUyBZIFBST1ZJREVOQ0lBCisyOTpDTy1TQU46Q086U0FOVEFOREVSCiszMDpDTy1TVUM6Q086U1VDUkUKKzMxOkNPLVRPTDpDTzpUT0xJTUEKKzMyOkNPLVZBQzpDTzpWQUxMRSBERUwgQ0FVQ0EKKzMzOkNPLVZBVTpDTzpWQVVQRVMKKzM0OkNPLVZJRDpDTzpWSUNIQURBCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NPTC9DT0xfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NPTC9DT0xfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4ZTY5ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ09ML0NPTF9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDEwODQgQEAKKzE6Q086Q09MOkNPTE9NQklBOlZhdXBlczpDQVJVUlUKKzI6Q086Q09MOkNPTE9NQklBOlZhdXBlczpNSVRVCiszOkNPOkNPTDpDT0xPTUJJQTpWYXVwZXM6UEFDT0EKKzQ6Q086Q09MOkNPTE9NQklBOlZhdXBlczpQQVBVTkFIVUEKKzU6Q086Q09MOkNPTE9NQklBOlZhdXBlczpUQVJBSVJBCis2OkNPOkNPTDpDT0xPTUJJQTpWYXVwZXM6WUFWQVJBVEUKKzE6Q086Q09MOkNPTE9NQklBOlRvbGltYTpBTFBVSkFSUkEKKzI6Q086Q09MOkNPTE9NQklBOlRvbGltYTpBTFZBUkFETworMzpDTzpDT0w6Q09MT01CSUE6VG9saW1hOkFNQkFMRU1BCis0OkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6QU5aT0FURUdVSQorNTpDTzpDT0w6Q09MT01CSUE6VG9saW1hOkFSTUVSTyAoR1VBWUFCQUwpCis2OkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6QVRBQ08KKzc6Q086Q09MOkNPTE9NQklBOlRvbGltYTpDQUpBTUFSQ0EKKzg6Q086Q09MOkNPTE9NQklBOlRvbGltYTpDQVJNRU4gREUgQVBJQ0FMQQorOTpDTzpDT0w6Q09MT01CSUE6VG9saW1hOkNBU0FCSUFOQ0EKKzEwOkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6Q0hBUEFSUkFMCisxMTpDTzpDT0w6Q09MT01CSUE6VG9saW1hOkNPRUxMTworMTI6Q086Q09MOkNPTE9NQklBOlRvbGltYTpDT1lBSU1BCisxMzpDTzpDT0w6Q09MT01CSUE6VG9saW1hOkNVTkRBWQorMTQ6Q086Q09MOkNPTE9NQklBOlRvbGltYTpET0xPUkVTCisxNTpDTzpDT0w6Q09MT01CSUE6VG9saW1hOkVTUElOQUwKKzE2OkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6RkFMQU4KKzE3OkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6RkxBTkRFUworMTg6Q086Q09MOkNPTE9NQklBOlRvbGltYTpGUkVTTk8KKzE5OkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6R1VBTU8KKzIwOkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6SEVSVkVPCisyMTpDTzpDT0w6Q09MT01CSUE6VG9saW1hOkhPTkRBCisyMjpDTzpDT0w6Q09MT01CSUE6VG9saW1hOklCQUdVRQorMjM6Q086Q09MOkNPTE9NQklBOlRvbGltYTpJQ09OT05aTworMjQ6Q086Q09MOkNPTE9NQklBOlRvbGltYTpMRVJJREEKKzI1OkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6TElCQU5PCisyNjpDTzpDT0w6Q09MT01CSUE6VG9saW1hOk1BUklRVUlUQQorMjc6Q086Q09MOkNPTE9NQklBOlRvbGltYTpNRUxHQVIKKzI4OkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6TVVSSUxMTworMjk6Q086Q09MOkNPTE9NQklBOlRvbGltYTpOQVRBR0FJTUEKKzMwOkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6T1JURUdBCiszMTpDTzpDT0w6Q09MT01CSUE6VG9saW1hOlBJRURSQVMKKzMyOkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6UExBTkFEQVMKKzMzOkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6UFJBRE8KKzM0OkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6UFVSSUZJQ0FDSU9OCiszNTpDTzpDT0w6Q09MT01CSUE6VG9saW1hOlJJT0JMQU5DTworMzY6Q086Q09MOkNPTE9NQklBOlRvbGltYTpST05DRVNWQUxMRVMKKzM3OkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6Uk9WSVJBCiszODpDTzpDT0w6Q09MT01CSUE6VG9saW1hOlNBTERBP0EKKzM5OkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6U0FOIEFOVE9OSU8KKzQwOkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6U0FOIExVSVMKKzQxOkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6U0FOVEEgSVNBQkVMCis0MjpDTzpDT0w6Q09MT01CSUE6VG9saW1hOlNVQVJFWgorNDM6Q086Q09MOkNPTE9NQklBOlRvbGltYTpWQUxMRSBERSBTQU4gSlVBTgorNDQ6Q086Q09MOkNPTE9NQklBOlRvbGltYTpWRU5BRElMTE8KKzQ1OkNPOkNPTDpDT0xPTUJJQTpUb2xpbWE6VklMTEEgSEVSTU9TQQorNDY6Q086Q09MOkNPTE9NQklBOlRvbGltYTpWSUxMQVJSSUNBCisxOkNPOkNPTDpDT0xPTUJJQTpDYXNhbmFyZTpBR1VBWlVMCisyOkNPOkNPTDpDT0xPTUJJQTpDYXNhbmFyZTpDSEFNRVpBCiszOkNPOkNPTDpDT0xPTUJJQTpDYXNhbmFyZTpIQVRPIENPUk9aQUwKKzQ6Q086Q09MOkNPTE9NQklBOkNhc2FuYXJlOkxBIFNBTElOQQorNTpDTzpDT0w6Q09MT01CSUE6Q2FzYW5hcmU6TUFOSQorNjpDTzpDT0w6Q09MT01CSUE6Q2FzYW5hcmU6TU9OVEVSUkVZCis3OkNPOkNPTDpDT0xPTUJJQTpDYXNhbmFyZTpOVU5DSElBCis4OkNPOkNPTDpDT0xPTUJJQTpDYXNhbmFyZTpPUk9DVUUKKzk6Q086Q09MOkNPTE9NQklBOkNhc2FuYXJlOlBBWiBERSBBUklQT1JPCisxMDpDTzpDT0w6Q09MT01CSUE6Q2FzYW5hcmU6UE9SRQorMTE6Q086Q09MOkNPTE9NQklBOkNhc2FuYXJlOlJFQ0VUT1IKKzEyOkNPOkNPTDpDT0xPTUJJQTpDYXNhbmFyZTpTQUJBTkFMQVJHQQorMTM6Q086Q09MOkNPTE9NQklBOkNhc2FuYXJlOlNBQ0FNQQorMTQ6Q086Q09MOkNPTE9NQklBOkNhc2FuYXJlOlNBTiBMVUlTIERFIFBBTEVOUVVFCisxNTpDTzpDT0w6Q09MT01CSUE6Q2FzYW5hcmU6VEFNQVJBCisxNjpDTzpDT0w6Q09MT01CSUE6Q2FzYW5hcmU6VEFVUkFNRU5BCisxNzpDTzpDT0w6Q09MT01CSUE6Q2FzYW5hcmU6VFJJTklEQUQKKzE4OkNPOkNPTDpDT0xPTUJJQTpDYXNhbmFyZTpWSUxMQU5VRVZBCisxOTpDTzpDT0w6Q09MT01CSUE6Q2FzYW5hcmU6WU9QQUwKKzE6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpBR1VBIERFIERJT1MKKzI6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpBTEJBTgorMzpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOkFOQVBPSU1BCis0OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6QU5PTEFJTUEKKzU6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpBUFVMTyAoUkFGQUVMIFJFWUVTKQorNjpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOkFSQkVMQUVaCis3OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6QkVMVFJBTgorODpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOkJJVFVJTUEKKzk6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpCT0pBQ0EKKzEwOkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6Q0FCUkVSQQorMTE6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpDQUNISVBBWQorMTI6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpDQUpJQ0EKKzEzOkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6Q0FQQVJSQVBJCisxNDpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOkNBUVVFWkEKKzE1OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6Q0FSTUVOIERFIENBUlVQQQorMTY6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpDSEFHVUFOSQorMTc6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpDSElBCisxODpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOkNISVBBUVVFCisxOTpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOkNIT0FDSEkKKzIwOkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6Q0hPQ09OVEEKKzIxOkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6Q09HVUEKKzIyOkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6Q09UQQorMjM6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpDVUNVTlVCQQorMjQ6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpFTCBDT0xFR0lPCisyNTpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOkVMIFBFP09OCisyNjpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOkZBQ0FUQVRJVkEKKzI3OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6Rk9NRVFVRQorMjg6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpGT1NDQQorMjk6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpGVU5aQQorMzA6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpGVVFVRU5FCiszMTpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOkZVU0FHQVNVR0EKKzMyOkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6R0FDSEFMQQorMzM6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpHQUNIQU5DSVBBCiszNDpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOkdBQ0hFVEEKKzM1OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6R0FNQQorMzY6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpHSVJBUkRPVAorMzc6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpHVUFDSEVUQQorMzg6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpHVUFEVUFTCiszOTpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOkdVQVNDQQorNDA6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpHVUFUQVFVSQorNDE6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpHVUFUQVZJVEEKKzQyOkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6R1VBWUFCQUwgREUgU0lRVUlNQQorNDM6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpHVUFZQUJFVEFMCis0NDpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOkdVVElFUlJFWgorNDU6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpKRVJVU0FMRU4KKzQ2OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6SlVOSU4KKzQ3OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6TEEgQ0FMRVJBCis0ODpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOkxBIE1FU0EKKzQ5OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6TEEgUEFMTUEKKzUwOkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6TEEgUEU/QQorNTE6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpMQSBWRUdBCis1MjpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOkxFTkdVQVpBUVVFCis1MzpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOk1BQ0hFVEEKKzU0OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6TUFEUklECis1NTpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOk1BTlRBCis1NjpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOk1FRElOQQorNTc6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpNT1NRVUVSQQorNTg6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpOQVJJP08KKzU5OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6TkVNT0NPTgorNjA6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpOSUxPCis2MTpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOk5JTUFJTUEKKzYyOkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6Tk9DQUlNQQorNjM6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpQQUNITworNjQ6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpQQUlNRQorNjU6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpQQU5ESQorNjY6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpQQVJBVEVCVUVOTworNjc6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpQQVNDQQorNjg6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpQVUVSVE8gU0FMR0FSCis2OTpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOlBVTEkKKzcwOkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6UVVFQlJBREFORUdSQQorNzE6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpRVUVUQU1FCis3MjpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOlFVSVBJTEUKKzczOkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6UklDQVVSVEUKKzc0OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6U0FOIEFOVE9OSU8gREVMIFRFUVVFTkRBTQorNzU6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpTQU4gQkVSTkFSRE8KKzc2OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6U0FOIENBWUVUQU5PCis3NzpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOlNBTiBGUkFOQ0lTQ08KKzc4OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6U0FOIEpVQU4gREUgUklPIFNFQ08KKzc5OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6U0FOVEFGRSBERSBCT0dPVEEgRC5DLgorODA6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpTQVNBSU1BCis4MTpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOlNFU1FVSUxFCis4MjpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOlNJQkFURQorODM6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpTSUxWQU5JQQorODQ6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpTSU1JSkFDQQorODU6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpTT0FDSEEKKzg2OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6U09QTworODc6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpTVUJBQ0hPUVVFCis4ODpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOlNVRVNDQQorODk6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpTVVBBVEEKKzkwOkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6U1VTQQorOTE6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpTVVRBVEFVU0EKKzkyOkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6VEFCSU8KKzkzOkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6VEFVU0EKKzk0OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6VEVOQQorOTU6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpURU5KTworOTY6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpUSUJBQ1VZCis5NzpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOlRJQklSSVRBCis5ODpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOlRPQ0FJTUEKKzk5OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6VE9DQU5DSVBBCisxMDA6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpUT1BBSVBJCisxMDE6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpVQkFMQQorMTAyOkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6VUJBUVVFCisxMDM6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpVQkFURQorMTA0OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6VU5FCisxMDU6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpVVElDQQorMTA2OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6VkVORUNJQSAoT1NQSU5BIFBFUkVaKQorMTA3OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6VkVSR0FSQQorMTA4OkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6VklBTkkKKzEwOTpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOlZJTExBR09NRVoKKzExMDpDTzpDT0w6Q09MT01CSUE6Q3VuZGluYW1hcmNhOlZJTExBUElOWk9OCisxMTE6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpWSUxMRVRBCisxMTI6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpWSU9UQQorMTEzOkNPOkNPTDpDT0xPTUJJQTpDdW5kaW5hbWFyY2E6WUFDT1BJCisxMTQ6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpaSVBBQ09OCisxMTU6Q086Q09MOkNPTE9NQklBOkN1bmRpbmFtYXJjYTpaSVBBUVVJUkEKKzE6Q086Q09MOkNPTE9NQklBOkNhcXVldGE6QUxCQU5JQQorMjpDTzpDT0w6Q09MT01CSUE6Q2FxdWV0YTpCRUxFTiBERSBMT1MgQU5EQVFVSUVTCiszOkNPOkNPTDpDT0xPTUJJQTpDYXF1ZXRhOkNBUlRBR0VOQSBERUwgQ0hBSVJBCis0OkNPOkNPTDpDT0xPTUJJQTpDYXF1ZXRhOkNVUklMTE8KKzU6Q086Q09MOkNPTE9NQklBOkNhcXVldGE6RUwgRE9OQ0VMTE8KKzY6Q086Q09MOkNPTE9NQklBOkNhcXVldGE6RUwgUEFVSklMCis3OkNPOkNPTDpDT0xPTUJJQTpDYXF1ZXRhOkZMT1JFTkNJQQorODpDTzpDT0w6Q09MT01CSUE6Q2FxdWV0YTpMQSBNT05UQU5JVEEKKzk6Q086Q09MOkNPTE9NQklBOkNhcXVldGE6TUlMQU4KKzEwOkNPOkNPTDpDT0xPTUJJQTpDYXF1ZXRhOk1PUkVMSUEKKzExOkNPOkNPTDpDT0xPTUJJQTpDYXF1ZXRhOlBVRVJUTyBSSUNPCisxMjpDTzpDT0w6Q09MT01CSUE6Q2FxdWV0YTpTQU4gSk9TRSBERSBGUkFHVUEKKzEzOkNPOkNPTDpDT0xPTUJJQTpDYXF1ZXRhOlNBTiBWSUNFTlRFIERFTCBDQUdVQU4KKzE0OkNPOkNPTDpDT0xPTUJJQTpDYXF1ZXRhOlNPTEFOTworMTU6Q086Q09MOkNPTE9NQklBOkNhcXVldGE6VkFMUEFSQUlTTworMTpDTzpDT0w6Q09MT01CSUE6Q2hvY286QUNBTkRJCisyOkNPOkNPTDpDT0xPTUJJQTpDaG9jbzpBTFRPIEJBVURPIChQSUUgREUgUEFUTykKKzM6Q086Q09MOkNPTE9NQklBOkNob2NvOkJBR0FETworNDpDTzpDT0w6Q09MT01CSUE6Q2hvY286QkFISUEgU09MQU5PIChDSVVEQUQgTVVUSQorNTpDTzpDT0w6Q09MT01CSUE6Q2hvY286QkFISUEgU09MQU5PIChJcy4pCis2OkNPOkNPTDpDT0xPTUJJQTpDaG9jbzpCQUpPIEJBVURPIChJcy4pCis3OkNPOkNPTDpDT0xPTUJJQTpDaG9jbzpCQUpPIEJBVURPIChQSVpBUlJPKQorODpDTzpDT0w6Q09MT01CSUE6Q2hvY286Qk9KQVlBIChCRUxMQSBWSVNUQSkKKzk6Q086Q09MOkNPTE9NQklBOkNob2NvOkNBTlRPTiBERSBTQU4gUEFCTE8KKzEwOkNPOkNPTDpDT0xPTUJJQTpDaG9jbzpDT05ET1RPCisxMTpDTzpDT0w6Q09MT01CSUE6Q2hvY286RUwgQ0FSTUVOCisxMjpDTzpDT0w6Q09MT01CSUE6Q2hvY286SVNUTUlOQQorMTM6Q086Q09MOkNPTE9NQklBOkNob2NvOkpVUkFETworMTQ6Q086Q09MOkNPTE9NQklBOkNob2NvOkpVUkFETyAoSXMuKQorMTU6Q086Q09MOkNPTE9NQklBOkNob2NvOkxJVE9SQUwgREVMIFNBTiBKVUFOCisxNjpDTzpDT0w6Q09MT01CSUE6Q2hvY286TElUT1JBTCBERUwgU0FOIEpVQU4gKElzLgorMTc6Q086Q09MOkNPTE9NQklBOkNob2NvOkxMT1JPCisxODpDTzpDT0w6Q09MT01CSUE6Q2hvY286Tk9WSVRBCisxOTpDTzpDT0w6Q09MT01CSUE6Q2hvY286TlVRVUkKKzIwOkNPOkNPTDpDT0xPTUJJQTpDaG9jbzpRVUlCRE8KKzIxOkNPOkNPTDpDT0xPTUJJQTpDaG9jbzpSSU9TVUNJTworMjI6Q086Q09MOkNPTE9NQklBOkNob2NvOlNBTiBKT1NFIERFTCBQQUxNQVIKKzIzOkNPOkNPTDpDT0xPTUJJQTpDaG9jbzpTSVBJCisyNDpDTzpDT0w6Q09MT01CSUE6Q2hvY286VEFETworMjU6Q086Q09MOkNPTE9NQklBOkNob2NvOlVOR1VJQQorMTpDTzpDT0w6Q09MT01CSUE6QXJhdWNhOkFSQVVDQQorMjpDTzpDT0w6Q09MT01CSUE6QXJhdWNhOkFSQVVRVUlUQQorMzpDTzpDT0w6Q09MT01CSUE6QXJhdWNhOkNSQVZPIE5PUlRFCis0OkNPOkNPTDpDT0xPTUJJQTpBcmF1Y2E6Rk9SVFVMCis1OkNPOkNPTDpDT0xPTUJJQTpBcmF1Y2E6UFVFUlRPIFJPTkRPTgorNjpDTzpDT0w6Q09MT01CSUE6QXJhdWNhOlNBUkFWRU5BCis3OkNPOkNPTDpDT0xPTUJJQTpBcmF1Y2E6VEFNRQorMTpDTzpDT0w6Q09MT01CSUE6R3VhamlyYTpCQVJSQU5DQVMKKzI6Q086Q09MOkNPTE9NQklBOkd1YWppcmE6RUwgTU9MSU5PCiszOkNPOkNPTDpDT0xPTUJJQTpHdWFqaXJhOkZPTlNFQ0EKKzQ6Q086Q09MOkNPTE9NQklBOkd1YWppcmE6TUFJQ0FPCis1OkNPOkNPTDpDT0xPTUJJQTpHdWFqaXJhOk1BTkFVUkUKKzY6Q086Q09MOkNPTE9NQklBOkd1YWppcmE6UklPSEFDSEEKKzc6Q086Q09MOkNPTE9NQklBOkd1YWppcmE6U0FOIEpVQU4gREVMIENFU0FSCis4OkNPOkNPTDpDT0xPTUJJQTpHdWFqaXJhOlVSSUJJQQorOTpDTzpDT0w6Q09MT01CSUE6R3VhamlyYTpVUlVNSVRBCisxMDpDTzpDT0w6Q09MT01CSUE6R3VhamlyYTpWSUxMQU5VRVZBCisxOkNPOkNPTDpDT0xPTUJJQTpDYXVjYTpBTE1BR1VFUgorMjpDTzpDT0w6Q09MT01CSUE6Q2F1Y2E6QVJHRUxJQQorMzpDTzpDT0w6Q09MT01CSUE6Q2F1Y2E6QkFMQk9BCis0OkNPOkNPTDpDT0xPTUJJQTpDYXVjYTpCT0xJVkFSCis1OkNPOkNPTDpDT0xPTUJJQTpDYXVjYTpCVUVOT1MgQUlSRVMKKzY6Q086Q09MOkNPTE9NQklBOkNhdWNhOkNBSklCSU8KKzc6Q086Q09MOkNPTE9NQklBOkNhdWNhOkNBTERPTk8KKzg6Q086Q09MOkNPTE9NQklBOkNhdWNhOkNBTE9UTworOTpDTzpDT0w6Q09MT01CSUE6Q2F1Y2E6Q09SSU5UTworMTA6Q086Q09MOkNPTE9NQklBOkNhdWNhOkVMIFRBTUJPCisxMTpDTzpDT0w6Q09MT01CSUE6Q2F1Y2E6RkxPUkVOQ0lBCisxMjpDTzpDT0w6Q09MT01CSUE6Q2F1Y2E6R1VBUEkKKzEzOkNPOkNPTDpDT0xPTUJJQTpDYXVjYTpHVUFQSSAoSXMuKQorMTQ6Q086Q09MOkNPTE9NQklBOkNhdWNhOklOWkEKKzE1OkNPOkNPTDpDT0xPTUJJQTpDYXVjYTpJc2xhCisxNjpDTzpDT0w6Q09MT01CSUE6Q2F1Y2E6SkFNQkFMTworMTc6Q086Q09MOkNPTE9NQklBOkNhdWNhOkxBIFNJRVJSQQorMTg6Q086Q09MOkNPTE9NQklBOkNhdWNhOkxBIFZFR0EKKzE5OkNPOkNPTDpDT0xPTUJJQTpDYXVjYTpMT1BFWiBERSBNSUNBWQorMjA6Q086Q09MOkNPTE9NQklBOkNhdWNhOk1FUkNBREVSRVMKKzIxOkNPOkNPTDpDT0xPTUJJQTpDYXVjYTpNSVJBTkRBCisyMjpDTzpDT0w6Q09MT01CSUE6Q2F1Y2E6TU9SQUxFUworMjM6Q086Q09MOkNPTE9NQklBOkNhdWNhOlBBRElMTEEKKzI0OkNPOkNPTDpDT0xPTUJJQTpDYXVjYTpQQUVaCisyNTpDTzpDT0w6Q09MT01CSUE6Q2F1Y2E6UEFUSUEgKEVMIEJPUkRPKQorMjY6Q086Q09MOkNPTE9NQklBOkNhdWNhOlBJRU5EQU1PCisyNzpDTzpDT0w6Q09MT01CSUE6Q2F1Y2E6UE9QQVlBTgorMjg6Q086Q09MOkNPTE9NQklBOkNhdWNhOlBVRVJUTyBURUpBREEKKzI5OkNPOkNPTDpDT0xPTUJJQTpDYXVjYTpQVVJBQ0UKKzMwOkNPOkNPTDpDT0xPTUJJQTpDYXVjYTpST1NBUworMzE6Q086Q09MOkNPTE9NQklBOkNhdWNhOlNBTiBTRUJBU1RJQU4KKzMyOkNPOkNPTDpDT0xPTUJJQTpDYXVjYTpTQU5UQSBST1NBCiszMzpDTzpDT0w6Q09MT01CSUE6Q2F1Y2E6U0FOVEFOREVSIERFIFFVSUxJQ0hBTworMzQ6Q086Q09MOkNPTE9NQklBOkNhdWNhOlNJTFZJQQorMzU6Q086Q09MOkNPTE9NQklBOkNhdWNhOlNPVEFSQQorMzY6Q086Q09MOkNPTE9NQklBOkNhdWNhOlNVQVJFWgorMzc6Q086Q09MOkNPTE9NQklBOkNhdWNhOlRJTUJJTworMzg6Q086Q09MOkNPTE9NQklBOkNhdWNhOlRJTUJJUVVJCiszOTpDTzpDT0w6Q09MT01CSUE6Q2F1Y2E6VElNQklRVUkgKElzLikKKzQwOkNPOkNPTDpDT0xPTUJJQTpDYXVjYTpUT1JJQklPCis0MTpDTzpDT0w6Q09MT01CSUE6Q2F1Y2E6VE9UT1JPCisxOkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86QUxCQU4KKzI6Q086Q09MOkNPTE9NQklBOk5hcmlubzpBTERBTkEKKzM6Q086Q09MOkNPTE9NQklBOk5hcmlubzpBTkNVWUEKKzQ6Q086Q09MOkNPTE9NQklBOk5hcmlubzpBUkJPTEVEQQorNTpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOkJBUkJBQ09BUworNjpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOkJFTEVOCis3OkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86QlVFU0FDTworODpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOkNIQUNIQUdVSQorOTpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOkNPTE9OCisxMDpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOkNPTlNBQ0EKKzExOkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86Q09OVEFERVJPCisxMjpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOkNPUkRPQkEKKzEzOkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86Q1VBU1BVRAorMTQ6Q086Q09MOkNPTE9NQklBOk5hcmlubzpDVU1CQUwKKzE1OkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86Q1VNQklUQVJBCisxNjpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOkVMIENIQVJDTworMTc6Q086Q09MOkNPTE9NQklBOk5hcmlubzpFTCBDSEFSQ08gKElzLikKKzE4OkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86RUwgUk9TQVJJTworMTk6Q086Q09MOkNPTE9NQklBOk5hcmlubzpFTCBUQUJMT04KKzIwOkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86RUwgVEFNQk8KKzIxOkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86RlJBTkNJU0NPIFBJWkFSUk8KKzIyOkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86RlVORVMKKzIzOkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86R1VBQ0hVQ0FMCisyNDpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOkdVQUlUQVJJTExBCisyNTpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOkdVQUxNQVRBTgorMjY6Q086Q09MOkNPTE9NQklBOk5hcmlubzpJTEVTCisyNzpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOklNVUVTCisyODpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOklQSUFMRVMKKzI5OkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86TEEgQ1JVWgorMzA6Q086Q09MOkNPTE9NQklBOk5hcmlubzpMQSBGTE9SSURBCiszMTpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOkxBIExMQU5BREEKKzMyOkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86TEEgVE9MQQorMzM6Q086Q09MOkNPTE9NQklBOk5hcmlubzpMQSBVTklPTgorMzQ6Q086Q09MOkNPTE9NQklBOk5hcmlubzpMRUlWQQorMzU6Q086Q09MOkNPTE9NQklBOk5hcmlubzpMSU5BUkVTCiszNjpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOkxPUyBBTkRFUworMzc6Q086Q09MOkNPTE9NQklBOk5hcmlubzpNQUdVSQorMzg6Q086Q09MOkNPTE9NQklBOk5hcmlubzpNQUxMQU1BCiszOTpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOk1PU1FVRVJBCis0MDpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOk1PU1FVRVJBIChJcy4pCis0MTpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOk9MQVlBIEhFUlJFUkEKKzQyOkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86T1NQSU5BCis0MzpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOlBBU1RPCis0NDpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOlBPTElDQVJQQQorNDU6Q086Q09MOkNPTE9NQklBOk5hcmlubzpQT1RPU0kKKzQ2OkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86UFJPVklERU5DSUEKKzQ3OkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86UFVFUlJFUworNDg6Q086Q09MOkNPTE9NQklBOk5hcmlubzpQVVBJQUxFUworNDk6Q086Q09MOkNPTE9NQklBOk5hcmlubzpSSUNBVVJURQorNTA6Q086Q09MOkNPTE9NQklBOk5hcmlubzpST0JFUlRPIFBBWUFOCis1MTpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOlNBTUFOSUVHTworNTI6Q086Q09MOkNPTE9NQklBOk5hcmlubzpTQU4gQkVSTkFSRE8KKzUzOkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86U0FOIExPUkVOWk8KKzU0OkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86U0FOIFBBQkxPCis1NTpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOlNBTiBQRURSTyBERSBDQVJUQUdPCis1NjpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOlNBTkRPTkEKKzU3OkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86U0FOVEEgQkFSQkFSQQorNTg6Q086Q09MOkNPTE9NQklBOk5hcmlubzpTQU5UQSBDUlVaCis1OTpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOlNBUFVZRVMKKzYwOkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86VEFNSU5BTkdPCis2MTpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOlRBTkdVQQorNjI6Q086Q09MOkNPTE9NQklBOk5hcmlubzpUVU1BQ08KKzYzOkNPOkNPTDpDT0xPTUJJQTpOYXJpbm86VFVNQUNPIChJcy4pCis2NDpDTzpDT0w6Q09MT01CSUE6TmFyaW5vOlRVUVVFUlJFUworNjU6Q086Q09MOkNPTE9NQklBOk5hcmlubzpZQUNVQU5RVUVSCisxOkNPOkNPTDpDT0xPTUJJQTpCdWVuYXZlbnR1cmE6SXNsYQorMTpDTzpDT0w6Q09MT01CSUE6R3VhbmlhOkJBUlJBTkNPIE1JTkFTCisyOkNPOkNPTDpDT0xPTUJJQTpHdWFuaWE6Q0FDQUhVQUwKKzM6Q086Q09MOkNPTE9NQklBOkd1YW5pYTpJTklSSURBCis0OkNPOkNPTDpDT0xPTUJJQTpHdWFuaWE6TEEgR1VBREFMVVBFCis1OkNPOkNPTDpDT0xPTUJJQTpHdWFuaWE6UEFOQSBQQU5BCis2OkNPOkNPTDpDT0xPTUJJQTpHdWFuaWE6UFVFUlRPIENPTE9NQklBCis3OkNPOkNPTDpDT0xPTUJJQTpHdWFuaWE6U0FOIEZFTElQRQorMTpDTzpDT0w6Q09MT01CSUE6U2FuIEFuZHJlcyB5IFByb3ZpZGVuY2lhOlBST1ZJREVOQ0lBCisyOkNPOkNPTDpDT0xPTUJJQTpTYW4gQW5kcmVzIHkgUHJvdmlkZW5jaWE6U0FOIEFORFJFUworMzpDTzpDT0w6Q09MT01CSUE6U2FuIEFuZHJlcyB5IFByb3ZpZGVuY2lhOlNBTlRBIENBVEFMSU5BCisxOkNPOkNPTDpDT0xPTUJJQTpIdWlsYTpBQ0VWRURPCisyOkNPOkNPTDpDT0xPTUJJQTpIdWlsYTpBR1JBRE8KKzM6Q086Q09MOkNPTE9NQklBOkh1aWxhOkFJUEUKKzQ6Q086Q09MOkNPTE9NQklBOkh1aWxhOkFMR0VDSVJBUworNTpDTzpDT0w6Q09MT01CSUE6SHVpbGE6QUxUQU1JUkEKKzY6Q086Q09MOkNPTE9NQklBOkh1aWxhOkJBUkFZQQorNzpDTzpDT0w6Q09MT01CSUE6SHVpbGE6Q0FNUE8gQUxFR1JFCis4OkNPOkNPTDpDT0xPTUJJQTpIdWlsYTpDT0xPTUJJQQorOTpDTzpDT0w6Q09MT01CSUE6SHVpbGE6RUxJQVMKKzEwOkNPOkNPTDpDT0xPTUJJQTpIdWlsYTpHQVJaT04KKzExOkNPOkNPTDpDT0xPTUJJQTpIdWlsYTpHSUdBTlRFCisxMjpDTzpDT0w6Q09MT01CSUE6SHVpbGE6R1VBREFMVVBFCisxMzpDTzpDT0w6Q09MT01CSUE6SHVpbGE6SE9CTworMTQ6Q086Q09MOkNPTE9NQklBOkh1aWxhOklRVUlSQQorMTU6Q086Q09MOkNPTE9NQklBOkh1aWxhOklTTk9TCisxNjpDTzpDT0w6Q09MT01CSUE6SHVpbGE6TEEgQVJHRU5USU5BCisxNzpDTzpDT0w6Q09MT01CSUE6SHVpbGE6TEEgUExBVEEKKzE4OkNPOkNPTDpDT0xPTUJJQTpIdWlsYTpOQVRBR0EKKzE5OkNPOkNPTDpDT0xPTUJJQTpIdWlsYTpORUlWQQorMjA6Q086Q09MOkNPTE9NQklBOkh1aWxhOk9QT1JBUEEKKzIxOkNPOkNPTDpDT0xPTUJJQTpIdWlsYTpQQUlDT0wKKzIyOkNPOkNPTDpDT0xPTUJJQTpIdWlsYTpQQUxFUk1PCisyMzpDTzpDT0w6Q09MT01CSUE6SHVpbGE6UEFMRVNUSU5BCisyNDpDTzpDT0w6Q09MT01CSUE6SHVpbGE6UElUQUwKKzI1OkNPOkNPTDpDT0xPTUJJQTpIdWlsYTpQSVRBTElUTworMjY6Q086Q09MOkNPTE9NQklBOkh1aWxhOlJJVkVSQQorMjc6Q086Q09MOkNPTE9NQklBOkh1aWxhOlNBTEFETyBCTEFOQ08KKzI4OkNPOkNPTDpDT0xPTUJJQTpIdWlsYTpTQU4gQUdVU1RJTgorMjk6Q086Q09MOkNPTE9NQklBOkh1aWxhOlNBTlRBIE1BUklBCiszMDpDTzpDT0w6Q09MT01CSUE6SHVpbGE6U1VBWkEKKzMxOkNPOkNPTDpDT0xPTUJJQTpIdWlsYTpUQVJRVUkKKzMyOkNPOkNPTDpDT0xPTUJJQTpIdWlsYTpURUxMTworMzM6Q086Q09MOkNPTE9NQklBOkh1aWxhOlRFUlVFTAorMzQ6Q086Q09MOkNPTE9NQklBOkh1aWxhOlRFU0FMSUEKKzM1OkNPOkNPTDpDT0xPTUJJQTpIdWlsYTpUSU1BTkEKKzM2OkNPOkNPTDpDT0xPTUJJQTpIdWlsYTpWSUxMQSBWSUVKQQorMzc6Q086Q09MOkNPTE9NQklBOkh1aWxhOllBR1VBUkEKKzE6Q086Q09MOkNPTE9NQklBOk5vcnRlIGRlIFNhbnRhbmRlcjpBQlJFR08KKzI6Q086Q09MOkNPTE9NQklBOk5vcnRlIGRlIFNhbnRhbmRlcjpBUkJPTEVEQVMKKzM6Q086Q09MOkNPTE9NQklBOk5vcnRlIGRlIFNhbnRhbmRlcjpCT0NIQUxFTUEKKzQ6Q086Q09MOkNPTE9NQklBOk5vcnRlIGRlIFNhbnRhbmRlcjpCVUNBUkFTSUNBCis1OkNPOkNPTDpDT0xPTUJJQTpOb3J0ZSBkZSBTYW50YW5kZXI6Q0FDSElSQQorNjpDTzpDT0w6Q09MT01CSUE6Tm9ydGUgZGUgU2FudGFuZGVyOkNBQ09UQQorNzpDTzpDT0w6Q09MT01CSUE6Tm9ydGUgZGUgU2FudGFuZGVyOkNISU5BQ09UQQorODpDTzpDT0w6Q09MT01CSUE6Tm9ydGUgZGUgU2FudGFuZGVyOkNISVRBR0EKKzk6Q086Q09MOkNPTE9NQklBOk5vcnRlIGRlIFNhbnRhbmRlcjpDT05WRU5DSU9OCisxMDpDTzpDT0w6Q09MT01CSUE6Tm9ydGUgZGUgU2FudGFuZGVyOkNVQ1VUQQorMTE6Q086Q09MOkNPTE9NQklBOk5vcnRlIGRlIFNhbnRhbmRlcjpDVUNVVElMTEEKKzEyOkNPOkNPTDpDT0xPTUJJQTpOb3J0ZSBkZSBTYW50YW5kZXI6RFVSQU5JQQorMTM6Q086Q09MOkNPTE9NQklBOk5vcnRlIGRlIFNhbnRhbmRlcjpFTCBDQVJNRU4KKzE0OkNPOkNPTDpDT0xPTUJJQTpOb3J0ZSBkZSBTYW50YW5kZXI6RUwgVEFSUkEKKzE1OkNPOkNPTDpDT0xPTUJJQTpOb3J0ZSBkZSBTYW50YW5kZXI6RUwgWlVMSUEKKzE2OkNPOkNPTDpDT0xPTUJJQTpOb3J0ZSBkZSBTYW50YW5kZXI6R1JBTUFMT1RFCisxNzpDTzpDT0w6Q09MT01CSUE6Tm9ydGUgZGUgU2FudGFuZGVyOkhBQ0FSSQorMTg6Q086Q09MOkNPTE9NQklBOk5vcnRlIGRlIFNhbnRhbmRlcjpIRVJSQU4KKzE5OkNPOkNPTDpDT0xPTUJJQTpOb3J0ZSBkZSBTYW50YW5kZXI6TEEgRVNQRVJBTlpBCisyMDpDTzpDT0w6Q09MT01CSUE6Tm9ydGUgZGUgU2FudGFuZGVyOkxBIFBMQVlBCisyMTpDTzpDT0w6Q09MT01CSUE6Tm9ydGUgZGUgU2FudGFuZGVyOkxBQkFURUNBCisyMjpDTzpDT0w6Q09MT01CSUE6Tm9ydGUgZGUgU2FudGFuZGVyOkxPUyBQQVRJT1MKKzIzOkNPOkNPTDpDT0xPTUJJQTpOb3J0ZSBkZSBTYW50YW5kZXI6TE9VUkRFUworMjQ6Q086Q09MOkNPTE9NQklBOk5vcnRlIGRlIFNhbnRhbmRlcjpNVVRJU0NVQQorMjU6Q086Q09MOkNPTE9NQklBOk5vcnRlIGRlIFNhbnRhbmRlcjpPQ0E/QQorMjY6Q086Q09MOkNPTE9NQklBOk5vcnRlIGRlIFNhbnRhbmRlcjpQQU1QTE9OQQorMjc6Q086Q09MOkNPTE9NQklBOk5vcnRlIGRlIFNhbnRhbmRlcjpQQU1QTE9OSVRBCisyODpDTzpDT0w6Q09MT01CSUE6Tm9ydGUgZGUgU2FudGFuZGVyOlBVRVJUTyBTQU5UQU5ERVIKKzI5OkNPOkNPTDpDT0xPTUJJQTpOb3J0ZSBkZSBTYW50YW5kZXI6UkFHT05WQUxJQQorMzA6Q086Q09MOkNPTE9NQklBOk5vcnRlIGRlIFNhbnRhbmRlcjpTQUxBWkFSCiszMTpDTzpDT0w6Q09MT01CSUE6Tm9ydGUgZGUgU2FudGFuZGVyOlNBTiBDQUxJWFRPCiszMjpDTzpDT0w6Q09MT01CSUE6Tm9ydGUgZGUgU2FudGFuZGVyOlNBTiBDQVlFVEFOTworMzM6Q086Q09MOkNPTE9NQklBOk5vcnRlIGRlIFNhbnRhbmRlcjpTQU5USUFHTworMzQ6Q086Q09MOkNPTE9NQklBOk5vcnRlIGRlIFNhbnRhbmRlcjpTQVJESU5BVEEKKzM1OkNPOkNPTDpDT0xPTUJJQTpOb3J0ZSBkZSBTYW50YW5kZXI6U0lMT1MKKzM2OkNPOkNPTDpDT0xPTUJJQTpOb3J0ZSBkZSBTYW50YW5kZXI6VEVPUkFNQQorMzc6Q086Q09MOkNPTE9NQklBOk5vcnRlIGRlIFNhbnRhbmRlcjpUSUJVCiszODpDTzpDT0w6Q09MT01CSUE6Tm9ydGUgZGUgU2FudGFuZGVyOlRPTEVETworMzk6Q086Q09MOkNPTE9NQklBOk5vcnRlIGRlIFNhbnRhbmRlcjpWSUxMQSBDQVJPCis0MDpDTzpDT0w6Q09MT01CSUE6Tm9ydGUgZGUgU2FudGFuZGVyOlZJTExBIERFTCBST1NBUklPCisxOkNPOkNPTDpDT0xPTUJJQTpQdXR1bWF5bzpDT0xPTgorMjpDTzpDT0w6Q09MT01CSUE6UHV0dW1heW86TU9DT0EKKzM6Q086Q09MOkNPTE9NQklBOlB1dHVtYXlvOk9SSVRPCis0OkNPOkNPTDpDT0xPTUJJQTpQdXR1bWF5bzpQVUVSVE8gQVNJUworNTpDTzpDT0w6Q09MT01CSUE6UHV0dW1heW86UFVFUlRPIENBSUNFRE8KKzY6Q086Q09MOkNPTE9NQklBOlB1dHVtYXlvOlBVRVJUTyBHVVpNQU4KKzc6Q086Q09MOkNPTE9NQklBOlB1dHVtYXlvOlBVRVJUTyBMRUdVSVpBTU8KKzg6Q086Q09MOkNPTE9NQklBOlB1dHVtYXlvOlNBTiBGUkFOQ0lTQ08KKzk6Q086Q09MOkNPTE9NQklBOlB1dHVtYXlvOlNBTlRJQUdPCisxMDpDTzpDT0w6Q09MT01CSUE6UHV0dW1heW86U0lCVU5ET1kKKzExOkNPOkNPTDpDT0xPTUJJQTpQdXR1bWF5bzpWQUxMRSBERUwgR1VBTVVFWiAoTEEgSE9SCisxMjpDTzpDT0w6Q09MT01CSUE6UHV0dW1heW86VklMTEFHQVJaT04KKzE6Q086Q09MOkNPTE9NQklBOkNvcmRvYmE6QVlBUEVMCisyOkNPOkNPTDpDT0xPTUJJQTpDb3Jkb2JhOkJVRU5BVklTVEEKKzM6Q086Q09MOkNPTE9NQklBOkNvcmRvYmE6Q0FOQUxFVEUKKzQ6Q086Q09MOkNPTE9NQklBOkNvcmRvYmE6Q0VSRVRFCis1OkNPOkNPTDpDT0xPTUJJQTpDb3Jkb2JhOkNISU1BCis2OkNPOkNPTDpDT0xPTUJJQTpDb3Jkb2JhOkNISU5VCis3OkNPOkNPTDpDT0xPTUJJQTpDb3Jkb2JhOkNJRU5BR0EgREUgT1JPCis4OkNPOkNPTDpDT0xPTUJJQTpDb3Jkb2JhOkxPUklDQQorOTpDTzpDT0w6Q09MT01CSUE6Q29yZG9iYTpMT1MgQ09SRE9CQVMKKzEwOkNPOkNPTDpDT0xPTUJJQTpDb3Jkb2JhOk1PP0lUT1MKKzExOkNPOkNPTDpDT0xPTUJJQTpDb3Jkb2JhOk1PTUlMCisxMjpDTzpDT0w6Q09MT01CSUE6Q29yZG9iYTpNT05JVE9TIChJcy4pCisxMzpDTzpDT0w6Q09MT01CSUE6Q29yZG9iYTpNT05URUxJQkFOTworMTQ6Q086Q09MOkNPTE9NQklBOkNvcmRvYmE6TU9OVEVSSUEKKzE1OkNPOkNPTDpDT0xPTUJJQTpDb3Jkb2JhOlBMQU5FVEEgUklDQQorMTY6Q086Q09MOkNPTE9NQklBOkNvcmRvYmE6UFVFQkxPIE5VRVZPCisxNzpDTzpDT0w6Q09MT01CSUE6Q29yZG9iYTpQVUVSVE8gRVNDT05ESURPCisxODpDTzpDT0w6Q09MT01CSUE6Q29yZG9iYTpQVUVSVE8gTElCRVJUQURPUgorMTk6Q086Q09MOkNPTE9NQklBOkNvcmRvYmE6UFVSSVNJTUEKKzIwOkNPOkNPTDpDT0xPTUJJQTpDb3Jkb2JhOlNBSEFHVU4KKzIxOkNPOkNPTDpDT0xPTUJJQTpDb3Jkb2JhOlNBTiBBTkRSRVMgREUgU09UQVZFTlRPCisyMjpDTzpDT0w6Q09MT01CSUE6Q29yZG9iYTpTQU4gQU5URVJPCisyMzpDTzpDT0w6Q09MT01CSUE6Q29yZG9iYTpTQU4gQkVSTkFSRE8gRUwgVklFTlRPCisyNDpDTzpDT0w6Q09MT01CSUE6Q29yZG9iYTpTQU4gQkVSTkFSRE8gRUwgVklFTlRPIChJCisyNTpDTzpDT0w6Q09MT01CSUE6Q29yZG9iYTpTQU4gQ0FSTE9TCisyNjpDTzpDT0w6Q09MT01CSUE6Q29yZG9iYTpTQU4gUEVMQVlPCisyNzpDTzpDT0w6Q09MT01CSUE6Q29yZG9iYTpUSUVSUkFMVEEKKzI4OkNPOkNPTDpDT0xPTUJJQTpDb3Jkb2JhOlZBTEVOQ0lBCisxOkNPOkNPTDpDT0xPTUJJQTpRdWluZGlvOkFSTUVOSUEKKzI6Q086Q09MOkNPTE9NQklBOlF1aW5kaW86QlVFTkFWSVNUQQorMzpDTzpDT0w6Q09MT01CSUE6UXVpbmRpbzpDQUxBUkNBCis0OkNPOkNPTDpDT0xPTUJJQTpRdWluZGlvOkNJUkNBU0lBCis1OkNPOkNPTDpDT0xPTUJJQTpRdWluZGlvOkNPUkRPQkEKKzY6Q086Q09MOkNPTE9NQklBOlF1aW5kaW86RklMQU5ESUEKKzc6Q086Q09MOkNPTE9NQklBOlF1aW5kaW86R0VOT1ZBCis4OkNPOkNPTDpDT0xPTUJJQTpRdWluZGlvOkxBIFRFQkFJREEKKzk6Q086Q09MOkNPTE9NQklBOlF1aW5kaW86TU9OVEVORUdSTworMTA6Q086Q09MOkNPTE9NQklBOlF1aW5kaW86UElKQU8KKzExOkNPOkNPTDpDT0xPTUJJQTpRdWluZGlvOlFVSU1CQVlBCisxMjpDTzpDT0w6Q09MT01CSUE6UXVpbmRpbzpTQUxFTlRPCisxOkNPOkNPTDpDT0xPTUJJQTpBdGxhbnRpY286QkFSQU5PQQorMjpDTzpDT0w6Q09MT01CSUE6QXRsYW50aWNvOkJBUlJBTlFVSUxMQSAgKERJU1QuUE9SVC4KKzM6Q086Q09MOkNPTE9NQklBOkF0bGFudGljbzpDQU1QTyBERSBMQSBDUlVaCis0OkNPOkNPTDpDT0xPTUJJQTpBdGxhbnRpY286Q0FOREVMQVJJQQorNTpDTzpDT0w6Q09MT01CSUE6QXRsYW50aWNvOkdBTEFQQQorNjpDTzpDT0w6Q09MT01CSUE6QXRsYW50aWNvOkpVQU4gREUgQUNPU1RBCis3OkNPOkNPTDpDT0xPTUJJQTpBdGxhbnRpY286TFVSVUFDTworODpDTzpDT0w6Q09MT01CSUE6QXRsYW50aWNvOk1BTEFNQk8KKzk6Q086Q09MOkNPTE9NQklBOkF0bGFudGljbzpNQU5BVEkKKzEwOkNPOkNPTDpDT0xPTUJJQTpBdGxhbnRpY286UEFMTUFSIERFIFZBUkVMQQorMTE6Q086Q09MOkNPTE9NQklBOkF0bGFudGljbzpQSU9KTworMTI6Q086Q09MOkNPTE9NQklBOkF0bGFudGljbzpQT0xPIE5VRVZPCisxMzpDTzpDT0w6Q09MT01CSUE6QXRsYW50aWNvOlBPTkVERVJBCisxNDpDTzpDT0w6Q09MT01CSUE6QXRsYW50aWNvOlBVRVJUTyBDT0xPTUJJQQorMTU6Q086Q09MOkNPTE9NQklBOkF0bGFudGljbzpSRVBFTE9OCisxNjpDTzpDT0w6Q09MT01CSUE6QXRsYW50aWNvOlNBQkFOQUdSQU5ERQorMTc6Q086Q09MOkNPTE9NQklBOkF0bGFudGljbzpTQUJBTkFMQVJHQQorMTg6Q086Q09MOkNPTE9NQklBOkF0bGFudGljbzpTQU5UQSBMVUNJQQorMTk6Q086Q09MOkNPTE9NQklBOkF0bGFudGljbzpTQU5UTyBUT01BUworMjA6Q086Q09MOkNPTE9NQklBOkF0bGFudGljbzpTT0xFREFECisyMTpDTzpDT0w6Q09MT01CSUE6QXRsYW50aWNvOlNVQU4KKzIyOkNPOkNPTDpDT0xPTUJJQTpBdGxhbnRpY286VFVCQVJBCisyMzpDTzpDT0w6Q09MT01CSUE6QXRsYW50aWNvOlVTSUFDVVJJCisxOkNPOkNPTDpDT0xPTUJJQTpNYWdkYWxlbmE6QVJBQ0FUQUNBCisyOkNPOkNPTDpDT0xPTUJJQTpNYWdkYWxlbmE6QVJJR1VBTkkKKzM6Q086Q09MOkNPTE9NQklBOk1hZ2RhbGVuYTpDRVJSTyBTQU4gQU5UT05JTworNDpDTzpDT0w6Q09MT01CSUE6TWFnZGFsZW5hOkNISVZPTE8KKzU6Q086Q09MOkNPTE9NQklBOk1hZ2RhbGVuYTpDSUVOQUdBCis2OkNPOkNPTDpDT0xPTUJJQTpNYWdkYWxlbmE6RUwgQkFOQ08KKzc6Q086Q09MOkNPTE9NQklBOk1hZ2RhbGVuYTpFTCBQST9PTgorODpDTzpDT0w6Q09MT01CSUE6TWFnZGFsZW5hOkZVTkRBQ0lPTgorOTpDTzpDT0w6Q09MT01CSUE6TWFnZGFsZW5hOkdVQU1BTAorMTA6Q086Q09MOkNPTE9NQklBOk1hZ2RhbGVuYTpQRURSQVpBCisxMTpDTzpDT0w6Q09MT01CSUE6TWFnZGFsZW5hOlBJVklKQVkKKzEyOkNPOkNPTDpDT0xPTUJJQTpNYWdkYWxlbmE6UExBVE8KKzEzOkNPOkNPTDpDT0xPTUJJQTpNYWdkYWxlbmE6UFVFQkxPIFZJRUpPCisxNDpDTzpDT0w6Q09MT01CSUE6TWFnZGFsZW5hOlJFTU9MSU5PCisxNTpDTzpDT0w6Q09MT01CSUE6TWFnZGFsZW5hOlNBTEFNSU5BCisxNjpDTzpDT0w6Q09MT01CSUE6TWFnZGFsZW5hOlNBTiBTRUJBU1RJQU4gREUgQlVFTkFWSVMKKzE3OkNPOkNPTDpDT0xPTUJJQTpNYWdkYWxlbmE6U0FOIFpFTk9OCisxODpDTzpDT0w6Q09MT01CSUE6TWFnZGFsZW5hOlNBTlRBIEFOQQorMTk6Q086Q09MOkNPTE9NQklBOk1hZ2RhbGVuYTpTQU5UQSBNQVJUQSAoRElTVC4gRVNQLikKKzIwOkNPOkNPTDpDT0xPTUJJQTpNYWdkYWxlbmE6U0FOVEEgTUFSVEEgKERJU1QuIEVTUC4pKAorMjE6Q086Q09MOkNPTE9NQklBOk1hZ2RhbGVuYTpURU5FUklGRQorMTpDTzpDT0w6Q09MT01CSUE6QW1hem9uYXM6RUwgRU5DQU5UTworMjpDTzpDT0w6Q09MT01CSUE6QW1hem9uYXM6TEEgQ0hPUlJFUkEKKzM6Q086Q09MOkNPTE9NQklBOkFtYXpvbmFzOkxBIFBFRFJFUkEKKzQ6Q086Q09MOkNPTE9NQklBOkFtYXpvbmFzOkxFVElDSUEKKzU6Q086Q09MOkNPTE9NQklBOkFtYXpvbmFzOk1JUklUSSBQQVJBTkEKKzY6Q086Q09MOkNPTE9NQklBOkFtYXpvbmFzOlBVRVJUTyBOQVJJTk8KKzc6Q086Q09MOkNPTE9NQklBOkFtYXpvbmFzOlBVRVJUTyBTQU5UQU5ERVIKKzg6Q086Q09MOkNPTE9NQklBOkFtYXpvbmFzOlRBUkFQQUNBCisxOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6QUdVQURBCisyOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6QUxCQU5JQQorMzpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkFSQVRPQ0EKKzQ6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpCQVJCT1NBCis1OkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6QkFSSUNIQVJBCis2OkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6QkFSUkFOQ0FCRVJNRUpBCis3OkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6QkVUVUxJQQorODpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkJPTElWQVIKKzk6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpCVUNBUkFNQU5HQQorMTA6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpDQUJSRVJBCisxMTpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkNBTElGT1JOSUEKKzEyOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6Q0FQSVRBTkVKTworMTM6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpDQVJDQVNJCisxNDpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkNFUElUQQorMTU6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpDRVJSSVRPCisxNjpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkNIQVJBTEEKKzE3OkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6Q0hBUlRBCisxODpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkNISU1BCisxOTpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkNISVBBVEEKKzIwOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6Q0lNSVRBUlJBCisyMTpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkNPTkNFUENJT04KKzIyOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6Q09ORklORVMKKzIzOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6Q09OVFJBVEFDSU9OCisyNDpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkNPUk9NT1JPCisyNTpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkNVUklUSQorMjY6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpFTCBDQVJNRU4KKzI3OkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6RUwgR1VBQ0FNQVlPCisyODpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkVMIFBFP09OCisyOTpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkVMIFBMQVlPTgorMzA6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpFTkNJTk8KKzMxOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6RU5DSVNPCiszMjpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkZMT1JJQU4KKzMzOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6RkxPUklEQUJMQU5DQQorMzQ6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpHQUxBTgorMzU6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpHQU1CSVRBCiszNjpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkdJUk9OCiszNzpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkdVQUNBCiszODpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkdVQURBTFVQRQorMzk6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpHVUFQT1RBCis0MDpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkdVQVZBVEEKKzQxOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6R1VFUFNBCis0MjpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkhBVE8KKzQzOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6SkVTVVMgTUFSSUEKKzQ0OkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6Sk9SREFOCis0NTpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkxBIEJFTExFWkEKKzQ2OkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6TEEgUEFaCis0NzpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkxBTkRBWlVSSQorNDg6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpMRUJSSUpBCis0OTpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOkxPUyBTQU5UT1MKKzUwOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6TUFDQVJBVklUQQorNTE6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpNQUxBR0EKKzUyOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6TUFUQU5aQQorNTM6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpNT0dPVEVTCis1NDpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOk1PTEFHQVZJVEEKKzU1OkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6T0NBTU9OVEUKKzU2OkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6T0lCQQorNTc6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpPTlpBR0EKKzU4OkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6UEFMTUFSCis1OTpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOlBBTE1BUyBERUwgU09DT1JSTworNjA6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpQQVJBTU8KKzYxOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6UElFREVDVUVTVEEKKzYyOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6UElOQ0hPVEUKKzYzOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6UFVFTlRFIE5BQ0lPTkFMCis2NDpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOlBVRVJUTyBQQVJSQQorNjU6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpQVUVSVE8gV0lMQ0hFUworNjY6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpSSU9ORUdSTworNjc6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpTQUJBTkEgREUgVE9SUkVTCis2ODpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOlNBTiBBTkRSRVMKKzY5OkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6U0FOIEJFTklUTworNzA6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpTQU4gR0lMCis3MTpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOlNBTiBKT0FRVUlOCis3MjpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOlNBTiBKT1NFIE1JUkFOREEKKzczOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6U0FOIE1JR1VFTAorNzQ6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpTQU4gVklDRU5URSBERSBDSFVDVVJJCis3NTpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOlNBTlRBIEJBUkJBUkEKKzc2OkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6U0FOVEEgSEVMRU5BIERFIE9QT04KKzc3OkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6U0lNQUNPVEEKKzc4OkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6U09DT1JSTworNzk6Q086Q09MOkNPTE9NQklBOlNhbnRhbmRlcjpTVUFJVEEKKzgwOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6U1VDUkUKKzgxOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6U1VSQVRBCis4MjpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOlRPTkEKKzgzOkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6VkFMTEUgREUgIFNBTiBKT1NFCis4NDpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOlZFTEVaCis4NTpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOlZFVEFTCis4NjpDTzpDT0w6Q09MT01CSUE6U2FudGFuZGVyOlZJTExBTlVFVkEKKzg3OkNPOkNPTDpDT0xPTUJJQTpTYW50YW5kZXI6WkFQQVRPQ0EKKzE6Q086Q09MOkNPTE9NQklBOlZhbGxlIGRlbCBDYXVjYTpBTENBTEEKKzI6Q086Q09MOkNPTE9NQklBOlZhbGxlIGRlbCBDYXVjYTpBTkRBTFVDSUEKKzM6Q086Q09MOkNPTE9NQklBOlZhbGxlIGRlbCBDYXVjYTpBTlNFUk1BTlVFVk8KKzQ6Q086Q09MOkNPTE9NQklBOlZhbGxlIGRlbCBDYXVjYTpBUkdFTElBCis1OkNPOkNPTDpDT0xPTUJJQTpWYWxsZSBkZWwgQ2F1Y2E6Qk9MSVZBUgorNjpDTzpDT0w6Q09MT01CSUE6VmFsbGUgZGVsIENhdWNhOkJVRU5BVkVOVFVSQQorNzpDTzpDT0w6Q09MT01CSUE6VmFsbGUgZGVsIENhdWNhOkJVRU5BVkVOVFVSQSAoSXMuKQorODpDTzpDT0w6Q09MT01CSUE6VmFsbGUgZGVsIENhdWNhOkJVR0EKKzk6Q086Q09MOkNPTE9NQklBOlZhbGxlIGRlbCBDYXVjYTpCVUdBTEFHUkFOREUKKzEwOkNPOkNPTDpDT0xPTUJJQTpWYWxsZSBkZWwgQ2F1Y2E6Q0FJQ0VET05JQQorMTE6Q086Q09MOkNPTE9NQklBOlZhbGxlIGRlbCBDYXVjYTpDQUxJCisxMjpDTzpDT0w6Q09MT01CSUE6VmFsbGUgZGVsIENhdWNhOkNBTElNQSAgKERBUklFTikKKzEzOkNPOkNPTDpDT0xPTUJJQTpWYWxsZSBkZWwgQ2F1Y2E6Q0FOREVMQVJJQQorMTQ6Q086Q09MOkNPTE9NQklBOlZhbGxlIGRlbCBDYXVjYTpDQVJUQUdPCisxNTpDTzpDT0w6Q09MT01CSUE6VmFsbGUgZGVsIENhdWNhOkRBR1VBCisxNjpDTzpDT0w6Q09MT01CSUE6VmFsbGUgZGVsIENhdWNhOkVMIEFHVUlMQQorMTc6Q086Q09MOkNPTE9NQklBOlZhbGxlIGRlbCBDYXVjYTpFTCBDQUlSTworMTg6Q086Q09MOkNPTE9NQklBOlZhbGxlIGRlbCBDYXVjYTpFTCBDRVJSSVRPCisxOTpDTzpDT0w6Q09MT01CSUE6VmFsbGUgZGVsIENhdWNhOkVMIERPVklPCisyMDpDTzpDT0w6Q09MT01CSUE6VmFsbGUgZGVsIENhdWNhOkZMT1JJREEKKzIxOkNPOkNPTDpDT0xPTUJJQTpWYWxsZSBkZWwgQ2F1Y2E6R0lORUJSQQorMjI6Q086Q09MOkNPTE9NQklBOlZhbGxlIGRlbCBDYXVjYTpHVUFDQVJJCisyMzpDTzpDT0w6Q09MT01CSUE6VmFsbGUgZGVsIENhdWNhOkpBTVVOREkKKzI0OkNPOkNPTDpDT0xPTUJJQTpWYWxsZSBkZWwgQ2F1Y2E6TEEgQ1VNQlJFCisyNTpDTzpDT0w6Q09MT01CSUE6VmFsbGUgZGVsIENhdWNhOkxBIFVOSU9OCisyNjpDTzpDT0w6Q09MT01CSUE6VmFsbGUgZGVsIENhdWNhOkxBIFZJQ1RPUklBCisyNzpDTzpDT0w6Q09MT01CSUE6VmFsbGUgZGVsIENhdWNhOk9CQU5ETworMjg6Q086Q09MOkNPTE9NQklBOlZhbGxlIGRlbCBDYXVjYTpQQUxNSVJBCisyOTpDTzpDT0w6Q09MT01CSUE6VmFsbGUgZGVsIENhdWNhOlBSQURFUkEKKzMwOkNPOkNPTDpDT0xPTUJJQTpWYWxsZSBkZWwgQ2F1Y2E6UkVTVFJFUE8KKzMxOkNPOkNPTDpDT0xPTUJJQTpWYWxsZSBkZWwgQ2F1Y2E6UklPRlJJTworMzI6Q086Q09MOkNPTE9NQklBOlZhbGxlIGRlbCBDYXVjYTpST0xEQU5JTExPCiszMzpDTzpDT0w6Q09MT01CSUE6VmFsbGUgZGVsIENhdWNhOlNBTiBQRURSTworMzQ6Q086Q09MOkNPTE9NQklBOlZhbGxlIGRlbCBDYXVjYTpTRVZJTExBCiszNTpDTzpDT0w6Q09MT01CSUE6VmFsbGUgZGVsIENhdWNhOlRPUk8KKzM2OkNPOkNPTDpDT0xPTUJJQTpWYWxsZSBkZWwgQ2F1Y2E6VFJVSklMTE8KKzM3OkNPOkNPTDpDT0xPTUJJQTpWYWxsZSBkZWwgQ2F1Y2E6VFVMVUEKKzM4OkNPOkNPTDpDT0xPTUJJQTpWYWxsZSBkZWwgQ2F1Y2E6VUxMT0EKKzM5OkNPOkNPTDpDT0xPTUJJQTpWYWxsZSBkZWwgQ2F1Y2E6VkVSU0FMTEVTCis0MDpDTzpDT0w6Q09MT01CSUE6VmFsbGUgZGVsIENhdWNhOlZJSkVTCis0MTpDTzpDT0w6Q09MT01CSUE6VmFsbGUgZGVsIENhdWNhOllPVE9DTworNDI6Q086Q09MOkNPTE9NQklBOlZhbGxlIGRlbCBDYXVjYTpZVU1CTworNDM6Q086Q09MOkNPTE9NQklBOlZhbGxlIGRlbCBDYXVjYTpaQVJaQUwKKzE6Q086Q09MOkNPTE9NQklBOlZpY2hhZGE6Q1VNQVJJQk8KKzI6Q086Q09MOkNPTE9NQklBOlZpY2hhZGE6TEEgUFJJTUFWRVJBCiszOkNPOkNPTDpDT0xPTUJJQTpWaWNoYWRhOlBVRVJUTyBDQVJSRU5PCis0OkNPOkNPTDpDT0xPTUJJQTpWaWNoYWRhOlNBTiBKT1NFIERFIE9DVU5FCis1OkNPOkNPTDpDT0xPTUJJQTpWaWNoYWRhOlNBTlRBIFJJVEEKKzY6Q086Q09MOkNPTE9NQklBOlZpY2hhZGE6U0FOVEEgUk9TQUxJQQorMTpDTzpDT0w6Q09MT01CSUE6TWV0YTpBQ0FDSUFTCisyOkNPOkNPTDpDT0xPTUJJQTpNZXRhOkJBUlJBTkNBIERFIFVQSUEKKzM6Q086Q09MOkNPTE9NQklBOk1ldGE6Q0FCVVlBUk8KKzQ6Q086Q09MOkNPTE9NQklBOk1ldGE6Q0FTVElMTEEgTEEgTlVFVkEKKzU6Q086Q09MOkNPTE9NQklBOk1ldGE6Q1VCQVJSQUwKKzY6Q086Q09MOkNPTE9NQklBOk1ldGE6Q1VNQVJBTAorNzpDTzpDT0w6Q09MT01CSUE6TWV0YTpFTCBDQUxWQVJJTworODpDTzpDT0w6Q09MT01CSUE6TWV0YTpFTCBDQVNUSUxMTworOTpDTzpDT0w6Q09MT01CSUE6TWV0YTpFTCBET1JBRE8KKzEwOkNPOkNPTDpDT0xPTUJJQTpNZXRhOkZVRU5URSBERSBPUk8KKzExOkNPOkNPTDpDT0xPTUJJQTpNZXRhOkdSQU5BREEKKzEyOkNPOkNPTDpDT0xPTUJJQTpNZXRhOkdVQU1BTAorMTM6Q086Q09MOkNPTE9NQklBOk1ldGE6TEEgTUFDQVJFTkEKKzE0OkNPOkNPTDpDT0xPTUJJQTpNZXRhOkxBIFVSSUJFCisxNTpDTzpDT0w6Q09MT01CSUE6TWV0YTpMRUpBTklBUworMTY6Q086Q09MOkNPTE9NQklBOk1ldGE6TUFQSVJJUEFOCisxNzpDTzpDT0w6Q09MT01CSUE6TWV0YTpNRVNFVEFTCisxODpDTzpDT0w6Q09MT01CSUE6TWV0YTpQVUVSVE8gQ09OQ09SRElBCisxOTpDTzpDT0w6Q09MT01CSUE6TWV0YTpQVUVSVE8gR0FJVEFOCisyMDpDTzpDT0w6Q09MT01CSUE6TWV0YTpQVUVSVE8gTExFUkFTCisyMTpDTzpDT0w6Q09MT01CSUE6TWV0YTpQVUVSVE8gTE9QRVoKKzIyOkNPOkNPTDpDT0xPTUJJQTpNZXRhOlBVRVJUTyBSSUNPCisyMzpDTzpDT0w6Q09MT01CSUE6TWV0YTpSRVNUUkVQTworMjQ6Q086Q09MOkNPTE9NQklBOk1ldGE6U0FOIENBUkxPUyBERSBHVUFST0EKKzI1OkNPOkNPTDpDT0xPTUJJQTpNZXRhOlNBTiBKVUFOIERFIEFSQU1BCisyNjpDTzpDT0w6Q09MT01CSUE6TWV0YTpTQU4gSlVBTklUTworMjc6Q086Q09MOkNPTE9NQklBOk1ldGE6U0FOIE1BUlRJTgorMjg6Q086Q09MOkNPTE9NQklBOk1ldGE6VklMTEFWSUNFTkNJTworMjk6Q086Q09MOkNPTE9NQklBOk1ldGE6VklTVEFIRVJNT1NBCisxOkNPOkNPTDpDT0xPTUJJQTpSaXNhcmFsZGE6QVBJQQorMjpDTzpDT0w6Q09MT01CSUE6UmlzYXJhbGRhOkJBTEJPQQorMzpDTzpDT0w6Q09MT01CSUE6UmlzYXJhbGRhOkJFTEVOIERFIFVNQlJJQQorNDpDTzpDT0w6Q09MT01CSUE6UmlzYXJhbGRhOkRPUyBRVUVCUkFEQVMKKzU6Q086Q09MOkNPTE9NQklBOlJpc2FyYWxkYTpHVUFUSUNBCis2OkNPOkNPTDpDT0xPTUJJQTpSaXNhcmFsZGE6TEEgQ0VMSUEKKzc6Q086Q09MOkNPTE9NQklBOlJpc2FyYWxkYTpMQSBWSVJHSU5JQQorODpDTzpDT0w6Q09MT01CSUE6UmlzYXJhbGRhOk1BUlNFTExBCis5OkNPOkNPTDpDT0xPTUJJQTpSaXNhcmFsZGE6TUlTVFJBVE8KKzEwOkNPOkNPTDpDT0xPTUJJQTpSaXNhcmFsZGE6UEVSRUlSQQorMTE6Q086Q09MOkNPTE9NQklBOlJpc2FyYWxkYTpQVUVCTE8gUklDTworMTI6Q086Q09MOkNPTE9NQklBOlJpc2FyYWxkYTpRVUlOQ0hJQQorMTM6Q086Q09MOkNPTE9NQklBOlJpc2FyYWxkYTpTQU5UQSBST1NBIERFIENBQkFMCisxNDpDTzpDT0w6Q09MT01CSUE6UmlzYXJhbGRhOlNBTlRVQVJJTworMTpDTzpDT0w6Q09MT01CSUE6Q2VzYXI6QUdVQUNISUNBCisyOkNPOkNPTDpDT0xPTUJJQTpDZXNhcjpBR1VTVElOIENPREFaWkkKKzM6Q086Q09MOkNPTE9NQklBOkNlc2FyOkFTVFJFQQorNDpDTzpDT0w6Q09MT01CSUE6Q2VzYXI6QkVDRVJSSUwKKzU6Q086Q09MOkNPTE9NQklBOkNlc2FyOkJPU0NPTklBCis2OkNPOkNPTDpDT0xPTUJJQTpDZXNhcjpDSElNSUNIQUdVQQorNzpDTzpDT0w6Q09MT01CSUE6Q2VzYXI6Q0hJUklHVUFOQQorODpDTzpDT0w6Q09MT01CSUE6Q2VzYXI6Q1VSVU1BTkkKKzk6Q086Q09MOkNPTE9NQklBOkNlc2FyOkVMIENPUEVZCisxMDpDTzpDT0w6Q09MT01CSUE6Q2VzYXI6RUwgUEFTTworMTE6Q086Q09MOkNPTE9NQklBOkNlc2FyOkdBTUFSUkEKKzEyOkNPOkNPTDpDT0xPTUJJQTpDZXNhcjpHT05aQUxFWgorMTM6Q086Q09MOkNPTE9NQklBOkNlc2FyOkxBIEdMT1JJQQorMTQ6Q086Q09MOkNPTE9NQklBOkNlc2FyOkxBIEpBR1VBIERFIElSSUJJQ08KKzE1OkNPOkNPTDpDT0xPTUJJQTpDZXNhcjpMQSBQQVoKKzE2OkNPOkNPTDpDT0xPTUJJQTpDZXNhcjpNQU5BVVJFIEJBTENPTiBERUwgQ0VTQVIKKzE3OkNPOkNPTDpDT0xPTUJJQTpDZXNhcjpQQUlMSVRBUworMTg6Q086Q09MOkNPTE9NQklBOkNlc2FyOlBFTEFZQQorMTk6Q086Q09MOkNPTE9NQklBOkNlc2FyOlJJTyBERSBPUk8KKzIwOkNPOkNPTDpDT0xPTUJJQTpDZXNhcjpTQU4gQUxCRVJUTworMjE6Q086Q09MOkNPTE9NQklBOkNlc2FyOlNBTiBESUVHTworMjI6Q086Q09MOkNPTE9NQklBOkNlc2FyOlNBTiBNQVJUSU4KKzIzOkNPOkNPTDpDT0xPTUJJQTpDZXNhcjpUQU1BTEFNRVFVRQorMjQ6Q086Q09MOkNPTE9NQklBOkNlc2FyOlZBTExFRFVQQVIKKzE6Q086Q09MOkNPTE9NQklBOkd1YXZpYXJlOkNBTEFNQVIKKzI6Q086Q09MOkNPTE9NQklBOkd1YXZpYXJlOkVMIFJFVE9STk8KKzM6Q086Q09MOkNPTE9NQklBOkd1YXZpYXJlOk1JUkFGTE9SRVMKKzQ6Q086Q09MOkNPTE9NQklBOkd1YXZpYXJlOlNBTiBKT1NFIERFTCBHVUFWSUFSRQorMTpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkFMTUVJREEKKzI6Q086Q09MOkNPTE9NQklBOkJveWFjYTpBUVVJVEFOSUEKKzM6Q086Q09MOkNPTE9NQklBOkJveWFjYTpBUkNBQlVDTworNDpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkJFTEVOCis1OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6QkVSQkVPCis2OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6QkVURUlUSVZBCis3OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6Qk9BVklUQQorODpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkJPWUFDQQorOTpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkJSSUNFP08KKzEwOkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6QlVFTkFWSVNUQQorMTE6Q086Q09MOkNPTE9NQklBOkJveWFjYTpCVVNCQU5aQQorMTI6Q086Q09MOkNPTE9NQklBOkJveWFjYTpDQUxEQVMKKzEzOkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6Q0FNUE9IRVJNT1NPCisxNDpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkNFUklOWkEKKzE1OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6Q0hJTkFWSVRBCisxNjpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkNISVFVSU5RVUlSQQorMTc6Q086Q09MOkNPTE9NQklBOkJveWFjYTpDSElRVUlaQQorMTg6Q086Q09MOkNPTE9NQklBOkJveWFjYTpDSElTQ0FTCisxOTpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkNISVRBCisyMDpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkNISVRBUkFRVUUKKzIxOkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6Q0hJVkFUQQorMjI6Q086Q09MOkNPTE9NQklBOkJveWFjYTpDSElWT1IKKzIzOkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6Q0lFTkVHQQorMjQ6Q086Q09MOkNPTE9NQklBOkJveWFjYTpDT01CSVRBCisyNTpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkNPUEVSCisyNjpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkNPUlJBTEVTCisyNzpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkNPVkFSQUNISUEKKzI4OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6Q1VCQVJBCisyOTpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkNVQ0FJVEEKKzMwOkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6Q1VJVElWQQorMzE6Q086Q09MOkNPTE9NQklBOkJveWFjYTpEVUlUQU1BCiszMjpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkVMIENPQ1VZCiszMzpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkVMIEVTUElOTworMzQ6Q086Q09MOkNPTE9NQklBOkJveWFjYTpGSVJBVklUT0JBCiszNTpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkZMT1JFU1RBCiszNjpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkdBQ0hBTlRJVkEKKzM3OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6R0FNRVpBCiszODpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkdBUkFHT0EKKzM5OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6R1VBQ0FNQVlBUworNDA6Q086Q09MOkNPTE9NQklBOkJveWFjYTpHVUFURVFVRQorNDE6Q086Q09MOkNPTE9NQklBOkJveWFjYTpHVUFZQVRBCis0MjpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkdVSUNBTgorNDM6Q086Q09MOkNPTE9NQklBOkJveWFjYTpJWkEKKzQ0OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6SkVORVNBTk8KKzQ1OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6SkVSSUNPCis0NjpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOkxBIENBUElMTEEKKzQ3OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6TEEgVVZJVEEKKzQ4OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6TEEgVklDVE9SSUEKKzQ5OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6TEFCUkFOWkFHUkFOREUKKzUwOkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6TUFDQU5BTAorNTE6Q086Q09MOkNPTE9NQklBOkJveWFjYTpNQVJJUEkKKzUyOkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6TUlSQUZMT1JFUworNTM6Q086Q09MOkNPTE9NQklBOkJveWFjYTpNT05HVUEKKzU0OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6TU9OR1VJCis1NTpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOk1PTklRVUlSQQorNTY6Q086Q09MOkNPTE9NQklBOkJveWFjYTpNT1RBVklUQQorNTc6Q086Q09MOkNPTE9NQklBOkJveWFjYTpNVVpPCis1ODpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOk5PQlNBCis1OTpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOk5VRVZPIENPTE9OCis2MDpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOk9JQ0FUQQorNjE6Q086Q09MOkNPTE9NQklBOkJveWFjYTpPVEFOQ0hFCis2MjpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlBBQ0hBVklUQQorNjM6Q086Q09MOkNPTE9NQklBOkJveWFjYTpQQUVaCis2NDpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlBBSVBBCis2NTpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlBBSkFSSVRPCis2NjpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlBBTlFVRUJBCis2NzpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlBBVU5BCis2ODpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlBBWUEKKzY5OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6UEFaIERFIFJJTworNzA6Q086Q09MOkNPTE9NQklBOkJveWFjYTpQRVNDQQorNzE6Q086Q09MOkNPTE9NQklBOkJveWFjYTpQSVNWQQorNzI6Q086Q09MOkNPTE9NQklBOkJveWFjYTpQVUVSVE8gQk9ZQUNBCis3MzpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlFVSVBBTUEKKzc0OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6UkFNSVJJUVVJCis3NTpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlJBUVVJUkEKKzc2OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6Uk9ORE9OCis3NzpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlNBQk9ZQQorNzg6Q086Q09MOkNPTE9NQklBOkJveWFjYTpTQUNISUNBCis3OTpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlNBTUFDQQorODA6Q086Q09MOkNPTE9NQklBOkJveWFjYTpTQU4gRURVQVJETworODE6Q086Q09MOkNPTE9NQklBOkJveWFjYTpTQU4gSk9TRSBERSBQQVJFCis4MjpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlNBTiBMVUlTIERFIEdBQ0VOTworODM6Q086Q09MOkNPTE9NQklBOkJveWFjYTpTQU4gTUFURU8KKzg0OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6U0FOIE1JR1VFTCBERSBTRU1BCis4NTpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlNBTiBQQUJMTyBERSBCT1JCVVIKKzg2OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6U0FOVEEgUk9TQSBERSBWSVRFUkJPCis4NzpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlNBTlRBIFNPRklBCis4ODpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlNBTlRBTUFSSUEKKzg5OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6U0FOVEFOQQorOTA6Q086Q09MOkNPTE9NQklBOkJveWFjYTpTQVRJVkFOT1JURQorOTE6Q086Q09MOkNPTE9NQklBOkJveWFjYTpTQVRJVkFTVVIKKzkyOkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6U0lBQ0hPUVVFCis5MzpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlNPQVRBCis5NDpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlNPQ0hBCis5NTpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlNPQ09UQQorOTY6Q086Q09MOkNPTE9NQklBOkJveWFjYTpTT0dBTU9TTworOTc6Q086Q09MOkNPTE9NQklBOkJveWFjYTpTT01PTkRPQ08KKzk4OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6U09SQQorOTk6Q086Q09MOkNPTE9NQklBOkJveWFjYTpTT1JBQ0EKKzEwMDpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlNPVEFRVUlSQQorMTAxOkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6U1VTQUNPTgorMTAyOkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6U1VUQU1BUkNIQU4KKzEwMzpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlNVVEFURU5aQQorMTA0OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6VEFTQ08KKzEwNTpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlRFTlpBCisxMDY6Q086Q09MOkNPTE9NQklBOkJveWFjYTpUSUJBQk9TQQorMTA3OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6VElCQU5BCisxMDg6Q086Q09MOkNPTE9NQklBOkJveWFjYTpUSU5KQUNBCisxMDk6Q086Q09MOkNPTE9NQklBOkJveWFjYTpUSVBBQ09RVUUKKzExMDpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlRPQ0EKKzExMTpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlRPR1VJCisxMTI6Q086Q09MOkNPTE9NQklBOkJveWFjYTpUT1BBR0EKKzExMzpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlRPVEEKKzExNDpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlRVTkpBCisxMTU6Q086Q09MOkNPTE9NQklBOkJveWFjYTpUVU5VTkdVQQorMTE2OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6VFVSTUVRVUUKKzExNzpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlRVVEEKKzExODpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlRVVEFTQQorMTE5OkNPOkNPTDpDT0xPTUJJQTpCb3lhY2E6VU1CSVRBCisxMjA6Q086Q09MOkNPTE9NQklBOkJveWFjYTpWRU5UQVFVRU1BREEKKzEyMTpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlZJTExBIERFIExFWVZBCisxMjI6Q086Q09MOkNPTE9NQklBOkJveWFjYTpWSVJBQ0FDSEEKKzEyMzpDTzpDT0w6Q09MT01CSUE6Qm95YWNhOlpFVEFRVUlSQQorMTpDTzpDT0w6Q09MT01CSUE6Q2FsZGFzOkFHVUFEQVMKKzI6Q086Q09MOkNPTE9NQklBOkNhbGRhczpBTlNFUk1BCiszOkNPOkNPTDpDT0xPTUJJQTpDYWxkYXM6QVJBTlpBWlUKKzQ6Q086Q09MOkNPTE9NQklBOkNhbGRhczpCRUxBTENBWkFSCis1OkNPOkNPTDpDT0xPTUJJQTpDYWxkYXM6Q0hJTkNISU5BCis2OkNPOkNPTDpDT0xPTUJJQTpDYWxkYXM6RklMQURFTEZJQQorNzpDTzpDT0w6Q09MT01CSUE6Q2FsZGFzOkxBIERPUkFEQQorODpDTzpDT0w6Q09MT01CSUE6Q2FsZGFzOkxBIE1FUkNFRAorOTpDTzpDT0w6Q09MT01CSUE6Q2FsZGFzOk1BTklaQUxFUworMTA6Q086Q09MOkNPTE9NQklBOkNhbGRhczpNQU5aQU5BUkVTCisxMTpDTzpDT0w6Q09MT01CSUE6Q2FsZGFzOk1BUk1BVE8KKzEyOkNPOkNPTDpDT0xPTUJJQTpDYWxkYXM6TUFSUVVFVEFMSUEKKzEzOkNPOkNPTDpDT0xPTUJJQTpDYWxkYXM6TUFSVUxBTkRBCisxNDpDTzpDT0w6Q09MT01CSUE6Q2FsZGFzOk5FSVJBCisxNTpDTzpDT0w6Q09MT01CSUE6Q2FsZGFzOlBBQ09SQQorMTY6Q086Q09MOkNPTE9NQklBOkNhbGRhczpQQUxFU1RJTkEKKzE3OkNPOkNPTDpDT0xPTUJJQTpDYWxkYXM6UEVOU0lMVkFOSUEKKzE4OkNPOkNPTDpDT0xPTUJJQTpDYWxkYXM6UklPU1VDSU8KKzE5OkNPOkNPTDpDT0xPTUJJQTpDYWxkYXM6UklTQVJBTERBCisyMDpDTzpDT0w6Q09MT01CSUE6Q2FsZGFzOlNBTEFNSU5BCisyMTpDTzpDT0w6Q09MT01CSUE6Q2FsZGFzOlNBTUFOQQorMjI6Q086Q09MOkNPTE9NQklBOkNhbGRhczpTVVBJQQorMjM6Q086Q09MOkNPTE9NQklBOkNhbGRhczpWSUNUT1JJQQorMjQ6Q086Q09MOkNPTE9NQklBOkNhbGRhczpWSUxMQU1BUklBCisyNTpDTzpDT0w6Q09MT01CSUE6Q2FsZGFzOlZJVEVSQk8KKzE6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpBQkVKT1JSQUwKKzI6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpBQlJJQVFVSQorMzpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkFMRUpBTkRSSUEKKzQ6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpBTUFHQQorNTpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkFNQUxGSQorNjpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkFOREVTCis3OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6QU5HRUxPUE9MSVMKKzg6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpBTkdPU1RVUkEKKzk6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpBTk9SSQorMTA6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpBTlRJT1FVSUEKKzExOkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6QU5aQQorMTI6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpBUEFSVEFETworMTM6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpBUkJPTEVURVMKKzE0OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6QVJHRUxJQQorMTU6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpBUk1FTklBCisxNjpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkJBUkJPU0EKKzE3OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6QkVMTE8KKzE4OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6QkVMTUlSQQorMTk6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpCRVRBTklBCisyMDpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkJFVFVMSUEKKzIxOkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6Qk9MSVZBUgorMjI6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpCUklDRU5PCisyMzpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkJVUklUSUNBCisyNDpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkNBQ0VSRVMKKzI1OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6Q0FJQ0VETworMjY6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpDQUxEQVMKKzI3OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6Q0FNUEFNRU5UTworMjg6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpDQU5BU0dPUkRBUworMjk6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpDQVJBQ09MSQorMzA6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpDQVJBTUFOVEEKKzMxOkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6Q0FSRVBBCiszMjpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkNBUk1FTiBERSBWSUJPUkFMCiszMzpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkNBUk9MSU5BCiszNDpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkNBVUNBU0lBCiszNTpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkNISUdPUk9ETworMzY6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpDSVNORVJPUworMzc6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpDT0NPUk5BCiszODpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkNPTkNFUENJT04KKzM5OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6Q09OQ09SRElBCis0MDpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkNPUEFDQUJBTkEKKzQxOkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6REFCRUlCQQorNDI6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpET04gTUFUSUFTCis0MzpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkVCRUpJQ08KKzQ0OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6RUwgQkFHUkUKKzQ1OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6RU5UUkVSUklPUworNDY6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpFTlZJR0FETworNDc6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpGUkVET05JQQorNDg6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpGUk9OVElOTworNDk6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpHSVJBTERPCis1MDpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkdJUkFSRE9UQQorNTE6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpHT01FWiBQTEFUQQorNTI6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpHUkFOQURBCis1MzpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkdVQURBTFVQRQorNTQ6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpHVUFSTkUKKzU1OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6R1VBVEFQRQorNTY6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpIRUxJQ09OSUEKKzU3OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6SElTUEFOSUEKKzU4OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6SVRBR1VJCis1OTpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOklUVUFOR08KKzYwOkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6SkFSRElOCis2MTpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkpFUklDTworNjI6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpMQSBDRUpBCis2MzpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkxBIEVTVFJFTExBCis2NDpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkxBIFVOSU9OCis2NTpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOkxJQk9SSU5BCis2NjpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOk1BQ0VPCis2NzpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOk1BUklOSUxMQQorNjg6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpNRURFTExJTgorNjk6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpNT05URUJFTExPCis3MDpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOk1VUklORE8KKzcxOkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6TVVUQVRBCis3MjpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOk5BUklOTworNzM6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpORUNISQorNzQ6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpORUNPQ0xJCis3NTpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOk5FQ09DTEkgKElzLikKKzc2OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6T0xBWUEKKzc3OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6UEVOT0wKKzc4OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6UEVRVUUKKzc5OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6UFRPIE5BUkUgKExBIE1BR0QuKQorODA6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpQVUVCTE9SUklDTworODE6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpQVUVSVE8gQkVSUklPCis4MjpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOlBVRVJUTyBUUklVTkZPCis4MzpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOlJFTUVESU9TCis4NDpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOlJFVElSTworODU6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpSSU9ORUdSTworODY6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpTQUJBTkFMQVJHQQorODc6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpTQUJBTkVUQQorODg6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpTQUxHQVIKKzg5OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6U0FOIEFORFJFUworOTA6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpTQU4gQ0FSTE9TCis5MTpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOlNBTiBGUkFOQ0lTQ08KKzkyOkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6U0FOIEpFUk9OSU1PCis5MzpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOlNBTiBKT1NFIERFIExBIE1PTlRBTkEKKzk0OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6U0FOIEpVQU4gREUgVVJBQkEKKzk1OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6U0FOIExVSVMKKzk2OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6U0FOIFBFRFJPCis5NzpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOlNBTiBQRURSTyBERSBVUkFCQQorOTg6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpTQU4gUkFGQUVMCis5OTpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOlNBTiBST1FVRQorMTAwOkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6U0FOIFZJQ0VOVEUKKzEwMTpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOlNBTlRBIEJBUkJBUkEKKzEwMjpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOlNBTlRBIFJPU0EgREUgT1NPUworMTAzOkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6U0FOVE8gRE9NSU5HTworMTA0OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6U0FOVFVBUklPCisxMDU6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpTRUdPVklBCisxMDY6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpTT05TT04KKzEwNzpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOlNPUEVUUkFOCisxMDg6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpUQU1FU0lTCisxMDk6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpUQVJBWkEKKzExMDpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOlRBUlNPCisxMTE6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpUSVRJUklCSQorMTEyOkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6VE9MRURPCisxMTM6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpUVVJCTworMTE0OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6VFVSQk8gKElzLikKKzExNTpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOlVSQU1JVEEKKzExNjpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOlVSUkFPCisxMTc6Q086Q09MOkNPTE9NQklBOkFudGlvcXVpYTpWQUxESVZJQQorMTE4OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6VkFMUEFSQUlTTworMTE5OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6VkVHQUNISQorMTIwOkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6VkVORUNJQQorMTIxOkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6VklHSUEgREVMIEZVRVJURQorMTIyOkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6WUFMSQorMTIzOkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6WUFSVU1BTAorMTI0OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6WU9MT01CTworMTI1OkNPOkNPTDpDT0xPTUJJQTpBbnRpb3F1aWE6WU9ORE8KKzEyNjpDTzpDT0w6Q09MT01CSUE6QW50aW9xdWlhOlpBUkFHT1pBCisxOkNPOkNPTDpDT0xPTUJJQTpTdWNyZTpCVUVOQVZJU1RBCisyOkNPOkNPTDpDT0xPTUJJQTpTdWNyZTpDQUlNSVRPCiszOkNPOkNPTDpDT0xPTUJJQTpTdWNyZTpDSEFMQU4KKzQ6Q086Q09MOkNPTE9NQklBOlN1Y3JlOkNPTE9TTyAoUklDQVVSVEUpCis1OkNPOkNPTDpDT0xPTUJJQTpTdWNyZTpDT1JPWkFMCis2OkNPOkNPTDpDT0xPTUJJQTpTdWNyZTpHQUxFUkFTCis3OkNPOkNPTDpDT0xPTUJJQTpTdWNyZTpHVUFSQU5EQQorODpDTzpDT0w6Q09MT01CSUE6U3VjcmU6TEEgVU5JT04KKzk6Q086Q09MOkNPTE9NQklBOlN1Y3JlOkxPUyBQQUxNSVRPUworMTA6Q086Q09MOkNPTE9NQklBOlN1Y3JlOk1BSkFHVUFMCisxMTpDTzpDT0w6Q09MT01CSUE6U3VjcmU6TU9SUk9BCisxMjpDTzpDT0w6Q09MT01CSUE6U3VjcmU6T1ZFSkFTCisxMzpDTzpDT0w6Q09MT01CSUE6U3VjcmU6UEFMTUlUTworMTQ6Q086Q09MOkNPTE9NQklBOlN1Y3JlOlNBTVBVRVMKKzE1OkNPOkNPTDpDT0xPTUJJQTpTdWNyZTpTQU4gQkVOSVRPIEFCQUQKKzE2OkNPOkNPTDpDT0xPTUJJQTpTdWNyZTpTQU4gSlVBTiBERSBCRVRVTElBCisxNzpDTzpDT0w6Q09MT01CSUE6U3VjcmU6U0FOIE1BUkNPUworMTg6Q086Q09MOkNPTE9NQklBOlN1Y3JlOlNBTiBPTk9GUkUKKzE5OkNPOkNPTDpDT0xPTUJJQTpTdWNyZTpTQU4gT05PRlJFIChJcy4pCisyMDpDTzpDT0w6Q09MT01CSUE6U3VjcmU6U0FOIFBFRFJPCisyMTpDTzpDT0w6Q09MT01CSUE6U3VjcmU6U0lOQ0UKKzIyOkNPOkNPTDpDT0xPTUJJQTpTdWNyZTpTSU5DRUxFSk8KKzIzOkNPOkNPTDpDT0xPTUJJQTpTdWNyZTpTVUNSRQorMjQ6Q086Q09MOkNPTE9NQklBOlN1Y3JlOlRPTFUKKzI1OkNPOkNPTDpDT0xPTUJJQTpTdWNyZTpUT0xVVklFSk8KKzE6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6QUNISQorMjpDTzpDT0w6Q09MT01CSUE6Qm9saXZhcjpBTFRPUyBERUwgUk9TQVJJTworMzpDTzpDT0w6Q09MT01CSUE6Qm9saXZhcjpBUkpPTkEKKzQ6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6QkFSUkFOQ08gREUgTE9CQQorNTpDTzpDT0w6Q09MT01CSUE6Qm9saXZhcjpDQUxBTUFSCis2OkNPOkNPTDpDT0xPTUJJQTpCb2xpdmFyOkNBTlRBR0FMTE8KKzc6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6Q0FSVEFHRU5BIChESVNULiBFU1AuKQorODpDTzpDT0w6Q09MT01CSUE6Qm9saXZhcjpDQVJUQUdFTkEgKERJU1QuIEVTUC4pIChJCis5OkNPOkNPTDpDT0xPTUJJQTpCb2xpdmFyOkNJQ1VDTworMTA6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6Q09SRE9CQQorMTE6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6RUwgQ0FSTUVOIERFIEJPTElWQVIKKzEyOkNPOkNPTDpDT0xPTUJJQTpCb2xpdmFyOkVMIEdVQU1PCisxMzpDTzpDT0w6Q09MT01CSUE6Qm9saXZhcjpIQVRJTExPIERFIExPQkEKKzE0OkNPOkNPTDpDT0xPTUJJQTpCb2xpdmFyOk1BSEFURVMKKzE1OkNPOkNPTDpDT0xPTUJJQTpCb2xpdmFyOk1BUkdBUklUQQorMTY6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6TUFSSUEgTEEgQkFKQQorMTc6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6TU9NUE9TCisxODpDTzpDT0w6Q09MT01CSUE6Qm9saXZhcjpNT05URUNSSVNUTworMTk6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6TU9SQUxFUworMjA6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6UElOSUxMT1MKKzIxOkNPOkNPTDpDT0xPTUJJQTpCb2xpdmFyOlJJTyBWSUVKTworMjI6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6U0FOIEVTVEFOSVNMQU8KKzIzOkNPOkNPTDpDT0xPTUJJQTpCb2xpdmFyOlNBTiBGRVJOQU5ETworMjQ6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6U0FOIEpBQ0lOVE8KKzI1OkNPOkNPTDpDT0xPTUJJQTpCb2xpdmFyOlNBTiBKVUFOIE5FUE9NVUNFTk8KKzI2OkNPOkNPTDpDT0xPTUJJQTpCb2xpdmFyOlNBTiBNQVJUSU4gREUgTE9CQQorMjc6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6U0FOIFBBQkxPCisyODpDTzpDT0w6Q09MT01CSUE6Qm9saXZhcjpTQU5UQSBDQVRBTElOQQorMjk6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6U0FOVEEgUk9TQQorMzA6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6U0FOVEEgUk9TQSBERUwgU1VSCiszMTpDTzpDT0w6Q09MT01CSUE6Qm9saXZhcjpTSU1JVEkKKzMyOkNPOkNPTDpDT0xPTUJJQTpCb2xpdmFyOlNPUExBVklFTlRPCiszMzpDTzpDT0w6Q09MT01CSUE6Qm9saXZhcjpUQUxBSUdVQSBOVUVWTworMzQ6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6VFVSQkFDTworMzU6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6VFVSQkFOQQorMzY6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6VklMTEFOVUVWQQorMzc6Q086Q09MOkNPTE9NQklBOkJvbGl2YXI6WkFNQlJBTk8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ09NL0NPTV9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ09NL0NPTV9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjgwMDM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DT00vQ09NX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsNSBAQAorMTpLTS1BOktNOkFOSk9VQU4KKzI6S00tRzpLTTpHUkFORCBDT01PUkUKKzM6S00tSUxNOktNOklMRSBERSBNQVlPVFRFIChGUi4pCis0OktNLU06S006TVdBTEkKKzU6S00tTlo6S006TlpXQU5JCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NPTS9DT01fQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NPTS9DT01fQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiMmFiNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ09NL0NPTV9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDQgQEAKKzE6S006Q09NOkNPTU9ST1M6TXdhbGk6Q09NLkwyLjQKKzE6S006Q09NOkNPTU9ST1M6SWxlIGRlIE1heW90dGUgKEZyLik6Q09NLkwyLjMKKzE6S006Q09NOkNPTU9ST1M6Tnp3YW5pOkNPTS5MMi4yCisxOktNOkNPTTpDT01PUk9TOkdyYW5kIENvbW9yZTpDT00uTDIuMQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DUFYvQ1BWX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DUFYvQ1BWX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZjVlNGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NQVi9DUFZfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxOSBAQAorMTpDVi1CVjpDVjpCT0EgVklTVEEKKzI6Q1YtQlI6Q1Y6QlJBVkEKKzM6Q1YtQ1M6Q1Y6Q0FMSEVUQSBERSBTTyBNSUdVRUwKKzQ6Q1YtRk86Q1Y6Rk9HTworNTpDVi1NQTpDVjpNQUlPCis2OkNWLU1POkNWOk1PU1RFSVJPUworNzpDVi1QQTpDVjpQQUwKKzg6Q1YtUE46Q1Y6UE9SVE8gTk9WTworOTpDVi1QUjpDVjpQUkFJQQorMTA6Q1YtUkc6Q1Y6UklCRUlSQSBHUkFOREUKKzExOkNWLVNMOkNWOlNBTAorMTI6Q1YtQ0E6Q1Y6U0FOVEEgQ0FUQVJJTkEKKzEzOkNWLUNSOkNWOlNBTlRBIENSVVoKKzE0OkNWLVNPTjpDVjpTQU5UTyBBTlRBTworMTU6Q1YtU046Q1Y6U0FPIE5JQ09MQVUKKzE2OkNWLVNWOkNWOlNBTyBWSUNFTlRFCisxNzpDVi1TRDpDVjpTTyBET01JTkdPUworMTg6Q1YtU0Y6Q1Y6U08gRklMSVBFCisxOTpDVi1UQTpDVjpUQVJSQUZBTApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DUFYvQ1BWX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DUFYvQ1BWX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNWU2MDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NQVi9DUFZfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSw5IEBACisxOkNWOkNQVjpDQVBFIFZFUkRFOlNhbDpOQQorMTpDVjpDUFY6Q0FQRSBWRVJERTpTYW50aWFnbzpOQQorMTpDVjpDUFY6Q0FQRSBWRVJERTpGb2dvOk5BCisxOkNWOkNQVjpDQVBFIFZFUkRFOlNhbyBOaWNvbGF1Ok5BCisxOkNWOkNQVjpDQVBFIFZFUkRFOkJvYSBWaXN0YTpOQQorMTpDVjpDUFY6Q0FQRSBWRVJERTpTYW8gVmljZW50ZTpOQQorMTpDVjpDUFY6Q0FQRSBWRVJERTpNYWlvOk5BCisxOkNWOkNQVjpDQVBFIFZFUkRFOkJyYXZhOk5BCisxOkNWOkNQVjpDQVBFIFZFUkRFOlNhbnRvIEFudGFvOk5BCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NaRS9DWkVfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0NaRS9DWkVfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIyNWE2OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ1pFL0NaRV9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDE1IEBACisxOkNTLUJSOkNTOkJSQVRJU0xBVkEKKzI6Q1MtQ0c6Q1M6Q1JOQSBHT1JBCiszOkNTLUpDOkNTOkpJSE9DRVNLWSBLUkFKCis0OkNTLUpNOkNTOkpJSE9NT1JBVlNLWSBLUkFKCis1OkNTLUtNOkNTOktPU09WTyBNRVRPSElKQQorNjpDUy1QUjpDUzpQUkFIQQorNzpDUy1TRTpDUzpTRVZFUk9DRVNLWSBLUkFKCis4OkNTLVNWOkNTOlNFVkVST01PUkFWU0tZIEtSQUoKKzk6Q1MtU1I6Q1M6U1RSRURPQ0VTS1kgS1JBSgorMTA6Q1MtU1Q6Q1M6U1RSRURPTFNMT1ZFTlNLWSBLUkFKCisxMTpDUy1WTzpDUzpWT0pWT0RJTkEKKzEyOkNTLVZZOkNTOlZZQ0hPRE9DRVNLWSBLUkFKCisxMzpDUy1ZQzpDUzpZQ0hPRE9TTE9WRU5TS0kgS1JBSgorMTQ6Q1MtWkQ6Q1M6WkFQQURPQ0VTS1kgS1JBSgorMTU6Q1MtWkE6Q1M6WkFQQURPU0xPVkVOU0tZIEtSQUoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ1pFL0NaRV9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvQ1pFL0NaRV9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9DWkUvQ1pFX0FETUlOMl9MRVgudHh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0RFVS9ERVVfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0RFVS9ERVVfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I2M2EwMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvREVVL0RFVV9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDQwIEBACisxOkRFLUFSOkRFOkFSTlNCRVJHCisyOkRFLUJXOkRFOkJBREVOIFfcUlRURU1CRVJHCiszOkRFLUJFOkRFOkJFUkxJTgorNDpERS1CQjpERTpCUkFOREVOQlVSRworNTpERS1CUjpERTpCUkFVTlNDSFdFSUcKKzY6REUtSEI6REU6QlJFTUVOCis3OkRFLUNNOkRFOkNIRU1OSVRaCis4OkRFLURBOkRFOkRFU1NBVQorOTpERS1EVDpERTpERVRNT0xECisxMDpERS1EUjpERTpEUkVTREVOCisxMTpERS1EVTpERTpEVUVTU0VMRE9SRgorMTI6REUtRlI6REU6RlJFSUJVUkcKKzEzOkRFLUdJOkRFOkdJRVNTRU4KKzE0OkRFLUhIOkRFOkhBTUJVUkcKKzE1OkRFLUhBOkRFOkhBTk5PVkVSCisxNjpERS1IRTpERTpIRVNTRU4KKzE3OkRFLUtBOkRFOktBU1NFTAorMTg6REUtS086REU6S09FTE4KKzE5OkRELUxQOkRFOkxFSVBaSUcKKzIwOkRFLUxVOkRFOkxVRU5FQlVSRworMjE6REUtTUE6REU6TUFHREVCVVJHCisyMjpERS1NVjpERTpNRUNLTEVOQlVSRyBWT1JQT01NRVJOCisyMzpERS1NVDpERTpNSVRURUxGUkFOS0VOCisyNDpERS1NVTpERTpNVUVOU1RFUgorMjU6REUtTkk6REU6TklFREVSQkFZRVJOCisyNjpERS1OVzpERTpOT1JEUkhFSU4gV0VTVEZBTEVOCisyNzpERS1CWTpERTpPQkVSQkFZRVJOCisyODpERS1PQjpERTpPQkVSRlJBTktFTgorMjk6REUtUkg6REU6UkhFSU5IRVNTRU4KKzMwOkRFLVJQOkRFOlJIRUlOSEVTU0VOIFBGQUxaCiszMTpERS1TTDpERTpTQUFSTEFORAorMzI6REUtU046REU6U0FDSFNFTgorMzM6REUtU0g6REU6U0NIV0FCRU4KKzM0OkRFLVNUOkRFOlNUVVRUR0FSVAorMzU6REUtVEg6REU6VEhVUklOR0VOCiszNjpERS1USTpERTpUUklFUgorMzc6REUtVFU6REU6VFVFQklOR0VOCiszODpERS1VVDpERTpVTlRFUkZSQU5LRU4KKzM5OkRFLVVOOkRFOlVOVEVSRlJBTktSRU4KKzQwOkRFLVdFOkRFOldFU0VSIEVNUwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9ERVUvREVVX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9ERVUvREVVX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0RFVS9ERVVfQURNSU4yX0xFWC50eHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRE5LL0ROS19BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRE5LL0ROS19BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTg4NTNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9ETksvRE5LX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMTkgQEAKKzE6REstMDQwOkRLOkJPUk5IT0xNCisyOkRLLTQ3OkRLOkZSRURFUklLU0JFUkcKKzM6REstMDIwOkRLOkZSRURFUklLU0JPUkcKKzQ6REstMDQyOkRLOkZZTgorNTpESy0wMjI6REs6SE9WRURTVEFEU1JFR0lPTkVOCis2OkRLLTA6REs6S0JFTkhBVk4KKzc6REstMDpESzpLQkVOSEFWTgorODpESy0wODA6REs6Tk9SREpZTExBTkQKKzk6REstMDIzOkRLOk9TVCBGT1IgU1RPUkVCQUVMVAorMTA6REstMDcwOkRLOlJIVVMKKzExOkRLLTA1NTpESzpSSUJFCisxMjpESy0wNjU6REs6UklOR0tCSU5HCisxMzpESy0wMjU6REs6Uk9TS0lMREUKKzE0OkRLLTA1MDpESzpTTkRFUkpZTExBTkQKKzE1OkRLLTAzNTpESzpTVE9SU1RSTQorMTY6REstMDYwOkRLOlZFSkxFCisxNzpESy0wMjE6REs6VkVTVCBGT1IgU1RPUkVCQUVMVAorMTg6REstMDMwOkRLOlZFU1RTSkxMQU5ECisxOTpESy0wNzY6REs6VklCT1JHCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0ROSy9ETktfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0ROSy9ETktfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRE5LL0ROS19BRE1JTjJfTEVYLnR4dApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9EWkEvRFpBX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9EWkEvRFpBX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExM2NjNWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0RaQS9EWkFfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSw0OSBAQAorMTpEWi0wOkRaOkFEUkFSCisyOkRaLTQ0OkRaOkFJTiBEQUZMQQorMzpEWi00NjpEWjpBSU4gVEFNT1VDSEVOVAorNDpEWi02OkRaOkFMR0VSCis1OkRaLTIzOkRaOkFOTkFCQQorNjpEWi0wNTpEWjpCQVROQQorNzpEWi0wODpEWjpCRUNIQVIKKzg6RFotMDY6RFo6QkVKQUlBCis5OkRaLTA3OkRaOkJJU0tSQQorMTA6RFotMDk6RFo6QkxJREEKKzExOkRaLTM0OkRaOkJPUkpCT1VBUklSRUoKKzEyOkRaLTU0OkRaOkJPVUlSQQorMTM6RFotMzU6RFo6Qk9VTUVSREVTCisxNDpEWi0wMjpEWjpDSExFRgorMTU6RFotMjU6RFo6Q09OU1RBTlRJTkUKKzE2OkRaLTc6RFo6REpFTEZBCisxNzpEWi0zMjpEWjpFTCBCQVlBREgKKzE4OkRaLTM5OkRaOkVMIE9VRUQKKzE5OkRaLTM2OkRaOkVMIFRBUkYKKzIwOkRaLTQ3OkRaOkdIQVJEQVNBCisyMTpEWi0yNDpEWjpHVUVMTUEKKzIyOkRaLTMzOkRaOklMTElaSQorMjM6RFotODpEWjpKSUpFTAorMjQ6RFotNDA6RFo6S0hFTkNIRUxBCisyNTpEWi0wMzpEWjpMQUdIT1VBVAorMjY6RFotMjk6RFo6TUFTQ0FSQQorMjc6RFotMjY6RFo6TUVESUEKKzI4OkRaLTQzOkRaOk1JTEEKKzI5OkRaLTI3OkRaOk1PU1RBR0hBTkVNCiszMDpEWi0yODpEWjpNU0lMQQorMzE6RFotNDU6RFo6TkFBTUEKKzMyOkRaLTYzOkRaOk9SQU4KKzMzOkRaLTMwOkRaOk9VQVJHTEEKKzM0OkRaLTA0OkRaOk9VTSBFTCBCT1VBR0hJCiszNTpEWi00ODpEWjpSRUxJWkFORQorMzY6RFotMjA6RFo6U0FJREEKKzM3OkRaLTk6RFo6U0VUSUYKKzM4OkRaLTIyOkRaOlNJREkgQkVMIEFCQkVTCiszOTpEWi02MjpEWjpTS0lLREEKKzQwOkRaLTQ6RFo6U09VSyBBSFJBUworNDE6RFotMTpEWjpUQU1BTkdIQVNTRVQKKzQyOkRaLVRBTTpEWjpUQU1BTlJBU1NFVAorNDM6RFotNTI6RFo6VEVCRVNTQQorNDQ6RFotMzc6RFo6VEVORE9VRgorNDU6RFotNjQ6RFo6VElBUkVUCis0NjpEWi00MjpEWjpUSVBBWkEKKzQ3OkRaLTM4OkRaOlRJU1NFTVNJTFQKKzQ4OkRaLTU6RFo6VElaSSBPVVpPVQorNDk6RFotNjU6RFo6VExFTUNFTgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9EWkEvRFpBX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9EWkEvRFpBX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MDdiNzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0RaQS9EWkFfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSw0OCBAQAorMTpEWjpEWkE6QUxHRVJJQTpUbGVtY2VuOkRaQS5MMi40NQorMTpEWjpEWkE6QUxHRVJJQTpUaXNzZW1zaWx0OkRaQS5MMi40MAorMTpEWjpEWkE6QUxHRVJJQTpCZWNoYXI6RFpBLkwyLjMyCisxOkRaOkRaQTpBTEdFUklBOklsbGl6aTpEWkEuTDIuMjkKKzE6RFo6RFpBOkFMR0VSSUE6R2hhcmRhU2E6RFpBLkwyLjExCisxOkRaOkRaQTpBTEdFUklBOk91bSBFbCBCb3VhZ2hpOkRaQS5MMi4yNAorMTpEWjpEWkE6QUxHRVJJQTpUZW5kb3VmOkRaQS5MMi4xMAorMTpEWjpEWkE6QUxHRVJJQTpPcmFuOkRaQS5MMi4xOQorMTpEWjpEWkE6QUxHRVJJQTpBZHJhcjpEWkEuTDIuNDQKKzE6RFo6RFpBOkFMR0VSSUE6TWVkaWE6RFpBLkwyLjQxCisxOkRaOkRaQTpBTEdFUklBOkNobGVmOkRaQS5MMi4yMgorMTpEWjpEWkE6QUxHRVJJQTpTYWlkYTpEWkEuTDIuMzcKKzE6RFo6RFpBOkFMR0VSSUE6TGFnaG91YXQ6RFpBLkwyLjE3CisxOkRaOkRaQTpBTEdFUklBOkJvdWlyYTpEWkEuTDIuNDgKKzE6RFo6RFpBOkFMR0VSSUE6U2lkaS1CZWwtQWJiZXM6RFpBLkwyLjgKKzE6RFo6RFpBOkFMR0VSSUE6VGlhcmV0OkRaQS5MMi4zNQorMTpEWjpEWkE6QUxHRVJJQTpTb3VrIEFocmFzOkRaQS5MMi4yMAorMTpEWjpEWkE6QUxHRVJJQTpBbm5hYmE6RFpBLkwyLjQKKzE6RFo6RFpBOkFMR0VSSUE6UmVsaXphbmU6RFpBLkwyLjYKKzE6RFo6RFpBOkFMR0VSSUE6VGlwYXphOkRaQS5MMi4zMQorMTpEWjpEWkE6QUxHRVJJQTpCb3JqYm91YXJpcmVqOkRaQS5MMi4xNgorMTpEWjpEWkE6QUxHRVJJQTpCaXNrcmE6RFpBLkwyLjEKKzE6RFo6RFpBOkFMR0VSSUE6TWFzY2FyYTpEWkEuTDIuMzQKKzE6RFo6RFpBOkFMR0VSSUE6Q29uc3RhbnRpbmU6RFpBLkwyLjQ3CisxOkRaOkRaQTpBTEdFUklBOkJlamFpYTpEWkEuTDIuMzgKKzE6RFo6RFpBOkFMR0VSSUE6RWwgVGFyZjpEWkEuTDIuMzAKKzE6RFo6RFpBOkFMR0VSSUE6QWxnZXI6RFpBLkwyLjI3CisxOkRaOkRaQTpBTEdFUklBOkVsIEJheWFkaDpEWkEuTDIuMTMKKzE6RFo6RFpBOkFMR0VSSUE6VGFtYW5yYXNzZXQ6RFpBLkwyLjIKKzE6RFo6RFpBOkFMR0VSSUE6QWluIERhZmxhOkRaQS5MMi4yMworMTpEWjpEWkE6QUxHRVJJQTpNaWxhOkRaQS5MMi4zCisxOkRaOkRaQTpBTEdFUklBOk5hYW1hOkRaQS5MMi4yNQorMTpEWjpEWkE6QUxHRVJJQTpCYXRuYTpEWkEuTDIuMjYKKzE6RFo6RFpBOkFMR0VSSUE6VGViZXNzYTpEWkEuTDIuMTgKKzE6RFo6RFpBOkFMR0VSSUE6SmlqZWw6RFpBLkwyLjMzCisxOkRaOkRaQTpBTEdFUklBOk1vc3RhZ2hhbmVtOkRaQS5MMi41CisxOkRaOkRaQTpBTEdFUklBOkJvdW1lcmRlczpEWkEuTDIuMzkKKzE6RFo6RFpBOkFMR0VSSUE6R3VlbG1hOkRaQS5MMi4yMQorMTpEWjpEWkE6QUxHRVJJQTpTZXRpZjpEWkEuTDIuMjgKKzE6RFo6RFpBOkFMR0VSSUE6S2hlbmNoZWxhOkRaQS5MMi4xNAorMTpEWjpEWkE6QUxHRVJJQTpUaXppLW91em91OkRaQS5MMi45CisxOkRaOkRaQTpBTEdFUklBOkRqZWxmYTpEWkEuTDIuNDMKKzE6RFo6RFpBOkFMR0VSSUE6T3VhcmdsYTpEWkEuTDIuMzYKKzE6RFo6RFpBOkFMR0VSSUE6U2tpa2RhOkRaQS5MMi40NgorMTpEWjpEWkE6QUxHRVJJQTpBaW4gVGFtb3VjaGVudDpEWkEuTDIuNDIKKzE6RFo6RFpBOkFMR0VSSUE6QmxpZGE6RFpBLkwyLjE1CisxOkRaOkRaQTpBTEdFUklBOk1zaWxhOkRaQS5MMi43CisxOkRaOkRaQTpBTEdFUklBOkVsIE91ZWQ6RFpBLkwyLjEyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0VDVS9FQ1VfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0VDVS9FQ1VfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4OGMxNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRUNVL0VDVV9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDIzIEBACisxOkVDLUE6RUM6QVpVQVkKKzI6RUMtQjpFQzpCT0xJVkFSCiszOkVDLUY6RUM6Q0FOQVIKKzQ6RUMtQzpFQzpDQVJDSEkKKzU6RUMtSDpFQzpDSElNQk9SQVpPCis2OkVDLVg6RUM6Q09UT1BBWEkKKzc6RUMtTzpFQzpFTCBPUk8KKzg6RUMtRTpFQzpFU01FUkFMREFTCis5OkVDLVc6RUM6R0FMUEFHT1MKKzEwOkVDLUc6RUM6R1VBWUFTCisxMTpFQy1JOkVDOklNQkFCVVJBCisxMjpFQy1MOkVDOkxPSkEKKzEzOkVDLVI6RUM6TE9TIFJJT1MKKzE0OkVDLU06RUM6TUFOQUJJCisxNTpFQy1TOkVDOk1PUk9OQSBTQU5USUFHTworMTY6RUMtTjpFQzpOQVBPCisxNzpFQy1EOkVDOk9SRUxMQU5BCisxODpFQy1ZOkVDOlBBU1RBWkEKKzE5OkVDLVA6RUM6UElDSElOQ0hBCisyMDpFQy1VOkVDOlNVQ1VNQklPUworMjE6RUMtVDpFQzpUVU5HVVJBSFVBCisyMjpFQy1aOkVDOlpBTU9SQSBDSElOQ0hJUEUKKzIzOkVDLVpORDpFQzpaT05BIE5PIERFTElNVERBCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0VDVS9FQ1VfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0VDVS9FQ1VfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmMzk4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRUNVL0VDVV9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDIwNSBAQAorMTpFQzpFQ1U6RUNVQURPUjpCT0xJVkFSOkNhbHVtYQorMjpFQzpFQ1U6RUNVQURPUjpCT0xJVkFSOkNoaWxsYW5lcworMzpFQzpFQ1U6RUNVQURPUjpCT0xJVkFSOkNoaW1ibworNDpFQzpFQ1U6RUNVQURPUjpCT0xJVkFSOkVjaGVhbmRpYQorNTpFQzpFQ1U6RUNVQURPUjpCT0xJVkFSOkd1YXJhbmRhCis2OkVDOkVDVTpFQ1VBRE9SOkJPTElWQVI6TGFzIE5hdmVzCis3OkVDOkVDVTpFQ1VBRE9SOkJPTElWQVI6U2FuIE1pZ3VlbAorMTpFQzpFQ1U6RUNVQURPUjpHVUFZQVM6QWxmcmVkbyBCYXF1ZXJpegorMjpFQzpFQ1U6RUNVQURPUjpHVUFZQVM6QmFsYW8KKzM6RUM6RUNVOkVDVUFET1I6R1VBWUFTOkJhbHphcgorNDpFQzpFQ1U6RUNVQURPUjpHVUFZQVM6Q29saW1lcworNTpFQzpFQ1U6RUNVQURPUjpHVUFZQVM6Q29yb25lbCBNYXJjZWxpbgorNjpFQzpFQ1U6RUNVQURPUjpHVUFZQVM6RGF1bGUKKzc6RUM6RUNVOkVDVUFET1I6R1VBWUFTOkR1cmFuCis4OkVDOkVDVTpFQ1VBRE9SOkdVQVlBUzpFbCBFbXBhbG1lCis5OkVDOkVDVTpFQ1VBRE9SOkdVQVlBUzpHdWF5YXF1aWwKKzEwOkVDOkVDVTpFQ1VBRE9SOkdVQVlBUzpMYSBMaWJlcnRhZAorMTE6RUM6RUNVOkVDVUFET1I6R1VBWUFTOkxvbWFzIGRlIFNhcmdlbnQKKzEyOkVDOkVDVTpFQ1VBRE9SOkdVQVlBUzpNaWxhZ3JvCisxMzpFQzpFQ1U6RUNVQURPUjpHVUFZQVM6TmFyYW5qYWwKKzE0OkVDOkVDVTpFQ1VBRE9SOkdVQVlBUzpOYXJhbmppdG8KKzE1OkVDOkVDVTpFQ1VBRE9SOkdVQVlBUzpOb2JvbAorMTY6RUM6RUNVOkVDVUFET1I6R1VBWUFTOlBhbGVzdGluYQorMTc6RUM6RUNVOkVDVUFET1I6R1VBWUFTOlBlZHJvIENhcmJvCisxODpFQzpFQ1U6RUNVQURPUjpHVUFZQVM6UGxheWFzCisxOTpFQzpFQ1U6RUNVQURPUjpHVUFZQVM6U2FsaW5hcworMjA6RUM6RUNVOkVDVUFET1I6R1VBWUFTOlNhbWJvcm9uZG9uCisyMTpFQzpFQ1U6RUNVQURPUjpHVUFZQVM6U2FudGEgRWxlbmEKKzIyOkVDOkVDVTpFQ1VBRE9SOkdVQVlBUzpTYW50YSBMdWNpYQorMjM6RUM6RUNVOkVDVUFET1I6R1VBWUFTOlNpbW9uIEJvbGl2YXIKKzI0OkVDOkVDVTpFQ1VBRE9SOkdVQVlBUzpVcmJpbmEgSmFkbworMjU6RUM6RUNVOkVDVUFET1I6R1VBWUFTOllhZ3VhY2hpCisxOkVDOkVDVTpFQ1VBRE9SOkVMIE9STzpBcmVuaWxsYXMKKzI6RUM6RUNVOkVDVUFET1I6RUwgT1JPOkF0YWh1YWxwYQorMzpFQzpFQ1U6RUNVQURPUjpFTCBPUk86QmFsc2FzCis0OkVDOkVDVTpFQ1VBRE9SOkVMIE9STzpDaGlsbGEKKzU6RUM6RUNVOkVDVUFET1I6RUwgT1JPOkVsIEd1YWJvCis2OkVDOkVDVTpFQ1VBRE9SOkVMIE9STzpIdWFxdWlsbGFzCis3OkVDOkVDVTpFQ1VBRE9SOkVMIE9STzpJc2xhIENvcnJlYQorODpFQzpFQ1U6RUNVQURPUjpFTCBPUk86SXNsYSBNYXRhcGFsbworOTpFQzpFQ1U6RUNVQURPUjpFTCBPUk86TGFzIExhamFzCisxMDpFQzpFQ1U6RUNVQURPUjpFTCBPUk86TWFjaGFsYQorMTE6RUM6RUNVOkVDVUFET1I6RUwgT1JPOk1hcmNhYmVsaQorMTI6RUM6RUNVOkVDVUFET1I6RUwgT1JPOlBhc2FqZQorMTM6RUM6RUNVOkVDVUFET1I6RUwgT1JPOlBpbmFzCisxNDpFQzpFQ1U6RUNVQURPUjpFTCBPUk86UG9ydG92ZWxvCisxNTpFQzpFQ1U6RUNVQURPUjpFTCBPUk86U2FudGEgUm9zYQorMTY6RUM6RUNVOkVDVUFET1I6RUwgT1JPOlphcnVtYQorMTpFQzpFQ1U6RUNVQURPUjpNT1JPTkEgU0FOVElBR086R3VhbGFxdWl6YQorMjpFQzpFQ1U6RUNVQURPUjpNT1JPTkEgU0FOVElBR086SHVhbWJveWEKKzM6RUM6RUNVOkVDVUFET1I6TU9ST05BIFNBTlRJQUdPOk1vcm9uYQorNDpFQzpFQ1U6RUNVQURPUjpNT1JPTkEgU0FOVElBR086UGFsb3JhCis1OkVDOkVDVTpFQ1VBRE9SOk1PUk9OQSBTQU5USUFHTzpTYW4gSnVhbiBCb3NjbworNjpFQzpFQ1U6RUNVQURPUjpNT1JPTkEgU0FOVElBR086U2FudGlhZ28KKzc6RUM6RUNVOkVDVUFET1I6TU9ST05BIFNBTlRJQUdPOlN1Y3VhCisxOkVDOkVDVTpFQ1VBRE9SOlBBU1RBWkE6TWVyYQorMjpFQzpFQ1U6RUNVQURPUjpQQVNUQVpBOlBhc3RhemEKKzM6RUM6RUNVOkVDVUFET1I6UEFTVEFaQTpTYW50YSBDbGFyYQorMTpFQzpFQ1U6RUNVQURPUjpBWlVBWTpDaG9yZGVsZWcKKzI6RUM6RUNVOkVDVUFET1I6QVpVQVk6Q3VlbmNhCiszOkVDOkVDVTpFQ1VBRE9SOkFaVUFZOkVsIFBhbgorNDpFQzpFQ1U6RUNVQURPUjpBWlVBWTpHaXJvbgorNTpFQzpFQ1U6RUNVQURPUjpBWlVBWTpHdWFsYWNlbworNjpFQzpFQ1U6RUNVQURPUjpBWlVBWTpOYWJvbgorNzpFQzpFQ1U6RUNVQURPUjpBWlVBWTpPbmEKKzg6RUM6RUNVOkVDVUFET1I6QVpVQVk6UGF1dGUKKzk6RUM6RUNVOkVDVUFET1I6QVpVQVk6UHVjYXJhCisxMDpFQzpFQ1U6RUNVQURPUjpBWlVBWTpTYW4gRmVybmFuZG8KKzExOkVDOkVDVTpFQ1VBRE9SOkFaVUFZOlNhbnRhIElzYWJlbAorMTI6RUM6RUNVOkVDVUFET1I6QVpVQVk6U2V2aWxsYSBkZSBPcm8KKzEzOkVDOkVDVTpFQ1VBRE9SOkFaVUFZOlNpc3NpZworMTpFQzpFQ1U6RUNVQURPUjpOQVBPOkFndWFyaWNvCisyOkVDOkVDVTpFQ1VBRE9SOk5BUE86QXJjaGlkb25hCiszOkVDOkVDVTpFQ1VBRE9SOk5BUE86RWwgQ2hhY28KKzQ6RUM6RUNVOkVDVUFET1I6TkFQTzpMYSBKb3lhIGRlIGxvcyBTCis1OkVDOkVDVTpFQ1VBRE9SOk5BUE86TG9yZXRvCis2OkVDOkVDVTpFQ1VBRE9SOk5BUE86T3JlbGxhbmEKKzc6RUM6RUNVOkVDVUFET1I6TkFQTzpRdWlqb3MKKzg6RUM6RUNVOkVDVUFET1I6TkFQTzpUZW5hCisxOkVDOkVDVTpFQ1VBRE9SOk1BTkFCSToyNCBkZSBNYXlvCisyOkVDOkVDVTpFQ1VBRE9SOk1BTkFCSTpCb2xpdmFyCiszOkVDOkVDVTpFQ1VBRE9SOk1BTkFCSTpDaG9uZQorNDpFQzpFQ1U6RUNVQURPUjpNQU5BQkk6RWwgQ2FybWVuCis1OkVDOkVDVTpFQ1VBRE9SOk1BTkFCSTpFc3QgZGVsIE1lZGlvCis2OkVDOkVDVTpFQ1VBRE9SOk1BTkFCSTpGbGF2aW8gQWxmYXJvCis3OkVDOkVDVTpFQ1VBRE9SOk1BTkFCSTpJLiBTYWxhbmdvCis4OkVDOkVDVTpFQ1VBRE9SOk1BTkFCSTpJc2xhIGRlbCBNZWRpbworOTpFQzpFQ1U6RUNVQURPUjpNQU5BQkk6SmlwaWphcGEKKzEwOkVDOkVDVTpFQ1VBRE9SOk1BTkFCSTpKdW5pbgorMTE6RUM6RUNVOkVDVUFET1I6TUFOQUJJOk1hbnRhCisxMjpFQzpFQ1U6RUNVQURPUjpNQU5BQkk6TW9udGVjcmlzdGkKKzEzOkVDOkVDVTpFQ1VBRE9SOk1BTkFCSTpQYWphbgorMTQ6RUM6RUNVOkVDVUFET1I6TUFOQUJJOlBlZGVybmFsZXMKKzE1OkVDOkVDVTpFQ1VBRE9SOk1BTkFCSTpQaWNoaW5jaGEKKzE2OkVDOkVDVTpFQ1VBRE9SOk1BTkFCSTpQb3J0b3ZpZWpvCisxNzpFQzpFQ1U6RUNVQURPUjpNQU5BQkk6Um9jYWZ1ZXJ0ZQorMTg6RUM6RUNVOkVDVUFET1I6TUFOQUJJOlNhbnRhIEFuYQorMTk6RUM6RUNVOkVDVUFET1I6TUFOQUJJOlN1Y3JlCisyMDpFQzpFQ1U6RUNVQURPUjpNQU5BQkk6VG9zYWd1YQorMTpFQzpFQ1U6RUNVQURPUjpaQU1PUkEgQ0hJTkNISVBFOkNoaW5jaGlwZQorMjpFQzpFQ1U6RUNVQURPUjpaQU1PUkEgQ0hJTkNISVBFOkVsIFBhbmd1aQorMzpFQzpFQ1U6RUNVQURPUjpaQU1PUkEgQ0hJTkNISVBFOk5hbmdhcml0emEKKzQ6RUM6RUNVOkVDVUFET1I6WkFNT1JBIENISU5DSElQRTpZYWN1YW1iaQorNTpFQzpFQ1U6RUNVQURPUjpaQU1PUkEgQ0hJTkNISVBFOllhbnR6YXphCis2OkVDOkVDVTpFQ1VBRE9SOlpBTU9SQSBDSElOQ0hJUEU6WmFtb3JhCisxOkVDOkVDVTpFQ1VBRE9SOklNQkFCVVJBOkFudG9uaW8gQW50ZQorMjpFQzpFQ1U6RUNVQURPUjpJTUJBQlVSQTpDb3RhY2FjaGkKKzM6RUM6RUNVOkVDVUFET1I6SU1CQUJVUkE6SWJhcnJhCis0OkVDOkVDVTpFQ1VBRE9SOklNQkFCVVJBOk90YXZhbG8KKzU6RUM6RUNVOkVDVUFET1I6SU1CQUJVUkE6UGltYW1waXJvCis2OkVDOkVDVTpFQ1VBRE9SOklNQkFCVVJBOlNhbiBNaWd1ZWwgVXJjdXEKKzE6RUM6RUNVOkVDVUFET1I6RVNNRVJBTERBUzpBdGFjYW1lcworMjpFQzpFQ1U6RUNVQURPUjpFU01FUkFMREFTOkVsb3kgQWxmYXJvCiszOkVDOkVDVTpFQ1VBRE9SOkVTTUVSQUxEQVM6RXNtZXJhbGRhcworNDpFQzpFQ1U6RUNVQURPUjpFU01FUkFMREFTOklzLkNhbmNoaW1hbGVybworNTpFQzpFQ1U6RUNVQURPUjpFU01FUkFMREFTOklzbGEgRWwgQnJ1am8KKzY6RUM6RUNVOkVDVUFET1I6RVNNRVJBTERBUzpJc2xhIEx1aXMgVmFyZ2FzCis3OkVDOkVDVTpFQ1VBRE9SOkVTTUVSQUxEQVM6SXNsYSBTdGEuUm9zYQorODpFQzpFQ1U6RUNVQURPUjpFU01FUkFMREFTOklzbGEgVGF0YWJyZXJvCis5OkVDOkVDVTpFQ1VBRE9SOkVTTUVSQUxEQVM6TGEgSXNsYSAoTXVpc25lKQorMTA6RUM6RUNVOkVDVUFET1I6RVNNRVJBTERBUzpMYSBJc2xhIChNdW5pc21lCisxMTpFQzpFQ1U6RUNVQURPUjpFU01FUkFMREFTOk11aXNuZQorMTI6RUM6RUNVOkVDVUFET1I6RVNNRVJBTERBUzpRdWluaW5kZQorMTM6RUM6RUNVOkVDVUFET1I6RVNNRVJBTERBUzpTYW4gTG9yZW56bworMTQ6RUM6RUNVOkVDVUFET1I6RVNNRVJBTERBUzpTYW4gTG9yZW56byAoSXMpCisxOkVDOkVDVTpFQ1VBRE9SOkxPSkE6Q2FsdmFzCisyOkVDOkVDVTpFQ1VBRE9SOkxPSkE6Q2F0YW1heW8KKzM6RUM6RUNVOkVDVUFET1I6TE9KQTpDZWxpY2EKKzQ6RUM6RUNVOkVDVUFET1I6TE9KQTpDaGFndWFycGFtYmEKKzU6RUM6RUNVOkVDVUFET1I6TE9KQTpFc3BpbmRvbGEKKzY6RUM6RUNVOkVDVUFET1I6TE9KQTpHb256YW5hbWEKKzc6RUM6RUNVOkVDVUFET1I6TE9KQTpMb2phCis4OkVDOkVDVTpFQ1VBRE9SOkxPSkE6TWFjYXJhCis5OkVDOkVDVTpFQ1VBRE9SOkxPSkE6UGFsdGFzCisxMDpFQzpFQ1U6RUNVQURPUjpMT0pBOlBpbmRhbAorMTE6RUM6RUNVOkVDVUFET1I6TE9KQTpQdXlhbmdvCisxMjpFQzpFQ1U6RUNVQURPUjpMT0pBOlF1aWxhbmdhCisxMzpFQzpFQ1U6RUNVQURPUjpMT0pBOlNhcmFndXJvCisxNDpFQzpFQ1U6RUNVQURPUjpMT0pBOlNvem9yYW5nYQorMTU6RUM6RUNVOkVDVUFET1I6TE9KQTpaYXBvdGlsbG8KKzE6RUM6RUNVOkVDVUFET1I6Q0hJTUJPUkFaTzpBbGF1c2kKKzI6RUM6RUNVOkVDVUFET1I6Q0hJTUJPUkFaTzpDaGFtYm8KKzM6RUM6RUNVOkVDVUFET1I6Q0hJTUJPUkFaTzpDaHVuY2hpCis0OkVDOkVDVTpFQ1VBRE9SOkNISU1CT1JBWk86Q29sdGEKKzU6RUM6RUNVOkVDVUFET1I6Q0hJTUJPUkFaTzpDdW1hbmRhCis2OkVDOkVDVTpFQ1VBRE9SOkNISU1CT1JBWk86R3VhbW90ZQorNzpFQzpFQ1U6RUNVQURPUjpDSElNQk9SQVpPOkd1YW5vCis4OkVDOkVDVTpFQ1VBRE9SOkNISU1CT1JBWk86UGFsbGF0YW5nYQorOTpFQzpFQ1U6RUNVQURPUjpDSElNQk9SQVpPOlBlbmlwZQorMTA6RUM6RUNVOkVDVUFET1I6Q0hJTUJPUkFaTzpSaW9iYW1iYQorMTpFQzpFQ1U6RUNVQURPUjpDT1RPUEFYSTpMYSBNYW5hCisyOkVDOkVDVTpFQ1VBRE9SOkNPVE9QQVhJOkxhdGFjdW5nYQorMzpFQzpFQ1U6RUNVQURPUjpDT1RPUEFYSTpQYW5ndWEKKzQ6RUM6RUNVOkVDVUFET1I6Q09UT1BBWEk6UHVqaWxpCis1OkVDOkVDVTpFQ1VBRE9SOkNPVE9QQVhJOlNhbGNlZG8KKzY6RUM6RUNVOkVDVUFET1I6Q09UT1BBWEk6U2FxdWlzaWxpCis3OkVDOkVDVTpFQ1VBRE9SOkNPVE9QQVhJOlNpZ2Nob3MKKzE6RUM6RUNVOkVDVUFET1I6Q0FOQVI6QXpvZ3VlcworMjpFQzpFQ1U6RUNVQURPUjpDQU5BUjpCaWJsaWFuCiszOkVDOkVDVTpFQ1VBRE9SOkNBTkFSOkNhbmFyCis0OkVDOkVDVTpFQ1VBRE9SOkNBTkFSOkRlbGVnCis1OkVDOkVDVTpFQ1VBRE9SOkNBTkFSOkVsIFRhbWJvCis2OkVDOkVDVTpFQ1VBRE9SOkNBTkFSOkxhIFRyb25jYWwKKzE6RUM6RUNVOkVDVUFET1I6VFVOR1VSQUhVQTpBbWJhdG8KKzI6RUM6RUNVOkVDVUFET1I6VFVOR1VSQUhVQTpCYW5vcworMzpFQzpFQ1U6RUNVQURPUjpUVU5HVVJBSFVBOkNldmFsbG9zCis0OkVDOkVDVTpFQ1VBRE9SOlRVTkdVUkFIVUE6TW9jaGEKKzU6RUM6RUNVOkVDVUFET1I6VFVOR1VSQUhVQTpQYXRhdGUKKzY6RUM6RUNVOkVDVUFET1I6VFVOR1VSQUhVQTpRdWVybworNzpFQzpFQ1U6RUNVQURPUjpUVU5HVVJBSFVBOlNhbnRpYWdvIFBpbGxhcm8KKzg6RUM6RUNVOkVDVUFET1I6VFVOR1VSQUhVQTpTbiBQZWRybyBQZWxpbGVvCis5OkVDOkVDVTpFQ1VBRE9SOlRVTkdVUkFIVUE6VGlzYWxlbworMTpFQzpFQ1U6RUNVQURPUjpDQVJDSEk6Qm9saXZhcgorMjpFQzpFQ1U6RUNVQURPUjpDQVJDSEk6RXNwZWpvCiszOkVDOkVDVTpFQ1VBRE9SOkNBUkNISTpNaXJhCis0OkVDOkVDVTpFQ1VBRE9SOkNBUkNISTpNb250dWZhcgorNTpFQzpFQ1U6RUNVQURPUjpDQVJDSEk6VHVsY2FuCisxOkVDOkVDVTpFQ1VBRE9SOlBJQ0hJTkNIQTpDYXlhbWJlCisyOkVDOkVDVTpFQ1VBRE9SOlBJQ0hJTkNIQTpNZWppYQorMzpFQzpFQ1U6RUNVQURPUjpQSUNISU5DSEE6UGVkcm8gTW9uY2F5bworNDpFQzpFQ1U6RUNVQURPUjpQSUNISU5DSEE6UGVkcm8gVmljZW50ZSBNLgorNTpFQzpFQ1U6RUNVQURPUjpQSUNISU5DSEE6UXVpdG8KKzY6RUM6RUNVOkVDVUFET1I6UElDSElOQ0hBOlJ1bWluYWh1aQorNzpFQzpFQ1U6RUNVQURPUjpQSUNISU5DSEE6U2FudG8gRG9taW5nbworODpFQzpFQ1U6RUNVQURPUjpQSUNISU5DSEE6U24gTWlndWVsIEJhbmNvcworMTpFQzpFQ1U6RUNVQURPUjpab25hIE5vIERlbGltdGRhOkVsIFBpZWRyZXJvCisyOkVDOkVDVTpFQ1VBRE9SOlpvbmEgTm8gRGVsaW10ZGE6TGEgQ29uY29yZGlhCiszOkVDOkVDVTpFQ1VBRE9SOlpvbmEgTm8gRGVsaW10ZGE6TGFzIEdvbG9uZHJpbmFzCis0OkVDOkVDVTpFQ1VBRE9SOlpvbmEgTm8gRGVsaW10ZGE6TWFuZ2EgZGUgQ3VyYQorMTpFQzpFQ1U6RUNVQURPUjpTVUNVTUJJT1M6Q2FzY2FsZXMKKzI6RUM6RUNVOkVDVUFET1I6U1VDVU1CSU9TOkdvbnphbG8gUGl6YXJybworMzpFQzpFQ1U6RUNVQURPUjpTVUNVTUJJT1M6TGFnbyBBZ3JpbworNDpFQzpFQ1U6RUNVQURPUjpTVUNVTUJJT1M6UHV0dW1heW8KKzU6RUM6RUNVOkVDVUFET1I6U1VDVU1CSU9TOlNodXNodWZpbmRpCis2OkVDOkVDVTpFQ1VBRE9SOlNVQ1VNQklPUzpTdWN1bWJpb3MKKzE6RUM6RUNVOkVDVUFET1I6TE9TIFJJT1M6QmFiYQorMjpFQzpFQ1U6RUNVQURPUjpMT1MgUklPUzpCYWJhaG95bworMzpFQzpFQ1U6RUNVQURPUjpMT1MgUklPUzpCdWVuYSBGZQorNDpFQzpFQ1U6RUNVQURPUjpMT1MgUklPUzpNb250YWx2bworNTpFQzpFQ1U6RUNVQURPUjpMT1MgUklPUzpQYWxlbnF1ZQorNjpFQzpFQ1U6RUNVQURPUjpMT1MgUklPUzpQdWVibG92aWVqbworNzpFQzpFQ1U6RUNVQURPUjpMT1MgUklPUzpRdWV2ZWRvCis4OkVDOkVDVTpFQ1VBRE9SOkxPUyBSSU9TOlVyZGFuZXRhCis5OkVDOkVDVTpFQ1VBRE9SOkxPUyBSSU9TOlZlbnRhbmFzCisxMDpFQzpFQ1U6RUNVQURPUjpMT1MgUklPUzpWaW5jZXMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRUdZL0VHWV9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRUdZL0VHWV9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTlkNmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9FR1kvRUdZX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMzAgQEAKKzE6RUctREs6RUc6QUQgREFRQUhMSVlBSAorMjpFRy1CQTpFRzpBTCBCQVIgQUwgQU1BUgorMzpFRy1CSDpFRzpBTCBCVUFZUkFICis0OkVHLUZZTTpFRzpBTCBGQVlZVU0KKzU6RUctR0g6RUc6QUwgR0hBUkJJWUFICis2OkVHLUFMWDpFRzpBTCBJU0tBTkRBUklZQUgKKzc6RUctSVM6RUc6QUwgSVNNQUxZQUgKKzg6RUctR1o6RUc6QUwgSlpBSAorOTpFRy1NTkY6RUc6QUwgTUlORllBSAorMTA6RUctTU46RUc6QUwgTUlOWQorMTE6RUctS0I6RUc6QUwgUUFMWUJZQUgKKzEyOkVHLUM6RUc6QUwgUUhJUkFICisxMzpFRy1XQUQ6RUc6QUwgV0QgQUwgSkFERAorMTQ6RUctU1VaOkVHOkFTIFNVV0FZUworMTU6RUctU0hSOkVHOkFTSCBTSEFSUVlBSAorMTY6RUctQVNOOkVHOkFTV04KKzE3OkVHLUFTVDpFRzpBU1kKKzE4OkVHLUJOUzpFRzpCQU4gU1VXQVlGCisxOTpFRy1QVFM6RUc6QlIgU0FECisyMDpFRy1EVDpFRzpEVU1ZCisyMTpFRy1GUkc6RUc6RlJPTlRJRVIgR09WRVJOQVRFUworMjI6RUctSlM6RUc6SkFOQiBTTgorMjM6RUctS0ZTOkVHOktBRlIgQVNIIFNIQVlLSAorMjQ6RUctTE9FOkVHOkxPV0VSIEVHWVBUCisyNTpFRy1NVDpFRzpNQVIKKzI2OkVHLUtOOkVHOlFJTgorMjc6RUctU0lOOkVHOlNIQU1MIFNOCisyODpFRy1TSEc6RUc6U0hKCisyOTpFRy1VUEU6RUc6VVBQRVIgRUdZUFQKKzMwOkVHLVVSRzpFRzpVUkJBTiBHT1ZFUk5BVEVTCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0VHWS9FR1lfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0VHWS9FR1lfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkZGUzNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRUdZL0VHWV9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDI2IEBACisxOkVHOkVHWTpFR1lQVDpVcmJhbiBHb3Zlcm5hdGVzOkFsIElza2FuZGFyaXlhaCAoQWxleC4pCisyOkVHOkVHWTpFR1lQVDpVcmJhbiBHb3Zlcm5hdGVzOkFsIFFhaGlyYWggKENhaXJvKQorMzpFRzpFR1k6RUdZUFQ6VXJiYW4gR292ZXJuYXRlczpBcyBTdXdheXMgKFN1ZXopCis0OkVHOkVHWTpFR1lQVDpVcmJhbiBHb3Zlcm5hdGVzOkJ1ciBTYWlkIChQb3J0IFNhaWQpCisxOkVHOkVHWTpFR1lQVDpMb3dlciBFZ3lwdDpBbCBCdWhheXJhaCAoQmVoZXJhKQorMjpFRzpFR1k6RUdZUFQ6TG93ZXIgRWd5cHQ6QWwgRGFxYWhsaXlhaCAoRGFrYWhsaWEpCiszOkVHOkVHWTpFR1lQVDpMb3dlciBFZ3lwdDpBbCBHaGFyYml5YWggKEdoYXJiaWEpCis0OkVHOkVHWTpFR1lQVDpMb3dlciBFZ3lwdDpBbCBNaW51Zml5YWggKE1lbm91ZmlhKQorNTpFRzpFR1k6RUdZUFQ6TG93ZXIgRWd5cHQ6QWwgUWFseXViaXlhaCAoS2FseW91YmlhKQorNjpFRzpFR1k6RUdZUFQ6TG93ZXIgRWd5cHQ6QXMgSXNtYWlsaXlhaCAoSXNtYWlsaWEpCis3OkVHOkVHWTpFR1lQVDpMb3dlciBFZ3lwdDpBc2ggU2hhcnFpeWFoIChTaGFya2lhKQorODpFRzpFR1k6RUdZUFQ6TG93ZXIgRWd5cHQ6RHVteWF0IChEYW1pZXR0YSkKKzk6RUc6RUdZOkVHWVBUOkxvd2VyIEVneXB0OkthZnItRWwtU2hlaWtoCisxOkVHOkVHWTpFR1lQVDpGcm9udGllciBHb3Zlcm5hdGVzOkFsIEJhaHIvQWwgQWhtYXIgKFJlZFNlYSkKKzI6RUc6RUdZOkVHWVBUOkZyb250aWVyIEdvdmVybmF0ZXM6QWwgV2FkaS9BbCBKYWRpZAorMzpFRzpFR1k6RUdZUFQ6RnJvbnRpZXIgR292ZXJuYXRlczpKYW51YiBTaW5hIChTb3V0aCBTaW5haSkKKzQ6RUc6RUdZOkVHWVBUOkZyb250aWVyIEdvdmVybmF0ZXM6TWF0cnVoCis1OkVHOkVHWTpFR1lQVDpGcm9udGllciBHb3Zlcm5hdGVzOlNoYW1hbCBTaW5hIChOb3J0aCBTaW5haSkKKzE6RUc6RUdZOkVHWVBUOlVwcGVyIEVneXB0OkFsIEZheXl1bSAoRmF5b3VtKQorMjpFRzpFR1k6RUdZUFQ6VXBwZXIgRWd5cHQ6QWwgSml6YWggKEdpemEpCiszOkVHOkVHWTpFR1lQVDpVcHBlciBFZ3lwdDpBbCBNaW55YSAoTWVuaWEpCis0OkVHOkVHWTpFR1lQVDpVcHBlciBFZ3lwdDpBc3dhbgorNTpFRzpFR1k6RUdZUFQ6VXBwZXIgRWd5cHQ6QXN5aXV0Cis2OkVHOkVHWTpFR1lQVDpVcHBlciBFZ3lwdDpCZW5pIFN1d2F5ZiAoQmVuaS1TdWVmKQorNzpFRzpFR1k6RUdZUFQ6VXBwZXIgRWd5cHQ6UWluYQorODpFRzpFR1k6RUdZUFQ6VXBwZXIgRWd5cHQ6U3VoYWoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRVJJL0VSSV9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRVJJL0VSSV9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTlkMDU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9FUkkvRVJJX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMTQgQEAKKzE6RVItQUtHOkVSOkFLRUxFIEdVWkFZCisyOkVSLUFLOkVSOkFLT1JEQVQKKzM6RVItQU46RVI6QU5TRUJBCis0OkVSLUFTOkVSOkFTU0VCCis1OkVSLURVOkVSOkRFQlVCCis2OkVSLUdBUzpFUjpHQVNIICYgU0VUSVQKKzc6RVItR0I6RVI6R0FTSCBCQVJLQQorODpFUi1IQTpFUjpIQU1BU1NJRU4KKzk6RVItS0U6RVI6S0VSRU4KKzEwOkVSLURLOkVSOktFWSBCQUhJUgorMTE6RVItTUE6RVI6TUFBS0VMIFtNQUVLRUxdCisxMjpFUi1TQTpFUjpTQUhFTAorMTM6RVItU0s6RVI6U0VNRU5BV0kgS0VZSUggQkFIUkkgW1NFTUlFTiBLRUlIIEJBSFJJXQorMTQ6RVItU0U6RVI6U0VSQVlFCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0VSSS9FUklfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0VSSS9FUklfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzYWI2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRVJJL0VSSV9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDM4IEBACisxOkVSOkVSSTpFUklUUkVBOktlcmVuOkVsYWJlcmVkCisyOkVSOkVSSTpFUklUUkVBOktlcmVuOkhhZ2F6CiszOkVSOkVSSTpFUklUUkVBOktlcmVuOkhhbGhhbAorNDpFUjpFUkk6RVJJVFJFQTpLZXJlbjpNZWxiYXNvCisxOkVSOkVSSTpFUklUUkVBOlNlcmF5ZTpBZGkgS3dhbGEKKzI6RVI6RVJJOkVSSVRSRUE6U2VyYXllOkFyZXphCiszOkVSOkVSSTpFUklUUkVBOlNlcmF5ZTpEaWJhcndhCis0OkVSOkVSSTpFUklUUkVBOlNlcmF5ZTpNZW5kZWZlcmEKKzE6RVI6RVJJOkVSSVRSRUE6R2FzaCAmIFNldGl0OkdvbnllCisyOkVSOkVSSTpFUklUUkVBOkdhc2ggJiBTZXRpdDpPbWhhamVyCiszOkVSOkVSSTpFUklUUkVBOkdhc2ggJiBTZXRpdDpTaGVtYm9rbworNDpFUjpFUkk6RVJJVFJFQTpHYXNoICYgU2V0aXQ6VGVzZW5leWUKKzE6RVI6RVJJOkVSSVRSRUE6QWtvcmRhdDpBa29yZGF0CisyOkVSOkVSSTpFUklUUkVBOkFrb3JkYXQ6S2Vya2UgQmV0CiszOkVSOkVSSTpFUklUUkVBOkFrb3JkYXQ6S2VydQorNDpFUjpFUkk6RVJJVFJFQTpBa29yZGF0Ok1hbnN1cmEKKzE6RVI6RVJJOkVSSVRSRUE6QWtlbGUgR3V6YXk6QWRpIEtleWloCisyOkVSOkVSSTpFUklUUkVBOkFrZWxlIEd1emF5OkRla2VtZWhhcmUKKzM6RVI6RVJJOkVSSVRSRUE6QWtlbGUgR3V6YXk6U2VnZW5leWl0aQorNDpFUjpFUkk6RVJJVFJFQTpBa2VsZSBHdXpheTpTZW5hZmUKKzE6RVI6RVJJOkVSSVRSRUE6SGFtYXNzaWVuOkRlYnViYXdpIEJhaHJpCisyOkVSOkVSSTpFUklUUkVBOkhhbWFzc2llbjpEZWJ1YmF3aSBIYW1hc2VuCiszOkVSOkVSSTpFUklUUkVBOkhhbWFzc2llbjpNaXJhYmF3aSBIYW1hc2VuCis0OkVSOkVSSTpFUklUUkVBOkhhbWFzc2llbjpTZW1lbmF3aSBCYWhyaQorNTpFUjpFUkk6RVJJVFJFQTpIYW1hc3NpZW46U2VtZW5hd2kgSGFtYXNlbgorMTpFUjpFUkk6RVJJVFJFQTpLZXkgQmFoaXI6R2luZGEKKzI6RVI6RVJJOkVSSVRSRUE6S2V5IEJhaGlyOkhhcmlnbworMzpFUjpFUkk6RVJJVFJFQTpLZXkgQmFoaXI6TWl0c2l3YQorNDpFUjpFUkk6RVJJVFJFQTpLZXkgQmFoaXI6U2hlaWIKKzU6RVI6RVJJOkVSSVRSRUE6S2V5IEJhaGlyOldla2lybworNjpFUjpFUkk6RVJJVFJFQTpLZXkgQmFoaXI6WnVsYQorMTpFUjpFUkk6RVJJVFJFQTpBc3NlYjpCZXlpbHVsCisyOkVSOkVSSTpFUklUUkVBOkFzc2ViOkVkaQorMzpFUjpFUkk6RVJJVFJFQTpBc3NlYjpNZXJzYSBGYXRpbWEKKzQ6RVI6RVJJOkVSSVRSRUE6QXNzZWI6UmFoYXlpdGEKKzU6RVI6RVJJOkVSSVRSRUE6QXNzZWI6VGl5bworMTpFUjpFUkk6RVJJVFJFQTpTYWhlbDpBZmFiZXQKKzI6RVI6RVJJOkVSSVRSRUE6U2FoZWw6S2Fyb3JhCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0VTUC9FU1BfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0VTUC9FU1BfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE0NWY5NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRVNQL0VTUF9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDU5IEBACisxOkVTLUM6RVM6QSBDT1JVQQorMjpFUy1BQjpFUzpBTEJBQ0VURQorMzpFUy1BOkVTOkFMSUNBTlRFCis0OkVTLUFMOkVTOkFMTUVSQQorNTpFUy1BRDpFUzpBTkRBTFVDSUEKKzY6RVMtQVI6RVM6QVJBR09OCis3OkVTLU86RVM6QVNUVVJJQVMKKzg6RVMtQkE6RVM6QkFEQUpPWgorOTpFUy1QTTpFUzpCQUxFQVJFUworMTA6RVMtQjpFUzpCQVJDRUxPTkEKKzExOkVTLUJVOkVTOkJVUkdPUworMTI6RVMtQ046RVM6Q0FOQVJJQVMKKzEzOkVTLVM6RVM6Q0FOVEFCUklBCisxNDpFUy1DUzpFUzpDQVNURUxMTgorMTU6RVMtTUE6RVM6Q0FTVElMTEEgICBMQSBNQU5DSEEKKzE2OkVTLUxFOkVTOkNBU1RJTExBICAgTEVPTgorMTc6RVMtQ1Q6RVM6Q0FUQUxVTkEKKzE4OkVTLUNDOkVTOkNDRVJFUworMTk6RVMtQ0E6RVM6Q0RJWgorMjA6RVMtQ0U6RVM6Q0VVVEEKKzIxOkVTLUNSOkVTOkNJVURBRCBSRUFMCisyMjpFUy1DTzpFUzpDUkRPQkEKKzIzOkVTLUNVOkVTOkNVRU5DQQorMjQ6RVMtRVQ6RVM6RVhUUkVNQURVUkEKKzI1OkVTLUdBOkVTOkdBTElDSUEKKzI2OkVTLUdJOkVTOkdJUk9OQQorMjc6RVMtR1I6RVM6R1JBTkFEQQorMjg6RVMtR1U6RVM6R1VBREFMQUpBUkEKKzI5OkVTLVNTOkVTOkdVSVBaQ09BCiszMDpFUy1IOkVTOkhVRUxWQQorMzE6RVMtSFU6RVM6SFVFU0NBCiszMjpFUy1KOkVTOkpBRU4KKzMzOkVTLUxPOkVTOkxBIFJJT0pBCiszNDpFUy1HQzpFUzpMQVMgUEFMTUFTCiszNTpFUy1WSTpFUzpMQVZBCiszNjpFUy1MOkVTOkxMRUlEQQorMzc6RVMtTFU6RVM6TFVHTworMzg6RVMtTTpFUzpNQURSSUQKKzM5OkVTLU1MOkVTOk1FTElMTEEKKzQwOkVTLU1VOkVTOk1VUkNJQQorNDE6RVMtTkE6RVM6TkFWQVJSQQorNDI6RVMtT1I6RVM6T1VSRU5TRQorNDM6RVMtVkE6RVM6UEFJUyBWQVNDTworNDQ6RVMtUDpFUzpQQUxFTkNJQQorNDU6RVMtUE86RVM6UE9OVEVWRURSQQorNDY6RVMtUkk6RVM6UklPSkEKKzQ3OkVTLVNBOkVTOlNBTEFNQU5DQQorNDg6RVMtVEY6RVM6U0FOVEEgQ1JVWiBERSBURU5FUklGRQorNDk6RVMtU0c6RVM6U0VHT1ZJQQorNTA6RVMtU0U6RVM6U0VWSUxMQQorNTE6RVMtU086RVM6U09SSUEKKzUyOkVTLVQ6RVM6VEFSUkFHT05BCis1MzpFUy1URTpFUzpURVJVRUwKKzU0OkVTLVRPOkVTOlRPTEVETworNTU6RVMtVjpFUzpWQUxFTkNJQQorNTY6RVMtQVY6RVM6VklMQQorNTc6RVMtQkk6RVM6VklaQ0FZQQorNTg6RVMtWkE6RVM6WkFNT1JBCis1OTpFUy1aOkVTOlpBUkFHT1pBCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0VTUC9FU1BfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0VTUC9FU1BfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRVNQL0VTUF9BRE1JTjJfTEVYLnR4dApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9GSU4vRklOX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9GSU4vRklOX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDExOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0ZJTi9GSU5fQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxNiBAQAorMTpGSS1BTDpGSTpBTEFORC9BSFZFTkFOTUFBCisyOkZJLUVTOkZJOkVURUwgU1VPTUVOIExOSQorMzpGSS1UQTpGSTpIhE1FL1RBVkFTVEVIVVMKKzQ6RkktSVM6Rkk6SVQgU1VPTUVOIExOSQorNTpGSS1LRTpGSTpLRVNLSSBTVU9NSS9NRUxMRVJTVEEgRklOTEFORAorNjpGSS1LVTpGSTpLVU9QSU8KKzc6RkktS1k6Rkk6S1lNSS9LWU1NRU5FCis4OkZJLUxMOkZJOkxBUFBJL0xBUFBMQU5ECis5OkZJLUxTOkZJOkxOU0kgU1VPTUVOIExOSQorMTA6RkktTUs6Rkk6TUlLS0VMSS9TVCBNSUNIRUwKKzExOkZJLVVMOkZJOk9VTFUvVUxFQUJPUkcKKzEyOkZJLU9MOkZJOk9VTFVOIExOSQorMTM6RkktUE86Rkk6UE9ISk9JUyBLQVJKQUxBL05PUlJBIEtBUkVMRU4KKzE0OkZJLVRVOkZJOlRVUktVIFBPUkkvQUJPIEJKlFJORUJPUkcKKzE1OkZJLVVVOkZJOlVVREVOTUFBL05ZTEFORAorMTY6RkktVkE6Rkk6VkFBU0EvVkFTQQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9GSU4vRklOX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9GSU4vRklOX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0ZJTi9GSU5fQURNSU4yX0xFWC50eHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRlJBL0ZSQV9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRlJBL0ZSQV9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmZkMWU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9GUkEvRlJBX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMTE0IEBACisxOkZSLTA6RlI6QUlOCisyOkZSLTAyOkZSOkFJU05FCiszOkZSLTAzOkZSOkFMTElFUgorNDpGUi0wNDpGUjpBTFBFUyBERSBIQVVURSBQUk9WRU5DRQorNTpGUi0wNjpGUjpBTFBFUyBNQVJJVElNRVMKKzY6RlItQUw6RlI6QUxTQUNFCis3OkZSLUFROkZSOkFRVUlUQUlORQorODpGUi0wNzpGUjpBUkRFQ0hFCis5OkZSLTA4OkZSOkFSREVOTkVTCisxMDpGUi0wOTpGUjpBUklFR0UKKzExOkZSLTpGUjpBVURFCisxMjpGUi1BVTpGUjpBVVZFUkdORQorMTM6RlItMjpGUjpBVkVZUk9OCisxNDpGUi02NzpGUjpCQVMgUkhJTgorMTU6RlItQkE6RlI6QkFTU0UgTk9STUFORElFCisxNjpGUi0zOkZSOkJPVUNIRVMgRFUgUkhPTkUKKzE3OkZSLUJPOkZSOkJPVVJHT0dORQorMTg6RlItQlI6RlI6QlJFVEFHTkUKKzE5OkZSLTQ6RlI6Q0FMVkFET1MKKzIwOkZSLTU6RlI6Q0FOVEFMCisyMTpGUi1DRTpGUjpDRU5UUkUKKzIyOkZSLUNIOkZSOkNIQU1QQUdORSBBUkRFTk5FCisyMzpGUi02OkZSOkNIQVJFTlRFCisyNDpGUi03OkZSOkNIQVJFTlRFIE1BUklUSU1FCisyNTpGUi04OkZSOkNIRVIKKzI2OkZSLTk6RlI6Q09SUkVaRQorMjc6RlItMkE6RlI6Q09SU0UgRFUgU1VECisyODpGUi0yMjpGUjpDT1RFUyBEQVJNT1IKKzI5OkZSLTIzOkZSOkNSRVVTRQorMzA6RlItNzk6RlI6REVVWCBTRVZSRVMKKzMxOkZSLTI0OkZSOkRPUkRPR05FCiszMjpGUi0yNTpGUjpET1VCUworMzM6RlItMjY6RlI6RFJPTUUKKzM0OkZSLTI3OkZSOkVVUkUKKzM1OkZSLTI4OkZSOkVVUkUgRVQgTE9JUgorMzY6RlItMjk6RlI6RklOSVNURVJFCiszNzpGUi1DTzpGUjpGUkFOQ0hFIENPTVRFCiszODpGUi0zMDpGUjpHQVJECiszOTpGUi0zMjpGUjpHRVJTCis0MDpGUi0zMzpGUjpHSVJPTkRFCis0MTpGUi02ODpGUjpIQVVUIFJISU4KKzQyOkZSLTJCOkZSOkhBVVRFIENPUlNFCis0MzpGUi00MzpGUjpIQVVURSBMT0lSRQorNDQ6RlItNTI6RlI6SEFVVEUgTUFSTkUKKzQ1OkZSLUhBOkZSOkhBVVRFIE5PUk1BTkRJRQorNDY6RlItNzA6RlI6SEFVVEUgU0FPTkUKKzQ3OkZSLTc0OkZSOkhBVVRFIFNBVk9JRQorNDg6RlItODc6RlI6SEFVVEUgVklFTk5FCis0OTpGUi0wNTpGUjpIQVVURVMgQUxQRVMKKzUwOkZSLTY1OkZSOkhBVVRFUyBQWVJFTkVFUworNTE6RlItOTI6RlI6SEFVVFMgREUgU0VJTkUKKzUyOkZSLTM0OkZSOkhFUkFVTFQKKzUzOkZSLUlGOkZSOklMRSBERSBGUkFOQ0UKKzU0OkZSLTM1OkZSOklMTEUgRVQgVklMQUlORQorNTU6RlItMzY6RlI6SU5EUkUKKzU2OkZSLTM3OkZSOklORFJFIEVUIExPSVJFCis1NzpGUi0zODpGUjpJU0VSRQorNTg6RlItMzk6RlI6SlVSQQorNTk6RlItNDA6RlI6TEFOREVTCis2MDpGUi1MQTpGUjpMQU5HVUVET0MgUk9VU1NJTExPTgorNjE6RlItTEk6RlI6TElNT1VTSU4KKzYyOkZSLTQyOkZSOkxPSVJFCis2MzpGUi00NDpGUjpMT0lSRSBBVExBTlRJUVVFCis2NDpGUi00NTpGUjpMT0lSRVQKKzY1OkZSLUxPOkZSOkxPUlJBSU5FCis2NjpGUi00NjpGUjpMT1QKKzY3OkZSLTQ3OkZSOkxPVCBFVCBHQVJPTk5FCis2ODpGUi00ODpGUjpMT1pFUkUKKzY5OkZSLTQ5OkZSOk1BSU5FIEVUIExPSVJFCis3MDpGUi01MDpGUjpNQU5DSEUKKzcxOkZSLTUzOkZSOk1BWUVOTkUKKzcyOkZSLVlUOkZSOk1BWU9UVEUgKFNFRSBBTFNPIFNFUEFSQVRFIEVOVFJZIFVOREVSIFlUKQorNzM6RlItNTQ6RlI6TUVVUlRIRSBFVCBNT1NFTExFCis3NDpGUi01NTpGUjpNRVVTRQorNzU6RlItTVA6RlI6TUlESSBQWVJFTkVFUworNzY6RlItNTY6RlI6TU9SQklIQU4KKzc3OkZSLTU3OkZSOk1PU0VMTEUKKzc4OkZSLTU4OkZSOk5JRVZSRQorNzk6RlItNTk6RlI6Tk9SRAorODA6RlItUEM6RlI6Tk9SRCAgIFBBUyBERSBDQUxBSVMKKzgxOkZSLU5DOkZSOk5PVVZFTExFIENBTEVET05JRSAoU0VFIEFMU08gU0VQQVJBVEUgRU5UUlkgVU5ERVIgTkMpCis4MjpGUi02MDpGUjpPSVNFCis4MzpGUi03NTpGUjpQQVJJUworODQ6RlItNjI6RlI6UEFTIERFIENBTEFJUworODU6RlItUEw6RlI6UEFZUyBERSBMQSBMT0lSRQorODY6RlItUEk6RlI6UElDQVJESUUKKzg3OkZSLVBPOkZSOlBPSVRPVSBDSEFSRU5URVMKKzg4OkZSLVBGOkZSOlBPTFlORVNJRSBGUkFOQ0FJU0UgKFNFRSBBTFNPIFNFUEFSQVRFIEVOVFJZIFVOREVSIFBGKQorODk6RlItUEE6RlI6UFJPVkVOQ0UgQUxQRVMgQ09URSBEJ0FaVVIKKzkwOkZSLTYzOkZSOlBVWSBERSBET01FCis5MTpGUi02NDpGUjpQWVJFTkVFUyBBVExBTlRJUVVFUworOTI6RlItNjY6RlI6UFlSRU5FRVMgT1JJRU5UQUxFUworOTM6RlItNjk6RlI6UkhPTkUKKzk0OkZSLVJIOkZSOlJIT05FIEFMUEVTCis5NTpGUi1QTTpGUjpTQUlOVCBQSUVSUkUgRVQgTUlRVUVMT04gKFNFRSBBTFNPIFNFUEFSQVRFIEVOVFJZIFVOREVSIFBNKQorOTY6RlItNzI6RlI6U0FSVEhFCis5NzpGUi03MzpGUjpTQVZPSUUKKzk4OkZSLTc3OkZSOlNFSU5FIEVUIE1BUk5FCis5OTpGUi03NjpGUjpTRUlORSBNQVJJVElNRQorMTAwOkZSLTkzOkZSOlNFSU5FIFNBSU5UIERFTklTCisxMDE6RlItODA6RlI6U09NTUUKKzEwMjpGUi04MjpGUjpUQVJOIEVUIEdBUk9OTkUKKzEwMzpGUi1URjpGUjpURVJSRVMgQVVTVFJBTEVTIEZSQU5DQUlTRVMgKFNFRSBBTFNPIFNFUEFSQVRFIEVOVFJZIFVOREVSIFRGKQorMTA0OkZSLTkwOkZSOlRFUlJJVE9JUkUgREUgQkVMRk9SVAorMTA1OkZSLTk0OkZSOlZBTCBERSBNQVJORQorMTA2OkZSLTk1OkZSOlZBTCBET0lTRQorMTA3OkZSLTgzOkZSOlZBUgorMTA4OkZSLTg0OkZSOlZBVUNMVVNFCisxMDk6RlItODU6RlI6VkVOREVFCisxMTA6RlItODY6RlI6VklFTk5FCisxMTE6RlItODg6RlI6Vk9TR0VTCisxMTI6RlItV0Y6RlI6V0FMTElTIEVUIEZVVFVOQSAoU0VFIEFMU08gU0VQQVJBVEUgRU5UUlkgVU5ERVIgV0YpCisxMTM6RlItODk6RlI6WU9OTkUKKzExNDpGUi03ODpGUjpZVkVMSU5FUwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9GUkEvRlJBX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9GUkEvRlJBX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0ZSQS9GUkFfQURNSU4yX0xFWC50eHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRlJPL0ZST19BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRlJPL0ZST19BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9GUk8vRlJPX0FETUlOMV9MRVgudHh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0ZSTy9GUk9fQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0ZSTy9GUk9fQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvRlJPL0ZST19BRE1JTjJfTEVYLnR4dApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9HQUIvR0FCX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9HQUIvR0FCX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkN2Q1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dBQi9HQUJfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSw5IEBACisxOkdBLTE6R0E6RVNUVUFJUkUKKzI6R0EtMjpHQTpIQVVUIE9HT09VRQorMzpHQS0zOkdBOk1PWUVOIE9HT09VRQorNDpHQS00OkdBOk5HT1VOSUUKKzU6R0EtNTpHQTpOWUFOR0EKKzY6R0EtNjpHQTpPR09PVUUgSVZJTkRPCis3OkdBLTc6R0E6T0dPT1VFIExPTE8KKzg6R0EtODpHQTpPR09PVUUgTUFSSVRJTUUKKzk6R0EtOTpHQTpXT1VMRVUgTlRFTQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9HQUIvR0FCX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9HQUIvR0FCX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMzk5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dBQi9HQUJfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSw0NiBAQAorMTpHQTpHQUI6R0FCT046V291bGV1LU50ZW06SGF1dC1Db21vIChNZWRvdW5ldSkKKzI6R0E6R0FCOkdBQk9OOldvdWxldS1OdGVtOkhhdXQtTnRlbSAoTWludm91bCkKKzM6R0E6R0FCOkdBQk9OOldvdWxldS1OdGVtOk50ZW0gKEJpdGFtKQorNDpHQTpHQUI6R0FCT046V291bGV1LU50ZW06T2thbm8gKE1pdHppaykKKzU6R0E6R0FCOkdBQk9OOldvdWxldS1OdGVtOldvbGV1IChPeWVtKQorMTpHQTpHQUI6R0FCT046RXN0dWFpcmU6S29tbyAoS2FuZ28pCisyOkdBOkdBQjpHQUJPTjpFc3R1YWlyZTpLb21vLU1vbmRhaCAoTnRvdW0pCiszOkdBOkdBQjpHQUJPTjpFc3R1YWlyZTpMaWJyZXZpbGxlCis0OkdBOkdBQjpHQUJPTjpFc3R1YWlyZTpOb3lhIChDb2NvYmVhY2gpCisxOkdBOkdBQjpHQUJPTjpIYXV0LU9nb291ZTpEam91ZSAoT25nYSkKKzI6R0E6R0FCOkdBQk9OOkhhdXQtT2dvb3VlOkRqb3VvcmktYWduaWxpIChCb25nb3ZpbGwKKzM6R0E6R0FCOkdBQk9OOkhhdXQtT2dvb3VlOkxla2FiaS1JZXdvbG8gKE5nb3VvbmkpCis0OkdBOkdBQjpHQUJPTjpIYXV0LU9nb291ZTpMZWtva28gKEJha291bWJhKQorNTpHQTpHQUI6R0FCT046SGF1dC1PZ29vdWU6TGVrb25pLUxla29yaSAoQWtpZW5pKQorNjpHQTpHQUI6R0FCT046SGF1dC1PZ29vdWU6TGVtYm9tYmktTGV5b3UgKE1vdWFuZGEpCis3OkdBOkdBQjpHQUJPTjpIYXV0LU9nb291ZTpNcGFzc2EgKEZyYW5jZXZpbGxlKQorODpHQTpHQUI6R0FCT046SGF1dC1PZ29vdWU6T2dvdW9lLUxldGlsaSAoQm91bWFuZ28pCis5OkdBOkdBQjpHQUJPTjpIYXV0LU9nb291ZTpQbGF0ZWF1eCAoTGVrb25pKQorMTA6R0E6R0FCOkdBQk9OOkhhdXQtT2dvb3VlOlNlYmUtYnJpa29sbyAoT2tvbmRqYSkKKzE6R0E6R0FCOkdBQk9OOk9nb291ZS1JdmluZG86SXZpbmRvIChNYWtva291KQorMjpHQTpHQUI6R0FCT046T2dvb3VlLUl2aW5kbzpMb3BlIChCb291ZSkKKzM6R0E6R0FCOkdBQk9OOk9nb291ZS1JdmluZG86TXZvdW5nIChPdmVuZykKKzQ6R0E6R0FCOkdBQk9OOk9nb291ZS1JdmluZG86WmFkaWUgKE1la2FtYm8pCisxOkdBOkdBQjpHQUJPTjpOZ291bmllOkJvdW1pLWxvd2V0c2kgKE1iaWdvdSkKKzI6R0E6R0FCOkdBQk9OOk5nb3VuaWU6RG9sYSAoTmRlbmRlKQorMzpHQTpHQUI6R0FCT046TmdvdW5pZTpEb3V5YSBPbm95ZSAoTW91aWxhKQorNDpHQTpHQUI6R0FCT046TmdvdW5pZTpMb3VldHNpLUJpYmFrYSAoTWFsaW5nYSkKKzU6R0E6R0FCOkdBQk9OOk5nb3VuaWU6TG91ZXRzaS1XYW5vIChMZWJhbWJhKQorNjpHQTpHQUI6R0FCT046TmdvdW5pZTpNb3VnYWxhYmEgKEd1aWV0c291KQorNzpHQTpHQUI6R0FCT046TmdvdW5pZTpOZG9sb3UgKE1hbmRqaSkKKzg6R0E6R0FCOkdBQk9OOk5nb3VuaWU6T2dvdWxvdSAoTWltb25nbykKKzk6R0E6R0FCOkdBQk9OOk5nb3VuaWU6VHNhbWJhIE1hbmdvdHNpIChGb3VnLikKKzE6R0E6R0FCOkdBQk9OOk55YW5nYTpCYXNzZSBCYW5pbyAoTWF5dW1iYSkKKzI6R0E6R0FCOkdBQk9OOk55YW5nYTpEb3VpZ255IChNb2FiaSkKKzM6R0E6R0FCOkdBQk9OOk55YW5nYTpEb3V0c2lsYSAoTWFiYW5kYSkKKzQ6R0E6R0FCOkdBQk9OOk55YW5nYTpIYXV0ZS1CYW5pbyAoTmRpbmRpKQorNTpHQTpHQUI6R0FCT046TnlhbmdhOk1vdWdvdXRzaSAoVGNoaWJhbmdhKQorMTpHQTpHQUI6R0FCT046T2dvb3VlLU1hcml0aW1lOkJlbmRqZSAoUG9ydCBHZW50aWwpCisyOkdBOkdBQjpHQUJPTjpPZ29vdWUtTWFyaXRpbWU6RXRpbmJvdWUgKE9tYm91ZSkKKzM6R0E6R0FCOkdBQk9OOk9nb291ZS1NYXJpdGltZTpOZG91Z291IChHYW1iYSkKKzE6R0E6R0FCOkdBQk9OOk9nb291ZS1Mb2xvOkxvbG8gQm91ZW5ndWlkaSAoS291bGEuKQorMjpHQTpHQUI6R0FCT046T2dvb3VlLUxvbG86TG9tYm8tQm91ZW5ndWlkaSAoUGFuYSkKKzM6R0E6R0FCOkdBQk9OOk9nb291ZS1Mb2xvOk1vdWxvdWRub3UgKExhdG91cnN2aWxsZSkKKzQ6R0E6R0FCOkdBQk9OOk9nb291ZS1Mb2xvOk9mZm91ZS1Pbm95ZSAoSWJvdW5kamkpCisxOkdBOkdBQjpHQUJPTjpNb3llbiBPZ29vdWU6QWJhbmdhLUJpZ25lIChOZGpvbGUpCisyOkdBOkdBQjpHQUJPTjpNb3llbiBPZ29vdWU6T2dvb3VlIGV0IGxhY3MgKExhbWJhci4pCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dCUi9HQlJfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dCUi9HQlJfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg2ZWE1NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR0JSL0dCUl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDI0OSBAQAorMTpHQi1BQkU6R0I6QUJFUkRFRU4gQ0lUWQorMjpHQi1BQkQ6R0I6QUJFUkRFRU5TSElSRQorMzpHQi1BTlM6R0I6QU5HVVMKKzQ6R0ItQU5UOkdCOkFOVFJJTQorNTpHQi1BUkQ6R0I6QVJEUworNjpHQi1BR0I6R0I6QVJHWUxMIEFORCBCVVRFCis3OkdCLUFSTTpHQjpBUk1BR0gKKzg6R0ItQVZPOkdCOkFWT04KKzk6R0ItQkxBOkdCOkJBTExZTUVOQQorMTA6R0ItQkxZOkdCOkJBTExZTU9ORVkKKzExOkdCLUJOQjpHQjpCQU5CUklER0UKKzEyOkdCLUJERzpHQjpCQVJLSU5HIEFORCBEQUdFTkhBTQorMTM6R0ItQk5FOkdCOkJBUk5FVAorMTQ6R0ItQk5TOkdCOkJBUk5TTEVZCisxNTpHQi1CQVM6R0I6QkFUSCBBTkQgTk9SVEggRUFTVCBTT01FUlNFVAorMTY6R0ItQkRGOkdCOkJFREZPUkRTSElSRQorMTc6R0ItQkZTOkdCOkJFTEZBU1QKKzE4OkdCLUJFUjpHQjpCRVJLUworMTk6R0ItQkVYOkdCOkJFWExFWQorMjA6R0ItQklSOkdCOkJJUk1JTkdIQU0KKzIxOkdCLUJCRDpHQjpCTEFDS0JVUk4gV0lUSCBEQVJXRU4KKzIyOkdCLUJQTDpHQjpCTEFDS1BPT0wKKzIzOkdCLUJHVzpHQjpCTEFFTkFVIEdXRU5UCisyNDpHQi1CT0w6R0I6Qk9MVE9OCisyNTpHQi1CQ0Y6R0I6Qk9SRCBDRU5UUiBGSUZFIExPVEhJQU4gVEFZCisyNjpHQi1CTUg6R0I6Qk9VUk5FTU9VVEgKKzI3OkdCLUJSQzpHQjpCUkFDS05FTEwgRk9SRVNUCisyODpHQi1CUkQ6R0I6QlJBREZPUkQKKzI5OkdCLUJFTjpHQjpCUkVOVAorMzA6R0ItQkdFOkdCOkJSSURHRU5EIFtQRU4gWSBCT05UIEFSIE9HV1IgR0IgUE9HXQorMzE6R0ItQk5IOkdCOkJSSUdIVE9OIEFORCBIT1ZFCiszMjpHQi1CU1Q6R0I6QlJJU1RPTCwgQ0lUWSBPRgorMzM6R0ItQlJZOkdCOkJST01MRVkKKzM0OkdCLUJLTTpHQjpCVUNLSU5HSEFNU0hJUkUKKzM1OkdCLUJVUjpHQjpCVVJZCiszNjpHQi1DQVk6R0I6Q0FFUlBISUxMWSBbQ0FFUkZGSUxJIEdCIENBRl0KKzM3OkdCLUNMRDpHQjpDQUxERVJEQUxFCiszODpHQi1DQU06R0I6Q0FNQlJJREdFU0hJUkUKKzM5OkdCLUNNRDpHQjpDQU1ERU4KKzQwOkdCLUNSRjpHQjpDQVJESUZGIFtDQUVSRFlERCBHQiBDUkRdCis0MTpHQi1DTU46R0I6Q0FSTUFSVEhFTlNISVJFIFtTSVIgR0FFUkZZUkRESU4gR0IgR0ZZXQorNDI6R0ItQ0tGOkdCOkNBUlJJQ0tGRVJHVVMKKzQzOkdCLUNTUjpHQjpDQVNUTEVSRUFHSAorNDQ6R0ItQ0dOOkdCOkNFUkVESUdJT04gW1NJUiBDRVJFRElHSU9OXQorNDU6R0ItQ0hTOkdCOkNIRVNISVJFCis0NjpHQi1DTEs6R0I6Q0xBQ0tNQU5OQU5TSElSRQorNDc6R0ItQ0xWOkdCOkNMRVZFTEFORAorNDg6R0ItQ0xXOkdCOkNMV1lECis0OTpHQi1DTFI6R0I6Q09MRVJBSU5FCis1MDpHQi1DV1k6R0I6Q09OV1kKKzUxOkdCLUNLVDpHQjpDT09LU1RPV04KKzUyOkdCLUNPTjpHQjpDT1JOV0FMTAorNTM6R0ItQ09WOkdCOkNPVkVOVFJZCis1NDpHQi1DR1Y6R0I6Q1JBSUdBVk9OCis1NTpHQi1DUlk6R0I6Q1JPWURPTgorNTY6R0ItQ01BOkdCOkNVTUJSSUEKKzU3OkdCLURBTDpHQjpEQVJMSU5HVE9OCis1ODpHQi1ERU46R0I6REVOQklHSFNISVJFIFtTSVIgRERJTkJZQ0ggR0IgRERCXQorNTk6R0ItREVSOkdCOkRFUkJZCis2MDpHQi1EQlk6R0I6REVSQllTSElSRQorNjE6R0ItRFJZOkdCOkRFUlJZCis2MjpHQi1ERVY6R0I6REVWT04KKzYzOkdCLUROQzpHQjpET05DQVNURVIKKzY0OkdCLURPUjpHQjpET1JTRVQKKzY1OkdCLURPVzpHQjpET1dOCis2NjpHQi1EVUQ6R0I6RFVETEVZCis2NzpHQi1ER1k6R0I6RFVNRlJJRVMgR0FMTE8KKzY4OkdCLURORDpHQjpEVU5ERUUgQ0lUWQorNjk6R0ItREdOOkdCOkRVTkdBTk5PTgorNzA6R0ItRFVSOkdCOkRVUkhBTQorNzE6R0ItRUFMOkdCOkVBTElORworNzI6R0ItRUFHOkdCOkVBU1QgQU5HTElBCis3MzpHQi1FQVk6R0I6RUFTVCBBWVJTSElSRQorNzQ6R0ItRURVOkdCOkVBU1QgRFVOQkFSVE9OU0hJUkUKKzc1OkdCLUVMTjpHQjpFQVNUIExPVEhJQU4KKzc2OkdCLUVSVzpHQjpFQVNUIFJFTkZSRVdTSElSRQorNzc6R0ItRVJZOkdCOkVBU1QgUklESU5HIE9GIFlPUktTSElSRQorNzg6R0ItRVNYOkdCOkVBU1QgU1VTU0VYCis3OTpHQi1FREg6R0I6RURJTkJVUkdILCBDSVRZIE9GCis4MDpHQi1FTFM6R0I6RUlMRUFOIFNJQVIKKzgxOkdCLUVORjpHQjpFTkZJRUxECis4MjpHQi1FU1M6R0I6RVNTRVgKKzgzOkdCLUZBTDpHQjpGQUxLSVJLCis4NDpHQi1GRVI6R0I6RkVSTUFOQUdICis4NTpHQi1GSUY6R0I6RklGRQorODY6R0ItRkxOOkdCOkZMSU5UU0hJUkUgW1NJUiBZIEZGTElOVCBHQiBGRkxdCis4NzpHQi1HQVQ6R0I6R0FURVNIRUFECis4ODpHQi1HTEc6R0I6R0xBU0dPVyBDSVRZCis4OTpHQi1HTFM6R0I6R0xPVUNFU1RFUlNISVJFCis5MDpHQi1HUkE6R0I6R1JBTVBJQU4KKzkxOkdCLUxORDpHQjpHUkVBVEVSIExPTkRPTgorOTI6R0ItTUFOOkdCOkdSRUFURVIgTUFOQ0hFU1RFUgorOTM6R0ItR1JFOkdCOkdSRUVOV0lDSAorOTQ6R0ItR1NZOkdCOkdVRVJOU0VZIFtHVUVSTkVTRVldCis5NTpHQi1HV1Q6R0I6R1dFTlQKKzk2OkdCLUdXTjpHQjpHV1lORURECis5NzpHQi1IQ0s6R0I6SEFDS05FWQorOTg6R0ItSEFMOkdCOkhBTFRPTgorOTk6R0ItSE1GOkdCOkhBTU1FUlNNSVRIIEFORCBGVUxIQU0KKzEwMDpHQi1IQU06R0I6SEFNUFNISVJFCisxMDE6R0ItSFJZOkdCOkhBUklOR0VZCisxMDI6R0ItSFJXOkdCOkhBUlJPVworMTAzOkdCLUhQTDpHQjpIQVJUTEVQT09MCisxMDQ6R0ItSEFWOkdCOkhBVkVSSU5HCisxMDU6R0ItSEVGOkdCOkhFUkVGT1JECisxMDY6R0ItSFJUOkdCOkhFUlRGT1JEU0hJUkUKKzEwNzpHQi1ITEQ6R0I6SElHSExBTkQKKzEwODpHQi1IR0w6R0I6SElHSExBTkRTCisxMDk6R0ItSElMOkdCOkhJTExJTkdET04KKzExMDpHQi1ITlM6R0I6SE9VTlNMT1cKKzExMTpHQi1IVU06R0I6SFVNQkVSU0lERQorMTEyOkdCLUlWQzpHQjpJTlZFUkNMWURFCisxMTM6R0ItQUdZOkdCOklTTEUgT0YgQU5HTEVTRVkgW1NJUiBZTllTIE1PTiBHQiBZTk1dCisxMTQ6R0ItSU9XOkdCOklTTEUgT0YgV0lHSFQKKzExNTpHQi1JT1M6R0I6SVNMRVMgT0YgU0NJTExZCisxMTY6R0ItSVNMOkdCOklTTElOR1RPTgorMTE3OkdCLUpTWTpHQjpKRVJTRVkKKzExODpHQi1LRUM6R0I6S0VOU0lOR1RPTiBBTkQgQ0hFTFNFQQorMTE5OkdCLUtFTjpHQjpLRU5UCisxMjA6R0ItS0hMOkdCOktJTkdTVE9OIFVQT04gSFVMTCwgQ0lUWSBPRgorMTIxOkdCLUtUVDpHQjpLSU5HU1RPTiBVUE9OIFRIQU1FUworMTIyOkdCLUtJUjpHQjpLSVJLTEVFUworMTIzOkdCLUtXTDpHQjpLTk9XU0xFWQorMTI0OkdCLUxCSDpHQjpMQU1CRVRICisxMjU6R0ItTEFOOkdCOkxBTkNBU0hJUkUKKzEyNjpHQi1MUk46R0I6TEFSTkUKKzEyNzpHQi1MRFM6R0I6TEVFRFMKKzEyODpHQi1MQ0U6R0I6TEVJQ0VTVEVSCisxMjk6R0ItTEVDOkdCOkxFSUNFU1RFUlNISVJFCisxMzA6R0ItTEVXOkdCOkxFV0lTSEFNCisxMzE6R0ItTE1WOkdCOkxJTUFWQURZCisxMzI6R0ItTElOOkdCOkxJTkNPTE5TSElSRQorMTMzOkdCLUxTQjpHQjpMSVNCVVJOCisxMzQ6R0ItTElWOkdCOkxJVkVSUE9PTAorMTM1OkdCLUxVVDpHQjpMVVRPTgorMTM2OkdCLU1GVDpHQjpNQUdIRVJBRkVMVAorMTM3OkdCLU1EVzpHQjpNRURXQVkKKzEzODpHQi1NRVI6R0I6TUVSU0VZU0lERQorMTM5OkdCLU1UWTpHQjpNRVJUSFlSIFRZREZJTCBbTUVSVEhZUiBUVURGVUwgR0IgTVRVXQorMTQwOkdCLU1SVDpHQjpNRVJUT04KKzE0MTpHQi1NREI6R0I6TUlERExFU0JST1VHSAorMTQyOkdCLU1MTjpHQjpNSURMT1RISUFOCisxNDM6R0ItTUlLOkdCOk1JTFRPTiBLRVlORVMKKzE0NDpHQi1NT046R0I6TU9OTU9VVEhTSElSRSBbU0lSIEZZTldZIEdCIEZZTl0KKzE0NTpHQi1NUlk6R0I6TU9SQVkKKzE0NjpHQi1NWUw6R0I6TU9ZTEUKKzE0NzpHQi1OVEw6R0I6TkVBVEggUE9SVCBUQUxCT1QgW0NBU1RFTEwgTkVERCBQT1JUIFRBTEJPVCBHQiBDVExdCisxNDg6R0ItTkVUOkdCOk5FV0NBU1RMRSBVUE9OIFRZTkUKKzE0OTpHQi1OV006R0I6TkVXSEFNCisxNTA6R0ItTldQOkdCOk5FV1BPUlQgW0NBU05FV1lERCBHQiBDTlddCisxNTE6R0ItTllNOkdCOk5FV1JZIEFORCBNT1VSTkUKKzE1MjpHQi1OVEE6R0I6TkVXVE9XTkFCQkVZCisxNTM6R0ItTkZLOkdCOk5PUkZPTEsKKzE1NDpHQi1OQVk6R0I6Tk9SVEggQVlSU0hJUkUKKzE1NTpHQi1ORE46R0I6Tk9SVEggRE9XTgorMTU2OkdCLU5FTDpHQjpOT1JUSCBFQVNUIExJTkNPTE5TSElSRQorMTU3OkdCLU5MSzpHQjpOT1JUSCBMQU5BUktTSElSRQorMTU4OkdCLU5MTjpHQjpOT1JUSCBMSU5DT0xOU0hJUkUKKzE1OTpHQi1OU006R0I6Tk9SVEggU09NRVJTRVQKKzE2MDpHQi1OVFk6R0I6Tk9SVEggVFlORVNJREUKKzE2MTpHQi1OWUs6R0I6Tk9SVEggWU9SS1NISVJFCisxNjI6R0ItTlRIOkdCOk5PUlRIQU1QVE9OU0hJUkUKKzE2MzpHQi1OSVI6R0I6Tk9SVEhFUk4gSVJFTEFORAorMTY0OkdCLU5CTDpHQjpOT1JUSFVNQkVSTEFORAorMTY1OkdCLU5HTTpHQjpOT1RUSU5HSEFNCisxNjY6R0ItTlRUOkdCOk5PVFRJTkdIQU1TSElSRQorMTY3OkdCLU9MRDpHQjpPTERIQU0KKzE2ODpHQi1PTUg6R0I6T01BR0gKKzE2OTpHQi1PUks6R0I6T1JLTkVZIElTTEFORFMKKzE3MDpHQi1PWEY6R0I6T1hGT1JEU0hJUkUKKzE3MTpHQi1QRU06R0I6UEVNQlJPS0VTSElSRSBbU0lSIEJFTkZSTyBHQiBCTkZdCisxNzI6R0ItUEtOOkdCOlBFUlRIIEFORCBLSU5ST1NTCisxNzM6R0ItUFRFOkdCOlBFVEVSQk9ST1VHSAorMTc0OkdCLVBMWTpHQjpQTFlNT1VUSAorMTc1OkdCLVBPTDpHQjpQT09MRQorMTc2OkdCLVBPUjpHQjpQT1JUU01PVVRICisxNzc6R0ItUE9XOkdCOlBPV1lTCisxNzg6R0ItUkRHOkdCOlJFQURJTkcKKzE3OTpHQi1SREI6R0I6UkVEQlJJREdFCisxODA6R0ItUkNDOkdCOlJFRENBUiBBTkQgQ0xFVkVMQU5ECisxODE6R0ItUkZXOkdCOlJFTkZSRVdTSElSRQorMTgyOkdCLVJDVDpHQjpSSE9ORERBLCBDWU5PTiwgVEFGRiBbUkhPTkREQSwgQ1lOT04sVEFGXQorMTgzOkdCLVJJQzpHQjpSSUNITU9ORCBVUE9OIFRIQU1FUworMTg0OkdCLVJDSDpHQjpST0NIREFMRQorMTg1OkdCLVJPVDpHQjpST1RIRVJIQU0KKzE4NjpHQi1SVVQ6R0I6UlVUTEFORAorMTg3OkdCLVNMRjpHQjpTQUxGT1JECisxODg6R0ItU0FXOkdCOlNBTkRXRUxMCisxODk6R0ItU0NCOkdCOlNDT1RUSVNIIEJPUkRFUlMsIFRIRQorMTkwOkdCLVNGVDpHQjpTRUZUT04KKzE5MTpHQi1TSEY6R0I6U0hFRkZJRUxECisxOTI6R0ItWkVUOkdCOlNIRVRMQU5EIElTTEFORFMKKzE5MzpHQi1TSFI6R0I6U0hST1BTSElSRQorMTk0OkdCLVNMRzpHQjpTTE9VR0gKKzE5NTpHQi1TT0w6R0I6U09MSUhVTEwKKzE5NjpHQi1TT006R0I6U09NRVJTRVQKKzE5NzpHQi1TQVk6R0I6U09VVEggQVlSU0hJUkUKKzE5ODpHQi1TR0M6R0I6U09VVEggR0xPVUNFU1RFUlNISVJFCisxOTk6R0ItU0xLOkdCOlNPVVRIIExBTkFSS1NISVJFCisyMDA6R0ItU1RZOkdCOlNPVVRIIFRZTkVTSURFCisyMDE6R0ItU1lPOkdCOlNPVVRIIFlPUktTSElSRQorMjAyOkdCLVNUSDpHQjpTT1VUSEFNUFRPTgorMjAzOkdCLVNPUzpHQjpTT1VUSEVORCBPTiBTRUEKKzIwNDpHQi1TV0s6R0I6U09VVEhXQVJLCisyMDU6R0ItU0hOOkdCOlNULiBIRUxFTlMKKzIwNjpHQi1TVFM6R0I6U1RBRkZPUkRTSElSRQorMjA3OkdCLVNURzpHQjpTVElSTElORworMjA4OkdCLVNLUDpHQjpTVE9DS1BPUlQKKzIwOTpHQi1TVFQ6R0I6U1RPQ0tUT04gT04gVEVFUworMjEwOkdCLVNURTpHQjpTVE9LRSBPTiBUUkVOVAorMjExOkdCLVNUQjpHQjpTVFJBQkFORQorMjEyOkdCLVNGSzpHQjpTVUZGT0xLCisyMTM6R0ItU05EOkdCOlNVTkRFUkxBTkQKKzIxNDpHQi1TUlk6R0I6U1VSUkVZCisyMTU6R0ItU1ROOkdCOlNVVFRPTgorMjE2OkdCLVNXQTpHQjpTV0FOU0VBIFtBQkVSVEFXRSBHQiBBVEFdCisyMTc6R0ItU1dEOkdCOlNXSU5ET04KKzIxODpHQi1UQU06R0I6VEFNRVNJREUKKzIxOTpHQi1URlc6R0I6VEVMRk9SRCBBTkQgV1JFS0lOCisyMjA6R0ItVEhSOkdCOlRIVVJST0NLCisyMjE6R0ItVE9COkdCOlRPUkJBWQorMjIyOkdCLVRPRjpHQjpUT1JGQUVOIFtUT1IgRkFFTl0KKzIyMzpHQi1UV0g6R0I6VE9XRVIgSEFNTEVUUworMjI0OkdCLVRSRjpHQjpUUkFGRk9SRAorMjI1OkdCLVVLOkdCOlVOSVRFRCBLSU5HRE9NCisyMjY6R0ItVkdMOkdCOlZBTEUgT0YgR0xBTU9SR0FOLCBUSEUgW0JSTyBNT1JHQU5OV0cgR0IgQk1HXQorMjI3OkdCLVdLRjpHQjpXQUtFRklFTEQKKzIyODpHQi1XTEw6R0I6V0FMU0FMTAorMjI5OkdCLVdGVDpHQjpXQUxUSEFNIEZPUkVTVAorMjMwOkdCLVdORDpHQjpXQU5EU1dPUlRICisyMzE6R0ItV1JUOkdCOldBUlJJTkdUT04KKzIzMjpHQi1XQVI6R0I6V0FSV0lDS1NISVJFCisyMzM6R0ItV0JLOkdCOldFU1QgQkVSS1NISVJFCisyMzQ6R0ItV0RVOkdCOldFU1QgRFVOQkFSVE9OU0hJUkUKKzIzNTpHQi1XTE46R0I6V0VTVCBMT1RISUFOCisyMzY6R0ItV01EOkdCOldFU1QgTUlETEFORFMKKzIzNzpHQi1XTUk6R0I6V0VTVCBNSURMQU5EUyAoQ09VTlRZKQorMjM4OkdCLVdTWDpHQjpXRVNUIFNVU1NFWAorMjM5OkdCLVdZTzpHQjpXRVNUIFlPUktTSElSRQorMjQwOkdCLVdTTTpHQjpXRVNUTUlOU1RFUgorMjQxOkdCLVdHTjpHQjpXSUdBTgorMjQyOkdCLVdJTDpHQjpXSUxUU0hJUkUKKzI0MzpHQi1XTk06R0I6V0lORFNPUiBBTkQgTUFJREVOSEVBRAorMjQ0OkdCLVdSTDpHQjpXSVJSQUwKKzI0NTpHQi1XT0s6R0I6V09LSU5HSEFNCisyNDY6R0ItV0xWOkdCOldPTFZFUkhBTVBUT04KKzI0NzpHQi1XT1I6R0I6V09SQ0VTVEVSU0hJUkUKKzI0ODpHQi1XUlg6R0I6V1JFWEhBTSBbV1JFQ1NBTSBHQiBXUkNdCisyNDk6R0ItWU9SOkdCOllPUksKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR0JSL0dCUl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR0JSL0dCUl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9HQlIvR0JSX0FETUlOMl9MRVgudHh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dIQS9HSEFfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dIQS9HSEFfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M2NGJmMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR0hBL0dIQV9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDEwIEBACisxOkdILUFIOkdIOkFTSEFOVEkKKzI6R0gtQkE6R0g6QlJPTkcgQUhBRk8KKzM6R0gtQ1A6R0g6Q0VOVFJBTCBbQ0VOVFJBTDFdCis0OkdILUVQOkdIOkVBU1RFUk4gW0VBU1RFUk4zXQorNTpHSC1BQTpHSDpHUkVBVEVSIEFDQ1JBCis2OkdILU5QOkdIOk5PUlRIRVJOCis3OkdILVVFOkdIOlVQUEVSIEVBU1QKKzg6R0gtVVc6R0g6VVBQRVIgV0VTVAorOTpHSC1UVjpHSDpWT0xUQQorMTA6R0gtV1A6R0g6V0VTVEVSTjIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR0hBL0dIQV9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR0hBL0dIQV9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTYyODY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9HSEEvR0hBX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMTQxIEBACisxOkdIOkdIQTpHSEFOQTpHcmVhdGVyIEFjY3JhOkFjY3JhLVRlbWEKKzI6R0g6R0hBOkdIQU5BOkdyZWF0ZXIgQWNjcmE6QWRhCiszOkdIOkdIQTpHSEFOQTpHcmVhdGVyIEFjY3JhOkRhbmdiZQorNDpHSDpHSEE6R0hBTkE6R3JlYXRlciBBY2NyYTpHYQorNTpHSDpHSEE6R0hBTkE6R3JlYXRlciBBY2NyYTpTaGFpCis2OkdIOkdIQTpHSEFOQTpHcmVhdGVyIEFjY3JhOlRlbWEgKEFjY3JhKQorMTpHSDpHSEE6R0hBTkE6Q2VudHJhbDpBYnVyYQorMjpHSDpHSEE6R0hBTkE6Q2VudHJhbDpBZ29uYW1hbgorMzpHSDpHSEE6R0hBTkE6Q2VudHJhbDpBanVtYWtvCis0OkdIOkdIQTpHSEFOQTpDZW50cmFsOkFueWFuLUJyZW1hbgorNTpHSDpHSEE6R0hBTkE6Q2VudHJhbDpBc2VidQorNjpHSDpHSEE6R0hBTkE6Q2VudHJhbDpBc3NpbgorNzpHSDpHSEE6R0hBTkE6Q2VudHJhbDpBd3V0dS1TZW55YQorODpHSDpHSEE6R0hBTkE6Q2VudHJhbDpDYXBlIENvYXN0Cis5OkdIOkdIQTpHSEFOQTpDZW50cmFsOkRlbmt5aXJhCisxMDpHSDpHSEE6R0hBTkE6Q2VudHJhbDpFa3VtZmkKKzExOkdIOkdIQTpHSEFOQTpDZW50cmFsOkdvbW9hLUFreWVtcGltCisxMjpHSDpHSEE6R0hBTkE6Q2VudHJhbDpHb21vYS1Bc3Npbi1BanVtYWtvCisxMzpHSDpHSEE6R0hBTkE6Q2VudHJhbDpLb21lbmRhLUVkaW5hLUFndWFmby1BYnJlCisxNDpHSDpHSEE6R0hBTkE6Q2VudHJhbDpNZmFudHNpbWFuCisxNTpHSDpHSEE6R0hBTkE6Q2VudHJhbDpOeWFha3JvbS1Oa3VtCisxNjpHSDpHSEE6R0hBTkE6Q2VudHJhbDpTd2VkcnUKKzE3OkdIOkdIQTpHSEFOQTpDZW50cmFsOlR3aWZvIERlbmt5aXJhIEhlbWFuCisxODpHSDpHSEE6R0hBTkE6Q2VudHJhbDpXaW5uZWJhCisxOkdIOkdIQTpHSEFOQTpVcHBlciBFYXN0OkJhd2t1CisyOkdIOkdIQTpHSEFOQTpVcHBlciBFYXN0OkJvbGdhdGFuZ2EtVG9uZ28KKzM6R0g6R0hBOkdIQU5BOlVwcGVyIEVhc3Q6Qm9uZ28tTmFiZGFtCis0OkdIOkdIQTpHSEFOQTpVcHBlciBFYXN0OkNoaWFuYS1QYWdhCis1OkdIOkdIQTpHSEFOQTpVcHBlciBFYXN0Okt1c2FuYWJhLVplYmlsbGEKKzY6R0g6R0hBOkdIQU5BOlVwcGVyIEVhc3Q6TmF2cm9uZ28KKzc6R0g6R0hBOkdIQU5BOlVwcGVyIEVhc3Q6UHVzaWdhLVB1bGltYWt1bQorODpHSDpHSEE6R0hBTkE6VXBwZXIgRWFzdDpTYW5kZW1lbgorOTpHSDpHSEE6R0hBTkE6VXBwZXIgRWFzdDpUZW1wYW5lLUdhcnUKKzE6R0g6R0hBOkdIQU5BOlVwcGVyIFdlc3Q6TGFtYnVzc2llLU5hbmRvbQorMjpHSDpHSEE6R0hBTkE6VXBwZXIgV2VzdDpMYXdyYSBKaXJhcGEKKzM6R0g6R0hBOkdIQU5BOlVwcGVyIFdlc3Q6TmFkYXdsaS1GdW5zaQorNDpHSDpHSEE6R0hBTkE6VXBwZXIgV2VzdDpUdW11Cis1OkdIOkdIQTpHSEFOQTpVcHBlciBXZXN0OldhCisxOkdIOkdIQTpHSEFOQTpXZXN0ZXJuOkFoYW50YQorMjpHSDpHSEE6R0hBTkE6V2VzdGVybjpBbWVuZmkKKzM6R0g6R0hBOkdIQU5BOldlc3Rlcm46QW93aW4KKzQ6R0g6R0hBOkdIQU5BOldlc3Rlcm46QXhpbQorNTpHSDpHSEE6R0hBTkE6V2VzdGVybjpEb21waW0KKzY6R0g6R0hBOkdIQU5BOldlc3Rlcm46Sm9tb3JvCis3OkdIOkdIQTpHSEFOQTpXZXN0ZXJuOkp1YWJlc28tQmlhCis4OkdIOkdIQTpHSEFOQTpXZXN0ZXJuOlByZXN0ZWEKKzk6R0g6R0hBOkdIQU5BOldlc3Rlcm46U2Vmd2ktQmliaWFuaSBCZWt3YWkKKzEwOkdIOkdIQTpHSEFOQTpXZXN0ZXJuOlNla29uZGktVGFrb3JhZGkKKzExOkdIOkdIQTpHSEFOQTpXZXN0ZXJuOlNoYW1hCisxMjpHSDpHSEE6R0hBTkE6V2VzdGVybjpUYXJrd2EtQWJvc28KKzEzOkdIOkdIQTpHSEFOQTpXZXN0ZXJuOldpYXdzbworMTpHSDpHSEE6R0hBTkE6Tm9ydGhlcm46QmltYmlsbGEKKzI6R0g6R0hBOkdIQU5BOk5vcnRoZXJuOkJvbGUKKzM6R0g6R0hBOkdIQU5BOk5vcnRoZXJuOkRhbWFuZ28KKzQ6R0g6R0hBOkdIQU5BOk5vcnRoZXJuOkd1c2hpZWd1LUNoZXJlcG9uaQorNTpHSDpHSEE6R0hBTkE6Tm9ydGhlcm46TmFsZXJpZ3UKKzY6R0g6R0hBOkdIQU5BOk5vcnRoZXJuOlNhYm9iYS1aYWJ6dWd1Cis3OkdIOkdIQTpHSEFOQTpOb3J0aGVybjpTYWxhZ2EKKzg6R0g6R0hBOkdIQU5BOk5vcnRoZXJuOlNhdmVsdWd1Cis5OkdIOkdIQTpHSEFOQTpOb3J0aGVybjpUYW1hbGUKKzEwOkdIOkdIQTpHSEFOQTpOb3J0aGVybjpUb2xvbgorMTE6R0g6R0hBOkdIQU5BOk5vcnRoZXJuOldhbGV3YWxlCisxMjpHSDpHSEE6R0hBTkE6Tm9ydGhlcm46WWVuZGkKKzE6R0g6R0hBOkdIQU5BOlZvbHRhOkFkYWtsdS1BbnlpZ2JlCisyOkdIOkdIQTpHSEFOQTpWb2x0YTpBa2FuIEJvd2lyZQorMzpHSDpHSEE6R0hBTkE6Vm9sdGE6QWthbiBXYXdhCis0OkdIOkdIQTpHSEFOQTpWb2x0YTpBbmxvCis1OkdIOkdIQTpHSEFOQTpWb2x0YTpBdmVub3IKKzY6R0g6R0hBOkdIQU5BOlZvbHRhOkJpYWtveWUKKzc6R0g6R0hBOkdIQU5BOlZvbHRhOkJ1ZW0KKzg6R0g6R0hBOkdIQU5BOlZvbHRhOkRheWkKKzk6R0g6R0hBOkdIQU5BOlZvbHRhOkR1dGFzb3IKKzEwOkdIOkdIQTpHSEFOQTpWb2x0YTpEem96ZQorMTE6R0g6R0hBOkdIQU5BOlZvbHRhOkdiaQorMTI6R0g6R0hBOkdIQU5BOlZvbHRhOkhvCisxMzpHSDpHSEE6R0hBTkE6Vm9sdGE6S2V0YQorMTQ6R0g6R0hBOkdIQU5BOlZvbHRhOktldGUtS3JhY2hpCisxNTpHSDpHSEE6R0hBTkE6Vm9sdGE6S3BhbmR1CisxNjpHSDpHSEE6R0hBTkE6Vm9sdGE6U29tZS1BZmxhbworMTc6R0g6R0hBOkdIQU5BOlZvbHRhOlRvbmd1CisxODpHSDpHSEE6R0hBTkE6Vm9sdGE6WWluZ29yCisxOkdIOkdIQTpHSEFOQTpBc2hhbnRpOkFkYWFneWEKKzI6R0g6R0hBOkdIQU5BOkFzaGFudGk6QWRhbnNpCiszOkdIOkdIQTpHSEFOQTpBc2hhbnRpOkFnb25hIEFzaGFudGkKKzQ6R0g6R0hBOkdIQU5BOkFzaGFudGk6QWhhZm8tQW5vCis1OkdIOkdIQTpHSEFOQTpBc2hhbnRpOkFrcm9rZXJyaSBEb21wb2FzZQorNjpHSDpHSEE6R0hBTkE6QXNoYW50aTpBbWFuYW1vCis3OkdIOkdIQTpHSEFOQTpBc2hhbnRpOkFtYW5zaWUKKzg6R0g6R0hBOkdIQU5BOkFzaGFudGk6QXNoYW50aS1Ba2luCis5OkdIOkdIQTpHSEFOQTpBc2hhbnRpOkF0d2ltYS1Ld2Fud29tYQorMTA6R0g6R0hBOkdIQU5BOkFzaGFudGk6QXR3aW1hLU53YWJpYWd5YQorMTE6R0g6R0hBOkdIQU5BOkFzaGFudGk6QmVrd2FpCisxMjpHSDpHSEE6R0hBTkE6QXNoYW50aTpFamlzdQorMTM6R0g6R0hBOkdIQU5BOkFzaGFudGk6RWp1cmEtU2Vrb2R1bWFzaQorMTQ6R0g6R0hBOkdIQU5BOkFzaGFudGk6SnVhYmVuCisxNTpHSDpHSEE6R0hBTkE6QXNoYW50aTpKdWFzby1CYW5rYW1hbgorMTY6R0g6R0hBOkdIQU5BOkFzaGFudGk6S29ub25nby1PZHVtYXNpCisxNzpHSDpHSEE6R0hBTkE6QXNoYW50aTpLdW1hc2kKKzE4OkdIOkdIQTpHSEFOQTpBc2hhbnRpOkt3YWJyZQorMTk6R0g6R0hBOkdIQU5BOkFzaGFudGk6TGFrZS1Cb3NvbXR3aQorMjA6R0g6R0hBOkdIQU5BOkFzaGFudGk6TWFtcG9uZworMjE6R0g6R0hBOkdIQU5BOkFzaGFudGk6TWFuc28KKzIyOkdIOkdIQTpHSEFOQTpBc2hhbnRpOk1wb251YQorMjM6R0g6R0hBOkdIQU5BOkFzaGFudGk6TnN1dGEtS3dhbWFuZy1CZXBvc28KKzI0OkdIOkdIQTpHSEFOQTpBc2hhbnRpOk9idWFzaQorMjU6R0g6R0hBOkdIQU5BOkFzaGFudGk6T2RvdG9icmkKKzI2OkdIOkdIQTpHSEFOQTpBc2hhbnRpOk9mZmluc28KKzI3OkdIOkdIQTpHSEFOQTpBc2hhbnRpOlNla3llcmUKKzI4OkdIOkdIQTpHSEFOQTpBc2hhbnRpOlRlcGEKKzE6R0g6R0hBOkdIQU5BOkVhc3Rlcm46QWJlZml0aQorMjpHSDpHSEE6R0hBTkE6RWFzdGVybjpBYmlyZW0KKzM6R0g6R0hBOkdIQU5BOkVhc3Rlcm46QWJ1YWt3YQorNDpHSDpHSEE6R0hBTkE6RWFzdGVybjpBZnJhbQorNTpHSDpHSEE6R0hBTkE6RWFzdGVybjpBa3JvcG9uZworNjpHSDpHSEE6R0hBTkE6RWFzdGVybjpBa3dhbXUtQW51bS1Cb3NvCis3OkdIOkdIQTpHSEFOQTpFYXN0ZXJuOkFzYW1hbmtlc2UKKzg6R0g6R0hBOkdIQU5BOkVhc3Rlcm46QmVnb3JvCis5OkdIOkdIQTpHSEFOQTpFYXN0ZXJuOkJpcmltLUFuYWZvCisxMDpHSDpHSEE6R0hBTkE6RWFzdGVybjpLYWRlLUFrd2F0aWEKKzExOkdIOkdIQTpHSEFOQTpFYXN0ZXJuOktvZm9yaWR1YQorMTI6R0g6R0hBOkdIQU5BOkVhc3Rlcm46S3dhYmVuCisxMzpHSDpHSEE6R0hBTkE6RWFzdGVybjpNYW55YSBLcm9ibworMTQ6R0g6R0hBOkdIQU5BOkVhc3Rlcm46Tmthd2thdworMTU6R0g6R0hBOkdIQU5BOkVhc3Rlcm46TnNhd2FtLUFidXJpCisxNjpHSDpHSEE6R0hBTkE6RWFzdGVybjpPZGEKKzE3OkdIOkdIQTpHSEFOQTpFYXN0ZXJuOlN1aHVtCisxODpHSDpHSEE6R0hBTkE6RWFzdGVybjpZaWxvLUtyb2JvLU9zdWRva3UKKzE6R0g6R0hBOkdIQU5BOkJyb25nIEFoYWZvOkFzdXRpZmkKKzI6R0g6R0hBOkdIQU5BOkJyb25nIEFoYWZvOkF0ZWJ1YnUKKzM6R0g6R0hBOkdIQU5BOkJyb25nIEFoYWZvOkJlY2hlbQorNDpHSDpHSEE6R0hBTkE6QnJvbmcgQWhhZm86QmVyZWt1bQorNTpHSDpHSEE6R0hBTkE6QnJvbmcgQWhhZm86RG9ybWFhCis2OkdIOkdIQTpHSEFOQTpCcm9uZyBBaGFmbzpEdWF5YXctTmt3YW50YQorNzpHSDpHSEE6R0hBTkE6QnJvbmcgQWhhZm86R29hc28KKzg6R0g6R0hBOkdIQU5BOkJyb25nIEFoYWZvOkphbWFuCis5OkdIOkdIQTpHSEFOQTpCcm9uZyBBaGFmbzpLdWt1b20KKzEwOkdIOkdIQTpHSEFOQTpCcm9uZyBBaGFmbzpLd2FtZSBEYW5zbworMTE6R0g6R0hBOkdIQU5BOkJyb25nIEFoYWZvOk5rb3JhbnphCisxMjpHSDpHSEE6R0hBTkE6QnJvbmcgQWhhZm86U3VueWFuaQorMTM6R0g6R0hBOkdIQU5BOkJyb25nIEFoYWZvOlRlY2hpbWFuCisxNDpHSDpHSEE6R0hBTkE6QnJvbmcgQWhhZm86V2VuY2hpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dJTi9HSU5fQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dJTi9HSU5fQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwNDE0MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR0lOL0dJTl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDMzIEBACisxOkdOLUJFOkdOOkJFWUxBCisyOkdOLUJGOkdOOkJPRkZBCiszOkdOLUJLOkdOOkJPS0UKKzQ6R04tQ086R046Q09ZQUgKKzU6R04tREI6R046REFCT0xBCis2OkdOLURMOkdOOkRBTEFCQQorNzpHTi1ESTpHTjpESU5HVUlSQVlFCis4OkdOLURVOkdOOkRVQlJFS0EKKzk6R04tRkE6R046RkFSQU5BSAorMTA6R04tRk86R046Rk9SRUNBUklBSAorMTE6R04tRlI6R046RlJJQQorMTI6R04tR0E6R046R0FPVUFMCisxMzpHTi1HVTpHTjpHVUVLRURPVQorMTQ6R04tS0E6R046S0FOS0FOCisxNTpHTi1LRTpHTjpLRVJPVUFORQorMTY6R04tS0Q6R046S0lORElBCisxNzpHTi1LUzpHTjpLSVNTSURPVUdPVQorMTg6R04tS0I6R046S09VQklBCisxOTpHTi1LTjpHTjpLT1VOREFSQQorMjA6R04tS086R046S09VUk9VU1NBCisyMTpHTi1MQTpHTjpMQUJFCisyMjpHTi1MRTpHTjpMRUxPVU1BCisyMzpHTi1MTzpHTjpMT0xBCisyNDpHTi1NQzpHTjpNQUNFTlRBCisyNTpHTi1NTDpHTjpNQUxJCisyNjpHTi1NTTpHTjpNQU1PVQorMjc6R04tTUQ6R046TUFORElBTkEKKzI4OkdOLU5aOkdOOk5aRVJFS09SRQorMjk6R04tUEk6R046UElUQQorMzA6R04tU0k6R046U0lHVUlSSQorMzE6R04tVEU6R046VEVMSU1FTEUKKzMyOkdOLVRPOkdOOlRPVUdVRQorMzM6R04tWU86R046WU9NT1UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR0lOL0dJTl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR0lOL0dJTl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmIyNDkwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9HSU4vR0lOX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMzMgQEAKKzE6R046R0lOOkdVSU5FQTpLaW5kaWE6Qm9mZmEKKzI6R046R0lOOkdVSU5FQTpLaW5kaWE6Qm9rZQorMzpHTjpHSU46R1VJTkVBOktpbmRpYTpDb3lhaAorNDpHTjpHSU46R1VJTkVBOktpbmRpYTpEdWJyZWthCis1OkdOOkdJTjpHVUlORUE6S2luZGlhOkZvcmVjYXJpYWgKKzY6R046R0lOOkdVSU5FQTpLaW5kaWE6RnJpYQorNzpHTjpHSU46R1VJTkVBOktpbmRpYTpLaW5kaWEKKzg6R046R0lOOkdVSU5FQTpLaW5kaWE6VGVsaW1lbGUKKzE6R046R0lOOkdVSU5FQTpMYWJlOkRhbGFiYQorMjpHTjpHSU46R1VJTkVBOkxhYmU6R2FvdWFsCiszOkdOOkdJTjpHVUlORUE6TGFiZTpLb3ViaWEKKzQ6R046R0lOOkdVSU5FQTpMYWJlOktvdW5kYXJhCis1OkdOOkdJTjpHVUlORUE6TGFiZTpMYWJlCis2OkdOOkdJTjpHVUlORUE6TGFiZTpMZWxvdW1hCis3OkdOOkdJTjpHVUlORUE6TGFiZTpNYWxpCis4OkdOOkdJTjpHVUlORUE6TGFiZTpNYW1vdQorOTpHTjpHSU46R1VJTkVBOkxhYmU6UGl0YQorMTA6R046R0lOOkdVSU5FQTpMYWJlOlRvdWdlCisxOkdOOkdJTjpHVUlORUE6TnplcmVrb3JlOkJleWxhCisyOkdOOkdJTjpHVUlORUE6TnplcmVrb3JlOkd1ZWNrZWRvdQorMzpHTjpHSU46R1VJTkVBOk56ZXJla29yZTpLaXNzaWRvdWdvdQorNDpHTjpHSU46R1VJTkVBOk56ZXJla29yZTpMb2xhCis1OkdOOkdJTjpHVUlORUE6TnplcmVrb3JlOk1hY2VudGEKKzY6R046R0lOOkdVSU5FQTpOemVyZWtvcmU6TnplcmVrb3JlCis3OkdOOkdJTjpHVUlORUE6TnplcmVrb3JlOllvbW91CisxOkdOOkdJTjpHVUlORUE6S2Fua2FuOkRhYm9sYQorMjpHTjpHSU46R1VJTkVBOkthbmthbjpEaW5ndWlyYXllCiszOkdOOkdJTjpHVUlORUE6S2Fua2FuOkZhcmFuYWgKKzQ6R046R0lOOkdVSU5FQTpLYW5rYW46S2Fua2FuCis1OkdOOkdJTjpHVUlORUE6S2Fua2FuOktlcm91YW5lCis2OkdOOkdJTjpHVUlORUE6S2Fua2FuOktvdXJvdXNzYQorNzpHTjpHSU46R1VJTkVBOkthbmthbjpNYW5kaWFuYQorODpHTjpHSU46R1VJTkVBOkthbmthbjpTaWd1aXJpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dNQi9HTUJfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dNQi9HTUJfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4NmZkMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR01CL0dNQl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDYgQEAKKzE6R00tQjpHTTpCQU5KVUwKKzI6R00tTDpHTTpMT1dFUiBSSVZFUgorMzpHTS1NOkdNOk1BQ0NBUlRIWSBJU0xBTkQKKzQ6R00tTjpHTTpOT1JUSCBCQU5LCis1OkdNLVU6R006VVBQRVIgUklWRVIKKzY6R00tVzpHTTpXRVNURVJOIFtXRVNURVJOMV0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR01CL0dNQl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR01CL0dNQl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2I0ZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9HTUIvR01CX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMzcgQEAKKzE6R006R01COkdBTUJJQSBUSEU6QmFuanVsOkJhbmp1bAorMjpHTTpHTUI6R0FNQklBIFRIRTpCYW5qdWw6S1VEQworMTpHTTpHTUI6R0FNQklBIFRIRTpOb3J0aCBCYW5rOkNlbnRyYWwgQmFkZGlidQorMjpHTTpHTUI6R0FNQklBIFRIRTpOb3J0aCBCYW5rOkpva2FkdQorMzpHTTpHTUI6R0FNQklBIFRIRTpOb3J0aCBCYW5rOkxvd2VyIEJhZGRpYnUKKzQ6R006R01COkdBTUJJQSBUSEU6Tm9ydGggQmFuazpMb3dlciBOaXVtaQorNTpHTTpHTUI6R0FNQklBIFRIRTpOb3J0aCBCYW5rOlVwcGVyIEJhZGRpYnUKKzY6R006R01COkdBTUJJQSBUSEU6Tm9ydGggQmFuazpVcHBlciBOaXVtaQorMTpHTTpHTUI6R0FNQklBIFRIRTpXZXN0ZXJuOkZvbmkgQmludGFuZy1LYXJlbmFpCisyOkdNOkdNQjpHQU1CSUEgVEhFOldlc3Rlcm46Rm9uaSBCb25kYWxpCiszOkdNOkdNQjpHQU1CSUEgVEhFOldlc3Rlcm46Rm9uaSBCcmVmZXQKKzQ6R006R01COkdBTUJJQSBUSEU6V2VzdGVybjpGb25pIEphcnJvbAorNTpHTTpHTUI6R0FNQklBIFRIRTpXZXN0ZXJuOkZvbmkgS2Fuc2FsYQorNjpHTTpHTUI6R0FNQklBIFRIRTpXZXN0ZXJuOktvbWJvIENlbnRyYWwKKzc6R006R01COkdBTUJJQSBUSEU6V2VzdGVybjpLb21ibyBFYXN0Cis4OkdNOkdNQjpHQU1CSUEgVEhFOldlc3Rlcm46S29tYm8gTm9ydGgvU3QgTWFyeQorOTpHTTpHTUI6R0FNQklBIFRIRTpXZXN0ZXJuOktvbWJvIFNvdXRoCisxOkdNOkdNQjpHQU1CSUEgVEhFOlVwcGVyIFJpdmVyOkZ1bGxhZHUgRWFzdAorMjpHTTpHTUI6R0FNQklBIFRIRTpVcHBlciBSaXZlcjpLYW50b3JhCiszOkdNOkdNQjpHQU1CSUEgVEhFOlVwcGVyIFJpdmVyOlNhbmR1Cis0OkdNOkdNQjpHQU1CSUEgVEhFOlVwcGVyIFJpdmVyOld1bGkKKzE6R006R01COkdBTUJJQSBUSEU6TG93ZXIgUml2ZXI6SmFycmEgQ2VudHJhbAorMjpHTTpHTUI6R0FNQklBIFRIRTpMb3dlciBSaXZlcjpKYXJyYSBFYXN0CiszOkdNOkdNQjpHQU1CSUEgVEhFOkxvd2VyIFJpdmVyOkphcnJhIFdlc3QKKzQ6R006R01COkdBTUJJQSBUSEU6TG93ZXIgUml2ZXI6S2lhbmcgQ2VudHJhbAorNTpHTTpHTUI6R0FNQklBIFRIRTpMb3dlciBSaXZlcjpLaWFuZyBFYXN0Cis2OkdNOkdNQjpHQU1CSUEgVEhFOkxvd2VyIFJpdmVyOktpYW5nIFdlc3QKKzE6R006R01COkdBTUJJQSBUSEU6TWFjY2FydGh5IElzbGFuZDpGdWxsYWR1IFdlc3QKKzI6R006R01COkdBTUJJQSBUSEU6TWFjY2FydGh5IElzbGFuZDpMb3dlciBTYWxvdW0KKzM6R006R01COkdBTUJJQSBUSEU6TWFjY2FydGh5IElzbGFuZDpNYWNjYXJ0aHkgSXNsYW5kCis0OkdNOkdNQjpHQU1CSUEgVEhFOk1hY2NhcnRoeSBJc2xhbmQ6TmlhbWluYSBEYW5rdW5rdQorNTpHTTpHTUI6R0FNQklBIFRIRTpNYWNjYXJ0aHkgSXNsYW5kOk5pYW1pbmEgRWFzdAorNjpHTTpHTUI6R0FNQklBIFRIRTpNYWNjYXJ0aHkgSXNsYW5kOk5pYW1pbmEgV2VzdAorNzpHTTpHTUI6R0FNQklBIFRIRTpNYWNjYXJ0aHkgSXNsYW5kOk5pYW5pCis4OkdNOkdNQjpHQU1CSUEgVEhFOk1hY2NhcnRoeSBJc2xhbmQ6TmlhbmlqYQorOTpHTTpHTUI6R0FNQklBIFRIRTpNYWNjYXJ0aHkgSXNsYW5kOlNhbWkKKzEwOkdNOkdNQjpHQU1CSUEgVEhFOk1hY2NhcnRoeSBJc2xhbmQ6VXBwZXIgU2Fsb3VtCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dOQi9HTkJfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dOQi9HTkJfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0MTVlOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR05CL0dOQl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDkgQEAKKzE6R1ctQkE6R1c6QkFGQVRBCisyOkdXLUJNOkdXOkJJT01CTworMzpHVy1CUzpHVzpCSVNTQVUKKzQ6R1ctQkw6R1c6Qk9MQU1BCis1OkdXLUNBOkdXOkNBQ0hFVQorNjpHVy1HQTpHVzpHQUJVCis3OkdXLU9JOkdXOk9JTworODpHVy1RVTpHVzpRVUlOQVJBCis5OkdXLVRPOkdXOlRPTUJBTEkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR05CL0dOQl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR05CL0dOQl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjNjYzIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9HTkIvR05CX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMzcgQEAKKzE6R1c6R05COkdVSU5FQSBCSVNTQVU6Qm9sYW1hOkJvbGFtYQorMjpHVzpHTkI6R1VJTkVBIEJJU1NBVTpCb2xhbWE6QnViYXF1ZQorMzpHVzpHTkI6R1VJTkVBIEJJU1NBVTpCb2xhbWE6Q2FyYXZlbGEgKFVubykKKzE6R1c6R05COkdVSU5FQSBCSVNTQVU6QmlvbWJvOlByYWJpcworMjpHVzpHTkI6R1VJTkVBIEJJU1NBVTpCaW9tYm86UXVpbmhhbWVsCiszOkdXOkdOQjpHVUlORUEgQklTU0FVOkJpb21ibzpTYWZpbQorMTpHVzpHTkI6R1VJTkVBIEJJU1NBVTpCYWZhdGE6QmFmYXRhCisyOkdXOkdOQjpHVUlORUEgQklTU0FVOkJhZmF0YTpCYW1iYWRpbmNhCiszOkdXOkdOQjpHVUlORUEgQklTU0FVOkJhZmF0YTpDb250dWJvZWwKKzQ6R1c6R05COkdVSU5FQSBCSVNTQVU6QmFmYXRhOkdhbG9tYXJvCis1OkdXOkdOQjpHVUlORUEgQklTU0FVOkJhZmF0YTpHYW1hbXVuZG8KKzY6R1c6R05COkdVSU5FQSBCSVNTQVU6QmFmYXRhOlhpdG9sZQorMTpHVzpHTkI6R1VJTkVBIEJJU1NBVTpUb21iYWxpOkJlZGFuZGEKKzI6R1c6R05COkdVSU5FQSBCSVNTQVU6VG9tYmFsaTpDYWNpbmUKKzM6R1c6R05COkdVSU5FQSBCSVNTQVU6VG9tYmFsaTpDYXRpbworNDpHVzpHTkI6R1VJTkVBIEJJU1NBVTpUb21iYWxpOlF1ZWJvCisxOkdXOkdOQjpHVUlORUEgQklTU0FVOlF1aW5hcmE6QnViYQorMjpHVzpHTkI6R1VJTkVBIEJJU1NBVTpRdWluYXJhOkVtcGFkYQorMzpHVzpHTkI6R1VJTkVBIEJJU1NBVTpRdWluYXJhOkZ1bGFjdW5kYQorNDpHVzpHTkI6R1VJTkVBIEJJU1NBVTpRdWluYXJhOlRpdGUKKzE6R1c6R05COkdVSU5FQSBCSVNTQVU6Qmlzc2F1OkJpc3NhdQorMTpHVzpHTkI6R1VJTkVBIEJJU1NBVTpPaW86Qmlzc29yYQorMjpHVzpHTkI6R1VJTkVBIEJJU1NBVTpPaW86RmFyaW0KKzM6R1c6R05COkdVSU5FQSBCSVNTQVU6T2lvOk1hbnNhYmEKKzQ6R1c6R05COkdVSU5FQSBCSVNTQVU6T2lvOk1hbnNvYQorNTpHVzpHTkI6R1VJTkVBIEJJU1NBVTpPaW86TmhhY3JhCisxOkdXOkdOQjpHVUlORUEgQklTU0FVOkdhYnU6Qm9lCisyOkdXOkdOQjpHVUlORUEgQklTU0FVOkdhYnU6R2FidQorMzpHVzpHTkI6R1VJTkVBIEJJU1NBVTpHYWJ1OlBpY2hlCis0OkdXOkdOQjpHVUlORUEgQklTU0FVOkdhYnU6UGlyYWRhCis1OkdXOkdOQjpHVUlORUEgQklTU0FVOkdhYnU6U29uYWNvCisxOkdXOkdOQjpHVUlORUEgQklTU0FVOkNhY2hldTpCaWdlbmUKKzI6R1c6R05COkdVSU5FQSBCSVNTQVU6Q2FjaGV1OkJ1bGEKKzM6R1c6R05COkdVSU5FQSBCSVNTQVU6Q2FjaGV1OkNhY2hldQorNDpHVzpHTkI6R1VJTkVBIEJJU1NBVTpDYWNoZXU6Q2FpbworNTpHVzpHTkI6R1VJTkVBIEJJU1NBVTpDYWNoZXU6Q2FuZ2h1bmdvCis2OkdXOkdOQjpHVUlORUEgQklTU0FVOkNhY2hldTpTYW8gRG9taW5nb3MKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR05RL0dOUV9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR05RL0dOUV9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTk2ZmVmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9HTlEvR05RX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsOSBAQAorMTpHUS1BTjpHUTpBTk5PQk9OCisyOkdRLUJOOkdROkJJT0tPIE5PUlRFCiszOkdRLUJTOkdROkJJT0tPIFNVUgorNDpHUS1DUzpHUTpDRU5UUk8gU1VSCis1OkdRLUtOOkdROktJRU5URU0KKzY6R1EtTEk6R1E6TElUT1JBTAorNzpHUS1DOkdROlJFR0lPTiBDT05USU5FTlRBTAorODpHUS1JOkdROlJFR0lPTiBJTlNVTEFSCis5OkdRLVdOOkdROldFTEVOWkFTCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dOUS9HTlFfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dOUS9HTlFfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyNTBiNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR05RL0dOUV9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDkgQEAKKzE6R1E6R05ROkVRVUFUT1JJQUwgR1VJTkVBOktpZW50ZW06R05RLkwyLjYKKzE6R1E6R05ROkVRVUFUT1JJQUwgR1VJTkVBOldlbGVuemFzOkdOUS5MMi41CisxOkdROkdOUTpFUVVBVE9SSUFMIEdVSU5FQTpCaW9rbyBTdXI6R05RLkwyLjkKKzE6R1E6R05ROkVRVUFUT1JJQUwgR1VJTkVBOkxpdG9yYWw6R05RLkwyLjIKKzI6R1E6R05ROkVRVUFUT1JJQUwgR1VJTkVBOkxpdG9yYWw6R05RLkwyLjMKKzM6R1E6R05ROkVRVUFUT1JJQUwgR1VJTkVBOkxpdG9yYWw6R05RLkwyLjQKKzE6R1E6R05ROkVRVUFUT1JJQUwgR1VJTkVBOkFubm9ib246R05RLkwyLjcKKzE6R1E6R05ROkVRVUFUT1JJQUwgR1VJTkVBOkNlbnRybyBTdXI6R05RLkwyLjgKKzE6R1E6R05ROkVRVUFUT1JJQUwgR1VJTkVBOkJpb2tvIE5vcnRlOkdOUS5MMi4xCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dSQy9HUkNfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dSQy9HUkNfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1ZTU2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR1JDL0dSQ19BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDU3IEBACisxOkdSLTM6R1I6QUNIQUlBCisyOkdSLTY5OkdSOkFHSU8gT1JPUworMzpHUi0wOkdSOkFJVE9MSUEgQUtBUk5BTklBCis0OkdSLTgwOkdSOkFOQVRPTElLSSBNQUtFRE9OSUEKKzU6R1ItOkdSOkFSR09MSVMKKzY6R1ItMjpHUjpBUktBRElBCis3OkdSLUE6R1I6QVRUSUtJCis4OkdSLTY0OkdSOkNIQUxLSURJS0kKKzk6R1ItOTQ6R1I6Q0hBTklBCisxMDpHUi04NTpHUjpDSElPUworMTE6R1ItODpHUjpET0RFS0FOSVNPUworMTI6R1ItNTI6R1I6RFJBTUEKKzEzOkdSLTcxOkdSOkRZVElLSSBFTExBREEKKzE0OkdSLTYwOkdSOkRZVElLSSBNQUtFRE9OSUEKKzE1OkdSLTc6R1I6RVZST1MKKzE2OkdSLTA1OkdSOkVWUllUQU5JQQorMTc6R1ItMDQ6R1I6RVZWT0lBCisxODpHUi0wNzpHUjpGT0tJUworMTk6R1ItMDY6R1I6RlRISU9USVMKKzIwOkdSLTU6R1I6R1JFVkVOQQorMjE6R1ItNDpHUjpJTEVJQQorMjI6R1ItNTM6R1I6SU1BVEhJQQorMjM6R1ItMzM6R1I6SU9BTk5JTkEKKzI0OkdSLTY3OkdSOklPTklBIE5JU0lBCisyNTpHUi02MTpHUjpJUEVJUk9TCisyNjpHUi05OkdSOklSQUtMRUlPTgorMjc6R1ItNTY6R1I6S0FTVE9SSUEKKzI4OkdSLTU1OkdSOktBVkFMTEEKKzI5OkdSLTIzOkdSOktFRkFMTElOSUEKKzMwOkdSLTg2OkdSOktFTlRSSUtJIE1BS0VET05JQQorMzE6R1ItMjI6R1I6S0VSS1lSQQorMzI6R1ItNTc6R1I6S0lMS0lTCiszMzpHUi01ODpHUjpLT1pBTkkKKzM0OkdSLTc2OkdSOktSSVRJCiszNTpHUi04MjpHUjpLWUtMQURFUworMzY6R1ItNjpHUjpMQUtPTklBCiszNzpHUi00MjpHUjpMQVJJU0EKKzM4OkdSLTkyOkdSOkxBU0lUSElPTgorMzk6R1ItMjQ6R1I6TEVGS0FTCis0MDpHUi04MzpHUjpMRVNWT1MKKzQxOkdSLTQzOkdSOk1BR05JU0lBCis0MjpHUi03NTpHUjpOT1RJTyBBSUdBSU8KKzQzOkdSLTU5OkdSOlBFTExBCis0NDpHUi03NDpHUjpQRUxPUE9OTklTT1MKKzQ1OkdSLTM0OkdSOlBSRVZFWkEKKzQ2OkdSLTkzOkdSOlJFVEhZTU5PTgorNDc6R1ItNzM6R1I6Uk9ET1BJCis0ODpHUi04NDpHUjpTQU1PUworNDk6R1ItNjI6R1I6U0VSUkFJCis1MDpHUi03MDpHUjpTVEVSRUEgRUxMQURBCis1MTpHUi0zMjpHUjpUSEVTUFJPVElBCis1MjpHUi02MzpHUjpUSEVTU0FMSUEKKzUzOkdSLTU0OkdSOlRIRVNTQUxPTklLSQorNTQ6R1ItNDQ6R1I6VFJJS0FMQQorNTU6R1ItMDM6R1I6Vk9JT1RJQQorNTY6R1ItNjU6R1I6Vk9SRUlPIEFJR0FJTworNTc6R1ItNzI6R1I6WEFOVEhJCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dSQy9HUkNfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dSQy9HUkNfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvR1JDL0dSQ19BRE1JTjJfTEVYLnR4dApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9HVVkvR1VZX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9HVVkvR1VZX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzZhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dVWS9HVVlfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxMSBAQAorMTpHWS1CQTpHWTpCQVJJTUEgV0FJTkkKKzI6R1ktQkFXOkdZOkJBUklNQS9XQUlOSQorMzpHWS1DVTpHWTpDVVlVTkkvTUFaQVJVTkkKKzQ6R1ktREU6R1k6REVNRVJBUkEvTUFIQUlDQQorNTpHWS1FQjpHWTpFQVNUIEJFUkJJQ0UvQ09SRU5UWU5FCis2OkdZLUVTOkdZOkVTU0VRVUlCTyBJLi9XRVNUIEQuCis3OkdZLU1BOkdZOk1BSEFJQ0EvQkVSQklDRQorODpHWS1QTTpHWTpQT01FUk9PTi9TVVBFTkFBTQorOTpHWS1QVDpHWTpQT1RBUk8vU0lQQVJVTkkKKzEwOkdZLVVEOkdZOlVQUEVSIERFTUVSQVJBL0JFUkJJQ0UKKzExOkdZLVVUOkdZOlVQUEVSIFRBS1VUVS9VLkVTU0VRVUlCTwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9HVVkvR1VZX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9HVVkvR1VZX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MDcyOWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0dVWS9HVVlfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSwyNyBAQAorMTpHWTpHVVk6R1VZQU5BOkNVWVVOSS9NQVpBUlVOSTpWSUktMSAgQ3V5dW5pCisyOkdZOkdVWTpHVVlBTkE6Q1VZVU5JL01BWkFSVU5JOlZJSS0yIE1hemFydW5pL0wuQi5FLlJpdmUKKzE6R1k6R1VZOkdVWUFOQTpQT1RBUk8vU0lQQVJVTkk6VklJSS0xIElyZW5nL1VwcGVyIFBvdGFybworMjpHWTpHVVk6R1VZQU5BOlBPVEFSTy9TSVBBUlVOSTpWSUlJLTIgTG93ZXIgUG90YXJvL0xhZHNtCisxOkdZOkdVWTpHVVlBTkE6QkFSSU1BL1dBSU5JOkktMSAgQmFyaW1hCisyOkdZOkdVWTpHVVlBTkE6QkFSSU1BL1dBSU5JOkktMiAgV2FpbmkKKzE6R1k6R1VZOkdVWUFOQTpQT01FUk9PTi9TVVBFTkFBTTpJSS0xIE1vcnVrYS9Qb21lcm9vbgorMjpHWTpHVVk6R1VZQU5BOlBPTUVST09OL1NVUEVOQUFNOklJLTIgU29tZXJzZXQgQW5kIEJlcmtzCisxOkdZOkdVWTpHVVlBTkE6RUFTVCBCRVJCSUNFL0NPUkVOVFlORTpWSS0xIEVhc3QgQmVyYmljZS9XLkNhbmplCisyOkdZOkdVWTpHVVlBTkE6RUFTVCBCRVJCSUNFL0NPUkVOVFlORTpWSS0yICBFYXN0IENhbmplL0UuQy5CZXJiCiszOkdZOkdVWTpHVVlBTkE6RUFTVCBCRVJCSUNFL0NPUkVOVFlORTpWSS0zIEJsYWNrIEJ1c2ggUG9sZGVyCis0OkdZOkdVWTpHVVlBTkE6RUFTVCBCRVJCSUNFL0NPUkVOVFlORTpWSS00IExvd2VyIENvcmVudHluZSBSaXZlCis1OkdZOkdVWTpHVVlBTkE6RUFTVCBCRVJCSUNFL0NPUkVOVFlORTpWSS01IExlZnQgQmFuayBVcHBlciBDYW5qCis2OkdZOkdVWTpHVVlBTkE6RUFTVCBCRVJCSUNFL0NPUkVOVFlORTpWSS02IFVwcGVyIENhbmplL0NvcmVudHluCis3OkdZOkdVWTpHVVlBTkE6RUFTVCBCRVJCSUNFL0NPUkVOVFlORTpWSS03IFVwcGVyIENvcmVudHluZQorMTpHWTpHVVk6R1VZQU5BOkRFTUVSQVJBL01BSEFJQ0E6SVYtMSBNb2JsaXNzYS9MYSBSZWNvbm5haQorMjpHWTpHVVk6R1VZQU5BOkRFTUVSQVJBL01BSEFJQ0E6SVYtMiBCdXh0b24vTWFoYWljYQorMTpHWTpHVVk6R1VZQU5BOlVQUEVSIERFTUVSQVJBL0JFUkJJQ0U6WC0xIFJpZ2h0IEJhbmsgRXNzZXF1aWJvCisyOkdZOkdVWTpHVVlBTkE6VVBQRVIgREVNRVJBUkEvQkVSQklDRTpYLTIgVG9yYW5pL0J1bGxldHdvb2QKKzE6R1k6R1VZOkdVWUFOQTpVUFBFUiBUQUtVVFUvVS5FU1NFUVVJQk86SVgtMSBSdXB1bnVuaSBXZXN0CisyOkdZOkdVWTpHVVlBTkE6VVBQRVIgVEFLVVRVL1UuRVNTRVFVSUJPOklYLTIgUmV3YShJbGxpd2EpL1UuRQorMTpHWTpHVVk6R1VZQU5BOk1BSEFJQ0EvQkVSQklDRTpWLTEgIE1haGFpY2EvTWFoYWljb255CisyOkdZOkdVWTpHVVlBTkE6TUFIQUlDQS9CRVJCSUNFOlYtMiBNYWhhaWNvbnkvQmVyYmljZQorMTpHWTpHVVk6R1VZQU5BOkVTU0VRVUlCTyBJLi9XRVNUIEQuOkVzc2VxdWlibyBJLi9MLkIuRS5SaXZlcgorMjpHWTpHVVk6R1VZQU5BOkVTU0VRVUlCTyBJLi9XRVNUIEQuOklJSS0xIEVzc2VxdWlibyBJc2xhbmRzCiszOkdZOkdVWTpHVVlBTkE6RVNTRVFVSUJPIEkuL1dFU1QgRC46SUlJLTIgQm9uYXNpa2EvQm9lcmFzaXJpZQorNDpHWTpHVVk6R1VZQU5BOkVTU0VRVUlCTyBJLi9XRVNUIEQuOklJSS0zIExvd2VyIFdlc3QgRGVtZXJhcmEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSFJWL0hSVl9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSFJWL0hSVl9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjM5ZGFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9IUlYvSFJWX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMjAgQEAKKzE6SFItMDc6SFI6QkpFTE9WQVJTS08gQklMT0dPUlNLQSBaVVBBTklKQQorMjpIUi05OkhSOkRVQlJPVkFLTyBORVJFVFZBTlNLQSBaVVBBTklKQQorMzpIUi0yOkhSOkdSQUQgWkFHUkVCCis0OkhSLTExOkhSOkhSVkFUU0tBCis1OkhSLTg6SFI6SVNUQVJTS0EgWlVQQU5JSkEKKzY6SFItMDQ6SFI6S0FSTE9WQUtBIFpVUEFOSUpBCis3OkhSLTA2OkhSOktPUFJJVk5JS08gS1JJWkVWQSBLQSBaVVBBTklKQQorODpIUi0wMjpIUjpLUkFQSU5TS08gWkFHT1JTS0EgWlVQQU5JSkEKKzk6SFItMDk6SFI6TElLTyBTRU5KU0tBIFpVUEFOSUpBCisxMDpIUi0yMDpIUjpNRUlNVVJTS0EgWlVQQU5JSkEKKzExOkhSLTQ6SFI6T1NKRUtPIEJBUkFOSlNLQSBaVVBBTklKQQorMTI6SFItOkhSOlBPWkVTS08gU0xBVk9OU0tBIFpVUEFOSUpBCisxMzpIUi0wODpIUjpQUklNT1JTS08gR09SQU5TS0EgWlVQQU5JSkEKKzE0OkhSLTU6SFI6U0lCRU5TS08gS05JTlNLQSBaVVBBTklKQQorMTU6SFItMDM6SFI6U0lTQUtPIE1PU0xBVkFLQSBaVVBBTklKQQorMTY6SFItNzpIUjpTUExJVFNLTyBEQUxNQVRJTlNLQSBaVVBBTklKQQorMTc6SFItMDU6SFI6VkFSQVpESU5TS0EgWlVQQU5JSkEKKzE4OkhSLTA6SFI6VklST1ZJVElLTyBQT0RSQVZTS0EgWlVQQU5JSkEKKzE5OkhSLTY6SFI6VlVLT1ZBUlNLTyBTUklKRU1TS0EgWlVQQU5JSkEKKzIwOkhSLTM6SFI6WkFEQVJTS0EgWlVQQU5JSkEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSFJWL0hSVl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSFJWL0hSVl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9IUlYvSFJWX0FETUlOMl9MRVgudHh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0hVTi9IVU5fQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0hVTi9IVU5fQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcyMjVlZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSFVOL0hVTl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDQyIEBACisxOkhVLUJLOkhVOkJBQ1MgS0lTS1VOCisyOkhVLUJBOkhVOkJBUkFOWUEKKzM6SFUtQkM6SFU6QkVLRVNDU0FCQQorNDpIVS1CWjpIVTpCT1JTT0QgQUJBVUogWkVNUExFTgorNTpIVS1CWjpIVTpCT1JTT0QgQUJBVUogWkVNUExFTgorNjpIVS1CVTpIVTpCVURBUEVTVAorNzpIVS1DUzpIVTpDU09OR1JBRAorODpIVS1ERTpIVTpERUJSRUNFTgorOTpIVS1EVTpIVTpEVU5BVUpWQVJPUworMTA6SFUtRUc6SFU6RUdFUgorMTE6SFUtRkU6SFU6RkVKRVIKKzEyOkhVLUdZOkhVOkdZUgorMTM6SFUtR1M6SFU6R1lSIE1PU09OIFNPUFJPTgorMTQ6SFUtU086SFU6R1mUUiBNT1NPTiBTT1BST04KKzE1OkhVLUhCOkhVOkhBSkRVIEJJSEFSCisxNjpIVS1IRTpIVTpIRVZFUworMTc6SFUtSFY6SFU6SE9ETUVaVkFTQVJIRUxZCisxODpIVS1KTjpIVTpKQVNaIE5BR1lLVU4gU1pPTE5PSworMTk6SFUtS1Y6SFU6S0FQT1NWQVIKKzIwOkhVLUtNOkhVOktFQ1NLRU1FVAorMjE6SFUtS0U6SFU6S09NQVJPTSBFU1pURVJHT00KKzIyOkhVLU1JOkhVOk1JU0tPTEMKKzIzOkhVLU5LOkhVOk5BR1lLQU5JWlNBCisyNDpIVS1OTzpIVTpOT0dSQUQKKzI1OkhVLU5ZOkhVOk5ZSVJFR1lIQVpBCisyNjpIVS1QUzpIVTpQRUNTCisyNzpIVS1QRTpIVTpQRVNUCisyODpIVS1TVDpIVTpTQUxHT1RBUkpBTgorMjk6SFUtU046SFU6U09QUk9OCiszMDpIVS1CRTpIVTpTWkFCT0xDUyBTWkFUQVIgQkVSRUcKKzMxOkhVLVNaOkhVOlNaQUJPTENTIFNaQVRNQVIgQkVSRUcKKzMyOkhVLVNEOkhVOlNaRUdFRAorMzM6SFUtU0Y6SFU6U1pFS0VTRkVIRVJWQVIKKzM0OkhVLVNTOkhVOlNaRUtTWkFSRAorMzU6SFUtU0s6SFU6U1pPTE5PSworMzY6SFUtU0g6SFU6U1pPTUJBVEhFTFkKKzM3OkhVLVRCOkhVOlRBVEFCQU5ZQQorMzg6SFUtVE86SFU6VE9MTkEKKzM5OkhVLVZBOkhVOlZBUworNDA6SFUtVkU6SFU6VkVTWlBSRU0KKzQxOkhVLVZFOkhVOlZFU1pQUkVNCis0MjpIVS1aQTpIVTpaQUxBCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0hVTi9IVU5fQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0hVTi9IVU5fQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSFVOL0hVTl9BRE1JTjJfTEVYLnR4dApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JRE4vSUROX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JRE4vSUROX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYzU2YTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0lETi9JRE5fQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwzNiBAQAorMTpJRC1BQzpJRDpBQ0VICisyOklELUJBOklEOkJBTEkKKzM6SUQtQkI6SUQ6QkFOR0tBIEJFTElUVU5HCis0OklELUJUOklEOkJBTlRFTgorNTpJRC1CRTpJRDpCRU5HS1VMVQorNjpJRC1ZT0c6SUQ6RC5JIFlPR1lBS0FSVEEKKzc6SUQtSkFLOklEOkRLSSBKQUtBUlRBCis4OklELUdPOklEOkdPUk9OVEFMTworOTpJRC1JSkE6SUQ6SVJJQU4gSkFZQQorMTA6SUQtSks6SUQ6SkFLQVJUQSBSQVlBCisxMTpJRC1KQTpJRDpKQU1CSQorMTI6SUQtSkI6SUQ6SkFXQSBCQVJBVAorMTM6SUQtSlQ6SUQ6SkFXQSBURU5HQUgKKzE0OklELUpJOklEOkpBV0EgVElNVVIKKzE1OklELUtCOklEOktBTElNQU5UQU4gQkFSQVQKKzE2OklELUtTOklEOktBTElNQU5UQU4gU0VMQVRBTgorMTc6SUQtS1Q6SUQ6S0FMSU1BTlRBTiBURU5HQUgKKzE4OklELUtJOklEOktBTElNQU5UQU4gVElNVVIKKzE5OklELUtSOklEOktFUFVMQVVBTiBSSUFVCisyMDpJRC1MQTpJRDpMQU1QVU5HCisyMTpJRC1NQTpJRDpNQUxVS1UKKzIyOklELU1VOklEOk1BTFVLVSBVVEFSQQorMjM6SUQtTkI6SUQ6TlVTQSBURU5HR0FSQSBCQVJBVAorMjQ6SUQtTlQ6SUQ6TlVTQSBURU5HR0FSQSBUSU1VUgorMjU6SUQtUEE6SUQ6UEFQVUEKKzI2OklELVJJOklEOlJJQVUKKzI3OklELVNSOklEOlNVTEFXRVNJIEJBUkFUCisyODpJRC1TTjpJRDpTVUxBV0VTSSBTRUxBVEFOCisyOTpJRC1TVDpJRDpTVUxBV0VTSSBURU5HQUgKKzMwOklELVNHOklEOlNVTEFXRVNJIFRFTkdHQVJBCiszMTpJRC1TQTpJRDpTVUxBV0VTSSBVVEFSQQorMzI6SUQtU0I6SUQ6U1VNQVRFUkEgQkFSQVQKKzMzOklELVNTOklEOlNVTUFURVJBIFNFTEFUQU4KKzM0OklELVNVOklEOlNVTUFURVJBIFVUQVJBCiszNTpJRDAtVElNOklEOlRJTU9SIFRJTVVSCiszNjpJRC1ZTzpJRDpZT0dZQUtBUlRBCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0lETi9JRE5fQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0lETi9JRE5fQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg0YTg4ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSUROL0lETl9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDI5MyBAQAorMTpJRDpJRE46SU5ET05FU0lBOlN1bGF3ZXNpIFV0YXJhOkJvbGFhbmcgTW9uZ29uZG93CisyOklEOklETjpJTkRPTkVTSUE6U3VsYXdlc2kgVXRhcmE6R29yb250YWxvCiszOklEOklETjpJTkRPTkVTSUE6U3VsYXdlc2kgVXRhcmE6S29keWEgR29yb250YWxvCis0OklEOklETjpJTkRPTkVTSUE6U3VsYXdlc2kgVXRhcmE6S29keWEgTWFuYWRvCis1OklEOklETjpJTkRPTkVTSUE6U3VsYXdlc2kgVXRhcmE6TWluYWhhc2EKKzE6SUQ6SUROOklORE9ORVNJQTpTdWxhd2VzaSBUZW5nZ2FyYTpCdXRvbgorMjpJRDpJRE46SU5ET05FU0lBOlN1bGF3ZXNpIFRlbmdnYXJhOktlbmRhcmkKKzM6SUQ6SUROOklORE9ORVNJQTpTdWxhd2VzaSBUZW5nZ2FyYTpLb2xha2EKKzQ6SUQ6SUROOklORE9ORVNJQTpTdWxhd2VzaSBUZW5nZ2FyYTpNdW5hCisxOklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgVXRhcmE6RGFpcmkKKzI6SUQ6SUROOklORE9ORVNJQTpTdW1hdGVyYSBVdGFyYTpEZWxpIFNlcmRhbmcKKzM6SUQ6SUROOklORE9ORVNJQTpTdW1hdGVyYSBVdGFyYTpLYXJvCis0OklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgVXRhcmE6S29keWEgQmluamFpCis1OklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgVXRhcmE6S29keWEgTWVkYW4KKzY6SUQ6SUROOklORE9ORVNJQTpTdW1hdGVyYSBVdGFyYTpLb2R5YSBQLlNpYW50YXIKKzc6SUQ6SUROOklORE9ORVNJQTpTdW1hdGVyYSBVdGFyYTpLb2R5YSBTaWJvbGdhCis4OklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgVXRhcmE6S29keWEgVC5CYWxhaQorOTpJRDpJRE46SU5ET05FU0lBOlN1bWF0ZXJhIFV0YXJhOkxhYnVoYW4gQmF0dQorMTA6SUQ6SUROOklORE9ORVNJQTpTdW1hdGVyYSBVdGFyYTpMYW5na2F0CisxMTpJRDpJRE46SU5ET05FU0lBOlN1bWF0ZXJhIFV0YXJhOk5pYXMKKzEyOklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgVXRhcmE6U2ltYWx1bmd1bgorMTM6SUQ6SUROOklORE9ORVNJQTpTdW1hdGVyYSBVdGFyYTpUYXBhbnVsaSBTbHQKKzE0OklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgVXRhcmE6VGFwYW51bGkgVXRhcmEKKzE6SUQ6SUROOklORE9ORVNJQTpNYWx1a3U6SGFsbWFoZXJhIFRlbmdhaAorMjpJRDpJRE46SU5ET05FU0lBOk1hbHVrdTpLb2R5YSBBbWJvbgorMzpJRDpJRE46SU5ET05FU0lBOk1hbHVrdTpNYWx1a3UgVGVuZ2FoCis0OklEOklETjpJTkRPTkVTSUE6TWFsdWt1Ok1hbHVrdSBUZW5nZ2FyYQorNTpJRDpJRE46SU5ET05FU0lBOk1hbHVrdTpNYWx1a3UgVXRhcmEKKzE6SUQ6SUROOklORE9ORVNJQTpTdW1hdGVyYSBCYXJhdDpBZ2FtCisyOklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgQmFyYXQ6S29keWEgQnVraXR0aW5nZ2kKKzM6SUQ6SUROOklORE9ORVNJQTpTdW1hdGVyYSBCYXJhdDpLb2R5YSBQYWRhbmcKKzQ6SUQ6SUROOklORE9ORVNJQTpTdW1hdGVyYSBCYXJhdDpLb2R5YSBQYWRhbmdwYW5qYW5nCis1OklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgQmFyYXQ6S29keWEgU2F3YWhsdW50bworNjpJRDpJRE46SU5ET05FU0lBOlN1bWF0ZXJhIEJhcmF0OktvZHlhIFNvbG9rCis3OklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgQmFyYXQ6TGltYXB1bHVoa290bworODpJRDpJRE46SU5ET05FU0lBOlN1bWF0ZXJhIEJhcmF0OlBhZGFuZyBQYXJpYW1hbgorOTpJRDpJRE46SU5ET05FU0lBOlN1bWF0ZXJhIEJhcmF0OlBhc2FtYW4KKzEwOklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgQmFyYXQ6UGF5YWt1bWJ1aAorMTE6SUQ6SUROOklORE9ORVNJQTpTdW1hdGVyYSBCYXJhdDpQZXNpc2lyIFNlbGF0YW4KKzEyOklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgQmFyYXQ6U2F3YWhsdW50by9TaWp1bmp1bmcKKzEzOklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgQmFyYXQ6U29sb2sKKzE0OklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgQmFyYXQ6VGFuYWhkYXRhcgorMTpJRDpJRE46SU5ET05FU0lBOkphd2EgQmFyYXQ6QmFuZHVuZworMjpJRDpJRE46SU5ET05FU0lBOkphd2EgQmFyYXQ6QmVrYXNpCiszOklEOklETjpJTkRPTkVTSUE6SmF3YSBCYXJhdDpCb2dvcgorNDpJRDpJRE46SU5ET05FU0lBOkphd2EgQmFyYXQ6Q2lhbWlzCis1OklEOklETjpJTkRPTkVTSUE6SmF3YSBCYXJhdDpDaWFuanVyCis2OklEOklETjpJTkRPTkVTSUE6SmF3YSBCYXJhdDpDaXJlYm9uCis3OklEOklETjpJTkRPTkVTSUE6SmF3YSBCYXJhdDpHYXJ1dAorODpJRDpJRE46SU5ET05FU0lBOkphd2EgQmFyYXQ6SW5kcmFtYXl1Cis5OklEOklETjpJTkRPTkVTSUE6SmF3YSBCYXJhdDpLYXJhd2FuZworMTA6SUQ6SUROOklORE9ORVNJQTpKYXdhIEJhcmF0OktvZHlhIEJhbmR1bmcKKzExOklEOklETjpJTkRPTkVTSUE6SmF3YSBCYXJhdDpLb2R5YSBCb2dvcgorMTI6SUQ6SUROOklORE9ORVNJQTpKYXdhIEJhcmF0OktvZHlhIENpcmVib24KKzEzOklEOklETjpJTkRPTkVTSUE6SmF3YSBCYXJhdDpLb2R5YSBTdWthYnVtaQorMTQ6SUQ6SUROOklORE9ORVNJQTpKYXdhIEJhcmF0Okt1bmluZ2FuCisxNTpJRDpJRE46SU5ET05FU0lBOkphd2EgQmFyYXQ6TGViYWsKKzE2OklEOklETjpJTkRPTkVTSUE6SmF3YSBCYXJhdDpNYWphbGVuZ2thCisxNzpJRDpJRE46SU5ET05FU0lBOkphd2EgQmFyYXQ6UGFuZGVnbGFuZworMTg6SUQ6SUROOklORE9ORVNJQTpKYXdhIEJhcmF0OlB1cndha2FydGEKKzE5OklEOklETjpJTkRPTkVTSUE6SmF3YSBCYXJhdDpTZXJhbmcKKzIwOklEOklETjpJTkRPTkVTSUE6SmF3YSBCYXJhdDpTdWJhbmcKKzIxOklEOklETjpJTkRPTkVTSUE6SmF3YSBCYXJhdDpTdWthYnVtaQorMjI6SUQ6SUROOklORE9ORVNJQTpKYXdhIEJhcmF0OlN1bWVkYW5nCisyMzpJRDpJRE46SU5ET05FU0lBOkphd2EgQmFyYXQ6VGFuZ2VyYW5nCisyNDpJRDpJRE46SU5ET05FU0lBOkphd2EgQmFyYXQ6VGFzaWttYWxheWEKKzE6SUQ6SUROOklORE9ORVNJQTpELkkgWW9neWFrYXJ0YTpCYW50dWwKKzI6SUQ6SUROOklORE9ORVNJQTpELkkgWW9neWFrYXJ0YTpHdW51bmcgS2lkdWwKKzM6SUQ6SUROOklORE9ORVNJQTpELkkgWW9neWFrYXJ0YTpLb2R5YSBZb2d5YWthcnRhCis0OklEOklETjpJTkRPTkVTSUE6RC5JIFlvZ3lha2FydGE6S3Vsb24gUHJvZ28KKzU6SUQ6SUROOklORE9ORVNJQTpELkkgWW9neWFrYXJ0YTpTbGVtYW4KKzE6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRpbXVyOkJhbmdrYWxhbgorMjpJRDpJRE46SU5ET05FU0lBOkphd2EgVGltdXI6QmFueXV3YW5naQorMzpJRDpJRE46SU5ET05FU0lBOkphd2EgVGltdXI6QmxpdGFyCis0OklEOklETjpJTkRPTkVTSUE6SmF3YSBUaW11cjpCb2pvbmVnb3JvCis1OklEOklETjpJTkRPTkVTSUE6SmF3YSBUaW11cjpCb25kb3dvc28KKzY6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRpbXVyOkdyZXNpaworNzpJRDpJRE46SU5ET05FU0lBOkphd2EgVGltdXI6SmVtYmVyCis4OklEOklETjpJTkRPTkVTSUE6SmF3YSBUaW11cjpKb21iYW5nCis5OklEOklETjpJTkRPTkVTSUE6SmF3YSBUaW11cjpLZWRpcmkKKzEwOklEOklETjpJTkRPTkVTSUE6SmF3YSBUaW11cjpLb2R5YSBCbGl0YXIKKzExOklEOklETjpJTkRPTkVTSUE6SmF3YSBUaW11cjpLb2R5YSBLZWRpcmkKKzEyOklEOklETjpJTkRPTkVTSUE6SmF3YSBUaW11cjpLb2R5YSBNYWRpdW4KKzEzOklEOklETjpJTkRPTkVTSUE6SmF3YSBUaW11cjpLb2R5YSBNYWxhbmcKKzE0OklEOklETjpJTkRPTkVTSUE6SmF3YSBUaW11cjpLb2R5YSBNb2pva2VydG8KKzE1OklEOklETjpJTkRPTkVTSUE6SmF3YSBUaW11cjpLb2R5YSBQYXN1cnVhbgorMTY6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRpbXVyOktvZHlhIFByb2JvbGluZ2dvCisxNzpJRDpJRE46SU5ET05FU0lBOkphd2EgVGltdXI6S29keWEgU3VyYWJheWEKKzE4OklEOklETjpJTkRPTkVTSUE6SmF3YSBUaW11cjpMYW1vbmdhbgorMTk6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRpbXVyOkx1bWFqYW5nCisyMDpJRDpJRE46SU5ET05FU0lBOkphd2EgVGltdXI6TWFkaXVuCisyMTpJRDpJRE46SU5ET05FU0lBOkphd2EgVGltdXI6TWFnZXRhbgorMjI6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRpbXVyOk1hbGFuZworMjM6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRpbXVyOk1vam9rZXJ0bworMjQ6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRpbXVyOk5nYW5qdWsKKzI1OklEOklETjpJTkRPTkVTSUE6SmF3YSBUaW11cjpOZ2F3aQorMjY6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRpbXVyOlBhY2l0YW4KKzI3OklEOklETjpJTkRPTkVTSUE6SmF3YSBUaW11cjpQYW1la2FzYW4KKzI4OklEOklETjpJTkRPTkVTSUE6SmF3YSBUaW11cjpQYXN1cnVhbgorMjk6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRpbXVyOlBvbm9yb2dvCiszMDpJRDpJRE46SU5ET05FU0lBOkphd2EgVGltdXI6UHJvYm9saW5nZ28KKzMxOklEOklETjpJTkRPTkVTSUE6SmF3YSBUaW11cjpTYW1wYW5nCiszMjpJRDpJRE46SU5ET05FU0lBOkphd2EgVGltdXI6U2lkb2Fyam8KKzMzOklEOklETjpJTkRPTkVTSUE6SmF3YSBUaW11cjpTaXR1Ym9uZG8KKzM0OklEOklETjpJTkRPTkVTSUE6SmF3YSBUaW11cjpTdW1lbmVwCiszNTpJRDpJRE46SU5ET05FU0lBOkphd2EgVGltdXI6VHJlbmdnYWxlaworMzY6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRpbXVyOlR1YmFuCiszNzpJRDpJRE46SU5ET05FU0lBOkphd2EgVGltdXI6VHVsdW5nYWd1bmcKKzE6SUQ6SUROOklORE9ORVNJQTpLYWxpbWFudGFuIFNlbGF0YW46QmFuamFyCisyOklEOklETjpJTkRPTkVTSUE6S2FsaW1hbnRhbiBTZWxhdGFuOkJhcml0byBLdWFsYQorMzpJRDpJRE46SU5ET05FU0lBOkthbGltYW50YW4gU2VsYXRhbjpIdWx1IFNlaSBTZWxhdGFuCis0OklEOklETjpJTkRPTkVTSUE6S2FsaW1hbnRhbiBTZWxhdGFuOkh1bHUgU2VpIFRlbmdhaAorNTpJRDpJRE46SU5ET05FU0lBOkthbGltYW50YW4gU2VsYXRhbjpIdWx1IFNlaSBVdGFyYQorNjpJRDpJRE46SU5ET05FU0lBOkthbGltYW50YW4gU2VsYXRhbjpLb2R5YSBCYW5qYXJtYXNpbgorNzpJRDpJRE46SU5ET05FU0lBOkthbGltYW50YW4gU2VsYXRhbjpLb3RhIEJhcnUKKzg6SUQ6SUROOklORE9ORVNJQTpLYWxpbWFudGFuIFNlbGF0YW46VGFiYWxvbmcKKzk6SUQ6SUROOklORE9ORVNJQTpLYWxpbWFudGFuIFNlbGF0YW46VGFuYWggTGF1dAorMTA6SUQ6SUROOklORE9ORVNJQTpLYWxpbWFudGFuIFNlbGF0YW46VGFwaW4KKzE6SUQ6SUROOklORE9ORVNJQTpSaWF1OkJlbmdrYWxpcworMjpJRDpJRE46SU5ET05FU0lBOlJpYXU6SW5kcmFnaXJpIEhpbGlyCiszOklEOklETjpJTkRPTkVTSUE6UmlhdTpJbmRyYWdpcmkgSHVsdQorNDpJRDpJRE46SU5ET05FU0lBOlJpYXU6S2FtcGFyCis1OklEOklETjpJTkRPTkVTSUE6UmlhdTpLb2R5YSBQZWthbmJhcnUKKzY6SUQ6SUROOklORE9ORVNJQTpSaWF1OlJpYXUgS2VwdWxhdWFuCisxOklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgU2VsYXRhbjpCYW5na2EKKzI6SUQ6SUROOklORE9ORVNJQTpTdW1hdGVyYSBTZWxhdGFuOkJlbGl0dW5nCiszOklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgU2VsYXRhbjpLb2R5YSBQYWxlbWJhbmcKKzQ6SUQ6SUROOklORE9ORVNJQTpTdW1hdGVyYSBTZWxhdGFuOkxhaGF0Cis1OklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgU2VsYXRhbjpNdWFyYSBFbmltci9MaW90Cis2OklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgU2VsYXRhbjpNdXNpIEJhbnl1YXNpbgorNzpJRDpJRE46SU5ET05FU0lBOlN1bWF0ZXJhIFNlbGF0YW46TXVzaSBSYXdhcworODpJRDpJRE46SU5ET05FU0lBOlN1bWF0ZXJhIFNlbGF0YW46T2dhbiBLZW1lcmluZyBJbGlyCis5OklEOklETjpJTkRPTkVTSUE6U3VtYXRlcmEgU2VsYXRhbjpPZ2FuIEtvbWVyaW5nIFVsdQorMTpJRDpJRE46SU5ET05FU0lBOkphbWJpOkJhdGFuZ2hhcmkKKzI6SUQ6SUROOklORE9ORVNJQTpKYW1iaTpCdW5nYXRlYm8KKzM6SUQ6SUROOklORE9ORVNJQTpKYW1iaTpLZXJpbmNpCis0OklEOklETjpJTkRPTkVTSUE6SmFtYmk6S29keWEgSmFtYmkKKzU6SUQ6SUROOklORE9ORVNJQTpKYW1iaTpTYXJhbGFuZ3VuCis2OklEOklETjpJTkRPTkVTSUE6SmFtYmk6VGFuanVuZyBKYWJ1bmcKKzE6SUQ6SUROOklORE9ORVNJQTpEa2kgSmFrYXJ0YTpKYWthcnRhIEJhcmF0CisyOklEOklETjpJTkRPTkVTSUE6RGtpIEpha2FydGE6SmFrYXJ0YSBQdXNhdAorMzpJRDpJRE46SU5ET05FU0lBOkRraSBKYWthcnRhOkpha2FydGEgU2VsYXRhbgorNDpJRDpJRE46SU5ET05FU0lBOkRraSBKYWthcnRhOkpha2FydGEgVGltdXIKKzU6SUQ6SUROOklORE9ORVNJQTpEa2kgSmFrYXJ0YTpKYWthcnRhIFV0YXJhCisxOklEOklETjpJTkRPTkVTSUE6U3VsYXdlc2kgU2VsYXRhbjpCYW50YWVuZworMjpJRDpJRE46SU5ET05FU0lBOlN1bGF3ZXNpIFNlbGF0YW46QmFycnUKKzM6SUQ6SUROOklORE9ORVNJQTpTdWxhd2VzaSBTZWxhdGFuOkJvbmUKKzQ6SUQ6SUROOklORE9ORVNJQTpTdWxhd2VzaSBTZWxhdGFuOkJ1bHVrdW1iYQorNTpJRDpJRE46SU5ET05FU0lBOlN1bGF3ZXNpIFNlbGF0YW46RW5yZWthbmcKKzY6SUQ6SUROOklORE9ORVNJQTpTdWxhd2VzaSBTZWxhdGFuOkdvd2EKKzc6SUQ6SUROOklORE9ORVNJQTpTdWxhd2VzaSBTZWxhdGFuOkplbmVwb250bworODpJRDpJRE46SU5ET05FU0lBOlN1bGF3ZXNpIFNlbGF0YW46S29keWEgUGFyZS1QYXJlCis5OklEOklETjpJTkRPTkVTSUE6U3VsYXdlc2kgU2VsYXRhbjpLb2R5YSBVanVuZyBQYW5kYW5nCisxMDpJRDpJRE46SU5ET05FU0lBOlN1bGF3ZXNpIFNlbGF0YW46THV3dQorMTE6SUQ6SUROOklORE9ORVNJQTpTdWxhd2VzaSBTZWxhdGFuOk1hamVuZQorMTI6SUQ6SUROOklORE9ORVNJQTpTdWxhd2VzaSBTZWxhdGFuOk1hbXVqdQorMTM6SUQ6SUROOklORE9ORVNJQTpTdWxhd2VzaSBTZWxhdGFuOlBhbmdrZXAKKzE0OklEOklETjpJTkRPTkVTSUE6U3VsYXdlc2kgU2VsYXRhbjpQaW5yYW5nCisxNTpJRDpJRE46SU5ET05FU0lBOlN1bGF3ZXNpIFNlbGF0YW46UG9sbWFzCisxNjpJRDpJRE46SU5ET05FU0lBOlN1bGF3ZXNpIFNlbGF0YW46U2VsYXlhcgorMTc6SUQ6SUROOklORE9ORVNJQTpTdWxhd2VzaSBTZWxhdGFuOlNpZHJhcAorMTg6SUQ6SUROOklORE9ORVNJQTpTdWxhd2VzaSBTZWxhdGFuOlNpbmphaQorMTk6SUQ6SUROOklORE9ORVNJQTpTdWxhd2VzaSBTZWxhdGFuOlNvcHBlbmcKKzIwOklEOklETjpJTkRPTkVTSUE6U3VsYXdlc2kgU2VsYXRhbjpUYWthbGFyCisyMTpJRDpJRE46SU5ET05FU0lBOlN1bGF3ZXNpIFNlbGF0YW46VGFuYXRvcmFqYQorMjI6SUQ6SUROOklORE9ORVNJQTpTdWxhd2VzaSBTZWxhdGFuOldham8KKzE6SUQ6SUROOklORE9ORVNJQTpLYWxpbWFudGFuIEJhcmF0OkthcHVhcyBIdWx1CisyOklEOklETjpJTkRPTkVTSUE6S2FsaW1hbnRhbiBCYXJhdDpLZXRhcGFuZworMzpJRDpJRE46SU5ET05FU0lBOkthbGltYW50YW4gQmFyYXQ6S29keWEgUG9udGlhbmFrCis0OklEOklETjpJTkRPTkVTSUE6S2FsaW1hbnRhbiBCYXJhdDpQb250aWFuYWsKKzU6SUQ6SUROOklORE9ORVNJQTpLYWxpbWFudGFuIEJhcmF0OlNhbWJhcworNjpJRDpJRE46SU5ET05FU0lBOkthbGltYW50YW4gQmFyYXQ6U2FuZ2dhdQorNzpJRDpJRE46SU5ET05FU0lBOkthbGltYW50YW4gQmFyYXQ6U2ludGFuZworMTpJRDpJRE46SU5ET05FU0lBOkJhbGk6QmFkdW5nCisyOklEOklETjpJTkRPTkVTSUE6QmFsaTpCYW5nbGkKKzM6SUQ6SUROOklORE9ORVNJQTpCYWxpOkJ1bGVsZW5nCis0OklEOklETjpJTkRPTkVTSUE6QmFsaTpHaWFueWFyCis1OklEOklETjpJTkRPTkVTSUE6QmFsaTpKZW1icmFuYQorNjpJRDpJRE46SU5ET05FU0lBOkJhbGk6S2FyYW5nYXNlbQorNzpJRDpJRE46SU5ET05FU0lBOkJhbGk6S2x1bmdrdW5nCis4OklEOklETjpJTkRPTkVTSUE6QmFsaTpUYWJhbmFuCisxOklEOklETjpJTkRPTkVTSUE6VGltb3IgVGltdXI6QWluYXJvCisyOklEOklETjpJTkRPTkVTSUE6VGltb3IgVGltdXI6QWxpZWF1CiszOklEOklETjpJTkRPTkVTSUE6VGltb3IgVGltdXI6QW1iZW5vCis0OklEOklETjpJTkRPTkVTSUE6VGltb3IgVGltdXI6QmF1Y2F1Cis1OklEOklETjpJTkRPTkVTSUE6VGltb3IgVGltdXI6Qm9ib25hcm8KKzY6SUQ6SUROOklORE9ORVNJQTpUaW1vciBUaW11cjpDb3ZhbGltYQorNzpJRDpJRE46SU5ET05FU0lBOlRpbW9yIFRpbXVyOkRpbGxpCis4OklEOklETjpJTkRPTkVTSUE6VGltb3IgVGltdXI6RXJtZXJhCis5OklEOklETjpJTkRPTkVTSUE6VGltb3IgVGltdXI6TGF1dGVtCisxMDpJRDpJRE46SU5ET05FU0lBOlRpbW9yIFRpbXVyOkxpcXVpY2EKKzExOklEOklETjpJTkRPTkVTSUE6VGltb3IgVGltdXI6TWFuYXR1dG8KKzEyOklEOklETjpJTkRPTkVTSUE6VGltb3IgVGltdXI6TWFudWZhaGkKKzEzOklEOklETjpJTkRPTkVTSUE6VGltb3IgVGltdXI6VmlxdWVxdWUKKzE6SUQ6SUROOklORE9ORVNJQTpMYW1wdW5nOktvZHlhIEJhbmRhcmxhbXB1bmcKKzI6SUQ6SUROOklORE9ORVNJQTpMYW1wdW5nOkxhbXB1bmcgU2VsYXRhbgorMzpJRDpJRE46SU5ET05FU0lBOkxhbXB1bmc6TGFtcHVuZyBUZW5nYWgKKzQ6SUQ6SUROOklORE9ORVNJQTpMYW1wdW5nOkxhbXB1bmcgVXRhcmEKKzE6SUQ6SUROOklORE9ORVNJQTpTdWxhd2VzaSBUZW5nYWg6QmFuZ2dhaQorMjpJRDpJRE46SU5ET05FU0lBOlN1bGF3ZXNpIFRlbmdhaDpCdW9sLVRvbGl0b2xpCiszOklEOklETjpJTkRPTkVTSUE6U3VsYXdlc2kgVGVuZ2FoOkRvbmdnYWxhCis0OklEOklETjpJTkRPTkVTSUE6U3VsYXdlc2kgVGVuZ2FoOlBvc28KKzE6SUQ6SUROOklORE9ORVNJQTpBY2VoOkFjZWggQmFyYXQKKzI6SUQ6SUROOklORE9ORVNJQTpBY2VoOkFjZWggQmVzYXIKKzM6SUQ6SUROOklORE9ORVNJQTpBY2VoOkFjZWggU2VsYXRhbgorNDpJRDpJRE46SU5ET05FU0lBOkFjZWg6QWNlaCBUZW5nYWgKKzU6SUQ6SUROOklORE9ORVNJQTpBY2VoOkFjZWggVGVuZ2dhcmEKKzY6SUQ6SUROOklORE9ORVNJQTpBY2VoOkFjZWggVGltdXIKKzc6SUQ6SUROOklORE9ORVNJQTpBY2VoOkFjZWggVXRhcmEKKzg6SUQ6SUROOklORE9ORVNJQTpBY2VoOktvZHlhIEJhbmRhIEFjZWgKKzk6SUQ6SUROOklORE9ORVNJQTpBY2VoOktvZHlhIFNhYmFuZworMTA6SUQ6SUROOklORE9ORVNJQTpBY2VoOlBpZGllCisxOklEOklETjpJTkRPTkVTSUE6QmVuZ2t1bHU6QmVuZ2t1bHUgU2VsYXRhbgorMjpJRDpJRE46SU5ET05FU0lBOkJlbmdrdWx1OkJlbmdrdWx1IFV0YXJhCiszOklEOklETjpJTkRPTkVTSUE6QmVuZ2t1bHU6S29keWEgTmVuZ2t1bHUKKzQ6SUQ6SUROOklORE9ORVNJQTpCZW5na3VsdTpSZWphbmcgTGVib25nCisxOklEOklETjpJTkRPTkVTSUE6TnVzYSBUZW5nZ2FyYSBUaW11cjpBbG9yCisyOklEOklETjpJTkRPTkVTSUE6TnVzYSBUZW5nZ2FyYSBUaW11cjpCZWx1CiszOklEOklETjpJTkRPTkVTSUE6TnVzYSBUZW5nZ2FyYSBUaW11cjpFbmRlCis0OklEOklETjpJTkRPTkVTSUE6TnVzYSBUZW5nZ2FyYSBUaW11cjpGbG9yZXMgVGltdXIKKzU6SUQ6SUROOklORE9ORVNJQTpOdXNhIFRlbmdnYXJhIFRpbXVyOkt1cGFuZworNjpJRDpJRE46SU5ET05FU0lBOk51c2EgVGVuZ2dhcmEgVGltdXI6TWFuZ2dhcmFpCis3OklEOklETjpJTkRPTkVTSUE6TnVzYSBUZW5nZ2FyYSBUaW11cjpOZ2FkYQorODpJRDpJRE46SU5ET05FU0lBOk51c2EgVGVuZ2dhcmEgVGltdXI6U2lra2EKKzk6SUQ6SUROOklORE9ORVNJQTpOdXNhIFRlbmdnYXJhIFRpbXVyOlN1bWJhIEJhcmF0CisxMDpJRDpJRE46SU5ET05FU0lBOk51c2EgVGVuZ2dhcmEgVGltdXI6U3VtYmEgVGltdXIKKzExOklEOklETjpJTkRPTkVTSUE6TnVzYSBUZW5nZ2FyYSBUaW11cjpUaW1vciBUZW5nYWggU2VsYXRhbgorMTI6SUQ6SUROOklORE9ORVNJQTpOdXNhIFRlbmdnYXJhIFRpbXVyOlRpbW9yIFRlbmdhaCBVdGFyYQorMTpJRDpJRE46SU5ET05FU0lBOk51c2EgVGVuZ2dhcmEgQmFyYXQ6QmltYQorMjpJRDpJRE46SU5ET05FU0lBOk51c2EgVGVuZ2dhcmEgQmFyYXQ6RG9tcHUKKzM6SUQ6SUROOklORE9ORVNJQTpOdXNhIFRlbmdnYXJhIEJhcmF0OkxvbWJvayBCYXJhdAorNDpJRDpJRE46SU5ET05FU0lBOk51c2EgVGVuZ2dhcmEgQmFyYXQ6TG9tYm9rIFRlbmdhaAorNTpJRDpJRE46SU5ET05FU0lBOk51c2EgVGVuZ2dhcmEgQmFyYXQ6TG9tYm9rIFRpbXVyCis2OklEOklETjpJTkRPTkVTSUE6TnVzYSBUZW5nZ2FyYSBCYXJhdDpTdW1iYXdhCisxOklEOklETjpJTkRPTkVTSUE6S2FsaW1hbnRhbiBUZW5nYWg6QmFyaXRvIFNlbGF0YW4KKzI6SUQ6SUROOklORE9ORVNJQTpLYWxpbWFudGFuIFRlbmdhaDpCYXJpdG8gVGltdXIKKzM6SUQ6SUROOklORE9ORVNJQTpLYWxpbWFudGFuIFRlbmdhaDpCYXJpdG8gVXRhcmEKKzQ6SUQ6SUROOklORE9ORVNJQTpLYWxpbWFudGFuIFRlbmdhaDpHdW51bmcgTWFzCis1OklEOklETjpJTkRPTkVTSUE6S2FsaW1hbnRhbiBUZW5nYWg6S2FwdWFzCis2OklEOklETjpJTkRPTkVTSUE6S2FsaW1hbnRhbiBUZW5nYWg6S2F0aW5nYW4KKzc6SUQ6SUROOklORE9ORVNJQTpLYWxpbWFudGFuIFRlbmdhaDpLb2R5YSBQYWxhbmdrYXJheWEKKzg6SUQ6SUROOklORE9ORVNJQTpLYWxpbWFudGFuIFRlbmdhaDpNdXJ1bmcgUmF5YQorOTpJRDpJRE46SU5ET05FU0lBOkthbGltYW50YW4gVGVuZ2FoOldhcmluZ2luIEJhcmF0CisxMDpJRDpJRE46SU5ET05FU0lBOkthbGltYW50YW4gVGVuZ2FoOldhcmluZ2luIFRpbXVyCisxOklEOklETjpJTkRPTkVTSUE6SmF3YSBUZW5nYWg6QmFuamFyIE5lZ2FyYQorMjpJRDpJRE46SU5ET05FU0lBOkphd2EgVGVuZ2FoOkJhbnl1bWFzCiszOklEOklETjpJTkRPTkVTSUE6SmF3YSBUZW5nYWg6QmF0YW5nCis0OklEOklETjpJTkRPTkVTSUE6SmF3YSBUZW5nYWg6QmxvcmEKKzU6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRlbmdhaDpCb3lvbGFsaQorNjpJRDpJRE46SU5ET05FU0lBOkphd2EgVGVuZ2FoOkJyZWJlcworNzpJRDpJRE46SU5ET05FU0lBOkphd2EgVGVuZ2FoOkNpbGFjYXAKKzg6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRlbmdhaDpEZW1haworOTpJRDpJRE46SU5ET05FU0lBOkphd2EgVGVuZ2FoOkdyb2JvbmdhbgorMTA6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRlbmdhaDpKZXBhcmEKKzExOklEOklETjpJTkRPTkVTSUE6SmF3YSBUZW5nYWg6S2FyYW5nYW55YXIKKzEyOklEOklETjpJTkRPTkVTSUE6SmF3YSBUZW5nYWg6S2VidW1lbgorMTM6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRlbmdhaDpLbGF0ZW4KKzE0OklEOklETjpJTkRPTkVTSUE6SmF3YSBUZW5nYWg6S29keWEgTWFnZWxhbmcKKzE1OklEOklETjpJTkRPTkVTSUE6SmF3YSBUZW5nYWg6S29keWEgUGVrYWxvbmdhbgorMTY6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRlbmdhaDpLb2R5YSBTYWxhdGlnYQorMTc6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRlbmdhaDpLb2R5YSBTZW1hcmFuZworMTg6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRlbmdhaDpLb2R5YSBTdXJha2FydGEKKzE5OklEOklETjpJTkRPTkVTSUE6SmF3YSBUZW5nYWg6S29keWEgVGVnYWwKKzIwOklEOklETjpJTkRPTkVTSUE6SmF3YSBUZW5nYWg6S3VkdXMKKzIxOklEOklETjpJTkRPTkVTSUE6SmF3YSBUZW5nYWg6TWFnZWxhbmcKKzIyOklEOklETjpJTkRPTkVTSUE6SmF3YSBUZW5nYWg6UGF0aQorMjM6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRlbmdhaDpQZWthbG9uZ2FuCisyNDpJRDpJRE46SU5ET05FU0lBOkphd2EgVGVuZ2FoOlBlbWFsYW5nCisyNTpJRDpJRE46SU5ET05FU0lBOkphd2EgVGVuZ2FoOlB1cmJhbGluZ2dhCisyNjpJRDpJRE46SU5ET05FU0lBOkphd2EgVGVuZ2FoOlB1cndvcmVkam8KKzI3OklEOklETjpJTkRPTkVTSUE6SmF3YSBUZW5nYWg6UmVtYmFuZworMjg6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRlbmdhaDpTZW1hcmFuZworMjk6SUQ6SUROOklORE9ORVNJQTpKYXdhIFRlbmdhaDpTcmFnZW4KKzMwOklEOklETjpJTkRPTkVTSUE6SmF3YSBUZW5nYWg6U3Vrb2hhcmpvCiszMTpJRDpJRE46SU5ET05FU0lBOkphd2EgVGVuZ2FoOlRlZ2FsCiszMjpJRDpJRE46SU5ET05FU0lBOkphd2EgVGVuZ2FoOlRlbWFuZ2d1bmcKKzMzOklEOklETjpJTkRPTkVTSUE6SmF3YSBUZW5nYWg6V29ub2dpcmkKKzM0OklEOklETjpJTkRPTkVTSUE6SmF3YSBUZW5nYWg6V29ub3NvYm8KKzE6SUQ6SUROOklORE9ORVNJQTpJcmlhbiBKYXlhOkZhay1GYWsKKzI6SUQ6SUROOklORE9ORVNJQTpJcmlhbiBKYXlhOkpheWFwdXJhCiszOklEOklETjpJTkRPTkVTSUE6SXJpYW4gSmF5YTpKYXlhd2lqYXlhCis0OklEOklETjpJTkRPTkVTSUE6SXJpYW4gSmF5YTpNYW5va3dhcmkKKzU6SUQ6SUROOklORE9ORVNJQTpJcmlhbiBKYXlhOk1lcmF1a2UKKzY6SUQ6SUROOklORE9ORVNJQTpJcmlhbiBKYXlhOlBhbmlhaQorNzpJRDpJRE46SU5ET05FU0lBOklyaWFuIEpheWE6U29yb25nCis4OklEOklETjpJTkRPTkVTSUE6SXJpYW4gSmF5YTpUZWx1ayBDZW5kZXJ3YXNpaAorOTpJRDpJRE46SU5ET05FU0lBOklyaWFuIEpheWE6WWFwZW4gV2Fyb3BlbgorMTpJRDpJRE46SU5ET05FU0lBOkthbGltYW50YW4gVGltdXI6QmVyYXUKKzI6SUQ6SUROOklORE9ORVNJQTpLYWxpbWFudGFuIFRpbXVyOkJ1bHVuZ2FuCiszOklEOklETjpJTkRPTkVTSUE6S2FsaW1hbnRhbiBUaW11cjpLb2R5YSBCYWxpa3BhcGFuCis0OklEOklETjpJTkRPTkVTSUE6S2FsaW1hbnRhbiBUaW11cjpLb2R5YSBTYW1hcmluZGEKKzU6SUQ6SUROOklORE9ORVNJQTpLYWxpbWFudGFuIFRpbXVyOkt1dGFpCis2OklEOklETjpJTkRPTkVTSUE6S2FsaW1hbnRhbiBUaW11cjpQYXNpcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JTkQvSU5EX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JTkQvSU5EX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZDYwM2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0lORC9JTkRfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwzNiBAQAorMTpJTi1OSUM6SU46QU5EQU1BTiAmIE5JQ09CQVIKKzI6SU4tQU46SU46QU5EQU1BTiBBTkQgTklDT0JBUiBJU0xBTkRTCiszOklOLUFQOklOOkFOREhSQSBQUkFERVNICis0OklOLUFSOklOOkFSVU5BQ0hBTCBQUkFERVNICis1OklOLUFTOklOOkFTU0FNCis2OklOLUJSOklOOkJJSEFSCis3OklOLUNIOklOOkNIQU5ESUdBUkgKKzg6SU4tQ1Q6SU46Q0hIQVRUQVNHQVJICis5OklOLUROOklOOkRBRFJBIEFORCBOQUdBUiBIQVZFTEkKKzEwOklOLUREOklOOkRBTUFOIEFORCBESVUKKzExOklOLURMOklOOkRFTEhJCisxMjpJTi1HQTpJTjpHT0EKKzEzOklOLUdKOklOOkdVSkFSQVQKKzE0OklOLUhSOklOOkhBUllBTkEKKzE1OklOLUhQOklOOkhJTUFDSEFMIFBSQURFU0gKKzE2OklOLUpLOklOOkpBTU1VIEFORCBLQVNITUlSCisxNzpJTi1KSDpJTjpKSEFSS0hBTkQKKzE4OklOLUtBOklOOktBUk5BVEFLQQorMTk6SU4tS0w6SU46S0VSQUxBCisyMDpJTi1MRDpJTjpMQUtTSEFEV0VFUAorMjE6SU4tTVA6SU46TUFESFlBIFBSQURFU0gKKzIyOklOLU1IOklOOk1BSEFSQVNIVFJBCisyMzpJTi1NTjpJTjpNQU5JUFVSCisyNDpJTi1NTDpJTjpNRUdIQUxBWUEKKzI1OklOLU1aOklOOk1JWk9SQU0KKzI2OklOLU5MOklOOk5BR0FMQU5ECisyNzpJTi1PUjpJTjpPUklTU0EKKzI4OklOLVBZOklOOlBPTkRJQ0hFUlJZCisyOTpJTi1QQjpJTjpQVU5KQUIKKzMwOklOLVJKOklOOlJBSkFTVEhBTgorMzE6SU4tU0s6SU46U0lLS0lNCiszMjpJTi1UTjpJTjpUQU1JTCBOQURVCiszMzpJTi1UUjpJTjpUUklQVVJBCiszNDpJTi1VUDpJTjpVVFRBUiBQUkFERVNICiszNTpJTi1VTDpJTjpVVFRBUkFOQ0hBTAorMzY6SU4tV0I6SU46V0VTVCBCRU5HQUwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSU5EL0lORF9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSU5EL0lORF9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGMwNGU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JTkQvSU5EX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsNDcwIEBACisxOklOOklORDpJTkRJQTpTaWtraW06RWFzdCBEaXN0cmljdAorMjpJTjpJTkQ6SU5ESUE6U2lra2ltOk5vcnRoIERpc3RyaWN0CiszOklOOklORDpJTkRJQTpTaWtraW06U291dGggRGlzdHJpY3QKKzQ6SU46SU5EOklORElBOlNpa2tpbTpXZXN0IERpc3RyaWN0CisxOklOOklORDpJTkRJQTpLYXJuYXRha2E6QmFuZ2Fsb3JlIFJ1cmFsCisyOklOOklORDpJTkRJQTpLYXJuYXRha2E6QmFuZ2Fsb3JlIFVyYmFuCiszOklOOklORDpJTkRJQTpLYXJuYXRha2E6QmVsZ2F1bQorNDpJTjpJTkQ6SU5ESUE6S2FybmF0YWthOkJlbGxhcnkKKzU6SU46SU5EOklORElBOkthcm5hdGFrYTpCaWRhcgorNjpJTjpJTkQ6SU5ESUE6S2FybmF0YWthOkJpamFwdXIKKzc6SU46SU5EOklORElBOkthcm5hdGFrYTpDaGlrbWFnYWx1cgorODpJTjpJTkQ6SU5ESUE6S2FybmF0YWthOkNoaXRyYWR1cmdhCis5OklOOklORDpJTkRJQTpLYXJuYXRha2E6RGFrc2hpbiBLYW5uYWQKKzEwOklOOklORDpJTkRJQTpLYXJuYXRha2E6RGhhcndhZAorMTE6SU46SU5EOklORElBOkthcm5hdGFrYTpHdWxiYXJnYQorMTI6SU46SU5EOklORElBOkthcm5hdGFrYTpIYXNzYW4KKzEzOklOOklORDpJTkRJQTpLYXJuYXRha2E6S29kYWd1CisxNDpJTjpJTkQ6SU5ESUE6S2FybmF0YWthOktvbGFyCisxNTpJTjpJTkQ6SU5ESUE6S2FybmF0YWthOk1hbmR5YQorMTY6SU46SU5EOklORElBOkthcm5hdGFrYTpNeXNvcmUKKzE3OklOOklORDpJTkRJQTpLYXJuYXRha2E6UmFpY2h1cgorMTg6SU46SU5EOklORElBOkthcm5hdGFrYTpTaGltb2dhCisxOTpJTjpJTkQ6SU5ESUE6S2FybmF0YWthOlR1bWt1cgorMjA6SU46SU5EOklORElBOkthcm5hdGFrYTpVdHRhciBLYW5uYWQKKzE6SU46SU5EOklORElBOk5hZ2FsYW5kOktvaGltYQorMjpJTjpJTkQ6SU5ESUE6TmFnYWxhbmQ6TW9rb2tjaHVuZworMzpJTjpJTkQ6SU5ESUE6TmFnYWxhbmQ6TW9uCis0OklOOklORDpJTkRJQTpOYWdhbGFuZDpQaGVrCis1OklOOklORDpJTkRJQTpOYWdhbGFuZDpUdWVzYW5nCis2OklOOklORDpJTkRJQTpOYWdhbGFuZDpXb2toYQorNzpJTjpJTkQ6SU5ESUE6TmFnYWxhbmQ6WnVuaGVib3RvCisxOklOOklORDpJTkRJQTpQdW5qYWI6QW1yaXRzYXIKKzI6SU46SU5EOklORElBOlB1bmphYjpCYXRoaW5kYQorMzpJTjpJTkQ6SU5ESUE6UHVuamFiOkZhaXJka290Cis0OklOOklORDpJTkRJQTpQdW5qYWI6Rmlyb3pwdXIKKzU6SU46SU5EOklORElBOlB1bmphYjpHdXJkYXNwdXIKKzY6SU46SU5EOklORElBOlB1bmphYjpIb3NoaWFycHVyCis3OklOOklORDpJTkRJQTpQdW5qYWI6SmFsYW5kaGFyCis4OklOOklORDpJTkRJQTpQdW5qYWI6S2FwdXJ0aGFsYQorOTpJTjpJTkQ6SU5ESUE6UHVuamFiOkx1ZGhpYW5hCisxMDpJTjpJTkQ6SU5ESUE6UHVuamFiOlBhdGlhbGEKKzExOklOOklORDpJTkRJQTpQdW5qYWI6UnVwbmFnYXIKKzEyOklOOklORDpJTkRJQTpQdW5qYWI6U2FuZ3J1cgorMTpJTjpJTkQ6SU5ESUE6RGVsaGk6RGVsaGkKKzE6SU46SU5EOklORElBOk1haGFyYXNodHJhOkFobWFkbmFnYXIKKzI6SU46SU5EOklORElBOk1haGFyYXNodHJhOkFrb2xhCiszOklOOklORDpJTkRJQTpNYWhhcmFzaHRyYTpBbXJhdmF0aQorNDpJTjpJTkQ6SU5ESUE6TWFoYXJhc2h0cmE6QXVyYW5nYWJhZAorNTpJTjpJTkQ6SU5ESUE6TWFoYXJhc2h0cmE6QmVlZAorNjpJTjpJTkQ6SU5ESUE6TWFoYXJhc2h0cmE6QmhhbmRhcmEKKzc6SU46SU5EOklORElBOk1haGFyYXNodHJhOkJ1bGRhbmEKKzg6SU46SU5EOklORElBOk1haGFyYXNodHJhOkNoYW5kcmFwdXIKKzk6SU46SU5EOklORElBOk1haGFyYXNodHJhOkRodWxlCisxMDpJTjpJTkQ6SU5ESUE6TWFoYXJhc2h0cmE6R2FyaGNoaXJvbGkKKzExOklOOklORDpJTkRJQTpNYWhhcmFzaHRyYTpHcmVhdGVyIEJvbWJheQorMTI6SU46SU5EOklORElBOk1haGFyYXNodHJhOkphbGdhb24KKzEzOklOOklORDpJTkRJQTpNYWhhcmFzaHRyYTpKYWxuYQorMTQ6SU46SU5EOklORElBOk1haGFyYXNodHJhOktvbGhhcHVyCisxNTpJTjpJTkQ6SU5ESUE6TWFoYXJhc2h0cmE6TGF0dXIKKzE2OklOOklORDpJTkRJQTpNYWhhcmFzaHRyYTpOYWdwdXIKKzE3OklOOklORDpJTkRJQTpNYWhhcmFzaHRyYTpOYW5kZWQKKzE4OklOOklORDpJTkRJQTpNYWhhcmFzaHRyYTpOYXNoaWsKKzE5OklOOklORDpJTkRJQTpNYWhhcmFzaHRyYTpPc21hbmFiYWQKKzIwOklOOklORDpJTkRJQTpNYWhhcmFzaHRyYTpQYXJiaGFuaQorMjE6SU46SU5EOklORElBOk1haGFyYXNodHJhOlB1bmUKKzIyOklOOklORDpJTkRJQTpNYWhhcmFzaHRyYTpSYWlnYXJoIChBbGliYWcpCisyMzpJTjpJTkQ6SU5ESUE6TWFoYXJhc2h0cmE6UmF0bmFnaXJpCisyNDpJTjpJTkQ6SU5ESUE6TWFoYXJhc2h0cmE6U2FuZ2xpCisyNTpJTjpJTkQ6SU5ESUE6TWFoYXJhc2h0cmE6U2F0YXJhCisyNjpJTjpJTkQ6SU5ESUE6TWFoYXJhc2h0cmE6U2luZGh1ZHVyZworMjc6SU46SU5EOklORElBOk1haGFyYXNodHJhOlNvbGFwdXIKKzI4OklOOklORDpJTkRJQTpNYWhhcmFzaHRyYTpUaGFuZQorMjk6SU46SU5EOklORElBOk1haGFyYXNodHJhOldhcmRoYQorMzA6SU46SU5EOklORElBOk1haGFyYXNodHJhOllhdmF0bWFsCisxOklOOklORDpJTkRJQTpBbmRocmEgUHJhZGVzaDpBZGlsYWJhZAorMjpJTjpJTkQ6SU5ESUE6QW5kaHJhIFByYWRlc2g6QW5hbnRhcHVyCiszOklOOklORDpJTkRJQTpBbmRocmEgUHJhZGVzaDpDaGl0dG9vcgorNDpJTjpJTkQ6SU5ESUE6QW5kaHJhIFByYWRlc2g6Q3VkZGFwYWgKKzU6SU46SU5EOklORElBOkFuZGhyYSBQcmFkZXNoOkVhc3QgR29kYXZhcmkKKzY6SU46SU5EOklORElBOkFuZGhyYSBQcmFkZXNoOkd1bnR1cgorNzpJTjpJTkQ6SU5ESUE6QW5kaHJhIFByYWRlc2g6SHlkZXJhYmFkCis4OklOOklORDpJTkRJQTpBbmRocmEgUHJhZGVzaDpLYXJpbW5hZ2FyCis5OklOOklORDpJTkRJQTpBbmRocmEgUHJhZGVzaDpLaGFtbWFtCisxMDpJTjpJTkQ6SU5ESUE6QW5kaHJhIFByYWRlc2g6S3Jpc2huYQorMTE6SU46SU5EOklORElBOkFuZGhyYSBQcmFkZXNoOkt1cm5vb2wKKzEyOklOOklORDpJTkRJQTpBbmRocmEgUHJhZGVzaDpNYWhidWJuYWdhcgorMTM6SU46SU5EOklORElBOkFuZGhyYSBQcmFkZXNoOk1lZGFrCisxNDpJTjpJTkQ6SU5ESUE6QW5kaHJhIFByYWRlc2g6TmFsZ29uZGEKKzE1OklOOklORDpJTkRJQTpBbmRocmEgUHJhZGVzaDpOZWxsb3JlCisxNjpJTjpJTkQ6SU5ESUE6QW5kaHJhIFByYWRlc2g6Tml6YW1hYmFkCisxNzpJTjpJTkQ6SU5ESUE6QW5kaHJhIFByYWRlc2g6UHJha2FzYW0KKzE4OklOOklORDpJTkRJQTpBbmRocmEgUHJhZGVzaDpSYW5nYXJlZGRpCisxOTpJTjpJTkQ6SU5ESUE6QW5kaHJhIFByYWRlc2g6U3Jpa2FrdWxhbQorMjA6SU46SU5EOklORElBOkFuZGhyYSBQcmFkZXNoOlZpc2hha2hhcGF0bmFtCisyMTpJTjpJTkQ6SU5ESUE6QW5kaHJhIFByYWRlc2g6Vml6aWFuYWdhcmFtCisyMjpJTjpJTkQ6SU5ESUE6QW5kaHJhIFByYWRlc2g6V2FyYW5nYWwKKzIzOklOOklORDpJTkRJQTpBbmRocmEgUHJhZGVzaDpXZXN0IEdvZGF2YXJpCisxOklOOklORDpJTkRJQTpDaGFuZGlnYXJoOkNoYW5kaWdhcmgKKzE6SU46SU5EOklORElBOkd1amFyYXQ6QWhtYWRhYmFkCisyOklOOklORDpJTkRJQTpHdWphcmF0OkFtcmVsaQorMzpJTjpJTkQ6SU5ESUE6R3VqYXJhdDpCYW5hcyBLYW50aGEKKzQ6SU46SU5EOklORElBOkd1amFyYXQ6QmhhcnVjaAorNTpJTjpJTkQ6SU5ESUE6R3VqYXJhdDpCaGF2bmFnYXIKKzY6SU46SU5EOklORElBOkd1amFyYXQ6R2FuZGhpbmFnYXIKKzc6SU46SU5EOklORElBOkd1amFyYXQ6SmFtbmFnYXIKKzg6SU46SU5EOklORElBOkd1amFyYXQ6SnVuYWdhZGgKKzk6SU46SU5EOklORElBOkd1amFyYXQ6S2FjaGNoaCAoQmh1aikKKzEwOklOOklORDpJTkRJQTpHdWphcmF0OktoZWRhCisxMTpJTjpJTkQ6SU5ESUE6R3VqYXJhdDpNYWhlc2FuYQorMTI6SU46SU5EOklORElBOkd1amFyYXQ6UGFuY2htYWhhbHMgKEdvZGhyYSkKKzEzOklOOklORDpJTkRJQTpHdWphcmF0OlJhamtvdAorMTQ6SU46SU5EOklORElBOkd1amFyYXQ6U2FiYXJrYW50aGEgKEhpbWF0bmFnYXIpCisxNTpJTjpJTkQ6SU5ESUE6R3VqYXJhdDpTdXJhdAorMTY6SU46SU5EOklORElBOkd1amFyYXQ6U3VyZW5kcmFuYWdhcgorMTc6SU46SU5EOklORElBOkd1amFyYXQ6VGhlIERhbmdzIChBaHdhKQorMTg6SU46SU5EOklORElBOkd1amFyYXQ6VmFkb2RhcmEKKzE5OklOOklORDpJTkRJQTpHdWphcmF0OlZhbHNhZAorMTpJTjpJTkQ6SU5ESUE6SmFtbXUgYW5kIEthc2htaXI6QW5hbnRuYWcgKEthc2htaXIgU291dGgpCisyOklOOklORDpJTkRJQTpKYW1tdSBhbmQgS2FzaG1pcjpCYWdkYW0KKzM6SU46SU5EOklORElBOkphbW11IGFuZCBLYXNobWlyOkJhcmFtdWxhIChLYXNobWlyIE5vcnRoKQorNDpJTjpJTkQ6SU5ESUE6SmFtbXUgYW5kIEthc2htaXI6RG9kYQorNTpJTjpJTkQ6SU5ESUE6SmFtbXUgYW5kIEthc2htaXI6SmFtbXUKKzY6SU46SU5EOklORElBOkphbW11IGFuZCBLYXNobWlyOkthcmdpbAorNzpJTjpJTkQ6SU5ESUE6SmFtbXUgYW5kIEthc2htaXI6S2F0aHVhCis4OklOOklORDpJTkRJQTpKYW1tdSBhbmQgS2FzaG1pcjpLdXB3YXJhIChNdXphZmZhcmFiYWQpCis5OklOOklORDpJTkRJQTpKYW1tdSBhbmQgS2FzaG1pcjpMYWRha2ggKExlaCkKKzEwOklOOklORDpJTkRJQTpKYW1tdSBhbmQgS2FzaG1pcjpNaXJwdXIKKzExOklOOklORDpJTkRJQTpKYW1tdSBhbmQgS2FzaG1pcjpQdWx3YW1hCisxMjpJTjpJTkQ6SU5ESUE6SmFtbXUgYW5kIEthc2htaXI6UHVuY2gKKzEzOklOOklORDpJTkRJQTpKYW1tdSBhbmQgS2FzaG1pcjpSYWphdXJpCisxNDpJTjpJTkQ6SU5ESUE6SmFtbXUgYW5kIEthc2htaXI6U3JpbmFnYXIKKzE1OklOOklORDpJTkRJQTpKYW1tdSBhbmQgS2FzaG1pcjpVZGhhbXB1cgorMTpJTjpJTkQ6SU5ESUE6TWFuaXB1cjpCaXNobnVwdXIKKzI6SU46SU5EOklORElBOk1hbmlwdXI6Q2hhbmRlbAorMzpJTjpJTkQ6SU5ESUE6TWFuaXB1cjpDaHVyYWNoYW5kcHVyCis0OklOOklORDpJTkRJQTpNYW5pcHVyOkltcGhhbAorNTpJTjpJTkQ6SU5ESUE6TWFuaXB1cjpJbXBoYWwgKENhY2hhcikgKHgpCis2OklOOklORDpJTkRJQTpNYW5pcHVyOlNlbmFwYXRpCis3OklOOklORDpJTkRJQTpNYW5pcHVyOlRhbWVuZ2xvbmcKKzg6SU46SU5EOklORElBOk1hbmlwdXI6VGhvdWJhbAorOTpJTjpJTkQ6SU5ESUE6TWFuaXB1cjpVa2hydWwKKzE6SU46SU5EOklORElBOlBvbmRpY2hlcnJ5OkthcmFpa2FsCisyOklOOklORDpJTkRJQTpQb25kaWNoZXJyeTpNYWhlCiszOklOOklORDpJTkRJQTpQb25kaWNoZXJyeTpQb25kaWNoZXJyeQorNDpJTjpJTkQ6SU5ESUE6UG9uZGljaGVycnk6WWFuYW0KKzE6SU46SU5EOklORElBOk1lZ2hhbGF5YTpFLiBHYXJvIEhpbGxzIChXaWxsaWFtbi4pCisyOklOOklORDpJTkRJQTpNZWdoYWxheWE6RS4gS2hhc2kgSGlsbHMgKFNoaWxsb25nKQorMzpJTjpJTkQ6SU5ESUE6TWVnaGFsYXlhOkphaW50aWEgSGlsbHMgKEpvd2FpKQorNDpJTjpJTkQ6SU5ESUE6TWVnaGFsYXlhOlcuIEdhcm8gSGlsbHMgKFR1cmEpCis1OklOOklORDpJTkRJQTpNZWdoYWxheWE6Vy4gS2hhc2kgSGlsbHMgKE5vbmdzdC4pCisxOklOOklORDpJTkRJQTpMYWtzaGFkd2VlcDpMYWNjYWRpdmUgSXNsYW5kcworMTpJTjpJTkQ6SU5ESUE6RGFtYW4gYW5kIERpdTpEYW1hbgorMjpJTjpJTkQ6SU5ESUE6RGFtYW4gYW5kIERpdTpEaXUKKzE6SU46SU5EOklORElBOlRhbWlsIE5hZHU6Q2hlbmdhaWFubmEKKzI6SU46SU5EOklORElBOlRhbWlsIE5hZHU6Q2hpZGFtYmFyYW5hcgorMzpJTjpJTkQ6SU5ESUE6VGFtaWwgTmFkdTpDb2ltYmF0b3JlCis0OklOOklORDpJTkRJQTpUYW1pbCBOYWR1OkRoYXJtYXB1cmkKKzU6SU46SU5EOklORElBOlRhbWlsIE5hZHU6S2FtYXJhamFyCis2OklOOklORDpJTkRJQTpUYW1pbCBOYWR1Okthbm5peWFrdW1hcmkKKzc6SU46SU5EOklORElBOlRhbWlsIE5hZHU6TWFkcmFzCis4OklOOklORDpJTkRJQTpUYW1pbCBOYWR1Ok1hZHVyYWkKKzk6SU46SU5EOklORElBOlRhbWlsIE5hZHU6TmlsZ2lyaXMKKzEwOklOOklORDpJTkRJQTpUYW1pbCBOYWR1Ok5vcnRoIEFyY290IChBbWJlZGthcikKKzExOklOOklORDpJTkRJQTpUYW1pbCBOYWR1OlBhc3VtcG9uIE11dGh1cmFtYWxpbmdhbQorMTI6SU46SU5EOklORElBOlRhbWlsIE5hZHU6UGVyaXlhcgorMTM6SU46SU5EOklORElBOlRhbWlsIE5hZHU6UHVkdWtrb3R0YWkKKzE0OklOOklORDpJTkRJQTpUYW1pbCBOYWR1OlF1YWlkZSBNaWxsZXRoCisxNTpJTjpJTkQ6SU5ESUE6VGFtaWwgTmFkdTpSYW1hbmF0aGFwdXJhbQorMTY6SU46SU5EOklORElBOlRhbWlsIE5hZHU6U2FsZW0KKzE3OklOOklORDpJTkRJQTpUYW1pbCBOYWR1OlNvdXRoIEFyY290CisxODpJTjpJTkQ6SU5ESUE6VGFtaWwgTmFkdTpUaGFuamF2dXIKKzE5OklOOklORDpJTkRJQTpUYW1pbCBOYWR1OlRpcnVjaGNoaXJhcHBhbGxpCisyMDpJTjpJTkQ6SU5ESUE6VGFtaWwgTmFkdTpUaXJ1bmVsdmVsaSBLYXR0YWJvbW1hbgorMjE6SU46SU5EOklORElBOlRhbWlsIE5hZHU6VGlydXZhbm5hbWFsYWkgU2FtYnV2YXJheQorMTpJTjpJTkQ6SU5ESUE6UmFqYXN0aGFuOkFqbWVyCisyOklOOklORDpJTkRJQTpSYWphc3RoYW46QWx3YXIKKzM6SU46SU5EOklORElBOlJhamFzdGhhbjpCYW5zd2FyYQorNDpJTjpJTkQ6SU5ESUE6UmFqYXN0aGFuOkJhcm1lcgorNTpJTjpJTkQ6SU5ESUE6UmFqYXN0aGFuOkJoYXJhdHB1cgorNjpJTjpJTkQ6SU5ESUE6UmFqYXN0aGFuOkJoaWx3YXJhCis3OklOOklORDpJTkRJQTpSYWphc3RoYW46QmlrYW5lcgorODpJTjpJTkQ6SU5ESUE6UmFqYXN0aGFuOkJ1bmRpCis5OklOOklORDpJTkRJQTpSYWphc3RoYW46Q2hpdHRhdXJnYXJoCisxMDpJTjpJTkQ6SU5ESUE6UmFqYXN0aGFuOkNodXJ1CisxMTpJTjpJTkQ6SU5ESUE6UmFqYXN0aGFuOkRhdWxwdXIKKzEyOklOOklORDpJTkRJQTpSYWphc3RoYW46RHVuZ2FycHVyCisxMzpJTjpJTkQ6SU5ESUE6UmFqYXN0aGFuOkdhbmdhbmdhcgorMTQ6SU46SU5EOklORElBOlJhamFzdGhhbjpKYWlwdXIKKzE1OklOOklORDpJTkRJQTpSYWphc3RoYW46SmFpc2FsbWVyCisxNjpJTjpJTkQ6SU5ESUE6UmFqYXN0aGFuOkphbG9yCisxNzpJTjpJTkQ6SU5ESUE6UmFqYXN0aGFuOkpoYWxhd2FyCisxODpJTjpJTkQ6SU5ESUE6UmFqYXN0aGFuOkpodW5qaHVudW4KKzE5OklOOklORDpJTkRJQTpSYWphc3RoYW46Sm9kaHB1cgorMjA6SU46SU5EOklORElBOlJhamFzdGhhbjpLb3RhCisyMTpJTjpJTkQ6SU5ESUE6UmFqYXN0aGFuOk5hZ2F1cgorMjI6SU46SU5EOklORElBOlJhamFzdGhhbjpQYWxpCisyMzpJTjpJTkQ6SU5ESUE6UmFqYXN0aGFuOlNhd2FpIE1hZGhvcHVyCisyNDpJTjpJTkQ6SU5ESUE6UmFqYXN0aGFuOlNpa2FyCisyNTpJTjpJTkQ6SU5ESUE6UmFqYXN0aGFuOlNpcm9oaQorMjY6SU46SU5EOklORElBOlJhamFzdGhhbjpUb25rCisyNzpJTjpJTkQ6SU5ESUE6UmFqYXN0aGFuOlVkYWlwdXIKKzE6SU46SU5EOklORElBOk9yaXNzYTpCYWxhbmdpcgorMjpJTjpJTkQ6SU5ESUE6T3Jpc3NhOkJhbGVzaHdhcgorMzpJTjpJTkQ6SU5ESUE6T3Jpc3NhOkN1dHRhY2sKKzQ6SU46SU5EOklORElBOk9yaXNzYTpEaGVua2FuYWwKKzU6SU46SU5EOklORElBOk9yaXNzYTpHYW5qYW0KKzY6SU46SU5EOklORElBOk9yaXNzYTpLYWxhaGFuZGkKKzc6SU46SU5EOklORElBOk9yaXNzYTpLZW5kdWpoYXIKKzg6SU46SU5EOklORElBOk9yaXNzYTpLb3JhcHV0Cis5OklOOklORDpJTkRJQTpPcmlzc2E6TWF5dXJiaGFuagorMTA6SU46SU5EOklORElBOk9yaXNzYTpQaHVsYmFuaQorMTE6SU46SU5EOklORElBOk9yaXNzYTpQdXJpCisxMjpJTjpJTkQ6SU5ESUE6T3Jpc3NhOlNhbWJhbHB1cgorMTM6SU46SU5EOklORElBOk9yaXNzYTpTdW5kYXJnYXJoCisxOklOOklORDpJTkRJQTpCaWhhcjpBcmFyaWEKKzI6SU46SU5EOklORElBOkJpaGFyOkF1cmFuZ2FiYWQKKzM6SU46SU5EOklORElBOkJpaGFyOkJlZ3VzYXJhaQorNDpJTjpJTkQ6SU5ESUE6QmloYXI6QmhhZ2FscHVyCis1OklOOklORDpJTkRJQTpCaWhhcjpCaG9qcHVyCis2OklOOklORDpJTkRJQTpCaWhhcjpEYXJiaGFuZ2EKKzc6SU46SU5EOklORElBOkJpaGFyOkRlb2doYXIKKzg6SU46SU5EOklORElBOkJpaGFyOkRoYW5iYWQKKzk6SU46SU5EOklORElBOkJpaGFyOkR1bWthIChTYW50YWwgUGFyZ2FuYSkKKzEwOklOOklORDpJTkRJQTpCaWhhcjpHYXlhCisxMTpJTjpJTkQ6SU5ESUE6QmloYXI6R2lyaWRpaAorMTI6SU46SU5EOklORElBOkJpaGFyOkdvZGRhCisxMzpJTjpJTkQ6SU5ESUE6QmloYXI6R29wYWxnYW5qCisxNDpJTjpJTkQ6SU5ESUE6QmloYXI6R3VtbGEKKzE1OklOOklORDpJTkRJQTpCaWhhcjpIYXphcmliYWcKKzE2OklOOklORDpJTkRJQTpCaWhhcjpKZWhhbmFiYWQKKzE3OklOOklORDpJTkRJQTpCaWhhcjpLYXRpaGFyCisxODpJTjpJTkQ6SU5ESUE6QmloYXI6S2hhZ2FyaWEKKzE5OklOOklORDpJTkRJQTpCaWhhcjpLaXNoYW5nYW5qCisyMDpJTjpJTkQ6SU5ESUE6QmloYXI6TG9oYXJkYWdhCisyMTpJTjpJTkQ6SU5ESUE6QmloYXI6TWFkaGVwdXJhCisyMjpJTjpJTkQ6SU5ESUE6QmloYXI6TWFkaHViYW5pCisyMzpJTjpJTkQ6SU5ESUE6QmloYXI6TXVuZ2VyCisyNDpJTjpJTkQ6SU5ESUE6QmloYXI6TXV6YWZmYXJwdXIKKzI1OklOOklORDpJTkRJQTpCaWhhcjpOYWxhbmRhCisyNjpJTjpJTkQ6SU5ESUE6QmloYXI6TmF3YWRhCisyNzpJTjpJTkQ6SU5ESUE6QmloYXI6UGFsYW11IChEYWx0ZW5nYW5qKQorMjg6SU46SU5EOklORElBOkJpaGFyOlBhc2NoaW0gQ2hhbXBhcmFuCisyOTpJTjpJTkQ6SU5ESUE6QmloYXI6UGFzaGNoaW1pIFNpbmdoYmh1bSAoQ2guKQorMzA6SU46SU5EOklORElBOkJpaGFyOlBhdG5hCiszMTpJTjpJTkQ6SU5ESUE6QmloYXI6UHVyYmkgQ2hhbXBhcmFuCiszMjpJTjpJTkQ6SU5ESUE6QmloYXI6UHVyYmkgU2luZ2hiaHVtCiszMzpJTjpJTkQ6SU5ESUE6QmloYXI6UHVybmlhCiszNDpJTjpJTkQ6SU5ESUE6QmloYXI6UmFuY2hpCiszNTpJTjpJTkQ6SU5ESUE6QmloYXI6Um9odGFzCiszNjpJTjpJTkQ6SU5ESUE6QmloYXI6U2FoYXJzYQorMzc6SU46SU5EOklORElBOkJpaGFyOlNhaGliZ2FuagorMzg6SU46SU5EOklORElBOkJpaGFyOlNhbWFzdGlwdXIKKzM5OklOOklORDpJTkRJQTpCaWhhcjpTYXJhbgorNDA6SU46SU5EOklORElBOkJpaGFyOlNpdGFtYXJoaQorNDE6SU46SU5EOklORElBOkJpaGFyOlNpd2FuCis0MjpJTjpJTkQ6SU5ESUE6QmloYXI6VmFpc2hhbGkKKzE6SU46SU5EOklORElBOk1pem9yYW06QWl6YXdsCisyOklOOklORDpJTkRJQTpNaXpvcmFtOkNoaGltdHVpcHVpCiszOklOOklORDpJTkRJQTpNaXpvcmFtOkx1bmdsZWkKKzE6SU46SU5EOklORElBOkhpbWFjaGFsIFByYWRlc2g6QmlsYXNwdXIKKzI6SU46SU5EOklORElBOkhpbWFjaGFsIFByYWRlc2g6Q2hhbWJhCiszOklOOklORDpJTkRJQTpIaW1hY2hhbCBQcmFkZXNoOkhhbWlycHVyCis0OklOOklORDpJTkRJQTpIaW1hY2hhbCBQcmFkZXNoOkthbmdyYQorNTpJTjpJTkQ6SU5ESUE6SGltYWNoYWwgUHJhZGVzaDpLaW5uYXVyCis2OklOOklORDpJTkRJQTpIaW1hY2hhbCBQcmFkZXNoOkt1bGx1Cis3OklOOklORDpJTkRJQTpIaW1hY2hhbCBQcmFkZXNoOkxhaHVsIGFuZCBTcGl0aQorODpJTjpJTkQ6SU5ESUE6SGltYWNoYWwgUHJhZGVzaDpNYW5kaQorOTpJTjpJTkQ6SU5ESUE6SGltYWNoYWwgUHJhZGVzaDpTaGltbGEKKzEwOklOOklORDpJTkRJQTpIaW1hY2hhbCBQcmFkZXNoOlNpcm1hdXIgKE5haGFuKQorMTE6SU46SU5EOklORElBOkhpbWFjaGFsIFByYWRlc2g6U29sYW4KKzEyOklOOklORDpJTkRJQTpIaW1hY2hhbCBQcmFkZXNoOlVuYQorMTpJTjpJTkQ6SU5ESUE6S2VyYWxhOkFsbGVwcGV5CisyOklOOklORDpJTkRJQTpLZXJhbGE6RXJuYWt1bGFtCiszOklOOklORDpJTkRJQTpLZXJhbGE6SWR1a2tpCis0OklOOklORDpJTkRJQTpLZXJhbGE6S2FubnVyIChDYW5uYW5vcmUpCis1OklOOklORDpJTkRJQTpLZXJhbGE6S2FzYXJhZ29kCis2OklOOklORDpJTkRJQTpLZXJhbGE6S29sbGFtIChRdWlsb24pCis3OklOOklORDpJTkRJQTpLZXJhbGE6S290dGF5YW0KKzg6SU46SU5EOklORElBOktlcmFsYTpLb3poaWtvZGUKKzk6SU46SU5EOklORElBOktlcmFsYTpNYWxhcHB1cmFtCisxMDpJTjpJTkQ6SU5ESUE6S2VyYWxhOlBhbGFra2FkIChQYWxnaGF0KQorMTE6SU46SU5EOklORElBOktlcmFsYTpQYXRoYW5hbXRoaXR0YQorMTI6SU46SU5EOklORElBOktlcmFsYTpUaGlydXZhbmFudGhhcHVyYW0gKFRyaXYpCisxMzpJTjpJTkQ6SU5ESUE6S2VyYWxhOlRyaXNzdXIgKFRyaWNodXIpCisxNDpJTjpJTkQ6SU5ESUE6S2VyYWxhOldheWFuYWQgKFd5bmFkKQorMTpJTjpJTkQ6SU5ESUE6QXJ1bmFjaGFsIFByYWRlc2g6Q2hhbmdsYW5nCisyOklOOklORDpJTkRJQTpBcnVuYWNoYWwgUHJhZGVzaDpEaWJhbmcgVmFsbGV5IChBbm5pKQorMzpJTjpJTkQ6SU5ESUE6QXJ1bmFjaGFsIFByYWRlc2g6RWFzdCBLYW1lbmcgKFNlcHBhKQorNDpJTjpJTkQ6SU5ESUE6QXJ1bmFjaGFsIFByYWRlc2g6RWFzdCBTaWFuZyAoQWxvbmcpCis1OklOOklORDpJTkRJQTpBcnVuYWNoYWwgUHJhZGVzaDpMb2hpdCAoVGVqdSkKKzY6SU46SU5EOklORElBOkFydW5hY2hhbCBQcmFkZXNoOkxvd2VyIFN1YmFuc2lyaSAoWmlybykKKzc6SU46SU5EOklORElBOkFydW5hY2hhbCBQcmFkZXNoOlRhd2FuZworODpJTjpJTkQ6SU5ESUE6QXJ1bmFjaGFsIFByYWRlc2g6VGlyYXAKKzk6SU46SU5EOklORElBOkFydW5hY2hhbCBQcmFkZXNoOlVwcGVyIFN1YmFuc2lyaSAoRGFwLikKKzEwOklOOklORDpJTkRJQTpBcnVuYWNoYWwgUHJhZGVzaDpXZXN0IEthbWVuZyAoQm9tZGlsYSkKKzExOklOOklORDpJTkRJQTpBcnVuYWNoYWwgUHJhZGVzaDpXZXN0IFNpYW5nCisxOklOOklORDpJTkRJQTpUcmlwdXJhOk5vcnRoIFRyaXB1cmEKKzI6SU46SU5EOklORElBOlRyaXB1cmE6U291dGggVHJpcHVyYQorMzpJTjpJTkQ6SU5ESUE6VHJpcHVyYTpXZXN0IFRyaXB1cmEKKzE6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6QWdyYQorMjpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpBbGlnYXJoCiszOklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOkFsbGFoYWJhZAorNDpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpBbG1vcmEKKzU6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6QXphbWdhcmgKKzY6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6QmFocmFpY2gKKzc6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6QmFsbGlhCis4OklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOkJhbmRhCis5OklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOkJhcmFiYW5raQorMTA6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6QmFyZWlsbHkKKzExOklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOkJhc3RpCisxMjpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpCaWpub3IKKzEzOklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOkJ1ZGF1bgorMTQ6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6QnVsYW5kc2hhaHIKKzE1OklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOkNoYW1vbGkKKzE2OklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOkRlaHJhIER1bgorMTc6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6RGVvcmlhCisxODpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpFdGFoCisxOTpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpFdGF3YWgKKzIwOklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOkZhaXphYmFkCisyMTpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpGYXJydWtoYWJhZAorMjI6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6RmF0ZWhwdXIKKzIzOklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOkZpcm96YWJhZAorMjQ6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6R2FyaHdhbAorMjU6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6R2F6aXB1cgorMjY6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6R2hhemlhYmFkCisyNzpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpHb25kYQorMjg6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6R29yYWtocHVyCisyOTpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpIYW1pcnB1cgorMzA6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6SGFyZG9pCiszMTpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpIYXJkd2FyCiszMjpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpKYWxhdW4KKzMzOklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOkphdW5wdXIKKzM0OklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOkpoYW5zaQorMzU6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6S2FuZHVyIE5hZ2FyCiszNjpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpLYW5wdXIgRGVoYXQKKzM3OklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOktoZXJpCiszODpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpMYWxpdHB1cgorMzk6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6THVja25vdworNDA6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6TWFoYXJhamdhbmoKKzQxOklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOk1haWoKKzQyOklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOk1haW5wdXJpCis0MzpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpNYXRodXJhCis0NDpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpNZWVydXQKKzQ1OklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOk1pcnphcHVyCis0NjpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpNb3JhZGFiYWQKKzQ3OklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOk11emFmZmFybmFnYXIKKzQ4OklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOk5haW5pdGFsCis0OTpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpQYXJ0YXBnYXJoCis1MDpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpQaWxpYmhpdAorNTE6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6UGl0aG9yYWdhcmgKKzUyOklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOlJhZSBCYXJlbGkKKzUzOklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOlJhbXB1cgorNTQ6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6U2FoYXJhbnB1cgorNTU6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6U2hhaGphaGFucHVyCis1NjpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpTaWRkaGFydGhuYWdhcgorNTc6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6U2l0YXB1cgorNTg6SU46SU5EOklORElBOlV0dGFyIFByYWRlc2g6U29uYmhhZHJhCis1OTpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpTdWx0YW5wdXIKKzYwOklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOlRlaHJpLUdhcmh3YWwKKzYxOklOOklORDpJTkRJQTpVdHRhciBQcmFkZXNoOlVubmFvCis2MjpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpVdHRhcmthc2hpCis2MzpJTjpJTkQ6SU5ESUE6VXR0YXIgUHJhZGVzaDpWYXJhbmFzaQorMTpJTjpJTkQ6SU5ESUE6QXNzYW06QmFycGV0YQorMjpJTjpJTkQ6SU5ESUE6QXNzYW06Qm9uZ2FpZ2FvbgorMzpJTjpJTkQ6SU5ESUE6QXNzYW06Q2FjaGFyCis0OklOOklORDpJTkRJQTpBc3NhbTpEYXJyYW5nIChNYW5nYWxkYWkpCis1OklOOklORDpJTkRJQTpBc3NhbTpEaGVtYWppCis2OklOOklORDpJTkRJQTpBc3NhbTpEaHVicmkKKzc6SU46SU5EOklORElBOkFzc2FtOkRpYnJ1Z2FyaAorODpJTjpJTkQ6SU5ESUE6QXNzYW06R29hbHBhcmEKKzk6SU46SU5EOklORElBOkFzc2FtOkdvbGFnaGF0CisxMDpJTjpJTkQ6SU5ESUE6QXNzYW06SGFqbGFrYW5kaQorMTE6SU46SU5EOklORElBOkFzc2FtOkpvcmhhdAorMTI6SU46SU5EOklORElBOkFzc2FtOkthbXJ1cAorMTM6SU46SU5EOklORElBOkFzc2FtOkthcmJpIEFuZ2xvbmcKKzE0OklOOklORDpJTkRJQTpBc3NhbTpLYXJiaSBBbmdsb25nIChEaXBodSkKKzE1OklOOklORDpJTkRJQTpBc3NhbTpLYXJpbWdhbmoKKzE2OklOOklORDpJTkRJQTpBc3NhbTpLb2tyYWpoYXIKKzE3OklOOklORDpJTkRJQTpBc3NhbTpMYWtoaW1wdXIKKzE4OklOOklORDpJTkRJQTpBc3NhbTpNYXJpZ2FvbgorMTk6SU46SU5EOklORElBOkFzc2FtOk4uIENhY2hhIEhpbGxzIChIYWZsb25nKQorMjA6SU46SU5EOklORElBOkFzc2FtOk5hZ2FvbgorMjE6SU46SU5EOklORElBOkFzc2FtOk5hbGJhcmkKKzIyOklOOklORDpJTkRJQTpBc3NhbTpTaWJzYWdhcgorMjM6SU46SU5EOklORElBOkFzc2FtOlNvbml0cHVyIChUZXpwdXIpCisyNDpJTjpJTkQ6SU5ESUE6QXNzYW06VGluc3VraWEKKzE6SU46SU5EOklORElBOk1hZGh5YSBQcmFkZXNoOkJhbGFnaGF0CisyOklOOklORDpJTkRJQTpNYWRoeWEgUHJhZGVzaDpCYXN0YXIgKEphZ2RhbHB1cikKKzM6SU46SU5EOklORElBOk1hZGh5YSBQcmFkZXNoOkJldHVsCis0OklOOklORDpJTkRJQTpNYWRoeWEgUHJhZGVzaDpCaGluZAorNTpJTjpJTkQ6SU5ESUE6TWFkaHlhIFByYWRlc2g6QmhvcGFsCis2OklOOklORDpJTkRJQTpNYWRoeWEgUHJhZGVzaDpCaWxhc3B1cgorNzpJTjpJTkQ6SU5ESUE6TWFkaHlhIFByYWRlc2g6Q2hoYXRyYXB1cgorODpJTjpJTkQ6SU5ESUE6TWFkaHlhIFByYWRlc2g6Q2hoaW5kd2FyYQorOTpJTjpJTkQ6SU5ESUE6TWFkaHlhIFByYWRlc2g6RGFtb2gKKzEwOklOOklORDpJTkRJQTpNYWRoeWEgUHJhZGVzaDpEYXRpYQorMTE6SU46SU5EOklORElBOk1hZGh5YSBQcmFkZXNoOkRld2FzCisxMjpJTjpJTkQ6SU5ESUE6TWFkaHlhIFByYWRlc2g6RGhhcgorMTM6SU46SU5EOklORElBOk1hZGh5YSBQcmFkZXNoOkR1cmcKKzE0OklOOklORDpJTkRJQTpNYWRoeWEgUHJhZGVzaDpFYXN0IE5pbWFyIChLaGFuZHdhKQorMTU6SU46SU5EOklORElBOk1hZGh5YSBQcmFkZXNoOkd1bmEKKzE2OklOOklORDpJTkRJQTpNYWRoeWEgUHJhZGVzaDpHd2FsaW9yCisxNzpJTjpJTkQ6SU5ESUE6TWFkaHlhIFByYWRlc2g6SG9zaGFuZ2FiYWQKKzE4OklOOklORDpJTkRJQTpNYWRoeWEgUHJhZGVzaDpJbmRvcmUKKzE5OklOOklORDpJTkRJQTpNYWRoeWEgUHJhZGVzaDpKYWJhbHB1cgorMjA6SU46SU5EOklORElBOk1hZGh5YSBQcmFkZXNoOkpoYWJ1YQorMjE6SU46SU5EOklORElBOk1hZGh5YSBQcmFkZXNoOk1hbmRsYQorMjI6SU46SU5EOklORElBOk1hZGh5YSBQcmFkZXNoOk1hbmRzYXVyCisyMzpJTjpJTkQ6SU5ESUE6TWFkaHlhIFByYWRlc2g6TW9yZW5hCisyNDpJTjpJTkQ6SU5ESUE6TWFkaHlhIFByYWRlc2g6TmFyc2ltaGFwdXIKKzI1OklOOklORDpJTkRJQTpNYWRoeWEgUHJhZGVzaDpQYW5uYQorMjY6SU46SU5EOklORElBOk1hZGh5YSBQcmFkZXNoOlJhaWdhcmgKKzI3OklOOklORDpJTkRJQTpNYWRoeWEgUHJhZGVzaDpSYWlwdXIKKzI4OklOOklORDpJTkRJQTpNYWRoeWEgUHJhZGVzaDpSYWlzZW4KKzI5OklOOklORDpJTkRJQTpNYWRoeWEgUHJhZGVzaDpSYWogTmFuZGdhb24KKzMwOklOOklORDpJTkRJQTpNYWRoeWEgUHJhZGVzaDpSYWpnYXJoCiszMTpJTjpJTkQ6SU5ESUE6TWFkaHlhIFByYWRlc2g6UmF0bGFtCiszMjpJTjpJTkQ6SU5ESUE6TWFkaHlhIFByYWRlc2g6UmV3YQorMzM6SU46SU5EOklORElBOk1hZGh5YSBQcmFkZXNoOlNhZ2FyCiszNDpJTjpJTkQ6SU5ESUE6TWFkaHlhIFByYWRlc2g6U2F0bmEKKzM1OklOOklORDpJTkRJQTpNYWRoeWEgUHJhZGVzaDpTZWhvcmUKKzM2OklOOklORDpJTkRJQTpNYWRoeWEgUHJhZGVzaDpTZW9uaQorMzc6SU46SU5EOklORElBOk1hZGh5YSBQcmFkZXNoOlNoYWhkb2wKKzM4OklOOklORDpJTkRJQTpNYWRoeWEgUHJhZGVzaDpTaGFqYXB1cgorMzk6SU46SU5EOklORElBOk1hZGh5YSBQcmFkZXNoOlNoaXZwdXJpCis0MDpJTjpJTkQ6SU5ESUE6TWFkaHlhIFByYWRlc2g6U2lkaGkKKzQxOklOOklORDpJTkRJQTpNYWRoeWEgUHJhZGVzaDpTdXJndWphIChBbWJpa2FwdXIpCis0MjpJTjpJTkQ6SU5ESUE6TWFkaHlhIFByYWRlc2g6VGlrYW1nYXJoCis0MzpJTjpJTkQ6SU5ESUE6TWFkaHlhIFByYWRlc2g6VWpqYWluCis0NDpJTjpJTkQ6SU5ESUE6TWFkaHlhIFByYWRlc2g6VmlkaXNoYQorNDU6SU46SU5EOklORElBOk1hZGh5YSBQcmFkZXNoOldlc3QgTmltYXIgKEtoYXJnb24pCisxOklOOklORDpJTkRJQTpXZXN0IEJlbmdhbDpCYW5rdXJhCisyOklOOklORDpJTkRJQTpXZXN0IEJlbmdhbDpCYXJkZGhhbWFuCiszOklOOklORDpJTkRJQTpXZXN0IEJlbmdhbDpCaXJiaHVtIChTaXR1cmkpCis0OklOOklORDpJTkRJQTpXZXN0IEJlbmdhbDpDYWxjdXR0YQorNTpJTjpJTkQ6SU5ESUE6V2VzdCBCZW5nYWw6RGFyamlsaW5nCis2OklOOklORDpJTkRJQTpXZXN0IEJlbmdhbDpIYW9yYQorNzpJTjpJTkQ6SU5ESUE6V2VzdCBCZW5nYWw6SHVnbGkgKENodW5jaHVyYSkKKzg6SU46SU5EOklORElBOldlc3QgQmVuZ2FsOkphbHBhaWd1cmkKKzk6SU46SU5EOklORElBOldlc3QgQmVuZ2FsOktvY2ggQmloYXIKKzEwOklOOklORDpJTkRJQTpXZXN0IEJlbmdhbDpNYWxkYWgKKzExOklOOklORDpJTkRJQTpXZXN0IEJlbmdhbDpNZWRpbmlwdXIKKzEyOklOOklORDpJTkRJQTpXZXN0IEJlbmdhbDpNdXJzaGlkYWJhZAorMTM6SU46SU5EOklORElBOldlc3QgQmVuZ2FsOk5hZGlhIChLcmlzaG5hbmFnYXIpCisxNDpJTjpJTkQ6SU5ESUE6V2VzdCBCZW5nYWw6Tm9ydGggMjQgUGFuZ2FuYXMKKzE1OklOOklORDpJTkRJQTpXZXN0IEJlbmdhbDpQdXJ1bGl5YQorMTY6SU46SU5EOklORElBOldlc3QgQmVuZ2FsOlNvdXRoIDI0IFBhbmdhbmFzCisxNzpJTjpJTkQ6SU5ESUE6V2VzdCBCZW5nYWw6V2VzdCBEaW5hanB1cgorMTpJTjpJTkQ6SU5ESUE6RGFkcmEgYW5kIE5hZ2FyIEhhdmVsaTooRGFkcmEpIGFuZCBOYWdhciBIYXZlbGkKKzI6SU46SU5EOklORElBOkRhZHJhIGFuZCBOYWdhciBIYXZlbGk6RGFkcmEgYW5kIChOYWdhciBIYXZlbGkpCisxOklOOklORDpJTkRJQTpIYXJ5YW5hOkFtYmFsYQorMjpJTjpJTkQ6SU5ESUE6SGFyeWFuYTpCaGl3YW5pCiszOklOOklORDpJTkRJQTpIYXJ5YW5hOkZhcmlkYWJhZAorNDpJTjpJTkQ6SU5ESUE6SGFyeWFuYTpHdXJnYW9uCis1OklOOklORDpJTkRJQTpIYXJ5YW5hOkhpc2FyCis2OklOOklORDpJTkRJQTpIYXJ5YW5hOkppbmQKKzc6SU46SU5EOklORElBOkhhcnlhbmE6S2FpdGhhbAorODpJTjpJTkQ6SU5ESUE6SGFyeWFuYTpLYXJuYWwKKzk6SU46SU5EOklORElBOkhhcnlhbmE6S3VydWtzaGV0cmEKKzEwOklOOklORDpJTkRJQTpIYXJ5YW5hOk1haGVuZHJhZ2FyaAorMTE6SU46SU5EOklORElBOkhhcnlhbmE6UGFuaXBhdAorMTI6SU46SU5EOklORElBOkhhcnlhbmE6UmV3YXJpCisxMzpJTjpJTkQ6SU5ESUE6SGFyeWFuYTpSb2h0YWsKKzE0OklOOklORDpJTkRJQTpIYXJ5YW5hOlNpcnNhCisxNTpJTjpJTkQ6SU5ESUE6SGFyeWFuYTpTb25pcGF0CisxNjpJTjpJTkQ6SU5ESUE6SGFyeWFuYTpZYW11bmFuYWdhcgorMTpJTjpJTkQ6SU5ESUE6QW5kYW1hbiAmIE5pY29iYXI6QW5kYW1hbiBJc2xhbmRzCisyOklOOklORDpJTkRJQTpBbmRhbWFuICYgTmljb2JhcjpOaWNvYmFyIElzbGFuZHMKKzE6SU46SU5EOklORElBOkdvYTpOb3J0aCBHb2EKKzI6SU46SU5EOklORElBOkdvYTpTb3V0aCBHb2EKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSVJML0lSTF9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSVJML0lSTF9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2JiMzBmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JUkwvSVJMX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMjcgQEAKKzE6SUUtQ1c6SUU6Q0FSTE9XCisyOklFLUNOOklFOkNBVkFOCiszOklFLUNFOklFOkNMQVJFCis0OklFLUM6SUU6Q09SSworNTpJRS1ETDpJRTpET05FR0FMCis2OklFLUQ6SUU6RFVCTElOCis3OklFLUc6SUU6R0FMV0FZCis4OklFLUk6SUU6SVJFTEFORAorOTpJRS1LWTpJRTpLRVJSWQorMTA6SUUtS0U6SUU6S0lMREFSRQorMTE6SUUtS0s6SUU6S0lMS0VOTlkKKzEyOklFLUxTOklFOkxBT0lTCisxMzpJRS1MTTpJRTpMRUlUUklNCisxNDpJRS1MSzpJRTpMSU1FUklDSworMTU6SUUtTEQ6SUU6TE9OR0ZPUkQKKzE2OklFLUxIOklFOkxPVVRICisxNzpJRS1NTzpJRTpNQVlPCisxODpJRS1NSDpJRTpNRUFUSAorMTk6SUUtTU46SUU6TU9OQUdIQU4KKzIwOklFLU9ZOklFOk9GRkFMWQorMjE6SUUtUk46SUU6Uk9TQ09NTU9OCisyMjpJRS1TTzpJRTpTTElHTworMjM6SUUtVEE6SUU6VElQUEVSQVJZCisyNDpJRS1XRDpJRTpXQVRFUkZPUkQKKzI1OklFLVdIOklFOldFU1RNRUFUSAorMjY6SUUtV1g6SUU6V0VYRk9SRAorMjc6SUUtV1c6SUU6V0lDS0xPVwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JUkwvSVJMX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JUkwvSVJMX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0lSTC9JUkxfQURNSU4yX0xFWC50eHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSVJOL0lSTl9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSVJOL0lSTl9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmVlYzk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JUk4vSVJOX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMzggQEAKKzE6SVItMDM6SVI6QVJEQUJMCisyOklSLUJLVDpJUjpCQUtIVEFSQU4KKzM6SVItMDY6SVI6QlVTSEVIUgorNDpJUi0wODpJUjpDSEFIQVJNQUhBTCBBTkQgQkFLSFRJQVIKKzU6SVItRUFaOklSOkVBU1QgQVpBUkJBWUVKQU4KKzY6SVItMDQ6SVI6RVNGQUhBTgorNzpJUi00OklSOkZBUlMKKzg6SVItOTpJUjpHSUxBTgorOTpJUi0yNzpJUjpHT0xFU1ROCisxMDpJUi0yNDpJUjpIQU1BREFOCisxMTpJUi1IU0E6SVI6SE9SQVNBTgorMTI6SVItMjM6SVI6SE9STU9aR0FOCisxMzpJUi0wNTpJUjpJTEFNCisxNDpJUi01OklSOktFUk1BTgorMTU6SVItNzpJUjpLRVJNTlNISAorMTY6SVItMDk6SVI6S0hPUlNOCisxNzpJUi0wOklSOktIVVpFU1RBTgorMTg6SVItMTA6SVI6S0haRVNUTgorMTk6SVItODpJUjpLT0hHSUxVWUVIICYgQk9ZRVIgQUhNQUQKKzIwOklSLTY6SVI6S09SREVTVEFOCisyMTpJUi1MUlM6SVI6TE9SRVNUQU4KKzIyOklSLTIwOklSOkxPUkVTVE4KKzIzOklSLTIyOklSOk1BUktBWgorMjQ6SVItTUtaOklSOk1BUktBWkkKKzI1OklSLU1aRDpJUjpNQVpBTkRBUkFOCisyNjpJUi0yOklSOk1aQU5EQVJOCisyNzpJUi0yODpJUjpRQVpWTgorMjg6SVItMjY6SVI6UU9NCisyOTpJUi1TRU06SVI6U0VNTkFOCiszMDpJUi1TQkw6SVI6U0lTVEFOIEFORCBCQUxVQ0hFU1RBTgorMzE6SVItMzpJUjpTU1ROIFZBIEJBTENIRVNUTgorMzI6SVItVEhSOklSOlRFSFJBTgorMzM6SVItMDc6SVI6VEVIUk4KKzM0OklSLVdBSjpJUjpXRVNUIEFaQVJCQVlFSkFOCiszNTpJUi0yNTpJUjpZQVpECiszNjpJUi1aOklSOlpBTkpBTgorMzc6SVItMTE6SVI6WkFOSk4KKzM4OklSLTAyOklSOlpBUkJZSk4gRSBHSEFSQgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JUk4vSVJOX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JUk4vSVJOX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZjE4MzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0lSTi9JUk5fQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSwxMDUgQEAKKzE6SVI6SVJOOklSQU46Q2hhaGFybWFoYWwgYW5kIEJha2h0aWFyOklSTi5MMi4zCisxOklSOklSTjpJUkFOOkJha2h0YXJhbjpJUk4uTDIuNQorMTpJUjpJUk46SVJBTjpTZW1uYW46SVJOLkwyLjE0CisxOklSOklSTjpJUkFOOkhvcm1vemdhbjpJUk4uTDIuNTQKKzI6SVI6SVJOOklSQU46SG9ybW96Z2FuOklSTi5MMi41NQorMzpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjU2Cis0OklSOklSTjpJUkFOOkhvcm1vemdhbjpJUk4uTDIuNTcKKzU6SVI6SVJOOklSQU46SG9ybW96Z2FuOklSTi5MMi41OAorNjpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjU5Cis3OklSOklSTjpJUkFOOkhvcm1vemdhbjpJUk4uTDIuNjAKKzg6SVI6SVJOOklSQU46SG9ybW96Z2FuOklSTi5MMi42MQorOTpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjYyCisxMDpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjYzCisxMTpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjY0CisxMjpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjY1CisxMzpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjY2CisxNDpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjY3CisxNTpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjY4CisxNjpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjY5CisxNzpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjcwCisxODpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjcxCisxOTpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjcyCisyMDpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjczCisyMTpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjc0CisyMjpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjc1CisyMzpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjc2CisyNDpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjc3CisyNTpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjc4CisyNjpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjc5CisyNzpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjgwCisyODpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjgxCisyOTpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjgyCiszMDpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjgzCiszMTpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjg0CiszMjpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjg1CiszMzpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjg2CiszNDpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjg3CiszNTpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjg4CiszNjpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjg5CiszNzpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjkwCiszODpJUjpJUk46SVJBTjpIb3Jtb3pnYW46SVJOLkwyLjkxCisxOklSOklSTjpJUkFOOktvaGdpbHV5ZWggJiBCb3llciBBaG1hZDpJUk4uTDIuNgorMTpJUjpJUk46SVJBTjpLZXJtYW46SVJOLkwyLjEzCisxOklSOklSTjpJUkFOOkdpbGFuOklSTi5MMi4xNworMTpJUjpJUk46SVJBTjpTaXN0YW4gYW5kIEJhbHVjaGVzdGFuOklSTi5MMi4xNQorMjpJUjpJUk46SVJBTjpTaXN0YW4gYW5kIEJhbHVjaGVzdGFuOklSTi5MMi4xNgorMTpJUjpJUk46SVJBTjpaYW5qYW46SVJOLkwyLjExCisxOklSOklSTjpJUkFOOkxvcmVzdGFuOklSTi5MMi4xOQorMTpJUjpJUk46SVJBTjpXZXN0IEF6YXJiYXllamFuOklSTi5MMi45CisxOklSOklSTjpJUkFOOllhemQ6SVJOLkwyLjEKKzE6SVI6SVJOOklSQU46RXNmYWhhbjpJUk4uTDIuOAorMTpJUjpJUk46SVJBTjpCdXNoZWhyOklSTi5MMi4xMDAKKzI6SVI6SVJOOklSQU46QnVzaGVocjpJUk4uTDIuMTAxCiszOklSOklSTjpJUkFOOkJ1c2hlaHI6SVJOLkwyLjEwMgorNDpJUjpJUk46SVJBTjpCdXNoZWhyOklSTi5MMi4xMDMKKzU6SVI6SVJOOklSQU46QnVzaGVocjpJUk4uTDIuMTA0Cis2OklSOklSTjpJUkFOOkJ1c2hlaHI6SVJOLkwyLjEwNQorNzpJUjpJUk46SVJBTjpCdXNoZWhyOklSTi5MMi45NAorODpJUjpJUk46SVJBTjpCdXNoZWhyOklSTi5MMi45NQorOTpJUjpJUk46SVJBTjpCdXNoZWhyOklSTi5MMi45NgorMTA6SVI6SVJOOklSQU46QnVzaGVocjpJUk4uTDIuOTcKKzExOklSOklSTjpJUkFOOkJ1c2hlaHI6SVJOLkwyLjk4CisxMjpJUjpJUk46SVJBTjpCdXNoZWhyOklSTi5MMi45OQorMTpJUjpJUk46SVJBTjpIYW1hZGFuOklSTi5MMi41MworMTpJUjpJUk46SVJBTjpNYXphbmRhcmFuOklSTi5MMi45MgorMjpJUjpJUk46SVJBTjpNYXphbmRhcmFuOklSTi5MMi45MworMTpJUjpJUk46SVJBTjpGYXJzOklSTi5MMi4xMAorMTpJUjpJUk46SVJBTjpNYXJrYXppOklSTi5MMi40CisxOklSOklSTjpJUkFOOkhvcmFzYW46SVJOLkwyLjIKKzE6SVI6SVJOOklSQU46S29yZGVzdGFuOklSTi5MMi4yMAorMTpJUjpJUk46SVJBTjpLaHV6ZXN0YW46SVJOLkwyLjIxCisyOklSOklSTjpJUkFOOktodXplc3RhbjpJUk4uTDIuMjIKKzM6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi4yMworNDpJUjpJUk46SVJBTjpLaHV6ZXN0YW46SVJOLkwyLjI0Cis1OklSOklSTjpJUkFOOktodXplc3RhbjpJUk4uTDIuMjUKKzY6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi4yNgorNzpJUjpJUk46SVJBTjpLaHV6ZXN0YW46SVJOLkwyLjI3Cis4OklSOklSTjpJUkFOOktodXplc3RhbjpJUk4uTDIuMjgKKzk6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi4yOQorMTA6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi4zMAorMTE6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi4zMQorMTI6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi4zMgorMTM6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi4zMworMTQ6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi4zNAorMTU6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi4zNQorMTY6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi4zNgorMTc6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi4zNworMTg6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi4zOAorMTk6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi4zOQorMjA6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi40MAorMjE6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi40MQorMjI6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi40MgorMjM6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi40MworMjQ6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi40NAorMjU6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi40NQorMjY6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi40NgorMjc6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi40NworMjg6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi40OAorMjk6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi40OQorMzA6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi41MAorMzE6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi41MQorMzI6SVI6SVJOOklSQU46S2h1emVzdGFuOklSTi5MMi41MgorMTpJUjpJUk46SVJBTjpJbGFtOklSTi5MMi43CisxOklSOklSTjpJUkFOOlRlaHJhbjpJUk4uTDIuMTgKKzE6SVI6SVJOOklSQU46RWFzdCBBemFyYmF5ZWphbjpJUk4uTDIuMTIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSVJRL0lSUV9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSVJRL0lSUV9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzQ1MTkxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JUlEvSVJRX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMTkgQEAKKzE6SVEtQU46SVE6QUwgQU5CQVIKKzI6SVEtQkE6SVE6QUwgQkFTUkFICiszOklRLU1VOklROkFMIE1VVEhBTk5JQQorNDpJUS1RQTpJUTpBTCBRQURJU0lZQUgKKzU6SVEtTkE6SVE6QU4gTkFKQUYKKzY6SVEtQVI6SVE6QVJCSUwKKzc6SVEtVFM6SVE6QVQgVEFNSU0KKzg6SVEtQkI6SVE6QkFCSUwKKzk6SVEtQkc6SVE6QkFHSERBRAorMTA6SVEtRFE6SVE6REhJIFFBUgorMTE6SVEtREE6SVE6RElIT0sKKzEyOklRLURJOklROkRJWUFMQQorMTM6SVEtTkVVOklROklSUS9TQVUgTkVVVFJBTCBaT05FCisxNDpJUS1LQTpJUTpLQVJCQUxBCisxNTpJUS1NQTpJUTpNSVNBTgorMTY6SVEtTkk6SVE6TkVJTkVWQQorMTc6SVEtU0Q6SVE6U0FMQUhVRERJTgorMTg6SVEtU1U6SVE6U1VMQVlNQU5JWUFICisxOTpJUS1XQTpJUTpXQVNJVApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JUlEvSVJRX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JUlEvSVJRX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMDJiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0lSUS9JUlFfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSwxOSBAQAorMTpJUTpJUlE6SVJBUTpBdC1UYW1pbTpJUlEuTDIuMTEKKzE6SVE6SVJROklSQVE6RGhpLVFhcjpJUlEuTDIuMTYKKzE6SVE6SVJROklSQVE6TWlzYW46SVJRLkwyLjMKKzE6SVE6SVJROklSQVE6QWwtQmFzcmFoOklSUS5MMi41CisxOklROklSUTpJUkFROklSUS9TQVUgTmV1dHJhbCBab25lOklSUS5MMi4xMAorMTpJUTpJUlE6SVJBUTpBcmJpbDpJUlEuTDIuMTQKKzE6SVE6SVJROklSQVE6TmVpbmV2YTpJUlEuTDIuMTkKKzE6SVE6SVJROklSQVE6U3VsYXltYW5peWFoOklSUS5MMi4xNworMTpJUTpJUlE6SVJBUTpEaXlhbGE6SVJRLkwyLjEyCisxOklROklSUTpJUkFROlNhbGFodWRkaW46SVJRLkwyLjYKKzE6SVE6SVJROklSQVE6QmFiaWw6SVJRLkwyLjE1CisxOklROklSUTpJUkFROkRpaG9rOklSUS5MMi4xMworMTpJUTpJUlE6SVJBUTpBbC1RYWRpc2l5YWg6SVJRLkwyLjIKKzE6SVE6SVJROklSQVE6QmFnaGRhZDpJUlEuTDIuNAorMTpJUTpJUlE6SVJBUTpBbi1OYWphZjpJUlEuTDIuMTgKKzE6SVE6SVJROklSQVE6S2FyYmFsYTpJUlEuTDIuNworMTpJUTpJUlE6SVJBUTpBbC1NdXRoYW5uaWE6SVJRLkwyLjgKKzE6SVE6SVJROklSQVE6QWwtQW5iYXI6SVJRLkwyLjkKKzE6SVE6SVJROklSQVE6V2FzaXQ6SVJRLkwyLjEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSVNML0lTTF9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSVNML0lTTF9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODhmYjIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JU0wvSVNMX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMTAgQEAKKzE6SVMtNzpJUzpBVVNUVVJMQU5ECisyOklTLTpJUzpIT0ZVT0JPUkdBUlNWQU9JIFVUQU4gUkVZS0pBVklLVVIKKzM6SVMtSTpJUzpJQ0VMQU5ECis0OklTLTY6SVM6Tk9ST1VSTEFORCBFWVNUUkEKKzU6SVMtNTpJUzpOT1JPVVJMQU5EIFZFU1RSQQorNjpJUy0wOklTOlJFWUtKQVZJSworNzpJUy04OklTOlNVT1VSTEFORAorODpJUy0yOklTOlNVT1VSTkVTCis5OklTLTQ6SVM6VkVTVEZJUk9JUgorMTA6SVMtMzpJUzpWRVNUVVJMQU5ECmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0lTTC9JU0xfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0lTTC9JU0xfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSVNML0lTTF9BRE1JTjJfTEVYLnR4dApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JVEEvSVRBX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JVEEvSVRBX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMTk0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0lUQS9JVEFfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxMjQgQEAKKzE6SVQtQUI6SVQ6QUJSVVpaSQorMjpJVC1BRzpJVDpBR1JJR0VOVE8KKzM6SVQtQUw6SVQ6QUxFU1NBTkRSSUEKKzQ6SVQtQU46SVQ6QU5DT05BCis1OklULUFPOklUOkFPU1RBCis2OklULUFSOklUOkFSRVpaTworNzpJVC1BUDpJVDpBU0NPTEkgUElDRU5PCis4OklULUFUOklUOkFTVEkKKzk6SVQtQVY6SVQ6QVZFTExJTk8KKzEwOklULUJBOklUOkJBUkkKKzExOklULUJDOklUOkJBU0lMSUNBVEEKKzEyOklULUJMOklUOkJFTExVTk8KKzEzOklULUJOOklUOkJFTkVWRU5UTworMTQ6SVQtQkc6SVQ6QkVSR0FNTworMTU6SVQtQkk6SVQ6QklFTExBCisxNjpJVC1CTzpJVDpCT0xPR05BCisxNzpJVC1CWjpJVDpCT0xaQU5PCisxODpJVC1CUzpJVDpCUkVTQ0lBCisxOTpJVC1CUjpJVDpCUklORElTSQorMjA6SVQtQ0E6SVQ6Q0FHTElBUkkKKzIxOklULUNJOklUOkNBTEFCUklBCisyMjpJVC1DTDpJVDpDQUxUQU5JU1NFVFRBCisyMzpJVC1DTTpJVDpDQU1QQU5JQQorMjQ6SVQtQ0I6SVQ6Q0FNUE9CQVNTTworMjU6SVQtQ0U6SVQ6Q0FTRVJUQQorMjY6SVQtQ1Q6SVQ6Q0FUQU5JQQorMjc6SVQtQ1o6SVQ6Q0FUQU5aQVJPCisyODpJVC1DSDpJVDpDSElFVEkKKzI5OklULUNPOklUOkNPTU8KKzMwOklULUNTOklUOkNPU0VOWkEKKzMxOklULUNSOklUOkNSRU1PTkEKKzMyOklULUtSOklUOkNST1RPTkUKKzMzOklULUNOOklUOkNVTkVPCiszNDpJVC1FUjpJVDpFTUlMSUEgUk9NQUdOQQorMzU6SVQtRU46SVQ6RU5OQQorMzY6SVQtRkU6SVQ6RkVSUkFSQQorMzc6SVQtRkk6SVQ6RklSRU5aRQorMzg6SVQtRkc6SVQ6Rk9HR0lBCiszOTpJVC1GTzpJVDpGT1JMzAorNDA6SVQtR0k6SVQ6RlJJVUxJIFZFTkVaSUEKKzQxOklULUZWOklUOkZSSVVMSSBWRU5FWklBIEdJVUxJQQorNDI6SVQtRlI6SVQ6RlJPU0lOT05FCis0MzpJVC1HRTpJVDpHRU5PVkEKKzQ0OklULUdPOklUOkdPUklaSUEKKzQ1OklULUdSOklUOkdST1NTRVRPCis0NjpJVC1JTTpJVDpJTVBFUklBCis0NzpJVC1JUzpJVDpJU0VSTklBCis0ODpJVC1TUDpJVDpMQSBTUEVaSUEKKzQ5OklULUFROklUOkxBUVVJTEEKKzUwOklULUxUOklUOkxBVElOQQorNTE6SVQtTEE6SVQ6TEFaSU8KKzUyOklULUxFOklUOkxFQ0NFCis1MzpJVC1MQzpJVDpMRUNDTworNTQ6SVQtTEc6SVQ6TElHVVJJQQorNTU6SVQtTEk6SVQ6TElWT1JOTworNTY6SVQtTE86SVQ6TE9ESQorNTc6SVQtTEI6SVQ6TE9NQkFSRElBCis1ODpJVC1MVTpJVDpMVUNDQQorNTk6SVQtTUM6SVQ6TUFDRVJBVEEKKzYwOklULU1OOklUOk1BTlRPVkEKKzYxOklULU1BOklUOk1BUkNIRQorNjI6SVQtTVM6SVQ6TUFTU0EgQ0FSUkFSQQorNjM6SVQtTVQ6SVQ6TUFURVJBCis2NDpJVC1NRTpJVDpNRVNTSU5BCis2NTpJVC1NSTpJVDpNSUxBTk8KKzY2OklULU1POklUOk1PREVOQQorNjc6SVQtTUw6SVQ6TU9MSVNFCis2ODpJVC1OQTpJVDpOQVBPTEkKKzY5OklULU5POklUOk5PVkFSQQorNzA6SVQtTlU6SVQ6TlVPUk8KKzcxOklULU9SOklUOk9SSVNUQU5PCis3MjpJVC1QRDpJVDpQQURPVkEKKzczOklULVBBOklUOlBBTEVSTU8KKzc0OklULVBSOklUOlBBUk1BCis3NTpJVC1QVjpJVDpQQVZJQQorNzY6SVQtUEc6SVQ6UEVSVUdJQQorNzc6SVQtUFM6SVQ6UEVTQVJPIEUgVVJCSU5PCis3ODpJVC1QRTpJVDpQRVNDQVJBCis3OTpJVC1QQzpJVDpQSUFDRU5aQQorODA6SVQtUE06SVQ6UElFTU9OVEUKKzgxOklULVBJOklUOlBJU0EKKzgyOklULVBUOklUOlBJU1RPSUEKKzgzOklULVBOOklUOlBPUkRFTk9ORQorODQ6SVQtUFo6SVQ6UE9URU5aQQorODU6SVQtUE86SVQ6UFJBVE8KKzg2OklULVBVOklUOlBVR0xJQQorODc6SVQtUkc6SVQ6UkFHVVNBCis4ODpJVC1SQTpJVDpSQVZFTk5BCis4OTpJVC1SQzpJVDpSRUdHSU8gQ0FMQUJSSUEKKzkwOklULVJFOklUOlJFR0dJTyBFTUlMSUEKKzkxOklULVJJOklUOlJJRVRJCis5MjpJVC1STjpJVDpSSU1JTkkKKzkzOklULVJNOklUOlJPTUEKKzk0OklULVJPOklUOlJPVklHTworOTU6SVQtU0E6SVQ6U0FMRVJOTworOTY6SVQtU0Q6SVQ6U0FSREVHTkEKKzk3OklULVNTOklUOlNBU1NBUkkKKzk4OklULVNWOklUOlNBVk9OQQorOTk6SVQtU0M6SVQ6U0lDSUxJQQorMTAwOklULVNJOklUOlNJRU5BCisxMDE6SVQtU1I6SVQ6U0lSQUNVU0EKKzEwMjpJVC1TTzpJVDpTT05EUklPCisxMDM6SVQtVEE6SVQ6VEFSQU5UTworMTA0OklULVRFOklUOlRFUkFNTworMTA1OklULVRSOklUOlRFUk5JCisxMDY6SVQtVE86SVQ6VE9SSU5PCisxMDc6SVQtVEM6SVQ6VE9TQ0FOQQorMTA4OklULVRQOklUOlRSQVBBTkkKKzEwOTpJVC1BRDpJVDpUUkVOVElOTyBBTFRPIEFESUdFCisxMTA6SVQtVE46SVQ6VFJFTlRPCisxMTE6SVQtVFY6SVQ6VFJFVklTTworMTEyOklULVRTOklUOlRSSUVTVEUKKzExMzpJVC1VRDpJVDpVRElORQorMTE0OklULVVNOklUOlVNQlJJQQorMTE1OklULUFTOklUOlZBTExFIEQnQU9TVEEKKzExNjpJVC1WQTpJVDpWQVJFU0UKKzExNzpJVC1WTjpJVDpWRU5FVE8KKzExODpJVC1WRTpJVDpWRU5FWklBCisxMTk6SVQtVkI6SVQ6VkVSQkFOTyBDVVNJTyBPU1NPTEEKKzEyMDpJVC1WQzpJVDpWRVJDRUxMSQorMTIxOklULVZSOklUOlZFUk9OQQorMTIyOklULVZWOklUOlZJQk8gVkFMRU5USUEKKzEyMzpJVC1WSTpJVDpWSUNFTlpBCisxMjQ6SVQtVlQ6SVQ6VklURVJCTwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JVEEvSVRBX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9JVEEvSVRBX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0lUQS9JVEFfQURNSU4yX0xFWC50eHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSk9SL0pPUl9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSk9SL0pPUl9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDcxMjFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9KT1IvSk9SX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMTIgQEAKKzE6Sk8tQVE6Sk86QUwgUUFCQQorMjpKTy1BTTpKTzpBTU1BTgorMzpKTy1JUjpKTzpJUkJJRAorNDpKTy1KQTpKTzpKQVJBU0gKKzU6Sk8tQUo6Sk86SkxOCis2OkpPLUtBOkpPOktBUkFLCis3OkpPLU1OOkpPOk1BIEFOCis4OkpPLU1BOkpPOk1BRlJBUQorOTpKTy1NRDpKTzpNREFCQQorMTA6Sk8tQkE6Sk86U0FMVCAoQkFMUUEpCisxMTpKTy1BVDpKTzpUQUZJTEEKKzEyOkpPLUFaOkpPOlpBUlFBCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0pPUi9KT1JfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0pPUi9KT1JfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc1N2MyNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSk9SL0pPUl9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDggQEAKKzE6Sk86Sk9SOkpPUkRBTjpaYXJxYTpKT1IuTDIuMgorMTpKTzpKT1I6Sk9SREFOOlNhbHQgKEJhbHFhKTpKT1IuTDIuNAorMTpKTzpKT1I6Sk9SREFOOkFtbWFuOkpPUi5MMi4xCisxOkpPOkpPUjpKT1JEQU46S2FyYWs6Sk9SLkwyLjgKKzE6Sk86Sk9SOkpPUkRBTjpNYWZyYXE6Sk9SLkwyLjMKKzE6Sk86Sk9SOkpPUkRBTjpNYS1hbjpKT1IuTDIuNgorMTpKTzpKT1I6Sk9SREFOOklyYmlkOkpPUi5MMi43CisxOkpPOkpPUjpKT1JEQU46VGFmaWxhOkpPUi5MMi41CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0pQTi9KUE5fQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0pQTi9KUE5fQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyZWJlYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvSlBOL0pQTl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDU2IEBACisxOkpQLTIzOkpQOkFJVEkgW0FJQ0hJXQorMjpKUC0wNTpKUDpBS0lUQQorMzpKUC0wMjpKUDpBT01PUkkKKzQ6SlAtQ0hCOkpQOkNIVUJVCis1OkpQLUNIRzpKUDpDSFVHT0tVCis2OkpQLTM4OkpQOkVISU1FCis3OkpQLTI6SlA6R0lIVSBbR0lGVV0KKzg6SlAtNTE6SlA6R1VOTUEKKzk6SlAtMzQ6SlA6SElST1NJTUEgW0hJUk9TSElNQV0KKzEwOkpQLTA6SlA6SE9LS0FJRE8gW0hPS0tBSURPXQorMTE6SlAtSFJJOkpQOkhPS1VSSUtVCisxMjpKUC04OkpQOkhVS1VJIFtGVUtVSV0KKzEzOkpQLTQwOkpQOkhVS1VPS0EgW0ZVS1VPS0FdCisxNDpKUC0wNzpKUDpIVUtVU0lNQSBbRlVLVVNISU1BXQorMTU6SlAtMjg6SlA6SFlPR08gW0hZT0dPXQorMTY6SlAtMDg6SlA6SUJBUkFLSQorMTc6SlAtNzpKUDpJU0lLQVdBIFtJU0hJS0FXQV0KKzE4OkpQLTQ0OkpQOklUQSBbT0lUQV0KKzE5OkpQLTAzOkpQOklXQVRFCisyMDpKUC0zNzpKUDpLQUdBV0EKKzIxOkpQLTQ2OkpQOktBR09TSU1BIFtLQUdPU0hJTUFdCisyMjpKUC00OkpQOktBTkFHQVdBCisyMzpKUC1LTlQ6SlA6S0FOVE8KKzI0OkpQLUtJTjpKUDpLSU5LSQorMjU6SlAtMzk6SlA6S09USSBbS09DSEldCisyNjpKUC00MzpKUDpLVU1BTU9UTworMjc6SlAtMjY6SlA6S1lPVE8gW0tZT1RPXQorMjg6SlAtS1lVOkpQOktZVVNIVQorMjk6SlAtMjQ6SlA6TUlFCiszMDpKUC0wNDpKUDpNSVlBR0kKKzMxOkpQLTQ1OkpQOk1JWUFaQUtJCiszMjpKUC0yMDpKUDpOQUdBTk8KKzMzOkpQLTQyOkpQOk5BR0FTQUtJCiszNDpKUC0yOTpKUDpOQVJBCiszNTpKUC01OkpQOk5JSUdBVEEKKzM2OkpQLTMzOkpQOk9LQVlBTUEKKzM3OkpQLTQ3OkpQOk9LSU5BV0EKKzM4OkpQLVJZVTpKUDpSWVVLSVUgSVNMQU5EUworMzk6SlAtNTA6SlA6U0FJVEFNQQorNDA6SlAtMjc6SlA6U0FLQSBbT1NBS0FdCis0MTpKUC1TS086SlA6U0hJS09LVQorNDI6SlAtMjU6SlA6U0lHQSBbU0hJR0FdCis0MzpKUC0zMjpKUDpTSU1BTkUgW1NISU1BTkVdCis0NDpKUC0yMjpKUDpTSVpVT0tBIFtTSElaVU9LQV0KKzQ1OkpQLTUyOkpQOlRJQkEgW0NISUJBXQorNDY6SlAtVE9IOkpQOlRPSE9LVQorNDc6SlAtVEFJOkpQOlRPS0FJCis0ODpKUC0zNjpKUDpUT0tVU0lNQSBbVE9LVVNISU1BXQorNDk6SlAtNTM6SlA6VE9LWU8gW1RPS1lPXQorNTA6SlAtMDk6SlA6VE9USUdJIFtUT0NISUdJXQorNTE6SlAtMzpKUDpUT1RUT1JJCis1MjpKUC02OkpQOlRPWUFNQQorNTM6SlAtMzA6SlA6V0FLQVlBTUEKKzU0OkpQLTA2OkpQOllBTUFHQVRBCis1NTpKUC0zNTpKUDpZQU1BR1VUSSBbWUFNQUdVQ0hJXQorNTY6SlAtOTpKUDpZQU1BTkFTSSBbWUFNQU5BU0hJXQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9KUE4vSlBOX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9KUE4vSlBOX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MTFjMjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0pQTi9KUE5fQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSw0NyBAQAorMTpKUDpKUE46SkFQQU46SG9rdXJpa3U6RnVrdWkKKzI6SlA6SlBOOkpBUEFOOkhva3VyaWt1OklzaGlrYXdhCiszOkpQOkpQTjpKQVBBTjpIb2t1cmlrdTpOaWlnYXRhCis0OkpQOkpQTjpKQVBBTjpIb2t1cmlrdTpUb3lhbWEKKzE6SlA6SlBOOkpBUEFOOktpbmtpOkh5b2dvCisyOkpQOkpQTjpKQVBBTjpLaW5raTpLeW90bworMzpKUDpKUE46SkFQQU46S2lua2k6TmFyYQorNDpKUDpKUE46SkFQQU46S2lua2k6T3Nha2EKKzU6SlA6SlBOOkpBUEFOOktpbmtpOlNoaWdhCis2OkpQOkpQTjpKQVBBTjpLaW5raTpXYWtheWFtYQorMTpKUDpKUE46SkFQQU46Q2h1Z29rdTpIaXJvc2hpbWEKKzI6SlA6SlBOOkpBUEFOOkNodWdva3U6T2thamFtYQorMzpKUDpKUE46SkFQQU46Q2h1Z29rdTpTaGltYW5lCis0OkpQOkpQTjpKQVBBTjpDaHVnb2t1OlRvdHRvcmkKKzU6SlA6SlBOOkpBUEFOOkNodWdva3U6WWFtYWd1Y2hpCisxOkpQOkpQTjpKQVBBTjpLeXVzaHU6RnVrdW9rYQorMjpKUDpKUE46SkFQQU46S3l1c2h1OkthZ29zaGltYQorMzpKUDpKUE46SkFQQU46S3l1c2h1Okt1bWFtb3RvCis0OkpQOkpQTjpKQVBBTjpLeXVzaHU6TWl5YXpha2kKKzU6SlA6SlBOOkpBUEFOOkt5dXNodTpOYWdhc2FraQorNjpKUDpKUE46SkFQQU46S3l1c2h1Ok9pdGEKKzc6SlA6SlBOOkpBUEFOOkt5dXNodTpTYWdhCisxOkpQOkpQTjpKQVBBTjpDaHVidTpHaWZ1CisyOkpQOkpQTjpKQVBBTjpDaHVidTpOYWdhbm8KKzM6SlA6SlBOOkpBUEFOOkNodWJ1OllhbWFuYXNoaQorMTpKUDpKUE46SkFQQU46Unl1a2l1LUlzbGFuZHM6T2tpbmF3YQorMTpKUDpKUE46SkFQQU46VG9rYWk6QWljaGkKKzI6SlA6SlBOOkpBUEFOOlRva2FpOk1pZQorMzpKUDpKUE46SkFQQU46VG9rYWk6U2hpenVva2EKKzE6SlA6SlBOOkpBUEFOOlRvaG9rdTpBa2l0YQorMjpKUDpKUE46SkFQQU46VG9ob2t1OkFvbW9yaQorMzpKUDpKUE46SkFQQU46VG9ob2t1OkZ1a3VzaGltYQorNDpKUDpKUE46SkFQQU46VG9ob2t1Okl3YXRlCis1OkpQOkpQTjpKQVBBTjpUb2hva3U6TWl5YWdpCis2OkpQOkpQTjpKQVBBTjpUb2hva3U6WWFtYWdhdGEKKzE6SlA6SlBOOkpBUEFOOkhva2thaWRvOkhva2thaWRvCisxOkpQOkpQTjpKQVBBTjpLYW50bzpHdW1tYQorMjpKUDpKUE46SkFQQU46S2FudG86SWJhcmFraQorMzpKUDpKUE46SkFQQU46S2FudG86S2FuYWdhd2EKKzQ6SlA6SlBOOkpBUEFOOkthbnRvOlNhaXRhbWEKKzU6SlA6SlBOOkpBUEFOOkthbnRvOlRvY2hpZ2kKKzY6SlA6SlBOOkpBUEFOOkthbnRvOlRva3lvCis3OkpQOkpQTjpKQVBBTjpLYW50bzpUc2hpYmEKKzE6SlA6SlBOOkpBUEFOOlNoaWtva3U6RWhpbWUKKzI6SlA6SlBOOkpBUEFOOlNoaWtva3U6S2FnYXdhCiszOkpQOkpQTjpKQVBBTjpTaGlrb2t1OktvY2hpCis0OkpQOkpQTjpKQVBBTjpTaGlrb2t1OlRva3VzaGltYQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9LQVovS0FaX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9LQVovS0FaX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOGI0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0tBWi9LQVpfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwyOSBAQAorMTpLWi1BS1Q6S1o6QUtUWVVCSU5TSworMjpLWi1BTE06S1o6QUxNQSBBVEEKKzM6S1otQUxBOktaOkFMTUFUWQorNDpLWi1BS006S1o6QVFNT0xBIE9CTFlTWQorNTpLWi1BUlM6S1o6QVJBTCBTRUEKKzY6S1otQVNUOktaOkFTVEFOQQorNzpLWi1BVFk6S1o6QVRZUkFVIE9CTFlTWQorODpLWi1aQVA6S1o6QkFUWVMgUUFaQVFTVEFOIE9CTFlTWQorOTpLWi1DSEk6S1o6Q0hJTUtFTlQKKzEwOktaLURaQTpLWjpEWkhBTUJVTAorMTE6S1otRFpFOktaOkRaSEVaS0FaR0FOCisxMjpLWi1FQUs6S1o6RUFTVCBLQVpBS0hTVEFOCisxMzpLWi1HVVI6S1o6R1VSWUVWCisxNDpLWi1LQVI6S1o6S0FSQUdBTkRBCisxNTpLWi1LT0M6S1o6S09DSEVUQVYKKzE2OktaLUtVUzpLWjpLVVNUQU5BWQorMTc6S1otS1pPOktaOktaWUwgT1JEQQorMTg6S1otTUFOOktaOk1BTkdHSFlTVEFVIE9CTFlTWQorMTk6S1otTk9LOktaOk5PUlRIIEtBWkFLSFNUQU4KKzIwOktaLVlVWjpLWjpPTkdU3FNUSUsgUUFaQVFTVEFOIE9CTFlTWQorMjE6S1otUEFWOktaOlBBVkxPREFSCisyMjpLWi1LWlk6S1o6UVlaWUxPUkRBIE9CTFlTWQorMjM6S1otU0VNOktaOlNFTUlQQUxBVElOU0sKKzI0OktaLVZPUzpLWjpTSFlHSFlTIFFBWkFRU1RBTiBPQkxZU1kKKzI1OktaLVNFVjpLWjpTT0xU3FNUSUsgUUFaQVFTVEFOIE9CTFlTWQorMjY6S1otVEFLOktaOlRBTERZIEtVUkdBTgorMjc6S1otVFNFOktaOlRTRUxJTk9HUkFECisyODpLWi1VUkE6S1o6VVJBTFNLCisyOTpLWi1aSEE6S1o6WkhBTUJZTCBPQkxZU1kKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvS0FaL0tBWl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvS0FaL0tBWl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGZiNTAwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9LQVovS0FaX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsNTQgQEAKKzE6S1o6S0FaOktBWkFLSFNUQU46Q2hpbWtlbnQ6S0FaLkwyLjcKKzE6S1o6S0FaOktBWkFLSFNUQU46VGFsZHkgS3VyZ2FuOktBWi5MMi41NAorMTpLWjpLQVo6S0FaQUtIU1RBTjpTZW1pcGFsYXRpbnNrOktBWi5MMi41CisxOktaOktBWjpLQVpBS0hTVEFOOlVyYWxzazpLQVouTDIuOQorMTpLWjpLQVo6S0FaQUtIU1RBTjpLenlsLU9yZGE6S0FaLkwyLjUxCisxOktaOktBWjpLQVpBS0hTVEFOOk5vcnRoIEthemFraHN0YW46S0FaLkwyLjMKKzE6S1o6S0FaOktBWkFLSFNUQU46QXJhbCBTZWE6S0FaLkwyLjExCisyOktaOktBWjpLQVpBS0hTVEFOOkFyYWwgU2VhOktBWi5MMi4xMgorMzpLWjpLQVo6S0FaQUtIU1RBTjpBcmFsIFNlYTpLQVouTDIuMTMKKzQ6S1o6S0FaOktBWkFLSFNUQU46QXJhbCBTZWE6S0FaLkwyLjE0Cis1OktaOktBWjpLQVpBS0hTVEFOOkFyYWwgU2VhOktBWi5MMi4xNQorNjpLWjpLQVo6S0FaQUtIU1RBTjpBcmFsIFNlYTpLQVouTDIuMTYKKzc6S1o6S0FaOktBWkFLSFNUQU46QXJhbCBTZWE6S0FaLkwyLjE3Cis4OktaOktBWjpLQVpBS0hTVEFOOkFyYWwgU2VhOktBWi5MMi4xOAorOTpLWjpLQVo6S0FaQUtIU1RBTjpBcmFsIFNlYTpLQVouTDIuMTkKKzEwOktaOktBWjpLQVpBS0hTVEFOOkFyYWwgU2VhOktBWi5MMi4yMAorMTE6S1o6S0FaOktBWkFLSFNUQU46QXJhbCBTZWE6S0FaLkwyLjIxCisxMjpLWjpLQVo6S0FaQUtIU1RBTjpBcmFsIFNlYTpLQVouTDIuMjIKKzEzOktaOktBWjpLQVpBS0hTVEFOOkFyYWwgU2VhOktBWi5MMi4yMworMTQ6S1o6S0FaOktBWkFLSFNUQU46QXJhbCBTZWE6S0FaLkwyLjI0CisxNTpLWjpLQVo6S0FaQUtIU1RBTjpBcmFsIFNlYTpLQVouTDIuMjUKKzE2OktaOktBWjpLQVpBS0hTVEFOOkFyYWwgU2VhOktBWi5MMi4yNgorMTc6S1o6S0FaOktBWkFLSFNUQU46QXJhbCBTZWE6S0FaLkwyLjI3CisxODpLWjpLQVo6S0FaQUtIU1RBTjpBcmFsIFNlYTpLQVouTDIuMjgKKzE5OktaOktBWjpLQVpBS0hTVEFOOkFyYWwgU2VhOktBWi5MMi4yOQorMjA6S1o6S0FaOktBWkFLSFNUQU46QXJhbCBTZWE6S0FaLkwyLjMwCisyMTpLWjpLQVo6S0FaQUtIU1RBTjpBcmFsIFNlYTpLQVouTDIuMzEKKzIyOktaOktBWjpLQVpBS0hTVEFOOkFyYWwgU2VhOktBWi5MMi4zMgorMjM6S1o6S0FaOktBWkFLSFNUQU46QXJhbCBTZWE6S0FaLkwyLjMzCisyNDpLWjpLQVo6S0FaQUtIU1RBTjpBcmFsIFNlYTpLQVouTDIuMzQKKzI1OktaOktBWjpLQVpBS0hTVEFOOkFyYWwgU2VhOktBWi5MMi4zNQorMjY6S1o6S0FaOktBWkFLSFNUQU46QXJhbCBTZWE6S0FaLkwyLjM2CisyNzpLWjpLQVo6S0FaQUtIU1RBTjpBcmFsIFNlYTpLQVouTDIuMzcKKzI4OktaOktBWjpLQVpBS0hTVEFOOkFyYWwgU2VhOktBWi5MMi4zOAorMjk6S1o6S0FaOktBWkFLSFNUQU46QXJhbCBTZWE6S0FaLkwyLjM5CiszMDpLWjpLQVo6S0FaQUtIU1RBTjpBcmFsIFNlYTpLQVouTDIuNDAKKzMxOktaOktBWjpLQVpBS0hTVEFOOkFyYWwgU2VhOktBWi5MMi40MQorMzI6S1o6S0FaOktBWkFLSFNUQU46QXJhbCBTZWE6S0FaLkwyLjQyCiszMzpLWjpLQVo6S0FaQUtIU1RBTjpBcmFsIFNlYTpLQVouTDIuNDMKKzM0OktaOktBWjpLQVpBS0hTVEFOOkFyYWwgU2VhOktBWi5MMi40NAorMzU6S1o6S0FaOktBWkFLSFNUQU46QXJhbCBTZWE6S0FaLkwyLjQ1CiszNjpLWjpLQVo6S0FaQUtIU1RBTjpBcmFsIFNlYTpLQVouTDIuNDYKKzM3OktaOktBWjpLQVpBS0hTVEFOOkFyYWwgU2VhOktBWi5MMi40NworMTpLWjpLQVo6S0FaQUtIU1RBTjpLb2NoZXRhdjpLQVouTDIuMQorMTpLWjpLQVo6S0FaQUtIU1RBTjpUc2VsaW5vZ3JhZDpLQVouTDIuNDgKKzE6S1o6S0FaOktBWkFLSFNUQU46QWt0eXViaW5zazpLQVouTDIuNgorMTpLWjpLQVo6S0FaQUtIU1RBTjpFYXN0IEthemFraHN0YW46S0FaLkwyLjEwCisxOktaOktBWjpLQVpBS0hTVEFOOlBhdmxvZGFyOktBWi5MMi40CisxOktaOktBWjpLQVpBS0hTVEFOOkd1cnlldjpLQVouTDIuNDkKKzE6S1o6S0FaOktBWkFLSFNUQU46S2FyYWdhbmRhOktBWi5MMi4yCisxOktaOktBWjpLQVpBS0hTVEFOOkR6aGFtYnVsOktBWi5MMi41MgorMTpLWjpLQVo6S0FaQUtIU1RBTjpBbG1hLUF0YTpLQVouTDIuNTAKKzE6S1o6S0FaOktBWkFLSFNUQU46RHpoZXprYXpnYW46S0FaLkwyLjUzCisxOktaOktBWjpLQVpBS0hTVEFOOkt1c3RhbmF5OktBWi5MMi44CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0tFTi9LRU5fQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0tFTi9LRU5fQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzYzc5NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvS0VOL0tFTl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDggQEAKKzE6S0UtMjAwOktFOkNFTlRSQUwgW0NFTlRSQUwyXQorMjpLRS0zMDA6S0U6Q09BU1QKKzM6S0UtNDAwOktFOkVBU1RFUk4KKzQ6S0UtMDpLRTpOQUlST0JJIFtOQUlST0JJIE1VTklDSVBBTElUWV0KKzU6S0UtNTAwOktFOk5PUlRIIEVBU1RFUk4gIFtOLiBFQVNURVJOXQorNjpLRS02MDA6S0U6TllBTlpBCis3OktFLTcwMDpLRTpSSUZUIFZBTExFWQorODpLRS05MDA6S0U6V0VTVEVSTgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9LRU4vS0VOX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9LRU4vS0VOX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNDlhOGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0tFTi9LRU5fQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSw0NyBAQAorMTpLRTpLRU46S0VOWUE6TkFJUk9CSTpOQUlST0JJCisxOktFOktFTjpLRU5ZQTpOWUFOWkE6SE9NQV9CQVkKKzI6S0U6S0VOOktFTllBOk5ZQU5aQTpLSVNJSQorMzpLRTpLRU46S0VOWUE6TllBTlpBOktJU1VNVQorNDpLRTpLRU46S0VOWUE6TllBTlpBOk1JR09SSQorNTpLRTpLRU46S0VOWUE6TllBTlpBOk5ZQU1JUkEKKzY6S0U6S0VOOktFTllBOk5ZQU5aQTpTSUFZQQorMTpLRTpLRU46S0VOWUE6Ti4gRUFTVEVSTjpHQVJJU1NBCisyOktFOktFTjpLRU5ZQTpOLiBFQVNURVJOOk1BTkRFUkEKKzM6S0U6S0VOOktFTllBOk4uIEVBU1RFUk46V0FKSVIKKzE6S0U6S0VOOktFTllBOkNFTlRSQUw6S0lBTUJVCisyOktFOktFTjpLRU5ZQTpDRU5UUkFMOktJUklOWUFHQQorMzpLRTpLRU46S0VOWUE6Q0VOVFJBTDpNVVJBTkdBCis0OktFOktFTjpLRU5ZQTpDRU5UUkFMOk5ZQU5EQVJVQQorNTpLRTpLRU46S0VOWUE6Q0VOVFJBTDpOWUVSSQorMTpLRTpLRU46S0VOWUE6V0VTVEVSTjpCVU5HT01BCisyOktFOktFTjpLRU5ZQTpXRVNURVJOOkJVU0lBCiszOktFOktFTjpLRU5ZQTpXRVNURVJOOktBS0FNRUdBCis0OktFOktFTjpLRU5ZQTpXRVNURVJOOlZJSElHQQorMTpLRTpLRU46S0VOWUE6RUFTVEVSTjpFTUJVCisyOktFOktFTjpLRU5ZQTpFQVNURVJOOklTSU9MTworMzpLRTpLRU46S0VOWUE6RUFTVEVSTjpLSVRVSQorNDpLRTpLRU46S0VOWUE6RUFTVEVSTjpNQUNIQUtPUworNTpLRTpLRU46S0VOWUE6RUFTVEVSTjpNQUtVRU5JCis2OktFOktFTjpLRU5ZQTpFQVNURVJOOk1BUlNBQklUCis3OktFOktFTjpLRU5ZQTpFQVNURVJOOk1FUlUKKzg6S0U6S0VOOktFTllBOkVBU1RFUk46TklUSEkKKzE6S0U6S0VOOktFTllBOkNPQVNUOktJTElGSQorMjpLRTpLRU46S0VOWUE6Q09BU1Q6S1dBTEUKKzM6S0U6S0VOOktFTllBOkNPQVNUOkxBTVUKKzQ6S0U6S0VOOktFTllBOkNPQVNUOk1PTUJBU0EKKzU6S0U6S0VOOktFTllBOkNPQVNUOlRBSVRBIFRBVkVUQQorNjpLRTpLRU46S0VOWUE6Q09BU1Q6VEFOQSBSSVZFUgorMTpLRTpLRU46S0VOWUE6UklGVCBWQUxMRVk6QkFSSU5HTworMjpLRTpLRU46S0VOWUE6UklGVCBWQUxMRVk6Qk9NRVQKKzM6S0U6S0VOOktFTllBOlJJRlQgVkFMTEVZOkUuIE1BUkFLV0VUCis0OktFOktFTjpLRU5ZQTpSSUZUIFZBTExFWTpLQUpJQURPCis1OktFOktFTjpLRU5ZQTpSSUZUIFZBTExFWTpLRVJJQ0hPCis2OktFOktFTjpLRU5ZQTpSSUZUIFZBTExFWTpMQUlLSVBJQQorNzpLRTpLRU46S0VOWUE6UklGVCBWQUxMRVk6TkFLVVJVCis4OktFOktFTjpLRU5ZQTpSSUZUIFZBTExFWTpOQU5ESQorOTpLRTpLRU46S0VOWUE6UklGVCBWQUxMRVk6TkFST0sKKzEwOktFOktFTjpLRU5ZQTpSSUZUIFZBTExFWTpTQU1CVVJVCisxMTpLRTpLRU46S0VOWUE6UklGVCBWQUxMRVk6VFJBTlMtTlpPSUEKKzEyOktFOktFTjpLRU5ZQTpSSUZUIFZBTExFWTpUVVJLQU5BCisxMzpLRTpLRU46S0VOWUE6UklGVCBWQUxMRVk6VUFTSU4gR0lTSFUKKzE0OktFOktFTjpLRU5ZQTpSSUZUIFZBTExFWTpXRVNUIFBPS09UCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0tHWi9LR1pfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0tHWi9LR1pfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI2ZGRiZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvS0daL0tHWl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDEwIEBACisxOktHLUI6S0c6QkFUS0VOCisyOktHLUdCOktHOkJJU0hLRUsKKzM6S0ctQzpLRzpDSNwKKzQ6S0ctSVNLOktHOklTU1lLIEtVTAorNTpLRy1KOktHOkpBTEFMIEFCQUQKKzY6S0ctS0lUOktHOktJUkdISVpJU1RBTiBURVJSSVRPUklFUworNzpLRy1OOktHOk5BUllOCis4OktHLU86S0c6T1NICis5OktHLVQ6S0c6VEFMQVMKKzEwOktHLVk6S0c6WVNZSyBLTApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9LR1ovS0daX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9LR1ovS0daX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YzVkNGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0tHWi9LR1pfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSwzIEBACisxOktHOktHWjpLWVJHWVpTVEFOOktpcmdoaXppc3RhbiBUZXJyaXRvcmllczpLR1ouTDIuMworMTpLRzpLR1o6S1lSR1laU1RBTjpJc3N5ay1LdWw6S0daLkwyLjIKKzE6S0c6S0daOktZUkdZWlNUQU46T3NoOktHWi5MMi4xCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0tITS9LSE1fQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0tITS9LSE1fQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNjNjRmYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvS0hNL0tITV9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDMzIEBACisxOktILTI6S0g6QkFBVCBEQU1CQU5HCisyOktILTEwOktIOkJBTlRFQVkgTUVBTiBDSEVZIFtCQU5URUFZIE1FQU5DSEVZXQorMzpLSC1CRUE6S0g6QkFOVEVBWSBNRUFOQ0hFWQorNDpLSC1CVEc6S0g6QkFUVEFNQkFORworNTpLSC0zOktIOktBTVBPTkcgQ0hBQU0KKzY6S0gtS1BDOktIOktBTVBPTkcgQ0hBTQorNzpLSC00OktIOktBTVBPTkcgQ0hITkFORworODpLSC1LTVM6S0g6S0FNUE9ORyBTUEVVCis5OktILTU6S0g6S0FNUE9ORyBTUFVFVSBbS0FNUE5HIFNQRV0KKzEwOktILUtUSDpLSDpLQU1QT05HIFRIT00KKzExOktILTY6S0g6S0FNUE9ORyBUSFVNIFtLQU1QTkcgVEhVTV0KKzEyOktILTc6S0g6S0FNUE9UIFtLQU1QT1RdCisxMzpLSC1LQU46S0g6S0FOREFMCisxNDpLSC05OktIOktBT0ggS09ORyBbS0FPSCBLTkddCisxNTpLSC1LT0g6S0g6S09IIEtPTkcKKzE2OktILTA6S0g6S1JBQ0hFSCBbS1JBQ0hFSF0KKzE3OktILUtSRTpLSDpLUkFUSUUKKzE4OktILTIzOktIOktST05HIEtBRUIKKzE5OktILTg6S0g6S1JPTkcgUFJFQUggU0lIQU5PVUsKKzIwOktILTI0OktIOk1PTkRPTCBLSVJJIFtNT05ETCBLSVJJXQorMjE6S0gtTU9LOktIOk1PTkRVTCBLSVJJCisyMjpLSC0yMjpLSDpPVERBUiBNRUFOIENIRVkgW1REQVIgTUVBTkNIRVldCisyMzpLSC0yMDpLSDpQSE5PTSBQRU5ICisyNDpLSC0yMTpLSDpQUkVBSCBWSUhFQVIKKzI1OktILVBWRzpLSDpQUkVZIFZFTkcKKzI2OktILVBVUjpLSDpQVVJTQVQKKzI3OktILVJBSzpLSDpSQVRBTkEgS0lSSQorMjg6S0gtU0VSOktIOlNJRU0gUkVBUAorMjk6S0gtU1RSOktIOlNUVU5HIFRSRU5HCiszMDpLSC1TVlk6S0g6U1ZBWSBSSUVORworMzE6S0gtMjU6S0g6VEFBS0FFViBbVEFLRVZdCiszMjpLSC1US0U6S0g6VEFLRU8KKzMzOktILVRPTDpLSDpUT05MRSBTQVAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvS0hNL0tITV9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvS0hNL0tITV9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjcyYTYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9LSE0vS0hNX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMTY1IEBACisxOktIOktITTpDQU1CT0RJQTpNb25kdWwgS2lyaTpLb2ggTmhlaworMjpLSDpLSE06Q0FNQk9ESUE6TW9uZHVsIEtpcmk6TyBSZWFuZworMzpLSDpLSE06Q0FNQk9ESUE6TW9uZHVsIEtpcmk6UGljaCBSb2RhCisxOktIOktITTpDQU1CT0RJQTpLYW1wb3Q6QW5na29yIENoZXkKKzI6S0g6S0hNOkNBTUJPRElBOkthbXBvdDpCYW50ZXkgTWVhcworMzpLSDpLSE06Q0FNQk9ESUE6S2FtcG90OkNoaG91aworNDpLSDpLSE06Q0FNQk9ESUE6S2FtcG90OkNodW1raXJpCis1OktIOktITTpDQU1CT0RJQTpLYW1wb3Q6RGFuZyBUdW5nCis2OktIOktITTpDQU1CT0RJQTpLYW1wb3Q6S2FtcG9uZyBUcmFjaAorNzpLSDpLSE06Q0FNQk9ESUE6S2FtcG90OkthbXBvdCAoREMpCis4OktIOktITTpDQU1CT0RJQTpLYW1wb3Q6S2FtcG90IChQVCkKKzE6S0g6S0hNOkNBTUJPRElBOkthbXBvbmcgQ2hobmFuZzpCYXJpYm8KKzI6S0g6S0hNOkNBTUJPRElBOkthbXBvbmcgQ2hobmFuZzpDaHVsIEtpcmkKKzM6S0g6S0hNOkNBTUJPRElBOkthbXBvbmcgQ2hobmFuZzpLYW1wb25nIENoaG5hbmcgKFBUKQorNDpLSDpLSE06Q0FNQk9ESUE6S2FtcG9uZyBDaGhuYW5nOkthbXBvbmcgTGVuZworNTpLSDpLSE06Q0FNQk9ESUE6S2FtcG9uZyBDaGhuYW5nOkthbXBvbmcgVHJhbGFjaAorNjpLSDpLSE06Q0FNQk9ESUE6S2FtcG9uZyBDaGhuYW5nOlJvbGVhciBQaGllYXIKKzc6S0g6S0hNOkNBTUJPRElBOkthbXBvbmcgQ2hobmFuZzpTYW1ha2kgTWVhbmNoZXkKKzg6S0g6S0hNOkNBTUJPRElBOkthbXBvbmcgQ2hobmFuZzpUdWsgUGhvcworMTpLSDpLSE06Q0FNQk9ESUE6QmFudGVheSBNZWFuY2hleTpCYW50ZWF5IEFtcGlsCisyOktIOktITTpDQU1CT0RJQTpCYW50ZWF5IE1lYW5jaGV5Ok1vbmdrb2wgQm9yZXkKKzM6S0g6S0hNOkNBTUJPRElBOkJhbnRlYXkgTWVhbmNoZXk6UGhub20gU3JvaworNDpLSDpLSE06Q0FNQk9ESUE6QmFudGVheSBNZWFuY2hleTpQcmVhaCBOZXQgUHJlYWgKKzU6S0g6S0hNOkNBTUJPRElBOkJhbnRlYXkgTWVhbmNoZXk6U2VyZXkgU29waG9ybgorNjpLSDpLSE06Q0FNQk9ESUE6QmFudGVheSBNZWFuY2hleTpTaXNvcGhvbiAoUFQpCis3OktIOktITTpDQU1CT0RJQTpCYW50ZWF5IE1lYW5jaGV5OlRobWFyIFB1b2sKKzE6S0g6S0hNOkNBTUJPRElBOkthbmRhbDpLYW5kYWwgU3R1bmcKKzI6S0g6S0hNOkNBTUJPRElBOkthbmRhbDpLZWFuIFN2ZXkKKzM6S0g6S0hNOkNBTUJPRElBOkthbmRhbDpLaHNhY2ggS2FuZGFsCis0OktIOktITTpDQU1CT0RJQTpLYW5kYWw6S29oIFRob20KKzU6S0g6S0hNOkNBTUJPRElBOkthbmRhbDpMZXVrIERlaworNjpLSDpLSE06Q0FNQk9ESUE6S2FuZGFsOkx2ZWEgRW0KKzc6S0g6S0hNOkNBTUJPRElBOkthbmRhbDpNdWsgS2FtcG91bAorODpLSDpLSE06Q0FNQk9ESUE6S2FuZGFsOlBobm9tIFBlbmggKERDKQorOTpLSDpLSE06Q0FNQk9ESUE6S2FuZGFsOlBvbmhlYSBMZXUKKzEwOktIOktITTpDQU1CT0RJQTpLYW5kYWw6U2FhbmcKKzExOktIOktITTpDQU1CT0RJQTpLYW5kYWw6VGFrbWF1IChQVCkKKzE6S0g6S0hNOkNBTUJPRElBOlByZWFoIFZpaGVhcjpDaGV5IFNlbgorMjpLSDpLSE06Q0FNQk9ESUE6UHJlYWggVmloZWFyOkNoaGVwCiszOktIOktITTpDQU1CT0RJQTpQcmVhaCBWaWhlYXI6Q2hvbSBLaHNhbgorNDpLSDpLSE06Q0FNQk9ESUE6UHJlYWggVmloZWFyOktvdWxlbgorNTpLSDpLSE06Q0FNQk9ESUE6UHJlYWggVmloZWFyOlJvdmllbmcKKzY6S0g6S0hNOkNBTUJPRElBOlByZWFoIFZpaGVhcjpTYW5na3VtIFRobWV5Cis3OktIOktITTpDQU1CT0RJQTpQcmVhaCBWaWhlYXI6VGJlbmcgTWVhbmNoZXkKKzE6S0g6S0hNOkNBTUJPRElBOlBobm9tIFBlbmg6RGFuZ2tvcmsKKzI6S0g6S0hNOkNBTUJPRElBOlBobm9tIFBlbmg6TWVhbiBDaGV5CiszOktIOktITTpDQU1CT0RJQTpQaG5vbSBQZW5oOlBobm9tIFBlbmggKFBDKQorNDpLSDpLSE06Q0FNQk9ESUE6UGhub20gUGVuaDpSdXNzZXkgS2VvCisxOktIOktITTpDQU1CT0RJQTpLYW1wb25nIFNwZXU6QmFzZXQKKzI6S0g6S0hNOkNBTUJPRElBOkthbXBvbmcgU3BldTpLYW1wb25nIFNwZXUKKzM6S0g6S0hNOkNBTUJPRElBOkthbXBvbmcgU3BldTpLb25nIFBpc2V5Cis0OktIOktITTpDQU1CT0RJQTpLYW1wb25nIFNwZXU6T3JhbAorNTpLSDpLSE06Q0FNQk9ESUE6S2FtcG9uZyBTcGV1Ok91ZG9uZworNjpLSDpLSE06Q0FNQk9ESUE6S2FtcG9uZyBTcGV1OlBobm9tIFNydW9jaAorNzpLSDpLSE06Q0FNQk9ESUE6S2FtcG9uZyBTcGV1OlNhbXJvbmcgVG9uZworODpLSDpLSE06Q0FNQk9ESUE6S2FtcG9uZyBTcGV1OlRocG9uZworMTpLSDpLSE06Q0FNQk9ESUE6UHJleSBWZW5nOkJhciBQaG5vbQorMjpLSDpLSE06Q0FNQk9ESUE6UHJleSBWZW5nOkthbWNoYXkgTWVhcgorMzpLSDpLSE06Q0FNQk9ESUE6UHJleSBWZW5nOkthbXBvbmcgVHJhYmVrCis0OktIOktITTpDQU1CT0RJQTpQcmV5IFZlbmc6S2FuY2ggQ2hyZWFjaAorNTpLSDpLSE06Q0FNQk9ESUE6UHJleSBWZW5nOk1lc2FuZworNjpLSDpLSE06Q0FNQk9ESUE6UHJleSBWZW5nOlBlYW0gQ2hvcgorNzpLSDpLSE06Q0FNQk9ESUE6UHJleSBWZW5nOlBlYW0gUm8KKzg6S0g6S0hNOkNBTUJPRElBOlByZXkgVmVuZzpQZWFyZWFuZworOTpLSDpLSE06Q0FNQk9ESUE6UHJleSBWZW5nOlBleSBWZW5nIChEQykKKzEwOktIOktITTpDQU1CT0RJQTpQcmV5IFZlbmc6UHJlYWggU2RlY2gKKzExOktIOktITTpDQU1CT0RJQTpQcmV5IFZlbmc6UHJleSBWZW5nIChQVCkKKzEyOktIOktITTpDQU1CT0RJQTpQcmV5IFZlbmc6U2l0aG9yIEthbmRhbAorMTpLSDpLSE06Q0FNQk9ESUE6U3R1bmcgVHJlbmc6U2VzYW4KKzI6S0g6S0hNOkNBTUJPRElBOlN0dW5nIFRyZW5nOlNpZW0gQm9rCiszOktIOktITTpDQU1CT0RJQTpTdHVuZyBUcmVuZzpTaWVtIFBhbmcKKzQ6S0g6S0hNOkNBTUJPRElBOlN0dW5nIFRyZW5nOlN0dW5nIFRyZW5nIChQVCkKKzU6S0g6S0hNOkNBTUJPRElBOlN0dW5nIFRyZW5nOlRoYWxhIEJhcml3YXQKKzE6S0g6S0hNOkNBTUJPRElBOlNpZW0gUmVhcDpBbmdrb3IgQ2h1bQorMjpLSDpLSE06Q0FNQk9ESUE6U2llbSBSZWFwOkFuZ2tvciBUaG9tCiszOktIOktITTpDQU1CT0RJQTpTaWVtIFJlYXA6QmFudGV5IFNyZXkKKzQ6S0g6S0hNOkNBTUJPRElBOlNpZW0gUmVhcDpDaGkgS3JlbmcKKzU6S0g6S0hNOkNBTUJPRElBOlNpZW0gUmVhcDpDaG9uZyBLYWwKKzY6S0g6S0hNOkNBTUJPRElBOlNpZW0gUmVhcDpLcmFsYW5oCis3OktIOktITTpDQU1CT0RJQTpTaWVtIFJlYXA6UG91aworODpLSDpLSE06Q0FNQk9ESUE6U2llbSBSZWFwOlNhbXJvdW5nCis5OktIOktITTpDQU1CT0RJQTpTaWVtIFJlYXA6U2llbSBSZWFwIChEQykKKzEwOktIOktITTpDQU1CT0RJQTpTaWVtIFJlYXA6U2llbSBSZWFwIChQVCkKKzExOktIOktITTpDQU1CT0RJQTpTaWVtIFJlYXA6U290ciBOaWt1bQorMTI6S0g6S0hNOkNBTUJPRElBOlNpZW0gUmVhcDpTcmV5IFNub20KKzEzOktIOktITTpDQU1CT0RJQTpTaWVtIFJlYXA6U3ZleSBMZXUKKzE0OktIOktITTpDQU1CT0RJQTpTaWVtIFJlYXA6VmFyaW4KKzE6S0g6S0hNOkNBTUJPRElBOlRvbmxlIFNhcDpNaXR0YXBoZWFwCisyOktIOktITTpDQU1CT0RJQTpUb25sZSBTYXA6UHJleSBOb3VwCiszOktIOktITTpDQU1CT0RJQTpUb25sZSBTYXA6U3R1bmcgSGF2CisxOktIOktITTpDQU1CT0RJQTpLb2ggS29uZzpCb3R1bSBTYWtvcgorMjpLSDpLSE06Q0FNQk9ESUE6S29oIEtvbmc6S2lyaSBTYWtvcgorMzpLSDpLSE06Q0FNQk9ESUE6S29oIEtvbmc6S29oIEtvbmcgKERDKQorNDpLSDpLSE06Q0FNQk9ESUE6S29oIEtvbmc6S29oIEtvbmcgKFBUKQorNTpLSDpLSE06Q0FNQk9ESUE6S29oIEtvbmc6TW9uZHVsIFNlbWEKKzY6S0g6S0hNOkNBTUJPRElBOktvaCBLb25nOlNyZSBBbWJlbAorNzpLSDpLSE06Q0FNQk9ESUE6S29oIEtvbmc6VGhtYXIgQmFpbmcKKzE6S0g6S0hNOkNBTUJPRElBOkJhdHRhbWJhbmc6QmFub24KKzI6S0g6S0hNOkNBTUJPRElBOkJhdHRhbWJhbmc6QmF0dGFtYmFuZyAoUFQpCiszOktIOktITTpDQU1CT0RJQTpCYXR0YW1iYW5nOkJhdHRhbWJvbmcgKERDKQorNDpLSDpLSE06Q0FNQk9ESUE6QmF0dGFtYmFuZzpCYXZlbAorNTpLSDpLSE06Q0FNQk9ESUE6QmF0dGFtYmFuZzpFayBQaG5vbQorNjpLSDpLSE06Q0FNQk9ESUE6QmF0dGFtYmFuZzpNb25nIFJ1c3NleQorNzpLSDpLSE06Q0FNQk9ESUE6QmF0dGFtYmFuZzpSYXR0YW5hayBNb25kdWwKKzg6S0g6S0hNOkNBTUJPRElBOkJhdHRhbWJhbmc6U2FuZ2tlCisxOktIOktITTpDQU1CT0RJQTpUYWtlbzpBbmdrb3IgQm9yZXkKKzI6S0g6S0hNOkNBTUJPRElBOlRha2VvOkJhdGkKKzM6S0g6S0hNOkNBTUJPRElBOlRha2VvOkJvcmV5IENodWxhc2FyCis0OktIOktITTpDQU1CT0RJQTpUYWtlbzpLaXJpIFZvbmcKKzU6S0g6S0hNOkNBTUJPRElBOlRha2VvOktvaCBBbmRldAorNjpLSDpLSE06Q0FNQk9ESUE6VGFrZW86UHJleSBLYWJhcworNzpLSDpLSE06Q0FNQk9ESUE6VGFrZW86U2Ftcm9uZworODpLSDpLSE06Q0FNQk9ESUE6VGFrZW86VGFrZW8gKFBUKQorOTpLSDpLSE06Q0FNQk9ESUE6VGFrZW86VHJhbSBLYWsKKzEwOktIOktITTpDQU1CT0RJQTpUYWtlbzpUcmVhbmcKKzE6S0g6S0hNOkNBTUJPRElBOlB1cnNhdDpCYWthbgorMjpLSDpLSE06Q0FNQk9ESUE6UHVyc2F0OkthbmRpZW5nCiszOktIOktITTpDQU1CT0RJQTpQdXJzYXQ6S3Jha29yCis0OktIOktITTpDQU1CT0RJQTpQdXJzYXQ6S3JhdmFuaAorNTpLSDpLSE06Q0FNQk9ESUE6UHVyc2F0OlB1cnNhdCAoUFQpCisxOktIOktITTpDQU1CT0RJQTpSYXRhbmEgS2lyaTpBbmRvbmcgTWVhcworMjpLSDpLSE06Q0FNQk9ESUE6UmF0YW5hIEtpcmk6QmFubHVuZyAoUFQpCiszOktIOktITTpDQU1CT0RJQTpSYXRhbmEgS2lyaTpCYXIgS2VvCis0OktIOktITTpDQU1CT0RJQTpSYXRhbmEgS2lyaTpLb24gTXVtCis1OktIOktITTpDQU1CT0RJQTpSYXRhbmEgS2lyaTpMdW0gUGhhdAorNjpLSDpLSE06Q0FNQk9ESUE6UmF0YW5hIEtpcmk6TyBDaHVtCis3OktIOktITTpDQU1CT0RJQTpSYXRhbmEgS2lyaTpPIFlhIERhdgorODpLSDpLSE06Q0FNQk9ESUE6UmF0YW5hIEtpcmk6VGF2ZW5nCis5OktIOktITTpDQU1CT0RJQTpSYXRhbmEgS2lyaTpWZW4gU2FpCisxOktIOktITTpDQU1CT0RJQTpLYW1wb25nIENoYW06QmF0aGVheQorMjpLSDpLSE06Q0FNQk9ESUE6S2FtcG9uZyBDaGFtOkNoYW1rYXIgTGV1CiszOktIOktITTpDQU1CT0RJQTpLYW1wb25nIENoYW06Q2hlbmcgUHJleQorNDpLSDpLSE06Q0FNQk9ESUE6S2FtcG9uZyBDaGFtOkRhbWJlCis1OktIOktITTpDQU1CT0RJQTpLYW1wb25nIENoYW06S2FtcG9uZyBDaGFtIChQVCkKKzY6S0g6S0hNOkNBTUJPRElBOkthbXBvbmcgQ2hhbTpLYW1wb25nIFNpZW0KKzc6S0g6S0hNOkNBTUJPRElBOkthbXBvbmcgQ2hhbTpLYW5nIE1lYXMKKzg6S0g6S0hNOkNBTUJPRElBOkthbXBvbmcgQ2hhbTpLb2ggU290aW4KKzk6S0g6S0hNOkNBTUJPRElBOkthbXBvbmcgQ2hhbTpLcm9jaCBDaG1hCisxMDpLSDpLSE06Q0FNQk9ESUE6S2FtcG9uZyBDaGFtOk1lbW90CisxMTpLSDpLSE06Q0FNQk9ESUE6S2FtcG9uZyBDaGFtOk8gUmVhbmcgT3YKKzEyOktIOktITTpDQU1CT0RJQTpLYW1wb25nIENoYW06UG9uaGVhIEtyZWsKKzEzOktIOktITTpDQU1CT0RJQTpLYW1wb25nIENoYW06UHJleSBDaGhvcgorMTQ6S0g6S0hNOkNBTUJPRElBOkthbXBvbmcgQ2hhbTpTcmVpIFNhbnRob3IKKzE1OktIOktITTpDQU1CT0RJQTpLYW1wb25nIENoYW06U3R1bmcgVHJhbmcKKzE2OktIOktITTpDQU1CT0RJQTpLYW1wb25nIENoYW06VGJvbmcgS2htdW0KKzE6S0g6S0hNOkNBTUJPRElBOktyYXRpZTpDaGxvbmcKKzI6S0g6S0hNOkNBTUJPRElBOktyYXRpZTpLcmF0aWUKKzM6S0g6S0hNOkNBTUJPRElBOktyYXRpZTpQcmVrIFByYXNhcAorNDpLSDpLSE06Q0FNQk9ESUE6S3JhdGllOlNhbWJvCis1OktIOktITTpDQU1CT0RJQTpLcmF0aWU6U25vdWwKKzE6S0g6S0hNOkNBTUJPRElBOkthbXBvbmcgVGhvbTpCYXJheQorMjpLSDpLSE06Q0FNQk9ESUE6S2FtcG9uZyBUaG9tOkthbXBvbmcgU3ZheQorMzpLSDpLSE06Q0FNQk9ESUE6S2FtcG9uZyBUaG9tOkthbXBvbmcgVGhvbSAoUFQpCis0OktIOktITTpDQU1CT0RJQTpLYW1wb25nIFRob206UHJhc2F0IEJhbGFuZworNTpLSDpLSE06Q0FNQk9ESUE6S2FtcG9uZyBUaG9tOlByYXNhdCBTYW1ibworNjpLSDpLSE06Q0FNQk9ESUE6S2FtcG9uZyBUaG9tOlNhbmRhbgorNzpLSDpLSE06Q0FNQk9ESUE6S2FtcG9uZyBUaG9tOlNhbnR1aworODpLSDpLSE06Q0FNQk9ESUE6S2FtcG9uZyBUaG9tOlN0dW5nCisxOktIOktITTpDQU1CT0RJQTpTdmF5IFJpZW5nOkNoYW4gVHJlYQorMjpLSDpLSE06Q0FNQk9ESUE6U3ZheSBSaWVuZzpLYW1wb25nIFJvCiszOktIOktITTpDQU1CT0RJQTpTdmF5IFJpZW5nOlJhbWRvdWwKKzQ6S0g6S0hNOkNBTUJPRElBOlN2YXkgUmllbmc6Um9tZWFzIEhlaworNTpLSDpLSE06Q0FNQk9ESUE6U3ZheSBSaWVuZzpTdmF5IFJpZW5nIChEQykKKzY6S0g6S0hNOkNBTUJPRElBOlN2YXkgUmllbmc6U3ZheSBSaWVuZyAoUFQpCis3OktIOktITTpDQU1CT0RJQTpTdmF5IFJpZW5nOlN2YXkgVGVhcApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9LT1IvS09SX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9LT1IvS09SX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Y2ZiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0tPUi9LT1JfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxNiBAQAorMTpLUi00OTpLUjpDSEVKVSBETworMjpLUi00NTpLUjpDSE9MTEFCVUsgRE8KKzM6S1ItNDY6S1I6Q0hPTExBTkFNIERPCis0OktSLTQzOktSOkNIVU5HQ0hPTkdCVUsgRE8KKzU6S1ItNDQ6S1I6Q0hVTkdDSE9OR05BTSBETworNjpLUi0yODpLUjpJTkNIT04KKzc6S1ItNDI6S1I6S0FORyBXT04gRE8KKzg6S1ItMjk6S1I6S1dBTkdKVQorOTpLUi00OktSOktZT05HR0kgRE8KKzEwOktSLTQ3OktSOktZT05HU0FOR0JVSyBETworMTE6S1ItNDg6S1I6S1lPTkdTQU5HTkFNIERPCisxMjpLUi0yNjpLUjpQVVNBTgorMTM6S1ItMDpLUjpTRU9VTAorMTQ6S1ItMjc6S1I6VEFFR1UKKzE1OktSLTMwOktSOlRBRUpPTgorMTY6S1ItMzpLUjpVTFNBTiBHV0FOR1lFT0dTSSBbVUxTQU4gS1dBTkdZS1NISV0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvS09SL0tPUl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvS09SL0tPUl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2QyZDNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9LT1IvS09SX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMzI3IEBACisxOktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjEwMAorMjpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xMDEKKzM6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTAyCis0OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjEwMworNTpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xMDQKKzY6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTA1Cis3OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjEwNgorODpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xMDcKKzk6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTA4CisxMDpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xMDkKKzExOktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjExMAorMTI6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTExCisxMzpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xMTIKKzE0OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjExMworMTU6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTE0CisxNjpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xMTUKKzE3OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjExNgorMTg6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTE3CisxOTpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xMTgKKzIwOktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjExOQorMjE6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTIwCisyMjpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xMjEKKzIzOktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjEyMgorMjQ6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTIzCisyNTpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xMjQKKzI2OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjEyNQorMjc6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTI2CisyODpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xMjcKKzI5OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjEyOAorMzA6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTI5CiszMTpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xMzAKKzMyOktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjEzMQorMzM6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTMyCiszNDpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xMzMKKzM1OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjEzNAorMzY6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTM1CiszNzpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xMzYKKzM4OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjEzNworMzk6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTM4Cis0MDpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xMzkKKzQxOktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE0MAorNDI6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTQxCis0MzpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xNDIKKzQ0OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE0MworNDU6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTQ0Cis0NjpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xNDUKKzQ3OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE0NgorNDg6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTQ3Cis0OTpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xNDgKKzUwOktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE0OQorNTE6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTUwCis1MjpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xNTEKKzUzOktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE1MgorNTQ6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTUzCis1NTpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xNTQKKzU2OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE1NQorNTc6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTU2Cis1ODpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xNTcKKzU5OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE1OAorNjA6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTU5Cis2MTpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xNjAKKzYyOktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE2MQorNjM6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTYyCis2NDpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xNjMKKzY1OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE2NAorNjY6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTY1Cis2NzpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xNjYKKzY4OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE2NworNjk6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTY4Cis3MDpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xNjkKKzcxOktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE3MAorNzI6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTcxCis3MzpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xNzIKKzc0OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE3MworNzU6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTc0Cis3NjpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xNzUKKzc3OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE3NgorNzg6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTc3Cis3OTpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xNzgKKzgwOktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE3OQorODE6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTgwCis4MjpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xODEKKzgzOktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE4MgorODQ6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTgzCis4NTpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xODQKKzg2OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE4NQorODc6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTg2Cis4ODpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xODcKKzg5OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE4OAorOTA6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTg5Cis5MTpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xOTAKKzkyOktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE5MQorOTM6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTkyCis5NDpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xOTMKKzk1OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE5NAorOTY6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTk1Cis5NzpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhbmFtLURvOktPUi5MMi4xOTYKKzk4OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFuYW0tRG86S09SLkwyLjE5NworOTk6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTk4CisxMDA6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMTk5CisxMDE6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjAwCisxMDI6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjAxCisxMDM6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjAyCisxMDQ6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjAzCisxMDU6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjA0CisxMDY6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjA1CisxMDc6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjA2CisxMDg6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjA3CisxMDk6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjA4CisxMTA6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjA5CisxMTE6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjEwCisxMTI6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjExCisxMTM6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjEyCisxMTQ6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjEzCisxMTU6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjE0CisxMTY6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjE1CisxMTc6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjE2CisxMTg6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjE3CisxMTk6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjE4CisxMjA6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjE5CisxMjE6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjIwCisxMjI6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjIxCisxMjM6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjIyCisxMjQ6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjIzCisxMjU6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjI0CisxMjY6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjI1CisxMjc6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjI2CisxMjg6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjI3CisxMjk6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjI4CisxMzA6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjI5CisxMzE6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjMwCisxMzI6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjMxCisxMzM6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjMyCisxMzQ6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjMzCisxMzU6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjM0CisxMzY6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjM1CisxMzc6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjM2CisxMzg6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjM3CisxMzk6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjM4CisxNDA6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjM5CisxNDE6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjQwCisxNDI6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjQxCisxNDM6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjQyCisxNDQ6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjQzCisxNDU6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjQ0CisxNDY6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjQ1CisxNDc6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjQ2CisxNDg6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjQ3CisxNDk6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjQ4CisxNTA6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjQ5CisxNTE6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjUwCisxNTI6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjUxCisxNTM6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjUyCisxNTQ6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjUzCisxNTU6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjU0CisxNTY6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjU1CisxNTc6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjU2CisxNTg6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjU3CisxNTk6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjU4CisxNjA6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjU5CisxNjE6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjYwCisxNjI6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjYxCisxNjM6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjYyCisxNjQ6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjYzCisxNjU6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjY0CisxNjY6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjY1CisxNjc6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjY2CisxNjg6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjY3CisxNjk6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjY4CisxNzA6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjY5CisxNzE6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjcwCisxNzI6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjcxCisxNzM6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjcyCisxNzQ6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjczCisxNzU6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjc0CisxNzY6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjc1CisxNzc6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjc2CisxNzg6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjc3CisxNzk6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjc4CisxODA6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjc5CisxODE6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjgwCisxODI6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjgxCisxODM6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjgyCisxODQ6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuMjgzCisxODU6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYW5hbS1EbzpLT1IuTDIuOTkKKzE6S1I6S09SOlNPVVRIIEtPUkVBOlB1c2FuOktPUi5MMi42NAorMjpLUjpLT1I6U09VVEggS09SRUE6UHVzYW46S09SLkwyLjY1CisxOktSOktPUjpTT1VUSCBLT1JFQTpDaHVuZ2Nob25nYnVrLURvOktPUi5MMi4xNworMTpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhYnVrLURvOktPUi5MMi4yMAorMjpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhYnVrLURvOktPUi5MMi4yMQorMzpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhYnVrLURvOktPUi5MMi4yMgorNDpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhYnVrLURvOktPUi5MMi4yMworNTpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhYnVrLURvOktPUi5MMi4yNAorNjpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhYnVrLURvOktPUi5MMi4yNQorNzpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhYnVrLURvOktPUi5MMi4yNgorODpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhYnVrLURvOktPUi5MMi4yNworOTpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhYnVrLURvOktPUi5MMi4yOAorMTA6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYWJ1ay1EbzpLT1IuTDIuMjkKKzExOktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFidWstRG86S09SLkwyLjMwCisxMjpLUjpLT1I6U09VVEggS09SRUE6Q2hvbGxhYnVrLURvOktPUi5MMi4zMQorMTM6S1I6S09SOlNPVVRIIEtPUkVBOkNob2xsYWJ1ay1EbzpLT1IuTDIuMzIKKzE0OktSOktPUjpTT1VUSCBLT1JFQTpDaG9sbGFidWstRG86S09SLkwyLjMzCisxOktSOktPUjpTT1VUSCBLT1JFQTpJbmNob246S09SLkwyLjEKKzI6S1I6S09SOlNPVVRIIEtPUkVBOkluY2hvbjpLT1IuTDIuMTAKKzM6S1I6S09SOlNPVVRIIEtPUkVBOkluY2hvbjpLT1IuTDIuMgorNDpLUjpLT1I6U09VVEggS09SRUE6SW5jaG9uOktPUi5MMi4zCis1OktSOktPUjpTT1VUSCBLT1JFQTpJbmNob246S09SLkwyLjQKKzY6S1I6S09SOlNPVVRIIEtPUkVBOkluY2hvbjpLT1IuTDIuNQorNzpLUjpLT1I6U09VVEggS09SRUE6SW5jaG9uOktPUi5MMi42Cis4OktSOktPUjpTT1VUSCBLT1JFQTpJbmNob246S09SLkwyLjcKKzk6S1I6S09SOlNPVVRIIEtPUkVBOkluY2hvbjpLT1IuTDIuOAorMTA6S1I6S09SOlNPVVRIIEtPUkVBOkluY2hvbjpLT1IuTDIuOQorMTpLUjpLT1I6U09VVEggS09SRUE6Q2hlanUtRG86S09SLkwyLjExCisyOktSOktPUjpTT1VUSCBLT1JFQTpDaGVqdS1EbzpLT1IuTDIuMTIKKzM6S1I6S09SOlNPVVRIIEtPUkVBOkNoZWp1LURvOktPUi5MMi4xMworNDpLUjpLT1I6U09VVEggS09SRUE6Q2hlanUtRG86S09SLkwyLjE0CisxOktSOktPUjpTT1VUSCBLT1JFQTpLd2FuZ2p1OktPUi5MMi42NgorMTpLUjpLT1I6U09VVEggS09SRUE6VGFlam9uOktPUi5MMi4zNAorMTpLUjpLT1I6U09VVEggS09SRUE6Q2h1bmdjaG9uZ25hbS1EbzpLT1IuTDIuMzYKKzI6S1I6S09SOlNPVVRIIEtPUkVBOkNodW5nY2hvbmduYW0tRG86S09SLkwyLjM3CiszOktSOktPUjpTT1VUSCBLT1JFQTpDaHVuZ2Nob25nbmFtLURvOktPUi5MMi4zOAorNDpLUjpLT1I6U09VVEggS09SRUE6Q2h1bmdjaG9uZ25hbS1EbzpLT1IuTDIuMzkKKzU6S1I6S09SOlNPVVRIIEtPUkVBOkNodW5nY2hvbmduYW0tRG86S09SLkwyLjQwCis2OktSOktPUjpTT1VUSCBLT1JFQTpDaHVuZ2Nob25nbmFtLURvOktPUi5MMi40MQorNzpLUjpLT1I6U09VVEggS09SRUE6Q2h1bmdjaG9uZ25hbS1EbzpLT1IuTDIuNDIKKzg6S1I6S09SOlNPVVRIIEtPUkVBOkNodW5nY2hvbmduYW0tRG86S09SLkwyLjQzCis5OktSOktPUjpTT1VUSCBLT1JFQTpDaHVuZ2Nob25nbmFtLURvOktPUi5MMi40NAorMTA6S1I6S09SOlNPVVRIIEtPUkVBOkNodW5nY2hvbmduYW0tRG86S09SLkwyLjQ1CisxMTpLUjpLT1I6U09VVEggS09SRUE6Q2h1bmdjaG9uZ25hbS1EbzpLT1IuTDIuNDYKKzEyOktSOktPUjpTT1VUSCBLT1JFQTpDaHVuZ2Nob25nbmFtLURvOktPUi5MMi40NworMTM6S1I6S09SOlNPVVRIIEtPUkVBOkNodW5nY2hvbmduYW0tRG86S09SLkwyLjQ4CisxNDpLUjpLT1I6U09VVEggS09SRUE6Q2h1bmdjaG9uZ25hbS1EbzpLT1IuTDIuNDkKKzE1OktSOktPUjpTT1VUSCBLT1JFQTpDaHVuZ2Nob25nbmFtLURvOktPUi5MMi41MAorMTY6S1I6S09SOlNPVVRIIEtPUkVBOkNodW5nY2hvbmduYW0tRG86S09SLkwyLjUxCisxNzpLUjpLT1I6U09VVEggS09SRUE6Q2h1bmdjaG9uZ25hbS1EbzpLT1IuTDIuNTIKKzE4OktSOktPUjpTT1VUSCBLT1JFQTpDaHVuZ2Nob25nbmFtLURvOktPUi5MMi41MworMTk6S1I6S09SOlNPVVRIIEtPUkVBOkNodW5nY2hvbmduYW0tRG86S09SLkwyLjU0CisyMDpLUjpLT1I6U09VVEggS09SRUE6Q2h1bmdjaG9uZ25hbS1EbzpLT1IuTDIuNTUKKzIxOktSOktPUjpTT1VUSCBLT1JFQTpDaHVuZ2Nob25nbmFtLURvOktPUi5MMi41NgorMjI6S1I6S09SOlNPVVRIIEtPUkVBOkNodW5nY2hvbmduYW0tRG86S09SLkwyLjU3CisyMzpLUjpLT1I6U09VVEggS09SRUE6Q2h1bmdjaG9uZ25hbS1EbzpLT1IuTDIuNTgKKzI0OktSOktPUjpTT1VUSCBLT1JFQTpDaHVuZ2Nob25nbmFtLURvOktPUi5MMi41OQorMjU6S1I6S09SOlNPVVRIIEtPUkVBOkNodW5nY2hvbmduYW0tRG86S09SLkwyLjYwCisyNjpLUjpLT1I6U09VVEggS09SRUE6Q2h1bmdjaG9uZ25hbS1EbzpLT1IuTDIuNjEKKzI3OktSOktPUjpTT1VUSCBLT1JFQTpDaHVuZ2Nob25nbmFtLURvOktPUi5MMi42MgorMjg6S1I6S09SOlNPVVRIIEtPUkVBOkNodW5nY2hvbmduYW0tRG86S09SLkwyLjYzCisxOktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ2dpLURvOktPUi5MMi42NworMjpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdnaS1EbzpLT1IuTDIuNjgKKzM6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nZ2ktRG86S09SLkwyLjY5Cis0OktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ2dpLURvOktPUi5MMi43MAorNTpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdnaS1EbzpLT1IuTDIuNzEKKzY6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nZ2ktRG86S09SLkwyLjcyCis3OktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ2dpLURvOktPUi5MMi43MworODpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdnaS1EbzpLT1IuTDIuNzQKKzk6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nZ2ktRG86S09SLkwyLjc1CisxMDpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdnaS1EbzpLT1IuTDIuNzYKKzExOktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ2dpLURvOktPUi5MMi43NworMTI6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nZ2ktRG86S09SLkwyLjc4CisxMzpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdnaS1EbzpLT1IuTDIuNzkKKzE0OktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ2dpLURvOktPUi5MMi44MAorMTU6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nZ2ktRG86S09SLkwyLjgxCisxNjpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdnaS1EbzpLT1IuTDIuODIKKzE3OktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ2dpLURvOktPUi5MMi44MworMTg6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nZ2ktRG86S09SLkwyLjg0CisxOTpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdnaS1EbzpLT1IuTDIuODUKKzIwOktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ2dpLURvOktPUi5MMi44NgorMjE6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nZ2ktRG86S09SLkwyLjg3CisyMjpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdnaS1EbzpLT1IuTDIuODgKKzIzOktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ2dpLURvOktPUi5MMi44OQorMjQ6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nZ2ktRG86S09SLkwyLjkwCisyNTpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdnaS1EbzpLT1IuTDIuOTEKKzI2OktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ2dpLURvOktPUi5MMi45MgorMjc6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nZ2ktRG86S09SLkwyLjkzCisyODpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdnaS1EbzpLT1IuTDIuOTQKKzI5OktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ2dpLURvOktPUi5MMi45NQorMzA6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nZ2ktRG86S09SLkwyLjk2CiszMTpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdnaS1EbzpLT1IuTDIuOTcKKzMyOktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ2dpLURvOktPUi5MMi45OAorMTpLUjpLT1I6U09VVEggS09SRUE6U2VvdWw6S09SLkwyLjE2CisxOktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ3NhbmduYW0tRG86S09SLkwyLjI4NAorMjpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdzYW5nbmFtLURvOktPUi5MMi4yODUKKzM6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nc2FuZ25hbS1EbzpLT1IuTDIuMjg2Cis0OktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ3NhbmduYW0tRG86S09SLkwyLjI4NworNTpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdzYW5nbmFtLURvOktPUi5MMi4yODgKKzY6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nc2FuZ25hbS1EbzpLT1IuTDIuMjg5Cis3OktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ3NhbmduYW0tRG86S09SLkwyLjI5MAorODpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdzYW5nbmFtLURvOktPUi5MMi4yOTEKKzk6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nc2FuZ25hbS1EbzpLT1IuTDIuMjkyCisxMDpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdzYW5nbmFtLURvOktPUi5MMi4yOTMKKzExOktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ3NhbmduYW0tRG86S09SLkwyLjI5NAorMTI6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nc2FuZ25hbS1EbzpLT1IuTDIuMjk1CisxMzpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdzYW5nbmFtLURvOktPUi5MMi4yOTYKKzE0OktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ3NhbmduYW0tRG86S09SLkwyLjI5NworMTU6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nc2FuZ25hbS1EbzpLT1IuTDIuMjk4CisxNjpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdzYW5nbmFtLURvOktPUi5MMi4yOTkKKzE3OktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ3NhbmduYW0tRG86S09SLkwyLjMwMAorMTg6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nc2FuZ25hbS1EbzpLT1IuTDIuMzAxCisxOTpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdzYW5nbmFtLURvOktPUi5MMi4zMDIKKzIwOktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ3NhbmduYW0tRG86S09SLkwyLjMwMworMjE6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nc2FuZ25hbS1EbzpLT1IuTDIuMzA0CisyMjpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdzYW5nbmFtLURvOktPUi5MMi4zMDUKKzIzOktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ3NhbmduYW0tRG86S09SLkwyLjMwNgorMjQ6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nc2FuZ25hbS1EbzpLT1IuTDIuMzA3CisyNTpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdzYW5nbmFtLURvOktPUi5MMi4zMDgKKzI2OktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ3NhbmduYW0tRG86S09SLkwyLjMwOQorMjc6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nc2FuZ25hbS1EbzpLT1IuTDIuMzEwCisyODpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdzYW5nbmFtLURvOktPUi5MMi4zMTEKKzI5OktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ3NhbmduYW0tRG86S09SLkwyLjMxMgorMzA6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nc2FuZ25hbS1EbzpLT1IuTDIuMzEzCiszMTpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdzYW5nbmFtLURvOktPUi5MMi4zMTQKKzMyOktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ3NhbmduYW0tRG86S09SLkwyLjMxNQorMzM6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nc2FuZ25hbS1EbzpLT1IuTDIuMzE2CiszNDpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdzYW5nbmFtLURvOktPUi5MMi4zMTcKKzM1OktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ3NhbmduYW0tRG86S09SLkwyLjMxOAorMzY6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nc2FuZ25hbS1EbzpLT1IuTDIuMzE5CiszNzpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdzYW5nbmFtLURvOktPUi5MMi4zMjAKKzM4OktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ3NhbmduYW0tRG86S09SLkwyLjMyMQorMzk6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nc2FuZ25hbS1EbzpLT1IuTDIuMzIyCis0MDpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdzYW5nbmFtLURvOktPUi5MMi4zMjMKKzQxOktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ3NhbmduYW0tRG86S09SLkwyLjMyNAorNDI6S1I6S09SOlNPVVRIIEtPUkVBOkt5b25nc2FuZ25hbS1EbzpLT1IuTDIuMzI1Cis0MzpLUjpLT1I6U09VVEggS09SRUE6S3lvbmdzYW5nbmFtLURvOktPUi5MMi4zMjYKKzQ0OktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ3NhbmduYW0tRG86S09SLkwyLjMyNworMTpLUjpLT1I6U09VVEggS09SRUE6VGFlZ3U6S09SLkwyLjE1CisxOktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ3NhbmdidWstRG86S09SLkwyLjE4CisyOktSOktPUjpTT1VUSCBLT1JFQTpLeW9uZ3NhbmdidWstRG86S09SLkwyLjE5CisxOktSOktPUjpTT1VUSCBLT1JFQTpLYW5nLVdvbi1EbzpLT1IuTDIuMzUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvS1dUL0tXVF9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvS1dUL0tXVF9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjJkODQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9LV1QvS1dUX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsNiBAQAorMTpLVy1BSDpLVzpBTCBBTUFESQorMjpLVy1GQTpLVzpBTCBGQVJXQU5JWUFICiszOktXLUpBOktXOkFMIEpBSFJBSAorNDpLVy1LVTpLVzpBTCBLVVdBWVQKKzU6S1ctSEE6S1c6QVdBTExJCis2OktXLUs6S1c6S1VXQUlUCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0tXVC9LV1RfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0tXVC9LV1RfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3ODE1OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvS1dUL0tXVF9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDEwIEBACisxOktXOktXVDpLVVdBSVQ6S3V3YWl0OktXVC5MMi4xCisyOktXOktXVDpLVVdBSVQ6S3V3YWl0OktXVC5MMi4xMAorMzpLVzpLV1Q6S1VXQUlUOkt1d2FpdDpLV1QuTDIuMgorNDpLVzpLV1Q6S1VXQUlUOkt1d2FpdDpLV1QuTDIuMworNTpLVzpLV1Q6S1VXQUlUOkt1d2FpdDpLV1QuTDIuNAorNjpLVzpLV1Q6S1VXQUlUOkt1d2FpdDpLV1QuTDIuNQorNzpLVzpLV1Q6S1VXQUlUOkt1d2FpdDpLV1QuTDIuNgorODpLVzpLV1Q6S1VXQUlUOkt1d2FpdDpLV1QuTDIuNworOTpLVzpLV1Q6S1VXQUlUOkt1d2FpdDpLV1QuTDIuOAorMTA6S1c6S1dUOktVV0FJVDpLdXdhaXQ6S1dULkwyLjkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTEFPL0xBT19BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTEFPL0xBT19BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTUzNTMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9MQU8vTEFPX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMjEgQEAKKzE6TEEtQVQ6TEE6QVRUT1BVCisyOkxBLUJLOkxBOkJPS0VPCiszOkxBLUJMOkxBOkJPTElLSEFNU0FJCis0OkxBLUNIOkxBOkNIQU1QQVNTQUNLCis1OkxBLUhPOkxBOkhPVUFQSEFOSAorNjpMQS1LSDpMQTpLSEFNTU9VQU4KKzc6TEEtS0s6TEE6S0hBTU1PVUFORQorODpMQS1MUDpMQTpMVUFORyBQUkFCQU5HCis5OkxBLUxNOkxBOk5BTVRIQQorMTA6TEEtT1U6TEE6T1VET01YQVkKKzExOkxBLVBIOkxBOlBIT05HU0FMWQorMTI6TEEtU0w6TEE6U0FMQVZBTiBbU0FSQVZBTkVdCisxMzpMQS1TUjpMQTpTQVJBVkFORQorMTQ6TEEtU1Y6TEE6U0FWQU5OQUtIRVQKKzE1OkxBLVhBOkxBOlNBWUFCT1VSSQorMTY6TEEtWEU6TEE6U0VLT05HCisxNzpMQS1WVDpMQTpWSUVOVElBTkUKKzE4OkxBLVZJOkxBOlZJRU5USUFORSAoTVVOSUMuKQorMTk6TEEtVkkyOkxBOlZJRU5USUFORSAyCisyMDpMQS1YTjpMQTpYQUlTT01CT1VOCisyMTpMQS1YSTpMQTpYSUFOR0tIT1VBTkcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTEFPL0xBT19BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTEFPL0xBT19BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjYyZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9MQU8vTEFPX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMTMzIEBACisxOkxBOkxBTzpMQU9TOkJvbGlraGFtc2FpOkJvcmlraGFuZQorMjpMQTpMQU86TEFPUzpCb2xpa2hhbXNhaTpLaGFta2V1dAorMzpMQTpMQU86TEFPUzpCb2xpa2hhbXNhaTpQYWtrYWRpbmcKKzQ6TEE6TEFPOkxBT1M6Qm9saWtoYW1zYWk6UGFrc2FuZQorNTpMQTpMQU86TEFPUzpCb2xpa2hhbXNhaTpUaGFwaGFiYXQKKzY6TEE6TEFPOkxBT1M6Qm9saWtoYW1zYWk6Vmllbmd0aG9uZworMTpMQTpMQU86TEFPUzpBdHRvcHU6UGhvdXZvbmcKKzI6TEE6TEFPOkxBT1M6QXR0b3B1OlNhbWFra2hpeGF5CiszOkxBOkxBTzpMQU9TOkF0dG9wdTpTYW5hbXhheQorNDpMQTpMQU86TEFPUzpBdHRvcHU6U2FueGF5Cis1OkxBOkxBTzpMQU9TOkF0dG9wdTpTYXlzZXR0aGEKKzE6TEE6TEFPOkxBT1M6VmllbnRpYW5lIChNdW5pYy4pOkNoYW50aGFib3VyeQorMjpMQTpMQU86TEFPUzpWaWVudGlhbmUgKE11bmljLik6SGF0c2F5cGhvbmcKKzM6TEE6TEFPOkxBT1M6VmllbnRpYW5lIChNdW5pYy4pOk5heGF5dGhvbmcKKzQ6TEE6TEFPOkxBT1M6VmllbnRpYW5lIChNdW5pYy4pOlBhayBOZ3VtCis1OkxBOkxBTzpMQU9TOlZpZW50aWFuZSAoTXVuaWMuKTpTYW5ndGhvbmcKKzY6TEE6TEFPOkxBT1M6VmllbnRpYW5lIChNdW5pYy4pOlNheXNldHRoYQorNzpMQTpMQU86TEFPUzpWaWVudGlhbmUgKE11bmljLik6U2lraG90dGFib25nCis4OkxBOkxBTzpMQU9TOlZpZW50aWFuZSAoTXVuaWMuKTpTaXNhdHRhbmFjaworOTpMQTpMQU86TEFPUzpWaWVudGlhbmUgKE11bmljLik6WGF5dGhhbnkKKzE6TEE6TEFPOkxBT1M6TmFtdGhhOkxvbmcKKzI6TEE6TEFPOkxBT1M6TmFtdGhhOk5hIExlCiszOkxBOkxBTzpMQU9TOk5hbXRoYTpOYW10aGEKKzQ6TEE6TEFPOkxBT1M6TmFtdGhhOlNpbmcKKzU6TEE6TEFPOkxBT1M6TmFtdGhhOlZpZW5ncGhvdWtoYQorMTpMQTpMQU86TEFPUzpCb2tlbzpIb3VheSBYYXkKKzI6TEE6TEFPOkxBT1M6Qm9rZW86TWV1bmcKKzM6TEE6TEFPOkxBT1M6Qm9rZW86UGFrIFRoYQorNDpMQTpMQU86TEFPUzpCb2tlbzpQaGEgT3Vkb20KKzU6TEE6TEFPOkxBT1M6Qm9rZW86VG9uIFBoZXVuZworMTpMQTpMQU86TEFPUzpWaWVudGlhbmUgMjpIb20KKzI6TEE6TEFPOkxBT1M6VmllbnRpYW5lIDI6TG9uZ3NhbmUKKzM6TEE6TEFPOkxBT1M6VmllbnRpYW5lIDI6UGhvdW5lCis0OkxBOkxBTzpMQU9TOlZpZW50aWFuZSAyOlNheXNvbWJvdW5lCis1OkxBOkxBTzpMQU9TOlZpZW50aWFuZSAyOlRoYXRob21lCisxOkxBOkxBTzpMQU9TOlNla29uZzpEYWNrIENoZXVuZworMjpMQTpMQU86TEFPUzpTZWtvbmc6S2FsZXVtCiszOkxBOkxBTzpMQU9TOlNla29uZzpMYSBNYW0KKzQ6TEE6TEFPOkxBT1M6U2Vrb25nOlRoYSBUZW5nCisxOkxBOkxBTzpMQU9TOlNheWFib3VyaTpCb3RlbgorMjpMQTpMQU86TEFPUzpTYXlhYm91cmk6SG9uZ3NhCiszOkxBOkxBTzpMQU9TOlNheWFib3VyaTpLZW5ldGhhbworNDpMQTpMQU86TEFPUzpTYXlhYm91cmk6S2hvYgorNTpMQTpMQU86TEFPUzpTYXlhYm91cmk6TmdldW5lCis2OkxBOkxBTzpMQU9TOlNheWFib3VyaTpQYWsgTGF5Cis3OkxBOkxBTzpMQU9TOlNheWFib3VyaTpQaGllbmcKKzg6TEE6TEFPOkxBT1M6U2F5YWJvdXJpOlNheWFib3VyeQorOTpMQTpMQU86TEFPUzpTYXlhYm91cmk6WGllbmcgSG9uCisxOkxBOkxBTzpMQU9TOlhpYW5na2hvdWFuZzpLaGFtCisyOkxBOkxBTzpMQU9TOlhpYW5na2hvdWFuZzpLaG91bmUKKzM6TEE6TEFPOkxBT1M6WGlhbmdraG91YW5nOk1vayBNYXkKKzQ6TEE6TEFPOkxBT1M6WGlhbmdraG91YW5nOk5vbmcgSGV0Cis1OkxBOkxBTzpMQU9TOlhpYW5na2hvdWFuZzpQZWsKKzY6TEE6TEFPOkxBT1M6WGlhbmdraG91YW5nOlBoYXhheQorNzpMQTpMQU86TEFPUzpYaWFuZ2tob3Vhbmc6UGhvdSBLb3V0CisxOkxBOkxBTzpMQU9TOkx1YW5nIFByYWJhbmc6Q2hvbXBoZXQKKzI6TEE6TEFPOkxBT1M6THVhbmcgUHJhYmFuZzpMdWFuZyBQcmFiYW5nCiszOkxBOkxBTzpMQU9TOkx1YW5nIFByYWJhbmc6TmFtIEJhaworNDpMQTpMQU86TEFPUzpMdWFuZyBQcmFiYW5nOk5hbmUKKzU6TEE6TEFPOkxBT1M6THVhbmcgUHJhYmFuZzpOZ295Cis2OkxBOkxBTzpMQU9TOkx1YW5nIFByYWJhbmc6UGFrIE91Cis3OkxBOkxBTzpMQU9TOkx1YW5nIFByYWJhbmc6UGFrIFNlbmcKKzg6TEE6TEFPOkxBT1M6THVhbmcgUHJhYmFuZzpQaG9ueGF5Cis5OkxBOkxBTzpMQU9TOkx1YW5nIFByYWJhbmc6UGhvdWtob3VuZQorMTA6TEE6TEFPOkxBT1M6THVhbmcgUHJhYmFuZzpWaWVuZ2toYW0KKzExOkxBOkxBTzpMQU9TOkx1YW5nIFByYWJhbmc6WGllbmduZ2V1bgorMTpMQTpMQU86TEFPUzpQaG9uZ3NhbHk6Qm91biBOZXVhCisyOkxBOkxBTzpMQU9TOlBob25nc2FseTpCb3VuIFRheQorMzpMQTpMQU86TEFPUzpQaG9uZ3NhbHk6S2hvdWEKKzQ6TEE6TEFPOkxBT1M6UGhvbmdzYWx5Ok1heQorNTpMQTpMQU86TEFPUzpQaG9uZ3NhbHk6UGhvbmdzYWx5Cis2OkxBOkxBTzpMQU9TOlBob25nc2FseTpTYW1waGFuaAorNzpMQTpMQU86TEFPUzpQaG9uZ3NhbHk6WW90IE91CisxOkxBOkxBTzpMQU9TOlNhcmF2YW5lOktob25nc2Vkb25lCisyOkxBOkxBTzpMQU9TOlNhcmF2YW5lOkxha2hvbmVwaGVuZworMzpMQTpMQU86TEFPUzpTYXJhdmFuZTpMYW8gTmdhbQorNDpMQTpMQU86TEFPUzpTYXJhdmFuZTpTYSBNb3VheQorNTpMQTpMQU86TEFPUzpTYXJhdmFuZTpTYXJhdmFuZQorNjpMQTpMQU86TEFPUzpTYXJhdmFuZTpUYSBPeQorNzpMQTpMQU86TEFPUzpTYXJhdmFuZTpUb3VtbGFuZQorODpMQTpMQU86TEFPUzpTYXJhdmFuZTpWYXB5CisxOkxBOkxBTzpMQU9TOkhvdWFwaGFuaDpIb3VhbWV1YW5nCisyOkxBOkxBTzpMQU9TOkhvdWFwaGFuaDpTYW1uZXVhCiszOkxBOkxBTzpMQU9TOkhvdWFwaGFuaDpTYW10YXkKKzQ6TEE6TEFPOkxBT1M6SG91YXBoYW5oOlZpZW5ndGhvbmcKKzU6TEE6TEFPOkxBT1M6SG91YXBoYW5oOlZpZW5neGF5Cis2OkxBOkxBTzpMQU9TOkhvdWFwaGFuaDpYaWVuZ2tobworMTpMQTpMQU86TEFPUzpWaWVudGlhbmU6S2FzeQorMjpMQTpMQU86TEFPUzpWaWVudGlhbmU6S2Vvb3Vkb20KKzM6TEE6TEFPOkxBT1M6VmllbnRpYW5lOlBoZXVhbmcKKzQ6TEE6TEFPOkxBT1M6VmllbnRpYW5lOlBob2xob25nCis1OkxBOkxBTzpMQU9TOlZpZW50aWFuZTpTYW5ha2hhbQorNjpMQTpMQU86TEFPUzpWaWVudGlhbmU6VGhvdWxha2hvbQorNzpMQTpMQU86TEFPUzpWaWVudGlhbmU6VmFuZ3ZpZW5nCisxOkxBOkxBTzpMQU9TOktoYW1tb3VhbmU6Qm91YWxhcGhhCisyOkxBOkxBTzpMQU9TOktoYW1tb3VhbmU6SGluZWJvdW5lCiszOkxBOkxBTzpMQU9TOktoYW1tb3VhbmU6TWFoYXhheQorNDpMQTpMQU86TEFPUzpLaGFtbW91YW5lOk5ha2FpCis1OkxBOkxBTzpMQU9TOktoYW1tb3VhbmU6Tm9uZyBCb2sKKzY6TEE6TEFPOkxBT1M6S2hhbW1vdWFuZTpTYXlib3VhdGhvbmcKKzc6TEE6TEFPOkxBT1M6S2hhbW1vdWFuZTpTZWJhbmdwaGF5Cis4OkxBOkxBTzpMQU9TOktoYW1tb3VhbmU6VGhha2hlaworOTpMQTpMQU86TEFPUzpLaGFtbW91YW5lOllvbW1hbGF0aAorMTpMQTpMQU86TEFPUzpDaGFtcGFzc2FjazpCYXRpZW5nY2hhbGV1bnNvdWsKKzI6TEE6TEFPOkxBT1M6Q2hhbXBhc3NhY2s6Q2hhbXBhc3NhY2sKKzM6TEE6TEFPOkxBT1M6Q2hhbXBhc3NhY2s6S2hvbmcKKzQ6TEE6TEFPOkxBT1M6Q2hhbXBhc3NhY2s6TW91bmxhcGFtb2sKKzU6TEE6TEFPOkxBT1M6Q2hhbXBhc3NhY2s6UGFrIFNlCis2OkxBOkxBTzpMQU9TOkNoYW1wYXNzYWNrOlBha3NvbmcKKzc6TEE6TEFPOkxBT1M6Q2hhbXBhc3NhY2s6UGF0aG91cGhvbmUKKzg6TEE6TEFPOkxBT1M6Q2hhbXBhc3NhY2s6UGhvbnRob25nCis5OkxBOkxBTzpMQU9TOkNoYW1wYXNzYWNrOlNhbmFzb21ib3VuZQorMTA6TEE6TEFPOkxBT1M6Q2hhbXBhc3NhY2s6U291a2hvdW1tYQorMTpMQTpMQU86TEFPUzpTYXZhbm5ha2hldDpBc3NhcGhvbmUKKzI6TEE6TEFPOkxBT1M6U2F2YW5uYWtoZXQ6QXRzYXBoYW5ndGhvbmcKKzM6TEE6TEFPOkxBT1M6U2F2YW5uYWtoZXQ6Q2hhbXBob25lCis0OkxBOkxBTzpMQU9TOlNhdmFubmFraGV0OktoYW50aGFib3VyeQorNTpMQTpMQU86TEFPUzpTYXZhbm5ha2hldDpOb25nCis2OkxBOkxBTzpMQU9TOlNhdmFubmFraGV0Ok91dGhvdW1waG9uZQorNzpMQTpMQU86TEFPUzpTYXZhbm5ha2hldDpQaGluZQorODpMQTpMQU86TEFPUzpTYXZhbm5ha2hldDpTZXBvbmgKKzk6TEE6TEFPOkxBT1M6U2F2YW5uYWtoZXQ6U29uZ2tob25lCisxMDpMQTpMQU86TEFPUzpTYXZhbm5ha2hldDpUaGFwYW5ndGhvbmcKKzExOkxBOkxBTzpMQU9TOlNhdmFubmFraGV0OlZpcmFib3VyeQorMTI6TEE6TEFPOkxBT1M6U2F2YW5uYWtoZXQ6WGF5Ym91cnkKKzEzOkxBOkxBTzpMQU9TOlNhdmFubmFraGV0OlhvbmJvdXJ5CisxOkxBOkxBTzpMQU9TOk91ZG9teGF5OkJlbmcKKzI6TEE6TEFPOkxBT1M6T3Vkb214YXk6SG91bmUKKzM6TEE6TEFPOkxBT1M6T3Vkb214YXk6TGEKKzQ6TEE6TEFPOkxBT1M6T3Vkb214YXk6TmEgTW8KKzU6TEE6TEFPOkxBT1M6T3Vkb214YXk6TmdhCis2OkxBOkxBTzpMQU9TOk91ZG9teGF5OlBhayBCZW5nCis3OkxBOkxBTzpMQU9TOk91ZG9teGF5OlhheQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9MQk4vTEJOX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9MQk4vTEJOX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMThjMmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0xCTi9MQk5fQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSw3IEBACisxOkxCLUJBOkxCOkJFSVJPVVQKKzI6TEItQkk6TEI6RUwgQkVRQUEKKzM6TEItSkw6TEI6SkFCQUwgTE9VQk5BTkUKKzQ6TEItTDpMQjpMRUJBTk9OCis1OkxCLUFTOkxCOkxPVUJOQU5FIEVDSCBDSEVNQUxJCis2OkxCLUpBOkxCOkxPVUJOQU5FIEVKIEpOT1VCSQorNzpMQi1OQTpMQjpOQUJBVElZRQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9MQk4vTEJOX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9MQk4vTEJOX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZTRiZjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0xCTi9MQk5fQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSBAQAorMTpMQjpMQk46TEVCQU5PTjpMZWJhbm9uOkxCTi5MMi4xCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0xCUi9MQlJfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0xCUi9MQlJfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhNWIyMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTEJSL0xCUl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDE1IEBACisxOkxSLUJNOkxSOkJPTUkgVEVSUi4KKzI6TFItQkc6TFI6Qk9ORworMzpMUi1HQjpMUjpHUkFORCBCQVNTQQorNDpMUi1DTTpMUjpHUkFORCBDQVBFIE1PVU5UCis1OkxSLUdHOkxSOkdSQU5EIEdFREVICis2OkxSLUdLOkxSOktSVSBDT0FTVCBURVJSLgorNzpMUi1MTzpMUjpMT0ZBCis4OkxSLU1HOkxSOk1BUkdJQkkKKzk6TFItTVI6TFI6TUFSU0hBTEwgVEVSUi4KKzEwOkxSLU1ZOkxSOk1BUllMQU5ECisxMTpMUi1NTzpMUjpNT05UU0VSUkFETworMTI6TFItTkk6TFI6TklNQkEKKzEzOkxSLVJJOkxSOlJJVkVSQ0VTUyBURVJSLgorMTQ6TFItU0E6TFI6U0FTU1RPV04gVEVSUi4KKzE1OkxSLVNJOkxSOlNJTk9FCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0xCUi9MQlJfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0xCUi9MQlJfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlNWFiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTEJSL0xCUl9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDU0IEBACisxOkxSOkxCUjpMSUJFUklBOk1hcnNoYWxsIFRlcnIuOk1hbWJhIEthYmEKKzI6TFI6TEJSOkxJQkVSSUE6TWFyc2hhbGwgVGVyci46TWFyc2hhbGwKKzE6TFI6TEJSOkxJQkVSSUE6TW9udHNlcnJhZG86Q2FyZXlzYnVyZworMjpMUjpMQlI6TElCRVJJQTpNb250c2VycmFkbzpGaXJlc3RvbmUKKzM6TFI6TEJSOkxJQkVSSUE6TW9udHNlcnJhZG86S2FrYXRhCis0OkxSOkxCUjpMSUJFUklBOk1vbnRzZXJyYWRvOk1vbnJvdmlhCis1OkxSOkxCUjpMSUJFUklBOk1vbnRzZXJyYWRvOlN0LiBQYXVsIFJpdmVyCis2OkxSOkxCUjpMSUJFUklBOk1vbnRzZXJyYWRvOlRvZGVlCisxOkxSOkxCUjpMSUJFUklBOk1hcnlsYW5kOkJ1YWgKKzI6TFI6TEJSOkxJQkVSSUE6TWFyeWxhbmQ6SGFycGVyCiszOkxSOkxCUjpMSUJFUklBOk1hcnlsYW5kOlBsZWJvCisxOkxSOkxCUjpMSUJFUklBOkdyYW5kIEJhc3NhOk5vLiAxCisyOkxSOkxCUjpMSUJFUklBOkdyYW5kIEJhc3NhOk5vLiAyCiszOkxSOkxCUjpMSUJFUklBOkdyYW5kIEJhc3NhOk5vLiAzCis0OkxSOkxCUjpMSUJFUklBOkdyYW5kIEJhc3NhOk5vLiA0Cis1OkxSOkxCUjpMSUJFUklBOkdyYW5kIEJhc3NhOk5vLiA1IEJ1Y2hhbmFuCisxOkxSOkxCUjpMSUJFUklBOkdyYW5kIEdlZGVoOkdiYXJ6b24KKzI6TFI6TEJSOkxJQkVSSUE6R3JhbmQgR2VkZWg6R2JlYXBvCiszOkxSOkxCUjpMSUJFUklBOkdyYW5kIEdlZGVoOktvbm9ibworNDpMUjpMQlI6TElCRVJJQTpHcmFuZCBHZWRlaDpUY2hpZW4KKzU6TFI6TEJSOkxJQkVSSUE6R3JhbmQgR2VkZWg6V2ViYm8KKzE6TFI6TEJSOkxJQkVSSUE6R3JhbmQgQ2FwZSBNb3VudDpHYXJ3bGEKKzI6TFI6TEJSOkxJQkVSSUE6R3JhbmQgQ2FwZSBNb3VudDpQb3JrcGFhCiszOkxSOkxCUjpMSUJFUklBOkdyYW5kIENhcGUgTW91bnQ6Um9iZXJ0c3BvcnQKKzQ6TFI6TEJSOkxJQkVSSUE6R3JhbmQgQ2FwZSBNb3VudDpUZXdvcgorMTpMUjpMQlI6TElCRVJJQTpTaW5vZTpCbG9uaSBTaW5vZQorMjpMUjpMQlI6TElCRVJJQTpTaW5vZTpHcmVlbnZpbGxlCiszOkxSOkxCUjpMSUJFUklBOlNpbm9lOkp1YXJ6b24gU2lub2UKKzQ6TFI6TEJSOkxJQkVSSUE6U2lub2U6SnVhcnpvbiBTdWIKKzU6TFI6TEJSOkxJQkVSSUE6U2lub2U6U2lub2UgUml2ZXIgU29ibworMTpMUjpMQlI6TElCRVJJQTpTYXNzdG93biBUZXJyLjpKZW9oCisxOkxSOkxCUjpMSUJFUklBOkJvbmc6R2Jhcm5nYQorMjpMUjpMQlI6TElCRVJJQTpCb25nOkdpYmkKKzM6TFI6TEJSOkxJQkVSSUE6Qm9uZzpLb2tveWFoCis0OkxSOkxCUjpMSUJFUklBOkJvbmc6U2FsYWxhCis1OkxSOkxCUjpMSUJFUklBOkJvbmc6U2Fub3llYQorMTpMUjpMQlI6TElCRVJJQTpCb21pIFRlcnIuOktsYXkKKzI6TFI6TEJSOkxJQkVSSUE6Qm9taSBUZXJyLjpNZWNjYQorMTpMUjpMQlI6TElCRVJJQTpOaW1iYTpHYmVobGF5CisyOkxSOkxCUjpMSUJFUklBOk5pbWJhOlNhY2xlcGVhCiszOkxSOkxCUjpMSUJFUklBOk5pbWJhOlNhbm5pcXVlbGxpZQorNDpMUjpMQlI6TElCRVJJQTpOaW1iYTpUYXBwaXRhCis1OkxSOkxCUjpMSUJFUklBOk5pbWJhOllhcndlaW4gTWVuc29ubi4KKzY6TFI6TEJSOkxJQkVSSUE6TmltYmE6Wm9lIEdlaAorMTpMUjpMQlI6TElCRVJJQTpLcnUgQ29hc3QgVGVyci46TG93ZSBLcnUgQ29hc3QKKzI6TFI6TEJSOkxJQkVSSUE6S3J1IENvYXN0IFRlcnIuOlVwcGVyIEtydSBDb2FzdAorMTpMUjpMQlI6TElCRVJJQTpMb2ZhOkJvcG9sdQorMjpMUjpMQlI6TElCRVJJQTpMb2ZhOkdiYXJtYQorMzpMUjpMQlI6TElCRVJJQTpMb2ZhOkd1bWEKKzQ6TFI6TEJSOkxJQkVSSUE6TG9mYTpLb2xhaHVuCis1OkxSOkxCUjpMSUJFUklBOkxvZmE6Vm9pbmphbWEKKzY6TFI6TEJSOkxJQkVSSUE6TG9mYTpab3J6b3IKKzE6TFI6TEJSOkxJQkVSSUE6Uml2ZXJjZXNzIFRlcnIuOk1vcndlaCBOby4gNUIKKzI6TFI6TEJSOkxJQkVSSUE6Uml2ZXJjZXNzIFRlcnIuOlRpbWJvIE5vLiA1QQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9MQlkvTEJZX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9MQlkvTEJZX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMjc2YTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0xCWS9MQllfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSw1MiBAQAorMTpMWS1TUzpMWTpBQlJUQUggVVJNTgorMjpMWS1BREo6TFk6QUpEQUJJWUEgKEFHRURBQklBKQorMzpMWS1BSjpMWTpBSkRCSVkKKzQ6TFktQVpZOkxZOkFMIEFaSVpJWUFICis1OkxZLUJVOkxZOkFMIEJVTk4KKzY6TFktRlRIOkxZOkFMIEZBVEFICis3OkxZLUhaOkxZOkFMIElaTSBBTCBBS0hBUgorODpMWS1KQTpMWTpBTCBKQUJBTCBBTCBBS0hEQVIKKzk6TFktSkk6TFk6QUwgSklGUkFICisxMDpMWS1KVTpMWTpBTCBKVUZSQUgKKzExOkxZLUtITzpMWTpBTCBLSE9NUworMTI6TFktS0Y6TFk6QUwgS1VGUkFICisxMzpMWS1NSjpMWTpBTCBNQVJKCisxNDpMWS1NQjpMWTpBTCBNQVJRQUIKKzE1OkxZLVFUOkxZOkFMIFFBUk4KKzE2OkxZLVFCOkxZOkFMIFFVQkJBSAorMTc6TFktV0E6TFk6QUwgV0FICisxODpMWS1OUTpMWTpBTiBOVVFBIEFMIEtIQU1TCisxOTpMWS1UQjpMWTpBUkJVTFVTCisyMDpMWS1BU0g6TFk6QVNIIFNIQVRJCisyMTpMWS1TSDpMWTpBU0ggU0hJCisyMjpMWS1BV0I6TFk6QVdCQVJJIChVQkFSSSkKKzIzOkxZLVpBOkxZOkFaIFpBV0lBIChBWlpBV0lZQSkKKzI0OkxZLUJXOkxZOkJBTiBXQUxECisyNTpMWS1CQTpMWTpCQU5HSEFaSQorMjY6TFktRFI6TFk6REFSTkFICisyNzpMWS1HSEE6TFk6R0hBREFNSVMKKzI4OkxZLUdEOkxZOkdIQURNSVMKKzI5OkxZLUdSWTpMWTpHSEFSWUFOCiszMDpMWS1HUjpMWTpHSEFSWU4KKzMxOkxZLUdUOkxZOkdIVAorMzI6TFktSkI6TFk6SkFHSEJCCiszMzpMWS1NSTpMWTpNSVJUQUgKKzM0OkxZLU1JUzpMWTpNSVNVUkFUQQorMzU6TFktTVo6TFk6TUlaREFICiszNjpMWS1NUTpMWTpNVVJaVVEKKzM3OkxZLU5MOkxZOk5MVAorMzg6TFktTlVHOkxZOk5VUUFUIEFMIEtIQU1TCiszOTpMWS1TQjpMWTpTQUJICis0MDpMWS1TQUI6TFk6U0FCSEEKKzQxOkxZLVNBVzpMWTpTQVdGQUpKSU4gKFNPRlVMSkVFTikKKzQyOkxZLVNSOkxZOlNVUlQKKzQzOkxZLVNVUjpMWTpTVVJUIChTSVJURSkKKzQ0OkxZLVRNOkxZOlRBUkhOQUggTUFTQUxMVEFICis0NTpMWS1UQVI6TFk6VEFSSFVOQUgKKzQ2OkxZLVROOkxZOlRKUiBXQSBBTiBOQVcgQVJCCis0NzpMWS1UUkk6TFk6VFJJUE9MSSAoVEFSQUJVTFVTKQorNDg6TFktVFVCOkxZOlRVQlJVUSAoVE9CUlVLKQorNDk6TFktV0Q6TFk6V0QgQUwgQVlUCis1MDpMWS1ZQUY6TFk6WUFGUkFOIChZRUZSRU4pCis1MTpMWS1ZSjpMWTpZQUZSQU4gSkQKKzUyOkxZLVpFTDpMWTpaRUxFSVRJTiAoWkxJVEVOKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9MQlkvTEJZX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9MQlkvTEJZX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNWJhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0xCWS9MQllfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSwyNSBAQAorMTpMWTpMQlk6TElCWUE6TXVyenVxOk4uQQorMTpMWTpMQlk6TElCWUE6R2hhZGFtaXM6Ti5BCisxOkxZOkxCWTpMSUJZQTpBbCBGYXRhaDpOLkEKKzE6TFk6TEJZOkxJQllBOlRhcmh1bmFoOk4uQQorMTpMWTpMQlk6TElCWUE6QXdiYXJpIChVYmFyaSk6Ti5BCisxOkxZOkxCWTpMSUJZQTpBbCBBeml6aXlhaDpOLkEKKzE6TFk6TEJZOkxJQllBOllhZnJhbiAoWWVmcmVuKTpOLkEKKzE6TFk6TEJZOkxJQllBOlR1YnJ1cSAoVG9icnVrKTpOLkEKKzE6TFk6TEJZOkxJQllBOkFzaCBTaGF0aTpOLkEKKzE6TFk6TEJZOkxJQllBOkFsIEt1ZnJhaDpOLkEKKzE6TFk6TEJZOkxJQllBOkFqZGFiaXlhIChBZ2VkYWJpYSk6Ti5BCisxOkxZOkxCWTpMSUJZQTpaZWxlaXRpbiAoWmxpdGVuKTpOLkEKKzE6TFk6TEJZOkxJQllBOlNhYmhhOk4uQQorMTpMWTpMQlk6TElCWUE6QWwgSnVmcmFoOk4uQQorMTpMWTpMQlk6TElCWUE6QWwgS2hvbXM6Ti5BCisxOkxZOkxCWTpMSUJZQTpBeiBaYXdpYSAoQXp6YXdpeWEpOk4uQQorMTpMWTpMQlk6TElCWUE6RGFybmFoOk4uQQorMTpMWTpMQlk6TElCWUE6U3VydCAoU2lydGUpOk4uQQorMTpMWTpMQlk6TElCWUE6VHJpcG9saSAoVGFyYWJ1bHVzKTpOLkEKKzE6TFk6TEJZOkxJQllBOkJhbmdoYXppOk4uQQorMTpMWTpMQlk6TElCWUE6R2hhcnlhbjpOLkEKKzE6TFk6TEJZOkxJQllBOk1pc3VyYXRhOk4uQQorMTpMWTpMQlk6TElCWUE6U2F3ZmFqamluIChTb2Z1bGplZW4pOk4uQQorMTpMWTpMQlk6TElCWUE6TnVxYXQgQWwgS2hhbXM6Ti5BCisxOkxZOkxCWTpMSUJZQTpBbCBKYWJhbCBBbCBBa2hkYXI6Ti5BCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0xJRS9MSUVfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0xJRS9MSUVfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU5YmJlYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTElFL0xJRV9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxIEBACisxOkxJLUxJRTpMSTpMSUNIVEVOU1RFSU4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTElFL0xJRV9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTElFL0xJRV9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9MSUUvTElFX0FETUlOMl9MRVgudHh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0xTTy9MU09fQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0xTTy9MU09fQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMwNTU5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTFNPL0xTT19BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDEwIEBACisxOkxTLUQ6TFM6QkVSRUEKKzI6TFMtQjpMUzpCVVRIQSBCVVRIRQorMzpMUy1DOkxTOkxFUklCRQorNDpMUy1FOkxTOk1BRkVURU5HCis1OkxTLUE6TFM6TUFTRVJVCis2OkxTLUY6TFM6TU9IQUxFJ1MgSE9FSworNzpMUy1KOkxTOk1PS0hPVExPTkcKKzg6TFMtSDpMUzpRVUFDSEEnUyBORUsKKzk6TFMtRzpMUzpRVVRISU5HCisxMDpMUy1LOkxTOlRIQUJBIFRTRUtBCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0xTTy9MU09fQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L0xTTy9MU09fQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViY2RlMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTFNPL0xTT19BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDExIEBACisxOkxTOkxTTzpMRVNPVEhPOkxlcmliZTpMU08uTDIuNQorMTpMUzpMU086TEVTT1RITzpNYWZldGVuZzpMU08uTDIuMTAKKzI6TFM6TFNPOkxFU09USE86TWFmZXRlbmc6TFNPLkwyLjExCisxOkxTOkxTTzpMRVNPVEhPOk1vaGFsZSdTIEhvZWs6TFNPLkwyLjYKKzE6TFM6TFNPOkxFU09USE86TW9raG90bG9uZzpMU08uTDIuNAorMTpMUzpMU086TEVTT1RITzpCdXRoYS1CdXRoZTpMU08uTDIuNworMTpMUzpMU086TEVTT1RITzpRdXRoaW5nOkxTTy5MMi4zCisxOkxTOkxTTzpMRVNPVEhPOlRoYWJhIFRzZWthOkxTTy5MMi4xCisxOkxTOkxTTzpMRVNPVEhPOkJlcmVhOkxTTy5MMi45CisxOkxTOkxTTzpMRVNPVEhPOk1hc2VydTpMU08uTDIuMgorMTpMUzpMU086TEVTT1RITzpRdWFjaGEnUyBOZWs6TFNPLkwyLjgKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTFVYL0xVWF9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTFVYL0xVWF9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGVmNWUyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9MVVgvTFVYX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEgQEAKKzE6TFUtTDpMWDpMVVhFTUJPVVJHIChHUkFORCBEVUNIRSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTFVYL0xVWF9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTFVYL0xVWF9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9MVVgvTFVYX0FETUlOMl9MRVgudHh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01BQy9NQUNfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01BQy9NQUNfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzMTg3NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTUFDL01BQ19BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxIEBACisxOk1PLU06TU86TUFDQVUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTUFDL01BQ19BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTUFDL01BQ19BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDdjYzVlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NQUMvTUFDX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMyBAQAorMTpNTzpNQUM6TUFDQVU6TWFjYXU6TUFDLkwyLjEKKzI6TU86TUFDOk1BQ0FVOk1hY2F1Ok1BQy5MMi4yCiszOk1POk1BQzpNQUNBVTpNYWNhdTpNQUMuTDIuMwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NQVIvTUFSX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NQVIvTUFSX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMTU4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01BUi9NQVJfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSw1OCBAQAorMTpNQS1BR0Q6TUE6QUdBRElSCisyOk1BLUJBSDpNQTpBSVQgQkFIQQorMzpNQS1NRUw6TUE6QUlUIE1FTExPVUwKKzQ6TUEtSEFPOk1BOkFMIEhBT1VaCis1Ok1BLUhPQzpNQTpBTCBIT0NFSU1BCis2Ok1BLUFTWjpNQTpBU1NBIFpBRworNzpNQS1BWkk6TUE6QVpJTEFMCis4Ok1BLUJFUzpNQTpCRU4gU0xJTUFORQorOTpNQS1CRU06TUE6QkVOSSBNRUxMQUwKKzEwOk1BLUJFUjpNQTpCRVJLQU5FCisxMTpNQS1CT0Q6TUE6Qk9VSkRPVVIKKzEyOk1BLUJPTTpNQTpCT1VMRU1BTkUKKzEzOk1BLUNBUzpNQTpDQVNBQkxBTkNBIFtEQVIgRUwgQkVJREFdCisxNDpNQS1DOk1BOkNFTlRSRQorMTU6TUEtQ0VOOk1BOkNFTlRSRSBOT1JECisxNjpNQS1DRVM6TUE6Q0VOVFJFIFNVRAorMTc6TUEtQ0hFOk1BOkNIRUZDSEFPVUVORQorMTg6TUEtQ0hJOk1BOkNISUNIQU9VQQorMTk6TUEtSEFKOk1BOkVMIEhBSkVCCisyMDpNQS1KREk6TUE6RUwgSkFESURBCisyMTpNQS1FUlI6TUE6RVJSQUNISURJQQorMjI6TUEtRVNNOk1BOkVTIFNNQVJBCisyMzpNQS1FU0k6TUE6RVNTQU9VSVJBCisyNDpNQS1GRVM6TUE6RkVTCisyNTpNQS1GSUc6TUE6RklHVUlHCisyNjpNQS1HVUU6TUE6R1VFTE1JTQorMjc6TUEtSUZSOk1BOklGUkFORQorMjg6TUEtSlJBOk1BOkpFUkFEQQorMjk6TUEtS0VTOk1BOktFTEFBVCBTUkFHSE5BCiszMDpNQS1LRU46TUE6S0VOSVRSQQorMzE6TUEtS0hFOk1BOktIRU1JU1NFVAorMzI6TUEtS0hOOk1BOktIRU5JRlJBCiszMzpNQS1LSE86TUE6S0hPVVJJQkdBCiszNDpNQS1MQUE6TUE6TEFBWU9VTkUKKzM1Ok1BLUxBUjpNQTpMQVJBQ0hFCiszNjpNQS1NQVI6TUE6TUFSUkFLRUNICiszNzpNQS1NRUs6TUE6TUVLTkVTCiszODpNQS1OQUQ6TUE6TkFET1IKKzM5Ok1BLU46TUE6Tk9SRCBPVUVTVAorNDA6TUEtT1I6TUE6T1JJRU5UQUwKKzQxOk1BLU9VQTpNQTpPVUFSWkFaQVRFCis0MjpNQS1PVUQ6TUE6T1VFRCBFRCBEQUhBQgorNDM6TUEtT1VKOk1BOk9VSkRBCis0NDpNQS1SQkE6TUE6UkFCQVQgU0FMRQorNDU6TUEtU0FGOk1BOlNBRkkKKzQ2Ok1BLVNFRjpNQTpTRUZST1UKKzQ3Ok1BLVNFVDpNQTpTRVRUQVQKKzQ4Ok1BLVNJSzpNQTpTSURJIEtBQ0VNCis0OTpNQS1TOk1BOlNVRAorNTA6TUEtVE5UOk1BOlRBTiBUQU4KKzUxOk1BLVRORzpNQTpUQU5HRVIKKzUyOk1BLVRBTzpNQTpUQU9VTkFURQorNTM6TUEtVEFSOk1BOlRBUk9VREFOTlQKKzU0Ok1BLVRBVDpNQTpUQVRBCis1NTpNQS1UQVo6TUE6VEFaQQorNTY6TUEtVEU6TUE6VEVOU0lGVAorNTc6TUEtVEVUOk1BOlRFVE9VQU4KKzU4Ok1BLVRJWjpNQTpUSVpOSVQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTUFSL01BUl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTUFSL01BUl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzE2MDNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NQVIvTUFSX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsNDkgQEAKKzE6TUE6TUFSOk1PUk9DQ086Q2VudHJlOkFpbiBDaG9jaworMjpNQTpNQVI6TU9ST0NDTzpDZW50cmU6QWluIFNlYmFhL0hheSBNLgorMzpNQTpNQVI6TU9ST0NDTzpDZW50cmU6QWwgRmlkYS9EZXJiIFN1bAorNDpNQTpNQVI6TU9ST0NDTzpDZW50cmU6QXppbGFsCis1Ok1BOk1BUjpNT1JPQ0NPOkNlbnRyZTpCZW4gU2xpbWFuZQorNjpNQTpNQVI6TU9ST0NDTzpDZW50cmU6QmVuLU1zaWNrL090aG1hbgorNzpNQTpNQVI6TU9ST0NDTzpDZW50cmU6QmVuaSBNZWxsYWwKKzg6TUE6TUFSOk1PUk9DQ086Q2VudHJlOkNhc2EtQW5mYQorOTpNQTpNQVI6TU9ST0NDTzpDZW50cmU6RWwgSmFkaWRhCisxMDpNQTpNQVI6TU9ST0NDTzpDZW50cmU6S2hvdXJpYmdhCisxMTpNQTpNQVI6TU9ST0NDTzpDZW50cmU6U2V0dGF0CisxMjpNQTpNQVI6TU9ST0NDTzpDZW50cmU6U2lkaSBCZXJuLi9Nb2hhbS4tWm5hdGEKKzE6TUE6TUFSOk1PUk9DQ086Q2VudHJlIFN1ZDpFcnJhY2hpZGlhCisyOk1BOk1BUjpNT1JPQ0NPOkNlbnRyZSBTdWQ6SWZyYW5lCiszOk1BOk1BUjpNT1JPQ0NPOkNlbnRyZSBTdWQ6S2hlbmlmcmEKKzQ6TUE6TUFSOk1PUk9DQ086Q2VudHJlIFN1ZDpNZWtuZXMKKzE6TUE6TUFSOk1PUk9DQ086VGVuc2lmdDpFbCBLZWxhYQorMjpNQTpNQVI6TU9ST0NDTzpUZW5zaWZ0OkVzc2FvdWlyYQorMzpNQTpNQVI6TU9ST0NDTzpUZW5zaWZ0Ok1hcnJha2VzaAorNDpNQTpNQVI6TU9ST0NDTzpUZW5zaWZ0OlNhZmkKKzE6TUE6TUFSOk1PUk9DQ086U3VkOkFnYWRpcgorMjpNQTpNQVI6TU9ST0NDTzpTdWQ6Qm91amRvdXIKKzM6TUE6TUFSOk1PUk9DQ086U3VkOkVzLVNlbWFyYQorNDpNQTpNQVI6TU9ST0NDTzpTdWQ6R3VlbG1pbgorNTpNQTpNQVI6TU9ST0NDTzpTdWQ6TGFheW91bmUKKzY6TUE6TUFSOk1PUk9DQ086U3VkOk91YXJ6YXphdGUKKzc6TUE6TUFSOk1PUk9DQ086U3VkOk91ZWQgRWQgRGFoYWIKKzg6TUE6TUFSOk1PUk9DQ086U3VkOlRhbi1UYW4KKzk6TUE6TUFSOk1PUk9DQ086U3VkOlRhcm91ZGFudAorMTA6TUE6TUFSOk1PUk9DQ086U3VkOlRhdGEKKzExOk1BOk1BUjpNT1JPQ0NPOlN1ZDpUaXpuaXQKKzE6TUE6TUFSOk1PUk9DQ086Q2VudHJlIE5vcmQ6QWwgSG9jZWltYQorMjpNQTpNQVI6TU9ST0NDTzpDZW50cmUgTm9yZDpCb3VsbWFuZQorMzpNQTpNQVI6TU9ST0NDTzpDZW50cmUgTm9yZDpGZXMKKzQ6TUE6TUFSOk1PUk9DQ086Q2VudHJlIE5vcmQ6VGFvdW5hdGUKKzU6TUE6TUFSOk1PUk9DQ086Q2VudHJlIE5vcmQ6VGF6YQorMTpNQTpNQVI6TU9ST0NDTzpPcmllbnRhbDpGaWd1aWcKKzI6TUE6TUFSOk1PUk9DQ086T3JpZW50YWw6TmFkb3IKKzM6TUE6TUFSOk1PUk9DQ086T3JpZW50YWw6T3VqZGEKKzE6TUE6TUFSOk1PUk9DQ086Tm9yZCBPdWVzdDpDaGVmY2hhb3VlbmUKKzI6TUE6TUFSOk1PUk9DQ086Tm9yZCBPdWVzdDpLZW5pdHJhCiszOk1BOk1BUjpNT1JPQ0NPOk5vcmQgT3Vlc3Q6S2hlbWlzc2V0Cis0Ok1BOk1BUjpNT1JPQ0NPOk5vcmQgT3Vlc3Q6TGFyYWNoZQorNTpNQTpNQVI6TU9ST0NDTzpOb3JkIE91ZXN0OlJhYmF0Cis2Ok1BOk1BUjpNT1JPQ0NPOk5vcmQgT3Vlc3Q6U2FsZQorNzpNQTpNQVI6TU9ST0NDTzpOb3JkIE91ZXN0OlNpZGkgS2FjZW0KKzg6TUE6TUFSOk1PUk9DQ086Tm9yZCBPdWVzdDpTa2hpcmF0ZSBUZW1hcmEKKzk6TUE6TUFSOk1PUk9DQ086Tm9yZCBPdWVzdDpUYW5nZXIKKzEwOk1BOk1BUjpNT1JPQ0NPOk5vcmQgT3Vlc3Q6VGV0b3VhbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NREEvTURBX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NREEvTURBX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZmU1NWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01EQS9NREFfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxNCBAQAorMTpNRC1CQTpNRDpCTEkKKzI6TUQtQ0E6TUQ6Q0FIVUwKKzM6TUQtQ1U6TUQ6Q0hJSU5VCis0Ok1ELUNVOk1EOkNISUlOVQorNTpNRC1FRDpNRDpFRElORQorNjpNRC1HQTpNRDpHR1VaSUEsIFVOSVRBVEUgVEVSSVRPUklBTCBBVVRPTk9NCis3Ok1ELUxBOk1EOkxQVU5BCis4Ok1ELU06TUQ6TU9MREFWSUEKKzk6TUQtT1I6TUQ6T1JIRUkKKzEwOk1ELVNPOk1EOlNPUk9DQQorMTE6TUQtU046TUQ6U1RJTkdBIE5JU1RSVUxVSSwgVU5JVEFURUEgVEVSSVRPUklBTCBESU4KKzEyOk1ELVRBOk1EOlRBUkFDTElBCisxMzpNRC1USTpNRDpUSUdISU5BIFtCRU5ERVJdCisxNDpNRC1VTjpNRDpVTkdIRU5JCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01EQS9NREFfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01EQS9NREFfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQxOTlkNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTURBL01EQV9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxIEBACisxOk1EOk1EQTpNT0xET1ZJQTpNT0xEQVZJQTpNT0xEQVZJQQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NREcvTURHX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NREcvTURHX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OTUzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01ERy9NREdfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSw2IEBACisxOk1HLVQ6TUc6QU5UQU5BTkFSSVZPCisyOk1HLUQ6TUc6QU5UU0lSQU5BTkEKKzM6TUctRjpNRzpGSUFOQVJBTlRTT0EKKzQ6TUctTTpNRzpNQUhBSkFOR0EKKzU6TUctQTpNRzpUT0FNQVNJTkEKKzY6TUctVTpNRzpUT0xJQVJZCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01ERy9NREdfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01ERy9NREdfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQzMWY1YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTURHL01ER19BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDExMSBAQAorMTpNRzpNREc6TUFEQUdBU0NBUjpUb2FtYXNpbmE6QW1iYXRvbmRyYXpha2EKKzI6TUc6TURHOk1BREFHQVNDQVI6VG9hbWFzaW5hOkFtcGFyYWZhcmF2b2xhCiszOk1HOk1ERzpNQURBR0FTQ0FSOlRvYW1hc2luYTpBbmRpbGFtZW5hCis0Ok1HOk1ERzpNQURBR0FTQ0FSOlRvYW1hc2luYTpBbm9zaWJlIEFuLUFsYQorNTpNRzpNREc6TUFEQUdBU0NBUjpUb2FtYXNpbmE6QW50YW5hbWJhby1NYW5hbXBvdAorNjpNRzpNREc6TUFEQUdBU0NBUjpUb2FtYXNpbmE6RmVub2FyaXZvLUVzdAorNzpNRzpNREc6TUFEQUdBU0NBUjpUb2FtYXNpbmE6TWFoYW5vcm8KKzg6TUc6TURHOk1BREFHQVNDQVI6VG9hbWFzaW5hOk1hbmFuYXJhLU5vcmQKKzk6TUc6TURHOk1BREFHQVNDQVI6VG9hbWFzaW5hOk1hcm9hbnRzZXRyYQorMTA6TUc6TURHOk1BREFHQVNDQVI6VG9hbWFzaW5hOk1hcm9sYW1ibworMTE6TUc6TURHOk1BREFHQVNDQVI6VG9hbWFzaW5hOk1vcmFtYW5nYQorMTI6TUc6TURHOk1BREFHQVNDQVI6VG9hbWFzaW5hOk5vc3ktQm9yYWhhIChTdC4gTWFyaWUpCisxMzpNRzpNREc6TUFEQUdBU0NBUjpUb2FtYXNpbmE6U29hbmllcmFuYS1Jdm9uZ28KKzE0Ok1HOk1ERzpNQURBR0FTQ0FSOlRvYW1hc2luYTpUb2FtYXNpbmEgUnVyYWwKKzE1Ok1HOk1ERzpNQURBR0FTQ0FSOlRvYW1hc2luYTpUb2FtYXNpbmEgVXJiYW4KKzE2Ok1HOk1ERzpNQURBR0FTQ0FSOlRvYW1hc2luYTpWYXRvbWFuZHJ5CisxNzpNRzpNREc6TUFEQUdBU0NBUjpUb2FtYXNpbmE6VmF2YXRlbmluYQorMTg6TUc6TURHOk1BREFHQVNDQVI6VG9hbWFzaW5hOlZvaGliaW5hbnkgKEJyaWNrYXZpbGxlCisxOk1HOk1ERzpNQURBR0FTQ0FSOkZpYW5hcmFudHNvYTpBbWJhbGF2YW8KKzI6TUc6TURHOk1BREFHQVNDQVI6RmlhbmFyYW50c29hOkFtYmF0b2ZpbmFuZHJhaGFuYQorMzpNRzpNREc6TUFEQUdBU0NBUjpGaWFuYXJhbnRzb2E6QW1ib2hpbWFoYXNvYQorNDpNRzpNREc6TUFEQUdBU0NBUjpGaWFuYXJhbnRzb2E6QW1ib3NpdHJhCis1Ok1HOk1ERzpNQURBR0FTQ0FSOkZpYW5hcmFudHNvYTpCZWZvdGFrYQorNjpNRzpNREc6TUFEQUdBU0NBUjpGaWFuYXJhbnRzb2E6RmFuZHJpYW5hCis3Ok1HOk1ERzpNQURBR0FTQ0FSOkZpYW5hcmFudHNvYTpGYXJhZmFuZ2FuYQorODpNRzpNREc6TUFEQUdBU0NBUjpGaWFuYXJhbnRzb2E6RmlhbmFyYW50c29hIFJ1cmFsCis5Ok1HOk1ERzpNQURBR0FTQ0FSOkZpYW5hcmFudHNvYTpGaWFuYXJhbnRzb2EgVXJiYW4KKzEwOk1HOk1ERzpNQURBR0FTQ0FSOkZpYW5hcmFudHNvYTpJYWtvcmEKKzExOk1HOk1ERzpNQURBR0FTQ0FSOkZpYW5hcmFudHNvYTpJZmFuYWRpYW5hCisxMjpNRzpNREc6TUFEQUdBU0NBUjpGaWFuYXJhbnRzb2E6SWhvc3kKKzEzOk1HOk1ERzpNQURBR0FTQ0FSOkZpYW5hcmFudHNvYTpJa2FsYW1hdm9ueQorMTQ6TUc6TURHOk1BREFHQVNDQVI6RmlhbmFyYW50c29hOklrb25nbyAoRm9ydCBDYXJub3QpCisxNTpNRzpNREc6TUFEQUdBU0NBUjpGaWFuYXJhbnRzb2E6SXZvaGliZQorMTY6TUc6TURHOk1BREFHQVNDQVI6RmlhbmFyYW50c29hOk1hbmFrYXJhIFN1ZAorMTc6TUc6TURHOk1BREFHQVNDQVI6RmlhbmFyYW50c29hOk1hbmFuZHJpYW5hCisxODpNRzpNREc6TUFEQUdBU0NBUjpGaWFuYXJhbnRzb2E6TWFuYW5qYXJ5CisxOTpNRzpNREc6TUFEQUdBU0NBUjpGaWFuYXJhbnRzb2E6TWlkb25neS1TdWQKKzIwOk1HOk1ERzpNQURBR0FTQ0FSOkZpYW5hcmFudHNvYTpOb3N5LVZhcmlrYQorMjE6TUc6TURHOk1BREFHQVNDQVI6RmlhbmFyYW50c29hOlZhbmdhaW5kcmFubworMjI6TUc6TURHOk1BREFHQVNDQVI6RmlhbmFyYW50c29hOlZvaGlwZW5vCisyMzpNRzpNREc6TUFEQUdBU0NBUjpGaWFuYXJhbnRzb2E6Vm9uZHJvem8KKzE6TUc6TURHOk1BREFHQVNDQVI6QW50YW5hbmFyaXZvOkFtYmF0b2xhbXB5CisyOk1HOk1ERzpNQURBR0FTQ0FSOkFudGFuYW5hcml2bzpBbWJvaGlkcmF0cmltbworMzpNRzpNREc6TUFEQUdBU0NBUjpBbnRhbmFuYXJpdm86QW5kcmFtYXNpbmEKKzQ6TUc6TURHOk1BREFHQVNDQVI6QW50YW5hbmFyaXZvOkFuam96b3JvYmUKKzU6TUc6TURHOk1BREFHQVNDQVI6QW50YW5hbmFyaXZvOkFua2F6b2JlCis2Ok1HOk1ERzpNQURBR0FTQ0FSOkFudGFuYW5hcml2bzpBbnRhbmFuYXJpdm8tTm9yZAorNzpNRzpNREc6TUFEQUdBU0NBUjpBbnRhbmFuYXJpdm86QW50YW5hbmFyaXZvLVN1ZAorODpNRzpNREc6TUFEQUdBU0NBUjpBbnRhbmFuYXJpdm86QW50YW5hbmFyaXZvLXZpbGxlCis5Ok1HOk1ERzpNQURBR0FTQ0FSOkFudGFuYW5hcml2bzpBbnRhbmlmb3RzeQorMTA6TUc6TURHOk1BREFHQVNDQVI6QW50YW5hbmFyaXZvOkFudHNpcmFiZSBSdXJhbAorMTE6TUc6TURHOk1BREFHQVNDQVI6QW50YW5hbmFyaXZvOkFudHNpcmFiZSBVcmJhbgorMTI6TUc6TURHOk1BREFHQVNDQVI6QW50YW5hbmFyaXZvOkFyaXZvbmltYW1vCisxMzpNRzpNREc6TUFEQUdBU0NBUjpBbnRhbmFuYXJpdm86QmV0YWZvCisxNDpNRzpNREc6TUFEQUdBU0NBUjpBbnRhbmFuYXJpdm86RmFyYXRzaWhvCisxNTpNRzpNREc6TUFEQUdBU0NBUjpBbnRhbmFuYXJpdm86RmVub2FyaXZvLUNlbnRyZQorMTY6TUc6TURHOk1BREFHQVNDQVI6QW50YW5hbmFyaXZvOk1hbmpha2FuZHJpYW5hCisxNzpNRzpNREc6TUFEQUdBU0NBUjpBbnRhbmFuYXJpdm86TWlhcmluYXJpdm8KKzE4Ok1HOk1ERzpNQURBR0FTQ0FSOkFudGFuYW5hcml2bzpTb2F2aW5hbmRyaWFuYQorMTk6TUc6TURHOk1BREFHQVNDQVI6QW50YW5hbmFyaXZvOlRzaXJvYW5vbWFuZGlkeQorMTpNRzpNREc6TUFEQUdBU0NBUjpNYWhhamFuZ2E6QW1iYXRvLUJvaW5hCisyOk1HOk1ERzpNQURBR0FTQ0FSOk1haGFqYW5nYTpBbWJhdG9tYWludHkKKzM6TUc6TURHOk1BREFHQVNDQVI6TWFoYWphbmdhOkFuYWxhbGF2YQorNDpNRzpNREc6TUFEQUdBU0NBUjpNYWhhamFuZ2E6QW50c2Fsb3ZhCis1Ok1HOk1ERzpNQURBR0FTQ0FSOk1haGFqYW5nYTpBbnRzb2hpaHkKKzY6TUc6TURHOk1BREFHQVNDQVI6TWFoYWphbmdhOkJlYWxhbmFuYQorNzpNRzpNREc6TUFEQUdBU0NBUjpNYWhhamFuZ2E6QmVmYW5kcmlhbmEtTm9yZAorODpNRzpNREc6TUFEQUdBU0NBUjpNYWhhamFuZ2E6QmVzYWxhbXB5Cis5Ok1HOk1ERzpNQURBR0FTQ0FSOk1haGFqYW5nYTpCb3JpemlueSAoUG9ydC1CZXJnLikKKzEwOk1HOk1ERzpNQURBR0FTQ0FSOk1haGFqYW5nYTpLYW5kcmVobworMTE6TUc6TURHOk1BREFHQVNDQVI6TWFoYWphbmdhOk1hZXZhdGFuYW5hCisxMjpNRzpNREc6TUFEQUdBU0NBUjpNYWhhamFuZ2E6TWFoYWphbmdhIFJ1cmFsCisxMzpNRzpNREc6TUFEQUdBU0NBUjpNYWhhamFuZ2E6TWFoYWphbmdhIFVyYmFuCisxNDpNRzpNREc6TUFEQUdBU0NBUjpNYWhhamFuZ2E6TWFpbnRpcmFubworMTU6TUc6TURHOk1BREFHQVNDQVI6TWFoYWphbmdhOk1hbXBpa29ueQorMTY6TUc6TURHOk1BREFHQVNDQVI6TWFoYWphbmdhOk1hbmRyaXRzYXJhCisxNzpNRzpNREc6TUFEQUdBU0NBUjpNYWhhamFuZ2E6TWFyb3ZvYXkKKzE4Ok1HOk1ERzpNQURBR0FTQ0FSOk1haGFqYW5nYTpNaXRzaW5qbworMTk6TUc6TURHOk1BREFHQVNDQVI6TWFoYWphbmdhOk1vcmFmZW5vYmUKKzIwOk1HOk1ERzpNQURBR0FTQ0FSOk1haGFqYW5nYTpTb2FsYWxhCisyMTpNRzpNREc6TUFEQUdBU0NBUjpNYWhhamFuZ2E6VHNhcmF0YW5hbmEKKzE6TUc6TURHOk1BREFHQVNDQVI6VG9saWFyeTpBbWJvYXNhcnktU3VkCisyOk1HOk1ERzpNQURBR0FTQ0FSOlRvbGlhcnk6QW1ib3ZvbWJlLUFuZHJveQorMzpNRzpNREc6TUFEQUdBU0NBUjpUb2xpYXJ5OkFtcGFuaWh5Cis0Ok1HOk1ERzpNQURBR0FTQ0FSOlRvbGlhcnk6QW5rYXpvYWJvLVN1ZAorNTpNRzpNREc6TUFEQUdBU0NBUjpUb2xpYXJ5OkJla2lseQorNjpNRzpNREc6TUFEQUdBU0NBUjpUb2xpYXJ5OkJlbG9oYQorNzpNRzpNREc6TUFEQUdBU0NBUjpUb2xpYXJ5OkJlbG9uLWkgVHNpcmliaWhpbmEKKzg6TUc6TURHOk1BREFHQVNDQVI6VG9saWFyeTpCZW5lbml0cmEKKzk6TUc6TURHOk1BREFHQVNDQVI6VG9saWFyeTpCZXJvcm9oYQorMTA6TUc6TURHOk1BREFHQVNDQVI6VG9saWFyeTpCZXRpb2t5LVN1ZAorMTE6TUc6TURHOk1BREFHQVNDQVI6VG9saWFyeTpCZXRyb2thCisxMjpNRzpNREc6TUFEQUdBU0NBUjpUb2xpYXJ5Ok1haGFibworMTM6TUc6TURHOk1BREFHQVNDQVI6VG9saWFyeTpNYW5qYQorMTQ6TUc6TURHOk1BREFHQVNDQVI6VG9saWFyeTpNaWFuZHJpdmF6bworMTU6TUc6TURHOk1BREFHQVNDQVI6VG9saWFyeTpNb3JvbWJlCisxNjpNRzpNREc6TUFEQUdBU0NBUjpUb2xpYXJ5Ok1vcm9uZGF2YQorMTc6TUc6TURHOk1BREFHQVNDQVI6VG9saWFyeTpTYWthcmFoYQorMTg6TUc6TURHOk1BREFHQVNDQVI6VG9saWFyeTpUYW9sYWduYXJvIChGLURhdXBoaW4pCisxOTpNRzpNREc6TUFEQUdBU0NBUjpUb2xpYXJ5OlRvbGlhcnkgUnVyYWwKKzIwOk1HOk1ERzpNQURBR0FTQ0FSOlRvbGlhcnk6VG9saWFyeSBVcmJhbgorMjE6TUc6TURHOk1BREFHQVNDQVI6VG9saWFyeTpUc2lob21iZQorMTpNRzpNREc6TUFEQUdBU0NBUjpBbnRzaXJhbmFuYTpBbWJhbmphCisyOk1HOk1ERzpNQURBR0FTQ0FSOkFudHNpcmFuYW5hOkFtYmlsb2JlCiszOk1HOk1ERzpNQURBR0FTQ0FSOkFudHNpcmFuYW5hOkFuZGFwYQorNDpNRzpNREc6TUFEQUdBU0NBUjpBbnRzaXJhbmFuYTpBbnRhbGFoYQorNTpNRzpNREc6TUFEQUdBU0NBUjpBbnRzaXJhbmFuYTpBbnRzaXJhbmFuYSBSdXJhbAorNjpNRzpNREc6TUFEQUdBU0NBUjpBbnRzaXJhbmFuYTpBbnRzaXJhbmFuYSBVcmJhbgorNzpNRzpNREc6TUFEQUdBU0NBUjpBbnRzaXJhbmFuYTpOb3N5LUJlCis4Ok1HOk1ERzpNQURBR0FTQ0FSOkFudHNpcmFuYW5hOlNhbWJhdmEKKzk6TUc6TURHOk1BREFHQVNDQVI6QW50c2lyYW5hbmE6Vm9oaW1hcmluYSAoSWhhcmFuYSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTUVYL01FWF9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTUVYL01FWF9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzUzNmJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NRVgvTUVYX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMzIgQEAKKzE6TVgtQUdVOk1YOkFHVUFTQ0FMSUVOVEVTCisyOk1YLUJDTjpNWDpCQUpBIENBTElGT1JOSUEgTk9SVEUKKzM6TVgtQkNTOk1YOkJBSkEgQ0FMSUZPUk5JQSBTVVIKKzQ6TVgtQ0FNOk1YOkNBTVBFQ0hFCis1Ok1YLUNIUDpNWDpDSElBUEFTCis2Ok1YLUNISDpNWDpDSElIVUFIVUEKKzc6TVgtQ09BOk1YOkNPQUhVSUxBIERFIFpBUkFHT1pBCis4Ok1YLUNPTDpNWDpDT0xJTUEKKzk6TVgtRElGOk1YOkRJU1RSSVRPIEZFREVSQUwKKzEwOk1YLURVUjpNWDpEVVJBTkdPCisxMTpNWC1HVUE6TVg6R1VBTkFKVUFUTworMTI6TVgtR1JPOk1YOkdVRVJSRVJPCisxMzpNWC1ISUQ6TVg6SElEQUxHTworMTQ6TVgtSkFMOk1YOkpBTElTQ08KKzE1Ok1YLU1FWDpNWDpNRVhJQ08KKzE2Ok1YLU1JQzpNWDpNSUNIT0FDQU4gREUgT0NBTVBPCisxNzpNWC1NT1I6TVg6TU9SRUxPUworMTg6TVgtTkFZOk1YOk5BWUFSSVQKKzE5Ok1YLU5MRTpNWDpOVUVWTyBMRU9OCisyMDpNWC1PQVg6TVg6T0FYQUNBCisyMTpNWC1QVUU6TVg6UFVFQkxBCisyMjpNWC1RVUU6TVg6UVVFUkVUQVJPIERFIEFSVEVBR0EKKzIzOk1YLVJPTzpNWDpRVUlOVEFOQSBST08KKzI0Ok1YLVNMUDpNWDpTQU4gTFVJUyBQT1RPU0kKKzI1Ok1YLVNJTjpNWDpTSU5BTE9BCisyNjpNWC1TT046TVg6U09OT1JBCisyNzpNWC1UQUI6TVg6VEFCQVNDTworMjg6TVgtVEFNOk1YOlRBTUFVTElQQVMKKzI5Ok1YLVRMQTpNWDpUTEFYQ0FMQQorMzA6TVgtVkVSOk1YOlZFUkFDUlVaIExMQVZFCiszMTpNWC1ZVUM6TVg6WVVDQVRBTgorMzI6TVgtWkFDOk1YOlpBQ0FURUNBUwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NRVgvTUVYX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NRVgvTUVYX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01FWC9NRVhfQURNSU4yX0xFWC50eHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTUtEL01LRF9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTUtEL01LRF9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWMxMTMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NS0QvTUtEX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEgQEAKKzE6TUstTTpNSzpNQUtFRE9OSUpBCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01LRC9NS0RfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01LRC9NS0RfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA1MDY5MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTUtEL01LRF9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxIEBACisxOk1LOk1LRDpNQUtFRE9OSUpBOk1BS0VET05JSkE6TUFLRURPTklKQQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NTVIvTU1SX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NTVIvTU1SX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNDc2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01NUi9NTVJfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxNCBAQAorMTpNTS0wNzpNTTpBWUVZQVJXQURZCisyOk1NLTAyOk1NOkJBR08KKzM6TU0tNDpNTTpDSElOCis0Ok1NLTA4Ok1NOktBQ0hJTgorNTpNTS0yOk1NOktBWUFICis2Ok1NLTM6TU06S0FZSU4KKzc6TU0tMDM6TU06TUFHV0FZCis4Ok1NLTA0Ok1NOk1BTkRBTEFZCis5Ok1NLTU6TU06TU9OCisxMDpNTS02Ok1NOlJBS0hJTkUKKzExOk1NLTA6TU06U0FHQUlORworMTI6TU0tNzpNTTpTSEFOCisxMzpNTS0wNTpNTTpUQU5JTlRIQVJZSQorMTQ6TU0tMDY6TU06WUFOR09OCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01ORy9NTkdfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01ORy9NTkdfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhMDgxMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTU5HL01OR19BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDIyIEBACisxOk1OLTA3MzpNTjpBUkhBTkdBWQorMjpNTi0wNzpNTjpCQVlBTiBPTEdJWSBbQkFZQU4gTEdJWV0KKzM6TU4tMDY5Ok1OOkJBWUFOSE9OR09SCis0Ok1OLTA2NzpNTjpCVUxHQU4KKzU6TU4tMDM3Ok1OOkRBUkhBTiBVVUwKKzY6TU4tMDY6TU46RE9STk9ECis3Ok1OLTA2MzpNTjpET1JOT0dPVkkgW0RPUk5PR09WXQorODpNTi0wNTk6TU46RFVOREdPVkkgW0RVTkRHT1ZdCis5Ok1OLTA1NzpNTjpEWkFWSEFOCisxMDpNTi0wNjQ6TU46R09WIFPcTUJFUgorMTE6TU4tMDY1Ok1OOkdPVkkgQUxUQVkgW0dPViBBTFRBWV0KKzEyOk1OLTAzOTpNTjpIRU5USVkKKzEzOk1OLTA0MzpNTjpIT1ZECisxNDpNTi0wNDpNTjpIT1ZTR09MIFtIVlNHTF0KKzE1Ok1OLTA1MzpNTjpPTU5PR09WSSBbTU5HT1ZdCisxNjpNTi0wMzU6TU46T1JIT04KKzE3Ok1OLTA1NTpNTjpPVk9SSEFOR0FZIFtWUkhBTkdBWV0KKzE4Ok1OLTA0OTpNTjpTRUxFTkdFCisxOTpNTi0wNTpNTjpTVUhCQUFUQVIgW1PcSEJBQVRBUl0KKzIwOk1OLTA0NzpNTjpUT1YgW1RWXQorMjE6TU4tMDM6TU46VUxBQU5CQUFUQVIKKzIyOk1OLTA0NjpNTjpVVlMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTU5HL01OR19BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTU5HL01OR19BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGJmZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NTkcvTU5HX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMTggQEAKKzE6TU46TU5HOk1PTkdPTElBOkR6YXZoYW46TU5HLkwyLjMKKzE6TU46TU5HOk1PTkdPTElBOkhlbnRpeTpNTkcuTDIuNgorMTpNTjpNTkc6TU9OR09MSUE6RHVuZGdvdmk6TU5HLkwyLjgKKzE6TU46TU5HOk1PTkdPTElBOlRvdjpNTkcuTDIuNworMTpNTjpNTkc6TU9OR09MSUE6U2VsZW5nZTpNTkcuTDIuNQorMTpNTjpNTkc6TU9OR09MSUE6QXJoYW5nYXk6TU5HLkwyLjEKKzE6TU46TU5HOk1PTkdPTElBOkhvdnNnb2w6TU5HLkwyLjE2CisxOk1OOk1ORzpNT05HT0xJQTpEb3Jub2dvdmk6TU5HLkwyLjEwCisxOk1OOk1ORzpNT05HT0xJQTpPbW5vZ292aTpNTkcuTDIuMTIKKzE6TU46TU5HOk1PTkdPTElBOkJheWFuaG9uZ29yOk1ORy5MMi4xMQorMTpNTjpNTkc6TU9OR09MSUE6VXZzOk1ORy5MMi4xNAorMTpNTjpNTkc6TU9OR09MSUE6R292aS1BbHRheTpNTkcuTDIuMTUKKzE6TU46TU5HOk1PTkdPTElBOkhvdmQ6TU5HLkwyLjEzCisxOk1OOk1ORzpNT05HT0xJQTpEb3Jub2Q6TU5HLkwyLjIKKzE6TU46TU5HOk1PTkdPTElBOkJ1bGdhbjpNTkcuTDIuOQorMTpNTjpNTkc6TU9OR09MSUE6U3VoYmFhdGFyOk1ORy5MMi4xOAorMTpNTjpNTkc6TU9OR09MSUE6T3ZvcmhhbmdheTpNTkcuTDIuNAorMTpNTjpNTkc6TU9OR09MSUE6QmF5YW4tT2xnaXk6TU5HLkwyLjE3CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01PWi9NT1pfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01PWi9NT1pfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5YjY0MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTU9aL01PWl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDExIEBACisxOk1aLVA6TVo6Q0FCTyBERUxHQURPCisyOk1aLUc6TVo6R0FaQQorMzpNWi1JOk1aOklOSEFNQkFORQorNDpNWi1COk1aOk1BTklDQQorNTpNWi1NUE06TVo6TUFQVVRPCis2Ok1aLU1QTTpNWjpNQVBVVE8KKzc6TVotTjpNWjpOQU1QVUxBCis4Ok1aLUE6TVo6TkFTU0EKKzk6TVotUzpNWjpTT0ZBTEEKKzEwOk1aLVQ6TVo6VEVURQorMTE6TVotUTpNWjpaQU1CRVpJQQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NT1ovTU9aX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NT1ovTU9aX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZTI2OTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01PWi9NT1pfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSwxMjggQEAKKzE6TVo6TU9aOk1PWkFNQklRVUU6TmFtcHVsYTpBbmdvY2hlCisyOk1aOk1PWjpNT1pBTUJJUVVFOk5hbXB1bGE6RXJhdGkKKzM6TVo6TU9aOk1PWkFNQklRVUU6TmFtcHVsYTpMYWxhdWEKKzQ6TVo6TU9aOk1PWkFNQklRVUU6TmFtcHVsYTpNYWxlbWEKKzU6TVo6TU9aOk1PWkFNQklRVUU6TmFtcHVsYTpNZWNvbnRhCis2Ok1aOk1PWjpNT1pBTUJJUVVFOk5hbXB1bGE6TWVjdWJ1cmkKKzc6TVo6TU9aOk1PWkFNQklRVUU6TmFtcHVsYTpNZW1iYQorODpNWjpNT1o6TU9aQU1CSVFVRTpOYW1wdWxhOk1vZ292b2xhcworOTpNWjpNT1o6TU9aQU1CSVFVRTpOYW1wdWxhOk1vbWEKKzEwOk1aOk1PWjpNT1pBTUJJUVVFOk5hbXB1bGE6TW9uYXBvCisxMTpNWjpNT1o6TU9aQU1CSVFVRTpOYW1wdWxhOk1vbmdpbmN1YWwKKzEyOk1aOk1PWjpNT1pBTUJJUVVFOk5hbXB1bGE6TW9zc3VyaWwKKzEzOk1aOk1PWjpNT1pBTUJJUVVFOk5hbXB1bGE6TXVlY2F0ZQorMTQ6TVo6TU9aOk1PWkFNQklRVUU6TmFtcHVsYTpNdXJydXB1bGEKKzE1Ok1aOk1PWjpNT1pBTUJJUVVFOk5hbXB1bGE6TmFjYWxhIFZlbGhhCisxNjpNWjpNT1o6TU9aQU1CSVFVRTpOYW1wdWxhOk5hbWFwYQorMTc6TVo6TU9aOk1PWkFNQklRVUU6TmFtcHVsYTpOYW1wdWxhCisxODpNWjpNT1o6TU9aQU1CSVFVRTpOYW1wdWxhOlJpYmF1ZQorMTpNWjpNT1o6TU9aQU1CSVFVRTpNYW5pY2E6QmFydWUKKzI6TVo6TU9aOk1PWkFNQklRVUU6TWFuaWNhOkdvbmRvbGEKKzM6TVo6TU9aOk1PWkFNQklRVUU6TWFuaWNhOkd1cm8KKzQ6TVo6TU9aOk1PWkFNQklRVUU6TWFuaWNhOk1hY2hhemUKKzU6TVo6TU9aOk1PWkFNQklRVUU6TWFuaWNhOk1hY29zc2EKKzY6TVo6TU9aOk1PWkFNQklRVUU6TWFuaWNhOk1hbmljYQorNzpNWjpNT1o6TU9aQU1CSVFVRTpNYW5pY2E6TW9zc3VyaXplCis4Ok1aOk1PWjpNT1pBTUJJUVVFOk1hbmljYTpTdXNzdW5kZW5nYQorOTpNWjpNT1o6TU9aQU1CSVFVRTpNYW5pY2E6VGFtYmFyYQorMTpNWjpNT1o6TU9aQU1CSVFVRTpOYXNzYTpDdWFtYmEKKzI6TVo6TU9aOk1PWkFNQklRVUU6TmFzc2E6TGFnbworMzpNWjpNT1o6TU9aQU1CSVFVRTpOYXNzYTpMaWNoaW5nYQorNDpNWjpNT1o6TU9aQU1CSVFVRTpOYXNzYTpNYWp1bmUKKzU6TVo6TU9aOk1PWkFNQklRVUU6TmFzc2E6TWFuZGltYmEKKzY6TVo6TU9aOk1PWkFNQklRVUU6TmFzc2E6TWFycnVwYQorNzpNWjpNT1o6TU9aQU1CSVFVRTpOYXNzYTpNYXVhCis4Ok1aOk1PWjpNT1pBTUJJUVVFOk5hc3NhOk1hdmFnbworOTpNWjpNT1o6TU9aQU1CSVFVRTpOYXNzYTpNZWNhbmhlbGFzCisxMDpNWjpNT1o6TU9aQU1CSVFVRTpOYXNzYTpNZWN1bGEKKzExOk1aOk1PWjpNT1pBTUJJUVVFOk5hc3NhOk1ldGFyaWNhCisxMjpNWjpNT1o6TU9aQU1CSVFVRTpOYXNzYTpNdWVtYmUKKzEzOk1aOk1PWjpNT1pBTUJJUVVFOk5hc3NhOk4nZ2F1bWEKKzE0Ok1aOk1PWjpNT1pBTUJJUVVFOk5hc3NhOk5pcGVwZQorMTU6TVo6TU9aOk1PWkFNQklRVUU6TmFzc2E6U2FuZ2EKKzE6TVo6TU9aOk1PWkFNQklRVUU6Q2FibyBEZWxnYWRvOkFuY3VhYmUKKzI6TVo6TU9aOk1PWkFNQklRVUU6Q2FibyBEZWxnYWRvOkJhbGFtYQorMzpNWjpNT1o6TU9aQU1CSVFVRTpDYWJvIERlbGdhZG86Q2hpdXJlCis0Ok1aOk1PWjpNT1pBTUJJUVVFOkNhYm8gRGVsZ2FkbzpNYWNvbWlhCis1Ok1aOk1PWjpNT1pBTUJJUVVFOkNhYm8gRGVsZ2FkbzpNZWN1ZmkKKzY6TVo6TU9aOk1PWkFNQklRVUU6Q2FibyBEZWxnYWRvOk1lbHVjbworNzpNWjpNT1o6TU9aQU1CSVFVRTpDYWJvIERlbGdhZG86TW9jaW1ib2EgZGEgUHJhaWEKKzg6TVo6TU9aOk1PWkFNQklRVUU6Q2FibyBEZWxnYWRvOk1vbnRlcHVlegorOTpNWjpNT1o6TU9aQU1CSVFVRTpDYWJvIERlbGdhZG86TXVlZGEKKzEwOk1aOk1PWjpNT1pBTUJJUVVFOkNhYm8gRGVsZ2FkbzpNdWlkdW1iZQorMTE6TVo6TU9aOk1PWkFNQklRVUU6Q2FibyBEZWxnYWRvOk5hbXVubworMTI6TVo6TU9aOk1PWkFNQklRVUU6Q2FibyBEZWxnYWRvOk5hbmdhZGUKKzEzOk1aOk1PWjpNT1pBTUJJUVVFOkNhYm8gRGVsZ2FkbzpQYWxtYQorMTQ6TVo6TU9aOk1PWkFNQklRVUU6Q2FibyBEZWxnYWRvOlBlbWJhCisxNTpNWjpNT1o6TU9aQU1CSVFVRTpDYWJvIERlbGdhZG86UXVpc3NhbmdhCisxOk1aOk1PWjpNT1pBTUJJUVVFOlRldGU6QW5nb25pYQorMjpNWjpNT1o6TU9aQU1CSVFVRTpUZXRlOkNhaG9yYSBCYXNzYQorMzpNWjpNT1o6TU9aQU1CSVFVRTpUZXRlOkNoYW5nYXJhCis0Ok1aOk1PWjpNT1pBTUJJUVVFOlRldGU6Q2hpZnVuZGUKKzU6TVo6TU9aOk1PWkFNQklRVUU6VGV0ZTpDaGl1dGEKKzY6TVo6TU9aOk1PWkFNQklRVUU6VGV0ZTpNYWNhbmdhCis3Ok1aOk1PWjpNT1pBTUJJUVVFOlRldGU6TWFnb2UKKzg6TVo6TU9aOk1PWkFNQklRVUU6VGV0ZTpNYXJhdmlhCis5Ok1aOk1PWjpNT1pBTUJJUVVFOlRldGU6TW9hdGl6ZQorMTA6TVo6TU9aOk1PWkFNQklRVUU6VGV0ZTpNdXRhcmFyYQorMTE6TVo6TU9aOk1PWkFNQklRVUU6VGV0ZTpUc2FuZ2FubworMTI6TVo6TU9aOk1PWkFNQklRVUU6VGV0ZTpadW1idQorMTpNWjpNT1o6TU9aQU1CSVFVRTpHYXphOkJpbGVuZQorMjpNWjpNT1o6TU9aQU1CSVFVRTpHYXphOkNoaWJ1dG8KKzM6TVo6TU9aOk1PWkFNQklRVUU6R2F6YTpDaGljdWFsYWN1YWxhCis0Ok1aOk1PWjpNT1pBTUJJUVVFOkdhemE6Q2hpZ3VibworNTpNWjpNT1o6TU9aQU1CSVFVRTpHYXphOkNob2t3ZQorNjpNWjpNT1o6TU9aQU1CSVFVRTpHYXphOkd1aWphCis3Ok1aOk1PWjpNT1pBTUJJUVVFOkdhemE6TWFiYWxhbmUKKzg6TVo6TU9aOk1PWkFNQklRVUU6R2F6YTpNYW5kbGFrYXppCis5Ok1aOk1PWjpNT1pBTUJJUVVFOkdhemE6TWFzc2FuZ2VuYQorMTA6TVo6TU9aOk1PWkFNQklRVUU6R2F6YTpNYXNzaW5naXIKKzExOk1aOk1PWjpNT1pBTUJJUVVFOkdhemE6WGFpLVhhaQorMTpNWjpNT1o6TU9aQU1CSVFVRTpaYW1iZXppYTpBbHRvIE1vbG9jdWUKKzI6TVo6TU9aOk1PWkFNQklRVUU6WmFtYmV6aWE6Q2hpbmRlCiszOk1aOk1PWjpNT1pBTUJJUVVFOlphbWJlemlhOkdpbGUKKzQ6TVo6TU9aOk1PWkFNQklRVUU6WmFtYmV6aWE6R3VydWUKKzU6TVo6TU9aOk1PWkFNQklRVUU6WmFtYmV6aWE6SWxlCis2Ok1aOk1PWjpNT1pBTUJJUVVFOlphbWJlemlhOkluaGFzc3VuZ2UKKzc6TVo6TU9aOk1PWkFNQklRVUU6WmFtYmV6aWE6THVnZWxhCis4Ok1aOk1PWjpNT1pBTUJJUVVFOlphbWJlemlhOk1hZ2FuamEgZGEgQ29zdGEKKzk6TVo6TU9aOk1PWkFNQklRVUU6WmFtYmV6aWE6TWlsYW5nZQorMTA6TVo6TU9aOk1PWkFNQklRVUU6WmFtYmV6aWE6TW9jdWJhCisxMTpNWjpNT1o6TU9aQU1CSVFVRTpaYW1iZXppYTpNb3BlaWEKKzEyOk1aOk1PWjpNT1pBTUJJUVVFOlphbWJlemlhOk1vcnJ1bWJhbGEKKzEzOk1aOk1PWjpNT1pBTUJJUVVFOlphbWJlemlhOk5hbWFjdXJyYQorMTQ6TVo6TU9aOk1PWkFNQklRVUU6WmFtYmV6aWE6TmFtYXJyb2kKKzE1Ok1aOk1PWjpNT1pBTUJJUVVFOlphbWJlemlhOk5pY29hZGFsYQorMTY6TVo6TU9aOk1PWkFNQklRVUU6WmFtYmV6aWE6UGViYW5lCisxOk1aOk1PWjpNT1pBTUJJUVVFOkluaGFtYmFuZTpGdW5oYWxvdXJvCisyOk1aOk1PWjpNT1pBTUJJUVVFOkluaGFtYmFuZTpHb3Z1cm8KKzM6TVo6TU9aOk1PWkFNQklRVUU6SW5oYW1iYW5lOkhvbW9pbmUKKzQ6TVo6TU9aOk1PWkFNQklRVUU6SW5oYW1iYW5lOkluaGFycmltZQorNTpNWjpNT1o6TU9aQU1CSVFVRTpJbmhhbWJhbmU6SW5oYXNzb3JvCis2Ok1aOk1PWjpNT1pBTUJJUVVFOkluaGFtYmFuZTpKYW5nYW1vCis3Ok1aOk1PWjpNT1pBTUJJUVVFOkluaGFtYmFuZTpNYWJvdGUKKzg6TVo6TU9aOk1PWkFNQklRVUU6SW5oYW1iYW5lOk1hc3NpbmdhCis5Ok1aOk1PWjpNT1pBTUJJUVVFOkluaGFtYmFuZTpNb3JydW1iZW5lCisxMDpNWjpNT1o6TU9aQU1CSVFVRTpJbmhhbWJhbmU6UGFuZGEKKzExOk1aOk1PWjpNT1pBTUJJUVVFOkluaGFtYmFuZTpWaWxhbmN1bG9zCisxMjpNWjpNT1o6TU9aQU1CSVFVRTpJbmhhbWJhbmU6WmF2YWxhCisxOk1aOk1PWjpNT1pBTUJJUVVFOlNvZmFsYTpCdXppCisyOk1aOk1PWjpNT1pBTUJJUVVFOlNvZmFsYTpDYWlhCiszOk1aOk1PWjpNT1pBTUJJUVVFOlNvZmFsYTpDaGVtYmEKKzQ6TVo6TU9aOk1PWkFNQklRVUU6U29mYWxhOkNoZXJpbmdvbWEKKzU6TVo6TU9aOk1PWkFNQklRVUU6U29mYWxhOkNoaWJhYmF2YQorNjpNWjpNT1o6TU9aQU1CSVFVRTpTb2ZhbGE6RG9uZG8KKzc6TVo6TU9aOk1PWkFNQklRVUU6U29mYWxhOkdvcm9uZ29zYQorODpNWjpNT1o6TU9aQU1CSVFVRTpTb2ZhbGE6TWFjaGFuZ2EKKzk6TVo6TU9aOk1PWkFNQklRVUU6U29mYWxhOk1hcmluZ3VlCisxMDpNWjpNT1o6TU9aQU1CSVFVRTpTb2ZhbGE6TWFycm9tZXUKKzExOk1aOk1PWjpNT1pBTUJJUVVFOlNvZmFsYTpNdWFuemEKKzEyOk1aOk1PWjpNT1pBTUJJUVVFOlNvZmFsYTpOaGFtYXRhbmRhCisxOk1aOk1PWjpNT1pBTUJJUVVFOk1hcHV0bzpCb2FuZQorMjpNWjpNT1o6TU9aQU1CSVFVRTpNYXB1dG86TWFndWRlCiszOk1aOk1PWjpNT1pBTUJJUVVFOk1hcHV0bzpNYW5oaWNhCis0Ok1aOk1PWjpNT1pBTUJJUVVFOk1hcHV0bzpNYXB1dG8KKzU6TVo6TU9aOk1PWkFNQklRVUU6TWFwdXRvOk1hcnJhY3VlbmUKKzY6TVo6TU9aOk1PWkFNQklRVUU6TWFwdXRvOk1hdHV0dWluZQorNzpNWjpNT1o6TU9aQU1CSVFVRTpNYXB1dG86TW9hbWJhCis4Ok1aOk1PWjpNT1pBTUJJUVVFOk1hcHV0bzpOYW1hYWNoYQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NVVMvTVVTX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NVVMvTVVTX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOTM2YjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01VUy9NVVNfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxOCBAQAorMTpNVS1BRzpNVTpBR0FMRUdBIElTTEFORFMKKzI6TVUtQlI6TVU6QkVBVSBCQVNTSU4gUk9TRSBISUxMCiszOk1VLUJMOk1VOkJMQUNLIFJJVkVSCis0Ok1VLUNDOk1VOkNBUkdBRE9TIENBUkFKT1MgU0hPQUxTIFtTQUlOVCBCUkFORE9OIElTTEFORFNdCis1Ok1VLUNVOk1VOkNVUkVQSVBFCis2Ok1VLUZMOk1VOkZMQUNRCis3Ok1VLUdQOk1VOkdSQU5EIFBPUlQKKzg6TVVTLU06TVU6TUFVUklUSVVTCis5Ok1VLU1POk1VOk1PS0EKKzEwOk1VLVBBOk1VOlBBTVBMRU1PVVNTRVMKKzExOk1VLVBXOk1VOlBMQUlORVMgV0lMSEVNUworMTI6TVUtUFU6TVU6UE9SVCBMT1VJUworMTM6TVUtUFU6TVU6UE9SVCBMT1VJUworMTQ6TVUtUUI6TVU6UVVBVFJFIEJPUk5FUworMTU6TVUtUlI6TVU6UklWSUVSRSBEVSBSRU1QQVJUCisxNjpNVS1STzpNVTpST0RSSUdVRVMgSVNMQU5ECisxNzpNVS1TQTpNVTpTQVZBTk5FCisxODpNVS1WUDpNVTpWQUNPQVMgUEhPRU5JWApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NVVMvTVVTX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NVVMvTVVTX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ODRmY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01VUy9NVVNfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSBAQAorMTpNVTpNVVM6TUFVUklUSVVTOk1hdXJpdGl1czpNVVMuTDIuMQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NV0kvTVdJX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NV0kvTVdJX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMzU0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L01XSS9NV0lfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwzMCBAQAorMTpNVy1CQTpNVzpCQUxBS0EKKzI6TVctQkw6TVc6QkxBTlRZUkUKKzM6TVctQzpNVzpDRU5UUkFMIFtDRU5UUkFMNF0KKzQ6TVctQ0s6TVc6Q0hJS1dBV0EKKzU6TVctQ1I6TVc6Q0hJUkFEWlVMVQorNjpNVy1DVDpNVzpDSElUSVBBCis3Ok1XLURFOk1XOkRFRFpBCis4Ok1XLURPOk1XOkRPV0EKKzk6TVctS1I6TVc6S0FST05HQQorMTA6TVctS1M6TVc6S0FTVU5HVQorMTE6TVctTEs6TVc6TElLT01BIElTTEFORAorMTI6TVctTEk6TVc6TElMT05HV0UKKzEzOk1XLU1IOk1XOk1BQ0hJTkdBCisxNDpNVy1NRzpNVzpNQU5HT0NISQorMTU6TVctTUM6TVc6TUNISU5KSQorMTY6TVctTVU6TVc6TVVMQU5KRQorMTc6TVctTVc6TVc6TVdBTlpBCisxODpNVy1NWjpNVzpNWklNQkEKKzE5Ok1XLU5COk1XOk5LSEFUQSBCQVkKKzIwOk1XLU5LOk1XOk5LSE9UQUtPVEEKKzIxOk1XLU46TVc6Tk9SVEhFUk4gW05PUlRIRVJOMV0KKzIyOk1XLU5TOk1XOk5TQU5KRQorMjM6TVctTlU6TVc6TlRDSEVVCisyNDpNVy1OSTpNVzpOVENISVNJCisyNTpNVy1QSDpNVzpQSEFMT01CRQorMjY6TVctUlU6TVc6UlVNUEhJCisyNzpNVy1TQTpNVzpTQUxJTUEKKzI4Ok1XLVM6TVc6U09VVEhFUk4gW1NPVVRIRVJOMl0KKzI5Ok1XLVRIOk1XOlRIWU9MTworMzA6TVctWk86TVc6Wk9NQkEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTVdJL01XSV9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTVdJL01XSV9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjYzNzVmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9NV0kvTVdJX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMjQgQEAKKzE6TVc6TVdJOk1BTEFXSTpTb3V0aGVybjpCbGFudHlyZQorMjpNVzpNV0k6TUFMQVdJOlNvdXRoZXJuOkNoaWt3YXdhCiszOk1XOk1XSTpNQUxBV0k6U291dGhlcm46Q2hpcmFkenVsdQorNDpNVzpNV0k6TUFMQVdJOlNvdXRoZXJuOk1hY2hpbmdhCis1Ok1XOk1XSTpNQUxBV0k6U291dGhlcm46TWFuZ29jaGkKKzY6TVc6TVdJOk1BTEFXSTpTb3V0aGVybjpNdWxhbmplCis3Ok1XOk1XSTpNQUxBV0k6U291dGhlcm46TXdhbnphCis4Ok1XOk1XSTpNQUxBV0k6U291dGhlcm46TnNhbmplCis5Ok1XOk1XSTpNQUxBV0k6U291dGhlcm46VGh5b2xvCisxMDpNVzpNV0k6TUFMQVdJOlNvdXRoZXJuOlpvbWJhCisxOk1XOk1XSTpNQUxBV0k6Q2VudHJhbDpEZWR6YQorMjpNVzpNV0k6TUFMQVdJOkNlbnRyYWw6RG93YQorMzpNVzpNV0k6TUFMQVdJOkNlbnRyYWw6S2FzdW5ndQorNDpNVzpNV0k6TUFMQVdJOkNlbnRyYWw6TGlsb25nd2UKKzU6TVc6TVdJOk1BTEFXSTpDZW50cmFsOk1jaGluZ2kKKzY6TVc6TVdJOk1BTEFXSTpDZW50cmFsOk5raG90YWtvdGEKKzc6TVc6TVdJOk1BTEFXSTpDZW50cmFsOk50Y2hldQorODpNVzpNV0k6TUFMQVdJOkNlbnRyYWw6TnRjaGlzaQorOTpNVzpNV0k6TUFMQVdJOkNlbnRyYWw6U2FsaW1hCisxOk1XOk1XSTpNQUxBV0k6Tm9ydGhlcm46Q2hpdGlwYQorMjpNVzpNV0k6TUFMQVdJOk5vcnRoZXJuOkthcm9uZ2EKKzM6TVc6TVdJOk1BTEFXSTpOb3J0aGVybjpNemltYmEKKzQ6TVc6TVdJOk1BTEFXSTpOb3J0aGVybjpOa2F0YS1CYXkKKzU6TVc6TVdJOk1BTEFXSTpOb3J0aGVybjpSdW1waGkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTkFNL05BTV9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTkFNL05BTV9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmQ4MjNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9OQU0vTkFNX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMzggQEAKKzE6TkEtQkVUOk5BOkJFVEhBTklFTgorMjpOQS1CTzpOQTpCT0VTTUFOTEFORAorMzpOQS1DQTpOQTpDQVBSSVZJCis0Ok5BLURBOk5BOkRBTUFSQUxBTkQKKzU6TkEtRVI6TkE6RVJPTkdPCis2Ok5BLUdPOk5BOkdPQkFCSVMKKzc6TkEtR1I6TkE6R1JPT1RGT05URUlOCis4Ok5BLUhBOk5BOkhBUkRBUAorOTpOQS1IRUE6TkE6SEVSRVJPTEFORCBFQVNUCisxMDpOQS1IRVc6TkE6SEVSRVJPTEFORCBXRVNUCisxMTpOQS1LQUs6TkE6S0FPS09MQU5ECisxMjpOQS1LQTpOQTpLQVJBUworMTM6TkEtS0FTOk5BOktBUkFTQlVSRworMTQ6TkEtS0lCOk5BOktBUklCSUIKKzE1Ok5BLUtBVjpOQTpLQVZBTkdPCisxNjpOQS1LRTpOQTpLRUVUTUFOU0hPT1AKKzE3Ok5BLUtIOk5BOktIT01BUworMTg6TkEtS1U6TkE6S1VORU5FCisxOTpOQS1MVTpOQTpMVURFUklUWgorMjA6TkEtTUxUOk5BOk1BTFRBSE9IRQorMjE6TkEtTVJJOk5BOk1BUklFTlRBTAorMjI6TkEtTkFMOk5BOk5BTUFMQU5ECisyMzpOQS1PVzpOQTpPSEFOR1dFTkEKKzI0Ok5BLU9LRDpOQTpPS0FIQU5ESkEKKzI1Ok5BLU9LOk5BOk9LQVZBTkdPCisyNjpOQS1PSDpOQTpPTUFIRUtFCisyNzpOQS1PTVU6TkE6T01BUlVSVQorMjg6TkEtT1M6TkE6T01VU0FUSQorMjk6TkEtT046TkE6T1NIQU5BCiszMDpOQS1PVDpOQTpPU0hJS09UTworMzE6TkEtT1RJOk5BOk9USklXQVJPTkdPCiszMjpOQS1PRDpOQTpPVEpPWk9OREpVUEEKKzMzOk5BLU9VVDpOQTpPVVRKTworMzQ6TkEtT1dBOk5BOk9XQU1CTworMzU6TkEtUkJIOk5BOlJFSE9CT1RICiszNjpOQS1TV0s6TkE6U1dBS09QTVVORAorMzc6TkEtVFNCOk5BOlRTVU1FQgorMzg6TkEtV0lIOk5BOldJTkRIT0VLCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L05BTS9OQU1fQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L05BTS9OQU1fQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5OTA4YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTkFNL05BTV9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDMzIEBACisxOk5BOk5BTTpOQU1JQklBOkx1ZGVyaXR6Ok5BTS5MMi4xMAorMjpOQTpOQU06TkFNSUJJQTpMdWRlcml0ejpOQU0uTDIuNAorMzpOQTpOQU06TkFNSUJJQTpMdWRlcml0ejpOQU0uTDIuNQorNDpOQTpOQU06TkFNSUJJQTpMdWRlcml0ejpOQU0uTDIuNgorNTpOQTpOQU06TkFNSUJJQTpMdWRlcml0ejpOQU0uTDIuNworNjpOQTpOQU06TkFNSUJJQTpMdWRlcml0ejpOQU0uTDIuOAorNzpOQTpOQU06TkFNSUJJQTpMdWRlcml0ejpOQU0uTDIuOQorMTpOQTpOQU06TkFNSUJJQTpNYXJpZW50YWw6TkFNLkwyLjE1CisxOk5BOk5BTTpOQU1JQklBOktlZXRtYW5zaG9vcDpOQU0uTDIuMTMKKzE6TkE6TkFNOk5BTUlCSUE6U3dha29wbXVuZDpOQU0uTDIuMzAKKzE6TkE6TkFNOk5BTUlCSUE6TmFtYWxhbmQ6TkFNLkwyLjEKKzE6TkE6TkFNOk5BTUlCSUE6S2FyaWJpYjpOQU0uTDIuMjkKKzE6TkE6TkFNOk5BTUlCSUE6SGVyZXJvbGFuZCBFYXN0Ok5BTS5MMi4xMQorMjpOQTpOQU06TkFNSUJJQTpIZXJlcm9sYW5kIEVhc3Q6TkFNLkwyLjEyCisxOk5BOk5BTTpOQU1JQklBOkthb2tvbGFuZDpOQU0uTDIuMjgKKzE6TkE6TkFNOk5BTUlCSUE6R3Jvb3Rmb250ZWluOk5BTS5MMi4yNAorMTpOQTpOQU06TkFNSUJJQTpIZXJlcm9sYW5kIFdlc3Q6TkFNLkwyLjE5CisxOk5BOk5BTTpOQU1JQklBOkthdmFuZ286TkFNLkwyLjI2CisxOk5BOk5BTTpOQU1JQklBOkJvZXNtYW5sYW5kOk5BTS5MMi4xOAorMTpOQTpOQU06TkFNSUJJQTpCZXRoYW5pZW46TkFNLkwyLjMKKzE6TkE6TkFNOk5BTUlCSUE6T2thaGFuZGphOk5BTS5MMi4xNworMTpOQTpOQU06TkFNSUJJQTpUc3VtZWI6TkFNLkwyLjMyCisxOk5BOk5BTTpOQU1JQklBOk91dGpvOk5BTS5MMi4yMgorMTpOQTpOQU06TkFNSUJJQTpPd2FtYm86TkFNLkwyLjE0CisxOk5BOk5BTTpOQU1JQklBOldpbmRob2VrOk5BTS5MMi4zMworMTpOQTpOQU06TkFNSUJJQTpHb2JhYmlzOk5BTS5MMi4yMworMTpOQTpOQU06TkFNSUJJQTpEYW1hcmFsYW5kOk5BTS5MMi4yNworMTpOQTpOQU06TkFNSUJJQTpSZWhvYm90aDpOQU0uTDIuMjAKKzE6TkE6TkFNOk5BTUlCSUE6Q2Fwcml2aTpOQU0uTDIuMjUKKzE6TkE6TkFNOk5BTUlCSUE6T3RqaXdhcm9uZ286TkFNLkwyLjMxCisxOk5BOk5BTTpOQU1JQklBOkthcmFzYnVyZzpOQU0uTDIuMjEKKzE6TkE6TkFNOk5BTUlCSUE6TWFsdGFob2hlOk5BTS5MMi4yCisxOk5BOk5BTTpOQU1JQklBOk9tYXJ1cnU6TkFNLkwyLjE2CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L05FUi9ORVJfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L05FUi9ORVJfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU4YTBjYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTkVSL05FUl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDggQEAKKzE6TkUtOTpORTpBR0FERVoKKzI6TkUtMjpORTpESUZGQQorMzpORS0zOk5FOkRPU1NPCis0Ok5FLTQ6TkU6TUFSQURJCis1Ok5FLTg6TkU6TklBTUVZCis2Ok5FLTU6TkU6VEFIT1VBCis3Ok5FLTY6TkU6VElMTEFCRVJZCis4Ok5FLTc6TkU6WklOREVSCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L05FUi9ORVJfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L05FUi9ORVJfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUxMjllMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTkVSL05FUl9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDM1IEBACisxOk5FOk5FUjpOSUdFUjpEaWZmYTpEaWZmYQorMjpORTpORVI6TklHRVI6RGlmZmE6TWFpbmUtU29yZGEKKzM6TkU6TkVSOk5JR0VSOkRpZmZhOk5ndWlnbWkKKzE6TkU6TkVSOk5JR0VSOlppbmRlcjpHb3VyZQorMjpORTpORVI6TklHRVI6WmluZGVyOk1hZ2FyaWEKKzM6TkU6TkVSOk5JR0VSOlppbmRlcjpNYXRhbWV5ZQorNDpORTpORVI6TklHRVI6WmluZGVyOk1pcnJpYWgKKzU6TkU6TkVSOk5JR0VSOlppbmRlcjpUYW5vdXQKKzE6TkU6TkVSOk5JR0VSOk1hcmFkaTpBZ3VpZQorMjpORTpORVI6TklHRVI6TWFyYWRpOkRha29ybworMzpORTpORVI6TklHRVI6TWFyYWRpOkd1aWRhbi1Sb3VtamkKKzQ6TkU6TkVSOk5JR0VSOk1hcmFkaTpNYWRhcm91bmZhCis1Ok5FOk5FUjpOSUdFUjpNYXJhZGk6TWF5YWhpCis2Ok5FOk5FUjpOSUdFUjpNYXJhZGk6VGVzc2FvdWEKKzE6TkU6TkVSOk5JR0VSOlRhaG91YTpCaXJuaSBOa29ubmkKKzI6TkU6TkVSOk5JR0VSOlRhaG91YTpCb3V6YQorMzpORTpORVI6TklHRVI6VGFob3VhOklsbGVsYQorNDpORTpORVI6TklHRVI6VGFob3VhOktlaXRhCis1Ok5FOk5FUjpOSUdFUjpUYWhvdWE6TWFkYW91YQorNjpORTpORVI6TklHRVI6VGFob3VhOlRhaG91YQorNzpORTpORVI6TklHRVI6VGFob3VhOlRjaGluLVRhYmFyYWRlbgorMTpORTpORVI6TklHRVI6VGlsbGFiZXJ5OkZlbGluZ3VlCisyOk5FOk5FUjpOSUdFUjpUaWxsYWJlcnk6S29sbG8KKzM6TkU6TkVSOk5JR0VSOlRpbGxhYmVyeTpPdWFsbGFtCis0Ok5FOk5FUjpOSUdFUjpUaWxsYWJlcnk6U2F5Cis1Ok5FOk5FUjpOSUdFUjpUaWxsYWJlcnk6VGVyYQorNjpORTpORVI6TklHRVI6VGlsbGFiZXJ5OlRpbGxhYmVyaQorMTpORTpORVI6TklHRVI6RG9zc286Qm9ib3llCisyOk5FOk5FUjpOSUdFUjpEb3NzbzpEb3NzbyBDYW50b24KKzM6TkU6TkVSOk5JR0VSOkRvc3NvOkRvdXRjaGkKKzQ6TkU6TkVSOk5JR0VSOkRvc3NvOkdheWEKKzU6TkU6TkVSOk5JR0VSOkRvc3NvOkxvZ2EKKzE6TkU6TkVSOk5JR0VSOkFnYWRlejpBcmxpdAorMjpORTpORVI6TklHRVI6QWdhZGV6OkJpbG1hCiszOk5FOk5FUjpOSUdFUjpBZ2FkZXo6VGNoaXJvemVyaW5lCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L05HQS9OR0FfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L05HQS9OR0FfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzYzIxNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTkdBL05HQV9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDQwIEBACisxOk5HLUFCOk5HOkFCSUEKKzI6TkctRkM6Tkc6QUJVSkEgQ0FQSVRBTCBURVJSSVRPUlkKKzM6TkctQUQ6Tkc6QURBTUFXQQorNDpORy1BV006Tkc6QURBTVdBUkEKKzU6TkctQUs6Tkc6QUtXQSBJQk9NCis2Ok5HLUFLVzpORzpBS1dBTEJPTQorNzpORy1BTjpORzpBTkFNQlJBCis4Ok5HLUJBOk5HOkJBVUNISQorOTpORy1CWTpORzpCQVlFTFNBCisxMDpORy1CRTpORzpCRU5VRQorMTE6TkctQk86Tkc6Qk9STk8KKzEyOk5HLUNSOk5HOkNST1NTIFJJVkVSCisxMzpORy1ERTpORzpERUxUQQorMTQ6TkctRUI6Tkc6RUJPTllJCisxNTpORy1FRDpORzpFRE8KKzE2Ok5HLUVLOk5HOkVLSVRJCisxNzpORy1FTjpORzpFTlVHVQorMTg6TkctRkNUOk5HOkZDVAorMTk6TkctR086Tkc6R09NQkUKKzIwOk5HLUlNOk5HOklNTworMjE6TkctSkk6Tkc6SklHQVdBCisyMjpORy1LRDpORzpLQURVTkEKKzIzOk5HLUtOOk5HOktBTk8KKzI0Ok5HLUtUOk5HOktBVFNJTkEKKzI1Ok5HLUtFOk5HOktFQkJJCisyNjpORy1LTzpORzpLT0dJCisyNzpORy1LVzpORzpLV0FSQQorMjg6TkctTEE6Tkc6TEFHT1MKKzI5Ok5HLU5BOk5HOk5BU1NBUkFXQQorMzA6TkctTkk6Tkc6TklHRVIKKzMxOk5HLU9HOk5HOk9HVU4KKzMyOk5HLU9OOk5HOk9ORE8KKzMzOk5HLU9TOk5HOk9TVU4KKzM0Ok5HLU9ZOk5HOk9ZTworMzU6TkctUEw6Tkc6UExBVEVBVQorMzY6TkctUkk6Tkc6UklWRVJTCiszNzpORy1TTzpORzpTT0tPVE8KKzM4Ok5HLVRBOk5HOlRBUkFCQQorMzk6TkctWU86Tkc6WU9CRQorNDA6TkctWkE6Tkc6WkFNRkFSQQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9OR0EvTkdBX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9OR0EvTkdBX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2M2YzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L05HQS9OR0FfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSw1MzggQEAKKzE6Tkc6TkdBOk5JR0VSSUE6SmlnYXdhOkJhYnVyYQorMjpORzpOR0E6TklHRVJJQTpKaWdhd2E6QmlyaW5pd2EKKzM6Tkc6TkdBOk5JR0VSSUE6SmlnYXdhOkJpcm5pbkt1Cis0Ok5HOk5HQTpOSUdFUklBOkppZ2F3YTpEdXRzZQorNTpORzpOR0E6TklHRVJJQTpKaWdhd2E6R2Fya2kKKzY6Tkc6TkdBOk5JR0VSSUE6SmlnYXdhOkd1bWVsCis3Ok5HOk5HQTpOSUdFUklBOkppZ2F3YTpHd2FyYW0KKzg6Tkc6TkdBOk5JR0VSSUE6SmlnYXdhOkhhZGVqaWEKKzk6Tkc6TkdBOk5JR0VSSUE6SmlnYXdhOkphaHVuCisxMDpORzpOR0E6TklHRVJJQTpKaWdhd2E6S2FmaW5IYXUKKzExOk5HOk5HQTpOSUdFUklBOkppZ2F3YTpLYXphdXJlCisxMjpORzpOR0E6TklHRVJJQTpKaWdhd2E6S2lyaUthc2EKKzEzOk5HOk5HQTpOSUdFUklBOkppZ2F3YTpLaXlhd2EKKzE0Ok5HOk5HQTpOSUdFUklBOkppZ2F3YTpNYWxhbU1hZAorMTU6Tkc6TkdBOk5JR0VSSUE6SmlnYXdhOlJpbmdpbQorMTY6Tkc6TkdBOk5JR0VSSUE6SmlnYXdhOlJvbmkKKzE3Ok5HOk5HQTpOSUdFUklBOkppZ2F3YTpTdWxlLVRhbgorMTpORzpOR0E6TklHRVJJQTpDcm9zcyBSaXZlcjpBYmkKKzI6Tkc6TkdBOk5JR0VSSUE6Q3Jvc3MgUml2ZXI6QWthbWtwYQorMzpORzpOR0E6TklHRVJJQTpDcm9zcyBSaXZlcjpBa3BhYnV5bworNDpORzpOR0E6TklHRVJJQTpDcm9zcyBSaXZlcjpCaWFzZQorNTpORzpOR0E6TklHRVJJQTpDcm9zcyBSaXZlcjpCb2tpCis2Ok5HOk5HQTpOSUdFUklBOkNyb3NzIFJpdmVyOkNhbGFiYXIKKzc6Tkc6TkdBOk5JR0VSSUE6Q3Jvc3MgUml2ZXI6SWtvbQorODpORzpOR0E6TklHRVJJQTpDcm9zcyBSaXZlcjpPYmFubGlrdQorOTpORzpOR0E6TklHRVJJQTpDcm9zcyBSaXZlcjpPYnVicmEKKzEwOk5HOk5HQTpOSUdFUklBOkNyb3NzIFJpdmVyOk9idWR1CisxMTpORzpOR0E6TklHRVJJQTpDcm9zcyBSaXZlcjpPZHVrcGFuaQorMTI6Tkc6TkdBOk5JR0VSSUE6Q3Jvc3MgUml2ZXI6T2dvamEKKzEzOk5HOk5HQTpOSUdFUklBOkNyb3NzIFJpdmVyOllha3VycgorMTQ6Tkc6TkdBOk5JR0VSSUE6Q3Jvc3MgUml2ZXI6WWFsYSBDcm9zcworMTpORzpOR0E6TklHRVJJQTpJbW86QWJvaC1NYmEKKzI6Tkc6TkdBOk5JR0VSSUE6SW1vOkFoaXp1LU1iCiszOk5HOk5HQTpOSUdFUklBOkltbzpFaGltZS1NYgorNDpORzpOR0E6TklHRVJJQTpJbW86RXppbmloaXQKKzU6Tkc6TkdBOk5JR0VSSUE6SW1vOklkZWF0bworNjpORzpOR0E6TklHRVJJQTpJbW86SWRlYXRvTm8KKzc6Tkc6TkdBOk5JR0VSSUE6SW1vOkloaXR0ZS9VCis4Ok5HOk5HQTpOSUdFUklBOkltbzpJa2VkdXJ1Cis5Ok5HOk5HQTpOSUdFUklBOkltbzpJc2lhbGFNYgorMTA6Tkc6TkdBOk5JR0VSSUE6SW1vOklzdQorMTE6Tkc6TkdBOk5JR0VSSUE6SW1vOk1iYWl0b2xpCisxMjpORzpOR0E6TklHRVJJQTpJbW86Tmdvci1Pa3AKKzEzOk5HOk5HQTpOSUdFUklBOkltbzpOa3dlcnJlCisxNDpORzpOR0E6TklHRVJJQTpJbW86T2Jvd28KKzE1Ok5HOk5HQTpOSUdFUklBOkltbzpPZ3V0YQorMTY6Tkc6TkdBOk5JR0VSSUE6SW1vOk9oYWppL0VnCisxNzpORzpOR0E6TklHRVJJQTpJbW86T2tpZ3dlCisxODpORzpOR0E6TklHRVJJQTpJbW86T3JsdQorMTk6Tkc6TkdBOk5JR0VSSUE6SW1vOk9yc3UKKzIwOk5HOk5HQTpOSUdFUklBOkltbzpPcnUKKzIxOk5HOk5HQTpOSUdFUklBOkltbzpPd2VycmkKKzE6Tkc6TkdBOk5JR0VSSUE6RWRvOkFrb2tvLUVkCisyOk5HOk5HQTpOSUdFUklBOkVkbzpFc2FuQ2VudAorMzpORzpOR0E6TklHRVJJQTpFZG86RXNhbk5vcnQKKzQ6Tkc6TkdBOk5JR0VSSUE6RWRvOkVzYW5Tb3V0Cis1Ok5HOk5HQTpOSUdFUklBOkVkbzpFc2FuV2VzdAorNjpORzpOR0E6TklHRVJJQTpFZG86RXRzYWtvRWEKKzc6Tkc6TkdBOk5JR0VSSUE6RWRvOkV0c2Frb1dlCis4Ok5HOk5HQTpOSUdFUklBOkVkbzpPcmVkbyBFZG8KKzk6Tkc6TkdBOk5JR0VSSUE6RWRvOk9yaGlvbm13CisxMDpORzpOR0E6TklHRVJJQTpFZG86T3ZpYU5vcnQKKzExOk5HOk5HQTpOSUdFUklBOkVkbzpPdmlhU291dGgtV2VzdAorMTI6Tkc6TkdBOk5JR0VSSUE6RWRvOk93YW5XZXN0CisxOk5HOk5HQTpOSUdFUklBOlBsYXRlYXU6QWt3YW5nYQorMjpORzpOR0E6TklHRVJJQTpQbGF0ZWF1OkF3ZQorMzpORzpOR0E6TklHRVJJQTpQbGF0ZWF1OkJhcmlua2lMCis0Ok5HOk5HQTpOSUdFUklBOlBsYXRlYXU6QmFzc2EKKzU6Tkc6TkdBOk5JR0VSSUE6UGxhdGVhdTpEb21hCis2Ok5HOk5HQTpOSUdFUklBOlBsYXRlYXU6Sm9zTm9ydGgKKzc6Tkc6TkdBOk5JR0VSSUE6UGxhdGVhdTpLYW5hbQorODpORzpOR0E6TklHRVJJQTpQbGF0ZWF1OktlZmZpCis5Ok5HOk5HQTpOSUdFUklBOlBsYXRlYXU6TGFmaWEKKzEwOk5HOk5HQTpOSUdFUklBOlBsYXRlYXU6TGFuZ3RhbmcKKzExOk5HOk5HQTpOSUdFUklBOlBsYXRlYXU6TGFuZ3RhbmcgKEIpCisxMjpORzpOR0E6TklHRVJJQTpQbGF0ZWF1Ok1hbmd1CisxMzpORzpOR0E6TklHRVJJQTpQbGF0ZWF1Ok5hc2FyYXdhCisxNDpORzpOR0E6TklHRVJJQTpQbGF0ZWF1OlBhbmtzaGluCisxNTpORzpOR0E6TklHRVJJQTpQbGF0ZWF1OlF1YSdhbnBhCisxNjpORzpOR0E6TklHRVJJQTpQbGF0ZWF1OlNoZW5kYW0KKzE3Ok5HOk5HQTpOSUdFUklBOlBsYXRlYXU6V2FzZQorMTpORzpOR0E6TklHRVJJQTpPeW86QWZpamlvCisyOk5HOk5HQTpOSUdFUklBOk95bzpBa2lueWVsZQorMzpORzpOR0E6TklHRVJJQTpPeW86RWdiZWRhCis0Ok5HOk5HQTpOSUdFUklBOk95bzpJYmFkYW5Ob3J0aAorNTpORzpOR0E6TklHRVJJQTpPeW86SWJhZGFuTm9ydGgtRWFzdAorNjpORzpOR0E6TklHRVJJQTpPeW86SWJhZGFuTm9ydGgtV2VzdAorNzpORzpOR0E6TklHRVJJQTpPeW86SWJhZGFuU291dGgtRWFzdAorODpORzpOR0E6TklHRVJJQTpPeW86SWJhZGFuU291dGgtV2VzdAorOTpORzpOR0E6TklHRVJJQTpPeW86SWJhcmFwYQorMTA6Tkc6TkdBOk5JR0VSSUE6T3lvOklkbworMTE6Tkc6TkdBOk5JR0VSSUE6T3lvOklmZWRhcG8KKzEyOk5HOk5HQTpOSUdFUklBOk95bzpJZmVsb2p1CisxMzpORzpOR0E6TklHRVJJQTpPeW86SXJlcG8KKzE0Ok5HOk5HQTpOSUdFUklBOk95bzpJc2V5aW4KKzE1Ok5HOk5HQTpOSUdFUklBOk95bzpLYWpvbGEKKzE2Ok5HOk5HQTpOSUdFUklBOk95bzpMYWdlbHUKKzE3Ok5HOk5HQTpOSUdFUklBOk95bzpPZ2JvbW9zbworMTg6Tkc6TkdBOk5JR0VSSUE6T3lvOk9nby1PbHV3CisxOTpORzpOR0E6TklHRVJJQTpPeW86T2x1eW9sZQorMjA6Tkc6TkdBOk5JR0VSSUE6T3lvOk9uYS1BcmEKKzIxOk5HOk5HQTpOSUdFUklBOk95bzpPcmVsb3BlCisyMjpORzpOR0E6TklHRVJJQTpPeW86T3JpcmUKKzIzOk5HOk5HQTpOSUdFUklBOk95bzpPeW8KKzI0Ok5HOk5HQTpOSUdFUklBOk95bzpTdXJ1bGVyZQorMTpORzpOR0E6TklHRVJJQTpEZWx0YTpBbmlvY2hhTgorMjpORzpOR0E6TklHRVJJQTpEZWx0YTpBbmlvY2hhUworMzpORzpOR0E6TklHRVJJQTpEZWx0YTpCb21hZGkKKzQ6Tkc6TkdBOk5JR0VSSUE6RGVsdGE6QnVydXR1Cis1Ok5HOk5HQTpOSUdFUklBOkRlbHRhOkV0aGlvcGVFCis2Ok5HOk5HQTpOSUdFUklBOkRlbHRhOkV0aGlvcGVXCis3Ok5HOk5HQTpOSUdFUklBOkRlbHRhOklrYU5vcnRoCis4Ok5HOk5HQTpOSUdFUklBOkRlbHRhOklrYVNvdXRoCis5Ok5HOk5HQTpOSUdFUklBOkRlbHRhOklzb2tvTm9yCisxMDpORzpOR0E6TklHRVJJQTpEZWx0YTpJc29rb1NvdQorMTE6Tkc6TkdBOk5JR0VSSUE6RGVsdGE6TmRva3dhRWEKKzEyOk5HOk5HQTpOSUdFUklBOkRlbHRhOk5kb2t3YVdlCisxMzpORzpOR0E6TklHRVJJQTpEZWx0YTpPa3BlCisxNDpORzpOR0E6TklHRVJJQTpEZWx0YTpPc2hpbWlsbAorMTU6Tkc6TkdBOk5JR0VSSUE6RGVsdGE6U2FwZWxlCisxNjpORzpOR0E6TklHRVJJQTpEZWx0YTpVZ2hlbGlObworMTc6Tkc6TkdBOk5JR0VSSUE6RGVsdGE6VWdoZWxpU28KKzE4Ok5HOk5HQTpOSUdFUklBOkRlbHRhOldhcnJpTm9ydGgKKzE5Ok5HOk5HQTpOSUdFUklBOkRlbHRhOldhcnJpU291dGgKKzE6Tkc6TkdBOk5JR0VSSUE6VGFyYWJhOkJhbGkKKzI6Tkc6TkdBOk5JR0VSSUE6VGFyYWJhOkRvbmdhCiszOk5HOk5HQTpOSUdFUklBOlRhcmFiYTpHYXNoYWthCis0Ok5HOk5HQTpOSUdFUklBOlRhcmFiYTpJYmkKKzU6Tkc6TkdBOk5JR0VSSUE6VGFyYWJhOkphbGluZ28KKzY6Tkc6TkdBOk5JR0VSSUE6VGFyYWJhOkthcmltLUxhCis3Ok5HOk5HQTpOSUdFUklBOlRhcmFiYTpMYXUKKzg6Tkc6TkdBOk5JR0VSSUE6VGFyYWJhOlNhcmRhdW5hCis5Ok5HOk5HQTpOSUdFUklBOlRhcmFiYTpUYWt1bQorMTA6Tkc6TkdBOk5JR0VSSUE6VGFyYWJhOld1a2FyaQorMTE6Tkc6TkdBOk5JR0VSSUE6VGFyYWJhOllvcnJvCisxMjpORzpOR0E6TklHRVJJQTpUYXJhYmE6WmluZworMTpORzpOR0E6TklHRVJJQTpBZGFtd2FyYTpGdWZvcmUKKzI6Tkc6TkdBOk5JR0VSSUE6QWRhbXdhcmE6R2FueWUKKzM6Tkc6TkdBOk5JR0VSSUE6QWRhbXdhcmE6R29tYmkKKzQ6Tkc6TkdBOk5JR0VSSUE6QWRhbXdhcmE6R3V5dWsKKzU6Tkc6TkdBOk5JR0VSSUE6QWRhbXdhcmE6SG9uZworNjpORzpOR0E6TklHRVJJQTpBZGFtd2FyYTpKYWRhCis3Ok5HOk5HQTpOSUdFUklBOkFkYW13YXJhOk1hZGFnYWxpCis4Ok5HOk5HQTpOSUdFUklBOkFkYW13YXJhOk1haWhhCis5Ok5HOk5HQTpOSUdFUklBOkFkYW13YXJhOk1heW8tQmVsCisxMDpORzpOR0E6TklHRVJJQTpBZGFtd2FyYTpNaWNoaWthCisxMTpORzpOR0E6TklHRVJJQTpBZGFtd2FyYTpNdWJpCisxMjpORzpOR0E6TklHRVJJQTpBZGFtd2FyYTpOdW1hbgorMTM6Tkc6TkdBOk5JR0VSSUE6QWRhbXdhcmE6U2hlbGxlbmcKKzE0Ok5HOk5HQTpOSUdFUklBOkFkYW13YXJhOlNvbmcKKzE1Ok5HOk5HQTpOSUdFUklBOkFkYW13YXJhOllvbGEKKzE6Tkc6TkdBOk5JR0VSSUE6S2F0c2luYTpCYWtvcmkKKzI6Tkc6TkdBOk5JR0VSSUE6S2F0c2luYTpCYXRzYXJpCiszOk5HOk5HQTpOSUdFUklBOkthdHNpbmE6QmluZGF3YQorNDpORzpOR0E6TklHRVJJQTpLYXRzaW5hOkRhdXJhCis1Ok5HOk5HQTpOSUdFUklBOkthdHNpbmE6RHV0c2luLU0KKzY6Tkc6TkdBOk5JR0VSSUE6S2F0c2luYTpGYXNrYXJpCis3Ok5HOk5HQTpOSUdFUklBOkthdHNpbmE6RnVudHVhCis4Ok5HOk5HQTpOSUdFUklBOkthdHNpbmE6SW5nYXdhCis5Ok5HOk5HQTpOSUdFUklBOkthdHNpbmE6SmliaWEKKzEwOk5HOk5HQTpOSUdFUklBOkthdHNpbmE6S2FpdGEKKzExOk5HOk5HQTpOSUdFUklBOkthdHNpbmE6S2Fua2FyYQorMTI6Tkc6TkdBOk5JR0VSSUE6S2F0c2luYTpLYW5raXlhCisxMzpORzpOR0E6TklHRVJJQTpLYXRzaW5hOkthdHNpbmEgKEspCisxNDpORzpOR0E6TklHRVJJQTpLYXRzaW5hOk1hbHVtZmFzCisxNTpORzpOR0E6TklHRVJJQTpLYXRzaW5hOk1hbmkKKzE2Ok5HOk5HQTpOSUdFUklBOkthdHNpbmE6TWFzaGkKKzE3Ok5HOk5HQTpOSUdFUklBOkthdHNpbmE6TXVzYXdhCisxODpORzpOR0E6TklHRVJJQTpLYXRzaW5hOlJpbWkKKzE5Ok5HOk5HQTpOSUdFUklBOkthdHNpbmE6U2FmYW5hCisyMDpORzpOR0E6TklHRVJJQTpLYXRzaW5hOlphbmdvCisxOk5HOk5HQTpOSUdFUklBOkZDVDpBYmFqaQorMjpORzpOR0E6TklHRVJJQTpGQ1Q6QWJ1amFNdW4KKzM6Tkc6TkdBOk5JR0VSSUE6RkNUOkd3YWd3YWxhCis0Ok5HOk5HQTpOSUdFUklBOkZDVDpLdWplCisxOk5HOk5HQTpOSUdFUklBOlJpdmVyczpBYnVhL09kdQorMjpORzpOR0E6TklHRVJJQTpSaXZlcnM6QWhvYWRhCiszOk5HOk5HQTpOSUdFUklBOlJpdmVyczpBa3VrdXRvcgorNDpORzpOR0E6TklHRVJJQTpSaXZlcnM6QW5kb25pL08KKzU6Tkc6TkdBOk5JR0VSSUE6Uml2ZXJzOkFzYXJpLVRvCis2Ok5HOk5HQTpOSUdFUklBOlJpdmVyczpCb25ueQorNzpORzpOR0E6TklHRVJJQTpSaXZlcnM6QnJhc3MKKzg6Tkc6TkdBOk5JR0VSSUE6Uml2ZXJzOkRlZ2VtYQorOTpORzpOR0E6TklHRVJJQTpSaXZlcnM6RWtlcmVtb3IKKzEwOk5HOk5HQTpOSUdFUklBOlJpdmVyczpFbXVvaGEKKzExOk5HOk5HQTpOSUdFUklBOlJpdmVyczpFdGNoZQorMTI6Tkc6TkdBOk5JR0VSSUE6Uml2ZXJzOkdva2FuYQorMTM6Tkc6TkdBOk5JR0VSSUE6Uml2ZXJzOklrd2VycmUKKzE0Ok5HOk5HQTpOSUdFUklBOlJpdmVyczpLaGFuYQorMTU6Tkc6TkdBOk5JR0VSSUE6Uml2ZXJzOk5vcnRoZXJuCisxNjpORzpOR0E6TklHRVJJQTpSaXZlcnM6T2Jpby9Ba3AKKzE3Ok5HOk5HQTpOSUdFUklBOlJpdmVyczpPZ2JhL0VnYmUKKzE4Ok5HOk5HQTpOSUdFUklBOlJpdmVyczpPa3Jpa2EKKzE5Ok5HOk5HQTpOSUdFUklBOlJpdmVyczpQb3J0SGFyY291cnQKKzIwOk5HOk5HQTpOSUdFUklBOlJpdmVyczpTYWdiYW1hCisyMTpORzpOR0E6TklHRVJJQTpSaXZlcnM6U291dGhlcm5JamF3CisyMjpORzpOR0E6TklHRVJJQTpSaXZlcnM6VGFpL0VrZW0KKzE6Tkc6TkdBOk5JR0VSSUE6S2FubzpBbGJhc3UKKzI6Tkc6TkdBOk5JR0VSSUE6S2FubzpCYWd3YWkKKzM6Tkc6TkdBOk5JR0VSSUE6S2FubzpCZWJlamkKKzQ6Tkc6TkdBOk5JR0VSSUE6S2FubzpCaWNoaQorNTpORzpOR0E6TklHRVJJQTpLYW5vOkJ1bmt1cmUKKzY6Tkc6TkdBOk5JR0VSSUE6S2FubzpEYWxhCis3Ok5HOk5HQTpOSUdFUklBOkthbm86RGFtYmF0dGEKKzg6Tkc6TkdBOk5JR0VSSUE6S2FubzpEYXdha2luSworOTpORzpOR0E6TklHRVJJQTpLYW5vOkRhd2FraW5UCisxMDpORzpOR0E6TklHRVJJQTpLYW5vOkdhYmFzYXdhCisxMTpORzpOR0E6TklHRVJJQTpLYW5vOkdheWEKKzEyOk5HOk5HQTpOSUdFUklBOkthbm86R2V6YXdhCisxMzpORzpOR0E6TklHRVJJQTpLYW5vOkd3YXJ6bworMTQ6Tkc6TkdBOk5JR0VSSUE6S2FubzpLYWJvCisxNTpORzpOR0E6TklHRVJJQTpLYW5vOkthbm8KKzE2Ok5HOk5HQTpOSUdFUklBOkthbm86S2FyYXllCisxNzpORzpOR0E6TklHRVJJQTpLYW5vOkt1bWJvdHNvCisxODpORzpOR0E6TklHRVJJQTpLYW5vOkt1cmEKKzE5Ok5HOk5HQTpOSUdFUklBOkthbm86TWluamliaXIKKzIwOk5HOk5HQTpOSUdFUklBOkthbm86TmFzc2FyYXcKKzIxOk5HOk5HQTpOSUdFUklBOkthbm86UmFubworMjI6Tkc6TkdBOk5JR0VSSUE6S2FubzpSaW1pbkdhZAorMjM6Tkc6TkdBOk5JR0VSSUE6S2FubzpTaGFub25vCisyNDpORzpOR0E6TklHRVJJQTpLYW5vOlN1bWFpbGEKKzI1Ok5HOk5HQTpOSUdFUklBOkthbm86VGFrYWkKKzI2Ok5HOk5HQTpOSUdFUklBOkthbm86VHNhbnlhd2EKKzI3Ok5HOk5HQTpOSUdFUklBOkthbm86VHVkdW5XYWQKKzI4Ok5HOk5HQTpOSUdFUklBOkthbm86VW5nb2dvCisyOTpORzpOR0E6TklHRVJJQTpLYW5vOld1ZGlsCisxOk5HOk5HQTpOSUdFUklBOllvYmU6QmFkZQorMjpORzpOR0E6TklHRVJJQTpZb2JlOkRhbWF0dXJ1CiszOk5HOk5HQTpOSUdFUklBOllvYmU6RmlrYQorNDpORzpOR0E6TklHRVJJQTpZb2JlOkZ1bmUKKzU6Tkc6TkdBOk5JR0VSSUE6WW9iZTpHZWlkYW0KKzY6Tkc6TkdBOk5JR0VSSUE6WW9iZTpHdWpiYQorNzpORzpOR0E6TklHRVJJQTpZb2JlOk5hbmdlcmUKKzg6Tkc6TkdBOk5JR0VSSUE6WW9iZTpOZ3VydQorOTpORzpOR0E6TklHRVJJQTpZb2JlOll1bnVzYXJpCisxMDpORzpOR0E6TklHRVJJQTpZb2JlOll1c3VmYXJpCisxOk5HOk5HQTpOSUdFUklBOk9zdW46QXRha3Vtb3NhCisyOk5HOk5HQTpOSUdFUklBOk9zdW46QXllZGFhZGUKKzM6Tkc6TkdBOk5JR0VSSUE6T3N1bjpBeWVkaXJlCis0Ok5HOk5HQTpOSUdFUklBOk9zdW46Qm9yaXBlCis1Ok5HOk5HQTpOSUdFUklBOk9zdW46RWRlCis2Ok5HOk5HQTpOSUdFUklBOk9zdW46RWdiZWRvcmUKKzc6Tkc6TkdBOk5JR0VSSUE6T3N1bjpFamlnYm8KKzg6Tkc6TkdBOk5JR0VSSUE6T3N1bjpJZmVDZW50cmFsCis5Ok5HOk5HQTpOSUdFUklBOk9zdW46SWZlTm9ydGgKKzEwOk5HOk5HQTpOSUdFUklBOk9zdW46SWZlU291dGgKKzExOk5HOk5HQTpOSUdFUklBOk9zdW46SWZlbG9kdW4KKzEyOk5HOk5HQTpOSUdFUklBOk9zdW46SWxhCisxMzpORzpOR0E6TklHRVJJQTpPc3VuOklsZXNhCisxNDpORzpOR0E6TklHRVJJQTpPc3VuOklyZXdvbGUKKzE1Ok5HOk5HQTpOSUdFUklBOk9zdW46SXdvCisxNjpORzpOR0E6TklHRVJJQTpPc3VuOk9ib2t1bgorMTc6Tkc6TkdBOk5JR0VSSUE6T3N1bjpPZG8wdGluCisxODpORzpOR0E6TklHRVJJQTpPc3VuOk9sYS1PbHV3YQorMTk6Tkc6TkdBOk5JR0VSSUE6T3N1bjpPbG9ydW5kYQorMjA6Tkc6TkdBOk5JR0VSSUE6T3N1bjpPcmlhZGUKKzIxOk5HOk5HQTpOSUdFUklBOk9zdW46T3NvZ2JvCisxOk5HOk5HQTpOSUdFUklBOk9ndW46QWJlb2t1dGFOb3J0aAorMjpORzpOR0E6TklHRVJJQTpPZ3VuOkFkb09kby9PdGEKKzM6Tkc6TkdBOk5JR0VSSUE6T2d1bjpFZ2JhZG9Ob3J0aAorNDpORzpOR0E6TklHRVJJQTpPZ3VuOkVnYmFkb1NvdXRoCis1Ok5HOk5HQTpOSUdFUklBOk9ndW46SWZvCis2Ok5HOk5HQTpOSUdFUklBOk9ndW46SWplYnVFYXN0Cis3Ok5HOk5HQTpOSUdFUklBOk9ndW46SWplYnVOb3J0aAorODpORzpOR0E6TklHRVJJQTpPZ3VuOklqZWJ1T2RlCis5Ok5HOk5HQTpOSUdFUklBOk9ndW46T2JhZmVtaS1Pd29kZQorMTA6Tkc6TkdBOk5JR0VSSUE6T2d1bjpPZGVkYQorMTE6Tkc6TkdBOk5JR0VSSUE6T2d1bjpPZ3VuV2F0ZXJzaWRlCisxMjpORzpOR0E6TklHRVJJQTpPZ3VuOlNoYWdhbXUKKzE6Tkc6TkdBOk5JR0VSSUE6QWJpYTpBYmEKKzI6Tkc6TkdBOk5JR0VSSUE6QWJpYTpBZmlrcG8KKzM6Tkc6TkdBOk5JR0VSSUE6QWJpYTpBZmlrcG9TbworNDpORzpOR0E6TklHRVJJQTpBYmlhOkFyb2NodWt3Cis1Ok5HOk5HQTpOSUdFUklBOkFiaWE6QmVuZGUKKzY6Tkc6TkdBOk5JR0VSSUE6QWJpYTpJa3d1YW5vCis3Ok5HOk5HQTpOSUdFUklBOkFiaWE6SXNpYWxhLU4KKzg6Tkc6TkdBOk5JR0VSSUE6QWJpYTpJc3Vpa3d1YQorOTpORzpOR0E6TklHRVJJQTpBYmlhOk9iaW9tYS1OCisxMDpORzpOR0E6TklHRVJJQTpBYmlhOk9oYWZpYSBBYmlhCisxMTpORzpOR0E6TklHRVJJQTpBYmlhOk9oYW96YXJhCisxMjpORzpOR0E6TklHRVJJQTpBYmlhOk9uaWNoYQorMTM6Tkc6TkdBOk5JR0VSSUE6QWJpYTpVa3dhCisxNDpORzpOR0E6TklHRVJJQTpBYmlhOlVrd2FFYXN0CisxNTpORzpOR0E6TklHRVJJQTpBYmlhOlVtdWFoaWEKKzE6Tkc6TkdBOk5JR0VSSUE6QmVudWU6QWRvCisyOk5HOk5HQTpOSUdFUklBOkJlbnVlOkFwYQorMzpORzpOR0E6TklHRVJJQTpCZW51ZTpCdXJ1a3UKKzQ6Tkc6TkdBOk5JR0VSSUE6QmVudWU6R2Jva28KKzU6Tkc6TkdBOk5JR0VSSUE6QmVudWU6R3VtYQorNjpORzpOR0E6TklHRVJJQTpCZW51ZTpHd2VyCis3Ok5HOk5HQTpOSUdFUklBOkJlbnVlOkd3ZXJXZXN0Cis4Ok5HOk5HQTpOSUdFUklBOkJlbnVlOkthdHNpbmEgKEJlbnVlKQorOTpORzpOR0E6TklHRVJJQTpCZW51ZTpLb25zaGlzaAorMTA6Tkc6TkdBOk5JR0VSSUE6QmVudWU6S3dhbmRlCisxMTpORzpOR0E6TklHRVJJQTpCZW51ZTpNYWt1cmRpCisxMjpORzpOR0E6TklHRVJJQTpCZW51ZTpPZ2JhZGlibworMTM6Tkc6TkdBOk5JR0VSSUE6QmVudWU6T2p1CisxNDpORzpOR0E6TklHRVJJQTpCZW51ZTpPa3Bva3d1CisxNTpORzpOR0E6TklHRVJJQTpCZW51ZTpPdHVya3BvCisxNjpORzpOR0E6TklHRVJJQTpCZW51ZTpVa3VtCisxNzpORzpOR0E6TklHRVJJQTpCZW51ZTpVc2hvbmdvCisxODpORzpOR0E6TklHRVJJQTpCZW51ZTpWYW5kZWlreQorMTpORzpOR0E6TklHRVJJQTpBa3dhbGJvbTpBYmFrCisyOk5HOk5HQTpOSUdFUklBOkFrd2FsYm9tOkVrZXQKKzM6Tkc6TkdBOk5JR0VSSUE6QWt3YWxib206RWtwZS1BdGEKKzQ6Tkc6TkdBOk5JR0VSSUE6QWt3YWxib206RXNzaWVuLVUKKzU6Tkc6TkdBOk5JR0VSSUE6QWt3YWxib206RXRpbUVrcG8KKzY6Tkc6TkdBOk5JR0VSSUE6QWt3YWxib206RXRpbmFuCis3Ok5HOk5HQTpOSUdFUklBOkFrd2FsYm9tOklrb25vCis4Ok5HOk5HQTpOSUdFUklBOkFrd2FsYm9tOklrb3QtQWJhCis5Ok5HOk5HQTpOSUdFUklBOkFrd2FsYm9tOklrb3QtRWtwCisxMDpORzpOR0E6TklHRVJJQTpBa3dhbGJvbTpJbmkKKzExOk5HOk5HQTpOSUdFUklBOkFrd2FsYm9tOkl0dQorMTI6Tkc6TkdBOk5JR0VSSUE6QWt3YWxib206TWJvCisxMzpORzpOR0E6TklHRVJJQTpBa3dhbGJvbTpNa3BhdC1FbgorMTQ6Tkc6TkdBOk5JR0VSSUE6QWt3YWxib206TnNpdC1JYm8KKzE1Ok5HOk5HQTpOSUdFUklBOkFrd2FsYm9tOk5zaXQtVWJpCisxNjpORzpOR0E6TklHRVJJQTpBa3dhbGJvbTpPa29ibworMTc6Tkc6TkdBOk5JR0VSSUE6QWt3YWxib206T25uYQorMTg6Tkc6TkdBOk5JR0VSSUE6QWt3YWxib206T3JvbgorMTk6Tkc6TkdBOk5JR0VSSUE6QWt3YWxib206T3J1ay1BbmEKKzIwOk5HOk5HQTpOSUdFUklBOkFrd2FsYm9tOlVrYW5hZnVuCisyMTpORzpOR0E6TklHRVJJQTpBa3dhbGJvbTpVcXVvSWJlbgorMjI6Tkc6TkdBOk5JR0VSSUE6QWt3YWxib206VXJ1YW4KKzIzOk5HOk5HQTpOSUdFUklBOkFrd2FsYm9tOlVydWVPZmZvCisyNDpORzpOR0E6TklHRVJJQTpBa3dhbGJvbTpVeW8KKzE6Tkc6TkdBOk5JR0VSSUE6S3dhcmE6QXNhCisyOk5HOk5HQTpOSUdFUklBOkt3YXJhOkJhcnV0ZW4KKzM6Tkc6TkdBOk5JR0VSSUE6S3dhcmE6RWR1Cis0Ok5HOk5HQTpOSUdFUklBOkt3YXJhOklmZWxvZHVuCis1Ok5HOk5HQTpOSUdFUklBOkt3YXJhOklsb3JpbldlCis2Ok5HOk5HQTpOSUdFUklBOkt3YXJhOklyZXBvZHVuCis3Ok5HOk5HQTpOSUdFUklBOkt3YXJhOklyZXBvZHVuIChCKQorODpORzpOR0E6TklHRVJJQTpLd2FyYTpLYWlhbWEKKzk6Tkc6TkdBOk5JR0VSSUE6S3dhcmE6TW9ybworMTA6Tkc6TkdBOk5JR0VSSUE6S3dhcmE6T2ZmYQorMTE6Tkc6TkdBOk5JR0VSSUE6S3dhcmE6T3l1bgorMTpORzpOR0E6TklHRVJJQTpCYXVjaGk6QWtrbworMjpORzpOR0E6TklHRVJJQTpCYXVjaGk6QWxrYWxlcmkKKzM6Tkc6TkdBOk5JR0VSSUE6QmF1Y2hpOkJhbGFuZ2EKKzQ6Tkc6TkdBOk5JR0VSSUE6QmF1Y2hpOkJhdWNoaQorNTpORzpOR0E6TklHRVJJQTpCYXVjaGk6QmlsbGlyaQorNjpORzpOR0E6TklHRVJJQTpCYXVjaGk6RGFyYXpvCis3Ok5HOk5HQTpOSUdFUklBOkJhdWNoaTpEYXNzCis4Ok5HOk5HQTpOSUdFUklBOkJhdWNoaTpEdWtrdQorOTpORzpOR0E6TklHRVJJQTpCYXVjaGk6R2FtYXdhCisxMDpORzpOR0E6TklHRVJJQTpCYXVjaGk6R2FtanV3YQorMTE6Tkc6TkdBOk5JR0VSSUE6QmF1Y2hpOkdvbWJlCisxMjpORzpOR0E6TklHRVJJQTpCYXVjaGk6SXRhcy9HYWQKKzEzOk5HOk5HQTpOSUdFUklBOkJhdWNoaTpKYW1hJ2FyZQorMTQ6Tkc6TkdBOk5JR0VSSUE6QmF1Y2hpOkthbHR1bmdvCisxNTpORzpOR0E6TklHRVJJQTpCYXVjaGk6S2F0YWd1bQorMTY6Tkc6TkdBOk5JR0VSSUE6QmF1Y2hpOk1pc2F1CisxNzpORzpOR0E6TklHRVJJQTpCYXVjaGk6TmFmYWRhL0IKKzE4Ok5HOk5HQTpOSUdFUklBOkJhdWNoaTpOaW5naQorMTk6Tkc6TkdBOk5JR0VSSUE6QmF1Y2hpOlNoaXJhCisyMDpORzpOR0E6TklHRVJJQTpCYXVjaGk6VGFmYXdhLUIKKzIxOk5HOk5HQTpOSUdFUklBOkJhdWNoaTpUb3JvCisyMjpORzpOR0E6TklHRVJJQTpCYXVjaGk6WWFtYWx0dS8KKzIzOk5HOk5HQTpOSUdFUklBOkJhdWNoaTpaYWtpCisxOk5HOk5HQTpOSUdFUklBOk9uZG86QWRvLUVraXRpCisyOk5HOk5HQTpOSUdFUklBOk9uZG86QWtva29Ob3J0aAorMzpORzpOR0E6TklHRVJJQTpPbmRvOkFrb2tvTm9ydGhXZXN0Cis0Ok5HOk5HQTpOSUdFUklBOk9uZG86QWtva29Tb3UKKzU6Tkc6TkdBOk5JR0VSSUE6T25kbzpBa3VyZQorNjpORzpOR0E6TklHRVJJQTpPbmRvOkVraXRpRWFzCis3Ok5HOk5HQTpOSUdFUklBOk9uZG86RWtpdGlTb3V0aC1XZXN0Cis4Ok5HOk5HQTpOSUdFUklBOk9uZG86RWtpdGlXZXN0Cis5Ok5HOk5HQTpOSUdFUklBOk9uZG86RW11cmUvSXNlL09ydW4KKzEwOk5HOk5HQTpOSUdFUklBOk9uZG86SWRhbnJlCisxMTpORzpOR0E6TklHRVJJQTpPbmRvOklkby9Pc2kKKzEyOk5HOk5HQTpOSUdFUklBOk9uZG86SWZlZG9yZQorMTM6Tkc6TkdBOk5JR0VSSUE6T25kbzpJamVybworMTQ6Tkc6TkdBOk5JR0VSSUE6T25kbzpJa2FsZQorMTU6Tkc6TkdBOk5JR0VSSUE6T25kbzpJa2VyZQorMTY6Tkc6TkdBOk5JR0VSSUE6T25kbzpJa29sZQorMTc6Tkc6TkdBOk5JR0VSSUE6T25kbzpJbGFqZUVzZW9kbworMTg6Tkc6TkdBOk5JR0VSSUE6T25kbzpJbGVPbHVqaS9Pa2VpZ2JvCisxOTpORzpOR0E6TklHRVJJQTpPbmRvOklyZWxlCisyMDpORzpOR0E6TklHRVJJQTpPbmRvOk1vYmEKKzIxOk5HOk5HQTpOSUdFUklBOk9uZG86T2RpZ2JvCisyMjpORzpOR0E6TklHRVJJQTpPbmRvOk9uZG8KKzIzOk5HOk5HQTpOSUdFUklBOk9uZG86T3NlCisyNDpORzpOR0E6TklHRVJJQTpPbmRvOk93bworMjU6Tkc6TkdBOk5JR0VSSUE6T25kbzpPeWUKKzE6Tkc6TkdBOk5JR0VSSUE6S29naTpBZGF2aQorMjpORzpOR0E6TklHRVJJQTpLb2dpOkFqYW9rdXRhCiszOk5HOk5HQTpOSUdFUklBOktvZ2k6QW5rcGEKKzQ6Tkc6TkdBOk5JR0VSSUE6S29naTpCYXNzYQorNTpORzpOR0E6TklHRVJJQTpLb2dpOkRla2luYQorNjpORzpOR0E6TklHRVJJQTpLb2dpOklkYWgKKzc6Tkc6TkdBOk5JR0VSSUE6S29naTpJanVtdQorODpORzpOR0E6TklHRVJJQTpLb2dpOkthYmJhL0J1Cis5Ok5HOk5HQTpOSUdFUklBOktvZ2k6S29naQorMTA6Tkc6TkdBOk5JR0VSSUE6S29naTpLb3RvbmthcgorMTE6Tkc6TkdBOk5JR0VSSUE6S29naTpPZnUKKzEyOk5HOk5HQTpOSUdFUklBOktvZ2k6T2tlaGkKKzEzOk5HOk5HQTpOSUdFUklBOktvZ2k6T2tlbmUKKzE0Ok5HOk5HQTpOSUdFUklBOktvZ2k6T2xhbWFib3IKKzE1Ok5HOk5HQTpOSUdFUklBOktvZ2k6WWFnYmFFYXMKKzE2Ok5HOk5HQTpOSUdFUklBOktvZ2k6WWFnYmFXZXMKKzE6Tkc6TkdBOk5JR0VSSUE6RW51Z3U6QWJha2FsaWsKKzI6Tkc6TkdBOk5JR0VSSUE6RW51Z3U6QXdndQorMzpORzpOR0E6TklHRVJJQTpFbnVndTpFbnVndVNvdQorNDpORzpOR0E6TklHRVJJQTpFbnVndTpFemVhZ3UKKzU6Tkc6TkdBOk5JR0VSSUE6RW51Z3U6RXp6YQorNjpORzpOR0E6TklHRVJJQTpFbnVndTpJZ2JvLUV0aQorNzpORzpOR0E6TklHRVJJQTpFbnVndTpJZ2JvLUV6ZQorODpORzpOR0E6TklHRVJJQTpFbnVndTpJa3dvCis5Ok5HOk5HQTpOSUdFUklBOkVudWd1OklzaGllbHUKKzEwOk5HOk5HQTpOSUdFUklBOkVudWd1OklzaS1Vem8KKzExOk5HOk5HQTpOSUdFUklBOkVudWd1Okl6emkKKzEyOk5HOk5HQTpOSUdFUklBOkVudWd1Ok5rYW51CisxMzpORzpOR0E6TklHRVJJQTpFbnVndTpOc3Vra2EKKzE0Ok5HOk5HQTpOSUdFUklBOkVudWd1Ok9oYXVrd3UKKzE1Ok5HOk5HQTpOSUdFUklBOkVudWd1Ok9qaS1SaXZlcgorMTY6Tkc6TkdBOk5JR0VSSUE6RW51Z3U6VWRpCisxNzpORzpOR0E6TklHRVJJQTpFbnVndTpVem8tVXdhbmkKKzE6Tkc6TkdBOk5JR0VSSUE6TGFnb3M6QWdlZ2UKKzI6Tkc6TkdBOk5JR0VSSUE6TGFnb3M6QmFkYWdhcnkKKzM6Tkc6TkdBOk5JR0VSSUE6TGFnb3M6RXBlCis0Ok5HOk5HQTpOSUdFUklBOkxhZ29zOkV0aS1Pc2EKKzU6Tkc6TkdBOk5JR0VSSUE6TGFnb3M6SWJlanUvTGVra2kKKzY6Tkc6TkdBOk5JR0VSSUE6TGFnb3M6SWtlamEKKzc6Tkc6TkdBOk5JR0VSSUE6TGFnb3M6SWtvcm9kdQorODpORzpOR0E6TklHRVJJQTpMYWdvczpMYWdvc0lzbGFuZAorOTpORzpOR0E6TklHRVJJQTpMYWdvczpNYWlubGFuZAorMTA6Tkc6TkdBOk5JR0VSSUE6TGFnb3M6TXVzaGluCisxMTpORzpOR0E6TklHRVJJQTpMYWdvczpPam8KKzEyOk5HOk5HQTpOSUdFUklBOkxhZ29zOlNob21vbHUKKzE6Tkc6TkdBOk5JR0VSSUE6S2FkdW5hOkJpcm5pbi1HCisyOk5HOk5HQTpOSUdFUklBOkthZHVuYTpDaGlrdW4KKzM6Tkc6TkdBOk5JR0VSSUE6S2FkdW5hOkRva2EvS2F3Cis0Ok5HOk5HQTpOSUdFUklBOkthZHVuYTpHaXdhCis1Ok5HOk5HQTpOSUdFUklBOkthZHVuYTpJZ2FiaQorNjpORzpOR0E6TklHRVJJQTpLYWR1bmE6SWthcmEKKzc6Tkc6TkdBOk5JR0VSSUE6S2FkdW5hOkphYmEKKzg6Tkc6TkdBOk5JR0VSSUE6S2FkdW5hOkplbWEnYQorOTpORzpOR0E6TklHRVJJQTpLYWR1bmE6S2FjaGlhCisxMDpORzpOR0E6TklHRVJJQTpLYWR1bmE6S2F1cmEKKzExOk5HOk5HQTpOSUdFUklBOkthZHVuYTpLYXVydQorMTI6Tkc6TkdBOk5JR0VSSUE6S2FkdW5hOkxlcmUKKzEzOk5HOk5HQTpOSUdFUklBOkthZHVuYTpNYWthcmZpCisxNDpORzpOR0E6TklHRVJJQTpLYWR1bmE6U2Fib24tR2EKKzE1Ok5HOk5HQTpOSUdFUklBOkthZHVuYTpTb2JhCisxNjpORzpOR0E6TklHRVJJQTpLYWR1bmE6VHVkdW4KKzE3Ok5HOk5HQTpOSUdFUklBOkthZHVuYTpaYW5nb25LYQorMTg6Tkc6TkdBOk5JR0VSSUE6S2FkdW5hOlphcmlhCisxOk5HOk5HQTpOSUdFUklBOkJvcm5vOkFza2lyYS9VCisyOk5HOk5HQTpOSUdFUklBOkJvcm5vOkJhbWEKKzM6Tkc6TkdBOk5JR0VSSUE6Qm9ybm86Qml1Cis0Ok5HOk5HQTpOSUdFUklBOkJvcm5vOkRhbWJvYQorNTpORzpOR0E6TklHRVJJQTpCb3JubzpEaWt3YQorNjpORzpOR0E6TklHRVJJQTpCb3JubzpHd296YQorNzpORzpOR0E6TklHRVJJQTpCb3JubzpLYWdhCis4Ok5HOk5HQTpOSUdFUklBOkJvcm5vOktvbmR1Z2EKKzk6Tkc6TkdBOk5JR0VSSUE6Qm9ybm86S3VrYXdhCisxMDpORzpOR0E6TklHRVJJQTpCb3JubzpNYWlkdWd1cgorMTE6Tkc6TkdBOk5JR0VSSUE6Qm9ybm86TW9iYmFyCisxMjpORzpOR0E6TklHRVJJQTpCb3JubzpNb25ndW5vCisxMzpORzpOR0E6TklHRVJJQTpCb3JubzpOZ2FsYQorMTQ6Tkc6TkdBOk5JR0VSSUE6Qm9ybm86U2hhbmkKKzE6Tkc6TkdBOk5JR0VSSUE6S2ViYmk6QXJld2EKKzI6Tkc6TkdBOk5JR0VSSUE6S2ViYmk6QXJndW5ndQorMzpORzpOR0E6TklHRVJJQTpLZWJiaTpCYWd1ZG8KKzQ6Tkc6TkdBOk5JR0VSSUE6S2ViYmk6QmlybmluS2UKKzU6Tkc6TkdBOk5JR0VSSUE6S2ViYmk6QnVuemEKKzY6Tkc6TkdBOk5JR0VSSUE6S2ViYmk6RGFuZGkKKzc6Tkc6TkdBOk5JR0VSSUE6S2ViYmk6R3dhbmR1Cis4Ok5HOk5HQTpOSUdFUklBOktlYmJpOkplZ2EKKzk6Tkc6TkdBOk5JR0VSSUE6S2ViYmk6S29rby9CZXMKKzEwOk5HOk5HQTpOSUdFUklBOktlYmJpOk1haXlhbWEKKzExOk5HOk5HQTpOSUdFUklBOktlYmJpOk5nYXNraQorMTI6Tkc6TkdBOk5JR0VSSUE6S2ViYmk6U2FrYWJhCisxMzpORzpOR0E6TklHRVJJQTpLZWJiaTpTdXJ1CisxNDpORzpOR0E6TklHRVJJQTpLZWJiaTpZYXVyaQorMTU6Tkc6TkdBOk5JR0VSSUE6S2ViYmk6WnVydQorMTpORzpOR0E6TklHRVJJQTpBbmFtYnJhOkFndWF0YQorMjpORzpOR0E6TklHRVJJQTpBbmFtYnJhOkFuYW1icmEKKzM6Tkc6TkdBOk5JR0VSSUE6QW5hbWJyYTpBbmFvY2hhCis0Ok5HOk5HQTpOSUdFUklBOkFuYW1icmE6QXdrYU5vcnQKKzU6Tkc6TkdBOk5JR0VSSUE6QW5hbWJyYTpBd2thU291dAorNjpORzpOR0E6TklHRVJJQTpBbmFtYnJhOklkZW1pbGkKKzc6Tkc6TkdBOk5JR0VSSUE6QW5hbWJyYTpJaGlhbGEKKzg6Tkc6TkdBOk5JR0VSSUE6QW5hbWJyYTpOamlrb2thCis5Ok5HOk5HQTpOSUdFUklBOkFuYW1icmE6Tm5ld2lOb3J0CisxMDpORzpOR0E6TklHRVJJQTpBbmFtYnJhOk5uZXdpU291CisxMTpORzpOR0E6TklHRVJJQTpBbmFtYnJhOk9nYmFydQorMTI6Tkc6TkdBOk5JR0VSSUE6QW5hbWJyYTpPbml0c2hhTgorMTM6Tkc6TkdBOk5JR0VSSUE6QW5hbWJyYTpPcnVtYmFObworMTQ6Tkc6TkdBOk5JR0VSSUE6QW5hbWJyYTpPcnVtYmFTbworMTU6Tkc6TkdBOk5JR0VSSUE6QW5hbWJyYTpPeWkKKzE6Tkc6TkdBOk5JR0VSSUE6TmlnZXI6QWdhaWUKKzI6Tkc6TkdBOk5JR0VSSUE6TmlnZXI6QWd3YXJhCiszOk5HOk5HQTpOSUdFUklBOk5pZ2VyOkJpZGEKKzQ6Tkc6TkdBOk5JR0VSSUE6TmlnZXI6Qm9yZ3UKKzU6Tkc6TkdBOk5JR0VSSUE6TmlnZXI6Qm9zc28KKzY6Tkc6TkdBOk5JR0VSSUE6TmlnZXI6R2Jha28KKzc6Tkc6TkdBOk5JR0VSSUE6TmlnZXI6R3VyYXJhCis4Ok5HOk5HQTpOSUdFUklBOk5pZ2VyOktvbnRvZ3VyCis5Ok5HOk5HQTpOSUdFUklBOk5pZ2VyOkxhcGFpCisxMDpORzpOR0E6TklHRVJJQTpOaWdlcjpMYXZ1bgorMTE6Tkc6TkdBOk5JR0VSSUE6TmlnZXI6TWFnYW1hCisxMjpORzpOR0E6TklHRVJJQTpOaWdlcjpNb2t3YQorMTM6Tkc6TkdBOk5JR0VSSUE6TmlnZXI6UGFpa29ybworMTQ6Tkc6TkdBOk5JR0VSSUE6TmlnZXI6UmFmaQorMTU6Tkc6TkdBOk5JR0VSSUE6TmlnZXI6UmlqYXUKKzE2Ok5HOk5HQTpOSUdFUklBOk5pZ2VyOlNoaXJvcm8KKzE3Ok5HOk5HQTpOSUdFUklBOk5pZ2VyOlN1bGVqYQorMTg6Tkc6TkdBOk5JR0VSSUE6TmlnZXI6V3VzaGlzaGkKKzE6Tkc6TkdBOk5JR0VSSUE6U29rb3RvOkFua2EKKzI6Tkc6TkdBOk5JR0VSSUE6U29rb3RvOkJha3VyYQorMzpORzpOR0E6TklHRVJJQTpTb2tvdG86QmluamkKKzQ6Tkc6TkdBOk5JR0VSSUE6U29rb3RvOkJvZGluZ2EKKzU6Tkc6TkdBOk5JR0VSSUE6U29rb3RvOkJ1bmd1ZHUKKzY6Tkc6TkdBOk5JR0VSSUE6U29rb3RvOkRhbmdlLVNoCis3Ok5HOk5HQTpOSUdFUklBOlNva290bzpHYWRhCis4Ok5HOk5HQTpOSUdFUklBOlNva290bzpHb3JvbnlvCis5Ok5HOk5HQTpOSUdFUklBOlNva290bzpHdW1taQorMTA6Tkc6TkdBOk5JR0VSSUE6U29rb3RvOkd1c2F1CisxMTpORzpOR0E6TklHRVJJQTpTb2tvdG86R3dhZGFiYXcKKzEyOk5HOk5HQTpOSUdFUklBOlNva290bzpJbGxlbGEKKzEzOk5HOk5HQTpOSUdFUklBOlNva290bzpJc2EKKzE0Ok5HOk5HQTpOSUdFUklBOlNva290bzpLYXVyYS1OYQorMTU6Tkc6TkdBOk5JR0VSSUE6U29rb3RvOkt3YXJlCisxNjpORzpOR0E6TklHRVJJQTpTb2tvdG86TWFyYWR1bgorMTc6Tkc6TkdBOk5JR0VSSUE6U29rb3RvOlJhYmFoCisxODpORzpOR0E6TklHRVJJQTpTb2tvdG86U2Fib25CaXIKKzE5Ok5HOk5HQTpOSUdFUklBOlNva290bzpTaWxhbWUKKzIwOk5HOk5HQTpOSUdFUklBOlNva290bzpTb2tvdG8KKzIxOk5HOk5HQTpOSUdFUklBOlNva290bzpUYWxhdGFyCisyMjpORzpOR0E6TklHRVJJQTpTb2tvdG86VGFtYmF3YWwKKzIzOk5HOk5HQTpOSUdFUklBOlNva290bzpUYW5nYXphcgorMjQ6Tkc6TkdBOk5JR0VSSUE6U29rb3RvOlRzYWZlCisyNTpORzpOR0E6TklHRVJJQTpTb2tvdG86V2FtYWtrbworMjY6Tkc6TkdBOk5JR0VSSUE6U29rb3RvOld1cm5vCisyNzpORzpOR0E6TklHRVJJQTpTb2tvdG86WWFibworMjg6Tkc6TkdBOk5JR0VSSUE6U29rb3RvOlp1cm1pCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L05MRC9OTERfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L05MRC9OTERfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM0NWE4ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTkxEL05MRF9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDEyIEBACisxOk5MLURSOk5MOkRSRU5USEUKKzI6TkwtRkw6Tkw6RkxFVk9MQU5ECiszOk5MLUZSOk5MOkZSSUVTTEFORAorNDpOTC1HRTpOTDpHRUxERVJMQU5ECis1Ok5MLUdSOk5MOkdST05JTkdFTgorNjpOTC1MSTpOTDpMSU1CVVJHCis3Ok5MLU5COk5MOk5PT1JEIEJSQUJBTlQKKzg6TkwtTkg6Tkw6Tk9PUkQgSE9MTEFORAorOTpOTC1PVjpOTDpPVkVSSUpTU0VMCisxMDpOTC1VVDpOTDpVVFJFQ0hUCisxMTpOTC1aRTpOTDpaRUVMQU5ECisxMjpOTC1aSDpOTDpaVUlEIEhPTExBTkQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTkxEL05MRF9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTkxEL05MRF9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9OTEQvTkxEX0FETUlOMl9MRVgudHh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L05PUi9OT1JfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L05PUi9OT1JfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzZGRmZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTk9SL05PUl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDE5IEBACisxOk5PLTAyOk5POkFLRVJTSFVTCisyOk5PLTA5Ok5POkFVU1QgQUdERVIKKzM6Tk8tMDY6Tk86QlVTS0VSVUQKKzQ6Tk8tMjA6Tk86RklOTk1BUksKKzU6Tk8tMDQ6Tk86SEVETUFSSworNjpOTy0yOk5POkhPUkRBTEFORAorNzpOTy0yMjpOTzpKQU4gTUFZRU4gKEFSQ1RJQyBSRUdJT04pIChTRUUgQUxTTyBDT1VOVFJZIENPREUgU0opCis4Ok5PLTU6Tk86TU9FUkUgT0cgUk9NU0RBTAorOTpOTy03Ok5POk5PUkQgVFJPRU5ERUxBRworMTA6Tk8tODpOTzpOT1JETEFORAorMTE6Tk8tMDpOTzpPRVNURk9MRAorMTI6Tk8tMDU6Tk86T1BQTEFORAorMTM6Tk8tMDM6Tk86T1NMTyBPRyBBS0VSU0hVUworMTQ6Tk8tMjE6Tk86Uk9HQUxBTkQKKzE1Ok5PLTY6Tk86U09FUiBUUk9FTkRFTEFHCisxNjpOTy00Ok5POlNPR04gT0cgRkpPUkRBTkUKKzE3Ok5PLTA4Ok5POlRFTEVNQVJLCisxODpOTy05Ok5POlRST01TCisxOTpOTy0wNzpOTzpWRVNURk9MRApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9OT1IvTk9SX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9OT1IvTk9SX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L05PUi9OT1JfQURNSU4yX0xFWC50eHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTlBML05QTF9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTlBML05QTF9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDBhNTRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9OUEwvTlBMX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMTkgQEAKKzE6TlAtQkE6TlA6QkFHTUFUSQorMjpOUC1CSDpOUDpCSEVSSQorMzpOUC1DOk5QOkNFTlRSQUwKKzQ6TlAtREg6TlA6REhBV0FMQUdJUkkKKzU6TlAtRTpOUDpFQVNUCis2Ok5QLUZBVzpOUDpGQVIgV0VTVAorNzpOUC1HQTpOUDpHQU5EQUtJCis4Ok5QLUpBOk5QOkpBTkFLUFVSCis5Ok5QLUtBOk5QOktBUk5BTEkKKzEwOk5QLUtPOk5QOktPU0kgW0tPU0hJXQorMTE6TlAtTFU6TlA6TFVNQklOSQorMTI6TlAtTUE6TlA6TUFIQUtBTEkKKzEzOk5QLU1FOk5QOk1FQ0hJCisxNDpOUC1NSUQ6TlA6TUlEV0VTVAorMTU6TlAtTkE6TlA6TkFSQVlBTkkKKzE2Ok5QLVJBOk5QOlJBUFRJCisxNzpOUC1TQTpOUDpTQUdBUk1BVEhBCisxODpOUC1TRTpOUDpTRVRJCisxOTpOUC1XOk5QOldFU1QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTlBML05QTF9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvTlBML05QTF9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmY4YWExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9OUEwvTlBMX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMTQgQEAKKzE6TlA6TlBMOk5FUEFMOkNlbnRyYWw6QmFnbWF0aQorMjpOUDpOUEw6TkVQQUw6Q2VudHJhbDpKYW5ha3B1cgorMzpOUDpOUEw6TkVQQUw6Q2VudHJhbDpOYXJheWFuaQorMTpOUDpOUEw6TkVQQUw6RmFyIFdlc3Q6TWFoYWthbGkKKzI6TlA6TlBMOk5FUEFMOkZhciBXZXN0OlNldGkKKzE6TlA6TlBMOk5FUEFMOldlc3Q6RGhhd2FsYWdpCisyOk5QOk5QTDpORVBBTDpXZXN0OkdhbmRha2kKKzM6TlA6TlBMOk5FUEFMOldlc3Q6THVtYmluaQorMTpOUDpOUEw6TkVQQUw6TWlkd2VzdDpCaGVyaQorMjpOUDpOUEw6TkVQQUw6TWlkd2VzdDpLYXJuYWxpCiszOk5QOk5QTDpORVBBTDpNaWR3ZXN0OlJhcHRpCisxOk5QOk5QTDpORVBBTDpFYXN0Oktvc2hpCisyOk5QOk5QTDpORVBBTDpFYXN0Ok1lY2hpCiszOk5QOk5QTDpORVBBTDpFYXN0OlNhZ2FybWF0aApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9PTU4vT01OX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9PTU4vT01OX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNWVhMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L09NTi9PTU5fQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxMCBAQAorMTpPTS1EQTpPTTpBIERBS0hMSVlBCisyOk9NLVNIOk9NOkEgU0hBUlFJWUEKKzM6T00tQkE6T006QUwgQkFUTkFICis0Ok9NLURIQTpPTTpBTCBESEFISVJBCis1Ok9NLUpBOk9NOkFMIEpBTkJZQUggW1pVRlJdCis2Ok9NLVdVOk9NOkFMIFdVU1RBCis3Ok9NLVpBOk9NOkFaIFpISVJBSAorODpPSC1ESEY6T006REhPRkFSCis5Ok9NLU1VOk9NOk1VU0FOREFNCisxMDpPTS1NQTpPTTpNVVNDQVQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvT01OL09NTl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvT01OL09NTl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjM0ZjZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9PTU4vT01OX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsNDkgQEAKKzE6T006T01OOk9NQU46QWwgQmF0bmFoOkEgUnVzdGFxCisyOk9NOk9NTjpPTUFOOkFsIEJhdG5haDpBbCBBd2FiaQorMzpPTTpPTU46T01BTjpBbCBCYXRuYWg6QWwgS2hhYm91cmFoCis0Ok9NOk9NTjpPTUFOOkFsIEJhdG5haDpBbCBNYXNuYWFoCis1Ok9NOk9NTjpPTUFOOkFsIEJhdG5haDpBcyBTdXdhaXEKKzY6T006T01OOk9NQU46QWwgQmF0bmFoOkJhcmthCis3Ok9NOk9NTjpPTUFOOkFsIEJhdG5haDpMaXdhCis4Ok9NOk9NTjpPTUFOOkFsIEJhdG5haDpOYWtoYWwKKzk6T006T01OOk9NQU46QWwgQmF0bmFoOlNhaGFtCisxMDpPTTpPTU46T01BTjpBbCBCYXRuYWg6U2hpbmFzCisxMTpPTTpPTU46T01BTjpBbCBCYXRuYWg6U29oYXIKKzE6T006T01OOk9NQU46QWwgV3VzdGE6QWwgV3VzdGEgKDEpCisxOk9NOk9NTjpPTUFOOk11c2FuZGFtOkFsIEtoYXNhYgorMjpPTTpPTU46T01BTjpNdXNhbmRhbTpCdWtoYQorMzpPTTpPTU46T01BTjpNdXNhbmRhbTpEaWJhCis0Ok9NOk9NTjpPTUFOOk11c2FuZGFtOk1hZGhhCisxOk9NOk9NTjpPTUFOOk11c2NhdDpBIFNlZWIKKzI6T006T01OOk9NQU46TXVzY2F0OkJhdXNoZXIKKzM6T006T01OOk9NQU46TXVzY2F0Ok11c2NhdAorNDpPTTpPTU46T01BTjpNdXNjYXQ6TXV0dHJhaAorNTpPTTpPTU46T01BTjpNdXNjYXQ6UXVyaXlhdAorMTpPTTpPTU46T01BTjpBbCBEaGFoaXJhOkFsIEJ1cmFpbWkKKzI6T006T01OOk9NQU46QWwgRGhhaGlyYTpEaGFuaworMzpPTTpPTU46T01BTjpBbCBEaGFoaXJhOklicmkKKzQ6T006T01OOk9NQU46QWwgRGhhaGlyYTpNYWhkaGEKKzU6T006T01OOk9NQU46QWwgRGhhaGlyYTpZYW5xdWwKKzE6T006T01OOk9NQU46RGhvZmFyOkFsIEhhbGFuaXlhdCBJc2wuCisyOk9NOk9NTjpPTUFOOkRob2ZhcjpNYXJiYXQKKzM6T006T01OOk9NQU46RGhvZmFyOk11cXNoaW4KKzQ6T006T01OOk9NQU46RGhvZmFyOlNhbGFsYWgKKzU6T006T01OOk9NQU46RGhvZmFyOlN1ZGgKKzY6T006T01OOk9NQU46RGhvZmFyOlRhcWFoCis3Ok9NOk9NTjpPTUFOOkRob2ZhcjpUaHVtcmFpdAorMTpPTTpPTU46T01BTjpBIERha2hsaXlhOkFkYW0KKzI6T006T01OOk9NQU46QSBEYWtobGl5YTpBbCBIYW1yYQorMzpPTTpPTU46T01BTjpBIERha2hsaXlhOkJhaGxhCis0Ok9NOk9NTjpPTUFOOkEgRGFraGxpeWE6QmlkIEJpZAorNTpPTTpPTU46T01BTjpBIERha2hsaXlhOkl6a2kKKzY6T006T01OOk9NQU46QSBEYWtobGl5YTpNYW5haAorNzpPTTpPTU46T01BTjpBIERha2hsaXlhOk5pendhIChOYXp3YSkKKzg6T006T01OOk9NQU46QSBEYWtobGl5YTpTYW1haWwKKzE6T006T01OOk9NQU46QSBTaGFycWl5YTpBbCBNdWRoYWliaQorMjpPTTpPTU46T01BTjpBIFNoYXJxaXlhOkFsIFFhYmlsCiszOk9NOk9NTjpPTUFOOkEgU2hhcnFpeWE6QWwgV2FmaQorNDpPTTpPTU46T01BTjpBIFNoYXJxaXlhOkJpZGRpeWEKKzU6T006T01OOk9NQU46QSBTaGFycWl5YTpJYnJhCis2Ok9NOk9NTjpPTUFOOkEgU2hhcnFpeWE6SmFsYW4gQmFuaQorNzpPTTpPTU46T01BTjpBIFNoYXJxaXlhOk1hc2lyYWgKKzg6T006T01OOk9NQU46QSBTaGFycWl5YTpTdXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUEFLL1BBS19BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUEFLL1BBS19BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWZkZmM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9QQUsvUEFLX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsOSBAQAorMTpQSy1CQTpQSzpCQUxVQ0hJU1RBTiBbQkFMVUNISVNUQU4gKEVOKV0KKzI6UEstVEE6UEs6Ri5BLlQuQS4gW0ZFREVSQUxMWSBBRE1JTklTVEVSRUQgVFJJQkFMIEFSRUFTXQorMzpQSy1GQzpQSzpGLkMuVC4KKzQ6UEstSVM6UEs6SVNMQU1BQkFECis1OlBLLUpLOlBLOkpBTU1VIEFORCBLQVNITUlSIFtBWkFEIEtBU0hNSVJdCis2OlBLLU5XOlBLOk4uVy5GLlAuIFtOT1JUSCBXRVNUIEZST05USUVSXQorNzpQSy1OQTpQSzpOT1JUSEVSTiBBUkVBUworODpQSy1QQjpQSzpQVU5KQUIKKzk6UEstU0Q6UEs6U0lORCBbU0lORCAoRU4pXQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9QQUsvUEFLX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9QQUsvUEFLX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOTgzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BBSy9QQUtfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSw4MCBAQAorMTpQSzpQQUs6UEFLSVNUQU46Ri5DLlQuOklzbGFtYWJhZAorMTpQSzpQQUs6UEFLSVNUQU46UHVuamFiOkF0dG9rCisyOlBLOlBBSzpQQUtJU1RBTjpQdW5qYWI6QmFoYXdhbG5hZ2FyCiszOlBLOlBBSzpQQUtJU1RBTjpQdW5qYWI6QmFoYXdhbHB1cgorNDpQSzpQQUs6UEFLSVNUQU46UHVuamFiOkRlcmEgR2hhemkgS2hhbgorNTpQSzpQQUs6UEFLSVNUQU46UHVuamFiOkZhaXNhbGFiYWQKKzY6UEs6UEFLOlBBS0lTVEFOOlB1bmphYjpHdWphcmF0Cis3OlBLOlBBSzpQQUtJU1RBTjpQdW5qYWI6R3VqcmFud2FsYQorODpQSzpQQUs6UEFLSVNUQU46UHVuamFiOkpoYW5nCis5OlBLOlBBSzpQQUtJU1RBTjpQdW5qYWI6SmhlbHVtCisxMDpQSzpQQUs6UEFLSVNUQU46UHVuamFiOkthc3VyCisxMTpQSzpQQUs6UEFLSVNUQU46UHVuamFiOkxhaG9yZQorMTI6UEs6UEFLOlBBS0lTVEFOOlB1bmphYjpNYWlud2FsaQorMTM6UEs6UEFLOlBBS0lTVEFOOlB1bmphYjpNdWx0YW4KKzE0OlBLOlBBSzpQQUtJU1RBTjpQdW5qYWI6TXV6YWZmYXJnYXJoCisxNTpQSzpQQUs6UEFLSVNUQU46UHVuamFiOlJhaGltIFlhciBLaGFuCisxNjpQSzpQQUs6UEFLSVNUQU46UHVuamFiOlJhd2FscGluZGkKKzE3OlBLOlBBSzpQQUtJU1RBTjpQdW5qYWI6U2FoaXdhbAorMTg6UEs6UEFLOlBBS0lTVEFOOlB1bmphYjpTYXJnb2RoYQorMTk6UEs6UEFLOlBBS0lTVEFOOlB1bmphYjpTaGVpa2h1cHVyYQorMjA6UEs6UEFLOlBBS0lTVEFOOlB1bmphYjpTaWFsa290CisyMTpQSzpQQUs6UEFLSVNUQU46UHVuamFiOlZlaGFyaQorMTpQSzpQQUs6UEFLSVNUQU46QmFsdWNoaXN0YW46Q2hhZ2FpCisyOlBLOlBBSzpQQUtJU1RBTjpCYWx1Y2hpc3RhbjpHd2FkYXIKKzM6UEs6UEFLOlBBS0lTVEFOOkJhbHVjaGlzdGFuOkthY2hoaQorNDpQSzpQQUs6UEFLSVNUQU46QmFsdWNoaXN0YW46S2FsYXQKKzU6UEs6UEFLOlBBS0lTVEFOOkJhbHVjaGlzdGFuOktoYXJhbgorNjpQSzpQQUs6UEFLSVNUQU46QmFsdWNoaXN0YW46S2h1emRhcgorNzpQSzpQQUs6UEFLSVNUQU46QmFsdWNoaXN0YW46S29obHUKKzg6UEs6UEFLOlBBS0lTVEFOOkJhbHVjaGlzdGFuOkxhc2JlbGEKKzk6UEs6UEFLOlBBS0lTVEFOOkJhbHVjaGlzdGFuOkxvcmFsYWkKKzEwOlBLOlBBSzpQQUtJU1RBTjpCYWx1Y2hpc3RhbjpOYXNpcmFiYWQKKzExOlBLOlBBSzpQQUtJU1RBTjpCYWx1Y2hpc3RhbjpQYW5qZ3VyCisxMjpQSzpQQUs6UEFLSVNUQU46QmFsdWNoaXN0YW46UGlzaGluCisxMzpQSzpQQUs6UEFLSVNUQU46QmFsdWNoaXN0YW46UXVldHRhCisxNDpQSzpQQUs6UEFLSVNUQU46QmFsdWNoaXN0YW46U2liaQorMTU6UEs6UEFLOlBBS0lTVEFOOkJhbHVjaGlzdGFuOlR1cmJhdAorMTY6UEs6UEFLOlBBS0lTVEFOOkJhbHVjaGlzdGFuOlpob2IKKzE6UEs6UEFLOlBBS0lTVEFOOkphbW11IGFuZCBLYXNobWlyOkJhcmFtdWxhIChLYXNobWlyIE5vcnRoKQorMjpQSzpQQUs6UEFLSVNUQU46SmFtbXUgYW5kIEthc2htaXI6Q2hpbGFzCiszOlBLOlBBSzpQQUtJU1RBTjpKYW1tdSBhbmQgS2FzaG1pcjpHaWxnaXQKKzQ6UEs6UEFLOlBBS0lTVEFOOkphbW11IGFuZCBLYXNobWlyOkdpbGdpdCAoVHJpYmFsIFRlcnJpdG9yeSkKKzU6UEs6UEFLOlBBS0lTVEFOOkphbW11IGFuZCBLYXNobWlyOkthcmdpbAorNjpQSzpQQUs6UEFLSVNUQU46SmFtbXUgYW5kIEthc2htaXI6S3Vwd2FyYSAoR2lsZ2l0IFdhemFyYXQpCis3OlBLOlBBSzpQQUtJU1RBTjpKYW1tdSBhbmQgS2FzaG1pcjpLdXB3YXJhIChNdXphZmZhcmFiYWQpCis4OlBLOlBBSzpQQUtJU1RBTjpKYW1tdSBhbmQgS2FzaG1pcjpMYWRha2ggKExlaCkKKzk6UEs6UEFLOlBBS0lTVEFOOkphbW11IGFuZCBLYXNobWlyOk1pcnB1cgorMTA6UEs6UEFLOlBBS0lTVEFOOkphbW11IGFuZCBLYXNobWlyOlB1bmNoCisxOlBLOlBBSzpQQUtJU1RBTjpOLlcuRi5QLjpBYmJvdHRhYmFkCisyOlBLOlBBSzpQQUtJU1RBTjpOLlcuRi5QLjpCYW5udQorMzpQSzpQQUs6UEFLSVNUQU46Ti5XLkYuUC46Q2hpdHJhbAorNDpQSzpQQUs6UEFLSVNUQU46Ti5XLkYuUC46RGVyYSBJc21haWwgS2hhbgorNTpQSzpQQUs6UEFLSVNUQU46Ti5XLkYuUC46RGlyCis2OlBLOlBBSzpQQUtJU1RBTjpOLlcuRi5QLjpLb2hhdAorNzpQSzpQQUs6UEFLSVNUQU46Ti5XLkYuUC46S29oaXN0YW4KKzg6UEs6UEFLOlBBS0lTVEFOOk4uVy5GLlAuOk1hbGFrYW5kIFAuQS4KKzk6UEs6UEFLOlBBS0lTVEFOOk4uVy5GLlAuOk1hbnNlaHJhCisxMDpQSzpQQUs6UEFLSVNUQU46Ti5XLkYuUC46TWFyZGFuCisxMTpQSzpQQUs6UEFLSVNUQU46Ti5XLkYuUC46UGVzaGF3YXIKKzEyOlBLOlBBSzpQQUtJU1RBTjpOLlcuRi5QLjpTd2F0CisxOlBLOlBBSzpQQUtJU1RBTjpTaW5kOkJhZGluCisyOlBLOlBBSzpQQUtJU1RBTjpTaW5kOkRhZHUKKzM6UEs6UEFLOlBBS0lTVEFOOlNpbmQ6SHlkZXJhYmFkCis0OlBLOlBBSzpQQUtJU1RBTjpTaW5kOkpha29iYWJhZAorNTpQSzpQQUs6UEFLSVNUQU46U2luZDpLYXJhY2hpCis2OlBLOlBBSzpQQUtJU1RBTjpTaW5kOktoYWlycHVyCis3OlBLOlBBSzpQQUtJU1RBTjpTaW5kOkxhcmthbmEKKzg6UEs6UEFLOlBBS0lTVEFOOlNpbmQ6TmF3YWIgU2hhaAorOTpQSzpQQUs6UEFLSVNUQU46U2luZDpTYW5naGFyCisxMDpQSzpQQUs6UEFLSVNUQU46U2luZDpTaGlrYXJwdXIKKzExOlBLOlBBSzpQQUtJU1RBTjpTaW5kOlN1a2t1cgorMTI6UEs6UEFLOlBBS0lTVEFOOlNpbmQ6VGhhcnBhcmthcgorMTM6UEs6UEFLOlBBS0lTVEFOOlNpbmQ6VGhhdHRhCisxOlBLOlBBSzpQQUtJU1RBTjpGLkEuVC5BLjpCYWphdXIKKzI6UEs6UEFLOlBBS0lTVEFOOkYuQS5ULkEuOktoeWJlcgorMzpQSzpQQUs6UEFLSVNUQU46Ri5BLlQuQS46S3VycmFtCis0OlBLOlBBSzpQQUtJU1RBTjpGLkEuVC5BLjpNb2htYW5kCis1OlBLOlBBSzpQQUtJU1RBTjpGLkEuVC5BLjpOLiBXYXppcmlzdGFuCis2OlBLOlBBSzpQQUtJU1RBTjpGLkEuVC5BLjpPcmFremFpCis3OlBLOlBBSzpQQUtJU1RBTjpGLkEuVC5BLjpTLiBXYXppcmlzdGFuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BFUi9QRVJfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BFUi9QRVJfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhMWY1MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUEVSL1BFUl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDI1IEBACisxOlBFLUFNQTpQRTpBTUFaT05BUworMjpQRS1BTkM6UEU6QU5DQVNICiszOlBFLUFQVTpQRTpBUFVSSU1BQworNDpQRS1BUkU6UEU6QVJFUVVJUEEKKzU6UEUtQVlBOlBFOkFZQUNVQ0hPCis2OlBFLUNBSjpQRTpDQUpBTUFSQ0EKKzc6UEUtQ1VTOlBFOkNVWkNPIFtDVVNDT10KKzg6UEUtQ0FMOlBFOkVMIENBTExBTworOTpQRS1IVVY6UEU6SFVBTkNBVkVMSUNBCisxMDpQRS1IVUM6UEU6SFVBTlVDTworMTE6UEUtSUNBOlBFOklDQQorMTI6UEUtSlVOOlBFOkpVTklOCisxMzpQRS1MQUw6UEU6TEEgTElCRVJUQUQKKzE0OlBFLUxBTTpQRTpMQU1CQVlFUVVFCisxNTpQRS1MSU06UEU6TElNQQorMTY6UEUtTE9SOlBFOkxPUkVUTworMTc6UEUtTUREOlBFOk1BRFJFIERFIERJT1MKKzE4OlBFLU1PUTpQRTpNT1FVRUdVQQorMTk6UEUtUEFTOlBFOlBBU0NPCisyMDpQRS1QSVU6UEU6UElVUkEKKzIxOlBFLVBVTjpQRTpQVU5PCisyMjpQRS1TQU06UEU6U0FOIE1BUlRJTgorMjM6UEUtVEFDOlBFOlRBQ05BCisyNDpQRS1UVU06UEU6VFVNQkVTCisyNTpQRS1VQ0E6UEU6VUNBWUFMSQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9QRVIvUEVSX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9QRVIvUEVSX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OTU1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BFUi9QRVJfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSwxNzggQEAKKzE6UEU6UEVSOlBFUlU6SlVOSU46Q2hhbmNoYW1heW8KKzI6UEU6UEVSOlBFUlU6SlVOSU46Q29uY2VwY2lvbgorMzpQRTpQRVI6UEVSVTpKVU5JTjpIdWFuY2F5bworNDpQRTpQRVI6UEVSVTpKVU5JTjpKYXVqYQorNTpQRTpQRVI6UEVSVTpKVU5JTjpKdW5pbgorNjpQRTpQRVI6UEVSVTpKVU5JTjpTYXRpcG8KKzc6UEU6UEVSOlBFUlU6SlVOSU46VGFybWEKKzg6UEU6UEVSOlBFUlU6SlVOSU46WWF1bGkKKzE6UEU6UEVSOlBFUlU6QU1BWk9OQVM6QmFndWEKKzI6UEU6UEVSOlBFUlU6QU1BWk9OQVM6QmFndWEgR3JhbmRlCiszOlBFOlBFUjpQRVJVOkFNQVpPTkFTOkJvbmdhcmEKKzQ6UEU6UEVSOlBFUlU6QU1BWk9OQVM6Q2hhY2hhcG95YXMKKzU6UEU6UEVSOlBFUlU6QU1BWk9OQVM6Q29uZG9yY2FucXVpCis2OlBFOlBFUjpQRVJVOkFNQVpPTkFTOkx1eWEKKzc6UEU6UEVSOlBFUlU6QU1BWk9OQVM6Um9kcmlndWV6IGRlIE0uCisxOlBFOlBFUjpQRVJVOkNBSkFNQVJDQTpDYWphYmFtYmEKKzI6UEU6UEVSOlBFUlU6Q0FKQU1BUkNBOkNhamFtYXJjYQorMzpQRTpQRVI6UEVSVTpDQUpBTUFSQ0E6Q2VsZW5kaW4KKzQ6UEU6UEVSOlBFUlU6Q0FKQU1BUkNBOkNob3RhCis1OlBFOlBFUjpQRVJVOkNBSkFNQVJDQTpDb250dW1hemEKKzY6UEU6UEVSOlBFUlU6Q0FKQU1BUkNBOkN1dGVydm8KKzc6UEU6UEVSOlBFUlU6Q0FKQU1BUkNBOkh1YWxnYXlvYworODpQRTpQRVI6UEVSVTpDQUpBTUFSQ0E6SmFlbgorOTpQRTpQRVI6UEVSVTpDQUpBTUFSQ0E6U2FuIElnbmFjaW8KKzEwOlBFOlBFUjpQRVJVOkNBSkFNQVJDQTpTYW4gTWFyY29zCisxMTpQRTpQRVI6UEVSVTpDQUpBTUFSQ0E6U2FuIE1pZ3VlbAorMTI6UEU6UEVSOlBFUlU6Q0FKQU1BUkNBOlNhbiBQYWJsbworMTM6UEU6UEVSOlBFUlU6Q0FKQU1BUkNBOlNhbnRhIENydXoKKzE6UEU6UEVSOlBFUlU6UFVOTzpBbWFudGFuaQorMjpQRTpQRVI6UEVSVTpQVU5POkF6YW5nYXJvCiszOlBFOlBFUjpQRVJVOlBVTk86Q2FyYWJheWEKKzQ6UEU6UEVSOlBFUlU6UFVOTzpDaHVjdWl0bworNTpQRTpQRVI6UEVSVTpQVU5POkh1YW5jYW5lCis2OlBFOlBFUjpQRVJVOlBVTk86SXNsYSBTb3RvCis3OlBFOlBFUjpQRVJVOlBVTk86SXNsYSBUYXF1aWxlCis4OlBFOlBFUjpQRVJVOlBVTk86TGFnbyBUaXRpY2FjYQorOTpQRTpQRVI6UEVSVTpQVU5POkxhbXBhCisxMDpQRTpQRVI6UEVSVTpQVU5POk1lbGdhcgorMTE6UEU6UEVSOlBFUlU6UFVOTzpQdW5vCisxMjpQRTpQRVI6UEVSVTpQVU5POlB1bnRhIENoYWxsdXRhCisxMzpQRTpQRVI6UEVSVTpQVU5POlNhbiBSb21hbgorMTQ6UEU6UEVSOlBFUlU6UFVOTzpTYW5kaWEKKzE6UEU6UEVSOlBFUlU6UElVUkE6QXlhYmFjYQorMjpQRTpQRVI6UEVSVTpQSVVSQTpIdWFuY2FiYW1iYQorMzpQRTpQRVI6UEVSVTpQSVVSQTpJc2xhCis0OlBFOlBFUjpQRVJVOlBJVVJBOk1vcnJvcG9uCis1OlBFOlBFUjpQRVJVOlBJVVJBOlBhaXRhCis2OlBFOlBFUjpQRVJVOlBJVVJBOlBpdXJhCis3OlBFOlBFUjpQRVJVOlBJVVJBOlN1bGxhbmEKKzg6UEU6UEVSOlBFUlU6UElVUkE6VGFsYXJhCisxOlBFOlBFUjpQRVJVOkhVQU5DQVZFTElDQTpBY29iYW1iYQorMjpQRTpQRVI6UEVSVTpIVUFOQ0FWRUxJQ0E6QW5nYXJlcworMzpQRTpQRVI6UEVSVTpIVUFOQ0FWRUxJQ0E6Q2FzdHJvdmlycmV5bmEKKzQ6UEU6UEVSOlBFUlU6SFVBTkNBVkVMSUNBOkh1YW5jYXZlbGljYQorNTpQRTpQRVI6UEVSVTpIVUFOQ0FWRUxJQ0E6VGF5YWNhamEKKzE6UEU6UEVSOlBFUlU6QVlBQ1VDSE86Q2FuZ2FsbG8KKzI6UEU6UEVSOlBFUlU6QVlBQ1VDSE86SHVhbWFuZ2EKKzM6UEU6UEVSOlBFUlU6QVlBQ1VDSE86SHVhbnRhCis0OlBFOlBFUjpQRVJVOkFZQUNVQ0hPOkxhbWFyCis1OlBFOlBFUjpQRVJVOkFZQUNVQ0hPOkx1Y2FuYXMKKzY6UEU6UEVSOlBFUlU6QVlBQ1VDSE86UGFyYW5pY29jaGFzCis3OlBFOlBFUjpQRVJVOkFZQUNVQ0hPOlZpY3RvciBGYWphcmRvCis4OlBFOlBFUjpQRVJVOkFZQUNVQ0hPOm5uCisxOlBFOlBFUjpQRVJVOk1PUVVFR1VBOkdyYWwuU2FuY2hleiBDZXIKKzI6UEU6UEVSOlBFUlU6TU9RVUVHVUE6SWxvCiszOlBFOlBFUjpQRVJVOk1PUVVFR1VBOk1hcmlzY2FsIE5pZXRvCisxOlBFOlBFUjpQRVJVOkxPUkVUTzpBbHRvIEFtYXpvbmFzCisyOlBFOlBFUjpQRVJVOkxPUkVUTzpMb3JldG8KKzM6UEU6UEVSOlBFUlU6TE9SRVRPOk1hci5SLkNhc3RpbGxhCis0OlBFOlBFUjpQRVJVOkxPUkVUTzpNYXluYXMKKzU6UEU6UEVSOlBFUlU6TE9SRVRPOlJlcXVlbmEKKzY6UEU6UEVSOlBFUlU6TE9SRVRPOlVjYXlhbGkKKzE6UEU6UEVSOlBFUlU6UEFTQ086RGFuaWVsIENhcnJpb24KKzI6UEU6UEVSOlBFUlU6UEFTQ086T3hhcGFtcGEKKzM6UEU6UEVSOlBFUlU6UEFTQ086UGFzY28KKzE6UEU6UEVSOlBFUlU6TElNQTpDYWphdGFtYm8KKzI6UEU6UEVSOlBFUlU6TElNQTpDYW5ldGUKKzM6UEU6UEVSOlBFUlU6TElNQTpDYW50YQorNDpQRTpQRVI6UEVSVTpMSU1BOkNoYW5jYXkKKzU6UEU6UEVSOlBFUlU6TElNQTpIdWFyYWwKKzY6UEU6UEVSOlBFUlU6TElNQTpIdWFyb2NoaXJpCis3OlBFOlBFUjpQRVJVOkxJTUE6SXNsYQorODpQRTpQRVI6UEVSVTpMSU1BOkxpbWEKKzk6UEU6UEVSOlBFUlU6TElNQTpZYXV5b3MKKzE6UEU6UEVSOlBFUlU6VEFDTkE6VGFjbmEKKzI6UEU6UEVSOlBFUlU6VEFDTkE6VGFyYXRhCisxOlBFOlBFUjpQRVJVOlNBTiBNQVJUSU46QmVsbGF2aXN0YQorMjpQRTpQRVI6UEVSVTpTQU4gTUFSVElOOkh1YWxsYWd1YQorMzpQRTpQRVI6UEVSVTpTQU4gTUFSVElOOkxhbWFzCis0OlBFOlBFUjpQRVJVOlNBTiBNQVJUSU46TWFyaXNjYWwgQ2FjZXJlcworNTpQRTpQRVI6UEVSVTpTQU4gTUFSVElOOk1veW9iYW1iYQorNjpQRTpQRVI6UEVSVTpTQU4gTUFSVElOOlJpb2phCis3OlBFOlBFUjpQRVJVOlNBTiBNQVJUSU46U2FuIE1hcnRpbgorODpQRTpQRVI6UEVSVTpTQU4gTUFSVElOOm5uCisxOlBFOlBFUjpQRVJVOkFSRVFVSVBBOkFyZXF1aXBhCisyOlBFOlBFUjpQRVJVOkFSRVFVSVBBOkNhbWFuYQorMzpQRTpQRVI6UEVSVTpBUkVRVUlQQTpDYXJhdmVsaQorNDpQRTpQRVI6UEVSVTpBUkVRVUlQQTpDYXN0aWxsYQorNTpQRTpQRVI6UEVSVTpBUkVRVUlQQTpDYXlsbG9tYQorNjpQRTpQRVI6UEVSVTpBUkVRVUlQQTpDb25kZXN1eW9zCis3OlBFOlBFUjpQRVJVOkFSRVFVSVBBOklzbGF5Cis4OlBFOlBFUjpQRVJVOkFSRVFVSVBBOkxhIFVuaW9uCisxOlBFOlBFUjpQRVJVOlRVTUJFUzpDb250cmFsbWlyYW50ZSBWCisyOlBFOlBFUjpQRVJVOlRVTUJFUzpUdW1iZXMKKzM6UEU6UEVSOlBFUlU6VFVNQkVTOlphcnVtaWxsYQorMTpQRTpQRVI6UEVSVTpNQURSRSBERSBESU9TOk1hbnUKKzI6UEU6UEVSOlBFUlU6TUFEUkUgREUgRElPUzpUYWh1YW1hbnUKKzM6UEU6UEVSOlBFUlU6TUFEUkUgREUgRElPUzpUYW1ib3BhdGEKKzE6UEU6UEVSOlBFUlU6VUNBWUFMSTpBdGFsYXlhCisyOlBFOlBFUjpQRVJVOlVDQVlBTEk6Q29yb25lbCBQb3J0aWxsbworMzpQRTpQRVI6UEVSVTpVQ0FZQUxJOlBhZHJlIEFiYWQKKzQ6UEU6UEVSOlBFUlU6VUNBWUFMSTpQdXJ1cworMTpQRTpQRVI6UEVSVTpDVVpDTzpBY29tYXlvCisyOlBFOlBFUjpQRVJVOkNVWkNPOkFudGEKKzM6UEU6UEVSOlBFUlU6Q1VaQ086Q2FsY2EKKzQ6UEU6UEVSOlBFUlU6Q1VaQ086Q2FuYXMKKzU6UEU6UEVSOlBFUlU6Q1VaQ086Q2FuY2hpcworNjpQRTpQRVI6UEVSVTpDVVpDTzpDaHVtYml2aWxjYXMKKzc6UEU6UEVSOlBFUlU6Q1VaQ086RXNwaW5hcgorODpQRTpQRVI6UEVSVTpDVVpDTzpMYSBDb252ZW5jaW9uCis5OlBFOlBFUjpQRVJVOkNVWkNPOlBhcnVybworMTA6UEU6UEVSOlBFUlU6Q1VaQ086UGF1Y2FydGFtYm8KKzExOlBFOlBFUjpQRVJVOkNVWkNPOlF1aXNwaWNhbmNoaXMKKzEyOlBFOlBFUjpQRVJVOkNVWkNPOlVydWJhbWJhCisxMzpQRTpQRVI6UEVSVTpDVVpDTzpubgorMTpQRTpQRVI6UEVSVTpIVUFOVUNPOkFtYm8KKzI6UEU6UEVSOlBFUlU6SFVBTlVDTzpEb3MgZGUgTWF5bworMzpQRTpQRVI6UEVSVTpIVUFOVUNPOkh1YW1hbGllcworNDpQRTpQRVI6UEVSVTpIVUFOVUNPOkh1YW51Y28KKzU6UEU6UEVSOlBFUlU6SFVBTlVDTzpMZW9uY2lvIFByYWRvCis2OlBFOlBFUjpQRVJVOkhVQU5VQ086TWFyYW5vbgorNzpQRTpQRVI6UEVSVTpIVUFOVUNPOlBhY2hpdGVhCis4OlBFOlBFUjpQRVJVOkhVQU5VQ086bm4KKzE6UEU6UEVSOlBFUlU6SUNBOkNoaW5jaGEKKzI6UEU6UEVSOlBFUlU6SUNBOkljYQorMzpQRTpQRVI6UEVSVTpJQ0E6SXNsYQorNDpQRTpQRVI6UEVSVTpJQ0E6TmF6Y2EKKzU6UEU6UEVSOlBFUlU6SUNBOlBhbHBhCis2OlBFOlBFUjpQRVJVOklDQTpQaXNjbworMTpQRTpQRVI6UEVSVTpMQSBMSUJFUlRBRDpCb2xpdmFyCisyOlBFOlBFUjpQRVJVOkxBIExJQkVSVEFEOklzbGEKKzM6UEU6UEVSOlBFUlU6TEEgTElCRVJUQUQ6T3R1emNvCis0OlBFOlBFUjpQRVJVOkxBIExJQkVSVEFEOlBhY2FzbWF5bworNTpQRTpQRVI6UEVSVTpMQSBMSUJFUlRBRDpQYXRhegorNjpQRTpQRVI6UEVSVTpMQSBMSUJFUlRBRDpTYW5jaGV6IENhcnJpb24KKzc6UEU6UEVSOlBFUlU6TEEgTElCRVJUQUQ6U2FudC5kZSBDaHVjbworODpQRTpQRVI6UEVSVTpMQSBMSUJFUlRBRDpUcnVqaWxsbworOTpQRTpQRVI6UEVSVTpMQSBMSUJFUlRBRDpubgorMTpQRTpQRVI6UEVSVTpMQU1CQVlFUVVFOkNoaWNsYXlvCisyOlBFOlBFUjpQRVJVOkxBTUJBWUVRVUU6RmVycmVuYXRlCiszOlBFOlBFUjpQRVJVOkxBTUJBWUVRVUU6SXNsYQorNDpQRTpQRVI6UEVSVTpMQU1CQVlFUVVFOkxhbWJheWVxdWUKKzE6UEU6UEVSOlBFUlU6QVBVUklNQUM6QWJhbmNheQorMjpQRTpQRVI6UEVSVTpBUFVSSU1BQzpBbmRhaHVheWxhcworMzpQRTpQRVI6UEVSVTpBUFVSSU1BQzpBbnRhYmFtYmEKKzQ6UEU6UEVSOlBFUlU6QVBVUklNQUM6QXltYXJhZXMKKzU6UEU6UEVSOlBFUlU6QVBVUklNQUM6Q2hpbmNoZXJvcworNjpQRTpQRVI6UEVSVTpBUFVSSU1BQzpDb3RhYmFtYmFzCis3OlBFOlBFUjpQRVJVOkFQVVJJTUFDOkdyYXUKKzE6UEU6UEVSOlBFUlU6QU5DQVNIOkFpamEKKzI6UEU6UEVSOlBFUlU6QU5DQVNIOkJvbG9nbmVzaQorMzpQRTpQRVI6UEVSVTpBTkNBU0g6Q2FyaHVhegorNDpQRTpQRVI6UEVSVTpBTkNBU0g6Q2FzbWEKKzU6UEU6UEVSOlBFUlU6QU5DQVNIOkNoYWNhcworNjpQRTpQRVI6UEVSVTpBTkNBU0g6Q29yb25nbworNzpQRTpQRVI6UEVSVTpBTkNBU0g6SHVhcmF6Cis4OlBFOlBFUjpQRVJVOkFOQ0FTSDpIdWFyaQorOTpQRTpQRVI6UEVSVTpBTkNBU0g6SHVheWxhcworMTA6UEU6UEVSOlBFUlU6QU5DQVNIOklzbGEKKzExOlBFOlBFUjpQRVJVOkFOQ0FTSDpMdXp1cmlhZ2EKKzEyOlBFOlBFUjpQRVJVOkFOQ0FTSDpQYWxsYXNjYQorMTM6UEU6UEVSOlBFUlU6QU5DQVNIOlBvbWFiYW1iYQorMTQ6UEU6UEVSOlBFUlU6QU5DQVNIOlJlY3VheQorMTU6UEU6UEVSOlBFUlU6QU5DQVNIOlNhbiBBbnQuUmFpbW9uZGkKKzE2OlBFOlBFUjpQRVJVOkFOQ0FTSDpTYW4gTHVpcworMTc6UEU6UEVSOlBFUlU6QU5DQVNIOlNhbnRhCisxODpQRTpQRVI6UEVSVTpBTkNBU0g6U2lodWFzCisxOTpQRTpQRVI6UEVSVTpBTkNBU0g6WXVuY2F5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BITC9QSExfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BITC9QSExfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0ZTJiNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUEhML1BITF9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDkzIEBACisxOlBILUFCUjpQSDpBQlJBCisyOlBILUFHTjpQSDpBR1VTQU4gREVMIE5PUlRFCiszOlBILUFHUzpQSDpBR1VTQU4gREVMIFNVUgorNDpQSC1BS0w6UEg6QUtMQU4KKzU6UEgtQUxCOlBIOkFMQkFZCis2OlBILUFOVDpQSDpBTlRJUVVFCis3OlBILUFQQTpQSDpBUEFZQU8KKzg6UEgtQVVSOlBIOkFVUk9SQQorOTpQSC1CQVM6UEg6QkFTSUxBTgorMTA6UEgtQkFOOlBIOkJBVEFBTgorMTE6UEgtQlROOlBIOkJBVEFORVMKKzEyOlBILUJURzpQSDpCQVRBTkdBUworMTM6UEgtQkVOOlBIOkJFTkdVRVQKKzE0OlBILUJJTDpQSDpCSUxJUkFOCisxNTpQSC1CT0g6UEg6Qk9IT0wKKzE2OlBILUJVSzpQSDpCVUtJRE5PTgorMTc6UEgtQlVMOlBIOkJVTEFDQU4KKzE4OlBILUNBRzpQSDpDQUdBWUFOCisxOTpQSC1DQU46UEg6Q0FNQVJJTkVTIE5PUlRFCisyMDpQSC1DQVM6UEg6Q0FNQVJJTkVTIFNVUgorMjE6UEgtQ0FNOlBIOkNBTUlHVUlOCisyMjpQSC1DQVA6UEg6Q0FQSVoKKzIzOlBILUNBUjpQSDpDQVIKKzI0OlBILUNBVDpQSDpDQVRBTkRVQU5FUworMjU6UEgtQ0FWOlBIOkNBVklURQorMjY6UEgtQ0VCOlBIOkNFQlUKKzI3OlBILUNPTTpQSDpDT01QT1NURUxBIFZBTExFWQorMjg6UEgtREFWOlBIOkRBVkFPIERFTCBOT1JURQorMjk6UEgtREFTOlBIOkRBVkFPIERFTCBTVVIKKzMwOlBILURBTzpQSDpEQVZBTyBPUklFTlRBTAorMzE6UEgtRUFTOlBIOkVBU1RFUk4gU0FNQVIKKzMyOlBILUdVSTpQSDpHVUlNQVJBUworMzM6UEgtSUZVOlBIOklGVUdBTworMzQ6UEgtSUxOOlBIOklMT0NPUyBOT1JURQorMzU6UEgtSUxTOlBIOklMT0NPUyBTVVIKKzM2OlBILUlMSTpQSDpJTE9JTE8KKzM3OlBILUlTQTpQSDpJU0FCRUxBCiszODpQSC1LQUw6UEg6S0FMSU5HQQorMzk6UEgtTFVOOlBIOkxBIFVOSU9OCis0MDpQSC1MQUc6UEg6TEFHVU5BCis0MTpQSC1MQU46UEg6TEFOQU8gREVMIE5PUlRFCis0MjpQSC1MQVM6UEg6TEFOQU8gREVMIFNVUgorNDM6UEgtTEVZOlBIOkxFWVRFCis0NDpQSC1NQUc6UEg6TUFHVUlOREFOQU8KKzQ1OlBILU1BRDpQSDpNQVJJTkRVUVVFCis0NjpQSC1NQVM6UEg6TUFTQkFURQorNDc6UEgtTURDOlBIOk1JTkRPUk8gT0NDSURFTlRBTAorNDg6UEgtTURSOlBIOk1JTkRPUk8gT1JJRU5UQUwKKzQ5OlBILU1TQzpQSDpNSVNBTUlTIE9DQ0lERU5UQUwKKzUwOlBILU1TUjpQSDpNSVNBTUlTIE9SSUVOVEFMCis1MTpQSC1NT1U6UEg6TU9VTlRBSU4gUFJPVklOQ0UKKzUyOlBILU5DUjpQSDpOQ1IKKzUzOlBILU5FQzpQSDpORUdST1MgT0NDSURFTlRBTAorNTQ6UEgtTkVSOlBIOk5FR1JPUyBPUklFTlRBTAorNTU6UEgtTkNPOlBIOk5PUlRIIENPVEFCQVRPCis1NjpQSC1OU0E6UEg6Tk9SVEhFUk4gU0FNQVIKKzU3OlBILU5VRTpQSDpOVUVWQSBFQ0lKQQorNTg6UEgtTlVWOlBIOk5VRVZBIFZJWkNBWUEKKzU5OlBILVBMVzpQSDpQQUxBV0FOCis2MDpQSC1QQU06UEg6UEFNUEFOR0EKKzYxOlBILVBBTjpQSDpQQU5HQVNJTkFOCis2MjpQSC1RVUU6UEg6UVVFWk9OCis2MzpQSC1RVUk6UEg6UVVJUklOTworNjQ6UEgtMTpQSDpSRUdJT04gMQorNjU6UEgtMTA6UEg6UkVHSU9OIDEwCis2NjpQSC0xMTpQSDpSRUdJT04gMTEKKzY3OlBILTEyOlBIOlJFR0lPTiAxMgorNjg6UEgtMjpQSDpSRUdJT04gMgorNjk6UEgtMzpQSDpSRUdJT04gMworNzA6UEgtNDpQSDpSRUdJT04gNAorNzE6UEgtNTpQSDpSRUdJT04gNQorNzI6UEgtNjpQSDpSRUdJT04gNgorNzM6UEgtNzpQSDpSRUdJT04gNworNzQ6UEgtODpQSDpSRUdJT04gOAorNzU6UEgtOTpQSDpSRUdJT04gOQorNzY6UEgtUklaOlBIOlJJWkFMCis3NzpQSC1ST006UEg6Uk9NQkxPTgorNzg6UEgtU0FSOlBIOlNBUkFOR0FOSQorNzk6UEgtU0lHOlBIOlNJUVVJSk9SCis4MDpQSC1TT1I6UEg6U09SU09HT04KKzgxOlBILVNDTzpQSDpTT1VUSCBDT1RBQkFUTworODI6UEgtU0xFOlBIOlNPVVRIRVJOIExFWVRFCis4MzpQSC1TVUs6UEg6U1VMVEFOIEtVREFSQVQKKzg0OlBILVNMVTpQSDpTVUxVCis4NTpQSC1TVU46UEg6U1VSSUdBTyBERUwgTk9SVEUKKzg2OlBILVNVUjpQSDpTVVJJR0FPIERFTCBTVVIKKzg3OlBILVRBUjpQSDpUQVJMQUMKKzg4OlBILVRBVzpQSDpUQVdJIFRBV0kKKzg5OlBILVdTQTpQSDpXRVNURVJOIFNBTUFSCis5MDpQSC1aTUI6UEg6WkFNQkFMRVMKKzkxOlBILVpBTjpQSDpaQU1CT0FOR0EgREVMIE5PUlRFCis5MjpQSC1aQVM6UEg6WkFNQk9BTkdBIERFTCBTVVIKKzkzOlBILVpTSTpQSDpaQU1CT0FOR0EgU0lCVUdVRVkgW1pBTUJPQU5HQSBTSUJVR0FZXQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9QSEwvUEhMX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9QSEwvUEhMX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMTA0YzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BITC9QSExfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSw3NCBAQAorMTpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDM6QmF0YWFuCisyOlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gMzpCdWxhY2FuCiszOlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gMzpOdWV2YSBFY2lqYQorNDpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDM6UGFtcGFuZ2EKKzU6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiAzOlRhcmxhYworNjpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDM6WmFtYmFsZXMKKzE6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiA2OkFrbGFuCisyOlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gNjpBbnRpcXVlCiszOlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gNjpDYXBpegorNDpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDY6SWxvaWxvCis1OlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gNjpOZWdyb3MgT2NjaWRlbnRhbAorMTpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDExOkRhdmFvIERlbCBOb3J0ZQorMjpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDExOkRhdmFvIERlbCBTdXIKKzM6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiAxMTpEYXZhbyBPcmllbnRhbAorNDpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDExOlNvdXRoIENvdGFiYXRvCis1OlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gMTE6U3VyaWdhbyBEZWwgU3VyCisxOlBIOlBITDpQSElMSVBQSU5FUzpOQ1I6TWFuaWxhCisxOlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gMTpJbG9jb3MgTm9ydGUKKzI6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiAxOklsb2NvcyBTdXIKKzM6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiAxOkxhIFVuaW9uCis0OlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gMTpQYW5nYXNpbmFuCisxOlBIOlBITDpQSElMSVBQSU5FUzpDQVI6QWJyYQorMjpQSDpQSEw6UEhJTElQUElORVM6Q0FSOkJlbmd1ZXQKKzM6UEg6UEhMOlBISUxJUFBJTkVTOkNBUjpJZnVnYW8KKzQ6UEg6UEhMOlBISUxJUFBJTkVTOkNBUjpLYWxpbmdhLUFwYXlhbworNTpQSDpQSEw6UEhJTElQUElORVM6Q0FSOk1vdW50YWluCisxOlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gMTA6QWd1c2FuIERlbCBOb3J0ZQorMjpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDEwOkFndXNhbiBEZWwgU3VyCiszOlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gMTA6QnVraWRub24KKzQ6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiAxMDpDYW1pZ3VpbgorNTpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDEwOk1pc2FtaXMgT2NjaWRlbnRhbAorNjpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDEwOk1pc2FtaXMgT3JpZW50YWwKKzc6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiAxMDpTdXJpZ2FvIERlbCBOb3J0ZQorMTpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDU6QWxiYXkKKzI6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiA1OkNhbWFyaW5lcyBOb3J0ZQorMzpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDU6Q2FtYXJpbmVzIFN1cgorNDpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDU6Q2F0YW5kdWFuZXMKKzU6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiA1Ok1hc2JhdGUKKzY6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiA1OlNvcnNvZ29uCisxOlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gODpFYXN0ZXJuIFNhbWFyCisyOlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gODpMZXl0ZQorMzpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDg6Tm9ydGhlcm4gU2FtYXIKKzQ6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiA4OlNvdXRoZXJuIExleXRlCis1OlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gODpXZXN0ZXJuIFNhbWFyCisxOlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gOTpCYXNpbGFuCisyOlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gOTpTdWx1CiszOlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gOTpUYXdpLVRhd2kKKzQ6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiA5OlphbWJvYW5nYSBEZWwgTm9ydGUKKzU6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiA5OlphbWJvYW5nYSBEZWwgU3VyCisxOlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gNzpCb2hvbAorMjpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDc6Q2VidQorMzpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDc6TmVncm9zIE9yaWVudGFsCis0OlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gNzpTaXF1aWpvcgorMTpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDI6QmF0YW5lcworMjpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDI6Q2FnYXlhbgorMzpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDI6SXNhYmVsYQorNDpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDI6TnVldmEgVml6Y2F5YQorNTpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDI6UXVpcmlubworMTpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDEyOkxhbmFvIERlbCBOb3J0ZQorMjpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDEyOkxhbmFvIERlbCBTdXIKKzM6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiAxMjpNYWd1aW5kYW5hbworNDpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDEyOk5vcnRoIENvdGFiYXRvCis1OlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gMTI6U3VsdGFuIEt1ZGFyYXQKKzE6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiA0OkF1cm9yYQorMjpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDQ6QmF0YW5nYXMKKzM6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiA0OkNhdml0ZQorNDpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDQ6TGFndW5hCis1OlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gNDpNYXJpbmR1cXVlCis2OlBIOlBITDpQSElMSVBQSU5FUzpSZWdpb24gNDpPY2NpZGVudGFsIE1pbmRvcm8KKzc6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiA0Ok9yaWVudGFsIE1pbmRvcm8KKzg6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiA0OlBhbGF3YW4KKzk6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiA0OlF1ZXpvbgorMTA6UEg6UEhMOlBISUxJUFBJTkVTOlJlZ2lvbiA0OlJpemFsCisxMTpQSDpQSEw6UEhJTElQUElORVM6UmVnaW9uIDQ6Um9tYmxvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9QTkcvUE5HX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9QTkcvUE5HX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOGNjMjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BORy9QTkdfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwyMCBAQAorMTpQRy1DUE06UEc6Q0VOVFJBTAorMjpQRy1DUEs6UEc6Q0hJTUJVCiszOlBHLUVCUjpQRzpFQVNUIE5FVyBCUklUQUlOCis0OlBHLUVTVzpQRzpFQVNUIFNFUElLCis1OlBHLUVIRzpQRzpFQVNURVJOIEhJR0hMQU5EUworNjpQRy1FUFc6UEc6RU5HQQorNzpQRy1HUEs6UEc6R1VMRgorODpQRy1NUE06UEc6TUFEQU5HCis5OlBHLU1STDpQRzpNQU5VUworMTA6UEctTUJBOlBHOk1JTE5FIEJBWQorMTE6UEctTVBMOlBHOk1PUk9CRQorMTI6UEctTkNEOlBHOk5BVElPTkFMIENBUElUQUwgRElTVFJJQ1QgKFBPUlQgTU9SRVNCWSkKKzEzOlBHLU5JSzpQRzpORVcgSVJFTEFORAorMTQ6UEctTlNBOlBHOk5PUlRIIFNPTE9NT05TCisxNTpQRy1OUFA6UEc6Tk9SVEhFUk4KKzE2OlBHLVNBTjpQRzpTQU5EQVVOIFtXRVNUIFNFUElLXQorMTc6UEctU0hNOlBHOlNPVVRIRVJOIEhJR0hMQU5EUworMTg6UEctV0JLOlBHOldFU1QgTkVXIEJSSVRBSU4KKzE5OlBHLVdQRDpQRzpXRVNURVJOCisyMDpQRy1XSE06UEc6V0VTVEVSTiBISUdITEFORFMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUE5HL1BOR19BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUE5HL1BOR19BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTdkNTcwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9QTkcvUE5HX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsNDAyIEBACisxOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjEKKzI6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTAKKzM6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTAwCis0OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjEwMQorNTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xMDIKKzY6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTAzCis3OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjEwNAorODpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xMDUKKzk6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTA2CisxMDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xMDcKKzExOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjEwOAorMTI6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTA5CisxMzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xMQorMTQ6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTEwCisxNTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xMTEKKzE2OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjExMgorMTc6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTEzCisxODpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xMTQKKzE5OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjExNQorMjA6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTE2CisyMTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xMTcKKzIyOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjExOAorMjM6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTE5CisyNDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xMgorMjU6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTIwCisyNjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xMjEKKzI3OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjEyMgorMjg6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTIzCisyOTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xMjQKKzMwOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjEyNQorMzE6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTI2CiszMjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xMjcKKzMzOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjEyOAorMzQ6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTI5CiszNTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xMworMzY6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTMwCiszNzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xMzEKKzM4OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjEzMgorMzk6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTMzCis0MDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xMzQKKzQxOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjEzNQorNDI6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTM2Cis0MzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xMzcKKzQ0OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjEzOAorNDU6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTM5Cis0NjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xNAorNDc6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTQwCis0ODpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xNDEKKzQ5OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjE0MgorNTA6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTQzCis1MTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xNDQKKzUyOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjE0NQorNTM6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTQ2Cis1NDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xNDcKKzU1OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjE0OAorNTY6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTQ5Cis1NzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xNQorNTg6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTUwCis1OTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xNTEKKzYwOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjE1MgorNjE6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTUzCis2MjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xNTQKKzYzOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjE1NQorNjQ6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTU2Cis2NTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xNTcKKzY2OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjE1OAorNjc6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTU5Cis2ODpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xNgorNjk6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTYwCis3MDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xNjEKKzcxOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjE2MgorNzI6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTYzCis3MzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xNjQKKzc0OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjE2NQorNzU6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTY2Cis3NjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xNjcKKzc3OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjE2OAorNzg6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTY5Cis3OTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xNworODA6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTcwCis4MTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xNzEKKzgyOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjE3MgorODM6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTczCis4NDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xNzQKKzg1OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjE3NQorODY6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTc2Cis4NzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xNzcKKzg4OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjE3OAorODk6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTc5Cis5MDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xOAorOTE6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTgwCis5MjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xODEKKzkzOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjE4MgorOTQ6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTgzCis5NTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xODQKKzk2OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjE4NQorOTc6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTg2Cis5ODpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4xODcKKzk5OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjE4OAorMTAwOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjE4OQorMTAxOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjE5CisxMDI6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTkwCisxMDM6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTkxCisxMDQ6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTkyCisxMDU6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTkzCisxMDY6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTk0CisxMDc6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTk1CisxMDg6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTk2CisxMDk6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTk3CisxMTA6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTk4CisxMTE6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMTk5CisxMTI6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMgorMTEzOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjIwCisxMTQ6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjAwCisxMTU6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjAxCisxMTY6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjAyCisxMTc6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjAzCisxMTg6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjA0CisxMTk6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjA1CisxMjA6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjA2CisxMjE6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjA3CisxMjI6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjA4CisxMjM6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjA5CisxMjQ6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjEKKzEyNTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yMTAKKzEyNjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yMTEKKzEyNzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yMTIKKzEyODpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yMTMKKzEyOTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yMTQKKzEzMDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yMTUKKzEzMTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yMTYKKzEzMjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yMTcKKzEzMzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yMTgKKzEzNDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yMTkKKzEzNTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yMgorMTM2OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjIyMAorMTM3OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjIyMQorMTM4OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjIyMgorMTM5OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjIyMworMTQwOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjIyNAorMTQxOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjIyNQorMTQyOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjIyNgorMTQzOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjIyNworMTQ0OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjIyOAorMTQ1OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjIyOQorMTQ2OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjIzCisxNDc6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjMwCisxNDg6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjMxCisxNDk6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjMyCisxNTA6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjMzCisxNTE6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjM0CisxNTI6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjM1CisxNTM6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjM2CisxNTQ6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjM3CisxNTU6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjM4CisxNTY6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjM5CisxNTc6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjQKKzE1ODpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNDAKKzE1OTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNDEKKzE2MDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNDIKKzE2MTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNDMKKzE2MjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNDQKKzE2MzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNDUKKzE2NDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNDYKKzE2NTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNDcKKzE2NjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNDgKKzE2NzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNDkKKzE2ODpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNQorMTY5OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI1MAorMTcwOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI1MQorMTcxOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI1MgorMTcyOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI1MworMTczOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI1NAorMTc0OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI1NQorMTc1OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI1NgorMTc2OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI1NworMTc3OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI1OAorMTc4OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI1OQorMTc5OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI2CisxODA6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjYwCisxODE6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjYxCisxODI6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjYyCisxODM6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjYzCisxODQ6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjY0CisxODU6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjY1CisxODY6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjY2CisxODc6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjY3CisxODg6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjY4CisxODk6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjY5CisxOTA6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjcKKzE5MTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNzAKKzE5MjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNzEKKzE5MzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNzIKKzE5NDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNzMKKzE5NTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNzQKKzE5NjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNzUKKzE5NzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNzYKKzE5ODpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNzcKKzE5OTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNzgKKzIwMDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yNzkKKzIwMTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4yOAorMjAyOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI4MAorMjAzOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI4MQorMjA0OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI4MgorMjA1OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI4MworMjA2OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI4NAorMjA3OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI4NQorMjA4OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI4NgorMjA5OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI4NworMjEwOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI4OAorMjExOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI4OQorMjEyOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjI5CisyMTM6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjkwCisyMTQ6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjkxCisyMTU6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjkyCisyMTY6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjkzCisyMTc6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjk0CisyMTg6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjk1CisyMTk6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjk2CisyMjA6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjk3CisyMjE6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjk4CisyMjI6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMjk5CisyMjM6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMworMjI0OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjMwCisyMjU6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzAwCisyMjY6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzAxCisyMjc6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzAyCisyMjg6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzAzCisyMjk6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzA0CisyMzA6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzA1CisyMzE6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzA2CisyMzI6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzA3CisyMzM6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzA4CisyMzQ6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzA5CisyMzU6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzEKKzIzNjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zMTAKKzIzNzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zMTEKKzIzODpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zMTIKKzIzOTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zMTMKKzI0MDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zMTQKKzI0MTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zMTUKKzI0MjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zMTYKKzI0MzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zMTcKKzI0NDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zMTgKKzI0NTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zMTkKKzI0NjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zMgorMjQ3OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjMyMAorMjQ4OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjMyMQorMjQ5OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjMyMgorMjUwOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjMyMworMjUxOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjMyNAorMjUyOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjMyNQorMjUzOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjMyNgorMjU0OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjMyNworMjU1OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjMyOAorMjU2OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjMyOQorMjU3OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjMzCisyNTg6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzMwCisyNTk6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzMxCisyNjA6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzMyCisyNjE6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzMzCisyNjI6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzM0CisyNjM6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzM1CisyNjQ6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzM2CisyNjU6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzM3CisyNjY6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzM4CisyNjc6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzM5CisyNjg6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzQKKzI2OTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNDAKKzI3MDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNDEKKzI3MTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNDIKKzI3MjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNDMKKzI3MzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNDQKKzI3NDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNDUKKzI3NTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNDYKKzI3NjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNDcKKzI3NzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNDgKKzI3ODpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNDkKKzI3OTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNQorMjgwOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM1MAorMjgxOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM1MQorMjgyOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM1MgorMjgzOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM1MworMjg0OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM1NAorMjg1OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM1NQorMjg2OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM1NgorMjg3OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM1NworMjg4OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM1OAorMjg5OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM1OQorMjkwOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM2CisyOTE6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzYwCisyOTI6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzYxCisyOTM6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzYyCisyOTQ6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzYzCisyOTU6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzY0CisyOTY6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzY1CisyOTc6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzY2CisyOTg6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzY3CisyOTk6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzY4CiszMDA6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzY5CiszMDE6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzcKKzMwMjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNzAKKzMwMzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNzEKKzMwNDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNzIKKzMwNTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNzMKKzMwNjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNzQKKzMwNzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNzUKKzMwODpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNzYKKzMwOTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNzcKKzMxMDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNzgKKzMxMTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zNzkKKzMxMjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi4zOAorMzEzOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM4MAorMzE0OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM4MQorMzE1OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM4MgorMzE2OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM4MworMzE3OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM4NAorMzE4OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM4NQorMzE5OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM4NgorMzIwOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM4NworMzIxOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM4OAorMzIyOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM4OQorMzIzOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjM5CiszMjQ6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzkwCiszMjU6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzkxCiszMjY6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzkyCiszMjc6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzkzCiszMjg6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzk0CiszMjk6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzk1CiszMzA6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzk2CiszMzE6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzk3CiszMzI6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzk4CiszMzM6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuMzk5CiszMzQ6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNAorMzM1OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjQwCiszMzY6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNDAwCiszMzc6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNDAxCiszMzg6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNDAyCiszMzk6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNDEKKzM0MDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi40MgorMzQxOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjQzCiszNDI6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNDQKKzM0MzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi40NQorMzQ0OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjQ2CiszNDU6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNDcKKzM0NjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi40OAorMzQ3OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjQ5CiszNDg6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNQorMzQ5OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjUwCiszNTA6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNTEKKzM1MTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi41MgorMzUyOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjUzCiszNTM6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNTQKKzM1NDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi41NQorMzU1OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjU2CiszNTY6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNTcKKzM1NzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi41OAorMzU4OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjU5CiszNTk6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNgorMzYwOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjYwCiszNjE6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNjEKKzM2MjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi42MgorMzYzOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjYzCiszNjQ6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNjQKKzM2NTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi42NQorMzY2OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjY2CiszNjc6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNjcKKzM2ODpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi42OAorMzY5OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjY5CiszNzA6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNworMzcxOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjcwCiszNzI6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNzEKKzM3MzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi43MgorMzc0OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjczCiszNzU6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNzQKKzM3NjpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi43NQorMzc3OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjc2CiszNzg6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuNzcKKzM3OTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi43OAorMzgwOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjc5CiszODE6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuOAorMzgyOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjgwCiszODM6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuODEKKzM4NDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi44MgorMzg1OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjgzCiszODY6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuODQKKzM4NzpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi44NQorMzg4OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjg2CiszODk6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuODcKKzM5MDpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi44OAorMzkxOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjg5CiszOTI6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuOQorMzkzOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjkwCiszOTQ6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuOTEKKzM5NTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi45MgorMzk2OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjkzCiszOTc6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuOTQKKzM5ODpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi45NQorMzk5OlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjk2Cis0MDA6UEc6UE5HOlBBUFVBIE5FVyBHVUlORUE6Ti5BLjpQTkcuTDIuOTcKKzQwMTpQRzpQTkc6UEFQVUEgTkVXIEdVSU5FQTpOLkEuOlBORy5MMi45OAorNDAyOlBHOlBORzpQQVBVQSBORVcgR1VJTkVBOk4uQS46UE5HLkwyLjk5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BPTC9QT0xfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BPTC9QT0xfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4Mjc1NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUE9ML1BPTF9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDYwIEBACisxOlBMLUJQOlBMOkJJQUxBIFBPRExBU0tBCisyOlBMLUJJOlBMOkJJQUxZU1RPSworMzpQTC1CQjpQTDpCSUVMU0tPIEJJQUxBCis0OlBMLUJZOlBMOkJZREdPU1pDWgorNTpQTC1DSDpQTDpDSEVMTQorNjpQTC1DRTpQTDpDSUVDSEFOT1cKKzc6UEwtQ1o6UEw6Q1pFU1RPQ0hPV0EKKzg6UEwtRFM6UEw6RE9MTk9FTFNLSUUKKzk6UEwtRUw6UEw6RUxCTEFHCisxMDpQTC1TTDpQTDpFTFNLSUUKKzExOlBMLUdEOlBMOkdEQU5TSworMTI6UEwtR086UEw6R09SWk9XCisxMzpQTC1KRTpQTDpKRUxFTklBIEdPUkEKKzE0OlBMLUtBOlBMOktBTElTWgorMTU6UEwtS1Q6UEw6S0FUT1dJQ0UKKzE2OlBMLUtMOlBMOktJRUxDRQorMTc6UEwtS086UEw6S09TWkFMSU4KKzE4OlBMLUtXOlBMOktSQUtPVworMTk6UEwtS1I6UEw6S1JPU05PCisyMDpQTC1LUDpQTDpLVUpBV1NLTyBQT01PUlNLSUUKKzIxOlBMLUxHOlBMOkxFR05JQ0EKKzIyOlBMLUxFOlBMOkxFU1pOTworMjM6UEwtTEQ6UEw6TE9EWgorMjQ6UEwtTE86UEw6TE9NWkEKKzI1OlBMLUxVOlBMOkxVQkVMU0tJRQorMjY6UEwtTEw6UEw6TFVCTElOCisyNzpQTC1MQjpQTDpMVUJVU0tJRQorMjg6UEwtTVo6UEw6TUFaT1dJRUNLSUUKKzI5OlBMLU1BOlBMOk1Bs09QT0xTS0lFCiszMDpQTC1OUzpQTDpOT1dZIFNBQ1oKKzMxOlBMLU9MOlBMOk9MU1pUWU4KKzMyOlBMLU9QOlBMOk9QT0xFCiszMzpQTC1PUzpQTDpPU1RST0xFS0EKKzM0OlBMLVBJOlBMOlBJTEEKKzM1OlBMLVBPOlBMOlBJT1RSS09XCiszNjpQTC1QSzpQTDpQT0RLQVJQQUNLSUUKKzM3OlBMLVBEOlBMOlBPRExBU0tJRQorMzg6UEwtUE06UEw6UE9NT1JTS0lFCiszOTpQTC1QWjpQTDpQT1pOQU4KKzQwOlBMLVBSOlBMOlBSWkVNWVNMCis0MTpQTC1SQTpQTDpSQURPTQorNDI6UEwtUlo6UEw6UlpFU1pPVworNDM6UEwtU0k6UEw6U0lFRExDRQorNDQ6UEwtU1I6UEw6U0lFUkFEWgorNDU6UEwtU0s6UEw6U0tJRVJOSUVXSUNFCis0NjpQTC1TUDpQTDpTTFVQU0sKKzQ3OlBMLVNVOlBMOlNVV0FMU0tJCis0ODpQTC1DSTpQTDpTWkNaRUNJTgorNDk6UEwtVEE6UEw6VEFSTk9CUlpFRworNTA6UEwtVFc6UEw6VEFSTk9XCis1MTpQTC1UTzpQTDpUT1JVTgorNTI6UEwtV1k6UEw6V0FMQlJaWUNICis1MzpQTC1XTjpQTDpXQVJNSVNLTyBNQVpVUlNLSUUKKzU0OlBMLVdBOlBMOldBUlNaQVdBCis1NTpQTC1XUDpQTDpXSUVMS09QT0xTS0lFCis1NjpQTC1XTzpQTDpXTE9DTEFXRUsKKzU3OlBMLVdSOlBMOldST0NMQVcKKzU4OlBMLVpQOlBMOlpBQ0hPRE5JT1BPTU9SU0tJRQorNTk6UEwtWk06UEw6WkFNT1NDCis2MDpQTC1aRTpQTDpaSUVMT05BIEdPUkEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUE9ML1BPTF9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUE9ML1BPTF9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9QT0wvUE9MX0FETUlOMl9MRVgudHh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BSSS9QUklfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BSSS9QUklfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhYTVkZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUFJJL1BSSV9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDc5IEBACisxOlBSLTcyMDAxOlBSOkFESlVOVEFTCisyOlBSLTcyMDAzOlBSOkFHVUFEQQorMzpQUi03MjAwNTpQUjpBR1VBRElMTEEKKzQ6UFItNzIwMDc6UFI6QUdVQVMgQlVFTkFTCis1OlBSLTcyMDA5OlBSOkFJQk9OSVRPCis2OlBSLTcyMDEzOlBSOkFSRUNJQk8KKzc6UFItNzIwMTU6UFI6QVJST1lPCis4OlBSLTcyMDExOlBSOkHRQVNDTworOTpQUi03MjAxNzpQUjpCQVJDRUxPTkVUQQorMTA6UFItNzIwMTk6UFI6QkFSUkFOUVVJVEFTCisxMTpQUi03MjAyMTpQUjpCQVlBTdNOCisxMjpQUi03MjAyMzpQUjpDQUJPIFJPSk8KKzEzOlBSLTcyMDI1OlBSOkNBR1VBUworMTQ6UFItNzIwMjc6UFI6Q0FNVVkKKzE1OlBSLTcyMDI5OlBSOkNBTtNWQU5BUworMTY6UFItNzIwMzE6UFI6Q0FST0xJTkEKKzE3OlBSLTcyMDMzOlBSOkNBVEHRTworMTg6UFItNzIwMzU6UFI6Q0FZRVkKKzE5OlBSLTcyMDM3OlBSOkNFSUJBCisyMDpQUi03MjAzOTpQUjpDSUFMRVMKKzIxOlBSLTcyMDQxOlBSOkNJRFJBCisyMjpQUi03MjA0MzpQUjpDT0FNTworMjM6UFItNzIwNDU6UFI6Q09NRVLNTworMjQ6UFItNzIwNDc6UFI6Q09ST1pBTAorMjU6UFItNzIwNDk6UFI6Q1VMRUJSQQorMjY6UFItNzIwNTE6UFI6RE9SQURPCisyNzpQUi03MjA1MzpQUjpGQUpBUkRPCisyODpQUi03MjA1NDpQUjpGTE9SSURBCisyOTpQUi03MjA1NzpQUjpHVUFZQU1BCiszMDpQUi03MjA1OTpQUjpHVUFZQU5JTExBCiszMTpQUi03MjA2MTpQUjpHVUFZTkFCTworMzI6UFItNzIwNjM6UFI6R1VSQUJPCiszMzpQUi03MjA1NTpQUjpHVcFOSUNBCiszNDpQUi03MjA2NTpQUjpIQVRJTExPCiszNTpQUi03MjA2NzpQUjpIT1JNSUdVRVJPUworMzY6UFItNzIwNjk6UFI6SFVNQUNBTworMzc6UFItNzIwNzE6UFI6SVNBQkVMQQorMzg6UFItNzIwNzM6UFI6SkFZVVlBCiszOTpQUi03MjA3NTpQUjpKVUFOQSBEzUFaCis0MDpQUi03MjA3NzpQUjpKVU5DT1MKKzQxOlBSLTcyMDc5OlBSOkxBSkFTCis0MjpQUi03MjA4MTpQUjpMQVJFUworNDM6UFItNzIwODM6UFI6TEFTIE1BUs1BUworNDQ6UFItNzIwODU6UFI6TEFTIFBJRURSQVMKKzQ1OlBSLTcyMDg3OlBSOkxPzVpBCis0NjpQUi03MjA4OTpQUjpMVVFVSUxMTworNDc6UFItNzIwOTE6UFI6TUFOQVTNCis0ODpQUi03MjA5MzpQUjpNQVJJQ0FPCis0OTpQUi03MjA5NTpQUjpNQVVOQUJPCis1MDpQUi03MjA5NzpQUjpNQVlBR9xFWgorNTE6UFItNzIwOTk6UFI6TU9DQQorNTI6UFItNzIxMDE6UFI6TU9ST1ZJUworNTM6UFItNzIxMDM6UFI6TkFHVUFCTworNTQ6UFItNzIxMDU6UFI6TkFSQU5KSVRPCis1NTpQUi03MjEwNzpQUjpPUk9DT1ZJUworNTY6UFItNzIxMDk6UFI6UEFUSUxMQVMKKzU3OlBSLTcyMTExOlBSOlBF0VVFTEFTCis1ODpQUi03MjExMzpQUjpQT05DRQorNTk6UFItVFI6UFI6UFVFUlRPIFJJQ08KKzYwOlBSLTcyMTE1OlBSOlFVRUJSQURJTExBUworNjE6UFItNzIxMTc6UFI6UklOQ9NOCis2MjpQUi03MjExOTpQUjpSzU8gR1JBTkRFCis2MzpQUi03MjEyMTpQUjpTQUJBTkEgR1JBTkRFCis2NDpQUi03MjEyMzpQUjpTQUxJTkFTCis2NTpQUi03MjEyNTpQUjpTQU4gR0VSTcFOCis2NjpQUi03MjEyNzpQUjpTQU4gSlVBTgorNjc6UFItNzIxMjk6UFI6U0FOIExPUkVOWk8KKzY4OlBSLTcyMTMxOlBSOlNBTiBTRUJBU1RJwU4KKzY5OlBSLTcyMTMzOlBSOlNBTlRBIElTQUJFTAorNzA6UFItNzIxMzU6UFI6VE9BIEFMVEEKKzcxOlBSLTcyMTM3OlBSOlRPQSBCQUpBCis3MjpQUi03MjEzOTpQUjpUUlVKSUxMTyBBTFRPCis3MzpQUi03MjE0MTpQUjpVVFVBRE8KKzc0OlBSLTcyMTQzOlBSOlZFR0EgQUxUQQorNzU6UFItNzIxNDU6UFI6VkVHQSBCQUpBCis3NjpQUi03MjE0NzpQUjpWSUVRVUVTCis3NzpQUi03MjE0OTpQUjpWSUxMQUxCQQorNzg6UFItNzIxNTE6UFI6WUFCVUNPQQorNzk6UFItNzIxNTM6UFI6WUFVQ08KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUFJJL1BSSV9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUFJJL1BSSV9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9QUkkvUFJJX0FETUlOMl9MRVgudHh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BSSy9QUktfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BSSy9QUktfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5NDExZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUFJLL1BSS19BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDI1IEBACisxOktQLUNIQTpLUDpDSEFHQU5HIERPCisyOktQLUNIRzpLUDpDSEFOR0FORworMzpLUC1IQUI6S1A6SEFNR1lPTkdCVUsgRE8KKzQ6S1AtSEFOOktQOkhBTUdZT05HTkFNIERPCis1OktQLUhXQjpLUDpIV0FOR0hBRUJVSyBETworNjpLUC1IV046S1A6SFdBTkdIQUVOQU0gRE8KKzc6S1AtS1NPOktQOktBRVNPTkcKKzg6S1AtS0FFOktQOktBRVNPTkcgU0kKKzk6S1AtS0dXOktQOktBTkdXT04KKzEwOktQLUtBTjpLUDpLQU5HV09OIERPCisxMTpLUC1OQUo6S1A6TkFKSU4gU09OQk9ORyBTSQorMTI6S1AtTkFQOktQOk5BTVBPCisxMzpLUC1OQU06S1A6TkFNUE8gU0kKKzE0OktQLUhHWTpLUDpOT1JUSCBIQU1HWU9ORworMTU6S1AtSFdBOktQOk5PUlRIIEhXQU5HSEFFCisxNjpLUC1OUFk6S1A6Tk9SVEggUFlPTkdBTgorMTc6S1AtUFlCOktQOlBZT05HQU5CVUsgRE8KKzE4OktQLVBZTjpLUDpQWU9OR0FOTkFNIERPCisxOTpLUC1QWTpLUDpQWU9OR1lBTkcKKzIwOktQLVBZTzpLUDpQWU9OR1lBTkcgU0kKKzIxOktQLVNITzpLUDpTT1VUSCBIQU1HWU9ORworMjI6S1AtU0hBOktQOlNPVVRIIEhXQU5HSEFFCisyMzpLUC1TUFk6S1A6U09VVEggUFlPTkdBTgorMjQ6S1AtWUdOOktQOllBTkdHQU5HCisyNTpLUC1ZQU46S1A6WUFOR0dBTkcgRE8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUFJLL1BSS19BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUFJLL1BSS19BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTI3NGM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9QUksvUFJLX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsNzAgQEAKKzE6S1A6UFJLOk5PUlRIIEtPUkVBOkthbmd3b246UFJLLkwyLjcKKzI6S1A6UFJLOk5PUlRIIEtPUkVBOkthbmd3b246UFJLLkwyLjgKKzM6S1A6UFJLOk5PUlRIIEtPUkVBOkthbmd3b246UFJLLkwyLjkKKzE6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIFB5b25nYW46UFJLLkwyLjEwCisxOktQOlBSSzpOT1JUSCBLT1JFQTpDaGFuZ2FuZzpQUksuTDIuMQorMTpLUDpQUks6Tk9SVEggS09SRUE6U291dGggSHdhbmdoYWU6UFJLLkwyLjEyCisyOktQOlBSSzpOT1JUSCBLT1JFQTpTb3V0aCBId2FuZ2hhZTpQUksuTDIuMTMKKzM6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4xNAorNDpLUDpQUks6Tk9SVEggS09SRUE6U291dGggSHdhbmdoYWU6UFJLLkwyLjE1Cis1OktQOlBSSzpOT1JUSCBLT1JFQTpTb3V0aCBId2FuZ2hhZTpQUksuTDIuMTYKKzY6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4xNworNzpLUDpQUks6Tk9SVEggS09SRUE6U291dGggSHdhbmdoYWU6UFJLLkwyLjE4Cis4OktQOlBSSzpOT1JUSCBLT1JFQTpTb3V0aCBId2FuZ2hhZTpQUksuTDIuMTkKKzk6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4yMAorMTA6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4yMQorMTE6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4yMgorMTI6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4yMworMTM6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4yNAorMTQ6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4yNQorMTU6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4yNgorMTY6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4yNworMTc6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4yOAorMTg6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4yOQorMTk6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4zMAorMjA6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4zMQorMjE6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4zMgorMjI6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4zMworMjM6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4zNAorMjQ6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4zNQorMjU6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEh3YW5naGFlOlBSSy5MMi4zNgorMTpLUDpQUks6Tk9SVEggS09SRUE6UHlvbmd5YW5nOlBSSy5MMi42CisxOktQOlBSSzpOT1JUSCBLT1JFQTpTb3V0aCBIYW1neW9uZzpQUksuTDIuNjYKKzI6S1A6UFJLOk5PUlRIIEtPUkVBOlNvdXRoIEhhbWd5b25nOlBSSy5MMi42NworMzpLUDpQUks6Tk9SVEggS09SRUE6U291dGggSGFtZ3lvbmc6UFJLLkwyLjY4Cis0OktQOlBSSzpOT1JUSCBLT1JFQTpTb3V0aCBIYW1neW9uZzpQUksuTDIuNjkKKzE6S1A6UFJLOk5PUlRIIEtPUkVBOllhbmdnYW5nOlBSSy5MMi43MAorMTpLUDpQUks6Tk9SVEggS09SRUE6TmFtcG86UFJLLkwyLjM3CisxOktQOlBSSzpOT1JUSCBLT1JFQTpLYWVzb25nOlBSSy5MMi41CisxOktQOlBSSzpOT1JUSCBLT1JFQTpOb3J0aCBQeW9uZ2FuOlBSSy5MMi4zOAorMjpLUDpQUks6Tk9SVEggS09SRUE6Tm9ydGggUHlvbmdhbjpQUksuTDIuMzkKKzM6S1A6UFJLOk5PUlRIIEtPUkVBOk5vcnRoIFB5b25nYW46UFJLLkwyLjQwCis0OktQOlBSSzpOT1JUSCBLT1JFQTpOb3J0aCBQeW9uZ2FuOlBSSy5MMi40MQorNTpLUDpQUks6Tk9SVEggS09SRUE6Tm9ydGggUHlvbmdhbjpQUksuTDIuNDIKKzY6S1A6UFJLOk5PUlRIIEtPUkVBOk5vcnRoIFB5b25nYW46UFJLLkwyLjQzCis3OktQOlBSSzpOT1JUSCBLT1JFQTpOb3J0aCBQeW9uZ2FuOlBSSy5MMi40NAorODpLUDpQUks6Tk9SVEggS09SRUE6Tm9ydGggUHlvbmdhbjpQUksuTDIuNDUKKzk6S1A6UFJLOk5PUlRIIEtPUkVBOk5vcnRoIFB5b25nYW46UFJLLkwyLjQ2CisxMDpLUDpQUks6Tk9SVEggS09SRUE6Tm9ydGggUHlvbmdhbjpQUksuTDIuNDcKKzExOktQOlBSSzpOT1JUSCBLT1JFQTpOb3J0aCBQeW9uZ2FuOlBSSy5MMi40OAorMTI6S1A6UFJLOk5PUlRIIEtPUkVBOk5vcnRoIFB5b25nYW46UFJLLkwyLjQ5CisxMzpLUDpQUks6Tk9SVEggS09SRUE6Tm9ydGggUHlvbmdhbjpQUksuTDIuNTAKKzE0OktQOlBSSzpOT1JUSCBLT1JFQTpOb3J0aCBQeW9uZ2FuOlBSSy5MMi41MQorMTU6S1A6UFJLOk5PUlRIIEtPUkVBOk5vcnRoIFB5b25nYW46UFJLLkwyLjUyCisxNjpLUDpQUks6Tk9SVEggS09SRUE6Tm9ydGggUHlvbmdhbjpQUksuTDIuNTMKKzE3OktQOlBSSzpOT1JUSCBLT1JFQTpOb3J0aCBQeW9uZ2FuOlBSSy5MMi41NAorMTg6S1A6UFJLOk5PUlRIIEtPUkVBOk5vcnRoIFB5b25nYW46UFJLLkwyLjU1CisxOTpLUDpQUks6Tk9SVEggS09SRUE6Tm9ydGggUHlvbmdhbjpQUksuTDIuNTYKKzIwOktQOlBSSzpOT1JUSCBLT1JFQTpOb3J0aCBQeW9uZ2FuOlBSSy5MMi41NworMjE6S1A6UFJLOk5PUlRIIEtPUkVBOk5vcnRoIFB5b25nYW46UFJLLkwyLjU4CisyMjpLUDpQUks6Tk9SVEggS09SRUE6Tm9ydGggUHlvbmdhbjpQUksuTDIuNTkKKzIzOktQOlBSSzpOT1JUSCBLT1JFQTpOb3J0aCBQeW9uZ2FuOlBSSy5MMi42MAorMjQ6S1A6UFJLOk5PUlRIIEtPUkVBOk5vcnRoIFB5b25nYW46UFJLLkwyLjYxCisyNTpLUDpQUks6Tk9SVEggS09SRUE6Tm9ydGggUHlvbmdhbjpQUksuTDIuNjIKKzI2OktQOlBSSzpOT1JUSCBLT1JFQTpOb3J0aCBQeW9uZ2FuOlBSSy5MMi42MworMjc6S1A6UFJLOk5PUlRIIEtPUkVBOk5vcnRoIFB5b25nYW46UFJLLkwyLjY0CisyODpLUDpQUks6Tk9SVEggS09SRUE6Tm9ydGggUHlvbmdhbjpQUksuTDIuNjUKKzE6S1A6UFJLOk5PUlRIIEtPUkVBOk5vcnRoIEhhbWd5b25nOlBSSy5MMi4yCisyOktQOlBSSzpOT1JUSCBLT1JFQTpOb3J0aCBIYW1neW9uZzpQUksuTDIuMworMzpLUDpQUks6Tk9SVEggS09SRUE6Tm9ydGggSGFtZ3lvbmc6UFJLLkwyLjQKKzE6S1A6UFJLOk5PUlRIIEtPUkVBOk5vcnRoIEh3YW5naGFlOlBSSy5MMi4xMQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9QUlQvUFJUX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9QUlQvUFJUX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMDAxMDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BSVC9QUlRfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwyNCBAQAorMTpQVC0xNDpQVDpBTEVOVEVKTworMjpQVC0xNTpQVDpBTEdBUlZFCiszOlBULTA6UFQ6QVZFSVJPCis0OlBULTAyOlBUOkJFSkEKKzU6UFQtMDM6UFQ6QlJBR0EKKzY6UFQtMDQ6UFQ6QlJBR0FOQ0EKKzc6UFQtMDU6UFQ6Q0FTVEVMTyBCUkFOQ08KKzg6UFQtMTA6UFQ6Q0VOVFJPCis5OlBULTA2OlBUOkNPSU1CUkEKKzEwOlBULTA4OlBUOkZBUk8KKzExOlBULTA5OlBUOkdVQVJEQQorMTI6UFQtOlBUOkxJU0JPQQorMTM6UFQtMDE6UFQ6TElTQk9BIEUgVkFMRSBETyBURUpPCisxNDpQVC0xMTpQVDpOT1JURQorMTU6UFQtMjpQVDpQT1JUQUxFR1JFCisxNjpQVC0zOlBUOlBPUlRPCisxNzpQVC0zMDpQVDpSRUdJTyBBVVROT01BIERBIE1BREVJUkEKKzE4OlBULTIwOlBUOlJFR0lPIEFVVE5PTUEgRE9TIEFDT1JFUworMTk6UFQtNDpQVDpTQU5UQVJFTQorMjA6UFQtNTpQVDpTRVRCQUwKKzIxOlBULTY6UFQ6VklBTkEgRE8gQ0FTVEVMTworMjI6UFQtNzpQVDpWSUxBIFJFQUwKKzIzOlBULTg6UFQ6VklTRVUKKzI0OlBULTA3OlBUOlZPUkEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUFJUL1BSVF9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUFJUL1BSVF9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9QUlQvUFJUX0FETUlOMl9MRVgudHh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BSWS9QUllfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BSWS9QUllfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZhYjIwZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUFJZL1BSWV9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDE5IEBACisxOlBZLTY6UFk6QUxUTyBQQVJBR1VBWQorMjpQWS0wOlBZOkFMVE8gUEFSQU5BCiszOlBZLTM6UFk6QU1BTUJBWQorNDpQWS1BU1U6UFk6QVNVTkNJT04KKzU6UFktMTk6UFk6Qk9RVUVST04KKzY6UFktNTpQWTpDQUFHVUFaCis3OlBZLUNBWjpQWTpDQUFHVUFaVQorODpQWS0xNjpQWTpDQUFaQVBBCis5OlBZLTE0OlBZOkNBTklOREVZVQorMTA6UFktMTc6UFk6Q0VOVFJBTAorMTE6UFktMTg6UFk6Q09OQ0VQQ0lPTgorMTI6UFktMTM6UFk6Q09SRElMTEVSQQorMTM6UFktNDpQWTpHVUFJUkEKKzE0OlBZLTc6UFk6SVRBUFVBCisxNTpQWS04OlBZOk1JU0lPTkVTCisxNjpQWS0yOlBZOk5FRU1CVUNVCisxNzpQWS05OlBZOlBBUkFHVUFSSQorMTg6UFktMTU6UFk6UFJFU0lERU5URSBIQVlFUworMTk6UFktMTI6UFk6U0FOIFBFRFJPCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BSWS9QUllfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1BSWS9QUllfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1ZWFmMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUFJZL1BSWV9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDI0OSBAQAorMTpQWTpQUlk6UEFSQUdVQVk6VU5LTk9XTjpSSU8gQUxUTyBQQVJBTkEKKzE6UFk6UFJZOlBBUkFHVUFZOkJPUVVFUk9OOkdyYWwuIEV1Z2VuaW8gQS4gR2FyYXkKKzI6UFk6UFJZOlBBUkFHVUFZOkJPUVVFUk9OOk1jYWwuIEVzdGlnYXJyaWJpYQorMzpQWTpQUlk6UEFSQUdVQVk6Qk9RVUVST046UGVkcm8gUC4gUGVuYQorMTpQWTpQUlk6UEFSQUdVQVk6TkVFTUJVQ1U6QWxiZXJkaQorMjpQWTpQUlk6UEFSQUdVQVk6TkVFTUJVQ1U6Q2Vycml0bworMzpQWTpQUlk6UEFSQUdVQVk6TkVFTUJVQ1U6RGVzbW9jaGFkb3MKKzQ6UFk6UFJZOlBBUkFHVUFZOk5FRU1CVUNVOkdyYWwuIEpvc2UgRS4gRGlhegorNTpQWTpQUlk6UEFSQUdVQVk6TkVFTUJVQ1U6R3VhenVjdWEKKzY6UFk6UFJZOlBBUkFHVUFZOk5FRU1CVUNVOkh1bWFpdGEKKzc6UFk6UFJZOlBBUkFHVUFZOk5FRU1CVUNVOkh1bWFpdGEgKElzLikKKzg6UFk6UFJZOlBBUkFHVUFZOk5FRU1CVUNVOklzbGEgKFJpbyBQYXJhbmEpCis5OlBZOlBSWTpQQVJBR1VBWTpORUVNQlVDVTpJc2xhIFVtYnUKKzEwOlBZOlBSWTpQQVJBR1VBWTpORUVNQlVDVTpJc2xhIFVtYnUgKElzLikKKzExOlBZOlBSWTpQQVJBR1VBWTpORUVNQlVDVTpMYWd1bmEgVmVyYQorMTI6UFk6UFJZOlBBUkFHVUFZOk5FRU1CVUNVOkxhdXJlbGVzCisxMzpQWTpQUlk6UEFSQUdVQVk6TkVFTUJVQ1U6TWF5b3IgTWFydGluZXoKKzE0OlBZOlBSWTpQQVJBR1VBWTpORUVNQlVDVTpQYXNvIGRlIFBhdHJpYQorMTU6UFk6UFJZOlBBUkFHVUFZOk5FRU1CVUNVOlBpbGFyCisxNjpQWTpQUlk6UEFSQUdVQVk6TkVFTUJVQ1U6UGlsYXIgKElzLikKKzE3OlBZOlBSWTpQQVJBR1VBWTpORUVNQlVDVTpSaW8gUGFyYW5hCisxODpQWTpQUlk6UEFSQUdVQVk6TkVFTUJVQ1U6U2FuIEp1YW4gQnRhLiBkZWwgTmVlbWJ1YworMTk6UFk6UFJZOlBBUkFHVUFZOk5FRU1CVUNVOlRhY3VhcmFzCisyMDpQWTpQUlk6UEFSQUdVQVk6TkVFTUJVQ1U6VGFjdWFyYXMgKElzLikKKzIxOlBZOlBSWTpQQVJBR1VBWTpORUVNQlVDVTpWaWxsYSBGcmFuY2EKKzIyOlBZOlBSWTpQQVJBR1VBWTpORUVNQlVDVTpWaWxsYSBPbGl2YQorMjM6UFk6UFJZOlBBUkFHVUFZOk5FRU1CVUNVOlZpbGxhIE9saXZhIChJcy4pCisyNDpQWTpQUlk6UEFSQUdVQVk6TkVFTUJVQ1U6VmlsbGEgUmljYSAoSXMuKQorMjU6UFk6UFJZOlBBUkFHVUFZOk5FRU1CVUNVOlZpbGxhbHZpbgorMTpQWTpQUlk6UEFSQUdVQVk6U0FOIFBFRFJPOjI1IGRlIERpY2llbWJyZQorMjpQWTpQUlk6UEFSQUdVQVk6U0FOIFBFRFJPOkFudGVxdWVyYQorMzpQWTpQUlk6UEFSQUdVQVk6U0FOIFBFRFJPOkFudGVxdWVyYSAoSXMuKQorNDpQWTpQUlk6UEFSQUdVQVk6U0FOIFBFRFJPOkNob3JlCis1OlBZOlBSWTpQQVJBR1VBWTpTQU4gUEVEUk86RWxpemFyZG8gQXF1aW5vCis2OlBZOlBSWTpQQVJBR1VBWTpTQU4gUEVEUk86SXNpZG9ybyBSZXNxdWluCis3OlBZOlBSWTpQQVJBR1VBWTpTQU4gUEVEUk86SXRhY3VydWJpIGRlbCBSb3NhcmlvCis4OlBZOlBSWTpQQVJBR1VBWTpTQU4gUEVEUk86TGltYQorOTpQWTpQUlk6UEFSQUdVQVk6U0FOIFBFRFJPOk51ZXZhIEdlcm1hbmlhCisxMDpQWTpQUlk6UEFSQUdVQVk6U0FOIFBFRFJPOlJpbyBQYXJhZ3VheQorMTE6UFk6UFJZOlBBUkFHVUFZOlNBTiBQRURSTzpTLlBlZHJvIFkuIChJcy4pCisxMjpQWTpQUlk6UEFSQUdVQVk6U0FOIFBFRFJPOlMuUGVkcm8gZGUgWWN1YW1hbmR5eXUKKzEzOlBZOlBSWTpQQVJBR1VBWTpTQU4gUEVEUk86U2FuIEVzdGFuaXNsYW8KKzE0OlBZOlBSWTpQQVJBR1VBWTpTQU4gUEVEUk86U2FuIFBhYmxvCisxNTpQWTpQUlk6UEFSQUdVQVk6U0FOIFBFRFJPOlRhY3VhdGkKKzE2OlBZOlBSWTpQQVJBR1VBWTpTQU4gUEVEUk86VW5pb24KKzE3OlBZOlBSWTpQQVJBR1VBWTpTQU4gUEVEUk86VmlsbGEgZGVsIFIuIChJcy4pCisxODpQWTpQUlk6UEFSQUdVQVk6U0FOIFBFRFJPOlZpbGxhIGRlbCBSb3NhcmlvCisxOTpQWTpQUlk6UEFSQUdVQVk6U0FOIFBFRFJPOllhdGFpdHkgZGVsIE5vcnRlCisxOlBZOlBSWTpQQVJBR1VBWTpJVEFQVUE6QWx0byBWZXJhCisyOlBZOlBSWTpQQVJBR1VBWTpJVEFQVUE6QmVsbGEgVmlzdGEKKzM6UFk6UFJZOlBBUkFHVUFZOklUQVBVQTpDYW1ieXJldGEKKzQ6UFk6UFJZOlBBUkFHVUFZOklUQVBVQTpDYXBpdGFuIE1lemEKKzU6UFk6UFJZOlBBUkFHVUFZOklUQVBVQTpDYXBpdGFuIE1pcmFuZGEKKzY6UFk6UFJZOlBBUkFHVUFZOklUQVBVQTpDYXJsb3MgQSBMb3BlegorNzpQWTpQUlk6UEFSQUdVQVk6SVRBUFVBOkNhcm1lbiBkZWwgUGFyYW5hCis4OlBZOlBSWTpQQVJBR1VBWTpJVEFQVUE6Q29yb25lbCBCb2dhZG8KKzk6UFk6UFJZOlBBUkFHVUFZOklUQVBVQTpFZGVsaXJhCisxMDpQWTpQUlk6UEFSQUdVQVk6SVRBUFVBOkVuY2FybmFjaW9uCisxMTpQWTpQUlk6UEFSQUdVQVk6SVRBUFVBOkZyYW0KKzEyOlBZOlBSWTpQQVJBR1VBWTpJVEFQVUE6R3JhbCBBcnRpZ2FzCisxMzpQWTpQUlk6UEFSQUdVQVk6SVRBUFVBOkdyYWwuIERlbGdhZG8KKzE0OlBZOlBSWTpQQVJBR1VBWTpJVEFQVUE6SG9oZW5hdQorMTU6UFk6UFJZOlBBUkFHVUFZOklUQVBVQTpJc2xhCisxNjpQWTpQUlk6UEFSQUdVQVk6SVRBUFVBOklzbGEgWWFjeXJldGEKKzE3OlBZOlBSWTpQQVJBR1VBWTpJVEFQVUE6SmVzdXMKKzE4OlBZOlBSWTpQQVJBR1VBWTpJVEFQVUE6TGEgUGF6CisxOTpQWTpQUlk6UEFSQUdVQVk6SVRBUFVBOkxlYW5kcm8gT3ZpZWRvCisyMDpQWTpQUlk6UEFSQUdVQVk6SVRBUFVBOk1heW9yIE90YW5vCisyMTpQWTpQUlk6UEFSQUdVQVk6SVRBUFVBOk5hdGFsaW8KKzIyOlBZOlBSWTpQQVJBR1VBWTpJVEFQVUE6TnVldmEgQWxib3JhZGEKKzIzOlBZOlBSWTpQQVJBR1VBWTpJVEFQVUE6T2JsaWdhZG8KKzI0OlBZOlBSWTpQQVJBR1VBWTpJVEFQVUE6UGlyYXBvCisyNTpQWTpQUlk6UEFSQUdVQVk6SVRBUFVBOlNhbiBDb3NtZSBZIERhbWlhbgorMjY6UFk6UFJZOlBBUkFHVUFZOklUQVBVQTpTYW4gSnVhbgorMjc6UFk6UFJZOlBBUkFHVUFZOklUQVBVQTpTYW4gUGVkcm8gZGVsIFBhcmFuYQorMjg6UFk6UFJZOlBBUkFHVUFZOklUQVBVQTpTYW4gUmFmYWVsIGRlbCBQYXJhbmEKKzI5OlBZOlBSWTpQQVJBR1VBWTpJVEFQVUE6VG9tYXMgUm9tZXJvIFAuCiszMDpQWTpQUlk6UEFSQUdVQVk6SVRBUFVBOlRyaW5pZGFkCiszMTpQWTpQUlk6UEFSQUdVQVk6SVRBUFVBOllhdHl0YXkKKzE6UFk6UFJZOlBBUkFHVUFZOkdVQUlSQTpCb3JqYQorMjpQWTpQUlk6UEFSQUdVQVk6R1VBSVJBOkNhcGl0YW4gVHJvY2hlCiszOlBZOlBSWTpQQVJBR1VBWTpHVUFJUkE6Q25lbCBNYXJ0aW5legorNDpQWTpQUlk6UEFSQUdVQVk6R1VBSVJBOkNuZWwuIE1hcnRpbmV6Cis1OlBZOlBSWTpQQVJBR1VBWTpHVUFJUkE6Q29sb25pYSBJbmRlcGVuZGVuY2lhCis2OlBZOlBSWTpQQVJBR1VBWTpHVUFJUkE6RHIuIEJvdHRyZWxsCis3OlBZOlBSWTpQQVJBR1VBWTpHVUFJUkE6R3JhbCBHYXJheQorODpQWTpQUlk6UEFSQUdVQVk6R1VBSVJBOkl0YXBlCis5OlBZOlBSWTpQQVJBR1VBWTpHVUFJUkE6SXR1cmJlCisxMDpQWTpQUlk6UEFSQUdVQVk6R1VBSVJBOkpvc2UgRmFzc2FyZGkKKzExOlBZOlBSWTpQQVJBR1VBWTpHVUFJUkE6TWJvY2F5YXRpCisxMjpQWTpQUlk6UEFSQUdVQVk6R1VBSVJBOk5hdGFsaWNpbyBUYWxhdmVyYQorMTM6UFk6UFJZOlBBUkFHVUFZOkdVQUlSQTpOdW1pCisxNDpQWTpQUlk6UEFSQUdVQVk6R1VBSVJBOlNhbiBTYWx2YWRvcgorMTU6UFk6UFJZOlBBUkFHVUFZOkdVQUlSQTpWaWxsYXJpY2EKKzE2OlBZOlBSWTpQQVJBR1VBWTpHVUFJUkE6WWF0YWl0eQorMTpQWTpQUlk6UEFSQUdVQVk6Q09OQ0VQQ0lPTjpCZWxlbgorMjpQWTpQUlk6UEFSQUdVQVk6Q09OQ0VQQ0lPTjpDb25jZXBjaW9uCiszOlBZOlBSWTpQQVJBR1VBWTpDT05DRVBDSU9OOkhvcnF1ZXRhCis0OlBZOlBSWTpQQVJBR1VBWTpDT05DRVBDSU9OOkxvcmV0bworNTpQWTpQUlk6UEFSQUdVQVk6Q09OQ0VQQ0lPTjpTYW4gQ2FybG9zCis2OlBZOlBSWTpQQVJBR1VBWTpDT05DRVBDSU9OOlNhbiBMYXphcm8KKzc6UFk6UFJZOlBBUkFHVUFZOkNPTkNFUENJT046WWJ5IFlhdQorMTpQWTpQUlk6UEFSQUdVQVk6Q0VOVFJBTDpBcmVndWEKKzI6UFk6UFJZOlBBUkFHVUFZOkNFTlRSQUw6QXN1bmNpb24KKzM6UFk6UFJZOlBBUkFHVUFZOkNFTlRSQUw6QXN1bmNpb24gKElzLikKKzQ6UFk6UFJZOlBBUkFHVUFZOkNFTlRSQUw6Q2FwaWF0YQorNTpQWTpQUlk6UEFSQUdVQVk6Q0VOVFJBTDpGZG8uIGRlIExhIE1vcmEKKzY6UFk6UFJZOlBBUkFHVUFZOkNFTlRSQUw6R3VhcmFtYmFyZQorNzpQWTpQUlk6UEFSQUdVQVk6Q0VOVFJBTDpJdGEKKzg6UFk6UFJZOlBBUkFHVUFZOkNFTlRSQUw6SXRhdWd1YQorOTpQWTpQUlk6UEFSQUdVQVk6Q0VOVFJBTDpKLiBBLiBTYWxkaXZhcgorMTA6UFk6UFJZOlBBUkFHVUFZOkNFTlRSQUw6TGFnbworMTE6UFk6UFJZOlBBUkFHVUFZOkNFTlRSQUw6TGFnbyBZcGFjYXJhaQorMTI6UFk6UFJZOlBBUkFHVUFZOkNFTlRSQUw6TGFtYmFyZQorMTM6UFk6UFJZOlBBUkFHVUFZOkNFTlRSQUw6TGltcGlvCisxNDpQWTpQUlk6UEFSQUdVQVk6Q0VOVFJBTDpMaW1waW8gKElzLikKKzE1OlBZOlBSWTpQQVJBR1VBWTpDRU5UUkFMOkx1cXVlCisxNjpQWTpQUlk6UEFSQUdVQVk6Q0VOVFJBTDpNLiBSb3F1ZSBBbG9uc28KKzE3OlBZOlBSWTpQQVJBR1VBWTpDRU5UUkFMOk0uUm9xdWUgQWxvbnNvIChJcy4pCisxODpQWTpQUlk6UEFSQUdVQVk6Q0VOVFJBTDpOZW1ieQorMTk6UFk6UFJZOlBBUkFHVUFZOkNFTlRSQUw6TnVldmEgSXRhbGlhCisyMDpQWTpQUlk6UEFSQUdVQVk6Q0VOVFJBTDpSaW8gUGFyYWd1YXkKKzIxOlBZOlBSWTpQQVJBR1VBWTpDRU5UUkFMOlNhbiBBbnRvbmlvCisyMjpQWTpQUlk6UEFSQUdVQVk6Q0VOVFJBTDpTYW4gTG9yZW56bworMjM6UFk6UFJZOlBBUkFHVUFZOkNFTlRSQUw6VmlsbGEgRWxpc2EKKzI0OlBZOlBSWTpQQVJBR1VBWTpDRU5UUkFMOlZpbGxldGEKKzI1OlBZOlBSWTpQQVJBR1VBWTpDRU5UUkFMOllwYWNhcmFpCisyNjpQWTpQUlk6UEFSQUdVQVk6Q0VOVFJBTDpZcGFuZQorMTpQWTpQUlk6UEFSQUdVQVk6UEFSQUdVQVJJOkFjYWhheQorMjpQWTpQUlk6UEFSQUdVQVk6UEFSQUdVQVJJOkNhYXB1Y3UKKzM6UFk6UFJZOlBBUkFHVUFZOlBBUkFHVUFSSTpDYWJhbGxlcm8KKzQ6UFk6UFJZOlBBUkFHVUFZOlBBUkFHVUFSSTpDYXJhcGVndWEKKzU6UFk6UFJZOlBBUkFHVUFZOlBBUkFHVUFSSTpFc2NvYmFyCis2OlBZOlBSWTpQQVJBR1VBWTpQQVJBR1VBUkk6TGEgQ29sbWVuYQorNzpQWTpQUlk6UEFSQUdVQVk6UEFSQUdVQVJJOkxhZy5QYXJhbmEgbWkKKzg6UFk6UFJZOlBBUkFHVUFZOlBBUkFHVUFSSTpMYWdvIFlwb2EKKzk6UFk6UFJZOlBBUkFHVUFZOlBBUkFHVUFSSTpNYnV5YXBleQorMTA6UFk6UFJZOlBBUkFHVUFZOlBBUkFHVUFSSTpQYXJhZ3VhcmkKKzExOlBZOlBSWTpQQVJBR1VBWTpQQVJBR1VBUkk6UGlyYXl1CisxMjpQWTpQUlk6UEFSQUdVQVk6UEFSQUdVQVJJOlF1aWluZHkKKzEzOlBZOlBSWTpQQVJBR1VBWTpQQVJBR1VBUkk6UXV5cXV5aG8KKzE0OlBZOlBSWTpQQVJBR1VBWTpQQVJBR1VBUkk6U2FuIFJvcXVlIEdvbnphbGV6CisxNTpQWTpQUlk6UEFSQUdVQVk6UEFSQUdVQVJJOlNhcHVjYWkKKzE2OlBZOlBSWTpQQVJBR1VBWTpQQVJBR1VBUkk6VGViaWN1YXJ5bWkKKzE3OlBZOlBSWTpQQVJBR1VBWTpQQVJBR1VBUkk6WWFndWFyb24KKzE4OlBZOlBSWTpQQVJBR1VBWTpQQVJBR1VBUkk6WWJ5Y3VpCisxOTpQWTpQUlk6UEFSQUdVQVk6UEFSQUdVQVJJOllieXR5bWkKKzE6UFk6UFJZOlBBUkFHVUFZOkNBQUdVQVpVOjMgZGUgRmVicmVybworMjpQWTpQUlk6UEFSQUdVQVk6Q0FBR1VBWlU6Q2FhZ3VhenUKKzM6UFk6UFJZOlBBUkFHVUFZOkNBQUdVQVpVOkNhcmF5YW8KKzQ6UFk6UFJZOlBBUkFHVUFZOkNBQUdVQVpVOkNlY2lsaW8gQmFlegorNTpQWTpQUlk6UEFSQUdVQVk6Q0FBR1VBWlU6Q29yb25lbCBPdmllZG8KKzY6UFk6UFJZOlBBUkFHVUFZOkNBQUdVQVpVOkouRS4gRXN0aWdhcnJpYmlhCis3OlBZOlBSWTpQQVJBR1VBWTpDQUFHVUFaVTpKb3NlIEQuIE9jYW1wb3MKKzg6UFk6UFJZOlBBUkFHVUFZOkNBQUdVQVpVOkp1YW4gTS4gRnJ1dG9zCis5OlBZOlBSWTpQQVJBR1VBWTpDQUFHVUFaVTpMYSBQYXN0b3JhCisxMDpQWTpQUlk6UEFSQUdVQVk6Q0FBR1VBWlU6TWNhbC4gRmNvLiBTb2xhbm8gTG9wZXoKKzExOlBZOlBSWTpQQVJBR1VBWTpDQUFHVUFaVTpOdWV2YSBMb25kcmVzCisxMjpQWTpQUlk6UEFSQUdVQVk6Q0FBR1VBWlU6Ui5JLiAzIENvcnJhbGVzCisxMzpQWTpQUlk6UEFSQUdVQVk6Q0FBR1VBWlU6UmF1bCAgQS4gT3ZpZWRvCisxNDpQWTpQUlk6UEFSQUdVQVk6Q0FBR1VBWlU6UmVwYXRyaWFjaW9uCisxNTpQWTpQUlk6UEFSQUdVQVk6Q0FBR1VBWlU6UmlvIFlndWF6dQorMTY6UFk6UFJZOlBBUkFHVUFZOkNBQUdVQVpVOlNhbiBKb2FxdWluCisxNzpQWTpQUlk6UEFSQUdVQVk6Q0FBR1VBWlU6U2FuIEpvc2UgZGUgbG9zIEFycm95b3MKKzE4OlBZOlBSWTpQQVJBR1VBWTpDQUFHVUFaVTpTYW50YSBSb3NhIGRlbCBNYnV0dXkKKzE5OlBZOlBSWTpQQVJBR1VBWTpDQUFHVUFaVTpTaW1vbiBCb2xpdmFyCisyMDpQWTpQUlk6UEFSQUdVQVk6Q0FBR1VBWlU6WWh1CisxOlBZOlBSWTpQQVJBR1VBWTpQUkVTSURFTlRFIEhBWUVTOkJlbmphbWluIEFjZXZhbAorMjpQWTpQUlk6UEFSQUdVQVk6UFJFU0lERU5URSBIQVlFUzpQb3pvIENvbG9yYWRvCiszOlBZOlBSWTpQQVJBR1VBWTpQUkVTSURFTlRFIEhBWUVTOlB1ZXJ0byBQaW5hc2NvCis0OlBZOlBSWTpQQVJBR1VBWTpQUkVTSURFTlRFIEhBWUVTOlZpbGxhIEhheWVzCisxOlBZOlBSWTpQQVJBR1VBWTpDQUFaQVBBOkFiYWkKKzI6UFk6UFJZOlBBUkFHVUFZOkNBQVpBUEE6QnVlbmEgVmlzdGEKKzM6UFk6UFJZOlBBUkFHVUFZOkNBQVpBUEE6Q2FhemFwYQorNDpQWTpQUlk6UEFSQUdVQVk6Q0FBWkFQQTpEci4gTW9pc2VzIEJlcnRvbmkKKzU6UFk6UFJZOlBBUkFHVUFZOkNBQVpBUEE6RnVsZ2VuY2lvIFllZ3JvcworNjpQWTpQUlk6UEFSQUdVQVk6Q0FBWkFQQTpHcmFsLiBIaWdpbmlvIE1vcmluaWdvCis3OlBZOlBSWTpQQVJBR1VBWTpDQUFaQVBBOk1hY2llbAorODpQWTpQUlk6UEFSQUdVQVk6Q0FBWkFQQTpTYW4gSnVhbiBOZXBvbXVjZW5vCis5OlBZOlBSWTpQQVJBR1VBWTpDQUFaQVBBOlRhdmFpCisxMDpQWTpQUlk6UEFSQUdVQVk6Q0FBWkFQQTpZdXR5CisxOlBZOlBSWTpQQVJBR1VBWTpBTFRPIFBBUkFOQTpDaXVkYWQgIGRlbCBFc3RlCisyOlBZOlBSWTpQQVJBR1VBWTpBTFRPIFBBUkFOQTpELiBNLiBJcmFsYQorMzpQWTpQUlk6UEFSQUdVQVk6QUxUTyBQQVJBTkE6SGVybmFuZGFyaWFzCis0OlBZOlBSWTpQQVJBR1VBWTpBTFRPIFBBUkFOQTpJdGFreXJ5Cis1OlBZOlBSWTpQQVJBR1VBWTpBTFRPIFBBUkFOQTpKLkUuIE9sZWFyeQorNjpQWTpQUlk6UEFSQUdVQVk6QUxUTyBQQVJBTkE6TG9zIENlZHJhbGVzCis3OlBZOlBSWTpQQVJBR1VBWTpBTFRPIFBBUkFOQTpNYWxsb3JxdWluCis4OlBZOlBSWTpQQVJBR1VBWTpBTFRPIFBBUkFOQTpNYmFyYWNheXUKKzk6UFk6UFJZOlBBUkFHVUFZOkFMVE8gUEFSQU5BOk1pbmdhIEd1YXp1CisxMDpQWTpQUlk6UEFSQUdVQVk6QUxUTyBQQVJBTkE6TWluZ2EgUG9yYQorMTE6UFk6UFJZOlBBUkFHVUFZOkFMVE8gUEFSQU5BOk5hY3VuZGF5CisxMjpQWTpQUlk6UEFSQUdVQVk6QUxUTyBQQVJBTkE6TmFyYW5qYWwKKzEzOlBZOlBSWTpQQVJBR1VBWTpBTFRPIFBBUkFOQTpQdGUuIEZyYW5jbworMTQ6UFk6UFJZOlBBUkFHVUFZOkFMVE8gUEFSQU5BOlJpbyBZZ3VhenUKKzE1OlBZOlBSWTpQQVJBR1VBWTpBTFRPIFBBUkFOQTpTYW4gQWxiZXJ0bworMTY6UFk6UFJZOlBBUkFHVUFZOkFMVE8gUEFSQU5BOlNhbiBDcmlzdG9iYWwKKzE3OlBZOlBSWTpQQVJBR1VBWTpBTFRPIFBBUkFOQTpTYW50YSBSaXRhCisxODpQWTpQUlk6UEFSQUdVQVk6QUxUTyBQQVJBTkE6U2FudGEgUm9zYQorMTk6UFk6UFJZOlBBUkFHVUFZOkFMVE8gUEFSQU5BOllndWF6dQorMjA6UFk6UFJZOlBBUkFHVUFZOkFMVE8gUEFSQU5BOllndWF6dSAoTGFnbykKKzE6UFk6UFJZOlBBUkFHVUFZOkFNQU1CQVk6QmVsbGEgVmlzdGEKKzI6UFk6UFJZOlBBUkFHVUFZOkFNQU1CQVk6Q2FwaXRhbiBCYWRvCiszOlBZOlBSWTpQQVJBR1VBWTpBTUFNQkFZOlBlZHJvIEp1YW4gQ2FiYWxsZXJvCisxOlBZOlBSWTpQQVJBR1VBWTpBTFRPIFBBUkFHVUFZOkZ1ZXJ0ZSBPTGltcG8KKzI6UFk6UFJZOlBBUkFHVUFZOkFMVE8gUEFSQUdVQVk6TGEgVmljdG9yaWEKKzM6UFk6UFJZOlBBUkFHVUFZOkFMVE8gUEFSQUdVQVk6TWF5b3IgUGFibG8gTGEgR2VyZW56YQorMTpQWTpQUlk6UEFSQUdVQVk6Q09SRElMTEVSQToxIGRlIE1hcnpvCisyOlBZOlBSWTpQQVJBR1VBWTpDT1JESUxMRVJBOkFsdG9zCiszOlBZOlBSWTpQQVJBR1VBWTpDT1JESUxMRVJBOkFycm95b3MgeSBFc3QuKElzLikKKzQ6UFk6UFJZOlBBUkFHVUFZOkNPUkRJTExFUkE6QXJyb3lvcyB5IEVzdGVyb3MKKzU6UFk6UFJZOlBBUkFHVUFZOkNPUkRJTExFUkE6QXR5cmEKKzY6UFk6UFJZOlBBUkFHVUFZOkNPUkRJTExFUkE6Q2FhY3VwZQorNzpQWTpQUlk6UEFSQUdVQVk6Q09SRElMTEVSQTpDYXJhZ3VhdGF5Cis4OlBZOlBSWTpQQVJBR1VBWTpDT1JESUxMRVJBOkVtYm9zY2FkYQorOTpQWTpQUlk6UEFSQUdVQVk6Q09SRElMTEVSQTpFbWJvc2NhZGEgKElzLikKKzEwOlBZOlBSWTpQQVJBR1VBWTpDT1JESUxMRVJBOkV1c2ViaW8gQXlhbGEKKzExOlBZOlBSWTpQQVJBR1VBWTpDT1JESUxMRVJBOklzbGEgUHVjdQorMTI6UFk6UFJZOlBBUkFHVUFZOkNPUkRJTExFUkE6SXRhY3VydWJpIGRlIGxhIENvcmRpbGxlcgorMTM6UFk6UFJZOlBBUkFHVUFZOkNPUkRJTExFUkE6SnVhbiBkZSBNZW5hCisxNDpQWTpQUlk6UEFSQUdVQVk6Q09SRElMTEVSQTpMb21hIEdyYW5kZQorMTU6UFk6UFJZOlBBUkFHVUFZOkNPUkRJTExFUkE6TWJhY2F5YXR5IGRlbCBZaGFndXkKKzE2OlBZOlBSWTpQQVJBR1VBWTpDT1JESUxMRVJBOk51ZXZhIENvbG9tYmlhCisxNzpQWTpQUlk6UEFSQUdVQVk6Q09SRElMTEVSQTpQaXJpYmVidXkKKzE4OlBZOlBSWTpQQVJBR1VBWTpDT1JESUxMRVJBOlJpbyBQYXJhZ3VheQorMTk6UFk6UFJZOlBBUkFHVUFZOkNPUkRJTExFUkE6U2FuIEJlcm5hcmRpbm8KKzIwOlBZOlBSWTpQQVJBR1VBWTpDT1JESUxMRVJBOlNhbiBKb3NlIE9icmVybworMjE6UFk6UFJZOlBBUkFHVUFZOkNPUkRJTExFUkE6U2FudGEgRWxlbmEKKzIyOlBZOlBSWTpQQVJBR1VBWTpDT1JESUxMRVJBOlRvYmF0aQorMjM6UFk6UFJZOlBBUkFHVUFZOkNPUkRJTExFUkE6VmFsZW56dWVsYQorMTpQWTpQUlk6UEFSQUdVQVk6Q0FOSU5ERVlVOkNvcnB1cyBDaHJpc3RpCisyOlBZOlBSWTpQQVJBR1VBWTpDQU5JTkRFWVU6Q3VydWd1YXR5CiszOlBZOlBSWTpQQVJBR1VBWTpDQU5JTkRFWVU6Ri4gQ2FiYWxsZXJvIEFsdmFyZXoKKzQ6UFk6UFJZOlBBUkFHVUFZOkNBTklOREVZVTpJdGFuYXJhCis1OlBZOlBSWTpQQVJBR1VBWTpDQU5JTkRFWVU6U2FsdG8gZGVsIEd1YWlyYQorNjpQWTpQUlk6UEFSQUdVQVk6Q0FOSU5ERVlVOlZpbGxhIElnYXRpbWkKKzc6UFk6UFJZOlBBUkFHVUFZOkNBTklOREVZVTpZcGVqaHUKKzE6UFk6UFJZOlBBUkFHVUFZOk1JU0lPTkVTOkF5b2xhcworMjpQWTpQUlk6UEFSQUdVQVk6TUlTSU9ORVM6QXlvbGFzIChJcy4pCiszOlBZOlBSWTpQQVJBR1VBWTpNSVNJT05FUzpJc2xhIEFwaXBlCis0OlBZOlBSWTpQQVJBR1VBWTpNSVNJT05FUzpTYW4gSWduYWNpbworNTpQWTpQUlk6UEFSQUdVQVk6TUlTSU9ORVM6U2FuIEp1YW4gQmF1dGlzdGEKKzY6UFk6UFJZOlBBUkFHVUFZOk1JU0lPTkVTOlNhbiBNaWd1ZWwKKzc6UFk6UFJZOlBBUkFHVUFZOk1JU0lPTkVTOlNhbiBQYXRyaWNpbworODpQWTpQUlk6UEFSQUdVQVk6TUlTSU9ORVM6U2FudGEgTWFyaWEKKzk6UFk6UFJZOlBBUkFHVUFZOk1JU0lPTkVTOlNhbnRhIFJvc2EKKzEwOlBZOlBSWTpQQVJBR1VBWTpNSVNJT05FUzpTYW50aWFnbworMTE6UFk6UFJZOlBBUkFHVUFZOk1JU0lPTkVTOlZpbGxhIEZsb3JpZGEKKzEyOlBZOlBSWTpQQVJBR1VBWTpNSVNJT05FUzpZYWJlYnlyeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9RQVQvUUFUX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9RQVQvUUFUX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZTVkMTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1FBVC9RQVRfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxMCBAQAorMTpRQS1EQTpRQTpBRCBEQVdBSAorMjpRQS1HSDpRQTpBTCBHSFVXQVlSSVlBSAorMzpRQS1KVTpRQTpBTCBKVU1BWUxJWUFICis0OlFBLUtIOlFBOkFMIEtIQVdSCis1OlFBLVdBOlFBOkFMIFdBS1JBSAorNjpRQS1SQTpRQTpBUiBSQVlZQU4KKzc6UUEtSkI6UUE6SkFSSVlBTiBBTCBCQU5BSAorODpRQS1NUzpRQTpNQUROQVQgQVNIIFNIQU1MCis5OlFBLVE6UUE6UUFUQVIKKzEwOlFBLVVTOlFBOlVNTSBBTEwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUUFUL1FBVF9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUUFUL1FBVF9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGQ1Zjk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9RQVQvUUFUX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMTUgQEAKKzE6UUE6UUFUOlFBVEFSOlFhdGFyOlFBVC5MMi4xCisyOlFBOlFBVDpRQVRBUjpRYXRhcjpRQVQuTDIuMTAKKzM6UUE6UUFUOlFBVEFSOlFhdGFyOlFBVC5MMi4xMQorNDpRQTpRQVQ6UUFUQVI6UWF0YXI6UUFULkwyLjEyCis1OlFBOlFBVDpRQVRBUjpRYXRhcjpRQVQuTDIuMTMKKzY6UUE6UUFUOlFBVEFSOlFhdGFyOlFBVC5MMi4xNAorNzpRQTpRQVQ6UUFUQVI6UWF0YXI6UUFULkwyLjE1Cis4OlFBOlFBVDpRQVRBUjpRYXRhcjpRQVQuTDIuMgorOTpRQTpRQVQ6UUFUQVI6UWF0YXI6UUFULkwyLjMKKzEwOlFBOlFBVDpRQVRBUjpRYXRhcjpRQVQuTDIuNAorMTE6UUE6UUFUOlFBVEFSOlFhdGFyOlFBVC5MMi41CisxMjpRQTpRQVQ6UUFUQVI6UWF0YXI6UUFULkwyLjYKKzEzOlFBOlFBVDpRQVRBUjpRYXRhcjpRQVQuTDIuNworMTQ6UUE6UUFUOlFBVEFSOlFhdGFyOlFBVC5MMi44CisxNTpRQTpRQVQ6UUFUQVI6UWF0YXI6UUFULkwyLjkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUk9VL1JPVV9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUk9VL1JPVV9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmVkNzIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9ST1UvUk9VX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsNDMgQEAKKzE6Uk8tQUI6Uk86QUxCQQorMjpSTy1BUjpSTzpBUkFECiszOlJPLUFHOlJPOkFSR0VTCis0OlJPLUJDOlJPOkJBQ0FVCis1OlJPLUJIOlJPOkJJSE9SCis2OlJPLUJOOlJPOkJJU1RSSVRBIE5BU0FVRAorNzpSTy1CVDpSTzpCT1RPU0FOSQorODpSTy1CUjpSTzpCUkFJTEEKKzk6Uk8tQlY6Uk86QlJBU09WCisxMDpSTy1COlJPOkJVQ1VSRVNUSQorMTE6Uk8tQlo6Uk86QlVaQVUKKzEyOlJPLUNBOlJPOkNBTEFSQVNJCisxMzpSTy1DUzpSTzpDQVJBUyBTRVZFUklOCisxNDpSTy1DTDpSTzpDTFJBSQorMTU6Uk8tQ0o6Uk86Q0xVSgorMTY6Uk8tQ1Q6Uk86Q09OU1RBTlRBCisxNzpSTy1DVjpSTzpDT1ZBU05BCisxODpSTy1EQjpSTzpESU1CT1ZJVEEKKzE5OlJPLURKOlJPOkRPTEoKKzIwOlJPLUdMOlJPOkdBTEFUSQorMjE6Uk8tR1I6Uk86R0lVUkdJVQorMjI6Uk8tR0o6Uk86R09SSgorMjM6Uk8tSFI6Uk86SEFSR0hJVEEKKzI0OlJPLUhEOlJPOkhVTkVET0FSQQorMjU6Uk8tSUw6Uk86SUFMT01JVEEKKzI2OlJPLUlTOlJPOklBU0kKKzI3OlJPLUlGOlJPOklMRk9WCisyODpSTy1NTTpSTzpNQVJBTVVSRVMKKzI5OlJPLU1IOlJPOk1FSEVESU5USQorMzA6Uk8tTVM6Uk86TVVSRVMKKzMxOlJPLU5UOlJPOk5FQU1UCiszMjpSTy1PVDpSTzpPTFQKKzMzOlJPLVBIOlJPOlBSQUhPVkEKKzM0OlJPLVNKOlJPOlNBTEFKCiszNTpSTy1TTTpSTzpTQVRVIE1BUkUKKzM2OlJPLVNCOlJPOlNJQklVCiszNzpSTy1TVjpSTzpTVUNFQVZBCiszODpSTy1UUjpSTzpURUxFT1JNQU4KKzM5OlJPLVRNOlJPOlRJTUlTCis0MDpSTy1UTDpSTzpUVUxDRUEKKzQxOlJPLVZTOlJPOlZBU0xVSQorNDI6Uk8tVkw6Uk86VklMQ0VBCis0MzpSTy1WTjpSTzpWUkFOQ0VBCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1JPVS9ST1VfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1JPVS9ST1VfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUk9VL1JPVV9BRE1JTjJfTEVYLnR4dApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9SVVMvUlVTX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9SVVMvUlVTX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZTNiMDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1JVUy9SVVNfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSw4OSBAQAorMTpSVS1BRDpSVTpBRFlHRVlBLCBSRVNQVUJMSUtBCisyOlJVLUFHQjpSVTpBR0lOU0tJWSBCVVJZQVRTS0lZIEFWVE9OT01OWVkgT0tSVUcKKzM6UlUtQUw6UlU6QUxUQVksIFJFU1BVQkxJS0EKKzQ6UlUtQUxUOlJVOkFMVEFZU0tJWSBLUkFZCis1OlJVLUFNVTpSVTpBTVVSU0tBWUEgT0JMQVNUCis2OlJVLUFSSzpSVTpBUktIQU5HRUxTS0FZQSBPQkxBU1QKKzc6UlUtQVNUOlJVOkFTVFJBS0hBTlNLQVlBIE9CTEFTVAorODpSVS1CQTpSVTpCQVNIS09SVE9TVEFOLCBSRVNQVUJMSUtBCis5OlJVLUJFTDpSVTpCRUxHT1JPRFNLQVlBIE9CTEFTVAorMTA6UlUtQlJZOlJVOkJSWUFOU0tBWUEgT0JMQVNUCisxMTpSVS1CVTpSVTpCVVJZQVRJWUEsIFJFU1BVQkxJS0EKKzEyOlJVLUNFOlJVOkNIRUNIRU5TS0FZQSBSRVNQVUJMSUtBCisxMzpSVS1DSEU6UlU6Q0hFTFlBQklOU0tBWUEgT0JMQVNUCisxNDpSVS1DSEk6UlU6Q0hJVElOU0tBWUEgT0JMQVNUCisxNTpSVS1DSFU6UlU6Q0hVS09UU0tJWSBBVlRPTk9NTllZIE9LUlVHCisxNjpSVS1DVTpSVTpDSFVWQVNIU0tBWUEgUkVTUFVCTElLQQorMTc6UlUtREE6UlU6REFHRVNUQU4sIFJFU1BVQkxJS0EKKzE4OlJVLUVWRTpSVTpFVkVOS0lZU0tJWSBBVlRPTk9NTllZIE9LUlVHCisxOTpSVS1JTjpSVTpJTkdVU0hTS0FZQSBSRVNQVUJMSUtBIFtSRVNQVUJMSUtBIElOR1VTSEVUSVlBXQorMjA6UlUtSVJLOlJVOklSS1VUU0tBWUEgT0JMQVNUCisyMTpSVS1JVkE6UlU6SVZBTk9WU0tBWUEgT0JMQVNUCisyMjpSVS1LQjpSVTpLQUJBUkRJTk8gQkFMS0FSU0tBWUEgUkVTUFVCTElLQQorMjM6UlUtS0dEOlJVOktBTElOSU5HUkFEIE9CTC4KKzI0OlJVLUtMOlJVOktBTE1ZS0lZQSwgUkVTUFVCTElLQQorMjU6UlUtS0xVOlJVOktBTFVaSFNLQVlBIE9CTEFTVAorMjY6UlUtS0FNOlJVOktBTUNIQVRTS0FZQSBPQkxBU1QKKzI3OlJVLUtDOlJVOktBUkFDSEFZRVZPIENIRVJLRVNTS0FZQSBSRVNQVUJMSUtBCisyODpSVS1LUjpSVTpLQVJFTElZQSwgUkVTUFVCTElLQQorMjk6UlUtS0VNOlJVOktFTUVST1ZTS0FZQSBPQkxBU1QKKzMwOlJVLUtIQTpSVTpLSEFCQVJPVlNLSVkgS1JBWQorMzE6UlUtS0s6UlU6S0hBS0FTSVlBLCBSRVNQVUJMSUtBCiszMjpSVS1LSE06UlU6S0hBTlRZIE1BTlNJWVNLSVkgQVZUT05PTU5ZWSBPS1JVRyBbWVVHUkFdCiszMzpSVS1LSVI6UlU6S0lST1ZTS0FZQSBPQkxBU1QKKzM0OlJVLUtPUDpSVTpLT01JIFBFUk1ZQVRTS0lZIEFWVE9OT01OWVkgT0tSVUcKKzM1OlJVLUtPOlJVOktPTUksIFJFU1BVQkxJS0EKKzM2OlJVLUtPUjpSVTpLT1JZQUtTS0lZIEFWVE9OT01OWVkgT0tSVUcKKzM3OlJVLUtPUzpSVTpLT1NUUk9NU0tBWUEgT0JMQVNUCiszODpSVS1LREE6UlU6S1JBU05PREFSU0tJWSBLUkFZCiszOTpSVS1LWUE6UlU6S1JBU05PWUFSU0tJWSBLUkFZCis0MDpSVS1LR046UlU6S1VSR0FOU0tBWUEgT0JMQVNUCis0MTpSVS1LUlM6UlU6S1VSU0tBWUEgT0JMQVNUCis0MjpSVS1MRU46UlU6TEVOSU5HUkFEU0tBWUEgT0JMQVNUCis0MzpSVS1MSVA6UlU6TElQRVRTS0FZQSBPQkxBU1QKKzQ0OlJVLU1BRzpSVTpNQUdBREFOU0tBWUEgT0JMQVNUCis0NTpSVS1NRTpSVTpNQVJJWSBFTCwgUkVTUFVCTElLQQorNDY6UlUtTU86UlU6TU9SRE9WSVlBLCBSRVNQVUJMSUtBCis0NzpSVS1NT1M6UlU6TU9TS09WU0tBWUEgT0JMQVNUCis0ODpSVS1NT1c6UlU6TU9TS1ZBCis0OTpSVS1NVVI6UlU6TVVSTUFOU0tBWUEgT0JMQVNUCis1MDpSVS1ORU46UlU6TkVORVRTS0lZIEFWVE9OT01OWVkgT0tSVUcKKzUxOlJVLU5JWjpSVTpOSVpIRUdPUk9EU0tBWUEgT0JMQVNUCis1MjpSVS1OR1I6UlU6Tk9WR09ST0RTS0FZQSBPQkxBU1QKKzUzOlJVLU5WUzpSVTpOT1ZPU0lCSVJTS0FZQSBPQkxBU1QKKzU0OlJVLU9NUzpSVTpPTVNLQVlBIE9CTEFTVAorNTU6UlUtT1JFOlJVOk9SRU5CVVJHU0tBWUEgT0JMQVNUCis1NjpSVS1PUkw6UlU6T1JMT1ZTS0FZQSBPQkxBU1QKKzU3OlJVLVBOWjpSVTpQRU5aRU5TS0FZQSBPQkxBU1QKKzU4OlJVLVBFUjpSVTpQRVJNU0tBWUEgT0JMQVNUCis1OTpSVS1QUkk6UlU6UFJJTU9SU0tJWSBLUkFZCis2MDpSVS1QU0s6UlU6UFNLT1ZTS0FZQSBPQkxBU1QKKzYxOlJVLVJPUzpSVTpST1NUT1ZTS0FZQSBPQkxBU1QKKzYyOlJVLVJZQTpSVTpSWUFaQU5TS0FZQSBPQkxBU1QKKzYzOlJVLVNBOlJVOlNBS0hBLCBSRVNQVUJMSUtBIFtZQUtVVElZQV0KKzY0OlJVLVNBSzpSVTpTQUtIQUxJTlNLQVlBIE9CTEFTVAorNjU6UlUtU0FNOlJVOlNBTUFSU0tBWUEgT0JMQVNUCis2NjpSVS1TUEU6UlU6U0FOS1QgUEVURVJCVVJHCis2NzpSVS1TQVI6UlU6U0FSQVRPVlNLQVlBIE9CTEFTVAorNjg6UlUtU0U6UlU6U0VWRVJOQVlBIE9TRVRJWUEsIFJFU1BVQkxJS0EgW0FMQU5JWUFdIFtSRVNQVUJMSUtBIFNFVkVSTkFZQSBPU0VUSVlBIEFMQU5JWUFdCis2OTpSVS1TTU86UlU6U01PTEVOU0tBWUEgT0JMQVNUCis3MDpSVS1TVEE6UlU6U1RBVlJPUE9MU0tJWSBLUkFZCis3MTpSVS1TVkU6UlU6U1ZFUkRMT1ZTS0FZQSBPQkxBU1QKKzcyOlJVLVRBTTpSVTpUQU1CT1ZTS0FZQSBPQkxBU1QKKzczOlJVLVRBOlJVOlRBVEFSU1RBTiwgUkVTUFVCTElLQQorNzQ6UlUtVEFZOlJVOlRBWU1ZUlNLSVkgKERPTEdBTk8gTkVORVRTS0lZKSBBVlRPTk9NTllZIE9LUlVHCis3NTpSVS1UT006UlU6VE9NU0tBWUEgT0JMQVNUCis3NjpSVS1UVUw6UlU6VFVMU0tBWUEgT0JMQVNUCis3NzpSVS1UVkU6UlU6VFZFUlNLQVlBIE9CTEFTVAorNzg6UlUtVFlVOlJVOlRZVU1FTlNLQVlBIE9CTEFTVAorNzk6UlUtVFk6UlU6VFlWQSwgUkVTUFVCTElLQSBbVFVWQV0KKzgwOlJVLVVEOlJVOlVETVVSVFNLQVlBIFJFU1BVQkxJS0EKKzgxOlJVLVVMWTpSVTpVTFlBTk9WU0tBWUEgT0JMQVNUCis4MjpSVS1VT0I6UlU6VVNUIE9SRFlOU0tJWSBCVVJZQVRTS0lZIEFWVE9OT01OWVkgT0tSVUcKKzgzOlJVLVZMQTpSVTpWTEFESU1JUlNLQVlBIE9CTEFTVAorODQ6UlUtVkdHOlJVOlZPTEdPR1JBRFNLQVlBIE9CTEFTVAorODU6UlUtVkxHOlJVOlZPTE9HT0RTS0FZQSBPQkxBU1QKKzg2OlJVLVZPUjpSVTpWT1JPTkVaSFNLQVlBIE9CTEFTVAorODc6UlUtWUFOOlJVOllBTUFMTyBORU5FVFNLSVkgQVZUT05PTU5ZWSBPS1JVRworODg6UlUtWUFSOlJVOllBUk9TTEFWU0tBWUEgT0JMQVNUCis4OTpSVS1ZRVY6UlU6WUVWUkVZU0tBWUEgQVZUT05PTU5BWUEgT0JMQVNUCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1JVUy9SVVNfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1JVUy9SVVNfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvUlVTL1JVU19BRE1JTjJfTEVYLnR4dApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9SV0EvUldBX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9SV0EvUldBX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYTVmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1JXQS9SV0FfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxMiBAQAorMTpSVy1DOlJXOkJVVEFSRQorMjpSVy1JOlJXOkJZVU1CQQorMzpSVy1FOlJXOkNZQU5HVUdVCis0OlJXLUQ6Ulc6R0lLT05HT1JPCis1OlJXLUc6Ulc6R0lTRU5ZSQorNjpSVy1COlJXOkdJVEFSQU1BCis3OlJXLUo6Ulc6S0lCVU5HVQorODpSVy1GOlJXOktJQlVZRQorOTpSVy1LOlJXOktJR0FMSQorMTA6UlctTDpSVzpLSUdBTEkgVklMTEUKKzExOlJXLU06Ulc6TVVUQVJBCisxMjpSVy1IOlJXOlJVSEVOR0VSSQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9SV0EvUldBX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9SV0EvUldBX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOWQ4NmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1JXQS9SV0FfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSwxNDIgQEAKKzE6Ulc6UldBOlJXQU5EQTpHaXRhcmFtYTpCdWxpbmdhCisyOlJXOlJXQTpSV0FOREE6R2l0YXJhbWE6S2F5ZW56aQorMzpSVzpSV0E6UldBTkRBOkdpdGFyYW1hOktpZ29tYQorNDpSVzpSV0E6UldBTkRBOkdpdGFyYW1hOk1hc2FuZ28KKzU6Ulc6UldBOlJXQU5EQTpHaXRhcmFtYTpNdWFtYmlyYQorNjpSVzpSV0E6UldBTkRBOkdpdGFyYW1hOk11Z2luYQorNzpSVzpSV0E6UldBTkRBOkdpdGFyYW1hOk11a2luZ2kKKzg6Ulc6UldBOlJXQU5EQTpHaXRhcmFtYTpNdXJhbWEKKzk6Ulc6UldBOlJXQU5EQTpHaXRhcmFtYTpNdXNodWJhdGkKKzEwOlJXOlJXQTpSV0FOREE6R2l0YXJhbWE6TnRvbmd3ZQorMTE6Ulc6UldBOlJXQU5EQTpHaXRhcmFtYTpOeWFiaWtlbmtlCisxMjpSVzpSV0E6UldBTkRBOkdpdGFyYW1hOk55YWthYmFuZGEKKzEzOlJXOlJXQTpSV0FOREE6R2l0YXJhbWE6TnlhbWFidXllCisxNDpSVzpSV0E6UldBTkRBOkdpdGFyYW1hOlJ1bmRhCisxNTpSVzpSV0E6UldBTkRBOkdpdGFyYW1hOlJ1dG9id2UKKzE2OlJXOlJXQTpSV0FOREE6R2l0YXJhbWE6VGFiYQorMTc6Ulc6UldBOlJXQU5EQTpHaXRhcmFtYTpUYW1id2UKKzE6Ulc6UldBOlJXQU5EQTpCdXRhcmU6R2lzaGFtdnUKKzI6Ulc6UldBOlJXQU5EQTpCdXRhcmU6SHV5ZQorMzpSVzpSV0E6UldBTkRBOkJ1dGFyZTpLaWJheWkKKzQ6Ulc6UldBOlJXQU5EQTpCdXRhcmU6S2lnZW1iZQorNTpSVzpSV0E6UldBTkRBOkJ1dGFyZTpNYXJhYmEKKzY6Ulc6UldBOlJXQU5EQTpCdXRhcmU6TWJhemkKKzc6Ulc6UldBOlJXQU5EQTpCdXRhcmU6TXVnYW56aQorODpSVzpSV0E6UldBTkRBOkJ1dGFyZTpNdWd1c2EKKzk6Ulc6UldBOlJXQU5EQTpCdXRhcmU6TXV5YWdhCisxMDpSVzpSV0E6UldBTkRBOkJ1dGFyZTpNdXlpcmEKKzExOlJXOlJXQTpSV0FOREE6QnV0YXJlOk5kb3JhCisxMjpSVzpSV0E6UldBTkRBOkJ1dGFyZTpOZ29tYQorMTM6Ulc6UldBOlJXQU5EQTpCdXRhcmU6TnR5YXpvCisxNDpSVzpSV0E6UldBTkRBOkJ1dGFyZTpOeWFiaXNpbmR1CisxNTpSVzpSV0E6UldBTkRBOkJ1dGFyZTpOeWFraXp1CisxNjpSVzpSV0E6UldBTkRBOkJ1dGFyZTpOeWFydWhlbmdlcmkKKzE3OlJXOlJXQTpSV0FOREE6QnV0YXJlOlJ1aGFzaHlhCisxODpSVzpSV0E6UldBTkRBOkJ1dGFyZTpSdW55aW55YQorMTk6Ulc6UldBOlJXQU5EQTpCdXRhcmU6UnVzYXRpcmEKKzIwOlJXOlJXQTpSV0FOREE6QnV0YXJlOlNoeWFuZGEKKzE6Ulc6UldBOlJXQU5EQTpHaWtvbmdvcm86S2FyYW1hCisyOlJXOlJXQTpSV0FOREE6R2lrb25nb3JvOkthcmFtYm8KKzM6Ulc6UldBOlJXQU5EQTpHaWtvbmdvcm86S2lueWFtYWthcmEKKzQ6Ulc6UldBOlJXQU5EQTpHaWtvbmdvcm86S2l2dQorNTpSVzpSV0E6UldBTkRBOkdpa29uZ29ybzpNdWJ1Z2EKKzY6Ulc6UldBOlJXQU5EQTpHaWtvbmdvcm86TXVkYXNvbXdhCis3OlJXOlJXQTpSV0FOREE6R2lrb25nb3JvOk11a28KKzg6Ulc6UldBOlJXQU5EQTpHaWtvbmdvcm86TXVzYW5nZQorOTpSVzpSV0E6UldBTkRBOkdpa29uZ29ybzpNdXNlYmV5YQorMTA6Ulc6UldBOlJXQU5EQTpHaWtvbmdvcm86TnNoaXJpCisxMTpSVzpSV0E6UldBTkRBOkdpa29uZ29ybzpOeWFtYWdhYmUKKzEyOlJXOlJXQTpSV0FOREE6R2lrb25nb3JvOlJ1a29uZG8KKzEzOlJXOlJXQTpSV0FOREE6R2lrb25nb3JvOlJ3YW5taWtvCisxOlJXOlJXQTpSV0FOREE6S2lidXllOkJ3YWtpcmEKKzI6Ulc6UldBOlJXQU5EQTpLaWJ1eWU6R2lzaHlpdGEKKzM6Ulc6UldBOlJXQU5EQTpLaWJ1eWU6R2lzb3Z1Cis0OlJXOlJXQTpSV0FOREE6S2lidXllOkdpdHNpCis1OlJXOlJXQTpSV0FOREE6S2lidXllOktpdnVtdQorNjpSVzpSV0E6UldBTkRBOktpYnV5ZTpNYWJhbnphCis3OlJXOlJXQTpSV0FOREE6S2lidXllOk13ZW5kbworODpSVzpSV0E6UldBTkRBOktpYnV5ZTpSdXRzaXJvCis5OlJXOlJXQTpSV0FOREE6S2lidXllOlJ3YW1hdGFtdQorMTpSVzpSV0E6UldBTkRBOkdpc2VueWk6R2FzZWtlCisyOlJXOlJXQTpSV0FOREE6R2lzZW55aTpHaWNpeWUKKzM6Ulc6UldBOlJXQU5EQTpHaXNlbnlpOkthbmFtYQorNDpSVzpSV0E6UldBTkRBOkdpc2VueWk6S2FyYWdvCis1OlJXOlJXQTpSV0FOREE6R2lzZW55aTpLYXlvdmUKKzY6Ulc6UldBOlJXQU5EQTpHaXNlbnlpOktpYmlyaXJhCis3OlJXOlJXQTpSV0FOREE6R2lzZW55aTpNdXR1cmEKKzg6Ulc6UldBOlJXQU5EQTpHaXNlbnlpOk55YW15dW1iYQorOTpSVzpSV0E6UldBTkRBOkdpc2VueWk6UmFtYmEKKzEwOlJXOlJXQTpSV0FOREE6R2lzZW55aTpSdWJhdnUKKzExOlJXOlJXQTpSV0FOREE6R2lzZW55aTpSd2VyZXJlCisxMjpSVzpSV0E6UldBTkRBOkdpc2VueWk6U2F0aW5zeWkKKzE6Ulc6UldBOlJXQU5EQTpLaWJ1bmd1OkJpcmVuZ2EKKzI6Ulc6UldBOlJXQU5EQTpLaWJ1bmd1OkthYmFyb25kbworMzpSVzpSV0E6UldBTkRBOktpYnVuZ3U6S2F5b256YQorNDpSVzpSV0E6UldBTkRBOktpYnVuZ3U6S2lnYXJhbWEKKzU6Ulc6UldBOlJXQU5EQTpLaWJ1bmd1Ok11Z2VzZXJhCis2OlJXOlJXQTpSV0FOREE6S2lidW5ndTpNdWhhemkKKzc6Ulc6UldBOlJXQU5EQTpLaWJ1bmd1OlJ1a2FyYQorODpSVzpSV0E6UldBTkRBOktpYnVuZ3U6UnVraXJhCis5OlJXOlJXQTpSV0FOREE6S2lidW5ndTpSdXN1bW8KKzEwOlJXOlJXQTpSV0FOREE6S2lidW5ndTpSdXRvbmRlCisxMTpSVzpSV0E6UldBTkRBOktpYnVuZ3U6U2FrZQorMTpSVzpSV0E6UldBTkRBOktpZ2FsaTpCaWN1bWJpCisyOlJXOlJXQTpSV0FOREE6S2lnYWxpOkJ1dGFtd2EKKzM6Ulc6UldBOlJXQU5EQTpLaWdhbGk6R2FzaG9yYQorNDpSVzpSV0E6UldBTkRBOktpZ2FsaTpHaWtvbWVybworNTpSVzpSV0E6UldBTkRBOktpZ2FsaTpHaWtvcm8KKzY6Ulc6UldBOlJXQU5EQTpLaWdhbGk6S2Fub21iZQorNzpSVzpSV0E6UldBTkRBOktpZ2FsaTpLYW56ZW56ZQorODpSVzpSV0E6UldBTkRBOktpZ2FsaTpNYm9nbworOTpSVzpSV0E6UldBTkRBOktpZ2FsaTpNdWdhbWJhemkKKzEwOlJXOlJXQTpSV0FOREE6S2lnYWxpOk11c2FzYQorMTE6Ulc6UldBOlJXQU5EQTpLaWdhbGk6TmdlbmRhCisxMjpSVzpSV0E6UldBTkRBOktpZ2FsaTpOeWFydWdlbmdlCisxMzpSVzpSV0E6UldBTkRBOktpZ2FsaTpSdWJ1bmdvCisxNDpSVzpSV0E6UldBTkRBOktpZ2FsaTpSdXNoYXNoaQorMTU6Ulc6UldBOlJXQU5EQTpLaWdhbGk6UnV0b25nbworMTY6Ulc6UldBOlJXQU5EQTpLaWdhbGk6U2h5b3JvbmdpCisxNzpSVzpSV0E6UldBTkRBOktpZ2FsaTpUYXJlCisxOlJXOlJXQTpSV0FOREE6UnVoZW5nZXJpOkJ1dGFybworMjpSVzpSV0E6UldBTkRBOlJ1aGVuZ2VyaTpDeWFiaW5nbworMzpSVzpSV0E6UldBTkRBOlJ1aGVuZ2VyaTpDeWVydQorNDpSVzpSV0E6UldBTkRBOlJ1aGVuZ2VyaTpHYXRvbmRlCis1OlJXOlJXQTpSV0FOREE6UnVoZW5nZXJpOktpZGFobworNjpSVzpSV0E6UldBTkRBOlJ1aGVuZ2VyaTpLaWdvbWJlCis3OlJXOlJXQTpSV0FOREE6UnVoZW5nZXJpOktpbmlnaQorODpSVzpSV0E6UldBTkRBOlJ1aGVuZ2VyaTpNdWtpbmdvCis5OlJXOlJXQTpSV0FOREE6UnVoZW5nZXJpOk5kdXN1CisxMDpSVzpSV0E6UldBTkRBOlJ1aGVuZ2VyaTpOa3VsaQorMTE6Ulc6UldBOlJXQU5EQTpSdWhlbmdlcmk6Tmt1bWJhCisxMjpSVzpSV0E6UldBTkRBOlJ1aGVuZ2VyaTpOeWFraW5hbWEKKzEzOlJXOlJXQTpSV0FOREE6UnVoZW5nZXJpOk55YW11Z2FsaQorMTQ6Ulc6UldBOlJXQU5EQTpSdWhlbmdlcmk6TnlhbXV0ZXJhCisxNTpSVzpSV0E6UldBTkRBOlJ1aGVuZ2VyaTpOeWFydXRvdnUKKzE2OlJXOlJXQTpSV0FOREE6UnVoZW5nZXJpOlJ1aG9uZG8KKzE6Ulc6UldBOlJXQU5EQTpCeXVtYmE6QnV5b2dhCisyOlJXOlJXQTpSV0FOREE6Qnl1bWJhOkJ3aXNpZ2UKKzM6Ulc6UldBOlJXQU5EQTpCeXVtYmE6Q3l1bWJhCis0OlJXOlJXQTpSV0FOREE6Qnl1bWJhOkN5dW5nbworNTpSVzpSV0E6UldBTkRBOkJ5dW1iYTpHaXRpCis2OlJXOlJXQTpSV0FOREE6Qnl1bWJhOkdpdHV6YQorNzpSVzpSV0E6UldBTkRBOkJ5dW1iYTpLaWJhbGkKKzg6Ulc6UldBOlJXQU5EQTpCeXVtYmE6S2lueWFtaQorOTpSVzpSV0E6UldBTkRBOkJ5dW1iYTpLaXZ1eWUKKzEwOlJXOlJXQTpSV0FOREE6Qnl1bWJhOktpeW9tYmUKKzExOlJXOlJXQTpSV0FOREE6Qnl1bWJhOk11aHVyYQorMTI6Ulc6UldBOlJXQU5EQTpCeXVtYmE6TXVrYXJhbmdlCisxMzpSVzpSV0E6UldBTkRBOkJ5dW1iYTpNdXJhbWJpCisxNDpSVzpSV0E6UldBTkRBOkJ5dW1iYTpNdXZ1bWJhCisxNTpSVzpSV0E6UldBTkRBOkJ5dW1iYTpOZ2FyYW1hCisxNjpSVzpSV0E6UldBTkRBOkJ5dW1iYTpSdXRhcmUKKzE3OlJXOlJXQTpSV0FOREE6Qnl1bWJhOlR1bWJhCisxOlJXOlJXQTpSV0FOREE6Q3lhbmd1Z3U6QnVnYXJhbWEKKzI6Ulc6UldBOlJXQU5EQTpDeWFuZ3VndTpDeWltYm9nbworMzpSVzpSV0E6UldBTkRBOkN5YW5ndWd1OkdhZnVuem8KKzQ6Ulc6UldBOlJXQU5EQTpDeWFuZ3VndTpHYXRhcmUKKzU6Ulc6UldBOlJXQU5EQTpDeWFuZ3VndTpHaXNob21hCis2OlJXOlJXQTpSV0FOREE6Q3lhbmd1Z3U6R2lzdW1hCis3OlJXOlJXQTpSV0FOREE6Q3lhbmd1Z3U6S2FtZW1iZQorODpSVzpSV0E6UldBTkRBOkN5YW5ndWd1OkthcmVuZ2VyYQorOTpSVzpSV0E6UldBTkRBOkN5YW5ndWd1OktpcmFtYm8KKzEwOlJXOlJXQTpSV0FOREE6Q3lhbmd1Z3U6Tnlha2FidXllCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NBVS9TQVVfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NBVS9TQVVfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkZjdmMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU0FVL1NBVV9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDE1IEBACisxOlNBLTQ6U0E6QVNJUgorMjpTQS0xMDpTQTpCQUhBCiszOlNBLTA0OlNBOkVBU1RFUk4gUFJPVklOQ0UKKzQ6U0EtMDY6U0E6SEFJTAorNTpTQS1ORVU6U0E6SVJRL1NBVSBORVVUUkFMIFpPTkUKKzY6U0EtMjpTQTpKQVdGCis3OlNBLTA5OlNBOkpJWkFOCis4OlNBLTAzOlNBOk1BRElOQUgKKzk6U0EtMDI6U0E6TUFLS0FICisxMDpTQS0xMjpTQTpOQUpSQU4KKzExOlNBLTA4OlNBOk5PUlRIRVJOIEZST05USUVSCisxMjpTQS0wNTpTQTpRVUFTU0lNCisxMzpTQS1RQVk6U0E6UVVSQVkgWUFUCisxNDpTQS0wOlNBOlJJWUFECisxNTpTQS0wNzpTQTpUQUJVSwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TQVUvU0FVX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TQVUvU0FVX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNjJhNDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NBVS9TQVVfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSwxNSBAQAorMTpTQTpTQVU6U0FVREkgQVJBQklBOkppemFuOlNBVS5MMi40CisxOlNBOlNBVTpTQVVESSBBUkFCSUE6UXVyYXkgWWF0OlNBVS5MMi45CisxOlNBOlNBVTpTQVVESSBBUkFCSUE6TWFra2FoOlNBVS5MMi4xNQorMTpTQTpTQVU6U0FVREkgQVJBQklBOkFzaXI6U0FVLkwyLjIKKzE6U0E6U0FVOlNBVURJIEFSQUJJQTpSaXlhZDpTQVUuTDIuNQorMTpTQTpTQVU6U0FVREkgQVJBQklBOkhhaWw6U0FVLkwyLjE0CisxOlNBOlNBVTpTQVVESSBBUkFCSUE6SVJRL1NBVSBOZXV0cmFsIFpvbmU6U0FVLkwyLjMKKzE6U0E6U0FVOlNBVURJIEFSQUJJQTpFYXN0ZXJuIFByb3ZpbmNlOlNBVS5MMi42CisxOlNBOlNBVTpTQVVESSBBUkFCSUE6TmFqcmFuOlNBVS5MMi4xMgorMTpTQTpTQVU6U0FVREkgQVJBQklBOlRhYnVrOlNBVS5MMi4xMQorMTpTQTpTQVU6U0FVREkgQVJBQklBOkphd2Y6U0FVLkwyLjEwCisxOlNBOlNBVTpTQVVESSBBUkFCSUE6TWFkaW5haDpTQVUuTDIuOAorMTpTQTpTQVU6U0FVREkgQVJBQklBOlF1YXNzaW06U0FVLkwyLjEKKzE6U0E6U0FVOlNBVURJIEFSQUJJQTpOb3J0aGVybiBGcm9udGllcjpTQVUuTDIuNworMTpTQTpTQVU6U0FVREkgQVJBQklBOkJhaGE6U0FVLkwyLjEzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NETi9TRE5fQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NETi9TRE5fQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1MDMwNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU0ROL1NETl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDMzIEBACisxOlNELTI2OlNEOkFMIEJBUiBBTCBBTUFSCisyOlNELTg6U0Q6QUwgQlVBWVJUCiszOlNELTA3OlNEOkFMIEpBWlJBSAorNDpTRC0wMzpTRDpBTCBLSEFSTQorNTpTRC0wNjpTRDpBTCBRQVJJRgorNjpTRC0yMjpTRDpBTCBXQURBSAorNzpTRC0wNDpTRDpBTiBOTAorODpTRC0wODpTRDpBTiBOTCBBTCBBQllBCis5OlNELTI0OlNEOkFOIE5MIEFMIEFaUkFRCisxMDpTRC0wOlNEOkFTSCBTSEFNTFlBSAorMTE6U0QtQkVHOlNEOkJBSFIgRUwgR0hBWkFMCisxMjpTRC03OlNEOkJBUiBBTCBKQUJBTAorMTM6U0QtQzpTRDpDRU5UUkFMCisxNDpTRC1EQUY6U0Q6REFSRlVSCisxNTpTRC1FOlNEOkVBU1RFUk4gW0VBU1RFUk4xXQorMTY6U0QtRVE6U0Q6RVFVQVRPUklBCisxNzpTRC02OlNEOkdIQVJCIEFMIElTVElXWUFICisxODpTRC00OlNEOkdIQVJCIEJBUiBBTCBHSEFaTAorMTk6U0QtMjpTRDpHSEFSQiBEUkZSCisyMDpTRC0xMDpTRDpKQU5CIERSRlIKKzIxOlNELTM6U0Q6SkFOQiBLVVJEVUZOCisyMjpTRC0yMDpTRDpKTlFBTAorMjM6U0QtMDU6U0Q6S0FTU0FMCisyNDpTRC1LSEE6U0Q6S0hBUlRPVU0KKzI1OlNELUtPUjpTRDpLT1JEVUZBTgorMjY6U0QtMjM6U0Q6TCBBTiBOTAorMjc6U0QtTjpTRDpOT1JUSEVSTiBbTk9SVEhFUk4zXQorMjg6U0QtNTpTRDpTSEFNTCBCQVIgQUwgR0hBWkwKKzI5OlNELTAyOlNEOlNIQU1MIERSRlIKKzMwOlNELTA5OlNEOlNIQU1MIEtVUkRVRk4KKzMxOlNELTk6U0Q6U0hBUlEgQUwgSVNUSVdZQUgKKzMyOlNELTI1OlNEOlNJTk5SCiszMzpTRC1VUE46U0Q6VVBQRVIgTklMRQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TRE4vU0ROX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TRE4vU0ROX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OTVlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NETi9TRE5fQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSwxOCBAQAorMTpTRDpTRE46U1VEQU46RGFyZnVyOk5vcnRoZXJuIERhcmZ1cgorMjpTRDpTRE46U1VEQU46RGFyZnVyOlNvdXRoZXJuIERhcmZ1cgorMTpTRDpTRE46U1VEQU46QmFociBlbCBHaGF6YWw6QmFociBlbCBHaGF6YWwKKzI6U0Q6U0ROOlNVREFOOkJhaHIgZWwgR2hhemFsOkVsIEJ1aGV5cmF0CisxOlNEOlNETjpTVURBTjpVcHBlciBOaWxlOkp1bmdsZWkKKzI6U0Q6U0ROOlNVREFOOlVwcGVyIE5pbGU6VXBwZXIgTmlsZSAoU29iYXQpCisxOlNEOlNETjpTVURBTjpLb3JkdWZhbjpOb3J0aC4gS29yZG9mYW4KKzI6U0Q6U0ROOlNVREFOOktvcmR1ZmFuOlNvdXRoLiBLb3Jkb2ZhbgorMTpTRDpTRE46U1VEQU46Q2VudHJhbDpCbHVlIE5pbGUKKzI6U0Q6U0ROOlNVREFOOkNlbnRyYWw6RWwgR2F6aXJhCiszOlNEOlNETjpTVURBTjpDZW50cmFsOldoaXRlIE5pbGUKKzE6U0Q6U0ROOlNVREFOOktoYXJ0b3VtOktoYXJ0b3VtCisxOlNEOlNETjpTVURBTjpOb3J0aGVybjpOaWxlCisyOlNEOlNETjpTVURBTjpOb3J0aGVybjpOb3J0aGVybgorMTpTRDpTRE46U1VEQU46RWFzdGVybjpLYXNzYWxhCisyOlNEOlNETjpTVURBTjpFYXN0ZXJuOlJlZCBTZWEKKzE6U0Q6U0ROOlNVREFOOkVxdWF0b3JpYTpFYXN0LiBFcXVhdG9yaWEKKzI6U0Q6U0ROOlNVREFOOkVxdWF0b3JpYTpXZXN0LiBFcXVhdG9yaWEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU0VOL1NFTl9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU0VOL1NFTl9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWQyNTg1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TRU4vU0VOX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMzEgQEAKKzE6U04tQkFLOlNOOkJBS0VMCisyOlNOLUJCWTpTTjpCQU1CRVkKKzM6U04tQkdPOlNOOkJJR05PTkEKKzQ6U04tREFHOlNOOkRBR0FOQQorNTpTTi1ESzpTTjpEQUtBUgorNjpTTi1EQjpTTjpESU9VUkJFTAorNzpTTi1GSzpTTjpGQVRJQ0sKKzg6U04tRkRJOlNOOkZPVU5ESU9VR05FCis5OlNOLUdTOlNOOkdPU1NBUworMTA6U04tS0FGOlNOOktBRkZSSU5FCisxMTpTTi1LTDpTTjpLQU9MQUNLCisxMjpTTi1LRU06U046S0VCRU1FUgorMTM6U04tS0VVOlNOOktFRE9VR09VCisxNDpTTi1LRDpTTjpLT0xEQQorMTU6U04tTEdFOlNOOkxJTkdVRVJFCisxNjpTTi1MRzpTTjpMT1VHQQorMTc6U04tTVQ6U046TUFUQU0KKzE4OlNOLU1CSzpTTjpNQkFDS0UKKzE5OlNOLU1CVTpTTjpNQk9VUgorMjA6U04tTkRSOlNOOk5JT1JPIERVIFJJUAorMjE6U04tT1VZOlNOOk9VU1NPVVlFCisyMjpTTi1QS0U6U046UElLSU5FCisyMzpTTi1QRFI6U046UE9ET1IKKzI0OlNOLVJVUTpTTjpSVUZJU1FVRSBCQVJHTlkKKzI1OlNOLVNMOlNOOlNBSU5UIExPVUlTCisyNjpTTi1TREg6U046U0VESElPVQorMjc6U04tVEM6U046VEFNQkFDT1VOREEKKzI4OlNOLVRIOlNOOlRISUVTCisyOTpTTi1UVk86U046VElWQU9VQU5FCiszMDpTTi1WR1I6U046VkVMSU5HQVJBCiszMTpTTi1aRzpTTjpaSUdVSU5DSE9SCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NFTi9TRU5fQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NFTi9TRU5fQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZhMTRjMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU0VOL1NFTl9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDkzIEBACisxOlNOOlNFTjpTRU5FR0FMOkJha2VsOkJhbGEKKzI6U046U0VOOlNFTkVHQUw6QmFrZWw6RGlhd2FyYQorMzpTTjpTRU46U0VORUdBTDpCYWtlbDpHb3VkaXJpCis0OlNOOlNFTjpTRU5FR0FMOkJha2VsOktpZGlyYQorMTpTTjpTRU46U0VORUdBTDpNYm91cjpGaXNzZWwKKzI6U046U0VOOlNFTkVHQUw6TWJvdXI6Tmd1ZWtva2gKKzM6U046U0VOOlNFTkVHQUw6TWJvdXI6VGhpYWRpYXllCisxOlNOOlNFTjpTRU5FR0FMOlRhbWJhY291bmRhOktvdW1wZW50b3VtCisyOlNOOlNFTjpTRU5FR0FMOlRhbWJhY291bmRhOktvdXNzYW5hcgorMzpTTjpTRU46U0VORUdBTDpUYW1iYWNvdW5kYTpNYWthY29saWJhbnRhbmcKKzQ6U046U0VOOlNFTkVHQUw6VGFtYmFjb3VuZGE6TWlzc2lyYWgKKzE6U046U0VOOlNFTkVHQUw6UGlraW5lOlBpa2luZQorMTpTTjpTRU46U0VORUdBTDpNYXRhbTpLYW5lbAorMjpTTjpTRU46U0VORUdBTDpNYXRhbTpPdXJvc3NvZ3VpCiszOlNOOlNFTjpTRU5FR0FMOk1hdGFtOlNlbW1lCis0OlNOOlNFTjpTRU5FR0FMOk1hdGFtOlRoaWxvZ25lCisxOlNOOlNFTjpTRU5FR0FMOk5pb3JvLUR1LVJpcDpNZWRpbmEgU2FiYWtoCisyOlNOOlNFTjpTRU5FR0FMOk5pb3JvLUR1LVJpcDpQYW9za290bworMzpTTjpTRU46U0VORUdBTDpOaW9yby1EdS1SaXA6V2FjayBOZ291bmEKKzE6U046U0VOOlNFTkVHQUw6VGhpZXM6Tm90dG8KKzI6U046U0VOOlNFTkVHQUw6VGhpZXM6UG91dAorMzpTTjpTRU46U0VORUdBTDpUaGllczpUaGllbmFiYQorMTpTTjpTRU46U0VORUdBTDpGb3VuZGlvdWduZTpEamlsb3IKKzI6U046U0VOOlNFTkVHQUw6Rm91bmRpb3VnbmU6TmlvZGlvcgorMzpTTjpTRU46U0VORUdBTDpGb3VuZGlvdWduZTpUb3ViYWNvdXRhCisxOlNOOlNFTjpTRU5FR0FMOlJ1ZmlzcXVlLUJhcmdueTpTZWJpa290YW5lCisxOlNOOlNFTjpTRU5FR0FMOkZhdGljazpEaWFraGFvCisyOlNOOlNFTjpTRU5FR0FMOkZhdGljazpGaW1lbGEKKzM6U046U0VOOlNFTkVHQUw6RmF0aWNrOk5pYWtoYXIKKzQ6U046U0VOOlNFTkVHQUw6RmF0aWNrOlRhdHRhZ3VpbmUKKzE6U046U0VOOlNFTkVHQUw6U2VkaGlvdTpCb3Vua2lsaW5nCisyOlNOOlNFTjpTRU5FR0FMOlNlZGhpb3U6RGlhdHRhY291bmRhCiszOlNOOlNFTjpTRU5FR0FMOlNlZGhpb3U6RGllbmRlCis0OlNOOlNFTjpTRU5FR0FMOlNlZGhpb3U6TWFyc2Fzc291bQorNTpTTjpTRU46U0VORUdBTDpTZWRoaW91OlRhbmFmZgorMTpTTjpTRU46U0VORUdBTDpEaW91cmJlbDpOZGluZHkKKzI6U046U0VOOlNFTkVHQUw6RGlvdXJiZWw6TmRvdWxvCisxOlNOOlNFTjpTRU5FR0FMOktvbGRhOkRhYm8KKzI6U046U0VOOlNFTkVHQUw6S29sZGE6RGlvdWxhY29sb24KKzM6U046U0VOOlNFTkVHQUw6S29sZGE6TWVkaW5hIFlvcm8gRm91bGFoCisxOlNOOlNFTjpTRU5FR0FMOkRha2FyOkRha2FyCisxOlNOOlNFTjpTRU5FR0FMOkxvdWdhOktldXIgTW9tYXIgU2FycgorMjpTTjpTRU46U0VORUdBTDpMb3VnYTpLb2tpCiszOlNOOlNFTjpTRU5FR0FMOkxvdWdhOk1iZWRpZW5lCis0OlNOOlNFTjpTRU5FR0FMOkxvdWdhOlNha2FsCisxOlNOOlNFTjpTRU5FR0FMOktlZG91Z291OkJhbmRhZmFzc2kKKzI6U046U0VOOlNFTkVHQUw6S2Vkb3Vnb3U6Rm9uZ29saW1iaQorMzpTTjpTRU46U0VORUdBTDpLZWRvdWdvdTpTYWxlbWF0YQorNDpTTjpTRU46U0VORUdBTDpLZWRvdWdvdTpTYXJheWEKKzE6U046U0VOOlNFTkVHQUw6S2FmZnJpbmU6Qmlya2VsYW5lCisyOlNOOlNFTjpTRU5FR0FMOkthZmZyaW5lOktvdW5naGV1bAorMzpTTjpTRU46U0VORUdBTDpLYWZmcmluZTpNYWxlbWUgSG9kYXIKKzQ6U046U0VOOlNFTkVHQUw6S2FmZnJpbmU6TmdhbmRhCisxOlNOOlNFTjpTRU5FR0FMOkthb2xhY2s6R2FuZGlheWUKKzI6U046U0VOOlNFTkVHQUw6S2FvbGFjazpOZGllZGllbmcKKzM6U046U0VOOlNFTkVHQUw6S2FvbGFjazpOZG9mZmFuZQorMTpTTjpTRU46U0VORUdBTDpMaW5ndWVyZTpCYXJrZWRqaQorMjpTTjpTRU46U0VORUdBTDpMaW5ndWVyZTpEYWhyYQorMzpTTjpTRU46U0VORUdBTDpMaW5ndWVyZTpEb2RqaQorNDpTTjpTRU46U0VORUdBTDpMaW5ndWVyZTpZYW5nLVlhbmcKKzE6U046U0VOOlNFTkVHQUw6VmVsaW5nYXJhOkJvbmNvbnRvCisyOlNOOlNFTjpTRU5FR0FMOlZlbGluZ2FyYTpLb3Vua2FuZQorMzpTTjpTRU46U0VORUdBTDpWZWxpbmdhcmE6UGFrb3VyCisxOlNOOlNFTjpTRU5FR0FMOktlYmVtZXI6RGFyb3UgTW91c3RpCisyOlNOOlNFTjpTRU5FR0FMOktlYmVtZXI6TmRhbmRlCiszOlNOOlNFTjpTRU5FR0FMOktlYmVtZXI6U2FnYXRhCisxOlNOOlNFTjpTRU5FR0FMOlRpdmFvdWFuZTpNZW91YW5lCisyOlNOOlNFTjpTRU5FR0FMOlRpdmFvdWFuZTpNZXJpbmEgRGFraGFyCiszOlNOOlNFTjpTRU5FR0FMOlRpdmFvdWFuZTpOaWFraGVuZQorNDpTTjpTRU46U0VORUdBTDpUaXZhb3VhbmU6UGFtYmFsCisxOlNOOlNFTjpTRU5FR0FMOkdvc3NhczpDb2xvYmFuZQorMjpTTjpTRU46U0VORUdBTDpHb3NzYXM6S2Fob25lCiszOlNOOlNFTjpTRU5FR0FMOkdvc3NhczpPdWFkaW91cgorMTpTTjpTRU46U0VORUdBTDpaaWd1aW5jaG9yOk5pYWd1aXMKKzI6U046U0VOOlNFTkVHQUw6WmlndWluY2hvcjpOaWFzc2lhCisxOlNOOlNFTjpTRU5FR0FMOkJpZ25vbmE6RGlvdWxvdWxvdQorMjpTTjpTRU46U0VORUdBTDpCaWdub25hOlNpbmRpYW4KKzM6U046U0VOOlNFTkVHQUw6Qmlnbm9uYTpUZW5kb3VjaworNDpTTjpTRU46U0VORUdBTDpCaWdub25hOlRlbmdob3JpCisxOlNOOlNFTjpTRU5FR0FMOkJhbWJleTpCYWJhIEdhcmFnZQorMjpTTjpTRU46U0VORUdBTDpCYW1iZXk6TGFtYmF5ZQorMzpTTjpTRU46U0VORUdBTDpCYW1iZXk6TmdveWUKKzE6U046U0VOOlNFTkVHQUw6T3Vzc291eWU6Q2Ficm91c3NlCisyOlNOOlNFTjpTRU5FR0FMOk91c3NvdXllOkxvdWRpYSBPdW9sb2YKKzE6U046U0VOOlNFTkVHQUw6RGFnYW5hOk1iYW5lCisyOlNOOlNFTjpTRU5FR0FMOkRhZ2FuYTpSYW8KKzM6U046U0VOOlNFTkVHQUw6RGFnYW5hOlJvc3MtQmV0aGlvCisxOlNOOlNFTjpTRU5FR0FMOk1iYWNrZTpLYWVsCisyOlNOOlNFTjpTRU5FR0FMOk1iYWNrZTpOZGFtZQorMTpTTjpTRU46U0VORUdBTDpQb2RvcjpDYXMtQ2FzCisyOlNOOlNFTjpTRU5FR0FMOlBvZG9yOk5kaW91bQorMzpTTjpTRU46U0VORUdBTDpQb2RvcjpTYWxkZQorNDpTTjpTRU46U0VORUdBTDpQb2RvcjpUaGlsbGUgQm91YmFjYXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU0dQL1NHUF9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU0dQL1NHUF9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjAxNmU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TR1AvU0dQX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEgQEAKKzE6U0ctUzpTRzpTSU5HQVBPUkUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU0dQL1NHUF9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU0dQL1NHUF9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRmNzVjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TR1AvU0dQX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMTMgQEAKKzE6U0c6U0dQOlNJTkdBUE9SRTpTaW5nYXBvcmU6U0dQLkwyLjEKKzI6U0c6U0dQOlNJTkdBUE9SRTpTaW5nYXBvcmU6U0dQLkwyLjEwCiszOlNHOlNHUDpTSU5HQVBPUkU6U2luZ2Fwb3JlOlNHUC5MMi4xMQorNDpTRzpTR1A6U0lOR0FQT1JFOlNpbmdhcG9yZTpTR1AuTDIuMTIKKzU6U0c6U0dQOlNJTkdBUE9SRTpTaW5nYXBvcmU6U0dQLkwyLjEzCis2OlNHOlNHUDpTSU5HQVBPUkU6U2luZ2Fwb3JlOlNHUC5MMi4yCis3OlNHOlNHUDpTSU5HQVBPUkU6U2luZ2Fwb3JlOlNHUC5MMi4zCis4OlNHOlNHUDpTSU5HQVBPUkU6U2luZ2Fwb3JlOlNHUC5MMi40Cis5OlNHOlNHUDpTSU5HQVBPUkU6U2luZ2Fwb3JlOlNHUC5MMi41CisxMDpTRzpTR1A6U0lOR0FQT1JFOlNpbmdhcG9yZTpTR1AuTDIuNgorMTE6U0c6U0dQOlNJTkdBUE9SRTpTaW5nYXBvcmU6U0dQLkwyLjcKKzEyOlNHOlNHUDpTSU5HQVBPUkU6U2luZ2Fwb3JlOlNHUC5MMi44CisxMzpTRzpTR1A6U0lOR0FQT1JFOlNpbmdhcG9yZTpTR1AuTDIuOQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TTEUvU0xFX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TTEUvU0xFX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYjdhMGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NMRS9TTEVfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSw0IEBACisxOlNMLUU6U0w6RUFTVEVSTiBbRUFTVEVSTjJdCisyOlNMLU46U0w6Tk9SVEhFUk4gW05PUlRIRVJOMl0KKzM6U0wtUzpTTDpTT1VUSEVSTgorNDpTTC1XOlNMOldFU1RFUk4gQVJFQSAoRlJFRVRPV04pIFtXRVNURVJOM10gW1dFU1RFUk5dCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NMRS9TTEVfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NMRS9TTEVfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3MTljYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU0xFL1NMRV9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDE0IEBACisxOlNMOlNMRTpTSUVSUkEgTEVPTkU6U291dGhlcm46Qm8KKzI6U0w6U0xFOlNJRVJSQSBMRU9ORTpTb3V0aGVybjpCb250aGUKKzM6U0w6U0xFOlNJRVJSQSBMRU9ORTpTb3V0aGVybjpNb3lhbWJhCis0OlNMOlNMRTpTSUVSUkEgTEVPTkU6U291dGhlcm46UHVqZWh1bgorMTpTTDpTTEU6U0lFUlJBIExFT05FOkVhc3Rlcm4yOkthaWxhaHVuCisyOlNMOlNMRTpTSUVSUkEgTEVPTkU6RWFzdGVybjI6S2VuZW1hCiszOlNMOlNMRTpTSUVSUkEgTEVPTkU6RWFzdGVybjI6S29ubworMTpTTDpTTEU6U0lFUlJBIExFT05FOk5vcnRoZXJuMjpCb21iYWxpCisyOlNMOlNMRTpTSUVSUkEgTEVPTkU6Tm9ydGhlcm4yOkthbWJpYQorMzpTTDpTTEU6U0lFUlJBIExFT05FOk5vcnRoZXJuMjpLb2luYWR1Z3UKKzQ6U0w6U0xFOlNJRVJSQSBMRU9ORTpOb3J0aGVybjI6UG9ydCBMb2tvCis1OlNMOlNMRTpTSUVSUkEgTEVPTkU6Tm9ydGhlcm4yOlRvbmtvbGlsaQorMTpTTDpTTEU6U0lFUlJBIExFT05FOldlc3Rlcm4zOkZyZWV0b3duCisyOlNMOlNMRTpTSUVSUkEgTEVPTkU6V2VzdGVybjM6V2VzdGVybiBSdXJhbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TTVIvU01SX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TTVIvU01SX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZTVmZTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NNUi9TTVJfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSBAQAorMTpTTS1NOlNNOlNBTiBNQVJJTk8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU01SL1NNUl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU01SL1NNUl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TTVIvU01SX0FETUlOMl9MRVgudHh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NPTS9TT01fQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NPTS9TT01fQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3ZWYxYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU09NL1NPTV9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDE4IEBACisxOlNPLUFXOlNPOkFXREFMCisyOlNPLUJLOlNPOkJBS09PTAorMzpTTy1CTjpTTzpCQU5BQURJUgorNDpTTy1CUjpTTzpCQVJJCis1OlNPLUJZOlNPOkJBWQorNjpTTy1HRTpTTzpHQURPCis3OlNPLUdBOlNPOkdBTEdVRFVVRAorODpTTy1ISTpTTzpISUlSQU4KKzk6U08tSkQ6U086Si4gREhFWEUKKzEwOlNPLUpIOlNPOkouIEhPT1NFCisxMTpTTy1NVTpTTzpNVURVRworMTI6U08tTlU6U086TlVHQUFMCisxMzpTTy1TQTpTTzpTQU5BQUcKKzE0OlNPLVNEOlNPOlNILiBESEVYRQorMTU6U08tU0g6U086U0guIEhPT1NFCisxNjpTTy1TTzpTTzpTT09MCisxNzpTTy1UTzpTTzpUT0cgREhFRVIKKzE4OlNPLVdPOlNPOlcuIEdBTEJFRUQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU09NL1NPTV9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU09NL1NPTV9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjk0ZTU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TT00vU09NX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsNzQgQEAKKzE6U086U09NOlNPTUFMSUE6QmF5OkJheWRoYWJvCisyOlNPOlNPTTpTT01BTElBOkJheTpCdXVyIFhha2FiYSAoQnVyIEhhY2FiYSkKKzM6U086U09NOlNPTUFMSUE6QmF5OkRpaW5zb29yCis0OlNPOlNPTTpTT01BTElBOkJheTpRYW5zYXggRGhlZXJlCisxOlNPOlNPTTpTT01BTElBOkdhZG86QmFhci1EaGVlcmUKKzI6U086U09NOlNPTUFMSUE6R2FkbzpCZWxlZCBYYWF3byAoQnVsYS1oYXdhKQorMzpTTzpTT006U09NQUxJQTpHYWRvOkNlZWwgV2FhcSAoRWwgV2FrKQorNDpTTzpTT006U09NQUxJQTpHYWRvOkRvbG93Cis1OlNPOlNPTTpTT01BTElBOkdhZG86R2FyYmFoYWFyYXkKKzY6U086U09NOlNPTUFMSUE6R2FkbzpMdXVrCisxOlNPOlNPTTpTT01BTElBOlNoLiBIb29zZTpBZmdvb3llIChBZmdvaSkKKzI6U086U09NOlNPTUFMSUE6U2guIEhvb3NlOkJhcmFhd2UKKzM6U086U09NOlNPTUFMSUE6U2guIEhvb3NlOkt1bnR1d2FhcmF5Cis0OlNPOlNPTTpTT01BTElBOlNoLiBIb29zZTpNYXJrYQorNTpTTzpTT006U09NQUxJQTpTaC4gSG9vc2U6UW9yeW9vbGV5Cis2OlNPOlNPTTpTT01BTElBOlNoLiBIb29zZTpTYWJsYWxlCis3OlNPOlNPTTpTT01BTElBOlNoLiBIb29zZTpXYW5sYSBXZXluCisxOlNPOlNPTTpTT01BTElBOkdhbGd1ZHV1ZDpDYWFidWR3YWFxCisyOlNPOlNPTTpTT01BTElBOkdhbGd1ZHV1ZDpDYWRhYWRvCiszOlNPOlNPTTpTT01BTElBOkdhbGd1ZHV1ZDpDZWVsIEJ1dXIgKEVsIEJ1cikKKzQ6U086U09NOlNPTUFMSUE6R2FsZ3VkdXVkOkNlZWwgRGhlZXIgKEVsIERlcmUpCis1OlNPOlNPTTpTT01BTElBOkdhbGd1ZHV1ZDpEaHV1c2FtYXJlZWIKKzE6U086U09NOlNPTUFMSUE6QmFyaTpCYW5kZXItQmV5bGEgKEJlbmRlcmJlbGEKKzI6U086U09NOlNPTUFMSUE6QmFyaTpCb3NhYXNvCiszOlNPOlNPTTpTT01BTElBOkJhcmk6Q2FsYXdsYSAoQWx1bGEpCis0OlNPOlNPTTpTT01BTElBOkJhcmk6SXNrdXNodWJhbgorNTpTTzpTT006U09NQUxJQTpCYXJpOlFhbmRhbGEKKzY6U086U09NOlNPTUFMSUE6QmFyaTpRYXJkaG8KKzE6U086U09NOlNPTUFMSUE6TnVnYWFsOkJ1cnRpbmxlCisyOlNPOlNPTTpTT01BTElBOk51Z2FhbDpFeWwKKzM6U086U09NOlNPTUFMSUE6TnVnYWFsOkdhcm9vd2UKKzQ6U086U09NOlNPTUFMSUE6TnVnYWFsOkxhc2NhYW5vZCAoTGFzYW5vZCkKKzU6U086U09NOlNPTUFMSUE6TnVnYWFsOlRhbGVleAorNjpTTzpTT006U09NQUxJQTpOdWdhYWw6WHVkdW4KKzE6U086U09NOlNPTUFMSUE6U2guIERoZXhlOkFhZGFuCisyOlNPOlNPTTpTT01BTElBOlNoLiBEaGV4ZTpCYWxjYWQKKzM6U086U09NOlNPTUFMSUE6U2guIERoZXhlOkNhZGFsZQorNDpTTzpTT006U09NQUxJQTpTaC4gRGhleGU6SmF3aGFyCisxOlNPOlNPTTpTT01BTElBOkJha29vbDpDZWVsIEJhcmRlIChFbCBCYXJkZSkKKzI6U086U09NOlNPTUFMSUE6QmFrb29sOlJhYiBEaHV1cmUKKzM6U086U09NOlNPTUFMSUE6QmFrb29sOlRpeWVlZ2xvdworNDpTTzpTT006U09NQUxJQTpCYWtvb2w6V2FqaWQKKzU6U086U09NOlNPTUFMSUE6QmFrb29sOlh1ZHVyIChIdWR1cikKKzE6U086U09NOlNPTUFMSUE6SGlpcmFuOkJlbGVkIFdleW4KKzI6U086U09NOlNPTUFMSUE6SGlpcmFuOkJ1dWxvIEJ1cmRvIChCdWxhLUJyaWYpCiszOlNPOlNPTTpTT01BTElBOkhpaXJhbjpKYWxhbGFxc2kKKzE6U086U09NOlNPTUFMSUE6U2FuYWFnOkJhZGhhbgorMjpTTzpTT006U09NQUxJQTpTYW5hYWc6Q2VlbC1BZndlaW4KKzM6U086U09NOlNPTUFMSUE6U2FuYWFnOkNlZXJpZ2FhYm8gKEVyaWdhdm8pCisxOlNPOlNPTTpTT01BTElBOkJhbmFhZGlyOk1vZ2FkaXNobworMTpTTzpTT006U09NQUxJQTpKLiBEaGV4ZTpCdSdhYWxlCisyOlNPOlNPTTpTT01BTElBOkouIERoZXhlOkppbGliCiszOlNPOlNPTTpTT01BTElBOkouIERoZXhlOlNhYWtvdworMTpTTzpTT006U09NQUxJQTpNdWR1ZzpHYWFsa2FjYXlvCisyOlNPOlNPTTpTT01BTElBOk11ZHVnOkdvbGRvZ29iCiszOlNPOlNPTTpTT01BTElBOk11ZHVnOkhvYnlvCis0OlNPOlNPTTpTT01BTElBOk11ZHVnOkphcmlpYmFuCis1OlNPOlNPTTpTT01BTElBOk11ZHVnOlhhcmFyZGhlZXJlIChIYXJhcmRlcmUpCisxOlNPOlNPTTpTT01BTElBOlRvZy1EaGVlcjpCdXJhbworMjpTTzpTT006U09NQUxJQTpUb2ctRGhlZXI6QnV1aG9vZGxlCiszOlNPOlNPTTpTT01BTElBOlRvZy1EaGVlcjpDYXluYWJvCis0OlNPOlNPTTpTT01BTElBOlRvZy1EaGVlcjpPb2R3ZXluZQorNTpTTzpTT006U09NQUxJQTpUb2ctRGhlZXI6U2hlZWtoCisxOlNPOlNPTTpTT01BTElBOkouIEhvb3NlOkFmbWFkb3cKKzI6U086U09NOlNPTUFMSUE6Si4gSG9vc2U6QmFkaGFhZGhlCiszOlNPOlNPTTpTT01BTElBOkouIEhvb3NlOkphbWFhbWUKKzQ6U086U09NOlNPTUFMSUE6Si4gSG9vc2U6S2lzbWFheW8KKzE6U086U09NOlNPTUFMSUE6Vy4gR2FsYmVlZDpCYWtpCisyOlNPOlNPTTpTT01BTElBOlcuIEdhbGJlZWQ6QmVyYmVyYQorMzpTTzpTT006U09NQUxJQTpXLiBHYWxiZWVkOkJvb3JhbWEKKzQ6U086U09NOlNPTUFMSUE6Vy4gR2FsYmVlZDpHYWJpbGV5Cis1OlNPOlNPTTpTT01BTElBOlcuIEdhbGJlZWQ6SGFyZ2V5c2EKKzY6U086U09NOlNPTUFMSUE6Vy4gR2FsYmVlZDpMdWdoYXlhCis3OlNPOlNPTTpTT01BTElBOlcuIEdhbGJlZWQ6U2F5bGFjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NSQi9TUkJfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NSQi9TUkJfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4OTYzYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU1JCL1NSQl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDUgQEAKKzE6WVUtQ0dPOllVOkNSTkEgR09SQQorMjpZVS1LT1M6WVU6S09TT1ZPCiszOllVLU1LRDpZVTpNQUtFRE9OSUpBCis0OllVLVNSQjpZVTpTUkJJSkEKKzU6WVUtVk9KOllVOlZPSlZPRElOQQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TUkIvU1JCX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TUkIvU1JCX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NSQi9TUkJfQURNSU4yX0xFWC50eHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU1RQL1NUUF9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU1RQL1NUUF9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWRlZDEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TVFAvU1RQX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMiBAQAorMTpTVC1QOlNUOlBSSU5DSVBFCisyOlNULVM6U1Q6U0FPIFRPTUUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU1RQL1NUUF9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU1RQL1NUUF9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTBiZDY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TVFAvU1RQX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMiBAQAorMTpTVDpTVFA6U0FPIFRPTUUgQU5EIFBSSU5DSVBFOlNhbyBUb21lOlNUUC5MMi4xCisxOlNUOlNUUDpTQU8gVE9NRSBBTkQgUFJJTkNJUEU6UHJpbmNpcGU6U1RQLkwyLjIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU1VSL1NVUl9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU1VSL1NVUl9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTRkOTk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TVVIvU1VSX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMTAgQEAKKzE6U1ItQlI6U1I6QlJPS09QT05ETworMjpTUi1DTTpTUjpDT01NRVdJSk5FCiszOlNSLUNSOlNSOkNPUk9OSUUKKzQ6U1ItTUE6U1I6TUFST1dJSk5FCis1OlNSLU5JOlNSOk5JQ0tFUklFCis2OlNSLVBSOlNSOlBBUkEKKzc6U1ItUE06U1I6UEFSQU1BUklCTworODpTUi1TQTpTUjpTQVJBTUFDQ0EKKzk6U1ItU0k6U1I6U0lQQUxJV0lOSQorMTA6U1ItV0E6U1I6V0FOSUNBCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NVUi9TVVJfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NVUi9TVVJfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE2MWI1YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU1VSL1NVUl9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDYzIEBACisxOlNSOlNVUjpTVVJJTkFNRTpVTktOT1dOOklzbGEKKzE6U1I6U1VSOlNVUklOQU1FOlBBUkE6QmlnaSBQb2lrYQorMjpTUjpTVVI6U1VSSU5BTUU6UEFSQTpDYXJvbGluYQorMzpTUjpTVVI6U1VSSU5BTUU6UEFSQTpOb29yZAorNDpTUjpTVVI6U1VSSU5BTUU6UEFSQTpPb3N0Cis1OlNSOlNVUjpTVVJJTkFNRTpQQVJBOlp1aWQKKzE6U1I6U1VSOlNVUklOQU1FOldBTklDQTpEZSBOaWV1d2UgR3JvbmQKKzI6U1I6U1VSOlNVUklOQU1FOldBTklDQTpEb21idXJnCiszOlNSOlNVUjpTVVJJTkFNRTpXQU5JQ0E6SG91dHR1aW4KKzQ6U1I6U1VSOlNVUklOQU1FOldBTklDQTpLb2V3YXJhc2FuCis1OlNSOlNVUjpTVVJJTkFNRTpXQU5JQ0E6S3dhdHRhCis2OlNSOlNVUjpTVVJJTkFNRTpXQU5JQ0E6TGVseWRvcnAKKzc6U1I6U1VSOlNVUklOQU1FOldBTklDQTpTYXJhbWFjY2Fwb2xkZXIKKzE6U1I6U1VSOlNVUklOQU1FOk1BUk9XSUpORTpBbGJpbmEKKzI6U1I6U1VSOlNVUklOQU1FOk1BUk9XSUpORTpHYWxpYmkKKzM6U1I6U1VSOlNVUklOQU1FOk1BUk9XSUpORTpNb2VuZ28KKzQ6U1I6U1VSOlNVUklOQU1FOk1BUk9XSUpORTpNb2VuZ290YXBvZQorNTpTUjpTVVI6U1VSSU5BTUU6TUFST1dJSk5FOlBhdGFtYWNjYQorNjpTUjpTVVI6U1VSSU5BTUU6TUFST1dJSk5FOldhbmhhdHRpCisxOlNSOlNVUjpTVVJJTkFNRTpDT01NRVdJSk5FOkFsa21hYXIKKzI6U1I6U1VSOlNVUklOQU1FOkNPTU1FV0lKTkU6QmFra2kKKzM6U1I6U1VSOlNVUklOQU1FOkNPTU1FV0lKTkU6TWFyZ2FyZXRoYQorNDpTUjpTVVI6U1VSSU5BTUU6Q09NTUVXSUpORTpNZWVyem9yZworNTpTUjpTVVI6U1VSSU5BTUU6Q09NTUVXSUpORTpOdy4gQW1zdGVyZGFtCis2OlNSOlNVUjpTVVJJTkFNRTpDT01NRVdJSk5FOlRhbWFucmVkam8KKzE6U1I6U1VSOlNVUklOQU1FOkNPUk9OSUU6Sm9oYW5uYSBNYXJpYQorMjpTUjpTVVI6U1VSSU5BTUU6Q09ST05JRTpUb3RuZXNzCiszOlNSOlNVUjpTVVJJTkFNRTpDT1JPTklFOldlbGdlbGVnZW4KKzE6U1I6U1VSOlNVUklOQU1FOk5JQ0tFUklFOkdyb290IEhlbmFyCisyOlNSOlNVUjpTVVJJTkFNRTpOSUNLRVJJRTpOdyAuIE5pY2tlcmllCiszOlNSOlNVUjpTVVJJTkFNRTpOSUNLRVJJRTpPb3N0ZWxpamtlIFBvbGRlcnMKKzQ6U1I6U1VSOlNVUklOQU1FOk5JQ0tFUklFOldhZ2VuaW5nZW4KKzU6U1I6U1VSOlNVUklOQU1FOk5JQ0tFUklFOldlc3RlbGlqa2UgUG9sZGVycworMTpTUjpTVVI6U1VSSU5BTUU6UEFSQU1BUklCTzpCZWVraHVpemVuCisyOlNSOlNVUjpTVVJJTkFNRTpQQVJBTUFSSUJPOkJsYXV3Z3JvbmQKKzM6U1I6U1VSOlNVUklOQU1FOlBBUkFNQVJJQk86Q2VudHJ1bQorNDpTUjpTVVI6U1VSSU5BTUU6UEFSQU1BUklCTzpGbG9yYQorNTpTUjpTVVI6U1VSSU5BTUU6UEFSQU1BUklCTzpMYXRvdXIKKzY6U1I6U1VSOlNVUklOQU1FOlBBUkFNQVJJQk86TGl2b3JubworNzpTUjpTVVI6U1VSSU5BTUU6UEFSQU1BUklCTzpNdW5kZXIKKzg6U1I6U1VSOlNVUklOQU1FOlBBUkFNQVJJQk86UG9udGJ1aXRlbgorOTpTUjpTVVI6U1VSSU5BTUU6UEFSQU1BUklCTzpSYWludmlsbGUKKzEwOlNSOlNVUjpTVVJJTkFNRTpQQVJBTUFSSUJPOlRhbW1lbmdhCisxMTpTUjpTVVI6U1VSSU5BTUU6UEFSQU1BUklCTzpXZWcgTmFhciBaZWUKKzEyOlNSOlNVUjpTVVJJTkFNRTpQQVJBTUFSSUJPOldlbGdlbGVnZW4KKzE6U1I6U1VSOlNVUklOQU1FOkJST0tPUE9ORE86QnJvd25zd2VnCisyOlNSOlNVUjpTVVJJTkFNRTpCUk9LT1BPTkRPOkNlbnRydW0KKzM6U1I6U1VSOlNVUklOQU1FOkJST0tPUE9ORE86S2xhYXNrcmVlaworNDpTUjpTVVI6U1VSSU5BTUU6QlJPS09QT05ETzpLd2Frb2Vncm9uCis1OlNSOlNVUjpTVVJJTkFNRTpCUk9LT1BPTkRPOk1hcmVjaGFsc2tyZWVrCis2OlNSOlNVUjpTVVJJTkFNRTpCUk9LT1BPTkRPOlNhcmFrcmVlaworMTpTUjpTVVI6U1VSSU5BTUU6U0FSQU1BQ0NBOkNhbGN1dHRhCisyOlNSOlNVUjpTVVJJTkFNRTpTQVJBTUFDQ0E6R3JvbmluZ2VuCiszOlNSOlNVUjpTVVJJTkFNRTpTQVJBTUFDQ0E6SmFyaWthYmEKKzQ6U1I6U1VSOlNVUklOQU1FOlNBUkFNQUNDQTpLYW1wb25nIEJhcm9lCis1OlNSOlNVUjpTVVJJTkFNRTpTQVJBTUFDQ0E6VGlqZ2Vya3JlZWsKKzY6U1I6U1VSOlNVUklOQU1FOlNBUkFNQUNDQTpXYXlhbWJvIFdlZworMTpTUjpTVVI6U1VSSU5BTUU6U0lQQUxJV0lOSTpCb3ZlbiBTdXJpbmFtZQorMjpTUjpTVVI6U1VSSU5BTUU6U0lQQUxJV0lOSTpCdmVuIFNhcmFtYWNjYQorMzpTUjpTVVI6U1VSSU5BTUU6U0lQQUxJV0lOSTpDb2Vyb2VuaQorNDpTUjpTVVI6U1VSSU5BTUU6U0lQQUxJV0lOSTpDb3BwZW5hbWUKKzU6U1I6U1VSOlNVUklOQU1FOlNJUEFMSVdJTkk6S2FiYWxlYm8KKzY6U1I6U1VSOlNVUklOQU1FOlNJUEFMSVdJTkk6VGFwYW5haG9ueQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TVk4vU1ZOX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TVk4vU1ZOX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZGI5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NWTi9TVk5fQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxNjYgQEAKKzE6U0ktMDA6U0k6QUpET1ZFSU5BCisyOlNJLTkwOlNJOkFMRUMKKzM6U0ktMDMzOlNJOkFMT1ZDSQorNDpTSS0wMDI6U0k6QkVMVElOQ0kKKzU6U0ktNDg6U0k6QkVORURJS1QKKzY6U0ktNDk6U0k6QklTVFJJQ0EgT0IgU09UTEkKKzc6U0ktMDAzOlNJOkJMRUQKKzg6U0ktNTA6U0k6QkxPS0UKKzk6U0ktMDA0OlNJOkJPSElOSgorMTA6U0ktMDA1OlNJOkJPUk9WTklDQQorMTE6U0ktMDA2OlNJOkJPVkVDCisxMjpTSS01OlNJOkJSQVNMT1ZFRQorMTM6U0ktMDA3OlNJOkJSREEKKzE0OlNJLTAwOTpTSTpCUkVJQ0UKKzE1OlNJLTAwODpTSTpCUkVaT1ZJQ0EKKzE2OlNJLTUyOlNJOkNBTktPVkEKKzE3OlNJLTA6U0k6Q0VMSkUKKzE4OlNJLTAyOlNJOkNFUktMSkUgTkEgR09SRU5KU0tFTQorMTk6U0ktMDM6U0k6Q0VSS05JQ0EKKzIwOlNJLTA0OlNJOkNFUktOTworMjE6U0ktNTM6U0k6Q0VSS1ZFTkpBSworMjI6U0ktMDg6U0k6REVTVFJOSUsKKzIzOlNJLTA5OlNJOkRJVkFFQQorMjQ6U0ktNTQ6U0k6RE9CSkUKKzI1OlNJLTAyMDpTSTpET0JSRVBPTEpFCisyNjpTSS01NTpTSTpET0JSTkEKKzI3OlNJLTU2OlNJOkRPQlJPVk5JS1tET0JST05BS10KKzI4OlNJLTAyMjpTSTpET0wgUFJJIExKVUJMSkFOSQorMjk6U0ktNTc6U0k6RE9MRU5KU0tFIFRPUExJQ0UKKzMwOlNJLTAyMzpTSTpET01BTEUKKzMxOlNJLTAyNDpTSTpET1JOQVZBCiszMjpTSS0wMjU6U0k6RFJBVk9HUkFECiszMzpTSS0wMjY6U0k6RFVQTEVLCiszNDpTSS00NjpTSTpFTEVaTklLSQorMzU6U0ktODM6U0k6RU1QRVRFUiBWUlRPSkJBCiszNjpTSS05OlNJOkVOVEpFUk5FSgorMzc6U0ktMjA6U0k6RU5USlVSIFBSSSBDRUxKVQorMzg6U0ktMDI3OlNJOkdPUkVOSkEgVkFTIFBPTEpBTkUKKzM5OlNJLTAyODpTSTpHT1JJTklDQQorNDA6U0ktMDI5OlNJOkdPUk5KQSBSQURHT05BCis0MTpTSS0wMzA6U0k6R09STkpJIEdSQUQKKzQyOlNJLTU4OlNJOkdSQUQKKzQzOlNJLTAzMjpTSTpHUk9TVVBMSkUKKzQ0OlNJLTU5OlNJOkhBSkRJTkEKKzQ1OlNJLTY6U0k6SE9ET1tIT0RPU10KKzQ2OlNJLTYwOlNJOkhPRUUgU0xJVk5JQ0EKKzQ3OlNJLTYyOlNJOkhPUkpVTAorNDg6U0ktMDM0OlNJOkhSQVNUTklLCis0OTpTSS0wMzU6U0k6SFJQRUxKRSBLT1pJTkEKKzUwOlNJLTAzNjpTSTpJRFJJSkEKKzUxOlNJLTAzNzpTSTpJRworNTI6U0ktMDM4OlNJOklMSVJTS0EgQklTVFJJQ0EKKzUzOlNJLTQ3OlNJOklSSQorNTQ6U0ktOTI6U0k6SVJPVk5JQ0EKKzU1OlNJLTAzOTpTSTpJVkFORU5BIEdPUklDQQorNTY6U0ktMDQwOlNJOklaT0xBW0lTT0xBXQorNTc6U0ktNjM6U0k6SkVaRVJTS08KKzU4OlNJLTA0MjpTSTpKVVJJTkNJCis1OTpTSS0wNDM6U0k6S0FNTklLCis2MDpTSS0wNDQ6U0k6S0FOQUwKKzYxOlNJLTA0NTpTSTpLSURSSUVFVk8KKzYyOlNJLTA0NjpTSTpLT0JBUklECis2MzpTSS0wNDc6U0k6S09CSUxKRQorNjQ6U0ktMDQ4OlNJOktPRUVWSkUKKzY1OlNJLTIyOlNJOktPRkpBIExPS0EKKzY2OlNJLTIzOlNJOktPRkxKSUNBCis2NzpTSS0wNDk6U0k6S09NRU4KKzY4OlNJLTY0OlNJOktPTUVOREEKKzY5OlNJLTA1MDpTSTpLT1BFUltDQVBPRElTVFJJQV0KKzcwOlNJLTY1OlNJOktPU1RFTAorNzE6U0ktMDUyOlNJOktSQU5KCis3MjpTSS0wNTM6U0k6S1JBTkpTS0EgR09SQQorNzM6U0ktNjY6U0k6S1JJRVZDSQorNzQ6U0ktMDU0OlNJOktSS08KKzc1OlNJLTA1NTpTSTpLVU5HT1RBCis3NjpTSS0wNTY6U0k6S1VaTUEKKzc3OlNJLTA1NzpTSTpMQUtPCis3ODpTSS0wNTg6U0k6TEVOQVJUCis3OTpTSS0wNTk6U0k6TEVOREFWQVtMRU5EVkFdCis4MDpTSS0wNjA6U0k6TElUSUpBCis4MTpTSS0wNjI6U0k6TEpVQk5PCis4MjpTSS0wNjM6U0k6TEpVVE9NRVIKKzgzOlNJLTA2NDpTSTpMT0dBVEVDCis4NDpTSS0wNjU6U0k6TE9LQSBET0xJTkEKKzg1OlNJLTA2NjpTSTpMT0tJIFBPVE9LCis4NjpTSS02NzpTSTpMT1ZSRU5DIE5BIFBPSE9SSlUKKzg3OlNJLTA2NzpTSTpMVUVFCis4ODpTSS0wNjg6U0k6TFVLT1ZJQ0EKKzg5OlNJLTA2OTpTSTpNQUpQRVJLCis5MDpTSS0wNzA6U0k6TUFSSUJPUgorOTE6U0ktMjQ6U0k6TUFSSkUgUFJJIEpFTEFICis5MjpTSS02ODpTSTpNQVJLT1ZDSQorOTM6U0ktMjU6U0k6TUFSVE5PIE9CIFBBS0kKKzk0OlNJLTk0OlNJOk1BUlROTyBQUkkgTElUSUpJCis5NTpTSS0wNzQ6U0k6TUVJQ0EKKzk2OlNJLTA3MjpTSTpNRU5HRQorOTc6U0ktMDczOlNJOk1FVExJS0EKKzk4OlNJLTY5OlNJOk1JS0xBViBOQSBEUkFWU0tFTSBQT0xKVQorOTk6U0ktMDc1OlNJOk1JUkVOIEtPU1RBTkpFVklDQQorMTAwOlNJLTcwOlNJOk1JUk5BIFBFRQorMTAxOlNJLTA3NjpTSTpNSVNMSU5KQQorMTAyOlNJLTA3NzpTSTpNT1JBVkVFCisxMDM6U0ktMDc4OlNJOk1PUkFWU0tFIFRPUExJQ0UKKzEwNDpTSS0wNzk6U0k6TU9aSVJKRQorMTA1OlNJLTA4MDpTSTpNVVJTS0EgU09CT1RBCisxMDY6U0ktMDgyOlNJOk5BS0xPCisxMDc6U0ktMDgzOlNJOk5BWkFSSkUKKzEwODpTSS0wODQ6U0k6Tk9WQSBHT1JJQ0EKKzEwOTpTSS0wODU6U0k6Tk9WTyBNRVNUTworMTEwOlNJLTA4NjpTSTpPRFJBTkNJCisxMTE6U0ktNzpTSTpPUExPVE5JQ0EKKzExMjpTSS0wODc6U0k6T1JNTworMTEzOlNJLTA4ODpTSTpPU0lMTklDQQorMTE0OlNJLTI2OlNJOk9UQU5KCisxMTU6U0ktMDg5OlNJOlBFU05JQ0EKKzExNjpTSS0wOTA6U0k6UElSQU5bUElSQU5PXQorMTE3OlNJLTA5MjpTSTpQT0RFRVRSVEVLCisxMTg6U0ktNzI6U0k6UE9ETEVITklLCisxMTk6U0ktMDkzOlNJOlBPRFZFTEtBCisxMjA6U0ktNzM6U0k6UE9MWkVMQQorMTIxOlNJLTA5NDpTSTpQT1NUT0pOQQorMTIyOlNJLTc0OlNJOlBSRUJPTEQKKzEyMzpTSS0wOTU6U0k6UFJFRERWT1IKKzEyNDpTSS03NTpTSTpQUkVWQUxKRQorMTI1OlNJLTA5NjpTSTpQVFVKCisxMjY6U0ktMDk3OlNJOlBVQ09OQ0kKKzEyNzpTSS0wOTk6U0k6UkFERUVFCisxMjg6U0ktMDk4OlNJOlJBRUUgRlJBTQorMTI5OlNJLTc2OlNJOlJBWktSSUpFCisxMzA6U0ktMDU6U0k6UkVOT1ZDSQorMTMxOlNJLTc3OlNJOlJJQk5JQ0EgTkEgUE9IT1JKVQorMTMyOlNJLTA2OlNJOlJOQSBOQSBLT1JPS0VNCisxMzM6U0ktMDc6U0k6Uk5PTUVMSgorMTM0OlNJLTpTSTpTRUFOQQorMTM1OlNJLTc4OlNJOlNFTE5JQ0EgT0IgRFJBVkkKKzEzNjpTSS0wMTpTSTpTTE9WRU5JSkEKKzEzNzpTSS0yOlNJOlNMT1ZFTkogR1JBREVDCisxMzg6U0ktMzpTSTpTTE9WRU5TS0EgQklTVFJJQ0EKKzEzOTpTSS00OlNJOlNMT1ZFTlNLRSBLT05KSUNFCisxNDA6U0ktNzk6U0k6U09EUkFJQ0EKKzE0MTpTSS04MDpTSTpTT0xFQVZBCisxNDI6U0ktODpTSTpTVkVUQSBBTkEKKzE0MzpTSS04MjpTSTpTVkVUSSBBTkRSQSBWIFNMT1ZFTlNLSUggR09SSUNBSAorMTQ0OlNJLTg0OlNJOlRBQk9SCisxNDU6U0ktMjg6U0k6VE9MTUlOCisxNDY6U0ktMjc6U0k6VE9SRQorMTQ3OlNJLTI5OlNJOlRSQk9WTEpFCisxNDg6U0ktMzA6U0k6VFJFQk5KRQorMTQ5OlNJLTg1OlNJOlRSTk9WU0tBIFZBUworMTUwOlNJLTg2OlNJOlRSWklOCisxNTE6U0ktMzI6U0k6VFVSTklFRQorMTUyOlNJLTkzOlNJOlVFTUJFUksKKzE1MzpTSS0zMzpTSTpWRUxFTkpFCisxNTQ6U0ktODc6U0k6VkVMSUtBIFBPTEFOQQorMTU1OlNJLTM0OlNJOlZFTElLRSBMQUVFCisxNTY6U0ktODg6U0k6VkVSRUoKKzE1NzpTSS0zNTpTSTpWSURFTQorMTU4OlNJLTM2OlNJOlZJUEFWQQorMTU5OlNJLTM3OlNJOlZJVEFOSkUKKzE2MDpTSS0zODpTSTpWT0RJQ0UKKzE2MTpTSS0zOTpTSTpWT0pOSUsKKzE2MjpTSS04OTpTSTpWUkFOU0tPCisxNjM6U0ktNDA6U0k6VlJITklLQQorMTY0OlNJLTQyOlNJOlpBR09SSkUgT0IgU0FWSQorMTY1OlNJLTQzOlNJOlpBVlJFCisxNjY6U0ktNDQ6U0k6WlJFRUUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU1ZOL1NWTl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU1ZOL1NWTl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TVk4vU1ZOX0FETUlOMl9MRVgudHh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NXRS9TV0VfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NXRS9TV0VfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5NDU4YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU1dFL1NXRV9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDI4IEBACisxOlNFLUs6U0U6QkxFS0lOR0UKKzI6U0UtQkg6U0U6QpRIVVMKKzM6U0UtVzpTRTpEQUxBUk5BUyBMTiBbU0UgMjBdCis0OlNFLUk6U0U6R09UTEFORAorNTpTRS1YOlNFOkeEVkxFQk9SRworNjpTRS1OOlNFOkhBTExBTkQKKzc6U0UtRjpTRTpKlE5LlFBJTkcKKzg6U0UtWjpTRTpKhE1UTEFORAorOTpTRS1IOlNFOktBTE1BUgorMTA6U0UtS1A6U0U6S09QUEFSQkVSRworMTE6U0UtUkk6U0U6S1JJU1RJQU5TVEFECisxMjpTRS1HOlNFOktST05PQkVSRworMTM6U0UtTU86U0U6TUFMTZRIVVMKKzE0OlNFLUJEOlNFOk5PUlJCT1RURU4KKzE1OlNFLVQ6U0U6T1JFQlJPCisxNjpTRS1TVDpTRTpPU1RFUkeUVExBTkQKKzE3OlNFLVNLOlNFOlNLQVJBQk9SRworMTg6U0UtTTpTRTpTS05FIExOIFtTRSAyXQorMTk6U0UtRTpTRTpTVEVSR1RMQU5EUyBMTiBbU0UgMDVdCisyMDpTRS1BQjpTRTpTVE9DS0hPTE0KKzIxOlNFLUQ6U0U6U5RSTUxBTkQKKzIyOlNFLUM6U0U6VVBQU0FMQQorMjM6U0UtVTpTRTpWIFNUTUFOTEFORAorMjQ6U0UtTzpTRTpWU1RSQSBHVEFMQU5EUyBMTiBbU0UgNF0KKzI1OlNFLVM6U0U6VoRSTUxBTkQKKzI2OlNFLUFDOlNFOlaEU1RFUkJPVFRFTgorMjc6U0UtWTpTRTpWhFNURVJOT1JSTEFORAorMjg6U0UtTDpTRTpaTFZTQk9SRwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TV0UvU1dFX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TV0UvU1dFX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NXRS9TV0VfQURNSU4yX0xFWC50eHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU1lDL1NZQ19BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU1lDL1NZQ19BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWRlNzgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TWUMvU1lDX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMiBAQAorMTpTQy1NOlNDOk1BSEUgSVNMQU5ECisyOlNDLVA6U0M6UFJBU0xJTiBJU0xBTkQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU1lDL1NZQ19BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU1lDL1NZQ19BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGY1ODRjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TWUMvU1lDX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMiBAQAorMTpTQzpTWUM6U0VZQ0hFTExFUzpNYWhlIElzbGFuZDpTWUMuTDIuMgorMTpTQzpTWUM6U0VZQ0hFTExFUzpQcmFzbGluIElzbGFuZDpTWUMuTDIuMQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TWVIvU1lSX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TWVIvU1lSX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NWM4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1NZUi9TWVJfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxNCBAQAorMTpTWS1ITDpTWTpBTEVQUE8gKEhBTEFCKQorMjpTWS1SQTpTWTpBUiBSQVFRQUgKKzM6U1ktU1U6U1k6QVMgU1VXQVlEQQorNDpTWS1EUjpTWTpEQVJBCis1OlNZLURZOlNZOkRBWVIgQVogWkFXUgorNjpTWS1ESTpTWTpESU1BU0hRCis3OlNZLUhNOlNZOkhBTUFICis4OlNZLUhBOlNZOkhBU0FLQSAoQUwgSEFLU0EpCis5OlNZLUhJOlNZOkhPTVMgKEhJTVMpCisxMDpTWS1JRDpTWTpJRExJQgorMTE6U1ktUVU6U1k6S1VORUlUUkEgKEVMIFFVTkFZVElSQUgKKzEyOlNZLUxBOlNZOkxBVFRBS0lBIChBTCBMQURISVFJWUFICisxMzpTWS1SRDpTWTpSRiBESU1BU0hRCisxNDpTWS1UQTpTWTpUQVJUVVMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU1lSL1NZUl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvU1lSL1NZUl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjhmMjk3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9TWVIvU1lSX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMTMgQEAKKzE6U1k6U1lSOlNZUklBOkhhc2FrYSAoQWwgSGFrc2EpOlNZUi5MMi44CisxOlNZOlNZUjpTWVJJQTpEaW1hc2hxOlNZUi5MMi4xCisxOlNZOlNZUjpTWVJJQTpBciBSYXFxYWg6U1lSLkwyLjIKKzE6U1k6U1lSOlNZUklBOkxhdHRha2lhIChBbCBMYWRoaXFpeWFoOlNZUi5MMi40CisxOlNZOlNZUjpTWVJJQTpBcyBTdXdheWRhOlNZUi5MMi4xMAorMTpTWTpTWVI6U1lSSUE6VGFydHVzOlNZUi5MMi4xMworMTpTWTpTWVI6U1lSSUE6QWxlcHBvIChIYWxhYik6U1lSLkwyLjkKKzE6U1k6U1lSOlNZUklBOkt1bmVpdHJhIChFbCBRdW5heXRpcmFoOlNZUi5MMi4zCisxOlNZOlNZUjpTWVJJQTpIb21zIChIaW1zKTpTWVIuTDIuNworMTpTWTpTWVI6U1lSSUE6SGFtYWg6U1lSLkwyLjExCisxOlNZOlNZUjpTWVJJQTpJZGxpYjpTWVIuTDIuNQorMTpTWTpTWVI6U1lSSUE6RGFyYTpTWVIuTDIuMTIKKzE6U1k6U1lSOlNZUklBOkRheXIgQXogWmF3cjpTWVIuTDIuNgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9UQ0QvVENEX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9UQ0QvVENEX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NzU1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1RDRC9UQ0RfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxNCBAQAorMTpURC1CQTpURDpCQVRIQQorMjpURC1CSTpURDpCSUxUSU5FCiszOlRELUJFVDpURDpCT1JLT1UgRU5ORURJIFRJQkVTVEkKKzQ6VEQtQ0I6VEQ6Q0hBUkkgQkFHVUlSTUkKKzU6VEQtR1I6VEQ6R1VFUkEKKzY6VEQtS0E6VEQ6S0FORU0KKzc6VEQtTEM6VEQ6TEFLRQorODpURC1MTzpURDpMT0dPTkUgT0NDSURFTgorOTpURC1MUjpURDpMT0dPTkUgT1JJRU5UQQorMTA6VEQtTUs6VEQ6TUFZTyBLRUJCSQorMTE6VEQtTUM6VEQ6TU9ZRU4gQ0hBUkkKKzEyOlRELU9EOlREOk9VQUREQUkKKzEzOlRELVNBOlREOlNBTEFNQVQKKzE0OlRELVRBOlREOlRBTkRKSUxFCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1RDRC9UQ0RfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1RDRC9UQ0RfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEwNWQzMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVENEL1RDRF9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDE0IEBACisxOlREOlRDRDpDSEFEOkxha2U6Qm9sCisxOlREOlRDRDpDSEFEOkNoYXJpLUJhZ3Vpcm1pOk1hc3Nha29yeQorMTpURDpUQ0Q6Q0hBRDpNb3llbi1DaGFyaTpLeWFiZQorMTpURDpUQ0Q6Q0hBRDpLYW5lbTpOb2tvdQorMTpURDpUQ0Q6Q0hBRDpCYXRoYTpEamVkYWEKKzE6VEQ6VENEOkNIQUQ6TWF5by1LZWJiaTpCb25nb3IKKzE6VEQ6VENEOkNIQUQ6TG9nb25lIE9yaWVudGE6RG9iYQorMTpURDpUQ0Q6Q0hBRDpTYWxhbWF0OkFib3UgRGVpYQorMTpURDpUQ0Q6Q0hBRDpCb3Jrb3UtRW5uZWRpLVRpYmVzdGk6VGliZXN0aQorMTpURDpUQ0Q6Q0hBRDpMb2dvbmUgT2NjaWRlbjpCZW5veWUKKzE6VEQ6VENEOkNIQUQ6VGFuZGppbGU6TGFpCisxOlREOlRDRDpDSEFEOk91YWRkYWk6QWJlY2hlCisxOlREOlRDRDpDSEFEOkd1ZXJhOk1hbmdhbG1lCisxOlREOlRDRDpDSEFEOkJpbHRpbmU6SXJpYmEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVEdPL1RHT19BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVEdPL1RHT19BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODM5MWIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9UR08vVEdPX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsNSBAQAorMTpURy1DOlRHOkNFTlRSRSBbQ0VOVFJFMV0KKzI6VEctSzpURzpLQVJBCiszOlRHLU06VEc6TUFSSVRJTUUKKzQ6VEctUDpURzpQTEFURUFVWAorNTpURy1TOlRHOlNBVkFOTkVTIFtTQVZBTkVTXQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9UR08vVEdPX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9UR08vVEdPX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzN2QzMTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1RHTy9UR09fQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSwyMSBAQAorMTpURzpUR086VE9HTzpDZW50cmU6U290b3Vib3VhCisyOlRHOlRHTzpUT0dPOkNlbnRyZTpUY2hhbWJhIChOeWFsYSkKKzM6VEc6VEdPOlRPR086Q2VudHJlOlRjaGF1ZGpvCisxOlRHOlRHTzpUT0dPOkthcmE6QXNzb2xpCisyOlRHOlRHTzpUT0dPOkthcmE6QmFzc2FyCiszOlRHOlRHTzpUT0dPOkthcmE6QmltYWgKKzQ6VEc6VEdPOlRPR086S2FyYTpEb3VmZWxnb3UKKzU6VEc6VEdPOlRPR086S2FyYTpLZXJhbgorNjpURzpUR086VE9HTzpLYXJhOktvemFoCisxOlRHOlRHTzpUT0dPOk1hcml0aW1lOkdvbGZlIChpbmNsIExvbWUpCisyOlRHOlRHTzpUT0dPOk1hcml0aW1lOkxhY3MKKzM6VEc6VEdPOlRPR086TWFyaXRpbWU6Vm8KKzQ6VEc6VEdPOlRPR086TWFyaXRpbWU6WW90bworNTpURzpUR086VE9HTzpNYXJpdGltZTpaaW8KKzE6VEc6VEdPOlRPR086U2F2YW5lczpPdGkKKzI6VEc6VEdPOlRPR086U2F2YW5lczpUb25lCisxOlRHOlRHTzpUT0dPOlBsYXRlYXV4OkFtb3UKKzI6VEc6VEdPOlRPR086UGxhdGVhdXg6SGFobworMzpURzpUR086VE9HTzpQbGF0ZWF1eDpLbG90bworNDpURzpUR086VE9HTzpQbGF0ZWF1eDpPZ291Cis1OlRHOlRHTzpUT0dPOlBsYXRlYXV4Oldhd2EKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVEhBL1RIQV9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVEhBL1RIQV9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDU2ZWFjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9USEEvVEhBX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsNzMgQEAKKzE6VEgtMzc6VEg6QU1OQVQgQ0hBUk9FTgorMjpUSC01OlRIOkFORyBUSE9ORworMzpUSC0wOlRIOkJBTkdLT0sKKzQ6VEgtMzpUSDpCVVJJIFJBTQorNTpUSC1DOlRIOkNFTlRSQUwKKzY6VEgtMjQ6VEg6Q0hBQ0hPRU5HU0FPCis3OlRILTg6VEg6Q0hBSSBOQVQKKzg6VEgtMzY6VEg6Q0hBSVlBUEhVTQorOTpUSC0yMjpUSDpDSEFOVEhBQlVSSQorMTA6VEgtNTA6VEg6Q0hJQU5HIE1BSQorMTE6VEgtNTc6VEg6Q0hJQU5HIFJBSQorMTI6VEgtMjA6VEg6Q0hPTiBCVVJJCisxMzpUSC04NjpUSDpDSFVNUEhPTgorMTQ6VEgtNDY6VEg6S0FMQVNJTgorMTU6VEgtNjI6VEg6S0FNUEhBRU5HIFBIRVQKKzE2OlRILTc6VEg6S0FOQ0hBTkFCVVJJCisxNzpUSC00MDpUSDpLSE9OIEtBRU4KKzE4OlRILTUyOlRIOkxBTVBBTkcKKzE5OlRILTQyOlRIOkxPRUkKKzIwOlRILTY6VEg6TE9QIEJVUkkKKzIxOlRILTU4OlRIOk1BRSBIT05HIFNPTgorMjI6VEgtNDQ6VEg6TUFIQSBTQVJBS0hBTQorMjM6VEgtNDk6VEg6TVVLREFIQU4KKzI0OlRILTI2OlRIOk5BS0hPTiBOQVlPSworMjU6VEgtNzM6VEg6TkFLSE9OIFBBVEhPTQorMjY6VEgtNDg6VEg6TkFLSE9OIFBIQU5PTQorMjc6VEgtMzA6VEg6TkFLSE9OIFJBVENIQVNJTUEKKzI4OlRILTYwOlRIOk5BS0hPTiBTQVdBTgorMjk6VEgtODA6VEg6TkFLSE9OIFNJIFRIQU1NQVJBVAorMzA6VEgtNTU6VEg6TkFOCiszMTpUSC05NjpUSDpOQVJBVEhJV0FUCiszMjpUSC0zOTpUSDpOT05HIEJVQSBMQU0gUEhVCiszMzpUSC00MzpUSDpOT05HIEtIQUkKKzM0OlRILTI6VEg6Tk9OVEhBQlVSSQorMzU6VEgtTkU6VEg6Tk9SVEhFQVNURVJOCiszNjpUSC1OOlRIOk5PUlRIRVJOCiszNzpUSC05NDpUSDpQQVRUQU5JCiszODpUSC04MjpUSDpQSEFOR05HQQorMzk6VEgtOTM6VEg6UEhBVFRIQUxVTkcKKzQwOlRILTU2OlRIOlBIQVlBTworNDE6VEgtNjc6VEg6UEhFVENIQUJVTgorNDI6VEgtNzY6VEg6UEhFVENIQUJVUkkKKzQzOlRILTY2OlRIOlBISUNISVQKKzQ0OlRILTY1OlRIOlBISVRTQU5VTE9LCis0NTpUSC00OlRIOlBIUkEgTkFLSE9OIFNJIEFZVVRUSEFZQQorNDY6VEgtNTQ6VEg6UEhSQUUKKzQ3OlRILTgzOlRIOlBIVUtFVAorNDg6VEgtMjU6VEg6UFJBQ0hJTiBCVVJJCis0OTpUSC03NzpUSDpQUkFDSFVBUCBLSElSSSBLSEFOCis1MDpUSC04NTpUSDpSQU5PTkcKKzUxOlRILTcwOlRIOlJBVENIQUJVUkkKKzUyOlRILTQ1OlRIOlJPSSBFVAorNTM6VEgtMjc6VEg6U0EgS0FFTworNTQ6VEgtNDc6VEg6U0FLT04gTkFLSE9OCis1NTpUSC04MTpUSDpTQU1VVCBQUkFLQU4KKzU2OlRILTc0OlRIOlNBTVVUIFNBS0hPTgorNTc6VEgtNzU6VEg6U0FNVVQgU09OR0tIUkFNCis1ODpUSC03OTpUSDpTQVJBQlVSSQorNTk6VEgtOTpUSDpTQVRVTgorNjA6VEgtMzM6VEg6U0kgU0EgS0VUCis2MTpUSC05MDpUSDpTT05HS0hMQQorNjI6VEgtUzpUSDpTT1VUSEVSTgorNjM6VEgtNjQ6VEg6U1VLSE9USEFJCis2NDpUSC03MjpUSDpTVVBIQU4gQlVSSQorNjU6VEgtODQ6VEg6U1VSQVQgVEhBTkkKKzY2OlRILTMyOlRIOlNVUklOCis2NzpUSC02MzpUSDpUQUsKKzY4OlRILTkyOlRIOlRSQU5HCis2OTpUSC0yMzpUSDpUUkFUCis3MDpUSC0zNDpUSDpVQk9OIFJBVENIQVRIQU5JCis3MTpUSC01MzpUSDpVVFRBUkFESVQKKzcyOlRILTk1OlRIOllBTEEKKzczOlRILTM1OlRIOllBU09USE9OCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1RIQS9USEFfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1RIQS9USEFfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiNjlhNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVEhBL1RIQV9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDcyIEBACisxOlRIOlRIQTpUSEFJTEFORDpTb3V0aGVybjpDaHVtcGhvbgorMjpUSDpUSEE6VEhBSUxBTkQ6U291dGhlcm46S3JhYmkKKzM6VEg6VEhBOlRIQUlMQU5EOlNvdXRoZXJuOk5ha2hvbiBUaGFtbWFyYXQKKzQ6VEg6VEhBOlRIQUlMQU5EOlNvdXRoZXJuOk5hcmF0aGl3YXQKKzU6VEg6VEhBOlRIQUlMQU5EOlNvdXRoZXJuOlBhdHRhbmkKKzY6VEg6VEhBOlRIQUlMQU5EOlNvdXRoZXJuOlBoYW5nbmdhCis3OlRIOlRIQTpUSEFJTEFORDpTb3V0aGVybjpQaGF0dGhhbHVuZworODpUSDpUSEE6VEhBSUxBTkQ6U291dGhlcm46UGh1a2V0Cis5OlRIOlRIQTpUSEFJTEFORDpTb3V0aGVybjpSYW5vbmcKKzEwOlRIOlRIQTpUSEFJTEFORDpTb3V0aGVybjpTYXR1bgorMTE6VEg6VEhBOlRIQUlMQU5EOlNvdXRoZXJuOlNvbmdraGxhCisxMjpUSDpUSEE6VEhBSUxBTkQ6U291dGhlcm46U3VyYXQgVGhhbmkKKzEzOlRIOlRIQTpUSEFJTEFORDpTb3V0aGVybjpUcmFuZworMTQ6VEg6VEhBOlRIQUlMQU5EOlNvdXRoZXJuOllhbGEKKzE6VEg6VEhBOlRIQUlMQU5EOk5vcnRoZWFzdGVybjpCdXJpIFJ1bQorMjpUSDpUSEE6VEhBSUxBTkQ6Tm9ydGhlYXN0ZXJuOkNoYWl5YXBodW0KKzM6VEg6VEhBOlRIQUlMQU5EOk5vcnRoZWFzdGVybjpLYWxhc2luCis0OlRIOlRIQTpUSEFJTEFORDpOb3J0aGVhc3Rlcm46S2hvbiBLYWVuCis1OlRIOlRIQTpUSEFJTEFORDpOb3J0aGVhc3Rlcm46TG9laQorNjpUSDpUSEE6VEhBSUxBTkQ6Tm9ydGhlYXN0ZXJuOk1haGEgU2FyYWtoYW0KKzc6VEg6VEhBOlRIQUlMQU5EOk5vcnRoZWFzdGVybjpOYWtob24gUGhhbm9tICYgTXVrZGFoYW4KKzg6VEg6VEhBOlRIQUlMQU5EOk5vcnRoZWFzdGVybjpOYWtob24gUmF0Y2hhc2ltYQorOTpUSDpUSEE6VEhBSUxBTkQ6Tm9ydGhlYXN0ZXJuOk5vbmcgS2hhaQorMTA6VEg6VEhBOlRIQUlMQU5EOk5vcnRoZWFzdGVybjpSb2kgRXQKKzExOlRIOlRIQTpUSEFJTEFORDpOb3J0aGVhc3Rlcm46U2Frb24gTmFraG9uCisxMjpUSDpUSEE6VEhBSUxBTkQ6Tm9ydGhlYXN0ZXJuOlNpc2FrZXQKKzEzOlRIOlRIQTpUSEFJTEFORDpOb3J0aGVhc3Rlcm46U3VyaW4KKzE0OlRIOlRIQTpUSEFJTEFORDpOb3J0aGVhc3Rlcm46VWJvbiBSYXRjaGF0aGFuaQorMTU6VEg6VEhBOlRIQUlMQU5EOk5vcnRoZWFzdGVybjpVZG9uIFRoYW5pCisxNjpUSDpUSEE6VEhBSUxBTkQ6Tm9ydGhlYXN0ZXJuOllhc290aG9uCisxOlRIOlRIQTpUSEFJTEFORDpDZW50cmFsOkFuZyBUaG9uZworMjpUSDpUSEE6VEhBSUxBTkQ6Q2VudHJhbDpDaGFjaG9lbmdzYW8KKzM6VEg6VEhBOlRIQUlMQU5EOkNlbnRyYWw6Q2hhaW5hdAorNDpUSDpUSEE6VEhBSUxBTkQ6Q2VudHJhbDpDaGFudGhhYnVyaQorNTpUSDpUSEE6VEhBSUxBTkQ6Q2VudHJhbDpDaG9uIEJ1cmkKKzY6VEg6VEhBOlRIQUlMQU5EOkNlbnRyYWw6S2FuY2hhbmFidXJpCis3OlRIOlRIQTpUSEFJTEFORDpDZW50cmFsOkxvcCBCdXJpCis4OlRIOlRIQTpUSEFJTEFORDpDZW50cmFsOk5ha2hvbiBQYXRob20KKzk6VEg6VEhBOlRIQUlMQU5EOkNlbnRyYWw6TmFrb24gTmF5b2sKKzEwOlRIOlRIQTpUSEFJTEFORDpDZW50cmFsOk5vbnRoYWJ1cmkKKzExOlRIOlRIQTpUSEFJTEFORDpDZW50cmFsOlBhdGh1bSBUaGFuaQorMTI6VEg6VEhBOlRIQUlMQU5EOkNlbnRyYWw6UGhldGNoYSBCdXJpCisxMzpUSDpUSEE6VEhBSUxBTkQ6Q2VudHJhbDpQaHJhbmFraG9uIFNpIEF5dXR0aGF5YQorMTQ6VEg6VEhBOlRIQUlMQU5EOkNlbnRyYWw6UHJhY2hpbiBCdXJpCisxNTpUSDpUSEE6VEhBSUxBTkQ6Q2VudHJhbDpQcmFjaHVhcCBLaGlyaSBLaGFuCisxNjpUSDpUSEE6VEhBSUxBTkQ6Q2VudHJhbDpSYXRjaGFidXJpCisxNzpUSDpUSEE6VEhBSUxBTkQ6Q2VudHJhbDpSYXlvbmcKKzE4OlRIOlRIQTpUSEFJTEFORDpDZW50cmFsOlNhbXV0IFByYWthbgorMTk6VEg6VEhBOlRIQUlMQU5EOkNlbnRyYWw6U2FtdXQgU2FraG9uCisyMDpUSDpUSEE6VEhBSUxBTkQ6Q2VudHJhbDpTYW11dCBTb25na2hyYW0KKzIxOlRIOlRIQTpUSEFJTEFORDpDZW50cmFsOlNhcmEgQnVyaQorMjI6VEg6VEhBOlRIQUlMQU5EOkNlbnRyYWw6U2luZyBCdXJpCisyMzpUSDpUSEE6VEhBSUxBTkQ6Q2VudHJhbDpTdXBoYW4gQnVyaQorMjQ6VEg6VEhBOlRIQUlMQU5EOkNlbnRyYWw6VHJhdAorMTpUSDpUSEE6VEhBSUxBTkQ6Tm9ydGhlcm46Q2hpYW5nIE1haQorMjpUSDpUSEE6VEhBSUxBTkQ6Tm9ydGhlcm46Q2hpYW5nIFJhaQorMzpUSDpUSEE6VEhBSUxBTkQ6Tm9ydGhlcm46S2FtcGhhZW5nIFBoZXQKKzQ6VEg6VEhBOlRIQUlMQU5EOk5vcnRoZXJuOkxhbXBhbmcKKzU6VEg6VEhBOlRIQUlMQU5EOk5vcnRoZXJuOkxhbXBodW4KKzY6VEg6VEhBOlRIQUlMQU5EOk5vcnRoZXJuOk1hZSBIb25nIFNvbgorNzpUSDpUSEE6VEhBSUxBTkQ6Tm9ydGhlcm46TmFraG9uIFNhd2FuCis4OlRIOlRIQTpUSEFJTEFORDpOb3J0aGVybjpOYW4KKzk6VEg6VEhBOlRIQUlMQU5EOk5vcnRoZXJuOlBoYXlhbworMTA6VEg6VEhBOlRIQUlMQU5EOk5vcnRoZXJuOlBoZXRjaGFidW4KKzExOlRIOlRIQTpUSEFJTEFORDpOb3J0aGVybjpQaGljaGl0CisxMjpUSDpUSEE6VEhBSUxBTkQ6Tm9ydGhlcm46UGhpdHNhbnVsb2sKKzEzOlRIOlRIQTpUSEFJTEFORDpOb3J0aGVybjpQaHJhZQorMTQ6VEg6VEhBOlRIQUlMQU5EOk5vcnRoZXJuOlN1a2hvdGhhaQorMTU6VEg6VEhBOlRIQUlMQU5EOk5vcnRoZXJuOlRhaworMTY6VEg6VEhBOlRIQUlMQU5EOk5vcnRoZXJuOlV0aGFpIFRoYW5pCisxNzpUSDpUSEE6VEhBSUxBTkQ6Tm9ydGhlcm46VXR0YXJhZGl0CisxOlRIOlRIQTpUSEFJTEFORDpCYW5na29rOktydW5nIE1haGFuYWtob24gKEJhbmdrLikKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVEpLL1RKS19BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVEpLL1RKS19BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjNlYmM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9USksvVEpLX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsNSBAQAorMTpUSi1HQjpUSjpHT1JOTyBCQURBS0hTSEFOCisyOlRKLUtUOlRKOktIQVRMT04KKzM6VEotTEU6VEo6TEVOSU5BQkFECis0OlRKLVNVOlRKOlNVR0hECis1OlRKLVRBOlRKOlRBRFpISUtJU1RBTiBURVJSSVRPUklFUwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9USksvVEpLX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9USksvVEpLX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Y2VkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1RKSy9USktfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSw0IEBACisxOlRKOlRKSzpUQUpJS0lTVEFOOktoYXRsb246VEpLLkwyLjEKKzE6VEo6VEpLOlRBSklLSVNUQU46R29ybm8tQmFkYWtoc2hhbjpUSksuTDIuMgorMTpUSjpUSks6VEFKSUtJU1RBTjpUYWR6aGlraXN0YW4gVGVycml0b3JpZXM6VEpLLkwyLjQKKzE6VEo6VEpLOlRBSklLSVNUQU46TGVuaW5hYmFkOlRKSy5MMi4zCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1RLTS9US01fQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1RLTS9US01fQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiMTgzMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVEtNL1RLTV9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDggQEAKKzE6VE0tQTpUTTpBSEFMCisyOlRNLUI6VE06QkFMS0FOCiszOlRNLUNIQTpUTTpDSEFSRFpIT1UKKzQ6VE0tRDpUTTpEQU9HVVoKKzU6VE0tTDpUTTpMRUJBUAorNjpUTS1NOlRNOk1BUlkKKzc6VE0tVEFTOlRNOlRBU0hBVVoKKzg6VE0tVFQ6VE06VFVSS01FTklTVEFOIFRFUlJJVE9SSUVTCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1RLTS9US01fQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1RLTS9US01fQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkNzM5YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVEtNL1RLTV9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDEzIEBACisxOlRNOlRLTTpUVVJLTUVOSVNUQU46VGFzaGF1ejpUS00uTDIuMTEKKzE6VE06VEtNOlRVUktNRU5JU1RBTjpDaGFyZHpob3U6VEtNLkwyLjEyCisxOlRNOlRLTTpUVVJLTUVOSVNUQU46TWFyeTpUS00uTDIuMTMKKzE6VE06VEtNOlRVUktNRU5JU1RBTjpUdXJrbWVuaXN0YW4gVGVycml0b3JpZXM6VEtNLkwyLjEKKzI6VE06VEtNOlRVUktNRU5JU1RBTjpUdXJrbWVuaXN0YW4gVGVycml0b3JpZXM6VEtNLkwyLjEwCiszOlRNOlRLTTpUVVJLTUVOSVNUQU46VHVya21lbmlzdGFuIFRlcnJpdG9yaWVzOlRLTS5MMi4yCis0OlRNOlRLTTpUVVJLTUVOSVNUQU46VHVya21lbmlzdGFuIFRlcnJpdG9yaWVzOlRLTS5MMi4zCis1OlRNOlRLTTpUVVJLTUVOSVNUQU46VHVya21lbmlzdGFuIFRlcnJpdG9yaWVzOlRLTS5MMi40Cis2OlRNOlRLTTpUVVJLTUVOSVNUQU46VHVya21lbmlzdGFuIFRlcnJpdG9yaWVzOlRLTS5MMi41Cis3OlRNOlRLTTpUVVJLTUVOSVNUQU46VHVya21lbmlzdGFuIFRlcnJpdG9yaWVzOlRLTS5MMi42Cis4OlRNOlRLTTpUVVJLTUVOSVNUQU46VHVya21lbmlzdGFuIFRlcnJpdG9yaWVzOlRLTS5MMi43Cis5OlRNOlRLTTpUVVJLTUVOSVNUQU46VHVya21lbmlzdGFuIFRlcnJpdG9yaWVzOlRLTS5MMi44CisxMDpUTTpUS006VFVSS01FTklTVEFOOlR1cmttZW5pc3RhbiBUZXJyaXRvcmllczpUS00uTDIuOQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9UVU4vVFVOX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9UVU4vVFVOX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NGFlOTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1RVTi9UVU5fQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwyOCBAQAorMTpUTi0zOlROOkJFSkEKKzI6VE4tMjM6VE46QklaRVJURQorMzpUTi04OlROOkdBQkVTCis0OlROLTc6VE46R0FGU0EKKzU6VE4tMzI6VE46SkVORE9VQkEKKzY6VE4tNDpUTjpLQUlST1VBTgorNzpUTi00MjpUTjpLQVNTRVJJTkUKKzg6VE4tNzM6VE46S0VCSUxJCis5OlROLTI6VE46TEFSSUFOQQorMTA6VE4tMzM6VE46TEUgS0VGCisxMTpUTi01MzpUTjpNQUhESUEKKzEyOlROLTgyOlROOk1FREVOSU5FCisxMzpUTi01MjpUTjpNT05BU1RJUgorMTQ6VE4tUjE6VE46UkVHSU9OIDEKKzE1OlROLVIyOlROOlJFR0lPTiAyCisxNjpUTi1SMzpUTjpSRUdJT04gMworMTc6VE4tUjQ6VE46UkVHSU9OIDQKKzE4OlROLVI1OlROOlJFR0lPTiA1CisxOTpUTi1SNjpUTjpSRUdJT04gNgorMjA6VE4tUjc6VE46UkVHSU9OIDcKKzIxOlROLTY6VE46U0ZBWAorMjI6VE4tNDM6VE46U0lESSBCT1VaSUQKKzIzOlROLTM0OlROOlNJTElBTkEKKzI0OlROLTU6VE46U09VU1NFCisyNTpUTi04MzpUTjpUQVRBT1VJTkUKKzI2OlROLTcyOlROOlRPWkVVUgorMjc6VE4tMTA6VE46VFVOSVMKKzI4OlROLTIyOlROOlpBR0hPVUFOCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1RVTi9UVU5fQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1RVTi9UVU5fQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2MzU0OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVFVOL1RVTl9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDIzIEBACisxOlROOlRVTjpUVU5JU0lBOlJlZ2lvbiAzOkFsLUthZgorMjpUTjpUVU46VFVOSVNJQTpSZWdpb24gMzpCZWphCiszOlROOlRVTjpUVU5JU0lBOlJlZ2lvbiAzOkRzY2h1bmR1YmEKKzQ6VE46VFVOOlRVTklTSUE6UmVnaW9uIDM6U2lsaWFuYQorMTpUTjpUVU46VFVOSVNJQTpSZWdpb24gNjpHYWZzYQorMjpUTjpUVU46VFVOSVNJQTpSZWdpb24gNjpLZWJpbGkKKzM6VE46VFVOOlRVTklTSUE6UmVnaW9uIDY6VG96ZXVyCisxOlROOlRVTjpUVU5JU0lBOlJlZ2lvbiAxOkFyaWFuYQorMjpUTjpUVU46VFVOSVNJQTpSZWdpb24gMTpCZW4gQXJvdXMgKFR1bmlzIFN1ZCkKKzM6VE46VFVOOlRVTklTSUE6UmVnaW9uIDE6VHVuaXMKKzE6VE46VFVOOlRVTklTSUE6UmVnaW9uIDU6TWFoZGlhCisyOlROOlRVTjpUVU5JU0lBOlJlZ2lvbiA1Ok1vbmFzdGlyCiszOlROOlRVTjpUVU5JU0lBOlJlZ2lvbiA1OlNmYXgKKzQ6VE46VFVOOlRVTklTSUE6UmVnaW9uIDU6U3VzYQorMTpUTjpUVU46VFVOSVNJQTpSZWdpb24gNzpHYWJlcworMjpUTjpUVU46VFVOSVNJQTpSZWdpb24gNzpNZWRlbmluZQorMzpUTjpUVU46VFVOSVNJQTpSZWdpb24gNzpUYXRhb3VpbmUKKzE6VE46VFVOOlRVTklTSUE6UmVnaW9uIDI6Qml6ZXJ0ZQorMjpUTjpUVU46VFVOSVNJQTpSZWdpb24gMjpOYWJ1bAorMzpUTjpUVU46VFVOSVNJQTpSZWdpb24gMjpTYWdodWFuCisxOlROOlRVTjpUVU5JU0lBOlJlZ2lvbiA0OkthaXJvdXdhbgorMjpUTjpUVU46VFVOSVNJQTpSZWdpb24gNDpLYXNzZXJpbmUKKzM6VE46VFVOOlRVTklTSUE6UmVnaW9uIDQ6U2lkaSBCdSBTYWlkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1RVUi9UVVJfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1RVUi9UVVJfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjMWZhOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVFVSL1RVUl9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDgxIEBACisxOlRSLTA6VFI6QURBTkEKKzI6VFItMDI6VFI6QURJWUFNQU4KKzM6VFItMDM6VFI6QUZZT04KKzQ6VFItMDQ6VFI6QUdSSQorNTpUUi02ODpUUjpBS1NBUkFZCis2OlRSLTA1OlRSOkFNQVNZQQorNzpUUi0wNjpUUjpBTktBUkEKKzg6VFItMDc6VFI6QU5UQUxZQQorOTpUUi03NTpUUjpBUkRBSEFOCisxMDpUUi0wODpUUjpBUlRWSU4KKzExOlRSLTA5OlRSOkFZRElOCisxMjpUUi0xMDpUUjpCQUxJS0VTSVIKKzEzOlRSLTc0OlRSOkJBUlROCisxNDpUUi03MjpUUjpCQVRNQU4KKzE1OlRSLTY5OlRSOkJBWUJVUlQKKzE2OlRSLTg3OlRSOkJJTEVDSUsKKzE3OlRSLTI6VFI6QklOR09MCisxODpUUi04MzpUUjpCSVRMSVMKKzE5OlRSLTQ6VFI6Qk9MVQorMjA6VFItODU6VFI6QlVSRFVSCisyMTpUUi05MDpUUjpCVVJTQQorMjI6VFItNzpUUjpDQU5BS0tBTEUKKzIzOlRSLTg6VFI6Q0FOS0lSSQorMjQ6VFItOTpUUjpDT1JVTQorMjU6VFItMjA6VFI6REVOSVpMSQorMjY6VFItODI6VFI6RElZQVJCQUtJUgorMjc6VFItMjI6VFI6RURJUk5FCisyODpUUi0yMzpUUjpFTEFaSUcKKzI5OlRSLTI0OlRSOkVSWklOQ0FOCiszMDpUUi0yNTpUUjpFUlpVUlVNCiszMTpUUi0yNjpUUjpFU0tJU0VISVIKKzMyOlRSLTI3OlRSOkdBWklBTlRFUAorMzM6VFItMjg6VFI6R0lSRVNVTgorMzQ6VFItMjk6VFI6R1VNVVNIQU5FCiszNTpUUi0zMDpUUjpIQUtLQVJJCiszNjpUUi0zOlRSOkhBVEFZCiszNzpUUi0zMzpUUjpJQ0VMCiszODpUUi03NjpUUjpJRFIKKzM5OlRSLTMyOlRSOklTUEFSVEEKKzQwOlRSLTM0OlRSOklTVEFOQlVMCis0MTpUUi0zNTpUUjpJWk1JUgorNDI6VFItS01BOlRSOksuIE1BUkFTCis0MzpUUi00NjpUUjpLQUhSQU1BTk1BUkEKKzQ0OlRSLTc4OlRSOktBUkFC3EsKKzQ1OlRSLTcwOlRSOktBUkFNQU4KKzQ2OlRSLTM2OlRSOktBUlMKKzQ3OlRSLTM3OlRSOktBU1RBTU9OVQorNDg6VFItMzg6VFI6S0FZU0VSSQorNDk6VFItNzk6VFI6S0lMSVMKKzUwOlRSLTg4OlRSOktJTktLQUxFCis1MTpUUi0zOTpUUjpLSVJLTEFSRUxJCis1MjpUUi00MDpUUjpLSVJTRUhJUgorNTM6VFItODQ6VFI6S09DQUVMSQorNTQ6VFItNDI6VFI6S09OWUEKKzU1OlRSLTQzOlRSOktVVEFIWUEKKzU2OlRSLTQ0OlRSOk1BTEFUWUEKKzU3OlRSLTQ1OlRSOk1BTklTQQorNTg6VFItNDc6VFI6TUFSRElOCis1OTpUUi00ODpUUjpNVUdMQQorNjA6VFItNDk6VFI6TVVTCis2MTpUUi01MDpUUjpORVZTRUhJUgorNjI6VFItNTpUUjpOSUdERQorNjM6VFItNTI6VFI6T1JEVQorNjQ6VFItODA6VFI6T1NNQU5JWUUKKzY1OlRSLTUzOlRSOlJJWkUKKzY2OlRSLTU0OlRSOlNBS0FSWUEKKzY3OlRSLTU1OlRSOlNBTVNVTgorNjg6VFItNjM6VFI6U0FOTElVUkZBCis2OTpUUi01NjpUUjpTSUlSVAorNzA6VFItNTc6VFI6U0lOT1AKKzcxOlRSLTczOlRSOlNJUk5BSworNzI6VFItNTg6VFI6U0lWQVMKKzczOlRSLTU5OlRSOlRFS0lSREFHCis3NDpUUi02MDpUUjpUT0tBVAorNzU6VFItNjpUUjpUUkFCWk9OCis3NjpUUi02MjpUUjpUVU5DRUxJCis3NzpUUi02NDpUUjpVU0FLCis3ODpUUi02NTpUUjpWQU4KKzc5OlRSLTc3OlRSOllBTE9WQQorODA6VFItNjY6VFI6WU9aR0FUCis4MTpUUi02NzpUUjpaSU5HVUxEQUsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVFVSL1RVUl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVFVSL1RVUl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2E0MTgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9UVVIvVFVSX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMTM2IEBACisxOlRSOlRVUjpUVVJLRVk6SXptaXI6VFVSLkwyLjEwCisyOlRSOlRVUjpUVVJLRVk6SXptaXI6VFVSLkwyLjExCiszOlRSOlRVUjpUVVJLRVk6SXptaXI6VFVSLkwyLjEyCis0OlRSOlRVUjpUVVJLRVk6SXptaXI6VFVSLkwyLjMKKzU6VFI6VFVSOlRVUktFWTpJem1pcjpUVVIuTDIuNAorNjpUUjpUVVI6VFVSS0VZOkl6bWlyOlRVUi5MMi41Cis3OlRSOlRVUjpUVVJLRVk6SXptaXI6VFVSLkwyLjYKKzg6VFI6VFVSOlRVUktFWTpJem1pcjpUVVIuTDIuNworOTpUUjpUVVI6VFVSS0VZOkl6bWlyOlRVUi5MMi44CisxMDpUUjpUVVI6VFVSS0VZOkl6bWlyOlRVUi5MMi45CisxOlRSOlRVUjpUVVJLRVk6U2FubGl1cmZhOlRVUi5MMi41NgorMTpUUjpUVVI6VFVSS0VZOkVyenVydW06VFVSLkwyLjM1CisxOlRSOlRVUjpUVVJLRVk6S2FyczpUVVIuTDIuMjkKKzE6VFI6VFVSOlRVUktFWTpHaXJlc3VuOlRVUi5MMi4yMworMTpUUjpUVVI6VFVSS0VZOklzdGFuYnVsOlRVUi5MMi42OQorMjpUUjpUVVI6VFVSS0VZOklzdGFuYnVsOlRVUi5MMi43MAorMzpUUjpUVVI6VFVSS0VZOklzdGFuYnVsOlRVUi5MMi43MQorNDpUUjpUVVI6VFVSS0VZOklzdGFuYnVsOlRVUi5MMi43MgorNTpUUjpUVVI6VFVSS0VZOklzdGFuYnVsOlRVUi5MMi43MworNjpUUjpUVVI6VFVSS0VZOklzdGFuYnVsOlRVUi5MMi43NAorNzpUUjpUVVI6VFVSS0VZOklzdGFuYnVsOlRVUi5MMi43NQorODpUUjpUVVI6VFVSS0VZOklzdGFuYnVsOlRVUi5MMi43NgorOTpUUjpUVVI6VFVSS0VZOklzdGFuYnVsOlRVUi5MMi43NworMTpUUjpUVVI6VFVSS0VZOkFncmk6VFVSLkwyLjY2CisxOlRSOlRVUjpUVVJLRVk6QmF0bWFuOlRVUi5MMi40OQorMTpUUjpUVVI6VFVSS0VZOktvbnlhOlRVUi5MMi4xMDEKKzE6VFI6VFVSOlRVUktFWTpZb3pnYXQ6VFVSLkwyLjU3CisxOlRSOlRVUjpUVVJLRVk6TmV2c2VoaXI6VFVSLkwyLjEyOQorMTpUUjpUVVI6VFVSS0VZOkVza2lzZWhpcjpUVVIuTDIuMTE2CisxOlRSOlRVUjpUVVJLRVk6Q29ydW06VFVSLkwyLjMxCisxOlRSOlRVUjpUVVJLRVk6T3JkdTpUVVIuTDIuMTE1CisxOlRSOlRVUjpUVVJLRVk6VGVraXJkYWc6VFVSLkwyLjEwMAorMTpUUjpUVVI6VFVSS0VZOlR1bmNlbGk6VFVSLkwyLjEyMworMTpUUjpUVVI6VFVSS0VZOkNhbmtpcmk6VFVSLkwyLjUyCisxOlRSOlRVUjpUVVJLRVk6S2FzdGFtb251OlRVUi5MMi4xMjgKKzE6VFI6VFVSOlRVUktFWTpLYXlzZXJpOlRVUi5MMi42OAorMTpUUjpUVVI6VFVSS0VZOlZhbjpUVVIuTDIuMjEKKzE6VFI6VFVSOlRVUktFWTpFcnppbmNhbjpUVVIuTDIuMTQKKzE6VFI6VFVSOlRVUktFWTpCaWxlY2lrOlRVUi5MMi41OAorMTpUUjpUVVI6VFVSS0VZOk1hbGF0eWE6VFVSLkwyLjEzMworMTpUUjpUVVI6VFVSS0VZOktvY2FlbGk6VFVSLkwyLjExNworMTpUUjpUVVI6VFVSS0VZOkNhbmFra2FsZTpUVVIuTDIuMTUKKzI6VFI6VFVSOlRVUktFWTpDYW5ha2thbGU6VFVSLkwyLjE2CiszOlRSOlRVUjpUVVJLRVk6Q2FuYWtrYWxlOlRVUi5MMi4xNworNDpUUjpUVVI6VFVSS0VZOkNhbmFra2FsZTpUVVIuTDIuMTgKKzU6VFI6VFVSOlRVUktFWTpDYW5ha2thbGU6VFVSLkwyLjE5Cis2OlRSOlRVUjpUVVJLRVk6Q2FuYWtrYWxlOlRVUi5MMi4yMAorMTpUUjpUVVI6VFVSS0VZOkF5ZGluOlRVUi5MMi42MQorMjpUUjpUVVI6VFVSS0VZOkF5ZGluOlRVUi5MMi42MgorMzpUUjpUVVI6VFVSS0VZOkF5ZGluOlRVUi5MMi42MworMTpUUjpUVVI6VFVSS0VZOkthcmFtYW46VFVSLkwyLjEzNQorMTpUUjpUVVI6VFVSS0VZOlppbmd1bGRhazpUVVIuTDIuMjUKKzE6VFI6VFVSOlRVUktFWTpCdXJkdXI6VFVSLkwyLjIyCisxOlRSOlRVUjpUVVJLRVk6VHJhYnpvbjpUVVIuTDIuMTMwCisxOlRSOlRVUjpUVVJLRVk6U2lybmFrOlRVUi5MMi41MQorMTpUUjpUVVI6VFVSS0VZOk1hbmlzYTpUVVIuTDIuMTI2CisxOlRSOlRVUjpUVVJLRVk6Qml0bGlzOlRVUi5MMi4xMjAKKzE6VFI6VFVSOlRVUktFWTpLaXJzZWhpcjpUVVIuTDIuMjQKKzE6VFI6VFVSOlRVUktFWTpEaXlhcmJha2lyOlRVUi5MMi41MAorMTpUUjpUVVI6VFVSS0VZOlVzYWs6VFVSLkwyLjYwCisxOlRSOlRVUjpUVVJLRVk6QWtzYXJheTpUVVIuTDIuMTIyCisxOlRSOlRVUjpUVVJLRVk6QW50YWx5YTpUVVIuTDIuMTA2CisyOlRSOlRVUjpUVVJLRVk6QW50YWx5YTpUVVIuTDIuMTA3CiszOlRSOlRVUjpUVVJLRVk6QW50YWx5YTpUVVIuTDIuMTA4Cis0OlRSOlRVUjpUVVJLRVk6QW50YWx5YTpUVVIuTDIuMTA5Cis1OlRSOlRVUjpUVVJLRVk6QW50YWx5YTpUVVIuTDIuMTEwCis2OlRSOlRVUjpUVVJLRVk6QW50YWx5YTpUVVIuTDIuMTExCis3OlRSOlRVUjpUVVJLRVk6QW50YWx5YTpUVVIuTDIuMTEyCis4OlRSOlRVUjpUVVJLRVk6QW50YWx5YTpUVVIuTDIuMTEzCis5OlRSOlRVUjpUVVJLRVk6QW50YWx5YTpUVVIuTDIuMTE0CisxOlRSOlRVUjpUVVJLRVk6U2lub3A6VFVSLkwyLjEzNAorMTpUUjpUVVI6VFVSS0VZOktpcmtsYXJlbGk6VFVSLkwyLjI3CisxOlRSOlRVUjpUVVJLRVk6U2FrYXJ5YTpUVVIuTDIuMTA0CisxOlRSOlRVUjpUVVJLRVk6TXVnbGE6VFVSLkwyLjc4CisyOlRSOlRVUjpUVVJLRVk6TXVnbGE6VFVSLkwyLjc5CiszOlRSOlRVUjpUVVJLRVk6TXVnbGE6VFVSLkwyLjgwCis0OlRSOlRVUjpUVVJLRVk6TXVnbGE6VFVSLkwyLjgxCis1OlRSOlRVUjpUVVJLRVk6TXVnbGE6VFVSLkwyLjgyCis2OlRSOlRVUjpUVVJLRVk6TXVnbGE6VFVSLkwyLjgzCis3OlRSOlRVUjpUVVJLRVk6TXVnbGE6VFVSLkwyLjg0Cis4OlRSOlRVUjpUVVJLRVk6TXVnbGE6VFVSLkwyLjg1Cis5OlRSOlRVUjpUVVJLRVk6TXVnbGE6VFVSLkwyLjg2CisxMDpUUjpUVVI6VFVSS0VZOk11Z2xhOlRVUi5MMi44NworMTE6VFI6VFVSOlRVUktFWTpNdWdsYTpUVVIuTDIuODgKKzEyOlRSOlRVUjpUVVJLRVk6TXVnbGE6VFVSLkwyLjg5CisxMzpUUjpUVVI6VFVSS0VZOk11Z2xhOlRVUi5MMi45MAorMTQ6VFI6VFVSOlRVUktFWTpNdWdsYTpUVVIuTDIuOTEKKzE1OlRSOlRVUjpUVVJLRVk6TXVnbGE6VFVSLkwyLjkyCisxNjpUUjpUVVI6VFVSS0VZOk11Z2xhOlRVUi5MMi45MworMTc6VFI6VFVSOlRVUktFWTpNdWdsYTpUVVIuTDIuOTQKKzE4OlRSOlRVUjpUVVJLRVk6TXVnbGE6VFVSLkwyLjk1CisxOlRSOlRVUjpUVVJLRVk6TXVzOlRVUi5MMi42NAorMTpUUjpUVVI6VFVSS0VZOlJpemU6VFVSLkwyLjk3CisxOlRSOlRVUjpUVVJLRVk6VG9rYXQ6VFVSLkwyLjk4CisxOlRSOlRVUjpUVVJLRVk6QW5rYXJhOlRVUi5MMi42NQorMTpUUjpUVVI6VFVSS0VZOksuIE1hcmFzOlRVUi5MMi41OQorMTpUUjpUVVI6VFVSS0VZOkJheWJ1cnQ6VFVSLkwyLjM0CisxOlRSOlRVUjpUVVJLRVk6RWxhemlnOlRVUi5MMi41NAorMTpUUjpUVVI6VFVSS0VZOkFkYW5hOlRVUi5MMi41NQorMTpUUjpUVVI6VFVSS0VZOkt1dGFoeWE6VFVSLkwyLjY3CisxOlRSOlRVUjpUVVJLRVk6Qm9sdTpUVVIuTDIuMgorMTpUUjpUVVI6VFVSS0VZOkVkaXJuZTpUVVIuTDIuMTIxCisxOlRSOlRVUjpUVVJLRVk6S2lua2thbGU6VFVSLkwyLjEyNQorMTpUUjpUVVI6VFVSS0VZOkhha2thcmk6VFVSLkwyLjUzCisxOlRSOlRVUjpUVVJLRVk6SGF0YXk6VFVSLkwyLjk2CisxOlRSOlRVUjpUVVJLRVk6QmluZ29sOlRVUi5MMi4xMjcKKzE6VFI6VFVSOlRVUktFWTpNYXJkaW46VFVSLkwyLjEzNgorMTpUUjpUVVI6VFVSS0VZOlNhbXN1bjpUVVIuTDIuOTkKKzE6VFI6VFVSOlRVUktFWTpBZGl5YW1hbjpUVVIuTDIuMzAKKzE6VFI6VFVSOlRVUktFWTpOaWdkZTpUVVIuTDIuMTMxCisxOlRSOlRVUjpUVVJLRVk6R3VtdXNoYW5lOlRVUi5MMi4xMTgKKzE6VFI6VFVSOlRVUktFWTpHYXppYW50ZXA6VFVSLkwyLjEyNAorMTpUUjpUVVI6VFVSS0VZOklzcGFydGE6VFVSLkwyLjI4CisxOlRSOlRVUjpUVVJLRVk6QnVyc2E6VFVSLkwyLjEwMgorMjpUUjpUVVI6VFVSS0VZOkJ1cnNhOlRVUi5MMi4xMDMKKzE6VFI6VFVSOlRVUktFWTpBbWFzeWE6VFVSLkwyLjEKKzE6VFI6VFVSOlRVUktFWTpBcnR2aW46VFVSLkwyLjEzCisxOlRSOlRVUjpUVVJLRVk6U2l2YXM6VFVSLkwyLjI2CisxOlRSOlRVUjpUVVJLRVk6RGVuaXpsaTpUVVIuTDIuMTE5CisxOlRSOlRVUjpUVVJLRVk6QWZ5b246VFVSLkwyLjEzMgorMTpUUjpUVVI6VFVSS0VZOlNpaXJ0OlRVUi5MMi4xMDUKKzE6VFI6VFVSOlRVUktFWTpJY2VsOlRVUi5MMi4zMgorMjpUUjpUVVI6VFVSS0VZOkljZWw6VFVSLkwyLjMzCisxOlRSOlRVUjpUVVJLRVk6QmFsaWtlc2lyOlRVUi5MMi4zNgorMjpUUjpUVVI6VFVSS0VZOkJhbGlrZXNpcjpUVVIuTDIuMzcKKzM6VFI6VFVSOlRVUktFWTpCYWxpa2VzaXI6VFVSLkwyLjM4Cis0OlRSOlRVUjpUVVJLRVk6QmFsaWtlc2lyOlRVUi5MMi4zOQorNTpUUjpUVVI6VFVSS0VZOkJhbGlrZXNpcjpUVVIuTDIuNDAKKzY6VFI6VFVSOlRVUktFWTpCYWxpa2VzaXI6VFVSLkwyLjQxCis3OlRSOlRVUjpUVVJLRVk6QmFsaWtlc2lyOlRVUi5MMi40MgorODpUUjpUVVI6VFVSS0VZOkJhbGlrZXNpcjpUVVIuTDIuNDMKKzk6VFI6VFVSOlRVUktFWTpCYWxpa2VzaXI6VFVSLkwyLjQ0CisxMDpUUjpUVVI6VFVSS0VZOkJhbGlrZXNpcjpUVVIuTDIuNDUKKzExOlRSOlRVUjpUVVJLRVk6QmFsaWtlc2lyOlRVUi5MMi40NgorMTI6VFI6VFVSOlRVUktFWTpCYWxpa2VzaXI6VFVSLkwyLjQ3CisxMzpUUjpUVVI6VFVSS0VZOkJhbGlrZXNpcjpUVVIuTDIuNDgKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVFpBL1RaQV9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVFpBL1RaQV9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGFjOTNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9UWkEvVFpBX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMjYgQEAKKzE6VFotMDpUWjpBUlVTSEEKKzI6VFotMDI6VFo6REFSIEVTIFNBTEFBTQorMzpUWi0wMzpUWjpET0RPTUEKKzQ6VFotMDQ6VFo6SVJJTkdBCis1OlRaLTA1OlRaOktBR0VSQQorNjpUWi0wNjpUWjpLQVNLQVpJTkkgUEVNQkEKKzc6VFotMDc6VFo6S0FTS0FaSU5JIFVOR1VKQQorODpUWi0wODpUWjpLSUdPTUEKKzk6VFotMDk6VFo6S0lMSU1BTkpBUk8KKzEwOlRaLTEwOlRaOktVU0lOSSBQRU1CQQorMTE6VFotMTE6VFo6S1VTSU5JIFVOR1VKQQorMTI6VFotMjpUWjpMSU5ESQorMTM6VFotMjY6VFo6TUFOWUFSQQorMTQ6VFotMzpUWjpNQVJBCisxNTpUWi00OlRaOk1CRVlBCisxNjpUWi01OlRaOk1KSU5JIE1BR0hBUklCSQorMTc6VFotNjpUWjpNT1JPR09STworMTg6VFotNzpUWjpNVFdBUkEKKzE5OlRaLTg6VFo6TVdBTlpBCisyMDpUWi05OlRaOlBXQU5JCisyMTpUWi0yMDpUWjpSVUtXQQorMjI6VFotMTI6VFo6UlVWVU1BCisyMzpUWi0yMjpUWjpTSElOWUFOR0EKKzI0OlRaLTIzOlRaOlNJTkdJREEKKzI1OlRaLTI0OlRaOlRBQk9SQQorMjY6VFotMjU6VFo6VEFOR0EKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVFpBL1RaQV9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVFpBL1RaQV9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDE0MThkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9UWkEvVFpBX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsOTcgQEAKKzE6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpLdXNpbmkgVW5ndWphOlphbnNpYmFyIENlbnRyYWwKKzI6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpLdXNpbmkgVW5ndWphOlphbnNpYmFyIFNvdXRoCisxOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6RG9kb21hOkRvZG9tYQorMjpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOkRvZG9tYTpLb25kb2EKKzM6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpEb2RvbWE6TXB3YXB3YQorMTpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOlNoaW55YW5nYTpCYXJpYWRpCisyOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6U2hpbnlhbmdhOkthaGFtYQorMzpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOlNoaW55YW5nYTpNYXN3YQorNDpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOlNoaW55YW5nYTpNZWF0dQorNTpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOlNoaW55YW5nYTpTaGlueWFuZ2EKKzE6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpLdXNpbmktUGVtYmE6Q2hha2VjaGFrZQorMjpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOkt1c2luaS1QZW1iYTpNa29hbmkKKzE6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpMaW5kaTpLaWx3YQorMjpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOkxpbmRpOkxpbmRpCiszOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6TGluZGk6TGl3YWxlCis0OlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6TGluZGk6TmFjaGluZ3dlYQorMTpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOktpbGltYW5qYXJvOkhhaQorMjpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOktpbGltYW5qYXJvOk1vc2hpCiszOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6S2lsaW1hbmphcm86TXdhbmdhCis0OlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6S2lsaW1hbmphcm86Um9tYm8KKzU6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpLaWxpbWFuamFybzpTYW1lCisxOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6TXR3YXJhOk1hc2FzaQorMjpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOk10d2FyYTpNdHdhcmEKKzM6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpNdHdhcmE6TmV3YWxhCisxOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6RGFyLUVzLVNhbGFhbTpEYXItRXMtU2FsYWFtCisxOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6SXJpbmdhOklyaW5nYQorMjpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOklyaW5nYTpMdWRld2EKKzM6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpJcmluZ2E6TWFrZXRlCis0OlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6SXJpbmdhOk11ZmluZGkKKzU6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpJcmluZ2E6TmpvbWJlCisxOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6TWFyYTpCdW5kYQorMjpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOk1hcmE6TXVzb21hCiszOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6TWFyYTpTZXJlbmdldGkKKzQ6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpNYXJhOlRhcmltZQorMTpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOlRhYm9yYTpJZ3VuZ2EKKzI6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpUYWJvcmE6TnplZ2EKKzM6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpUYWJvcmE6VGFib3JhCis0OlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6VGFib3JhOlVyYW1ibworMTpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOlJ1a3dhOk1wYW5kYQorMjpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOlJ1a3dhOk5rYXNpCiszOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6UnVrd2E6U3VtYmF3YW5nYQorMTpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOkthZ2VyYTpCaWhhcmFtdWxvCisyOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6S2FnZXJhOkJ1a29iYQorMzpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOkthZ2VyYTpLYXJhZ3dlCis0OlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6S2FnZXJhOk11bGViYQorNTpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOkthZ2VyYTpOZ2FyYQorMTpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOkFydXNoYTpBcnVtZXJ1CisyOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6QXJ1c2hhOkFydXNoYQorMzpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOkFydXNoYTpCYWJhdGkKKzQ6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpBcnVzaGE6SGFuYW5nCis1OlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6QXJ1c2hhOktpdGV0bworNjpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOkFydXNoYTpNYnVsdQorNzpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOkFydXNoYTpNb25kdWxpCis4OlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6QXJ1c2hhOk5nb3Jvbmdvcm8KKzE6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpNYmV5YTpDaHVueWEKKzI6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpNYmV5YTpJbGVqZQorMzpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOk1iZXlhOkt5ZWxhCis0OlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6TWJleWE6TWJleWEKKzU6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpNYmV5YTpNYm96aQorNjpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOk1iZXlhOlJ1bmd3ZQorMTpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOkwuIFZpY3RvcmlhOkwuIFZpY3RvcmlhCisxOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6UnV2dW1hOk1iaW5nYQorMjpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOlJ1dnVtYTpTb25nZWEKKzM6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpSdXZ1bWE6VHVuZHVydQorMTpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOkthc2themluaS1Vbmd1amE6WmFuc2liYXIgTm9ydGgKKzI6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpLYXNrYXppbmktVW5ndWphOlphbnNpYmFyIE5vcnRoLUNlbnRyYWwKKzE6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpLaWdvbWE6S2FzdWx1CisyOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6S2lnb21hOktpYm9uZG8KKzM6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpLaWdvbWE6S2lnb21hCisxOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6TXdhbnphOkdlaXRhCisyOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6TXdhbnphOkt3aW1iYQorMzpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOk13YW56YTpNYWd1Cis0OlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6TXdhbnphOk13YW56YQorNTpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOk13YW56YTpTZW5nZXJlbWEKKzY6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpNd2FuemE6VWtlcmV3ZQorMTpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOlNpbmdpZGE6SXJhbWJhCisyOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6U2luZ2lkYTpNYW55b25pCiszOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6U2luZ2lkYTpTaW5naWRhCisxOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6S2Fza2F6aW5pLVBlbWJhOk1pY2hld2VuaS1QZW1iYQorMjpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOkthc2themluaS1QZW1iYTpXZXRlLVBlbWJhCisxOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6TW9yb2dvcm86S2lsb21iZXJvCisyOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6TW9yb2dvcm86S2lsb3NhCiszOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6TW9yb2dvcm86TW9yb2dvcm8KKzQ6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpNb3JvZ29ybzpVbGFuZ2EKKzE6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpUYW5nYTpIYW5kZW5pCisyOlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6VGFuZ2E6S29yb2d3ZQorMzpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOlRhbmdhOkx1c2hvdG8KKzQ6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpUYW5nYTpNdWhlemEKKzU6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpUYW5nYTpQYW5nYW5pCis2OlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6VGFuZ2E6VGFuZ2EKKzE6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpQd2FuaTpCYWdhbW95bworMjpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOlB3YW5pOktpYmFoYQorMzpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOlB3YW5pOktpc2FyYXdlCis0OlRaOlRaQTpUQU5aQU5JQSBVTklURUQgUkVQVUJMSUM6UHdhbmk6TWFmaWEKKzU6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpQd2FuaTpSdWZpamkKKzE6VFo6VFpBOlRBTlpBTklBIFVOSVRFRCBSRVBVQkxJQzpNamluaS1NYWdoYXJpYmk6WmFuc2liYXIgVG93bgorMjpUWjpUWkE6VEFOWkFOSUEgVU5JVEVEIFJFUFVCTElDOk1qaW5pLU1hZ2hhcmliaTpaYW5zaWJhciBXZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1VHQS9VR0FfQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1VHQS9VR0FfQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1NTE4YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVUdBL1VHQV9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDU2IEBACisxOlVHLTMwOlVHOkFESlVNQU5JCisyOlVHLTMwMjpVRzpBUEFDCiszOlVHLTMwMzpVRzpBUlVBCis0OlVHLTIxOlVHOkJVR0lSSQorNTpVRy00MDpVRzpCVU5ESUJVR1lPCis2OlVHLTQwMjpVRzpCVVNIRU5ZSQorNzpVRy0yMDI6VUc6QlVTSUEKKzg6VUctMzA0OlVHOkdVTFUKKzk6VUctNDAzOlVHOkhPSU1BCisxMDpVRy0yMDM6VUc6SUdBTkdBCisxMTpVRy0yMDQ6VUc6SklOSkEKKzEyOlVHLTQwNDpVRzpLQUJBTEUKKzEzOlVHLTQwNTpVRzpLQUJBUk9MRQorMTQ6VUctMjM6VUc6S0FCRVJBTUFJRE8KKzE1OlVHLTA6VUc6S0FMQU5HQUxBCisxNjpVRy0wMjpVRzpLQU1QQUxBCisxNzpVRy0yMDU6VUc6S0FNVUxJCisxODpVRy00MzpVRzpLQU1XRU5HRQorMTk6VUctNDQ6VUc6S0FOVU5HVQorMjA6VUctMjA2OlVHOktBUENIT1JXQQorMjE6VUctNDA2OlVHOktBU0VTRQorMjI6VUctMjA3OlVHOktBVEFLV0kKKzIzOlVHLTI6VUc6S0FZVU5HQQorMjQ6VUctNDA3OlVHOktJQkFBTEUKKzI1OlVHLTAzOlVHOktJQk9HQQorMjY6VUctNDA4OlVHOktJU09STworMjc6VUctMzA1OlVHOktJVEdVTQorMjg6VUctMzA2OlVHOktPVElETworMjk6VUctMjA4OlVHOktVTUkKKzMwOlVHLTQ1OlVHOktZRU5KT0pPCiszMTpVRy1WOlVHOkxBS0UgVklDVE9SSUEKKzMyOlVHLTMwNzpVRzpMSVJBCiszMzpVRy0wNDpVRzpMVVdFUk8KKzM0OlVHLTA1OlVHOk1BU0FLQQorMzU6VUctNDA5OlVHOk1BU0lOREkKKzM2OlVHLTI0OlVHOk1BWVVHRQorMzc6VUctMjA5OlVHOk1CQUxFCiszODpVRy00MTpVRzpNQkFSQVJBCiszOTpVRy0zMDg6VUc6TU9ST1RPCis0MDpVRy0zMDk6VUc6TU9ZTworNDE6VUctMDY6VUc6TVBJR0kKKzQyOlVHLTA3OlVHOk1VQkVOREUKKzQzOlVHLTA4OlVHOk1VS09OTworNDQ6VUctMzpVRzpOQUtBUElSSVBJUklUCis0NTpVRy0wOTpVRzpOQUtBU09OR09MQQorNDY6VUctMzE6VUc6TkVCQkkKKzQ3OlVHLTQ6VUc6TlRVTkdBTU8KKzQ4OlVHLTMyOlVHOlBBREVSCis0OTpVRy0yMDpVRzpQQUxMSVNBCis1MDpVRy0xMDpVRzpSQUtBSQorNTE6VUctNDI6VUc6UlVLVU5HSVJJCis1MjpVRy0xMTpVRzpTRU1CQUJVTEUKKzUzOlVHLTI1OlVHOlNJUk9OS08KKzU0OlVHLTUyOlVHOlNPUk9USQorNTU6VUctMjI6VUc6VE9ST1JPCis1NjpVRy0zMzpVRzpZVU1CRQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9VR0EvVUdBX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9VR0EvVUdBX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlODVkNzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1VHQS9VR0FfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSwxODUgQEAKKzE6VUc6VUdBOlVHQU5EQTpSdWt1bmdpcmk6S2lua2lpemkKKzI6VUc6VUdBOlVHQU5EQTpSdWt1bmdpcmk6UnViYWJvCiszOlVHOlVHQTpVR0FOREE6UnVrdW5naXJpOlJ1anVtYnVyYQorMTpVRzpVR0E6VUdBTkRBOkFydWE6QXJpbmdhCisyOlVHOlVHQTpVR0FOREE6QXJ1YTpBcnVhIE11bmljaXBhbGl0eQorMzpVRzpVR0E6VUdBTkRBOkFydWE6QXlpdnUKKzQ6VUc6VUdBOlVHQU5EQTpBcnVhOktvYm9rbworNTpVRzpVR0E6VUdBTkRBOkFydWE6TWFkaS1Pa29sbG8KKzY6VUc6VUdBOlVHQU5EQTpBcnVhOk1hcmFjaGEKKzc6VUc6VUdBOlVHQU5EQTpBcnVhOlRlcmVnbworODpVRzpVR0E6VUdBTkRBOkFydWE6VnVycmEKKzE6VUc6VUdBOlVHQU5EQTpTb3JvdGk6QW11cmlhCisyOlVHOlVHQTpVR0FOREE6U29yb3RpOkthYmVyYW1haWRvCiszOlVHOlVHQTpVR0FOREE6U29yb3RpOkthbGFraQorNDpVRzpVR0E6VUdBTkRBOlNvcm90aTpLYXBlbGVieW9uZworNTpVRzpVR0E6VUdBTkRBOlNvcm90aTpLYXNpbG8KKzY6VUc6VUdBOlVHQU5EQTpTb3JvdGk6U2VyZXJlCis3OlVHOlVHQTpVR0FOREE6U29yb3RpOlNvcm90aQorODpVRzpVR0E6VUdBTkRBOlNvcm90aTpTb3JvdGkgTXVuaWNpcGFsaXR5Cis5OlVHOlVHQTpVR0FOREE6U29yb3RpOlVzdWsKKzE6VUc6VUdBOlVHQU5EQTpSYWthaTpLYWJ1bGEKKzI6VUc6VUdBOlVHQU5EQTpSYWthaTpLYWt1dXRvCiszOlVHOlVHQTpVR0FOREE6UmFrYWk6S29va2kKKzQ6VUc6VUdBOlVHQU5EQTpSYWthaTpLeW90ZXJhCisxOlVHOlVHQTpVR0FOREE6TW9yb3RvOkJva29yYQorMjpVRzpVR0E6VUdBTkRBOk1vcm90bzpLYWRhbSAoQ2hla3dpaSkKKzM6VUc6VUdBOlVHQU5EQTpNb3JvdG86TWF0aGVuaWtvCis0OlVHOlVHQTpVR0FOREE6TW9yb3RvOk1vcm90byBNdW5pY2lwYWxpdHkKKzU6VUc6VUdBOlVHQU5EQTpNb3JvdG86UGlhbgorNjpVRzpVR0E6VUdBTkRBOk1vcm90bzpVcGUKKzE6VUc6VUdBOlVHQU5EQTpNYmFsZTpCdWJ1bG8KKzI6VUc6VUdBOlVHQU5EQTpNYmFsZTpCdWRhZGlyaQorMzpVRzpVR0E6VUdBTkRBOk1iYWxlOkJ1bGFtYnVsaQorNDpVRzpVR0E6VUdBTkRBOk1iYWxlOkJ1bmdva2hvCis1OlVHOlVHQTpVR0FOREE6TWJhbGU6TWFqaXlhCis2OlVHOlVHQTpVR0FOREE6TWJhbGU6TWJhbGUgTXVuaWNpcGFsaXR5CisxOlVHOlVHQTpVR0FOREE6QnVuZGlidWd5bzpCd2FtYmEKKzI6VUc6VUdBOlVHQU5EQTpCdW5kaWJ1Z3lvOk50b3Jva28KKzE6VUc6VUdBOlVHQU5EQTpNdWJlbmRlOkJ1c3VqanUKKzI6VUc6VUdBOlVHQU5EQTpNdWJlbmRlOkJ1d2VrdWxhCiszOlVHOlVHQTpVR0FOREE6TXViZW5kZTpLYXNzYW5kYQorNDpVRzpVR0E6VUdBTkRBOk11YmVuZGU6TWl0eWFuYQorMTpVRzpVR0E6VUdBTkRBOkxha2UgVmljdG9yaWE6VUdBLkwyLjEKKzI6VUc6VUdBOlVHQU5EQTpMYWtlIFZpY3RvcmlhOlVHQS5MMi4xMAorMzpVRzpVR0E6VUdBTkRBOkxha2UgVmljdG9yaWE6VUdBLkwyLjExCis0OlVHOlVHQTpVR0FOREE6TGFrZSBWaWN0b3JpYTpVR0EuTDIuMTIKKzU6VUc6VUdBOlVHQU5EQTpMYWtlIFZpY3RvcmlhOlVHQS5MMi4xMworNjpVRzpVR0E6VUdBTkRBOkxha2UgVmljdG9yaWE6VUdBLkwyLjE0Cis3OlVHOlVHQTpVR0FOREE6TGFrZSBWaWN0b3JpYTpVR0EuTDIuMTUKKzg6VUc6VUdBOlVHQU5EQTpMYWtlIFZpY3RvcmlhOlVHQS5MMi4xNgorOTpVRzpVR0E6VUdBTkRBOkxha2UgVmljdG9yaWE6VUdBLkwyLjE3CisxMDpVRzpVR0E6VUdBTkRBOkxha2UgVmljdG9yaWE6VUdBLkwyLjE4CisxMTpVRzpVR0E6VUdBTkRBOkxha2UgVmljdG9yaWE6VUdBLkwyLjE5CisxMjpVRzpVR0E6VUdBTkRBOkxha2UgVmljdG9yaWE6VUdBLkwyLjIKKzEzOlVHOlVHQTpVR0FOREE6TGFrZSBWaWN0b3JpYTpVR0EuTDIuMjAKKzE0OlVHOlVHQTpVR0FOREE6TGFrZSBWaWN0b3JpYTpVR0EuTDIuMjEKKzE1OlVHOlVHQTpVR0FOREE6TGFrZSBWaWN0b3JpYTpVR0EuTDIuMjIKKzE2OlVHOlVHQTpVR0FOREE6TGFrZSBWaWN0b3JpYTpVR0EuTDIuMworMTc6VUc6VUdBOlVHQU5EQTpMYWtlIFZpY3RvcmlhOlVHQS5MMi40CisxODpVRzpVR0E6VUdBTkRBOkxha2UgVmljdG9yaWE6VUdBLkwyLjUKKzE5OlVHOlVHQTpVR0FOREE6TGFrZSBWaWN0b3JpYTpVR0EuTDIuNgorMjA6VUc6VUdBOlVHQU5EQTpMYWtlIFZpY3RvcmlhOlVHQS5MMi43CisyMTpVRzpVR0E6VUdBTkRBOkxha2UgVmljdG9yaWE6VUdBLkwyLjgKKzIyOlVHOlVHQTpVR0FOREE6TGFrZSBWaWN0b3JpYTpVR0EuTDIuOQorMTpVRzpVR0E6VUdBTkRBOkthc2VzZTpCdWtvbmpvCisyOlVHOlVHQTpVR0FOREE6S2FzZXNlOkJ1c29uZ29yYQorMTpVRzpVR0E6VUdBTkRBOlBhbGxpc2E6QnVkYWthCisyOlVHOlVHQTpVR0FOREE6UGFsbGlzYTpCdXRlYm8KKzM6VUc6VUdBOlVHQU5EQTpQYWxsaXNhOktpYnVrdQorNDpVRzpVR0E6VUdBTkRBOlBhbGxpc2E6UGFsbGlzYQorMTpVRzpVR0E6VUdBTkRBOk1hc2luZGk6QnVqZW5qZQorMjpVRzpVR0E6VUdBTkRBOk1hc2luZGk6QnVsaWlzYQorMzpVRzpVR0E6VUdBTkRBOk1hc2luZGk6QnVydWxpCis0OlVHOlVHQTpVR0FOREE6TWFzaW5kaTpLaWJhbmRhCisxOlVHOlVHQTpVR0FOREE6S2FtcGFsYTpLYW1wYWxhIENpdHkgQ291bmNpbAorMTpVRzpVR0E6VUdBTkRBOkthYmFyb2xlOkJ1bnlhbmdhYnUKKzI6VUc6VUdBOlVHQU5EQTpLYWJhcm9sZTpCdXJhaHlhCiszOlVHOlVHQTpVR0FOREE6S2FiYXJvbGU6Rm9ydCBQb3J0YWwgTXVuaWNpcGFsaXR5Cis0OlVHOlVHQTpVR0FOREE6S2FiYXJvbGU6S2liYWxlCis1OlVHOlVHQTpVR0FOREE6S2FiYXJvbGU6S2l0YWd3ZW5kYQorNjpVRzpVR0E6VUdBTkRBOkthYmFyb2xlOkt5YWthCis3OlVHOlVHQTpVR0FOREE6S2FiYXJvbGU6TXdlbmdlCisxOlVHOlVHQTpVR0FOREE6R3VsdTpBc3dhCisyOlVHOlVHQTpVR0FOREE6R3VsdTpHdWx1IE11bmljaXBhbGl0eQorMzpVRzpVR0E6VUdBTkRBOkd1bHU6S2lsYWsKKzQ6VUc6VUdBOlVHQU5EQTpHdWx1Ok53b3lhCis1OlVHOlVHQTpVR0FOREE6R3VsdTpPbW9ybworMTpVRzpVR0E6VUdBTkRBOk1hc2FrYTpCdWtvbWFuc2ltYmkKKzI6VUc6VUdBOlVHQU5EQTpNYXNha2E6QnVrb3RvCiszOlVHOlVHQTpVR0FOREE6TWFzYWthOkthbHVuZ3UKKzQ6VUc6VUdBOlVHQU5EQTpNYXNha2E6THdlbWl5YWdhCis1OlVHOlVHQTpVR0FOREE6TWFzYWthOk1hc2FrYSBNdW5pY2lwYWxpdHkKKzY6VUc6VUdBOlVHQU5EQTpNYXNha2E6TWF3b2dvbGEKKzE6VUc6VUdBOlVHQU5EQTpMdXdlcm86QnVydWxpCisyOlVHOlVHQTpVR0FOREE6THV3ZXJvOkthdGlrYW11CiszOlVHOlVHQTpVR0FOREE6THV3ZXJvOk5ha2FzZWtlCis0OlVHOlVHQTpVR0FOREE6THV3ZXJvOldhYnVzYW5hIChCYW11bmFuaWthKQorMTpVRzpVR0E6VUdBTkRBOkthbGFuZ2FsYTpCdWp1bWJhCisyOlVHOlVHQTpVR0FOREE6S2FsYW5nYWxhOkt5YW11c3dhCisxOlVHOlVHQTpVR0FOREE6TXBpZ2k6QnVzaXJvCisyOlVHOlVHQTpVR0FOREE6TXBpZ2k6QnV0YW1iYWxhCiszOlVHOlVHQTpVR0FOREE6TXBpZ2k6RW50ZWJiZSBNdW5pY2lwYWxpdHkKKzQ6VUc6VUdBOlVHQU5EQTpNcGlnaTpHb21iYQorNTpVRzpVR0E6VUdBTkRBOk1waWdpOkt5YWRvbmRvCis2OlVHOlVHQTpVR0FOREE6TXBpZ2k6TWF3b2tvdGEKKzE6VUc6VUdBOlVHQU5EQTpKaW5qYTpCdXRlbWJlCisyOlVHOlVHQTpVR0FOREE6SmluamE6SmluamEgTXVuaWNpcGFsaXR5CiszOlVHOlVHQTpVR0FOREE6SmluamE6S2Fnb21hCisxOlVHOlVHQTpVR0FOREE6S2lib2dhOktpYm9nYQorMTpVRzpVR0E6VUdBTkRBOkthYmFsZTpLYWJhbGUgTXVuaWNpcGFsaXR5CisyOlVHOlVHQTpVR0FOREE6S2FiYWxlOk5kb3J3YQorMzpVRzpVR0E6VUdBTkRBOkthYmFsZTpSdWJhbmRhCis0OlVHOlVHQTpVR0FOREE6S2FiYWxlOlJ1a2lnYQorMTpVRzpVR0E6VUdBTkRBOkFwYWM6S29sZQorMjpVRzpVR0E6VUdBTkRBOkFwYWM6S3dhbmlhCiszOlVHOlVHQTpVR0FOREE6QXBhYzpNYXJ1emkKKzQ6VUc6VUdBOlVHQU5EQTpBcGFjOk95YW0KKzE6VUc6VUdBOlVHQU5EQTpOZWJiaTpKb25hbQorMjpVRzpVR0E6VUdBTkRBOk5lYmJpOk9rb3JvCiszOlVHOlVHQTpVR0FOREE6TmViYmk6UGFkeWVyZQorMTpVRzpVR0E6VUdBTkRBOk1iYXJhcmE6QnVrYW5nYQorMjpVRzpVR0E6VUdBTkRBOk1iYXJhcmE6SWJhbmRhCiszOlVHOlVHQTpVR0FOREE6TWJhcmFyYTpJc2luZ2lybworNDpVRzpVR0E6VUdBTkRBOk1iYXJhcmE6S2FzaGFyaQorNTpVRzpVR0E6VUdBTkRBOk1iYXJhcmE6S2F6bworNjpVRzpVR0E6VUdBTkRBOk1iYXJhcmE6TWJhcmFyYSBNdW5pY2lwYWxpdHkKKzc6VUc6VUdBOlVHQU5EQTpNYmFyYXJhOk55YWJ1c2hvemkKKzg6VUc6VUdBOlVHQU5EQTpNYmFyYXJhOlJ1aGFhbWEKKzk6VUc6VUdBOlVHQU5EQTpNYmFyYXJhOlJ3YW1wYXJhCisxOlVHOlVHQTpVR0FOREE6S2liYWFsZTpCdWdhbmdhaXppCisyOlVHOlVHQTpVR0FOREE6S2liYWFsZTpCdXlhZ2EKKzM6VUc6VUdBOlVHQU5EQTpLaWJhYWxlOkJ1eWFuamEKKzE6VUc6VUdBOlVHQU5EQTpLaXNvcm86QnVmdW1iaXJhCisxOlVHOlVHQTpVR0FOREE6SG9pbWE6QnVnYWh5YQorMjpVRzpVR0E6VUdBTkRBOkhvaW1hOkJ1aGFndXppCisxOlVHOlVHQTpVR0FOREE6S3VtaTpCdWtlZGVhCisyOlVHOlVHQTpVR0FOREE6S3VtaTpLdW1pCiszOlVHOlVHQTpVR0FOREE6S3VtaTpOZ29yYQorMTpVRzpVR0E6VUdBTkRBOklnYW5nYTpCdWd3ZXJpCisyOlVHOlVHQTpVR0FOREE6SWdhbmdhOkJ1a29vbGkKKzM6VUc6VUdBOlVHQU5EQTpJZ2FuZ2E6QnVueWEKKzQ6VUc6VUdBOlVHQU5EQTpJZ2FuZ2E6QnVzaWtpCis1OlVHOlVHQTpVR0FOREE6SWdhbmdhOktpZ3VsdQorNjpVRzpVR0E6VUdBTkRBOklnYW5nYTpMdXVrYQorMTpVRzpVR0E6VUdBTkRBOkJ1c2hlbnlpOkJ1aHdlanUKKzI6VUc6VUdBOlVHQU5EQTpCdXNoZW55aTpCdW55YXJ1Z3VydQorMzpVRzpVR0E6VUdBTkRBOkJ1c2hlbnlpOklnYXJhCis0OlVHOlVHQTpVR0FOREE6QnVzaGVueWk6S2FqYXJhCis1OlVHOlVHQTpVR0FOREE6QnVzaGVueWk6UnVoaW5kYQorNjpVRzpVR0E6VUdBTkRBOkJ1c2hlbnlpOlJ1c2hlbnlpCis3OlVHOlVHQTpVR0FOREE6QnVzaGVueWk6U2hlZW1hCisxOlVHOlVHQTpVR0FOREE6S2FtdWxpOkJ1ZGlvcGUKKzI6VUc6VUdBOlVHQU5EQTpLYW11bGk6QnVnYWJ1bGEKKzM6VUc6VUdBOlVHQU5EQTpLYW11bGk6QnVsYW1vZ2kKKzQ6VUc6VUdBOlVHQU5EQTpLYW11bGk6QnV6YWF5YQorMTpVRzpVR0E6VUdBTkRBOktvdGlkbzpEb2RvdGgKKzI6VUc6VUdBOlVHQU5EQTpLb3RpZG86SmllCiszOlVHOlVHQTpVR0FOREE6S290aWRvOkxhYndvcgorMTpVRzpVR0E6VUdBTkRBOlRvcm9ybzpCdW55b2xlCisyOlVHOlVHQTpVR0FOREE6VG9yb3JvOktpc29rbyAoV2VzdCBCdWRhbWEpCiszOlVHOlVHQTpVR0FOREE6VG9yb3JvOlNhbWlhLUJ1Z3dlCis0OlVHOlVHQTpVR0FOREE6VG9yb3JvOlRvcm9ybworNTpVRzpVR0E6VUdBTkRBOlRvcm9ybzpUb3Jvcm8gTXVuaWNpcGFsaXR5CisxOlVHOlVHQTpVR0FOREE6TW95bzpFYXN0IE1veW8KKzI6VUc6VUdBOlVHQU5EQTpNb3lvOk9ib25naQorMzpVRzpVR0E6VUdBTkRBOk1veW86V2VzdCBNb3lvCisxOlVHOlVHQTpVR0FOREE6TGlyYTpEb2tvbG8KKzI6VUc6VUdBOlVHQU5EQTpMaXJhOkVydXRlCiszOlVHOlVHQTpVR0FOREE6TGlyYTpLaW9nYQorNDpVRzpVR0E6VUdBTkRBOkxpcmE6TGlyYSBNdW5pY2lwYWxpdHkKKzU6VUc6VUdBOlVHQU5EQTpMaXJhOk1vcm90bworNjpVRzpVR0E6VUdBTkRBOkxpcmE6T3R1a2UKKzE6VUc6VUdBOlVHQU5EQTpLaXRndW06QWdhZ28KKzI6VUc6VUdBOlVHQU5EQTpLaXRndW06QXJ1dQorMzpVRzpVR0E6VUdBTkRBOktpdGd1bTpDaHVhCis0OlVHOlVHQTpVR0FOREE6S2l0Z3VtOkxhbXdvCisxOlVHOlVHQTpVR0FOREE6S2FwY2hvcndhOktvbmdhc2lzCisyOlVHOlVHQTpVR0FOREE6S2FwY2hvcndhOkt3ZWVuCiszOlVHOlVHQTpVR0FOREE6S2FwY2hvcndhOlRpbmdleQorMTpVRzpVR0E6VUdBTkRBOk11a29ubzpCYmFhbGUKKzI6VUc6VUdBOlVHQU5EQTpNdWtvbm86QnV2dW1hIElzbGFuZHMKKzM6VUc6VUdBOlVHQU5EQTpNdWtvbm86QnV5aWt3ZQorNDpVRzpVR0E6VUdBTkRBOk11a29ubzpNdWtvbm8KKzU6VUc6VUdBOlVHQU5EQTpNdWtvbm86TmFraWZ1bWEKKzY6VUc6VUdBOlVHQU5EQTpNdWtvbm86TnRlbmplcnUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVVJZL1VSWV9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVVJZL1VSWV9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmNkMWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9VUlkvVVJZX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMTkgQEAKKzE6VVktQVI6VVk6QVJUSUdBUworMjpVWS1DQTpVWTpDQU5FTE9ORVMKKzM6VVktQ0w6VVk6Q0VSUk8gTEFSR08KKzQ6VVktQ086VVk6Q09MT05JQQorNTpVWS1EVTpVWTpEVVJBWk5PCis2OlVZLUZTOlVZOkZMT1JFUworNzpVWS1GRDpVWTpGTE9SSURBCis4OlVZLUxBOlVZOkxBVkFMTEVKQQorOTpVWS1NQTpVWTpNQUxET05BRE8KKzEwOlVZLU1POlVZOk1PTlRFVklERU8KKzExOlVZLVBBOlVZOlBBWVNBTkRVCisxMjpVWS1STjpVWTpSSU8gTkVHUk8KKzEzOlVZLVJWOlVZOlJJVkVSQQorMTQ6VVktUk86VVk6Uk9DSEEKKzE1OlVZLVNBOlVZOlNBTFRPCisxNjpVWS1TSjpVWTpTQU4gSk9TRQorMTc6VVktU086VVk6U09SSUFOTworMTg6VVktVEE6VVk6VEFDVUFSRU1CTworMTk6VVktVFQ6VVk6VFJFSU5UQSBZIFRSRVMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVVJZL1VSWV9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVVJZL1VSWV9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGRmZGMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9VUlkvVVJZX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMzYgQEAKKzE6VVk6VVJZOlVSVUdVQVk6RkxPUkVTOlVSWS5MMi40CisxOlVZOlVSWTpVUlVHVUFZOkFSVElHQVM6VVJZLkwyLjEyCisxOlVZOlVSWTpVUlVHVUFZOkNPTE9OSUE6SXNsYQorMjpVWTpVUlk6VVJVR1VBWTpDT0xPTklBOlVSWS5MMi4xNgorMTpVWTpVUlk6VVJVR1VBWTpNT05URVZJREVPOlVSWS5MMi4xNworMTpVWTpVUlk6VVJVR1VBWTpST0NIQTpVUlkuTDIuMTMKKzI6VVk6VVJZOlVSVUdVQVk6Uk9DSEE6VVJZLkwyLjE0CisxOlVZOlVSWTpVUlVHVUFZOlBBWVNBTkRVOlVSWS5MMi4yNQorMjpVWTpVUlk6VVJVR1VBWTpQQVlTQU5EVTpVUlkuTDIuMjYKKzE6VVk6VVJZOlVSVUdVQVk6UklPIE5FR1JPOlJpbyBOZWdybworMjpVWTpVUlk6VVJVR1VBWTpSSU8gTkVHUk86VVJZLkwyLjEwCiszOlVZOlVSWTpVUlVHVUFZOlJJTyBORUdSTzpVUlkuTDIuNworNDpVWTpVUlk6VVJVR1VBWTpSSU8gTkVHUk86VVJZLkwyLjgKKzU6VVk6VVJZOlVSVUdVQVk6UklPIE5FR1JPOlVSWS5MMi45CisxOlVZOlVSWTpVUlVHVUFZOlRBQ1VBUkVNQk86VVJZLkwyLjIKKzE6VVk6VVJZOlVSVUdVQVk6UklWRVJBOlVSWS5MMi4yOAorMTpVWTpVUlk6VVJVR1VBWTpDQU5FTE9ORVM6UmlvIFNhbnRhCisyOlVZOlVSWTpVUlVHVUFZOkNBTkVMT05FUzpVUlkuTDIuMTkKKzE6VVk6VVJZOlVSVUdVQVk6VFJFSU5UQSBZIFRSRVM6TGFnLiBHdWFjaGEKKzI6VVk6VVJZOlVSVUdVQVk6VFJFSU5UQSBZIFRSRVM6TGFnbworMzpVWTpVUlk6VVJVR1VBWTpUUkVJTlRBIFkgVFJFUzpMYWd1bmEKKzQ6VVk6VVJZOlVSVUdVQVk6VFJFSU5UQSBZIFRSRVM6VVJZLkwyLjIwCis1OlVZOlVSWTpVUlVHVUFZOlRSRUlOVEEgWSBUUkVTOlVSWS5MMi4yMQorNjpVWTpVUlk6VVJVR1VBWTpUUkVJTlRBIFkgVFJFUzpVUlkuTDIuMjIKKzc6VVk6VVJZOlVSVUdVQVk6VFJFSU5UQSBZIFRSRVM6VVJZLkwyLjIzCis4OlVZOlVSWTpVUlVHVUFZOlRSRUlOVEEgWSBUUkVTOlVSWS5MMi4yNAorMTpVWTpVUlk6VVJVR1VBWTpGTE9SSURBOlVSWS5MMi41CisxOlVZOlVSWTpVUlVHVUFZOkxBVkFMTEVKQTpMYWdvCisyOlVZOlVSWTpVUlVHVUFZOkxBVkFMTEVKQTpVUlkuTDIuMQorMTpVWTpVUlk6VVJVR1VBWTpNQUxET05BRE86SXNsYQorMjpVWTpVUlk6VVJVR1VBWTpNQUxET05BRE86VVJZLkwyLjE4CisxOlVZOlVSWTpVUlVHVUFZOlNBTFRPOlVSWS5MMi4zCisxOlVZOlVSWTpVUlVHVUFZOlNBTiBKT1NFOlVSWS5MMi42CisxOlVZOlVSWTpVUlVHVUFZOkNFUlJPIExBUkdPOlVSWS5MMi4xNQorMTpVWTpVUlk6VVJVR1VBWTpTT1JJQU5POlVSWS5MMi4yNworMTpVWTpVUlk6VVJVR1VBWTpEVVJBWk5POlVSWS5MMi4xMQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9VU0EvVVNBX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9VU0EvVVNBX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNjgyOTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1VTQS9VU0FfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSw1NiBAQAorMTpVUy1BTDpVUzpBTEFCQU1BCisyOlVTLUFLOlVTOkFMQVNLQQorMzpVUy1BWjpVUzpBUklaT05BCis0OlVTLUFSOlVTOkFSS0FOU0FTCis1OlVTLURVTU1ZMTpVUzpBUkwKKzY6VVMtQ0E6VVM6Q0FMSUZPUk5JQQorNzpVUy1EVU1NWTI6VVM6Q0FNCis4OlVTLUNPOlVTOkNPTE9SQURPCis5OlVTLUNUOlVTOkNPTk5FQ1RJQ1VUCisxMDpVUy1ERTpVUzpERUxBV0FSRQorMTE6VVMtREM6VVM6RElTVFJJQ1QgT0YgQ09MVU1CSUEKKzEyOlVTLUZMOlVTOkZMT1JJREEKKzEzOlVTLUdBOlVTOkdFT1JHSUEKKzE0OlVTLURVTU1ZMzpVUzpHRVAKKzE1OlVTLUhJOlVTOkhBV0FJSQorMTY6VVMtSUQ6VVM6SURBSE8KKzE3OlVTLUlMOlVTOklMTElOT0lTCisxODpVUy1JTjpVUzpJTkRJQU5BCisxOTpVUy1JQTpVUzpJT1dBCisyMDpVUy1LUzpVUzpLQU5TQVMKKzIxOlVTLUtZOlVTOktFTlRVQ0tZCisyMjpVUy1MQTpVUzpMT1VJU0lBTkEKKzIzOlVTLU1FOlVTOk1BSU5FCisyNDpVUy1NRDpVUzpNQVJZTEFORAorMjU6VVMtTUE6VVM6TUFTU0FDSFVTRVRUUworMjY6VVMtTUk6VVM6TUlDSElHQU4KKzI3OlVTLU1OOlVTOk1JTk5FU09UQQorMjg6VVMtTVM6VVM6TUlTU0lTU0lQUEkKKzI5OlVTLU1POlVTOk1JU1NPVVJJCiszMDpVUy1NVDpVUzpNT05UQU5BCiszMTpVUy1ORTpVUzpORUJSQVNLQQorMzI6VVMtTlY6VVM6TkVWQURBCiszMzpVUy1OSDpVUzpORVcgSEFNUFNISVJFCiszNDpVUy1OSjpVUzpORVcgSkVSU0VZCiszNTpVUy1OTTpVUzpORVcgTUVYSUNPCiszNjpVUy1OWTpVUzpORVcgWU9SSworMzc6VVMtTkM6VVM6Tk9SVEggQ0FST0xJTkEKKzM4OlVTLU5EOlVTOk5PUlRIIERBS09UQQorMzk6VVMtT0g6VVM6T0hJTworNDA6VVMtT0s6VVM6T0tMQUhPTUEKKzQxOlVTLU9SOlVTOk9SRUdPTgorNDI6VVMtUEE6VVM6UEVOTlNZTFZBTklBCis0MzpVUy1QUjpVUzpQVUVSVE8gUklDTworNDQ6VVMtUkk6VVM6UkhPREUgSVNMQU5ECis0NTpVUy1TQzpVUzpTT1VUSCBDQVJPTElOQQorNDY6VVMtU0Q6VVM6U09VVEggREFLT1RBCis0NzpVUy1UTjpVUzpURU5ORVNTRUUKKzQ4OlVTLVRYOlVTOlRFWEFTCis0OTpVUy1VVDpVUzpVVEFICis1MDpVUy1WVDpVUzpWRVJNT05UCis1MTpVUy1WQTpVUzpWSVJHSU5JQQorNTI6VVMtRFVNTVk0OlVTOlZJUworNTM6VVMtV0E6VVM6V0FTSElOR1RPTgorNTQ6VVMtV1Y6VVM6V0VTVCBWSVJHSU5JQQorNTU6VVMtV0k6VVM6V0lTQ09OU0lOCis1NjpVUy1XWTpVUzpXWU9NSU5HCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1VTQS9VU0FfQURNSU4yX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1VTQS9VU0FfQURNSU4yX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhMjgzMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVVNBL1VTQV9BRE1JTjJfTEVYLnR4dApAQCAtMCwwICsxLDMxNDEgQEAKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6V1lPTUlORzpBbGJhbnkgQ291bnR5CisyOlVTOlVTQTpVTklURUQgU1RBVEVTOldZT01JTkc6QmlnIEhvcm4gQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOldZT01JTkc6Q2FtcGJlbGwgQ291bnR5Cis0OlVTOlVTQTpVTklURUQgU1RBVEVTOldZT01JTkc6Q2FyYm9uIENvdW50eQorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXWU9NSU5HOkNvbnZlcnNlIENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXWU9NSU5HOkNyb29rIENvdW50eQorNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXWU9NSU5HOkZyZW1vbnQgQ291bnR5Cis4OlVTOlVTQTpVTklURUQgU1RBVEVTOldZT01JTkc6R29zaGVuIENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXWU9NSU5HOkhvdCBTcHJpbmdzIENvdW50eQorMTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6V1lPTUlORzpKb2huc29uIENvdW50eQorMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6V1lPTUlORzpMYXJhbWllIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6V1lPTUlORzpMaW5jb2xuIENvdW50eQorMTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6V1lPTUlORzpOYXRyb25hIENvdW50eQorMTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6V1lPTUlORzpOaW9icmFyYSBDb3VudHkKKzE1OlVTOlVTQTpVTklURUQgU1RBVEVTOldZT01JTkc6UGFyayBDb3VudHkKKzE2OlVTOlVTQTpVTklURUQgU1RBVEVTOldZT01JTkc6UGxhdHRlIENvdW50eQorMTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6V1lPTUlORzpTaGVyaWRhbiBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOldZT01JTkc6U3VibGV0dGUgQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXWU9NSU5HOlN3ZWV0d2F0ZXIgQ291bnR5CisyMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXWU9NSU5HOlRldG9uIENvdW50eQorMjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6V1lPTUlORzpVaW50YSBDb3VudHkKKzIyOlVTOlVTQTpVTklURUQgU1RBVEVTOldZT01JTkc6V2FzaGFraWUgQ291bnR5CisyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXWU9NSU5HOldlc3RvbiBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpBcHBsaW5nIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkF0a2luc29uIENvdW50eQorMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkJhY29uIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkJha2VyIENvdW50eQorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkJhbGR3aW4gQ291bnR5Cis2OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6QmFua3MgQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6QmFycm93IENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkJhcnRvdyBDb3VudHkKKzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpCZW4gSGlsbCBDb3VudHkKKzEwOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6QmVycmllbiBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6QmliYiBDb3VudHkKKzEyOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6QmxlY2tsZXkgQ291bnR5CisxMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkJyYW50bGV5IENvdW50eQorMTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpCcm9va3MgQ291bnR5CisxNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkJyeWFuIENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpCdWxsb2NoIENvdW50eQorMTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpCdXJrZSBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6QnV0dHMgQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkNhbGhvdW4gQ291bnR5CisyMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkNhbWRlbiBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6Q2FuZGxlciBDb3VudHkKKzIyOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6Q2Fycm9sbCBDb3VudHkKKzIzOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6Q2F0b29zYSBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6Q2hhcmx0b24gQ291bnR5CisyNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkNoYXRoYW0gQ291bnR5CisyNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkNoYXR0YWhvb2NoZWUgQ291bnR5CisyNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkNoYXR0b29nYSBDb3VudHkKKzI4OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6Q2hlcm9rZWUgQ291bnR5CisyOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkNsYXJrZSBDb3VudHkKKzMwOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6Q2xheSBDb3VudHkKKzMxOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6Q2xheXRvbiBDb3VudHkKKzMyOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6Q2xpbmNoIENvdW50eQorMzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpDb2JiIENvdW50eQorMzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpDb2ZmZWUgQ291bnR5CiszNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkNvbHF1aXR0IENvdW50eQorMzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpDb2x1bWJpYSBDb3VudHkKKzM3OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6Q29vayBDb3VudHkKKzM4OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6Q293ZXRhIENvdW50eQorMzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpDcmF3Zm9yZCBDb3VudHkKKzQwOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6Q3Jpc3AgQ291bnR5Cis0MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkRhZGUgQ291bnR5Cis0MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkRhd3NvbiBDb3VudHkKKzQzOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6RGVLYWxiIENvdW50eQorNDQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpEZWNhdHVyIENvdW50eQorNDU6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpEb2RnZSBDb3VudHkKKzQ2OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6RG9vbHkgQ291bnR5Cis0NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkRvdWdoZXJ0eSBDb3VudHkKKzQ4OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6RG91Z2xhcyBDb3VudHkKKzQ5OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6RWFybHkgQ291bnR5Cis1MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkVjaG9scyBDb3VudHkKKzUxOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6RWZmaW5naGFtIENvdW50eQorNTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpFbGJlcnQgQ291bnR5Cis1MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkVtYW51ZWwgQ291bnR5Cis1NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkV2YW5zIENvdW50eQorNTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpGYW5uaW4gQ291bnR5Cis1NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkZheWV0dGUgQ291bnR5Cis1NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkZsb3lkIENvdW50eQorNTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpGb3JzeXRoIENvdW50eQorNTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpGcmFua2xpbiBDb3VudHkKKzYwOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6RnVsdG9uIENvdW50eQorNjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpHaWxtZXIgQ291bnR5Cis2MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkdsYXNjb2NrIENvdW50eQorNjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpHbHlubiBDb3VudHkKKzY0OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6R29yZG9uIENvdW50eQorNjU6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpHcmFkeSBDb3VudHkKKzY2OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6R3JlZW5lIENvdW50eQorNjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpHd2lubmV0dCBDb3VudHkKKzY4OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6SGFiZXJzaGFtIENvdW50eQorNjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpIYWxsIENvdW50eQorNzA6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpIYW5jb2NrIENvdW50eQorNzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpIYXJhbHNvbiBDb3VudHkKKzcyOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6SGFycmlzIENvdW50eQorNzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpIYXJ0IENvdW50eQorNzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpIZWFyZCBDb3VudHkKKzc1OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6SGVucnkgQ291bnR5Cis3NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkhvdXN0b24gQ291bnR5Cis3NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOklyd2luIENvdW50eQorNzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpKYWNrc29uIENvdW50eQorNzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpKYXNwZXIgQ291bnR5Cis4MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkplZmYgRGF2aXMgQ291bnR5Cis4MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkplZmZlcnNvbiBDb3VudHkKKzgyOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6SmVua2lucyBDb3VudHkKKzgzOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6Sm9obnNvbiBDb3VudHkKKzg0OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6Sm9uZXMgQ291bnR5Cis4NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkxhbWFyIENvdW50eQorODY6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpMYW5pZXIgQ291bnR5Cis4NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkxhdXJlbnMgQ291bnR5Cis4ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOkxlZSBDb3VudHkKKzg5OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6TGliZXJ0eSBDb3VudHkKKzkwOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6TGluY29sbiBDb3VudHkKKzkxOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6TG9uZyBDb3VudHkKKzkyOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6TG93bmRlcyBDb3VudHkKKzkzOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6THVtcGtpbiBDb3VudHkKKzk0OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6TWFjb24gQ291bnR5Cis5NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOk1hZGlzb24gQ291bnR5Cis5NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOk1hcmlvbiBDb3VudHkKKzk3OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6TWNEdWZmaWUgQ291bnR5Cis5ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOk1jSW50b3NoIENvdW50eQorOTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpNZXJpd2V0aGVyIENvdW50eQorMTAwOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6TWlsbGVyIENvdW50eQorMTAxOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6TWl0Y2hlbGwgQ291bnR5CisxMDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpNb25yb2UgQ291bnR5CisxMDM6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpNb250Z29tZXJ5IENvdW50eQorMTA0OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6TW9yZ2FuIENvdW50eQorMTA1OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6TXVycmF5IENvdW50eQorMTA2OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6TXVzY29nZWUgQ291bnR5CisxMDc6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpOZXd0b24gQ291bnR5CisxMDg6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpPY29uZWUgQ291bnR5CisxMDk6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpPZ2xldGhvcnBlIENvdW50eQorMTEwOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6UGF1bGRpbmcgQ291bnR5CisxMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpQZWFjaCBDb3VudHkKKzExMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOlBpY2tlbnMgQ291bnR5CisxMTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpQaWVyY2UgQ291bnR5CisxMTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpQaWtlIENvdW50eQorMTE1OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6UG9sayBDb3VudHkKKzExNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOlB1bGFza2kgQ291bnR5CisxMTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpQdXRuYW0gQ291bnR5CisxMTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpRdWl0bWFuIENvdW50eQorMTE5OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6UmFidW4gQ291bnR5CisxMjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpSYW5kb2xwaCBDb3VudHkKKzEyMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOlJpY2htb25kIENvdW50eQorMTIyOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6Um9ja2RhbGUgQ291bnR5CisxMjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpTY2hsZXkgQ291bnR5CisxMjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpTY3JldmVuIENvdW50eQorMTI1OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6U2VtaW5vbGUgQ291bnR5CisxMjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpTcGFsZGluZyBDb3VudHkKKzEyNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOlN0ZXBoZW5zIENvdW50eQorMTI4OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6U3Rld2FydCBDb3VudHkKKzEyOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOlN1bXRlciBDb3VudHkKKzEzMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOlRhbGJvdCBDb3VudHkKKzEzMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOlRhbGlhZmVycm8gQ291bnR5CisxMzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpUYXR0bmFsbCBDb3VudHkKKzEzMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOlRheWxvciBDb3VudHkKKzEzNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOlRlbGZhaXIgQ291bnR5CisxMzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpUZXJyZWxsIENvdW50eQorMTM2OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6VGhvbWFzIENvdW50eQorMTM3OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6VGlmdCBDb3VudHkKKzEzODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOlRvb21icyBDb3VudHkKKzEzOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOlRvd25zIENvdW50eQorMTQwOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6VHJldXRsZW4gQ291bnR5CisxNDE6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpUcm91cCBDb3VudHkKKzE0MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOlR1cm5lciBDb3VudHkKKzE0MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOlR3aWdncyBDb3VudHkKKzE0NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOlVuaW9uIENvdW50eQorMTQ1OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6VXBzb24gQ291bnR5CisxNDY6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpXYWxrZXIgQ291bnR5CisxNDc6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpXYWx0b24gQ291bnR5CisxNDg6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpXYXJlIENvdW50eQorMTQ5OlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6V2FycmVuIENvdW50eQorMTUwOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6V2FzaGluZ3RvbiBDb3VudHkKKzE1MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOldheW5lIENvdW50eQorMTUyOlVTOlVTQTpVTklURUQgU1RBVEVTOkdFT1JHSUE6V2Vic3RlciBDb3VudHkKKzE1MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOldoZWVsZXIgQ291bnR5CisxNTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6R0VPUkdJQTpXaGl0ZSBDb3VudHkKKzE1NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOldoaXRmaWVsZCBDb3VudHkKKzE1NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOldpbGNveCBDb3VudHkKKzE1NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOldpbGtlcyBDb3VudHkKKzE1ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOldpbGtpbnNvbiBDb3VudHkKKzE1OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpHRU9SR0lBOldvcnRoIENvdW50eQorMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpBZGFtcyBDb3VudHkKKzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86QWxhbW9zYSBDb3VudHkKKzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86QXJhcGFob2UgQ291bnR5Cis0OlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOkFyY2h1bGV0YSBDb3VudHkKKzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86QmFjYSBDb3VudHkKKzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86QmVudCBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86Qm91bGRlciBDb3VudHkKKzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86Q2hhZmZlZSBDb3VudHkKKzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86Q2hleWVubmUgQ291bnR5CisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpDbGVhciBDcmVlayBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOkNvbmVqb3MgQ291bnR5CisxMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpDb3N0aWxsYSBDb3VudHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOkNyb3dsZXkgQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpDdXN0ZXIgQ291bnR5CisxNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpEZWx0YSBDb3VudHkKKzE2OlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOkRlbnZlciBDb3VudHkKKzE3OlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOkRvbG9yZXMgQ291bnR5CisxODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpEb3VnbGFzIENvdW50eQorMTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86RWFnbGUgQ291bnR5CisyMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpFbCBQYXNvIENvdW50eQorMjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86RWxiZXJ0IENvdW50eQorMjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86RnJlbW9udCBDb3VudHkKKzIzOlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOkdhcmZpZWxkIENvdW50eQorMjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86R2lscGluIENvdW50eQorMjU6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86R3JhbmQgQ291bnR5CisyNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpHdW5uaXNvbiBDb3VudHkKKzI3OlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOkhpbnNkYWxlIENvdW50eQorMjg6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86SHVlcmZhbm8gQ291bnR5CisyOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpKYWNrc29uIENvdW50eQorMzA6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86SmVmZmVyc29uIENvdW50eQorMzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86S2lvd2EgQ291bnR5CiszMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpLaXQgQ2Fyc29uIENvdW50eQorMzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86TGEgUGxhdGEgQ291bnR5CiszNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpMYWtlIENvdW50eQorMzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86TGFyaW1lciBDb3VudHkKKzM2OlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOkxhcyBBbmltYXMgQ291bnR5CiszNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpMaW5jb2xuIENvdW50eQorMzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86TG9nYW4gQ291bnR5CiszOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpNZXNhIENvdW50eQorNDA6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86TWluZXJhbCBDb3VudHkKKzQxOlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOk1vZmZhdCBDb3VudHkKKzQyOlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOk1vbnRlenVtYSBDb3VudHkKKzQzOlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOk1vbnRyb3NlIENvdW50eQorNDQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86TW9yZ2FuIENvdW50eQorNDU6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86T3Rlcm8gQ291bnR5Cis0NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpPdXJheSBDb3VudHkKKzQ3OlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOlBhcmsgQ291bnR5Cis0ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpQaGlsbGlwcyBDb3VudHkKKzQ5OlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOlBpdGtpbiBDb3VudHkKKzUwOlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOlByb3dlcnMgQ291bnR5Cis1MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpQdWVibG8gQ291bnR5Cis1MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpSaW8gQmxhbmNvIENvdW50eQorNTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86UmlvIEdyYW5kZSBDb3VudHkKKzU0OlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOlJvdXR0IENvdW50eQorNTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86U2FndWFjaGUgQ291bnR5Cis1NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpTYW4gSnVhbiBDb3VudHkKKzU3OlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOlNhbiBNaWd1ZWwgQ291bnR5Cis1ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpTZWRnd2ljayBDb3VudHkKKzU5OlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOlN1bW1pdCBDb3VudHkKKzYwOlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOlRlbGxlciBDb3VudHkKKzYxOlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTE9SQURPOldhc2hpbmd0b24gQ291bnR5Cis2MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT0xPUkFETzpXZWxkIENvdW50eQorNjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09MT1JBRE86WXVtYSBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6QWRhbXMgQ291bnR5CisyOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkFudGVsb3BlIENvdW50eQorMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpBcnRodXIgQ291bnR5Cis0OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkJhbm5lciBDb3VudHkKKzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6QmxhaW5lIENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpCb29uZSBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6Qm94IEJ1dHRlIENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpCb3lkIENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpCcm93biBDb3VudHkKKzEwOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkJ1ZmZhbG8gQ291bnR5CisxMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpCdXJ0IENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6QnV0bGVyIENvdW50eQorMTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6Q2FzcyBDb3VudHkKKzE0OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkNlZGFyIENvdW50eQorMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6Q2hhc2UgQ291bnR5CisxNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpDaGVycnkgQ291bnR5CisxNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpDaGV5ZW5uZSBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkNsYXkgQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpDb2xmYXggQ291bnR5CisyMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpDdW1pbmcgQ291bnR5CisyMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpDdXN0ZXIgQ291bnR5CisyMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpEYWtvdGEgQ291bnR5CisyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpEYXdlcyBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkRhd3NvbiBDb3VudHkKKzI1OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkRldWVsIENvdW50eQorMjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6RGl4b24gQ291bnR5CisyNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpEb2RnZSBDb3VudHkKKzI4OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkRvdWdsYXMgQ291bnR5CisyOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpEdW5keSBDb3VudHkKKzMwOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkZpbGxtb3JlIENvdW50eQorMzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6RnJhbmtsaW4gQ291bnR5CiszMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpGcm9udGllciBDb3VudHkKKzMzOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkZ1cm5hcyBDb3VudHkKKzM0OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkdhZ2UgQ291bnR5CiszNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpHYXJkZW4gQ291bnR5CiszNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpHYXJmaWVsZCBDb3VudHkKKzM3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkdvc3BlciBDb3VudHkKKzM4OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkdyYW50IENvdW50eQorMzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6R3JlZWxleSBDb3VudHkKKzQwOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkhhbGwgQ291bnR5Cis0MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpIYW1pbHRvbiBDb3VudHkKKzQyOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkhhcmxhbiBDb3VudHkKKzQzOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkhheWVzIENvdW50eQorNDQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6SGl0Y2hjb2NrIENvdW50eQorNDU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6SG9sdCBDb3VudHkKKzQ2OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkhvb2tlciBDb3VudHkKKzQ3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkhvd2FyZCBDb3VudHkKKzQ4OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkplZmZlcnNvbiBDb3VudHkKKzQ5OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkpvaG5zb24gQ291bnR5Cis1MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpLZWFybmV5IENvdW50eQorNTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6S2VpdGggQ291bnR5Cis1MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpLZXlhIFBhaGEgQ291bnR5Cis1MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpLaW1iYWxsIENvdW50eQorNTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6S25veCBDb3VudHkKKzU1OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkxhbmNhc3RlciBDb3VudHkKKzU2OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkxpbmNvbG4gQ291bnR5Cis1NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpMb2dhbiBDb3VudHkKKzU4OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOkxvdXAgQ291bnR5Cis1OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpNYWRpc29uIENvdW50eQorNjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6TWNQaGVyc29uIENvdW50eQorNjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6TWVycmljayBDb3VudHkKKzYyOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOk1vcnJpbGwgQ291bnR5Cis2MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpOYW5jZSBDb3VudHkKKzY0OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOk5lbWFoYSBDb3VudHkKKzY1OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOk51Y2tvbGxzIENvdW50eQorNjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6T3RvZSBDb3VudHkKKzY3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOlBhd25lZSBDb3VudHkKKzY4OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOlBlcmtpbnMgQ291bnR5Cis2OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpQaGVscHMgQ291bnR5Cis3MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpQaWVyY2UgQ291bnR5Cis3MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpQbGF0dGUgQ291bnR5Cis3MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpQb2xrIENvdW50eQorNzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6UmVkIFdpbGxvdyBDb3VudHkKKzc0OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOlJpY2hhcmRzb24gQ291bnR5Cis3NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpSb2NrIENvdW50eQorNzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6U2FsaW5lIENvdW50eQorNzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6U2FycHkgQ291bnR5Cis3ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpTYXVuZGVycyBDb3VudHkKKzc5OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOlNjb3R0cyBCbHVmZiBDb3VudHkKKzgwOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOlNld2FyZCBDb3VudHkKKzgxOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOlNoZXJpZGFuIENvdW50eQorODI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6U2hlcm1hbiBDb3VudHkKKzgzOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOlNpb3V4IENvdW50eQorODQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6U3RhbnRvbiBDb3VudHkKKzg1OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOlRoYXllciBDb3VudHkKKzg2OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOlRob21hcyBDb3VudHkKKzg3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOlRodXJzdG9uIENvdW50eQorODg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6VmFsbGV5IENvdW50eQorODk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6V2FzaGluZ3RvbiBDb3VudHkKKzkwOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOldheW5lIENvdW50eQorOTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVCUkFTS0E6V2Vic3RlciBDb3VudHkKKzkyOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FQlJBU0tBOldoZWVsZXIgQ291bnR5Cis5MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORUJSQVNLQTpZb3JrIENvdW50eQorMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBDQVJPTElOQTpBYmJldmlsbGUgQ291bnR5CisyOlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOkFpa2VuIENvdW50eQorMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBDQVJPTElOQTpBbGxlbmRhbGUgQ291bnR5Cis0OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOkFuZGVyc29uIENvdW50eQorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBDQVJPTElOQTpCYW1iZXJnIENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBDQVJPTElOQTpCYXJud2VsbCBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggQ0FST0xJTkE6QmVhdWZvcnQgQ291bnR5Cis4OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOkJlcmtlbGV5IENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBDQVJPTElOQTpDYWxob3VuIENvdW50eQorMTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggQ0FST0xJTkE6Q2hhcmxlc3RvbiBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOkNoZXJva2VlIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggQ0FST0xJTkE6Q2hlc3RlciBDb3VudHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOkNoZXN0ZXJmaWVsZCBDb3VudHkKKzE0OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOkNsYXJlbmRvbiBDb3VudHkKKzE1OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOkNvbGxldG9uIENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggQ0FST0xJTkE6RGFybGluZ3RvbiBDb3VudHkKKzE3OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOkRpbGxvbiBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOkRvcmNoZXN0ZXIgQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBDQVJPTElOQTpFZGdlZmllbGQgQ291bnR5CisyMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBDQVJPTElOQTpGYWlyZmllbGQgQ291bnR5CisyMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBDQVJPTElOQTpGbG9yZW5jZSBDb3VudHkKKzIyOlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOkdlb3JnZXRvd24gQ291bnR5CisyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBDQVJPTElOQTpHcmVlbnZpbGxlIENvdW50eQorMjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggQ0FST0xJTkE6R3JlZW53b29kIENvdW50eQorMjU6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggQ0FST0xJTkE6SGFtcHRvbiBDb3VudHkKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOkhvcnJ5IENvdW50eQorMjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggQ0FST0xJTkE6SmFzcGVyIENvdW50eQorMjg6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggQ0FST0xJTkE6S2Vyc2hhdyBDb3VudHkKKzI5OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOkxhbmNhc3RlciBDb3VudHkKKzMwOlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOkxhdXJlbnMgQ291bnR5CiszMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBDQVJPTElOQTpMZWUgQ291bnR5CiszMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBDQVJPTElOQTpMZXhpbmd0b24gQ291bnR5CiszMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBDQVJPTElOQTpNYXJpb24gQ291bnR5CiszNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBDQVJPTElOQTpNYXJsYm9ybyBDb3VudHkKKzM1OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOk1jQ29ybWljayBDb3VudHkKKzM2OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOk5ld2JlcnJ5IENvdW50eQorMzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggQ0FST0xJTkE6T2NvbmVlIENvdW50eQorMzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggQ0FST0xJTkE6T3JhbmdlYnVyZyBDb3VudHkKKzM5OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOlBpY2tlbnMgQ291bnR5Cis0MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBDQVJPTElOQTpSaWNobGFuZCBDb3VudHkKKzQxOlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOlNhbHVkYSBDb3VudHkKKzQyOlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIENBUk9MSU5BOlNwYXJ0YW5idXJnIENvdW50eQorNDM6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggQ0FST0xJTkE6U3VtdGVyIENvdW50eQorNDQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggQ0FST0xJTkE6VW5pb24gQ291bnR5Cis0NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBDQVJPTElOQTpXaWxsaWFtc2J1cmcgQ291bnR5Cis0NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBDQVJPTElOQTpZb3JrIENvdW50eQorMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFTS0E6QWxldXRpYW5zIEVhc3QgQm9yb3VnaAorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFTS0E6QWxldXRpYW5zIFdlc3QKKzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBU0tBOkFuY2hvcmFnZSBNdW5pY2lwYWxpdHkKKzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBU0tBOkJldGhlbAorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFTS0E6QnJpc3RvbCBCYXkgQm9yb3VnaAorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFTS0E6RGVuYWxpIEJvcm91Z2gKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBU0tBOkRpbGxpbmdoYW0KKzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBU0tBOkZhaXJiYW5rcyBOb3J0aCBTdGFyIEJvcm91Z2gKKzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBU0tBOkhhaW5lcyBCb3JvdWdoCisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFTS0E6SnVuZWF1IEJvcm91Z2gKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQVNLQTpLZW5haSBQZW5pbnN1bGEgQm9yb3VnaAorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBU0tBOktldGNoaWthbiBHYXRld2F5IEJvcm91Z2gKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQVNLQTpLb2RpYWsgSXNsYW5kIEJvcm91Z2gKKzE0OlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQVNLQTpMYWtlIGFuZCBQZW5pbnN1bGEgQm9yb3VnaAorMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBU0tBOk1hdGFudXNrYS1TdXNpdG5hIEJvcm91Z2gKKzE2OlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQVNLQTpOb21lCisxNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFTS0E6Tm9ydGggU2xvcGUgQm9yb3VnaAorMTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBU0tBOk5vcnRod2VzdCBBcmN0aWMgQm9yb3VnaAorMTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBU0tBOlByaW5jZSBvZiBXYWxlcy1PdXRlciBLZXRjaGlrYW4KKzIwOlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQVNLQTpTaXRrYSBCb3JvdWdoCisyMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFTS0E6U2thZ3dheS1Ib29uYWgtQW5nb29uCisyMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFTS0E6U291dGhlYXN0IEZhaXJiYW5rcworMjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBU0tBOlZhbGRlei1Db3Jkb3ZhCisyNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFTS0E6V2FkZSBIYW1wdG9uCisyNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFTS0E6V3JhbmdlbGwtUGV0ZXJzYnVyZworMjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBU0tBOllha3V0YXQgQm9yb3VnaAorMjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBU0tBOll1a29uLUtveXVrdWsKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOkFkYW1zIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpQRU5OU1lMVkFOSUE6QWxsZWdoZW55IENvdW50eQorMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpQRU5OU1lMVkFOSUE6QXJtc3Ryb25nIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpQRU5OU1lMVkFOSUE6QmVhdmVyIENvdW50eQorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpQRU5OU1lMVkFOSUE6QmVkZm9yZCBDb3VudHkKKzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOkJlcmtzIENvdW50eQorNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpQRU5OU1lMVkFOSUE6QmxhaXIgQ291bnR5Cis4OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpCcmFkZm9yZCBDb3VudHkKKzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOkJ1Y2tzIENvdW50eQorMTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOkJ1dGxlciBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpDYW1icmlhIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOkNhbWVyb24gQ291bnR5CisxMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpQRU5OU1lMVkFOSUE6Q2FyYm9uIENvdW50eQorMTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOkNlbnRyZSBDb3VudHkKKzE1OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpDaGVzdGVyIENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOkNsYXJpb24gQ291bnR5CisxNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpQRU5OU1lMVkFOSUE6Q2xlYXJmaWVsZCBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpDbGludG9uIENvdW50eQorMTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOkNvbHVtYmlhIENvdW50eQorMjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOkNyYXdmb3JkIENvdW50eQorMjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOkN1bWJlcmxhbmQgQ291bnR5CisyMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpQRU5OU1lMVkFOSUE6RGF1cGhpbiBDb3VudHkKKzIzOlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpEZWxhd2FyZSBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpFbGsgQ291bnR5CisyNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpQRU5OU1lMVkFOSUE6RXJpZSBDb3VudHkKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpGYXlldHRlIENvdW50eQorMjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOkZvcmVzdCBDb3VudHkKKzI4OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpGcmFua2xpbiBDb3VudHkKKzI5OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpGdWx0b24gQ291bnR5CiszMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpQRU5OU1lMVkFOSUE6R3JlZW5lIENvdW50eQorMzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOkh1bnRpbmdkb24gQ291bnR5CiszMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpQRU5OU1lMVkFOSUE6SW5kaWFuYSBDb3VudHkKKzMzOlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpKZWZmZXJzb24gQ291bnR5CiszNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpQRU5OU1lMVkFOSUE6SnVuaWF0YSBDb3VudHkKKzM1OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpMYWNrYXdhbm5hIENvdW50eQorMzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOkxhbmNhc3RlciBDb3VudHkKKzM3OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpMYXdyZW5jZSBDb3VudHkKKzM4OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpMZWJhbm9uIENvdW50eQorMzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOkxlaGlnaCBDb3VudHkKKzQwOlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpMdXplcm5lIENvdW50eQorNDE6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOkx5Y29taW5nIENvdW50eQorNDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOk1jS2VhbiBDb3VudHkKKzQzOlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpNZXJjZXIgQ291bnR5Cis0NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpQRU5OU1lMVkFOSUE6TWlmZmxpbiBDb3VudHkKKzQ1OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpNb25yb2UgQ291bnR5Cis0NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpQRU5OU1lMVkFOSUE6TW9udGdvbWVyeSBDb3VudHkKKzQ3OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpNb250b3VyIENvdW50eQorNDg6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOk5vcnRoYW1wdG9uIENvdW50eQorNDk6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOk5vcnRodW1iZXJsYW5kIENvdW50eQorNTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOlBlcnJ5IENvdW50eQorNTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOlBoaWxhZGVscGhpYSBDb3VudHkKKzUyOlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpQaWtlIENvdW50eQorNTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOlBvdHRlciBDb3VudHkKKzU0OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpTY2h1eWxraWxsIENvdW50eQorNTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOlNueWRlciBDb3VudHkKKzU2OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpTb21lcnNldCBDb3VudHkKKzU3OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpTdWxsaXZhbiBDb3VudHkKKzU4OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpTdXNxdWVoYW5uYSBDb3VudHkKKzU5OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpUaW9nYSBDb3VudHkKKzYwOlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpVbmlvbiBDb3VudHkKKzYxOlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpWZW5hbmdvIENvdW50eQorNjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOldhcnJlbiBDb3VudHkKKzYzOlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpXYXNoaW5ndG9uIENvdW50eQorNjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOldheW5lIENvdW50eQorNjU6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOldlc3Rtb3JlbGFuZCBDb3VudHkKKzY2OlVTOlVTQTpVTklURUQgU1RBVEVTOlBFTk5TWUxWQU5JQTpXeW9taW5nIENvdW50eQorNjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6UEVOTlNZTFZBTklBOllvcmsgQ291bnR5CisxOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkFjY29tYWNrIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpBbGJlbWFybGUgQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkFsZXhhbmRyaWEgY2l0eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpBbGxlZ2hhbnkgQ291bnR5Cis1OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkFtZWxpYSBDb3VudHkKKzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6QW1oZXJzdCBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6QXBwb21hdHRveCBDb3VudHkKKzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6QXJsaW5ndG9uIENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpBdWd1c3RhIENvdW50eQorMTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6QmF0aCBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkJlZGZvcmQgQ291bnR5CisxMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpCZWRmb3JkIGNpdHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkJsYW5kIENvdW50eQorMTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6Qm90ZXRvdXJ0IENvdW50eQorMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6QnJpc3RvbCBjaXR5CisxNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpCcnVuc3dpY2sgQ291bnR5CisxNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpCdWNoYW5hbiBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkJ1Y2tpbmdoYW0gQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpCdWVuYSBWaXN0YSBjaXR5CisyMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpDYW1wYmVsbCBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkNhcm9saW5lIENvdW50eQorMjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6Q2Fycm9sbCBDb3VudHkKKzIzOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkNoYXJsZXMgQ2l0eSBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkNoYXJsb3R0ZSBDb3VudHkKKzI1OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkNoYXJsb3R0ZXN2aWxsZSBjaXR5CisyNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpDaGVzYXBlYWtlIGNpdHkKKzI3OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkNoZXN0ZXJmaWVsZCBDb3VudHkKKzI4OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkNsYXJrZSBDb3VudHkKKzI5OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkNsaWZ0b24gRm9yZ2UgY2l0eQorMzA6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6Q29sb25pYWwgSGVpZ2h0cyBjaXR5CiszMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpDb3Zpbmd0b24gY2l0eQorMzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6Q3JhaWcgQ291bnR5CiszMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpDdWxwZXBlciBDb3VudHkKKzM0OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkN1bWJlcmxhbmQgQ291bnR5CiszNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpEYW52aWxsZSBjaXR5CiszNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpEaWNrZW5zb24gQ291bnR5CiszNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpEaW53aWRkaWUgQ291bnR5CiszODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpFbXBvcmlhIGNpdHkKKzM5OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkVzc2V4IENvdW50eQorNDA6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6RmFpcmZheCBDb3VudHkKKzQxOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkZhaXJmYXggY2l0eQorNDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6RmFsbHMgQ2h1cmNoIGNpdHkKKzQzOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkZhdXF1aWVyIENvdW50eQorNDQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6RmxveWQgQ291bnR5Cis0NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpGbHV2YW5uYSBDb3VudHkKKzQ2OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkZyYW5rbGluIENvdW50eQorNDc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6RnJhbmtsaW4gY2l0eQorNDg6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6RnJlZGVyaWNrIENvdW50eQorNDk6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6RnJlZGVyaWNrc2J1cmcgY2l0eQorNTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6R2FsYXggY2l0eQorNTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6R2lsZXMgQ291bnR5Cis1MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpHbG91Y2VzdGVyIENvdW50eQorNTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6R29vY2hsYW5kIENvdW50eQorNTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6R3JheXNvbiBDb3VudHkKKzU1OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkdyZWVuZSBDb3VudHkKKzU2OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkdyZWVuc3ZpbGxlIENvdW50eQorNTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6SGFsaWZheCBDb3VudHkKKzU4OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkhhbXB0b24gY2l0eQorNTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6SGFub3ZlciBDb3VudHkKKzYwOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkhhcnJpc29uYnVyZyBjaXR5Cis2MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpIZW5yaWNvIENvdW50eQorNjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6SGVucnkgQ291bnR5Cis2MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpIaWdobGFuZCBDb3VudHkKKzY0OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkhvcGV3ZWxsIGNpdHkKKzY1OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOklzbGUgb2YgV2lnaHQgQ291bnR5Cis2NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpKYW1lcyBDaXR5IENvdW50eQorNjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6S2luZyBHZW9yZ2UgQ291bnR5Cis2ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpLaW5nIFdpbGxpYW0gQ291bnR5Cis2OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpLaW5nIGFuZCBRdWVlbiBDb3VudHkKKzcwOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkxhbmNhc3RlciBDb3VudHkKKzcxOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkxlZSBDb3VudHkKKzcyOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOkxleGluZ3RvbiBjaXR5Cis3MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpMb3Vkb3VuIENvdW50eQorNzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6TG91aXNhIENvdW50eQorNzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6THVuZW5idXJnIENvdW50eQorNzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6THluY2hidXJnIGNpdHkKKzc3OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOk1hZGlzb24gQ291bnR5Cis3ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpNYW5hc3NhcyBQYXJrIGNpdHkKKzc5OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOk1hbmFzc2FzIGNpdHkKKzgwOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOk1hcnRpbnN2aWxsZSBjaXR5Cis4MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpNYXRoZXdzIENvdW50eQorODI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6TWVja2xlbmJ1cmcgQ291bnR5Cis4MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpNaWRkbGVzZXggQ291bnR5Cis4NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpNb250Z29tZXJ5IENvdW50eQorODU6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6TmVsc29uIENvdW50eQorODY6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6TmV3IEtlbnQgQ291bnR5Cis4NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpOZXdwb3J0IE5ld3MgY2l0eQorODg6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6Tm9yZm9sayBjaXR5Cis4OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpOb3J0aGFtcHRvbiBDb3VudHkKKzkwOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOk5vcnRodW1iZXJsYW5kIENvdW50eQorOTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6Tm9ydG9uIGNpdHkKKzkyOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOk5vdHRvd2F5IENvdW50eQorOTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6T3JhbmdlIENvdW50eQorOTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6UGFnZSBDb3VudHkKKzk1OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOlBhdHJpY2sgQ291bnR5Cis5NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpQZXRlcnNidXJnIGNpdHkKKzk3OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOlBpdHRzeWx2YW5pYSBDb3VudHkKKzk4OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOlBvcXVvc29uIGNpdHkKKzk5OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOlBvcnRzbW91dGggY2l0eQorMTAwOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOlBvd2hhdGFuIENvdW50eQorMTAxOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOlByaW5jZSBFZHdhcmQgQ291bnR5CisxMDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6UHJpbmNlIEdlb3JnZSBDb3VudHkKKzEwMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpQcmluY2UgV2lsbGlhbSBDb3VudHkKKzEwNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpQdWxhc2tpIENvdW50eQorMTA1OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOlJhZGZvcmQgY2l0eQorMTA2OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOlJhcHBhaGFubm9jayBDb3VudHkKKzEwNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpSaWNobW9uZCBDb3VudHkKKzEwODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpSaWNobW9uZCBjaXR5CisxMDk6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6Um9hbm9rZSBDb3VudHkKKzExMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpSb2Fub2tlIGNpdHkKKzExMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpSb2NrYnJpZGdlIENvdW50eQorMTEyOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOlJvY2tpbmdoYW0gQ291bnR5CisxMTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6UnVzc2VsbCBDb3VudHkKKzExNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpTYWxlbSBjaXR5CisxMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6U2NvdHQgQ291bnR5CisxMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6U2hlbmFuZG9haCBDb3VudHkKKzExNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpTbXl0aCBDb3VudHkKKzExODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpTb3V0aGFtcHRvbiBDb3VudHkKKzExOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpTcG90c3lsdmFuaWEgQ291bnR5CisxMjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6U3RhZmZvcmQgQ291bnR5CisxMjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6U3RhdW50b24gY2l0eQorMTIyOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOlN1ZmZvbGsgY2l0eQorMTIzOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOlN1cnJ5IENvdW50eQorMTI0OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOlN1c3NleCBDb3VudHkKKzEyNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpUYXpld2VsbCBDb3VudHkKKzEyNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpWaXJnaW5pYSBCZWFjaCBjaXR5CisxMjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6V2FycmVuIENvdW50eQorMTI4OlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOldhc2hpbmd0b24gQ291bnR5CisxMjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6V2F5bmVzYm9ybyBjaXR5CisxMzA6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6V2VzdG1vcmVsYW5kIENvdW50eQorMTMxOlVTOlVTQTpVTklURUQgU1RBVEVTOlZJUkdJTklBOldpbGxpYW1zYnVyZyBjaXR5CisxMzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6V2luY2hlc3RlciBjaXR5CisxMzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VklSR0lOSUE6V2lzZSBDb3VudHkKKzEzNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpXeXRoZSBDb3VudHkKKzEzNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWSVJHSU5JQTpZb3JrIENvdW50eQorMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpBZGFpciBDb3VudHkKKzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6QWxsZW4gQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkFuZGVyc29uIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpCYWxsYXJkIENvdW50eQorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpCYXJyZW4gQ291bnR5Cis2OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkJhdGggQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkJlbGwgQ291bnR5Cis4OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkJvb25lIENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpCb3VyYm9uIENvdW50eQorMTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6Qm95ZCBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkJveWxlIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6QnJhY2tlbiBDb3VudHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkJyZWF0aGl0dCBDb3VudHkKKzE0OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkJyZWNraW5yaWRnZSBDb3VudHkKKzE1OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkJ1bGxpdHQgQ291bnR5CisxNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpCdXRsZXIgQ291bnR5CisxNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpDYWxkd2VsbCBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkNhbGxvd2F5IENvdW50eQorMTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6Q2FtcGJlbGwgQ291bnR5CisyMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpDYXJsaXNsZSBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkNhcnJvbGwgQ291bnR5CisyMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpDYXJ0ZXIgQ291bnR5CisyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpDYXNleSBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkNocmlzdGlhbiBDb3VudHkKKzI1OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkNsYXJrIENvdW50eQorMjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6Q2xheSBDb3VudHkKKzI3OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkNsaW50b24gQ291bnR5CisyODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpDcml0dGVuZGVuIENvdW50eQorMjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6Q3VtYmVybGFuZCBDb3VudHkKKzMwOlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkRhdmllc3MgQ291bnR5CiszMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpFZG1vbnNvbiBDb3VudHkKKzMyOlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkVsbGlvdHQgQ291bnR5CiszMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpFc3RpbGwgQ291bnR5CiszNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpGYXlldHRlIENvdW50eQorMzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6RmxlbWluZyBDb3VudHkKKzM2OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkZsb3lkIENvdW50eQorMzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6RnJhbmtsaW4gQ291bnR5CiszODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpGdWx0b24gQ291bnR5CiszOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpHYWxsYXRpbiBDb3VudHkKKzQwOlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkdhcnJhcmQgQ291bnR5Cis0MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpHcmFudCBDb3VudHkKKzQyOlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkdyYXZlcyBDb3VudHkKKzQzOlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkdyYXlzb24gQ291bnR5Cis0NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpHcmVlbiBDb3VudHkKKzQ1OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkdyZWVudXAgQ291bnR5Cis0NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpIYW5jb2NrIENvdW50eQorNDc6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6SGFyZGluIENvdW50eQorNDg6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6SGFybGFuIENvdW50eQorNDk6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6SGFycmlzb24gQ291bnR5Cis1MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpIYXJ0IENvdW50eQorNTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6SGVuZGVyc29uIENvdW50eQorNTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6SGVucnkgQ291bnR5Cis1MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpIaWNrbWFuIENvdW50eQorNTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6SG9wa2lucyBDb3VudHkKKzU1OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkphY2tzb24gQ291bnR5Cis1NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpKZWZmZXJzb24gQ291bnR5Cis1NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpKZXNzYW1pbmUgQ291bnR5Cis1ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpKb2huc29uIENvdW50eQorNTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6S2VudG9uIENvdW50eQorNjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6S25vdHQgQ291bnR5Cis2MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpLbm94IENvdW50eQorNjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6TGFydWUgQ291bnR5Cis2MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpMYXVyZWwgQ291bnR5Cis2NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpMYXdyZW5jZSBDb3VudHkKKzY1OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkxlZSBDb3VudHkKKzY2OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkxlc2xpZSBDb3VudHkKKzY3OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkxldGNoZXIgQ291bnR5Cis2ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpMZXdpcyBDb3VudHkKKzY5OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOkxpbmNvbG4gQ291bnR5Cis3MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpMaXZpbmdzdG9uIENvdW50eQorNzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6TG9nYW4gQ291bnR5Cis3MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpMeW9uIENvdW50eQorNzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6TWFkaXNvbiBDb3VudHkKKzc0OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOk1hZ29mZmluIENvdW50eQorNzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6TWFyaW9uIENvdW50eQorNzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6TWFyc2hhbGwgQ291bnR5Cis3NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpNYXJ0aW4gQ291bnR5Cis3ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpNYXNvbiBDb3VudHkKKzc5OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOk1jQ3JhY2tlbiBDb3VudHkKKzgwOlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOk1jQ3JlYXJ5IENvdW50eQorODE6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6TWNMZWFuIENvdW50eQorODI6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6TWVhZGUgQ291bnR5Cis4MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpNZW5pZmVlIENvdW50eQorODQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6TWVyY2VyIENvdW50eQorODU6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6TWV0Y2FsZmUgQ291bnR5Cis4NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpNb25yb2UgQ291bnR5Cis4NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpNb250Z29tZXJ5IENvdW50eQorODg6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6TW9yZ2FuIENvdW50eQorODk6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6TXVobGVuYmVyZyBDb3VudHkKKzkwOlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOk5lbHNvbiBDb3VudHkKKzkxOlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOk5pY2hvbGFzIENvdW50eQorOTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6T2hpbyBDb3VudHkKKzkzOlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOk9sZGhhbSBDb3VudHkKKzk0OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOk93ZW4gQ291bnR5Cis5NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpPd3NsZXkgQ291bnR5Cis5NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpQZW5kbGV0b24gQ291bnR5Cis5NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpQZXJyeSBDb3VudHkKKzk4OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOlBpa2UgQ291bnR5Cis5OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpQb3dlbGwgQ291bnR5CisxMDA6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6UHVsYXNraSBDb3VudHkKKzEwMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpSb2JlcnRzb24gQ291bnR5CisxMDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6Um9ja2Nhc3RsZSBDb3VudHkKKzEwMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpSb3dhbiBDb3VudHkKKzEwNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpSdXNzZWxsIENvdW50eQorMTA1OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOlNjb3R0IENvdW50eQorMTA2OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOlNoZWxieSBDb3VudHkKKzEwNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpTaW1wc29uIENvdW50eQorMTA4OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOlNwZW5jZXIgQ291bnR5CisxMDk6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6VGF5bG9yIENvdW50eQorMTEwOlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOlRvZGQgQ291bnR5CisxMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6VHJpZ2cgQ291bnR5CisxMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6VHJpbWJsZSBDb3VudHkKKzExMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpVbmlvbiBDb3VudHkKKzExNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpXYXJyZW4gQ291bnR5CisxMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6V2FzaGluZ3RvbiBDb3VudHkKKzExNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpXYXluZSBDb3VudHkKKzExNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLRU5UVUNLWTpXZWJzdGVyIENvdW50eQorMTE4OlVTOlVTQTpVTklURUQgU1RBVEVTOktFTlRVQ0tZOldoaXRsZXkgQ291bnR5CisxMTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6V29sZmUgQ291bnR5CisxMjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0VOVFVDS1k6V29vZGZvcmQgQ291bnR5CisxOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBKRVJTRVk6QXRsYW50aWMgQ291bnR5CisyOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBKRVJTRVk6QmVyZ2VuIENvdW50eQorMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgSkVSU0VZOkJ1cmxpbmd0b24gQ291bnR5Cis0OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBKRVJTRVk6Q2FtZGVuIENvdW50eQorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgSkVSU0VZOkNhcGUgTWF5IENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgSkVSU0VZOkN1bWJlcmxhbmQgQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBKRVJTRVk6RXNzZXggQ291bnR5Cis4OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBKRVJTRVk6R2xvdWNlc3RlciBDb3VudHkKKzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIEpFUlNFWTpIdWRzb24gQ291bnR5CisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgSkVSU0VZOkh1bnRlcmRvbiBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBKRVJTRVk6TWVyY2VyIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIEpFUlNFWTpNaWRkbGVzZXggQ291bnR5CisxMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgSkVSU0VZOk1vbm1vdXRoIENvdW50eQorMTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIEpFUlNFWTpNb3JyaXMgQ291bnR5CisxNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgSkVSU0VZOk9jZWFuIENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIEpFUlNFWTpQYXNzYWljIENvdW50eQorMTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIEpFUlNFWTpTYWxlbSBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBKRVJTRVk6U29tZXJzZXQgQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgSkVSU0VZOlN1c3NleCBDb3VudHkKKzIwOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBKRVJTRVk6VW5pb24gQ291bnR5CisyMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgSkVSU0VZOldhcnJlbiBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6SURBSE86QWRhIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJREFITzpBZGFtcyBDb3VudHkKKzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6SURBSE86QmFubm9jayBDb3VudHkKKzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6SURBSE86QmVhciBMYWtlIENvdW50eQorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJREFITzpCZW5ld2FoIENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJREFITzpCaW5naGFtIENvdW50eQorNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJREFITzpCbGFpbmUgQ291bnR5Cis4OlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOkJvaXNlIENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJREFITzpCb25uZXIgQ291bnR5CisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJREFITzpCb25uZXZpbGxlIENvdW50eQorMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6SURBSE86Qm91bmRhcnkgQ291bnR5CisxMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJREFITzpCdXR0ZSBDb3VudHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOkNhbWFzIENvdW50eQorMTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6SURBSE86Q2FueW9uIENvdW50eQorMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6SURBSE86Q2FyaWJvdSBDb3VudHkKKzE2OlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOkNhc3NpYSBDb3VudHkKKzE3OlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOkNsYXJrIENvdW50eQorMTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6SURBSE86Q2xlYXJ3YXRlciBDb3VudHkKKzE5OlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOkN1c3RlciBDb3VudHkKKzIwOlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOkVsbW9yZSBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOkZyYW5rbGluIENvdW50eQorMjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6SURBSE86RnJlbW9udCBDb3VudHkKKzIzOlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOkdlbSBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOkdvb2RpbmcgQ291bnR5CisyNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJREFITzpJZGFobyBDb3VudHkKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOkplZmZlcnNvbiBDb3VudHkKKzI3OlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOkplcm9tZSBDb3VudHkKKzI4OlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOktvb3RlbmFpIENvdW50eQorMjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6SURBSE86TGF0YWggQ291bnR5CiszMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJREFITzpMZW1oaSBDb3VudHkKKzMxOlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOkxld2lzIENvdW50eQorMzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6SURBSE86TGluY29sbiBDb3VudHkKKzMzOlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOk1hZGlzb24gQ291bnR5CiszNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJREFITzpNaW5pZG9rYSBDb3VudHkKKzM1OlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOk5leiBQZXJjZSBDb3VudHkKKzM2OlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOk9uZWlkYSBDb3VudHkKKzM3OlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOk93eWhlZSBDb3VudHkKKzM4OlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOlBheWV0dGUgQ291bnR5CiszOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJREFITzpQb3dlciBDb3VudHkKKzQwOlVTOlVTQTpVTklURUQgU1RBVEVTOklEQUhPOlNob3Nob25lIENvdW50eQorNDE6VVM6VVNBOlVOSVRFRCBTVEFURVM6SURBSE86VGV0b24gQ291bnR5Cis0MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJREFITzpUd2luIEZhbGxzIENvdW50eQorNDM6VVM6VVNBOlVOSVRFRCBTVEFURVM6SURBSE86VmFsbGV5IENvdW50eQorNDQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6SURBSE86V2FzaGluZ3RvbiBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpBbGFtZWRhIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDQUxJRk9STklBOkFscGluZSBDb3VudHkKKzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpBbWFkb3IgQ291bnR5Cis0OlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6QnV0dGUgQ291bnR5Cis1OlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6Q2FsYXZlcmFzIENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDQUxJRk9STklBOkNvbHVzYSBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpDb250cmEgQ29zdGEgQ291bnR5Cis4OlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6RGVsIE5vcnRlIENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDQUxJRk9STklBOkVsIERvcmFkbyBDb3VudHkKKzEwOlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6RnJlc25vIENvdW50eQorMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpHbGVubiBDb3VudHkKKzEyOlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6SHVtYm9sZHQgQ291bnR5CisxMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDQUxJRk9STklBOkltcGVyaWFsIENvdW50eQorMTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpJbnlvIENvdW50eQorMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpLZXJuIENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpLaW5ncyBDb3VudHkKKzE3OlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6TGFrZSBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6TGFzc2VuIENvdW50eQorMTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpMb3MgQW5nZWxlcyBDb3VudHkKKzIwOlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6TWFkZXJhIENvdW50eQorMjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpNYXJpbiBDb3VudHkKKzIyOlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6TWFyaXBvc2EgQ291bnR5CisyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDQUxJRk9STklBOk1lbmRvY2lubyBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6TWVyY2VkIENvdW50eQorMjU6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpNb2RvYyBDb3VudHkKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6TW9ubyBDb3VudHkKKzI3OlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6TW9udGVyZXkgQ291bnR5CisyODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDQUxJRk9STklBOk5hcGEgQ291bnR5CisyOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDQUxJRk9STklBOk5ldmFkYSBDb3VudHkKKzMwOlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6T3JhbmdlIENvdW50eQorMzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpQbGFjZXIgQ291bnR5CiszMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDQUxJRk9STklBOlBsdW1hcyBDb3VudHkKKzMzOlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6Uml2ZXJzaWRlIENvdW50eQorMzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpTYWNyYW1lbnRvIENvdW50eQorMzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpTYW4gQmVuaXRvIENvdW50eQorMzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpTYW4gQmVybmFyZGlubyBDb3VudHkKKzM3OlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6U2FuIERpZWdvIENvdW50eQorMzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpTYW4gRnJhbmNpc2NvIENvdW50eQorMzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpTYW4gSm9hcXVpbiBDb3VudHkKKzQwOlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6U2FuIEx1aXMgT2Jpc3BvIENvdW50eQorNDE6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpTYW4gTWF0ZW8gQ291bnR5Cis0MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDQUxJRk9STklBOlNhbnRhIEJhcmJhcmEgQ291bnR5Cis0MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDQUxJRk9STklBOlNhbnRhIENsYXJhIENvdW50eQorNDQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpTYW50YSBDcnV6IENvdW50eQorNDU6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpTaGFzdGEgQ291bnR5Cis0NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDQUxJRk9STklBOlNpZXJyYSBDb3VudHkKKzQ3OlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6U2lza2l5b3UgQ291bnR5Cis0ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDQUxJRk9STklBOlNvbGFubyBDb3VudHkKKzQ5OlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6U29ub21hIENvdW50eQorNTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpTdGFuaXNsYXVzIENvdW50eQorNTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpTdXR0ZXIgQ291bnR5Cis1MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDQUxJRk9STklBOlRlaGFtYSBDb3VudHkKKzUzOlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6VHJpbml0eSBDb3VudHkKKzU0OlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6VHVsYXJlIENvdW50eQorNTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q0FMSUZPUk5JQTpUdW9sdW1uZSBDb3VudHkKKzU2OlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6VmVudHVyYSBDb3VudHkKKzU3OlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6WW9sbyBDb3VudHkKKzU4OlVTOlVTQTpVTklURUQgU1RBVEVTOkNBTElGT1JOSUE6WXViYSBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6QWRhaXIgQ291bnR5CisyOlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkFsZmFsZmEgQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkF0b2thIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpCZWF2ZXIgQ291bnR5Cis1OlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkJlY2toYW0gQ291bnR5Cis2OlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkJsYWluZSBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6QnJ5YW4gQ291bnR5Cis4OlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkNhZGRvIENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpDYW5hZGlhbiBDb3VudHkKKzEwOlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkNhcnRlciBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkNoZXJva2VlIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6Q2hvY3RhdyBDb3VudHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkNpbWFycm9uIENvdW50eQorMTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6Q2xldmVsYW5kIENvdW50eQorMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6Q29hbCBDb3VudHkKKzE2OlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkNvbWFuY2hlIENvdW50eQorMTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6Q290dG9uIENvdW50eQorMTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6Q3JhaWcgQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpDcmVlayBDb3VudHkKKzIwOlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkN1c3RlciBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkRlbGF3YXJlIENvdW50eQorMjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6RGV3ZXkgQ291bnR5CisyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpFbGxpcyBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkdhcmZpZWxkIENvdW50eQorMjU6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6R2FydmluIENvdW50eQorMjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6R3JhZHkgQ291bnR5CisyNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpHcmFudCBDb3VudHkKKzI4OlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkdyZWVyIENvdW50eQorMjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6SGFybW9uIENvdW50eQorMzA6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6SGFycGVyIENvdW50eQorMzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6SGFza2VsbCBDb3VudHkKKzMyOlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkh1Z2hlcyBDb3VudHkKKzMzOlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkphY2tzb24gQ291bnR5CiszNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpKZWZmZXJzb24gQ291bnR5CiszNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpKb2huc3RvbiBDb3VudHkKKzM2OlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOktheSBDb3VudHkKKzM3OlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOktpbmdmaXNoZXIgQ291bnR5CiszODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpLaW93YSBDb3VudHkKKzM5OlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkxhdGltZXIgQ291bnR5Cis0MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpMZSBGbG9yZSBDb3VudHkKKzQxOlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkxpbmNvbG4gQ291bnR5Cis0MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpMb2dhbiBDb3VudHkKKzQzOlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOkxvdmUgQ291bnR5Cis0NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpNYWpvciBDb3VudHkKKzQ1OlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOk1hcnNoYWxsIENvdW50eQorNDY6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6TWF5ZXMgQ291bnR5Cis0NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpNY0NsYWluIENvdW50eQorNDg6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6TWNDdXJ0YWluIENvdW50eQorNDk6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6TWNJbnRvc2ggQ291bnR5Cis1MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpNdXJyYXkgQ291bnR5Cis1MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpNdXNrb2dlZSBDb3VudHkKKzUyOlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOk5vYmxlIENvdW50eQorNTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6Tm93YXRhIENvdW50eQorNTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6T2tmdXNrZWUgQ291bnR5Cis1NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpPa2xhaG9tYSBDb3VudHkKKzU2OlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOk9rbXVsZ2VlIENvdW50eQorNTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6T3NhZ2UgQ291bnR5Cis1ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpPdHRhd2EgQ291bnR5Cis1OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpQYXduZWUgQ291bnR5Cis2MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpQYXluZSBDb3VudHkKKzYxOlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOlBpdHRzYnVyZyBDb3VudHkKKzYyOlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOlBvbnRvdG9jIENvdW50eQorNjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6UG90dGF3YXRvbWllIENvdW50eQorNjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6UHVzaG1hdGFoYSBDb3VudHkKKzY1OlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOlJvZ2VyIE1pbGxzIENvdW50eQorNjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6Um9nZXJzIENvdW50eQorNjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6U2VtaW5vbGUgQ291bnR5Cis2ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpTZXF1b3lhaCBDb3VudHkKKzY5OlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOlN0ZXBoZW5zIENvdW50eQorNzA6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6VGV4YXMgQ291bnR5Cis3MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpUaWxsbWFuIENvdW50eQorNzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6VHVsc2EgQ291bnR5Cis3MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpXYWdvbmVyIENvdW50eQorNzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0tMQUhPTUE6V2FzaGluZ3RvbiBDb3VudHkKKzc1OlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOldhc2hpdGEgQ291bnR5Cis3NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPS0xBSE9NQTpXb29kcyBDb3VudHkKKzc3OlVTOlVTQTpVTklURUQgU1RBVEVTOk9LTEFIT01BOldvb2R3YXJkIENvdW50eQorMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6QWxsZW4gQ291bnR5CisyOlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpBbmRlcnNvbiBDb3VudHkKKzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOkF0Y2hpc29uIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6QmFyYmVyIENvdW50eQorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6QmFydG9uIENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6Qm91cmJvbiBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOkJyb3duIENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6QnV0bGVyIENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6Q2hhc2UgQ291bnR5CisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6Q2hhdXRhdXF1YSBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpDaGVyb2tlZSBDb3VudHkKKzEyOlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpDaGV5ZW5uZSBDb3VudHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpDbGFyayBDb3VudHkKKzE0OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpDbGF5IENvdW50eQorMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOkNsb3VkIENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOkNvZmZleSBDb3VudHkKKzE3OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpDb21hbmNoZSBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpDb3dsZXkgQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6Q3Jhd2ZvcmQgQ291bnR5CisyMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6RGVjYXR1ciBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpEaWNraW5zb24gQ291bnR5CisyMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6RG9uaXBoYW4gQ291bnR5CisyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6RG91Z2xhcyBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpFZHdhcmRzIENvdW50eQorMjU6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOkVsayBDb3VudHkKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpFbGxpcyBDb3VudHkKKzI3OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpFbGxzd29ydGggQ291bnR5CisyODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6RmlubmV5IENvdW50eQorMjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOkZvcmQgQ291bnR5CiszMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6RnJhbmtsaW4gQ291bnR5CiszMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6R2VhcnkgQ291bnR5CiszMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6R292ZSBDb3VudHkKKzMzOlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpHcmFoYW0gQ291bnR5CiszNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6R3JhbnQgQ291bnR5CiszNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6R3JheSBDb3VudHkKKzM2OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpHcmVlbGV5IENvdW50eQorMzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOkdyZWVud29vZCBDb3VudHkKKzM4OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpIYW1pbHRvbiBDb3VudHkKKzM5OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpIYXJwZXIgQ291bnR5Cis0MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6SGFydmV5IENvdW50eQorNDE6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOkhhc2tlbGwgQ291bnR5Cis0MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6SG9kZ2VtYW4gQ291bnR5Cis0MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6SmFja3NvbiBDb3VudHkKKzQ0OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpKZWZmZXJzb24gQ291bnR5Cis0NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6SmV3ZWxsIENvdW50eQorNDY6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOkpvaG5zb24gQ291bnR5Cis0NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6S2Vhcm55IENvdW50eQorNDg6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOktpbmdtYW4gQ291bnR5Cis0OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6S2lvd2EgQ291bnR5Cis1MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6TGFiZXR0ZSBDb3VudHkKKzUxOlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpMYW5lIENvdW50eQorNTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOkxlYXZlbndvcnRoIENvdW50eQorNTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOkxpbmNvbG4gQ291bnR5Cis1NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6TGlubiBDb3VudHkKKzU1OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpMb2dhbiBDb3VudHkKKzU2OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpMeW9uIENvdW50eQorNTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOk1hcmlvbiBDb3VudHkKKzU4OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpNYXJzaGFsbCBDb3VudHkKKzU5OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpNY1BoZXJzb24gQ291bnR5Cis2MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6TWVhZGUgQ291bnR5Cis2MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6TWlhbWkgQ291bnR5Cis2MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6TWl0Y2hlbGwgQ291bnR5Cis2MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6TW9udGdvbWVyeSBDb3VudHkKKzY0OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpNb3JyaXMgQ291bnR5Cis2NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6TW9ydG9uIENvdW50eQorNjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOk5lbWFoYSBDb3VudHkKKzY3OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpOZW9zaG8gQ291bnR5Cis2ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6TmVzcyBDb3VudHkKKzY5OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpOb3J0b24gQ291bnR5Cis3MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6T3NhZ2UgQ291bnR5Cis3MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6T3Nib3JuZSBDb3VudHkKKzcyOlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpPdHRhd2EgQ291bnR5Cis3MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6UGF3bmVlIENvdW50eQorNzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOlBoaWxsaXBzIENvdW50eQorNzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOlBvdHRhd2F0b21pZSBDb3VudHkKKzc2OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpQcmF0dCBDb3VudHkKKzc3OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpSYXdsaW5zIENvdW50eQorNzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOlJlbm8gQ291bnR5Cis3OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6UmVwdWJsaWMgQ291bnR5Cis4MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6UmljZSBDb3VudHkKKzgxOlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpSaWxleSBDb3VudHkKKzgyOlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpSb29rcyBDb3VudHkKKzgzOlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpSdXNoIENvdW50eQorODQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOlJ1c3NlbGwgQ291bnR5Cis4NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6U2FsaW5lIENvdW50eQorODY6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOlNjb3R0IENvdW50eQorODc6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOlNlZGd3aWNrIENvdW50eQorODg6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOlNld2FyZCBDb3VudHkKKzg5OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpTaGF3bmVlIENvdW50eQorOTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOlNoZXJpZGFuIENvdW50eQorOTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOlNoZXJtYW4gQ291bnR5Cis5MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6U21pdGggQ291bnR5Cis5MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6U3RhZmZvcmQgQ291bnR5Cis5NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6U3RhbnRvbiBDb3VudHkKKzk1OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpTdGV2ZW5zIENvdW50eQorOTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOlN1bW5lciBDb3VudHkKKzk3OlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpUaG9tYXMgQ291bnR5Cis5ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6VHJlZ28gQ291bnR5Cis5OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpLQU5TQVM6V2FiYXVuc2VlIENvdW50eQorMTAwOlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpXYWxsYWNlIENvdW50eQorMTAxOlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpXYXNoaW5ndG9uIENvdW50eQorMTAyOlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpXaWNoaXRhIENvdW50eQorMTAzOlVTOlVTQTpVTklURUQgU1RBVEVTOktBTlNBUzpXaWxzb24gQ291bnR5CisxMDQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOldvb2Rzb24gQ291bnR5CisxMDU6VVM6VVNBOlVOSVRFRCBTVEFURVM6S0FOU0FTOld5YW5kb3R0ZSBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIE1FWElDTzpCZXJuYWxpbGxvIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgTUVYSUNPOkNhdHJvbiBDb3VudHkKKzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIE1FWElDTzpDaGF2ZXMgQ291bnR5Cis0OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBNRVhJQ086Q2lib2xhIENvdW50eQorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgTUVYSUNPOkNvbGZheCBDb3VudHkKKzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIE1FWElDTzpDdXJyeSBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIE1FWElDTzpEZSBCYWNhIENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgTUVYSUNPOkRvbmEgQW5hIENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgTUVYSUNPOkVkZHkgQ291bnR5CisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgTUVYSUNPOkdyYW50IENvdW50eQorMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIE1FWElDTzpHdWFkYWx1cGUgQ291bnR5CisxMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgTUVYSUNPOkhhcmRpbmcgQ291bnR5CisxMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgTUVYSUNPOkhpZGFsZ28gQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgTUVYSUNPOkxlYSBDb3VudHkKKzE1OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBNRVhJQ086TGluY29sbiBDb3VudHkKKzE2OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBNRVhJQ086TG9zIEFsYW1vcyBDb3VudHkKKzE3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBNRVhJQ086THVuYSBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBNRVhJQ086TWNLaW5sZXkgQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgTUVYSUNPOk1vcmEgQ291bnR5CisyMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgTUVYSUNPOk90ZXJvIENvdW50eQorMjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIE1FWElDTzpRdWF5IENvdW50eQorMjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIE1FWElDTzpSaW8gQXJyaWJhIENvdW50eQorMjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIE1FWElDTzpSb29zZXZlbHQgQ291bnR5CisyNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgTUVYSUNPOlNhbiBKdWFuIENvdW50eQorMjU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIE1FWElDTzpTYW4gTWlndWVsIENvdW50eQorMjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIE1FWElDTzpTYW5kb3ZhbCBDb3VudHkKKzI3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBNRVhJQ086U2FudGEgRmUgQ291bnR5CisyODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgTUVYSUNPOlNpZXJyYSBDb3VudHkKKzI5OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBNRVhJQ086U29jb3JybyBDb3VudHkKKzMwOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBNRVhJQ086VGFvcyBDb3VudHkKKzMxOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBNRVhJQ086VG9ycmFuY2UgQ291bnR5CiszMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgTUVYSUNPOlVuaW9uIENvdW50eQorMzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIE1FWElDTzpWYWxlbmNpYSBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFSWUxBTkQ6QWxsZWdhbnkgQ291bnR5CisyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1BUllMQU5EOkFubmUgQXJ1bmRlbCBDb3VudHkKKzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFSWUxBTkQ6QmFsdGltb3JlIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQVJZTEFORDpCYWx0aW1vcmUgY2l0eQorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQVJZTEFORDpDYWx2ZXJ0IENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQVJZTEFORDpDYXJvbGluZSBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFSWUxBTkQ6Q2Fycm9sbCBDb3VudHkKKzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFSWUxBTkQ6Q2VjaWwgQ291bnR5Cis5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1BUllMQU5EOkNoYXJsZXMgQ291bnR5CisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQVJZTEFORDpEb3JjaGVzdGVyIENvdW50eQorMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFSWUxBTkQ6RnJlZGVyaWNrIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFSWUxBTkQ6R2FycmV0dCBDb3VudHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOk1BUllMQU5EOkhhcmZvcmQgQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQVJZTEFORDpIb3dhcmQgQ291bnR5CisxNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQVJZTEFORDpLZW50IENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFSWUxBTkQ6TW9udGdvbWVyeSBDb3VudHkKKzE3OlVTOlVTQTpVTklURUQgU1RBVEVTOk1BUllMQU5EOlByaW5jZSBHZW9yZ2UncyBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOk1BUllMQU5EOlF1ZWVuIEFubmUncyBDb3VudHkKKzE5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1BUllMQU5EOlNvbWVyc2V0IENvdW50eQorMjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFSWUxBTkQ6U3QuIE1hcnkncyBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1BUllMQU5EOlRhbGJvdCBDb3VudHkKKzIyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1BUllMQU5EOldhc2hpbmd0b24gQ291bnR5CisyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQVJZTEFORDpXaWNvbWljbyBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOk1BUllMQU5EOldvcmNlc3RlciBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6QWxhbWFuY2UgQ291bnR5CisyOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkFsZXhhbmRlciBDb3VudHkKKzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6QWxsZWdoYW55IENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpBbnNvbiBDb3VudHkKKzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6QXNoZSBDb3VudHkKKzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6QXZlcnkgQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkJlYXVmb3J0IENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpCZXJ0aWUgQ291bnR5Cis5OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkJsYWRlbiBDb3VudHkKKzEwOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkJydW5zd2ljayBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkJ1bmNvbWJlIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6QnVya2UgQ291bnR5CisxMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpDYWJhcnJ1cyBDb3VudHkKKzE0OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkNhbGR3ZWxsIENvdW50eQorMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6Q2FtZGVuIENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6Q2FydGVyZXQgQ291bnR5CisxNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpDYXN3ZWxsIENvdW50eQorMTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6Q2F0YXdiYSBDb3VudHkKKzE5OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkNoYXRoYW0gQ291bnR5CisyMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpDaGVyb2tlZSBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkNob3dhbiBDb3VudHkKKzIyOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkNsYXkgQ291bnR5CisyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpDbGV2ZWxhbmQgQ291bnR5CisyNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpDb2x1bWJ1cyBDb3VudHkKKzI1OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkNyYXZlbiBDb3VudHkKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkN1bWJlcmxhbmQgQ291bnR5CisyNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpDdXJyaXR1Y2sgQ291bnR5CisyODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpEYXJlIENvdW50eQorMjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6RGF2aWRzb24gQ291bnR5CiszMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpEYXZpZSBDb3VudHkKKzMxOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkR1cGxpbiBDb3VudHkKKzMyOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkR1cmhhbSBDb3VudHkKKzMzOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkVkZ2Vjb21iZSBDb3VudHkKKzM0OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkZvcnN5dGggQ291bnR5CiszNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpGcmFua2xpbiBDb3VudHkKKzM2OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkdhc3RvbiBDb3VudHkKKzM3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkdhdGVzIENvdW50eQorMzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6R3JhaGFtIENvdW50eQorMzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6R3JhbnZpbGxlIENvdW50eQorNDA6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6R3JlZW5lIENvdW50eQorNDE6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6R3VpbGZvcmQgQ291bnR5Cis0MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpIYWxpZmF4IENvdW50eQorNDM6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6SGFybmV0dCBDb3VudHkKKzQ0OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkhheXdvb2QgQ291bnR5Cis0NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpIZW5kZXJzb24gQ291bnR5Cis0NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpIZXJ0Zm9yZCBDb3VudHkKKzQ3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkhva2UgQ291bnR5Cis0ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpIeWRlIENvdW50eQorNDk6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6SXJlZGVsbCBDb3VudHkKKzUwOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkphY2tzb24gQ291bnR5Cis1MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpKb2huc3RvbiBDb3VudHkKKzUyOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOkpvbmVzIENvdW50eQorNTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6TGVlIENvdW50eQorNTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6TGVub2lyIENvdW50eQorNTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6TGluY29sbiBDb3VudHkKKzU2OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOk1hY29uIENvdW50eQorNTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6TWFkaXNvbiBDb3VudHkKKzU4OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOk1hcnRpbiBDb3VudHkKKzU5OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOk1jRG93ZWxsIENvdW50eQorNjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6TWVja2xlbmJ1cmcgQ291bnR5Cis2MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpNaXRjaGVsbCBDb3VudHkKKzYyOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOk1vbnRnb21lcnkgQ291bnR5Cis2MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpNb29yZSBDb3VudHkKKzY0OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOk5hc2ggQ291bnR5Cis2NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpOZXcgSGFub3ZlciBDb3VudHkKKzY2OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOk5vcnRoYW1wdG9uIENvdW50eQorNjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6T25zbG93IENvdW50eQorNjg6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6T3JhbmdlIENvdW50eQorNjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6UGFtbGljbyBDb3VudHkKKzcwOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOlBhc3F1b3RhbmsgQ291bnR5Cis3MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpQZW5kZXIgQ291bnR5Cis3MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpQZXJxdWltYW5zIENvdW50eQorNzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6UGVyc29uIENvdW50eQorNzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6UGl0dCBDb3VudHkKKzc1OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOlBvbGsgQ291bnR5Cis3NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpSYW5kb2xwaCBDb3VudHkKKzc3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOlJpY2htb25kIENvdW50eQorNzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6Um9iZXNvbiBDb3VudHkKKzc5OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOlJvY2tpbmdoYW0gQ291bnR5Cis4MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpSb3dhbiBDb3VudHkKKzgxOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOlJ1dGhlcmZvcmQgQ291bnR5Cis4MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpTYW1wc29uIENvdW50eQorODM6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6U2NvdGxhbmQgQ291bnR5Cis4NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpTdGFubHkgQ291bnR5Cis4NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpTdG9rZXMgQ291bnR5Cis4NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpTdXJyeSBDb3VudHkKKzg3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOlN3YWluIENvdW50eQorODg6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6VHJhbnN5bHZhbmlhIENvdW50eQorODk6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6VHlycmVsbCBDb3VudHkKKzkwOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOlVuaW9uIENvdW50eQorOTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6VmFuY2UgQ291bnR5Cis5MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpXYWtlIENvdW50eQorOTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6V2FycmVuIENvdW50eQorOTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggQ0FST0xJTkE6V2FzaGluZ3RvbiBDb3VudHkKKzk1OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOldhdGF1Z2EgQ291bnR5Cis5NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpXYXluZSBDb3VudHkKKzk3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOldpbGtlcyBDb3VudHkKKzk4OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOldpbHNvbiBDb3VudHkKKzk5OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIENBUk9MSU5BOllhZGtpbiBDb3VudHkKKzEwMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBDQVJPTElOQTpZYW5jZXkgQ291bnR5CisxOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOkFsYmFueSBDb3VudHkKKzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6QWxsZWdhbnkgQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOkJyb254IENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpCcm9vbWUgQ291bnR5Cis1OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOkNhdHRhcmF1Z3VzIENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpDYXl1Z2EgQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOkNoYXV0YXVxdWEgQ291bnR5Cis4OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOkNoZW11bmcgQ291bnR5Cis5OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOkNoZW5hbmdvIENvdW50eQorMTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6Q2xpbnRvbiBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOkNvbHVtYmlhIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6Q29ydGxhbmQgQ291bnR5CisxMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpEZWxhd2FyZSBDb3VudHkKKzE0OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOkR1dGNoZXNzIENvdW50eQorMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6RXJpZSBDb3VudHkKKzE2OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOkVzc2V4IENvdW50eQorMTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6RnJhbmtsaW4gQ291bnR5CisxODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpGdWx0b24gQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpHZW5lc2VlIENvdW50eQorMjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6R3JlZW5lIENvdW50eQorMjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6SGFtaWx0b24gQ291bnR5CisyMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpIZXJraW1lciBDb3VudHkKKzIzOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOkplZmZlcnNvbiBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOktpbmdzIENvdW50eQorMjU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6TGV3aXMgQ291bnR5CisyNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpMaXZpbmdzdG9uIENvdW50eQorMjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6TWFkaXNvbiBDb3VudHkKKzI4OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOk1vbnJvZSBDb3VudHkKKzI5OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOk1vbnRnb21lcnkgQ291bnR5CiszMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpOYXNzYXUgQ291bnR5CiszMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpOZXcgWW9yayBDb3VudHkKKzMyOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOk5pYWdhcmEgQ291bnR5CiszMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpPbmVpZGEgQ291bnR5CiszNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpPbm9uZGFnYSBDb3VudHkKKzM1OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOk9udGFyaW8gQ291bnR5CiszNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpPcmFuZ2UgQ291bnR5CiszNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpPcmxlYW5zIENvdW50eQorMzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6T3N3ZWdvIENvdW50eQorMzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6T3RzZWdvIENvdW50eQorNDA6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6UHV0bmFtIENvdW50eQorNDE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6UXVlZW5zIENvdW50eQorNDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6UmVuc3NlbGFlciBDb3VudHkKKzQzOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOlJpY2htb25kIENvdW50eQorNDQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6Um9ja2xhbmQgQ291bnR5Cis0NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpTYXJhdG9nYSBDb3VudHkKKzQ2OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOlNjaGVuZWN0YWR5IENvdW50eQorNDc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6U2Nob2hhcmllIENvdW50eQorNDg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6U2NodXlsZXIgQ291bnR5Cis0OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpTZW5lY2EgQ291bnR5Cis1MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpTdC4gTGF3cmVuY2UgQ291bnR5Cis1MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpTdGV1YmVuIENvdW50eQorNTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6U3VmZm9sayBDb3VudHkKKzUzOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOlN1bGxpdmFuIENvdW50eQorNTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6VGlvZ2EgQ291bnR5Cis1NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpUb21wa2lucyBDb3VudHkKKzU2OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOlVsc3RlciBDb3VudHkKKzU3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOldhcnJlbiBDb3VudHkKKzU4OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOldhc2hpbmd0b24gQ291bnR5Cis1OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgWU9SSzpXYXluZSBDb3VudHkKKzYwOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOldlc3RjaGVzdGVyIENvdW50eQorNjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIFlPUks6V3lvbWluZyBDb3VudHkKKzYyOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBZT1JLOllhdGVzIENvdW50eQorMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6QXVyb3JhIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6QmVhZGxlIENvdW50eQorMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6QmVubmV0dCBDb3VudHkKKzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggREFLT1RBOkJvbiBIb21tZSBDb3VudHkKKzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggREFLT1RBOkJyb29raW5ncyBDb3VudHkKKzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggREFLT1RBOkJyb3duIENvdW50eQorNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6QnJ1bGUgQ291bnR5Cis4OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpCdWZmYWxvIENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6QnV0dGUgQ291bnR5CisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6Q2FtcGJlbGwgQ291bnR5CisxMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6Q2hhcmxlcyBNaXggQ291bnR5CisxMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6Q2xhcmsgQ291bnR5CisxMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6Q2xheSBDb3VudHkKKzE0OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpDb2Rpbmd0b24gQ291bnR5CisxNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6Q29yc29uIENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggREFLT1RBOkN1c3RlciBDb3VudHkKKzE3OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpEYXZpc29uIENvdW50eQorMTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggREFLT1RBOkRheSBDb3VudHkKKzE5OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpEZXVlbCBDb3VudHkKKzIwOlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpEZXdleSBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpEb3VnbGFzIENvdW50eQorMjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggREFLT1RBOkVkbXVuZHMgQ291bnR5CisyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6RmFsbCBSaXZlciBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpGYXVsayBDb3VudHkKKzI1OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpHcmFudCBDb3VudHkKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpHcmVnb3J5IENvdW50eQorMjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggREFLT1RBOkhhYWtvbiBDb3VudHkKKzI4OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpIYW1saW4gQ291bnR5CisyOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6SGFuZCBDb3VudHkKKzMwOlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpIYW5zb24gQ291bnR5CiszMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6SGFyZGluZyBDb3VudHkKKzMyOlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpIdWdoZXMgQ291bnR5CiszMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6SHV0Y2hpbnNvbiBDb3VudHkKKzM0OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpIeWRlIENvdW50eQorMzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggREFLT1RBOkphY2tzb24gQ291bnR5CiszNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6SmVyYXVsZCBDb3VudHkKKzM3OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpKb25lcyBDb3VudHkKKzM4OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpLaW5nc2J1cnkgQ291bnR5CiszOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6TGFrZSBDb3VudHkKKzQwOlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpMYXdyZW5jZSBDb3VudHkKKzQxOlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpMaW5jb2xuIENvdW50eQorNDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggREFLT1RBOkx5bWFuIENvdW50eQorNDM6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggREFLT1RBOk1hcnNoYWxsIENvdW50eQorNDQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggREFLT1RBOk1jQ29vayBDb3VudHkKKzQ1OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpNY1BoZXJzb24gQ291bnR5Cis0NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6TWVhZGUgQ291bnR5Cis0NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6TWVsbGV0dGUgQ291bnR5Cis0ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6TWluZXIgQ291bnR5Cis0OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6TWlubmVoYWhhIENvdW50eQorNTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggREFLT1RBOk1vb2R5IENvdW50eQorNTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggREFLT1RBOlBlbm5pbmd0b24gQ291bnR5Cis1MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6UGVya2lucyBDb3VudHkKKzUzOlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpQb3R0ZXIgQ291bnR5Cis1NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6Um9iZXJ0cyBDb3VudHkKKzU1OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpTYW5ib3JuIENvdW50eQorNTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggREFLT1RBOlNoYW5ub24gQ291bnR5Cis1NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6U3BpbmsgQ291bnR5Cis1ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpTT1VUSCBEQUtPVEE6U3RhbmxleSBDb3VudHkKKzU5OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpTdWxseSBDb3VudHkKKzYwOlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpUb2RkIENvdW50eQorNjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggREFLT1RBOlRyaXBwIENvdW50eQorNjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggREFLT1RBOlR1cm5lciBDb3VudHkKKzYzOlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpVbmlvbiBDb3VudHkKKzY0OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpXYWx3b3J0aCBDb3VudHkKKzY1OlVTOlVTQTpVTklURUQgU1RBVEVTOlNPVVRIIERBS09UQTpZYW5rdG9uIENvdW50eQorNjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6U09VVEggREFLT1RBOlppZWJhY2ggQ291bnR5CisxOlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6QmFyYm91ciBDb3VudHkKKzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0VTVCBWSVJHSU5JQTpCZXJrZWxleSBDb3VudHkKKzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0VTVCBWSVJHSU5JQTpCb29uZSBDb3VudHkKKzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0VTVCBWSVJHSU5JQTpCcmF4dG9uIENvdW50eQorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOkJyb29rZSBDb3VudHkKKzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0VTVCBWSVJHSU5JQTpDYWJlbGwgQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6Q2FsaG91biBDb3VudHkKKzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0VTVCBWSVJHSU5JQTpDbGF5IENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOkRvZGRyaWRnZSBDb3VudHkKKzEwOlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6RmF5ZXR0ZSBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6R2lsbWVyIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0VTVCBWSVJHSU5JQTpHcmFudCBDb3VudHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6R3JlZW5icmllciBDb3VudHkKKzE0OlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6SGFtcHNoaXJlIENvdW50eQorMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0VTVCBWSVJHSU5JQTpIYW5jb2NrIENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0VTVCBWSVJHSU5JQTpIYXJkeSBDb3VudHkKKzE3OlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6SGFycmlzb24gQ291bnR5CisxODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOkphY2tzb24gQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOkplZmZlcnNvbiBDb3VudHkKKzIwOlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6S2FuYXdoYSBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6TGV3aXMgQ291bnR5CisyMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOkxpbmNvbG4gQ291bnR5CisyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOkxvZ2FuIENvdW50eQorMjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0VTVCBWSVJHSU5JQTpNYXJpb24gQ291bnR5CisyNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOk1hcnNoYWxsIENvdW50eQorMjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0VTVCBWSVJHSU5JQTpNYXNvbiBDb3VudHkKKzI3OlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6TWNEb3dlbGwgQ291bnR5CisyODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOk1lcmNlciBDb3VudHkKKzI5OlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6TWluZXJhbCBDb3VudHkKKzMwOlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6TWluZ28gQ291bnR5CiszMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOk1vbm9uZ2FsaWEgQ291bnR5CiszMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOk1vbnJvZSBDb3VudHkKKzMzOlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6TW9yZ2FuIENvdW50eQorMzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0VTVCBWSVJHSU5JQTpOaWNob2xhcyBDb3VudHkKKzM1OlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6T2hpbyBDb3VudHkKKzM2OlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6UGVuZGxldG9uIENvdW50eQorMzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0VTVCBWSVJHSU5JQTpQbGVhc2FudHMgQ291bnR5CiszODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOlBvY2Fob250YXMgQ291bnR5CiszOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOlByZXN0b24gQ291bnR5Cis0MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOlB1dG5hbSBDb3VudHkKKzQxOlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6UmFsZWlnaCBDb3VudHkKKzQyOlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6UmFuZG9scGggQ291bnR5Cis0MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOlJpdGNoaWUgQ291bnR5Cis0NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOlJvYW5lIENvdW50eQorNDU6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0VTVCBWSVJHSU5JQTpTdW1tZXJzIENvdW50eQorNDY6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0VTVCBWSVJHSU5JQTpUYXlsb3IgQ291bnR5Cis0NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOlR1Y2tlciBDb3VudHkKKzQ4OlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6VHlsZXIgQ291bnR5Cis0OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOlVwc2h1ciBDb3VudHkKKzUwOlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6V2F5bmUgQ291bnR5Cis1MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOldlYnN0ZXIgQ291bnR5Cis1MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXRVNUIFZJUkdJTklBOldldHplbCBDb3VudHkKKzUzOlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6V2lydCBDb3VudHkKKzU0OlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6V29vZCBDb3VudHkKKzU1OlVTOlVTQTpVTklURUQgU1RBVEVTOldFU1QgVklSR0lOSUE6V3lvbWluZyBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOkFjYWRpYSBQYXJpc2gKKzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOkFsbGVuIFBhcmlzaAorMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpMT1VJU0lBTkE6QXNjZW5zaW9uIFBhcmlzaAorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpMT1VJU0lBTkE6QXNzdW1wdGlvbiBQYXJpc2gKKzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOkF2b3llbGxlcyBQYXJpc2gKKzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOkJlYXVyZWdhcmQgUGFyaXNoCis3OlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpCaWVudmlsbGUgUGFyaXNoCis4OlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpCb3NzaWVyIFBhcmlzaAorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpMT1VJU0lBTkE6Q2FkZG8gUGFyaXNoCisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpMT1VJU0lBTkE6Q2FsY2FzaWV1IFBhcmlzaAorMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOkNhbGR3ZWxsIFBhcmlzaAorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOkNhbWVyb24gUGFyaXNoCisxMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpMT1VJU0lBTkE6Q2F0YWhvdWxhIFBhcmlzaAorMTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOkNsYWlib3JuZSBQYXJpc2gKKzE1OlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpDb25jb3JkaWEgUGFyaXNoCisxNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpMT1VJU0lBTkE6RGUgU290byBQYXJpc2gKKzE3OlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpFYXN0IEJhdG9uIFJvdWdlIFBhcmlzaAorMTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOkVhc3QgQ2Fycm9sbCBQYXJpc2gKKzE5OlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpFYXN0IEZlbGljaWFuYSBQYXJpc2gKKzIwOlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpFdmFuZ2VsaW5lIFBhcmlzaAorMjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOkZyYW5rbGluIFBhcmlzaAorMjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOkdyYW50IFBhcmlzaAorMjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOkliZXJpYSBQYXJpc2gKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpJYmVydmlsbGUgUGFyaXNoCisyNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpMT1VJU0lBTkE6SmFja3NvbiBQYXJpc2gKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpKZWZmZXJzb24gRGF2aXMgUGFyaXNoCisyNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpMT1VJU0lBTkE6SmVmZmVyc29uIFBhcmlzaAorMjg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOkxhIFNhbGxlIFBhcmlzaAorMjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOkxhZmF5ZXR0ZSBQYXJpc2gKKzMwOlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpMYWZvdXJjaGUgUGFyaXNoCiszMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpMT1VJU0lBTkE6TGluY29sbiBQYXJpc2gKKzMyOlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpMaXZpbmdzdG9uIFBhcmlzaAorMzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOk1hZGlzb24gUGFyaXNoCiszNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpMT1VJU0lBTkE6TW9yZWhvdXNlIFBhcmlzaAorMzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOk5hdGNoaXRvY2hlcyBQYXJpc2gKKzM2OlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpPcmxlYW5zIFBhcmlzaAorMzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOk91YWNoaXRhIFBhcmlzaAorMzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOlBsYXF1ZW1pbmVzIFBhcmlzaAorMzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOlBvaW50ZSBDb3VwZWUgUGFyaXNoCis0MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpMT1VJU0lBTkE6UmFwaWRlcyBQYXJpc2gKKzQxOlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpSZWQgUml2ZXIgUGFyaXNoCis0MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpMT1VJU0lBTkE6UmljaGxhbmQgUGFyaXNoCis0MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpMT1VJU0lBTkE6U2FiaW5lIFBhcmlzaAorNDQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOlN0LiBCZXJuYXJkIFBhcmlzaAorNDU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOlN0LiBDaGFybGVzIFBhcmlzaAorNDY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOlN0LiBIZWxlbmEgUGFyaXNoCis0NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpMT1VJU0lBTkE6U3QuIEphbWVzIFBhcmlzaAorNDg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOlN0LiBKb2huIHRoZSBCYXB0aXN0IFBhcmlzaAorNDk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOlN0LiBMYW5kcnkgUGFyaXNoCis1MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpMT1VJU0lBTkE6U3QuIE1hcnRpbiBQYXJpc2gKKzUxOlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpTdC4gTWFyeSBQYXJpc2gKKzUyOlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpTdC4gVGFtbWFueSBQYXJpc2gKKzUzOlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpUYW5naXBhaG9hIFBhcmlzaAorNTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOlRlbnNhcyBQYXJpc2gKKzU1OlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpUZXJyZWJvbm5lIFBhcmlzaAorNTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOlVuaW9uIFBhcmlzaAorNTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOlZlcm1pbGlvbiBQYXJpc2gKKzU4OlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpWZXJub24gUGFyaXNoCis1OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpMT1VJU0lBTkE6V2FzaGluZ3RvbiBQYXJpc2gKKzYwOlVTOlVTQTpVTklURUQgU1RBVEVTOkxPVUlTSUFOQTpXZWJzdGVyIFBhcmlzaAorNjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOldlc3QgQmF0b24gUm91Z2UgUGFyaXNoCis2MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpMT1VJU0lBTkE6V2VzdCBDYXJyb2xsIFBhcmlzaAorNjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOldlc3QgRmVsaWNpYW5hIFBhcmlzaAorNjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TE9VSVNJQU5BOldpbm4gUGFyaXNoCisxOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpBbmRlcnNvbiBDb3VudHkKKzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOkJlZGZvcmQgQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpCZW50b24gQ291bnR5Cis0OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpCbGVkc29lIENvdW50eQorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6QmxvdW50IENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6QnJhZGxleSBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOkNhbXBiZWxsIENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6Q2Fubm9uIENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6Q2Fycm9sbCBDb3VudHkKKzEwOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpDYXJ0ZXIgQ291bnR5CisxMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6Q2hlYXRoYW0gQ291bnR5CisxMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6Q2hlc3RlciBDb3VudHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpDbGFpYm9ybmUgQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6Q2xheSBDb3VudHkKKzE1OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpDb2NrZSBDb3VudHkKKzE2OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpDb2ZmZWUgQ291bnR5CisxNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6Q3JvY2tldHQgQ291bnR5CisxODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6Q3VtYmVybGFuZCBDb3VudHkKKzE5OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpEYXZpZHNvbiBDb3VudHkKKzIwOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpEZUthbGIgQ291bnR5CisyMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6RGVjYXR1ciBDb3VudHkKKzIyOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpEaWNrc29uIENvdW50eQorMjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOkR5ZXIgQ291bnR5CisyNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6RmF5ZXR0ZSBDb3VudHkKKzI1OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpGZW50cmVzcyBDb3VudHkKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpGcmFua2xpbiBDb3VudHkKKzI3OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpHaWJzb24gQ291bnR5CisyODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6R2lsZXMgQ291bnR5CisyOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6R3JhaW5nZXIgQ291bnR5CiszMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6R3JlZW5lIENvdW50eQorMzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOkdydW5keSBDb3VudHkKKzMyOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpIYW1ibGVuIENvdW50eQorMzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOkhhbWlsdG9uIENvdW50eQorMzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOkhhbmNvY2sgQ291bnR5CiszNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6SGFyZGVtYW4gQ291bnR5CiszNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6SGFyZGluIENvdW50eQorMzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOkhhd2tpbnMgQ291bnR5CiszODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6SGF5d29vZCBDb3VudHkKKzM5OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpIZW5kZXJzb24gQ291bnR5Cis0MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6SGVucnkgQ291bnR5Cis0MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6SGlja21hbiBDb3VudHkKKzQyOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpIb3VzdG9uIENvdW50eQorNDM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOkh1bXBocmV5cyBDb3VudHkKKzQ0OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpKYWNrc29uIENvdW50eQorNDU6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOkplZmZlcnNvbiBDb3VudHkKKzQ2OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpKb2huc29uIENvdW50eQorNDc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOktub3ggQ291bnR5Cis0ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6TGFrZSBDb3VudHkKKzQ5OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpMYXVkZXJkYWxlIENvdW50eQorNTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOkxhd3JlbmNlIENvdW50eQorNTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOkxld2lzIENvdW50eQorNTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOkxpbmNvbG4gQ291bnR5Cis1MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6TG91ZG9uIENvdW50eQorNTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOk1hY29uIENvdW50eQorNTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOk1hZGlzb24gQ291bnR5Cis1NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6TWFyaW9uIENvdW50eQorNTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOk1hcnNoYWxsIENvdW50eQorNTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOk1hdXJ5IENvdW50eQorNTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOk1jTWlubiBDb3VudHkKKzYwOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpNY05haXJ5IENvdW50eQorNjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOk1laWdzIENvdW50eQorNjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOk1vbnJvZSBDb3VudHkKKzYzOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpNb250Z29tZXJ5IENvdW50eQorNjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOk1vb3JlIENvdW50eQorNjU6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOk1vcmdhbiBDb3VudHkKKzY2OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpPYmlvbiBDb3VudHkKKzY3OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpPdmVydG9uIENvdW50eQorNjg6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOlBlcnJ5IENvdW50eQorNjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOlBpY2tldHQgQ291bnR5Cis3MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6UG9sayBDb3VudHkKKzcxOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpQdXRuYW0gQ291bnR5Cis3MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6UmhlYSBDb3VudHkKKzczOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpSb2FuZSBDb3VudHkKKzc0OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpSb2JlcnRzb24gQ291bnR5Cis3NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6UnV0aGVyZm9yZCBDb3VudHkKKzc2OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpTY290dCBDb3VudHkKKzc3OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpTZXF1YXRjaGllIENvdW50eQorNzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOlNldmllciBDb3VudHkKKzc5OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpTaGVsYnkgQ291bnR5Cis4MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6U21pdGggQ291bnR5Cis4MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6U3Rld2FydCBDb3VudHkKKzgyOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpTdWxsaXZhbiBDb3VudHkKKzgzOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpTdW1uZXIgQ291bnR5Cis4NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6VGlwdG9uIENvdW50eQorODU6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOlRyb3VzZGFsZSBDb3VudHkKKzg2OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpVbmljb2kgQ291bnR5Cis4NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6VW5pb24gQ291bnR5Cis4ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6VmFuIEJ1cmVuIENvdW50eQorODk6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOldhcnJlbiBDb3VudHkKKzkwOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpXYXNoaW5ndG9uIENvdW50eQorOTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOldheW5lIENvdW50eQorOTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVOTkVTU0VFOldlYWtsZXkgQ291bnR5Cis5MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6V2hpdGUgQ291bnR5Cis5NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURU5ORVNTRUU6V2lsbGlhbXNvbiBDb3VudHkKKzk1OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFTk5FU1NFRTpXaWxzb24gQ291bnR5CisxOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkFuZGVyc29uIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpBbmRyZXdzIENvdW50eQorMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpBbmdlbGluYSBDb3VudHkKKzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6QXJhbnNhcyBDb3VudHkKKzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6QXJjaGVyIENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpBcm1zdHJvbmcgQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkF0YXNjb3NhIENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpBdXN0aW4gQ291bnR5Cis5OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkJhaWxleSBDb3VudHkKKzEwOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkJhbmRlcmEgQ291bnR5CisxMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpCYXN0cm9wIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6QmF5bG9yIENvdW50eQorMTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6QmVlIENvdW50eQorMTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6QmVsbCBDb3VudHkKKzE1OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkJleGFyIENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6QmxhbmNvIENvdW50eQorMTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6Qm9yZGVuIENvdW50eQorMTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6Qm9zcXVlIENvdW50eQorMTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6Qm93aWUgQ291bnR5CisyMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpCcmF6b3JpYSBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkJyYXpvcyBDb3VudHkKKzIyOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkJyZXdzdGVyIENvdW50eQorMjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6QnJpc2NvZSBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkJyb29rcyBDb3VudHkKKzI1OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkJyb3duIENvdW50eQorMjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6QnVybGVzb24gQ291bnR5CisyNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpCdXJuZXQgQ291bnR5CisyODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpDYWxkd2VsbCBDb3VudHkKKzI5OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkNhbGhvdW4gQ291bnR5CiszMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpDYWxsYWhhbiBDb3VudHkKKzMxOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkNhbWVyb24gQ291bnR5CiszMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpDYW1wIENvdW50eQorMzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6Q2Fyc29uIENvdW50eQorMzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6Q2FzcyBDb3VudHkKKzM1OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkNhc3RybyBDb3VudHkKKzM2OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkNoYW1iZXJzIENvdW50eQorMzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6Q2hlcm9rZWUgQ291bnR5CiszODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpDaGlsZHJlc3MgQ291bnR5CiszOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpDbGF5IENvdW50eQorNDA6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6Q29jaHJhbiBDb3VudHkKKzQxOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkNva2UgQ291bnR5Cis0MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpDb2xlbWFuIENvdW50eQorNDM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6Q29sbGluIENvdW50eQorNDQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6Q29sbGluZ3N3b3J0aCBDb3VudHkKKzQ1OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkNvbG9yYWRvIENvdW50eQorNDY6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6Q29tYWwgQ291bnR5Cis0NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpDb21hbmNoZSBDb3VudHkKKzQ4OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkNvbmNobyBDb3VudHkKKzQ5OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkNvb2tlIENvdW50eQorNTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6Q29yeWVsbCBDb3VudHkKKzUxOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkNvdHRsZSBDb3VudHkKKzUyOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkNyYW5lIENvdW50eQorNTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6Q3JvY2tldHQgQ291bnR5Cis1NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpDcm9zYnkgQ291bnR5Cis1NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpDdWxiZXJzb24gQ291bnR5Cis1NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpEYWxsYW0gQ291bnR5Cis1NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpEYWxsYXMgQ291bnR5Cis1ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpEYXdzb24gQ291bnR5Cis1OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpEZVdpdHQgQ291bnR5Cis2MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpEZWFmIFNtaXRoIENvdW50eQorNjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6RGVsdGEgQ291bnR5Cis2MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpEZW50b24gQ291bnR5Cis2MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpEaWNrZW5zIENvdW50eQorNjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6RGltbWl0IENvdW50eQorNjU6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6RG9ubGV5IENvdW50eQorNjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6RHV2YWwgQ291bnR5Cis2NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpFYXN0bGFuZCBDb3VudHkKKzY4OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkVjdG9yIENvdW50eQorNjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6RWR3YXJkcyBDb3VudHkKKzcwOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkVsIFBhc28gQ291bnR5Cis3MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpFbGxpcyBDb3VudHkKKzcyOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkVyYXRoIENvdW50eQorNzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6RmFsbHMgQ291bnR5Cis3NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpGYW5uaW4gQ291bnR5Cis3NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpGYXlldHRlIENvdW50eQorNzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6RmlzaGVyIENvdW50eQorNzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6RmxveWQgQ291bnR5Cis3ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpGb2FyZCBDb3VudHkKKzc5OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkZvcnQgQmVuZCBDb3VudHkKKzgwOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkZyYW5rbGluIENvdW50eQorODE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6RnJlZXN0b25lIENvdW50eQorODI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6RnJpbyBDb3VudHkKKzgzOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkdhaW5lcyBDb3VudHkKKzg0OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkdhbHZlc3RvbiBDb3VudHkKKzg1OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkdhcnphIENvdW50eQorODY6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6R2lsbGVzcGllIENvdW50eQorODc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6R2xhc3Njb2NrIENvdW50eQorODg6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6R29saWFkIENvdW50eQorODk6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6R29uemFsZXMgQ291bnR5Cis5MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpHcmF5IENvdW50eQorOTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6R3JheXNvbiBDb3VudHkKKzkyOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkdyZWdnIENvdW50eQorOTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6R3JpbWVzIENvdW50eQorOTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6R3VhZGFsdXBlIENvdW50eQorOTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6SGFsZSBDb3VudHkKKzk2OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkhhbGwgQ291bnR5Cis5NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpIYW1pbHRvbiBDb3VudHkKKzk4OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkhhbnNmb3JkIENvdW50eQorOTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6SGFyZGVtYW4gQ291bnR5CisxMDA6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6SGFyZGluIENvdW50eQorMTAxOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkhhcnJpcyBDb3VudHkKKzEwMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpIYXJyaXNvbiBDb3VudHkKKzEwMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpIYXJ0bGV5IENvdW50eQorMTA0OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkhhc2tlbGwgQ291bnR5CisxMDU6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6SGF5cyBDb3VudHkKKzEwNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpIZW1waGlsbCBDb3VudHkKKzEwNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpIZW5kZXJzb24gQ291bnR5CisxMDg6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6SGlkYWxnbyBDb3VudHkKKzEwOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpIaWxsIENvdW50eQorMTEwOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkhvY2tsZXkgQ291bnR5CisxMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6SG9vZCBDb3VudHkKKzExMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpIb3BraW5zIENvdW50eQorMTEzOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkhvdXN0b24gQ291bnR5CisxMTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6SG93YXJkIENvdW50eQorMTE1OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkh1ZHNwZXRoIENvdW50eQorMTE2OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkh1bnQgQ291bnR5CisxMTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6SHV0Y2hpbnNvbiBDb3VudHkKKzExODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpJcmlvbiBDb3VudHkKKzExOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpKYWNrIENvdW50eQorMTIwOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkphY2tzb24gQ291bnR5CisxMjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6SmFzcGVyIENvdW50eQorMTIyOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkplZmYgRGF2aXMgQ291bnR5CisxMjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6SmVmZmVyc29uIENvdW50eQorMTI0OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkppbSBIb2dnIENvdW50eQorMTI1OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkppbSBXZWxscyBDb3VudHkKKzEyNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpKb2huc29uIENvdW50eQorMTI3OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkpvbmVzIENvdW50eQorMTI4OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkthcm5lcyBDb3VudHkKKzEyOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpLYXVmbWFuIENvdW50eQorMTMwOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOktlbmRhbGwgQ291bnR5CisxMzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6S2VuZWR5IENvdW50eQorMTMyOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOktlbnQgQ291bnR5CisxMzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6S2VyciBDb3VudHkKKzEzNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpLaW1ibGUgQ291bnR5CisxMzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6S2luZyBDb3VudHkKKzEzNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpLaW5uZXkgQ291bnR5CisxMzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6S2xlYmVyZyBDb3VudHkKKzEzODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpLbm94IENvdW50eQorMTM5OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkxhIFNhbGxlIENvdW50eQorMTQwOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkxhbWFyIENvdW50eQorMTQxOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkxhbWIgQ291bnR5CisxNDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6TGFtcGFzYXMgQ291bnR5CisxNDM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6TGF2YWNhIENvdW50eQorMTQ0OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkxlZSBDb3VudHkKKzE0NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpMZW9uIENvdW50eQorMTQ2OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkxpYmVydHkgQ291bnR5CisxNDc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6TGltZXN0b25lIENvdW50eQorMTQ4OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkxpcHNjb21iIENvdW50eQorMTQ5OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkxpdmUgT2FrIENvdW50eQorMTUwOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkxsYW5vIENvdW50eQorMTUxOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkxvdmluZyBDb3VudHkKKzE1MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpMdWJib2NrIENvdW50eQorMTUzOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOkx5bm4gQ291bnR5CisxNTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6TWFkaXNvbiBDb3VudHkKKzE1NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpNYXJpb24gQ291bnR5CisxNTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6TWFydGluIENvdW50eQorMTU3OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOk1hc29uIENvdW50eQorMTU4OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOk1hdGFnb3JkYSBDb3VudHkKKzE1OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpNYXZlcmljayBDb3VudHkKKzE2MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpNY0N1bGxvY2ggQ291bnR5CisxNjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6TWNMZW5uYW4gQ291bnR5CisxNjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6TWNNdWxsZW4gQ291bnR5CisxNjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6TWVkaW5hIENvdW50eQorMTY0OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOk1lbmFyZCBDb3VudHkKKzE2NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpNaWRsYW5kIENvdW50eQorMTY2OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOk1pbGFtIENvdW50eQorMTY3OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOk1pbGxzIENvdW50eQorMTY4OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOk1pdGNoZWxsIENvdW50eQorMTY5OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOk1vbnRhZ3VlIENvdW50eQorMTcwOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOk1vbnRnb21lcnkgQ291bnR5CisxNzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6TW9vcmUgQ291bnR5CisxNzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6TW9ycmlzIENvdW50eQorMTczOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOk1vdGxleSBDb3VudHkKKzE3NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpOYWNvZ2RvY2hlcyBDb3VudHkKKzE3NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpOYXZhcnJvIENvdW50eQorMTc2OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOk5ld3RvbiBDb3VudHkKKzE3NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpOb2xhbiBDb3VudHkKKzE3ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpOdWVjZXMgQ291bnR5CisxNzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6T2NoaWx0cmVlIENvdW50eQorMTgwOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOk9sZGhhbSBDb3VudHkKKzE4MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpPcmFuZ2UgQ291bnR5CisxODI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6UGFsbyBQaW50byBDb3VudHkKKzE4MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpQYW5vbGEgQ291bnR5CisxODQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6UGFya2VyIENvdW50eQorMTg1OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlBhcm1lciBDb3VudHkKKzE4NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpQZWNvcyBDb3VudHkKKzE4NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpQb2xrIENvdW50eQorMTg4OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlBvdHRlciBDb3VudHkKKzE4OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpQcmVzaWRpbyBDb3VudHkKKzE5MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpSYWlucyBDb3VudHkKKzE5MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpSYW5kYWxsIENvdW50eQorMTkyOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlJlYWdhbiBDb3VudHkKKzE5MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpSZWFsIENvdW50eQorMTk0OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlJlZCBSaXZlciBDb3VudHkKKzE5NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpSZWV2ZXMgQ291bnR5CisxOTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6UmVmdWdpbyBDb3VudHkKKzE5NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpSb2JlcnRzIENvdW50eQorMTk4OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlJvYmVydHNvbiBDb3VudHkKKzE5OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpSb2Nrd2FsbCBDb3VudHkKKzIwMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpSdW5uZWxzIENvdW50eQorMjAxOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlJ1c2sgQ291bnR5CisyMDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6U2FiaW5lIENvdW50eQorMjAzOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlNhbiBBdWd1c3RpbmUgQ291bnR5CisyMDQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6U2FuIEphY2ludG8gQ291bnR5CisyMDU6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6U2FuIFBhdHJpY2lvIENvdW50eQorMjA2OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlNhbiBTYWJhIENvdW50eQorMjA3OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlNjaGxlaWNoZXIgQ291bnR5CisyMDg6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6U2N1cnJ5IENvdW50eQorMjA5OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlNoYWNrZWxmb3JkIENvdW50eQorMjEwOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlNoZWxieSBDb3VudHkKKzIxMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpTaGVybWFuIENvdW50eQorMjEyOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlNtaXRoIENvdW50eQorMjEzOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlNvbWVydmVsbCBDb3VudHkKKzIxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpTdGFyciBDb3VudHkKKzIxNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpTdGVwaGVucyBDb3VudHkKKzIxNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpTdGVybGluZyBDb3VudHkKKzIxNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpTdG9uZXdhbGwgQ291bnR5CisyMTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6U3V0dG9uIENvdW50eQorMjE5OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlN3aXNoZXIgQ291bnR5CisyMjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6VGFycmFudCBDb3VudHkKKzIyMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpUYXlsb3IgQ291bnR5CisyMjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6VGVycmVsbCBDb3VudHkKKzIyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpUZXJyeSBDb3VudHkKKzIyNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpUaHJvY2ttb3J0b24gQ291bnR5CisyMjU6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6VGl0dXMgQ291bnR5CisyMjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6VG9tIEdyZWVuIENvdW50eQorMjI3OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlRyYXZpcyBDb3VudHkKKzIyODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpUcmluaXR5IENvdW50eQorMjI5OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlR5bGVyIENvdW50eQorMjMwOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlVwc2h1ciBDb3VudHkKKzIzMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpVcHRvbiBDb3VudHkKKzIzMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpVdmFsZGUgQ291bnR5CisyMzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6VmFsIFZlcmRlIENvdW50eQorMjM0OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOlZhbiBaYW5kdCBDb3VudHkKKzIzNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpWaWN0b3JpYSBDb3VudHkKKzIzNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpXYWxrZXIgQ291bnR5CisyMzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6V2FsbGVyIENvdW50eQorMjM4OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOldhcmQgQ291bnR5CisyMzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6V2FzaGluZ3RvbiBDb3VudHkKKzI0MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpXZWJiIENvdW50eQorMjQxOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOldoYXJ0b24gQ291bnR5CisyNDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6V2hlZWxlciBDb3VudHkKKzI0MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpXaWNoaXRhIENvdW50eQorMjQ0OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOldpbGJhcmdlciBDb3VudHkKKzI0NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpXaWxsYWN5IENvdW50eQorMjQ2OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOldpbGxpYW1zb24gQ291bnR5CisyNDc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6V2lsc29uIENvdW50eQorMjQ4OlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOldpbmtsZXIgQ291bnR5CisyNDk6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6V2lzZSBDb3VudHkKKzI1MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpXb29kIENvdW50eQorMjUxOlVTOlVTQTpVTklURUQgU1RBVEVTOlRFWEFTOllvYWt1bSBDb3VudHkKKzI1MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpZb3VuZyBDb3VudHkKKzI1MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpURVhBUzpaYXBhdGEgQ291bnR5CisyNTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VEVYQVM6WmF2YWxhIENvdW50eQorMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOkF1dGF1Z2EgQ291bnR5CisyOlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQUJBTUE6QmFsZHdpbiBDb3VudHkKKzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpCYXJib3VyIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOkJpYmIgQ291bnR5Cis1OlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQUJBTUE6QmxvdW50IENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOkJ1bGxvY2sgQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQUJBTUE6QnV0bGVyIENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOkNhbGhvdW4gQ291bnR5Cis5OlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQUJBTUE6Q2hhbWJlcnMgQ291bnR5CisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOkNoZXJva2VlIENvdW50eQorMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpDaGlsdG9uIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpDaG9jdGF3IENvdW50eQorMTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpDbGFya2UgQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOkNsYXkgQ291bnR5CisxNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOkNsZWJ1cm5lIENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpDb2ZmZWUgQ291bnR5CisxNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOkNvbGJlcnQgQ291bnR5CisxODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOkNvbmVjdWggQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOkNvb3NhIENvdW50eQorMjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpDb3Zpbmd0b24gQ291bnR5CisyMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOkNyZW5zaGF3IENvdW50eQorMjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpDdWxsbWFuIENvdW50eQorMjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpEYWxlIENvdW50eQorMjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpEYWxsYXMgQ291bnR5CisyNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOkRlS2FsYiBDb3VudHkKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQUJBTUE6RWxtb3JlIENvdW50eQorMjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpFc2NhbWJpYSBDb3VudHkKKzI4OlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQUJBTUE6RXRvd2FoIENvdW50eQorMjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpGYXlldHRlIENvdW50eQorMzA6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpGcmFua2xpbiBDb3VudHkKKzMxOlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQUJBTUE6R2VuZXZhIENvdW50eQorMzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpHcmVlbmUgQ291bnR5CiszMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOkhhbGUgQ291bnR5CiszNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOkhlbnJ5IENvdW50eQorMzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpIb3VzdG9uIENvdW50eQorMzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpKYWNrc29uIENvdW50eQorMzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpKZWZmZXJzb24gQ291bnR5CiszODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOkxhbWFyIENvdW50eQorMzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpMYXVkZXJkYWxlIENvdW50eQorNDA6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpMYXdyZW5jZSBDb3VudHkKKzQxOlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQUJBTUE6TGVlIENvdW50eQorNDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpMaW1lc3RvbmUgQ291bnR5Cis0MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOkxvd25kZXMgQ291bnR5Cis0NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOk1hY29uIENvdW50eQorNDU6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpNYWRpc29uIENvdW50eQorNDY6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpNYXJlbmdvIENvdW50eQorNDc6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpNYXJpb24gQ291bnR5Cis0ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOk1hcnNoYWxsIENvdW50eQorNDk6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpNb2JpbGUgQ291bnR5Cis1MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOk1vbnJvZSBDb3VudHkKKzUxOlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQUJBTUE6TW9udGdvbWVyeSBDb3VudHkKKzUyOlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQUJBTUE6TW9yZ2FuIENvdW50eQorNTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpQZXJyeSBDb3VudHkKKzU0OlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQUJBTUE6UGlja2VucyBDb3VudHkKKzU1OlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQUJBTUE6UGlrZSBDb3VudHkKKzU2OlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQUJBTUE6UmFuZG9scGggQ291bnR5Cis1NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOlJ1c3NlbGwgQ291bnR5Cis1ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOlNoZWxieSBDb3VudHkKKzU5OlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQUJBTUE6U3QuIENsYWlyIENvdW50eQorNjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpTdW10ZXIgQ291bnR5Cis2MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOlRhbGxhZGVnYSBDb3VudHkKKzYyOlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQUJBTUE6VGFsbGFwb29zYSBDb3VudHkKKzYzOlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQUJBTUE6VHVzY2Fsb29zYSBDb3VudHkKKzY0OlVTOlVTQTpVTklURUQgU1RBVEVTOkFMQUJBTUE6V2Fsa2VyIENvdW50eQorNjU6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpXYXNoaW5ndG9uIENvdW50eQorNjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6QUxBQkFNQTpXaWxjb3ggQ291bnR5Cis2NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBTEFCQU1BOldpbnN0b24gQ291bnR5CisxOlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTk5FQ1RJQ1VUOkZhaXJmaWVsZCBDb3VudHkKKzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09OTkVDVElDVVQ6SGFydGZvcmQgQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTk5FQ1RJQ1VUOkxpdGNoZmllbGQgQ291bnR5Cis0OlVTOlVTQTpVTklURUQgU1RBVEVTOkNPTk5FQ1RJQ1VUOk1pZGRsZXNleCBDb3VudHkKKzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6Q09OTkVDVElDVVQ6TmV3IEhhdmVuIENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT05ORUNUSUNVVDpOZXcgTG9uZG9uIENvdW50eQorNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT05ORUNUSUNVVDpUb2xsYW5kIENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpDT05ORUNUSUNVVDpXaW5kaGFtIENvdW50eQorMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNT05UQU5BOkJlYXZlcmhlYWQgQ291bnR5CisyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6QmlnIEhvcm4gQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6QmxhaW5lIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNT05UQU5BOkJyb2Fkd2F0ZXIgQ291bnR5Cis1OlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6Q2FyYm9uIENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNT05UQU5BOkNhcnRlciBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TU9OVEFOQTpDYXNjYWRlIENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNT05UQU5BOkNob3V0ZWF1IENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNT05UQU5BOkN1c3RlciBDb3VudHkKKzEwOlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6RGFuaWVscyBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6RGF3c29uIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TU9OVEFOQTpEZWVyIExvZGdlIENvdW50eQorMTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TU9OVEFOQTpGYWxsb24gQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNT05UQU5BOkZlcmd1cyBDb3VudHkKKzE1OlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6RmxhdGhlYWQgQ291bnR5CisxNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNT05UQU5BOkdhbGxhdGluIENvdW50eQorMTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TU9OVEFOQTpHYXJmaWVsZCBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6R2xhY2llciBDb3VudHkKKzE5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6R29sZGVuIFZhbGxleSBDb3VudHkKKzIwOlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6R3Jhbml0ZSBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6SGlsbCBDb3VudHkKKzIyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6SmVmZmVyc29uIENvdW50eQorMjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TU9OVEFOQTpKdWRpdGggQmFzaW4gQ291bnR5CisyNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNT05UQU5BOkxha2UgQ291bnR5CisyNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNT05UQU5BOkxld2lzIGFuZCBDbGFyayBDb3VudHkKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6TGliZXJ0eSBDb3VudHkKKzI3OlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6TGluY29sbiBDb3VudHkKKzI4OlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6TWFkaXNvbiBDb3VudHkKKzI5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6TWNDb25lIENvdW50eQorMzA6VVM6VVNBOlVOSVRFRCBTVEFURVM6TU9OVEFOQTpNZWFnaGVyIENvdW50eQorMzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TU9OVEFOQTpNaW5lcmFsIENvdW50eQorMzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TU9OVEFOQTpNaXNzb3VsYSBDb3VudHkKKzMzOlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6TXVzc2Vsc2hlbGwgQ291bnR5CiszNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNT05UQU5BOlBhcmsgQ291bnR5CiszNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNT05UQU5BOlBldHJvbGV1bSBDb3VudHkKKzM2OlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6UGhpbGxpcHMgQ291bnR5CiszNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNT05UQU5BOlBvbmRlcmEgQ291bnR5CiszODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNT05UQU5BOlBvd2RlciBSaXZlciBDb3VudHkKKzM5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6UG93ZWxsIENvdW50eQorNDA6VVM6VVNBOlVOSVRFRCBTVEFURVM6TU9OVEFOQTpQcmFpcmllIENvdW50eQorNDE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TU9OVEFOQTpSYXZhbGxpIENvdW50eQorNDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TU9OVEFOQTpSaWNobGFuZCBDb3VudHkKKzQzOlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6Um9vc2V2ZWx0IENvdW50eQorNDQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TU9OVEFOQTpSb3NlYnVkIENvdW50eQorNDU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TU9OVEFOQTpTYW5kZXJzIENvdW50eQorNDY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TU9OVEFOQTpTaGVyaWRhbiBDb3VudHkKKzQ3OlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6U2lsdmVyIEJvdyBDb3VudHkKKzQ4OlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6U3RpbGx3YXRlciBDb3VudHkKKzQ5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6U3dlZXQgR3Jhc3MgQ291bnR5Cis1MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNT05UQU5BOlRldG9uIENvdW50eQorNTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TU9OVEFOQTpUb29sZSBDb3VudHkKKzUyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6VHJlYXN1cmUgQ291bnR5Cis1MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNT05UQU5BOlZhbGxleSBDb3VudHkKKzU0OlVTOlVTQTpVTklURUQgU1RBVEVTOk1PTlRBTkE6V2hlYXRsYW5kIENvdW50eQorNTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TU9OVEFOQTpXaWJhdXggQ291bnR5Cis1NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNT05UQU5BOlllbGxvd3N0b25lIENvdW50eQorMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQUlORTpBbmRyb3Njb2dnaW4gQ291bnR5CisyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1BSU5FOkFyb29zdG9vayBDb3VudHkKKzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFJTkU6Q3VtYmVybGFuZCBDb3VudHkKKzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFJTkU6RnJhbmtsaW4gQ291bnR5Cis1OlVTOlVTQTpVTklURUQgU1RBVEVTOk1BSU5FOkhhbmNvY2sgQ291bnR5Cis2OlVTOlVTQTpVTklURUQgU1RBVEVTOk1BSU5FOktlbm5lYmVjIENvdW50eQorNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQUlORTpLbm94IENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQUlORTpMaW5jb2xuIENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQUlORTpPeGZvcmQgQ291bnR5CisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQUlORTpQZW5vYnNjb3QgQ291bnR5CisxMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQUlORTpQaXNjYXRhcXVpcyBDb3VudHkKKzEyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1BSU5FOlNhZ2FkYWhvYyBDb3VudHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOk1BSU5FOlNvbWVyc2V0IENvdW50eQorMTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFJTkU6V2FsZG8gQ291bnR5CisxNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQUlORTpXYXNoaW5ndG9uIENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFJTkU6WW9yayBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpBbGFjaHVhIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpGTE9SSURBOkJha2VyIENvdW50eQorMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpGTE9SSURBOkJheSBDb3VudHkKKzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpCcmFkZm9yZCBDb3VudHkKKzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpCcmV2YXJkIENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpGTE9SSURBOkJyb3dhcmQgQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6Q2FsaG91biBDb3VudHkKKzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpDaGFybG90dGUgQ291bnR5Cis5OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6Q2l0cnVzIENvdW50eQorMTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpDbGF5IENvdW50eQorMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpDb2xsaWVyIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpDb2x1bWJpYSBDb3VudHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6RGVTb3RvIENvdW50eQorMTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpEaXhpZSBDb3VudHkKKzE1OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6RHV2YWwgQ291bnR5CisxNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpGTE9SSURBOkVzY2FtYmlhIENvdW50eQorMTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpGbGFnbGVyIENvdW50eQorMTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpGcmFua2xpbiBDb3VudHkKKzE5OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6R2Fkc2RlbiBDb3VudHkKKzIwOlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6R2lsY2hyaXN0IENvdW50eQorMjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpHbGFkZXMgQ291bnR5CisyMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpGTE9SSURBOkd1bGYgQ291bnR5CisyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpGTE9SSURBOkhhbWlsdG9uIENvdW50eQorMjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpIYXJkZWUgQ291bnR5CisyNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpGTE9SSURBOkhlbmRyeSBDb3VudHkKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6SGVybmFuZG8gQ291bnR5CisyNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpGTE9SSURBOkhpZ2hsYW5kcyBDb3VudHkKKzI4OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6SGlsbHNib3JvdWdoIENvdW50eQorMjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpIb2xtZXMgQ291bnR5CiszMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpGTE9SSURBOkluZGlhbiBSaXZlciBDb3VudHkKKzMxOlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6SmFja3NvbiBDb3VudHkKKzMyOlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6SmVmZmVyc29uIENvdW50eQorMzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpMYWZheWV0dGUgQ291bnR5CiszNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpGTE9SSURBOkxha2UgQ291bnR5CiszNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpGTE9SSURBOkxlZSBDb3VudHkKKzM2OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6TGVvbiBDb3VudHkKKzM3OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6TGV2eSBDb3VudHkKKzM4OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6TGliZXJ0eSBDb3VudHkKKzM5OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6TWFkaXNvbiBDb3VudHkKKzQwOlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6TWFuYXRlZSBDb3VudHkKKzQxOlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6TWFyaW9uIENvdW50eQorNDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpNYXJ0aW4gQ291bnR5Cis0MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpGTE9SSURBOk1pYW1pLURhZGUgQ291bnR5Cis0NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpGTE9SSURBOk1vbnJvZSBDb3VudHkKKzQ1OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6TmFzc2F1IENvdW50eQorNDY6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpPa2Fsb29zYSBDb3VudHkKKzQ3OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6T2tlZWNob2JlZSBDb3VudHkKKzQ4OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6T3JhbmdlIENvdW50eQorNDk6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpPc2Nlb2xhIENvdW50eQorNTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpQYWxtIEJlYWNoIENvdW50eQorNTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpQYXNjbyBDb3VudHkKKzUyOlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6UGluZWxsYXMgQ291bnR5Cis1MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpGTE9SSURBOlBvbGsgQ291bnR5Cis1NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpGTE9SSURBOlB1dG5hbSBDb3VudHkKKzU1OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6U2FudGEgUm9zYSBDb3VudHkKKzU2OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6U2FyYXNvdGEgQ291bnR5Cis1NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpGTE9SSURBOlNlbWlub2xlIENvdW50eQorNTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpTdC4gSm9obnMgQ291bnR5Cis1OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpGTE9SSURBOlN0LiBMdWNpZSBDb3VudHkKKzYwOlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6U3VtdGVyIENvdW50eQorNjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpTdXdhbm5lZSBDb3VudHkKKzYyOlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6VGF5bG9yIENvdW50eQorNjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpVbmlvbiBDb3VudHkKKzY0OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6Vm9sdXNpYSBDb3VudHkKKzY1OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6V2FrdWxsYSBDb3VudHkKKzY2OlVTOlVTQTpVTklURUQgU1RBVEVTOkZMT1JJREE6V2FsdG9uIENvdW50eQorNjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6RkxPUklEQTpXYXNoaW5ndG9uIENvdW50eQorMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpVVEFIOkJlYXZlciBDb3VudHkKKzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VVRBSDpCb3ggRWxkZXIgQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOlVUQUg6Q2FjaGUgQ291bnR5Cis0OlVTOlVTQTpVTklURUQgU1RBVEVTOlVUQUg6Q2FyYm9uIENvdW50eQorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpVVEFIOkRhZ2dldHQgQ291bnR5Cis2OlVTOlVTQTpVTklURUQgU1RBVEVTOlVUQUg6RGF2aXMgQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOlVUQUg6RHVjaGVzbmUgQ291bnR5Cis4OlVTOlVTQTpVTklURUQgU1RBVEVTOlVUQUg6RW1lcnkgQ291bnR5Cis5OlVTOlVTQTpVTklURUQgU1RBVEVTOlVUQUg6R2FyZmllbGQgQ291bnR5CisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpVVEFIOkdyYW5kIENvdW50eQorMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VVRBSDpJcm9uIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6VVRBSDpKdWFiIENvdW50eQorMTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6VVRBSDpLYW5lIENvdW50eQorMTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VVRBSDpNaWxsYXJkIENvdW50eQorMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6VVRBSDpNb3JnYW4gQ291bnR5CisxNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpVVEFIOlBpdXRlIENvdW50eQorMTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6VVRBSDpSaWNoIENvdW50eQorMTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6VVRBSDpTYWx0IExha2UgQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpVVEFIOlNhbiBKdWFuIENvdW50eQorMjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6VVRBSDpTYW5wZXRlIENvdW50eQorMjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VVRBSDpTZXZpZXIgQ291bnR5CisyMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpVVEFIOlN1bW1pdCBDb3VudHkKKzIzOlVTOlVTQTpVTklURUQgU1RBVEVTOlVUQUg6VG9vZWxlIENvdW50eQorMjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6VVRBSDpVaW50YWggQ291bnR5CisyNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpVVEFIOlV0YWggQ291bnR5CisyNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpVVEFIOldhc2F0Y2ggQ291bnR5CisyNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpVVEFIOldhc2hpbmd0b24gQ291bnR5CisyODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpVVEFIOldheW5lIENvdW50eQorMjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6VVRBSDpXZWJlciBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIEhBTVBTSElSRTpCZWxrbmFwIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgSEFNUFNISVJFOkNhcnJvbGwgQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBIQU1QU0hJUkU6Q2hlc2hpcmUgQ291bnR5Cis0OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBIQU1QU0hJUkU6Q29vcyBDb3VudHkKKzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIEhBTVBTSElSRTpHcmFmdG9uIENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgSEFNUFNISVJFOkhpbGxzYm9yb3VnaCBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIEhBTVBTSElSRTpNZXJyaW1hY2sgQ291bnR5Cis4OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVyBIQU1QU0hJUkU6Um9ja2luZ2hhbSBDb3VudHkKKzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVXIEhBTVBTSElSRTpTdHJhZmZvcmQgQ291bnR5CisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVcgSEFNUFNISVJFOlN1bGxpdmFuIENvdW50eQorMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOkFkYWlyIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOkFkYW1zIENvdW50eQorMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOkFsbGFtYWtlZSBDb3VudHkKKzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpBcHBhbm9vc2UgQ291bnR5Cis1OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6QXVkdWJvbiBDb3VudHkKKzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpCZW50b24gQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6QmxhY2sgSGF3ayBDb3VudHkKKzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpCb29uZSBDb3VudHkKKzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpCcmVtZXIgQ291bnR5CisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOkJ1Y2hhbmFuIENvdW50eQorMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpCdWVuYSBWaXN0YSBDb3VudHkKKzEyOlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6QnV0bGVyIENvdW50eQorMTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpDYWxob3VuIENvdW50eQorMTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpDYXJyb2xsIENvdW50eQorMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpDYXNzIENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpDZWRhciBDb3VudHkKKzE3OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6Q2Vycm8gR29yZG8gQ291bnR5CisxODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOkNoZXJva2VlIENvdW50eQorMTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpDaGlja2FzYXcgQ291bnR5CisyMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOkNsYXJrZSBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6Q2xheSBDb3VudHkKKzIyOlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6Q2xheXRvbiBDb3VudHkKKzIzOlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6Q2xpbnRvbiBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6Q3Jhd2ZvcmQgQ291bnR5CisyNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOkRhbGxhcyBDb3VudHkKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6RGF2aXMgQ291bnR5CisyNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOkRlY2F0dXIgQ291bnR5CisyODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOkRlbGF3YXJlIENvdW50eQorMjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpEZXMgTW9pbmVzIENvdW50eQorMzA6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpEaWNraW5zb24gQ291bnR5CiszMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOkR1YnVxdWUgQ291bnR5CiszMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOkVtbWV0IENvdW50eQorMzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpGYXlldHRlIENvdW50eQorMzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpGbG95ZCBDb3VudHkKKzM1OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6RnJhbmtsaW4gQ291bnR5CiszNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOkZyZW1vbnQgQ291bnR5CiszNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOkdyZWVuZSBDb3VudHkKKzM4OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6R3J1bmR5IENvdW50eQorMzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpHdXRocmllIENvdW50eQorNDA6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpIYW1pbHRvbiBDb3VudHkKKzQxOlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6SGFuY29jayBDb3VudHkKKzQyOlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6SGFyZGluIENvdW50eQorNDM6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpIYXJyaXNvbiBDb3VudHkKKzQ0OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6SGVucnkgQ291bnR5Cis0NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOkhvd2FyZCBDb3VudHkKKzQ2OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6SHVtYm9sZHQgQ291bnR5Cis0NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOklkYSBDb3VudHkKKzQ4OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6SW93YSBDb3VudHkKKzQ5OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6SmFja3NvbiBDb3VudHkKKzUwOlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6SmFzcGVyIENvdW50eQorNTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpKZWZmZXJzb24gQ291bnR5Cis1MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOkpvaG5zb24gQ291bnR5Cis1MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOkpvbmVzIENvdW50eQorNTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpLZW9rdWsgQ291bnR5Cis1NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOktvc3N1dGggQ291bnR5Cis1NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOkxlZSBDb3VudHkKKzU3OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6TGlubiBDb3VudHkKKzU4OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6TG91aXNhIENvdW50eQorNTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpMdWNhcyBDb3VudHkKKzYwOlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6THlvbiBDb3VudHkKKzYxOlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6TWFkaXNvbiBDb3VudHkKKzYyOlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6TWFoYXNrYSBDb3VudHkKKzYzOlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6TWFyaW9uIENvdW50eQorNjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpNYXJzaGFsbCBDb3VudHkKKzY1OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6TWlsbHMgQ291bnR5Cis2NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOk1pdGNoZWxsIENvdW50eQorNjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpNb25vbmEgQ291bnR5Cis2ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOk1vbnJvZSBDb3VudHkKKzY5OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6TW9udGdvbWVyeSBDb3VudHkKKzcwOlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6TXVzY2F0aW5lIENvdW50eQorNzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpPJ0JyaWVuIENvdW50eQorNzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpPc2Nlb2xhIENvdW50eQorNzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpQYWdlIENvdW50eQorNzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpQYWxvIEFsdG8gQ291bnR5Cis3NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOlBseW1vdXRoIENvdW50eQorNzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpQb2NhaG9udGFzIENvdW50eQorNzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpQb2xrIENvdW50eQorNzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpQb3R0YXdhdHRhbWllIENvdW50eQorNzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpQb3dlc2hpZWsgQ291bnR5Cis4MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOlJpbmdnb2xkIENvdW50eQorODE6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpTYWMgQ291bnR5Cis4MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOlNjb3R0IENvdW50eQorODM6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpTaGVsYnkgQ291bnR5Cis4NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOlNpb3V4IENvdW50eQorODU6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpTdG9yeSBDb3VudHkKKzg2OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6VGFtYSBDb3VudHkKKzg3OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6VGF5bG9yIENvdW50eQorODg6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpVbmlvbiBDb3VudHkKKzg5OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6VmFuIEJ1cmVuIENvdW50eQorOTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpXYXBlbGxvIENvdW50eQorOTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpXYXJyZW4gQ291bnR5Cis5MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOldhc2hpbmd0b24gQ291bnR5Cis5MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOldheW5lIENvdW50eQorOTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpXZWJzdGVyIENvdW50eQorOTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpXaW5uZWJhZ28gQ291bnR5Cis5NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOldpbm5lc2hpZWsgQ291bnR5Cis5NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJT1dBOldvb2RidXJ5IENvdW50eQorOTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU9XQTpXb3J0aCBDb3VudHkKKzk5OlVTOlVTQTpVTklURUQgU1RBVEVTOklPV0E6V3JpZ2h0IENvdW50eQorMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpBZGFtcyBDb3VudHkKKzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6QWxleGFuZGVyIENvdW50eQorMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpCb25kIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpCb29uZSBDb3VudHkKKzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6QnJvd24gQ291bnR5Cis2OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkJ1cmVhdSBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6Q2FsaG91biBDb3VudHkKKzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6Q2Fycm9sbCBDb3VudHkKKzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6Q2FzcyBDb3VudHkKKzEwOlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkNoYW1wYWlnbiBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkNocmlzdGlhbiBDb3VudHkKKzEyOlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkNsYXJrIENvdW50eQorMTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6Q2xheSBDb3VudHkKKzE0OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkNsaW50b24gQ291bnR5CisxNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpDb2xlcyBDb3VudHkKKzE2OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkNvb2sgQ291bnR5CisxNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpDcmF3Zm9yZCBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkN1bWJlcmxhbmQgQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpEZSBXaXR0IENvdW50eQorMjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6RGVLYWxiIENvdW50eQorMjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6RG91Z2xhcyBDb3VudHkKKzIyOlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkR1UGFnZSBDb3VudHkKKzIzOlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkVkZ2FyIENvdW50eQorMjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6RWR3YXJkcyBDb3VudHkKKzI1OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkVmZmluZ2hhbSBDb3VudHkKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkZheWV0dGUgQ291bnR5CisyNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpGb3JkIENvdW50eQorMjg6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6RnJhbmtsaW4gQ291bnR5CisyOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpGdWx0b24gQ291bnR5CiszMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpHYWxsYXRpbiBDb3VudHkKKzMxOlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkdyZWVuZSBDb3VudHkKKzMyOlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkdydW5keSBDb3VudHkKKzMzOlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkhhbWlsdG9uIENvdW50eQorMzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6SGFuY29jayBDb3VudHkKKzM1OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkhhcmRpbiBDb3VudHkKKzM2OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkhlbmRlcnNvbiBDb3VudHkKKzM3OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkhlbnJ5IENvdW50eQorMzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6SXJvcXVvaXMgQ291bnR5CiszOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpKYWNrc29uIENvdW50eQorNDA6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6SmFzcGVyIENvdW50eQorNDE6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6SmVmZmVyc29uIENvdW50eQorNDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6SmVyc2V5IENvdW50eQorNDM6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6Sm8gRGF2aWVzcyBDb3VudHkKKzQ0OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkpvaG5zb24gQ291bnR5Cis0NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpLYW5lIENvdW50eQorNDY6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6S2Fua2FrZWUgQ291bnR5Cis0NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpLZW5kYWxsIENvdW50eQorNDg6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6S25veCBDb3VudHkKKzQ5OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkxhIFNhbGxlIENvdW50eQorNTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6TGFrZSBDb3VudHkKKzUxOlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkxhd3JlbmNlIENvdW50eQorNTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6TGVlIENvdW50eQorNTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6TGl2aW5nc3RvbiBDb3VudHkKKzU0OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOkxvZ2FuIENvdW50eQorNTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6TWFjb24gQ291bnR5Cis1NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpNYWNvdXBpbiBDb3VudHkKKzU3OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOk1hZGlzb24gQ291bnR5Cis1ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpNYXJpb24gQ291bnR5Cis1OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpNYXJzaGFsbCBDb3VudHkKKzYwOlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOk1hc29uIENvdW50eQorNjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6TWFzc2FjIENvdW50eQorNjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6TWNEb25vdWdoIENvdW50eQorNjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6TWNIZW5yeSBDb3VudHkKKzY0OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOk1jTGVhbiBDb3VudHkKKzY1OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOk1lbmFyZCBDb3VudHkKKzY2OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOk1lcmNlciBDb3VudHkKKzY3OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOk1vbnJvZSBDb3VudHkKKzY4OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOk1vbnRnb21lcnkgQ291bnR5Cis2OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpNb3JnYW4gQ291bnR5Cis3MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpNb3VsdHJpZSBDb3VudHkKKzcxOlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOk9nbGUgQ291bnR5Cis3MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpQZW9yaWEgQ291bnR5Cis3MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpQZXJyeSBDb3VudHkKKzc0OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOlBpYXR0IENvdW50eQorNzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6UGlrZSBDb3VudHkKKzc2OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOlBvcGUgQ291bnR5Cis3NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpQdWxhc2tpIENvdW50eQorNzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6UHV0bmFtIENvdW50eQorNzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6UmFuZG9scGggQ291bnR5Cis4MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpSaWNobGFuZCBDb3VudHkKKzgxOlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOlJvY2sgSXNsYW5kIENvdW50eQorODI6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6U2FsaW5lIENvdW50eQorODM6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6U2FuZ2Ftb24gQ291bnR5Cis4NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpTY2h1eWxlciBDb3VudHkKKzg1OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOlNjb3R0IENvdW50eQorODY6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6U2hlbGJ5IENvdW50eQorODc6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6U3QuIENsYWlyIENvdW50eQorODg6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6U3RhcmsgQ291bnR5Cis4OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpTdGVwaGVuc29uIENvdW50eQorOTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6VGF6ZXdlbGwgQ291bnR5Cis5MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpVbmlvbiBDb3VudHkKKzkyOlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOlZlcm1pbGlvbiBDb3VudHkKKzkzOlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOldhYmFzaCBDb3VudHkKKzk0OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOldhcnJlbiBDb3VudHkKKzk1OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOldhc2hpbmd0b24gQ291bnR5Cis5NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpXYXluZSBDb3VudHkKKzk3OlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOldoaXRlIENvdW50eQorOTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6V2hpdGVzaWRlIENvdW50eQorOTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6SUxMSU5PSVM6V2lsbCBDb3VudHkKKzEwMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpXaWxsaWFtc29uIENvdW50eQorMTAxOlVTOlVTQTpVTklURUQgU1RBVEVTOklMTElOT0lTOldpbm5lYmFnbyBDb3VudHkKKzEwMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTExJTk9JUzpXb29kZm9yZCBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOkFkYW1zIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6QmFybmVzIENvdW50eQorMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6QmVuc29uIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6QmlsbGluZ3MgQ291bnR5Cis1OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIERBS09UQTpCb3R0aW5lYXUgQ291bnR5Cis2OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIERBS09UQTpCb3dtYW4gQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIERBS09UQTpCdXJrZSBDb3VudHkKKzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOkJ1cmxlaWdoIENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6Q2FzcyBDb3VudHkKKzEwOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIERBS09UQTpDYXZhbGllciBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIERBS09UQTpEaWNrZXkgQ291bnR5CisxMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6RGl2aWRlIENvdW50eQorMTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOkR1bm4gQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6RWRkeSBDb3VudHkKKzE1OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIERBS09UQTpFbW1vbnMgQ291bnR5CisxNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6Rm9zdGVyIENvdW50eQorMTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOkdvbGRlbiBWYWxsZXkgQ291bnR5CisxODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6R3JhbmQgRm9ya3MgQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6R3JhbnQgQ291bnR5CisyMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6R3JpZ2dzIENvdW50eQorMjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOkhldHRpbmdlciBDb3VudHkKKzIyOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIERBS09UQTpLaWRkZXIgQ291bnR5CisyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6TGFNb3VyZSBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIERBS09UQTpMb2dhbiBDb3VudHkKKzI1OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIERBS09UQTpNY0hlbnJ5IENvdW50eQorMjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOk1jSW50b3NoIENvdW50eQorMjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOk1jS2VuemllIENvdW50eQorMjg6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOk1jTGVhbiBDb3VudHkKKzI5OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIERBS09UQTpNZXJjZXIgQ291bnR5CiszMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6TW9ydG9uIENvdW50eQorMzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOk1vdW50cmFpbCBDb3VudHkKKzMyOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIERBS09UQTpOZWxzb24gQ291bnR5CiszMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6T2xpdmVyIENvdW50eQorMzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOlBlbWJpbmEgQ291bnR5CiszNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6UGllcmNlIENvdW50eQorMzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOlJhbXNleSBDb3VudHkKKzM3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIERBS09UQTpSYW5zb20gQ291bnR5CiszODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6UmVudmlsbGUgQ291bnR5CiszOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6UmljaGxhbmQgQ291bnR5Cis0MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6Um9sZXR0ZSBDb3VudHkKKzQxOlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIERBS09UQTpTYXJnZW50IENvdW50eQorNDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOlNoZXJpZGFuIENvdW50eQorNDM6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOlNpb3V4IENvdW50eQorNDQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOlNsb3BlIENvdW50eQorNDU6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOlN0YXJrIENvdW50eQorNDY6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOlN0ZWVsZSBDb3VudHkKKzQ3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIERBS09UQTpTdHV0c21hbiBDb3VudHkKKzQ4OlVTOlVTQTpVTklURUQgU1RBVEVTOk5PUlRIIERBS09UQTpUb3duZXIgQ291bnR5Cis0OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6VHJhaWxsIENvdW50eQorNTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOldhbHNoIENvdW50eQorNTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6Tk9SVEggREFLT1RBOldhcmQgQ291bnR5Cis1MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6V2VsbHMgQ291bnR5Cis1MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpOT1JUSCBEQUtPVEE6V2lsbGlhbXMgQ291bnR5CisxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkFkYWlyIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpBbmRyZXcgQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkF0Y2hpc29uIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpBdWRyYWluIENvdW50eQorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpCYXJyeSBDb3VudHkKKzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6QmFydG9uIENvdW50eQorNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpCYXRlcyBDb3VudHkKKzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6QmVudG9uIENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpCb2xsaW5nZXIgQ291bnR5CisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpCb29uZSBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkJ1Y2hhbmFuIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6QnV0bGVyIENvdW50eQorMTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6Q2FsZHdlbGwgQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpDYWxsYXdheSBDb3VudHkKKzE1OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkNhbWRlbiBDb3VudHkKKzE2OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkNhcGUgR2lyYXJkZWF1IENvdW50eQorMTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6Q2Fycm9sbCBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkNhcnRlciBDb3VudHkKKzE5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkNhc3MgQ291bnR5CisyMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpDZWRhciBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkNoYXJpdG9uIENvdW50eQorMjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6Q2hyaXN0aWFuIENvdW50eQorMjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6Q2xhcmsgQ291bnR5CisyNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpDbGF5IENvdW50eQorMjU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6Q2xpbnRvbiBDb3VudHkKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkNvbGUgQ291bnR5CisyNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpDb29wZXIgQ291bnR5CisyODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpDcmF3Zm9yZCBDb3VudHkKKzI5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkRhZGUgQ291bnR5CiszMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpEYWxsYXMgQ291bnR5CiszMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpEYXZpZXNzIENvdW50eQorMzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6RGVLYWxiIENvdW50eQorMzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6RGVudCBDb3VudHkKKzM0OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkRvdWdsYXMgQ291bnR5CiszNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpEdW5rbGluIENvdW50eQorMzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6RnJhbmtsaW4gQ291bnR5CiszNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpHYXNjb25hZGUgQ291bnR5CiszODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpHZW50cnkgQ291bnR5CiszOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpHcmVlbmUgQ291bnR5Cis0MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpHcnVuZHkgQ291bnR5Cis0MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpIYXJyaXNvbiBDb3VudHkKKzQyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkhlbnJ5IENvdW50eQorNDM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6SGlja29yeSBDb3VudHkKKzQ0OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkhvbHQgQ291bnR5Cis0NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpIb3dhcmQgQ291bnR5Cis0NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpIb3dlbGwgQ291bnR5Cis0NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpJcm9uIENvdW50eQorNDg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6SmFja3NvbiBDb3VudHkKKzQ5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkphc3BlciBDb3VudHkKKzUwOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkplZmZlcnNvbiBDb3VudHkKKzUxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkpvaG5zb24gQ291bnR5Cis1MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpLbm94IENvdW50eQorNTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6TGFjbGVkZSBDb3VudHkKKzU0OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkxhZmF5ZXR0ZSBDb3VudHkKKzU1OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkxhd3JlbmNlIENvdW50eQorNTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6TGV3aXMgQ291bnR5Cis1NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpMaW5jb2xuIENvdW50eQorNTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6TGlubiBDb3VudHkKKzU5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOkxpdmluZ3N0b24gQ291bnR5Cis2MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpNYWNvbiBDb3VudHkKKzYxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOk1hZGlzb24gQ291bnR5Cis2MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpNYXJpZXMgQ291bnR5Cis2MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpNYXJpb24gQ291bnR5Cis2NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpNY0RvbmFsZCBDb3VudHkKKzY1OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOk1lcmNlciBDb3VudHkKKzY2OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOk1pbGxlciBDb3VudHkKKzY3OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOk1pc3Npc3NpcHBpIENvdW50eQorNjg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6TW9uaXRlYXUgQ291bnR5Cis2OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpNb25yb2UgQ291bnR5Cis3MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpNb250Z29tZXJ5IENvdW50eQorNzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6TW9yZ2FuIENvdW50eQorNzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6TmV3IE1hZHJpZCBDb3VudHkKKzczOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOk5ld3RvbiBDb3VudHkKKzc0OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOk5vZGF3YXkgQ291bnR5Cis3NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpPcmVnb24gQ291bnR5Cis3NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpPc2FnZSBDb3VudHkKKzc3OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOk96YXJrIENvdW50eQorNzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6UGVtaXNjb3QgQ291bnR5Cis3OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpQZXJyeSBDb3VudHkKKzgwOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOlBldHRpcyBDb3VudHkKKzgxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOlBoZWxwcyBDb3VudHkKKzgyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOlBpa2UgQ291bnR5Cis4MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpQbGF0dGUgQ291bnR5Cis4NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpQb2xrIENvdW50eQorODU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6UHVsYXNraSBDb3VudHkKKzg2OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOlB1dG5hbSBDb3VudHkKKzg3OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOlJhbGxzIENvdW50eQorODg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6UmFuZG9scGggQ291bnR5Cis4OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpSYXkgQ291bnR5Cis5MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpSZXlub2xkcyBDb3VudHkKKzkxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOlJpcGxleSBDb3VudHkKKzkyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOlNhbGluZSBDb3VudHkKKzkzOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOlNjaHV5bGVyIENvdW50eQorOTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6U2NvdGxhbmQgQ291bnR5Cis5NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpTY290dCBDb3VudHkKKzk2OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOlNoYW5ub24gQ291bnR5Cis5NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpTaGVsYnkgQ291bnR5Cis5ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpTdC4gQ2hhcmxlcyBDb3VudHkKKzk5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOlN0LiBDbGFpciBDb3VudHkKKzEwMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpTdC4gRnJhbmNvaXMgQ291bnR5CisxMDE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6U3QuIExvdWlzIENvdW50eQorMTAyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOlN0LiBMb3VpcyBjaXR5CisxMDM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6U3RlLiBHZW5ldmlldmUgQ291bnR5CisxMDQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6U3RvZGRhcmQgQ291bnR5CisxMDU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6U3RvbmUgQ291bnR5CisxMDY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6U3VsbGl2YW4gQ291bnR5CisxMDc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6VGFuZXkgQ291bnR5CisxMDg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6VGV4YXMgQ291bnR5CisxMDk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6VmVybm9uIENvdW50eQorMTEwOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOldhcnJlbiBDb3VudHkKKzExMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTT1VSSTpXYXNoaW5ndG9uIENvdW50eQorMTEyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOldheW5lIENvdW50eQorMTEzOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NPVVJJOldlYnN0ZXIgQ291bnR5CisxMTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6V29ydGggQ291bnR5CisxMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU09VUkk6V3JpZ2h0IENvdW50eQorMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkFkYW1zIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkFsbGVuIENvdW50eQorMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkJhcnRob2xvbWV3IENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkJlbnRvbiBDb3VudHkKKzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpCbGFja2ZvcmQgQ291bnR5Cis2OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6Qm9vbmUgQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6QnJvd24gQ291bnR5Cis4OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6Q2Fycm9sbCBDb3VudHkKKzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpDYXNzIENvdW50eQorMTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpDbGFyayBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6Q2xheSBDb3VudHkKKzEyOlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6Q2xpbnRvbiBDb3VudHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6Q3Jhd2ZvcmQgQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkRhdmllc3MgQ291bnR5CisxNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkRlS2FsYiBDb3VudHkKKzE2OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6RGVhcmJvcm4gQ291bnR5CisxNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkRlY2F0dXIgQ291bnR5CisxODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkRlbGF3YXJlIENvdW50eQorMTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpEdWJvaXMgQ291bnR5CisyMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkVsa2hhcnQgQ291bnR5CisyMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkZheWV0dGUgQ291bnR5CisyMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkZsb3lkIENvdW50eQorMjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpGb3VudGFpbiBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6RnJhbmtsaW4gQ291bnR5CisyNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkZ1bHRvbiBDb3VudHkKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6R2lic29uIENvdW50eQorMjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpHcmFudCBDb3VudHkKKzI4OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6R3JlZW5lIENvdW50eQorMjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpIYW1pbHRvbiBDb3VudHkKKzMwOlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6SGFuY29jayBDb3VudHkKKzMxOlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6SGFycmlzb24gQ291bnR5CiszMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkhlbmRyaWNrcyBDb3VudHkKKzMzOlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6SGVucnkgQ291bnR5CiszNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkhvd2FyZCBDb3VudHkKKzM1OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6SHVudGluZ3RvbiBDb3VudHkKKzM2OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6SmFja3NvbiBDb3VudHkKKzM3OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6SmFzcGVyIENvdW50eQorMzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpKYXkgQ291bnR5CiszOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkplZmZlcnNvbiBDb3VudHkKKzQwOlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6SmVubmluZ3MgQ291bnR5Cis0MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkpvaG5zb24gQ291bnR5Cis0MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOktub3ggQ291bnR5Cis0MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOktvc2NpdXNrbyBDb3VudHkKKzQ0OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6TGFHcmFuZ2UgQ291bnR5Cis0NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkxhUG9ydGUgQ291bnR5Cis0NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkxha2UgQ291bnR5Cis0NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOkxhd3JlbmNlIENvdW50eQorNDg6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpNYWRpc29uIENvdW50eQorNDk6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpNYXJpb24gQ291bnR5Cis1MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOk1hcnNoYWxsIENvdW50eQorNTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpNYXJ0aW4gQ291bnR5Cis1MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOk1pYW1pIENvdW50eQorNTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpNb25yb2UgQ291bnR5Cis1NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOk1vbnRnb21lcnkgQ291bnR5Cis1NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOk1vcmdhbiBDb3VudHkKKzU2OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6TmV3dG9uIENvdW50eQorNTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpOb2JsZSBDb3VudHkKKzU4OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6T2hpbyBDb3VudHkKKzU5OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6T3JhbmdlIENvdW50eQorNjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpPd2VuIENvdW50eQorNjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpQYXJrZSBDb3VudHkKKzYyOlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6UGVycnkgQ291bnR5Cis2MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOlBpa2UgQ291bnR5Cis2NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOlBvcnRlciBDb3VudHkKKzY1OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6UG9zZXkgQ291bnR5Cis2NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOlB1bGFza2kgQ291bnR5Cis2NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOlB1dG5hbSBDb3VudHkKKzY4OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6UmFuZG9scGggQ291bnR5Cis2OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOlJpcGxleSBDb3VudHkKKzcwOlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6UnVzaCBDb3VudHkKKzcxOlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6U2NvdHQgQ291bnR5Cis3MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOlNoZWxieSBDb3VudHkKKzczOlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6U3BlbmNlciBDb3VudHkKKzc0OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6U3QuIEpvc2VwaCBDb3VudHkKKzc1OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6U3RhcmtlIENvdW50eQorNzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpTdGV1YmVuIENvdW50eQorNzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpTdWxsaXZhbiBDb3VudHkKKzc4OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6U3dpdHplcmxhbmQgQ291bnR5Cis3OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOlRpcHBlY2Fub2UgQ291bnR5Cis4MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOlRpcHRvbiBDb3VudHkKKzgxOlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6VW5pb24gQ291bnR5Cis4MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOlZhbmRlcmJ1cmdoIENvdW50eQorODM6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpWZXJtaWxsaW9uIENvdW50eQorODQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpWaWdvIENvdW50eQorODU6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpXYWJhc2ggQ291bnR5Cis4NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOldhcnJlbiBDb3VudHkKKzg3OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6V2FycmljayBDb3VudHkKKzg4OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6V2FzaGluZ3RvbiBDb3VudHkKKzg5OlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6V2F5bmUgQ291bnR5Cis5MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpJTkRJQU5BOldlbGxzIENvdW50eQorOTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6SU5ESUFOQTpXaGl0ZSBDb3VudHkKKzkyOlVTOlVTQTpVTklURUQgU1RBVEVTOklORElBTkE6V2hpdGxleSBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0FTSElOR1RPTjpBZGFtcyBDb3VudHkKKzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0FTSElOR1RPTjpBc290aW4gQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOldBU0hJTkdUT046QmVudG9uIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXQVNISU5HVE9OOkNoZWxhbiBDb3VudHkKKzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0FTSElOR1RPTjpDbGFsbGFtIENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXQVNISU5HVE9OOkNsYXJrIENvdW50eQorNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXQVNISU5HVE9OOkNvbHVtYmlhIENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXQVNISU5HVE9OOkNvd2xpdHogQ291bnR5Cis5OlVTOlVTQTpVTklURUQgU1RBVEVTOldBU0hJTkdUT046RG91Z2xhcyBDb3VudHkKKzEwOlVTOlVTQTpVTklURUQgU1RBVEVTOldBU0hJTkdUT046RmVycnkgQ291bnR5CisxMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXQVNISU5HVE9OOkZyYW5rbGluIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0FTSElOR1RPTjpHYXJmaWVsZCBDb3VudHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOldBU0hJTkdUT046R3JhbnQgQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXQVNISU5HVE9OOkdyYXlzIEhhcmJvciBDb3VudHkKKzE1OlVTOlVTQTpVTklURUQgU1RBVEVTOldBU0hJTkdUT046SXNsYW5kIENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0FTSElOR1RPTjpKZWZmZXJzb24gQ291bnR5CisxNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXQVNISU5HVE9OOktpbmcgQ291bnR5CisxODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXQVNISU5HVE9OOktpdHNhcCBDb3VudHkKKzE5OlVTOlVTQTpVTklURUQgU1RBVEVTOldBU0hJTkdUT046S2l0dGl0YXMgQ291bnR5CisyMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXQVNISU5HVE9OOktsaWNraXRhdCBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOldBU0hJTkdUT046TGV3aXMgQ291bnR5CisyMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXQVNISU5HVE9OOkxpbmNvbG4gQ291bnR5CisyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXQVNISU5HVE9OOk1hc29uIENvdW50eQorMjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0FTSElOR1RPTjpPa2Fub2dhbiBDb3VudHkKKzI1OlVTOlVTQTpVTklURUQgU1RBVEVTOldBU0hJTkdUT046UGFjaWZpYyBDb3VudHkKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOldBU0hJTkdUT046UGVuZCBPcmVpbGxlIENvdW50eQorMjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0FTSElOR1RPTjpQaWVyY2UgQ291bnR5CisyODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXQVNISU5HVE9OOlNhbiBKdWFuIENvdW50eQorMjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0FTSElOR1RPTjpTa2FnaXQgQ291bnR5CiszMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXQVNISU5HVE9OOlNrYW1hbmlhIENvdW50eQorMzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0FTSElOR1RPTjpTbm9ob21pc2ggQ291bnR5CiszMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXQVNISU5HVE9OOlNwb2thbmUgQ291bnR5CiszMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXQVNISU5HVE9OOlN0ZXZlbnMgQ291bnR5CiszNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXQVNISU5HVE9OOlRodXJzdG9uIENvdW50eQorMzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0FTSElOR1RPTjpXYWhraWFrdW0gQ291bnR5CiszNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXQVNISU5HVE9OOldhbGxhIFdhbGxhIENvdW50eQorMzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0FTSElOR1RPTjpXaGF0Y29tIENvdW50eQorMzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0FTSElOR1RPTjpXaGl0bWFuIENvdW50eQorMzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0FTSElOR1RPTjpZYWtpbWEgQ291bnR5CisxOlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOkFya2Fuc2FzIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpBc2hsZXkgQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOkJheHRlciBDb3VudHkKKzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6QmVudG9uIENvdW50eQorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpCb29uZSBDb3VudHkKKzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6QnJhZGxleSBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6Q2FsaG91biBDb3VudHkKKzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6Q2Fycm9sbCBDb3VudHkKKzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6Q2hpY290IENvdW50eQorMTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6Q2xhcmsgQ291bnR5CisxMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpDbGF5IENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6Q2xlYnVybmUgQ291bnR5CisxMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpDbGV2ZWxhbmQgQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpDb2x1bWJpYSBDb3VudHkKKzE1OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOkNvbndheSBDb3VudHkKKzE2OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOkNyYWlnaGVhZCBDb3VudHkKKzE3OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOkNyYXdmb3JkIENvdW50eQorMTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6Q3JpdHRlbmRlbiBDb3VudHkKKzE5OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOkNyb3NzIENvdW50eQorMjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6RGFsbGFzIENvdW50eQorMjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6RGVzaGEgQ291bnR5CisyMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpEcmV3IENvdW50eQorMjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6RmF1bGtuZXIgQ291bnR5CisyNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpGcmFua2xpbiBDb3VudHkKKzI1OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOkZ1bHRvbiBDb3VudHkKKzI2OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOkdhcmxhbmQgQ291bnR5CisyNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpHcmFudCBDb3VudHkKKzI4OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOkdyZWVuZSBDb3VudHkKKzI5OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOkhlbXBzdGVhZCBDb3VudHkKKzMwOlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOkhvdCBTcHJpbmcgQ291bnR5CiszMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpIb3dhcmQgQ291bnR5CiszMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpJbmRlcGVuZGVuY2UgQ291bnR5CiszMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpJemFyZCBDb3VudHkKKzM0OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOkphY2tzb24gQ291bnR5CiszNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpKZWZmZXJzb24gQ291bnR5CiszNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpKb2huc29uIENvdW50eQorMzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6TGFmYXlldHRlIENvdW50eQorMzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6TGF3cmVuY2UgQ291bnR5CiszOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpMZWUgQ291bnR5Cis0MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpMaW5jb2xuIENvdW50eQorNDE6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6TGl0dGxlIFJpdmVyIENvdW50eQorNDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6TG9nYW4gQ291bnR5Cis0MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpMb25va2UgQ291bnR5Cis0NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpNYWRpc29uIENvdW50eQorNDU6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6TWFyaW9uIENvdW50eQorNDY6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6TWlsbGVyIENvdW50eQorNDc6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6TWlzc2lzc2lwcGkgQ291bnR5Cis0ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpNb25yb2UgQ291bnR5Cis0OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpNb250Z29tZXJ5IENvdW50eQorNTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6TmV2YWRhIENvdW50eQorNTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6TmV3dG9uIENvdW50eQorNTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6T3VhY2hpdGEgQ291bnR5Cis1MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpQZXJyeSBDb3VudHkKKzU0OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOlBoaWxsaXBzIENvdW50eQorNTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6UGlrZSBDb3VudHkKKzU2OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOlBvaW5zZXR0IENvdW50eQorNTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6UG9sayBDb3VudHkKKzU4OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOlBvcGUgQ291bnR5Cis1OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpQcmFpcmllIENvdW50eQorNjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6UHVsYXNraSBDb3VudHkKKzYxOlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOlJhbmRvbHBoIENvdW50eQorNjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6U2FsaW5lIENvdW50eQorNjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6U2NvdHQgQ291bnR5Cis2NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpTZWFyY3kgQ291bnR5Cis2NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpTZWJhc3RpYW4gQ291bnR5Cis2NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpTZXZpZXIgQ291bnR5Cis2NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpTaGFycCBDb3VudHkKKzY4OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOlN0LiBGcmFuY2lzIENvdW50eQorNjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6U3RvbmUgQ291bnR5Cis3MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpVbmlvbiBDb3VudHkKKzcxOlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOlZhbiBCdXJlbiBDb3VudHkKKzcyOlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOldhc2hpbmd0b24gQ291bnR5Cis3MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUktBTlNBUzpXaGl0ZSBDb3VudHkKKzc0OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSS0FOU0FTOldvb2RydWZmIENvdW50eQorNzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJLQU5TQVM6WWVsbCBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6REVMQVdBUkU6S2VudCBDb3VudHkKKzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6REVMQVdBUkU6TmV3IENhc3RsZSBDb3VudHkKKzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6REVMQVdBUkU6U3Vzc2V4IENvdW50eQorMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpSSE9ERSBJU0xBTkQ6QnJpc3RvbCBDb3VudHkKKzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6UkhPREUgSVNMQU5EOktlbnQgQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOlJIT0RFIElTTEFORDpOZXdwb3J0IENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpSSE9ERSBJU0xBTkQ6UHJvdmlkZW5jZSBDb3VudHkKKzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6UkhPREUgSVNMQU5EOldhc2hpbmd0b24gQ291bnR5CisxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1BU1NBQ0hVU0VUVFM6QmFybnN0YWJsZSBDb3VudHkKKzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFTU0FDSFVTRVRUUzpCZXJrc2hpcmUgQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOk1BU1NBQ0hVU0VUVFM6QnJpc3RvbCBDb3VudHkKKzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFTU0FDSFVTRVRUUzpEdWtlcyBDb3VudHkKKzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFTU0FDSFVTRVRUUzpFc3NleCBDb3VudHkKKzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFTU0FDSFVTRVRUUzpGcmFua2xpbiBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFTU0FDSFVTRVRUUzpIYW1wZGVuIENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQVNTQUNIVVNFVFRTOkhhbXBzaGlyZSBDb3VudHkKKzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUFTU0FDSFVTRVRUUzpNaWRkbGVzZXggQ291bnR5CisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQVNTQUNIVVNFVFRTOk5hbnR1Y2tldCBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOk1BU1NBQ0hVU0VUVFM6Tm9yZm9sayBDb3VudHkKKzEyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1BU1NBQ0hVU0VUVFM6UGx5bW91dGggQ291bnR5CisxMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQVNTQUNIVVNFVFRTOlN1ZmZvbGsgQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNQVNTQUNIVVNFVFRTOldvcmNlc3RlciBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6T1JFR09OOkJha2VyIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPUkVHT046QmVudG9uIENvdW50eQorMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPUkVHT046Q2xhY2thbWFzIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPUkVHT046Q2xhdHNvcCBDb3VudHkKKzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6T1JFR09OOkNvbHVtYmlhIENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPUkVHT046Q29vcyBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6T1JFR09OOkNyb29rIENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPUkVHT046Q3VycnkgQ291bnR5Cis5OlVTOlVTQTpVTklURUQgU1RBVEVTOk9SRUdPTjpEZXNjaHV0ZXMgQ291bnR5CisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPUkVHT046RG91Z2xhcyBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOk9SRUdPTjpHaWxsaWFtIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6T1JFR09OOkdyYW50IENvdW50eQorMTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6T1JFR09OOkhhcm5leSBDb3VudHkKKzE0OlVTOlVTQTpVTklURUQgU1RBVEVTOk9SRUdPTjpIb29kIFJpdmVyIENvdW50eQorMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6T1JFR09OOkphY2tzb24gQ291bnR5CisxNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPUkVHT046SmVmZmVyc29uIENvdW50eQorMTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6T1JFR09OOkpvc2VwaGluZSBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOk9SRUdPTjpLbGFtYXRoIENvdW50eQorMTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6T1JFR09OOkxha2UgQ291bnR5CisyMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPUkVHT046TGFuZSBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOk9SRUdPTjpMaW5jb2xuIENvdW50eQorMjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6T1JFR09OOkxpbm4gQ291bnR5CisyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPUkVHT046TWFsaGV1ciBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOk9SRUdPTjpNYXJpb24gQ291bnR5CisyNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPUkVHT046TW9ycm93IENvdW50eQorMjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6T1JFR09OOk11bHRub21haCBDb3VudHkKKzI3OlVTOlVTQTpVTklURUQgU1RBVEVTOk9SRUdPTjpQb2xrIENvdW50eQorMjg6VVM6VVNBOlVOSVRFRCBTVEFURVM6T1JFR09OOlNoZXJtYW4gQ291bnR5CisyOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPUkVHT046VGlsbGFtb29rIENvdW50eQorMzA6VVM6VVNBOlVOSVRFRCBTVEFURVM6T1JFR09OOlVtYXRpbGxhIENvdW50eQorMzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6T1JFR09OOlVuaW9uIENvdW50eQorMzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6T1JFR09OOldhbGxvd2EgQ291bnR5CiszMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPUkVHT046V2FzY28gQ291bnR5CiszNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPUkVHT046V2FzaGluZ3RvbiBDb3VudHkKKzM1OlVTOlVTQTpVTklURUQgU1RBVEVTOk9SRUdPTjpXaGVlbGVyIENvdW50eQorMzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6T1JFR09OOllhbWhpbGwgQ291bnR5CisxOlVTOlVTQTpVTklURUQgU1RBVEVTOkFSSVpPTkE6QXBhY2hlIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUklaT05BOkNvY2hpc2UgQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOkFSSVpPTkE6Q29jb25pbm8gQ291bnR5Cis0OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSSVpPTkE6R2lsYSBDb3VudHkKKzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJJWk9OQTpHcmFoYW0gQ291bnR5Cis2OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSSVpPTkE6R3JlZW5sZWUgQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSSVpPTkE6TGEgUGF6IENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUklaT05BOk1hcmljb3BhIENvdW50eQorOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpBUklaT05BOk1vaGF2ZSBDb3VudHkKKzEwOlVTOlVTQTpVTklURUQgU1RBVEVTOkFSSVpPTkE6TmF2YWpvIENvdW50eQorMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJJWk9OQTpQaW1hIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6QVJJWk9OQTpQaW5hbCBDb3VudHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOkFSSVpPTkE6U2FudGEgQ3J1eiBDb3VudHkKKzE0OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSSVpPTkE6WWF2YXBhaSBDb3VudHkKKzE1OlVTOlVTQTpVTklURUQgU1RBVEVTOkFSSVpPTkE6WXVtYSBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6SEFXQUlJOkhhd2FpaSBDb3VudHkKKzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6SEFXQUlJOkhvbm9sdWx1IENvdW50eQorMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpIQVdBSUk6S2FsYXdhbyBDb3VudHkKKzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6SEFXQUlJOkthdWFpIENvdW50eQorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpIQVdBSUk6TWF1aSBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6VkVSTU9OVDpBZGRpc29uIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWRVJNT05UOkJlbm5pbmd0b24gQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOlZFUk1PTlQ6Q2FsZWRvbmlhIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWRVJNT05UOkNoaXR0ZW5kZW4gQ291bnR5Cis1OlVTOlVTQTpVTklURUQgU1RBVEVTOlZFUk1PTlQ6RXNzZXggQ291bnR5Cis2OlVTOlVTQTpVTklURUQgU1RBVEVTOlZFUk1PTlQ6RnJhbmtsaW4gQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOlZFUk1PTlQ6R3JhbmQgSXNsZSBDb3VudHkKKzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6VkVSTU9OVDpMYW1vaWxsZSBDb3VudHkKKzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6VkVSTU9OVDpPcmFuZ2UgQ291bnR5CisxMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWRVJNT05UOk9ybGVhbnMgQ291bnR5CisxMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWRVJNT05UOlJ1dGxhbmQgQ291bnR5CisxMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWRVJNT05UOldhc2hpbmd0b24gQ291bnR5CisxMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWRVJNT05UOldpbmRoYW0gQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpWRVJNT05UOldpbmRzb3IgQ291bnR5CisxOlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86QWRhbXMgQ291bnR5CisyOlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86QWxsZW4gQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86QXNobGFuZCBDb3VudHkKKzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpBc2h0YWJ1bGEgQ291bnR5Cis1OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86QXRoZW5zIENvdW50eQorNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOkF1Z2xhaXplIENvdW50eQorNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOkJlbG1vbnQgQ291bnR5Cis4OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86QnJvd24gQ291bnR5Cis5OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86QnV0bGVyIENvdW50eQorMTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpDYXJyb2xsIENvdW50eQorMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpDaGFtcGFpZ24gQ291bnR5CisxMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOkNsYXJrIENvdW50eQorMTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpDbGVybW9udCBDb3VudHkKKzE0OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86Q2xpbnRvbiBDb3VudHkKKzE1OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86Q29sdW1iaWFuYSBDb3VudHkKKzE2OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86Q29zaG9jdG9uIENvdW50eQorMTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpDcmF3Zm9yZCBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86Q3V5YWhvZ2EgQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOkRhcmtlIENvdW50eQorMjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpEZWZpYW5jZSBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86RGVsYXdhcmUgQ291bnR5CisyMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOkVyaWUgQ291bnR5CisyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOkZhaXJmaWVsZCBDb3VudHkKKzI0OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86RmF5ZXR0ZSBDb3VudHkKKzI1OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86RnJhbmtsaW4gQ291bnR5CisyNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOkZ1bHRvbiBDb3VudHkKKzI3OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86R2FsbGlhIENvdW50eQorMjg6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpHZWF1Z2EgQ291bnR5CisyOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOkdyZWVuZSBDb3VudHkKKzMwOlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86R3Vlcm5zZXkgQ291bnR5CiszMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOkhhbWlsdG9uIENvdW50eQorMzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpIYW5jb2NrIENvdW50eQorMzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpIYXJkaW4gQ291bnR5CiszNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOkhhcnJpc29uIENvdW50eQorMzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpIZW5yeSBDb3VudHkKKzM2OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86SGlnaGxhbmQgQ291bnR5CiszNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOkhvY2tpbmcgQ291bnR5CiszODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOkhvbG1lcyBDb3VudHkKKzM5OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86SHVyb24gQ291bnR5Cis0MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOkphY2tzb24gQ291bnR5Cis0MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOkplZmZlcnNvbiBDb3VudHkKKzQyOlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86S25veCBDb3VudHkKKzQzOlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86TGFrZSBDb3VudHkKKzQ0OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86TGF3cmVuY2UgQ291bnR5Cis0NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOkxpY2tpbmcgQ291bnR5Cis0NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOkxvZ2FuIENvdW50eQorNDc6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpMb3JhaW4gQ291bnR5Cis0ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOkx1Y2FzIENvdW50eQorNDk6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpNYWRpc29uIENvdW50eQorNTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpNYWhvbmluZyBDb3VudHkKKzUxOlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86TWFyaW9uIENvdW50eQorNTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpNZWRpbmEgQ291bnR5Cis1MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOk1laWdzIENvdW50eQorNTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpNZXJjZXIgQ291bnR5Cis1NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOk1pYW1pIENvdW50eQorNTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpNb25yb2UgQ291bnR5Cis1NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOk1vbnRnb21lcnkgQ291bnR5Cis1ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOk1vcmdhbiBDb3VudHkKKzU5OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86TW9ycm93IENvdW50eQorNjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpNdXNraW5ndW0gQ291bnR5Cis2MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOk5vYmxlIENvdW50eQorNjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpPdHRhd2EgQ291bnR5Cis2MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOlBhdWxkaW5nIENvdW50eQorNjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpQZXJyeSBDb3VudHkKKzY1OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86UGlja2F3YXkgQ291bnR5Cis2NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOlBpa2UgQ291bnR5Cis2NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOlBvcnRhZ2UgQ291bnR5Cis2ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOlByZWJsZSBDb3VudHkKKzY5OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86UHV0bmFtIENvdW50eQorNzA6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpSaWNobGFuZCBDb3VudHkKKzcxOlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86Um9zcyBDb3VudHkKKzcyOlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86U2FuZHVza3kgQ291bnR5Cis3MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOlNjaW90byBDb3VudHkKKzc0OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86U2VuZWNhIENvdW50eQorNzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpTaGVsYnkgQ291bnR5Cis3NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOlN0YXJrIENvdW50eQorNzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpTdW1taXQgQ291bnR5Cis3ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOlRydW1idWxsIENvdW50eQorNzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpUdXNjYXJhd2FzIENvdW50eQorODA6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpVbmlvbiBDb3VudHkKKzgxOlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86VmFuIFdlcnQgQ291bnR5Cis4MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOlZpbnRvbiBDb3VudHkKKzgzOlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86V2FycmVuIENvdW50eQorODQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpXYXNoaW5ndG9uIENvdW50eQorODU6VVM6VVNBOlVOSVRFRCBTVEFURVM6T0hJTzpXYXluZSBDb3VudHkKKzg2OlVTOlVTQTpVTklURUQgU1RBVEVTOk9ISU86V2lsbGlhbXMgQ291bnR5Cis4NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOldvb2QgQ291bnR5Cis4ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpPSElPOld5YW5kb3QgQ291bnR5CisxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOkFkYW1zIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpBbGNvcm4gQ291bnR5CiszOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOkFtaXRlIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpBdHRhbGEgQ291bnR5Cis1OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOkJlbnRvbiBDb3VudHkKKzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6Qm9saXZhciBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6Q2FsaG91biBDb3VudHkKKzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6Q2Fycm9sbCBDb3VudHkKKzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6Q2hpY2thc2F3IENvdW50eQorMTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6Q2hvY3RhdyBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOkNsYWlib3JuZSBDb3VudHkKKzEyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOkNsYXJrZSBDb3VudHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOkNsYXkgQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpDb2Fob21hIENvdW50eQorMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6Q29waWFoIENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6Q292aW5ndG9uIENvdW50eQorMTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6RGVTb3RvIENvdW50eQorMTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6Rm9ycmVzdCBDb3VudHkKKzE5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOkZyYW5rbGluIENvdW50eQorMjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6R2VvcmdlIENvdW50eQorMjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6R3JlZW5lIENvdW50eQorMjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6R3JlbmFkYSBDb3VudHkKKzIzOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOkhhbmNvY2sgQ291bnR5CisyNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpIYXJyaXNvbiBDb3VudHkKKzI1OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOkhpbmRzIENvdW50eQorMjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6SG9sbWVzIENvdW50eQorMjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6SHVtcGhyZXlzIENvdW50eQorMjg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6SXNzYXF1ZW5hIENvdW50eQorMjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6SXRhd2FtYmEgQ291bnR5CiszMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpKYWNrc29uIENvdW50eQorMzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6SmFzcGVyIENvdW50eQorMzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6SmVmZmVyc29uIENvdW50eQorMzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6SmVmZmVyc29uIERhdmlzIENvdW50eQorMzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6Sm9uZXMgQ291bnR5CiszNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpLZW1wZXIgQ291bnR5CiszNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpMYWZheWV0dGUgQ291bnR5CiszNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpMYW1hciBDb3VudHkKKzM4OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOkxhdWRlcmRhbGUgQ291bnR5CiszOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpMYXdyZW5jZSBDb3VudHkKKzQwOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOkxlYWtlIENvdW50eQorNDE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6TGVlIENvdW50eQorNDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6TGVmbG9yZSBDb3VudHkKKzQzOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOkxpbmNvbG4gQ291bnR5Cis0NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpMb3duZGVzIENvdW50eQorNDU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6TWFkaXNvbiBDb3VudHkKKzQ2OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOk1hcmlvbiBDb3VudHkKKzQ3OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOk1hcnNoYWxsIENvdW50eQorNDg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6TW9ucm9lIENvdW50eQorNDk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6TW9udGdvbWVyeSBDb3VudHkKKzUwOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOk5lc2hvYmEgQ291bnR5Cis1MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpOZXd0b24gQ291bnR5Cis1MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpOb3h1YmVlIENvdW50eQorNTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6T2t0aWJiZWhhIENvdW50eQorNTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6UGFub2xhIENvdW50eQorNTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6UGVhcmwgUml2ZXIgQ291bnR5Cis1NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpQZXJyeSBDb3VudHkKKzU3OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOlBpa2UgQ291bnR5Cis1ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpQb250b3RvYyBDb3VudHkKKzU5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOlByZW50aXNzIENvdW50eQorNjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6UXVpdG1hbiBDb3VudHkKKzYxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOlJhbmtpbiBDb3VudHkKKzYyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOlNjb3R0IENvdW50eQorNjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6U2hhcmtleSBDb3VudHkKKzY0OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOlNpbXBzb24gQ291bnR5Cis2NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpTbWl0aCBDb3VudHkKKzY2OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOlN0b25lIENvdW50eQorNjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6U3VuZmxvd2VyIENvdW50eQorNjg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6VGFsbGFoYXRjaGllIENvdW50eQorNjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6VGF0ZSBDb3VudHkKKzcwOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOlRpcHBhaCBDb3VudHkKKzcxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOlRpc2hvbWluZ28gQ291bnR5Cis3MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpUdW5pY2EgQ291bnR5Cis3MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpVbmlvbiBDb3VudHkKKzc0OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOldhbHRoYWxsIENvdW50eQorNzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6V2FycmVuIENvdW50eQorNzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6V2FzaGluZ3RvbiBDb3VudHkKKzc3OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOldheW5lIENvdW50eQorNzg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlTU0lTU0lQUEk6V2Vic3RlciBDb3VudHkKKzc5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOldpbGtpbnNvbiBDb3VudHkKKzgwOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JU1NJU1NJUFBJOldpbnN0b24gQ291bnR5Cis4MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpZYWxvYnVzaGEgQ291bnR5Cis4MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSVNTSVNTSVBQSTpZYXpvbyBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6RElTVFJJQ1QgT0YgQ09MVU1CSUE6RGlzdHJpY3Qgb2YgQ29sdW1iaWEKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46QWxjb25hIENvdW50eQorMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpBbGdlciBDb3VudHkKKzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46QWxsZWdhbiBDb3VudHkKKzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46QWxwZW5hIENvdW50eQorNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpBbnRyaW0gQ291bnR5Cis2OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOkFyZW5hYyBDb3VudHkKKzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46QmFyYWdhIENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpCYXJyeSBDb3VudHkKKzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46QmF5IENvdW50eQorMTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46QmVuemllIENvdW50eQorMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46QmVycmllbiBDb3VudHkKKzEyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOkJyYW5jaCBDb3VudHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOkNhbGhvdW4gQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpDYXNzIENvdW50eQorMTU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46Q2hhcmxldm9peCBDb3VudHkKKzE2OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOkNoZWJveWdhbiBDb3VudHkKKzE3OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOkNoaXBwZXdhIENvdW50eQorMTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46Q2xhcmUgQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpDbGludG9uIENvdW50eQorMjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46Q3Jhd2ZvcmQgQ291bnR5CisyMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpEZWx0YSBDb3VudHkKKzIyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOkRpY2tpbnNvbiBDb3VudHkKKzIzOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOkVhdG9uIENvdW50eQorMjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46RW1tZXQgQ291bnR5CisyNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpHZW5lc2VlIENvdW50eQorMjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46R2xhZHdpbiBDb3VudHkKKzI3OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOkdvZ2ViaWMgQ291bnR5CisyODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpHcmFuZCBUcmF2ZXJzZSBDb3VudHkKKzI5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOkdyYXRpb3QgQ291bnR5CiszMDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpIaWxsc2RhbGUgQ291bnR5CiszMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpIb3VnaHRvbiBDb3VudHkKKzMyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOkh1cm9uIENvdW50eQorMzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46SW5naGFtIENvdW50eQorMzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46SW9uaWEgQ291bnR5CiszNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpJb3NjbyBDb3VudHkKKzM2OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOklyb24gQ291bnR5CiszNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpJc2FiZWxsYSBDb3VudHkKKzM4OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOkphY2tzb24gQ291bnR5CiszOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpLYWxhbWF6b28gQ291bnR5Cis0MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpLYWxrYXNrYSBDb3VudHkKKzQxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOktlbnQgQ291bnR5Cis0MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpLZXdlZW5hdyBDb3VudHkKKzQzOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOkxha2UgQ291bnR5Cis0NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpMYXBlZXIgQ291bnR5Cis0NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpMZWVsYW5hdSBDb3VudHkKKzQ2OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOkxlbmF3ZWUgQ291bnR5Cis0NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpMaXZpbmdzdG9uIENvdW50eQorNDg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46THVjZSBDb3VudHkKKzQ5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOk1hY2tpbmFjIENvdW50eQorNTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46TWFjb21iIENvdW50eQorNTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46TWFuaXN0ZWUgQ291bnR5Cis1MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpNYXJxdWV0dGUgQ291bnR5Cis1MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpNYXNvbiBDb3VudHkKKzU0OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOk1lY29zdGEgQ291bnR5Cis1NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpNZW5vbWluZWUgQ291bnR5Cis1NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpNaWRsYW5kIENvdW50eQorNTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46TWlzc2F1a2VlIENvdW50eQorNTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46TW9ucm9lIENvdW50eQorNTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46TW9udGNhbG0gQ291bnR5Cis2MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpNb250bW9yZW5jeSBDb3VudHkKKzYxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOk11c2tlZ29uIENvdW50eQorNjI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46TmV3YXlnbyBDb3VudHkKKzYzOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOk9ha2xhbmQgQ291bnR5Cis2NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpPY2VhbmEgQ291bnR5Cis2NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpPZ2VtYXcgQ291bnR5Cis2NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpPbnRvbmFnb24gQ291bnR5Cis2NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpPc2Nlb2xhIENvdW50eQorNjg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46T3Njb2RhIENvdW50eQorNjk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46T3RzZWdvIENvdW50eQorNzA6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46T3R0YXdhIENvdW50eQorNzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46UHJlc3F1ZSBJc2xlIENvdW50eQorNzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46Um9zY29tbW9uIENvdW50eQorNzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46U2FnaW5hdyBDb3VudHkKKzc0OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOlNhbmlsYWMgQ291bnR5Cis3NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpTY2hvb2xjcmFmdCBDb3VudHkKKzc2OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOlNoaWF3YXNzZWUgQ291bnR5Cis3NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpTdC4gQ2xhaXIgQ291bnR5Cis3ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSUNISUdBTjpTdC4gSm9zZXBoIENvdW50eQorNzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46VHVzY29sYSBDb3VudHkKKzgwOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOlZhbiBCdXJlbiBDb3VudHkKKzgxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOldhc2h0ZW5hdyBDb3VudHkKKzgyOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JQ0hJR0FOOldheW5lIENvdW50eQorODM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlDSElHQU46V2V4Zm9yZCBDb3VudHkKKzE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOkFpdGtpbiBDb3VudHkKKzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOkFub2thIENvdW50eQorMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6QmVja2VyIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6QmVsdHJhbWkgQ291bnR5Cis1OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpCZW50b24gQ291bnR5Cis2OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpCaWcgU3RvbmUgQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpCbHVlIEVhcnRoIENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6QnJvd24gQ291bnR5Cis5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpDYXJsdG9uIENvdW50eQorMTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOkNhcnZlciBDb3VudHkKKzExOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpDYXNzIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOkNoaXBwZXdhIENvdW50eQorMTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOkNoaXNhZ28gQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6Q2xheSBDb3VudHkKKzE1OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpDbGVhcndhdGVyIENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOkNvb2sgQ291bnR5CisxNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6Q290dG9ud29vZCBDb3VudHkKKzE4OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpDcm93IFdpbmcgQ291bnR5CisxOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6RGFrb3RhIENvdW50eQorMjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOkRvZGdlIENvdW50eQorMjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOkRvdWdsYXMgQ291bnR5CisyMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6RmFyaWJhdWx0IENvdW50eQorMjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOkZpbGxtb3JlIENvdW50eQorMjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOkZyZWVib3JuIENvdW50eQorMjU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOkdvb2RodWUgQ291bnR5CisyNjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6R3JhbnQgQ291bnR5CisyNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6SGVubmVwaW4gQ291bnR5CisyODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6SG91c3RvbiBDb3VudHkKKzI5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpIdWJiYXJkIENvdW50eQorMzA6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOklzYW50aSBDb3VudHkKKzMxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpJdGFzY2EgQ291bnR5CiszMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6SmFja3NvbiBDb3VudHkKKzMzOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpLYW5hYmVjIENvdW50eQorMzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOkthbmRpeW9oaSBDb3VudHkKKzM1OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpLaXR0c29uIENvdW50eQorMzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOktvb2NoaWNoaW5nIENvdW50eQorMzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOkxhYyBxdWkgUGFybGUgQ291bnR5CiszODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6TGFrZSBDb3VudHkKKzM5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpMYWtlIG9mIHRoZSBXb29kcyBDb3VudHkKKzQwOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpMZSBTdWV1ciBDb3VudHkKKzQxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpMaW5jb2xuIENvdW50eQorNDI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOkx5b24gQ291bnR5Cis0MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6TWFobm9tZW4gQ291bnR5Cis0NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6TWFyc2hhbGwgQ291bnR5Cis0NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6TWFydGluIENvdW50eQorNDY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOk1jTGVvZCBDb3VudHkKKzQ3OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpNZWVrZXIgQ291bnR5Cis0ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6TWlsbGUgTGFjcyBDb3VudHkKKzQ5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpNb3JyaXNvbiBDb3VudHkKKzUwOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpNb3dlciBDb3VudHkKKzUxOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpNdXJyYXkgQ291bnR5Cis1MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6Tmljb2xsZXQgQ291bnR5Cis1MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6Tm9ibGVzIENvdW50eQorNTQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOk5vcm1hbiBDb3VudHkKKzU1OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpPbG1zdGVkIENvdW50eQorNTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOk90dGVyIFRhaWwgQ291bnR5Cis1NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6UGVubmluZ3RvbiBDb3VudHkKKzU4OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpQaW5lIENvdW50eQorNTk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOlBpcGVzdG9uZSBDb3VudHkKKzYwOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpQb2xrIENvdW50eQorNjE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOlBvcGUgQ291bnR5Cis2MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6UmFtc2V5IENvdW50eQorNjM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOlJlZCBMYWtlIENvdW50eQorNjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOlJlZHdvb2QgQ291bnR5Cis2NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6UmVudmlsbGUgQ291bnR5Cis2NjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6UmljZSBDb3VudHkKKzY3OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpSb2NrIENvdW50eQorNjg6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOlJvc2VhdSBDb3VudHkKKzY5OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpTY290dCBDb3VudHkKKzcwOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpTaGVyYnVybmUgQ291bnR5Cis3MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6U2libGV5IENvdW50eQorNzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOlN0LiBMb3VpcyBDb3VudHkKKzczOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpTdGVhcm5zIENvdW50eQorNzQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOlN0ZWVsZSBDb3VudHkKKzc1OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpTdGV2ZW5zIENvdW50eQorNzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOlN3aWZ0IENvdW50eQorNzc6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOlRvZGQgQ291bnR5Cis3ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6VHJhdmVyc2UgQ291bnR5Cis3OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6V2FiYXNoYSBDb3VudHkKKzgwOlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpXYWRlbmEgQ291bnR5Cis4MTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6V2FzZWNhIENvdW50eQorODI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOldhc2hpbmd0b24gQ291bnR5Cis4MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6V2F0b253YW4gQ291bnR5Cis4NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6V2lsa2luIENvdW50eQorODU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TUlOTkVTT1RBOldpbm9uYSBDb3VudHkKKzg2OlVTOlVTQTpVTklURUQgU1RBVEVTOk1JTk5FU09UQTpXcmlnaHQgQ291bnR5Cis4NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpNSU5ORVNPVEE6WWVsbG93IE1lZGljaW5lIENvdW50eQorMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVZBREE6Q2Fyc29uIENpdHkKKzI6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVWQURBOkNodXJjaGlsbCBDb3VudHkKKzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVWQURBOkNsYXJrIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVZBREE6RG91Z2xhcyBDb3VudHkKKzU6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVWQURBOkVsa28gQ291bnR5Cis2OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVkFEQTpFc21lcmFsZGEgQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVkFEQTpFdXJla2EgQ291bnR5Cis4OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVkFEQTpIdW1ib2xkdCBDb3VudHkKKzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVWQURBOkxhbmRlciBDb3VudHkKKzEwOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVkFEQTpMaW5jb2xuIENvdW50eQorMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVWQURBOkx5b24gQ291bnR5CisxMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVZBREE6TWluZXJhbCBDb3VudHkKKzEzOlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVkFEQTpOeWUgQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVZBREE6UGVyc2hpbmcgQ291bnR5CisxNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpORVZBREE6U3RvcmV5IENvdW50eQorMTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6TkVWQURBOldhc2hvZSBDb3VudHkKKzE3OlVTOlVTQTpVTklURUQgU1RBVEVTOk5FVkFEQTpXaGl0ZSBQaW5lIENvdW50eQorMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46QWRhbXMgQ291bnR5CisyOlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpBc2hsYW5kIENvdW50eQorMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46QmFycm9uIENvdW50eQorNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46QmF5ZmllbGQgQ291bnR5Cis1OlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpCcm93biBDb3VudHkKKzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOkJ1ZmZhbG8gQ291bnR5Cis3OlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpCdXJuZXR0IENvdW50eQorODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46Q2FsdW1ldCBDb3VudHkKKzk6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOkNoaXBwZXdhIENvdW50eQorMTA6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOkNsYXJrIENvdW50eQorMTE6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOkNvbHVtYmlhIENvdW50eQorMTI6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOkNyYXdmb3JkIENvdW50eQorMTM6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOkRhbmUgQ291bnR5CisxNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46RG9kZ2UgQ291bnR5CisxNTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46RG9vciBDb3VudHkKKzE2OlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpEb3VnbGFzIENvdW50eQorMTc6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOkR1bm4gQ291bnR5CisxODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46RWF1IENsYWlyZSBDb3VudHkKKzE5OlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpGbG9yZW5jZSBDb3VudHkKKzIwOlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpGb25kIGR1IExhYyBDb3VudHkKKzIxOlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpGb3Jlc3QgQ291bnR5CisyMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46R3JhbnQgQ291bnR5CisyMzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46R3JlZW4gQ291bnR5CisyNDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46R3JlZW4gTGFrZSBDb3VudHkKKzI1OlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpJb3dhIENvdW50eQorMjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOklyb24gQ291bnR5CisyNzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46SmFja3NvbiBDb3VudHkKKzI4OlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpKZWZmZXJzb24gQ291bnR5CisyOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46SnVuZWF1IENvdW50eQorMzA6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOktlbm9zaGEgQ291bnR5CiszMTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46S2V3YXVuZWUgQ291bnR5CiszMjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46TGEgQ3Jvc3NlIENvdW50eQorMzM6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOkxhZmF5ZXR0ZSBDb3VudHkKKzM0OlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpMYW5nbGFkZSBDb3VudHkKKzM1OlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpMaW5jb2xuIENvdW50eQorMzY6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOk1hbml0b3dvYyBDb3VudHkKKzM3OlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpNYXJhdGhvbiBDb3VudHkKKzM4OlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpNYXJpbmV0dGUgQ291bnR5CiszOTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46TWFycXVldHRlIENvdW50eQorNDA6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOk1lbm9taW5lZSBDb3VudHkKKzQxOlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpNaWx3YXVrZWUgQ291bnR5Cis0MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46TW9ucm9lIENvdW50eQorNDM6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOk9jb250byBDb3VudHkKKzQ0OlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpPbmVpZGEgQ291bnR5Cis0NTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46T3V0YWdhbWllIENvdW50eQorNDY6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOk96YXVrZWUgQ291bnR5Cis0NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46UGVwaW4gQ291bnR5Cis0ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46UGllcmNlIENvdW50eQorNDk6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOlBvbGsgQ291bnR5Cis1MDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46UG9ydGFnZSBDb3VudHkKKzUxOlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpQcmljZSBDb3VudHkKKzUyOlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpSYWNpbmUgQ291bnR5Cis1MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46UmljaGxhbmQgQ291bnR5Cis1NDpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46Um9jayBDb3VudHkKKzU1OlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpSdXNrIENvdW50eQorNTY6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOlNhdWsgQ291bnR5Cis1NzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46U2F3eWVyIENvdW50eQorNTg6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOlNoYXdhbm8gQ291bnR5Cis1OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46U2hlYm95Z2FuIENvdW50eQorNjA6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOlN0LiBDcm9peCBDb3VudHkKKzYxOlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpUYXlsb3IgQ291bnR5Cis2MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46VHJlbXBlYWxlYXUgQ291bnR5Cis2MzpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46VmVybm9uIENvdW50eQorNjQ6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOlZpbGFzIENvdW50eQorNjU6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOldhbHdvcnRoIENvdW50eQorNjY6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOldhc2hidXJuIENvdW50eQorNjc6VVM6VVNBOlVOSVRFRCBTVEFURVM6V0lTQ09OU0lOOldhc2hpbmd0b24gQ291bnR5Cis2ODpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46V2F1a2VzaGEgQ291bnR5Cis2OTpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46V2F1cGFjYSBDb3VudHkKKzcwOlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpXYXVzaGFyYSBDb3VudHkKKzcxOlVTOlVTQTpVTklURUQgU1RBVEVTOldJU0NPTlNJTjpXaW5uZWJhZ28gQ291bnR5Cis3MjpVUzpVU0E6VU5JVEVEIFNUQVRFUzpXSVNDT05TSU46V29vZCBDb3VudHkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVVpCL1VaQl9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVVpCL1VaQl9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2E0ODBjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9VWkIvVVpCX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMTUgQEAKKzE6VVotQU46VVo6QU5ESVpIQU4KKzI6VVotQVM6VVo6QVJBTCBTRUEKKzM6VVotQlU6VVo6QlVLSEFSQQorNDpVWi1GQTpVWjpGRVJHQU5BCis1OlVaLUpJOlVaOkpJWlpBWAorNjpVWi1RUjpVWjpLQVJBS0FMUEFLIFtRT1JBUUFMUE9HkUlTVE9OIFJFU1BVQkxJS0FTSV0KKzc6VVotUUE6VVo6S0FTSEtBREFSWUEgW1FBU0hRQURBUllPXQorODpVWi1YTzpVWjpLSE9SRVpNIFtYT1JBWk1dCis5OlVaLU5HOlVaOk5BTUFOR0FOCisxMDpVWi1OVzpVWjpOQVZPSVkKKzExOlVaLVNBOlVaOlNBTUFSS0FORCBbU0FNQVJRQU5EXQorMTI6VVotU1U6VVo6U1VSS0hBTkRBUllBIFtTVVJYT05EQVJZT10KKzEzOlVaLVNJOlVaOlNZUkRBUllBIFtTSVJEQVJZT10KKzE0OlVaLVRPOlVaOlRBU0hLRU5UIE9CTEFTVCBbVE9TSEtFTlRdCisxNTpVWi1USzpVWjpUT1NIS0VOVApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9VWkIvVVpCX0FETUlOMl9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9VWkIvVVpCX0FETUlOMl9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjMwNmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1VaQi9VWkJfQURNSU4yX0xFWC50eHQKQEAgLTAsMCArMSw0OCBAQAorMTpVWjpVWkI6VVpCRUtJU1RBTjpTYW1hcmthbmQ6VVpCLkwyLjQKKzE6VVo6VVpCOlVaQkVLSVNUQU46S2FyYWthbHBhazpVWkIuTDIuNQorMTpVWjpVWkI6VVpCRUtJU1RBTjpTdXJraGFuZGFyeWE6VVpCLkwyLjMKKzE6VVo6VVpCOlVaQkVLSVNUQU46QXJhbCBTZWE6VVpCLkwyLjEwCisyOlVaOlVaQjpVWkJFS0lTVEFOOkFyYWwgU2VhOlVaQi5MMi4xMQorMzpVWjpVWkI6VVpCRUtJU1RBTjpBcmFsIFNlYTpVWkIuTDIuMTIKKzQ6VVo6VVpCOlVaQkVLSVNUQU46QXJhbCBTZWE6VVpCLkwyLjEzCis1OlVaOlVaQjpVWkJFS0lTVEFOOkFyYWwgU2VhOlVaQi5MMi4xNAorNjpVWjpVWkI6VVpCRUtJU1RBTjpBcmFsIFNlYTpVWkIuTDIuMTUKKzc6VVo6VVpCOlVaQkVLSVNUQU46QXJhbCBTZWE6VVpCLkwyLjE2Cis4OlVaOlVaQjpVWkJFS0lTVEFOOkFyYWwgU2VhOlVaQi5MMi4xNworOTpVWjpVWkI6VVpCRUtJU1RBTjpBcmFsIFNlYTpVWkIuTDIuMTgKKzEwOlVaOlVaQjpVWkJFS0lTVEFOOkFyYWwgU2VhOlVaQi5MMi4xOQorMTE6VVo6VVpCOlVaQkVLSVNUQU46QXJhbCBTZWE6VVpCLkwyLjIwCisxMjpVWjpVWkI6VVpCRUtJU1RBTjpBcmFsIFNlYTpVWkIuTDIuMjEKKzEzOlVaOlVaQjpVWkJFS0lTVEFOOkFyYWwgU2VhOlVaQi5MMi4yMgorMTQ6VVo6VVpCOlVaQkVLSVNUQU46QXJhbCBTZWE6VVpCLkwyLjIzCisxNTpVWjpVWkI6VVpCRUtJU1RBTjpBcmFsIFNlYTpVWkIuTDIuMjQKKzE2OlVaOlVaQjpVWkJFS0lTVEFOOkFyYWwgU2VhOlVaQi5MMi4yNQorMTc6VVo6VVpCOlVaQkVLSVNUQU46QXJhbCBTZWE6VVpCLkwyLjI2CisxODpVWjpVWkI6VVpCRUtJU1RBTjpBcmFsIFNlYTpVWkIuTDIuMjcKKzE5OlVaOlVaQjpVWkJFS0lTVEFOOkFyYWwgU2VhOlVaQi5MMi4yOAorMjA6VVo6VVpCOlVaQkVLSVNUQU46QXJhbCBTZWE6VVpCLkwyLjI5CisyMTpVWjpVWkI6VVpCRUtJU1RBTjpBcmFsIFNlYTpVWkIuTDIuMzAKKzIyOlVaOlVaQjpVWkJFS0lTVEFOOkFyYWwgU2VhOlVaQi5MMi4zMQorMjM6VVo6VVpCOlVaQkVLSVNUQU46QXJhbCBTZWE6VVpCLkwyLjMyCisyNDpVWjpVWkI6VVpCRUtJU1RBTjpBcmFsIFNlYTpVWkIuTDIuMzMKKzI1OlVaOlVaQjpVWkJFS0lTVEFOOkFyYWwgU2VhOlVaQi5MMi4zNAorMjY6VVo6VVpCOlVaQkVLSVNUQU46QXJhbCBTZWE6VVpCLkwyLjM1CisyNzpVWjpVWkI6VVpCRUtJU1RBTjpBcmFsIFNlYTpVWkIuTDIuMzYKKzI4OlVaOlVaQjpVWkJFS0lTVEFOOkFyYWwgU2VhOlVaQi5MMi4zNworMjk6VVo6VVpCOlVaQkVLSVNUQU46QXJhbCBTZWE6VVpCLkwyLjM4CiszMDpVWjpVWkI6VVpCRUtJU1RBTjpBcmFsIFNlYTpVWkIuTDIuMzkKKzMxOlVaOlVaQjpVWkJFS0lTVEFOOkFyYWwgU2VhOlVaQi5MMi40MAorMzI6VVo6VVpCOlVaQkVLSVNUQU46QXJhbCBTZWE6VVpCLkwyLjQxCiszMzpVWjpVWkI6VVpCRUtJU1RBTjpBcmFsIFNlYTpVWkIuTDIuNDIKKzM0OlVaOlVaQjpVWkJFS0lTVEFOOkFyYWwgU2VhOlVaQi5MMi40MworMzU6VVo6VVpCOlVaQkVLSVNUQU46QXJhbCBTZWE6VVpCLkwyLjcKKzM2OlVaOlVaQjpVWkJFS0lTVEFOOkFyYWwgU2VhOlVaQi5MMi44CiszNzpVWjpVWkI6VVpCRUtJU1RBTjpBcmFsIFNlYTpVWkIuTDIuOQorMTpVWjpVWkI6VVpCRUtJU1RBTjpBbmRpemhhbjpVWkIuTDIuNDQKKzE6VVo6VVpCOlVaQkVLSVNUQU46RmVyZ2FuYTpVWkIuTDIuMQorMTpVWjpVWkI6VVpCRUtJU1RBTjpUYXNoa2VudCBPYmxhc3Q6VVpCLkwyLjQ1CisxOlVaOlVaQjpVWkJFS0lTVEFOOkJ1a2hhcmE6VVpCLkwyLjQ4CisxOlVaOlVaQjpVWkJFS0lTVEFOOkthc2hrYWRhcnlhOlVaQi5MMi4yCisxOlVaOlVaQjpVWkJFS0lTVEFOOktob3Jlem06VVpCLkwyLjQ3CisxOlVaOlVaQjpVWkJFS0lTVEFOOk5hbWFuZ2FuOlVaQi5MMi42CisxOlVaOlVaQjpVWkJFS0lTVEFOOlN5cmRhcnlhOlVaQi5MMi40NgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9WRU4vVkVOX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9WRU4vVkVOX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MjM2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1ZFTi9WRU5fQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwyNSBAQAorMTpWRS1aOlZFOkFNQVpPTkFTCisyOlZFLUI6VkU6QU5aT0FURUdVSQorMzpWRS1DOlZFOkFQVVJFCis0OlZFLUQ6VkU6QVJBR1VBCis1OlZFLUU6VkU6QkFSSU5BUworNjpWRS1GOlZFOkJPTElWQVIKKzc6VkUtRzpWRTpDQVJBQk9CTworODpWRS1IOlZFOkNPSkVERVMKKzk6VkUtWTpWRTpERUxUQSBBTUFDVVJPCisxMDpWRS1XOlZFOkRFUEVOREVOQ0lBUyBGRURFUkFMRVMKKzExOlZFLUE6VkU6RElTVFJJVE8gRkVERVJBTAorMTI6VkUtSTpWRTpGQUxDT04KKzEzOlZFLUo6VkU6R1VBUklDTworMTQ6VkUtSzpWRTpMQVJBCisxNTpWRS1MOlZFOk1FUklEQQorMTY6VkUtTTpWRTpNSVJBTkRBCisxNzpWRS1OOlZFOk1PTkFHQVMKKzE4OlZFLU86VkU6TlVFVkEgRVNQQVJUQQorMTk6VkUtUDpWRTpQT1JUVUdVRVNBCisyMDpWRS1SOlZFOlNVQ1JFCisyMTpWRS1TOlZFOlRBQ0hJUkEKKzIyOlZFLVQ6VkU6VFJVSklMTE8KKzIzOlZFLVg6VkU6VkFSR0FTCisyNDpWRS1VOlZFOllBUkFDVVkKKzI1OlZFLVY6VkU6WlVMSUEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVkVOL1ZFTl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVkVOL1ZFTl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTE0ODcwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9WRU4vVkVOX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMzAxIEBACisxOlZFOlZFTjpWRU5FWlVFTEE6VU5LTk9XTjpJc2xhCisyOlZFOlZFTjpWRU5FWlVFTEE6VU5LTk9XTjpJc2xhIExhIFRvcnR1Z2EKKzM6VkU6VkVOOlZFTkVaVUVMQTpVTktOT1dOOlJpbyBPcmlub2NvCisxOlZFOlZFTjpWRU5FWlVFTEE6Qk9MSVZBUjpDYXJvbmkKKzI6VkU6VkVOOlZFTkVaVUVMQTpCT0xJVkFSOkNlZGVubworMzpWRTpWRU46VkVORVpVRUxBOkJPTElWQVI6RWwgQ2FsbGFvCis0OlZFOlZFTjpWRU5FWlVFTEE6Qk9MSVZBUjpHcmFuIFNhYmFuYQorNTpWRTpWRU46VkVORVpVRUxBOkJPTElWQVI6SGVyZXMKKzY6VkU6VkVOOlZFTkVaVUVMQTpCT0xJVkFSOlBpYXIKKzc6VkU6VkVOOlZFTkVaVUVMQTpCT0xJVkFSOlJhdWwgTGVvbmkKKzg6VkU6VkVOOlZFTkVaVUVMQTpCT0xJVkFSOlJvc2NpbworOTpWRTpWRU46VkVORVpVRUxBOkJPTElWQVI6U2lmb250ZXMKKzEwOlZFOlZFTjpWRU5FWlVFTEE6Qk9MSVZBUjpTdWNyZQorMTpWRTpWRU46VkVORVpVRUxBOkxBUkE6QW5kcmVzIEVsb3kgQmxhbmNvCisyOlZFOlZFTjpWRU5FWlVFTEE6TEFSQTpDcmVzcG8KKzM6VkU6VkVOOlZFTkVaVUVMQTpMQVJBOklyaWJhcnJlbgorNDpWRTpWRU46VkVORVpVRUxBOkxBUkE6SmltZW5legorNTpWRTpWRU46VkVORVpVRUxBOkxBUkE6TW9yYW4KKzY6VkU6VkVOOlZFTkVaVUVMQTpMQVJBOlBhbGF2ZWNpbm8KKzc6VkU6VkVOOlZFTkVaVUVMQTpMQVJBOlNpbW9uIFBsYW5hcworODpWRTpWRU46VkVORVpVRUxBOkxBUkE6VG9ycmVzCis5OlZFOlZFTjpWRU5FWlVFTEE6TEFSQTpVcmRhbmV0YQorMTpWRTpWRU46VkVORVpVRUxBOkFNQVpPTkFTOkQuIEF0YWJhcG8KKzI6VkU6VkVOOlZFTkVaVUVMQTpBTUFaT05BUzpELiBBdHVyZXMKKzM6VkU6VkVOOlZFTkVaVUVMQTpBTUFaT05BUzpELiBDYXNpcXVpYXJlCis0OlZFOlZFTjpWRU5FWlVFTEE6QU1BWk9OQVM6RC4gUmlvIE5lZ3JvCisxOlZFOlZFTjpWRU5FWlVFTEE6TlVFVkEgRVNQQVJUQTpBbnRvbGluIGRlbCBDYW1pCisyOlZFOlZFTjpWRU5FWlVFTEE6TlVFVkEgRVNQQVJUQTpBcmlzbWVuZGkKKzM6VkU6VkVOOlZFTkVaVUVMQTpOVUVWQSBFU1BBUlRBOkRpYXoKKzQ6VkU6VkVOOlZFTkVaVUVMQTpOVUVWQSBFU1BBUlRBOkdhcmNpYQorNTpWRTpWRU46VkVORVpVRUxBOk5VRVZBIEVTUEFSVEE6R29tZXoKKzY6VkU6VkVOOlZFTkVaVUVMQTpOVUVWQSBFU1BBUlRBOklzbGEgRGUgQ29jaGUKKzc6VkU6VkVOOlZFTkVaVUVMQTpOVUVWQSBFU1BBUlRBOklzbGEgRGUgQ3ViYWd1YQorODpWRTpWRU46VkVORVpVRUxBOk5VRVZBIEVTUEFSVEE6TWFuZWlybworOTpWRTpWRU46VkVORVpVRUxBOk5VRVZBIEVTUEFSVEE6TWFyY2FubworMTA6VkU6VkVOOlZFTkVaVUVMQTpOVUVWQSBFU1BBUlRBOk1hcmlubworMTE6VkU6VkVOOlZFTkVaVUVMQTpOVUVWQSBFU1BBUlRBOlBlbmluc3VsYSBkZSBNYWNhbmFvCisxOlZFOlZFTjpWRU5FWlVFTEE6QVJBR1VBOkJvbGl2YXIKKzI6VkU6VkVOOlZFTkVaVUVMQTpBUkFHVUE6Q2FtYXRhZ3VhCiszOlZFOlZFTjpWRU5FWlVFTEE6QVJBR1VBOkdpcmFyZG90Cis0OlZFOlZFTjpWRU5FWlVFTEE6QVJBR1VBOkpvc2UgQW5nZWwgTGFtYXMKKzU6VkU6VkVOOlZFTkVaVUVMQTpBUkFHVUE6Sm9zZSBGZWxpeCBSaWJhcworNjpWRTpWRU46VkVORVpVRUxBOkFSQUdVQTpMaWJlcnRhZG9yCis3OlZFOlZFTjpWRU5FWlVFTEE6QVJBR1VBOk1hcmlvIEJyaWNlbm8gSXJhZ29ycnkKKzg6VkU6VkVOOlZFTkVaVUVMQTpBUkFHVUE6U2FuIENhc2ltaXJvCis5OlZFOlZFTjpWRU5FWlVFTEE6QVJBR1VBOlNhbiBTZWJhc3RpYW4KKzEwOlZFOlZFTjpWRU5FWlVFTEE6QVJBR1VBOlNhbnRpYWdvIE1hcmlubworMTE6VkU6VkVOOlZFTkVaVUVMQTpBUkFHVUE6U2FudG9zIE1pY2hlbGVuYQorMTI6VkU6VkVOOlZFTkVaVUVMQTpBUkFHVUE6U3VjcmUKKzEzOlZFOlZFTjpWRU5FWlVFTEE6QVJBR1VBOlRvdmFyCisxNDpWRTpWRU46VkVORVpVRUxBOkFSQUdVQTpVcmRhbmV0YQorMTU6VkU6VkVOOlZFTkVaVUVMQTpBUkFHVUE6WmFtb3JhCisxOlZFOlZFTjpWRU5FWlVFTEE6UE9SVFVHVUVTQTpBZ3VhIEJsYW5jYQorMjpWRTpWRU46VkVORVpVRUxBOlBPUlRVR1VFU0E6QXJhdXJlCiszOlZFOlZFTjpWRU5FWlVFTEE6UE9SVFVHVUVTQTpFc3RlbGxlcgorNDpWRTpWRU46VkVORVpVRUxBOlBPUlRVR1VFU0E6R3VhbmFyZQorNTpWRTpWRU46VkVORVpVRUxBOlBPUlRVR1VFU0E6R3VhbmFyaXRvCis2OlZFOlZFTjpWRU5FWlVFTEE6UE9SVFVHVUVTQTpNb25zZW5vciBKb3NlIFZpY2VudGUgZGUKKzc6VkU6VkVOOlZFTkVaVUVMQTpQT1JUVUdVRVNBOk9zcGlubworODpWRTpWRU46VkVORVpVRUxBOlBPUlRVR1VFU0E6UGFlegorOTpWRTpWRU46VkVORVpVRUxBOlBPUlRVR1VFU0E6UGFwZWxvbgorMTA6VkU6VkVOOlZFTkVaVUVMQTpQT1JUVUdVRVNBOlNhbiBHZW5hcm8gZGUgQm9jb25vaXRvCisxMTpWRTpWRU46VkVORVpVRUxBOlBPUlRVR1VFU0E6U2FuIFJhZmFlbCBkZSBPbm90bworMTI6VkU6VkVOOlZFTkVaVUVMQTpQT1JUVUdVRVNBOlNhbnRhIFJvc2FsaWEKKzEzOlZFOlZFTjpWRU5FWlVFTEE6UE9SVFVHVUVTQTpTdWNyZQorMTQ6VkU6VkVOOlZFTkVaVUVMQTpQT1JUVUdVRVNBOlR1cmVuCisxOlZFOlZFTjpWRU5FWlVFTEE6U1VDUkU6QW5kcmVzIEVsb3kgQmxhbmNvCisyOlZFOlZFTjpWRU5FWlVFTEE6U1VDUkU6QW5kcmVzIE1hdGEKKzM6VkU6VkVOOlZFTkVaVUVMQTpTVUNSRTpBcmlzbWVuZGkKKzQ6VkU6VkVOOlZFTkVaVUVMQTpTVUNSRTpCZW5pdGV6Cis1OlZFOlZFTjpWRU5FWlVFTEE6U1VDUkU6QmVybXVkZXoKKzY6VkU6VkVOOlZFTkVaVUVMQTpTVUNSRTpCb2xpdmFyCis3OlZFOlZFTjpWRU5FWlVFTEE6U1VDUkU6Q2FqaWdhbAorODpWRTpWRU46VkVORVpVRUxBOlNVQ1JFOkNydXogU2FsbWVyb24gQWNvc3RhCis5OlZFOlZFTjpWRU5FWlVFTEE6U1VDUkU6SXNsYQorMTA6VkU6VkVOOlZFTkVaVUVMQTpTVUNSRTpMaWJlcnRhZG9yCisxMTpWRTpWRU46VkVORVpVRUxBOlNVQ1JFOk1hcmlubworMTI6VkU6VkVOOlZFTkVaVUVMQTpTVUNSRTpNZWppYQorMTM6VkU6VkVOOlZFTkVaVUVMQTpTVUNSRTpNb250ZXMKKzE0OlZFOlZFTjpWRU5FWlVFTEE6U1VDUkU6UmliZXJvCisxNTpWRTpWRU46VkVORVpVRUxBOlNVQ1JFOlN1Y3JlCisxNjpWRTpWRU46VkVORVpVRUxBOlNVQ1JFOlZhbGRlegorMTpWRTpWRU46VkVORVpVRUxBOk1PTkFHQVM6QWNvc3RhCisyOlZFOlZFTjpWRU5FWlVFTEE6TU9OQUdBUzpCb2xpdmFyCiszOlZFOlZFTjpWRU5FWlVFTEE6TU9OQUdBUzpDYXJpcGUKKzQ6VkU6VkVOOlZFTkVaVUVMQTpNT05BR0FTOkNlZGVubworNTpWRTpWRU46VkVORVpVRUxBOk1PTkFHQVM6RXplcXVpZWwgWmFtb3JhCis2OlZFOlZFTjpWRU5FWlVFTEE6TU9OQUdBUzpMaWJlcnRhZG9yCis3OlZFOlZFTjpWRU5FWlVFTEE6TU9OQUdBUzpNYXR1cmluCis4OlZFOlZFTjpWRU5FWlVFTEE6TU9OQUdBUzpQaWFyCis5OlZFOlZFTjpWRU5FWlVFTEE6TU9OQUdBUzpQdW5jZXJlcworMTA6VkU6VkVOOlZFTkVaVUVMQTpNT05BR0FTOlNvdGlsbG8KKzE6VkU6VkVOOlZFTkVaVUVMQTpaVUxJQTpBbG1pcmFudGUgUGFkaWxsYQorMjpWRTpWRU46VkVORVpVRUxBOlpVTElBOkJhcmFsdAorMzpWRTpWRU46VkVORVpVRUxBOlpVTElBOkNhYmltYXMKKzQ6VkU6VkVOOlZFTkVaVUVMQTpaVUxJQTpDYXRhdHVtYm8KKzU6VkU6VkVOOlZFTkVaVUVMQTpaVUxJQTpDb2xvbgorNjpWRTpWRU46VkVORVpVRUxBOlpVTElBOklzbGEKKzc6VkU6VkVOOlZFTkVaVUVMQTpaVUxJQTpKZXN1cyBFbnJpcXVlIExvemFkYQorODpWRTpWRU46VkVORVpVRUxBOlpVTElBOkxhIENhbmFkYSBkZSBVcmRhbmV0YQorOTpWRTpWRU46VkVORVpVRUxBOlpVTElBOkxhZ3VuaWxsYXMKKzEwOlZFOlZFTjpWRU5FWlVFTEE6WlVMSUE6TWFjaGlxdWVzIGRlIFBlcmlqYQorMTE6VkU6VkVOOlZFTkVaVUVMQTpaVUxJQTpNYXJhCisxMjpWRTpWRU46VkVORVpVRUxBOlpVTElBOk1hcmFjYWlibworMTM6VkU6VkVOOlZFTkVaVUVMQTpaVUxJQTpNaXJhbmRhCisxNDpWRTpWRU46VkVORVpVRUxBOlpVTElBOlBhZXoKKzE1OlZFOlZFTjpWRU5FWlVFTEE6WlVMSUE6Um9zYXJpbyBkZSBQZXJpamEKKzE2OlZFOlZFTjpWRU5FWlVFTEE6WlVMSUE6U2FudGEgUml0YQorMTc6VkU6VkVOOlZFTkVaVUVMQTpaVUxJQTpTdWNyZQorMTg6VkU6VkVOOlZFTkVaVUVMQTpaVUxJQTpWYWxtb3JlIFJvZHJpZ3VlegorMTpWRTpWRU46VkVORVpVRUxBOllBUkFDVVk6QXV0b25vbW8gQm9saXZhcgorMjpWRTpWRU46VkVORVpVRUxBOllBUkFDVVk6QXV0b25vbW8gQnJ1enVhbAorMzpWRTpWRU46VkVORVpVRUxBOllBUkFDVVk6QXV0b25vbW8gSm9zZSBBbnRvbmlvIFBhZQorNDpWRTpWRU46VkVORVpVRUxBOllBUkFDVVk6QXV0b25vbW8gTmlyZ3VhCis1OlZFOlZFTjpWRU5FWlVFTEE6WUFSQUNVWTpBdXRvbm9tbyBQZW5hCis2OlZFOlZFTjpWRU5FWlVFTEE6WUFSQUNVWTpBdXRvbm9tbyBTYW4gRmVsaXBlCis3OlZFOlZFTjpWRU5FWlVFTEE6WUFSQUNVWTpBdXRvbm9tbyBTdWNyZQorODpWRTpWRU46VkVORVpVRUxBOllBUkFDVVk6QXV0b25vbW8gVXJhY2hpcXVlCisxOlZFOlZFTjpWRU5FWlVFTEE6VEFDSElSQTpBbmRyZXMgQmVsbG8KKzI6VkU6VkVOOlZFTkVaVUVMQTpUQUNISVJBOkF5YWN1Y2hvCiszOlZFOlZFTjpWRU5FWlVFTEE6VEFDSElSQTpCb2xpdmFyCis0OlZFOlZFTjpWRU5FWlVFTEE6VEFDSElSQTpDYXJkZW5hcworNTpWRTpWRU46VkVORVpVRUxBOlRBQ0hJUkE6Q29yZG9iYQorNjpWRTpWRU46VkVORVpVRUxBOlRBQ0hJUkE6RmVybmFuZGV6IEZlbworNzpWRTpWRU46VkVORVpVRUxBOlRBQ0hJUkE6R2FyY2lhIGRlIEhldmlhCis4OlZFOlZFTjpWRU5FWlVFTEE6VEFDSElSQTpHdWFzaW1vcworOTpWRTpWRU46VkVORVpVRUxBOlRBQ0hJUkE6SW5kZXBlbmRlbmNpYQorMTA6VkU6VkVOOlZFTkVaVUVMQTpUQUNISVJBOkphdXJlZ3VpCisxMTpWRTpWRU46VkVORVpVRUxBOlRBQ0hJUkE6SnVuaW4KKzEyOlZFOlZFTjpWRU5FWlVFTEE6VEFDSElSQTpMaWJlcnRhZAorMTM6VkU6VkVOOlZFTkVaVUVMQTpUQUNISVJBOkxpYmVydGFkb3IKKzE0OlZFOlZFTjpWRU5FWlVFTEE6VEFDSElSQTpMb2JhdGVyYQorMTU6VkU6VkVOOlZFTkVaVUVMQTpUQUNISVJBOk1pY2hlbGVuYQorMTY6VkU6VkVOOlZFTkVaVUVMQTpUQUNISVJBOlBhbmFtZXJpY2FubworMTc6VkU6VkVOOlZFTkVaVUVMQTpUQUNISVJBOlBlZHJvIE1hcmlhIFVyZW5hCisxODpWRTpWRU46VkVORVpVRUxBOlRBQ0hJUkE6U2FtdWVsIERhcmlvIE1hbGRvbmFkbworMTk6VkU6VkVOOlZFTkVaVUVMQTpUQUNISVJBOlNhbiBDcmlzdG9iYWwKKzIwOlZFOlZFTjpWRU5FWlVFTEE6VEFDSElSQTpTZWJvcnVjbworMjE6VkU6VkVOOlZFTkVaVUVMQTpUQUNISVJBOlN1Y3JlCisyMjpWRTpWRU46VkVORVpVRUxBOlRBQ0hJUkE6VXJpYmFudGUKKzE6VkU6VkVOOlZFTkVaVUVMQTpDT0pFREVTOkFuem9hdGVndWkKKzI6VkU6VkVOOlZFTkVaVUVMQTpDT0pFREVTOkZhbGNvbgorMzpWRTpWRU46VkVORVpVRUxBOkNPSkVERVM6R2lyYXJkb3QKKzQ6VkU6VkVOOlZFTkVaVUVMQTpDT0pFREVTOlBhbyBkZSBTYW4gSnVhbiBCYXV0aXN0YQorNTpWRTpWRU46VkVORVpVRUxBOkNPSkVERVM6UmljYXVydGUKKzY6VkU6VkVOOlZFTkVaVUVMQTpDT0pFREVTOlNhbiBDYXJsb3MKKzc6VkU6VkVOOlZFTkVaVUVMQTpDT0pFREVTOlRpbmFjbworMTpWRTpWRU46VkVORVpVRUxBOkRJU1RSSVRPIEZFREVSQUw6Q2FyYWNhcworMjpWRTpWRU46VkVORVpVRUxBOkRJU1RSSVRPIEZFREVSQUw6VmFyZ2FzCisxOlZFOlZFTjpWRU5FWlVFTEE6RkFMQ09OOkFjb3N0YQorMjpWRTpWRU46VkVORVpVRUxBOkZBTENPTjpCb2xpdmFyCiszOlZFOlZFTjpWRU5FWlVFTEE6RkFMQ09OOkJ1Y2hpdmFjb2EKKzQ6VkU6VkVOOlZFTkVaVUVMQTpGQUxDT046Q2FjaXF1ZSBNYW5hdXJlCis1OlZFOlZFTjpWRU5FWlVFTEE6RkFMQ09OOkNhcmlydWJhbmEKKzY6VkU6VkVOOlZFTkVaVUVMQTpGQUxDT046Q29saW5hCis3OlZFOlZFTjpWRU5FWlVFTEE6RkFMQ09OOkRhYmFqdXJvCis4OlZFOlZFTjpWRU5FWlVFTEE6RkFMQ09OOkRlbW9jcmFjaWEKKzk6VkU6VkVOOlZFTkVaVUVMQTpGQUxDT046RmFsY29uCisxMDpWRTpWRU46VkVORVpVRUxBOkZBTENPTjpGZWRlcmFjaW9uCisxMTpWRTpWRU46VkVORVpVRUxBOkZBTENPTjpJc2xhCisxMjpWRTpWRU46VkVORVpVRUxBOkZBTENPTjpKYWN1cmEKKzEzOlZFOlZFTjpWRU5FWlVFTEE6RkFMQ09OOkxvcyBUYW5xdWVzCisxNDpWRTpWRU46VkVORVpVRUxBOkZBTENPTjpNYXVyb2EKKzE1OlZFOlZFTjpWRU5FWlVFTEE6RkFMQ09OOk1pcmFuZGEKKzE2OlZFOlZFTjpWRU5FWlVFTEE6RkFMQ09OOk1vbnNlbm9yIEl0dXJyaXphCisxNzpWRTpWRU46VkVORVpVRUxBOkZBTENPTjpQYWxtYSBTb2xhCisxODpWRTpWRU46VkVORVpVRUxBOkZBTENPTjpQZXRpdAorMTk6VkU6VkVOOlZFTkVaVUVMQTpGQUxDT046UGlyaXR1CisyMDpWRTpWRU46VkVORVpVRUxBOkZBTENPTjpTYW4gRnJhbmNpc2NvCisyMTpWRTpWRU46VkVORVpVRUxBOkZBTENPTjpTaWx2YQorMjI6VkU6VkVOOlZFTkVaVUVMQTpGQUxDT046VW5pb24KKzIzOlZFOlZFTjpWRU5FWlVFTEE6RkFMQ09OOlphbW9yYQorMTpWRTpWRU46VkVORVpVRUxBOk1FUklEQTpBbGJlcnRvIEFkcmlhbmkKKzI6VkU6VkVOOlZFTkVaVUVMQTpNRVJJREE6QW5kcmVzIEJlbGxvCiszOlZFOlZFTjpWRU5FWlVFTEE6TUVSSURBOkFudG9uaW8gUGludG8gU2FsaW5hcworNDpWRTpWRU46VkVORVpVRUxBOk1FUklEQTpBcmljYWd1YQorNTpWRTpWRU46VkVORVpVRUxBOk1FUklEQTpBcnpvYmlzcG8gQ2hhY29uCis2OlZFOlZFTjpWRU5FWlVFTEE6TUVSSURBOkNhbXBvIEVsaWFzCis3OlZFOlZFTjpWRU5FWlVFTEE6TUVSSURBOkNhcmFjY2lvbG8gUGFycmEgT2xtZWRvCis4OlZFOlZFTjpWRU5FWlVFTEE6TUVSSURBOkNhcmRlbmFsIFF1aW50ZXJvCis5OlZFOlZFTjpWRU5FWlVFTEE6TUVSSURBOkd1YXJhcXVlCisxMDpWRTpWRU46VkVORVpVRUxBOk1FUklEQTpKdWxpbyBDZXNhciBTYWxhcworMTE6VkU6VkVOOlZFTkVaVUVMQTpNRVJJREE6SnVzdG8gQnJpY2VubworMTI6VkU6VkVOOlZFTkVaVUVMQTpNRVJJREE6TGliZXJ0YWRvcgorMTM6VkU6VkVOOlZFTkVaVUVMQTpNRVJJREE6TWlyYW5kYQorMTQ6VkU6VkVOOlZFTkVaVUVMQTpNRVJJREE6T2Jpc3BvIFJhbW9zIGRlIExvcmEKKzE1OlZFOlZFTjpWRU5FWlVFTEE6TUVSSURBOlBhZHJlIE5vZ3VlcmEKKzE2OlZFOlZFTjpWRU5FWlVFTEE6TUVSSURBOlB1ZWJsbyBMbGFubworMTc6VkU6VkVOOlZFTkVaVUVMQTpNRVJJREE6UmFuZ2VsCisxODpWRTpWRU46VkVORVpVRUxBOk1FUklEQTpSaXZhcyBEYXZpbGEKKzE5OlZFOlZFTjpWRU5FWlVFTEE6TUVSSURBOlNhbnRvcyBNYXJxdWluYQorMjA6VkU6VkVOOlZFTkVaVUVMQTpNRVJJREE6U3VjcmUKKzIxOlZFOlZFTjpWRU5FWlVFTEE6TUVSSURBOlRvdmFyCisyMjpWRTpWRU46VkVORVpVRUxBOk1FUklEQTpUdWxpbyBGZWJyZXMgQ29yZGVybworMjM6VkU6VkVOOlZFTkVaVUVMQTpNRVJJREE6WmVhCisxOlZFOlZFTjpWRU5FWlVFTEE6REVMVEEgQU1BQ1VSTzpELiBBbnRvbmlvIERpYXoKKzI6VkU6VkVOOlZFTkVaVUVMQTpERUxUQSBBTUFDVVJPOkQuIFBlZGVybmFsZXMKKzM6VkU6VkVOOlZFTkVaVUVMQTpERUxUQSBBTUFDVVJPOklzbGEKKzQ6VkU6VkVOOlZFTkVaVUVMQTpERUxUQSBBTUFDVVJPOlR1Y3VwaXRhCisxOlZFOlZFTjpWRU5FWlVFTEE6VFJVSklMTE86Qm9jb25vCisyOlZFOlZFTjpWRU5FWlVFTEE6VFJVSklMTE86Q2FuZGVsYXJpYQorMzpWRTpWRU46VkVORVpVRUxBOlRSVUpJTExPOkNhcmFjaGUKKzQ6VkU6VkVOOlZFTkVaVUVMQTpUUlVKSUxMTzpFc2N1cXVlCis1OlZFOlZFTjpWRU5FWlVFTEE6VFJVSklMTE86TWlyYW5kYQorNjpWRTpWRU46VkVORVpVRUxBOlRSVUpJTExPOk1vbnRlIENhcm1lbG8KKzc6VkU6VkVOOlZFTkVaVUVMQTpUUlVKSUxMTzpNb3RhdGFuCis4OlZFOlZFTjpWRU5FWlVFTEE6VFJVSklMTE86UGFtcGFuCis5OlZFOlZFTjpWRU5FWlVFTEE6VFJVSklMTE86UmFmYWVsIFJhbmdlbAorMTA6VkU6VkVOOlZFTkVaVUVMQTpUUlVKSUxMTzpTYW4gUmFmYWVsIGRlIENhcnZhamFsCisxMTpWRTpWRU46VkVORVpVRUxBOlRSVUpJTExPOlN1Y3JlCisxMjpWRTpWRU46VkVORVpVRUxBOlRSVUpJTExPOlRydWppbGxvCisxMzpWRTpWRU46VkVORVpVRUxBOlRSVUpJTExPOlVyZGFuZXRhCisxNDpWRTpWRU46VkVORVpVRUxBOlRSVUpJTExPOlZhbGVyYQorMTpWRTpWRU46VkVORVpVRUxBOkFQVVJFOkF1dG9ub21vIEFjaGFndWFzCisyOlZFOlZFTjpWRU5FWlVFTEE6QVBVUkU6QXV0b25vbW8gQmlydWFjYQorMzpWRTpWRU46VkVORVpVRUxBOkFQVVJFOkF1dG9ub21vIE11bm96Cis0OlZFOlZFTjpWRU5FWlVFTEE6QVBVUkU6QXV0b25vbW8gUGFlegorNTpWRTpWRU46VkVORVpVRUxBOkFQVVJFOkF1dG9ub21vIFBlZHJvIENhbWVqbworNjpWRTpWRU46VkVORVpVRUxBOkFQVVJFOkF1dG9ub21vIFJvbXVsbyBHYWxsZWdvcworNzpWRTpWRU46VkVORVpVRUxBOkFQVVJFOkF1dG9ub21vIFNhbiBGZXJuYW5kbworMTpWRTpWRU46VkVORVpVRUxBOk1JUkFOREE6QWNldmVkbworMjpWRTpWRU46VkVORVpVRUxBOk1JUkFOREE6QW5kcmVzIEJlbGxvCiszOlZFOlZFTjpWRU5FWlVFTEE6TUlSQU5EQTpCYXJ1dGEKKzQ6VkU6VkVOOlZFTkVaVUVMQTpNSVJBTkRBOkJyaW9uCis1OlZFOlZFTjpWRU5FWlVFTEE6TUlSQU5EQTpCdXJvegorNjpWRTpWRU46VkVORVpVRUxBOk1JUkFOREE6Q2Fycml6YWwKKzc6VkU6VkVOOlZFTkVaVUVMQTpNSVJBTkRBOkNoYWNhbworODpWRTpWRU46VkVORVpVRUxBOk1JUkFOREE6Q3Jpc3RvYmFsIFJvamFzCis5OlZFOlZFTjpWRU5FWlVFTEE6TUlSQU5EQTpFbCBIYXRpbGxvCisxMDpWRTpWRU46VkVORVpVRUxBOk1JUkFOREE6R3VhaWNhaXB1cm8KKzExOlZFOlZFTjpWRU5FWlVFTEE6TUlSQU5EQTpJbmRlcGVuZGVuY2lhCisxMjpWRTpWRU46VkVORVpVRUxBOk1JUkFOREE6SXNsYQorMTM6VkU6VkVOOlZFTkVaVUVMQTpNSVJBTkRBOkxhbmRlcgorMTQ6VkU6VkVOOlZFTkVaVUVMQTpNSVJBTkRBOkxvcyBTYWxpYXMKKzE1OlZFOlZFTjpWRU5FWlVFTEE6TUlSQU5EQTpQYWV6CisxNjpWRTpWRU46VkVORVpVRUxBOk1JUkFOREE6UGF6IENhc3RpbGxvCisxNzpWRTpWRU46VkVORVpVRUxBOk1JUkFOREE6UGVkcm8gR3VhbAorMTg6VkU6VkVOOlZFTkVaVUVMQTpNSVJBTkRBOlBsYXphCisxOTpWRTpWRU46VkVORVpVRUxBOk1JUkFOREE6U2ltb24gQm9saXZhcgorMjA6VkU6VkVOOlZFTkVaVUVMQTpNSVJBTkRBOlN1Y3JlCisyMTpWRTpWRU46VkVORVpVRUxBOk1JUkFOREE6VXJkYW5ldGEKKzIyOlZFOlZFTjpWRU5FWlVFTEE6TUlSQU5EQTpaYW1vcmEKKzE6VkU6VkVOOlZFTkVaVUVMQTpHVUFSSUNPOkNhbWFndWFuCisyOlZFOlZFTjpWRU5FWlVFTEE6R1VBUklDTzpDaGFndWFyYW1hcworMzpWRTpWRU46VkVORVpVRUxBOkdVQVJJQ086RWwgU29jb3JybworNDpWRTpWRU46VkVORVpVRUxBOkdVQVJJQ086R3VhY2hhcmFtYXMKKzU6VkU6VkVOOlZFTkVaVUVMQTpHVUFSSUNPOkluZmFudGUKKzY6VkU6VkVOOlZFTkVaVUVMQTpHVUFSSUNPOkxhcyBNZXJjZWRlcworNzpWRTpWRU46VkVORVpVRUxBOkdVQVJJQ086TWVsbGFkbworODpWRTpWRU46VkVORVpVRUxBOkdVQVJJQ086TWlyYW5kYQorOTpWRTpWRU46VkVORVpVRUxBOkdVQVJJQ086TW9uYWdhcworMTA6VkU6VkVOOlZFTkVaVUVMQTpHVUFSSUNPOk9ydGl6CisxMTpWRTpWRU46VkVORVpVRUxBOkdVQVJJQ086UmliYXMKKzEyOlZFOlZFTjpWRU5FWlVFTEE6R1VBUklDTzpSb3NjaW8KKzEzOlZFOlZFTjpWRU5FWlVFTEE6R1VBUklDTzpTYW4gSm9zZSBkZSBHdWFyaWJlCisxNDpWRTpWRU46VkVORVpVRUxBOkdVQVJJQ086U2FudGEgTWFyaWEgZGUgSXBpcmUKKzE1OlZFOlZFTjpWRU5FWlVFTEE6R1VBUklDTzpaYXJhemEKKzE6VkU6VkVOOlZFTkVaVUVMQTpBTlpPQVRFR1VJOkFuYWNvCisyOlZFOlZFTjpWRU5FWlVFTEE6QU5aT0FURUdVSTpBcmFndWEKKzM6VkU6VkVOOlZFTkVaVUVMQTpBTlpPQVRFR1VJOkJvbGl2YXIKKzQ6VkU6VkVOOlZFTkVaVUVMQTpBTlpPQVRFR1VJOkJydXp1YWwKKzU6VkU6VkVOOlZFTkVaVUVMQTpBTlpPQVRFR1VJOkNhamlnYWwKKzY6VkU6VkVOOlZFTkVaVUVMQTpBTlpPQVRFR1VJOkNhcnZhamFsCis3OlZFOlZFTjpWRU5FWlVFTEE6QU5aT0FURUdVSTpGcmVpdGVzCis4OlZFOlZFTjpWRU5FWlVFTEE6QU5aT0FURUdVSTpHdWFuaXBhCis5OlZFOlZFTjpWRU5FWlVFTEE6QU5aT0FURUdVSTpHdWFudGEKKzEwOlZFOlZFTjpWRU5FWlVFTEE6QU5aT0FURUdVSTpJLiBEZSBBZGVudHJvCisxMTpWRTpWRU46VkVORVpVRUxBOkFOWk9BVEVHVUk6SS4gZGUgQWZ1ZXJhCisxMjpWRTpWRU46VkVORVpVRUxBOkFOWk9BVEVHVUk6SW5kZXBlbmRlbmNpYQorMTM6VkU6VkVOOlZFTkVaVUVMQTpBTlpPQVRFR1VJOklzbGEKKzE0OlZFOlZFTjpWRU5FWlVFTEE6QU5aT0FURUdVSTpMaWJlcnRhZAorMTU6VkU6VkVOOlZFTkVaVUVMQTpBTlpPQVRFR1VJOkxpYy4gRGllZ28gQmF1dGlzdGEgVXJiYW4KKzE2OlZFOlZFTjpWRU5FWlVFTEE6QU5aT0FURUdVSTpNaXJhbmRhCisxNzpWRTpWRU46VkVORVpVRUxBOkFOWk9BVEVHVUk6TW9uYWdhcworMTg6VkU6VkVOOlZFTkVaVUVMQTpBTlpPQVRFR1VJOlBlbmFsdmVyCisxOTpWRTpWRU46VkVORVpVRUxBOkFOWk9BVEVHVUk6UGlyaXR1CisyMDpWRTpWRU46VkVORVpVRUxBOkFOWk9BVEVHVUk6U2ltb24gUm9kcmlndWV6CisyMTpWRTpWRU46VkVORVpVRUxBOkFOWk9BVEVHVUk6U290aWxsbworMTpWRTpWRU46VkVORVpVRUxBOkJBUklOQVM6QWxiZXJ0byBBcnZlbG8gVG9ycmVhbGJhCisyOlZFOlZFTjpWRU5FWlVFTEE6QkFSSU5BUzpBbnRvbmlvIEpvc2UgZGUgU3VjcmUKKzM6VkU6VkVOOlZFTkVaVUVMQTpCQVJJTkFTOkFyaXNtZW5kaQorNDpWRTpWRU46VkVORVpVRUxBOkJBUklOQVM6QmFyaW5hcworNTpWRTpWRU46VkVORVpVRUxBOkJBUklOQVM6Qm9saXZhcgorNjpWRTpWRU46VkVORVpVRUxBOkJBUklOQVM6Q3J1eiBQYXJlZGVzCis3OlZFOlZFTjpWRU5FWlVFTEE6QkFSSU5BUzpFemVxdWllbCBaYW1vcmEKKzg6VkU6VkVOOlZFTkVaVUVMQTpCQVJJTkFTOk9iaXNwb3MKKzk6VkU6VkVOOlZFTkVaVUVMQTpCQVJJTkFTOlBlZHJhemEKKzEwOlZFOlZFTjpWRU5FWlVFTEE6QkFSSU5BUzpSb2phcworMTE6VkU6VkVOOlZFTkVaVUVMQTpCQVJJTkFTOlNvc2EKKzE6VkU6VkVOOlZFTkVaVUVMQTpDQVJBQk9CTzpCZWp1bWEKKzI6VkU6VkVOOlZFTkVaVUVMQTpDQVJBQk9CTzpDYXJsb3MgQXJldmFsbworMzpWRTpWRU46VkVORVpVRUxBOkNBUkFCT0JPOkRpZWdvIEliYXJyYQorNDpWRTpWRU46VkVORVpVRUxBOkNBUkFCT0JPOkd1YWNhcmEKKzU6VkU6VkVOOlZFTkVaVUVMQTpDQVJBQk9CTzpJc2xhCis2OlZFOlZFTjpWRU5FWlVFTEE6Q0FSQUJPQk86SnVhbiBKb3NlIE1vcmEKKzc6VkU6VkVOOlZFTkVaVUVMQTpDQVJBQk9CTzpMYWdvIGRlIFZhbGVuY2lhCis4OlZFOlZFTjpWRU5FWlVFTEE6Q0FSQUJPQk86TWlyYW5kYQorOTpWRTpWRU46VkVORVpVRUxBOkNBUkFCT0JPOk1vbnRhbGJhbgorMTA6VkU6VkVOOlZFTkVaVUVMQTpDQVJBQk9CTzpQdWVydG8gQ2FiZWxsbworMTE6VkU6VkVOOlZFTkVaVUVMQTpDQVJBQk9CTzpTYW4gSm9hcXVpbgorMTI6VkU6VkVOOlZFTkVaVUVMQTpDQVJBQk9CTzpWYWxlbmNpYQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9WTk0vVk5NX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9WTk0vVk5NX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYTI0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1ZOTS9WTk1fQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSw2OCBAQAorMTpWTi00NDpWTjpBTiBHSUFORworMjpWTi00MzpWTjpCQSBSSUEgICBWVU5HIFRBVQorMzpWTi01MzpWTjpCQUMgQ0FOCis0OlZOLTU0OlZOOkJBQyBHSUFORworNTpWTi01NTpWTjpCQUMgTElFVQorNjpWTi01NjpWTjpCQUMgTklOSAorNzpWTi1CVEg6Vk46QkFDIFRIQUkKKzg6Vk4tNTA6Vk46QkVOIFRSRQorOTpWTi0zOlZOOkJJTkggRElOSAorMTA6Vk4tNTc6Vk46QklOSCBEVU9ORworMTE6Vk4tNTg6Vk46QklOSCBQSFVPQworMTI6Vk4tNDA6Vk46QklOSCBUSFVBTgorMTM6Vk4tNTk6Vk46Q0EgTUFVCisxNDpWTi00ODpWTjpDQU4gVEhPCisxNTpWTi0wNDpWTjpDQU8gQkFORworMTY6Vk4tNjA6Vk46REEgTkFORywgVEhBTkggUEhPCisxNzpWTi0zMzpWTjpEQUMgTEFDCisxODpWTi03MjpWTjpEQUsgTk9ORworMTk6Vk4tNzpWTjpESUVOIEJJRU4KKzIwOlZOLTM5OlZOOkRPTkcgTkFJCisyMTpWTi00NTpWTjpET05HIFRIQVAKKzIyOlZOLTMwOlZOOkdJQSBMQUkKKzIzOlZOLUhCQzpWTjpIQSBCQUMKKzI0OlZOLTAzOlZOOkhBIEdJQU5HCisyNTpWTi02NDpWTjpIQSBOT0kKKzI2OlZOLTY1OlZOOkhBIFRBWQorMjc6Vk4tMjM6Vk46SEEgVElOSAorMjg6Vk4tNjpWTjpIQUkgSFVORworMjk6Vk4tNjI6Vk46SEFJIFBIT05HCiszMDpWTi03MzpWTjpIQVUgR0lBTkcKKzMxOlZOLTY2OlZOOkhPIENISSBNSU5IIENJVFkKKzMyOlZOLTQ6Vk46SE9BIEJJTkgKKzMzOlZOLTY3OlZOOkhVTkcgWUVOCiszNDpWTi0zNDpWTjpLSEFOSCBIT0EKKzM1OlZOLTQ3OlZOOktJRU4gR0lBTkcKKzM2OlZOLTI4OlZOOktPTiBUVU0KKzM3OlZOLTA6Vk46TEFJIENIQVUKKzM4OlZOLTM1OlZOOkxBTSBET05HCiszOTpWTi0wOTpWTjpMQU5HIFNPTgorNDA6Vk4tMDI6Vk46TEFPIENBSQorNDE6Vk4tNDE6Vk46TE9ORyBBTgorNDI6Vk4tTUhJOlZOOk1JTkggSEFJCis0MzpWTi03NDpWTjpOQU0gRElOSAorNDQ6Vk4tNjM6Vk46TkFNIEhBCis0NTpWTi0yMjpWTjpOR0hFIEFOCis0NjpWTi04OlZOOk5JTkggQklOSAorNDc6Vk4tMzY6Vk46TklOSCBUSFVBTgorNDg6Vk4tNjg6Vk46UEhVIFRITworNDk6Vk4tMzI6Vk46UEhVIFlFTgorNTA6Vk4tMjQ6Vk46UVVBTkcgQklOSAorNTE6Vk4tMjc6Vk46UVVBTkcgTkFNIERBIE5BTkcKKzUyOlZOLTI5OlZOOlFVQU5HIE5HQUkKKzUzOlZOLTMxOlZOOlFVQU5HIE5JTkgKKzU0OlZOLTI1OlZOOlFVQU5HIFRSSQorNTU6Vk4tNTI6Vk46U09DIFRSQU5HCis1NjpWTi0wNTpWTjpTT04gTEEKKzU3OlZOLVNCRTpWTjpTT05HIEJFCis1ODpWTi0zNzpWTjpUQVkgTklOSAorNTk6Vk4tMjA6Vk46VEhBSSBCSU5ICis2MDpWTi02OTpWTjpUSEFJIE5HVVlFTgorNjE6Vk4tMjpWTjpUSEFOSCBIT0EKKzYyOlZOLTI2OlZOOlRIVUEgVEhJRU4gSFVFCis2MzpWTi00NjpWTjpUSUVOIEdJQU5HCis2NDpWTi01MTpWTjpUUkEgVklOSAorNjU6Vk4tMDc6Vk46VFVZRU4gUVVBTkcKKzY2OlZOLTQ5OlZOOlZJTkggTE9ORworNjc6Vk4tNzA6Vk46VklOSCBQSFUKKzY4OlZOLTA2OlZOOllFTiBCQUkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVk5NL1ZOTV9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvVk5NL1ZOTV9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmFmYzFjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9WTk0vVk5NX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsNTE5IEBACisxOlZOOlZOTTpWSUVUTkFNOkhhIFRheTpCYSBWaQorMjpWTjpWTk06VklFVE5BTTpIYSBUYXk6Q2h1b25nIE1pCiszOlZOOlZOTTpWSUVUTkFNOkhhIFRheTpEYW4gUGh1b25nCis0OlZOOlZOTTpWSUVUTkFNOkhhIFRheTpIYSBEb25nCis1OlZOOlZOTTpWSUVUTkFNOkhhIFRheTpIb2FpIER1YworNjpWTjpWTk06VklFVE5BTTpIYSBUYXk6TXkgRHVjCis3OlZOOlZOTTpWSUVUTkFNOkhhIFRheTpQaHUgWHV5ZW4KKzg6Vk46Vk5NOlZJRVROQU06SGEgVGF5OlBodWMgVGhvCis5OlZOOlZOTTpWSUVUTkFNOkhhIFRheTpRdW9jIE9haQorMTA6Vk46Vk5NOlZJRVROQU06SGEgVGF5OlNvbiBUYXkKKzExOlZOOlZOTTpWSUVUTkFNOkhhIFRheTpUaGFjaCBUaGF0CisxMjpWTjpWTk06VklFVE5BTTpIYSBUYXk6VGhhbmggT2FpCisxMzpWTjpWTk06VklFVE5BTTpIYSBUYXk6VGh1b25nIFRpbgorMTQ6Vk46Vk5NOlZJRVROQU06SGEgVGF5OlVuZyBIb2EKKzE6Vk46Vk5NOlZJRVROQU06TmFtIEhhOkJpbmggTHVjCisyOlZOOlZOTTpWSUVUTkFNOk5hbSBIYTpEdXkgVGllbgorMzpWTjpWTk06VklFVE5BTTpOYW0gSGE6SGEgTmFtCis0OlZOOlZOTTpWSUVUTkFNOk5hbSBIYTpIYWkgSGF1Cis1OlZOOlZOTTpWSUVUTkFNOk5hbSBIYTpLaW0gQmFuZworNjpWTjpWTk06VklFVE5BTTpOYW0gSGE6THkgTmhhbgorNzpWTjpWTk06VklFVE5BTTpOYW0gSGE6TmFtIERpbmggVG93bgorODpWTjpWTk06VklFVE5BTTpOYW0gSGE6TmFtIE5pbmgKKzk6Vk46Vk5NOlZJRVROQU06TmFtIEhhOk5naGlhIEh1bmcKKzEwOlZOOlZOTTpWSUVUTkFNOk5hbSBIYTpUaGFuaCBMaWVtCisxMTpWTjpWTk06VklFVE5BTTpOYW0gSGE6VnUgQmFuCisxMjpWTjpWTk06VklFVE5BTTpOYW0gSGE6WHVhbiBUaHV5CisxMzpWTjpWTk06VklFVE5BTTpOYW0gSGE6WSBZZW4KKzE6Vk46Vk5NOlZJRVROQU06TmluaCBUaHVhbjpCZW4gQ2F1CisyOlZOOlZOTTpWSUVUTkFNOk5pbmggVGh1YW46Q2hhdSBUaGFuaAorMzpWTjpWTk06VklFVE5BTTpOaW5oIFRodWFuOkR1b25nIE1pbmggQ2hhdQorNDpWTjpWTk06VklFVE5BTTpOaW5oIFRodWFuOkdvIERhdQorNTpWTjpWTk06VklFVE5BTTpOaW5oIFRodWFuOkhvYSBUaGFuaAorNjpWTjpWTk06VklFVE5BTTpOaW5oIFRodWFuOk5pbmggSGFpCis3OlZOOlZOTTpWSUVUTkFNOk5pbmggVGh1YW46TmluaCBQaHVvYworODpWTjpWTk06VklFVE5BTTpOaW5oIFRodWFuOk5pbmggU29uCis5OlZOOlZOTTpWSUVUTkFNOk5pbmggVGh1YW46UGhhbiBSYW5nLVRoYXAgQworMTA6Vk46Vk5NOlZJRVROQU06TmluaCBUaHVhbjpUYW4gQmllbgorMTE6Vk46Vk5NOlZJRVROQU06TmluaCBUaHVhbjpUYW4gQ2hhdQorMTI6Vk46Vk5NOlZJRVROQU06TmluaCBUaHVhbjpUcmFuZyBCYW5nCisxMzpWTjpWTk06VklFVE5BTTpOaW5oIFRodWFuOlR4LlRheSBOaW5oCisxOlZOOlZOTTpWSUVUTkFNOlRodWEgVGhpZW4tSHVlOkEgTHVvaQorMjpWTjpWTk06VklFVE5BTTpUaHVhIFRoaWVuLUh1ZTpIdWUgVG93bgorMzpWTjpWTk06VklFVE5BTTpUaHVhIFRoaWVuLUh1ZTpIdW9uZyBUaHV5Cis0OlZOOlZOTTpWSUVUTkFNOlRodWEgVGhpZW4tSHVlOkh1b25nIFRyYQorNTpWTjpWTk06VklFVE5BTTpUaHVhIFRoaWVuLUh1ZTpOYW0gRG9uZworNjpWTjpWTk06VklFVE5BTTpUaHVhIFRoaWVuLUh1ZTpQaG9uZyBEaWVuCis3OlZOOlZOTTpWSUVUTkFNOlRodWEgVGhpZW4tSHVlOlBodSBMb2MKKzg6Vk46Vk5NOlZJRVROQU06VGh1YSBUaGllbi1IdWU6UGh1IFZhbmcKKzk6Vk46Vk5NOlZJRVROQU06VGh1YSBUaGllbi1IdWU6UXVhbmcgRGllbgorMTpWTjpWTk06VklFVE5BTTpMYWkgQ2hhdTpEaWVuIEJpZW4KKzI6Vk46Vk5NOlZJRVROQU06TGFpIENoYXU6TXVvbmcgTGF5CiszOlZOOlZOTTpWSUVUTkFNOkxhaSBDaGF1Ok11b25nIFRlCis0OlZOOlZOTTpWSUVUTkFNOkxhaSBDaGF1OlBob25nIFRobworNTpWTjpWTk06VklFVE5BTTpMYWkgQ2hhdTpTaW4gSG8KKzY6Vk46Vk5NOlZJRVROQU06TGFpIENoYXU6VHVhIENodWEKKzc6Vk46Vk5NOlZJRVROQU06TGFpIENoYXU6VHVhbiBHaWFvCis4OlZOOlZOTTpWSUVUTkFNOkxhaSBDaGF1OlR4LkxhaSBDaGF1CisxOlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5hbS1EYSBOYW5nOkRhIE5hbmcgVG93bgorMjpWTjpWTk06VklFVE5BTTpRdWFuZyBOYW0tRGEgTmFuZzpEYWkgTG9jCiszOlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5hbS1EYSBOYW5nOkRpZW4gQmFuCis0OlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5hbS1EYSBOYW5nOkR1eSBYdXllbgorNTpWTjpWTk06VklFVE5BTTpRdWFuZyBOYW0tRGEgTmFuZzpHaWFuZworNjpWTjpWTk06VklFVE5BTTpRdWFuZyBOYW0tRGEgTmFuZzpIaWVuCis3OlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5hbS1EYSBOYW5nOkhpZXAgRHVjCis4OlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5hbS1EYSBOYW5nOkhvYSBWYW5nCis5OlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5hbS1EYSBOYW5nOkhvaSBBbgorMTA6Vk46Vk5NOlZJRVROQU06UXVhbmcgTmFtLURhIE5hbmc6TnVpIFRoYW5oCisxMTpWTjpWTk06VklFVE5BTTpRdWFuZyBOYW0tRGEgTmFuZzpQaHVvYyBTb24KKzEyOlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5hbS1EYSBOYW5nOlF1ZSBTb24KKzEzOlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5hbS1EYSBOYW5nOlRhbSBLeQorMTQ6Vk46Vk5NOlZJRVROQU06UXVhbmcgTmFtLURhIE5hbmc6VGhhbmcgQmluaAorMTU6Vk46Vk5NOlZJRVROQU06UXVhbmcgTmFtLURhIE5hbmc6VGllbiBQaHVvYworMTY6Vk46Vk5NOlZJRVROQU06UXVhbmcgTmFtLURhIE5hbmc6VHJhIE15CisxOlZOOlZOTTpWSUVUTkFNOlBodSBZZW46RG9uZyBYdWFuCisyOlZOOlZOTTpWSUVUTkFNOlBodSBZZW46U29uIEhvYQorMzpWTjpWTk06VklFVE5BTTpQaHUgWWVuOlNvbmcgQ2F1Cis0OlZOOlZOTTpWSUVUTkFNOlBodSBZZW46U29uZyBIaW5oCis1OlZOOlZOTTpWSUVUTkFNOlBodSBZZW46VHV5IEFuCis2OlZOOlZOTTpWSUVUTkFNOlBodSBZZW46VHV5IEhvYQorNzpWTjpWTk06VklFVE5BTTpQaHUgWWVuOlR1eSBIb2EgVG93bgorMTpWTjpWTk06VklFVE5BTTpCYSBSaWEgLSBWdW5nIFRhdTpDaGF1IFRoYW5oCisyOlZOOlZOTTpWSUVUTkFNOkJhIFJpYSAtIFZ1bmcgVGF1OkNvbiBEYW8KKzM6Vk46Vk5NOlZJRVROQU06QmEgUmlhIC0gVnVuZyBUYXU6TG9uZyBEYXQKKzQ6Vk46Vk5NOlZJRVROQU06QmEgUmlhIC0gVnVuZyBUYXU6VnVuZyBUYXUKKzU6Vk46Vk5NOlZJRVROQU06QmEgUmlhIC0gVnVuZyBUYXU6WHV5ZW4gTW9jCisxOlZOOlZOTTpWSUVUTkFNOkhhIFRpbmg6Q2FtIFh1eWVuCisyOlZOOlZOTTpWSUVUTkFNOkhhIFRpbmg6Q2FuIExvYworMzpWTjpWTk06VklFVE5BTTpIYSBUaW5oOkR1YyBUaG8KKzQ6Vk46Vk5NOlZJRVROQU06SGEgVGluaDpIdW9uZyBLaGUKKzU6Vk46Vk5NOlZJRVROQU06SGEgVGluaDpIdW9uZyBTb24KKzY6Vk46Vk5NOlZJRVROQU06SGEgVGluaDpLeSBBbmgKKzc6Vk46Vk5NOlZJRVROQU06SGEgVGluaDpOZ2hpIFh1YW4KKzg6Vk46Vk5NOlZJRVROQU06SGEgVGluaDpUaGFjaCBIYQorOTpWTjpWTk06VklFVE5BTTpIYSBUaW5oOlR4LkhhIFRpbmgKKzE6Vk46Vk5NOlZJRVROQU06VmluaCBMb25nOkJpbmggTWluaAorMjpWTjpWTk06VklFVE5BTTpWaW5oIExvbmc6TG9uZyBIbworMzpWTjpWTk06VklFVE5BTTpWaW5oIExvbmc6VGFtIEJpbmgKKzQ6Vk46Vk5NOlZJRVROQU06VmluaCBMb25nOlRyYSBPbgorNTpWTjpWTk06VklFVE5BTTpWaW5oIExvbmc6VmluaCBMb25nCis2OlZOOlZOTTpWSUVUTkFNOlZpbmggTG9uZzpWdW5nIExpZW0KKzE6Vk46Vk5NOlZJRVROQU06VGhhbmggSG9hOkJhIFRodW9jCisyOlZOOlZOTTpWSUVUTkFNOlRoYW5oIEhvYTpCaW0gU29uCiszOlZOOlZOTTpWSUVUTkFNOlRoYW5oIEhvYTpDYW0gVGh1eQorNDpWTjpWTk06VklFVE5BTTpUaGFuaCBIb2E6RG9uZyBTb24KKzU6Vk46Vk5NOlZJRVROQU06VGhhbmggSG9hOkhhIFRydW5nCis2OlZOOlZOTTpWSUVUTkFNOlRoYW5oIEhvYTpIYXUgTG9jCis3OlZOOlZOTTpWSUVUTkFNOlRoYW5oIEhvYTpIb2FuZyBIb2EKKzg6Vk46Vk5NOlZJRVROQU06VGhhbmggSG9hOkxhbmcgQ2hhbmgKKzk6Vk46Vk5NOlZJRVROQU06VGhhbmggSG9hOk5nYSBTb24KKzEwOlZOOlZOTTpWSUVUTkFNOlRoYW5oIEhvYTpOZ29jIExhYworMTE6Vk46Vk5NOlZJRVROQU06VGhhbmggSG9hOk5odSBYdWFuCisxMjpWTjpWTk06VklFVE5BTTpUaGFuaCBIb2E6Tm9uZyBDb25nCisxMzpWTjpWTk06VklFVE5BTTpUaGFuaCBIb2E6UXVhbiBIb2EKKzE0OlZOOlZOTTpWSUVUTkFNOlRoYW5oIEhvYTpRdWFuZyBYdW9uZworMTU6Vk46Vk5NOlZJRVROQU06VGhhbmggSG9hOlNhbSBTb24KKzE2OlZOOlZOTTpWSUVUTkFNOlRoYW5oIEhvYTpUaGFjaCBUaGFuaAorMTc6Vk46Vk5NOlZJRVROQU06VGhhbmggSG9hOlRoaWV1IFllbgorMTg6Vk46Vk5NOlZJRVROQU06VGhhbmggSG9hOlRobyBYdWFuCisxOTpWTjpWTk06VklFVE5BTTpUaGFuaCBIb2E6VGh1b25nIFh1YW4KKzIwOlZOOlZOTTpWSUVUTkFNOlRoYW5oIEhvYTpUaW5oIEdpYQorMjE6Vk46Vk5NOlZJRVROQU06VGhhbmggSG9hOlRyaWV1IFNvbgorMjI6Vk46Vk5NOlZJRVROQU06VGhhbmggSG9hOlR4LlRoYW5oIEhvYQorMjM6Vk46Vk5NOlZJRVROQU06VGhhbmggSG9hOlZpbmggTG9jCisxOlZOOlZOTTpWSUVUTkFNOlNvbmcgQmU6QmVuIENhdAorMjpWTjpWTk06VklFVE5BTTpTb25nIEJlOkJpbmggTG9uZworMzpWTjpWTk06VklFVE5BTTpTb25nIEJlOkJ1IERhbmcKKzQ6Vk46Vk5NOlZJRVROQU06U29uZyBCZTpEb25nIFBodQorNTpWTjpWTk06VklFVE5BTTpTb25nIEJlOkxvYyBOaW5oCis2OlZOOlZOTTpWSUVUTkFNOlNvbmcgQmU6UGh1b2MgTG9uZworNzpWTjpWTk06VklFVE5BTTpTb25nIEJlOlRhbiBVeWVuCis4OlZOOlZOTTpWSUVUTkFNOlNvbmcgQmU6VGh1IERhdSBNb3QKKzk6Vk46Vk5NOlZJRVROQU06U29uZyBCZTpUaHVhbiBBbgorMTpWTjpWTk06VklFVE5BTTpCaW5oIFRodWFuOkJhYyBCaW5oCisyOlZOOlZOTTpWSUVUTkFNOkJpbmggVGh1YW46RHVjIExpbmgKKzM6Vk46Vk5NOlZJRVROQU06QmluaCBUaHVhbjpIYW0gVGFuCis0OlZOOlZOTTpWSUVUTkFNOkJpbmggVGh1YW46SGFtIFRodWFuIEJhYworNTpWTjpWTk06VklFVE5BTTpCaW5oIFRodWFuOkhhbSBUaHVhbiBOYW0KKzY6Vk46Vk5NOlZJRVROQU06QmluaCBUaHVhbjpQaGFuIFRoaWV0Cis3OlZOOlZOTTpWSUVUTkFNOkJpbmggVGh1YW46VGFuaCBMaW5oCis4OlZOOlZOTTpWSUVUTkFNOkJpbmggVGh1YW46VHV5IFBob25nCisxOlZOOlZOTTpWSUVUTkFNOlF1YW5nIFRyaTpCZW4gSGFpCisyOlZOOlZOTTpWSUVUTkFNOlF1YW5nIFRyaTpEb25nIEhhCiszOlZOOlZOTTpWSUVUTkFNOlF1YW5nIFRyaTpIdW9uZyBIb2EKKzQ6Vk46Vk5NOlZJRVROQU06UXVhbmcgVHJpOlRyaWV1IEhhaQorMTpWTjpWTk06VklFVE5BTTpTb24gTGE6QmFjIFllbgorMjpWTjpWTk06VklFVE5BTTpTb24gTGE6TWFpIFNvbgorMzpWTjpWTk06VklFVE5BTTpTb24gTGE6TW9jIENoYXUKKzQ6Vk46Vk5NOlZJRVROQU06U29uIExhOk11b25nIExhCis1OlZOOlZOTTpWSUVUTkFNOlNvbiBMYTpQaHUgWWVuCis2OlZOOlZOTTpWSUVUTkFNOlNvbiBMYTpRdXluaCBOaGFpCis3OlZOOlZOTTpWSUVUTkFNOlNvbiBMYTpTb25nIE1hCis4OlZOOlZOTTpWSUVUTkFNOlNvbiBMYTpUaHVhbiBDaGF1Cis5OlZOOlZOTTpWSUVUTkFNOlNvbiBMYTpUeC5Tb24gTGEKKzEwOlZOOlZOTTpWSUVUTkFNOlNvbiBMYTpZZW4gQ2hhdQorMTpWTjpWTk06VklFVE5BTTpDYW4gVGhvOkNhbiBUaG8gVG93bgorMjpWTjpWTk06VklFVE5BTTpDYW4gVGhvOkNoYXUgVGhhbmgKKzM6Vk46Vk5NOlZJRVROQU06Q2FuIFRobzpMb25nIE15Cis0OlZOOlZOTTpWSUVUTkFNOkNhbiBUaG86TyBNb24KKzU6Vk46Vk5NOlZJRVROQU06Q2FuIFRobzpQaHVuZyBIaWVwCis2OlZOOlZOTTpWSUVUTkFNOkNhbiBUaG86VGhvdCBOb3QKKzc6Vk46Vk5NOlZJRVROQU06Q2FuIFRobzpWaSBUaGFuaAorMTpWTjpWTk06VklFVE5BTTpLaGFuaCBIb2E6Q2FtIFJhbmgKKzI6Vk46Vk5NOlZJRVROQU06S2hhbmggSG9hOkRpZW4gS2hhbmgKKzM6Vk46Vk5NOlZJRVROQU06S2hhbmggSG9hOktoYW5oIFNvbgorNDpWTjpWTk06VklFVE5BTTpLaGFuaCBIb2E6S2hhbmggVmluaAorNTpWTjpWTk06VklFVE5BTTpLaGFuaCBIb2E6TmhhIFRyYW5nIFRvd24KKzY6Vk46Vk5NOlZJRVROQU06S2hhbmggSG9hOk5pbmggSG9hCis3OlZOOlZOTTpWSUVUTkFNOktoYW5oIEhvYTpWYW4gTmluaAorMTpWTjpWTk06VklFVE5BTTpMYW0gRG9uZzpCYW8gTG9jCisyOlZOOlZOTTpWSUVUTkFNOkxhbSBEb25nOkNhdCBUaWVuCiszOlZOOlZOTTpWSUVUTkFNOkxhbSBEb25nOkRhIExhdCBUb3duCis0OlZOOlZOTTpWSUVUTkFNOkxhbSBEb25nOkRhIFRlaAorNTpWTjpWTk06VklFVE5BTTpMYW0gRG9uZzpEYWsgVW9haQorNjpWTjpWTk06VklFVE5BTTpMYW0gRG9uZzpEaSBMaW5oCis3OlZOOlZOTTpWSUVUTkFNOkxhbSBEb25nOkRvbiBEdW9uZworODpWTjpWTk06VklFVE5BTTpMYW0gRG9uZzpEdWMgVHJvbmcKKzk6Vk46Vk5NOlZJRVROQU06TGFtIERvbmc6TGFjIER1b25nCisxMDpWTjpWTk06VklFVE5BTTpMYW0gRG9uZzpMYW0gSGEKKzE6Vk46Vk5NOlZJRVROQU06QmFjIFRoYWk6QmFjaCBUaG9uZworMjpWTjpWTk06VklFVE5BTTpCYWMgVGhhaTpDaG8gRG9uCiszOlZOOlZOTTpWSUVUTkFNOkJhYyBUaGFpOkRhaSBUdQorNDpWTjpWTk06VklFVE5BTTpCYWMgVGhhaTpEaW5oIEhvYQorNTpWTjpWTk06VklFVE5BTTpCYWMgVGhhaTpEb25nIEhpCis2OlZOOlZOTTpWSUVUTkFNOkJhYyBUaGFpOk5hIFJpCis3OlZOOlZOTTpWSUVUTkFNOkJhYyBUaGFpOlBobyBZZW4KKzg6Vk46Vk5NOlZJRVROQU06QmFjIFRoYWk6UGh1IEJpbmgKKzk6Vk46Vk5NOlZJRVROQU06QmFjIFRoYWk6UGh1IEx1b25nCisxMDpWTjpWTk06VklFVE5BTTpCYWMgVGhhaTpTb25nIENvbmcKKzExOlZOOlZOTTpWSUVUTkFNOkJhYyBUaGFpOlRoYWkgTmd1eWVuCisxMjpWTjpWTk06VklFVE5BTTpCYWMgVGhhaTpWbyBOaGFpCisxOlZOOlZOTTpWSUVUTkFNOkJpbmggRGluaDpBbiBMYW8KKzI6Vk46Vk5NOlZJRVROQU06QmluaCBEaW5oOkFuIE5ob24KKzM6Vk46Vk5NOlZJRVROQU06QmluaCBEaW5oOkhvYWkgQW4KKzQ6Vk46Vk5NOlZJRVROQU06QmluaCBEaW5oOkhvYWkgTmhvbgorNTpWTjpWTk06VklFVE5BTTpCaW5oIERpbmg6UGh1IENhdAorNjpWTjpWTk06VklFVE5BTTpCaW5oIERpbmg6UGh1IE15Cis3OlZOOlZOTTpWSUVUTkFNOkJpbmggRGluaDpRdXkgTmhvbiBUb3duCis4OlZOOlZOTTpWSUVUTkFNOkJpbmggRGluaDpUYXkgU29uCis5OlZOOlZOTTpWSUVUTkFNOkJpbmggRGluaDpUdXkgUGh1b2MKKzEwOlZOOlZOTTpWSUVUTkFNOkJpbmggRGluaDpWYW4gQ2FuaAorMTE6Vk46Vk5NOlZJRVROQU06QmluaCBEaW5oOlZpbmggVGhhbmgKKzE6Vk46Vk5NOlZJRVROQU06U29jIFRyYW5nOktlIFNhY2gKKzI6Vk46Vk5NOlZJRVROQU06U29jIFRyYW5nOkxvbmcgUGh1CiszOlZOOlZOTTpWSUVUTkFNOlNvYyBUcmFuZzpNeSBUdQorNDpWTjpWTk06VklFVE5BTTpTb2MgVHJhbmc6TXkgWHV5ZW4KKzU6Vk46Vk5NOlZJRVROQU06U29jIFRyYW5nOlNvYyBUcmFuZworNjpWTjpWTk06VklFVE5BTTpTb2MgVHJhbmc6VGhhbmggVHJpCis3OlZOOlZOTTpWSUVUTkFNOlNvYyBUcmFuZzpWaW5oIENoYXUKKzE6Vk46Vk5NOlZJRVROQU06SGFpIFBob25nOkFuIEhhaQorMjpWTjpWTk06VklFVE5BTTpIYWkgUGhvbmc6QW4gTGFvCiszOlZOOlZOTTpWSUVUTkFNOkhhaSBQaG9uZzpDYXQgSGFpCis0OlZOOlZOTTpWSUVUTkFNOkhhaSBQaG9uZzpEbyBTb24KKzU6Vk46Vk5NOlZJRVROQU06SGFpIFBob25nOklubmVyIENpdHkKKzY6Vk46Vk5NOlZJRVROQU06SGFpIFBob25nOktpZW4gQW4KKzc6Vk46Vk5NOlZJRVROQU06SGFpIFBob25nOktpZW4gVGh1eQorODpWTjpWTk06VklFVE5BTTpIYWkgUGhvbmc6VGh1eSBOZ3V5ZW4KKzk6Vk46Vk5NOlZJRVROQU06SGFpIFBob25nOlRpZW4gTGFuZworMTA6Vk46Vk5NOlZJRVROQU06SGFpIFBob25nOlZpbmggQmFvCisxOlZOOlZOTTpWSUVUTkFNOkFuIEdpYW5nOkNoYXUgRG9jCisyOlZOOlZOTTpWSUVUTkFNOkFuIEdpYW5nOkNoYXUgUGh1CiszOlZOOlZOTTpWSUVUTkFNOkFuIEdpYW5nOkNoYXUgVGhhbmgKKzQ6Vk46Vk5NOlZJRVROQU06QW4gR2lhbmc6Q2hvIE1vaQorNTpWTjpWTk06VklFVE5BTTpBbiBHaWFuZzpMb25nIFh1eWVuCis2OlZOOlZOTTpWSUVUTkFNOkFuIEdpYW5nOlBodSBDaGF1Cis3OlZOOlZOTTpWSUVUTkFNOkFuIEdpYW5nOlBodSBUYW4KKzg6Vk46Vk5NOlZJRVROQU06QW4gR2lhbmc6VGhvYWkgU29uCis5OlZOOlZOTTpWSUVUTkFNOkFuIEdpYW5nOlRpbmggQmllbgorMTA6Vk46Vk5NOlZJRVROQU06QW4gR2lhbmc6VHJpIFRvbgorMTpWTjpWTk06VklFVE5BTTpEb25nIFRoYXA6Q2FvIExhbmgKKzI6Vk46Vk5NOlZJRVROQU06RG9uZyBUaGFwOkNoYXUgVGhhbmgKKzM6Vk46Vk5NOlZJRVROQU06RG9uZyBUaGFwOkhvbmcgTmd1Cis0OlZOOlZOTTpWSUVUTkFNOkRvbmcgVGhhcDpTYSBEZWMKKzU6Vk46Vk5NOlZJRVROQU06RG9uZyBUaGFwOlRhbSBOb25nCis2OlZOOlZOTTpWSUVUTkFNOkRvbmcgVGhhcDpUaGFuaCBCaW5oCis3OlZOOlZOTTpWSUVUTkFNOkRvbmcgVGhhcDpUaGFuaCBIdW5nCis4OlZOOlZOTTpWSUVUTkFNOkRvbmcgVGhhcDpUaGFwIE11b2kKKzk6Vk46Vk5NOlZJRVROQU06RG9uZyBUaGFwOlR4LkNhbyBMYW5oCisxOlZOOlZOTTpWSUVUTkFNOk5naGUgQW46QW5oIFNvbgorMjpWTjpWTk06VklFVE5BTTpOZ2hlIEFuOkNvbiBDdW9uZworMzpWTjpWTk06VklFVE5BTTpOZ2hlIEFuOkRpZW4gQ2hhdQorNDpWTjpWTk06VklFVE5BTTpOZ2hlIEFuOkRvIEx1b25nCis1OlZOOlZOTTpWSUVUTkFNOk5naGUgQW46SHVuZyBOZ3V5ZW4KKzY6Vk46Vk5NOlZJRVROQU06TmdoZSBBbjpLeSBTb24KKzc6Vk46Vk5NOlZJRVROQU06TmdoZSBBbjpOYW0gRGFuCis4OlZOOlZOTTpWSUVUTkFNOk5naGUgQW46TmdoaSBMb2MKKzk6Vk46Vk5NOlZJRVROQU06TmdoZSBBbjpOZ2hpYSBEYW4KKzEwOlZOOlZOTTpWSUVUTkFNOk5naGUgQW46UXVlIFBob25nCisxMTpWTjpWTk06VklFVE5BTTpOZ2hlIEFuOlF1eSBDaGF1CisxMjpWTjpWTk06VklFVE5BTTpOZ2hlIEFuOlF1eSBIb3AKKzEzOlZOOlZOTTpWSUVUTkFNOk5naGUgQW46UXV5bmggTHV1CisxNDpWTjpWTk06VklFVE5BTTpOZ2hlIEFuOlRhbiBLeQorMTU6Vk46Vk5NOlZJRVROQU06TmdoZSBBbjpUaGFuaCBDaHVvbmcKKzE2OlZOOlZOTTpWSUVUTkFNOk5naGUgQW46VHVvbmcgRHVvbmcKKzE3OlZOOlZOTTpWSUVUTkFNOk5naGUgQW46VmluaCBUb3duCisxODpWTjpWTk06VklFVE5BTTpOZ2hlIEFuOlllbiBUaGFuaAorMTpWTjpWTk06VklFVE5BTTpDYW8gQmFuZzpCYSBCZQorMjpWTjpWTk06VklFVE5BTTpDYW8gQmFuZzpCYW8gTGFjCiszOlZOOlZOTTpWSUVUTkFNOkNhbyBCYW5nOkhhIExhbmcKKzQ6Vk46Vk5NOlZJRVROQU06Q2FvIEJhbmc6SGEgUXVhbmcKKzU6Vk46Vk5NOlZJRVROQU06Q2FvIEJhbmc6SG9hIEFuCis2OlZOOlZOTTpWSUVUTkFNOkNhbyBCYW5nOk5nYW4gU29uCis3OlZOOlZOTTpWSUVUTkFNOkNhbyBCYW5nOk5ndXllbiBCaW5oCis4OlZOOlZOTTpWSUVUTkFNOkNhbyBCYW5nOlF1YW5nIEhvYQorOTpWTjpWTk06VklFVE5BTTpDYW8gQmFuZzpUaGFjaCBBbgorMTA6Vk46Vk5NOlZJRVROQU06Q2FvIEJhbmc6VGhvbmcgTm9uZworMTE6Vk46Vk5NOlZJRVROQU06Q2FvIEJhbmc6VHJhIExpbmgKKzEyOlZOOlZOTTpWSUVUTkFNOkNhbyBCYW5nOlRydW5nIEtoYW5oCisxMzpWTjpWTk06VklFVE5BTTpDYW8gQmFuZzpUeC5DYW8gQmFuZworMTpWTjpWTk06VklFVE5BTTpNaW5oIEhhaTpCYWMgTGlldQorMjpWTjpWTk06VklFVE5BTTpNaW5oIEhhaTpDYSBNYXUKKzM6Vk46Vk5NOlZJRVROQU06TWluaCBIYWk6Q2FpIE51b2MKKzQ6Vk46Vk5NOlZJRVROQU06TWluaCBIYWk6RGFtIERvaQorNTpWTjpWTk06VklFVE5BTTpNaW5oIEhhaTpHaWEgUmFpCis2OlZOOlZOTTpWSUVUTkFNOk1pbmggSGFpOkhvbmcgRGFuCis3OlZOOlZOTTpWSUVUTkFNOk1pbmggSGFpOk5nb2MgSGllbgorODpWTjpWTk06VklFVE5BTTpNaW5oIEhhaTpUaG9pIEJpbmgKKzk6Vk46Vk5NOlZJRVROQU06TWluaCBIYWk6VHJhbiBWYW4gVGhvaQorMTA6Vk46Vk5NOlZJRVROQU06TWluaCBIYWk6VSBNaW5oCisxMTpWTjpWTk06VklFVE5BTTpNaW5oIEhhaTpWaW5oIExvaQorMTpWTjpWTk06VklFVE5BTTpZZW4gQmFpOkx1YyBZZW4KKzI6Vk46Vk5NOlZJRVROQU06WWVuIEJhaTpNdSBDYW5nIENoYWkKKzM6Vk46Vk5NOlZJRVROQU06WWVuIEJhaTpUcmFtIFRhdQorNDpWTjpWTk06VklFVE5BTTpZZW4gQmFpOlRyYW4gWWVuCis1OlZOOlZOTTpWSUVUTkFNOlllbiBCYWk6VHguWWVuIEJhaQorNjpWTjpWTk06VklFVE5BTTpZZW4gQmFpOlZhbiBDaGFuCis3OlZOOlZOTTpWSUVUTkFNOlllbiBCYWk6VmFuIFllbgorODpWTjpWTk06VklFVE5BTTpZZW4gQmFpOlllbiBCaW5oCisxOlZOOlZOTTpWSUVUTkFNOlRpZW4gR2lhbmc6Q2FpIEJlCisyOlZOOlZOTTpWSUVUTkFNOlRpZW4gR2lhbmc6Q2FpIExheQorMzpWTjpWTk06VklFVE5BTTpUaWVuIEdpYW5nOkNoYXUgVGhhbmgKKzQ6Vk46Vk5NOlZJRVROQU06VGllbiBHaWFuZzpDaG8gR2FvCis1OlZOOlZOTTpWSUVUTkFNOlRpZW4gR2lhbmc6R28gQ29uZworNjpWTjpWTk06VklFVE5BTTpUaWVuIEdpYW5nOkdvIENvbmcgRG9uZworNzpWTjpWTk06VklFVE5BTTpUaWVuIEdpYW5nOkdvIENvbmcgVGF5Cis4OlZOOlZOTTpWSUVUTkFNOlRpZW4gR2lhbmc6TXkgVGhvIFRvd24KKzE6Vk46Vk5NOlZJRVROQU06TGFuZyBTb246QmFjIFNvbgorMjpWTjpWTk06VklFVE5BTTpMYW5nIFNvbjpCaW5oIEdpYQorMzpWTjpWTk06VklFVE5BTTpMYW5nIFNvbjpDYW8gTG9jCis0OlZOOlZOTTpWSUVUTkFNOkxhbmcgU29uOkNoaSBMYW5nCis1OlZOOlZOTTpWSUVUTkFNOkxhbmcgU29uOkRpbmggTGFwCis2OlZOOlZOTTpWSUVUTkFNOkxhbmcgU29uOkh1dSBMdW5nCis3OlZOOlZOTTpWSUVUTkFNOkxhbmcgU29uOkxvYyBCaW5oCis4OlZOOlZOTTpWSUVUTkFNOkxhbmcgU29uOlRyYW5nIERpbmgKKzk6Vk46Vk5NOlZJRVROQU06TGFuZyBTb246VHguTGFuZyBTb24KKzEwOlZOOlZOTTpWSUVUTkFNOkxhbmcgU29uOlZhbiBMYW5nCisxMTpWTjpWTk06VklFVE5BTTpMYW5nIFNvbjpWYW4gUXVhbgorMTpWTjpWTk06VklFVE5BTTpRdWFuZyBOZ2FpOkJhIFRvCisyOlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5nYWk6QmluaCBTb24KKzM6Vk46Vk5NOlZJRVROQU06UXVhbmcgTmdhaTpEdWMgUGhvCis0OlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5nYWk6TWluaCBMb25nCis1OlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5nYWk6TW8gRHVjCis2OlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5nYWk6TmdoaWEgSGFuaAorNzpWTjpWTk06VklFVE5BTTpRdWFuZyBOZ2FpOlNvbiBIYQorODpWTjpWTk06VklFVE5BTTpRdWFuZyBOZ2FpOlNvbiBUaW5oCis5OlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5nYWk6VHJhIEJvbmcKKzEwOlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5nYWk6VHUgTmdoaWEKKzExOlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5nYWk6VHguUXVhbmcgTmdhaQorMTpWTjpWTk06VklFVE5BTTpIYSBOb2k6RG9uZyBBbmgKKzI6Vk46Vk5NOlZJRVROQU06SGEgTm9pOkdpYSBMYW0KKzM6Vk46Vk5NOlZJRVROQU06SGEgTm9pOklubmVyIENpdHkKKzQ6Vk46Vk5NOlZJRVROQU06SGEgTm9pOlNvYyBTb24KKzU6Vk46Vk5NOlZJRVROQU06SGEgTm9pOlRoYW5oIFRyaQorNjpWTjpWTk06VklFVE5BTTpIYSBOb2k6VHUgTGllbQorMTpWTjpWTk06VklFVE5BTTpIYSBHaWFuZzpCYWMgTWUKKzI6Vk46Vk5NOlZJRVROQU06SGEgR2lhbmc6QmFjIFF1YW5nCiszOlZOOlZOTTpWSUVUTkFNOkhhIEdpYW5nOkRvbmcgVmFuCis0OlZOOlZOTTpWSUVUTkFNOkhhIEdpYW5nOkhvYW5nIFN1IFBoaQorNTpWTjpWTk06VklFVE5BTTpIYSBHaWFuZzpNZW8gVmFjCis2OlZOOlZOTTpWSUVUTkFNOkhhIEdpYW5nOlF1YW4gQmEKKzc6Vk46Vk5NOlZJRVROQU06SGEgR2lhbmc6VHguSGEgR2lhbmcKKzg6Vk46Vk5NOlZJRVROQU06SGEgR2lhbmc6VmkgWHV5ZW4KKzk6Vk46Vk5NOlZJRVROQU06SGEgR2lhbmc6WGluIE1hbgorMTA6Vk46Vk5NOlZJRVROQU06SGEgR2lhbmc6WWVuIE1pbmgKKzE6Vk46Vk5NOlZJRVROQU06R2lhIExhaTpBIFl1biBQYQorMjpWTjpWTk06VklFVE5BTTpHaWEgTGFpOkFuIEtoZQorMzpWTjpWTk06VklFVE5BTTpHaWEgTGFpOkNodSBQYQorNDpWTjpWTk06VklFVE5BTTpHaWEgTGFpOkNodSBQcm9uZworNTpWTjpWTk06VklFVE5BTTpHaWEgTGFpOkNodSBTcmUKKzY6Vk46Vk5NOlZJRVROQU06R2lhIExhaTpLYmFuZworNzpWTjpWTk06VklFVE5BTTpHaWEgTGFpOktvbiBDaHJvCis4OlZOOlZOTTpWSUVUTkFNOkdpYSBMYWk6S3JvbmdwYQorOTpWTjpWTk06VklFVE5BTTpHaWEgTGFpOk1hbmcgWWFuZworMTA6Vk46Vk5NOlZJRVROQU06R2lhIExhaTpQbGF5a3UKKzE6Vk46Vk5NOlZJRVROQU06RG9uZyBOYWk6QmllbiBIb2EgVG93bgorMjpWTjpWTk06VklFVE5BTTpEb25nIE5haTpMb25nIFRoYW5oCiszOlZOOlZOTTpWSUVUTkFNOkRvbmcgTmFpOlRhbiBQaHUKKzQ6Vk46Vk5NOlZJRVROQU06RG9uZyBOYWk6VGhvbmcgTmhhdAorNTpWTjpWTk06VklFVE5BTTpEb25nIE5haTpWaW5oIEFuCis2OlZOOlZOTTpWSUVUTkFNOkRvbmcgTmFpOlh1YW4gTG9jCisxOlZOOlZOTTpWSUVUTkFNOlR1eWVuIFF1YW5nOkNoaWVtIEhvYQorMjpWTjpWTk06VklFVE5BTTpUdXllbiBRdWFuZzpIYW0gWWVuCiszOlZOOlZOTTpWSUVUTkFNOlR1eWVuIFF1YW5nOk5hIEhhbmcKKzQ6Vk46Vk5NOlZJRVROQU06VHV5ZW4gUXVhbmc6U29uIER1b25nCis1OlZOOlZOTTpWSUVUTkFNOlR1eWVuIFF1YW5nOlR4LlR1eWVuIFF1YW5nCis2OlZOOlZOTTpWSUVUTkFNOlR1eWVuIFF1YW5nOlllbiBTb24KKzE6Vk46Vk5NOlZJRVROQU06TGFvIENhaTpCYWMgSGEKKzI6Vk46Vk5NOlZJRVROQU06TGFvIENhaTpCYW8gVGhhbmcKKzM6Vk46Vk5NOlZJRVROQU06TGFvIENhaTpCYW8gWWVuCis0OlZOOlZOTTpWSUVUTkFNOkxhbyBDYWk6QmF0IFhhdAorNTpWTjpWTk06VklFVE5BTTpMYW8gQ2FpOk11b25nIEtodW9uZworNjpWTjpWTk06VklFVE5BTTpMYW8gQ2FpOlNhIFBhCis3OlZOOlZOTTpWSUVUTkFNOkxhbyBDYWk6VGhhbiBVeWVuCis4OlZOOlZOTTpWSUVUTkFNOkxhbyBDYWk6VHguTGFvIENhaQorOTpWTjpWTk06VklFVE5BTTpMYW8gQ2FpOlZhbiBCYW4KKzE6Vk46Vk5NOlZJRVROQU06TmluaCBCaW5oOkdpYSBWaWVuCisyOlZOOlZOTTpWSUVUTkFNOk5pbmggQmluaDpIb2EgTHUKKzM6Vk46Vk5NOlZJRVROQU06TmluaCBCaW5oOkhvYW5nIExvbmcKKzQ6Vk46Vk5NOlZJRVROQU06TmluaCBCaW5oOktpbSBTb24KKzU6Vk46Vk5NOlZJRVROQU06TmluaCBCaW5oOk5pbmggQmluaAorNjpWTjpWTk06VklFVE5BTTpOaW5oIEJpbmg6VGFtIERpZXAKKzE6Vk46Vk5NOlZJRVROQU06TG9uZyBBbjpCZW4gTHVjCisyOlZOOlZOTTpWSUVUTkFNOkxvbmcgQW46Q2FuIER1b2MKKzM6Vk46Vk5NOlZJRVROQU06TG9uZyBBbjpDYW4gR2l1b2MKKzQ6Vk46Vk5NOlZJRVROQU06TG9uZyBBbjpDaGF1IFRoYW5oCis1OlZOOlZOTTpWSUVUTkFNOkxvbmcgQW46RHVjIEhvYQorNjpWTjpWTk06VklFVE5BTTpMb25nIEFuOkR1YyBIdWUKKzc6Vk46Vk5NOlZJRVROQU06TG9uZyBBbjpNb2MgSG9hCis4OlZOOlZOTTpWSUVUTkFNOkxvbmcgQW46VGFuIEFuCis5OlZOOlZOTTpWSUVUTkFNOkxvbmcgQW46VGFuIFRoYW5oCisxMDpWTjpWTk06VklFVE5BTTpMb25nIEFuOlRhbiBUcnUKKzExOlZOOlZOTTpWSUVUTkFNOkxvbmcgQW46VGhhbmggSG9hCisxMjpWTjpWTk06VklFVE5BTTpMb25nIEFuOlRodSBUaHVhCisxMzpWTjpWTk06VklFVE5BTTpMb25nIEFuOlZpbmggSHVuZworMTpWTjpWTk06VklFVE5BTTpUcmEgVmluaDpDYW5nIExvbmcKKzI6Vk46Vk5NOlZJRVROQU06VHJhIFZpbmg6Q2F1IEtlCiszOlZOOlZOTTpWSUVUTkFNOlRyYSBWaW5oOkNhdSBOZ2FuZworNDpWTjpWTk06VklFVE5BTTpUcmEgVmluaDpDaGF1IFRoYW5oCis1OlZOOlZOTTpWSUVUTkFNOlRyYSBWaW5oOkR1eWVuIEhhaQorNjpWTjpWTk06VklFVE5BTTpUcmEgVmluaDpUaWV1IENhbgorNzpWTjpWTk06VklFVE5BTTpUcmEgVmluaDpUcmEgQ3UKKzg6Vk46Vk5NOlZJRVROQU06VHJhIFZpbmg6VHJhIFZpbmgKKzE6Vk46Vk5NOlZJRVROQU06SGFpIEh1bmc6Q2FtIEJpbmgKKzI6Vk46Vk5NOlZJRVROQU06SGFpIEh1bmc6Q2hhdSBHaWFuZworMzpWTjpWTk06VklFVE5BTTpIYWkgSHVuZzpDaGkgTGluaAorNDpWTjpWTk06VklFVE5BTTpIYWkgSHVuZzpIYWkgRHVvbmcKKzU6Vk46Vk5NOlZJRVROQU06SGFpIEh1bmc6SHVuZyBZZW4KKzY6Vk46Vk5NOlZJRVROQU06SGFpIEh1bmc6S2ltIE1vbgorNzpWTjpWTk06VklFVE5BTTpIYWkgSHVuZzpLaW0gVGhpCis4OlZOOlZOTTpWSUVUTkFNOkhhaSBIdW5nOk15IFZhbgorOTpWTjpWTk06VklFVE5BTTpIYWkgSHVuZzpOYW0gVGhhbmgKKzEwOlZOOlZOTTpWSUVUTkFNOkhhaSBIdW5nOk5pbmggVGhhbmgKKzExOlZOOlZOTTpWSUVUTkFNOkhhaSBIdW5nOlBodSBUaWVuCisxMjpWTjpWTk06VklFVE5BTTpIYWkgSHVuZzpUdSBMb2MKKzE6Vk46Vk5NOlZJRVROQU06UXVhbmcgQmluaDpCbyBUcmFjaAorMjpWTjpWTk06VklFVE5BTTpRdWFuZyBCaW5oOkRvbmcgSG9pCiszOlZOOlZOTTpWSUVUTkFNOlF1YW5nIEJpbmg6TGUgVGh1eQorNDpWTjpWTk06VklFVE5BTTpRdWFuZyBCaW5oOk1pbmggSG9hCis1OlZOOlZOTTpWSUVUTkFNOlF1YW5nIEJpbmg6UXVhbmcgTmluaAorNjpWTjpWTk06VklFVE5BTTpRdWFuZyBCaW5oOlF1YW5nIFRyYWNoCis3OlZOOlZOTTpWSUVUTkFNOlF1YW5nIEJpbmg6VHV5ZW4gSG9hCisxOlZOOlZOTTpWSUVUTkFNOktpZW4gR2lhbmc6QW4gQmllbgorMjpWTjpWTk06VklFVE5BTTpLaWVuIEdpYW5nOkFuIE1pbmgKKzM6Vk46Vk5NOlZJRVROQU06S2llbiBHaWFuZzpDaGF1IFRoYW5oCis0OlZOOlZOTTpWSUVUTkFNOktpZW4gR2lhbmc6R2lvbmcgUmllbmcKKzU6Vk46Vk5NOlZJRVROQU06S2llbiBHaWFuZzpHbyBRdWFvCis2OlZOOlZOTTpWSUVUTkFNOktpZW4gR2lhbmc6SGEgVGllbgorNzpWTjpWTk06VklFVE5BTTpLaWVuIEdpYW5nOkhvbiBEYXQKKzg6Vk46Vk5NOlZJRVROQU06S2llbiBHaWFuZzpLaWVuIEhhaQorOTpWTjpWTk06VklFVE5BTTpLaWVuIEdpYW5nOlBodSBRdW9jCisxMDpWTjpWTk06VklFVE5BTTpLaWVuIEdpYW5nOlJhY2ggR2lhCisxMTpWTjpWTk06VklFVE5BTTpLaWVuIEdpYW5nOlRhbiBIaWVwCisxMjpWTjpWTk06VklFVE5BTTpLaWVuIEdpYW5nOlZpbmggVGh1YW4KKzE6Vk46Vk5NOlZJRVROQU06QmVuIFRyZTpCYSBUcmkKKzI6Vk46Vk5NOlZJRVROQU06QmVuIFRyZTpCaW5oIERhaQorMzpWTjpWTk06VklFVE5BTTpCZW4gVHJlOkNoYXUgVGhhbmgKKzQ6Vk46Vk5NOlZJRVROQU06QmVuIFRyZTpDaG8gTGFjaAorNTpWTjpWTk06VklFVE5BTTpCZW4gVHJlOkdpb25nIFRyb20KKzY6Vk46Vk5NOlZJRVROQU06QmVuIFRyZTpNbyBDYXkKKzc6Vk46Vk5NOlZJRVROQU06QmVuIFRyZTpUaGFuaCBQaHUKKzg6Vk46Vk5NOlZJRVROQU06QmVuIFRyZTpUeC5CZW4gVHJlCisxOlZOOlZOTTpWSUVUTkFNOlZpbmggUGh1OkRvYW4gSHVuZworMjpWTjpWTk06VklFVE5BTTpWaW5oIFBodTpMYXAgVGhhY2gKKzM6Vk46Vk5NOlZJRVROQU06VmluaCBQaHU6TWUgTGluaAorNDpWTjpWTk06VklFVE5BTTpWaW5oIFBodTpQaG9uZyBDaGF1Cis1OlZOOlZOTTpWSUVUTkFNOlZpbmggUGh1OlBodSBUaG8KKzY6Vk46Vk5NOlZJRVROQU06VmluaCBQaHU6U29uZyBUaGFvCis3OlZOOlZOTTpWSUVUTkFNOlZpbmggUGh1OlRhbSBEYW8KKzg6Vk46Vk5NOlZJRVROQU06VmluaCBQaHU6VGFtIFRoYW5oCis5OlZOOlZOTTpWSUVUTkFNOlZpbmggUGh1OlRoYW5oIEhvYQorMTA6Vk46Vk5NOlZJRVROQU06VmluaCBQaHU6VGhhbmggU29uCisxMTpWTjpWTk06VklFVE5BTTpWaW5oIFBodTpWaWV0IFRyaQorMTI6Vk46Vk5NOlZJRVROQU06VmluaCBQaHU6VmluaCBMYWMKKzEzOlZOOlZOTTpWSUVUTkFNOlZpbmggUGh1OlZpbmggWWVuCisxNDpWTjpWTk06VklFVE5BTTpWaW5oIFBodTpZZW4gTGFwCisxOlZOOlZOTTpWSUVUTkFNOkhvIENoaSBNaW5oIENpdHk6QmluaCBDaGFuaAorMjpWTjpWTk06VklFVE5BTTpIbyBDaGkgTWluaCBDaXR5OkN1IENoaQorMzpWTjpWTk06VklFVE5BTTpIbyBDaGkgTWluaCBDaXR5OkR1eWVuIEhhaQorNDpWTjpWTk06VklFVE5BTTpIbyBDaGkgTWluaCBDaXR5OkhvYyBNb24KKzU6Vk46Vk5NOlZJRVROQU06SG8gQ2hpIE1pbmggQ2l0eTpJbm5lciBDaXR5Cis2OlZOOlZOTTpWSUVUTkFNOkhvIENoaSBNaW5oIENpdHk6TmhhIEJlCis3OlZOOlZOTTpWSUVUTkFNOkhvIENoaSBNaW5oIENpdHk6VGh1IER1YworMTpWTjpWTk06VklFVE5BTTpLb24gVHVtOkRhYyBHbGF5CisyOlZOOlZOTTpWSUVUTkFNOktvbiBUdW06RGFjIFRvCiszOlZOOlZOTTpWSUVUTkFNOktvbiBUdW06S29uIFR1bQorNDpWTjpWTk06VklFVE5BTTpLb24gVHVtOktvbnBsb25nCis1OlZOOlZOTTpWSUVUTkFNOktvbiBUdW06U2EgVGhheQorMTpWTjpWTk06VklFVE5BTTpUaGFpIEJpbmg6RG9uZyBIdW5nCisyOlZOOlZOTTpWSUVUTkFNOlRoYWkgQmluaDpIdW5nIEhhCiszOlZOOlZOTTpWSUVUTkFNOlRoYWkgQmluaDpLaWVuIFh1b25nCis0OlZOOlZOTTpWSUVUTkFNOlRoYWkgQmluaDpRdXluaCBQaHUKKzU6Vk46Vk5NOlZJRVROQU06VGhhaSBCaW5oOlRoYWkgVGh1eQorNjpWTjpWTk06VklFVE5BTTpUaGFpIEJpbmg6VGllbiBIYWkKKzc6Vk46Vk5NOlZJRVROQU06VGhhaSBCaW5oOlR4LlRoYWkgQmluaAorODpWTjpWTk06VklFVE5BTTpUaGFpIEJpbmg6VnUgVGh1CisxOlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5pbmg6QmEgQ2hlCisyOlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5pbmg6QmluaCBMaWV1CiszOlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5pbmg6Q2FtIFBoYQorNDpWTjpWTk06VklFVE5BTTpRdWFuZyBOaW5oOkNhbSBQaGEgVG93bgorNTpWTjpWTk06VklFVE5BTTpRdWFuZyBOaW5oOkRvbmcgVHJpZXUKKzY6Vk46Vk5NOlZJRVROQU06UXVhbmcgTmluaDpIYWkgTmluaAorNzpWTjpWTk06VklFVE5BTTpRdWFuZyBOaW5oOkhvYW5oIEJvCis4OlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5pbmg6SG9uIEdhaQorOTpWTjpWTk06VklFVE5BTTpRdWFuZyBOaW5oOlF1YW5nIEhhCisxMDpWTjpWTk06VklFVE5BTTpRdWFuZyBOaW5oOlRpZW4gWWVuCisxMTpWTjpWTk06VklFVE5BTTpRdWFuZyBOaW5oOlVvbmcgQmkKKzEyOlZOOlZOTTpWSUVUTkFNOlF1YW5nIE5pbmg6WWVuIEh1bmcKKzE6Vk46Vk5NOlZJRVROQU06SGEgQmFjOkJhYyBHaWFuZworMjpWTjpWTk06VklFVE5BTTpIYSBCYWM6QmFjIE5pbmgKKzM6Vk46Vk5NOlZJRVROQU06SGEgQmFjOkdpYSBMdW9uZworNDpWTjpWTk06VklFVE5BTTpIYSBCYWM6SGllcCBIb2EKKzU6Vk46Vk5NOlZJRVROQU06SGEgQmFjOkxhbmcgR2lhbmcKKzY6Vk46Vk5NOlZJRVROQU06SGEgQmFjOkx1YyBOYW0KKzc6Vk46Vk5NOlZJRVROQU06SGEgQmFjOkx1YyBOZ2FuCis4OlZOOlZOTTpWSUVUTkFNOkhhIEJhYzpRdWUgVm8KKzk6Vk46Vk5NOlZJRVROQU06SGEgQmFjOlNvbiBEb25nCisxMDpWTjpWTk06VklFVE5BTTpIYSBCYWM6VGFuIFllbgorMTE6Vk46Vk5NOlZJRVROQU06SGEgQmFjOlRodWFuIFRoYW5oCisxMjpWTjpWTk06VklFVE5BTTpIYSBCYWM6VGllbiBTb24KKzEzOlZOOlZOTTpWSUVUTkFNOkhhIEJhYzpWaWV0IFllbgorMTQ6Vk46Vk5NOlZJRVROQU06SGEgQmFjOlllbiBEdW5nCisxNTpWTjpWTk06VklFVE5BTTpIYSBCYWM6WWVuIFBob25nCisxNjpWTjpWTk06VklFVE5BTTpIYSBCYWM6WWVuIFRoZQorMTpWTjpWTk06VklFVE5BTTpIb2EgQmluaDpEYSBCYWMKKzI6Vk46Vk5NOlZJRVROQU06SG9hIEJpbmg6S2ltIEJvaQorMzpWTjpWTk06VklFVE5BTTpIb2EgQmluaDpLeSBTb24KKzQ6Vk46Vk5NOlZJRVROQU06SG9hIEJpbmg6TGFjIFNvbgorNTpWTjpWTk06VklFVE5BTTpIb2EgQmluaDpMYWMgVGh1eQorNjpWTjpWTk06VklFVE5BTTpIb2EgQmluaDpMdW9uZyBTb24KKzc6Vk46Vk5NOlZJRVROQU06SG9hIEJpbmg6TWFpIENoYXUKKzg6Vk46Vk5NOlZJRVROQU06SG9hIEJpbmg6VGFuIExhYworOTpWTjpWTk06VklFVE5BTTpIb2EgQmluaDpUeC5Ib2EgQmluaAorMTA6Vk46Vk5NOlZJRVROQU06SG9hIEJpbmg6WWVuIFRodXkKKzE6Vk46Vk5NOlZJRVROQU06RGFjIExhYzpCdW9uIE1hIFRodWF0CisyOlZOOlZOTTpWSUVUTkFNOkRhYyBMYWM6Q2h1IEdpdXQKKzM6Vk46Vk5NOlZJRVROQU06RGFjIExhYzpDaHVtZ2FyCis0OlZOOlZOTTpWSUVUTkFNOkRhYyBMYWM6RGFjIE1pbgorNTpWTjpWTk06VklFVE5BTTpEYWMgTGFjOkRhayBOb25nCis2OlZOOlZOTTpWSUVUTkFNOkRhYyBMYWM6RGFrIFJsYXAKKzc6Vk46Vk5NOlZJRVROQU06RGFjIExhYzpFYWthcgorODpWTjpWTk06VklFVE5BTTpEYWMgTGFjOktyb25nYW5hCis5OlZOOlZOTTpWSUVUTkFNOkRhYyBMYWM6S3Jvbmdib25nCisxMDpWTjpWTk06VklFVE5BTTpEYWMgTGFjOktyb25nYnVjCisxMTpWTjpWTk06VklFVE5BTTpEYWMgTGFjOktyb25nbmFuZworMTI6Vk46Vk5NOlZJRVROQU06RGFjIExhYzpLcm9uZ25vCisxMzpWTjpWTk06VklFVE5BTTpEYWMgTGFjOktyb25ncGFjaAorMTQ6Vk46Vk5NOlZJRVROQU06RGFjIExhYzpMYWMKKzE1OlZOOlZOTTpWSUVUTkFNOkRhYyBMYWM6TSdEcmFrCisxNjpWTjpWTk06VklFVE5BTTpEYWMgTGFjOllhIEhsZW8KKzE3OlZOOlZOTTpWSUVUTkFNOkRhYyBMYWM6WWEgU3VwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1lFTS9ZRU1fQURNSU4xX0xFWC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1lFTS9ZRU1fQURNSU4xX0xFWC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxYjlmYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvWUVNL1lFTV9BRE1JTjFfTEVYLnR4dApAQCAtMCwwICsxLDIxIEBACisxOllFLUFCOllFOkFCWUFOCisyOllFLURBOllFOkFEIERMSQorMzpZRS1BRDpZRTpBREFOCis0OllFLUhKOllFOkFKSkFICis1OllFLUJBOllFOkFMIEJBWUEKKzY6WUUtSkE6WUU6QUwgSkFXRgorNzpZRS1NUjpZRTpBTCBNQUhSQUgKKzg6WUUtTVc6WUU6QUwgTUFXSVQKKzk6WUUtSFU6WUU6QUwgVURBWURBSAorMTA6WUUtQU06WUU6QU1STgorMTE6WUUtU046WUU6QU4KKzEyOllFLUhEOllFOkFSQU1BV1QKKzEzOllFLVNEOllFOkRBSAorMTQ6WUUtREg6WUU6REhBTUFSCisxNTpZRS1OOllFOkZPUk1FUiBOT1JUSCBZRU1FTgorMTY6WUUtUzpZRTpGT1JNRVIgU09VVEggWUVNRU4KKzE3OllFLUlCOllFOklCQgorMTg6WUUtTEE6WUU6TEFJSgorMTk6WUUtTUE6WUU6TUFSSUIKKzIwOllFLVNIOllFOlNIQUJXQUgKKzIxOllFLVRBOllFOlRJWloKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvWUVNL1lFTV9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvWUVNL1lFTV9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGYyZjNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9ZRU0vWUVNX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsOCBAQAorMTpZRTpZRU06WUVNRU46Rm9ybWVyIE5vcnRoIFllbWVuOk5vcnRoIFllbWVuICgxKQorMTpZRTpZRU06WUVNRU46Rm9ybWVyIFNvdXRoIFllbWVuOkFieWFuCisyOllFOllFTTpZRU1FTjpGb3JtZXIgU291dGggWWVtZW46QWRhbgorMzpZRTpZRU06WUVNRU46Rm9ybWVyIFNvdXRoIFllbWVuOkFsIE1haHJhaAorNDpZRTpZRU06WUVNRU46Rm9ybWVyIFNvdXRoIFllbWVuOkhhZHJhbWF3dAorNTpZRTpZRU06WUVNRU46Rm9ybWVyIFNvdXRoIFllbWVuOkxhaGlqCis2OllFOllFTTpZRU1FTjpGb3JtZXIgU291dGggWWVtZW46U2hhYndhaAorNzpZRTpZRU06WUVNRU46Rm9ybWVyIFNvdXRoIFllbWVuOlNvY290cmEKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvWkFGL1pBRl9BRE1JTjFfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvWkFGL1pBRl9BRE1JTjFfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWFlMzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9aQUYvWkFGX0FETUlOMV9MRVgudHh0CkBAIC0wLDAgKzEsMTMgQEAKKzE6WkEtRUM6WkE6RUFTVEVSTiBDQVBFIFtFQVNURVJOIFRWTF0KKzI6WkEtRlM6WkE6RlJFRSBTVEFURQorMzpaQS1HVDpaQTpHQVVURU5HCis0OlpBLU5MOlpBOktXQVpVTFUgTkFUQUwKKzU6WkEtTFA6WkE6TElNUE9QTworNjpaQS1NUDpaQTpNUFVNQUxBTkdBCis3OlpBLU5BVDpaQTpOQVRBTAorODpaQS1OVzpaQTpOT1JUSCBXRVNUCis5OlpBLU5DOlpBOk5PUlRIRVJOIENBUEUgW05PUlRIRVJOIFRWTF0KKzEwOlpBLU9SOlpBOk9SQU5HRQorMTE6WkEtT0ZTOlpBOk9SQU5HRSBGUkVFIFNUQVRFCisxMjpaQS1QV006WkE6UFdWCisxMzpaQS1XQzpaQTpXRVNURVJOIENBUEUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvWkFGL1pBRl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvWkFGL1pBRl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGFmNzVhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9aQUYvWkFGX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsMzc0IEBACisxOlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBUVkw6QW1lcnNmb3J0CisyOlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBUVkw6QmFsZm91cgorMzpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gVFZMOkJhcmJlcnRvbgorNDpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gVFZMOkJlbGZhc3QKKzU6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIFRWTDpCZXRoYWwKKzY6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIFRWTDpDYXJvbGluYQorNzpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gVFZMOkRlbG1hcworODpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gVFZMOkVlcnN0ZWhvZWsKKzk6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIFRWTDpFcm1lbG8KKzEwOlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBUVkw6R3JvYmxlcnNkYWwKKzExOlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBUVkw6SG9ldmVsZHJpZgorMTI6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIFRWTDpMeWRlbmJ1cmcKKzEzOlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBUVkw6TWR1dGphbmEKKzE0OlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBUVkw6TWlkZGVsc2J1cmcKKzE1OlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBUVkw6TW91dHNlCisxNjpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gVFZMOk5lbHNwcnVpdAorMTc6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIFRWTDpQaWV0IFJldGllZgorMTg6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIFRWTDpTdGFuZGVydG9uCisxOTpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gVFZMOlZvbGtzcnVzdAorMjA6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIFRWTDpXYWtrZXJzdHJvb20KKzIxOlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBUVkw6V2F0ZXJ2YWwgQm92ZW4KKzIyOlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBUVkw6V2l0YmFuaworMjM6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIFRWTDpXaXRyaXZlcgorMjQ6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIFRWTDpaQUYuTDIuNzgKKzI1OlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBUVkw6WkFGLkwyLjc5CisyNjpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gVFZMOlpBRi5MMi44MAorMjc6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIFRWTDpaQUYuTDIuODEKKzI4OlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBUVkw6WkFGLkwyLjgyCisyOTpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gVFZMOlpBRi5MMi44MworMzA6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIFRWTDpaQUYuTDIuODQKKzMxOlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBUVkw6WkFGLkwyLjg1CiszMjpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gVFZMOlpBRi5MMi44NgorMTpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIENhcGU6QmFya2x5IFdlc3QKKzI6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBDYXBlOkJyaXRzdG93bgorMzpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIENhcGU6Q2FsdmluaWEKKzQ6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBDYXBlOkNhcm5hcnZvbgorNTpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIENhcGU6Q29sZXNiZXJnCis2OlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gQ2FwZTpEZSBBYXIKKzc6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBDYXBlOkZyYXNlcmJ1cmcKKzg6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBDYXBlOkdvcmRvbmlhCis5OlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gQ2FwZTpIYW5vdmVyCisxMDpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIENhcGU6SGFydHN3YXRlcgorMTE6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBDYXBlOkhheQorMTI6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBDYXBlOkhlcmJlcnQKKzEzOlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gQ2FwZTpIb3BldG93bgorMTQ6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBDYXBlOktlbmhhcmR0CisxNTpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIENhcGU6S2ltYmVybGV5CisxNjpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIENhcGU6S3VydW1hbgorMTc6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBDYXBlOk5hbWFrd2FsYW5kCisxODpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIENhcGU6Tm91cG9vcnQKKzE5OlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gQ2FwZTpQaGlsaXBzdG93bgorMjA6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBDYXBlOlBvc3RtYXNidXJnCisyMTpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIENhcGU6UHJpZXNrYQorMjI6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBDYXBlOlJpY2htb25kCisyMzpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIENhcGU6U3V0aGVybGFuZAorMjQ6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBDYXBlOlZpY3RvcmlhIFdlc3QKKzI1OlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gQ2FwZTpXYWx2aXMgQmF5CisyNjpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIENhcGU6V2FycmVudG9uCisyNzpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIENhcGU6V2lsbGlzdG9uCisxOlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6QWxmcmVkCisyOlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6QmFiYW5hbmdvCiszOlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6QmVyZ3ZpbGxlCis0OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6Q2FtcGVyIERvd24KKzU6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpEYW5uaGF1c2VyCis2OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6RHVuZGVlCis3OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6RHVyYmFuL0NoYXRzLgorODpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOkVtYnVtYnVsdQorOTpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOkVzaG93ZQorMTA6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpFc3Rjb3VydAorMTE6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpFemluZ29sd2VuaQorMTI6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpHbGVuY29lCisxMzpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOkhsYWJpc2EKKzE0OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6SW5hbmRhCisxNTpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOkluZ3dhdnVtYQorMTY6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpJeG9wbworMTc6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpLbGlwcml2ZXIKKzE4OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6S3JhbnNrb3AKKzE5OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6TGlvbiBSaXZlcgorMjA6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpMb3dlciBUdWd1bGEKKzIxOlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6TG93ZXIgVW1mb2xvemkKKzIyOlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6TWFobGFiYXRpbmkKKzIzOlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6TWFwdW11bG8KKzI0OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6TW9vaXJpdmllcgorMjU6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpNb3VudCBDdXJyaWUKKzI2OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6TXBlbmRsZQorMjc6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpNc2luZ2EKKzI4OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6TXRvbmphbmVuaQorMjk6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpNdHVuemluaQorMzA6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpOZHdlZHdlCiszMTpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOk5ldyBIYW5vdmVyCiszMjpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOk5ld2Nhc3RsZQorMzM6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpOZ290c2hlCiszNDpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOk5rYW5kYWxhCiszNTpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOk5vbmdvbWEKKzM2OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6TnF1dHUKKzM3OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6UGF1bHBpZXRlcnNidXJnCiszODpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlBpZXRlcm1hcml0emJ1cmcKKzM5OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6UGluZXRvd24KKzQwOlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6UG9sZWxhCis0MTpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlBvcnQgU2hlcHN0b25lCis0MjpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlJpY2htb25kCis0MzpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlVib21ibworNDQ6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpVbXZvdGkKKzQ1OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6VW16aW50bworNDY6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpVbmRlcmJlcmcKKzQ3OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6VXRyZWNodAorNDg6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpWcnloZWlkCis0OTpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlZ1bGFtLi9FbXp1bWJlCis1MDpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOldlZW5lbgorNTE6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpaQUYuTDIuMzAKKzUyOlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6WkFGLkwyLjMxCis1MzpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlpBRi5MMi4zMgorNTQ6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpaQUYuTDIuMzMKKzU1OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6WkFGLkwyLjM0Cis1NjpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlpBRi5MMi4zNQorNTc6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpaQUYuTDIuMzYKKzU4OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6WkFGLkwyLjM3Cis1OTpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlpBRi5MMi4zOAorNjA6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpaQUYuTDIuMzkKKzYxOlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6WkFGLkwyLjQwCis2MjpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlpBRi5MMi40MQorNjM6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpaQUYuTDIuNDIKKzY0OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6WkFGLkwyLjQzCis2NTpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlpBRi5MMi40NAorNjY6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpaQUYuTDIuNDUKKzY3OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6WkFGLkwyLjQ2Cis2ODpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlpBRi5MMi40NworNjk6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpaQUYuTDIuNDgKKzcwOlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6WkFGLkwyLjQ5Cis3MTpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlpBRi5MMi41MAorNzI6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpaQUYuTDIuNTEKKzczOlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6WkFGLkwyLjUyCis3NDpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlpBRi5MMi41MworNzU6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpaQUYuTDIuNTQKKzc2OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6WkFGLkwyLjU1Cis3NzpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlpBRi5MMi41NgorNzg6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpaQUYuTDIuNTcKKzc5OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6WkFGLkwyLjU4Cis4MDpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlpBRi5MMi41OQorODE6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpaQUYuTDIuNjAKKzgyOlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6WkFGLkwyLjYxCis4MzpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlpBRi5MMi42MgorODQ6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpaQUYuTDIuNjMKKzg1OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6WkFGLkwyLjY0Cis4NjpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlpBRi5MMi42NQorODc6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpaQUYuTDIuNjYKKzg4OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6WkFGLkwyLjY3Cis4OTpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlpBRi5MMi42OAorOTA6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpaQUYuTDIuNjkKKzkxOlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6WkFGLkwyLjcwCis5MjpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlpBRi5MMi43MQorOTM6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpaQUYuTDIuNzIKKzk0OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6WkFGLkwyLjczCis5NTpaQTpaQUY6U09VVEggQUZSSUNBOk5hdGFsOlpBRi5MMi43NAorOTY6WkE6WkFGOlNPVVRIIEFGUklDQTpOYXRhbDpaQUYuTDIuNzUKKzk3OlpBOlpBRjpTT1VUSCBBRlJJQ0E6TmF0YWw6WkFGLkwyLjc2CisxOlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGggV2VzdDpCcml0cworMjpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoIFdlc3Q6Q29saWdueQorMzpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoIFdlc3Q6RGVsYXJleXZpbGxlCis0OlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGggV2VzdDpLbGVya3Nkb3JwCis1OlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGggV2VzdDpLb3N0ZXIKKzY6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aCBXZXN0OkxpY2h0ZW5idXJnCis3OlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGggV2VzdDpNYXJpY28KKzg6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aCBXZXN0OlBvdGNoZWZzdHJvb20KKzk6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aCBXZXN0OlJ1c3RlbmJ1cmcKKzEwOlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGggV2VzdDpTY2h3ZWl6ZXIgUi4KKzExOlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGggV2VzdDpTd2FydHJ1Z2dlbgorMTI6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aCBXZXN0OlZlbnRlcnNkb3JwCisxMzpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoIFdlc3Q6VnJ5YnVyZworMTQ6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aCBXZXN0OlZyeWJ1cmcgMS9NYWZla2luZyAxCisxNTpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoIFdlc3Q6V29sbWFyYW5zc3RhZAorMTY6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aCBXZXN0OlpBRi5MMi4xCisxNzpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoIFdlc3Q6WkFGLkwyLjIKKzE4OlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGggV2VzdDpaQUYuTDIuMworMTk6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aCBXZXN0OlpBRi5MMi40CisyMDpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoIFdlc3Q6WkFGLkwyLjUKKzIxOlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGggV2VzdDpaQUYuTDIuNgorMTpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIFRWTDpCb2NodW0KKzI6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBUVkw6Qm9sb2JlZHUKKzM6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBUVkw6R2l5YW5pCis0OlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gVFZMOkxldGFiYQorNTpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIFRWTDpNYWxhbXVlbGUKKzY6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBUVkw6TWVzc2luYQorNzpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIFRWTDpNb2tlcm9uZworODpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIFRWTDpOYXBodW5vCis5OlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gVFZMOk5lYm8KKzEwOlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gVFZMOlBpZXRlcnNidXJnCisxMTpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIFRWTDpQaWxncmltJ3MgUmVzdAorMTI6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBUVkw6UG90Z2lldGVyc3J1cworMTM6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBUVkw6Uml0YXZpCisxNDpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIFRWTDpTZWtnb3Nlc2UKKzE1OlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gVFZMOlNla2h1a2h1bmVsYW5kCisxNjpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIFRWTDpTZXNoZWdvCisxNzpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIFRWTDpTb3V0cGFuc2JlcmcKKzE4OlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gVFZMOlRoYWJhbW9vcG8KKzE5OlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gVFZMOlRoYWJhemltYmkKKzIwOlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gVFZMOldhcm1iYWQKKzIxOlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gVFZMOldhdGVyYmVyZworMjI6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBUVkw6WkFGLkwyLjEwCisyMzpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIFRWTDpaQUYuTDIuMTEKKzI0OlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gVFZMOlpBRi5MMi4xMgorMjU6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBUVkw6WkFGLkwyLjEzCisyNjpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIFRWTDpaQUYuTDIuMTQKKzI3OlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gVFZMOlpBRi5MMi4xNQorMjg6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBUVkw6WkFGLkwyLjE2CisyOTpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIFRWTDpaQUYuTDIuMTcKKzMwOlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gVFZMOlpBRi5MMi4xOAorMzE6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBUVkw6WkFGLkwyLjE5CiszMjpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIFRWTDpaQUYuTDIuMjAKKzMzOlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gVFZMOlpBRi5MMi4yMQorMzQ6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBUVkw6WkFGLkwyLjIyCiszNTpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIFRWTDpaQUYuTDIuMjMKKzM2OlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gVFZMOlpBRi5MMi4yNAorMzc6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBUVkw6WkFGLkwyLjI1CiszODpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIFRWTDpaQUYuTDIuMjYKKzM5OlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gVFZMOlpBRi5MMi4yNworNDA6WkE6WkFGOlNPVVRIIEFGUklDQTpOb3J0aGVybiBUVkw6WkFGLkwyLjcKKzQxOlpBOlpBRjpTT1VUSCBBRlJJQ0E6Tm9ydGhlcm4gVFZMOlpBRi5MMi44Cis0MjpaQTpaQUY6U09VVEggQUZSSUNBOk5vcnRoZXJuIFRWTDpaQUYuTDIuOQorMTpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpBYmVyZGVlbgorMjpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpBZGVsYWlkZQorMzpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpBbGJhbnkKKzQ6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIENhcGU6QWxiZXJ0Cis1OlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBDYXBlOkFsZXhhbmRyaWEKKzY6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIENhcGU6QWxpd2FsIE5vcnRoCis3OlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBDYXBlOkJhcmtseSBFYXN0Cis4OlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBDYXBlOkJhdGh1cnN0Cis5OlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBDYXBlOkJlZGZvcmQKKzEwOlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBDYXBlOkNoYXRjYXJ0CisxMTpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpDcmFkb2NrCisxMjpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpFYXN0IExvbmRvbgorMTM6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIENhcGU6RWxsaW90CisxNDpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpGb3J0IEJlYXVmb3J0CisxNTpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpHcmFhZmYtUmVpbmV0CisxNjpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpIYW5rZXkKKzE3OlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBDYXBlOkhvZm1leXIKKzE4OlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBDYXBlOkh1bWFuc2RvcnAKKzE5OlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBDYXBlOkluZHdlCisyMDpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpKYW5zZW52aWxsZQorMjE6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIENhcGU6Sm91YmVydGluYQorMjI6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIENhcGU6S2luZyBXaWxsaWFtIFRvd24KKzIzOlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBDYXBlOktpcmt3b29kCisyNDpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpLb21nYQorMjU6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIENhcGU6TGFkeSBHcmV5CisyNjpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpNYWNsZWFyCisyNzpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpNZGFudHNhbmUKKzI4OlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBDYXBlOk1kYW50c2FuZSA0CisyOTpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpNaWRkbGVidXJnCiszMDpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpNb2x0ZW5vCiszMTpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpNb3VudCBDdXJyaWUKKzMyOlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBDYXBlOlBlYXJzdG9uCiszMzpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpQb3J0IEVsaXNhYmV0aAorMzQ6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIENhcGU6UXVlZW5zdG93bgorMzU6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIENhcGU6U29tZXJzZXQgRWFzdAorMzY6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIENhcGU6U3RlcmtzdHJvb20KKzM3OlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBDYXBlOlN0ZXlsZXJ2aWxsZQorMzg6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIENhcGU6U3RleW5zYnVyZworMzk6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIENhcGU6U3RvY2hlbnN0cm9tCis0MDpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpTdXR0ZXJoZWltCis0MTpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpUYXJrYXN0YWQKKzQyOlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBDYXBlOlVpdGVuaGFnZQorNDM6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIENhcGU6VmV0ZXJzdGFkCis0NDpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpWaWN0b3JpYSBFYXN0Cis0NTpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpXaWxsb3dtb3JlCis0NjpaQTpaQUY6U09VVEggQUZSSUNBOkVhc3Rlcm4gQ2FwZTpXb2RlaG91c2UKKzQ3OlpBOlpBRjpTT1VUSCBBRlJJQ0E6RWFzdGVybiBDYXBlOlpBRi5MMi4yOAorNDg6WkE6WkFGOlNPVVRIIEFGUklDQTpFYXN0ZXJuIENhcGU6WkFGLkwyLjI5CisxOlpBOlpBRjpTT1VUSCBBRlJJQ0E6UFdWOkFsYmVydG9uCisyOlpBOlpBRjpTT1VUSCBBRlJJQ0E6UFdWOkJlbm9uaQorMzpaQTpaQUY6U09VVEggQUZSSUNBOlBXVjpCb2tzYnVyZworNDpaQTpaQUY6U09VVEggQUZSSUNBOlBXVjpCcmFrcGFuCis1OlpBOlpBRjpTT1VUSCBBRlJJQ0E6UFdWOkJyb25raG9yc3RzcHJ1aXQKKzY6WkE6WkFGOlNPVVRIIEFGUklDQTpQV1Y6Q3VsbGluYW4KKzc6WkE6WkFGOlNPVVRIIEFGUklDQTpQV1Y6R2VybWlzdG9uCis4OlpBOlpBRjpTT1VUSCBBRlJJQ0E6UFdWOkhlaWRlbGJlcmcKKzk6WkE6WkFGOlNPVVRIIEFGUklDQTpQV1Y6Sm9oYW5uZXNidXJnCisxMDpaQTpaQUY6U09VVEggQUZSSUNBOlBXVjpLZW1wdG9uIFBhcmsKKzExOlpBOlpBRjpTT1VUSCBBRlJJQ0E6UFdWOktydWdlcnNkb3JwCisxMjpaQTpaQUY6U09VVEggQUZSSUNBOlBXVjpOaWdlbAorMTM6WkE6WkFGOlNPVVRIIEFGUklDQTpQV1Y6T2JlcmhvbHplcgorMTQ6WkE6WkFGOlNPVVRIIEFGUklDQTpQV1Y6UHJldG9yaWEKKzE1OlpBOlpBRjpTT1VUSCBBRlJJQ0E6UFdWOlJhbmRidXJnCisxNjpaQTpaQUY6U09VVEggQUZSSUNBOlBXVjpSYW5kZm9udGVpbgorMTc6WkE6WkFGOlNPVVRIIEFGUklDQTpQV1Y6Um9vZGUgUG9ydAorMTg6WkE6WkFGOlNPVVRIIEFGUklDQTpQV1Y6U3ByaW5ncworMTk6WkE6WkFGOlNPVVRIIEFGUklDQTpQV1Y6VmFuZGVyYmlqbCBQLgorMjA6WkE6WkFGOlNPVVRIIEFGUklDQTpQV1Y6VmVyZWVuaWdpbmcKKzIxOlpBOlpBRjpTT1VUSCBBRlJJQ0E6UFdWOldlc3RvbmFyaWEKKzIyOlpBOlpBRjpTT1VUSCBBRlJJQ0E6UFdWOldvbmRlcmJvb20KKzE6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2U6V2l0emllc2hvZWsgKFFhcXdhKQorMTpaQTpaQUY6U09VVEggQUZSSUNBOk9yYW5nZSBGcmVlIFN0YXRlOkJldGhsZWhlbQorMjpaQTpaQUY6U09VVEggQUZSSUNBOk9yYW5nZSBGcmVlIFN0YXRlOkJldGh1bGllCiszOlpBOlpBRjpTT1VUSCBBRlJJQ0E6T3JhbmdlIEZyZWUgU3RhdGU6QmxvZW1mb250ZWluL0JvdHMKKzQ6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpCby9KYWsvS29mL0ZhdQorNTpaQTpaQUY6U09VVEggQUZSSUNBOk9yYW5nZSBGcmVlIFN0YXRlOkJvdGhhdmlsbGUKKzY6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpCcmFuZGZvcnQKKzc6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpCdWxmb250ZWluCis4OlpBOlpBRjpTT1VUSCBBRlJJQ0E6T3JhbmdlIEZyZWUgU3RhdGU6Q2xvY29sYW4KKzk6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpEZXd0cyBEb29ycAorMTA6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpFZGVuYnVyZworMTE6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpFeGNlbHNpb3IKKzEyOlpBOlpBRjpTT1VUSCBBRlJJQ0E6T3JhbmdlIEZyZWUgU3RhdGU6Rmlja3NidXJnCisxMzpaQTpaQUY6U09VVEggQUZSSUNBOk9yYW5nZSBGcmVlIFN0YXRlOkZvdXJpZXNidXJnCisxNDpaQTpaQUY6U09VVEggQUZSSUNBOk9yYW5nZSBGcmVlIFN0YXRlOkZyYW5rZm9ydAorMTU6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpIYXJyaXNtaXRoCisxNjpaQTpaQUY6U09VVEggQUZSSUNBOk9yYW5nZSBGcmVlIFN0YXRlOkhlaWxicm9uCisxNzpaQTpaQUY6U09VVEggQUZSSUNBOk9yYW5nZSBGcmVlIFN0YXRlOkhlbm5lbm1hbgorMTg6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpIb29wc3RhZAorMTk6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpKYWdlcnNmb250ZWluCisyMDpaQTpaQUY6U09VVEggQUZSSUNBOk9yYW5nZSBGcmVlIFN0YXRlOktvcHBpZXMKKzIxOlpBOlpBRjpTT1VUSCBBRlJJQ0E6T3JhbmdlIEZyZWUgU3RhdGU6S3Jvb25zdGFkCisyMjpaQTpaQUY6U09VVEggQUZSSUNBOk9yYW5nZSBGcmVlIFN0YXRlOkxhZHlicmFuZAorMjM6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpMaW5kbGV5CisyNDpaQTpaQUY6U09VVEggQUZSSUNBOk9yYW5nZSBGcmVlIFN0YXRlOk1hcnF1YXJkCisyNTpaQTpaQUY6U09VVEggQUZSSUNBOk9yYW5nZSBGcmVlIFN0YXRlOk9kZW5kYWFsc3J1cworMjY6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpQYXJ5cworMjc6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpQZXRydXNidXJnCisyODpaQTpaQUY6U09VVEggQUZSSUNBOk9yYW5nZSBGcmVlIFN0YXRlOlBoaWxpcHBvbGlzCisyOTpaQTpaQUY6U09VVEggQUZSSUNBOk9yYW5nZSBGcmVlIFN0YXRlOlJlZGRlc3NidXJnCiszMDpaQTpaQUY6U09VVEggQUZSSUNBOk9yYW5nZSBGcmVlIFN0YXRlOlJlaXR6CiszMTpaQTpaQUY6U09VVEggQUZSSUNBOk9yYW5nZSBGcmVlIFN0YXRlOlJvdXh2aWxsZQorMzI6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpTYXNvbHNidXJnCiszMzpaQTpaQUY6U09VVEggQUZSSUNBOk9yYW5nZSBGcmVlIFN0YXRlOlNlbmVrYWwKKzM0OlpBOlpBRjpTT1VUSCBBRlJJQ0E6T3JhbmdlIEZyZWUgU3RhdGU6U21pdGhmaWVsZAorMzU6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpUaGV1bmlzc2VuCiszNjpaQTpaQUY6U09VVEggQUZSSUNBOk9yYW5nZSBGcmVlIFN0YXRlOlRyb21wc2J1cmcKKzM3OlpBOlpBRjpTT1VUSCBBRlJJQ0E6T3JhbmdlIEZyZWUgU3RhdGU6VmVudGVyc2J1cmcKKzM4OlpBOlpBRjpTT1VUSCBBRlJJQ0E6T3JhbmdlIEZyZWUgU3RhdGU6Vmlsam9lbnNrcm9vbgorMzk6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpWcmVkZQorNDA6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpWcmVkZWZvcnQKKzQxOlpBOlpBRjpTT1VUSCBBRlJJQ0E6T3JhbmdlIEZyZWUgU3RhdGU6V2VwZW5lcgorNDI6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpXZXNzZWxzIEJyb24KKzQzOlpBOlpBRjpTT1VUSCBBRlJJQ0E6T3JhbmdlIEZyZWUgU3RhdGU6V2luYnVyZworNDQ6WkE6WkFGOlNPVVRIIEFGUklDQTpPcmFuZ2UgRnJlZSBTdGF0ZTpaQUYuTDIuNzcKKzQ1OlpBOlpBRjpTT1VUSCBBRlJJQ0E6T3JhbmdlIEZyZWUgU3RhdGU6WmFzdHJvbgorMTpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpCZWF1Zm9ydCBXZXN0CisyOlpBOlpBRjpTT1VUSCBBRlJJQ0E6V2VzdGVybiBDYXBlOkJlbGxldmlsbGUKKzM6WkE6WkFGOlNPVVRIIEFGUklDQTpXZXN0ZXJuIENhcGU6QnJlZGFzZG9ycAorNDpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpDYWxlZG9uCis1OlpBOlpBRjpTT1VUSCBBRlJJQ0E6V2VzdGVybiBDYXBlOkNhbGl0emRvcnAKKzY6WkE6WkFGOlNPVVRIIEFGUklDQTpXZXN0ZXJuIENhcGU6Q2FwZQorNzpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpDZXJlcworODpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpDbGFud2lsbGlhbgorOTpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpHZW9yZ2UKKzEwOlpBOlpBRjpTT1VUSCBBRlJJQ0E6V2VzdGVybiBDYXBlOkdvb2R3b29kCisxMTpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpIZWlkZWxiZXJnCisxMjpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpIZXJtYW51cworMTM6WkE6WkFGOlNPVVRIIEFGUklDQTpXZXN0ZXJuIENhcGU6SG9wZWZpZWxkCisxNDpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpLbnlzbmEKKzE1OlpBOlpBRjpTT1VUSCBBRlJJQ0E6V2VzdGVybiBDYXBlOkt1aWxzcml2ZXIKKzE2OlpBOlpBRjpTT1VUSCBBRlJJQ0E6V2VzdGVybiBDYXBlOkxhZGlzbWl0aAorMTc6WkE6WkFGOlNPVVRIIEFGUklDQTpXZXN0ZXJuIENhcGU6TGFpbmdzYnVyZworMTg6WkE6WkFGOlNPVVRIIEFGUklDQTpXZXN0ZXJuIENhcGU6TWFsbWVzYnVyeQorMTk6WkE6WkFGOlNPVVRIIEFGUklDQTpXZXN0ZXJuIENhcGU6TW9udGFndQorMjA6WkE6WkFGOlNPVVRIIEFGUklDQTpXZXN0ZXJuIENhcGU6TW9zc2VsIEJhYWkKKzIxOlpBOlpBRjpTT1VUSCBBRlJJQ0E6V2VzdGVybiBDYXBlOk11cnJheXNidXJnCisyMjpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpPdWR0c2hvb3JuCisyMzpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpQYWFybAorMjQ6WkE6WkFGOlNPVVRIIEFGUklDQTpXZXN0ZXJuIENhcGU6UGlrZXRiZXJnCisyNTpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpQcmluY2UgQWxiZXJ0CisyNjpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpSaXZlcnNkYWxlCisyNzpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpSb2JlcnRzb24KKzI4OlpBOlpBRjpTT1VUSCBBRlJJQ0E6V2VzdGVybiBDYXBlOlNpbW9uc3Rvd24KKzI5OlpBOlpBRjpTT1VUSCBBRlJJQ0E6V2VzdGVybiBDYXBlOlN0ZWxsZW5ib3NjaAorMzA6WkE6WkFGOlNPVVRIIEFGUklDQTpXZXN0ZXJuIENhcGU6U3RyYW5kCiszMTpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpTd2VsbGVuZGFtCiszMjpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpUdWxiYWdoCiszMzpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpVbmlvbmRhbGUKKzM0OlpBOlpBRjpTT1VUSCBBRlJJQ0E6V2VzdGVybiBDYXBlOlZhbmh5bnNkb3JwCiszNTpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpWcmVkZW5idXJnCiszNjpaQTpaQUY6U09VVEggQUZSSUNBOldlc3Rlcm4gQ2FwZTpWcmVkZW5kYWwKKzM3OlpBOlpBRjpTT1VUSCBBRlJJQ0E6V2VzdGVybiBDYXBlOldlbGxpbmd0b24KKzM4OlpBOlpBRjpTT1VUSCBBRlJJQ0E6V2VzdGVybiBDYXBlOldpbmJlcmcKKzM5OlpBOlpBRjpTT1VUSCBBRlJJQ0E6V2VzdGVybiBDYXBlOldvcmNlc3RlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9aTUIvWk1CX0FETUlOMV9MRVgudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9aTUIvWk1CX0FETUlOMV9MRVgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNTAxMGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy9zb3J0L1pNQi9aTUJfQURNSU4xX0xFWC50eHQKQEAgLTAsMCArMSwxNCBAQAorMTpaTS0wMjpaTTpDRU5UUkFMCisyOlpNLUMzOlpNOkNFTlRSQUwzCiszOlpNLTA4OlpNOkNPUFBFUkJFTFQKKzQ6Wk0tMDM6Wk06RUFTVEVSTgorNTpaTS1FNDpaTTpFQVNURVJONAorNjpaTS0wNDpaTTpMVUFQVUxBCis3OlpNLTA5OlpNOkxVU0FLQQorODpaTS0wNjpaTTpOT1JUSCBXRVNURVJOCis5OlpNLTA1OlpNOk5PUlRIRVJOCisxMDpaTS1ONDpaTTpOT1JUSEVSTjQKKzExOlpNLTA3OlpNOlNPVVRIRVJOCisxMjpaTS1TMzpaTTpTT1VUSEVSTjMKKzEzOlpNLTA6Wk06V0VTVEVSTgorMTQ6Wk0tVzQ6Wk06V0VTVEVSTjQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvWk1CL1pNQl9BRE1JTjJfTEVYLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3NvcnQvWk1CL1pNQl9BRE1JTjJfTEVYLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzAwMjViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvc29ydC9aTUIvWk1CX0FETUlOMl9MRVgudHh0CkBAIC0wLDAgKzEsNTcgQEAKKzE6Wk06Wk1COlpBTUJJQTpTb3V0aGVybjpDaG9tYQorMjpaTTpaTUI6WkFNQklBOlNvdXRoZXJuOkd3ZW1iZQorMzpaTTpaTUI6WkFNQklBOlNvdXRoZXJuOkthbG9tbworNDpaTTpaTUI6WkFNQklBOlNvdXRoZXJuOkxpdmluZ3N0b25lCis1OlpNOlpNQjpaQU1CSUE6U291dGhlcm46TWF6YWJ1a2EKKzY6Wk06Wk1COlpBTUJJQTpTb3V0aGVybjpNb256ZQorNzpaTTpaTUI6WkFNQklBOlNvdXRoZXJuOk5hbXdhbGEKKzg6Wk06Wk1COlpBTUJJQTpTb3V0aGVybjpTaWF2b25nYQorOTpaTTpaTUI6WkFNQklBOlNvdXRoZXJuOlNpbmF6b25nd2UKKzE6Wk06Wk1COlpBTUJJQTpDb3BwZXJiZWx0OkNoaWxpbGJvbWJ3ZQorMjpaTTpaTUI6WkFNQklBOkNvcHBlcmJlbHQ6Q2hpbmdvbGEKKzM6Wk06Wk1COlpBTUJJQTpDb3BwZXJiZWx0OkthbHVsaXNoaQorNDpaTTpaTUI6WkFNQklBOkNvcHBlcmJlbHQ6S2l0d2UKKzU6Wk06Wk1COlpBTUJJQTpDb3BwZXJiZWx0Okx1YW5zaHlhCis2OlpNOlpNQjpaQU1CSUE6Q29wcGVyYmVsdDpNdWZ1bGlyYQorNzpaTTpaTUI6WkFNQklBOkNvcHBlcmJlbHQ6TmRvbGEgUnVyYWwKKzg6Wk06Wk1COlpBTUJJQTpDb3BwZXJiZWx0Ok5kb2xhIFVyYmFuCisxOlpNOlpNQjpaQU1CSUE6THVhcHVsYTpLYXdhbWJ3YQorMjpaTTpaTUI6WkFNQklBOkx1YXB1bGE6TWFuc2EKKzM6Wk06Wk1COlpBTUJJQTpMdWFwdWxhOk13ZW5zZQorNDpaTTpaTUI6WkFNQklBOkx1YXB1bGE6TmNoZWxlbmdlCis1OlpNOlpNQjpaQU1CSUE6THVhcHVsYTpTYW1maXlhCisxOlpNOlpNQjpaQU1CSUE6THVzYWthOkx1YW5nd2EKKzI6Wk06Wk1COlpBTUJJQTpMdXNha2E6THVzYWthIFJ1cmFsCiszOlpNOlpNQjpaQU1CSUE6THVzYWthOkx1c2FrYSBVcmJhbgorMTpaTTpaTUI6WkFNQklBOkNlbnRyYWw6S2Fid2UgUnVyYWwKKzI6Wk06Wk1COlpBTUJJQTpDZW50cmFsOkthYndlIFVyYmFuCiszOlpNOlpNQjpaQU1CSUE6Q2VudHJhbDpNa3VzaGkKKzQ6Wk06Wk1COlpBTUJJQTpDZW50cmFsOk11bWJ3YQorNTpaTTpaTUI6WkFNQklBOkNlbnRyYWw6U2VyZW5qZQorMTpaTTpaTUI6WkFNQklBOldlc3Rlcm46S2FsYWJvCisyOlpNOlpNQjpaQU1CSUE6V2VzdGVybjpLYW9tYQorMzpaTTpaTUI6WkFNQklBOldlc3Rlcm46THVrdWx1Cis0OlpNOlpNQjpaQU1CSUE6V2VzdGVybjpNb25ndQorNTpaTTpaTUI6WkFNQklBOldlc3Rlcm46U2VuYW5nYQorNjpaTTpaTUI6WkFNQklBOldlc3Rlcm46U2VzaGVrZQorMTpaTTpaTUI6WkFNQklBOk5vcnRoIFdlc3Rlcm46S2Fib21wbworMjpaTTpaTUI6WkFNQklBOk5vcnRoIFdlc3Rlcm46S2FzZW1wYQorMzpaTTpaTUI6WkFNQklBOk5vcnRoIFdlc3Rlcm46TXVmdW1id2UKKzQ6Wk06Wk1COlpBTUJJQTpOb3J0aCBXZXN0ZXJuOk13aW5pbHVuZ2EKKzU6Wk06Wk1COlpBTUJJQTpOb3J0aCBXZXN0ZXJuOlNvbHdlemkKKzY6Wk06Wk1COlpBTUJJQTpOb3J0aCBXZXN0ZXJuOlphbWJlemkKKzE6Wk06Wk1COlpBTUJJQTpOb3J0aGVybjpDaGlsdWJpCisyOlpNOlpNQjpaQU1CSUE6Tm9ydGhlcm46Q2hpbnNhbGkKKzM6Wk06Wk1COlpBTUJJQTpOb3J0aGVybjpJc29rYQorNDpaTTpaTUI6WkFNQklBOk5vcnRoZXJuOkthcHV0YQorNTpaTTpaTUI6WkFNQklBOk5vcnRoZXJuOkthc2FtYQorNjpaTTpaTUI6WkFNQklBOk5vcnRoZXJuOkx1d2luZ3UKKzc6Wk06Wk1COlpBTUJJQTpOb3J0aGVybjpNYmFsYQorODpaTTpaTUI6WkFNQklBOk5vcnRoZXJuOk1waWthCis5OlpNOlpNQjpaQU1CSUE6Tm9ydGhlcm46TXBvcm9rb3NvCisxOlpNOlpNQjpaQU1CSUE6RWFzdGVybjpDaGFkaXphCisyOlpNOlpNQjpaQU1CSUE6RWFzdGVybjpDaGFtYQorMzpaTTpaTUI6WkFNQklBOkVhc3Rlcm46Q2hpcGF0YQorNDpaTTpaTUI6WkFNQklBOkVhc3Rlcm46S2F0ZXRlCis1OlpNOlpNQjpaQU1CSUE6RWFzdGVybjpMdW5kYXppCis2OlpNOlpNQjpaQU1CSUE6RWFzdGVybjpQZXRhdWtlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy90YXJnZXRzL0FmcmljYW5Db3VudHJpZXMudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdGFyZ2V0cy9BZnJpY2FuQ291bnRyaWVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTUxYjE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdGFyZ2V0cy9BZnJpY2FuQ291bnRyaWVzLnR4dApAQCAtMCwwICsxLDQ3IEBACitDOlxkaXZhXEFmcmljYVxBbGdlcmlhXEFsZ2VyaWEudHh0CitDOlxkaXZhXEFmcmljYVxBbmdvbGFcQW5nb2xhLnR4dAorQzpcZGl2YVxBZnJpY2FcQmVuaW5cQmVuaW4udHh0CitDOlxkaXZhXEFmcmljYVxCdXJraW5hRmFzb1xCdXJraW5hRmFzby50eHQJCitDOlxkaXZhXEFmcmljYVxCdXJ1bmRpXEJ1cnVuZGkudHh0CQorQzpcZGl2YVxBZnJpY2FcQ2FwZVZlcmRlXENhcGVWZXJkZS50eHQJCitDOlxkaXZhXEFmcmljYVxDZW50cmFsQWZyaWNhblJlcHVibGljXENlbnRyYWwKK0M6XGRpdmFcQWZyaWNhXENoYWRcQ2hhZC50eHQKK0M6XGRpdmFcQWZyaWNhXENvbW9yb3NcQ29tb3Jvcy50eHQKK0M6XGRpdmFcQWZyaWNhXENvbmdvXENvbmdvLnR4dAorQzpcZGl2YVxBZnJpY2FcRWd5cHRcRWd5cHQudHh0CitDOlxkaXZhXEFmcmljYVxFcXVhdG9yaWFsR3VpbmVhXEVxdWF0b3JpYWxHdWluZWEudHh0CitDOlxkaXZhXEFmcmljYVxFcml0cmVhXEVyaXRyZWEudHh0CitDOlxkaXZhXEFmcmljYVxHYWJvblxHYWJvbi50eHQKK0M6XGRpdmFcQWZyaWNhXEdhbWJpYVxHYW1iaWEudHh0CitDOlxkaXZhXEFmcmljYVxHaGFuYVxHaGFuYS50eHQKKyNDOlxkaXZhXEFmcmljYVxHbG9yaW9zb0lzbGFuZHNcR2xvcmlvc29Jc2xhbmRzLnR4dAorQzpcZGl2YVxBZnJpY2FcR3VpbmVhXEd1aW5lYS50eHQKK0M6XGRpdmFcQWZyaWNhXEd1aW5lYUJpc3NhdVxHdWluZWFCaXNzYXUudHh0CitDOlxkaXZhXEFmcmljYVxJdm9yeUNvYXN0XEl2b3J5Q29hc3QudHh0CitDOlxkaXZhXEFmcmljYVxLZW55YVxLZW55YS50eHQKK0M6XGRpdmFcQWZyaWNhXExlc290aG9cTGVzb3Roby50eHQKK0M6XGRpdmFcQWZyaWNhXExpYmVyaWFcTGliZXJpYS50eHQKK0M6XGRpdmFcQWZyaWNhXExpYnlhXExpYnlhLnR4dAorQzpcZGl2YVxBZnJpY2FcTWFkYWdhc2NhclxNYWRhZ2FzY2FyLnR4dAorQzpcZGl2YVxBZnJpY2FcTWFsYXdpXE1hbGF3aS50eHQKK0M6XGRpdmFcQWZyaWNhXE1hdXJpdGl1c1xNYXVyaXRpdXMudHh0CitDOlxkaXZhXEFmcmljYVxNb3JvY2NvXE1vcm9jY28udHh0CitDOlxkaXZhXEFmcmljYVxNb3phbWJpcXVlXE1vemFtYmlxdWUudHh0CitDOlxkaXZhXEFmcmljYVxOYW1pYmlhXE5hbWliaWEudHh0CitDOlxkaXZhXEFmcmljYVxOaWdlclxOaWdlci50eHQKK0M6XGRpdmFcQWZyaWNhXE5pZ2VyaWFcTmlnZXJpYS50eHQKK0M6XGRpdmFcQWZyaWNhXFBhcHVhTmV3R3VpbmVhXFBhcHVhTmV3R3VpbmVhLnR4dAorQzpcZGl2YVxBZnJpY2FcUndhbmRhXFJ3YW5kYS50eHQKK0M6XGRpdmFcQWZyaWNhXFNhb1RvbWVQcmluY2lwZVxTYW9Ub21lUHJpbmNpcGUudHh0CitDOlxkaXZhXEFmcmljYVxTZW5lZ2FsXFNlbmVnYWwudHh0CitDOlxkaXZhXEFmcmljYVxTZXljaGVsbGVzXFNleWNoZWxsZXMudHh0CitDOlxkaXZhXEFmcmljYVxTaWVycmFMZW9uZVxTaWVycmFMZW9uZS50eHQKK0M6XGRpdmFcQWZyaWNhXFNvbWFsaWFcU29tYWxpYS50eHQKK0M6XGRpdmFcQWZyaWNhXFNvdXRoQWZyaWNhXFNvdXRoQWZyaWNhLnR4dAorQzpcZGl2YVxBZnJpY2FcU3VkYW5cU3VkYW4udHh0CitDOlxkaXZhXEFmcmljYVxUYW56YW5pYVxUYW56YW5pYS50eHQKK0M6XGRpdmFcQWZyaWNhXFRvZ29cVG9nby50eHQKK0M6XGRpdmFcQWZyaWNhXFR1bmlzaWFcVHVuaXNpYS50eHQKK0M6XGRpdmFcQWZyaWNhXFVnYW5kYVxVZ2FuZGEudHh0CitDOlxkaXZhXEFmcmljYVxaYWlyZVxaYWlyZS50eHQKK0M6XGRpdmFcQWZyaWNhXFphbWJpYVxaYW1iaWEudHh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy90YXJnZXRzL0NvdW50cmllcy50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy90YXJnZXRzL0NvdW50cmllcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5YmJjZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3RhcmdldHMvQ291bnRyaWVzLnR4dApAQCAtMCwwICsxLDE2MCBAQAorI01JU1NJTkcgQ09VTlRSSUVTCisjQzpcc2hhcGVGaWxlc1xjYW5hZGFcQ2FuYWRhU29ydGVkLnR4dAorI0M6XHNoYXBlRmlsZXNcQXVzdHJhbGlhXEF1c3RyYWxpYVNvcnRlZC50eHQKKyNDOlxzaGFwZUZpbGVzXFphaXJlXFphaXJlU29ydGVkLnR4dAorI0M6XHNoYXBlRmlsZXNcWmltYmFid2VcWmltYmFid2VTb3J0ZWQudHh0CisjQzpcc2hhcGVGaWxlc1xCZWxhcnVzXEJlbGFydXNTb3J0ZWQudHh0CisjQzpcc2hhcGVGaWxlc1xCZWxpemVcQmVsaXplU29ydGVkLnR4dAorI0M6XHNoYXBlRmlsZXNcQm90c3dhbmFcQm90c3dhbmFTb3J0ZWQudHh0CisjQzpcc2hhcGVGaWxlc1xDYW1lcm9vblxDYW1lcm9vblNvcnRlZC50eHQKKyNDOlxzaGFwZUZpbGVzXENvc3RhUmljYVxDb3N0YVJpY2FTb3J0ZWQudHh0CisjQzpcc2hhcGVGaWxlc1xFbFNhbHZhZG9yXEVsU2FsdmFkb3JTb3J0ZWQudHh0CisjQzpcc2hhcGVGaWxlc1xFc3RvbmlhXEVzdG9uaWFTb3J0ZWQudHh0CisjQzpcc2hhcGVGaWxlc1xFdGhpb3BpYVxFdGhpb3BpYVNvcnRlZC50eHQKKyNDOlxzaGFwZUZpbGVzXEd1YXRlbWFsYVxHdWF0ZW1hbGFTb3J0ZWQudHh0CisjQzpcc2hhcGVGaWxlc1xIb25kdXJhc1xIb25kdXJhc1NvcnRlZC50eHQKKyNDOlxzaGFwZUZpbGVzXExhdHZpYVxMYXR2aWFTb3J0ZWQudHh0CisjQzpcc2hhcGVGaWxlc1xMaXRodWFuaWFcTGl0aHVhbmlhU29ydGVkLnR4dAorI0M6XHNoYXBlRmlsZXNcTWFsaVxNYWxpU29ydGVkLnR4dAorI0M6XHNoYXBlRmlsZXNcTWF1cml0YW5pYVxNYXVyaXRhbmlhU29ydGVkLnR4dAorI0M6XHNoYXBlRmlsZXNcTmljYXJhZ3VhXE5pY2FyYWd1YVNvcnRlZC50eHQKKyNDOlxzaGFwZUZpbGVzXFBhbmFtYVxQYW5hbWFTb3J0ZWQudHh0CitDOlxkaXZhXEV1cm9wZVxBTEJBTklBXEFMQkFOSUEudHh0CitDOlxkaXZhXEV1cm9wZVxBTkRPUlJBXEFORE9SUkEudHh0CitDOlxkaXZhXEV1cm9wZVxBVVNUUklBXEFVU1RSSUEudHh0CitDOlxkaXZhXEV1cm9wZVxCRUxHSVVNXEJFTEdJVU0udHh0CitDOlxkaXZhXEV1cm9wZVxCVUxHQVJJQVxCVUxHQVJJQS50eHQKK0M6XGRpdmFcRXVyb3BlXEJPU05JQSBBTkQgSEVSWkVHT1ZOSUFcQk9TTklBIEFORCBIRVJaRUdPVklOQS50eHQKK0M6XGRpdmFcRXVyb3BlXFNXSVRaRVJMQU5EXFNXSVRaRVJMQU5ELnR4dAorQzpcZGl2YVxFdXJvcGVcQ1pFQ0ggUkVQVUJMSUNcQ1pFQ0ggUkVQVUJMSUMudHh0CitDOlxkaXZhXEV1cm9wZVxHRVJNQU5ZXEdFUk1BTlkudHh0CitDOlxkaXZhXEV1cm9wZVxERU5NQVJLXERFTk1BUksudHh0CitDOlxkaXZhXEV1cm9wZVxTUEFJTlxTUEFJTi50eHQKK0M6XGRpdmFcRXVyb3BlXEZJTkxBTkRcRklOTEFORC50eHQKK0M6XGRpdmFcRXVyb3BlXEZSQU5DRVxGUkFOQ0UudHh0CitDOlxkaXZhXEV1cm9wZVxGQVJPRSBJU0xBTkRTXEZBUk9FIElTTEFORFMudHh0CitDOlxkaXZhXEV1cm9wZVxHUkVBVCBCUklUQUlOXEdSRUFUIEJSSVRBSU4udHh0CitDOlxkaXZhXEV1cm9wZVxHUkVFQ0VcR1JFRUNFLnR4dAorQzpcZGl2YVxFdXJvcGVcQ1JPQVRJQVxDUk9BVElBLnR4dAorQzpcZGl2YVxFdXJvcGVcSFVOR0FSWVxIVU5HQVJZLnR4dAorQzpcZGl2YVxFdXJvcGVcSVJFTEFORFxJUkVMQU5ELnR4dAorQzpcZGl2YVxFdXJvcGVcSUNFTEFORFxJQ0VMQU5ELnR4dAorQzpcZGl2YVxFdXJvcGVcSVRBTFlcSVRBTFkudHh0CitDOlxkaXZhXEV1cm9wZVxMSUVDSFNURU5TVEVJTlxMSUVDSFNURU5TVEVJTi50eHQKK0M6XGRpdmFcRXVyb3BlXExVWEVNQk9VUkdcTFVYRU1CT1VSRy50eHQKK0M6XGRpdmFcRXVyb3BlXE5FVEhFUkxBTkRTXE5FVEhFUkxBTkRTLnR4dAorQzpcZGl2YVxFdXJvcGVcTk9SV0FZXE5PUldBWS50eHQKK0M6XGRpdmFcRXVyb3BlXFBPTEFORFxQT0xBTkQudHh0CitDOlxkaXZhXEV1cm9wZVxQT1JUVUdBTFxQT1JUVUdBTC50eHQKK0M6XGRpdmFcRXVyb3BlXFJPTUFOSUFcUk9NQU5JQS50eHQKK0M6XGRpdmFcRXVyb3BlXFJVU1NJQVxSVVNTSUEudHh0CitDOlxkaXZhXEV1cm9wZVxTQU4gTUFSSU5PXFNBTiBNQVJJTk8udHh0CitDOlxkaXZhXEV1cm9wZVxZVUdcWVVHT1NMQVZJQS50eHQKK0M6XGRpdmFcRXVyb3BlXFNMT1ZFTklBXFNMT1ZFTklBLnR4dAorQzpcZGl2YVxFdXJvcGVcU1dFREVOXFNXRURFTi50eHQKK0M6XGRpdmFcRXVyb3BlXFVOSVRFRCBLSU5HRE9NXFVOSVRFRCBLSU5HRE9NLnR4dAorQzpcZGl2YVxBZnJpY2FcQWxnZXJpYVxBbGdlcmlhLnR4dAorQzpcZGl2YVxBZnJpY2FcQW5nb2xhXEFuZ29sYS50eHQKK0M6XGRpdmFcQWZyaWNhXEJlbmluXEJlbmluLnR4dAorQzpcZGl2YVxBZnJpY2FcQnVya2luYUZhc29cQnVya2luYUZhc28udHh0CQorQzpcZGl2YVxBZnJpY2FcQnVydW5kaVxCdXJ1bmRpLnR4dAkKK0M6XGRpdmFcQWZyaWNhXENhcGVWZXJkZVxDYXBlVmVyZGUudHh0CQorQzpcZGl2YVxBZnJpY2FcQ2VudHJhbEFmcmljYW5SZXB1YmxpY1xDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMudHh0CitDOlxkaXZhXEFmcmljYVxDaGFkXENoYWQudHh0CitDOlxkaXZhXEFmcmljYVxDb21vcm9zXENvbW9yb3MudHh0CitDOlxkaXZhXEFmcmljYVxDb25nb1xDb25nby50eHQKK0M6XGRpdmFcQWZyaWNhXEVneXB0XEVneXB0LnR4dAorQzpcZGl2YVxBZnJpY2FcRXF1YXRvcmlhbEd1aW5lYVxFcXVhdG9yaWFsR3VpbmVhLnR4dAorQzpcZGl2YVxBZnJpY2FcRXJpdHJlYVxFcml0cmVhLnR4dAorQzpcZGl2YVxBZnJpY2FcR2Fib25cR2Fib24udHh0CitDOlxkaXZhXEFmcmljYVxHYW1iaWFcR2FtYmlhLnR4dAorQzpcZGl2YVxBZnJpY2FcR2hhbmFcR2hhbmEudHh0CitDOlxkaXZhXEFmcmljYVxHdWluZWFcR3VpbmVhLnR4dAorQzpcZGl2YVxBZnJpY2FcR3VpbmVhQmlzc2F1XEd1aW5lYUJpc3NhdS50eHQKK0M6XGRpdmFcQWZyaWNhXEl2b3J5Q29hc3RcSXZvcnlDb2FzdC50eHQKK0M6XGRpdmFcQWZyaWNhXEtlbnlhXEtlbnlhLnR4dAorQzpcZGl2YVxBZnJpY2FcTGVzb3Rob1xMZXNvdGhvLnR4dAorQzpcZGl2YVxBZnJpY2FcTGliZXJpYVxMaWJlcmlhLnR4dAorQzpcZGl2YVxBZnJpY2FcTGlieWFcTGlieWEudHh0CitDOlxkaXZhXEFmcmljYVxNYWRhZ2FzY2FyXE1hZGFnYXNjYXIudHh0CitDOlxkaXZhXEFmcmljYVxNYWxhd2lcTWFsYXdpLnR4dAorQzpcZGl2YVxBZnJpY2FcTWF1cml0aXVzXE1hdXJpdGl1cy50eHQKK0M6XGRpdmFcQWZyaWNhXE1vcm9jY29cTW9yb2Njby50eHQKK0M6XGRpdmFcQWZyaWNhXE1vemFtYmlxdWVcTW96YW1iaXF1ZS50eHQKK0M6XGRpdmFcQWZyaWNhXE5hbWliaWFcTmFtaWJpYS50eHQKK0M6XGRpdmFcQWZyaWNhXE5pZ2VyXE5pZ2VyLnR4dAorQzpcZGl2YVxBZnJpY2FcTmlnZXJpYVxOaWdlcmlhLnR4dAorQzpcZGl2YVxBZnJpY2FcUGFwdWFOZXdHdWluZWFcUGFwdWFOZXdHdWluZWEudHh0CitDOlxkaXZhXEFmcmljYVxSd2FuZGFcUndhbmRhLnR4dAorQzpcZGl2YVxBZnJpY2FcU2FvVG9tZVByaW5jaXBlXFNhb1RvbWVQcmluY2lwZS50eHQKK0M6XGRpdmFcQWZyaWNhXFNlbmVnYWxcU2VuZWdhbC50eHQKK0M6XGRpdmFcQWZyaWNhXFNleWNoZWxsZXNcU2V5Y2hlbGxlcy50eHQKK0M6XGRpdmFcQWZyaWNhXFNpZXJyYUxlb25lXFNpZXJyYUxlb25lLnR4dAorQzpcZGl2YVxBZnJpY2FcU29tYWxpYVxTb21hbGlhLnR4dAorQzpcZGl2YVxBZnJpY2FcU291dGhBZnJpY2FcU291dGhBZnJpY2EudHh0CitDOlxkaXZhXEFmcmljYVxTdWRhblxTdWRhbi50eHQKK0M6XGRpdmFcQWZyaWNhXFRhbnphbmlhXFRhbnphbmlhLnR4dAorQzpcZGl2YVxBZnJpY2FcVG9nb1xUb2dvLnR4dAorQzpcZGl2YVxBZnJpY2FcVHVuaXNpYVxUdW5pc2lhLnR4dAorQzpcZGl2YVxBZnJpY2FcVWdhbmRhXFVnYW5kYS50eHQKK0M6XGRpdmFcQWZyaWNhXFphbWJpYVxaYW1iaWEudHh0CitDOlxkaXZhXE1pZEVhc3RcQmFocmFpblxCYWhyYWluLnR4dAorQzpcZGl2YVxNaWRFYXN0XElyYWtcSXJhay50eHQKK0M6XGRpdmFcTWlkRWFzdFxJcmFuXElyYW4udHh0CitDOlxkaXZhXE1pZEVhc3RcSm9yZGFuXEpvcmRhbi50eHQKK0M6XGRpdmFcTWlkRWFzdFxLdXdhaXRcS3V3YWl0LnR4dAorQzpcZGl2YVxNaWRFYXN0XExlYmFub25cTGViYW5vbi50eHQKK0M6XGRpdmFcTWlkRWFzdFxPbWFuXE9tYW4udHh0CitDOlxkaXZhXE1pZEVhc3RcUWF0YXJcUWF0YXIudHh0CitDOlxkaXZhXE1pZEVhc3RcU2F1ZGlBcmFiaWFcU2F1ZGlBcmFiaWEudHh0CitDOlxkaXZhXE1pZEVhc3RcU3lyaWFcU3lyaWEudHh0CitDOlxkaXZhXE1pZEVhc3RcVW5pdGVkQXJhYkVtaXJhdGVzXFVuaXRlZEFyYWJFbWlyYXRlcy50eHQKK0M6XGRpdmFcTWlkRWFzdFxZZW1lblxZZW1lbi50eHQKK0M6XGRpdmFcUmVzdE9mQXNpYVxBZmdoYW5pc3RhblxBZmdoYW5pc3Rhbi50eHQKK0M6XGRpdmFcUmVzdE9mQXNpYVxBcm1lbmlhXEFybWVuaWEudHh0CitDOlxkaXZhXFJlc3RPZkFzaWFcQXplcmJhaWphblxBemVyYmFpamFuLnR4dAorQzpcZGl2YVxSZXN0T2ZBc2lhXEthemFraHN0YW5cS2F6YWtoc3Rhbi50eHQKK0M6XGRpdmFcUmVzdE9mQXNpYVxLeXJneXpzdGFuXEt5cmd5enN0YW4udHh0CitDOlxkaXZhXFJlc3RPZkFzaWFcTW9uZ29saWFcTW9uZ29saWEudHh0CitDOlxkaXZhXFJlc3RPZkFzaWFcUGFraXN0YW5cUGFraXN0YW4udHh0CitDOlxkaXZhXFJlc3RPZkFzaWFcVGFqaWtpc3RhblxUYWppa2lzdGFuLnR4dAorQzpcZGl2YVxSZXN0T2ZBc2lhXFR1cmtleVxUdXJrZXkudHh0CitDOlxkaXZhXFJlc3RPZkFzaWFcVHVya21lbmlzdGFuXFR1cmttZW5pc3Rhbi50eHQKK0M6XGRpdmFcUmVzdE9mQXNpYVxVemJla2lzdGFuXFV6YmVraXN0YW4udHh0CitDOlxkaXZhXE5vcnRoQW1lcmljYVxNZXhpY29cTWV4aWNvLnR4dAorQzpcZGl2YVxOb3J0aEFtZXJpY2FcVVNBXFVTQV9HUk9VUEVELnR4dAorQzpcZGl2YVxOb3J0aEFtZXJpY2FcUHVlcnRvUmljb1xQdWVydG9SaWNvLnR4dAorQzpcZGl2YVxTb3V0aEFtZXJpY2FcQXJnZW50aW5hXEFyZ2VudGluYS50eHQKK0M6XGRpdmFcU291dGhBbWVyaWNhXEJvbGl2aWFcQm9saXZpYS50eHQKK0M6XGRpdmFcU291dGhBbWVyaWNhXEJyYXppbFxCcmF6aWwudHh0CitDOlxkaXZhXFNvdXRoQW1lcmljYVxDaGlsZVxDaGlsZS50eHQKK0M6XGRpdmFcU291dGhBbWVyaWNhXENvbG9tYmlhXENvbG9tYmlhLnR4dAorQzpcZGl2YVxTb3V0aEFtZXJpY2FcRWN1YWRvclxFY3VhZG9yLnR4dAorQzpcZGl2YVxTb3V0aEFtZXJpY2FcR3V5YW5hXEd1eWFuYS50eHQKK0M6XGRpdmFcU291dGhBbWVyaWNhXFBhcmFndWF5XFBhcmFndWF5LnR4dAorQzpcZGl2YVxTb3V0aEFtZXJpY2FcUGVydVxQZXJ1LnR4dAorQzpcZGl2YVxTb3V0aEFtZXJpY2FcU3VyaW5hbWVcU3VyaW5hbWUudHh0CitDOlxkaXZhXFNvdXRoQW1lcmljYVxVcnVndWF5XFVydWd1YXkudHh0CitDOlxkaXZhXFNvdXRoQW1lcmljYVxWZW5lenVlbGFcVmVuZXp1ZWxhLnR4dAorQzpcZGl2YVxTb3V0aEFzaWFcQmFuZ2xhZGVzaFxCYW5nbGFkZXNoLnR4dAorQzpcZGl2YVxTb3V0aEFzaWFcQmh1dGFuXEJodXRhbi50eHQKK0M6XGRpdmFcU291dGhBc2lhXEJydW5laVxCcnVuZWkudHh0CitDOlxkaXZhXFNvdXRoQXNpYVxDYW1ib2RpYVxDYW1ib2RpYS50eHQKK0M6XGRpdmFcU291dGhBc2lhXENoaW5hXENoaW5hLnR4dAorQzpcZGl2YVxTb3V0aEFzaWFcSW5kaWFcSW5kaWEudHh0CitDOlxkaXZhXFNvdXRoQXNpYVxJbmRvbmVzaWFcSW5kb25lc2lhLnR4dAorQzpcZGl2YVxTb3V0aEFzaWFcSmFwYW5cSmFwYW4udHh0CitDOlxkaXZhXFNvdXRoQXNpYVxMYW9zXExhb3MudHh0CitDOlxkaXZhXFNvdXRoQXNpYVxNYWNhdVxNYWNhdS50eHQKK0M6XGRpdmFcU291dGhBc2lhXE5lcGFsXE5lcGFsLnR4dAorQzpcZGl2YVxTb3V0aEFzaWFcTm9ydGhLb3JlYVxOb3J0aEtvcmVhLnR4dAorQzpcZGl2YVxTb3V0aEFzaWFcUGhpbGlwcGluZXNcUGhpbGlwcGluZXMudHh0CitDOlxkaXZhXFNvdXRoQXNpYVxTaW5nYXBvcmVcU2luZ2Fwb3JlLnR4dAorQzpcZGl2YVxTb3V0aEFzaWFcU291dGhLb3JlYVxTb3V0aEtvcmVhLnR4dAorQzpcZGl2YVxTb3V0aEFzaWFcVGhhaWxhbmRcVGhhaWxhbmQudHh0CitDOlxkaXZhXFNvdXRoQXNpYVxWaWV0bmFtXFZpZXRuYW0udHh0CisKKworCisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdGFyZ2V0cy9Db3VudHJpZXNMaWdodC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy90YXJnZXRzL0NvdW50cmllc0xpZ2h0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmE2ZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdGFyZ2V0cy9Db3VudHJpZXNMaWdodC50eHQKQEAgLTAsMCArMSwxODQgQEAKKyNNSVNTSU5HIENPVU5UUklFUworI0M6XHNoYXBlRmlsZXNcY2FuYWRhXENhbmFkYVNvcnRlZC50eHQKKyNDOlxzaGFwZUZpbGVzXEF1c3RyYWxpYVxBdXN0cmFsaWFTb3J0ZWQudHh0CisjQzpcc2hhcGVGaWxlc1xaYWlyZVxaYWlyZVNvcnRlZC50eHQKKyNDOlxzaGFwZUZpbGVzXFppbWJhYndlXFppbWJhYndlU29ydGVkLnR4dAorI0M6XHNoYXBlRmlsZXNcQmVsYXJ1c1xCZWxhcnVzU29ydGVkLnR4dAorI0M6XHNoYXBlRmlsZXNcQmVsaXplXEJlbGl6ZVNvcnRlZC50eHQKKyNDOlxzaGFwZUZpbGVzXEJvdHN3YW5hXEJvdHN3YW5hU29ydGVkLnR4dAorI0M6XHNoYXBlRmlsZXNcQ2FtZXJvb25cQ2FtZXJvb25Tb3J0ZWQudHh0CisjQzpcc2hhcGVGaWxlc1xDb3N0YVJpY2FcQ29zdGFSaWNhU29ydGVkLnR4dAorI0M6XHNoYXBlRmlsZXNcRWxTYWx2YWRvclxFbFNhbHZhZG9yU29ydGVkLnR4dAorI0M6XHNoYXBlRmlsZXNcRXN0b25pYVxFc3RvbmlhU29ydGVkLnR4dAorI0M6XHNoYXBlRmlsZXNcRXRoaW9waWFcRXRoaW9waWFTb3J0ZWQudHh0CisjQzpcc2hhcGVGaWxlc1xHdWF0ZW1hbGFcR3VhdGVtYWxhU29ydGVkLnR4dAorI0M6XHNoYXBlRmlsZXNcSG9uZHVyYXNcSG9uZHVyYXNTb3J0ZWQudHh0CisjQzpcc2hhcGVGaWxlc1xMYXR2aWFcTGF0dmlhU29ydGVkLnR4dAorI0M6XHNoYXBlRmlsZXNcTGl0aHVhbmlhXExpdGh1YW5pYVNvcnRlZC50eHQKKyNDOlxzaGFwZUZpbGVzXE1hbGlcTWFsaVNvcnRlZC50eHQKKyNDOlxzaGFwZUZpbGVzXE1hdXJpdGFuaWFcTWF1cml0YW5pYVNvcnRlZC50eHQKKyNDOlxzaGFwZUZpbGVzXE5pY2FyYWd1YVxOaWNhcmFndWFTb3J0ZWQudHh0CisjQzpcc2hhcGVGaWxlc1xQYW5hbWFcUGFuYW1hU29ydGVkLnR4dAorIyBFVVJPUEUKK0M6XGRpdmFcRXVyb3BlXEFMQkFOSUFcQUxCQU5JQS50eHQKK0M6XGRpdmFcRXVyb3BlXEFORE9SUkFcQU5ET1JSQS50eHQKKyNDOlxkaXZhXEV1cm9wZVxBVVNUUklBXEFVU1RSSUEudHh0CisjQzpcZGl2YVxFdXJvcGVcQkVMR0lVTVxCRUxHSVVNLnR4dAorI0M6XGRpdmFcRXVyb3BlXEJVTEdBUklBXEJVTEdBUklBLnR4dAorI0M6XGRpdmFcRXVyb3BlXEJPU05JQSBBTkQgSEVSWkVHT1ZJTkFcQk9TTklBIEFORCBIRVJaRUdPVklOQS50eHQKKyNDOlxkaXZhXEV1cm9wZVxTV0lUWkVSTEFORFxTV0lUWkVSTEFORC50eHQKKyNDOlxkaXZhXEV1cm9wZVxDWkVDSCBSRVBVQkxJQ1xDWkVDSCBSRVBVQkxJQy50eHQKKyNDOlxkaXZhXEV1cm9wZVxHRVJNQU5ZXEdFUk1BTlkudHh0CisjQzpcZGl2YVxFdXJvcGVcREVOTUFSS1xERU5NQVJLLnR4dAorI0M6XGRpdmFcRXVyb3BlXFNQQUlOXFNQQUlOLnR4dAorI0M6XGRpdmFcRXVyb3BlXEZJTkxBTkRcRklOTEFORC50eHQKKyNDOlxkaXZhXEV1cm9wZVxGUkFOQ0VcRlJBTkNFLnR4dAorIyNDOlxkaXZhXEV1cm9wZVxGQVJPRSBJU0xBTkRTXEZBUk9FIElTTEFORFMudHh0CisjI0M6XGRpdmFcRXVyb3BlXEdSRUFUIEJSSVRBSU5cR1JFQVQgQlJJVEFJTi50eHQKKyNDOlxkaXZhXEV1cm9wZVxHUkVFQ0VcR1JFRUNFLnR4dAorI0M6XGRpdmFcRXVyb3BlXENST0FUSUFcQ1JPQVRJQS50eHQKKyNDOlxkaXZhXEV1cm9wZVxIVU5HQVJZXEhVTkdBUlkudHh0CisjQzpcZGl2YVxFdXJvcGVcSVJFTEFORFxJUkVMQU5ELnR4dAorI0M6XGRpdmFcRXVyb3BlXElDRUxBTkRcSUNFTEFORC50eHQKKyNDOlxkaXZhXEV1cm9wZVxJVEFMWVxJVEFMWS50eHQKKyNDOlxkaXZhXEV1cm9wZVxMSUVDSFNURU5TVEVJTlxMSUVDSFNURU5TVEVJTi50eHQKKyNDOlxkaXZhXEV1cm9wZVxMVVhFTUJPVVJHXExVWEVNQk9VUkcudHh0CisjQzpcZGl2YVxFdXJvcGVcTkVUSEVSTEFORFNcTkVUSEVSTEFORFMudHh0CisjQzpcZGl2YVxFdXJvcGVcTk9SV0FZXE5PUldBWS50eHQKKyNDOlxkaXZhXEV1cm9wZVxQT0xBTkRcUE9MQU5ELnR4dAorI0M6XGRpdmFcRXVyb3BlXFBPUlRVR0FMXFBPUlRVR0FMLnR4dAorI0M6XGRpdmFcRXVyb3BlXFJPTUFOSUFcUk9NQU5JQS50eHQKKyNDOlxkaXZhXGdyb3VwZWRcUlVTXFJVU19HUk9VUEVELnR4dAorI0M6XGRpdmFcRXVyb3BlXFNBTiBNQVJJTk9cU0FOIE1BUklOTy50eHQKKyNDOlxkaXZhXEV1cm9wZVxZVUdPU0xBVklBXFlVR09TTEFWSUEudHh0CisjQzpcZGl2YVxFdXJvcGVcU0xPVkVOSUFcU0xPVkVOSUEudHh0CisjQzpcZGl2YVxFdXJvcGVcU1dFREVOXFNXRURFTi50eHQKKyNDOlxkaXZhXEV1cm9wZVxVTklURUQgS0lOR0RPTVxVTklURUQgS0lOR0RPTS50eHQKKyMjQzpcZGl2YVxSZXN0T2ZBc2lhXEFmZ2hhbmlzdGFuXEFmZ2hhbmlzdGFuLnR4dAorIyNDOlxkaXZhXFJlc3RPZkFzaWFcQXJtZW5pYVxBcm1lbmlhLnR4dAorIyNDOlxkaXZhXEFmcmljYVxBbGdlcmlhXEFsZ2VyaWEudHh0CisjI0M6XGRpdmFcQWZyaWNhXEFuZ29sYVxBbmdvbGEudHh0CisjI0M6XGRpdmFcQWZyaWNhXFVnYW5kYVxVZ2FuZGEudHh0CisjI0M6XGRpdmFcTWlkRWFzdFxJcmFrXElyYWsudHh0CisjI0M6XGRpdmFcTWlkRWFzdFxJcmFuXElyYW4udHh0CisjQzpcZGl2YVxOb3J0aEFtZXJpY2FcTWV4aWNvXE1leGljby50eHQKKyMjQzpcZGl2YVxTb3V0aEFtZXJpY2FcQnJhemlsXEJyYXppbC50eHQKKyMjQzpcZGl2YVxTb3V0aEFtZXJpY2FcQXJnZW50aW5hXEFyZ2VudGluYS50eHQKKyMjQzpcZGl2YVxTb3V0aEFtZXJpY2FcQm9saXZpYVxCb2xpdmlhLnR4dAorIyNDOlxkaXZhXFNvdXRoQW1lcmljYVxVcnVndWF5XFVydWd1YXkudHh0CisjI0M6XGRpdmFcU291dGhBbWVyaWNhXFZlbmV6dWVsYVxWZW5lenVlbGEudHh0CisjI0M6XGRpdmFcU291dGhBc2lhXEphcGFuXEphcGFuLnR4dAorIyNDOlxkaXZhXFNvdXRoQXNpYVxMYW9zXExhb3MudHh0CisjI0M6XGRpdmFcU291dGhBc2lhXFZpZXRuYW1cVmlldG5hbS50eHQKKyMgQUxMIE9GIEFGUklDQQorIyNDOlxkaXZhXEFmcmljYVxBbGdlcmlhXEFsZ2VyaWEudHh0CisjI0M6XGRpdmFcQWZyaWNhXEFuZ29sYVxBbmdvbGEudHh0CisjI0M6XGRpdmFcQWZyaWNhXEJlbmluXEJlbmluLnR4dAorIyNDOlxkaXZhXEFmcmljYVxCdXJraW5hRmFzb1xCdXJraW5hRmFzby50eHQJCisjI0M6XGRpdmFcQWZyaWNhXEJ1cnVuZGlcQnVydW5kaS50eHQJCisjI0M6XGRpdmFcQWZyaWNhXENhcGVWZXJkZVxDYXBlVmVyZGUudHh0CQorIyNDOlxkaXZhXEFmcmljYVxDZW50cmFsQWZyaWNhblJlcHVibGljXENlbnRyYWwKKyMjQzpcZGl2YVxBZnJpY2FcQ2hhZFxDaGFkLnR4dAorIyNDOlxkaXZhXEFmcmljYVxDb21vcm9zXENvbW9yb3MudHh0CisjI0M6XGRpdmFcQWZyaWNhXENvbmdvXENvbmdvLnR4dAorIyNDOlxkaXZhXEFmcmljYVxFZ3lwdFxFZ3lwdC50eHQKKyMjQzpcZGl2YVxBZnJpY2FcRXF1YXRvcmlhbEd1aW5lYVxFcXVhdG9yaWFsR3VpbmVhLnR4dAorIyNDOlxkaXZhXEFmcmljYVxFcml0cmVhXEVyaXRyZWEudHh0CisjI0M6XGRpdmFcQWZyaWNhXEdhYm9uXEdhYm9uLnR4dAorIyNDOlxkaXZhXEFmcmljYVxHYW1iaWFcR2FtYmlhLnR4dAorIyNDOlxkaXZhXEFmcmljYVxHaGFuYVxHaGFuYS50eHQKKyMjI0M6XGRpdmFcQWZyaWNhXEdsb3Jpb3NvSXNsYW5kc1xHbG9yaW9zb0lzbGFuZHMudHh0CisjI0M6XGRpdmFcQWZyaWNhXEd1aW5lYVxHdWluZWEudHh0CisjI0M6XGRpdmFcQWZyaWNhXEd1aW5lYUJpc3NhdVxHdWluZWFCaXNzYXUudHh0CisjI0M6XGRpdmFcQWZyaWNhXEl2b3J5Q29hc3RcSXZvcnlDb2FzdC50eHQKKyMjQzpcZGl2YVxBZnJpY2FcS2VueWFcS2VueWEudHh0CisjI0M6XGRpdmFcQWZyaWNhXExlc290aG9cTGVzb3Roby50eHQKKyMjQzpcZGl2YVxBZnJpY2FcTGliZXJpYVxMaWJlcmlhLnR4dAorIyNDOlxkaXZhXEFmcmljYVxMaWJ5YVxMaWJ5YS50eHQKKyMjQzpcZGl2YVxBZnJpY2FcTWFkYWdhc2NhclxNYWRhZ2FzY2FyLnR4dAorIyNDOlxkaXZhXEFmcmljYVxNYWxhd2lcTWFsYXdpLnR4dAorI0M6XGRpdmFcQWZyaWNhXE1hbGlcTWFsaS50eHQKKyMjQzpcZGl2YVxBZnJpY2FcTWF1cml0aXVzXE1hdXJpdGl1cy50eHQKKyMjQzpcZGl2YVxBZnJpY2FcTW9yb2Njb1xNb3JvY2NvLnR4dAorIyNDOlxkaXZhXEFmcmljYVxNb3phbWJpcXVlXE1vemFtYmlxdWUudHh0CisjI0M6XGRpdmFcQWZyaWNhXE5hbWliaWFcTmFtaWJpYS50eHQKKyMjQzpcZGl2YVxBZnJpY2FcTmlnZXJcTmlnZXIudHh0CisjI0M6XGRpdmFcQWZyaWNhXE5pZ2VyaWFcTmlnZXJpYS50eHQKKyMjQzpcZGl2YVxBZnJpY2FcUGFwdWFOZXdHdWluZWFcUGFwdWFOZXdHdWluZWEudHh0CisjI0M6XGRpdmFcQWZyaWNhXFJ3YW5kYVxSd2FuZGEudHh0CisjI0M6XGRpdmFcQWZyaWNhXFNhb1RvbWVQcmluY2lwZVxTYW9Ub21lUHJpbmNpcGUudHh0CisjI0M6XGRpdmFcQWZyaWNhXFNlbmVnYWxcU2VuZWdhbC50eHQKKyMjQzpcZGl2YVxBZnJpY2FcU2V5Y2hlbGxlc1xTZXljaGVsbGVzLnR4dAorIyNDOlxkaXZhXEFmcmljYVxTaWVycmFMZW9uZVxTaWVycmFMZW9uZS50eHQKKyMjQzpcZGl2YVxBZnJpY2FcU29tYWxpYVxTb21hbGlhLnR4dAorIyNDOlxkaXZhXEFmcmljYVxTb3V0aEFmcmljYVxTb3V0aEFmcmljYS50eHQKKyMjQzpcZGl2YVxBZnJpY2FcU3VkYW5cU3VkYW4udHh0CisjI0M6XGRpdmFcQWZyaWNhXFRhbnphbmlhXFRhbnphbmlhLnR4dAorIyNDOlxkaXZhXEFmcmljYVxUb2dvXFRvZ28udHh0CisjI0M6XGRpdmFcQWZyaWNhXFR1bmlzaWFcVHVuaXNpYS50eHQKKyMjQzpcZGl2YVxBZnJpY2FcVWdhbmRhXFVnYW5kYS50eHQKKyMjI0M6XGRpdmFcQWZyaWNhXFphaXJlXFphaXJlLnR4dAorIyNDOlxkaXZhXEFmcmljYVxaYW1iaWFcWmFtYmlhLnR4dAorIyBSRVNUIE9GIEFTSUEKKyMjQzpcZGl2YVxSZXN0T2ZBc2lhXEFmZ2hhbmlzdGFuXEFmZ2hhbmlzdGFuLnR4dAorIyNDOlxkaXZhXFJlc3RPZkFzaWFcQXJtZW5pYVxBcm1lbmlhLnR4dAorIyNDOlxkaXZhXFJlc3RPZkFzaWFcQXplcmJhaWphblxBemVyYmFpamFuLnR4dAorIyNDOlxkaXZhXFJlc3RPZkFzaWFcS2F6YWtoc3RhblxLYXpha2hzdGFuLnR4dAorIyNDOlxkaXZhXFJlc3RPZkFzaWFcS3lyZ3l6c3RhblxLeXJneXpzdGFuLnR4dAorIyMjQzpcZGl2YVxSZXN0T2ZBc2lhXE1hY2Vkb25pYVxNYWNlZG9uaWEudHh0CisjI0M6XGRpdmFcUmVzdE9mQXNpYVxNb2xkb3ZhXE1vbGRvdmEudHh0CisjI0M6XGRpdmFcUmVzdE9mQXNpYVxNb25nb2xpYVxNb25nb2xpYS50eHQKKyNDOlxkaXZhXFJlc3RPZkFzaWFcUGFraXN0YW5cUGFraXN0YW4udHh0CisjI0M6XGRpdmFcUmVzdE9mQXNpYVxUYWppa2lzdGFuXFRhamlraXN0YW4udHh0CisjI0M6XGRpdmFcUmVzdE9mQXNpYVxUdXJrZXlcVHVya2V5LnR4dAorIyNDOlxkaXZhXFJlc3RPZkFzaWFcVHVya21lbmlzdGFuXFR1cmttZW5pc3Rhbi50eHQKKyMjQzpcZGl2YVxSZXN0T2ZBc2lhXFV6YmVraXN0YW5cVXpiZWtpc3Rhbi50eHQKKyMgTUlEIEVBU1QgUkVHSU9OCisjI0M6XGRpdmFcTWlkRWFzdFxCYWhyYWluXEJhaHJhaW4udHh0CisjI0M6XGRpdmFcTWlkRWFzdFxJcmFrXElyYWsudHh0CisjI0M6XGRpdmFcTWlkRWFzdFxJcmFuXElyYW4udHh0CisjI0M6XGRpdmFcTWlkRWFzdFxKb3JkYW5cSm9yZGFuLnR4dAorIyNDOlxkaXZhXE1pZEVhc3RcS3V3YWl0XEt1d2FpdC50eHQKKyMjQzpcZGl2YVxNaWRFYXN0XExlYmFub25cTGViYW5vbi50eHQKKyMjQzpcZGl2YVxNaWRFYXN0XE9tYW5cT21hbi50eHQKKyMjQzpcZGl2YVxNaWRFYXN0XFFhdGFyXFFhdGFyLnR4dAorIyNDOlxkaXZhXE1pZEVhc3RcU2F1ZGlBcmFiaWFcU2F1ZGlBcmFiaWEudHh0CisjI0M6XGRpdmFcTWlkRWFzdFxTeXJpYVxTeXJpYS50eHQKKyMjQzpcZGl2YVxNaWRFYXN0XFVuaXRlZEFyYWJFbWlyYXRlc1xVbml0ZWRBcmFiRW1pcmF0ZXMudHh0CisjI0M6XGRpdmFcTWlkRWFzdFxZZW1lblxZZW1lbi50eHQKKyMgTk9SVEggQU5EIFNPVVRIIEFNRVJJQ0EKKyNDOlxkaXZhXE5vcnRoQW1lcmljYVxNZXhpY29cTWV4aWNvLnR4dAorIyNDOlxkaXZhXE5vcnRoQW1lcmljYVxVU0FcVVNBLnR4dAorI0M6XGRpdmFcTm9ydGhBbWVyaWNhXFB1ZXJ0b1JpY29cUHVlcnRvUmljby50eHQKKyMjQzpcZGl2YVxTb3V0aEFtZXJpY2FcQXJnZW50aW5hXEFyZ2VudGluYS50eHQKKyMjQzpcZGl2YVxTb3V0aEFtZXJpY2FcQm9saXZpYVxCb2xpdmlhLnR4dAorIyNDOlxkaXZhXFNvdXRoQW1lcmljYVxCcmF6aWxcQnJhemlsLnR4dAorIyNDOlxkaXZhXFNvdXRoQW1lcmljYVxDaGlsZVxDaGlsZS50eHQKKyMjQzpcZGl2YVxTb3V0aEFtZXJpY2FcQ29sb21iaWFcQ29sb21iaWEudHh0CisjI0M6XGRpdmFcU291dGhBbWVyaWNhXEVjdWFkb3JcRWN1YWRvci50eHQKKyMjI0M6XGRpdmFcU291dGhBbWVyaWNhXEZhdWxrbGFuZElzbGFuZHNcRmF1bGtsYW5kSXNsYW5kcy50eHQKKyMjQzpcZGl2YVxTb3V0aEFtZXJpY2FcR3V5YW5hXEd1eWFuYS50eHQKKyMjQzpcZGl2YVxTb3V0aEFtZXJpY2FcUGFyYWd1YXlcUGFyYWd1YXkudHh0CisjI0M6XGRpdmFcU291dGhBbWVyaWNhXFBlcnVcUGVydS50eHQKKyMjQzpcZGl2YVxTb3V0aEFtZXJpY2FcU3VyaW5hbWVcU3VyaW5hbWUudHh0CisjI0M6XGRpdmFcU291dGhBbWVyaWNhXFVydWd1YXlcVXJ1Z3VheS50eHQKKyMjQzpcZGl2YVxTb3V0aEFtZXJpY2FcVmVuZXp1ZWxhXFZlbmV6dWVsYS50eHQKKyMgU09VVEggQVNJQQorIyNDOlxkaXZhXFNvdXRoQXNpYVxCYW5nbGFkZXNoXEJhbmdsYWRlc2gudHh0CisjI0M6XGRpdmFcU291dGhBc2lhXEJodXRhblxCaHV0YW4udHh0CisjI0M6XGRpdmFcU291dGhBc2lhXEJydW5laVxCcnVuZWkudHh0CisjI0M6XGRpdmFcU291dGhBc2lhXENhbWJvZGlhXENhbWJvZGlhLnR4dAorIyNDOlxkaXZhXFNvdXRoQXNpYVxDaGluYVxDaGluYS50eHQKKyMjQzpcZGl2YVxTb3V0aEFzaWFcSW5kaWFcSW5kaWEudHh0CisjI0M6XGRpdmFcU291dGhBc2lhXEluZG9uZXNpYVxJbmRvbmVzaWEudHh0CisjI0M6XGRpdmFcU291dGhBc2lhXEphcGFuXEphcGFuLnR4dAorIyNDOlxkaXZhXFNvdXRoQXNpYVxMYW9zXExhb3MudHh0CisjI0M6XGRpdmFcU291dGhBc2lhXE1hY2F1XE1hY2F1LnR4dAorIyMjQzpcZGl2YVxTb3V0aEFzaWFcTXlhbm1hclxNeWFubWFyLnR4dAorIyNDOlxkaXZhXFNvdXRoQXNpYVxOZXBhbFxOZXBhbC50eHQKKyMjQzpcZGl2YVxTb3V0aEFzaWFcTm9ydGhLb3JlYVxOb3J0aEtvcmVhLnR4dAorIyNDOlxkaXZhXFNvdXRoQXNpYVxQaGlsaXBwaW5lc1xQaGlsaXBwaW5lcy50eHQKKyMjQzpcZGl2YVxTb3V0aEFzaWFcU2luZ2Fwb3JlXFNpbmdhcG9yZS50eHQKKyMjQzpcZGl2YVxTb3V0aEFzaWFcU291dGhLb3JlYVxTb3V0aEtvcmVhLnR4dAorIyNDOlxkaXZhXFNvdXRoQXNpYVxUaGFpbGFuZFxUaGFpbGFuZC50eHQKKyMjQzpcZGl2YVxTb3V0aEFzaWFcVmlldG5hbVxWaWV0bmFtLnR4dApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdGFyZ2V0cy9FdXJvcGVDb3VudHJpZXMudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdGFyZ2V0cy9FdXJvcGVDb3VudHJpZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDVlMDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy90YXJnZXRzL0V1cm9wZUNvdW50cmllcy50eHQKQEAgLTAsMCArMSw0MiBAQAorI1VOQ09NTUVOVCBUSEUgTkVYVCBTSU5HTEUgTElORSBPTkxZIEJFRk9SRSBSVU4gRXVyb3BlRGF0YUNsZWFuZXIgOgorI0M6XEV1cm9wZURhdGEyMDA3XEV1cm9wZVVOXFVOZGF0YVNocFxFdXJvcGUudHh0CisjVU5DT01NRU5UIFRIRSBORVhUIFNJTkdMRSBMSU5FIE9OTFkgQkVGT1JFIFJVTiBFdXJvcGVEYXRhRm9ybWF0dGVyIDoKKyNDOlxFdXJvcGVEYXRhMjAwN1xFdXJvcGVVTlxVTmRhdGFTaHBcRXVyb3BlU29ydGVkMi50eHQKKyNVTkNPTU1FTlQgVEhFIE5FWFQgU0lOR0xFIExJTkUgT05MWSBCRUZPUkUgUlVOIFJ1c3NpYURhdGFDbGVhbmVyIDoKKyNDOlxFdXJvcGVEYXRhMjAwN1xSdXNzaWFcUnVzc2lhLnR4dAorI1VOQ09NTUVOVCBUSEUgTkVYVCBTSU5HTEUgTElORSBPTkxZIEJFRk9SRSBSVU4gUnVzc2lhRGF0YUNvbnZlcnRlciBBTkQgUnVzc2lhRGF0YUV4dHJhY3RvciA6CitDOlxFdXJvcGVEYXRhMjAwN1xSdXNzaWFcUnVzc2lhU29ydGVkLnR4dAorI1VOQ09NTUVOVCBBTEwgVEhFIEZPTExPV0lORyBMSU5FUyBCRUZPUkUgUlVOTklORyBFdXJvcGVEYXRhRXh0cmFjdG9yLCBDT01NRU5UIE9USEVSV0lTRSA6CisjI0M6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxvdXRwdXRcQUxCXEFMQi50eHQKKyNDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25cb3V0cHV0XEFORFxBTkQudHh0CisjQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXG91dHB1dFxBVVRcQVVULnR4dAorI0M6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxvdXRwdXRcQkVMXEJFTC50eHQKKyNDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25cb3V0cHV0XEJHUlxCR1IudHh0CisjQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXG91dHB1dFxCSUhcQklILnR4dAorI0M6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxvdXRwdXRcQ0hFXENIRS50eHQKKyNDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25cb3V0cHV0XENaRVxDWkUudHh0CisjQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXG91dHB1dFxERVVcREVVLnR4dAorI0M6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxvdXRwdXRcRE5LXEROSy50eHQKKyNDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25cb3V0cHV0XEVTUFxFU1AudHh0CisjQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXG91dHB1dFxGSU5cRklOLnR4dAorI0M6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxvdXRwdXRcRlJBXEZSQS50eHQKKyNDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25cb3V0cHV0XEZST1xGUk8udHh0CisjQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXG91dHB1dFxHQlJcR0JSLnR4dAorI0M6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxvdXRwdXRcR1JDXEdSQy50eHQKKyNDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25cb3V0cHV0XEhSVlxIUlYudHh0CisjQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXG91dHB1dFxIVU5cSFVOLnR4dAorI0M6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxvdXRwdXRcSVJMXElSTC50eHQKKyNDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25cb3V0cHV0XElTTFxJU0wudHh0CisjQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXG91dHB1dFxJVEFcSVRBLnR4dAorI0M6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxvdXRwdXRcTElFXExJRS50eHQKKyNDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25cb3V0cHV0XExVWFxMVVgudHh0CisjQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXG91dHB1dFxOTERcTkxELnR4dAorI0M6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxvdXRwdXRcTk9SXE5PUi50eHQKKyNDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25cb3V0cHV0XFBPTFxQT0wudHh0CisjQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXG91dHB1dFxQUlRcUFJULnR4dAorI0M6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxvdXRwdXRcUk9VXFJPVS50eHQKKyNDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25cb3V0cHV0XFJVU1xSVVMudHh0CisjQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXG91dHB1dFxTTVJcU01SLnR4dAorI0M6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxvdXRwdXRcU1JCXFNSQi50eHQKKyNDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25cb3V0cHV0XFNWTlxTVk4udHh0CisjQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXG91dHB1dFxTV0VcU1dFLnR4dApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3RhcmdldHMvRXVyb3BlTmFtZXMudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdGFyZ2V0cy9FdXJvcGVOYW1lcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1NDNhMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3RhcmdldHMvRXVyb3BlTmFtZXMudHh0CkBAIC0wLDAgKzEsMjU1NyBAQAorMgk6CUZpbm5tYXJrCiszCToJRmlubm1hcmsKKzQJOglGaW5ubWFyaworNQk6CUZpbm5tYXJrCis2CToJRmlubm1hcmsKKzcJOglGaW5ubWFyaworOAk6CUZpbm5tYXJrCis5CToJTGFwcGkvTGFwcGxhbmQKKzEwCToJRmlubm1hcmsKKzExCToJVHJvbXMKKzEyCToJVHJvbXMKKzEzCToJVHJvbXMKKzE0CToJVHJvbXMKKzE1CToJVHJvbXMKKzE2CToJVHJvbXMKKzE3CToJVHJvbXMKKzE4CToJVHJvbXMKKzE5CToJVHJvbXMKKzIwCToJVHJvbXMKKzIxCToJVHJvbXMKKzIyCToJVHJvbXMKKzIzCToJVHJvbXMKKzI0CToJTm9yZGxhbmQKKzI1CToJTm9ycmJvdHRlbgorMjYJOglJc2xhbmQKKzI3CToJVHJvbXMKKzI4CToJTm9yZGxhbmQKKzI5CToJTm9yZGxhbmQKKzMwCToJVHJvbXMKKzMxCToJTm9yZGxhbmQKKzMyCToJTm9yZGxhbmQKKzMzCToJVHJvbXMKKzM0CToJTm9yZGxhbmQKKzM1CToJTm9yZGxhbmQKKzM2CToJTm9yZGxhbmQKKzM3CToJTm9yZGxhbmQKKzM4CToJSXNsYW5kCiszOQk6CU5vcmRsYW5kCis0MAk6CU91bHUvVWxlYWJvcmcKKzQxCToJTm9yZGxhbmQKKzQyCToJTm9yZGxhbmQKKzQzCToJTm9yZGxhbmQKKzQ0CToJTm9yZGxhbmQKKzQ1CToJTGFwcGkvTGFwcGxhbmQKKzQ2CToJTm9yZGxhbmQKKzQ3CToJVoRzdGVyYm90dGVuCis0OAk6CU5vcnJib3R0ZW4KKzQ5CToJTm9yZGxhbmQKKzUwCToJTm9yZGxhbmQKKzUxCToJTm9ycmJvdHRlbgorNTIJOglOb3JyYm90dGVuCis1Mwk6CU5vcmRsYW5kCis1NAk6CU5vcmRsYW5kCis1NQk6CU5vcnJib3R0ZW4KKzU2CToJSXNsYW5kCis1Nwk6CU5vcmRsYW5kCis1OAk6CU5vcnJib3R0ZW4KKzU5CToJTm9ycmJvdHRlbgorNjAJOglJc2xhbmQKKzYxCToJTm9ycmJvdHRlbgorNjIJOglOb3JyYm90dGVuCis2Mwk6CU5vcnJib3R0ZW4KKzY0CToJTm9ycmJvdHRlbgorNjUJOglOb3JyYm90dGVuCis2Ngk6CU91bHUvVWxlYWJvcmcKKzY3CToJTm9ycmJvdHRlbgorNjgJOglOb3JkbGFuZAorNjkJOglOb3JyYm90dGVuCis3MAk6CU5vcmRsYW5kCis3MQk6CU5vcmQtVHJvZW5kZWxhZworNzIJOglKhG10bGFuZAorNzMJOglQb2hqb2lzLUthcmphbGEvTm9ycmEtS2FyZWxlbgorNzQJOglOb3JkbGFuZAorNzUJOglLdW9waW8KKzc2CToJVmFhc2EvVmFzYQorNzcJOglTb2VyLVRyb2VuZGVsYWcKKzc4CToJS2Vza2ktU3VvbWkvTWVsbGVyc3RhLUZpbmxhbmQKKzc5CToJVoRzdGVyYm90dGVuCis4MAk6CVaEc3Rlcm5vcnJsYW5kCis4MQk6CU1pa2tlbGkvU3QgTWljaGVsCis4Mgk6CVNvZXItVHJvZW5kZWxhZworODMJOglTb2VyLVRyb2VuZGVsYWcKKzg0CToJU29lci1Ucm9lbmRlbGFnCis4NQk6CVNvZXItVHJvZW5kZWxhZworODYJOglTb2VyLVRyb2VuZGVsYWcKKzg3CToJVoRzdGVybm9ycmxhbmQKKzg4CToJU29lci1Ucm9lbmRlbGFnCis4OQk6CVNvZXItVHJvZW5kZWxhZworOTAJOglNb2VyZSBvZyBSb21zZGFsCis5MQk6CU1vZXJlIG9nIFJvbXNkYWwKKzkyCToJTW9lcmUgb2cgUm9tc2RhbAorOTMJOglLeW1pL0t5bW1lbmUKKzk0CToJTW9lcmUgb2cgUm9tc2RhbAorOTUJOglTb2VyLVRyb2VuZGVsYWcKKzk2CToJSIRtZS9UYXZhc3RlaHVzCis5Nwk6CU1vZXJlIG9nIFJvbXNkYWwKKzk4CToJTW9lcmUgb2cgUm9tc2RhbAorOTkJOglWhHN0ZXJub3JybGFuZAorMTAwCToJVoRzdGVybm9ycmxhbmQKKzEwMQk6CVaEc3Rlcm5vcnJsYW5kCisxMDIJOglWhHN0ZXJub3JybGFuZAorMTAzCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTA0CToJTW9lcmUgb2cgUm9tc2RhbAorMTA1CToJTW9lcmUgb2cgUm9tc2RhbAorMTA2CToJTW9lcmUgb2cgUm9tc2RhbAorMTA3CToJTW9lcmUgb2cgUm9tc2RhbAorMTA4CToJTW9lcmUgb2cgUm9tc2RhbAorMTA5CToJVoRzdGVybm9ycmxhbmQKKzExMAk6CUhlZG1hcmsKKzExMQk6CU1vZXJlIG9nIFJvbXNkYWwKKzExMgk6CU1vZXJlIG9nIFJvbXNkYWwKKzExMwk6CU1vZXJlIG9nIFJvbXNkYWwKKzExNAk6CU1vZXJlIG9nIFJvbXNkYWwKKzExNQk6CU1vZXJlIG9nIFJvbXNkYWwKKzExNgk6CVZhYXNhL1Zhc2EKKzExNwk6CVZhYXNhL1Zhc2EKKzExOAk6CUeEdmxlYm9yZworMTE5CToJTW9lcmUgb2cgUm9tc2RhbAorMTIwCToJTW9lcmUgb2cgUm9tc2RhbAorMTIxCToJTW9lcmUgb2cgUm9tc2RhbAorMTIyCToJVmFhc2EvVmFzYQorMTIzCToJVmFhc2EvVmFzYQorMTI0CToJTW9lcmUgb2cgUm9tc2RhbAorMTI1CToJT3BwbGFuZAorMTI2CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTI3CToJS29wcGFyYmVyZworMTI4CToJTW9lcmUgb2cgUm9tc2RhbAorMTI5CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTMwCToJTW9lcmUgb2cgUm9tc2RhbAorMTMxCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTMyCToJU29nbiBvZyBGam9yZGFuZQorMTMzCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTM0CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTM1CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTM2CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTM3CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTM4CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTM5CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTQwCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTQxCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTQyCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTQzCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTQ0CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTQ1CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTQ2CToJU29nbiBvZyBGam9yZGFuZQorMTQ3CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTQ4CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTQ5CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTUwCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTUxCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTUyCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTUzCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTU0CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTU1CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTU2CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTU3CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTU4CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTU5CToJU29nbiBvZyBGam9yZGFuZQorMTYwCToJU29nbiBvZyBGam9yZGFuZQorMTYxCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTYyCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTYzCToJU29nbiBvZyBGam9yZGFuZQorMTY0CToJU29nbiBvZyBGam9yZGFuZQorMTY1CToJU29nbiBvZyBGam9yZGFuZQorMTY2CToJU29nbiBvZyBGam9yZGFuZQorMTY3CToJVXVkZW5tYWEvTnlsYW5kCisxNjgJOglTb2duIG9nIEZqb3JkYW5lCisxNjkJOglTb2duIG9nIEZqb3JkYW5lCisxNzAJOglTb2duIG9nIEZqb3JkYW5lCisxNzEJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCisxNzIJOglTb2duIG9nIEZqb3JkYW5lCisxNzMJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCisxNzQJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCisxNzUJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCisxNzYJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCisxNzcJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCisxNzgJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCisxNzkJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCisxODAJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCisxODEJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCisxODIJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCisxODMJOglTb2duIG9nIEZqb3JkYW5lCisxODQJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCisxODUJOglLeW1pL0t5bW1lbmUKKzE4Ngk6CUt5bWkvS3ltbWVuZQorMTg3CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTg4CToJS3ltaS9LeW1tZW5lCisxODkJOglLeW1pL0t5bW1lbmUKKzE5MAk6CUt5bWkvS3ltbWVuZQorMTkxCToJU29nbiBvZyBGam9yZGFuZQorMTkyCToJS3ltaS9LeW1tZW5lCisxOTMJOglLeW1pL0t5bW1lbmUKKzE5NAk6CUt5bWkvS3ltbWVuZQorMTk1CToJS3ltaS9LeW1tZW5lCisxOTYJOglLeW1pL0t5bW1lbmUKKzE5Nwk6CUt5bWkvS3ltbWVuZQorMTk4CToJS3ltaS9LeW1tZW5lCisxOTkJOglLeW1pL0t5bW1lbmUKKzIwMAk6CUt5bWkvS3ltbWVuZQorMjAxCToJS3ltaS9LeW1tZW5lCisyMDIJOglLeW1pL0t5bW1lbmUKKzIwMwk6CVNvZ24gb2cgRmpvcmRhbmUKKzIwNAk6CUt5bWkvS3ltbWVuZQorMjA1CToJS3ltaS9LeW1tZW5lCisyMDYJOglLeW1pL0t5bW1lbmUKKzIwNwk6CUt5bWkvS3ltbWVuZQorMjA4CToJS3ltaS9LeW1tZW5lCisyMDkJOglLeW1pL0t5bW1lbmUKKzIxMAk6CUt5bWkvS3ltbWVuZQorMjExCToJS3ltaS9LeW1tZW5lCisyMTIJOglLeW1pL0t5bW1lbmUKKzIxMwk6CUt5bWkvS3ltbWVuZQorMjE0CToJS3ltaS9LeW1tZW5lCisyMTUJOglLeW1pL0t5bW1lbmUKKzIxNgk6CVNvZ24gb2cgRmpvcmRhbmUKKzIxNwk6CUt5bWkvS3ltbWVuZQorMjE4CToJS3ltaS9LeW1tZW5lCisyMTkJOglLeW1pL0t5bW1lbmUKKzIyMAk6CUt5bWkvS3ltbWVuZQorMjIxCToJS3ltaS9LeW1tZW5lCisyMjIJOglLeW1pL0t5bW1lbmUKKzIyMwk6CUt5bWkvS3ltbWVuZQorMjI0CToJS3ltaS9LeW1tZW5lCisyMjUJOglLeW1pL0t5bW1lbmUKKzIyNgk6CUt5bWkvS3ltbWVuZQorMjI3CToJS3ltaS9LeW1tZW5lCisyMjgJOglLeW1pL0t5bW1lbmUKKzIyOQk6CUt5bWkvS3ltbWVuZQorMjMwCToJS3ltaS9LeW1tZW5lCisyMzEJOglLeW1pL0t5bW1lbmUKKzIzMgk6CUt5bWkvS3ltbWVuZQorMjMzCToJS3ltaS9LeW1tZW5lCisyMzQJOglLeW1pL0t5bW1lbmUKKzIzNQk6CUt5bWkvS3ltbWVuZQorMjM2CToJS3ltaS9LeW1tZW5lCisyMzcJOglLeW1pL0t5bW1lbmUKKzIzOAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzIzOQk6CUt5bWkvS3ltbWVuZQorMjQwCToJS3ltaS9LeW1tZW5lCisyNDEJOglLeW1pL0t5bW1lbmUKKzI0Mgk6CUt5bWkvS3ltbWVuZQorMjQzCToJS3ltaS9LeW1tZW5lCisyNDQJOglLeW1pL0t5bW1lbmUKKzI0NQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzI0Ngk6CVV1ZGVubWFhL055bGFuZAorMjQ3CToJS3ltaS9LeW1tZW5lCisyNDgJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCisyNDkJOglTb2duIG9nIEZqb3JkYW5lCisyNTAJOglLeW1pL0t5bW1lbmUKKzI1MQk6CVV1ZGVubWFhL055bGFuZAorMjUyCToJVXVkZW5tYWEvTnlsYW5kCisyNTMJOglLeW1pL0t5bW1lbmUKKzI1NAk6CUt5bWkvS3ltbWVuZQorMjU1CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMjU2CToJU29nbiBvZyBGam9yZGFuZQorMjU3CToJS3ltaS9LeW1tZW5lCisyNTgJOglLeW1pL0t5bW1lbmUKKzI1OQk6CVV1ZGVubWFhL055bGFuZAorMjYwCToJS3ltaS9LeW1tZW5lCisyNjEJOglLeW1pL0t5bW1lbmUKKzI2Mgk6CVV1ZGVubWFhL055bGFuZAorMjYzCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMjY0CToJVXVkZW5tYWEvTnlsYW5kCisyNjUJOglLeW1pL0t5bW1lbmUKKzI2Ngk6CUt5bWkvS3ltbWVuZQorMjY3CToJR4R2bGVib3JnCisyNjgJOglTb2duIG9nIEZqb3JkYW5lCisyNjkJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCisyNzAJOglVdWRlbm1hYS9OeWxhbmQKKzI3MQk6CVV1ZGVubWFhL055bGFuZAorMjcyCToJS3ltaS9LeW1tZW5lCisyNzMJOglLeW1pL0t5bW1lbmUKKzI3NAk6CVV1ZGVubWFhL055bGFuZAorMjc1CToJS3ltaS9LeW1tZW5lCisyNzYJOglVdWRlbm1hYS9OeWxhbmQKKzI3Nwk6CVNvZ24gb2cgRmpvcmRhbmUKKzI3OAk6CVV1ZGVubWFhL055bGFuZAorMjc5CToJS3ltaS9LeW1tZW5lCisyODAJOglVdWRlbm1hYS9OeWxhbmQKKzI4MQk6CVV1ZGVubWFhL055bGFuZAorMjgyCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMjgzCToJVXVkZW5tYWEvTnlsYW5kCisyODQJOglVdWRlbm1hYS9OeWxhbmQKKzI4NQk6CUt5bWkvS3ltbWVuZQorMjg2CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMjg3CToJVXVkZW5tYWEvTnlsYW5kCisyODgJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCisyODkJOglLeW1pL0t5bW1lbmUKKzI5MAk6CVV1ZGVubWFhL055bGFuZAorMjkxCToJVXVkZW5tYWEvTnlsYW5kCisyOTIJOglVdWRlbm1hYS9OeWxhbmQKKzI5Mwk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzI5NAk6CVV1ZGVubWFhL055bGFuZAorMjk1CToJS3ltaS9LeW1tZW5lCisyOTYJOglVdWRlbm1hYS9OeWxhbmQKKzI5Nwk6CVV1ZGVubWFhL055bGFuZAorMjk4CToJVXVkZW5tYWEvTnlsYW5kCisyOTkJOglVdWRlbm1hYS9OeWxhbmQKKzMwMAk6CVV1ZGVubWFhL055bGFuZAorMzAxCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMzAyCToJVXVkZW5tYWEvTnlsYW5kCiszMDMJOglVdWRlbm1hYS9OeWxhbmQKKzMwNAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzMwNQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzMwNgk6CVV1ZGVubWFhL055bGFuZAorMzA3CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMzA4CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMzA5CToJVXVkZW5tYWEvTnlsYW5kCiszMTAJOglTb2duIG9nIEZqb3JkYW5lCiszMTEJOglHhHZsZWJvcmcKKzMxMgk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzMxMwk6CVV1ZGVubWFhL055bGFuZAorMzE0CToJU29nbiBvZyBGam9yZGFuZQorMzE1CToJR4R2bGVib3JnCiszMTYJOglVdWRlbm1hYS9OeWxhbmQKKzMxNwk6CVV1ZGVubWFhL055bGFuZAorMzE4CToJVXVkZW5tYWEvTnlsYW5kCiszMTkJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCiszMjAJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCiszMjEJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCiszMjIJOglVdWRlbm1hYS9OeWxhbmQKKzMyMwk6CVNvZ24gb2cgRmpvcmRhbmUKKzMyNAk6CVV1ZGVubWFhL055bGFuZAorMzI1CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMzI2CToJVXVkZW5tYWEvTnlsYW5kCiszMjcJOglVdWRlbm1hYS9OeWxhbmQKKzMyOAk6CVV1ZGVubWFhL055bGFuZAorMzI5CToJVXVkZW5tYWEvTnlsYW5kCiszMzAJOglVdWRlbm1hYS9OeWxhbmQKKzMzMQk6CVV1ZGVubWFhL055bGFuZAorMzMyCToJVXVkZW5tYWEvTnlsYW5kCiszMzMJOglVdWRlbm1hYS9OeWxhbmQKKzMzNAk6CVV1ZGVubWFhL055bGFuZAorMzM1CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMzM2CToJSElHSExBTkRTCiszMzcJOglVdWRlbm1hYS9OeWxhbmQKKzMzOAk6CVV1ZGVubWFhL055bGFuZAorMzM5CToJVXVkZW5tYWEvTnlsYW5kCiszNDAJOglHhHZsZWJvcmcKKzM0MQk6CVV1ZGVubWFhL055bGFuZAorMzQyCToJVXVkZW5tYWEvTnlsYW5kCiszNDMJOglTb2duIG9nIEZqb3JkYW5lCiszNDQJOglVdWRlbm1hYS9OeWxhbmQKKzM0NQk6CUhJR0hMQU5EUworMzQ2CToJVXVkZW5tYWEvTnlsYW5kCiszNDcJOglVdWRlbm1hYS9OeWxhbmQKKzM0OAk6CVV1ZGVubWFhL055bGFuZAorMzQ5CToJVXVkZW5tYWEvTnlsYW5kCiszNTAJOglVdWRlbm1hYS9OeWxhbmQKKzM1MQk6CVV1ZGVubWFhL055bGFuZAorMzUyCToJU29nbiBvZyBGam9yZGFuZQorMzUzCToJVXVkZW5tYWEvTnlsYW5kCiszNTQJOglVdWRlbm1hYS9OeWxhbmQKKzM1NQk6CVV1ZGVubWFhL055bGFuZAorMzU2CToJVXVkZW5tYWEvTnlsYW5kCiszNTcJOglVdWRlbm1hYS9OeWxhbmQKKzM1OAk6CVV1ZGVubWFhL055bGFuZAorMzU5CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMzYwCToJVXVkZW5tYWEvTnlsYW5kCiszNjEJOglVdWRlbm1hYS9OeWxhbmQKKzM2Mgk6CVV1ZGVubWFhL055bGFuZAorMzYzCToJVXVkZW5tYWEvTnlsYW5kCiszNjQJOglVdWRlbm1hYS9OeWxhbmQKKzM2NQk6CVV1ZGVubWFhL055bGFuZAorMzY2CToJVXVkZW5tYWEvTnlsYW5kCiszNjcJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCiszNjgJOglVdWRlbm1hYS9OeWxhbmQKKzM2OQk6CVV1ZGVubWFhL055bGFuZAorMzcwCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMzcxCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMzcyCToJVoRybWxhbmQKKzM3Mwk6CVV1ZGVubWFhL055bGFuZAorMzc0CToJVXVkZW5tYWEvTnlsYW5kCiszNzUJOglVdWRlbm1hYS9OeWxhbmQKKzM3Ngk6CVV1ZGVubWFhL055bGFuZAorMzc3CToJU29nbiBvZyBGam9yZGFuZQorMzc4CToJVXVkZW5tYWEvTnlsYW5kCiszNzkJOglCdXNrZXJ1ZAorMzgwCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMzgxCToJVXVkZW5tYWEvTnlsYW5kCiszODIJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCiszODMJOglVdWRlbm1hYS9OeWxhbmQKKzM4NAk6CUhJR0hMQU5EUworMzg1CToJVXVkZW5tYWEvTnlsYW5kCiszODYJOglVdWRlbm1hYS9OeWxhbmQKKzM4Nwk6CUhJR0hMQU5EUworMzg4CToJU29nbiBvZyBGam9yZGFuZQorMzg5CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMzkwCToJQWxhbmQvQWh2ZW5hbm1hYQorMzkxCToJVXVkZW5tYWEvTnlsYW5kCiszOTIJOglVdWRlbm1hYS9OeWxhbmQKKzM5Mwk6CVV1ZGVubWFhL055bGFuZAorMzk0CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMzk1CToJVXVkZW5tYWEvTnlsYW5kCiszOTYJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCiszOTcJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCiszOTgJOglIb3JkYWxhbmQKKzM5OQk6CVV1ZGVubWFhL055bGFuZAorNDAwCToJQWxhbmQvQWh2ZW5hbm1hYQorNDAxCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNDAyCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNDAzCToJQWxhbmQvQWh2ZW5hbm1hYQorNDA0CToJVXVkZW5tYWEvTnlsYW5kCis0MDUJOglVdWRlbm1hYS9OeWxhbmQKKzQwNgk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQwNwk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQwOAk6CVV1ZGVubWFhL055bGFuZAorNDA5CToJQWxhbmQvQWh2ZW5hbm1hYQorNDEwCToJSElHSExBTkRTCis0MTEJOglVdWRlbm1hYS9OeWxhbmQKKzQxMgk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQxMwk6CUFsYW5kL0FodmVuYW5tYWEKKzQxNAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQxNQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQxNgk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQxNwk6CUhJR0hMQU5EUworNDE4CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNDE5CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNDIwCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNDIxCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNDIyCToJVXVkZW5tYWEvTnlsYW5kCis0MjMJOglIb3JkYWxhbmQKKzQyNAk6CUhJR0hMQU5EUworNDI1CToJVXVkZW5tYWEvTnlsYW5kCis0MjYJOglBbGFuZC9BaHZlbmFubWFhCis0MjcJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis0MjgJOglVdWRlbm1hYS9OeWxhbmQKKzQyOQk6CVV1ZGVubWFhL055bGFuZAorNDMwCToJQWxhbmQvQWh2ZW5hbm1hYQorNDMxCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNDMyCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNDMzCToJVXVkZW5tYWEvTnlsYW5kCis0MzQJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis0MzUJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis0MzYJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis0MzcJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis0MzgJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis0MzkJOglVdWRlbm1hYS9OeWxhbmQKKzQ0MAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQ0MQk6CUhJR0hMQU5EUworNDQyCToJVXVkZW5tYWEvTnlsYW5kCis0NDMJOglBbGFuZC9BaHZlbmFubWFhCis0NDQJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis0NDUJOglISUdITEFORFMKKzQ0Ngk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQ0Nwk6CVV1ZGVubWFhL055bGFuZAorNDQ4CToJSElHSExBTkRTCis0NDkJOglBbGFuZC9BaHZlbmFubWFhCis0NTAJOglVdWRlbm1hYS9OeWxhbmQKKzQ1MQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQ1Mgk6CUFsYW5kL0FodmVuYW5tYWEKKzQ1Mwk6CVV1ZGVubWFhL055bGFuZAorNDU0CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNDU1CToJVXVkZW5tYWEvTnlsYW5kCis0NTYJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis0NTcJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis0NTgJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis0NTkJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis0NjAJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis0NjEJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis0NjIJOglVdWRlbm1hYS9OeWxhbmQKKzQ2Mwk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQ2NAk6CVVwcHNhbGEKKzQ2NQk6CUFsYW5kL0FodmVuYW5tYWEKKzQ2Ngk6CUFsYW5kL0FodmVuYW5tYWEKKzQ2Nwk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQ2OAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQ2OQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQ3MAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQ3MQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQ3Mgk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQ3Mwk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQ3NAk6CUFsYW5kL0FodmVuYW5tYWEKKzQ3NQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQ3Ngk6CUFsYW5kL0FodmVuYW5tYWEKKzQ3Nwk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQ3OAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQ3OQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzQ4MAk6CVV1ZGVubWFhL055bGFuZAorNDgxCToJQWxhbmQvQWh2ZW5hbm1hYQorNDgyCToJQWxhbmQvQWh2ZW5hbm1hYQorNDgzCToJQWxhbmQvQWh2ZW5hbm1hYQorNDg0CToJQWxhbmQvQWh2ZW5hbm1hYQorNDg1CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNDg2CToJQWxhbmQvQWh2ZW5hbm1hYQorNDg3CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNDg4CToJQWxhbmQvQWh2ZW5hbm1hYQorNDg5CToJQWxhbmQvQWh2ZW5hbm1hYQorNDkwCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNDkxCToJQWxhbmQvQWh2ZW5hbm1hYQorNDkyCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNDkzCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNDk0CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNDk1CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNDk2CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNDk3CToJQWxhbmQvQWh2ZW5hbm1hYQorNDk4CToJVXVkZW5tYWEvTnlsYW5kCis0OTkJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis1MDAJOglBbGFuZC9BaHZlbmFubWFhCis1MDEJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis1MDIJOglISUdITEFORFMKKzUwMwk6CUFsYW5kL0FodmVuYW5tYWEKKzUwNAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzUwNQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzUwNgk6CUhJR0hMQU5EUworNTA3CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNTA4CToJQWxhbmQvQWh2ZW5hbm1hYQorNTA5CToJQWxhbmQvQWh2ZW5hbm1hYQorNTEwCToJQWxhbmQvQWh2ZW5hbm1hYQorNTExCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNTEyCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNTEzCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNTE0CToJVXVkZW5tYWEvTnlsYW5kCis1MTUJOglBbGFuZC9BaHZlbmFubWFhCis1MTYJOglBbGFuZC9BaHZlbmFubWFhCis1MTcJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis1MTgJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis1MTkJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis1MjAJOglBbGFuZC9BaHZlbmFubWFhCis1MjEJOglBbGFuZC9BaHZlbmFubWFhCis1MjIJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis1MjMJOglBbGFuZC9BaHZlbmFubWFhCis1MjQJOglBbGFuZC9BaHZlbmFubWFhCis1MjUJOglBbGFuZC9BaHZlbmFubWFhCis1MjYJOglBbGFuZC9BaHZlbmFubWFhCis1MjcJOglVcHBzYWxhCis1MjgJOglBbGFuZC9BaHZlbmFubWFhCis1MjkJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis1MzAJOglISUdITEFORFMKKzUzMQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzUzMgk6CUFsYW5kL0FodmVuYW5tYWEKKzUzMwk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzUzNAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzUzNQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzUzNgk6CUFsYW5kL0FodmVuYW5tYWEKKzUzNwk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzUzOAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzUzOQk6CVV1ZGVubWFhL055bGFuZAorNTQwCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNTQxCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNTQyCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNTQzCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNTQ0CToJQWxhbmQvQWh2ZW5hbm1hYQorNTQ1CToJQWxhbmQvQWh2ZW5hbm1hYQorNTQ2CToJVXVkZW5tYWEvTnlsYW5kCis1NDcJOglBbGFuZC9BaHZlbmFubWFhCis1NDgJOglBbGFuZC9BaHZlbmFubWFhCis1NDkJOglBbGFuZC9BaHZlbmFubWFhCis1NTAJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis1NTEJOglBbGFuZC9BaHZlbmFubWFhCis1NTIJOglBbGFuZC9BaHZlbmFubWFhCis1NTMJOglBbGFuZC9BaHZlbmFubWFhCis1NTQJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis1NTUJOglVdWRlbm1hYS9OeWxhbmQKKzU1Ngk6CVV1ZGVubWFhL055bGFuZAorNTU3CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNTU4CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNTU5CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNTYwCToJVXBwc2FsYQorNTYxCToJQWxhbmQvQWh2ZW5hbm1hYQorNTYyCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNTYzCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNTY0CToJQWxhbmQvQWh2ZW5hbm1hYQorNTY1CToJQWxhbmQvQWh2ZW5hbm1hYQorNTY2CToJQWxhbmQvQWh2ZW5hbm1hYQorNTY3CToJQWxhbmQvQWh2ZW5hbm1hYQorNTY4CToJQWxhbmQvQWh2ZW5hbm1hYQorNTY5CToJSElHSExBTkRTCis1NzAJOglBbGFuZC9BaHZlbmFubWFhCis1NzEJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis1NzIJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis1NzMJOglBbGFuZC9BaHZlbmFubWFhCis1NzQJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis1NzUJOglBbGFuZC9BaHZlbmFubWFhCis1NzYJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis1NzcJOglVdWRlbm1hYS9OeWxhbmQKKzU3OAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzU3OQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzU4MAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzU4MQk6CUFsYW5kL0FodmVuYW5tYWEKKzU4Mgk6CUFsYW5kL0FodmVuYW5tYWEKKzU4Mwk6CUFsYW5kL0FodmVuYW5tYWEKKzU4NAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzU4NQk6CUFsYW5kL0FodmVuYW5tYWEKKzU4Ngk6CUFsYW5kL0FodmVuYW5tYWEKKzU4Nwk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzU4OAk6CUFsYW5kL0FodmVuYW5tYWEKKzU4OQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzU5MAk6CUFsYW5kL0FodmVuYW5tYWEKKzU5MQk6CVV1ZGVubWFhL055bGFuZAorNTkyCToJVXVkZW5tYWEvTnlsYW5kCis1OTMJOglBbGFuZC9BaHZlbmFubWFhCis1OTQJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis1OTUJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis1OTYJOglBbGFuZC9BaHZlbmFubWFhCis1OTcJOglBbGFuZC9BaHZlbmFubWFhCis1OTgJOglBbGFuZC9BaHZlbmFubWFhCis1OTkJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis2MDAJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis2MDEJOglBbGFuZC9BaHZlbmFubWFhCis2MDIJOglVdWRlbm1hYS9OeWxhbmQKKzYwMwk6CUFsYW5kL0FodmVuYW5tYWEKKzYwNAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzYwNQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzYwNgk6CUFsYW5kL0FodmVuYW5tYWEKKzYwNwk6CVV1ZGVubWFhL055bGFuZAorNjA4CToJQWxhbmQvQWh2ZW5hbm1hYQorNjA5CToJSElHSExBTkRTCis2MTAJOglVdWRlbm1hYS9OeWxhbmQKKzYxMQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzYxMgk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzYxMwk6CUFsYW5kL0FodmVuYW5tYWEKKzYxNAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzYxNQk6CUFsYW5kL0FodmVuYW5tYWEKKzYxNgk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzYxNwk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzYxOAk6CVV1ZGVubWFhL055bGFuZAorNjE5CToJQWxhbmQvQWh2ZW5hbm1hYQorNjIwCToJVXVkZW5tYWEvTnlsYW5kCis2MjEJOglVdWRlbm1hYS9OeWxhbmQKKzYyMgk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzYyMwk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzYyNAk6CVV1ZGVubWFhL055bGFuZAorNjI1CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNjI2CToJVXVkZW5tYWEvTnlsYW5kCis2MjcJOglVdWRlbm1hYS9OeWxhbmQKKzYyOAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzYyOQk6CVV1ZGVubWFhL055bGFuZAorNjMwCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNjMxCToJVXVkZW5tYWEvTnlsYW5kCis2MzIJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis2MzMJOglVdWRlbm1hYS9OeWxhbmQKKzYzNAk6CUFsYW5kL0FodmVuYW5tYWEKKzYzNQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzYzNgk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzYzNwk6CUFsYW5kL0FodmVuYW5tYWEKKzYzOAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzYzOQk6CUFsYW5kL0FodmVuYW5tYWEKKzY0MAk6CVV1ZGVubWFhL055bGFuZAorNjQxCToJQWxhbmQvQWh2ZW5hbm1hYQorNjQyCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNjQzCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNjQ0CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNjQ1CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNjQ2CToJSElHSExBTkRTCis2NDcJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis2NDgJOglVdWRlbm1hYS9OeWxhbmQKKzY0OQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzY1MAk6CVV1ZGVubWFhL055bGFuZAorNjUxCToJVXVkZW5tYWEvTnlsYW5kCis2NTIJOglBbGFuZC9BaHZlbmFubWFhCis2NTMJOglVdWRlbm1hYS9OeWxhbmQKKzY1NAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzY1NQk6CUFsYW5kL0FodmVuYW5tYWEKKzY1Ngk6CVV1ZGVubWFhL055bGFuZAorNjU3CToJQWxhbmQvQWh2ZW5hbm1hYQorNjU4CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNjU5CToJSElHSExBTkRTCis2NjAJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis2NjEJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis2NjIJOglBbGFuZC9BaHZlbmFubWFhCis2NjMJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis2NjQJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis2NjUJOglBbGFuZC9BaHZlbmFubWFhCis2NjYJOglVdWRlbm1hYS9OeWxhbmQKKzY2Nwk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzY2OAk6CUhvcmRhbGFuZAorNjY5CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNjcwCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNjcxCToJVXVkZW5tYWEvTnlsYW5kCis2NzIJOglBbGFuZC9BaHZlbmFubWFhCis2NzMJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis2NzQJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis2NzUJOglISUdITEFORFMKKzY3Ngk6CVV1ZGVubWFhL055bGFuZAorNjc3CToJVXVkZW5tYWEvTnlsYW5kCis2NzgJOglBbGFuZC9BaHZlbmFubWFhCis2NzkJOglBbGFuZC9BaHZlbmFubWFhCis2ODAJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis2ODEJOglBbGFuZC9BaHZlbmFubWFhCis2ODIJOglBbGFuZC9BaHZlbmFubWFhCis2ODMJOglVdWRlbm1hYS9OeWxhbmQKKzY4NAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzY4NQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzY4Ngk6CUhJR0hMQU5EUworNjg3CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNjg4CToJQWxhbmQvQWh2ZW5hbm1hYQorNjg5CToJVXVkZW5tYWEvTnlsYW5kCis2OTAJOglBbGFuZC9BaHZlbmFubWFhCis2OTEJOglBbGFuZC9BaHZlbmFubWFhCis2OTIJOglBbGFuZC9BaHZlbmFubWFhCis2OTMJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis2OTQJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis2OTUJOglBbGFuZC9BaHZlbmFubWFhCis2OTYJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis2OTcJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis2OTgJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis2OTkJOglBbGFuZC9BaHZlbmFubWFhCis3MDAJOglISUdITEFORFMKKzcwMQk6CVV1ZGVubWFhL055bGFuZAorNzAyCToJQWxhbmQvQWh2ZW5hbm1hYQorNzAzCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNzA0CToJVXVkZW5tYWEvTnlsYW5kCis3MDUJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis3MDYJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis3MDcJOglBbGFuZC9BaHZlbmFubWFhCis3MDgJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis3MDkJOglISUdITEFORFMKKzcxMAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzcxMQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzcxMgk6CUFsYW5kL0FodmVuYW5tYWEKKzcxMwk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzcxNAk6CUFsYW5kL0FodmVuYW5tYWEKKzcxNQk6CUhJR0hMQU5EUworNzE2CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNzE3CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNzE4CToJSElHSExBTkRTCis3MTkJOglBbGFuZC9BaHZlbmFubWFhCis3MjAJOglBbGFuZC9BaHZlbmFubWFhCis3MjEJOglBbGFuZC9BaHZlbmFubWFhCis3MjIJOglISUdITEFORFMKKzcyMwk6CUFsYW5kL0FodmVuYW5tYWEKKzcyNAk6CVV1ZGVubWFhL055bGFuZAorNzI1CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNzI2CToJQWxhbmQvQWh2ZW5hbm1hYQorNzI3CToJVXVkZW5tYWEvTnlsYW5kCis3MjgJOglVdWRlbm1hYS9OeWxhbmQKKzcyOQk6CUFsYW5kL0FodmVuYW5tYWEKKzczMAk6CUFsYW5kL0FodmVuYW5tYWEKKzczMQk6CVV1ZGVubWFhL055bGFuZAorNzMyCToJVXVkZW5tYWEvTnlsYW5kCis3MzMJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis3MzQJOglVdWRlbm1hYS9OeWxhbmQKKzczNQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzczNgk6CVV1ZGVubWFhL055bGFuZAorNzM3CToJVXVkZW5tYWEvTnlsYW5kCis3MzgJOglVdWRlbm1hYS9OeWxhbmQKKzczOQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzc0MAk6CVV1ZGVubWFhL055bGFuZAorNzQxCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNzQyCToJQWxhbmQvQWh2ZW5hbm1hYQorNzQzCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNzQ0CToJVXVkZW5tYWEvTnlsYW5kCis3NDUJOglBbGFuZC9BaHZlbmFubWFhCis3NDYJOglVdWRlbm1hYS9OeWxhbmQKKzc0Nwk6CVV1ZGVubWFhL055bGFuZAorNzQ4CToJQWxhbmQvQWh2ZW5hbm1hYQorNzQ5CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNzUwCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNzUxCToJVXVkZW5tYWEvTnlsYW5kCis3NTIJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis3NTMJOglVdWRlbm1hYS9OeWxhbmQKKzc1NAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzc1NQk6CUFsYW5kL0FodmVuYW5tYWEKKzc1Ngk6CVV1ZGVubWFhL055bGFuZAorNzU3CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNzU4CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNzU5CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNzYwCToJVXVkZW5tYWEvTnlsYW5kCis3NjEJOglBbGFuZC9BaHZlbmFubWFhCis3NjIJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis3NjMJOglBbGFuZC9BaHZlbmFubWFhCis3NjQJOglVdWRlbm1hYS9OeWxhbmQKKzc2NQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzc2Ngk6CVV1ZGVubWFhL055bGFuZAorNzY3CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNzY4CToJVXVkZW5tYWEvTnlsYW5kCis3NjkJOglBbGFuZC9BaHZlbmFubWFhCis3NzAJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis3NzEJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis3NzIJOglVdWRlbm1hYS9OeWxhbmQKKzc3Mwk6CUFsYW5kL0FodmVuYW5tYWEKKzc3NAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzc3NQk6CUFsYW5kL0FodmVuYW5tYWEKKzc3Ngk6CVV1ZGVubWFhL055bGFuZAorNzc3CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNzc4CToJVXVkZW5tYWEvTnlsYW5kCis3NzkJOglVdWRlbm1hYS9OeWxhbmQKKzc4MAk6CUFsYW5kL0FodmVuYW5tYWEKKzc4MQk6CVV1ZGVubWFhL055bGFuZAorNzgyCToJQWxhbmQvQWh2ZW5hbm1hYQorNzgzCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNzg0CToJQWxhbmQvQWh2ZW5hbm1hYQorNzg1CToJVXVkZW5tYWEvTnlsYW5kCis3ODYJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis3ODcJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis3ODgJOglVdWRlbm1hYS9OeWxhbmQKKzc4OQk6CVV1ZGVubWFhL055bGFuZAorNzkwCToJVXVkZW5tYWEvTnlsYW5kCis3OTEJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis3OTIJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis3OTMJOglVdWRlbm1hYS9OeWxhbmQKKzc5NAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzc5NQk6CUFsYW5kL0FodmVuYW5tYWEKKzc5Ngk6CVV1ZGVubWFhL055bGFuZAorNzk3CToJQWxhbmQvQWh2ZW5hbm1hYQorNzk4CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworNzk5CToJVXVkZW5tYWEvTnlsYW5kCis4MDAJOglBbGFuZC9BaHZlbmFubWFhCis4MDEJOglVdWRlbm1hYS9OeWxhbmQKKzgwMgk6CUFsYW5kL0FodmVuYW5tYWEKKzgwMwk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzgwNAk6CVV1ZGVubWFhL055bGFuZAorODA1CToJVXVkZW5tYWEvTnlsYW5kCis4MDYJOglBbGFuZC9BaHZlbmFubWFhCis4MDcJOglBbGFuZC9BaHZlbmFubWFhCis4MDgJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis4MDkJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis4MTAJOglVdWRlbm1hYS9OeWxhbmQKKzgxMQk6CVV1ZGVubWFhL055bGFuZAorODEyCToJQWxhbmQvQWh2ZW5hbm1hYQorODEzCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworODE0CToJQWxhbmQvQWh2ZW5hbm1hYQorODE1CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworODE2CToJT3NsbyBvZyBBa2Vyc2h1cworODE3CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworODE4CToJVXVkZW5tYWEvTnlsYW5kCis4MTkJOglVdWRlbm1hYS9OeWxhbmQKKzgyMAk6CVV1ZGVubWFhL055bGFuZAorODIxCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworODIyCToJVXVkZW5tYWEvTnlsYW5kCis4MjMJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis4MjQJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis4MjUJOglBbGFuZC9BaHZlbmFubWFhCis4MjYJOglVdWRlbm1hYS9OeWxhbmQKKzgyNwk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzgyOAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzgyOQk6CVV1ZGVubWFhL055bGFuZAorODMwCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworODMxCToJVXVkZW5tYWEvTnlsYW5kCis4MzIJOglBbGFuZC9BaHZlbmFubWFhCis4MzMJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis4MzQJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis4MzUJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis4MzYJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis4MzcJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis4MzgJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis4MzkJOglVdWRlbm1hYS9OeWxhbmQKKzg0MAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzg0MQk6CVV1ZGVubWFhL055bGFuZAorODQyCToJVXVkZW5tYWEvTnlsYW5kCis4NDMJOglVdWRlbm1hYS9OeWxhbmQKKzg0NAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzg0NQk6CVV1ZGVubWFhL055bGFuZAorODQ2CToJSElHSExBTkRTCis4NDcJOglVdWRlbm1hYS9OeWxhbmQKKzg0OAk6CVV1ZGVubWFhL055bGFuZAorODQ5CToJQWxhbmQvQWh2ZW5hbm1hYQorODUwCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworODUxCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworODUyCToJQWxhbmQvQWh2ZW5hbm1hYQorODUzCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworODU0CToJVXVkZW5tYWEvTnlsYW5kCis4NTUJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis4NTYJOglBbGFuZC9BaHZlbmFubWFhCis4NTcJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis4NTgJOglVdWRlbm1hYS9OeWxhbmQKKzg1OQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzg2MAk6CVV1ZGVubWFhL055bGFuZAorODYxCToJVXVkZW5tYWEvTnlsYW5kCis4NjIJOglBbGFuZC9BaHZlbmFubWFhCis4NjMJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis4NjQJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis4NjUJOglBbGFuZC9BaHZlbmFubWFhCis4NjYJOglVdWRlbm1hYS9OeWxhbmQKKzg2Nwk6CUFsYW5kL0FodmVuYW5tYWEKKzg2OAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzg2OQk6CUFsYW5kL0FodmVuYW5tYWEKKzg3MAk6CVV1ZGVubWFhL055bGFuZAorODcxCToJQWxhbmQvQWh2ZW5hbm1hYQorODcyCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworODczCToJVXVkZW5tYWEvTnlsYW5kCis4NzQJOglVdWRlbm1hYS9OeWxhbmQKKzg3NQk6CVV1ZGVubWFhL055bGFuZAorODc2CToJU3RvY2tob2xtCis4NzcJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis4NzgJOglBbGFuZC9BaHZlbmFubWFhCis4NzkJOglVdWRlbm1hYS9OeWxhbmQKKzg4MAk6CUFsYW5kL0FodmVuYW5tYWEKKzg4MQk6CUFsYW5kL0FodmVuYW5tYWEKKzg4Mgk6CVV1ZGVubWFhL055bGFuZAorODgzCToJVXVkZW5tYWEvTnlsYW5kCis4ODQJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis4ODUJOglVdWRlbm1hYS9OeWxhbmQKKzg4Ngk6CVV1ZGVubWFhL055bGFuZAorODg3CToJQWxhbmQvQWh2ZW5hbm1hYQorODg4CToJQWxhbmQvQWh2ZW5hbm1hYQorODg5CToJQWxhbmQvQWh2ZW5hbm1hYQorODkwCToJQWxhbmQvQWh2ZW5hbm1hYQorODkxCToJQWxhbmQvQWh2ZW5hbm1hYQorODkyCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworODkzCToJQWxhbmQvQWh2ZW5hbm1hYQorODk0CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworODk1CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworODk2CToJQWxhbmQvQWh2ZW5hbm1hYQorODk3CToJVXVkZW5tYWEvTnlsYW5kCis4OTgJOglVdWRlbm1hYS9OeWxhbmQKKzg5OQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzkwMAk6CUFsYW5kL0FodmVuYW5tYWEKKzkwMQk6CUFsYW5kL0FodmVuYW5tYWEKKzkwMgk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzkwMwk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzkwNAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzkwNQk6CUhJR0hMQU5EUworOTA2CToJQWxhbmQvQWh2ZW5hbm1hYQorOTA3CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTA4CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTA5CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTEwCToJQWxhbmQvQWh2ZW5hbm1hYQorOTExCToJQWxhbmQvQWh2ZW5hbm1hYQorOTEyCToJQWxhbmQvQWh2ZW5hbm1hYQorOTEzCToJQWxhbmQvQWh2ZW5hbm1hYQorOTE0CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTE1CToJVXVkZW5tYWEvTnlsYW5kCis5MTYJOglBbGFuZC9BaHZlbmFubWFhCis5MTcJOglBbGFuZC9BaHZlbmFubWFhCis5MTgJOglBbGFuZC9BaHZlbmFubWFhCis5MTkJOglWIHN0bWFubGFuZAorOTIwCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTIxCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTIyCToJQWxhbmQvQWh2ZW5hbm1hYQorOTIzCToJQWxhbmQvQWh2ZW5hbm1hYQorOTI0CToJQWxhbmQvQWh2ZW5hbm1hYQorOTI1CToJSElHSExBTkRTCis5MjYJOglBbGFuZC9BaHZlbmFubWFhCis5MjcJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5MjgJOglVdWRlbm1hYS9OeWxhbmQKKzkyOQk6CUFsYW5kL0FodmVuYW5tYWEKKzkzMAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzkzMQk6CVV1ZGVubWFhL055bGFuZAorOTMyCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTMzCToJQWxhbmQvQWh2ZW5hbm1hYQorOTM0CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTM1CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTM2CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTM3CToJQWxhbmQvQWh2ZW5hbm1hYQorOTM4CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTM5CToJQWxhbmQvQWh2ZW5hbm1hYQorOTQwCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTQxCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTQyCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTQzCToJSElHSExBTkRTCis5NDQJOglISUdITEFORFMKKzk0NQk6CVN0b2NraG9sbQorOTQ2CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTQ3CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTQ4CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTQ5CToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworOTUwCToJSElHSExBTkRTCis5NTEJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5NTIJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5NTMJOglBbGFuZC9BaHZlbmFubWFhCis5NTQJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5NTUJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5NTYJOglBbGFuZC9BaHZlbmFubWFhCis5NTcJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5NTgJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5NTkJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5NjAJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5NjEJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5NjIJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5NjMJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5NjQJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5NjUJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5NjYJOglBbGFuZC9BaHZlbmFubWFhCis5NjcJOglBbGFuZC9BaHZlbmFubWFhCis5NjgJOglBbGFuZC9BaHZlbmFubWFhCis5NjkJOglBbGFuZC9BaHZlbmFubWFhCis5NzAJOglBbGFuZC9BaHZlbmFubWFhCis5NzEJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5NzIJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5NzMJOglBbGFuZC9BaHZlbmFubWFhCis5NzQJOglBbGFuZC9BaHZlbmFubWFhCis5NzUJOglBbGFuZC9BaHZlbmFubWFhCis5NzYJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5NzcJOglBbGFuZC9BaHZlbmFubWFhCis5NzgJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5NzkJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5ODAJOglBbGFuZC9BaHZlbmFubWFhCis5ODEJOglBbGFuZC9BaHZlbmFubWFhCis5ODIJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5ODMJOglBbGFuZC9BaHZlbmFubWFhCis5ODQJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5ODUJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCis5ODYJOglBbGFuZC9BaHZlbmFubWFhCis5ODcJOglVdWRlbm1hYS9OeWxhbmQKKzk4OAk6CUFsYW5kL0FodmVuYW5tYWEKKzk4OQk6CUFsYW5kL0FodmVuYW5tYWEKKzk5MAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzk5MQk6CUFsYW5kL0FodmVuYW5tYWEKKzk5Mgk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzk5Mwk6CUFsYW5kL0FodmVuYW5tYWEKKzk5NAk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzk5NQk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzk5Ngk6CVR1cmt1LVBvcmkvQWJvLUJqlHJuZWJvcmcKKzk5Nwk6CUFsYW5kL0FodmVuYW5tYWEKKzk5OAk6CUFsYW5kL0FodmVuYW5tYWEKKzk5OQk6CUFsYW5kL0FodmVuYW5tYWEKKzEwMDAJOglBbGFuZC9BaHZlbmFubWFhCisxMDAxCToJQWxhbmQvQWh2ZW5hbm1hYQorMTAwMgk6CUFsYW5kL0FodmVuYW5tYWEKKzEwMDMJOglBbGFuZC9BaHZlbmFubWFhCisxMDA0CToJQWxhbmQvQWh2ZW5hbm1hYQorMTAwNQk6CUFsYW5kL0FodmVuYW5tYWEKKzEwMDYJOglBbGFuZC9BaHZlbmFubWFhCisxMDA3CToJQWxhbmQvQWh2ZW5hbm1hYQorMTAwOAk6CUFsYW5kL0FodmVuYW5tYWEKKzEwMDkJOglBbGFuZC9BaHZlbmFubWFhCisxMDEwCToJQWxhbmQvQWh2ZW5hbm1hYQorMTAxMQk6CUhJR0hMQU5EUworMTAxMgk6CUFsYW5kL0FodmVuYW5tYWEKKzEwMTMJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCisxMDE0CToJQWxhbmQvQWh2ZW5hbm1hYQorMTAxNQk6CUFsYW5kL0FodmVuYW5tYWEKKzEwMTYJOglBbGFuZC9BaHZlbmFubWFhCisxMDE3CToJQWxhbmQvQWh2ZW5hbm1hYQorMTAxOAk6CUFsYW5kL0FodmVuYW5tYWEKKzEwMTkJOglUdXJrdS1Qb3JpL0Fiby1CapRybmVib3JnCisxMDIwCToJVHVya3UtUG9yaS9BYm8tQmqUcm5lYm9yZworMTAyMQk6CU9yZWJybworMTAyMgk6CVRlbGVtYXJrCisxMDIzCToJT2VzdGZvbGQKKzEwMjQJOglTdG9ja2hvbG0KKzEwMjUJOglISUdITEFORFMKKzEwMjYJOglTdG9ja2hvbG0KKzEwMjcJOglISUdITEFORFMKKzEwMjgJOglISUdITEFORFMKKzEwMjkJOglSb2dhbGFuZAorMTAzMAk6CUhJR0hMQU5EUworMTAzMQk6CVN0b2NraG9sbQorMTAzMgk6CU9lc3Rmb2xkCisxMDMzCToJU3RvY2tob2xtCisxMDM0CToJU3RvY2tob2xtCisxMDM1CToJSElHSExBTkRTCisxMDM2CToJU3RvY2tob2xtCisxMDM3CToJU3RvY2tob2xtCisxMDM4CToJSElHSExBTkRTCisxMDM5CToJU3RvY2tob2xtCisxMDQwCToJU5RybWxhbmQKKzEwNDEJOglISUdITEFORFMKKzEwNDIJOglISUdITEFORFMKKzEwNDMJOglTdG9ja2hvbG0KKzEwNDQJOglWZXN0Zm9sZAorMTA0NQk6CUF1c3QtQWdkZXIKKzEwNDYJOglTdG9ja2hvbG0KKzEwNDcJOglISUdITEFORFMKKzEwNDgJOglISUdITEFORFMKKzEwNDkJOglISUdITEFORFMKKzEwNTAJOglTdG9ja2hvbG0KKzEwNTEJOglISUdITEFORFMKKzEwNTIJOglISUdITEFORFMKKzEwNTMJOglTdG9ja2hvbG0KKzEwNTQJOglISUdITEFORFMKKzEwNTUJOglISUdITEFORFMKKzEwNTYJOglTdG9ja2hvbG0KKzEwNTcJOglTdG9ja2hvbG0KKzEwNTgJOglVTktOT1dOCisxMDU5CToJSElHSExBTkRTCisxMDYwCToJSElHSExBTkRTCisxMDYxCToJU3RvY2tob2xtCisxMDYyCToJSElHSExBTkRTCisxMDYzCToJSElHSExBTkRTCisxMDY0CToJSElHSExBTkRTCisxMDY1CToJSElHSExBTkRTCisxMDY2CToJSElHSExBTkRTCisxMDY3CToJSElHSExBTkRTCisxMDY4CToJSElHSExBTkRTCisxMDY5CToJSElHSExBTkRTCisxMDcwCToJU3RvY2tob2xtCisxMDcxCToJSElHSExBTkRTCisxMDcyCToJSElHSExBTkRTCisxMDczCToJWmx2c2JvcmcKKzEwNzQJOglTdG9ja2hvbG0KKzEwNzUJOglISUdITEFORFMKKzEwNzYJOglTdG9ja2hvbG0KKzEwNzcJOglISUdITEFORFMKKzEwNzgJOglISUdITEFORFMKKzEwNzkJOglWZXN0LUFnZGVyCisxMDgwCToJSElHSExBTkRTCisxMDgxCToJSElHSExBTkRTCisxMDgyCToJSElHSExBTkRTCisxMDgzCToJSElHSExBTkRTCisxMDg0CToJSElHSExBTkRTCisxMDg1CToJSElHSExBTkRTCisxMDg2CToJU3RvY2tob2xtCisxMDg3CToJSElHSExBTkRTCisxMDg4CToJSElHSExBTkRTCisxMDg5CToJSElHSExBTkRTCisxMDkwCToJT3N0ZXJnlHRsYW5kCisxMDkxCToJSElHSExBTkRTCisxMDkyCToJSElHSExBTkRTCisxMDkzCToJSElHSExBTkRTCisxMDk0CToJSElHSExBTkRTCisxMDk1CToJU3RvY2tob2xtCisxMDk2CToJSElHSExBTkRTCisxMDk3CToJU2thcmFib3JnCisxMDk4CToJSElHSExBTkRTCisxMDk5CToJU3RvY2tob2xtCisxMTAwCToJQpRodXMKKzExMDEJOglISUdITEFORFMKKzExMDIJOglISUdITEFORFMKKzExMDMJOglISUdITEFORFMKKzExMDQJOglISUdITEFORFMKKzExMDUJOglISUdITEFORFMKKzExMDYJOglISUdITEFORFMKKzExMDcJOglISUdITEFORFMKKzExMDgJOglISUdITEFORFMKKzExMDkJOglISUdITEFORFMKKzExMTAJOglISUdITEFORFMKKzExMTEJOglTlHJtbGFuZAorMTExMgk6CUhJR0hMQU5EUworMTExMwk6CUhJR0hMQU5EUworMTExNAk6CUhJR0hMQU5EUworMTExNQk6CUhJR0hMQU5EUworMTExNgk6CUhJR0hMQU5EUworMTExNwk6CUhJR0hMQU5EUworMTExOAk6CUhJR0hMQU5EUworMTExOQk6CUhJR0hMQU5EUworMTEyMAk6CUhJR0hMQU5EUworMTEyMQk6CUhJR0hMQU5EUworMTEyMgk6CUhJR0hMQU5EUworMTEyMwk6CUhJR0hMQU5EUworMTEyNAk6CVVOS05PV04KKzExMjUJOglTlHJtbGFuZAorMTEyNgk6CVNrYXJhYm9yZworMTEyNwk6CVNrYXJhYm9yZworMTEyOAk6CUKUaHVzCisxMTI5CToJQpRodXMKKzExMzAJOglISUdITEFORFMKKzExMzEJOglISUdITEFORFMKKzExMzIJOglClGh1cworMTEzMwk6CUhJR0hMQU5EUworMTEzNAk6CUhJR0hMQU5EUworMTEzNQk6CUhJR0hMQU5EUworMTEzNgk6CUhJR0hMQU5EUworMTEzNwk6CUhJR0hMQU5EUworMTEzOAk6CUhJR0hMQU5EUworMTEzOQk6CUKUaHVzCisxMTQwCToJQpRodXMKKzExNDEJOglISUdITEFORFMKKzExNDIJOglISUdITEFORFMKKzExNDMJOglUZWxlbWFyaworMTE0NAk6CUhJR0hMQU5EUworMTE0NQk6CUhJR0hMQU5EUworMTE0Ngk6CUhJR0hMQU5EUworMTE0Nwk6CUhJR0hMQU5EUworMTE0OAk6CUhJR0hMQU5EUworMTE0OQk6CUhJR0hMQU5EUworMTE1MAk6CUhJR0hMQU5EUworMTE1MQk6CUhJR0hMQU5EUworMTE1Mgk6CUdvdGxhbmQKKzExNTMJOglISUdITEFORFMKKzExNTQJOglISUdITEFORFMKKzExNTUJOglISUdITEFORFMKKzExNTYJOglISUdITEFORFMKKzExNTcJOglISUdITEFORFMKKzExNTgJOglISUdITEFORFMKKzExNTkJOglISUdITEFORFMKKzExNjAJOglISUdITEFORFMKKzExNjEJOglISUdITEFORFMKKzExNjIJOglISUdITEFORFMKKzExNjMJOglISUdITEFORFMKKzExNjQJOglISUdITEFORFMKKzExNjUJOglISUdITEFORFMKKzExNjYJOglISUdITEFORFMKKzExNjcJOglISUdITEFORFMKKzExNjgJOglISUdITEFORFMKKzExNjkJOglISUdITEFORFMKKzExNzAJOglISUdITEFORFMKKzExNzEJOglISUdITEFORFMKKzExNzIJOglISUdITEFORFMKKzExNzMJOglISUdITEFORFMKKzExNzQJOglISUdITEFORFMKKzExNzUJOglISUdITEFORFMKKzExNzYJOglISUdITEFORFMKKzExNzcJOglISUdITEFORFMKKzExNzgJOglBdXN0LUFnZGVyCisxMTc5CToJSElHSExBTkRTCisxMTgwCToJSElHSExBTkRTCisxMTgxCToJSElHSExBTkRTCisxMTgyCToJSElHSExBTkRTCisxMTgzCToJSElHSExBTkRTCisxMTg0CToJSElHSExBTkRTCisxMTg1CToJSElHSExBTkRTCisxMTg2CToJSElHSExBTkRTCisxMTg3CToJSElHSExBTkRTCisxMTg4CToJSElHSExBTkRTCisxMTg5CToJQXVzdC1BZ2RlcgorMTE5MAk6CUF1c3QtQWdkZXIKKzExOTEJOglISUdITEFORFMKKzExOTIJOglISUdITEFORFMKKzExOTMJOglISUdITEFORFMKKzExOTQJOglISUdITEFORFMKKzExOTUJOglISUdITEFORFMKKzExOTYJOglISUdITEFORFMKKzExOTcJOglISUdITEFORFMKKzExOTgJOglISUdITEFORFMKKzExOTkJOglISUdITEFORFMKKzEyMDAJOglISUdITEFORFMKKzEyMDEJOglISUdITEFORFMKKzEyMDIJOglSb2dhbGFuZAorMTIwMwk6CUhJR0hMQU5EUworMTIwNAk6CUhJR0hMQU5EUworMTIwNQk6CUhJR0hMQU5EUworMTIwNgk6CUhJR0hMQU5EUworMTIwNwk6CUhJR0hMQU5EUworMTIwOAk6CUhJR0hMQU5EUworMTIwOQk6CUhJR0hMQU5EUworMTIxMAk6CUhJR0hMQU5EUworMTIxMQk6CUhJR0hMQU5EUworMTIxMgk6CUhJR0hMQU5EUworMTIxMwk6CUhJR0hMQU5EUworMTIxNAk6CUhJR0hMQU5EUworMTIxNQk6CUdvdGxhbmQKKzEyMTYJOglISUdITEFORFMKKzEyMTcJOglISUdITEFORFMKKzEyMTgJOglISUdITEFORFMKKzEyMTkJOglISUdITEFORFMKKzEyMjAJOglISUdITEFORFMKKzEyMjEJOglISUdITEFORFMKKzEyMjIJOglISUdITEFORFMKKzEyMjMJOglClGh1cworMTIyNAk6CUthbG1hcgorMTIyNQk6CUhJR0hMQU5EUworMTIyNgk6CUhJR0hMQU5EUworMTIyNwk6CUhJR0hMQU5EUworMTIyOAk6CUhJR0hMQU5EUworMTIyOQk6CUhJR0hMQU5EUworMTIzMAk6CUhJR0hMQU5EUworMTIzMQk6CUKUaHVzCisxMjMyCToJR290bGFuZAorMTIzMwk6CUdSQU1QSUFOCisxMjM0CToJQXVzdC1BZ2RlcgorMTIzNQk6CUqUbmuUcGluZworMTIzNgk6CVZlc3QtQWdkZXIKKzEyMzcJOglWZXN0LUFnZGVyCisxMjM4CToJSElHSExBTkRTCisxMjM5CToJSElHSExBTkRTCisxMjQwCToJSElHSExBTkRTCisxMjQxCToJSElHSExBTkRTCisxMjQyCToJQpRodXMKKzEyNDMJOglISUdITEFORFMKKzEyNDQJOglISUdITEFORFMKKzEyNDUJOglISUdITEFORFMKKzEyNDYJOglISUdITEFORFMKKzEyNDcJOglISUdITEFORFMKKzEyNDgJOglISUdITEFORFMKKzEyNDkJOglISUdITEFORFMKKzEyNTAJOglISUdITEFORFMKKzEyNTEJOglISUdITEFORFMKKzEyNTIJOglISUdITEFORFMKKzEyNTMJOglISUdITEFORFMKKzEyNTQJOglISUdITEFORFMKKzEyNTUJOglWZXN0LUFnZGVyCisxMjU2CToJSElHSExBTkRTCisxMjU3CToJSElHSExBTkRTCisxMjU4CToJSElHSExBTkRTCisxMjU5CToJSElHSExBTkRTCisxMjYwCToJSElHSExBTkRTCisxMjYxCToJSElHSExBTkRTCisxMjYyCToJSElHSExBTkRTCisxMjYzCToJVmVzdC1BZ2RlcgorMTI2NAk6CUhJR0hMQU5EUworMTI2NQk6CUhJR0hMQU5EUworMTI2Ngk6CVZlc3QtQWdkZXIKKzEyNjcJOglISUdITEFORFMKKzEyNjgJOglISUdITEFORFMKKzEyNjkJOglISUdITEFORFMKKzEyNzAJOglISUdITEFORFMKKzEyNzEJOglISUdITEFORFMKKzEyNzIJOglISUdITEFORFMKKzEyNzMJOglISUdITEFORFMKKzEyNzQJOglISUdITEFORFMKKzEyNzUJOglISUdITEFORFMKKzEyNzYJOglISUdITEFORFMKKzEyNzcJOglISUdITEFORFMKKzEyNzgJOglISUdITEFORFMKKzEyNzkJOglISUdITEFORFMKKzEyODAJOglISUdITEFORFMKKzEyODEJOglClGh1cworMTI4Mgk6CUKUaHVzCisxMjgzCToJSElHSExBTkRTCisxMjg0CToJSElHSExBTkRTCisxMjg1CToJSElHSExBTkRTCisxMjg2CToJSElHSExBTkRTCisxMjg3CToJQpRodXMKKzEyODgJOglISUdITEFORFMKKzEyODkJOglISUdITEFORFMKKzEyOTAJOglISUdITEFORFMKKzEyOTEJOglISUdITEFORFMKKzEyOTIJOglISUdITEFORFMKKzEyOTMJOglISUdITEFORFMKKzEyOTQJOglISUdITEFORFMKKzEyOTUJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxMjk2CToJSElHSExBTkRTCisxMjk3CToJSElHSExBTkRTCisxMjk4CToJQpRodXMKKzEyOTkJOglClGh1cworMTMwMAk6CUhJR0hMQU5EUworMTMwMQk6CUhJR0hMQU5EUworMTMwMgk6CUhJR0hMQU5EUworMTMwMwk6CUhJR0hMQU5EUworMTMwNAk6CUhJR0hMQU5EUworMTMwNQk6CUhJR0hMQU5EUworMTMwNgk6CUhhbGxhbmQKKzEzMDcJOglLcm9ub2JlcmcKKzEzMDgJOglISUdITEFORFMKKzEzMDkJOglISUdITEFORFMKKzEzMTAJOglISUdITEFORFMKKzEzMTEJOglISUdITEFORFMKKzEzMTIJOglCT1JELUNFTlRSLUZJRkUtTE9USElBTi1UQVkKKzEzMTMJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxMzE0CToJSElHSExBTkRTCisxMzE1CToJSElHSExBTkRTCisxMzE2CToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTMxNwk6CUhJR0hMQU5EUworMTMxOAk6CUhJR0hMQU5EUworMTMxOQk6CUhJR0hMQU5EUworMTMyMAk6CUhJR0hMQU5EUworMTMyMQk6CUhJR0hMQU5EUworMTMyMgk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzEzMjMJOglISUdITEFORFMKKzEzMjQJOglISUdITEFORFMKKzEzMjUJOglISUdITEFORFMKKzEzMjYJOglISUdITEFORFMKKzEzMjcJOglEVU1GUklFUy1HQUxMTworMTMyOAk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzEzMjkJOglISUdITEFORFMKKzEzMzAJOglLcm9ub2JlcmcKKzEzMzEJOglISUdITEFORFMKKzEzMzIJOglISUdITEFORFMKKzEzMzMJOglISUdITEFORFMKKzEzMzQJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxMzM1CToJSElHSExBTkRTCisxMzM2CToJRFVNRlJJRVMtR0FMTE8KKzEzMzcJOglISUdITEFORFMKKzEzMzgJOglISUdITEFORFMKKzEzMzkJOglISUdITEFORFMKKzEzNDAJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxMzQxCToJSElHSExBTkRTCisxMzQyCToJRFVNRlJJRVMtR0FMTE8KKzEzNDMJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxMzQ0CToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTM0NQk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzEzNDYJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxMzQ3CToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTM0OAk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzEzNDkJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxMzUwCToJSElHSExBTkRTCisxMzUxCToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTM1Mgk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzEzNTMJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxMzU0CToJRFVNRlJJRVMtR0FMTE8KKzEzNTUJOglISUdITEFORFMKKzEzNTYJOglISUdITEFORFMKKzEzNTcJOglISUdITEFORFMKKzEzNTgJOglISUdITEFORFMKKzEzNTkJOglISUdITEFORFMKKzEzNjAJOglEVU1GUklFUy1HQUxMTworMTM2MQk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzEzNjIJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxMzYzCToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTM2NAk6CURVTUZSSUVTLUdBTExPCisxMzY1CToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTM2Ngk6CURVTUZSSUVTLUdBTExPCisxMzY3CToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTM2OAk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzEzNjkJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxMzcwCToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTM3MQk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzEzNzIJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxMzczCToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTM3NAk6CURVTUZSSUVTLUdBTExPCisxMzc1CToJRFVNRlJJRVMtR0FMTE8KKzEzNzYJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxMzc3CToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTM3OAk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzEzNzkJOglEVU1GUklFUy1HQUxMTworMTM4MAk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzEzODEJOglEVU1GUklFUy1HQUxMTworMTM4Mgk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzEzODMJOglEVU1GUklFUy1HQUxMTworMTM4NAk6CURVTUZSSUVTLUdBTExPCisxMzg1CToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTM4Ngk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzEzODcJOglEVU1GUklFUy1HQUxMTworMTM4OAk6CUJsZWtpbmdlCisxMzg5CToJS3Jpc3RpYW5zdGFkCisxMzkwCToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTM5MQk6CURVTUZSSUVTLUdBTExPCisxMzkyCToJRFVNRlJJRVMtR0FMTE8KKzEzOTMJOglEVU1GUklFUy1HQUxMTworMTM5NAk6CURVTUZSSUVTLUdBTExPCisxMzk1CToJSVJFTEFORAorMTM5Ngk6CUlSRUxBTkQKKzEzOTcJOglJUkVMQU5ECisxMzk4CToJSVJFTEFORAorMTM5OQk6CU1hbG2UaHVzCisxNDAwCToJQmxla2luZ2UKKzE0MDEJOglCbGVraW5nZQorMTQwMgk6CUlSRUxBTkQKKzE0MDMJOglCbGVraW5nZQorMTQwNAk6CUlSRUxBTkQKKzE0MDUJOglJUkVMQU5ECisxNDA2CToJQmxla2luZ2UKKzE0MDcJOglJUkVMQU5ECisxNDA4CToJQmxla2luZ2UKKzE0MDkJOglCbGVraW5nZQorMTQxMAk6CUJsZWtpbmdlCisxNDExCToJRFVNRlJJRVMtR0FMTE8KKzE0MTIJOglOT1JUSFVNQkVSTEFORAorMTQxMwk6CUlSRUxBTkQKKzE0MTQJOglJUkVMQU5ECisxNDE1CToJSVJFTEFORAorMTQxNgk6CUlSRUxBTkQKKzE0MTcJOglCbGVraW5nZQorMTQxOAk6CUlSRUxBTkQKKzE0MTkJOglJUkVMQU5ECisxNDIwCToJSVJFTEFORAorMTQyMQk6CUJsZWtpbmdlCisxNDIyCToJSVJFTEFORAorMTQyMwk6CUlSRUxBTkQKKzE0MjQJOglJUkVMQU5ECisxNDI1CToJSVJFTEFORAorMTQyNgk6CU5PUlRIRVJOIElSRUxBTkQKKzE0MjcJOglJUkVMQU5ECisxNDI4CToJSE9WRURTVEFEU1JFR0lPTkVOCisxNDI5CToJTk9SVEhFUk4gSVJFTEFORAorMTQzMAk6CUlSRUxBTkQKKzE0MzEJOglOT1JUSEVSTiBJUkVMQU5ECisxNDMyCToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTQzMwk6CUlSRUxBTkQKKzE0MzQJOglOT1JUSEVSTiBJUkVMQU5ECisxNDM1CToJSVJFTEFORAorMTQzNgk6CUlSRUxBTkQKKzE0MzcJOglJUkVMQU5ECisxNDM4CToJSVJFTEFORAorMTQzOQk6CUlSRUxBTkQKKzE0NDAJOglJUkVMQU5ECisxNDQxCToJSVJFTEFORAorMTQ0Mgk6CU9TVCBGT1IgU1RPUkVCQUVMVAorMTQ0Mwk6CUlSRUxBTkQKKzE0NDQJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNDQ1CToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTQ0Ngk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE0NDcJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNDQ4CToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTQ0OQk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE0NTAJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNDUxCToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTQ1Mgk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE0NTMJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNDU0CToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTQ1NQk6CUlSRUxBTkQKKzE0NTYJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNDU3CToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTQ1OAk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE0NTkJOglJUkVMQU5ECisxNDYwCToJSE9WRURTVEFEU1JFR0lPTkVOCisxNDYxCToJSVJFTEFORAorMTQ2Mgk6CUlSRUxBTkQKKzE0NjMJOglIT1ZFRFNUQURTUkVHSU9ORU4KKzE0NjQJOglIT1ZFRFNUQURTUkVHSU9ORU4KKzE0NjUJOglIT1ZFRFNUQURTUkVHSU9ORU4KKzE0NjYJOglDVU1CUklBCisxNDY3CToJSVJFTEFORAorMTQ2OAk6CUlSRUxBTkQKKzE0NjkJOglOT1JUSEVSTiBJUkVMQU5ECisxNDkxCToJSVJFTEFORAorMTUwMQk6CUlSRUxBTkQKKzE1MDUJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNTE2CToJSVJFTEFORAorMTUyOAk6CUlSRUxBTkQKKzE1MzMJOglJUkVMQU5ECisxNTM0CToJSVJFTEFORAorMTUzNQk6CUlSRUxBTkQKKzE1MzcJOglJUkVMQU5ECisxNTM4CToJSVJFTEFORAorMTU0MAk6CUhPVkVEU1RBRFNSRUdJT05FTgorMTU0Mgk6CUhPVkVEU1RBRFNSRUdJT05FTgorMTU0NAk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE1NDgJOglOT1JUSEVSTiBJUkVMQU5ECisxNTQ5CToJSVJFTEFORAorMTU1MAk6CUlSRUxBTkQKKzE1NTEJOglOT1JUSEVSTiBJUkVMQU5ECisxNTU0CToJSVJFTEFORAorMTU1Ngk6CUlSRUxBTkQKKzE1NTgJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNTU5CToJSVJFTEFORAorMTU2MAk6CU9TVCBGT1IgU1RPUkVCQUVMVAorMTU2OAk6CU5PUlRIRVJOIElSRUxBTkQKKzE1NjkJOglJUkVMQU5ECisxNTcwCToJTk9SVEhFUk4gSVJFTEFORAorMTU3MQk6CU9TVCBGT1IgU1RPUkVCQUVMVAorMTU3Mgk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE1NzMJOglPU1QgRk9SIFNUT1JFQkFFTFQKKzE1NzkJOglJUkVMQU5ECisxNTgwCToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTU4Ngk6CUlSRUxBTkQKKzE1ODkJOglPU1QgRk9SIFNUT1JFQkFFTFQKKzE1OTMJOglJUkVMQU5ECisxNTk0CToJSVJFTEFORAorMTU5NQk6CUlSRUxBTkQKKzE1OTYJOglJUkVMQU5ECisxNTk3CToJTk9SVEhFUk4gSVJFTEFORAorMTU5OAk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE1OTkJOglDTEVWRUxBTkQKKzE2MDAJOglOT1JUSEVSTiBJUkVMQU5ECisxNjAxCToJSVJFTEFORAorMTYwMgk6CU5PUlRIRVJOIElSRUxBTkQKKzE2MDMJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNjA0CToJSVJFTEFORAorMTYwNQk6CU5PUlRIRVJOIElSRUxBTkQKKzE2MDYJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNjA3CToJTk9SVEhFUk4gSVJFTEFORAorMTYwOAk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE2MDkJOglOT1JUSEVSTiBJUkVMQU5ECisxNjEwCToJTk9SVEhFUk4gSVJFTEFORAorMTYxMQk6CU5PUlRIRVJOIElSRUxBTkQKKzE2MTIJOglOT1JUSEVSTiBJUkVMQU5ECisxNjEzCToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTYxNAk6CU5PUlRIRVJOIElSRUxBTkQKKzE2MTUJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNjE2CToJTk9SVEhFUk4gSVJFTEFORAorMTYxNwk6CU5PUlRIRVJOIElSRUxBTkQKKzE2MTgJOglOT1JUSEVSTiBJUkVMQU5ECisxNjE5CToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTYyMAk6CU5PUlRIRVJOIElSRUxBTkQKKzE2MjEJOglJUkVMQU5ECisxNjIyCToJTk9SVEhFUk4gSVJFTEFORAorMTYyMwk6CU9TVCBGT1IgU1RPUkVCQUVMVAorMTYyNAk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE2MjUJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNjI2CToJSVJFTEFORAorMTYyNwk6CU5PUlRIRVJOIElSRUxBTkQKKzE2MjgJOglJUkVMQU5ECisxNjI5CToJSVJFTEFORAorMTYzMAk6CUlSRUxBTkQKKzE2MzEJOglPU1QgRk9SIFNUT1JFQkFFTFQKKzE2MzIJOglPU1QgRk9SIFNUT1JFQkFFTFQKKzE2MzMJOglJUkVMQU5ECisxNjM0CToJT1NUIEZPUiBTVE9SRUJBRUxUCisxNjM1CToJSVJFTEFORAorMTYzNgk6CU5PUlRIRVJOIElSRUxBTkQKKzE2MzcJOglJUkVMQU5ECisxNjM4CToJSVJFTEFORAorMTYzOQk6CU5PUlRIRVJOIElSRUxBTkQKKzE2NDAJOglJUkVMQU5ECisxNjQxCToJTk9SVEhFUk4gSVJFTEFORAorMTY0Mgk6CU9TVCBGT1IgU1RPUkVCQUVMVAorMTY0Mwk6CU5PUlRIRVJOIElSRUxBTkQKKzE2NDQJOglJUkVMQU5ECisxNjQ1CToJSVJFTEFORAorMTY0Ngk6CUlSRUxBTkQKKzE2NDcJOglJUkVMQU5ECisxNjQ4CToJT1NUIEZPUiBTVE9SRUJBRUxUCisxNjQ5CToJSVJFTEFORAorMTY1MAk6CUlSRUxBTkQKKzE2NTEJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNjUyCToJSVJFTEFORAorMTY1Mwk6CUdkYW5zaworMTY1NAk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE2NTUJOglPU1QgRk9SIFNUT1JFQkFFTFQKKzE2NTYJOglJUkVMQU5ECisxNjU3CToJSVJFTEFORAorMTY1OAk6CUlSRUxBTkQKKzE2NTkJOglTdXdhbHNraQorMTY2MAk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE2NjEJOglJUkVMQU5ECisxNjYyCToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTY2Mwk6CUlSRUxBTkQKKzE2NjQJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNjY1CToJSVJFTEFORAorMTY2Ngk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE2NjcJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNjY4CToJT1NUIEZPUiBTVE9SRUJBRUxUCisxNjY5CToJTk9SVEhFUk4gSVJFTEFORAorMTY3MAk6CVVOSVRFRCBLSU5HRE9NCisxNjcxCToJT1NUIEZPUiBTVE9SRUJBRUxUCisxNjcyCToJT1NUIEZPUiBTVE9SRUJBRUxUCisxNjczCToJS2FsaW5pbmdyYWQgb2JsLgorMTY3NAk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE2NzUJOglJUkVMQU5ECisxNjc2CToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTY3Nwk6CUlSRUxBTkQKKzE2NzgJOglPU1QgRk9SIFNUT1JFQkFFTFQKKzE2NzkJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNjgwCToJU2x1cHNrCisxNjgxCToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTY4Mgk6CUlSRUxBTkQKKzE2ODMJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNjg0CToJT1NUIEZPUiBTVE9SRUJBRUxUCisxNjg1CToJU0NITEVTV0lHLUhPTFNURUlOCisxNjg2CToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTY4Nwk6CUlSRUxBTkQKKzE2ODgJOglJUkVMQU5ECisxNjg5CToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTY5MAk6CUlSRUxBTkQKKzE2OTEJOglJUkVMQU5ECisxNjkyCToJSVJFTEFORAorMTY5Mwk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE2OTQJOglPU1QgRk9SIFNUT1JFQkFFTFQKKzE2OTUJOglJUkVMQU5ECisxNjk2CToJSVJFTEFORAorMTY5Nwk6CU9TVCBGT1IgU1RPUkVCQUVMVAorMTY5OAk6CU9TVCBGT1IgU1RPUkVCQUVMVAorMTY5OQk6CU9TVCBGT1IgU1RPUkVCQUVMVAorMTcwMAk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE3MDEJOglPU1QgRk9SIFNUT1JFQkFFTFQKKzE3MDIJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNzAzCToJTk9SVEggWU9SS1NISVJFCisxNzA0CToJSVJFTEFORAorMTcwNQk6CU9TVCBGT1IgU1RPUkVCQUVMVAorMTcwNgk6CUlSRUxBTkQKKzE3MDcJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNzA4CToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTcwOQk6CUlSRUxBTkQKKzE3MTAJOglPU1QgRk9SIFNUT1JFQkFFTFQKKzE3MTEJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNzEyCToJSVJFTEFORAorMTcxMwk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE3MTQJOglJUkVMQU5ECisxNzE1CToJT1NUIEZPUiBTVE9SRUJBRUxUCisxNzE2CToJT1NUIEZPUiBTVE9SRUJBRUxUCisxNzE3CToJT2xzenR5bgorMTcxOAk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE3MTkJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNzIwCToJVkVTVCBGT1IgU1RPUkVCQUVMVAorMTcyMQk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE3MjIJOglWRVNUIEZPUiBTVE9SRUJBRUxUCisxNzIzCToJT1NUIEZPUiBTVE9SRUJBRUxUCisxNzI0CToJRWxibGFnCisxNzI1CToJVU5LTk9XTgorMTcyNgk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE3MjcJOglJUkVMQU5ECisxNzI4CToJSVJFTEFORAorMTcyOQk6CU9TVCBGT1IgU1RPUkVCQUVMVAorMTczMAk6CU9TVCBGT1IgU1RPUkVCQUVMVAorMTczMQk6CU9TVCBGT1IgU1RPUkVCQUVMVAorMTczMgk6CU9TVCBGT1IgU1RPUkVCQUVMVAorMTczMwk6CVZFU1QgRk9SIFNUT1JFQkFFTFQKKzE3MzQJOglJUkVMQU5ECisxNzM1CToJT1NUIEZPUiBTVE9SRUJBRUxUCisxNzM2CToJT1NUIEZPUiBTVE9SRUJBRUxUCisxNzM3CToJT1NUIEZPUiBTVE9SRUJBRUxUCisxNzM4CToJVU5JVEVEIEtJTkdET00KKzE3MzkJOglJUkVMQU5ECisxNzQwCToJSVJFTEFORAorMTc0MQk6CUlSRUxBTkQKKzE3NDIJOglNRUNLTEVOQlVSRy1WT1JQT01NRVJOCisxNzQzCToJSVJFTEFORAorMTc0NAk6CUNIRU1OSVRaCisxNzQ1CToJTEFOQ0FTSElSRQorMTc0Ngk6CUlSRUxBTkQKKzE3NDcJOglJUkVMQU5ECisxNzQ4CToJSVJFTEFORAorMTc0OQk6CUtvc3phbGluCisxNzUwCToJSVJFTEFORAorMTc1MQk6CUlSRUxBTkQKKzE3NTIJOglJUkVMQU5ECisxNzUzCToJSVJFTEFORAorMTc1NAk6CUNIRU1OSVRaCisxNzU1CToJSVJFTEFORAorMTc1Ngk6CUlSRUxBTkQKKzE3NTcJOglJUkVMQU5ECisxNzU4CToJSVJFTEFORAorMTc1OQk6CUlSRUxBTkQKKzE3NjAJOglJUkVMQU5ECisxNzYxCToJT1NUIEZPUiBTVE9SRUJBRUxUCisxNzYyCToJSVJFTEFORAorMTc2Mwk6CU9TVCBGT1IgU1RPUkVCQUVMVAorMTc2NAk6CU9TVCBGT1IgU1RPUkVCQUVMVAorMTc2NQk6CU9TVCBGT1IgU1RPUkVCQUVMVAorMTc2Ngk6CU1FQ0tMRU5CVVJHLVZPUlBPTU1FUk4KKzE3NjcJOglJUkVMQU5ECisxNzY4CToJSVJFTEFORAorMTc2OQk6CUlSRUxBTkQKKzE3NzAJOglJUkVMQU5ECisxNzcxCToJSVJFTEFORAorMTc3Mgk6CUlSRUxBTkQKKzE3NzMJOglJUkVMQU5ECisxNzc0CToJT1NUIEZPUiBTVE9SRUJBRUxUCisxNzc1CToJSVJFTEFORAorMTc3Ngk6CUlSRUxBTkQKKzE3NzcJOglJUkVMQU5ECisxNzc4CToJSVJFTEFORAorMTc3OQk6CUlSRUxBTkQKKzE3ODAJOglJUkVMQU5ECisxNzgxCToJSVJFTEFORAorMTc4Mgk6CU1FQ0tMRU5CVVJHLVZPUlBPTU1FUk4KKzE3ODMJOglDSEVNTklUWgorMTc4NAk6CU1FQ0tMRU5CVVJHLVZPUlBPTU1FUk4KKzE3ODUJOglCaWFseXN0b2sKKzE3ODYJOglJUkVMQU5ECisxNzg3CToJSVJFTEFORAorMTc4OAk6CUNIRU1OSVRaCisxNzg5CToJSVJFTEFORAorMTc5MAk6CU1FQ0tMRU5CVVJHLVZPUlBPTU1FUk4KKzE3OTEJOglNRUNLTEVOQlVSRy1WT1JQT01NRVJOCisxNzkyCToJSFVNQkVSU0lERQorMTc5Mwk6CUxvbXphCisxNzk0CToJSVJFTEFORAorMTc5NQk6CUlSRUxBTkQKKzE3OTYJOglNRUNLTEVOQlVSRy1WT1JQT01NRVJOCisxNzk3CToJSVJFTEFORAorMTc5OAk6CUlSRUxBTkQKKzE3OTkJOglNRUNLTEVOQlVSRy1WT1JQT01NRVJOCisxODAwCToJSVJFTEFORAorMTgwMQk6CUlSRUxBTkQKKzE4MDIJOglJUkVMQU5ECisxODAzCToJSVJFTEFORAorMTgwNAk6CUlSRUxBTkQKKzE4MDUJOglJUkVMQU5ECisxODA2CToJTUVDS0xFTkJVUkctVk9SUE9NTUVSTgorMTgwNwk6CUlSRUxBTkQKKzE4MDgJOglXRVNUIFlPUktTSElSRQorMTgwOQk6CU1FQ0tMRU5CVVJHLVZPUlBPTU1FUk4KKzE4MTAJOglNRUNLTEVOQlVSRy1WT1JQT01NRVJOCisxODExCToJSVJFTEFORAorMTgxMgk6CUJ5ZGdvc3pjegorMTgxMwk6CUlSRUxBTkQKKzE4MTQJOglTemN6ZWNpbgorMTgxNQk6CUlSRUxBTkQKKzE4MTYJOglNRUNLTEVOQlVSRy1WT1JQT01NRVJOCisxODE3CToJTUVSU0VZU0lERQorMTgxOAk6CVdFU0VSLUVNUworMTgxOQk6CUlSRUxBTkQKKzE4MjAJOglJUkVMQU5ECisxODIxCToJT3N0cm9sZWthCisxODIyCToJR1JFQVRFUiBNQU5DSEVTVEVSCisxODIzCToJU3pjemVjaW4KKzE4MjQJOglDTFdZRAorMTgyNQk6CU1FQ0tMRU5CVVJHLVZPUlBPTU1FUk4KKzE4MjYJOglDTFdZRAorMTgyNwk6CVNPVVRIIFlPUktTSElSRQorMTgyOAk6CUlSRUxBTkQKKzE4MjkJOglNRUNLTEVOQlVSRy1WT1JQT01NRVJOCisxODMwCToJSVJFTEFORAorMTgzMQk6CUlSRUxBTkQKKzE4MzIJOglNRVJTRVlTSURFCisxODMzCToJSVJFTEFORAorMTgzNAk6CVRvcnVuCisxODM1CToJREVSQllTSElSRQorMTgzNgk6CUlSRUxBTkQKKzE4MzcJOglJUkVMQU5ECisxODM4CToJQ0hFU0hJUkUKKzE4MzkJOglDTFdZRAorMTg0MAk6CUlSRUxBTkQKKzE4NDEJOglJUkVMQU5ECisxODQyCToJSVJFTEFORAorMTg0Mwk6CUlSRUxBTkQKKzE4NDQJOglJUkVMQU5ECisxODQ1CToJU3pjemVjaW4KKzE4NDYJOglJUkVMQU5ECisxODQ3CToJSVJFTEFORAorMTg0OAk6CUxJTkNPTE5TSElSRQorMTg0OQk6CUlSRUxBTkQKKzE4NTAJOglJUkVMQU5ECisxODUxCToJV0VTRVItRU1TCisxODUyCToJSVJFTEFORAorMTg1Mwk6CUNpZWNoYW5vdworMTg1NAk6CUlSRUxBTkQKKzE4NTUJOglQaWxhCisxODU2CToJTUVSU0VZU0lERQorMTg1Nwk6CUxVRU5FQlVSRworMTg1OAk6CVdFU0VSLUVNUworMTg1OQk6CUlSRUxBTkQKKzE4NjAJOglJUkVMQU5ECisxODYxCToJV0VTRVItRU1TCisxODYyCToJSVJFTEFORAorMTg2Mwk6CVdFU0VSLUVNUworMTg2NAk6CUhBTUJVUkcKKzE4NjUJOglXRVNFUi1FTVMKKzE4NjYJOglXRVNFUi1FTVMKKzE4NjcJOglXRVNFUi1FTVMKKzE4NjgJOglXRVNFUi1FTVMKKzE4NjkJOglTSFJPUFNISVJFCisxODcwCToJV0VTRVItRU1TCisxODcxCToJSVJFTEFORAorMTg3Mgk6CVdFU0VSLUVNUworMTg3Mwk6CUlSRUxBTkQKKzE4NzQJOglJUkVMQU5ECisxODc1CToJV0VTRVItRU1TCisxODc2CToJSVJFTEFORAorMTg3Nwk6CVdFU0VSLUVNUworMTg3OAk6CUlSRUxBTkQKKzE4NzkJOglJUkVMQU5ECisxODgwCToJV2xvY2xhd2VrCisxODgxCToJR1JPTklOR0VOCisxODgyCToJR1JPTklOR0VOCisxODgzCToJR1JPTklOR0VOCisxODg0CToJRlJJRVNMQU5ECisxODg1CToJQlJBTkRFTkJVUkcKKzE4ODYJOglDTFdZRAorMTg4Nwk6CUdvcnpvdworMTg4OAk6CUZSSUVTTEFORAorMTg4OQk6CUZSSUVTTEFORAorMTg5MAk6CUZSSUVTTEFORAorMTg5MQk6CUdST05JTkdFTgorMTg5Mgk6CUlSRUxBTkQKKzE4OTMJOglGUklFU0xBTkQKKzE4OTQJOglJUkVMQU5ECisxODk1CToJUGxvY2sKKzE4OTYJOglTaWVkbGNlCisxODk3CToJRlJJRVNMQU5ECisxODk4CToJRlJJRVNMQU5ECisxODk5CToJSVJFTEFORAorMTkwMAk6CUxFSUNFU1RFUlNISVJFCisxOTAxCToJSVJFTEFORAorMTkwMgk6CUlSRUxBTkQKKzE5MDMJOglJUkVMQU5ECisxOTA0CToJSVJFTEFORAorMTkwNQk6CUlSRUxBTkQKKzE5MDYJOglJUkVMQU5ECisxOTA3CToJSVJFTEFORAorMTkwOAk6CUVBU1QgQU5HTElBCisxOTA5CToJSVJFTEFORAorMTkxMAk6CU5PT1JELUhPTExBTkQKKzE5MTEJOglJUkVMQU5ECisxOTEyCToJSVJFTEFORAorMTkxMwk6CUlSRUxBTkQKKzE5MTQJOglCUkVNRU4KKzE5MTUJOglEUkVOVEhFCisxOTE2CToJSVJFTEFORAorMTkxNwk6CUJpYWxhIFBvZGxhc2thCisxOTE4CToJV2Fyc3phd2EKKzE5MTkJOglXRVNUIE1JRExBTkRTIChDT1VOVFkpCisxOTIwCToJVU5LTk9XTgorMTkyMQk6CUhFUkVGT1JECisxOTIyCToJSVJFTEFORAorMTkyMwk6CUZSSUVTTEFORAorMTkyNAk6CUlSRUxBTkQKKzE5MjUJOglJUkVMQU5ECisxOTI2CToJSVJFTEFORAorMTkyNwk6CUlSRUxBTkQKKzE5MjgJOglJUkVMQU5ECisxOTI5CToJSVJFTEFORAorMTkzMAk6CUlSRUxBTkQKKzE5MzEJOglQb3puYW4KKzE5MzIJOglJUkVMQU5ECisxOTMzCToJTUFHREVCVVJHCisxOTM0CToJSVJFTEFORAorMTkzNQk6CU5PT1JELUhPTExBTkQKKzE5MzYJOglIQU5OT1ZFUgorMTkzNwk6CUlSRUxBTkQKKzE5MzgJOglJUkVMQU5ECisxOTM5CToJSVJFTEFORAorMTk0MAk6CUlSRUxBTkQKKzE5NDEJOglJUkVMQU5ECisxOTQyCToJSVJFTEFORAorMTk0Mwk6CUlSRUxBTkQKKzE5NDQJOglTa2llcm5pZXdpY2UKKzE5NDUJOglJUkVMQU5ECisxOTQ2CToJS29uaW4KKzE5NDcJOglJUkVMQU5ECisxOTQ4CToJSVJFTEFORAorMTk0OQk6CU9WRVJJSlNTRUwKKzE5NTAJOglJUkVMQU5ECisxOTUxCToJRkxFVk9MQU5ECisxOTUyCToJSVJFTEFORAorMTk1Mwk6CUlSRUxBTkQKKzE5NTQJOglJUkVMQU5ECisxOTU1CToJSVJFTEFORAorMTk1Ngk6CUlSRUxBTkQKKzE5NTcJOglCUkFVTlNDSFdFSUcKKzE5NTgJOglJUkVMQU5ECisxOTU5CToJQkVSTElOCisxOTYwCToJRkxFVk9MQU5ECisxOTYxCToJQkVERk9SRFNISVJFCisxOTYyCToJQkVSS1MKKzE5NjMJOglBVk9OCisxOTY0CToJR1dFTlQKKzE5NjUJOglHRUxERVJMQU5ECisxOTY2CToJUmFkb20KKzE5NjcJOglaaWVsb25hIEdvcmEKKzE5NjgJOglMdWJsaW4KKzE5NjkJOglERVRNT0xECisxOTcwCToJQ2hlbG0KKzE5NzEJOglMb2R6CisxOTcyCToJTVVFTlNURVIKKzE5NzMJOglLYWxpc3oKKzE5NzQJOglTaWVyYWR6CisxOTc1CToJWlVJRC1IT0xMQU5ECisxOTc2CToJTGVzem5vCisxOTc3CToJRVNTRVgKKzE5NzgJOglVVFJFQ0hUCisxOTc5CToJUGlvdHJrb3cKKzE5ODAJOglERVNTQVUKKzE5ODEJOglFU1NFWAorMTk4Mgk6CUVTU0VYCisxOTgzCToJRVNTRVgKKzE5ODQJOglFU1NFWAorMTk4NQk6CUVTU0VYCisxOTg2CToJRVNTRVgKKzE5ODcJOglaVUlELUhPTExBTkQKKzE5ODgJOglHUkVBVEVSIExPTkRPTgorMTk4OQk6CVVOS05PV04KKzE5OTAJOglFU1NFWAorMTk5MQk6CUVTU0VYCisxOTkyCToJRVNTRVgKKzE5OTMJOglMZWduaWNhCisxOTk0CToJV3JvY2xhdworMTk5NQk6CURVRVNTRUxET1JGCisxOTk2CToJWlVJRC1IT0xMQU5ECisxOTk3CToJSEFMTEUKKzE5OTgJOglET1JTRVQKKzE5OTkJOglDT1JOV0FMTAorMjAwMQk6CU5PT1JELUJSQUJBTlQKKzIwMDIJOglaYW1vc2MKKzIwMDQJOglTVVJSRVkKKzIwMDUJOglaVUlELUhPTExBTkQKKzIwMDYJOglMSU1CVVJHCisyMDA3CToJSEFNUFNISVJFCisyMDA4CToJWkVFTEFORAorMjAwOQk6CUtpZWxjZQorMjAxMAk6CUtFTlQKKzIwMTEJOglBUk5TQkVSRworMjAxMgk6CVRhcm5vYnJ6ZWcKKzIwMTMJOglMRUlQWklHCisyMDE0CToJRFJFU0RFTgorMjAxNQk6CUtFTlQKKzIwMTYJOglKZWxlbmlhIEdvcmEKKzIwMTcJOglLRU5UCisyMDE4CToJS0VOVAorMjAxOQk6CUtFTlQKKzIwMjAJOglUSFVSSU5HRU4KKzIwMjEJOglLQVNTRUwKKzIwMjIJOglVTktOT1dOCisyMDIzCToJQ3plc3RvY2hvd2EKKzIwMjQJOglBTlRXRVJQRU4KKzIwMjUJOglVTktOT1dOCisyMDI2CToJWkVFTEFORAorMjAyNwk6CUFOVFdFUlBFTgorMjAyOAk6CVdFU1QtVkxBQU5ERVJFTgorMjAyOQk6CU9wb2xlCisyMDMwCToJV0VTVC1WTEFBTkRFUkVOCisyMDMxCToJRFJFU0RFTgorMjAzMgk6CU9PU1QtVkxBQU5ERVJFTgorMjAzMwk6CUxJTUJVUkcKKzIwMzQJOglOT1JEIC0gUEFTLURFLUNBTEFJUworMjAzNQk6CVdhbGJyenljaAorMjAzNgk6CUtPRUxOCisyMDM3CToJUHJ6ZW15c2wKKzIwMzgJOglIQU1QU0hJUkUKKzIwMzkJOglIQU1QU0hJUkUKKzIwNDAJOglTZXZlcm9jZXNreSBrcmFqCisyMDQxCToJQ0hFTU5JVFoKKzIwNDIJOglSemVzem93CisyMDQzCToJVU5LTk9XTgorMjA0NAk6CUthdG93aWNlCisyMDQ1CToJQlJVWEVMTEVTLUJSVVNTRUwKKzIwNDYJOglHSUVTU0VOCisyMDQ3CToJVnljaG9kb2Nlc2t5IGtyYWoKKzIwNDgJOglDT1JOV0FMTAorMjA0OQk6CUNPUk5XQUxMCisyMDUwCToJSEFJTkFVVAorMjA1MQk6CUNPUk5XQUxMCisyMDUyCToJVGFybm93CisyMDUzCToJS09CTEVOWgorMjA1NAk6CUNPUk5XQUxMCisyMDU1CToJQ09STldBTEwKKzIwNTYJOglIQUlOQVVUCisyMDU3CToJQ09STldBTEwKKzIwNTgJOglDT1JOV0FMTAorMjA1OQk6CUtyYWtvdworMjA2MAk6CU5JVkVMTEVTCisyMDYxCToJTElFR0UKKzIwNjIJOglMSU1CVVJHCisyMDYzCToJU3RyZWRvY2Vza3kga3JhagorMjA2NAk6CU5BTVVSCisyMDY1CToJU2V2ZXJvbW9yYXZza3kga3JhagorMjA2Ngk6CVBJQ0FSRElFCisyMDY3CToJQmllbHNrby1CaWFsYQorMjA2OAk6CVVOVEVSRlJBTktFTgorMjA2OQk6CUtyb3NubworMjA3MAk6CU9CRVJGUkFOS0VOCisyMDcxCToJWmFwYWRvY2Vza3kga3JhagorMjA3Mgk6CURBUk1TVEFEVAorMjA3Mwk6CUxVWEVNQk9VUkcKKzIwNzQJOglUUklFUgorMjA3NQk6CU5vd3kgU2FjegorMjA3Ngk6CUhBVVRFLU5PUk1BTkRJRQorMjA3Nwk6CVByYWhhCisyMDc4CToJVU5JVEVEIEtJTkdET00KKzIwNzkJOglDSEFNUEFHTkUtQVJERU5ORQorMjA4MAk6CUJBU1NFLU5PUk1BTkRJRQorMjA4MQk6CUxVWEVNQk9VUkcgKEdSQU5ELURVQ0hFKQorMjA4Mgk6CVljaG9kb3Nsb3ZlbnNraSBrcmFqCisyMDgzCToJT0JFUlBGQUxaCisyMDg0CToJUkhFSU5IRVNTRU4tUEZBTFoKKzIwODUJOglTdHJlZG9sc2xvdmVuc2t5IGtyYWoKKzIwODYJOglVTklURUQgS0lOR0RPTQorMjA4Nwk6CUppaG9tb3JhdnNreSBrcmFqCisyMDg4CToJVU5JVEVEIEtJTkdET00KKzIwODkJOglNSVRURUxGUkFOS0VOCisyMDkwCToJSmlob2Nlc2t5IGtyYWoKKzIwOTEJOglTVFVUVEdBUlQKKzIwOTIJOglMT1JSQUlORQorMjA5Mwk6CUtBUkxTUlVIRQorMjA5NAk6CVNBQVJMQU5ECisyMDk1CToJQm90b3NhbmkKKzIwOTYJOglCUkVUQUdORQorMjA5Nwk6CUlMRSBERSBGUkFOQ0UKKzIwOTgJOglCUkVUQUdORQorMjA5OQk6CUJSRVRBR05FCisyMTAwCToJWmFwYWRvc2xvdmVuc2t5IGtyYWoKKzIxMDEJOglCQVNTRS1OT1JNQU5ESUUKKzIxMDIJOglCUkVUQUdORQorMjEwMwk6CU5JRURFUkJBWUVSTgorMjEwNAk6CUJvcnNvZC1BYmF1ai1aZW1wbGVuCisyMTA1CToJU3VjZWF2YQorMjEwNgk6CUNFTlRSRQorMjEwNwk6CVN6YWJvbGNzLVN6YXRhci1CZXJlZworMjEwOAk6CU5pZWRlcpRzdGVycmVpY2gKKzIxMDkJOglPQkVSQkFZRVJOCisyMTEwCToJQUxTQUNFCisyMTExCToJSWFzaQorMjExMgk6CVNDSFdBQkVOCisyMTEzCToJTWFyYW11cmVzCisyMTE0CToJU2F0dSBNYXJlCisyMTE1CToJUEFZUyBERSBMQSBMT0lSRQorMjExNgk6CU9iZXKUc3RlcnJlaWNoCisyMTE3CToJQmlzdHJpdGEtTmFzYXVkCisyMTE4CToJTm9ncmFkCisyMTE5CToJRlJFSUJVUkcKKzIxMjAJOglIZXZlcworMjEyMQk6CVRVRUJJTkdFTgorMjEyMgk6CU5lYW10CisyMTIzCToJSGFqZHUtQmloYXIKKzIxMjQJOglXaWVuCisyMTI1CToJQk9VUkdPR05FCisyMTI2CToJQnJhdGlzbGF2YQorMjEyNwk6CVZhc2x1aQorMjEyOAk6CVBlc3QKKzIxMjkJOglCdXJnZW5sYW5kCisyMTMwCToJQ2x1agorMjEzMQk6CUJpaG9yCisyMTMyCToJSGFyZ2hpdGEKKzIxMzMJOglCUkVUQUdORQorMjEzNAk6CVNhbGFqCisyMTM1CToJR3mUci1Nb3Nvbi1Tb3Byb24KKzIxMzYJOglKYXN6LU5hZ3lrdW4tU3pvbG5vaworMjEzNwk6CU11cmVzCisyMTM4CToJQmFjYXUKKzIxMzkJOglLb21hcm9tLUVzenRlcmdvbQorMjE0MAk6CVNhbHpidXJnCisyMTQxCToJRlJBTkNIRS1DT01URQorMjE0Mgk6CUZlamVyCisyMTQzCToJQlJFVEFHTkUKKzIxNDQJOglCUkVUQUdORQorMjE0NQk6CVN0ZWllcm1hcmsKKzIxNDYJOglGZWplcgorMjE0Nwk6CUJSRVRBR05FCisyMTQ4CToJQmVrZXMKKzIxNDkJOglWZXN6cHJlbQorMjE1MAk6CVVOS05PV04KKzIxNTEJOglTY2hhZmZoYXVzZW4KKzIxNTIJOglUaXJvbAorMjE1Mwk6CUdhbGF0aQorMjE1NAk6CVZhcworMjE1NQk6CVRodXJnYXUKKzIxNTYJOglTY2hhZmZoYXVzZW4KKzIxNTcJOglUaHVyZ2F1CisyMTU4CToJWnVyaWNoCisyMTU5CToJVnJhbmNlYQorMjE2MAk6CUFhcmdhdQorMjE2MQk6CUJhY3MtS2lza3VuCisyMTYyCToJQmFzZWwtU3RhZHQKKzIxNjMJOgladXJpY2gKKzIxNjQJOglWb3JhbGJlcmcKKzIxNjUJOglCYXNlbC1MYW5kc2NoYWZ0CisyMTY2CToJQ292YXNuYQorMjE2Nwk6CVNhbmt0IEdhbGxlbgorMjE2OAk6CUJlcm4vQmVybmUKKzIxNjkJOglQT0lUT1UtQ0hBUkVOVEVTCisyMTcwCToJQmFzZWwtU3RhZHQKKzIxNzEJOglTb2xvdGh1cm4KKzIxNzIJOglTYW5rdCBHYWxsZW4KKzIxNzMJOglBcHBlbnplbGwgQXVzc2VycmhvZGVuCisyMTc0CToJQWxiYQorMjE3NQk6CUJhc2VsLVN0YWR0CisyMTc2CToJQXBwZW56ZWxsIElubmVycmhvZGVuCisyMTc3CToJQXBwZW56ZWxsIElubmVycmhvZGVuCisyMTc4CToJQXJhZAorMjE3OQk6CUNzb25ncmFkCisyMTgwCToJQXBwZW56ZWxsIElubmVycmhvZGVuCisyMTgxCToJVU5LTk9XTgorMjE4Mgk6CUJyYXNvdgorMjE4Mwk6CVNpYml1CisyMTg0CToJWmFsYQorMjE4NQk6CVNvbW9neQorMjE4Ngk6CVR1bGNlYQorMjE4Nwk6CUx1emVybgorMjE4OAk6CVRvbG5hCisyMTg5CToJTGljaHRlbnN0ZWluCisyMTkwCToJWnVnCisyMTkxCToJU2Nod3l6CisyMTkyCToJVGlyb2wKKzIxOTMJOglCdXphdQorMjE5NAk6CUuEcm50ZW4KKzIxOTUJOglOZXVjaGF0ZWwKKzIxOTYJOglIdW5lZG9hcmEKKzIxOTcJOglVTktOT1dOCisyMTk4CToJR2xhcnVzCisyMTk5CToJVU5LTk9XTgorMjIwMAk6CVVOS05PV04KKzIyMDEJOglUUkVOVElOTy1BTFRPIEFESUdFCisyMjAyCToJU2xvdmVuaWphCisyMjAzCToJVU5LTk9XTgorMjIwNAk6CVNjaHd5egorMjIwNQk6CUdyYXVigW5kZW4vR3JpZ2lvbmkvR3Jpc2NodW4KKzIyMDYJOglCcmFpbGEKKzIyMDcJOglVTktOT1dOCisyMjA4CToJRnJpYm91cmcvRnJlaWJ1cmcKKzIyMDkJOglNaWR3YWxkZW4KKzIyMTAJOglTY2h3eXoKKzIyMTEJOglOZXVjaGF0ZWwKKzIyMTIJOglVcmkKKzIyMTMJOglPYndhbGRlbgorMjIxNAk6CVVOS05PV04KKzIyMTUJOglBVVZFUkdORQorMjIxNgk6CVZhdWQKKzIyMTcJOglGcmlib3VyZy9GcmVpYnVyZworMjIxOAk6CU5ldWNoYXRlbAorMjIxOQk6CU5ldWNoYXRlbAorMjIyMAk6CU9id2FsZGVuCisyMjIxCToJUHJhaG92YQorMjIyMgk6CUJhcmFueWEKKzIyMjMJOglGcmlib3VyZy9GcmVpYnVyZworMjIyNAk6CUhydmF0c2thCisyMjI1CToJVGltaXMKKzIyMjYJOglGcmlib3VyZy9GcmVpYnVyZworMjIyNwk6CUFyZ2VzCisyMjI4CToJVU5LTk9XTgorMjIyOQk6CVVOS05PV04KKzIyMzAJOglQT0lUT1UtQ0hBUkVOVEVTCisyMjMxCToJVkVORVRPCisyMjMyCToJVm9qdm9kaW5hCisyMjMzCToJRlJJVUxJLVZFTkVaSUEgR0lVTElBCisyMjM0CToJTElNT1VTSU4KKzIyMzUJOglWaWxjZWEKKzIyMzYJOglWYWxhaXMvV2FsbGlzCisyMjM3CToJRGltYm92aXRhCisyMjM4CToJTE9NQkFSRElBCisyMjM5CToJVGljaW5vCisyMjQwCToJUkhPTkUtQUxQRVMKKzIyNDEJOglVTktOT1dOCisyMjQyCToJQ2FsYXJhc2kKKzIyNDMJOglDYWxhcmFzaQorMjI0NAk6CVBJRU1PTlRFCisyMjQ1CToJQ2FyYXMtU2V2ZXJpbgorMjI0Ngk6CUlhbG9taXRhCisyMjQ3CToJVmF1ZAorMjI0OAk6CVZhdWQKKzIyNDkJOglHZW6KdmUKKzIyNTAJOglHb3JqCisyMjUxCToJQnVjdXJlc3RpCisyMjUyCToJQ29uc3RhbnRhCisyMjUzCToJQVFVSVRBSU5FCisyMjU0CToJVkFMTEUgRCdBT1NUQQorMjI1NQk6CU9sdAorMjI1Ngk6CU1laGVkaW50aQorMjI1Nwk6CUZSSVVMSS1WRU5FWklBIEdJVUxJQQorMjI1OAk6CUdpdXJnaXUKKzIyNTkJOglGUklVTEktVkVORVpJQSBHSVVMSUEKKzIyNjAJOglGUklVTEktVkVORVpJQSBHSVVMSUEKKzIyNjEJOglUZWxlb3JtYW4KKzIyNjIJOglEb2xqCisyMjYzCToJUmF6Z3JhZAorMjI2NAk6CVZhcm5hCisyMjY1CToJU3JiaWphCisyMjY2CToJQm9zbmEgaSBIZXJjZWdvdmluYQorMjI2Nwk6CUdpdXJnaXUKKzIyNjgJOglIcnZhdHNrYQorMjI2OQk6CVZFTkVUTworMjI3MAk6CUhydmF0c2thCisyMjcxCToJVkVORVRPCisyMjcyCToJUmF6Z3JhZAorMjI3Mwk6CUhydmF0c2thCisyMjc0CToJTUlESS1QWVJFTkVFUworMjI3NQk6CVZhcm5hCisyMjc2CToJUFJPVkVOQ0UtQUxQRVMtQ09URSBEJ0FaVVIKKzIyNzcJOglWRU5FVE8KKzIyNzgJOglWYXJuYQorMjI3OQk6CUVNSUxJQS1ST01BR05BCisyMjgwCToJSHJ2YXRza2EKKzIyODEJOglMQU5HVUVET0MtUk9VU1NJTExPTgorMjI4Mgk6CUhydmF0c2thCisyMjgzCToJTWloYWpsb3ZncmFkCisyMjg0CToJVkVORVRPCisyMjg1CToJR0FMSUNJQQorMjI4Ngk6CVZFTkVUTworMjI4Nwk6CUhydmF0c2thCisyMjg4CToJSHJ2YXRza2EKKzIyODkJOglIcnZhdHNrYQorMjI5MAk6CVZFTkVUTworMjI5MQk6CUhydmF0c2thCisyMjkyCToJSHJ2YXRza2EKKzIyOTMJOglSYXpncmFkCisyMjk0CToJSHJ2YXRza2EKKzIyOTUJOglMb3ZlYworMjI5Ngk6CUxvdmVjCisyMjk3CToJSHJ2YXRza2EKKzIyOTgJOglIcnZhdHNrYQorMjI5OQk6CU1paGFqbG92Z3JhZAorMjMwMAk6CUhydmF0c2thCisyMzAxCToJTWloYWpsb3ZncmFkCisyMzAyCToJQVNUVVJJQVMKKzIzMDMJOglIcnZhdHNrYQorMjMwNAk6CUxJR1VSSUEKKzIzMDUJOglIcnZhdHNrYQorMjMwNgk6CUhydmF0c2thCisyMzA3CToJSHJ2YXRza2EKKzIzMDgJOglIcnZhdHNrYQorMjMwOQk6CUhydmF0c2thCisyMzEwCToJSHJ2YXRza2EKKzIzMTEJOglIcnZhdHNrYQorMjMxMgk6CUhydmF0c2thCisyMzEzCToJTG92ZWMKKzIzMTQJOglCdXJnYXMKKzIzMTUJOglQUk9WRU5DRS1BTFBFUy1DT1RFIEQnQVpVUgorMjMxNgk6CUhydmF0c2thCisyMzE3CToJSHJ2YXRza2EKKzIzMTgJOglUT1NDQU5BCisyMzE5CToJSHJ2YXRza2EKKzIzMjAJOglIcnZhdHNrYQorMjMyMQk6CUJ1cmdhcworMjMyMgk6CUhydmF0c2thCisyMzIzCToJTG92ZWMKKzIzMjQJOglIcnZhdHNrYQorMjMyNQk6CUhydmF0c2thCisyMzI2CToJSHJ2YXRza2EKKzIzMjcJOglIcnZhdHNrYQorMjMyOAk6CUhydmF0c2thCisyMzI5CToJSHJ2YXRza2EKKzIzMzAJOglDQU5UQUJSSUEKKzIzMzEJOglIcnZhdHNrYQorMjMzMgk6CUhydmF0c2thCisyMzMzCToJQnVyZ2FzCisyMzM0CToJQ0FTVElMTEEgLSBMRU9OCisyMzM1CToJSHJ2YXRza2EKKzIzMzYJOglHcmFkIFNvZmlqYSAobXVuLikKKzIzMzcJOglIcnZhdHNrYQorMjMzOAk6CVBBSVMgVkFTQ08KKzIzMzkJOglIYXNrb3ZvCisyMzQwCToJSHJ2YXRza2EKKzIzNDEJOglTYW4gTWFyaW5vCisyMzQyCToJSHJ2YXRza2EKKzIzNDMJOglIcnZhdHNrYQorMjM0NAk6CUhydmF0c2thCisyMzQ1CToJTUFSQ0hFCisyMzQ2CToJSHJ2YXRza2EKKzIzNDcJOglIcnZhdHNrYQorMjM0OAk6CUNybmEgR29yYQorMjM0OQk6CUhydmF0c2thCisyMzUwCToJQ0FOVEFCUklBCisyMzUxCToJSHJ2YXRza2EKKzIzNTIJOglIcnZhdHNrYQorMjM1Mwk6CVBsb3ZkaXYKKzIzNTQJOglIcnZhdHNrYQorMjM1NQk6CUhydmF0c2thCisyMzU2CToJSHJ2YXRza2EKKzIzNTcJOglIcnZhdHNrYQorMjM1OAk6CUhydmF0c2thCisyMzU5CToJSHJ2YXRza2EKKzIzNjAJOglLb3Nvdm8KKzIzNjEJOglIcnZhdHNrYQorMjM2Mgk6CUhydmF0c2thCisyMzYzCToJSHJ2YXRza2EKKzIzNjQJOglTb2ZpamEgLSBjaXR5CisyMzY1CToJTkFWQVJSQQorMjM2Ngk6CUdyYWQgU29maWphIChtdW4uKQorMjM2Nwk6CUhydmF0c2thCisyMzY4CToJTUlESS1QWVJFTkVFUworMjM2OQk6CVBsb3ZkaXYKKzIzNzAJOglNSURJLVBZUkVORUVTCisyMzcxCToJSHJ2YXRza2EKKzIzNzIJOglIcnZhdHNrYQorMjM3Mwk6CVSBcmtpeWUKKzIzNzQJOglVTUJSSUEKKzIzNzUJOglIcnZhdHNrYQorMjM3Ngk6CUhydmF0c2thCisyMzc3CToJTk9SVEUKKzIzNzgJOglIcnZhdHNrYQorMjM3OQk6CUhhc2tvdm8KKzIzODAJOglHcmFkIFNvZmlqYSAobXVuLikKKzIzODEJOglIcnZhdHNrYQorMjM4Mgk6CUNBU1RJTExBIC0gTEVPTgorMjM4Mwk6CUhydmF0c2thCisyMzg0CToJSHJ2YXRza2EKKzIzODUJOglBUkFHT04KKzIzODYJOglIcnZhdHNrYQorMjM4Nwk6CUhydmF0c2thCisyMzg4CToJUklPSkEKKzIzODkJOglIcnZhdHNrYQorMjM5MAk6CUhydmF0c2thCisyMzkxCToJSHJ2YXRza2EKKzIzOTIJOglIcnZhdHNrYQorMjM5Mwk6CUhydmF0c2thCisyMzk0CToJR3JhZCBTb2ZpamEgKG11bi4pCisyMzk1CToJU2hxaXCJcmlhCisyMzk2CToJQ0FUQUxVTkEKKzIzOTcJOglNYWtlZG9uaWphCisyMzk4CToJSGFza292bworMjM5OQk6CUhydmF0c2thCisyNDAwCToJQU5BVE9MSUtJIE1BS0VET05JQQorMjQwMQk6CUhydmF0c2thCisyNDAyCToJSHJ2YXRza2EKKzI0MDMJOglQbG92ZGl2CisyNDA0CToJVE9TQ0FOQQorMjQwNQk6CUhydmF0c2thCisyNDA2CToJSHJ2YXRza2EKKzI0MDcJOglIcnZhdHNrYQorMjQwOAk6CUhydmF0c2thCisyNDA5CToJUFJPVkVOQ0UtQUxQRVMtQ09URSBEJ0FaVVIKKzI0MTAJOglIcnZhdHNrYQorMjQxMQk6CUhydmF0c2thCisyNDEyCToJSHJ2YXRza2EKKzI0MTMJOglIcnZhdHNrYQorMjQxNAk6CUhydmF0c2thCisyNDE1CToJUFJPVkVOQ0UtQUxQRVMtQ09URSBEJ0FaVVIKKzI0MTYJOglIcnZhdHNrYQorMjQxNwk6CUhydmF0c2thCisyNDE4CToJUFJPVkVOQ0UtQUxQRVMtQ09URSBEJ0FaVVIKKzI0MTkJOglQUk9WRU5DRS1BTFBFUy1DT1RFIEQnQVpVUgorMjQyMAk6CUhydmF0c2thCisyNDIxCToJQ09SU0UKKzI0MjIJOglBQlJVWlpJCisyNDIzCToJQW5kb3JyYQorMjQyNAk6CVRPU0NBTkEKKzI0MjUJOglMQVpJTworMjQyNgk6CVRPU0NBTkEKKzI0MjcJOglDRU5UUk8KKzI0MjgJOglUT1NDQU5BCisyNDI5CToJS0VOVFJJS0kgTUFLRURPTklBCisyNDMwCToJQ3JuYSBHb3JhCisyNDMxCToJUFVHTElBCisyNDMyCToJUFVHTElBCisyNDMzCToJUFVHTElBCisyNDM0CToJUFVHTElBCisyNDM1CToJVE9TQ0FOQQorMjQzNgk6CU1PTElTRQorMjQzNwk6CVBVR0xJQQorMjQzOAk6CUNBU1RJTExBIC0gTEEgTUFOQ0hBCisyNDM5CToJQU5BVE9MSUtJIE1BS0VET05JQQorMjQ0MAk6CU1BRFJJRAorMjQ0MQk6CUFOQVRPTElLSSBNQUtFRE9OSUEKKzI0NDIJOglEWVRJS0kgTUFLRURPTklBCisyNDQzCToJQ0FNUEFOSUEKKzI0NDQJOglUgXJraXllCisyNDQ1CToJRVhUUkVNQURVUkEKKzI0NDYJOglCQVNJTElDQVRBCisyNDQ3CToJVk9SRUlPIEFJR0FJTworMjQ0OAk6CUxJU0JPQSBFIFZBTEUgRE8gVEVKTworMjQ0OQk6CVNBUkRFR05BCisyNDUwCToJQ09NVU5JREFEIFZBTEVOQ0lBTkEKKzI0NTEJOglMQVpJTworMjQ1Mgk6CVRIRVNTQUxJQQorMjQ1Mwk6CUlQRUlST1MKKzI0NTQJOglMQVpJTworMjQ1NQk6CUxBWklPCisyNDU2CToJQUxFTlRFSk8KKzI0NTcJOglDQU1QQU5JQQorMjQ1OAk6CUNBTVBBTklBCisyNDU5CToJQ0FNUEFOSUEKKzI0NjAJOglWT1JFSU8gQUlHQUlPCisyNDYxCToJVk9SRUlPIEFJR0FJTworMjQ2Mgk6CUNPTVVOSURBRCBWQUxFTkNJQU5BCisyNDYzCToJQ0FNUEFOSUEKKzI0NjQJOglUSEVTU0FMSUEKKzI0NjUJOglUSEVTU0FMSUEKKzI0NjYJOglUSEVTU0FMSUEKKzI0NjcJOglJT05JQSBOSVNJQQorMjQ2OAk6CUNBTEFCUklBCisyNDY5CToJSU9OSUEgTklTSUEKKzI0NzAJOglJT05JQSBOSVNJQQorMjQ3MQk6CVRIRVNTQUxJQQorMjQ3Mgk6CVRIRVNTQUxJQQorMjQ3Mwk6CVRIRVNTQUxJQQorMjQ3NAk6CUJBTEVBUkVTCisyNDc1CToJVEhFU1NBTElBCisyNDc2CToJVEhFU1NBTElBCisyNDc3CToJVk9SRUlPIEFJR0FJTworMjQ3OAk6CUJBTEVBUkVTCisyNDc5CToJU1RFUkVBIEVMTEFEQQorMjQ4MAk6CUJBTEVBUkVTCisyNDgxCToJU1RFUkVBIEVMTEFEQQorMjQ4Mgk6CVZPUkVJTyBBSUdBSU8KKzI0ODMJOglWT1JFSU8gQUlHQUlPCisyNDg0CToJVk9SRUlPIEFJR0FJTworMjQ4NQk6CVZPUkVJTyBBSUdBSU8KKzI0ODYJOglWT1JFSU8gQUlHQUlPCisyNDg3CToJVk9SRUlPIEFJR0FJTworMjQ4OAk6CUJBTEVBUkVTCisyNDg5CToJRFlUSUtJIEVMTEFEQQorMjQ5MAk6CUlPTklBIE5JU0lBCisyNDkxCToJQkFMRUFSRVMKKzI0OTIJOglJT05JQSBOSVNJQQorMjQ5Mwk6CUFOREFMVUNJQQorMjQ5NAk6CUJBTEVBUkVTCisyNDk1CToJSU9OSUEgTklTSUEKKzI0OTYJOglBVFRJS0kKKzI0OTcJOglCQUxFQVJFUworMjQ5OAk6CVZPUkVJTyBBSUdBSU8KKzI0OTkJOglCQUxFQVJFUworMjUwMAk6CUlPTklBIE5JU0lBCisyNTAxCToJQkFMRUFSRVMKKzI1MDIJOglJT05JQSBOSVNJQQorMjUwMwk6CUlPTklBIE5JU0lBCisyNTA0CToJQkFMRUFSRVMKKzI1MDUJOglCQUxFQVJFUworMjUwNgk6CUJBTEVBUkVTCisyNTA3CToJTVVSQ0lBCisyNTA4CToJSU9OSUEgTklTSUEKKzI1MDkJOglOT1RJTyBBSUdBSU8KKzI1MTAJOglJT05JQSBOSVNJQQorMjUxMQk6CVZPUkVJTyBBSUdBSU8KKzI1MTIJOglWT1JFSU8gQUlHQUlPCisyNTEzCToJSU9OSUEgTklTSUEKKzI1MTQJOglCQUxFQVJFUworMjUxNQk6CUJBTEVBUkVTCisyNTE2CToJRFlUSUtJIEVMTEFEQQorMjUxNwk6CURZVElLSSBFTExBREEKKzI1MTgJOglJT05JQSBOSVNJQQorMjUxOQk6CVZPUkVJTyBBSUdBSU8KKzI1MjAJOglCQUxFQVJFUworMjUyMQk6CUJBTEVBUkVTCisyNTIyCToJQkFMRUFSRVMKKzI1MjMJOglCQUxFQVJFUworMjUyNAk6CU5PVElPIEFJR0FJTworMjUyNQk6CUJBTEVBUkVTCisyNTI2CToJUEVMT1BPTk5JU09TCisyNTI3CToJRFlUSUtJIEVMTEFEQQorMjUyOAk6CVBFTE9QT05OSVNPUworMjUyOQk6CUFUVElLSQorMjUzMAk6CURZVElLSSBFTExBREEKKzI1MzEJOglBTEdBUlZFCisyNTMyCToJU0lDSUxJQQorMjUzMwk6CU5PVElPIEFJR0FJTworMjUzNAk6CU5PVElPIEFJR0FJTworMjUzNQk6CU5PVElPIEFJR0FJTworMjUzNgk6CU5PVElPIEFJR0FJTworMjUzNwk6CU5PVElPIEFJR0FJTworMjUzOAk6CU5PVElPIEFJR0FJTworMjUzOQk6CU5PVElPIEFJR0FJTworMjU0MAk6CVNJQ0lMSUEKKzI1NDEJOglOT1RJTyBBSUdBSU8KKzI1NDIJOglQRUxPUE9OTklTT1MKKzI1NDMJOglTSUNJTElBCisyNTQ0CToJTk9USU8gQUlHQUlPCisyNTQ1CToJTk9USU8gQUlHQUlPCisyNTQ2CToJU0lDSUxJQQorMjU0Nwk6CVNJQ0lMSUEKKzI1NDgJOglOT1RJTyBBSUdBSU8KKzI1NDkJOglQRUxPUE9OTklTT1MKKzI1NTAJOglOT1RJTyBBSUdBSU8KKzI1NTEJOglTSUNJTElBCisyNTUyCToJU0lDSUxJQQorMjU1Mwk6CU5PVElPIEFJR0FJTworMjU1NAk6CU5PVElPIEFJR0FJTworMjU1Ngk6CVNJQ0lMSUEKKzI1NTcJOglOT1RJTyBBSUdBSU8KKzI1NTgJOglOT1RJTyBBSUdBSU8KKzI1NTkJOglJT05JQSBOSVNJQQorMjU2MAk6CVBFTE9QT05OSVNPUworMjU2MQk6CUFUVElLSQorMjU2Mgk6CU5PVElPIEFJR0FJTworMjU2Mwk6CU5PVElPIEFJR0FJTworMjU2NAk6CU5PVElPIEFJR0FJTworMjU2NQk6CU5PVElPIEFJR0FJTworMjU2Ngk6CUFOREFMVUNJQQorMjU2Nwk6CVNJQ0lMSUEKKzI1NjgJOglBTEdBUlZFCisyNTY5CToJTk9USU8gQUlHQUlPCisyNTcwCToJTk9USU8gQUlHQUlPCisyNTcxCToJQUxHQVJWRQorMjU3Mgk6CVBFTE9QT05OSVNPUworMjU3Mwk6CUFMR0FSVkUKKzI1NzQJOglOT1RJTyBBSUdBSU8KKzI1NzUJOglBTEdBUlZFCisyNTc2CToJTk9USU8gQUlHQUlPCisyNTc3CToJUEVMT1BPTk5JU09TCisyNTc4CToJTk9USU8gQUlHQUlPCisyNTc5CToJTk9USU8gQUlHQUlPCisyNTgwCToJTk9USU8gQUlHQUlPCisyNTgxCToJTk9USU8gQUlHQUlPCisyNTgyCToJTk9USU8gQUlHQUlPCisyNTgzCToJTk9USU8gQUlHQUlPCisyNTg0CToJTk9USU8gQUlHQUlPCisyNTg1CToJTk9USU8gQUlHQUlPCisyNTg2CToJUEVMT1BPTk5JU09TCisyNTg3CToJTk9USU8gQUlHQUlPCisyNTg4CToJTk9USU8gQUlHQUlPCisyNTg5CToJTk9USU8gQUlHQUlPCisyNTkwCToJTk9USU8gQUlHQUlPCisyNTkxCToJTk9USU8gQUlHQUlPCisyNTkyCToJUEVMT1BPTk5JU09TCisyNTkzCToJTk9USU8gQUlHQUlPCisyNTk0CToJTk9USU8gQUlHQUlPCisyNTk1CToJTk9USU8gQUlHQUlPCisyNTk2CToJU0lDSUxJQQorMjU5Nwk6CU5PVElPIEFJR0FJTworMjU5OAk6CU5PVElPIEFJR0FJTworMjU5OQk6CU5PVElPIEFJR0FJTworMjYwMAk6CVNJQ0lMSUEKKzI2MDEJOglOT1RJTyBBSUdBSU8KKzI2MDIJOglTSUNJTElBCisyNjAzCToJTk9USU8gQUlHQUlPCisyNjA0CToJTk9USU8gQUlHQUlPCisyNjA1CToJTk9USU8gQUlHQUlPCisyNjA2CToJTk9USU8gQUlHQUlPCisyNjA3CToJTk9USU8gQUlHQUlPCisyNjA4CToJTk9USU8gQUlHQUlPCisyNjA5CToJUEVMT1BPTk5JU09TCisyNjEwCToJTk9USU8gQUlHQUlPCisyNjExCToJTk9USU8gQUlHQUlPCisyNjEyCToJTk9USU8gQUlHQUlPCisyNjEzCToJUEVMT1BPTk5JU09TCisyNjE0CToJUEVMT1BPTk5JU09TCisyNjE1CToJUEVMT1BPTk5JU09TCisyNjE2CToJTk9USU8gQUlHQUlPCisyNjE3CToJTk9USU8gQUlHQUlPCisyNjE4CToJQVRUSUtJCisyNjE5CToJTk9USU8gQUlHQUlPCisyNjIwCToJS1JJVEkKKzI2MjEJOglTSUNJTElBCisyNjIyCToJS1JJVEkKKzI2MjMJOglLUklUSQorMjYyNAk6CUtSSVRJCisyNjI1CToJS1JJVEkKKzI2MjYJOglLUklUSQorMjYyNwk6CUNBTkFSSUFTCisyNjI4CToJQ0FOQVJJQVMKKzI2MjkJOglDQU5BUklBUworMjYzMAk6CUNBTkFSSUFTCisyNjMxCToJQ0FOQVJJQVMKKzI2MzIJOglDQU5BUklBUworMjYzMwk6CUNBTkFSSUFTCisyNjM0CToJQ0FOQVJJQVMKKzI2MzUJOglDQU5BUklBUworMjYzNgk6CUNBTkFSSUFTCisyNjM3CToJQ0FOQVJJQVMKKzI2MzgJOglVTktOT1dOCisyNjM5CToJVU5LTk9XTgorNTI4MAk6CVVOS05PV04KKzUyODEJOglVTktOT1dOCis1MjgyCToJVU5LTk9XTgorNTI4Mwk6CVVOS05PV04KKzUyODQJOglVTktOT1dOCis1Mjg1CToJVU5LTk9XTgorNTI4Ngk6CVVOS05PV04KKzUyODcJOglVTktOT1dOCis1Mjg4CToJVU5LTk9XTgorNTI4OQk6CVVOS05PV04KKzUyOTAJOglVTktOT1dOCitFT0kJOglVTktOT1dOCitFT1MJOglVTktOT1dOCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy90YXJnZXRzL01pZEVhc3RDb3VudHJpZXMudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdGFyZ2V0cy9NaWRFYXN0Q291bnRyaWVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTY3YjA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdGFyZ2V0cy9NaWRFYXN0Q291bnRyaWVzLnR4dApAQCAtMCwwICsxLDEyIEBACitDOlxkaXZhXE1pZEVhc3RcQmFocmFpblxCYWhyYWluLnR4dAorQzpcZGl2YVxNaWRFYXN0XElyYWtcSXJhay50eHQKK0M6XGRpdmFcTWlkRWFzdFxJcmFuXElyYW4udHh0CitDOlxkaXZhXE1pZEVhc3RcSm9yZGFuXEpvcmRhbi50eHQKK0M6XGRpdmFcTWlkRWFzdFxLdXdhaXRcS3V3YWl0LnR4dAorQzpcZGl2YVxNaWRFYXN0XExlYmFub25cTGViYW5vbi50eHQKK0M6XGRpdmFcTWlkRWFzdFxPbWFuXE9tYW4udHh0CitDOlxkaXZhXE1pZEVhc3RcUWF0YXJcUWF0YXIudHh0CitDOlxkaXZhXE1pZEVhc3RcU2F1ZGlBcmFiaWEudHh0CitDOlxkaXZhXE1pZEVhc3RcU3lyaWFcU3lyaWEudHh0CitDOlxkaXZhXE1pZEVhc3RcVW5pdGVkQXJhYkVtaXJhdGVzXFVuaXRlZEFyYWJFbWlyYXRlcy50eHQKK0M6XGRpdmFcTWlkRWFzdFxZZW1lblxZZW1lbi50eHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3RhcmdldHMvTm9ydGhBbWVyaWNhbkNvdW50cmllcy50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy90YXJnZXRzL05vcnRoQW1lcmljYW5Db3VudHJpZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NTQyNDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy90YXJnZXRzL05vcnRoQW1lcmljYW5Db3VudHJpZXMudHh0CkBAIC0wLDAgKzEsMiBAQAorQzpcZGl2YVxOb3J0aEFtZXJpY2FcVVNBXFVTQS50eHQKK0M6XGRpdmFcTm9ydGhBbWVyaWNhXE1leGljb1xNZXhpY28udHh0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdGFyZ2V0cy9SRUFETUUudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdGFyZ2V0cy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMWQyNWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy90YXJnZXRzL1JFQURNRS50eHQKQEAgLTAsMCArMSwzIEBACisKKworVGhlIGZpbGVzIGluIHRoaXMgZm9sZGVyIGFyZSB1c2VkIGJ5IFByb3BlcnRpZXNHZW5lcmF0b3J0byBnZW5lcmF0ZSB0aGUgcHJvcGVydGllcyBmaWxlcyAobmFtZXMsYXJlYSwgYW5kIHBvcHVsYXRpb24pIGZvciBlYWNoIGNvdW50cnkuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdGFyZ2V0cy9SZXN0T2ZBc2lhQ291bnRyaWVzLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3RhcmdldHMvUmVzdE9mQXNpYUNvdW50cmllcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyYzI3MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3RhcmdldHMvUmVzdE9mQXNpYUNvdW50cmllcy50eHQKQEAgLTAsMCArMSwxMyBAQAorQzpcZGl2YVxSZXN0T2ZBc2lhXEFmZ2hhbmlzdGFuXEFmZ2hhbmlzdGFuLnR4dAorQzpcZGl2YVxSZXN0T2ZBc2lhXEFybWVuaWFcQXJtZW5pYS50eHQKK0M6XGRpdmFcUmVzdE9mQXNpYVxBemVyYmFpamFuXEF6ZXJiYWlqYW4udHh0CitDOlxkaXZhXFJlc3RPZkFzaWFcS2F6YWtoc3RhblxLYXpha2hzdGFuLnR4dAorQzpcZGl2YVxSZXN0T2ZBc2lhXEt5cmd5enN0YW5cS3lyZ3l6c3Rhbi50eHQKK0M6XGRpdmFcUmVzdE9mQXNpYVxNYWNlZG9uaWFcTWFjZWRvbmlhLnR4dAorQzpcZGl2YVxSZXN0T2ZBc2lhXE1vbGRvdmFcTW9sZG92YS50eHQKK0M6XGRpdmFcUmVzdE9mQXNpYVxNb25nb2xpYVxNb25nb2xpYS50eHQKK0M6XGRpdmFcUmVzdE9mQXNpYVxQYWtpc3RhblxQYWtpc3Rhbi50eHQKK0M6XGRpdmFcUmVzdE9mQXNpYVxUYWppa2lzdGFuXFRhamlraXN0YW4udHh0CitDOlxkaXZhXFJlc3RPZkFzaWFcVHVya2V5XFR1cmtleS50eHQKK0M6XGRpdmFcUmVzdE9mQXNpYVxUdXJrbWVuaXN0YW5cVHVya21lbmlzdGFuLnR4dAorQzpcZGl2YVxSZXN0T2ZBc2lhXFV6YmVraXN0YW5cVXpiZWtpc3Rhbi50eHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3RhcmdldHMvU291dGhBbWVyaWNhbkNvdW50cmllcy50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy90YXJnZXRzL1NvdXRoQW1lcmljYW5Db3VudHJpZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYWE0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy90YXJnZXRzL1NvdXRoQW1lcmljYW5Db3VudHJpZXMudHh0CkBAIC0wLDAgKzEsMTMgQEAKK0M6XGRpdmFcU291dGhBbWVyaWNhXEFyZ2VudGluYVxBcmdlbnRpbmEudHh0CitDOlxkaXZhXFNvdXRoQW1lcmljYVxCb2xpdmlhXEJvbGl2aWEudHh0CitDOlxkaXZhXFNvdXRoQW1lcmljYVxCcmF6aWxcQnJhemlsLnR4dAorQzpcZGl2YVxTb3V0aEFtZXJpY2FcQ2hpbGVcQ2hpbGUudHh0CitDOlxkaXZhXFNvdXRoQW1lcmljYVxDb2xvbWJpYVxDb2xvbWJpYS50eHQKK0M6XGRpdmFcU291dGhBbWVyaWNhXEVjdWFkb3JcRWN1YWRvci50eHQKK0M6XGRpdmFcU291dGhBbWVyaWNhXEZhdWxrbGFuZElzbGFuZHNcRmF1bGtsYW5kSXNsYW5kcy50eHQKK0M6XGRpdmFcU291dGhBbWVyaWNhXEd1eWFuYVxHdXlhbmEudHh0CitDOlxkaXZhXFNvdXRoQW1lcmljYVxQYXJhZ3VheVxQYXJhZ3VheS50eHQKK0M6XGRpdmFcU291dGhBbWVyaWNhXFBlcnVcUGVydS50eHQKK0M6XGRpdmFcU291dGhBbWVyaWNhXFN1cmluYW1lXFN1cmluYW1lLnR4dAorQzpcZGl2YVxTb3V0aEFtZXJpY2FcVXJ1Z3VheVxVcnVndWF5LnR4dAorQzpcZGl2YVxTb3V0aEFtZXJpY2FcVmVuZXp1ZWxhXFZlbmV6dWVsYS50eHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3RhcmdldHMvU291dGhBc2lhbkNvdW50cmllcy50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy90YXJnZXRzL1NvdXRoQXNpYW5Db3VudHJpZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MzE3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy90YXJnZXRzL1NvdXRoQXNpYW5Db3VudHJpZXMudHh0CkBAIC0wLDAgKzEsMTggQEAKK0M6XGRpdmFcU291dGhBc2lhXEJhbmdsYWRlc2hcQmFuZ2xhZGVzaC50eHQKK0M6XGRpdmFcU291dGhBc2lhXEJodXRhblxCaHV0YW4udHh0CitDOlxkaXZhXFNvdXRoQXNpYVxCcnVuZWlcQnJ1bmVpLnR4dAorQzpcZGl2YVxTb3V0aEFzaWFcQ2FtYm9kaWFcQ2FtYm9kaWEudHh0CitDOlxkaXZhXFNvdXRoQXNpYVxDaGluYVxDaGluYS50eHQKK0M6XGRpdmFcU291dGhBc2lhXEluZGlhXEluZGlhLnR4dAorQzpcZGl2YVxTb3V0aEFzaWFcSW5kb25lc2lhXEluZG9uZXNpYS50eHQKK0M6XGRpdmFcU291dGhBc2lhXEphcGFuXEphcGFuLnR4dAorQzpcZGl2YVxTb3V0aEFzaWFcTGFvc1xMYW9zLnR4dAorQzpcZGl2YVxTb3V0aEFzaWFcTWFjYXVcTWFjYXUudHh0CitDOlxkaXZhXFNvdXRoQXNpYVxNeWFubWFyXE15YW5tYXIudHh0CitDOlxkaXZhXFNvdXRoQXNpYVxOZXBhbFxOZXBhbC50eHQKK0M6XGRpdmFcU291dGhBc2lhXE5vcnRoS29yZWFcTm9ydGhLb3JlYS50eHQKK0M6XGRpdmFcU291dGhBc2lhXFBoaWxpcHBpbmVzXFBoaWxpcHBpbmVzLnR4dAorQzpcZGl2YVxTb3V0aEFzaWFcU2luZ2Fwb3JlXFNpbmdhcG9yZS50eHQKK0M6XGRpdmFcU291dGhBc2lhXFNvdXRoS29yZWFcU291dGhLb3JlYS50eHQKK0M6XGRpdmFcU291dGhBc2lhXFRoYWlsYW5kXFRoYWlsYW5kLnR4dAorQzpcZGl2YVxTb3V0aEFzaWFcVmlldG5hbVxWaWV0bmFtLnR4dApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdGFyZ2V0cy9jb3VudHJ5X25hbWVzLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3RhcmdldHMvY291bnRyeV9uYW1lcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgzNGNjNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3RhcmdldHMvY291bnRyeV9uYW1lcy50eHQKQEAgLTAsMCArMSwxNjMgQEAKK0NhbmFkYQorQXVzdHJhbGlhCitaYWlyZQorWmltYmFid2UKK0JlbGFydXMKK0JlbGl6ZQorQm90c3dhbmEKK0NhbWVyb29uCitDb3N0YSBSaWNhCitFbCBTYWx2YWRvcgorRXN0b25pYQorRXRoaW9waWEKK0d1YXRlbWFsYQorSG9uZHVyYXMKK0xhdHZpYQorTWFsaQorTWF1cml0YW5pYQorTmljYXJhZ3VhCitQYW5hbWEKK01hbGkKK1BhcHVhIE5ldyBHdWluZWEKK0d1aW5lYSBCaXNzYXUKK01hY2Vkb25pYQorTW9sZG92aWEKK0FsYmFuaWEKK0FuZG9ycmEKK0F1c3RyaWEKK0JlbGdpdW0KK0Jvc25pYSBhbmQgSGVyemVnb3ZpbmEKK0J1bGdhcmlhCitDcm9hdGlhCitDemVjaCBSZXB1YmxpYworRGVubWFyaworRmFyb2UgSXNsYW5kcworRmlubGFuZAorRnJhbmNlCitHZXJtYW55CitHcmVlY2UKK0h1bmdhcnkKK0lyZWxhbmQKK1NwYWluCitTd2l0emVybGFuZAorVW5pdGVkIEtpbmdkb20KK0ljZWxhbmQKK0l0YWx5CitMaWVjaHRlbnN0ZWluCitMdXhlbWJvdXJnCitOZXRoZXJsYW5kcworTm9yd2F5CitQb2xhbmQKK1BvcnR1Z2FsCitSb21hbmlhCitSdXNzaWEKK1NhbiBNYXJpbm8KK1Nsb3ZlbmlhCitTd2VkZW4KK1VuaXRlZCBLaW5nZG9tCitZdWdvc2xhdmlhCitBbGdlcmlhCitBbmdvbGEKK0FybWVuaWEKK0JlbmluCitCdXJraW5hRmFzbworQnVydW5kaQorQnJ1bmVpCitDYXBlIFZlcmRlCitDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMKK0NoYWQKK0NvbmdvCitDb21vcm9zCitFZ3lwdAorRXF1YXRvcmlhbCBHdWluZWEKK0VyaXRyZWEKK0dhYm9uCitHYW1iaWEKK0doYW5hCitHdWluZWEKK0d1aW5lYSBCaXNzYXUKK0l2b3J5IENvYXN0CitLZW55YQorTGVzb3RobworTGliZXJpYQorTGlieWEKK01hZGFnYXNjYXIKK01hbGF3aQorTWF1cml0aXVzCitNb3JvY2NvCitNb3phbWJpcXVlCitOYW1pYmlhCitOaWdlcgorTmlnZXJpYQorUGFwdWEgTmV3IEd1aW5lYQorUHVlcnRvIFJpY28KK1J3YW5kYQorU2FvIFRvbWUgYW5kIFByaW5jaXBlCitTZW5lZ2FsCitTZXljaGVsbGVzCitTaWVycmEgTGVvbmUKK1NpbmdhcG9yZQorU291dGggQWZyaWNhCitTb21hbGlhCitTdWRhbgorVGFuemFuaWEKK1RvZ28KK1R1bmlzaWEKK1VnYW5kYQorWmFtYmlhCitCYWhyYWluCitJcmFxCitJcmFuCitKb3JkYW4KK0t1d2FpdAorTGViYW5vbgorT21hbgorUWF0YXIKK1NhdWRpIEFyYWJpYQorU3lyaWEKK1VuaXRlZCBBcmFiIEVtaXJhdGVzCisjVW5pdGVkQXJhYkVtaXJhdGVzCitZZW1lbgorTWV4aWNvCitBZmdoYW5pc3RhbgorQXplcmJhaWphbgorS2F6YWtoc3RhbgorS3lyZ3l6c3RhbgorTWFjZWRvbmlhCitNb2xkb3ZpYQorTW9uZ29saWEKK1Bha2lzdGFuCitUYWppa2lzdGFuCitUdXJrZXkKK1R1cmttZW5pc3RhbgorVXpiZWtpc3RhbgorQXJnZW50aW5hCitCb2xpdmlhCitCcmFzaWwKK0NoaWxlCitDb2xvbWJpYQorRWN1YWRvcgorR3V5YW5hCitQYXJhZ3VheQorUGVydQorU3VyaW5hbWUKK1VydWd1YXkKK1ZlbmV6dWVsYQorQmFuZ2xhZGVzaAorQmh1dGFuCitCcnVuZWkKK0NhbWJvZGlhCitDaGluYQorSW5kaWEKK0luZG9uZXNpYQorSmFwYW4KK0xhb3MKK01hY2F1CitNeWFubWFyCitOZXBhbAorTm9ydGggS29yZWEKK1BoaWxpcHBpbmVzCitTb3V0aCBLb3JlYQorVGhhaWxhbmQKK1ZpZXRuYW0KK1VuaXRlZCBTdGF0ZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy90YXJnZXRzL2Zvcm1hdExpc3QudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdGFyZ2V0cy9mb3JtYXRMaXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTc4NzAwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdGFyZ2V0cy9mb3JtYXRMaXN0LnR4dApAQCAtMCwwICsxIEBACitDOlxkaXZhXE5vcnRoQW1lcmljYVxVU0FcT3JpZ2luYWxcVVNBX0NlbnN1cy50eHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3RhcmdldHMvZ3JvdXBlZERhdGFGaWxlcy50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy90YXJnZXRzL2dyb3VwZWREYXRhRmlsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MmU3NzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy90YXJnZXRzL2dyb3VwZWREYXRhRmlsZXMudHh0CkBAIC0wLDAgKzEsMTQ5IEBACisjIyBFVVJPUEUKKyNDOlxkaXZhXGdyb3VwZWRcQUxCXEFMQl9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxBTkRcQU5EX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXEFVVFxBVVRfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcQkVMXEJFTF9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxCSUhcQklIX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXEJHUlxCR1JfR1JPVVBFRC50eHQKK0M6XGRpdmFcZ3JvdXBlZFxDSEVcQ0hFX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXENaRVxDWkVfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcREVVXERFVV9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxETktcRE5LX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXEVTUFxFU1BfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcRklOXEZJTl9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxGUkFcRlJBX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxGQVJPRSBJU0xBTkRTXEZBUk9FIElTTEFORFMudHh0CisjQzpcZGl2YVxncm91cGVkXEdCUlxHQlJfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcR1JDXEdSQ19HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxIUlZcSFJWX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXEhVTlxIVU5fR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcSVJMXElSTF9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxJU0xcSVNMX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXElUQVxJVEFfR1JPVVBFRC50eHQKKyNDOlxkaXZhXEV1cm9wZVxMSUVDSFRFTlNURUlOXExJRUNIVEVOU1RFSU4udHh0CisjQzpcZGl2YVxncm91cGVkXExVWFxMVVhfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcTkxEXE5MRF9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxOT1JcTk9SX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXFBPTFxQT0xfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcUFJUXFBSVF9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxST1VcUk9VX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXFJVU1xSVVNfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcU01SXFNNUl9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxTUkJcU1JCX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXFNWTlxTVk5fR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcU1dFXFNXRV9HUk9VUEVELnR4dAorIyMgQUZSSUNBCisjQzpcZGl2YVxncm91cGVkXERaQVxEWkFfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcQUdPXEFHT19HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxCRU5cQkVOX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXEJGQVxCRkFfR1JPVVBFRC50eHQJCisjQzpcZGl2YVxncm91cGVkXEJESVxCRElfR1JPVVBFRC50eHQJCisjQzpcZGl2YVxncm91cGVkXENQVlxDUFZfR1JPVVBFRC50eHQJCisjQzpcZGl2YVxncm91cGVkXENBRlxDQUZfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcVENEXFRDRF9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxDT01cQ09NX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXENPR1xDT0dfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcRUdZXEVHWV9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxHTlFcR05RX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXEVSSVxFUklfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcR0FCXEdBQl9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxHTUJcR01CX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXEdOQlxHTkJfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcR0hBXEdIQV9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxHSEFcR0hBX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXEdJTlxHSU5fR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcQ0lWXENJVl9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxLRU5cS0VOX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXExTT1xMU09fR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcTEJSXExCUl9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxMQllcTEJZX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXE1ER1xNREdfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcTVdJXE1XSV9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxNVVNcTVVTX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXE1BUlxNQVJfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcTU9aXE1PWl9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxOQU1cTkFNX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXE5FUlxORVJfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcTkdBXE5HQV9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxQTkdcUE5HX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXFJXQVxSV0FfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcU1RQXFNUUF9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxTRU5cU0VOX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXFNZQ1xTWUNfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcU0xFXFNMRV9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxTT01cU09NX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXFpBRlxaQUZfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcU0ROXFNETl9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxUWkFcVFpBX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXFRHT1xUR09fR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcVFVOXFRVTl9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxVR0FcVUdBX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXFpNQlxaTUJfR1JPVVBFRC50eHQKKyMjIE1JRCBFQVNUCisjI0M6XGRpdmFcZ3JvdXBlZFxCSFJcQkhSX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxJUlFcSVJRX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxJUk5cSVJOX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxKT1JcSk9SX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxLV1RcS1dUX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxMQk5cTEJOX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxPTU5cT01OX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxRQVRcUUFUX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxTQVVcU0FVX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxTWVJcU1lSX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxBUkVcQVJFX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxZRU1cWUVNX0dST1VQRUQudHh0CisjIyBBU0lBCisjI0M6XGRpdmFcZ3JvdXBlZFxBRkdcQUZHX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxBUk1cQVJNX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxBWkVcQVpFX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxLQVpcS0FaX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxLR1pcS0daX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxNTkdcTU5HX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXFBBS1xQQUtfR1JPVVBFRC50eHQKKyMjQzpcZGl2YVxncm91cGVkXFRKS1xUSktfR1JPVVBFRC50eHQKKyMjQzpcZGl2YVxncm91cGVkXFRVUlxUVVJfR1JPVVBFRC50eHQKKyMjQzpcZGl2YVxncm91cGVkXFRLTVxUS01fR1JPVVBFRC50eHQKKyMjQzpcZGl2YVxncm91cGVkXFVaQlxVWkJfR1JPVVBFRC50eHQKKyMjQzpcZGl2YVxSZXN0T2ZBc2lhXE1PTERPVkFcTW9sZG92YS50eHQKKyMjQzpcZGl2YVxSZXN0T2ZBc2lhXE1BQ0VET05JQVxNYWNlZG9uaWEudHh0CisjIyBBTUVSSUNBCisjQzpcZGl2YVxncm91cGVkXE1FWFxNRVhfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcVVNBXFVTQV9HUk9VUEVELnR4dAorQzpcZGl2YVxncm91cGVkXENBTlxDQU5fR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcUFJJXFBSSV9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxBUkdcQVJHX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXEJPTFxCT0xfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcQlJBXEJSQV9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxDSExcQ0hMX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXENPTFxDT0xfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcRUNVXEVDVV9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxHVVlcR1VZX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXFBSWVxQUllfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcUEVSXFBFUl9HUk9VUEVELnR4dAorI0M6XGRpdmFcZ3JvdXBlZFxTVVJcU1VSX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXFVSWVxVUllfR1JPVVBFRC50eHQKKyNDOlxkaXZhXGdyb3VwZWRcVkVOXFZFTl9HUk9VUEVELnR4dAorIyMgU09VVEggRUFTVCBBU0lBCisjI0M6XGRpdmFcZ3JvdXBlZFxCR0RcQkdEX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxCVE5cQlROX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxCUk5cQlJOX0dST1VQRUQudHh0CisjI0M6XGRpdmFcZ3JvdXBlZFxLSE1cS0hNX0dST1VQRUQudHh0CisjQzpcZGl2YVxncm91cGVkXENITlxDSE5fR1JPVVBFRC50eHQKKyMjQzpcZGl2YVxncm91cGVkXElORFxJTkRfR1JPVVBFRC50eHQKKyMjQzpcZGl2YVxncm91cGVkXElETlxJRE5fR1JPVVBFRC50eHQKKyMjQzpcZGl2YVxncm91cGVkXEpQTlxKUE5fR1JPVVBFRC50eHQKKyMjQzpcZGl2YVxncm91cGVkXExBT1xMQU9fR1JPVVBFRC50eHQKKyMjQzpcZGl2YVxncm91cGVkXE1BQ1xNQUNfR1JPVVBFRC50eHQKKyMjQzpcZGl2YVxncm91cGVkXE15YW5tYXJcTXlhbm1hci50eHQKKyMjQzpcZGl2YVxncm91cGVkXE5QTFxOUExfR1JPVVBFRC50eHQKKyMjQzpcZGl2YVxncm91cGVkXFBSS1xQUktfR1JPVVBFRC50eHQKKyMjQzpcZGl2YVxncm91cGVkXFBITFxQSExfR1JPVVBFRC50eHQKKyMjQzpcZGl2YVxncm91cGVkXFNHUFxTR1BfR1JPVVBFRC50eHQKKyMjQzpcZGl2YVxncm91cGVkXEtPUlxLT1JfR1JPVVBFRC50eHQKKyMjQzpcZGl2YVxncm91cGVkXFRIQVxUSEFfR1JPVVBFRC50eHQKKyMjQzpcZGl2YVxncm91cGVkXFZOTVxWTk1fR1JPVVBFRC50eHQKKworCisKKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy90YXJnZXRzL3JlZHVjZUxpc3QudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdGFyZ2V0cy9yZWR1Y2VMaXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmM4ZTgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdGFyZ2V0cy9yZWR1Y2VMaXN0LnR4dApAQCAtMCwwICsxLDE2MCBAQAorIyBMaXN0IG9mIGNvdW50cmllcyB0byB3aGljaCB3ZSB3YW50IHRvIGFwcGx5IHJlZHVjdGlvbiAoZG93biBzYW1wbGluZykKKyMgVXNlIGFscGhhIDMgY29kZSB0byBpZGVudGlmeSBhIGNvdW50cnkuCisjIEphbWllcyBuZXcgKCAyMCBjb3VudHJpZXMgKSA6CisjCisjQ0FOCisjQVVTCisjWkFSCisjWldFCisjQkxSCisjQkxaCisjQldBCisjQ01SCisjQ1JJCisjU0xWCisjRVNUCisjRVRICisjR1RNCisjSEROCisjTFZBCisjTFRVCisjTUxJCisjTVJUCisjTklDCisjUEFOCisjCitBTEIKK0FORAorI0FVVAorI0JFTAorI0JJSAorI0JHUgorI0hSVgorI0NIRQorI0NaRQorI0ROSworI0ZJTgorI0ZSQQorI0RFVQorI0dSQworI0dCUgorI0hVTgorI0lTTAorI0lSTAorI0lUQQorI0xJRQorI0xVWAorI05MRAorI05PUgorI1BPTAorI1BSVAorI1JPVQorI1JVUworI1NNUgorI1NWTgorI0VTUAorI1NXRQorI1NSQgorI0RaQQorI0FHTworI0FSTQorI0JFTgorI0JGQQorI0JESQorI0JSTgorI0NQVgorI0NBRgorI1RDRAorI0NPRworI0NPTQorI0VHWQorI0dOUQorI0VSSQorI0dBQgorI0dNQgorI0dOQgorI0dIQQorI0NJVgorI0tFTgorI0xTTworI0xCUgorI0xCWQorI01ERworI01XSQorI01VUworI01BUgorI01PWgorI05BTQorI05FUgorI05HQQorI1BORworI1BSSQorI1JXQQorI1NUUAorI1NFTgorI1NZQworI1NMRQorI1NHUAorI1pBRgorI1NPTQorI1NETgorI1RaQQorI1RHTworI1RVTgorI1VHQQorI1pNQgorI0JIUgorI0lSUQorI0lSTgorI0pPUgorI0tXVAorI0xCTgorI09NTgorI1FBVAorI1NBVQorI1NZUgorI0FSRQorI1lFTQorI01FWAorI0FGRworI0FaRQorI0tBWgorI0tHWgorI01EQQorI01LRAorI01ORworI1BBSworI1RKSworI1RVUgorI1RLTQorI1VaQgorI0FSRworI0JPTAorI0JSQQorI0NITAorI0NPTAorI0VDVQorI0dJTgorI0dVWQorI1BSWQorI1BFUgorI1NVUgorI1VSWQorI1ZFTgorI0JHRAorI0JUTgorI0JSTgorI0tITQorI0NITgorI0lORAorI0lETgorI0pQTgorI0xBTworI01BQworI05QTAorI1BSSworI1BITAorI0tPUgorI1RIQQorI1ZOTQorI1VTQQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTZmYzY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy8udHh0CkBAIC0wLDAgKzEsMiBAQAorVU5JVEVETkFUSU9OUypodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQWZnaGFuaXN0YW4udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9BZmdoYW5pc3Rhbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkYTBiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQWZnaGFuaXN0YW4udHh0CkBAIC0wLDAgKzEsNyBAQAorIworQ0lUWVBPUCpodHRwOi8vd3d3LmNzby5nb3YuYWYvCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPUFGRyZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYWYuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9BbGJhbmlhLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQWxiYW5pYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZmM2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQWxiYW5pYS50eHQKQEAgLTAsMCArMSwyIEBACitVTklURUROQVRJT05TKmh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9BbGdlcmlhLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQWxnZXJpYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEzOWNlMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQWxnZXJpYS50eHQKQEAgLTAsMCArMSw4IEBACisjCitDSVRZUE9QKmh0dHA6Ly93d3cuY2l0eXBvcHVsYXRpb24uZGUvQWxnZXJpYS5odG1sCitQT1AqaHR0cDovL3d3dy5vbnMuZHovRW5nbGlzaC9pbmRleGFnLmh0bQorRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1EWkEmVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2FnLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQW5kb3JyYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0FuZG9ycmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNmZjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0FuZG9ycmEudHh0CkBAIC0wLDAgKzEsMiBAQAorVU5JVEVETkFUSU9OUypodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQW5nb2xhLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQW5nb2xhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjQ0ODMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9BbmdvbGEudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1BR08mVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2FvLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQXJnZW50aW5hLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQXJnZW50aW5hLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzA1Nzc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9BcmdlbnRpbmEudHh0CkBAIC0wLDAgKzEsNyBAQAorIworQ0lUWVBPUCpodHRwOi8vd3d3LmluZGVjLm1lY29uLmFyL2RlZmF1bHQuaHRtCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPUFSRyZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYXIuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Bcm1lbmlhLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQXJtZW5pYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlMjdmNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQXJtZW5pYS50eHQKQEAgLTAsMCArMSw3IEBACisjCitDSVRZUE9QKmh0dHA6Ly93d3cuYXJtc3RhdC5hbS8KK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9QVJNJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9hbS5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0F1c3RyYWxpYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0F1c3RyYWxpYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I1YmI2ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQXVzdHJhbGlhLnR4dApAQCAtMCwwICsxLDUgQEAKKyMKK1BPUCpodHRwOi8vd3d3Lnhpc3Qub3JnL2NudHJ5L2F1c3RyYWxpYS5hc3B4CitDSUEqaHR0cDovL3d3dy5nZW9jb21tLmNvbS9mYXEvY29weXJpZ2h0Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQXVzdHJpYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0F1c3RyaWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNmZjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0F1c3RyaWEudHh0CkBAIC0wLDAgKzEsMiBAQAorVU5JVEVETkFUSU9OUypodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQXplcmJhaWphbi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0F6ZXJiYWlqYW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzQ2MGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0F6ZXJiYWlqYW4udHh0CkBAIC0wLDAgKzEsOCBAQAorIworQ0lUWVBPUCpodHRwOi8vd3d3LmF6c3RhdC5vcmcvaW5kZXhlbi5waHAKK1BPUDIqaHR0cDovL3d3dy5nZW5kZXItYXoub3JnL3NoYWJsb25fZW4uc2h0bWw/ZG9jL2VuL2Fib3V0L2NvdW50cnkKK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9QVpFJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9hai5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0JhaHJhaW4udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9CYWhyYWluLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmVmMTE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9CYWhyYWluLnR4dApAQCAtMCwwICsxLDcgQEAKKyMKK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9QkhSJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9iYS5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQmFuZ2xhZGVzaC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0JhbmdsYWRlc2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YmFiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0JhbmdsYWRlc2gudHh0CkBAIC0wLDAgKzEsOCBAQAorIworQ0lUWVBPUCpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0FSRUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPUJHRCZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYmcuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9CZWxhcnVzLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQmVsYXJ1cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI4OTE0OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQmVsYXJ1cy50eHQKQEAgLTAsMCArMSw1IEBACisjCitQT1AqaHR0cDovL3d3dy54aXN0Lm9yZy9jbnRyeS9iZWxhcnVzLmFzcHgKK0NJQSpodHRwOi8vd3d3Lmdlb2NvbW0uY29tL2ZhcS9jb3B5cmlnaHQuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9CZWxnaXVtLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQmVsZ2l1bS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZmM2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQmVsZ2l1bS50eHQKQEAgLTAsMCArMSwyIEBACitVTklURUROQVRJT05TKmh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9CZWxpemUudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9CZWxpemUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NzBiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0JlbGl6ZS50eHQKQEAgLTAsMCArMSw1IEBACisjCitQT1AqaHR0cDovL3d3dy54aXN0Lm9yZy9jbnRyeS9iZWxpemUuYXNweAorQ0lBKmh0dHA6Ly93d3cuZ2VvY29tbS5jb20vZmFxL2NvcHlyaWdodC5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0JlbmluLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQmVuaW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODdkZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0JlbmluLnR4dApAQCAtMCwwICsxLDggQEAKKyMKK0NJVFlQT1AqaHR0cDovL3d3dy5pbnNhZS1iai5vcmcvCitBUkVBKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1CRU4mVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2JuLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQmh1dGFuLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQmh1dGFuLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGYyNjk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9CaHV0YW4udHh0CkBAIC0wLDAgKzEsOCBAQAorIworQ0lUWVBPUCpodHRwOi8vd3d3LmNpdHlwb3B1bGF0aW9uLmRlL0J1dGhhbi5odG1sCitQT1AqaHR0cDovL3d3dy5iaHV0YW5jZW5zdXMuZ292LmJ0LworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1CVE4mVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2J0Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQm9saXZpYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0JvbGl2aWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxN2VkOTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0JvbGl2aWEudHh0CkBAIC0wLDAgKzEsOSBAQAorIworQ0lUWVBPUCpodHRwOi8vd3d3LmNpdHlwb3B1bGF0aW9uLmRlL0JvbGl2aWEuaHRtbAorUE9QKmh0dHA6Ly93d3cuaW5lLmdvdi5iby8KK0FSRUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPUJPTCZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvYmwuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Cb3NuaWEgYW5kIEhlcnplZ292aW5hLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZmM2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYS50eHQKQEAgLTAsMCArMSwyIEBACitVTklURUROQVRJT05TKmh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Cb3Rzd2FuYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0JvdHN3YW5hLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWI2ODdjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Cb3Rzd2FuYS50eHQKQEAgLTAsMCArMSw1IEBACisjCitQT1AqaHR0cDovL3d3dy54aXN0Lm9yZy9jbnRyeS9ib3Rzd2FuYS5hc3B4CitDSUEqaHR0cDovL3d3dy5nZW9jb21tLmNvbS9mYXEvY29weXJpZ2h0Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQnJhc2lsLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQnJhc2lsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDkyYjA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9CcmFzaWwudHh0CkBAIC0wLDAgKzEsMTEgQEAKKyMKK0NJVFlQT1AqaHR0cDovL3d3dy5jaXR5cG9wdWxhdGlvbi5kZS9CcmF6aWwuaHRtbAorUE9QVUxTVEFUKmh0dHA6Ly93d3cubGlicmFyeS51dS5ubC93ZXNwL3BvcHVsc3RhdC9BbWVyaWNhcy9icmF6aWx0Lmh0bQorUE9QKmh0dHA6Ly93d3cuaWJnZS5nb3YuYnIvZW5nbGlzaC9kZWZhdWx0LnBocAorUE9QMipodHRwOi8vd3d3LmdvbGRmaWVsZHMuY28uemEvSW52ZXN0b3IvQW5udWFsX1JlcG9ydHMvRnlfMjAwMy9nZl9hcjAzL3NkXzAzL3N0b3J5L3N0dWR5XzYuaHRtCitBUkVBKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1CUkEmVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2JyLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQnJ1bmVpLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQnJ1bmVpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmIwZTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9CcnVuZWkudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1CUk4mVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2J4Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQnVsZ2FyaWEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9CdWxnYXJpYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZmM2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQnVsZ2FyaWEudHh0CkBAIC0wLDAgKzEsMiBAQAorVU5JVEVETkFUSU9OUypodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQnVya2luYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0J1cmtpbmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZWNhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0J1cmtpbmEudHh0CkBAIC0wLDAgKzEsNyBAQAorIworQ0lUWVBPUCpodHRwOi8vd3d3Lmluc2QuYmYvCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPUJGQSZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvdXYuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQnVya2luYUZhc28udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9CdXJraW5hRmFzby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0N2E5MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQnVya2luYUZhc28udHh0CkBAIC0wLDAgKzEsNyBAQAorIworQ0lUWVBPUCpodHRwOi8vd3d3Lmluc2QuYmYvCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPUJGQSZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvdXYuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9CdXJ1bmRpLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQnVydW5kaS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3NTUwMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQnVydW5kaS50eHQKQEAgLTAsMCArMSw4IEBACisjCitDSVRZUE9QKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworQVJFQSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9QkRJJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9ieS5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0NhbWJvZGlhLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQ2FtYm9kaWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YjVkZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0NhbWJvZGlhLnR4dApAQCAtMCwwICsxLDcgQEAKKyMKK0NJVFlQT1AqaHR0cDovL3d3dy5uaXMuZ292LmtoLworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1LSE0mVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2NiLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQ2FtZXJvb24udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9DYW1lcm9vbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIwMDlmMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQ2FtZXJvb24udHh0CkBAIC0wLDAgKzEsNSBAQAorIworUE9QKmh0dHA6Ly93d3cueGlzdC5vcmcvY250cnkvY2FtZXJvb24uYXNweAorQ0lBKmh0dHA6Ly93d3cuZ2VvY29tbS5jb20vZmFxL2NvcHlyaWdodC5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0NhbmFkYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0NhbmFkYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThiM2ExMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQ2FuYWRhLnR4dApAQCAtMCwwICsxLDUgQEAKKyMKK1BPUCpodHRwOi8vd3d3Lnhpc3Qub3JnL2NudHJ5L2NhbmFkYS5hc3B4CitDSUEqaHR0cDovL3d3dy5nZW9jb21tLmNvbS9mYXEvY29weXJpZ2h0Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQ2FwZSBWZXJkZS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0NhcGUgVmVyZGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNTZhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0NhcGUgVmVyZGUudHh0CkBAIC0wLDAgKzEsNyBAQAorIworQ0lUWVBPUCpodHRwOi8vd3d3LmluZS5jdi8KKyMKK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9Q1BWJlRIRU1FPV9hZG0KK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9jdi5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0NlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYy50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0NlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZhMzEwMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljLnR4dApAQCAtMCwwICsxLDcgQEAKKyMKK1BPUCpodHRwOi8vd3d3LnN0YXQtY2VudHJhZnJpcXVlLmNvbS8KK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9Q0FGJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9jdC5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0NoYWQudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9DaGFkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmEwOTYzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9DaGFkLnR4dApAQCAtMCwwICsxLDggQEAKKyMKK0NJVFlQT1AqaHR0cDovL3d3dy5jaXR5cG9wdWxhdGlvbi5kZS9DaGFkLmh0bWwKKyMKK1BPUCpodHRwOi8vd3d3Lmluc2VlZC10Y2hhZC5vcmcvCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPVRDRCZUSEVNRT1fYWRtCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvY2QuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9DaGlsZS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0NoaWxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWFmNTQzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9DaGlsZS50eHQKQEAgLTAsMCArMSwxMCBAQAorIworQ0lUWVBPUCpodHRwOi8vd3d3LmNpdHlwb3B1bGF0aW9uLmRlL0NoaWxlLmh0bWwKK1BPUCpodHRwOi8vd3d3LmluZS5jbC9pbmUvY2FuYWxlcy9jaGlsZV9lc3RhZGlzdGljby9ob21lLnBocAorUE9QMipodHRwOi8vd3d3LnZpc2l0aW5nY2hpbGUuY29tL3JlZ2lvbmVzL3JlZ2lvbi1zdXIvcmVnaW9uLWJpby1iaW8vcHJvdmluY2lhLWFyYXVjby9wcm92aW5jaWEtYXJhdWNvLnBocAorREVNT0dSQUZJQSpodHRwOi8vd3d3LmluZS5jbC9pbmUvY2FuYWxlcy9jaGlsZV9lc3RhZGlzdGljby9kZW1vZ3JhZmlhX3lfdml0YWxlcy9kZW1vZ3JhZmlhL2RlbW9ncmFmaWEucGhwCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPUNITCZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvY2kuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9DaGluYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0NoaW5hLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmQ0MTI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9DaGluYS50eHQKQEAgLTAsMCArMSw3IEBACisjCitDSVRZUE9QKmh0dHA6Ly93d3cuc3RhdHMuZ292LmNuL2VuZ2xpc2gvaW5kZXguaHRtCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPUNITiZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvY2guaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Db2xvbWJpYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0NvbG9tYmlhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjBlZTFjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Db2xvbWJpYS50eHQKQEAgLTAsMCArMSw4IEBACisjCitDSVRZUE9QKmh0dHA6Ly93d3cuZGFuZS5nb3YuY28vCitQT1AyKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1DT0wmVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2NvLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQ29tb3Jvcy50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0NvbW9yb3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3M2Q5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0NvbW9yb3MudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1DT00mVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2NuLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQ29uZ28udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Db25nby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3YzEyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQ29uZ28udHh0CkBAIC0wLDAgKzEsNyBAQAorIworQ0lUWVBPUCpodHRwOi8vd3d3LmNuc2VlLm9yZy8KK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9Q09HJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9jZi5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0Nvc3RhUmljYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0Nvc3RhUmljYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVlNDAwNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQ29zdGFSaWNhLnR4dApAQCAtMCwwICsxLDUgQEAKKyMKK1BPUCpodHRwOi8vd3d3Lnhpc3Qub3JnL2NudHJ5L2Nvc3RhcmljYS5hc3B4CitDSUEqaHR0cDovL3d3dy5nZW9jb21tLmNvbS9mYXEvY29weXJpZ2h0Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQ3JvYXRpYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0Nyb2F0aWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNmZjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0Nyb2F0aWEudHh0CkBAIC0wLDAgKzEsMiBAQAorVU5JVEVETkFUSU9OUypodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQ3plY2ggUmVwdWJsaWMudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9DemVjaCBSZXB1YmxpYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEwODNjMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvQ3plY2ggUmVwdWJsaWMudHh0CkBAIC0wLDAgKzEsNCBAQAorVU5JVEVETkFUSU9OUypodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQKKyMKK0NJVFlQT1AqaHR0cDovL3d3dy5jaXR5cG9wdWxhdGlvbi5kZS9DemVjaFJlcC5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0Rlbm1hcmsudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9EZW5tYXJrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTZmYzY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9EZW5tYXJrLnR4dApAQCAtMCwwICsxLDIgQEAKK1VOSVRFRE5BVElPTlMqaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0VjdWFkb3IudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9FY3VhZG9yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzc2OWE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9FY3VhZG9yLnR4dApAQCAtMCwwICsxLDcgQEAKKyMKK0NJVFlQT1AqaHR0cDovL3d3dy5pbmVjLmdvdi5lYy9kZWZhdWx0LmFzcAorRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1FQ1UmVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2VjLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvRWd5cHQudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9FZ3lwdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlN2M0NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvRWd5cHQudHh0CkBAIC0wLDAgKzEsNyBAQAorIworQ0lUWVBPUCpodHRwOi8vd3d3LnNpcy5nb3YuZWcvRW4vRGVmYXVsdC5odG0KK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9RUdZJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9lZy5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0VsU2FsdmFkb3IudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9FbFNhbHZhZG9yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjVmYWMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9FbFNhbHZhZG9yLnR4dApAQCAtMCwwICsxLDUgQEAKKyMKK1BPUCpodHRwOi8vd3d3Lnhpc3Qub3JnL2NudHJ5L2Vsc2FsdmFkb3IuYXNweAorQ0lBKmh0dHA6Ly93d3cuZ2VvY29tbS5jb20vZmFxL2NvcHlyaWdodC5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0VxdWF0b3JpYWwgR3VpbmVhLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvRXF1YXRvcmlhbCBHdWluZWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZDQyNGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0VxdWF0b3JpYWwgR3VpbmVhLnR4dApAQCAtMCwwICsxLDcgQEAKKyMKK0NJVFlQT1AqaHR0cDovL3d3dy5kZ2VjbnN0YXQtZ2Uub3JnLworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1HTlEmVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2VrLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvRXJpdHJlYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0VyaXRyZWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZGQ5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0VyaXRyZWEudHh0CkBAIC0wLDAgKzEsOSBAQAorIworQ0lUWVBPUCpodHRwOi8vd3d3LmNpdHlwb3B1bGF0aW9uLmRlL0VyaXRyZWEuaHRtbAorUE9QKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworQVJFQSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9RVJJJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9lci5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0VzdG9uaWEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Fc3RvbmlhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmM1YzI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Fc3RvbmlhLnR4dApAQCAtMCwwICsxLDUgQEAKKyMKK1BPUCpodHRwOi8vd3d3Lnhpc3Qub3JnL2NudHJ5L2VzdG9uaWEuYXNweAorQ0lBKmh0dHA6Ly93d3cuZ2VvY29tbS5jb20vZmFxL2NvcHlyaWdodC5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0V0aGlvcGlhLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvRXRoaW9waWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YTdhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0V0aGlvcGlhLnR4dApAQCAtMCwwICsxLDUgQEAKKyMKK1BPUCpodHRwOi8vd3d3Lnhpc3Qub3JnL2NudHJ5L2V0aGlvcGlhLmFzcHgKK0NJQSpodHRwOi8vd3d3Lmdlb2NvbW0uY29tL2ZhcS9jb3B5cmlnaHQuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9GYXJvZSBJc2xhbmRzLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvRmFyb2UgSXNsYW5kcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZmM2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvRmFyb2UgSXNsYW5kcy50eHQKQEAgLTAsMCArMSwyIEBACitVTklURUROQVRJT05TKmh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9GYXVsa2xhbmQgSXNsYW5kcy50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0ZhdWxrbGFuZCBJc2xhbmRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmY4MWI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9GYXVsa2xhbmQgSXNsYW5kcy50eHQKQEAgLTAsMCArMSw1IEBACitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPUZMSyZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvZmsuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9GaW5sYW5kLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvRmlubGFuZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZmM2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvRmlubGFuZC50eHQKQEAgLTAsMCArMSwyIEBACitVTklURUROQVRJT05TKmh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9GcmFuY2UudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9GcmFuY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNmZjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0ZyYW5jZS50eHQKQEAgLTAsMCArMSwyIEBACitVTklURUROQVRJT05TKmh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9HYWJvbi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0dhYm9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjA4Mjk5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9HYWJvbi50eHQKQEAgLTAsMCArMSw3IEBACisjCitDSVRZUE9QKmh0dHA6Ly93d3cuc3RhdC1nYWJvbi5nYS9Ib21lL0luZGV4MS5odG0KK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9R0FCJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9nYi5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0dhbWJpYSBUaGUudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9HYW1iaWEgVGhlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzMxOTU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9HYW1iaWEgVGhlLnR4dApAQCAtMCwwICsxLDYgQEAKKyMKK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9R01CJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9nYS5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0dlcm1hbnkudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9HZXJtYW55LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTZmYzY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9HZXJtYW55LnR4dApAQCAtMCwwICsxLDIgQEAKK1VOSVRFRE5BVElPTlMqaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0doYW5hLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvR2hhbmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NmU3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0doYW5hLnR4dApAQCAtMCwwICsxLDcgQEAKKyMKK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9R0hBJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9naC5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvR2xvcmlvc28gSXNsYW5kcy50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0dsb3Jpb3NvIElzbGFuZHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ODJhNDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0dsb3Jpb3NvIElzbGFuZHMudHh0CkBAIC0wLDAgKzEsNSBAQAorRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1SRVUmVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3p6Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvR3JlZWNlLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvR3JlZWNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTZmYzY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9HcmVlY2UudHh0CkBAIC0wLDAgKzEsMiBAQAorVU5JVEVETkFUSU9OUypodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvR3VhdGVtYWxhLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvR3VhdGVtYWxhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTc1MzZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9HdWF0ZW1hbGEudHh0CkBAIC0wLDAgKzEsNSBAQAorIworUE9QKmh0dHA6Ly93d3cueGlzdC5vcmcvY250cnkvZ3VhdGVtYWxhLmFzcHgKK0NJQSpodHRwOi8vd3d3Lmdlb2NvbW0uY29tL2ZhcS9jb3B5cmlnaHQuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9HdWluZWEgQmlzc2F1LnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvR3VpbmVhIEJpc3NhdS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkMDgyYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvR3VpbmVhIEJpc3NhdS50eHQKQEAgLTAsMCArMSw2IEBACitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPUdOQiZUSEVNRT1fYWRtCitDSVRZUE9QKmh0dHA6Ly93d3cuc3RhdC1ndWluZWJpc3NhdS5jb20vCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvcHUuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9HdWluZWEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9HdWluZWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZTdjNTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0d1aW5lYS50eHQKQEAgLTAsMCArMSw2IEBACitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPUdJTiZUSEVNRT1fYWRtCitDSVRZUE9QKmh0dHA6Ly93d3cuc3RhdC1ndWluZWUub3JnLworIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2d2Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvR3V5YW5hLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvR3V5YW5hLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTg5NWJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9HdXlhbmEudHh0CkBAIC0wLDAgKzEsNyBAQAorIworQ0lUWVBPUCpodHRwOi8vd3d3LnN0YXRpc3RpY3NndXlhbmEuZ292Lmd5LworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1HVVkmVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2d5Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvSG9uZHVyYXMudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Ib25kdXJhcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjOTc3OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvSG9uZHVyYXMudHh0CkBAIC0wLDAgKzEsNSBAQAorIworUE9QKmh0dHA6Ly93d3cueGlzdC5vcmcvY250cnkvaG9uZHVyYXMuYXNweAorQ0lBKmh0dHA6Ly93d3cuZ2VvY29tbS5jb20vZmFxL2NvcHlyaWdodC5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0h1bmdhcnkudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9IdW5nYXJ5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTZmYzY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9IdW5nYXJ5LnR4dApAQCAtMCwwICsxLDIgQEAKK1VOSVRFRE5BVElPTlMqaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0ljZWxhbmQudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9JY2VsYW5kLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTZmYzY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9JY2VsYW5kLnR4dApAQCAtMCwwICsxLDIgQEAKK1VOSVRFRE5BVElPTlMqaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0luZGlhLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvSW5kaWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZmE0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0luZGlhLnR4dApAQCAtMCwwICsxLDcgQEAKKyMKK0NJVFlQT1AqaHR0cDovL3d3dy5jZW5zdXNpbmRpYS5uZXQvCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPUlORCZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvaW4uaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9JbmRvbmVzaWEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9JbmRvbmVzaWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYzk2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0luZG9uZXNpYS50eHQKQEAgLTAsMCArMSw4IEBACisjCitDSVRZUE9QKmh0dHA6Ly93d3cuY2l0eXBvcHVsYXRpb24uZGUvSW5kb25lc2lhLmh0bWwKK1BPUCpodHRwOi8vd3d3LmJwcy5nby5pZC9pbmRleC5zaHRtbAorRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1JRE4mVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2lkLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvSXJhbi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0lyYW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OWUxOTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0lyYW4udHh0CkBAIC0wLDAgKzEsNyBAQAorIworQ0lUWVBPUCpodHRwOi8vd3d3LnNjaS5vcmcuaXIvcG9ydGFsL2ZhY2VzL3B1YmxpYy9zY2lfZW4KK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9SVJOJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9pci5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0lyYXEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9JcmFxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2ZmYWFhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9JcmFxLnR4dApAQCAtMCwwICsxLDUgQEAKKyMKKyMKK0NJVFlQT1AqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPUlSUSZUSEVNRT1fYWRtCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvaXouaHRtbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvSXJlbGFuZC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0lyZWxhbmQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNmZjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0lyZWxhbmQudHh0CkBAIC0wLDAgKzEsMiBAQAorVU5JVEVETkFUSU9OUypodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvSXRhbHkudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9JdGFseS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZmM2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvSXRhbHkudHh0CkBAIC0wLDAgKzEsMiBAQAorVU5JVEVETkFUSU9OUypodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvSXZvcnkgQ29hc3QudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Jdm9yeSBDb2FzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3NTFiYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvSXZvcnkgQ29hc3QudHh0CkBAIC0wLDAgKzEsNyBAQAorIworQ0lUWVBPUCpodHRwOi8vd3d3Lmlucy5jaS8KK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9Q0lWJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9pdi5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0phcGFuLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvSmFwYW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOWRlMzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0phcGFuLnR4dApAQCAtMCwwICsxLDcgQEAKKyMKK0NJVFlQT1AqaHR0cDovL3d3dy5zdGF0LmdvLmpwL2VuZ2xpc2gvaW5kZXguaHRtCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPUpQTiZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvamEuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Kb3JkYW4udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Kb3JkYW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NGM2YWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0pvcmRhbi50eHQKQEAgLTAsMCArMSw3IEBACisjCitDSVRZUE9QKmh0dHA6Ly93d3cuZG9zLmdvdi5qby8KK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9Sk9SJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9qby5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0themFraHN0YW4udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9LYXpha2hzdGFuLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2I5MTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9LYXpha2hzdGFuLnR4dApAQCAtMCwwICsxLDggQEAKKyMKK0NJVFlQT1AqaHR0cDovL3d3dy5jaXR5cG9wdWxhdGlvbi5kZS9LYXpha2hzdGFuLmh0bWwKK1BPUCpodHRwOi8vd3d3LnN0YXQua3ovc3RhdC9pbmRleC5hc3B4P3NsPW5ld3MmbD1lbgorRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1LQVomVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2t6Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvS2VueWEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9LZW55YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxNDc5ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvS2VueWEudHh0CkBAIC0wLDAgKzEsNyBAQAorIworQ0lUWVBPUCpodHRwOi8vd3d3LmNicy5nby5rZS8KK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9S0VOJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9rZS5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0t1d2FpdC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0t1d2FpdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI0ZTEwZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvS3V3YWl0LnR4dApAQCAtMCwwICsxLDcgQEAKKyMKKyMKK0NJVFlQT1AqaHR0cDovL3d3dy5tb3AuZ292Lmt3L01vcFdlYlNpdGUvZW5nbGlzaC9kZWZhdWx0LmFzcAorRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1LV1QmVEhFTUU9X2FkbQorQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2t1Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvS3lyZ3l6c3Rhbi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0t5cmd5enN0YW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MDUzYTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0t5cmd5enN0YW4udHh0CkBAIC0wLDAgKzEsNyBAQAorIworQ09VTlRSWVBST0ZJTEUqaHR0cDovL3d3dy5mYW8ub3JnL2NvdW50cnlwcm9maWxlcy9NYXBzL0tHWi8xOS9pbS9hdHQva2d6X0FEX2RiZjEuaHRtbAorRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1LR1omVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2tnLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTGFvcy50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0xhb3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjljZjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0xhb3MudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1MQU8mVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2xhLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTGF0dmlhLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTGF0dmlhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTYwMzhjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9MYXR2aWEudHh0CkBAIC0wLDAgKzEsNSBAQAorIworUE9QKmh0dHA6Ly93d3cueGlzdC5vcmcvY250cnkvbGF0dmlhLmFzcHgKK0NJQSpodHRwOi8vd3d3Lmdlb2NvbW0uY29tL2ZhcS9jb3B5cmlnaHQuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9MZWJhbm9uLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTGViYW5vbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4Y2U5ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTGViYW5vbi50eHQKQEAgLTAsMCArMSw2IEBACisjCisjCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPUxCTiZUSEVNRT1fYWRtCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbGUuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9MZXNvdGhvLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTGVzb3Roby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyZTQ2NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTGVzb3Roby50eHQKQEAgLTAsMCArMSw2IEBACisjCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPUxTTyZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbHQuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9MaWJlcmlhLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTGliZXJpYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiMDQ2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTGliZXJpYS50eHQKQEAgLTAsMCArMSw3IEBACisjCitTVEFUT0lEUypodHRwOi8vd3d3LnN0YXRvaWRzLmNvbS91bHIuaHRtbAorRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1MQlImVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2xpLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTGlieWEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9MaWJ5YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiOGFiMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTGlieWEudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1MQlkmVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2x5Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTGllY2h0ZW5zdGVpbi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0xpZWNodGVuc3RlaW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YjY0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL0xpZWNodGVuc3RlaW4udHh0CkBAIC0wLDAgKzEsMyBAQAorVU5JVEVETkFUSU9OUypodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQKKyMKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTGl0aHVhbmlhLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTGl0aHVhbmlhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDc0Mzc5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9MaXRodWFuaWEudHh0CkBAIC0wLDAgKzEsNSBAQAorIworUE9QKmh0dHA6Ly93d3cueGlzdC5vcmcvY250cnkvbGl0aHVhbmlhLmFzcHgKK0NJQSpodHRwOi8vd3d3Lmdlb2NvbW0uY29tL2ZhcS9jb3B5cmlnaHQuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9MdXhlbWJvdXJnLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTHV4ZW1ib3VyZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZmM2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTHV4ZW1ib3VyZy50eHQKQEAgLTAsMCArMSwyIEBACitVTklURUROQVRJT05TKmh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9NYWNhdS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL01hY2F1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWMzODliCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9NYWNhdS50eHQKQEAgLTAsMCArMSw1IEBACitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPU1BQyZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbWMuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9NYWNlZG9uaWEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9NYWNlZG9uaWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNmJlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL01hY2Vkb25pYS50eHQKQEAgLTAsMCArMSw2IEBACisjCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPU1LRCZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbWsuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9NYWRhZ2FzY2FyLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTWFkYWdhc2Nhci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2MDlhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTWFkYWdhc2Nhci50eHQKQEAgLTAsMCArMSw2IEBACisjCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPU1ERyZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbWEuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9NYWxhd2kudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9NYWxhd2kudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MGVhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL01hbGF3aS50eHQKQEAgLTAsMCArMSw2IEBACisjCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPU1XSSZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbWkuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9NYWxpLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTWFsaS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2NjMzMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTWFsaS50eHQKQEAgLTAsMCArMSw1IEBACisjCitQT1AqaHR0cDovL3d3dy54aXN0Lm9yZy9jbnRyeS9tYWxpLmFzcHgKK0NJQSpodHRwOi8vd3d3Lmdlb2NvbW0uY29tL2ZhcS9jb3B5cmlnaHQuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9NYXVyaXRhbmlhLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTWF1cml0YW5pYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwOGMxNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTWF1cml0YW5pYS50eHQKQEAgLTAsMCArMSw1IEBACisjCitQT1AqaHR0cDovL3d3dy54aXN0Lm9yZy9jbnRyeS9tYXVyaXRhbmlhLmFzcHgKK0NJQSpodHRwOi8vd3d3Lmdlb2NvbW0uY29tL2ZhcS9jb3B5cmlnaHQuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9NYXVyaXRpdXMudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9NYXVyaXRpdXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODFiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL01hdXJpdGl1cy50eHQKQEAgLTAsMCArMSw2IEBACisjCisjCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPU1VUyZUSEVNRT1fYWRtCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbXAuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9NZXhpY28udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9NZXhpY28udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YTlmZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL01leGljby50eHQKQEAgLTAsMCArMSw2IEBACisjCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPU1FWCZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbXguaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Nb2xkb3ZpYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL01vbGRvdmlhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODJjZWIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Nb2xkb3ZpYS50eHQKQEAgLTAsMCArMSw1IEBACitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPU1EQSZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbWQuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Nb25nb2xpYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL01vbmdvbGlhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTUyMzJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Nb25nb2xpYS50eHQKQEAgLTAsMCArMSw2IEBACisjCisjCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPU1ORyZUSEVNRT1fYWRtCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbWcuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Nb3JvY2NvLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTW9yb2Njby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmYjhiMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTW9yb2Njby50eHQKQEAgLTAsMCArMSw2IEBACisjCisjCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPU1BUiZUSEVNRT1fYWRtCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbW8uaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Nb3phbWJpcXVlLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTW96YW1iaXF1ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU0ZGE0MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTW96YW1iaXF1ZS50eHQKQEAgLTAsMCArMSw2IEBACisjCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPU1PWiZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbXouaHRtbFwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTXlhbm1hci50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL015YW5tYXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYmFjZTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL015YW5tYXIudHh0CkBAIC0wLDAgKzEsNSBAQAorRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1NTVImVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2JtLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTmFtaWJpYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL05hbWliaWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NDg2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL05hbWliaWEudHh0CkBAIC0wLDAgKzEsNyBAQAorIworUE9QVUxTVEFUKmh0dHA6Ly93d3cubGlicmFyeS51dS5ubC93ZXNwL3BvcHVsc3RhdC9BZnJpY2EvbmFtaWJpYXAuaHRtCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPU5BTSZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3Mvd2EuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9OZXBhbC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL05lcGFsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjcxYjUyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9OZXBhbC50eHQKQEAgLTAsMCArMSw2IEBACisjCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPU5QTCZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvbnAuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9OZXRoZXJsYW5kcy50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL05ldGhlcmxhbmRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTZmYzY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9OZXRoZXJsYW5kcy50eHQKQEAgLTAsMCArMSwyIEBACitVTklURUROQVRJT05TKmh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9OaWNhcmFndWEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9OaWNhcmFndWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1M2E2YjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL05pY2FyYWd1YS50eHQKQEAgLTAsMCArMSw1IEBACisjCitQT1AqaHR0cDovL3d3dy54aXN0Lm9yZy9jbnRyeS9uaWNhcmFndWEuYXNweAorQ0lBKmh0dHA6Ly93d3cuZ2VvY29tbS5jb20vZmFxL2NvcHlyaWdodC5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL05pZ2VyLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTmlnZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZjY3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL05pZ2VyLnR4dApAQCAtMCwwICsxLDYgQEAKKyMKK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9TkVSJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9uZy5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL05pZ2VyaWEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9OaWdlcmlhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWQyNTY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9OaWdlcmlhLnR4dApAQCAtMCwwICsxLDYgQEAKKyMKK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9TkdBJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9uaS5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL05vcnRoIEtvcmVhLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTm9ydGggS29yZWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMmM4N2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL05vcnRoIEtvcmVhLnR4dApAQCAtMCwwICsxLDYgQEAKKyMKK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9UFJLJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9rbi5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL05vcndheS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL05vcndheS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZmM2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvTm9yd2F5LnR4dApAQCAtMCwwICsxLDIgQEAKK1VOSVRFRE5BVElPTlMqaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL09tYW4udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9PbWFuLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWMxNGM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9PbWFuLnR4dApAQCAtMCwwICsxLDYgQEAKKyMKKyMKK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9T01OJlRIRU1FPV9hZG0KK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9tdS5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1Bha2lzdGFuLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvUGFraXN0YW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOTg2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1Bha2lzdGFuLnR4dApAQCAtMCwwICsxLDYgQEAKKyMKK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9UEFLJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9way5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1BhbmFtYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1BhbmFtYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY5ZmUxOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvUGFuYW1hLnR4dApAQCAtMCwwICsxLDUgQEAKKyMKK1BPUCpodHRwOi8vd3d3Lnhpc3Qub3JnL2NudHJ5L3BhbmFtYS5hc3B4CitDSUEqaHR0cDovL3d3dy5nZW9jb21tLmNvbS9mYXEvY29weXJpZ2h0Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvUGFwdWEgTmV3IEd1aW5lYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1BhcHVhIE5ldyBHdWluZWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyY2QwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1BhcHVhIE5ldyBHdWluZWEudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1QTkcmVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3BwLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvUGFyYWd1YXkudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9QYXJhZ3VheS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjMDlmZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvUGFyYWd1YXkudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1QUlkmVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3BhLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvUGVydS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1BlcnUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZDA0NGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1BlcnUudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1QRVImVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3BlLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvUGhpbGlwcGluZXMudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9QaGlsaXBwaW5lcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY5NzllOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvUGhpbGlwcGluZXMudHh0CkBAIC0wLDAgKzEsNyBAQAorIworQ0lUWVBPUCpodHRwOi8vd3d3LmNpdHlwb3B1bGF0aW9uLmRlL1BoaWxpcHBpbmVzLmh0bWwKK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9UEhMJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9ycC5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1BvbGFuZC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1BvbGFuZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZmM2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvUG9sYW5kLnR4dApAQCAtMCwwICsxLDIgQEAKK1VOSVRFRE5BVElPTlMqaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1BvcnR1Z2FsLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvUG9ydHVnYWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNmZjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1BvcnR1Z2FsLnR4dApAQCAtMCwwICsxLDIgQEAKK1VOSVRFRE5BVElPTlMqaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1B1ZXJ0byBSaWNvLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvUHVlcnRvIFJpY28udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZWI4ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1B1ZXJ0byBSaWNvLnR4dApAQCAtMCwwICsxLDMgQEAKK1VTQ0VOU1VTUFVFUlRPUklDTypodHRwOi8vZmFjdGZpbmRlci5jZW5zdXMuZ292L3NlcnZsZXQvR0NUVGFibGU/X2JtPXkmLWdlb19pZD0wNDAwMFVTNzImLV9ib3hfaGVhZF9uYnI9R0NULVBIMSYtZHNfbmFtZT1ERUNfMjAwMF9TRjFfVSYtcmVkb0xvZz1mYWxzZSYtbXRfbmFtZT1ERUNfMjAwMF9TRjFfVV9HQ1RQSDFfVVM5Ji1mb3JtYXQ9U1QtMiYtQ09OVEVYVD1nY3QKKyMKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9RYXRhci50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1FhdGFyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTZiOTdiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9RYXRhci50eHQKQEAgLTAsMCArMSw2IEBACisjCisjCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPVFBVCZUSEVNRT1fYWRtCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvcWEuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Sb21hbmlhLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvUm9tYW5pYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZmM2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvUm9tYW5pYS50eHQKQEAgLTAsMCArMSwyIEBACitVTklURUROQVRJT05TKmh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9SdXNzaWEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9SdXNzaWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNmZjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1J1c3NpYS50eHQKQEAgLTAsMCArMSwyIEBACitVTklURUROQVRJT05TKmh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Sd2FuZGEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Sd2FuZGEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYzQxOWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1J3YW5kYS50eHQKQEAgLTAsMCArMSw2IEBACisjCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPVJXQSZUSEVNRT1fYWRtCisjCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvcncuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9TYW4gTWFyaW5vLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU2FuIE1hcmluby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZmM2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU2FuIE1hcmluby50eHQKQEAgLTAsMCArMSwyIEBACitVTklURUROQVRJT05TKmh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9TYW8gVG9tZSBhbmQgUHJpbmNpcGUudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9TYW8gVG9tZSBhbmQgUHJpbmNpcGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZDJkZmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1NhbyBUb21lIGFuZCBQcmluY2lwZS50eHQKQEAgLTAsMCArMSw2IEBACisjCisjCitESVZBKmh0dHA6Ly93d3cuY2lwb3RhdG8ub3JnL0RJVkEvZGF0YS9EYXRhU2VydmVyLmFzcD9BUkVBPVNUUCZUSEVNRT1fYWRtCitDSUEqaHR0cHM6Ly93d3cuY2lhLmdvdi9jaWEvcHVibGljYXRpb25zL2ZhY3Rib29rL2dlb3MvdHAuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9TYXVkaSBBcmFiaWEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9TYXVkaSBBcmFiaWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMDhjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1NhdWRpIEFyYWJpYS50eHQKQEAgLTAsMCArMSw3IEBACisjCitDSVRZUE9QKmh0dHA6Ly93d3cuY2l0eXBvcHVsYXRpb24uZGUvU2F1ZGlBcmFiaWEuaHRtbAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1TQVUmVEhFTUU9X2FkbQorQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3NhLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU2VuZWdhbC50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1NlbmVnYWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NmQ1M2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1NlbmVnYWwudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1TRU4mVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3NnLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU2V5Y2hlbGxlcy50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1NleWNoZWxsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZGRiNDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1NleWNoZWxsZXMudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1TRU4mVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3NlLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU2llcnJhIExlb25lLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU2llcnJhIExlb25lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmIyMmFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9TaWVycmEgTGVvbmUudHh0CkBAIC0wLDAgKzEsNiBAQAorIworIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1TTEUmVEhFTUU9X2FkbQorQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3NsLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU2luZ2Fwb3JlLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU2luZ2Fwb3JlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzJiMzY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9TaW5nYXBvcmUudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1TR1AmVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3NuLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU2xvdmVuaWEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9TbG92ZW5pYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZmM2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU2xvdmVuaWEudHh0CkBAIC0wLDAgKzEsMiBAQAorVU5JVEVETkFUSU9OUypodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU29tYWxpYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1NvbWFsaWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMzZkODYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1NvbWFsaWEudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1TT00mVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3NvLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU291dGggQWZyaWNhLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU291dGggQWZyaWNhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGMyYTdiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Tb3V0aCBBZnJpY2EudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1aQUYmVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3NmLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU291dGggS29yZWEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Tb3V0aCBLb3JlYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3ZWU1ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU291dGggS29yZWEudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1LT1ImVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL2tzLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU3BhaW4udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9TcGFpbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZmM2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU3BhaW4udHh0CkBAIC0wLDAgKzEsMiBAQAorVU5JVEVETkFUSU9OUypodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU3VkYW4udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9TdWRhbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5YzhhZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU3VkYW4udHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1TRE4mVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3N1Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU3VyaW5hbWUudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9TdXJpbmFtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhN2VkNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU3VyaW5hbWUudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1TVVImVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL25zLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU3dlZGVuLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU3dlZGVuLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTZmYzY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Td2VkZW4udHh0CkBAIC0wLDAgKzEsMiBAQAorVU5JVEVETkFUSU9OUypodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU3dpdHplcmxhbmQudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9Td2l0emVybGFuZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZmM2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU3dpdHplcmxhbmQudHh0CkBAIC0wLDAgKzEsMiBAQAorVU5JVEVETkFUSU9OUypodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU3lyaWEudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9TeXJpYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4YTE4YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvU3lyaWEudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1TWVImVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3N5Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvVGFqaWtpc3Rhbi50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1RhamlraXN0YW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0Zjc5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1RhamlraXN0YW4udHh0CkBAIC0wLDAgKzEsNiBAQAorIworIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1USksmVEhFTUU9X2FkbQorQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3RpLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvVGFuemFuaWEgVW5pdGVkIFJlcHVibGljLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvVGFuemFuaWEgVW5pdGVkIFJlcHVibGljLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWMwM2JmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9UYW56YW5pYSBVbml0ZWQgUmVwdWJsaWMudHh0CkBAIC0wLDAgKzEsNyBAQAorIworIworIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1UWkEmVEhFTUU9X2FkbQorQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3R6Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvVGhhaWxhbmQudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9UaGFpbGFuZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiYTIwMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvVGhhaWxhbmQudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1USEEmVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3RoLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvVG9nby50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1RvZ28udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZTI0MDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1RvZ28udHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1UR08mVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3RvLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvVHVuaXNpYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1R1bmlzaWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNmIyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1R1bmlzaWEudHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1UVU4mVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3RzLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvVHVya2V5LnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvVHVya2V5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2Y0Nzc5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9UdXJrZXkudHh0CkBAIC0wLDAgKzEsNiBAQAorIworIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1UVVImVEhFTUU9X2FkbQorQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3R1Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvVHVya21lbmlzdGFuLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvVHVya21lbmlzdGFuLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTE3OTViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9UdXJrbWVuaXN0YW4udHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1US00mVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3R4Lmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvVU5JVEVEIFNUQVRFUy50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1VOSVRFRCBTVEFURVMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOWRiOGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1VOSVRFRCBTVEFURVMudHh0CkBAIC0wLDAgKzEsNSBAQAorVVNDRU5TVVNBUkVBKmh0dHA6Ly93d3cuY2Vuc3VzLmdvdi9wb3B1bGF0aW9uL3d3dy9jZW5zdXNkYXRhL2RlbnNpdHkuaHRtbAorVVNDRU5TVVNQT1AqaHR0cDovL3d3dy5jZW5zdXMuZ292L3BvcHVsYXRpb24vY2VuMjAwMC9waGMtdDQvdGFiMDEueGxzCitVU0NFTlNVU0JPVU5EUypodHRwOi8vd3d3LmNlbnN1cy5nb3YvZ2VvL3d3dy9jb2IvY28yMDAwLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1VnYW5kYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1VnYW5kYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMxMGIzMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvVWdhbmRhLnR4dApAQCAtMCwwICsxLDcgQEAKKyMKKyMKKyMKK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9VUdBJlRIRU1FPV9hZG0KK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy91Zy5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1VuaXRlZCBLaW5nZG9tLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvVW5pdGVkIEtpbmdkb20udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNmZjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1VuaXRlZCBLaW5nZG9tLnR4dApAQCAtMCwwICsxLDIgQEAKK1VOSVRFRE5BVElPTlMqaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1VuaXRlZEFyYWJFbWlyYXRlcy50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1VuaXRlZEFyYWJFbWlyYXRlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyM2E1YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvVW5pdGVkQXJhYkVtaXJhdGVzLnR4dApAQCAtMCwwICsxLDYgQEAKKyMKK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9QVJFJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy9zeS5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1VydWd1YXkudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9VcnVndWF5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDliMDc3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9VcnVndWF5LnR4dApAQCAtMCwwICsxLDYgQEAKKyMKK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9VVJZJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy91eS5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1V6YmVraXN0YW4udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9VemJla2lzdGFuLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTMxN2VjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9VemJla2lzdGFuLnR4dApAQCAtMCwwICsxLDcgQEAKKyMKK0NJVFlQT1AqaHR0cDovL3d3dy5jaXR5cG9wdWxhdGlvbi5kZS9VemJla2lzdGFuLmh0bWwKK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9VVpCJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2NpYS9wdWJsaWNhdGlvbnMvZmFjdGJvb2svZ2Vvcy91ei5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1ZlbmV6dWVsYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1ZlbmV6dWVsYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzZGM0MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvVmVuZXp1ZWxhLnR4dApAQCAtMCwwICsxLDYgQEAKKyMKK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9VkVOJlRIRU1FPV9hZG0KKyMKK0NJQSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvVmlldG5hbS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1ZpZXRuYW0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMGI1MGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1ZpZXRuYW0udHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1WTk0mVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3ZtLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvWWVtZW4udHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9ZZW1lbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE1MDNlMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvWWVtZW4udHh0CkBAIC0wLDAgKzEsNiBAQAorIworRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1ZRU0mVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3ltLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvWXVnb3NsYXZpYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1l1Z29zbGF2aWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNGMzMzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1l1Z29zbGF2aWEudHh0CkBAIC0wLDAgKzEsNCBAQAorVU5JVEVETkFUSU9OUypodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQKKyMKK0NJVFlQT1AqaHR0cDovL3d3dy5jaXR5cG9wdWxhdGlvbi5kZS9EZXV0c2NobGFuZC5odG1sCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1phaXJlLnR4dCBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvWmFpcmUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NDM4YWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1phaXJlLnR4dApAQCAtMCwwICsxLDUgQEAKK0RJVkEqaHR0cDovL3d3dy5jaXBvdGF0by5vcmcvRElWQS9kYXRhL0RhdGFTZXJ2ZXIuYXNwP0FSRUE9WkFSJlRIRU1FPV9hZG0KKyMKK0NJQSpVTktOT1dOCitJU08zMTY2XzEqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCitJU08zMTY2XzIqaHR0cHM6Ly93d3cuY2lhLmdvdi9saWJyYXJ5L3B1YmxpY2F0aW9ucy90aGUtd29ybGQtZmFjdGJvb2svCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1phbWJpYS50eHQgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvcGFyYW1ldGVycy91cmxzL1phbWJpYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5Y2I3YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvWmFtYmlhLnR4dApAQCAtMCwwICsxLDcgQEAKKyMKK0NJVFlQT1AqaHR0cDovL3d3dy5jaXR5cG9wdWxhdGlvbi5kZS9aYW1iaWEuaHRtbAorRElWQSpodHRwOi8vd3d3LmNpcG90YXRvLm9yZy9ESVZBL2RhdGEvRGF0YVNlcnZlci5hc3A/QVJFQT1aTUImVEhFTUU9X2FkbQorIworQ0lBKmh0dHBzOi8vd3d3LmNpYS5nb3YvY2lhL3B1YmxpY2F0aW9ucy9mYWN0Ym9vay9nZW9zL3phLmh0bWwKK0lTTzMxNjZfMSpodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KK0lTTzMxNjZfMipodHRwczovL3d3dy5jaWEuZ292L2xpYnJhcnkvcHVibGljYXRpb25zL3RoZS13b3JsZC1mYWN0Ym9vay8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvWmltYmFid2UudHh0IGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3BhcmFtZXRlcnMvdXJscy9aaW1iYWJ3ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc3MGI1YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9wYXJhbWV0ZXJzL3VybHMvWmltYmFid2UudHh0CkBAIC0wLDAgKzEsNSBAQAorIworUE9QKmh0dHA6Ly93d3cueGlzdC5vcmcvY250cnkvYmVsaXplLmFzcHgKK0NJQSpodHRwOi8vd3d3Lmdlb2NvbW0uY29tL2ZhcS9jb3B5cmlnaHQuaHRtbAorSVNPMzE2Nl8xKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLworSVNPMzE2Nl8yKmh0dHBzOi8vd3d3LmNpYS5nb3YvbGlicmFyeS9wdWJsaWNhdGlvbnMvdGhlLXdvcmxkLWZhY3Rib29rLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9BZG1pbjFMZXhTb3J0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvQWRtaW4xTGV4U29ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkNzE1YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvQWRtaW4xTGV4U29ydGVyLmphdmEKQEAgLTAsMCArMSwzNzUgQEAKKy8qKgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogU1RFTSBJSSBEYXRhIE1pZ3JhdGlvbi9HZW5lcmF0aW9uIFV0aWxpdGllcyA6IEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHNvcnQKKyAqIGFsbCBsZXZlbCAxIElTTzMxNjYtMiBkZXNjcmlwdG9ycy4gVG8gZG8gc28sIGZpcnN0IGl0IGV4dHJhY3RzIGFsbCB0aGUKKyAqIElTTzMxNjYtMiBkZXNjcmlwdG9ycyB3ZSBoYXZlIGRpc3RyaWJ1dGVkIGluIHRoZSBmb2xsb3dpbmcgdHdvIGZpbGVzOgorICogSVNPMzE2Nl8yX2xpc3QudHh0IGFuZCBJU09fTEVWRUwxX0ZJWC50eHQuIFRoZSBvdXRwdXQgaXMgd3JpdHRlbiBpbnRvIGEKKyAqIHNlbWljb2xvbiBzZXBhcmF0ZWQgZm9ybWF0IG9mIHRoZSBmb3JtOgorICogCisgKiBDT1VOVFJZOkFMUEhBMjpYWC1ZWTpOQU1FOklOREVYCisgKiAKKyAqIFRoaXMgb3V0cHV0IHdpbGwgYmUgdXNlZCBkdXJpbmcgZ2VuZXJhdGlvbiBvZiB0aGUgbGV2ZWwgMiBkZXNjcmlwdG9ycyBhbmQKKyAqIGR1cmluZyBnZW5lcmF0aW9uIG9mIHRoZSByZWxhdGlvbnNoaXAgZmlsZXMuCisgKiAKKyAqIFRvIGNvbmZpZ3VyZSwgc2VlIGNvbmZpZ3VyYXRpb24gZmlsZSA6CisgKiBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9BZG1pbjFMZXhTb3J0ZXIuY29uZmlnCisgKiAKKyAqIAorICogVG8gcnVuLCBhZGQgcGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUgaW4gdGhlIHJ1biBwcm9maWxlIChpLmUuCisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGNvbmZpZ3VyYXRpb25cQWRtaW4xTGV4U29ydGVyLmNvbmZpZykKKyAqIAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBBZG1pbjFMZXhTb3J0ZXIgeworCisJLyoqCisJICogT3VyIHNvdXJjZSBmaWxlcyBmb3IgSVNPIDMxNjYtMSBjb2RlcyBhbmQgZm9yIHRoZSBsaXN0IG9mIHRhcmdldAorCSAqIGNvdW50cmllcy4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBpc28zMTY2XzEgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgaXNvMzE2Nl8yID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIGZpeEZpbGUgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0RmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBvdXRwdXREaXIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgd29ya3NwYWNlID0gbnVsbDsKKworCS8qKgorCSAqIExpc3QgZm9yIElTTyAzMTY2LTEgY29kZXMgYW5kIHRhcmdldCBjb3VudHJpZXMuCisJICovCisKKwlMaXN0IHRhcmdldExpc3QgPSBudWxsOworCisJTGlzdCBjb2RlTGlzdCA9IG51bGw7CisKKwlMaXN0IGNvZGVmaXhMaXN0ID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICogCisJICogQHBhcmFtIGlzbzMxNjZfMSAtCisJICogICAgICAgICAgICBkYXRhIGZpbGUgd2l0aCB0aGUgSVNPMzE2Ni0xIEFMUEhBXzIgYW5kIEFMUEhBXzMgY29kZXMuCisJICogQHBhcmFtIGlzbzMxNjZfMiAtCisJICogICAgICAgICAgICBmaWxlIHdpdGggdGhlIElTTzMxNjYtMiBkYXRhIHVzZWQgZm9yIGdlbmVyYXRpbmcgdGhlIElEcy4KKwkgKiBAcGFyYW0gZml4RmlsZSAtCisJICogICAgICAgICAgICBmaWxlIGNvbnRhaW5pbmcgbWlzc2luZyBJU08zMTY2LTIgY29kZXMKKwkgKiBAcGFyYW0gdGFyZ2V0RmlsZSAtCisJICogICAgICAgICAgICBkYXRhIGZpbGUgd2hlcmUgd2UgZmluZCBhIGxpc3Qgb2YgY291bnRyaWVzIGZvciBnZW5lcmF0aW9uIG9mCisJICogICAgICAgICAgICB0aGVpciBjb3JyZXNwb25kaW5nIGFyZWEucHJvcGVydGllcyBmaWxlcy4KKwkgKiBAcGFyYW0gb3V0cHV0RGlyIC0KKwkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGUgZmlsZXMgZ2VuZXJhdGVkLgorCSAqIAorCSAqLworCS8vIHB1YmxpYyBBZG1pbjFMZXhTb3J0ZXIoU3RyaW5nIGlzbzMxNjZfMSwgU3RyaW5nIGlzbzMxNjZfMiwgU3RyaW5nCisJLy8gZml4RmlsZSwKKwkvLyBTdHJpbmcgdGFyZ2V0RmlsZSwgU3RyaW5nIG91dHB1dERpcikgeworCS8vIC8vIFNldCB2YWx1ZXMgb2YgZ2xvYmFsIHZhcmlhYmxlcy4KKwkvLyB0aGlzLmlzbzMxNjZfMSA9IGlzbzMxNjZfMTsKKwkvLyB0aGlzLmlzbzMxNjZfMiA9IGlzbzMxNjZfMjsKKwkvLyB0aGlzLmZpeEZpbGUgPSBmaXhGaWxlOworCS8vIHRoaXMudGFyZ2V0RmlsZSA9IHRhcmdldEZpbGU7CisJLy8gdGhpcy5vdXRwdXREaXIgPSBvdXRwdXREaXI7CisJLy8gdGFyZ2V0TGlzdCA9IG51bGw7CisJLy8JfQorCisJLyoqCisJICogQHBhcmFtIGNvbmZpZ0ZpbGUKKwkgKi8KKwlwdWJsaWMgQWRtaW4xTGV4U29ydGVyKFN0cmluZyBjb25maWdGaWxlKSB7CisJCisJCS8vIExvYWQgYWxsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCisJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHZhcnMgPSBHZW5VdGlscy5sb2FkQ29uZmlnRmlsZShjb25maWdGaWxlKTsKKworCQlTZXQ8U3RyaW5nPiBrZXlzID0gdmFycy5rZXlTZXQoKTsKKwkJSXRlcmF0b3IgaXQgPSBrZXlzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyB2YXIgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisKKwkJCS8vIEFzc2lnbiB2YWx1ZXMgdG8gY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgOgorCQkJaWYgKHZhci5lcXVhbHMoIldPUktTUEFDRSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl3b3Jrc3BhY2UgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJJU08zMTY2XzEiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJaXNvMzE2Nl8xID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiSVNPMzE2Nl8yIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWlzbzMxNjZfMiA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIklTT19GSVgiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJZml4RmlsZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIlRBUkdFVF9MSVNUIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXRhcmdldEZpbGUgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJQUk9QRVJUSUVTX09VVFBVVCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlvdXRwdXREaXIgPSB2YXJzLmdldCh2YXIpOworCQkJfQorCisJCX0gLy8gd2hpbGUKKworCQkvLyBUaGUgd29ya3NwYWNlIHZhcmlhYmxlIHNob3VsZCBlbmQgd2l0aCBhIHNsYXNoIGNoYXJhY3RlcgorCQlpZiAod29ya3NwYWNlLmVuZHNXaXRoKCJcXCIpID09IGZhbHNlKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXdvcmtzcGFjZSArPSAiXFwiOyAvLyROT04tTkxTLTEkCisJCX0KKworCQlTdHJpbmcgcGF0aCA9IHdvcmtzcGFjZSArIEdlbkNvbnN0YW50cy5QQVJBTVNfRElSOworCisJCS8vIFNldCByZW1haW5pbmcgY29uZmlnIHZhcnMgdXNpbmcgV09SS1NQQUNFICh3b3Jrc3BhY2UgcmVsYXRpdmUpCisJCWlmIChpc28zMTY2XzEgPT0gbnVsbCkgeworCQkJaXNvMzE2Nl8xID0gcGF0aCArIEdlbkNvbnN0YW50cy5JU08zMTY2XzFfRklMRTsKKwkJfQorCQlpZiAoaXNvMzE2Nl8yID09IG51bGwpIHsKKwkJCWlzbzMxNjZfMiA9IHBhdGggKyBHZW5Db25zdGFudHMuSVNPMzE2Nl8yX0ZJTEU7CisJCX0KKwkJaWYgKGZpeEZpbGUgPT0gbnVsbCkgeworCQkJZml4RmlsZSA9IHBhdGggKyBHZW5Db25zdGFudHMuSVNPRklYX0ZJTEU7CisJCX0KKwkJaWYgKHRhcmdldEZpbGUgPT0gbnVsbCkgeworCQkJdGFyZ2V0RmlsZSA9IHBhdGggKyBHZW5Db25zdGFudHMuQ09VTlRSWV9OQU1FUzsKKwkJfQorCQlpZiAob3V0cHV0RGlyID09IG51bGwpIHsKKwkJCW91dHB1dERpciA9IHBhdGggKyBHZW5Db25zdGFudHMuTEVYX0RJUjsKKwkJfQorCisJCXRhcmdldExpc3QgPSBudWxsOworCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2V0cyB1cCBhbmQgcnVucyB0aGlzIGdlbmVyYXRvci4KKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgY291bnRyaWVzIHdlIHdhbnQuCisJCXRhcmdldExpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QodGFyZ2V0RmlsZSk7CisKKwkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBJU08zMTY2LTEgQUxQSEEyLCBBTFBIQTMsIGFuZAorCQkvLyBudW1lcmljIGNvZGVzLgorCQljb2RlTGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdChpc28zMTY2XzEpOworCisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgbWlzc2luZyBJU08zMTY2LTIgY29kZXMKKwkJY29kZWZpeExpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QoZml4RmlsZSk7CisKKwkJLy8gTm93LCBwcm9jZXNzIGVhY2ggaXRlbSBpbiB0aGUgdGFyZ2V0IGxpc3QuCisJCXByb2Nlc3MoKTsKKworCX0KKworCS8qKgorCSAqIFByb2Nlc3Mgb3VyIGdsb2JhbCBsaXN0IG9mIHRhcmdldCBjb3VudHJpZXMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJvY2VzcygpIHsKKworCQkvLyBBIHdyaXRlciBmb3IgdGhlIG5ldyBmaWxlIHdlIGFyZSBjcmVhdGluZy4KKwkJUHJpbnRXcml0ZXIgbGV4RmlsZSA9IG51bGw7CisKKwkJLy8gT2JqZWN0IGhvbGRpbmcgSVNPMzE2Ni0xIHJlbGF0ZWQgZGF0YS4KKwkJSVNPQ29kZTEgaXNvQ29kZSA9IG51bGw7CisKKwkJLy8gTmFtZSBvZiB0aGUgbmV3IHByb3BlcnRpZXMgZmlsZS4KKwkJU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKKworCQkvLyBBIGxpc3QgZm9yIElTTyAzMTY2LTIgb2JqZWN0cworCQlMaXN0PElTT0NvZGUyPiBpc28yTGlzdCA9IG5ldyBBcnJheUxpc3Q8SVNPQ29kZTI+KCk7CisKKwkJaW50IHNpemUgPSB0YXJnZXRMaXN0LnNpemUoKTsKKworCQkvLyBJdGVyYXRlIGZvciBldmVyeSBjb3VudHJ5CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisKKwkJCS8vIEdldCB0aGUgbmV4dCBjb3VudHJ5IGluIHRoZSBsaXN0LgorCQkJU3RyaW5nIGNvdW50cnkgPSAoKFN0cmluZykgdGFyZ2V0TGlzdC5nZXQoaSkpLnRyaW0oKTsKKworCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRcdDw8PDwgUHJvY2Vzc2luZyBjb3VudHJ5IDogIiArIGNvdW50cnkgKyAiID4+Pj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCS8vIEdldCB0aGUgSVNPMzE2Ni0xIGluZm8gZm9yIHRoaXMgY291bnRyeQorCQkJaWYgKGlzb0NvZGUgPT0gbnVsbCkgeworCQkJCWlzb0NvZGUgPSBHZW5VdGlscy5nZXRJU09Db2RlKGNvdW50cnksIGNvZGVMaXN0KTsKKwkJCX0KKworCQkJaWYgKGlzbzJMaXN0ICE9IG51bGwpIHsKKwkJCQkvLyBMb2FkIHRoZSBJU08gMzE2Ni0yIG9iamVjdHMKKwkJCQlpc28yTGlzdCA9IEdlblV0aWxzLmxvYWRJU08yKGlzbzMxNjZfMiwgaXNvQ29kZS5nZXRBbHBoYTIoKSk7CisJCQl9CisKKwkJCS8vIElmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgZm9yIHRoaXMgY291bnRyeSwKKwkJCS8vIGNyZWF0ZSBpdCB1c2luZyBJU08gYWxwaGEzIGNvZGUuCisJCQlGaWxlIGNvdW50cnlEaXIgPSBuZXcgRmlsZShvdXRwdXREaXIgKyBpc29Db2RlLmdldEFscGhhMygpKTsKKworCQkJaWYgKGNvdW50cnlEaXIgIT0gbnVsbCAmJiBjb3VudHJ5RGlyLmV4aXN0cygpID09IGZhbHNlKSB7CisJCQkJLy8gRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBDcmVhdGUgaXQuCisJCQkJY291bnRyeURpci5ta2RpcigpOworCQkJfQorCisJCQkvLyBDcmVhdGUgYW5kIG9wZW4gdGhlIG91dHB1dCBmaWxlLgorCQkJaWYgKGxleEZpbGUgPT0gbnVsbCkgeworCQkJCS8vIENyZWF0ZSB0aGUgZmlsZSBuYW1lCisJCQkJZmlsZU5hbWUgPSBjb3VudHJ5RGlyICsgIlxcIiArIGlzb0NvZGUuZ2V0QWxwaGEzKCkgLy8kTk9OLU5MUy0xJAorCQkJCQkJKyAiX0FETUlOMV9MRVgudHh0IjsgLy8kTk9OLU5MUy0xJAorCQkJCS8vIENyZWF0ZSB0bmUgbmV3IGZpbGUKKwkJCQlsZXhGaWxlID0gR2VuVXRpbHMub3BlbldyaXRlcihmaWxlTmFtZSk7CisJCQl9CisKKwkJCS8vIEV4dHJhY3QgZGVzY3JpcHRvcnMgZnJvbSBJU09fTEVWRUwxX0ZJWCwgY29udmVydCB0aGVtIGludG8KKwkJCS8vIElTT0NvZGUyIGZvcm1hdCwKKwkJCS8vIGFuZCBwdXQgdGhlbSBpbnRvIGEgbGlzdC4KKwkJCUxpc3Q8SVNPQ29kZTI+IGlzb0ZpeExpc3QgPSBHZW5VdGlscy5leHRyYWN0RGVzY3JpcHRvcnMoCisJCQkJCWNvZGVmaXhMaXN0LCBpc29Db2RlKTsKKworCQkJLy8gTm93IGZpbmQgYWxsIHRoZSB1bmlxdWUgZGVzY3JpcHRvcnMgaW4gaXNvRml4RGVzY3JpcHRvcnMgYW5kCisJCQkvLyBpc28yTGlzdC4gT3JkZXIgb2YgcGFyYW1ldGVycyBtYWtlcyBhIGRpZmZlcmVuY2UgaGVyZS4gQWx3YXlzCisJCQkvLyBwYXNzIGZpcnN0IHRoZSBpc29GaXhMaXN0CisJCQlMaXN0PFN0cmluZz4gZGVzY3JpcHRvckxpc3QgPSBnZXRVbmlxdWVEZXNjcmlwdG9ycyhpc29GaXhMaXN0LAorCQkJCQlpc28yTGlzdCk7CisKKwkJCS8vIE5vdywgcnVuIHRoZSBsZXhpY29ncmFwaGljIHNvcnRlciBvbiB0aGUgc2V0IG9mIHVuaXF1ZQorCQkJLy8gZGVzY3JpcHRvcnMuCisJCQlDb2xsZWN0aW9ucy5zb3J0KGRlc2NyaXB0b3JMaXN0KTsKKworCQkJLy8gTm93LCBjcmVhdGUgYSB1bmlmaWVkIGxpc3Qgb2YgSVNPMzE2Ni0yIG9iamVjdHMgYmFzZWQgb24gdGhlCisJCQkvLyBzb3J0ZWQgZGVzY3JpcHRvcnMKKwkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRGVzY3JpcHRvcnMgYnkgbGV4aWNvZ3JhcGhpYyBvcmRlcmluZyA6ICIpOworCisJCQlpbnQgaW5kZXggPSAxOworCQkJSXRlcmF0b3IgaXQgPSBkZXNjcmlwdG9yTGlzdC5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJCVN0cmluZyBkZXNjID0gKFN0cmluZykgaXQubmV4dCgpOworCQkJCS8vIERvIGEgbG9va3VwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlc2NyaXB0b3IuCisJCQkJSVNPQ29kZTIgY3VycmVudCA9IEdlblV0aWxzLmdldElTTzJPYmplY3QoaXNvMkxpc3QsIGRlc2MpOworCisJCQkJaWYgKGN1cnJlbnQgPT0gbnVsbCkgeworCQkJCQkvLyBDb2RlIG5vdCBmb3VuZCBpbiByZWd1bGFyIGxpc3QsIGxvb2sgaW4gZml4IGxpc3QuCisJCQkJCWN1cnJlbnQgPSBHZW5VdGlscy5nZXRJU08yT2JqZWN0KGlzb0ZpeExpc3QsIGRlc2MpOworCQkJCX0KKworCQkJCUdlblV0aWxzLmFkZERhdGEobGV4RmlsZSwgU3RyaW5nLnZhbHVlT2YoaW5kZXgpICsgIjoiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCSsgY3VycmVudC5nZXRJZCgpICsgIjoiICsgY3VycmVudC5nZXRBbHBoYTIoKSArICI6IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCSsgY3VycmVudC5nZXROYW1lKCkgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCWluZGV4Kys7CisJCQl9CisKKwkJCS8vIC8vIFdlIGRvbnQgbmVlZCB0aGUgSVNPIGNvZGUgb2JqZWN0IGZvciB0aGlzIGNvdW50cnkKKwkJCS8vIC8vIGFueW1vcmUsIHdlIGFyZSBkb25lIHByb2Nlc3NpbmcgaXQuCisJCQlpc29Db2RlID0gbnVsbDsKKworCQkJaWYgKGxleEZpbGUgIT0gbnVsbCkgeworCQkJCWxleEZpbGUuY2xvc2UoKTsKKwkJCQlsZXhGaWxlID0gbnVsbDsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRHZW5lcmF0ZWQgOiAiICsgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCisJCQkJZmlsZU5hbWUgPSBudWxsOworCQkJfQorCisJCQkvLyBSdW4gZ2FyYmFnZSBjb2xsZWN0aW9uCisJCQkvL1N5c3RlbS5nYygpOworCisJCX0gLy8gZm9yCisKKwl9CisKKwkvKioKKwkgKiBGaW5kIGFsbCB1bmlxdWUgZGVzY3JpcHRvcnMgaW4gdGhlIHR3byBsaXN0cy4KKwkgKiAKKwkgKiBAcGFyYW0gbGlzdDEKKwkgKiAgICAgICAgICAgIGEgbGlzdCB3aXRoIElTTyAzMTY2LTIgY29kZXMKKwkgKiBAcGFyYW0gbGlzdDIKKwkgKiAgICAgICAgICAgIGEgZGlmZmVyZW50IGxpc3Qgd2l0aCBJU08gMzE2Ni0yIGNvZGVzCisJICogCisJICogQHJldHVybiBhIGxpc3Qgd2l0aCB1bmlxdWUgZGVzY3JpcHRvcnMuCisJICogCisJICovCisJcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBnZXRVbmlxdWVEZXNjcmlwdG9ycyhMaXN0PElTT0NvZGUyPiBsaXN0MSwKKwkJCUxpc3Q8SVNPQ29kZTI+IGxpc3QyKSB7CisKKwkJTGlzdDxTdHJpbmc+IGRlc2NyaXB0b3JTZXQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJTGlzdDxTdHJpbmc+IG5hbWVTZXQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworCQlJdGVyYXRvciBpdDEgPSBsaXN0MS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXQxLmhhc05leHQoKSkgeworCQkJSVNPQ29kZTIgY29kZSA9IChJU09Db2RlMikgaXQxLm5leHQoKTsKKwkJCWlmIChkZXNjcmlwdG9yU2V0LmNvbnRhaW5zKGNvZGUuZ2V0SWQoKSkgPT0gZmFsc2UpIHsKKwkJCQlkZXNjcmlwdG9yU2V0LmFkZChjb2RlLmdldElkKCkpOworCQkJCW5hbWVTZXQuYWRkKGNvZGUuZ2V0TmFtZSgpKTsKKwkJCX0KKwkJfQorCisJCUl0ZXJhdG9yIGl0MiA9IGxpc3QyLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdDIuaGFzTmV4dCgpKSB7CisJCQlJU09Db2RlMiBjb2RlID0gKElTT0NvZGUyKSBpdDIubmV4dCgpOworCQkJaWYgKGRlc2NyaXB0b3JTZXQuY29udGFpbnMoY29kZS5nZXRJZCgpKSA9PSBmYWxzZSkgeworCQkJCWRlc2NyaXB0b3JTZXQuYWRkKGNvZGUuZ2V0SWQoKSk7CisJCQkJbmFtZVNldC5hZGQoY29kZS5nZXROYW1lKCkpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIG5hbWVTZXQ7CisJfQorCisJLyoqCisJICogTWFpbiBleGVjdXRpb24gZW50cnkgcG9pbnQuCisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCS8vIGZpbmFsIGludCBJU09fMzE2Nl8xID0gMDsKKwkJLy8gZmluYWwgaW50IElTT18zMTY2XzIgPSAxOworCQkvLyBmaW5hbCBpbnQgRklYX0ZJTEUgPSAyOworCQkvLyBmaW5hbCBpbnQgVEFSR0VUX0xJU1QgPSAzOworCQkvLyBmaW5hbCBpbnQgT1VUUFVUX0RJUiA9IDQ7CisJCS8vIGZpbmFsIGludCBQQVJBTVMgPSA1OworCQkvLworCQkvLyBpZiAoYXJncy5sZW5ndGggPCBQQVJBTVMpIHsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLVdyb25nIGFyZ3VtZW50cy0tIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dAorCQkvLyAucHJpbnRsbigiXHRUbyBydW4sIHBsZWFzZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIDogIik7CisJCS8vIC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IElTTyAzMTY2LTEgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBJU08gMzE2Ni0yIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgSVNPIGZpeCBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IFRhcmdldCBjb3VudHJpZXMgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBPdXRwdXQgZGlyZWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gcmV0dXJuOworCQkvLyB9CisJCS8vCisJCS8vIEFkbWluMUxleFNvcnRlciBzb3J0ZXIgPSBuZXcgQWRtaW4xTGV4U29ydGVyKGFyZ3NbSVNPXzMxNjZfMV0sCisJCS8vIGFyZ3NbSVNPXzMxNjZfMl0sIGFyZ3NbRklYX0ZJTEVdLCBhcmdzW1RBUkdFVF9MSVNUXSwKKwkJLy8gYXJnc1tPVVRQVVRfRElSXSk7CisKKwkJZmluYWwgaW50IENPTkZJR19GSUxFID0gMDsKKwkJZmluYWwgaW50IFBBUkFNUyA9IDE7CisKKwkJaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQtLVdyb25nIGFyZ3VtZW50cy0tIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQKKwkJCQkJLnByaW50bG4oIlx0XHRUbyBydW4sIHBsZWFzZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnQocykgOiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHQgQ29uZmlndXJhdGlvbiBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5leGl0KDEpOworCQl9CisKKwkJQWRtaW4xTGV4U29ydGVyIHNvcnRlciA9IG5ldyBBZG1pbjFMZXhTb3J0ZXIoYXJnc1tDT05GSUdfRklMRV0pOworCisJCXNvcnRlci5ydW4oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvQWRtaW4yTGV4U29ydGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0FkbWluMkxleFNvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MjFjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0FkbWluMkxleFNvcnRlci5qYXZhCkBAIC0wLDAgKzEsNDk1IEBACisvKioKKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBTVEVNIElJIERhdGEgTWlncmF0aW9uL0dlbmVyYXRpb24gVXRpbGl0aWVzIDogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3Mgc29ydAorICogYWxsIGxldmVsIDEgSVNPMzE2Ni0yIGRlc2NyaXB0b3JzLiBUbyBkbyBzbywgZmlyc3QgaXQgZXh0cmFjdHMgYWxsIHRoZQorICogSVNPMzE2Ni0yIGRlc2NyaXB0b3JzIHdlIGhhdmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGZvbGxvd2luZyB0d28gZmlsZXM6CisgKiBJU08zMTY2XzJfbGlzdC50eHQgYW5kIElTT19MRVZFTDFfRklYLnR4dC4gVGhlIG91dHB1dCBpcyB3cml0dGVuIGludG8gYQorICogc2VtaWNvbG9uIHNlcGFyYXRlZCBmb3JtYXQgb2YgdGhlIGZvcm06CisgKiAKKyAqIENPVU5UUlk6QUxQSEEyOlhYLVlZOk5BTUU6SU5ERVgKKyAqIAorICogVGhpcyBvdXRwdXQgd2lsbCBiZSB1c2VkIGR1cmluZyBnZW5lcmF0aW9uIG9mIHRoZSBsZXZlbCAyIGRlc2NyaXB0b3JzIGFuZAorICogZHVyaW5nIGdlbmVyYXRpb24gb2YgdGhlIHJlbGF0aW9uc2hpcCBmaWxlcy4KKyAqIAorICogVG8gY29uZmlndXJlLCBzZWUgY29uZmlndXJhdGlvbiBmaWxlIDoKKyAqIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL0FkbWluMkxleFNvcnRlci5jb25maWcKKyAqIAorICogCisgKiBUbyBydW4sIGFkZCBwYXRoIHRvIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiB0aGUgcnVuIHByb2ZpbGUgKGkuZS4KKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcY29uZmlndXJhdGlvblxBZG1pbjJMZXhTb3J0ZXIuY29uZmlnKQorICogCisgKiAKKyAqLworcHVibGljIGNsYXNzIEFkbWluMkxleFNvcnRlciB7CisKKwkvKioKKwkgKiBPdXIgc291cmNlIGZpbGVzIGZvciBJU08gMzE2Ni0xIGNvZGVzIGFuZCBmb3IgdGhlIGxpc3Qgb2YgdGFyZ2V0CisJICogY291bnRyaWVzLgorCSAqLworCXByaXZhdGUgU3RyaW5nIGlzbzMxNjZfMSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyB0YXJnZXRGaWxlID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIG91dHB1dERpciA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyB3b3Jrc3BhY2UgPSBudWxsOworCisJLyoqCisJICogTGlzdCBmb3IgSVNPIDMxNjYtMSBjb2RlcyBhbmQgdGFyZ2V0IGNvdW50cmllcy4KKwkgKi8KKworCUxpc3QgdGFyZ2V0TGlzdCA9IG51bGw7CisKKwlMaXN0IGNvZGVMaXN0ID0gbnVsbDsKKworCS8qKgorCSAqIEhhc2ggbWFwIGZvciBkZWFsaW5nIHdpdGgKKwkgKi8KKwlIYXNoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBhZG1pbkRhdGEgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gaXNvMzE2Nl8xIC0KKwkgKiAgICAgICAgICAgIGRhdGEgZmlsZSB3aXRoIHRoZSBJU08zMTY2LTEgQUxQSEFfMiBhbmQgQUxQSEFfMyBjb2Rlcy4KKwkgKiBAcGFyYW0gdGFyZ2V0RmlsZSAtCisJICogICAgICAgICAgICBkYXRhIGZpbGUgd2hlcmUgd2UgZmluZCBhIGxpc3Qgb2YgY291bnRyaWVzIGZvciBnZW5lcmF0aW9uIG9mCisJICogICAgICAgICAgICB0aGVpciBjb3JyZXNwb25kaW5nIGFyZWEucHJvcGVydGllcyBmaWxlcy4KKwkgKiBAcGFyYW0gb3V0cHV0RGlyIC0KKwkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGUgZmlsZXMgZ2VuZXJhdGVkLgorCSAqIAorCSAqLworCS8vIHB1YmxpYyBBZG1pbjJMZXhTb3J0ZXIoU3RyaW5nIGlzbzMxNjZfMSwgU3RyaW5nIHRhcmdldEZpbGUsIFN0cmluZworCS8vIG91dHB1dERpcikgeworCS8vIC8vIFNldCB2YWx1ZXMgb2YgZ2xvYmFsIHZhcmlhYmxlcy4KKwkvLyB0aGlzLmlzbzMxNjZfMSA9IGlzbzMxNjZfMTsKKwkvLyB0aGlzLnRhcmdldEZpbGUgPSB0YXJnZXRGaWxlOworCS8vIHRoaXMub3V0cHV0RGlyID0gb3V0cHV0RGlyOworCS8vIHRhcmdldExpc3QgPSBudWxsOworCS8vIGFkbWluRGF0YSA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PigpOworCS8vIH0KKworCS8qKgorCSAqIEBwYXJhbSBjb25maWdGaWxlCisJICovCisJcHVibGljIEFkbWluMkxleFNvcnRlcihTdHJpbmcgY29uZmlnRmlsZSkgeworCisJCS8vIExvYWQgYWxsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCisJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHZhcnMgPSBHZW5VdGlscy5sb2FkQ29uZmlnRmlsZShjb25maWdGaWxlKTsKKworCQlTZXQ8U3RyaW5nPiBrZXlzID0gdmFycy5rZXlTZXQoKTsKKwkJSXRlcmF0b3IgaXQgPSBrZXlzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyB2YXIgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisKKwkJCS8vIEFzc2lnbiB2YWx1ZXMgdG8gY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgOgorCQkJaWYgKHZhci5lcXVhbHMoIldPUktTUEFDRSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl3b3Jrc3BhY2UgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJJU08zMTY2XzEiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJaXNvMzE2Nl8xID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiVEFSR0VUX0xJU1QiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJdGFyZ2V0RmlsZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIlBST1BFUlRJRVNfT1VUUFVUIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCW91dHB1dERpciA9IHZhcnMuZ2V0KHZhcik7CisJCQl9CisKKwkJfSAvLyB3aGlsZQorCisJCS8vIFRoZSB3b3Jrc3BhY2UgdmFyaWFibGUgc2hvdWxkIGVuZCB3aXRoIGEgc2xhc2ggY2hhcmFjdGVyCisJCWlmICh3b3Jrc3BhY2UuZW5kc1dpdGgoIlxcIikgPT0gZmFsc2UpIHsgLy8kTk9OLU5MUy0xJAorCQkJd29ya3NwYWNlICs9ICJcXCI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCVN0cmluZyBwYXRoID0gd29ya3NwYWNlICsgR2VuQ29uc3RhbnRzLlBBUkFNU19ESVI7CisKKwkJLy8gU2V0IHJlbWFpbmluZyBjb25maWcgdmFycyB1c2luZyBXT1JLU1BBQ0UgKHdvcmtzcGFjZSByZWxhdGl2ZSkKKwkJaWYgKGlzbzMxNjZfMSA9PSBudWxsKSB7CisJCQlpc28zMTY2XzEgPSBwYXRoICsgR2VuQ29uc3RhbnRzLklTTzMxNjZfMV9GSUxFOworCQl9CisJCWlmICh0YXJnZXRGaWxlID09IG51bGwpIHsKKwkJCXRhcmdldEZpbGUgPSBwYXRoICsgR2VuQ29uc3RhbnRzLkNPVU5UUklFU19MSVNUOworCQl9CisJCWlmIChvdXRwdXREaXIgPT0gbnVsbCkgeworCQkJb3V0cHV0RGlyID0gcGF0aCArIEdlbkNvbnN0YW50cy5MRVhfRElSOworCQl9CisKKwkJdGFyZ2V0TGlzdCA9IG51bGw7CisJCWFkbWluRGF0YSA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PigpOworCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2V0cyB1cCBhbmQgcnVucyB0aGlzIGdlbmVyYXRvci4KKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgY291bnRyaWVzIHdlIHdhbnQuCisJCXRhcmdldExpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QodGFyZ2V0RmlsZSk7CisKKwkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBJU08zMTY2LTEgQUxQSEEyLCBBTFBIQTMsIGFuZAorCQkvLyBudW1lcmljIGNvZGVzLgorCQljb2RlTGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdChpc28zMTY2XzEpOworCisJCS8vIENvbGxlY3QgYWxsIGxldmVsIDIgZGF0YSwgc29ydCBpdCBhbmQgc3RvcmUgdGhlIHJlc3VsdC4KKwkJcHJvY2VzcygpOworCisJCS8vIE5vdywgcHJpbnQgdGhlIHJlc3VsdC4KKwkJcHJpbnRTb3J0ZWRTZXF1ZW5jZXMoKTsKKworCX0KKworCS8qKgorCSAqIENvbGxlY3QgYWxsIGxldmVsIDIgYWRtaW5pc3RyYXRpb24gZGF0YSBhbmQgaXRzIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcAorCSAqIHRvIGxldmVsIDEgZGF0YS4gU29ydCB0aGUgY29sbGVjdGlvbnMgbGV4aWNvZ3JhcGhpY2FsbHkgYW5kIHN0b3JlIHRoZQorCSAqIHJlc3VsdCBmb3IgZWFjaCBjb3VudHJ5LgorCSAqIAorCSAqLworCXByb3RlY3RlZCB2b2lkIHByb2Nlc3MoKSB7CisKKwkJLy8gQSB3cml0ZXIgZm9yIHRoZSBuZXcgZmlsZSB3ZSBhcmUgY3JlYXRpbmcuCisJCVByaW50V3JpdGVyIGxleEZpbGUgPSBudWxsOworCisJCS8vIE9iamVjdCBob2xkaW5nIElTTzMxNjYtMSByZWxhdGVkIGRhdGEuCisJCUlTT0NvZGUxIGlzb0NvZGUgPSBudWxsOworCisJCS8vIE5hbWUgb2YgdGhlIG5ldyBwcm9wZXJ0aWVzIGZpbGUuCisJCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7CisKKwkJaW50IHNpemUgPSB0YXJnZXRMaXN0LnNpemUoKTsKKworCQkvLyBGb3IgZXZlcnkgY291bnRyeQorCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCisJCQkvLyBHZXQgdGhlIG5leHQgY291bnRyeSBpbiB0aGUgbGlzdC4KKwkJCVN0cmluZyBmaWxlID0gKChTdHJpbmcpIHRhcmdldExpc3QuZ2V0KGkpKS50cmltKCk7CisKKwkJCS8vIEdldCB0aGUgbGV2ZWwgMiBkYXRhIHdlIG5lZWQgOgorCQkJU3RyaW5nIGFkbWluMSA9IG51bGw7CisJCQlTdHJpbmcgYWRtaW4yID0gbnVsbDsKKworCQkJLy8gQW4gaW5kZXggZm9yIHVua253b24gb3Igbi5hLiBlbnRyaWVzCisJCQlpbnQgdW5rQ291bnRlciA9IDE7CisKKwkJCS8vIE9wZW4gdGhlIGRhdGEgc291cmNlIGZpbGUgZm9yIHRoaXMgY291bnRyeS4KKwkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IEdlblV0aWxzLm9wZW5SZWFkZXIoZmlsZSk7CisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJcdFx0PDw8PCBQcm9jZXNzaW5nIGNvdW50cnkgOiAiICsgZmlsZSArICIgPj4+PiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCXRyeSB7CisKKwkJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKKworCQkJCQlTdHJpbmcgYnVmZmVyID0gbnVsbDsKKwkJCQkJLy8gRGVzY3JpYmVzIGxldmVsCisJCQkJCS8vIG9mIGRhdGEgd2UKKwkJCQkJLy8gYXJlIG5vdyBwcm9jZXNzaW5nIDogTEVWRUwwLCBMRVZFTDEsIG9yIExFVkVMMi4KKwkJCQkJaW50IGxldmVsID0gLTE7CisJCQkJCS8vIFJlY29yZCB0aGUgcHJldmlvdXMgbGV2ZWwuCisJCQkJCWludCBvbGRsZXZlbCA9IGxldmVsIC0gMTsKKwkJCQkJLy8gV2UgdGFrZSBhIGNodW5rIG9mIHRoZSBkYXRhIFtCVUZGRVJfTUlOLEJVRkZFUl9NQVhdIHRvCisJCQkJCS8vIG1ha2UgcHJvY2Vzc2luZyBtb3JlCisJCQkJCS8vIGVmZmljaWVudCwgd2UgZG9udCBuZWVkIGFsbCBvZiBpdC4KKwkJCQkJaW50IEJVRkZFUl9NSU4gPSAwOworCQkJCQlpbnQgQlVGRkVSX01BWCA9IDEyMDsKKworCQkJCQlMaXN0PFN0cmluZz4gZW50cnlMaXN0ID0gbnVsbDsKKworCQkJCQl3aGlsZSAoR2VuVXRpbHMuRU9GKGJ1ZmZlciA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSB0cnVlKSB7CisKKwkJCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlIG1hcmsgYWxsIHVua25vd24gZGF0YS4KKwkJCQkJCWJ1ZmZlciA9IGJ1ZmZlci5yZXBsYWNlKCIsLCIsICIsVU5LTk9XTiwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQkJCVN0cmluZ1tdIGl0ZW1zID0gR2VuVXRpbHMKKwkJCQkJCQkJLmV4dHJhY3QoYnVmZmVyLmxlbmd0aCgpIDwgQlVGRkVSX01BWCA/IGJ1ZmZlcgorCQkJCQkJCQkJCTogYnVmZmVyLnN1YnN0cmluZyhCVUZGRVJfTUlOLAorCQkJCQkJCQkJCQkJQlVGRkVSX01BWCkpOworCisJCQkJCQkvLyBHZXQgdGhlIElTTzMxNjYtMSBpbmZvIGZvciB0aGlzIGNvdW50cnkKKwkJCQkJCWlmIChpc29Db2RlID09IG51bGwpIHsKKwkJCQkJCQlpc29Db2RlID0gR2VuVXRpbHMuZ2V0SVNPQ29kZSgKKwkJCQkJCQkJCWl0ZW1zW0lTT0RhdGEuQ09VTlRSWV9OQU1FXSwgY29kZUxpc3QpOworCQkJCQkJfQorCisJCQkJCQkvLyBHZXQgdGhlIGxldmVsIG9mIHRoZSBkYXRhIHdlIGFyZSBwcm9jZXNzaW5nLgorCQkJCQkJbGV2ZWwgPSBHZW5VdGlscy5nZXREYXRhTGV2ZWwoaXRlbXMpOworCisJCQkJCQkvLyBJZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IGZvciB0aGlzIGNvdW50cnksCisJCQkJCQkvLyBjcmVhdGUgaXQgdXNpbmcgSVNPIGFscGhhMyBjb2RlLgorCQkJCQkJRmlsZSBjb3VudHJ5RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyCisJCQkJCQkJCSsgaXNvQ29kZS5nZXRBbHBoYTMoKSk7CisKKwkJCQkJCWlmIChjb3VudHJ5RGlyICE9IG51bGwgJiYgY291bnRyeURpci5leGlzdHMoKSA9PSBmYWxzZSkgeworCQkJCQkJCS8vIERpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gQ3JlYXRlIGl0LgorCQkJCQkJCWNvdW50cnlEaXIubWtkaXIoKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gQ3JlYXRlIGFuZCBvcGVuIHRoZSBuZXcgZmlsZS4KKwkJCQkJCWlmIChsZXhGaWxlID09IG51bGwpIHsKKwkJCQkJCQkvLyBDcmVhdGUgdGhlIGZpbGUgbmFtZQorCQkJCQkJCWZpbGVOYW1lID0gY291bnRyeURpciArICJcXCIgKyBpc29Db2RlLmdldEFscGhhMygpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCSsgIl9BRE1JTjJfTEVYLnR4dCI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkvLyBDcmVhdGUgdG5lIG5ldyBmaWxlCisJCQkJCQkJbGV4RmlsZSA9IEdlblV0aWxzLm9wZW5Xcml0ZXIoZmlsZU5hbWUpOworCQkJCQkJfQorCisJCQkJCQkvLyBUaGlzIHZhcmlhYmxlIGluZGljYXRlcyBhIHRyYW5zaXRpb24gaW4gb3VyIGRhdGEKKwkJCQkJCS8vIHByb2Nlc3NpbmcKKwkJCQkJCWJvb2xlYW4gdHJhbnNpdGlvbiA9IChsZXZlbCAhPSBvbGRsZXZlbCkgPyB0cnVlIDogZmFsc2U7CisKKwkJCQkJCS8vIFdlIGhhdmUgc3dpdGNoZWQgdG8gYSBkaWZmZXJlbnQgZGF0YSBsZXZlbCAoaSxlLAorCQkJCQkJLy8gYWRtaW4gMCB0byBhZG1pbiAxKQorCQkJCQkJaWYgKHRyYW5zaXRpb24gPT0gdHJ1ZSkgeworCQkJCQkJCW9sZGxldmVsID0gbGV2ZWw7CisJCQkJCQkJLy8gUmVzZXQgb3VyIHJlcGVhdGVkIGhpc3RvcnkKKwkJCQkJCQkvLyByZXBlYXRlZEVudHJpZXMgPSBuZXcgU3RyaW5nKCk7CisJCQkJCQkJZW50cnlMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQkJCQl9CisKKwkJCQkJCS8vIElnbm9yZSBhbGwgZGF0YSB0aGF0IGlzIG5vdCBsZXZlbCAyLgorCQkJCQkJaWYgKGxldmVsID09IERhdGFUeXBlcy5MRVZFTF8wCisJCQkJCQkJCXx8IGxldmVsID09IERhdGFUeXBlcy5MRVZFTF8xKSB7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisKKwkJCQkJCS8vIEdldCB0aGUgbGV2ZWwgMiBkYXRhIHdlIG5lZWQgOgorCQkJCQkJYWRtaW4xID0gaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV07CisJCQkJCQlhZG1pbjIgPSBpdGVtc1tJU09EYXRhLkFETUlOMl9OQU1FXTsKKworCQkJCQkJLy8gSWYgZW50aXR5IGlzIFVOS09XTiBvciBOLkEuIGhhbmRsZSBpdCBwcm9wZXJseS4KKwkJCQkJCWlmIChhZG1pbjIuZXF1YWxzKCJVTktOT1dOIikgfHwgYWRtaW4yLmVxdWFscygiTi5BLiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCWFkbWluMiA9IGlzb0NvZGUuZ2V0QWxwaGEzKCkgKyAiLkwyLiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJKyBTdHJpbmcudmFsdWVPZih1bmtDb3VudGVyKyspOworCQkJCQkJfQorCisJCQkJCQkvLyBNYWtlIHN1cmUgdGhpcyBpcyBub3QgYSByZXBlYXRlZCBlbnRyeS4KKwkJCQkJCWlmIChHZW5VdGlscy5pc1JlcGVhdGVkKGFkbWluMSArIGFkbWluMiwgZW50cnlMaXN0KSA9PSB0cnVlKSB7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisKKwkJCQkJCS8vIFJlbWVtYmVyIHRoaXMgZW50aXR5IHRvIGF2b2lkIGR1cGxpY2F0ZXMuCisJCQkJCQllbnRyeUxpc3QuYWRkKGFkbWluMSArIGFkbWluMik7CisKKwkJCQkJCWlmIChhZG1pbkRhdGEuZ2V0KGFkbWluMSkgPT0gbnVsbCkgeworCQkJCQkJCS8vIENyZWF0ZSBhIG5ldyBBcnJheUxpc3Qgb2YgYWRtaW5pc3RyYXRpb24gMgorCQkJCQkJCS8vIG9iamVjdHMgZm9yIGV2ZXJ5IGxldmVsIDEgbG9jYXRpb24uCisJCQkJCQkJTGlzdDxTdHJpbmc+IGFkbWluMkxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCQkJCQlhZG1pbjJMaXN0LmFkZChhZG1pbjIpOworCQkJCQkJCWFkbWluRGF0YS5wdXQoYWRtaW4xLCBhZG1pbjJMaXN0KTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJTGlzdDxTdHJpbmc+IGFkbWluMkxpc3QgPSBhZG1pbkRhdGEuZ2V0KGFkbWluMSk7CisJCQkJCQkJaWYgKGFkbWluMkxpc3QgPT0gbnVsbCkgeworCQkJCQkJCQlhZG1pbjJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQkJCQkJfQorCQkJCQkJCWFkbWluMkxpc3QuYWRkKGFkbWluMik7CisJCQkJCQkJYWRtaW5EYXRhLnB1dChhZG1pbjEsIGFkbWluMkxpc3QpOworCQkJCQkJfQorCisJCQkJCX0vLyB3aGlsZQorCisJCQkJCWlmIChhZG1pbkRhdGEgPT0gbnVsbCkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKworCQkJCQlTZXQ8U3RyaW5nPiBrZXlzID0gYWRtaW5EYXRhLmtleVNldCgpOworCQkJCQlJdGVyYXRvciBpdCA9IGtleXMuaXRlcmF0b3IoKTsKKworCQkJCQkvLyBTb3J0IGV2ZXJ5IGxpc3QuCisJCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCQkJCUxpc3Q8U3RyaW5nPiBhZG1pbjJMaXN0ID0gYWRtaW5EYXRhLmdldChpdC5uZXh0KCkpOworCQkJCQkJQ29sbGVjdGlvbnMuc29ydChhZG1pbjJMaXN0KTsKKwkJCQkJfQorCisJCQkJCVN5c3RlbS5vdXQKKwkJCQkJCQkucHJpbnRsbigiXHRcdERlc2NyaXB0b3JzIGJ5IGxleGljb2dyYXBoaWMgb3JkZXJpbmcgOiAiKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJCVNldDxTdHJpbmc+IGtleXNldCA9IGFkbWluRGF0YS5rZXlTZXQoKTsKKwkJCQkJSXRlcmF0b3IgaXQxID0ga2V5c2V0Lml0ZXJhdG9yKCk7CisKKwkJCQkJd2hpbGUgKGl0MS5oYXNOZXh0KCkpIHsKKworCQkJCQkJYWRtaW4xID0gKFN0cmluZykgaXQxLm5leHQoKTsKKworCQkJCQkJLy8gYWRtaW4xIGlzIHRoZSBrZXkgaW4gb3VyIEhhc2hNYXAuCisJCQkJCQlMaXN0PFN0cmluZz4gYWRtaW4yTGlzdCA9IGFkbWluRGF0YS5nZXQoYWRtaW4xKTsKKworCQkJCQkJSXRlcmF0b3IgaXQyID0gYWRtaW4yTGlzdC5pdGVyYXRvcigpOworCisJCQkJCQlpbnQgaW5kZXggPSAxOworCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRBZG1pbiAxID0gIiArIGFkbWluMSk7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJd2hpbGUgKGl0Mi5oYXNOZXh0KCkpIHsKKworCQkJCQkJCWFkbWluMiA9IChTdHJpbmcpIGl0Mi5uZXh0KCk7CisJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0QXQgOiAiICsgaW5kZXggLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJKyAiIC0tIGFkbWluMiBpcyA6ICIgKyBhZG1pbjIpOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCQlHZW5VdGlscy5hZGREYXRhKGxleEZpbGUsIFN0cmluZy52YWx1ZU9mKGluZGV4KQorCQkJCQkJCQkJKyAiOiIgKyBpc29Db2RlLmdldEFscGhhMigpICsgIjoiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCQkJKyBpc29Db2RlLmdldEFscGhhMygpICsgIjoiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCSsgaXNvQ29kZS5nZXROYW1lKCkgKyAiOiIgKyBhZG1pbjEgKyAiOiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJCQkrIGFkbWluMiArICJcbiIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJaW5kZXgrKzsKKworCQkJCQkJfQorCisJCQkJCX0KKworCQkJCQlhZG1pbkRhdGEuY2xlYXIoKTsKKworCQkJCQkvLyBXZSBkb250IG5lZWQgdGhlIElTTyBjb2RlIG9iamVjdCBmb3IgdGhpcyBjb3VudHJ5CisJCQkJCS8vIGFueW1vcmUsIHdlIGFyZSBkb25lIHByb2Nlc3NpbmcgaXQuCisJCQkJCWlzb0NvZGUgPSBudWxsOworCisJCQkJCS8vIENsb3NlIGFsbCBvcGVuIHJlc291cmNlcy4KKwkJCQkJcmVhZGVyLmNsb3NlKCk7CisKKwkJCQkJaWYgKGxleEZpbGUgIT0gbnVsbCkgeworCQkJCQkJbGV4RmlsZS5jbG9zZSgpOworCQkJCQkJbGV4RmlsZSA9IG51bGw7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRHZW5lcmF0ZWQgOiAiICsgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCisJCQkJCQlmaWxlTmFtZSA9IG51bGw7CisJCQkJCX0KKworCQkJCQkvLyBSdW4gZ2FyYmFnZSBjb2xsZWN0aW9uCisJCQkJCS8vU3lzdGVtLmdjKCk7CisJCQkJfQorCisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKworCQl9IC8vIGZvcgorCisJfQorCisJLyoqCisJICogQ29sbGVjdCBhbGwgbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbiBkYXRhLCBzb3J0IGl0IGxleGljb2dyYXBoaWNhbGx5IGFuZAorCSAqIHN0b3JlIHRoZSByZXN1bHQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJpbnRTb3J0ZWRTZXF1ZW5jZXMoKSB7CisKKwkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0RGVzY3JpcHRvcnMgYnkgbGV4aWNvZ3JhcGhpYyBvcmRlcmluZyA6ICIpOyAvLyROT04tTkxTLTEkCisKKwkJaWYgKGFkbWluRGF0YSA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU2V0PFN0cmluZz4ga2V5cyA9IGFkbWluRGF0YS5rZXlTZXQoKTsKKwkJSXRlcmF0b3IgaXQxID0ga2V5cy5pdGVyYXRvcigpOworCisJCXdoaWxlIChpdDEuaGFzTmV4dCgpKSB7CisKKwkJCVN0cmluZyBhZG1pbjEgPSAoU3RyaW5nKSBpdDEubmV4dCgpOworCisJCQlMaXN0PFN0cmluZz4gYWRtaW4yTGlzdCA9IGFkbWluRGF0YS5nZXQoYWRtaW4xKTsKKworCQkJSXRlcmF0b3IgaXQyID0gYWRtaW4yTGlzdC5pdGVyYXRvcigpOworCisJCQlpbnQgaW5kZXggPSAxOworCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRBZG1pbiAxID0gIiArIGFkbWluMSk7IC8vJE5PTi1OTFMtMSQKKworCQkJd2hpbGUgKGl0Mi5oYXNOZXh0KCkpIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRBdCA6ICIgKyBpbmRleCsrICsgIiAtLSBhZG1pbjIgaXMgOiAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJKyBpdDIubmV4dCgpKTsKKwkJCX0KKworCQl9CisKKwl9CisKKwkvKioKKwkgKiBGaW5kIGFuIGVudHJ5IGluIHRoZSBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgbGlzdCBhbmQgZ2V0IGl0cyBpbmRleC4KKwkgKiAKKwkgKiBAcGFyYW0gbGlzdAorCSAqICAgICAgICAgICAgYSBsaXN0IG9mIHN0cmluZ3MuCisJICogQHBhcmFtIGVudHJ5CisJICogICAgICAgICAgICB0aGUgZW50cnkgd2Ugd2FudCB0byBmaW5kIGluIHRoZSBsaXN0LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBlbnRyeSBpbiB0aGUgc29ydGVkIGxpc3QgKGlmIGZvdW5kKS4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGluZGV4TG9va3VwKExpc3Q8U3RyaW5nPiBsaXN0LCBTdHJpbmcgZW50cnkpIHsKKworCQlpbnQgaW5kZXggPSAxOworCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKKworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgY3VycmVudCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKwkJCWlmIChjdXJyZW50LnRvVXBwZXJDYXNlKCkuZXF1YWxzKGVudHJ5LnRvVXBwZXJDYXNlKCkpKSB7CisJCQkJcmV0dXJuIGluZGV4OworCQkJfQorCQkJaW5kZXgrKzsKKwkJfQorCQkvLyBOb3QgZm91bmQuCisJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdGluZGV4TG9va3VwIDogZW50cnkgbm90IGZvdW5kIGZvciAiICsgZW50cnkpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiAtMTsKKwl9CisKKwkvKioKKwkgKiBNYWluIGV4ZWN1dGlvbiBlbnRyeSBwb2ludC4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJLy8gZmluYWwgaW50IElTT18zMTY2XzEgPSAwOworCQkvLyBmaW5hbCBpbnQgVEFSR0VUX0xJU1QgPSAxOworCQkvLyBmaW5hbCBpbnQgT1VUUFVUX0RJUiA9IDI7CisJCS8vIGZpbmFsIGludCBQQVJBTVMgPSAzOworCQkvLworCQkvLyBpZiAoYXJncy5sZW5ndGggPCBQQVJBTVMpIHsKKwkJLy8KKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLVdyb25nIGFyZ3VtZW50cy0tIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dAorCQkvLyAucHJpbnRsbigiXHRUbyBydW4sIHBsZWFzZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIDogIik7CisJCS8vIC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IElTTyAzMTY2LTEgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBUYXJnZXQgY291bnRyaWVzIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgT3V0cHV0IGRpcmVjdG9yeSIpOyAvLyROT04tTkxTLTEkCisJCS8vIHJldHVybjsKKwkJLy8gfQorCQkvLworCQkvLyBBZG1pbjJMZXhTb3J0ZXIgc29ydGVyID0gbmV3IEFkbWluMkxleFNvcnRlcihhcmdzW0lTT18zMTY2XzFdLAorCQkvLyBhcmdzW1RBUkdFVF9MSVNUXSwgYXJnc1tPVVRQVVRfRElSXSk7CisJCS8vIHNvcnRlci5ydW4oKTsKKworCQlmaW5hbCBpbnQgQ09ORklHX0ZJTEUgPSAwOworCQlmaW5hbCBpbnQgUEFSQU1TID0gMTsKKworCQlpZiAoYXJncy5sZW5ndGggPCBQQVJBTVMpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdC0tV3JvbmcgYXJndW1lbnRzLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRcdFRvIHJ1biwgcGxlYXNlIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhcmd1bWVudChzKSA6ICIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdCBDb25maWd1cmF0aW9uIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLmV4aXQoMSk7CisJCX0KKworCQlBZG1pbjJMZXhTb3J0ZXIgc29ydGVyID0gbmV3IEFkbWluMkxleFNvcnRlcihhcmdzW0NPTkZJR19GSUxFXSk7CisKKwkJc29ydGVyLnJ1bigpOworCisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0FpckFycml2YWxEZXBhcnR1cmVBbmFseXplci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9BaXJBcnJpdmFsRGVwYXJ0dXJlQW5hbHl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzUxZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9BaXJBcnJpdmFsRGVwYXJ0dXJlQW5hbHl6ZXIuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorIHBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7CisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICAqCisgICogQ29udHJpYnV0b3JzOgorICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgQWlyQXJyaXZhbERlcGFydHVyZUFuYWx5emVyIHsKKwkKKwlzdGF0aWMgU3RyaW5nIExTID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncyh7ICJubHMiIH0pCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKKwkJaWYoYXJncy5sZW5ndGggPCAxKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlVzYWdlOiBBaXJUcmFuc3BvcnRHZW5lcmF0b3IgPGlucHV0IC5jc3YgZmlsZT4iKTsKKwkJCVN5c3RlbS5leGl0KC0xKTsKKwkJfQorCQkKKwkJdHJ5IHsKKwkJU3RyaW5nIGlucHV0RmlsZSA9IGFyZ3NbMF07CisJCQorCQlGaWxlIGNzdmZpbGUgPSBuZXcgRmlsZShpbnB1dEZpbGUpOworCQlpZighY3N2ZmlsZS5leGlzdHMoKSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciwgIitpbnB1dEZpbGUrIiBkb2Vzbid0IGV4aXN0Iik7CisJCQlTeXN0ZW0uZXhpdCgtMSk7CisJCX0KKwkJCisJCQorCQlCdWZmZXJlZFJlYWRlciBpcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGNzdmZpbGUpKSk7CisJCSAgIAorCQlGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIoaW5wdXRGaWxlKyIub3V0LmNzdiIpOworCQkJCisJCUhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBuYXRpb25hbEFycml2YWxzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworCQlIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gbmF0aW9uYWxEZXBhcnR1cmVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworCQlIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc3RhdGVUcmlwcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKwkJCisJCVN0cmluZyBsaW5lOworCQlsaW5lID0gaXJlYWRlci5yZWFkTGluZSgpOyAvL3NraXAgZmlyc3QgaGVhZGVyIHJvdworCQl3aGlsZSgobGluZT1pcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsgICAgCQkKKwkJICAJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluZSwiLCIpOworCQkgIAkJU3RyaW5nIGRlcGFydHVyZUlkICA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKKwkJICAJCVN0cmluZyBhcnJpdmFsSWQgPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7CisJCSAgCQlpbnQgcG9wdWxhdGlvbjEgPSBJbnRlZ2VyLnBhcnNlSW50KHN0Lm5leHRUb2tlbigpLnRyaW0oKSk7CisJCSAgCQlpbnQgcG9wdWxhdGlvbjIgPSBJbnRlZ2VyLnBhcnNlSW50KHN0Lm5leHRUb2tlbigpLnRyaW0oKSk7CisJCSAgCQlkb3VibGUgZmxpZ2h0dGltZSA9IERvdWJsZS5wYXJzZURvdWJsZShzdC5uZXh0VG9rZW4oKS50cmltKCkpOworCQkgIAkJZG91YmxlIGRpc3RhbmNlID0gRG91YmxlLnBhcnNlRG91YmxlKHN0Lm5leHRUb2tlbigpLnRyaW0oKSk7CisJCSAgCQlpbnQgdHJhdmVsbGVycyA9IEludGVnZXIucGFyc2VJbnQoc3QubmV4dFRva2VuKCkudHJpbSgpKTsKKwkJICAJCQorCQkgIAkJU3RyaW5nIGRlcGFydHVyZVN0YXRlID0gZGVwYXJ0dXJlSWQuc3Vic3RyaW5nKDAsIDUpOworCQkgIAkJU3RyaW5nIGFycml2YWxTdGF0ZSA9IGFycml2YWxJZC5zdWJzdHJpbmcoMCwgNSk7CisJCSAgCQkKKwkJICAJCWlmKGRlcGFydHVyZVN0YXRlLmVxdWFscyhhcnJpdmFsU3RhdGUpKSB7CisJCSAgCQkJLy8gVHJhdmVsIHdpdGhpbiBhIHN0YXRlCisJCSAgCQkJaWYoc3RhdGVUcmlwcy5jb250YWluc0tleShkZXBhcnR1cmVTdGF0ZSkpIAorCQkgIAkJCQlzdGF0ZVRyaXBzLnB1dChkZXBhcnR1cmVTdGF0ZSwgc3RhdGVUcmlwcy5nZXQoZGVwYXJ0dXJlU3RhdGUpICsgdHJhdmVsbGVycyk7CisJCSAgCQkJZWxzZQorCQkgIAkJCQlzdGF0ZVRyaXBzLnB1dChkZXBhcnR1cmVTdGF0ZSwgdHJhdmVsbGVycyk7CisJCSAgCQl9IGVsc2UgeworCQkgIAkJCS8vIFRyYXZlbCBzdGF0ZSB0byBhbm90aGVyIHN0YXRlCisJCSAgCQkJaWYobmF0aW9uYWxEZXBhcnR1cmVzLmNvbnRhaW5zS2V5KGRlcGFydHVyZVN0YXRlKSkgCisJCSAgCQkJCW5hdGlvbmFsRGVwYXJ0dXJlcy5wdXQoZGVwYXJ0dXJlU3RhdGUsIG5hdGlvbmFsRGVwYXJ0dXJlcy5nZXQoZGVwYXJ0dXJlU3RhdGUpICsgdHJhdmVsbGVycyk7CisJCSAgCQkJZWxzZQorCQkgIAkJCQluYXRpb25hbERlcGFydHVyZXMucHV0KGRlcGFydHVyZVN0YXRlLCB0cmF2ZWxsZXJzKTsKKwkJICAJCQlpZihuYXRpb25hbEFycml2YWxzLmNvbnRhaW5zS2V5KGFycml2YWxTdGF0ZSkpIAorCQkgIAkJCQluYXRpb25hbEFycml2YWxzLnB1dChhcnJpdmFsU3RhdGUsIG5hdGlvbmFsQXJyaXZhbHMuZ2V0KGFycml2YWxTdGF0ZSkgKyB0cmF2ZWxsZXJzKTsKKwkJICAJCQllbHNlCisJCSAgCQkJCW5hdGlvbmFsQXJyaXZhbHMucHV0KGFycml2YWxTdGF0ZSwgdHJhdmVsbGVycyk7CisJCSAgCQl9CQorCQl9IC8vIGZvciBlYWNoIGxpbmUKKwkJCisJCUFycmF5TGlzdDxTdHJpbmc+IGFsbFN0YXRlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlmb3IoU3RyaW5nIHN0YXRlOm5hdGlvbmFsQXJyaXZhbHMua2V5U2V0KCkpIGlmKCFhbGxTdGF0ZXMuY29udGFpbnMoc3RhdGUpKSBhbGxTdGF0ZXMuYWRkKHN0YXRlKTsKKwkJZm9yKFN0cmluZyBzdGF0ZTpuYXRpb25hbERlcGFydHVyZXMua2V5U2V0KCkpIGlmKCFhbGxTdGF0ZXMuY29udGFpbnMoc3RhdGUpKSBhbGxTdGF0ZXMuYWRkKHN0YXRlKTsKKwkJZm9yKFN0cmluZyBzdGF0ZTpzdGF0ZVRyaXBzLmtleVNldCgpKSBpZighYWxsU3RhdGVzLmNvbnRhaW5zKHN0YXRlKSkgYWxsU3RhdGVzLmFkZChzdGF0ZSk7CisJCQorCQlmdy53cml0ZSgiU3RhdGUsIExvY2FsIHN0YXRlIHRyaXBzLCBOYXRpb25hbCBBcnJpdmFscywgTmF0aW9uYWxEZXBhcnR1cmVzLCAlIGxlYXZpbmcgc3RhdGUiKTsKKwkJZncud3JpdGUoTFMpOworCQlmb3IoU3RyaW5nIHN0YXRlOmFsbFN0YXRlcykgeworCQkJaW50IHN0ID0gKHN0YXRlVHJpcHMuY29udGFpbnNLZXkoc3RhdGUpKT8gc3RhdGVUcmlwcy5nZXQoc3RhdGUpIDogMDsKKwkJCWludCBuYSA9IChuYXRpb25hbEFycml2YWxzLmNvbnRhaW5zS2V5KHN0YXRlKSk/IG5hdGlvbmFsQXJyaXZhbHMuZ2V0KHN0YXRlKSA6IDA7CisJCQlpbnQgbmQgPSAobmF0aW9uYWxEZXBhcnR1cmVzLmNvbnRhaW5zS2V5KHN0YXRlKSk/IG5hdGlvbmFsRGVwYXJ0dXJlcy5nZXQoc3RhdGUpIDogMDsKKwkJCQorCQkJZncud3JpdGUoc3RhdGUrIiwiKTsKKwkJCWZ3LndyaXRlKHN0KyIiKTsKKwkJCWZ3LndyaXRlKCIsIik7CisJCQlmdy53cml0ZShuYSsiIik7CisJCQlmdy53cml0ZSgiLCIpOworCQkJZncud3JpdGUobmQrIiIpOworCQkJZncud3JpdGUoIiwiKTsKKwkJCQorCQkJZG91YmxlIHBlcmMgPSAoKGRvdWJsZSluYSsoZG91YmxlKW5kKSAvICgoZG91YmxlKW5hKyhkb3VibGUpbmQrc3QpOworCQkJZncud3JpdGUoIiIrcGVyYyk7CisJCQlmdy53cml0ZShMUyk7CisJCX0KKwkJZncuZmx1c2goKTsKKwkJZncuY2xvc2UoKTsKKwkJCisJfSBjYXRjaChFeGNlcHRpb24gZSkgeworCQllLnByaW50U3RhY2tUcmFjZSgpOworCX0KKwkJCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9BaXJUcmFuc3BvcnRHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvQWlyVHJhbnNwb3J0R2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyNDBiMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvQWlyVHJhbnNwb3J0R2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwyMDQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKKy8qKgorICogVGhlIHV0aWxpdHkgdGFrZXMgYXMgaW5wdXQgYSAucHJvcGVydGllcyBmaWxlIGNvbnRhaW5pbmcgYXJyaXZhbC9kZXBhcnR1cmUvYmFzZSBwb3B1bGF0aW9uIGluZm9ybWF0aW9uCisgKiBmb3IgYWlycG9ydHMgYXQgYSBnaXZlbiBsZXZlbCAoZS5nLiBjb3VudGllcykgYW5kIGdlbmVyYXRlcyBhIG5ldyBmaWxlIGNvbnRhaW5pbmcKKyAqIGFycml2YWwvZGVwYXJ0dXJlIGluZm9ybWF0aW9uIGZvciB0aGUgcGlwZSBhaXIgdHJhbnNwb3J0YXRpb24gaHViIGF0IHRoZSBsZXZlbCBhYm92ZSAoZS5nIC5zdGF0ZSkuCisgKiAKKyAqIFRoZSBhcnJpdmFsL2RlcGFydHVyZSBpbmZvcm1hdGlvbiBpbiB0aGUgaW5wdXQgZmlsZSBpbmNsdWRlcyBhbGwgcGFzc2VuZ2VycywgZG9tZXN0aWMgYW5kIGludGVybmF0aW9uYWwKKyAqLworcHVibGljIGNsYXNzIEFpclRyYW5zcG9ydEdlbmVyYXRvciB7CisJCisJc3RhdGljIFN0cmluZyBMUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAorCQorCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEFycmF5TGlzdDxUcmFuc3BvcnRhdGlvblJlY29yZD4+IHJlY29yZHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxUcmFuc3BvcnRhdGlvblJlY29yZD4+KCk7CisJLyoqCisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncyh7ICJubHMiLCAic3ludGhldGljLWFjY2VzcyIgfSkKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgeworCQlpZihhcmdzLmxlbmd0aCA8IDIpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IEFpclRyYW5zcG9ydEdlbmVyYXRvciA8aW5wdXQgLnByb3BlcnRpZXMgZmlsZT4gPFRvcCBUcmFuc3BvcmF0aW9uIFN5c3RlbSIpOworCQkJU3lzdGVtLmV4aXQoLTEpOworCQl9CisJCQorCQl0cnkgeworCQlTdHJpbmcgaW5wdXRGaWxlID0gYXJnc1swXTsKKwkJU3RyaW5nIHRvcFN5c3RlbSA9IGFyZ3NbMV07CisJCQorCQlGaWxlIHByb3BmaWxlID0gbmV3IEZpbGUoaW5wdXRGaWxlKTsKKwkJaWYoIXByb3BmaWxlLmV4aXN0cygpKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yLCAiK2lucHV0RmlsZSsiIGRvZXNuJ3QgZXhpc3QiKTsKKwkJCVN5c3RlbS5leGl0KC0xKTsKKwkJfQorCQkKKwkJCisJCUJ1ZmZlcmVkUmVhZGVyIGlyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJvcGZpbGUpKSk7CisJCSAgIAorCQlGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIoaW5wdXRGaWxlKyIubmV3Iik7CisJCQkKKwkJU3RyaW5nIGxpbmU7CisJCXdoaWxlKChsaW5lPWlyZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworCQkgIAlpZighbGluZS5zdGFydHNXaXRoKCIjIikgJiYKKwkJICAJCQkhbGluZS5zdGFydHNXaXRoKCJSRUNPUkRfQ0xBU1NOQU1FIikgJiYKKwkJICAJCQkhbGluZS5zdGFydHNXaXRoKCJUSVRMRSIpICYmCisJCSAgCQkJIWxpbmUuc3RhcnRzV2l0aCgiVkFMSUQiKSAmJgorCQkgIAkJCSFsaW5lLnN0YXJ0c1dpdGgoIlRSQU5TUE9SVF9NT0RFICIpICYmCisJCSAgCQkJIWxpbmUuc3RhcnRzV2l0aCgiSVNPS0VZXzAiKSAmJgorCQkgIAkJCSFsaW5lLnN0YXJ0c1dpdGgoIklTT0tFWV8wX0xFVkVMIikgJiYKKwkJICAgCQkJIWxpbmUuc3RhcnRzV2l0aCgiSVNPS0VZXzEiKSAmJgorCQkgIAkJCSFsaW5lLnN0YXJ0c1dpdGgoIklTT0tFWV8xX0xFVkVMIikgJiYKKwkJICAJCQkhbGluZS5zdGFydHNXaXRoKCJQT1BVTEFUSU9OX0lERU5USUZJRVIiKSAmJgorCQkgIAkJCSFsaW5lLnN0YXJ0c1dpdGgoIlJBVEVfVElNRV9QRVJJT0QiKSAmJgorCQkgIAkJCSFsaW5lLnN0YXJ0c1dpdGgoIkFWR19USU1FX0lOX1NZU1RFTSIpICYmCisJCSAgCQkJIWxpbmUuc3RhcnRzV2l0aCgiU1RBUlRfUE9QVUxBVElPTl9JTl9ORVRXT1JLIikgJiYKKwkJICAJCQkhKGxpbmUudHJpbSgpLmxlbmd0aCgpID09IDApCisJCQkJKSB7CisJCSAgCQkvLyBGaW5kIHRoZSB0cmFuc3BvcnRhdGlvbiByZWNvcmQKKwkJICAgIAkJCisJCSAgCQlpbnQgZXFpbmRleCA9IGxpbmUuaW5kZXhPZigiPSIpOworCQkgIAkJU3RyaW5nIHRyYW5zID0gbGluZS5zdWJzdHJpbmcoZXFpbmRleCsxKTsKKwkJICAJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhbnMsIiwiKTsKKwkJICAJCVRyYW5zcG9ydGF0aW9uUmVjb3JkIHJlY29yZCA9IG5ldyBUcmFuc3BvcnRhdGlvblJlY29yZCgpOworCQkgIAkJcmVjb3JkLmh1Yl90b3AgPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7CisJCSAgCQlyZWNvcmQuaHViX2JvdHRvbSA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKKwkJICAJCXJlY29yZC5hcnJpdmFscyA9IEludGVnZXIucGFyc2VJbnQoc3QubmV4dFRva2VuKCkudHJpbSgpKTsKKwkJICAJCXJlY29yZC5kZXBhcnR1cmVzID0gSW50ZWdlci5wYXJzZUludChzdC5uZXh0VG9rZW4oKS50cmltKCkpOworCQkgIAkJcmVjb3JkLmJhc2VfcG9wdWxhdGlvbiA9IEludGVnZXIucGFyc2VJbnQoc3QubmV4dFRva2VuKCkudHJpbSgpKTsKKwkJCisJCSAgCQlpZihyZWNvcmRzLmNvbnRhaW5zS2V5KHJlY29yZC5odWJfdG9wKSkKKwkJICAJCQlyZWNvcmRzLmdldChyZWNvcmQuaHViX3RvcCkuYWRkKHJlY29yZCk7CisJCSAgCQllbHNlIHsKKwkJICAJCQlBcnJheUxpc3Q8VHJhbnNwb3J0YXRpb25SZWNvcmQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFRyYW5zcG9ydGF0aW9uUmVjb3JkPigpOworCQkgIAkJCXJlY29yZHMucHV0KHJlY29yZC5odWJfdG9wLCBsaXN0KTsKKwkJICAJCQlsaXN0LmFkZChyZWNvcmQpOworCQkgIAkJfQorCQkgIAkJbGluZSA9ICIiOworCQkgIAl9CisJCSAgICBpZihsaW5lIT1udWxsJiZsaW5lLnRyaW0oKS5sZW5ndGgoKSAhPSAwKQlmdy53cml0ZShsaW5lK0xTKTsKKwkJICAgIGZ3LmZsdXNoKCk7CisJCX0gIC8vIEZvciBlYWNoIGxpbmUKKwkJCisJCS8vIE5vdyBmaWd1cmUgb3V0IHRoZSBhcnJpdmFsL2RlcGFydHVyZSBmb3IgdGhlIHRvcCB0cmFuc3BvcnRhdGlvbiBzeXN0ZW1zCisJCQorCQkvLyBUaGUgZGVub21pbmF0b3IKKwkJZG91YmxlIGRlbm9tID0gZ2V0RGVub21pbmF0b3IoKTsKKwkKKwkJaW50IGxpbmVuciA9IDE7CisJCWZvcihTdHJpbmcgaHViOnJlY29yZHMua2V5U2V0KCkpIHsKKwkJCUxpc3Q8VHJhbnNwb3J0YXRpb25SZWNvcmQ+IGxpc3QgPSByZWNvcmRzLmdldChodWIpOworCQkJaW50IGFycl9zdW09MCwgZGVwX3N1bT0wOworCQkJZm9yKFRyYW5zcG9ydGF0aW9uUmVjb3JkIHJlY29yZDpsaXN0KSB7CisJCQkJYXJyX3N1bSs9cmVjb3JkLmFycml2YWxzOworCQkJCWRlcF9zdW0rPXJlY29yZC5kZXBhcnR1cmVzOworCQkJfQorCQkJLy8gVGhlIHBvcHVsYXRpb24gaXMgc3VtIG9mIGFsbCBhcnJpdmFscyBhbmQgZGVwYXJ0dXJlcyAvIDIKKwkJCWludCBiYXNlX3BvcHVsYXRpb24gPSAoYXJyX3N1bStkZXBfc3VtKS8yOworCQkJLy8gRmlndXJlIHB1dCB0aGUgYXJyaXZhbC9kZXBhcnR1cmUgcmF0ZSAKKwkJCQorCQkJCisJCQlkb3VibGUgcHJvYiA9IDAuMDsgLy8gcHJvYmFiaWxpdHkgb2YgYW4gaW4tc3RhdGUtdHJhdmVsIAorCQkJCisJCQkvLyBUaGUgcHJvYmFiaWxpdHkgb2YgYW4gaW4tc3RhdGUgdHJhdmVsIGlzIHRoZSBzdW0gaWYgdGhlIHByb2JhYmlsaXR5CisJCQkvLyBvZiB0cmF2ZWwgd2l0aGluIHRoZSBzdGF0ZQorCQkJZm9yKFRyYW5zcG9ydGF0aW9uUmVjb3JkIHNvdXJjZTpsaXN0KSB7CisJCQkJZm9yKFRyYW5zcG9ydGF0aW9uUmVjb3JkIGRlc3Q6bGlzdCkgeworCQkJCQlpZihzb3VyY2UgPT0gZGVzdCkgY29udGludWU7CisJCQkJCWRvdWJsZSBwID0gZ2V0UHJvYmFiaWxpdHkoc291cmNlLCBkZXN0LCBkZW5vbSk7CisJCQkJCXByb2IgKz0gcDsKKwkJCQl9CisJCQl9CisJCQkJCQkKKwkJCS8vIFRoZXNlIGFyZSB0aGUgb3V0LW9mLXN0YXRlIHRyYXZlbGxlcnMKKwkJCWludCBhcnJpdmFscyA9IGJhc2VfcG9wdWxhdGlvbiAtIChpbnQpKGJhc2VfcG9wdWxhdGlvbipwcm9iKTsKKwkJCWludCBkZXBhcnR1cmVzID0gYmFzZV9wb3B1bGF0aW9uIC0gKGludCkoYmFzZV9wb3B1bGF0aW9uKnByb2IpOworCQkJCisJCQlmdy53cml0ZSgiIitsaW5lbnIrKyk7CisJCQlmdy53cml0ZSgiID0gIik7CisJCQlmdy53cml0ZSh0b3BTeXN0ZW0pOworCQkJZncud3JpdGUoIiwiKTsKKwkJCWZ3LndyaXRlKGh1Yik7CisJCQlmdy53cml0ZSgiLCIpOworCQkJZncud3JpdGUoYXJyaXZhbHMrIiIpOworCQkJZncud3JpdGUoIiwiKTsKKwkJCWZ3LndyaXRlKGRlcGFydHVyZXMrIiIpOworCQkJZncud3JpdGUoIiwiKTsKKwkJCWZ3LndyaXRlKGJhc2VfcG9wdWxhdGlvbisiIik7CisJCQlmdy53cml0ZShMUyk7CisJCX0KKwkJCisJCS8vIAorCQlmdy5mbHVzaCgpOworCQlmdy5jbG9zZSgpOworCQkKKwl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJfQorCQkKKwl9IC8vIG1haW4KKwkKKwlwcml2YXRlIHN0YXRpYyBkb3VibGUgZ2V0RGVub21pbmF0b3IoKSB7CisJCWRvdWJsZSByZXN1bHQgPSAwLjA7CisJCWZvcihTdHJpbmcga2V5MTpyZWNvcmRzLmtleVNldCgpKSB7CisJCQlMaXN0PFRyYW5zcG9ydGF0aW9uUmVjb3JkPiByZWNvcmRzMSA9IHJlY29yZHMuZ2V0KGtleTEpOworCQkJZm9yKFRyYW5zcG9ydGF0aW9uUmVjb3JkIHJlY29yZDE6cmVjb3JkczEpIHsKKwkJCQkvLyBhdmVyYWdlIGFycml2YWxzL2RlcGFydHVyZXMsIHNob3VsZCBiZSB0aGUgc2FtZSBhbnl3YXkKKwkJCQlkb3VibGUgbm9tMSA9IChyZWNvcmQxLmFycml2YWxzICsgcmVjb3JkMS5kZXBhcnR1cmVzKS8yLjA7CisJCQkJZG91YmxlIGRlbjEgPSByZWNvcmQxLmJhc2VfcG9wdWxhdGlvbjsKKwkJCQlkb3VibGUgcGhpMSA9IG5vbTEvZGVuMTsKKwkJCQlmb3IoU3RyaW5nIGtleTI6cmVjb3Jkcy5rZXlTZXQoKSkgeworCQkJCQlMaXN0PFRyYW5zcG9ydGF0aW9uUmVjb3JkPiByZWNvcmRzMiA9IHJlY29yZHMuZ2V0KGtleTIpOworCQkJCQlmb3IoVHJhbnNwb3J0YXRpb25SZWNvcmQgcmVjb3JkMjpyZWNvcmRzMikgeworCQkJCQkJaWYocmVjb3JkMSA9PSByZWNvcmQyKSBjb250aW51ZTsgLy8gc2tpcCB0cmF2ZWwgdG8vZnJvbSBzYW1lIGRlc3RpbmF0aW9uCisJCQkJCQkvLyBhdmVyYWdlIGFycml2YWxzL2RlcGFydHVyZXMsIHNob3VsZCBiZSB0aGUgc2FtZSBhbnl3YXkKKwkJCQkJCWRvdWJsZSBub20yID0gKHJlY29yZDIuYXJyaXZhbHMgKyByZWNvcmQyLmRlcGFydHVyZXMpLzIuMDsKKwkJCQkJCWRvdWJsZSBkZW4yID0gcmVjb3JkMi5iYXNlX3BvcHVsYXRpb247CisJCQkJCQlkb3VibGUgcGhpMiA9IG5vbTIvZGVuMjsKKwkJCQkJCXJlc3VsdCArPSBwaGkxKnBoaTI7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgZG91YmxlIGdldFByb2JhYmlsaXR5KFRyYW5zcG9ydGF0aW9uUmVjb3JkIHNvdXJjZSwgVHJhbnNwb3J0YXRpb25SZWNvcmQgZGVzdCwgZG91YmxlIGRlbm9taW5hdG9yKSB7CisJCWRvdWJsZSBub20xID0gKHNvdXJjZS5hcnJpdmFscyArIHNvdXJjZS5kZXBhcnR1cmVzKS8yLjA7CisJCWRvdWJsZSBkZW4xID0gc291cmNlLmJhc2VfcG9wdWxhdGlvbjsKKwkJZG91YmxlIHBoaTEgPSBub20xL2RlbjE7CisJCWRvdWJsZSBub20yID0gKGRlc3QuYXJyaXZhbHMgKyBkZXN0LmRlcGFydHVyZXMpLzIuMDsKKwkJZG91YmxlIGRlbjIgPSBkZXN0LmJhc2VfcG9wdWxhdGlvbjsKKwkJZG91YmxlIHBoaTIgPSBub20yL2RlbjI7CisJCXJldHVybiBwaGkxKnBoaTIvZGVub21pbmF0b3I7CisJfQorCXByaXZhdGUgc3RhdGljIGNsYXNzIFRyYW5zcG9ydGF0aW9uUmVjb3JkIHsKKwkJcHVibGljIGludCBhcnJpdmFsczsKKwkJcHVibGljIGludCBkZXBhcnR1cmVzOworCQlwdWJsaWMgaW50IGJhc2VfcG9wdWxhdGlvbjsKKwkJcHVibGljIFN0cmluZyBodWJfdG9wOworCQlwdWJsaWMgU3RyaW5nIGh1Yl9ib3R0b207CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9BaXJUcmFuc3BvcnRHZW5lcmF0b3IyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0FpclRyYW5zcG9ydEdlbmVyYXRvcjIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTMyYzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9BaXJUcmFuc3BvcnRHZW5lcmF0b3IyLmphdmEKQEAgLTAsMCArMSw2ODggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7DQorDQoraW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7DQoraW1wb3J0IGphdmEuaW8uRmlsZTsNCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsNCitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsNCisNCisvKioNCisgKiBUaGUgdXRpbGl0eSB0YWtlcyBhcyBpbnB1dCBhIC5jc3YgZmlsZSB3aGVyZSBlYWNoIHJvdyBoYXMgdGhlIGZvbGxvd2luZyBjb2x1bW5zOg0KKyAqIA0KKyAqIDEuIEFpcnBvcnQgY29kZQ0KKyAqIDIuIFNURU0gSUQNCisgKiAzLiBUb3RhbCBwYXNzZW5nZXJzIChwZXIgeWVhcikNCisgKiA0LiBMYXQvTG9uIHN0cmluZw0KKyAqIDUuIExhdCAobnVtYmVyKQ0KKyAqIDYuIExvbiAobnVtYmVyKQ0KKyAqIA0KKyAqIEl0IGdlbmVyYXRlcyBtdWx0aXBsZSBzdGVtIC5wcm9wZXJ0aWVzIGZpbGVzIHRoYXQgdGhlIGFudCBzY3JpcHQgY29udmVydHMgdG8gRU1GIG1vZGVscy4gDQorICovDQorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpDQorcHVibGljIGNsYXNzIEFpclRyYW5zcG9ydEdlbmVyYXRvcjIgew0KKwkNCisJc3RhdGljIFN0cmluZyBMUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJA0KKwkNCisJcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz5sZXZlbDBJc29LZXlzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQorCQ0KKwkvLyBXaGVuIHdlIGRvbid0IGhhdmUgZGF0YSwgdXNlIHRoaXMgbnVtYmVycy4gMTUvZGF5IG9yIDAuMDElIG9mIHBvcHVsYXRpb24sDQorCS8vIHdoaWNoZXZlciBpcyBzbWFsbGVzdA0KKwkNCisJcHJpdmF0ZSBzdGF0aWMgaW50IERFRkFVTFRfUEFTU0VOR0VSU19XSEVOX01JU1NJTkcgPSA1NDc1Ow0KKwkNCisJDQorCXByaXZhdGUgc3RhdGljIGludCBERUZBVUxUX0RJVklTSU9SID0gMzY1OyAvLyBOdW1iZXJzIGFyZSB5ZWFybHksIHdlIHdhbnQgZGFpbHkNCisJDQorCS8vIFdoYXQgcGVyY2VudGFnZSBvZiBwYXNzZW5nZXJzIGRlcGFydGluZyBmcm9tIGEgbGV2ZWwgMyAoY2l0eSkgcmVnaW9uIA0KKwkvLyBhcmUgZXhwZWN0ZWQgdG8gdHJhdmVsIHRvIGF0IGxlYXN0IGFub3RoZXIgY2l0eS4gVGhlcmUgYXJlIG5vIGludHJhLWNpdHkNCisJLy8gZmxpZ2h0cyBzbyB0aGlzIGlzIDEwMCAlDQorCQ0KKwlwcml2YXRlIHN0YXRpYyBkb3VibGUgREVGQVVMVF9QRVJDRU5UX1NUQVJUXzNfTEVWRUxfM19UT19MRVZFTF8yID0gMTAwOw0KKwkNCisJLy8gV2hhdCBwZXJjZW50YWdlIG9mIHBhc3NlbmdlcnMgd2hlbiBkZXBhcnRpbmcgZnJvbSBhIGxldmVsIDIgKGUuZy4gY291bnR5KSByZWdpb24NCisJLy8gYXJlIGV4cGVjdGVkIHRvIGFycml2ZSBhdCBhdCBsZWFzdCBhIGRpZmZlcmVudCBjb3VudHkuIFNpbmNlIGNyb3NzLWNvdW50eSBmbGlnaHRzDQorCS8vIGFyZSByYXJlIHdlIHNldCB0aGlzIHRvIDEwMC4NCisNCisJcHJpdmF0ZSBzdGF0aWMgZG91YmxlIERFRkFVTFRfUEVSQ0VOVF9TVEFSVF8zX0xFVkVMXzJfVE9fTEVWRUxfMSA9IDEwMDsNCisJDQorCS8vIFdoYXQgcGVyY2VudGFnZSBvZiBwYXNzZW5nZXJzIHdoZW4gZGVwYXJ0aW5nIGZyb20gYSBsZXZlbCAxIChlLmcuIHN0YXRlKSByZWdpb24NCisJLy8gYXJlIGV4cGVjdGVkIHRvIGFycml2ZSBhdCBhdCBsZWFzdCBhbm90aGVyIHN0YXRlLiBUaGUgYXZlcmFnZSBmb3IgVVMgaXMgNi43ICUNCisJLy8gb2YgZmxpZ2h0cyBhcmUgd2l0aGluIHRoZSBzYW1lIHN0YXRlIHNvIHdlIHVzZSB0aGF0IGdsb2JhbGx5Lg0KKw0KKwlwcml2YXRlIHN0YXRpYyBkb3VibGUgREVGQVVMVF9QRVJDRU5UX1NUQVJUXzNfTEVWRUxfMV9UT19MRVZFTF8wID0gOTMuMzsNCisJDQorCS8vIFdoYXQgcGVyY2VudGFnZSBvZiBwYXNzZW5nZXJzIHdoZW4gZGVwYXJ0aW5nIGZyb20gYSBsZXZlbCAwIChlLmcuIGNvdW50cnkpIHJlZ2lvbg0KKwkvLyBhcmUgZXhwZWN0ZWQgdG8gYXJyaXZlIGF0IGF0IGxlYXN0IGFub3RoZXIgY291bnRyeS4gVGhpcyBpcyB2ZXJ5IHRyaWNreS4NCisJLy8gSXQncyBpbnRlcm5hdGlvbmFsIHZlcnN1cyBkb21lc3RpYyBmbGlnaHRzIG5lZWRlZCBmb3IgYWxsIGNvdW50cmllcy4gV2UncmUNCisJLy8gZ3Vlc3NpbmcgNTAlLg0KKwkNCisJcHJpdmF0ZSBzdGF0aWMgZG91YmxlIERFRkFVTFRfUEVSQ0VOVF9TVEFSVF8zX0xFVkVMXzBfVE9fTEVWRUxfbTEgPSA1MDsNCisJDQorCS8vIFdoYXQgcGVyY2VudGFnZSBvZiBwYXNzZW5nZXJzIHdoZW4gZGVwYXJ0aW5nIGZyb20gYSBsZXZlbCAyIChlLmcuIGNvdW50eSkgcmVnaW9uDQorCS8vIGFyZSBleHBlY3RlZCB0byBhcnJpdmUgYXQgYXQgbGVhc3QgYSBkaWZmZXJlbnQgY291bnR5LiBTaW5jZSBjcm9zcy1jb3VudHkgZmxpZ2h0cw0KKwkvLyBhcmUgcmFyZSB3ZSBzZXQgdGhpcyB0byAxMDAuDQorCXByaXZhdGUgc3RhdGljIGRvdWJsZSBERUZBVUxUX1BFUkNFTlRfU1RBUlRfMl9MRVZFTF8yX1RPX0xFVkVMXzEgPSAxMDA7IA0KKwkvLyBXaGF0IHBlcmNlbnRhZ2Ugb2YgcGFzc2VuZ2VycyB3aGVuIGRlcGFydGluZyBmcm9tIGEgbGV2ZWwgMSAoZS5nLiBzdGF0ZSkgcmVnaW9uDQorCS8vIGFyZSBleHBlY3RlZCB0byBhcnJpdmUgYXQgYXQgbGVhc3QgYW5vdGhlciBzdGF0ZS4gVGhlIGF2ZXJhZ2UgZm9yIFVTIGlzIDYuNyAlDQorCS8vIG9mIGZsaWdodHMgYXJlIHdpdGhpbiB0aGUgc2FtZSBzdGF0ZSBzbyB3ZSB1c2UgdGhhdCBnbG9iYWxseS4NCisJcHJpdmF0ZSBzdGF0aWMgZG91YmxlIERFRkFVTFRfUEVSQ0VOVF9TVEFSVF8yX0xFVkVMXzFfVE9fTEVWRUxfMCA9IDkzLjM7DQorCS8vIFdoYXQgcGVyY2VudGFnZSBvZiBwYXNzZW5nZXJzIHdoZW4gZGVwYXJ0aW5nIGZyb20gYSBsZXZlbCAwIChlLmcuIGNvdW50cnkpIHJlZ2lvbg0KKwkvLyBhcmUgZXhwZWN0ZWQgdG8gYXJyaXZlIGF0IGF0IGxlYXN0IGFub3RoZXIgY291bnRyeS4gVGhpcyBpcyB2ZXJ5IHRyaWNreS4NCisJLy8gSXQncyBpbnRlcm5hdGlvbmFsIHZlcnN1cyBkb21lc3RpYyBmbGlnaHRzIG5lZWRlZCBmb3IgYWxsIGNvdW50cmllcy4gV2UncmUNCisJLy8gZ3Vlc3NpbmcgNTAlLg0KKwlwcml2YXRlIHN0YXRpYyBkb3VibGUgREVGQVVMVF9QRVJDRU5UX1NUQVJUXzJfTEVWRUxfMF9UT19MRVZFTF9tMSA9IDUwOw0KKwkNCisJLy8gVGhlIGFib3ZlIHBlcmNlbnRhZ2VzIGFyZSB3aGVuIHdlIGhhdmUgZGF0YSBvbiBsZXZlbCAyIChjb3VudGllcykgZm9yIGFpcnBvcnRzLg0KKwkvLyBXaGVuIHdlIG9ubHkgaGF2ZSBkYXRhIG9uIGxldmVsIDEgb3IgMCwgdGhlIHBlcmNlbnRhZ2VzIGFyZSBkaWZmZXJlbnQuIFRoZSANCisJLy8gbW90aXZhdGlvbiBiZWluZyBsZXNzIGRldGFpbGVkIGRhdGEgbWVhbnMgaXQncyBtb3JlIGxpa2VseSB0aGF0IGZsaWdodHMgYXJlDQorCS8vIG5hdGlvbmFsL2ludGVybmF0aW9uYWwuDQorCQ0KKwkvLyBBIGZsaWdodCBsZWF2aW5nIHRoZSBzdGF0ZSBpcyAxMDAgJSBsaWtlbHkgdG8gYXQgbGVhc3QgZ28gdG8gYW5vdGhlciBzdGF0ZQ0KKwlwcml2YXRlIHN0YXRpYyBkb3VibGUgREVGQVVMVF9QRVJDRU5UX1NUQVJUXzFfTEVWRUxfMV9UT19MRVZFTF8wID0gOTMuMzsNCisJDQorCS8vIEEgZmxpZ2h0IGRlcGFydGluZyB0aGUgY291bnRyeSBpcyA1MCAlIGxpa2VseSB0byBhcnJpdmUgaW4gYW5vdGhlciBjb3VudHJ5DQorCXByaXZhdGUgc3RhdGljIGRvdWJsZSBERUZBVUxUX1BFUkNFTlRfU1RBUlRfMV9MRVZFTF8wX1RPX0xFVkVMX20xID0gNTA7DQorDQorCS8vIElmIG9ubHkgaGF2ZSBhaXJwb3J0IGZvciB0aGUgY291bnRyeSBhbGwgZmxpZ2h0cyBhcmUgaW50ZXJuYXRpb25hbA0KKwlwcml2YXRlIHN0YXRpYyBkb3VibGUgREVGQVVMVF9QRVJDRU5UX1NUQVJUXzBfTEVWRUxfMF9UT19MRVZFTF9tMSA9IDEwMDsNCisJDQorCS8qKg0KKwkgKiBNYXAgc3RlbSBpZCB0byBwb3B1bGF0aW9uDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLEludGVnZXI+IHN0ZW1Qb3B1bGF0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLEludGVnZXI+KCk7DQorDQorCXN0YXRpYyB7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVEwiLCAiVExTIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVEsiLCAiVEtMIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVEoiLCAiVEpLIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVEgiLCAiVEhBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVEciLCAiVEdPIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVEYiLCAiQVRGIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR1kiLCAiR1VZIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVEQiLCAiVENEIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVEMiLCAiVENBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR1ciLCAiR05CIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR1UiLCAiR1VNIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR1QiLCAiR1RNIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR1MiLCAiU0dTIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR1IiLCAiR1JDIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR1EiLCAiR05RIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR1AiLCAiR0xQIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU1oiLCAiU1daIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU1kiLCAiU1lSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR04iLCAiR0lOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR00iLCAiR01CIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR0wiLCAiR1JMIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU1YiLCAiU0xWIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU1QiLCAiU1RQIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR0kiLCAiR0lCIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR0giLCAiR0hBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU1IiLCAiU1VSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR0ciLCAiR0dZIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU1EiLCAiU1FSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR0YiLCAiR1VGIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR0UiLCAiR0VPIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU08iLCAiU09NIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR0QiLCAiR1JEIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU04iLCAiU0VOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU00iLCAiU01SIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR0IiLCAiR0JSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU0wiLCAiU0xFIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiR0EiLCAiR0FCIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU0siLCAiU1ZLIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU0oiLCAiU0pNIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU0kiLCAiU1ZOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU0giLCAiU0hOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU0ciLCAiU0dQIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU0UiLCAiU1dFIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU0QiLCAiU0ROIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU0MiLCAiU1lDIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU0IiLCAiU0xCIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiU0EiLCAiU0FVIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiRlIiLCAiRlJBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiRk8iLCAiRlJPIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiRk0iLCAiRlNNIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUlciLCAiUldBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiRksiLCAiRkxLIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUlUiLCAiUlVTIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiRkoiLCAiRkpJIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiRkkiLCAiRklOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUlMiLCAiU1JCIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUk8iLCAiUk9VIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUkUiLCAiUkVVIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiRVQiLCAiRVRIIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiRVMiLCAiRVNQIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiRVIiLCAiRVJJIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiRUgiLCAiRVNIIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiRUciLCAiRUdZIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiRUUiLCAiRVNUIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiRUMiLCAiRUNVIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiRFoiLCAiRFpBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUUEiLCAiUUFUIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiRE8iLCAiRE9NIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUFkiLCAiUFJZIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiRE0iLCAiRE1BIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUFciLCAiUExXIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiREsiLCAiRE5LIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiREoiLCAiREpJIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUFQiLCAiUFJUIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUFMiLCAiUFNFIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUFIiLCAiUFJJIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiREUiLCAiREVVIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUE4iLCAiUENOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUE0iLCAiU1BNIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUEwiLCAiUE9MIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUEsiLCAiUEFLIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUEgiLCAiUEhMIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUEciLCAiUE5HIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ1oiLCAiQ1pFIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUEYiLCAiUFlGIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ1kiLCAiQ1lQIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUEUiLCAiUEVSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ1giLCAiQ1hSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ1YiLCAiQ1BWIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ1UiLCAiQ1VCIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiUEEiLCAiUEFOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ1IiLCAiQ1JJIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ08iLCAiQ09MIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ04iLCAiQ0hOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ00iLCAiQ01SIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ0wiLCAiQ0hMIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ0siLCAiQ09LIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ0kiLCAiQ0lWIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ0giLCAiQ0hFIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ0ciLCAiQ09HIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ0YiLCAiQ0FGIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ0QiLCAiQ09EIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ0MiLCAiQ0NLIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiT00iLCAiT01OIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQ0EiLCAiQ0FOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQloiLCAiQkxaIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQlkiLCAiQkxSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQlciLCAiQldBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQlYiLCAiQlZUIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQlQiLCAiQlROIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQlMiLCAiQkhTIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQlIiLCAiQlJBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQk8iLCAiQk9MIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTloiLCAiTlpMIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQk4iLCAiQlJOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQk0iLCAiQk1VIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQkoiLCAiQkVOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTlUiLCAiTklVIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQkkiLCAiQkRJIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQkgiLCAiQkhSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQkciLCAiQkdSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTlIiLCAiTlJVIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQkYiLCAiQkZBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQkUiLCAiQkVMIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTlAiLCAiTlBMIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQkQiLCAiQkdEIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTk8iLCAiTk9SIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQkIiLCAiQlJCIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQkEiLCAiQklIIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTkwiLCAiTkxEIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiWlciLCAiWldFIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTkkiLCAiTklDIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTkciLCAiTkdBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQVoiLCAiQVpFIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTkYiLCAiTkZLIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTkUiLCAiTkVSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQVgiLCAiQUxBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQVciLCAiQUJXIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTkMiLCAiTkNMIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiWk0iLCAiWk1CIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQVUiLCAiQVVTIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTkEiLCAiTkFNIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQVQiLCAiQVVUIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQVMiLCAiQVNNIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQVIiLCAiQVJHIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQVEiLCAiQVRBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQU8iLCAiQUdPIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTVoiLCAiTU9aIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQU4iLCAiQU5UIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTVkiLCAiTVlTIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQU0iLCAiQVJNIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTVgiLCAiTUVYIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQUwiLCAiQUxCIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTVciLCAiTVdJIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTVYiLCAiTURWIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTVUiLCAiTVVTIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiWkEiLCAiWkFGIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQUkiLCAiQUlBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTVQiLCAiTUxUIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTVMiLCAiTVNSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQUciLCAiQVRHIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTVIiLCAiTVJUIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQUYiLCAiQUZHIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTVEiLCAiTVRRIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQUUiLCAiQVJFIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTVAiLCAiTU5QIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiQUQiLCAiQU5EIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTU8iLCAiTUFDIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTU4iLCAiTU5HIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTU0iLCAiTU1SIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTUwiLCAiTUxJIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTUsiLCAiTUtEIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiWVQiLCAiTVlUIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTUgiLCAiTUhMIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTUciLCAiTURHIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTUUiLCAiTU5FIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTUQiLCAiTURBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTUMiLCAiTUNPIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTUEiLCAiTUFSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTFkiLCAiTEJZIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiWUUiLCAiWUVNIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTFYiLCAiTFZBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTFUiLCAiTFVYIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTFQiLCAiTFRVIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTFMiLCAiTFNPIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTFIiLCAiTEJSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTEsiLCAiTEtBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTEkiLCAiTElFIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTEMiLCAiTENBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTEIiLCAiTEJOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiTEEiLCAiTEFPIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiS1oiLCAiS0FaIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiS1kiLCAiQ1lNIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiS1ciLCAiS1dUIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiS1IiLCAiS09SIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiS1AiLCAiUFJLIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiS04iLCAiS05BIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiS00iLCAiQ09NIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiS0kiLCAiS0lSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiS0giLCAiS0hNIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiV1MiLCAiV1NNIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiS0ciLCAiS0daIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiS0UiLCAiS0VOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiV0YiLCAiV0xGIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSlAiLCAiSlBOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSk8iLCAiSk9SIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSk0iLCAiSkFNIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVlUiLCAiVlVUIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSkUiLCAiSkVZIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVk4iLCAiVk5NIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVkkiLCAiVklSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVkciLCAiVkdCIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVkUiLCAiVkVOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVkMiLCAiVkNUIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVkEiLCAiVkFUIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSVQiLCAiSVRBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSVMiLCAiSVNMIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSVIiLCAiSVJOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSVEiLCAiSVJRIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSU8iLCAiSU9UIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVVoiLCAiVVpCIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSU4iLCAiSU5EIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVVkiLCAiVVJZIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSU0iLCAiSU1OIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSUwiLCAiSVNSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVVMiLCAiVVNBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSUUiLCAiSVJMIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSUQiLCAiSUROIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVU0iLCAiVU1JIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVUciLCAiVUdBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSFUiLCAiSFVOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVUEiLCAiVUtSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSFQiLCAiSFRJIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSFIiLCAiSFJWIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVFoiLCAiVFpBIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSE4iLCAiSE5EIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSE0iLCAiSE1EIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVFciLCAiVFdOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVFYiLCAiVFVWIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiSEsiLCAiSEtHIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVFQiLCAiVFRPIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVFIiLCAiVFVSIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVE8iLCAiVE9OIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVE4iLCAiVFVOIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiVE0iLCAiVEtNIik7DQorCQlsZXZlbDBJc29LZXlzLnB1dCgiT0giLCAiT01OIik7DQorCX0NCisJLyoqDQorCSAqIA0KKwkgKiBAcGFyYW0gYXJncw0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoeyAibmxzIiB9KQ0KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgew0KKwkJaWYoYXJncy5sZW5ndGggPCAxKSB7DQorCQkJU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogQWlyVHJhbnNwb3J0R2VuZXJhdG9yMiA8aW5wdXQgLnByb3BlcnRpZXMgZmlsZT4iKTsNCisJCQlTeXN0ZW0uZXhpdCgtMSk7DQorCQl9DQorCQkNCisJCXRyeSB7DQorCQlTdHJpbmcgaW5wdXRGaWxlID0gYXJnc1swXTsNCisJCQ0KKwkJRmlsZSBwcm9wZmlsZSA9IG5ldyBGaWxlKGlucHV0RmlsZSk7DQorCQlpZighcHJvcGZpbGUuZXhpc3RzKCkpIHsNCisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yLCAiK2lucHV0RmlsZSsiIGRvZXNuJ3QgZXhpc3QiKTsNCisJCQlTeXN0ZW0uZXhpdCgtMSk7DQorCQl9DQorCQkNCisJCXJlYWRTdGVtUG9wdWxhdGlvbk1hcChQb3B1bGF0aW9uUGF0aCk7DQorCQkNCisJCUJ1ZmZlcmVkUmVhZGVyIGlyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJvcGZpbGUpKSk7DQorCQkgICAJCQkNCisJCUhhc2hNYXA8U3RyaW5nLCBGaWxlV3JpdGVyPiB3cml0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGaWxlV3JpdGVyPigpOw0KKwkJSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IGNvdW50ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOw0KKwkJSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHRvdGFsUGFzc2VuZ2VycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsNCisJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGFpcnBvcnRDb2RlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KKwkJDQorCQlTdHJpbmcgbGluZTsNCisJCXdoaWxlKChsaW5lPWlyZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgew0KKwkJICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpbmUsICIsIik7DQorCQkgIFN0cmluZyBhaXJwb3J0Q29kZSA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsNCisJCSAgaWYoYWlycG9ydENvZGUuc3RhcnRzV2l0aCgiIyIpKSBjb250aW51ZTsgLy8gc2tpcA0KKwkJICBTdHJpbmcgc3RlbUNvZGUgPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7DQorCQkgIC8vIHRyaW0gYXQgZmlyc3Qgc3BhY2UgaWYgZm91bmQNCisJCQ0KKwkJICBpZihzdGVtQ29kZS5pbmRleE9mKCIgIikgIT0gLTEpDQorCQkJICBzdGVtQ29kZSA9IHN0ZW1Db2RlLnN1YnN0cmluZygwLCBzdGVtQ29kZS5pbmRleE9mKCIgIikpOw0KKwkJICANCisJCSAgaW50IHN0YXJ0TGV2ZWwgPSBHZW5VdGlscy5nZXRMZXZlbChzdGVtQ29kZSk7DQorCQkgIGludCBwYXNzZW5nZXJzID0gSW50ZWdlci5wYXJzZUludChzdC5uZXh0VG9rZW4oKS50cmltKCkpOw0KKwkJICAvL2ludCBwb3B1bGF0aW9uID0gSW50ZWdlci5wYXJzZUludChzdC5uZXh0VG9rZW4oKS50cmltKCkpOw0KKwkJICBib29sZWFuIGdlbmVyYXRlZCA9IChwYXNzZW5nZXJzID09IC0xKTsNCisJCSAgSW50ZWdlciBQT1BVTEFUSU9OID0gc3RlbVBvcHVsYXRpb25NYXAuZ2V0KHN0ZW1Db2RlKTsNCisJCSAgaWYoUE9QVUxBVElPTiA9PSBudWxsICYmIGdlbmVyYXRlZCkgew0KKwkJCSAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciwgcG9wdWxhdGlvbiBub3QgZm91bmQgZm9yICIrc3RlbUNvZGUpOw0KKwkJCSAgU3lzdGVtLmV4aXQoLTEpOw0KKwkJICB9DQorCQkgIGludCBwb3B1bGF0aW9uID0gMDsNCisJCSAgaWYoUE9QVUxBVElPTiAhPSBudWxsKSBwb3B1bGF0aW9uID0gUE9QVUxBVElPTi5pbnRWYWx1ZSgpOw0KKwkJICAvLyBTa2lwIHJlc3QNCisJCSAgU3RyaW5nIHMgPSBudWxsOw0KKwkJICB3aGlsZShzdC5oYXNNb3JlVG9rZW5zKCkpIHM9c3QubmV4dFRva2VuKCk7DQorCQkgIA0KKwkJDQorCQkgIC8vIDAuMDEgJSBwZXIgZGF5IG9yIDE1IC8gZGF5LCB3aGljaGV2ZXIgaXMgc21hbGxlc3QNCisJCSAgZG91YmxlIHRocmVzaG9sZCA9ICgoZG91YmxlKXBvcHVsYXRpb24qKGRvdWJsZSlERUZBVUxUX0RJVklTSU9SKS8xMDAwMC4wOw0KKwkJICANCisJCSAgaWYoZ2VuZXJhdGVkICYmIHRocmVzaG9sZCA8IERFRkFVTFRfUEFTU0VOR0VSU19XSEVOX01JU1NJTkcpDQorCQkJICBwYXNzZW5nZXJzID0gKGludCl0aHJlc2hvbGQ7DQorCQkgIGVsc2UgaWYoZ2VuZXJhdGVkKSANCisJCQkgIHBhc3NlbmdlcnMgPSBERUZBVUxUX1BBU1NFTkdFUlNfV0hFTl9NSVNTSU5HOw0KKwkJICBlbHNlIHBhc3NlbmdlcnMgPSBwYXNzZW5nZXJzIC8gMjsgLy8gVG90YWwgdHJvdWdocHV0LCB3ZSB3YW50IGFycml2YWxzL2RlcGFydHVyZXMgc28gZGl2aWRlIGJ5IDINCisJCSAgCSAgDQorCQkgIFN5c3RlbS5vdXQucHJpbnRsbihzdGVtQ29kZSsiIFBvcHVsYXRpb246ICIrcG9wdWxhdGlvbisgIiBwYXNzZW5nZXJzOiAiK3Bhc3NlbmdlcnMrIiBnZW5lcmF0ZWQ6ICIrZ2VuZXJhdGVkKTsNCisJCSAgd2hpbGUoc3RlbUNvZGUgIT0gbnVsbCkgew0KKwkJCSAgaW50IGxldmVsID0gR2VuVXRpbHMuZ2V0TGV2ZWwoc3RlbUNvZGUpOw0KKwkJCSAgZG91YmxlIGZhY3RvciA9IDEuMDsNCisJCQkgIGlmKGxldmVsID09IDMgJiYgc3RhcnRMZXZlbCA9PSAzKSBmYWN0b3IgPSBERUZBVUxUX1BFUkNFTlRfU1RBUlRfM19MRVZFTF8zX1RPX0xFVkVMXzIvMTAwLjA7DQorCQkJICBlbHNlIGlmKGxldmVsID09IDIgJiYgc3RhcnRMZXZlbCA9PSAzKSBmYWN0b3IgPSBERUZBVUxUX1BFUkNFTlRfU1RBUlRfM19MRVZFTF8yX1RPX0xFVkVMXzEvMTAwLjA7DQorCQkJICBlbHNlIGlmKGxldmVsID09IDEgJiYgc3RhcnRMZXZlbCA9PSAzKSBmYWN0b3IgPSBERUZBVUxUX1BFUkNFTlRfU1RBUlRfM19MRVZFTF8xX1RPX0xFVkVMXzAvMTAwLjA7DQorCQkJICBlbHNlIGlmKGxldmVsID09IDAgJiYgc3RhcnRMZXZlbCA9PSAzKSBmYWN0b3IgPSBERUZBVUxUX1BFUkNFTlRfU1RBUlRfM19MRVZFTF8wX1RPX0xFVkVMX20xLzEwMC4wOw0KKwkJCSAgZWxzZSBpZihsZXZlbCA9PSAyICYmIHN0YXJ0TGV2ZWwgPT0gMikgZmFjdG9yID0gREVGQVVMVF9QRVJDRU5UX1NUQVJUXzJfTEVWRUxfMl9UT19MRVZFTF8xLzEwMC4wOw0KKwkJCSAgZWxzZSBpZihsZXZlbCA9PSAxICYmIHN0YXJ0TGV2ZWwgPT0gMikgZmFjdG9yID0gREVGQVVMVF9QRVJDRU5UX1NUQVJUXzJfTEVWRUxfMV9UT19MRVZFTF8wLzEwMC4wOw0KKwkJCSAgZWxzZSBpZihsZXZlbCA9PSAwICYmIHN0YXJ0TGV2ZWwgPT0gMikgZmFjdG9yID0gREVGQVVMVF9QRVJDRU5UX1NUQVJUXzJfTEVWRUxfMF9UT19MRVZFTF9tMS8xMDAuMDsNCisJCQkgIGVsc2UgaWYobGV2ZWwgPT0gMSAmJiBzdGFydExldmVsID09IDEpIGZhY3RvciA9IERFRkFVTFRfUEVSQ0VOVF9TVEFSVF8xX0xFVkVMXzFfVE9fTEVWRUxfMC8xMDAuMDsNCisJCQkgIGVsc2UgaWYobGV2ZWwgPT0gMCAmJiBzdGFydExldmVsID09IDEpIGZhY3RvciA9IERFRkFVTFRfUEVSQ0VOVF9TVEFSVF8xX0xFVkVMXzBfVE9fTEVWRUxfbTEvMTAwLjA7DQorCQkJICBlbHNlIGlmKGxldmVsID09IDAgJiYgc3RhcnRMZXZlbCA9PSAwKSBmYWN0b3IgPSBERUZBVUxUX1BFUkNFTlRfU1RBUlRfMF9MRVZFTF8wX1RPX0xFVkVMX20xLzEwMC4wOw0KKwkJCQkgIAkgIA0KKwkJCSAgaWYodG90YWxQYXNzZW5nZXJzLmNvbnRhaW5zS2V5KHN0ZW1Db2RlKSkNCisJCQkJICB0b3RhbFBhc3NlbmdlcnMucHV0KHN0ZW1Db2RlLCAoaW50KSh0b3RhbFBhc3NlbmdlcnMuZ2V0KHN0ZW1Db2RlKStwYXNzZW5nZXJzKmZhY3RvcikpOw0KKwkJCSAgZWxzZQ0KKwkJCQkgIHRvdGFsUGFzc2VuZ2Vycy5wdXQoc3RlbUNvZGUsIChpbnQpKHBhc3NlbmdlcnMqZmFjdG9yKSk7DQorCQkJICANCisJCQkgIGlmKGFpcnBvcnRDb2Rlcy5jb250YWluc0tleShzdGVtQ29kZSkpDQorCQkJCSAgYWlycG9ydENvZGVzLnB1dChzdGVtQ29kZSwgYWlycG9ydENvZGVzLmdldChzdGVtQ29kZSkrIiwgIithaXJwb3J0Q29kZSArICgoZ2VuZXJhdGVkKT8iKEVzdGltYXRlZCkiOiIoQWN0dWFsKSIpKTsNCisJCQkgIGVsc2UNCisJCQkJICBhaXJwb3J0Q29kZXMucHV0KHN0ZW1Db2RlLCBhaXJwb3J0Q29kZSArICgoZ2VuZXJhdGVkKT8iKEVzdGltYXRlZCkiOiIoQWN0dWFsKSIpKTsNCisJCQkgIA0KKwkJCSAgc3RlbUNvZGUgPSBHZW5VdGlscy51cENvZGUoc3RlbUNvZGUpOw0KKwkJICB9DQorCQl9DQorCQlpcmVhZGVyLmNsb3NlKCk7DQorCQkNCisJCWZvcihTdHJpbmcgc3RlbUNvZGU6dG90YWxQYXNzZW5nZXJzLmtleVNldCgpKSB7DQorCQkgIGludCBsZXZlbCA9IEdlblV0aWxzLmdldExldmVsKHN0ZW1Db2RlKTsNCisJCSAgLy8gVHVybiB0d28gbGV0dGVyIGNvdW50cnkgY29kZSBpbnRvIHRocmVlIGxldHRlciBjb3VudHJ5IGNvZGUNCisJCSAgU3RyaW5nIGNvdW50cnkgPSBHZW5VdGlscy5leHRyYWN0QWxwaGExKHN0ZW1Db2RlKTsNCisJCSAgZG91YmxlIG51bVBhc3NlbmdlcnMgPSB0b3RhbFBhc3NlbmdlcnMuZ2V0KHN0ZW1Db2RlKTsNCisJCSAgbnVtUGFzc2VuZ2VycyAvPSBERUZBVUxUX0RJVklTSU9SOw0KKwkJICANCisJCSAgaWYoY291bnRyeS5sZW5ndGgoKSA9PSAyKSANCisJCQkgIGNvdW50cnkgPSBsZXZlbDBJc29LZXlzLmdldChjb3VudHJ5KTsNCisJCSAgaWYoY291bnRyeSA9PSBudWxsKSB7DQorCQkJICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yLCBjb3VudHJ5IGNvZGUgaW4gOiAiK3N0ZW1Db2RlKyIgbm90IHJlY29nbml6ZWQiKTsNCisJCQkgIGNvbnRpbnVlOw0KKwkJICB9DQorCQkgIFN0cmluZyBmaWxlbmFtZT1udWxsOw0KKwkJICBpZihsZXZlbCA9PSAwKQ0KKwkJCSAgZmlsZW5hbWUgPSAiWlpaXy0xX1paWl8wLnByb3BlcnRpZXMiOw0KKwkJICBlbHNlIGZpbGVuYW1lID0gY291bnRyeSsiXyIrKGxldmVsLTEpKyJfIitjb3VudHJ5KyJfIitsZXZlbCsiLnByb3BlcnRpZXMiOw0KKwkJICBGaWxlV3JpdGVyIGZ3ID0gbnVsbDsNCisJCSAgaWYod3JpdGVycy5jb250YWluc0tleShmaWxlbmFtZSkpDQorCQkJICBmdyA9IHdyaXRlcnMuZ2V0KGZpbGVuYW1lKTsNCisJCSAgZWxzZSB7DQorCQkJICBmdyA9IG5ldyBGaWxlV3JpdGVyKGZpbGVuYW1lKTsNCisJCQkgIHdyaXRlcnMucHV0KGZpbGVuYW1lLCBmdyk7DQorCQkJICB3cml0ZXJIZWFkZXIoZncsIGZpbGVuYW1lLCBjb3VudHJ5LCBsZXZlbCk7DQorCQkgIH0NCisJCSAgU3RyaW5nIHBhcmVudEtleT1udWxsLCBjaGlsZEtleT1udWxsOw0KKwkJICANCisJCSAgaWYobGV2ZWwgPj0gMikgew0KKwkJCSAgcGFyZW50S2V5ID0gc3RlbUNvZGUuc3Vic3RyaW5nKDAsIHN0ZW1Db2RlLmxhc3RJbmRleE9mKCItIikpOw0KKwkJCSAgY2hpbGRLZXkgPSBzdGVtQ29kZTsNCisJCSAgfSBlbHNlIGlmIChsZXZlbCA9PSAxKSB7IA0KKwkJCSAgcGFyZW50S2V5ID0gY291bnRyeTsNCisJCQkgIGNoaWxkS2V5ID0gc3RlbUNvZGU7DQorCQkgIH0gZWxzZSBpZiAobGV2ZWwgPT0gMCkgew0KKwkJCSAgcGFyZW50S2V5ID0gIlpaWiI7DQorCQkJICBjaGlsZEtleSA9IGNvdW50cnk7DQorCQkgIH0NCisJCSAgaW50IGxpbmVjb3VudDsNCisJCSAgaWYoY291bnRlcnMuY29udGFpbnNLZXkoZmlsZW5hbWUpKSB7DQorCQkJICBsaW5lY291bnQgPSBjb3VudGVycy5nZXQoZmlsZW5hbWUpOw0KKwkJCSAgY291bnRlcnMucHV0KGZpbGVuYW1lLCBsaW5lY291bnQrMSk7DQorCQkgIH0NCisJCSAgZWxzZSB7DQorCQkJICBsaW5lY291bnQgPSAwOw0KKwkJCSAgY291bnRlcnMucHV0KGZpbGVuYW1lLCBsaW5lY291bnQrMSk7DQorCQkgIH0NCisJCSAgDQorCQkgIGZ3LndyaXRlKCIjICIrYWlycG9ydENvZGVzLmdldChzdGVtQ29kZSkrTFMpOw0KKwkJICBmdy53cml0ZShsaW5lY291bnQrIiA9ICIpOw0KKwkJICBmdy53cml0ZShwYXJlbnRLZXkpOw0KKwkJICBmdy53cml0ZSgnLCcpOw0KKwkJICBmdy53cml0ZShjaGlsZEtleSk7DQorCQkgIGZ3LndyaXRlKCcsJyk7DQorCQkgIGZ3LndyaXRlKG51bVBhc3NlbmdlcnMrIiIpOw0KKwkJICBmdy53cml0ZSgnLCcpOw0KKwkJICBmdy53cml0ZShudW1QYXNzZW5nZXJzKyIiKTsNCisJCSAgZncud3JpdGUoTFMpOw0KKwkJICBTeXN0ZW0ub3V0LnByaW50bG4oc3RlbUNvZGUrIiBwYXNzZW5nZXJzOiAiK251bVBhc3NlbmdlcnMpOw0KKwkJfSAgLy8gRm9yIGVhY2ggbGluZQ0KKwkJDQorCQkNCisJCWZvcihGaWxlV3JpdGVyIGZ3OndyaXRlcnMudmFsdWVzKCkpIHsNCisJCQlmdy5mbHVzaCgpOw0KKwkJCWZ3LmNsb3NlKCk7DQorCQl9CQkNCisJfSBjYXRjaChFeGNlcHRpb24gZSkgew0KKwkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJfQ0KKwkJDQorCX0gLy8gbWFpbg0KKwkNCisJDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQ0KKwlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVySGVhZGVyKEZpbGVXcml0ZXIgZncsIFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGNvdW50cnksIGludCBsZXZlbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisJCVN0cmluZyBjdHJ5ID0gY291bnRyeTsNCisJCWlmKGxldmVsID09IDApIGN0cnkgPSAiWlpaIjsNCisJCWZ3LndyaXRlKCIjICIrZmlsZW5hbWUrTFMpOw0KKwkJZncud3JpdGUoIiMvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIrTFMpOyANCisJCWZ3LndyaXRlKCIjICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiIrTFMpOyANCisJCWZ3LndyaXRlKCIjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyIrTFMpOyANCisJCWZ3LndyaXRlKCIjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIitMUyk7IA0KKwkJZncud3JpdGUoIiMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCIrTFMpOw0KKwkJZncud3JpdGUoIiMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAiK0xTKTsNCisJCWZ3LndyaXRlKCIjICogIitMUyk7DQorCQlmdy53cml0ZSgiIyAqIENvbnRyaWJ1dG9ycyIrTFMpOyANCisJCWZ3LndyaXRlKCIjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIrTFMpOyANCisJCWZ3LndyaXRlKCIjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIitMUyk7IA0KKwkJZncud3JpdGUoTFMpOwkJIA0KKwkJZncud3JpdGUoIiMgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCB3aWxsIGludGVycHJldCB0aGUgcmVzdCBvZiB0aGUgZmlsZSdzIGNvbnRlbnRzIitMUyk7IA0KKwkJZncud3JpdGUoIlJFQ09SRF9DTEFTU05BTUUgPSAgb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLmdlb2dyYXBoeS5pbmZyYXN0cnVjdHVyZS50cmFuc3BvcnRhdGlvbi5zcGVjaWZpY2F0aW9ucy5BaXJUcmFuc3BvcnRhdGlvbkdlb2dyYXBoaWNSZWxhdGlvbnNoaXBQcm9wZXJ0eUZpbGVTcGVjaWZpY2F0aW9uIitMUyk7DQorCQlmdy53cml0ZShMUyk7IA0KKwkJZncud3JpdGUoIiMgVGhlIHRpdGxlIG9mIHRoZSByZWxhdGlvbnNoaXAiK0xTKTsgDQorCQlmdy53cml0ZSgiVElUTEUgPSBBaXIgdHJhbnNwb3J0IGJldHdlZW4gIitjdHJ5KyIoIisobGV2ZWwtMSkrIikgYW5kICIrY3RyeSsiKCIrbGV2ZWwrIikiKTsgDQorCQlmdy53cml0ZShMUyk7IA0KKwkJZncud3JpdGUoIiMgVGhpcyBpcyB0aGUgZGF0ZSByYW5nZSBmb3Igd2hpY2ggdGhlIHZhbHVlcyBpbiB0aGlzIGZpbGUgYXJlIHZhbGlkIitMUyk7IA0KKwkJZncud3JpdGUoIiMgU2VlIGh0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy8xLjEvdmFsaWQiK0xTKTsgDQorCQlmdy53cml0ZSgiVkFMSUQgPSBzdGFydD0yMDAwLTAxLTAxOyBlbmQ9MjAwOC0xMi0zMTsiK0xTKTsNCisJCWZ3LndyaXRlKExTKTsgDQorCQlmdy53cml0ZSgiIyBUaGUgZGF0YSBpcyBkZXJpdmVkIGZyb20gdGhlIGZvbGxvd2luZyBwcmltYXJ5IHNvdXJjZSIrTFMpOyANCisJCWZ3LndyaXRlKCIjU09VUkNFID0gaHR0cDovL3d3dy5hendvcmxkYWlycG9ydHMuY29tIitMUyk7IA0KKwkJZncud3JpdGUoTFMpOyANCisJCWZ3LndyaXRlKCIjIElTTzMxNjYtMSBhbHBoYTMga2V5cyBhbmQgbGV2ZWxzIG9mIHJlbGF0aW9uc2hpcCIrTFMpOyANCisJCWZ3LndyaXRlKCJJU09LRVlfMCA9ICIrY3RyeStMUyk7IA0KKwkJZncud3JpdGUoIklTT0tFWV8wX0xFVkVMID0gIisobGV2ZWwgLTEpK0xTKTsgDQorCQlmdy53cml0ZSgiSVNPS0VZXzEgPSAiK2N0cnkrTFMpOyANCisJCWZ3LndyaXRlKCJJU09LRVlfMV9MRVZFTCA9ICIrbGV2ZWwrTFMpOw0KKwkJZncud3JpdGUoTFMpOyANCisJCWZ3LndyaXRlKCIjIFRoZSBtb2RlIG9mIHRyYW5zcG9ydGF0aW9uICIrTFMpOw0KKwkJZncud3JpdGUoIlRSQU5TUE9SVF9NT0RFID0gYWlyIitMUyk7IA0KKwkJZncud3JpdGUoTFMpOw0KKwkJZncud3JpdGUoIiMgVGhlIHBvcHVsYXRpb24gYmVpbmcgdHJhbnNwb3J0ZWQiK0xTKTsgDQorCQlmdy53cml0ZSgiUE9QVUxBVElPTl9JREVOVElGSUVSID0gaHVtYW4iK0xTKTsgDQorCQlmdy53cml0ZShMUyk7DQorCQlmdy53cml0ZSgiIyBUaGUgdGltZSBwZXJpb2QgZm9yIHRoZSByYXRlIGluIG1pbGxpc2Vjb25kcyAiK0xTKTsgDQorCQlmdy53cml0ZSgiUkFURV9USU1FX1BFUklPRCA9IDg2NDAwMDAwIitMUyk7IA0KKwkJZncud3JpdGUoTFMpOyANCisJCWZ3LndyaXRlKCIjQXZlcmFnZSB0aW1lIGluIHRyYW5zcG9ydGF0aW9uIG5ldHdvcmsiK0xTKTsgDQorCQlmdy53cml0ZSgiQVZHX1RJTUVfSU5fU1lTVEVNID0gMSIrTFMpOyANCisJCWZ3LndyaXRlKExTKTsNCisJCSANCisJCWZ3LndyaXRlKCIjIFJlY29yZCBOby4gPSBFbmNsb3NpbmcgTm9kZSBLZXksICBOb2RlIEtleSwgQXJyaXZhbFJhdGUgKGluZGl2aWR1YWxzIHBlciBSQVRFX1RJTUVfUEVSSU9EKSwgRGVwYXJ0dXJlUmF0ZShJbmRpdmlkdWFscyBwZXIgUkFURV9USU1FX1BFUklPRCkiK0xTKTsgDQorCQlmdy5mbHVzaCgpOw0KKwl9DQorDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBvcHVsYXRpb25QYXRoID0gIkM6L3N0ZW13cy9vcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuZ2VvZ3JhcGh5LnBvcHVsYXRpb24uaHVtYW4vcmVzb3VyY2VzL2RhdGEvY291bnRyeS8iOw0KKw0KKwkvKioNCisJICogcmVhZCBpbiB0aGUgc3RlbSBwb3B1bGF0aW9uIGRhdGENCisJICogDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVhZFN0ZW1Qb3B1bGF0aW9uTWFwKFN0cmluZyBwYXRoKSB7DQorCQlmaW5hbCBTdHJpbmcgTk9URk9VTkQgPSAieHgiOw0KKwkJU3RyaW5nIHVzZU5hbWUgPSBOT1RGT1VORDsNCisNCisJCXRyeSB7DQorCQkJRmlsZSBmID0gbmV3IEZpbGUocGF0aCk7DQorDQorCQkJaWYoZi5pc0RpcmVjdG9yeSgpKSB7DQorCQkJCVN0cmluZ1tdIHN1YkZvbGRlcnMgPSBmLmxpc3QoKTsNCisJCQkJZm9yKGludCBpPTA7aTxzdWJGb2xkZXJzLmxlbmd0aDsrK2kpIA0KKwkJCQkJcmVhZFN0ZW1Qb3B1bGF0aW9uTWFwKHBhdGgrRmlsZS5zZXBhcmF0b3Irc3ViRm9sZGVyc1tpXSk7DQorCQkJfSBlbHNlIHsNCisJCQkJaWYgKGYuZ2V0TmFtZSgpLmVuZHNXaXRoKCIucHJvcGVydGllcyIpKSB7DQorCQkJCQkJCQkJCQkNCisJCQkJCUJ1ZmZlcmVkUmVhZGVyIGZpbGVSZWFkZXIgPSBvcGVuUmVhZGVyKGYpOw0KKw0KKwkJCQkJLy8gQWRkIGFsbCB0aGUgc291cmNlIFVSTHMgZm9yIHRoaXMgY291bnRyeS4NCisJCQkJCWlmIChmaWxlUmVhZGVyICE9IG51bGwpIHsNCisJCQkJCQlTdHJpbmcgYnVmZmVyID0gbnVsbDsNCisJCQkJCQl3aGlsZSAoRU9GKGJ1ZmZlciA9IGZpbGVSZWFkZXIucmVhZExpbmUoKSkgIT0gdHJ1ZSkgew0KKw0KKwkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiAiK2J1ZmZlcik7DQorCQkJCQkJCS8vIFRva2VuaXplDQorCQkJCQkJCS8vIFJFSkVDVCBTVFJJTkdTDQorCQkJCQkJCWZpbmFsIFN0cmluZyBzMSA9ICJSRUNPUkRfQ0xBU1NOQU1FIjsNCisJCQkJCQkJZmluYWwgU3RyaW5nIHMyID0gIklTT0tFWSI7DQorCQkJCQkJCWZpbmFsIFN0cmluZyBzMyA9ICJBRE1JTl9MRVZFTCI7DQorCQkJCQkJCWZpbmFsIFN0cmluZyBzNCA9ICJWQUxJRCI7DQorCQkJCQkJCWZpbmFsIFN0cmluZyBzNSA9ICJTT1VSQ0UiOw0KKwkJCQkJCQlmaW5hbCBTdHJpbmcgczYgPSAiUE9QVUxBVElPTiI7DQorCQkJCQkJCWZpbmFsIFN0cmluZyBzNyA9ICJZRUFSIjsNCisJCQkJCQkJZmluYWwgU3RyaW5nIHM4ID0gIlRJVExFIjsNCisJCQkJCQkJZmluYWwgU3RyaW5nIHM5ID0gIiMiOw0KKwkJCQkJCQlpZiAoKGJ1ZmZlci5pbmRleE9mKHMxKSA9PSAtMSkNCisJCQkJCQkJCQkmJiAoYnVmZmVyLmluZGV4T2YoczIpID09IC0xKQ0KKwkJCQkJCQkJCSYmIChidWZmZXIuaW5kZXhPZihzMykgPT0gLTEpDQorCQkJCQkJCQkJJiYgKGJ1ZmZlci5pbmRleE9mKHM0KSA9PSAtMSkNCisJCQkJCQkJCQkmJiAoYnVmZmVyLmluZGV4T2YoczUpID09IC0xKQ0KKwkJCQkJCQkJCSYmIChidWZmZXIuaW5kZXhPZihzNikgPT0gLTEpDQorCQkJCQkJCQkJJiYgKGJ1ZmZlci5pbmRleE9mKHM3KSA9PSAtMSkNCisJCQkJCQkJCQkmJiAoYnVmZmVyLmluZGV4T2YoczgpID09IC0xKQ0KKwkJCQkJCQkJCSYmIChidWZmZXIuaW5kZXhPZihzOSkgPT0gLTEpDQorCQkJCQkJCQkJJiYgKGJ1ZmZlci5pbmRleE9mKCI9IikgPj0gMSkpIHsNCisNCisJCQkJCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJ1ZmZlciwgIj0iKTsgLy8kTk9OLU5MUy0xJA0KKwkNCisJCQkJCQkJCS8vIExldmVsIDINCisJCQkJCQkJCVN0cmluZyBzdGVtSUQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOw0KKwkJCQkJCQkJaWYoc3RlbUlELmNvbnRhaW5zKCJaWloiKSkgY29udGludWU7DQorCQkJCQkJCQlTdHJpbmcgcG9wdWxhdGlvbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7DQorCQ0KKwkJCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIiK3N0ZW1JRDIrIiA9ICIrcG9wdWxhdGlvbik7DQorCQkJCQkJCQkvLyBwb3B1bGF0aW9uSWRNYXAucHV0KHN0ZW1JRDIsIG5ldw0KKwkJCQkJCQkJLy8gSW50ZWdlcihwb3B1bGF0aW9uLnRyaW0oKSkpOw0KKwkJCQkJCQkJdHJ5IHsNCisJCQkJCQkJCQlJbnRlZ2VyIHBvcFZhbCA9IG5ldyBJbnRlZ2VyKHBvcHVsYXRpb24pOw0KKwkJCQkJCQkJCWludCBpdGVzdCA9IHBvcFZhbC5pbnRWYWx1ZSgpOw0KKwkJCQkJCQkJCWlmIChpdGVzdCA8PSAtMSkgew0KKwkJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImludmFsaWQgcG9wdWxhdGlvbiB2YWwgZm9yIGNvdW50cnkiDQorCQkJCQkJCQkJCQkJCQkrIHN0ZW1JRCk7DQorCQkJCQkJCQkJCVN5c3RlbS5leGl0KC0xKTsNCisJCQkJCQkJCQl9DQorCQkJCQkJCQkJc3RlbVBvcHVsYXRpb25NYXAucHV0KHN0ZW1JRCwgaXRlc3QpOw0KKwkJCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgew0KKwkJCQkJCQkJCQlTeXN0ZW0ub3V0DQorCQkJCQkJCQkJCQkJLnByaW50bG4oIiEhISEgaW52YWxpZCBkYXRhIg0KKwkJCQkJCQkJCQkJCQkJKyBidWZmZXIpOw0KKwkJCQkJCQkJCQlTeXN0ZW0uZXhpdCgtMSk7DQorCQkJCQkJCQl9DQorCQkJCQkJCX0gLy8gTm90IGhlYWRlciBmaWVsZA0KKwkJCQkJCX0gLy8gV2hpbGUgIUVPRg0KKwkJCQkJfSAvLyBXaGlsZSBGaWxlUmVhZGVyIGlzIG5vdCBudWxsDQorCQkJCX0gLy8gaXMgLnByb3BlcnRpZXMgZmlsZQ0KKwkJCX0gLy8gSXMgZmlsZQ0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHJlYWRpbmcgZmlsZSIgKyB1c2VOYW1lKTsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCVN5c3RlbS5leGl0KDEpOw0KKwkJfQ0KKwl9Ly8gcmVhZFN0ZW1Qb3B1bGF0aW9uKCkNCisJDQorCS8qKg0KKwkgKiBDcmVhdGUgYSBuZXdCdWZmZXJlZFJlYWRlcg0KKwkgKiANCisJICogQHBhcmFtIGZpbGVOYW1lDQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUgd2Ugd2FudCB0byBvcGVuIGZvciByZWFkaW5nDQorCSAqIA0KKwkgKiBAcmV0dXJuIGEgcmVhZGVyIHRvIGEgZ2l2ZW4gZmlsZQ0KKwkgKi8NCisJc3RhdGljIHByb3RlY3RlZCBCdWZmZXJlZFJlYWRlciBvcGVuUmVhZGVyKEZpbGUgZmlsZSkgew0KKw0KKwkJdHJ5IHsNCisNCisJCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsNCisNCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisNCisJCXJldHVybiBudWxsOw0KKwl9DQorCQ0KKwkvKioNCisJICogSW5kaWNhdGUgRW5kLU9mLUZpbGUNCisJICogDQorCSAqIEBwYXJhbSBidWZmZXINCisJICogICAgICAgICAgICBBIGJ1ZmZlciBvZiBkaXZhIGRhdGENCisJICogDQorCSAqIEByZXR1cm4gVHJ1ZSBpZiB3ZSBoYXZlIHJlYWNoZWQgRW5kLU9mLUZpbGUNCisJICovDQorCXN0YXRpYyBwcm90ZWN0ZWQgYm9vbGVhbiBFT0YoU3RyaW5nIGJ1ZmZlcikgew0KKwkJaWYgKGJ1ZmZlciA9PSBudWxsICkNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0FyZWFEYXRhTWlncmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvQXJlYURhdGFNaWdyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MmRlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0FyZWFEYXRhTWlncmF0b3IuamF2YQpAQCAtMCwwICsxLDM3OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VuZXJhdG9yczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworLyoqCisgKiBTVEVNIElJIERhdGEgTWlncmF0aW9uL0dlbmVyYXRpb24gVXRpbGl0aWVzIDogSW5zdGFuY2VzIG9mIHRoaXMgdXRpbGl0eSBjbGFzcworICogZXh0cmFjdCB0aGUgcG9wdWxhdGlvbiBkYXRhIGZyb20gdGhlIFNURU0gSSBkYXRhIGZpbGVzIGFzIGEgc2ltcGxlIHRleHQgZmlsZS4KKyAqIFRoZSBhcmVhIGRhdGEgZXh0cmFjdGVkIGlzIHVzZWQgZHVyaW5nIGdlbmVyYXRpb24gb2YgU1RFTSBJSSBwcm9wZXJ0aWVzCisgKiBmaWxlcy4KKyAqIAorICogQWRkIHRoZSBmb2xsb3dpbmcgdmFsdWVzIHRvIHRoZSBydW4gY29uZmlndXJhdGlvbjoKKyAqIAorICogQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXGlucHV0XElTTzMxNjYtMVxJU08zMTY2XzFfZW4udHh0CisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRcbWlncmF0aW9uXGNvdW50cnlfbmFtZXMudHh0CisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRcbWlncmF0ZWREYXRhXAorICogCisgKi8KKworcHVibGljIGNsYXNzIEFyZWFEYXRhTWlncmF0b3IgeworCisJLyoqCisJICogT3VyIHNvdXJjZSBmaWxlcyBmb3IgSVNPIDMxNjYtMSBjb2RlcyBhbmQgZm9yIHRoZSBsaXN0IG9mIHRhcmdldAorCSAqIGNvdW50cmllcy4KKwkgKi8KKworCXByaXZhdGUgU3RyaW5nIGlzb0ZpbGUgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgY291bnRyaWVzRmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBvdXRwdXREaXIgPSBudWxsOworCisJLyoqCisJICogQSBtYXAgY29udGFpbmluZyB0dXBsZXMgb2YgdGhlIGZvcm0gKGxvY2F0aW9uLGFyZWEpCisJICovCisJTWFwIGFyZWFNYXAgPSBudWxsOworCisJTWFwIG5hbWVNYXAgPSBudWxsOworCisJLyoqCisJICogTGlzdCBmb3IgSVNPIDMxNjYtMSBjb2RlcyBhbmQgdGFyZ2V0IGNvdW50cmllcy4KKwkgKi8KKworCUxpc3QgY291bnRyaWVzTGlzdCA9IG51bGw7CisKKwlMaXN0IGNvZGVMaXN0ID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICogCisJICogQHBhcmFtIGlzb0ZpbGUKKwkgKiAgICAgICAgICAgIGEgZmlsZSBjb250YWluaW5nIElTTzMxNjYtMSBjb2RlcworCSAqIEBwYXJhbSBjb3VudHJpZXNGaWxlCisJICogICAgICAgICAgICBhIGZpbGUgY29udGFpbmluZyBjb3VudHJpZXMgZm9yIHdoaWNoIHdlIHdpbGwgZ2VuZXJhdGUgYXJlYQorCSAqICAgICAgICAgICAgcHJvcGVydGllcyBmaWxlcworCSAqIEBwYXJhbSBvdXRwdXREaXIKKwkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHdoZXJlIHdlIHdpbGwgd3JpdGUgdGhlIG5ldyBhcmVhIGZpbGVzCisJICovCisJQXJlYURhdGFNaWdyYXRvcihTdHJpbmcgaXNvRmlsZSwgU3RyaW5nIGNvdW50cmllc0ZpbGUsIFN0cmluZyBvdXRwdXREaXIpIHsKKwkJdGhpcy5pc29GaWxlID0gaXNvRmlsZTsKKwkJdGhpcy5jb3VudHJpZXNGaWxlID0gY291bnRyaWVzRmlsZTsKKwkJdGhpcy5vdXRwdXREaXIgPSBvdXRwdXREaXI7CisJCWFyZWFNYXAgPSBuZXcgSGFzaE1hcCgpOworCQluYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBzZXRzIHVwIGFuZCBydW5zIHRoaXMgZ2VuZXJhdG9yLgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBjb3VudHJpZXMgd2Ugd2FudC4KKwkJY291bnRyaWVzTGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdChjb3VudHJpZXNGaWxlKTsKKworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIElTTzMxNjYtMSBBTFBIQTIsIEFMUEhBMywgYW5kCisJCS8vIG51bWVyaWMgY29kZXMuCisJCWNvZGVMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KGlzb0ZpbGUpOworCisJCS8vIE5vdywgcHJvY2VzcyBlYWNoIGl0ZW0gaW4gdGhlIHRhcmdldCBsaXN0LgorCQlwcm9jZXNzKCk7CisKKwl9CisKKwkvKioKKwkgKiBNZXRob2QgdGhhdCBsb2FkcyBhbiBYTUwgZmlsZSB3aXRoIFNURU0gSSBuYW1lIGFuZCBhcmVhIGRhdGEuCisJICogCisJICogQHBhcmFtIGZpbGVOYW1lCisJICogICAgICAgICAgICB0aGUgWE1MIHRlc3QgZmlsZQorCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgWE1MIGRvY3VtZW50CisJICogCisJICogCisJICovCisJcHJvdGVjdGVkIEVsZW1lbnQgbG9hZFhNTChTdHJpbmcgZmlsZU5hbWUpIHsKKworCQlEb2N1bWVudCBkb2MgPSBudWxsOworCQlEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkKKwkJCQkJLm5ld0luc3RhbmNlKCk7CisJCQkvLyBYTUwgZG9jdW1lbnQgYnVpbGRlcgorCQkJZG9jQnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisJCQlkb2MgPSBkb2NCdWlsZGVyLm5ld0RvY3VtZW50KCk7CisJCQkvLyBMb2FkIFhNTCBmaWxlCisJCQlGaWxlIHhtbEZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7CisJCQlTdHJpbmcgZmlsZVBhdGggPSB4bWxGaWxlLmdldEFic29sdXRlUGF0aCgpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIHBhdGggPSAiICsgZmlsZVBhdGgpOyAvLyROT04tTkxTLTEkCisJCQlkb2MgPSBkb2NCdWlsZGVyLnBhcnNlKGZpbGVQYXRoKTsKKwkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpIHsKKwkJCVN5c3RlbS5vdXQKKwkJCQkJLnByaW50bG4oIkxvYWRYTUwoKTogIEVycm9yIGNvbmZpZ3VyaW5nIHhtbCBkb2N1bWVudCBidWlsZGVyICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCSsgcGNlLmdldE1lc3NhZ2UoKSk7CisJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisKKwkJLy8gUmV0dXJuIHRoZSByb290IG9mIHRoaXMgWE1MIGRvY3VtZW50CisJCXJldHVybiBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisJfQorCisJLyoqCisJICogUmVhZCBhbGwgYXJndW1lbnRzIGluIGEgZGF0YXNldCwgb25lIGJ5IG9uZS4KKwkgKiAKKwkgKiBAcGFyYW0gZmlsZQorCSAqICAgICAgICAgICAgZmlsZW5hbWUgb2YgWE1MIGZpbGUgd2Ugd2FudCB0byBsb2FkIGFuZCBleHRyYWN0IGRhdGEgZnJvbS4KKwkgKiAKKwkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbWFwIHdpdGggdHVwbGVzIChLZXk9bG9jYXRpb25JRCxWYWx1ZSkKKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwIGV4dHJhY3RBcmVhRGF0YShTdHJpbmcgZmlsZSkgeworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gYXJlYU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisJCUVsZW1lbnQgcm9vdCA9IGxvYWRYTUwoZmlsZSk7CisJCS8vIGdldCBhbGwgdGhlIGVsZW1lbnRzCisJCU5vZGVMaXN0IG5sID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOyAvLyROT04tTkxTLTEkCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgeworCQkJRWxlbWVudCBlbCA9IChFbGVtZW50KSBubC5pdGVtKGkpOworCQkJU3RyaW5nIGxvY2F0aW9uID0gZWwuZ2V0QXR0cmlidXRlKCJsb2NhdGlvbklkIikudG9VcHBlckNhc2UoKTsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nIGFyZWEgPSBlbC5nZXRBdHRyaWJ1dGUoInZhbHVlIik7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIFN0b3JlIGJvdGggdmFsdWVzIGZvciBsYXRlciBsb29rdXAuIFVzZSB1cHBlcmNhc2UuCisJCQlhcmVhTWFwLnB1dChsb2NhdGlvbiwgYXJlYSk7CisJCX0KKworCQkvLyByZXR1cm4gYXJlYUxpc3Q7CisJCXJldHVybiBhcmVhTWFwOworCX0KKworCS8qKgorCSAqIFJlYWQgYWxsIGFyZ3VtZW50cyBpbiBhIGRhdGFzZXQsIG9uZSBieSBvbmUuCisJICogCisJICogQHBhcmFtIHRoZQorCSAqICAgICAgICAgICAgZmlsZW5hbWUKKwkgKiAKKwkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbWFwIHdpdGggdHVwbGVzIChLZXk9SUQsVmFsdWU9TmFtZSkKKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwIGV4dHJhY3ROYW1lRGF0YShTdHJpbmcgZmlsZSkgeworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gbmFtZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisJCUVsZW1lbnQgcm9vdCA9IGxvYWRYTUwoZmlsZSk7CisJCS8vIGdldCBhbGwgdGhlIGVsZW1lbnRzCisJCU5vZGVMaXN0IG5sID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOyAvLyROT04tTkxTLTEkCisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7CisJCQlFbGVtZW50IHJlZ2lvbnMgPSAoRWxlbWVudCkgbmwuaXRlbShpKTsKKwkJCU5vZGVMaXN0IGxvY2F0aW9ucyA9IHJlZ2lvbnMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgbG9jYXRpb25zLmdldExlbmd0aCgpOyBqKyspIHsKKwkJCQlFbGVtZW50IGVsID0gKEVsZW1lbnQpIGxvY2F0aW9ucy5pdGVtKGopOworCQkJCVN0cmluZyBpZCA9IGVsLmdldEF0dHJpYnV0ZSgiaWQiKS50b1VwcGVyQ2FzZSgpOyAvLyROT04tTkxTLTEkCisJCQkJU3RyaW5nIG5hbWUgPSBlbC5nZXRBdHRyaWJ1dGUoIm5hbWUiKS50b1VwcGVyQ2FzZSgpOyAvLyROT04tTkxTLTEkCisKKwkJCQkvLyBTdG9yZSBib3RoIHZhbHVlcyBmb3IgbGF0ZXIgbG9va3VwLiBVc2UgdXBwZXJjYXNlLgorCQkJCW5hbWVNYXAucHV0KGlkLCBuYW1lKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBuYW1lTWFwOworCX0KKworCS8qKgorCSAqIEZpbmQgYWxsIG1hdGNoZXMgYmV0d2VlbiBsb2NhdGlvbnMgYW5kIGZvcm0gYSBuZXcgdHVwbGUgd2l0aCB0aGUgbG9jYXRpb24KKwkgKiBuYW1lIGFuZCBhcmVhIHZhbHVlIGZvciBlYWNoIGxvY2F0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBtMQorCSAqICAgICAgICAgICAgQSBtYXAgY29udGFpbmluZyB0dXBsZXMgb2YgdGhlIGZvcm0gKGxvY2F0aW9uLGFyZWEpCisJICogQHBhcmFtIG0yCisJICogICAgICAgICAgICBBIG1hcCBjb250YWluaW5nIHR1cGxlcyBvZiB0aGUgZm9ybSAobG9jYXRpb24sbmFtZSkKKwkgKiBAcGFyYW0gbGV2ZWwKKwkgKiAgICAgICAgICAgIFRoZSBhZG1pbmlzdHJhdGl2ZSBsZXZlbAorCSAqIAorCSAqIHNAcmV0dXJuIEEgdHVwbGUgb2YgdGhlIGZvcm0gKG5hbWU6YXJlYSkKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG1hdGNoKE1hcCBtMSwgTWFwIG0yLCBpbnQgbGV2ZWwpIHsKKworCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKwkJU2V0IGtleXMgPSBtMS5rZXlTZXQoKTsKKwkJSXRlcmF0b3IgaXQxID0ga2V5cy5pdGVyYXRvcigpOworCisJCXdoaWxlIChpdDEuaGFzTmV4dCgpKSB7CisKKwkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdDEubmV4dCgpOworCisJCQlpZiAobTIuY29udGFpbnNLZXkoa2V5KSkgeyAvLyBUbyBiZSBtb3JlIHN0cmljdCwgY2hhbmdlIHRoaXMgdG8KKwkJCQkvLyBtMi5lcXVhbHMoa2V5KQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCisJCQkJCWlmICgoKFN0cmluZykgbTIuZ2V0KGtleSkpLnN0YXJ0c1dpdGgoIjoiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklnbm9yaW5nIG1hbGZvcm1lZCBlbnRyeSA6ICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkrIG0yLmdldChrZXkpKTsKKwkJCQkJfQorCisJCQkJCXJlc3VsdCA9IG0yLmdldChrZXkpICsgIjoiICsgU3RyaW5nLnZhbHVlT2YobGV2ZWwpICsgIjoiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCSsgbTEuZ2V0KGtleSkgKyAiXG4iOyAvLyROT04tTkxTLTEkCisJCQkJfSBlbHNlIHsKKwkJCQkJcmVzdWx0ICs9IG0yLmdldChrZXkpICsgIjoiICsgU3RyaW5nLnZhbHVlT2YobGV2ZWwpICsgIjoiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCSsgbTEuZ2V0KGtleSkgKyAiXG4iOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogUHJvY2VzcyBvdXIgZ2xvYmFsIGxpc3Qgb2YgY291bnRyaWVzIHdpdGggY3Jvc3MtcmVmZXJlbmNpbmcuCisJICogCisJICovCisJcHVibGljIHZvaWQgcHJvY2VzcygpIHsKKworCQlQcmludFdyaXRlciBvdXRwdXRGaWxlID0gbnVsbDsKKworCQkvLyBBZG1pbiBsZXZlbHMgZm9yIGVhY2ggY291bnRyeQorCQkvLyBUTyBETyA6IGZpeCB0aGlzIGhhcmQgY29kZWQgdmFsdWUuIFNob3VsZCBiZSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIuCisJCS8vIFBhdGggc2hvdWxkIGNvbnRhaW4gdGhlIGxvY2F0aW9uIG9mIHRoZSBTVEVNJ3MgMSBtYXBzIDogaXQgc2hvdWxkCisJCS8vIHRha2UgdmFsdWUgZnJvbSBwYXJhbWV0ZXIgaW5zdGVhZC4KKwkJZmluYWwgU3RyaW5nIHBhdGggPSAiQzpcXEVjbGlwc2VQcm9qZWN0c1xcd29ya3NwYWNlMlxcR3JlZW5TY3JlZW5cXEluc3RhbGxUZW1wbGF0ZVxcTWFwc1xcIjsgLy8kTk9OLU5MUy0xJAorCisJCWZpbmFsIGludCBMRVZFTFMgPSAxOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnRyaWVzTGlzdC5zaXplKCk7IGkrKykgeworCisJCQkvLyBHZXQgdGhlIG5leHQgY291bnRyeSBpbiB0aGUgbGlzdC4KKwkJCVN0cmluZyBjb3VudHJ5ID0gKChTdHJpbmcpIGNvdW50cmllc0xpc3QuZ2V0KGkpKS50cmltKCk7CisKKwkJCS8vIEdldCB0aGUgSVNPMzE2Ni0xIGluZm8gZm9yIHRoaXMgY291bnRyeQorCQkJSVNPQ29kZTEgaXNvQ29kZSA9IEdlblV0aWxzLmdldElTT0NvZGUoY291bnRyeSwgY29kZUxpc3QpOworCisJCQlpZiAoaXNvQ29kZSA9PSBudWxsKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJpc28gY29kZSBpcyBudWxsIGZvciAiICsgY291bnRyeSk7IC8vJE5PTi1OTFMtMSQKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VudHJ5IGlzIDogICIgKyBjb3VudHJ5ICsgIiBjb2RlID0gIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJKyBpc29Db2RlLmdldE5hbWUoKSk7CisKKwkJCS8vIE9wZW4gb3V0cHV0IGZpbGUKKwkJCWlmIChvdXRwdXRGaWxlID09IG51bGwpIHsKKwkJCQlTdHJpbmcgZmlsZU5hbWUgPSBvdXRwdXREaXI7CisJCQkJZmlsZU5hbWUgKz0gaXNvQ29kZS5nZXROYW1lKCkgKyAiX0FSRUEudHh0IjsgLy8kTk9OLU5MUy0xJAorCQkJCW91dHB1dEZpbGUgPSBHZW5VdGlscy5vcGVuV3JpdGVyKGZpbGVOYW1lKTsKKwkJCX0KKworCQkJZm9yIChpbnQgaiA9IDA7IGogPD0gTEVWRUxTOyBqKyspIHsKKwkJCQkvLyBPcGVuIHRoZSBzb3VyY2UgZGF0YSBmaWxlcyBmb3IgdGhpcyBjb3VudHJ5OgorCisJCQkJLy8gT3BlbiB0aGUgYXJlYSBmaWxlCisJCQkJU3RyaW5nIGFyZWFGaWxlID0gcGF0aDsKKwkJCQlhcmVhRmlsZSArPSBpc29Db2RlLmdldEFscGhhMygpICsgIl9BcmVhXyIgKyBqICsgIi54bWwiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlCdWZmZXJlZFJlYWRlciBhcmVhUmVhZGVyID0gR2VuVXRpbHMub3BlblJlYWRlcihhcmVhRmlsZSk7CisJCQkJaWYgKGFyZWFSZWFkZXIgPT0gbnVsbCkgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIGZvciA6ICIgKyBhcmVhRmlsZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJLy8gT3BlbiB0aGUgbmFtZXMgZmlsZQorCQkJCVN0cmluZyBuYW1lRmlsZSA9IHBhdGg7CisJCQkJbmFtZUZpbGUgKz0gaXNvQ29kZS5nZXRBbHBoYTMoKSArICJfTmFtZXNfIiArIGogKyAiLnhtbCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCUJ1ZmZlcmVkUmVhZGVyIG5hbWVSZWFkZXIgPSBHZW5VdGlscy5vcGVuUmVhZGVyKG5hbWVGaWxlKTsKKwkJCQlpZiAobmFtZVJlYWRlciA9PSBudWxsKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQgZm9yIDogIiArIG5hbWVGaWxlKTsgLy8kTk9OLU5MUy0xJAorCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQkvLyBMb2FkIHRoZSBYTUwgYXJlYSBhbmQgbmFtZXMgZG9jdW1lbnRzIGFuZCBleHRyYWN0IHRoZSBkYXRhIHdlCisJCQkJLy8gbmVlZAorCQkJCXRyeSB7CisJCQkJCWFyZWFNYXAgPSBleHRyYWN0QXJlYURhdGEoYXJlYUZpbGUpOworCQkJCQluYW1lTWFwID0gZXh0cmFjdE5hbWVEYXRhKG5hbWVGaWxlKTsKKwkJCQkJLy8gbm93IGRvIHRoZSBtYXRjaGluZ3MKKwkJCQkJU3RyaW5nIHR1cGxlID0gbWF0Y2goYXJlYU1hcCwgbmFtZU1hcCwgaik7CisJCQkJCS8vIHdyaXRlIG1hdGNoIHRvIG91dHB1dCBmaWxlLgorCQkJCQkvLyBBIG1hdGNoIGlzIGEgdHVwbGUgb2YgdGhlIGZvcm0gKG5hbWU6YXJlYSkKKwkJCQkJb3V0cHV0RmlsZS53cml0ZSh0dXBsZSk7CisJCQkJCS8vIENsb3NlIHRoZSByZXNvdXJjZXMKKwkJCQkJYXJlYVJlYWRlci5jbG9zZSgpOworCQkJCQluYW1lUmVhZGVyLmNsb3NlKCk7CisJCQkJCWFyZWFSZWFkZXIgPSBudWxsOworCQkJCQluYW1lUmVhZGVyID0gbnVsbDsKKwkJCQkJYXJlYUZpbGUgPSBudWxsOworCQkJCQluYW1lRmlsZSA9IG51bGw7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9IC8vIGZvciBqCisKKwkJCWlmIChvdXRwdXRGaWxlICE9IG51bGwpIHsKKwkJCQlvdXRwdXRGaWxlLmNsb3NlKCk7CisJCQkJb3V0cHV0RmlsZSA9IG51bGw7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBNYWluIGV4ZWN1dGlvbiBlbnRyeSBwb2ludC4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJZmluYWwgaW50IElTT19GSUxFID0gMDsKKwkJZmluYWwgaW50IENPVU5UUllfRklMRSA9IDE7CisJCWZpbmFsIGludCBPVVRQVVRfRElSID0gMjsKKwkJZmluYWwgaW50IFBBUkFNUyA9IDM7CisKKwkJaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tV3JvbmcgYXJndW1lbnRzLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRUbyBydW4sIHBsZWFzZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIDogIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBJU08gMzE2Ni0xIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IFRhcmdldCBjb3VudHJpZXMgZmlsZSIpOyAvLyROT04tTkxTLTEkCQkJCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgT3V0cHV0IGRpcmVjdG9yeSIpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCX0KKworCQlBcmVhRGF0YU1pZ3JhdG9yIG1pZ3JhdG9yID0gbmV3IEFyZWFEYXRhTWlncmF0b3IoYXJnc1tJU09fRklMRV0sCisJCQkJYXJnc1tDT1VOVFJZX0ZJTEVdLCBhcmdzW09VVFBVVF9ESVJdKTsKKwkJbWlncmF0b3IucnVuKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0FyZWFHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvQXJlYUdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOGYzNjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0FyZWFHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDEzOTMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBTVEVNIElJIERhdGEgTWlncmF0aW9uL0dlbmVyYXRpb24gVXRpbGl0aWVzIDogSW5zdGFuY2VzIG9mIHRoaXMgdXRpbGl0eSBjbGFzcworICogZ2VuZXJhdGUgdGhlIGFyZWEucHJvcGVydGllcyBmaWxlcyBmb3IgYWxsIGNvdW50cmllcy4KKyAqIAorICogCisgKiBUbyBjb25maWd1cmUsIHNlZSBjb25maWd1cmF0aW9uIGZpbGUgOgorICogb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vQXJlYUdlbmVyYXRvci5jb25maWcKKyAqIAorICogCisgKiBUbyBydW4sIGFkZCBwYXRoIHRvIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiB0aGUgcnVuIHByb2ZpbGUgKGkuZS4KKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcY29uZmlndXJhdGlvblxBcmVhR2VuZXJhdG9yLmNvbmZpZykKKyAqIAorICogCisgKiBTRVQgVk1BUkdTIFRPIDogLVhtczEwMjRtIC1YbXgxMDI0bQorICogCisgKi8KKworcHVibGljIGNsYXNzIEFyZWFHZW5lcmF0b3IgeworCisJcHJpdmF0ZSBTdHJpbmcgaXNvMzE2Nl8xID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIGlzbzMxNjZfMiA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBmaXhGaWxlID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIHRhcmdldEZpbGUgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgYXJlYURhdGEgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgcG9seWdvbkFyZWFEYXRhID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIGxleERpciA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBvdXRwdXREaXIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgd29ya3NwYWNlID0gbnVsbDsKKworCS8qKgorCSAqIExpc3RzIGZvciBJU08gMzE2Ni0xIGNvZGVzLCB0YXJnZXQgY291bnRyaWVzLCBhbmQgcG9wdWxhdGlvbiBkYXRhLgorCSAqLworCisJTGlzdCB0YXJnZXRMaXN0ID0gbnVsbDsKKworCUxpc3QgY29kZUxpc3QgPSBudWxsOworCisJTGlzdCBjb2RlZml4TGlzdCA9IG51bGw7CisKKwlMaXN0IGFyZWFMaXN0ID0gbnVsbDsKKworCUxpc3QgbGV2ZWwxUG9seWdvbkFyZWFMaXN0ID0gbnVsbDsKKworCUxpc3QgbGV2ZWwyUG9seWdvbkFyZWFMaXN0ID0gbnVsbDsKKworCUxpc3QgdXNhTGV2ZWwyTGlzdCA9IG51bGw7CisKKwkvKioKKwkgKiBIYXNoIHNldCBmb3Igc3RvcmluZyB0aGUgc291cmNlIFVSTHMgcmVsZXZhbnQgdG8gYXJlYSBkYXRhLgorCSAqLworCVNldDxTdHJpbmc+IHVybFNldCA9IG51bGw7CisKKwkvKioKKwkgKiBIYXNoIG1hcCB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIHNvdXJjZXMgd2lsbCBiZSBzaG93biBjb21tZW50ZWQgb3V0IGFuZAorCSAqIHdoaWNoIHdpbGwgYXBwZWFyIGFjdGl2ZS4KKwkgKi8KKwlIYXNoTWFwPFN0cmluZywgQm9vbGVhbj4gdXJsU3RhdHVzID0gbnVsbDsKKworCS8qKgorCSAqIFN0cmluZyB1c2VkIHRvIGluZGljYXRlIGRlZmF1bHQgdmFsdWUgZm9yIHVua25vd24gYXJlYXMuCisJICovCisJU3RyaW5nIERFRkFVTFQgPSAiMCI7IC8vJE5PTi1OTFMtMSQJCisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqIAorCSAqIEBwYXJhbSBpc28zMTY2XzEgLQorCSAqICAgICAgICAgICAgZGF0YSBmaWxlIHdpdGggdGhlIElTTzMxNjYtMSBBTFBIQV8yIGFuZCBBTFBIQV8zIGNvZGVzLgorCSAqIEBwYXJhbSBpc28zMTY2XzIgLQorCSAqICAgICAgICAgICAgZmlsZSB3aXRoIHRoZSBJU08zMTY2LTIgZGF0YSB1c2VkIGZvciBnZW5lcmF0aW5nIHRoZSBJRHMuCisJICogQHBhcmFtIGZpeEZpbGUgLQorCSAqICAgICAgICAgICAgZmlsZSBjb250YWluaW5nIG1pc3NpbmcgSVNPMzE2Ni0yIGNvZGVzCisJICogQHBhcmFtIGFyZWFEYXRhIC0KKwkgKiAgICAgICAgICAgIGRpcmVjdG9yeSBjb25haW5pbmcgYXJlYWQgZGF0YSBmb3IgZWFjaCBjb3VudHJ5IGluIGRhdGEgc2V0LgorCSAqIEBwYXJhbSB0YXJnZXRGaWxlIC0KKwkgKiAgICAgICAgICAgIGRhdGEgZmlsZSB3aGVyZSB3ZSBmaW5kIGEgbGlzdCBvZiBjb3VudHJpZXMgZm9yIGdlbmVyYXRpb24gb2YKKwkgKiAgICAgICAgICAgIHRoZWlyIGNvcnJlc3BvbmRpbmcgYXJlYS5wcm9wZXJ0aWVzIGZpbGVzLgorCSAqIEBwYXJhbSBwb2x5Z29uQXJlYURhdGEgLQorCSAqICAgICAgICAgICAgdGhlIHBhdGggdG8gYXJlYSBkYXRhIGluIHBvbHlnb24gdW5pdHMKKwkgKiBAcGFyYW0gbGV4RGlyCisJICogICAgICAgICAgICBmb2xkZXIgY29udGFpbmluZyBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgZmlsZXMKKwkgKiBAcGFyYW0gb3V0cHV0RGlyIC0KKwkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGUgZmlsZXMgZ2VuZXJhdGVkLgorCSAqIAorCSAqLworCS8vIHB1YmxpYyBBcmVhR2VuZXJhdG9yKFN0cmluZyBpc28zMTY2XzEsIFN0cmluZyBpc28zMTY2XzIsIFN0cmluZyBmaXhGaWxlLAorCS8vIFN0cmluZyBhcmVhRGF0YSwgU3RyaW5nIHRhcmdldEZpbGUsIFN0cmluZyBwb2x5Z29uQXJlYURhdGEsCisJLy8gU3RyaW5nIGxleERpciwgU3RyaW5nIG91dHB1dERpcikgeworCS8vIC8vIFNldCB2YWx1ZXMgb2YgZ2xvYmFsIHZhcmlhYmxlcy4KKwkvLyB0aGlzLmlzbzMxNjZfMSA9IGlzbzMxNjZfMTsKKwkvLyB0aGlzLmlzbzMxNjZfMiA9IGlzbzMxNjZfMjsKKwkvLyB0aGlzLmZpeEZpbGUgPSBmaXhGaWxlOworCS8vIHRoaXMudGFyZ2V0RmlsZSA9IHRhcmdldEZpbGU7CisJLy8gdGhpcy5hcmVhRGF0YSA9IGFyZWFEYXRhOworCS8vIHRoaXMucG9seWdvbkFyZWFEYXRhID0gcG9seWdvbkFyZWFEYXRhOworCS8vIHRoaXMubGV4RGlyID0gbGV4RGlyOworCS8vIHRoaXMub3V0cHV0RGlyID0gb3V0cHV0RGlyOworCS8vIHRhcmdldExpc3QgPSBudWxsOworCS8vIC8vIFNldCB0aGUgVVJMIElEcyB0aGF0IGFyZSByZWxldmFudCBmb3IgYXJlYSBkYXRhLgorCS8vIGluaXRBcmVhVVJMU2V0KCk7CisJLy8gLy8gU2V0IHdoaWNoIFVSTHMgYXJlIGFjdGl2ZSBhbmQgd2hpY2ggb25lcyBzaG91bGQgYmUgY29tbWVudGVkIG91dC4KKwkvLyBzZXRVUkxTdGF0dXMoKTsKKwkvLworCS8vIH0KKwkvKioKKwkgKiBAcGFyYW0gY29uZmlnRmlsZQorCSAqLworCXB1YmxpYyBBcmVhR2VuZXJhdG9yKFN0cmluZyBjb25maWdGaWxlKSB7CisKKwkJLy8gTG9hZCBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKKwkJSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFycyA9IEdlblV0aWxzLmxvYWRDb25maWdGaWxlKGNvbmZpZ0ZpbGUpOworCisJCVNldDxTdHJpbmc+IGtleXMgPSB2YXJzLmtleVNldCgpOworCQlJdGVyYXRvciBpdCA9IGtleXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJU3RyaW5nIHZhciA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKworCQkJLy8gQXNzaWduIHZhbHVlcyB0byBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyA6CisJCQlpZiAodmFyLmVxdWFscygiV09SS1NQQUNFIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXdvcmtzcGFjZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIklTTzMxNjZfMSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpc28zMTY2XzEgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJJU08zMTY2XzIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJaXNvMzE2Nl8yID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiSVNPX0ZJWCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlmaXhGaWxlID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiVEFSR0VUX0xJU1QiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJdGFyZ2V0RmlsZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIlBPTFlHT05fQVJFQVMiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJcG9seWdvbkFyZWFEYXRhID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiQVJFQV9QT1AiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJYXJlYURhdGEgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJMRVhfRElSIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWxleERpciA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIlBST1BFUlRJRVNfT1VUUFVUIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCW91dHB1dERpciA9IHZhcnMuZ2V0KHZhcik7CisJCQl9CisKKwkJfSAvLyB3aGlsZQorCisJCS8vIFRoZSB3b3Jrc3BhY2UgdmFyaWFibGUgc2hvdWxkIGVuZCB3aXRoIGEgc2xhc2ggY2hhcmFjdGVyCisJCWlmICh3b3Jrc3BhY2UuZW5kc1dpdGgoIlxcIikgPT0gZmFsc2UpIHsgLy8kTk9OLU5MUy0xJAorCQkJd29ya3NwYWNlICs9ICJcXCI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCVN0cmluZyBwYXRoID0gd29ya3NwYWNlICsgR2VuQ29uc3RhbnRzLlBBUkFNU19ESVI7CisKKwkJLy8gU2V0IHJlbWFpbmluZyBjb25maWcgdmFycyB1c2luZyBXT1JLU1BBQ0UgKHdvcmtzcGFjZSByZWxhdGl2ZSkKKwkJaWYgKGlzbzMxNjZfMSA9PSBudWxsKSB7CisJCQlpc28zMTY2XzEgPSBwYXRoICsgR2VuQ29uc3RhbnRzLklTTzMxNjZfMV9GSUxFOworCQl9CisJCWlmIChpc28zMTY2XzIgPT0gbnVsbCkgeworCQkJaXNvMzE2Nl8yID0gcGF0aCArIEdlbkNvbnN0YW50cy5JU08zMTY2XzJfRklMRTsKKwkJfQorCQlpZiAoZml4RmlsZSA9PSBudWxsKSB7CisJCQlmaXhGaWxlID0gcGF0aCArIEdlbkNvbnN0YW50cy5JU09GSVhfRklMRTsKKwkJfQorCQlpZiAodGFyZ2V0RmlsZSA9PSBudWxsKSB7CisJCQl0YXJnZXRGaWxlID0gcGF0aCArIEdlbkNvbnN0YW50cy5HUk9VUEVEX0NPVU5UUklFUzsKKwkJfQorCQlpZiAocG9seWdvbkFyZWFEYXRhID09IG51bGwpIHsKKwkJCXBvbHlnb25BcmVhRGF0YSA9IHBhdGggKyBHZW5Db25zdGFudHMuUE9MWUdPTl9BUkVBU19ESVI7CisJCX0KKwkJaWYgKGFyZWFEYXRhID09IG51bGwpIHsKKwkJCWFyZWFEYXRhID0gcGF0aCArIEdlbkNvbnN0YW50cy5BUkVBX1BPUFVMQVRJT05fRElSOworCQl9CisJCWlmIChsZXhEaXIgPT0gbnVsbCkgeworCQkJbGV4RGlyID0gcGF0aCArIEdlbkNvbnN0YW50cy5MRVhfRElSOworCQl9CisJCWlmIChvdXRwdXREaXIgPT0gbnVsbCkgeworCQkJb3V0cHV0RGlyID0gd29ya3NwYWNlICsgR2VuQ29uc3RhbnRzLlBST1BFUlRJRVNfT1VUUFVUX0RJUjsKKwkJfQorCisJCXRhcmdldExpc3QgPSBudWxsOworCQkvLyBTZXQgdGhlIFVSTCBJRHMgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIGFyZWEgZGF0YS4KKwkJaW5pdEFyZWFVUkxTZXQoKTsKKwkJLy8gU2V0IHdoaWNoIFVSTHMgYXJlIGFjdGl2ZSBhbmQgd2hpY2ggb25lcyBzaG91bGQgYmUgY29tbWVudGVkIG91dC4KKwkJc2V0VVJMU3RhdHVzKCk7CisKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBVUkwgSURzIHJlbGV2YW50IGZvciBhcmVhIGRhdGEuIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gVVJMcworCSAqIHdpdGggSUQgPSBESVZBLiBUaGlzIGNhbiBiZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBkYXRhLiBGb3IKKwkgKiBleGFtcGxlLCBmb3IgcG9wdWxhdGlvbiBkYXRhLCB3ZSBhcmUgaW50ZXJlc3RlZCBvbiBJRCA9IENJQQorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXRBcmVhVVJMU2V0KCkgeworCQl1cmxTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCXVybFNldC5hZGQobmV3IFN0cmluZygiQ0lBIikpOyAvLyROT04tTkxTLTEkCisJCXVybFNldC5hZGQobmV3IFN0cmluZygiVVNDRU5TVVNBUkVBIikpOyAvLyROT04tTkxTLTEkCisJCXVybFNldC5hZGQobmV3IFN0cmluZygiVVNDRU5TVVNCT1VORFMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJdXJsU2V0LmFkZChuZXcgU3RyaW5nKCJVU0NFTlNVU1BVRVJUT1JJQ08iKSk7IC8vJE5PTi1OTFMtMSQKKwkJdXJsU2V0LmFkZChuZXcgU3RyaW5nKCJDSVRZUE9QVUxBVElPTiIpKTsgLy8kTk9OLU5MUy0xJAorCQl1cmxTZXQuYWRkKG5ldyBTdHJpbmcoIlVOSVRFRE5BVElPTlMiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBTZXQgd2hpY2ggVVJMIGFwcGVhcnMgYXMgdW5jb21tZW50ZWQgb3IgQUNUSVZFIGFuZCB3aGljaCBvbmVzIGFwcGVhciBhcworCSAqIGNvbW1lbnRlZCBvdXQgb3IgU0VDT05EQVJZLiBPbmx5IFVSTCBzaG91bGQgYmUgYWN0aXZlLiBBbGwgb3RoZXJzIHNob3VsZAorCSAqIGFwcGVhciBjb21tZW50ZWQuCisJICogCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0VVJMU3RhdHVzKCkgeworCQl1cmxTdGF0dXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+KCk7CisJCS8vIFRoaXMgd2lsbCBiZSB0aGUgYWN0aXZlIFVSTC4KKwkJdXJsU3RhdHVzLnB1dCgiQ0lBIiwgbmV3IEJvb2xlYW4odHJ1ZSkpOyAvLyROT04tTkxTLTEkCisJCS8vIEFsbCBvdGhlciBVUkxzIGFwcGVhciBhcyBjb21tZW50ZWQgb3V0LCBzZWNvbmRhcnkuCisJCXVybFN0YXR1cy5wdXQoIlVTQ0VOU1VTQVJFQSIsIG5ldyBCb29sZWFuKGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKKwkJdXJsU3RhdHVzLnB1dCgiVVNDRU5TVVNCT1VORFMiLCBuZXcgQm9vbGVhbihmYWxzZSkpOyAvLyROT04tTkxTLTEkCisJCXVybFN0YXR1cy5wdXQoIlVTQ0VOU1VTUFVFUlRPUklDTyIsIG5ldyBCb29sZWFuKGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKKwkJdXJsU3RhdHVzLnB1dCgiQ0lBIiwgbmV3IEJvb2xlYW4oZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAorCQl1cmxTdGF0dXMucHV0KCJDSVRZUE9QVUxBVElPTiIsIG5ldyBCb29sZWFuKGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKKwkJdXJsU3RhdHVzLnB1dCgiVU5JVEVETkFUSU9OUyIsIG5ldyBCb29sZWFuKHRydWUpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNldHMgdXAgYW5kIHJ1bnMgdGhpcyBnZW5lcmF0b3IuCisJICogCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgY291bnRyaWVzIHdlIHdhbnQuCisJCXRhcmdldExpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QodGFyZ2V0RmlsZSk7CisKKwkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBJU08zMTY2LTEgQUxQSEEyLCBBTFBIQTMsIGFuZAorCQkvLyBudW1lcmljIGNvZGVzLgorCQljb2RlTGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdChpc28zMTY2XzEpOworCisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgbWlzc2luZyBJU08zMTY2LTIgY29kZXMKKwkJY29kZWZpeExpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QoZml4RmlsZSk7CisKKwkJLy8gVEhJUyBJUyBBTiBTUEVDSUFMIENBU0UuCisJCS8vIEZPUiBUSEUgVVNBIE9OTFksIFdFIEhBVkUgVEhFIExFVkVMIDIgREFUQSBGT1IgQUxMIENPVU5USUVTLgorCQl1c2FMZXZlbDJMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KEdlbkNvbnN0YW50cy5VU0FfTEVWRUxfMl9BUkVBKTsKKworCQkvLyBOb3csIHByb2Nlc3MgZWFjaCBpdGVtIGluIHRoZSB0YXJnZXQgbGlzdC4KKwkJcHJvY2VzcygpOworCX0KKworCS8qKgorCSAqIFByb2Nlc3Mgb3VyIGdsb2JhbCBsaXN0IG9mIHRhcmdldCBjb3VudHJpZXMuIEZvciBlYWNoIGNvdW50cnkgaW4gbGlzdCwKKwkgKiBnZW5lcmF0ZSBpdHMgYXJlYS5wcm9wZXJ0aWVzIGZpbGUuCisJICogCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJvY2VzcygpIHsKKworCQlmaW5hbCBpbnQgTEVWRUxfMSA9IDE7CisJCWZpbmFsIGludCBMRVZFTF8yID0gMjsKKworCQkvLyBBIHdyaXRlciBmb3IgdGhlIG5ldyBmaWxlIHdlIGFyZSBjcmVhdGluZy4KKwkJUHJpbnRXcml0ZXIgcHJvcGVydGllc0ZpbGUgPSBudWxsOworCisJCS8vIE9iamVjdCBob2xkaW5nIElTTzMxNjYtMSByZWxhdGVkIGRhdGEuCisJCUlTT0NvZGUxIGlzb0NvZGUgPSBudWxsOworCisJCS8vIE5hbWUgb2YgdGhlIG5ldyBwcm9wZXJ0aWVzIGZpbGUuCisJCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7CisKKwkJLy8gQSBsaXN0IGZvciBJU08gMzE2Ni0yIG9iamVjdHMKKwkJTGlzdCBpc28yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKworCQkvLyBMZXZlbCAwIGFyZWEgaW4gc3F1YXJlIGtpbG9tZXRlcnMKKwkJU3RyaW5nIGxldmVsMEFyZWFTcUttID0gbnVsbDsKKworCQkvLyBBZ2dyZWdhdGUgcG9seWdvbiBhcmVhIGZvciBsZXZlbCAxCisJCVN0cmluZyBhZ2dyZWdhdGVMZXZlbDFQb2x5Z29uQXJlYSA9IG51bGw7CisKKwkJLy8gVmFsdWUgdXNlZCBhcyBkZWZhdWx0IHRvIGNvbXB1dGUgdGhlCisJCS8vIGFwcHJveGltYXRlIGFyZWEgb2YgYW4gdW5rbm93biBsb2NhdGlvbgorCQlTdHJpbmcgZGVmYXVsdEFyZWFTcUttID0gREVGQVVMVDsKKwkJU3RyaW5nIGRlZmF1bHRQb2x5Z29uQXJlYSA9IERFRkFVTFQ7CisKKwkJLy8gRmlsZW5hbWVzIGZvciBsZXgxIGFuZCBsZXgyIGZpbGVzIGZvciBhIGdpdmVuIGNvdW50cnkuCisJCVN0cmluZyBsZXhBZG1pbjFGaWxlID0gbnVsbDsKKwkJU3RyaW5nIGxleEFkbWluMkZpbGUgPSBudWxsOworCisJCS8vIExpc3RzIGhvbGRpbmcgdGhlIGxleDEgYW5kIGxleDIgdmFsdWVzLgorCQkvLyBOT1RFOiBsZXggdmFsdWVzIGFyZSB0aGUgbGV4aWNvZ3JhcGhpY2FsbHkgc29ydGVkIHZhbHVlcyBmb3IKKwkJLy8gYWRtaW5pc3RyYXRpb24gbGV2ZWxzLgorCQlMaXN0PFN0cmluZz4gbGV4MURhdGFTZXQgPSBudWxsOworCQlMaXN0PFN0cmluZz4gbGV4MkRhdGFTZXQgPSBudWxsOworCisJCS8vIExpc3RzIGZvciBob2xkaW5nIGxleDEgYW5kIGxleDIgb2JqZWN0cyBmb3IgYSBnaXZlbiBjb3VudHJ5LgorCQlMaXN0PExleDFPYmo+IGxleDFMaXN0ID0gbnVsbDsKKwkJTGlzdDxMZXgyT2JqPiBsZXgyTGlzdCA9IG51bGw7CisKKwkJaW50IHNpemUgPSB0YXJnZXRMaXN0LnNpemUoKTsKKworCQkvLyBJdGVyYXRlIGZvciBldmVyeSBjb3VudHJ5IGFuZCBjcmVhdGUgaXRzIG5hbWVzLnByb3BlcnRpZXMgZmlsZS4KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKworCQkJLy8gR2V0IHRoZSBuZXh0IGNvdW50cnkgaW4gdGhlIGxpc3QuCisJCQlTdHJpbmcgZmlsZSA9ICgoU3RyaW5nKSB0YXJnZXRMaXN0LmdldChpKSkudHJpbSgpOworCisJCQkvLyBBbiBpbmRleCBmb3IgdW5rbndvbiBvciBuLmEuIGVudHJpZXMKKwkJCWludCB1bmtDb3VudGVyID0gMTsKKworCQkJLy8gT3BlbiB0aGUgZGF0YSBzb3VyY2UgZmlsZSBmb3IgdGhpcyBjb3VudHJ5LgorCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gR2VuVXRpbHMub3BlblJlYWRlcihmaWxlKTsKKworCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRcdDw8PDwgQVJFQSBHRU5FUkFUT1IgLS0gUHJvY2Vzc2luZyBjb3VudHJ5IDogIiArIGZpbGUgKyAiID4+Pj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQl0cnkgeworCisJCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7CisKKwkJCQkJU3RyaW5nIGJ1ZmZlciA9IG51bGw7CisJCQkJCS8vIERlc2NyaWJlcyBsZXZlbAorCQkJCQkvLyBvZiBkYXRhIHdlCisJCQkJCS8vIGFyZSBub3cgcHJvY2Vzc2luZyA6IExFVkVMMCwgTEVWRUwxLCBvciBMRVZFTDIuCisJCQkJCWludCBsZXZlbCA9IC0xOworCisJCQkJCS8vIFJlY29yZCB0aGUgcHJldmlvdXMgbGV2ZWwuCisJCQkJCWludCBvbGRMZXZlbCA9IGxldmVsIC0gMTsKKworCQkJCQkvLyBXZSB0YWtlIGEgY2h1bmsgb2YgdGhlIGRhdGEgW0JVRkZFUl9NSU4sQlVGRkVSX01BWF0gdG8KKwkJCQkJLy8gbWFrZSBwcm9jZXNzaW5nIG1vcmUKKwkJCQkJLy8gZWZmaWNpZW50LCB3ZSBkb250IG5lZWQgYWxsIG9mIGl0LgorCQkJCQlpbnQgQlVGRkVSX01JTiA9IDA7CisJCQkJCWludCBCVUZGRVJfTUFYID0gMTIwOworCisJCQkJCUxpc3Q8U3RyaW5nPiBlbnRyeUxpc3QgPSBudWxsOworCisJCQkJCXdoaWxlIChHZW5VdGlscy5FT0YoYnVmZmVyID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IHRydWUpIHsKKworCQkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgd2UgbWFyayBhbGwgdW5rbm93biBkYXRhLgorCQkJCQkJYnVmZmVyID0gYnVmZmVyLnJlcGxhY2UoIiwsIiwgIixVTktOT1dOLCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCQkJLy8gVXNlIG9ubHkgcGFydCBvZiB0aGUgYnVmZmVyLCBub3QgYWxsIG9mIGl0IGZvcgorCQkJCQkJLy8gZWZmaWNpZW55LgorCQkJCQkJU3RyaW5nW10gaXRlbXMgPSBHZW5VdGlscworCQkJCQkJCQkuZXh0cmFjdChidWZmZXIubGVuZ3RoKCkgPCBCVUZGRVJfTUFYID8gYnVmZmVyCisJCQkJCQkJCQkJOiBidWZmZXIuc3Vic3RyaW5nKEJVRkZFUl9NSU4sCisJCQkJCQkJCQkJCQlCVUZGRVJfTUFYKSk7CisKKwkJCQkJCS8vIEdldCB0aGUgSVNPMzE2Ni0xIGluZm8gZm9yIHRoaXMgY291bnRyeQorCQkJCQkJaWYgKGlzb0NvZGUgPT0gbnVsbCkgeworCQkJCQkJCWlzb0NvZGUgPSBHZW5VdGlscy5nZXRJU09Db2RlKAorCQkJCQkJCQkJaXRlbXNbSVNPRGF0YS5DT1VOVFJZX05BTUVdLCBjb2RlTGlzdCk7CisJCQkJCQl9CisKKwkJCQkJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgYXJlYSBkYXRhCisJCQkJCQkvLyBmb3IgdGhpcyBjb3VudHJ5LgorCQkJCQkJaWYgKGFyZWFMaXN0ID09IG51bGwpIHsKKwkJCQkJCQlTdHJpbmcgbmFtZSA9IGFyZWFEYXRhICsgaXNvQ29kZS5nZXROYW1lKCkKKwkJCQkJCQkJCSsgIl9BUkVBLnR4dCI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlhcmVhTGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdChuYW1lKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gR2V0IHRoZSBsZXZlbCBvZiB0aGUgZGF0YSB3ZSBhcmUgcHJvY2Vzc2luZy4KKwkJCQkJCWxldmVsID0gR2VuVXRpbHMuZ2V0RGF0YUxldmVsKGl0ZW1zKTsKKworCQkJCQkJaWYgKGxldmVsICE9IDAgJiYgaXNvMkxpc3QgIT0gbnVsbCkgeworCQkJCQkJCS8vIExvYWQgdGhlIElTTyAzMTY2LTIgb2JqZWN0cyBmb3IgdGhpcyBjb3VudHJ5CisJCQkJCQkJaXNvMkxpc3QgPSBHZW5VdGlscy5sb2FkSVNPMihpc28zMTY2XzIpOworCQkJCQkJfQorCisJCQkJCQkvLyBUaGlzIHZhcmlhYmxlIGluZGljYXRlcyBhIHRyYW5zaXRpb24gaW4gb3VyIGRhdGEKKwkJCQkJCS8vIHByb2Nlc3NpbmcKKwkJCQkJCWJvb2xlYW4gdHJhbnNpdGlvbiA9IChsZXZlbCAhPSBvbGRMZXZlbCkgPyB0cnVlIDogZmFsc2U7CisKKwkJCQkJCS8vIFZhcmlhYmxlIHVzZWQgdG8gaG9sZCB0aGUgZm9ybWF0dGVkIG91dHB1dCBkYXRhLgorCQkJCQkJU3RyaW5nIGRhdGEgPSBudWxsOworCisJCQkJCQkvLyBUaGUgY3VycmVudCBlbnRpdHkgd2UgYXJlIGRlYWxpbmcgd2l0aC4KKwkJCQkJCS8vIEJhc2VkIG9uIGl0cyBhZG1pbiBsZXZlbCBpdCBjYW4gYmUgYSBjb3VudHJ5LCBhCisJCQkJCQkvLyBjb3VudHksIGV0YzsKKwkJCQkJCVN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworCQkJCQkJLy8gRGVzY3JpcHRvciBmb3IgY3VycmVudCBlbnRyeS4KKwkJCQkJCVN0cmluZyBkZXNjcmlwdG9yID0gbnVsbDsKKworCQkJCQkJaWYgKHRyYW5zaXRpb24gPT0gdHJ1ZSkgeworCQkJCQkJCS8vIEtlZXAgdHJhY2sgb2YgcHJldmlvdXMgbGV2ZWwgaW4gb3JkZXIgdG8gZGV0ZWN0CisJCQkJCQkJLy8gdHJhbnNpdGlvbnMuCisJCQkJCQkJb2xkTGV2ZWwgPSBsZXZlbDsKKwkJCQkJCQkvLyBSZXNldCBvdXIgcmVwZWF0ZWQgaGlzdG9yeQorCQkJCQkJCWlmIChlbnRyeUxpc3QgIT0gbnVsbCkgeworCQkJCQkJCQllbnRyeUxpc3QuY2xlYXIoKTsKKwkJCQkJCQl9CisJCQkJCQkJZW50cnlMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKwkJCQkJCQkvLyBSZXNldCBjb3VudGVyIG9mIFVOS05PV04gYW5kIE4uQS4gZW50cmllcy4KKwkJCQkJCQl1bmtDb3VudGVyID0gMTsKKwkJCQkJCQkvLyBDbG9zZSBwcmV2aW91cyBmaWxlIGlmIGl0IGlzIHN0aWxsIG9wZW4uCisJCQkJCQkJaWYgKHByb3BlcnRpZXNGaWxlICE9IG51bGwpIHsKKwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0PDxHZW5lcmF0ZWQgOiAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGZpbGVOYW1lICsgIj4+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJcHJvcGVydGllc0ZpbGUuY2xvc2UoKTsKKwkJCQkJCQkJcHJvcGVydGllc0ZpbGUgPSBudWxsOworCQkJCQkJCQlmaWxlTmFtZSA9IG51bGw7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBsZXZlbCAxCisJCQkJCQkJLy8gYXJlYSBkYXRhCisJCQkJCQkJLy8gaW4gcG9seWdvbiB1bml0cyBmb3IgdGhpcyBjb3VudHJ5LgorCQkJCQkJCWlmIChsZXZlbDFQb2x5Z29uQXJlYUxpc3QgPT0gbnVsbCAmJiBsZXZlbCA9PSAxKSB7CisKKwkJCQkJCQkJLy8gTG9hZCB0aGUgcG9seWdvbiBhcmVhIGRhdGEgZm9yIGxldmVsIDEuCisJCQkJCQkJCVN0cmluZyBuYW1lID0gcG9seWdvbkFyZWFEYXRhCisJCQkJCQkJCQkJKyBpc29Db2RlLmdldEFscGhhMygpCisJCQkJCQkJCQkJKyAiXFwiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGlzb0NvZGUuZ2V0QWxwaGEzKCkKKwkJCQkJCQkJCQkrICJfMV9QT0xZQVJFQS50eHQiOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCQkJLy8gTG9hZCBsZXZlbCAxIHBvbHlnb24gYXJlYSBsaXN0CisJCQkJCQkJCWxldmVsMVBvbHlnb25BcmVhTGlzdCA9IEdlblV0aWxzCisJCQkJCQkJCQkJLnBvcHVsYXRlTGlzdChuYW1lKTsKKworCQkJCQkJCQkvLyBGaW5kIHRoZSBsZXZlbCAwIGFyZWEgaW4gc3F1YXJlIGtpbG9tZXRlcnMKKwkJCQkJCQkJbGV2ZWwwQXJlYVNxS20gPSBnZXRBcmVhKAorCQkJCQkJCQkJCWl0ZW1zW0lTT0RhdGEuQ09VTlRSWV9OQU1FXSwKKwkJCQkJCQkJCQlpdGVtc1tJU09EYXRhLkNPVU5UUllfTkFNRV0sIGFyZWFMaXN0LAorCQkJCQkJCQkJCTApOworCisJCQkJCQkJCS8vIEZpbmQgdGhlIGFnZ3JlZ2F0ZSBwb2x5Z29uIGFyZWEgZm9yIGxldmVsIDEKKwkJCQkJCQkJYWdncmVnYXRlTGV2ZWwxUG9seWdvbkFyZWEgPSBnZXRBZ2dyZWdhdGVBcmVhKGxldmVsMVBvbHlnb25BcmVhTGlzdCk7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBsZXZlbCAyCisJCQkJCQkJLy8gYXJlYSBkYXRhCisJCQkJCQkJLy8gaW4gcG9seWdvbiB1bml0cyBmb3IgdGhpcyBjb3VudHJ5LgorCQkJCQkJCWlmIChsZXZlbDJQb2x5Z29uQXJlYUxpc3QgPT0gbnVsbCAmJiBsZXZlbCA9PSAyKSB7CisKKwkJCQkJCQkJLy8gTG9hZCB0aGUgcG9seWdvbiBhcmVhIGRhdGEgZm9yIGxldmVsIDIuCisJCQkJCQkJCVN0cmluZyBuYW1lID0gcG9seWdvbkFyZWFEYXRhCisJCQkJCQkJCQkJKyBpc29Db2RlLmdldEFscGhhMygpCisJCQkJCQkJCQkJKyAiXFwiICsgaXNvQ29kZS5nZXRBbHBoYTMoKSAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyAiXzJfUE9MWUFSRUEudHh0IjsgLy8kTk9OLU5MUy0xJAorCisJCQkJCQkJCWxldmVsMlBvbHlnb25BcmVhTGlzdCA9IEdlblV0aWxzCisJCQkJCQkJCQkJLnBvcHVsYXRlTGlzdChuYW1lKTsKKworCQkJCQkJCX0KKworCQkJCQkJfQorCisJCQkJCQkvLyBJZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IGZvciB0aGlzIGNvdW50cnksCisJCQkJCQkvLyBjcmVhdGUgaXQgdXNpbmcgSVNPIGFscGhhMyBjb2RlLgorCQkJCQkJRmlsZSBjb3VudHJ5RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyCisJCQkJCQkJCSsgaXNvQ29kZS5nZXRBbHBoYTMoKSk7CisKKwkJCQkJCWlmIChjb3VudHJ5RGlyICE9IG51bGwgJiYgY291bnRyeURpci5leGlzdHMoKSA9PSBmYWxzZSkgeworCQkJCQkJCS8vIERpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gQ3JlYXRlIGl0LgorCQkJCQkJCWNvdW50cnlEaXIubWtkaXIoKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gQ3JlYXRlIGFuZCBvcGVuIHRoZSBuZXcgZmlsZS4KKwkJCQkJCWlmIChwcm9wZXJ0aWVzRmlsZSA9PSBudWxsKSB7CisJCQkJCQkJLy8gQ3JlYXRlIHRoZSBmaWxlIG5hbWUgZm9yIHRoZSBuZXcgcHJvcGVydGllcy5maWxlLgorCQkJCQkJCWZpbGVOYW1lID0gY291bnRyeURpciArICJcXCIgKyBpc29Db2RlLmdldEFscGhhMygpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCSsgIl8iICsgbGV2ZWwgKyAiXyIgKyAiYXJlYS5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkJCQkvLyBDcmVhdGUgdG5lIG5ldyBwcm9wZXJ0aWVzLmZpbGUgZm9yIHRoaXMgY291bnRyeS4KKwkJCQkJCQlwcm9wZXJ0aWVzRmlsZSA9IEdlblV0aWxzLm9wZW5Xcml0ZXIoZmlsZU5hbWUpOworCQkJCQkJfQorCisJCQkJCQkvLyBJZiB3ZSBoYXZlIHN3aXRjaGVkIHRvIGEgZGlmZmVyZW50IGRhdGEgbGV2ZWwgKGksZSwKKwkJCQkJCS8vIGFkbWluIDAgdG8gYWRtaW4gMSkKKwkJCQkJCWlmICh0cmFuc2l0aW9uID09IHRydWUpIHsKKwkJCQkJCQkvLyBKdXN0IGFkZCB0aGUgaGVhZGVyLgorCQkJCQkJCWRhdGEgPSBnZXRIZWFkZXIoaXNvQ29kZSwgbGV2ZWwpOworCQkJCQkJCUdlblV0aWxzLmFkZERhdGEocHJvcGVydGllc0ZpbGUsIGRhdGEpOworCQkJCQkJCS8vIEZvcmdldCB0aGUgZGF0YSB3ZSBqdXN0IHdyb3RlLgorCQkJCQkJCWRhdGEgPSBudWxsOworCQkJCQkJfQorCisJCQkJCQlzd2l0Y2ggKGxldmVsKSB7CisKKwkJCQkJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzA6CisKKwkJCQkJCQlpZiAodHJhbnNpdGlvbiA9PSB0cnVlKSB7CisJCQkJCQkJCWRhdGEgPSAiIyBDb3VudHJ5XG4iOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCWRhdGEgKz0gaXNvQ29kZS5nZXRBbHBoYTMoKQorCQkJCQkJCQkJCSsgIiA9ICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgZ2V0QXJlYShpdGVtc1tJU09EYXRhLkNPVU5UUllfTkFNRV0sCisJCQkJCQkJCQkJCQlsZXZlbCkgKyAiXG4iOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCS8vIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQKKwkJCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShwcm9wZXJ0aWVzRmlsZSwgZGF0YSk7CisJCQkJCQkJfQorCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCQljYXNlIERhdGFUeXBlcy5MRVZFTF8xOgorCisJCQkJCQkJY3VycmVudCA9IGl0ZW1zW0lTT0RhdGEuQURNSU4xX05BTUVdLnRvVXBwZXJDYXNlKCk7CisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzI6CisKKwkJCQkJCQljdXJyZW50ID0gaXRlbXNbSVNPRGF0YS5BRE1JTjJfTkFNRV0udG9VcHBlckNhc2UoKTsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJfSAvLyBzd2l0Y2gKKworCQkJCQkJLy8gSGFuZGxlIFVOS05PV04gYW5kIE4uQS4gZW50cmllcyBkaWZmZXJlbnRseS4KKwkJCQkJCWlmIChjdXJyZW50LmVxdWFscygiVU5LTk9XTiIpIHx8IGN1cnJlbnQuZXF1YWxzKCJOLkEuIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQkJCQlpZiAobGV2ZWwgPT0gMSkgeworCQkJCQkJCQljdXJyZW50ID0gaXNvQ29kZS5nZXRBbHBoYTIoKSArICItVU5LLSIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgU3RyaW5nLnZhbHVlT2YodW5rQ291bnRlcisrKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkvLyBMZXZlbCAyIGRhdGEuCisJCQkJCQkJCWN1cnJlbnQgPSBpc29Db2RlLmdldEFscGhhMygpICsgIi5MMi4iIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIFN0cmluZy52YWx1ZU9mKHVua0NvdW50ZXIrKyk7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQkvLyBWZXJpZnkgZm9yIHJlcGVhdGVkIGVudHJpZXMgLS0gYXZvaWQgZHVwbGNhdGVzCisJCQkJCQlzd2l0Y2ggKGxldmVsKSB7CisKKwkJCQkJCWNhc2UgTEVWRUxfMToKKwkJCQkJCQlpZiAoR2VuVXRpbHMuaXNSZXBlYXRlZChjdXJyZW50LCBlbnRyeUxpc3QpID09IHRydWUpIHsKKwkJCQkJCQkJLy8gRHVwbGljYXRlZCwgaWdub3JlLgorCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQl9CisJCQkJCQkJLy8gUmVtZW1iZXIgdGhpcyBlbnRpdHkgdG8gYXZvaWQgZHVwbGljYXRlcy4KKwkJCQkJCQllbnRyeUxpc3QuYWRkKGN1cnJlbnQpOworCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlIExFVkVMXzI6CisJCQkJCQkJaWYgKEdlblV0aWxzLmlzUmVwZWF0ZWQoaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0KKwkJCQkJCQkJCSsgY3VycmVudCwgZW50cnlMaXN0KSA9PSB0cnVlKSB7CisJCQkJCQkJCS8vIER1cGxpY2F0ZWQsIGlnbm9yZS4KKwkJCQkJCQkJY29udGludWU7CisJCQkJCQkJfQorCQkJCQkJCS8vIFJlbWVtYmVyIHRoaXMgZW50aXR5IHRvIGF2b2lkIGR1cGxpY2F0ZXMuCisJCQkJCQkJZW50cnlMaXN0LmFkZChpdGVtc1tJU09EYXRhLkFETUlOMV9OQU1FXSArIGN1cnJlbnQpOworCQkJCQkJCWJyZWFrOworCisJCQkJCQl9CisKKwkJCQkJCS8vIFdlIGdldCB0aGUgZGVzY3JpcHRvciBmb3IgYWRtaW5pc3RyYXRpb24gZW50aXRpZXMKKwkJCQkJCS8vIGRpZmZlcmVudGx5IGJhc2VkIG9uIGl0cyBsZXZlbC4KKwkJCQkJCWlmIChsZXZlbCA9PSAyKSB7CisKKwkJCQkJCQlpZiAobGV4MURhdGFTZXQgPT0gbnVsbCAmJiBsZXgyRGF0YVNldCA9PSBudWxsKSB7CisKKwkJCQkJCQkJLy8gQ29tcG9zZSB0aGUgZmlsZSBuYW1lcyBmb3IgdGhlIGxleCBmaWxlcyBmb3IKKwkJCQkJCQkJLy8gdGhpcyBjb3VudHJ5CisJCQkJCQkJCWxleEFkbWluMUZpbGUgPSBsZXhEaXIgKyBpc29Db2RlLmdldEFscGhhMygpCisJCQkJCQkJCQkJKyAiXFwiICsgaXNvQ29kZS5nZXRBbHBoYTMoKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlsZXhBZG1pbjJGaWxlID0gbGV4QWRtaW4xRmlsZTsKKwkJCQkJCQkJbGV4QWRtaW4xRmlsZSArPSAiX0FETUlOMV9MRVgudHh0IjsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlsZXhBZG1pbjJGaWxlICs9ICJfQURNSU4yX0xFWC50eHQiOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCQkJLy8gTG9hZCB0aGUgbGV4MSBhbmQgbGV4MiBmaWxlcyBmb3IgdGhpcworCQkJCQkJCQkvLyBjb3VudHJ5LgorCQkJCQkJCQlsZXgxRGF0YVNldCA9IEdlblV0aWxzCisJCQkJCQkJCQkJLnBvcHVsYXRlTGlzdChsZXhBZG1pbjFGaWxlKTsKKwkJCQkJCQkJbGV4MkRhdGFTZXQgPSBHZW5VdGlscworCQkJCQkJCQkJCS5wb3B1bGF0ZUxpc3QobGV4QWRtaW4yRmlsZSk7CisKKwkJCQkJCQkJLy8gQ3JlYXRlIGEgbWV0aG9kIHRvIHNlYXJjaCBmb3IgYW4gaXRlbSBvbiBhCisJCQkJCQkJCS8vIGxpc3QKKwkJCQkJCQkJLy8gb2YgbGV4IGRhdGEgb2JqZWN0cy4KKwkJCQkJCQkJbGV4MUxpc3QgPSBHZW5VdGlscy5jcmVhdGVMZXgxTGlzdChsZXgxRGF0YVNldCk7CisJCQkJCQkJCWxleDJMaXN0ID0gR2VuVXRpbHMuY3JlYXRlTGV4Mkxpc3QobGV4MkRhdGFTZXQpOworCisJCQkJCQkJfQorCisJCQkJCQkJLy8gQ29tcG9zZSB0aGUgbGV2ZWwyIGRlc2NyaXB0b3IgdXNpbmcgdGhlIGxleCBkYXRhOgorCisJCQkJCQkJLy8gU1RFUCAxOiBEbyBhIGxvb2sgdXAgaW4gdGhlIGxleCAyIGxpc3RzLgorCisJCQkJCQkJLy8gR2V0IHRoZSBsZXggMiBvYmplY3QgZm9yIHRoZSBjdXJyZW50IGVudHJ5LgorCQkJCQkJCUxleDJPYmogbGV4MkN1cnJlbnQgPSBHZW5VdGlscy5sZXgyTG9va3VwKGxleDJMaXN0LAorCQkJCQkJCQkJaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0sIGN1cnJlbnQpOworCisJCQkJCQkJLy8gR2V0IHRoZSBsZXggMSBvYmplY3QgdG8gd2hpY2ggbGV4MkN1cnJlbnQgYmVsb25ncworCQkJCQkJCS8vIHRvLgorCQkJCQkJCUxleDFPYmogbGV4MUN1cnJlbnQgPSBHZW5VdGlscy5sZXgxTG9va3VwKGxleDFMaXN0LAorCQkJCQkJCQkJbGV4MkN1cnJlbnQuZ2V0QWRtaW4xKCkpOworCisJCQkJCQkJLy8gU1RFUCAyOiBwaWVjZSB0b2dldGhlciB0aGUgSUQgdXNpbmcgdGhlCisJCQkJCQkJLy8gcHJvcGVyIGxleCBvYmplY3RzIDogdGhlIFVTQSBpcyBhIHNwZWNpYWwKKwkJCQkJCQkvLyBjYXNlCisJCQkJCQkJaWYgKGxleDFDdXJyZW50LmdldERlc2NyaXB0b3IoKS5jb250YWlucygiVVMtIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlkZXNjcmlwdG9yID0gbGV4MUN1cnJlbnQuZ2V0RGVzY3JpcHRvcigpCisJCQkJCQkJCQkJKyAiLSIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgbGV4MUN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXgoKQorCQkJCQkJCQkJCSsgbGV4MkN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXhVU0EoKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlkZXNjcmlwdG9yID0gbGV4MUN1cnJlbnQuZ2V0RGVzY3JpcHRvcigpCisJCQkJCQkJCQkJKyAiLUciIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGxleDFDdXJyZW50LmdldEZvcm1hdHRlZEluZGV4KCkKKwkJCQkJCQkJCQkrIGxleDJDdXJyZW50LmdldEZvcm1hdHRlZEluZGV4KCk7CisJCQkJCQkJCS8vIEFkZCBzb21lIGNvbW1lbnMgdG8gYWxsb3cgcmV2ZXJzZSBlbmdpbmVlcmluZworCQkJCQkJCQkvLyBvciBiYWNrdHJhY2tpbmcgdGhlIG9yaWdpbiBvZiB0aGlzIGdlbmVyYXRlZAorCQkJCQkJCQkvLyBrZXkgYXMgbXVjaCBhcyBwb3NzaWJsZS4KKwkJCQkJCQkJZGF0YSA9ICIjIEdlbmVyYXRlZCBrZXkgZGV0YWlscyA6ICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgIiBMZXZlbCAxICggIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBsZXgxQ3VycmVudC5nZXREZXNjcmlwdG9yKCkKKwkJCQkJCQkJCQkrICIgPSAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGxleDFDdXJyZW50LmdldEFkbWluMSgpCisJCQkJCQkJCQkJKyAiKS4gIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyAiTGV2ZWwgMiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgbGV4MUN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXgoKQorCQkJCQkJCQkJCSsgbGV4MkN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXgoKQorCQkJCQkJCQkJCSsgIiA9ICIgKyBsZXgyQ3VycmVudC5nZXRBZG1pbjIoKSAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyAiKS4gXG4iOyAvLyROT04tTkxTLTEkCisJCQkJCQkJfQorCisJCQkJCQl9IGVsc2UgeyAvLyBDb21wb3NlIGRlc2NyaXB0b3IgZm9yIGxldmVsIDEgYW5kIGxldmVsCisJCQkJCQkJLy8gMCBkYXRhLgorCQkJCQkJCS8vIEdldCB0aGUgZGVzY3JpcHRvciBmb3IgdGhpcyBlbnRpdHkuCisJCQkJCQkJZGVzY3JpcHRvciA9IEdlblV0aWxzLmdldElTTzJEZXNjcmlwdG9yKGlzbzJMaXN0LAorCQkJCQkJCQkJY3VycmVudCwgaXNvQ29kZS5nZXRBbHBoYTIoKSk7CisKKwkJCQkJCQkvLyBJZiB3ZSBjYW50IGZpbmQgdGhlIGRlc2NyaXB0b3IsIHRoZW4gbG9vayBpbiB0aGUKKwkJCQkJCQkvLyBmaXggbGlzdC4KKwkJCQkJCQlpZiAoZGVzY3JpcHRvci5lcXVhbHMoY3VycmVudCkgPT0gdHJ1ZSkgeworCQkJCQkJCQkvLyBMb29rIGZvciBhIGRlc2NyaXB0b3IgaW4gdGhlIGZpeCBmaWxlCisJCQkJCQkJCWRlc2NyaXB0b3IgPSBHZW5VdGlscy5nZXRGaXhDb2RlKGNvZGVmaXhMaXN0LAorCQkJCQkJCQkJCWN1cnJlbnQsIGl0ZW1zW0lTT0RhdGEuQ09VTlRSWV9OQU1FXSk7CisKKwkJCQkJCQkJLy8gSWYgdGhlcmUgaXMgbm8gZGVzY3JpcHRvciBzdGlsbCwgZ2VuZXJhdGUKKwkJCQkJCQkJLy8gb25lIQorCQkJCQkJCQlpZiAoZGVzY3JpcHRvci5lcXVhbHMoY3VycmVudCkgPT0gdHJ1ZSkgeworCQkJCQkJCQkJZGVzY3JpcHRvciA9IGlzb0NvZGUuZ2V0QWxwaGEyKCkgKyAiLSIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCQkrIGN1cnJlbnQ7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQlkYXRhID0gIiMiICsgY3VycmVudCArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQkJCQl9CisKKwkJCQkJCVN0cmluZyBhcmVhID0gREVGQVVMVDsKKwkJCQkJCVN0cmluZyBsZXZlbDFBcmVhU3FLbSA9IERFRkFVTFQ7CisKKwkJCQkJCXN3aXRjaCAobGV2ZWwpIHsKKworCQkJCQkJY2FzZSAxOgorCisJCQkJCQkJaWYgKGRlc2NyaXB0b3IuY29udGFpbnMoIlVOSyIpID09IGZhbHNlKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJYXJlYSA9IGdldEFyZWEoY3VycmVudCwKKwkJCQkJCQkJCQlpdGVtc1tJU09EYXRhLkNPVU5UUllfTkFNRV0sIGFyZWFMaXN0LAorCQkJCQkJCQkJCWxldmVsKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkvLyBVc2UgdGhlIGZvbGxvd2luZyBmb3JtdWxhIHRvIGNvbXB1dGUKKwkJCQkJCQkJLy8gYXBwcm94aW1hdGUgYXJlYSA6CisJCQkJCQkJCS8vIFtQT0xZR09OX0FSRUExL1BPTFlHT05fQVJFQTBdICogQVJFQTBfU1FLTQorCisJCQkJCQkJCWFyZWEgPSBnZXRBcHByb3hpbWF0ZUwxQXJlYShjdXJyZW50LAorCQkJCQkJCQkJCWl0ZW1zW0lTT0RhdGEuQ09VTlRSWV9OQU1FXSwKKwkJCQkJCQkJCQlhZ2dyZWdhdGVMZXZlbDFQb2x5Z29uQXJlYSwKKwkJCQkJCQkJCQlsZXZlbDBBcmVhU3FLbSk7CisKKwkJCQkJCQl9CisKKwkJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSAyOgorCisJCQkJCQkJLy8gVHJlYXQgdGhlIFVTQSBhcyBhIHNwZWNpYWwgY2FzZSA6CisJCQkJCQkJLy8gZm9yIHRoZSBVU0Egd2UgaGF2ZSBhIGxpc3Qgb2YgbGV2ZWwgMiBkYXRhLgorCQkJCQkJCWlmIChkZXNjcmlwdG9yLmNvbnRhaW5zKCJVUy0iKSkgeyAvLyROT04tTkxTLTEkCisKKwkJCQkJCQkJLy8gRmlydCwgZmluZCB0aGUgSVNPQ29kZTIgZm9yIHRoaXMgVVNBIGFkbWluLgorCQkJCQkJCQlJU09Db2RlMiBjb2RlID0gR2VuVXRpbHMuZ2V0SVNPMk9iamVjdCgKKwkJCQkJCQkJCQlpc28yTGlzdCwgaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0sCisJCQkJCQkJCQkJaXNvQ29kZS5nZXRBbHBoYTIoKSk7CisKKwkJCQkJCQkJLy8gU2Vjb25kLCBmaW5kIHRoZSBhcmVhIGZvciB0aGlzIFVTQSBhZG1pbi4KKwkJCQkJCQkJYXJlYSA9IGdldFVTQUwyQXJlYShpdGVtc1tJU09EYXRhLkFETUlOMl9OQU1FXSwKKwkJCQkJCQkJCQljb2RlLmdldEluZGV4KCksIHVzYUxldmVsMkxpc3QpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoZGVzY3JpcHRvci5jb250YWlucygiVU5LIikgPT0gZmFsc2UpIHsgLy8kTk9OLU5MUy0xJAorCisJCQkJCQkJCS8vIEZpcnN0LCBnZXQgdGhlIGFyZWEgaW4gU1EgS00gZm9yIHRoZSBsZXZlbCAxCisJCQkJCQkJCS8vIGNvbnRhaW5lciBvZiB0aGUgY3VycmVudCBsZXZlbCAyIGFkbWluc3RyYXRpbgorCQkJCQkJCQlsZXZlbDFBcmVhU3FLbSA9IGdldEFyZWEoCisJCQkJCQkJCQkJaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0sCisJCQkJCQkJCQkJaXRlbXNbSVNPRGF0YS5DT1VOVFJZX05BTUVdLCBhcmVhTGlzdCwKKwkJCQkJCQkJCQlsZXZlbCAtIDEpOworCisJCQkJCQkJCS8vIE5vdyBnZXQgdGhlIGFwcHJveGltYXRlIGFyZWEgaW4gU1EgS00gZm9yIHRoZQorCQkJCQkJCQkvLyBsZXZlbCAyIGFkbWluaXN0cmF0aW9uCisJCQkJCQkJCWFyZWEgPSBnZXRBcHByb3hpbWF0ZUwyQXJlYShkZXNjcmlwdG9yLAorCQkJCQkJCQkJCWl0ZW1zW0lTT0RhdGEuQURNSU4xX05BTUVdLAorCQkJCQkJCQkJCWl0ZW1zW0lTT0RhdGEuQ09VTlRSWV9OQU1FXSwKKwkJCQkJCQkJCQlsZXZlbDFBcmVhU3FLbSk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLy8gVXNlIHRoZSBmb2xsb3dpbmcgZm9ybXVsYSB0byBjb21wdXRlCisJCQkJCQkJCS8vIGFwcHJveGltYXRlIGFyZWEgOgorCQkJCQkJCQkvLyBbUE9MWUdPTl9BUkVBMiAvIFBPTFlHT05fQVJFQTFdICogQVJFQTFfU1FLTQorCisJCQkJCQkJCVN0cmluZyBsZXZlbDJQb2x5Z29uQXJlYSA9IGdldFBvbHlnb25BcmVhKAorCQkJCQkJCQkJCWRlc2NyaXB0b3IsIGl0ZW1zW0lTT0RhdGEuQURNSU4xX05BTUVdLAorCQkJCQkJCQkJCWxldmVsMlBvbHlnb25BcmVhTGlzdCwgMik7CisKKwkJCQkJCQkJZG91YmxlIHJhdGlvID0gMC4wOworCQkJCQkJCQlkb3VibGUgYXBwcm94QXJlYSA9IDAuMDsKKworCQkJCQkJCQlpZiAoRG91YmxlLnBhcnNlRG91YmxlKGRlZmF1bHRQb2x5Z29uQXJlYSkgIT0gMCkgeworCQkJCQkJCQkJcmF0aW8gPSBEb3VibGUKKwkJCQkJCQkJCQkJLnBhcnNlRG91YmxlKGxldmVsMlBvbHlnb25BcmVhKQorCQkJCQkJCQkJCQkqIERvdWJsZQorCQkJCQkJCQkJCQkJCS5wYXJzZURvdWJsZShkZWZhdWx0UG9seWdvbkFyZWEpOworCQkJCQkJCQkJYXBwcm94QXJlYSA9IERvdWJsZQorCQkJCQkJCQkJCQkucGFyc2VEb3VibGUoZGVmYXVsdEFyZWFTcUttKQorCQkJCQkJCQkJCQkqIHJhdGlvOworCQkJCQkJCQl9CisKKwkJCQkJCQkJYXJlYSA9IERvdWJsZS50b1N0cmluZyhhcHByb3hBcmVhKTsKKworCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVOS05PV04gOiAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGl0ZW1zW0lTT0RhdGEuQURNSU4yX05BTUVdCisJCQkJCQkJCQkJKyAiLCIgKyBkZXNjcmlwdG9yIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrICIsIiArIGFyZWEpOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoZGVmYXVsdEFyZWFTcUttID09IERFRkFVTFQpIHsKKwkJCQkJCQkJZGVmYXVsdEFyZWFTcUttID0gbGV2ZWwxQXJlYVNxS207CisJCQkJCQkJCWRlZmF1bHRQb2x5Z29uQXJlYSA9IGdldFBvbHlnb25BcmVhKAorCQkJCQkJCQkJCWl0ZW1zW0lTT0RhdGEuQURNSU4xX05BTUVdLAorCQkJCQkJCQkJCWl0ZW1zW0lTT0RhdGEuQ09VTlRSWV9OQU1FXSwKKwkJCQkJCQkJCQlsZXZlbDFQb2x5Z29uQXJlYUxpc3QsIDEpOworCQkJCQkJCX0KKworCQkJCQkJCWJyZWFrOworCisJCQkJCQl9CisKKwkJCQkJCWlmIChkYXRhICE9IG51bGwpIHsKKwkJCQkJCQlkYXRhICs9IGRlc2NyaXB0b3IgKyAiID0gIiArIEdlblV0aWxzLmZvcm1hdChhcmVhKSAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkrICJcbiI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZGF0YSA9IGRlc2NyaXB0b3IgKyAiID0gIiArIEdlblV0aWxzLmZvcm1hdChhcmVhKSAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkrICJcbiI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCX0KKworCQkJCQkJLy8gSWYgYXJlYSBpcyBub3Qga25vd24gKGRlc2ZhdWx0IHZhbHVlKSwgdGhlbiBjb21tZW50CisJCQkJCQkvLyBpdAorCQkJCQkJLy8gaWYgKGFyZWEuZXF1YWxzKERFRkFVTFQpKSB7CisJCQkJCQkvLyBTeXN0ZW0ub3V0CisJCQkJCQkvLyAucHJpbnRsbigiVlVLIDogIiArIGRlc2NyaXB0b3IgKyAiICwgIiArIGN1cnJlbnQKKwkJCQkJCS8vIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJLy8gKyAiICwgIiArIGxldmVsKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJLy8gfQorCisJCQkJCQkvLyBXcml0ZSB0aGUgZm9ybWF0dGVkIG91dHB1dAorCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShwcm9wZXJ0aWVzRmlsZSwgZGF0YSk7CisJCQkJCQlkYXRhID0gbnVsbDsKKworCQkJCQl9IC8vIHdoaWxlCisKKwkJCQkJLy8gUmVzZXQgb3VyIGxvY2F0aW9uIHVzZWQgdG8gY29tcHV0ZSBhcHByb3hpbWF0ZSBhcmVhIGZvcgorCQkJCQkvLyB1bmtub3duIGxvY2F0aW9ucy4KKwkJCQkJZGVmYXVsdEFyZWFTcUttID0gREVGQVVMVDsKKwkJCQkJZGVmYXVsdFBvbHlnb25BcmVhID0gREVGQVVMVDsKKworCQkJCQkvLyBSZXNldCBhbGwgbGV4LXJlbGF0ZWQgaXRlbXMKKwkJCQkJaWYgKGxleDFEYXRhU2V0ICE9IG51bGwpIHsKKwkJCQkJCWxleDFEYXRhU2V0LmNsZWFyKCk7CisJCQkJCQlsZXgxRGF0YVNldCA9IG51bGw7CisJCQkJCX0KKwkJCQkJaWYgKGxleDJEYXRhU2V0ICE9IG51bGwpIHsKKwkJCQkJCWxleDJEYXRhU2V0LmNsZWFyKCk7CisJCQkJCQlsZXgyRGF0YVNldCA9IG51bGw7CisJCQkJCX0KKwkJCQkJaWYgKGxleDFMaXN0ICE9IG51bGwpIHsKKwkJCQkJCWxleDFMaXN0LmNsZWFyKCk7CisJCQkJCQlsZXgxTGlzdCA9IG51bGw7CisJCQkJCX0KKwkJCQkJaWYgKGxleDJMaXN0ICE9IG51bGwpIHsKKwkJCQkJCWxleDJMaXN0LmNsZWFyKCk7CisJCQkJCQlsZXgyTGlzdCA9IG51bGw7CisJCQkJCX0KKworCQkJCQlsZXhBZG1pbjFGaWxlID0gbnVsbDsKKwkJCQkJbGV4QWRtaW4yRmlsZSA9IG51bGw7CisKKwkJCQkJLy8gV2UgZG9udCBuZWVkIHRoZSBJU08gY29kZSBvYmplY3QgZm9yIHRoaXMgY291bnRyeQorCQkJCQkvLyBhbnltb3JlLCB3ZSBhcmUgZG9uZSBwcm9jZXNzaW5nIGl0LgorCQkJCQlpc29Db2RlID0gbnVsbDsKKworCQkJCQkvLyBHZXQgcmlkIG9mIHRoZSBsaXN0cyBvZiBwb2x5b24gYXJlYSBkYXRhLgorCQkJCQlpZiAobGV2ZWwxUG9seWdvbkFyZWFMaXN0ICE9IG51bGwpIHsKKwkJCQkJCWxldmVsMVBvbHlnb25BcmVhTGlzdC5jbGVhcigpOworCQkJCQkJbGV2ZWwxUG9seWdvbkFyZWFMaXN0ID0gbnVsbDsKKwkJCQkJfQorCisJCQkJCWlmIChsZXZlbDJQb2x5Z29uQXJlYUxpc3QgIT0gbnVsbCkgeworCQkJCQkJbGV2ZWwyUG9seWdvbkFyZWFMaXN0LmNsZWFyKCk7CisJCQkJCQlsZXZlbDJQb2x5Z29uQXJlYUxpc3QgPSBudWxsOworCQkJCQl9CisKKwkJCQkJLy8gUmVzZXQgdGhlIGFyZWEgbGlzdAorCQkJCQlpZiAoYXJlYUxpc3QgIT0gbnVsbCkgeworCQkJCQkJYXJlYUxpc3QuY2xlYXIoKTsKKwkJCQkJCWFyZWFMaXN0ID0gbnVsbDsKKwkJCQkJfQorCisJCQkJCS8vIENsb3NlIGFsbCBvcGVuIHJlc291cmNlcy4KKwkJCQkJcmVhZGVyLmNsb3NlKCk7CisKKwkJCQkJaWYgKHByb3BlcnRpZXNGaWxlICE9IG51bGwpIHsKKwkJCQkJCXByb3BlcnRpZXNGaWxlLmNsb3NlKCk7CisJCQkJCQlwcm9wZXJ0aWVzRmlsZSA9IG51bGw7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRHZW5lcmF0ZWQgOiAiICsgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCisJCQkJCQlmaWxlTmFtZSA9IG51bGw7CisJCQkJCX0KKwkJCQkJLy8gUnVuIGdhcmJhZ2UgY29sbGVjdGlvbgorCQkJCQkvL1N5c3RlbS5nYygpOworCisJCQkJfQorCisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfSAvLyBmb3IKKwl9CisKKwkvKioKKwkgKiBHZW5lcmF0ZSB0aGUgaGVhZGVyIGNvbW1lbnQgZm9yIHRoaXMgZmlsZSAtLSBpdCB2YXJpZXMgZm9yIGRpZmZlcmVudAorCSAqIGFkbWluIGxldmVscy4KKwkgKiAKKwkgKiBAcGFyYW0gY29kZQorCSAqICAgICAgICAgICAgSVNPIDMxNjYtMSBjb2RlCisJICogQHBhcmFtIGxldmVsCisJICogICAgICAgICAgICBhZG1pbmlzdHJhdGl2ZSBsZXZlbAorCSAqIAorCSAqIEByZXR1cm4gdGhlIGhlYWRlciBmb3IgdGhlIG5ldyBmaWxlLgorCSAqIAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGVyKElTT0NvZGUxIGNvZGUsIGludCBsZXZlbCkgeworCisJCWZpbmFsIGludCBEQVRBX0RFU0NSSVBUT1IgPSAwOworCQlmaW5hbCBpbnQgVVJMID0gMTsKKworCQkvLyBDcmVhdGUgdGhlIGZpbGUgbmFtZSBmb3IgdGhlIFVSTCBmaWxlLgorCQlTdHJpbmcgdXJsRmlsZSA9IHdvcmtzcGFjZSArIEdlbkNvbnN0YW50cy5QQVJBTVNfRElSCisJCQkJKyBHZW5Db25zdGFudHMuVVJMU19ESVI7CisJCXVybEZpbGUgKz0gY29kZS5nZXROYW1lKCkgKyAiLnR4dCI7IC8vJE5PTi1OTFMtMSQKKworCQlTdHJpbmcgaGVhZGVyID0gbnVsbDsKKworCQloZWFkZXIgPSAiIyAiICsgY29kZS5nZXRBbHBoYTMoKSArICJfIiArIGxldmVsICsgIl9hcmVhLnByb3BlcnRpZXNcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCWhlYWRlciArPSAiIyBUaGlzIGZpbGUgY29udGFpbnMgYXJlYSB2YWx1ZXMgZm9yICIgKyBjb2RlLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCisJCQkJKyAiXG4iOyAvLyROT04tTkxTLTEkCisJCS8vIGhlYWRlciArPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWUoKSArICJcbiI7CisKKwkJLy8gQWRkIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50LgorCQloZWFkZXIgKz0gR2VuVXRpbHMuZ2V0Q29weXJpZ2h0KCk7CisKKwkJLy8gQWRkIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBrZXkgZm9ybWF0IGluIG91ciBkYXRhIGZpbGVzLgorCQloZWFkZXIgKz0gR2VuVXRpbHMuZ2V0S2V5Rm9ybWF0RXhwbGFuYXRpb24oKTsKKworCQloZWFkZXIgKz0gIiMgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCB3aWxsIGludGVycHJldCB0aGUgcmVzdCBvZiB0aGUgZmlsZSdzIGNvbnRlbnRzXG4iOyAvLyROT04tTkxTLTEkCisJCWhlYWRlciArPSAiUkVDT1JEX0NMQVNTTkFNRSA9IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5Db3VudHJ5R3JhcGhSZWNvcmQkQ291bnRyeUFyZWFMYWJlbEdyYXBoUmVjb3JkXG5cbiI7IC8vJE5PTi1OTFMtMSQKKworCQloZWFkZXIgKz0gIiMgVGhlIElTTy0zMTY2LTEgYWxwaGEzIGNvZGUgZm9yIHRoZSBjb3VudHJ5XG4iOyAvLyROT04tTkxTLTEkCisJCWhlYWRlciArPSAiSVNPS0VZID0gIiArIGNvZGUuZ2V0QWxwaGEzKCkgKyAiXG5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCWhlYWRlciArPSAiIyBUaGUgYWRtaW5pc3RyYXRpb24gbGV2ZWwgb2YgdGhlIGFyZWEgZGF0YVxuIjsgLy8kTk9OLU5MUy0xJAorCQloZWFkZXIgKz0gIkFETUlOX0xFVkVMID0gIiArIGxldmVsICsgIlxuXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQloZWFkZXIgKz0gIiMgVGhpcyBpcyB0aGUgZGF0ZSByYW5nZSBmb3Igd2hpY2ggdGhlIGFyZWEgdmFsdWVzIGluIHRoaXMgZmlsZSBhcmUgdmFsaWQgXG4iOyAvLyROT04tTkxTLTEkCisJCWhlYWRlciArPSAiIyBTZWUgaHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zLzEuMS92YWxpZFxuIjsgLy8kTk9OLU5MUy0xJAorCQloZWFkZXIgKz0gIlZBTElEID0gc3RhcnQ9MTkwMC0wMS0wMTtcblxuIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIFRoZSBVbml0ZWQgTmF0aW9ucyBkYXRhIHBvbGljeSBhcHBsaWVzIG9ubHkgdG8gRXVyb3BlIDoKKwkJLy8gaGVhZGVyICs9IEdlblV0aWxzLmdldFVOUG9saWN5KCk7CisKKwkJaGVhZGVyICs9ICIjIFRoaXMgaXMgdGhlIHNvdXJjZSBvZiB0aGUgZGF0YVxuIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIE9wZW4gdGhlIFVSTCBmaWxlIGZvciB0aGlzIGNvdW50cnkuCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidXJsIGZpbGUgPSAiICsgdXJsRmlsZSk7CisJCUJ1ZmZlcmVkUmVhZGVyIHVybFJlYWRlciA9IEdlblV0aWxzLm9wZW5SZWFkZXIodXJsRmlsZSk7CisKKwkJdHJ5IHsKKwkJCS8vIEFkZCBhbGwgdGhlIHNvdXJjZSBVUkxzIGZvciB0aGlzIGNvdW50cnkuCisJCQlpZiAodXJsUmVhZGVyICE9IG51bGwpIHsKKwkJCQlTdHJpbmcgYnVmZmVyID0gbnVsbDsKKwkJCQl3aGlsZSAoR2VuVXRpbHMuRU9GKGJ1ZmZlciA9IHVybFJlYWRlci5yZWFkTGluZSgpKSAhPSB0cnVlKSB7CisKKwkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJCdWZmZXIgPSAiICsgYnVmZmVyKTsKKworCQkJCQkvLyBUb2tlbml6ZQorCQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihidWZmZXIsICIqIik7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkvLyBXZSBrbm93IHRoYXQgd2UgZXhwZWN0IG9ubHkgdHdvIHRva2Vucy4gR2V0IHRoZW0uIE9yZGVyCisJCQkJCS8vIG1hdHRlcnMgaGVyZS4KKwkJCQkJU3RyaW5nW10gdG9rZW5zID0gbmV3IFN0cmluZ1syXTsKKwkJCQkJdG9rZW5zW0RBVEFfREVTQ1JJUFRPUl0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisJCQkJCXRva2Vuc1tVUkxdID0gdG9rZW5pemVyLm5leHRUb2tlbigpOworCisJCQkJCS8vIFVSTCBzb3VyY2VVUkwgPSBudWxsOworCisJCQkJCS8vIElzIHRoaXMgZGF0YSBkZXNjcmlwdG9yIG9uZSBvZiBvdXIgZGF0YSBzb3VyY2VzIChzb3VyY2UKKwkJCQkJLy8gVVJMKSA/CisJCQkJCWlmIChHZW5VdGlscy5pc1NvdXJjZVVSTCh1cmxTZXQsIHRva2Vuc1tEQVRBX0RFU0NSSVBUT1JdKSA9PSB0cnVlKSB7CisKKwkJCQkJCS8vIHRyeSB7CisJCQkJCQkvLyBJcyB0aGlzIGRhdGEgZGVzY3JpcHRvciBvbmUgb2Ygb3VyIGFjdGl2ZSBkYXRhCisJCQkJCQkvLyBzb3VyY2VzID8KKworCQkJCQkJaWYgKEdlblV0aWxzLmlzQWN0aXZlVVJMKHVybFN0YXR1cywKKwkJCQkJCQkJdG9rZW5zW0RBVEFfREVTQ1JJUFRPUl0pID09IGZhbHNlKSB7CisJCQkJCQkJLy8gTm8sIGl0IGlzIG5vdCBvbmUgYW4gYWN0aXZlIFVSTCwgc28gY29tbWVudAorCQkJCQkJCS8vIGl0CisJCQkJCQkJLy8gb3V0LgorCQkJCQkJCS8vIHNvdXJjZVVSTCA9IG5ldyBVUkwodG9rZW5zW1VSTF0pOworCisJCQkJCQkJLy8gaGVhZGVyICs9ICIjICIKKwkJCQkJCQkvLyArICJTT1VSQ0UgPSAiCisJCQkJCQkJLy8gKyBVUkxFbmNvZGVyLmVuY29kZShzb3VyY2VVUkwKKwkJCQkJCQkvLyAudG9TdHJpbmcoKSwgIlVURi04IikgKyAiXG4iOworCQkJCQkJCWhlYWRlciArPSAiIyAiICsgIlNPVVJDRSA9ICIgKyB0b2tlbnNbVVJMXSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIGhlYWRlciArPSAiU09VUkNFID0gIgorCQkJCQkJCS8vICsgVVJMRW5jb2Rlci5lbmNvZGUoc291cmNlVVJMLnRvU3RyaW5nKCksCisJCQkJCQkJLy8gIlVURi04IikgKyAiXG4iOworCQkJCQkJCS8vJE5PTi1OTFMtMyQKKwkJCQkJCQloZWFkZXIgKz0gIlNPVVJDRSA9ICIgKyB0b2tlbnNbVVJMXSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJfQorCisJCQkJCQkvLyB9IGNhdGNoIChqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjoiICsgZS5nZXRNZXNzYWdlKCkpOworCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAorCQkJCQkJLy8gfQorCisJCQkJCX0KKworCQkJCX0gLy8gd2hpbGUKKworCQkJCS8vIFRvIG1ha2UgaXQgbG9vayBiZXR0ZXIsIGFkZCBhbiBleHRyYSBuZXcgbGluZS4KKwkJCQloZWFkZXIgKz0gIlxuIjsgLy8kTk9OLU5MUy0xJAorCisJCQl9CisKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8KKwkJfQorCisJCWlmIChsZXZlbCA9PSBEYXRhVHlwZXMuTEVWRUxfMSkgeworCQkJaGVhZGVyICs9ICJcbiMgU3RhdGUvUHJvdmluY2VcblxuIjsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgaWYgKGxldmVsID09IERhdGFUeXBlcy5MRVZFTF8yKSB7CisJCQloZWFkZXIgKz0gIiMgTGV2ZWwgMSAoYWRtaW4gMSA9IGUuZy4sIHN0YXRlKVxuIjsgLy8kTk9OLU5MUy0xJAorCQkJaGVhZGVyICs9ICIjIExldmVsIDIgKGFkbWluIDIgPSBlLmcuLCBjb3VudHkpXG5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCXJldHVybiBoZWFkZXI7CisJfQorCisJLyoqCisJICogRmluZCB0aGUgYXJlYSB2YWx1ZSBmb3IgYSBnaXZlbiBlbnRpdHkuCisJICogCisJICogQHBhcmFtIGVudGl0eQorCSAqICAgICAgICAgICAgdGhlIGVudGl0eSBmb3Igd2hpY2ggd2Ugd2FudCB0byBmaW5kIHRoZSBhcmVhCisJICogQHBhcmFtIGxldmVsCisJICogICAgICAgICAgICB0aGUgYWRtaW4gbGV2ZWwKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBhcmVhIHZhbHVlCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRBcmVhKFN0cmluZyBlbnRpdHksIGludCBsZXZlbCkgeworCisJCWZpbmFsIGludCBFTlRJVFkgPSAwOworCisJCWZpbmFsIGludCBMRVZFTCA9IDE7CisKKwkJZmluYWwgaW50IEFSRUEgPSAyOworCisJCUl0ZXJhdG9yIGl0ID0gYXJlYUxpc3QuaXRlcmF0b3IoKTsKKworCQlTdHJpbmcgZW50aXR5U3RyID0gZW50aXR5LnRvVXBwZXJDYXNlKCk7CisKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQlTdHJpbmdbXSBhcmVhRGF0YSA9ICgoU3RyaW5nKSBpdC5uZXh0KCkpLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJLy8gUm91bmQgdXAgYXJlYSB2YWx1ZSB0byAxCisJCQkvLyBpZiAoRG91YmxlLnBhcnNlRG91YmxlKGFyZWFEYXRhW0FSRUFdKSA8IDEuMCkgeworCQkJLy8gLy8gMSBTUUtNIGlzIHRoZSBtaW5pbXVtIGFyZWEgdmFsdWUgd2UgcmV0dXJuLgorCQkJLy8gYXJlYURhdGFbQVJFQV0gPSAiMS4wIjsKKwkJCS8vIH0KKworCQkJaWYgKGFyZWFEYXRhW0VOVElUWV0udHJpbSgpLnRvVXBwZXJDYXNlKCkuZXF1YWxzKGVudGl0eVN0cikpIHsKKworCQkJCS8vIFdlIGdvdCBhIG5hbWUgbWF0Y2gsIG5vdyBjaGVjayBib3RoIGVudGl0aWVzIGJlbG9uZyB0byBzYW1lCisJCQkJLy8gYWRtaW4gbGV2ZWwKKwkJCQkvLyAoaS5lLiBib3RoIGFyZSBjaXRpZXMgb3IgYm90aCBhcmUgY291bnRpZXMsIGV0YykKKwkJCQkvLyBPdGhlcndpc2UgaXQgaXMgYW1iaWdvdXMgYmVjYXVzZSB3ZSBjYW4gaGF2ZSBjaXRpZXMgYW5kCisJCQkJLy8gY291bnRpZXMgd2l0aCB0aGUgc2FtZSBuYW1lCisJCQkJLy8gQ2hlY2sgYm90aCBlbnRpdGllcyBiZWxvbmcgdG8gc2FtZSBsZXZlbAorCQkJCWlmIChTdHJpbmcudmFsdWVPZihsZXZlbCkuZXF1YWxzKGFyZWFEYXRhW0xFVkVMXS50cmltKCkpID09IGZhbHNlKSB7CisJCQkJCS8vIElnbm9yZSA6IHNhbWUgbmFtZSAsIGJ1dCBkaWZmZXJlbnQgbGV2ZWwKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJcmV0dXJuIGFyZWFEYXRhW0FSRUFdLnRyaW0oKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gREVGQVVMVDsKKwl9CisKKwkvKioKKwkgKiBGaW5kIHRoZSBhcmVhIG9mIGEgcG9seWdvbiAoaW4gcG9seWdvbiB1bml0cykKKwkgKiAKKwkgKiBAcGFyYW0gZGVzY3JpcHRvcgorCSAqIEBwYXJhbSBjb250YWluZXIKKwkgKiBAcGFyYW0gcG9seWdvbkFyZWFMaXN0CisJICogQHBhcmFtIGxldmVsCisJICogCisJICogQHJldHVybiBhIHBvbHlnb24gYXJlYQorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UG9seWdvbkFyZWEoU3RyaW5nIGRlc2NyaXB0b3IsIFN0cmluZyBjb250YWluZXIsCisJCQlMaXN0IHBvbHlnb25BcmVhTGlzdCwgaW50IGxldmVsKSB7CisKKwkJZmluYWwgaW50IENPTlRBSU5FUiA9IDA7CisKKwkJZmluYWwgaW50IEFETUlOSVNUUkFUSU9OID0gMTsKKworCQlmaW5hbCBpbnQgREVTQ1JJUFRPUiA9IDI7CisKKwkJZmluYWwgaW50IFBPTFlHT05fQVJFQSA9IDM7CisKKwkJSXRlcmF0b3IgaXQgPSBwb2x5Z29uQXJlYUxpc3QuaXRlcmF0b3IoKTsKKworCQlTdHJpbmcgZGVzY3JpcHRvclN0ciA9IGRlc2NyaXB0b3IudG9VcHBlckNhc2UoKS50cmltKCk7CisKKwkJU3RyaW5nIGNvbnRhaW5lclN0ciA9IGNvbnRhaW5lci50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisKKwkJCVN0cmluZyBtYXRjaCA9IG51bGw7CisKKwkJCVN0cmluZ1tdIGFyZWFEYXRhID0gKChTdHJpbmcpIGl0Lm5leHQoKSkuc3BsaXQoIjoiKTsgLy8kTk9OLU5MUy0xJAorCisJCQltYXRjaCA9IGFyZWFEYXRhW0FETUlOSVNUUkFUSU9OXS50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKworCQkJc3dpdGNoIChsZXZlbCkgeworCisJCQljYXNlIERhdGFUeXBlcy5MRVZFTF8xOgorCQkJCS8vIFdlIG1hdGNoIGJhc2VkIG9uIHRoZSBhZG1pbmlzdHJhdGlvbiBuYW1lLgorCQkJCW1hdGNoID0gYXJlYURhdGFbQURNSU5JU1RSQVRJT05dLnRvVXBwZXJDYXNlKCkudHJpbSgpOworCQkJCWJyZWFrOworCisJCQljYXNlIERhdGFUeXBlcy5MRVZFTF8yOgorCQkJCS8vIFdlIG1hdGNoIGJhc2VkIG9uIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBsZXZlbCAyIGFkbWluLgorCQkJCW1hdGNoID0gYXJlYURhdGFbREVTQ1JJUFRPUl0udG9VcHBlckNhc2UoKS50cmltKCk7CisJCQkJLy8gaW50IGVuZEluZGV4ID0gbWF0Y2gubGFzdEluZGV4T2YoIi0iKTsKKwkJCQkvLyBtYXRjaCA9IG1hdGNoLnN1YnN0cmluZygwLCBlbmRJbmRleCk7CisJCQkJYnJlYWs7CisKKwkJCX0KKworCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJNYXRjaCA9ICIgKyBtYXRjaCk7CisKKwkJCVN0cmluZyBhcmVhQ29udGFpbmVyID0gYXJlYURhdGFbQ09OVEFJTkVSXS50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKworCQkJaWYgKG1hdGNoLmVxdWFscyhkZXNjcmlwdG9yU3RyKQorCQkJCQkmJiBhcmVhQ29udGFpbmVyLmVxdWFscyhjb250YWluZXJTdHIpKSB7CisJCQkJcmV0dXJuIGFyZWFEYXRhW1BPTFlHT05fQVJFQV0udHJpbSgpOworCQkJfQorCisJCX0KKwkJcmV0dXJuIERFRkFVTFQ7CisJfQorCisJLyoqCisJICogRmluZCB0aGUgYXJlYSB2YWx1ZSBmb3IgYSBnaXZlbiBlbnRpdHkuCisJICogCisJICogQHBhcmFtIGVudGl0eQorCSAqICAgICAgICAgICAgdGhlIGVudGl0eSBmb3Igd2hpY2ggd2Ugd2FudCB0byBmaW5kIHRoZSBhcmVhCisJICogCisJICogQHBhcmFtIGVudGl0eUNvbnRhaW5lcgorCSAqIAorCSAqIEBwYXJhbSBhcmVhTGlzdAorCSAqIAorCSAqIEBwYXJhbSBsZXZlbAorCSAqICAgICAgICAgICAgdGhlIGFkbWluIGxldmVsCisJICogCisJICogQHJldHVybiB0aGUgYXJlYSB2YWx1ZQorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXJlYShTdHJpbmcgZW50aXR5LCBTdHJpbmcgZW50aXR5Q29udGFpbmVyLAorCQkJTGlzdCBhcmVhTGlzdCwgaW50IGxldmVsKSB7CisKKwkJZmluYWwgaW50IEVOVElUWSA9IDA7CisKKwkJZmluYWwgaW50IExFVkVMID0gMTsKKworCQlmaW5hbCBpbnQgQVJFQSA9IDI7CisKKwkJU3RyaW5nW10gYXJlYURhdGEgPSBudWxsOworCisJCUl0ZXJhdG9yIGl0ID0gYXJlYUxpc3QuaXRlcmF0b3IoKTsKKworCQlTdHJpbmcgZW50aXR5U3RyID0gZW50aXR5LnRvVXBwZXJDYXNlKCkudHJpbSgpOworCisJCWVudGl0eVN0ciA9IGVudGl0eVN0ci5yZXBsYWNlKCJcXHQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCVN0cmluZyBlbnRpdHlDb250YWluZXJTdHIgPSBlbnRpdHlDb250YWluZXIudG9VcHBlckNhc2UoKS50cmltKCk7CisKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQlhcmVhRGF0YSA9ICgoU3RyaW5nKSBpdC5uZXh0KCkpLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJLy8gUm91bmQgdXAgYXJlYSB2YWx1ZSB0byAxCisJCQkvLyBpZiAoRG91YmxlLnBhcnNlRG91YmxlKGFyZWFEYXRhW0FSRUFdKSA8IDEuMCkgeworCQkJLy8gLy8gMSBTUUtNIGlzIHRoZSBtaW5pbXVtIGFyZWEgdmFsdWUgd2UgcmV0dXJuLgorCQkJLy8gYXJlYURhdGFbQVJFQV0gPSAiMS4wIjsKKwkJCS8vIH0KKworCQkJU3RyaW5nW10gY29tcGFyZSA9IG51bGw7CisKKwkJCS8vIEdldCB0aGUgZW50aXR5IG5hbWUgYW5kIHJlbW92ZSBibGFua3MKKwkJCVN0cmluZyBsb2NhdGlvbiA9IGFyZWFEYXRhW0VOVElUWV0udG9VcHBlckNhc2UoKS50cmltKCk7CisKKwkJCWxvY2F0aW9uID0gbG9jYXRpb24udG9VcHBlckNhc2UoKS50cmltKCk7CisKKwkJCS8vIEhhbmRsZSBBbGlhc2VzIC0tIGNvbXBsZXggc3R1ZmYgOiQKKwkJCWlmIChsb2NhdGlvbi5jb250YWlucygiWyIpKSB7IC8vJE5PTi1OTFMtMSQKKworCQkJCWxvY2F0aW9uID0gbG9jYXRpb24ucmVwbGFjZSgiXSIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQkvLyBUb2tlbml6ZQorCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxvY2F0aW9uLCAiWyIpOyAvLyROT04tTkxTLTEkCisKKwkJCQkvLyBHZXQgdG9rZW5zCisJCQkJY29tcGFyZSA9IG5ldyBTdHJpbmdbdG9rZW5zLmNvdW50VG9rZW5zKCldOworCQkJCWludCBpID0gMDsKKwkJCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworCQkJCQljb21wYXJlW2krK10gPSB0b2tlbnMubmV4dFRva2VuKCkudG9VcHBlckNhc2UoKS50cmltKCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoY29tcGFyZSAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wYXJlLmxlbmd0aDsgaSsrKSB7CisJCQkJCWlmIChlbnRpdHlTdHIucmVwbGFjZSgiLSIsICIgIikuZXF1YWxzKCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQljb21wYXJlW2ldLnJlcGxhY2UoIi0iLCAiICIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQl8fCBjb21wYXJlW2ldLmVxdWFscyhlbnRpdHlTdHIgKyAiLTEiKSAvLyROT04tTkxTLTEkCisJCQkJCQkJfHwgY29tcGFyZVtpXS5lcXVhbHMoZW50aXR5Q29udGFpbmVyU3RyKSkgeworCisJCQkJCQkvLyBDaGVjayBib3RoIGVudGl0aWVzIGJlbG9uZyB0byBzYW1lIGxldmVsCisJCQkJCQlpZiAoU3RyaW5nLnZhbHVlT2YobGV2ZWwpCisJCQkJCQkJCS5lcXVhbHMoYXJlYURhdGFbTEVWRUxdLnRyaW0oKSkgPT0gZmFsc2UpIHsKKwkJCQkJCQkvLyBJZ25vcmUgOiBzYW1lIG5hbWUgLCBidXQgZGlmZmVyZW50IGxldmVsCisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gYXJlYURhdGFbQVJFQV0udHJpbSgpOworCQkJCQl9CisJCQkJfSAvLyBmb3IKKwkJCX0gZWxzZSBpZiAoZW50aXR5U3RyLmVxdWFscyhsb2NhdGlvbikKKwkJCQkJfHwgZW50aXR5U3RyLnJlcGxhY2UoIi0iLCAiICIpLmVxdWFscyhsb2NhdGlvbikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCXx8IGxvY2F0aW9uLmVxdWFscyhlbnRpdHlTdHIgKyAiLTEiKSkgeyAvLyROT04tTkxTLTEkCisKKwkJCQkvLyBDaGVjayBib3RoIGVudGl0aWVzIGJlbG9uZyB0byBzYW1lIGxldmVsCisJCQkJaWYgKFN0cmluZy52YWx1ZU9mKGxldmVsKS5lcXVhbHMoYXJlYURhdGFbTEVWRUxdLnRyaW0oKSkgPT0gZmFsc2UpIHsKKwkJCQkJLy8gSWdub3JlIDogc2FtZSBuYW1lICwgYnV0IGRpZmZlcmVudCBsZXZlbAorCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJcmV0dXJuIGFyZWFEYXRhW0FSRUFdLnRyaW0oKTsKKwkJCX0KKworCQl9IC8vIHdoaWxlCisKKwkJcmV0dXJuIERFRkFVTFQ7CisJfQorCisJLyoqCisJICogRmluZCB0aGUgYXJlYSB2YWx1ZSBmb3IgYSBnaXZlbiBjb3VudHkgKGxldmVsIDIgYWRtaW4pIHdpdGhpbiB0aGUgVVNBCisJICogCisJICogQHBhcmFtIGVudGl0eQorCSAqICAgICAgICAgICAgdGhlIGVudGl0eSBmb3Igd2hpY2ggd2Ugd2FudCB0byBmaW5kIHRoZSBhcmVhCisJICogCisJICogQHBhcmFtIHN0YXRlCisJICogCisJICogQHBhcmFtIGFyZWFMaXN0CisJICogCisJICogQHJldHVybiB0aGUgYXJlYSB2YWx1ZQorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0VVNBTDJBcmVhKFN0cmluZyBlbnRpdHksIFN0cmluZyBzdGF0ZSwgTGlzdCBhcmVhTGlzdCkgeworCisJCWZpbmFsIGludCBFTlRJVFkgPSAwOworCisJCWZpbmFsIGludCBTVEFURV9JRCA9IDE7CisKKwkJZmluYWwgaW50IEFSRUEgPSAyOworCisJCVN0cmluZ1tdIGFyZWFEYXRhID0gbnVsbDsKKworCQlJdGVyYXRvciBpdCA9IGFyZWFMaXN0Lml0ZXJhdG9yKCk7CisKKwkJU3RyaW5nIGVudGl0eVN0ciA9IGVudGl0eS50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKworCQllbnRpdHlTdHIgPSBlbnRpdHlTdHIucmVwbGFjZSgiXFx0IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQlTdHJpbmcgc3RhdGVTdHIgPSBzdGF0ZS50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisKKwkJCWFyZWFEYXRhID0gKChTdHJpbmcpIGl0Lm5leHQoKSkuc3BsaXQoIjoiKTsgLy8kTk9OLU5MUy0xJAorCisJCQkvLyBHZXQgdGhlIGVudGl0eSBuYW1lIGFuZCByZW1vdmUgYmxhbmtzCisJCQlTdHJpbmcgbG9jYXRpb24gPSBhcmVhRGF0YVtFTlRJVFldLnRvVXBwZXJDYXNlKCkudHJpbSgpOworCisJCQlsb2NhdGlvbiA9IGxvY2F0aW9uLnRvVXBwZXJDYXNlKCkudHJpbSgpOworCisJCQlpZiAoZW50aXR5U3RyLmVxdWFscyhsb2NhdGlvbikpIHsKKworCQkJCS8vIENoZWNrIGJvdGggZW50aXRpZXMgYmVsb25nIHRvIHNhbWUgc3RhdGUKKwkJCQlpZiAoc3RhdGVTdHIuZXF1YWxzKGFyZWFEYXRhW1NUQVRFX0lEXS50cmltKCkpID09IGZhbHNlKSB7CisJCQkJCS8vIElnbm9yZSA6IHNhbWUgbmFtZSAsIGJ1dCBkaWZmZXJlbnQgbGV2ZWwKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXJldHVybiBhcmVhRGF0YVtBUkVBXS50cmltKCk7CisJCQl9CisKKwkJfSAvLyB3aGlsZQorCisJCXJldHVybiBERUZBVUxUOworCX0KKworCS8qKgorCSAqIEZpbmQgdGhlIGFwcHJveGltYXRlIGFyZWEgdmFsdWUgZm9yIGEga25vd24gbG9jYXRpb24uCisJICogCisJICogQHBhcmFtIGxldmVsMkNvbnRhaW5lcgorCSAqIEBwYXJhbSBsZXZlbDFDb250YWluZXIKKwkgKiBAcGFyYW0gbGV2ZWwwQ29udGFpbmVyCisJICogQHBhcmFtIGxldmVsMUFyZWFTcUttCisJICogCisJICogQHJldHVybiB0aGUgYXBwcm94aW1hdGUgYXJlYSB2YWx1ZQorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXBwcm94aW1hdGVMMkFyZWEoU3RyaW5nIGxldmVsMkNvbnRhaW5lciwKKwkJCVN0cmluZyBsZXZlbDFDb250YWluZXIsIFN0cmluZyBsZXZlbDBDb250YWluZXIsCisJCQlTdHJpbmcgbGV2ZWwxQXJlYVNxS20pIHsKKworCQkvLyBGaW5kIHRoZSBhcmVhIGluIHBvbHlnb24gdW5pdHMgb2YgdGhlIGxldmVsIDEgY29udGFpbmVyCisJCVN0cmluZyBsZXZlbDFQb2x5Z29uQXJlYSA9IGdldFBvbHlnb25BcmVhKGxldmVsMUNvbnRhaW5lciwKKwkJCQlsZXZlbDBDb250YWluZXIsIGxldmVsMVBvbHlnb25BcmVhTGlzdCwgMSk7CisKKwkJLy8gRmluZCB0aGUgYXJlYSBpbiBwb2x5Z29uIHVuaXRzIG9mIHRoZSBsZXZlbCAyIGFkbWluaXN0cmF0aW9uCisJCVN0cmluZyBsZXZlbDJQb2x5Z29uQXJlYSA9IGdldFBvbHlnb25BcmVhKGxldmVsMkNvbnRhaW5lciwKKwkJCQlsZXZlbDFDb250YWluZXIsIGxldmVsMlBvbHlnb25BcmVhTGlzdCwgMik7CisKKwkJLy8gQ29tcHV0ZSB0aGUgYXBwcm94aW1hdGUgYXJlYSwgYnV0IGNoZWNrIGRpdmlzaW9uIGJ5IHplcm8gZmlyc3QuCisJCWlmIChEb3VibGUucGFyc2VEb3VibGUobGV2ZWwyUG9seWdvbkFyZWEpIDw9IDApIHsKKwkJCXJldHVybiBERUZBVUxUOworCQl9CisKKwkJZG91YmxlIHJhdGlvID0gRG91YmxlLnBhcnNlRG91YmxlKGxldmVsMlBvbHlnb25BcmVhKQorCQkJCS8gRG91YmxlLnBhcnNlRG91YmxlKGxldmVsMVBvbHlnb25BcmVhKTsKKworCQlTdHJpbmcgYXJlYSA9IFN0cmluZworCQkJCS52YWx1ZU9mKHJhdGlvICogRG91YmxlLnBhcnNlRG91YmxlKGxldmVsMUFyZWFTcUttKSk7CisKKwkJcmV0dXJuIGFyZWE7CisJfQorCisJLyoqCisJICogRmluZCB0aGUgYXBwcm94aW1hdGUgYXJlYSB2YWx1ZSBmb3IgYSBrbm93biBsb2NhdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gbGV2ZWwxQ29udGFpbmVyCisJICogQHBhcmFtIGxldmVsMENvbnRhaW5lcgorCSAqIEBwYXJhbSBhZ2dyZWF0ZUxldmVsMVBvbHlnb25BcmVhCisJICogQHBhcmFtIGxldmVsMUFyZWFTcUttCisJICogCisJICogQHJldHVybiB0aGUgYXBwcm94aW1hdGUgYXJlYSB2YWx1ZQorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXBwcm94aW1hdGVMMUFyZWEoU3RyaW5nIGxldmVsMUNvbnRhaW5lciwKKwkJCVN0cmluZyBsZXZlbDBDb250YWluZXIsIFN0cmluZyBhZ2dyZWdhdGVMZXZlbDFQb2x5Z29uQXJlYSwKKwkJCVN0cmluZyBsZXZlbDBBcmVhU3FLbSkgeworCisJCS8vIEZpbmQgdGhlIGFyZWEgaW4gcG9seWdvbiB1bml0cyBvZiB0aGUgbGV2ZWwgMSBjb250YWluZXIKKwkJU3RyaW5nIGxldmVsMVBvbHlnb25BcmVhID0gZ2V0UG9seWdvbkFyZWEobGV2ZWwxQ29udGFpbmVyLAorCQkJCWxldmVsMENvbnRhaW5lciwgbGV2ZWwxUG9seWdvbkFyZWFMaXN0LCAxKTsKKworCQkvLyBDb21wdXRlIHRoZSBhcHByb3hpbWF0ZSBhcmVhLCBidXQgY2hlY2sgZGl2aXNpb24gYnkgemVybyBmaXJzdC4KKwkJaWYgKERvdWJsZS5wYXJzZURvdWJsZShsZXZlbDFQb2x5Z29uQXJlYSkgPD0gMCkgeworCQkJcmV0dXJuIERFRkFVTFQ7CisJCX0KKworCQlkb3VibGUgcmF0aW8gPSBEb3VibGUucGFyc2VEb3VibGUobGV2ZWwxUG9seWdvbkFyZWEpCisJCQkJLyBEb3VibGUucGFyc2VEb3VibGUoYWdncmVnYXRlTGV2ZWwxUG9seWdvbkFyZWEpOworCisJCVN0cmluZyBhcmVhID0gU3RyaW5nCisJCQkJLnZhbHVlT2YocmF0aW8gKiBEb3VibGUucGFyc2VEb3VibGUobGV2ZWwwQXJlYVNxS20pKTsKKworCQlyZXR1cm4gYXJlYTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcmV0dXJuIHN1bSBvZiBhbGwgbGV2ZWwgSyBhcmVhcyBlaXRoZXIgaW4gcG9seWdvbiB1bml0cworCSAqIAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0QWdncmVnYXRlQXJlYShMaXN0IGFyZWFMaXN0KSB7CisKKwkJZmluYWwgaW50IEFSRUEgPSAzOworCQlEb3VibGUgYWdncmVnYXRlID0gbmV3IERvdWJsZSgwLjApOworCisJCWlmIChhcmVhTGlzdCA9PSBudWxsKQorCQkJcmV0dXJuICIxLjAiOyAvLyROT04tTkxTLTEkCisJCUl0ZXJhdG9yIGl0ID0gYXJlYUxpc3QuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJU3RyaW5nW10gYXJlYURhdGEgPSAoKFN0cmluZykgaXQubmV4dCgpKS5zcGxpdCgiOiIpOyAvLyROT04tTkxTLTEkCisJCQlhZ2dyZWdhdGUgKz0gRG91YmxlLnBhcnNlRG91YmxlKGFyZWFEYXRhW0FSRUFdLnRyaW0oKSk7CisJCX0KKworCQlyZXR1cm4gRG91YmxlLnRvU3RyaW5nKGFnZ3JlZ2F0ZSk7CisJfQorCisJLyoqCisJICogTWFpbiBleGVjdXRpb24gZW50cnkgcG9pbnQuCisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCS8vIGZpbmFsIGludCBJU09fMzE2Nl8xID0gMDsKKwkJLy8gZmluYWwgaW50IElTT18zMTY2XzIgPSAxOworCQkvLyBmaW5hbCBpbnQgRklYX0ZJTEUgPSAyOworCQkvLyBmaW5hbCBpbnQgQVJFQV9EQVRBID0gMzsKKwkJLy8gZmluYWwgaW50IFRBUkdFVF9MSVNUID0gNDsKKwkJLy8gZmluYWwgaW50IFBPTFlHT05fQVJFQVMgPSA1OworCQkvLyBmaW5hbCBpbnQgTEVYX0RJUiA9IDY7CisJCS8vIGZpbmFsIGludCBPVVRQVVRfRElSID0gNzsKKwkJLy8gZmluYWwgaW50IFBBUkFNUyA9IDg7CisJCS8vCisJCS8vIGlmIChhcmdzLmxlbmd0aCA8IFBBUkFNUykgeworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tV3JvbmcgYXJndW1lbnRzLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0CisJCS8vIC5wcmludGxuKCJcdFRvIHJ1biwgcGxlYXNlIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhcmd1bWVudHMgOiAiKTsKKwkJLy8gLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgSVNPIDMxNjYtMSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IElTTyAzMTY2LTIgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBJU08gZml4IGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgQXJlYSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IFRhcmdldCBjb3VudHJpZXMgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBQb2x5Z29uIGFyZWFzIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IExleGljb2dyYXBoaWMgc29ydGluZyBkaXJlY3RvcnkiKTsKKwkJLy8gLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgT3V0cHV0IGRpcmVjdG9yeSIpOyAvLyROT04tTkxTLTEkCisJCS8vIHJldHVybjsKKwkJLy8gfQorCisJCS8vIEFyZWFHZW5lcmF0b3IgZ2VuID0gbmV3IEFyZWFHZW5lcmF0b3IoYXJnc1tJU09fMzE2Nl8xXSwKKwkJLy8gYXJnc1tJU09fMzE2Nl8yXSwgYXJnc1tGSVhfRklMRV0sIGFyZ3NbQVJFQV9EQVRBXSwKKwkJLy8gYXJnc1tUQVJHRVRfTElTVF0sIGFyZ3NbUE9MWUdPTl9BUkVBU10sIGFyZ3NbTEVYX0RJUl0sCisJCS8vIGFyZ3NbT1VUUFVUX0RJUl0pOworCisJCWZpbmFsIGludCBDT05GSUdfRklMRSA9IDA7CisJCWZpbmFsIGludCBQQVJBTVMgPSAxOworCisJCWlmIChhcmdzLmxlbmd0aCA8IFBBUkFNUykgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0LS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJcdFx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50KHMpIDogIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0IENvbmZpZ3VyYXRpb24gZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJfQorCisJCUFyZWFHZW5lcmF0b3IgZ2VuID0gbmV3IEFyZWFHZW5lcmF0b3IoYXJnc1tDT05GSUdfRklMRV0pOworCQlnZW4ucnVuKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0F0dGVudWF0ZUxvZ0ZpbGUuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvQXR0ZW51YXRlTG9nRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OTU2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0F0dGVudWF0ZUxvZ0ZpbGUuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VuZXJhdG9yczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworLyoqCisgKiBUaGUgdXRpbGl0eSBhdHRlbnVhdGVzIHNlYXNvbmFsIGRhdGEgdG8gZGFtcGVuIGluZmVjdGlvdXMgY2FzZXMgZHVyaW5nIHNlYXNvbnMgd2hlbgorICogYSBwYXJ0aWN1bGFyIHN0cmFpbiBpcyBub3QgZG9taW5hbnQuIEZvciBpbnN0YW5jZSwgaWYgYSBsb2cgZmlsZSBjb250YWlucyBpbmZsdWVuemEKKyAqIGNhc2VzIGZvciAxMCB5ZWFycyB3b3J0aCBvZiBkYXRhLCBhbmQgeWVhciAxLCAyLCA1IGFuZCA3IG9mIHRob3NlIHllYXJzIGhhZCBIM04yIHN0cmFpbiwKKyAqIHlvdSBjYW4gdXNlIHRoZSBwcm9ncmFtIHRvIGdldCByaWQgb2YgdGhlIHBlYWtzIGZvciB5ZWFyIDMsIDQsIDYsIDgsIDkgYW5kIDEwLgorICovCitwdWJsaWMgY2xhc3MgQXR0ZW51YXRlTG9nRmlsZSB7CisKKwlzdGF0aWMgU3RyaW5nIExTID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCisJCisJCisJLyoqCisJICogTkxTIFByZWZpeCBmb3IgSW5mZWN0b3IgbmFtZQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluZmVjdG9yUHJlZml4ID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbm9jdWxhdG9yLjEiKTsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIE5MUyBQcmVmaXggZm9yIElub2N1bGF0b3IgbmFtZQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlub2N1bGF0b3JQcmVmaXggPSBNZXNzYWdlcy5nZXRTdHJpbmcoIklub2N1bGF0b3IuMiIpOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgeworCQlpZihhcmdzLmxlbmd0aCA8IDQpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IEF0dGVudWF0ZUxvZ0ZpbGUgPGxvZyBmaWxlPiA8Y3ljbGUgcGVyaW9kPiA8c3RhcnQgb2Zmc2V0PiA8c2lnbmFsMT4gPHNpZ25hbDI+IC4uLiA8c2lnbmFsIG4+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5leGl0KC0xKTsKKwkJfQorCQkKKwkJU3RyaW5nIGxvZ0ZpbGUgPSBhcmdzWzBdOworCQlkb3VibGUgcGVyaW9kID0gRG91YmxlLnBhcnNlRG91YmxlKGFyZ3NbMV0pOworCQlpbnQgb2Zmc2V0ID0gSW50ZWdlci5wYXJzZUludChhcmdzWzJdKTsKKwkJZG91YmxlIGRhbXAgID0gRG91YmxlLnBhcnNlRG91YmxlKGFyZ3NbM10pOworCQkKKwkJaW50IFtdIHNpZ25hbCA9IG5ldyBpbnRbYXJncy5sZW5ndGgtNF07CisJCWZvcihpbnQgaT00O2k8YXJncy5sZW5ndGg7KytpKSBzaWduYWxbaS00XT1JbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaV0pOworCQkKKwkJQXJyYXlMaXN0PFN0cmluZz5oZWFkZXJzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCUFycmF5TGlzdDxBcnJheUxpc3Q8U3RyaW5nPj5sb2dUZXh0ID0gbmV3IEFycmF5TGlzdDxBcnJheUxpc3Q8U3RyaW5nPj4oKTsKKwkJQXJyYXlMaXN0PEFycmF5TGlzdDxEb3VibGU+PmxvZ0RhdGEgPSBuZXcgQXJyYXlMaXN0PEFycmF5TGlzdDxEb3VibGU+PigpOworCQkKKwkJdHJ5IHsKKwkJCSAvLyBSZWFkIGluZmVjdGlvdXMgZmlsZQorCQkJIEZpbGVJbnB1dFN0cmVhbSBpZmlsZSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obG9nRmlsZSk7IAorCQkgICAgIEJ1ZmZlcmVkUmVhZGVyIGlyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlmaWxlKSk7CisJCSAgICAgU3RyaW5nIGhlYWRlciA9IG51bGw7CisJCSAgICAgaGVhZGVyPWlyZWFkZXIucmVhZExpbmUoKTsKKwkJICAgICBpZihoZWFkZXIgPT0gbnVsbCkgeworCQkgICAgCSBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yLCAiK2FyZ3NbMF0rIiBmaWxlIGlzIGVtcHR5ISIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJICAgIAkgU3lzdGVtLmV4aXQoLTIpOworCQkgICAgIH0KKwkJICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGhlYWRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAorCQkgICAgIGludCBjb2x1bW4gPSAwOworCQkgICAgIHdoaWxlKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworCQkgICAgCSBTdHJpbmcgdmFsID0gc3QubmV4dFRva2VuKCk7CisJCSAgICAJIGhlYWRlcnMuYWRkKHZhbC50cmltKCkpOworCQkgICAgCSArK2NvbHVtbjsKKwkJICAgICB9CisJCSAgICAKKwkJICAgIFN0cmluZyBkYXRhID0gbnVsbDsgCisJCSAgICBkYXRhPWlyZWFkZXIucmVhZExpbmUoKTsKKwkJICAgIGlmKGRhdGEgPT0gbnVsbCkgeworCQkgICAgCSBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yLCAiK2FyZ3NbMF0rIiBmaWxlIGhhcyBubyBkYXRhISIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJICAgIAkgU3lzdGVtLmV4aXQoLTIpOworCQkgICAgIH0KKwkJICAgIAorCQkgICAgd2hpbGUoZGF0YSAhPSBudWxsICYmIGRhdGEudHJpbSgpLmxlbmd0aCgpID4gMCkgeworCQkgICAgCisJCQkgICAgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRhdGEsICIsIik7IC8vJE5PTi1OTFMtMSQKKwkJCSAgICBjb2x1bW4gPSAwOworCQkJICAgIEFycmF5TGlzdDxTdHJpbmc+IHR4dGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCSAgICBBcnJheUxpc3Q8RG91YmxlPiBkYXRhbGlzdCA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQkJU3RyaW5nIHZhbCA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKKwkJCQkJaWYoY29sdW1uIDwgMikKKwkJCQkJCXR4dGxpc3QuYWRkKHZhbCk7CisJCQkJCWVsc2UKKwkJCQkJCWRhdGFsaXN0LmFkZChEb3VibGUucGFyc2VEb3VibGUodmFsKSk7CisJCQkJICAgICsrIGNvbHVtbjsKKwkJCSAgICB9IC8vIHJlYWQgdG9rZW5zCisJCQkJbG9nVGV4dC5hZGQodHh0bGlzdCk7CisJCQkJbG9nRGF0YS5hZGQoZGF0YWxpc3QpOworCQkJCWRhdGE9aXJlYWRlci5yZWFkTGluZSgpOworCQkgICAgfQorCQkgICAgaXJlYWRlci5jbG9zZSgpOworCQkgICAgCisJCSAgICAvLyBQcm9jZXNzIHRoZSBkYXRhCisJCSAgICAKKwkJICAgIGludCBkYXkgPSBvZmZzZXQ7CisJCSAgICBpbnQgeWVhciA9IDA7CisJCSAgICBkb3VibGUgc3RhcnROZXdZZWFyID0gcGVyaW9kOworCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJzaWduYWw6ICIrc2lnbmFsKTsKKwkJICAgIGZvcihpbnQgaT0wO2k8bG9nVGV4dC5zaXplKCk7KytpKSB7CisJCSAgICAJaW50IHNpZyA9IHNpZ25hbFt5ZWFyXTsKKwkJICAgIAlBcnJheUxpc3Q8RG91YmxlPiBpbmZkYXRhID0gbG9nRGF0YS5nZXQoaSk7CisJCSAgICAJaWYoc2lnID09IDApCisJCSAgICAJCWZvcihpbnQgaj0wO2o8aW5mZGF0YS5zaXplKCk7KytqKSBpbmZkYXRhLnNldChqLCBpbmZkYXRhLmdldChqKSpkYW1wKTsKKwkJICAgIAkKKwkJICAgIAlkYXkgKz0gMTsKKwkJICAgIAlpZihkYXkgPiBzdGFydE5ld1llYXIpIHsKKwkJICAgIAkJc3RhcnROZXdZZWFyICs9IHBlcmlvZDsKKwkJICAgIAkJKyt5ZWFyOworCQkgICAgCX0KKwkJICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oIml0ZXJhdGlvbiAiK2krIiBzaWduYWw6ICIrc2lnKTsKKwkJICAgIH0KKwkJICAgIAorCQkgICAgRmlsZVdyaXRlciBvdXRmdyA9IG5ldyBGaWxlV3JpdGVyKGxvZ0ZpbGUrIi5uZXcuY3N2Iik7CisJCSAgICBmb3IoaW50IGk9MDtpPGhlYWRlcnMuc2l6ZSgpOysraSkgeworCQkgICAgCW91dGZ3LndyaXRlKGhlYWRlcnMuZ2V0KGkpKTsKKwkJICAgIAlpZihpIDxoZWFkZXJzLnNpemUoKS0xKSBvdXRmdy53cml0ZSgiLCIpOworCQkgICAgfQorCQkgICAgb3V0Zncud3JpdGUoTFMpOworCQkgICAgCisJCSAgICBmb3IoaW50IGk9MDtpPGxvZ1RleHQuc2l6ZSgpOysraSkgeworCQkgICAgCSBBcnJheUxpc3Q8U3RyaW5nPiB0eHRsaXN0ID0gbG9nVGV4dC5nZXQoaSk7CisJCQkJIEFycmF5TGlzdDxEb3VibGU+IGRhdGFsaXN0ID0gbG9nRGF0YS5nZXQoaSk7CisJCQkJIGZvcihTdHJpbmcgdDp0eHRsaXN0KSBvdXRmdy53cml0ZSh0KyIsIik7CisJCQkJIGZvcihpbnQgaj0wO2o8ZGF0YWxpc3Quc2l6ZSgpOysraikgeworCQkJCQkgb3V0Zncud3JpdGUoZGF0YWxpc3QuZ2V0KGopKyIiKTsKKwkJCQkJIGlmKGo8ZGF0YWxpc3Quc2l6ZSgpLTEpb3V0Zncud3JpdGUoIiwiKTsKKwkJCQl9CisJCQkJIG91dGZ3LndyaXRlKExTKTsKKwkJICAgIH0JCSAgICAKKwkJfSBjYXRjaChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQkKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0NhbmFkYURhdGFDbGVhbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0NhbmFkYURhdGFDbGVhbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjMjEzNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvQ2FuYWRhRGF0YUNsZWFuZXIuamF2YQpAQCAtMCwwICsxLDM0MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VuZXJhdG9yczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogU1RFTSBJSSBEYXRhIE1pZ3JhdGlvbi9HZW5lcmF0aW9uIFV0aWxpdGllcyA6IEluc3RhbmNlcyBvZiB0aGlzIHV0aWxpdHkgY2xhc3MKKyAqIGNsZWFuIHRoZSBkYXRhIGZvciBDYW5hZGEuIFRoaXMgcHJvZ3JhbSB3aWxsIHJlbW92ZSBhbGwgdW5uZWNlc2FyeSBkYXRhIGZyb20KKyAqIHRoZSBvcmlnaW5hbCBkYXRhIHNvdXJjZSBmaWxlIGZvciBDYW5hZGEuIFRoZSBvcmlnaW5hbCBkYXRhIHNvdXJjZSBmaWxlIGZvcgorICogQ2FuYWRhIHdhcyBkb3dubG9hZGVkIGZyb20gOgorICogaHR0cDovL3d3dy5nZW9jb21tLmNvbS9mYXEvY29weXJpZ2h0Lmh0bWwKKyAqIAorICogCisgKiBBZGQgdGhlIGZvbGxvd2luZyB2YWx1ZXMgdG8gdGhlIHJ1biBjb25maWd1cmF0aW9uOgorICogCisgKiBDOlx3b3Jrc3BhY2UyXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXGlucHV0XHByb3BlcnRpZXNcQ291bnRyaWVzTGlnaHQudHh0IAorICogQzpcc2hhcGVGaWxlc1xjYW5hZGFcCisgKiAKKyAqIG9uIG5lbHNvbnMgbWFjaGluZSBpdCB1c2VkIHRvIGJlLi4uCisgKiAKKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxwcm9wZXJ0aWVzXEV1cm9wZUNvdW50cmllcy50eHQKKyAqIEM6XEV1cm9wZURhdGEyMDA3XENhbmFkYVwKKyAqIAorICogT3ZlcnZpZXcgb2YgdGhlIGRhdGEgZ2VuZXJhdGlvbiBwcm9jZXNzIGZvciB0aGUgQ2FuYWRhIGRhdGEgc2V0LgorICogCisgKiAxKSBEYXRhIENsZWFuaW5nIDogc3RhcnQgYnkgcnVubmluZyBDYW5hZGFEYXRhQ2xlYW5lci4gVGhpcyBwcm9ncmFtIHdpbGwKKyAqIHJlbW92ZSBhbGwgdW5uZWNlc2FyeSBkYXRhIChpLmUuIGNvbHVtbnMpIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gSW4KKyAqIGFkZGl0aW9uLCB0aGlzIHByb2dyYW0gd2lsbCBncm91cCB0aGUgZGF0YSBiYXNlZCBvbiBpdHMgSUQgKGkuZS4gTk8sSVQsRlIsVUssCisgKiBldGMpLiBUaGUgcmVzdWx0IHdpbGwgYmUgYSBmaWxlIG5hbWVkIENhbmFkYVNvcnRlZC50eHQgd2l0aCBjbGVhbmVkIGRhdGEuCisgKiAKKyAqIEluIG90aGVyIHdvcmRzIDogQ2FuYWRhLnR4dCAtLT4gfHxDYW5hZGFEYXRhQ2xlYW5lcnx8IC0tPiBDYW5hZGFTb3J0ZWQudHh0CisgKiAKKyAqIE5PVEU6IENhbmFkYVNvcnRlZC50eHQgd2lsbCBiZSB1c2VkIGFzIHRoZSBpbnB1dCBmb3IgdGhlIHJlbWFpbmluZyBwYXJ0IG9mCisgKiB0aGUgcHJvY2Vzcy4KKyAqIAorICogCisgKiAyKSBEYXRhIENvbnZlcnRlciA6IHJ1biBDYW5hZGFEYXRhQ29udmVydGVyIHRvIGNvbnZlcnQgZmlsZSBpbiBjbGVhbmVkIGZvcm1hdAorICogaW50byBEaXZhIGZvcm1hdC4KKyAqIAorICogCisgKiAzKSBBcmVhIGFuZCBQb3B1bGF0aW9uIERhdGEgRXh0cmFjdGlvbiA6IHJ1biBDYW5hZGFEYXRhRXh0cmFjdG9yIHRvIGV4dHJhY3QKKyAqIGFyZWEgYW5kIHBvcHVsYXRpb24gZGF0YSBvciBhbGwgYWRtaW5pc3RyYXRpb25zIGluIENhbmFkYS4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgQ2FuYWRhRGF0YUNsZWFuZXIgeworCisJcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0RmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBvdXRwdXREaXIgPSBudWxsOworCisJLyoqCisJICogTGlzdCBmb3IgSVNPIDMxNjYtMSBjb2RlcyBhbmQgdGFyZ2V0IGNvdW50cmllcy4KKwkgKi8KKwlMaXN0PFN0cmluZz4gdGFyZ2V0TGlzdCA9IG51bGw7CisKKwlMaXN0PFN0cmluZz4gY29kZUxpc3QgPSBudWxsOworCisJLyoqCisJICogSGFzaCBtYXAgdG8ga2VlcCB0cmFjayBvZiBwb2x5Z29ucy4KKwkgKi8KKwlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gdGFyZ2V0RmlsZSAtCisJICogICAgICAgICAgICBkYXRhIGZpbGUgd2hlcmUgd2UgZmluZCBhIGxpc3Qgb2YgY291bnRyaWVzIGZvciBnZW5lcmF0aW9uIG9mCisJICogICAgICAgICAgICB0aGVpciBjb3JyZXNwb25kaW5nIGFyZWEucHJvcGVydGllcyBmaWxlcy4KKwkgKiBAcGFyYW0gb3V0cHV0RGlyIC0KKwkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGUgZmlsZXMgZ2VuZXJhdGVkLgorCSAqIAorCSAqLworCXB1YmxpYyBDYW5hZGFEYXRhQ2xlYW5lcihTdHJpbmcgdGFyZ2V0RmlsZSwgU3RyaW5nIG91dHB1dERpcikgeworCQkvLyBTZXQgdmFsdWVzIG9mIGdsb2JhbCB2YXJpYWJsZXMuCisJCXRoaXMudGFyZ2V0RmlsZSA9IHRhcmdldEZpbGU7CisJCXRoaXMub3V0cHV0RGlyID0gb3V0cHV0RGlyOworCQl0YXJnZXRMaXN0ID0gbnVsbDsKKwkJbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2V0cyB1cCBhbmQgcnVucyB0aGUgZmluZGVyLgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBjb3VudHJpZXMgd2Ugd2FudC4KKwkJdGFyZ2V0TGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdCh0YXJnZXRGaWxlKTsKKworCQkvLyBOb3csIHByb2Nlc3MgZWFjaCBpdGVtIGluIHRoZSB0YXJnZXQgbGlzdC4KKwkJcHJvY2VzcygpOworCX0KKworCS8qKgorCSAqIFByb2Nlc3Mgb3VyIGdsb2JhbCBsaXN0IG9mIHRhcmdldCBjb3VudHJpZXMuCisJICogCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJvY2VzcygpIHsKKworCQkvLyBBIHdyaXRlciBmb3IgdGhlIG5ldyBmaWxlIHdlIGFyZSBjcmVhdGluZy4KKwkJUHJpbnRXcml0ZXIgY2FuYWRhRmlsZSA9IG51bGw7CisKKwkJLy8gTmFtZSBvZiB0aGUgbmV3IHByb3BlcnRpZXMgZmlsZS4KKwkJU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKKworCQlpbnQgc2l6ZSA9IHRhcmdldExpc3Quc2l6ZSgpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisKKwkJCS8vIEdldCB0aGUgbmV4dCBjb3VudHJ5IGluIHRoZSBsaXN0LgorCQkJU3RyaW5nIGZpbGUgPSB0YXJnZXRMaXN0LmdldChpKS50cmltKCk7CisKKwkJCS8vIE9wZW4gdGhlIGRhdGEgc291cmNlIGZpbGUgZm9yIHRoaXMgY291bnRyeS4KKwkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IEdlblV0aWxzLm9wZW5SZWFkZXIoZmlsZSk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIjw8PDwgUHJvY2Vzc2luZyBDb3VudHJ5IDogIiArIGZpbGUgKyAiID4+Pj4iKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAorCQkJdHJ5IHsKKworCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgeworCisJCQkJCVN0cmluZyBidWZmZXIgPSBudWxsOworCisJCQkJCS8vIFdlIHRha2UgYSBjaHVuayBvZiB0aGUgZGF0YSBbQlVGRkVSX01JTixCVUZGRVJfTUFYXSB0bworCQkJCQkvLyBtYWtlIHByb2Nlc3NpbmcgbW9yZQorCQkJCQkvLyBlZmZpY2llbnQsIHdlIGRvbnQgbmVlZCBhbGwgb2YgaXQuCisJCQkJCWludCBCVUZGRVJfTUlOID0gMDsKKwkJCQkJaW50IEJVRkZFUl9NQVggPSAxMDA7CisKKwkJCQkJd2hpbGUgKEdlblV0aWxzLkVPRihidWZmZXIgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gdHJ1ZSkgeworCisJCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBtYXJrIGFsbCB1bmtub3duIGRhdGEuCisJCQkJCQlidWZmZXIgPSBidWZmZXIucmVwbGFjZSgiLCwsIiwgIixVTktOT1dOLFVOS05PV04sIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJYnVmZmVyID0gYnVmZmVyLnJlcGxhY2UoIiwsIiwgIixVTktOT1dOLCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCQkJU3RyaW5nW10gaXRlbXMgPSBidWZmZXIuc3Vic3RyaW5nKEJVRkZFUl9NSU4sCisJCQkJCQkJCUJVRkZFUl9NQVgpLnNwbGl0KCIsIik7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJLy8gQ2xlYXIgYnVmZmVyIG9mIGRhdGEgd2UgZG9udCBuZWVkLgorCQkJCQkJU3RyaW5nIGNsZWFuQnVmZmVyID0gY2xlYW4oYnVmZmVyKTsKKworCQkJCQkJRmlsZSBjb3VudHJ5RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyKTsKKworCQkJCQkJaWYgKGNvdW50cnlEaXIgIT0gbnVsbCAmJiBjb3VudHJ5RGlyLmV4aXN0cygpID09IGZhbHNlKSB7CisJCQkJCQkJLy8gRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBDcmVhdGUgaXQuCisJCQkJCQkJY291bnRyeURpci5ta2RpcigpOworCQkJCQkJfQorCisJCQkJCQkvLyBDcmVhdGUgYW5kIG9wZW4gdGhlIG5ldyBmaWxlLgorCQkJCQkJaWYgKGNhbmFkYUZpbGUgPT0gbnVsbCkgeworCQkJCQkJCWZpbGVOYW1lID0gY291bnRyeURpciArICJcXCIgKyAiQ2FuYWRhU29ydGVkLnR4dCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQkJCQkJCQorCQkJCQkJCS8vIENyZWF0ZSB0bmUgbmV3IHByb3BlcnRpZXMuZmlsZSBmb3IgdGhpcyBjb3VudHJ5LgorCQkJCQkJCWNhbmFkYUZpbGUgPSBHZW5VdGlscy5vcGVuV3JpdGVyKGZpbGVOYW1lKTsKKwkJCQkJCX0KKworCQkJCQkJU3RyaW5nIHZhbCA9IG1hcAorCQkJCQkJCQkuZ2V0KGl0ZW1zW0NhbmFkYURhdGFDbGVhbmluZ0hlYWRlci5OQU1FMV0pOworCQkJCQkJaWYgKHZhbCAhPSBudWxsKSB7CisJCQkJCQkJLy8gQ29uY2F0ZW5hdGUKKwkJCQkJCQl2YWwgKz0gY2xlYW5CdWZmZXIgKyAiXG4iOyAvLyROT04tTkxTLTEkCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIEZpcnN0IGVudHJ5CisJCQkJCQkJdmFsID0gY2xlYW5CdWZmZXIgKyAiXG4iOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CisJCQkJCQltYXAucHV0KGl0ZW1zW0NhbmFkYURhdGFDbGVhbmluZ0hlYWRlci5OQU1FMV0sIHZhbCk7CisKKwkJCQkJfS8vIHdoaWxlCisKKwkJCQkJLy8gQ2xvc2UgYWxsIG9wZW4gcmVzb3VyY2VzLgorCQkJCQlyZWFkZXIuY2xvc2UoKTsKKworCQkJCQlpZiAoY2FuYWRhRmlsZSAhPSBudWxsKSB7CisJCQkJCQlTdHJpbmcgb3V0cHV0ID0gY29uc29saWRhdGVEYXRhKG1hcCk7CisJCQkJCQlpZiAob3V0cHV0ICE9IG51bGwpIHsKKwkJCQkJCQlHZW5VdGlscy5hZGREYXRhKGNhbmFkYUZpbGUsIG91dHB1dCk7CisJCQkJCQl9CisJCQkJCQljYW5hZGFGaWxlLmNsb3NlKCk7CisJCQkJCQljYW5hZGFGaWxlID0gbnVsbDsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCSsgZmlsZU5hbWUpOworCQkJCQkJZmlsZU5hbWUgPSBudWxsOworCQkJCQl9CisKKwkJCQkJLy8gUnVuIGdhcmJhZ2UgY29sbGVjdGlvbgorCQkJCQkvL1N5c3RlbS5nYygpOworCisJCQkJfQorCisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKworCQl9IC8vIGZvcgorCisJfQorCisJLyoqCisJICogCisJICogR2V0IGFsbCB0aGUgdmFsdWVzIGluIHRoZSBtYXAuCisJICogCisJICogQHBhcmFtIG1hcAorCSAqICAgICAgICAgICAgYSBtYXAgb2YgbG9jYXRpb25zCisJICogCisJICogQHJldHVybiBTdHJpbmcgYSBzdHJpbmcgd2lsbCBhbGwgbG9jYXRpb25zIGdyb3VwZWQgc2VjdWVudGlhbHkuCisJICogCisJICovCisJU3RyaW5nIGNvbnNvbGlkYXRlRGF0YShIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXApIHsKKworCQlTdHJpbmcgdmFsdWUgPSBudWxsOworCisJCWlmIChtYXAuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCVNldDxTdHJpbmc+IGtleXMgPSBtYXAua2V5U2V0KCk7CisKKwkJSXRlcmF0b3IgaXQgPSBrZXlzLml0ZXJhdG9yKCk7CisKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXQubmV4dCgpOworCisJCQlpZiAodmFsdWUgPT0gbnVsbCkgeworCQkJCXZhbHVlID0gbWFwLmdldChrZXkpOworCQkJfSBlbHNlIHsKKwkJCQl2YWx1ZSArPSBtYXAuZ2V0KGtleSk7CisJCQl9CisKKwkJfQorCisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgYWxsIGlycmVsZXZhbnQgZGF0YSBmcm9tIG91ciBidWZmZXIKKwkgKi8KKwlTdHJpbmcgY2xlYW4oU3RyaW5nIGJ1ZmZlcikgeworLy8gY291bnQgYnkgMQorCQlmaW5hbCBpbnQgTElNSVQgPSA5OworCQlTdHJpbmcgbmV3QnVmZmVyID0gbnVsbDsKKworCQlTdHJpbmdbXSBpdGVtcyA9IGJ1ZmZlci5zcGxpdCgiLCIpOyAvLyROT04tTkxTLTEkCisKKwkJaW50IGluZGV4ID0gMDsKKworCQl3aGlsZSAoaW5kZXggPCBpdGVtcy5sZW5ndGgpIHsKKworCQkJaWYgKGluZGV4ID49IExJTUlUKSB7CisJCQkJbmV3QnVmZmVyICs9ICIsIiArIGl0ZW1zW2luZGV4KytdOyAvLyROT04tTkxTLTEkCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8vIHNldCB0aGUgY291bnRyeSBuYW1lIG1hbnVhbGx5CisJCQkKKwkJCW5ld0J1ZmZlciA9ICJDQU4sIENBTkFEQSI7IC8vJE5PTi1OTFMtMSQKKwkJCQorCQkJc3dpdGNoIChpbmRleCkgeworLyoKKwkJCWNhc2UgQ2FuYWRhRGF0YUNsZWFuaW5nSGVhZGVyLklEOgorCQkJCW5ld0J1ZmZlciA9IGl0ZW1zW2luZGV4XTsKKwkJCQlicmVhazsKKyovCisJCQkKKworICAgICAgICAgICAgLyoKKwkJCWNhc2UgQ2FuYWRhRGF0YUNsZWFuaW5nSGVhZGVyLkFSRUE6CisJCQkJbmV3QnVmZmVyID0gIiwiICsgaXRlbXNbaW5kZXhdOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ2FuYWRhRGF0YUNsZWFuaW5nSGVhZGVyLkNPVU5UUlk6CisJCQkJbmV3QnVmZmVyICs9ICIsIiArIGl0ZW1zW2luZGV4XTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworICAgICAgICAgICAgKi8KKwkJCWNhc2UgQ2FuYWRhRGF0YUNsZWFuaW5nSGVhZGVyLk5BTUUxOgorCQkJCW5ld0J1ZmZlciArPSAiLCIgKyBpdGVtc1tpbmRleF07IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKy8qCisJCQljYXNlIENhbmFkYURhdGFDbGVhbmluZ0hlYWRlci5OQU1FMjoKKwkJCQluZXdCdWZmZXIgKz0gIiwiICsgaXRlbXNbaW5kZXhdOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ2FuYWRhRGF0YUNsZWFuaW5nSGVhZGVyLk5BTUUzOgorCQkJCW5ld0J1ZmZlciArPSAiLCIgKyBpdGVtc1tpbmRleF07IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKworCQkJY2FzZSBDYW5hZGFEYXRhQ2xlYW5pbmdIZWFkZXIuUE9QMToKKwkJCQluZXdCdWZmZXIgKz0gIiwiICsgaXRlbXNbaW5kZXhdOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ2FuYWRhRGF0YUNsZWFuaW5nSGVhZGVyLlBPUDI6CisJCQkJbmV3QnVmZmVyICs9ICIsIiArIGl0ZW1zW2luZGV4XTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworKi8KKwkJCX0KKworCQkJaW5kZXgrKzsKKworCQl9CisKKwkJcmV0dXJuIG5ld0J1ZmZlcjsKKworCX0KKworCS8qKgorCSAqIE1haW4gZXhlY3V0aW9uIGVudHJ5IHBvaW50LgorCSAqIAorCSAqIEBwYXJhbSBhcmdzCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlmaW5hbCBpbnQgVEFSR0VUX0xJU1QgPSAwOworCQlmaW5hbCBpbnQgT1VUUFVUX0RJUiA9IDE7CisJCWZpbmFsIGludCBQQVJBTVMgPSAyOworCisJCWlmIChhcmdzLmxlbmd0aCA8IFBBUkFNUykgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCItLVdyb25nIGFyZ3VtZW50cy0tIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQKKwkJCQkJLnByaW50bG4oIlx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyA6ICIpOyAvLyROT04tTkxTLTEkCQkJCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgVGFyZ2V0IGNvdW50cmllcyBmaWxlIik7IC8vJE5PTi1OTFMtMSQJCQkKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBPdXRwdXQgZGlyZWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQJCQkJCQorCQkJcmV0dXJuOworCQl9CisKKwkJQ2FuYWRhRGF0YUNsZWFuZXIgZm9ybWF0dGVyID0gbmV3IENhbmFkYURhdGFDbGVhbmVyKGFyZ3NbVEFSR0VUX0xJU1RdLAorCQkJCWFyZ3NbT1VUUFVUX0RJUl0pOworCQlmb3JtYXR0ZXIucnVuKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9DYW5hZGFEYXRhQ2xlYW5pbmdIZWFkZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvQ2FuYWRhRGF0YUNsZWFuaW5nSGVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM3MzdhNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvQ2FuYWRhRGF0YUNsZWFuaW5nSGVhZGVyLmphdmEKQEAgLTAsMCArMSw0NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VuZXJhdG9yczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogCisgKiBSZWxldmFudCBrZXlzIHRvIHRoZSBDYW5hZGlhbiBkYXRhc2V0LiBLZXlzIGluIHRoaXMgY2xhc3MgYXJlIHVzZWQgZHVyaW5nIHRoZQorICogZGF0YSBjbGVhbmluZyBwcm9jZXNzIHRvIGV4dHJhY3Qgb25seSB0aGUgcmVsZXZhbnQga2V5cyBmcm9tIHRoZSBvcmlnaW5hbAorICogZGF0YSBzb3VyY2UgZmlsZSBmb3IgQ2FuYWRhLiBUaGVzZSBrZXlzIGFyZSB1c2VkIHdoZW4gcnVubmluZyBhbiBpbnN0YW5jZSBvZgorICogUnVzc2lhRGF0YUNsZWFuZXIgdG8gcGVyZm9ybSBkYXRhIGNsZWFuaW5nLgorICogCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDYW5hZGFEYXRhQ2xlYW5pbmdIZWFkZXIgeworCisJLyoqCisJICogVG90YWwgQXJlYQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSRUEgPSAxOworCisJLyoqCisJICogQ291bnRyeSBpZGVudGlmaWVyCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRSWSA9IDc7CisKKwkvKioKKwkgKiBMb2NhdGlvbiBuYW1lIDEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FMSA9IDg7CisKKwkvKioKKwkgKiBQb3B1bGF0aW9uIHZhbHVlIHRoaXMgaXMgbm90IHJlYWxseSB0aGUgcG9wdWxhdGlvbiBidXQgaXQgd2lsbCBjcmVhdGUKKwkgKiBkdW1teSBmaWxlcworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUDEgPSA0OworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9Db250YWlubWVudFJlbGF0aW9uc2hpcEZpbmRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9Db250YWlubWVudFJlbGF0aW9uc2hpcEZpbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxY2UxZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0NvbnRhaW5tZW50UmVsYXRpb25zaGlwRmluZGVyLmphdmEKQEAgLTAsMCArMSw0MzUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIAorICovCitwdWJsaWMgY2xhc3MgQ29udGFpbm1lbnRSZWxhdGlvbnNoaXBGaW5kZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENOVFJZX0xWTDBfQ09ERTsKKwkvLyBnZXQgdGhlIHBhdGgKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2VwID0gRmlsZS5zZXBhcmF0b3I7CisJQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEggPSAiQzoiK3NlcCsiZWNsaXBzZSIrc2VwKyJ3b3Jrc3BhY2UzIitzZXA7CisJQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gZXhjbHVkZUxpc3QgPSB7IlVTQSIsIkpQTiIsIkNWUyIsIlRIQSIsIlpaWiJ9OworCXByaXZhdGUgc3RhdGljIEhhc2hTZXQ8U3RyaW5nPiBleGNsdWRlU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCXByaXZhdGUgc3RhdGljIEZpbGUgbGV2ZWwxTm9kZXMgPSBudWxsOworCXByaXZhdGUgc3RhdGljIEZpbGUgbGV2ZWwyTm9kZXMgPSBudWxsOworCQorCS8vIHRoZSBzZXRzIG9mIE5vZGVzCisJc3RhdGljIFNldDxTdHJpbmc+IGxldmVsT25lU2V0PSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJc3RhdGljIFNldDxTdHJpbmc+IGxldmVsVHdvU2V0PSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJLy8gZm9yIGFuZCBsZXZlbCB0d28gbm9kZXMgbm90IGluc2lkZSBsZXZlbAorCXN0YXRpYyBTZXQ8U3RyaW5nPiBvcnBoYW5lZFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwlzdGF0aWMgU3RyaW5nIG91dEZpbGVOYW1lOworCXN0YXRpYyBGaWxlV3JpdGVyIGZ3OworCQorCS8qKgorCSAqIEBwYXJhbSBhcmdzCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVMaXN0Lmxlbmd0aDsgaSArKykgeworCQkJZXhjbHVkZVNldC5hZGQoZXhjbHVkZUxpc3RbaV0pOworCQl9CisJCQorCQkKKwkJU2V0IGFsbENvdW50cmllcyA9IGdldEFsbENvdW50cmllcygpOworCQlJdGVyYXRvciBpdGVyID0gYWxsQ291bnRyaWVzLml0ZXJhdG9yKCk7CisJCQorCQl3aGlsZShpdGVyLmhhc05leHQoKSkgeworCQkJbGV2ZWxPbmVTZXQuY2xlYXIoKTsKKwkJCWxldmVsVHdvU2V0LmNsZWFyKCk7CisJCQlvcnBoYW5lZFNldC5jbGVhcigpOworCQkJCisJCQlDTlRSWV9MVkwwX0NPREUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKKwkJCXNldE5vZGVzRmlsZXMoQ05UUllfTFZMMF9DT0RFKTsKKwkJCWxldmVsT25lU2V0ID0gZ2V0Tm9kZXNJbkZpbGUobGV2ZWwxTm9kZXMpOworCQkJbGV2ZWxUd29TZXQgPSBnZXROb2Rlc0luRmlsZShsZXZlbDJOb2Rlcyk7CisJCQkKKwkJCVN0cmluZyBub2RlRGlyID0gUEFUSCsib3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhIitzZXArInJlc291cmNlcyIrc2VwKyJkYXRhIitzZXArInJlbGF0aW9uc2hpcCIrc2VwKyJyZWxhdGl2ZXBoeXNpY2FsIitzZXA7CisJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCW91dEZpbGVOYW1lID0gbm9kZURpcitDTlRSWV9MVkwwX0NPREUrIl8xXyIrQ05UUllfTFZMMF9DT0RFKyJfMi5wcm9wZXJ0aWVzIjsgCisJCQkvLyAxLiBwcm9jZXNzIGxldmVsIFRXTyBpZiB3ZSBoYXZlIHRoZW0KKwkJCWlmKGxldmVsVHdvU2V0LnNpemUoKSA+PSAxKSB7CisJCQkJaWYgKGxldmVsT25lU2V0LnNpemUoKTw9MCkgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVSUk9SLiBGb3VuZCBMZXZlbCAyIGRhdGEgd2l0aCBubyBsZXZlbCAxIGRhdGEgZm9yLi4uICIrQ05UUllfTFZMMF9DT0RFKTsKKwkJCQkJU3lzdGVtLmV4aXQoMSk7CisJCQkJfQorCQkJCQkJCQkJCQkJCQkJCQkKKwkJCQkgdHJ5IHsKKwkJCQkJCWZ3ID0gbmV3IEZpbGVXcml0ZXIob3V0RmlsZU5hbWUpOworCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIGNyZWF0aW5nIGZpbGUgd3JpdGVyICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQkJU3lzdGVtLmV4aXQoMSk7CisJCQkJCX0KKwkJCQl3cml0ZUwxVG9MMkhlYWRlcigpOworCQkJCW9ycGhhbmVkU2V0ID0gd3JpdGVMMmluTDFOb2RlcygpOworCQkJCWlmIChmdyAhPSBudWxsKSB7CisJCQkJCSB0cnkgeworCQkJCQkJCWZ3LmZsdXNoKCk7CisJCQkJCQkJZncuY2xvc2UoKTsKKwkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIGNyZWF0aW5nIGZpbGUgd3JpdGVyICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQkJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJfS8vIGlmIGxldmVsMiBleGlzdHMKKwkJCQorCQkJCisJCQkKKwkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCW91dEZpbGVOYW1lID0gbm9kZURpcitDTlRSWV9MVkwwX0NPREUrIl8wXyIrQ05UUllfTFZMMF9DT0RFKyJfMS5wcm9wZXJ0aWVzIjsgCisJCQkvLyBub3cgd3JpdGUgYW55IGxldmVsIDEgYW5kIG9yIG9ycGhhbmVkIG5vZGVzIGludG8gdGhlIGxldmVsMC0xIGZpbGUKKwkJCWlmIChvcnBoYW5lZFNldC5zaXplKCkgPj0gMSkgeworCQkJCWxldmVsT25lU2V0LmFkZEFsbChvcnBoYW5lZFNldCk7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nLCBjb3VudHJ5ICIrQ05UUllfTFZMMF9DT0RFKyIgaGFzICIrb3JwaGFuZWRTZXQuc2l6ZSgpKyIgb3JwaGFuZWQgbGV2ZWxUd29Ob2RlcyAiKTsKKwkJCQlJdGVyYXRvciB1Z2ggPSBvcnBoYW5lZFNldC5pdGVyYXRvcigpOworCQkJCXdoaWxlKHVnaC5oYXNOZXh0KCkpIHsKKwkJCQkJU3RyaW5nIGNvZGUgPSAoU3RyaW5nKSB1Z2gubmV4dCgpOworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIm9ycGhhbiA9ICIrY29kZSk7CisJCQkJfS8vIGxldmVsMQorCQkJfQorCQkJCQorCQkJCisJCQlpZihsZXZlbE9uZVNldC5zaXplKCk+PTEpIHsKKwkJCQkgdHJ5IHsKKwkJCQkJCWZ3ID0gbmV3IEZpbGVXcml0ZXIob3V0RmlsZU5hbWUpOworCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIGNyZWF0aW5nIGZpbGUgd3JpdGVyICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQkJU3lzdGVtLmV4aXQoMSk7CisJCQkJCX0KKwkJCQl3cml0ZUwwVG9MMUhlYWRlcigpOworCQkJCXdyaXRlTDFpbkwwTm9kZXMoKTsKKwkJCQkKKwkJCQlpZiAoZncgIT0gbnVsbCkgeworCQkJCQkgdHJ5IHsKKwkJCQkJCQlmdy5mbHVzaCgpOworCQkJCQkJCWZ3LmNsb3NlKCk7CisJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBjcmVhdGluZyBmaWxlIHdyaXRlciAiICsgZS5nZXRNZXNzYWdlKCkpOworCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCQkJU3lzdGVtLmV4aXQoMSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCX0vLyBpZiBsZXZlbCAxIGV4aXN0cworCQkJCisJCQorCQkJCisJCX0gLy8gYWxsIGNvdW50cmllcworCQkKKwl9Ly8gbWFpbgorCQorCQorCQorCisJQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCisJcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gd3JpdGVMMmluTDFOb2RlcygpIHsKKwkJLy8gLi4uIHRoZW4KKwkJLy8xID0gSlAtMCwgSlAtMC1HMTAwMDAxLCBDb250YWlucyAKKwkJLy8yID0gSlAtVE9ILCBKUC1UT0gtRzQ2MDAwMiwgQ29udGFpbnMKKwkJLy8zID0gSlAtVE9ILCBKUC1UT0gtRzQ2MDAwMSwgQ29udGFpbnMKKwkJLy80ID0gSlAtVE9ILCBKUC1UT0gtRzQ2MDAwNCwgQ29udGFpbnMKKwkJaW50IGljb3VudCA9IDA7CisJCVNldDxTdHJpbmc+IG9ycGhhbnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCVNldDxTdHJpbmc+IG1hdGNoU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOyAKKwkJSXRlcmF0b3IgaXRlciA9IGxldmVsT25lU2V0Lml0ZXJhdG9yKCk7CisJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgbGV2ZWxPbmVDb2RlID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisJCQlJdGVyYXRvciBpdGVyMiA9IGxldmVsVHdvU2V0Lml0ZXJhdG9yKCk7CisJCQl3aGlsZShpdGVyMi5oYXNOZXh0KCkpIHsKKwkJCQlTdHJpbmcgbGV2ZWxUd29Db2RlID0gKFN0cmluZykgaXRlcjIubmV4dCgpOworCQkJCWlmKGxldmVsVHdvQ29kZS5pbmRleE9mKGxldmVsT25lQ29kZSk+PTApIHsKKwkJCQkJaWNvdW50ICsrOworCQkJCQl3cml0ZSgiIitpY291bnQrIiA9ICIrbGV2ZWxPbmVDb2RlKyIsICIrbGV2ZWxUd29Db2RlKyIsIENvbnRhaW5zIik7CisJCQkJCW1hdGNoU2V0LmFkZChsZXZlbFR3b0NvZGUpOworCQkJCX0KKwkJCX0vL2xldmVsIDIKKwkJfS8vIGxldmVsMQorCQkKKwkJLy8gY2hlY2sgdGhhdCBldmVyeW9uZSB3YXMgYWRkZWQgc29tZXdoZXJlCisJCUl0ZXJhdG9yIGl0ZXIzID0gbGV2ZWxUd29TZXQuaXRlcmF0b3IoKTsKKwkJd2hpbGUoaXRlcjMuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgbGV2ZWxUd29Db2RlID0gKFN0cmluZykgaXRlcjMubmV4dCgpOworCQkgICAgaWYgKCFtYXRjaFNldC5jb250YWlucyhsZXZlbFR3b0NvZGUpKSBvcnBoYW5zLmFkZChsZXZlbFR3b0NvZGUpOworCQl9CisJCQorCQlyZXR1cm4gb3JwaGFuczsKKwl9CisKKworCisKKwkvKioKKwkgKiAKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlTDFpbkwwTm9kZXMoKSB7CisJCS8vMSA9IEpQTiwgSlAtQ0hCLCBDb250YWlucworCQkvLzIgPSBKUE4sIEpQLUNIRywgQ29udGFpbnMKKwkJLy8zID0gSlBOLCBKUC0wLCBDb250YWlucworCQkvLzQgPSBKUE4sIEpQLUtOVCwgQ29udGFpbnMKKwkJaW50IGljb3VudCA9IDA7CisJCUl0ZXJhdG9yIGl0ZXIgPSBsZXZlbE9uZVNldC5pdGVyYXRvcigpOworCQl3aGlsZShpdGVyLmhhc05leHQoKSkgeworCQkJU3RyaW5nIGxldmVsT25lQ29kZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworCQkJaWNvdW50ICsrOworCQkJd3JpdGUoIiIraWNvdW50KyIgPSAiK0NOVFJZX0xWTDBfQ09ERSsiLCAiK2xldmVsT25lQ29kZSsiLCBDb250YWlucyIpOworCQl9Ly8gbGV2ZWwxCisJfS8vd3JpdGVMMWluTDBOb2RlcygpCisKKworCisKKwkvKioKKwkgKiBAcGFyYW0gc3RyCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCisJcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKFN0cmluZyBzdHIpIHsKKwkJdHJ5IHsKKwkJICAgICBmdy53cml0ZShzdHIrIlxuIik7IAorCQkgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd3JpdGluZyB0byBmaWxlIHdyaXRlciAiK2UuZ2V0TWVzc2FnZSgpKTsKKwkJCSAgICBlLnByaW50U3RhY2tUcmFjZSgpOworCQkJICAgIFN5c3RlbS5leGl0KDEpOworCQkgIH0vLyB0cnkKKwl9IC8vIHdyaXRlCisJCisJCisJCisKKwkvKioKKwkgKiAKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKKwlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVMMFRvTDFIZWFkZXIoKSB7CisJCXdyaXRlKCIjICIrQ05UUllfTFZMMF9DT0RFKyJfMF8iK0NOVFJZX0xWTDBfQ09ERSsiXzEucHJvcGVydGllcyAiKTsKKwkJd3JpdGUoIiMvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOworCQl3cml0ZSgiIyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4iKTsKKwkJd3JpdGUoIiMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIik7CisJCXdyaXRlKCIjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIik7CisJCXdyaXRlKCIjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQiKTsKKwkJd3JpdGUoIiMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCIpOworCQl3cml0ZSgiIyAqIik7CisJCXdyaXRlKCIjICogQ29udHJpYnV0b3JzOiIpOworCQl3cml0ZSgiIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iKTsKKwkJd3JpdGUoIiMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8iKTsKKwkJd3JpdGUoIiIpOworCQl3cml0ZSgiIyBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IHdpbGwgaW50ZXJwcmV0IHRoZSByZXN0IG9mIHRoZSBmaWxlJ3MgY29udGVudHMiKTsKKwkJd3JpdGUoIlJFQ09SRF9DTEFTU05BTUUgPSBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEucmVjb3Jkcy5SZWxhdGl2ZVBoeXNpY2FsUmVsYXRpb25zaGlwR3JhcGhSZWNvcmQiKTsKKwkJd3JpdGUoIiIpOworCQl3cml0ZSgiIyBUaGUgdGl0bGUgb2YgdGhlIHJlbGF0aW9uc2hpcCIpOworCQl3cml0ZSgiVElUTEUgPSBQaHlzaWNhbCBjb250YWlubWVudCBvZiAiK0NOVFJZX0xWTDBfQ09ERSsiIGxldmVsICgxKSBieSAiK0NOVFJZX0xWTDBfQ09ERSsiICgwKSIpOworCQl3cml0ZSgiIik7CisJCXdyaXRlKCIjIFRoaXMgaXMgdGhlIGRhdGUgcmFuZ2UgZm9yIHdoaWNoIHRoZSB2YWx1ZXMgaW4gdGhpcyBmaWxlIGFyZSB2YWxpZCIpOworCQl3cml0ZSgiIyBTZWUgaHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zLzEuMS92YWxpZCIpOworCQl3cml0ZSgiVkFMSUQgPSBzdGFydD0xOTAwLTAxLTAxOyIpOworCQl3cml0ZSgiIik7CisJCXdyaXRlKCIjIFRoaXMgaXMgdGhlIHNvdXJjZSBvZiB0aGUgZGF0YSIpOworCQl3cml0ZSgiU09VUkNFID0gaHR0cDovL3d3dy5pYm0uY29tIik7CisJCXdyaXRlKCIiKTsKKwkJd3JpdGUoIiMgSVNPMzE2Ni0xIGFscGhhMyBrZXlzIGFuZCBsZXZlbHMgb2YgcmVsYXRpb25zaGlwIik7CisJCXdyaXRlKCJJU09LRVlfMCA9ICIrQ05UUllfTFZMMF9DT0RFKyIiKTsKKwkJd3JpdGUoIklTT0tFWV8wX0xFVkVMID0gMCIpOworCQl3cml0ZSgiSVNPS0VZXzEgPSAiK0NOVFJZX0xWTDBfQ09ERSsiIik7CisJCXdyaXRlKCJJU09LRVlfMV9MRVZFTCA9IDEiKTsKKwkJd3JpdGUoIiIpOworCQl3cml0ZSgiIyBSZWNvcmQgTnVtYmVyID0gS2V5MSwgS2V5MiwgcmVsYXRpb25zaGlwIik7CisJCQorCQkKKwkJCisJfQorCQorCQorCS8qKgorCSAqIAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUwxVG9MMkhlYWRlcigpIHsKKwkJd3JpdGUoIiMgIitDTlRSWV9MVkwwX0NPREUrIl8xXyIrQ05UUllfTFZMMF9DT0RFKyJfMi5wcm9wZXJ0aWVzICIpOworCQl3cml0ZSgiIy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CisJCXdyaXRlKCIjICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiIpOworCQl3cml0ZSgiIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMiKTsKKwkJd3JpdGUoIiMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAiKTsKKwkJd3JpdGUoIiMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCIpOworCQl3cml0ZSgiIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIik7CisJCXdyaXRlKCIjICoiKTsKKwkJd3JpdGUoIiMgKiBDb250cmlidXRvcnM6Iik7CisJCXdyaXRlKCIjICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIpOworCQl3cml0ZSgiIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyIpOworCQl3cml0ZSgiIik7CisJCXdyaXRlKCIjIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgd2lsbCBpbnRlcnByZXQgdGhlIHJlc3Qgb2YgdGhlIGZpbGUncyBjb250ZW50cyIpOworCQl3cml0ZSgiUkVDT1JEX0NMQVNTTkFNRSA9IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5yZWNvcmRzLlJlbGF0aXZlUGh5c2ljYWxSZWxhdGlvbnNoaXBHcmFwaFJlY29yZCIpOworCQl3cml0ZSgiIik7CisJCXdyaXRlKCIjIFRoZSB0aXRsZSBvZiB0aGUgcmVsYXRpb25zaGlwIik7CisJCXdyaXRlKCJUSVRMRSA9IFBoeXNpY2FsIGNvbnRhaW5tZW50IG9mIEphcGFuIGxldmVsICgyKSBieSAiK0NOVFJZX0xWTDBfQ09ERSsiICgxKSIpOworCQl3cml0ZSgiIik7CisJCXdyaXRlKCIjIFRoaXMgaXMgdGhlIGRhdGUgcmFuZ2UgZm9yIHdoaWNoIHRoZSB2YWx1ZXMgaW4gdGhpcyBmaWxlIGFyZSB2YWxpZCIpOworCQl3cml0ZSgiIyBTZWUgaHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zLzEuMS92YWxpZCIpOworCQl3cml0ZSgiVkFMSUQgPSBzdGFydD0xOTAwLTAxLTAxOyIpOworCQl3cml0ZSgiIik7CisJCXdyaXRlKCIjIFRoaXMgaXMgdGhlIHNvdXJjZSBvZiB0aGUgZGF0YSIpOworCQl3cml0ZSgiU09VUkNFID0gaHR0cDovL3d3dy5pYm0uY29tIik7CisJCXdyaXRlKCIiKTsKKwkJd3JpdGUoIiMgSVNPMzE2Ni0xIGFscGhhMyBrZXlzIGFuZCBsZXZlbHMgb2YgcmVsYXRpb25zaGlwIik7CisJCXdyaXRlKCJJU09LRVlfMCA9ICIrQ05UUllfTFZMMF9DT0RFKyIiKTsKKwkJd3JpdGUoIklTT0tFWV8wX0xFVkVMID0gMSIpOworCQl3cml0ZSgiSVNPS0VZXzEgPSAiK0NOVFJZX0xWTDBfQ09ERSsiIik7CisJCXdyaXRlKCJJU09LRVlfMV9MRVZFTCA9IDIiKTsKKwkJd3JpdGUoIiIpOworCQl3cml0ZSgiIyBSZWNvcmQgTnVtYmVyID0gS2V5MSwgS2V5MiwgcmVsYXRpb25zaGlwIik7CisJfQorCS8qKgorCSAqIAorCSAqIEByZXR1cm4gYSBzZXQgb2YgYWxsIHRoZSBjb3VudHJpZXMKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKKwlwdWJsaWMgc3RhdGljIFNldCBnZXRBbGxDb3VudHJpZXMoKSB7CisJCUhhc2hTZXQ8U3RyaW5nPiBhbGwgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCWludCBpY291bnQgPSAwOworCQlTdHJpbmcgbm9kZURpciA9IFBBVEgrIm9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YSIrc2VwKyJyZXNvdXJjZXMiK3NlcCsiZGF0YSIrc2VwKyJjb3VudHJ5IitzZXA7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiY291bnRyeSBkaXIgPSAiK25vZGVEaXIpOworCQlGaWxlIG5vZGVzID0gbmV3IEZpbGUobm9kZURpcik7CisJCWlmIChub2Rlcy5leGlzdHMoKSYmbm9kZXMuaXNEaXJlY3RvcnkoKSkgeworCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIHRvcCBsZXZlbCBkYXRhIGRpciIpOworCQkJRmlsZVtdIGNvbnRhaW5lZCA9IG5vZGVzLmxpc3RGaWxlcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZWQubGVuZ3RoOyBpICsrKSB7CisJCQkJRmlsZSBmaWxlID0gY29udGFpbmVkW2ldOworCQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKwkJCQkJU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXROYW1lKCk7CisJCQkJCWlmKChmaWxlTmFtZS5sZW5ndGgoKT09MykmJighZXhjbHVkZVNldC5jb250YWlucyhmaWxlTmFtZSkpKSB7CisJCQkJCQlhbGwuYWRkKGZpbGVOYW1lKTsKKwkJCQkJCWljb3VudCArKzsKKwkJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCAiK2ZpbGVOYW1lKTsKKwkJCQkJfS8vIGlmIGl0J3MgYSBjb3VudHJ5IGRpciBub3Qgb24gZXhjbHVkZSBsaXNlCisJCQkJfS8vIGlmIGRpcmVjdG9yeQorCQkJfS8vIGZvciBhbGwgY29udGFpbmVkIGZpbGVzCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBmb3VuZCAiK2ljb3VudCsiIGNvdW50cmllcyIpOworCQl9IGVsc2UgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0b3AgbGV2ZWwgZGF0YSBkaXIgbm90IGZvdW5kIC0gY2hlY2sgc3RhdGljIHBhdGggaGFyZGNvZGVkIik7CisJCX0KKwkJCisJCXJldHVybiBhbGw7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBjb3VudHJ5Q29kZQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXROb2Rlc0ZpbGVzKFN0cmluZyBjb3VudHJ5Q29kZSkgeworCQkvLyBpbml0CisJCWxldmVsMU5vZGVzID0gbnVsbDsKKwkJbGV2ZWwyTm9kZXMgPSBudWxsOworCisJCS8vIGRpcmVjdG9yeSBvZiBub2RlIGRhdGEKKwkJU3RyaW5nIG5vZGVEaXIgPSBQQVRIKyJvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEiK3NlcCsicmVzb3VyY2VzIitzZXArImRhdGEiK3NlcCsiY291bnRyeSIrc2VwK2NvdW50cnlDb2RlOworCQlGaWxlIGRpciA9IG5ldyBGaWxlKG5vZGVEaXIpOworCQkKKwkJaWYgKGRpci5leGlzdHMoKSYmZGlyLmlzRGlyZWN0b3J5KCkpIHsKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCB0b3AgbGV2ZWwgZGF0YSBkaXIiKTsKKwkJCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpICsrKSB7CisJCQkJRmlsZSBmaWxlID0gZmlsZXNbaV07CisJCQkJaWYgKGZpbGUuaXNGaWxlKCkpIHsKKwkJCQkJaWYoZmlsZS5nZXROYW1lKCkuaW5kZXhPZigiXzFfbm9kZS5wcm9wZXJ0aWVzIikgPj0gMSkgeworCQkJCQkJbGV2ZWwxTm9kZXMgPSBmaWxlOworCQkJCQl9CisJCQkJCWlmKGZpbGUuZ2V0TmFtZSgpLmluZGV4T2YoIl8yX25vZGUucHJvcGVydGllcyIpID49IDEpIHsKKwkJCQkJCWxldmVsMk5vZGVzID0gZmlsZTsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCX0vLyBmb3IgaSBmaWxlcyBjb250YWluZWQKKwkJfS8vIGlmIGRpcmVjdG9yeQorCQlyZXR1cm47CisJfQorCQorCQorCQorCS8qKgorCSAqIEBwYXJhbSBmaWxlCisJICogQHJldHVybiBmb28KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKKwlwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IGdldE5vZGVzSW5GaWxlKEZpbGUgZmlsZSApIHsKKwkJSGFzaFNldDxTdHJpbmc+IG5vZGVTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCWlmIChmaWxlPT1udWxsKSByZXR1cm4gbm9kZVNldDsKKwkJLy8gdGhlIGRhdGEgc3RhcnRzIGFmdGVyIHRoaXMgcmVxdWlyZWQgc3RyaW5nLiBtdXN0IGhhdmUgYm90aAorCQlmaW5hbCBTdHJpbmcgc3RhcnRTdHJpbmcxID0gIlNQQVRJQUxfVVJJIjsKKwkJZmluYWwgU3RyaW5nIHN0YXJ0U3RyaW5nMiA9ICJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5LyI7CisJCUZpbGVJbnB1dFN0cmVhbSBmaXM7CisJCUJ1ZmZlcmVkUmVhZGVyIGQgPSBudWxsOworCQl0cnkgeworCQkJZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsgCisJCQlkID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaXMpKTsKKwkJfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAJU3lzdGVtLm91dC5wcmludGxuKCJlcnJvciBvcGVuaW5nIHN0cmVhbSBmb3IgZmlsZSAiK2ZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgCVN5c3RlbS5vdXQucHJpbnRsbigiIGVycm9yICIrZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgCVN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTdHJpbmcgcmVjb3JkID0gIiI7CisgICAgICAgIGJvb2xlYW4gc3RhcnQgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgd2hpbGUgKCAocmVjb3JkPWQucmVhZExpbmUoKSkgIT0gbnVsbCApIHsgCisgICAgICAgICAgIC8vIGdldCBwYXN0IHRoZSBoZWFkZXIgYW5kIG1ha2Ugc3VyZSB3ZSBmb3VuZAorICAgICAgICAgICAvLyB0aGUgcmVxdWlyZWQgdGFncyBvZiBhIHZhbGlkIG5vZGUgZmlsZQorICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oICJsaW5lPSAgIiArIHJlY29yZCk7CisgICAgICAgICAgCisgICAgICAgICAgIAorICAgICAgICAgICBpZiAoc3RhcnQpIHsKKyAgICAgICAgCSAgIGludCBjb21tZW50ID0gcmVjb3JkLmluZGV4T2YoIiMiKTsKKyAgICAgICAgICAgICAgICBpZihjb21tZW50IDwgMCkgeworICAgICAgICAgICAgICAgIAkvLyBub3QgYSBjb21tZW50CisgICAgICAgICAgICAgICAgCWludCBlcUNociA9IHJlY29yZC5pbmRleE9mKCI9Iik7CisgICAgICAgICAgICAgICAgCWlmIChlcUNociA+PSAxKSB7CisgICAgICAgICAgICAgICAgCQkvLyB0aGlzIGlzIGEgbm9kZQorICAgICAgICAgICAgICAgIAkJU3RyaW5nIHBhZGRlZCA9IHJlY29yZC5zdWJzdHJpbmcoMCxlcUNocik7CisgICAgICAgICAgICAgICAgCQlTdHJpbmcgbm9kZSA9IHBhZGRlZC50cmltKCk7CisgICAgICAgICAgICAgICAgCQkKKyAgICAgICAgICAgICAgICAJCS8vKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZm91bmQga2V5PSBbIitub2RlKyJdIik7CisgICAgICAgICAgICAgICAgCQkvLyoqKioqKioqKioqKgorICAgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICAgICAgCQlub2RlU2V0LmFkZChub2RlKTsKKyAgICAgICAgICAgICAgICAJfS8vIGlmIHRoaXMgaXMgYSBub2RlCisgICAgICAgICAgICAgICAgfS8vIG5vdCBhIGNvbW1lbnQKKyAgICAgICAgICAgfSAvLyBpZiBzdGFydCBzdHJpbmcgaGFzIGJlZW4gZm91bmQKKyAgICAgICAgICAgaWYgKChyZWNvcmQuaW5kZXhPZihzdGFydFN0cmluZzEpPj0wKSYmKHJlY29yZC5pbmRleE9mKHN0YXJ0U3RyaW5nMik+PTApKSB7CisgICAgICAgIAkgICBzdGFydCA9IHRydWU7CisgICAgICAgICAgIH0KKyAgICAgICAgfS8vIHdoaWxlCisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCVN5c3RlbS5vdXQucHJpbnRsbigiZXJyb3IgcmVhZGluZyBmaWxlICIrZmlsZS5nZXROYW1lKCkpOworICAgICAgICAJU3lzdGVtLm91dC5wcmludGxuKCIgZXJyb3IgIitlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAJU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghc3RhcnQpIHsKKyAgICAgICAgCVN5c3RlbS5vdXQucHJpbnRsbigiIGZpbGUgIitmaWxlLmdldE5hbWUoKSsiIGhhcyBubyB2YWxpZCBkYXRhIik7CisgICAgICAgIAlTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorCQkKKwkJcmV0dXJuIG5vZGVTZXQ7CisJfS8vIGdldCBOb2RlcyBpbiBGaWxlCisJCisJCisJCisJCit9Ly8gQ2xhc3MgQ29udGFpbm1lbnRSZWxhdGlvbnNoaXBGaW5kZXIgCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0RhdGFUeXBlcy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9EYXRhVHlwZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWY5NGRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9EYXRhVHlwZXMuamF2YQpAQCAtMCwwICsxLDQyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBTVEVNIElJIERhdGEgTWlncmF0aW9uL0dlbmVyYXRpb24gVXRpbGl0aWVzIC0tIEluc3RhbmNlcyBvZiB0aGlzIHV0aWxpdHkKKyAqIGNsYXNzIGhvbGQgc3ltYm9saWMgY29uc3RhbnRzLgorICogCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGFUeXBlcyB7CisKKwkvKioKKwkgKiBTeW1ib2xpYyBjb25zdGFudHMgZGVzY3JpYmluZyB0aGUgY3VycmVudCB0eXBlIG9mIGRhdGEgd2UgYXJlIHByb2Nlc3NpbmcuCisJICogCisJICovCisKKwkvKioKKwkgKiBEYXRhIGF0IGFkbWluIDAgbGV2ZWwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVZFTF8wID0gMDsKKworCS8qKgorCSAqIERhdGEgYXQgYWRtaW4gMSBsZXZlbAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFVkVMXzEgPSAxOworCisJLyoqCisJICogRGF0YSBhdCBhZG1pbiAyIGxldmVsCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVWRUxfMiA9IDI7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0Rvd25TYW1wbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0Rvd25TYW1wbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2ZTYxNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvRG93blNhbXBsZXIuamF2YQpAQCAtMCwwICsxLDExNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VuZXJhdG9yczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogCisgKiBTVEVNIElJIERhdGEgTWlncmF0aW9uL0dlbmVyYXRpb24gVXRpbGl0aWVzIDogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcnVuIGEKKyAqIFNpbmdsZVBhc3NEb3duU2FtcGxlciBvYmplY3QgYW5kIGlmIG1vcmUgdGhhbiBvbmUgcGFzcyBpcyBuZWNlc3NhcnkgaXQgcnVucworICogYW4gaW5zdGFuY2Ugb2YgTXVsdGlQYXNzRG93blNhbXBsZXIuIFlvdSBjYW4gc3BlY2lmeSBhcyBhcmd1bWVudHMgdGhlCisgKiB0aHJlc2hvbGQgKGFscGhhIGRlZ3JlZXMpCisgKiAKKyAqIAorICogVG8gY29uZmlndXJlLCBzZWUgY29uZmlndXJhdGlvbiBmaWxlIDoKKyAqIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL0Rvd25TYW1wbGVyLmNvbmZpZworICogCisgKiAKKyAqIFRvIHJ1biwgYWRkIHBhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlIGluIHRoZSBydW4gcHJvZmlsZSAoaS5lLgorICogQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxjb25maWd1cmF0aW9uXERvd25TYW1wbGVyLmNvbmZpZykKKyAqIAorICogU0VUIFZNQVJHUyBUTyA6IC1YbXMxMDI0bSAtWG14MTAyNG0KKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBEb3duU2FtcGxlciB7CisKKwkvKioKKwkgKiBFeGVjdXRpb24gZW50cnkgcG9pbnQKKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJLy8gZmluYWwgaW50IFNJTkdMRV9QQVNTID0gMTsKKwkJLy8gZmluYWwgaW50IFRIUkVTSE9MRCA9IDA7CisJCS8vIGZpbmFsIGludCBQQVNTRVMgPSAxOworCQkvLyBmaW5hbCBpbnQgSVNPXzMxNjZfMSA9IDI7CisJCS8vIGZpbmFsIGludCBJU09fMzE2Nl8yID0gMzsKKwkJLy8gZmluYWwgaW50IEZJWF9GSUxFID0gNDsKKwkJLy8gZmluYWwgaW50IFNJTkdMRV9QQVNTX1RBUkdFVF9MSVNUID0gNTsgLy8gVGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsCisJCS8vIGRhdGEKKwkJLy8gLy8gZmlsZSAoc2luZ2xlLXBhc3MgZG93bnNhbXBsZXIgb25seSkKKwkJLy8gZmluYWwgaW50IE1VTFRJX1BBU1NfVEFSR0VUX0xJU1QgPSA2OyAvLyBBIGxpc3Qgb2YgYWxwaGEgMyBjb2RlcyBmb3IKKwkJLy8gLy8gKG11bHRpLXBhc3MgZG93bnNhbXBsZXIgb25seSkKKwkJLy8gZmluYWwgaW50IExFWF9ESVIgPSA3OworCQkvLyBmaW5hbCBpbnQgT1VUUFVUX0RJUiA9IDg7CisJCS8vIGZpbmFsIGludCBQQVJBTVMgPSA5OworCQkvLworCQkvLyBpZiAoYXJncy5sZW5ndGggPCBQQVJBTVMpIHsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLVdyb25nIGFyZ3VtZW50cy0tIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dAorCQkvLyAucHJpbnRsbigiXHRUbyBydW4sIHBsZWFzZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIDogIik7CisJCS8vIC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IFRocmVzaG9sZCAoaW4gZGVncmVlcykiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgVG90YWwgaXRlcmF0aW9ucyIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBJU08gMzE2Ni0xIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgSVNPIDMxNjYtMiBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IElTTyBmaXggZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBTaW5nbGUgcGFzcyB0YXJnZXQgY291bnRyaWVzIGZpbGUiKTsKKwkJLy8gLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgTXVsdGkgcGFzcyB0YXJnZXQgY291bnRyaWVzIGZpbGUiKTsKKwkJLy8gLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgTGV4aWNvZ3JhcGhpYyBzb3J0aW5nIGRpcmVjdG9yeSIpOworCQkvLyAvLyROT04tTkxTLTEkJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgT3V0cHV0IGRpcmVjdG9yeSIpOyAvLyROT04tTkxTLTEkCisJCS8vIHJldHVybjsKKwkJLy8gfQorCQkvLworCQkvLyAvLyBTaW5nbGVQYXNzRG93blNhbXBsZXIgcGVyZm9ybXMgb25lIHBhc3MsIHRoZSBmaXJzdCBwYXNzIG9ubHkuCisJCS8vIFNpbmdsZVBhc3NEb3duU2FtcGxlciBzaW1wbGVTYW1wbGVyID0gbmV3IFNpbmdsZVBhc3NEb3duU2FtcGxlcigKKwkJLy8gYXJnc1tUSFJFU0hPTERdLCBhcmdzW0lTT18zMTY2XzFdLCBhcmdzW0lTT18zMTY2XzJdLAorCQkvLyBhcmdzW0ZJWF9GSUxFXSwgYXJnc1tTSU5HTEVfUEFTU19UQVJHRVRfTElTVF0sIGFyZ3NbTEVYX0RJUl0sCisJCS8vIGFyZ3NbT1VUUFVUX0RJUl0pOworCQkvLyBzaW1wbGVTYW1wbGVyLnJ1bigpOworCQkvLworCQkvLyAvLyBJZiBtb3JlIHRoYW4gb25lIHBhc3MgaXMgbmVlZGVkLCB0aGVuIHJ1biBNdWx0aVBhc3NEb3duU2FtcGxlci4KKwkJLy8gaWYgKEludGVnZXIucGFyc2VJbnQoYXJnc1tQQVNTRVNdKSA+IFNJTkdMRV9QQVNTKSB7CisJCS8vIE11bHRpUGFzc0Rvd25TYW1wbGVyIG11bHRpU2FtcGxlciA9IG5ldyBNdWx0aVBhc3NEb3duU2FtcGxlcigKKwkJLy8gYXJnc1tUSFJFU0hPTERdLCBhcmdzW1BBU1NFU10sIGFyZ3NbSVNPXzMxNjZfMV0sCisJCS8vIGFyZ3NbSVNPXzMxNjZfMl0sIGFyZ3NbRklYX0ZJTEVdLAorCQkvLyBhcmdzW01VTFRJX1BBU1NfVEFSR0VUX0xJU1RdLCBhcmdzW0xFWF9ESVJdLAorCQkvLyBhcmdzW09VVFBVVF9ESVJdKTsKKwkJLy8gbXVsdGlTYW1wbGVyLnJ1bigpOworCQkvLyB9CisKKwkJZmluYWwgaW50IENPTkZJR19GSUxFID0gMDsKKwkJZmluYWwgaW50IFBBUkFNUyA9IDE7CisKKwkJaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQtLVdyb25nIGFyZ3VtZW50cy0tIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQKKwkJCQkJLnByaW50bG4oIlx0XHRUbyBydW4sIHBsZWFzZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnQocykgOiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHQgQ29uZmlndXJhdGlvbiBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5leGl0KDEpOworCQl9CisKKwkJLy8gU2luZ2xlUGFzc0Rvd25TYW1wbGVyIHBlcmZvcm1zIG9uZSBwYXNzLCB0aGUgZmlyc3QgcGFzcyBvbmx5LgorCQlTaW5nbGVQYXNzRG93blNhbXBsZXIgczEgPSBuZXcgU2luZ2xlUGFzc0Rvd25TYW1wbGVyKGFyZ3NbQ09ORklHX0ZJTEVdKTsKKwkJczEucnVuKCk7CisKKwkJLy8gSWYgbW9yZSB0aGFuIG9uZSBwYXNzIGlzIG5lZWRlZCwgdGhlbiBydW4gTXVsdGlQYXNzRG93blNhbXBsZXIuCisJCS8vIGlmIChJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbUEFTU0VTXSkgPiBTSU5HTEVfUEFTUykgeworCQlNdWx0aVBhc3NEb3duU2FtcGxlciBzMiA9IG5ldyBNdWx0aVBhc3NEb3duU2FtcGxlcihhcmdzW0NPTkZJR19GSUxFXSk7CisJCXMyLnJ1bigpOworCQkvLyB9CisKKwl9CisKK30gLy8gbWFpbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9FdXJvcGVEYXRhQ2xlYW5lci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9FdXJvcGVEYXRhQ2xlYW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNWMxNGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0V1cm9wZURhdGFDbGVhbmVyLmphdmEKQEAgLTAsMCArMSw0MDkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFNURU0gSUkgRGF0YSBNaWdyYXRpb24vR2VuZXJhdGlvbiBVdGlsaXRpZXMgOiBJbnN0YW5jZXMgb2YgdGhpcyB1dGlsaXR5IGNsYXNzCisgKiBjbGVhbiB0aGUgZGF0YSBmb3IgRXVyb3BlLiBUaGlzIHByb2dyYW0gd2lsbCByZW1vdmUgYWxsIHVubmVjZXNhcnkgZGF0YSBmcm9tCisgKiB0aGUgb3JpZ2luYWwgZGF0YSBzb3VyY2UgZmlsZSBmb3IgRXVyb3BlLiBUaGUgb3JpZ2luYWwgZGF0YSBzb3VyY2UgZmlsZSBmb3IKKyAqIEV1cm9wZSB3YXMgZG93bmxvYWRlZCBmcm9tIDoKKyAqIGh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZAorICogCisgKiBUbyBjb25maWd1cmUsIHNlZSBjb25maWd1cmF0aW9uIGZpbGUgOgorICogb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vRXVyb3BlRGF0YUNsZWFuZXIuY29uZmlnCisgKiAKKyAqIAorICogVG8gcnVuLCBhZGQgcGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUgaW4gdGhlIHJ1biBwcm9maWxlIChpLmUuCisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGNvbmZpZ3VyYXRpb25cRXVyb3BlRGF0YUNsZWFuZXIuY29uZmlnKQorICogCisgKiAKKyAqIEFkZCB0aGUgZm9sbG93aW5nIHZhbHVlcyB0byB0aGUgcnVuIGNvbmZpZ3VyYXRpb246CisgKiAKKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxwcm9wZXJ0aWVzXEV1cm9wZUNvdW50cmllcy50eHQKKyAqIEM6XEV1cm9wZURhdGEyMDA3XEV1cm9wZVVOXFVOZGF0YVNocFwKKyAqIAorICogT3ZlcnZpZXcgb2YgdGhlIGRhdGEgZ2VuZXJhdGlvbiBwcm9jZXNzIGZvciB0aGUgRXVyb3BlIGRhdGEgc2V0LgorICogCisgKiAxKSBEYXRhIENsZWFuaW5nIDogc3RhcnQgYnkgcnVubmluZyBFdXJvcGVEYXRhQ2xlYW5lci4gVGhpcyBwcm9ncmFtIHdpbGwKKyAqIHJlbW92ZSBhbGwgdW5uZWNlc2FyeSBkYXRhIChpLmUuIGNvbHVtbnMpIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gSW4KKyAqIGFkZGl0aW9uLCB0aGlzIHByb2dyYW0gd2lsbCBncm91cCB0aGUgZGF0YSBiYXNlZCBvbiBpdHMgSUQgKGkuZS4gTk8sSVQsRlIsVUssCisgKiBldGMpLiBUaGUgcmVzdWx0IHdpbGwgYmUgYSBmaWxlIG5hbWVkIEV1cm9wZVNvcnRlZC50eHQgd2l0aCBjbGVhbmVkIGRhdGEuCisgKiAKKyAqIEluIG90aGVyIHdvcmRzIDogRXVyb3BlLnR4dCAtLT4gfHxFdXJvcGVEYXRhQ2xlYW5lcnx8IC0tPiBFdXJvcGVTb3J0ZWQudHh0CisgKiAKKyAqIE5PVEU6IEV1cm9wZVNvcnRlZC50eHQgd2lsbCBiZSB1c2VkIGFzIHRoZSBpbnB1dCBmb3IgdGhlIHJlbWFpbmluZyBwYXJ0IG9mCisgKiB0aGUgcHJvY2Vzcy4KKyAqIAorICogMikgRGF0YSBGb3JtYXR0aW5nIDogcnVuIEV1cm9wZURhdGFGb3JtYXR0ZXIgdG8gYnJlYWsgZG93biB0aGUgZGF0YSBzb3VyY2UKKyAqIChFdXJvcGVTb3J0ZWQudHh0KSBpbnRvIG11bHRpcGxlIGRhdGEgZmlsZXMsIG9uZSBmb3IgZWFjaCBjb3VudHJ5IGFzCisgKiBpbmRpY2F0ZWQgYnkgdGhlIElEIChpLmUuIE5PLElULEZSLFVLLCBldGMpLiBUaGUgcmVzdWx0IHdpbGwgYmUgbXVsdGlwbGUgZGF0YQorICogZmlsZXMgKGkuZS4gaXRhbHkudHh0LCBzcGFpbi50eHQsIGV0YykuIEVhY2ggZmlsZSB3aWxsIGJlIGZvdW5kIHVuZGVyIGEKKyAqIGZvbGRlciB3aXRoIHNhbWUgbmFtZSBhcyB0aGUgY291bnRyeSAoaS5lLiBJVEFMWVxpdGFseS50eHQsIFNQQUlOXHNwYWluLnR4dCwKKyAqIGV0YykuCisgKiAKKyAqIDMpIERhdGEgQ29udmVydGVyIDogcnVuIEV1cm9wZURhdGFDb252ZXJ0ZXIgdG8gY29udmVydCBmaWxlIGluIGNsZWFuZWQgZm9ybWF0CisgKiBpbnRvIERpdmEgZm9ybWF0LgorICogCisgKiAKKyAqIDQpIEFyZWEgYW5kIFBvcHVsYXRpb24gRGF0YSBFeHRyYWN0aW9uIDogcnVuIEV1cm9wZURhdGFFeHRyYWN0b3IgdG8gZXh0cmFjdAorICogYWxsIGFyZWEgYW5kIHBvcHVsYXRpb24gZGF0YS4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgRXVyb3BlRGF0YUNsZWFuZXIgeworCisJcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0RmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBvdXRwdXREaXIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgd29ya3NwYWNlID0gbnVsbDsKKworCS8qKgorCSAqIExpc3QgZm9yIElTTyAzMTY2LTEgY29kZXMgYW5kIHRhcmdldCBjb3VudHJpZXMuCisJICovCisJTGlzdDxTdHJpbmc+IHRhcmdldExpc3QgPSBudWxsOworCisJTGlzdDxTdHJpbmc+IGNvZGVMaXN0ID0gbnVsbDsKKworCS8qKgorCSAqIEhhc2ggbWFwIHRvIGtlZXAgdHJhY2sgb2YgcG9seWdvbnMuCisJICovCisJSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICogCisJICogQHBhcmFtIHRhcmdldEZpbGUgLQorCSAqICAgICAgICAgICAgZGF0YSBmaWxlIHdoZXJlIHdlIGZpbmQgYSBsaXN0IG9mIGNvdW50cmllcyBmb3IgZ2VuZXJhdGlvbiBvZgorCSAqICAgICAgICAgICAgdGhlaXIgY29ycmVzcG9uZGluZyBhcmVhLnByb3BlcnRpZXMgZmlsZXMuCisJICogQHBhcmFtIG91dHB1dERpciAtCisJICogICAgICAgICAgICB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIGZpbGVzIGdlbmVyYXRlZC4KKwkgKiAKKwkgKi8KKwkvLyBwdWJsaWMgRXVyb3BlRGF0YUNsZWFuZXIoU3RyaW5nIHRhcmdldEZpbGUsIFN0cmluZyBvdXRwdXREaXIpIHsKKwkvLyAvLyBTZXQgdmFsdWVzIG9mIGdsb2JhbCB2YXJpYWJsZXMuCisJLy8gdGhpcy50YXJnZXRGaWxlID0gdGFyZ2V0RmlsZTsKKwkvLyB0aGlzLm91dHB1dERpciA9IG91dHB1dERpcjsKKwkvLyB0YXJnZXRMaXN0ID0gbnVsbDsKKwkvLyBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkvLwl9CisKKwkvKioKKwkgKiBAcGFyYW0gY29uZmlnRmlsZQorCSAqLworCXB1YmxpYyBFdXJvcGVEYXRhQ2xlYW5lcihTdHJpbmcgY29uZmlnRmlsZSkgeworCisJCS8vIExvYWQgYWxsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCisJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHZhcnMgPSBHZW5VdGlscy5sb2FkQ29uZmlnRmlsZShjb25maWdGaWxlKTsKKworCQlTZXQ8U3RyaW5nPiBrZXlzID0gdmFycy5rZXlTZXQoKTsKKwkJSXRlcmF0b3IgaXQgPSBrZXlzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyB2YXIgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisKKwkJCS8vIEFzc2lnbiB2YWx1ZXMgdG8gY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgOgorCQkJaWYgKHZhci5lcXVhbHMoIldPUktTUEFDRSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl3b3Jrc3BhY2UgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJUQVJHRVRfTElTVCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl0YXJnZXRGaWxlID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiT1VUUFVUIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCW91dHB1dERpciA9IHZhcnMuZ2V0KHZhcik7CisJCQl9CisKKwkJfSAvLyB3aGlsZQorCisJCS8vIFRoZSB3b3Jrc3BhY2UgdmFyaWFibGUgc2hvdWxkIGVuZCB3aXRoIGEgc2xhc2ggY2hhcmFjdGVyCisJCWlmICh3b3Jrc3BhY2UuZW5kc1dpdGgoIlxcIikgPT0gZmFsc2UpIHsgLy8kTk9OLU5MUy0xJAorCQkJd29ya3NwYWNlICs9ICJcXCI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCVN0cmluZyBwYXRoID0gd29ya3NwYWNlICsgR2VuQ29uc3RhbnRzLlBBUkFNU19ESVI7CisKKwkJLy8gU2V0IHJlbWFpbmluZyBjb25maWcgdmFycyB1c2luZyBXT1JLU1BBQ0UgKHdvcmtzcGFjZSByZWxhdGl2ZSkKKworCQlpZiAodGFyZ2V0RmlsZSA9PSBudWxsKSB7CisJCQl0YXJnZXRGaWxlID0gcGF0aCArIEdlbkNvbnN0YW50cy5FVVJPUEVfQ09VTlRSSUVTOworCQl9CisJCWlmIChvdXRwdXREaXIgPT0gbnVsbCkgeworCQkJb3V0cHV0RGlyID0gR2VuQ29uc3RhbnRzLkRVTU1ZX0RJUjsKKwkJfQorCisJCXRhcmdldExpc3QgPSBudWxsOworCisJCW1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2V0cyB1cCBhbmQgcnVucyB0aGUgZmluZGVyLgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBjb3VudHJpZXMgd2Ugd2FudC4KKwkJdGFyZ2V0TGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdCh0YXJnZXRGaWxlKTsKKworCQkvLyBOb3csIHByb2Nlc3MgZWFjaCBpdGVtIGluIHRoZSB0YXJnZXQgbGlzdC4KKwkJcHJvY2VzcygpOworCX0KKworCS8qKgorCSAqIFByb2Nlc3Mgb3VyIGdsb2JhbCBsaXN0IG9mIHRhcmdldCBjb3VudHJpZXMuCisJICogCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJvY2VzcygpIHsKKworCQkvLyBBIHdyaXRlciBmb3IgdGhlIG5ldyBmaWxlIHdlIGFyZSBjcmVhdGluZy4KKwkJUHJpbnRXcml0ZXIgZXVyb3BlRmlsZSA9IG51bGw7CisKKwkJLy8gTmFtZSBvZiB0aGUgbmV3IHByb3BlcnRpZXMgZmlsZS4KKwkJU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKKworCQlpbnQgc2l6ZSA9IHRhcmdldExpc3Quc2l6ZSgpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisKKwkJCS8vIEdldCB0aGUgbmV4dCBjb3VudHJ5IGluIHRoZSBsaXN0LgorCQkJU3RyaW5nIGZpbGUgPSB0YXJnZXRMaXN0LmdldChpKS50cmltKCk7CisKKwkJCS8vIE9wZW4gdGhlIGRhdGEgc291cmNlIGZpbGUgZm9yIHRoaXMgY291bnRyeS4KKwkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IEdlblV0aWxzLm9wZW5SZWFkZXIoZmlsZSk7CisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJcdFx0PDw8PCBFVVJPUEUgREFUQSBDTEVBTkVSIC0tIFByb2Nlc3NpbmcgQ291bnRyeSA6ICIgKyBmaWxlICsgIiA+Pj4+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJdHJ5IHsKKworCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgeworCisJCQkJCVN0cmluZyBidWZmZXIgPSBudWxsOworCisJCQkJCS8vIFdlIHRha2UgYSBjaHVuayBvZiB0aGUgZGF0YSBbQlVGRkVSX01JTixCVUZGRVJfTUFYXSB0bworCQkJCQkvLyBtYWtlIHByb2Nlc3NpbmcgbW9yZQorCQkJCQkvLyBlZmZpY2llbnQsIHdlIGRvbnQgbmVlZCBhbGwgb2YgaXQuCisJCQkJCWludCBCVUZGRVJfTUlOID0gMDsKKwkJCQkJaW50IEJVRkZFUl9NQVggPSAyMDA7CisKKwkJCQkJd2hpbGUgKEdlblV0aWxzLkVPRihidWZmZXIgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gdHJ1ZSkgeworCisJCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBtYXJrIGFsbCB1bmtub3duIGRhdGEuCisJCQkJCQlidWZmZXIgPSBidWZmZXIucmVwbGFjZSgiLCwsIiwgIixVTktOT1dOLFVOS05PV04sIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJYnVmZmVyID0gYnVmZmVyLnJlcGxhY2UoIiwsIiwgIixVTktOT1dOLCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCQkJU3RyaW5nW10gaXRlbXMgPSBidWZmZXIuc3Vic3RyaW5nKEJVRkZFUl9NSU4sCisJCQkJCQkJCUJVRkZFUl9NQVgpLnNwbGl0KCIsIik7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJLy8gQ2xlYXIgYnVmZmVyIG9mIGRhdGEgd2UgZG9udCBuZWVkLgorCQkJCQkJU3RyaW5nIGNsZWFuQnVmZmVyID0gY2xlYW4oYnVmZmVyKTsKKwkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlcy5nZXRTdHJpbmcoIkV1cm9wZURhdGFDbGVhbmVyLjIwIikKKwkJCQkJCS8vICsgY2xlYW5CdWZmZXIpOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCUZpbGUgY291bnRyeURpciA9IG5ldyBGaWxlKG91dHB1dERpcik7CisKKwkJCQkJCWlmIChjb3VudHJ5RGlyICE9IG51bGwgJiYgY291bnRyeURpci5leGlzdHMoKSA9PSBmYWxzZSkgeworCQkJCQkJCS8vIERpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gQ3JlYXRlIGl0LgorCQkJCQkJCWNvdW50cnlEaXIubWtkaXIoKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gQ3JlYXRlIGFuZCBvcGVuIHRoZSBuZXcgZmlsZS4KKwkJCQkJCWlmIChldXJvcGVGaWxlID09IG51bGwpIHsKKwkJCQkJCQlmaWxlTmFtZSA9IGNvdW50cnlEaXIgKyAiXFwiICsgIkV1cm9wZVNvcnRlZC50eHQiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCQkJCQkKKwkJCQkJCQkvLyBDcmVhdGUgdG5lIG5ldyBwcm9wZXJ0aWVzLmZpbGUgZm9yIHRoaXMgY291bnRyeS4KKwkJCQkJCQlldXJvcGVGaWxlID0gR2VuVXRpbHMub3BlbldyaXRlcihmaWxlTmFtZSk7CisJCQkJCQl9CisKKwkJCQkJCVN0cmluZyB2YWwgPSBtYXAKKwkJCQkJCQkJLmdldChpdGVtc1tFdXJvcGVEYXRhQ2xlYW5pbmdIZWFkZXIuU1RSSURdCisJCQkJCQkJCQkJLnN1YnN0cmluZygwLCAyKSk7CisJCQkJCQlpZiAodmFsICE9IG51bGwpIHsKKwkJCQkJCQkvLyBDb25jYXRlbmF0ZQorCQkJCQkJCXZhbCArPSBjbGVhbkJ1ZmZlciArICJcbiI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8gRmlyc3QgZW50cnkKKwkJCQkJCQl2YWwgPSBjbGVhbkJ1ZmZlciArICJcbiI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCX0KKwkJCQkJCW1hcC5wdXQoaXRlbXNbRXVyb3BlRGF0YUNsZWFuaW5nSGVhZGVyLlNUUklEXQorCQkJCQkJCQkuc3Vic3RyaW5nKDAsIDIpLCB2YWwpOworCisJCQkJCX0vLyB3aGlsZQorCisJCQkJCS8vIENsb3NlIGFsbCBvcGVuIHJlc291cmNlcy4KKwkJCQkJcmVhZGVyLmNsb3NlKCk7CisKKwkJCQkJaWYgKGV1cm9wZUZpbGUgIT0gbnVsbCkgeworCQkJCQkJU3RyaW5nIG91dHB1dCA9IGNvbnNvbGlkYXRlRGF0YShtYXApOworCQkJCQkJaWYgKG91dHB1dCAhPSBudWxsKSB7CisJCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShldXJvcGVGaWxlLCBvdXRwdXQpOworCQkJCQkJfQorCQkJCQkJZXVyb3BlRmlsZS5jbG9zZSgpOworCQkJCQkJZXVyb3BlRmlsZSA9IG51bGw7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRHZW5lcmF0ZWQgOiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkrIGZpbGVOYW1lKTsKKwkJCQkJCWZpbGVOYW1lID0gbnVsbDsKKwkJCQkJfQorCisJCQkJfQorCisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKworCQl9IC8vIGZvcgorCisJfQorCisJLyoqCisJICogCisJICogR2V0IGFsbCB0aGUgdmFsdWVzIGluIHRoZSBtYXAuCisJICogCisJICogQHBhcmFtIG1hcAorCSAqICAgICAgICAgICAgYSBtYXAgb2YgbG9jYXRpb25zCisJICogCisJICogQHJldHVybiBTdHJpbmcgYSBzdHJpbmcgd2lsbCBhbGwgbG9jYXRpb25zIGdyb3VwZWQgc2VjdWVudGlhbHkuCisJICogCisJICovCisJU3RyaW5nIGNvbnNvbGlkYXRlRGF0YShIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXApIHsKKworCQlTdHJpbmcgdmFsdWUgPSBudWxsOworCisJCWlmIChtYXAuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCVNldDxTdHJpbmc+IGtleXMgPSBtYXAua2V5U2V0KCk7CisKKwkJSXRlcmF0b3IgaXQgPSBrZXlzLml0ZXJhdG9yKCk7CisKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXQubmV4dCgpOworCisJCQlpZiAodmFsdWUgPT0gbnVsbCkgeworCQkJCXZhbHVlID0gbWFwLmdldChrZXkpOworCQkJfSBlbHNlIHsKKwkJCQl2YWx1ZSArPSBtYXAuZ2V0KGtleSk7CisJCQl9CisKKwkJfQorCisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgYWxsIGlycmVsZXZhbnQgZGF0YSBmcm9tIG91ciBidWZmZXIKKwkgKi8KKwlTdHJpbmcgY2xlYW4oU3RyaW5nIGJ1ZmZlcikgeworCisJCWZpbmFsIGludCBMSU1JVCA9IDIwOworCQlTdHJpbmcgbmV3QnVmZmVyID0gbnVsbDsKKworCQlTdHJpbmdbXSBpdGVtcyA9IGJ1ZmZlci5zcGxpdCgiLCIpOyAvLyROT04tTkxTLTEkCisKKwkJaW50IGluZGV4ID0gMDsKKworCQl3aGlsZSAoaW5kZXggPCBpdGVtcy5sZW5ndGgpIHsKKworCQkJaWYgKGluZGV4ID4gTElNSVQpIHsKKwkJCQluZXdCdWZmZXIgKz0gIiwiICsgaXRlbXNbaW5kZXgrK107IC8vJE5PTi1OTFMtMSQKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJc3dpdGNoIChpbmRleCkgeworCisJCQljYXNlIEV1cm9wZURhdGFDbGVhbmluZ0hlYWRlci5OVU1JRDoKKwkJCQluZXdCdWZmZXIgPSBpdGVtc1tpbmRleF07CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRXVyb3BlRGF0YUNsZWFuaW5nSGVhZGVyLlNUUklEOgorCQkJCW5ld0J1ZmZlciArPSAiLCIgKyBpdGVtc1tpbmRleF07IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKworCQkJY2FzZSBFdXJvcGVEYXRhQ2xlYW5pbmdIZWFkZXIuQVJFQToKKwkJCQluZXdCdWZmZXIgKz0gIiwiICsgaXRlbXNbaW5kZXhdOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRXVyb3BlRGF0YUNsZWFuaW5nSGVhZGVyLlBPUDE6CisJCQkJbmV3QnVmZmVyICs9ICIsIiArIGl0ZW1zW2luZGV4XTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCisJCQljYXNlIEV1cm9wZURhdGFDbGVhbmluZ0hlYWRlci5QT1AyOgorCQkJCW5ld0J1ZmZlciArPSAiLCIgKyBpdGVtc1tpbmRleF07IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKworCQkJY2FzZSBFdXJvcGVEYXRhQ2xlYW5pbmdIZWFkZXIuUE9QMzoKKwkJCQluZXdCdWZmZXIgKz0gIiwiICsgaXRlbXNbaW5kZXhdOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRXVyb3BlRGF0YUNsZWFuaW5nSGVhZGVyLlBPUDQ6CisJCQkJbmV3QnVmZmVyICs9ICIsIiArIGl0ZW1zW2luZGV4XTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCisJCQljYXNlIEV1cm9wZURhdGFDbGVhbmluZ0hlYWRlci5URU1QSUQ6CisJCQkJbmV3QnVmZmVyICs9ICIsIiArIGl0ZW1zW2luZGV4XTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCisJCQl9CisKKwkJCWluZGV4Kys7CisKKwkJfQorCisJCXJldHVybiBuZXdCdWZmZXI7CisKKwl9CisKKwkvKioKKwkgKiBNYWluIGV4ZWN1dGlvbiBlbnRyeSBwb2ludC4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJLy8gZmluYWwgaW50IFRBUkdFVF9MSVNUID0gMDsKKwkJLy8gZmluYWwgaW50IE9VVFBVVF9ESVIgPSAxOworCQkvLyBmaW5hbCBpbnQgUEFSQU1TID0gMjsKKwkJLy8KKwkJLy8gaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQKKwkJLy8gLnByaW50bG4oIlx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyA6ICIpOworCQkvLyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBUYXJnZXQgY291bnRyaWVzIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgT3V0cHV0IGRpcmVjdG9yeSIpOyAvLyROT04tTkxTLTEkCisJCS8vIHJldHVybjsKKwkJLy8gfQorCQkvLworCQkvLyBFdXJvcGVEYXRhQ2xlYW5lciBmb3JtYXR0ZXIgPSBuZXcKKwkJLy8gRXVyb3BlRGF0YUNsZWFuZXIoYXJnc1tUQVJHRVRfTElTVF0sCisJCS8vIGFyZ3NbT1VUUFVUX0RJUl0pOworCQkvLyBmb3JtYXR0ZXIucnVuKCk7CisKKwkJZmluYWwgaW50IENPTkZJR19GSUxFID0gMDsKKwkJZmluYWwgaW50IFBBUkFNUyA9IDE7CisKKwkJaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQtLVdyb25nIGFyZ3VtZW50cy0tIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQKKwkJCQkJLnByaW50bG4oIlx0XHRUbyBydW4sIHBsZWFzZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnQocykgOiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHQgQ29uZmlndXJhdGlvbiBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5leGl0KDEpOworCQl9CisKKwkJRXVyb3BlRGF0YUNsZWFuZXIgY2xlYW5lciA9IG5ldyBFdXJvcGVEYXRhQ2xlYW5lcihhcmdzW0NPTkZJR19GSUxFXSk7CisJCWNsZWFuZXIucnVuKCk7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0V1cm9wZURhdGFDbGVhbmluZ0hlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9FdXJvcGVEYXRhQ2xlYW5pbmdIZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTY1Mzc4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9FdXJvcGVEYXRhQ2xlYW5pbmdIZWFkZXIuamF2YQpAQCAtMCwwICsxLDY0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiAKKyAqIFJlbGV2YW50IGtleXMgdG8gdGhlIEV1cm9wZWFuIGRhdGFzZXQuIEtleXMgaW4gdGhpcyBjbGFzcyBhcmUgdXNlZCBkdXJpbmcgdGhlCisgKiBkYXRhIGNsZWFuaW5nIHByb2Nlc3MgdG8gZXh0cmFjdCBvbmx5IHRoZSByZWxldmFudCBrZXlzIGZyb20gdGhlIG9yaWdpbmFsCisgKiBkYXRhIHNvdXJjZSBmaWxlIGZvciBFdXJvcGUuIFRoZXNlIGtleXMgYXJlIHVzZWQgd2hlbiBydW5uaW5nIGFuIGluc3RhbmNlIG9mCisgKiBFdXJvcGVEYXRhQ2xlYW5lciB0byBwZXJmb3JtIGRhdGEgY2xlYW5pbmcuCisgKiAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEV1cm9wZURhdGFDbGVhbmluZ0hlYWRlciB7CisKKwkvKioKKwkgKiBOdW1lcmljIElECisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVNSUQgPSA2OworCisJLyoqCisJICogTmFtZSBJRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUklEID0gNzsKKworCS8qKgorCSAqIFRvdGFsIEFyZWEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUkVBID0gMTE7CisKKwkvKioKKwkgKiBQb3B1bGF0aW9uIHZhbHVlIDEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1AxID0gMTU7CisKKwkvKioKKwkgKiBQb3B1bGF0aW9uIHZhbHVlIDIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1AyID0gMTY7CisKKwkvKioKKwkgKiBQb3B1bGF0aW9uIHZhbHVlIDMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1AzID0gMTc7CisKKwkvKioKKwkgKiBQb3B1bGF0aW9uIHZhbHVlIDQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1A0ID0gMTg7CisKKwkvKioKKwkgKiBBbHRlcm5hdGl2ZSBJRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFTVBJRCA9IDIwOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9FdXJvcGVEYXRhQ29udmVydGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0V1cm9wZURhdGFDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWVhNmFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9FdXJvcGVEYXRhQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSw0MTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIENvbnZlcnQgYSBkYXRhIGZpbGUgdGhhdCBjb21lcyBpbnRvIHRoZSBmb3JtYXQgVU4gRXVyb3BlIDoKKyAqIGh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZCBpbnRvIHRoZSBEaXZhCisgKiBmb3JtYXQgdGhhdCB0aGUgZ2VuZXJhdG9ycyBjYW4gaGFuZGxlLiBUaGlzIHdvbnQgZm9ybWF0IGFueSBhcmJpdHJhcnkgZm9ybWF0CisgKiBpbnRvIERpdmEgZm9ybWF0LiBDb252ZXJ0cyBvbmx5IDogVU4gRXVyb3BlYW4gZm9ybWF0IC0+IERpdmEgZm9ybWF0CisgKiAKKyAqIAorICogVG8gY29uZmlndXJlLCBzZWUgY29uZmlndXJhdGlvbiBmaWxlIDoKKyAqIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL0V1cm9wZURhdGFDb252ZXJ0ZXIuY29uZmlnCisgKiAKKyAqIAorICogVG8gcnVuLCBhZGQgcGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUgaW4gdGhlIHJ1biBwcm9maWxlIChpLmUuCisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGNvbmZpZ3VyYXRpb25cRXVyb3BlRGF0YUNvbnZlcnRlci5jb25maWcpCisgKiAKKyAqIAorICogQWRkIHRoZSBmb2xsb3dpbmcgdmFsdWVzIHRvIHRoZSBydW4gY29uZmlndXJhdGlvbjoKKyAqIAorICogQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXGlucHV0XElTTzMxNjYtMVxJU08zMTY2XzFfZW4udHh0CisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRccHJvcGVydGllc1xFdXJvcGVOYW1lcy50eHQKKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxwcm9wZXJ0aWVzXEV1cm9wZUNvdW50cmllcy50eHQKKyAqIEM6XGRpdmFcRXVyb3BlXAorICogCisgKiBCcmllZiBvdmVydmlldyBvZiB0aGUgZGF0YSBnZW5lcmF0aW9uIHByb2Nlc3MgZm9yIHRoZSBFdXJvcGUgZGF0YSBzZXQuCisgKiAKKyAqIDEpIERhdGEgQ2xlYW5pbmcgOiBzdGFydCBieSBydW5uaW5nIEV1cm9wZURhdGFDbGVhbmVyLiBUaGlzIHByb2dyYW0gd2lsbAorICogcmVtb3ZlIGFsbCB1bm5lY2VzYXJ5IGRhdGEgKGkuZS4gY29sdW1ucykgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBJbgorICogYWRkaXRpb24sIHRoaXMgcHJvZ3JhbSB3aWxsIGdyb3VwIHRoZSBkYXRhIGJhc2VkIG9uIGl0cyBJRCAoaS5lLiBOTyxJVCxGUixVSywKKyAqIGV0YykuIFRoZSByZXN1bHQgd2lsbCBiZSBhIGZpbGUgbmFtZWQgRXVyb3BlU29ydGVkLnR4dCB3aXRoIGNsZWFuZWQgZGF0YS4KKyAqIAorICogSW4gb3RoZXIgd29yZHMgOiBFdXJvcGUudHh0IC0tPiB8fEV1cm9wZURhdGFDbGVhbmVyfHwgLS0+IEV1cm9wZVNvcnRlZC50eHQKKyAqIAorICogTk9URTogRXVyb3BlU29ydGVkLnR4dCB3aWxsIGJlIHVzZWQgYXMgdGhlIGlucHV0IGZvciB0aGUgcmVtYWluaW5nIHBhcnQgb2YKKyAqIHRoZSBwcm9jZXNzLgorICogCisgKiAyKSBEYXRhIEZvcm1hdHRpbmcgOiBydW4gRXVyb3BlRGF0YUZvcm1hdHRlciB0byBicmVhayBkb3duIHRoZSBkYXRhIHNvdXJjZQorICogKEV1cm9wZVNvcnRlZC50eHQpIGludG8gbXVsdGlwbGUgZGF0YSBmaWxlcywgb25lIGZvciBlYWNoIGNvdW50cnkgYXMKKyAqIGluZGljYXRlZCBieSB0aGUgSUQgKGkuZS4gTk8sSVQsRlIsVUssIGV0YykuIFRoZSByZXN1bHQgd2lsbCBiZSBtdWx0aXBsZSBkYXRhCisgKiBmaWxlcyAoaS5lLiBpdGFseS50eHQsIHNwYWluLnR4dCwgZXRjKS4gRWFjaCBmaWxlIHdpbGwgYmUgZm91bmQgdW5kZXIgYQorICogZm9sZGVyIHdpdGggc2FtZSBuYW1lIGFzIHRoZSBjb3VudHJ5IChpLmUuIElUQUxZXGl0YWx5LnR4dCwgU1BBSU5cc3BhaW4udHh0LAorICogZXRjKS4KKyAqIAorICogMykgRGF0YSBDb252ZXJ0ZXIgOiBydW4gRXVyb3BlRGF0YUNvbnZlcnRlciB0byBjb252ZXJ0IGZpbGUgaW4gY2xlYW5lZCBmb3JtYXQKKyAqIGludG8gRGl2YSBmb3JtYXQuCisgKiAKKyAqIAorICogNCkgQXJlYSBhbmQgUG9wdWxhdGlvbiBEYXRhIEV4dHJhY3Rpb24gOiBydW4gRXVyb3BlRGF0YUV4dHJhY3RvciB0byBleHRyYWN0CisgKiBhbGwgYXJlYSBhbmQgcG9wdWxhdGlvbiBkYXRhLgorICogCisgKiAKKyAqLworCitwdWJsaWMgY2xhc3MgRXVyb3BlRGF0YUNvbnZlcnRlciB7CisKKwkvKioKKwkgKiBPdXIgc291cmNlIGZpbGVzIGZvciBJU08gMzE2Ni0xIGNvZGVzIGFuZCBmb3IgdGhlIGxpc3Qgb2YgdGFyZ2V0CisJICogY291bnRyaWVzLgorCSAqLworCXByaXZhdGUgU3RyaW5nIGlzbzMxNjZfMSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBuYW1lc0ZpbGUgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0RmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBvdXRwdXREaXIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgd29ya3NwYWNlID0gbnVsbDsKKworCS8qKgorCSAqIExpc3QgZm9yIElTTyAzMTY2LTEgY29kZXMgYW5kIHRhcmdldCBjb3VudHJpZXMuCisJICovCisKKwlMaXN0IHRhcmdldExpc3QgPSBudWxsOworCisJTGlzdCBjb2RlTGlzdCA9IG51bGw7CisKKwlMaXN0IGRhdGFMaXN0ID0gbnVsbDsKKworCUxpc3QgbmFtZXNMaXN0ID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICogCisJICogQHBhcmFtIGlzbzMxNjZfMSAtCisJICogICAgICAgICAgICBkYXRhIGZpbGUgd2l0aCB0aGUgSVNPMzE2Ni0xIEFMUEhBXzIgYW5kIEFMUEhBXzMgY29kZXMuCisJICogQHBhcmFtIG5hbWVzRmlsZSAtCisJICogICAgICAgICAgICBmaWxlcyB3aXRoIGFsbCBFdXJvcGUgbGV2ZWwgMSBuYW1lcy4KKwkgKiBAcGFyYW0gdGFyZ2V0RmlsZSAtCisJICogICAgICAgICAgICBsaXN0IG9mIHRhcmdldCBjb3VudHJpZXMKKwkgKiBAcGFyYW0gb3V0cHV0RGlyIC0KKwkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGUgZmlsZXMgZ2VuZXJhdGVkLgorCSAqIAorCSAqLworCXB1YmxpYyBFdXJvcGVEYXRhQ29udmVydGVyKFN0cmluZyBpc28zMTY2XzEsIFN0cmluZyBuYW1lc0ZpbGUsCisJCQlTdHJpbmcgdGFyZ2V0RmlsZSwgU3RyaW5nIG91dHB1dERpcikgeworCQkvLyBTZXQgdmFsdWVzIG9mIGdsb2JhbCB2YXJpYWJsZXMuCisJCXRoaXMuaXNvMzE2Nl8xID0gaXNvMzE2Nl8xOworCQl0aGlzLm5hbWVzRmlsZSA9IG5hbWVzRmlsZTsKKwkJdGhpcy50YXJnZXRGaWxlID0gdGFyZ2V0RmlsZTsKKwkJdGhpcy5vdXRwdXREaXIgPSBvdXRwdXREaXI7CisJCXRhcmdldExpc3QgPSBudWxsOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBjb25maWdGaWxlCisJICovCisJcHVibGljIEV1cm9wZURhdGFDb252ZXJ0ZXIoU3RyaW5nIGNvbmZpZ0ZpbGUpIHsKKworCQkvLyBMb2FkIGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcworCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB2YXJzID0gR2VuVXRpbHMubG9hZENvbmZpZ0ZpbGUoY29uZmlnRmlsZSk7CisKKwkJU2V0PFN0cmluZz4ga2V5cyA9IHZhcnMua2V5U2V0KCk7CisJCUl0ZXJhdG9yIGl0ID0ga2V5cy5pdGVyYXRvcigpOworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgdmFyID0gKFN0cmluZykgaXQubmV4dCgpOworCisJCQkvLyBBc3NpZ24gdmFsdWVzIHRvIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIDoKKwkJCWlmICh2YXIuZXF1YWxzKCJXT1JLU1BBQ0UiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJd29ya3NwYWNlID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiSVNPMzE2Nl8xIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWlzbzMxNjZfMSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIk5BTUVTX0ZJTEUiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJbmFtZXNGaWxlID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiVEFSR0VUX0xJU1QiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJdGFyZ2V0RmlsZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIk9VVFBVVCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlvdXRwdXREaXIgPSB2YXJzLmdldCh2YXIpOworCQkJfQorCisJCX0gLy8gd2hpbGUKKworCQkvLyBUaGUgd29ya3NwYWNlIHZhcmlhYmxlIHNob3VsZCBlbmQgd2l0aCBhIHNsYXNoIGNoYXJhY3RlcgorCQlpZiAod29ya3NwYWNlLmVuZHNXaXRoKCJcXCIpID09IGZhbHNlKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXdvcmtzcGFjZSArPSAiXFwiOyAvLyROT04tTkxTLTEkCisJCX0KKworCQlTdHJpbmcgcGF0aCA9IHdvcmtzcGFjZSArIEdlbkNvbnN0YW50cy5QQVJBTVNfRElSOworCisJCS8vIFNldCByZW1haW5pbmcgY29uZmlnIHZhcnMgdXNpbmcgV09SS1NQQUNFICh3b3Jrc3BhY2UgcmVsYXRpdmUpCisJCWlmIChpc28zMTY2XzEgPT0gbnVsbCkgeworCQkJaXNvMzE2Nl8xID0gcGF0aCArIEdlbkNvbnN0YW50cy5JU08zMTY2XzFfRklMRTsKKwkJfQorCQlpZiAobmFtZXNGaWxlID09IG51bGwpIHsKKwkJCW5hbWVzRmlsZSA9IHBhdGggKyBHZW5Db25zdGFudHMuSVNPMzE2Nl8yX0ZJTEU7CisJCX0KKwkJaWYgKHRhcmdldEZpbGUgPT0gbnVsbCkgeworCQkJdGFyZ2V0RmlsZSA9IHBhdGggKyBHZW5Db25zdGFudHMuRVVST1BFX0NPVU5UUklFUzsKKwkJfQorCQlpZiAob3V0cHV0RGlyID09IG51bGwpIHsKKwkJCW91dHB1dERpciA9IEdlbkNvbnN0YW50cy5EVU1NWV9ESVI7CisJCX0KKworCQl0YXJnZXRMaXN0ID0gbnVsbDsKKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNldHMgdXAgYW5kIHJ1bnMgdGhpcyBnZW5lcmF0b3IuCisJICogCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIGNvdW50cmllcyB3ZSB3YW50LgorCQl0YXJnZXRMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KHRhcmdldEZpbGUpOworCisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgSVNPMzE2Ni0xIEFMUEhBMiwgQUxQSEEzLCBhbmQKKwkJLy8gbnVtZXJpYyBjb2Rlcy4KKwkJY29kZUxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QoaXNvMzE2Nl8xKTsKKworCQkvLyBMb2FkIGFsbCBsZXZlbCAxIG5hbWVzIGZvciBFdXJvcGUuCisJCW5hbWVzTGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdChuYW1lc0ZpbGUpOworCisJCS8vIFJ1biB0aGUgY29udmVydGVyOiBVTiBFdXJvcGUgLT4gRGl2YSBzZXQgZm9ybWF0CisJCXByb2Nlc3MoKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0IGEgZGF0YSBmaWxlIHRoYXQgY29tZXMgaW50byB0aGUgZm9ybWF0IFVOIEV1cm9wZSA6CisJICogaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkIGludG8gdGhlCisJICogRGl2YSBmb3JtYXQgdGhhdCB0aGUgZ2VuZXJhdG9ycyBjYW4gaGFuZGxlLiBUaGlzIHdvbnQgZm9ybWF0IGFueQorCSAqIGFyYml0cmFyeSBmb3JtYXQgaW50byBEaXZhIGZvcm1hdC4gQ29udmVydHMgb25seSA6IFVOIEV1cm9wZWFuIGZvcm1hdCAtPgorCSAqIERpdmEgZm9ybWF0CisJICogCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJvY2VzcygpIHsKKworCQkvLyBBIHdyaXRlciBmb3IgdGhlIG5ldyBmaWxlIHdlIGFyZSBjcmVhdGluZy4KKwkJUHJpbnRXcml0ZXIgZGl2YUZpbGUgPSBudWxsOworCisJCS8vIE9iamVjdCBob2xkaW5nIElTTzMxNjYtMSByZWxhdGVkIGRhdGEuCisJCUlTT0NvZGUxIGlzb0NvZGUgPSBudWxsOworCisJCS8vIE5hbWUgb2YgdGhlIG5ldyBwcm9wZXJ0aWVzIGZpbGUuCisJCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7CisKKwkJaW50IHNpemUgPSB0YXJnZXRMaXN0LnNpemUoKTsKKworCQkvLyBGb3IgZXZlcnkgY291bnRyeQorCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCisJCQkvLyBHZXQgdGhlIG5leHQgZmlsZSBpbiB0aGUgbGlzdC4KKwkJCVN0cmluZyBmaWxlID0gKChTdHJpbmcpIHRhcmdldExpc3QuZ2V0KGkpKS50cmltKCk7CisKKwkJCS8vIE9wZW4gdGhlIGRhdGEgc291cmNlIGZpbGUgZm9yIHRoaXMgY291bnRyeS4KKwkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IEdlblV0aWxzLm9wZW5SZWFkZXIoZmlsZSk7CisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJcdFx0PDw8PCBFVVJPUEUgREFUQSBDT05WRVJURVIgIC0tIFByb2Nlc3NpbmcgQ291bnRyeSA6ICIgKyBmaWxlICsgIiA+Pj4+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJdHJ5IHsKKworCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgeworCisJCQkJCVN0cmluZyBidWZmZXIgPSBudWxsOworCisJCQkJCXdoaWxlIChHZW5VdGlscy5FT0YoYnVmZmVyID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IHRydWUpIHsKKworCQkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgd2UgbWFyayBhbGwgdW5rbm93biBkYXRhLgorCQkJCQkJYnVmZmVyID0gYnVmZmVyLnJlcGxhY2UoIiwsIiwgIixVTktOT1dOLCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCQkJU3RyaW5nW10gaXRlbXMgPSBidWZmZXIuc3BsaXQoIiwiKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJCQkvLyBHZXQgdGhlIElTTzMxNjYtMSBpbmZvIGZvciB0aGlzIGNvdW50cnkKKwkJCQkJCWlmIChpc29Db2RlID09IG51bGwpIHsKKwkJCQkJCQlTdHJpbmcgY291bnRyeSA9IEdlblV0aWxzLmdldENvdW50cnlOYW1lKAorCQkJCQkJCQkJaXRlbXNbRXVyb3BlRGF0YUZvcm1hdHRpbmdIZWFkZXIuU1RSSURdCisJCQkJCQkJCQkJCS5zdWJzdHJpbmcoMCwgMiksIGNvZGVMaXN0KTsKKwkJCQkJCQlpc29Db2RlID0gR2VuVXRpbHMuZ2V0SVNPQ29kZShjb3VudHJ5LCBjb2RlTGlzdCk7CisJCQkJCQl9CisKKwkJCQkJCS8vIElmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgZm9yIHRoaXMgY291bnRyeSwKKwkJCQkJCS8vIGNyZWF0ZSBpdCB1c2luZyBJU08gYWxwaGEzIGNvZGUuCisJCQkJCQlGaWxlIGNvdW50cnlEaXIgPSBuZXcgRmlsZShvdXRwdXREaXIKKwkJCQkJCQkJKyBpc29Db2RlLmdldE5hbWUoKSk7CisKKwkJCQkJCWlmIChjb3VudHJ5RGlyICE9IG51bGwgJiYgY291bnRyeURpci5leGlzdHMoKSA9PSBmYWxzZSkgeworCQkJCQkJCS8vIERpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gQ3JlYXRlIGl0LgorCQkJCQkJCWNvdW50cnlEaXIubWtkaXIoKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gQ3JlYXRlIGFuZCBvcGVuIHRoZSBuZXcgb3V0cHV0IGZpbGUuCisJCQkJCQlpZiAoZGl2YUZpbGUgPT0gbnVsbCkgeworCQkJCQkJCS8vIENyZWF0ZSB0aGUgZmlsZSBuYW1lCisJCQkJCQkJZmlsZU5hbWUgPSBjb3VudHJ5RGlyICsgIlxcIiArIGlzb0NvZGUuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCSsgIi50eHQiOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRGaWxlbmFtZSAgPSAiICsgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCQkvLyBDcmVhdGUgdG5lIG5ldyBmaWxlCisJCQkJCQkJZGl2YUZpbGUgPSBHZW5VdGlscy5vcGVuV3JpdGVyKGZpbGVOYW1lKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gQXBwbHkgdGhlIGZvcm1hdHRpbmcgdG8gdGhlIGN1cnJlbnQgYnVmZmVyIDogVU4KKwkJCQkJCS8vIEV1cm9wZSAtPiBEaXZhIGZvcm1hdAorCQkJCQkJU3RyaW5nIGRpdmFMaW5lID0gY29udmVydDJEaXZhKGlzb0NvZGUsIGl0ZW1zKTsKKworCQkJCQkJLy8gV3JpdGUgdGhlIGNvbnZlcnRlZCBsaW5lCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHREaXZhIHN0cmluZyA9ICIgKyBkaXZhTGluZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCUdlblV0aWxzLmFkZERhdGEoZGl2YUZpbGUsIGRpdmFMaW5lKTsKKworCQkJCQl9Ly8gd2hpbGUKKworCQkJCQkvLyBSZXNldCBJU08gQ29kZQorCQkJCQlpc29Db2RlID0gbnVsbDsKKworCQkJCQkvLyBSZXNldCBmaWxlIG5hbWUKKwkJCQkJZmlsZU5hbWUgPSBudWxsOworCisJCQkJCS8vIENsb3NlIHRoZSB0YXJnZXQgZmlsZS4KKwkJCQkJZGl2YUZpbGUuY2xvc2UoKTsKKwkJCQkJZGl2YUZpbGUgPSBudWxsOworCisJCQkJCS8vIENsb3NlIGFsbCBvcGVuIHJlc291cmNlcy4KKwkJCQkJcmVhZGVyLmNsb3NlKCk7CisKKwkJCQkJLy8gUnVuIGdhcmJhZ2UgY29sbGVjdGlvbgorCQkJCQkvL1N5c3RlbS5nYygpOworCisJCQkJfQorCisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKworCQl9IC8vIGZvcgorCisJfQorCisJLyoqCisJICogQ29udmVydCB0aGUgYnVmZmVyIGdpdmVuIGluIFVOIEV1cm9wZSBmb3JtYXQgaW50byBEaXZhIGZvcm1hdAorCSAqIAorCSAqIEBwYXJhbSBpc29Db2RlCisJICogICAgICAgICAgICBJU08gMzE2Ni0xIGNvZGUKKwkgKiAKKwkgKiBAcGFyYW0gZGF0YQorCSAqICAgICAgICAgICAgYSBidWZmZXIgd2l0aCBkYXRhIG9uIFVOIEV1cm9wZSBmb3JtYXQKKwkgKiAKKwkgKiBAcmV0dXJuIGNvbnZlcnRlZCBzdHJpbmcKKwkgKiAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnQyRGl2YShJU09Db2RlMSBpc29Db2RlLCBTdHJpbmdbXSBkYXRhKSB7CisKKwkJLy8gTlVNSUQsU1RSSUQsQVJFQSxQT1AxLFBPUDIsUE9QMyxQT1A0LFRFTVBJRCw8Li4ucG9seWdvbiBkYXRhLi4uPgorCisJCS8vIDIxODkuMCxMSSwxLjYwMDAwMDAwMDAwMDAwMDAwRSswMiwwLjAsMC4wLFVOS05PV04sPC4uLnBvbHlnb24KKwkJLy8gZGF0YS4uLj4KKworCQkvLyA8QUxQSEEzLENPVU5UUllfTkFNRSxBRE1JTjEsPC4uLnBvbHlnb24gZGF0YS4uLj4KKworCQkvLyBBR08sQW5nb2xhLEx1YW5kYSw8Li4ucG9seWdvbiBkYXRhLi4uPgorCisJCS8vIFRoZSBmb3JtYXR0ZWQgcHJlZml4IHN0cmluZworCQlTdHJpbmcgZGl2YVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gR2V0IHJlbGV2YW50IGRhdGEgZm9yIGNvbnZlcnNpb24uCisJCURvdWJsZSB2YWwgPSBEb3VibGUucGFyc2VEb3VibGUoZGF0YVtFdXJvcGVEYXRhRm9ybWF0dGluZ0hlYWRlci5OVU1JRF0pOworCQlTdHJpbmcgbnVtSUQgPSBTdHJpbmcudmFsdWVPZih2YWwuaW50VmFsdWUoKSk7CisJCVN0cmluZyBhbHBoYTIgPSBpc29Db2RlLmdldEFscGhhMigpOworCQlTdHJpbmcgYWxwaGEzID0gaXNvQ29kZS5nZXRBbHBoYTMoKTsKKworCQkvLyBGaW5kIHRoZSBsb2NhdGlvbiBuYW1lIGJhc2VkIG9uIGl0cyBudW1lcmljIElECisJCVN0cmluZyBsb2NhdGlvbl9uYW1lID0gR2VuVXRpbHMuZ2V0RXVyb3BlYW5Mb2NhdGlvbihudW1JRCwgbmFtZXNMaXN0KTsKKworCQkvLyBGaW5kIHRoZSBjb3VudHJ5IG5hbWUgYmFzZWQgb24gdGhlIGFscGhhIDIgY29kZS4KKwkJU3RyaW5nIGNvdW50cnlfbmFtZSA9IEdlblV0aWxzLmdldENvdW50cnlOYW1lKGFscGhhMiwgY29kZUxpc3QpOworCisJCS8vIEdldCB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBidWZmZXIKKwkJaW50IGxlbmd0aCA9IGRhdGEubGVuZ3RoOworCisJCS8vIEFkZCBmaXhlZCBkYXRhIHdlIGFscmVhZHkgaGF2ZSBhdmFpbGFibGUgOgorCQlkaXZhU3RyaW5nID0gYWxwaGEzICsgIiwiICsgY291bnRyeV9uYW1lICsgIiwiICsgbG9jYXRpb25fbmFtZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJLy8gQ29uY2F0ZW5hdGUgcG9seWdvbiBkYXRhIC0tIGlnbm9yZSB0aGUgZmlyc3QgZWlnaHQgaXRlbXMKKwkJLy8gd2hpY2ggYXJlIG5vbi1wb2x5Z29uIGRhdGEgOgorCQkvLyBOVU1JRCxTVFJJRCxBUkVBLFBPUDEsUE9QMixQT1AzLFBPUDQsVEVNUElELAorCQlmb3IgKGludCBpID0gODsgaSA8IGxlbmd0aDsgaSsrKSB7CisKKwkJCWRpdmFTdHJpbmcgKz0gIiwiICsgZGF0YVtpXTsgLy8kTk9OLU5MUy0xJAorCisJCX0gLy8gZm9yCisKKwkJLy8gRmluYWxseSBhZGQgYSBuZXcgbGluZSB0byB0aGUgc3RyaW5nLgorCQlkaXZhU3RyaW5nICs9ICJcbiI7IC8vJE5PTi1OTFMtMSQKKworCQlyZXR1cm4gZGl2YVN0cmluZzsKKwl9CisKKwkvKioKKwkgKiBNYWluIGV4ZWN1dGlvbiBlbnRyeSBwb2ludC4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJLy8gZmluYWwgaW50IElTT18zMTY2XzEgPSAwOworCQkvLyBmaW5hbCBpbnQgRVVST1BFX05BTUVTID0gMTsKKwkJLy8gZmluYWwgaW50IFRBUkdFVF9MSVNUID0gMjsKKwkJLy8gZmluYWwgaW50IE9VVFBVVF9ESVIgPSAzOworCQkvLyBmaW5hbCBpbnQgUEFSQU1TID0gNDsKKwkJLy8KKwkJLy8gaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQKKwkJLy8gLnByaW50bG4oIlx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyA6ICIpOworCQkvLyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBJU08gMzE2Ni0xIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgRXVyb3BlYW4gbG9jYXRpb25zIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgVGFyZ2V0IGNvdW50cmllcyBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IE91dHB1dCBkaXJlY3RvcnkiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyByZXR1cm47CisJCS8vIH0KKwkJLy8KKwkJLy8gRXVyb3BlRGF0YUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgRXVyb3BlRGF0YUNvbnZlcnRlcigKKwkJLy8gYXJnc1tJU09fMzE2Nl8xXSwgYXJnc1tFVVJPUEVfTkFNRVNdLCBhcmdzW1RBUkdFVF9MSVNUXSwKKwkJLy8gYXJnc1tPVVRQVVRfRElSXSk7CisJCS8vIGNvbnZlcnRlci5ydW4oKTsKKworCQlmaW5hbCBpbnQgQ09ORklHX0ZJTEUgPSAwOworCQlmaW5hbCBpbnQgUEFSQU1TID0gMTsKKworCQlpZiAoYXJncy5sZW5ndGggPCBQQVJBTVMpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdC0tV3JvbmcgYXJndW1lbnRzLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRcdFRvIHJ1biwgcGxlYXNlIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhcmd1bWVudChzKSA6ICIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdCBDb25maWd1cmF0aW9uIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLmV4aXQoMSk7CisJCX0KKworCQlFdXJvcGVEYXRhQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBFdXJvcGVEYXRhQ29udmVydGVyKAorCQkJCWFyZ3NbQ09ORklHX0ZJTEVdKTsKKwkJY29udmVydGVyLnJ1bigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9FdXJvcGVEYXRhRXh0cmFjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0V1cm9wZURhdGFFeHRyYWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2QzYjUyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9FdXJvcGVEYXRhRXh0cmFjdG9yLmphdmEKQEAgLTAsMCArMSw0MzIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogVGhpcyBjbGFzcyB3aWxsIGV4dHJhY3QgYXJlYSBhbmQgcG9wdWxhdGlvbiBkYXRhIGZyb20gdGhlIEV1cm9wZWFuIGRhdGEKKyAqIHNvdXJjZSBmaWxlIChFdXJvcGVTb3J0ZWQudHh0KS4gRm9yIGVhY2ggY291bnRyeSwgaXQgd2lsbCBnZW5lcmF0ZSBib3RoIGFuZAorICogQVJFQSBhbmQgYSBQT1BVTEFUSU9OIGZpbGVzIHVuZGVyCisgKiBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxBcmVhUG9wdWxhdGlvbkRhdGEuCisgKiAKKyAqIFRvIGNvbmZpZ3VyZSwgc2VlIGNvbmZpZ3VyYXRpb24gZmlsZSA6CisgKiBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9FdXJvcGVEYXRhRXh0cmFjdG9yLmNvbmZpZworICogCisgKiAKKyAqIFRvIHJ1biwgYWRkIHBhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlIGluIHRoZSBydW4gcHJvZmlsZSAoaS5lLgorICogQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxjb25maWd1cmF0aW9uXEV1cm9wZURhdGFFeHRyYWN0b3IuY29uZmlnKQorICogCisgKiAKKyAqIEFkZCB0aGUgZm9sbG93aW5nIHZhbHVlcyB0byB0aGUgcnVuIGNvbmZpZ3VyYXRpb246CisgKiAKKyAqIAorICogQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXGlucHV0XElTTzMxNjYtMVxJU08zMTY2XzFfZW4udHh0CisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRccHJvcGVydGllc1xFdXJvcGVOYW1lcy50eHQKKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxwcm9wZXJ0aWVzXEV1cm9wZUNvdW50cmllcy50eHQKKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxBcmVhUG9wdWxhdGlvbkRhdGFcCisgKiAKKyAqIE92ZXJ2aWV3IG9mIHRoZSBkYXRhIGdlbmVyYXRpb24gcHJvY2VzcyBmb3IgdGhlIEV1cm9wZSBkYXRhIHNldC4KKyAqIAorICogMSkgRGF0YSBDbGVhbmluZyA6IHN0YXJ0IGJ5IHJ1bm5pbmcgRXVyb3BlRGF0YUNsZWFuZXIuIFRoaXMgcHJvZ3JhbSB3aWxsCisgKiByZW1vdmUgYWxsIHVubmVjZXNhcnkgZGF0YSAoaS5lLiBjb2x1bW5zKSBpbiB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUuIEluCisgKiBhZGRpdGlvbiwgdGhpcyBwcm9ncmFtIHdpbGwgZ3JvdXAgdGhlIGRhdGEgYmFzZWQgb24gaXRzIElEIChpLmUuIE5PLElULEZSLFVLLAorICogZXRjKS4gVGhlIHJlc3VsdCB3aWxsIGJlIGEgZmlsZSBuYW1lZCBFdXJvcGVTb3J0ZWQudHh0IHdpdGggY2xlYW5lZCBkYXRhLgorICogCisgKiBJbiBvdGhlciB3b3JkcyA6IEV1cm9wZS50eHQgLS0+IHx8RXVyb3BlRGF0YUNsZWFuZXJ8fCAtLT4gRXVyb3BlU29ydGVkLnR4dAorICogCisgKiBOT1RFOiBFdXJvcGVTb3J0ZWQudHh0IHdpbGwgYmUgdXNlZCBhcyB0aGUgaW5wdXQgZm9yIHRoZSByZW1haW5pbmcgcGFydCBvZgorICogdGhlIHByb2Nlc3MuCisgKiAKKyAqIDIpIERhdGEgRm9ybWF0dGluZyA6IHJ1biBFdXJvcGVEYXRhRm9ybWF0dGVyIHRvIGJyZWFrIGRvd24gdGhlIGRhdGEgc291cmNlCisgKiAoRXVyb3BlU29ydGVkLnR4dCkgaW50byBtdWx0aXBsZSBkYXRhIGZpbGVzLCBvbmUgZm9yIGVhY2ggY291bnRyeSBhcworICogaW5kaWNhdGVkIGJ5IHRoZSBJRCAoaS5lLiBOTyxJVCxGUixVSywgZXRjKS4gVGhlIHJlc3VsdCB3aWxsIGJlIG11bHRpcGxlIGRhdGEKKyAqIGZpbGVzIChpLmUuIGl0YWx5LnR4dCwgc3BhaW4udHh0LCBldGMpLiBFYWNoIGZpbGUgd2lsbCBiZSBmb3VuZCB1bmRlciBhCisgKiBmb2xkZXIgd2l0aCBzYW1lIG5hbWUgYXMgdGhlIGNvdW50cnkgKGkuZS4gSVRBTFlcaXRhbHkudHh0LCBTUEFJTlxzcGFpbi50eHQsCisgKiBldGMpLgorICogCisgKiAzKSBEYXRhIENvbnZlcnRlciA6IHJ1biBFdXJvcGVEYXRhQ29udmVydGVyIHRvIGNvbnZlcnQgZmlsZSBpbiBjbGVhbmVkIGZvcm1hdAorICogaW50byBEaXZhIGZvcm1hdC4KKyAqIAorICogCisgKiA0KSBBcmVhIGFuZCBQb3B1bGF0aW9uIERhdGEgRXh0cmFjdGlvbiA6IHJ1biBFdXJvcGVEYXRhRXh0cmFjdG9yIHRvIGV4dHJhY3QKKyAqIGFsbCBhcmVhIGFuZCBwb3B1bGF0aW9uIGRhdGEuCisgKiAKKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBFdXJvcGVEYXRhRXh0cmFjdG9yIHsKKworCS8qKgorCSAqIE91ciBzb3VyY2UgZmlsZXMgZm9yIElTTyAzMTY2LTEgY29kZXMgYW5kIGZvciB0aGUgbGlzdCBvZiB0YXJnZXQKKwkgKiBjb3VudHJpZXMuCisJICovCisJcHJpdmF0ZSBTdHJpbmcgaXNvMzE2Nl8xID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIG5hbWVzRmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyB0YXJnZXRGaWxlID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIG91dHB1dERpciA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyB3b3Jrc3BhY2UgPSBudWxsOworCisJLyoqCisJICogTGlzdCBmb3IgSVNPIDMxNjYtMSBjb2RlcyBhbmQgdGFyZ2V0IGNvdW50cmllcy4KKwkgKi8KKworCUxpc3QgdGFyZ2V0TGlzdCA9IG51bGw7CisKKwlMaXN0IGNvZGVMaXN0ID0gbnVsbDsKKworCUxpc3QgZGF0YUxpc3QgPSBudWxsOworCisJTGlzdCBuYW1lc0xpc3QgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gaXNvMzE2Nl8xIC0KKwkgKiAgICAgICAgICAgIGRhdGEgZmlsZSB3aXRoIHRoZSBJU08zMTY2LTEgQUxQSEFfMiBhbmQgQUxQSEFfMyBjb2Rlcy4KKwkgKiBAcGFyYW0gbmFtZXNGaWxlIC0KKwkgKiAgICAgICAgICAgIGZpbGVzIHdpdGggYWxsIEV1cm9wZSBsZXZlbCAxIG5hbWVzLgorCSAqIEBwYXJhbSB0YXJnZXRGaWxlIC0KKwkgKiAgICAgICAgICAgIGRhdGEgZmlsZSB3aGVyZSB3ZSBmaW5kIGEgbGlzdCBvZiBjb3VudHJpZXMgZm9yIGdlbmVyYXRpb24gb2YKKwkgKiAgICAgICAgICAgIHRoZWlyIGNvcnJlc3BvbmRpbmcgYXJlYS5wcm9wZXJ0aWVzIGZpbGVzLgorCSAqIEBwYXJhbSBvdXRwdXREaXIgLQorCSAqICAgICAgICAgICAgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlcyBnZW5lcmF0ZWQuCisJICogCisJICovCisJLy8gcHVibGljIEV1cm9wZURhdGFFeHRyYWN0b3IoU3RyaW5nIGlzbzMxNjZfMSwgU3RyaW5nIG5hbWVzRmlsZSwKKwkvLyBTdHJpbmcgdGFyZ2V0RmlsZSwgU3RyaW5nIG91dHB1dERpcikgeworCS8vIC8vIFNldCB2YWx1ZXMgb2YgZ2xvYmFsIHZhcmlhYmxlcy4KKwkvLyB0aGlzLmlzbzMxNjZfMSA9IGlzbzMxNjZfMTsKKwkvLyB0aGlzLm5hbWVzRmlsZSA9IG5hbWVzRmlsZTsKKwkvLyB0aGlzLnRhcmdldEZpbGUgPSB0YXJnZXRGaWxlOworCS8vIHRoaXMub3V0cHV0RGlyID0gb3V0cHV0RGlyOworCS8vIHRhcmdldExpc3QgPSBudWxsOworCS8vIH0KKwkvKioKKwkgKiBAcGFyYW0gY29uZmlnRmlsZQorCSAqLworCXB1YmxpYyBFdXJvcGVEYXRhRXh0cmFjdG9yKFN0cmluZyBjb25maWdGaWxlKSB7CisKKwkJLy8gTG9hZCBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKKwkJSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFycyA9IEdlblV0aWxzLmxvYWRDb25maWdGaWxlKGNvbmZpZ0ZpbGUpOworCisJCVNldDxTdHJpbmc+IGtleXMgPSB2YXJzLmtleVNldCgpOworCQlJdGVyYXRvciBpdCA9IGtleXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJU3RyaW5nIHZhciA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKworCQkJLy8gQXNzaWduIHZhbHVlcyB0byBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyA6CisJCQlpZiAodmFyLmVxdWFscygiV09SS1NQQUNFIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXdvcmtzcGFjZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIklTTzMxNjZfMSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpc28zMTY2XzEgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJOQU1FU19GSUxFIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCW5hbWVzRmlsZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIlRBUkdFVF9MSVNUIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXRhcmdldEZpbGUgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJPVVRQVVQiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJb3V0cHV0RGlyID0gdmFycy5nZXQodmFyKTsKKwkJCX0KKworCQl9IC8vIHdoaWxlCisKKwkJLy8gVGhlIHdvcmtzcGFjZSB2YXJpYWJsZSBzaG91bGQgZW5kIHdpdGggYSBzbGFzaCBjaGFyYWN0ZXIKKwkJaWYgKHdvcmtzcGFjZS5lbmRzV2l0aCgiXFwiKSA9PSBmYWxzZSkgeyAvLyROT04tTkxTLTEkCisJCQl3b3Jrc3BhY2UgKz0gIlxcIjsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJU3RyaW5nIHBhdGggPSB3b3Jrc3BhY2UgKyBHZW5Db25zdGFudHMuUEFSQU1TX0RJUjsKKworCQkvLyBTZXQgcmVtYWluaW5nIGNvbmZpZyB2YXJzIHVzaW5nIFdPUktTUEFDRSAod29ya3NwYWNlIHJlbGF0aXZlKQorCQlpZiAoaXNvMzE2Nl8xID09IG51bGwpIHsKKwkJCWlzbzMxNjZfMSA9IHBhdGggKyBHZW5Db25zdGFudHMuSVNPMzE2Nl8xX0ZJTEU7CisJCX0KKwkJaWYgKG5hbWVzRmlsZSA9PSBudWxsKSB7CisJCQluYW1lc0ZpbGUgPSBwYXRoICsgR2VuQ29uc3RhbnRzLkVVUk9QRV9OQU1FUzsKKwkJfQorCQlpZiAodGFyZ2V0RmlsZSA9PSBudWxsKSB7CisJCQl0YXJnZXRGaWxlID0gcGF0aCArIEdlbkNvbnN0YW50cy5FVVJPUEVfQ09VTlRSSUVTOworCQl9CisJCWlmIChvdXRwdXREaXIgPT0gbnVsbCkgeworCQkJb3V0cHV0RGlyID0gR2VuQ29uc3RhbnRzLkFSRUFfUE9QVUxBVElPTl9ESVI7CisJCX0KKworCQl0YXJnZXRMaXN0ID0gbnVsbDsKKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNldHMgdXAgYW5kIHJ1bnMgdGhpcyBnZW5lcmF0b3IuCisJICogCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIGNvdW50cmllcyB3ZSB3YW50LgorCQl0YXJnZXRMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KHRhcmdldEZpbGUpOworCisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgSVNPMzE2Ni0xIEFMUEhBMiwgQUxQSEEzLCBhbmQKKwkJLy8gbnVtZXJpYyBjb2Rlcy4KKwkJY29kZUxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QoaXNvMzE2Nl8xKTsKKworCQkvLyBMb2FkIGFsbCBsZXZlbCAxIG5hbWVzIGZvciBFdXJvcGUuCisJCW5hbWVzTGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdChuYW1lc0ZpbGUpOworCisJCS8vIFJ1biB0aGUgY29udmVydGVyOiBVTiBFdXJvcGUgLT4gRGl2YSBzZXQgZm9ybWF0CisJCXByb2Nlc3MoKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBHZW5lcmF0ZSBhcmVhIGFuZCBwb3B1bGF0aW9uIGZpbGVzIGZyb20gZGF0YSBleHRyYWN0ZWQgZnJvbQorCSAqIEV1cm9wZVNvcnRlZC50eHQgVGhlIGFyZWEgYW5kIHBvcHVsYXRpb24gZmlsZXMgd2lsbCBiZSB1c2VkIGJ5IHRoZQorCSAqIGdlbmVyYXRvcnMgdG8gcHJvZHVjZSB0aGUgcHJvcGVydHkgZmlsZXMuCisJICogCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJvY2VzcygpIHsKKworCQlBcnJheUxpc3Q8U3RyaW5nPiByZXBlYXRlZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisJCS8vIEEgd3JpdGVyIGZvciB0aGUgbmV3IGZpbGUgd2UgYXJlIGNyZWF0aW5nLgorCQlQcmludFdyaXRlciBhcmVhRmlsZSA9IG51bGw7CisJCVByaW50V3JpdGVyIHBvcEZpbGUgPSBudWxsOworCisJCS8vIE9iamVjdCBob2xkaW5nIElTTzMxNjYtMSByZWxhdGVkIGRhdGEuCisJCUlTT0NvZGUxIGlzb0NvZGUgPSBudWxsOworCisJCS8vIE5hbWUgb2YgdGhlIG5ldyBwcm9wZXJ0aWVzIGZpbGUuCisJCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7CisKKwkJaW50IHNpemUgPSB0YXJnZXRMaXN0LnNpemUoKTsKKworCQkvLyBGb3IgZXZlcnkgY291bnRyeQorCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCisJCQkvLyBHZXQgdGhlIG5leHQgZmlsZSBpbiB0aGUgbGlzdC4KKwkJCVN0cmluZyBmaWxlID0gKChTdHJpbmcpIHRhcmdldExpc3QuZ2V0KGkpKS50cmltKCk7CisKKwkJCS8vIE9wZW4gdGhlIGRhdGEgc291cmNlIGZpbGUgZm9yIHRoaXMgY291bnRyeS4KKwkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IEdlblV0aWxzLm9wZW5SZWFkZXIoZmlsZSk7CisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJcdFx0PDw8PCBFVVJPUEUgREFUQSBFWFRSQUNUT1IgLS0gUHJvY2Vzc2luZyBDb3VudHJ5IDogIiArIGZpbGUgKyAiID4+Pj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCXRyeSB7CisKKwkJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKKworCQkJCQlTdHJpbmcgYnVmZmVyID0gbnVsbDsKKworCQkJCQkvLyBXZSB0YWtlIGEgY2h1bmsgb2YgdGhlIGRhdGEgW0JVRkZFUl9NSU4sQlVGRkVSX01BWF0gdG8KKwkJCQkJLy8gbWFrZSBwcm9jZXNzaW5nIG1vcmUKKwkJCQkJLy8gZWZmaWNpZW50LCB3ZSBkb250IG5lZWQgYWxsIG9mIGl0LgorCQkJCQlpbnQgQlVGRkVSX01JTiA9IDA7CisJCQkJCWludCBCVUZGRVJfTUFYID0gMjAwOworCisJCQkJCXdoaWxlIChHZW5VdGlscy5FT0YoYnVmZmVyID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IHRydWUpIHsKKworCQkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgd2UgbWFyayBhbGwgdW5rbm93biBkYXRhLgorCQkJCQkJYnVmZmVyID0gYnVmZmVyLnJlcGxhY2UoIiwsIiwgIixVTktOT1dOLCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCQkJLy8gVXNlIG9ubHkgcGFydCBvZiB0aGUgYnVmZmVyLCBub3QgYWxsIG9mIGl0IGZvcgorCQkJCQkJLy8gZWZmaWNpZW5jeS4KKwkJCQkJCWludCBtYXggPSAoYnVmZmVyLmxlbmd0aCgpID4gQlVGRkVSX01BWCkgPyBCVUZGRVJfTUFYCisJCQkJCQkJCTogYnVmZmVyLmxlbmd0aCgpOworCQkJCQkJU3RyaW5nW10gaXRlbXMgPSBidWZmZXIuc3Vic3RyaW5nKEJVRkZFUl9NSU4sIG1heCkKKwkJCQkJCQkJLnNwbGl0KCIsIik7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJLy8gR2V0IHRoZSBJU08zMTY2LTEgaW5mbyBmb3IgdGhpcyBjb3VudHJ5CisJCQkJCQlpZiAoaXNvQ29kZSA9PSBudWxsKSB7CisJCQkJCQkJU3RyaW5nIGNvdW50cnkgPSBHZW5VdGlscy5nZXRDb3VudHJ5TmFtZSgKKwkJCQkJCQkJCWl0ZW1zW0V1cm9wZURhdGFGb3JtYXR0aW5nSGVhZGVyLlNUUklEXQorCQkJCQkJCQkJCQkuc3Vic3RyaW5nKDAsIDIpLCBjb2RlTGlzdCk7CisJCQkJCQkJaXNvQ29kZSA9IEdlblV0aWxzLmdldElTT0NvZGUoY291bnRyeSwgY29kZUxpc3QpOworCQkJCQkJfQorCisJCQkJCQkvLyBJZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IGZvciB0aGlzIGNvdW50cnksCisJCQkJCQkvLyBjcmVhdGUgaXQgdXNpbmcgSVNPIGFscGhhMyBjb2RlLgorCQkJCQkJRmlsZSBjb3VudHJ5RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyKTsKKworCQkJCQkJaWYgKGNvdW50cnlEaXIgIT0gbnVsbCAmJiBjb3VudHJ5RGlyLmV4aXN0cygpID09IGZhbHNlKSB7CisJCQkJCQkJLy8gRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBDcmVhdGUgaXQuCisJCQkJCQkJY291bnRyeURpci5ta2RpcigpOworCQkJCQkJfQorCisJCQkJCQkvLyBDcmVhdGUgYW5kIG9wZW4gYSBuZXcgYXJlYSBmaWxlLgorCQkJCQkJaWYgKGFyZWFGaWxlID09IG51bGwpIHsKKwkJCQkJCQkvLyBDcmVhdGUgdGhlIGZpbGUgbmFtZQorCQkJCQkJCWZpbGVOYW1lID0gY291bnRyeURpciArICJcXCIgKyBpc29Db2RlLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkrICJfQVJFQS50eHQiOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCQkvLyBDcmVhdGUgdG5lIG5ldyBmaWxlCisJCQkJCQkJYXJlYUZpbGUgPSBHZW5VdGlscy5vcGVuV3JpdGVyKGZpbGVOYW1lKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gU2ltaWxhcmx5LCBjcmVhdGUgYW5kIG9wZW4gYSBuZXcgcG9wdWxhdGlvbiBmaWxlLgorCQkJCQkJaWYgKHBvcEZpbGUgPT0gbnVsbCkgeworCQkJCQkJCS8vIENyZWF0ZSB0aGUgZmlsZSBuYW1lCisJCQkJCQkJZmlsZU5hbWUgPSBjb3VudHJ5RGlyICsgIlxcIiArIGlzb0NvZGUuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCSsgIl9QT1BVTEFUSU9OLnR4dCI7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJCS8vIENyZWF0ZSB0bmUgbmV3IGZpbGUKKwkJCQkJCQlwb3BGaWxlID0gR2VuVXRpbHMub3BlbldyaXRlcihmaWxlTmFtZSk7CisJCQkJCQl9CisKKwkJCQkJCS8vIEV4dHJhY3QgYXJlYSB2YWx1ZQorCQkJCQkJU3RyaW5nIGFyZWEgPSBpdGVtc1tFdXJvcGVEYXRhRm9ybWF0dGluZ0hlYWRlci5BUkVBXTsKKworCQkJCQkJLy8gRXh0cmFjdCBwb3B1bGF0aW9uIHZhbHVlCisJCQkJCQlTdHJpbmcgcG9wMSA9IGl0ZW1zW0V1cm9wZURhdGFGb3JtYXR0aW5nSGVhZGVyLlBPUDFdOworCQkJCQkJU3RyaW5nIHBvcDIgPSBpdGVtc1tFdXJvcGVEYXRhRm9ybWF0dGluZ0hlYWRlci5QT1AyXTsKKwkJCQkJCVN0cmluZyBwb3AzID0gaXRlbXNbRXVyb3BlRGF0YUZvcm1hdHRpbmdIZWFkZXIuUE9QM107CisJCQkJCQlTdHJpbmcgcG9wNCA9IGl0ZW1zW0V1cm9wZURhdGFGb3JtYXR0aW5nSGVhZGVyLlBPUDRdOworCisJCQkJCQkvLyBGaW5kIGxvY2F0aW9uIG5hbWUKKwkJCQkJCS8vIEdldCByZWxldmFudCBkYXRhIGZvciBjb252ZXJzaW9uLgorCQkJCQkJRG91YmxlIHZhbCA9IERvdWJsZQorCQkJCQkJCQkucGFyc2VEb3VibGUoaXRlbXNbRXVyb3BlRGF0YUZvcm1hdHRpbmdIZWFkZXIuTlVNSURdKTsKKwkJCQkJCVN0cmluZyBudW1JRCA9IFN0cmluZy52YWx1ZU9mKHZhbC5pbnRWYWx1ZSgpKTsKKworCQkJCQkJLy8gRmluZCB0aGUgbG9jYXRpb24gbmFtZSBiYXNlZCBvbiBpdHMgbnVtZXJpYyBJRAorCQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gR2VuVXRpbHMuZ2V0RXVyb3BlYW5Mb2NhdGlvbihudW1JRCwKKwkJCQkJCQkJbmFtZXNMaXN0KTsKKworCQkJCQkJaWYgKHJlcGVhdGVkLmNvbnRhaW5zKGxvY2F0aW9uKSkgeworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQkJLy8gcmVtZW1iZXIgdGhpcyBlbGVtZW50CisJCQkJCQlyZXBlYXRlZC5hZGQobG9jYXRpb24pOworCisJCQkJCQlTdHJpbmcgcG9wID0gbnVsbDsKKworCQkJCQkJLy8gR2V0IGZpcnN0IHRoZSBtb3N0IHVwLXRvLWRhdGUgcG9wdWxhdGlvbiB2YWx1ZS4gSWYgaXQKKwkJCQkJCS8vIGlzIHplcm8sIHRoZW4gZ2V0IG5leHQKKwkJCQkJCS8vIG9uZSBhbmQgc28gb24uIFBPUDQgaXMgdGhlIG1vc3QgdXAtdG8tZGF0ZSB2YWx1ZS4KKwkJCQkJCXBvcCA9IHBvcDQ7CisKKwkJCQkJCWlmIChEb3VibGUucGFyc2VEb3VibGUocG9wKSA9PSAwLjApIHsKKwkJCQkJCQlwb3AgPSBwb3AzOworCQkJCQkJfQorCisJCQkJCQlpZiAoRG91YmxlLnBhcnNlRG91YmxlKHBvcCkgPT0gMC4wKSB7CisJCQkJCQkJcG9wID0gcG9wMjsKKwkJCQkJCX0KKworCQkJCQkJaWYgKERvdWJsZS5wYXJzZURvdWJsZShwb3ApID09IDAuMCkgeworCQkJCQkJCS8vIFRoaXMgaXMgdGhlIG1vc3Qgb3V0ZGF0ZWQgdmFsdWUsIGJ1dCB0aGVyZSBpcyBubworCQkJCQkJCS8vIG90aGVyIGNob2ljZS4KKwkJCQkJCQlwb3AgPSBwb3AxOworCQkJCQkJfQorCisJCQkJCQlpZiAoRG91YmxlLnBhcnNlRG91YmxlKHBvcCkgPD0gMC4wKSB7CisJCQkJCQkJU3lzdGVtLm91dAorCQkJCQkJCQkJLnByaW50bG4oIlx0XHRQb3B1bGF0aW9uIGlzIHplcm8gZm9yIGxvY2F0aW9uIDogIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJCSsgaXRlbXNbRXVyb3BlRGF0YUZvcm1hdHRpbmdIZWFkZXIuU1RSSURdKTsKKwkJCQkJCX0KKworCQkJCQkJaWYgKERvdWJsZS52YWx1ZU9mKGFyZWEpIDwgMS4wKSB7CisJCQkJCQkJYXJlYSA9ICIxLjAiOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CisKKwkJCQkJCS8vIFdyaXRlIGFyZWEgdmFsdWUKKwkJCQkJCUdlblV0aWxzLmFkZERhdGEoYXJlYUZpbGUsIGxvY2F0aW9uICsgIiA6IDEgOiAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJKyBEb3VibGUudmFsdWVPZihhcmVhKSArICJcbiIpOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCS8vIFdyaXRlIHBvcHVsYXRpb24gdmFsdWUKKwkJCQkJCUdlblV0aWxzLmFkZERhdGEocG9wRmlsZSwgbG9jYXRpb24gKyAiIDogMSA6ICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkrIERvdWJsZS52YWx1ZU9mKHBvcCkuaW50VmFsdWUoKSArICJcbiIpOyAvLyROT04tTkxTLTEkCisKKwkJCQkJfS8vIHdoaWxlCisKKwkJCQkJLy8gUmVzZXQgSVNPIENvZGUKKwkJCQkJaXNvQ29kZSA9IG51bGw7CisKKwkJCQkJLy8gUmVzZXQgZmlsZSBuYW1lCisJCQkJCWZpbGVOYW1lID0gbnVsbDsKKworCQkJCQkvLyBDbG9zZSB0aGUgdGFyZ2V0IGZpbGVzLgorCQkJCQlhcmVhRmlsZS5jbG9zZSgpOworCQkJCQlhcmVhRmlsZSA9IG51bGw7CisJCQkJCXBvcEZpbGUuY2xvc2UoKTsKKwkJCQkJcG9wRmlsZSA9IG51bGw7CisKKwkJCQkJLy8gQ2xvc2UgYWxsIG9wZW4gcmVzb3VyY2VzLgorCQkJCQlyZWFkZXIuY2xvc2UoKTsKKworCQkJCQkvLyBSdW4gZ2FyYmFnZSBjb2xsZWN0aW9uCisJCQkJCS8vU3lzdGVtLmdjKCk7CisKKwkJCQl9CisKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCisJCX0gLy8gZm9yCisKKwl9CisKKwkvKioKKwkgKiBNYWluIGV4ZWN1dGlvbiBlbnRyeSBwb2ludC4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJLy8gZmluYWwgaW50IElTT18zMTY2XzEgPSAwOworCQkvLyBmaW5hbCBpbnQgRVVST1BFX05BTUVTID0gMTsKKwkJLy8gZmluYWwgaW50IFRBUkdFVF9MSVNUID0gMjsKKwkJLy8gZmluYWwgaW50IE9VVFBVVF9ESVIgPSAzOworCQkvLyBmaW5hbCBpbnQgUEFSQU1TID0gNDsKKwkJLy8KKwkJLy8gaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQKKwkJLy8gLnByaW50bG4oIlx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyA6ICIpOworCQkvLyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBJU08gMzE2Ni0xIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgRXVyb3BlYW4gbG9jYXRpb25zIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgVGFyZ2V0IGNvdW50cmllcyBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IE91dHB1dCBkaXJlY3RvcnkiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyByZXR1cm47CisJCS8vIH0KKworCQkvLyBFdXJvcGVEYXRhRXh0cmFjdG9yIGNvbnZlcnRlciA9IG5ldyBFdXJvcGVEYXRhRXh0cmFjdG9yKAorCQkvLyBhcmdzW0lTT18zMTY2XzFdLCBhcmdzW0VVUk9QRV9OQU1FU10sIGFyZ3NbVEFSR0VUX0xJU1RdLAorCQkvLyBhcmdzW09VVFBVVF9ESVJdKTsKKwkJLy8gY29udmVydGVyLnJ1bigpOworCisJCWZpbmFsIGludCBDT05GSUdfRklMRSA9IDA7CisJCWZpbmFsIGludCBQQVJBTVMgPSAxOworCisJCWlmIChhcmdzLmxlbmd0aCA8IFBBUkFNUykgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0LS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJcdFx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50KHMpIDogIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0IENvbmZpZ3VyYXRpb24gZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJfQorCisJCUV1cm9wZURhdGFFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IEV1cm9wZURhdGFFeHRyYWN0b3IoCisJCQkJYXJnc1tDT05GSUdfRklMRV0pOworCQlleHRyYWN0b3IucnVuKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0V1cm9wZURhdGFGb3JtYXR0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvRXVyb3BlRGF0YUZvcm1hdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMDhhYjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0V1cm9wZURhdGFGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDM3MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VuZXJhdG9yczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogCisgKiBTVEVNIElJIERhdGEgTWlncmF0aW9uL0dlbmVyYXRpb24gVXRpbGl0aWVzIDogSW5zdGFuY2VzIG9mIHRoaXMgdXRpbGl0eSBjbGFzcworICogd2lsbCB0YWtlIGFzIGlucHV0IHRoZSBjbGVhbmVkIGRhdGEgc291cmNlIGZpbGUgZm9yIEV1cm9wZSAoRXVyb3BlU29ydGVkLnR4dCkKKyAqIGFuZCB3aWxsIGJyZWFrIGl0IGludG8gbXVsdGlwbGUgZGF0YSBmaWxlcywgb25lIGZvciBlYWNoIEV1cm9wZWFuIGNvdW50cnkgaW4KKyAqIHRoZSBkYXRhc2V0LiBUaGUgbmV3IG91dHB1dCBkYXRhIGZpbGVzIHdpbGwgYmUgY3JlYXRlZCB1bmRlciA6CisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25cb3V0cHV0CisgKiAKKyAqIAorICogVG8gY29uZmlndXJlLCBzZWUgY29uZmlndXJhdGlvbiBmaWxlIDoKKyAqIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL0V1cm9wZURhdGFGb3JtYXR0ZXIuY29uZmlnCisgKiAKKyAqIAorICogVG8gcnVuLCBhZGQgcGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUgaW4gdGhlIHJ1biBwcm9maWxlIChpLmUuCisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGNvbmZpZ3VyYXRpb25cRXVyb3BlRGF0YUZvcm1hdHRlci5jb25maWcpCisgKiAKKyAqIAorICogCisgKiBBZGQgdGhlIGZvbGxvd2luZyB2YWx1ZXMgdG8gdGhlIHJ1biBjb25maWd1cmF0aW9uOgorICogCisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRcSVNPMzE2Ni0xXElTTzMxNjZfMV9lbi50eHQKKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxJU09GaXhcSVNPX0xFVkVMMV9GSVgudHh0CisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRccHJvcGVydGllc1xFdXJvcGVDb3VudHJpZXMudHh0CisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25cb3V0cHV0XAorICogCisgKiBCcmllZiBvdmVydmlldyBvZiB0aGUgZGF0YSBnZW5lcmF0aW9uIHByb2Nlc3MgZm9yIHRoZSBFdXJvcGUgZGF0YSBzZXQuCisgKiAKKyAqIDEpIERhdGEgQ2xlYW5pbmcgOiBzdGFydCBieSBydW5uaW5nIEV1cm9wZURhdGFDbGVhbmVyLiBUaGlzIHByb2dyYW0gd2lsbAorICogcmVtb3ZlIGFsbCB1bm5lY2VzYXJ5IGRhdGEgKGkuZS4gY29sdW1ucykgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBJbgorICogYWRkaXRpb24sIHRoaXMgcHJvZ3JhbSB3aWxsIGdyb3VwIHRoZSBkYXRhIGJhc2VkIG9uIGl0cyBJRCAoaS5lLiBOTyxJVCxGUixVSywKKyAqIGV0YykuIFRoZSByZXN1bHQgd2lsbCBiZSBhIGZpbGUgbmFtZWQgRXVyb3BlU29ydGVkLnR4dCB3aXRoIGNsZWFuZWQgZGF0YS4KKyAqIAorICogSW4gb3RoZXIgd29yZHMgOiBFdXJvcGUudHh0IC0tPiB8fEV1cm9wZURhdGFDbGVhbmVyfHwgLS0+IEV1cm9wZVNvcnRlZC50eHQKKyAqIAorICogTk9URTogRXVyb3BlU29ydGVkLnR4dCB3aWxsIGJlIHVzZWQgYXMgdGhlIGlucHV0IGZvciB0aGUgcmVtYWluaW5nIHBhcnQgb2YKKyAqIHRoZSBwcm9jZXNzLgorICogCisgKiAyKSBEYXRhIEZvcm1hdHRpbmcgOiBydW4gRXVyb3BlRGF0YUZvcm1hdHRlciB0byBicmVhayBkb3duIHRoZSBkYXRhIHNvdXJjZQorICogKEV1cm9wZVNvcnRlZC50eHQpIGludG8gbXVsdGlwbGUgZGF0YSBmaWxlcywgb25lIGZvciBlYWNoIGNvdW50cnkgYXMKKyAqIGluZGljYXRlZCBieSB0aGUgSUQgKGkuZS4gTk8sSVQsRlIsVUssIGV0YykuIFRoZSByZXN1bHQgd2lsbCBiZSBtdWx0aXBsZSBkYXRhCisgKiBmaWxlcyAoaS5lLiBpdGFseS50eHQsIHNwYWluLnR4dCwgZXRjKS4gRWFjaCBmaWxlIHdpbGwgYmUgZm91bmQgdW5kZXIgYQorICogZm9sZGVyIHdpdGggc2FtZSBuYW1lIGFzIHRoZSBjb3VudHJ5IChpLmUuIElUQUxZXGl0YWx5LnR4dCwgU1BBSU5cc3BhaW4udHh0LAorICogZXRjKS4KKyAqIAorICogMykgRGF0YSBDb252ZXJ0ZXIgOiBydW4gRXVyb3BlRGF0YUNvbnZlcnRlciB0byBjb252ZXJ0IGZpbGUgaW4gY2xlYW5lZCBmb3JtYXQKKyAqIGludG8gRGl2YSBmb3JtYXQuCisgKiAKKyAqIAorICogNCkgQXJlYSBhbmQgUG9wdWxhdGlvbiBEYXRhIEV4dHJhY3Rpb24gOiBydW4gRXVyb3BlRGF0YUV4dHJhY3RvciB0byBleHRyYWN0CisgKiBhbGwgYXJlYSBhbmQgcG9wdWxhdGlvbiBkYXRhLgorICogCisgKiAKKyAqLworcHVibGljIGNsYXNzIEV1cm9wZURhdGFGb3JtYXR0ZXIgeworCisJLyoqCisJICogT3VyIHNvdXJjZSBmaWxlcyBmb3IgSVNPIDMxNjYtMSBjb2RlcyBhbmQgZm9yIHRoZSBsaXN0IG9mIHRhcmdldAorCSAqIGNvdW50cmllcy4KKwkgKi8KKworCXByaXZhdGUgU3RyaW5nIGlzbzMxNjZfMSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBmaXhGaWxlID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIHRhcmdldEZpbGUgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RGlyID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIHdvcmtzcGFjZSA9IG51bGw7CisKKwkvKioKKwkgKiBMaXN0IGZvciBJU08gMzE2Ni0xIGNvZGVzIGFuZCB0YXJnZXQgY291bnRyaWVzLgorCSAqLworCUxpc3Q8U3RyaW5nPiB0YXJnZXRMaXN0ID0gbnVsbDsKKworCUxpc3Q8U3RyaW5nPiBjb2RlTGlzdCA9IG51bGw7CisKKwlMaXN0PFN0cmluZz4gY29kZWZpeExpc3QgPSBudWxsOworCisJLyoqCisJICogSGFzaCBtYXAgdG8ga2VlcCB0cmFjayBvZiBwb2x5Z29ucy4KKwkgKi8KKwlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gaXNvMzE2Nl8xIC0KKwkgKiAgICAgICAgICAgIGRhdGEgZmlsZSB3aXRoIHRoZSBJU08zMTY2LTEgQUxQSEFfMiBhbmQgQUxQSEFfMyBjb2Rlcy4KKwkgKiBAcGFyYW0gZml4RmlsZSAtCisJICogICAgICAgICAgICBmaWxlIGNvbnRhaW5pbmcgbWlzc2luZyBJU08zMTY2LTIgY29kZXMKKwkgKiBAcGFyYW0gdGFyZ2V0RmlsZSAtCisJICogICAgICAgICAgICBkYXRhIGZpbGUgd2hlcmUgd2UgZmluZCBhIGxpc3Qgb2YgY291bnRyaWVzIGZvciBnZW5lcmF0aW9uIG9mCisJICogICAgICAgICAgICB0aGVpciBjb3JyZXNwb25kaW5nIGFyZWEucHJvcGVydGllcyBmaWxlcy4KKwkgKiBAcGFyYW0gb3V0cHV0RGlyIC0KKwkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGUgZmlsZXMgZ2VuZXJhdGVkLgorCSAqIAorCSAqLworCS8vIHB1YmxpYyBFdXJvcGVEYXRhRm9ybWF0dGVyKFN0cmluZyBpc28zMTY2XzEsIFN0cmluZyBmaXhGaWxlLAorCS8vIFN0cmluZyB0YXJnZXRGaWxlLCBTdHJpbmcgb3V0cHV0RGlyKSB7CisJLy8gLy8gU2V0IHZhbHVlcyBvZiBnbG9iYWwgdmFyaWFibGVzLgorCS8vIHRoaXMuaXNvMzE2Nl8xID0gaXNvMzE2Nl8xOworCS8vIHRoaXMuZml4RmlsZSA9IGZpeEZpbGU7CisJLy8gdGhpcy50YXJnZXRGaWxlID0gdGFyZ2V0RmlsZTsKKwkvLyB0aGlzLm91dHB1dERpciA9IG91dHB1dERpcjsKKwkvLyB0YXJnZXRMaXN0ID0gbnVsbDsKKwkvLyAvLyBDcmVhdGUgdGhlIGhhc2ggbWFwcyA6CisJLy8gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJLy8gfQorCS8qKgorCSAqIEBwYXJhbSBjb25maWdGaWxlCisJICovCisJcHVibGljIEV1cm9wZURhdGFGb3JtYXR0ZXIoU3RyaW5nIGNvbmZpZ0ZpbGUpIHsKKworCQkvLyBMb2FkIGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcworCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB2YXJzID0gR2VuVXRpbHMubG9hZENvbmZpZ0ZpbGUoY29uZmlnRmlsZSk7CisKKwkJU2V0PFN0cmluZz4ga2V5cyA9IHZhcnMua2V5U2V0KCk7CisJCUl0ZXJhdG9yIGl0ID0ga2V5cy5pdGVyYXRvcigpOworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgdmFyID0gKFN0cmluZykgaXQubmV4dCgpOworCisJCQkvLyBBc3NpZ24gdmFsdWVzIHRvIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIDoKKwkJCWlmICh2YXIuZXF1YWxzKCJXT1JLU1BBQ0UiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJd29ya3NwYWNlID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiSVNPMzE2Nl8xIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWlzbzMxNjZfMSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIklTT19GSVgiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJZml4RmlsZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIlRBUkdFVF9MSVNUIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXRhcmdldEZpbGUgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJPVVRQVVQiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJb3V0cHV0RGlyID0gdmFycy5nZXQodmFyKTsKKwkJCX0KKworCQl9IC8vIHdoaWxlCisKKwkJLy8gVGhlIHdvcmtzcGFjZSB2YXJpYWJsZSBzaG91bGQgZW5kIHdpdGggYSBzbGFzaCBjaGFyYWN0ZXIKKwkJaWYgKHdvcmtzcGFjZS5lbmRzV2l0aCgiXFwiKSA9PSBmYWxzZSkgeyAvLyROT04tTkxTLTEkCisJCQl3b3Jrc3BhY2UgKz0gIlxcIjsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJU3RyaW5nIHBhdGggPSB3b3Jrc3BhY2UgKyBHZW5Db25zdGFudHMuUEFSQU1TX0RJUjsKKworCQkvLyBTZXQgcmVtYWluaW5nIGNvbmZpZyB2YXJzIHVzaW5nIFdPUktTUEFDRSAod29ya3NwYWNlIHJlbGF0aXZlKQorCQlpZiAoaXNvMzE2Nl8xID09IG51bGwpIHsKKwkJCWlzbzMxNjZfMSA9IHBhdGggKyBHZW5Db25zdGFudHMuSVNPMzE2Nl8xX0ZJTEU7CisJCX0KKwkJaWYgKGZpeEZpbGUgPT0gbnVsbCkgeworCQkJZml4RmlsZSA9IHBhdGggKyBHZW5Db25zdGFudHMuSVNPRklYX0ZJTEU7CisJCX0KKwkJaWYgKHRhcmdldEZpbGUgPT0gbnVsbCkgeworCQkJdGFyZ2V0RmlsZSA9IHBhdGggKyBHZW5Db25zdGFudHMuRVVST1BFX0NPVU5UUklFUzsKKwkJfQorCQlpZiAob3V0cHV0RGlyID09IG51bGwpIHsKKwkJCW91dHB1dERpciA9IEdlbkNvbnN0YW50cy5EVU1NWV9ESVI7CisJCX0KKworCQl0YXJnZXRMaXN0ID0gbnVsbDsKKworCQkvLyBDcmVhdGUgdGhlIGhhc2ggbWFwcyA6CisJCW1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2V0cyB1cCBhbmQgcnVucyB0aGUgZmluZGVyLgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBjb3VudHJpZXMgd2Ugd2FudC4KKwkJdGFyZ2V0TGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdCh0YXJnZXRGaWxlKTsKKworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIElTTzMxNjYtMSBBTFBIQTIsIEFMUEhBMywgYW5kCisJCS8vIG51bWVyaWMgY29kZXMuCisJCWNvZGVMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KGlzbzMxNjZfMSk7CisKKwkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBtaXNzaW5nIElTTzMxNjYtMiBjb2RlcworCQljb2RlZml4TGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdChmaXhGaWxlKTsKKworCQkvLyBOb3csIHByb2Nlc3MgZWFjaCBpdGVtIGluIHRoZSB0YXJnZXQgbGlzdC4KKwkJcHJvY2VzcygpOworCX0KKworCS8qKgorCSAqIAorCSAqIAorCSAqLworCXByb3RlY3RlZCB2b2lkIHByb2Nlc3MoKSB7CisKKwkJLy8gQSB3cml0ZXIgZm9yIHRoZSBuZXcgZmlsZSB3ZSBhcmUgY3JlYXRpbmcuCisJCVByaW50V3JpdGVyIGV1cm9wZUZpbGUgPSBudWxsOworCisJCS8vIE9iamVjdCBob2xkaW5nIElTTzMxNjYtMSByZWxhdGVkIGRhdGEuCisJCUlTT0NvZGUxIGlzb0NvZGUgPSBudWxsOworCisJCS8vIE9iamVjdCB0byBkZXRlY3QgdHJhbnNpdGlvbnMgaW4gZGF0YQorCQlJU09Db2RlMSBjdXJyZW50Q29kZSA9IG51bGw7CisKKwkJLy8gTmFtZSBvZiB0aGUgbmV3IHByb3BlcnRpZXMgZmlsZS4KKwkJU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKKworCQlpbnQgc2l6ZSA9IHRhcmdldExpc3Quc2l6ZSgpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisKKwkJCS8vIEdldCB0aGUgbmV4dCBjb3VudHJ5IGluIHRoZSBsaXN0LgorCQkJU3RyaW5nIGZpbGUgPSB0YXJnZXRMaXN0LmdldChpKS50cmltKCk7CisKKwkJCS8vIE9wZW4gdGhlIGRhdGEgc291cmNlIGZpbGUgZm9yIHRoaXMgY291bnRyeS4KKwkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IEdlblV0aWxzLm9wZW5SZWFkZXIoZmlsZSk7CisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJcdFx0PDw8PCBEQVRBIEZPUk1BVFRFUiAtLSBQcm9jZXNzaW5nIGNvdW50cnkgOiAiICsgZmlsZSArICIgPj4+PiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCXRyeSB7CisKKwkJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKKworCQkJCQlTdHJpbmcgYnVmZmVyID0gbnVsbDsKKworCQkJCQl3aGlsZSAoR2VuVXRpbHMuRU9GKGJ1ZmZlciA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSB0cnVlKSB7CisKKwkJCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlIG1hcmsgYWxsIHVua25vd24gZGF0YS4KKwkJCQkJCWJ1ZmZlciA9IGJ1ZmZlci5yZXBsYWNlKCIsLCwiLCAiLFVOS05PV04sVU5LTk9XTiwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQlidWZmZXIgPSBidWZmZXIucmVwbGFjZSgiLCwiLCAiLFVOS05PV04sIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQkKKworCQkJCQkJU3RyaW5nW10gaXRlbXMgPSBidWZmZXIuc3BsaXQoIiwiKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJCQkvLyBHZXQgSVNPIGNvZGUgZm9yIGN1cnJlbnQgZW50cnkuCisJCQkJCQlTdHJpbmcgY291bnRyeSA9IEdlblV0aWxzLmdldENvdW50cnlOYW1lKAorCQkJCQkJCQlpdGVtc1tFdXJvcGVEYXRhRm9ybWF0dGluZ0hlYWRlci5TVFJJRF0KKwkJCQkJCQkJCQkuc3Vic3RyaW5nKDAsIDIpLCBjb2RlTGlzdCk7CisJCQkJCQljdXJyZW50Q29kZSA9IEdlblV0aWxzLmdldElTT0NvZGUoY291bnRyeSwgY29kZUxpc3QpOworCisJCQkJCQkvLyBHZXQgdGhlIElTTzMxNjYtMSBpbmZvIGZvciB0aGlzIGNvdW50cnkKKwkJCQkJCWlmIChpc29Db2RlID09IG51bGwpIHsKKwkJCQkJCQljb3VudHJ5ID0gR2VuVXRpbHMuZ2V0Q291bnRyeU5hbWUoCisJCQkJCQkJCQlpdGVtc1tFdXJvcGVEYXRhRm9ybWF0dGluZ0hlYWRlci5TVFJJRF0KKwkJCQkJCQkJCQkJLnN1YnN0cmluZygwLCAyKSwgY29kZUxpc3QpOworCQkJCQkJCWlzb0NvZGUgPSBHZW5VdGlscy5nZXRJU09Db2RlKGNvdW50cnksIGNvZGVMaXN0KTsKKwkJCQkJCX0KKworCQkJCQkJLy8gQ2hlY2sgZm9yIGNvdW50cnktdHJhbnNpdGlvbnMKKwkJCQkJCWlmIChpc29Db2RlLmdldEFscGhhMigpLmVxdWFscyhjdXJyZW50Q29kZS5nZXRBbHBoYTIoKSkgPT0gZmFsc2UpIHsKKwkJCQkJCQkvLyBJZiB3ZSBoYXZlIGEgdHJhbnNpdGlvbiwgdGhlbiBjbG9zZSBwcmV2aW91cworCQkJCQkJCS8vIGZpbGUuCisJCQkJCQkJaWYgKGV1cm9wZUZpbGUgIT0gbnVsbCkgeworCQkJCQkJCQlldXJvcGVGaWxlLmNsb3NlKCk7CisJCQkJCQkJCWV1cm9wZUZpbGUgPSBudWxsOworCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZXMKKwkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJcdFx0R2VuZXJhdGVkIDoiKSAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBmaWxlTmFtZSk7CisJCQkJCQkJCWZpbGVOYW1lID0gbnVsbDsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBTZXQgaXNvIGNvZGUgdG8gdGhlIGN1cnJlbnQgY29kZS4KKwkJCQkJCQlpc29Db2RlID0gY3VycmVudENvZGU7CisKKwkJCQkJCX0KKworCQkJCQkJLy8gSWYgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCBmb3IgdGhpcyBjb3VudHJ5LAorCQkJCQkJLy8gY3JlYXRlIGl0IHVzaW5nIElTTyBhbHBoYTMgY29kZS4KKwkJCQkJCUZpbGUgY291bnRyeURpciA9IG5ldyBGaWxlKG91dHB1dERpcgorCQkJCQkJCQkrIGlzb0NvZGUuZ2V0QWxwaGEzKCkpOworCisJCQkJCQlpZiAoY291bnRyeURpciAhPSBudWxsICYmIGNvdW50cnlEaXIuZXhpc3RzKCkgPT0gZmFsc2UpIHsKKwkJCQkJCQkvLyBEaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuIENyZWF0ZSBpdC4KKwkJCQkJCQljb3VudHJ5RGlyLm1rZGlyKCk7CisJCQkJCQl9CisKKwkJCQkJCS8vIENyZWF0ZSBhbmQgb3BlbiB0aGUgbmV3IGZpbGUuCisJCQkJCQlpZiAoZXVyb3BlRmlsZSA9PSBudWxsKSB7CisJCQkJCQkJLy8gQ3JlYXRlIHRoZSBmaWxlIG5hbWUgZm9yIHRoZSBuZXcgcHJvcGVydGllcy5maWxlLgorCQkJCQkJCWZpbGVOYW1lID0gY291bnRyeURpciArICJcXCIgKyBpc29Db2RlLmdldEFscGhhMygpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCSsgIi50eHQiOyAvLyROT04tTkxTLTEkCisJCQkJCQkJLy8gQ3JlYXRlIHRuZSBuZXcgcHJvcGVydGllcy5maWxlIGZvciB0aGlzIGNvdW50cnkuCisJCQkJCQkJZXVyb3BlRmlsZSA9IEdlblV0aWxzLm9wZW5Xcml0ZXIoZmlsZU5hbWUpOworCQkJCQkJfQorCisJCQkJCQkvLyBWYXJpYWJsZSB1c2VkIHRvIGhvbGQgdGhlIG91dHB1dCBkYXRhLgorCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShldXJvcGVGaWxlLCBidWZmZXIgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQorCisJCQkJCX0vLyB3aGlsZQorCisJCQkJCS8vIFdlIGRvbnQgbmVlZCB0aGUgSVNPIGNvZGUgb2JqZWN0IGZvciB0aGlzIGNvdW50cnkKKwkJCQkJLy8gYW55bW9yZSwgd2UgYXJlIGRvbmUgcHJvY2Vzc2luZyBpdC4KKwkJCQkJaXNvQ29kZSA9IG51bGw7CisKKwkJCQkJLy8gQ2xvc2UgYWxsIG9wZW4gcmVzb3VyY2VzLgorCQkJCQlyZWFkZXIuY2xvc2UoKTsKKworCQkJCQkvLyBSdW4gZ2FyYmFnZSBjb2xsZWN0aW9uCisJCQkJCS8vU3lzdGVtLmdjKCk7CisKKwkJCQl9CisKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCisJCX0gLy8gZm9yCisKKwl9CisKKwkvKioKKwkgKiBNYWluIGV4ZWN1dGlvbiBlbnRyeSBwb2ludC4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJLy8gZmluYWwgaW50IElTT18zMTY2XzEgPSAwOworCQkvLyBmaW5hbCBpbnQgRklYX0ZJTEUgPSAxOworCQkvLyBmaW5hbCBpbnQgVEFSR0VUX0xJU1QgPSAyOworCQkvLyBmaW5hbCBpbnQgT1VUUFVUX0RJUiA9IDM7CisJCS8vIGZpbmFsIGludCBQQVJBTVMgPSA0OworCQkvLworCQkvLyBpZiAoYXJncy5sZW5ndGggPCBQQVJBTVMpIHsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLVdyb25nIGFyZ3VtZW50cy0tIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dAorCQkvLyAucHJpbnRsbigiXHRUbyBydW4sIHBsZWFzZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIDogIik7CisJCS8vIC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IElTTyAzMTY2LTEgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBJU08gZml4IGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgVGFyZ2V0IGNvdW50cmllcyBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IE91dHB1dCBkaXJlY3RvcnkiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyByZXR1cm47CisJCS8vIH0KKworCQkvLyBFdXJvcGVEYXRhRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBFdXJvcGVEYXRhRm9ybWF0dGVyKAorCQkvLyBhcmdzW0lTT18zMTY2XzFdLCBhcmdzW0ZJWF9GSUxFXSwgYXJnc1tUQVJHRVRfTElTVF0sCisJCS8vIGFyZ3NbT1VUUFVUX0RJUl0pOworCQkvLyBmb3JtYXR0ZXIucnVuKCk7CisKKwkJZmluYWwgaW50IENPTkZJR19GSUxFID0gMDsKKwkJZmluYWwgaW50IFBBUkFNUyA9IDE7CisKKwkJaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQtLVdyb25nIGFyZ3VtZW50cy0tIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQKKwkJCQkJLnByaW50bG4oIlx0XHRUbyBydW4sIHBsZWFzZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnQocykgOiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHQgQ29uZmlndXJhdGlvbiBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5leGl0KDEpOworCQl9CisKKwkJRXVyb3BlRGF0YUZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgRXVyb3BlRGF0YUZvcm1hdHRlcigKKwkJCQlhcmdzW0NPTkZJR19GSUxFXSk7CisJCWZvcm1hdHRlci5ydW4oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0V1cm9wZURhdGFGb3JtYXR0aW5nSGVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0V1cm9wZURhdGFGb3JtYXR0aW5nSGVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyZWFkMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvRXVyb3BlRGF0YUZvcm1hdHRpbmdIZWFkZXIuamF2YQpAQCAtMCwwICsxLDYxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiAKKyAqIFJlbGV2YW50IGtleXMgdG8gdGhlIEV1cm9wZWFuIGRhdGFzZXQuCisgKiAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEV1cm9wZURhdGFGb3JtYXR0aW5nSGVhZGVyIHsKKworCS8qKgorCSAqIE51bWVyaWMgSUQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1JRCA9IDA7CisKKwkvKioKKwkgKiBOYW1lIElECisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSSUQgPSAxOworCisJLyoqCisJICogVG90YWwgQXJlYQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSRUEgPSAyOworCisJLyoqCisJICogUG9wdWxhdGlvbiB2YWx1ZSAxCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9QMSA9IDM7CisKKwkvKioKKwkgKiBQb3B1bGF0aW9uIHZhbHVlIDIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1AyID0gNDsKKworCS8qKgorCSAqIFBvcHVsYXRpb24gdmFsdWUgMworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUDMgPSA1OworCisJLyoqCisJICogUG9wdWxhdGlvbiB2YWx1ZSA0CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9QNCA9IDY7CisKKwkvKioKKwkgKiBBbHRlcm5hdGl2ZSBJRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFTVBJRCA9IDc7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0ZpbmRSdW5QYXJhbWV0ZXJGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0ZpbmRSdW5QYXJhbWV0ZXJGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxNTg0MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvRmluZFJ1blBhcmFtZXRlckZpbGUuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VuZXJhdG9yczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworLyoqCisgKiBHaXZlbiBhIHNldCBvZiBydW4gcGFyYW1ldGVyIG5hbWVzIGFuZCB2YWx1ZXMsIGZpbmQgYSBtYXRjaGluZyBydW4gcGFyYW1ldGVyCisgKiBmaWxlIGFueXdoZXJlIGluIGEgc3ViIGRpcmVjdG9yeSBvZiB0aGUgaW5wdXQgZGlyZWN0b3J5LiBVc2VmdWwgZm9yIGZpbmRpbmcKKyAqIGV4YWN0bHkgdGhlIGxvZ2dlZCBkYXRhIHlvdSB3YW50IAorICovCitwdWJsaWMgY2xhc3MgRmluZFJ1blBhcmFtZXRlckZpbGUgeworCisJLyoqCisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgeworCQlpZihhcmdzLmxlbmd0aCA8IDEpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IEZpbmRSdW5QYXJhbWV0ZXJGaWxlIDxkaXI+IDxwYXJhbSAxPiA8dmFsIDE+IDxwYXJhbSAyPiA8dmFsIDI+IC4uLiA8cGFyYW0gbj4gPHZhbCBuPiIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0uZXhpdCgtMSk7CisJCX0KKwkJCisJCVN0cmluZyBkaXIgPSBhcmdzWzBdOworCQkJCQorCQl0cnkgeworCQkJIC8vIE9wZW4gZGlyCisJCQlGaWxlIGQgPSBuZXcgRmlsZShkaXIpOworCQkJaWYoIWQuZXhpc3RzKCkgfHwgIWQuaXNEaXJlY3RvcnkoKSkgeyAKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oZGlyKyAibm90IGZvdW5kIG9yIGl0IGlzIG5vdCBhIGRpcmVjdG9yeSIpOyAvLyROT04tTkxTLTEkCisJCQkJU3lzdGVtLmV4aXQoLTEpOworCQkJfQorCQkJCisJCQlyZWN1cnNlU2VhcmNoKGQsIGFyZ3MpOworCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQkKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWN1cnNlU2VhcmNoKEZpbGUgZCwgU3RyaW5nIFtdIGFyZ3MpIHsKKwkJIC8vIFJlYWQgaW5mZWN0aW91cyBmaWxlCisJCQorCQl0cnkgeworCQkgaWYoZC5pc0RpcmVjdG9yeSgpKSB7CisJCQkgLy8gS2VlcCBnb2luZyBkb3duIGRlZXBlcgorCQkJIFN0cmluZyBbXSBmaWxlcyAgPSBkLmxpc3QoKTsKKwkJCSBmb3IoU3RyaW5nIF9kOmZpbGVzKSB7CisJCQkJIEZpbGUgZiA9IG5ldyBGaWxlKGQuZ2V0QWJzb2x1dGVQYXRoKCkrRmlsZS5zZXBhcmF0b3IrX2QpOworCQkJCSAvLyBVbml4IG1ha2Ugc3VyZSBpdCdzIG5vdCBwYXJlbnQgZGlyIG9yIHdlIGdldCBpbmZpbml0ZSBsb29wIHByb2JsZW0gaGVyZQorCQkJCSAvLyBGaXggbGF0ZXIKKwkJCQkgcmVjdXJzZVNlYXJjaChmLCBhcmdzKTsKKwkJCSB9CisJCSB9CisJCSAKKwkJIC8vIE5vdCBhIGRpcmVjdG9yeS4gRG9lcyB0aGUgZmlsZSBuYW1lIG1hdGNoPworCQkgCisJCSBTdHJpbmcgbmFtZSA9IGQuZ2V0TmFtZSgpOworCQkgaWYoIW5hbWUuZXF1YWxzKCJydW5wYXJhbWV0ZXJzLmNzdiIpICYmICFuYW1lLmVxdWFscygicnVucGFyYW10ZXJzLmNzdiIpKSByZXR1cm4gOyAvLyB3cm9uZyBmaWxlIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgCisJCSAKKwkJIAorCQkgCisJCSBBcnJheUxpc3Q8U3RyaW5nPiBwYXJhbU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCSBBcnJheUxpc3Q8U3RyaW5nPiBwYXJhbVZhbHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJIAorCQkgRmlsZUlucHV0U3RyZWFtIGlmaWxlID0gbmV3IEZpbGVJbnB1dFN0cmVhbShkKTsgCisJICAgICBCdWZmZXJlZFJlYWRlciBpcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpZmlsZSkpOworCSAgICAgU3RyaW5nIGhlYWRlciA9IG51bGw7CisJICAgICBoZWFkZXI9aXJlYWRlci5yZWFkTGluZSgpOworCSAgICAgaWYoaGVhZGVyID09IG51bGwpIHsKKwkgICAgCSBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yLCAiK2QuZ2V0QWJzb2x1dGVQYXRoKCkrIiBmaWxlIGlzIGVtcHR5ISIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkgICAgCSBTeXN0ZW0uZXhpdCgtMik7CisJICAgICB9CisJICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGhlYWRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAorCSAgICAgd2hpbGUoc3QuaGFzTW9yZVRva2VucygpKSB7CisJICAgIAkgU3RyaW5nIHZhbCA9IHN0Lm5leHRUb2tlbigpOworCSAgICAJIHBhcmFtTmFtZXMuYWRkKHZhbC50cmltKCkpOworCSAgICAgfQorCSAgICAKKwkgICAgU3RyaW5nIGRhdGEgPSBudWxsOyAKKwkgICAgZGF0YT1pcmVhZGVyLnJlYWRMaW5lKCk7CisJICAgIGlmKGRhdGEgPT0gbnVsbCkgeworCSAgICAJIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IsICIrZC5nZXRBYnNvbHV0ZVBhdGgoKSsiIGZpbGUgaGFzIG5vIGRhdGEhIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCSAgICAJIFN5c3RlbS5leGl0KC0yKTsKKwkgICAgIH0KKwkgICAgCisJICAgIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihkYXRhLCAiLCIpOyAvLyROT04tTkxTLTEkCisJICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworCQkJU3RyaW5nIHZhbCA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKKwkJCQorCQkJLy8gU3RhbmRhcmQgZm9ybWF0IGZvciBudW1iZXIgCisJCQl0cnkgeworCQkJCUJpZ0RlY2ltYWwgYmQgPSBuZXcgQmlnRGVjaW1hbCh2YWwpOworCQkJICAgIGJkID0gYmQuc2V0U2NhbGUoNSxCaWdEZWNpbWFsLlJPVU5EX0hBTEZfVVApOworCQkJICAgIHZhbCA9IGJkLnRvU3RyaW5nKCk7CisJCQl9Y2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworCQkJCS8vIElnbm9yZSBub3QgYSBkb3VibGUKKwkJCX0KKwkJCXBhcmFtVmFscy5hZGQodmFsKTsKKwkgICAgfSAvLyByZWFkIHRva2VucworCSAKKwkgICBpcmVhZGVyLmNsb3NlKCk7CisJCQorCSAgIC8vIE5vdyBzZWUgaWYgdGhlIGZpbGUgbWF0Y2hlcworCSAgIAorCSAgIGJvb2xlYW4gbWF0Y2ggPSB0cnVlOworCSAgIGZvcihpbnQgaSA9IDE7aTxhcmdzLmxlbmd0aDtpKz0yKSB7CisJCSAgIFN0cmluZyBwbmFtZSA9IGFyZ3NbaV0udHJpbSgpOworCQkgICBTdHJpbmcgcHZhbCA9IGFyZ3NbaSsxXS50cmltKCk7IC8vIGluZGV4IG91dCBvZiBib3VuZCBpZiBiYWQgaW5wdXQKKwkJICAgLy8gQ29uZm9ybSB0byBzdGFuZGFyZCBudW1iZXIgZm9ybWF0IGlmIGl0J3MgYSBudW1iZXIKKwkJICAgdHJ5IHsKKwkJCQlCaWdEZWNpbWFsIGJkID0gbmV3IEJpZ0RlY2ltYWwocHZhbCk7CisJCQkgICAgYmQgPSBiZC5zZXRTY2FsZSg1LEJpZ0RlY2ltYWwuUk9VTkRfSEFMRl9VUCk7CisJCQkgICAgcHZhbCA9IGJkLnRvU3RyaW5nKCk7CisJCQl9Y2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworCQkJCS8vIElnbm9yZSBub3QgYSBkb3VibGUKKwkJCX0KKwkJICAgaWYoIXBhcmFtTmFtZXMuY29udGFpbnMocG5hbWUpKSB7bWF0Y2ggPSBmYWxzZTticmVhazt9CisJCSAgIGZvcihpbnQgbj0wO248cGFyYW1OYW1lcy5zaXplKCk7KytuKSAKKwkJCSAgIGlmKHBuYW1lLmVxdWFscyhwYXJhbU5hbWVzLmdldChuKSkgJiYgIXB2YWwuZXF1YWxzKHBhcmFtVmFscy5nZXQobikpKSB7bWF0Y2g9ZmFsc2U7YnJlYWs7fQorCSAgIH0KKwkgICBpZighbWF0Y2gpIHJldHVybjsKKwkgICAKKwkgICBTeXN0ZW0ub3V0LnByaW50bG4oZC5nZXRBYnNvbHV0ZVBhdGgoKSk7CisJIAl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJICAgIAorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvR01MR2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0dNTEdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOWMzZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0dNTEdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsOTQzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogU1RFTSBJSSBEYXRhIE1pZ3JhdGlvbi9HZW5lcmF0aW9uIFV0aWxpdGllcyA6IEluc3RhbmNlcyBvZiB0aGlzIHV0aWxpdHkgY2xhc3MKKyAqIGdlbmVyYXRlIHRoZSBHTUwgZGF0YSBmaWxlcyBmb3IgdGhlIGRpdmEgZGF0YSBzZXQgYXQgYWRtaW4gbGV2ZWxzIDAsIDEsIGFuZAorICogMi4KKyAqIAorICogCisgKiBUbyBjb25maWd1cmUsIHNlZSBjb25maWd1cmF0aW9uIGZpbGUgOgorICogb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vR01MR2VuZXJhdG9yLmNvbmZpZworICogCisgKiAKKyAqIFRvIHJ1biwgYWRkIHBhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlIGluIHRoZSBydW4gcHJvZmlsZSAoaS5lLgorICogQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxjb25maWd1cmF0aW9uXEdNTEdlbmVyYXRvci5jb25maWcpCisgKiAKKyAqIAorICogU0VUIFZNQVJHUyBUTyA6IC1YbXMxMDI0bSAtWG14MTAyNG0KKyAqIAorICogCisgKi8KKworcHVibGljIGNsYXNzIEdNTEdlbmVyYXRvciB7CisKKwkvKioKKwkgKiBPdXIgc291cmNlIGZpbGVzIGZvciBJU08gMzE2Ni0xIGNvZGVzIGFuZCBmb3IgdGhlIGxpc3Qgb2YgdGFyZ2V0CisJICogY291bnRyaWVzLgorCSAqLworCisJcHJpdmF0ZSBTdHJpbmcgaXNvMzE2Nl8xID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIGlzbzMxNjZfMiA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBmaXhGaWxlID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIHRhcmdldEZpbGUgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgbGV4RGlyID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIG91dHB1dERpciA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyB3b3Jrc3BhY2UgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgdXNhRGVzY3JpcHRvckZpbGUgPSBudWxsOworCisJLyoqCisJICogTGlzdCBmb3IgSVNPIDMxNjYtMSBjb2RlcyBhbmQgdGFyZ2V0IGNvdW50cmllcy4KKwkgKi8KKworCUxpc3QgdGFyZ2V0TGlzdCA9IG51bGw7CisKKwlMaXN0IGNvZGVMaXN0ID0gbnVsbDsKKworCUxpc3QgY29kZWZpeExpc3QgPSBudWxsOworCisJTGlzdCB1c2FEZXNjcmlwdG9yTGlzdCA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqIAorCSAqIEBwYXJhbSBpc28zMTY2XzEgLQorCSAqICAgICAgICAgICAgZGF0YSBmaWxlIHdpdGggdGhlIElTTzMxNjYtMSBBTFBIQV8yIGFuZCBBTFBIQV8zIGNvZGVzLgorCSAqIEBwYXJhbSBpc28zMTY2XzIgLQorCSAqICAgICAgICAgICAgZGF0YSBmaWxlIHdpdGggdGhlIElTTzMxNjYtMiBjb2Rlcy4KKwkgKiBAcGFyYW0gZml4RmlsZSAtCisJICogICAgICAgICAgICBmaWxlIGNvbnRhaW5pbmcgbWlzc2luZyBJU08zMTY2LTIgY29kZXMKKwkgKiBAcGFyYW0gdGFyZ2V0RmlsZQorCSAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgY291bnRyaWVzIGZvciB3aGljaCB3ZSB3aWxsIGdlbmVyYXRlIEdNTCBmaWxlcworCSAqIEBwYXJhbSBsZXhEaXIKKwkgKiAgICAgICAgICAgIGZvbGRlciBjb250YWluaW5nIGxleGljb2dyYXBoaWNhbGx5IHNvcnRlZCBmaWxlcworCSAqIEBwYXJhbSBvdXRwdXREaXIKKwkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGUgR01MIGZpbGVzIHdlIGdlbmVyYXRlCisJICovCisJLy8gcHVibGljIEdNTEdlbmVyYXRvcihTdHJpbmcgaXNvMzE2Nl8xLCBTdHJpbmcgaXNvMzE2Nl8yLCBTdHJpbmcgZml4RmlsZSwKKwkvLyBTdHJpbmcgdGFyZ2V0RmlsZSwgU3RyaW5nIGxleERpciwgU3RyaW5nIG91dHB1dERpcikgeworCS8vIC8vIFNldCB2YWx1ZXMgb2YgZ2xvYmFsIHZhcmlhYmxlcy4KKwkvLyB0aGlzLmlzbzMxNjZfMSA9IGlzbzMxNjZfMTsKKwkvLyB0aGlzLmlzbzMxNjZfMiA9IGlzbzMxNjZfMjsKKwkvLyB0aGlzLmZpeEZpbGUgPSBmaXhGaWxlOworCS8vIHRoaXMudGFyZ2V0RmlsZSA9IHRhcmdldEZpbGU7CisJLy8gdGhpcy5sZXhEaXIgPSBsZXhEaXI7CisJLy8gdGhpcy5vdXRwdXREaXIgPSBvdXRwdXREaXI7CisJLy8gLy8gVGhlIG5leHQgZGVzY3JpcHRvciBpcyB1c2VkIG9ubHkgd2hlbiBwcm9jZXNzaW5nIHRoZSBVU0EKKwkvLyB0aGlzLnVzYURlc2NyaXB0b3JGaWxlID0gd29ya3NwYWNlCisJLy8gKworCS8vICJcXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxccGFyYW1ldGVyc1xcSVNPRklYXFxVU0FfRklQUy50eHQiOy8vJE5PTi1OTFMtMSQKKwkvLyB0YXJnZXRMaXN0ID0gbnVsbDsKKwkvLwl9CisKKwkvKioKKwkgKiBAcGFyYW0gY29uZmlnRmlsZQorCSAqLworCXB1YmxpYyBHTUxHZW5lcmF0b3IoU3RyaW5nIGNvbmZpZ0ZpbGUpIHsKKworCQkvLyBMb2FkIGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcworCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB2YXJzID0gR2VuVXRpbHMubG9hZENvbmZpZ0ZpbGUoY29uZmlnRmlsZSk7CisKKwkJU2V0PFN0cmluZz4ga2V5cyA9IHZhcnMua2V5U2V0KCk7CisJCUl0ZXJhdG9yIGl0ID0ga2V5cy5pdGVyYXRvcigpOworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgdmFyID0gKFN0cmluZykgaXQubmV4dCgpOworCisJCQkvLyBBc3NpZ24gdmFsdWVzIHRvIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIDoKKwkJCWlmICh2YXIuZXF1YWxzKCJXT1JLU1BBQ0UiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJd29ya3NwYWNlID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiSVNPMzE2Nl8xIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWlzbzMxNjZfMSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIklTTzMxNjZfMiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpc28zMTY2XzIgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJJU09fRklYIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWZpeEZpbGUgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJUQVJHRVRfTElTVCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl0YXJnZXRGaWxlID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiTEVYX0RJUiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlsZXhEaXIgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJQUk9QRVJUSUVTX09VVFBVVCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlvdXRwdXREaXIgPSB2YXJzLmdldCh2YXIpOworCQkJfQorCisJCX0gLy8gd2hpbGUKKworCQkvLyBUaGUgd29ya3NwYWNlIHZhcmlhYmxlIHNob3VsZCBlbmQgd2l0aCBhIHNsYXNoIGNoYXJhY3RlcgorCQlpZiAod29ya3NwYWNlLmVuZHNXaXRoKCJcXCIpID09IGZhbHNlKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXdvcmtzcGFjZSArPSAiXFwiOyAvLyROT04tTkxTLTEkCisJCX0KKworCQlTdHJpbmcgcGF0aCA9IHdvcmtzcGFjZSArIEdlbkNvbnN0YW50cy5QQVJBTVNfRElSOworCisJCS8vIFNldCByZW1haW5pbmcgY29uZmlnIHZhcnMgdXNpbmcgV09SS1NQQUNFICh3b3Jrc3BhY2UgcmVsYXRpdmUpCisJCWlmIChpc28zMTY2XzEgPT0gbnVsbCkgeworCQkJaXNvMzE2Nl8xID0gcGF0aCArIEdlbkNvbnN0YW50cy5JU08zMTY2XzFfRklMRTsKKwkJfQorCQlpZiAoaXNvMzE2Nl8yID09IG51bGwpIHsKKwkJCWlzbzMxNjZfMiA9IHBhdGggKyBHZW5Db25zdGFudHMuSVNPMzE2Nl8yX0ZJTEU7CisJCX0KKwkJaWYgKGZpeEZpbGUgPT0gbnVsbCkgeworCQkJZml4RmlsZSA9IHBhdGggKyBHZW5Db25zdGFudHMuSVNPRklYX0ZJTEU7CisJCX0KKwkJaWYgKHRhcmdldEZpbGUgPT0gbnVsbCkgeworCQkJdGFyZ2V0RmlsZSA9IHBhdGggKyBHZW5Db25zdGFudHMuR1JPVVBFRF9DT1VOVFJJRVM7CisJCX0KKwkJaWYgKGxleERpciA9PSBudWxsKSB7CisJCQlsZXhEaXIgPSBwYXRoICsgR2VuQ29uc3RhbnRzLkxFWF9ESVI7CisJCX0KKwkJaWYgKG91dHB1dERpciA9PSBudWxsKSB7CisJCQlvdXRwdXREaXIgPSB3b3Jrc3BhY2UgKyBHZW5Db25zdGFudHMuTUFQU19PVVRQVVRfRElSOworCQl9CisKKwkJdGFyZ2V0TGlzdCA9IG51bGw7CisKKwkJLy8gVGhlIG5leHQgZGVzY3JpcHRvciBpcyB1c2VkIG9ubHkgd2hlbiBwcm9jZXNzaW5nIHRoZSBVU0EKKwkJdGhpcy51c2FEZXNjcmlwdG9yRmlsZSA9IHBhdGggKyBHZW5Db25zdGFudHMuVVNBX0ZJUFNfRklMRTsKKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNldHMgdXAgYW5kIHJ1bnMgdGhpcyBnZW5lcmF0b3IuCisJICogCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgY291bnRyaWVzIHdlIHdhbnQuCisJCXRhcmdldExpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QodGFyZ2V0RmlsZSk7CisKKwkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBJU08zMTY2LTEgQUxQSEEyLCBBTFBIQTMsIGFuZAorCQkvLyBudW1lcmljIGNvZGVzLgorCQljb2RlTGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdChpc28zMTY2XzEpOworCisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgbWlzc2luZyBJU08zMTY2LTIgY29kZXMKKwkJY29kZWZpeExpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QoZml4RmlsZSk7CisKKwkJLy8gTG9hZCB0aGUgbGlzdCBvZiBkZXNjcmlwdG9ycyBmb3IgdGhlIFVTQSAoc3BlY2lhbCBjYXNlKQorCQl1c2FEZXNjcmlwdG9yTGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdCh1c2FEZXNjcmlwdG9yRmlsZSk7CisKKwkJLy8gTm93LCBwcm9jZXNzIGVhY2ggaXRlbSBpbiB0aGUgdGFyZ2V0IGxpc3QuCisJCXByb2Nlc3MoKTsKKworCX0KKworCS8qKgorCSAqIFByb2Nlc3Mgb3VyIGdsb2JhbCBsaXN0IG9mIHRhcmdldCBjb3VudHJpZXMuIEZvciBlYWNoIGNvdW50cnkgaW4gbGlzdCwKKwkgKiBnZW5lcmF0ZSBpdHMgR01MIGZpbGUuCisJICogCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJvY2VzcygpIHsKKworCQkvLyBBIHdyaXRlciBmb3IgdGhlIG5ldyBmaWxlIHdlIGFyZSBjcmVhdGluZy4KKwkJUHJpbnRXcml0ZXIgZ21sRmlsZSA9IG51bGw7CisKKwkJLy8gT2JqZWN0IGhvbGRpbmcgSVNPMzE2Ni0xIHJlbGF0ZWQgZGF0YS4KKwkJSVNPQ29kZTEgaXNvQ29kZSA9IG51bGw7CisKKwkJLy8gTmFtZSBvZiB0aGUgbmV3IHByb3BlcnRpZXMgZmlsZS4KKwkJU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKKworCQkvLyBBIGxpc3QgZm9yIElTTyAzMTY2LTIgb2JqZWN0cworCQlMaXN0IGlzbzJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisJCS8vIEZpbGVuYW1lcyBmb3IgbGV4MSBhbmQgbGV4MiBmaWxlcyBmb3IgYSBnaXZlbiBjb3VudHJ5LgorCQlTdHJpbmcgbGV4QWRtaW4xRmlsZSA9IG51bGw7CisJCVN0cmluZyBsZXhBZG1pbjJGaWxlID0gbnVsbDsKKworCQkvLyBMaXN0cyBob2xkaW5nIHRoZSBsZXgxIGFuZCBsZXgyIHZhbHVlcy4KKwkJLy8gTk9URTogbGV4IHZhbHVlcyBhcmUgdGhlIGxleGljb2dyYXBoaWNhbGx5IHNvcnRlZCB2YWx1ZXMgZm9yCisJCS8vIGFkbWluaXN0cmF0aW9uIGxldmVscy4KKwkJTGlzdDxTdHJpbmc+IGxleDFEYXRhU2V0ID0gbnVsbDsKKwkJTGlzdDxTdHJpbmc+IGxleDJEYXRhU2V0ID0gbnVsbDsKKworCQkvLyBMaXN0cyBmb3IgaG9sZGluZyBsZXgxIGFuZCBsZXgyIG9iamVjdHMgZm9yIGEgZ2l2ZW4gY291bnRyeS4KKwkJTGlzdDxMZXgxT2JqPiBsZXgxTGlzdCA9IG51bGw7CisJCUxpc3Q8TGV4Mk9iaj4gbGV4Mkxpc3QgPSBudWxsOworCisJCWludCBzaXplID0gdGFyZ2V0TGlzdC5zaXplKCk7CisKKwkJaW50IGxpbmVDb3VudGVyID0gMDsKKworCQkvLyBJdGVyYXRlIGZvciBldmVyeSBjb3VudHJ5IGFuZCBjcmVhdGUgaXRzIEdNTCBkYXRhIGZpbGUuCisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisKKwkJCS8vIEdldCB0aGUgbmV4dCBjb3VudHJ5IGluIHRoZSBsaXN0LgorCQkJU3RyaW5nIGZpbGUgPSAoKFN0cmluZykgdGFyZ2V0TGlzdC5nZXQoaSkpLnRyaW0oKTsKKworCQkJLy8gQW4gaW5kZXggZm9yIHVua253b24gb3Igbi5hLiBlbnRyaWVzCisJCQlpbnQgdW5rQ291bnRlciA9IDE7CisKKwkJCS8vIFdlIHVzZSB0aGlzIGxpc3QgdG8ga2VlcCB0cmFjayBvZiBkdXBsaWNhdGVkIHBvbHlnb25zLgorCQkJTGlzdDxTVEVNUG9seWdvbj4gcG9seWdvbnMgPSBudWxsOworCisJCQkvLyBPcGVuIHRoZSBkYXRhIHNvdXJjZSBmaWxlIGZvciB0aGlzIGNvdW50cnkuCisJCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBHZW5VdGlscy5vcGVuUmVhZGVyKGZpbGUpOworCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRcdDw8PDwgR01MIEdFTkVSQVRPUiAtLSBQcm9jZXNzaW5nIDoiICsgZmlsZSArICIgPj4+PiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCXRyeSB7CisKKwkJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKKworCQkJCQlTdHJpbmcgYnVmZmVyID0gbnVsbDsKKwkJCQkJLy8gRGVzY3JpYmVzIGxldmVsCisJCQkJCS8vIG9mIGRhdGEgd2UKKwkJCQkJLy8gYXJlIG5vdyBwcm9jZXNzaW5nIDogTEVWRUwwLCBMRVZFTDEsIG9yIExFVkVMMi4KKwkJCQkJaW50IGxldmVsID0gLTE7CisKKwkJCQkJLy8gUmVjb3JkIHRoZSBwcmV2aW91cyB0eXBlLgorCQkJCQlpbnQgb2xkbGV2ZWwgPSBsZXZlbCAtIDE7CisKKwkJCQkJLy8gVXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgc2ltcGxlIHBvbHlnb24gYW5kIGlzbGFuZHMKKwkJCQkJLy8gb2YgcG9seWdvbnMuIEluaXRpYWxpemUgc3RyaW5nIHRvIHRoZSBibGFuayBjaGFyYWN0ZXIuCisJCQkJCVN0cmluZyBpc2xhbmQgPSAiICI7IC8vJE5PTi1OTFMtMSQKKworCQkJCQl3aGlsZSAoR2VuVXRpbHMuRU9GKGJ1ZmZlciA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSB0cnVlKSB7CisKKwkJCQkJCWxpbmVDb3VudGVyKys7CisKKwkJCQkJCS8vIFRoZSBkYXRhIHdlIHdhbnQgdG8gd3JpdGUgdG8gdGhlIG5ldyBHTUwgZmlsZS4KKwkJCQkJCVN0cmluZyBvdXRwdXQgPSAiICI7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgd2UgbWFyayBhbGwgdW5rbm93biBkYXRhLgorCQkJCQkJYnVmZmVyID0gYnVmZmVyLnJlcGxhY2UoIiwsIiwgIixVTktOT1dOLCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCQkJLy8gV2UgdGFrZSBhIGNodW5rIG9mIHRoZSBkYXRhIFtCVUZGRVJfTUlOLEJVRkZFUl9NQVhdCisJCQkJCQkvLyB0byBtYWtlIHByb2Nlc3NzaW5nIG1vcmUKKwkJCQkJCS8vIGVmZmljaWVudCwgd2UgZG9udCBuZWVkIGFsbCBvZiBpdC4KKwkJCQkJCWludCBCVUZGRVJfTUlOID0gMDsKKwkJCQkJCWludCBCVUZGRVJfTUFYID0gMTI1OworCisJCQkJCQlTdHJpbmdbXSBpdGVtcyA9IEdlblV0aWxzCisJCQkJCQkJCS5leHRyYWN0KGJ1ZmZlci5sZW5ndGgoKSA8IEJVRkZFUl9NQVggPyBidWZmZXIKKwkJCQkJCQkJCQk6IGJ1ZmZlci5zdWJzdHJpbmcoQlVGRkVSX01JTiwKKwkJCQkJCQkJCQkJCUJVRkZFUl9NQVgpKTsKKworCQkJCQkJLy8gR2V0IHRoZSBjb3VudHJ5IG5hbWUKKwkJCQkJCVN0cmluZyBjb3VudHJ5ID0gaXRlbXNbSVNPRGF0YS5DT1VOVFJZX05BTUVdOworCisJCQkJCQkvLyBHZXQgdGhlIElTTzMxNjYtMSBpbmZvIGZvciB0aGlzIGNvdW50cnkKKwkJCQkJCWlmIChpc29Db2RlID09IG51bGwpIHsKKwkJCQkJCQlpc29Db2RlID0gR2VuVXRpbHMuZ2V0SVNPQ29kZShjb3VudHJ5LCBjb2RlTGlzdCk7CisJCQkJCQl9CisKKwkJCQkJCS8vIEdldCB0aGUgdHlwZSBvZiB0aGUgZGF0YSB3ZSBhcmUgcHJvY2Vzc2luZy4KKwkJCQkJCWxldmVsID0gR2VuVXRpbHMuZ2V0TGV2ZWwoaXRlbXMpOworCisJCQkJCQlpZiAobGV2ZWwgIT0gMCAmJiBpc28yTGlzdCAhPSBudWxsKSB7CisJCQkJCQkJLy8gTG9hZCB0aGUgSVNPIDMxNjYtMiBvYmplY3RzIGZvciB0aGlzIGNvdW50cnkKKwkJCQkJCQlpc28yTGlzdCA9IEdlblV0aWxzLmxvYWRJU08yKGlzbzMxNjZfMik7CisJCQkJCQl9CisKKwkJCQkJCS8vIFRoaXMgdmFyaWFibGUgaW5kaWNhdGVzIGEgdHJhbnNpdGlvbiBpbiBvdXIgZGF0YQorCQkJCQkJLy8gcHJvY2Vzc2luZworCQkJCQkJYm9vbGVhbiB0cmFuc2l0aW9uID0gKGxldmVsICE9IG9sZGxldmVsKSA/IHRydWUgOiBmYWxzZTsKKworCQkJCQkJLy8gVGhlIGN1cnJlbnQgZW50aXR5IHdlIGFyZSBkZWFsaW5nIHdpdGguCisJCQkJCQkvLyBCYXNlZCBvbiBpdHMgYWRtaW4gbGV2ZWwgaXQgY2FuIGJlIGEgY291bnRyeSwgYQorCQkJCQkJLy8gY291bnR5LCBldGM7CisJCQkJCQlTdHJpbmcgY3VycmVudCA9IG51bGw7CisKKwkJCQkJCS8vIERlc2NyaXB0b3IgZm9yIGN1cnJlbnQgZW50cnkuCisJCQkJCQlTdHJpbmcgZGVzY3JpcHRvciA9IG51bGw7CisKKwkJCQkJCWlmICh0cmFuc2l0aW9uID09IHRydWUpIHsKKwkJCQkJCQkvLyBLZWVwIHRyYWNrIG9mIHByZXZpb3VzIGxldmVsIGluIG9yZGVyIHRvIGRldGVjdAorCQkJCQkJCS8vIHRyYW5zaXRpb25zLgorCQkJCQkJCW9sZGxldmVsID0gbGV2ZWw7CisKKwkJCQkJCQkvLyBSZXNldCBjb3VudGVyIG9mIFVOS05PV04gYW5kIE4uQS4gZW50cmllcy4KKwkJCQkJCQl1bmtDb3VudGVyID0gMTsKKwkJCQkJCQkvLyBDbG9zZSB0aGUgcHJldmlvdXMgZmlsZQorCQkJCQkJCWlmIChnbWxGaWxlICE9IG51bGwpIHsKKwkJCQkJCQkJb3V0cHV0ID0gY2xvc2VQb2x5Z29uSXNsYW5kVGFncygpOworCQkJCQkJCQlvdXRwdXQgKz0gZ2V0Q2xvc2luZ1RhZ3MoKTsKKwkJCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShnbWxGaWxlLCBvdXRwdXQpOworCQkJCQkJCQlnbWxGaWxlLmNsb3NlKCk7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gQ2xlYXIgdGhlIGxpc3Qgb2YgdW5pcXVlIHBvbHlnb25zCisJCQkJCQkJaWYgKHBvbHlnb25zICE9IG51bGwpIHsKKwkJCQkJCQkJcG9seWdvbnMuY2xlYXIoKTsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBHZXQgYSBuZXcsIGVtcHR5IHBvbHlnb24gbGlzdAorCQkJCQkJCXBvbHlnb25zID0gbmV3IEFycmF5TGlzdDxTVEVNUG9seWdvbj4oKTsKKworCQkJCQkJCS8vIElmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgZm9yIHRoaXMgY291bnRyeSwKKwkJCQkJCQkvLyBjcmVhdGUgaXQgdXNpbmcgSVNPIGFscGhhMyBjb2RlLgorCQkJCQkJCUZpbGUgY291bnRyeURpciA9IG5ldyBGaWxlKG91dHB1dERpcgorCQkJCQkJCQkJKyBpc29Db2RlLmdldEFscGhhMygpKTsKKworCQkJCQkJCWlmIChjb3VudHJ5RGlyICE9IG51bGwKKwkJCQkJCQkJCSYmIGNvdW50cnlEaXIuZXhpc3RzKCkgPT0gZmFsc2UpIHsKKwkJCQkJCQkJLy8gRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBDcmVhdGUgaXQuCisJCQkJCQkJCWNvdW50cnlEaXIubWtkaXIoKTsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBDcmVhdGUgdGhlIGZpbGUgbmFtZSBmb3IgdGhlIG5ldworCQkJCQkJCS8vIEdNTCBmaWxlLgorCQkJCQkJCWZpbGVOYW1lID0gY291bnRyeURpciArICJcXCIgKyBpc29Db2RlLmdldEFscGhhMygpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCSsgIl8iICsgbGV2ZWwgKyAiX01BUC54bWwiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCQkJCS8vIFJlc2V0IHRoZSBwcmV2aW91cyBlbnRpdHkKKwkJCQkJCQlpc2xhbmQgPSAiICI7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJCS8vIE9wZW4gdGhlIHdyaXRlciBmb3IgdGhlIG5ldyBHTUwgZmlsZQorCQkJCQkJCWdtbEZpbGUgPSBHZW5VdGlscy5vcGVuV3JpdGVyKGZpbGVOYW1lKTsKKworCQkJCQkJCS8vIEFkZCB0aGUgaGVhZGVyIG9mIHRoZSBmaWxlCisJCQkJCQkJb3V0cHV0ID0gZ2V0T3BlbmluZ1RhZ3MoaXNvQ29kZSwgbGV2ZWwpOworCisJCQkJCQkJLy8gV3JpdGUgZGF0YQorCQkJCQkJCUdlblV0aWxzLmFkZERhdGEoZ21sRmlsZSwgb3V0cHV0LnRyaW0oKSk7CisKKwkJCQkJCX0gLy8gaWYoIHRyYW5zaXRpb24gPT0gdHJ1ZSApCisKKwkJCQkJCXN3aXRjaCAobGV2ZWwpIHsKKworCQkJCQkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMDoKKwkJCQkJCQljdXJyZW50ID0gaXNvQ29kZS5nZXRBbHBoYTMoKTsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMToKKwkJCQkJCQljdXJyZW50ID0gaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0udG9VcHBlckNhc2UoKQorCQkJCQkJCQkJLnRyaW0oKTsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMjoKKwkJCQkJCQljdXJyZW50ID0gaXRlbXNbSVNPRGF0YS5BRE1JTjJfTkFNRV0udG9VcHBlckNhc2UoKQorCQkJCQkJCQkJLnRyaW0oKTsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJfSAvLyBzd2l0Y2gKKworCQkJCQkJLy8gSGFuZGxlIFVOS05PV04gYW5kIE4uQS4gZW50cmllcyBkaWZmZXJlbnRseS4KKwkJCQkJCWlmIChjdXJyZW50LmVxdWFscygiVU5LTk9XTiIpIHx8IGN1cnJlbnQuZXF1YWxzKCJOLkEuIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQkJCQlpZiAobGV2ZWwgPT0gMSkgeworCQkJCQkJCQljdXJyZW50ID0gaXNvQ29kZS5nZXRBbHBoYTIoKSArICItVU5LLSIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgU3RyaW5nLnZhbHVlT2YodW5rQ291bnRlcisrKTsKKworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8vIExldmVsIDIgZGF0YS4KKwkJCQkJCQkJY3VycmVudCA9IGlzb0NvZGUuZ2V0QWxwaGEzKCkgKyAiLkwyLiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgU3RyaW5nLnZhbHVlT2YodW5rQ291bnRlcisrKTsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCS8vIFdlIGdldCB0aGUgZGVzY3JpcHRvciBmb3IgYWRtaW5pc3RyYXRpb24gZW50aXRpZXMKKwkJCQkJCS8vIGRpZmZlcmVudGx5IGJhc2VkIG9uIGl0cyBsZXZlbC4KKworCQkJCQkJaWYgKGxldmVsID09IDIpIHsKKworCQkJCQkJCWlmIChsZXgxRGF0YVNldCA9PSBudWxsICYmIGxleDJEYXRhU2V0ID09IG51bGwpIHsKKworCQkJCQkJCQkvLyBDb21wb3NlIHRoZSBmaWxlIG5hbWVzIGZvciB0aGUgbGV4IGZpbGVzIGZvcgorCQkJCQkJCQkvLyB0aGlzCisJCQkJCQkJCS8vIGNvdW50cnkuCisJCQkJCQkJCWxleEFkbWluMUZpbGUgPSBsZXhEaXIgKyBpc29Db2RlLmdldEFscGhhMygpCisJCQkJCQkJCQkJKyAiXFwiICsgaXNvQ29kZS5nZXRBbHBoYTMoKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlsZXhBZG1pbjJGaWxlID0gbGV4QWRtaW4xRmlsZTsKKwkJCQkJCQkJbGV4QWRtaW4xRmlsZSArPSAiX0FETUlOMV9MRVgudHh0IjsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlsZXhBZG1pbjJGaWxlICs9ICJfQURNSU4yX0xFWC50eHQiOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCQkJLy8gTG9hZCB0aGUgbGV4MSBhbmQgbGV4MiBmaWxlcyBmb3IgdGhpcworCQkJCQkJCQkvLyBjb3VudHJ5LgorCQkJCQkJCQlsZXgxRGF0YVNldCA9IEdlblV0aWxzCisJCQkJCQkJCQkJLnBvcHVsYXRlTGlzdChsZXhBZG1pbjFGaWxlKTsKKwkJCQkJCQkJbGV4MkRhdGFTZXQgPSBHZW5VdGlscworCQkJCQkJCQkJCS5wb3B1bGF0ZUxpc3QobGV4QWRtaW4yRmlsZSk7CisKKwkJCQkJCQkJLy8gQ3JlYXRlIGEgbWV0aG9kIHRvIHNlYXJjaCBmb3IgYW4gaXRlbSBvbiBhCisJCQkJCQkJCS8vIGxpc3Qgb2YgbGV4IGRhdGEgb2JqZWN0cy4KKwkJCQkJCQkJbGV4MUxpc3QgPSBHZW5VdGlscy5jcmVhdGVMZXgxTGlzdChsZXgxRGF0YVNldCk7CisJCQkJCQkJCWxleDJMaXN0ID0gR2VuVXRpbHMuY3JlYXRlTGV4Mkxpc3QobGV4MkRhdGFTZXQpOworCisJCQkJCQkJfQorCisJCQkJCQkJLy8gQ29tcG9zZSB0aGUgbGV2ZWwyIGRlc2NyaXB0b3IgdXNpbmcgdGhlIGxleCBkYXRhOgorCisJCQkJCQkJLy8gU1RFUCAxOiBEbyBhIGxvb2sgdXAgaW4gdGhlIGxleCAyIGxpc3RzLgorCisJCQkJCQkJLy8gR2V0IHRoZSBsZXggMiBvYmplY3QgZm9yIHRoZSBjdXJyZW50IGVudHJ5LgorCQkJCQkJCUxleDJPYmogbGV4MkN1cnJlbnQgPSBHZW5VdGlscy5sZXgyTG9va3VwKGxleDJMaXN0LAorCQkJCQkJCQkJaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0sIGN1cnJlbnQpOworCisJCQkJCQkJLy8gR2V0IHRoZSBsZXggMSBvYmplY3QgdG8gd2hpY2ggbGV4MkN1cnJlbnQgYmVsb25ncworCQkJCQkJCS8vIHRvLgorCQkJCQkJCUxleDFPYmogbGV4MUN1cnJlbnQgPSBHZW5VdGlscy5sZXgxTG9va3VwKGxleDFMaXN0LAorCQkJCQkJCQkJbGV4MkN1cnJlbnQuZ2V0QWRtaW4xKCkpOworCisJCQkJCQkJaWYgKGxleDFDdXJyZW50LmdldERlc2NyaXB0b3IoKS5jb250YWlucygiVVMtIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkvLyBTVEVQIDI6IHBpZWNlIHRvZ2V0aGVyIHRoZSBJRCB1c2luZyB0aGUKKwkJCQkJCQkJLy8gcHJvcGVyIGxleCBvYmplY3RzIDogdGhlIFVTQSBpcyBhIHNwZWNpYWwKKwkJCQkJCQkJLy8gY2FzZQorCQkJCQkJCQlkZXNjcmlwdG9yID0gR2VuVXRpbHMuZ2V0VVNBRGVzY3JpcHRvcigKKwkJCQkJCQkJCQlsZXgyQ3VycmVudC5nZXRBZG1pbjIoKSwgR2VuVXRpbHMKKwkJCQkJCQkJCQkJCS5leHRyYWN0QWxwaGEyKGxleDFDdXJyZW50CisJCQkJCQkJCQkJCQkJCS5nZXREZXNjcmlwdG9yKCkpLAorCQkJCQkJCQkJCXVzYURlc2NyaXB0b3JMaXN0KTsKKworCQkJCQkJCQlpZiAoZGVzY3JpcHRvci5jb250YWlucygiTm90IEZvdW5kIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJU3lzdGVtLm91dAorCQkJCQkJCQkJCQkucHJpbnRsbigiXHRcdERlc2NyaXB0b3IgTm90IEZvdW5kIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJCQkJKyBsZXgyQ3VycmVudC5nZXRBZG1pbjIoKQorCQkJCQkJCQkJCQkJCSsgImluIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJCQkJKyBsZXgxQ3VycmVudC5nZXRBZG1pbjEoKSk7CisJCQkJCQkJCX0KKworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8vIFNURVAgMjogcGllY2UgdG9nZXRoZXIgdGhlIElEIHVzaW5nIHRoZQorCQkJCQkJCQkvLyBwcm9wZXIgbGV4IG9iamVjdHMuCisJCQkJCQkJCWRlc2NyaXB0b3IgPSBsZXgxQ3VycmVudC5nZXREZXNjcmlwdG9yKCkKKwkJCQkJCQkJCQkrICItRyIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgbGV4MUN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXgoKQorCQkJCQkJCQkJCSsgbGV4MkN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXgoKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoY3VycmVudC5jb250YWlucygiLkwyLiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJY3VycmVudCA9IGRlc2NyaXB0b3I7CisJCQkJCQkJfQorCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIENvbXBvc2UgZGVzY3JpcHRvciBmb3IgbCAxIGFuZCBsIDAgZGF0YQorCQkJCQkJCS8vIEdldCB0aGUgZGVzY3JpcHRvciBmb3IgdGhpcyBlbnRpdHkuCisJCQkJCQkJZGVzY3JpcHRvciA9IEdlblV0aWxzLmdldElTTzJEZXNjcmlwdG9yKGlzbzJMaXN0LAorCQkJCQkJCQkJY3VycmVudCwgaXNvQ29kZS5nZXRBbHBoYTIoKSk7CisKKwkJCQkJCQkvLyBJZiB3ZSBjYW50IGZpbmQgdGhlIGRlc2NyaXB0b3IsIHRoZW4gbG9vayBpbiB0aGUKKwkJCQkJCQkvLyBmaXggbGlzdC4KKwkJCQkJCQlpZiAoZGVzY3JpcHRvci5lcXVhbHMoY3VycmVudCkgPT0gdHJ1ZSkgeworCQkJCQkJCQkvLyBMb29rIGZvciBhIGRlc2NyaXB0b3IgaW4gdGhlIGZpeCBmaWxlCisJCQkJCQkJCWRlc2NyaXB0b3IgPSBHZW5VdGlscy5nZXRGaXhDb2RlKGNvZGVmaXhMaXN0LAorCQkJCQkJCQkJCWN1cnJlbnQsIGl0ZW1zW0lTT0RhdGEuQ09VTlRSWV9OQU1FXSk7CisJCQkJCQkJfQorCisJCQkJCQl9CisKKwkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRGVzY3JpcHRvciBpcyA6ICIgKyBkZXNjcmlwdG9yCisJCQkJCQkvLyArICIgYXQgbGV2ZWwgOiAiICsgbGV2ZWwgKyAiIGZvciAiICsgY3VycmVudCk7CisKKwkJCQkJCS8vIENyZWF0ZSBhIFNURU0gcG9seWdvbiB3aXRoIHRoaXMgcG9seWdvbiBkYXRhCisJCQkJCQlTVEVNUG9seWdvbiBwb2x5Z29uID0gbmV3IFNURU1Qb2x5Z29uKGJ1ZmZlciwgbGV2ZWwpOworCisJCQkJCQkvLyBDaGVjayB0aGF0IHRoaXMgaXMgaW5kZWVkIGEgU1RFTSBwb2x5Z29uCisJCQkJCQlpZiAoaXNQb2x5Z29uKHBvbHlnb24pICE9IHRydWUpIHsKKwkJCQkJCQkvLyBOb3QgYSBwb2x5Z29uLCBpZ25vcmUuCisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisKKwkJCQkJCS8vIFdlIGtub3cgaXQgaXMgYSBwb2x5Z29uLCBidXQgbm93IGNoZWNrIHRoYXQgaXRzIG5vdAorCQkJCQkJLy8gZHVwbGljYXRlZC4KKwkJCQkJCWlmIChpc1BvbHlnb25EdXBsaWNhdGVkKHBvbHlnb25zLml0ZXJhdG9yKCksIHBvbHlnb24pID09IHRydWUpIHsKKwkJCQkJCQkvLyBZZXMsIGl0IGlzIGR1cGxpY2F0ZWQKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKworCQkJCQkJLy8gQWRkIHRoaXMgcG9seWdvbiB0byBvdXIgbGlzdCBvZiB1bmlxdWUgcG9seWdvbnMgc28KKwkJCQkJCS8vIHRoYXQgd2UgY2FuIGNoZWNrIGR1cGxpY2F0ZXMgb2YgdGhpcyBwb2x5Z29uIGxhdGVyLgorCQkJCQkJcG9seWdvbnMuYWRkKHBvbHlnb24pOworCisJCQkJCQkvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBwb2x5Z29uIGlzIHBhcnQgb2YgYW4gaXNsYW5kIG9mCisJCQkJCQkvLyBwb2x5Z29ucyBvciBhIHNpbXBsZSBwb2x5Z29uIGFuZCBoYW5kbGUgaXQKKwkJCQkJCS8vIGFjY29yZGluZ2x5LgorCQkJCQkJaWYgKGxldmVsID09IDApIHsKKwkJCQkJCQkvLyBJZiB3ZSBhcmUgYXQgYWRtaW4gbGV2ZWwgMCBhbmQgaXNsYW5kIGlzIG5vdAorCQkJCQkJCS8vIE5VTEwsIHRoZW4gd2UgaGF2ZSBhbiBpc2xhbmQuCisJCQkJCQkJaWYgKGlzbGFuZC5lcXVhbHMoIiAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQkJCW91dHB1dCA9IG9wZW5Qb2x5Z29uSXNsYW5kVGFncyhkZXNjcmlwdG9yKTsKKwkJCQkJCQkJaXNsYW5kID0gIkFkbWluIExldmVsIDAiOyAvLyROT04tTkxTLTEkCisJCQkJCQkJfQorCQkJCQkJCW91dHB1dCArPSBhZGRMaW5lYXJSaW5nVGFncyhidWZmZXIsIGxldmVsKTsKKwkJCQkJCX0gZWxzZSB7CisKKwkJCQkJCQlpZiAoaXNsYW5kLmVxdWFscygiICIpID09IHRydWUpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlvdXRwdXQgPSBvcGVuUG9seWdvbklzbGFuZFRhZ3MoZGVzY3JpcHRvcik7CisJCQkJCQkJCW91dHB1dCArPSBhZGRMaW5lYXJSaW5nVGFncyhidWZmZXIsIGxldmVsKTsKKworCQkJCQkJCX0gZWxzZSB7CisKKwkJCQkJCQkJaWYgKGN1cnJlbnQuZXF1YWxzKGlzbGFuZCkgPT0gZmFsc2UpIHsKKwkJCQkJCQkJCW91dHB1dCA9IGNsb3NlUG9seWdvbklzbGFuZFRhZ3MoKTsKKwkJCQkJCQkJCW91dHB1dCArPSBvcGVuUG9seWdvbklzbGFuZFRhZ3MoZGVzY3JpcHRvcik7CisJCQkJCQkJCQlvdXRwdXQgKz0gYWRkTGluZWFyUmluZ1RhZ3MoYnVmZmVyLCBsZXZlbCk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlvdXRwdXQgPSBhZGRMaW5lYXJSaW5nVGFncyhidWZmZXIsIGxldmVsKTsKKwkJCQkJCQkJCUdlblV0aWxzLmFkZERhdGEoZ21sRmlsZSwgb3V0cHV0LnRyaW0oKSk7CisJCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCXN3aXRjaCAobGV2ZWwpIHsKKworCQkJCQkJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzE6CisJCQkJCQkJCWlzbGFuZCA9IGl0ZW1zW0lTT0RhdGEuQURNSU4xX05BTUVdCisJCQkJCQkJCQkJLnRvVXBwZXJDYXNlKCk7CisJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMjoKKwkJCQkJCQkJaXNsYW5kID0gaXRlbXNbSVNPRGF0YS5BRE1JTjJfTkFNRV0KKwkJCQkJCQkJCQkudG9VcHBlckNhc2UoKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCisJCQkJCQl9CisKKwkJCQkJCUdlblV0aWxzLmFkZERhdGEoZ21sRmlsZSwgb3V0cHV0LnRyaW0oKSk7CisKKwkJCQkJfSAvLyB3aGlsZSBsb29wCisKKwkJCQkJLy8gUmVzZXQgYWxsIGxleC1yZWxhdGVkIGl0ZW1zCisJCQkJCWlmIChsZXgxRGF0YVNldCAhPSBudWxsKSB7CisJCQkJCQlsZXgxRGF0YVNldC5jbGVhcigpOworCQkJCQkJbGV4MURhdGFTZXQgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgyRGF0YVNldCAhPSBudWxsKSB7CisJCQkJCQlsZXgyRGF0YVNldC5jbGVhcigpOworCQkJCQkJbGV4MkRhdGFTZXQgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgxTGlzdCAhPSBudWxsKSB7CisJCQkJCQlsZXgxTGlzdC5jbGVhcigpOworCQkJCQkJbGV4MUxpc3QgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgyTGlzdCAhPSBudWxsKSB7CisJCQkJCQlsZXgyTGlzdC5jbGVhcigpOworCQkJCQkJbGV4Mkxpc3QgPSBudWxsOworCQkJCQl9CisJCQkJCWxleEFkbWluMUZpbGUgPSBudWxsOworCQkJCQlsZXhBZG1pbjJGaWxlID0gbnVsbDsKKworCQkJCQkvLyBXZSBkb250IG5lZWQgdGhlIElTTyBjb2RlIG9iamVjdCBmb3IgdGhpcyBjb3VudHJ5CisJCQkJCS8vIGFueW1vcmUsIHdlIGFyZSBkb25lIHByb2Nlc3NpbmcgaXQuCisJCQkJCWlzb0NvZGUgPSBudWxsOworCisJCQkJCS8vIENsb3NlIGFsbCBvcGVuIHJlc291cmNlcy4KKwkJCQkJcmVhZGVyLmNsb3NlKCk7CisKKwkJCQkJaWYgKGdtbEZpbGUgIT0gbnVsbCkgeworCQkJCQkJLy8gV3JpdGUgZm9ybWF0dGVkIG91dHB1dAorCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShnbWxGaWxlLCBjbG9zZVBvbHlnb25Jc2xhbmRUYWdzKCkpOworCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShnbWxGaWxlLCBnZXRDbG9zaW5nVGFncygpKTsKKwkJCQkJCWdtbEZpbGUuY2xvc2UoKTsKKwkJCQkJCWdtbEZpbGUgPSBudWxsOworCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0R2VuZXJhdGVkIDogIiArIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJZmlsZU5hbWUgPSBudWxsOworCQkJCQl9CisKKwkJCQkJLy8gUnVuIGdhcmJhZ2UgY29sbGVjdGlvbgorCQkJCQkvL1N5c3RlbS5nYygpOworCQkJCX0KKworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisKKwkJfQorCisJfQorCisJLyoqCisJICogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSByZWFsIHBvbHlnb24gKGkuZS4gY2xvc2VkKQorCSAqIAorCSAqIEBwYXJhbSBwb2x5Z29uCisJICogICAgICAgICAgICBBIFNURU0gcG9seWdvbgorCSAqIAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFyYW1ldGVyICJwb2x5Z29uIiBpcyBhIFNURU0gcG9seWdvbgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzUG9seWdvbihTVEVNUG9seWdvbiBwb2x5Z29uKSB7CisKKwkJUG9pbnREYXRhIGluaXQgPSBwb2x5Z29uLmdldEluaXQoKTsKKwkJUG9pbnREYXRhIGxhc3QgPSBwb2x5Z29uLmdldExhc3QoKTsKKworCQlpZiAoaW5pdC5nZXRMdCgpICE9IGxhc3QuZ2V0THQoKSkgeworCQkJLy8gTm90IGEgcG9seWdvbgorCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKGluaXQuZ2V0TGcoKSAhPSBsYXN0LmdldExnKCkpIHsKKwkJCS8vIE5vdCBhIHBvbHlnb24KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8vIFllcywgaXQgaXMgYSBwb2x5Z29uCisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIENoZWNrIHRvIHNlZSBpZiB0aGlzIHBvbHlnb24gaXMgZHVwbGljYXRlZC4KKwkgKiAKKwkgKiBAcGFyYW0gcG9seWdvbgorCSAqICAgICAgICAgICAgYSBTVEVNIHBvbHlnb24KKwkgKiBAcGFyYW0gaXQKKwkgKiAgICAgICAgICAgIGFuIGl0ZXJhdG9yIG9uIHRoZSBwb2x5Z29uIGxpc3QKKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBwb2x5Z29uIGlzIGFscmVhZHkgaW4gdGhlIGxpc3Qgb2Yga25vd24gcG9seWdvbnMKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BvbHlnb25EdXBsaWNhdGVkKEl0ZXJhdG9yIGl0LCBTVEVNUG9seWdvbiBwb2x5Z29uKSB7CisKKwkJaWYgKGl0Lmhhc05leHQoKSAhPSB0cnVlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQlTVEVNUG9seWdvbiBjdXJyZW50ID0gKFNURU1Qb2x5Z29uKSBpdC5uZXh0KCk7CisJCQlpZiAoY3VycmVudC5zYW1lKHBvbHlnb24pID09IHRydWUpIHsKKwkJCQkvLyBOb3QgdW5pcXVlLCBpdCBpcyBkdXBsaWNhdGVkIHNvIGNvbmRpdGlvbiBpcyBmYWxzZS4KKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgY3JlYXRlcyB0aGUgb3BlbmluZyBYTUwgdGFncyB0aGF0IGRlYWwgd2l0aCBpc2xhbmRzIG9mCisJICogcG9seWdvbiBkYXRhLgorCSAqIAorCSAqIEBwYXJhbSBpZAorCSAqICAgICAgICAgICAgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBlbnRpdHkKKwkgKiAKKwkgKiBAcmV0dXJuIGEgR01MIHRhZyB0aGF0IG9wZW5zIGEgcG9seWdvbiBpc2xhbmQgZWxlbWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG9wZW5Qb2x5Z29uSXNsYW5kVGFncyhTdHJpbmcgaWQpIHsKKworCQlTdHJpbmcgdGFncyA9IG51bGw7CisJCXRhZ3MgPSAiPGdtbDpQb2x5Z29uIGdtbDppZD1cIiIgKyBpZCArICJcIj5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl0YWdzICs9ICI8Z21sOm91dGVyQm91bmRhcnlJcz5cbiI7IC8vJE5PTi1OTFMtMSQKKworCQlyZXR1cm4gdGFnczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIHRoZSB0YWdzIHRoYXQgZGVzY3JpYmUgYSAicG9seWdvbiBpc2xhbmQiIG9yIGxpbmVhcgorCSAqIHJpbmcgYW5kIHB1dHMgdGhlIHBvbHlnb24gZGF0YSBpbnNpZGUgb2YgaXQuCisJICogCisJICogQHBhcmFtIGJ1ZmZlcgorCSAqICAgICAgICAgICAgdGhlIGRhdGEgYnVmZmVyIGNvbnRhaW5pbmcgYWxsIHRoZSBwb2x5Z29uZCBkYXRhCisJICogQHBhcmFtIGxldmVsCisJICogICAgICAgICAgICB0aGUgYWRtaW4gbGV2ZWwKKwkgKiAKKwkgKiBAcmV0dXJuIGEgR01MIHRhZyB0aGF0IG9wZW4gYSBsaW5lYXIgcmluZyBlbGVtZW50CisJICovCisJcHJvdGVjdGVkIFN0cmluZyBhZGRMaW5lYXJSaW5nVGFncyhTdHJpbmcgYnVmZmVyLCBpbnQgbGV2ZWwpIHsKKworCQlpbnQgb2Zmc2V0ID0gMDsKKworCQlTdHJpbmcgcG9seWdvbkRhdGEgPSBudWxsOworCisJCXN3aXRjaCAobGV2ZWwpIHsKKworCQljYXNlIERhdGFUeXBlcy5MRVZFTF8wOgorCQkJb2Zmc2V0ID0gMjsKKwkJCWJyZWFrOworCisJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzE6CisJCQlvZmZzZXQgPSAzOworCQkJYnJlYWs7CisKKwkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMjoKKwkJCW9mZnNldCA9IDQ7CisJCQlicmVhazsKKwkJfQorCisJCS8vIFRva2VuaXplCisJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJ1ZmZlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEFkdmFuY2UgdGhlIGZpcnN0IEstdG9rZW5zLgorCQlmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldDsgaSsrKSB7CisJCQlpZiAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworCQkJCXRva2Vucy5uZXh0VG9rZW4oKTsKKwkJCX0KKwkJfQorCisJCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7CisKKwkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKKworCQkJaWYgKEdlblV0aWxzLmlzTnVtZXJpYyh0b2tlbikgPT0gZmFsc2UpIHsKKwkJCQljb250aW51ZTsgLy8gSWdub3JlLCB0aGlzIGlzIG5vdCBhIHZhbGlkIGNvb3JkaW5hdGUuCisJCQl9CisKKwkJCS8vIENvbnZlcnQgdG9rZW4gKHBvbHlnb24gZGF0YSkgdG8gYW4gaW50LgorCQkJZG91YmxlIGNvb3JkID0gR2VuVXRpbHMudG9EZWdyZWVzKEdlblV0aWxzLmdldERvdWJsZSh0b2tlbikpOworCisJCQkvLyBGb3JtYXQgbHQsIGxnIHZhbHVlcyBhY2NvcmRpbmcgdG8gb3VyIGNvbnZlbnRpb24KKwkJCWlmIChwb2x5Z29uRGF0YSA9PSBudWxsKSB7CisJCQkJcG9seWdvbkRhdGEgPSBHZW5VdGlscy5mb3JtYXQoY29vcmQpICsgIiAiOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCXBvbHlnb25EYXRhICs9IEdlblV0aWxzLmZvcm1hdChjb29yZCkgKyAiICI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCisJCVN0cmluZyB0YWdzID0gIjxnbWw6TGluZWFyUmluZz5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSAiPGdtbDpwb3NMaXN0PlxuIjsgLy8kTk9OLU5MUy0xJAorCQl0YWdzICs9IHBvbHlnb25EYXRhICsgIlxuIjsgLy8kTk9OLU5MUy0xJAorCQl0YWdzICs9ICI8L2dtbDpwb3NMaXN0PlxuIjsgLy8kTk9OLU5MUy0xJAorCQl0YWdzICs9ICI8L2dtbDpMaW5lYXJSaW5nPlxuIjsgLy8kTk9OLU5MUy0xJAorCisJCXJldHVybiB0YWdzOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgdGhlIGNsb3NpbmcgWE1MIHRhZ3MgdGhhdCBkZWFsIHdpdGggaXNsYW5kcyBvZgorCSAqIHBvbHlnb24gZGF0YS4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgR01MIHRhZyB0aGF0IGNsb3NlcyBhIHBvbHlnb24KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGNsb3NlUG9seWdvbklzbGFuZFRhZ3MoKSB7CisKKwkJU3RyaW5nIHRhZ3MgPSBudWxsOworCQl0YWdzID0gIjwvZ21sOm91dGVyQm91bmRhcnlJcz5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSAiPC9nbWw6UG9seWdvbj5cbiI7IC8vJE5PTi1OTFMtMSQKKworCQlyZXR1cm4gdGFnczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIHRoZSBYTUwgdGFncyB0aGF0IGRlYWwgd2l0aCBzaW1wbGUgcG9seWdvbiBkYXRhIGFuZAorCSAqIGluY2x1ZGVzIHRoZSBwb2x5Z29uIGRhdGEgaW4gaXQuCisJICogCisJICogQHBhcmFtIGJ1ZmZlcgorCSAqICAgICAgICAgICAgdGhlIGRhdGEgYnVmZmVyIGNvbnRhaW5pbmcgYWxsIHRoZSBwb2x5Z29uIGRhdGEKKwkgKiBAcGFyYW0gbGV2ZWwKKwkgKiAgICAgICAgICAgIHRoZSBhZG1pbiBsZXZlbAorCSAqIAorCSAqIEByZXR1cm4gYSBHTUwgdGFnIHRoYXQgZGVzY3JpYmVzIGEgcG9seWdvbgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgY3JlYXRlU2ltcGxlUG9seWdvblRhZ3MoU3RyaW5nIGlkLCBTdHJpbmcgYnVmZmVyLCBpbnQgbGV2ZWwpIHsKKworCQlpbnQgb2Zmc2V0ID0gMDsKKworCQlTdHJpbmcgcG9seWdvbkRhdGEgPSBudWxsOworCisJCXN3aXRjaCAobGV2ZWwpIHsKKworCQljYXNlIERhdGFUeXBlcy5MRVZFTF8wOgorCQkJb2Zmc2V0ID0gMjsKKwkJCWJyZWFrOworCisJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzE6CisJCQlvZmZzZXQgPSAzOworCQkJYnJlYWs7CisKKwkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMjoKKwkJCW9mZnNldCA9IDQ7CisJCQlicmVhazsKKwkJfQorCisJCS8vIFRva2VuaXplCisJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJ1ZmZlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEFkdmFuY2UgdGhlIGZpcnN0IEstdG9rZW5zLgorCQlmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldDsgaSsrKSB7CisJCQlpZiAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworCQkJCXRva2Vucy5uZXh0VG9rZW4oKTsKKwkJCX0KKwkJfQorCisJCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7CisKKwkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKKworCQkJaWYgKEdlblV0aWxzLmlzTnVtZXJpYyh0b2tlbikgPT0gZmFsc2UpIHsKKwkJCQljb250aW51ZTsgLy8gSWdub3JlLCB0aGlzIGlzIG5vdCBhIHZhbGlkIGNvb3JkaW5hdGUuCisJCQl9CisKKwkJCS8vIENvbnZlcnQgdG9rZW4gKHBvbHlnb24gZGF0YSkgdG8gYW4gaW50LgorCQkJZG91YmxlIGNvb3JkID0gR2VuVXRpbHMudG9EZWdyZWVzKEdlblV0aWxzLmdldERvdWJsZSh0b2tlbikpOworCisJCQkvLyBGb3JtYXQgbHQsIGxnIHZhbHVlcyBhY2NvcmRpbmcgdG8gb3VyIGNvbnZlbnRpb24KKwkJCWlmIChwb2x5Z29uRGF0YSA9PSBudWxsKSB7CisJCQkJcG9seWdvbkRhdGEgPSBHZW5VdGlscy5mb3JtYXQoY29vcmQpICsgIiAiOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCXBvbHlnb25EYXRhICs9IEdlblV0aWxzLmZvcm1hdChjb29yZCkgKyAiICI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCisJCVN0cmluZyB0YWdzID0gbnVsbDsKKworCQlpZiAocG9seWdvbkRhdGEgPT0gbnVsbCkgeworCQkJdGFncyA9ICI8Z21sOlBvbHlnb24gZ21sOmlkPVwiIiArIGlkICsgIlwiLz5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9IGVsc2UgeworCQkJdGFncyA9ICI8Z21sOlBvbHlnb24gZ21sOmlkPVwiIiArIGlkICsgIlwiPlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQl0YWdzICs9ICI8Z21sOm91dGVyQm91bmRhcnlJcz5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJCXRhZ3MgKz0gIjxnbWw6TGluZWFyUmluZz5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJCXRhZ3MgKz0gIjxnbWw6cG9zTGlzdD5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJCXRhZ3MgKz0gcG9seWdvbkRhdGEgKyAiXG4iOyAvLyROT04tTkxTLTEkCisJCQl0YWdzICs9ICI8L2dtbDpwb3NMaXN0PlxuIjsgLy8kTk9OLU5MUy0xJAorCQkJdGFncyArPSAiPC9nbWw6TGluZWFyUmluZz5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJCXRhZ3MgKz0gIjwvZ21sOm91dGVyQm91bmRhcnlJcz5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJCXRhZ3MgKz0gIjwvZ21sOlBvbHlnb24+XG4iOyAvLyROT04tTkxTLTEkCisJCX0KKworCQlyZXR1cm4gdGFnczsKKwl9CisKKwkvKioKKwkgKiBHZW5lcmF0ZSB0aGUgb3BlbmluZyB0YWdzIGZvciB0aGlzIEdNTCBmaWxlLgorCSAqIAorCSAqIEBwYXJhbSBjb2RlCisJICogICAgICAgICAgICB0aGUgSVNPIGNvZGUKKwkgKiBAcGFyYW0gbGV2ZWwKKwkgKiAgICAgICAgICAgIHRoZSBhZG1pbiBsZXZlbAorCSAqIAorCSAqIEByZXR1cm4gdGhlIG9wZW5pbmcgdGFncyBmb3IgdGhlIEdNTCBmaWxlCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRPcGVuaW5nVGFncyhJU09Db2RlMSBjb2RlLCBpbnQgbGV2ZWwpIHsKKworCQkvLyBDYWxlbmRhciBkYXRlID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKworCQlTdHJpbmcgdGFncyA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSBHZW5VdGlscy5nZUdNTENvcHlyaWdodCgpOworCQl0YWdzICs9IEdlblV0aWxzLmdldEdNTEtleUZvcm1hdEV4cGxhbmF0aW9uKCk7CisJCS8vIHRhZ3MgKz0gR2VuVXRpbHMuZ2V0R01MVU5Qb2xpY3koKTsKKwkJdGFncyArPSAiPE1hcCB4bWxuczpnbWw9XCJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbFwiIHhtbG5zOmdlb3Jzcz1cImh0dHA6Ly93d3cuZ2VvcnNzLm9yZy9nZW9yc3NcIj5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSAiPHRpdGxlPiIgKyBjb2RlLmdldEFscGhhMygpICsgIiBMZXZlbCAiICsgbGV2ZWwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJKyAiIE1hcDwvdGl0bGU+XG4iOyAvLyROT04tTkxTLTEkCisJCXRhZ3MgKz0gIjxzdWJUaXRsZT5BZG1pbmlzdHJhdGl2ZSBCb3VuZGFyaWVzPC9zdWJUaXRsZT5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSAiPHVwZGF0ZWQ+VHVlIE5vdiAwNyAxNjo1Nzo1NSBQU1QgMjAwNiA8L3VwZGF0ZWQ+XG4iOyAvLyROT04tTkxTLTEkCisJCXRhZ3MgKz0gIjxlbnRyeT5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSAiPGdlb3Jzczp3aGVyZT5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHRhZ3M7CisJfQorCisJLyoqCisJICogR2VuZXJhdGUgdGhlIGNsb3NpbmcgdGFncyBmb3IgdGhpcyBHTUwgZmlsZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjbG9zaW5nIHRhZ3Mgb2YgdGhlIEdNTCBmaWxlCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRDbG9zaW5nVGFncygpIHsKKwkJU3RyaW5nIHRhZ3MgPSAiPC9nZW9yc3M6d2hlcmU+XG4iOyAvLyROT04tTkxTLTEkCisJCXRhZ3MgKz0gIjwvZW50cnk+XG4iOyAvLyROT04tTkxTLTEkCisJCXRhZ3MgKz0gIjwvTWFwPlxuIjsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gdGFnczsKKwl9CisKKwkvKioKKwkgKiBUaGUgZXhlY3V0aW9uIGVudHJ5IHBvaW50CisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKi8KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJLy8gZmluYWwgaW50IElTT18zMTY2XzEgPSAwOworCQkvLyBmaW5hbCBpbnQgSVNPXzMxNjZfMiA9IDE7CisJCS8vIGZpbmFsIGludCBGSVhfRklMRSA9IDI7CisJCS8vIGZpbmFsIGludCBUQVJHRVRfTElTVCA9IDM7CisJCS8vIGZpbmFsIGludCBMRVhfRElSID0gNDsKKwkJLy8gZmluYWwgaW50IE9VVFBVVF9ESVIgPSA1OworCQkvLyBmaW5hbCBpbnQgUEFSQU1TID0gNjsKKwkJLy8KKwkJLy8gaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQKKwkJLy8gLnByaW50bG4oIlx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyA6ICIpOworCQkvLyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBJU08gMzE2Ni0xIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgSVNPIDMxNjYtMiBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IElTTyBmaXggZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBUYXJnZXQgY291bnRyaWVzIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgTGV4aWNvZ3JhcGhpYyBzb3J0aW5nIGRpcmVjdG9yeSIpOworCQkvLyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBPdXRwdXQgZGlyZWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gcmV0dXJuOworCQkvLyB9CisJCS8vCisJCS8vIEdNTEdlbmVyYXRvciBnZW4gPSBuZXcgR01MR2VuZXJhdG9yKGFyZ3NbSVNPXzMxNjZfMV0sCisJCS8vIGFyZ3NbSVNPXzMxNjZfMl0sCisJCS8vIGFyZ3NbRklYX0ZJTEVdLCBhcmdzW1RBUkdFVF9MSVNUXSwgYXJnc1tMRVhfRElSXSwKKwkJLy8gYXJnc1tPVVRQVVRfRElSXSk7CisJCS8vIGdlbi5ydW4oKTsKKworCQlmaW5hbCBpbnQgQ09ORklHX0ZJTEUgPSAwOworCQlmaW5hbCBpbnQgUEFSQU1TID0gMTsKKworCQlpZiAoYXJncy5sZW5ndGggPCBQQVJBTVMpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdC0tV3JvbmcgYXJndW1lbnRzLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRcdFRvIHJ1biwgcGxlYXNlIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhcmd1bWVudChzKSA6ICIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdCBDb25maWd1cmF0aW9uIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLmV4aXQoMSk7CisJCX0KKworCQlHTUxHZW5lcmF0b3IgZ2VuID0gbmV3IEdNTEdlbmVyYXRvcihhcmdzW0NPTkZJR19GSUxFXSk7CisKKwkJZ2VuLnJ1bigpOworCisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0dlbkNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9HZW5Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWRlY2NkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9HZW5Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDcwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBBIGdyb3VwIG9mIGNvbnN0YW50cyB0aGF0IGFwcGVhciByZXBlYXRlZGx5IGluIG1hbnkgb2YgdGhlIGRhdGEgZ2VuZXJhdG9ycy4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgR2VuQ29uc3RhbnRzIHsKKworCWZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSQU1TX0RJUiA9ICJvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcXHBhcmFtZXRlcnNcXCI7IC8vJE5PTi1OTFMtMSQKKworCWZpbmFsIHN0YXRpYyBTdHJpbmcgVVJMU19ESVIgPSAidXJsc1xcIjsgLy8kTk9OLU5MUy0xJAorCisJZmluYWwgc3RhdGljIFN0cmluZyBQT1BVTEFUSU9OX1BST0ZJTEVTID0gInByb2ZpbGVzXFwiOyAvLyROT04tTkxTLTEkCisKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRJRVNfT1VUUFVUX0RJUiA9ICJvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGFcXHJlc291cmNlc1xcZGF0YVxcY291bnRyeVxcIjsgLy8kTk9OLU5MUy0xJAorCQkKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIE1BUFNfT1VUUFVUX0RJUiA9ICJvcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeVxccmVzb3VyY2VzXFxkYXRhXFxnZW9cXGNvdW50cnlcXCI7IC8vJE5PTi1OTFMtMSQKKworCWZpbmFsIHN0YXRpYyBTdHJpbmcgSVNPMzE2Nl8xX0ZJTEUgPSAiSVNPMzE2Ni0xXFxJU08zMTY2XzFfbGlzdC50eHQiOyAvLyROT04tTkxTLTEkIAorCisJZmluYWwgc3RhdGljIFN0cmluZyBJU08zMTY2XzJfRklMRSA9ICJJU08zMTY2LTJcXElTTzMxNjZfMl9saXN0LnR4dCI7IC8vJE5PTi1OTFMtMSQJCisKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIElTT0ZJWF9GSUxFID0gIklTT0ZJWFxcSVNPX0ZJWC50eHQiOyAvLyROT04tTkxTLTEkIAorCisJZmluYWwgc3RhdGljIFN0cmluZyBQT0xZR09OX0FSRUFTX0RJUiA9ICJwb2x5Z29uQXJlYXNcXCI7IC8vJE5PTi1OTFMtMSQKKworCWZpbmFsIHN0YXRpYyBTdHJpbmcgQVJFQV9QT1BVTEFUSU9OX0RJUiA9ICJBcmVhUG9wdWxhdGlvbkRhdGFcXCI7IC8vJE5PTi1OTFMtMSQKKwkKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIFVTQV9MRVZFTF8yX0FSRUEgPSBBUkVBX1BPUFVMQVRJT05fRElSICsgIlVTQV8yX0FSRUEudHh0IjsgLy8kTk9OLU5MUy0xJAorCQorCWZpbmFsIHN0YXRpYyBTdHJpbmcgVVNBX0xFVkVMXzJfUE9QVUxBVElPTiA9IEFSRUFfUE9QVUxBVElPTl9ESVIgKyAiVVNBXzJfUE9QVUxBVElPTi50eHQiOyAvLyROT04tTkxTLTEkCisKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIExFWF9ESVIgPSAic29ydFxcIjsgLy8kTk9OLU5MUy0xJAorCisJZmluYWwgc3RhdGljIFN0cmluZyBFVVJPUEVfTkFNRVMgPSAidGFyZ2V0c1xcRXVyb3BlTmFtZXMudHh0IjsgLy8kTk9OLU5MUy0xJAorCisJZmluYWwgc3RhdGljIFN0cmluZyBFVVJPUEVfQ09VTlRSSUVTID0gInRhcmdldHNcXEV1cm9wZUNvdW50cmllcy50eHQiOyAvLyROT04tTkxTLTEkCisKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIEdST1VQRURfQ09VTlRSSUVTID0gInRhcmdldHNcXGdyb3VwZWREYXRhRmlsZXMudHh0IjsgLy8kTk9OLU5MUy0xJAorCisJZmluYWwgc3RhdGljIFN0cmluZyBVU0FfRklQU19GSUxFID0gIklTT0ZJWFxcVVNBX0ZJUFMudHh0IjsvLyROT04tTkxTLTEkCQorCisJZmluYWwgc3RhdGljIFN0cmluZyBSRURVQ0VfTElTVCA9ICJ0YXJnZXRzXFxyZWR1Y2VMaXN0LnR4dCI7IC8vJE5PTi1OTFMtMSQKKworCWZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9JVEVSQVRJT05TID0gIjUiOyAvLyROT04tTkxTLTEkCisKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfVEhSRVNIT0xEID0gIjUiOyAvLyROT04tTkxTLTEkCisKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIFVTQV9MMV9EQVRBID0gIlVTQV9MMV9EYXRhXFxVU0FfTDEudHh0IjsgLy8kTk9OLU5MUy0xJAorCisJZmluYWwgc3RhdGljIFN0cmluZyBGT1JNQVRfTElTVCA9ICJ0YXJnZXRzXFxmb3JtYXRMaXN0LnR4dCI7IC8vJE5PTi1OTFMtMSQKKworCWZpbmFsIHN0YXRpYyBTdHJpbmcgQ09VTlRSWV9OQU1FUyA9ICJ0YXJnZXRzXFxjb3VudHJ5X25hbWVzLkZ0eHQiOyAvLyROT04tTkxTLTEkCisKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIENPVU5UUklFU19MSVNUID0gInRhcmdldHNcXGdyb3VwZWREYXRhRmlsZXMudHh0IjsgLy8kTk9OLU5MUy0xJAorCQorCWZpbmFsIHN0YXRpYyBTdHJpbmcgRFVNTVlfRElSID0gICJDOlxcRHVtbXlcXCI7IC8vJE5PTi1OTFMtMSQKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9HZW5VdGlscy5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9HZW5VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNGI1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0dlblV0aWxzLmphdmEKQEAgLTAsMCArMSwxNzcyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFNURU0gSUkgRGF0YSBNaWdyYXRpb24vR2VuZXJhdGlvbiBVdGlsaXRpZXMgOiBUaGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFyZQorICogdXRpbGl0eSBtZXRob2RzIHVzZWQgYnkgdGhlIHZhcmlvdXMgZGF0YSBnZW5lcmF0b3JzIGZvciBTVEVNIElJLgorICogCisgKi8KKworcHVibGljIGNsYXNzIEdlblV0aWxzIHsKKworCS8qKgorCSAqIEFkZCBkYXRhIHRvIHRoZSBwcm9wZXJ0aWVzIGZpbGUuCisJICogCisJICogQHBhcmFtIHByb3BlcnRpZXNGaWxlCisJICogICAgICAgICAgICBhIHdyaXRlciB0byB0aGUgb3V0cHV0IGZpbGUKKwkgKiBAcGFyYW0gZGF0YQorCSAqICAgICAgICAgICAgdGhlIGRhdGEgd2Ugd2FudCB0byB3cml0ZQorCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgdm9pZCBhZGREYXRhKFByaW50V3JpdGVyIHByb3BlcnRpZXNGaWxlLCBTdHJpbmcgZGF0YSkgeworCQlwcm9wZXJ0aWVzRmlsZS53cml0ZShkYXRhKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBmaW5kcyB3aGF0IGtpbmQgb2YgZGF0YSB3ZSBhcmUgZGVhbGluZyB3aXRoIGN1cnJlbnRseS4KKwkgKiAKKwkgKiBAcGFyYW0gZGF0YQorCSAqICAgICAgICAgICAgYSBidWZmZXIgb2YgZGl2YSBkYXRhCisJICogCisJICogQHJldHVybiB0aGUgYWRtaW4gbGV2ZWwgb2YgdGhlIGRhdGEKKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIGludCBnZXREYXRhTGV2ZWwoU3RyaW5nW10gZGF0YSkgeworCisJCWlmIChpc051bWVyaWMoZGF0YVtJU09EYXRhLkFETUlOMl9OQU1FXSkgPT0gZmFsc2UpIHsKKwkJCXJldHVybiBEYXRhVHlwZXMuTEVWRUxfMjsKKwkJfSBlbHNlIGlmIChpc051bWVyaWMoZGF0YVtJU09EYXRhLkFETUlOMV9OQU1FXSkgPT0gZmFsc2UpIHsKKwkJCXJldHVybiBEYXRhVHlwZXMuTEVWRUxfMTsKKwkJfQorCisJCXJldHVybiBEYXRhVHlwZXMuTEVWRUxfMDsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0IGZyb20gcmFkaWFucyB0byBkZWdyZWVzLgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZQorCSAqICAgICAgICAgICAgaW4gcmFkaWFucworCSAqIAorCSAqIEByZXR1cm4gZG91YmxlIC0tIHRoZSB2YWx1ZSBpbiBkZWdyZWVzCisJICovCisJc3RhdGljIHByb3RlY3RlZCBkb3VibGUgdG9EZWdyZWVzKGRvdWJsZSB2YWx1ZSkgeworCQlkb3VibGUgZFZhbHVlID0gdmFsdWU7CisJCWRWYWx1ZSAqPSAxODAuMCAqICgxLjAgLyBqYXZhLmxhbmcuTWF0aC5QSSk7CisJCXJldHVybiBkVmFsdWU7CisJfSAvLyB0b0RlZ3JlZXMKKworCS8qKgorCSAqIEV4dHJhY3QgdGhlIHdvcmtzcGFjZSBvdXQgb2YgYSBwYXRoIGkuZS4gaWYgZ2l2ZW4gcGF0aCA9CisJICogQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXGlucHV0XElTTzMxNjYtMVxJU08zMTY2XzFfZW4udHh0CisJICogVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiA6IEM6XHN0ZW1JSVwKKwkgKiAKKwkgKiBAcGFyYW0gcGF0aAorCSAqIEByZXR1cm4gd29ya3NwYWNlCisJICovCisJc3RhdGljIHByb3RlY3RlZCBTdHJpbmcgZ2V0V29ya3NwYWNlKFN0cmluZyBwYXRoKSB7CisJCWludCBpID0gSW50ZWdlci5NSU5fVkFMVUU7CisJCWludCBqID0gSW50ZWdlci5NSU5fVkFMVUU7CisKKwkJaWYgKHBhdGguY29udGFpbnMoIlxcIikgPT0gZmFsc2UpIC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBuZXcgU3RyaW5nKCJDOlxcRHVtbXlcXCIpOyAvLyROT04tTkxTLTEkCisJCWkgPSBwYXRoLmluZGV4T2YoIlxcIik7IC8vJE5PTi1OTFMtMSQKKwkJaiA9IHBhdGguaW5kZXhPZigiXFwiLCBpICsgMSk7IC8vJE5PTi1OTFMtMSQKKworCQlpZiAoaiAhPSBJbnRlZ2VyLk1JTl9WQUxVRSkgeworCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIGogKyAxKTsKKwkJfQorCisJCXJldHVybiBuZXcgU3RyaW5nKEdlbkNvbnN0YW50cy5EVU1NWV9ESVIpOworCX0KKworCS8qKgorCSAqIENvbnZlcnQgZnJvbSBhIFN0cmluZyBob2xkaW5nIGEgZG91YmxlIHZhbHVlIG9mIHRoZSBmb3JtIEQuRERERERERCBpbnRvCisJICogYW4gSW50ZWdlciBvZiB0aGUgZm9ybSA6IERERERERERECisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICBzdHJpbmcgaG9sZGluZyBhIGRvdWJsZSB2YWx1ZSBpbiB0aGUgZm9ybSBELkREREREREQKKwkgKiAKKwkgKiBAcmV0dXJuIGFuIEludGVnZXIgdmFsdWUgaW4gZm9ybSBERERERERERAorCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgSW50ZWdlciB0b0ludEZvcm1hdChTdHJpbmcgdmFsdWUpIHsKKwkJRG91YmxlIGRWYWwgPSBEb3VibGUudmFsdWVPZih2YWx1ZSk7CisJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YoKGludCkgKDEwMDAwMDAwMC4wICogZFZhbC5kb3VibGVWYWx1ZSgpKSk7CisJfQorCisJLyoqCisJICogQ29udmVydCBhbiBhcnJheSBvZiBJbnRlZ2VycyBpbnRvIGFuIGFycmF5IG9mIGludHMuCisJICogCisJICogQHBhcmFtIGFuCisJICogICAgICAgICAgICBhcnJheSBvZiBJbnRlZ2VycworCSAqIAorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgaW50W10KKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIGludFtdIHRvSW50QXJyYXkoQXJyYXlMaXN0PEludGVnZXI+IGFycmF5KSB7CisKKwkJaW50W10gaW50QXJyYXkgPSBuZXcgaW50W2FycmF5LnNpemUoKV07CisJCUl0ZXJhdG9yIGl0ID0gYXJyYXkuaXRlcmF0b3IoKTsKKworCQlpbnQgaW5kZXggPSAwOworCisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCWludEFycmF5W2luZGV4XSA9ICgoSW50ZWdlcikgaXQubmV4dCgpKS5pbnRWYWx1ZSgpOworCQkJaW5kZXgrKzsKKwkJfQorCisJCXJldHVybiBpbnRBcnJheTsKKworCX0KKworCS8qKgorCSAqIENvbnZlcnQgdGhlIHZhbHVlIG9mIHN0cmluZyB0byBhIGRvdWJsZQorCSAqIAorCSAqIEBwYXJhbSBzdHIKKwkgKiAKKwkgKiBAcmV0dXJuIGRvdWJsZQorCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgZG91YmxlIGdldERvdWJsZShTdHJpbmcgc3RyKSB7CisJCURvdWJsZSBob2xkZXIgPSBuZXcgRG91YmxlKHN0cik7CisJCXJldHVybiBob2xkZXIuZG91YmxlVmFsdWUoKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgZGVjaW1hbCBwb2ludCBmcm9tIHZhbHVlIGFuZCByZXR1cm4gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbgorCSAqIAorCSAqIEBwYXJhbSBkZWdyZWVzCisJICogCisJICogQHJldHVybiBmb3JtYXR0ZWQgc3RyaW5nCisJICovCisJc3RhdGljIHByb3RlY3RlZCBTdHJpbmcgZm9ybWF0KGRvdWJsZSBkZWdyZWVzKSB7CisJCS8vIFN0cmluZyBzdHIgPSBudWxsOworCQkvLyBTdHJpbmcgc3ViU3RyID0gbnVsbDsKKworCQlkb3VibGUgZFZhbCA9IGRlZ3JlZXM7CisJCS8vIGJvb2xlYW4gbmVnYXRpdmUgPSBmYWxzZTsKKworCQkvLyBEZWNpbWFsIGZvcm1hdCBkb2VzIHRoZSByb3VuZGluZyBmb3IgdXMuCisJCS8vIGlmIChkVmFsIDwgLTAuMDAwMDAwNSkgeworCQkvLyBkVmFsIC09IDAuMDAwMDAwNTsKKwkJLy8gfSBlbHNlIGlmIChkVmFsID4gMC4wMDAwMDA1KSB7CisJCS8vIGRWYWwgKz0gMC4wMDAwMDA1OworCQkvLyB9CisKKwkJLy8gZFZhbCAqPSAxMDAwMDAwLjA7CisJCS8vIGludCBpVmFsID0gKGludCkgZFZhbDsKKwkJLy8gcmV0dXJuICIiK2lWYWw7CisJCS8vIHN0ciA9IERvdWJsZS50b1N0cmluZyhkVmFsKTsKKwkJLy8gaW50IGRvdCA9IHN0ci5pbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gc3ViU3RyID0gc3RyLnN1YnN0cmluZygwLCBzdHIubGVuZ3RoKCkgPCBkb3QgKyA3ID8gc3RyLmxlbmd0aCgpCisJCS8vIDogZG90ICsgNyk7CisJCS8vIHJldHVybiBzdWJTdHI7CisJCURlY2ltYWxGb3JtYXQgZm9ybSA9IG5ldyBEZWNpbWFsRm9ybWF0KCIjIyMwLjAwMDAwMCIpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBmb3JtLmZvcm1hdChkVmFsKTsKKworCX0gLy8gZm9ybWF0RGF0YQorCisJLyoqCisJICogRm9ybWF0IG9ubHkgc2l4IGRlY2ltYWwgZGlnaXRzIGFmdGVyIGRlY2ltYWwgcG9pbnQuCisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB1bmZvcm1hdHRlZCB2YWx1ZQorCSAqIAorCSAqIEByZXR1cm4gZm9ybWF0dGVkIHN0cmluZworCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdChTdHJpbmcgdmFsdWUpIHsKKwkJU3RyaW5nIHN1YlN0ciA9IG51bGw7CisKKwkJaW50IGRvdCA9IHZhbHVlLmluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAorCQlzdWJTdHIgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGVuZ3RoKCkgPCBkb3QgKyA3ID8gdmFsdWUubGVuZ3RoKCkKKwkJCQk6IGRvdCArIDcpOworCQlyZXR1cm4gc3ViU3RyOworCisJfSAvLyBmb3JtYXREYXRhCisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBjaGVja3MgdG8gc2VlIGlmIHdlIGhhdmUgYWxyZWFkeSBzZWVuIGEgZ2l2ZW4gZW50cnkuCisJICogCisJICogQHBhcmFtIGN1cnJlbnQKKwkgKiAgICAgICAgICAgIGVudHJ5IHdlIGFyZSB0cnlpbmcgdG8gbWF0Y2gKKwkgKiBAcGFyYW0gbGlzdAorCSAqICAgICAgICAgICAgYSBsaXN0IGNvbnRhaW5pbmcgYWxsIHNlZW4gZW50cmllcworCSAqIAorCSAqIEByZXR1cm4gYm9vbGVhbiB3aGV0aGVyIHRoZSBlbnRyeSBpcyByZXBlYXRlZCBvciBub3QKKwkgKiAKKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXBlYXRlZChTdHJpbmcgY3VycmVudCwgTGlzdDxTdHJpbmc+IGxpc3QpIHsKKworCQlTdHJpbmcgY3VycmVudFN0ciA9IGN1cnJlbnQudG9VcHBlckNhc2UoKS50cmltKCk7CisJCUl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgZW50cnkgPSAoKFN0cmluZykgaXQubmV4dCgpKS50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKwkJCWlmIChlbnRyeS5lcXVhbHMoY3VycmVudFN0cikpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBmaW5kcyB3aGF0IGtpbmQgb2YgZGF0YSB3ZSBhcmUgZGVhbGluZyB3aXRoIGN1cnJlbnRseS4KKwkgKiAKKwkgKiBAcGFyYW0gZGF0YQorCSAqICAgICAgICAgICAgQSBidWZmZXIgb2YgcHVyZSBkaXZhIGRhdGEKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBhZG1pbiBsZXZlbCBmb3IgdGhlIGRhdGEgaW4gdGhpcyBidWZmZXIKKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIGludCBnZXRMZXZlbChTdHJpbmdbXSBkYXRhKSB7CisKKwkJaWYgKGlzTnVtZXJpYyhkYXRhW0lTT0RhdGEuQURNSU4yX05BTUVdKSA9PSBmYWxzZSkgeworCQkJcmV0dXJuIERhdGFUeXBlcy5MRVZFTF8yOworCQl9IGVsc2UgaWYgKGlzTnVtZXJpYyhkYXRhW0lTT0RhdGEuQURNSU4xX05BTUVdKSA9PSBmYWxzZSkgeworCQkJcmV0dXJuIERhdGFUeXBlcy5MRVZFTF8xOworCQl9CisKKwkJcmV0dXJuIERhdGFUeXBlcy5MRVZFTF8wOworCX0KKworCS8qKgorCSAqIFRlc3QgaWYgdGhlIHN0cmluZyBjb250YWlucyBhIG51bWJlcgorCSAqIAorCSAqIEBwYXJhbSBzdHIKKwkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgZm9yIHdoaWNoIHdlIHdhbnQgdG8gdGVzdCBpZiBpdCByZXByZXNlbnRzIGEgbnVtYmVyCisJICogCisJICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhpcyBzdHJpbmcgcmVwcmVzZW50cyBhIG51bWJlcgorCSAqLworCisJc3RhdGljIHByb3RlY3RlZCBib29sZWFuIGlzTnVtZXJpYyhTdHJpbmcgc3RyKSB7CisKKwkJdHJ5IHsKKwkJCURvdWJsZS52YWx1ZU9mKHN0cik7CisJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7IC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZW4KKwkJCS8vIGl0IGlzIG5vdCBhIG51bWJlci4KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFRlc3Qgd2hldGhlciB0aGlzIGtleSByZXByZXNlbnRzIGFuIGFjdGl2ZSBVUkwgb3Igbm90LgorCSAqIAorCSAqIEBwYXJhbSB1cmxTdGF0dXMKKwkgKiAgICAgICAgICAgIEEgbWFwIHdpdGggdHVwbGVzIChVUkw6U1RBVFVTKQorCSAqIEBwYXJhbSBrZXkKKwkgKiAgICAgICAgICAgIFRoZSBVUkwgd2hvc2Ugc3RhdHVzIHdlIHdhbnQgdG8gZ2V0LgorCSAqIAorCSAqIEByZXR1cm4gVGVzdCB3aGV0aGVyIHRoaXMga2V5IHJlcHJlc2VudHMgYW4gYWN0aXZlIFVSTCBvciBub3QuCisJICogCisJICovCisJc3RhdGljIHByb3RlY3RlZCBib29sZWFuIGlzQWN0aXZlVVJMKEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPiB1cmxTdGF0dXMsCisJCQlTdHJpbmcga2V5KSB7CisKKwkJaWYgKHVybFN0YXR1cy5jb250YWluc0tleShrZXkpKSB7CisJCQlyZXR1cm4gdXJsU3RhdHVzLmdldChrZXkpLmJvb2xlYW5WYWx1ZSgpOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIERvIGEgbG9va3VwIGJhc2VkIG9uIG5hbWUgYW5kIGdldCB0aGUgSVNPMzE2Ni0yIGZpeCBjb2RlIGZvciB0aGlzIGl0ZW0uCisJICogSWYgd2UgY2FudCBtYXRjaCwgdGhlbiByZWNvcmQgdGhlIGNvdW50cnkgYW5kIGVudGl0eSBuYW1lIG9mIHRoZQorCSAqIHVubWF0Y2hlZCBpdGVtcy4KKwkgKiAKKwkgKiBAcGFyYW0gbGlzdAorCSAqICAgICAgICAgICAgYSBsaXN0IG9mIElTTzMxNjYtMiBmaXggY29kZXMKKwkgKiBAcGFyYW0gZW50aXR5CisJICogICAgICAgICAgICB0aGUgZW50aXR5IGZvciB3aGljaCB3ZSBhcmUgc2Vla2luZyBhbiBJU08gY29kZQorCSAqIAorCSAqIEBwYXJhbSBjb3VudHJ5CisJICogICAgICAgICAgICB0aGUgY291bnRyeSB0byB3aGljaCB0aGUgZW50aXR5IGJlbG9uZ3MgdG8KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBJU08zMTY2LTIgZml4IGNvZGUgZm9yIGEgZ2l2ZW4gY291bnRyeQorCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpeENvZGUoTGlzdCBsaXN0LCBTdHJpbmcgZW50aXR5LCBTdHJpbmcgY291bnRyeSkgeworCisJCWZpbmFsIGludCBDT1VOVFJZID0gMDsKKworCQlmaW5hbCBpbnQgQURNSU4xID0gMTsKKworCQlmaW5hbCBpbnQgRklYID0gMzsKKworCQlTdHJpbmcgZW50aXR5U3RyID0gZW50aXR5LnRvVXBwZXJDYXNlKCkudHJpbSgpOworCisJCVN0cmluZyBjb3VudHJ5U3RyID0gY291bnRyeS50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKworCQlpZiAobGlzdCAhPSBudWxsKSB7CisKKwkJCUl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOworCisJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisKKwkJCQlTdHJpbmdbXSBjb21wYXJlID0gbnVsbDsKKworCQkJCVN0cmluZyBjb2RlID0gKFN0cmluZykgaXQubmV4dCgpOworCisJCQkJLy8gVG9rZW5pemUKKwkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb2RlLCAiOiIpOyAvLyROT04tTkxTLTEkCisKKwkJCQkvLyBHZXQgdG9rZW5zIC0+IG9yZGVyIG1hdHRlcnMgaGVyZSEKKwkJCQljb21wYXJlID0gbmV3IFN0cmluZ1t0b2tlbnMuY291bnRUb2tlbnMoKV07CisJCQkJaW50IGkgPSAwOworCQkJCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7CisJCQkJCWNvbXBhcmVbaSsrXSA9IHRva2Vucy5uZXh0VG9rZW4oKS50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKwkJCQl9CisKKwkJCQkvLyBOb3cgZG8gdGhlIGNvbXBhcmlzb24KKwkJCQlpZiAoZW50aXR5U3RyLmVxdWFscyhjb21wYXJlW0FETUlOMV0pCisJCQkJCQkmJiBjb3VudHJ5U3RyLmVxdWFscyhjb21wYXJlW0NPVU5UUlldKSkgeworCQkJCQlyZXR1cm4gY29tcGFyZVtGSVhdOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIE1hdGNoIG5vdCBmb3VuZCwgcmV0dXJuIGl0c2VsZi4KKwkJcmV0dXJuIGVudGl0eVN0cjsKKwl9CisKKwkvKioKKwkgKiBEbyBhIGxvb2t1cCBiYXNlZCBvbiBuYW1lIGFuZCBnZXQgdGhlIElTTzMxNjYtMiBpbmZvIGZvciB0aGlzIGl0ZW0uIElmIHdlCisJICogY2FudCBtYXRjaCwgdGhlbiByZWNvcmQgdGhlIGNvdW50cnkgYW5kIGVudGl0eSBuYW1lIG9mIHRoZSB1bm1hdGNoZWQKKwkgKiBpdGVtcy4KKwkgKiAKKwkgKiBAcGFyYW0gbGlzdAorCSAqICAgICAgICAgICAgYSBsaXN0IG9mIElTTzMxNjYtMiBjb2RlcworCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICB0aGUgZW50aXR5IGZvciB3aGljaCB3ZSBhcmUgc2Vla2luZyBhbiBJU08gY29kZSAqCisJICogQHBhcmFtIGFscGhhMgorCSAqICAgICAgICAgICAgdGhlIGFscGhhMiBjb2RlIG9mIHRoZSBjb3VudHJ5IHRvIHdoaWNoIHRoZSBlbnRpdHkgYmVsb25ncyB0bworCSAqIAorCSAqIEByZXR1cm4gdGhlIElTTzMxNjYtMiBkZXNjcmlwdG9yLgorCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgU3RyaW5nIGdldElTTzJEZXNjcmlwdG9yKExpc3QgbGlzdCwgU3RyaW5nIG5hbWUsCisJCQlTdHJpbmcgYWxwaGEyKSB7CisKKwkJSVNPQ29kZTIgY29kZSA9IG51bGw7CisKKwkJU3RyaW5nIG5hbWVTdHIgPSBuYW1lLnRvVXBwZXJDYXNlKCk7CisKKwkJaWYgKGxpc3QgIT0gbnVsbCkgeworCisJCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKKworCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQkJU3RyaW5nW10gY29tcGFyZSA9IG51bGw7CisKKwkJCQljb2RlID0gKElTT0NvZGUyKSBpdC5uZXh0KCk7CisKKwkJCQlpZiAoY29kZS5nZXRBbHBoYTIoKS5lcXVhbHMoYWxwaGEyKSA9PSBmYWxzZSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQkvLyBJRiBJU08gMzE2Ni0yIGNvbnRhaW5zIGJyYWNrZXRzIHRoZW4gd2UgaGF2ZSB0byBkbyB0d28KKwkJCQkvLyBjb21wYXJpc29ucworCisJCQkJLy8gR2V0IHRoZSBlbnRpdHkgbmFtZSBhbmQgcmVtb3ZlIGJsYW5rcworCQkJCVN0cmluZyBlbnRpdHkgPSBjb2RlLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKworCQkJCWlmIChlbnRpdHkuY29udGFpbnMoIlsiKSkgeyAvLyROT04tTkxTLTEkCisKKwkJCQkJZW50aXR5ID0gZW50aXR5LnJlcGxhY2UoIl0iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQkJCS8vIFRva2VuaXplCisJCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVudGl0eSwgIlsiKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJCS8vIEdldCB0b2tlbnMgLT4gb3JkZXIgbWF0dGVycyBoZXJlIQorCQkJCQljb21wYXJlID0gbmV3IFN0cmluZ1t0b2tlbnMuY291bnRUb2tlbnMoKV07CisJCQkJCWludCBpID0gMDsKKwkJCQkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQkJCWNvbXBhcmVbaSsrXSA9IHRva2Vucy5uZXh0VG9rZW4oKS50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChjb21wYXJlICE9IG51bGwpIHsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wYXJlLmxlbmd0aDsgaSsrKSB7CisJCQkJCQlpZiAobmFtZVN0ci5yZXBsYWNlKCItIiwgIiAiKS5lcXVhbHMoY29tcGFyZVtpXSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQkJCQlyZXR1cm4gY29kZS5nZXRJZCgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIGlmIChuYW1lU3RyLnJlcGxhY2UoIi0iLCAiICIpLmVxdWFscyhjb2RlLmdldE5hbWUoKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCXJldHVybiBjb2RlLmdldElkKCk7CisJCQkJfQorCisJCQl9IC8vIHdoaWxlCisKKwkJfSAvLyBpZgorCisJCXJldHVybiBuYW1lU3RyOworCX0KKworCS8qKgorCSAqIERvIGEgbG9va3VwIGJhc2VkIG9uIG5hbWUgYW5kIGdldCB0aGUgSVNPMzE2Ni0yIG9iamVjdCBmb3IgdGhpcyBpdGVtLiBJZgorCSAqIHdlIGNhbnQgbWF0Y2gsIHRoZW4gcmVjb3JkIHRoZSBjb3VudHJ5IGFuZCBlbnRpdHkgbmFtZSBvZiB0aGUgdW5tYXRjaGVkCisJICogaXRlbXMuCisJICogCisJICogQHBhcmFtIGxpc3QKKwkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBJU08zMTY2LTIgY29kZXMKKwkgKiBAcGFyYW0gbmFtZQorCSAqICAgICAgICAgICAgdGhlIGVudGl0eSBmb3Igd2hpY2ggd2UgYXJlIHNlZWtpbmcgYW4gSVNPIGNvZGUgKgorCSAqIEBwYXJhbSBhbHBoYTIKKwkgKiAgICAgICAgICAgIHRoZSBhbHBoYTIgY29kZSBvZiB0aGUgY291bnRyeSB0byB3aGljaCB0aGUgZW50aXR5IGJlbG9uZ3MgdG8KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBJU08yQ29kZQorCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgSVNPQ29kZTIgZ2V0SVNPMk9iamVjdChMaXN0IGxpc3QsIFN0cmluZyBuYW1lLAorCQkJU3RyaW5nIGFscGhhMikgeworCisJCUlTT0NvZGUyIGNvZGUgPSBudWxsOworCisJCVN0cmluZyBuYW1lU3RyID0gbmFtZS50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKworCQlpZiAobGlzdCAhPSBudWxsKSB7CisKKwkJCUl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOworCisJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisKKwkJCQlTdHJpbmdbXSBjb21wYXJlID0gbnVsbDsKKworCQkJCWNvZGUgPSAoSVNPQ29kZTIpIGl0Lm5leHQoKTsKKworCQkJCWlmIChjb2RlLmdldEFscGhhMigpLmVxdWFscyhhbHBoYTIpID09IGZhbHNlKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCS8vIElGIElTTyAzMTY2LTIgY29udGFpbnMgYnJhY2tldHMgdGhlbiB3ZSBoYXZlIHRvIGRvIGF0IGxlYXN0CisJCQkJLy8gdHdvIGNvbXBhcmlzb25zCisKKwkJCQkvLyBHZXQgdGhlIGVudGl0eSBuYW1lIGFuZCByZW1vdmUgYmxhbmtzCisJCQkJU3RyaW5nIGVudGl0eSA9IGNvZGUuZ2V0TmFtZSgpLnRvVXBwZXJDYXNlKCkudHJpbSgpOworCisJCQkJaWYgKGVudGl0eS5jb250YWlucygiWyIpKSB7IC8vJE5PTi1OTFMtMSQKKworCQkJCQllbnRpdHkgPSBlbnRpdHkucmVwbGFjZSgiXSIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQkJLy8gVG9rZW5pemUKKwkJCQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZW50aXR5LCAiWyIpOyAvLyROT04tTkxTLTEkCisKKwkJCQkJLy8gR2V0IHRva2VucyAtPiBvcmRlciBtYXR0ZXJzIGhlcmUhCisJCQkJCWNvbXBhcmUgPSBuZXcgU3RyaW5nW3Rva2Vucy5jb3VudFRva2VucygpXTsKKwkJCQkJaW50IGkgPSAwOworCQkJCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworCQkJCQkJY29tcGFyZVtpKytdID0gdG9rZW5zLm5leHRUb2tlbigpLnRvVXBwZXJDYXNlKCkudHJpbSgpOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKGNvbXBhcmUgIT0gbnVsbCkgeworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBhcmUubGVuZ3RoOyBpKyspIHsKKwkJCQkJCWlmIChuYW1lU3RyLmVxdWFscyhjb21wYXJlW2ldKSkgeworCisJCQkJCQkJcmV0dXJuIGNvZGU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKG5hbWVTdHIuZXF1YWxzKGNvZGUuZ2V0TmFtZSgpLnRvVXBwZXJDYXNlKCkudHJpbSgpKSkgeworCQkJCQlyZXR1cm4gY29kZTsKKwkJCQl9CisKKwkJCX0gLy8gd2hpbGUKKworCQl9IC8vIGlmCisKKwkJcmV0dXJuIG5ldyBJU09Db2RlMigiRk9PIiwgIlVOSyIsICJVTksiLCAiMCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCisJfQorCisJLyoqCisJICogRG8gYSBsb29rdXAgYmFzZWQgb24gbmFtZSBhbmQgZ2V0IHRoZSBJU08zMTY2LTIgaW5mbyBmb3IgdGhpcyBpdGVtLiBJZiB3ZQorCSAqIGNhbnQgbWF0Y2gsIHRoZW4gcmVjb3JkIHRoZSBjb3VudHJ5IGFuZCBlbnRpdHkgbmFtZSBvZiB0aGUgdW5tYXRjaGVkCisJICogaXRlbXMuCisJICogCisJICogQHBhcmFtIGxpc3QKKwkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBJU08zMTY2LTIgY29kZXMuCisJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkgKiAgICAgICAgICAgIHRoZSBkZXNjcmlwdG9yIHdlIGFyZSB0cnlpbmcgdG8gbWF0Y2guCisJICogCisJICogQHJldHVybiB0aGUgSVNPMzE2Ni0yIGNvZGUgZm9yIGEgZ2l2ZW4gY291bnRyeQorCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgSVNPQ29kZTIgZ2V0SVNPMk9iamVjdChMaXN0IGxpc3QsIFN0cmluZyBkZXNjcmlwdG9yKSB7CisKKwkJSVNPQ29kZTIgY29kZSA9IG51bGw7CisKKwkJU3RyaW5nIGRlc2NyaXB0b3JTdHIgPSBkZXNjcmlwdG9yLnRvVXBwZXJDYXNlKCk7CisKKwkJaWYgKGxpc3QgIT0gbnVsbCkgeworCisJCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKKworCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQkJY29kZSA9IChJU09Db2RlMikgaXQubmV4dCgpOworCisJCQkJaWYgKGRlc2NyaXB0b3JTdHIuZXF1YWxzKGNvZGUuZ2V0TmFtZSgpKSkgeworCQkJCQlyZXR1cm4gY29kZTsKKwkJCQl9CisKKwkJCX0gLy8gd2hpbGUKKworCQl9IC8vIGlmCisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUHJvZHVjZSBhIGxpc3Qgb2YgSVNPMkNvZGVzIHJlcHJlc2VudGluZyB0aGUgc29ydGVkIGRlc2NyaXB0b3JzIGluIGxpc3QuCisJICogCisJICogQHBhcmFtIGxpc3QKKwkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBkZXNjcmlwdG9ycworCSAqIAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIElTTyAzMTY2LTIgY29kZXMuCisJICovCisJc3RhdGljIHByb3RlY3RlZCBMaXN0PElTT0NvZGUyPiBnZXRTb3J0ZWREZXNjcmlwdG9ycyhMaXN0PFN0cmluZz4gbGlzdCkgeworCisJCUl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlc2NyaXB0b3IgLT4gIiArIGl0Lm5leHQoKSk7IC8vJE5PTi1OTFMtMSQKKworCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogRmluZCBhIGxldmVsIDIgdmFsdWUgZm9yIGEgZ2l2ZW4gbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbiBJdCBjYW4gYmUgZWl0aGVyCisJICogYXJlYSBvciBwb3B1bGF0aW9uIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBkYXRhLgorCSAqIAorCSAqIEBwYXJhbSBlbnRpdHkKKwkgKiAgICAgICAgICAgIHRoZSBlbnRpdHkgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZmluZCB0aGUgdmFsdWUKKwkgKiAKKwkgKiBAcGFyYW0gc3RhdGUKKwkgKiAKKwkgKiBAcGFyYW0gbGlzdAorCSAqICAgICAgICAgICAgYSBsaXN0IG9mIGxldmVsIDIgYWRtaW5pc3RyYXRpb25zCisJICogCisJICogQHJldHVybiB0aGUgbGV2ZWwgMiB2YWx1ZSAoYXJlYSBvciBwb3B1bGF0aW9uIHZhbHVlKQorCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgU3RyaW5nIGdldExldmVsMkRhdGEoU3RyaW5nIGVudGl0eSwgU3RyaW5nIHN0YXRlLCBMaXN0IGxpc3QpIHsKKworCQlmaW5hbCBpbnQgRU5USVRZID0gMDsKKworCQlmaW5hbCBpbnQgU1RBVEVfSUQgPSAxOworCisJCWZpbmFsIGludCBBUkVBID0gMjsKKworCQlTdHJpbmdbXSBkYXRhID0gbnVsbDsKKworCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKKworCQlTdHJpbmcgZW50aXR5U3RyID0gZW50aXR5LnRvVXBwZXJDYXNlKCkudHJpbSgpOworCisJCWVudGl0eVN0ciA9IGVudGl0eVN0ci5yZXBsYWNlKCJcXHQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCVN0cmluZyBzdGF0ZVN0ciA9IHN0YXRlLnRvVXBwZXJDYXNlKCkudHJpbSgpOworCisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKworCQkJZGF0YSA9ICgoU3RyaW5nKSBpdC5uZXh0KCkpLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJLy8gR2V0IHRoZSBlbnRpdHkgbmFtZSBhbmQgcmVtb3ZlIGJsYW5rcworCQkJU3RyaW5nIGxvY2F0aW9uID0gZGF0YVtFTlRJVFldLnRvVXBwZXJDYXNlKCkudHJpbSgpOworCisJCQlsb2NhdGlvbiA9IGxvY2F0aW9uLnRvVXBwZXJDYXNlKCkudHJpbSgpOworCisJCQlpZiAoZW50aXR5LmVxdWFscyhsb2NhdGlvbikpIHsKKworCQkJCS8vIENoZWNrIGJvdGggZW50aXRpZXMgYmVsb25nIHRvIHNhbWUgc3RhdGUKKwkJCQlpZiAoc3RhdGVTdHIuZXF1YWxzKGRhdGFbU1RBVEVfSURdLnRyaW0oKSkgPT0gZmFsc2UpIHsKKwkJCQkJLy8gSWdub3JlIDogc2FtZSBuYW1lICwgYnV0IGRpZmZlcmVudCBsZXZlbAorCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJcmV0dXJuIGRhdGFbQVJFQV0udHJpbSgpOworCQkJfQorCisJCX0gLy8gd2hpbGUKKworCQlyZXR1cm4gIjAiOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogTG9hZCBhbGwgdGhlIElTTyAzMTY2LTIgZGF0YSBmb3IgdGhlIGNvdW50cnkgZGVzY3JpYmVkCisJICogCisJICogQHBhcmFtIGlzb0ZpbGUKKwkgKiAgICAgICAgICAgIGZpbGUgY29udGFpbmluZyBJU08gMzE2Ni0yIGNvZGVzCisJICogCisJICogQHJldHVybiBhIGxpc3QgaG9sZGluZyB0aGUgSVNPIDMxNjYtMiBjb2RlcworCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgTGlzdDxJU09Db2RlMj4gbG9hZElTTzIoU3RyaW5nIGlzb0ZpbGUpIHsKKworCQlTdHJpbmcgYnVmZmVyID0gbnVsbDsKKwkJTGlzdDxJU09Db2RlMj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVNPQ29kZTI+KCk7CisKKwkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gb3BlblJlYWRlcihpc29GaWxlKTsKKwkJdHJ5IHsKKworCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7CisJCQkJd2hpbGUgKEVPRihidWZmZXIgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gdHJ1ZSkgeworCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlYWQgOiAiICsgYnVmZmVyKTsKKwkJCQkJLy8gSWYgdGhpcyBsaW5lIHN0YXJ0cyB3aXRoICIjIiwgdGhlbiBpZ25vcmUgaXQuCisKKwkJCQkJaWYgKGJ1ZmZlci50cmltKCkuc3RhcnRzV2l0aCgiIyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgd2UgbWFyayBhbGwgdW5rbm93biBkYXRhLgorCQkJCQlidWZmZXIgPSBidWZmZXIucmVwbGFjZSgiOzsiLCAiO1VOS05PV047Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQkJCS8vIE1ha2UgaXQgYWxsIHVwcGVyY2FzZQorCQkJCQlidWZmZXIgPSBidWZmZXIudG9VcHBlckNhc2UoKTsKKworCQkJCQkvLyBUb2tlbml6ZQorCQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihidWZmZXIsICI7Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkvLyBHZXQgdG9rZW5zIC0+IG9yZGVyIG1hdHRlcnMgaGVyZSEKKwkJCQkJU3RyaW5nIGFscGhhMiA9IHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCk7CisJCQkJCVN0cmluZyBpZCA9IHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCk7CisJCQkJCVN0cmluZyBuYW1lID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKKwkJCQkJU3RyaW5nIGluZGV4ID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKKworCQkJCQlJU09Db2RlMiBjb2RlID0gbmV3IElTT0NvZGUyKGFscGhhMiwgaWQsIG5hbWUsIGluZGV4KTsKKworCQkJCQkvLyBhZGQgbmV3IGNvZGUgdG8gb3VyIGxpc3QKKwkJCQkJbGlzdC5hZGQoY29kZSk7CisKKwkJCQkJYnVmZmVyID0gbnVsbDsKKwkJCQl9CisJCQkJcmVhZGVyLmNsb3NlKCk7CisJCQl9CisKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQlyZXR1cm4gbGlzdDsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gY29uZmlnRmlsZQorCSAqIEByZXR1cm4gaGFzaCBtYXAgd2l0aCBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgYW5kIHRoZWlyIHZhbHVlcworCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbG9hZENvbmZpZ0ZpbGUoU3RyaW5nIGNvbmZpZ0ZpbGUpIHsKKwkJZmluYWwgaW50IFZBUiA9IDA7CisJCWZpbmFsIGludCBWQUxVRSA9IDE7CisJCWZpbmFsIGludCBUT1RBTCA9IDI7CisJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHZhcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJU3RyaW5nIGJ1ZmZlciA9IG51bGw7CisJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG9wZW5SZWFkZXIoY29uZmlnRmlsZSk7CisKKwkJdHJ5IHsKKwkJCWlmIChyZWFkZXIgIT0gbnVsbCkgeworCQkJCXdoaWxlIChFT0YoYnVmZmVyID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IHRydWUpIHsKKworCQkJCQkvLyBJZiB0aGlzIGxpbmUgc3RhcnRzIHdpdGggIiMiLCB0aGVuIGlnbm9yZSBpdC4KKwkJCQkJaWYgKGJ1ZmZlci50cmltKCkuc3RhcnRzV2l0aCgiIyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCIgKyBidWZmZXIpOyAvLyROT04tTkxTLTEkCisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCWlmIChidWZmZXIuY29udGFpbnMoIj0iKSA9PSBmYWxzZSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQlTeXN0ZW0ub3V0CisJCQkJCQkJCS5wcmludGxuKCJcdFx0QmFkIGNvbmZpZ3VyYXRpb24gZmlsZSAtLSBmb3JtYXQgc2hvdWxkIGJlIDogVkFSID0gVkFMVUUgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdElnbm9yaW5nIGxpbmUgOiAiICsgYnVmZmVyKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJY29udGludWU7CisJCQkJCX0KKworCQkJCQlTdHJpbmdbXSB0b2tlbnMgPSBidWZmZXIudHJpbSgpLnNwbGl0KCI9Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJCQlpZiAodG9rZW5zLmxlbmd0aCA8IFRPVEFMKSB7CisJCQkJCQlTeXN0ZW0ub3V0CisJCQkJCQkJCS5wcmludGxuKCJcdFx0QmFkIGNvbmZpZ3VyYXRpb24gZmlsZSAtLSBmb3JtYXQgc2hvdWxkIGJlIDogIFZBUiA9IFZBTFVFICAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0SWdub3JpbmcgbGluZSA6ICIgKyBidWZmZXIpOyAvLyROT04tTkxTLTEkCisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCS8vIEdldCB2YXJpYWJsZSBhbmQgdmFsdWUgYW5kIGlnbm9yZSBldmVyeXRoaW5nIGVsc2Ugb24gdGhlCisJCQkJCS8vIGxpbmUuCisJCQkJCVN0cmluZyB2YXIgPSB0b2tlbnNbVkFSXS50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKwkJCQkJU3RyaW5nIHZhbHVlID0gdG9rZW5zW1ZBTFVFXS50cmltKCk7CisKKwkJCQkJLy8gQ2hlY2sgdGhhdCBpdCBpcyBhIHZhbGlkIENPTkZJR1VSQVRJT04gVkFSSUFCTEUKKwkJCQkJaWYgKHZlcmlmeVZhcih2YXIpID09IGZhbHNlKSB7CisJCQkJCQlTeXN0ZW0ub3V0CisJCQkJCQkJCS5wcmludGxuKCJcdFx0QmFkIGNvbmZpZ3VyYXRpb24gZmlsZSAtLSBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgOiAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIHZhcik7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRJZ25vcmluZyBsaW5lIDogIiArIGJ1ZmZlcik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0PCs+IiArIGJ1ZmZlcik7IC8vJE5PTi1OTFMtMSQKKworCQkJCQl2YXJzLnB1dCh2YXIsIHZhbHVlKTsKKworCQkJCX0KKwkJCX0KKworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisKKwkJLy8gVmVyaWZ5IHRoYXQgd2UgaGF2ZSBhIHZhbGlkIHdvcmtzcGFjZS4gSXQgaXMgdGhlIG9ubHkgbm9uLW9wdGlvbmFsCisJCS8vIHZhcmlhYmxlLgorCQlpZiAoR2VuVXRpbHMudmVyaWZ5V29ya3NwYWNlKHZhcnMpID09IGZhbHNlKSB7CisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJcdFx0QmFkIGNvbmZpZ3VyYXRpb24gZmlsZSAtLSBXT1JLU1BBQ0UgdmFyaWFibGUgbm90IGZvdW5kLiBQbGVhc2UgdXNlIGZvcm1hdCBWQVIgPSBWQUxVRSAoaS5lLiBXT1JLU1BBQ0UgPSBDOlxcc3RlbUlJXFwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdElnbm9yaW5nIGxpbmUgOiAiICsgYnVmZmVyKTsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJcmV0dXJuIHZhcnM7CisKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gdmFyCisJICogQHJldHVybiBib29sZWFuCisJICovCisJc3RhdGljIHByb3RlY3RlZCBib29sZWFuIHZlcmlmeVZhcihTdHJpbmcgdmFyKSB7CisKKwkJaWYgKHZhci5lcXVhbHMoIldPUktTUEFDRSIpIHx8IHZhci5lcXVhbHMoIklTTzMxNjZfMSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCXx8IHZhci5lcXVhbHMoIklTTzMxNjZfMiIpIHx8IHZhci5lcXVhbHMoIklTT19GSVgiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQl8fCB2YXIuZXF1YWxzKCJQT1BfUFJPRklMRVMiKSB8fCB2YXIuZXF1YWxzKCJMRVhfRElSIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJfHwgdmFyLmVxdWFscygiVEFSR0VUX0xJU1QiKSB8fCB2YXIuZXF1YWxzKCJBUkVBX1BPUCIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCXx8IHZhci5lcXVhbHMoIlBPTFlHT05fQVJFQVMiKSB8fCB2YXIuZXF1YWxzKCJPVVRQVVQiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCisJCQkJfHwgdmFyLmVxdWFscygiUFJPUEVSVElFU19PVVRQVVQiKSB8fCB2YXIuZXF1YWxzKCJNQVBfT1VUUFVUIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJfHwgdmFyLmVxdWFscygiVEhSRVNIT0xEIikgfHwgdmFyLmVxdWFscygiTkFNRVNfTElTVCIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKKwkJCQl8fCB2YXIuZXF1YWxzKCJJVEVSQVRJT05TIikgfHwgdmFyLmVxdWFscygiUkVEVUNFX0xJU1QiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQl8fCB2YXIuZXF1YWxzKCJJTlBVVCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIHZhcnMgLS0KKwkgKiAgICAgICAgICAgIGFsbCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKKwkgKiBAcmV0dXJuIGZhbHNlIGlmIHdlIGRvbnQgaGF2ZSBhIHZhbGlkIHdvcmtzcGFjZSB2YXJpYWJsZQorCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJpZnlXb3Jrc3BhY2UoSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFycykgeworCisJCVNldDxTdHJpbmc+IGtleXMgPSB2YXJzLmtleVNldCgpOworCQlJdGVyYXRvciBpdCA9IGtleXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJU3RyaW5nIHZhciA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKwkJCWlmICh2YXIuZXF1YWxzKCJXT1JLU1BBQ0UiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIHZhcnMgLS0KKwkgKiAgICAgICAgICAgIGFsbCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKKwkgKiBAcmV0dXJuIGZhbHNlIGlmIHdlIGRvbnQgaGF2ZSBhIHZhbGlkIG91dHB1dCBkaXJlY3RvcnkKKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5T3V0cHV0RGlyZWN0b3J5KEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHZhcnMpIHsKKworCQlTZXQ8U3RyaW5nPiBrZXlzID0gdmFycy5rZXlTZXQoKTsKKwkJSXRlcmF0b3IgaXQgPSBrZXlzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyB2YXIgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisJCQlpZiAodmFyLmVxdWFscygiT1VUUFVUIikgfHwgdmFyLmVxdWFscygiTUFQX09VVFBVVCIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQl8fCB2YXIuZXF1YWxzKCJQUk9QRVJUSUVTX09VVFBVVCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBMb2FkIHNlbGVjdGl2ZWx5IHRoZSBJU08gMzE2Ni0yIGRhdGEgZm9yIHRoZSBjb3VudHJ5IGRlc2NyaWJlZCBieSBkZXNjCisJICogCisJICogQHBhcmFtIGlzb0ZpbGUKKwkgKiAgICAgICAgICAgIGZpbGUgY29udGFpbmluZyBJU08gMzE2Ni0yIGNvZGVzCisJICogQHBhcmFtIGRlc2MKKwkgKiAgICAgICAgICAgIElTTzMxNjYtMiB0d28gbGV0dGVyIGNvdW50cnkgY29kZQorCSAqIAorCSAqIEByZXR1cm4gYSBsaXN0IGhvbGRpbmcgdGhlIElTTyAzMTY2LTIgY29kZXMKKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIExpc3Q8SVNPQ29kZTI+IGxvYWRJU08yKFN0cmluZyBpc29GaWxlLCBTdHJpbmcgZGVzYykgeworCisJCVN0cmluZyBidWZmZXIgPSBudWxsOworCQlMaXN0PElTT0NvZGUyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJU09Db2RlMj4oKTsKKworCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBvcGVuUmVhZGVyKGlzb0ZpbGUpOworCQl0cnkgeworCisJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKKwkJCQl3aGlsZSAoRU9GKGJ1ZmZlciA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSB0cnVlKSB7CisJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVhZCA6ICIgKyBidWZmZXIpOworCisJCQkJCS8vIElmIHRoaXMgbGluZSBzdGFydHMgd2l0aCAiIyIsIHRoZW4gaWdub3JlIGl0LgorCQkJCQlpZiAoYnVmZmVyLnRyaW0oKS5zdGFydHNXaXRoKCIjIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJY29udGludWU7CisJCQkJCX0KKworCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBtYXJrIGFsbCB1bmtub3duIGRhdGEuCisJCQkJCWJ1ZmZlciA9IGJ1ZmZlci5yZXBsYWNlKCI7OyIsICI7VU5LTk9XTjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQkJLy8gTWFrZSBpdCBhbGwgdXBwZXJjYXNlCisJCQkJCWJ1ZmZlciA9IGJ1ZmZlci50b1VwcGVyQ2FzZSgpOworCisJCQkJCS8vIFRva2VuaXplCisJCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJ1ZmZlciwgIjsiKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJCS8vIEdldCB0b2tlbnMgLT4gb3JkZXIgbWF0dGVycyBoZXJlIQorCQkJCQlTdHJpbmcgYWxwaGEyID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKKwkJCQkJU3RyaW5nIGlkID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKKwkJCQkJU3RyaW5nIG5hbWUgPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOworCQkJCQlTdHJpbmcgaW5kZXggPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOworCisJCQkJCS8vIElmIGN1cnJlbnQgZWxlbWVudCBkb2VzIG5vdCBtYXRjaCBvdXIgdGFyZ2V0LCB0aGVuIGlnbm9yZQorCQkJCQkvLyBpdC4KKwkJCQkJaWYgKGRlc2MuZXF1YWxzKGFscGhhMikgPT0gZmFsc2UpIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJSVNPQ29kZTIgY29kZSA9IG5ldyBJU09Db2RlMihhbHBoYTIsIGlkLCBuYW1lLCBpbmRleCk7CisKKwkJCQkJLy8gYWRkIG5ldyBjb2RlIHRvIG91ciBsaXN0CisJCQkJCWxpc3QuYWRkKGNvZGUpOworCisJCQkJCWJ1ZmZlciA9IG51bGw7CisJCQkJfQorCQkJCXJlYWRlci5jbG9zZSgpOworCQkJfQorCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwkJcmV0dXJuIGxpc3Q7CisJfQorCisJLyoqCisJICogTG9hZCBzZWxlY3RpdmVseSB0aGUgSVNPIDMxNjYtMiBmaXggZGF0YSBmb3IgdGhlIGNvdW50cnkgZGVzY3JpYmVkIGJ5CisJICogZGVzYworCSAqIAorCSAqIEBwYXJhbSBsaXN0CisJICogICAgICAgICAgICBsaXN0IGNvbnRhaW5pbmcgSVNPIDMxNjYtMiBjb2RlcworCSAqIEBwYXJhbSBjb2RlCisJICogICAgICAgICAgICBJU08zMTY2LTEgY29kZSB3aG9zZSBuYW1lIGF0dHJpYnV0ZSB3ZSB3YW50IHRvIG1hdGNoIG9yCisJICogICAgICAgICAgICBmaWx0ZXIuCisJICogCisJICogQHJldHVybiBhIGxpc3QgaG9sZGluZyB0aGUgSVNPIDMxNjYtMiBjb2RlcyBtYXRjaGVkLgorCSAqIAorCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgTGlzdDxJU09Db2RlMj4gZXh0cmFjdERlc2NyaXB0b3JzKExpc3QgbGlzdCwgSVNPQ29kZTEgY29kZSkgeworCisJCUxpc3Q8SVNPQ29kZTI+IGRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxJU09Db2RlMj4oKTsKKworCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKKworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisKKwkJCVN0cmluZyBjdXJyZW50ID0gKFN0cmluZykgaXQubmV4dCgpOworCisJCQlpZiAoY3VycmVudC50cmltKCkuc3RhcnRzV2l0aCgiIyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLy8gVG9rZW5pemUKKwkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGN1cnJlbnQsICI6Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJLy8gR2V0IHRva2VucyAtPiBvcmRlciBtYXR0ZXJzIGhlcmUhCisJCQlTdHJpbmcgY291bnRyeSA9IHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCk7CisJCQlTdHJpbmcgbmFtZSA9IHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCk7CisJCQkvLyBTdHJpbmcgYWxpYXMgPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOworCQkJdG9rZW5zLm5leHRUb2tlbigpOworCQkJU3RyaW5nIGlkID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKKworCQkJLy8gSWYgY3VycmVudCBlbGVtZW50IGRvZXMgbm90IG1hdGNoIG91ciB0YXJnZXQsIHRoZW4gaWdub3JlCisJCQkvLyBpdC4KKwkJCWlmIChjb2RlLmdldE5hbWUoKS5lcXVhbHMoY291bnRyeS50b1VwcGVyQ2FzZSgpKSA9PSBmYWxzZSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlJU09Db2RlMiBuZXdDb2RlID0gbmV3IElTT0NvZGUyKGNvZGUuZ2V0QWxwaGEyKCksIGlkLCBuYW1lLCAiMCIpOyAvLyROT04tTkxTLTEkCisKKwkJCS8vIGFkZCBuZXcgY29kZSB0byBvdXIgbGlzdAorCQkJZGVzY3JpcHRvcnMuYWRkKG5ld0NvZGUpOworCQl9CisKKwkJcmV0dXJuIGRlc2NyaXB0b3JzOworCX0KKworCS8qKgorCSAqIENoZWNrIHRvIHNlZSBpZiB0aGlzIElEIGlzIGEgcmVsZXZhbnQgVVJMIHNvdXJjZSBvciBub3QuIEFzIGFuIGV4YW1wbGUsCisJICogZm9yIGFyZWEgZGF0YSB3ZSBvbmx5IGNhcmUgYWJvdXQgVVJMcyB3aXRoIElEID0gRElWQSBGb3IgUG9wdWxhdGlvbiBkYXRhLAorCSAqIHdlIGNhcmUgYWJvdXQgVVJMcyB3aXRoIElEID0gQ0lBCisJICogCisJICogQHBhcmFtIHVybFNldAorCSAqIEBwYXJhbSBpZAorCSAqIAorCSAqIEByZXR1cm4gd2hldGhlciBhIFVSTCBpcyBwYXJ0IG9mIHRoaXMgVVJMIHNldC4KKwkgKiAKKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIGJvb2xlYW4gaXNTb3VyY2VVUkwoU2V0PFN0cmluZz4gdXJsU2V0LCBTdHJpbmcgaWQpIHsKKworCQlpZiAodXJsU2V0LmNvbnRhaW5zKGlkKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogRmluZCB0aGUgSVNPIENvZGUgZm9yIHRoaXMgY291bnRyeSBhbmQgY3JlYXRlIGFuIElTTyBvYmplY3QgZm9yIGl0LgorCSAqIAorCSAqIEBwYXJhbSBjb3VudHJ5CisJICogICAgICAgICAgICB0aGUgY291bnRyeSB0byBsb29rIGZvci4KKwkgKiAKKwkgKiBAcGFyYW0gY29kZUxpc3QKKwkgKiAgICAgICAgICAgIGEgbGlzdCB3aWxsIGFsbCB0aGUgSVNPIDMxNjYtMSBjb2Rlcy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBJU08gb2JqZWN0IChJU08gaW5mbykgZm9yIHRoaXMgY291bnRyeS4KKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIElTT0NvZGUxIGdldElTT0NvZGUoU3RyaW5nIGNvdW50cnksIExpc3QgY29kZUxpc3QpIHsKKworCQlJdGVyYXRvciBpdCA9IGNvZGVMaXN0Lml0ZXJhdG9yKCk7CisKKwkJU3RyaW5nIGNvdW50cnlTdHIgPSBjb3VudHJ5LnRvVXBwZXJDYXNlKCk7CisKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQlTdHJpbmcgY29kZSA9ICgoU3RyaW5nKSBpdC5uZXh0KCkpLnRvVXBwZXJDYXNlKCk7CisKKwkJCS8vIFRva2VuaXplCisJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb2RlLCAiLCIpOyAvLyROT04tTkxTLTEkCisKKwkJCS8vIEdldCB0b2tlbnMgLT4gb3JkZXIgbWF0dGVycyBoZXJlIQorCQkJU3RyaW5nIG5hbWUgPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOworCQkJU3RyaW5nIG51bWVyaWNfY29kZSA9IHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCk7CisJCQlTdHJpbmcgYWxwaGEzID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKKwkJCVN0cmluZyBhbHBoYTIgPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOworCisJCQlpZiAobmFtZS5lcXVhbHMoY291bnRyeVN0cikpIHsKKwkJCQlyZXR1cm4gbmV3IElTT0NvZGUxKG5hbWUsIG51bWVyaWNfY29kZSwgYWxwaGEyLCBhbHBoYTMpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEV4dHJhY3QgYWxsIHJlbGV2YW50IGRhdGEuIFdlIG5lZWQgOgorCSAqIAorCSAqIFRoZSAzIGxldHRlciBJU08zMTY2LTEgQWxwaGEgMyBjb2RlLCB0aGUgY291bnRyeSBuYW1lLCB0aGUgYWRtaW4xIG5hbWUsCisJICogdGhlIGFkbWluMiBuYW1lLgorCSAqIAorCSAqIEBwYXJhbSBidWZmZXIKKwkgKiAgICAgICAgICAgIGEgYnVmZmVyIG9mIGRpdmEgZGF0YQorCSAqIAorCSAqIEByZXR1cm4gYSBzdHJpbmcgYXJyYXkgaG9sZGluZyB0aGUgZXh0cmFjdGVkIGRhdGEKKwkgKiAKKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIFN0cmluZ1tdIGV4dHJhY3QoU3RyaW5nIGJ1ZmZlcikgeworCisJCVN0cmluZ1tdIGRhdGEgPSBuZXcgU3RyaW5nWzRdOworCisJCS8vIFRva2VuaXplCisJCVN0cmluZ1Rva2VuaXplciBjb2RlID0gbmV3IFN0cmluZ1Rva2VuaXplcihidWZmZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0UmVhZCA6ICIgKyBidWZmZXIpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImFscGhhIDMgY29kZSA6ICIgKyBjb2RlLm5leHRUb2tlbigpKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb3VudHJ5IG5hbWUgY29kZSA6ICIgKyBjb2RlLm5leHRUb2tlbigpKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhZG1pbjEgY29kZSA6ICIgKyBjb2RlLm5leHRUb2tlbigpKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhZG1pbjIgY29kZSA6ICIgKyBjb2RlLm5leHRUb2tlbigpKTsKKwkJLy8gT3JkZXIgbWF0dGVycyBoZXJlLgorCQlkYXRhW0lTT0RhdGEuQUxQSEEzX0NPREVdID0gY29kZS5uZXh0VG9rZW4oKS50cmltKCk7CisJCWRhdGFbSVNPRGF0YS5DT1VOVFJZX05BTUVdID0gY29kZS5uZXh0VG9rZW4oKS50cmltKCk7CisJCWRhdGFbSVNPRGF0YS5BRE1JTjFfTkFNRV0gPSBjb2RlLm5leHRUb2tlbigpLnRyaW0oKTsKKwkJZGF0YVtJU09EYXRhLkFETUlOMl9OQU1FXSA9IGNvZGUubmV4dFRva2VuKCkudHJpbSgpOworCQlyZXR1cm4gZGF0YTsKKwl9CisKKwkvKioKKwkgKiBJbmRpY2F0ZSBFbmQtT2YtRmlsZQorCSAqIAorCSAqIEBwYXJhbSBidWZmZXIKKwkgKiAgICAgICAgICAgIEEgYnVmZmVyIG9mIGRpdmEgZGF0YQorCSAqIAorCSAqIEByZXR1cm4gVHJ1ZSBpZiB3ZSBoYXZlIHJlYWNoZWQgRW5kLU9mLUZpbGUKKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIGJvb2xlYW4gRU9GKFN0cmluZyBidWZmZXIpIHsKKwkJaWYgKGJ1ZmZlciA9PSBudWxsIHx8IGJ1ZmZlci5sZW5ndGgoKSA9PSAwKQorCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBleHRyYWN0cyB0aGUgYWxwaGEgdHdvIGNvZGUgZm9yIGEgc3RhdGUgZnJvbSB0aGUgSVNPMzE2Ni0yCisJICogZGVzY3JpcHRvci4gSW4gb3RoZXIgd29yZHMsIGdpdmVuOiBVUy1OWSwgdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybjogTlkKKwkgKiBVc2VmdWwgZm9yIGdlbmVyYXRpbmcgdGhlIFVTQSBvbmx5LgorCSAqIAorCSAqIEBwYXJhbSBkZXNjcmlwdG9yCisJICogICAgICAgICAgICB0aGUgSVNPMzE2Ni0yIGRlc2NyaXB0b3IuCisJICogCisJICogQHJldHVybiBhbiBBbHBoYSAyIGNvZGUgZm9yIGEgc3RhdGUuCisJICogCisJICovCisJc3RhdGljIHByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdEFscGhhMihTdHJpbmcgZGVzY3JpcHRvcikgeworCisJCWZpbmFsIGludCBBTFBIQTIgPSAxOworCisJCVN0cmluZ1tdIHRva2VucyA9IG51bGw7CisKKwkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgeworCisJCQl0b2tlbnMgPSBkZXNjcmlwdG9yLnNwbGl0KCItIik7IC8vJE5PTi1OTFMtMSQKKworCQl9CisKKwkJaWYgKHRva2Vucy5sZW5ndGggPCBBTFBIQTIpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcmV0dXJuIHRva2Vuc1tBTFBIQTJdOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBleHRyYWN0cyB0aGUgYWxwaGEgb25lIGNvZGUgZm9yIGEgc3RhdGUgZnJvbSB0aGUgSVNPMzE2Ni0yCisJICogZGVzY3JpcHRvci4gSW4gb3RoZXIgd29yZHMsIGdpdmVuOiBVUy1OWSwgdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybjogTlkKKwkgKiBVc2VmdWwgZm9yIGdlbmVyYXRpbmcgdGhlIFVTQSBvbmx5LgorCSAqIAorCSAqIEBwYXJhbSBkZXNjcmlwdG9yCisJICogICAgICAgICAgICB0aGUgSVNPMzE2Ni0yIGRlc2NyaXB0b3IuCisJICogCisJICogQHJldHVybiBhbiBBbHBoYSAxIGNvZGUgZm9yIGNvdW50cnkKKwkgKiAKKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIFN0cmluZyBleHRyYWN0QWxwaGExKFN0cmluZyBkZXNjcmlwdG9yKSB7CisKKwkJZmluYWwgaW50IEFMUEhBMSA9IDA7CisKKwkJU3RyaW5nW10gdG9rZW5zID0gbnVsbDsKKworCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7CisKKwkJCXRva2VucyA9IGRlc2NyaXB0b3Iuc3BsaXQoIi0iKTsgLy8kTk9OLU5MUy0xJAorCisJCX0KKworCQlpZiAodG9rZW5zLmxlbmd0aCA8IEFMUEhBMSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlyZXR1cm4gdG9rZW5zW0FMUEhBMV07CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2ltcGx5IHJldHVybnMgYSBzdHJpbmcgd2l0aCBJQk0ncyBjb3B5cmlnaHQgc3RhdGVtZW50LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGNvcHlyaWdodCBzdGF0ZW1lbnQKKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIFN0cmluZyBnZXRDb3B5cmlnaHQoKSB7CisKKwkJU3RyaW5nIGNvcHlyaWdodCA9ICIjIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiI7IC8vJE5PTi1OTFMtMSQKKwkJY29weXJpZ2h0ICs9ICIjICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuIjsgLy8kTk9OLU5MUy0xJAorCQljb3B5cmlnaHQgKz0gIiMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG4iOyAvLyROT04tTkxTLTEkCisJCWNvcHlyaWdodCArPSAiIyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuIjsgLy8kTk9OLU5MUy0xJAorCQljb3B5cmlnaHQgKz0gIiMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuIjsgLy8kTk9OLU5MUy0xJAorCQljb3B5cmlnaHQgKz0gIiMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuIjsgLy8kTk9OLU5MUy0xJAorCQljb3B5cmlnaHQgKz0gIiMgKlxuIjsgLy8kTk9OLU5MUy0xJAorCQljb3B5cmlnaHQgKz0gIiMgKiBDb250cmlidXRvcnM6XG4iOyAvLyROT04tTkxTLTEkCisJCWNvcHlyaWdodCArPSAiIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbiI7IC8vJE5PTi1OTFMtMSQKKwkJY29weXJpZ2h0ICs9ICIjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4iOyAvLyROT04tTkxTLTEkCisKKwkJcmV0dXJuIGNvcHlyaWdodDsKKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNpbXBseSByZXR1cm5zIGEgc3RyaW5nIHdpdGggYSBjb3B5cmlnaHQgc3RhdGVtZW50IGZvciB0aGUKKwkgKiBFdXJvcGVhbiBkYXRhIChVbml0ZWQgTmF0aW9ucykuCisJICogCisJICogQHJldHVybiB0aGUgbGljZW5zaW5nIHBvbGljeSBmb3IgRXVyb3BlCisJICovCisJc3RhdGljIHByb3RlY3RlZCBTdHJpbmcgZ2V0VU5Qb2xpY3koKSB7CisKKwkJU3RyaW5nIGNvcHlyaWdodCA9ICIjIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiI7IC8vJE5PTi1OTFMtMSQKKwkJY29weXJpZ2h0ICs9ICIjICogVGhlIERhdGEgc291cmNlIGZvciBFdXJvcGUgaXMgXCJVTkVTQ08gKDE5ODcpIHRocm91Z2ggVU5FUC9HUklELUV1cm9wZS5cIlxuIjsgLy8kTk9OLU5MUy0xJAorCQljb3B5cmlnaHQgKz0gIiMgKiBGb3IgbW9yZSBkZXRhaWxzIHBsZWFzZSB2aXNpdCA6IGh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvcG9saWN5LnBocFxuIjsgLy8kTk9OLU5MUy0xJAorCQljb3B5cmlnaHQgKz0gIiMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiI7IC8vJE5PTi1OTFMtMSQKKworCQlyZXR1cm4gY29weXJpZ2h0OworCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2ltcGx5IHJldHVybnMgYSBzdHJpbmcgd2l0aCBhIGNvcHlyaWdodCBzdGF0ZW1lbnQgZm9yIHRoZQorCSAqIEV1cm9wZWFuIGRhdGEgKFVuaXRlZCBOYXRpb25zKS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsaWNlbnNpbmcgcG9saWN5IGZvciBFdXJvcGUKKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIFN0cmluZyBnZXRHTUxVTlBvbGljeSgpIHsKKworCQlTdHJpbmcgY29weXJpZ2h0ID0gIjwhLS0gXG4iOyAvLyROT04tTkxTLTEkCisJCWNvcHlyaWdodCArPSAiIyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iOyAvLyROT04tTkxTLTEkCisJCWNvcHlyaWdodCArPSAiIyAqIFRoZSBEYXRhIHNvdXJjZSBmb3IgRXVyb3BlIGlzIFwiVU5FU0NPICgxOTg3KSB0aHJvdWdoIFVORVAvR1JJRC1FdXJvcGUuXCJcbiI7IC8vJE5PTi1OTFMtMSQKKwkJY29weXJpZ2h0ICs9ICIjICogRm9yIG1vcmUgZGV0YWlscyBwbGVhc2UgdmlzaXQgOiBodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL3BvbGljeS5waHBcbiI7IC8vJE5PTi1OTFMtMSQKKwkJY29weXJpZ2h0ICs9ICIjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT5cblxuIjsgLy8kTk9OLU5MUy0xJAorCisJCXJldHVybiBjb3B5cmlnaHQ7CisKKwl9CisKKwkvKioKKwkgKiBGaW5kIGEgZGVzY3JpcHRvciBmb3IgdGhlIFVTQSBiYXNlZCBvbiB0aGUgbG9jYXRpb24ncyBuYW1lLgorCSAqIAorCSAqIEBwYXJhbSBjb3VudHkgLQorCSAqICAgICAgICAgICAgdGhlIGNvdW50eSBmb3Igd2hpY2ggd2Ugd2FudCB0byBmaW5kIHRoZSBkZXNjcmlwdG9yCisJICogCisJICogQHBhcmFtIHN0YXRlSUQgLQorCSAqICAgICAgICAgICAgdGhlIElEIGZvciB0aGUgc3RhdGUgaW4gd2hpY2ggdGhpcyBjb3VudHkgaXMgbG9jYXRlZAorCSAqIAorCSAqIEBwYXJhbSBMaXN0IC0KKwkgKiAgICAgICAgICAgIGEgbGlzdCBjb250YWluaW5nIChkZXNjcmlwdG9yOmxvY2F0aW9uKSB0dXBsZXMKKwkgKiAKKwkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBkZXNjcmlwdG9yCisJICovCisJc3RhdGljIHByb3RlY3RlZCBTdHJpbmcgZ2V0VVNBRGVzY3JpcHRvcihTdHJpbmcgY291bnR5LCBTdHJpbmcgc3RhdGVJRCwKKwkJCUxpc3QgbGlzdCkgeworCisJCWZpbmFsIGludCBERVNDUklQVE9SID0gMDsKKworCQlmaW5hbCBpbnQgTE9DQVRJT04gPSAxOworCisJCVN0cmluZ1tdIGRhdGEgPSBudWxsOworCisJCUl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOworCisJCVN0cmluZyBjb3VudHlTdHIgPSBjb3VudHkudG9VcHBlckNhc2UoKS50cmltKCk7CisKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQlTdHJpbmcgbWluaUJ1ZmZlciA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKworCQkJaWYgKG1pbmlCdWZmZXIuY29udGFpbnMoIiMiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWRhdGEgPSBtaW5pQnVmZmVyLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJLy8gR2V0IHRoZSBsb2NhdGlvbiBuYW1lIGFuZCByZW1vdmUgYmxhbmtzCisJCQlTdHJpbmcgbG9jYXRpb24gPSBkYXRhW0xPQ0FUSU9OXS50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKworCQkJbG9jYXRpb24gPSBsb2NhdGlvbi5yZXBsYWNlKCJcXHQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQlpZiAoY291bnR5U3RyLmVxdWFscyhsb2NhdGlvbikpIHsKKworCQkJCS8vIENoZWNrIGJvdGggZW50aXRpZXMgYmVsb25nIHRvIHNhbWUgc3RhdGUKKwkJCQlpZiAoZGF0YVtERVNDUklQVE9SXS5jb250YWlucyhzdGF0ZUlEKSA9PSBmYWxzZSkgeworCQkJCQkvLyBJZ25vcmUgOiBzYW1lIG5hbWUgLCBidXQgZGlmZmVyZW50IGxldmVsCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlyZXR1cm4gZGF0YVtERVNDUklQVE9SXTsKKwkJCX0KKworCQl9IC8vIHdoaWxlCisKKwkJLy8gTm90IGZvdW5kCisJCXJldHVybiAiTm90IEZvdW5kIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNpbXBseSByZXR1cm5zIGEgc3RyaW5nIGV4cGxhaW5pbmcgd2hhdCBhIGtleSBpcyBpbiBvdXIKKwkgKiBwcm9wZXJ0aWVzIGZpbGVzLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGV4cGxhbmF0aW9uIG9mIHRoZSBrZXkgZm9ybWF0IHdlIHVzZSBpbiBvdXIgcHJvcGVydGllcyBhbmQKKwkgKiAgICAgICAgIEdNTCBmaWxlcy4KKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIFN0cmluZyBnZXRLZXlGb3JtYXRFeHBsYW5hdGlvbigpIHsKKworCQlTdHJpbmcgZm9ybWF0ID0gIiMgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiI7IC8vJE5PTi1OTFMtMSQKKwkJZm9ybWF0ICs9ICIjICogS2V5IEZvcm1hdDogXG4iOyAvLyROT04tTkxTLTEkCisJCWZvcm1hdCArPSAiIyAqIFxuIjsgLy8kTk9OLU5MUy0xJAorCQlmb3JtYXQgKz0gIiMgKiBcdCBGb3IgbGV2ZWwgMSBkYXRhLCB0aGUga2V5IGlzIHRoZSBJU08zMTY2LTIgY29kZS4gQW4gSVNPMzE2Ni0yIGNvZGUgaXMgY29tcG9zZWQgYXMgZm9sbG93czogXG4iOyAvLyROT04tTkxTLTEkCisJCWZvcm1hdCArPSAiIyAqIGEgdHdvIGxldHRlciBjb3VudHJ5IGNvZGUgZm9sbG93ZWQgYnkgdXAgdG8gdGhyZWUgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgZm9yIHRoZSBsZXZlbCAxIGFkbWluaXN0cmF0aW9uLlxuIjsgLy8kTk9OLU5MUy0xJAorCQlmb3JtYXQgKz0gIiMgKlxuIjsgLy8kTk9OLU5MUy0xJAorCQlmb3JtYXQgKz0gIiMgKiBcdCBGb3IgbGV2ZWwgMiBkYXRhLCB0aGUga2V5IGlzIHRoZSBJU08zMTY2LTIgY29kZSBmb2xsb3dlZCBieSBzaXggZGlnaXRzLiBUaGUgbGVmdG1vc3QgdHdvIGRpZ2l0cyBpbmRpY2F0ZVxuIjsgLy8kTk9OLU5MUy0xJAorCQlmb3JtYXQgKz0gIiMgKiB0aGUgbGV2ZWwgMSBjb250YWluZXIgb2YgYSBsZXZlbCAyIGFkbWluaXN0cmF0aW9uIChpLmUuIENhbGlmb3JuaWEgaXMgYSBsZXZlbCAxIGNvbnRhaW5lciBmb3IgT3JhbmdlIENvdW50eVxuIjsgLy8kTk9OLU5MUy0xJAorCQlmb3JtYXQgKz0gIiMgKiB3aGljaCBpcyBhIGxldmVsIDIgYWRtaW5pc3RyYXRpb24pLiAgVGhlIHR3byBkaWdpdHMgd2VyZSB0YWtlbiBmcm9tIGEgbGV4aWNvZ3JhcGhpYyBzb3J0aW5nIG9mIGFsbCB0aGVcbiI7IC8vJE5PTi1OTFMtMSQKKwkJZm9ybWF0ICs9ICIjICogbGV2ZWwgMSBhZG1pbmlzdHJhdGlvbnMgd2l0aGluIGEgY291bnRyeS4gU2ltaWxhcmx5LCB0aGUgZm91ciBsZWZ0bW9zdCBkaWdpdHMgaW5kaWNhdGUgYSBsZXZlbCAyIGFkbWluaXN0cmF0aW9uLlxuIjsgLy8kTk9OLU5MUy0xJAorCQlmb3JtYXQgKz0gIiMgKiBBZ2FpbiwgdGhlc2UgZm91ciBkaWdpdHMgYXJlIGFuIGluZGV4IGludG8gdGhlIGxleGljb2dyYXBoaWMgc29ydGluZyBvZiBhbGwgbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbnMgd2l0aGluIFxuIjsgLy8kTk9OLU5MUy0xJAorCQlmb3JtYXQgKz0gIiMgKiBhIGxldmVsIDEgYWRtaW5pc3RyYXRpb24uIFxuIjsgLy8kTk9OLU5MUy0xJAorCQlmb3JtYXQgKz0gIiMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4iOyAvLyROT04tTkxTLTEkCisKKwkJcmV0dXJuIGZvcm1hdDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBzaW1wbHkgcmV0dXJucyBhIHN0cmluZyBleHBsYWluaW5nIHdoYXQgYSBrZXkgaXMgaW4gb3VyIEdNTAorCSAqIGZpbGVzLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGV4cGxhbmF0aW9uIG9mIHRoZSBrZXkgZm9ybWF0IHdlIHVzZSBpbiBvdXIgcHJvcGVydGllcyBhbmQKKwkgKiAgICAgICAgIEdNTCBmaWxlcy4KKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIFN0cmluZyBnZXRHTUxLZXlGb3JtYXRFeHBsYW5hdGlvbigpIHsKKworCQlTdHJpbmcgZm9ybWF0ID0gIjwhLS0gXG4iOyAvLyROT04tTkxTLTEkCisJCWZvcm1hdCArPSAiIyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIjsgLy8kTk9OLU5MUy0xJAorCQlmb3JtYXQgKz0gIiMgKiBLZXkgRm9ybWF0OiBcbiI7IC8vJE5PTi1OTFMtMSQKKwkJZm9ybWF0ICs9ICIjICogXG4iOyAvLyROT04tTkxTLTEkCisJCWZvcm1hdCArPSAiIyAqIFx0IEZvciBsZXZlbCAxIGRhdGEsIHRoZSBrZXkgaXMgdGhlIElTTzMxNjYtMiBjb2RlLiBBbiBJU08zMTY2LTIgY29kZSBpcyBjb21wb3NlZCBhcyBmb2xsb3dzOiBcbiI7IC8vJE5PTi1OTFMtMSQKKwkJZm9ybWF0ICs9ICIjICogYSB0d28gbGV0dGVyIGNvdW50cnkgY29kZSBmb2xsb3dlZCBieSB1cCB0byB0aHJlZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBmb3IgdGhlIGxldmVsIDEgYWRtaW5pc3RyYXRpb24uXG4iOyAvLyROT04tTkxTLTEkCisJCWZvcm1hdCArPSAiIyAqXG4iOyAvLyROT04tTkxTLTEkCisJCWZvcm1hdCArPSAiIyAqIFx0IEZvciBsZXZlbCAyIGRhdGEsIHRoZSBrZXkgaXMgdGhlIElTTzMxNjYtMiBjb2RlIGZvbGxvd2VkIGJ5IHNpeCBkaWdpdHMuIFRoZSBsZWZ0bW9zdCB0d28gZGlnaXRzIGluZGljYXRlXG4iOyAvLyROT04tTkxTLTEkCisJCWZvcm1hdCArPSAiIyAqIHRoZSBsZXZlbCAxIGNvbnRhaW5lciBvZiBhIGxldmVsIDIgYWRtaW5pc3RyYXRpb24gKGkuZS4gQ2FsaWZvcm5pYSBpcyBhIGxldmVsIDEgY29udGFpbmVyIGZvciBPcmFuZ2UgQ291bnR5XG4iOyAvLyROT04tTkxTLTEkCisJCWZvcm1hdCArPSAiIyAqIHdoaWNoIGlzIGEgbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbikuICBUaGUgdHdvIGRpZ2l0cyB3ZXJlIHRha2VuIGZyb20gYSBsZXhpY29ncmFwaGljIHNvcnRpbmcgb2YgYWxsIHRoZVxuIjsgLy8kTk9OLU5MUy0xJAorCQlmb3JtYXQgKz0gIiMgKiBsZXZlbCAxIGFkbWluaXN0cmF0aW9ucyB3aXRoaW4gYSBjb3VudHJ5LiBTaW1pbGFybHksIHRoZSBmb3VyIGxlZnRtb3N0IGRpZ2l0cyBpbmRpY2F0ZSB0aGUgbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbi5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJZm9ybWF0ICs9ICIjICogQWdhaW4sIHRoZXNlIGZvdXIgZGlnaXRzIGFyZSBhbiBpbmRleCBpbnRvIHRoZSBsZXhpY29ncmFwaGljIHNvcnRpbmcgb2YgYWxsIGxldmVsIDIgYWRtaW5pc3RyYXRpb25zIHdpdGhpbiBcbiI7IC8vJE5PTi1OTFMtMSQKKwkJZm9ybWF0ICs9ICIjICogYSBsZXZlbCAxIGFkbWluaXN0cmF0aW9uLiBcbiI7IC8vJE5PTi1OTFMtMSQKKwkJZm9ybWF0ICs9ICIjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gXG5cbiI7IC8vJE5PTi1OTFMtMSQKKworCQlyZXR1cm4gZm9ybWF0OworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNpbXBseSByZXR1cm5zIGEgc3RyaW5nIHdpdGggSUJNJ3MgY29weXJpZ2h0IHN0YXRlbWVudAorCSAqIGNvbW1lbnRlZCBvdXQgZm9yIEdNTCBmaWxlcy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50CisJICovCisJc3RhdGljIHByb3RlY3RlZCBTdHJpbmcgZ2VHTUxDb3B5cmlnaHQoKSB7CisKKwkJU3RyaW5nIGNvcHlyaWdodCA9ICI8IS0tIFxuIjsgLy8kTk9OLU5MUy0xJAorCQljb3B5cmlnaHQgKz0gIiMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iOyAvLyROT04tTkxTLTEkCisJCWNvcHlyaWdodCArPSAiIyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJY29weXJpZ2h0ICs9ICIjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuIjsgLy8kTk9OLU5MUy0xJAorCQljb3B5cmlnaHQgKz0gIiMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcbiI7IC8vJE5PTi1OTFMtMSQKKwkJY29weXJpZ2h0ICs9ICIjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcbiI7IC8vJE5PTi1OTFMtMSQKKwkJY29weXJpZ2h0ICs9ICIjICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcbiI7IC8vJE5PTi1OTFMtMSQKKwkJY29weXJpZ2h0ICs9ICIjICpcbiI7IC8vJE5PTi1OTFMtMSQKKwkJY29weXJpZ2h0ICs9ICIjICogQ29udHJpYnV0b3JzOlxuIjsgLy8kTk9OLU5MUy0xJAorCQljb3B5cmlnaHQgKz0gIiMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4iOyAvLyROT04tTkxTLTEkCisJCWNvcHlyaWdodCArPSAiIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiBcbiI7IC8vJE5PTi1OTFMtMSQJCQorCisJCXJldHVybiBjb3B5cmlnaHQ7CisKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBGaW5kIHRoZSBjb3VudHJ5IG5hbWUgYnkgZG9pbmcgYSByZXZlcnNlIGxvb2t1cCBiYXNlZCBvbiB0aGUgYWxwaGEgMgorCSAqIGNvZGVzCisJICogCisJICogQHBhcmFtIGFscGhhMgorCSAqIEBwYXJhbSBjb2RlTGlzdAorCSAqIAorCSAqIEByZXR1cm4gY291bnRyeSBuYW1lCisJICovCisJc3RhdGljIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q291bnRyeU5hbWUoU3RyaW5nIGFscGhhMkNvZGUsIExpc3QgY29kZUxpc3QpIHsKKworCQlJdGVyYXRvciBpdCA9IGNvZGVMaXN0Lml0ZXJhdG9yKCk7CisKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQlTdHJpbmcgY29kZSA9ICgoU3RyaW5nKSBpdC5uZXh0KCkpLnRvVXBwZXJDYXNlKCk7CisKKwkJCS8vIFRva2VuaXplCisJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb2RlLCAiLCIpOyAvLyROT04tTkxTLTEkCisKKwkJCS8vIEdldCB0b2tlbnMgLT4gb3JkZXIgbWF0dGVycyBoZXJlIQorCQkJU3RyaW5nIG5hbWUgPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOworCQkJdG9rZW5zLm5leHRUb2tlbigpOyAvLyB0aGUgbnVtZXJpYyBjb2RlLCBpZ25vcmUuCisJCQl0b2tlbnMubmV4dFRva2VuKCk7IC8vIHRoZSBhbHBoYTMgY29kZSwgaWdub3JlLgorCQkJU3RyaW5nIGFscGhhMiA9IHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCkudG9VcHBlckNhc2UoKTsKKworCQkJaWYgKGFscGhhMi5lcXVhbHMoYWxwaGEyQ29kZS50b1VwcGVyQ2FzZSgpKSkgeworCQkJCXJldHVybiBuYW1lOworCQkJfQorCQl9CisJCS8vIE5vdCBmb3VuZC4KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogCisJICogRmluZCB0aGUgY291bnRyeSBuYW1lIGJ5IGRvaW5nIGEgcmV2ZXJzZSBsb29rdXAgYmFzZWQgb24gdGhlIG51bWVyaWMgY29kZQorCSAqIGZvciBhIGdpdmVuIEV1cm9wZWFuIGxvY2F0aW9uCisJICogCisJICogQHBhcmFtIG51bUlECisJICogICAgICAgICAgICB0aGUgbnVtZXJpY2FsIElEIGZvciBhIGxvY2F0aW9uIGluIEV1cm9wZQorCSAqIEBwYXJhbSBjb2RlTGlzdAorCSAqIAorCSAqIEByZXR1cm4gY291bnRyeSBuYW1lCisJICovCisJc3RhdGljIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXVyb3BlYW5Mb2NhdGlvbihTdHJpbmcgbnVtSUQsIExpc3QgY29kZUxpc3QpIHsKKworCQlmaW5hbCBpbnQgTlVNQ09ERSA9IDA7CisJCWZpbmFsIGludCBMT0NBVElPTl9OQU1FID0gMTsKKworCQlJdGVyYXRvciBpdCA9IGNvZGVMaXN0Lml0ZXJhdG9yKCk7CisKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQlTdHJpbmcgbG9jID0gKChTdHJpbmcpIGl0Lm5leHQoKSk7CisJCQlsb2MgPSBsb2MucmVwbGFjZSgnXHQnLCAnICcpOworCQkJU3RyaW5nW10gdG9rZW5zID0gbG9jLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZyBjb2RlID0gdG9rZW5zW05VTUNPREVdLnRyaW0oKTsKKwkJCVN0cmluZyBuYW1lID0gdG9rZW5zW0xPQ0FUSU9OX05BTUVdOworCQkJaWYgKG51bUlELmVxdWFscyhjb2RlKSkgeworCQkJCXJldHVybiBuYW1lOworCQkJfQorCQl9CisJCS8vIE5vdCBmb3VuZC4KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogRG8gYSBsb29rdXAgaW4gdGhlIGxleDIgbGlzdCBmb3IgdGhlIGN1cnJlbnQgZW50cnkuCisJICogCisJICogQHBhcmFtIGxpc3QKKwkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBsZXgyIG9iamVjdHMuCisJICogQHBhcmFtIGFkbWluMQorCSAqICAgICAgICAgICAgYW4gYWRtaW5pc3RyYXRpdmUgMSBsb2NhdGlvbi4KKwkgKiBAcGFyYW0gYWRtaW4yCisJICogICAgICAgICAgICBhbiBhZG1pbmlzdHJhdGl2ZSAyIGxvY2F0aW9uLgorCSAqIAorCSAqIEByZXR1cm4gYSBsZXgyIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgbG9jYXRpb24uCisJICogCisJICovCisJc3RhdGljIHByb3RlY3RlZCBMZXgyT2JqIGxleDJMb29rdXAoTGlzdDxMZXgyT2JqPiBsaXN0LCBTdHJpbmcgYWRtaW4xLAorCQkJU3RyaW5nIGFkbWluMikgeworCisJCUxleDJPYmogbGV4T2JqID0gbnVsbDsKKwkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7CisKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJbGV4T2JqID0gKExleDJPYmopIGl0Lm5leHQoKTsKKwkJCWlmIChhZG1pbjIudG9VcHBlckNhc2UoKS5lcXVhbHMobGV4T2JqLmdldEFkbWluMigpKQorCQkJCQkmJiBhZG1pbjEudG9VcHBlckNhc2UoKS5lcXVhbHMobGV4T2JqLmdldEFkbWluMSgpKSkgeworCQkJCXJldHVybiBsZXhPYmo7CisJCQl9CisJCX0KKwkJLy8gTm90IGZvdW5kLgorCQkvLyBTeXN0ZW0ub3V0CisJCS8vIC5wcmludGxuKCJsZXgyTG9va3VwIDogZW50cnkgbm90IGZvdW5kLiBDcmVhdGluZyBkdW1teSBsZXgyT2JqZWN0IGZvcgorCQkvLyA6ICIKKwkJLy8gKyBhZG1pbjIpOworCQlyZXR1cm4gbmV3IExleDJPYmooIjAiLCAiQUEiLCAiQUFBIiwgIkRVTU1ZIiwgIkZPTyIsICJGT08iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKKwl9CisKKwkvKioKKwkgKiBEbyBhIGxvb2t1cCBpbiB0aGUgbGV4MSBsaXN0IGZvciB0aGUgY3VycmVudCBlbnRyeS4gKgorCSAqIAorCSAqIEBwYXJhbSBsaXN0CisJICogICAgICAgICAgICBhIGxpc3Qgb2YgbGV4MSBvYmplY3RzLgorCSAqIEBwYXJhbSBhZG1pbjEKKwkgKiAgICAgICAgICAgIGFuIGFkbWluaXN0cmF0aXZlIDEgbG9jYXRpb24uCisJICogCisJICogQHJldHVybiBhIGxleDEgb2JqZWN0IGZvciB0aGUgY3VycmVudCBsb2NhdGlvbi4KKwkgKiAKKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIExleDFPYmogbGV4MUxvb2t1cChMaXN0PExleDFPYmo+IGxpc3QsIFN0cmluZyBlbnRyeSkgeworCisJCWlmIChsaXN0ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7CisJCVN0cmluZ1tdIGNvbXBhcmUgPSBudWxsOworCQlMZXgxT2JqIGxleE9iaiA9IG51bGw7CisKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQlsZXhPYmogPSAoTGV4MU9iaikgaXQubmV4dCgpOworCisJCQlpZiAobGV4T2JqLmdldEFkbWluMSgpLmNvbnRhaW5zKCJbIikpIHsgLy8kTk9OLU5MUy0xJAorCisJCQkJU3RyaW5nIHRlbXBIb2xkZXIgPSBsZXhPYmouZ2V0QWRtaW4xKCkucmVwbGFjZSgiXSIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQkvLyBUb2tlbml6ZQorCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRlbXBIb2xkZXIsICJbIik7IC8vJE5PTi1OTFMtMSQKKworCQkJCS8vIEdldCB0b2tlbnMgLT4gb3JkZXIgbWF0dGVycyBoZXJlIQorCQkJCWNvbXBhcmUgPSBuZXcgU3RyaW5nW3Rva2Vucy5jb3VudFRva2VucygpXTsKKwkJCQlpbnQgaSA9IDA7CisJCQkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQkJY29tcGFyZVtpKytdID0gdG9rZW5zLm5leHRUb2tlbigpLnRvVXBwZXJDYXNlKCkudHJpbSgpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGNvbXBhcmUgIT0gbnVsbCkgeworCQkJCS8vIFdlIGhhdmUgbW9yZSB0aGFuIG9uZSBlbnRyeSB0byBjb21wYXJlIHRvLiBFeAorCQkJCS8vIDE4OkFGLUtOUjpBRjpLT05BUiBbS1VOQVJdCisJCQkJLy8gV2UgaGF2ZSB0byBjb21wYXJlIGluZGl2aWR1YWxseSBhZ2FpbnN0IEtPTkFSIGFuZCBLVU5BUgorCQkJCS8vIEFsc28sIHJlbW92ZSBoeXBoZW5zLiBFeC4gZm9yIEFsZ2VyaWE6IFRpemktT3V6b3Ugc2hvdWxkIGJlCisJCQkJLy8gVGl6aSBPdXpvdQorCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcGFyZS5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAoZW50cnkudG9VcHBlckNhc2UoKS5yZXBsYWNlKCItIiwgIiAiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkuZXF1YWxzKGNvbXBhcmVbaV0pKSB7CisJCQkJCQlyZXR1cm4gbGV4T2JqOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoZW50cnkudG9VcHBlckNhc2UoKS5yZXBsYWNlKCItIiwgIiAiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJLmVxdWFscyhsZXhPYmouZ2V0QWRtaW4xKCkpKSB7CisJCQkJcmV0dXJuIGxleE9iajsKKwkJCX0KKwkJfQorCQkvLyBOb3QgZm91bmQuCisJCS8vIFN5c3RlbS5vdXQKKwkJLy8gLnByaW50bG4oImxleDFMb29rdXAgOiBlbnRyeSBub3QgZm91bmQuIENyZWF0aW5nIGR1bW15IGxleDFPYmplY3QgZm9yCisJCS8vIDogIgorCQkvLyArIGVudHJ5KTsKKwkJcmV0dXJuIG5ldyBMZXgxT2JqKCIwIiwgbGV4T2JqLmdldEFscGhhMigpICsgIi1VTksiLCAiQUEiLCAiRk9PIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBUaGlzIG1ldGhvZCB0YWtlcyBhIExpc3Q8U3RyaW5nPiBhbmQgcHJvZHVjZXMgYSBsaXN0IG9mIExleDFPYmplY3RzCisJICogCisJICogQHBhcmFtIGxpc3QKKwkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBsb2NhdGlvbnMKKwkgKiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBsZXgxIG9iamVjdHMuCisJICovCisJc3RhdGljIHByb3RlY3RlZCBMaXN0PExleDFPYmo+IGNyZWF0ZUxleDFMaXN0KExpc3Q8U3RyaW5nPiBsaXN0KSB7CisKKwkJU3RyaW5nW10gbGV4MURhdGEgPSBudWxsOworCQlMaXN0PExleDFPYmo+IGxleDFMaXN0ID0gbnVsbDsKKworCQlpZiAobGlzdCAhPSBudWxsKSB7CisKKwkJCUl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQkJLy8gR2V0IHRoZSBjb250ZW50CisJCQkJU3RyaW5nIGNvbnRlbnQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisKKwkJCQkvLyBUb2tlbml6ZSB0aGUgc3RyaW5nCisJCQkJU3RyaW5nVG9rZW5pemVyIGNvZGUgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbnRlbnQsICI6Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJCS8vIEFyZSB3ZSBkZWFsaW5nIHdpdGggYSBsZXgxIG9iamVjdCBvciB3aXRoIGEgbGV4MiBvYmplY3QgPworCQkJCWlmIChjb2RlLmNvdW50VG9rZW5zKCkgPT0gTGV4MURhdGEuQ09OU1RBTlRTKSB7CisKKwkJCQkJaWYgKGxleDFEYXRhID09IG51bGwpIHsKKwkJCQkJCWxleDFEYXRhID0gbmV3IFN0cmluZ1tMZXgxRGF0YS5DT05TVEFOVFNdOworCQkJCQl9CisKKwkJCQkJLy8gT3JkZXIgbWF0dGVycyBoZXJlLgorCQkJCQlsZXgxRGF0YVtMZXgxRGF0YS5JTkRFWF0gPSBjb2RlLm5leHRUb2tlbigpLnRyaW0oKTsKKwkJCQkJbGV4MURhdGFbTGV4MURhdGEuREVTQ10gPSBjb2RlLm5leHRUb2tlbigpLnRyaW0oKTsKKwkJCQkJbGV4MURhdGFbTGV4MURhdGEuQUxQSEEyXSA9IGNvZGUubmV4dFRva2VuKCkudHJpbSgpOworCQkJCQlsZXgxRGF0YVtMZXgxRGF0YS5BRE1JTjFdID0gY29kZS5uZXh0VG9rZW4oKS50cmltKCk7CisKKwkJCQkJLy8gTm93IGNyZWF0ZSBhIGxleCAxIG9iamVjdAorCQkJCQlMZXgxT2JqIGxleE9iaiA9IG5ldyBMZXgxT2JqKGxleDFEYXRhW0xleDFEYXRhLklOREVYXSwKKwkJCQkJCQlsZXgxRGF0YVtMZXgxRGF0YS5ERVNDXSwgbGV4MURhdGFbTGV4MURhdGEuQUxQSEEyXSwKKwkJCQkJCQlsZXgxRGF0YVtMZXgxRGF0YS5BRE1JTjFdKTsKKworCQkJCQlpZiAobGV4MUxpc3QgPT0gbnVsbCkgeworCQkJCQkJbGV4MUxpc3QgPSBuZXcgQXJyYXlMaXN0PExleDFPYmo+KCk7CisJCQkJCX0KKwkJCQkJbGV4MUxpc3QuYWRkKGxleE9iaik7CisKKwkJCQl9IGVsc2UgeworCQkJCQlTeXN0ZW0ub3V0CisJCQkJCQkJLnByaW50bG4oIk1hbGZvcm1lZCBsZXggZGF0YSBvYmplY3QuIFRvdGFsIGRhdGEgZWxlbWVudHMgPSAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCSsgY29kZS5jb3VudFRva2VucygpICsgIi4gRXhwZWN0ZWQgOiAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCSsgTGV4MURhdGEuQ09OU1RBTlRTKTsKKwkJCQl9CisKKwkJCX0gLy8gd2hpbGUKKworCQl9IC8vIGlmCisKKwkJcmV0dXJuIGxleDFMaXN0OworCX0KKworCS8qKgorCSAqIAorCSAqIFRoaXMgbWV0aG9kIHRha2VzIGEgTGlzdDxTdHJpbmc+IGFuZCBwcm9kdWNlcyBhIGxpc3Qgb2YgTGV4Mk9iamVjdHMuCisJICogCisJICogQHBhcmFtIGxpc3QKKwkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBsb2NhdGlvbnMuCisJICogCisJICogQHJldHVybiBhIGxpc3Qgb2YgbGV4MiBvYmplY3RzLgorCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgTGlzdDxMZXgyT2JqPiBjcmVhdGVMZXgyTGlzdChMaXN0PFN0cmluZz4gbGlzdCkgeworCisJCVN0cmluZ1tdIGxleDJEYXRhID0gbnVsbDsKKwkJTGlzdDxMZXgyT2JqPiBsZXgyTGlzdCA9IG51bGw7CisKKwkJaWYgKGxpc3QgIT0gbnVsbCkgeworCisJCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKKworCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQkJLy8gR2V0IHRoZSBjb250ZW50CisJCQkJU3RyaW5nIGNvbnRlbnQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisKKwkJCQkvLyBUb2tlbml6ZSB0aGUgc3RyaW5nCisJCQkJU3RyaW5nVG9rZW5pemVyIGNvZGUgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbnRlbnQsICI6Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJCS8vIEFyZSB3ZSBkZWFsaW5nIHdpdGggYSBsZXgxIG9iamVjdCBvciB3aXRoIGEgbGV4MiBvYmplY3QgPworCQkJCWlmIChjb2RlLmNvdW50VG9rZW5zKCkgPT0gTGV4MkRhdGEuQ09OU1RBTlRTKSB7CisKKwkJCQkJaWYgKGNvZGUuY291bnRUb2tlbnMoKSA9PSBMZXgyRGF0YS5DT05TVEFOVFMpIHsKKworCQkJCQkJaWYgKGxleDJEYXRhID09IG51bGwpIHsKKwkJCQkJCQlsZXgyRGF0YSA9IG5ldyBTdHJpbmdbTGV4MkRhdGEuQ09OU1RBTlRTXTsKKwkJCQkJCX0KKworCQkJCQkJLy8gT3JkZXIgbWF0dGVycyBoZXJlLgorCQkJCQkJbGV4MkRhdGFbTGV4MkRhdGEuSU5ERVhdID0gY29kZS5uZXh0VG9rZW4oKS50cmltKCk7CisJCQkJCQlsZXgyRGF0YVtMZXgyRGF0YS5BTFBIQTJdID0gY29kZS5uZXh0VG9rZW4oKS50cmltKCk7CisJCQkJCQlsZXgyRGF0YVtMZXgyRGF0YS5BTFBIQTNdID0gY29kZS5uZXh0VG9rZW4oKS50cmltKCk7CisJCQkJCQlsZXgyRGF0YVtMZXgyRGF0YS5DT1VOVFJZXSA9IGNvZGUubmV4dFRva2VuKCkudHJpbSgpOworCQkJCQkJbGV4MkRhdGFbTGV4MkRhdGEuQURNSU4xXSA9IGNvZGUubmV4dFRva2VuKCkudHJpbSgpOworCQkJCQkJbGV4MkRhdGFbTGV4MkRhdGEuQURNSU4yXSA9IGNvZGUubmV4dFRva2VuKCkudHJpbSgpOworCisJCQkJCQkvLyBOb3cgY3JlYXRlIGEgbGV4IDIgb2JqZWN0CisJCQkJCQlMZXgyT2JqIGxleE9iaiA9IG5ldyBMZXgyT2JqKGxleDJEYXRhW0xleDJEYXRhLklOREVYXSwKKwkJCQkJCQkJbGV4MkRhdGFbTGV4MkRhdGEuQUxQSEEyXSwKKwkJCQkJCQkJbGV4MkRhdGFbTGV4MkRhdGEuQUxQSEEzXSwKKwkJCQkJCQkJbGV4MkRhdGFbTGV4MkRhdGEuQ09VTlRSWV0sCisJCQkJCQkJCWxleDJEYXRhW0xleDJEYXRhLkFETUlOMV0sCisJCQkJCQkJCWxleDJEYXRhW0xleDJEYXRhLkFETUlOMl0pOworCisJCQkJCQkvLyBDcmVhdGUgdGhlIGxleCAyIGxpc3QgaWYgbmVjZXNzYXJ5CisJCQkJCQlpZiAobGV4Mkxpc3QgPT0gbnVsbCkgeworCQkJCQkJCWxleDJMaXN0ID0gbmV3IEFycmF5TGlzdDxMZXgyT2JqPigpOworCQkJCQkJfQorCisJCQkJCQkvLyBBZGQgaXQgdG8gb3VyIGxpc3QKKwkJCQkJCWxleDJMaXN0LmFkZChsZXhPYmopOworCisJCQkJCX0gZWxzZSB7CisJCQkJCQlTeXN0ZW0ub3V0CisJCQkJCQkJCS5wcmludGxuKCJNYWxmb3JtZWQgbGV4IGRhdGEgb2JqZWN0LiBUb3RhbCBkYXRhIGVsZW1lbnRzID0gIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBjb2RlLmNvdW50VG9rZW5zKCkgKyAiLiBFeHBlY3RlZCA6ICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgTGV4MURhdGEuQ09OU1RBTlRTKTsKKwkJCQkJfQorCisJCQkJfSAvLyBpZgorCisJCQl9IC8vIHdoaWxlCisKKwkJfSAvLyBpZgorCisJCXJldHVybiBsZXgyTGlzdDsKKwl9CisKKwkvKioKKwkgKiBmaW5kcyB0aGUgYWRtaW4gbGV2ZWwgb2YgdGhlIGlkIGJ5IGNvdW50aW5nICctJyBjaGFyYWN0ZXJzCisJICogQHBhcmFtIGlkCisJICogQHJldHVybgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorCXB1YmxpYyBzdGF0aWMgaW50IGdldExldmVsKFN0cmluZyBpZCkgeworCQkKKwkJaWYoaWQuaW5kZXhPZigiLSIpID09LTEpIHJldHVybiAwOworCQkKKwkJaW50IGlkeDEgPSBpZC5pbmRleE9mKCItIik7CisJCVN0cmluZyBmaXJzdFBhcnQgPSBpZC5zdWJzdHJpbmcoaWR4MSsxLGlkLmxlbmd0aCgpKTsKKwkJaWYoZmlyc3RQYXJ0LmluZGV4T2YoIi0iKSA9PS0xKSByZXR1cm4gMTsKKwkJCisJCWludCBpZHgyID0gZmlyc3RQYXJ0LmluZGV4T2YoIi0iKTsKKwkJU3RyaW5nIHNlY29uZFBhcnQgPSBmaXJzdFBhcnQuc3Vic3RyaW5nKGlkeDIrMSxmaXJzdFBhcnQubGVuZ3RoKCkpOworCQlpZihzZWNvbmRQYXJ0LmluZGV4T2YoIi0iKSA9PS0xKSByZXR1cm4gMjsKKwkJCisKKwkJaW50IGlkeDMgPSBzZWNvbmRQYXJ0LmluZGV4T2YoIi0iKTsKKwkJU3RyaW5nIHRoaXJkUGFydCA9IHNlY29uZFBhcnQuc3Vic3RyaW5nKGlkeDMrMSxzZWNvbmRQYXJ0Lmxlbmd0aCgpKTsKKwkJaWYodGhpcmRQYXJ0LmluZGV4T2YoIi0iKSA9PS0xKSB7CisJCQlyZXR1cm4gMzsKKwkJfSAKKwkJLy8gVE9ETyBzaG91bGQgZ2VuZXJhbGl6ZSB0aGlzLgorCQlyZXR1cm4gNDsgLy8gdHdvIGxldmVscyBwYXN0IHdoZXJlIHdlIG5vdyBoYXZlIGRhdGEuLi4uCisJCQorCX0KKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHN0cmluZyByZXN1bHRpbmcgZnJvbSAidXBwaW5nIiB0aGUgbGV2ZWwgb2YKKwkgKiB0aGUgcGFzc2VkIGluIHN0ZW0gaWQuIFNvIGZvciBpbnN0YW5jZSwgYSBjb3VudHkgSUQKKwkgKiB3b3VsZCByZXR1cm4gdGhlIHN0YXRlIGlkIGZvciB0aGUgY291bnR5IGV0Yy4KKwkgKiAKKwkgKiBAcGFyYW0gaWQgVGhlIGlkCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHN0ZW0gaWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyB1cENvZGUoU3RyaW5nIGlkKSB7CisJCQorCQlpbnQgbGV2ZWwgPSBnZXRMZXZlbChpZCk7CisJCWludCB0YXJnZXRMZXZlbCA9IGxldmVsIC0xOworCQlpZih0YXJnZXRMZXZlbCA9PSAtMSkgcmV0dXJuIG51bGw7CisJCVN0cmluZ0J1aWxkZXIgcmVzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJaW50IGx2bCA9IDA7CisJCWZvcihpbnQgaT0wO2k8aWQubGVuZ3RoKCk7KytpKSB7CisJCQljaGFyIGMgPSBpZC5jaGFyQXQoaSk7CisJCQlpZihjID09ICctJykgeworCQkJCWlmKGx2bCA9PSB0YXJnZXRMZXZlbCkgcmV0dXJuIHJlcy50b1N0cmluZygpOworCQkJCSsrbHZsOworCQkJfQorCQkJcmVzLmFwcGVuZChjKTsKKwkJCQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBQb3B1bGF0ZSBhIGxpc3Qgd2l0aCB3aGF0ZXZlciBzb3VyY2Ugb2YgZGF0YSBpcyBzcGVjaWZpZWQuIE5PVEU6IHRoZQorCSAqIHNvdXJjZSBoYXMgdG8gaGF2ZSB0aGUgZm9ybWF0IC0+IHRva2VuMTp0b2tlbjI6Li4udG9rZW5LCisJICogCisJICogQHBhcmFtIHNvdXJjZQorCSAqICAgICAgICAgICAgVGhlIGZpbGUgd2hpY2ggaXMgc291cmNlIG9mIGRhdGEKKwkgKiAKKwkgKiBAcmV0dXJuIGEgbGlzdCBsb2FkZWQgd2l0aCBpdGVtcyBhcyBzcGVjaWZpZWQgYnkgdGhlIHNvdXJjZQorCSAqIAorCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IHBvcHVsYXRlTGlzdChTdHJpbmcgc291cmNlKSB7CisKKwkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJU3RyaW5nIGJ1ZmZlciA9IG51bGw7CisKKwkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gb3BlblJlYWRlcihzb3VyY2UpOworCQl0cnkgeworCisJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKKwkJCQl3aGlsZSAoRU9GKGJ1ZmZlciA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSB0cnVlKSB7CisJCQkJCS8vIElmIHRoaXMgbGluZSBzdGFydHMgd2l0aCAiIyIsIHRoZW4gaWdub3JlIGl0LgorCQkJCQlpZiAoYnVmZmVyLnRyaW0oKS5zdGFydHNXaXRoKCIjIikgLy8kTk9OLU5MUy0xJAorCQkJCQkJCXx8IGJ1ZmZlci50cmltKCkuc3RhcnRzV2l0aCgiOiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWxpc3QuYWRkKGJ1ZmZlci50cmltKCkpOworCQkJCQlidWZmZXIgPSBudWxsOworCQkJCX0KKwkJCQlyZWFkZXIuY2xvc2UoKTsKKwkJCX0KKworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJCXJldHVybiBsaXN0OworCX0KKworCS8qKgorCSAqIE9wZW4gYSBmb2xkZXIgZm9yIHJlYWRpbmcKKwkgKiAKKwkgKiBAcGFyYW0gZmlsZU5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBmb2xkZXIgdG8gYmUgb3BlbmVkCisJICogCisJICogQHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgZm9sZGVyCisJICovCisJc3RhdGljIHByb3RlY3RlZCBCdWZmZXJlZFJlYWRlciBvcGVuRm9sZGVyKFN0cmluZyBmaWxlKSB7CisKKwkJQnVmZmVyZWRSZWFkZXIgYnVmZmVyID0gbnVsbDsKKworCQl0cnkgeworCQkJRmlsZSBteUZpbGUgPSBuZXcgRmlsZShmaWxlKTsKKwkJCWlmICghbXlGaWxlLmV4aXN0cygpIHx8ICFteUZpbGUuY2FuUmVhZCgpKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYW50IHJlYWQgOiAiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWJ1ZmZlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlKSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKworCQlyZXR1cm4gYnVmZmVyOworCX0KKworCS8qKgorCSAqIE9wZW4gYSBmaWxlIGZvciByZWFkaW5nCisJICogCisJICogQHBhcmFtIGZpbGVOYW1lCisJICogICAgICAgICAgICBhIGZvbGRlciB3ZSB3YW50IHRvIG9wZW4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBmb2xkZXIKKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIEZpbGUgb3BlbkRpcmVjdG9yeShTdHJpbmcgZmlsZSkgeworCisJCUZpbGUgZGlyID0gbnVsbDsKKworCQlkaXIgPSBuZXcgRmlsZShmaWxlKTsKKwkJaWYgKCFkaXIuZXhpc3RzKCkgfHwgIWRpci5jYW5SZWFkKCkgfHwgIWRpci5pc0RpcmVjdG9yeSgpKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhbnQgcmVhZCA6ICIgKyBmaWxlKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlyZXR1cm4gZGlyOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ld0J1ZmZlcmVkUmVhZGVyCisJICogCisJICogQHBhcmFtIGZpbGVOYW1lCisJICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmlsZSB3ZSB3YW50IHRvIG9wZW4gZm9yIHJlYWRpbmcKKwkgKiAKKwkgKiBAcmV0dXJuIGEgcmVhZGVyIHRvIGEgZ2l2ZW4gZmlsZQorCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgQnVmZmVyZWRSZWFkZXIgb3BlblJlYWRlcihTdHJpbmcgZmlsZSkgeworCisJCXRyeSB7CisKKwkJCUZpbGUgZiA9IG5ldyBGaWxlKGZpbGUpOworCisJCQlpZiAoZi5leGlzdHMoKSA9PSBmYWxzZSkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBQcmludFdyaXRlcgorCSAqIAorCSAqIEBwYXJhbSBmaWxlTmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUgd2Ugd2FudCB0byBvcGVuIGZvciB3cml0aW5nCisJICogQHJldHVybiBQcmludFdyaXRlciBhIHdyaXRlciB0byBhIGdpdmVuIGZpbGUKKwkgKi8KKwlzdGF0aWMgcHJvdGVjdGVkIFByaW50V3JpdGVyIG9wZW5Xcml0ZXIoU3RyaW5nIGZpbGUpIHsKKworCQl0cnkgeworCisJCQlyZXR1cm4gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihmaWxlKSkpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0dyb3VwR2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0dyb3VwR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyNWViOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvR3JvdXBHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDY2NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VuZXJhdG9yczsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBTVEVNIElJIERhdGEgTWlncmF0aW9uL0dlbmVyYXRpb24gVXRpbGl0aWVzIDogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlCisgKiB1c2VkIHRvIGdyb3VwIGFsbCBkYXRhIGFjY29yZGluZyB0byBhZG1pbmlzdHJhdGlvbiBuYW1lLiBGb3IgZXhhbXBsZSwgaWYgZGF0YQorICogZm9yIENhbGlmb3JuaWEgaXMgc2NhdHRlcmVkIGFsbCBvdmVyIHRoZSBkYXRhIGZpbGUsIHRoaXMgcHJvZ3JhbSB3aWxsIGdyb3VwCisgKiBhbGwgZGF0YSBmb3IgQ2FsaWZvcm5pYSBjb25zZWN1dGl2ZWx5LiBUaGUgYmVuZWZpdCBpcyB0aGF0IHRoaXMgd2F5IHdlIHdpbGwKKyAqIGhhdmUgYSBzaW5nbGUgcG9seWdvbiBmb3IgQ2FsaWZvcm5pYSBpbnN0ZWFkIG9mIGhhdmluZyBtdWx0aXBsZSBwb2x5Z29ucyBpZgorICogdGhlIGRhdGEgaXMgc2NhdHRlcmVkIG9yIG5vbi1jb25zZWN1dGl2ZS4KKyAqIAorICogVG8gY29uZmlndXJlLCBzZWUgY29uZmlndXJhdGlvbiBmaWxlIDoKKyAqIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL0dyb3VwR2VuZXJhdG9yLmNvbmZpZworICogCisgKiAKKyAqIFRvIHJ1biwgYWRkIHBhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlIGluIHRoZSBydW4gcHJvZmlsZSAoaS5lLgorICogQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxjb25maWd1cmF0aW9uXEdyb3VwR2VuZXJhdG9yLmNvbmZpZykKKyAqIAorICogCisgKiBTRVQgVk1BUkdTIFRPIDogLVhtczEwMjRtIC1YbXgxMDI0bQorICogCisgKiAKKyAqLworCitwdWJsaWMgY2xhc3MgR3JvdXBHZW5lcmF0b3IgeworCisJLyoqCisJICogT3VyIHNvdXJjZSBmaWxlcyBmb3IgSVNPIDMxNjYtMSBjb2RlcyBhbmQgZm9yIHRoZSBsaXN0IG9mIHRhcmdldAorCSAqIGNvdW50cmllcy4KKwkgKi8KKworCXByaXZhdGUgU3RyaW5nIGlzbzMxNjZfMSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBpc28zMTY2XzIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgZml4RmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyB0YXJnZXRGaWxlID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIGxleERpciA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBvdXRwdXREaXIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgd29ya3NwYWNlID0gbnVsbDsKKworCS8qKgorCSAqIExpc3QgZm9yIElTTyAzMTY2LTEgY29kZXMgYW5kIHRhcmdldCBjb3VudHJpZXMuCisJICovCisKKwlMaXN0IHRhcmdldExpc3QgPSBudWxsOworCisJTGlzdCBjb2RlTGlzdCA9IG51bGw7CisKKwlMaXN0IGNvZGVmaXhMaXN0ID0gbnVsbDsKKworCS8qKgorCSAqIEhhc2ggbWFwcyB0byBrZWVwIHRyYWNrIG9mIGVhY2ggZW50cnkuCisJICovCisJSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbGV2ZWwwTWFwID0gbnVsbDsKKworCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGxldmVsMU1hcCA9IG51bGw7CisKKwlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBsZXZlbDJNYXAgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gaXNvMzE2Nl8xIC0KKwkgKiAgICAgICAgICAgIGRhdGEgZmlsZSB3aXRoIHRoZSBJU08zMTY2LTEgQUxQSEFfMiBhbmQgQUxQSEFfMyBjb2Rlcy4KKwkgKiBAcGFyYW0gaXNvMzE2Nl8yIC0KKwkgKiAgICAgICAgICAgIGRhdGEgZmlsZSB3aXRoIHRoZSBJU08zMTY2LTIgY29kZXMuCisJICogQHBhcmFtIGZpeEZpbGUgLQorCSAqICAgICAgICAgICAgZmlsZSBjb250YWluaW5nIG1pc3NpbmcgSVNPMzE2Ni0yIGNvZGVzCisJICogQHBhcmFtIHRhcmdldEZpbGUKKwkgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGNvdW50cmllcyBmb3Igd2hpY2ggd2Ugd2lsbCBnZW5lcmF0ZSBHTUwgZmlsZXMKKwkgKiBAcGFyYW0gbGV4RGlyCisJICogICAgICAgICAgICBmb2xkZXIgY29udGFpbmluZyBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgZmlsZXMKKwkgKiBAcGFyYW0gb3V0cHV0RGlyCisJICogICAgICAgICAgICB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIEdNTCBmaWxlcyB3ZSBnZW5lcmF0ZQorCSAqLworCS8vIHB1YmxpYyBHcm91cEdlbmVyYXRvcihTdHJpbmcgaXNvMzE2Nl8xLCBTdHJpbmcgaXNvMzE2Nl8yLCBTdHJpbmcgZml4RmlsZSwKKwkvLyBTdHJpbmcgdGFyZ2V0RmlsZSwgU3RyaW5nIGxleERpciwgU3RyaW5nIG91dHB1dERpcikgeworCS8vIC8vIFNldCB2YWx1ZXMgb2YgZ2xvYmFsIHZhcmlhYmxlcy4KKwkvLyB0aGlzLmlzbzMxNjZfMSA9IGlzbzMxNjZfMTsKKwkvLyB0aGlzLmlzbzMxNjZfMiA9IGlzbzMxNjZfMjsKKwkvLyB0aGlzLmZpeEZpbGUgPSBmaXhGaWxlOworCS8vIHRoaXMudGFyZ2V0RmlsZSA9IHRhcmdldEZpbGU7CisJLy8gdGhpcy5sZXhEaXIgPSBsZXhEaXI7CisJLy8gdGhpcy5vdXRwdXREaXIgPSBvdXRwdXREaXI7CisJLy8gbGV2ZWwwTWFwID0gbnVsbDsKKwkvLyBsZXZlbDFNYXAgPSBudWxsOworCS8vIGxldmVsMk1hcCA9IG51bGw7CisJLy8gdGFyZ2V0TGlzdCA9IG51bGw7CisJLy8JfQorCisJLyoqCisJICogQHBhcmFtIGNvbmZpZ0ZpbGUKKwkgKi8KKwlwdWJsaWMgR3JvdXBHZW5lcmF0b3IoU3RyaW5nIGNvbmZpZ0ZpbGUpIHsJCisKKwkJLy8gTG9hZCBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKKwkJSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFycyA9IEdlblV0aWxzLmxvYWRDb25maWdGaWxlKGNvbmZpZ0ZpbGUpOworCisJCVNldDxTdHJpbmc+IGtleXMgPSB2YXJzLmtleVNldCgpOworCQlJdGVyYXRvciBpdCA9IGtleXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJU3RyaW5nIHZhciA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKworCQkJLy8gQXNzaWduIHZhbHVlcyB0byBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyA6CisJCQlpZiAodmFyLmVxdWFscygiV09SS1NQQUNFIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXdvcmtzcGFjZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIklTTzMxNjZfMSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpc28zMTY2XzEgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJJU08zMTY2XzIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJaXNvMzE2Nl8yID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiSVNPX0ZJWCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlmaXhGaWxlID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiVEFSR0VUX0xJU1QiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJdGFyZ2V0RmlsZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIkxFWF9ESVIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJbGV4RGlyID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiT1VUUFVUIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCW91dHB1dERpciA9IHZhcnMuZ2V0KHZhcik7CisJCQl9CisKKwkJfSAvLyB3aGlsZQorCisJCS8vIFRoZSB3b3Jrc3BhY2UgdmFyaWFibGUgc2hvdWxkIGVuZCB3aXRoIGEgc2xhc2ggY2hhcmFjdGVyCisJCWlmICh3b3Jrc3BhY2UuZW5kc1dpdGgoIlxcIikgPT0gZmFsc2UpIHsgLy8kTk9OLU5MUy0xJAorCQkJd29ya3NwYWNlICs9ICJcXCI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCVN0cmluZyBwYXRoID0gd29ya3NwYWNlICsgR2VuQ29uc3RhbnRzLlBBUkFNU19ESVI7CisKKwkJLy8gU2V0IHJlbWFpbmluZyBjb25maWcgdmFycyB1c2luZyBXT1JLU1BBQ0UgKHdvcmtzcGFjZSByZWxhdGl2ZSkKKwkJaWYgKGlzbzMxNjZfMSA9PSBudWxsKSB7CisJCQlpc28zMTY2XzEgPSBwYXRoICsgR2VuQ29uc3RhbnRzLklTTzMxNjZfMV9GSUxFOworCQl9CisJCWlmIChpc28zMTY2XzIgPT0gbnVsbCkgeworCQkJaXNvMzE2Nl8yID0gcGF0aCArIEdlbkNvbnN0YW50cy5JU08zMTY2XzJfRklMRTsKKwkJfQorCQlpZiAoZml4RmlsZSA9PSBudWxsKSB7CisJCQlmaXhGaWxlID0gcGF0aCArIEdlbkNvbnN0YW50cy5JU09GSVhfRklMRTsKKwkJfQorCQlpZiAodGFyZ2V0RmlsZSA9PSBudWxsKSB7CisJCQl0YXJnZXRGaWxlID0gcGF0aCArIEdlbkNvbnN0YW50cy5DT1VOVFJJRVNfTElTVDsKKwkJfQorCQlpZiAobGV4RGlyID09IG51bGwpIHsKKwkJCWxleERpciA9IHBhdGggKyBHZW5Db25zdGFudHMuTEVYX0RJUjsKKwkJfQorCisJCWlmIChHZW5VdGlscy52ZXJpZnlPdXRwdXREaXJlY3RvcnkodmFycykgPT0gZmFsc2UpIHsKKwkJCVN5c3RlbS5vdXQKKwkJCQkJLnByaW50bG4oIlx0XHRCYWQgY29uZmlndXJhdGlvbiBmaWxlIC0tIE9VVFBVVCB2YXJpYWJsZSBub3QgZm91bmQuIFBsZWFzZSBzcGVjaWZ5IG91dHB1dCBkaXJlY3RvcnkgdXNpbmcgZm9ybWF0IFZBUiA9IFZBTFVFIChpLmUuIE9VVFBVVCA9IEM6XFxkaXZhXFxncm91cGVkXFwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5leGl0KDEpOworCQl9CisKKwkJbGV2ZWwwTWFwID0gbnVsbDsKKwkJbGV2ZWwxTWFwID0gbnVsbDsKKwkJbGV2ZWwyTWFwID0gbnVsbDsKKwkJdGFyZ2V0TGlzdCA9IG51bGw7CisKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBzZXRzIHVwIGFuZCBydW5zIHRoaXMgZ2VuZXJhdG9yLgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBjb3VudHJpZXMgd2Ugd2FudC4KKwkJdGFyZ2V0TGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdCh0YXJnZXRGaWxlKTsKKworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIElTTzMxNjYtMSBBTFBIQTIsIEFMUEhBMywgYW5kCisJCS8vIG51bWVyaWMgY29kZXMuCisJCWNvZGVMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KGlzbzMxNjZfMSk7CisKKwkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBtaXNzaW5nIElTTzMxNjYtMiBjb2RlcworCQljb2RlZml4TGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdChmaXhGaWxlKTsKKworCQkvLyBOb3csIHByb2Nlc3MgZWFjaCBpdGVtIGluIHRoZSB0YXJnZXQgbGlzdC4KKwkJcHJvY2VzcygpOworCisJfQorCisJLyoqCisJICogUHJvY2VzcyBvdXIgZ2xvYmFsIGxpc3Qgb2YgdGFyZ2V0IGNvdW50cmllcy4gRm9yIGVhY2ggY291bnRyeSBpbiBsaXN0LAorCSAqIGdlbmVyYXRlIGl0cyBHTUwgZmlsZS4KKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzKCkgeworCisJCS8vIEEgd3JpdGVyIGZvciB0aGUgbmV3IGZpbGUgd2UgYXJlIGNyZWF0aW5nLgorCQlQcmludFdyaXRlciBncm91cEZpbGUgPSBudWxsOworCisJCS8vIE9iamVjdCBob2xkaW5nIElTTzMxNjYtMSByZWxhdGVkIGRhdGEuCisJCUlTT0NvZGUxIGlzb0NvZGUgPSBudWxsOworCisJCS8vIE5hbWUgb2YgdGhlIG5ldyBwcm9wZXJ0aWVzIGZpbGUuCisJCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7CisKKwkJLy8gQSBsaXN0IGZvciBJU08gMzE2Ni0yIG9iamVjdHMKKwkJTGlzdCBpc28yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKworCQkvLyBGaWxlbmFtZXMgZm9yIGxleDEgYW5kIGxleDIgZmlsZXMgZm9yIGEgZ2l2ZW4gY291bnRyeS4KKwkJU3RyaW5nIGxleEFkbWluMUZpbGUgPSBudWxsOworCQlTdHJpbmcgbGV4QWRtaW4yRmlsZSA9IG51bGw7CisKKwkJLy8gTGlzdHMgaG9sZGluZyB0aGUgbGV4MSBhbmQgbGV4MiB2YWx1ZXMuCisJCS8vIE5PVEU6IGxleCB2YWx1ZXMgYXJlIHRoZSBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgdmFsdWVzIGZvcgorCQkvLyBhZG1pbmlzdHJhdGlvbiBsZXZlbHMuCisJCUxpc3Q8U3RyaW5nPiBsZXgxRGF0YVNldCA9IG51bGw7CisJCUxpc3Q8U3RyaW5nPiBsZXgyRGF0YVNldCA9IG51bGw7CisKKwkJLy8gTGlzdHMgZm9yIGhvbGRpbmcgbGV4MSBhbmQgbGV4MiBvYmplY3RzIGZvciBhIGdpdmVuIGNvdW50cnkuCisJCUxpc3Q8TGV4MU9iaj4gbGV4MUxpc3QgPSBudWxsOworCQlMaXN0PExleDJPYmo+IGxleDJMaXN0ID0gbnVsbDsKKworCQlpbnQgc2l6ZSA9IHRhcmdldExpc3Quc2l6ZSgpOworCisJCS8vIEl0ZXJhdGUgZm9yIGV2ZXJ5IGNvdW50cnkgYW5kIGNyZWF0ZSBpdHMgR01MIGRhdGEgZmlsZS4KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKworCQkJLy8gQ3JlYXRlIHRoZSBoYXNoIG1hcHMgOgorCQkJbGV2ZWwwTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCQlsZXZlbDFNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJCWxldmVsMk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisJCQkvLyBHZXQgdGhlIG5leHQgY291bnRyeSBpbiB0aGUgbGlzdC4KKwkJCVN0cmluZyBmaWxlID0gKChTdHJpbmcpIHRhcmdldExpc3QuZ2V0KGkpKS50cmltKCk7CisKKwkJCS8vIEFuIGluZGV4IGZvciB1bmtub3duIG9yIG4uYS4gZW50cmllcworCQkJaW50IHVua0NvdW50ZXIgPSAxOworCisJCQkvLyBXZSB1c2UgdGhpcyBsaXN0IHRvIGtlZXAgdHJhY2sgb2YgZHVwbGljYXRlZCBwb2x5Z29ucy4KKwkJCUxpc3Q8U1RFTVBvbHlnb24+IHBvbHlnb25zID0gbnVsbDsKKworCQkJLy8gT3BlbiB0aGUgZGF0YSBzb3VyY2UgZmlsZSBmb3IgdGhpcyBjb3VudHJ5LgorCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gR2VuVXRpbHMub3BlblJlYWRlcihmaWxlKTsKKworCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRcdDw8PDwgR1JPVVAgR0VORVJBVE9SIC0tIFByb2Nlc3NpbmcgY291bnRyeSA6ICIgKyBmaWxlICsgIiA+Pj4+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJdHJ5IHsKKworCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgeworCisJCQkJCVN0cmluZyBidWZmZXIgPSBudWxsOworCQkJCQkvLyBEZXNjcmliZXMgdGhlIGxldmVsIG9mIGRhdGEKKwkJCQkJLy8gYmVpbmcgcHJvY2Vzc2luZyA6IExFVkVMMCwgTEVWRUwxLCBvciBMRVZFTDIuCisJCQkJCWludCBsZXZlbCA9IC0xOworCisJCQkJCS8vIFJlY29yZCB0aGUgcHJldmlvdXMgdHlwZS4KKwkJCQkJaW50IG9sZGxldmVsID0gbGV2ZWwgLSAxOworCisJCQkJCS8vIFRoZSBkYXRhIHdlIHdhbnQgdG8gd3JpdGUgdG8gdGhlIG5ldyBHTUwgZmlsZS4KKwkJCQkJU3RyaW5nIG91dHB1dCA9ICIgIjsgLy8kTk9OLU5MUy0xJAorCisJCQkJCXdoaWxlIChHZW5VdGlscy5FT0YoYnVmZmVyID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IHRydWUpIHsKKworCQkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgd2UgbWFyayBhbGwgdW5rbm93biBkYXRhLgorCQkJCQkJYnVmZmVyID0gYnVmZmVyLnJlcGxhY2UoIiwsIiwgIixVTktOT1dOLCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCQkJLy8gV2UgdGFrZSBhIGNodW5rIG9mIHRoZSBkYXRhIFtCVUZGRVJfTUlOLEJVRkZFUl9NQVhdCisJCQkJCQkvLyB0byBtYWtlIHByb2Nlc3NzaW5nIG1vcmUKKwkJCQkJCS8vIGVmZmljaWVudCwgd2UgZG9udCBuZWVkIGFsbCBvZiBpdC4KKwkJCQkJCWludCBCVUZGRVJfTUlOID0gMDsKKwkJCQkJCWludCBCVUZGRVJfTUFYID0gMTI1OworCisJCQkJCQlTdHJpbmdbXSBpdGVtcyA9IEdlblV0aWxzCisJCQkJCQkJCS5leHRyYWN0KGJ1ZmZlci5sZW5ndGgoKSA8IEJVRkZFUl9NQVggPyBidWZmZXIKKwkJCQkJCQkJCQk6IGJ1ZmZlci5zdWJzdHJpbmcoQlVGRkVSX01JTiwKKwkJCQkJCQkJCQkJCUJVRkZFUl9NQVgpKTsKKworCQkJCQkJLy8gR2V0IHRoZSBjb3VudHJ5IG5hbWUKKwkJCQkJCVN0cmluZyBjb3VudHJ5ID0gaXRlbXNbSVNPRGF0YS5DT1VOVFJZX05BTUVdOworCisJCQkJCQkvLyBHZXQgdGhlIElTTzMxNjYtMSBpbmZvIGZvciB0aGlzIGNvdW50cnkKKwkJCQkJCWlmIChpc29Db2RlID09IG51bGwpIHsKKwkJCQkJCQlpc29Db2RlID0gR2VuVXRpbHMuZ2V0SVNPQ29kZShjb3VudHJ5LCBjb2RlTGlzdCk7CisJCQkJCQl9CisKKwkJCQkJCS8vIEdldCB0aGUgdHlwZSBvZiB0aGUgZGF0YSB3ZSBhcmUgcHJvY2Vzc2luZy4KKwkJCQkJCWxldmVsID0gR2VuVXRpbHMuZ2V0TGV2ZWwoaXRlbXMpOworCisJCQkJCQlpZiAobGV2ZWwgIT0gMCAmJiBpc28yTGlzdCAhPSBudWxsKSB7CisJCQkJCQkJLy8gTG9hZCB0aGUgSVNPIDMxNjYtMiBvYmplY3RzIGZvciB0aGlzIGNvdW50cnkKKwkJCQkJCQlpc28yTGlzdCA9IEdlblV0aWxzLmxvYWRJU08yKGlzbzMxNjZfMik7CisJCQkJCQl9CisKKwkJCQkJCS8vIFRoaXMgdmFyaWFibGUgaW5kaWNhdGVzIGEgdHJhbnNpdGlvbiBpbiBvdXIgZGF0YQorCQkJCQkJLy8gcHJvY2Vzc2luZworCQkJCQkJYm9vbGVhbiB0cmFuc2l0aW9uID0gKGxldmVsICE9IG9sZGxldmVsKSA/IHRydWUgOiBmYWxzZTsKKworCQkJCQkJLy8gVGhlIGN1cnJlbnQgZW50aXR5IHdlIGFyZSBkZWFsaW5nIHdpdGguCisJCQkJCQkvLyBCYXNlZCBvbiBpdHMgYWRtaW4gbGV2ZWwgaXQgY2FuIGJlIGEgY291bnRyeSwgYQorCQkJCQkJLy8gY291bnR5LCBldGM7CisJCQkJCQlTdHJpbmcgY3VycmVudCA9IG51bGw7CisKKwkJCQkJCS8vIERlc2NyaXB0b3IgZm9yIGN1cnJlbnQgZW50cnkuCisJCQkJCQlTdHJpbmcgZGVzY3JpcHRvciA9IG51bGw7CisKKwkJCQkJCWlmICh0cmFuc2l0aW9uID09IHRydWUpIHsKKwkJCQkJCQkvLyBLZWVwIHRyYWNrIG9mIHByZXZpb3VzIGxldmVsIGluIG9yZGVyIHRvIGRldGVjdAorCQkJCQkJCS8vIHRyYW5zaXRpb25zLgorCQkJCQkJCW9sZGxldmVsID0gbGV2ZWw7CisKKwkJCQkJCQkvLyBSZXNldCBjb3VudGVyIG9mIFVOS05PV04gYW5kIE4uQS4gZW50cmllcy4KKwkJCQkJCQl1bmtDb3VudGVyID0gMTsKKworCQkJCQkJCS8vIENsZWFyIHRoZSBsaXN0IG9mIHVuaXF1ZSBwb2x5Z29ucworCQkJCQkJCWlmIChwb2x5Z29ucyAhPSBudWxsKSB7CisJCQkJCQkJCXBvbHlnb25zLmNsZWFyKCk7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gR2V0IGEgbmV3LCBlbXB0eSBwb2x5Z29uIGxpc3QKKwkJCQkJCQlwb2x5Z29ucyA9IG5ldyBBcnJheUxpc3Q8U1RFTVBvbHlnb24+KCk7CisKKwkJCQkJCQkvLyBJZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IGZvciB0aGlzIGNvdW50cnksCisJCQkJCQkJLy8gY3JlYXRlIGl0IHVzaW5nIElTTyBhbHBoYTMgY29kZS4KKwkJCQkJCQlGaWxlIGNvdW50cnlEaXIgPSBuZXcgRmlsZShvdXRwdXREaXIKKwkJCQkJCQkJCSsgaXNvQ29kZS5nZXRBbHBoYTMoKSk7CisKKwkJCQkJCQlpZiAoY291bnRyeURpciAhPSBudWxsCisJCQkJCQkJCQkmJiBjb3VudHJ5RGlyLmV4aXN0cygpID09IGZhbHNlKSB7CisJCQkJCQkJCS8vIERpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gQ3JlYXRlIGl0LgorCQkJCQkJCQljb3VudHJ5RGlyLm1rZGlyKCk7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gQ3JlYXRlIHRoZSBmaWxlIG5hbWUgZm9yIHRoZSBuZXcgZmlsZQorCQkJCQkJCWZpbGVOYW1lID0gY291bnRyeURpciArICJcXCIgKyBpc29Db2RlLmdldEFscGhhMygpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCSsgIl9HUk9VUEVELnR4dCI7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJCS8vIE9wZW4gdGhlIHdyaXRlciBmb3IgdGhlIG5ldyBmaWxlCisJCQkJCQkJZ3JvdXBGaWxlID0gR2VuVXRpbHMub3BlbldyaXRlcihmaWxlTmFtZSk7CisKKwkJCQkJCX0gLy8gaWYoIHRyYW5zaXRpb24gPT0gdHJ1ZSApCisKKwkJCQkJCXN3aXRjaCAobGV2ZWwpIHsKKworCQkJCQkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMDoKKwkJCQkJCQljdXJyZW50ID0gaXNvQ29kZS5nZXRBbHBoYTMoKTsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMToKKwkJCQkJCQljdXJyZW50ID0gaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0udG9VcHBlckNhc2UoKTsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMjoKKwkJCQkJCQljdXJyZW50ID0gaXRlbXNbSVNPRGF0YS5BRE1JTjJfTkFNRV0udG9VcHBlckNhc2UoKTsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJfSAvLyBzd2l0Y2gKKworCQkJCQkJLy8gSGFuZGxlIFVOS05PV04gYW5kIE4uQS4gZW50cmllcyBkaWZmZXJlbnRseS4KKwkJCQkJCWlmIChjdXJyZW50LmVxdWFscygiVU5LTk9XTiIpIHx8IGN1cnJlbnQuZXF1YWxzKCJOLkEuIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQkJCQlpZiAobGV2ZWwgPT0gMSkgeworCQkJCQkJCQljdXJyZW50ID0gaXNvQ29kZS5nZXRBbHBoYTIoKSArICItVU5LLSIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgU3RyaW5nLnZhbHVlT2YodW5rQ291bnRlcisrKTsKKworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8vIExldmVsIDIgZGF0YS4KKwkJCQkJCQkJY3VycmVudCA9IGlzb0NvZGUuZ2V0QWxwaGEzKCkgKyAiLkwyLiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgU3RyaW5nLnZhbHVlT2YodW5rQ291bnRlcisrKTsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCS8vIFdlIGdldCB0aGUgZGVzY3JpcHRvciBmb3IgYWRtaW5pc3RyYXRpb24gZW50aXRpZXMKKwkJCQkJCS8vIGRpZmZlcmVudGx5IGJhc2VkIG9uIGl0cyBsZXZlbC4KKworCQkJCQkJaWYgKGxldmVsID09IDIpIHsKKworCQkJCQkJCWlmIChsZXgxRGF0YVNldCA9PSBudWxsICYmIGxleDJEYXRhU2V0ID09IG51bGwpIHsKKworCQkJCQkJCQkvLyBDb21wb3NlIHRoZSBmaWxlIG5hbWVzIGZvciB0aGUgbGV4IGZpbGVzIGZvcgorCQkJCQkJCQkvLyB0aGlzCisJCQkJCQkJCS8vIGNvdW50cnkuCisJCQkJCQkJCWxleEFkbWluMUZpbGUgPSBsZXhEaXIgKyBpc29Db2RlLmdldEFscGhhMygpCisJCQkJCQkJCQkJKyAiXFwiICsgaXNvQ29kZS5nZXRBbHBoYTMoKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlsZXhBZG1pbjJGaWxlID0gbGV4QWRtaW4xRmlsZTsKKwkJCQkJCQkJbGV4QWRtaW4xRmlsZSArPSAiX0FETUlOMV9MRVgudHh0IjsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlsZXhBZG1pbjJGaWxlICs9ICJfQURNSU4yX0xFWC50eHQiOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCQkJLy8gTG9hZCB0aGUgbGV4MSBhbmQgbGV4MiBmaWxlcyBmb3IgdGhpcworCQkJCQkJCQkvLyBjb3VudHJ5LgorCQkJCQkJCQlsZXgxRGF0YVNldCA9IEdlblV0aWxzCisJCQkJCQkJCQkJLnBvcHVsYXRlTGlzdChsZXhBZG1pbjFGaWxlKTsKKwkJCQkJCQkJbGV4MkRhdGFTZXQgPSBHZW5VdGlscworCQkJCQkJCQkJCS5wb3B1bGF0ZUxpc3QobGV4QWRtaW4yRmlsZSk7CisKKwkJCQkJCQkJLy8gQ3JlYXRlIGEgbWV0aG9kIHRvIHNlYXJjaCBmb3IgYW4gaXRlbSBvbiBhCisJCQkJCQkJCS8vIGxpc3Qgb2YgbGV4IGRhdGEgb2JqZWN0cy4KKwkJCQkJCQkJbGV4MUxpc3QgPSBHZW5VdGlscy5jcmVhdGVMZXgxTGlzdChsZXgxRGF0YVNldCk7CisJCQkJCQkJCWxleDJMaXN0ID0gR2VuVXRpbHMuY3JlYXRlTGV4Mkxpc3QobGV4MkRhdGFTZXQpOworCisJCQkJCQkJfQorCisJCQkJCQkJLy8gQ29tcG9zZSB0aGUgbGV2ZWwyIGRlc2NyaXB0b3IgdXNpbmcgdGhlIGxleCBkYXRhOgorCisJCQkJCQkJLy8gU1RFUCAxOiBEbyBhIGxvb2sgdXAgaW4gdGhlIGxleCAyIGxpc3RzLgorCisJCQkJCQkJLy8gR2V0IHRoZSBsZXggMiBvYmplY3QgZm9yIHRoZSBjdXJyZW50IGVudHJ5LgorCQkJCQkJCUxleDJPYmogbGV4MkN1cnJlbnQgPSBHZW5VdGlscy5sZXgyTG9va3VwKGxleDJMaXN0LAorCQkJCQkJCQkJaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0sIGN1cnJlbnQpOworCisJCQkJCQkJLy8gR2V0IHRoZSBsZXgxT2JqZWN0IHRvIHdoaWNoIGxleDJDdXJyZW50IGJlbG9uZ3MKKwkJCQkJCQlMZXgxT2JqIGxleDFDdXJyZW50ID0gR2VuVXRpbHMubGV4MUxvb2t1cChsZXgxTGlzdCwKKwkJCQkJCQkJCWxleDJDdXJyZW50LmdldEFkbWluMSgpKTsKKworCQkJCQkJCWlmIChsZXgxQ3VycmVudC5nZXREZXNjcmlwdG9yKCkuY29udGFpbnMoIlVTLSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJLy8gU1RFUCAyOiBwaWVjZSB0b2dldGhlciB0aGUgSUQgdXNpbmcgdGhlCisJCQkJCQkJCS8vIHByb3BlciBsZXggb2JqZWN0cyA6IHRoZSBVU0EgaXMgYSBzcGVjaWFsCisJCQkJCQkJCS8vIGNhc2UKKwkJCQkJCQkJZGVzY3JpcHRvciA9IGxleDFDdXJyZW50LmdldERlc2NyaXB0b3IoKQorCQkJCQkJCQkJCSsgbGV4MUN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXgoKQorCQkJCQkJCQkJCSsgbGV4MkN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXhVU0EoKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkvLyBTVEVQIDI6IHBpZWNlIHRvZ2V0aGVyIHRoZSBJRCB1c2luZyB0aGUKKwkJCQkJCQkJLy8gcHJvcGVyIGxleCBvYmplY3RzLgorCQkJCQkJCQlkZXNjcmlwdG9yID0gbGV4MUN1cnJlbnQuZ2V0RGVzY3JpcHRvcigpCisJCQkJCQkJCQkJKyAiLUciIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGxleDFDdXJyZW50LmdldEZvcm1hdHRlZEluZGV4KCkKKwkJCQkJCQkJCQkrIGxleDJDdXJyZW50LmdldEZvcm1hdHRlZEluZGV4KCk7CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKGN1cnJlbnQuY29udGFpbnMoIi5MMi4iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQkJCWN1cnJlbnQgPSBkZXNjcmlwdG9yOworCQkJCQkJCX0KKworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBDb21wb3NlIGRlc2NyaXB0b3IgZm9yIGwgMSBhbmQgbCAwIGRhdGEKKwkJCQkJCQkvLyBHZXQgdGhlIGRlc2NyaXB0b3IgZm9yIHRoaXMgZW50aXR5LgorCQkJCQkJCWRlc2NyaXB0b3IgPSBHZW5VdGlscy5nZXRJU08yRGVzY3JpcHRvcihpc28yTGlzdCwKKwkJCQkJCQkJCWN1cnJlbnQsIGlzb0NvZGUuZ2V0QWxwaGEyKCkpOworCisJCQkJCQkJLy8gSWYgd2UgY2FudCBmaW5kIHRoZSBkZXNjcmlwdG9yLCB0aGVuIGxvb2sgaW4gdGhlCisJCQkJCQkJLy8gZml4IGxpc3QuCisJCQkJCQkJaWYgKGRlc2NyaXB0b3IuZXF1YWxzKGN1cnJlbnQpID09IHRydWUpIHsKKwkJCQkJCQkJLy8gTG9vayBmb3IgYSBkZXNjcmlwdG9yIGluIHRoZSBmaXggZmlsZQorCQkJCQkJCQlkZXNjcmlwdG9yID0gR2VuVXRpbHMuZ2V0Rml4Q29kZShjb2RlZml4TGlzdCwKKwkJCQkJCQkJCQljdXJyZW50LCBpdGVtc1tJU09EYXRhLkNPVU5UUllfTkFNRV0pOworCQkJCQkJCX0KKworCQkJCQkJfQorCisJCQkJCQlTdHJpbmcga2V5ID0gbnVsbDsKKwkJCQkJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG51bGw7CisKKwkJCQkJCS8vIFN0b3JlIHRoZSBkYXRhIGluIHRoZSBoYXNoIG1hcAorCQkJCQkJc3dpdGNoIChsZXZlbCkgeworCisJCQkJCQljYXNlIERhdGFUeXBlcy5MRVZFTF8wOgorCQkJCQkJCWtleSA9IGl0ZW1zW0lTT0RhdGEuQ09VTlRSWV9OQU1FXTsKKwkJCQkJCQltYXAgPSBsZXZlbDBNYXA7CisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzE6CisJCQkJCQkJa2V5ID0gaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV07CisJCQkJCQkJbWFwID0gbGV2ZWwxTWFwOworCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlIERhdGFUeXBlcy5MRVZFTF8yOgorCQkJCQkJCWtleSA9IGl0ZW1zW0lTT0RhdGEuQURNSU4xX05BTUVdICsgIjoiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCSsgaXRlbXNbSVNPRGF0YS5BRE1JTjJfTkFNRV07CisJCQkJCQkJbWFwID0gbGV2ZWwyTWFwOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQlpZiAobWFwLmNvbnRhaW5zS2V5KGtleSkpIHsKKwkJCQkJCQkvLyBDb25jYXRlbmF0ZSB0byBjdXJyZW50IHZhbHVlCisJCQkJCQkJU3RyaW5nIHZhbHVlID0gbWFwLmdldChrZXkpOworCQkJCQkJCXZhbHVlICs9IGJ1ZmZlciArICJcbiI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQltYXAucHV0KGtleSwgdmFsdWUpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQltYXAucHV0KGtleSwgYnVmZmVyICsgIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCX0KKworCQkJCQkJLy8gUnVuIGdhcmJhZ2UgY29sbGVjdGlvbgorCQkJCQkJLy9TeXN0ZW0uZ2MoKTsKKworCQkJCQl9IC8vIHdoaWxlIGxvb3AKKworCQkJCQkvLyBOb3cgd3JpdGUgdGhlIGVudHJpZXMgaW4gdGhlIGhhc2ggbWFwcyB0byB0aGUgZmlsZSA6CisKKwkJCQkJb3V0cHV0ID0gY29uc29saWRhdGVEYXRhKGxldmVsME1hcCk7CisJCQkJCWlmIChvdXRwdXQgIT0gbnVsbCkgeworCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShncm91cEZpbGUsIG91dHB1dCk7CisJCQkJCX0KKworCQkJCQlvdXRwdXQgPSBjb25zb2xpZGF0ZURhdGEobGV2ZWwxTWFwKTsKKwkJCQkJaWYgKG91dHB1dCAhPSBudWxsKSB7CisJCQkJCQlHZW5VdGlscy5hZGREYXRhKGdyb3VwRmlsZSwgb3V0cHV0KTsKKwkJCQkJfQorCisJCQkJCW91dHB1dCA9IGNvbnNvbGlkYXRlRGF0YShsZXZlbDJNYXApOworCQkJCQlpZiAob3V0cHV0ICE9IG51bGwpIHsKKwkJCQkJCUdlblV0aWxzLmFkZERhdGEoZ3JvdXBGaWxlLCBvdXRwdXQpOworCQkJCQl9CisKKwkJCQkJLy8gUmVzZXQgYWxsIGxleC1yZWxhdGVkIGl0ZW1zCisJCQkJCWlmIChsZXgxRGF0YVNldCAhPSBudWxsKSB7CisJCQkJCQlsZXgxRGF0YVNldC5jbGVhcigpOworCQkJCQkJbGV4MURhdGFTZXQgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgyRGF0YVNldCAhPSBudWxsKSB7CisJCQkJCQlsZXgyRGF0YVNldC5jbGVhcigpOworCQkJCQkJbGV4MkRhdGFTZXQgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgxTGlzdCAhPSBudWxsKSB7CisJCQkJCQlsZXgxTGlzdC5jbGVhcigpOworCQkJCQkJbGV4MUxpc3QgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgyTGlzdCAhPSBudWxsKSB7CisJCQkJCQlsZXgyTGlzdC5jbGVhcigpOworCQkJCQkJbGV4Mkxpc3QgPSBudWxsOworCQkJCQl9CisKKwkJCQkJbGV4QWRtaW4xRmlsZSA9IG51bGw7CisJCQkJCWxleEFkbWluMkZpbGUgPSBudWxsOworCisJCQkJCS8vIFdlIGRvbnQgbmVlZCB0aGUgSVNPIGNvZGUgb2JqZWN0IGZvciB0aGlzIGNvdW50cnkKKwkJCQkJLy8gYW55bW9yZSwgd2UgYXJlIGRvbmUgcHJvY2Vzc2luZyBpdC4KKwkJCQkJaXNvQ29kZSA9IG51bGw7CisKKwkJCQkJLy8gQ2xvc2UgYWxsIG9wZW4gcmVzb3VyY2VzLgorCQkJCQlyZWFkZXIuY2xvc2UoKTsKKworCQkJCQkvLyBDbGVhciB0aGUgaGFzaCBtYXBzCisJCQkJCWlmIChsZXZlbDBNYXAgIT0gbnVsbCkgeworCQkJCQkJbGV2ZWwwTWFwLmNsZWFyKCk7CisJCQkJCQlsZXZlbDBNYXAgPSBudWxsOworCQkJCQl9CisKKwkJCQkJaWYgKGxldmVsMU1hcCAhPSBudWxsKSB7CisJCQkJCQlsZXZlbDFNYXAuY2xlYXIoKTsKKwkJCQkJCWxldmVsMU1hcCA9IG51bGw7CisJCQkJCX0KKworCQkJCQlpZiAobGV2ZWwyTWFwICE9IG51bGwpIHsKKwkJCQkJCWxldmVsMk1hcC5jbGVhcigpOworCQkJCQkJbGV2ZWwyTWFwID0gbnVsbDsKKwkJCQkJfQorCisJCQkJCWlmIChncm91cEZpbGUgIT0gbnVsbCkgeworCQkJCQkJZ3JvdXBGaWxlLmNsb3NlKCk7CisJCQkJCQlncm91cEZpbGUgPSBudWxsOworCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0R2VuZXJhdGVkIDogIiArIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJZmlsZU5hbWUgPSBudWxsOworCQkJCQl9CisJCQkJfQorCisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKworCQl9CisKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBHZXQgYWxsIHRoZSB2YWx1ZXMgaW4gdGhlIG1hcC4KKwkgKiAKKwkgKiBAcGFyYW0gbWFwCisJICogICAgICAgICAgICBhIG1hcCBvZiBsb2NhdGlvbnMKKwkgKiAKKwkgKiBAcmV0dXJuIFN0cmluZyBhIHN0cmluZyB3aWxsIGFsbCBsb2NhdGlvbnMgZ3JvdXBlZCBzZWN1ZW50aWFseS4KKwkgKiAKKwkgKi8KKwlTdHJpbmcgY29uc29saWRhdGVEYXRhKEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCkgeworCisJCVN0cmluZyB2YWx1ZSA9IG51bGw7CisKKwkJaWYgKG1hcC5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJU2V0PFN0cmluZz4ga2V5cyA9IG1hcC5rZXlTZXQoKTsKKworCQlJdGVyYXRvciBpdCA9IGtleXMuaXRlcmF0b3IoKTsKKworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisKKwkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisKKwkJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQkJdmFsdWUgPSBtYXAuZ2V0KGtleSk7CisJCQl9IGVsc2UgeworCQkJCXZhbHVlICs9IG1hcC5nZXQoa2V5KTsKKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIFRoZSBleGVjdXRpb24gZW50cnkgcG9pbnQKKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJLy8gZmluYWwgaW50IElTT18zMTY2XzEgPSAwOworCQkvLyBmaW5hbCBpbnQgSVNPXzMxNjZfMiA9IDE7CisJCS8vIGZpbmFsIGludCBGSVhfRklMRSA9IDI7CisJCS8vIGZpbmFsIGludCBUQVJHRVRfTElTVCA9IDM7CisJCS8vIGZpbmFsIGludCBMRVhfRElSID0gNDsKKwkJLy8gZmluYWwgaW50IE9VVFBVVF9ESVIgPSA1OworCQkvLyBmaW5hbCBpbnQgUEFSQU1TID0gNjsKKwkJLy8KKwkJLy8gaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQKKwkJLy8gLnByaW50bG4oIlx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyA6ICIpOworCQkvLyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBJU08gMzE2Ni0xIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgSVNPIDMxNjYtMiBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IElTTyBmaXggZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBUYXJnZXQgY291bnRyaWVzIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgTGV4aWNvZ3JhcGhpYyBzb3J0aW5nIGRpcmVjdG9yeSIpOworCQkvLyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBPdXRwdXQgZGlyZWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gcmV0dXJuOworCQkvLyB9CisJCS8vCisJCS8vIEdyb3VwR2VuZXJhdG9yIGdyb3VwR2VuID0gbmV3IEdyb3VwR2VuZXJhdG9yKGFyZ3NbSVNPXzMxNjZfMV0sCisJCS8vIGFyZ3NbSVNPXzMxNjZfMl0sIGFyZ3NbRklYX0ZJTEVdLCBhcmdzW1RBUkdFVF9MSVNUXSwKKwkJLy8gYXJnc1tMRVhfRElSXSwgYXJnc1tPVVRQVVRfRElSXSk7CisJCS8vIGdyb3VwR2VuLnJ1bigpOworCisJCWZpbmFsIGludCBDT05GSUdfRklMRSA9IDA7CisJCWZpbmFsIGludCBQQVJBTVMgPSAxOworCisJCWlmIChhcmdzLmxlbmd0aCA8IFBBUkFNUykgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0LS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJcdFx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50KHMpIDogIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0IENvbmZpZ3VyYXRpb24gZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJfQorCisJCUdyb3VwR2VuZXJhdG9yIGdlbiA9IG5ldyBHcm91cEdlbmVyYXRvcihhcmdzW0NPTkZJR19GSUxFXSk7CisKKwkJZ2VuLnJ1bigpOworCisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0lTT0NvZGUxLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0lTT0NvZGUxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0NzRkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvSVNPQ29kZTEuamF2YQpAQCAtMCwwICsxLDkyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBTVEVNIElJIERhdGEgTWlncmF0aW9uL0dlbmVyYXRpb24gVXRpbGl0aWVzIDogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlCisgKiBqdXN0IGEgY29udmVuaWVuY2UgY29udGFpbmVyIGZvciBJU08zMTY2LTEgZGF0YS4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgSVNPQ29kZTEgeworCisJLyoqCisJICogVGhlIGZvdXIgZGF0YSBpdGVtcyBkZXNjcmliaW5nIG91ciBJU08zMTY2LTEgb2JqZWN0CisJICovCisJcHJpdmF0ZSBTdHJpbmcgYWxwaGEzID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIGFscGhhMiA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBudW1lcmljID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBudW1lcmljCisJICogQHBhcmFtIGFscGhhMgorCSAqIEBwYXJhbSBhbHBoYTMKKwkgKi8KKwlwdWJsaWMgSVNPQ29kZTEoU3RyaW5nIG5hbWUsIFN0cmluZyBudW1lcmljLCBTdHJpbmcgYWxwaGEyLCBTdHJpbmcgYWxwaGEzKSB7CisJCXRoaXMuYWxwaGEyID0gYWxwaGEyOworCQl0aGlzLmFscGhhMyA9IGFscGhhMzsKKwkJdGhpcy5udW1lcmljID0gbnVtZXJpYzsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGFscGhhIDIgY29kZQorCSAqIAorCSAqIEByZXR1cm4gdGhlIGFscGhhIDIgY29kZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0QWxwaGEyKCkgeworCQlyZXR1cm4gYWxwaGEyOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgYWxwaGEgMyBjb2RlCisJICogCisJICogQHJldHVybiB0aGUgYWxwaGEgMyBjb2RlCisJICovCisJcHVibGljIFN0cmluZyBnZXRBbHBoYTMoKSB7CisJCXJldHVybiBhbHBoYTM7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBudW1lcmljIGNvZGUKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBudW1lcmljIGNvZGUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE51bWVyaWMoKSB7CisJCXJldHVybiBudW1lcmljOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgbmFtZQorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5hbWUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIENsZWFyIHRoZSBvYmplY3QKKwkgKi8KKwlwdWJsaWMgdm9pZCBjbGVhcigpIHsKKwkJdGhpcy5hbHBoYTIgPSBudWxsOworCQl0aGlzLmFscGhhMyA9IG51bGw7CisJCXRoaXMubnVtZXJpYyA9IG51bGw7CisJCXRoaXMubmFtZSA9IG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9JU09Db2RlMi5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9JU09Db2RlMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NjQ0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0lTT0NvZGUyLmphdmEKQEAgLTAsMCArMSw5NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VuZXJhdG9yczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogU1RFTSBJSSBEYXRhIE1pZ3JhdGlvbi9HZW5lcmF0aW9uIFV0aWxpdGllcyA6IEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZQorICoganVzdCBhIGNvbnZlbmllbmNlIGNvbnRhaW5lciBmb3IgSVNPMzE2Ni0yIGRhdGEuCisgKiAKKyAqLworCitwdWJsaWMgY2xhc3MgSVNPQ29kZTIgeworCisJLyoqCisJICogVGhlIHRocmVlIGRhdGEgaXRlbXMgZGVzY3JpYmluZyBvdXIgSVNPMzE2Ni0xIG9iamVjdC4KKwkgKiAKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBhbHBoYTIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBpbmRleCA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqIAorCSAqIEBwYXJhbSBhbHBoYTIKKwkgKiBAcGFyYW0gaWQKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEBwYXJhbSBpbmRleAorCSAqLworCXB1YmxpYyBJU09Db2RlMihTdHJpbmcgYWxwaGEyLCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgaW5kZXgpIHsKKwkJdGhpcy5hbHBoYTIgPSBhbHBoYTI7CisJCXRoaXMuaWQgPSBpZDsKKwkJdGhpcy5uYW1lID0gbmFtZS5yZXBsYWNlKCItIiwgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCXRoaXMuaW5kZXggPSBpbmRleDsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGFscGhhIDIgY29kZQorCSAqIAorCSAqIEByZXR1cm4gdGhlIGFscGhhIDIgY29kZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0QWxwaGEyKCkgeworCQlyZXR1cm4gYWxwaGEyOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgaWQgKGlmIGFueSkgZm9yIHRoaXMgY291bnRyeQorCSAqIAorCSAqIEByZXR1cm4gdGhlIGlkCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGlkOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgbmFtZQorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5hbWUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lLnRvVXBwZXJDYXNlKCk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGlzIGVudGl0eSB3aXRoaW4gdGhlIGxpc3Qgb2YgSVNPIGNvZGVzCisJICogCisJICogQHJldHVybiB0aGlzIGNvZGUgcmVsYXRpdmUgaW5kZXgKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEluZGV4KCkgeworCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoaW5kZXgpOworCX0KKworCS8qKgorCSAqIENsZWFyIHRoZSBvYmplY3QKKwkgKi8KKwlwdWJsaWMgdm9pZCBjbGVhcigpIHsKKwkJdGhpcy5hbHBoYTIgPSBudWxsOworCQl0aGlzLmlkID0gbnVsbDsKKwkJdGhpcy5uYW1lID0gbnVsbDsKKwkJdGhpcy5pbmRleCA9IG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9JU09EYXRhLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0lTT0RhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTAzZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9JU09EYXRhLmphdmEKQEAgLTAsMCArMSw0NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VuZXJhdG9yczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogU1RFTSBJSSBEYXRhIE1pZ3JhdGlvbi9HZW5lcmF0aW9uIFV0aWxpdGllcyA6IEEgaG9sZGVyIGZvciBjb25zdGFudHMgcmVsYXRlZAorICogdG8gSVNPMzE2Ni0xCisgKiAKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSVNPRGF0YSB7CisKKwkvKioKKwkgKiBTeW1ib2xpYyBjb25zdGFudHMgZGVzY3JpYmluZyBhbiBJU08zMTY2LTEgT2JqZWN0LgorCSAqLworCS8qKgorCSAqIEFscGhhIDMgY291bnRyeSBjb2RlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxQSEEzX0NPREUgPSAwOworCisJLyoqCisJICogQ291bnRyeSBuYW1lCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRSWV9OQU1FID0gMTsKKworCS8qKgorCSAqIEFkbWluaXN0cmF0aW9uIDEgbmFtZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFETUlOMV9OQU1FID0gMjsKKworCS8qKgorCSAqIEFkbWluaXN0cmF0aW9uIDIgbmFtZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFETUlOMl9OQU1FID0gMzsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9JbmZlY3Rvcklub2N1bGF0b3JHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvSW5mZWN0b3JJbm9jdWxhdG9yR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQxNTA4NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvSW5mZWN0b3JJbm9jdWxhdG9yR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwyMDggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKKy8qKgorICogVGhlIGZpbGUgaW1wb3J0cyBhbiBpbmZlY3Rpb3VzIGxvZyBmaWxlIChwYXJhbTEpLCBhIHBvcHVsYXRpb24gbG9nIGZpbGUgKHBhcmFtIDIpCisgKiBhbmQgdXNpbmcgdGhlIHNwZWNpZmllZCBkaXNlYXNlIG5hbWUgKHBhcmFtMykgaXQgZ2VuZXJhdGVzIGluZmVjdG9yIGFuZCBpbm9jdWxhdG9yIFhNTCBmaWxlCisgKiB0aGF0IGNhbiBiZSBpbXBvcnRlZCBpbnRvIGEgc2NlbmFyaW8gdG8gaW5pdGlhbGl6ZSBpdCB0byB0aGUgaW5pdGlhbCBsb2cgZmlsZQorICogc3RhdGUKKyAqLworcHVibGljIGNsYXNzIEluZmVjdG9ySW5vY3VsYXRvckdlbmVyYXRvciB7CisKKwkvKioKKwkgKiBOTFMgUHJlZml4IGZvciBJbmZlY3RvciBuYW1lCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgaW5mZWN0b3JQcmVmaXggPSBNZXNzYWdlcy5nZXRTdHJpbmcoIklub2N1bGF0b3IuMSIpOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogTkxTIFByZWZpeCBmb3IgSW5vY3VsYXRvciBuYW1lCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgaW5vY3VsYXRvclByZWZpeCA9IE1lc3NhZ2VzLmdldFN0cmluZygiSW5vY3VsYXRvci4yIik7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7CisJCWlmKGFyZ3MubGVuZ3RoIDwgNikgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogSW5mZWN0b3JJbm9jdWxhdG9yR2VuZXJhdG9yIDxJIGZpbGU+IDxSIGZpbGU+IDxQIGZpbGU+IDxkaXNlYXNlIG5hbWU+IDxwcm9qZWN0IG5hbWU+IDxkZWZhdWx0IEklIChvcHRpb25hbCk+IDxzY2FsZSBSIGZyYWN0aW9uIChvcHRpb25hbCk+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5leGl0KC0xKTsKKwkJfQorCQkKKwkJU3RyaW5nIGRpc2Vhc2VOYW1lID0gYXJnc1szXTsKKwkJU3RyaW5nIHByb2plY3ROYW1lID0gYXJnc1s0XTsKKwkKKwkJYm9vbGVhbiB1c2VEZWZhdWx0ID0gZmFsc2U7CisJCWRvdWJsZSBpcGVyYyA9IDAuMDsKKwkJZG91YmxlIHJzY2FsZSA9IDEuMDsKKwkJCisJCWlmKGFyZ3MubGVuZ3RoID41KSB7CisJCQl1c2VEZWZhdWx0ID0gdHJ1ZTsKKwkJCWlwZXJjID0gRG91YmxlLnBhcnNlRG91YmxlKGFyZ3NbNV0pOworCQl9CisJCWlmKGFyZ3MubGVuZ3RoID4gNikgeworCQkJdXNlRGVmYXVsdCA9IHRydWU7CisJCQlyc2NhbGUgPSBEb3VibGUucGFyc2VEb3VibGUoYXJnc1s2XSk7CisJCX0KKwkJCQorCQlBcnJheUxpc3Q8U3RyaW5nPmxvY2F0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlBcnJheUxpc3Q8RG91YmxlPmluZmVjdGlvdXMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJQXJyYXlMaXN0PERvdWJsZT5yZWNvdmVyZWQgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKwkJQXJyYXlMaXN0PERvdWJsZT5wb3B1bGF0aW9uID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisJCQorCQl0cnkgeworCQkJIC8vIFJlYWQgaW5mZWN0aW91cyBmaWxlCisJCQkgRmlsZUlucHV0U3RyZWFtIGlmaWxlID0gbmV3IEZpbGVJbnB1dFN0cmVhbShhcmdzWzBdKTsgCisJCSAgICAgQnVmZmVyZWRSZWFkZXIgaXJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaWZpbGUpKTsKKwkJICAgICBTdHJpbmcgaGVhZGVyID0gbnVsbDsKKwkJICAgICBoZWFkZXI9aXJlYWRlci5yZWFkTGluZSgpOworCQkgICAgIGlmKGhlYWRlciA9PSBudWxsKSB7CisJCSAgICAJIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IsICIrYXJnc1swXSsiIGZpbGUgaXMgZW1wdHkhIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkgICAgCSBTeXN0ZW0uZXhpdCgtMik7CisJCSAgICAgfQorCQkgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaGVhZGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCisJCSAgICAgaW50IGNvbHVtbiA9IDA7CisJCSAgICAgd2hpbGUoc3QuaGFzTW9yZVRva2VucygpKSB7CisJCSAgICAJIFN0cmluZyB2YWwgPSBzdC5uZXh0VG9rZW4oKTsKKwkJICAgIAkgaWYoY29sdW1uIDwgMikgeysrY29sdW1uO2NvbnRpbnVlO30KKwkJICAgIAkgbG9jYXRpb25zLmFkZCh2YWwudHJpbSgpKTsKKwkJICAgIAkgKytjb2x1bW47CisJCSAgICAgfQorCQkgICAgCisJCSAgICBTdHJpbmcgZGF0YSA9IG51bGw7IAorCQkgICAgZGF0YT1pcmVhZGVyLnJlYWRMaW5lKCk7CisJCSAgICBpZihkYXRhID09IG51bGwpIHsKKwkJICAgIAkgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciwgIithcmdzWzBdKyIgZmlsZSBoYXMgbm8gZGF0YSEiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCSAgICAJIFN5c3RlbS5leGl0KC0yKTsKKwkJICAgICB9CisJCSAgICAKKwkJICAgIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihkYXRhLCAiLCIpOyAvLyROT04tTkxTLTEkCisJCSAgICBjb2x1bW4gPSAwOworCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworCQkJCVN0cmluZyB2YWwgPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7CisJCQkJaWYoY29sdW1uIDwgMikgeysrY29sdW1uO2NvbnRpbnVlO30gLy8gc2tpcCBpdGVyYXRpb24sIHRpbWUKKwkJCQlpbmZlY3Rpb3VzLmFkZChEb3VibGUucGFyc2VEb3VibGUodmFsKSk7CisJCQkgICAgKysgY29sdW1uOworCQkgICAgfSAvLyByZWFkIHRva2VucworCQkgICAgCisJCSAgICBpcmVhZGVyLmNsb3NlKCk7CisJCSAgICAKKwkJICAgIC8vIFJlYWQgcmVjb3ZlcmVkIGZpbGUKKwkJICAgIGlmaWxlID0gbmV3IEZpbGVJbnB1dFN0cmVhbShhcmdzWzFdKTsgCisJCSAgICBpcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpZmlsZSkpOworCQkgICAgaGVhZGVyID0gbnVsbDsKKwkJICAgIGhlYWRlcj1pcmVhZGVyLnJlYWRMaW5lKCk7CisJCSAgICBpZihoZWFkZXIgPT0gbnVsbCkgeworCQkgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IsICIrYXJnc1sxXSsiIGZpbGUgaXMgZW1wdHkhIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCSAgICAgU3lzdGVtLmV4aXQoLTIpOworCQkgICAgfQorCQkgICAgCisJCSAgICBkYXRhID0gbnVsbDsgCisJCSAgICBkYXRhPWlyZWFkZXIucmVhZExpbmUoKTsKKwkJICAgIGlmKGRhdGEgPT0gbnVsbCkgeworCQkgICAgCSBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yLCAiK2FyZ3NbMV0rIiBmaWxlIGhhcyBubyBkYXRhISIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkgICAgCSBTeXN0ZW0uZXhpdCgtMik7CisJCSAgICAgfQorCQkgICAgCisJCSAgICBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZGF0YSwgIiwiKTsgLy8kTk9OLU5MUy0xJAorCQkgICAgY29sdW1uID0gMDsKKwkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQlTdHJpbmcgdmFsID0gc3QubmV4dFRva2VuKCkudHJpbSgpOworCQkJCWlmKGNvbHVtbiA8IDIpIHsrK2NvbHVtbjtjb250aW51ZTt9IC8vIHNraXAgaXRlcmF0aW9uLCB0aW1lCisJCQkJcmVjb3ZlcmVkLmFkZChEb3VibGUucGFyc2VEb3VibGUodmFsKSk7CisJCQkgICAgKysgY29sdW1uOworCQkgICAgfSAvLyByZWFkIHRva2VucworCQkgICAgCisJCSAgICBpcmVhZGVyLmNsb3NlKCk7CisJCSAgICAKKwkJICAgIC8vIFJlYWQgcG9wdWxhdGlvbiBmaWxlCisJCSAgICBpZmlsZSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oYXJnc1syXSk7IAorCQkgICAgaXJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaWZpbGUpKTsKKwkJICAgIGhlYWRlciA9IG51bGw7CisJCSAgICBoZWFkZXI9aXJlYWRlci5yZWFkTGluZSgpOworCQkgICAgaWYoaGVhZGVyID09IG51bGwpIHsKKwkJICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yLCAiK2FyZ3NbMl0rIiBmaWxlIGlzIGVtcHR5ISIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkgICAgIFN5c3RlbS5leGl0KC0yKTsKKwkJICAgIH0KKwkJICAgIAorCQkgICAgZGF0YSA9IG51bGw7IAorCQkgICAgZGF0YT1pcmVhZGVyLnJlYWRMaW5lKCk7CisJCSAgICBpZihkYXRhID09IG51bGwpIHsKKwkJICAgIAkgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciwgIithcmdzWzJdKyIgZmlsZSBoYXMgbm8gZGF0YSEiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJICAgIAkgU3lzdGVtLmV4aXQoLTIpOworCQkgICAgIH0KKwkJICAgIAorCQkgICAgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRhdGEsICIsIik7IC8vJE5PTi1OTFMtMSQKKwkJICAgIGNvbHVtbiA9IDA7CisJCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisJCQkJU3RyaW5nIHZhbCA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKKwkJCQlpZihjb2x1bW4gPCAyKSB7Kytjb2x1bW47Y29udGludWU7fSAvLyBza2lwIGl0ZXJhdGlvbiwgdGltZQorCQkJCXBvcHVsYXRpb24uYWRkKERvdWJsZS5wYXJzZURvdWJsZSh2YWwpKTsKKwkJCSAgICArKyBjb2x1bW47CisJCSAgICB9IC8vIHJlYWQgdG9rZW5zCisJCSAgICAKKwkJICAgIGlyZWFkZXIuY2xvc2UoKTsKKwkJICAgIAorCQkgICAgCisJCSAgICBpbnQgaW5kZXggPSAwOworCQkgICAgLy8gV3JpdGUKKwkJICAgIGZvcihTdHJpbmcgbG9jYXRpb246bG9jYXRpb25zKSB7CisJCSAgICAJU3RyaW5nIGluZmVjdG9yZmlsZW5hbWUgPSBpbmZlY3RvclByZWZpeCtpbmRleDsKKwkJICAgIAlTdHJpbmcgaW5vY3VsYXRvcmZpbGVuYW1lID0gaW5vY3VsYXRvclByZWZpeCtpbmRleDsKKwkJICAgIAlGaWxlV3JpdGVyIGluZmVjdG9yZncgPSBuZXcgRmlsZVdyaXRlcihpbmZlY3RvcmZpbGVuYW1lKyIuc3RhbmRhcmQiKTsKKwkJICAgIAlGaWxlV3JpdGVyIGlub2N1bGF0b3JmdyA9IG5ldyBGaWxlV3JpdGVyKGlub2N1bGF0b3JmaWxlbmFtZSsiLnN0YW5kYXJkIik7CisJCSAgICAJCisJCSAgICAJZG91YmxlIGluZmQgPSBpbmZlY3Rpb3VzLmdldChpbmRleCk7CisJCSAgICAJaWYoaW5mZCA9PSAwLjAgJiYgdXNlRGVmYXVsdCkgeworCQkgICAgCQlpbmZkID0gcG9wdWxhdGlvbi5nZXQoaW5kZXgpKmlwZXJjLzEwMC4wOworCQkgICAgCX0KKwkJICAgIAkKKwkJICAgIAlpbmZlY3RvcmZ3LndyaXRlKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJBU0NJSVwiPz5cbiIpOworCQkgICAgCWluZmVjdG9yZncud3JpdGUoIjxvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQ6U0lJbmZlY3RvciB4bWk6dmVyc2lvbj1cIjIuMFwiIHhtbG5zOnhtaT1cImh0dHA6Ly93d3cub21nLm9yZy9YTUlcIiB4bWxuczpvcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQ9XCJodHRwOi8vL29yZy9lY2xpcHNlL3N0ZW0vZGlzZWFzZW1vZGVscy9zdGFuZGFyZC5lY29yZVwiICIpOworCQkgICAgCWluZmVjdG9yZncud3JpdGUoIiB1Ukk9XCJwbGF0Zm9ybTovcmVzb3VyY2UvIitwcm9qZWN0TmFtZSsiL2RlY29yYXRvcnMvIitpbmZlY3RvcmZpbGVuYW1lKyIuc3RhbmRhcmRcIiB0eXBlVVJJPVwic3RlbXR5cGU6Ly9vcmcuZWNsaXBzZS5zdGVtL2lkZW50aWZpYWJsZTgzXCIgIik7CisJCSAgICAJaW5mZWN0b3Jmdy53cml0ZSgiIGRpc2Vhc2VOYW1lPVwiIitkaXNlYXNlTmFtZSsiXCIgdGFyZ2V0SVNPS2V5PVwiIitsb2NhdGlvbisiXCIgcG9wdWxhdGlvbklkZW50aWZpZXI9XCJodW1hblwiIGluZmVjdGlvdXNDb3VudD1cIiIraW5mZCsiXCI+XG4iKTsKKwkJICAgIAlpbmZlY3RvcmZ3LndyaXRlKCIgPGR1YmxpbkNvcmUgdGl0bGU9XCJJbmZlY3QgIitpbmZkKyIgJnF1b3Q7aHVtYW4mcXVvdDsgcG9wdWxhdGlvbiBtZW1iZXJzIHdpdGggdGhlIGRpc2Vhc2UgJnF1b3Q7IitkaXNlYXNlTmFtZSsiJnF1b3Q7IGF0IHRoZSBsb2NhdGlvbiAmcXVvdDsiK2xvY2F0aW9uKyImcXVvdDsuXCIgaWRlbnRpZmllcj1cInBsYXRmb3JtOi9yZXNvdXJjZS8iK3Byb2plY3ROYW1lKyIvZGVjb3JhdG9ycy8iK2luZmVjdG9yZmlsZW5hbWUrIi5zdGFuZGFyZFwiIGRlc2NyaXB0aW9uPVwiSW5mZWN0ICIraW5mZCsiICZxdW90O2h1bWFuJnF1b3Q7IHBvcHVsYXRpb24gbWVtYmVycyB3aXRoIHRoZSBkaXNlYXNlICZxdW90OyIrZGlzZWFzZU5hbWUrIiZxdW90OyBhdCB0aGUgbG9jYXRpb24gJnF1b3Q7Iitsb2NhdGlvbisiJnF1b3Q7IChDSC1HTikuXCIgY3JlYXRvcj1cImdlbmVyYXRlZFwiIGZvcm1hdD1cImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkLmVjb3JlXCIgdHlwZT1cInN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9pZGVudGlmaWFibGU4M1wiIGNyZWF0ZWQ9XCIyMDA4LTEyLTE3XCIvPlxuIik7CisJCSAgICAJaW5mZWN0b3Jmdy53cml0ZSgiPC9vcmcuZWNsaXBzZS5zdGVtLmRpc2Vhc2Vtb2RlbHMuc3RhbmRhcmQ6U0lJbmZlY3Rvcj5cbiIpOworCQkgICAgCWluZmVjdG9yZncuZmx1c2goKTsKKwkJICAgIAlpbmZlY3RvcmZ3LmNsb3NlKCk7CisJCSAgICAJCisJCSAgICAJZG91YmxlIGlub2N1bGF0ZWRQZXJjZW50YWdlID0gMTAwLjAqcmVjb3ZlcmVkLmdldChpbmRleCkvcG9wdWxhdGlvbi5nZXQoaW5kZXgpOworCQkgICAgCWlub2N1bGF0ZWRQZXJjZW50YWdlID0gaW5vY3VsYXRlZFBlcmNlbnRhZ2UgKiByc2NhbGU7CisJCSAgICAJU3lzdGVtLm91dC5wcmludGxuKCJyX3NjYWxlOiIrcnNjYWxlKTsKKwkJICAgIAkKKwkJICAgIAlpbm9jdWxhdG9yZncud3JpdGUoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIkFTQ0lJXCI/PlxuIik7CisJCSAgICAJaW5vY3VsYXRvcmZ3LndyaXRlKCI8b3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkOlNJUklub2N1bGF0b3IgeG1pOnZlcnNpb249XCIyLjBcIiB4bWxuczp4bWk9XCJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JXCIgeG1sbnM6b3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkPVwiaHR0cDovLy9vcmcvZWNsaXBzZS9zdGVtL2Rpc2Vhc2Vtb2RlbHMvc3RhbmRhcmQuZWNvcmVcIiAiKTsKKwkJICAgIAlpbm9jdWxhdG9yZncud3JpdGUoIiB1Ukk9XCJwbGF0Zm9ybTovcmVzb3VyY2UvIitwcm9qZWN0TmFtZSsiL2RlY29yYXRvcnMvIitpbm9jdWxhdG9yZmlsZW5hbWUrIi5zdGFuZGFyZFwiIHR5cGVVUkk9XCJzdGVtdHlwZTovL29yZy5lY2xpcHNlLnN0ZW0vaWRlbnRpZmlhYmxlOVwiICIpOworCQkgICAgCWlub2N1bGF0b3Jmdy53cml0ZSgiIGRpc2Vhc2VOYW1lPVwiIitkaXNlYXNlTmFtZSsiXCIgdGFyZ2V0SVNPS2V5PVwiIitsb2NhdGlvbisiXCIgcG9wdWxhdGlvbklkZW50aWZpZXI9XCJodW1hblwiIGluZmVjdGlvdXNDb3VudD1cIjBcIiBpbm9jdWxhdGVkUGVyY2VudGFnZT1cIiIraW5vY3VsYXRlZFBlcmNlbnRhZ2UrIlwiPlxuIik7CisJCSAgICAJaW5vY3VsYXRvcmZ3LndyaXRlKCIgPGR1YmxpbkNvcmUgdGl0bGU9XCJJbm9jdWxhdGUgIitpbm9jdWxhdGVkUGVyY2VudGFnZSsiICZxdW90O2h1bWFuJnF1b3Q7IHBlcmNlbnQgb2YgcG9wdWxhdGlvbiBhZ2FpbnN0IHRoZSBkaXNlYXNlICZxdW90OyIrZGlzZWFzZU5hbWUrIiZxdW90OyBhdCB0aGUgbG9jYXRpb24gJnF1b3Q7Iitsb2NhdGlvbisiJnF1b3Q7LlwiIGlkZW50aWZpZXI9XCJwbGF0Zm9ybTovcmVzb3VyY2UvIitwcm9qZWN0TmFtZSsiL2RlY29yYXRvcnMvIitpbm9jdWxhdG9yZmlsZW5hbWUrIi5zdGFuZGFyZFwiIGRlc2NyaXB0aW9uPVwiSW5vY3VsYXRlICIraW5vY3VsYXRlZFBlcmNlbnRhZ2UrIiAmcXVvdDtodW1hbiZxdW90OyBwZXJjZW50IG9mIHBvcHVsYXRpb24gYWdhaW5zdCB0aGUgZGlzZWFzZSAmcXVvdDsiK2Rpc2Vhc2VOYW1lKyImcXVvdDsgYXQgdGhlIGxvY2F0aW9uICZxdW90OyIrbG9jYXRpb24rIiZxdW90OyAuXCIgY3JlYXRvcj1cImdlbmVyYXRlZFwiIGZvcm1hdD1cImh0dHA6Ly8vb3JnL2VjbGlwc2Uvc3RlbS9kaXNlYXNlbW9kZWxzL3N0YW5kYXJkLmVjb3JlXCIgdHlwZT1cInN0ZW10eXBlOi8vb3JnLmVjbGlwc2Uuc3RlbS9pZGVudGlmaWFibGU5XCIgY3JlYXRlZD1cIjIwMDgtMTItMTdcIi8+XG4iKTsKKwkJICAgIAlpbm9jdWxhdG9yZncud3JpdGUoIjwvb3JnLmVjbGlwc2Uuc3RlbS5kaXNlYXNlbW9kZWxzLnN0YW5kYXJkOlNJUklub2N1bGF0b3I+XG4iKTsKKwkJICAgIAlpbm9jdWxhdG9yZncuZmx1c2goKTsKKwkJICAgIAlpbm9jdWxhdG9yZncuY2xvc2UoKTsKKwkJICAgIAkKKwkJICAgIAkKKwkJICAgIAkrK2luZGV4OworCQkgICAgfQorCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJCQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvTGV4MURhdGEuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvTGV4MURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWYwNzNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9MZXgxRGF0YS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFNURU0gSUkgRGF0YSBNaWdyYXRpb24vR2VuZXJhdGlvbiBVdGlsaXRpZXMgOiBBIGhvbGRlciBmb3IgY29uc3RhbnRzIHJlbGF0ZWQKKyAqIHRvIExleDFkYXRhIG9iamVjdHMKKyAqIAorICovCitwdWJsaWMgY2xhc3MgTGV4MURhdGEgeworCisJLyoqCisJICogU3ltYm9saWMgY29uc3RhbnRzIGRlc2NyaWJpbmcgYW4gTGV4MURhdGEgT2JqZWN0LgorCSAqLworCisJLyoqCisJICogVG90YWwgbnVtYmVyIG9mIHN5bWJvbGljIGNvbnN0YW50cyBmb3IgbGV4IDEgZGF0YSBvYmplY3RzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UUyA9IDQ7CisKKwkvKioKKwkgKiBpbmRleCBvZiB0aGlzIGVsZW1lbnQgaW4gbGV4aWNvZ3JhcGhpY2FsbHkgc29ydGVkIHNlcXVlbmNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOREVYID0gMDsKKworCS8qKgorCSAqIGRlc2NyaXB0b3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVNDID0gMTsKKworCS8qKgorCSAqIEFscGhhIDIgY29kZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMUEhBMiA9IDI7CisKKwkvKioKKwkgKiBBZG1pbmlzdHJhdGlvbiAxIG5hbWUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRE1JTjEgPSAzOworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0xleDFPYmouamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvTGV4MU9iai5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MWMyOGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0xleDFPYmouamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoqCisgKiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VuZXJhdG9yczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogCisgKiBTVEVNIElJIERhdGEgTWlncmF0aW9uL0dlbmVyYXRpb24gVXRpbGl0aWVzIDogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MKKyAqIHJlcHJlc2VudCBhIExleDEgb2JqZWN0IHdoaWNoIGlzIG5vdCBtdWNoIG1vcmUgdGhhbiBhIGhvbGRlciBvZiBkYXRhIGZvciBhCisgKiBnaXZlbiBsb2NhdGlvbiBkdXJpbmcgYSBsZXhpY29ncmFwaGljIHNvcnRpbmcgb2YgbGV2ZWwgMSBhZG1pbmlzdHJhdGlvbnMuCisgKiAKKyAqLworcHVibGljIGNsYXNzIExleDFPYmogeworCisJLyoqCisJICogVGhlIGZvdXIgZGF0YSBpdGVtcyBkZXNjcmliaW5nIG91ciBJU08zMTY2LTEgb2JqZWN0CisJICovCisJcHJpdmF0ZSBTdHJpbmcgaW5kZXggPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgZGVzYyA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBhbHBoYTIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgYWRtaW4xID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICogCisJICogQHBhcmFtIGluZGV4CisJICogQHBhcmFtIGRlc2MKKwkgKiBAcGFyYW0gYWxwaGEyCisJICogQHBhcmFtIGFkbWluMQorCSAqLworCXB1YmxpYyBMZXgxT2JqKFN0cmluZyBpbmRleCwgU3RyaW5nIGRlc2MsIFN0cmluZyBhbHBoYTIsIFN0cmluZyBhZG1pbjEpIHsKKwkJdGhpcy5pbmRleCA9IGluZGV4OworCQl0aGlzLmRlc2MgPSBkZXNjOworCQl0aGlzLmFscGhhMiA9IGFscGhhMjsKKwkJdGhpcy5hZG1pbjEgPSBhZG1pbjE7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBhbHBoYSAyIGNvZGUKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBhbHBoYSAyIGNvZGUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEFscGhhMigpIHsKKwkJcmV0dXJuIGFscGhhMjsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGFkbWluIDIgY29kZQorCSAqIAorCSAqIEByZXR1cm4gdGhlIGFscGhhIDIgY29kZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0QWRtaW4xKCkgeworCQlyZXR1cm4gYWRtaW4xLnRvVXBwZXJDYXNlKCk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBpbmRleAorCSAqIAorCSAqIEByZXR1cm4gdGhlIG51bWVyaWMgY29kZQorCSAqLworCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7CisJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGluZGV4KTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGluZGV4IHBhZGRlZCB3aXRoIGFzIG1hbnkgbGVmdG1vc3QgemVyb2VzIGFzIG5lY2Vzc2FyeS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBpbmRleCBwYWRkZWQgd2l0aCBsZWZ0bW9zdCB6ZXJvZXMKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEZvcm1hdHRlZEluZGV4KCkgeworCQlpZiAoaW5kZXgubGVuZ3RoKCkgPCAyKSB7CisJCQlpbmRleCA9ICIwIiArIGluZGV4OyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIGluZGV4OworCX0KKworCS8qKgorCSAqIEdldCB0aGUgZGVzY3JpcHRvcgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3IKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0b3IoKSB7CisJCXJldHVybiBkZXNjOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgSUQgZm9yIHRoZSBhZG1pbjEgRm9yIGV4YW1wbGUsIGZvciBVUy1BSywgd2Ugd2FudCB0byBnZXQgQUsgd2hpY2gKKwkgKiBpcyB0aGUgSUQgZm9yIHRoZSBhZG1pbjEgYXJlYS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzdWJzdHJpbmcgd2l0aCB0aGUgSUQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRJRCgpIHsKKwkJaW50IGh5cGhlbiA9IGRlc2MuaW5kZXhPZigiLSIpOyAvLyROT04tTkxTLTEkCisJCWlmICgoaHlwaGVuICsgMSkgPCBkZXNjLmxlbmd0aCgpKSB7CisJCQlyZXR1cm4gZGVzYy5zdWJzdHJpbmcoaHlwaGVuICsgMSk7CisJCX0KKwkJcmV0dXJuIGRlc2M7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0xleDJEYXRhLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0xleDJEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkNDVhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvTGV4MkRhdGEuamF2YQpAQCAtMCwwICsxLDU4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBTVEVNIElJIERhdGEgTWlncmF0aW9uL0dlbmVyYXRpb24gVXRpbGl0aWVzIDogQSBob2xkZXIgZm9yIGNvbnN0YW50cyByZWxhdGVkCisgKiB0byBMZXgyZGF0YSBvYmplY3RzLgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBMZXgyRGF0YSB7CisKKwkvKioKKwkgKiBTeW1ib2xpYyBjb25zdGFudHMgZGVzY3JpYmluZyBhbiBMZXgxRGF0YSBPYmplY3QuCisJICovCisKKwkvKioKKwkgKiBUb3RhbCBudW1iZXIgb2Ygc3ltYm9saWMgY29uc3RhbnRzIGZvciBsZXggMSBkYXRhIG9iamVjdHMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlRTID0gNjsKKworCS8qKgorCSAqIGluZGV4IG9mIHRoaXMgZWxlbWVudCBpbiBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgc2VxdWVuY2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVggPSAwOworCisJLyoqCisJICogQWxwaGEgMiBjb2RlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxQSEEyID0gMTsKKworCS8qKgorCSAqIEFscGhhIDMgY29kZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMUEhBMyA9IDI7CisKKwkvKioKKwkgKiBDb3VudHJ5CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRSWSA9IDM7CisKKwkvKioKKwkgKiBBZG1pbmlzdHJhdGlvbiAxIG5hbWUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRE1JTjEgPSA0OworCisJLyoqCisJICogQWRtaW4gMiBuYW1lCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQURNSU4yID0gNTsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9MZXgyT2JqLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL0xleDJPYmouamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2NlMDI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9MZXgyT2JqLmphdmEKQEAgLTAsMCArMSwxNDQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIAorICogU1RFTSBJSSBEYXRhIE1pZ3JhdGlvbi9HZW5lcmF0aW9uIFV0aWxpdGllcyA6IEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzCisgKiByZXByZXNlbnQgYSBMZXgxIG9iamVjdCB3aGljaCBpcyBub3QgbXVjaCBtb3JlIHRoYW4gYSBob2xkZXIgb2YgZGF0YSBmb3IgYQorICogZ2l2ZW4gbG9jYXRpb24gZHVyaW5nIGEgbGV4aWNvZ3JhcGhpYyBzb3J0aW5nIG9mIGxldmVsIDIgYWRtaW5pc3RyYXRpb25zLgorICogCisgKi8KKworcHVibGljIGNsYXNzIExleDJPYmogeworCisJLyoqCisJICogVGhlIGZvdXIgZGF0YSBpdGVtcyBkZXNjcmliaW5nIG91ciBJU08zMTY2LTEgb2JqZWN0CisJICovCisJcHJpdmF0ZSBTdHJpbmcgaW5kZXggPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgYWxwaGEyID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIGFkbWluMiA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBhbHBoYTMgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgYWRtaW4xID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIGNvdW50cnkgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gaW5kZXgKKwkgKiBAcGFyYW0gYWxwaGEyCisJICogQHBhcmFtIGFscGhhMworCSAqIEBwYXJhbSBjb3VudHJ5CisJICogQHBhcmFtIGFkbWluMQorCSAqIEBwYXJhbSBhZG1pbjIKKwkgKi8KKwlwdWJsaWMgTGV4Mk9iaihTdHJpbmcgaW5kZXgsIFN0cmluZyBhbHBoYTIsIFN0cmluZyBhbHBoYTMsIFN0cmluZyBjb3VudHJ5LAorCQkJU3RyaW5nIGFkbWluMSwgU3RyaW5nIGFkbWluMikgeworCQl0aGlzLmluZGV4ID0gaW5kZXg7CisJCXRoaXMuYWxwaGEyID0gYWxwaGEyOworCQl0aGlzLmFkbWluMiA9IGFkbWluMjsKKwkJdGhpcy5hZG1pbjEgPSBhZG1pbjE7CisJCXRoaXMuYWxwaGEzID0gYWxwaGEzOworCQl0aGlzLmNvdW50cnkgPSBjb3VudHJ5OworCX0KKworCS8qKgorCSAqIEdldCB0aGUgY291bnRyeSBjb2RlCisJICogCisJICogQHJldHVybiB0aGUgY291bnRyeSBjb2RlCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb3VudHJ5KCkgeworCQlyZXR1cm4gY291bnRyeTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGFscGhhIDEgY29kZQorCSAqIAorCSAqIEByZXR1cm4gdGhlIGFscGhhIDEgY29kZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0QWxwaGEzKCkgeworCQlyZXR1cm4gYWxwaGEzOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgYWxwaGEgMiBjb2RlCisJICogCisJICogQHJldHVybiB0aGUgYWxwaGEgMiBjb2RlCisJICovCisJcHVibGljIFN0cmluZyBnZXRBbHBoYTIoKSB7CisJCXJldHVybiBhbHBoYTI7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBhZG1pbiAyIGNvZGUKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBhbHBoYSAyIGNvZGUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEFkbWluMigpIHsKKwkJcmV0dXJuIGFkbWluMi50b1VwcGVyQ2FzZSgpOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgYWRtaW4gMSBjb2RlCisJICogCisJICogQHJldHVybiB0aGUgYSBjb2RlCisJICovCisJcHVibGljIFN0cmluZyBnZXRBZG1pbjEoKSB7CisJCXJldHVybiBhZG1pbjEudG9VcHBlckNhc2UoKTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGluZGV4CisJICogCisJICogQHJldHVybiB0aGUgbnVtZXJpYyBjb2RlCisJICovCisJcHVibGljIGludCBnZXRJbmRleCgpIHsKKwkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoaW5kZXgpOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgaW5kZXggcGFkZGVkIHdpdGggYXMgbWFueSBsZWZ0bW9zdCB6ZXJvZXMgYXMgbmVjZXNzYXJ5LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGluZGV4IHBhZGRlZCB3aXRoIGxlZnRtb3N0IHplcm9lcworCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkSW5kZXgoKSB7CisJCWZpbmFsIGludCBNSU5TSVpFID0gNDsKKwkJaWYgKGluZGV4Lmxlbmd0aCgpIDwgTUlOU0laRSkgeworCQkJaW50IHBhZGRpbmcgPSBNSU5TSVpFIC0gaW5kZXgubGVuZ3RoKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZGRpbmc7IGkrKykgeworCQkJCWluZGV4ID0gIjAiICsgaW5kZXg7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlyZXR1cm4gaW5kZXg7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBpbmRleCBwYWRkZWQgd2l0aCBhcyBtYW55IGxlZnRtb3N0IHplcm9lcyBhcyBuZWNlc3NhcnkuIFNwZWNpYWwKKwkgKiBjYXNlIGZvciB0aGUgVVNBIDogYXQgbW9zdCB0aHJlZSBjaGFyYWN0ZXJzIGluc3RlYWRkCisJICogCisJICogQHJldHVybiB0aGUgaW5kZXggcGFkZGVkIHdpdGggbGVmdG1vc3QgemVyb2VzCisJICovCisJcHVibGljIFN0cmluZyBnZXRGb3JtYXR0ZWRJbmRleFVTQSgpIHsKKwkJZmluYWwgaW50IE1JTlNJWkUgPSAzOworCQlpZiAoaW5kZXgubGVuZ3RoKCkgPCBNSU5TSVpFKSB7CisJCQlpbnQgcGFkZGluZyA9IE1JTlNJWkUgLSBpbmRleC5sZW5ndGgoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFkZGluZzsgaSsrKSB7CisJCQkJaW5kZXggPSAiMCIgKyBpbmRleDsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCXJldHVybiBpbmRleDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvTWFwUmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL01hcFJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZjBhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL01hcFJlYWRlci5qYXZhCkBAIC0wLDAgKzEsMjQ4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCisvL2ltcG9ydCBjb20uYmJuLm9wZW5tYXAuZGF0YUFjY2Vzcy5zaGFwZS5Fc3JpR3JhcGhpY0xpc3Q7CisvL2ltcG9ydCBjb20uYmJuLm9wZW5tYXAuZGF0YUFjY2Vzcy5zaGFwZS5Fc3JpUG9seWdvbjsKKy8vaW1wb3J0IGNvbS5iYm4ub3Blbm1hcC5kYXRhQWNjZXNzLnNoYXBlLkVzcmlQb2x5Z29uTGlzdDsKKy8vaW1wb3J0IGNvbS5iYm4ub3Blbm1hcC5kYXRhQWNjZXNzLnNoYXBlLmlucHV0LkRiZklucHV0U3RyZWFtOworLy9pbXBvcnQgY29tLmJibi5vcGVubWFwLmRhdGFBY2Nlc3Muc2hhcGUuaW5wdXQuU2hwSW5wdXRTdHJlYW07CisvL2ltcG9ydCBjb20uYmJuLm9wZW5tYXAuZGF0YUFjY2Vzcy5zaGFwZS5pbnB1dC5TaHhJbnB1dFN0cmVhbTsKKy8vaW1wb3J0IGNvbS5iYm4ub3Blbm1hcC5vbUdyYXBoaWNzLk9NUG9seTsKKworLyoqCisgKiBTVEVNIElJIERhdGEgTWlncmF0aW9uL0dlbmVyYXRpb24gVXRpbGl0aWVzIC0gVGhpcyBjbGFzcyByZWFkcyBFU1JJIHNoYXBlCisgKiBmaWxlcyBhbmQgY29udmVydHMgZWFjaCBvZiB0aGVtIGludG8gYSBwbGFpbiB0ZXh0IGZpbGUgYXMgb3V0cHV0LgorICovCitwdWJsaWMgY2xhc3MgTWFwUmVhZGVyIHsKKworCVByaW50V3JpdGVyIHB3OworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gb3V0RmlsZQorCSAqICAgICAgICAgICAgdGhlIG91dHB1dCBmaWxlCisJICovCisJcHVibGljIE1hcFJlYWRlcihTdHJpbmcgb3V0RmlsZSkgeworCisJCXRyeSB7CisJCQl0aGlzLnB3ID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlV3JpdGVyKG91dEZpbGUpKTsKKwkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXR1cm47CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKioKKwkgKiByZWFkIGluIGEgZ2l2ZW4gZGlyZWN0b3J5CisJICogCisJICogQHBhcmFtIGRpcgorCSAqICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSB3ZSB3YW50IHRvIHJlYWQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZWFkRGlyZWN0b3J5KFN0cmluZyBkaXIpIHsKKwkJdHJ5IHsKKworCQkJRmlsZSBmID0gbmV3IEZpbGUoZGlyKTsKKwkJCUZpbGVbXSBmaWxlcyA9IGYubGlzdEZpbGVzKCk7CisKKwkJCWludCBjb3VudGVyID0gMDsKKworCQkJU3RyaW5nIHNocEZpbGUgPSBudWxsOworCQkJU3RyaW5nIGRiZkZpbGUgPSBudWxsOworCQkJU3RyaW5nIHNoeEZpbGUgPSBudWxsOworCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpCisJCQkJCXJlYWREaXJlY3RvcnkoZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOworCQkJCVN0cmluZyBuYW1lID0gZmlsZXNbaV0uZ2V0TmFtZSgpOworCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisKKwkJCQlpZiAobmFtZS5pbmRleE9mKCIuc2hwIikgIT0gLTEgJiYgc2hwRmlsZSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJc2hwRmlsZSA9IGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpOworCQkJCQljb3VudGVyKys7CisJCQkJfSBlbHNlIGlmIChuYW1lLmluZGV4T2YoIi5kYmYiKSAhPSAtMSAmJiBkYmZGaWxlID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlkYmZGaWxlID0gZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCk7CisJCQkJCWNvdW50ZXIrKzsKKwkJCQl9IGVsc2UgaWYgKG5hbWUuaW5kZXhPZigiLnNoeCIpICE9IC0xICYmIHNoeEZpbGUgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCisJCQkJCXNoeEZpbGUgPSBmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKTsKKwkJCQkJY291bnRlcisrOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIElnbm9yZSAudHh0IGFuZCBhbnkgb3RoZXIga2luZCBvZiBmaWxlcyBpbiB0aGlzIGZvbGRlcgorCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlpZiAoY291bnRlciA9PSAzKSB7CisJCQkJCXJlYWRGaWxlKHNocEZpbGUsIHNoeEZpbGUsIGRiZkZpbGUpOworCQkJCQljb3VudGVyID0gMDsKKwkJCQkJc2hwRmlsZSA9IG51bGw7CisJCQkJCWRiZkZpbGUgPSBudWxsOworCQkJCQlzaHhGaWxlID0gbnVsbDsKKwkJCQl9CisKKwkJCX0KKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlYWQgYSBFU1JJIHNoYXBlIGZpbGUKKwkgKiAKKwkgKiBAcGFyYW0gc2hwRmlsZQorCSAqICAgICAgICAgICAgbWFpbiBzaGFwZSBmaWxlCisJICogQHBhcmFtIHNoeEZpbGUKKwkgKiAgICAgICAgICAgIGluZGV4IGZpbGUKKwkgKiBAcGFyYW0gZGJmRmlsZQorCSAqICAgICAgICAgICAgZEJhc2UgdGFibGUKKwkgKi8KKwlwdWJsaWMgdm9pZCByZWFkRmlsZShTdHJpbmcgc2hwRmlsZSwgU3RyaW5nIHNoeEZpbGUsIFN0cmluZyBkYmZGaWxlKSB7CisKKwkJU3lzdGVtLm91dC5wcmludGxuKCJzaHBGaWxlIGlzIDogIiArIHNocEZpbGUpOyAvLyROT04tTkxTLTEkCisJCVN5c3RlbS5vdXQucHJpbnRsbigic2h4RmlsZSBpcyA6ICIgKyBzaHhGaWxlKTsgLy8kTk9OLU5MUy0xJAorCQlTeXN0ZW0ub3V0LnByaW50bG4oImRiZkZpbGUgaXMgOiAiICsgZGJmRmlsZSk7IC8vJE5PTi1OTFMtMSQKKworLy8JCXRyeSB7CisvLwkJCUFycmF5TGlzdCBhUmVjb3JkID0gbnVsbDsKKy8vCQkJRmlsZUlucHV0U3RyZWFtIHNocEZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc2hwRmlsZSk7CisvLwkJCUZpbGVJbnB1dFN0cmVhbSBzaHhGaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNoeEZpbGUpOworLy8JCQlGaWxlSW5wdXRTdHJlYW0gZGJmRmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShkYmZGaWxlKTsKKy8vCisvLwkJCURiZklucHV0U3RyZWFtIGRiZklzID0gbmV3IERiZklucHV0U3RyZWFtKGRiZkZpcyk7CisvLwkJCS8vIFN0cmluZyBuYW1lc1tdID0gZGJmSXMuZ2V0Q29sdW1uTmFtZXMoKTsKKy8vCQkJQXJyYXlMaXN0IHJlY29yZHMgPSBkYmZJcy5nZXRSZWNvcmRzKCk7CisvLwkJCWRiZkZpcy5jbG9zZSgpOworLy8KKy8vCQkJLy8gR2V0IHRoZSBpbmRleC4KKy8vCQkJU2h4SW5wdXRTdHJlYW0gc2h4SXMgPSBuZXcgU2h4SW5wdXRTdHJlYW0oc2h4RmlzKTsKKy8vCQkJaW50W11bXSBvZmZTZXRzID0gc2h4SXMuZ2V0SW5kZXgoKTsKKy8vCisvLwkJCS8vIEdldCB0aGUgc2hhcGUgZGF0YQorLy8JCQlTaHBJbnB1dFN0cmVhbSBzaXMgPSBuZXcgU2hwSW5wdXRTdHJlYW0oc2hwRmlzKTsKKy8vCQkJRXNyaUdyYXBoaWNMaXN0IGVnbCA9IHNpcy5nZXRHZW9tZXRyeShvZmZTZXRzKTsKKy8vCisvLwkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2l6ZT0iK2VnbC5zaXplKCkpOworLy8KKy8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvZmZTZXRzWzBdLmxlbmd0aDsgaSsrKSB7CisvLworLy8JCQkJLyoKKy8vCQkJCSAqIHRyeXsgY29tLmJibi5vcGVubWFwLmRhdGFBY2Nlc3Muc2hhcGUuRXNyaVBvbHlsaW5lIHBvbHlMaW5lID0KKy8vCQkJCSAqIG51bGw7IHBvbHlMaW5lID0KKy8vCQkJCSAqIChjb20uYmJuLm9wZW5tYXAuZGF0YUFjY2Vzcy5zaGFwZS5Fc3JpUG9seWxpbmUpZWdsLmdldE9NR3JhcGhpY0F0KGkpOworLy8JCQkJICogYVJlY29yZCA9IChBcnJheUxpc3QpcmVjb3Jkcy5nZXQoaSk7CisvLwkJCQkgKiAKKy8vCQkJCSAqIGZvciAoaW50IGo9MDtqPGFSZWNvcmQuc2l6ZSgpO2orKyl7IGlmIChqPjApIHB3LnByaW50KCIsIik7CisvLwkJCQkgKiBwdy5wcmludChhUmVjb3JkLmdldChqKSk7IH0KKy8vCQkJCSAqIAorLy8JCQkJICogZmxvYXQgbGF0bG9uW10gPSBwb2x5TGluZS5nZXRMYXRMb25BcnJheSgpOyBmb3IgKGludCBqPTA7ajxsYXRsb24ubGVuZ3RoO2orKyl7CisvLwkJCQkgKiBwdy5wcmludCgiLCIrbGF0bG9uW2pdKTsgfSBwdy5wcmludGxuKCk7IH0gY2F0Y2goCisvLwkJCQkgKiBqYXZhLmxhbmcuQ2xhc3NDYXN0RXhjZXB0aW9uIGUgKXsgZS5wcmludFN0YWNrVHJhY2UoKTsgfQorLy8JCQkJICovCisvLworLy8JCQkJdHJ5IHsKKy8vCQkJCQlPTVBvbHkgZXNwZyA9IChFc3JpUG9seWdvbikgZWdsLmdldE9NR3JhcGhpY0F0KGkpOworLy8JCQkJCWFSZWNvcmQgPSAoQXJyYXlMaXN0KSByZWNvcmRzLmdldChpKTsKKy8vCisvLwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhUmVjb3JkLnNpemUoKTsgaisrKSB7CisvLworLy8JCQkJCQlpZiAodGhpcy5wdyA9PSBudWxsKSB7CisvLwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByaW50V3JpdGVyIGlzIG51bGwgISIpOyAvLyROT04tTkxTLTEkCQkJCQkJCQorLy8JCQkJCQkJcmV0dXJuOworLy8JCQkJCQl9CisvLworLy8JCQkJCQlpZiAoaiA+IDApCisvLwkJCQkJCQl0aGlzLnB3LnByaW50KCIsIik7IC8vJE5PTi1OTFMtMSQKKy8vCQkJCQkJdGhpcy5wdy5wcmludChhUmVjb3JkLmdldChqKSk7CisvLwkJCQkJfQorLy8KKy8vCQkJCQlmbG9hdCBsYXRsb25bXSA9IGVzcGcuZ2V0TGF0TG9uQXJyYXkoKTsKKy8vCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxhdGxvbi5sZW5ndGg7IGorKykgeworLy8JCQkJCQl0aGlzLnB3LnByaW50KCIsIiArIGxhdGxvbltqXSk7IC8vJE5PTi1OTFMtMSQKKy8vCQkJCQl9CisvLwkJCQkJdGhpcy5wdy5wcmludGxuKCk7CisvLworLy8JCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKy8vCisvLwkJCQkJRXNyaVBvbHlnb25MaXN0IGVwbCA9IChFc3JpUG9seWdvbkxpc3QpIGVnbAorLy8JCQkJCQkJLmdldE9NR3JhcGhpY0F0KGkpOworLy8JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXBsLnNpemUoKTsgaisrKSB7CisvLworLy8JCQkJCQlFc3JpUG9seWdvbiBlc3BnID0gKEVzcmlQb2x5Z29uKSBlcGwuZ2V0T01HcmFwaGljQXQoaik7CisvLworLy8JCQkJCQlhUmVjb3JkID0gKEFycmF5TGlzdCkgcmVjb3Jkcy5nZXQoaSk7CisvLwkJCQkJCWZvciAoaW50IHEgPSAwOyBxIDwgYVJlY29yZC5zaXplKCk7IHErKykgeworLy8JCQkJCQkJaWYgKHEgPiAwKQorLy8JCQkJCQkJCXRoaXMucHcucHJpbnQoIiwiKTsgLy8kTk9OLU5MUy0xJAorLy8JCQkJCQkJdGhpcy5wdy5wcmludChhUmVjb3JkLmdldChxKSk7CisvLwkJCQkJCX0KKy8vCisvLwkJCQkJCWZsb2F0IGxhdGxvbltdID0gZXNwZy5nZXRMYXRMb25BcnJheSgpOworLy8JCQkJCQlmb3IgKGludCBxID0gMDsgcSA8IGxhdGxvbi5sZW5ndGg7IHErKykgeworLy8JCQkJCQkJdGhpcy5wdy5wcmludCgiLCIgKyBsYXRsb25bcV0pOyAvLyROT04tTkxTLTEkCisvLwkJCQkJCX0KKy8vCisvLwkJCQkJCXRoaXMucHcucHJpbnRsbigpOworLy8KKy8vCQkJCQl9IC8vIGZvcgorLy8KKy8vCQkJCX0gLy8gY2F0Y2gKKy8vCisvLwkJCX0gLy8gZm9yCisvLworLy8JCQlzaHhJcy5jbG9zZSgpOworLy8KKy8vCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworLy8JCQllLnByaW50U3RhY2tUcmFjZSgpOworLy8JCX0KKworCX0gLy8gcmVhZGZpbGUKKworCS8qKgorCSAqIENsb3NlIHRoZSB3cml0ZXIKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBjbG9zZUZpbGUoKSB7CisJCXRoaXMucHcuY2xvc2UoKTsKKwl9CisKKwkvKioKKwkgKiBFeGVjdXRpb24gZW50cnkgcG9pbnQKKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJZmluYWwgaW50IEVTUklfRklMRSA9IDA7CisJCWZpbmFsIGludCBPVVRQVVRfRklMRSA9IDE7CisKKwkJaWYgKGFyZ3MubGVuZ3RoIDwgMikgeworCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiV3JvbmcgYXJndW1lbnRzLiBQcm92aWRlIEVTUkkgZmlsZSBhbmQgb3V0cHV0IGZpbGVuYW1lLiIpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCX0KKworCQlNYXBSZWFkZXIgbXIgPSBuZXcgTWFwUmVhZGVyKGFyZ3NbT1VUUFVUX0ZJTEVdKTsKKwkJbXIucmVhZERpcmVjdG9yeShhcmdzW0VTUklfRklMRV0pOworCQltci5jbG9zZUZpbGUoKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9NYXRjaFByb2ZpbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL01hdGNoUHJvZmlsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGU5ZWNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9NYXRjaFByb2ZpbGVyLmphdmEKQEAgLTAsMCArMSw1MzggQEAKKy8qKgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogU1RFTSBJSSBEYXRhIE1pZ3JhdGlvbi9HZW5lcmF0aW9uIFV0aWxpdGllcyA6IEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHdlcmUKKyAqIHVzZWQgYXQgc29tZSBpbnRlcm1lZGlhdGUgcG9pbnQgdG8gZmluZCBtYXRjaGVzIHdpdGggbWlzc2luZyBpZGVudGlmaWVycy4gSXQKKyAqIGhhZCBhIHNob3J0IHBlcmlvZCBvZiB1c2VmdWwgbGlmZS4KKyAqIAorICogVG8gcnVuIGFkZCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgdG8gdGhlIHJ1biBjb25maWd1cmF0aW9uOgorICogCisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRcSVNPMzE2Ni0xXElTTzMxNjZfMV9lbi50eHQKKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxBcmVhUG9wdWxhdGlvbkRhdGFcCisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRccHJvcGVydGllc1xDb3VudHJpZXMudHh0CisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRcbWF0Y2hcbWF0Y2hMaXN0LnR4dAorICogCisgKi8KKworcHVibGljIGNsYXNzIE1hdGNoUHJvZmlsZXIgeworCisJcHJpdmF0ZSBTdHJpbmcgY2lhRGF0YSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyB0YXJnZXRGaWxlID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIG1hdGNoRmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBpc28zMTY2XzEgPSBudWxsOworCisJLyoqCisJICogTGlzdHMgZm9yIHBvcHVsYXRpb24gZGF0YS4KKwkgKi8KKworCUxpc3QgdGFyZ2V0TGlzdCA9IG51bGw7CisKKwlMaXN0IHBvcHVsYXRpb25MaXN0ID0gbnVsbDsKKworCUxpc3QgbWF0Y2hMaXN0ID0gbnVsbDsKKworCUxpc3QgYXJlYUxpc3QgPSBudWxsOworCisJTGlzdCBjb2RlTGlzdCA9IG51bGw7CisKKwkvKioKKwkgKiBTdHJpbmcgdXNlZCB0byBpbmRpY2F0ZSBkZWZhdWx0IHZhbHVlIGZvciB1bmtub3duIGxvY2F0aW9ucy4KKwkgKi8KKwlTdHJpbmcgREVGQVVMVCA9ICIwIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gaXNvMzE2Nl8xIC0KKwkgKiAgICAgICAgICAgIGRhdGEgZmlsZSB3aXRoIHRoZSBJU08zMTY2LTEgQUxQSEFfMiBhbmQgQUxQSEFfMyBjb2Rlcy4KKwkgKiBAcGFyYW0gY2lhRGF0YSAtCisJICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgcG9wdWxhdGlvbiBkYXRhIGZvciBhbGwgY291bnRyaWVzCisJICogQHBhcmFtIHRhcmdldEZpbGUgLQorCSAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgY291bnRyaWVzIHRvIHByb2Nlc3MKKwkgKiBAcGFyYW0gbWF0Y2hGaWxlIC0KKwkgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGxvY2F0aW9ucyBhbHJlYWR5IG1hdGNoZWQKKwkgKiAKKwkgKi8KKwlwdWJsaWMgTWF0Y2hQcm9maWxlcihTdHJpbmcgaXNvMzE2Nl8xLCBTdHJpbmcgY2lhRGF0YSwKKwkJCVN0cmluZyB0YXJnZXRGaWxlLCBTdHJpbmcgbWF0Y2hGaWxlKSB7CisJCS8vIFNldCB2YWx1ZXMgb2YgZ2xvYmFsIHZhcmlhYmxlcy4KKwkJdGhpcy5pc28zMTY2XzEgPSBpc28zMTY2XzE7CisJCXRoaXMudGFyZ2V0RmlsZSA9IHRhcmdldEZpbGU7CisJCXRoaXMubWF0Y2hGaWxlID0gbWF0Y2hGaWxlOworCQl0aGlzLmNpYURhdGEgPSBjaWFEYXRhOworCX0KKworCS8qKgorCSAqIFJ1biB0aGUgZ2VuZXJhdG9yLgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBjb3VudHJpZXMgd2Ugd2FudC4KKwkJdGFyZ2V0TGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdCh0YXJnZXRGaWxlKTsKKworCQkvLyBMb2FkIHRoZSBsaXN0IG9mIG1hdGNoZWQgbG9jYXRpb25zCisJCW1hdGNoTGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdChtYXRjaEZpbGUpOworCisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgSVNPMzE2Ni0xIEFMUEhBMiwgQUxQSEEzLCBhbmQKKwkJLy8gbnVtZXJpYyBjb2Rlcy4KKwkJY29kZUxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QoaXNvMzE2Nl8xKTsKKworCQkvLyBOb3csIHByb2Nlc3MgZWFjaCBpdGVtIGluIHRoZSB0YXJnZXQgbGlzdC4KKwkJcHJvY2VzcygpOworCisJfQorCisJLyoqCisJICogUHJvY2VzcyBvdXIgZ2xvYmFsIGxpc3Qgb2YgdGFyZ2V0IGNvdW50cmllcy4gRm9yIGVhY2ggY291bnRyeSBpbiBsaXN0LAorCSAqIGdlbmVyYXRlIGl0cyBwb3B1bGF0aW9uLnByb3BlcnRpZXMgZmlsZS4KKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzKCkgeworCisJCS8vIE9iamVjdCBob2xkaW5nIElTTzMxNjYtMSByZWxhdGVkIGRhdGEuCisJCUlTT0NvZGUxIGlzb0NvZGUgPSBudWxsOworCisJCWZpbmFsIGludCBMT0NBVElPTiA9IDA7CisKKwkJZmluYWwgaW50IExFVkVMID0gMTsKKworCQlpbnQgc2l6ZSA9IHRhcmdldExpc3Quc2l6ZSgpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisKKwkJCS8vIEdldCB0aGUgbmV4dCBjb3VudHJ5IGluIHRoZSBsaXN0LgorCQkJU3RyaW5nIGZpbGUgPSAoKFN0cmluZykgdGFyZ2V0TGlzdC5nZXQoaSkpLnRyaW0oKTsKKwkKKwkJCVN0cmluZyBjb3VudHJ5ID0gZXh0cmFjdENvdW50cnlOYW1lKGZpbGUpOworCisJCQkvLyBHZXQgdGhlIElTTzMxNjYtMSBpbmZvIGZvciB0aGlzCisJCQkvLyBjb3VudHJ5CisJCQlpZiAoaXNvQ29kZSA9PSBudWxsKSB7CisJCQkJaXNvQ29kZSA9IEdlblV0aWxzLmdldElTT0NvZGUoY291bnRyeSwgY29kZUxpc3QpOworCQkJfQorCisJCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIHBvcHVsYXRpb24gZGF0YQorCQkJLy8gZm9yIHRoaXMgY291bnRyeS4KKwkJCWlmIChwb3B1bGF0aW9uTGlzdCA9PSBudWxsKSB7CisJCQkJU3RyaW5nIG5hbWUgPSBjaWFEYXRhICsgY291bnRyeSArICJfUE9QVUxBVElPTi50eHQiOyAvLyROT04tTkxTLTEkCisJCQkJcG9wdWxhdGlvbkxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QobmFtZSk7CisJCQl9CisKKwkJCS8vIE5vdyBsb2FkIHRoZSBhcmVhIGRhdGEgZm9yIHRoaXMgY291bnRyeS4KKwkJCWlmIChhcmVhTGlzdCA9PSBudWxsKSB7CisJCQkJU3RyaW5nIG5hbWUgPSBjaWFEYXRhICsgY291bnRyeSArICJfQVJFQS50eHQiOyAvLyROT04tTkxTLTEkCisJCQkJYXJlYUxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QobmFtZSk7CisJCQl9CisKKwkJCS8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHBvcHVsYXRpb24gbGlzdCB0cnlpbmcgdG8KKwkJCS8vIGZpbmQgYQorCQkJLy8gbG9jYXRpb24gdGhhdCBoYXNudCBiZWVuIG1hdGNoZWQgYWxyZWFkeS4KKwkJCS8vIElmIGEgbG9jYXRpb24gZG9lcyBub3QgaGF2ZSBhIG1hdGNoLCBwcmludCBpdC4KKwkJCUl0ZXJhdG9yIGl0ID0gcG9wdWxhdGlvbkxpc3QuaXRlcmF0b3IoKTsKKworCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQkJU3RyaW5nW10gZGF0YSA9ICgoU3RyaW5nKSBpdC5uZXh0KCkpLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJCWlmIChjb3VudHJ5LmVxdWFscyhkYXRhW0xPQ0FUSU9OXS50b1VwcGVyQ2FzZSgpKSA9PSBmYWxzZQorCQkJCQkJJiYgZmluZE1hdGNoKGRhdGFbTE9DQVRJT05dLnRvVXBwZXJDYXNlKCkudHJpbSgpKSA9PSBmYWxzZQorCQkJCQkJJiYgZGF0YVtMRVZFTF0udHJpbSgpLmVxdWFscygiMSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJLy8gb3V0cHV0IGluZm8gYWJvdXQgdGhpcyBsb2NhdGlvbiBpbiB0aGUgZm9ybWF0CisJCQkJCS8vIGxvY2F0aW9uLCBhcmVhLCBwb3B1bGF0aW9uCisJCQkJCVN0cmluZyBwb3B1bGF0aW9uID0gZ2V0UG9wdWxhdGlvbihkYXRhW0xPQ0FUSU9OXSwgY291bnRyeSwKKwkJCQkJCQkxKTsKKwkJCQkJU3RyaW5nIGFyZWEgPSBnZXRBcmVhKGRhdGFbTE9DQVRJT05dLCBjb3VudHJ5LCAxKTsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKGNvdW50cnkgKyAiLCIgKyBkYXRhW0xPQ0FUSU9OXSArICIsIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkrIGFyZWEgKyAiLCIgKyBwb3B1bGF0aW9uKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKworCQkJfQorCisJCQkvLyBXZSBkb250IG5lZWQgdGhlIElTTyBjb2RlIG9iamVjdCBmb3IgdGhpcyBjb3VudHJ5CisJCQkvLyBhbnltb3JlLCB3ZSBhcmUgZG9uZSBwcm9jZXNzaW5nIGl0LgorCQkJaXNvQ29kZSA9IG51bGw7CisKKwkJCS8vIFJlc2V0IHRoZSBwb3B1bGF0aW9uIGxpc3QKKwkJCWlmIChwb3B1bGF0aW9uTGlzdCAhPSBudWxsKSB7CisJCQkJcG9wdWxhdGlvbkxpc3QuY2xlYXIoKTsKKwkJCQlwb3B1bGF0aW9uTGlzdCA9IG51bGw7CisJCQl9CisKKwkJCS8vIFJlc2V0IHRoZSBhcmVhIGxpc3QKKwkJCWlmIChhcmVhTGlzdCAhPSBudWxsKSB7CisJCQkJYXJlYUxpc3QuY2xlYXIoKTsKKwkJCQlhcmVhTGlzdCA9IG51bGw7CisJCQl9CisKKwkJCS8vIFJ1biBnYXJiYWdlIGNvbGxlY3Rpb24KKwkJCS8vU3lzdGVtLmdjKCk7CisKKwkJfSAvLyBGb3IgbG9vcAorCisJfQorCisJLyoqCisJICogRXh0cmFjdCB0aGUgY291bnRyeSBuYW1lIGZyb20gdGhlIGZpbGUgbmFtZS4gVXNlZnVsIHV0aWxpdHkgbWV0aG9kLgorCSAqIAorCSAqIEBwYXJhbSBmaWxlCisJICogICAgICAgICAgICBhIGZpbGVuYW1lLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGNvdW50cnkgbmFtZSBlbWJlZGRlZCBpbiB0aGUgZmlsZW5hbWUuCisJICovCisJU3RyaW5nIGV4dHJhY3RDb3VudHJ5TmFtZShTdHJpbmcgZmlsZSkgeworCisJCWludCBzZXBhcmF0b3IgPSBmaWxlLmxhc3RJbmRleE9mKCJcXCIpOyAvLyROT04tTkxTLTEkCisKKwkJaW50IGRvdCA9IGZpbGUubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAorCisJCVN0cmluZyBzdWJzdHJpbmcgPSBmaWxlLnN1YnN0cmluZyhzZXBhcmF0b3IgKyAxLCBkb3QpOworCisJCXJldHVybiBzdWJzdHJpbmcudG9VcHBlckNhc2UoKTsKKwl9CisKKwkvKioKKwkgKiBGaW5kIGlmIGEgZ2l2ZW4gbG9jYXRpb24gaGFzIGJlZW4gbWF0Y2hlZCBhbHJlYWR5LgorCSAqIAorCSAqIEBwYXJhbSBhCisJICogICAgICAgICAgICBsb2NhdGlvbgorCSAqIAorCSAqIEByZXR1cm4gd2hldGhlciBhIG1hdGNoIGlzIGZvdW5kIG9yIG5vdCBmb3IgdGhlIGxvY2F0aW9uLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGZpbmRNYXRjaChTdHJpbmcgbG9jYXRpb24pIHsKKworCQlmaW5hbCBpbnQgTE9DQVRJT04gPSAxOworCisJCUl0ZXJhdG9yIGl0ID0gbWF0Y2hMaXN0Lml0ZXJhdG9yKCk7CisKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQlTdHJpbmdbXSBkYXRhID0gKChTdHJpbmcpIGl0Lm5leHQoKSkuc3BsaXQoIjoiKTsgLy8kTk9OLU5MUy0xJAorCisJCQlTdHJpbmdbXSBjb21wYXJlID0gbnVsbDsKKworCQkJU3RyaW5nIGVudGl0eSA9IGRhdGFbTE9DQVRJT05dOworCisJCQlTdHJpbmcgbG9jYXRpb25TdHIgPSBsb2NhdGlvbi5yZXBsYWNlKCJcXHQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQlsb2NhdGlvblN0ciA9IGxvY2F0aW9uU3RyLnRvVXBwZXJDYXNlKCkudHJpbSgpOworCisJCQkvLyBIYW5kbGUgQWxpYXNlcyAtLSBjb21wbGV4IHN0dWZmIDokCisJCQlpZiAobG9jYXRpb25TdHIuY29udGFpbnMoIlsiKSkgeyAvLyROT04tTkxTLTEkCisKKwkJCQlsb2NhdGlvblN0ciA9IGxvY2F0aW9uU3RyLnJlcGxhY2UoIl0iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQkJLy8gVG9rZW5pemUKKwkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihsb2NhdGlvblN0ciwgIlsiKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJLy8gR2V0IHRva2VucyAtPiBvcmRlciBtYXR0ZXJzIGhlcmUhCisJCQkJY29tcGFyZSA9IG5ldyBTdHJpbmdbdG9rZW5zLmNvdW50VG9rZW5zKCldOworCQkJCWludCBpID0gMDsKKwkJCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworCQkJCQljb21wYXJlW2krK10gPSB0b2tlbnMubmV4dFRva2VuKCkudG9VcHBlckNhc2UoKS50cmltKCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoY29tcGFyZSAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wYXJlLmxlbmd0aDsgaSsrKSB7CisJCQkJCWlmIChlbnRpdHkucmVwbGFjZSgiLSIsICIgIikuZXF1YWxzKGNvbXBhcmVbaV0pIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCXx8IGNvbXBhcmVbaV0uZXF1YWxzKGVudGl0eSArICItMSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGVudGl0eS5lcXVhbHMobG9jYXRpb24pCisJCQkJCXx8IGVudGl0eS5yZXBsYWNlKCItIiwgIiAiKS5lcXVhbHMobG9jYXRpb24pIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQl8fCBsb2NhdGlvbi5lcXVhbHMoZW50aXR5ICsgIi0xIikpIHsgLy8kTk9OLU5MUy0xJAorCisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisKKwkJCS8vIGlmIChkYXRhW0xPQ0FUSU9OXS50b1VwcGVyQ2FzZSgpLnRyaW0oKS5lcXVhbHMobG9jYXRpb24pKSB7CisJCQkvLyByZXR1cm4gdHJ1ZTsKKwkJCS8vIH0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBGaW5kIHRoZSBwb3B1bGF0aW9uIHZhbHVlIGZvciBhIGdpdmVuIGVudGl0eS4KKwkgKiAKKwkgKiBAcGFyYW0gZW50aXR5CisJICogICAgICAgICAgICBhIGxvY2F0aW9uLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHBvcHVsYXRpb24gb2YgYSBsb2NhdGlvbiAoaWYgZm91bmQpLgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UG9wdWxhdGlvbihTdHJpbmcgZW50aXR5LCBpbnQgbGV2ZWwpIHsKKworCQlmaW5hbCBpbnQgRU5USVRZID0gMDsKKworCQlmaW5hbCBpbnQgTEVWRUwgPSAxOworCisJCWZpbmFsIGludCBQT1BVTEFUSU9OID0gMjsKKworCQlJdGVyYXRvciBpdCA9IHBvcHVsYXRpb25MaXN0Lml0ZXJhdG9yKCk7CisKKwkJU3RyaW5nIGVudGl0eVN0ciA9IGVudGl0eS50b1VwcGVyQ2FzZSgpOworCisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKworCQkJU3RyaW5nW10gcG9wRGF0YSA9ICgoU3RyaW5nKSBpdC5uZXh0KCkpLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJaWYgKGVudGl0eVN0ci5lcXVhbHMocG9wRGF0YVtFTlRJVFldLnRyaW0oKS50b1VwcGVyQ2FzZSgpKSkgeworCisJCQkJLy8gQ2hlY2sgYm90aCBlbnRpdGllcyBiZWxvbmcgdG8gc2FtZSBsZXZlbAorCQkJCWlmIChTdHJpbmcudmFsdWVPZihsZXZlbCkuZXF1YWxzKHBvcERhdGFbTEVWRUxdLnRyaW0oKSkgPT0gZmFsc2UpIHsKKwkJCQkJLy8gSWdub3JlIDogc2FtZSBuYW1lICwgYnV0IGRpZmZlcmVudCBsZXZlbAorCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gcG9wRGF0YVtQT1BVTEFUSU9OXS50cmltKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIERFRkFVTFQ7CisJfQorCisJLyoqCisJICogRmluZCB0aGUgcG9wdWxhdGlvbiB2YWx1ZSBmb3IgYSBnaXZlbiBlbnRpdHkuCisJICogCisJICogQHBhcmFtIGVudGl0eQorCSAqICAgICAgICAgICAgYSBsb2NhdGlvbgorCSAqIAorCSAqIEBwYXJhbSBlbnRpdHlDb250YWluZXIKKwkgKiAgICAgICAgICAgIGEgY29udGFpbmVyIChpLmUuIGxldmVsIDEgYWRtaW5pdHJhdGlpb24pIGZvciB0aGUgbG9jYXRpb24KKwkgKiAKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBwb3B1bGF0aW9uIG9mIHRoZSBsb2NhdGlvbgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UG9wdWxhdGlvbihTdHJpbmcgZW50aXR5LCBTdHJpbmcgZW50aXR5Q29udGFpbmVyLAorCQkJaW50IGxldmVsKSB7CisKKwkJZmluYWwgaW50IEVOVElUWSA9IDA7CisKKwkJZmluYWwgaW50IExFVkVMID0gMTsKKworCQlmaW5hbCBpbnQgUE9QVUxBVElPTiA9IDI7CisKKwkJU3RyaW5nW10gcG9wRGF0YSA9IG51bGw7CisKKwkJSXRlcmF0b3IgaXQgPSBwb3B1bGF0aW9uTGlzdC5pdGVyYXRvcigpOworCisJCVN0cmluZyBlbnRpdHlTdHIgPSBlbnRpdHkudG9VcHBlckNhc2UoKS50cmltKCk7CisKKwkJZW50aXR5U3RyID0gZW50aXR5U3RyLnJlcGxhY2UoIlxcdCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJU3RyaW5nIGVudGl0eUNvbnRhaW5lclN0ciA9IGVudGl0eUNvbnRhaW5lci50b1VwcGVyQ2FzZSgpOworCisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKworCQkJcG9wRGF0YSA9ICgoU3RyaW5nKSBpdC5uZXh0KCkpLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJU3RyaW5nW10gY29tcGFyZSA9IG51bGw7CisKKwkJCS8vIEdldCB0aGUgZW50aXR5IG5hbWUgYW5kIHJlbW92ZSBibGFua3MKKwkJCVN0cmluZyBsb2NhdGlvbiA9IHBvcERhdGFbRU5USVRZXTsKKworCQkJbG9jYXRpb24gPSBsb2NhdGlvbi5yZXBsYWNlKCJcXHQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQlsb2NhdGlvbiA9IGxvY2F0aW9uLnRvVXBwZXJDYXNlKCkudHJpbSgpOworCisJCQkvLyBIYW5kbGUgQWxpYXNlcyAtLSBjb21wbGV4IHN0dWZmIDokCisJCQlpZiAobG9jYXRpb24uY29udGFpbnMoIlsiKSkgeyAvLyROT04tTkxTLTEkCisKKwkJCQlsb2NhdGlvbiA9IGxvY2F0aW9uLnJlcGxhY2UoIl0iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQkJLy8gVG9rZW5pemUKKwkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihsb2NhdGlvbiwgIlsiKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJLy8gR2V0IHRva2VucyAtPiBvcmRlciBtYXR0ZXJzIGhlcmUhCisJCQkJY29tcGFyZSA9IG5ldyBTdHJpbmdbdG9rZW5zLmNvdW50VG9rZW5zKCldOworCQkJCWludCBpID0gMDsKKwkJCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworCQkJCQljb21wYXJlW2krK10gPSB0b2tlbnMubmV4dFRva2VuKCkudG9VcHBlckNhc2UoKS50cmltKCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoY29tcGFyZSAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wYXJlLmxlbmd0aDsgaSsrKSB7CisJCQkJCWlmIChlbnRpdHlTdHIucmVwbGFjZSgiLSIsICIgIikuZXF1YWxzKCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQljb21wYXJlW2ldLnJlcGxhY2UoIi0iLCAiICIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQl8fCBjb21wYXJlW2ldLmVxdWFscyhlbnRpdHlTdHIgKyAiLTEiKSAvLyROT04tTkxTLTEkCisJCQkJCQkJfHwgY29tcGFyZVtpXS5lcXVhbHMoZW50aXR5Q29udGFpbmVyU3RyKSkgeworCisJCQkJCQkvLyBDaGVjayBib3RoIGVudGl0aWVzIGJlbG9uZyB0byBzYW1lIGxldmVsCisJCQkJCQlpZiAoU3RyaW5nLnZhbHVlT2YobGV2ZWwpLmVxdWFscyhwb3BEYXRhW0xFVkVMXS50cmltKCkpID09IGZhbHNlKSB7CisJCQkJCQkJLy8gSWdub3JlIDogc2FtZSBuYW1lICwgYnV0IGRpZmZlcmVudCBsZXZlbAorCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCisJCQkJCQlyZXR1cm4gcG9wRGF0YVtQT1BVTEFUSU9OXS50cmltKCk7CisKKwkJCQkJfQorCisJCQkJfQorCQkJfSBlbHNlIGlmIChlbnRpdHlTdHIuZXF1YWxzKGxvY2F0aW9uKQorCQkJCQl8fCBlbnRpdHlTdHIucmVwbGFjZSgiLSIsICIgIikuZXF1YWxzKGxvY2F0aW9uKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJfHwgbG9jYXRpb24uZXF1YWxzKGVudGl0eVN0ciArICItMSIpKSB7IC8vJE5PTi1OTFMtMSQKKworCQkJCS8vIENoZWNrIGJvdGggZW50aXRpZXMgYmVsb25nIHRvIHNhbWUgbGV2ZWwKKwkJCQlpZiAoU3RyaW5nLnZhbHVlT2YobGV2ZWwpLmVxdWFscyhwb3BEYXRhW0xFVkVMXS50cmltKCkpID09IGZhbHNlKSB7CisJCQkJCS8vIElnbm9yZSA6IHNhbWUgbmFtZSAsIGJ1dCBkaWZmZXJlbnQgbGV2ZWwKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJcmV0dXJuIHBvcERhdGFbUE9QVUxBVElPTl0udHJpbSgpOworCisJCQl9CisKKwkJfSAvLyB3aGlsZQorCisJCXJldHVybiBERUZBVUxUOworCX0KKworCS8qKgorCSAqIEZpbmQgdGhlIGFyZWEgdmFsdWUgZm9yIGEgZ2l2ZW4gZW50aXR5LgorCSAqIAorCSAqIEBwYXJhbSBlbnRpdHkKKwkgKiAgICAgICAgICAgIGEgbG9jYXRpb24KKwkgKiAKKwkgKiBAcGFyYW0gZW50aXR5Q29udGFpbmVyCisJICogICAgICAgICAgICBhIGNvbnRhaW5lciAoaS5lLiBsZXZlbCAxIGFkbWluaXRyYXRpaW9uKSBmb3IgdGhlIGxvY2F0aW9uCisJICogCisJICogQHBhcmFtIGxldmVsCisJICogICAgICAgICAgICB0aGUgYWRtaW5pc3RyYXRpdmUgbGV2ZWwuCisJICogCisJICogQHJldHVybiB0aGUgYXJlYSBvZiB0aGUgbG9jYXRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEFyZWEoU3RyaW5nIGVudGl0eSwgU3RyaW5nIGVudGl0eUNvbnRhaW5lciwgaW50IGxldmVsKSB7CisKKwkJZmluYWwgaW50IEVOVElUWSA9IDA7CisKKwkJZmluYWwgaW50IExFVkVMID0gMTsKKworCQlmaW5hbCBpbnQgQVJFQSA9IDI7CisKKwkJU3RyaW5nW10gYXJlYURhdGEgPSBudWxsOworCisJCUl0ZXJhdG9yIGl0ID0gYXJlYUxpc3QuaXRlcmF0b3IoKTsKKworCQlTdHJpbmcgZW50aXR5U3RyID0gZW50aXR5LnRvVXBwZXJDYXNlKCkudHJpbSgpOworCisJCWVudGl0eVN0ciA9IGVudGl0eVN0ci5yZXBsYWNlKCJcXHQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCVN0cmluZyBlbnRpdHlDb250YWluZXJTdHIgPSBlbnRpdHlDb250YWluZXIudG9VcHBlckNhc2UoKTsKKworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisKKwkJCWFyZWFEYXRhID0gKChTdHJpbmcpIGl0Lm5leHQoKSkuc3BsaXQoIjoiKTsgLy8kTk9OLU5MUy0xJAorCisJCQlTdHJpbmdbXSBjb21wYXJlID0gbnVsbDsKKworCQkJLy8gR2V0IHRoZSBlbnRpdHkgbmFtZSBhbmQgcmVtb3ZlIGJsYW5rcworCQkJU3RyaW5nIGxvY2F0aW9uID0gYXJlYURhdGFbRU5USVRZXTsKKworCQkJbG9jYXRpb24gPSBsb2NhdGlvbi5yZXBsYWNlKCJcXHQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQlsb2NhdGlvbiA9IGxvY2F0aW9uLnRvVXBwZXJDYXNlKCkudHJpbSgpOworCisJCQkvLyBIYW5kbGUgQWxpYXNlcyAtLSBjb21wbGV4IHN0dWZmIDokCisJCQlpZiAobG9jYXRpb24uY29udGFpbnMoIlsiKSkgeyAvLyROT04tTkxTLTEkCisKKwkJCQlsb2NhdGlvbiA9IGxvY2F0aW9uLnJlcGxhY2UoIl0iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQkJLy8gVG9rZW5pemUKKwkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihsb2NhdGlvbiwgIlsiKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJLy8gR2V0IHRva2VucyAtPiBvcmRlciBtYXR0ZXJzIGhlcmUhCisJCQkJY29tcGFyZSA9IG5ldyBTdHJpbmdbdG9rZW5zLmNvdW50VG9rZW5zKCldOworCQkJCWludCBpID0gMDsKKwkJCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworCQkJCQljb21wYXJlW2krK10gPSB0b2tlbnMubmV4dFRva2VuKCkudG9VcHBlckNhc2UoKS50cmltKCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoY29tcGFyZSAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wYXJlLmxlbmd0aDsgaSsrKSB7CisJCQkJCWlmIChlbnRpdHlTdHIucmVwbGFjZSgiLSIsICIgIikuZXF1YWxzKCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQljb21wYXJlW2ldLnJlcGxhY2UoIi0iLCAiICIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQl8fCBjb21wYXJlW2ldLmVxdWFscyhlbnRpdHlTdHIgKyAiLTEiKSAvLyROT04tTkxTLTEkCisJCQkJCQkJfHwgY29tcGFyZVtpXS5lcXVhbHMoZW50aXR5Q29udGFpbmVyU3RyKSkgeworCisJCQkJCQkvLyBDaGVjayBib3RoIGVudGl0aWVzIGJlbG9uZyB0byBzYW1lIGxldmVsCisJCQkJCQlpZiAoU3RyaW5nLnZhbHVlT2YobGV2ZWwpCisJCQkJCQkJCS5lcXVhbHMoYXJlYURhdGFbTEVWRUxdLnRyaW0oKSkgPT0gZmFsc2UpIHsKKwkJCQkJCQkvLyBJZ25vcmUgOiBzYW1lIG5hbWUgLCBidXQgZGlmZmVyZW50IGxldmVsCisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisKKwkJCQkJCXJldHVybiBhcmVhRGF0YVtBUkVBXS50cmltKCk7CisJCQkJCX0KKworCQkJCX0KKwkJCX0gZWxzZSBpZiAoZW50aXR5U3RyLmVxdWFscyhsb2NhdGlvbikKKwkJCQkJfHwgZW50aXR5U3RyLnJlcGxhY2UoIi0iLCAiICIpLmVxdWFscyhsb2NhdGlvbikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCXx8IGxvY2F0aW9uLmVxdWFscyhlbnRpdHlTdHIgKyAiLTEiKSkgeyAvLyROT04tTkxTLTEkCisKKwkJCQkvLyBDaGVjayBib3RoIGVudGl0aWVzIGJlbG9uZyB0byBzYW1lIGxldmVsCisJCQkJaWYgKFN0cmluZy52YWx1ZU9mKGxldmVsKS5lcXVhbHMoYXJlYURhdGFbTEVWRUxdLnRyaW0oKSkgPT0gZmFsc2UpIHsKKwkJCQkJLy8gSWdub3JlIDogc2FtZSBuYW1lICwgYnV0IGRpZmZlcmVudCBsZXZlbAorCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gYXJlYURhdGFbQVJFQV0udHJpbSgpOworCQkJfQorCisJCX0gLy8gd2hpbGUKKworCQlyZXR1cm4gREVGQVVMVDsKKwl9CisKKwkvKioKKwkgKiBNYWluIGV4ZWN1dGlvbiBlbnRyeSBwb2ludC4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqIAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJZmluYWwgaW50IElTT18zMTY2XzEgPSAwOworCQlmaW5hbCBpbnQgQ0lBX0RBVEEgPSAxOworCQlmaW5hbCBpbnQgVEFSR0VUX0xJU1QgPSAyOworCQlmaW5hbCBpbnQgTUFUQ0hFUyA9IDM7CisJCWZpbmFsIGludCBQQVJBTVMgPSA0OworCisJCWlmIChhcmdzLmxlbmd0aCA8IFBBUkFNUykgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCItLVdyb25nIGFyZ3VtZW50cy0tIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQKKwkJCQkJLnByaW50bG4oIlx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyA6ICIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgSVNPIDMxNjYtMSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBDSUEgZGF0YSIpOyAvLyROT04tTkxTLTEkCQkJCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgVGFyZ2V0IGNvdW50cmllcyBmaWxlIik7IC8vJE5PTi1OTFMtMSQJCQkKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBPdXRwdXQgZGlyZWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQJCQkJCQorCQkJcmV0dXJuOworCQl9CisKKwkJTWF0Y2hQcm9maWxlciBwcm9maWxlciA9IG5ldyBNYXRjaFByb2ZpbGVyKGFyZ3NbSVNPXzMxNjZfMV0sCisJCQkJYXJnc1tDSUFfREFUQV0sIGFyZ3NbVEFSR0VUX0xJU1RdLCBhcmdzW01BVENIRVNdKTsKKwkJcHJvZmlsZXIucnVuKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL01lc3NhZ2VzLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNjN2JlZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCisvKioKKyAqIAorICogQXV0b2dlbmVyYXRlZCBjbGFzcworICogCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlcyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKKwkJCS5nZXRCdW5kbGUoQlVORExFX05BTUUpOworCisJcHJpdmF0ZSBNZXNzYWdlcygpIHsKKwkJLy8gTm90aGluZyBoZXJlCisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZXh0ZXJuYWxpemVkIHN0cmluZyBsaXRlcmFsLgorCSAqIAorCSAqIEBwYXJhbSBrZXkKKwkgKiBAcmV0dXJuIHRoZSBleHRlcm5hbGl6ZWQgc3RyaW5nIGxpdGVyYWwuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7CisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9NdWx0aVBhc3NEb3duU2FtcGxlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9NdWx0aVBhc3NEb3duU2FtcGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMTlkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL011bHRpUGFzc0Rvd25TYW1wbGVyLmphdmEKQEAgLTAsMCArMSwxODY5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFNURU0gSUkgRGF0YSBNaWdyYXRpb24vR2VuZXJhdGlvbiBVdGlsaXRpZXMgOiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUKKyAqIHVzZWQgdG8gcnVuIGEgcG9pbnQtcmVkdWN0aW9uIGFsZ29yaXRobSBvbiB0aGUgRGl2YSBzZXQuCisgKiAKKyAqIAorICogTk9URTogTVVMVEkgUEFTUyBET1dOIFNBTVBMRVIgaXMgdXNlZCBmb3IgaXRlcmF0aW9ucyB0d28gYW5kIGJleW9uZC4gRm9yCisgKiBmaXJzdCBvciBzaW5nbGUgaXRlcmF0aW9uIGFsd2F5cyB1c2Ugc2luZ2xlIHBhc3MgZG93biBzYW1wbGVyLgorICogCisgKiAKKyAqIFRvIGNvbmZpZ3VyZSwgc2VlIGNvbmZpZ3VyYXRpb24gZmlsZSA6CisgKiBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9NdWx0aVBhc3NEb3duU2FtcGxlci5jb25maWcKKyAqIAorICogCisgKiBUbyBydW4sIGFkZCBwYXRoIHRvIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiB0aGUgcnVuIHByb2ZpbGUgKGkuZS4KKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcY29uZmlndXJhdGlvblxNdWx0aVBhc3NEb3duU2FtcGxlci5jb25maWcpCisgKiAKKyAqIAorICogU0VUIFZNQVJHUyBUTyA6IC1YbXMxMDI0bSAtWG14MTAyNG0KKyAqIAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aVBhc3NEb3duU2FtcGxlciB7CisKKwkvKioKKwkgKiBPdXIgc291cmNlIGZpbGVzIGZvciBJU08gMzE2Ni0xIGNvZGVzIGFuZCBmb3IgdGhlIGxpc3Qgb2YgdGFyZ2V0CisJICogY291bnRyaWVzLgorCSAqLworCisJcHJpdmF0ZSBTdHJpbmcgdGhyZXNob2xkID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIGl0ZXJhdGlvbnMgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgaXNvMzE2Nl8xID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIGlzbzMxNjZfMiA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBmaXhGaWxlID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIHRhcmdldEZpbGUgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgaW5wdXREaXIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgbGV4RGlyID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIG91dHB1dERpciA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyB3b3Jrc3BhY2UgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgdXNhRGVzY3JpcHRvckZpbGUgPSBudWxsOworCisJLyoqCisJICogTGlzdCBmb3IgSVNPIDMxNjYtMSBjb2RlcyBhbmQgdGFyZ2V0IGNvdW50cmllcy4KKwkgKi8KKworCUxpc3QgdGFyZ2V0TGlzdCA9IG51bGw7CisKKwlMaXN0IGNvZGVMaXN0ID0gbnVsbDsKKworCUxpc3QgY29kZWZpeExpc3QgPSBudWxsOworCisJTGlzdCB1c2FEZXNjcmlwdG9yTGlzdCA9IG51bGw7CisKKwkvKioKKwkgKiBMaXN0IHRvIGtlZXAgdHJhY2sgb2YgcGFpcnMgKFBvaW50RGF2YTpWYWx1ZSkKKwkgKi8KKwlMaXN0PFN0cmluZz4gcG9pbnREYXRhTGlzdCA9IG51bGw7CisKKwkvKioKKwkgKiBBIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB3ZSBjYW4gZGVsZXRlIGEgcG9pbnQuCisJICovCisJLy8gTm8sIGl0IGlzIG5vdCBzYWZlIHRvIHJlbW92ZSB0aGlzIG5vZGUuCisJZmluYWwgU3RyaW5nIFVOU0FGRSA9ICIwIjsgLy8kTk9OLU5MUy0xJAorCisJLy8gWWVzLCBpdCBjYW4gYmUgZGVsZXRlZC4KKwlmaW5hbCBTdHJpbmcgU0FGRSA9ICIxIjsgLy8kTk9OLU5MUy0xJAorCisJLy8gU2FmZXR5IHN0YXRlIG5vdCBrbm93biB5ZXQgLT4gaW5pdGlhbCB2YWx1ZS4KKwlmaW5hbCBTdHJpbmcgVU5LTk9XTiA9ICIyIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVXNlZCBmb3IgZ2xvYmFsIHN0YXRzLgorCSAqLworCWRvdWJsZSB0b3RhbFBvaW50cyA9IDA7CisKKwlkb3VibGUgdG90YWxSZW1vdmVkID0gMDsKKworCWRvdWJsZSB0b3RhbFBvbHlnb25zID0gMDsKKworCWRvdWJsZSBnbG9iYWxNaW5QZXJjZW50ID0gRG91YmxlLk1BWF9WQUxVRTsKKworCWRvdWJsZSBnbG9iYWxNYXhQZXJjZW50ID0gMC4wOworCisJZG91YmxlIGdsb2JhbFBlcmNlbnQgPSAwLjA7CisKKwkvKioKKwkgKiBMaXN0cyB0byBrZWVwIHRyYWNrIG9mIHRoZSBvY2N1cmVuY2VzIG9mIHZhbHVlcyBvZiB0aGUgYW5nbGVzIDogMTgwIC0KKwkgKiBBcmNDb3ModGV0YSkKKwkgKiAKKwkgKi8KKwlIYXNoTWFwPERvdWJsZSwgSW50ZWdlcj4gYW5nbGVWYWx1ZU1hcCA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqIAorCSAqIEBwYXJhbSB0aHJlc2hvbGQgLQorCSAqICAgICAgICAgICAgdGhlIHRocmVzaG9sZCBpbiBkZWdyZXNzCisJICogQHBhcmFtIGl0ZXJhdGlvbnMgLQorCSAqICAgICAgICAgICAgdGhlIHRvdGFsIG51bWJlciBvZiBkb3duIHNhbXBsaW5nIGl0ZXJhdGlvbnMKKwkgKiBAcGFyYW0gaXNvMzE2Nl8xIC0KKwkgKiAgICAgICAgICAgIGRhdGEgZmlsZSB3aXRoIHRoZSBJU08zMTY2LTEgQUxQSEFfMiBhbmQgQUxQSEFfMyBjb2Rlcy4KKwkgKiBAcGFyYW0gaXNvMzE2Nl8yIC0KKwkgKiAgICAgICAgICAgIGRhdGEgZmlsZSB3aXRoIHRoZSBJU08zMTY2LTIgY29kZXMuCisJICogQHBhcmFtIGZpeEZpbGUgLQorCSAqICAgICAgICAgICAgZmlsZSBjb250YWluaW5nIG1pc3NpbmcgSVNPMzE2Ni0yIGNvZGVzCisJICogQHBhcmFtIHRhcmdldEZpbGUKKwkgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGNvdW50cmllcyBmb3Igd2hpY2ggd2Ugd2lsbCBnZW5lcmF0ZSBHTUwgZmlsZXMKKwkgKiBAcGFyYW0gbGV4RGlyCisJICogICAgICAgICAgICBmb2xkZXIgY29udGFpbmluZyBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgZmlsZXMKKwkgKiBAcGFyYW0gb3V0cHV0RGlyCisJICogICAgICAgICAgICB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIEdNTCBmaWxlcyB3ZSBnZW5lcmF0ZQorCSAqLworCS8vIHB1YmxpYyBNdWx0aVBhc3NEb3duU2FtcGxlcihTdHJpbmcgdGhyZXNob2xkLCBTdHJpbmcgaXRlcmF0aW9ucywKKwkvLyBTdHJpbmcgaXNvMzE2Nl8xLCBTdHJpbmcgaXNvMzE2Nl8yLCBTdHJpbmcgZml4RmlsZSwKKwkvLyBTdHJpbmcgdGFyZ2V0RmlsZSwgU3RyaW5nIGxleERpciwgU3RyaW5nIG91dHB1dERpcikgeworCS8vIC8vIFNldCB2YWx1ZXMgb2YgZ2xvYmFsIHZhcmlhYmxlcy4KKwkvLyB0aGlzLnRocmVzaG9sZCA9IHRocmVzaG9sZDsKKwkvLyB0aGlzLml0ZXJhdGlvbnMgPSBpdGVyYXRpb25zOworCS8vIHRoaXMuaXNvMzE2Nl8xID0gaXNvMzE2Nl8xOworCS8vIHRoaXMuaXNvMzE2Nl8yID0gaXNvMzE2Nl8yOworCS8vIHRoaXMuZml4RmlsZSA9IGZpeEZpbGU7CisJLy8gdGhpcy50YXJnZXRGaWxlID0gdGFyZ2V0RmlsZTsKKwkvLyB0aGlzLmxleERpciA9IGxleERpcjsKKwkvLyB0aGlzLm91dHB1dERpciA9IG91dHB1dERpcjsKKwkvLyAvLyBGb3IgdGhlIG1vbWVudCBhbmQgZm9yIGNvbnZlbmllbmNlLCB0aGUgaW5wdXQgZGlyIGlzIGFsc28gdGhlIG91dHB1dAorCS8vIC8vIGRpci4KKwkvLyB0aGlzLmlucHV0RGlyID0gb3V0cHV0RGlyOworCS8vIHRhcmdldExpc3QgPSBudWxsOworCS8vIGFuZ2xlVmFsdWVNYXAgPSBuZXcgSGFzaE1hcDxEb3VibGUsIEludGVnZXI+KCk7CisJLy8gdGhpcy51c2FEZXNjcmlwdG9yRmlsZSA9IHdvcmtzcGFjZQorCS8vICsgIlxcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XFxwYXJhbWV0ZXJzXFxJU09GSVhcXFVTQV9GSVBTLnR4dCI7CisJLy8gLy8kTk9OLU5MUy0xJAorCS8vIH0KKwkvKioKKwkgKiBAcGFyYW0gY29uZmlnRmlsZQorCSAqLworCXB1YmxpYyBNdWx0aVBhc3NEb3duU2FtcGxlcihTdHJpbmcgY29uZmlnRmlsZSkgeworCisJCS8vIExvYWQgYWxsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCisJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHZhcnMgPSBHZW5VdGlscy5sb2FkQ29uZmlnRmlsZShjb25maWdGaWxlKTsKKworCQlTZXQ8U3RyaW5nPiBrZXlzID0gdmFycy5rZXlTZXQoKTsKKwkJSXRlcmF0b3IgaXQgPSBrZXlzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyB2YXIgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisKKwkJCS8vIEFzc2lnbiB2YWx1ZXMgdG8gY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgOgorCQkJaWYgKHZhci5lcXVhbHMoIldPUktTUEFDRSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl3b3Jrc3BhY2UgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJUSFJFU0hPTEQiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJdGhyZXNob2xkID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiSVRFUkFUSU9OUyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpdGVyYXRpb25zID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiSVNPMzE2Nl8xIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWlzbzMxNjZfMSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIklTTzMxNjZfMiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpc28zMTY2XzIgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJJU09fRklYIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWZpeEZpbGUgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJUQVJHRVRfTElTVCIpIHx8IHZhci5lcXVhbHMoIlJFRFVDRV9MSVNUIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJdGFyZ2V0RmlsZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIkxFWF9ESVIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJbGV4RGlyID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiTUFQX09VVFBVVCIpIHx8IHZhci5lcXVhbHMoIk9VVFBVVCIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCW91dHB1dERpciA9IHZhcnMuZ2V0KHZhcik7CisJCQl9CisKKwkJfSAvLyB3aGlsZQorCisJCS8vIFRoZSB3b3Jrc3BhY2UgdmFyaWFibGUgc2hvdWxkIGVuZCB3aXRoIGEgc2xhc2ggY2hhcmFjdGVyCisJCWlmICh3b3Jrc3BhY2UuZW5kc1dpdGgoIlxcIikgPT0gZmFsc2UpIHsgLy8kTk9OLU5MUy0xJAorCQkJd29ya3NwYWNlICs9ICJcXCI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCVN0cmluZyBwYXRoID0gd29ya3NwYWNlICsgR2VuQ29uc3RhbnRzLlBBUkFNU19ESVI7CisKKwkJLy8gU2V0IHJlbWFpbmluZyBjb25maWcgdmFycyB1c2luZyBXT1JLU1BBQ0UgKHdvcmtzcGFjZSByZWxhdGl2ZSkKKwkJaWYgKHRocmVzaG9sZCA9PSBudWxsKSB7CisJCQl0aHJlc2hvbGQgPSBHZW5Db25zdGFudHMuREVGQVVMVF9USFJFU0hPTEQ7IC8vIERlZmF1bHRzIHRvIDUgZGVncmVlcworCQl9CisJCWlmIChpdGVyYXRpb25zID09IG51bGwpIHsKKwkJCWl0ZXJhdGlvbnMgPSBHZW5Db25zdGFudHMuREVGQVVMVF9JVEVSQVRJT05TOyAvLyBEZWZhdWx0cyB0byA1CisJCQkvLyBpdGVyYXRpb25zCisJCX0KKwkJaWYgKGlzbzMxNjZfMSA9PSBudWxsKSB7CisJCQlpc28zMTY2XzEgPSBwYXRoICsgR2VuQ29uc3RhbnRzLklTTzMxNjZfMV9GSUxFOworCQl9CisJCWlmIChpc28zMTY2XzIgPT0gbnVsbCkgeworCQkJaXNvMzE2Nl8yID0gcGF0aCArIEdlbkNvbnN0YW50cy5JU08zMTY2XzJfRklMRTsKKwkJfQorCQlpZiAoZml4RmlsZSA9PSBudWxsKSB7CisJCQlmaXhGaWxlID0gcGF0aCArIEdlbkNvbnN0YW50cy5JU09GSVhfRklMRTsKKwkJfQorCQlpZiAodGFyZ2V0RmlsZSA9PSBudWxsKSB7CisJCQl0YXJnZXRGaWxlID0gcGF0aCArIEdlbkNvbnN0YW50cy5SRURVQ0VfTElTVDsKKwkJfQorCQlpZiAobGV4RGlyID09IG51bGwpIHsKKwkJCWxleERpciA9IHBhdGggKyBHZW5Db25zdGFudHMuTEVYX0RJUjsKKwkJfQorCisJCWlmIChHZW5VdGlscy52ZXJpZnlPdXRwdXREaXJlY3RvcnkodmFycykgPT0gZmFsc2UpIHsKKwkJCVN5c3RlbS5vdXQKKwkJCQkJLnByaW50bG4oIlx0XHRCYWQgY29uZmlndXJhdGlvbiBmaWxlIC0tIE9VVFBVVCB2YXJpYWJsZSBub3QgZm91bmQuIFBsZWFzZSBzcGVjaWZ5IG91dHB1dCBkaXJlY3RvcnkgdXNpbmcgZm9ybWF0IFZBUiA9IFZBTFVFIChpLmUuIE9VVFBVVCA9IEM6XFxkaXZhXFxncm91cGVkXFwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5leGl0KDEpOworCQl9CisKKwkJLy8gRm9yIHRoZSBtb21lbnQgYW5kIGZvciBjb252ZW5pZW5jZSwgdGhlIGlucHV0IGRpciBpcyBhbHNvIHRoZSBvdXRwdXQKKwkJLy8gZGlyLgorCQl0aGlzLmlucHV0RGlyID0gb3V0cHV0RGlyOworCQl0YXJnZXRMaXN0ID0gbnVsbDsKKwkJYW5nbGVWYWx1ZU1hcCA9IG5ldyBIYXNoTWFwPERvdWJsZSwgSW50ZWdlcj4oKTsKKwkJdGhpcy51c2FEZXNjcmlwdG9yRmlsZSA9IHBhdGggKyBHZW5Db25zdGFudHMuVVNBX0ZJUFNfRklMRTsKKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNldHMgdXAgYW5kIHJ1bnMgdGhpcyBnZW5lcmF0b3IuCisJICogCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIGNvdW50cmllcyB3ZSB3YW50LgorCQl0YXJnZXRMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KHRhcmdldEZpbGUpOworCisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgSVNPMzE2Ni0xIEFMUEhBMiwgQUxQSEEzLCBhbmQKKwkJLy8gbnVtZXJpYyBjb2Rlcy4KKwkJY29kZUxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QoaXNvMzE2Nl8xKTsKKworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIG1pc3NpbmcgSVNPMzE2Ni0yIGNvZGVzCisJCWNvZGVmaXhMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KGZpeEZpbGUpOworCisJCS8vIExvYWQgdGhlIGxpc3Qgb2YgZGVzY3JpcHRvcnMgZm9yIHRoZSBVU0EgKHNwZWNpYWwgY2FzZSkKKwkJdXNhRGVzY3JpcHRvckxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QodXNhRGVzY3JpcHRvckZpbGUpOworCisJCS8vIEluaXRpYWxpemUgdGhlIGhhc2ggbWFwCisJCWluaXRIYXNoTWFwKGFuZ2xlVmFsdWVNYXApOworCisJCS8vIE5vdywgcHJvY2VzcyBlYWNoIGl0ZW0gaW4gdGhlIHRhcmdldCBsaXN0LgorCQlwcm9jZXNzKCk7CisKKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplIHRoZSBoYXNoIG1hcC4KKwkgKiAKKwkgKiBAcGFyYW0gbWFwIC0KKwkgKiAgICAgICAgICAgIHRoZSBoYXNoIG1hcAorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIGluaXRIYXNoTWFwKEhhc2hNYXA8RG91YmxlLCBJbnRlZ2VyPiBtYXApIHsKKwkJLy8gQWRkIHNvbWUga2V5cy92YWx1ZXMgdG8gb3VyIGhhc2ggbWFwCisJCW1hcC5wdXQobmV3IERvdWJsZSg5MC4wKSwgbmV3IEludGVnZXIoMCkpOworCQltYXAucHV0KG5ldyBEb3VibGUoNDUuMCksIG5ldyBJbnRlZ2VyKDApKTsKKwkJbWFwLnB1dChuZXcgRG91YmxlKDIyLjUpLCBuZXcgSW50ZWdlcigwKSk7CisJCW1hcC5wdXQobmV3IERvdWJsZSgxMS4yNSksIG5ldyBJbnRlZ2VyKDApKTsKKwkJbWFwLnB1dChuZXcgRG91YmxlKDUuNTEyNSksIG5ldyBJbnRlZ2VyKDApKTsKKwkJbWFwLnB1dChuZXcgRG91YmxlKDIuMCksIG5ldyBJbnRlZ2VyKDApKTsKKwkJbWFwLnB1dChuZXcgRG91YmxlKDEuNSksIG5ldyBJbnRlZ2VyKDApKTsKKwkJbWFwLnB1dChuZXcgRG91YmxlKDEuMCksIG5ldyBJbnRlZ2VyKDApKTsKKwkJbWFwLnB1dChuZXcgRG91YmxlKDAuNzUpLCBuZXcgSW50ZWdlcigwKSk7CisJCW1hcC5wdXQobmV3IERvdWJsZSgwLjUpLCBuZXcgSW50ZWdlcigwKSk7CisJCW1hcC5wdXQobmV3IERvdWJsZSgwLjI1KSwgbmV3IEludGVnZXIoMCkpOworCQltYXAucHV0KG5ldyBEb3VibGUoMC4xNSksIG5ldyBJbnRlZ2VyKDApKTsKKwkJbWFwLnB1dChuZXcgRG91YmxlKDAuMDUpLCBuZXcgSW50ZWdlcigwKSk7CisJfQorCisJLyoqCisJICogUGVyZm9ybSB0aGUgc2Vjb25kIGl0ZXJhdGlvbiBvZiBkb3duIHNhbXBsaW5nIGFuZCBiZXlvbmQuCisJICogCisJICogTk9URTogV2UgYXNzdW1lIHRoYXQgU2luZ2xlUGFzc0Rvd25TYW1wbGVyIGhhcyBiZWVuIHJ1biBvbmNlIGFscmVhZHkuCisJICogCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJvY2VzcygpIHsKKworCQkvLyBUaGUgaW5pdGlhbCBwYXNzIDogZmlyc3QgcGFzcyBhbHJlYWR5IGRvbmUgYnkgU2luZ2xlUGFzc0Rvd25TYW1wbGVyCisJCWZpbmFsIGludCBJTklUID0gMjsKKworCQkvLyBUaGUgY3VycmVudCBwYXNzIG9yIGl0ZXJhdGlvbgorCQlpbnQgcGFzcyA9IElOSVQ7CisKKwkJLy8gVGhlIHRvdGFsIG51bWJlciBvZiBpdGVyYXRpb25zCisJCWludCB0b3RhbEl0ZXJhdGlvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KGl0ZXJhdGlvbnMpOworCisJCS8vIEEgd3JpdGVyIGZvciB0aGUgbmV3IGZpbGUgd2UgYXJlIGNyZWF0aW5nLgorCQlQcmludFdyaXRlciBnbWxGaWxlID0gbnVsbDsKKworCQkvLyBBIHdyaXRlciBmb3IgdGhlIHJlZHVjZWQgZGF0YSBmaWxlLgorCQlQcmludFdyaXRlciByZWR1Y2VkRmlsZSA9IG51bGw7CisKKwkJLy8gT2JqZWN0IGhvbGRpbmcgSVNPMzE2Ni0xIHJlbGF0ZWQgZGF0YS4KKwkJSVNPQ29kZTEgaXNvQ29kZSA9IG51bGw7CisKKwkJLy8gTmFtZSBvZiB0aGUgbmV3IHByb3BlcnRpZXMgZmlsZS4KKwkJU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKKworCQkvLyBBIGxpc3QgZm9yIElTTyAzMTY2LTIgb2JqZWN0cworCQlMaXN0IGlzbzJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisJCS8vIEZpbGVuYW1lcyBmb3IgbGV4MSBhbmQgbGV4MiBmaWxlcyBmb3IgYSBnaXZlbiBjb3VudHJ5LgorCQlTdHJpbmcgbGV4QWRtaW4xRmlsZSA9IG51bGw7CisJCVN0cmluZyBsZXhBZG1pbjJGaWxlID0gbnVsbDsKKworCQkvLyBMaXN0cyBob2xkaW5nIHRoZSBsZXgxIGFuZCBsZXgyIHZhbHVlcy4KKwkJLy8gTk9URTogbGV4IHZhbHVlcyBhcmUgdGhlIGxleGljb2dyYXBoaWNhbGx5IHNvcnRlZCB2YWx1ZXMgZm9yCisJCS8vIGFkbWluaXN0cmF0aW9uIGxldmVscy4KKwkJTGlzdDxTdHJpbmc+IGxleDFEYXRhU2V0ID0gbnVsbDsKKwkJTGlzdDxTdHJpbmc+IGxleDJEYXRhU2V0ID0gbnVsbDsKKworCQkvLyBMaXN0cyBmb3IgaG9sZGluZyBsZXgxIGFuZCBsZXgyIG9iamVjdHMgZm9yIGEgZ2l2ZW4gY291bnRyeS4KKwkJTGlzdDxMZXgxT2JqPiBsZXgxTGlzdCA9IG51bGw7CisJCUxpc3Q8TGV4Mk9iaj4gbGV4Mkxpc3QgPSBudWxsOworCisJCWludCBzaXplID0gdGFyZ2V0TGlzdC5zaXplKCk7CisKKwkJLy8gQWxwaGEgMyBjb2RlIGZvciB0aGUgbmV4dCBjb2RlIHRvIHByb2Nlc3MuLi4KKwkJU3RyaW5nIGNvdW50cnlBbHBoYTMgPSBudWxsOworCisJCS8vIEl0ZXJhdGUgZm9yIGV2ZXJ5IGNvdW50cnkgYW5kIGNyZWF0ZSBpdHMgR01MIGRhdGEgZmlsZS4KKwkJaW50IGkgPSAwOworCisJCS8vIEdldCB0aGUgZmlyc3QgY291bnRyeSBpbiBsaXN0LgorCQljb3VudHJ5QWxwaGEzID0gKChTdHJpbmcpIHRhcmdldExpc3QuZ2V0KGkpKS50cmltKCk7CisKKwkJaWYgKGNvdW50cnlBbHBoYTMgPT0gbnVsbCkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0RXJyb3IgOiBhbHBoYSAzIGNvdW50cnkgY29kZSBpcyBudWxsLiIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJfQorCisJCXdoaWxlIChpIDwgc2l6ZSkgeworCisJCQkvLyBJcyBpdCB0aW1lIHRvIHByb2Nlc3MgdGhlIG5leHQgY291bnRyeSA/CisJCQlpZiAocGFzcyA+IHRvdGFsSXRlcmF0aW9ucykgeworCQkJCS8vIFllcyAsIHdlIGFyZSBkb25lIHdpdGggdGhlIGl0ZXJhdGlvbnMgLCBnbyB0byBuZXh0LgorCQkJCWkrKzsKKwkJCQlwYXNzID0gSU5JVDsKKwkJCQljb3VudHJ5QWxwaGEzID0gKGkgPCBzaXplKSA/ICgoU3RyaW5nKSB0YXJnZXRMaXN0LmdldChpKSkKKwkJCQkJCS50cmltKCkgOiAiRFVNTVkiOyAvLyROT04tTkxTLTEkCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8vIEtlZXAgd2l0aCB0aGUgc2FtZSBjb3VudHJ5IHVudGlsIHdlIGFyZSBkb25lIHdpdGggdGhlIHRvdGFsCisJCQkvLyBudW1iZXIgb2YgcGFzc2VzLiBPdGhlcndpc2UsIGdldCB0aGUgbmV4dCBjb3VudHJ5IGluIHJlZHVjZSBsaXN0LgorCisJCQkvLyBBbiBpbmRleCBmb3IgdW5rbndvbiBvciBuLmEuIGVudHJpZXMKKwkJCWludCB1bmtDb3VudGVyID0gMTsKKworCQkJLy8gV2UgdXNlIHRoaXMgbGlzdCB0byBrZWVwIHRyYWNrIG9mIGR1cGxpY2F0ZWQgcG9seWdvbnMuCisJCQlMaXN0PFNURU1Qb2x5Z29uPiBwb2x5Z29ucyA9IG51bGw7CisKKwkJCS8vIERhdGEgc291cmNlCisJCQlmaWxlTmFtZSA9IGlucHV0RGlyICsgY291bnRyeUFscGhhMyArICJcXCIgKyBjb3VudHJ5QWxwaGEzIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyAiX1JFRFVDRURfIiArIChwYXNzIC0gMSkgKyAiLnR4dCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBHZW5VdGlscy5vcGVuUmVhZGVyKGZpbGVOYW1lKTsKKwkJCVN5c3RlbS5vdXQKKwkJCQkJLnByaW50bG4oIlx0XHQ8PDw8IE1VTFRJIFBBU1MgRE9XTi1TQU1QTEVSIC0tIFByb2Nlc3NpbmcgY291bnRyeSA6ICIgKyBmaWxlTmFtZSArICIgPj4+PiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRcdDw8PDwgUGFzcyAiICsgcGFzcyArICIgb2YgIiArIHRvdGFsSXRlcmF0aW9ucyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkrICI+Pj4+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCXRyeSB7CisKKwkJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKKworCQkJCQlTdHJpbmcgYnVmZmVyID0gbnVsbDsKKwkJCQkJLy8gRGVzY3JpYmVzIGxldmVsIG9mIGRhdGEgd2UKKwkJCQkJLy8gYXJlIG5vdyBwcm9jZXNzaW5nIDogTEVWRUwwLCBMRVZFTDEsIG9yIExFVkVMMi4KKwkJCQkJaW50IGxldmVsID0gLTE7CisKKwkJCQkJLy8gUmVjb3JkIHRoZSBwcmV2aW91cyB0eXBlLgorCQkJCQlpbnQgb2xkbGV2ZWwgPSBsZXZlbCAtIDE7CisKKwkJCQkJLy8gVXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgc2ltcGxlIHBvbHlnb24gYW5kIGlzbGFuZHMKKwkJCQkJLy8gb2YgcG9seWdvbnMuIEluaXRpYWxpemUgc3RyaW5nIHRvIHRoZSBibGFuayBjaGFyYWN0ZXIuCisJCQkJCVN0cmluZyBpc2xhbmQgPSAiICI7IC8vJE5PTi1OTFMtMSQKKworCQkJCQl3aGlsZSAoR2VuVXRpbHMuRU9GKGJ1ZmZlciA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSB0cnVlKSB7CisKKwkJCQkJCS8vIFRoZSBkYXRhIHdlIHdhbnQgdG8gd3JpdGUgdG8gdGhlIG5ldyBHTUwgZmlsZS4KKwkJCQkJCVN0cmluZyBvdXRwdXQgPSAiICI7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgd2UgbWFyayBhbGwgdW5rbm93biBkYXRhLgorCQkJCQkJYnVmZmVyID0gYnVmZmVyLnJlcGxhY2UoIiwsIiwgIixVTktOT1dOLCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCQkJLy8gV2UgdGFrZSBhIGNodW5rIG9mIHRoZSBkYXRhIFtCVUZGRVJfTUlOLEJVRkZFUl9NQVhdCisJCQkJCQkvLyB0byBtYWtlIHByb2Nlc3NzaW5nIG1vcmUKKwkJCQkJCS8vIGVmZmljaWVudCwgd2UgZG9udCBuZWVkIGFsbCBvZiBpdC4KKwkJCQkJCWludCBCVUZGRVJfTUlOID0gMDsKKwkJCQkJCWludCBCVUZGRVJfTUFYID0gMTI1OworCisJCQkJCQlTdHJpbmdbXSBpdGVtcyA9IEdlblV0aWxzCisJCQkJCQkJCS5leHRyYWN0KGJ1ZmZlci5sZW5ndGgoKSA8IEJVRkZFUl9NQVggPyBidWZmZXIKKwkJCQkJCQkJCQk6IGJ1ZmZlci5zdWJzdHJpbmcoQlVGRkVSX01JTiwKKwkJCQkJCQkJCQkJCUJVRkZFUl9NQVgpKTsKKworCQkJCQkJLy8gR2V0IHRoZSBjb3VudHJ5IG5hbWUKKwkJCQkJCVN0cmluZyBjb3VudHJ5ID0gaXRlbXNbSVNPRGF0YS5DT1VOVFJZX05BTUVdOworCisJCQkJCQkvLyBHZXQgdGhlIElTTzMxNjYtMSBpbmZvIGZvciB0aGlzIGNvdW50cnkKKwkJCQkJCWlmIChpc29Db2RlID09IG51bGwpIHsKKwkJCQkJCQlpc29Db2RlID0gR2VuVXRpbHMuZ2V0SVNPQ29kZShjb3VudHJ5LCBjb2RlTGlzdCk7CisJCQkJCQl9CisKKwkJCQkJCS8vIEdldCB0aGUgdHlwZSBvZiB0aGUgZGF0YSB3ZSBhcmUgcHJvY2Vzc2luZy4KKwkJCQkJCWxldmVsID0gR2VuVXRpbHMuZ2V0TGV2ZWwoaXRlbXMpOworCisJCQkJCQlpZiAobGV2ZWwgIT0gMCAmJiBpc28yTGlzdCAhPSBudWxsKSB7CisJCQkJCQkJLy8gTG9hZCB0aGUgSVNPIDMxNjYtMiBvYmplY3RzIGZvciB0aGlzIGNvdW50cnkKKwkJCQkJCQlpc28yTGlzdCA9IEdlblV0aWxzLmxvYWRJU08yKGlzbzMxNjZfMik7CisJCQkJCQl9CisKKwkJCQkJCS8vIFRoaXMgdmFyaWFibGUgaW5kaWNhdGVzIGEgdHJhbnNpdGlvbiBpbiBvdXIgZGF0YQorCQkJCQkJLy8gcHJvY2Vzc2luZworCQkJCQkJYm9vbGVhbiB0cmFuc2l0aW9uID0gKGxldmVsICE9IG9sZGxldmVsKSA/IHRydWUgOiBmYWxzZTsKKworCQkJCQkJLy8gVGhlIGN1cnJlbnQgZW50aXR5IHdlIGFyZSBkZWFsaW5nIHdpdGguCisJCQkJCQkvLyBCYXNlZCBvbiBpdHMgYWRtaW4gbGV2ZWwgaXQgY2FuIGJlIGEgY291bnRyeSwgYQorCQkJCQkJLy8gY291bnR5LCBldGM7CisJCQkJCQlTdHJpbmcgY3VycmVudCA9IG51bGw7CisKKwkJCQkJCS8vIERlc2NyaXB0b3IgZm9yIGN1cnJlbnQgZW50cnkuCisJCQkJCQlTdHJpbmcgZGVzY3JpcHRvciA9IG51bGw7CisKKwkJCQkJCWlmICh0cmFuc2l0aW9uID09IHRydWUpIHsKKwkJCQkJCQkvLyBVc2UgcHJldmlvdXMgbGV2ZWwgdG8gZGV0ZWN0IHRyYW5zaXRpb25zLgorCQkJCQkJCW9sZGxldmVsID0gbGV2ZWw7CisKKwkJCQkJCQkvLyBSZXNldCB0aGUgcHJldmlvdXMgZW50aXR5CisJCQkJCQkJaXNsYW5kID0gIiAiOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCQkvLyBSZXNldCBjb3VudGVyIG9mIFVOS05PV04gYW5kIE4uQS4gZW50cmllcy4KKwkJCQkJCQl1bmtDb3VudGVyID0gMTsKKwkJCQkJCQkvLyBDbG9zZSB0aGUgcHJldmlvdXMgZmlsZQorCQkJCQkJCWlmIChnbWxGaWxlICE9IG51bGwpIHsKKwkJCQkJCQkJb3V0cHV0ID0gY2xvc2VQb2x5Z29uSXNsYW5kVGFncygpOworCQkJCQkJCQlvdXRwdXQgKz0gZ2V0Q2xvc2luZ1RhZ3MoKTsKKwkJCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShnbWxGaWxlLCBvdXRwdXQpOworCQkJCQkJCQlnbWxGaWxlLmNsb3NlKCk7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gQ2xlYXIgdGhlIGxpc3Qgb2YgdW5pcXVlIHBvbHlnb25zCisJCQkJCQkJaWYgKHBvbHlnb25zICE9IG51bGwpIHsKKwkJCQkJCQkJcG9seWdvbnMuY2xlYXIoKTsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBHZXQgYSBuZXcsIGVtcHR5IHBvbHlnb24gbGlzdAorCQkJCQkJCXBvbHlnb25zID0gbmV3IEFycmF5TGlzdDxTVEVNUG9seWdvbj4oKTsKKworCQkJCQkJCS8vIElmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgZm9yIHRoaXMgY291bnRyeSwKKwkJCQkJCQkvLyBjcmVhdGUgaXQgdXNpbmcgSVNPIGFscGhhMyBjb2RlLgorCQkJCQkJCUZpbGUgY291bnRyeURpciA9IG5ldyBGaWxlKG91dHB1dERpcgorCQkJCQkJCQkJKyBpc29Db2RlLmdldEFscGhhMygpKTsKKworCQkJCQkJCWlmIChjb3VudHJ5RGlyICE9IG51bGwKKwkJCQkJCQkJCSYmIGNvdW50cnlEaXIuZXhpc3RzKCkgPT0gZmFsc2UpIHsKKwkJCQkJCQkJLy8gRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBDcmVhdGUgaXQuCisJCQkJCQkJCWNvdW50cnlEaXIubWtkaXIoKTsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBPcGVuIHRoZSB3cml0ZXIgZm9yIHRoZSByZWR1Y2VkIGRhdGEgZmlsZQorCQkJCQkJCWlmIChyZWR1Y2VkRmlsZSA9PSBudWxsKSB7CisJCQkJCQkJCS8vIENyZWF0ZSBwcm9wZXIgbmFtZSBmb3IgdGhlIHJlZHVjZWQgZGF0YSBmaWxlLgorCQkJCQkJCQlmaWxlTmFtZSA9IGNvdW50cnlEaXIgKyAiXFwiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGlzb0NvZGUuZ2V0QWxwaGEzKCkgKyAiX1JFRFVDRURfIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBwYXNzICsgIi50eHQiOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCXJlZHVjZWRGaWxlID0gR2VuVXRpbHMub3BlbldyaXRlcihmaWxlTmFtZSk7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gLy9DcmVhdGUgdGhlIGZpbGUgbmFtZSBmb3IgdGhlIHJlZHVjZWQgR01MIGZpbGUuCisJCQkJCQkJZmlsZU5hbWUgPSBjb3VudHJ5RGlyICsgIlxcIiArIGlzb0NvZGUuZ2V0QWxwaGEzKCkgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJKyAiXyIgKyBsZXZlbCArICJfUkVEVUNFRF9NQVBfIiArIHBhc3MgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkJCQkJCQkJCisJCQkJCQkJCQkrICIueG1sIjsgLy8kTk9OLU5MUy0xJAorCisJCQkJCQkJLy8gQ3JlYXRlIHRoZSBmaWxlIG5hbWUgZm9yIHRoZSByZWR1Y2VkIEdNTCBmaWxlLgorCQkJCQkJCS8vIGZpbGVOYW1lID0gY291bnRyeURpciArICJcXCIgKworCQkJCQkJCS8vIGlzb0NvZGUuZ2V0QWxwaGEzKCkgLy8kTk9OLU5MUy0xJAorCQkJCQkJCS8vICsgIl8iICsgbGV2ZWwgKyAiX01BUCIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCS8vIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkvLyArICIueG1sIjsgLy8kTk9OLU5MUy0xJAorCisJCQkJCQkJLy8gT3BlbiB0aGUgd3JpdGVyIGZvciB0aGUgbmV3IEdNTCBmaWxlCisJCQkJCQkJZ21sRmlsZSA9IEdlblV0aWxzLm9wZW5Xcml0ZXIoZmlsZU5hbWUpOworCisJCQkJCQkJLy8gQWRkIHRoZSBoZWFkZXIgb2YgdGhlIGZpbGUKKwkJCQkJCQlvdXRwdXQgPSBnZXRPcGVuaW5nVGFncyhpc29Db2RlLCBsZXZlbCk7CisKKwkJCQkJCQkvLyBXcml0ZSBkYXRhCisJCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShnbWxGaWxlLCBvdXRwdXQudHJpbSgpKTsKKworCQkJCQkJfSAvLyBpZiggdHJhbnNpdGlvbiA9PSB0cnVlICkKKworCQkJCQkJc3dpdGNoIChsZXZlbCkgeworCisJCQkJCQljYXNlIERhdGFUeXBlcy5MRVZFTF8wOgorCQkJCQkJCWN1cnJlbnQgPSBpc29Db2RlLmdldEFscGhhMygpOworCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlIERhdGFUeXBlcy5MRVZFTF8xOgorCQkJCQkJCWN1cnJlbnQgPSBpdGVtc1tJU09EYXRhLkFETUlOMV9OQU1FXS50b1VwcGVyQ2FzZSgpOworCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlIERhdGFUeXBlcy5MRVZFTF8yOgorCQkJCQkJCWN1cnJlbnQgPSBpdGVtc1tJU09EYXRhLkFETUlOMl9OQU1FXS50b1VwcGVyQ2FzZSgpOworCQkJCQkJCWJyZWFrOworCisJCQkJCQl9IC8vIHN3aXRjaAorCisJCQkJCQkvLyBIYW5kbGUgVU5LTk9XTiBhbmQgTi5BLiBlbnRyaWVzIGRpZmZlcmVudGx5LgorCQkJCQkJaWYgKGN1cnJlbnQuZXF1YWxzKCJVTktOT1dOIikgfHwgY3VycmVudC5lcXVhbHMoIk4uQS4iKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCQkJCWlmIChsZXZlbCA9PSAxKSB7CisJCQkJCQkJCWN1cnJlbnQgPSBpc29Db2RlLmdldEFscGhhMigpICsgIi1VTkstIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBTdHJpbmcudmFsdWVPZih1bmtDb3VudGVyKyspOworCisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLy8gTGV2ZWwgMiBkYXRhLgorCQkJCQkJCQljdXJyZW50ID0gaXNvQ29kZS5nZXRBbHBoYTMoKSArICIuTDIuIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBTdHJpbmcudmFsdWVPZih1bmtDb3VudGVyKyspOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJLy8gV2UgZ2V0IHRoZSBkZXNjcmlwdG9yIGZvciBhZG1pbmlzdHJhdGlvbiBlbnRpdGllcworCQkJCQkJLy8gZGlmZmVyZW50bHkgYmFzZWQgb24gaXRzIGxldmVsLgorCisJCQkJCQlpZiAobGV2ZWwgPT0gMikgeworCisJCQkJCQkJaWYgKGxleDFEYXRhU2V0ID09IG51bGwgJiYgbGV4MkRhdGFTZXQgPT0gbnVsbCkgeworCisJCQkJCQkJCS8vIENvbXBvc2UgdGhlIGZpbGUgbmFtZXMgZm9yIHRoZSBsZXggZmlsZXMgZm9yCisJCQkJCQkJCS8vIHRoaXMKKwkJCQkJCQkJLy8gY291bnRyeS4KKwkJCQkJCQkJbGV4QWRtaW4xRmlsZSA9IGxleERpciArIGlzb0NvZGUuZ2V0QWxwaGEzKCkKKwkJCQkJCQkJCQkrICJcXCIgKyBpc29Db2RlLmdldEFscGhhMygpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCWxleEFkbWluMkZpbGUgPSBsZXhBZG1pbjFGaWxlOworCQkJCQkJCQlsZXhBZG1pbjFGaWxlICs9ICJfQURNSU4xX0xFWC50eHQiOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCWxleEFkbWluMkZpbGUgKz0gIl9BRE1JTjJfTEVYLnR4dCI7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJCQkvLyBMb2FkIHRoZSBsZXgxIGFuZCBsZXgyIGZpbGVzIGZvciB0aGlzCisJCQkJCQkJCS8vIGNvdW50cnkuCisJCQkJCQkJCWxleDFEYXRhU2V0ID0gR2VuVXRpbHMKKwkJCQkJCQkJCQkucG9wdWxhdGVMaXN0KGxleEFkbWluMUZpbGUpOworCQkJCQkJCQlsZXgyRGF0YVNldCA9IEdlblV0aWxzCisJCQkJCQkJCQkJLnBvcHVsYXRlTGlzdChsZXhBZG1pbjJGaWxlKTsKKworCQkJCQkJCQkvLyBDcmVhdGUgYSBtZXRob2QgdG8gc2VhcmNoIGZvciBhbiBpdGVtIG9uIGEKKwkJCQkJCQkJLy8gbGlzdCBvZiBsZXggZGF0YSBvYmplY3RzLgorCQkJCQkJCQlsZXgxTGlzdCA9IEdlblV0aWxzLmNyZWF0ZUxleDFMaXN0KGxleDFEYXRhU2V0KTsKKwkJCQkJCQkJbGV4Mkxpc3QgPSBHZW5VdGlscy5jcmVhdGVMZXgyTGlzdChsZXgyRGF0YVNldCk7CisKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBDb21wb3NlIHRoZSBsZXZlbDIgZGVzY3JpcHRvciB1c2luZyB0aGUgbGV4IGRhdGE6CisKKwkJCQkJCQkvLyBTVEVQIDE6IERvIGEgbG9vayB1cCBpbiB0aGUgbGV4IDIgbGlzdHMuCisKKwkJCQkJCQkvLyBHZXQgdGhlIGxleCAyIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgZW50cnkuCisJCQkJCQkJTGV4Mk9iaiBsZXgyQ3VycmVudCA9IEdlblV0aWxzLmxleDJMb29rdXAobGV4Mkxpc3QsCisJCQkJCQkJCQlpdGVtc1tJU09EYXRhLkFETUlOMV9OQU1FXSwgY3VycmVudCk7CisKKwkJCQkJCQkvLyBHZXQgdGhlIGxleDFPYmplY3QgdG8gd2hpY2ggbGV4MkN1cnJlbnQgYmVsb25ncworCQkJCQkJCUxleDFPYmogbGV4MUN1cnJlbnQgPSBHZW5VdGlscy5sZXgxTG9va3VwKGxleDFMaXN0LAorCQkJCQkJCQkJbGV4MkN1cnJlbnQuZ2V0QWRtaW4xKCkpOworCisJCQkJCQkJaWYgKGxleDFDdXJyZW50LmdldERlc2NyaXB0b3IoKS5jb250YWlucygiVVMtIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkvLyBTVEVQIDI6IHBpZWNlIHRvZ2V0aGVyIHRoZSBJRCB1c2luZyB0aGUKKwkJCQkJCQkJLy8gcHJvcGVyIGxleCBvYmplY3RzIDogdGhlIFVTQSBpcyBhIHNwZWNpYWwKKwkJCQkJCQkJLy8gY2FzZQorCQkJCQkJCQlkZXNjcmlwdG9yID0gR2VuVXRpbHMuZ2V0VVNBRGVzY3JpcHRvcigKKwkJCQkJCQkJCQlsZXgyQ3VycmVudC5nZXRBZG1pbjIoKSwgR2VuVXRpbHMKKwkJCQkJCQkJCQkJCS5leHRyYWN0QWxwaGEyKGxleDFDdXJyZW50CisJCQkJCQkJCQkJCQkJCS5nZXREZXNjcmlwdG9yKCkpLAorCQkJCQkJCQkJCXVzYURlc2NyaXB0b3JMaXN0KTsKKworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8vIFNURVAgMjogcGllY2UgdG9nZXRoZXIgdGhlIElEIHVzaW5nIHRoZQorCQkJCQkJCQkvLyBwcm9wZXIgbGV4IG9iamVjdHMuCisJCQkJCQkJCWRlc2NyaXB0b3IgPSBsZXgxQ3VycmVudC5nZXREZXNjcmlwdG9yKCkKKwkJCQkJCQkJCQkrICItRyIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgbGV4MUN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXgoKQorCQkJCQkJCQkJCSsgbGV4MkN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXgoKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoY3VycmVudC5jb250YWlucygiLkwyLiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJY3VycmVudCA9IGRlc2NyaXB0b3I7CisJCQkJCQkJfQorCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIENvbXBvc2UgZGVzY3JpcHRvciBmb3IgbCAxIGFuZCBsIDAgZGF0YQorCQkJCQkJCS8vIEdldCB0aGUgZGVzY3JpcHRvciBmb3IgdGhpcyBlbnRpdHkuCisJCQkJCQkJZGVzY3JpcHRvciA9IEdlblV0aWxzLmdldElTTzJEZXNjcmlwdG9yKGlzbzJMaXN0LAorCQkJCQkJCQkJY3VycmVudCwgaXNvQ29kZS5nZXRBbHBoYTIoKSk7CisKKwkJCQkJCQkvLyBJZiB3ZSBjYW50IGZpbmQgdGhlIGRlc2NyaXB0b3IsIHRoZW4gbG9vayBpbiB0aGUKKwkJCQkJCQkvLyBmaXggbGlzdC4KKwkJCQkJCQlpZiAoZGVzY3JpcHRvci5lcXVhbHMoY3VycmVudCkgPT0gdHJ1ZSkgeworCQkJCQkJCQkvLyBMb29rIGZvciBhIGRlc2NyaXB0b3IgaW4gdGhlIGZpeCBmaWxlCisJCQkJCQkJCWRlc2NyaXB0b3IgPSBHZW5VdGlscy5nZXRGaXhDb2RlKGNvZGVmaXhMaXN0LAorCQkJCQkJCQkJCWN1cnJlbnQsIGl0ZW1zW0lTT0RhdGEuQ09VTlRSWV9OQU1FXSk7CisJCQkJCQkJfQorCisJCQkJCQl9CisKKwkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRGVzY3JpcHRvciBpcyA6ICIgKyBkZXNjcmlwdG9yCisJCQkJCQkvLyArICIgYXQgbGV2ZWwgOiAiICsgbGV2ZWwgKyAiIGZvciAiICsgY3VycmVudCk7CisKKwkJCQkJCS8vIENyZWF0ZSBhIFNURU0gcG9seWdvbiB3aXRoIHRoaXMgcG9seWdvbiBkYXRhCisJCQkJCQlTVEVNUG9seWdvbiBwb2x5Z29uID0gbmV3IFNURU1Qb2x5Z29uKGJ1ZmZlciwgbGV2ZWwpOworCisJCQkJCQkvLyBDaGVjayB0aGF0IHRoaXMgaXMgaW5kZWVkIGEgU1RFTSBwb2x5Z29uCisJCQkJCQlpZiAoaXNQb2x5Z29uKHBvbHlnb24pICE9IHRydWUpIHsKKwkJCQkJCQkvLyBOb3QgYSBwb2x5Z29uLCBpZ25vcmUuCisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisKKwkJCQkJCS8vIENvbXB1dGUgYSBtYXAgb2YgYW5nbGUgdmFsdWVzLgorCQkJCQkJTGlzdDxTdHJpbmc+IHBvaW50RGF0YUxpc3QgPSBjb21wdXRlSW52ZXJzZUNvc2luZXMocG9seWdvbik7CisKKwkJCQkJCS8vIE5vdyBhcHBseSByZWR1Y3Rpb24gOiBnZXQgcmlkIG9mIGFsbCBwb2ludHMgd2l0aAorCQkJCQkJLy8gYW5nbGVzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBhbHBoYSBkZWdyZWVzCisJCQkJCQlkb3VibGUgYWxwaGEgPSBEb3VibGUucGFyc2VEb3VibGUodGhyZXNob2xkKTsKKwkJCQkJCUxpc3Q8U3RyaW5nPiByZWR1Y2VkUG9pbnREYXRhTGlzdCA9IHJlZHVjZShhbHBoYSwKKwkJCQkJCQkJcG9pbnREYXRhTGlzdCk7CisKKwkJCQkJCS8vIFVwZGF0ZSBHbG9iYWwgU3RhdHMKKwkJCQkJCXVwZGF0ZUdsb2JhbFN0YXRzKHBvaW50RGF0YUxpc3Quc2l6ZSgpLAorCQkJCQkJCQlyZWR1Y2VkUG9pbnREYXRhTGlzdC5zaXplKCkpOworCisJCQkJCQkvLyBTaG93IHNvbWUgb2YgdGhlIHN0YXRzIGFmdGVyIGVhY2ggcmVkdWN0aW9uLgorCQkJCQkJLy8gc2hvd1N0YXRzKHBvaW50RGF0YUxpc3QsIHJlZHVjZWRQb2ludERhdGFMaXN0LCBwYXNzKTsKKworCQkJCQkJLy8gUHV0IGFsbCB0aGUgcmVtYWluaW5nIHBvaW50cyBpbnRvIGEgbmV3IGJ1ZmZlcgorCQkJCQkJU3RyaW5nIHJlZHVjZWRQb2x5Z29uRGF0YUJ1ZmZlciA9IGV4dHJhY3RMaXN0SW50b1N0cmluZyhyZWR1Y2VkUG9pbnREYXRhTGlzdCk7CisKKwkJCQkJCS8vIFJlY29uc3RydWN0IGEgYnVmZmVyIHdpdGggdGhlIHJlZHVjZWQgcG9pbnQtZGF0YS4KKworCQkJCQkJLy8gRXh0cmFjdCBhbGwgZGF0YSBmcm9tIG9sZCBidWZmZXIgZXhjZXB0IHRoZSBwb2x5Z29uCisJCQkJCQkvLyBkYXRhIDoKKwkJCQkJCVN0cmluZyBub25Qb2x5Z29uRGF0YUJ1ZmZlciA9IGV4dHJhY3ROb25Qb2x5Z29uRGF0YSgKKwkJCQkJCQkJYnVmZmVyLmxlbmd0aCgpIDwgQlVGRkVSX01BWCA/IGJ1ZmZlciA6IGJ1ZmZlcgorCQkJCQkJCQkJCS5zdWJzdHJpbmcoQlVGRkVSX01JTiwgQlVGRkVSX01BWCksCisJCQkJCQkJCWxldmVsKTsKKworCQkJCQkJLy8gTm93IHB1dCB0b2dldGhlciBhIG5ldyBidWZmZXIgd2hpY2ggaGFzIGJlZW4gcmVkdWNlZAorCQkJCQkJU3RyaW5nIHJlZHVjZWRCdWZmZXIgPSBub25Qb2x5Z29uRGF0YUJ1ZmZlcgorCQkJCQkJCQkrIHJlZHVjZWRQb2x5Z29uRGF0YUJ1ZmZlciArICJcbiI7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJLy8gV3JpdGUgcmVkdWNlZCBkYXRhIGJ1ZmZlciBpbnRvIHRoZSByZWR1Y2VkIGRhdGEgZmlsZQorCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShyZWR1Y2VkRmlsZSwgcmVkdWNlZEJ1ZmZlcik7CisKKwkJCQkJCS8vIERlbGV0ZSB0aGUgb2xkIHBvbHlnb24KKwkJCQkJCXBvbHlnb24uY2xlYXIoKTsKKworCQkJCQkJLy8gQ3JlYXRlIGEgbmV3LCByZWR1Y2VkIFNURU0gcG9seWdvbiB3aXRoIHRoZSBuZXcgZGF0YQorCQkJCQkJLy8gYnVmZmVyCisJCQkJCQlwb2x5Z29uID0gbmV3IFNURU1Qb2x5Z29uKHJlZHVjZWRQb2x5Z29uRGF0YUJ1ZmZlciwKKwkJCQkJCQkJbGV2ZWwpOworCisJCQkJCQkvLyBXZSBrbm93IGl0IGlzIGEgcG9seWdvbiwgYnV0IG5vdyBjaGVjayB0aGF0IGl0cyBub3QKKwkJCQkJCS8vIGR1cGxpY2F0ZWQuCisJCQkJCQlpZiAoaXNQb2x5Z29uRHVwbGljYXRlZChwb2x5Z29ucy5pdGVyYXRvcigpLCBwb2x5Z29uKSA9PSB0cnVlKSB7CisJCQkJCQkJLy8gWWVzLCBpdCBpcyBkdXBsaWNhdGVkCisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisKKwkJCQkJCS8vIEFkZCB0aGlzIHBvbHlnb24gdG8gb3VyIGxpc3Qgb2YgdW5pcXVlIHBvbHlnb25zIHNvCisJCQkJCQkvLyB0aGF0IHdlIGNhbiBjaGVjayBkdXBsaWNhdGVzIG9mIHRoaXMgcG9seWdvbiBsYXRlci4KKwkJCQkJCXBvbHlnb25zLmFkZChwb2x5Z29uKTsKKworCQkJCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgcG9seWdvbiBpcyBwYXJ0IG9mIGFuIGlzbGFuZCBvZgorCQkJCQkJLy8gcG9seWdvbnMgb3IgYSBzaW1wbGUgcG9seWdvbgorCQkJCQkJaWYgKGxldmVsID09IDApIHsKKwkJCQkJCQkvLyBJZiB3ZSBhcmUgYXQgYWRtaW4gbGV2ZWwgMCBhbmQgaXNsYW5kIGlzIG5vdAorCQkJCQkJCS8vIE5VTEwsIHRoZW4gd2UgaGF2ZSBhbiBpc2xhbmQuCisJCQkJCQkJaWYgKGlzbGFuZC5lcXVhbHMoIiAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQkJCW91dHB1dCA9IG9wZW5Qb2x5Z29uSXNsYW5kVGFncyhkZXNjcmlwdG9yKTsKKwkJCQkJCQkJaXNsYW5kID0gIkFkbWluIExldmVsIDAiOyAvLyROT04tTkxTLTEkCisJCQkJCQkJfQorCQkJCQkJCW91dHB1dCArPSBhZGRMaW5lYXJSaW5nVGFncyhyZWR1Y2VkQnVmZmVyLCBsZXZlbCk7CisJCQkJCQl9IGVsc2UgeworCisJCQkJCQkJaWYgKGlzbGFuZC5lcXVhbHMoIiAiKSA9PSB0cnVlKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJb3V0cHV0ID0gb3BlblBvbHlnb25Jc2xhbmRUYWdzKGRlc2NyaXB0b3IpOworCQkJCQkJCQlvdXRwdXQgKz0gYWRkTGluZWFyUmluZ1RhZ3MocmVkdWNlZEJ1ZmZlciwKKwkJCQkJCQkJCQlsZXZlbCk7CisKKwkJCQkJCQl9IGVsc2UgeworCisJCQkJCQkJCWlmIChjdXJyZW50LmVxdWFscyhpc2xhbmQpID09IGZhbHNlKSB7CisJCQkJCQkJCQlvdXRwdXQgPSBjbG9zZVBvbHlnb25Jc2xhbmRUYWdzKCk7CisJCQkJCQkJCQlvdXRwdXQgKz0gb3BlblBvbHlnb25Jc2xhbmRUYWdzKGRlc2NyaXB0b3IpOworCQkJCQkJCQkJb3V0cHV0ICs9IGFkZExpbmVhclJpbmdUYWdzKHJlZHVjZWRCdWZmZXIsCisJCQkJCQkJCQkJCWxldmVsKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCW91dHB1dCA9IGFkZExpbmVhclJpbmdUYWdzKHJlZHVjZWRCdWZmZXIsCisJCQkJCQkJCQkJCWxldmVsKTsKKwkJCQkJCQkJCUdlblV0aWxzLmFkZERhdGEoZ21sRmlsZSwgb3V0cHV0LnRyaW0oKSk7CisJCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCXN3aXRjaCAobGV2ZWwpIHsKKworCQkJCQkJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzE6CisJCQkJCQkJCWlzbGFuZCA9IGl0ZW1zW0lTT0RhdGEuQURNSU4xX05BTUVdCisJCQkJCQkJCQkJLnRvVXBwZXJDYXNlKCk7CisJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMjoKKwkJCQkJCQkJaXNsYW5kID0gaXRlbXNbSVNPRGF0YS5BRE1JTjJfTkFNRV0KKwkJCQkJCQkJCQkudG9VcHBlckNhc2UoKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlHZW5VdGlscy5hZGREYXRhKGdtbEZpbGUsIG91dHB1dC50cmltKCkpOworCisJCQkJCX0gLy8gd2hpbGUgbG9vcAorCisJCQkJCS8vIFJlc2V0IGFsbCBsZXgtcmVsYXRlZCBpdGVtcworCisJCQkJCWlmIChsZXgxRGF0YVNldCAhPSBudWxsKSB7CisJCQkJCQlsZXgxRGF0YVNldC5jbGVhcigpOworCQkJCQkJbGV4MURhdGFTZXQgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgyRGF0YVNldCAhPSBudWxsKSB7CisJCQkJCQlsZXgyRGF0YVNldC5jbGVhcigpOworCQkJCQkJbGV4MkRhdGFTZXQgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgxTGlzdCAhPSBudWxsKSB7CisJCQkJCQlsZXgxTGlzdC5jbGVhcigpOworCQkJCQkJbGV4MUxpc3QgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgyTGlzdCAhPSBudWxsKSB7CisJCQkJCQlsZXgyTGlzdC5jbGVhcigpOworCQkJCQkJbGV4Mkxpc3QgPSBudWxsOworCQkJCQl9CisKKwkJCQkJbGV4QWRtaW4xRmlsZSA9IG51bGw7CisJCQkJCWxleEFkbWluMkZpbGUgPSBudWxsOworCisJCQkJCS8vIFdlIGRvbnQgbmVlZCB0aGUgSVNPIGNvZGUgb2JqZWN0IGZvciB0aGlzIGNvdW50cnkKKwkJCQkJLy8gYW55bW9yZSwgd2UgYXJlIGRvbmUgcHJvY2Vzc2luZyBpdC4KKwkJCQkJaXNvQ29kZSA9IG51bGw7CisKKwkJCQkJLy8gQ2xvc2UgYWxsIG9wZW4gcmVzb3VyY2VzLgorCQkJCQlyZWFkZXIuY2xvc2UoKTsKKworCQkJCQlpZiAoZ21sRmlsZSAhPSBudWxsKSB7CisJCQkJCQkvLyBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0CisJCQkJCQlHZW5VdGlscy5hZGREYXRhKGdtbEZpbGUsIGNsb3NlUG9seWdvbklzbGFuZFRhZ3MoKSk7CisJCQkJCQlHZW5VdGlscy5hZGREYXRhKGdtbEZpbGUsIGdldENsb3NpbmdUYWdzKCkpOworCQkJCQkJZ21sRmlsZS5jbG9zZSgpOworCQkJCQkJZ21sRmlsZSA9IG51bGw7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRHZW5lcmF0ZWQgOiAiICsgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCisJCQkJCQlmaWxlTmFtZSA9IG51bGw7CisJCQkJCX0KKworCQkJCQlpZiAocmVkdWNlZEZpbGUgIT0gbnVsbCkgeworCQkJCQkJcmVkdWNlZEZpbGUuY2xvc2UoKTsKKwkJCQkJCXJlZHVjZWRGaWxlID0gbnVsbDsKKwkJCQkJfQorCisJCQkJCS8vIEluY3JlYXNlIHRoZSBwYXNzIGNvdW50ZXIuCisJCQkJCXBhc3MrKzsKKworCQkJCQkvLyBSdW4gZ2FyYmFnZSBjb2xsZWN0aW9uCisJCQkJCS8vU3lzdGVtLmdjKCk7CisKKwkJCQl9CisKKwkJCQkvLyBTaG93IGdsb2JhbCBzdGF0cyBmb3IgdGhpcyBwYXNzCisJCQkJc2hvd0dsb2JhbFN0YXRzKCk7CisKKwkJCQkvLyBOb3cgY2xlYXIgdGhlbSBiZWZvcmUgbmV4dCBpdGVyYXRpb24KKwkJCQlyZXNldEdsb2JhbFN0YXRzKCk7CisKKwkJCQkvLyBOb3cgY2xlYXIgdGhlIGhhc2ggbWFwCisJCQkJaW5pdEhhc2hNYXAoYW5nbGVWYWx1ZU1hcCk7CisKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCisJCX0KKworCX0KKworCS8qKgorCSAqIEV4dHJhY3QgYWxsIG5vbiBwb2x5Z29uIGRhdGEgZnJvbSB0aGUgYnVmZmVyLiBBbW91bnQgb2Ygbm9uIC0gcG9seWdvbgorCSAqIGRhdGEgdmFyaWVzIGFjY29yZGluZyB0byBsZXZlbC4KKwkgKiAKKwkgKiBAcGFyYW0gYnVmZmVyCisJICogICAgICAgICAgICBhIGJ1ZmZlciBvZiBkaXZhIGRhdGEuCisJICogCisJICogQHBhcmFtIGxldmVsCisJICogICAgICAgICAgICBhZG1pbmlzdHJhdGl2ZSBsZXZlbAorCSAqIAorCSAqIEByZXR1cm4gU3RyaW5nIGFsbCB0aGUgbm9uLXBvbHlnb24gZGF0YS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGV4dHJhY3ROb25Qb2x5Z29uRGF0YShTdHJpbmcgYnVmZmVyLCBpbnQgbGV2ZWwpIHsKKworCQlpbnQgb2Zmc2V0ID0gMDsKKworCQlzd2l0Y2ggKGxldmVsKSB7CisKKwkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMDoKKwkJCW9mZnNldCA9IDI7CisJCQlicmVhazsKKworCQljYXNlIERhdGFUeXBlcy5MRVZFTF8xOgorCQkJb2Zmc2V0ID0gMzsKKwkJCWJyZWFrOworCisJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzI6CisJCQlvZmZzZXQgPSA0OworCQkJYnJlYWs7CisKKwkJfQorCisJCS8vIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIGNvbW1hIHNlcGFyYXRvcgorCQlpbnQgYmVnaW5JbmRleCA9IGJ1ZmZlci5pbmRleE9mKCIsIik7IC8vJE5PTi1OTFMtMSQKKwkJaW50IGVuZEluZGV4ID0gYmVnaW5JbmRleDsKKworCQlpbnQgaSA9IDE7CisKKwkJd2hpbGUgKGkgPCBvZmZzZXQpIHsKKwkJCWVuZEluZGV4ID0gYnVmZmVyLmluZGV4T2YoIiwiLCBiZWdpbkluZGV4ICsgMSk7IC8vJE5PTi1OTFMtMSQKKwkJCWJlZ2luSW5kZXggPSBlbmRJbmRleDsKKwkJCWkrKzsKKwkJfQorCisJCWJlZ2luSW5kZXggPSAwOworCisJCS8vIGV4dHJhY3QgdGhlIHNlcXVlbmNlIHVwIHRvIGluZGV4CisJCXJldHVybiBidWZmZXIuc3Vic3RyaW5nKGJlZ2luSW5kZXgsIGVuZEluZGV4ICsgMSk7CisKKwl9CisKKwkvKioKKwkgKiBGaW5kIGFuZCBzaG93IHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBub3JtYWwgcG9pbnQtZGF0YSBsaXN0IGFuZCB0aGUKKwkgKiByZWR1Y2VkIHBvaW50LWRhdGEgbGlzdC4KKwkgKiAKKwkgKiBAcGFyYW0gbm9ybWFsTGlzdCAtCisJICogICAgICAgICAgICBhIGxpc3Qgd2l0aCB0aGUgb3JpZ2luYWwgcG9pbnQgZGF0YS4KKwkgKiAKKwkgKiBAcGFyYW0gcmVkdWNlZExpc3QgLQorCSAqICAgICAgICAgICAgYSBsaXN0IHdpdGggdGhlIHJlZHVjZWQgcG9pbnQgZGF0YS4KKwkgKiAKKwkgKiBAcGFyYW0gcGFzcyAtCisJICogICAgICAgICAgICB0aGUgY3VycmVudCBwYXNzIG9yIGl0ZXJhdGlvbi4KKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzaG93U3RhdHMoTGlzdDxTdHJpbmc+IG5vcm1hbExpc3QsIExpc3Q8U3RyaW5nPiByZWR1Y2VkTGlzdCwKKwkJCWludCBwYXNzKSB7CisKKwkJLy8gZG91YmxlIG5vcm1hbFNpemUgPSBub3JtYWxMaXN0LnNpemUoKTsKKwkJLy8gZG91YmxlIHJlZHVjZWRTaXplID0gcmVkdWNlZExpc3Quc2l6ZSgpOworCQkvLyBkb3VibGUgZGlmID0gbm9ybWFsU2l6ZSAtIHJlZHVjZWRTaXplOworCQkvLyBkb3VibGUgcmF0aW8gPSBkaWYgLyBub3JtYWxTaXplOworCQkvLyBkb3VibGUgcGVyY2VudCA9IHJhdGlvICogMTAwLjA7CisKKwkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0KioqKioqKioqKioqIERPV04gU0FNUExJTkcgU1RBVFMgRk9SICIgKyBwYXNzIC8vJE5PTi1OTFMtMSQKKwkJCQkrICIgSVRFUkFUSU9OICoqKioqKioqKioqKlxuIik7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBDcmVhdGUgYW5kIHByaW50IHByb2ZpbGUgb2YgdGhlIGFuZ2xlIHZhbHVlcworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRQcm9maWxpbmcgcmVzdWx0cyBCRUZPUkUgcmVkdWN0aW9uIDogXG5cbiIpOyAvLyROT04tTkxTLTEkCisKKwkJcHJvZmlsZShub3JtYWxMaXN0KTsKKwkJc2hvd1Byb2ZpbGUoKTsKKworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIHBvaW50cyBpbiBvcmlnaW5hbCBwb2x5Z29uIDogIgorCQkvLyArIG5vcm1hbExpc3Quc2l6ZSgpKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbCBwb2ludHMgaW4gcmVkdWNlZCBwb2x5Z29uIDogIgorCQkvLyArIHJlZHVjZWRMaXN0LnNpemUoKSk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgcG9pbnRzIG1hcmtlZCBmb3IgZGVsZXRpb24gOiAiICsgZGlmKTsKKwkJLy8KKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQZXJjZW50YWdlIG9mIHJlZHVjdGlvbiA6ICIgKyBwZXJjZW50ICsgIiUiKTsKKwkJLy8KKwkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0UHJvZmlsaW5nIHJlc3VsdHMgQUZURVIgcmVkdWN0aW9uIDogXG5cbiIpOyAvLyROT04tTkxTLTEkCisKKwkJcHJvZmlsZShyZWR1Y2VkTGlzdCk7CisJCXNob3dQcm9maWxlKCk7CisKKwl9CisKKwkvKioKKwkgKiBDbGVhciB0aGUgZ2xvYmFsIHN0YXRzIChiZXR3ZWVuIGV2ZXJ5IGl0ZXJhdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXNldEdsb2JhbFN0YXRzKCkgeworCisJCXRvdGFsUG9pbnRzID0gMDsKKworCQl0b3RhbFJlbW92ZWQgPSAwOworCisJCXRvdGFsUG9seWdvbnMgPSAwOworCisJCWdsb2JhbE1pblBlcmNlbnQgPSBEb3VibGUuTUFYX1ZBTFVFOworCisJCWdsb2JhbE1heFBlcmNlbnQgPSAwLjA7CisKKwkJZ2xvYmFsUGVyY2VudCA9IDAuMDsKKworCX0KKworCS8qKgorCSAqIFVwZGF0ZSBnbG9iYWwgc3RhdHMuCisJICogCisJICogQHBhcmFtIG5vcm1hbFNpemUgLQorCSAqICAgICAgICAgICAgdGhlIHRvdGFsIG51bWJlciBvZiBwb2ludHMgYmVmb3JlIHJlZHVjdGlvbgorCSAqIAorCSAqIEBwYXJhbSByZWR1Y2VkU2l6ZSAtCisJICogICAgICAgICAgICB0aGUgdG90YWwgbnVtYmVyIG9mIHBvaW50cyBhZnRlciByZWR1Y3Rpb24KKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGVHbG9iYWxTdGF0cyhkb3VibGUgbm9ybWFsU2l6ZSwgZG91YmxlIHJlZHVjZWRTaXplKSB7CisKKwkJZG91YmxlIGRpZiA9IG5vcm1hbFNpemUgLSByZWR1Y2VkU2l6ZTsKKwkJZG91YmxlIHJhdGlvID0gZGlmIC8gbm9ybWFsU2l6ZTsKKwkJZG91YmxlIHBlcmNlbnQgPSByYXRpbyAqIDEwMC4wOworCisJCWdsb2JhbE1pblBlcmNlbnQgPSAoZ2xvYmFsTWluUGVyY2VudCA+IHBlcmNlbnQpID8gcGVyY2VudAorCQkJCTogZ2xvYmFsTWluUGVyY2VudDsKKworCQlnbG9iYWxNYXhQZXJjZW50ID0gKGdsb2JhbE1heFBlcmNlbnQgPCBwZXJjZW50KSA/IHBlcmNlbnQKKwkJCQk6IGdsb2JhbE1heFBlcmNlbnQ7CisKKwkJZ2xvYmFsUGVyY2VudCArPSBwZXJjZW50OworCisJCXRvdGFsUG9pbnRzICs9IG5vcm1hbFNpemU7CisKKwkJdG90YWxSZW1vdmVkICs9IHJlZHVjZWRTaXplOworCisJCXRvdGFsUG9seWdvbnMgKz0gMTsKKworCX0KKworCS8qKgorCSAqIFByaW50IHRoZSBnbG9iYWwgc3RhdHMKKwkgKi8KKwlwdWJsaWMgdm9pZCBzaG93R2xvYmFsU3RhdHMoKSB7CisKKwkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0KioqKioqKioqKioqKiogR0xPQkFMIFNUQVRTICoqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKKworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRUb3RhbCBwb2x5Z29ucyA6ICIgKyB0b3RhbFBvbHlnb25zKTsgLy8kTk9OLU5MUy0xJAorCisJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFRvdGFsIHBvaW50cyA6ICIgKyB0b3RhbFBvaW50cyk7IC8vJE5PTi1OTFMtMSQKKworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRBdmcgcG9pbnRzIHBlciBwb2x5Z29uIDogIiArIHRvdGFsUG9pbnRzIC8vJE5PTi1OTFMtMSQKKwkJCQkvIHRvdGFsUG9seWdvbnMpOworCisJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdEdsb2JhbCByZWR1Y3Rpb24gOiAiICsgZ2xvYmFsUGVyY2VudCAvLyROT04tTkxTLTEkCisJCQkJLyB0b3RhbFBvbHlnb25zICsgIiUiKTsgLy8kTk9OLU5MUy0xJAorCisJCVN5c3RlbS5vdXQKKwkJCQkucHJpbnRsbigiXHRcdEdsb2JhbCBNSU4gcmVkdWN0aW9uICA6ICIgKyBnbG9iYWxNaW5QZXJjZW50ICsgIiUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJU3lzdGVtLm91dAorCQkJCS5wcmludGxuKCJcdFx0R2xvYmFsIE1BWCByZWR1Y3Rpb24gIDogIiArIGdsb2JhbE1heFBlcmNlbnQgKyAiJSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCX0KKworCS8qKgorCSAqIEp1c3QgcHJpbnQgdGhlIHByb2ZpbGUgZm9yIHRoZSBwb2x5Z29uIHBvaW50LWRhdGEKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzaG93UHJvZmlsZSgpIHsKKworCQkvLyBDcmVhdGUgYSBwcm9maWxlCisJCS8vIHByb2ZpbGUoYW5nbGVWYWx1ZU1hcCk7CisKKwkJLy8gU29ydCB0aGUga2V5cworCQlTZXQ8RG91YmxlPiBrZXlzID0gYW5nbGVWYWx1ZU1hcC5rZXlTZXQoKTsKKwkJTGlzdDxEb3VibGU+IHNvcnRlZEtleXMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oa2V5cyk7CisJCUNvbGxlY3Rpb25zLnNvcnQoc29ydGVkS2V5cyk7CisKKwkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0RnJlcXVlbmNpZXMgb2YgYW5nbGVzIDogICIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gUHJpbnQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBmb3IgZWFjaCB2YWx1ZQorCQlJdGVyYXRvciBrZXlJdGVyID0gc29ydGVkS2V5cy5pdGVyYXRvcigpOworCQl3aGlsZSAoa2V5SXRlci5oYXNOZXh0KCkpIHsKKworCQkJLy8gR2V0IHRoZSBrZXkKKwkJCURvdWJsZSBrZXkgPSAoRG91YmxlKSBrZXlJdGVyLm5leHQoKTsKKworCQkJLy8gR2V0IHRoZSB2YWx1ZQorCQkJaW50IHZhbCA9IChhbmdsZVZhbHVlTWFwLmdldChrZXkpKS5pbnRWYWx1ZSgpOworCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgQW5nbGUgPj0gIiArIGtleSArICIgRnJlcXVlbmN5IDogIiArIHZhbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCX0KKworCX0KKworCS8qKgorCSAqIEFsZ29yaXRobSBmb3IgcmVkdWNpbmcgdGhlIGRhdGEgYnkgbWFya2luZyBhbmQgdGhlbiByZW1vdmluZyAobmVhcmx5KSBhbGwKKwkgKiBwb2ludHMgd2l0aCBhbmdsZSBsZXNzIHRoYW4gYWxwaGEuIEFsbCBwb2ludHMgbWFya2VkIGZvciBkZWxldGlvbiBhcmUKKwkgKiBjYWxsZWQgU0FGRS4KKwkgKiAKKwkgKiBAcGFyYW0gYWxwaGEgLQorCSAqICAgICAgICAgICAgdGhlIHRocmVzaG9sZAorCSAqIEBwYXJhbSBsaXN0IC0KKwkgKiAgICAgICAgICAgIGEgbGlzdCBjb250YWluaW5nIGV4dGVuZGVkIHBvaW50IGRhdGEgb2YgdGhlIGZvcm0gOgorCSAqICAgICAgICAgICAgSU5ERVg6TFQ6TEc6QU5HTEU6U0FGRVRZCisJICogCisJICogQHJldHVybiBsaXN0IC0gYSByZWR1Y2VkIGxpc3Qgb2YgcG9pbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSBkZWxldGVkCisJICogICAgICAgICBiZWNhdXNlIHRoZXkgZG9udCBtZWV0IHRoZSBjcml0ZXJpYSAoaS5lLiB0aGVpciBhbmdsZSBpcyBncmVhdGVyCisJICogICAgICAgICB0aGFuIHRocmVzaG9sZCBvciB3ZXJlIG1hcmtlZCBhcyBVTlNBRkUpCisJICogCisJICovCisJcHVibGljIExpc3Q8U3RyaW5nPiByZWR1Y2UoZG91YmxlIGFscGhhLCBMaXN0PFN0cmluZz4gbGlzdCkgeworCisJCS8qKgorCQkgKiBSZW1vdmUgYWxsIHBvaW50cyB3aGljaCBhcmUgc2FmZSB0byByZW1vdmUuCisJCSAqIAorCQkgKiBUbyBiZSBzYWZlLCBhIHBvaW50IHNob3VsZCBzYXRpc2Z5IHR3byBjb25kaXRpb25zIDoKKwkJICogCisJCSAqIDEpIEhhdmUgYW4gYW5nbGUgd2l0aCB2YWx1ZSBsZXNzIHRoYW4gYWxwaGEgZGVncmVzcy4KKwkJICogCisJCSAqIDIpIFdlIENBTk5PVCBtYXJrIFNBRkUgZm9yIGRlbGV0aW9uIHR3byBjb25zZWN1dGl2ZSBwb2ludHMuCisJCSAqIAorCQkgKi8KKworCQkvLyBUaGlzIGxpc3Qgd2lsbCBjb250YWluIG9ubHkgdGhlIGVsZW1lbnRzIHRoYXQgd2Ugc2hvdWxkIG5vdCByZW1vdmUKKwkJTGlzdDxTdHJpbmc+IHJlZHVjZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKwkJLy8gU3ltYm9saWMgY29uc3RhbnRzIGZvciBjb250cm9sbGluZyB0aGUgc2xpZGluZyB3aW5kb3cgYWxnb3JpdGhtCisJCWZpbmFsIGludCBTVEFSVCA9IDA7CisJCWZpbmFsIGludCBXSU5ET1dfTEVOR1RIID0gMjsKKworCQkvLyBNdWx0aXBsaWVyIHRvIG9idGFpbiBtaW5pbXVtIGxlbmdodCBhdCB3aGljaCBtYWtlcyBzZW5zZSB0byBydW4gdGhpcworCQkvLyBhbGdvcml0aG06CisJCWZpbmFsIGludCBNVUxUSVBMSUVSID0gMTsKKworCQkvLyBNSU5JTVVNIExFTkdUSCA9IE1VTFRJUExJRVIgKiAoV0lORE9XX0xFTkdUSCArIDEpCisJCWZpbmFsIGludCBNSU5JTVVNX0xFTkdUSCA9IE1VTFRJUExJRVIgKiAoV0lORE9XX0xFTkdUSCArIDEpOworCisJCS8vIEluZGV4ZXMgaW50byB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgZXh0ZW5kZWQgcG9pbnQgZGF0YToKKwkJLy8gSU5ERVg6TFQ6TEc6QU5HTEU6U0FGRVRZCisJCWZpbmFsIGludCBJTkRFWCA9IDA7CisJCWZpbmFsIGludCBMVCA9IDE7CisJCWZpbmFsIGludCBMRyA9IDI7CisJCWZpbmFsIGludCBBTkdMRSA9IDM7CisJCWZpbmFsIGludCBTQUZFVFkgPSA0OworCisJCS8vIE91ciBzbGlkaW5nIHdpbmRvdyBjb3ZlcnMgZXhhY3RseSB0aHJlZSBub2Rlcy4KKwkJU3RyaW5nW10gcDEgPSBudWxsOworCQlTdHJpbmdbXSBwMiA9IG51bGw7CisJCVN0cmluZ1tdIHAzID0gbnVsbDsKKworCQkvLyBBbmdsZSB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIHRocmVlIHBvaW50cyBpbiB0aGUgc2xpZGluZyB3aW5kb3cuCisJCWRvdWJsZSBhMSA9IDAuMDsKKwkJZG91YmxlIGEyID0gMC4wOworCQlkb3VibGUgYTMgPSAwLjA7CisKKwkJLy8gU3RhdGUgKFNBRkUgb3IgVU5TQUZFKSBvZiBlYWNoIG9mIHRocmVlIHBvaW50cyBpbiB0aGUgc2xpZGluZyB3aW5kb3cuCisJCVN0cmluZyBzMSA9IFVOS05PV047CisJCVN0cmluZyBzMiA9IFVOS05PV047CisJCVN0cmluZyBzMyA9IFVOS05PV047CisKKwkJLy8gQSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgYW5kIHRoZSBlbmQgb2YgdGhlIHNsaWRpbmcgd2luZG93LgorCQlpbnQgbGVmdF9ib3JkZXIgPSAwOworCQlpbnQgcmlnaHRfYm9yZGVyID0gbGVmdF9ib3JkZXIgKyBXSU5ET1dfTEVOR1RIOworCisJCS8vIE91ciBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc2xpZGluZyB3aW5kb3cuCisJCWludCBpbmRleCA9IFNUQVJUOworCisJCWlmIChsaXN0LnNpemUoKSA8IE1JTklNVU1fTEVOR1RIKSB7CisJCQkvLyBUaGVyZSBpcyBubyBwb2ludCBpbiBydW5uaW5nIHRoaXMgYWxnb3JpdGhtIGlmIHBvaW50cworCQkJLy8gbGVzcyB0aGFuIG1pbmltdW0gdmFsdWUuIE5vIG5lZWQgdG8gcmVkdWNlLgorCQkJcmV0dXJuIGxpc3Q7CisJCX0KKworCQlmaW5hbCBpbnQgRU5EID0gbGlzdC5zaXplKCkgLSAxOworCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTGlzdCBzaXplIGlzIDogIiArIGVuZCk7CisKKwkJd2hpbGUgKHJpZ2h0X2JvcmRlciA8PSBFTkQpIHsKKworCQkJLy8gVU5LTk9XTiA9PSBOT1QgWUVUIFBST0NFU1NFRCAtLSBFdmVudHVhbGx5IGl0IHdpbGwgYmUgbWFya2VkCisJCQkvLyBlaXRoZXIgU0FGRSBvciBVTlNBRkUKKworCQkJYm9vbGVhbiBmbGFnID0gZmFsc2U7CisKKwkJCS8vIGlmIChwMSA9PSBudWxsKSB7CisJCQkvLyBHZXQgdGhlIHRocmVlIGluaXRpYWwgcG9pbnRzIGNvdmVyZWQgYnkgb3VyIHNsaWRpbmcgd2luZG93LgorCQkJaW5kZXggPSBsZWZ0X2JvcmRlcjsKKwkJCXAxID0gbGlzdC5nZXQoaW5kZXgrKykuc3BsaXQoIjoiKTsgLy8kTk9OLU5MUy0xJAorCQkJcDIgPSBsaXN0LmdldChpbmRleCsrKS5zcGxpdCgiOiIpOyAvLyROT04tTkxTLTEkCisJCQlwMyA9IGxpc3QuZ2V0KGluZGV4KS5zcGxpdCgiOiIpOyAvLyROT04tTkxTLTEkCisJCQkvLyB9CisKKwkJCS8vIE5vdyBnZXQgdGhlIGFuZ2xlIHZhbHVlIGZvciBlYWNoIG9mIHRoZSB0aHJlZSBwb2ludHMuCisJCQlhMSA9IERvdWJsZS5wYXJzZURvdWJsZShwMVtBTkdMRV0pOworCQkJYTIgPSBEb3VibGUucGFyc2VEb3VibGUocDJbQU5HTEVdKTsKKwkJCWEzID0gRG91YmxlLnBhcnNlRG91YmxlKHAzW0FOR0xFXSk7CisKKwkJCS8vIE5vdyBnZXQgdGhlIHN0YXRlIG9mIGVhY2ggb2YgdGhlIHRocmVlIHBvaW50cy4KKwkJCXMxID0gcDFbU0FGRVRZXTsKKwkJCXMyID0gcDJbU0FGRVRZXTsKKwkJCXMzID0gcDNbU0FGRVRZXTsKKworCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBpbml0aWFsLCBsZWZ0bW9zdCBwb2ludCBpcyBncmVhdGVyIHRoYW4KKwkJCS8vIGFscGhhIG9yIGlmIGl0IGlzIFVOU0FGRS4gSWYgc28sIHRoZW4gc2xpZGUgZm9yd2FyZCB0aGUgd2luZG93LgorCQkJaWYgKGExID4gYWxwaGEpIHsKKwkJCQkvLyBKdXN0IHNsaWRlIGZvcndhcmQgdGhlIHdpbmRvdyBvbmUgdW5pdC4KKwkJCQlsZWZ0X2JvcmRlciArPSAxOworCQkJCXJpZ2h0X2JvcmRlciArPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoczEuZXF1YWxzKFVOU0FGRSkpIHsKKworCQkJCWlmIChhMiA8IGFscGhhICYmIGEyIDw9IGEzKSB7CisJCQkJCS8vIFsgUDEgPSBVTlNBRkUsIFAyID0gU0FGRSwgUDMgPSBVTlNBRkUgXQorCQkJCQkvLyBBZHZhbmNlIHNsaWRpbmcgd2luZG93IGFmdGVyIFAyCisJCQkJCXMyID0gU0FGRTsKKwkJCQkJczMgPSBVTlNBRkU7CisJCQkJfSBlbHNlIGlmIChhMyA8IGFscGhhKSB7CisJCQkJCS8vIFsgUDEgPSBVTlNBRkUsIFAyID0gVU5TQUZFLCBQMyA9IFNBRkUgXQorCQkJCQkvLyBBZHZhbmNlIHNsaWRpbmcgd2luZG93IGFmdGVyIFAyCisJCQkJCXMzID0gU0FGRTsKKwkJCQkJczIgPSBVTlNBRkU7CisJCQkJfQorCisJCQl9IGVsc2UgaWYgKGExIDwgYWxwaGEgJiYgYTEgPCBhMikgeworCQkJCS8vIFsgUDEgPSBTQUZFLCBQMiA9IFVOU0FGRSwgUDMgPSBVTktOT1dOIF0KKwkJCQkvLyBBZHZhbmNlIHNsaWRpbmcgd2luZG93IGFmdGVyIFAyCisJCQkJczEgPSBTQUZFOworCQkJCXMyID0gVU5TQUZFOworCQkJCS8vIE5vdyBjaGVjayB0byBzZWUgaWYgaXMgc2FmZSB0byBtYXJrIFAzIHRvby4KKwkJCQlpZiAoYTMgPCBhbHBoYSkgeworCQkJCQkvLyBbIFAxID0gU0FGRSwgUDIgPSBVTlNBRkUsIFAzID0gU0FGRSBdCisJCQkJCS8vIEFkdmFuY2Ugc2xpZGluZyB3aW5kb3cgYWZ0ZXIgUDIKKwkJCQkJczMgPSBTQUZFOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoYTEgPCBhbHBoYSAmJiBhMSA+IGEyKSB7CisJCQkJLy8gWyBQMSA9IFVOU0FGRSwgUDIgPSBTQUZFLCBQMyA9IFVOU0FGRSBdCisJCQkJLy8gU1BFQ0lBTCBDQVNFIDogQWR2YW5jZSBzbGlkaW5nIHdpbmRvdyBhZnRlciBQMworCQkJCXMxID0gVU5TQUZFOworCQkJCXMyID0gU0FGRTsKKwkJCQlzMyA9IFVOU0FGRTsKKwkJCQkvLyBTcGVjaWFsIGNhc2UgOiBzZXQgZmxhZyB0byBhZHZhbmNlIHNsaWRpbmcgd2luZG93IGFmdGVyIFAzCisJCQkJZmxhZyA9IHRydWU7CisKKwkJCX0gZWxzZSBpZiAoYTEgPiBhbHBoYSAmJiBhMiA+IGFscGhhKSB7CisJCQkJLy8gWyBQMSA9IFVOU0FGRSwgUDIgPSBVTlNBRkUsIFAzID0gVU5LTk9XTiBdCisJCQkJLy8gQWR2YW5jZSBzbGlkaW5nIHdpbmRvdyBhZnRlciBQMgorCQkJCXMxID0gVU5TQUZFOworCQkJCXMyID0gVU5TQUZFOworCQkJfQorCisJCQkvLyBQYWNrIHRoZSBtb2RpZmllZCBwb2ludC1kYXRhLgorCQkJU3RyaW5nIHQxID0gcDFbSU5ERVhdICsgIjoiICsgcDFbTFRdICsgIjoiICsgcDFbTEddICsgIjoiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJCSsgcDFbQU5HTEVdICsgIjoiICsgczE7IC8vJE5PTi1OTFMtMSQKKworCQkJU3RyaW5nIHQyID0gcDJbSU5ERVhdICsgIjoiICsgcDJbTFRdICsgIjoiICsgcDJbTEddICsgIjoiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJCSsgcDJbQU5HTEVdICsgIjoiICsgczI7IC8vJE5PTi1OTFMtMSQKKworCQkJU3RyaW5nIHQzID0gcDNbSU5ERVhdICsgIjoiICsgcDNbTFRdICsgIjoiICsgcDNbTEddICsgIjoiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJCSsgcDNbQU5HTEVdICsgIjoiICsgczM7IC8vJE5PTi1OTFMtMSQKKworCQkJLy8gU3RvcmUgdGhlIG1vZGlmaWVkIChtYXJrZWQpIHBvaW50LWRhdGEuCisJCQlsaXN0LnNldChJbnRlZ2VyLnBhcnNlSW50KHAxW0lOREVYXSksIHQxKTsKKwkJCWxpc3Quc2V0KEludGVnZXIucGFyc2VJbnQocDJbSU5ERVhdKSwgdDIpOworCQkJbGlzdC5zZXQoSW50ZWdlci5wYXJzZUludChwM1tJTkRFWF0pLCB0Myk7CisKKwkJCWlmIChmbGFnID09IHRydWUpIHsKKwkJCQkvLyBTUEVDSUFMIENBU0UgOiBBZHZhbmNlIHNsaWRpbmcgd2luZG93IGFmdGVyIFAzLgorCQkJCWxlZnRfYm9yZGVyID0gcmlnaHRfYm9yZGVyICsgMTsKKwkJCQlyaWdodF9ib3JkZXIgPSBsZWZ0X2JvcmRlciArIFdJTkRPV19MRU5HVEg7CisJCQkJLy8gR28gdG8gdGhlIG5leHQgaXRlcmF0aW9uLgorCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvLyBERUZBVUxUIDogQWR2YW5jZSBzbGlkaW5nIHdpbmRvdyBhZnRlciBQMi4KKwkJCWxlZnRfYm9yZGVyID0gcmlnaHRfYm9yZGVyOworCQkJcmlnaHRfYm9yZGVyID0gbGVmdF9ib3JkZXIgKyBXSU5ET1dfTEVOR1RIOworCisJCX0gLy8gd2hpbGUKKworCQkvLyBOb3cgcmVtb3ZlIHRoZSBTQUZFIHBvaW50cyBhbmQgcmV0dXJuIHRoZSByZWR1Y2VkIGxpc3QuCisJCUl0ZXJhdG9yIGl0ID0gbGlzdC5saXN0SXRlcmF0b3IoKTsKKworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisKKwkJCVN0cmluZyBkYXRhID0gKFN0cmluZykgaXQubmV4dCgpOworCisJCQlTdHJpbmdbXSB0b2tlbnMgPSBkYXRhLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJaWYgKHRva2Vuc1tTQUZFVFldLmVxdWFscyhTQUZFKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmVkdWNlZExpc3QuYWRkKGRhdGEpOworCisJCX0KKworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlZHVjZWQgbGlzdCBzaXplIGlzIDogIiArIHJlZHVjZWRMaXN0LnNpemUoKSk7CisKKwkJcmV0dXJuIHJlZHVjZWRMaXN0OworCisJfQorCisJLyoqCisJICogUHJvZmlsZSB0aGUgYW5nbGUgZGF0YS4gQ291bnQgaG93IG1hbnkgdGltZXMgZWFjaCB2YWx1ZSBvY2N1cnMKKwkgKiAKKwkgKiBAcGFyYW0gbGlzdCAtCisJICogICAgICAgICAgICBhIGxpc3Qgb2YgYW5nbGVzIGZvciBlYWNoIGRhdGEgcG9pbnQgaW4gdGhlIHBvbHlnb24KKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcm9maWxlKExpc3Q8U3RyaW5nPiBsaXN0KSB7CisKKwkJZmluYWwgaW50IEFOR0xFID0gMzsKKworCQlpZiAobGlzdCA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBXZSB3YW50IHRvIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIHBvaW50cyBvZiB0aGUKKwkJLy8gcG9seWdvbgorCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKKworCQkvLyBDbGVhciB0aGUgaGFzaCBtYXAgYmVmb3JlIHN0YXJ0IHVzaW5nIGl0LgorCQlpbml0SGFzaE1hcChhbmdsZVZhbHVlTWFwKTsKKworCQkvLyBDb3VudCB0aGUgb2NjdXJyZW5jZXMgb2YgdGhlIHZhbHVlcyBvZiB0aGUgMTgwIG9mZnNldAorCQkvLyBtaW51cyB0aGUgYW5nbGUuCisJCS8vIFRoaXMgY291bnQgd2lsbCBiZSB1c2VmdWwgZm9yIGZpbmRpbmcgYSBnb29kIHRocmVzaG9sZC4KKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQlTdHJpbmcgcCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKworCQkJU3RyaW5nW10gZWxlbWVudHMgPSBwLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJRG91YmxlIGFuZ2xlID0gbmV3IERvdWJsZShlbGVtZW50c1tBTkdMRV0pOworCisJCQlkb3VibGUgZGVncmVlcyA9IGFuZ2xlLmRvdWJsZVZhbHVlKCk7CisKKwkJCWNvdW50KGRlZ3JlZXMsIGFuZ2xlVmFsdWVNYXApOworCisJCX0gLy8gd2hpbGUKKworCX0KKworCS8qKgorCSAqIEJhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBhbmdsZSwga2VlcCB0cmFjayBvZiBpdC4KKwkgKiAKKwkgKiBAcGFyYW0gZGVncmVlcyAtCisJICogICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIGxhc3Qgb2Zmc2V0IC0gQ29zLTEoYW5nbGUpIHZhbHVlLgorCSAqIAorCSAqIEBwYXJhbSBtYXAgLQorCSAqICAgICAgICAgICAgVGhlIG1hcCBob2xkaW5nIGFuZ2xlcyBhbmQgdGhlaXIgY291bnQKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb3VudChkb3VibGUgZGVncmVlcywgSGFzaE1hcDxEb3VibGUsIEludGVnZXI+IG1hcCkgeworCisJCS8vIEZpbHRlciB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSBidWNrZXQgZm9yIHRoZSB2YWx1ZQorCisJCWlmIChkZWdyZWVzID49IDkwLjApIHsKKwkJCWludCBjb3VudCA9IChtYXAuZ2V0KG5ldyBEb3VibGUoOTAuMCkpKS5pbnRWYWx1ZSgpOworCQkJbWFwLnB1dChuZXcgRG91YmxlKDkwLjApLCBuZXcgSW50ZWdlcigrK2NvdW50KSk7CisKKwkJfSBlbHNlIGlmIChkZWdyZWVzID49IDQ1LjApIHsKKwkJCWludCBjb3VudCA9IChtYXAuZ2V0KG5ldyBEb3VibGUoNDUuMCkpKS5pbnRWYWx1ZSgpOworCQkJbWFwLnB1dChuZXcgRG91YmxlKDQ1LjApLCBuZXcgSW50ZWdlcigrK2NvdW50KSk7CisKKwkJfSBlbHNlIGlmIChkZWdyZWVzID49IDIyLjUpIHsKKwkJCWludCBjb3VudCA9IChtYXAuZ2V0KG5ldyBEb3VibGUoMjIuNSkpKS5pbnRWYWx1ZSgpOworCQkJbWFwLnB1dChuZXcgRG91YmxlKDIyLjUpLCBuZXcgSW50ZWdlcigrK2NvdW50KSk7CisKKwkJfSBlbHNlIGlmIChkZWdyZWVzID49IDExLjI1KSB7CisJCQlpbnQgY291bnQgPSAobWFwLmdldChuZXcgRG91YmxlKDExLjI1KSkpLmludFZhbHVlKCk7CisJCQltYXAucHV0KG5ldyBEb3VibGUoMTEuMjUpLCBuZXcgSW50ZWdlcigrK2NvdW50KSk7CisKKwkJfSBlbHNlIGlmIChkZWdyZWVzID49IDUuNTEyNSkgeworCQkJaW50IGNvdW50ID0gKG1hcC5nZXQobmV3IERvdWJsZSg1LjUxMjUpKSkuaW50VmFsdWUoKTsKKwkJCW1hcC5wdXQobmV3IERvdWJsZSg1LjUxMjUpLCBuZXcgSW50ZWdlcigrK2NvdW50KSk7CisKKwkJfSBlbHNlIGlmIChkZWdyZWVzID49IDIuMCkgeworCQkJaW50IGNvdW50ID0gKG1hcC5nZXQobmV3IERvdWJsZSgyLjApKSkuaW50VmFsdWUoKTsKKwkJCW1hcC5wdXQobmV3IERvdWJsZSgyLjApLCBuZXcgSW50ZWdlcigrK2NvdW50KSk7CisKKwkJfSBlbHNlIGlmIChkZWdyZWVzID49IDEuNSkgeworCQkJaW50IGNvdW50ID0gKG1hcC5nZXQobmV3IERvdWJsZSgxLjUpKSkuaW50VmFsdWUoKTsKKwkJCW1hcC5wdXQobmV3IERvdWJsZSgxLjUpLCBuZXcgSW50ZWdlcigrK2NvdW50KSk7CisKKwkJfSBlbHNlIGlmIChkZWdyZWVzID49IDEuMCkgeworCQkJaW50IGNvdW50ID0gKG1hcC5nZXQobmV3IERvdWJsZSgxLjApKSkuaW50VmFsdWUoKTsKKwkJCW1hcC5wdXQobmV3IERvdWJsZSgxLjApLCBuZXcgSW50ZWdlcigrK2NvdW50KSk7CisKKwkJfSBlbHNlIGlmIChkZWdyZWVzID49IDAuNzUpIHsKKwkJCWludCBjb3VudCA9IChtYXAuZ2V0KG5ldyBEb3VibGUoMC43NSkpKS5pbnRWYWx1ZSgpOworCQkJbWFwLnB1dChuZXcgRG91YmxlKDAuNzUpLCBuZXcgSW50ZWdlcigrK2NvdW50KSk7CisKKwkJfSBlbHNlIGlmIChkZWdyZWVzID49IDAuNSkgeworCQkJaW50IGNvdW50ID0gKG1hcC5nZXQobmV3IERvdWJsZSgwLjUpKSkuaW50VmFsdWUoKTsKKwkJCW1hcC5wdXQobmV3IERvdWJsZSgwLjUpLCBuZXcgSW50ZWdlcigrK2NvdW50KSk7CisKKwkJfSBlbHNlIGlmIChkZWdyZWVzID49IDAuMjUpIHsKKwkJCWludCBjb3VudCA9IChtYXAuZ2V0KG5ldyBEb3VibGUoMC4yNSkpKS5pbnRWYWx1ZSgpOworCQkJbWFwLnB1dChuZXcgRG91YmxlKDAuMjUpLCBuZXcgSW50ZWdlcigrK2NvdW50KSk7CisKKwkJfSBlbHNlIGlmIChkZWdyZWVzID49IDAuMTUpIHsKKwkJCWludCBjb3VudCA9IChtYXAuZ2V0KG5ldyBEb3VibGUoMC4xNSkpKS5pbnRWYWx1ZSgpOworCQkJbWFwLnB1dChuZXcgRG91YmxlKDAuMTUpLCBuZXcgSW50ZWdlcigrK2NvdW50KSk7CisKKwkJfSBlbHNlIGlmIChkZWdyZWVzID49IDAuMDUpIHsKKwkJCWludCBjb3VudCA9IChtYXAuZ2V0KG5ldyBEb3VibGUoMC4wNSkpKS5pbnRWYWx1ZSgpOworCQkJbWFwLnB1dChuZXcgRG91YmxlKDAuMDUpLCBuZXcgSW50ZWdlcigrK2NvdW50KSk7CisKKwkJfQorCisJfQorCisJLyoqCisJICogU2ltcGx5IGV4dHJhY3QgdGhlIExULExHIHZhbHVlcyBmcm9tIHRoZSBsaXN0LgorCSAqIAorCSAqIEBwYXJhbSBsaXN0CisJICogICAgICAgICAgICBhIGxpc3Qgd2l0aCBwb2ludC1kYXRhIG9mIHRoZSBmb3JtOiBJTkRFWDpMVDpMRzpBTkdMRTpTQUZFVFkKKwkgKiAKKwkgKiBAcmV0dXJuIFN0cmluZyBhIGNvbmNhdGVuYXRpb24gb2YgYWxsIHRoZSBMVCxMRyB2YWx1ZXMuCisJICovCisJU3RyaW5nIGV4dHJhY3RMaXN0SW50b1N0cmluZyhMaXN0PFN0cmluZz4gbGlzdCkgeworCisJCWZpbmFsIGludCBMVCA9IDE7CisKKwkJZmluYWwgaW50IExHID0gMjsKKworCQlTdHJpbmcgYnVmZmVyID0gbnVsbDsKKworCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKKworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisKKwkJCVN0cmluZyBwID0gKFN0cmluZykgaXQubmV4dCgpOworCisJCQlTdHJpbmdbXSBlbGVtZW50cyA9IHAuc3BsaXQoIjoiKTsgLy8kTk9OLU5MUy0xJAorCisJCQlpZiAoYnVmZmVyID09IG51bGwpIHsKKworCQkJCWJ1ZmZlciA9IGVsZW1lbnRzW0xUXSArICIsIiArIGVsZW1lbnRzW0xHXSArICIsIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCX0gZWxzZSB7CisKKwkJCQlidWZmZXIgKz0gZWxlbWVudHNbTFRdICsgIiwiICsgZWxlbWVudHNbTEddICsgIiwiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJfQorCisJCX0KKworCQlyZXR1cm4gYnVmZmVyOworCX0KKworCS8qKgorCSAqIENvbXB1dGUgdGhlIGNvc2luZSBpbnZlcnNlIG9mIGFuIGFuZ2xlIGFuZCBzdWJyYWN0IHRoYXQgdmFsdWUgZnJvbSBhbgorCSAqIG9mZnNldCBvZiAxODAgZGVncmVlcy4KKwkgKiAKKwkgKiBAcGFyYW0gcG9seWdvbgorCSAqICAgICAgICAgICAgYSBTVEVNIHBvbHlnb24KKwkgKiAKKwkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIGFuZ2xlIHZhbHVlcyBmb3IgYWxsIHBvaW50cyBpbiB0aGUgcG9seWdvbgorCSAqIAorCSAqLworCUxpc3Q8U3RyaW5nPiBjb21wdXRlSW52ZXJzZUNvc2luZXMoU1RFTVBvbHlnb24gcG9seWdvbikgeworCisJCWZpbmFsIGRvdWJsZSBJTkZJTklUWSA9IDEwMDAwMDAwOworCisJCS8vIExpc3QgdG8ga2VlcCB0cmFjayBvZiB0dXBsZXMgb2YgdGhlIGZvcm0gOiAoIHBvaW50LCBpbnZlcnNlCisJCS8vIEFOR0xFIGFuZ2xlICkKKwkJTGlzdDxTdHJpbmc+IHBvaW50RGF0YUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworCQkvLyBGaXJzdCwgZ2V0IGFuIGl0ZXJhdG9yIHRvIHRoZSBwb2ludHMgaW4gdGhlIHBvbHlnb24KKwkJSXRlcmF0b3IgaXQgPSBwb2x5Z29uLmdldEl0ZXJhdG9yKCk7CisKKwkJZG91YmxlIGRlZ3JlZXMgPSAwLjA7CisKKwkJLy8gR2V0IHRoZSBmaXJzdCB0aHJlZSBwb2ludHMKKwkJZG91YmxlIGludmVyc2VDb3NpbmUgPSBJTkZJTklUWTsKKworCQkvLyBTdHJpbmcgdG8gc3RvcmUgaW5pdGlhbCBwb2ludC4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gc2V0IHRoZSB2YWx1ZQorCQkvLyBvZiB0aGUgbGFzdCBwb2ludC4gU2luY2UgYSBwb2x5Z29uIGhhcyB0byBiZSBjbG9zZWQsIHRoZSBmaXJzdCBhbmQKKwkJLy8gbGFzdCBwb2ludHMgc2hvdWxkIGJlIHRoZSBzYW1lLiBJdCBpcyBiZXR0ZXIgdG8gc3RvcmUgaXQgdGhhbiB0bworCQkvLyByZWNvbXB1dGUgaXQgbGF0ZXIuCisJCVN0cmluZyBpbml0UG9pbnREYXRhID0gbnVsbDsKKwkJU3RyaW5nIGxhc3RQb2ludERhdGEgPSBudWxsOworCisJCVBvaW50RGF0YSBwMSA9IG51bGw7CisJCVBvaW50RGF0YSBwMiA9IG51bGw7CisJCVBvaW50RGF0YSBwMyA9IG51bGw7CisKKwkJaW50IGluZGV4ID0gMDsKKworCQkvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCBwb2ludC4KKwkJLy8gV2UgbmV2ZXIgZGVsZXRlIHRoZSBmaXJzdCBvciB0aGUgbGFzdCBwb2ludCwgb3RoZXJ3aXNlIHdlIHdpbGwKKwkJLy8gdHVybiB0aGlzIHBvbHlnb24gaW50byBhIG5vbi1wb2x5Z29uLgorCQkvLyBTZXQgdG8gVU5TQUZFIGFuZCBhbmdsZSB0byBEb3VibGUuTUFYX1ZBTFVFIHRvIG1ha2Ugc3VyZSB0aGF0IG5laXRoZXIKKwkJLy8gb2YgdGhlc2UgcG9pbnRzIGV2ZXIgYmUgcmVtb3ZlZC4KKworCQlpZiAoaW5pdFBvaW50RGF0YSA9PSBudWxsKSB7CisKKwkJCVBvaW50RGF0YSBpbml0ID0gcG9seWdvbi5nZXRJbml0KCk7CisKKwkJCS8vIFNldCBhbmdsZSB0byBhCisJCQlpbml0UG9pbnREYXRhID0gU3RyaW5nLnZhbHVlT2YoMCkgKyAiOiIgKyBpbml0LmdldEx0KCkgKyAiOiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCSsgaW5pdC5nZXRMZygpICsgIjoiICsgRG91YmxlLk1BWF9WQUxVRSArICI6IiArIFVOU0FGRTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCWxhc3RQb2ludERhdGEgPSBTdHJpbmcudmFsdWVPZihwb2x5Z29uLnBvaW50cygpIC0gMSkgKyAiOiIgLy8kTk9OLU5MUy0xJAorCQkJCQkrIGluaXQuZ2V0THQoKSArICI6IiArIGluaXQuZ2V0TGcoKSArICI6IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJKyBEb3VibGUuTUFYX1ZBTFVFICsgIjoiICsgVU5TQUZFOyAvLyROT04tTkxTLTEkCisKKwkJfQorCisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKworCQkJaWYgKHAxID09IG51bGwpIHsKKwkJCQlwMSA9IChQb2ludERhdGEpIGl0Lm5leHQoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHAyID09IG51bGwpIHsKKwkJCQlwMiA9IChQb2ludERhdGEpIGl0Lm5leHQoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHAzID09IG51bGwpIHsKKwkJCQlwMyA9IChQb2ludERhdGEpIGl0Lm5leHQoKTsKKwkJCX0KKworCQkJaWYgKGluZGV4ID09IDApIHsKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyAoMSkgOiAiICsgaW5pdFBvaW50RGF0YSk7CisJCQkJcG9pbnREYXRhTGlzdC5hZGQoaW5kZXgrKywgaW5pdFBvaW50RGF0YSk7CisJCQl9CisKKwkJCS8vIFN0cmluZyB1c2VkIHRvIHJlcHJlc2VudCBleHRlbmRlZCBwb2ludCBkYXRhLiBJdCBoYXMgdGhlIGZvcm0gOgorCQkJLy8gSU5ERVg6TFQ6TEc6QU5HTEU6U0FGRVRZCisJCQlTdHJpbmcgdHVwbGUgPSBudWxsOworCisJCQkvLyBOb3cgdGhhdCB3ZSBoYXZlIHRocmVlIGNvbnNlY3V0aXZlIHBvaW50cywgY29tcHV0ZSB0aGUgaW52ZXJzZQorCQkJLy8gQU5HTEUgb2YgdGhlIGFuZ2xlCisJCQkvLyBmb3IgdGhlIHRyaWFuZ2xlIGZvcm1lZCBieSB0aGVzZSB0aHJlZSBjb25zZWN1dGl2ZSBwb2ludHMuCisJCQlmaW5hbCBkb3VibGUgY2MgPSAxMDAwMDAwMDAwMDAuMDsKKwkJCWRvdWJsZSBsdDEgPSBwMS5nZXRMdCgpICogY2M7CisJCQlkb3VibGUgbHQyID0gcDIuZ2V0THQoKSAqIGNjOworCQkJZG91YmxlIGx0MyA9IHAzLmdldEx0KCkgKiBjYzsKKwkJCWRvdWJsZSBsZzEgPSBwMS5nZXRMZygpICogY2M7CisJCQlkb3VibGUgbGcyID0gcDIuZ2V0TGcoKSAqIGNjOworCQkJZG91YmxlIGxnMyA9IHAzLmdldExnKCkgKiBjYzsKKworCQkJLy8gY29tcHV0ZTogYV4yID0gKFhpLSBYaS0xKV4yICsgKFlpLSBZaS0xKV4yCisJCQlkb3VibGUgYSA9IE1hdGgucG93KChsZzIgLSBsZzEpLCAyKSArIE1hdGgucG93KChsdDIgLSBsdDEpLCAyKTsKKworCQkJLy8gY29tcHV0ZTogYl4yID0gKFhpKzEgLVhpKV4yICsgKFlpKzEgLVlpKV4yCisJCQlkb3VibGUgYiA9IE1hdGgucG93KChsZzMgLSBsZzIpLCAyKSArIE1hdGgucG93KChsdDMgLSBsdDIpLCAyKTsKKworCQkJLy8gY29tcHV0ZTogY14yID0gKFhpKzEgLSBYaS0xKV4yICsgKFlpKzEgLSBZaS0xKV4yCisJCQlkb3VibGUgYyA9IE1hdGgucG93KChsZzMgLSBsZzEpLCAyKSArIE1hdGgucG93KChsdDMgLSBsdDEpLCAyKTsKKworCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgQV4yID0gIiArIGEpOworCisJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBCXjIgPSAiICsgYik7CisKKwkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIENeMiA9ICIgKyBjKTsKKworCQkJLy8gTm93IGNvbXB1dGU6IChhXjIgKyBiXjIgLSBjXjIpIC8gMmFiCisKKwkJCWRvdWJsZSByYXRpbyA9ICgoYSArIGIpIC0gYykgLyAoMiAqIE1hdGguc3FydChhKSAqIE1hdGguc3FydChiKSk7CisKKwkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmF0aW8gaXMgOiAiICsgcmF0aW8pOworCisJCQkvLyBOb3cgY29tcHV0ZSB0aGUgYXJjIEFOR0xFIDogY29zLTEoIHJhdGlvICkKKwkJCWludmVyc2VDb3NpbmUgPSBNYXRoLmFjb3MocmF0aW8pOworCisJCQlkZWdyZWVzID0gTWF0aC5hYnMoMTgwLjAgLSBHZW5VdGlscy50b0RlZ3JlZXMoaW52ZXJzZUNvc2luZSkpOworCisJCQl0dXBsZSA9IFN0cmluZy52YWx1ZU9mKGluZGV4KSArICI6IiArIHAyLmdldEx0KCkgKyAiOiIgKyBwMi5nZXRMZygpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkrICI6IiArIG5ldyBEb3VibGUoZGVncmVlcykgKyAiOiIgKyBVTktOT1dOOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJLy8gU3RvcmUgdHVwbGUgaW4gdGhlIG1hcAorCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgKDEpIDogIiArIHR1cGxlKTsKKwkJCXBvaW50RGF0YUxpc3QuYWRkKGluZGV4KyssIHR1cGxlKTsKKworCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnZlcnNlIGNvc2luZSBpcyAiICsgaW52ZXJzZUFOR0xFKTsKKworCQkJLy8gU2xpZGUgdGhlIHBvaW50cyBieSBvbmUgdG8gZG8gdGhlIG5ldyBjb21wdXRhdGlvbiBvZiB0aGUgYW5nbGUKKworCQkJLy8gTm93IHNldCBwMSA8LSBwMgorCQkJcDEgPSBwMjsKKworCQkJLy8gTm93IHNldCBwMiA8LSBwMworCQkJcDIgPSBwMzsKKworCQkJLy8gTm93IHNldCBwMyA9IG51bGwKKwkJCXAzID0gbnVsbDsKKworCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgdGhlIGxhc3QgaXRlcmF0aW9uLgorCQkJaWYgKGl0Lmhhc05leHQoKSA9PSBmYWxzZSkgeworCisJCQkJLy8gSWYgc28sIGFkZCB0aGUgbGFzdCBwb2ludC4KKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyAoMikgOiAiICsgbGFzdFBvaW50RGF0YSk7CisJCQkJcG9pbnREYXRhTGlzdC5hZGQoaW5kZXgsIGxhc3RQb2ludERhdGEpOworCQkJCWJyZWFrOworCQkJfQorCisJCX0KKworCQlyZXR1cm4gcG9pbnREYXRhTGlzdDsKKwl9CisKKwkvKioKKwkgKiBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIHJlYWwgcG9seWdvbiAoaS5lLiBjbG9zZWQpCisJICogCisJICogQHBhcmFtIHBvbHlnb24KKwkgKiAgICAgICAgICAgIEEgU1RFTSBwb2x5Z29uCisJICogCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXJhbWV0ZXIgInBvbHlnb24iIGlzIGEgU1RFTSBwb2x5Z29uCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNQb2x5Z29uKFNURU1Qb2x5Z29uIHBvbHlnb24pIHsKKworCQlQb2ludERhdGEgaW5pdCA9IHBvbHlnb24uZ2V0SW5pdCgpOworCQlQb2ludERhdGEgbGFzdCA9IHBvbHlnb24uZ2V0TGFzdCgpOworCisJCWlmIChpbml0LmdldEx0KCkgIT0gbGFzdC5nZXRMdCgpKSB7CisJCQkvLyBOb3QgYSBwb2x5Z29uCisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoaW5pdC5nZXRMZygpICE9IGxhc3QuZ2V0TGcoKSkgeworCQkJLy8gTm90IGEgcG9seWdvbgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gWWVzLCBpdCBpcyBhIHBvbHlnb24KKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgcG9seWdvbiBpcyBkdXBsaWNhdGVkLgorCSAqIAorCSAqIEBwYXJhbSBwb2x5Z29uCisJICogICAgICAgICAgICBhIFNURU0gcG9seWdvbgorCSAqIEBwYXJhbSBpdAorCSAqICAgICAgICAgICAgYW4gaXRlcmF0b3Igb24gdGhlIHBvbHlnb24gbGlzdAorCSAqIAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHBvbHlnb24gaXMgYWxyZWFkeSBpbiB0aGUgbGlzdCBvZiBrbm93biBwb2x5Z29ucworCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzUG9seWdvbkR1cGxpY2F0ZWQoSXRlcmF0b3IgaXQsIFNURU1Qb2x5Z29uIHBvbHlnb24pIHsKKworCQlpZiAoaXQuaGFzTmV4dCgpICE9IHRydWUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCVNURU1Qb2x5Z29uIGN1cnJlbnQgPSAoU1RFTVBvbHlnb24pIGl0Lm5leHQoKTsKKwkJCWlmIChjdXJyZW50LnNhbWUocG9seWdvbikgPT0gdHJ1ZSkgeworCQkJCS8vIE5vdCB1bmlxdWUsIGl0IGlzIGR1cGxpY2F0ZWQgc28gY29uZGl0aW9uIGlzIGZhbHNlLgorCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIHRoZSBvcGVuaW5nIFhNTCB0YWdzIHRoYXQgZGVhbCB3aXRoIGlzbGFuZHMgb2YKKwkgKiBwb2x5Z29uIGRhdGEuCisJICogCisJICogQHBhcmFtIGlkCisJICogICAgICAgICAgICB0aGUgZGVzY3JpcHRvciBmb3IgdGhlIGVudGl0eQorCSAqIAorCSAqIEByZXR1cm4gYSBHTUwgdGFnIHRoYXQgZGVzY3JpYmVzIGEgcG9seWdvbgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgb3BlblBvbHlnb25Jc2xhbmRUYWdzKFN0cmluZyBpZCkgeworCisJCVN0cmluZyB0YWdzID0gbnVsbDsKKwkJdGFncyA9ICI8Z21sOlBvbHlnb24gZ21sOmlkPVwiIiArIGlkICsgIlwiPlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCXRhZ3MgKz0gIjxnbWw6b3V0ZXJCb3VuZGFyeUlzPlxuIjsgLy8kTk9OLU5MUy0xJAorCisJCXJldHVybiB0YWdzOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgdGhlIHRhZ3MgdGhhdCBkZXNjcmliZSBhICJwb2x5Z29uIGlzbGFuZCIgb3IgbGluZWFyCisJICogcmluZyBhbmQgcHV0cyB0aGUgcG9seWdvbiBkYXRhIGluc2lkZSBvZiBpdC4KKwkgKiAKKwkgKiBAcGFyYW0gYnVmZmVyCisJICogICAgICAgICAgICB0aGUgZGF0YSBidWZmZXIgY29udGFpbmluZyBhbGwgdGhlIHBvbHlnb25kIGRhdGEKKwkgKiBAcGFyYW0gbGV2ZWwKKwkgKiAgICAgICAgICAgIHRoZSBhZG1pbiBsZXZlbAorCSAqIAorCSAqIEByZXR1cm4gYSBHTUwgdGFnIGZvciBvcGVuaW5nIGEgbGluZWFyIHJpbmcuCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBhZGRMaW5lYXJSaW5nVGFncyhTdHJpbmcgYnVmZmVyLCBpbnQgbGV2ZWwpIHsKKworCQlpbnQgb2Zmc2V0ID0gMDsKKworCQlTdHJpbmcgcG9seWdvbkRhdGEgPSBudWxsOworCisJCXN3aXRjaCAobGV2ZWwpIHsKKworCQljYXNlIERhdGFUeXBlcy5MRVZFTF8wOgorCQkJb2Zmc2V0ID0gMjsKKwkJCWJyZWFrOworCisJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzE6CisJCQlvZmZzZXQgPSAzOworCQkJYnJlYWs7CisKKwkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMjoKKwkJCW9mZnNldCA9IDQ7CisJCQlicmVhazsKKwkJfQorCisJCS8vIFRva2VuaXplCisJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJ1ZmZlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEFkdmFuY2UgdGhlIGZpcnN0IEstdG9rZW5zLgorCQlmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldDsgaSsrKSB7CisJCQlpZiAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworCQkJCXRva2Vucy5uZXh0VG9rZW4oKTsKKwkJCX0KKwkJfQorCisJCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7CisKKwkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKKworCQkJaWYgKEdlblV0aWxzLmlzTnVtZXJpYyh0b2tlbikgPT0gZmFsc2UpIHsKKwkJCQljb250aW51ZTsgLy8gSWdub3JlLCB0aGlzIGlzIG5vdCBhIHZhbGlkIGNvb3JkaW5hdGUuCisJCQl9CisKKwkJCS8vIENvbnZlcnQgdG9rZW4gKHBvbHlnb24gZGF0YSkgdG8gYW4gaW50LgorCQkJZG91YmxlIGNvb3JkID0gR2VuVXRpbHMudG9EZWdyZWVzKEdlblV0aWxzLmdldERvdWJsZSh0b2tlbikpOworCisJCQkvLyBGb3JtYXQgbHQsIGxnIHZhbHVlcyBhY2NvcmRpbmcgdG8gb3VyIGNvbnZlbnRpb24KKwkJCWlmIChwb2x5Z29uRGF0YSA9PSBudWxsKSB7CisJCQkJcG9seWdvbkRhdGEgPSBHZW5VdGlscy5mb3JtYXQoY29vcmQpICsgIiAiOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCXBvbHlnb25EYXRhICs9IEdlblV0aWxzLmZvcm1hdChjb29yZCkgKyAiICI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCisJCVN0cmluZyB0YWdzID0gIjxnbWw6TGluZWFyUmluZz5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSAiPGdtbDpwb3NMaXN0PlxuIjsgLy8kTk9OLU5MUy0xJAorCQl0YWdzICs9IHBvbHlnb25EYXRhICsgIlxuIjsgLy8kTk9OLU5MUy0xJAorCQl0YWdzICs9ICI8L2dtbDpwb3NMaXN0PlxuIjsgLy8kTk9OLU5MUy0xJAorCQl0YWdzICs9ICI8L2dtbDpMaW5lYXJSaW5nPlxuIjsgLy8kTk9OLU5MUy0xJAorCisJCXJldHVybiB0YWdzOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgdGhlIGNsb3NpbmcgWE1MIHRhZ3MgdGhhdCBkZWFsIHdpdGggaXNsYW5kcyBvZgorCSAqIHBvbHlnb24gZGF0YS4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgR01MIHRhZyBmb3IgY2xvc2luZyBhIHBvbHlnb24uCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBjbG9zZVBvbHlnb25Jc2xhbmRUYWdzKCkgeworCisJCVN0cmluZyB0YWdzID0gbnVsbDsKKwkJdGFncyA9ICI8L2dtbDpvdXRlckJvdW5kYXJ5SXM+XG4iOyAvLyROT04tTkxTLTEkCisJCXRhZ3MgKz0gIjwvZ21sOlBvbHlnb24+XG4iOyAvLyROT04tTkxTLTEkCisKKwkJcmV0dXJuIHRhZ3M7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgY3JlYXRlcyB0aGUgWE1MIHRhZ3MgdGhhdCBkZWFsIHdpdGggc2ltcGxlIHBvbHlnb24gZGF0YSBhbmQKKwkgKiBpbmNsdWRlcyB0aGUgcG9seWdvbiBkYXRhIGluIGl0LgorCSAqIAorCSAqIEBwYXJhbSBpZAorCSAqICAgICAgICAgICAgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBlbnRpdHkKKwkgKiBAcGFyYW0gYnVmZmVyCisJICogICAgICAgICAgICB0aGUgZGF0YSBidWZmZXIgY29udGFpbmluZyBhbGwgdGhlIHBvbHlnb24gZGF0YQorCSAqIEBwYXJhbSBsZXZlbAorCSAqICAgICAgICAgICAgdGhlIGFkbWluIGxldmVsCisJICogCisJICogQHJldHVybiBhIEdNTCB0YWcgdG8gY3JlYXRlIGEgc2ltcGxlIHBvbHlnb24uCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVTaW1wbGVQb2x5Z29uVGFncyhTdHJpbmcgaWQsIFN0cmluZyBidWZmZXIsIGludCBsZXZlbCkgeworCisJCWludCBvZmZzZXQgPSAwOworCisJCVN0cmluZyBwb2x5Z29uRGF0YSA9IG51bGw7CisKKwkJc3dpdGNoIChsZXZlbCkgeworCisJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzA6CisJCQlvZmZzZXQgPSAyOworCQkJYnJlYWs7CisKKwkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMToKKwkJCW9mZnNldCA9IDM7CisJCQlicmVhazsKKworCQljYXNlIERhdGFUeXBlcy5MRVZFTF8yOgorCQkJb2Zmc2V0ID0gNDsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gVG9rZW5pemUKKwkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYnVmZmVyLCAiLCIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQWR2YW5jZSB0aGUgZmlyc3QgSy10b2tlbnMuCisJCWZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0OyBpKyspIHsKKwkJCWlmICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7CisJCQkJdG9rZW5zLm5leHRUb2tlbigpOworCQkJfQorCQl9CisKKwkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKKworCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpOworCisJCQlpZiAoR2VuVXRpbHMuaXNOdW1lcmljKHRva2VuKSA9PSBmYWxzZSkgeworCQkJCWNvbnRpbnVlOyAvLyBJZ25vcmUsIHRoaXMgaXMgbm90IGEgdmFsaWQgY29vcmRpbmF0ZS4KKwkJCX0KKworCQkJLy8gQ29udmVydCB0b2tlbiAocG9seWdvbiBkYXRhKSB0byBhbiBpbnQuCisJCQlkb3VibGUgY29vcmQgPSBHZW5VdGlscy50b0RlZ3JlZXMoR2VuVXRpbHMuZ2V0RG91YmxlKHRva2VuKSk7CisKKwkJCS8vIEZvcm1hdCBsdCwgbGcgdmFsdWVzIGFjY29yZGluZyB0byBvdXIgY29udmVudGlvbgorCQkJaWYgKHBvbHlnb25EYXRhID09IG51bGwpIHsKKwkJCQlwb2x5Z29uRGF0YSA9IEdlblV0aWxzLmZvcm1hdChjb29yZCkgKyAiICI7IC8vJE5PTi1OTFMtMSQKKwkJCX0gZWxzZSB7CisJCQkJcG9seWdvbkRhdGEgKz0gR2VuVXRpbHMuZm9ybWF0KGNvb3JkKSArICIgIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisKKwkJU3RyaW5nIHRhZ3MgPSBudWxsOworCisJCWlmIChwb2x5Z29uRGF0YSA9PSBudWxsKSB7CisJCQl0YWdzID0gIjxnbWw6UG9seWdvbiBnbWw6aWQ9XCIiICsgaWQgKyAiXCIvPlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0gZWxzZSB7CisJCQl0YWdzID0gIjxnbWw6UG9seWdvbiBnbWw6aWQ9XCIiICsgaWQgKyAiXCI+XG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCXRhZ3MgKz0gIjxnbWw6b3V0ZXJCb3VuZGFyeUlzPlxuIjsgLy8kTk9OLU5MUy0xJAorCQkJdGFncyArPSAiPGdtbDpMaW5lYXJSaW5nPlxuIjsgLy8kTk9OLU5MUy0xJAorCQkJdGFncyArPSAiPGdtbDpwb3NMaXN0PlxuIjsgLy8kTk9OLU5MUy0xJAorCQkJdGFncyArPSBwb2x5Z29uRGF0YSArICJcbiI7IC8vJE5PTi1OTFMtMSQKKwkJCXRhZ3MgKz0gIjwvZ21sOnBvc0xpc3Q+XG4iOyAvLyROT04tTkxTLTEkCisJCQl0YWdzICs9ICI8L2dtbDpMaW5lYXJSaW5nPlxuIjsgLy8kTk9OLU5MUy0xJAorCQkJdGFncyArPSAiPC9nbWw6b3V0ZXJCb3VuZGFyeUlzPlxuIjsgLy8kTk9OLU5MUy0xJAorCQkJdGFncyArPSAiPC9nbWw6UG9seWdvbj5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCXJldHVybiB0YWdzOworCX0KKworCS8qKgorCSAqIEdlbmVyYXRlIHRoZSBvcGVuaW5nIHRhZ3MgZm9yIHRoaXMgR01MIGZpbGUuCisJICogCisJICogQHBhcmFtIGNvZGUKKwkgKiAgICAgICAgICAgIHRoZSBJU08gY29kZQorCSAqIEBwYXJhbSBsZXZlbAorCSAqICAgICAgICAgICAgdGhlIGFkbWluIGxldmVsCisJICogCisJICogQHJldHVybiB0aGUgb3BlbmluZyB0YWdzIGZvciB0aGUgR01MIGZpbGUuCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRPcGVuaW5nVGFncyhJU09Db2RlMSBjb2RlLCBpbnQgbGV2ZWwpIHsKKworCQkvLyBDYWxlbmRhciBkYXRlID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwkJU3RyaW5nIHRhZ3MgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iOyAvLyROT04tTkxTLTEkCisJCXRhZ3MgKz0gR2VuVXRpbHMuZ2VHTUxDb3B5cmlnaHQoKTsKKwkJdGFncyArPSBHZW5VdGlscy5nZXRHTUxLZXlGb3JtYXRFeHBsYW5hdGlvbigpOworCQl0YWdzICs9ICI8TWFwIHhtbG5zOmdtbD1cImh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sXCIgeG1sbnM6Z2VvcnNzPVwiaHR0cDovL3d3dy5nZW9yc3Mub3JnL2dlb3Jzc1wiPlxuIjsgLy8kTk9OLU5MUy0xJAorCQl0YWdzICs9ICI8dGl0bGU+IiArIGNvZGUuZ2V0QWxwaGEzKCkgKyAiIExldmVsICIgKyBsZXZlbCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkrICIgTWFwPC90aXRsZT5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSAiPHN1YlRpdGxlPkFkbWluaXN0cmF0aXZlIEJvdW5kYXJpZXM8L3N1YlRpdGxlPlxuIjsgLy8kTk9OLU5MUy0xJAorCQl0YWdzICs9ICI8dXBkYXRlZD5UdWUgTm92IDA3IDE2OjU3OjU1IFBTVCAyMDA2IDwvdXBkYXRlZD5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSAiPGVudHJ5PlxuIjsgLy8kTk9OLU5MUy0xJAorCQl0YWdzICs9ICI8Z2VvcnNzOndoZXJlPlxuIjsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gdGFnczsKKwl9CisKKwkvKioKKwkgKiBHZW5lcmF0ZSB0aGUgY2xvc2luZyB0YWdzIGZvciB0aGlzIEdNTCBmaWxlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGNsb3NpbmcgdGFncyBvZiB0aGUgR01MIGZpbGUKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldENsb3NpbmdUYWdzKCkgeworCQlTdHJpbmcgdGFncyA9ICI8L2dlb3Jzczp3aGVyZT5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSAiPC9lbnRyeT5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSAiPC9NYXA+XG4iOyAvLyROT04tTkxTLTEkCisJCXJldHVybiB0YWdzOworCX0KKworCS8qKgorCSAqIFRoZSBleGVjdXRpb24gZW50cnkgcG9pbnQKKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJLy8gZmluYWwgaW50IFRIUkVTSE9MRCA9IDA7CisJCS8vIGZpbmFsIGludCBpdGVyYXRpb25zID0gMTsKKwkJLy8gZmluYWwgaW50IElTT18zMTY2XzEgPSAyOworCQkvLyBmaW5hbCBpbnQgSVNPXzMxNjZfMiA9IDM7CisJCS8vIGZpbmFsIGludCBGSVhfRklMRSA9IDQ7CisJCS8vIGZpbmFsIGludCBUQVJHRVRfTElTVCA9IDU7CisJCS8vIGZpbmFsIGludCBMRVhfRElSID0gNjsKKwkJLy8gZmluYWwgaW50IE9VVFBVVF9ESVIgPSA3OworCQkvLyBmaW5hbCBpbnQgUEFSQU1TID0gODsKKwkJLy8KKwkJLy8gaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQKKwkJLy8gLnByaW50bG4oIlx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyA6ICIpOworCQkvLyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBUaHJlc2hvbGQgKGluIGRlZ3JlZXMpIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IFRvdGFsIGl0ZXJhdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgSVNPIDMxNjYtMSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IElTTyAzMTY2LTIgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBJU08gZml4IGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgVGFyZ2V0IGNvdW50cmllcyBmaWxlIik7IC8vJE5PTi1OTFMtMSRGCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBMZXhpY29ncmFwaGljIHNvcnRpbmcgZGlyZWN0b3J5Iik7CisJCS8vIC8vJE5PTi1OTFMtMSQkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBPdXRwdXQgZGlyZWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gcmV0dXJuOworCQkvLyB9CisJCS8vCisJCS8vIE11bHRpUGFzc0Rvd25TYW1wbGVyIHNhbXBsZXIgPSBuZXcgTXVsdGlQYXNzRG93blNhbXBsZXIoCisJCS8vIGFyZ3NbVEhSRVNIT0xEXSwgYXJnc1tpdGVyYXRpb25zXSwgYXJnc1tJU09fMzE2Nl8xXSwKKwkJLy8gYXJnc1tJU09fMzE2Nl8yXSwgYXJnc1tGSVhfRklMRV0sIGFyZ3NbVEFSR0VUX0xJU1RdLAorCQkvLyBhcmdzW0xFWF9ESVJdLCBhcmdzW09VVFBVVF9ESVJdKTsKKwkJLy8gc2FtcGxlci5ydW4oKTsKKworCQlmaW5hbCBpbnQgQ09ORklHX0ZJTEUgPSAwOworCQlmaW5hbCBpbnQgUEFSQU1TID0gMTsKKworCQlpZiAoYXJncy5sZW5ndGggPCBQQVJBTVMpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdC0tV3JvbmcgYXJndW1lbnRzLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRcdFRvIHJ1biwgcGxlYXNlIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhcmd1bWVudChzKSA6ICIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdCBDb25maWd1cmF0aW9uIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLmV4aXQoMSk7CisJCX0KKworCQlNdWx0aVBhc3NEb3duU2FtcGxlciBzYW1wbGVyID0gbmV3IE11bHRpUGFzc0Rvd25TYW1wbGVyKAorCQkJCWFyZ3NbQ09ORklHX0ZJTEVdKTsKKworCQlzYW1wbGVyLnJ1bigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9OYW1lR2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL05hbWVHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWE5ZjliCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9OYW1lR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw3MTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogU1RFTSBJSSBEYXRhIE1pZ3JhdGlvbi9HZW5lcmF0aW9uIFV0aWxpdGllcyAtLSBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyB0aGF0CisgKiBnZW5lcmF0ZXMgdGhlIG5hbWVzLnByb3BlcnRpZXMgZmlsZXMgZm9yIGFsbCBjb3VudHJpZXMuCisgKiAKKyAqIAorICogVG8gY29uZmlndXJlLCBzZWUgY29uZmlndXJhdGlvbiBmaWxlIDoKKyAqIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL05hbWVHZW5lcmF0b3IuY29uZmlnCisgKiAKKyAqIAorICogVG8gcnVuLCBhZGQgcGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUgaW4gdGhlIHJ1biBwcm9maWxlIChpLmUuCisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGNvbmZpZ3VyYXRpb25cTmFtZUdlbmVyYXRvci5jb25maWcpCisgKiAKKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBOYW1lR2VuZXJhdG9yIHsKKworCS8qKgorCSAqIFNURU0gSUkgUHJvcGVydGllcyBGaWxlIFV0aWxpdHkgLS0gVGhpcyBjbGFzcyBpcyBhIHV0aWxpdHkgdG8gZ2VuZXJhdGUKKwkgKiB0aGUgbmFtZXMucHJvcGVydGllcyBmaWxlcy4KKwkgKiAKKwkgKiBAcGFyYW0gaXNvMzE2Nl8xIC0KKwkgKiAgICAgICAgICAgIGRhdGEgZmlsZSB3aXRoIHRoZSBJU08zMTY2LTEgQUxQSEFfMiBhbmQgQUxQSEFfMyBjb2Rlcy4KKwkgKiBAcGFyYW0gaXNvMzE2Nl8yIC0KKwkgKiAgICAgICAgICAgIGZpbGUgd2l0aCB0aGUgSVNPMzE2Ni0yIGRhdGEgdXNlZCBmb3IgZ2VuZXJhdGluZyB0aGUgSURzLiBcCisJICogQHBhcmFtIHRhcmdldExpc3QgLQorCSAqICAgICAgICAgICAgZGF0YSBmaWxlIHdoZXJlIHdlIGZpbmQgYSBsaXN0IG9mIGNvdW50cmllcyBmb3IgZ2VuZXJhdGlvbiBvZgorCSAqICAgICAgICAgICAgdGhlaXIgY29ycmVzcG9uZGluZyBhcmVhLnByb3BlcnRpZXMgZmlsZXMuCisJICogQHBhcmFtIGxleERpcgorCSAqICAgICAgICAgICAgZm9sZGVyIGNvbnRhaW5pbmcgbGV4aWNvZ3JhcGhpY2FsbHkgc29ydGVkIGZpbGVzCisJICogQHBhcmFtIG91dHB1dERpciAtCisJICogICAgICAgICAgICB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIGZpbGVzIGdlbmVyYXRlZC4KKwkgKiAKKwkgKi8KKworCS8qKgorCSAqIE91ciBzb3VyY2UgZmlsZXMgZm9yIElTTyAzMTY2LTEgY29kZXMgYW5kIGZvciB0aGUgbGlzdCBvZiB0YXJnZXQKKwkgKiBjb3VudHJpZXMuCisJICovCisKKwlwcml2YXRlIFN0cmluZyBpc28zMTY2XzEgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgaXNvMzE2Nl8yID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIGZpeEZpbGUgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0RmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBsZXhEaXIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RGlyID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIHdvcmtzcGFjZSA9IG51bGw7CisKKwkvKioKKwkgKiBMaXN0IGZvciBJU08gMzE2Ni0xIGNvZGVzIGFuZCB0YXJnZXQgY291bnRyaWVzLgorCSAqLworCUxpc3Q8U3RyaW5nPiB0YXJnZXRMaXN0ID0gbnVsbDsKKworCUxpc3Q8U3RyaW5nPiBjb2RlTGlzdCA9IG51bGw7CisKKwlMaXN0PFN0cmluZz4gY29kZWZpeExpc3QgPSBudWxsOworCisJLyoqCisJICogSGFzaCBzZXQgZm9yIHN0b3JpbmcgdGhlIHNvdXJjZSBVUkxzIHJlbGV2YW50IHRvIGFyZWEgZGF0YS4KKwkgKi8KKwlTZXQ8U3RyaW5nPiB1cmxTZXQgPSBudWxsOworCisJLyoqCisJICogSGFzaCBtYXAgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBzb3VyY2VzIHdpbGwgYmUgc2hvd24gY29tbWVudGVkIG91dCBhbmQKKwkgKiB3aGljaCB3aWxsIGFwcGVhciBhY3RpdmUuCisJICovCisJLy8gSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+IHVybFN0YXR1cyA9IG51bGw7CisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gaXNvMzE2Nl8xIC0KKwkgKiAgICAgICAgICAgIGRhdGEgZmlsZSB3aXRoIHRoZSBJU08zMTY2LTEgQUxQSEFfMiBhbmQgQUxQSEFfMyBjb2Rlcy4KKwkgKiBAcGFyYW0gaXNvMzE2Nl8yIC0KKwkgKiAgICAgICAgICAgIGZpbGUgd2l0aCB0aGUgSVNPMzE2Ni0yIGRhdGEgdXNlZCBmb3IgZ2VuZXJhdGluZyB0aGUgSURzLgorCSAqIEBwYXJhbSBmaXhGaWxlIC0KKwkgKiAgICAgICAgICAgIGZpbGUgY29udGFpbmluZyBtaXNzaW5nIElTTzMxNjYtMiBjb2RlcworCSAqIEBwYXJhbSB0YXJnZXRGaWxlIC0KKwkgKiAgICAgICAgICAgIGRhdGEgZmlsZSB3aGVyZSB3ZSBmaW5kIGEgbGlzdCBvZiBjb3VudHJpZXMgZm9yIGdlbmVyYXRpb24gb2YKKwkgKiAgICAgICAgICAgIHRoZWlyIGNvcnJlc3BvbmRpbmcgYXJlYS5wcm9wZXJ0aWVzIGZpbGVzLgorCSAqIEBwYXJhbSBsZXhEaXIKKwkgKiAgICAgICAgICAgIGZvbGRlciBjb250YWluaW5nIGxleGljb2dyYXBoaWNhbGx5IHNvcnRlZCBmaWxlcworCSAqIEBwYXJhbSBvdXRwdXREaXIgLQorCSAqICAgICAgICAgICAgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlcyBnZW5lcmF0ZWQuCisJICogCisJICovCisJLy8gcHVibGljIE5hbWVHZW5lcmF0b3IoU3RyaW5nIGlzbzMxNjZfMSwgU3RyaW5nIGlzbzMxNjZfMiwgU3RyaW5nIGZpeEZpbGUsCisJLy8gU3RyaW5nIHRhcmdldEZpbGUsIFN0cmluZyBsZXhEaXIsIFN0cmluZyBvdXRwdXREaXIpIHsKKwkvLyAvLyBTZXQgdmFsdWVzIG9mIGdsb2JhbCB2YXJpYWJsZXMuCisJLy8gdGhpcy5pc28zMTY2XzEgPSBpc28zMTY2XzE7CisJLy8gdGhpcy5pc28zMTY2XzIgPSBpc28zMTY2XzI7CisJLy8gdGhpcy5maXhGaWxlID0gZml4RmlsZTsKKwkvLyB0aGlzLnRhcmdldEZpbGUgPSB0YXJnZXRGaWxlOworCS8vIHRoaXMubGV4RGlyID0gbGV4RGlyOworCS8vIHRoaXMub3V0cHV0RGlyID0gb3V0cHV0RGlyOworCS8vIHRhcmdldExpc3QgPSBudWxsOworCS8vIC8vIFNldCB0aGUgVVJMIElEcyB0aGF0IGFyZSByZWxldmFudCBmb3IgYXJlYSBkYXRhLgorCS8vIGluaXROYW1lVVJMU2V0KCk7CisJLy8gLy8gU2V0IHdoaWNoIFVSTHMgYXJlIGFjdGl2ZSBhbmQgd2hpY2ggb25lcyBzaG91bGQgYmUgY29tbWVudGVkIG91dC4KKwkvLyAvLyBzZXRVUkxTdGF0dXMoKTsKKwkvLyB9CisJLyoqCisJICogQHBhcmFtIGNvbmZpZ0ZpbGUKKwkgKi8KKwlwdWJsaWMgTmFtZUdlbmVyYXRvcihTdHJpbmcgY29uZmlnRmlsZSkgeworCisJCS8vIExvYWQgYWxsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCisJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHZhcnMgPSBHZW5VdGlscy5sb2FkQ29uZmlnRmlsZShjb25maWdGaWxlKTsKKworCQlTZXQ8U3RyaW5nPiBrZXlzID0gdmFycy5rZXlTZXQoKTsKKwkJSXRlcmF0b3IgaXQgPSBrZXlzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyB2YXIgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisKKwkJCS8vIEFzc2lnbiB2YWx1ZXMgdG8gY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgOgorCQkJaWYgKHZhci5lcXVhbHMoIldPUktTUEFDRSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl3b3Jrc3BhY2UgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJJU08zMTY2XzEiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJaXNvMzE2Nl8xID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiSVNPMzE2Nl8yIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWlzbzMxNjZfMiA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIklTT19GSVgiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJZml4RmlsZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIlRBUkdFVF9MSVNUIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXRhcmdldEZpbGUgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJMRVhfRElSIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWxleERpciA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIlBST1BFUlRJRVNfT1VUUFVUIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCW91dHB1dERpciA9IHZhcnMuZ2V0KHZhcik7CisJCQl9CisKKwkJfSAvLyB3aGlsZQorCisJCS8vIFRoZSB3b3Jrc3BhY2UgdmFyaWFibGUgc2hvdWxkIGVuZCB3aXRoIGEgc2xhc2ggY2hhcmFjdGVyCisJCWlmICh3b3Jrc3BhY2UuZW5kc1dpdGgoIlxcIikgPT0gZmFsc2UpIHsgLy8kTk9OLU5MUy0xJAorCQkJd29ya3NwYWNlICs9ICJcXCI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCVN0cmluZyBwYXRoID0gd29ya3NwYWNlICsgR2VuQ29uc3RhbnRzLlBBUkFNU19ESVI7CisKKwkJLy8gU2V0IHJlbWFpbmluZyBjb25maWcgdmFycyB1c2luZyBXT1JLU1BBQ0UgKHdvcmtzcGFjZSByZWxhdGl2ZSkKKwkJaWYgKGlzbzMxNjZfMSA9PSBudWxsKSB7CisJCQlpc28zMTY2XzEgPSBwYXRoICsgR2VuQ29uc3RhbnRzLklTTzMxNjZfMV9GSUxFOworCQl9CisJCWlmIChpc28zMTY2XzIgPT0gbnVsbCkgeworCQkJaXNvMzE2Nl8yID0gcGF0aCArIEdlbkNvbnN0YW50cy5JU08zMTY2XzJfRklMRTsKKwkJfQorCQlpZiAoZml4RmlsZSA9PSBudWxsKSB7CisJCQlmaXhGaWxlID0gcGF0aCArIEdlbkNvbnN0YW50cy5JU09GSVhfRklMRTsKKwkJfQorCQlpZiAodGFyZ2V0RmlsZSA9PSBudWxsKSB7CisJCQl0YXJnZXRGaWxlID0gcGF0aCArIEdlbkNvbnN0YW50cy5DT1VOVFJJRVNfTElTVDsKKwkJfQorCQlpZiAobGV4RGlyID09IG51bGwpIHsKKwkJCWxleERpciA9IHBhdGggKyBHZW5Db25zdGFudHMuTEVYX0RJUjsKKwkJfQorCQlpZiAob3V0cHV0RGlyID09IG51bGwpIHsKKwkJCW91dHB1dERpciA9IHdvcmtzcGFjZSArIEdlbkNvbnN0YW50cy5QUk9QRVJUSUVTX09VVFBVVF9ESVI7CisJCX0KKworCQl0YXJnZXRMaXN0ID0gbnVsbDsKKwkJLy8gU2V0IHRoZSBVUkwgSURzIHRoYXQgYXJlIHJlbGV2YW50IGZvciBhcmVhIGRhdGEuCisJCWluaXROYW1lVVJMU2V0KCk7CisJCS8vIFNldCB3aGljaCBVUkxzIGFyZSBhY3RpdmUgYW5kIHdoaWNoIG9uZXMgc2hvdWxkIGJlIGNvbW1lbnRlZCBvdXQuCisJCS8vIHNldFVSTFN0YXR1cygpOworCisJfQorCisJLyoqCisJICogU2V0cyB0aGUgVVJMIElEcyByZWxldmFudCBmb3IgYXJlYSBkYXRhLiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIFVSTHMKKwkgKiB3aXRoIElEID0gRElWQS4gVGhpcyBjYW4gYmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgZGF0YS4gRm9yCisJICogZXhhbXBsZSwgZm9yIHBvcHVsYXRpb24gZGF0YSwgd2UgYXJlIGludGVyZXN0ZWQgIElEID0gQ0lBCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdE5hbWVVUkxTZXQoKSB7CisJCXVybFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwkJdXJsU2V0LmFkZChuZXcgU3RyaW5nKCJJU08zMTY2XzEiKSk7IC8vJE5PTi1OTFMtMSQKKwkJdXJsU2V0LmFkZChuZXcgU3RyaW5nKCJVU0NFTlNVU1BPUCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFNldCB3aGljaCBVUkwgYXBwZWFycyBhcyB1bmNvbW1lbnRlZCBvciBBQ1RJVkUgYW5kIHdoaWNoIG9uZXMgYXBwZWFyIGFzCisJICogY29tbWVudGVkIG91dCBvciBTRUNPTkRBUlkuIE9ubHkgVVJMIHNob3VsZCBiZSBhY3RpdmUuIEFsbCBvdGhlcnMgc2hvdWxkCisJICogYXBwZWFyIGNvbW1lbnRlZC4KKwkgKiAKKwkgKi8KKwkvLyBwcm90ZWN0ZWQgdm9pZCBzZXRVUkxTdGF0dXMoKSB7CisJLy8gdXJsU3RhdHVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPigpOworCS8vIC8vIFRoaXMgd2lsbCBiZSB0aGUgYWN0aXZlIFVSTC4KKwkvLyB1cmxTdGF0dXMucHV0KCJJU08zMTY2XzEiLCBuZXcgQm9vbGVhbih0cnVlKSk7CisJLy8gLy8gQWxsIG90aGVyIFVSTHMgYXBwZWFyIGFzIGNvbW1lbnRlZCBvdXQsIHNlY29uZGFyeS4KKwkvLyB1cmxTdGF0dXMucHV0KCJDSUEiLCBuZXcgQm9vbGVhbihmYWxzZSkpOworCS8vIHVybFN0YXR1cy5wdXQoIlVTQ0VOU1VTUE9QIiwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKKwkvLwkJCisJLy8gfQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNldHMgdXAgYW5kIHJ1bnMgdGhpcyBnZW5lcmF0b3IuCisJICogCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIGNvdW50cmllcyB3ZSB3YW50LgorCQl0YXJnZXRMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KHRhcmdldEZpbGUpOworCisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgSVNPMzE2Ni0xIEFMUEhBMiwgQUxQSEEzLCBhbmQKKwkJLy8gbnVtZXJpYyBjb2Rlcy4KKwkJY29kZUxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QoaXNvMzE2Nl8xKTsKKworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIG1pc3NpbmcgSVNPMzE2Ni0yIGNvZGVzCisJCWNvZGVmaXhMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KGZpeEZpbGUpOworCisJCS8vIE5vdywgcHJvY2VzcyBlYWNoIGl0ZW0gaW4gdGhlIHRhcmdldCBsaXN0LgorCQlwcm9jZXNzKCk7CisKKwl9CisKKwkvKioKKwkgKiBQcm9jZXNzIG91ciBnbG9iYWwgbGlzdCBvZiB0YXJnZXQgY291bnRyaWVzLiBGb3IgZWFjaCBjb3VudHJ5IGluIGxpc3QsCisJICogZ2VuZXJhdGUgaXRzIG5hbWUucHJvcGVydGllcyBmaWxlLgorCSAqIAorCSAqLworCXByb3RlY3RlZCB2b2lkIHByb2Nlc3MoKSB7CisKKwkJZmluYWwgaW50IExFVkVMXzEgPSAxOworCQlmaW5hbCBpbnQgTEVWRUxfMiA9IDI7CisKKwkJLy8gQSB3cml0ZXIgZm9yIHRoZSBuZXcgZmlsZSB3ZSBhcmUgY3JlYXRpbmcuCisJCVByaW50V3JpdGVyIHByb3BlcnRpZXNGaWxlID0gbnVsbDsKKworCQkvLyBPYmplY3QgaG9sZGluZyBJU08zMTY2LTEgcmVsYXRlZCBkYXRhLgorCQlJU09Db2RlMSBpc29Db2RlID0gbnVsbDsKKworCQkvLyBOYW1lIG9mIHRoZSBuZXcgcHJvcGVydGllcyBmaWxlLgorCQlTdHJpbmcgZmlsZU5hbWUgPSBudWxsOworCisJCS8vIEEgbGlzdCBmb3IgSVNPIDMxNjYtMiBvYmplY3RzCisJCUxpc3Q8SVNPQ29kZTI+IGlzbzJMaXN0ID0gbmV3IEFycmF5TGlzdDxJU09Db2RlMj4oKTsKKworCQkvLyBGaWxlbmFtZXMgZm9yIGxleDEgYW5kIGxleDIgZmlsZXMgZm9yIGEgZ2l2ZW4gY291bnRyeS4KKwkJU3RyaW5nIGxleEFkbWluMUZpbGUgPSBudWxsOworCQlTdHJpbmcgbGV4QWRtaW4yRmlsZSA9IG51bGw7CisKKwkJLy8gTGlzdHMgaG9sZGluZyB0aGUgbGV4MSBhbmQgbGV4MiB2YWx1ZXMuCisJCS8vIE5PVEU6IGxleCB2YWx1ZXMgYXJlIHRoZSBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgdmFsdWVzIGZvcgorCQkvLyBhZG1pbmlzdHJhdGlvbiBsZXZlbHMuCisJCUxpc3Q8U3RyaW5nPiBsZXgxRGF0YVNldCA9IG51bGw7CisJCUxpc3Q8U3RyaW5nPiBsZXgyRGF0YVNldCA9IG51bGw7CisKKwkJLy8gTGlzdHMgZm9yIGhvbGRpbmcgbGV4MSBhbmQgbGV4MiBvYmplY3RzIGZvciBhIGdpdmVuIGNvdW50cnkuCisJCUxpc3Q8TGV4MU9iaj4gbGV4MUxpc3QgPSBudWxsOworCQlMaXN0PExleDJPYmo+IGxleDJMaXN0ID0gbnVsbDsKKworCQlpbnQgc2l6ZSA9IHRhcmdldExpc3Quc2l6ZSgpOworCisJCS8vIEl0ZXJhdGUgZm9yIGV2ZXJ5IGNvdW50cnkgYW5kIGNyZWF0ZSBpdHMgbmFtZXMucHJvcGVydGllcyBmaWxlLgorCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCisJCQkvLyBHZXQgdGhlIG5leHQgY291bnRyeSBpbiB0aGUgbGlzdC4KKwkJCVN0cmluZyBmaWxlID0gdGFyZ2V0TGlzdC5nZXQoaSkudHJpbSgpOworCisJCQkvLyBBbiBpbmRleCBmb3IgdW5rbndvbiBvciBuLmEuIGVudHJpZXMKKwkJCWludCB1bmtDb3VudGVyID0gMTsKKworCQkJLy8gT3BlbiB0aGUgZGF0YSBzb3VyY2UgZmlsZSBmb3IgdGhpcyBjb3VudHJ5LgorCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gR2VuVXRpbHMub3BlblJlYWRlcihmaWxlKTsKKwkJCVN5c3RlbS5vdXQKKwkJCQkJLnByaW50bG4oIlx0XHQ8PDw8IE5BTUUgR0VORVJBVE9SIC0tIFByb2Nlc3NpbmcgY291bnRyeSA6ICIgKyBmaWxlICsgIiA+Pj4+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJdHJ5IHsKKworCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgeworCisJCQkJCVN0cmluZyBidWZmZXIgPSBudWxsOworCQkJCQkvLyBEZXNjcmliZXMgbGV2ZWwKKwkJCQkJLy8gb2YgZGF0YSB3ZQorCQkJCQkvLyBhcmUgbm93IHByb2Nlc3NpbmcgOiBMRVZFTDAsIExFVkVMMSwgb3IgTEVWRUwyLgorCQkJCQlpbnQgbGV2ZWwgPSAtMTsKKwkJCQkJLy8gUmVjb3JkIHRoZSBwcmV2aW91cyBsZXZlbC4KKwkJCQkJaW50IG9sZGxldmVsID0gbGV2ZWwgLSAxOworCQkJCQkvLyBXZSB0YWtlIGEgY2h1bmsgb2YgdGhlIGRhdGEgW0JVRkZFUl9NSU4sQlVGRkVSX01BWF0gdG8KKwkJCQkJLy8gbWFrZSBwcm9jZXNzaW5nIG1vcmUKKwkJCQkJLy8gZWZmaWNpZW50LCB3ZSBkb250IG5lZWQgYWxsIG9mIGl0LgorCQkJCQlpbnQgQlVGRkVSX01JTiA9IDA7CisJCQkJCWludCBCVUZGRVJfTUFYID0gMTIwOworCQkJCQkvLyBTdHJpbmcgdXNlZCB0byBpZ25vcmUgcmVwZWF0ZWQgZW50cmllcy4KKwkJCQkJTGlzdDxTdHJpbmc+IGVudHJ5TGlzdCA9IG51bGw7CisKKwkJCQkJd2hpbGUgKEdlblV0aWxzLkVPRihidWZmZXIgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gdHJ1ZSkgeworCisJCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBtYXJrIGFsbCB1bmtub3duIGRhdGEuCisJCQkJCQlidWZmZXIgPSBidWZmZXIucmVwbGFjZSgiLCwiLCAiLFVOS05PV04sIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQkJCQlTdHJpbmdbXSBpdGVtcyA9IEdlblV0aWxzCisJCQkJCQkJCS5leHRyYWN0KGJ1ZmZlci5sZW5ndGgoKSA8IEJVRkZFUl9NQVggPyBidWZmZXIKKwkJCQkJCQkJCQk6IGJ1ZmZlci5zdWJzdHJpbmcoQlVGRkVSX01JTiwKKwkJCQkJCQkJCQkJCUJVRkZFUl9NQVgpKTsKKworCQkJCQkJLy8gR2V0IHRoZSBJU08zMTY2LTEgaW5mbyBmb3IgdGhpcyBjb3VudHJ5CisJCQkJCQlpZiAoaXNvQ29kZSA9PSBudWxsKSB7CisJCQkJCQkJaXNvQ29kZSA9IEdlblV0aWxzLmdldElTT0NvZGUoCisJCQkJCQkJCQlpdGVtc1tJU09EYXRhLkNPVU5UUllfTkFNRV0sIGNvZGVMaXN0KTsKKwkJCQkJCX0KKworCQkJCQkJLy8gR2V0IHRoZSBsZXZlbCBvZiB0aGUgZGF0YSB3ZSBhcmUgcHJvY2Vzc2luZy4KKwkJCQkJCWxldmVsID0gR2VuVXRpbHMuZ2V0RGF0YUxldmVsKGl0ZW1zKTsKKworCQkJCQkJaWYgKGxldmVsICE9IDAgJiYgaXNvMkxpc3QgIT0gbnVsbCkgeworCQkJCQkJCS8vIExvYWQgdGhlIElTTyAzMTY2LTIgb2JqZWN0cyBmb3IgdGhpcyBjb3VudHJ5CisJCQkJCQkJaXNvMkxpc3QgPSBHZW5VdGlscy5sb2FkSVNPMihpc28zMTY2XzIpOworCQkJCQkJfQorCisJCQkJCQkvLyBJZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IGZvciB0aGlzIGNvdW50cnksCisJCQkJCQkvLyBjcmVhdGUgaXQgdXNpbmcgSVNPIGFscGhhMyBjb2RlLgorCQkJCQkJRmlsZSBjb3VudHJ5RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyCisJCQkJCQkJCSsgaXNvQ29kZS5nZXRBbHBoYTMoKSk7CisKKwkJCQkJCWlmIChjb3VudHJ5RGlyICE9IG51bGwgJiYgY291bnRyeURpci5leGlzdHMoKSA9PSBmYWxzZSkgeworCQkJCQkJCS8vIERpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gQ3JlYXRlIGl0LgorCQkJCQkJCWNvdW50cnlEaXIubWtkaXIoKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gQ3JlYXRlIGFuZCBvcGVuIHRoZSBuZXcgZmlsZS4KKwkJCQkJCWlmIChwcm9wZXJ0aWVzRmlsZSA9PSBudWxsKSB7CisJCQkJCQkJLy8gQ3JlYXRlIHRoZSBmaWxlIG5hbWUgZm9yIHRoZSBuZXcgcHJvcGVydGllcy5maWxlLgorCQkJCQkJCWZpbGVOYW1lID0gY291bnRyeURpciArICJcXCIgKyBpc29Db2RlLmdldEFscGhhMygpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCSsgIl9uYW1lcy5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCS8vIENyZWF0ZSB0bmUgbmV3IHByb3BlcnRpZXMuZmlsZSBmb3IgdGhpcyBjb3VudHJ5LgorCQkJCQkJCXByb3BlcnRpZXNGaWxlID0gR2VuVXRpbHMub3BlbldyaXRlcihmaWxlTmFtZSk7CisJCQkJCQl9CisKKwkJCQkJCS8vIFRoaXMgdmFyaWFibGUgaW5kaWNhdGVzIGEgdHJhbnNpdGlvbiBpbiBvdXIgZGF0YQorCQkJCQkJLy8gcHJvY2Vzc2luZworCQkJCQkJYm9vbGVhbiB0cmFuc2l0aW9uID0gKGxldmVsICE9IG9sZGxldmVsKSA/IHRydWUgOiBmYWxzZTsKKworCQkJCQkJLy8gVmFyaWFibGUgdXNlZCB0byBob2xkIHRoZSBmb3JtYXR0ZWQgb3V0cHV0IGRhdGEuCisJCQkJCQlTdHJpbmcgZGF0YSA9IG51bGw7CisKKwkJCQkJCS8vIFRoZSBjdXJyZW50IGVudGl0eSB3ZSBhcmUgZGVhbGluZyB3aXRoLgorCQkJCQkJLy8gQmFzZWQgb24gaXRzIGFkbWluIGxldmVsIGl0IGNhbiBiZSBhIGNvdW50cnksIGEKKwkJCQkJCS8vIGNvdW50eSwgZXRjOworCQkJCQkJU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisJCQkJCQkvLyBXZSBoYXZlIHN3aXRjaGVkIHRvIGEgZGlmZmVyZW50IGRhdGEgbGV2ZWwgKGksZSwKKwkJCQkJCS8vIGFkbWluIDAgdG8gYWRtaW4gMSkKKwkJCQkJCWlmICh0cmFuc2l0aW9uID09IHRydWUpIHsKKwkJCQkJCQkvLyBLZWVwIHRyYWNrIG9mIHByZXZpb3VzIGxldmVsIGluIG9yZGVyIHRvIGRldGVjdAorCQkJCQkJCS8vIHRyYW5zaXRpb25zLgorCQkJCQkJCW9sZGxldmVsID0gbGV2ZWw7CisJCQkJCQkJLy8gUmVzZXQgb3VyIHJlcGVhdGVkIGhpc3RvcnkKKwkJCQkJCQlpZiAoZW50cnlMaXN0ICE9IG51bGwpIHsKKwkJCQkJCQkJZW50cnlMaXN0LmNsZWFyKCk7CisJCQkJCQkJfQorCQkJCQkJCWVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisJCQkJCQkJLy8gUmVzZXQgY291bnRlciBvZiBVTktOT1dOIGFuZCBOLkEuIGVudHJpZXMuCisJCQkJCQkJdW5rQ291bnRlciA9IDE7CisKKwkJCQkJCQlpZiAobGV2ZWwgPT0gMCkgeworCQkJCQkJCQkvLyBBZGQgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGtleSBmb3JtYXQgaW4gb3VyCisJCQkJCQkJCS8vIGRhdGEgZmlsZXMuCisJCQkJCQkJCWRhdGEgPSBHZW5VdGlscy5nZXRLZXlGb3JtYXRFeHBsYW5hdGlvbigpOworCQkJCQkJCQkvLyBBZGQgdGhlIGhlYWRlci4KKwkJCQkJCQkJZGF0YSArPSBnZXRIZWFkZXIoaXNvQ29kZSwgbGV2ZWwpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8vIEFkZCB0aGUgaGVhZGVyCisJCQkJCQkJCWRhdGEgPSBnZXRIZWFkZXIoaXNvQ29kZSwgbGV2ZWwpOworCQkJCQkJCX0KKworCQkJCQkJCUdlblV0aWxzLmFkZERhdGEocHJvcGVydGllc0ZpbGUsIGRhdGEpOworCQkJCQkJCWRhdGEgPSBudWxsOworCQkJCQkJfQorCisJCQkJCQlzd2l0Y2ggKGxldmVsKSB7CisKKwkJCQkJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzA6CisKKwkJCQkJCQkvLyBIYW5kbGUgbGV2ZWwgMCBkYXRhIGRpZmZlcmVudCB0aGFuIHRoZSBvdGhlcgorCQkJCQkJCS8vIGFkbWluIGxldmVscy4KKwkJCQkJCQlpZiAodHJhbnNpdGlvbiA9PSB0cnVlKSB7CisJCQkJCQkJCWRhdGEgPSBpdGVtc1tJU09EYXRhLkFMUEhBM19DT0RFXSArICIgPSAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGl0ZW1zW0lTT0RhdGEuQ09VTlRSWV9OQU1FXSArICJcbiI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShwcm9wZXJ0aWVzRmlsZSwgZGF0YSk7CisJCQkJCQkJfQorCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCQljYXNlIERhdGFUeXBlcy5MRVZFTF8xOgorCQkJCQkJCWN1cnJlbnQgPSBpdGVtc1tJU09EYXRhLkFETUlOMV9OQU1FXS50b1VwcGVyQ2FzZSgpOworCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlIERhdGFUeXBlcy5MRVZFTF8yOgorCQkJCQkJCWN1cnJlbnQgPSBpdGVtc1tJU09EYXRhLkFETUlOMl9OQU1FXS50b1VwcGVyQ2FzZSgpOworCQkJCQkJCWJyZWFrOworCisJCQkJCQl9IC8vIFN3aXRjaAorCisJCQkJCQkvLyBIYW5kbGUgVU5LTk9XTiBhbmQgTi5BLiBlbnRyaWVzIGRpZmZlcmVudGx5LgorCQkJCQkJaWYgKGN1cnJlbnQuZXF1YWxzKCJVTktOT1dOIikgfHwgY3VycmVudC5lcXVhbHMoIk4uQS4iKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCQkJCWlmIChsZXZlbCA9PSAxKSB7CisJCQkJCQkJCWN1cnJlbnQgPSBpc29Db2RlLmdldEFscGhhMigpICsgIi1VTkstIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBTdHJpbmcudmFsdWVPZih1bmtDb3VudGVyKyspOworCisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLy8gTGV2ZWwgMiBkYXRhLgorCQkJCQkJCQljdXJyZW50ID0gaXNvQ29kZS5nZXRBbHBoYTMoKSArICIuTDIuIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBTdHJpbmcudmFsdWVPZih1bmtDb3VudGVyKyspOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJLy8gVmVyaWZ5IGZvciByZXBlYXRlZCBlbnRyaWVzIC0tIGF2dm9pZCBkdXBsY2F0ZXMKKwkJCQkJCXN3aXRjaCAobGV2ZWwpIHsKKworCQkJCQkJY2FzZSBMRVZFTF8xOgorCQkJCQkJCWlmIChHZW5VdGlscy5pc1JlcGVhdGVkKGN1cnJlbnQsIGVudHJ5TGlzdCkgPT0gdHJ1ZSkgeworCQkJCQkJCQkvLyBEdXBsaWNhdGVkLCBpZ25vcmUuCisJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCX0KKwkJCQkJCQkvLyBSZW1lbWJlciB0aGlzIGVudGl0eSB0byBhdm9pZCBkdXBsaWNhdGVzLgorCQkJCQkJCWVudHJ5TGlzdC5hZGQoY3VycmVudCk7CisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgTEVWRUxfMjoKKwkJCQkJCQlpZiAoR2VuVXRpbHMuaXNSZXBlYXRlZChpdGVtc1tJU09EYXRhLkFETUlOMV9OQU1FXQorCQkJCQkJCQkJKyBjdXJyZW50LCBlbnRyeUxpc3QpID09IHRydWUpIHsKKwkJCQkJCQkJLy8gRHVwbGljYXRlZCwgaWdub3JlLgorCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQl9CisJCQkJCQkJLy8gUmVtZW1iZXIgdGhpcyBlbnRpdHkgdG8gYXZvaWQgZHVwbGljYXRlcy4KKwkJCQkJCQllbnRyeUxpc3QuYWRkKGl0ZW1zW0lTT0RhdGEuQURNSU4xX05BTUVdICsgY3VycmVudCk7CisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCX0KKworCQkJCQkJU3RyaW5nIGRlc2NyaXB0b3IgPSBudWxsOworCisJCQkJCQkvLyBXZSBnZXQgdGhlIGRlc2NyaXB0b3IgZm9yIGFkbWluaXN0cmF0aW9uIGVudGl0aWVzCisJCQkJCQkvLyBkaWZmZXJlbnRseSBiYXNlZCBvbiBpdHMgbGV2ZWwuCisKKwkJCQkJCWlmIChsZXZlbCA9PSAyKSB7CisKKwkJCQkJCQlpZiAobGV4MURhdGFTZXQgPT0gbnVsbCAmJiBsZXgyRGF0YVNldCA9PSBudWxsKSB7CisKKwkJCQkJCQkJLy8gQ29tcG9zZSB0aGUgZmlsZSBuYW1lcyBmb3IgdGhlIGxleCBmaWxlcyBmb3IKKwkJCQkJCQkJLy8gdGhpcworCQkJCQkJCQkvLyBjb3VudHJ5LgorCQkJCQkJCQlsZXhBZG1pbjFGaWxlID0gbGV4RGlyICsgaXNvQ29kZS5nZXRBbHBoYTMoKQorCQkJCQkJCQkJCSsgIlxcIiArIGlzb0NvZGUuZ2V0QWxwaGEzKCk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJbGV4QWRtaW4yRmlsZSA9IGxleEFkbWluMUZpbGU7CisJCQkJCQkJCWxleEFkbWluMUZpbGUgKz0gIl9BRE1JTjFfTEVYLnR4dCI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJbGV4QWRtaW4yRmlsZSArPSAiX0FETUlOMl9MRVgudHh0IjsgLy8kTk9OLU5MUy0xJAorCisJCQkJCQkJCS8vIExvYWQgdGhlIGxleDEgYW5kIGxleDIgZmlsZXMgZm9yIHRoaXMKKwkJCQkJCQkJLy8gY291bnRyeS4KKwkJCQkJCQkJbGV4MURhdGFTZXQgPSBHZW5VdGlscworCQkJCQkJCQkJCS5wb3B1bGF0ZUxpc3QobGV4QWRtaW4xRmlsZSk7CisJCQkJCQkJCWxleDJEYXRhU2V0ID0gR2VuVXRpbHMKKwkJCQkJCQkJCQkucG9wdWxhdGVMaXN0KGxleEFkbWluMkZpbGUpOworCisJCQkJCQkJCS8vIENyZWF0ZSBhIG1ldGhvZCB0byBzZWFyY2ggZm9yIGFuIGl0ZW0gb24gYQorCQkJCQkJCQkvLyBsaXN0IG9mIGxleCBkYXRhIG9iamVjdHMuCisJCQkJCQkJCWxleDFMaXN0ID0gR2VuVXRpbHMuY3JlYXRlTGV4MUxpc3QobGV4MURhdGFTZXQpOworCQkJCQkJCQlsZXgyTGlzdCA9IEdlblV0aWxzLmNyZWF0ZUxleDJMaXN0KGxleDJEYXRhU2V0KTsKKworCQkJCQkJCX0KKworCQkJCQkJCS8vIENvbXBvc2UgdGhlIGxldmVsMiBkZXNjcmlwdG9yIHVzaW5nIHRoZSBsZXggZGF0YToKKworCQkJCQkJCS8vIFNURVAgMTogRG8gYSBsb29rIHVwIGluIHRoZSBsZXggMiBsaXN0cy4KKworCQkJCQkJCS8vIEdldCB0aGUgbGV4IDIgb2JqZWN0IGZvciB0aGUgY3VycmVudCBlbnRyeS4KKwkJCQkJCQlMZXgyT2JqIGxleDJDdXJyZW50ID0gR2VuVXRpbHMubGV4Mkxvb2t1cChsZXgyTGlzdCwKKwkJCQkJCQkJCWl0ZW1zW0lTT0RhdGEuQURNSU4xX05BTUVdLCBjdXJyZW50KTsKKworCQkJCQkJCS8vIEdldCB0aGUgbGV4IDEgb2JqZWN0IHRvIHdoaWNoIGxleDJDdXJyZW50IGJlbG9uZ3MKKwkJCQkJCQkvLyB0by4KKwkJCQkJCQlMZXgxT2JqIGxleDFDdXJyZW50ID0gR2VuVXRpbHMubGV4MUxvb2t1cChsZXgxTGlzdCwKKwkJCQkJCQkJCWxleDJDdXJyZW50LmdldEFkbWluMSgpKTsKKworCQkJCQkJCS8vIFNURVAgMjogcGllY2UgdG9nZXRoZXIgdGhlIElEIHVzaW5nIHRoZQorCQkJCQkJCS8vIHByb3BlciBsZXggb2JqZWN0cyA6IHRoZSBVU0EgaXMgYSBzcGVjaWFsCisJCQkJCQkJLy8gY2FzZQorCQkJCQkJCWlmIChsZXgxQ3VycmVudC5nZXREZXNjcmlwdG9yKCkuY29udGFpbnMoIlVTLSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJZGVzY3JpcHRvciA9IGxleDFDdXJyZW50LmdldERlc2NyaXB0b3IoKQorCQkJCQkJCQkJCSsgIi0iIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGxleDFDdXJyZW50LmdldEZvcm1hdHRlZEluZGV4KCkKKwkJCQkJCQkJCQkrIGxleDJDdXJyZW50LmdldEZvcm1hdHRlZEluZGV4VVNBKCk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJZGVzY3JpcHRvciA9IGxleDFDdXJyZW50LmdldERlc2NyaXB0b3IoKSArICItIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyAiRyIgKyBsZXgxQ3VycmVudC5nZXRGb3JtYXR0ZWRJbmRleCgpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGxleDJDdXJyZW50LmdldEZvcm1hdHRlZEluZGV4KCk7CisKKwkJCQkJCQkJLy8gQWRkIHNvbWUgY29tbWVucyB0byBhbGxvdyByZXZlcnNlIGVuZ2luZWVyaW5nCisJCQkJCQkJCS8vIG9yCisJCQkJCQkJCS8vIGJhY2t0cmFja2luZyB0aGUgb3JpZ2luIG9mIHRoaXMgZ2VuZXJhdGVkIGtleQorCQkJCQkJCQkvLyBhcworCQkJCQkJCQkvLyBtdWNoIGFzIHBvc3NpYmxlLgorCQkJCQkJCQlkYXRhID0gIiMgR2VuZXJhdGVkIGtleSBkZXRhaWxzIDogIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyAiIExldmVsIDEgKCAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGxleDFDdXJyZW50LmdldERlc2NyaXB0b3IoKQorCQkJCQkJCQkJCSsgIiA9ICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgbGV4MUN1cnJlbnQuZ2V0QWRtaW4xKCkKKwkJCQkJCQkJCQkrICIgKS4gIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyAiTGV2ZWwgMiAoICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgbGV4MUN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXgoKQorCQkJCQkJCQkJCSsgbGV4MkN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXgoKQorCQkJCQkJCQkJCSsgIiA9ICIgKyBsZXgyQ3VycmVudC5nZXRBZG1pbjIoKSAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyAiICkuIFxuIjsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCX0KKworCQkJCQkJCWlmIChjdXJyZW50LmNvbnRhaW5zKCIuTDIuIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQljdXJyZW50ID0gZGVzY3JpcHRvcjsKKwkJCQkJCQl9CisKKwkJCQkJCX0gZWxzZSB7IC8vIENvbXBvc2UgZGVzY3JpcHRvciBmb3IgbGV2ZWwgMSBhbmQgbGV2ZWwKKwkJCQkJCQkvLyAwIGRhdGEuCisJCQkJCQkJLy8gR2V0IHRoZSBkZXNjcmlwdG9yIGZvciB0aGlzIGVudGl0eS4KKwkJCQkJCQlkZXNjcmlwdG9yID0gR2VuVXRpbHMuZ2V0SVNPMkRlc2NyaXB0b3IoaXNvMkxpc3QsCisJCQkJCQkJCQljdXJyZW50LCBpc29Db2RlLmdldEFscGhhMigpKTsKKworCQkJCQkJCS8vIElmIHdlIGNhbnQgZmluZCB0aGUgZGVzY3JpcHRvciwgdGhlbiBsb29rIGluIHRoZQorCQkJCQkJCS8vIGZpeCBsaXN0LgorCQkJCQkJCWlmIChkZXNjcmlwdG9yLmVxdWFscyhjdXJyZW50KSA9PSB0cnVlKSB7CisJCQkJCQkJCS8vIExvb2sgZm9yIGEgZGVzY3JpcHRvciBpbiB0aGUgZml4IGZpbGUKKwkJCQkJCQkJZGVzY3JpcHRvciA9IEdlblV0aWxzLmdldEZpeENvZGUoY29kZWZpeExpc3QsCisJCQkJCQkJCQkJY3VycmVudCwgaXRlbXNbSVNPRGF0YS5DT1VOVFJZX05BTUVdKTsKKworCQkJCQkJCQkvLyBJZiB0aGVyZSBpcyBubyBkZXNjcmlwdG9yIHN0aWxsLCBnZW5lcmF0ZQorCQkJCQkJCQkvLyBvbmUhCisJCQkJCQkJCWlmIChkZXNjcmlwdG9yLmVxdWFscyhjdXJyZW50KSA9PSB0cnVlKSB7CisJCQkJCQkJCQlkZXNjcmlwdG9yID0gaXNvQ29kZS5nZXRBbHBoYTIoKSArICItIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJCSsgY3VycmVudDsKKwkJCQkJCQkJfQorCisJCQkJCQkJfQorCisJCQkJCQkJLy8gSGFuZGxlIHRoZSBVU0EgYXMgYSBzcGVjaWFsIGNhc2UKKwkJCQkJCQlpZiAoZGVzY3JpcHRvci5jb250YWlucygiVVMtIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlkYXRhID0gIiMiICsgY3VycmVudCArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCX0KKworCQkJCQkJfQorCisJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRlc2NyaXB0b3IgaXMgOiAiICsgZGVzY3JpcHRvcgorCQkJCQkJLy8gKyAiIGF0IGxldmVsIDogIiArIGxldmVsICsgIiBmb3IgIiArIGN1cnJlbnQpOworCisJCQkJCQlpZiAoZGF0YSAhPSBudWxsKSB7CisJCQkJCQkJZGF0YSArPSBkZXNjcmlwdG9yICsgIiA9ICIgKyBjdXJyZW50ICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWRhdGEgPSBkZXNjcmlwdG9yICsgIiA9ICIgKyBjdXJyZW50ICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQl9CisKKwkJCQkJCUdlblV0aWxzLmFkZERhdGEocHJvcGVydGllc0ZpbGUsIGRhdGEpOworCQkJCQkJZGF0YSA9IG51bGw7CisKKwkJCQkJfS8vIHdoaWxlCisKKwkJCQkJLy8gUmVzZXQgYWxsIGxleC1yZWxhdGVkIGl0ZW1zCisJCQkJCWlmIChsZXgxRGF0YVNldCAhPSBudWxsKSB7CisJCQkJCQlsZXgxRGF0YVNldC5jbGVhcigpOworCQkJCQkJbGV4MURhdGFTZXQgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgyRGF0YVNldCAhPSBudWxsKSB7CisJCQkJCQlsZXgyRGF0YVNldC5jbGVhcigpOworCQkJCQkJbGV4MkRhdGFTZXQgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgxTGlzdCAhPSBudWxsKSB7CisJCQkJCQlsZXgxTGlzdC5jbGVhcigpOworCQkJCQkJbGV4MUxpc3QgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgyTGlzdCAhPSBudWxsKSB7CisJCQkJCQlsZXgyTGlzdC5jbGVhcigpOworCQkJCQkJbGV4Mkxpc3QgPSBudWxsOworCQkJCQl9CisKKwkJCQkJbGV4QWRtaW4xRmlsZSA9IG51bGw7CisJCQkJCWxleEFkbWluMkZpbGUgPSBudWxsOworCisJCQkJCS8vIFdlIGRvbnQgbmVlZCB0aGUgSVNPIGNvZGUgb2JqZWN0IGZvciB0aGlzIGNvdW50cnkKKwkJCQkJLy8gYW55bW9yZSwgd2UgYXJlIGRvbmUgcHJvY2Vzc2luZyBpdC4KKwkJCQkJaXNvQ29kZSA9IG51bGw7CisKKwkJCQkJLy8gQ2xvc2UgYWxsIG9wZW4gcmVzb3VyY2VzLgorCQkJCQlyZWFkZXIuY2xvc2UoKTsKKworCQkJCQlpZiAocHJvcGVydGllc0ZpbGUgIT0gbnVsbCkgeworCQkJCQkJcHJvcGVydGllc0ZpbGUuY2xvc2UoKTsKKwkJCQkJCXByb3BlcnRpZXNGaWxlID0gbnVsbDsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdEdlbmVyYXRlZCA6ICIgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWZpbGVOYW1lID0gbnVsbDsKKwkJCQkJfQorCisJCQkJCS8vIFJ1biBnYXJiYWdlIGNvbGxlY3Rpb24KKwkJCQkJLy9TeXN0ZW0uZ2MoKTsKKwkJCQl9CisKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCisJCX0gLy8gZm9yCisKKwl9CisKKwkvKioKKwkgKiBHZW5lcmF0ZSB0aGUgaGVhZGVyIGNvbW1lbnQgZm9yIHRoaXMgZmlsZS4KKwkgKiAKKwkgKiBAcGFyYW0gY29kZQorCSAqICAgICAgICAgICAgSVNPIDMxNjYtMSBDb2RlCisJICogCisJICogQHBhcmFtIGxldmVsCisJICogICAgICAgICAgICB0aGUgYWRtaW4gbGV2ZWwKKwkgKiAKKwkgKiBAcmV0dXJuIGEgaGVhZGVyIGNvbW1lbnQgZm9yIHRoZSBuZXcgZmlsZS4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRlcihJU09Db2RlMSBjb2RlLCBpbnQgbGV2ZWwpIHsKKworCQlTdHJpbmcgaGVhZGVyID0gbnVsbDsKKworCQkvLyBoZWFkZXIgPSBHZW5VdGlscy5nZXRVTlBvbGljeSgpOworCisJCXN3aXRjaCAobGV2ZWwpIHsKKworCQljYXNlIERhdGFUeXBlcy5MRVZFTF8wOgorCQkJaGVhZGVyID0gIiMgIiArIGNvZGUuZ2V0TmFtZSgpICsgIl9uYW1lcy5wcm9wZXJ0aWVzICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJLy8gaGVhZGVyICs9IENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpICsgIlxuIjsKKwkJCS8vIGhlYWRlciArPSBHZW5VdGlscy5nZXRDb3B5cmlnaHQoKTsKKworCQkJaGVhZGVyICs9ICIjIExldmVsIDBcbiI7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIGhlYWRlciArPSBjb2RlLmdldEFscGhhMygpICsgIiA9ICIgKyBjb2RlLmdldE5hbWUoKSArICJcblxuIjsKKwkJCWJyZWFrOworCisJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzE6CisJCQloZWFkZXIgPSAiXG4jIExldmVsIDEgKGFkbWluIDEgPSBlLmcuLCBzdGF0ZSlcbiI7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCisJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzI6CisJCQloZWFkZXIgPSAiXG4jIExldmVsIDIgKGFkbWluIDIgPSBlLmcuLCBjb3VudHJ5KVxuIjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisKKwkJfQorCQlyZXR1cm4gaGVhZGVyOworCX0KKworCS8qKgorCSAqIE1haW4gZXhlY3V0aW9uIGVudHJ5IHBvaW50LgorCSAqIAorCSAqIEBwYXJhbSBhcmdzCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQkvLyBmaW5hbCBpbnQgSVNPXzMxNjZfMSA9IDA7CisJCS8vIGZpbmFsIGludCBJU09fMzE2Nl8yID0gMTsKKwkJLy8gZmluYWwgaW50IEZJWF9GSUxFID0gMjsKKwkJLy8gZmluYWwgaW50IFRBUkdFVF9MSVNUID0gMzsKKwkJLy8gZmluYWwgaW50IExFWF9ESVIgPSA0OworCQkvLyBmaW5hbCBpbnQgT1VUUFVUX0RJUiA9IDU7CisJCS8vIGZpbmFsIGludCBQQVJBTVMgPSA2OworCQkvLworCQkvLyBpZiAoYXJncy5sZW5ndGggPCBQQVJBTVMpIHsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLVdyb25nIGFyZ3VtZW50cy0tIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dAorCQkvLyAucHJpbnRsbigiXHRUbyBydW4sIHBsZWFzZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIDogIik7CisJCS8vIC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IElTTyAzMTY2LTEgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBJU08gMzE2Ni0yIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgSVNPIGZpeCBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IFRhcmdldCBjb3VudHJpZXMgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBMZXhpY29ncmFwaGljIHNvcnRpbmcgZGlyZWN0b3J5Iik7CisJCS8vIC8vJE5PTi1OTFMtMSQkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBPdXRwdXQgZGlyZWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gcmV0dXJuOworCQkvLyB9CisJCS8vCisJCS8vIE5hbWVHZW5lcmF0b3IgZ2VuID0gbmV3IE5hbWVHZW5lcmF0b3IoYXJnc1tJU09fMzE2Nl8xXSwKKwkJLy8gYXJnc1tJU09fMzE2Nl8yXSwgYXJnc1tGSVhfRklMRV0sIGFyZ3NbVEFSR0VUX0xJU1RdLAorCQkvLyBhcmdzW0xFWF9ESVJdLCBhcmdzW09VVFBVVF9ESVJdKTsKKwkJLy8gZ2VuLnJ1bigpOworCisJCWZpbmFsIGludCBDT05GSUdfRklMRSA9IDA7CisJCWZpbmFsIGludCBQQVJBTVMgPSAxOworCisJCWlmIChhcmdzLmxlbmd0aCA8IFBBUkFNUykgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0LS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJcdFx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50KHMpIDogIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0IENvbmZpZ3VyYXRpb24gZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJfQorCisJCU5hbWVHZW5lcmF0b3IgZ2VuID0gbmV3IE5hbWVHZW5lcmF0b3IoYXJnc1tDT05GSUdfRklMRV0pOworCQlnZW4ucnVuKCk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvTm9kZURhdGFHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvTm9kZURhdGFHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTUxNzhlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9Ob2RlRGF0YUdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsODE4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogU1RFTSBJSSBEYXRhIE1pZ3JhdGlvbi9HZW5lcmF0aW9uIFV0aWxpdGllcyAtLSBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyB0aGF0CisgKiBnZW5lcmF0ZXMgdGhlIG5vZGUucHJvcGVydGllcyBmaWxlcyBmb3IgYWxsIGNvdW50cmllcy4KKyAqIAorICogCisgKiBUbyBjb25maWd1cmUsIHNlZSBjb25maWd1cmF0aW9uIGZpbGUgOgorICogb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vTm9kZURhdGFHZW5lcmF0b3IuY29uZmlnCisgKiAKKyAqIAorICogVG8gcnVuLCBhZGQgcGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUgaW4gdGhlIHJ1biBwcm9maWxlIChpLmUuCisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGNvbmZpZ3VyYXRpb25cTm9kZURhdGFHZW5lcmF0b3IuY29uZmlnKQorICogCisgKiBTRVQgVk1BUkdTIFRPIDogLVhtczEwMjRtIC1YbXgxMDI0bQorICogCisgKi8KKworcHVibGljIGNsYXNzIE5vZGVEYXRhR2VuZXJhdG9yIHsKKworCXByaXZhdGUgU3RyaW5nIGlzbzMxNjZfMSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBpc28zMTY2XzIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgZml4RmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyB0YXJnZXRGaWxlID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIGxleERpciA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBvdXRwdXREaXIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgd29ya3NwYWNlID0gbnVsbDsKKworCS8qKgorCSAqIExpc3QgZm9yIElTTyAzMTY2LTEgY29kZXMgYW5kIHRhcmdldCBjb3VudHJpZXMuCisJICovCisKKwlMaXN0IHRhcmdldExpc3QgPSBudWxsOworCisJTGlzdCBjb2RlTGlzdCA9IG51bGw7CisKKwlMaXN0IGNvZGVmaXhMaXN0ID0gbnVsbDsKKworCS8qKgorCSAqIEhhc2ggc2V0IGZvciBzdG9yaW5nIHRoZSBzb3VyY2UgVVJMcyByZWxldmFudCB0byBhcmVhIGRhdGEuCisJICovCisJU2V0PFN0cmluZz4gdXJsU2V0ID0gbnVsbDsKKworCS8qKgorCSAqIEhhc2ggbWFwIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggc291cmNlcyB3aWxsIGJlIHNob3duIGNvbW1lbnRlZCBvdXQgYW5kCisJICogd2hpY2ggd2lsbCBhcHBlYXIgYWN0aXZlLgorCSAqLworCUhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPiB1cmxTdGF0dXMgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0b3IgKgorCSAqIAorCSAqIEBwYXJhbSBpc28zMTY2XzEgLQorCSAqICAgICAgICAgICAgZGF0YSBmaWxlIHdpdGggdGhlIElTTzMxNjYtMSBBTFBIQV8yIGFuZCBBTFBIQV8zIGNvZGVzLgorCSAqIEBwYXJhbSBpc28zMTY2XzIgLQorCSAqICAgICAgICAgICAgZmlsZSB3aXRoIHRoZSBJU08zMTY2LTIgZGF0YSB1c2VkIGZvciBnZW5lcmF0aW5nIHRoZSBJRHMuCisJICogQHBhcmFtIGZpeEZpbGUgLQorCSAqICAgICAgICAgICAgZmlsZSBjb250YWluaW5nIG1pc3NpbmcgSVNPMzE2Ni0yIGNvZGVzCisJICogQHBhcmFtIHRhcmdldEZpbGUgLQorCSAqICAgICAgICAgICAgZGF0YSBmaWxlIHdoZXJlIHdlIGZpbmQgYSBsaXN0IG9mIGNvdW50cmllcyBmb3IgZ2VuZXJhdGlvbiBvZgorCSAqICAgICAgICAgICAgdGhlaXIgY29ycmVzcG9uZGluZyBhcmVhLnByb3BlcnRpZXMgZmlsZXMuCisJICogQHBhcmFtIGxleERpcgorCSAqICAgICAgICAgICAgZm9sZGVyIGNvbnRhaW5pbmcgbGV4aWNvZ3JhcGhpY2FsbHkgc29ydGVkIGZpbGVzCisJICogQHBhcmFtIG91dHB1dERpciAtCisJICogICAgICAgICAgICB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIGZpbGVzIGdlbmVyYXRlZC4KKwkgKi8KKwkvLyBwdWJsaWMgTm9kZURhdGFHZW5lcmF0b3IoU3RyaW5nIGlzbzMxNjZfMSwgU3RyaW5nIGlzbzMxNjZfMiwKKwkvLyBTdHJpbmcgZml4RmlsZSwgU3RyaW5nIHRhcmdldEZpbGUsIFN0cmluZyBsZXhEaXIsIFN0cmluZyBvdXRwdXREaXIpIHsKKwkvLyAvLyBTZXQgdmFsdWVzIG9mIGdsb2JhbCB2YXJpYWJsZXMuCisJLy8gdGhpcy5pc28zMTY2XzEgPSBpc28zMTY2XzE7CisJLy8gdGhpcy5pc28zMTY2XzIgPSBpc28zMTY2XzI7CisJLy8gdGhpcy5maXhGaWxlID0gZml4RmlsZTsKKwkvLyB0aGlzLnRhcmdldEZpbGUgPSB0YXJnZXRGaWxlOworCS8vIHRoaXMubGV4RGlyID0gbGV4RGlyOworCS8vIHRoaXMub3V0cHV0RGlyID0gb3V0cHV0RGlyOworCS8vIHRhcmdldExpc3QgPSBudWxsOworCS8vIC8vIFNldCB0aGUgVVJMIElEcyB0aGF0IGFyZSByZWxldmFudCBmb3IgYXJlYSBkYXRhLgorCS8vIGluaXROb2RlRGF0YVVSTFNldCgpOworCS8vIC8vIFNldCB3aGljaCBVUkxzIGFyZSBhY3RpdmUgYW5kIHdoaWNoIG9uZXMgc2hvdWxkIGJlIGNvbW1lbnRlZCBvdXQuCisJLy8gc2V0VVJMU3RhdHVzKCk7CisJLy8JfQorCisJLyoqCisJICogQHBhcmFtIGNvbmZpZ0ZpbGUKKwkgKi8KKwlwdWJsaWMgTm9kZURhdGFHZW5lcmF0b3IoU3RyaW5nIGNvbmZpZ0ZpbGUpIHsKKworCQkvLyBMb2FkIGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcworCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB2YXJzID0gR2VuVXRpbHMubG9hZENvbmZpZ0ZpbGUoY29uZmlnRmlsZSk7CisKKwkJU2V0PFN0cmluZz4ga2V5cyA9IHZhcnMua2V5U2V0KCk7CisJCUl0ZXJhdG9yIGl0ID0ga2V5cy5pdGVyYXRvcigpOworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgdmFyID0gKFN0cmluZykgaXQubmV4dCgpOworCisJCQkvLyBBc3NpZ24gdmFsdWVzIHRvIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIDoKKwkJCWlmICh2YXIuZXF1YWxzKCJXT1JLU1BBQ0UiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJd29ya3NwYWNlID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiSVNPMzE2Nl8xIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWlzbzMxNjZfMSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIklTTzMxNjZfMiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpc28zMTY2XzIgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJJU09fRklYIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWZpeEZpbGUgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJUQVJHRVRfTElTVCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl0YXJnZXRGaWxlID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiTEVYX0RJUiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlsZXhEaXIgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJQUk9QRVJUSUVTX09VVFBVVCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlvdXRwdXREaXIgPSB2YXJzLmdldCh2YXIpOworCQkJfQorCisJCX0gLy8gd2hpbGUKKworCQkvLyBUaGUgd29ya3NwYWNlIHZhcmlhYmxlIHNob3VsZCBlbmQgd2l0aCBhIHNsYXNoIGNoYXJhY3RlcgorCQlpZiAod29ya3NwYWNlLmVuZHNXaXRoKCJcXCIpID09IGZhbHNlKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXdvcmtzcGFjZSArPSAiXFwiOyAvLyROT04tTkxTLTEkCisJCX0KKworCQlTdHJpbmcgcGF0aCA9IHdvcmtzcGFjZSArIEdlbkNvbnN0YW50cy5QQVJBTVNfRElSOworCisJCS8vIFNldCByZW1haW5pbmcgY29uZmlnIHZhcnMgdXNpbmcgV09SS1NQQUNFICh3b3Jrc3BhY2UgcmVsYXRpdmUpCisJCWlmIChpc28zMTY2XzEgPT0gbnVsbCkgeworCQkJaXNvMzE2Nl8xID0gcGF0aCArIEdlbkNvbnN0YW50cy5JU08zMTY2XzFfRklMRTsKKwkJfQorCQlpZiAoaXNvMzE2Nl8yID09IG51bGwpIHsKKwkJCWlzbzMxNjZfMiA9IHBhdGggKyBHZW5Db25zdGFudHMuSVNPMzE2Nl8yX0ZJTEU7CisJCX0KKwkJaWYgKGZpeEZpbGUgPT0gbnVsbCkgeworCQkJZml4RmlsZSA9IHBhdGggKyBHZW5Db25zdGFudHMuSVNPRklYX0ZJTEU7CisJCX0KKwkJaWYgKHRhcmdldEZpbGUgPT0gbnVsbCkgeworCQkJdGFyZ2V0RmlsZSA9IHBhdGggKyBHZW5Db25zdGFudHMuQ09VTlRSSUVTX0xJU1Q7CisJCX0KKwkJaWYgKGxleERpciA9PSBudWxsKSB7CisJCQlsZXhEaXIgPSBwYXRoICsgR2VuQ29uc3RhbnRzLkxFWF9ESVI7CisJCX0KKwkJaWYgKG91dHB1dERpciA9PSBudWxsKSB7CisJCQlvdXRwdXREaXIgPSB3b3Jrc3BhY2UgKyBHZW5Db25zdGFudHMuUFJPUEVSVElFU19PVVRQVVRfRElSOworCQl9CisKKwkJdGFyZ2V0TGlzdCA9IG51bGw7CisJCS8vIFNldCB0aGUgVVJMIElEcyB0aGF0IGFyZSByZWxldmFudCBmb3IgYXJlYSBkYXRhLgorCQlpbml0Tm9kZURhdGFVUkxTZXQoKTsKKwkJLy8gU2V0IHdoaWNoIFVSTHMgYXJlIGFjdGl2ZSBhbmQgd2hpY2ggb25lcyBzaG91bGQgYmUgY29tbWVudGVkIG91dC4KKwkJc2V0VVJMU3RhdHVzKCk7CisKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBVUkwgSURzIHJlbGV2YW50IGZvciBhcmVhIGRhdGEuIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gVVJMcworCSAqIHdpdGggSUQgPSBESVZBLiBUaGlzIGNhbiBiZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBkYXRhLiBGb3IKKwkgKiBleGFtcGxlLCBmb3IgcG9wdWxhdGlvbiBkYXRhLCB3ZSBhcmUgaW50ZXJlc3RlZCBvbiBJRCA9IENJQQorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXROb2RlRGF0YVVSTFNldCgpIHsKKwkJdXJsU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCQl1cmxTZXQuYWRkKG5ldyBTdHJpbmcoIkNJQSIpKTsgLy8kTk9OLU5MUy0xJAorCQl1cmxTZXQuYWRkKG5ldyBTdHJpbmcoIklTTzMxNjZfMSIpKTsgLy8kTk9OLU5MUy0xJAorCQl1cmxTZXQuYWRkKG5ldyBTdHJpbmcoIlVOSVRFRE5BVElPTlMiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBTZXQgd2hpY2ggVVJMIGFwcGVhcnMgYXMgdW5jb21tZW50ZWQgb3IgQUNUSVZFIGFuZCB3aGljaCBvbmVzIGFwcGVhciBhcworCSAqIGNvbW1lbnRlZCBvdXQgb3IgU0VDT05EQVJZLiBPbmx5IFVSTCBzaG91bGQgYmUgYWN0aXZlLiBBbGwgb3RoZXJzIHNob3VsZAorCSAqIGFwcGVhciBjb21tZW50ZWQuCisJICogCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0VVJMU3RhdHVzKCkgeworCQl1cmxTdGF0dXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+KCk7CisJCS8vIFRoaXMgd2lsbCBiZSB0aGUgYWN0aXZlIFVSTC4KKwkJdXJsU3RhdHVzLnB1dCgiQ0lBIiwgbmV3IEJvb2xlYW4odHJ1ZSkpOyAvLyROT04tTkxTLTEkCisJCS8vIEFsbCBvdGhlciBVUkxzIGFwcGVhciBhcyBjb21tZW50ZWQgb3V0LCBzZWNvbmRhcnkuCisJCXVybFN0YXR1cy5wdXQoIkNJQSIsIG5ldyBCb29sZWFuKGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKKwkJdXJsU3RhdHVzLnB1dCgiSVNPMzE2Nl8xIiwgbmV3IEJvb2xlYW4oZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAorCQl1cmxTdGF0dXMucHV0KCJVTklURUROQVRJT05TIiwgbmV3IEJvb2xlYW4odHJ1ZSkpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2V0cyB1cCBhbmQgcnVucyB0aGlzIGdlbmVyYXRvci4KKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgY291bnRyaWVzIHdlIHdhbnQuCisJCXRhcmdldExpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QodGFyZ2V0RmlsZSk7CisKKwkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBJU08zMTY2LTEgQUxQSEEyLCBBTFBIQTMsIGFuZAorCQkvLyBudW1lcmljIGNvZGVzLgorCQljb2RlTGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdChpc28zMTY2XzEpOworCisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgbWlzc2luZyBJU08zMTY2LTIgY29kZXMKKwkJY29kZWZpeExpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QoZml4RmlsZSk7CisKKwkJLy8gTm93LCBwcm9jZXNzIGVhY2ggaXRlbSBpbiB0aGUgdGFyZ2V0IGxpc3QuCisJCXByb2Nlc3MoKTsKKworCX0KKworCS8qKgorCSAqIFByb2Nlc3Mgb3VyIGdsb2JhbCBsaXN0IG9mIHRhcmdldCBjb3VudHJpZXMuIEZvciBlYWNoIGNvdW50cnkgaW4gbGlzdCwKKwkgKiBnZW5lcmF0ZSBpdHMgbm9kZS5wcm9wZXJ0aWVzIGZpbGUuCisJICogCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJvY2VzcygpIHsKKworCQlmaW5hbCBpbnQgTEVWRUxfMSA9IDE7CisJCWZpbmFsIGludCBMRVZFTF8yID0gMjsKKworCQkvLyBBIHdyaXRlciBmb3IgdGhlIG5ldyBmaWxlIHdlIGFyZSBjcmVhdGluZy4KKwkJUHJpbnRXcml0ZXIgcHJvcGVydGllc0ZpbGUgPSBudWxsOworCisJCS8vIE9iamVjdCBob2xkaW5nIElTTzMxNjYtMSByZWxhdGVkIGRhdGEuCisJCUlTT0NvZGUxIGlzb0NvZGUgPSBudWxsOworCisJCS8vIE5hbWUgb2YgdGhlIG5ldyBwcm9wZXJ0aWVzIGZpbGUuCisJCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7CisKKwkJLy8gQSBsaXN0IGZvciBJU08gMzE2Ni0yIG9iamVjdHMKKwkJTGlzdCBpc28yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKworCQkvLyBGaWxlbmFtZXMgZm9yIGxleDEgYW5kIGxleDIgZmlsZXMgZm9yIGEgZ2l2ZW4gY291bnRyeS4KKwkJU3RyaW5nIGxleEFkbWluMUZpbGUgPSBudWxsOworCQlTdHJpbmcgbGV4QWRtaW4yRmlsZSA9IG51bGw7CisKKwkJLy8gTGlzdHMgaG9sZGluZyB0aGUgbGV4MSBhbmQgbGV4MiB2YWx1ZXMuCisJCS8vIE5PVEU6IGxleCB2YWx1ZXMgYXJlIHRoZSBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgdmFsdWVzIGZvcgorCQkvLyBhZG1pbmlzdHJhdGlvbiBsZXZlbHMuCisJCUxpc3Q8U3RyaW5nPiBsZXgxRGF0YVNldCA9IG51bGw7CisJCUxpc3Q8U3RyaW5nPiBsZXgyRGF0YVNldCA9IG51bGw7CisKKwkJLy8gTGlzdHMgZm9yIGhvbGRpbmcgbGV4MSBhbmQgbGV4MiBvYmplY3RzIGZvciBhIGdpdmVuIGNvdW50cnkuCisJCUxpc3Q8TGV4MU9iaj4gbGV4MUxpc3QgPSBudWxsOworCQlMaXN0PExleDJPYmo+IGxleDJMaXN0ID0gbnVsbDsKKworCQlpbnQgc2l6ZSA9IHRhcmdldExpc3Quc2l6ZSgpOworCisJCS8vIEl0ZXJhdGUgZm9yIGV2ZXJ5IGNvdW50cnkgYW5kIGNyZWF0ZSBpdHMgbm9kZWRhdGEucHJvcGVydGllcyBmaWxlLgorCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCisJCQkvLyBHZXQgdGhlIG5leHQgY291bnRyeSBpbiB0aGUgbGlzdC4KKwkJCVN0cmluZyBmaWxlID0gKChTdHJpbmcpIHRhcmdldExpc3QuZ2V0KGkpKS50cmltKCk7CisKKwkJCS8vIEFuIGluZGV4IGZvciB1bmtud29uIG9yIG4uYS4gZW50cmllcworCQkJaW50IHVua0NvdW50ZXIgPSAxOworCisJCQkvLyBPcGVuIHRoZSBkYXRhIHNvdXJjZSBmaWxlIGZvciB0aGlzIGNvdW50cnkuCisJCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBHZW5VdGlscy5vcGVuUmVhZGVyKGZpbGUpOworCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRcdDw8PDwgTk9ERSBEQVRBIEdFTkVSQVRPUiAtLSBQcm9jZXNzaW5nIGNvdW50cnkgOiAiICsgZmlsZSArICIgPj4+PiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCXRyeSB7CisKKwkJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKKworCQkJCQlTdHJpbmcgYnVmZmVyID0gbnVsbDsKKwkJCQkJLy8gRGVzY3JpYmVzIGxldmVsCisJCQkJCS8vIG9mIGRhdGEgd2UKKwkJCQkJLy8gYXJlIG5vdyBwcm9jZXNzaW5nIDogTEVWRUwwLCBMRVZFTDEsIG9yIExFVkVMMi4KKwkJCQkJaW50IGxldmVsID0gLTE7CisJCQkJCS8vIFJlY29yZCB0aGUgcHJldmlvdXMgbGV2ZWwuCisJCQkJCWludCBvbGRsZXZlbCA9IGxldmVsIC0gMTsKKwkJCQkJLy8gV2UgdGFrZSBhIGNodW5rIG9mIHRoZSBkYXRhIFtCVUZGRVJfTUlOLEJVRkZFUl9NQVhdIHRvCisJCQkJCS8vIG1ha2UgcHJvY2Vzc2luZyBtb3JlCisJCQkJCS8vIGVmZmljaWVudCwgd2UgZG9udCBuZWVkIGFsbCBvZiBpdC4KKwkJCQkJaW50IEJVRkZFUl9NSU4gPSAwOworCQkJCQlpbnQgQlVGRkVSX01BWCA9IDEyMDsKKwkJCQkJLy8gU3RyaW5nIHVzZWQgdG8gaWdub3JlIHJlcGVhdGVkIGVudHJpZXMuCisJCQkJCUxpc3Q8U3RyaW5nPiBlbnRyeUxpc3QgPSBudWxsOworCisJCQkJCXdoaWxlIChHZW5VdGlscy5FT0YoYnVmZmVyID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IHRydWUpIHsKKworCQkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgd2UgbWFyayBhbGwgdW5rbm93biBkYXRhLgorCQkJCQkJYnVmZmVyID0gYnVmZmVyLnJlcGxhY2UoIiwsIiwgIixVTktOT1dOLCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCQkJLy8gVXNlIG9ubHkgcGFydCBvZiB0aGUgYnVmZmVyLCBub3QgYWxsIG9mIGl0IGZvcgorCQkJCQkJLy8gZWZmaWNpZW5jeS4KKwkJCQkJCVN0cmluZ1tdIGl0ZW1zID0gR2VuVXRpbHMKKwkJCQkJCQkJLmV4dHJhY3QoYnVmZmVyLmxlbmd0aCgpIDwgQlVGRkVSX01BWCA/IGJ1ZmZlcgorCQkJCQkJCQkJCTogYnVmZmVyLnN1YnN0cmluZyhCVUZGRVJfTUlOLAorCQkJCQkJCQkJCQkJQlVGRkVSX01BWCkpOworCisJCQkJCQkvLyBHZXQgdGhlIGNvdW50cnkgbmFtZQorCQkJCQkJU3RyaW5nIGNvdW50cnkgPSBpdGVtc1tJU09EYXRhLkNPVU5UUllfTkFNRV07CisKKwkJCQkJCS8vIEdldCB0aGUgSVNPMzE2Ni0xIGluZm8gZm9yIHRoaXMgY291bnRyeQorCQkJCQkJaWYgKGlzb0NvZGUgPT0gbnVsbCkgeworCQkJCQkJCWlzb0NvZGUgPSBHZW5VdGlscy5nZXRJU09Db2RlKGNvdW50cnksIGNvZGVMaXN0KTsKKwkJCQkJCX0KKworCQkJCQkJLy8gR2V0IHRoZSBsZXZlbG9mIHRoZSBkYXRhIHdlIGFyZSBwcm9jZXNzaW5nLgorCQkJCQkJbGV2ZWwgPSBHZW5VdGlscy5nZXREYXRhTGV2ZWwoaXRlbXMpOworCisJCQkJCQlpZiAobGV2ZWwgIT0gMCAmJiBpc28yTGlzdCAhPSBudWxsKSB7CisJCQkJCQkJLy8gTG9hZCB0aGUgSVNPIDMxNjYtMiBvYmplY3RzIGZvciB0aGlzIGNvdW50cnkKKwkJCQkJCQlpc28yTGlzdCA9IEdlblV0aWxzLmxvYWRJU08yKGlzbzMxNjZfMik7CisJCQkJCQl9CisKKwkJCQkJCS8vIFRoaXMgdmFyaWFibGUgaW5kaWNhdGVzIGEgdHJhbnNpdGlvbiBpbiBvdXIgZGF0YQorCQkJCQkJLy8gcHJvY2Vzc2luZworCQkJCQkJYm9vbGVhbiB0cmFuc2l0aW9uID0gKGxldmVsICE9IG9sZGxldmVsKSA/IHRydWUgOiBmYWxzZTsKKworCQkJCQkJLy8gVmFyaWFibGUgdXNlZCB0byBob2xkIHRoZSBmb3JtYXR0ZWQgb3V0cHV0IGRhdGEuCisJCQkJCQlTdHJpbmcgZGF0YSA9IG51bGw7CisKKwkJCQkJCS8vIFRoZSBjdXJyZW50IGVudGl0eSB3ZSBhcmUgZGVhbGluZyB3aXRoLgorCQkJCQkJLy8gQmFzZWQgb24gaXRzIGFkbWluIGxldmVsIGl0IGNhbiBiZSBhIGNvdW50cnksIGEKKwkJCQkJCS8vIGNvdW50eSwgZXRjOworCQkJCQkJU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisJCQkJCQkvLyBEZXNjcmlwdG9yIGZvciBjdXJyZW50IGVudHJ5LgorCQkJCQkJU3RyaW5nIGRlc2NyaXB0b3IgPSBudWxsOworCisJCQkJCQkvLyBXZSBoYXZlIHN3aXRjaGVkIHRvIGEgZGlmZmVyZW50IGRhdGEgbGV2ZWwgKGksZSwKKwkJCQkJCS8vIGFkbWluIDAgdG8gYWRtaW4gMSkKKwkJCQkJCWlmICh0cmFuc2l0aW9uID09IHRydWUpIHsKKwkJCQkJCQkvLyBLZWVwIHRyYWNrIG9mIHByZXZpb3VzIGxldmVsIGluIG9yZGVyIHRvIGRldGVjdAorCQkJCQkJCS8vIHRyYW5zaXRpb25zLgorCQkJCQkJCW9sZGxldmVsID0gbGV2ZWw7CisJCQkJCQkJLy8gUmVzZXQgb3VyIHJlcGVhdGVkIGhpc3RvcnkKKwkJCQkJCQlpZiAoZW50cnlMaXN0ICE9IG51bGwpIHsKKwkJCQkJCQkJZW50cnlMaXN0LmNsZWFyKCk7CisJCQkJCQkJfQorCQkJCQkJCWVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisJCQkJCQkJLy8gUmVzZXQgY291bnRlciBvZiBVTktOT1dOIGFuZCBOLkEuIGVudHJpZXMuCisJCQkJCQkJdW5rQ291bnRlciA9IDE7CisJCQkJCQkJaWYgKHByb3BlcnRpZXNGaWxlICE9IG51bGwpIHsKKwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0R2VuZXJhdGVkIDogIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBmaWxlTmFtZSk7CisJCQkJCQkJCXByb3BlcnRpZXNGaWxlLmNsb3NlKCk7CisJCQkJCQkJCXByb3BlcnRpZXNGaWxlID0gbnVsbDsKKwkJCQkJCQkJZmlsZU5hbWUgPSBudWxsOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJLy8gSWYgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCBmb3IgdGhpcyBjb3VudHJ5LAorCQkJCQkJLy8gY3JlYXRlIGl0IHVzaW5nIElTTyBhbHBoYTMgY29kZS4KKwkJCQkJCUZpbGUgY291bnRyeURpciA9IG5ldyBGaWxlKG91dHB1dERpcgorCQkJCQkJCQkrIGlzb0NvZGUuZ2V0QWxwaGEzKCkpOworCisJCQkJCQlpZiAoY291bnRyeURpciAhPSBudWxsICYmIGNvdW50cnlEaXIuZXhpc3RzKCkgPT0gZmFsc2UpIHsKKwkJCQkJCQkvLyBEaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuIENyZWF0ZSBpdC4KKwkJCQkJCQljb3VudHJ5RGlyLm1rZGlyKCk7CisJCQkJCQl9CisKKwkJCQkJCS8vIENyZWF0ZSBhbmQgb3BlbiB0aGUgbmV3IGZpbGUuCisJCQkJCQlpZiAocHJvcGVydGllc0ZpbGUgPT0gbnVsbCkgeworCQkJCQkJCS8vIENyZWF0ZSB0aGUgZmlsZSBuYW1lIGZvciB0aGUgbmV3IHByb3BlcnRpZXMuZmlsZS4KKwkJCQkJCQlmaWxlTmFtZSA9IGNvdW50cnlEaXIgKyAiXFwiICsgaXNvQ29kZS5nZXRBbHBoYTMoKSAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkrICJfIiArIGxldmVsICsgIl9ub2RlLnByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkvLyBDcmVhdGUgdG5lIG5ldyBwb3B1bGF0aW9uIGZpbGUgZm9yIHRoaXMgY291bnRyeS4KKwkJCQkJCQlwcm9wZXJ0aWVzRmlsZSA9IEdlblV0aWxzLm9wZW5Xcml0ZXIoZmlsZU5hbWUpOworCQkJCQkJfQorCisJCQkJCQlpZiAodHJhbnNpdGlvbiA9PSB0cnVlKSB7CisJCQkJCQkJLy8gSnVzdCBhZGQgdGhlIGhlYWRlcgorCQkJCQkJCWRhdGEgPSBnZXRIZWFkZXIoaXNvQ29kZSwgbGV2ZWwpOworCQkJCQkJCUdlblV0aWxzLmFkZERhdGEocHJvcGVydGllc0ZpbGUsIGRhdGEpOworCQkJCQkJCS8vIEZvcmdldCB0aGUgZGF0YSB3ZSBqdXN0IHdyb3RlLgorCQkJCQkJCWRhdGEgPSBudWxsOworCQkJCQkJfQorCisJCQkJCQlzd2l0Y2ggKGxldmVsKSB7CisKKwkJCQkJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzA6CisKKwkJCQkJCQkvLyBIYW5kbGUgZGF0YSBsZXZlbCAwIGRpZmZlcmVudCB0aGF0IHRoZSBvdGhlcgorCQkJCQkJCS8vIGFkbWluIGxldmVscy4KKwkJCQkJCQlpZiAodHJhbnNpdGlvbiA9PSB0cnVlKSB7CisJCQkJCQkJCWRhdGEgPSBpc29Db2RlLmdldEFscGhhMygpICsgIiA9ICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgaXNvQ29kZS5nZXROYW1lKCkgKyAiLCAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGlzb0NvZGUuZ2V0TnVtZXJpYygpICsgIiwgIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBpc29Db2RlLmdldEFscGhhMigpOworCQkJCQkJCQkvLyBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0CisJCQkJCQkJCUdlblV0aWxzLmFkZERhdGEocHJvcGVydGllc0ZpbGUsIGRhdGEpOworCQkJCQkJCX0KKwkJCQkJCQljb250aW51ZTsKKworCQkJCQkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMToKKwkJCQkJCQljdXJyZW50ID0gaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0udG9VcHBlckNhc2UoKTsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMjoKKwkJCQkJCQljdXJyZW50ID0gaXRlbXNbSVNPRGF0YS5BRE1JTjJfTkFNRV0udG9VcHBlckNhc2UoKTsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJfSAvLyBzd2l0Y2gKKworCQkJCQkJLy8gSGFuZGxlIFVOS05PV04gYW5kIE4uQS4gZW50cmllcyBkaWZmZXJlbnRseS4KKwkJCQkJCWlmIChjdXJyZW50LmVxdWFscygiVU5LTk9XTiIpIHx8IGN1cnJlbnQuZXF1YWxzKCJOLkEuIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQkJCQlpZiAobGV2ZWwgPT0gMSkgeworCQkJCQkJCQljdXJyZW50ID0gaXNvQ29kZS5nZXRBbHBoYTIoKSArICItVU5LLSIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgU3RyaW5nLnZhbHVlT2YodW5rQ291bnRlcisrKTsKKworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8vIExldmVsIDIgZGF0YS4KKwkJCQkJCQkJY3VycmVudCA9IGlzb0NvZGUuZ2V0QWxwaGEzKCkgKyAiLkwyLiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgU3RyaW5nLnZhbHVlT2YodW5rQ291bnRlcisrKTsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCS8vIFZlcmlmeSBmb3IgcmVwZWF0ZWQgZW50cmllcyAtLSBhdm9pZCBkdXBsY2F0ZXMKKwkJCQkJCXN3aXRjaCAobGV2ZWwpIHsKKworCQkJCQkJY2FzZSBMRVZFTF8xOgorCQkJCQkJCWlmIChHZW5VdGlscy5pc1JlcGVhdGVkKGN1cnJlbnQsIGVudHJ5TGlzdCkgPT0gdHJ1ZSkgeworCQkJCQkJCQkvLyBEdXBsaWNhdGVkLCBpZ25vcmUuCisJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCX0KKwkJCQkJCQkvLyBSZW1lbWJlciB0aGlzIGVudGl0eSB0byBhdm9pZCBkdXBsaWNhdGVzLgorCQkJCQkJCWVudHJ5TGlzdC5hZGQoY3VycmVudCk7CisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgTEVWRUxfMjoKKwkJCQkJCQlpZiAoR2VuVXRpbHMuaXNSZXBlYXRlZChpdGVtc1tJU09EYXRhLkFETUlOMV9OQU1FXQorCQkJCQkJCQkJKyBjdXJyZW50LCBlbnRyeUxpc3QpID09IHRydWUpIHsKKwkJCQkJCQkJLy8gRHVwbGljYXRlZCwgaWdub3JlLgorCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQl9CisJCQkJCQkJLy8gUmVtZW1iZXIgdGhpcyBlbnRpdHkgdG8gYXZvaWQgZHVwbGljYXRlcy4KKwkJCQkJCQllbnRyeUxpc3QuYWRkKGl0ZW1zW0lTT0RhdGEuQURNSU4xX05BTUVdICsgY3VycmVudCk7CisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCX0KKworCQkJCQkJLy8gTG9hZCB0aGUgbGV4IGxpc3RzLgorCQkJCQkJaWYgKGxleDFEYXRhU2V0ID09IG51bGwgJiYgbGV4MkRhdGFTZXQgPT0gbnVsbCkgeworCisJCQkJCQkJLy8gQ29tcG9zZSB0aGUgZmlsZSBuYW1lcyBmb3IgdGhlIGxleCBmaWxlcyBmb3IKKwkJCQkJCQkvLyB0aGlzCisJCQkJCQkJLy8gY291bnRyeS4KKwkJCQkJCQlsZXhBZG1pbjFGaWxlID0gbGV4RGlyICsgaXNvQ29kZS5nZXRBbHBoYTMoKSArICJcXCIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJKyBpc29Db2RlLmdldEFscGhhMygpOworCQkJCQkJCWxleEFkbWluMkZpbGUgPSBsZXhBZG1pbjFGaWxlOworCQkJCQkJCWxleEFkbWluMUZpbGUgKz0gIl9BRE1JTjFfTEVYLnR4dCI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlsZXhBZG1pbjJGaWxlICs9ICJfQURNSU4yX0xFWC50eHQiOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCQkvLyBMb2FkIHRoZSBsZXgxIGFuZCBsZXgyIGZpbGVzIGZvciB0aGlzCisJCQkJCQkJLy8gY291bnRyeS4KKwkJCQkJCQlsZXgxRGF0YVNldCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdChsZXhBZG1pbjFGaWxlKTsKKwkJCQkJCQlsZXgyRGF0YVNldCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdChsZXhBZG1pbjJGaWxlKTsKKworCQkJCQkJCS8vIENyZWF0ZSBhIG1ldGhvZCB0byBzZWFyY2ggZm9yIGFuIGl0ZW0gb24gYQorCQkJCQkJCS8vIGxpc3QKKwkJCQkJCQkvLyBvZiBsZXggZGF0YSBvYmplY3RzLgorCQkJCQkJCWxleDFMaXN0ID0gR2VuVXRpbHMuY3JlYXRlTGV4MUxpc3QobGV4MURhdGFTZXQpOworCQkJCQkJCWxleDJMaXN0ID0gR2VuVXRpbHMuY3JlYXRlTGV4Mkxpc3QobGV4MkRhdGFTZXQpOworCisJCQkJCQl9CisKKwkJCQkJCS8vIENvbXBvc2UgdGhlIGxldmVsMiBkZXNjcmlwdG9yIHVzaW5nIHRoZSBsZXggZGF0YToKKworCQkJCQkJLy8gV2UgZ2V0IHRoZSBkZXNjcmlwdG9yIGZvciBhZG1pbmlzdHJhdGlvbiBlbnRpdGllcworCQkJCQkJLy8gZGlmZmVyZW50bHkgYmFzZWQgb24gaXRzIGxldmVsLgorCisJCQkJCQlpZiAobGV2ZWwgPT0gMikgeworCisJCQkJCQkJLy8gU1RFUCAxOiBEbyBhIGxvb2sgdXAgaW4gdGhlIGxleCAyIGxpc3RzLgorCisJCQkJCQkJLy8gR2V0IHRoZSBsZXggMiBvYmplY3QgZm9yIHRoZSBjdXJyZW50IGVudHJ5LgorCQkJCQkJCUxleDJPYmogbGV4MkN1cnJlbnQgPSBHZW5VdGlscy5sZXgyTG9va3VwKGxleDJMaXN0LAorCQkJCQkJCQkJaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0sIGN1cnJlbnQpOworCisJCQkJCQkJLy8gR2V0IHRoZSBsZXggMSBvYmplY3QgdG8gd2hpY2ggbGV4MkN1cnJlbnQgYmVsb25ncworCQkJCQkJCS8vIHRvLgorCQkJCQkJCUxleDFPYmogbGV4MUN1cnJlbnQgPSBHZW5VdGlscy5sZXgxTG9va3VwKGxleDFMaXN0LAorCQkJCQkJCQkJbGV4MkN1cnJlbnQuZ2V0QWRtaW4xKCkpOworCisJCQkJCQkJLy8gU1RFUCAyOiBwaWVjZSB0b2dldGhlciB0aGUgSUQgdXNpbmcgdGhlCisJCQkJCQkJLy8gcHJvcGVyIGxleCBvYmplY3RzIDogdGhlIFVTQSBpcyBhIHNwZWNpYWwgY2FzZQorCQkJCQkJCWlmIChsZXgxQ3VycmVudC5nZXREZXNjcmlwdG9yKCkuY29udGFpbnMoIlVTLSIpKSB7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJCQlkZXNjcmlwdG9yID0gbGV4MUN1cnJlbnQuZ2V0RGVzY3JpcHRvcigpCisJCQkJCQkJCQkJKyAiLSIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgbGV4MUN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXgoKQorCQkJCQkJCQkJCSsgbGV4MkN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXhVU0EoKTsKKworCQkJCQkJCQljdXJyZW50ID0gY3VycmVudAorCQkJCQkJCQkJCSsgIiwgIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBsZXgxQ3VycmVudC5nZXRGb3JtYXR0ZWRJbmRleCgpCisJCQkJCQkJCQkJKyBsZXgyQ3VycmVudC5nZXRGb3JtYXR0ZWRJbmRleFVTQSgpCisJCQkJCQkJCQkJKyAiLCAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIEdlblV0aWxzLmV4dHJhY3RBbHBoYTIobGV4MUN1cnJlbnQKKwkJCQkJCQkJCQkJCS5nZXREZXNjcmlwdG9yKCkpOworCisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJZGVzY3JpcHRvciA9IGxleDFDdXJyZW50LmdldERlc2NyaXB0b3IoKQorCQkJCQkJCQkJCSsgIi1HIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBsZXgxQ3VycmVudC5nZXRGb3JtYXR0ZWRJbmRleCgpCisJCQkJCQkJCQkJKyBsZXgyQ3VycmVudC5nZXRGb3JtYXR0ZWRJbmRleCgpOworCisJCQkJCQkJCS8vIEFkZCBzb21lIGNvbW1lbnMgdG8gYWxsb3cgcmV2ZXJzZSBlbmdpbmVlcmluZworCQkJCQkJCQkvLyBvcgorCQkJCQkJCQkvLyBiYWNrdHJhY2tpbmcgdGhlIG9yaWdpbiBvZiB0aGlzIGdlbmVyYXRlZCBrZXkKKwkJCQkJCQkJLy8gYXMKKwkJCQkJCQkJLy8gbXVjaCBhcyBwb3NzaWJsZS4KKwkJCQkJCQkJZGF0YSA9ICIjIEdlbmVyYXRlZCBrZXkgZGV0YWlscyA6ICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgIiBMZXZlbCAxICggIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBsZXgxQ3VycmVudC5nZXREZXNjcmlwdG9yKCkKKwkJCQkJCQkJCQkrICIgPSAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGxleDFDdXJyZW50LmdldEFkbWluMSgpCisJCQkJCQkJCQkJKyAiICkuICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgIkxldmVsIDIgKCAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGxleDFDdXJyZW50LmdldEZvcm1hdHRlZEluZGV4KCkKKwkJCQkJCQkJCQkrIGxleDJDdXJyZW50LmdldEZvcm1hdHRlZEluZGV4KCkKKwkJCQkJCQkJCQkrICIgPSAiICsgbGV4MkN1cnJlbnQuZ2V0QWRtaW4yKCkgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgIiApLiBcbiI7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJCQlpZiAoY3VycmVudC5jb250YWlucygiLkwyLiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCWN1cnJlbnQgPSBkZXNjcmlwdG9yCisJCQkJCQkJCQkJCSsgIiwgIiArICJHIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkJCQkJKyBsZXgxQ3VycmVudC5nZXRGb3JtYXR0ZWRJbmRleCgpCisJCQkJCQkJCQkJCSsgbGV4MkN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXgoKQorCQkJCQkJCQkJCQkrICIsICIgKyBsZXgxQ3VycmVudC5nZXRJRCgpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCX0KKworCQkJCQkJCX0KKworCQkJCQkJfSBlbHNlIHsgLy8gQ29tcG9zZSBkZXNjcmlwdG9yIGZvciBsZXZlbCAxIGFuZCBsZXZlbAorCQkJCQkJCS8vIDAgZGF0YS4KKwkJCQkJCQkvLyBHZXQgdGhlIGRlc2NyaXB0b3IgZm9yIHRoaXMgZW50aXR5LgorCQkJCQkJCWRlc2NyaXB0b3IgPSBHZW5VdGlscy5nZXRJU08yRGVzY3JpcHRvcihpc28yTGlzdCwKKwkJCQkJCQkJCWN1cnJlbnQsIGlzb0NvZGUuZ2V0QWxwaGEyKCkpOworCisJCQkJCQkJLy8gSWYgd2UgY2FudCBmaW5kIHRoZSBkZXNjcmlwdG9yLCB0aGVuIGxvb2sgaW4gdGhlCisJCQkJCQkJLy8gZml4IGxpc3QuCisJCQkJCQkJaWYgKGRlc2NyaXB0b3IuZXF1YWxzKGN1cnJlbnQpID09IHRydWUpIHsKKwkJCQkJCQkJLy8gTG9vayBmb3IgYSBkZXNjcmlwdG9yIGluIHRoZSBmaXggZmlsZQorCQkJCQkJCQlkZXNjcmlwdG9yID0gR2VuVXRpbHMuZ2V0Rml4Q29kZShjb2RlZml4TGlzdCwKKwkJCQkJCQkJCQljdXJyZW50LCBpdGVtc1tJU09EYXRhLkNPVU5UUllfTkFNRV0pOworCisJCQkJCQkJCS8vIElmIHRoZXJlIGlzIG5vIGRlc2NyaXB0b3Igc3RpbGwsIGdlbmVyYXRlCisJCQkJCQkJCS8vIG9uZSEKKwkJCQkJCQkJaWYgKGRlc2NyaXB0b3IuZXF1YWxzKGN1cnJlbnQpID09IHRydWUpIHsKKwkJCQkJCQkJCWRlc2NyaXB0b3IgPSBpc29Db2RlLmdldEFscGhhMigpICsgIi0iIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkJKyBjdXJyZW50OworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJLy8gSGFuZGxlIHRoZSBVU0EgYXMgYSBzcGVjaWFsIGNhc2UKKwkJCQkJCQlpZiAoZGVzY3JpcHRvci5jb250YWlucygiVVMtIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlkYXRhID0gIiMiICsgY3VycmVudCArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCX0KKworCQkJCQkJCS8vIEdldCB0aGUgbGV4IDEgb2JqZWN0IHRvIHdoaWNoIGxleDJDdXJyZW50IGJlbG9uZ3MKKwkJCQkJCQkvLyB0by4KKwkJCQkJCQlMZXgxT2JqIGxleDFDdXJyZW50ID0gR2VuVXRpbHMubGV4MUxvb2t1cChsZXgxTGlzdCwKKwkJCQkJCQkJCWN1cnJlbnQpOworCisJCQkJCQkJaWYgKGxleDFDdXJyZW50ID09IG51bGwpIHsKKwkJCQkJCQkJU3lzdGVtLm91dAorCQkJCQkJCQkJCS5wcmludGxuKCJcdFx0Rm91bmQgcHJvYmxlbSA6ICIgKyBjdXJyZW50IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkJCSsgIiAiICsgZGVzY3JpcHRvciArICIgIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkJCQkJCSsgaXRlbXNbSVNPRGF0YS5DT1VOVFJZX05BTUVdKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQljdXJyZW50ID0gY3VycmVudAorCQkJCQkJCQkJCSsgIiwgIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBsZXgxQ3VycmVudC5nZXRGb3JtYXR0ZWRJbmRleCgpCisJCQkJCQkJCQkJKyAiLCAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGxleDFDdXJyZW50LmdldElEKCk7CisJCQkJCQkJfQorCisJCQkJCQl9CisKKwkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29tcG9zZWQgOiAiICsgZGVzY3JpcHRvciArICIgPSAiCisJCQkJCQkvLyArIGN1cnJlbnQpOworCisJCQkJCQlpZiAoZGF0YSAhPSBudWxsKSB7CisJCQkJCQkJZGF0YSArPSBkZXNjcmlwdG9yICsgIiA9ICIgKyBjdXJyZW50ICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWRhdGEgPSBkZXNjcmlwdG9yICsgIiA9ICIgKyBjdXJyZW50ICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQl9CisKKwkJCQkJCUdlblV0aWxzLmFkZERhdGEocHJvcGVydGllc0ZpbGUsIGRhdGEpOworCQkJCQkJZGF0YSA9IG51bGw7CisKKwkJCQkJfSAvLyB3aGlsZSBsb29wCisKKwkJCQkJLy8gUmVzZXQgYWxsIGxleC1yZWxhdGVkIGl0ZW1zCisJCQkJCWlmIChsZXgxRGF0YVNldCAhPSBudWxsKSB7CisJCQkJCQlsZXgxRGF0YVNldC5jbGVhcigpOworCQkJCQkJbGV4MURhdGFTZXQgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgyRGF0YVNldCAhPSBudWxsKSB7CisJCQkJCQlsZXgyRGF0YVNldC5jbGVhcigpOworCQkJCQkJbGV4MkRhdGFTZXQgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgxTGlzdCAhPSBudWxsKSB7CisJCQkJCQlsZXgxTGlzdC5jbGVhcigpOworCQkJCQkJbGV4MUxpc3QgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgyTGlzdCAhPSBudWxsKSB7CisJCQkJCQlsZXgyTGlzdC5jbGVhcigpOworCQkJCQkJbGV4Mkxpc3QgPSBudWxsOworCQkJCQl9CisKKwkJCQkJbGV4QWRtaW4xRmlsZSA9IG51bGw7CisJCQkJCWxleEFkbWluMkZpbGUgPSBudWxsOworCisJCQkJCS8vIFdlIGRvbnQgbmVlZCB0aGUgSVNPIGNvZGUgb2JqZWN0IGZvciB0aGlzIGNvdW50cnkKKwkJCQkJLy8gYW55bW9yZSwgd2UgYXJlIGRvbmUgcHJvY2Vzc2luZyBpdC4KKwkJCQkJaXNvQ29kZSA9IG51bGw7CisKKwkJCQkJLy8gQ2xvc2UgYWxsIG9wZW4gcmVzb3VyY2VzLgorCQkJCQlyZWFkZXIuY2xvc2UoKTsKKworCQkJCQlpZiAocHJvcGVydGllc0ZpbGUgIT0gbnVsbCkgeworCQkJCQkJcHJvcGVydGllc0ZpbGUuY2xvc2UoKTsKKwkJCQkJCXByb3BlcnRpZXNGaWxlID0gbnVsbDsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdEdlbmVyYXRlZCA6ICIgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWZpbGVOYW1lID0gbnVsbDsKKwkJCQkJfQorCisJCQkJCS8vIFJ1biBnYXJiYWdlIGNvbGxlY3Rpb24KKwkJCQkJLy9TeXN0ZW0uZ2MoKTsKKwkJCQl9CisKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCisJCX0KKworCX0KKworCS8qKgorCSAqIEdlbmVyYXRlIHRoZSBoZWFkZXIgY29tbWVudCBmb3IgdGhpcyBmaWxlLgorCSAqIAorCSAqIEBwYXJhbSBjb2RlCisJICogICAgICAgICAgICBJU08gMzE2Ni0xIENvZGUKKwkgKiBAcGFyYW0gbGV2ZWwKKwkgKiAgICAgICAgICAgIHRoZSBhZG1pbiBsZXZlbAorCSAqIAorCSAqIEByZXR1cm4gYSBoZWFkZXIgY29tbWVudCBmb3IgdGhlIG5ldyBmaWxlLgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGVyKElTT0NvZGUxIGNvZGUsIGludCBsZXZlbCkgeworCisJCWZpbmFsIGludCBEQVRBX0RFU0NSSVBUT1IgPSAwOworCQlmaW5hbCBpbnQgVVJMID0gMTsKKworCQkvLyBDcmVhdGUgdGhlIGZpbGUgbmFtZSBmb3IgdGhlIFVSTCBmaWxlLgorCQlTdHJpbmcgdXJsRmlsZSA9IHdvcmtzcGFjZSArIEdlbkNvbnN0YW50cy5QQVJBTVNfRElSCisJCQkJKyBHZW5Db25zdGFudHMuVVJMU19ESVI7CisJCXVybEZpbGUgKz0gY29kZS5nZXROYW1lKCkgKyAiLnR4dCI7IC8vJE5PTi1OTFMtMSQKKworCQlTdHJpbmcgaGVhZGVyID0gIiMgIiArIGNvZGUuZ2V0QWxwaGEzKCkgKyAiXyIgKyBsZXZlbCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkrICJfbm9kZS5wcm9wZXJ0aWVzICIgLy8kTk9OLU5MUy0xJAorCQkJCSsgIlxuIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEFkZCB0aGUgY29weXJpZ2h0IHN0YXRlbWVudC4KKwkJaGVhZGVyICs9IEdlblV0aWxzLmdldENvcHlyaWdodCgpOworCisJCS8vIEFkZCBhbiBleHBsYW5hdGlvbiBvZiB0aGUga2V5IGZvcm1hdCBpbiBvdXIgZGF0YSBmaWxlcy4KKwkJaGVhZGVyICs9IEdlblV0aWxzLmdldEtleUZvcm1hdEV4cGxhbmF0aW9uKCk7CisKKwkJaGVhZGVyICs9ICIjIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgd2lsbCBpbnRlcnByZXQgdGhlIHJlc3Qgb2YgdGhlIGZpbGUncyBjb250ZW50c1xuIjsgLy8kTk9OLU5MUy0xJAorCQloZWFkZXIgKz0gIlJFQ09SRF9DTEFTU05BTUUgPSBvcmcuZWNsaXBzZS5zdGVtLmludGVybmFsLmRhdGEuQ291bnRyeUdyYXBoUmVjb3JkJENvdW50cnlOb2RlR3JhcGhSZWNvcmRcblxuIjsgLy8kTk9OLU5MUy0xJAorCisJCWhlYWRlciArPSAiIyBUaGUgSVNPLTMxNjYtMSBhbHBoYTMgY29kZSBmb3IgdGhlIGNvdW50cnlcbiI7IC8vJE5PTi1OTFMtMSQKKwkJaGVhZGVyICs9ICJJU09LRVkgPSAiICsgY29kZS5nZXRBbHBoYTMoKSArICJcblxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJaGVhZGVyICs9ICIjIFRoZSBhZG1pbmlzdHJhdGlvbiBsZXZlbCBvZiB0aGUgbm9kZSBkYXRhXG4iOyAvLyROT04tTkxTLTEkCisJCWhlYWRlciArPSAiQURNSU5fTEVWRUwgPSAiICsgbGV2ZWwgKyAiXG5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCWhlYWRlciArPSAiIyBUaGlzIGlzIHRoZSBkYXRlIHJhbmdlIGZvciB3aGljaCB0aGUgYXJlYSB2YWx1ZXMgaW4gdGhpcyBmaWxlIGFyZSB2YWxpZCBcbiI7IC8vJE5PTi1OTFMtMSQKKwkJaGVhZGVyICs9ICIjIFNlZSBodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvMS4xL3ZhbGlkXG4iOyAvLyROT04tTkxTLTEkCisJCWhlYWRlciArPSAiVkFMSUQgPSBzdGFydD0xOTAwLTAxLTAxO1xuXG4iOyAvLyROT04tTkxTLTEkCisKKwkJLy8gVGhlIFVuaXRlZCBOYXRpb25zIGRhdGEgcG9saWN5IGFwcGxpZXMgb25seSB0byBFdXJvcGUgOgorCQkvLyBoZWFkZXIgKz0gR2VuVXRpbHMuZ2V0VU5Qb2xpY3koKTsKKworCQloZWFkZXIgKz0gIiMgVGhpcyBpcyB0aGUgc291cmNlIG9mIHRoZSBkYXRhXG4iOyAvLyROT04tTkxTLTEkCisKKwkJdXJsRmlsZSArPSBjb2RlLmdldE5hbWUoKSArICIudHh0IjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIE9wZW4gdGhlIFVSTCBmaWxlIGZvciB0aGlzIGNvdW50cnkuCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidXJsIGZpbGUgPSAiICsgdXJsRmlsZSk7CisJCUJ1ZmZlcmVkUmVhZGVyIHVybFJlYWRlciA9IEdlblV0aWxzLm9wZW5SZWFkZXIodXJsRmlsZSk7CisKKwkJdHJ5IHsKKwkJCS8vIEFkZCBhbGwgdGhlIHNvdXJjZSBVUkxzIGZvciB0aGlzIGNvdW50cnkuCisJCQlpZiAodXJsUmVhZGVyICE9IG51bGwpIHsKKwkJCQlTdHJpbmcgYnVmZmVyID0gbnVsbDsKKwkJCQl3aGlsZSAoR2VuVXRpbHMuRU9GKGJ1ZmZlciA9IHVybFJlYWRlci5yZWFkTGluZSgpKSAhPSB0cnVlKSB7CisKKwkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJCdWZmZXIgPSAiICsgYnVmZmVyKTsKKworCQkJCQkvLyBUb2tlbml6ZQorCQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihidWZmZXIsICIqIik7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkvLyBXZSBrbm93IHRoYXQgd2UgZXhwZWN0IG9ubHkgdHdvIHRva2Vucy4gR2V0IHRoZW0uIE9yZGVyCisJCQkJCS8vIG1hdHRlcnMgaGVyZS4KKwkJCQkJU3RyaW5nW10gdG9rZW5zID0gbmV3IFN0cmluZ1syXTsKKwkJCQkJdG9rZW5zW0RBVEFfREVTQ1JJUFRPUl0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisJCQkJCXRva2Vuc1tVUkxdID0gdG9rZW5pemVyLm5leHRUb2tlbigpOworCisJCQkJCWlmIChHZW5VdGlscy5pc1NvdXJjZVVSTCh1cmxTZXQsIHRva2Vuc1tEQVRBX0RFU0NSSVBUT1JdKSA9PSB0cnVlKSB7CisKKwkJCQkJCS8vIHRyeSB7CisJCQkJCQkvLyBJcyB0aGlzIGRhdGEgZGVzY3JpcHRvciBvbmUgb2Ygb3VyIGFjdGl2ZSBkYXRhCisJCQkJCQkvLyBzb3VyY2VzID8KKwkJCQkJCWlmIChHZW5VdGlscy5pc0FjdGl2ZVVSTCh1cmxTdGF0dXMsCisJCQkJCQkJCXRva2Vuc1tEQVRBX0RFU0NSSVBUT1JdKSA9PSBmYWxzZSkgeworCQkJCQkJCS8vIE5vLCBpdCBpcyBub3Qgb25lIGFuIGFjdGl2ZSBVUkwsIHNvIGNvbW1lbnQKKwkJCQkJCQkvLyBpdAorCQkJCQkJCS8vIG91dC4KKwkJCQkJCQkvLyBoZWFkZXIgKz0gIiMgIiArICJTT1VSQ0UgPSAiICsKKwkJCQkJCQkvLyBVUkxFbmNvZGVyLmVuY29kZSh0b2tlbnNbVVJMXSwgIlVURi04IikgKyAiXG4iOworCQkJCQkJCWhlYWRlciArPSAiIyAiICsgIlNPVVJDRSA9ICIgKyB0b2tlbnNbVVJMXSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIGhlYWRlciArPSAiU09VUkNFID0gIiArCisJCQkJCQkJLy8gVVJMRW5jb2Rlci5lbmNvZGUodG9rZW5zW1VSTF0sICJVVEYtOCIpICsgIlxuIjsKKwkJCQkJCQloZWFkZXIgKz0gIlNPVVJDRSA9ICIgKyB0b2tlbnNbVVJMXSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJfQorCisJCQkJCQkvLyB9IGNhdGNoIChqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjoiICsgZS5nZXRNZXNzYWdlKCkpOworCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAorCQkJCQkJLy8gfQorCQkJCQl9CisKKwkJCQl9IC8vIHdoaWxlCisKKwkJCQkvLyBUbyBtYWtlIGl0IGxvb2sgYmV0dGVyLCBhZGQgYW4gZXh0cmEgbmV3IGxpbmUuCisJCQkJaGVhZGVyICs9ICJcbiI7IC8vJE5PTi1OTFMtMSQKKworCQkJfQorCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vCisJCX0KKworCQloZWFkZXIgKz0gIiMgVGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbGF0aXR1ZGUvbG9uZ2l0dWRlIGRhdGEgZm9yIHRoZSBub2RlIFxuIjsgLy8kTk9OLU5MUy0xJAorCQloZWFkZXIgKz0gIlNQQVRJQUxfVVJJID0gIjsgLy8kTk9OLU5MUy0xJAorCQloZWFkZXIgKz0gInBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvIjsgLy8kTk9OLU5MUy0xJAorCQloZWFkZXIgKz0gY29kZS5nZXRBbHBoYTMoKSArICIvIiArIGNvZGUuZ2V0QWxwaGEzKCkgKyAiXyIgKyBsZXZlbCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkrICJfTUFQLnhtbFxuXG4iOyAvLyROT04tTkxTLTEkCisKKwkJcmV0dXJuIGhlYWRlcjsKKwl9CisKKwkvKioKKwkgKiBFeGVjdXRpb24gZW50cnkgcG9pbnQKKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJLy8gZmluYWwgaW50IElTT18zMTY2XzEgPSAwOworCQkvLyBmaW5hbCBpbnQgSVNPXzMxNjZfMiA9IDE7CisJCS8vIGZpbmFsIGludCBGSVhfRklMRSA9IDI7CisJCS8vIGZpbmFsIGludCBUQVJHRVRfTElTVCA9IDM7CisJCS8vIGZpbmFsIGludCBMRVhfRElSID0gNDsKKwkJLy8gZmluYWwgaW50IE9VVFBVVF9ESVIgPSA1OworCQkvLyBmaW5hbCBpbnQgUEFSQU1TID0gNjsKKwkJLy8KKwkJLy8gaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQKKwkJLy8gLnByaW50bG4oIlx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyA6ICIpOworCQkvLyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBJU08gMzE2Ni0xIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgSVNPIDMxNjYtMiBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IElTTyBmaXggZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBUYXJnZXQgY291bnRyaWVzIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgTGV4aWNvZ3JhcGhpYyBzb3J0aW5nIGRpcmVjdG9yeSIpOworCQkvLyAvLyROT04tTkxTLTEkJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgT3V0cHV0IGRpcmVjdG9yeSIpOyAvLyROT04tTkxTLTEkCisJCS8vIHJldHVybjsKKwkJLy8gfQorCQkvLworCQkvLyBOb2RlRGF0YUdlbmVyYXRvciBnZW4gPSBuZXcgTm9kZURhdGFHZW5lcmF0b3IoYXJnc1tJU09fMzE2Nl8xXSwKKwkJLy8gYXJnc1tJU09fMzE2Nl8yXSwgYXJnc1tGSVhfRklMRV0sIGFyZ3NbVEFSR0VUX0xJU1RdLAorCQkvLyBhcmdzW0xFWF9ESVJdLCBhcmdzW09VVFBVVF9ESVJdKTsKKwkJLy8gZ2VuLnJ1bigpOworCisJCWZpbmFsIGludCBDT05GSUdfRklMRSA9IDA7CisJCWZpbmFsIGludCBQQVJBTVMgPSAxOworCisJCWlmIChhcmdzLmxlbmd0aCA8IFBBUkFNUykgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0LS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJcdFx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50KHMpIDogIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0IENvbmZpZ3VyYXRpb24gZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJfQorCisJCU5vZGVEYXRhR2VuZXJhdG9yIGdlbiA9IG5ldyBOb2RlRGF0YUdlbmVyYXRvcihhcmdzW0NPTkZJR19GSUxFXSk7CisJCWdlbi5ydW4oKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9Qb2x5Z29uQXJlYUdlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9Qb2x5Z29uQXJlYUdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiM2RhOWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL1BvbHlnb25BcmVhR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw5NzAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7CisKK2ltcG9ydCBqYXZhLmF3dC5Qb2x5Z29uOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFNURU0gSUkgRGF0YSBNaWdyYXRpb24vR2VuZXJhdGlvbiBVdGlsaXRpZXMgLS0gVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MgdGhhdAorICogY29tcHV0ZXMgdGhlIGFyZWEgb2YgYSBwb2x5Z29uIGluIHBvbHlnb24gdW5pdHMuIFRoaXMgaXMgdXNlZnVsIHRvIGNvbXB1dGUKKyAqIHRoZSBhcHByb3hpbWF0ZSBhcmVhIG9mIGEgbG9jYXRpb24gd2hlbiB3ZSBkb250IGtub3cgdGhlIGV4YWN0IGFyZWEgdmFsdWUuCisgKiAKKyAqIAorICogVG8gY29uZmlndXJlLCBzZWUgY29uZmlndXJhdGlvbiBmaWxlIDoKKyAqIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL1BvbHlnb25BcmVhR2VuZXJhdG9yLmNvbmZpZworICogCisgKiAKKyAqIFRvIHJ1biwgYWRkIHBhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlIGluIHRoZSBydW4gcHJvZmlsZSAoaS5lLgorICogQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxjb25maWd1cmF0aW9uXFBvbHlnb25BcmVhR2VuZXJhdG9yLmNvbmZpZykKKyAqIAorICogQWRkIHRoZSBmb2xsb3dpbmcgdmFsdWVzIHRvIHRoZSBydW4gY29uZmlndXJhdGlvbjoKKyAqIAorICogQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXGlucHV0XElTTzMxNjYtMVxJU08zMTY2XzFfZW4udHh0CisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRcSVNPMzE2Ni0yXElTTzMxNjZfMl9saXN0LnR4dAorICogQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXGlucHV0XElTT0ZpeFxJU09fTEVWRUwxX0ZJWC50eHQKKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxBcmVhUG9wdWxhdGlvbkRhdGFcCisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRccHJvcGVydGllc1xDb3VudHJpZXMudHh0CisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRcc29ydFwKKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxQb2x5Z29uQXJlYXNcCisgKiAKKyAqIAorICogCisgKi8KKworcHVibGljIGNsYXNzIFBvbHlnb25BcmVhR2VuZXJhdG9yIHsKKworCS8qKgorCSAqIE91ciBzb3VyY2UgZmlsZXMgZm9yIElTTyAzMTY2LTEgY29kZXMgYW5kIGZvciB0aGUgbGlzdCBvZiB0YXJnZXQKKwkgKiBjb3VudHJpZXMuCisJICovCisKKwlwcml2YXRlIFN0cmluZyBpc28zMTY2XzEgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgaXNvMzE2Nl8yID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIGZpeEZpbGUgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgYXJlYURhdGEgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0RmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBsZXhEaXIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RGlyID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIHdvcmtzcGFjZSA9IG51bGw7CisKKwkvKioKKwkgKiBMaXN0IGZvciBJU08gMzE2Ni0xIGNvZGVzIGFuZCB0YXJnZXQgY291bnRyaWVzLgorCSAqLworCisJTGlzdCB0YXJnZXRMaXN0ID0gbnVsbDsKKworCUxpc3QgY29kZUxpc3QgPSBudWxsOworCisJTGlzdCBjb2RlZml4TGlzdCA9IG51bGw7CisKKwlMaXN0IGFyZWFMaXN0ID0gbnVsbDsKKworCS8qIEhhc2ggbWFwIHRvIGhvbGQgYWdncmVnYXRlIHBvbHlnb24gYXJlYSB2YWx1ZXMgKi8KKwlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBhcmVhVmFsdWVzID0gbnVsbDsKKworCS8qKgorCSAqIFN0cmluZyB1c2VkIHRvIGluZGljYXRlIGRlZmF1bHQgdmFsdWUgZm9yIHVua25vd24gYXJlYXMuCisJICovCisJU3RyaW5nIERFRkFVTFQgPSAiMCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICogCisJICogQHBhcmFtIGlzbzMxNjZfMSAtCisJICogICAgICAgICAgICBkYXRhIGZpbGUgd2l0aCB0aGUgSVNPMzE2Ni0xIEFMUEhBXzIgYW5kIEFMUEhBXzMgY29kZXMuCisJICogQHBhcmFtIGlzbzMxNjZfMiAtCisJICogICAgICAgICAgICBkYXRhIGZpbGUgd2l0aCB0aGUgSVNPMzE2Ni0yIGNvZGVzLgorCSAqIEBwYXJhbSBmaXhGaWxlIC0KKwkgKiAgICAgICAgICAgIGZpbGUgY29udGFpbmluZyBtaXNzaW5nIElTTzMxNjYtMiBjb2RlcworCSAqIEBwYXJhbSBhcmVhRGF0YSAtCisJICogICAgICAgICAgICBmaWxlIGNvbnRhaW5pbmcgYXJlYSBkYXRhIGluIFNRIEtNCisJICogQHBhcmFtIHRhcmdldEZpbGUKKwkgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGNvdW50cmllcyBmb3Igd2hpY2ggd2Ugd2lsbCBnZW5lcmF0ZSBHTUwgZmlsZXMKKwkgKiBAcGFyYW0gbGV4RGlyCisJICogICAgICAgICAgICBmb2xkZXIgY29udGFpbmluZyBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgZmlsZXMKKwkgKiBAcGFyYW0gb3V0cHV0RGlyCisJICogICAgICAgICAgICB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIEdNTCBmaWxlcyB3ZSBnZW5lcmF0ZQorCSAqLworCS8vIHB1YmxpYyBQb2x5Z29uQXJlYUdlbmVyYXRvcihTdHJpbmcgaXNvMzE2Nl8xLCBTdHJpbmcgaXNvMzE2Nl8yLAorCS8vIFN0cmluZyBmaXhGaWxlLCBTdHJpbmcgYXJlYURhdGEsIFN0cmluZyB0YXJnZXRGaWxlLCBTdHJpbmcgbGV4RGlyLAorCS8vIFN0cmluZyBvdXRwdXREaXIpIHsKKwkvLyAvLyBTZXQgdmFsdWVzIG9mIGdsb2JhbCB2YXJpYWJsZXMuCisJLy8gdGhpcy5pc28zMTY2XzEgPSBpc28zMTY2XzE7CisJLy8gdGhpcy5pc28zMTY2XzIgPSBpc28zMTY2XzI7CisJLy8gdGhpcy5maXhGaWxlID0gZml4RmlsZTsKKwkvLyB0aGlzLmFyZWFEYXRhID0gYXJlYURhdGE7CisJLy8gdGhpcy50YXJnZXRGaWxlID0gdGFyZ2V0RmlsZTsKKwkvLyB0aGlzLmxleERpciA9IGxleERpcjsKKwkvLyB0aGlzLm91dHB1dERpciA9IG91dHB1dERpcjsKKwkvLyB0YXJnZXRMaXN0ID0gbnVsbDsKKwkvLyB9CisJLyoqCisJICogQHBhcmFtIGNvbmZpZ0ZpbGUKKwkgKi8KKwlwdWJsaWMgUG9seWdvbkFyZWFHZW5lcmF0b3IoU3RyaW5nIGNvbmZpZ0ZpbGUpIHsKKworCQkvLyBMb2FkIGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcworCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB2YXJzID0gR2VuVXRpbHMubG9hZENvbmZpZ0ZpbGUoY29uZmlnRmlsZSk7CisKKwkJYXJlYVZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisJCVNldDxTdHJpbmc+IGtleXMgPSB2YXJzLmtleVNldCgpOworCQlJdGVyYXRvciBpdCA9IGtleXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJU3RyaW5nIHZhciA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKworCQkJLy8gQXNzaWduIHZhbHVlcyB0byBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyA6CisJCQlpZiAodmFyLmVxdWFscygiV09SS1NQQUNFIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXdvcmtzcGFjZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIklTTzMxNjZfMSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpc28zMTY2XzEgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJJU08zMTY2XzIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJaXNvMzE2Nl8yID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiSVNPX0ZJWCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlmaXhGaWxlID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiQVJFQV9QT1AiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJYXJlYURhdGEgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJUQVJHRVRfTElTVCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl0YXJnZXRGaWxlID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiTEVYX0RJUiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlsZXhEaXIgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJPVVRQVVQiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJb3V0cHV0RGlyID0gdmFycy5nZXQodmFyKTsKKwkJCX0KKworCQl9IC8vIHdoaWxlCisKKwkJLy8gVGhlIHdvcmtzcGFjZSB2YXJpYWJsZSBzaG91bGQgZW5kIHdpdGggYSBzbGFzaCBjaGFyYWN0ZXIKKwkJaWYgKHdvcmtzcGFjZS5lbmRzV2l0aCgiXFwiKSA9PSBmYWxzZSkgeyAvLyROT04tTkxTLTEkCisJCQl3b3Jrc3BhY2UgKz0gIlxcIjsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJU3RyaW5nIHBhdGggPSB3b3Jrc3BhY2UgKyBHZW5Db25zdGFudHMuUEFSQU1TX0RJUjsKKworCQkvLyBTZXQgcmVtYWluaW5nIGNvbmZpZyB2YXJzIHVzaW5nIFdPUktTUEFDRSAod29ya3NwYWNlIHJlbGF0aXZlKQorCQlpZiAoaXNvMzE2Nl8xID09IG51bGwpIHsKKwkJCWlzbzMxNjZfMSA9IHBhdGggKyBHZW5Db25zdGFudHMuSVNPMzE2Nl8xX0ZJTEU7CisJCX0KKwkJaWYgKGlzbzMxNjZfMiA9PSBudWxsKSB7CisJCQlpc28zMTY2XzIgPSBwYXRoICsgR2VuQ29uc3RhbnRzLklTTzMxNjZfMl9GSUxFOworCQl9CisJCWlmIChmaXhGaWxlID09IG51bGwpIHsKKwkJCWZpeEZpbGUgPSBwYXRoICsgR2VuQ29uc3RhbnRzLklTT0ZJWF9GSUxFOworCQl9CisJCWlmICh0YXJnZXRGaWxlID09IG51bGwpIHsKKwkJCXRhcmdldEZpbGUgPSBwYXRoICsgR2VuQ29uc3RhbnRzLkNPVU5UUklFU19MSVNUOworCQl9CisJCWlmIChhcmVhRGF0YSA9PSBudWxsKSB7CisJCQlhcmVhRGF0YSA9IHBhdGggKyBHZW5Db25zdGFudHMuQVJFQV9QT1BVTEFUSU9OX0RJUjsKKwkJfQorCQlpZiAobGV4RGlyID09IG51bGwpIHsKKwkJCWxleERpciA9IHBhdGggKyBHZW5Db25zdGFudHMuTEVYX0RJUjsKKwkJfQorCQlpZiAob3V0cHV0RGlyID09IG51bGwpIHsKKwkJCW91dHB1dERpciA9IHBhdGggKyBHZW5Db25zdGFudHMuUE9MWUdPTl9BUkVBU19ESVI7CisJCX0KKworCQl0YXJnZXRMaXN0ID0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0IHRoZSB2YWx1ZSBvZiBzdHJpbmcgdG8gYSBkb3VibGUKKwkgKiAKKwkgKiBAcGFyYW0gc3RyCisJICogICAgICAgICAgICBhIG51bWVyaWMgc3RyaW5nCisJICogCisJICogQHJldHVybiBkb3VibGUgdmFsdWUgb2YgYSBudW1lcmljIHN0cmluZworCSAqLworCXByb3RlY3RlZCBkb3VibGUgZ2V0RG91YmxlKFN0cmluZyBzdHIpIHsKKwkJRG91YmxlIGhvbGRlciA9IG5ldyBEb3VibGUoc3RyKTsKKwkJcmV0dXJuIGhvbGRlci5kb3VibGVWYWx1ZSgpOworCX0KKworCS8qKgorCSAqIFJlbW92ZSBkZWNpbWFsIHBvaW50IGZyb20gdmFsdWUgYW5kIHJldHVybiBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisJICogCisJICogQHBhcmFtIGRlZ3JlZXMKKwkgKiAgICAgICAgICAgIGFuIGFuZ2xlIGluIGRlZ3JlZXMKKwkgKiAKKwkgKiBAcmV0dXJuIGZvcm1hdHRlZCBzdHJpbmcgYSBmb3JtYXR0ZWQgYW5nbGUgaW4gZGVncmVzcworCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZm9ybWF0KGRvdWJsZSBkZWdyZWVzKSB7CisJCVN0cmluZyBzdHIgPSBudWxsOworCQlTdHJpbmcgc3ViU3RyID0gbnVsbDsKKworCQlzdHIgPSBEb3VibGUudG9TdHJpbmcoZGVncmVlcyk7CisJCWludCBkb3QgPSBzdHIuaW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCisJCXN1YlN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgc3RyLmxlbmd0aCgpIDwgZG90ICsgNyA/IHN0ci5sZW5ndGgoKQorCQkJCTogZG90ICsgNyk7CisJCXJldHVybiBzdWJTdHI7CisKKwl9IC8vIGZvcm1hdERhdGEKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNldHMgdXAgYW5kIHJ1bnMgdGhpcyBnZW5lcmF0b3IuCisJICogCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIGNvdW50cmllcyB3ZSB3YW50LgorCQl0YXJnZXRMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KHRhcmdldEZpbGUpOworCisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgSVNPMzE2Ni0xIEFMUEhBMiwgQUxQSEEzLCBhbmQKKwkJLy8gbnVtZXJpYyBjb2Rlcy4KKwkJY29kZUxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QoaXNvMzE2Nl8xKTsKKworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIG1pc3NpbmcgSVNPMzE2Ni0yIGNvZGVzCisJCWNvZGVmaXhMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KGZpeEZpbGUpOworCisJCS8vIE5vdywgcHJvY2VzcyBlYWNoIGl0ZW0gaW4gdGhlIHRhcmdldCBsaXN0LgorCQlwcm9jZXNzKCk7CisKKwl9CisKKwkvKioKKwkgKiBQcm9jZXNzIG91ciBnbG9iYWwgbGlzdCBvZiB0YXJnZXQgY291bnRyaWVzLiBGb3IgZWFjaCBjb3VudHJ5IGluIGxpc3QsCisJICogZ2VuZXJhdGUgaXRzIEdNTCBmaWxlLgorCSAqIAorCSAqLworCXByb3RlY3RlZCB2b2lkIHByb2Nlc3MoKSB7CisKKwkJLy8gQSB3cml0ZXIgZm9yIHRoZSBuZXcgZmlsZSB3ZSBhcmUgY3JlYXRpbmcuCisJCVByaW50V3JpdGVyIHBvbHlnb25BcmVhRmlsZSA9IG51bGw7CisKKwkJLy8gT2JqZWN0IGhvbGRpbmcgSVNPMzE2Ni0xIHJlbGF0ZWQgZGF0YS4KKwkJSVNPQ29kZTEgaXNvQ29kZSA9IG51bGw7CisKKwkJLy8gTmFtZSBvZiB0aGUgbmV3IHByb3BlcnRpZXMgZmlsZS4KKwkJU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKKworCQkvLyBBIGxpc3QgZm9yIElTTyAzMTY2LTIgb2JqZWN0cworCQlMaXN0IGlzbzJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisJCS8vIEZpbGVuYW1lcyBmb3IgbGV4MSBhbmQgbGV4MiBmaWxlcyBmb3IgYSBnaXZlbiBjb3VudHJ5LgorCQlTdHJpbmcgbGV4QWRtaW4xRmlsZSA9IG51bGw7CisJCVN0cmluZyBsZXhBZG1pbjJGaWxlID0gbnVsbDsKKworCQkvLyBMaXN0cyBob2xkaW5nIHRoZSBsZXgxIGFuZCBsZXgyIHZhbHVlcy4KKwkJLy8gTk9URTogbGV4IHZhbHVlcyBhcmUgdGhlIGxleGljb2dyYXBoaWNhbGx5IHNvcnRlZCB2YWx1ZXMgZm9yCisJCS8vIGFkbWluaXN0cmF0aW9uIGxldmVscy4KKwkJTGlzdDxTdHJpbmc+IGxleDFEYXRhU2V0ID0gbnVsbDsKKwkJTGlzdDxTdHJpbmc+IGxleDJEYXRhU2V0ID0gbnVsbDsKKworCQkvLyBMaXN0cyBmb3IgaG9sZGluZyBsZXgxIGFuZCBsZXgyIG9iamVjdHMgZm9yIGEgZ2l2ZW4gY291bnRyeS4KKwkJTGlzdDxMZXgxT2JqPiBsZXgxTGlzdCA9IG51bGw7CisJCUxpc3Q8TGV4Mk9iaj4gbGV4Mkxpc3QgPSBudWxsOworCisJCS8vIFN1bSBvZiB0aGUgYXJlYXMgYXQgbGV2ZWwgMQorCQkvLyBkb3VibGUgYXJlYVN1bSA9IDAuMDsKKworCQlpbnQgc2l6ZSA9IHRhcmdldExpc3Quc2l6ZSgpOworCisJCS8vIEl0ZXJhdGUgZm9yIGV2ZXJ5IGNvdW50cnkgYW5kIGNyZWF0ZSBpdHMgR01MIGRhdGEgZmlsZS4KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKworCQkJLy8gR2V0IHRoZSBuZXh0IGNvdW50cnkgaW4gdGhlIGxpc3QuCisJCQlTdHJpbmcgZmlsZSA9ICgoU3RyaW5nKSB0YXJnZXRMaXN0LmdldChpKSkudHJpbSgpOworCisJCQkvLyBBbiBpbmRleCBmb3IgdW5rbndvbiBvciBuLmEuIGVudHJpZXMKKwkJCWludCB1bmtDb3VudGVyID0gMTsKKworCQkJLy8gV2UgdXNlIHRoaXMgbGlzdCB0byBrZWVwIHRyYWNrIG9mIGR1cGxpY2F0ZWQgcG9seWdvbnMuCisJCQlMaXN0PFNURU1Qb2x5Z29uPiBwb2x5Z29ucyA9IG5ldyBBcnJheUxpc3Q8U1RFTVBvbHlnb24+KCk7CisKKwkJCS8vIE9wZW4gdGhlIGRhdGEgc291cmNlIGZpbGUgZm9yIHRoaXMgY291bnRyeS4KKwkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IEdlblV0aWxzLm9wZW5SZWFkZXIoZmlsZSk7CisKKwkJCVN5c3RlbS5vdXQKKwkJCQkJLnByaW50bG4oIlx0XHQ8PDw8IFBPTFlHT04gQVJFQSBHRU5FUkFUT1IgLS0gUHJvY2Vzc2luZyBjb3VudHJ5IDogIiArIGZpbGUgKyAiID4+Pj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQl0cnkgeworCisJCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7CisKKwkJCQkJU3RyaW5nIGJ1ZmZlciA9IG51bGw7CisJCQkJCS8vIERlc2NyaWJlcyBsZXZlbAorCQkJCQkvLyBvZiBkYXRhIHdlCisJCQkJCS8vIGFyZSBub3cgcHJvY2Vzc2luZyA6IExFVkVMMCwgTEVWRUwxLCBvciBMRVZFTDIuCisJCQkJCWludCBsZXZlbCA9IC0xOworCisJCQkJCS8vIFJlY29yZCB0aGUgcHJldmlvdXMgdHlwZS4KKwkJCQkJaW50IG9sZGxldmVsID0gbGV2ZWwgLSAxOworCisJCQkJCS8vIFN0cmluZyB1c2VkIHRvIGlnbm9yZSByZXBlYXRlZCBlbnRyaWVzLgorCQkJCQkvLyBTdHJpbmcgcmVwZWF0ZWRFbnRyaWVzID0gbnVsbDsKKwkJCQkJTGlzdDxTdHJpbmc+IGVudHJ5TGlzdCA9IG51bGw7CisKKwkJCQkJd2hpbGUgKEdlblV0aWxzLkVPRihidWZmZXIgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gdHJ1ZSkgeworCisJCQkJCQkvLyBUaGUgZGF0YSB3ZSB3YW50IHRvIHdyaXRlIHRvIHRoZSBuZXcgR01MIGZpbGUuCisJCQkJCQlTdHJpbmcgb3V0cHV0ID0gIiAiOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlIG1hcmsgYWxsIHVua25vd24gZGF0YS4KKwkJCQkJCWJ1ZmZlciA9IGJ1ZmZlci5yZXBsYWNlKCIsLCIsICIsVU5LTk9XTiwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQkJCS8vIFdlIHRha2UgYSBjaHVuayBvZiB0aGUgZGF0YSBbQlVGRkVSX01JTixCVUZGRVJfTUFYXQorCQkJCQkJLy8gdG8gbWFrZSBwcm9jZXNzc2luZyBtb3JlCisJCQkJCQkvLyBlZmZpY2llbnQsIHdlIGRvbnQgbmVlZCBhbGwgb2YgaXQuCisJCQkJCQlpbnQgQlVGRkVSX01JTiA9IDA7CisJCQkJCQlpbnQgQlVGRkVSX01BWCA9IDEyNTsKKworCQkJCQkJU3RyaW5nW10gaXRlbXMgPSBHZW5VdGlscworCQkJCQkJCQkuZXh0cmFjdChidWZmZXIubGVuZ3RoKCkgPCBCVUZGRVJfTUFYID8gYnVmZmVyCisJCQkJCQkJCQkJOiBidWZmZXIuc3Vic3RyaW5nKEJVRkZFUl9NSU4sCisJCQkJCQkJCQkJCQlCVUZGRVJfTUFYKSk7CisKKwkJCQkJCS8vIEdldCB0aGUgY291bnRyeSBuYW1lCisJCQkJCQlTdHJpbmcgY291bnRyeSA9IGl0ZW1zW0lTT0RhdGEuQ09VTlRSWV9OQU1FXTsKKworCQkJCQkJLy8gR2V0IHRoZSBJU08zMTY2LTEgaW5mbyBmb3IgdGhpcyBjb3VudHJ5CisJCQkJCQlpZiAoaXNvQ29kZSA9PSBudWxsKSB7CisJCQkJCQkJaXNvQ29kZSA9IEdlblV0aWxzLmdldElTT0NvZGUoY291bnRyeSwgY29kZUxpc3QpOworCQkJCQkJfQorCisJCQkJCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIGFyZWEgZGF0YQorCQkJCQkJLy8gZm9yIHRoaXMKKwkJCQkJCS8vIGNvdW50cnkuCisJCQkJCQlpZiAoYXJlYUxpc3QgPT0gbnVsbCkgeworCQkJCQkJCVN0cmluZyBuYW1lID0gYXJlYURhdGEgKyBpc29Db2RlLmdldE5hbWUoKQorCQkJCQkJCQkJKyAiX0FSRUEudHh0IjsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCWFyZWFMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KG5hbWUpOworCQkJCQkJfQorCisJCQkJCQkvLyBHZXQgdGhlIHR5cGUgb2YgdGhlIGRhdGEgd2UgYXJlIHByb2Nlc3NpbmcuCisJCQkJCQlsZXZlbCA9IEdlblV0aWxzLmdldExldmVsKGl0ZW1zKTsKKworCQkJCQkJaWYgKGxldmVsICE9IDAgJiYgaXNvMkxpc3QgIT0gbnVsbCkgeworCQkJCQkJCS8vIExvYWQgdGhlIElTTyAzMTY2LTIgb2JqZWN0cyBmb3IgdGhpcyBjb3VudHJ5CisJCQkJCQkJaXNvMkxpc3QgPSBHZW5VdGlscy5sb2FkSVNPMihpc28zMTY2XzIpOworCQkJCQkJfQorCisJCQkJCQkvLyBUaGlzIHZhcmlhYmxlIGluZGljYXRlcyBhIHRyYW5zaXRpb24gaW4gb3VyIGRhdGEKKwkJCQkJCS8vIHByb2Nlc3NpbmcKKwkJCQkJCWJvb2xlYW4gdHJhbnNpdGlvbiA9IChsZXZlbCAhPSBvbGRsZXZlbCkgPyB0cnVlIDogZmFsc2U7CisKKwkJCQkJCS8vIFRoZSBjdXJyZW50IGVudGl0eSB3ZSBhcmUgZGVhbGluZyB3aXRoLgorCQkJCQkJLy8gQmFzZWQgb24gaXRzIGFkbWluIGxldmVsIGl0IGNhbiBiZSBhIGNvdW50cnksIGEKKwkJCQkJCS8vIGNvdW50eSwgZXRjOworCQkJCQkJU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisJCQkJCQkvLyBEZXNjcmlwdG9yIGZvciBjdXJyZW50IGVudHJ5LgorCQkJCQkJU3RyaW5nIGRlc2NyaXB0b3IgPSBudWxsOworCisJCQkJCQlpZiAodHJhbnNpdGlvbiA9PSB0cnVlKSB7CisKKwkJCQkJCQkvLyBpZiAob2xkbGV2ZWwgPj0gMCkgeworCQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3VtIGFyZWEgZm9yIGxldmVsICIKKwkJCQkJCQkvLyArIGxldmVsICsgIiBpcyA6ICIgKyBhcmVhU3VtKTsKKwkJCQkJCQkvLyBhcmVhU3VtID0gMC4wOworCQkJCQkJCS8vIH0KKworCQkJCQkJCS8vIFdyaXRlIGFsbCBrZXlzIGluIG91ciBoYXNoIG1hcAorCQkJCQkJCWlmIChhcmVhVmFsdWVzLmlzRW1wdHkoKSA9PSBmYWxzZSkgeworCQkJCQkJCQlTZXQ8U3RyaW5nPiBrZXlzID0gYXJlYVZhbHVlcy5rZXlTZXQoKTsKKwkJCQkJCQkJSXRlcmF0b3IgaXQgPSBrZXlzLml0ZXJhdG9yKCk7CisJCQkJCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCQkJCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisJCQkJCQkJCQlTdHJpbmcgdmFsdWUgPSBhcmVhVmFsdWVzLmdldChrZXkpOworCQkJCQkJCQkJb3V0cHV0ID0ga2V5ICsgIjoiICsgdmFsdWUgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCQkJCQorCQkJCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShwb2x5Z29uQXJlYUZpbGUsIG91dHB1dCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJLy8gQ2xlYXIgb3VyIGhhc2ggbWFwCisJCQkJCQkJCWFyZWFWYWx1ZXMuY2xlYXIoKTsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBLZWVwIHRyYWNrIG9mIHByZXZpb3VzIGxldmVsIGluIG9yZGVyIHRvIGRldGVjdAorCQkJCQkJCS8vIHRyYW5zaXRpb25zLgorCQkJCQkJCW9sZGxldmVsID0gbGV2ZWw7CisJCQkJCQkJLy8gUmVzZXQgb3VyIHJlcGVhdGVkIGhpc3RvcnkKKwkJCQkJCQlpZiAoZW50cnlMaXN0ICE9IG51bGwpIHsKKwkJCQkJCQkJZW50cnlMaXN0LmNsZWFyKCk7CisJCQkJCQkJfQorCQkJCQkJCWVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJCQkJCS8vIFJlc2V0IGNvdW50ZXIgb2YgVU5LTk9XTiBhbmQgTi5BLiBlbnRyaWVzLgorCQkJCQkJCXVua0NvdW50ZXIgPSAxOworCQkJCQkJCS8vIENsb3NlIHRoZSBwcmV2aW91cyBmaWxlCisJCQkJCQkJaWYgKHBvbHlnb25BcmVhRmlsZSAhPSBudWxsKSB7CisJCQkJCQkJCXBvbHlnb25BcmVhRmlsZS5jbG9zZSgpOworCQkJCQkJCX0KKworCQkJCQkJCS8vIElmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgZm9yIHRoaXMgY291bnRyeSwKKwkJCQkJCQkvLyBjcmVhdGUgaXQgdXNpbmcgSVNPIGFscGhhMyBjb2RlLgorCQkJCQkJCUZpbGUgY291bnRyeURpciA9IG5ldyBGaWxlKG91dHB1dERpcgorCQkJCQkJCQkJKyBpc29Db2RlLmdldEFscGhhMygpKTsKKworCQkJCQkJCWlmIChjb3VudHJ5RGlyICE9IG51bGwKKwkJCQkJCQkJCSYmIGNvdW50cnlEaXIuZXhpc3RzKCkgPT0gZmFsc2UpIHsKKwkJCQkJCQkJLy8gRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBDcmVhdGUgaXQuCisJCQkJCQkJCWNvdW50cnlEaXIubWtkaXIoKTsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBDcmVhdGUgdGhlIGZpbGUgbmFtZSBmb3IgdGhlIG5ldworCQkJCQkJCS8vIHBvbHlnb24gYXJlYSBmaWxlLgorCQkJCQkJCWZpbGVOYW1lID0gY291bnRyeURpciArICJcXCIgKyBpc29Db2RlLmdldEFscGhhMygpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCSsgIl8iICsgbGV2ZWwgKyAiX1BPTFlBUkVBLnR4dCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQkJCQkJLy8gT3BlbiB0aGUgd3JpdGVyIGZvciB0aGUgbmV3IHBvbHlnb24gYXJlYSBmaWxlCisJCQkJCQkJcG9seWdvbkFyZWFGaWxlID0gR2VuVXRpbHMub3BlbldyaXRlcihmaWxlTmFtZSk7CisKKwkJCQkJCX0gLy8gaWYoIHRyYW5zaXRpb24gPT0gdHJ1ZSApCisKKwkJCQkJCXN3aXRjaCAobGV2ZWwpIHsKKworCQkJCQkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMDoKKwkJCQkJCQljdXJyZW50ID0gaXNvQ29kZS5nZXRBbHBoYTMoKTsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMToKKwkJCQkJCQljdXJyZW50ID0gaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0udG9VcHBlckNhc2UoKTsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMjoKKwkJCQkJCQljdXJyZW50ID0gaXRlbXNbSVNPRGF0YS5BRE1JTjJfTkFNRV0udG9VcHBlckNhc2UoKTsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJfSAvLyBzd2l0Y2gKKworCQkJCQkJLy8gSGFuZGxlIFVOS05PV04gYW5kIE4uQS4gZW50cmllcyBkaWZmZXJlbnRseS4KKwkJCQkJCWlmIChjdXJyZW50LmVxdWFscygiVU5LTk9XTiIpIHx8IGN1cnJlbnQuZXF1YWxzKCJOLkEuIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQkJCQlpZiAobGV2ZWwgPT0gMSkgeworCQkJCQkJCQljdXJyZW50ID0gaXNvQ29kZS5nZXRBbHBoYTIoKSArICItVU5LLSIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgU3RyaW5nLnZhbHVlT2YodW5rQ291bnRlcisrKTsKKworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8vIExldmVsIDIgZGF0YS4KKwkJCQkJCQkJY3VycmVudCA9IGlzb0NvZGUuZ2V0QWxwaGEzKCkgKyAiLkwyLiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgU3RyaW5nLnZhbHVlT2YodW5rQ291bnRlcisrKTsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCS8vIFdlIGdldCB0aGUgZGVzY3JpcHRvciBmb3IgYWRtaW5pc3RyYXRpb24gZW50aXRpZXMKKwkJCQkJCS8vIGRpZmZlcmVudGx5IGJhc2VkIG9uIGl0cyBsZXZlbC4KKwkJCQkJCWlmIChsZXZlbCA9PSAyKSB7CisKKwkJCQkJCQlpZiAobGV4MURhdGFTZXQgPT0gbnVsbCAmJiBsZXgyRGF0YVNldCA9PSBudWxsKSB7CisKKwkJCQkJCQkJLy8gQ29tcG9zZSB0aGUgZmlsZSBuYW1lcyBmb3IgdGhlIGxleCBmaWxlcyBmb3IKKwkJCQkJCQkJLy8gdGhpcyBjb3VudHJ5CisJCQkJCQkJCWxleEFkbWluMUZpbGUgPSBsZXhEaXIgKyBpc29Db2RlLmdldEFscGhhMygpCisJCQkJCQkJCQkJKyAiXFwiICsgaXNvQ29kZS5nZXRBbHBoYTMoKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlsZXhBZG1pbjJGaWxlID0gbGV4QWRtaW4xRmlsZTsKKwkJCQkJCQkJbGV4QWRtaW4xRmlsZSArPSAiX0FETUlOMV9MRVgudHh0IjsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlsZXhBZG1pbjJGaWxlICs9ICJfQURNSU4yX0xFWC50eHQiOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCQkJLy8gTG9hZCB0aGUgbGV4MSBhbmQgbGV4MiBmaWxlcyBmb3IgdGhpcworCQkJCQkJCQkvLyBjb3VudHJ5LgorCQkJCQkJCQlsZXgxRGF0YVNldCA9IEdlblV0aWxzCisJCQkJCQkJCQkJLnBvcHVsYXRlTGlzdChsZXhBZG1pbjFGaWxlKTsKKwkJCQkJCQkJbGV4MkRhdGFTZXQgPSBHZW5VdGlscworCQkJCQkJCQkJCS5wb3B1bGF0ZUxpc3QobGV4QWRtaW4yRmlsZSk7CisKKwkJCQkJCQkJLy8gQ3JlYXRlIGEgbWV0aG9kIHRvIHNlYXJjaCBmb3IgYW4gaXRlbSBvbiBhCisJCQkJCQkJCS8vIGxpc3Qgb2YgbGV4IGRhdGEgb2JqZWN0cy4KKwkJCQkJCQkJbGV4MUxpc3QgPSBHZW5VdGlscy5jcmVhdGVMZXgxTGlzdChsZXgxRGF0YVNldCk7CisJCQkJCQkJCWxleDJMaXN0ID0gR2VuVXRpbHMuY3JlYXRlTGV4Mkxpc3QobGV4MkRhdGFTZXQpOworCisJCQkJCQkJfQorCisJCQkJCQkJLy8gQ29tcG9zZSB0aGUgbGV2ZWwyIGRlc2NyaXB0b3IgdXNpbmcgdGhlIGxleCBkYXRhOgorCisJCQkJCQkJLy8gU1RFUCAxOiBEbyBhIGxvb2sgdXAgaW4gdGhlIGxleCAyIGxpc3RzLgorCisJCQkJCQkJLy8gR2V0IHRoZSBsZXggMiBvYmplY3QgZm9yIHRoZSBjdXJyZW50IGVudHJ5LgorCQkJCQkJCUxleDJPYmogbGV4MkN1cnJlbnQgPSBHZW5VdGlscy5sZXgyTG9va3VwKGxleDJMaXN0LAorCQkJCQkJCQkJaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0sIGN1cnJlbnQpOworCisJCQkJCQkJLy8gR2V0IHRoZSBsZXggMSBvYmplY3QgdG8gd2hpY2ggbGV4MkN1cnJlbnQgYmVsb25ncworCQkJCQkJCS8vIHRvLgorCQkJCQkJCUxleDFPYmogbGV4MUN1cnJlbnQgPSBHZW5VdGlscy5sZXgxTG9va3VwKGxleDFMaXN0LAorCQkJCQkJCQkJbGV4MkN1cnJlbnQuZ2V0QWRtaW4xKCkpOworCisJCQkJCQkJLy8gU1RFUCAyOiBwaWVjZSB0b2dldGhlciB0aGUgSUQgdXNpbmcgdGhlIHByb3BlcgorCQkJCQkJCS8vIGxleCBvYmplY3RzLgorCQkJCQkJCWRlc2NyaXB0b3IgPSBsZXgxQ3VycmVudC5nZXREZXNjcmlwdG9yKCkKKwkJCQkJCQkJCSsgIi1HIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkrIGxleDFDdXJyZW50LmdldEZvcm1hdHRlZEluZGV4KCkKKwkJCQkJCQkJCSsgbGV4MkN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXgoKTsKKworCQkJCQkJCWlmIChjdXJyZW50LmNvbnRhaW5zKCIuTDIuIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQljdXJyZW50ID0gZGVzY3JpcHRvcjsKKwkJCQkJCQl9CisKKwkJCQkJCX0gZWxzZSB7IC8vIENvbXBvc2UgZGVzY3JpcHRvciBmb3IgbGV2ZWwgMSBhbmQgbGV2ZWwKKwkJCQkJCQkvLyAwIGRhdGEuCisJCQkJCQkJLy8gR2V0IHRoZSBkZXNjcmlwdG9yIGZvciB0aGlzIGVudGl0eS4KKwkJCQkJCQlkZXNjcmlwdG9yID0gR2VuVXRpbHMuZ2V0SVNPMkRlc2NyaXB0b3IoaXNvMkxpc3QsCisJCQkJCQkJCQljdXJyZW50LCBpc29Db2RlLmdldEFscGhhMigpKTsKKworCQkJCQkJCS8vIElmIHdlIGNhbnQgZmluZCB0aGUgZGVzY3JpcHRvciwgdGhlbiBsb29rIGluIHRoZQorCQkJCQkJCS8vIGZpeCBsaXN0LgorCQkJCQkJCWlmIChkZXNjcmlwdG9yLmVxdWFscyhjdXJyZW50KSA9PSB0cnVlKSB7CisJCQkJCQkJCS8vIExvb2sgZm9yIGEgZGVzY3JpcHRvciBpbiB0aGUgZml4IGZpbGUKKwkJCQkJCQkJZGVzY3JpcHRvciA9IEdlblV0aWxzLmdldEZpeENvZGUoY29kZWZpeExpc3QsCisJCQkJCQkJCQkJY3VycmVudCwgaXRlbXNbSVNPRGF0YS5DT1VOVFJZX05BTUVdKTsKKwkJCQkJCQl9CisKKwkJCQkJCX0KKworCQkJCQkJLy8gQ3JlYXRlIGEgU1RFTSBwb2x5Z29uIHdpdGggdGhpcyBwb2x5Z29uIGRhdGEKKwkJCQkJCVNURU1Qb2x5Z29uIHBvbHlnb24gPSBuZXcgU1RFTVBvbHlnb24oYnVmZmVyLCBsZXZlbCk7CisKKwkJCQkJCS8vIENoZWNrIHRoYXQgdGhpcyBpcyBpbmRlZWQgYSBTVEVNIHBvbHlnb24KKwkJCQkJCWlmIChpc1BvbHlnb24ocG9seWdvbikgIT0gdHJ1ZSkgeworCQkJCQkJCS8vIE5vdCBhIHBvbHlnb24sIGlnbm9yZS4KKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKworCQkJCQkJLy8gV2Uga25vdyBpdCBpcyBhIHBvbHlnb24sIGJ1dCBub3cgY2hlY2sgdGhhdCBpdHMgbm90CisJCQkJCQkvLyBkdXBsaWNhdGVkLgorCQkJCQkJaWYgKGlzUG9seWdvbkR1cGxpY2F0ZWQocG9seWdvbnMuaXRlcmF0b3IoKSwgcG9seWdvbikgPT0gdHJ1ZSkgeworCQkJCQkJCS8vIFllcywgaXQgaXMgZHVwbGljYXRlZAorCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCisJCQkJCQkvLyBBZGQgdGhpcyBwb2x5Z29uIHRvIG91ciBsaXN0IG9mIHVuaXF1ZSBwb2x5Z29ucyBzbworCQkJCQkJLy8gdGhhdCB3ZSBjYW4gY2hlY2sgZHVwbGljYXRlcyBvZiB0aGlzIHBvbHlnb24gbGF0ZXIuCisJCQkJCQlwb2x5Z29ucy5hZGQocG9seWdvbik7CisKKwkJCQkJCVN0cmluZyBhcmVhID0gbnVsbDsKKworCQkJCQkJLy8gYXJlYVN1bSArPSBnZXRQb2x5Z29uQXJlYShwb2x5Z29uKTsKKwkJCQkJCWFyZWEgPSBmb3JtYXQoZ2V0UG9seWdvbkFyZWEocG9seWdvbikpOworCisJCQkJCQkvLyBGb3JtYXQgb3V0cHV0IGRhdGEgYXMgZm9sbG93czoKKworCQkJCQkJU3RyaW5nIGNvbnRhaW5lciA9IG51bGw7CisKKwkJCQkJCXN3aXRjaCAobGV2ZWwpIHsKKworCQkJCQkJY2FzZSAwOgorCQkJCQkJCWNvbnRhaW5lciA9IGN1cnJlbnQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQkJCisJCQkJCQljYXNlIDE6CisJCQkJCQkJY29udGFpbmVyID0gaXRlbXNbSVNPRGF0YS5DT1VOVFJZX05BTUVdOworCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlIDI6CisJCQkJCQkJY29udGFpbmVyID0gaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV07CisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCX0KKworCQkJCQkJU3RyaW5nIGtleSA9IGNvbnRhaW5lcgorCQkJCQkJCQkrICI6IiArIGN1cnJlbnQgKyAiOiIgKyBkZXNjcmlwdG9yOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQorCQkJCQkJaWYgKGFyZWFWYWx1ZXMuY29udGFpbnNLZXkoa2V5KSA9PSBmYWxzZSkgeworCQkJCQkJCWFyZWFWYWx1ZXMucHV0KGtleSwgYXJlYSk7CisJCQkJCQl9IGVsc2UgewkJCQkJCQkKKwkJCQkJCQlTdHJpbmcgdmFsID0gYXJlYVZhbHVlcy5nZXQoa2V5KTsKKwkJCQkJCQlEb3VibGUgYWdncmVnYXRlQXJlYSA9IERvdWJsZS5wYXJzZURvdWJsZSh2YWwpCisJCQkJCQkJCQkrIERvdWJsZS5wYXJzZURvdWJsZShhcmVhKTsKKwkJCQkJCQlhcmVhVmFsdWVzLnB1dChrZXksIGFnZ3JlZ2F0ZUFyZWEudG9TdHJpbmcoKSk7CisJCQkJCQl9CisKKwkJCQkJCS8vIG91dHB1dCA9IGNvbnRhaW5lciArICI6IiArIGN1cnJlbnQgKyAiOiIgKyBkZXNjcmlwdG9yCisJCQkJCQkvLyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCS8vICsgIjoiICsgYXJlYSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQkJCQkvLyBHZW5VdGlscy5hZGREYXRhKHBvbHlnb25BcmVhRmlsZSwgb3V0cHV0KTsKKworCQkJCQl9IC8vIHdoaWxlIGxvb3AKKworCQkJCQlTZXQ8U3RyaW5nPiBrZXlzID0gYXJlYVZhbHVlcy5rZXlTZXQoKTsKKwkJCQkJSXRlcmF0b3IgaXQgPSBrZXlzLml0ZXJhdG9yKCk7CisJCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisJCQkJCQlTdHJpbmcgdmFsdWUgPSBhcmVhVmFsdWVzLmdldChrZXkpOworCQkJCQkJU3RyaW5nIG91dHB1dCA9IGtleSArICI6IiArIHZhbHVlICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkJCQkJCisJCQkJCQlHZW5VdGlscy5hZGREYXRhKHBvbHlnb25BcmVhRmlsZSwgb3V0cHV0KTsKKwkJCQkJfQorCQkJCQkvLyBDbGVhciBvdXIgaGFzaCBtYXAKKwkJCQkJYXJlYVZhbHVlcy5jbGVhcigpOworCisJCQkJCS8vIFJlc2V0IGFsbCBsZXgtcmVsYXRlZCBpdGVtcworCQkJCQlpZiAobGV4MURhdGFTZXQgIT0gbnVsbCkgeworCQkJCQkJbGV4MURhdGFTZXQuY2xlYXIoKTsKKwkJCQkJCWxleDFEYXRhU2V0ID0gbnVsbDsKKwkJCQkJfQorCQkJCQlpZiAobGV4MkRhdGFTZXQgIT0gbnVsbCkgeworCQkJCQkJbGV4MkRhdGFTZXQuY2xlYXIoKTsKKwkJCQkJCWxleDJEYXRhU2V0ID0gbnVsbDsKKwkJCQkJfQorCQkJCQlpZiAobGV4MUxpc3QgIT0gbnVsbCkgeworCQkJCQkJbGV4MUxpc3QuY2xlYXIoKTsKKwkJCQkJCWxleDFMaXN0ID0gbnVsbDsKKwkJCQkJfQorCQkJCQlpZiAobGV4Mkxpc3QgIT0gbnVsbCkgeworCQkJCQkJbGV4Mkxpc3QuY2xlYXIoKTsKKwkJCQkJCWxleDJMaXN0ID0gbnVsbDsKKwkJCQkJfQorCisJCQkJCWxleEFkbWluMUZpbGUgPSBudWxsOworCQkJCQlsZXhBZG1pbjJGaWxlID0gbnVsbDsKKworCQkJCQkvLyBXZSBkb250IG5lZWQgdGhlIElTTyBjb2RlIG9iamVjdCBmb3IgdGhpcyBjb3VudHJ5CisJCQkJCS8vIGFueW1vcmUsIHdlIGFyZSBkb25lIHByb2Nlc3NpbmcgaXQuCisJCQkJCWlzb0NvZGUgPSBudWxsOworCisJCQkJCS8vIENsZWFyIHRoZSBhcmVhIGxpc3QuCisJCQkJCWlmIChhcmVhTGlzdCAhPSBudWxsKSB7CisJCQkJCQlhcmVhTGlzdC5jbGVhcigpOworCQkJCQkJYXJlYUxpc3QgPSBudWxsOworCQkJCQl9CisKKwkJCQkJLy8gQ2xvc2UgYWxsIG9wZW4gcmVzb3VyY2VzLgorCQkJCQlyZWFkZXIuY2xvc2UoKTsKKworCQkJCQlpZiAocG9seWdvbkFyZWFGaWxlICE9IG51bGwpIHsKKwkJCQkJCS8vIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQKKwkJCQkJCXBvbHlnb25BcmVhRmlsZS5jbG9zZSgpOworCQkJCQkJcG9seWdvbkFyZWFGaWxlID0gbnVsbDsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdEdlbmVyYXRlZCA6ICIgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWZpbGVOYW1lID0gbnVsbDsKKwkJCQkJfQorCisJCQkJCS8vIFJ1biBnYXJiYWdlIGNvbGxlY3Rpb24KKwkJCQkJLy9TeXN0ZW0uZ2MoKTsKKwkJCQl9CisKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCisJCX0KKworCX0KKworCS8qKgorCSAqIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGEgcmVhbCBwb2x5Z29uIChpLmUuIGNsb3NlZCkKKwkgKiAKKwkgKiBAcGFyYW0gcG9seWdvbgorCSAqICAgICAgICAgICAgQSBTVEVNIHBvbHlnb24KKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhcmFtZXRlciAicG9seWdvbiIgaXMgYSBTVEVNIHBvbHlnb24KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BvbHlnb24oU1RFTVBvbHlnb24gcG9seWdvbikgeworCisJCVBvaW50RGF0YSBpbml0ID0gcG9seWdvbi5nZXRJbml0KCk7CisJCVBvaW50RGF0YSBsYXN0ID0gcG9seWdvbi5nZXRMYXN0KCk7CisKKwkJaWYgKGluaXQuZ2V0THQoKSAhPSBsYXN0LmdldEx0KCkpIHsKKwkJCS8vIE5vdCBhIHBvbHlnb24KKwkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmIChpbml0LmdldExnKCkgIT0gbGFzdC5nZXRMZygpKSB7CisJCQkvLyBOb3QgYSBwb2x5Z29uCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvLyBZZXMsIGl0IGlzIGEgcG9seWdvbgorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBDaGVjayB0byBzZWUgaWYgdGhpcyBwb2x5Z29uIGlzIGR1cGxpY2F0ZWQuCisJICogCisJICogQHBhcmFtIHBvbHlnb24KKwkgKiAgICAgICAgICAgIGEgU1RFTSBwb2x5Z29uCisJICogQHBhcmFtIGl0CisJICogICAgICAgICAgICBhbiBpdGVyYXRvciBvbiB0aGUgcG9seWdvbiBsaXN0CisJICogCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgcG9seWdvbiBpcyBhbHJlYWR5IGluIHRoZSBsaXN0IG9mIGtub3duIHBvbHlnb25zCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNQb2x5Z29uRHVwbGljYXRlZChJdGVyYXRvciBpdCwgU1RFTVBvbHlnb24gcG9seWdvbikgeworCisJCWlmIChpdC5oYXNOZXh0KCkgIT0gdHJ1ZSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJU1RFTVBvbHlnb24gY3VycmVudCA9IChTVEVNUG9seWdvbikgaXQubmV4dCgpOworCQkJaWYgKGN1cnJlbnQuc2FtZShwb2x5Z29uKSA9PSB0cnVlKSB7CisJCQkJLy8gTm90IHVuaXF1ZSwgaXQgaXMgZHVwbGljYXRlZCBzbyBjb25kaXRpb24gaXMgZmFsc2UuCisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIGdldCB0aGUgYXJlYSBpbiBzcXVhcmUga20gb2YgYSBjaGlsZCBwb2x5Z29uIGluc2lkZSBhIHBhcmVudCBvZiBrbm93bgorCSAqIGFyZWEgKHNxIGttKS4gZS5nLiwgdGhlIGZyYWN0aW9uYWwgYXJlYSBvZiBhIHN0YXRlIG9jY3VwaWVkIGJ5IGEgY291bnR5LgorCSAqIAorCSAqIEBwYXJhbSBjaGlsZAorCSAqICAgICAgICAgICAgYSBsb2NhdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICB0aGUgY29udGFpbmVyIGZvciB0aGUgbG9jYXRpb24gKGNoaWxkKS4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50QXJlYUluU3FLbQorCSAqICAgICAgICAgICAgYXJlYSBmb3IgdGhlIGNvbnRhaW5lciBpbiBzcXVhcmUga2lsb21ldGVycy4KKwkgKiAKKwkgKiBAcmV0dXJuIGFyZWEgb2YgY2hpbGQgaW4gc3Ega20KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRDaGlsZEFyZWFTcUttKFNURU1Qb2x5Z29uIGNoaWxkLAorCQkJU1RFTVBvbHlnb24gcGFyZW50LCBkb3VibGUgcGFyZW50QXJlYUluU3FLbSkgeworCQlkb3VibGUgYXJlYTIgPSBnZXRQb2x5Z29uQXJlYShjaGlsZCk7CisJCWRvdWJsZSBhcmVhMSA9IGdldFBvbHlnb25BcmVhKHBhcmVudCk7CisJCWRvdWJsZSByZXN1bHQgPSBhcmVhMiAvIGFyZWExOworCQlhc3NlcnQgKHJlc3VsdCA8PSAxLjApOworCQlyZXN1bHQgKj0gcGFyZW50QXJlYUluU3FLbTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBnZXQgdGhlIGFyZWEgaW4gc3F1YXJlIGttIG9mIGEgY2hpbGQgcG9seWdvbiBpbnNpZGUgYSBwYXJlbnQgb2Yga25vd24KKwkgKiBhcmVhIChzcSBrbSkuIGUuZy4sIHRoZSBmcmFjdGlvbmFsIGFyZWEgb2YgYSBzdGF0ZSBvY2N1cGllZCBieSBhIGNvdW50eS4KKwkgKiAKKwkgKiBAcGFyYW0gY2hpbGRTZXQKKwkgKiAgICAgICAgICAgIGFzIHNldCBvZiBwb2x5Z29uIGNoaWxkcmVuIChtYXkgYmUgYSBncm91cCBvZiBpc2xhbmRzKQorCSAqIEBwYXJhbSBwYXJlbnRTZXQKKwkgKiAgICAgICAgICAgIGEgc2V0IG9mIHBvbHlnb24gcGFyZW50cyAobWF5IGJlIGEgZ3JvdXAgb2YgaXNsYW5kcykKKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50QXJlYUluU3FLbQorCSAqICAgICAgICAgICAgYXJlYSBvZiB0aGUgY29udGFpbmVyIGluIHNxdWFyZSBraWxvbWV0ZXJzLgorCSAqIAorCSAqIEByZXR1cm4gYXJlYSBvZiBjaGlsZCBpbiBzcSBrbQorCSAqLworCXB1YmxpYyBzdGF0aWMgZG91YmxlIGdldENoaWxkQXJlYVNxS20oU2V0IGNoaWxkU2V0LCBTZXQgcGFyZW50U2V0LAorCQkJZG91YmxlIHBhcmVudEFyZWFJblNxS20pIHsKKwkJZG91YmxlIGFyZWEyID0gZ2V0UG9seWdvbkFyZWEoY2hpbGRTZXQpOworCQlkb3VibGUgYXJlYTEgPSBnZXRQb2x5Z29uQXJlYShwYXJlbnRTZXQpOworCQlkb3VibGUgcmVzdWx0ID0gYXJlYTIgLyBhcmVhMTsKKwkJYXNzZXJ0IChyZXN1bHQgPD0gMS4wKTsKKwkJcmVzdWx0ICo9IHBhcmVudEFyZWFJblNxS207CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogZ2V0IHRoZSBhcmVhIG9mIGFueSBTVEVNIHBvbHlnb24gaW4gcG9seWdvbiBsdCxsZyB1bml0cworCSAqIAorCSAqIEBwYXJhbSBwCisJICogICAgICAgICAgICBhIFNURU0gcG9seWdvbgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGFyZWEgaW4gcG9seWdvbiB1bml0cyBmb3IgdGhlIFNURU0gcG9seWdvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgZG91YmxlIGdldFBvbHlnb25BcmVhKFNURU1Qb2x5Z29uIHApIHsKKworCQlkb3VibGUgYXJlYSA9IDAuMDsKKwkJRG91YmxlW10gbHRQb2ludHMgPSBwLmdldEx0UG9pbnRzKCk7CisJCURvdWJsZVtdIGxnUG9pbnRzID0gcC5nZXRMZ1BvaW50cygpOworCQlpbnQgbiA9IGx0UG9pbnRzLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuIC0gMTsgaSsrKSB7CisJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKiAqKioqKioqKioqKioqKioqIik7CisJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBsdFBvaW50c1siICsgaSArICJdID0gIiArCisJCQkvLyBsdFBvaW50c1tpXS5kb3VibGVWYWx1ZSgpICk7CisJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBsdFBvaW50c1siICsgKGkgKyAxKSArICJdID0gIgorCQkJLy8gKyBsdFBvaW50c1tpICsgMV0uZG91YmxlVmFsdWUoKSApOworCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgbGdQb2ludHNbIiArIGkgKyAiXSA9ICIgKworCQkJLy8gbGdQb2ludHNbaV0uZG91YmxlVmFsdWUoKSk7CisJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBsZ1BvaW50c1siICsgKGkgKyAxKSArICJdID0gIgorCQkJLy8gKyBsZ1BvaW50c1tpICsgMV0uZG91YmxlVmFsdWUoKSk7CisJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKiAqKioqKioqKioqKioqKioqIik7CisJCQlhcmVhICs9IChsdFBvaW50c1tpXS5kb3VibGVWYWx1ZSgpICogbGdQb2ludHNbaSArIDFdLmRvdWJsZVZhbHVlKCkpCisJCQkJCS0gKGx0UG9pbnRzW2kgKyAxXS5kb3VibGVWYWx1ZSgpICogbGdQb2ludHNbaV0KKwkJCQkJCQkuZG91YmxlVmFsdWUoKSk7CisJCX0gLy8gbmV4dCBwb2ludAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFyZWEgaXMgOiAiICsgYXJlYSk7CisJCWFyZWEgLz0gMi4wOworCisJCXJldHVybiBNYXRoLmFicyhhcmVhKTsKKwl9CisKKwkvKioKKwkgKiBnZXQgdGhlIGFyZWEgb2YgYW55IHBvbHlnb24gaW4gcG9seWdvbiB4LHkgdW5pdHMKKwkgKiAKKwkgKiBAcGFyYW0gcG9seVNldCAtCisJICogICAgICAgICAgICBhIHNldCBvZiBqYXZhLmF3dC5Qb2x5Z29uIGFsbCByZXByZXNlbnRpbmcgb25lIGxvY2F0aW9uIHRoaXMKKwkgKiAgICAgICAgICAgIG1pZ2h0IGJlIGEgY2x1c3RlciBvZiBpc2xhbmRzIHRoYXQgdG9nZXRoZXIgbWFrZSB1cCBhIHBsYWNlCisJICogCisJICogQHJldHVybiB0aGUgYXJlYSBpbiBwb2x5Z29uIHgseSB1bml0cworCSAqLworCXB1YmxpYyBzdGF0aWMgZG91YmxlIGdldFBvbHlnb25BcmVhKFNldCBwb2x5U2V0KSB7CisJCWRvdWJsZSBhcmVhID0gMC4wOworCQlJdGVyYXRvciBpdGVyID0gcG9seVNldC5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCWRvdWJsZSBpbm5lciA9IDAuMDsKKwkJCVBvbHlnb24gcCA9IChQb2x5Z29uKSBpdGVyLm5leHQoKTsKKwkJCWludFtdIHggPSBwLnhwb2ludHM7CisJCQlpbnRbXSB5ID0gcC55cG9pbnRzOworCQkJaW50IG4gPSB4Lmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbiAtIDE7IGkrKykgeworCQkJCWlubmVyICs9ICh4W2ldICogeVtpICsgMV0pIC0gKHhbaSArIDFdICogeVtpXSk7CisJCQl9IC8vIG5leHQgcG9pbnQKKwkJCWlubmVyIC89IDIuMDsKKwkJCWFyZWEgKz0gTWF0aC5hYnMoaW5uZXIpOworCQl9IC8vIG5leHQgcG9seWdvbgorCQlyZXR1cm4gYXJlYTsKKwl9CisKKwkvKioKKwkgKiBGaW5kIHRoZSBwb3B1bGF0aW9uIHZhbHVlIGZvciBhIGdpdmVuIGVudGl0eS4KKwkgKiAKKwkgKiBAcGFyYW0gZW50aXR5CisJICogICAgICAgICAgICB0aGUgbG9jYXRpb24gZm9yIHdoaWNoIHdlIHdhbnQgdG8gZmluZCB0aGUgYXJlYQorCSAqIAorCSAqIEBwYXJhbSBlbnRpdHlDb250YWluZXIKKwkgKiAgICAgICAgICAgIGEgY29udGFpbmVyIGZvciB0aGUgbG9jYXRpb24gKGVudGl0eSkKKwkgKiAKKwkgKiBAcGFyYW0gbGV2ZWwKKwkgKiAgICAgICAgICAgIHRoZSBhZG1pbmlzdHJhdGl2ZSBsZXZlbAorCSAqIAorCSAqIEByZXR1cm4gdGhlIGFyZWEgdmFsdWUKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEFyZWEoU3RyaW5nIGVudGl0eSwgU3RyaW5nIGVudGl0eUNvbnRhaW5lciwgaW50IGxldmVsKSB7CisKKwkJZmluYWwgaW50IEVOVElUWSA9IDA7CisKKwkJZmluYWwgaW50IExFVkVMID0gMTsKKworCQlmaW5hbCBpbnQgQVJFQSA9IDI7CisKKwkJU3RyaW5nW10gYXJlYURhdGEgPSBudWxsOworCisJCUl0ZXJhdG9yIGl0ID0gYXJlYUxpc3QuaXRlcmF0b3IoKTsKKworCQlTdHJpbmcgZW50aXR5U3RyID0gZW50aXR5LnRvVXBwZXJDYXNlKCkudHJpbSgpOworCisJCWVudGl0eVN0ciA9IGVudGl0eVN0ci5yZXBsYWNlKCJcXHQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCVN0cmluZyBlbnRpdHlDb250YWluZXJTdHIgPSBlbnRpdHlDb250YWluZXIudG9VcHBlckNhc2UoKTsKKworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisKKwkJCWFyZWFEYXRhID0gKChTdHJpbmcpIGl0Lm5leHQoKSkuc3BsaXQoIjoiKTsgLy8kTk9OLU5MUy0xJAorCisJCQlTdHJpbmdbXSBjb21wYXJlID0gbnVsbDsKKworCQkJLy8gR2V0IHRoZSBlbnRpdHkgbmFtZSBhbmQgcmVtb3ZlIGJsYW5rcworCQkJU3RyaW5nIGxvY2F0aW9uID0gYXJlYURhdGFbRU5USVRZXS50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKworCQkJbG9jYXRpb24gPSBsb2NhdGlvbi50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKworCQkJLy8gSGFuZGxlIEFsaWFzZXMgLS0gY29tcGxleCBzdHVmZiA6JAorCQkJaWYgKGxvY2F0aW9uLmNvbnRhaW5zKCJbIikpIHsgLy8kTk9OLU5MUy0xJAorCisJCQkJbG9jYXRpb24gPSBsb2NhdGlvbi5yZXBsYWNlKCJdIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCS8vIFRva2VuaXplCisJCQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobG9jYXRpb24sICJbIik7IC8vJE5PTi1OTFMtMSQKKworCQkJCS8vIEdldCB0b2tlbnMgLT4gb3JkZXIgbWF0dGVycyBoZXJlIQorCQkJCWNvbXBhcmUgPSBuZXcgU3RyaW5nW3Rva2Vucy5jb3VudFRva2VucygpXTsKKwkJCQlpbnQgaSA9IDA7CisJCQkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQkJY29tcGFyZVtpKytdID0gdG9rZW5zLm5leHRUb2tlbigpLnRvVXBwZXJDYXNlKCkudHJpbSgpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGNvbXBhcmUgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcGFyZS5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAoZW50aXR5U3RyLnJlcGxhY2UoIi0iLCAiICIpLmVxdWFscyggLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJY29tcGFyZVtpXS5yZXBsYWNlKCItIiwgIiAiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJfHwgY29tcGFyZVtpXS5lcXVhbHMoZW50aXR5U3RyICsgIi0xIikgLy8kTk9OLU5MUy0xJAorCQkJCQkJCXx8IGNvbXBhcmVbaV0uZXF1YWxzKGVudGl0eUNvbnRhaW5lclN0cikpIHsKKworCQkJCQkJLy8gQ2hlY2sgYm90aCBlbnRpdGllcyBiZWxvbmcgdG8gc2FtZSBsZXZlbAorCQkJCQkJaWYgKFN0cmluZy52YWx1ZU9mKGxldmVsKQorCQkJCQkJCQkuZXF1YWxzKGFyZWFEYXRhW0xFVkVMXS50cmltKCkpID09IGZhbHNlKSB7CisJCQkJCQkJLy8gSWdub3JlIDogc2FtZSBuYW1lICwgYnV0IGRpZmZlcmVudCBsZXZlbAorCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCisJCQkJCQlyZXR1cm4gYXJlYURhdGFbQVJFQV0udHJpbSgpOworCisJCQkJCX0KKworCQkJCX0KKwkJCX0gZWxzZSBpZiAoZW50aXR5U3RyLmVxdWFscyhsb2NhdGlvbikKKwkJCQkJfHwgZW50aXR5U3RyLnJlcGxhY2UoIi0iLCAiICIpLmVxdWFscyhsb2NhdGlvbikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCXx8IGxvY2F0aW9uLmVxdWFscyhlbnRpdHlTdHIgKyAiLTEiKSkgeyAvLyROT04tTkxTLTEkCisKKwkJCQkvLyBDaGVjayBib3RoIGVudGl0aWVzIGJlbG9uZyB0byBzYW1lIGxldmVsCisJCQkJaWYgKFN0cmluZy52YWx1ZU9mKGxldmVsKS5lcXVhbHMoYXJlYURhdGFbTEVWRUxdLnRyaW0oKSkgPT0gZmFsc2UpIHsKKwkJCQkJLy8gSWdub3JlIDogc2FtZSBuYW1lICwgYnV0IGRpZmZlcmVudCBsZXZlbAorCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJcmV0dXJuIGFyZWFEYXRhW0FSRUFdLnRyaW0oKTsKKwkJCX0KKworCQl9IC8vIHdoaWxlCisKKwkJcmV0dXJuIERFRkFVTFQ7CisJfQorCisJLyoqCisJICogVGhlIGV4ZWN1dGlvbiBlbnRyeSBwb2ludAorCSAqIAorCSAqIEBwYXJhbSBhcmdzCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQkvLyBmaW5hbCBpbnQgSVNPXzMxNjZfMSA9IDA7CisJCS8vIGZpbmFsIGludCBJU09fMzE2Nl8yID0gMTsKKwkJLy8gZmluYWwgaW50IEZJWF9GSUxFID0gMjsKKwkJLy8gZmluYWwgaW50IEFSRUFfREFUQSA9IDM7CisJCS8vIGZpbmFsIGludCBUQVJHRVRfTElTVCA9IDQ7CisJCS8vIGZpbmFsIGludCBMRVhfRElSID0gNTsKKwkJLy8gZmluYWwgaW50IE9VVFBVVF9ESVIgPSA2OworCQkvLyBmaW5hbCBpbnQgUEFSQU1TID0gNzsKKwkJLy8KKwkJLy8gaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQKKwkJLy8gLnByaW50bG4oIlx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyA6ICIpOworCQkvLyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBJU08gMzE2Ni0xIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgSVNPIDMxNjYtMiBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IElTTyBmaXggZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBBcmVhIGRhdGEgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBUYXJnZXQgY291bnRyaWVzIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgTGV4aWNvZ3JhcGhpYyBzb3J0aW5nIGRpcmVjdG9yeSIpOworCQkvLyAvLyROT04tTkxTLTEkJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgT3V0cHV0IGRpcmVjdG9yeSIpOyAvLyROT04tTkxTLTEkCisJCS8vIHJldHVybjsKKwkJLy8gfQorCQkvLwkJCisJCS8vIFBvbHlnb25BcmVhR2VuZXJhdG9yIGdlbiA9IG5ldyBQb2x5Z29uQXJlYUdlbmVyYXRvcihhcmdzW0lTT18zMTY2XzFdLAorCQkvLyBhcmdzW0lTT18zMTY2XzJdLCBhcmdzW0ZJWF9GSUxFXSwgYXJnc1tBUkVBX0RBVEFdLAorCQkvLyBhcmdzW1RBUkdFVF9MSVNUXSwgYXJnc1tMRVhfRElSXSwgYXJnc1tPVVRQVVRfRElSXSk7CisJCS8vIGdlbi5ydW4oKTsKKworCQlmaW5hbCBpbnQgQ09ORklHX0ZJTEUgPSAwOworCQlmaW5hbCBpbnQgUEFSQU1TID0gMTsKKworCQlpZiAoYXJncy5sZW5ndGggPCBQQVJBTVMpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdC0tV3JvbmcgYXJndW1lbnRzLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRcdFRvIHJ1biwgcGxlYXNlIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhcmd1bWVudChzKSA6ICIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdCBDb25maWd1cmF0aW9uIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLmV4aXQoMSk7CisJCX0KKworCQlQb2x5Z29uQXJlYUdlbmVyYXRvciBnZW4gPSBuZXcgUG9seWdvbkFyZWFHZW5lcmF0b3IoYXJnc1tDT05GSUdfRklMRV0pOworCisJCWdlbi5ydW4oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvUG9wdWxhdGlvbkRhdGFNaWdyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9Qb3B1bGF0aW9uRGF0YU1pZ3JhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiNWQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvUG9wdWxhdGlvbkRhdGFNaWdyYXRvci5qYXZhCkBAIC0wLDAgKzEsNDI0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCisvKioKKyAqIFNURU0gSUkgRGF0YSBNaWdyYXRpb24vR2VuZXJhdGlvbiBVdGlsaXRpZXMgLS0gVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MgdGhhdAorICogZXh0cmFjdHMgdGhlIHBvcHVsYXRpb24gZGF0YSBmcm9tIHRoZSBTVEVNIEkgZGF0YSBmaWxlcyBhcyBhIHNpbXBsZSB0ZXh0IGZpbGUKKyAqIHRoYXQgd2lsbCBiZSB1c2VkIGluIFNURU0gSUkuIFRoZSBwb3B1bGF0aW9uIGRhdGEgZXh0cmFjdGVkIGlzIHVzZWQgZHVyaW5nCisgKiBnZW5lcmF0aW9uIG9mIFNURU0gSUkgcHJvcGVydGllcyBmaWxlcy4KKyAqIAorICogQWRkIHRoZSBmb2xsb3dpbmcgdmFsdWVzIHRvIHRoZSBydW4gY29uZmlndXJhdGlvbjoKKyAqIAorICogQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXGlucHV0XElTTzMxNjYtMVxJU08zMTY2XzFfZW4udHh0CisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRcbWlncmF0aW9uXGNvdW50cnlfbmFtZXMudHh0CisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRcQXJlYVBvcHVsYXRpb25EYXRhXAorICogCisgKi8KKworcHVibGljIGNsYXNzIFBvcHVsYXRpb25EYXRhTWlncmF0b3IgeworCisJLyoqCisJICogT3VyIHNvdXJjZSBmaWxlcyBmb3IgSVNPIDMxNjYtMSBjb2RlcyBhbmQgZm9yIHRoZSBsaXN0IG9mIHRhcmdldAorCSAqIGNvdW50cmllcy4KKwkgKi8KKworCXByaXZhdGUgU3RyaW5nIGlzb0ZpbGUgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0RmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBvdXRwdXREaXIgPSBudWxsOworCisJU3RyaW5nIHBvcHVsYXRpb25MaXN0ID0gbnVsbDsKKworCS8qKgorCSAqIExpc3QgZm9yIElTTyAzMTY2LTEgY29kZXMgYW5kIHRhcmdldCBjb3VudHJpZXMuCisJICovCisKKwlMaXN0IHRhcmdldExpc3QgPSBudWxsOworCisJTGlzdCBjb2RlTGlzdCA9IG51bGw7CisKKwkvKioKKwkgKiBBIG1hcCBjb250YWluaW5nIHR1cGxlcyBvZiB0aGUgZm9ybSAobG9jYXRpb24sYXJlYSkKKwkgKi8KKwlNYXAgcG9wdWxhdGlvbk1hcCA9IG51bGw7CisKKwlNYXAgbmFtZU1hcCA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqIAorCSAqIEBwYXJhbSBpc29GaWxlIC0KKwkgKiAgICAgICAgICAgIGRhdGEgZmlsZSB3aXRoIHRoZSBJU08zMTY2LTEgQUxQSEFfMiBhbmQgQUxQSEFfMyBjb2Rlcy4KKwkgKiBAcGFyYW0gdGFyZ2V0RmlsZSAtCisJICogICAgICAgICAgICBkYXRhIGZpbGUgd2hlcmUgd2UgZmluZCBhIGxpc3Qgb2YgY291bnRyaWVzIGZvciBnZW5lcmF0aW9uIG9mCisJICogICAgICAgICAgICB0aGVpciBjb3JyZXNwb25kaW5nIGFyZWEucHJvcGVydGllcyBmaWxlcy4KKwkgKiBAcGFyYW0gb3V0cHV0RGlyIC0KKwkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGUgZmlsZXMgZ2VuZXJhdGVkLgorCSAqLworCXB1YmxpYyBQb3B1bGF0aW9uRGF0YU1pZ3JhdG9yKFN0cmluZyBpc29GaWxlLCBTdHJpbmcgdGFyZ2V0RmlsZSwKKwkJCVN0cmluZyBvdXRwdXREaXIpIHsKKwkJdGhpcy5pc29GaWxlID0gaXNvRmlsZTsKKwkJdGhpcy50YXJnZXRGaWxlID0gdGFyZ2V0RmlsZTsKKwkJdGhpcy5vdXRwdXREaXIgPSBvdXRwdXREaXI7CisJCXBvcHVsYXRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOworCQluYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBzZXRzIHVwIGFuZCBydW5zIHRoaXMgZ2VuZXJhdG9yLgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBjb3VudHJpZXMgd2Ugd2FudC4KKwkJdGFyZ2V0TGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdCh0YXJnZXRGaWxlKTsKKworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIElTTzMxNjYtMSBBTFBIQTIsIEFMUEhBMywgYW5kCisJCS8vIG51bWVyaWMgY29kZXMuCisJCWNvZGVMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KGlzb0ZpbGUpOworCisJCS8vIE5vdywgcHJvY2VzcyBlYWNoIGl0ZW0gaW4gdGhlIHRhcmdldCBsaXN0LgorCQlwcm9jZXNzKCk7CisKKwl9CisKKwkvKioKKwkgKiBNZXRob2QgdGhhdCBsb2FkcyB0aGUgWE1MIGZpbGUgY29udGFpbmluZyB0aGUgdGVzdHMgZm9yIHRoaXMgYWN0b3IuCisJICogCisJICogQHBhcmFtIGZpbGVOYW1lCisJICogICAgICAgICAgICB0aGUgWE1MIHRlc3QgZmlsZQorCSAqIAorCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgWE1MIGRvY3VtZW50LgorCSAqIAorCSAqLworCXByb3RlY3RlZCBFbGVtZW50IGxvYWRYTUwoU3RyaW5nIGZpbGVOYW1lKSB7CisKKwkJRG9jdW1lbnQgZG9jID0gbnVsbDsKKwkJRG9jdW1lbnRCdWlsZGVyIGRvY0J1aWxkZXIgPSBudWxsOworCisJCXRyeSB7CisJCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5CisJCQkJCS5uZXdJbnN0YW5jZSgpOworCQkJLy8gWE1MIGRvY3VtZW50IGJ1aWxkZXIKKwkJCWRvY0J1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworCQkJZG9jID0gZG9jQnVpbGRlci5uZXdEb2N1bWVudCgpOworCQkJLy8gTG9hZCBYTUwgZmlsZQorCQkJRmlsZSB4bWxGaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOworCQkJU3RyaW5nIGZpbGVQYXRoID0geG1sRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBwYXRoID0gIiArIGZpbGVQYXRoKTsgLy8kTk9OLU5MUy0xJAorCQkJZG9jID0gZG9jQnVpbGRlci5wYXJzZShmaWxlUGF0aCk7CisJCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gcGNlKSB7CisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJMb2FkWE1MKCk6ICBFcnJvciBjb25maWd1cmluZyB4bWwgZG9jdW1lbnQgYnVpbGRlciAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkrIHBjZS5nZXRNZXNzYWdlKCkpOworCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCisJCS8vIFJldHVybiB0aGUgcm9vdCBvZiB0aGlzIFhNTCBkb2N1bWVudAorCQlyZXR1cm4gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOworCX0KKworCS8qKgorCSAqIFJlYWQgYWxsIGFyZ3VtZW50cyBpbiBhIGRhdGFzZXQsIG9uZSBieSBvbmUuCisJICogCisJICogQHBhcmFtIGZpbGUKKwkgKiAgICAgICAgICAgIGEgZmlsZW5hbWUKKwkgKiAKKwkgKiBAcGFyYW0gbGV2ZWwKKwkgKiAgICAgICAgICAgIGFkbWluc3RyYXRpdmUgbGV2ZWwKKwkgKiAKKwkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbWFwIHdpdGggdHVwbGVzIChLZXk9SUQsVmFsdWU9UG9wdWxhdGlvbnMpCisJICogCisJICogCisJICovCisJcHJvdGVjdGVkIE1hcCBleHRyYWN0UG9wdWxhdGlvbkRhdGEoU3RyaW5nIGZpbGUsIGludCBsZXZlbCkgeworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gcE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisJCUVsZW1lbnQgcm9vdCA9IGxvYWRYTUwoZmlsZSk7CisJCS8vIGdldCBhbGwgdGhlIGVsZW1lbnRzCisJCU5vZGVMaXN0IG5sID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOyAvLyROT04tTkxTLTEkCisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7CisJCQlFbGVtZW50IGVsID0gKEVsZW1lbnQpIG5sLml0ZW0oaSk7CisJCQlTdHJpbmcgbmFtZSA9IGVsLmdldEF0dHJpYnV0ZSgibG9jYXRpb25JZCIpLnRvVXBwZXJDYXNlKCk7IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZyBwb3B1bGF0aW9uID0gZWwuZ2V0QXR0cmlidXRlKCJwb3B1bGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIFN0cmluZyBkZW5zaXR5ID0gZWwuZ2V0QXR0cmlidXRlKCJwb3B1bGF0aW9uX2RlbnNpdHkiKTsKKwkJCS8vIC8vJE5PTi1OTFMtMSQKKwkJCXBNYXAucHV0KG5hbWUsIHBvcHVsYXRpb24pOworCisJCX0KKworCQlyZXR1cm4gcE1hcDsKKwl9CisKKwkvLyBwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RQb3B1bGF0aW9uRGF0YShTdHJpbmcgZmlsZSwgaW50IGxldmVsKSB7CisJLy8KKwkvLyBTdHJpbmcgcG9wdWxhdGlvbkxpc3QgPSBudWxsOworCS8vCisJLy8gTWFwPFN0cmluZywgU3RyaW5nPiBwb3B1bGF0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJLy8KKwkvLyBFbGVtZW50IHJvb3QgPSBsb2FkWE1MKGZpbGUpOworCS8vIC8vIGdldCBhbGwgdGhlIGVsZW1lbnRzCisJLy8gTm9kZUxpc3QgbmwgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7IC8vJE5PTi1OTFMtMSQKKwkvLworCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgeworCS8vIEVsZW1lbnQgZWwgPSAoRWxlbWVudCkgbmwuaXRlbShpKTsKKwkvLyBTdHJpbmcgbmFtZSA9IGVsLmdldEF0dHJpYnV0ZSgibG9jYXRpb25JZCIpLnRvVXBwZXJDYXNlKCk7IC8vJE5PTi1OTFMtMSQKKwkvLyBTdHJpbmcgcG9wdWxhdGlvbiA9IGVsLmdldEF0dHJpYnV0ZSgicG9wdWxhdGlvbiIpOyAvLyROT04tTkxTLTEkCisJLy8gU3RyaW5nIGRlbnNpdHkgPSBlbC5nZXRBdHRyaWJ1dGUoInBvcHVsYXRpb25fZGVuc2l0eSIpOyAvLyROT04tTkxTLTEkCisJLy8gLy8gU3RvcmUgKGNvbmNhdGVuYXRlKQorCS8vIGlmIChwb3B1bGF0aW9uTGlzdCA9PSBudWxsKSB7CisJLy8gcG9wdWxhdGlvbkxpc3QgPSBuYW1lICsgIjoiICsgU3RyaW5nLnZhbHVlT2YobGV2ZWwpICsgIjoiIC8vJE5PTi1OTFMtMSQKKwkvLyAvLyROT04tTkxTLTIkCisJLy8gKyBwb3B1bGF0aW9uICsgIjoiICsgZGVuc2l0eSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8vIH0gZWxzZSB7CisJLy8gcG9wdWxhdGlvbkxpc3QgKz0gbmFtZSArICI6IiArIFN0cmluZy52YWx1ZU9mKGxldmVsKSArICI6IiAvLyROT04tTkxTLTEkCisJLy8gLy8kTk9OLU5MUy0yJAorCS8vICsgcG9wdWxhdGlvbiArICI6IiArIGRlbnNpdHkgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkvLyB9CisJLy8gfQorCS8vCisJLy8gcmV0dXJuIHBvcHVsYXRpb25MaXN0OworCS8vIH0KKworCS8qKgorCSAqIFJlYWQgYWxsIGFyZ3VtZW50cyBpbiBhIGRhdGFzZXQsIG9uZSBieSBvbmUuCisJICogCisJICogQHBhcmFtIHRoZQorCSAqICAgICAgICAgICAgZmlsZW5hbWUKKwkgKiAKKwkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbWFwIHdpdGggdHVwbGVzIChLZXk9SUQsVmFsdWU9TmFtZSkKKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwIGV4dHJhY3ROYW1lRGF0YShTdHJpbmcgZmlsZSkgeworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gbmFtZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisJCUVsZW1lbnQgcm9vdCA9IGxvYWRYTUwoZmlsZSk7CisJCS8vIGdldCBhbGwgdGhlIGVsZW1lbnRzCisJCU5vZGVMaXN0IG5sID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOyAvLyROT04tTkxTLTEkCisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7CisJCQlFbGVtZW50IHJlZ2lvbnMgPSAoRWxlbWVudCkgbmwuaXRlbShpKTsKKwkJCU5vZGVMaXN0IGxvY2F0aW9ucyA9IHJlZ2lvbnMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgbG9jYXRpb25zLmdldExlbmd0aCgpOyBqKyspIHsKKwkJCQlFbGVtZW50IGVsID0gKEVsZW1lbnQpIGxvY2F0aW9ucy5pdGVtKGopOworCQkJCVN0cmluZyBpZCA9IGVsLmdldEF0dHJpYnV0ZSgiaWQiKS50b1VwcGVyQ2FzZSgpOyAvLyROT04tTkxTLTEkCisJCQkJU3RyaW5nIG5hbWUgPSBlbC5nZXRBdHRyaWJ1dGUoIm5hbWUiKS50b1VwcGVyQ2FzZSgpOyAvLyROT04tTkxTLTEkCisKKwkJCQkvLyBTdG9yZSBib3RoIHZhbHVlcyBmb3IgbGF0ZXIgbG9va3VwLiBVc2UgdXBwZXJjYXNlLgorCQkJCW5hbWVNYXAucHV0KGlkLCBuYW1lKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBuYW1lTWFwOworCX0KKworCS8qKgorCSAqIEZpbmQgYWxsIG1hdGNoZXMgYmV0d2VlbiBsb2NhdGlvbnMgYW5kIGZvcm0gYSBuZXcgdHVwbGUgd2l0aCB0aGUgbG9jYXRpb24KKwkgKiBuYW1lIGFuZCBhcmVhIHZhbHVlIGZvciBlYWNoIGxvY2F0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBtMQorCSAqICAgICAgICAgICAgQSBtYXAgY29udGFpbmluZyB0dXBsZXMgb2YgdGhlIGZvcm0gKGxvY2F0aW9uLHBvcHVsYXRpb24pCisJICogQHBhcmFtIG0yCisJICogICAgICAgICAgICBBIG1hcCBjb250YWluaW5nIHR1cGxlcyBvZiB0aGUgZm9ybSAobG9jYXRpb24sbmFtZSkKKwkgKiBAcGFyYW0gbGV2ZWwKKwkgKiAgICAgICAgICAgIFRoZSBhZG1pbmlzdHJhdGl2ZSBsZXZlbAorCSAqIAorCSAqIHNAcmV0dXJuIEEgdHVwbGUgb2YgdGhlIGZvcm0gKG5hbWU6YXJlYSkKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG1hdGNoKE1hcCBtMSwgTWFwIG0yLCBpbnQgbGV2ZWwpIHsKKworCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKwkJU2V0IGtleXMgPSBtMS5rZXlTZXQoKTsKKwkJSXRlcmF0b3IgaXQxID0ga2V5cy5pdGVyYXRvcigpOworCisJCXdoaWxlIChpdDEuaGFzTmV4dCgpKSB7CisKKwkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdDEubmV4dCgpOworCisJCQlpZiAobTIuY29udGFpbnNLZXkoa2V5KSkgeyAvLyBUbyBiZSBtb3JlIHN0cmljdCwgY2hhbmdlIHRoaXMgdG8KKwkJCQkvLyBtMi5lcXVhbHMoa2V5KQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCisJCQkJCWlmICgoKFN0cmluZykgbTIuZ2V0KGtleSkpLnN0YXJ0c1dpdGgoIjoiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkrIG0yLmdldChrZXkpKTsKKwkJCQkJfQorCisJCQkJCXJlc3VsdCA9IG0yLmdldChrZXkpICsgIjoiICsgU3RyaW5nLnZhbHVlT2YobGV2ZWwpICsgIjoiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCSsgbTEuZ2V0KGtleSkgKyAiXG4iOyAvLyROT04tTkxTLTEkCisJCQkJfSBlbHNlIHsKKwkJCQkJcmVzdWx0ICs9IG0yLmdldChrZXkpICsgIjoiICsgU3RyaW5nLnZhbHVlT2YobGV2ZWwpICsgIjoiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCSsgbTEuZ2V0KGtleSkgKyAiXG4iOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogUHJvY2VzcyBvdXIgZ2xvYmFsIGxpc3Qgb2YgY291bnRyaWVzLgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7CisKKwkJUHJpbnRXcml0ZXIgb3V0cHV0RmlsZSA9IG51bGw7CisKKwkJLy8gQWRtaW4gbGV2ZWxzIGZvciBlYWNoIGNvdW50cnkKKwkJLy8gVE8gRE86IGZpeCB0aGVzZSBoYXJkY29kZWQgdmFyaWFibGVzLiBTaG91bGQgYmUgc2V0IHZpYSBwYXJhbWV0ZXJzLgorCQlmaW5hbCBTdHJpbmcgcG9wdWxhdGlvblBhdGggPSAiQzpcXEVjbGlwc2VQcm9qZWN0c1xcd29ya3NwYWNlMlxcR3JlZW5TY3JlZW5cXEluc3RhbGxUZW1wbGF0ZVxcUG9wdWxhdGlvbnNcXCI7IC8vJE5PTi1OTFMtMSQKKwkJZmluYWwgU3RyaW5nIG5hbWVQYXRoID0gIkM6XFxFY2xpcHNlUHJvamVjdHNcXHdvcmtzcGFjZTJcXEdyZWVuU2NyZWVuXFxJbnN0YWxsVGVtcGxhdGVcXE1hcHNcXCI7IC8vJE5PTi1OTFMtMSQKKworCQlmaW5hbCBpbnQgTEVWRUxTID0gMTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldExpc3Quc2l6ZSgpOyBpKyspIHsKKworCQkJLy8gR2V0IHRoZSBuZXh0IGNvdW50cnkgaW4gdGhlIGxpc3QuCisJCQlTdHJpbmcgY291bnRyeSA9ICgoU3RyaW5nKSB0YXJnZXRMaXN0LmdldChpKSkudHJpbSgpOworCisJCQkvLyBHZXQgdGhlIElTTzMxNjYtMSBpbmZvIGZvciB0aGlzIGNvdW50cnkKKwkJCUlTT0NvZGUxIGlzb0NvZGUgPSBHZW5VdGlscy5nZXRJU09Db2RlKGNvdW50cnksIGNvZGVMaXN0KTsKKworCQkJaWYgKGlzb0NvZGUgPT0gbnVsbCkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaXNvIGNvZGUgaXMgbnVsbCBmb3IgIiArIGNvdW50cnkpOyAvLyROT04tTkxTLTEkCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bnRyeSBpcyA6ICAiICsgY291bnRyeSArICIgY29kZSA9ICIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCSsgaXNvQ29kZS5nZXROYW1lKCkpOworCisJCQkvLyBPcGVuIG91dHB1dCBmaWxlCisJCQlpZiAob3V0cHV0RmlsZSA9PSBudWxsKSB7CisJCQkJU3RyaW5nIGZpbGVOYW1lID0gb3V0cHV0RGlyOworCQkJCWZpbGVOYW1lICs9IGlzb0NvZGUuZ2V0TmFtZSgpICsgIl9QT1BVTEFUSU9OLnR4dCI7IC8vJE5PTi1OTFMtMSQKKwkJCQlvdXRwdXRGaWxlID0gR2VuVXRpbHMub3BlbldyaXRlcihmaWxlTmFtZSk7CisJCQl9CisKKwkJCWZvciAoaW50IGogPSAwOyBqIDw9IExFVkVMUzsgaisrKSB7CisKKwkJCQkvLyBPcGVuIHRoZSBwb3B1bGF0aW9uIGZpbGUKKwkJCQlTdHJpbmcgcG9wdWxhdGlvbkZpbGUgPSBwb3B1bGF0aW9uUGF0aDsKKwkJCQlwb3B1bGF0aW9uRmlsZSArPSBpc29Db2RlLmdldEFscGhhMygpICsgIl9IdW1hbl8iICsgaiArICIueG1sIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJQnVmZmVyZWRSZWFkZXIgcG9wdWxhdGlvblJlYWRlciA9IEdlblV0aWxzCisJCQkJCQkub3BlblJlYWRlcihwb3B1bGF0aW9uRmlsZSk7CisJCQkJaWYgKHBvcHVsYXRpb25SZWFkZXIgPT0gbnVsbCkgeworCQkJCQlTeXN0ZW0ub3V0CisJCQkJCQkJLnByaW50bG4oIkZpbGUgbm90IGZvdW5kIGZvciA6ICIgKyBwb3B1bGF0aW9uRmlsZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJLy8gT3BlbiB0aGUgbmFtZXMgZmlsZQorCQkJCVN0cmluZyBuYW1lRmlsZSA9IG5hbWVQYXRoOworCQkJCW5hbWVGaWxlICs9IGlzb0NvZGUuZ2V0QWxwaGEzKCkgKyAiX05hbWVzXyIgKyBqICsgIi54bWwiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlCdWZmZXJlZFJlYWRlciBuYW1lUmVhZGVyID0gR2VuVXRpbHMub3BlblJlYWRlcihuYW1lRmlsZSk7CisJCQkJaWYgKG5hbWVSZWFkZXIgPT0gbnVsbCkgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIGZvciA6ICIgKyBuYW1lRmlsZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJLy8gTG9hZCB0aGUgWE1MIGFyZWEgYW5kIG5hbWVzIGRvY3VtZW50cyBhbmQgZXh0cmFjdCB0aGUgZGF0YSB3ZQorCQkJCS8vIG5lZWQKKwkJCQl0cnkgeworCQkJCQkvLyBwb3B1bGF0aW9uTGlzdCA9IGV4dHJhY3RQb3B1bGF0aW9uRGF0YShwb3B1bGF0aW9uRmlsZSwKKwkJCQkJLy8gaik7CisJCQkJCXBvcHVsYXRpb25NYXAgPSBleHRyYWN0UG9wdWxhdGlvbkRhdGEocG9wdWxhdGlvbkZpbGUsIGopOworCQkJCQluYW1lTWFwID0gZXh0cmFjdE5hbWVEYXRhKG5hbWVGaWxlKTsKKwkJCQkJLy8gbm93IGRvIHRoZSBtYXRjaGluZ3MKKwkJCQkJU3RyaW5nIHR1cGxlID0gbWF0Y2gocG9wdWxhdGlvbk1hcCwgbmFtZU1hcCwgaik7CisKKwkJCQkJLy8gd3JpdGUgbWF0Y2ggdG8gb3V0cHV0IGZpbGUKKwkJCQkJLy8gb3V0cHV0RmlsZS53cml0ZShwb3B1bGF0aW9uTGlzdC50b1N0cmluZygpKTsKKwkJCQkJb3V0cHV0RmlsZS53cml0ZSh0dXBsZSk7CisKKwkJCQkJLy8gQ2xvc2UgdGhlIHJlc291cmNlcworCQkJCQlwb3B1bGF0aW9uUmVhZGVyLmNsb3NlKCk7CisJCQkJCW5hbWVSZWFkZXIuY2xvc2UoKTsKKwkJCQkJcG9wdWxhdGlvblJlYWRlciA9IG51bGw7CisJCQkJCW5hbWVSZWFkZXIgPSBudWxsOworCQkJCQlwb3B1bGF0aW9uRmlsZSA9IG51bGw7CisJCQkJCW5hbWVGaWxlID0gbnVsbDsKKworCQkJCQkvLyBSdW4gZ2FyYmFnZSBjb2xsZWN0aW9uCisJCQkJCS8vU3lzdGVtLmdjKCk7CisKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0gLy8gZm9yIGoKKworCQkJaWYgKG91dHB1dEZpbGUgIT0gbnVsbCkgeworCQkJCW91dHB1dEZpbGUuY2xvc2UoKTsKKwkJCQlvdXRwdXRGaWxlID0gbnVsbDsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIE1haW4gZXhlY3V0aW9uIGVudHJ5IHBvaW50LgorCSAqIAorCSAqIEBwYXJhbSBhcmdzCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlmaW5hbCBpbnQgSVNPX0ZJTEUgPSAwOworCQlmaW5hbCBpbnQgQ09VTlRSWV9GSUxFID0gMTsKKwkJZmluYWwgaW50IE9VVFBVVF9ESVIgPSAyOworCQlmaW5hbCBpbnQgUEFSQU1TID0gMzsKKworCQlpZiAoYXJncy5sZW5ndGggPCBQQVJBTVMpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJcdFRvIHJ1biwgcGxlYXNlIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhcmd1bWVudHMgOiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IElTTyAzMTY2LTEgZmlsZSIpOyAvLyROT04tTkxTLTEkCQkJCQkJCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgVGFyZ2V0IGNvdW50cmllcyBmaWxlIik7IC8vJE5PTi1OTFMtMSQJCQkKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBPdXRwdXQgZGlyZWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQJCQkJCQkJCQorCQkJcmV0dXJuOworCQl9CisKKwkJUG9wdWxhdGlvbkRhdGFNaWdyYXRvciBtaWdyYXRvciA9IG5ldyBQb3B1bGF0aW9uRGF0YU1pZ3JhdG9yKAorCQkJCWFyZ3NbSVNPX0ZJTEVdLCBhcmdzW0NPVU5UUllfRklMRV0sIGFyZ3NbT1VUUFVUX0RJUl0pOworCQltaWdyYXRvci5ydW4oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvUG9wdWxhdGlvbkdlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9Qb3B1bGF0aW9uR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRiMWJmNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvUG9wdWxhdGlvbkdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTE1OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VuZXJhdG9yczsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFNURU0gSUkgRGF0YSBNaWdyYXRpb24vR2VuZXJhdGlvbiBVdGlsaXRpZXMgLS0gVGhpcyBjbGFzcyBpcyBhIHV0aWxpdHkgdG8KKyAqIGdlbmVyYXRlIHRoZSBwb3B1bGF0aW9uLnByb3BlcnRpZXMgZmlsZXMuCisgKiAKKyAqIAorICogVG8gY29uZmlndXJlLCBzZWUgY29uZmlndXJhdGlvbiBmaWxlIDoKKyAqIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL1BvcHVsYXRpb25HZW5lcmF0b3IuY29uZmlnCisgKiAKKyAqIAorICogVG8gcnVuLCBhZGQgcGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUgaW4gdGhlIHJ1biBwcm9maWxlIChpLmUuCisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGNvbmZpZ3VyYXRpb25cUG9wdWxhdGlvbkdlbmVyYXRvci5jb25maWcpCisgKiAKKyAqIFNFVCBWTUFSR1MgVE8gOiAtWG1zMTAyNG0gLVhteDEwMjRtCisgKiAKKyAqLworCitwdWJsaWMgY2xhc3MgUG9wdWxhdGlvbkdlbmVyYXRvciB7CisKKwlwcml2YXRlIFN0cmluZyBpc28zMTY2XzEgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgaXNvMzE2Nl8yID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIGZpeEZpbGUgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0RmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBwb3B1bGF0aW9uRGF0YSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBwb3B1bGF0aW9uUHJvZmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBsZXhEaXIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RGlyID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIHdvcmtzcGFjZSA9IG51bGw7CisKKwkvKioKKwkgKiBMaXN0cyBmb3IgSVNPIDMxNjYtMSBjb2RlcywgdGFyZ2V0IGNvdW50cmllcywgYW5kIHBvcHVsYXRpb24gZGF0YS4KKwkgKi8KKworCUxpc3QgdGFyZ2V0TGlzdCA9IG51bGw7CisKKwlMaXN0IGNvZGVMaXN0ID0gbnVsbDsKKworCUxpc3QgY29kZWZpeExpc3QgPSBudWxsOworCisJTGlzdCBwb3B1bGF0aW9uTGlzdCA9IG51bGw7CisKKwlMaXN0IHBvcHVsYXRpb25Qcm9maWxlTGlzdCA9IG51bGw7CisKKwlMaXN0IHVzYUxldmVsMkxpc3QgPSBudWxsOworCisJLyoqCisJICogSGFzaCBzZXQgZm9yIHN0b3JpbmcgdGhlIHNvdXJjZSBVUkxzIHJlbGV2YW50IHRvIGFyZWEgZGF0YS4KKwkgKi8KKwlTZXQ8U3RyaW5nPiB1cmxTZXQgPSBudWxsOworCisJLyoqCisJICogSGFzaCBtYXAgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBzb3VyY2VzIHdpbGwgYmUgc2hvd24gY29tbWVudGVkIG91dCBhbmQKKwkgKiB3aGljaCB3aWxsIGFwcGVhciBhY3RpdmUuCisJICovCisJSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+IHVybFN0YXR1cyA9IG51bGw7CisKKwkvKioKKwkgKiBTdHJpbmcgdXNlZCB0byBpbmRpY2F0ZSBkZWZhdWx0IHZhbHVlIGZvciB1bmtub3duIGFyZWFzLgorCSAqLworCVN0cmluZyBERUZBVUxUID0gIjAiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqIAorCSAqIEBwYXJhbSBpc28zMTY2XzEgLQorCSAqICAgICAgICAgICAgZGF0YSBmaWxlIHdpdGggdGhlIElTTzMxNjYtMSBBTFBIQV8yIGFuZCBBTFBIQV8zIGNvZGVzLgorCSAqIEBwYXJhbSBpc28zMTY2XzIgLQorCSAqICAgICAgICAgICAgZmlsZSB3aXRoIHRoZSBJU08zMTY2LTIgZGF0YSB1c2VkIGZvciBnZW5lcmF0aW5nIHRoZSBJRHMuCisJICogQHBhcmFtIGZpeEZpbGUgLQorCSAqICAgICAgICAgICAgZmlsZSBjb250YWluaW5nIG1pc3NpbmcgSVNPMzE2Ni0yIGNvZGVzCisJICogQHBhcmFtIHBvcHVsYXRpb25EYXRhIC0KKwkgKiAgICAgICAgICAgIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBwb3B1bGF0aW9uIGRhdGEgZm9yIGFsbCBjb3VudHJpZXMKKwkgKiBAcGFyYW0gcG9wdWxhdGlvblByb2ZpbGUgLQorCSAqICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHBvcHVsYXRpb24gcHJvZmlsZSBkYXRhIGZvciBhbGwKKwkgKiAgICAgICAgICAgIGNvdW50cmllcworCSAqIEBwYXJhbSB0YXJnZXRGaWxlIC0KKwkgKiAgICAgICAgICAgIGRhdGEgZmlsZSB3aGVyZSB3ZSBmaW5kIGEgbGlzdCBvZiBjb3VudHJpZXMgZm9yIGdlbmVyYXRpb24gb2YKKwkgKiAgICAgICAgICAgIHRoZWlyIGNvcnJlc3BvbmRpbmcgYXJlYS5wcm9wZXJ0aWVzIGZpbGVzLgorCSAqIEBwYXJhbSBsZXhEaXIKKwkgKiAgICAgICAgICAgIGZvbGRlciBjb250YWluaW5nIGxleGljb2dyYXBoaWNhbGx5IHNvcnRlZCBmaWxlcworCSAqIEBwYXJhbSBvdXRwdXREaXIgLQorCSAqICAgICAgICAgICAgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlcyBnZW5lcmF0ZWQuCisJICogCisJICovCisJLy8gcHVibGljIFBvcHVsYXRpb25HZW5lcmF0b3IoU3RyaW5nIGlzbzMxNjZfMSwgU3RyaW5nIGlzbzMxNjZfMiwKKwkvLyBTdHJpbmcgZml4RmlsZSwgU3RyaW5nIHBvcHVsYXRpb25EYXRhLCBTdHJpbmcgcG9wdWxhdGlvblByb2ZpbGUsCisJLy8gU3RyaW5nIHRhcmdldEZpbGUsIFN0cmluZyBsZXhEaXIsIFN0cmluZyBvdXRwdXREaXIpIHsKKwkvLyAvLyBTZXQgdmFsdWVzIG9mIGdsb2JhbCB2YXJpYWJsZXMuCisJLy8gdGhpcy5pc28zMTY2XzEgPSBpc28zMTY2XzE7CisJLy8gdGhpcy5pc28zMTY2XzIgPSBpc28zMTY2XzI7CisJLy8gdGhpcy5maXhGaWxlID0gZml4RmlsZTsKKwkvLyB0aGlzLnRhcmdldEZpbGUgPSB0YXJnZXRGaWxlOworCS8vIHRoaXMub3V0cHV0RGlyID0gb3V0cHV0RGlyOworCS8vIHRoaXMucG9wdWxhdGlvbkRhdGEgPSBwb3B1bGF0aW9uRGF0YTsKKwkvLyB0aGlzLnBvcHVsYXRpb25Qcm9maWxlID0gcG9wdWxhdGlvblByb2ZpbGU7CisJLy8gdGhpcy5sZXhEaXIgPSBsZXhEaXI7CisJLy8gdGFyZ2V0TGlzdCA9IG51bGw7CisJLy8gLy8gU2V0IHRoZSBVUkwgSURzIHRoYXQgYXJlIHJlbGV2YW50IGZvciBhcmVhIGRhdGEuCisJLy8gaW5pdFBvcHVsYXRpb25VUkxTZXQoKTsKKwkvLyAvLyBTZXQgd2hpY2ggVVJMcyBhcmUgYWN0aXZlIGFuZCB3aGljaCBvbmVzIHNob3VsZCBiZSBjb21tZW50ZWQgb3V0LgorCS8vIHNldFVSTFN0YXR1cygpOworCS8vIH0KKwkvKioKKwkgKiBAcGFyYW0gY29uZmlnRmlsZQorCSAqLworCXB1YmxpYyBQb3B1bGF0aW9uR2VuZXJhdG9yKFN0cmluZyBjb25maWdGaWxlKSB7CisKKwkJLy8gTG9hZCBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKKwkJSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFycyA9IEdlblV0aWxzLmxvYWRDb25maWdGaWxlKGNvbmZpZ0ZpbGUpOworCisJCVNldDxTdHJpbmc+IGtleXMgPSB2YXJzLmtleVNldCgpOworCQlJdGVyYXRvciBpdCA9IGtleXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJU3RyaW5nIHZhciA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKworCQkJLy8gQXNzaWduIHZhbHVlcyB0byBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyA6CisJCQlpZiAodmFyLmVxdWFscygiV09SS1NQQUNFIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXdvcmtzcGFjZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIklTTzMxNjZfMSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpc28zMTY2XzEgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJJU08zMTY2XzIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJaXNvMzE2Nl8yID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiSVNPX0ZJWCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlmaXhGaWxlID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiQVJFQV9QT1AiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJcG9wdWxhdGlvbkRhdGEgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJQT1BfUFJPRklMRVMiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJcG9wdWxhdGlvblByb2ZpbGUgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJUQVJHRVRfTElTVCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl0YXJnZXRGaWxlID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiTEVYX0RJUiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlsZXhEaXIgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJQUk9QRVJUSUVTX09VVFBVVCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlvdXRwdXREaXIgPSB2YXJzLmdldCh2YXIpOworCQkJfQorCisJCX0gLy8gd2hpbGUKKworCQkvLyBUaGUgd29ya3NwYWNlIHZhcmlhYmxlIHNob3VsZCBlbmQgd2l0aCBhIHNsYXNoIGNoYXJhY3RlcgorCQlpZiAod29ya3NwYWNlLmVuZHNXaXRoKCJcXCIpID09IGZhbHNlKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXdvcmtzcGFjZSArPSAiXFwiOyAvLyROT04tTkxTLTEkCisJCX0KKworCQlTdHJpbmcgcGF0aCA9IHdvcmtzcGFjZSArIEdlbkNvbnN0YW50cy5QQVJBTVNfRElSOworCisJCS8vIFNldCByZW1haW5pbmcgY29uZmlnIHZhcnMgdXNpbmcgV09SS1NQQUNFICh3b3Jrc3BhY2UgcmVsYXRpdmUpCisJCWlmIChpc28zMTY2XzEgPT0gbnVsbCkgeworCQkJaXNvMzE2Nl8xID0gcGF0aCArIEdlbkNvbnN0YW50cy5JU08zMTY2XzFfRklMRTsKKwkJfQorCQlpZiAoaXNvMzE2Nl8yID09IG51bGwpIHsKKwkJCWlzbzMxNjZfMiA9IHBhdGggKyBHZW5Db25zdGFudHMuSVNPMzE2Nl8yX0ZJTEU7CisJCX0KKwkJaWYgKGZpeEZpbGUgPT0gbnVsbCkgeworCQkJZml4RmlsZSA9IHBhdGggKyBHZW5Db25zdGFudHMuSVNPRklYX0ZJTEU7CisJCX0KKwkJaWYgKHBvcHVsYXRpb25EYXRhID09IG51bGwpIHsKKwkJCXBvcHVsYXRpb25EYXRhID0gcGF0aCArIEdlbkNvbnN0YW50cy5BUkVBX1BPUFVMQVRJT05fRElSOworCQl9CisJCWlmIChwb3B1bGF0aW9uUHJvZmlsZSA9PSBudWxsKSB7CisJCQlwb3B1bGF0aW9uUHJvZmlsZSA9IHBhdGggKyBHZW5Db25zdGFudHMuUE9QVUxBVElPTl9QUk9GSUxFUzsKKwkJfQorCQlpZiAodGFyZ2V0RmlsZSA9PSBudWxsKSB7CisJCQl0YXJnZXRGaWxlID0gcGF0aCArIEdlbkNvbnN0YW50cy5DT1VOVFJJRVNfTElTVDsKKwkJfQorCQlpZiAobGV4RGlyID09IG51bGwpIHsKKwkJCWxleERpciA9IHBhdGggKyBHZW5Db25zdGFudHMuTEVYX0RJUjsKKwkJfQorCQlpZiAob3V0cHV0RGlyID09IG51bGwpIHsKKwkJCW91dHB1dERpciA9IHdvcmtzcGFjZSArIEdlbkNvbnN0YW50cy5QUk9QRVJUSUVTX09VVFBVVF9ESVI7CisJCX0KKworCQl0YXJnZXRMaXN0ID0gbnVsbDsKKwkJLy8gU2V0IHRoZSBVUkwgSURzIHRoYXQgYXJlIHJlbGV2YW50IGZvciBhcmVhIGRhdGEuCisJCWluaXRQb3B1bGF0aW9uVVJMU2V0KCk7CisJCS8vIFNldCB3aGljaCBVUkxzIGFyZSBhY3RpdmUgYW5kIHdoaWNoIG9uZXMgc2hvdWxkIGJlIGNvbW1lbnRlZCBvdXQuCisJCXNldFVSTFN0YXR1cygpOworCisJfQorCisJLyoqCisJICogU2V0cyB0aGUgVVJMIElEcyByZWxldmFudCBmb3IgYXJlYSBkYXRhLiBUaGlzIGNhbiBiZSBkaWZmZXJlbnQgZm9yCisJICogZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEuIEZvciBleGFtcGxlLCBmb3IgcG9wdWxhdGlvbiBkYXRhLCB3ZSBhcmUKKwkgKiBpbnRlcmVzdGVkIG9uIElEID0gQ0lBCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdFBvcHVsYXRpb25VUkxTZXQoKSB7CisJCXVybFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwkJdXJsU2V0LmFkZChuZXcgU3RyaW5nKCJVU0NFTlNVU1BPUCIpKTsgLy8kTk9OLU5MUy0xJAorCQl1cmxTZXQuYWRkKG5ldyBTdHJpbmcoIlVTQ0VOU1VTUFVFUlRPUklDTyIpKTsgLy8kTk9OLU5MUy0xJAorCQl1cmxTZXQuYWRkKG5ldyBTdHJpbmcoIkNJVFlQT1AiKSk7IC8vJE5PTi1OTFMtMSQKKwkJdXJsU2V0LmFkZChuZXcgU3RyaW5nKCJDSUEiKSk7IC8vJE5PTi1OTFMtMSQKKwkJdXJsU2V0LmFkZChuZXcgU3RyaW5nKCJQT1AiKSk7IC8vJE5PTi1OTFMtMSQKKwkJdXJsU2V0LmFkZChuZXcgU3RyaW5nKCJQT1AyIikpOyAvLyROT04tTkxTLTEkCisJCXVybFNldC5hZGQobmV3IFN0cmluZygiREVNT0dSQUZJQSIpKTsgLy8kTk9OLU5MUy0xJAorCQl1cmxTZXQuYWRkKG5ldyBTdHJpbmcoIlNUQVRPSURTIikpOyAvLyROT04tTkxTLTEkCisJCXVybFNldC5hZGQobmV3IFN0cmluZygiVU5JVEVETkFUSU9OUyIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFNldCB3aGljaCBVUkwgYXBwZWFycyBhcyB1bmNvbW1lbnRlZCBvciBBQ1RJVkUgYW5kIHdoaWNoIG9uZXMgYXBwZWFyIGFzCisJICogY29tbWVudGVkIG91dCBvciBTRUNPTkRBUlkuIE9ubHkgVVJMIHNob3VsZCBiZSBhY3RpdmUuIEFsbCBvdGhlcnMgc2hvdWxkCisJICogYXBwZWFyIGNvbW1lbnRlZC4KKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRVUkxTdGF0dXMoKSB7CisJCXVybFN0YXR1cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQm9vbGVhbj4oKTsKKwkJLy8gVGhpcyB3aWxsIGJlIHRoZSBhY3RpdmUgVVJMLgorCQl1cmxTdGF0dXMucHV0KCJDSUEiLCBuZXcgQm9vbGVhbih0cnVlKSk7IC8vJE5PTi1OTFMtMSQKKwkJLy8gQWxsIG90aGVyIFVSTHMgYXBwZWFyIGFzIGNvbW1lbnRlZCBvdXQsIHNlY29uZGFyeS4KKwkJdXJsU3RhdHVzLnB1dCgiVVNDRU5TVVNQT1AiLCBuZXcgQm9vbGVhbihmYWxzZSkpOyAvLyROT04tTkxTLTEkCisJCXVybFN0YXR1cy5wdXQoIlVTQ0VOU1VTUFVFUlRPUklDTyIsIG5ldyBCb29sZWFuKGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKKwkJdXJsU3RhdHVzLnB1dCgiQ0lUWVBPUCIsIG5ldyBCb29sZWFuKGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKKwkJdXJsU3RhdHVzLnB1dCgiQ0lBIiwgbmV3IEJvb2xlYW4oZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAorCQl1cmxTdGF0dXMucHV0KCJQT1AyIiwgbmV3IEJvb2xlYW4oZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAorCQl1cmxTdGF0dXMucHV0KCJQT1AiLCBuZXcgQm9vbGVhbihmYWxzZSkpOyAvLyROT04tTkxTLTEkCisJCXVybFN0YXR1cy5wdXQoIkRFTU9HUkFGSUEiLCBuZXcgQm9vbGVhbihmYWxzZSkpOyAvLyROT04tTkxTLTEkCisJCXVybFN0YXR1cy5wdXQoIlNUQVRPSURTIiwgbmV3IEJvb2xlYW4oZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAorCQl1cmxTdGF0dXMucHV0KCJVTklURUROQVRJT05TIiwgbmV3IEJvb2xlYW4odHJ1ZSkpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogUnVuIHRoZSBnZW5lcmF0b3IuCisJICogCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIGNvdW50cmllcyB3ZSB3YW50LgorCQl0YXJnZXRMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KHRhcmdldEZpbGUpOworCisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgSVNPMzE2Ni0xIEFMUEhBMiwgQUxQSEEzLCBhbmQKKwkJLy8gbnVtZXJpYyBjb2Rlcy4KKwkJY29kZUxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QoaXNvMzE2Nl8xKTsKKworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIG1pc3NpbmcgSVNPMzE2Ni0yIGNvZGVzCisJCWNvZGVmaXhMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KGZpeEZpbGUpOworCisJCS8vIFRISVMgSVMgQU4gU1BFQ0lBTCBDQVNFLgorCQkvLyBGT1IgVEhFIFVTQSBPTkxZLCBXRSBIQVZFIFRIRSBMRVZFTCAyIERBVEEgRk9SIEFMTCBDT1VOVElFUy4KKwkJdXNhTGV2ZWwyTGlzdCA9IEdlblV0aWxzCisJCQkJLnBvcHVsYXRlTGlzdChHZW5Db25zdGFudHMuVVNBX0xFVkVMXzJfUE9QVUxBVElPTik7CisKKwkJLy8gTm93LCBwcm9jZXNzIGVhY2ggaXRlbSBpbiB0aGUgdGFyZ2V0IGxpc3QuCisJCXByb2Nlc3MoKTsKKworCX0KKworCS8qKgorCSAqIFByb2Nlc3Mgb3VyIGdsb2JhbCBsaXN0IG9mIHRhcmdldCBjb3VudHJpZXMuIEZvciBlYWNoIGNvdW50cnkgaW4gbGlzdCwKKwkgKiBnZW5lcmF0ZSBpdHMgcG9wdWxhdGlvbi5wcm9wZXJ0aWVzIGZpbGUuCisJICogCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJvY2VzcygpIHsKKworCQlmaW5hbCBpbnQgTEVWRUxfMSA9IDE7CisJCWZpbmFsIGludCBMRVZFTF8yID0gMjsKKworCQkvLyBBIHdyaXRlciBmb3IgdGhlIG5ldyBmaWxlIHdlIGFyZSBjcmVhdGluZy4KKwkJUHJpbnRXcml0ZXIgcHJvcGVydGllc0ZpbGUgPSBudWxsOworCisJCS8vIE9iamVjdCBob2xkaW5nIElTTzMxNjYtMSByZWxhdGVkIGRhdGEuCisJCUlTT0NvZGUxIGlzb0NvZGUgPSBudWxsOworCisJCS8vIE5hbWUgb2YgdGhlIG5ldyBwcm9wZXJ0aWVzIGZpbGUuCisJCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7CisKKwkJLy8gQSBsaXN0IGZvciBJU08gMzE2Ni0yIG9iamVjdHMKKwkJTGlzdCBpc28yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKworCQkvLyBOYW1lIG9mIHRoZSBmaXggZmlsZSBmb3IgYSBnaXZlbiBjb3VudHJ5CisJCS8vIFN0cmluZyBmaXhGaWxlID0gbnVsbDsKKworCQkvLyBBIHdyaXRlciBmb3IgdGhlIGZpeCBmaWxlCisJCS8vIFByaW50V3JpdGVyIGZpeFdyaXRlciA9IG51bGw7CisKKwkJLy8gRmlsZW5hbWVzIGZvciBsZXgxIGFuZCBsZXgyIGZpbGVzIGZvciBhIGdpdmVuIGNvdW50cnkuCisJCVN0cmluZyBsZXhBZG1pbjFGaWxlID0gbnVsbDsKKwkJU3RyaW5nIGxleEFkbWluMkZpbGUgPSBudWxsOworCisJCS8vIExpc3RzIGhvbGRpbmcgdGhlIGxleDEgYW5kIGxleDIgdmFsdWVzLgorCQkvLyBOT1RFOiBsZXggdmFsdWVzIGFyZSB0aGUgbGV4aWNvZ3JhcGhpY2FsbHkgc29ydGVkIHZhbHVlcyBmb3IKKwkJLy8gYWRtaW5pc3RyYXRpb24gbGV2ZWxzLgorCQlMaXN0PFN0cmluZz4gbGV4MURhdGFTZXQgPSBudWxsOworCQlMaXN0PFN0cmluZz4gbGV4MkRhdGFTZXQgPSBudWxsOworCisJCS8vIExpc3RzIGZvciBob2xkaW5nIGxleDEgYW5kIGxleDIgb2JqZWN0cyBmb3IgYSBnaXZlbiBjb3VudHJ5LgorCQlMaXN0PExleDFPYmo+IGxleDFMaXN0ID0gbnVsbDsKKwkJTGlzdDxMZXgyT2JqPiBsZXgyTGlzdCA9IG51bGw7CisKKwkJaW50IHNpemUgPSB0YXJnZXRMaXN0LnNpemUoKTsKKworCQkvLyBJdGVyYXRlIGZvciBldmVyeSBjb3VudHJ5IGFuZCBjcmVhdGUgaXRzIHBvcHVsYXRpb24ucHJvcGVydGllcyBmaWxlLgorCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCisJCQkvLyBHZXQgdGhlIG5leHQgY291bnRyeSBpbiB0aGUgbGlzdC4KKwkJCVN0cmluZyBmaWxlID0gKChTdHJpbmcpIHRhcmdldExpc3QuZ2V0KGkpKS50cmltKCk7CisKKwkJCS8vIEFuIGluZGV4IGZvciB1bmtud29uIG9yIG4uYS4gZW50cmllcworCQkJaW50IHVua0NvdW50ZXIgPSAxOworCisJCQkvLyBPcGVuIHRoZSBkYXRhIHNvdXJjZSBmaWxlIGZvciB0aGlzIGNvdW50cnkuCisJCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBHZW5VdGlscy5vcGVuUmVhZGVyKGZpbGUpOworCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRcdDw8PDwgUE9QVUxBVElPTiBHRU5FUkFUT1IgLS0gUHJvY2Vzc2luZyBjb3VudHJ5IDogIiArIGZpbGUgKyAvLyROT04tTkxTLTEkCisJCQkJCQkJIj4+Pj4iKTsgLy8kTk9OLU5MUy0xJAorCQkJdHJ5IHsKKworCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgeworCisJCQkJCVN0cmluZyBidWZmZXIgPSBudWxsOworCQkJCQkvLyBEZXNjcmliZXMgbGV2ZWwKKwkJCQkJLy8gb2YgZGF0YSB3ZQorCQkJCQkvLyBhcmUgbm93IHByb2Nlc3NpbmcgOiBMRVZFTDAsIExFVkVMMSwgb3IgTEVWRUwyLgorCQkJCQlpbnQgbGV2ZWwgPSAtMTsKKworCQkJCQkvLyBSZWNvcmQgdGhlIHByZXZpb3VzIGxldmVsLgorCQkJCQlpbnQgb2xkTGV2ZWwgPSBsZXZlbCAtIDE7CisJCQkJCS8vIFdlIHRha2UgYSBjaHVuayBvZiB0aGUgZGF0YSBbQlVGRkVSX01JTixCVUZGRVJfTUFYXSB0bworCQkJCQkvLyBtYWtlIHByb2Nlc3NpbmcgbW9yZQorCQkJCQkvLyBlZmZpY2llbnQsIHdlIGRvbnQgbmVlZCBhbGwgb2YgaXQuCisJCQkJCWludCBCVUZGRVJfTUlOID0gMDsKKwkJCQkJaW50IEJVRkZFUl9NQVggPSAxMjA7CisJCQkJCS8vIFN0cmluZyB1c2VkIHRvIGlnbm9yZSByZXBlYXRlZCBlbnRyaWVzLgorCQkJCQlMaXN0PFN0cmluZz4gZW50cnlMaXN0ID0gbnVsbDsKKworCQkJCQl3aGlsZSAoR2VuVXRpbHMuRU9GKGJ1ZmZlciA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSB0cnVlKSB7CisKKwkJCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlIG1hcmsgYWxsIHVua25vd24gZGF0YS4KKwkJCQkJCWJ1ZmZlciA9IGJ1ZmZlci5yZXBsYWNlKCIsLCIsICIsVU5LTk9XTiwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQkJCS8vIFVzZSBvbmx5IHBhcnQgb2YgdGhlIGJ1ZmZlciwgbm90IGFsbCBvZiBpdCBmb3IKKwkJCQkJCS8vIGVmZmljaWVuY3kuCisJCQkJCQlTdHJpbmdbXSBpdGVtcyA9IEdlblV0aWxzCisJCQkJCQkJCS5leHRyYWN0KGJ1ZmZlci5sZW5ndGgoKSA8IEJVRkZFUl9NQVggPyBidWZmZXIKKwkJCQkJCQkJCQk6IGJ1ZmZlci5zdWJzdHJpbmcoQlVGRkVSX01JTiwKKwkJCQkJCQkJCQkJCUJVRkZFUl9NQVgpKTsKKworCQkJCQkJLy8gR2V0IHRoZSBjb3VudHJ5IG5hbWUKKwkJCQkJCVN0cmluZyBjb3VudHJ5ID0gaXRlbXNbSVNPRGF0YS5DT1VOVFJZX05BTUVdOworCisJCQkJCQkvLyBHZXQgdGhlIElTTzMxNjYtMSBpbmZvIGZvciB0aGlzIGNvdW50cnkKKwkJCQkJCWlmIChpc29Db2RlID09IG51bGwpIHsKKwkJCQkJCQlpc29Db2RlID0gR2VuVXRpbHMuZ2V0SVNPQ29kZShjb3VudHJ5LCBjb2RlTGlzdCk7CisJCQkJCQl9CisKKwkJCQkJCS8vIFdlIG5lZWQgYSBmaXggZmlsZSB0byBrZWVwIHRyYWNrIG9mIGFsbCB1bm1hdGNoZWQKKwkJCQkJCS8vIGl0ZW1zCisJCQkJCQkvLyBUTyBETyA6IG1hdGNoIGFsbCB1bm1hdGNoZWQgaXRlbXMgbWFudWFsbHkKKwkJCQkJCS8vIGlmIChmaXhXcml0ZXIgPT0gbnVsbCkgeworCQkJCQkJLy8gZml4RmlsZSA9IG91dHB1dERpciArICJMRVZFTDFfUE9QX0ZJWC50eHQiOworCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJGaXggZmlsZSBuYW1lIGlzIDogIiArIGZpeEZpbGUpOworCQkJCQkJLy8gLy8gT3BlbiB0aGUgZml4IHdyaXRlcgorCQkJCQkJLy8gZml4V3JpdGVyID0gR2VuVXRpbHMub3BlbldyaXRlcihmaXhGaWxlKTsKKwkJCQkJCS8vIH0KKworCQkJCQkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBwb3B1bGF0aW9uIGRhdGEKKwkJCQkJCS8vIGZvciB0aGlzIGNvdW50cnkuCisJCQkJCQlpZiAocG9wdWxhdGlvbkxpc3QgPT0gbnVsbCkgeworCQkJCQkJCVN0cmluZyBuYW1lID0gcG9wdWxhdGlvbkRhdGEgKyBjb3VudHJ5CisJCQkJCQkJCQkrICJfUE9QVUxBVElPTi50eHQiOyAvLyROT04tTkxTLTEkCisJCQkJCQkJcG9wdWxhdGlvbkxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QobmFtZSk7CisKKwkJCQkJCQkvLyBDcmVhdGUgdGhlIGZpbGUgbmFtZSBmb3IgdGhlIG5ldyBwcm9wZXJ0aWVzLmZpbGUuCisJCQkJCQkJbmFtZSA9IHBvcHVsYXRpb25Qcm9maWxlICsgIlxcIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkrIGlzb0NvZGUuZ2V0QWxwaGEzKCkgKyAiXFwiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCSsgaXNvQ29kZS5nZXRBbHBoYTMoKSArICJfIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkrICJwb3B1bGF0aW9uLnByb2ZpbGUiOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCQlwb3B1bGF0aW9uUHJvZmlsZUxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QobmFtZSk7CisKKwkJCQkJCX0KKworCQkJCQkJLy8gR2V0IHRoZSBsZXZlbCBvZiB0aGUgZGF0YSB3ZSBhcmUgcHJvY2Vzc2luZy4KKwkJCQkJCWxldmVsID0gR2VuVXRpbHMuZ2V0RGF0YUxldmVsKGl0ZW1zKTsKKworCQkJCQkJaWYgKGxldmVsICE9IDAgJiYgaXNvMkxpc3QgIT0gbnVsbCkgeworCQkJCQkJCS8vIExvYWQgdGhlIElTTyAzMTY2LTIgb2JqZWN0cyBmb3IgdGhpcyBjb3VudHJ5CisJCQkJCQkJaXNvMkxpc3QgPSBHZW5VdGlscy5sb2FkSVNPMihpc28zMTY2XzIpOworCQkJCQkJfQorCisJCQkJCQkvLyBUaGlzIHZhcmlhYmxlIGluZGljYXRlcyBhIHRyYW5zaXRpb24gaW4gb3VyIGRhdGEKKwkJCQkJCS8vIHByb2Nlc3NpbmcKKwkJCQkJCWJvb2xlYW4gdHJhbnNpdGlvbiA9IChsZXZlbCAhPSBvbGRMZXZlbCkgPyB0cnVlIDogZmFsc2U7CisKKwkJCQkJCWlmICh0cmFuc2l0aW9uID09IHRydWUpIHsKKwkJCQkJCQkvLyBLZWVwIHRyYWNrIG9mIHByZXZpb3VzIGxldmVsIGluIG9yZGVyIHRvIGRldGVjdAorCQkJCQkJCS8vIHRyYW5zaXRpb25zLgorCQkJCQkJCW9sZExldmVsID0gbGV2ZWw7CisJCQkJCQkJLy8gUmVzZXQgb3VyIHJlcGVhdGVkIGhpc3RvcnkKKwkJCQkJCQlpZiAoZW50cnlMaXN0ICE9IG51bGwpIHsKKwkJCQkJCQkJZW50cnlMaXN0LmNsZWFyKCk7CisJCQkJCQkJfQorCQkJCQkJCWVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisJCQkJCQkJLy8gUmVzZXQgY291bnRlciBvZiBVTktOT1dOIGFuZCBOLkEuIGVudHJpZXMuCisJCQkJCQkJdW5rQ291bnRlciA9IDE7CisJCQkJCQkJaWYgKHByb3BlcnRpZXNGaWxlICE9IG51bGwpIHsKKwkJCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0R2VuZXJhdGVkIDogIgorCQkJCQkJCQkvLyArIGZpbGVOYW1lKTsKKwkJCQkJCQkJcHJvcGVydGllc0ZpbGUuY2xvc2UoKTsKKwkJCQkJCQkJcHJvcGVydGllc0ZpbGUgPSBudWxsOworCQkJCQkJCQlmaWxlTmFtZSA9IG51bGw7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQkvLyBJZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IGZvciB0aGlzIGNvdW50cnksCisJCQkJCQkvLyBjcmVhdGUgaXQgdXNpbmcgSVNPIGFscGhhMyBjb2RlLgorCQkJCQkJRmlsZSBjb3VudHJ5RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyCisJCQkJCQkJCSsgaXNvQ29kZS5nZXRBbHBoYTMoKSk7CisKKwkJCQkJCWlmIChjb3VudHJ5RGlyICE9IG51bGwgJiYgY291bnRyeURpci5leGlzdHMoKSA9PSBmYWxzZSkgeworCQkJCQkJCS8vIERpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gQ3JlYXRlIGl0LgorCQkJCQkJCWNvdW50cnlEaXIubWtkaXIoKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gQ3JlYXRlIGFuZCBvcGVuIHRoZSBuZXcgZmlsZS4KKwkJCQkJCWlmIChwcm9wZXJ0aWVzRmlsZSA9PSBudWxsKSB7CisJCQkJCQkJLy8gQ3JlYXRlIHRoZSBmaWxlIG5hbWUgZm9yIHRoZSBuZXcgcHJvcGVydGllcy5maWxlLgorCQkJCQkJCVN0cmluZyBhbHBoYTMgPSBpc29Db2RlLmdldEFscGhhMygpOworCQkJCQkJCWZpbGVOYW1lID0gY291bnRyeURpciArICJcXCIgKyBhbHBoYTMgKyAiXyIgKyBsZXZlbCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkJCSsgIl9odW1hbl8yMDAwXyIgKyAicG9wdWxhdGlvbi5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJLy8gQ3JlYXRlIHRuZSBuZXcgcG9wdWxhdGlvbiBmaWxlIGZvciB0aGlzIGNvdW50cnkuCisJCQkJCQkJcHJvcGVydGllc0ZpbGUgPSBHZW5VdGlscy5vcGVuV3JpdGVyKGZpbGVOYW1lKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gVmFyaWFibGUgdXNlZCB0byBob2xkIHRoZSBmb3JtYXR0ZWQgb3V0cHV0IGRhdGEuCisJCQkJCQlTdHJpbmcgZGF0YSA9IG51bGw7CisKKwkJCQkJCS8vIFRoZSBjdXJyZW50IGVudGl0eSB3ZSBhcmUgZGVhbGluZyB3aXRoLgorCQkJCQkJLy8gQmFzZWQgb24gaXRzIGFkbWluIGxldmVsIGl0IGNhbiBiZSBhIGNvdW50cnksIGEKKwkJCQkJCS8vIGNvdW50eSwgZXRjOworCQkJCQkJU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisJCQkJCQkvLyBXZSBoYXZlIHN3aXRjaGVkIHRvIGEgZGlmZmVyZW50IGRhdGEgbGV2ZWwgKGksZSwKKwkJCQkJCS8vIGFkbWluIDAgdG8gYWRtaW4gMSkKKwkJCQkJCWlmICh0cmFuc2l0aW9uID09IHRydWUpIHsKKwkJCQkJCQkvLyBKdXN0IGFkZCB0aGUgaGVhZGVyCisJCQkJCQkJZGF0YSA9IGdldEhlYWRlcihpc29Db2RlLCBsZXZlbCk7CisJCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShwcm9wZXJ0aWVzRmlsZSwgZGF0YSk7CisJCQkJCQkJLy8gRm9yZ2V0IHRoZSBkYXRhIHdlIGp1c3Qgd3JvdGUuCisJCQkJCQkJZGF0YSA9IG51bGw7CisJCQkJCQl9CisKKwkJCQkJCS8vIERlc2NyaXB0b3IgZm9yIGN1cnJlbnQgZW50cnkuCisJCQkJCQlTdHJpbmcgZGVzY3JpcHRvciA9IG51bGw7CisKKwkJCQkJCXN3aXRjaCAobGV2ZWwpIHsKKworCQkJCQkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMDoKKworCQkJCQkJCS8vIEhhbmRsZSBkYXRhIGxldmVsIDAgZGlmZmVyZW50IHRoYXQgdGhlIG90aGVyCisJCQkJCQkJLy8gYWRtaW4gbGV2ZWxzLgorCisJCQkJCQkJaWYgKHRyYW5zaXRpb24gPT0gdHJ1ZSkgeworCQkJCQkJCQlkYXRhID0gIiMgQ291bnRyeVxuIjsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlkYXRhICs9IGlzb0NvZGUuZ2V0QWxwaGEzKCkgKyAiID0gIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBnZXRQb3B1bGF0aW9uKGNvdW50cnksIGxldmVsKTsKKwkJCQkJCQkJLy8gV3JpdGUgZm9ybWF0dGVkIG91dHB1dAorCQkJCQkJCQlHZW5VdGlscy5hZGREYXRhKHByb3BlcnRpZXNGaWxlLCBkYXRhKTsKKwkJCQkJCQl9CisJCQkJCQkJY29udGludWU7CisKKwkJCQkJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzE6CisJCQkJCQkJY3VycmVudCA9IGl0ZW1zW0lTT0RhdGEuQURNSU4xX05BTUVdLnRvVXBwZXJDYXNlKCk7CisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzI6CisJCQkJCQkJY3VycmVudCA9IGl0ZW1zW0lTT0RhdGEuQURNSU4yX05BTUVdLnRvVXBwZXJDYXNlKCk7CisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCX0gLy8gU3dpdGNoCisKKwkJCQkJCS8vIEhhbmRsZSBVTktOT1dOIGFuZCBOLkEuIGVudHJpZXMgZGlmZmVyZW50bHkuCisJCQkJCQlpZiAoY3VycmVudC5lcXVhbHMoIlVOS05PV04iKSB8fCBjdXJyZW50LmVxdWFscygiTi5BLiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQkJCQkJaWYgKGxldmVsID09IDEpIHsKKwkJCQkJCQkJY3VycmVudCA9IGlzb0NvZGUuZ2V0QWxwaGEyKCkgKyAiLVVOSy0iIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIFN0cmluZy52YWx1ZU9mKHVua0NvdW50ZXIrKyk7CisKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkvLyBMZXZlbCAyIGRhdGEuCisJCQkJCQkJCWN1cnJlbnQgPSBpc29Db2RlLmdldEFscGhhMygpICsgIi5MMi4iIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIFN0cmluZy52YWx1ZU9mKHVua0NvdW50ZXIrKyk7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQkvLyBWZXJpZnkgZm9yIHJlcGVhdGVkIGVudHJpZXMgLS0gYXZ2b2lkIGR1cGxjYXRlcworCQkJCQkJc3dpdGNoIChsZXZlbCkgeworCisJCQkJCQljYXNlIExFVkVMXzE6CisJCQkJCQkJaWYgKEdlblV0aWxzLmlzUmVwZWF0ZWQoY3VycmVudCwgZW50cnlMaXN0KSA9PSB0cnVlKSB7CisJCQkJCQkJCS8vIER1cGxpY2F0ZWQsIGlnbm9yZS4KKwkJCQkJCQkJY29udGludWU7CisJCQkJCQkJfQorCQkJCQkJCS8vIFJlbWVtYmVyIHRoaXMgZW50aXR5IHRvIGF2b2lkIGR1cGxpY2F0ZXMuCisJCQkJCQkJZW50cnlMaXN0LmFkZChjdXJyZW50KTsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSBMRVZFTF8yOgorCQkJCQkJCWlmIChHZW5VdGlscy5pc1JlcGVhdGVkKGl0ZW1zW0lTT0RhdGEuQURNSU4xX05BTUVdCisJCQkJCQkJCQkrIGN1cnJlbnQsIGVudHJ5TGlzdCkgPT0gdHJ1ZSkgeworCQkJCQkJCQkvLyBEdXBsaWNhdGVkLCBpZ25vcmUuCisJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCX0KKwkJCQkJCQkvLyBSZW1lbWJlciB0aGlzIGVudGl0eSB0byBhdm9pZCBkdXBsaWNhdGVzLgorCQkJCQkJCWVudHJ5TGlzdC5hZGQoaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0gKyBjdXJyZW50KTsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJfQorCisJCQkJCQkvLyBJZiBJU08yQ29kZSBpcyBlcXVhbCB0byBlbnRpdHksIHRoZW4gd2UgZG9udCBoYXZlIGEKKwkJCQkJCS8vIG1hdGNoLiBBZGQgaXQgdG8gZml4IGZpbGUuIERPTlQgREVMRVRFCisJCQkJCQkvLyBpZiAoZGVzY3JpcHRvci5lcXVhbHMoY3VycmVudCkgJiYgbGV2ZWwgPT0gMSkgeworCQkJCQkJLy8gLy8gVW5tYXRjaGVkIGl0ZW0sIGFkZCBpdCB0byBvdXIgZml4IGZpbGUKKwkJCQkJCS8vIGZpeFdyaXRlci53cml0ZShjb3VudHJ5ICsgIjoiICsgZGVzY3JpcHRvcgorCQkJCQkJLy8gKyAiOlVOS05PV046VU5LTk9XTlxuIik7CisJCQkJCQkvLyB9CisKKwkJCQkJCS8vIFdlIGdldCB0aGUgZGVzY3JpcHRvciBmb3IgYWRtaW5pc3RyYXRpb24gZW50aXRpZXMKKwkJCQkJCS8vIGRpZmZlcmVudGx5IGJhc2VkIG9uIGl0cyBsZXZlbC4KKworCQkJCQkJaWYgKGxldmVsID09IDIpIHsKKworCQkJCQkJCWlmIChsZXgxRGF0YVNldCA9PSBudWxsICYmIGxleDJEYXRhU2V0ID09IG51bGwpIHsKKworCQkJCQkJCQkvLyBDb21wb3NlIHRoZSBmaWxlIG5hbWVzIGZvciB0aGUgbGV4IGZpbGVzIGZvcgorCQkJCQkJCQkvLyB0aGlzCisJCQkJCQkJCS8vIGNvdW50cnkuCisJCQkJCQkJCWxleEFkbWluMUZpbGUgPSBsZXhEaXIgKyBpc29Db2RlLmdldEFscGhhMygpCisJCQkJCQkJCQkJKyAiXFwiICsgaXNvQ29kZS5nZXRBbHBoYTMoKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlsZXhBZG1pbjJGaWxlID0gbGV4QWRtaW4xRmlsZTsKKwkJCQkJCQkJbGV4QWRtaW4xRmlsZSArPSAiX0FETUlOMV9MRVgudHh0IjsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlsZXhBZG1pbjJGaWxlICs9ICJfQURNSU4yX0xFWC50eHQiOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCQkJLy8gTG9hZCB0aGUgbGV4MSBhbmQgbGV4MiBmaWxlcyBmb3IgdGhpcworCQkJCQkJCQkvLyBjb3VudHJ5LgorCQkJCQkJCQlsZXgxRGF0YVNldCA9IEdlblV0aWxzCisJCQkJCQkJCQkJLnBvcHVsYXRlTGlzdChsZXhBZG1pbjFGaWxlKTsKKwkJCQkJCQkJbGV4MkRhdGFTZXQgPSBHZW5VdGlscworCQkJCQkJCQkJCS5wb3B1bGF0ZUxpc3QobGV4QWRtaW4yRmlsZSk7CisKKwkJCQkJCQkJLy8gQ3JlYXRlIGEgbWV0aG9kIHRvIHNlYXJjaCBmb3IgYW4gaXRlbSBvbiBhCisJCQkJCQkJCS8vIGxpc3QKKwkJCQkJCQkJLy8gb2YgbGV4IGRhdGEgb2JqZWN0cy4KKwkJCQkJCQkJbGV4MUxpc3QgPSBHZW5VdGlscy5jcmVhdGVMZXgxTGlzdChsZXgxRGF0YVNldCk7CisJCQkJCQkJCWxleDJMaXN0ID0gR2VuVXRpbHMuY3JlYXRlTGV4Mkxpc3QobGV4MkRhdGFTZXQpOworCisJCQkJCQkJfQorCisJCQkJCQkJLy8gQ29tcG9zZSB0aGUgbGV2ZWwyIGRlc2NyaXB0b3IgdXNpbmcgdGhlIGxleCBkYXRhOgorCisJCQkJCQkJLy8gU1RFUCAxOiBEbyBhIGxvb2sgdXAgaW4gdGhlIGxleCAyIGxpc3RzLgorCisJCQkJCQkJLy8gR2V0IHRoZSBsZXggMiBvYmplY3QgZm9yIHRoZSBjdXJyZW50IGVudHJ5LgorCQkJCQkJCUxleDJPYmogbGV4MkN1cnJlbnQgPSBHZW5VdGlscy5sZXgyTG9va3VwKGxleDJMaXN0LAorCQkJCQkJCQkJaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0sIGN1cnJlbnQpOworCisJCQkJCQkJLy8gR2V0IHRoZSBsZXggMSBvYmplY3QgdG8gd2hpY2ggbGV4MkN1cnJlbnQgYmVsb25ncworCQkJCQkJCS8vIHRvLgorCQkJCQkJCUxleDFPYmogbGV4MUN1cnJlbnQgPSBHZW5VdGlscy5sZXgxTG9va3VwKGxleDFMaXN0LAorCQkJCQkJCQkJbGV4MkN1cnJlbnQuZ2V0QWRtaW4xKCkpOworCisJCQkJCQkJLy8gU1RFUCAyOiBwaWVjZSB0b2dldGhlciB0aGUgSUQgdXNpbmcgdGhlCisJCQkJCQkJLy8gcHJvcGVyIGxleCBvYmplY3RzIDogdGhlIFVTQSBpcyBhIHNwZWNpYWwKKwkJCQkJCQkvLyBjYXNlCisJCQkJCQkJaWYgKGxleDFDdXJyZW50LmdldERlc2NyaXB0b3IoKS5jb250YWlucygiVVMtIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlkZXNjcmlwdG9yID0gbGV4MUN1cnJlbnQuZ2V0RGVzY3JpcHRvcigpCisJCQkJCQkJCQkJKyAiLSIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgbGV4MUN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXgoKQorCQkJCQkJCQkJCSsgbGV4MkN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXhVU0EoKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlkZXNjcmlwdG9yID0gbGV4MUN1cnJlbnQuZ2V0RGVzY3JpcHRvcigpCisJCQkJCQkJCQkJKyAiLUciIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGxleDFDdXJyZW50LmdldEZvcm1hdHRlZEluZGV4KCkKKwkJCQkJCQkJCQkrIGxleDJDdXJyZW50LmdldEZvcm1hdHRlZEluZGV4KCk7CisJCQkJCQkJCS8vIEFkZCBzb21lIGNvbW1lbnMgdG8gYWxsb3cgcmV2ZXJzZSBlbmdpbmVlcmluZworCQkJCQkJCQkvLyBvcgorCQkJCQkJCQkvLyBiYWNrdHJhY2tpbmcgdGhlIG9yaWdpbiBvZiB0aGlzIGdlbmVyYXRlZCBrZXkKKwkJCQkJCQkJLy8gYXMKKwkJCQkJCQkJLy8gbXVjaCBhcyBwb3NzaWJsZS4KKwkJCQkJCQkJZGF0YSA9ICIjIEdlbmVyYXRlZCBrZXkgZGV0YWlscyA6ICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgIiBMZXZlbCAxICggIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBsZXgxQ3VycmVudC5nZXREZXNjcmlwdG9yKCkKKwkJCQkJCQkJCQkrICIgPSAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGxleDFDdXJyZW50LmdldEFkbWluMSgpCisJCQkJCQkJCQkJKyAiICkuICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgIkxldmVsIDIgKCAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGxleDFDdXJyZW50LmdldEZvcm1hdHRlZEluZGV4KCkKKwkJCQkJCQkJCQkrIGxleDJDdXJyZW50LmdldEZvcm1hdHRlZEluZGV4KCkKKwkJCQkJCQkJCQkrICIgPSAiICsgbGV4MkN1cnJlbnQuZ2V0QWRtaW4yKCkgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgIiApLiBcbiI7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJCX0KKworCQkJCQkJfSBlbHNlIHsgLy8gQ29tcG9zZSBkZXNjcmlwdG9yIGZvciBsZXZlbCAxIGFuZCBsZXZlbAorCQkJCQkJCS8vIDAgZGF0YQorCQkJCQkJCS8vIEdldCB0aGUgZGVzY3JpcHRvciBmb3IgdGhpcyBlbnRpdHkuCisJCQkJCQkJZGVzY3JpcHRvciA9IEdlblV0aWxzLmdldElTTzJEZXNjcmlwdG9yKGlzbzJMaXN0LAorCQkJCQkJCQkJY3VycmVudCwgaXNvQ29kZS5nZXRBbHBoYTIoKSk7CisKKwkJCQkJCQkvLyBJZiB3ZSBjYW50IGZpbmQgdGhlIGRlc2NyaXB0b3IsIHRoZW4gbG9vayBpbiB0aGUKKwkJCQkJCQkvLyBmaXggbGlzdC4KKwkJCQkJCQlpZiAoZGVzY3JpcHRvci5lcXVhbHMoY3VycmVudCkgPT0gdHJ1ZSkgeworCQkJCQkJCQkvLyBMb29rIGZvciBhIGRlc2NyaXB0b3IgaW4gdGhlIGZpeCBmaWxlCisJCQkJCQkJCWRlc2NyaXB0b3IgPSBHZW5VdGlscy5nZXRGaXhDb2RlKGNvZGVmaXhMaXN0LAorCQkJCQkJCQkJCWN1cnJlbnQsIGl0ZW1zW0lTT0RhdGEuQ09VTlRSWV9OQU1FXSk7CisKKwkJCQkJCQkJLy8gSWYgdGhlcmUgaXMgbm8gZGVzY3JpcHRvciBzdGlsbCwgZ2VuZXJhdGUKKwkJCQkJCQkJLy8gb25lIQorCQkJCQkJCQlpZiAoZGVzY3JpcHRvci5lcXVhbHMoY3VycmVudCkgPT0gdHJ1ZSkgeworCQkJCQkJCQkJZGVzY3JpcHRvciA9IGlzb0NvZGUuZ2V0QWxwaGEyKCkgKyAiLSIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCQkrIGN1cnJlbnQ7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBIYW5kbGUgdGhlIFVTQSBhcyBhIHNwZWNpYWwgY2FzZQorCQkJCQkJCWlmIChkZXNjcmlwdG9yLmNvbnRhaW5zKCJVUy0iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQkJCWRhdGEgPSAiIyIgKyBjdXJyZW50ICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlTdHJpbmcgcG9wdWxhdGlvbiA9IG51bGw7CisKKwkJCQkJCXN3aXRjaCAobGV2ZWwpIHsKKworCQkJCQkJY2FzZSAxOgorCQkJCQkJCXBvcHVsYXRpb24gPSBnZXRQb3B1bGF0aW9uKGN1cnJlbnQsCisJCQkJCQkJCQlpdGVtc1tJU09EYXRhLkNPVU5UUllfTkFNRV0sIGxldmVsKTsKKwkJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSAyOgorCisJCQkJCQkJLy8gVHJlYXQgdGhlIFVTQSBhcyBhIHNwZWNpYWwgY2FzZSA6CisJCQkJCQkJLy8gZm9yIHRoZSBVU0Egd2UgaGF2ZSBhIGxpc3Qgb2YgbGV2ZWwgMiBkYXRhLgorCQkJCQkJCWlmIChkZXNjcmlwdG9yLmNvbnRhaW5zKCJVUy0iKSkgeyAvLyROT04tTkxTLTEkCisKKwkJCQkJCQkJLy8gRmlyc3QsIGZpbmQgdGhlIElTT0NvZGUyIGZvciB0aGlzIFVTQSBhZG1pbi4KKwkJCQkJCQkJSVNPQ29kZTIgY29kZSA9IEdlblV0aWxzLmdldElTTzJPYmplY3QoCisJCQkJCQkJCQkJaXNvMkxpc3QsIGl0ZW1zW0lTT0RhdGEuQURNSU4xX05BTUVdLAorCQkJCQkJCQkJCWlzb0NvZGUuZ2V0QWxwaGEyKCkpOworCisJCQkJCQkJCS8vIFNlY29uZCwgZmluZCB0aGUgYXJlYSBmb3IgdGhpcyBVU0EgYWRtaW4uCisJCQkJCQkJCXBvcHVsYXRpb24gPSBHZW5VdGlscy5nZXRMZXZlbDJEYXRhKAorCQkJCQkJCQkJCWl0ZW1zW0lTT0RhdGEuQURNSU4yX05BTUVdLCBjb2RlCisJCQkJCQkJCQkJCQkuZ2V0SW5kZXgoKSwgdXNhTGV2ZWwyTGlzdCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKworCQkJCQkJCWlmIChpdGVtc1tJU09EYXRhLkFETUlOMV9OQU1FXS5lcXVhbHMoIk4uQS4iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQkJCS8vIFRoaXMgd2lsbCBoYW5kbGUgdW5rbm93biBsb2NhdGlvbnMuCisJCQkJCQkJCXBvcHVsYXRpb24gPSBnZXRQb3B1bGF0aW9uKGN1cnJlbnQsIGN1cnJlbnQsCisJCQkJCQkJCQkJbGV2ZWwpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXBvcHVsYXRpb24gPSBnZXRQb3B1bGF0aW9uKGN1cnJlbnQsCisJCQkJCQkJCQkJaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0sIGxldmVsKTsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBJZiByZXR1cm5lZCBwb3B1bGF0aW9uID0gREVGQVVMVCwgdGhlbiB3ZSBkb250CisJCQkJCQkJLy8gaGF2ZSBhIHBvcHVsYXRpb24gdmFsdWUgZm9yIGl0LgorCQkJCQkJCS8vIENvbXB1dGUgdGhlIGFwcHJveGltYXRlIHBvcHVsYXRpb24gYmFzZWQgb24gdGhlCisJCQkJCQkJLy8gcG9wdWxhdGlvbiBmb3IgdGhlIGxldmVsIDEgY29udGFpbmVyLgorCQkJCQkJCWlmIChwb3B1bGF0aW9uID09IERFRkFVTFQpIHsKKwkJCQkJCQkJcG9wdWxhdGlvbiA9IGdldEFwcHJveGltYXRlUG9wdWxhdGlvbihpdGVtc1tJU09EYXRhLkFETUlOMV9OQU1FXSk7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQlpZiAoZGF0YSAhPSBudWxsKSB7CisJCQkJCQkJZGF0YSArPSBkZXNjcmlwdG9yICsgIiA9ICIgKyBwb3B1bGF0aW9uICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWRhdGEgPSBkZXNjcmlwdG9yICsgIiA9ICIgKyBwb3B1bGF0aW9uICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQl9CisKKwkJCQkJCS8vIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQKKwkJCQkJCUdlblV0aWxzLmFkZERhdGEocHJvcGVydGllc0ZpbGUsIGRhdGEpOworCQkJCQkJZGF0YSA9IG51bGw7CisKKwkJCQkJfSAvLyB3aGlsZSBsb29wCisKKwkJCQkJLy8gUmVzZXQgYWxsIGxleC1yZWxhdGVkIGl0ZW1zCisJCQkJCWlmIChsZXgxRGF0YVNldCAhPSBudWxsKSB7CisJCQkJCQlsZXgxRGF0YVNldC5jbGVhcigpOworCQkJCQkJbGV4MURhdGFTZXQgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgyRGF0YVNldCAhPSBudWxsKSB7CisJCQkJCQlsZXgyRGF0YVNldC5jbGVhcigpOworCQkJCQkJbGV4MkRhdGFTZXQgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgxTGlzdCAhPSBudWxsKSB7CisJCQkJCQlsZXgxTGlzdC5jbGVhcigpOworCQkJCQkJbGV4MUxpc3QgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgyTGlzdCAhPSBudWxsKSB7CisJCQkJCQlsZXgyTGlzdC5jbGVhcigpOworCQkJCQkJbGV4Mkxpc3QgPSBudWxsOworCQkJCQl9CisKKwkJCQkJbGV4QWRtaW4xRmlsZSA9IG51bGw7CisJCQkJCWxleEFkbWluMkZpbGUgPSBudWxsOworCisJCQkJCS8vIFdlIGRvbnQgbmVlZCB0aGUgSVNPIGNvZGUgb2JqZWN0IGZvciB0aGlzIGNvdW50cnkKKwkJCQkJLy8gYW55bW9yZSwgd2UgYXJlIGRvbmUgcHJvY2Vzc2luZyBpdC4KKwkJCQkJaXNvQ29kZSA9IG51bGw7CisKKwkJCQkJLy8gUmVzZXQgdGhlIHBvcHVsYXRpb24gbGlzdAorCQkJCQlpZiAocG9wdWxhdGlvbkxpc3QgIT0gbnVsbCkgeworCQkJCQkJcG9wdWxhdGlvbkxpc3QuY2xlYXIoKTsKKwkJCQkJCXBvcHVsYXRpb25MaXN0ID0gbnVsbDsKKwkJCQkJfQorCisJCQkJCS8vIENsb3NlIGFsbCBvcGVuIHJlc291cmNlcy4KKwkJCQkJcmVhZGVyLmNsb3NlKCk7CisKKwkJCQkJaWYgKHByb3BlcnRpZXNGaWxlICE9IG51bGwpIHsKKwkJCQkJCXByb3BlcnRpZXNGaWxlLmNsb3NlKCk7CisJCQkJCQlwcm9wZXJ0aWVzRmlsZSA9IG51bGw7CisJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRHZW5lcmF0ZWQgOiAiICsgZmlsZU5hbWUpOworCQkJCQkJZmlsZU5hbWUgPSBudWxsOworCQkJCQl9CisKKwkJCQkJLy8gUnVuIGdhcmJhZ2UgY29sbGVjdGlvbgorCQkJCQkvL1N5c3RlbS5nYygpOworCQkJCX0KKworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisKKwkJfSAvLyBGb3IgbG9vcAorCisJCS8vIENsb3NlIHRoZSBmaXggd3JpdGVyIDogRE9OVCBERUxFVEUKKwkJLy8gaWYgKGZpeFdyaXRlciAhPSBudWxsKSB7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xvc2luZyBmaXggZmlsZSIpOworCQkvLyBmaXhXcml0ZXIuY2xvc2UoKTsKKwkJLy8gZml4V3JpdGVyID0gbnVsbDsKKwkJLy8gZml4RmlsZSA9IG51bGw7CisJCS8vIH0KKwl9CisKKwkvKioKKwkgKiBHZW5lcmF0ZSB0aGUgaGVhZGVyIGNvbW1lbnQgZm9yIHRoaXMgZmlsZS4KKwkgKiAKKwkgKiBAcGFyYW0gY29kZQorCSAqIEBwYXJhbSBsZXZlbAorCSAqIAorCSAqIEByZXR1cm4gdGhlIGhlYWRlciBmb3IgdGhlIGRvY3VtZW50CisJICogCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkZXIoSVNPQ29kZTEgY29kZSwgaW50IGxldmVsKSB7CisKKwkJZmluYWwgaW50IERBVEFfREVTQ1JJUFRPUiA9IDA7CisJCWZpbmFsIGludCBVUkwgPSAxOworCisJCS8vIENyZWF0ZSB0aGUgZmlsZSBuYW1lIGZvciB0aGUgVVJMIGZpbGUuCisJCVN0cmluZyB1cmxGaWxlID0gd29ya3NwYWNlICsgR2VuQ29uc3RhbnRzLlBBUkFNU19ESVIKKwkJCQkrIEdlbkNvbnN0YW50cy5VUkxTX0RJUjsKKwkJdXJsRmlsZSArPSBjb2RlLmdldE5hbWUoKSArICIudHh0IjsgLy8kTk9OLU5MUy0xJAorCisJCVN0cmluZyBoZWFkZXIgPSAiIyAiICsgY29kZS5nZXRBbHBoYTMoKSArICJfIiArIGxldmVsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCSsgIl9odW1hbl8yMDAwX3BvcHVsYXRpb24ucHJvcGVydGllcyBcbiI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gaGVhZGVyICs9IENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpICsgIlxuIjsKKwkJaGVhZGVyICs9ICIjIFRoaXMgZmlsZSBjb250YWlucyBwb3B1bGF0aW9uIHZhbHVlcyBmb3IgdGhlICIgLy8kTk9OLU5MUy0xJAorCQkJCSsgY29kZS5nZXROYW1lKCkgKyAiIGluIDIwMDBcbiI7IC8vJE5PTi1OTFMtMSQKKworCQloZWFkZXIgKz0gIiNcbiI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gaGVhZGVyICs9ICIjIFdoZXJlIG5vIHBvcHVsYXRpb24gZGF0YSB3YXMgYXZhaWxhYmxlIGZvciB0aGUgbGV2ZWwgMgorCQkvLyByZWdpb25zIHdpdGhpbiBhIGNvdW50cnksIHRoZSBwb3B1bGF0aW9uIHZhbHVlcyBoYXZlXG4iOworCQkvLyBoZWFkZXIgKz0gIiMgYmVlbiBzZXQgdG8gdGhlIExldmVsIDEgcGFyZW50IHJlZ2lvbiBwb3B1bGF0aW9uIChQKQorCQkvLyBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgY29udGFpbmVkIGxldmVsIDIgY2hpbGQgcmVnaW9ucyAoTikuXG4iOworCQkvLyBoZWFkZXIgKz0gIiMgVGhlIGFwcHJveGltYXRpb24gZW5mb3JjZXMgdGhhdCB0aGUgc3VtIG9mIGxldmVsIDIKKwkJLy8gcG9wdWxhdGlvbnMgPSB0aGUgbGV2ZWwgMSBwb3B1bGF0aW9uIGFuZCBhbGxvd3MgY29tcG9zaXRpb24gb2YgYQorCQkvLyBtb2RlbFxuIjsKKwkJLy8gaGVhZGVyICs9ICIjIHVzaW5nIHRoZSBhdmFpbGFibGUgbWFwIHJlc29sdXRpb25zLiBUaGVzZSBhcHByb3hpbWF0aW9uCisJCS8vIHZhbHVlcyB3aWxsIGJlIHJlcGxhY2VkIGFzIGJldHRlciBkYXRhIGJlY29tZXMgYXZhaWxhYmxlLlxuIjsKKwkJLy8gaGVhZGVyICs9ICIjIFRoZSByZWdpb25zIHdoZXJlIHRoaXMgYXBwcm94aW1hdGlvbiB3YXMgdXNlZCBhcmUKKwkJLy8gaWRlbnRpZmllZCBieSB0aGUgZmFjdCB0aGF0IGFsbCBsZXZlbCAyIHJlZ2lvbnMgaGF2ZSB0aGUgc2FtZVxuIjsKKwkJLy8gaGVhZGVyICs9ICIjIHBvcHVsYXRpb24gKFAvTikuXG4iOworCQkvLyBoZWFkZXIgKz0gIiNcbiI7CisKKwkJLy8gQWRkIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50LgorCQloZWFkZXIgKz0gR2VuVXRpbHMuZ2V0Q29weXJpZ2h0KCk7CisKKwkJLy8gQWRkIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBrZXkgZm9ybWF0IGluIG91ciBkYXRhIGZpbGVzLgorCQloZWFkZXIgKz0gR2VuVXRpbHMuZ2V0S2V5Rm9ybWF0RXhwbGFuYXRpb24oKTsKKworCQloZWFkZXIgKz0gIiMgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCB3aWxsIGludGVycHJldCB0aGUgcmVzdCBvZiB0aGUgZmlsZSdzIGNvbnRlbnRzXG4iOyAvLyROT04tTkxTLTEkCisJCWhlYWRlciArPSAiUkVDT1JEX0NMQVNTTkFNRSA9IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5Db3VudHJ5R3JhcGhSZWNvcmQkQ291bnRyeVBvcHVsYXRpb25MYWJlbEdyYXBoUmVjb3JkXG5cbiI7IC8vJE5PTi1OTFMtMSQKKworCQloZWFkZXIgKz0gIiMgVGhlIElTTy0zMTY2LTEgYWxwaGEzIGNvZGUgZm9yIHRoZSBjb3VudHJ5XG4iOyAvLyROT04tTkxTLTEkCisJCWhlYWRlciArPSAiSVNPS0VZID0gIiArIGNvZGUuZ2V0QWxwaGEzKCkgKyAiXG5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKKworCQkvLyBoZWFkZXIgKz0gIiMgVGhlIHVuaXRzIGFyZSBpbmRpdmlkdWFsc1xuXG4iOworCisJCWhlYWRlciArPSAiIyBUaGUgYWRtaW5pc3RyYXRpb24gbGV2ZWwgb2YgdGhlIHBvcHVsYXRpb24gZGF0YVxuIjsgLy8kTk9OLU5MUy0xJAorCQloZWFkZXIgKz0gIkFETUlOX0xFVkVMID0gIiArIGxldmVsICsgIlxuXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQloZWFkZXIgKz0gIiMgVGhpcyBpcyB0aGUgZGF0ZSByYW5nZSBmb3Igd2hpY2ggdGhlIHBvcHVsYXRpb24gdmFsdWVzIGluIHRoaXMgZmlsZSBhcmUgdmFsaWQgXG4iOyAvLyROT04tTkxTLTEkCisJCWhlYWRlciArPSAiIyBTZWUgaHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zLzEuMS92YWxpZFxuIjsgLy8kTk9OLU5MUy0xJAorCQloZWFkZXIgKz0gIlZBTElEID0gc3RhcnQ9MjAwNi0wMS0wMTsgZW5kPTIwMDYtMTItMzE7XG5cbiI7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBUaGUgVW5pdGVkIE5hdGlvbnMgZGF0YSBwb2xpY3kgYXBwbGllcyBvbmx5IHRvIEV1cm9wZSA6CisJCS8vIGhlYWRlciArPSBHZW5VdGlscy5nZXRVTlBvbGljeSgpOworCisJCWhlYWRlciArPSAiIyBUaGlzIGlzIHRoZSBzb3VyY2Ugb2YgdGhlIGRhdGFcbiI7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBPcGVuIHRoZSBVUkwgZmlsZSBmb3IgdGhpcyBjb3VudHJ5LgorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInVybCBmaWxlID0gIiArIHVybEZpbGUpOworCQlCdWZmZXJlZFJlYWRlciB1cmxSZWFkZXIgPSBHZW5VdGlscy5vcGVuUmVhZGVyKHVybEZpbGUpOworCisJCXRyeSB7CisJCQkvLyBBZGQgYWxsIHRoZSBzb3VyY2UgVVJMcyBmb3IgdGhpcyBjb3VudHJ5LgorCQkJaWYgKHVybFJlYWRlciAhPSBudWxsKSB7CisJCQkJU3RyaW5nIGJ1ZmZlciA9IG51bGw7CisJCQkJd2hpbGUgKEdlblV0aWxzLkVPRihidWZmZXIgPSB1cmxSZWFkZXIucmVhZExpbmUoKSkgIT0gdHJ1ZSkgeworCisJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQnVmZmVyID0gIiArIGJ1ZmZlcik7CisKKwkJCQkJLy8gVG9rZW5pemUKKwkJCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYnVmZmVyLCAiKiIpOyAvLyROT04tTkxTLTEkCisKKwkJCQkJLy8gV2Uga25vdyB0aGF0IHdlIGV4cGVjdCBvbmx5IHR3byB0b2tlbnMuIEdldCB0aGVtLiBPcmRlcgorCQkJCQkvLyBtYXR0ZXJzIGhlcmUuCisJCQkJCVN0cmluZ1tdIHRva2VucyA9IG5ldyBTdHJpbmdbMl07CisJCQkJCXRva2Vuc1tEQVRBX0RFU0NSSVBUT1JdID0gdG9rZW5pemVyLm5leHRUb2tlbigpOworCQkJCQl0b2tlbnNbVVJMXSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKworCQkJCQlpZiAoR2VuVXRpbHMuaXNTb3VyY2VVUkwodXJsU2V0LCB0b2tlbnNbREFUQV9ERVNDUklQVE9SXSkgPT0gdHJ1ZSkgeworCisJCQkJCQkvLyB0cnkgeworCQkJCQkJLy8gSXMgdGhpcyBkYXRhIGRlc2NyaXB0b3Igb25lIG9mIG91ciBhY3RpdmUgZGF0YQorCQkJCQkJLy8gc291cmNlcyA/CisJCQkJCQlpZiAoR2VuVXRpbHMuaXNBY3RpdmVVUkwodXJsU3RhdHVzLAorCQkJCQkJCQl0b2tlbnNbREFUQV9ERVNDUklQVE9SXSkgPT0gZmFsc2UpIHsKKwkJCQkJCQkvLyBObywgaXQgaXMgbm90IG9uZSBhbiBhY3RpdmUgVVJMLCBzbyBjb21tZW50IGl0CisJCQkJCQkJLy8gb3V0CisJCQkJCQkJLy8gaGVhZGVyICs9ICIjICIgKyAiU09VUkNFID0gIiArCisJCQkJCQkJLy8gVVJMRW5jb2Rlci5lbmNvZGUodG9rZW5zW1VSTF0sICJVVEYtOCIpICsgIlxuIjsKKwkJCQkJCQloZWFkZXIgKz0gIiMgIiArICJTT1VSQ0UgPSAiICsgdG9rZW5zW1VSTF0gKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIGhlYWRlciArPSAiU09VUkNFID0gIiArCisJCQkJCQkJLy8gVVJMRW5jb2Rlci5lbmNvZGUodG9rZW5zW1VSTF0sICJVVEYtOCIpICsgIlxuIjsKKwkJCQkJCQloZWFkZXIgKz0gIlNPVVJDRSA9ICIgKyB0b2tlbnNbVVJMXSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQkJCQl9CisKKwkJCQkJCS8vIH0gY2F0Y2ggKGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCQkJCQkvLyAvLyROT04tTkxTLTEkCisJCQkJCQkvLyB9CisKKwkJCQkJfQorCisJCQkJfSAvLyB3aGlsZQorCisJCQkJLy8gVG8gbWFrZSBpdCBsb29rIGJldHRlciwgYWRkIGFuIGV4dHJhIG5ldyBsaW5lLgorCQkJCWhlYWRlciArPSAiXG4iOyAvLyROT04tTkxTLTEkCisKKwkJCX0KKworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLworCQl9CisKKwkJaGVhZGVyICs9ICIjIFRoZSBwb3B1bGF0aW9uIGlkZW50aWZpZXJcbiI7IC8vJE5PTi1OTFMtMSQKKwkJaGVhZGVyICs9ICJQT1BVTEFUSU9OID0gaHVtYW5cblxuIjsgLy8kTk9OLU5MUy0xJAorCisJCXN3aXRjaCAobGV2ZWwpIHsKKworCQljYXNlIERhdGFUeXBlcy5MRVZFTF8wOgorCQkJLy8gRG8gbm90aGluZy4KKwkJCWJyZWFrOworCisJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzE6CisJCQloZWFkZXIgKz0gIiMgU3RhdGUvUHJvdmluY2VcblxuIjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisKKwkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMjoKKwkJCWhlYWRlciArPSAiIyBMZXZlbCAxIChhZG1pbiAxID0gZS5nLiwgc3RhdGUpXG4iOyAvLyROT04tTkxTLTEkCisJCQloZWFkZXIgKz0gIiMgTGV2ZWwgMiAoYWRtaW4gMiA9IGUuZy4sIGNvdW50eSlcblxuIjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCisJCX0KKworCQlyZXR1cm4gaGVhZGVyOworCX0KKworCS8qKgorCSAqIENvbXB1dGUgYSBkZWZhdWx0IHBvcHVsYXRpb24gdmFsdWUgYmFzZWQgb24gZGF0YSBmcm9tIGNvbnRhaW5lcgorCSAqIAorCSAqIEBwYXJhbSBlbnRpdHkKKwkgKiAgICAgICAgICAgIHRoZSBsb2NhdGlvbiBmb3Igd2hpY2ggd2Ugd2FudCB0byBjcmVhdGUgYW4gYXBwcm94aW1hdGUgdmFsdWUKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBhcHByb3hpbWF0ZSBwb3B1bGF0aW9uIHZhbHVlCisJICovCisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEFwcHJveGltYXRlUG9wdWxhdGlvbihTdHJpbmcgZW50aXR5KSB7CisKKwkJZmluYWwgaW50IExPQ0FUSU9OID0gMDsKKwkJZmluYWwgaW50IFBPUFVMQVRJT04gPSAxOworCQlmaW5hbCBpbnQgQ09VTlQgPSAyOworCisJCVN0cmluZyBlbnRpdHlTdHIgPSBlbnRpdHkudG9VcHBlckNhc2UoKS50cmltKCk7CisKKwkJSXRlcmF0b3IgaXQgPSBwb3B1bGF0aW9uUHJvZmlsZUxpc3QuaXRlcmF0b3IoKTsKKworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisKKwkJCVN0cmluZyBjdXJyZW50ID0gKFN0cmluZykgaXQubmV4dCgpOworCisJCQkvLyBUb2tlbml6ZQorCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY3VycmVudCwgIjoiKTsgLy8kTk9OLU5MUy0xJAorCisJCQkvLyBXZSBrbm93IHRoYXQgd2UgZXhwZWN0IG9ubHkgdHdvIHRva2Vucy4gR2V0IHRoZW0uCisJCQkvLyBPcmRlciBtYXR0ZXJzIGhlcmUuCisJCQlTdHJpbmdbXSB0b2tlbnMgPSBuZXcgU3RyaW5nWzNdOworCQkJLy8gVGhpcyBpcyB0aGUgYWRtaW4xIHJlZ2lvbgorCQkJdG9rZW5zW0xPQ0FUSU9OXSA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKwkJCS8vIFRoaXMgaXMgdGhlIHBvcHVsYXRpb24gdmFsdWUKKwkJCXRva2Vuc1tQT1BVTEFUSU9OXSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKwkJCS8vIFRoaXMgaXMgdGhlIG51bWJlciBvZiBhZG1pbjIgbG9jYXRpb24gd2l0aGluIHRoaXMgYWRtaW4gMSByZWdpb24KKwkJCXRva2Vuc1tDT1VOVF0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisKKwkJCWlmICh0b2tlbnNbTE9DQVRJT05dLmVxdWFscyhlbnRpdHlTdHIpCisJCQkJCSYmIEludGVnZXIucGFyc2VJbnQodG9rZW5zWzJdKSAhPSAwKSB7CisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJWYWx1ZSBpcyA6ICIgKyB0b2tlbnNbMV0pOworCQkJCWludCB2YWwgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2Vuc1sxXS5yZXBsYWNlKCIsIiwgIiIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCS8gSW50ZWdlci5wYXJzZUludCh0b2tlbnNbMl0pOworCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZih2YWwpOworCQkJfQorCisJCX0KKworCQlyZXR1cm4gREVGQVVMVDsKKwl9CisKKwkvKioKKwkgKiBGaW5kIHRoZSBwb3B1bGF0aW9uIHZhbHVlIGZvciBhIGdpdmVuIGVudGl0eS4KKwkgKiAKKwkgKiBAcGFyYW0gZW50aXR5CisJICogICAgICAgICAgICBhIGxvY2F0aW9uCisJICogQHBhcmFtIGxldmVsCisJICogICAgICAgICAgICBhZG1pbmlzdHJhdGl2ZSBsZXZlbCBmb3IgdGhlIGxvY2F0aW9uIChlbnRpdHkpCisJICogCisJICogQHJldHVybiB0aGUgcG9wdWxhdGlvbiBmb3IgYSBsb2NhdGlvbgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UG9wdWxhdGlvbihTdHJpbmcgZW50aXR5LCBpbnQgbGV2ZWwpIHsKKworCQlmaW5hbCBpbnQgRU5USVRZID0gMDsKKworCQlmaW5hbCBpbnQgTEVWRUwgPSAxOworCisJCWZpbmFsIGludCBQT1BVTEFUSU9OID0gMjsKKworCQlJdGVyYXRvciBpdCA9IHBvcHVsYXRpb25MaXN0Lml0ZXJhdG9yKCk7CisKKwkJU3RyaW5nIGVudGl0eVN0ciA9IGVudGl0eS50b1VwcGVyQ2FzZSgpOworCisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKworCQkJU3RyaW5nW10gcG9wRGF0YSA9ICgoU3RyaW5nKSBpdC5uZXh0KCkpLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJaWYgKGVudGl0eVN0ci5lcXVhbHMocG9wRGF0YVtFTlRJVFldLnRyaW0oKS50b1VwcGVyQ2FzZSgpKSkgeworCQkJCS8vIENoZWNrIGJvdGggZW50aXRpZXMgYmVsb25nIHRvIHNhbWUgbGV2ZWwKKwkJCQlpZiAoU3RyaW5nLnZhbHVlT2YobGV2ZWwpLmVxdWFscyhwb3BEYXRhW0xFVkVMXS50cmltKCkpID09IGZhbHNlKSB7CisJCQkJCS8vIElnbm9yZSA6IHNhbWUgbmFtZSAsIGJ1dCBkaWZmZXJlbnQgbGV2ZWwKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJcmV0dXJuIHBvcERhdGFbUE9QVUxBVElPTl0udHJpbSgpOworCQkJfQorCQl9CisJCXJldHVybiBERUZBVUxUOworCX0KKworCS8qKgorCSAqIEZpbmQgdGhlIHBvcHVsYXRpb24gdmFsdWUgZm9yIGEgZ2l2ZW4gZW50aXR5LgorCSAqIAorCSAqIEBwYXJhbSBlbnRpdHkKKwkgKiAgICAgICAgICAgIGEgbG9jYXRpb24uCisJICogQHBhcmFtIGVudGl0eUNvbnRhaW5lcgorCSAqICAgICAgICAgICAgYSBjb250YWluZXIgZm9yIHRoZSBsb2NhdGlvbiAoZW50aXR5KQorCSAqIAorCSAqIEByZXR1cm4gdGhlIHBvcHVsYXRpb24gdmFsdWUgZm9yIGEgbG9jYXRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFBvcHVsYXRpb24oU3RyaW5nIGVudGl0eSwgU3RyaW5nIGVudGl0eUNvbnRhaW5lciwKKwkJCWludCBsZXZlbCkgeworCisJCWZpbmFsIGludCBFTlRJVFkgPSAwOworCisJCWZpbmFsIGludCBMRVZFTCA9IDE7CisKKwkJZmluYWwgaW50IFBPUFVMQVRJT04gPSAyOworCisJCVN0cmluZ1tdIHBvcERhdGEgPSBudWxsOworCisJCUl0ZXJhdG9yIGl0ID0gcG9wdWxhdGlvbkxpc3QuaXRlcmF0b3IoKTsKKworCQlTdHJpbmcgZW50aXR5U3RyID0gZW50aXR5LnRvVXBwZXJDYXNlKCkudHJpbSgpOworCisJCWVudGl0eVN0ciA9IGVudGl0eVN0ci5yZXBsYWNlKCJcXHQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCVN0cmluZyBlbnRpdHlDb250YWluZXJTdHIgPSBlbnRpdHlDb250YWluZXIudG9VcHBlckNhc2UoKTsKKworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisKKwkJCXBvcERhdGEgPSAoKFN0cmluZykgaXQubmV4dCgpKS5zcGxpdCgiOiIpOyAvLyROT04tTkxTLTEkCisKKwkJCVN0cmluZ1tdIGNvbXBhcmUgPSBudWxsOworCisJCQkvLyBHZXQgdGhlIGVudGl0eSBuYW1lIGFuZCByZW1vdmUgYmxhbmtzCisJCQlTdHJpbmcgbG9jYXRpb24gPSBwb3BEYXRhW0VOVElUWV0udG9VcHBlckNhc2UoKS50cmltKCk7CisKKwkJCWxvY2F0aW9uID0gbG9jYXRpb24ucmVwbGFjZSgiXFx0IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJbG9jYXRpb24gPSBsb2NhdGlvbi50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKworCQkJLy8gSGFuZGxlIEFsaWFzZXMgLS0gY29tcGxleCBzdHVmZiA6JAorCQkJaWYgKGxvY2F0aW9uLmNvbnRhaW5zKCJbIikpIHsgLy8kTk9OLU5MUy0xJAorCisJCQkJbG9jYXRpb24gPSBsb2NhdGlvbi5yZXBsYWNlKCJdIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCS8vIFRva2VuaXplCisJCQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobG9jYXRpb24sICJbIik7IC8vJE5PTi1OTFMtMSQKKworCQkJCS8vIEdldCB0b2tlbnMgLT4gb3JkZXIgbWF0dGVycyBoZXJlIQorCQkJCWNvbXBhcmUgPSBuZXcgU3RyaW5nW3Rva2Vucy5jb3VudFRva2VucygpXTsKKwkJCQlpbnQgaSA9IDA7CisJCQkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQkJY29tcGFyZVtpKytdID0gdG9rZW5zLm5leHRUb2tlbigpLnRvVXBwZXJDYXNlKCkudHJpbSgpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGNvbXBhcmUgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcGFyZS5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAoZW50aXR5U3RyLnJlcGxhY2UoIi0iLCAiICIpLmVxdWFscyggLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJY29tcGFyZVtpXS5yZXBsYWNlKCItIiwgIiAiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJfHwgY29tcGFyZVtpXS5lcXVhbHMoZW50aXR5U3RyICsgIi0xIikgLy8kTk9OLU5MUy0xJAorCQkJCQkJCXx8IGNvbXBhcmVbaV0uZXF1YWxzKGVudGl0eUNvbnRhaW5lclN0cikpIHsKKworCQkJCQkJLy8gQ2hlY2sgYm90aCBlbnRpdGllcyBiZWxvbmcgdG8gc2FtZSBsZXZlbAorCQkJCQkJaWYgKFN0cmluZy52YWx1ZU9mKGxldmVsKS5lcXVhbHMocG9wRGF0YVtMRVZFTF0udHJpbSgpKSA9PSBmYWxzZSkgeworCQkJCQkJCS8vIElnbm9yZSA6IHNhbWUgbmFtZSAsIGJ1dCBkaWZmZXJlbnQgbGV2ZWwKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKworCQkJCQkJcmV0dXJuIHBvcERhdGFbUE9QVUxBVElPTl0udHJpbSgpOworCisJCQkJCX0KKworCQkJCX0KKwkJCX0gZWxzZSBpZiAoZW50aXR5U3RyLmVxdWFscyhsb2NhdGlvbikKKwkJCQkJfHwgZW50aXR5U3RyLnJlcGxhY2UoIi0iLCAiICIpLmVxdWFscyhsb2NhdGlvbikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCXx8IGxvY2F0aW9uLmVxdWFscyhlbnRpdHlTdHIgKyAiLTEiKSkgeyAvLyROT04tTkxTLTEkCisKKwkJCQkvLyBDaGVjayBib3RoIGVudGl0aWVzIGJlbG9uZyB0byBzYW1lIGxldmVsCisJCQkJaWYgKFN0cmluZy52YWx1ZU9mKGxldmVsKS5lcXVhbHMocG9wRGF0YVtMRVZFTF0udHJpbSgpKSA9PSBmYWxzZSkgeworCQkJCQkvLyBJZ25vcmUgOiBzYW1lIG5hbWUgLCBidXQgZGlmZmVyZW50IGxldmVsCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCXJldHVybiBwb3BEYXRhW1BPUFVMQVRJT05dLnRyaW0oKTsKKworCQkJfQorCisJCX0gLy8gd2hpbGUKKworCQlyZXR1cm4gREVGQVVMVDsKKwl9CisKKwkvKioKKwkgKiBNYWluIGV4ZWN1dGlvbiBlbnRyeSBwb2ludC4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqIAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJLy8gZmluYWwgaW50IElTT18zMTY2XzEgPSAwOworCQkvLyBmaW5hbCBpbnQgSVNPXzMxNjZfMiA9IDE7CisJCS8vIGZpbmFsIGludCBGSVhfRklMRSA9IDI7CisJCS8vIGZpbmFsIGludCBQT1BVTEFUSU9OX0RBVEEgPSAzOworCQkvLyBmaW5hbCBpbnQgUE9QVUxBVElPTl9QUk9GSUxFID0gNDsKKwkJLy8gZmluYWwgaW50IFRBUkdFVF9MSVNUID0gNTsKKwkJLy8gZmluYWwgaW50IExFWF9ESVIgPSA2OworCQkvLyBmaW5hbCBpbnQgT1VUUFVUX0RJUiA9IDc7CisJCS8vIGZpbmFsIGludCBQQVJBTVMgPSA4OworCQkvLworCQkvLyBpZiAoYXJncy5sZW5ndGggPCBQQVJBTVMpIHsKKwkJLy8KKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLVdyb25nIGFyZ3VtZW50cy0tIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dAorCQkvLyAucHJpbnRsbigiXHRUbyBydW4sIHBsZWFzZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIDogIik7CisJCS8vIC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IElTTyAzMTY2LTEgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBJU08gMzE2Ni0yIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgSVNPIGZpeCBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IFBvcHVsYXRpb24gZGF0YSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IFBvcHVsYXRpb24gcHJvZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBUYXJnZXQgY291bnRyaWVzIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgTGV4aWNvZ3JhcGhpYyBzb3J0aW5nIGRpcmVjdG9yeSIpOworCQkvLyAvLyROT04tTkxTLTEkJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgT3V0cHV0IGRpcmVjdG9yeSIpOyAvLyROT04tTkxTLTEkCisJCS8vIHJldHVybjsKKwkJLy8gfQorCQkvLworCQkvLyBQb3B1bGF0aW9uR2VuZXJhdG9yIGdlbiA9IG5ldyBQb3B1bGF0aW9uR2VuZXJhdG9yKGFyZ3NbSVNPXzMxNjZfMV0sCisJCS8vIGFyZ3NbSVNPXzMxNjZfMl0sIGFyZ3NbRklYX0ZJTEVdLCBhcmdzW1BPUFVMQVRJT05fREFUQV0sCisJCS8vIGFyZ3NbUE9QVUxBVElPTl9QUk9GSUxFXSwgYXJnc1tUQVJHRVRfTElTVF0sIGFyZ3NbTEVYX0RJUl0sCisJCS8vIGFyZ3NbT1VUUFVUX0RJUl0pOworCQkvLyBnZW4ucnVuKCk7CisKKwkJZmluYWwgaW50IENPTkZJR19GSUxFID0gMDsKKwkJZmluYWwgaW50IFBBUkFNUyA9IDE7CisKKwkJaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQtLVdyb25nIGFyZ3VtZW50cy0tIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQKKwkJCQkJLnByaW50bG4oIlx0XHRUbyBydW4sIHBsZWFzZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnQocykgOiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHQgQ29uZmlndXJhdGlvbiBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5leGl0KDEpOworCQl9CisKKwkJUG9wdWxhdGlvbkdlbmVyYXRvciBnZW4gPSBuZXcgUG9wdWxhdGlvbkdlbmVyYXRvcihhcmdzW0NPTkZJR19GSUxFXSk7CisJCWdlbi5ydW4oKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9Qb3B1bGF0aW9uTW9kaWZpZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvUG9wdWxhdGlvbk1vZGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzMjM2MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvUG9wdWxhdGlvbk1vZGlmaWVyLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKKy8qKgorICogR2l2ZW4gYSBkYXRhIHJlZmVyZW5jZSBkYXRlICh3aGVuIHdhcyBwb3B1bGF0aW9uIHZhbHVlcyB0YWtlbiksIGEgZGVzaXJlZCB0YXJnZXQgZGF0ZSBhbmQKKyAqIGEgZGFpbHkgZ3Jvd3RoIHJhdGUsIHJldmVyc2UgcG9wdWxhdGlvbiB2YWx1ZXMgYmFjayAob3IgZm9yd2FyZCkgdG8gdGhlIHRhcmdldCBkYXRlIGluCisgKiBhbGwgcG9wdWxhdGlvbiBwcm9wZXJ0aWVzIGZpbGUgZm91bmQgaW4gdGhlIHRhcmdldCBkaXJlY3RvcnkKKyAqLworcHVibGljIGNsYXNzIFBvcHVsYXRpb25Nb2RpZmllciB7CisJCisJc3RhdGljIFN0cmluZyBMUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIAorCSAqIEBwYXJhbSBhcmdzCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKKwkJaWYoYXJncy5sZW5ndGggPCA0KSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlVzYWdlOiBQb3B1bGF0aW9uTW9kaWZpZXIgPHRhcmdldCBkaXI+IDxyZWZlcmVuY2UgZGF0ZT4gPHRhcmdldCBkYXRlPiA8ZGFpbHkgZ3Jvd3RoIHJhdGU+Iik7CisJCQlTeXN0ZW0uZXhpdCgtMSk7CisJCX0KKwkJCisJCXRyeSB7CisJCVN0cmluZyBkaXIgPSBhcmdzWzBdOworCQlTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJNL2QveSIpOworCQlEYXRlIHJlZiA9IHNkZi5wYXJzZShhcmdzWzFdKTsKKwkJRGF0ZSB0YXJnZXQgPSBzZGYucGFyc2UoYXJnc1syXSk7CisJCWRvdWJsZSBkYXlzYmFja3dhcmQgPSAocmVmLmdldFRpbWUoKSAtIHRhcmdldC5nZXRUaW1lKCkpIC8gKDM2MDAqMjQqMTAwMCk7CisJCWRvdWJsZSBncm93dGggPSBEb3VibGUucGFyc2VEb3VibGUoYXJnc1szXSk7CisJCQorCQkKKwkJRmlsZSBmID0gbmV3IEZpbGUoZGlyKTsKKwkJaWYoIWYuZXhpc3RzKCkgfHwgIWYuaXNEaXJlY3RvcnkoKSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciwgIitkaXIrIiBpcyBub3QgYSBkaXJlY3Rvcnkgb3IgZG9lc24ndCBleGlzdCIpOworCQkJU3lzdGVtLmV4aXQoLTEpOworCQl9CisJCQorCQkKKwkJU3RyaW5nIFtdIGZpbGVzID0gZi5saXN0KCk7CisJCWZvcihTdHJpbmcgZmlsZSA6IGZpbGVzKSB7CisJCQlpZighZmlsZS5jb250YWlucygiX3BvcHVsYXRpb24ucHJvcGVydGllcyIpKSBjb250aW51ZTsKKwkJCUZpbGUgcHJvcGZpbGUgPSBuZXcgRmlsZShkaXIrRmlsZS5zZXBhcmF0b3IrZmlsZSk7CisJCQorCQkJQnVmZmVyZWRSZWFkZXIgaXJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShwcm9wZmlsZSkpKTsKKwkJICAgCisJCQlGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIoZGlyK0ZpbGUuc2VwYXJhdG9yK2ZpbGUrIi5uZXciKTsKKwkJCQorCQkJU3RyaW5nIGxpbmU7CisJCSAgICB3aGlsZSgobGluZT1pcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkJICAgIAlpZighbGluZS5zdGFydHNXaXRoKCIjIikgJiYKKwkJICAgIAkJCSFsaW5lLnN0YXJ0c1dpdGgoIlJFQ09SRF9DTEFTU05BTUUiKSAmJgorCQkgICAgCQkJIWxpbmUuc3RhcnRzV2l0aCgiSVNPS0VZIikgJiYKKwkJICAgIAkJCSFsaW5lLnN0YXJ0c1dpdGgoIkFETUlOX0xFVkVMIikgJiYKKwkJICAgIAkJCSFsaW5lLnN0YXJ0c1dpdGgoIlZBTElEIikgJiYKKwkJICAgIAkJCSFsaW5lLnN0YXJ0c1dpdGgoIlNPVVJDRSIpICYmCisJCSAgICAJCQkhbGluZS5zdGFydHNXaXRoKCJQT1BVTEFUSU9OIikgJiYKKwkJICAgIAkJCSFsaW5lLnN0YXJ0c1dpdGgoIllFQVIiKSAmJgorCQkgICAgCQkJIShsaW5lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQorCQkgICAgCQkJKSB7CisJCSAgICAJCS8vIEZpbmQgdGhlIHBvcHVsYXRpb24gbnVtYmVyCisJCSAgICAJCQorCQkgICAgCQlpbnQgZXFpbmRleCA9IGxpbmUuaW5kZXhPZigiPSIpOworCQkgICAgCQlTdHJpbmcgcG9wcyA9IGxpbmUuc3Vic3RyaW5nKGVxaW5kZXgrMSk7CisJCSAgICAJCWRvdWJsZSByZWZfcG9wID0gRG91YmxlLnBhcnNlRG91YmxlKHBvcHMpOworCQkgICAgCQlkb3VibGUgZyA9IDEuMCtncm93dGg7CisJCSAgICAJCWRvdWJsZSBmYWN0ID0gTWF0aC5wb3coZywgZGF5c2JhY2t3YXJkKTsKKwkJICAgIAkJbG9uZyB0YXJnZXRfcG9wID0gKGxvbmcpKHJlZl9wb3AgLyBmYWN0KTsKKwkJICAgIAkJbGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGVxaW5kZXgpKyIgPSAiK3RhcmdldF9wb3A7CisJCSAgICAJfQorCQkgICAgCWZ3LndyaXRlKGxpbmUrTFMpOworCQkgICAgfQorCQkgICAgZncuZmx1c2goKTsKKwkJICAgIGZ3LmNsb3NlKCk7CisJCSAgICAKKwkJfSAgLy8gRm9yIGVhY2ggZmlsZQorCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKwkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwl9CisJCQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvUG9wdWxhdGlvblByb2ZpbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL1BvcHVsYXRpb25Qcm9maWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NGFjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL1BvcHVsYXRpb25Qcm9maWxlci5qYXZhCkBAIC0wLDAgKzEsNTQwIEBACisvKioKKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIAorICogU1RFTSBJSSBEYXRhIE1pZ3JhdGlvbi9HZW5lcmF0aW9uIFV0aWxpdGllcyA6IEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGZpbmRzCisgKiBvdXQgaG93IG1hbnkgbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbnMgZWFjaCBsZXZlbCAxIGFkbWluIGhhcy4gSW4gb3RoZXIgd29yZHMsCisgKiBpdCBwcm9maWxlcyBlYWNoIGxldmVsIDEgYWRtaW4gYmFzZWQgb24gaXRzIHBvcHVsYXRpb24gYW5kIHRoZSBudW1iZXIgb2YKKyAqIGxldmVsIDIgYWRtaW5pc3RyYXRpb25zIHRoYXQgYmVsb25nIHRvIGl0LgorICogCisgKiBUbyBydW4gYWRkIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyB0byB0aGUgcnVuIGNvbmZpZ3VyYXRpb246CisgKiAKKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxJU08zMTY2LTFcSVNPMzE2Nl8xX2VuLnR4dAorICogQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXGlucHV0XEFyZWFQb3B1bGF0aW9uRGF0YVwKKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxwcm9wZXJ0aWVzXENvdW50cmllcy50eHQKKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxwcm9maWxlc1wKKyAqIAorICovCitwdWJsaWMgY2xhc3MgUG9wdWxhdGlvblByb2ZpbGVyIHsKKworCXByaXZhdGUgU3RyaW5nIHBvcHVsYXRpb25EYXRhID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIG91dHB1dERpciA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyB0YXJnZXRGaWxlID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIGlzbzMxNjZfMSA9IG51bGw7CisKKwkvKioKKwkgKiBMaXN0cyBmb3IgcG9wdWxhdGlvbiBkYXRhLgorCSAqLworCisJTGlzdCB0YXJnZXRMaXN0ID0gbnVsbDsKKworCUxpc3QgcG9wdWxhdGlvbkxpc3QgPSBudWxsOworCisJTGlzdCBjb2RlTGlzdCA9IG51bGw7CisKKwkvKioKKwkgKiBTdHJpbmcgdXNlZCB0byBpbmRpY2F0ZSBkZWZhdWx0IHZhbHVlIGZvciB1bmtub3duIGFyZWFzLgorCSAqLworCVN0cmluZyBERUZBVUxUID0gIjAiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqIAorCSAqIEBwYXJhbSBpc28zMTY2XzEgLQorCSAqICAgICAgICAgICAgZGF0YSBmaWxlIHdpdGggdGhlIElTTzMxNjYtMSBBTFBIQV8yIGFuZCBBTFBIQV8zIGNvZGVzLgorCSAqIEBwYXJhbSBwb3B1bGF0aW9uRGF0YSAtCisJICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgcG9wdWxhdGlvbiBkYXRhIGZvciBhbGwgY291bnRyaWVzCisJICogQHBhcmFtIHRhcmdldEZpbGUgLQorCSAqICAgICAgICAgICAgZGF0YSBmaWxlIHdoZXJlIHdlIGZpbmQgYSBsaXN0IG9mIGNvdW50cmllcyBmb3IgZ2VuZXJhdGlvbiBvZgorCSAqICAgICAgICAgICAgdGhlaXIgY29ycmVzcG9uZGluZyBhcmVhLnByb3BlcnRpZXMgZmlsZXMuCisJICogQHBhcmFtIG91dHB1dERpciAtCisJICogICAgICAgICAgICB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIGZpbGVzIGdlbmVyYXRlZC4KKwkgKiAKKwkgKi8KKwlwdWJsaWMgUG9wdWxhdGlvblByb2ZpbGVyKFN0cmluZyBpc28zMTY2XzEsIFN0cmluZyBwb3B1bGF0aW9uRGF0YSwKKwkJCVN0cmluZyB0YXJnZXRGaWxlLCBTdHJpbmcgb3V0cHV0RGlyKSB7CisJCS8vIFNldCB2YWx1ZXMgb2YgZ2xvYmFsIHZhcmlhYmxlcy4KKwkJdGhpcy5pc28zMTY2XzEgPSBpc28zMTY2XzE7CisJCXRoaXMub3V0cHV0RGlyID0gb3V0cHV0RGlyOworCQl0aGlzLnRhcmdldEZpbGUgPSB0YXJnZXRGaWxlOworCQl0aGlzLnBvcHVsYXRpb25EYXRhID0gcG9wdWxhdGlvbkRhdGE7CisJfQorCisJLyoqCisJICogUnVuIHRoZSBnZW5lcmF0b3IuCisJICogCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIGNvdW50cmllcyB3ZSB3YW50LgorCQl0YXJnZXRMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KHRhcmdldEZpbGUpOworCisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgSVNPMzE2Ni0xIEFMUEhBMiwgQUxQSEEzLCBhbmQKKwkJLy8gbnVtZXJpYyBjb2Rlcy4KKwkJY29kZUxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QoaXNvMzE2Nl8xKTsKKworCQkvLyBOb3csIHByb2Nlc3MgZWFjaCBpdGVtIGluIHRoZSB0YXJnZXQgbGlzdC4KKwkJcHJvY2VzcygpOworCisJfQorCisJLyoqCisJICogUHJvY2VzcyBvdXIgZ2xvYmFsIGxpc3Qgb2YgdGFyZ2V0IGNvdW50cmllcy4gRm9yIGVhY2ggY291bnRyeSBpbiBsaXN0LAorCSAqIGdlbmVyYXRlIGl0cyBwb3B1bGF0aW9uLnByb3BlcnRpZXMgZmlsZS4KKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzKCkgeworCisJCWZpbmFsIGludCBDT05UQUlORVIgPSAwOworCQlmaW5hbCBpbnQgQ09VTlQgPSAxOworCisJCS8qKgorCQkgKiBIYXNoIG1hcCBmb3IgZGVhbGluZyB3aXRoIHBvcHVsYXRpb24gZGF0YQorCQkgKi8KKwkJSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gcERhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworCQkvLyBPYmplY3QgaG9sZGluZyBJU08zMTY2LTEgcmVsYXRlZCBkYXRhLgorCQlJU09Db2RlMSBpc29Db2RlID0gbnVsbDsKKworCQkvLyBBIHdyaXRlciBmb3IgdGhlIG5ldyBmaWxlIHdlIGFyZSBjcmVhdGluZy4KKwkJUHJpbnRXcml0ZXIgcHJvcGVydGllc0ZpbGUgPSBudWxsOworCisJCS8vIE5hbWUgb2YgdGhlIG5ldyBwcm9wZXJ0aWVzIGZpbGUuCisJCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7CisKKwkJaW50IHNpemUgPSB0YXJnZXRMaXN0LnNpemUoKTsKKworCQkvLyBJdGVyYXRlIGZvciBldmVyeSBjb3VudHJ5IGFuZCBjcmVhdGUgaXRzIHBvcHVsYXRpb24ucHJvcGVydGllcyBmaWxlLgorCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCisJCQkvLyBHZXQgdGhlIG5leHQgY291bnRyeSBpbiB0aGUgbGlzdC4KKwkJCVN0cmluZyBmaWxlID0gKChTdHJpbmcpIHRhcmdldExpc3QuZ2V0KGkpKS50cmltKCk7CisKKwkJCS8vIEFuIGluZGV4IGZvciB1bmtud29uIG9yIG4uYS4gZW50cmllcworCQkJaW50IHVua0NvdW50ZXIgPSAxOworCisJCQkvLyBPcGVuIHRoZSBkYXRhIHNvdXJjZSBmaWxlIGZvciB0aGlzIGNvdW50cnkuCisJCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBHZW5VdGlscy5vcGVuUmVhZGVyKGZpbGUpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCI8PDw8IFByb2Nlc3NpbmcgY291bnRyeSA6ICIgKyBmaWxlICsgIiA+Pj4+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJdHJ5IHsKKworCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgeworCisJCQkJCVN0cmluZyBidWZmZXIgPSBudWxsOworCQkJCQkvLyBEZXNjcmliZXMgbGV2ZWwKKwkJCQkJLy8gb2YgZGF0YSB3ZQorCQkJCQkvLyBhcmUgbm93IHByb2Nlc3NpbmcgOiBMRVZFTDAsIExFVkVMMSwgb3IgTEVWRUwyLgorCQkJCQlpbnQgbGV2ZWwgPSAtMTsKKwkJCQkJLy8gUmVjb3JkIHRoZSBwcmV2aW91cyBsZXZlbC4KKwkJCQkJaW50IG9sZExldmVsID0gbGV2ZWwgLSAxOworCQkJCQkvLyBXZSB0YWtlIGEgY2h1bmsgb2YgdGhlIGRhdGEgW0JVRkZFUl9NSU4sQlVGRkVSX01BWF0gdG8KKwkJCQkJLy8gbWFrZSBwcm9jZXNzaW5nIG1vcmUKKwkJCQkJLy8gZWZmaWNpZW50LCB3ZSBkb250IG5lZWQgYWxsIG9mIGl0LgorCQkJCQlpbnQgQlVGRkVSX01JTiA9IDA7CisJCQkJCWludCBCVUZGRVJfTUFYID0gMTIwOworCisJCQkJCUxpc3Q8U3RyaW5nPiBlbnRyeUxpc3QgPSBudWxsOworCisJCQkJCXdoaWxlIChHZW5VdGlscy5FT0YoYnVmZmVyID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IHRydWUpIHsKKworCQkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgd2UgbWFyayBhbGwgdW5rbm93biBkYXRhLgorCQkJCQkJYnVmZmVyID0gYnVmZmVyLnJlcGxhY2UoIiwsIiwgIixVTktOT1dOLCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCQkJLy8gVXNlIG9ubHkgcGFydCBvZiB0aGUgYnVmZmVyLCBub3QgYWxsIG9mIGl0IGZvcgorCQkJCQkJLy8gZWZmaWNpZW5jeS4KKwkJCQkJCVN0cmluZ1tdIGl0ZW1zID0gR2VuVXRpbHMKKwkJCQkJCQkJLmV4dHJhY3QoYnVmZmVyLmxlbmd0aCgpIDwgQlVGRkVSX01BWCA/IGJ1ZmZlcgorCQkJCQkJCQkJCTogYnVmZmVyLnN1YnN0cmluZyhCVUZGRVJfTUlOLAorCQkJCQkJCQkJCQkJQlVGRkVSX01BWCkpOworCisJCQkJCQkvLyBHZXQgdGhlIGNvdW50cnkgbmFtZQorCQkJCQkJU3RyaW5nIGNvdW50cnkgPSBpdGVtc1tJU09EYXRhLkNPVU5UUllfTkFNRV07CisKKwkJCQkJCS8vIEdldCB0aGUgSVNPMzE2Ni0xIGluZm8gZm9yIHRoaXMgY291bnRyeQorCQkJCQkJaWYgKGlzb0NvZGUgPT0gbnVsbCkgeworCQkJCQkJCWlzb0NvZGUgPSBHZW5VdGlscy5nZXRJU09Db2RlKGNvdW50cnksIGNvZGVMaXN0KTsKKwkJCQkJCX0KKworCQkJCQkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBwb3B1bGF0aW9uIGRhdGEKKwkJCQkJCS8vIGZvciB0aGlzIGNvdW50cnkuCisJCQkJCQlpZiAocG9wdWxhdGlvbkxpc3QgPT0gbnVsbCkgeworCQkJCQkJCVN0cmluZyBuYW1lID0gcG9wdWxhdGlvbkRhdGEgKyBjb3VudHJ5CisJCQkJCQkJCQkrICJfUE9QVUxBVElPTi50eHQiOyAvLyROT04tTkxTLTEkCisJCQkJCQkJcG9wdWxhdGlvbkxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QobmFtZSk7CisJCQkJCQl9CisKKwkJCQkJCS8vIEdldCB0aGUgbGV2ZWwgb2YgdGhlIGRhdGEgd2UgYXJlIHByb2Nlc3NpbmcuCisJCQkJCQlsZXZlbCA9IEdlblV0aWxzLmdldERhdGFMZXZlbChpdGVtcyk7CisKKwkJCQkJCS8vIFRoaXMgdmFyaWFibGUgaW5kaWNhdGVzIGEgdHJhbnNpdGlvbiBpbiBvdXIgZGF0YQorCQkJCQkJLy8gcHJvY2Vzc2luZworCQkJCQkJYm9vbGVhbiB0cmFuc2l0aW9uID0gKGxldmVsICE9IG9sZExldmVsKSA/IHRydWUgOiBmYWxzZTsKKworCQkJCQkJaWYgKHRyYW5zaXRpb24gPT0gdHJ1ZSkgeworCQkJCQkJCS8vIEtlZXAgdHJhY2sgb2YgcHJldmlvdXMgbGV2ZWwgaW4gb3JkZXIgdG8gZGV0ZWN0CisJCQkJCQkJLy8gdHJhbnNpdGlvbnMuCisJCQkJCQkJb2xkTGV2ZWwgPSBsZXZlbDsKKwkJCQkJCQkvLyBSZXNldCBvdXIgcmVwZWF0ZWQgaGlzdG9yeQorCQkJCQkJCS8vIHJlcGVhdGVkRW50cmllcyA9IG5ldyBTdHJpbmcoKTsKKwkJCQkJCQllbnRyeUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCQkJCQlpZiAocHJvcGVydGllc0ZpbGUgIT0gbnVsbCkgeworCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRHZW5lcmF0ZWQgOiAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrIGZpbGVOYW1lKTsKKwkJCQkJCQkJcHJvcGVydGllc0ZpbGUuY2xvc2UoKTsKKwkJCQkJCQkJcHJvcGVydGllc0ZpbGUgPSBudWxsOworCQkJCQkJCQlmaWxlTmFtZSA9IG51bGw7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQkvLyBJZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IGZvciB0aGlzIGNvdW50cnksCisJCQkJCQkvLyBjcmVhdGUgaXQgdXNpbmcgSVNPIGFscGhhMyBjb2RlLgorCQkJCQkJRmlsZSBjb3VudHJ5RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyCisJCQkJCQkJCSsgaXNvQ29kZS5nZXRBbHBoYTMoKSk7CisKKwkJCQkJCWlmIChjb3VudHJ5RGlyICE9IG51bGwgJiYgY291bnRyeURpci5leGlzdHMoKSA9PSBmYWxzZSkgeworCQkJCQkJCS8vIERpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gQ3JlYXRlIGl0LgorCQkJCQkJCWNvdW50cnlEaXIubWtkaXIoKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gQ3JlYXRlIGFuZCBvcGVuIHRoZSBuZXcgZmlsZS4KKwkJCQkJCWlmIChwcm9wZXJ0aWVzRmlsZSA9PSBudWxsKSB7CisJCQkJCQkJLy8gQ3JlYXRlIHRoZSBmaWxlIG5hbWUgZm9yIHRoZSBuZXcgcHJvcGVydGllcy5maWxlLgorCQkJCQkJCVN0cmluZyBhbHBoYTMgPSBpc29Db2RlLmdldEFscGhhMygpOworCQkJCQkJCWZpbGVOYW1lID0gY291bnRyeURpciArICJcXCIgKyBhbHBoYTMgKyAiXyIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJCQkrICJwb3B1bGF0aW9uLnByb2ZpbGUiOyAvLyROT04tTkxTLTEkCisJCQkJCQkJLy8gQ3JlYXRlIHRuZSBuZXcgcG9wdWxhdGlvbiBmaWxlIGZvciB0aGlzIGNvdW50cnkuCisJCQkJCQkJcHJvcGVydGllc0ZpbGUgPSBHZW5VdGlscy5vcGVuV3JpdGVyKGZpbGVOYW1lKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gVGhlIGN1cnJlbnQgZW50aXR5IHdlIGFyZSBkZWFsaW5nIHdpdGguCisJCQkJCQkvLyBCYXNlZCBvbiBpdHMgYWRtaW4gbGV2ZWwgaXQgY2FuIGJlIGEgY291bnRyeSwgYQorCQkJCQkJLy8gY291bnR5LCBldGM7CisJCQkJCQlTdHJpbmcgY3VycmVudCA9IG51bGw7CisKKwkJCQkJCXN3aXRjaCAobGV2ZWwpIHsKKworCQkJCQkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMDoKKwkJCQkJCQkvLyBEbyBOb3RoaW5uZworCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCQljYXNlIERhdGFUeXBlcy5MRVZFTF8xOgorCQkJCQkJCWN1cnJlbnQgPSBpdGVtc1tJU09EYXRhLkFETUlOMV9OQU1FXS50b1VwcGVyQ2FzZSgpOworCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlIERhdGFUeXBlcy5MRVZFTF8yOgorCQkJCQkJCWN1cnJlbnQgPSBpdGVtc1tJU09EYXRhLkFETUlOMl9OQU1FXS50b1VwcGVyQ2FzZSgpOworCQkJCQkJCWJyZWFrOworCisJCQkJCQl9IC8vIFN3aXRjaAorCisJCQkJCQkvLyBIYW5kbGUgVU5LTk9XTiBhbmQgTi5BLiBlbnRyaWVzIGRpZmZlcmVudGx5LgorCQkJCQkJaWYgKGN1cnJlbnQuZXF1YWxzKCJVTktOT1dOIikgfHwgY3VycmVudC5lcXVhbHMoIk4uQS4iKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCQkJCWlmIChsZXZlbCA9PSAxKSB7CisJCQkJCQkJCWN1cnJlbnQgPSBpc29Db2RlLmdldEFscGhhMigpICsgIi1VTkstIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBTdHJpbmcudmFsdWVPZih1bmtDb3VudGVyKyspOworCisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLy8gTGV2ZWwgMiBkYXRhLgorCQkJCQkJCQljdXJyZW50ID0gaXNvQ29kZS5nZXRBbHBoYTMoKSArICIuTDIuIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBTdHJpbmcudmFsdWVPZih1bmtDb3VudGVyKyspOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJLy8gTWFrZSBzdXJlIHRoaXMgaXMgbm90IGEgcmVwZWF0ZWQgbGV2ZWwgMSBlbnRyeS4KKwkJCQkJCWlmIChsZXZlbCA9PSAxKSB7CisKKwkJCQkJCQlpZiAoR2VuVXRpbHMuaXNSZXBlYXRlZChjdXJyZW50LCBlbnRyeUxpc3QpID09IHRydWUpIHsKKwkJCQkJCQkJLy8gRHVwbGljYXRlZCwgaWdub3JlLgorCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBSZW1lbWJlciB0aGlzIGVudGl0eSB0byBhdm9pZCBkdXBsaWNhdGVzLgorCQkJCQkJCWVudHJ5TGlzdC5hZGQoY3VycmVudCk7CisJCQkJCQl9CisKKwkJCQkJCS8vIE1ha2Ugc3VyZSB0aGlzIGlzIG5vdCBhIHJlcGVhdGVkIGxldmVsIDIgZW50cnkuCisJCQkJCQlpZiAobGV2ZWwgPT0gMikgeworCisJCQkJCQkJaWYgKEdlblV0aWxzLmlzUmVwZWF0ZWQoaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0KKwkJCQkJCQkJCSsgY3VycmVudCwgZW50cnlMaXN0KSA9PSB0cnVlKSB7CisJCQkJCQkJCS8vIER1cGxpY2F0ZWQsIGlnbm9yZS4KKwkJCQkJCQkJY29udGludWU7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gUmVtZW1iZXIgdGhpcyBlbnRpdHkgdG8gYXZvaWQgZHVwbGljYXRlcy4KKwkJCQkJCQllbnRyeUxpc3QuYWRkKGl0ZW1zW0lTT0RhdGEuQURNSU4xX05BTUVdICsgY3VycmVudCk7CisJCQkJCQl9CisKKwkJCQkJCVN0cmluZyBwb3B1bGF0aW9uID0gbnVsbDsKKworCQkJCQkJcG9wdWxhdGlvbiA9IGdldFBvcHVsYXRpb24oaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0sCisJCQkJCQkJCWl0ZW1zW0lTT0RhdGEuQ09VTlRSWV9OQU1FXSwgbGV2ZWwpOworCisJCQkJCQkvLyBpbmNyZWFzZSBjb3VudCBmb3IgdGhlIGNvbnRhaW5lciBvZiB0aGlzIGVudGl0eQorCQkJCQkJU3RyaW5nIHBWYWwgPSBwRGF0YS5nZXQoaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0pOworCisJCQkJCQlpZiAocFZhbCA9PSBudWxsKSB7CisKKwkJCQkJCQlwRGF0YS5wdXQoaXRlbXNbSVNPRGF0YS5BRE1JTjFfTkFNRV0sIHBvcHVsYXRpb24KKwkJCQkJCQkJCSsgIjoiICsgMCk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKworCQkJCQkJLy8gVG9rZW5pemUKKwkJCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBWYWwsCisJCQkJCQkJCSI6Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJLy8gV2Uga25vdyB0aGF0IHdlIGV4cGVjdCBvbmx5IHR3byB0b2tlbnMuIEdldCB0aGVtLgorCQkJCQkJLy8gT3JkZXIgbWF0dGVycyBoZXJlLgorCQkJCQkJU3RyaW5nW10gdG9rZW5zID0gbmV3IFN0cmluZ1syXTsKKwkJCQkJCS8vIFRoaXMgaXMgdGhlIGxvY2F0aW9uCisJCQkJCQl0b2tlbnNbQ09OVEFJTkVSXSA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50b1VwcGVyQ2FzZSgpOworCQkJCQkJLy8gVGhpcyBpcyB0aGUgY291bnQgb2YgZW50aXRpZXMKKwkJCQkJCXRva2Vuc1tDT1VOVF0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisKKwkJCQkJCWludCBjb3VudCA9IEludGVnZXIucGFyc2VJbnQodG9rZW5zWzFdKTsKKwkJCQkJCWNvdW50Kys7CisKKwkJCQkJCXBWYWwgPSB0b2tlbnNbQ09OVEFJTkVSXSArICI6IiArIGNvdW50OyAvLyROT04tTkxTLTEkCisKKwkJCQkJCXBEYXRhLnB1dChpdGVtc1tJU09EYXRhLkFETUlOMV9OQU1FXSwgcFZhbCk7CisKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bnRlZCA6ICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkrIGl0ZW1zW0lTT0RhdGEuQURNSU4xX05BTUVdICsgIiBBRE1JTiAyIDogIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCSsgaXRlbXNbSVNPRGF0YS5BRE1JTjJfTkFNRV0pOworCisJCQkJCX0gLy8gd2hpbGUgbG9vcAorCisJCQkJCS8vIE5vdyB3cml0ZSB0aGUgcmVzdWx0cworCQkJCQlJdGVyYXRvciBpdCA9IHBEYXRhLmtleVNldCgpLml0ZXJhdG9yKCk7CisKKwkJCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXQubmV4dCgpOworCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJLZXkgaXMgIiArIGtleSk7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJU3RyaW5nIHZhbHVlID0gcERhdGEuZ2V0KGtleSk7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlZhbHVlIGlzIDogIiArIHZhbHVlKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJCQlHZW5VdGlscy5hZGREYXRhKHByb3BlcnRpZXNGaWxlLCBrZXkgKyAiOiIgKyB2YWx1ZSAvLyROT04tTkxTLTEkCisJCQkJCQkJCSsgIlxuIik7IC8vJE5PTi1OTFMtMSQKKworCQkJCQl9CisKKwkJCQkJLy8gV2UgZG9udCBuZWVkIHRoZSBJU08gY29kZSBvYmplY3QgZm9yIHRoaXMgY291bnRyeQorCQkJCQkvLyBhbnltb3JlLCB3ZSBhcmUgZG9uZSBwcm9jZXNzaW5nIGl0LgorCQkJCQlpc29Db2RlID0gbnVsbDsKKworCQkJCQkvLyBSZXNldCB0aGUgcG9wdWxhdGlvbiBsaXN0CisJCQkJCWlmIChwb3B1bGF0aW9uTGlzdCAhPSBudWxsKSB7CisJCQkJCQlwb3B1bGF0aW9uTGlzdC5jbGVhcigpOworCQkJCQkJcG9wdWxhdGlvbkxpc3QgPSBudWxsOworCQkJCQl9CisKKwkJCQkJLy8gUmVzZXQgdGVoIGhhc2ggbWFwCisJCQkJCXBEYXRhLmNsZWFyKCk7CisKKwkJCQkJLy8gQ2xvc2UgYWxsIG9wZW4gcmVzb3VyY2VzLgorCQkJCQlyZWFkZXIuY2xvc2UoKTsKKworCQkJCQlpZiAocHJvcGVydGllc0ZpbGUgIT0gbnVsbCkgeworCQkJCQkJcHJvcGVydGllc0ZpbGUuY2xvc2UoKTsKKwkJCQkJCXByb3BlcnRpZXNGaWxlID0gbnVsbDsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdEdlbmVyYXRlZCA6ICIgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWZpbGVOYW1lID0gbnVsbDsKKwkJCQkJfQorCisJCQkJCS8vIFJ1biBnYXJiYWdlIGNvbGxlY3Rpb24KKwkJCQkJLy9TeXN0ZW0uZ2MoKTsKKwkJCQl9CisKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCisJCX0gLy8gRm9yIGxvb3AKKworCX0KKworCS8qKgorCSAqIEZpbmQgdGhlIHBvcHVsYXRpb24gdmFsdWUgZm9yIGEgZ2l2ZW4gZW50aXR5LgorCSAqIAorCSAqIEBwYXJhbSBlbnRpdHkKKwkgKiAgICAgICAgICAgIGEgbG9jYXRpb24KKwkgKiBAcGFyYW0gbGV2ZWwKKwkgKiAgICAgICAgICAgIGFkbWluaXN0cmF0aXZlIGxldmVsCisJICogCisJICogQHJldHVybiB0aGUgcG9wdWxhdGlvbiB2YWx1ZSBmb3IgYSBsb2NhdGlvbgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UG9wdWxhdGlvbihTdHJpbmcgZW50aXR5LCBpbnQgbGV2ZWwpIHsKKworCQlmaW5hbCBpbnQgRU5USVRZID0gMDsKKworCQlmaW5hbCBpbnQgTEVWRUwgPSAxOworCisJCWZpbmFsIGludCBQT1BVTEFUSU9OID0gMjsKKworCQlJdGVyYXRvciBpdCA9IHBvcHVsYXRpb25MaXN0Lml0ZXJhdG9yKCk7CisKKwkJU3RyaW5nIGVudGl0eVN0ciA9IGVudGl0eS50b1VwcGVyQ2FzZSgpOworCisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKworCQkJU3RyaW5nW10gcG9wRGF0YSA9ICgoU3RyaW5nKSBpdC5uZXh0KCkpLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJaWYgKGVudGl0eVN0ci5lcXVhbHMocG9wRGF0YVtFTlRJVFldLnRyaW0oKS50b1VwcGVyQ2FzZSgpKSkgeworCisJCQkJLy8gQ2hlY2sgYm90aCBlbnRpdGllcyBiZWxvbmcgdG8gc2FtZSBsZXZlbAorCQkJCWlmIChTdHJpbmcudmFsdWVPZihsZXZlbCkuZXF1YWxzKHBvcERhdGFbTEVWRUxdLnRyaW0oKSkgPT0gZmFsc2UpIHsKKwkJCQkJLy8gSWdub3JlIDogc2FtZSBuYW1lICwgYnV0IGRpZmZlcmVudCBsZXZlbAorCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gcG9wRGF0YVtQT1BVTEFUSU9OXS50cmltKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIERFRkFVTFQ7CisJfQorCisJLyoqCisJICogRmluZCB0aGUgcG9wdWxhdGlvbiB2YWx1ZSBmb3IgYSBnaXZlbiBlbnRpdHkuCisJICogCisJICogQHBhcmFtIGVudGl0eQorCSAqICAgICAgICAgICAgYSBsb2NhdGlvbgorCSAqIAorCSAqIEBwYXJhbSBlbnRpdHlDb250YWluZXIKKwkgKiAgICAgICAgICAgIGEgY29udGFpbmVyIGZvciB0aGUgbG9jYXRpb24gKGVudGl0eSkKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBwb3B1bGF0aW9uIHZhbHVlIGZvciBhIGxvY2F0aW9uCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRQb3B1bGF0aW9uKFN0cmluZyBlbnRpdHksIFN0cmluZyBlbnRpdHlDb250YWluZXIsCisJCQlpbnQgbGV2ZWwpIHsKKworCQlmaW5hbCBpbnQgRU5USVRZID0gMDsKKworCQlmaW5hbCBpbnQgTEVWRUwgPSAxOworCisJCWZpbmFsIGludCBQT1BVTEFUSU9OID0gMjsKKworCQlTdHJpbmdbXSBwb3BEYXRhID0gbnVsbDsKKworCQlJdGVyYXRvciBpdCA9IHBvcHVsYXRpb25MaXN0Lml0ZXJhdG9yKCk7CisKKwkJU3RyaW5nIGVudGl0eVN0ciA9IGVudGl0eS50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKworCQlTdHJpbmcgZW50aXR5Q29udGFpbmVyU3RyID0gZW50aXR5Q29udGFpbmVyLnRvVXBwZXJDYXNlKCk7CisKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQlwb3BEYXRhID0gKChTdHJpbmcpIGl0Lm5leHQoKSkuc3BsaXQoIjoiKTsgLy8kTk9OLU5MUy0xJAorCisJCQlTdHJpbmdbXSBjb21wYXJlID0gbnVsbDsKKworCQkJLy8gR2V0IHRoZSBlbnRpdHkgbmFtZSBhbmQgcmVtb3ZlIGJsYW5rcworCQkJU3RyaW5nIGxvY2F0aW9uID0gcG9wRGF0YVtFTlRJVFldOworCisJCQlsb2NhdGlvbiA9IGxvY2F0aW9uLnJlcGxhY2UoIlxcdCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCWxvY2F0aW9uID0gbG9jYXRpb24udG9VcHBlckNhc2UoKS50cmltKCk7CisKKwkJCS8vIEhhbmRsZSBBbGlhc2VzIC0tIGNvbXBsZXggc3R1ZmYgOiQKKwkJCWlmIChsb2NhdGlvbi5jb250YWlucygiWyIpKSB7IC8vJE5PTi1OTFMtMSQKKworCQkJCWxvY2F0aW9uID0gbG9jYXRpb24ucmVwbGFjZSgiXSIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQkvLyBUb2tlbml6ZQorCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxvY2F0aW9uLCAiWyIpOyAvLyROT04tTkxTLTEkCisKKwkJCQkvLyBHZXQgdG9rZW5zIC0+IG9yZGVyIG1hdHRlcnMgaGVyZSEKKwkJCQljb21wYXJlID0gbmV3IFN0cmluZ1t0b2tlbnMuY291bnRUb2tlbnMoKV07CisJCQkJaW50IGkgPSAwOworCQkJCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7CisJCQkJCWNvbXBhcmVbaSsrXSA9IHRva2Vucy5uZXh0VG9rZW4oKS50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChjb21wYXJlICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBhcmUubGVuZ3RoOyBpKyspIHsKKwkJCQkJaWYgKGVudGl0eVN0ci5yZXBsYWNlKCItIiwgIiAiKS5lcXVhbHMoIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCWNvbXBhcmVbaV0ucmVwbGFjZSgiLSIsICIgIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCXx8IGNvbXBhcmVbaV0uZXF1YWxzKGVudGl0eVN0ciArICItMSIpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQl8fCBjb21wYXJlW2ldLmVxdWFscyhlbnRpdHlDb250YWluZXJTdHIpKSB7CisKKwkJCQkJCXJldHVybiBwb3BEYXRhW1BPUFVMQVRJT05dLnRyaW0oKTsKKwkJCQkJfQorCisJCQkJfQorCQkJfSBlbHNlIGlmIChlbnRpdHlTdHIuZXF1YWxzKGxvY2F0aW9uKQorCQkJCQl8fCBlbnRpdHlTdHIucmVwbGFjZSgiLSIsICIgIikuZXF1YWxzKGxvY2F0aW9uKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJfHwgbG9jYXRpb24uZXF1YWxzKGVudGl0eVN0ciArICItMSIpKSB7IC8vJE5PTi1OTFMtMSQKKworCQkJCS8vIENoZWNrIGJvdGggZW50aXRpZXMgYmVsb25nIHRvIHNhbWUgbGV2ZWwKKwkJCQlpZiAoU3RyaW5nLnZhbHVlT2YobGV2ZWwpLmVxdWFscyhwb3BEYXRhW0xFVkVMXS50cmltKCkpID09IGZhbHNlKSB7CisJCQkJCS8vIElnbm9yZSA6IHNhbWUgbmFtZSAsIGJ1dCBkaWZmZXJlbnQgbGV2ZWwKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJcmV0dXJuIHBvcERhdGFbUE9QVUxBVElPTl0udHJpbSgpOworCisJCQl9CisKKwkJfSAvLyB3aGlsZQorCisJCXJldHVybiBERUZBVUxUOworCX0KKworCS8qKgorCSAqIE1haW4gZXhlY3V0aW9uIGVudHJ5IHBvaW50LgorCSAqIAorCSAqIEBwYXJhbSBhcmdzCisJICogCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlmaW5hbCBpbnQgSVNPXzMxNjZfMSA9IDA7CisJCWZpbmFsIGludCBQT1BVTEFUSU9OX0RBVEEgPSAxOworCQlmaW5hbCBpbnQgVEFSR0VUX0xJU1QgPSAyOworCQlmaW5hbCBpbnQgT1VUUFVUX0RJUiA9IDM7CisJCWZpbmFsIGludCBQQVJBTVMgPSA0OworCisJCWlmIChhcmdzLmxlbmd0aCA8IFBBUkFNUykgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCItLVdyb25nIGFyZ3VtZW50cy0tIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQKKwkJCQkJLnByaW50bG4oIlx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyA6ICIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgSVNPIDMxNjYtMSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBQb3B1bGF0aW9uIGRhdGEgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgVGFyZ2V0IGNvdW50cmllcyBmaWxlIik7IC8vJE5PTi1OTFMtMSQJCQkKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBPdXRwdXQgZGlyZWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQJCQkJCQkJCQorCQkJcmV0dXJuOworCQl9CisKKwkJUG9wdWxhdGlvblByb2ZpbGVyIHByb2ZpbGVyID0gbmV3IFBvcHVsYXRpb25Qcm9maWxlcihhcmdzW0lTT18zMTY2XzFdLAorCQkJCWFyZ3NbUE9QVUxBVElPTl9EQVRBXSwgYXJnc1tUQVJHRVRfTElTVF0sIGFyZ3NbT1VUUFVUX0RJUl0pOworCQlwcm9maWxlci5ydW4oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvUHJvcGVydGllc0dlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9Qcm9wZXJ0aWVzR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1YTYwZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvUHJvcGVydGllc0dlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBTVEVNIElJIERhdGEgTWlncmF0aW9uL0dlbmVyYXRpb24gVXRpbGl0aWVzIC0tVGhpcyBjbGFzcyBnZW5lcmF0ZXMgYWxsIHRoZQorICogcHJvcGVydHkgZmlsZXMgZm9yIGVhY2ggY291bnRyeS4gSXQgZG9lcyBzbyBieSBpbnZva2luZyB0aGUgTmFtZSwgQXJlYSwKKyAqIFBvcHVsYXRpb24sIGFuZCBOb2RlIERhdGEgZ2VuZXJhdG9ycy4KKyAqIAorICogCisgKiBUbyBjb25maWd1cmUsIHNlZSBjb25maWd1cmF0aW9uIGZpbGUgOgorICogb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vUHJvcGVydGllc0dlbmVyYXRvci5jb25maWcKKyAqIAorICogCisgKiBUbyBydW4sIGFkZCBwYXRoIHRvIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiB0aGUgcnVuIHByb2ZpbGUgKGkuZS4KKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcY29uZmlndXJhdGlvblxQcm9wZXJ0aWVzR2VuZXJhdG9yLmNvbmZpZykKKyAqIAorICogU0VUIFZNQVJHUyBUTyA6IC1YbXMxMDI0bSAtWG14MTAyNG0KKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzR2VuZXJhdG9yIHsKKworCS8qKgorCSAqIEV4ZWN1dGlvbiBlbnRyeSBwb2ludAorCSAqIAorCSAqIEBwYXJhbSBhcmdzCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCisJCS8vIGZpbmFsIGludCBJU09fMzE2Nl8xID0gMDsKKwkJLy8gZmluYWwgaW50IElTT18zMTY2XzIgPSAxOworCQkvLyBmaW5hbCBpbnQgRklYX0ZJTEUgPSAyOworCQkvLyBmaW5hbCBpbnQgQ0lBX0RBVEEgPSAzOworCQkvLyBmaW5hbCBpbnQgUE9QVUxBVElPTl9QUk9GSUxFID0gNDsKKwkJLy8gZmluYWwgaW50IENPVU5UUllfTElTVCA9IDU7CisJCS8vIGZpbmFsIGludCBQT0xZR09OX0FSRUFTID0gNjsKKwkJLy8gZmluYWwgaW50IExFWF9ESVIgPSA3OworCQkvLyBmaW5hbCBpbnQgUFJPUEVSVElFU19PVVRQVVRfRElSID0gODsKKwkJLy8gZmluYWwgaW50IEdNTF9PVVRQVVRfRElSID0gOTsKKwkJLy8gZmluYWwgaW50IFBBUkFNUyA9IDEwOworCQkvLworCQkvLyBpZiAoYXJncy5sZW5ndGggPCBQQVJBTVMpIHsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLVdyb25nIGFyZ3VtZW50cy0tIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dAorCQkvLyAucHJpbnRsbigiXHRUbyBydW4sIHBsZWFzZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIDogIik7CisJCS8vIC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IElTTyAzMTY2LTEgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBJU08gMzE2Ni0yIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgSVNPIGZpeCBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IENJQSBkYXRhIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IFBvcHVsYXRpb24gcHJvZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBUYXJnZXQgY291bnRyaWVzIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgUG9seWdvbiBhcmVhcyIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBMZXhpY29ncmFwaGljIHNvcnRpbmcgZGlyZWN0b3J5Iik7CisJCS8vIC8vJE5PTi1OTFMtMSQkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBPdXRwdXQgZGlyZWN0b3J5IGZvciBwcm9wZXJ0aWVzIGZpbGVzIik7CisJCS8vIC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IE91dHB1dCBkaXJlY3RvcnkgZm9yIEdNTCBtYXBzIik7CisJCS8vIC8vJE5PTi1OTFMtMSQKKwkJLy8gcmV0dXJuOworCQkvLyB9CisKKwkJLy8gLy8gR2VuZXJhdGUgdGhlIG5hbWVzLnByb3BlcnRpZXMgZmlsZXMgZm9yIGVhY2ggY291bnRyeS4KKwkJLy8gTmFtZUdlbmVyYXRvciBuYW1lR2VuID0gbmV3IE5hbWVHZW5lcmF0b3IoYXJnc1tJU09fMzE2Nl8xXSwKKwkJLy8gYXJnc1tJU09fMzE2Nl8yXSwgYXJnc1tGSVhfRklMRV0sIGFyZ3NbQ09VTlRSWV9MSVNUXSwKKwkJLy8gYXJnc1tMRVhfRElSXSwgYXJnc1tQUk9QRVJUSUVTX09VVFBVVF9ESVJdKTsKKwkJLy8gbmFtZUdlbi5ydW4oKTsKKwkJLy8KKwkJLy8gLy8gUnVuIGdhcmJhZ2UgY29sbGVjdGlvbgorCQkvLyBTeXN0ZW0uZ2MoKTsKKwkJLy8KKwkJLy8gLy8gR2VuZXJhdGUgdGhlIHBvcHVsYXRpb24ucHJvcGVydGllcyBmaWxlcyBmb3IgZWFjaCBjb3VudHJ5LgorCQkvLyBQb3B1bGF0aW9uR2VuZXJhdG9yIHBvcEdlbiA9IG5ldworCQkvLyBQb3B1bGF0aW9uR2VuZXJhdG9yKGFyZ3NbSVNPXzMxNjZfMV0sCisJCS8vIGFyZ3NbSVNPXzMxNjZfMl0sIGFyZ3NbRklYX0ZJTEVdLCBhcmdzW0NJQV9EQVRBXSwKKwkJLy8gYXJnc1tQT1BVTEFUSU9OX1BST0ZJTEVdLCBhcmdzW0NPVU5UUllfTElTVF0sIGFyZ3NbTEVYX0RJUl0sCisJCS8vIGFyZ3NbUFJPUEVSVElFU19PVVRQVVRfRElSXSk7CisJCS8vIHBvcEdlbi5ydW4oKTsKKwkJLy8KKwkJLy8gLy8gUnVuIGdhcmJhZ2UgY29sbGVjdGlvbgorCQkvLyBTeXN0ZW0uZ2MoKTsKKwkJLy8KKwkJLy8gLy8gR2VuZXJhdGUgdGhlIGFyZWEucHJvcGVydGllcyBmaWxlcyBmb3IgZWFjaCBjb3VudHJ5LgorCQkvLyBBcmVhR2VuZXJhdG9yIGFyZWFHZW4gPSBuZXcgQXJlYUdlbmVyYXRvcihhcmdzW0lTT18zMTY2XzFdLAorCQkvLyBhcmdzW0lTT18zMTY2XzJdLCBhcmdzW0ZJWF9GSUxFXSwgYXJnc1tDSUFfREFUQV0sCisJCS8vIGFyZ3NbQ09VTlRSWV9MSVNUXSwgYXJnc1tQT0xZR09OX0FSRUFTXSwgYXJnc1tMRVhfRElSXSwKKwkJLy8gYXJnc1tQUk9QRVJUSUVTX09VVFBVVF9ESVJdKTsKKwkJLy8gYXJlYUdlbi5ydW4oKTsKKwkJLy8KKwkJLy8gLy8gUnVuIGdhcmJhZ2UgY29sbGVjdGlvbgorCQkvLyBTeXN0ZW0uZ2MoKTsKKwkJLy8KKwkJLy8gLy8gR2VuZXJhdGUgdGhlIG5vZGUucHJvcGVydGllcyBmaWxlcyBmb3IgZWFjaCBjb3VudHJ5LgorCQkvLyBOb2RlRGF0YUdlbmVyYXRvciBub2RlRGF0YUdlbiA9IG5ldworCQkvLyBOb2RlRGF0YUdlbmVyYXRvcihhcmdzW0lTT18zMTY2XzFdLAorCQkvLyBhcmdzW0lTT18zMTY2XzJdLCBhcmdzW0ZJWF9GSUxFXSwgYXJnc1tDT1VOVFJZX0xJU1RdLAorCQkvLyBhcmdzW0xFWF9ESVJdLCBhcmdzW1BST1BFUlRJRVNfT1VUUFVUX0RJUl0pOworCQkvLyBub2RlRGF0YUdlbi5ydW4oKTsKKwkJLy8KKwkJLy8gLy8gUnVuIGdhcmJhZ2UgY29sbGVjdGlvbgorCQkvLyBTeXN0ZW0uZ2MoKTsKKwkJLy8KKwkJLy8gLy8gR2VuZXJhdGUgdGhlIEdNTCBmaWxlcyBmb3IgZWFjaCBjb3VudHJ5LgorCQkvLyBHTUxHZW5lcmF0b3IgZ21sR2VuID0gbmV3IEdNTEdlbmVyYXRvcihhcmdzW0lTT18zMTY2XzFdLAorCQkvLyBhcmdzW0lTT18zMTY2XzJdLCBhcmdzW0ZJWF9GSUxFXSwgYXJnc1tDT1VOVFJZX0xJU1RdLAorCQkvLyBhcmdzW0xFWF9ESVJdLCBhcmdzW0dNTF9PVVRQVVRfRElSXSk7CisJCS8vIGdtbEdlbi5ydW4oKTsKKworCQlmaW5hbCBpbnQgQ09ORklHX0ZJTEUgPSAwOworCQlmaW5hbCBpbnQgUEFSQU1TID0gMTsKKworCQlpZiAoYXJncy5sZW5ndGggPCBQQVJBTVMpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJcdFRvIHJ1biwgcGxlYXNlIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhcmd1bWVudChzKSA6ICIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgQ29uZmlndXJhdGlvbiBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5leGl0KDEpOworCQl9CisKKwkJLy8gR2VuZXJhdGUgdGhlIG5hbWVzLnByb3BlcnRpZXMgZmlsZXMgZm9yIGVhY2ggY291bnRyeS4KKwkJTmFtZUdlbmVyYXRvciBuYW1lR2VuID0gbmV3IE5hbWVHZW5lcmF0b3IoYXJnc1tDT05GSUdfRklMRV0pOworCQluYW1lR2VuLnJ1bigpOworCisJCS8vIFJ1biBnYXJiYWdlIGNvbGxlY3Rpb24KKwkJU3lzdGVtLmdjKCk7CisKKwkJLy8gR2VuZXJhdGUgdGhlIHBvcHVsYXRpb24ucHJvcGVydGllcyBmaWxlcyBmb3IgZWFjaCBjb3VudHJ5LgorCQlQb3B1bGF0aW9uR2VuZXJhdG9yIHBvcEdlbiA9IG5ldyBQb3B1bGF0aW9uR2VuZXJhdG9yKGFyZ3NbQ09ORklHX0ZJTEVdKTsKKwkJcG9wR2VuLnJ1bigpOworCisJCS8vIFJ1biBnYXJiYWdlIGNvbGxlY3Rpb24KKwkJU3lzdGVtLmdjKCk7CisKKwkJLy8gR2VuZXJhdGUgdGhlIGFyZWEucHJvcGVydGllcyBmaWxlcyBmb3IgZWFjaCBjb3VudHJ5LgorCQlBcmVhR2VuZXJhdG9yIGFyZWFHZW4gPSBuZXcgQXJlYUdlbmVyYXRvcihhcmdzW0NPTkZJR19GSUxFXSk7CisJCWFyZWFHZW4ucnVuKCk7CisKKwkJLy8gUnVuIGdhcmJhZ2UgY29sbGVjdGlvbgorCQlTeXN0ZW0uZ2MoKTsKKworCQkvLyBHZW5lcmF0ZSB0aGUgbm9kZS5wcm9wZXJ0aWVzIGZpbGVzIGZvciBlYWNoIGNvdW50cnkuCisJCU5vZGVEYXRhR2VuZXJhdG9yIG5vZGVEYXRhR2VuID0gbmV3IE5vZGVEYXRhR2VuZXJhdG9yKGFyZ3NbQ09ORklHX0ZJTEVdKTsKKwkJbm9kZURhdGFHZW4ucnVuKCk7CisKKwkJLy8gUnVuIGdhcmJhZ2UgY29sbGVjdGlvbgorCQlTeXN0ZW0uZ2MoKTsKKworCQkvLyBHZW5lcmF0ZSB0aGUgR01MIGZpbGVzIGZvciBlYWNoIGNvdW50cnkuCisJCUdNTEdlbmVyYXRvciBnbWxHZW4gPSBuZXcgR01MR2VuZXJhdG9yKGFyZ3NbQ09ORklHX0ZJTEVdKTsKKwkJZ21sR2VuLnJ1bigpOworCisJfSAvLyBtYWluCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL1J1c3NpYURhdGFDbGVhbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL1J1c3NpYURhdGFDbGVhbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzNzViMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvUnVzc2lhRGF0YUNsZWFuZXIuamF2YQpAQCAtMCwwICsxLDQwMiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VuZXJhdG9yczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogU1RFTSBJSSBEYXRhIE1pZ3JhdGlvbi9HZW5lcmF0aW9uIFV0aWxpdGllcyA6IEluc3RhbmNlcyBvZiB0aGlzIHV0aWxpdHkgY2xhc3MKKyAqIGNsZWFuIHRoZSBkYXRhIGZvciBSdXNzaWEuIFRoaXMgcHJvZ3JhbSB3aWxsIHJlbW92ZSBhbGwgdW5uZWNlc2FyeSBkYXRhIGZyb20KKyAqIHRoZSBvcmlnaW5hbCBkYXRhIHNvdXJjZSBmaWxlIGZvciBSdXNzaWEuIFRoZSBvcmlnaW5hbCBkYXRhIHNvdXJjZSBmaWxlIGZvcgorICogUnVzc2lhIHdhcyBkb3dubG9hZGVkIGZyb20gOgorICogaHR0cDovL3d3dy5ncmlkLnVuZXAuY2gvZGF0YS9kYXRhLnBocD9jYXRlZ29yeT1odW1hbl9yZWxhdGVkCisgKiAKKyAqIAorICogVG8gY29uZmlndXJlLCBzZWUgY29uZmlndXJhdGlvbiBmaWxlIDoKKyAqIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL1J1c3NpYURhdGFDbGVhbmVyLmNvbmZpZworICogCisgKiAKKyAqIFRvIHJ1biwgYWRkIHBhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlIGluIHRoZSBydW4gcHJvZmlsZSAoaS5lLgorICogQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxjb25maWd1cmF0aW9uXFJ1c3NpYURhdGFDbGVhbmVyLmNvbmZpZykKKyAqIAorICogQWRkIHRoZSBmb2xsb3dpbmcgdmFsdWVzIHRvIHRoZSBydW4gY29uZmlndXJhdGlvbjoKKyAqIAorICogQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXGlucHV0XHByb3BlcnRpZXNcRXVyb3BlQ291bnRyaWVzLnR4dAorICogQzpcRXVyb3BlRGF0YTIwMDdcUnVzc2lhXAorICogCisgKiBPdmVydmlldyBvZiB0aGUgZGF0YSBnZW5lcmF0aW9uIHByb2Nlc3MgZm9yIHRoZSBSdXNzaWEgZGF0YSBzZXQuCisgKiAKKyAqIDEpIERhdGEgQ2xlYW5pbmcgOiBzdGFydCBieSBydW5uaW5nIFJ1c3NpYURhdGFDbGVhbmVyLiBUaGlzIHByb2dyYW0gd2lsbAorICogcmVtb3ZlIGFsbCB1bm5lY2VzYXJ5IGRhdGEgKGkuZS4gY29sdW1ucykgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBJbgorICogYWRkaXRpb24sIHRoaXMgcHJvZ3JhbSB3aWxsIGdyb3VwIHRoZSBkYXRhIGJhc2VkIG9uIGl0cyBJRCAoaS5lLiBOTyxJVCxGUixVSywKKyAqIGV0YykuIFRoZSByZXN1bHQgd2lsbCBiZSBhIGZpbGUgbmFtZWQgUnVzc2lhU29ydGVkLnR4dCB3aXRoIGNsZWFuZWQgZGF0YS4KKyAqIAorICogSW4gb3RoZXIgd29yZHMgOiBSdXNzaWEudHh0IC0tPiB8fFJ1c3NpYURhdGFDbGVhbmVyfHwgLS0+IFJ1c3NpYVNvcnRlZC50eHQKKyAqIAorICogTk9URTogUnVzc2lhU29ydGVkLnR4dCB3aWxsIGJlIHVzZWQgYXMgdGhlIGlucHV0IGZvciB0aGUgcmVtYWluaW5nIHBhcnQgb2YKKyAqIHRoZSBwcm9jZXNzLgorICogCisgKiAKKyAqIDIpIERhdGEgQ29udmVydGVyIDogcnVuIFJ1c3NpYURhdGFDb252ZXJ0ZXIgdG8gY29udmVydCBmaWxlIGluIGNsZWFuZWQgZm9ybWF0CisgKiBpbnRvIERpdmEgZm9ybWF0LgorICogCisgKiAKKyAqIDMpIEFyZWEgYW5kIFBvcHVsYXRpb24gRGF0YSBFeHRyYWN0aW9uIDogcnVuIFJ1c3NpYURhdGFFeHRyYWN0b3IgdG8gZXh0cmFjdAorICogYXJlYSBhbmQgcG9wdWxhdGlvbiBkYXRhIG9yIGFsbCBhZG1pbmlzdHJhdGlvbnMgaW4gUnVzc2lhLgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBSdXNzaWFEYXRhQ2xlYW5lciB7CisKKwlwcml2YXRlIFN0cmluZyB0YXJnZXRGaWxlID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIG91dHB1dERpciA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyB3b3Jrc3BhY2UgPSBudWxsOworCisJLyoqCisJICogTGlzdCBmb3IgSVNPIDMxNjYtMSBjb2RlcyBhbmQgdGFyZ2V0IGNvdW50cmllcy4KKwkgKi8KKwlMaXN0PFN0cmluZz4gdGFyZ2V0TGlzdCA9IG51bGw7CisKKwlMaXN0PFN0cmluZz4gY29kZUxpc3QgPSBudWxsOworCisJLyoqCisJICogSGFzaCBtYXAgdG8ga2VlcCB0cmFjayBvZiBwb2x5Z29ucy4KKwkgKi8KKwlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gdGFyZ2V0RmlsZSAtCisJICogICAgICAgICAgICBkYXRhIGZpbGUgd2hlcmUgd2UgZmluZCBhIGxpc3Qgb2YgY291bnRyaWVzIGZvciBnZW5lcmF0aW9uIG9mCisJICogICAgICAgICAgICB0aGVpciBjb3JyZXNwb25kaW5nIGFyZWEucHJvcGVydGllcyBmaWxlcy4KKwkgKiBAcGFyYW0gb3V0cHV0RGlyIC0KKwkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGUgZmlsZXMgZ2VuZXJhdGVkLgorCSAqIAorCSAqLworCS8vIHB1YmxpYyBSdXNzaWFEYXRhQ2xlYW5lcihTdHJpbmcgdGFyZ2V0RmlsZSwgU3RyaW5nIG91dHB1dERpcikgeworCS8vIC8vIFNldCB2YWx1ZXMgb2YgZ2xvYmFsIHZhcmlhYmxlcy4KKwkvLyB0aGlzLnRhcmdldEZpbGUgPSB0YXJnZXRGaWxlOworCS8vIHRoaXMub3V0cHV0RGlyID0gb3V0cHV0RGlyOworCS8vIHRhcmdldExpc3QgPSBudWxsOworCS8vIG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCS8vCX0KKworCS8qKgorCSAqIEBwYXJhbSBjb25maWdGaWxlCisJICovCisJcHVibGljIFJ1c3NpYURhdGFDbGVhbmVyKFN0cmluZyBjb25maWdGaWxlKSB7CisJCisJCS8vIExvYWQgYWxsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCisJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHZhcnMgPSBHZW5VdGlscy5sb2FkQ29uZmlnRmlsZShjb25maWdGaWxlKTsKKworCQlTZXQ8U3RyaW5nPiBrZXlzID0gdmFycy5rZXlTZXQoKTsKKwkJSXRlcmF0b3IgaXQgPSBrZXlzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyB2YXIgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisKKwkJCS8vIEFzc2lnbiB2YWx1ZXMgdG8gY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgOgorCQkJaWYgKHZhci5lcXVhbHMoIldPUktTUEFDRSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl3b3Jrc3BhY2UgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJUQVJHRVRfTElTVCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl0YXJnZXRGaWxlID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiT1VUUFVUIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCW91dHB1dERpciA9IHZhcnMuZ2V0KHZhcik7CisJCQl9CisKKwkJfSAvLyB3aGlsZQorCisJCS8vIFRoZSB3b3Jrc3BhY2UgdmFyaWFibGUgc2hvdWxkIGVuZCB3aXRoIGEgc2xhc2ggY2hhcmFjdGVyCisJCWlmICh3b3Jrc3BhY2UuZW5kc1dpdGgoIlxcIikgPT0gZmFsc2UpIHsgLy8kTk9OLU5MUy0xJAorCQkJd29ya3NwYWNlICs9ICJcXCI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCVN0cmluZyBwYXRoID0gd29ya3NwYWNlICsgR2VuQ29uc3RhbnRzLlBBUkFNU19ESVI7CisKKwkJLy8gU2V0IHJlbWFpbmluZyBjb25maWcgdmFycyB1c2luZyBXT1JLU1BBQ0UgKHdvcmtzcGFjZSByZWxhdGl2ZSkKKworCQlpZiAodGFyZ2V0RmlsZSA9PSBudWxsKSB7CisJCQl0YXJnZXRGaWxlID0gcGF0aCArIEdlbkNvbnN0YW50cy5FVVJPUEVfQ09VTlRSSUVTOworCQl9CisJCWlmIChvdXRwdXREaXIgPT0gbnVsbCkgeworCQkJb3V0cHV0RGlyID0gR2VuQ29uc3RhbnRzLkRVTU1ZX0RJUjsKKwkJfQorCisJCXRhcmdldExpc3QgPSBudWxsOworCisJCW1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2V0cyB1cCBhbmQgcnVucyB0aGUgZmluZGVyLgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBjb3VudHJpZXMgd2Ugd2FudC4KKwkJdGFyZ2V0TGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdCh0YXJnZXRGaWxlKTsKKworCQkvLyBOb3csIHByb2Nlc3MgZWFjaCBpdGVtIGluIHRoZSB0YXJnZXQgbGlzdC4KKwkJcHJvY2VzcygpOworCX0KKworCS8qKgorCSAqIFByb2Nlc3Mgb3VyIGdsb2JhbCBsaXN0IG9mIHRhcmdldCBjb3VudHJpZXMuCisJICogCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJvY2VzcygpIHsKKworCQkvLyBBIHdyaXRlciBmb3IgdGhlIG5ldyBmaWxlIHdlIGFyZSBjcmVhdGluZy4KKwkJUHJpbnRXcml0ZXIgcnVzc2lhRmlsZSA9IG51bGw7CisKKwkJLy8gTmFtZSBvZiB0aGUgbmV3IHByb3BlcnRpZXMgZmlsZS4KKwkJU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKKworCQlpbnQgc2l6ZSA9IHRhcmdldExpc3Quc2l6ZSgpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisKKwkJCS8vIEdldCB0aGUgbmV4dCBjb3VudHJ5IGluIHRoZSBsaXN0LgorCQkJU3RyaW5nIGZpbGUgPSB0YXJnZXRMaXN0LmdldChpKS50cmltKCk7CisKKwkJCS8vIE9wZW4gdGhlIGRhdGEgc291cmNlIGZpbGUgZm9yIHRoaXMgY291bnRyeS4KKwkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IEdlblV0aWxzLm9wZW5SZWFkZXIoZmlsZSk7CisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJcdFx0PDw8PCBSVVNTSUEgREFUQSBDTEVBTkVSIC0tIFByb2Nlc3NpbmcgQ291bnRyeSA6ICIgKyBmaWxlICsgIiA+Pj4+Iik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKKwkJCXRyeSB7CisKKwkJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKKworCQkJCQlTdHJpbmcgYnVmZmVyID0gbnVsbDsKKworCQkJCQkvLyBXZSB0YWtlIGEgY2h1bmsgb2YgdGhlIGRhdGEgW0JVRkZFUl9NSU4sQlVGRkVSX01BWF0gdG8KKwkJCQkJLy8gbWFrZSBwcm9jZXNzaW5nIG1vcmUKKwkJCQkJLy8gZWZmaWNpZW50LCB3ZSBkb250IG5lZWQgYWxsIG9mIGl0LgorCQkJCQlpbnQgQlVGRkVSX01JTiA9IDA7CisJCQkJCWludCBCVUZGRVJfTUFYID0gMjAwOworCisJCQkJCXdoaWxlIChHZW5VdGlscy5FT0YoYnVmZmVyID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IHRydWUpIHsKKworCQkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgd2UgbWFyayBhbGwgdW5rbm93biBkYXRhLgorCQkJCQkJYnVmZmVyID0gYnVmZmVyLnJlcGxhY2UoIiwsLCIsICIsVU5LTk9XTixVTktOT1dOLCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCWJ1ZmZlciA9IGJ1ZmZlci5yZXBsYWNlKCIsLCIsICIsVU5LTk9XTiwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQkJCVN0cmluZ1tdIGl0ZW1zID0gYnVmZmVyLnN1YnN0cmluZyhCVUZGRVJfTUlOLAorCQkJCQkJCQlCVUZGRVJfTUFYKS5zcGxpdCgiLCIpOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCS8vIENsZWFyIGJ1ZmZlciBvZiBkYXRhIHdlIGRvbnQgbmVlZC4KKwkJCQkJCVN0cmluZyBjbGVhbkJ1ZmZlciA9IGNsZWFuKGJ1ZmZlcik7CisKKwkJCQkJCUZpbGUgY291bnRyeURpciA9IG5ldyBGaWxlKG91dHB1dERpcik7CisKKwkJCQkJCWlmIChjb3VudHJ5RGlyICE9IG51bGwgJiYgY291bnRyeURpci5leGlzdHMoKSA9PSBmYWxzZSkgeworCQkJCQkJCS8vIERpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gQ3JlYXRlIGl0LgorCQkJCQkJCWNvdW50cnlEaXIubWtkaXIoKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gQ3JlYXRlIGFuZCBvcGVuIHRoZSBuZXcgZmlsZS4KKwkJCQkJCWlmIChydXNzaWFGaWxlID09IG51bGwpIHsKKwkJCQkJCQlmaWxlTmFtZSA9IGNvdW50cnlEaXIgKyAiXFwiICsgIlJ1c3NpYVNvcnRlZC50eHQiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCQkJCQkKKwkJCQkJCQkvLyBDcmVhdGUgdG5lIG5ldyBwcm9wZXJ0aWVzLmZpbGUgZm9yIHRoaXMgY291bnRyeS4KKwkJCQkJCQlydXNzaWFGaWxlID0gR2VuVXRpbHMub3BlbldyaXRlcihmaWxlTmFtZSk7CisJCQkJCQl9CisKKwkJCQkJCVN0cmluZyB2YWwgPSBtYXAKKwkJCQkJCQkJLmdldChpdGVtc1tSdXNzaWFEYXRhQ2xlYW5pbmdIZWFkZXIuTkFNRTFdKTsKKwkJCQkJCWlmICh2YWwgIT0gbnVsbCkgeworCQkJCQkJCS8vIENvbmNhdGVuYXRlCisJCQkJCQkJdmFsICs9IGNsZWFuQnVmZmVyICsgIlxuIjsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBGaXJzdCBlbnRyeQorCQkJCQkJCXZhbCA9IGNsZWFuQnVmZmVyICsgIlxuIjsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfQorCQkJCQkJbWFwLnB1dChpdGVtc1tSdXNzaWFEYXRhQ2xlYW5pbmdIZWFkZXIuTkFNRTFdLCB2YWwpOworCisJCQkJCX0vLyB3aGlsZQorCisJCQkJCS8vIENsb3NlIGFsbCBvcGVuIHJlc291cmNlcy4KKwkJCQkJcmVhZGVyLmNsb3NlKCk7CisKKwkJCQkJaWYgKHJ1c3NpYUZpbGUgIT0gbnVsbCkgeworCQkJCQkJU3RyaW5nIG91dHB1dCA9IGNvbnNvbGlkYXRlRGF0YShtYXApOworCQkJCQkJaWYgKG91dHB1dCAhPSBudWxsKSB7CisJCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShydXNzaWFGaWxlLCBvdXRwdXQpOworCQkJCQkJfQorCQkJCQkJcnVzc2lhRmlsZS5jbG9zZSgpOworCQkJCQkJcnVzc2lhRmlsZSA9IG51bGw7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkrIGZpbGVOYW1lKTsKKwkJCQkJCWZpbGVOYW1lID0gbnVsbDsKKwkJCQkJfQorCisJCQkJCS8vIFJ1biBnYXJiYWdlIGNvbGxlY3Rpb24KKwkJCQkJLy9TeXN0ZW0uZ2MoKTsKKworCQkJCX0KKworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisKKwkJfSAvLyBmb3IKKworCX0KKworCS8qKgorCSAqIAorCSAqIEdldCBhbGwgdGhlIHZhbHVlcyBpbiB0aGUgbWFwLgorCSAqIAorCSAqIEBwYXJhbSBtYXAKKwkgKiAgICAgICAgICAgIGEgbWFwIG9mIGxvY2F0aW9ucworCSAqIAorCSAqIEByZXR1cm4gU3RyaW5nIGEgc3RyaW5nIHdpbGwgYWxsIGxvY2F0aW9ucyBncm91cGVkIHNlY3VlbnRpYWx5LgorCSAqIAorCSAqLworCVN0cmluZyBjb25zb2xpZGF0ZURhdGEoSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwKSB7CisKKwkJU3RyaW5nIHZhbHVlID0gbnVsbDsKKworCQlpZiAobWFwLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlTZXQ8U3RyaW5nPiBrZXlzID0gbWFwLmtleVNldCgpOworCisJCUl0ZXJhdG9yIGl0ID0ga2V5cy5pdGVyYXRvcigpOworCisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKworCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKworCQkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCQl2YWx1ZSA9IG1hcC5nZXQoa2V5KTsKKwkJCX0gZWxzZSB7CisJCQkJdmFsdWUgKz0gbWFwLmdldChrZXkpOworCQkJfQorCisJCX0KKworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogUmVtb3ZlIGFsbCBpcnJlbGV2YW50IGRhdGEgZnJvbSBvdXIgYnVmZmVyCisJICovCisJU3RyaW5nIGNsZWFuKFN0cmluZyBidWZmZXIpIHsKKworCQkvLyBOdW1iZXIgb2Ygbm9uLXBvbHlnb24gY29sdW1ucy4KKwkJZmluYWwgaW50IExJTUlUID0gMTc7CisJCVN0cmluZyBuZXdCdWZmZXIgPSBudWxsOworCisJCVN0cmluZ1tdIGl0ZW1zID0gYnVmZmVyLnNwbGl0KCIsIik7IC8vJE5PTi1OTFMtMSQKKworCQlpbnQgaW5kZXggPSAwOworCisJCXdoaWxlIChpbmRleCA8IGl0ZW1zLmxlbmd0aCkgeworCisJCQlpZiAoaW5kZXggPj0gTElNSVQpIHsKKwkJCQluZXdCdWZmZXIgKz0gIiwiICsgaXRlbXNbaW5kZXgrK107IC8vJE5PTi1OTFMtMSQKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJc3dpdGNoIChpbmRleCkgeworCisJCQljYXNlIFJ1c3NpYURhdGFDbGVhbmluZ0hlYWRlci5JRDoKKwkJCQluZXdCdWZmZXIgPSBpdGVtc1tpbmRleF07CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUnVzc2lhRGF0YUNsZWFuaW5nSGVhZGVyLkFSRUE6CisJCQkJbmV3QnVmZmVyICs9ICIsIiArIGl0ZW1zW2luZGV4XTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCisJCQljYXNlIFJ1c3NpYURhdGFDbGVhbmluZ0hlYWRlci5DT1VOVFJZOgorCQkJCW5ld0J1ZmZlciArPSAiLCIgKyBpdGVtc1tpbmRleF07IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKworCQkJY2FzZSBSdXNzaWFEYXRhQ2xlYW5pbmdIZWFkZXIuTkFNRTE6CisJCQkJbmV3QnVmZmVyICs9ICIsIiArIGl0ZW1zW2luZGV4XTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCisJCQljYXNlIFJ1c3NpYURhdGFDbGVhbmluZ0hlYWRlci5OQU1FMjoKKwkJCQluZXdCdWZmZXIgKz0gIiwiICsgaXRlbXNbaW5kZXhdOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUnVzc2lhRGF0YUNsZWFuaW5nSGVhZGVyLk5BTUUzOgorCQkJCW5ld0J1ZmZlciArPSAiLCIgKyBpdGVtc1tpbmRleF07IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKworCQkJY2FzZSBSdXNzaWFEYXRhQ2xlYW5pbmdIZWFkZXIuUE9QMToKKwkJCQluZXdCdWZmZXIgKz0gIiwiICsgaXRlbXNbaW5kZXhdOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUnVzc2lhRGF0YUNsZWFuaW5nSGVhZGVyLlBPUDI6CisJCQkJbmV3QnVmZmVyICs9ICIsIiArIGl0ZW1zW2luZGV4XTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCisJCQl9CisKKwkJCWluZGV4Kys7CisKKwkJfQorCisJCXJldHVybiBuZXdCdWZmZXI7CisKKwl9CisKKwkvKioKKwkgKiBNYWluIGV4ZWN1dGlvbiBlbnRyeSBwb2ludC4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJLy8gZmluYWwgaW50IFRBUkdFVF9MSVNUID0gMDsKKwkJLy8gZmluYWwgaW50IE9VVFBVVF9ESVIgPSAxOworCQkvLyBmaW5hbCBpbnQgUEFSQU1TID0gMjsKKwkJLy8KKwkJLy8gaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQKKwkJLy8gLnByaW50bG4oIlx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyA6ICIpOworCQkvLyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBUYXJnZXQgY291bnRyaWVzIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgT3V0cHV0IGRpcmVjdG9yeSIpOyAvLyROT04tTkxTLTEkCisJCS8vIHJldHVybjsKKwkJLy8gfQorCisJCS8vIFJ1c3NpYURhdGFDbGVhbmVyIGZvcm1hdHRlciA9IG5ldworCQkvLyBSdXNzaWFEYXRhQ2xlYW5lcihhcmdzW1RBUkdFVF9MSVNUXSwKKwkJLy8gYXJnc1tPVVRQVVRfRElSXSk7CisJCS8vIGZvcm1hdHRlci5ydW4oKTsKKworCQlmaW5hbCBpbnQgQ09ORklHX0ZJTEUgPSAwOworCQlmaW5hbCBpbnQgUEFSQU1TID0gMTsKKworCQlpZiAoYXJncy5sZW5ndGggPCBQQVJBTVMpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdC0tV3JvbmcgYXJndW1lbnRzLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRcdFRvIHJ1biwgcGxlYXNlIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhcmd1bWVudChzKSA6ICIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdCBDb25maWd1cmF0aW9uIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLmV4aXQoMSk7CisJCX0KKworCQlSdXNzaWFEYXRhQ2xlYW5lciBjbGVhbmVyID0gbmV3IFJ1c3NpYURhdGFDbGVhbmVyKGFyZ3NbQ09ORklHX0ZJTEVdKTsKKwkJY2xlYW5lci5ydW4oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL1J1c3NpYURhdGFDbGVhbmluZ0hlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9SdXNzaWFEYXRhQ2xlYW5pbmdIZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTdlZTkzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9SdXNzaWFEYXRhQ2xlYW5pbmdIZWFkZXIuamF2YQpAQCAtMCwwICsxLDY0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiAKKyAqIFJlbGV2YW50IGtleXMgdG8gdGhlIFJ1c3NpYW4gZGF0YXNldC4gS2V5cyBpbiB0aGlzIGNsYXNzIGFyZSB1c2VkIGR1cmluZyB0aGUKKyAqIGRhdGEgY2xlYW5pbmcgcHJvY2VzcyB0byBleHRyYWN0IG9ubHkgdGhlIHJlbGV2YW50IGtleXMgZnJvbSB0aGUgb3JpZ2luYWwKKyAqIGRhdGEgc291cmNlIGZpbGUgZm9yIFJ1c3NpYS4gVGhlc2Uga2V5cyBhcmUgdXNlZCB3aGVuIHJ1bm5pbmcgYW4gaW5zdGFuY2Ugb2YKKyAqIFJ1c3NpYURhdGFDbGVhbmVyIHRvIHBlcmZvcm0gZGF0YSBjbGVhbmluZy4KKyAqIAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUnVzc2lhRGF0YUNsZWFuaW5nSGVhZGVyIHsKKworCS8qKgorCSAqIEFkbWluaXN0cmF0aW9uIElEIChudW1lcmljKQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEID0gNDsKKworCS8qKgorCSAqIFRvdGFsIEFyZWEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUkVBID0gNTsKKwkKKwkvKioKKwkgKiBDb3VudHJ5IGlkZW50aWZpZXIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1VOVFJZID0gOTsKKworCS8qKgorCSAqIExvY2F0aW9uIG5hbWUgMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUUxID0gMTA7CisKKwkvKioKKwkgKiBMb2NhdGlvbiBuYW1lIDIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FMiA9IDExOworCisJLyoqCisJICogTG9jYXRpb24gbmFtZSAzCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRTMgPSAxMjsKKworCS8qKgorCSAqIFBvcHVsYXRpb24gdmFsdWUgKGVzdGltYXRlZCBwb3B1bGF0aW9uIGZvciAxOTk1KQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUDEgPSAxNDsKKworCS8qKgorCSAqIFBvcHVsYXRpb24gdmFsdWUgKGNvbmNyZXRlIHBvcHVsYXRpb24pCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9QMiA9IDE2OworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9SdXNzaWFEYXRhQ29udmVydGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL1J1c3NpYURhdGFDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTg3MzM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9SdXNzaWFEYXRhQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSw0MDIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIENvbnZlcnQgYSBkYXRhIGZpbGUgdGhhdCBjb21lcyBpbnRvIHRoZSBmb3JtYXQgVU4gUnVzc2lhIDoKKyAqIGh0dHA6Ly93d3cuZ3JpZC51bmVwLmNoL2RhdGEvZGF0YS5waHA/Y2F0ZWdvcnk9aHVtYW5fcmVsYXRlZCBpbnRvIHRoZSBEaXZhCisgKiBmb3JtYXQgdGhhdCB0aGUgZ2VuZXJhdG9ycyBjYW4gaGFuZGxlLiBUaGlzIHdvbnQgZm9ybWF0IGFueSBhcmJpdHJhcnkgZm9ybWF0CisgKiBpbnRvIERpdmEgZm9ybWF0LiBDb252ZXJ0cyBvbmx5IDogVU4gUnVzc2lhIGZvcm1hdCAtPiBEaXZhIGZvcm1hdAorICogCisgKiAKKyAqIFRvIGNvbmZpZ3VyZSwgc2VlIGNvbmZpZ3VyYXRpb24gZmlsZSA6CisgKiBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9SdXNzaWFEYXRhQ29udmVydGVyLmNvbmZpZworICogCisgKiAKKyAqIFRvIHJ1biwgYWRkIHBhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlIGluIHRoZSBydW4gcHJvZmlsZSAoaS5lLgorICogQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxjb25maWd1cmF0aW9uXFJ1c3NpYURhdGFDb252ZXJ0ZXIuY29uZmlnKQorICogCisgKiBBZGQgdGhlIGZvbGxvd2luZyB2YWx1ZXMgdG8gdGhlIHJ1biBjb25maWd1cmF0aW9uOgorICogCisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRcSVNPMzE2Ni0xXElTTzMxNjZfMV9lbi50eHQKKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxwcm9wZXJ0aWVzXEV1cm9wZU5hbWVzLnR4dAorICogQzpcc3RlbUlJXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXGlucHV0XHByb3BlcnRpZXNcRXVyb3BlQ291bnRyaWVzLnR4dAorICogQzpcZGl2YVxFdXJvcGVcICogT3ZlcnZpZXcgb2YgdGhlIGRhdGEgZ2VuZXJhdGlvbiBwcm9jZXNzIGZvciB0aGUgUnVzc2lhIGRhdGEKKyAqIHNldC4KKyAqIAorICogMSkgRGF0YSBDbGVhbmluZyA6IHN0YXJ0IGJ5IHJ1bm5pbmcgUnVzc2lhRGF0YUNsZWFuZXIuIFRoaXMgcHJvZ3JhbSB3aWxsCisgKiByZW1vdmUgYWxsIHVubmVjZXNhcnkgZGF0YSAoaS5lLiBjb2x1bW5zKSBpbiB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUuIEluCisgKiBhZGRpdGlvbiwgdGhpcyBwcm9ncmFtIHdpbGwgZ3JvdXAgdGhlIGRhdGEgYmFzZWQgb24gaXRzIElEIChpLmUuIE5PLElULEZSLFVLLAorICogZXRjKS4gVGhlIHJlc3VsdCB3aWxsIGJlIGEgZmlsZSBuYW1lZCBSdXNzaWFTb3J0ZWQudHh0IHdpdGggY2xlYW5lZCBkYXRhLgorICogCisgKiBJbiBvdGhlciB3b3JkcyA6IFJ1c3NpYS50eHQgLS0+IHx8UnVzc2lhRGF0YUNsZWFuZXJ8fCAtLT4gUnVzc2lhU29ydGVkLnR4dAorICogCisgKiBOT1RFOiBSdXNzaWFTb3J0ZWQudHh0IHdpbGwgYmUgdXNlZCBhcyB0aGUgaW5wdXQgZm9yIHRoZSByZW1haW5pbmcgcGFydCBvZgorICogdGhlIHByb2Nlc3MuCisgKiAKKyAqIAorICogMikgRGF0YSBDb252ZXJ0ZXIgOiBydW4gUnVzc2lhRGF0YUNvbnZlcnRlciB0byBjb252ZXJ0IGZpbGUgaW4gY2xlYW5lZCBmb3JtYXQKKyAqIGludG8gRGl2YSBmb3JtYXQuIFByb2Nlc3MgOiBSdXNzaWFTb3J0ZWQudHh0IC0tPiB8fFJ1c3NpYURhdGFDb252ZXJ0ZXJ8fCAtLT4KKyAqIFJ1c3NpYS50eHQKKyAqIAorICogCisgKiAzKSBBcmVhIGFuZCBQb3B1bGF0aW9uIERhdGEgRXh0cmFjdGlvbiA6IHJ1biBSdXNzaWFEYXRhRXh0cmFjdG9yIHRvIGV4dHJhY3QKKyAqIGFyZWEgYW5kIHBvcHVsYXRpb24gZGF0YSBvciBhbGwgYWRtaW5pc3RyYXRpb25zIGluIFJ1c3NpYS4KKyAqIAorICogCisgKi8KKworcHVibGljIGNsYXNzIFJ1c3NpYURhdGFDb252ZXJ0ZXIgeworCisJLyoqCisJICogT3VyIHNvdXJjZSBmaWxlcyBmb3IgSVNPIDMxNjYtMSBjb2RlcyBhbmQgZm9yIHRoZSBsaXN0IG9mIHRhcmdldAorCSAqIGNvdW50cmllcy4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBpc28zMTY2XzEgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0RmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBvdXRwdXREaXIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgd29ya3NwYWNlID0gbnVsbDsKKworCS8qKgorCSAqIExpc3QgZm9yIElTTyAzMTY2LTEgY29kZXMgYW5kIHRhcmdldCBjb3VudHJpZXMuCisJICovCisKKwlMaXN0IHRhcmdldExpc3QgPSBudWxsOworCisJTGlzdCBjb2RlTGlzdCA9IG51bGw7CisKKwlMaXN0IGRhdGFMaXN0ID0gbnVsbDsKKworCS8qKgorCSAqIEFuIGluZGV4IHRvIGNvdW50IHRoZSBudW1iZXIgb2YgdW5uYW1lZCBlbnRyaWVzIGluIHRoZSBkYXRhIHNldC4KKwkgKi8KKwlpbnQgdW5rQ291bnRlciA9IDE7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqIAorCSAqIEBwYXJhbSBpc28zMTY2XzEgLQorCSAqICAgICAgICAgICAgZGF0YSBmaWxlIHdpdGggdGhlIElTTzMxNjYtMSBBTFBIQV8yIGFuZCBBTFBIQV8zIGNvZGVzLgorCSAqIEBwYXJhbSB0YXJnZXRGaWxlIC0KKwkgKiAgICAgICAgICAgIGxpc3Qgb2YgdGFyZ2V0IGNvdW50cmllcworCSAqIEBwYXJhbSBvdXRwdXREaXIgLQorCSAqICAgICAgICAgICAgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlcyBnZW5lcmF0ZWQuCisJICogCisJICovCisJLy8gcHVibGljIFJ1c3NpYURhdGFDb252ZXJ0ZXIoU3RyaW5nIGlzbzMxNjZfMSwgLyogU3RyaW5nIG5hbWVzRmlsZSwgKi8KKwkvLyBTdHJpbmcgdGFyZ2V0RmlsZSwgU3RyaW5nIG91dHB1dERpcikgeworCS8vIC8vIFNldCB2YWx1ZXMgb2YgZ2xvYmFsIHZhcmlhYmxlcy4KKwkvLyB0aGlzLmlzbzMxNjZfMSA9IGlzbzMxNjZfMTsKKwkvLyB0aGlzLnRhcmdldEZpbGUgPSB0YXJnZXRGaWxlOworCS8vIHRoaXMub3V0cHV0RGlyID0gb3V0cHV0RGlyOworCS8vIHRhcmdldExpc3QgPSBudWxsOworCS8vIH0KKwkvKioKKwkgKiBAcGFyYW0gY29uZmlnRmlsZQorCSAqLworCXB1YmxpYyBSdXNzaWFEYXRhQ29udmVydGVyKFN0cmluZyBjb25maWdGaWxlKSB7CisKKwkJLy8gTG9hZCBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKKwkJSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFycyA9IEdlblV0aWxzLmxvYWRDb25maWdGaWxlKGNvbmZpZ0ZpbGUpOworCisJCVNldDxTdHJpbmc+IGtleXMgPSB2YXJzLmtleVNldCgpOworCQlJdGVyYXRvciBpdCA9IGtleXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJU3RyaW5nIHZhciA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKworCQkJLy8gQXNzaWduIHZhbHVlcyB0byBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyA6CisJCQlpZiAodmFyLmVxdWFscygiV09SS1NQQUNFIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXdvcmtzcGFjZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIklTTzMxNjZfMSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpc28zMTY2XzEgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJUQVJHRVRfTElTVCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl0YXJnZXRGaWxlID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiT1VUUFVUIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCW91dHB1dERpciA9IHZhcnMuZ2V0KHZhcik7CisJCQl9CisKKwkJfSAvLyB3aGlsZQorCisJCS8vIFRoZSB3b3Jrc3BhY2UgdmFyaWFibGUgc2hvdWxkIGVuZCB3aXRoIGEgc2xhc2ggY2hhcmFjdGVyCisJCWlmICh3b3Jrc3BhY2UuZW5kc1dpdGgoIlxcIikgPT0gZmFsc2UpIHsgLy8kTk9OLU5MUy0xJAorCQkJd29ya3NwYWNlICs9ICJcXCI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCVN0cmluZyBwYXRoID0gd29ya3NwYWNlICsgR2VuQ29uc3RhbnRzLlBBUkFNU19ESVI7CisKKwkJLy8gU2V0IHJlbWFpbmluZyBjb25maWcgdmFycyB1c2luZyBXT1JLU1BBQ0UgKHdvcmtzcGFjZSByZWxhdGl2ZSkKKwkJaWYgKGlzbzMxNjZfMSA9PSBudWxsKSB7CisJCQlpc28zMTY2XzEgPSBwYXRoICsgR2VuQ29uc3RhbnRzLklTTzMxNjZfMV9GSUxFOworCQl9CisJCWlmICh0YXJnZXRGaWxlID09IG51bGwpIHsKKwkJCXRhcmdldEZpbGUgPSBwYXRoICsgR2VuQ29uc3RhbnRzLkVVUk9QRV9DT1VOVFJJRVM7CisJCX0KKwkJaWYgKG91dHB1dERpciA9PSBudWxsKSB7CisJCQlvdXRwdXREaXIgPSBHZW5Db25zdGFudHMuRFVNTVlfRElSOworCQl9CisKKwkJdGFyZ2V0TGlzdCA9IG51bGw7CisKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBzZXRzIHVwIGFuZCBydW5zIHRoaXMgZ2VuZXJhdG9yLgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBjb3VudHJpZXMgd2Ugd2FudC4KKwkJdGFyZ2V0TGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdCh0YXJnZXRGaWxlKTsKKworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIElTTzMxNjYtMSBBTFBIQTIsIEFMUEhBMywgYW5kCisJCS8vIG51bWVyaWMgY29kZXMuCisJCWNvZGVMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KGlzbzMxNjZfMSk7CisKKwkJLy8gUnVuIHRoZSBjb252ZXJ0ZXI6IFVOIFJ1c3NpYSAtPiBEaXZhIHNldCBmb3JtYXQKKwkJcHJvY2VzcygpOworCX0KKworCS8qKgorCSAqIENvbnZlcnQgYSBkYXRhIGZpbGUgdGhhdCBjb21lcyBpbnRvIHRoZSBmb3JtYXQgVU4gUnVzc2lhIDoKKwkgKiBodHRwOi8vd3d3LmdyaWQudW5lcC5jaC9kYXRhL2RhdGEucGhwP2NhdGVnb3J5PWh1bWFuX3JlbGF0ZWQgaW50byB0aGUKKwkgKiBEaXZhIGZvcm1hdCB0aGF0IHRoZSBnZW5lcmF0b3JzIGNhbiBoYW5kbGUuIFRoaXMgd29udCBmb3JtYXQgYW55CisJICogYXJiaXRyYXJ5IGZvcm1hdCBpbnRvIERpdmEgZm9ybWF0LiBDb252ZXJ0cyBvbmx5IDogVU4gUnVzc2lhYW4gZm9ybWF0IC0+CisJICogRGl2YSBmb3JtYXQKKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzKCkgeworCisJCS8vIEEgd3JpdGVyIGZvciB0aGUgbmV3IGZpbGUgd2UgYXJlIGNyZWF0aW5nLgorCQlQcmludFdyaXRlciBkaXZhRmlsZSA9IG51bGw7CisKKwkJLy8gT2JqZWN0IGhvbGRpbmcgSVNPMzE2Ni0xIHJlbGF0ZWQgZGF0YS4KKwkJSVNPQ29kZTEgaXNvQ29kZSA9IG51bGw7CisKKwkJLy8gTmFtZSBvZiB0aGUgbmV3IHByb3BlcnRpZXMgZmlsZS4KKwkJU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKKworCQlpbnQgc2l6ZSA9IHRhcmdldExpc3Quc2l6ZSgpOworCisJCS8vIEZvciBldmVyeSBjb3VudHJ5CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisKKwkJCS8vIEdldCB0aGUgbmV4dCBmaWxlIGluIHRoZSBsaXN0LgorCQkJU3RyaW5nIGZpbGUgPSAoKFN0cmluZykgdGFyZ2V0TGlzdC5nZXQoaSkpLnRyaW0oKTsKKworCQkJLy8gT3BlbiB0aGUgZGF0YSBzb3VyY2UgZmlsZSBmb3IgdGhpcyBjb3VudHJ5LgorCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gR2VuVXRpbHMub3BlblJlYWRlcihmaWxlKTsKKwkJCVN5c3RlbS5vdXQKKwkJCQkJLnByaW50bG4oIlx0XHQ8PDw8IFJVU1NJQSBEQVRBIENPTlZFUlRFUiAtLSBQcm9jZXNzaW5nIENvdW50cnkgOiAiICsgZmlsZSArICIgPj4+PiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCisJCQl0cnkgeworCisJCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7CisKKwkJCQkJU3RyaW5nIGJ1ZmZlciA9IG51bGw7CisKKwkJCQkJd2hpbGUgKEdlblV0aWxzLkVPRihidWZmZXIgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gdHJ1ZSkgeworCisJCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBtYXJrIGFsbCB1bmtub3duIGRhdGEuCisJCQkJCQlidWZmZXIgPSBidWZmZXIucmVwbGFjZSgiLCwiLCAiLFVOS05PV04sIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQkJCQlTdHJpbmdbXSBpdGVtcyA9IGJ1ZmZlci5zcGxpdCgiLCIpOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCS8vIEdldCB0aGUgSVNPMzE2Ni0xIGluZm8gZm9yIHRoaXMgY291bnRyeQorCQkJCQkJaWYgKGlzb0NvZGUgPT0gbnVsbCkgeworCQkJCQkJCVN0cmluZyBjb3VudHJ5ID0gR2VuVXRpbHMuZ2V0Q291bnRyeU5hbWUoCisJCQkJCQkJCQlpdGVtc1tSdXNzaWFEYXRhRm9ybWF0dGluZ0hlYWRlci5DT1VOVFJZXQorCQkJCQkJCQkJCQkuc3Vic3RyaW5nKDAsIDIpLCBjb2RlTGlzdCk7CisJCQkJCQkJaXNvQ29kZSA9IEdlblV0aWxzLmdldElTT0NvZGUoY291bnRyeSwgY29kZUxpc3QpOworCQkJCQkJfQorCisJCQkJCQkvLyBJZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IGZvciB0aGlzIGNvdW50cnksCisJCQkJCQkvLyBjcmVhdGUgaXQgdXNpbmcgSVNPIGFscGhhMyBjb2RlLgorCQkJCQkJRmlsZSBjb3VudHJ5RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyCisJCQkJCQkJCSsgaXNvQ29kZS5nZXROYW1lKCkpOworCisJCQkJCQlpZiAoY291bnRyeURpciAhPSBudWxsICYmIGNvdW50cnlEaXIuZXhpc3RzKCkgPT0gZmFsc2UpIHsKKwkJCQkJCQkvLyBEaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuIENyZWF0ZSBpdC4KKwkJCQkJCQljb3VudHJ5RGlyLm1rZGlyKCk7CisJCQkJCQl9CisKKwkJCQkJCS8vIENyZWF0ZSBhbmQgb3BlbiB0aGUgbmV3IG91dHB1dCBmaWxlLgorCQkJCQkJaWYgKGRpdmFGaWxlID09IG51bGwpIHsKKwkJCQkJCQkvLyBDcmVhdGUgdGhlIGZpbGUgbmFtZQorCQkJCQkJCWZpbGVOYW1lID0gY291bnRyeURpciArICJcXCIgKyBpc29Db2RlLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkrICIudHh0IjsgLy8kTk9OLU5MUy0xJAorCisJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0RmlsZW5hbWUgID0gIiArIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJCQkJLy8gQ3JlYXRlIHRuZSBuZXcgZmlsZQorCQkJCQkJCWRpdmFGaWxlID0gR2VuVXRpbHMub3BlbldyaXRlcihmaWxlTmFtZSk7CisJCQkJCQl9CisKKwkJCQkJCS8vIEFwcGx5IHRoZSBmb3JtYXR0aW5nIHRvIHRoZSBjdXJyZW50IGJ1ZmZlciA6IFVOCisJCQkJCQkvLyBSdXNzaWEgLT4gRGl2YSBmb3JtYXQKKwkJCQkJCVN0cmluZyBkaXZhTGluZSA9IGNvbnZlcnQyRGl2YShpc29Db2RlLCBpdGVtcyk7CisKKwkJCQkJCS8vIFdyaXRlIHRoZSBjb252ZXJ0ZWQgbGluZQorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0RGl2YSBzdHJpbmcgPSAiICsgZGl2YUxpbmUpOyAvLyROT04tTkxTLTEkCisJCQkJCQlHZW5VdGlscy5hZGREYXRhKGRpdmFGaWxlLCBkaXZhTGluZSk7CisKKwkJCQkJfS8vIHdoaWxlCisKKwkJCQkJLy8gUmVzZXQgSVNPIENvZGUKKwkJCQkJaXNvQ29kZSA9IG51bGw7CisKKwkJCQkJLy8gUmVzZXQgZmlsZSBuYW1lCisJCQkJCWZpbGVOYW1lID0gbnVsbDsKKworCQkJCQkvLyBDbG9zZSB0aGUgdGFyZ2V0IGZpbGUuCisJCQkJCWRpdmFGaWxlLmNsb3NlKCk7CisJCQkJCWRpdmFGaWxlID0gbnVsbDsKKworCQkJCQkvLyBDbG9zZSBhbGwgb3BlbiByZXNvdXJjZXMuCisJCQkJCXJlYWRlci5jbG9zZSgpOworCisJCQkJCS8vIFJ1biBnYXJiYWdlIGNvbGxlY3Rpb24KKwkJCQkJLy9TeXN0ZW0uZ2MoKTsKKworCQkJCX0KKworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisKKwkJfSAvLyBmb3IKKworCX0KKworCS8qKgorCSAqIENvbnZlcnQgdGhlIGJ1ZmZlciBnaXZlbiBpbiBVTiBSdXNzaWEgZm9ybWF0IGludG8gRGl2YSBmb3JtYXQKKwkgKiAKKwkgKiBAcGFyYW0gaXNvQ29kZQorCSAqICAgICAgICAgICAgSVNPIDMxNjYtMSBjb2RlCisJICogCisJICogQHBhcmFtIGRhdGEKKwkgKiAgICAgICAgICAgIGEgYnVmZmVyIHdpdGggZGF0YSBvbiBVTiBSdXNzaWEgZm9ybWF0CisJICogCisJICogQHJldHVybiBjb252ZXJ0ZWQgc3RyaW5nCisJICogCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0MkRpdmEoSVNPQ29kZTEgaXNvQ29kZSwgU3RyaW5nW10gZGF0YSkgeworCisJCS8vIElELEFSRUEsQ09VTlRSWV9DT0RFLE5BTUUxLE5BTUUyLE5BTUUzLFBPUDEsUE9QMiw8Li4ucG9seWdvbiBkYXRhLi4uPgorCisJCS8vIDEuMCwyLjk3ODk5OTlFKzAyLFJVUyxVTktOT1dOLFVOS05PV04sVU5LTk9XTiwwLjAsMC4wLDwuLi5wb2x5Z29uCisJCS8vIGRhdGEuLi4+CisKKwkJLy8gPEFMUEhBMyxDT1VOVFJZX05BTUUsQURNSU4xLDwuLi5wb2x5Z29uIGRhdGEuLi4+CisKKwkJLy8gQUdPLEFuZ29sYSxMdWFuZGEsPC4uLnBvbHlnb24gZGF0YS4uLj4KKworCQkvLyBUaGUgZm9ybWF0dGVkIHByZWZpeCBzdHJpbmcKKwkJU3RyaW5nIGRpdmFTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEdldCByZWxldmFudCBkYXRhIGZvciBjb252ZXJzaW9uLgorCQlTdHJpbmcgYWxwaGEyID0gaXNvQ29kZS5nZXRBbHBoYTIoKTsKKwkJU3RyaW5nIGFscGhhMyA9IGlzb0NvZGUuZ2V0QWxwaGEzKCk7CisKKwkJU3RyaW5nIGxvY2F0aW9uX25hbWUgPSBudWxsOworCisJCWlmIChkYXRhW1J1c3NpYURhdGFGb3JtYXR0aW5nSGVhZGVyLk5BTUUzXS5lcXVhbHMoIlVOS05PV04iKSB8fCBkYXRhW1J1c3NpYURhdGFGb3JtYXR0aW5nSGVhZGVyLk5BTUUzXS5lcXVhbHMoIm4uYS4iKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCS8vIElmIHRoaXMgaXMgYW4gdW5uYW1lZCBsb2NhdGlvbiwgdGhlbiB3ZSB1c2Ugb3VyIGNvbnZlbmF0aW9uIGZvcgorCQkJLy8gbmFtaW5nIHVubmFtZWQgbG9jYXRpb25zIDoKKwkJCS8vIDxBTFBIQTJfQ09ERT4tVU5LLTxVTktOT1dOX0NPVU5URVJfVkFMVUU+CisJCQlsb2NhdGlvbl9uYW1lID0gaXNvQ29kZS5nZXRBbHBoYTIoKSArICItVU5LLSIgLy8kTk9OLU5MUy0xJAorCQkJCQkrIFN0cmluZy52YWx1ZU9mKHVua0NvdW50ZXIrKyk7CisJCX0gZWxzZSB7CisJCQkvLyBUaGUgbG9jYXRpb24gbmFtZSBpcyBhIGNvbmNhdGVuYXRpb24gb2YgdGhlIGxldmVsIDIKKwkJCS8vIGFkbWluaXN0cmF0aW9uIChOQU1FMykgYW5kIHRoZSBsZXZlbCAxIGNvbnRhaW5lcgorCQkJLy8gKE5BTUUyKS4gV2UgaWdub3JlIHRoZSBsZXZlbCAwIGNvbnRhaW5lciAoTkFNRTEpLgorCQkJbG9jYXRpb25fbmFtZSA9IGRhdGFbUnVzc2lhRGF0YUZvcm1hdHRpbmdIZWFkZXIuTkFNRTJdICsgIjsiIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyBkYXRhW1J1c3NpYURhdGFGb3JtYXR0aW5nSGVhZGVyLk5BTUUzXTsKKwkJfQorCisJCS8vIEZpbmQgdGhlIGNvdW50cnkgbmFtZSBiYXNlZCBvbiB0aGUgYWxwaGEgMiBjb2RlLgorCQlTdHJpbmcgY291bnRyeV9uYW1lID0gR2VuVXRpbHMuZ2V0Q291bnRyeU5hbWUoYWxwaGEyLCBjb2RlTGlzdCk7CisKKwkJLy8gR2V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGJ1ZmZlcgorCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGg7CisKKwkJLy8gQWRkIGZpeGVkIGRhdGEgd2UgYWxyZWFkeSBoYXZlIGF2YWlsYWJsZSA6CisJCWRpdmFTdHJpbmcgPSBhbHBoYTMgKyAiLCIgKyBjb3VudHJ5X25hbWUgKyAiLCIgKyBsb2NhdGlvbl9uYW1lOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkvLyBDb25jYXRlbmF0ZSBwb2x5Z29uIGRhdGEgLS0gaWdub3JlIHRoZSBmaXJzdCBlaWdodCBpdGVtcworCQkvLyB3aGljaCBhcmUgbm9uLXBvbHlnb24gZGF0YSA6CisJCS8vIElELEFSRUEsQ09VTlRSWSxOQU1FMSxOQU1FMixOQU1FMyxQT1AxLFBPUDIKKwkJZm9yIChpbnQgaSA9IDg7IGkgPCBsZW5ndGg7IGkrKykgeworCisJCQlkaXZhU3RyaW5nICs9ICIsIiArIGRhdGFbaV07IC8vJE5PTi1OTFMtMSQKKworCQl9IC8vIGZvcgorCisJCS8vIEZpbmFsbHkgYWRkIGEgbmV3IGxpbmUgdG8gdGhlIHN0cmluZy4KKwkJZGl2YVN0cmluZyArPSAiXG4iOyAvLyROT04tTkxTLTEkCisKKwkJcmV0dXJuIGRpdmFTdHJpbmc7CisJfQorCisJLyoqCisJICogTWFpbiBleGVjdXRpb24gZW50cnkgcG9pbnQuCisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCS8vIGZpbmFsIGludCBJU09fMzE2Nl8xID0gMDsKKwkJLy8gZmluYWwgaW50IFRBUkdFVF9MSVNUID0gMTsKKwkJLy8gZmluYWwgaW50IE9VVFBVVF9ESVIgPSAyOworCQkvLyBmaW5hbCBpbnQgUEFSQU1TID0gMzsKKwkJLy8KKwkJLy8gaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQKKwkJLy8gLnByaW50bG4oIlx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyA6ICIpOworCQkvLyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBJU08gMzE2Ni0xIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgVGFyZ2V0IGNvdW50cmllcyBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IE91dHB1dCBkaXJlY3RvcnkiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyByZXR1cm47CisJCS8vIH0KKwkJLy8KKwkJLy8gUnVzc2lhRGF0YUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgUnVzc2lhRGF0YUNvbnZlcnRlcigKKwkJLy8gYXJnc1tJU09fMzE2Nl8xXSwgLyogYXJnc1tSdXNzaWFfTkFNRVNdLCAqL2FyZ3NbVEFSR0VUX0xJU1RdLAorCQkvLyBhcmdzW09VVFBVVF9ESVJdKTsKKwkJLy8gY29udmVydGVyLnJ1bigpOworCisJCWZpbmFsIGludCBDT05GSUdfRklMRSA9IDA7CisJCWZpbmFsIGludCBQQVJBTVMgPSAxOworCisJCWlmIChhcmdzLmxlbmd0aCA8IFBBUkFNUykgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0LS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJcdFx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50KHMpIDogIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0IENvbmZpZ3VyYXRpb24gZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJfQorCisJCVJ1c3NpYURhdGFDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IFJ1c3NpYURhdGFDb252ZXJ0ZXIoCisJCQkJYXJnc1tDT05GSUdfRklMRV0pOworCQljb252ZXJ0ZXIucnVuKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL1J1c3NpYURhdGFFeHRyYWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvUnVzc2lhRGF0YUV4dHJhY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Yzg4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL1J1c3NpYURhdGFFeHRyYWN0b3IuamF2YQpAQCAtMCwwICsxLDQxOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VuZXJhdG9yczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHdpbGwgZXh0cmFjdCBhcmVhIGFuZCBwb3B1bGF0aW9uIGRhdGEgZnJvbSB0aGUgUnVzc2lhbiBVTiBkYXRhCisgKiBzb3VyY2UgZmlsZSAoUnVzc2lhU29ydGVkLnR4dCkuIEl0IHdpbGwgZ2VuZXJhdGUgYm90aCBhbmQgQVJFQSBhbmQgUE9QVUxBVElPTgorICogZmlsZXMgdW5kZXIKKyAqIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxkYXRhTWlncmF0aW9uXGlucHV0XEFyZWFQb3B1bGF0aW9uRGF0YS4KKyAqIAorICogCisgKiBUbyBjb25maWd1cmUsIHNlZSBjb25maWd1cmF0aW9uIGZpbGUgOgorICogb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L2NvbmZpZ3VyYXRpb24vUnVzc2lhRGF0YUV4dHJhY3Rvci5jb25maWcKKyAqIAorICogCisgKiBUbyBydW4sIGFkZCBwYXRoIHRvIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiB0aGUgcnVuIHByb2ZpbGUgKGkuZS4KKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcY29uZmlndXJhdGlvblxSdXNzaWFEYXRhRXh0cmFjdG9yLmNvbmZpZykKKyAqIAorICogRiBBZGQgdGhlIGZvbGxvd2luZyB2YWx1ZXMgdG8gdGhlIHJ1biBjb25maWd1cmF0aW9uOgorICogCisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRcSVNPMzE2Ni0xXElTTzMxNjZfMV9lbi50eHQKKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxwcm9wZXJ0aWVzXEV1cm9wZUNvdW50cmllcy50eHQKKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxBcmVhUG9wdWxhdGlvbkRhdGFcCisgKiAKKyAqIE92ZXJ2aWV3IG9mIHRoZSBkYXRhIGdlbmVyYXRpb24gcHJvY2VzcyBmb3IgdGhlIEV1cm9wZSBkYXRhIHNldC4gKiBPdmVydmlldworICogb2YgdGhlIGRhdGEgZ2VuZXJhdGlvbiBwcm9jZXNzIGZvciB0aGUgUnVzc2lhIGRhdGEgc2V0LgorICogCisgKiAxKSBEYXRhIENsZWFuaW5nIDogc3RhcnQgYnkgcnVubmluZyBSdXNzaWFEYXRhQ2xlYW5lci4gVGhpcyBwcm9ncmFtIHdpbGwKKyAqIHJlbW92ZSBhbGwgdW5uZWNlc2FyeSBkYXRhIChpLmUuIGNvbHVtbnMpIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gSW4KKyAqIGFkZGl0aW9uLCB0aGlzIHByb2dyYW0gd2lsbCBncm91cCB0aGUgZGF0YSBiYXNlZCBvbiBpdHMgSUQgKGkuZS4gTk8sSVQsRlIsVUssCisgKiBldGMpLiBUaGUgcmVzdWx0IHdpbGwgYmUgYSBmaWxlIG5hbWVkIFJ1c3NpYVNvcnRlZC50eHQgd2l0aCBjbGVhbmVkIGRhdGEuCisgKiAKKyAqIEluIG90aGVyIHdvcmRzIDogUnVzc2lhLnR4dCAtLT4gfHxSdXNzaWFEYXRhQ2xlYW5lcnx8IC0tPiBSdXNzaWFTb3J0ZWQudHh0CisgKiAKKyAqIE5PVEU6IFJ1c3NpYVNvcnRlZC50eHQgd2lsbCBiZSB1c2VkIGFzIHRoZSBpbnB1dCBmb3IgdGhlIHJlbWFpbmluZyBwYXJ0IG9mCisgKiB0aGUgcHJvY2Vzcy4KKyAqIAorICogCisgKiAyKSBEYXRhIENvbnZlcnRlciA6IHJ1biBSdXNzaWFEYXRhQ29udmVydGVyIHRvIGNvbnZlcnQgZmlsZSBpbiBjbGVhbmVkIGZvcm1hdAorICogaW50byBEaXZhIGZvcm1hdC4KKyAqIAorICogCisgKiAzKSBBcmVhIGFuZCBQb3B1bGF0aW9uIERhdGEgRXh0cmFjdGlvbiA6IHJ1biBSdXNzaWFEYXRhRXh0cmFjdG9yIHRvIGV4dHJhY3QKKyAqIGFyZWEgYW5kIHBvcHVsYXRpb24gZGF0YSBvZiBhbGwgUnVzc2lhbiBhZG1pbmlzdHJhdGlvbnMuCisgKiAKKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBSdXNzaWFEYXRhRXh0cmFjdG9yIHsKKworCS8qKgorCSAqIE91ciBzb3VyY2UgZmlsZXMgZm9yIElTTyAzMTY2LTEgY29kZXMgYW5kIGZvciB0aGUgbGlzdCBvZiB0YXJnZXQKKwkgKiBjb3VudHJpZXMuCisJICovCisJcHJpdmF0ZSBTdHJpbmcgaXNvMzE2Nl8xID0gbnVsbDsKKworCS8vIHByaXZhdGUgU3RyaW5nIG5hbWVzRmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyB0YXJnZXRGaWxlID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIG91dHB1dERpciA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyB3b3Jrc3BhY2UgPSBudWxsOworCisJLyoqCisJICogTGlzdCBmb3IgSVNPIDMxNjYtMSBjb2RlcyBhbmQgdGFyZ2V0IGNvdW50cmllcy4KKwkgKi8KKworCUxpc3QgdGFyZ2V0TGlzdCA9IG51bGw7CisKKwlMaXN0IGNvZGVMaXN0ID0gbnVsbDsKKworCUxpc3QgZGF0YUxpc3QgPSBudWxsOworCisJLy8gTGlzdCBuYW1lc0xpc3QgPSBudWxsOworCisJLyoqCisJICogQW4gaW5kZXggdG8gY291bnQgdGhlIG51bWJlciBvZiB1bm5hbWVkIGVudHJpZXMgaW4gdGhlIGRhdGEgc2V0LgorCSAqLworCWludCB1bmtDb3VudGVyID0gMTsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICogCisJICogQHBhcmFtIGlzbzMxNjZfMSAtCisJICogICAgICAgICAgICBkYXRhIGZpbGUgd2l0aCB0aGUgSVNPMzE2Ni0xIEFMUEhBXzIgYW5kIEFMUEhBXzMgY29kZXMuCisJICogQHBhcmFtIHRhcmdldEZpbGUgLQorCSAqICAgICAgICAgICAgZGF0YSBmaWxlIHdoZXJlIHdlIGZpbmQgYSBsaXN0IG9mIGNvdW50cmllcyBmb3IgZ2VuZXJhdGlvbiBvZgorCSAqICAgICAgICAgICAgdGhlaXIgY29ycmVzcG9uZGluZyBhcmVhLnByb3BlcnRpZXMgZmlsZXMuCisJICogQHBhcmFtIG91dHB1dERpciAtCisJICogICAgICAgICAgICB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIGZpbGVzIGdlbmVyYXRlZC4KKwkgKiAKKwkgKi8KKwkvLyBwdWJsaWMgUnVzc2lhRGF0YUV4dHJhY3RvcihTdHJpbmcgaXNvMzE2Nl8xLC8qIFN0cmluZyBuYW1lc0ZpbGUsICovCisJLy8gU3RyaW5nIHRhcmdldEZpbGUsIFN0cmluZyBvdXRwdXREaXIpIHsKKwkvLyAvLyBTZXQgdmFsdWVzIG9mIGdsb2JhbCB2YXJpYWJsZXMuCisJLy8gdGhpcy5pc28zMTY2XzEgPSBpc28zMTY2XzE7CisJLy8gLy8gdGhpcy5uYW1lc0ZpbGUgPSBuYW1lc0ZpbGU7CisJLy8gdGhpcy50YXJnZXRGaWxlID0gdGFyZ2V0RmlsZTsKKwkvLyB0aGlzLm91dHB1dERpciA9IG91dHB1dERpcjsKKwkvLyB0YXJnZXRMaXN0ID0gbnVsbDsKKwkvLyB9CisJLyoqCisJICogQHBhcmFtIGNvbmZpZ0ZpbGUKKwkgKi8KKwlwdWJsaWMgUnVzc2lhRGF0YUV4dHJhY3RvcihTdHJpbmcgY29uZmlnRmlsZSkgeworCisJCS8vIExvYWQgYWxsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCisJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHZhcnMgPSBHZW5VdGlscy5sb2FkQ29uZmlnRmlsZShjb25maWdGaWxlKTsKKworCQlTZXQ8U3RyaW5nPiBrZXlzID0gdmFycy5rZXlTZXQoKTsKKwkJSXRlcmF0b3IgaXQgPSBrZXlzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyB2YXIgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisKKwkJCS8vIEFzc2lnbiB2YWx1ZXMgdG8gY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgOgorCQkJaWYgKHZhci5lcXVhbHMoIldPUktTUEFDRSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl3b3Jrc3BhY2UgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJJU08zMTY2XzEiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJaXNvMzE2Nl8xID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiVEFSR0VUX0xJU1QiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJdGFyZ2V0RmlsZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIk9VVFBVVCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlvdXRwdXREaXIgPSB2YXJzLmdldCh2YXIpOworCQkJfQorCisJCX0gLy8gd2hpbGUKKworCQkvLyBUaGUgd29ya3NwYWNlIHZhcmlhYmxlIHNob3VsZCBlbmQgd2l0aCBhIHNsYXNoIGNoYXJhY3RlcgorCQlpZiAod29ya3NwYWNlLmVuZHNXaXRoKCJcXCIpID09IGZhbHNlKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXdvcmtzcGFjZSArPSAiXFwiOyAvLyROT04tTkxTLTEkCisJCX0KKworCQlTdHJpbmcgcGF0aCA9IHdvcmtzcGFjZSArIEdlbkNvbnN0YW50cy5QQVJBTVNfRElSOworCisJCS8vIFNldCByZW1haW5pbmcgY29uZmlnIHZhcnMgdXNpbmcgV09SS1NQQUNFICh3b3Jrc3BhY2UgcmVsYXRpdmUpCisJCWlmIChpc28zMTY2XzEgPT0gbnVsbCkgeworCQkJaXNvMzE2Nl8xID0gcGF0aCArIEdlbkNvbnN0YW50cy5JU08zMTY2XzFfRklMRTsKKwkJfQorCQlpZiAodGFyZ2V0RmlsZSA9PSBudWxsKSB7CisJCQl0YXJnZXRGaWxlID0gcGF0aCArIEdlbkNvbnN0YW50cy5FVVJPUEVfQ09VTlRSSUVTOworCQl9CisJCWlmIChvdXRwdXREaXIgPT0gbnVsbCkgeworCQkJb3V0cHV0RGlyID0gR2VuQ29uc3RhbnRzLkRVTU1ZX0RJUjsKKwkJfQorCisJCXRhcmdldExpc3QgPSBudWxsOworCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2V0cyB1cCBhbmQgcnVucyB0aGlzIGdlbmVyYXRvci4KKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgY291bnRyaWVzIHdlIHdhbnQuCisJCXRhcmdldExpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QodGFyZ2V0RmlsZSk7CisKKwkJLy8gUmVhZCBhbmQga2VlcCBpbiBtZW1vcnkgYSBsaXN0IG9mIHRoZSBJU08zMTY2LTEgQUxQSEEyLCBBTFBIQTMsIGFuZAorCQkvLyBudW1lcmljIGNvZGVzLgorCQljb2RlTGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdChpc28zMTY2XzEpOworCisJCS8vIExvYWQgYWxsIGxldmVsIDEgbmFtZXMgZm9yIEV1cm9wZS4KKwkJLy8gbmFtZXNMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KG5hbWVzRmlsZSk7CisKKwkJLy8gUnVuIHRoZSBjb252ZXJ0ZXI6IFVOIEV1cm9wZSAtPiBEaXZhIHNldCBmb3JtYXQKKwkJcHJvY2VzcygpOworCX0KKworCS8qKgorCSAqIAorCSAqIEdlbmVyYXRlIGFyZWEgYW5kIHBvcHVsYXRpb24gZmlsZXMgZnJvbSBkYXRhIGV4dHJhY3RlZCBmcm9tCisJICogRXVyb3BlU29ydGVkLnR4dCBUaGUgYXJlYSBhbmQgcG9wdWxhdGlvbiBmaWxlcyB3aWxsIGJlIHVzZWQgYnkgdGhlCisJICogZ2VuZXJhdG9ycyB0byBwcm9kdWNlIHRoZSBwcm9wZXJ0eSBmaWxlcy4KKwkgKiAKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzKCkgeworCisJCUFycmF5TGlzdDxTdHJpbmc+IHJlcGVhdGVkID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKwkJLy8gQSB3cml0ZXIgZm9yIHRoZSBuZXcgZmlsZSB3ZSBhcmUgY3JlYXRpbmcuCisJCVByaW50V3JpdGVyIGFyZWFGaWxlID0gbnVsbDsKKwkJUHJpbnRXcml0ZXIgcG9wRmlsZSA9IG51bGw7CisKKwkJLy8gT2JqZWN0IGhvbGRpbmcgSVNPMzE2Ni0xIHJlbGF0ZWQgZGF0YS4KKwkJSVNPQ29kZTEgaXNvQ29kZSA9IG51bGw7CisKKwkJLy8gTmFtZSBvZiB0aGUgbmV3IHByb3BlcnRpZXMgZmlsZS4KKwkJU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKKworCQlpbnQgc2l6ZSA9IHRhcmdldExpc3Quc2l6ZSgpOworCisJCS8vIEZvciBldmVyeSBjb3VudHJ5CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisKKwkJCS8vIEdldCB0aGUgbmV4dCBmaWxlIGluIHRoZSBsaXN0LgorCQkJU3RyaW5nIGZpbGUgPSAoKFN0cmluZykgdGFyZ2V0TGlzdC5nZXQoaSkpLnRyaW0oKTsKKworCQkJLy8gT3BlbiB0aGUgZGF0YSBzb3VyY2UgZmlsZSBmb3IgdGhpcyBjb3VudHJ5LgorCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gR2VuVXRpbHMub3BlblJlYWRlcihmaWxlKTsKKwkJCVN5c3RlbS5vdXQKKwkJCQkJLnByaW50bG4oIlx0XHQ8PDw8IFJVU1NJQSBEQVRBIEVYVFJBQ1RPUiAtLSBQcm9jZXNzaW5nIENvdW50cnkgOiAiICsgZmlsZSArICIgPj4+PiIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCisKKwkJCXRyeSB7CisKKwkJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKKworCQkJCQlTdHJpbmcgYnVmZmVyID0gbnVsbDsKKworCQkJCQkvLyBXZSB0YWtlIGEgY2h1bmsgb2YgdGhlIGRhdGEgW0JVRkZFUl9NSU4sQlVGRkVSX01BWF0gdG8KKwkJCQkJLy8gbWFrZSBwcm9jZXNzaW5nIG1vcmUKKwkJCQkJLy8gZWZmaWNpZW50LCB3ZSBkb250IG5lZWQgYWxsIG9mIGl0LgorCQkJCQlpbnQgQlVGRkVSX01JTiA9IDA7CisJCQkJCWludCBCVUZGRVJfTUFYID0gMjAwOworCisJCQkJCXdoaWxlIChHZW5VdGlscy5FT0YoYnVmZmVyID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IHRydWUpIHsKKworCQkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgd2UgbWFyayBhbGwgdW5rbm93biBkYXRhLgorCQkJCQkJYnVmZmVyID0gYnVmZmVyLnJlcGxhY2UoIiwsIiwgIixVTktOT1dOLCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCQkJLy8gVXNlIG9ubHkgcGFydCBvZiB0aGUgYnVmZmVyLCBub3QgYWxsIG9mIGl0IGZvcgorCQkJCQkJLy8gZWZmaWNpZW5jeS4KKwkJCQkJCWludCBtYXggPSAoYnVmZmVyLmxlbmd0aCgpID4gQlVGRkVSX01BWCkgPyBCVUZGRVJfTUFYCisJCQkJCQkJCTogYnVmZmVyLmxlbmd0aCgpOworCQkJCQkJU3RyaW5nW10gaXRlbXMgPSBidWZmZXIuc3Vic3RyaW5nKEJVRkZFUl9NSU4sIG1heCkKKwkJCQkJCQkJLnNwbGl0KCIsIik7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJLy8gR2V0IHRoZSBJU08zMTY2LTEgaW5mbyBmb3IgdGhpcyBjb3VudHJ5CisJCQkJCQlpZiAoaXNvQ29kZSA9PSBudWxsKSB7CisJCQkJCQkJU3RyaW5nIGNvdW50cnkgPSBHZW5VdGlscy5nZXRDb3VudHJ5TmFtZSgKKwkJCQkJCQkJCWl0ZW1zW1J1c3NpYURhdGFGb3JtYXR0aW5nSGVhZGVyLkNPVU5UUlldCisJCQkJCQkJCQkJCS5zdWJzdHJpbmcoMCwgMiksIGNvZGVMaXN0KTsKKwkJCQkJCQlpc29Db2RlID0gR2VuVXRpbHMuZ2V0SVNPQ29kZShjb3VudHJ5LCBjb2RlTGlzdCk7CisJCQkJCQl9CisKKwkJCQkJCS8vIElmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgZm9yIHRoaXMgY291bnRyeSwKKwkJCQkJCS8vIGNyZWF0ZSBpdCB1c2luZyBJU08gYWxwaGEzIGNvZGUuCisJCQkJCQlGaWxlIGNvdW50cnlEaXIgPSBuZXcgRmlsZShvdXRwdXREaXIpOworCisJCQkJCQlpZiAoY291bnRyeURpciAhPSBudWxsICYmIGNvdW50cnlEaXIuZXhpc3RzKCkgPT0gZmFsc2UpIHsKKwkJCQkJCQkvLyBEaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuIENyZWF0ZSBpdC4KKwkJCQkJCQljb3VudHJ5RGlyLm1rZGlyKCk7CisJCQkJCQl9CisKKwkJCQkJCS8vIENyZWF0ZSBhbmQgb3BlbiBhIG5ldyBhcmVhIGZpbGUuCisJCQkJCQlpZiAoYXJlYUZpbGUgPT0gbnVsbCkgeworCQkJCQkJCS8vIENyZWF0ZSB0aGUgZmlsZSBuYW1lCisJCQkJCQkJZmlsZU5hbWUgPSBjb3VudHJ5RGlyICsgIlxcIiArIGlzb0NvZGUuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCSsgIl9BUkVBLnR4dCI7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJCS8vIENyZWF0ZSB0bmUgbmV3IGZpbGUKKwkJCQkJCQlhcmVhRmlsZSA9IEdlblV0aWxzLm9wZW5Xcml0ZXIoZmlsZU5hbWUpOworCQkJCQkJfQorCisJCQkJCQkvLyBTaW1pbGFybHksIGNyZWF0ZSBhbmQgb3BlbiBhIG5ldyBwb3B1bGF0aW9uIGZpbGUuCisJCQkJCQlpZiAocG9wRmlsZSA9PSBudWxsKSB7CisJCQkJCQkJLy8gQ3JlYXRlIHRoZSBmaWxlIG5hbWUKKwkJCQkJCQlmaWxlTmFtZSA9IGNvdW50cnlEaXIgKyAiXFwiICsgaXNvQ29kZS5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJKyAiX1BPUFVMQVRJT04udHh0IjsgLy8kTk9OLU5MUy0xJAorCisJCQkJCQkJLy8gQ3JlYXRlIHRuZSBuZXcgZmlsZQorCQkJCQkJCXBvcEZpbGUgPSBHZW5VdGlscy5vcGVuV3JpdGVyKGZpbGVOYW1lKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gR2V0IHJlbGV2YW50IGRhdGEgZm9yIGNvbnZlcnNpb24uCisKKwkJCQkJCS8vIEV4dHJhY3QgYXJlYSB2YWx1ZQorCQkJCQkJU3RyaW5nIGFyZWEgPSBpdGVtc1tSdXNzaWFEYXRhRm9ybWF0dGluZ0hlYWRlci5BUkVBXTsKKworCQkJCQkJLy8gRXh0cmFjdCBwb3B1bGF0aW9uIHZhbHVlCisJCQkJCQlTdHJpbmcgcG9wMSA9IGl0ZW1zW1J1c3NpYURhdGFGb3JtYXR0aW5nSGVhZGVyLlBPUDFdOworCQkJCQkJU3RyaW5nIHBvcDIgPSBpdGVtc1tSdXNzaWFEYXRhRm9ybWF0dGluZ0hlYWRlci5QT1AyXTsKKworCQkJCQkJLy8gRXh0cmFjdCBsb2NhdGlvbiBpbmZvcm1hdGlvbgorCQkJCQkJU3RyaW5nIG5hbWUyID0gaXRlbXNbUnVzc2lhRGF0YUZvcm1hdHRpbmdIZWFkZXIuTkFNRTJdOworCQkJCQkJU3RyaW5nIG5hbWUzID0gaXRlbXNbUnVzc2lhRGF0YUZvcm1hdHRpbmdIZWFkZXIuTkFNRTNdOworCisJCQkJCQlTdHJpbmcgbG9jYXRpb25fbmFtZSA9IG51bGw7CisKKwkJCQkJCWlmIChuYW1lMy5lcXVhbHMoIlVOS05PV04iKSB8fCBuYW1lMy5lcXVhbHMoIm4uYS4iKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkvLyBJZiB0aGlzIGlzIGFuIHVubmFtZWQgbG9jYXRpb24sIHRoZW4gd2UgdXNlIG91cgorCQkJCQkJCS8vIGNvbnZlbmF0aW9uIGZvcgorCQkJCQkJCS8vIG5hbWluZyB1bm5hbWVkIGxvY2F0aW9ucyA6CisJCQkJCQkJLy8gPEFMUEhBMl9DT0RFPi1VTkstPFVOS05PV05fQ09VTlRFUl9WQUxVRT4KKwkJCQkJCQlsb2NhdGlvbl9uYW1lID0gaXNvQ29kZS5nZXRBbHBoYTIoKSArICItVU5LLSIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJKyBTdHJpbmcudmFsdWVPZih1bmtDb3VudGVyKyspOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBUaGUgbG9jYXRpb24gbmFtZSBpcyBhIGNvbmNhdGVuYXRpb24gb2YgbGV2ZWwgMgorCQkJCQkJCS8vIGFkbWluaXN0cmF0aW9uIChOQU1FMykgYW5kIHRoZSBsZXZlbCAxIGNvbnRhaW5lcgorCQkJCQkJCS8vIChOQU1FMikuIFdlIGlnbm9yZSB0aGUgbGV2ZWwgMCBjb250YWluZXIgKE5BTUUxKS4KKwkJCQkJCQlsb2NhdGlvbl9uYW1lID0gbmFtZTIgKyAiOyIgKyBuYW1lMzsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfQorCisJCQkJCQlpZiAocmVwZWF0ZWQuY29udGFpbnMobG9jYXRpb25fbmFtZSkpIHsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJCS8vIHJlbWVtYmVyIHRoaXMgZWxlbWVudAorCQkJCQkJcmVwZWF0ZWQuYWRkKGxvY2F0aW9uX25hbWUpOworCisJCQkJCQlTdHJpbmcgcG9wID0gbnVsbDsKKworCQkJCQkJLy8gR2V0IGZpcnN0IHRoZSBlc3RpbWF0ZWQgdmFsdWUgYW5kIGlmIGl0IGlzIHplcm8sIHRoZW4KKwkJCQkJCS8vIGdldCB0aGUgcmVhbCBwb3B1bGF0aW9uIHZhbHVlIGZvciBSdXNzaWEuCisJCQkJCQlwb3AgPSBwb3AxOworCisJCQkJCQlpZiAoRG91YmxlLnBhcnNlRG91YmxlKHBvcCkgPT0gMC4wKSB7CisJCQkJCQkJcG9wID0gcG9wMjsKKwkJCQkJCX0KKworCQkJCQkJaWYgKERvdWJsZS5wYXJzZURvdWJsZShwb3ApIDw9IDAuMCkgeworCQkJCQkJCVN5c3RlbS5vdXQKKwkJCQkJCQkJCS5wcmludGxuKCJcdFx0UG9wdWxhdGlvbiBpcyB6ZXJvIGZvciBsb2NhdGlvbiA6ICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCQkrIGxvY2F0aW9uX25hbWUpOworCQkJCQkJfQorCisJCQkJCQlpZiAoRG91YmxlLnZhbHVlT2YoYXJlYSkgPCAxLjApIHsKKwkJCQkJCQlhcmVhID0gIjEuMCI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCX0KKworCQkJCQkJLy8gV3JpdGUgYXJlYSB2YWx1ZQorCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShhcmVhRmlsZSwgbG9jYXRpb25fbmFtZSArICIgOiAxIDogIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCSsgRG91YmxlLnZhbHVlT2YoYXJlYSkgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJCQkvLyBXcml0ZSBwb3B1bGF0aW9uIHZhbHVlCisJCQkJCQlHZW5VdGlscy5hZGREYXRhKHBvcEZpbGUsIGxvY2F0aW9uX25hbWUgKyAiIDogMSA6ICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkrIERvdWJsZS52YWx1ZU9mKHBvcCkuaW50VmFsdWUoKSArICJcbiIpOyAvLyROT04tTkxTLTEkCisKKwkJCQkJfS8vIHdoaWxlCisKKwkJCQkJLy8gUmVzZXQgSVNPIENvZGUKKwkJCQkJaXNvQ29kZSA9IG51bGw7CisKKwkJCQkJLy8gUmVzZXQgZmlsZSBuYW1lCisJCQkJCWZpbGVOYW1lID0gbnVsbDsKKworCQkJCQkvLyBDbG9zZSB0aGUgdGFyZ2V0IGZpbGVzLgorCQkJCQlhcmVhRmlsZS5jbG9zZSgpOworCQkJCQlhcmVhRmlsZSA9IG51bGw7CisJCQkJCXBvcEZpbGUuY2xvc2UoKTsKKwkJCQkJcG9wRmlsZSA9IG51bGw7CisKKwkJCQkJLy8gQ2xvc2UgYWxsIG9wZW4gcmVzb3VyY2VzLgorCQkJCQlyZWFkZXIuY2xvc2UoKTsKKworCQkJCQkvLyBSdW4gZ2FyYmFnZSBjb2xsZWN0aW9uCisJCQkJCS8vU3lzdGVtLmdjKCk7CisKKwkJCQl9CisKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCisJCX0gLy8gZm9yCisKKwl9CisKKwkvKioKKwkgKiBNYWluIGV4ZWN1dGlvbiBlbnRyeSBwb2ludC4KKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJLy8gZmluYWwgaW50IElTT18zMTY2XzEgPSAwOworCQkvLyBmaW5hbCBpbnQgVEFSR0VUX0xJU1QgPSAxOworCQkvLyBmaW5hbCBpbnQgT1VUUFVUX0RJUiA9IDI7CisJCS8vIGZpbmFsIGludCBQQVJBTVMgPSAzOworCQkvLworCQkvLyBpZiAoYXJncy5sZW5ndGggPCBQQVJBTVMpIHsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLVdyb25nIGFyZ3VtZW50cy0tIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dAorCQkvLyAucHJpbnRsbigiXHRUbyBydW4sIHBsZWFzZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIDogIik7CisJCS8vIC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IElTTyAzMTY2LTEgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBUYXJnZXQgY291bnRyaWVzIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgT3V0cHV0IGRpcmVjdG9yeSIpOyAvLyROT04tTkxTLTEkCisJCS8vIHJldHVybjsKKwkJLy8gfQorCisJCS8vIFJ1c3NpYURhdGFFeHRyYWN0b3IgY29udmVydGVyID0gbmV3IFJ1c3NpYURhdGFFeHRyYWN0b3IoCisJCS8vIGFyZ3NbSVNPXzMxNjZfMV0sIGFyZ3NbVEFSR0VUX0xJU1RdLCBhcmdzW09VVFBVVF9ESVJdKTsKKwkJLy8gY29udmVydGVyLnJ1bigpOworCisJCWZpbmFsIGludCBDT05GSUdfRklMRSA9IDA7CisJCWZpbmFsIGludCBQQVJBTVMgPSAxOworCisJCWlmIChhcmdzLmxlbmd0aCA8IFBBUkFNUykgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0LS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJcdFx0VG8gcnVuLCBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50KHMpIDogIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0IENvbmZpZ3VyYXRpb24gZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJfQorCisJCVJ1c3NpYURhdGFFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IFJ1c3NpYURhdGFFeHRyYWN0b3IoCisJCQkJYXJnc1tDT05GSUdfRklMRV0pOworCQlleHRyYWN0b3IucnVuKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL1J1c3NpYURhdGFGb3JtYXR0aW5nSGVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL1J1c3NpYURhdGFGb3JtYXR0aW5nSGVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQyNmYyNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvUnVzc2lhRGF0YUZvcm1hdHRpbmdIZWFkZXIuamF2YQpAQCAtMCwwICsxLDYyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiAKKyAqIFJlbGV2YW50IGtleXMgdG8gdGhlIFJ1c3NpYW4gZGF0YXNldC4gVXNlZCBkdXJpbmcgY29udmVyc2lvbiBwcm9jZXNzIGZyb20gdGhlCisgKiBSdXNzaWFuIFVOIGZvcm1hdCAtPiBEaXZhIGZvcm1hdC4KKyAqIAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUnVzc2lhRGF0YUZvcm1hdHRpbmdIZWFkZXIgeworCisJLyoqCisJICogTnVtZXJpYyBJRAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEID0gMDsKKworCS8qKgorCSAqIEFyZWEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUkVBID0gMTsKKworCS8qKgorCSAqIENvdW50cnkgbmFtZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPVU5UUlkgPSAyOworCisJLyoqCisJICogTG9jYXRpb24gTmFtZSAxCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRTEgPSAzOworCisJLyoqCisJICogTG9jYXRpb24gTmFtZSAyCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRTIgPSA0OworCisJLyoqCisJICogTG9jYXRpb24gTmFtZSAzCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRTMgPSA1OworCisJLyoqCisJICogUG9wdWxhdGlvbiB2YWx1ZSAxCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9QMSA9IDY7CisKKwkvKioKKwkgKiBQb3B1bGF0aW9uIHZhbHVlIDIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1AyID0gNzsKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvU1RFTVBvbHlnb24uamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvU1RFTVBvbHlnb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjgyMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9TVEVNUG9seWdvbi5qYXZhCkBAIC0wLDAgKzEsNDMwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogU1RFTSBJSSBEYXRhIE1pZ3JhdGlvbi9HZW5lcmF0aW9uIFV0aWxpdGllcyA6IEluc3RhbmNlcyBvZiB0aGlzIHV0aWxpdHkgY2xhc3MKKyAqIGFyZSBhIGEgaG9sZGVyIGZvciBwb2x5Z29uIGRhdGEuIEl0IGlzIHVzZWQgaW4gY2hlY2tpbmdzIGZvciBkdXBsaWNhdGUgb3IKKyAqIG5vbi1wb2x5Z29uIGRhdGEKKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBTVEVNUG9seWdvbiB7CisKKwlwcml2YXRlIExpc3Q8UG9pbnREYXRhPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxQb2ludERhdGE+KCk7CisKKwlwcml2YXRlIFN0cmluZyBfZGF0YSA9IG51bGw7CisKKwlwcml2YXRlIGludCBfbGV2ZWwgPSAtMTsKKworCXByaXZhdGUgUG9pbnREYXRhIGluaXQgPSBudWxsOworCisJcHJpdmF0ZSBQb2ludERhdGEgbGFzdCA9IG51bGw7CisKKwlwcml2YXRlIERvdWJsZSBsdFBvaW50c1tdID0gbnVsbDsKKworCXByaXZhdGUgRG91YmxlIGxnUG9pbnRzW10gPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gZGF0YQorCSAqICAgICAgICAgICAgcmF3IHBvbHlnb24gZGF0YSAobHQsIGxnKSB2YWx1ZXMKKwkgKiBAcGFyYW0gbGV2ZWwKKwkgKiAgICAgICAgICAgIHRoZSBhZG1pbiBsZXZlbCBmb3IgdGhpcyBkYXRhCisJICovCisJcHVibGljIFNURU1Qb2x5Z29uKFN0cmluZyBkYXRhLCBpbnQgbGV2ZWwpIHsKKwkJX2RhdGEgPSBkYXRhOworCQlfbGV2ZWwgPSBsZXZlbDsKKwkJZXh0cmFjdEx0TGdEYXRhKCk7CisJCWx0UG9pbnRzID0gbmV3IERvdWJsZVtsaXN0LnNpemUoKV07CisJCWxnUG9pbnRzID0gbmV3IERvdWJsZVtsaXN0LnNpemUoKV07CisJCS8vIENsZWFyIHRoZSBkYXRhIGJ1ZmZlciB0byBiZSBtb3JlIG1lbW9yeS1lZmZpY2llbnQKKwkJX2RhdGEgPSBudWxsOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgbnVtYmVyIG9mIHBvaW50cyBpbiBhIHBvbHlnb24uCisJICogCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBvaW50cyBpbiBhIGdpdmVuIHBvbHlnb24uCisJICovCisJcHVibGljIGludCBwb2ludHMoKSB7CisJCXJldHVybiBsaXN0LnNpemUoKTsKKwl9CisKKwkvKioKKwkgKiBDbGVhciB0aGlzIHBvbHlnb24KKwkgKi8KKwl2b2lkIGNsZWFyKCkgeworCQlsaXN0LmNsZWFyKCk7CisJCWxnUG9pbnRzID0gbnVsbDsKKwkJbHRQb2ludHMgPSBudWxsOworCQlpbml0ID0gbnVsbDsKKwkJbGFzdCA9IG51bGw7CisJfQorCisJLyoqCisJICogQ29udmVydCB0aGUgdmFsdWUgb2Ygc3RyaW5nIHRvIGEgZG91YmxlCisJICogCisJICogQHBhcmFtIHN0cgorCSAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGRvdWJsZS4KKwkgKiAKKwkgKiBAcmV0dXJuIGRvdWJsZSB2YWx1ZSBleHRyYWN0ZWQgZnJvbSBudW1lcmljIHN0cmluZworCSAqLworCXByb3RlY3RlZCBkb3VibGUgZ2V0RG91YmxlKFN0cmluZyBzdHIpIHsKKwkJRG91YmxlIGhvbGRlciA9IG5ldyBEb3VibGUoc3RyKTsKKwkJcmV0dXJuIGhvbGRlci5kb3VibGVWYWx1ZSgpOworCX0KKworCS8qKgorCSAqIFRlc3QgaWYgdGhlIHN0cmluZyBjb250YWlucyBhIG51bWJlcgorCSAqIAorCSAqIEBwYXJhbSBzdHIKKwkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB3ZSB3YW50IHRvIHRlc3QKKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB2YWx1ZSBpcyBudW1lcmljCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNOdW1lcmljKFN0cmluZyBzdHIpIHsKKworCQl0cnkgeworCQkJRG91YmxlLnZhbHVlT2Yoc3RyKTsKKwkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biwgdGhlbgorCQkJLy8gaXQgaXMgbm90IGEgbnVtYmVyLiBPdGhlcndpc2UgaXQKKwkJCS8vIGlzLgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFRlc3RzIHdoZXRoZXIgYW5vdGhlciBwb2x5Z29uIGFuZCBUSElTIHBvbHlnb24gYXJlIHRoZSBzYW1lCisJICogCisJICogQHBhcmFtIHBvbHlnb24KKwkgKiAgICAgICAgICAgIHRoZSBvdGhlciBwb2x5Z29uIHdlIHdhbnQgdG8gY29tcGFyZSBhZ2FpbnMgVEhJUyBvbmUKKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlc2UgdHdvIHBvbHlnb25zIGFyZSB0aGUgc2FtZQorCSAqLworCXB1YmxpYyBib29sZWFuIHNhbWUoU1RFTVBvbHlnb24gcG9seWdvbikgeworCisJCS8vIElmIHRoZXkgZG9udCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBwb2ludHMgdGhleSBjYW50IGJlIHRoZSBzYW1lCisJCS8vIHBvbHlnb24uCisJCWlmIChsaXN0LnNpemUoKSAhPSBwb2x5Z29uLnBvaW50cygpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvLyBPdGhlcndpc2UsIGNvbXBhcmUgaWYgdGhleSBoYXZlIHRoZSBzYW1lIHN0YXJ0aW5nIGFuZCBlbmRpbmcgcG9pbnRzLgorCQkvLyBJZiB0aGV5IGRvbnQsIHRoZW4gdGhleSBjYW50IGJlIHRoZSBzYW1lIHBvaW50LgorCisJCWlmIChpbml0ICE9IHBvbHlnb24uZ2V0SW5pdCgpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAobGFzdCAhPSBwb2x5Z29uLmdldExhc3QoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gRmluYWxseSwgc2luY2UgdGhleSBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBwb2ludHMsIHRoZSBzYW1lIHN0YXJ0aW5nCisJCS8vIGFuZCBlbmRpbmcgcG9pbnRzLCBjaGVjayB0aGUKKwkJLy8gaW50ZXJtZWRpYXRlIHBvaW50cyB0byBzZWUgaWYgdGhleSBhcmUgcmVhbGx5IHRoZSBzYW1lLgorCisJCS8vIGFkdmFuY2UgdGhlIGZpcnN0IHRva2VuIHdoaWNoIHdlIGtub3cgYWxyZWFkeSB0byBiZSB0aGUgc2FtZQorCQlJdGVyYXRvciBpdDEgPSBsaXN0Lml0ZXJhdG9yKCk7CisJCUl0ZXJhdG9yIGl0MiA9IGxpc3QuaXRlcmF0b3IoKTsKKworCQlQb2ludERhdGEgZDEgPSBudWxsOworCQlQb2ludERhdGEgZDIgPSBudWxsOworCisJCXdoaWxlIChpdDEuaGFzTmV4dCgpKSB7CisKKwkJCWQxID0gKFBvaW50RGF0YSkgaXQxLm5leHQoKTsKKwkJCWQyID0gKFBvaW50RGF0YSkgaXQyLm5leHQoKTsKKworCQkJaWYgKGQxLnNhbWUoZDIpICE9IHRydWUpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJfQorCisJCS8vIFllcywgYm90aCBwb2x5Z29ucyBhcmUgdGhlIHNhbWUuCisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIGNvbnZlcnQgdG8gZGVncmVlcyBhbmQgY2hhbmdlIGZvcm1hdCBvZiBkYXRhIHRvIFNURU0gY29udmVudGlvbiAtLSBlaWdodAorCSAqIGRpZ2l0cywgbm8gZGVjaW1hbCBwb2ludAorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZQorCSAqICAgICAgICAgICAgaW4gcmFkaWFucworCSAqIAorCSAqIEByZXR1cm4gdGhlIGFuZ2xlIHZhbHVlIGluIGRlZ3JlZXMKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIHRvRGVncmVlcyhkb3VibGUgdmFsdWUpIHsKKwkJZG91YmxlIGRWYWx1ZSA9IHZhbHVlOworCQlkVmFsdWUgKj0gMTgwLjA7CisJCWRWYWx1ZSAvPSBqYXZhLmxhbmcuTWF0aC5QSTsKKwkJLy8gcmV0dXJuIChpbnQpICgxMDAwMDAwLjAgKiB2YWx1ZSk7CisJCXJldHVybiBkVmFsdWU7CisJfSAvLyB0b0RlZ3JlZXMKKworCS8qKgorCSAqIEdldCBhbGwgdGhlIGx0IHBvaW50cyBpbiB0aGlzIHBvbHlnb24KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsdCBwb2ludHMKKwkgKi8KKwlwdWJsaWMgRG91YmxlW10gZ2V0THRQb2ludHMoKSB7CisKKwkJaW50IGluZGV4ID0gMDsKKwkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7CisKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJUG9pbnREYXRhIHBEYXRhID0gKFBvaW50RGF0YSkgaXQubmV4dCgpOworCQkJbHRQb2ludHNbaW5kZXgrK10gPSBuZXcgRG91YmxlKHRvRGVncmVlcyhwRGF0YS5nZXRMdCgpKSk7CisJCX0KKworCQlyZXR1cm4gbHRQb2ludHM7CisJfQorCisJLyoqCisJICogR2V0IGFsbCB0aGUgbGcgcG9pbnRzIGluIHRoaXMgcG9seWdvbgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGxnIHBvaW50cworCSAqLworCXB1YmxpYyBEb3VibGVbXSBnZXRMZ1BvaW50cygpIHsKKworCQlpbnQgaW5kZXggPSAwOworCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKKworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQlQb2ludERhdGEgcERhdGEgPSAoUG9pbnREYXRhKSBpdC5uZXh0KCk7CisJCQlsZ1BvaW50c1tpbmRleCsrXSA9IG5ldyBEb3VibGUodG9EZWdyZWVzKHBEYXRhLmdldExnKCkpKTsKKwkJfQorCisJCXJldHVybiBsZ1BvaW50czsKKwl9CisKKwkvKioKKwkgKiBFeHRyYWN0IHRoZSBsYXQsIGxvbmcgZGF0YSBmcm9tIHRoZSBkYXRhIGJ1ZmZlcgorCSAqIAorCSAqLworCXByb3RlY3RlZCB2b2lkIGV4dHJhY3RMdExnRGF0YSgpIHsKKworCQkvKioKKwkJICogVGhpcyBtZXRob2QgY3JlYXRlcyB0aGUgWE1MIHRhZ3MgdGhhdCBkZWFsIHdpdGggcG9seWdvbiBkYXRhIGFuZAorCQkgKiBpbmNsdWRlcyB0aGUgcG9seWdvbiBkYXRhIGluIGl0LgorCQkgKiAKKwkJICogQHBhcmFtIGlkCisJCSAqIEBwYXJhbSBkYXRhCisJCSAqIEByZXR1cm4KKwkJICovCisKKwkJaW50IG9mZnNldCA9IDA7CisJCWZpbmFsIGludCBJTlZBTElEID0gLTEwMDAwMDAwOworCQlkb3VibGUgbHQgPSBJTlZBTElEOworCQlkb3VibGUgbGcgPSBJTlZBTElEOworCisJCXN3aXRjaCAoX2xldmVsKSB7CisKKwkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMDoKKwkJCW9mZnNldCA9IDI7CisJCQlicmVhazsKKworCQljYXNlIERhdGFUeXBlcy5MRVZFTF8xOgorCQkJb2Zmc2V0ID0gMzsKKwkJCWJyZWFrOworCisJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzI6CisJCQlvZmZzZXQgPSA0OworCQkJYnJlYWs7CisJCX0KKworCQkvLyBUb2tlbml6ZQorCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihfZGF0YSwgIiwiKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIEFkdmFuY2UgdGhlIGZpcnN0IEstdG9rZW5zLgorCQlmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldDsgaSsrKSB7CisJCQlpZiAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworCQkJCXRva2Vucy5uZXh0VG9rZW4oKTsKKwkJCX0KKwkJfQorCisJCS8vIFdlIGFyZSBub3cgbG9jYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwb2x5Z29uIGRhdGEuCisJCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7CisKKwkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKKworCQkJaWYgKGlzTnVtZXJpYyh0b2tlbikgPT0gZmFsc2UpIHsKKwkJCQljb250aW51ZTsgLy8gSWdub3JlLCB0aGlzIGlzIG5vdCBhIHZhbGlkIGNvb3JkaW5hdGUuCisJCQl9CisKKwkJCWlmIChsdCA9PSBJTlZBTElEKSB7CisJCQkJbHQgPSBnZXREb3VibGUodG9rZW4pOworCQkJfSBlbHNlIGlmIChsZyA9PSBJTlZBTElEKSB7CisJCQkJbGcgPSBnZXREb3VibGUodG9rZW4pOworCQkJfQorCisJCQlpZiAobHQgIT0gSU5WQUxJRCAmJiBsZyAhPSBJTlZBTElEKSB7CisJCQkJLy8gUG9pbnREYXRhIHBvaW50ID0gbmV3IFBvaW50RGF0YSh0b0RlZ3JlZXMobHQpLAorCQkJCS8vIHRvRGVncmVlcyhsZykpOworCQkJCVBvaW50RGF0YSBwb2ludCA9IG5ldyBQb2ludERhdGEobHQsIGxnKTsKKwkJCQlpZiAoaW5pdCA9PSBudWxsKSB7CisJCQkJCWluaXQgPSBwb2ludDsKKwkJCQl9CisJCQkJbGFzdCA9IHBvaW50OworCQkJCS8vIEVsaW1pbmF0ZSByZXBlYXRlZCBwb2ludHMgOiBmb3IgZXZlcnkgbmV3IHBvaW50LCBhZGQgdG8gbGlzdAorCQkJCS8vIG9ubHkgaWYgaXQgaXMgbm90IGR1cGxpY2F0ZWQKKwkJCQkvLyBpZiAoY2hlY2tEdXBsaWNhdGVkUG9pbnRzKHBvaW50KSA9PSBmYWxzZSkgeworCQkJCWxpc3QuYWRkKHBvaW50KTsKKwkJCQkvLyB9CisJCQkJbHQgPSBJTlZBTElEOworCQkJCWxnID0gSU5WQUxJRDsKKwkJCX0KKwkJfQorCisJfSAvLyBleHRyYWN0THRMZ0RhdGEKKworCS8qKgorCSAqIENoZWNrIGZvciBkdXBsaWNhdGVkIHBvaW50cyBpbiB0aGUgcG9seWdvbgorCSAqLworCS8vIHByaXZhdGUgYm9vbGVhbiBjaGVja0R1cGxpY2F0ZWRQb2ludHMoUG9pbnREYXRhIHBvaW50KSB7CisJLy8KKwkvLyBJdGVyYXRvciBpdCA9IHRoaXMubGlzdC5pdGVyYXRvcigpOworCS8vCisJLy8gLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgcG9pbnRzIGluIHRoZSBwb2x5Z29uLCBhdm9pZCBkdXBsaWNhdGVzLgorCS8vIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkvLworCS8vIFBvaW50RGF0YSBjdXJyZW50ID0gKFBvaW50RGF0YSkgaXQubmV4dCgpOworCS8vIC8vIENoZWNrIHRvIHNlZSBpZiB0aGVzZSB0d28gcG9seWdvbnMgYXJlIHRoZSBzYW1lCisJLy8gLy8gTk9URTogdGhlIGV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbCBwb2x5Z29uCisJLy8gaWYgKHBvaW50LnNhbWUoY3VycmVudCkpIHsKKwkvLyByZXR1cm4gdHJ1ZTsKKwkvLyB9CisJLy8gfQorCS8vIC8vIE5vdCBkdXBsaWNhdGVkCisJLy8gcmV0dXJuIGZhbHNlOworCS8vIH0KKwkvKioKKwkgKiBHZXQgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIGEgcG9seWdvbgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGZpcnN0IHBvaW50IG9mIGEgcG9seWdvbgorCSAqLworCXB1YmxpYyBQb2ludERhdGEgZ2V0SW5pdCgpIHsKKwkJcmV0dXJuIGluaXQ7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBsYXN0IHBvaW50IG9mIGEgcG9seWdvbgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGxhc3QgcG9pbnQgb2YgYSBwb2x5Z29uCisJICovCisJcHVibGljIFBvaW50RGF0YSBnZXRMYXN0KCkgeworCQlyZXR1cm4gbGFzdDsKKwl9CisKKwkvKioKKwkgKiBHZXQgaXRlcmF0b3IgdG8gbGlzdCBvZiBwb2x5Z29uIGRhdGEgb2JqZWN0cy4KKwkgKiAKKwkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIHRocm91Z2ggb3VyIGxpc3Qgb2YgcG9seWdvbnMKKwkgKi8KKwlwdWJsaWMgSXRlcmF0b3IgZ2V0SXRlcmF0b3IoKSB7CisJCXJldHVybiBsaXN0Lmxpc3RJdGVyYXRvcigpOworCX0KKworfQorCisvKioKKyAqIEEgdXRpbGl0eSBjbGFzcyB1c2VkIHRvIGhvbGQgcG9seWdvbiBkYXRhLiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCisgKiByZXByZXNlbnRzIGEgc2luZ2xlIHBvaW50LgorICogCisgKi8KK2NsYXNzIFBvaW50RGF0YSB7CisKKwlwcml2YXRlIGRvdWJsZSBfbHQgPSAtMTsKKworCXByaXZhdGUgZG91YmxlIF9sZyA9IC0xOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gbHQKKwkgKiAgICAgICAgICAgIHRoZSBsYXRpdHVkZSBpbiBkZWdyZWVzCisJICogQHBhcmFtIGxnCisJICogICAgICAgICAgICB0aGUgbG9uZ2l0dWRlIGluIGRlZ3Jlc3MKKwkgKi8KKwlwdWJsaWMgUG9pbnREYXRhKGRvdWJsZSBsdCwgZG91YmxlIGxnKSB7CisJCS8vIF9sdCA9IEdlblV0aWxzLnRvRGVncmVlcyhsdCk7CisJCS8vIF9sZyA9IEdlblV0aWxzLnRvRGVncmVlcyhsZyk7CisJCV9sdCA9IGx0OworCQlfbGcgPSBsZzsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGxhdGl0dWRlIHZhbHVlCisJICogCisJICogQHJldHVybiB0aGUgbGF0aXR1ZGUgaW4gZGVncmVzcworCSAqIAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0THQoKSB7CisJCXJldHVybiBfbHQ7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBsb25naXR1ZGUgdmFsdWUKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsb25naXR1ZGUgaW4gZGVncmVzcworCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0TGcoKSB7CisJCXJldHVybiBfbGc7CisJfQorCisJLyoqCisJICogU2V0IHRoZSBsYXRpdHVkZQorCSAqIAorCSAqIEBwYXJhbSBsdAorCSAqICAgICAgICAgICAgdGhlIGxhdGl0dWRlCisJICovCisJcHVibGljIHZvaWQgc2V0THQoZG91YmxlIGx0KSB7CisJCV9sdCA9IGx0OworCX0KKworCS8qKgorCSAqIFNldCB0aGUgbG9uZ2l0dWRlCisJICogCisJICogQHBhcmFtIGxnCisJICogICAgICAgICAgICB0aGUgbG9uZ2l0dWRlCisJICovCisJcHVibGljIHZvaWQgc2V0TGcoZG91YmxlIGxnKSB7CisJCV9sZyA9IGxnOworCX0KKworCS8qKgorCSAqIENoZWNrIHRvIHNlZSBpZiB0d28gcG9pbnQgb2JqZWN0cyBhcmUgdGhlIHNhbWUuCisJICogCisJICogQHBhcmFtIHBvaW50CisJICogICAgICAgICAgICB0aGUgcG9pbnQgZGF0YSBob2xkZXIKKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgdHdvIHBvaW50cyBhcmUgdGhlIHNhbWUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzYW1lKFBvaW50RGF0YSBwb2ludCkgeworCisJCWlmICh0aGlzLl9sdCAhPSBwb2ludC5fbHQpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICh0aGlzLl9sZyAhPSBwb2ludC5fbGcpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8vIFllcywgaXQgaXMgdGhlIHNhbWUgZGF0YS4KKwkJcmV0dXJuIHRydWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9TaW5nbGVQYXNzRG93blNhbXBsZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvU2luZ2xlUGFzc0Rvd25TYW1wbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3ZjcxMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvU2luZ2xlUGFzc0Rvd25TYW1wbGVyLmphdmEKQEAgLTAsMCArMSwxNzg1IEBACisvKioKKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFNURU0gSUkgRGF0YSBNaWdyYXRpb24vR2VuZXJhdGlvbiBVdGlsaXRpZXMgLS0gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlCisgKiB1c2VkIHRvIHJ1biBhIHBvaW50LXJlZHVjdGlvbiBhbGdvcml0aG0gb24gdGhlIERpdmEgc2V0LgorICogCisgKiBOT1RFIDogU0lOR0xFIFBBU1MgRE9XTiBTQU1QTEVSIGlzIHRvIGJlIHVzZWQgb25seSBmb3IgYSBzaW5nbGUgaXRlcmF0aW9uIG9yCisgKiBhcyB0aGUgZmlyc3Qgc3RlcCBvZiBtb3JlIHRoYW4gb25lIGl0ZXJhdGlvbi4KKyAqIAorICogVG8gY29uZmlndXJlLCBzZWUgY29uZmlndXJhdGlvbiBmaWxlIDoKKyAqIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9jb25maWd1cmF0aW9uL1NpbmdsZVBhc3NEb3duU2FtcGxlci5jb25maWcKKyAqIAorICogCisgKiBUbyBydW4sIGFkZCBwYXRoIHRvIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiB0aGUgcnVuIHByb2ZpbGUgKGkuZS4KKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcY29uZmlndXJhdGlvblxTaW5nbGVQYXNzRG93blNhbXBsZXIuY29uZmlnKQorICogCisgKiAKKyAqIFNFVCBWTUFSR1MgVE8gOiAtWG1zMTAyNG0gLVhteDEwMjRtCisgKiAKKyAqLworcHVibGljIGNsYXNzIFNpbmdsZVBhc3NEb3duU2FtcGxlciB7CisKKwkvKioKKwkgKiBPdXIgc291cmNlIGZpbGVzIGZvciBJU08gMzE2Ni0xIGNvZGVzIGFuZCBmb3IgdGhlIGxpc3Qgb2YgdGFyZ2V0CisJICogY291bnRyaWVzLgorCSAqLworCisJcHJpdmF0ZSBTdHJpbmcgdGhyZXNob2xkID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIGlzbzMxNjZfMSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBpc28zMTY2XzIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgZml4RmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyB0YXJnZXRGaWxlID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIGxleERpciA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBvdXRwdXREaXIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgd29ya3NwYWNlID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIHVzYURlc2NyaXB0b3JGaWxlID0gbnVsbDsKKworCS8qKgorCSAqIExpc3QgZm9yIElTTyAzMTY2LTEgY29kZXMgYW5kIHRhcmdldCBjb3VudHJpZXMuCisJICovCisKKwlMaXN0IHRhcmdldExpc3QgPSBudWxsOworCisJTGlzdCBjb2RlTGlzdCA9IG51bGw7CisKKwlMaXN0IGNvZGVmaXhMaXN0ID0gbnVsbDsKKworCUxpc3QgdXNhRGVzY3JpcHRvckxpc3QgPSBudWxsOworCisJLyoqCisJICogTGlzdCB0byBrZWVwIHRyYWNrIG9mIHBhaXJzIChQb2ludERhdmE6VmFsdWUpCisJICovCisJTGlzdDxTdHJpbmc+IHBvaW50RGF0YUxpc3QgPSBudWxsOworCisJLyoqCisJICogQSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgd2UgY2FuIGRlbGV0ZSBhIHBvaW50LgorCSAqLworCS8vIE5vLCBpdCBpcyBub3Qgc2FmZSB0byByZW1vdmUgdGhpcyBub2RlLgorCWZpbmFsIFN0cmluZyBVTlNBRkUgPSAiMCI7IC8vJE5PTi1OTFMtMSQKKworCS8vIFllcywgaXQgY2FuIGJlIGRlbGV0ZWQuCisJZmluYWwgU3RyaW5nIFNBRkUgPSAiMSI7IC8vJE5PTi1OTFMtMSQKKworCS8vIFNhZmV0eSBzdGF0ZSBub3Qga25vd24geWV0IC0+IGluaXRpYWwgdmFsdWUuCisJZmluYWwgU3RyaW5nIFVOS05PV04gPSAiMiI7IC8vIC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFVzZWQgZm9yIGdsb2JhbCBzdGF0cy4KKwkgKi8KKwlkb3VibGUgdG90YWxQb2ludHMgPSAwOworCisJZG91YmxlIHRvdGFsUmVtb3ZlZCA9IDA7CisKKwlkb3VibGUgdG90YWxQb2x5Z29ucyA9IDA7CisKKwlkb3VibGUgZ2xvYmFsTWluUGVyY2VudCA9IERvdWJsZS5NQVhfVkFMVUU7CisKKwlkb3VibGUgZ2xvYmFsTWF4UGVyY2VudCA9IDAuMDsKKworCWRvdWJsZSBnbG9iYWxQZXJjZW50ID0gMC4wOworCisJLyoqCisJICogTGlzdHMgdG8ga2VlcCB0cmFjayBvZiB0aGUgb2NjdXJlbmNlcyBvZiB2YWx1ZXMgb2YgdGhlIGFuZ2xlcyA6IDE4MCAtCisJICogQXJjQ29zKHRldGEpCisJICogCisJICovCisJSGFzaE1hcDxEb3VibGUsIEludGVnZXI+IGFuZ2xlVmFsdWVNYXAgPSBudWxsOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gdGhyZXNob2xkIC0KKwkgKiAgICAgICAgICAgIHRoZSB0aHJlc2hvbGQgaW4gZGVncmVzcworCSAqIEBwYXJhbSBpc28zMTY2XzEgLQorCSAqICAgICAgICAgICAgZGF0YSBmaWxlIHdpdGggdGhlIElTTzMxNjYtMSBBTFBIQV8yIGFuZCBBTFBIQV8zIGNvZGVzLgorCSAqIEBwYXJhbSBpc28zMTY2XzIgLQorCSAqICAgICAgICAgICAgZGF0YSBmaWxlIHdpdGggdGhlIElTTzMxNjYtMiBjb2Rlcy4KKwkgKiBAcGFyYW0gZml4RmlsZSAtCisJICogICAgICAgICAgICBmaWxlIGNvbnRhaW5pbmcgbWlzc2luZyBJU08zMTY2LTIgY29kZXMKKwkgKiBAcGFyYW0gdGFyZ2V0RmlsZQorCSAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgY291bnRyaWVzIGZvciB3aGljaCB3ZSB3aWxsIGdlbmVyYXRlIEdNTCBmaWxlcworCSAqIEBwYXJhbSBsZXhEaXIKKwkgKiAgICAgICAgICAgIGZvbGRlciBjb250YWluaW5nIGxleGljb2dyYXBoaWNhbGx5IHNvcnRlZCBmaWxlcworCSAqIEBwYXJhbSBvdXRwdXREaXIKKwkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGUgR01MIGZpbGVzIHdlIGdlbmVyYXRlCisJICovCisJLy8gcHVibGljIFNpbmdsZVBhc3NEb3duU2FtcGxlcihTdHJpbmcgdGhyZXNob2xkLCBTdHJpbmcgaXNvMzE2Nl8xLAorCS8vIFN0cmluZyBpc28zMTY2XzIsIFN0cmluZyBmaXhGaWxlLCBTdHJpbmcgdGFyZ2V0RmlsZSwgU3RyaW5nIGxleERpciwKKwkvLyBTdHJpbmcgb3V0cHV0RGlyKSB7CisJLy8gLy8gU2V0IHZhbHVlcyBvZiBnbG9iYWwgdmFyaWFibGVzLgorCS8vIHRoaXMudGhyZXNob2xkID0gdGhyZXNob2xkOworCS8vIHRoaXMuaXNvMzE2Nl8xID0gaXNvMzE2Nl8xOworCS8vIHRoaXMuaXNvMzE2Nl8yID0gaXNvMzE2Nl8yOworCS8vIHRoaXMuZml4RmlsZSA9IGZpeEZpbGU7CisJLy8gdGhpcy50YXJnZXRGaWxlID0gdGFyZ2V0RmlsZTsKKwkvLyB0aGlzLmxleERpciA9IGxleERpcjsKKwkvLyB0aGlzLm91dHB1dERpciA9IG91dHB1dERpcjsKKwkvLyB0YXJnZXRMaXN0ID0gbnVsbDsKKwkvLyBhbmdsZVZhbHVlTWFwID0gbmV3IEhhc2hNYXA8RG91YmxlLCBJbnRlZ2VyPigpOworCS8vIHRoaXMudXNhRGVzY3JpcHRvckZpbGUgPSB3b3Jrc3BhY2UKKwkvLyArICJcXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxccGFyYW1ldGVyc1xcSVNPRklYXFxVU0FfRklQUy50eHQiOworCS8vIC8vJE5PTi1OTFMtMSQKKwkvLyB9CisJLyoqCisJICogQHBhcmFtIGNvbmZpZ0ZpbGUKKwkgKi8KKwlwdWJsaWMgU2luZ2xlUGFzc0Rvd25TYW1wbGVyKFN0cmluZyBjb25maWdGaWxlKSB7CisKKwkJLy8gTG9hZCBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKKwkJSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFycyA9IEdlblV0aWxzLmxvYWRDb25maWdGaWxlKGNvbmZpZ0ZpbGUpOworCisJCVNldDxTdHJpbmc+IGtleXMgPSB2YXJzLmtleVNldCgpOworCQlJdGVyYXRvciBpdCA9IGtleXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJU3RyaW5nIHZhciA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKworCQkJLy8gQXNzaWduIHZhbHVlcyB0byBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyA6CisJCQlpZiAodmFyLmVxdWFscygiV09SS1NQQUNFIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXdvcmtzcGFjZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIlRIUkVTSE9MRCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl0aHJlc2hvbGQgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJJU08zMTY2XzEiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJaXNvMzE2Nl8xID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiSVNPMzE2Nl8yIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWlzbzMxNjZfMiA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIklTT19GSVgiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJZml4RmlsZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIlRBUkdFVF9MSVNUIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXRhcmdldEZpbGUgPSB2YXJzLmdldCh2YXIpOworCQkJfSBlbHNlIGlmICh2YXIuZXF1YWxzKCJMRVhfRElSIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWxleERpciA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIk1BUF9PVVRQVVQiKSB8fCB2YXIuZXF1YWxzKCJPVVRQVVQiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlvdXRwdXREaXIgPSB2YXJzLmdldCh2YXIpOworCQkJfQorCisJCX0gLy8gd2hpbGUKKworCQkvLyBUaGUgd29ya3NwYWNlIHZhcmlhYmxlIHNob3VsZCBlbmQgd2l0aCBhIHNsYXNoIGNoYXJhY3RlcgorCQlpZiAod29ya3NwYWNlLmVuZHNXaXRoKCJcXCIpID09IGZhbHNlKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXdvcmtzcGFjZSArPSAiXFwiOyAvLyROT04tTkxTLTEkCisJCX0KKworCQlTdHJpbmcgcGF0aCA9IHdvcmtzcGFjZSArIEdlbkNvbnN0YW50cy5QQVJBTVNfRElSOworCisJCS8vIFNldCByZW1haW5pbmcgY29uZmlnIHZhcnMgdXNpbmcgV09SS1NQQUNFICh3b3Jrc3BhY2UgcmVsYXRpdmUpCisJCWlmICh0aHJlc2hvbGQgPT0gbnVsbCkgeworCQkJdGhyZXNob2xkID0gR2VuQ29uc3RhbnRzLkRFRkFVTFRfVEhSRVNIT0xEOyAvLyBEZWZhdWx0cyB0byA1IGRlZ3JlZXMKKwkJfQorCQlpZiAoaXNvMzE2Nl8xID09IG51bGwpIHsKKwkJCWlzbzMxNjZfMSA9IHBhdGggKyBHZW5Db25zdGFudHMuSVNPMzE2Nl8xX0ZJTEU7CisJCX0KKwkJaWYgKGlzbzMxNjZfMiA9PSBudWxsKSB7CisJCQlpc28zMTY2XzIgPSBwYXRoICsgR2VuQ29uc3RhbnRzLklTTzMxNjZfMl9GSUxFOworCQl9CisJCWlmIChmaXhGaWxlID09IG51bGwpIHsKKwkJCWZpeEZpbGUgPSBwYXRoICsgR2VuQ29uc3RhbnRzLklTT0ZJWF9GSUxFOworCQl9CisJCWlmICh0YXJnZXRGaWxlID09IG51bGwpIHsKKwkJCXRhcmdldEZpbGUgPSBwYXRoICsgR2VuQ29uc3RhbnRzLkNPVU5UUklFU19MSVNUOworCQl9CisJCWlmIChsZXhEaXIgPT0gbnVsbCkgeworCQkJbGV4RGlyID0gcGF0aCArIEdlbkNvbnN0YW50cy5MRVhfRElSOworCQl9CisKKwkJaWYgKEdlblV0aWxzLnZlcmlmeU91dHB1dERpcmVjdG9yeSh2YXJzKSA9PSBmYWxzZSkgeworCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRcdEJhZCBjb25maWd1cmF0aW9uIGZpbGUgLS0gT1VUUFVUIHZhcmlhYmxlIG5vdCBmb3VuZC4gUGxlYXNlIHNwZWNpZnkgb3V0cHV0IGRpcmVjdG9yeSB1c2luZyBmb3JtYXQgVkFSID0gVkFMVUUgKGkuZS4gT1VUUFVUID0gQzpcXGRpdmFcXGdyb3VwZWRcXCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLmV4aXQoMSk7CisJCX0KKworCQl0YXJnZXRMaXN0ID0gbnVsbDsKKwkJYW5nbGVWYWx1ZU1hcCA9IG5ldyBIYXNoTWFwPERvdWJsZSwgSW50ZWdlcj4oKTsKKwkJdGhpcy51c2FEZXNjcmlwdG9yRmlsZSA9IHBhdGggKyBHZW5Db25zdGFudHMuVVNBX0ZJUFNfRklMRTsKKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNldHMgdXAgYW5kIHJ1bnMgdGhpcyBnZW5lcmF0b3IuCisJICogCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIGNvdW50cmllcyB3ZSB3YW50LgorCQl0YXJnZXRMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KHRhcmdldEZpbGUpOworCisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgSVNPMzE2Ni0xIEFMUEhBMiwgQUxQSEEzLCBhbmQKKwkJLy8gbnVtZXJpYyBjb2Rlcy4KKwkJY29kZUxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QoaXNvMzE2Nl8xKTsKKworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIG1pc3NpbmcgSVNPMzE2Ni0yIGNvZGVzCisJCWNvZGVmaXhMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KGZpeEZpbGUpOworCisJCS8vIExvYWQgdGhlIGxpc3Qgb2YgZGVzY3JpcHRvcnMgZm9yIHRoZSBVU0EgKHNwZWNpYWwgY2FzZSkKKwkJdXNhRGVzY3JpcHRvckxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QodXNhRGVzY3JpcHRvckZpbGUpOworCisJCS8vIEluaXRpYWxpemUgdGhlIGhhc2ggbWFwCisJCWluaXRIYXNoTWFwKGFuZ2xlVmFsdWVNYXApOworCisJCS8vIE5vdywgcHJvY2VzcyBlYWNoIGl0ZW0gaW4gdGhlIHRhcmdldCBsaXN0LgorCQlwcm9jZXNzKCk7CisKKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplIHRoZSBoYXNoIG1hcAorCSAqIAorCSAqIEBwYXJhbSBtYXAgLQorCSAqICAgICAgICAgICAgdGhlIGhhc2ggbWFwCisJICogCisJICovCisJcHVibGljIHZvaWQgaW5pdEhhc2hNYXAoSGFzaE1hcDxEb3VibGUsIEludGVnZXI+IG1hcCkgeworCQkvLyBBZGQgc29tZSBrZXlzL3ZhbHVlcyB0byBvdXIgaGFzaCBtYXAKKwkJbWFwLnB1dChuZXcgRG91YmxlKDkwLjApLCBuZXcgSW50ZWdlcigwKSk7CisJCW1hcC5wdXQobmV3IERvdWJsZSg0NS4wKSwgbmV3IEludGVnZXIoMCkpOworCQltYXAucHV0KG5ldyBEb3VibGUoMjIuNSksIG5ldyBJbnRlZ2VyKDApKTsKKwkJbWFwLnB1dChuZXcgRG91YmxlKDExLjI1KSwgbmV3IEludGVnZXIoMCkpOworCQltYXAucHV0KG5ldyBEb3VibGUoNS41MTI1KSwgbmV3IEludGVnZXIoMCkpOworCQltYXAucHV0KG5ldyBEb3VibGUoMi4wKSwgbmV3IEludGVnZXIoMCkpOworCQltYXAucHV0KG5ldyBEb3VibGUoMS41KSwgbmV3IEludGVnZXIoMCkpOworCQltYXAucHV0KG5ldyBEb3VibGUoMS4wKSwgbmV3IEludGVnZXIoMCkpOworCQltYXAucHV0KG5ldyBEb3VibGUoMC43NSksIG5ldyBJbnRlZ2VyKDApKTsKKwkJbWFwLnB1dChuZXcgRG91YmxlKDAuNSksIG5ldyBJbnRlZ2VyKDApKTsKKwkJbWFwLnB1dChuZXcgRG91YmxlKDAuMjUpLCBuZXcgSW50ZWdlcigwKSk7CisJCW1hcC5wdXQobmV3IERvdWJsZSgwLjE1KSwgbmV3IEludGVnZXIoMCkpOworCQltYXAucHV0KG5ldyBEb3VibGUoMC4wNSksIG5ldyBJbnRlZ2VyKDApKTsKKwl9CisKKwkvKioKKwkgKiBQZXJmb3JtIG9ubHkgdGhlIGZpcnN0IGl0ZXJhdGlvbiBvZiBkb3duIHNhbXBsaW5nLgorCSAqIAorCSAqLworCXByb3RlY3RlZCB2b2lkIHByb2Nlc3MoKSB7CisKKwkJLy8gQSB3cml0ZXIgZm9yIHRoZSBuZXcgZmlsZSB3ZSBhcmUgY3JlYXRpbmcuCisJCVByaW50V3JpdGVyIGdtbEZpbGUgPSBudWxsOworCisJCS8vIEEgd3JpdGVyIGZvciB0aGUgcmVkdWNlZCBkYXRhIGZpbGUuCisJCVByaW50V3JpdGVyIHJlZHVjZWRGaWxlID0gbnVsbDsKKworCQkvLyBPYmplY3QgaG9sZGluZyBJU08zMTY2LTEgcmVsYXRlZCBkYXRhLgorCQlJU09Db2RlMSBpc29Db2RlID0gbnVsbDsKKworCQkvLyBOYW1lIG9mIHRoZSBuZXcgcHJvcGVydGllcyBmaWxlLgorCQlTdHJpbmcgZmlsZU5hbWUgPSBudWxsOworCisJCS8vIE5hbWUgb2YgdGhlIG5ldyByZWR1Y2VkIGRhdGEgZmlsZS4KKworCQkvLyBBIGxpc3QgZm9yIElTTyAzMTY2LTIgb2JqZWN0cworCQlMaXN0IGlzbzJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisJCS8vIEZpbGVuYW1lcyBmb3IgbGV4MSBhbmQgbGV4MiBmaWxlcyBmb3IgYSBnaXZlbiBjb3VudHJ5LgorCQlTdHJpbmcgbGV4QWRtaW4xRmlsZSA9IG51bGw7CisJCVN0cmluZyBsZXhBZG1pbjJGaWxlID0gbnVsbDsKKworCQkvLyBMaXN0cyBob2xkaW5nIHRoZSBsZXgxIGFuZCBsZXgyIHZhbHVlcy4KKwkJLy8gTk9URTogbGV4IHZhbHVlcyBhcmUgdGhlIGxleGljb2dyYXBoaWNhbGx5IHNvcnRlZCB2YWx1ZXMgZm9yCisJCS8vIGFkbWluaXN0cmF0aW9uIGxldmVscy4KKwkJTGlzdDxTdHJpbmc+IGxleDFEYXRhU2V0ID0gbnVsbDsKKwkJTGlzdDxTdHJpbmc+IGxleDJEYXRhU2V0ID0gbnVsbDsKKworCQkvLyBMaXN0cyBmb3IgaG9sZGluZyBsZXgxIGFuZCBsZXgyIG9iamVjdHMgZm9yIGEgZ2l2ZW4gY291bnRyeS4KKwkJTGlzdDxMZXgxT2JqPiBsZXgxTGlzdCA9IG51bGw7CisJCUxpc3Q8TGV4Mk9iaj4gbGV4Mkxpc3QgPSBudWxsOworCisJCWludCBzaXplID0gdGFyZ2V0TGlzdC5zaXplKCk7CisKKwkJLy8gSXRlcmF0ZSBmb3IgZXZlcnkgY291bnRyeSBhbmQgY3JlYXRlIGl0cyBHTUwgZGF0YSBmaWxlLgorCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCisJCQkvLyBHZXQgdGhlIG5leHQgY291bnRyeSBpbiB0aGUgbGlzdC4KKwkJCVN0cmluZyBmaWxlID0gKChTdHJpbmcpIHRhcmdldExpc3QuZ2V0KGkpKS50cmltKCk7CisKKwkJCS8vIEFuIGluZGV4IGZvciB1bmtud29uIG9yIG4uYS4gZW50cmllcworCQkJaW50IHVua0NvdW50ZXIgPSAxOworCisJCQkvLyBXZSB1c2UgdGhpcyBsaXN0IHRvIGtlZXAgdHJhY2sgb2YgZHVwbGljYXRlZCBwb2x5Z29ucy4KKwkJCUxpc3Q8U1RFTVBvbHlnb24+IHBvbHlnb25zID0gbnVsbDsKKworCQkJLy8gT3BlbiB0aGUgZGF0YSBzb3VyY2UgZmlsZSBmb3IgdGhpcyBjb3VudHJ5LgorCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gR2VuVXRpbHMub3BlblJlYWRlcihmaWxlKTsKKworCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRcdDw8PDwgU0lOR0xFIFBBU1MgRE9XTiBTQU1QTEVSIC0tIFByb2Nlc3NpbmcgY291bnRyeSA6ICIgKyBmaWxlICsgIiA+Pj4+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQ8PDw8IFBhc3MgMSA+Pj4+Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJdHJ5IHsKKworCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgeworCisJCQkJCVN0cmluZyBidWZmZXIgPSBudWxsOworCQkJCQkvLyBEZXNjcmliZXMgbGV2ZWwgb2YgZGF0YSB3ZQorCQkJCQkvLyBhcmUgbm93IHByb2Nlc3NpbmcgOiBMRVZFTDAsIExFVkVMMSwgb3IgTEVWRUwyLgorCQkJCQlpbnQgbGV2ZWwgPSAtMTsKKworCQkJCQkvLyBSZWNvcmQgdGhlIHByZXZpb3VzIHR5cGUuCisJCQkJCWludCBvbGRsZXZlbCA9IGxldmVsIC0gMTsKKworCQkJCQkvLyBVc2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBzaW1wbGUgcG9seWdvbiBhbmQgaXNsYW5kcworCQkJCQkvLyBvZiBwb2x5Z29ucy4gSW5pdGlhbGl6ZSBzdHJpbmcgdG8gdGhlIGJsYW5rIGNoYXJhY3Rlci4KKwkJCQkJU3RyaW5nIGlzbGFuZCA9ICIgIjsgLy8kTk9OLU5MUy0xJAorCisJCQkJCXdoaWxlIChHZW5VdGlscy5FT0YoYnVmZmVyID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IHRydWUpIHsKKworCQkJCQkJLy8gVGhlIGRhdGEgd2Ugd2FudCB0byB3cml0ZSB0byB0aGUgbmV3IEdNTCBmaWxlLgorCQkJCQkJU3RyaW5nIG91dHB1dCA9ICIgIjsgLy8kTk9OLU5MUy0xJAorCisJCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBtYXJrIGFsbCB1bmtub3duIGRhdGEuCisJCQkJCQlidWZmZXIgPSBidWZmZXIucmVwbGFjZSgiLCwiLCAiLFVOS05PV04sIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQkJCQkvLyBXZSB0YWtlIGEgY2h1bmsgb2YgdGhlIGRhdGEgW0JVRkZFUl9NSU4sQlVGRkVSX01BWF0KKwkJCQkJCS8vIHRvIG1ha2UgcHJvY2Vzc3NpbmcgbW9yZQorCQkJCQkJLy8gZWZmaWNpZW50LCB3ZSBkb250IG5lZWQgYWxsIG9mIGl0LgorCQkJCQkJaW50IEJVRkZFUl9NSU4gPSAwOworCQkJCQkJaW50IEJVRkZFUl9NQVggPSAxMjU7CisKKwkJCQkJCVN0cmluZ1tdIGl0ZW1zID0gR2VuVXRpbHMKKwkJCQkJCQkJLmV4dHJhY3QoYnVmZmVyLmxlbmd0aCgpIDwgQlVGRkVSX01BWCA/IGJ1ZmZlcgorCQkJCQkJCQkJCTogYnVmZmVyLnN1YnN0cmluZyhCVUZGRVJfTUlOLAorCQkJCQkJCQkJCQkJQlVGRkVSX01BWCkpOworCisJCQkJCQkvLyBHZXQgdGhlIGNvdW50cnkgbmFtZQorCQkJCQkJU3RyaW5nIGNvdW50cnkgPSBpdGVtc1tJU09EYXRhLkNPVU5UUllfTkFNRV07CisKKwkJCQkJCS8vIEdldCB0aGUgSVNPMzE2Ni0xIGluZm8gZm9yIHRoaXMgY291bnRyeQorCQkJCQkJaWYgKGlzb0NvZGUgPT0gbnVsbCkgeworCQkJCQkJCWlzb0NvZGUgPSBHZW5VdGlscy5nZXRJU09Db2RlKGNvdW50cnksIGNvZGVMaXN0KTsKKwkJCQkJCX0KKworCQkJCQkJLy8gR2V0IHRoZSB0eXBlIG9mIHRoZSBkYXRhIHdlIGFyZSBwcm9jZXNzaW5nLgorCQkJCQkJbGV2ZWwgPSBHZW5VdGlscy5nZXRMZXZlbChpdGVtcyk7CisKKwkJCQkJCWlmIChsZXZlbCAhPSAwICYmIGlzbzJMaXN0ICE9IG51bGwpIHsKKwkJCQkJCQkvLyBMb2FkIHRoZSBJU08gMzE2Ni0yIG9iamVjdHMgZm9yIHRoaXMgY291bnRyeQorCQkJCQkJCWlzbzJMaXN0ID0gR2VuVXRpbHMubG9hZElTTzIoaXNvMzE2Nl8yKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gVGhpcyB2YXJpYWJsZSBpbmRpY2F0ZXMgYSB0cmFuc2l0aW9uIGluIG91ciBkYXRhCisJCQkJCQkvLyBwcm9jZXNzaW5nCisJCQkJCQlib29sZWFuIHRyYW5zaXRpb24gPSAobGV2ZWwgIT0gb2xkbGV2ZWwpID8gdHJ1ZSA6IGZhbHNlOworCisJCQkJCQkvLyBUaGUgY3VycmVudCBlbnRpdHkgd2UgYXJlIGRlYWxpbmcgd2l0aC4KKwkJCQkJCS8vIEJhc2VkIG9uIGl0cyBhZG1pbiBsZXZlbCBpdCBjYW4gYmUgYSBjb3VudHJ5LCBhCisJCQkJCQkvLyBjb3VudHksIGV0YzsKKwkJCQkJCVN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworCQkJCQkJLy8gRGVzY3JpcHRvciBmb3IgY3VycmVudCBlbnRyeS4KKwkJCQkJCVN0cmluZyBkZXNjcmlwdG9yID0gbnVsbDsKKworCQkJCQkJaWYgKHRyYW5zaXRpb24gPT0gdHJ1ZSkgeworCQkJCQkJCS8vIFVzZSBwcmV2aW91cyBsZXZlbCB0byBkZXRlY3QgdHJhbnNpdGlvbnMuCisJCQkJCQkJb2xkbGV2ZWwgPSBsZXZlbDsKKworCQkJCQkJCS8vIFJlc2V0IHRoZSBwcmV2aW91cyBlbnRpdHkKKwkJCQkJCQlpc2xhbmQgPSAiICI7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJCS8vIFJlc2V0IGNvdW50ZXIgb2YgVU5LTk9XTiBhbmQgTi5BLiBlbnRyaWVzLgorCQkJCQkJCXVua0NvdW50ZXIgPSAxOworCQkJCQkJCS8vIENsb3NlIHRoZSBwcmV2aW91cyBmaWxlCisJCQkJCQkJaWYgKGdtbEZpbGUgIT0gbnVsbCkgeworCQkJCQkJCQlvdXRwdXQgPSBjbG9zZVBvbHlnb25Jc2xhbmRUYWdzKCk7CisJCQkJCQkJCW91dHB1dCArPSBnZXRDbG9zaW5nVGFncygpOworCQkJCQkJCQlHZW5VdGlscy5hZGREYXRhKGdtbEZpbGUsIG91dHB1dCk7CisJCQkJCQkJCWdtbEZpbGUuY2xvc2UoKTsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBDbGVhciB0aGUgbGlzdCBvZiB1bmlxdWUgcG9seWdvbnMKKwkJCQkJCQlpZiAocG9seWdvbnMgIT0gbnVsbCkgeworCQkJCQkJCQlwb2x5Z29ucy5jbGVhcigpOworCQkJCQkJCX0KKworCQkJCQkJCS8vIEdldCBhIG5ldywgZW1wdHkgcG9seWdvbiBsaXN0CisJCQkJCQkJcG9seWdvbnMgPSBuZXcgQXJyYXlMaXN0PFNURU1Qb2x5Z29uPigpOworCisJCQkJCQkJLy8gSWYgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCBmb3IgdGhpcyBjb3VudHJ5LAorCQkJCQkJCS8vIGNyZWF0ZSBpdCB1c2luZyBJU08gYWxwaGEzIGNvZGUuCisJCQkJCQkJRmlsZSBjb3VudHJ5RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyCisJCQkJCQkJCQkrIGlzb0NvZGUuZ2V0QWxwaGEzKCkpOworCisJCQkJCQkJaWYgKGNvdW50cnlEaXIgIT0gbnVsbAorCQkJCQkJCQkJJiYgY291bnRyeURpci5leGlzdHMoKSA9PSBmYWxzZSkgeworCQkJCQkJCQkvLyBEaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuIENyZWF0ZSBpdC4KKwkJCQkJCQkJY291bnRyeURpci5ta2RpcigpOworCQkJCQkJCX0KKworCQkJCQkJCS8vIE9wZW4gdGhlIHdyaXRlciBmb3IgdGhlIHJlZHVjZWQgZGF0YSBmaWxlCisJCQkJCQkJaWYgKHJlZHVjZWRGaWxlID09IG51bGwpIHsKKwkJCQkJCQkJLy8gTmFtZSBmb3IgdGhlIHJlZHVjZWQgZGF0YSBmaWxlLgorCQkJCQkJCQlmaWxlTmFtZSA9IGNvdW50cnlEaXIKKwkJCQkJCQkJCQkrICJcXCIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgaXNvQ29kZS5nZXRBbHBoYTMoKQorCQkJCQkJCQkJCSsgIl9SRURVQ0VEXzEudHh0IjsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlyZWR1Y2VkRmlsZSA9IEdlblV0aWxzLm9wZW5Xcml0ZXIoZmlsZU5hbWUpOworCQkJCQkJCX0KKworCQkJCQkJCS8vIENyZWF0ZSB0aGUgZmlsZSBuYW1lIGZvciB0aGUgcmVkdWNlZCBHTUwgZmlsZS4KKwkJCQkJCQlmaWxlTmFtZSA9IGNvdW50cnlEaXIgKyAiXFwiICsgaXNvQ29kZS5nZXRBbHBoYTMoKSAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkrICJfIiArIGxldmVsICsgIl9SRURVQ0VEX01BUF8xLnhtbCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQkJCQkJLy8gT3BlbiB0aGUgd3JpdGVyIGZvciB0aGUgbmV3IEdNTCBmaWxlCisJCQkJCQkJZ21sRmlsZSA9IEdlblV0aWxzLm9wZW5Xcml0ZXIoZmlsZU5hbWUpOworCisJCQkJCQkJLy8gQWRkIHRoZSBoZWFkZXIgb2YgdGhlIGZpbGUKKwkJCQkJCQlvdXRwdXQgPSBnZXRPcGVuaW5nVGFncyhpc29Db2RlLCBsZXZlbCk7CisKKwkJCQkJCQkvLyBXcml0ZSBkYXRhCisJCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShnbWxGaWxlLCBvdXRwdXQudHJpbSgpKTsKKworCQkJCQkJfSAvLyBpZiggdHJhbnNpdGlvbiA9PSB0cnVlICkKKworCQkJCQkJc3dpdGNoIChsZXZlbCkgeworCisJCQkJCQljYXNlIERhdGFUeXBlcy5MRVZFTF8wOgorCQkJCQkJCWN1cnJlbnQgPSBpc29Db2RlLmdldEFscGhhMygpOworCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlIERhdGFUeXBlcy5MRVZFTF8xOgorCQkJCQkJCWN1cnJlbnQgPSBpdGVtc1tJU09EYXRhLkFETUlOMV9OQU1FXS50b1VwcGVyQ2FzZSgpOworCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlIERhdGFUeXBlcy5MRVZFTF8yOgorCQkJCQkJCWN1cnJlbnQgPSBpdGVtc1tJU09EYXRhLkFETUlOMl9OQU1FXS50b1VwcGVyQ2FzZSgpOworCQkJCQkJCWJyZWFrOworCisJCQkJCQl9IC8vIHN3aXRjaAorCisJCQkJCQkvLyBIYW5kbGUgVU5LTk9XTiBhbmQgTi5BLiBlbnRyaWVzIGRpZmZlcmVudGx5LgorCQkJCQkJaWYgKGN1cnJlbnQuZXF1YWxzKCJVTktOT1dOIikgfHwgY3VycmVudC5lcXVhbHMoIk4uQS4iKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJCQkJCWlmIChsZXZlbCA9PSAxKSB7CisJCQkJCQkJCWN1cnJlbnQgPSBpc29Db2RlLmdldEFscGhhMigpICsgIi1VTkstIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBTdHJpbmcudmFsdWVPZih1bmtDb3VudGVyKyspOworCisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLy8gTGV2ZWwgMiBkYXRhLgorCQkJCQkJCQljdXJyZW50ID0gaXNvQ29kZS5nZXRBbHBoYTMoKSArICIuTDIuIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyBTdHJpbmcudmFsdWVPZih1bmtDb3VudGVyKyspOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJLy8gV2UgZ2V0IHRoZSBkZXNjcmlwdG9yIGZvciBhZG1pbmlzdHJhdGlvbiBlbnRpdGllcworCQkJCQkJLy8gZGlmZmVyZW50bHkgYmFzZWQgb24gaXRzIGxldmVsLgorCisJCQkJCQlpZiAobGV2ZWwgPT0gMikgeworCisJCQkJCQkJaWYgKGxleDFEYXRhU2V0ID09IG51bGwgJiYgbGV4MkRhdGFTZXQgPT0gbnVsbCkgeworCisJCQkJCQkJCS8vIENvbXBvc2UgdGhlIGZpbGUgbmFtZXMgZm9yIHRoZSBsZXggZmlsZXMgZm9yCisJCQkJCQkJCS8vIHRoaXMKKwkJCQkJCQkJLy8gY291bnRyeS4KKwkJCQkJCQkJbGV4QWRtaW4xRmlsZSA9IGxleERpciArIGlzb0NvZGUuZ2V0QWxwaGEzKCkKKwkJCQkJCQkJCQkrICJcXCIgKyBpc29Db2RlLmdldEFscGhhMygpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCWxleEFkbWluMkZpbGUgPSBsZXhBZG1pbjFGaWxlOworCQkJCQkJCQlsZXhBZG1pbjFGaWxlICs9ICJfQURNSU4xX0xFWC50eHQiOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCWxleEFkbWluMkZpbGUgKz0gIl9BRE1JTjJfTEVYLnR4dCI7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJCQkvLyBMb2FkIHRoZSBsZXgxIGFuZCBsZXgyIGZpbGVzIGZvciB0aGlzCisJCQkJCQkJCS8vIGNvdW50cnkuCisJCQkJCQkJCWxleDFEYXRhU2V0ID0gR2VuVXRpbHMKKwkJCQkJCQkJCQkucG9wdWxhdGVMaXN0KGxleEFkbWluMUZpbGUpOworCQkJCQkJCQlsZXgyRGF0YVNldCA9IEdlblV0aWxzCisJCQkJCQkJCQkJLnBvcHVsYXRlTGlzdChsZXhBZG1pbjJGaWxlKTsKKworCQkJCQkJCQkvLyBDcmVhdGUgYSBtZXRob2QgdG8gc2VhcmNoIGZvciBhbiBpdGVtIG9uIGEKKwkJCQkJCQkJLy8gbGlzdCBvZiBsZXggZGF0YSBvYmplY3RzLgorCQkJCQkJCQlsZXgxTGlzdCA9IEdlblV0aWxzLmNyZWF0ZUxleDFMaXN0KGxleDFEYXRhU2V0KTsKKwkJCQkJCQkJbGV4Mkxpc3QgPSBHZW5VdGlscy5jcmVhdGVMZXgyTGlzdChsZXgyRGF0YVNldCk7CisKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBDb21wb3NlIHRoZSBsZXZlbDIgZGVzY3JpcHRvciB1c2luZyB0aGUgbGV4IGRhdGE6CisKKwkJCQkJCQkvLyBTVEVQIDE6IERvIGEgbG9vayB1cCBpbiB0aGUgbGV4IDIgbGlzdHMuCisKKwkJCQkJCQkvLyBHZXQgdGhlIGxleCAyIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgZW50cnkuCisJCQkJCQkJTGV4Mk9iaiBsZXgyQ3VycmVudCA9IEdlblV0aWxzLmxleDJMb29rdXAobGV4Mkxpc3QsCisJCQkJCQkJCQlpdGVtc1tJU09EYXRhLkFETUlOMV9OQU1FXSwgY3VycmVudCk7CisKKwkJCQkJCQkvLyBHZXQgdGhlIGxleDFPYmplY3QgdG8gd2hpY2ggbGV4MkN1cnJlbnQgYmVsb25ncworCQkJCQkJCUxleDFPYmogbGV4MUN1cnJlbnQgPSBHZW5VdGlscy5sZXgxTG9va3VwKGxleDFMaXN0LAorCQkJCQkJCQkJbGV4MkN1cnJlbnQuZ2V0QWRtaW4xKCkpOworCisJCQkJCQkJaWYgKGxleDFDdXJyZW50LmdldERlc2NyaXB0b3IoKS5jb250YWlucygiVVMtIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkvLyBTVEVQIDI6IHBpZWNlIHRvZ2V0aGVyIHRoZSBJRCB1c2luZyB0aGUKKwkJCQkJCQkJLy8gcHJvcGVyIGxleCBvYmplY3RzIDogdGhlIFVTQSBpcyBhIHNwZWNpYWwKKwkJCQkJCQkJLy8gY2FzZQorCQkJCQkJCQlkZXNjcmlwdG9yID0gR2VuVXRpbHMuZ2V0VVNBRGVzY3JpcHRvcigKKwkJCQkJCQkJCQlsZXgyQ3VycmVudC5nZXRBZG1pbjIoKSwgR2VuVXRpbHMKKwkJCQkJCQkJCQkJCS5leHRyYWN0QWxwaGEyKGxleDFDdXJyZW50CisJCQkJCQkJCQkJCQkJCS5nZXREZXNjcmlwdG9yKCkpLAorCQkJCQkJCQkJCXVzYURlc2NyaXB0b3JMaXN0KTsKKworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8vIFNURVAgMjogcGllY2UgdG9nZXRoZXIgdGhlIElEIHVzaW5nIHRoZQorCQkJCQkJCQkvLyBwcm9wZXIgbGV4IG9iamVjdHMuCisJCQkJCQkJCWRlc2NyaXB0b3IgPSBsZXgxQ3VycmVudC5nZXREZXNjcmlwdG9yKCkKKwkJCQkJCQkJCQkrICItRyIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgbGV4MUN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXgoKQorCQkJCQkJCQkJCSsgbGV4MkN1cnJlbnQuZ2V0Rm9ybWF0dGVkSW5kZXgoKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoY3VycmVudC5jb250YWlucygiLkwyLiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJY3VycmVudCA9IGRlc2NyaXB0b3I7CisJCQkJCQkJfQorCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIENvbXBvc2UgZGVzY3JpcHRvciBmb3IgbCAxIGFuZCBsIDAgZGF0YQorCQkJCQkJCS8vIEdldCB0aGUgZGVzY3JpcHRvciBmb3IgdGhpcyBlbnRpdHkuCisJCQkJCQkJZGVzY3JpcHRvciA9IEdlblV0aWxzLmdldElTTzJEZXNjcmlwdG9yKGlzbzJMaXN0LAorCQkJCQkJCQkJY3VycmVudCwgaXNvQ29kZS5nZXRBbHBoYTIoKSk7CisKKwkJCQkJCQkvLyBJZiB3ZSBjYW50IGZpbmQgdGhlIGRlc2NyaXB0b3IsIHRoZW4gbG9vayBpbiB0aGUKKwkJCQkJCQkvLyBmaXggbGlzdC4KKwkJCQkJCQlpZiAoZGVzY3JpcHRvci5lcXVhbHMoY3VycmVudCkgPT0gdHJ1ZSkgeworCQkJCQkJCQkvLyBMb29rIGZvciBhIGRlc2NyaXB0b3IgaW4gdGhlIGZpeCBmaWxlCisJCQkJCQkJCWRlc2NyaXB0b3IgPSBHZW5VdGlscy5nZXRGaXhDb2RlKGNvZGVmaXhMaXN0LAorCQkJCQkJCQkJCWN1cnJlbnQsIGl0ZW1zW0lTT0RhdGEuQ09VTlRSWV9OQU1FXSk7CisJCQkJCQkJfQorCisJCQkJCQl9CisKKwkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRGVzY3JpcHRvciBpcyA6ICIgKyBkZXNjcmlwdG9yCisJCQkJCQkvLyArICIgYXQgbGV2ZWwgOiAiICsgbGV2ZWwgKyAiIGZvciAiICsgY3VycmVudCk7CisKKwkJCQkJCS8vIENyZWF0ZSBhIFNURU0gcG9seWdvbiB3aXRoIHRoaXMgcG9seWdvbiBkYXRhCisJCQkJCQlTVEVNUG9seWdvbiBwb2x5Z29uID0gbmV3IFNURU1Qb2x5Z29uKGJ1ZmZlciwgbGV2ZWwpOworCisJCQkJCQkvLyBDaGVjayB0aGF0IHRoaXMgaXMgaW5kZWVkIGEgU1RFTSBwb2x5Z29uCisJCQkJCQlpZiAoaXNQb2x5Z29uKHBvbHlnb24pICE9IHRydWUpIHsKKwkJCQkJCQkvLyBOb3QgYSBwb2x5Z29uLCBpZ25vcmUuCisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisKKwkJCQkJCS8vIENvbXB1dGUgYSBtYXAgb2YgYW5nbGUgdmFsdWVzLgorCQkJCQkJTGlzdDxTdHJpbmc+IHBvaW50RGF0YUxpc3QgPSBjb21wdXRlSW52ZXJzZUNvc2luZXMocG9seWdvbik7CisKKwkJCQkJCS8vIE5vdyBhcHBseSByZWR1Y3Rpb24gOiBnZXQgcmlkIG9mIGFsbCBwb2ludHMgd2l0aAorCQkJCQkJLy8gYW5nbGVzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBhbHBoYSBkZWdyZWVzCisJCQkJCQlkb3VibGUgYWxwaGEgPSBEb3VibGUucGFyc2VEb3VibGUodGhyZXNob2xkKTsKKwkJCQkJCUxpc3Q8U3RyaW5nPiByZWR1Y2VkUG9pbnREYXRhTGlzdCA9IHJlZHVjZShhbHBoYSwKKwkJCQkJCQkJcG9pbnREYXRhTGlzdCk7CisKKwkJCQkJCS8vIFVwZGF0ZSBHbG9iYWwgU3RhdHMgd2l0aCByZXN1bHRzL2RhdGEgZnJvbSB0aGUKKwkJCQkJCS8vIHJlZHVjdGlvbi4KKwkJCQkJCXVwZGF0ZUdsb2JhbFN0YXRzKHBvaW50RGF0YUxpc3Quc2l6ZSgpLAorCQkJCQkJCQlyZWR1Y2VkUG9pbnREYXRhTGlzdC5zaXplKCkpOworCisJCQkJCQkvLyBTaG93IHNvbWUgb2YgdGhlIHN0YXRzIGFmdGVyIGVhY2ggcmVkdWN0aW9uLgorCQkJCQkJLy8gc2hvd1N0YXRzKHBvaW50RGF0YUxpc3QsIHJlZHVjZWRQb2ludERhdGFMaXN0LCAxKTsKKworCQkJCQkJLy8gUHV0IGFsbCB0aGUgcmVtYWluaW5nIHBvaW50cyBpbnRvIGEgbmV3IGJ1ZmZlcgorCQkJCQkJU3RyaW5nIHJlZHVjZWRQb2x5Z29uRGF0YUJ1ZmZlciA9IGV4dHJhY3RMaXN0SW50b1N0cmluZyhyZWR1Y2VkUG9pbnREYXRhTGlzdCk7CisKKwkJCQkJCS8vIFJlY29uc3RydWN0IGEgYnVmZmVyIHdpdGggdGhlIHJlZHVjZWQgcG9pbnQtZGF0YS4KKworCQkJCQkJLy8gRXh0cmFjdCBhbGwgZGF0YSBmcm9tIG9sZCBidWZmZXIgZXhjZXB0IHRoZSBwb2x5Z29uCisJCQkJCQkvLyBkYXRhIDoKKwkJCQkJCVN0cmluZyBub25Qb2x5Z29uRGF0YUJ1ZmZlciA9IGV4dHJhY3ROb25Qb2x5Z29uRGF0YSgKKwkJCQkJCQkJYnVmZmVyLmxlbmd0aCgpIDwgQlVGRkVSX01BWCA/IGJ1ZmZlciA6IGJ1ZmZlcgorCQkJCQkJCQkJCS5zdWJzdHJpbmcoQlVGRkVSX01JTiwgQlVGRkVSX01BWCksCisJCQkJCQkJCWxldmVsKTsKKworCQkJCQkJLy8gTm93IHB1dCB0b2dldGhlciBhIG5ldyBidWZmZXIgd2hpY2ggaGFzIGJlZW4gcmVkdWNlZAorCQkJCQkJU3RyaW5nIHJlZHVjZWRCdWZmZXIgPSBub25Qb2x5Z29uRGF0YUJ1ZmZlcgorCQkJCQkJCQkrIHJlZHVjZWRQb2x5Z29uRGF0YUJ1ZmZlciArICJcbiI7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJLy8gV3JpdGUgcmVkdWNlZCBkYXRhIGJ1ZmZlciBpbnRvIHRoZSByZWR1Y2VkIGRhdGEgZmlsZQorCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShyZWR1Y2VkRmlsZSwgcmVkdWNlZEJ1ZmZlcik7CisKKwkJCQkJCS8vIERlbGV0ZSB0aGUgb2xkIHBvbHlnb24KKwkJCQkJCXBvbHlnb24uY2xlYXIoKTsKKwkJCQkJCXBvbHlnb24gPSBudWxsOworCisJCQkJCQkvLyBDcmVhdGUgYSBuZXcsIHJlZHVjZWQgU1RFTSBwb2x5Z29uIHdpdGggdGhlIG5ldyBkYXRhCisJCQkJCQkvLyBidWZmZXIKKwkJCQkJCXBvbHlnb24gPSBuZXcgU1RFTVBvbHlnb24ocmVkdWNlZEJ1ZmZlciwgbGV2ZWwpOworCisJCQkJCQkvLyBDaGVjayB0aGF0IHRoaXMgaXMgaW5kZWVkIGEgU1RFTSBwb2x5Z29uCisJCQkJCQlpZiAoaXNQb2x5Z29uKHBvbHlnb24pICE9IHRydWUpIHsKKwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHROb3QgYSBwb2x5Z29uISIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJLy8gTm90IGEgcG9seWdvbiwgaWdub3JlLgorCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCisJCQkJCQkvLyBXZSBrbm93IGl0IGlzIGEgcG9seWdvbiwgYnV0IG5vdyBjaGVjayB0aGF0IGl0cyBub3QKKwkJCQkJCS8vIGR1cGxpY2F0ZWQuCisJCQkJCQlpZiAoaXNQb2x5Z29uRHVwbGljYXRlZChwb2x5Z29ucy5pdGVyYXRvcigpLCBwb2x5Z29uKSA9PSB0cnVlKSB7CisJCQkJCQkJLy8gWWVzLCBpdCBpcyBkdXBsaWNhdGVkCisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisKKwkJCQkJCS8vIEFkZCB0aGlzIHBvbHlnb24gdG8gb3VyIGxpc3Qgb2YgdW5pcXVlIHBvbHlnb25zIHNvCisJCQkJCQkvLyB0aGF0IHdlIGNhbiBjaGVjayBkdXBsaWNhdGVzIG9mIHRoaXMgcG9seWdvbiBsYXRlci4KKwkJCQkJCXBvbHlnb25zLmFkZChwb2x5Z29uKTsKKworCQkJCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgcG9seWdvbiBpcyBwYXJ0IG9mIGFuIGlzbGFuZCBvZgorCQkJCQkJLy8gcG9seWdvbnMgb3IgYSBzaW1wbGUgcG9seWdvbgorCQkJCQkJaWYgKGxldmVsID09IDApIHsKKwkJCQkJCQkvLyBJZiB3ZSBhcmUgYXQgYWRtaW4gbGV2ZWwgMCBhbmQgaXNsYW5kIGlzIG5vdAorCQkJCQkJCS8vIE5VTEwsIHRoZW4gd2UgaGF2ZSBhbiBpc2xhbmQuCisJCQkJCQkJaWYgKGlzbGFuZC5lcXVhbHMoIiAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQkJCW91dHB1dCA9IG9wZW5Qb2x5Z29uSXNsYW5kVGFncyhkZXNjcmlwdG9yKTsKKwkJCQkJCQkJaXNsYW5kID0gIkFkbWluIExldmVsIDAiOyAvLyROT04tTkxTLTEkCisJCQkJCQkJfQorCQkJCQkJCW91dHB1dCArPSBhZGRMaW5lYXJSaW5nVGFncyhyZWR1Y2VkQnVmZmVyLCBsZXZlbCk7CisJCQkJCQl9IGVsc2UgeworCisJCQkJCQkJaWYgKGlzbGFuZC5lcXVhbHMoIiAiKSA9PSB0cnVlKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJb3V0cHV0ID0gb3BlblBvbHlnb25Jc2xhbmRUYWdzKGRlc2NyaXB0b3IpOworCQkJCQkJCQlvdXRwdXQgKz0gYWRkTGluZWFyUmluZ1RhZ3MocmVkdWNlZEJ1ZmZlciwKKwkJCQkJCQkJCQlsZXZlbCk7CisKKwkJCQkJCQl9IGVsc2UgeworCisJCQkJCQkJCWlmIChjdXJyZW50LmVxdWFscyhpc2xhbmQpID09IGZhbHNlKSB7CisJCQkJCQkJCQlvdXRwdXQgPSBjbG9zZVBvbHlnb25Jc2xhbmRUYWdzKCk7CisJCQkJCQkJCQlvdXRwdXQgKz0gb3BlblBvbHlnb25Jc2xhbmRUYWdzKGRlc2NyaXB0b3IpOworCQkJCQkJCQkJb3V0cHV0ICs9IGFkZExpbmVhclJpbmdUYWdzKHJlZHVjZWRCdWZmZXIsCisJCQkJCQkJCQkJCWxldmVsKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCW91dHB1dCA9IGFkZExpbmVhclJpbmdUYWdzKHJlZHVjZWRCdWZmZXIsCisJCQkJCQkJCQkJCWxldmVsKTsKKwkJCQkJCQkJCUdlblV0aWxzLmFkZERhdGEoZ21sRmlsZSwgb3V0cHV0LnRyaW0oKSk7CisJCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCXN3aXRjaCAobGV2ZWwpIHsKKworCQkJCQkJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzE6CisJCQkJCQkJCWlzbGFuZCA9IGl0ZW1zW0lTT0RhdGEuQURNSU4xX05BTUVdCisJCQkJCQkJCQkJLnRvVXBwZXJDYXNlKCk7CisJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMjoKKwkJCQkJCQkJaXNsYW5kID0gaXRlbXNbSVNPRGF0YS5BRE1JTjJfTkFNRV0KKwkJCQkJCQkJCQkudG9VcHBlckNhc2UoKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCisJCQkJCQl9CisKKwkJCQkJCUdlblV0aWxzLmFkZERhdGEoZ21sRmlsZSwgb3V0cHV0LnRyaW0oKSk7CisKKwkJCQkJfSAvLyB3aGlsZSBsb29wCisKKwkJCQkJLy8gUmVzZXQgYWxsIGxleC1yZWxhdGVkIGl0ZW1zCisJCQkJCWlmIChsZXgxRGF0YVNldCAhPSBudWxsKSB7CisJCQkJCQlsZXgxRGF0YVNldC5jbGVhcigpOworCQkJCQkJbGV4MURhdGFTZXQgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgyRGF0YVNldCAhPSBudWxsKSB7CisJCQkJCQlsZXgyRGF0YVNldC5jbGVhcigpOworCQkJCQkJbGV4MkRhdGFTZXQgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgxTGlzdCAhPSBudWxsKSB7CisJCQkJCQlsZXgxTGlzdC5jbGVhcigpOworCQkJCQkJbGV4MUxpc3QgPSBudWxsOworCQkJCQl9CisJCQkJCWlmIChsZXgyTGlzdCAhPSBudWxsKSB7CisJCQkJCQlsZXgyTGlzdC5jbGVhcigpOworCQkJCQkJbGV4Mkxpc3QgPSBudWxsOworCQkJCQl9CisKKwkJCQkJbGV4QWRtaW4xRmlsZSA9IG51bGw7CisJCQkJCWxleEFkbWluMkZpbGUgPSBudWxsOworCisJCQkJCS8vIFdlIGRvbnQgbmVlZCB0aGUgSVNPIGNvZGUgb2JqZWN0IGZvciB0aGlzIGNvdW50cnkKKwkJCQkJLy8gYW55bW9yZSwgd2UgYXJlIGRvbmUgcHJvY2Vzc2luZyBpdC4KKwkJCQkJaXNvQ29kZSA9IG51bGw7CisKKwkJCQkJLy8gQ2xvc2UgYWxsIG9wZW4gcmVzb3VyY2VzLgorCQkJCQlyZWFkZXIuY2xvc2UoKTsKKworCQkJCQlpZiAoZ21sRmlsZSAhPSBudWxsKSB7CisJCQkJCQkvLyBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0CisJCQkJCQlHZW5VdGlscy5hZGREYXRhKGdtbEZpbGUsIGNsb3NlUG9seWdvbklzbGFuZFRhZ3MoKSk7CisJCQkJCQlHZW5VdGlscy5hZGREYXRhKGdtbEZpbGUsIGdldENsb3NpbmdUYWdzKCkpOworCQkJCQkJZ21sRmlsZS5jbG9zZSgpOworCQkJCQkJZ21sRmlsZSA9IG51bGw7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRHZW5lcmF0ZWQgOiAiICsgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCisJCQkJCQlmaWxlTmFtZSA9IG51bGw7CisJCQkJCX0KKworCQkJCQlpZiAocmVkdWNlZEZpbGUgIT0gbnVsbCkgeworCQkJCQkJcmVkdWNlZEZpbGUuY2xvc2UoKTsKKwkJCQkJCXJlZHVjZWRGaWxlID0gbnVsbDsKKwkJCQkJfQorCisJCQkJCS8vIFJ1biBnYXJiYWdlIGNvbGxlY3Rpb24KKwkJCQkJLy9TeXN0ZW0uZ2MoKTsKKwkJCQl9CisKKwkJCQkvLyBTaG93IGdsb2JhbCBzdGF0cworCQkJCXNob3dHbG9iYWxTdGF0cygpOworCisJCQkJLy8gTm93IGNsZWFyIHRoZSBoYXNoIG1hcAorCQkJCWluaXRIYXNoTWFwKGFuZ2xlVmFsdWVNYXApOworCisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKworCQl9CisKKwl9CisKKwkvKioKKwkgKiBFeHRyYWN0IGFsbCBub24gcG9seWdvbiBkYXRhIGZyb20gdGhlIGJ1ZmZlci4gQW1vdW50IG9mIG5vbiAtIHBvbHlnb24KKwkgKiBkYXRhIHZhcmllcyBhY2NvcmRpbmcgdG8gbGV2ZWwuCisJICogCisJICogQHBhcmFtIGJ1ZmZlcgorCSAqICAgICAgICAgICAgYSBidWZmZXIgb2YgZGl2YSBkYXRhLgorCSAqIAorCSAqIEBwYXJhbSBsZXZlbAorCSAqICAgICAgICAgICAgYWRtaW5pc3RyYXRpdmUgbGV2ZWwKKwkgKiAKKwkgKiBAcmV0dXJuIFN0cmluZyBhbGwgdGhlIG5vbi1wb2x5Z29uIGRhdGEuCisJICovCisJcHVibGljIFN0cmluZyBleHRyYWN0Tm9uUG9seWdvbkRhdGEoU3RyaW5nIGJ1ZmZlciwgaW50IGxldmVsKSB7CisKKwkJaW50IG9mZnNldCA9IDA7CisKKwkJc3dpdGNoIChsZXZlbCkgeworCisJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzA6CisJCQlvZmZzZXQgPSAyOworCQkJYnJlYWs7CisKKwkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMToKKwkJCW9mZnNldCA9IDM7CisJCQlicmVhazsKKworCQljYXNlIERhdGFUeXBlcy5MRVZFTF8yOgorCQkJb2Zmc2V0ID0gNDsKKwkJCWJyZWFrOworCisJCX0KKworCQkvLyBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBjb21tYSBzZXBhcmF0b3IKKwkJaW50IGJlZ2luSW5kZXggPSBidWZmZXIuaW5kZXhPZigiLCIpOyAvLyROT04tTkxTLTEkCisJCWludCBlbmRJbmRleCA9IGJlZ2luSW5kZXg7CisKKwkJaW50IGkgPSAxOworCisJCXdoaWxlIChpIDwgb2Zmc2V0KSB7CisJCQllbmRJbmRleCA9IGJ1ZmZlci5pbmRleE9mKCIsIiwgYmVnaW5JbmRleCArIDEpOyAvLyROT04tTkxTLTEkCisJCQliZWdpbkluZGV4ID0gZW5kSW5kZXg7CisJCQlpKys7CisJCX0KKworCQliZWdpbkluZGV4ID0gMDsKKworCQkvLyBleHRyYWN0IHRoZSBzZXF1ZW5jZSB1cCB0byBpbmRleAorCQlyZXR1cm4gYnVmZmVyLnN1YnN0cmluZyhiZWdpbkluZGV4LCBlbmRJbmRleCArIDEpOworCisJfQorCisJLyoqCisJICogRmluZCBhbmQgc2hvdyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgbm9ybWFsIHBvaW50LWRhdGEgbGlzdCBhbmQgdGhlCisJICogcmVkdWNlZCBwb2ludC1kYXRhIGxpc3QuCisJICogCisJICogQHBhcmFtIG5vcm1hbExpc3QgLQorCSAqICAgICAgICAgICAgYSBsaXN0IHdpdGggdGhlIG9yaWdpbmFsIHBvaW50IGRhdGEKKwkgKiBAcGFyYW0gcmVkdWNlZExpc3QgLQorCSAqICAgICAgICAgICAgYSBsaXN0IHdpdGggdGhlIHJlZHVjZWQgcG9pbnQgZGF0YQorCSAqIAorCSAqIEBwYXJhbSBwYXNzIC0KKwkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBhc3Mgb3IgaXRlcmF0aW9uCisJICogCisJICovCisJcHVibGljIHZvaWQgc2hvd1N0YXRzKExpc3Q8U3RyaW5nPiBub3JtYWxMaXN0LCBMaXN0PFN0cmluZz4gcmVkdWNlZExpc3QsCisJCQlpbnQgcGFzcykgeworCisJCS8vIGRvdWJsZSBub3JtYWxTaXplID0gbm9ybWFsTGlzdC5zaXplKCk7CisJCS8vIGRvdWJsZSByZWR1Y2VkU2l6ZSA9IHJlZHVjZWRMaXN0LnNpemUoKTsKKwkJLy8gZG91YmxlIGRpZiA9IG5vcm1hbFNpemUgLSByZWR1Y2VkU2l6ZTsKKwkJLy8gZG91YmxlIHJhdGlvID0gZGlmIC8gbm9ybWFsU2l6ZTsKKwkJLy8gZG91YmxlIHBlcmNlbnQgPSByYXRpbyAqIDEwMC4wOworCisJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCoqKioqKioqKioqKiBET1dOIFNBTVBMSU5HIFNUQVRTIEZPUiAiICsgcGFzcyAvLyROT04tTkxTLTEkCisJCQkJKyAiIElURVJBVElPTiAqKioqKioqKioqKipcbiIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gQ3JlYXRlIGFuZCBwcmludCBwcm9maWxlIG9mIHRoZSBhbmdsZSB2YWx1ZXMKKwkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0UHJvZmlsaW5nIHJlc3VsdHMgQkVGT1JFIHJlZHVjdGlvbiA6IFxuXG4iKTsgLy8kTk9OLU5MUy0xJAorCisJCXByb2ZpbGUobm9ybWFsTGlzdCk7CisJCXNob3dQcm9maWxlKCk7CisKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbCBwb2ludHMgaW4gb3JpZ2luYWwgcG9seWdvbiA6ICIKKwkJLy8gKyBub3JtYWxMaXN0LnNpemUoKSk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgcG9pbnRzIGluIHJlZHVjZWQgcG9seWdvbiA6ICIKKwkJLy8gKyByZWR1Y2VkTGlzdC5zaXplKCkpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIHBvaW50cyBtYXJrZWQgZm9yIGRlbGV0aW9uIDogIiArIGRpZik7CisJCS8vCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUGVyY2VudGFnZSBvZiByZWR1Y3Rpb24gOiAiICsgcGVyY2VudCArICIlIik7CisJCS8vCisJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFByb2ZpbGluZyByZXN1bHRzIEFGVEVSIHJlZHVjdGlvbiA6IFxuXG4iKTsgLy8kTk9OLU5MUy0xJAorCisJCXByb2ZpbGUocmVkdWNlZExpc3QpOworCQlzaG93UHJvZmlsZSgpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG5cbiIpOyAvLyROT04tTkxTLTEkCisKKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgZ2xvYmFsIHN0YXRzLgorCSAqIAorCSAqIEBwYXJhbSBub3JtYWxTaXplIC0KKwkgKiAgICAgICAgICAgIHRoZSB0b3RhbCBudW1iZXIgb2YgcG9pbnRzIGJlZm9yZSByZWR1Y3Rpb24KKwkgKiAKKwkgKiBAcGFyYW0gcmVkdWNlZFNpemUgLQorCSAqICAgICAgICAgICAgdGhlIHRvdGFsIG51bWJlciBvZiBwb2ludHMgYWZ0ZXIgcmVkdWN0aW9uCisJICogCisJICovCisJcHVibGljIHZvaWQgdXBkYXRlR2xvYmFsU3RhdHMoZG91YmxlIG5vcm1hbFNpemUsIGRvdWJsZSByZWR1Y2VkU2l6ZSkgeworCisJCWRvdWJsZSBkaWYgPSBub3JtYWxTaXplIC0gcmVkdWNlZFNpemU7CisJCWRvdWJsZSByYXRpbyA9IGRpZiAvIG5vcm1hbFNpemU7CisJCWRvdWJsZSBwZXJjZW50ID0gcmF0aW8gKiAxMDAuMDsKKworCQlnbG9iYWxNaW5QZXJjZW50ID0gKGdsb2JhbE1pblBlcmNlbnQgPiBwZXJjZW50KSA/IHBlcmNlbnQKKwkJCQk6IGdsb2JhbE1pblBlcmNlbnQ7CisKKwkJZ2xvYmFsTWF4UGVyY2VudCA9IChnbG9iYWxNYXhQZXJjZW50IDwgcGVyY2VudCkgPyBwZXJjZW50CisJCQkJOiBnbG9iYWxNYXhQZXJjZW50OworCisJCWdsb2JhbFBlcmNlbnQgKz0gcGVyY2VudDsKKworCQl0b3RhbFBvaW50cyArPSBub3JtYWxTaXplOworCisJCXRvdGFsUmVtb3ZlZCArPSByZWR1Y2VkU2l6ZTsKKworCQl0b3RhbFBvbHlnb25zICs9IDE7CisKKwl9CisKKwkvKioKKwkgKiBQcmludCB0aGUgZ2xvYmFsIHN0YXRzCisJICovCisJcHVibGljIHZvaWQgc2hvd0dsb2JhbFN0YXRzKCkgeworCisJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCoqKioqKioqKioqKioqIEdMT0JBTCBTVEFUUyAqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCisKKwkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0VG90YWwgcG9seWdvbnMgOiAiICsgdG90YWxQb2x5Z29ucyk7IC8vJE5PTi1OTFMtMSQKKworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRUb3RhbCBwb2ludHMgOiAiICsgdG90YWxQb2ludHMpOyAvLyROT04tTkxTLTEkCisKKwkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0QXZnIHBvaW50cyBwZXIgcG9seWdvbiA6ICIgKyB0b3RhbFBvaW50cyAvLyROT04tTkxTLTEkCisJCQkJLyB0b3RhbFBvbHlnb25zKTsKKworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRHbG9iYWwgcmVkdWN0aW9uIDogIiArIGdsb2JhbFBlcmNlbnQgLy8kTk9OLU5MUy0xJAorCQkJCS8gdG90YWxQb2x5Z29ucyArICIlIik7IC8vJE5PTi1OTFMtMSQKKworCQlTeXN0ZW0ub3V0CisJCQkJLnByaW50bG4oIlx0XHRHbG9iYWwgTUlOIHJlZHVjdGlvbiAgOiAiICsgZ2xvYmFsTWluUGVyY2VudCArICIlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCVN5c3RlbS5vdXQKKwkJCQkucHJpbnRsbigiXHRcdEdsb2JhbCBNQVggcmVkdWN0aW9uICA6ICIgKyBnbG9iYWxNYXhQZXJjZW50ICsgIiUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwl9CisKKwkvKioKKwkgKiBKdXN0IHByaW50IHRoZSBwcm9maWxlIGZvciB0aGUgcG9seWdvbiBwb2ludC1kYXRhCisJICogCisJICovCisJcHVibGljIHZvaWQgc2hvd1Byb2ZpbGUoKSB7CisJCS8vIFNvcnQgdGhlIGtleXMKKwkJU2V0PERvdWJsZT4ga2V5cyA9IGFuZ2xlVmFsdWVNYXAua2V5U2V0KCk7CisJCUxpc3Q8RG91YmxlPiBzb3J0ZWRLZXlzID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KGtleXMpOworCQlDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZEtleXMpOworCisJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdEZyZXF1ZW5jaWVzIG9mIGFuZ2xlcyA6ICAiKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIFByaW50IHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgZm9yIGVhY2ggdmFsdWUKKwkJSXRlcmF0b3Iga2V5SXRlciA9IHNvcnRlZEtleXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGtleUl0ZXIuaGFzTmV4dCgpKSB7CisKKwkJCS8vIEdldCB0aGUga2V5CisJCQlEb3VibGUga2V5ID0gKERvdWJsZSkga2V5SXRlci5uZXh0KCk7CisKKwkJCS8vIEdldCB0aGUgdmFsdWUKKwkJCWludCB2YWwgPSAoYW5nbGVWYWx1ZU1hcC5nZXQoa2V5KSkuaW50VmFsdWUoKTsKKworCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IEFuZ2xlID49ICIgKyBrZXkgKyAiIEZyZXF1ZW5jeSA6ICIgKyB2YWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQl9CisKKwl9CisKKwkvKioKKwkgKiBBbGdvcml0aG0gZm9yIHJlZHVjaW5nIHRoZSBkYXRhIGJ5IG1hcmtpbmcgYW5kIHRoZW4gcmVtb3ZpbmcgKG5lYXJseSkgYWxsCisJICogcG9pbnRzIHdpdGggYW5nbGUgbGVzcyB0aGFuIGFscGhhLiBBbGwgcG9pbnRzIG1hcmtlZCBmb3IgZGVsZXRpb24gYXJlCisJICogY2FsbGVkIFNBRkUuCisJICogCisJICogQHBhcmFtIGFscGhhIC0KKwkgKiAgICAgICAgICAgIHRoZSB0aHJlc2hvbGQKKwkgKiBAcGFyYW0gbGlzdCAtCisJICogICAgICAgICAgICBhIGxpc3QgY29udGFpbmluZyBleHRlbmRlZCBwb2ludCBkYXRhIG9mIHRoZSBmb3JtIDoKKwkgKiAgICAgICAgICAgIElOREVYOkxUOkxHOkFOR0xFOlNBRkVUWQorCSAqIAorCSAqIEByZXR1cm4gbGlzdCAtIGEgcmVkdWNlZCBsaXN0IG9mIHBvaW50cyB0aGF0IHNob3VsZCBub3QgYmUgZGVsZXRlZAorCSAqICAgICAgICAgYmVjYXVzZSB0aGV5IGRvbnQgbWVldCB0aGUgY3JpdGVyaWEgKGkuZS4gdGhlaXIgYW5nbGUgaXMgZ3JlYXRlcgorCSAqICAgICAgICAgdGhhbiB0aHJlc2hvbGQgb3Igd2VyZSBtYXJrZWQgYXMgVU5TQUZFKQorCSAqIAorCSAqLworCXB1YmxpYyBMaXN0PFN0cmluZz4gcmVkdWNlKGRvdWJsZSBhbHBoYSwgTGlzdDxTdHJpbmc+IGxpc3QpIHsKKworCQkvKioKKwkJICogUmVtb3ZlIGFsbCBwb2ludHMgd2hpY2ggYXJlIHNhZmUgdG8gcmVtb3ZlLgorCQkgKiAKKwkJICogVG8gYmUgc2FmZSwgYSBwb2ludCBzaG91bGQgc2F0aXNmeSB0d28gY29uZGl0aW9ucyA6CisJCSAqIAorCQkgKiAxKSBIYXZlIGFuIGFuZ2xlIHdpdGggdmFsdWUgbGVzcyB0aGFuIGFscGhhIGRlZ3Jlc3MuCisJCSAqIAorCQkgKiAyKSBXZSBDQU5OT1QgbWFyayBTQUZFIGZvciBkZWxldGlvbiB0d28gY29uc2VjdXRpdmUgcG9pbnRzLgorCQkgKiAKKwkJICovCisKKwkJLy8gVGhpcyBsaXN0IHdpbGwgY29udGFpbiBvbmx5IHRoZSBlbGVtZW50cyB0aGF0IHdlIHNob3VsZCBub3QgcmVtb3ZlCisJCUxpc3Q8U3RyaW5nPiByZWR1Y2VkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisJCS8vIFN5bWJvbGljIGNvbnN0YW50cyBmb3IgY29udHJvbGxpbmcgdGhlIHNsaWRpbmcgd2luZG93IGFsZ29yaXRobQorCQlmaW5hbCBpbnQgU1RBUlQgPSAwOworCQlmaW5hbCBpbnQgV0lORE9XX0xFTkdUSCA9IDI7CisKKwkJLy8gTXVsdGlwbGllciB0byBvYnRhaW4gbWluaW11bSBsZW5naHQgYXQgd2hpY2ggbWFrZXMgc2Vuc2UgdG8gcnVuIHRoaXMKKwkJLy8gYWxnb3JpdGhtOgorCQlmaW5hbCBpbnQgTVVMVElQTElFUiA9IDE7CisKKwkJLy8gTUlOSU1VTSBMRU5HVEggPSBNVUxUSVBMSUVSICogKFdJTkRPV19MRU5HVEggKyAxKQorCQlmaW5hbCBpbnQgTUlOSU1VTV9MRU5HVEggPSBNVUxUSVBMSUVSICogKFdJTkRPV19MRU5HVEggKyAxKTsKKworCQkvLyBJbmRleGVzIGludG8gdGhlIHN0cmluZyBjb250YWluaW5nIGV4dGVuZGVkIHBvaW50IGRhdGE6CisJCS8vIElOREVYOkxUOkxHOkFOR0xFOlNBRkVUWQorCQlmaW5hbCBpbnQgSU5ERVggPSAwOworCQlmaW5hbCBpbnQgTFQgPSAxOworCQlmaW5hbCBpbnQgTEcgPSAyOworCQlmaW5hbCBpbnQgQU5HTEUgPSAzOworCQlmaW5hbCBpbnQgU0FGRVRZID0gNDsKKworCQkvLyBPdXIgc2xpZGluZyB3aW5kb3cgY292ZXJzIGV4YWN0bHkgdGhyZWUgbm9kZXMuCisJCVN0cmluZ1tdIHAxID0gbnVsbDsKKwkJU3RyaW5nW10gcDIgPSBudWxsOworCQlTdHJpbmdbXSBwMyA9IG51bGw7CisKKwkJLy8gQW5nbGUgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSB0aHJlZSBwb2ludHMgaW4gdGhlIHNsaWRpbmcgd2luZG93LgorCQlkb3VibGUgYTEgPSAwLjA7CisJCWRvdWJsZSBhMiA9IDAuMDsKKwkJZG91YmxlIGEzID0gMC4wOworCisJCS8vIFN0YXRlIChTQUZFIG9yIFVOU0FGRSkgb2YgZWFjaCBvZiB0aHJlZSBwb2ludHMgaW4gdGhlIHNsaWRpbmcgd2luZG93LgorCQlTdHJpbmcgczEgPSBVTktOT1dOOworCQlTdHJpbmcgczIgPSBVTktOT1dOOworCQlTdHJpbmcgczMgPSBVTktOT1dOOworCisJCS8vIEEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kIG9mIHRoZSBzbGlkaW5nIHdpbmRvdy4KKwkJaW50IGxlZnRfYm9yZGVyID0gMDsKKwkJaW50IHJpZ2h0X2JvcmRlciA9IGxlZnRfYm9yZGVyICsgV0lORE9XX0xFTkdUSDsKKworCQkvLyBPdXIgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIHNsaWRpbmcgd2luZG93LgorCQlpbnQgaW5kZXggPSBTVEFSVDsKKworCQlpZiAobGlzdC5zaXplKCkgPCBNSU5JTVVNX0xFTkdUSCkgeworCQkJLy8gVGhlcmUgaXMgbm8gcG9pbnQgaW4gcnVubmluZyB0aGlzIGFsZ29yaXRobSBpZiBwb2ludHMKKwkJCS8vIGxlc3MgdGhhbiBtaW5pbXVtIHZhbHVlLiBObyBuZWVkIHRvIHJlZHVjZS4KKwkJCXJldHVybiBsaXN0OworCQl9CisKKwkJZmluYWwgaW50IEVORCA9IGxpc3Quc2l6ZSgpIC0gMTsKKworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxpc3Qgc2l6ZSBpcyA6ICIgKyBlbmQpOworCisJCXdoaWxlIChyaWdodF9ib3JkZXIgPD0gRU5EKSB7CisKKwkJCS8vIFVOS05PV04gPT0gTk9UIFlFVCBQUk9DRVNTRUQgLS0gRXZlbnR1YWxseSBpdCB3aWxsIGJlIG1hcmtlZAorCQkJLy8gZWl0aGVyIFNBRkUgb3IgVU5TQUZFCisKKwkJCWJvb2xlYW4gZmxhZyA9IGZhbHNlOworCisJCQkvLyBpZiAocDEgPT0gbnVsbCkgeworCQkJLy8gR2V0IHRoZSB0aHJlZSBpbml0aWFsIHBvaW50cyBjb3ZlcmVkIGJ5IG91ciBzbGlkaW5nIHdpbmRvdy4KKwkJCWluZGV4ID0gbGVmdF9ib3JkZXI7CisJCQlwMSA9IGxpc3QuZ2V0KGluZGV4KyspLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKwkJCXAyID0gbGlzdC5nZXQoaW5kZXgrKykuc3BsaXQoIjoiKTsgLy8kTk9OLU5MUy0xJAorCQkJcDMgPSBsaXN0LmdldChpbmRleCkuc3BsaXQoIjoiKTsgLy8kTk9OLU5MUy0xJAorCQkJLy8gfQorCisJCQkvLyBOb3cgZ2V0IHRoZSBhbmdsZSB2YWx1ZSBmb3IgZWFjaCBvZiB0aGUgdGhyZWUgcG9pbnRzLgorCQkJYTEgPSBEb3VibGUucGFyc2VEb3VibGUocDFbQU5HTEVdKTsKKwkJCWEyID0gRG91YmxlLnBhcnNlRG91YmxlKHAyW0FOR0xFXSk7CisJCQlhMyA9IERvdWJsZS5wYXJzZURvdWJsZShwM1tBTkdMRV0pOworCisJCQkvLyBOb3cgZ2V0IHRoZSBzdGF0ZSBvZiBlYWNoIG9mIHRoZSB0aHJlZSBwb2ludHMuCisJCQlzMSA9IHAxW1NBRkVUWV07CisJCQlzMiA9IHAyW1NBRkVUWV07CisJCQlzMyA9IHAzW1NBRkVUWV07CisKKwkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGUgaW5pdGlhbCwgbGVmdG1vc3QgcG9pbnQgaXMgZ3JlYXRlciB0aGFuCisJCQkvLyBhbHBoYSBvciBpZiBpdCBpcyBVTlNBRkUuIElmIHNvLCB0aGVuIHNsaWRlIGZvcndhcmQgdGhlIHdpbmRvdy4KKwkJCWlmIChhMSA+IGFscGhhKSB7CisJCQkJLy8gSnVzdCBzbGlkZSBmb3J3YXJkIHRoZSB3aW5kb3cgb25lIHVuaXQuCisJCQkJbGVmdF9ib3JkZXIgKz0gMTsKKwkJCQlyaWdodF9ib3JkZXIgKz0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHMxLmVxdWFscyhVTlNBRkUpKSB7CisKKwkJCQlpZiAoYTIgPCBhbHBoYSAmJiBhMiA8PSBhMykgeworCQkJCQkvLyBbIFAxID0gVU5TQUZFLCBQMiA9IFNBRkUsIFAzID0gVU5TQUZFIF0KKwkJCQkJLy8gQWR2YW5jZSBzbGlkaW5nIHdpbmRvdyBhZnRlciBQMgorCQkJCQlzMiA9IFNBRkU7CisJCQkJCXMzID0gVU5TQUZFOworCQkJCX0gZWxzZSBpZiAoYTMgPCBhbHBoYSkgeworCQkJCQkvLyBbIFAxID0gVU5TQUZFLCBQMiA9IFVOU0FGRSwgUDMgPSBTQUZFIF0KKwkJCQkJLy8gQWR2YW5jZSBzbGlkaW5nIHdpbmRvdyBhZnRlciBQMgorCQkJCQlzMyA9IFNBRkU7CisJCQkJCXMyID0gVU5TQUZFOworCQkJCX0KKworCQkJfSBlbHNlIGlmIChhMSA8IGFscGhhICYmIGExIDwgYTIpIHsKKwkJCQkvLyBbIFAxID0gU0FGRSwgUDIgPSBVTlNBRkUsIFAzID0gVU5LTk9XTiBdCisJCQkJLy8gQWR2YW5jZSBzbGlkaW5nIHdpbmRvdyBhZnRlciBQMgorCQkJCXMxID0gU0FGRTsKKwkJCQlzMiA9IFVOU0FGRTsKKwkJCQkvLyBOb3cgY2hlY2sgdG8gc2VlIGlmIGlzIHNhZmUgdG8gbWFyayBQMyB0b28uCisJCQkJaWYgKGEzIDwgYWxwaGEpIHsKKwkJCQkJLy8gWyBQMSA9IFNBRkUsIFAyID0gVU5TQUZFLCBQMyA9IFNBRkUgXQorCQkJCQkvLyBBZHZhbmNlIHNsaWRpbmcgd2luZG93IGFmdGVyIFAyCisJCQkJCXMzID0gU0FGRTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGExIDwgYWxwaGEgJiYgYTEgPiBhMikgeworCQkJCS8vIFsgUDEgPSBVTlNBRkUsIFAyID0gU0FGRSwgUDMgPSBVTlNBRkUgXQorCQkJCS8vIFNQRUNJQUwgQ0FTRSA6IEFkdmFuY2Ugc2xpZGluZyB3aW5kb3cgYWZ0ZXIgUDMKKwkJCQlzMSA9IFVOU0FGRTsKKwkJCQlzMiA9IFNBRkU7CisJCQkJczMgPSBVTlNBRkU7CisJCQkJLy8gU3BlY2lhbCBjYXNlIDogc2V0IGZsYWcgdG8gYWR2YW5jZSBzbGlkaW5nIHdpbmRvdyBhZnRlciBQMworCQkJCWZsYWcgPSB0cnVlOworCisJCQl9IGVsc2UgaWYgKGExID4gYWxwaGEgJiYgYTIgPiBhbHBoYSkgeworCQkJCS8vIFsgUDEgPSBVTlNBRkUsIFAyID0gVU5TQUZFLCBQMyA9IFVOS05PV04gXQorCQkJCS8vIEFkdmFuY2Ugc2xpZGluZyB3aW5kb3cgYWZ0ZXIgUDIKKwkJCQlzMSA9IFVOU0FGRTsKKwkJCQlzMiA9IFVOU0FGRTsKKwkJCX0KKworCQkJLy8gUGFjayB0aGUgbW9kaWZpZWQgcG9pbnQtZGF0YS4KKwkJCVN0cmluZyB0MSA9IHAxW0lOREVYXSArICI6IiArIHAxW0xUXSArICI6IiArIHAxW0xHXSArICI6IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCQkrIHAxW0FOR0xFXSArICI6IiArIHMxOyAvLyROT04tTkxTLTEkCisKKwkJCVN0cmluZyB0MiA9IHAyW0lOREVYXSArICI6IiArIHAyW0xUXSArICI6IiArIHAyW0xHXSArICI6IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCQkrIHAyW0FOR0xFXSArICI6IiArIHMyOyAvLyROT04tTkxTLTEkCisKKwkJCVN0cmluZyB0MyA9IHAzW0lOREVYXSArICI6IiArIHAzW0xUXSArICI6IiArIHAzW0xHXSArICI6IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCQkrIHAzW0FOR0xFXSArICI6IiArIHMzOyAvLyROT04tTkxTLTEkCisKKwkJCS8vIFN0b3JlIHRoZSBtb2RpZmllZCAobWFya2VkKSBwb2ludC1kYXRhLgorCQkJbGlzdC5zZXQoSW50ZWdlci5wYXJzZUludChwMVtJTkRFWF0pLCB0MSk7CisJCQlsaXN0LnNldChJbnRlZ2VyLnBhcnNlSW50KHAyW0lOREVYXSksIHQyKTsKKwkJCWxpc3Quc2V0KEludGVnZXIucGFyc2VJbnQocDNbSU5ERVhdKSwgdDMpOworCisJCQlpZiAoZmxhZyA9PSB0cnVlKSB7CisJCQkJLy8gU1BFQ0lBTCBDQVNFIDogQWR2YW5jZSBzbGlkaW5nIHdpbmRvdyBhZnRlciBQMy4KKwkJCQlsZWZ0X2JvcmRlciA9IHJpZ2h0X2JvcmRlciArIDE7CisJCQkJcmlnaHRfYm9yZGVyID0gbGVmdF9ib3JkZXIgKyBXSU5ET1dfTEVOR1RIOworCQkJCS8vIEdvIHRvIHRoZSBuZXh0IGl0ZXJhdGlvbi4KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLy8gREVGQVVMVCA6IEFkdmFuY2Ugc2xpZGluZyB3aW5kb3cgYWZ0ZXIgUDIuCisJCQlsZWZ0X2JvcmRlciA9IHJpZ2h0X2JvcmRlcjsKKwkJCXJpZ2h0X2JvcmRlciA9IGxlZnRfYm9yZGVyICsgV0lORE9XX0xFTkdUSDsKKworCQl9IC8vIHdoaWxlCisKKwkJLy8gTm93IHJlbW92ZSB0aGUgU0FGRSBwb2ludHMgYW5kIHJldHVybiB0aGUgcmVkdWNlZCBsaXN0LgorCQlJdGVyYXRvciBpdCA9IGxpc3QubGlzdEl0ZXJhdG9yKCk7CisKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQlTdHJpbmcgZGF0YSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKworCQkJU3RyaW5nW10gdG9rZW5zID0gZGF0YS5zcGxpdCgiOiIpOyAvLyROT04tTkxTLTEkCisKKwkJCWlmICh0b2tlbnNbU0FGRVRZXS5lcXVhbHMoU0FGRSkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJlZHVjZWRMaXN0LmFkZChkYXRhKTsKKworCQl9CisKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZWR1Y2VkIGxpc3Qgc2l6ZSBpcyA6ICIgKyByZWR1Y2VkTGlzdC5zaXplKCkpOworCisJCXJldHVybiByZWR1Y2VkTGlzdDsKKworCX0KKworCS8qKgorCSAqIFByb2ZpbGUgdGhlIGFuZ2xlIGRhdGEuIENvdW50IGhvdyBtYW55IHRpbWVzIGVhY2ggdmFsdWUgb2NjdXJzCisJICogCisJICogQHBhcmFtIGxpc3QgLQorCSAqICAgICAgICAgICAgYSBsaXN0IG9mIGFuZ2xlcyBmb3IgZWFjaCBkYXRhIHBvaW50IGluIHRoZSBwb2x5Z29uCisJICogCisJICovCisJcHVibGljIHZvaWQgcHJvZmlsZShMaXN0PFN0cmluZz4gbGlzdCkgeworCisJCWZpbmFsIGludCBBTkdMRSA9IDM7CisKKwkJaWYgKGxpc3QgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gV2Ugd2FudCB0byBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBwb2ludHMgb2YgdGhlCisJCS8vIHBvbHlnb24KKwkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7CisKKwkJLy8gQ2xlYXIgdGhlIGhhc2ggbWFwIGJlZm9yZSBzdGFydCB1c2luZyBpdC4KKwkJaW5pdEhhc2hNYXAoYW5nbGVWYWx1ZU1hcCk7CisKKwkJLy8gQ291bnQgdGhlIG9jY3VycmVuY2VzIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIDE4MCBvZmZzZXQKKwkJLy8gbWludXMgdGhlIGFuZ2xlLgorCQkvLyBUaGlzIGNvdW50IHdpbGwgYmUgdXNlZnVsIGZvciBmaW5kaW5nIGEgZ29vZCB0aHJlc2hvbGQuCisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKworCQkJU3RyaW5nIHAgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisKKwkJCVN0cmluZ1tdIGVsZW1lbnRzID0gcC5zcGxpdCgiOiIpOyAvLyROT04tTkxTLTEkCisKKwkJCURvdWJsZSBhbmdsZSA9IG5ldyBEb3VibGUoZWxlbWVudHNbQU5HTEVdKTsKKworCQkJZG91YmxlIGRlZ3JlZXMgPSBhbmdsZS5kb3VibGVWYWx1ZSgpOworCisJCQljb3VudChkZWdyZWVzLCBhbmdsZVZhbHVlTWFwKTsKKworCQl9IC8vIHdoaWxlCisKKwl9CisKKwkvKioKKwkgKiBCYXNlZCBvbiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYW5nbGUsIGtlZXAgdHJhY2sgb2YgaXQuCisJICogCisJICogQHBhcmFtIGRlZ3JlZXMgLQorCSAqICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBsYXN0IG9mZnNldCAtIENvcy0xKGFuZ2xlKSB2YWx1ZS4KKwkgKiAKKwkgKiBAcGFyYW0gbWFwIC0KKwkgKiAgICAgICAgICAgIFRoZSBtYXAgaG9sZGluZyBhbmdsZXMgYW5kIHRoZWlyIGNvdW50CisJICogCisJICovCisJcHVibGljIHZvaWQgY291bnQoZG91YmxlIGRlZ3JlZXMsIEhhc2hNYXA8RG91YmxlLCBJbnRlZ2VyPiBtYXApIHsKKworCQkvLyBGaWx0ZXIgdG8gZmluZCB0aGUgYXBwcm9wcmlhdGUgYnVja2V0IGZvciB0aGUgdmFsdWUKKworCQlpZiAoZGVncmVlcyA+PSA5MC4wKSB7CisJCQlpbnQgY291bnQgPSAobWFwLmdldChuZXcgRG91YmxlKDkwLjApKSkuaW50VmFsdWUoKTsKKwkJCW1hcC5wdXQobmV3IERvdWJsZSg5MC4wKSwgbmV3IEludGVnZXIoKytjb3VudCkpOworCisJCX0gZWxzZSBpZiAoZGVncmVlcyA+PSA0NS4wKSB7CisJCQlpbnQgY291bnQgPSAobWFwLmdldChuZXcgRG91YmxlKDQ1LjApKSkuaW50VmFsdWUoKTsKKwkJCW1hcC5wdXQobmV3IERvdWJsZSg0NS4wKSwgbmV3IEludGVnZXIoKytjb3VudCkpOworCisJCX0gZWxzZSBpZiAoZGVncmVlcyA+PSAyMi41KSB7CisJCQlpbnQgY291bnQgPSAobWFwLmdldChuZXcgRG91YmxlKDIyLjUpKSkuaW50VmFsdWUoKTsKKwkJCW1hcC5wdXQobmV3IERvdWJsZSgyMi41KSwgbmV3IEludGVnZXIoKytjb3VudCkpOworCisJCX0gZWxzZSBpZiAoZGVncmVlcyA+PSAxMS4yNSkgeworCQkJaW50IGNvdW50ID0gKG1hcC5nZXQobmV3IERvdWJsZSgxMS4yNSkpKS5pbnRWYWx1ZSgpOworCQkJbWFwLnB1dChuZXcgRG91YmxlKDExLjI1KSwgbmV3IEludGVnZXIoKytjb3VudCkpOworCisJCX0gZWxzZSBpZiAoZGVncmVlcyA+PSA1LjUxMjUpIHsKKwkJCWludCBjb3VudCA9IChtYXAuZ2V0KG5ldyBEb3VibGUoNS41MTI1KSkpLmludFZhbHVlKCk7CisJCQltYXAucHV0KG5ldyBEb3VibGUoNS41MTI1KSwgbmV3IEludGVnZXIoKytjb3VudCkpOworCisJCX0gZWxzZSBpZiAoZGVncmVlcyA+PSAyLjApIHsKKwkJCWludCBjb3VudCA9IChtYXAuZ2V0KG5ldyBEb3VibGUoMi4wKSkpLmludFZhbHVlKCk7CisJCQltYXAucHV0KG5ldyBEb3VibGUoMi4wKSwgbmV3IEludGVnZXIoKytjb3VudCkpOworCisJCX0gZWxzZSBpZiAoZGVncmVlcyA+PSAxLjUpIHsKKwkJCWludCBjb3VudCA9IChtYXAuZ2V0KG5ldyBEb3VibGUoMS41KSkpLmludFZhbHVlKCk7CisJCQltYXAucHV0KG5ldyBEb3VibGUoMS41KSwgbmV3IEludGVnZXIoKytjb3VudCkpOworCisJCX0gZWxzZSBpZiAoZGVncmVlcyA+PSAxLjApIHsKKwkJCWludCBjb3VudCA9IChtYXAuZ2V0KG5ldyBEb3VibGUoMS4wKSkpLmludFZhbHVlKCk7CisJCQltYXAucHV0KG5ldyBEb3VibGUoMS4wKSwgbmV3IEludGVnZXIoKytjb3VudCkpOworCisJCX0gZWxzZSBpZiAoZGVncmVlcyA+PSAwLjc1KSB7CisJCQlpbnQgY291bnQgPSAobWFwLmdldChuZXcgRG91YmxlKDAuNzUpKSkuaW50VmFsdWUoKTsKKwkJCW1hcC5wdXQobmV3IERvdWJsZSgwLjc1KSwgbmV3IEludGVnZXIoKytjb3VudCkpOworCisJCX0gZWxzZSBpZiAoZGVncmVlcyA+PSAwLjUpIHsKKwkJCWludCBjb3VudCA9IChtYXAuZ2V0KG5ldyBEb3VibGUoMC41KSkpLmludFZhbHVlKCk7CisJCQltYXAucHV0KG5ldyBEb3VibGUoMC41KSwgbmV3IEludGVnZXIoKytjb3VudCkpOworCisJCX0gZWxzZSBpZiAoZGVncmVlcyA+PSAwLjI1KSB7CisJCQlpbnQgY291bnQgPSAobWFwLmdldChuZXcgRG91YmxlKDAuMjUpKSkuaW50VmFsdWUoKTsKKwkJCW1hcC5wdXQobmV3IERvdWJsZSgwLjI1KSwgbmV3IEludGVnZXIoKytjb3VudCkpOworCisJCX0gZWxzZSBpZiAoZGVncmVlcyA+PSAwLjE1KSB7CisJCQlpbnQgY291bnQgPSAobWFwLmdldChuZXcgRG91YmxlKDAuMTUpKSkuaW50VmFsdWUoKTsKKwkJCW1hcC5wdXQobmV3IERvdWJsZSgwLjE1KSwgbmV3IEludGVnZXIoKytjb3VudCkpOworCisJCX0gZWxzZSBpZiAoZGVncmVlcyA+PSAwLjA1KSB7CisJCQlpbnQgY291bnQgPSAobWFwLmdldChuZXcgRG91YmxlKDAuMDUpKSkuaW50VmFsdWUoKTsKKwkJCW1hcC5wdXQobmV3IERvdWJsZSgwLjA1KSwgbmV3IEludGVnZXIoKytjb3VudCkpOworCisJCX0KKworCX0KKworCS8qKgorCSAqIFNpbXBseSBleHRyYWN0IHRoZSBMVCxMRyB2YWx1ZXMgZnJvbSB0aGUgbGlzdC4KKwkgKiAKKwkgKiBAcGFyYW0gbGlzdAorCSAqICAgICAgICAgICAgYSBsaXN0IHdpdGggcG9pbnQtZGF0YSBvZiB0aGUgZm9ybTogSU5ERVg6TFQ6TEc6QU5HTEU6U0FGRVRZCisJICogCisJICogQHJldHVybiBTdHJpbmcgYSBjb25jYXRlbmF0aW9uIG9mIGFsbCB0aGUgTFQsTEcgdmFsdWVzLgorCSAqLworCVN0cmluZyBleHRyYWN0TGlzdEludG9TdHJpbmcoTGlzdDxTdHJpbmc+IGxpc3QpIHsKKworCQlmaW5hbCBpbnQgTFQgPSAxOworCisJCWZpbmFsIGludCBMRyA9IDI7CisKKwkJU3RyaW5nIGJ1ZmZlciA9IG51bGw7CisKKwkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7CisKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCisJCQlTdHJpbmcgcCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKworCQkJU3RyaW5nW10gZWxlbWVudHMgPSBwLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisKKwkJCQlidWZmZXIgPSBlbGVtZW50c1tMVF0gKyAiLCIgKyBlbGVtZW50c1tMR10gKyAiLCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQl9IGVsc2UgeworCisJCQkJYnVmZmVyICs9IGVsZW1lbnRzW0xUXSArICIsIiArIGVsZW1lbnRzW0xHXSArICIsIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIGJ1ZmZlcjsKKwl9CisKKwkvKioKKwkgKiBDb21wdXRlIHRoZSBjb3NpbmUgaW52ZXJzZSBvZiBhbiBhbmdsZSBhbmQgc3VicmFjdCB0aGF0IHZhbHVlIGZyb20gYW4KKwkgKiBvZmZzZXQgb2YgMTgwIGRlZ3JlZXMuCisJICogCisJICogQHBhcmFtIHBvbHlnb24KKwkgKiAgICAgICAgICAgIGEgU1RFTSBwb2x5Z29uCisJICogCisJICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBhbmdsZSB2YWx1ZXMgZm9yIGFsbCBwb2ludHMgaW4gdGhlIHBvbHlnb24KKwkgKiAKKwkgKi8KKwlMaXN0PFN0cmluZz4gY29tcHV0ZUludmVyc2VDb3NpbmVzKFNURU1Qb2x5Z29uIHBvbHlnb24pIHsKKworCQlmaW5hbCBkb3VibGUgSU5GSU5JVFkgPSAxMDAwMDAwMDsKKworCQkvLyBMaXN0IHRvIGtlZXAgdHJhY2sgb2YgdHVwbGVzIG9mIHRoZSBmb3JtIDogKCBwb2ludCwgaW52ZXJzZQorCQkvLyBBTkdMRSBhbmdsZSApCisJCUxpc3Q8U3RyaW5nPiBwb2ludERhdGFMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKwkJLy8gRmlyc3QsIGdldCBhbiBpdGVyYXRvciB0byB0aGUgcG9pbnRzIGluIHRoZSBwb2x5Z29uCisJCUl0ZXJhdG9yIGl0ID0gcG9seWdvbi5nZXRJdGVyYXRvcigpOworCisJCWRvdWJsZSBkZWdyZWVzID0gMC4wOworCisJCS8vIEdldCB0aGUgZmlyc3QgdGhyZWUgcG9pbnRzCisJCWRvdWJsZSBpbnZlcnNlQ29zaW5lID0gSU5GSU5JVFk7CisKKwkJLy8gU3RyaW5nIHRvIHN0b3JlIGluaXRpYWwgcG9pbnQuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIHNldCB0aGUgdmFsdWUKKwkJLy8gb2YgdGhlIGxhc3QgcG9pbnQuIFNpbmNlIGEgcG9seWdvbiBoYXMgdG8gYmUgY2xvc2VkLCB0aGUgZmlyc3QgYW5kCisJCS8vIGxhc3QgcG9pbnRzIHNob3VsZCBiZSB0aGUgc2FtZS4gSXQgaXMgYmV0dGVyIHRvIHN0b3JlIGl0IHRoYW4gdG8KKwkJLy8gcmVjb21wdXRlIGl0IGxhdGVyLgorCQlTdHJpbmcgaW5pdFBvaW50RGF0YSA9IG51bGw7CisJCVN0cmluZyBsYXN0UG9pbnREYXRhID0gbnVsbDsKKworCQlQb2ludERhdGEgcDEgPSBudWxsOworCQlQb2ludERhdGEgcDIgPSBudWxsOworCQlQb2ludERhdGEgcDMgPSBudWxsOworCisJCWludCBpbmRleCA9IDA7CisKKwkJLy8gU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgYW5kIGxhc3QgcG9pbnQuCisJCS8vIFdlIG5ldmVyIGRlbGV0ZSB0aGUgZmlyc3Qgb3IgdGhlIGxhc3QgcG9pbnQsIG90aGVyd2lzZSB3ZSB3aWxsCisJCS8vIHR1cm4gdGhpcyBwb2x5Z29uIGludG8gYSBub24tcG9seWdvbi4KKwkJLy8gU2V0IHRvIFVOU0FGRSBhbmQgYW5nbGUgdG8gRG91YmxlLk1BWF9WQUxVRSB0byBtYWtlIHN1cmUgdGhhdCBuZWl0aGVyCisJCS8vIG9mIHRoZXNlIHBvaW50cyBldmVyIGJlIHJlbW92ZWQuCisKKwkJaWYgKGluaXRQb2ludERhdGEgPT0gbnVsbCkgeworCisJCQlQb2ludERhdGEgaW5pdCA9IHBvbHlnb24uZ2V0SW5pdCgpOworCisJCQkvLyBTZXQgYW5nbGUgdG8gYQorCQkJaW5pdFBvaW50RGF0YSA9IFN0cmluZy52YWx1ZU9mKDApICsgIjoiICsgaW5pdC5nZXRMdCgpICsgIjoiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkrIGluaXQuZ2V0TGcoKSArICI6IiArIERvdWJsZS5NQVhfVkFMVUUgKyAiOiIgKyBVTlNBRkU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQlsYXN0UG9pbnREYXRhID0gU3RyaW5nLnZhbHVlT2YocG9seWdvbi5wb2ludHMoKSAtIDEpICsgIjoiIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyBpbml0LmdldEx0KCkgKyAiOiIgKyBpbml0LmdldExnKCkgKyAiOiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCSsgRG91YmxlLk1BWF9WQUxVRSArICI6IiArIFVOU0FGRTsgLy8kTk9OLU5MUy0xJAorCisJCX0KKworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisKKwkJCWlmIChwMSA9PSBudWxsKSB7CisJCQkJcDEgPSAoUG9pbnREYXRhKSBpdC5uZXh0KCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChwMiA9PSBudWxsKSB7CisJCQkJcDIgPSAoUG9pbnREYXRhKSBpdC5uZXh0KCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChwMyA9PSBudWxsKSB7CisJCQkJcDMgPSAoUG9pbnREYXRhKSBpdC5uZXh0KCk7CisJCQl9CisKKwkJCWlmIChpbmRleCA9PSAwKSB7CisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgKDEpIDogIiArIGluaXRQb2ludERhdGEpOworCQkJCXBvaW50RGF0YUxpc3QuYWRkKGluZGV4KyssIGluaXRQb2ludERhdGEpOworCQkJfQorCisJCQkvLyBTdHJpbmcgdXNlZCB0byByZXByZXNlbnQgZXh0ZW5kZWQgcG9pbnQgZGF0YS4gSXQgaGFzIHRoZSBmb3JtIDoKKwkJCS8vIElOREVYOkxUOkxHOkFOR0xFOlNBRkVUWQorCQkJU3RyaW5nIHR1cGxlID0gbnVsbDsKKworCQkJLy8gTm93IHRoYXQgd2UgaGF2ZSB0aHJlZSBjb25zZWN1dGl2ZSBwb2ludHMsIGNvbXB1dGUgdGhlIGludmVyc2UKKwkJCS8vIEFOR0xFIG9mIHRoZSBhbmdsZQorCQkJLy8gZm9yIHRoZSB0cmlhbmdsZSBmb3JtZWQgYnkgdGhlc2UgdGhyZWUgY29uc2VjdXRpdmUgcG9pbnRzLgorCQkJZmluYWwgZG91YmxlIGNjID0gMTAwMDAwMDAwMDAwLjA7CisJCQlkb3VibGUgbHQxID0gcDEuZ2V0THQoKSAqIGNjOworCQkJZG91YmxlIGx0MiA9IHAyLmdldEx0KCkgKiBjYzsKKwkJCWRvdWJsZSBsdDMgPSBwMy5nZXRMdCgpICogY2M7CisJCQlkb3VibGUgbGcxID0gcDEuZ2V0TGcoKSAqIGNjOworCQkJZG91YmxlIGxnMiA9IHAyLmdldExnKCkgKiBjYzsKKwkJCWRvdWJsZSBsZzMgPSBwMy5nZXRMZygpICogY2M7CisKKwkJCS8vIGNvbXB1dGU6IGFeMiA9IChYaS0gWGktMSleMiArIChZaS0gWWktMSleMgorCQkJZG91YmxlIGEgPSBNYXRoLnBvdygobGcyIC0gbGcxKSwgMikgKyBNYXRoLnBvdygobHQyIC0gbHQxKSwgMik7CisKKwkJCS8vIGNvbXB1dGU6IGJeMiA9IChYaSsxIC1YaSleMiArIChZaSsxIC1ZaSleMgorCQkJZG91YmxlIGIgPSBNYXRoLnBvdygobGczIC0gbGcyKSwgMikgKyBNYXRoLnBvdygobHQzIC0gbHQyKSwgMik7CisKKwkJCS8vIGNvbXB1dGU6IGNeMiA9IChYaSsxIC0gWGktMSleMiArIChZaSsxIC0gWWktMSleMgorCQkJZG91YmxlIGMgPSBNYXRoLnBvdygobGczIC0gbGcxKSwgMikgKyBNYXRoLnBvdygobHQzIC0gbHQxKSwgMik7CisKKwkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIEFeMiA9ICIgKyBhKTsKKworCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgQl4yID0gIiArIGIpOworCisJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBDXjIgPSAiICsgYyk7CisKKwkJCS8vIE5vdyBjb21wdXRlOiAoYV4yICsgYl4yIC0gY14yKSAvIDJhYgorCisJCQlkb3VibGUgcmF0aW8gPSAoKGEgKyBiKSAtIGMpIC8gKDIgKiBNYXRoLnNxcnQoYSkgKiBNYXRoLnNxcnQoYikpOworCisJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJhdGlvIGlzIDogIiArIHJhdGlvKTsKKworCQkJLy8gTm93IGNvbXB1dGUgdGhlIGFyYyBBTkdMRSA6IGNvcy0xKCByYXRpbyApCisJCQlpbnZlcnNlQ29zaW5lID0gTWF0aC5hY29zKHJhdGlvKTsKKworCQkJZGVncmVlcyA9IE1hdGguYWJzKDE4MC4wIC0gR2VuVXRpbHMudG9EZWdyZWVzKGludmVyc2VDb3NpbmUpKTsKKworCQkJdHVwbGUgPSBTdHJpbmcudmFsdWVPZihpbmRleCkgKyAiOiIgKyBwMi5nZXRMdCgpICsgIjoiICsgcDIuZ2V0TGcoKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJKyAiOiIgKyBuZXcgRG91YmxlKGRlZ3JlZXMpICsgIjoiICsgVU5LTk9XTjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCS8vIFN0b3JlIHR1cGxlIGluIHRoZSBtYXAKKwkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nICgxKSA6ICIgKyB0dXBsZSk7CisJCQlwb2ludERhdGFMaXN0LmFkZChpbmRleCsrLCB0dXBsZSk7CisKKwkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW52ZXJzZSBjb3NpbmUgaXMgIiArIGludmVyc2VBTkdMRSk7CisKKwkJCS8vIFNsaWRlIHRoZSBwb2ludHMgYnkgb25lIHRvIGRvIHRoZSBuZXcgY29tcHV0YXRpb24gb2YgdGhlIGFuZ2xlCisKKwkJCS8vIE5vdyBzZXQgcDEgPC0gcDIKKwkJCXAxID0gcDI7CisKKwkJCS8vIE5vdyBzZXQgcDIgPC0gcDMKKwkJCXAyID0gcDM7CisKKwkJCS8vIE5vdyBzZXQgcDMgPSBudWxsCisJCQlwMyA9IG51bGw7CisKKwkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGl0ZXJhdGlvbi4KKwkJCWlmIChpdC5oYXNOZXh0KCkgPT0gZmFsc2UpIHsKKworCQkJCS8vIElmIHNvLCBhZGQgdGhlIGxhc3QgcG9pbnQuCisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgKDIpIDogIiArIGxhc3RQb2ludERhdGEpOworCQkJCXBvaW50RGF0YUxpc3QuYWRkKGluZGV4LCBsYXN0UG9pbnREYXRhKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIHBvaW50RGF0YUxpc3Q7CisJfQorCisJLyoqCisJICogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSByZWFsIHBvbHlnb24gKGkuZS4gY2xvc2VkKQorCSAqIAorCSAqIEBwYXJhbSBwb2x5Z29uCisJICogICAgICAgICAgICBBIFNURU0gcG9seWdvbgorCSAqIAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFyYW1ldGVyICJwb2x5Z29uIiBpcyBhIFNURU0gcG9seWdvbgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzUG9seWdvbihTVEVNUG9seWdvbiBwb2x5Z29uKSB7CisKKwkJUG9pbnREYXRhIGluaXQgPSBwb2x5Z29uLmdldEluaXQoKTsKKwkJUG9pbnREYXRhIGxhc3QgPSBwb2x5Z29uLmdldExhc3QoKTsKKworCQlpZiAoaW5pdC5nZXRMdCgpICE9IGxhc3QuZ2V0THQoKSkgeworCQkJLy8gTm90IGEgcG9seWdvbgorCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKGluaXQuZ2V0TGcoKSAhPSBsYXN0LmdldExnKCkpIHsKKwkJCS8vIE5vdCBhIHBvbHlnb24KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8vIFllcywgaXQgaXMgYSBwb2x5Z29uCisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIENoZWNrIHRvIHNlZSBpZiB0aGlzIHBvbHlnb24gaXMgZHVwbGljYXRlZC4KKwkgKiAKKwkgKiBAcGFyYW0gcG9seWdvbgorCSAqICAgICAgICAgICAgYSBTVEVNIHBvbHlnb24KKwkgKiBAcGFyYW0gaXQKKwkgKiAgICAgICAgICAgIGFuIGl0ZXJhdG9yIG9uIHRoZSBwb2x5Z29uIGxpc3QKKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBwb2x5Z29uIGlzIGFscmVhZHkgaW4gdGhlIGxpc3Qgb2Yga25vd24gcG9seWdvbnMKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BvbHlnb25EdXBsaWNhdGVkKEl0ZXJhdG9yIGl0LCBTVEVNUG9seWdvbiBwb2x5Z29uKSB7CisKKwkJaWYgKGl0Lmhhc05leHQoKSAhPSB0cnVlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQlTVEVNUG9seWdvbiBjdXJyZW50ID0gKFNURU1Qb2x5Z29uKSBpdC5uZXh0KCk7CisJCQlpZiAoY3VycmVudC5zYW1lKHBvbHlnb24pID09IHRydWUpIHsKKwkJCQkvLyBOb3QgdW5pcXVlLCBpdCBpcyBkdXBsaWNhdGVkIHNvIGNvbmRpdGlvbiBpcyBmYWxzZS4KKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgY3JlYXRlcyB0aGUgb3BlbmluZyBYTUwgdGFncyB0aGF0IGRlYWwgd2l0aCBpc2xhbmRzIG9mCisJICogcG9seWdvbiBkYXRhLgorCSAqIAorCSAqIEBwYXJhbSBpZAorCSAqICAgICAgICAgICAgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBlbnRpdHkKKwkgKiAKKwkgKiBAcmV0dXJuIGEgR01MIHRhZyB0aGF0IGRlc2NyaWJlcyBhIHBvbHlnb24KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG9wZW5Qb2x5Z29uSXNsYW5kVGFncyhTdHJpbmcgaWQpIHsKKworCQlTdHJpbmcgdGFncyA9IG51bGw7CisJCXRhZ3MgPSAiPGdtbDpQb2x5Z29uIGdtbDppZD1cIiIgKyBpZCArICJcIj5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl0YWdzICs9ICI8Z21sOm91dGVyQm91bmRhcnlJcz5cbiI7IC8vJE5PTi1OTFMtMSQKKworCQlyZXR1cm4gdGFnczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIHRoZSB0YWdzIHRoYXQgZGVzY3JpYmUgYSAicG9seWdvbiBpc2xhbmQiIG9yIGxpbmVhcgorCSAqIHJpbmcgYW5kIHB1dHMgdGhlIHBvbHlnb24gZGF0YSBpbnNpZGUgb2YgaXQuCisJICogCisJICogQHBhcmFtIGJ1ZmZlcgorCSAqICAgICAgICAgICAgdGhlIGRhdGEgYnVmZmVyIGNvbnRhaW5pbmcgYWxsIHRoZSBwb2x5Z29uZCBkYXRhCisJICogQHBhcmFtIGxldmVsCisJICogICAgICAgICAgICB0aGUgYWRtaW4gbGV2ZWwKKwkgKiAKKwkgKiBAcmV0dXJuIGEgR01MIHRhZyBmb3Igb3BlbmluZyBhIGxpbmVhciByaW5nLgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgYWRkTGluZWFyUmluZ1RhZ3MoU3RyaW5nIGJ1ZmZlciwgaW50IGxldmVsKSB7CisKKwkJaW50IG9mZnNldCA9IDA7CisKKwkJU3RyaW5nIHBvbHlnb25EYXRhID0gbnVsbDsKKworCQlzd2l0Y2ggKGxldmVsKSB7CisKKwkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMDoKKwkJCW9mZnNldCA9IDI7CisJCQlicmVhazsKKworCQljYXNlIERhdGFUeXBlcy5MRVZFTF8xOgorCQkJb2Zmc2V0ID0gMzsKKwkJCWJyZWFrOworCisJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzI6CisJCQlvZmZzZXQgPSA0OworCQkJYnJlYWs7CisJCX0KKworCQkvLyBUb2tlbml6ZQorCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihidWZmZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBBZHZhbmNlIHRoZSBmaXJzdCBLLXRva2Vucy4KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBvZmZzZXQ7IGkrKykgeworCQkJaWYgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQl0b2tlbnMubmV4dFRva2VuKCk7CisJCQl9CisJCX0KKworCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworCisJCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7CisKKwkJCWlmIChHZW5VdGlscy5pc051bWVyaWModG9rZW4pID09IGZhbHNlKSB7CisJCQkJY29udGludWU7IC8vIElnbm9yZSwgdGhpcyBpcyBub3QgYSB2YWxpZCBjb29yZGluYXRlLgorCQkJfQorCisJCQkvLyBDb252ZXJ0IHRva2VuIChwb2x5Z29uIGRhdGEpIHRvIGFuIGludC4KKwkJCWRvdWJsZSBjb29yZCA9IEdlblV0aWxzLnRvRGVncmVlcyhHZW5VdGlscy5nZXREb3VibGUodG9rZW4pKTsKKworCQkJLy8gRm9ybWF0IGx0LCBsZyB2YWx1ZXMgYWNjb3JkaW5nIHRvIG91ciBjb252ZW50aW9uCisJCQlpZiAocG9seWdvbkRhdGEgPT0gbnVsbCkgeworCQkJCXBvbHlnb25EYXRhID0gR2VuVXRpbHMuZm9ybWF0KGNvb3JkKSArICIgIjsgLy8kTk9OLU5MUy0xJAorCQkJfSBlbHNlIHsKKwkJCQlwb2x5Z29uRGF0YSArPSBHZW5VdGlscy5mb3JtYXQoY29vcmQpICsgIiAiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKworCQlTdHJpbmcgdGFncyA9ICI8Z21sOkxpbmVhclJpbmc+XG4iOyAvLyROT04tTkxTLTEkCisJCXRhZ3MgKz0gIjxnbWw6cG9zTGlzdD5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSBwb2x5Z29uRGF0YSArICJcbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSAiPC9nbWw6cG9zTGlzdD5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSAiPC9nbWw6TGluZWFyUmluZz5cbiI7IC8vJE5PTi1OTFMtMSQKKworCQlyZXR1cm4gdGFnczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIHRoZSBjbG9zaW5nIFhNTCB0YWdzIHRoYXQgZGVhbCB3aXRoIGlzbGFuZHMgb2YKKwkgKiBwb2x5Z29uIGRhdGEuCisJICogCisJICogQHJldHVybiBhIEdNTCB0YWcgZm9yIGNsb3NpbmcgYSBwb2x5Z29uLgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgY2xvc2VQb2x5Z29uSXNsYW5kVGFncygpIHsKKworCQlTdHJpbmcgdGFncyA9IG51bGw7CisJCXRhZ3MgPSAiPC9nbWw6b3V0ZXJCb3VuZGFyeUlzPlxuIjsgLy8kTk9OLU5MUy0xJAorCQl0YWdzICs9ICI8L2dtbDpQb2x5Z29uPlxuIjsgLy8kTk9OLU5MUy0xJAorCisJCXJldHVybiB0YWdzOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgdGhlIFhNTCB0YWdzIHRoYXQgZGVhbCB3aXRoIHNpbXBsZSBwb2x5Z29uIGRhdGEgYW5kCisJICogaW5jbHVkZXMgdGhlIHBvbHlnb24gZGF0YSBpbiBpdC4KKwkgKiAKKwkgKiBAcGFyYW0gaWQKKwkgKiAgICAgICAgICAgIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgZW50aXR5CisJICogQHBhcmFtIGJ1ZmZlcgorCSAqICAgICAgICAgICAgdGhlIGRhdGEgYnVmZmVyIGNvbnRhaW5pbmcgYWxsIHRoZSBwb2x5Z29uIGRhdGEKKwkgKiBAcGFyYW0gbGV2ZWwKKwkgKiAgICAgICAgICAgIHRoZSBhZG1pbiBsZXZlbAorCSAqIAorCSAqIEByZXR1cm4gYSBHTUwgdGFnIHRvIGNyZWF0ZSBzaW1wbGUgcG9seWdvbi4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZVNpbXBsZVBvbHlnb25UYWdzKFN0cmluZyBpZCwgU3RyaW5nIGJ1ZmZlciwgaW50IGxldmVsKSB7CisKKwkJaW50IG9mZnNldCA9IDA7CisKKwkJU3RyaW5nIHBvbHlnb25EYXRhID0gbnVsbDsKKworCQlzd2l0Y2ggKGxldmVsKSB7CisKKwkJY2FzZSBEYXRhVHlwZXMuTEVWRUxfMDoKKwkJCW9mZnNldCA9IDI7CisJCQlicmVhazsKKworCQljYXNlIERhdGFUeXBlcy5MRVZFTF8xOgorCQkJb2Zmc2V0ID0gMzsKKwkJCWJyZWFrOworCisJCWNhc2UgRGF0YVR5cGVzLkxFVkVMXzI6CisJCQlvZmZzZXQgPSA0OworCQkJYnJlYWs7CisJCX0KKworCQkvLyBUb2tlbml6ZQorCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihidWZmZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBBZHZhbmNlIHRoZSBmaXJzdCBLLXRva2Vucy4KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBvZmZzZXQ7IGkrKykgeworCQkJaWYgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQl0b2tlbnMubmV4dFRva2VuKCk7CisJCQl9CisJCX0KKworCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworCisJCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7CisKKwkJCWlmIChHZW5VdGlscy5pc051bWVyaWModG9rZW4pID09IGZhbHNlKSB7CisJCQkJY29udGludWU7IC8vIElnbm9yZSwgdGhpcyBpcyBub3QgYSB2YWxpZCBjb29yZGluYXRlLgorCQkJfQorCisJCQkvLyBDb252ZXJ0IHRva2VuIChwb2x5Z29uIGRhdGEpIHRvIGFuIGludC4KKwkJCWRvdWJsZSBjb29yZCA9IEdlblV0aWxzLnRvRGVncmVlcyhHZW5VdGlscy5nZXREb3VibGUodG9rZW4pKTsKKworCQkJLy8gRm9ybWF0IGx0LCBsZyB2YWx1ZXMgYWNjb3JkaW5nIHRvIG91ciBjb252ZW50aW9uCisJCQlpZiAocG9seWdvbkRhdGEgPT0gbnVsbCkgeworCQkJCXBvbHlnb25EYXRhID0gR2VuVXRpbHMuZm9ybWF0KGNvb3JkKSArICIgIjsgLy8kTk9OLU5MUy0xJAorCQkJfSBlbHNlIHsKKwkJCQlwb2x5Z29uRGF0YSArPSBHZW5VdGlscy5mb3JtYXQoY29vcmQpICsgIiAiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKworCQlTdHJpbmcgdGFncyA9IG51bGw7CisKKwkJaWYgKHBvbHlnb25EYXRhID09IG51bGwpIHsKKwkJCXRhZ3MgPSAiPGdtbDpQb2x5Z29uIGdtbDppZD1cIiIgKyBpZCArICJcIi8+XG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfSBlbHNlIHsKKwkJCXRhZ3MgPSAiPGdtbDpQb2x5Z29uIGdtbDppZD1cIiIgKyBpZCArICJcIj5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJdGFncyArPSAiPGdtbDpvdXRlckJvdW5kYXJ5SXM+XG4iOyAvLyROT04tTkxTLTEkCisJCQl0YWdzICs9ICI8Z21sOkxpbmVhclJpbmc+XG4iOyAvLyROT04tTkxTLTEkCisJCQl0YWdzICs9ICI8Z21sOnBvc0xpc3Q+XG4iOyAvLyROT04tTkxTLTEkCisJCQl0YWdzICs9IHBvbHlnb25EYXRhICsgIlxuIjsgLy8kTk9OLU5MUy0xJAorCQkJdGFncyArPSAiPC9nbWw6cG9zTGlzdD5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJCXRhZ3MgKz0gIjwvZ21sOkxpbmVhclJpbmc+XG4iOyAvLyROT04tTkxTLTEkCisJCQl0YWdzICs9ICI8L2dtbDpvdXRlckJvdW5kYXJ5SXM+XG4iOyAvLyROT04tTkxTLTEkCisJCQl0YWdzICs9ICI8L2dtbDpQb2x5Z29uPlxuIjsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJcmV0dXJuIHRhZ3M7CisJfQorCisJLyoqCisJICogR2VuZXJhdGUgdGhlIG9wZW5pbmcgdGFncyBmb3IgdGhpcyBHTUwgZmlsZS4KKwkgKiAKKwkgKiBAcGFyYW0gY29kZQorCSAqICAgICAgICAgICAgdGhlIElTTyBjb2RlCisJICogQHBhcmFtIGxldmVsCisJICogICAgICAgICAgICB0aGUgYWRtaW4gbGV2ZWwKKwkgKiBAcmV0dXJuIHRoZSBvcGVuaW5nIHRhZ3MgZm9yIHRoZSBHTUwgZmlsZQorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3BlbmluZ1RhZ3MoSVNPQ29kZTEgY29kZSwgaW50IGxldmVsKSB7CisKKwkJLy8gQ2FsZW5kYXIgZGF0ZSA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisKKwkJU3RyaW5nIHRhZ3MgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iOyAvLyROT04tTkxTLTEkCisJCXRhZ3MgKz0gR2VuVXRpbHMuZ2VHTUxDb3B5cmlnaHQoKTsKKwkJdGFncyArPSBHZW5VdGlscy5nZXRHTUxLZXlGb3JtYXRFeHBsYW5hdGlvbigpOworCQl0YWdzICs9ICI8TWFwIHhtbG5zOmdtbD1cImh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sXCIgeG1sbnM6Z2VvcnNzPVwiaHR0cDovL3d3dy5nZW9yc3Mub3JnL2dlb3Jzc1wiPlxuIjsgLy8kTk9OLU5MUy0xJAorCQl0YWdzICs9ICI8dGl0bGU+IiArIGNvZGUuZ2V0QWxwaGEzKCkgKyAiIExldmVsICIgKyBsZXZlbCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkrICIgTWFwPC90aXRsZT5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSAiPHN1YlRpdGxlPkFkbWluaXN0cmF0aXZlIEJvdW5kYXJpZXM8L3N1YlRpdGxlPlxuIjsgLy8kTk9OLU5MUy0xJAorCQl0YWdzICs9ICI8dXBkYXRlZD5UdWUgTm92IDA3IDE2OjU3OjU1IFBTVCAyMDA2IDwvdXBkYXRlZD5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSAiPGVudHJ5PlxuIjsgLy8kTk9OLU5MUy0xJAorCQl0YWdzICs9ICI8Z2VvcnNzOndoZXJlPlxuIjsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gdGFnczsKKwl9CisKKwkvKioKKwkgKiBHZW5lcmF0ZSB0aGUgY2xvc2luZyB0YWdzIGZvciB0aGlzIEdNTCBmaWxlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGNsb3NpbmcgdGFncyBvZiB0aGUgR01MIGZpbGUKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldENsb3NpbmdUYWdzKCkgeworCQlTdHJpbmcgdGFncyA9ICI8L2dlb3Jzczp3aGVyZT5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSAiPC9lbnRyeT5cbiI7IC8vJE5PTi1OTFMtMSQKKwkJdGFncyArPSAiPC9NYXA+XG4iOyAvLyROT04tTkxTLTEkCisJCXJldHVybiB0YWdzOworCX0KKworCS8qKgorCSAqIFRoZSBleGVjdXRpb24gZW50cnkgcG9pbnQKKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJLy8gZmluYWwgaW50IFRIUkVTSE9MRCA9IDA7CisJCS8vIGZpbmFsIGludCBJU09fMzE2Nl8xID0gMTsKKwkJLy8gZmluYWwgaW50IElTT18zMTY2XzIgPSAyOworCQkvLyBmaW5hbCBpbnQgRklYX0ZJTEUgPSAzOworCQkvLyBmaW5hbCBpbnQgVEFSR0VUX0xJU1QgPSA0OworCQkvLyBmaW5hbCBpbnQgTEVYX0RJUiA9IDU7CisJCS8vIGZpbmFsIGludCBPVVRQVVRfRElSID0gNjsKKwkJLy8gZmluYWwgaW50IFBBUkFNUyA9IDc7CisJCS8vCisJCS8vIGlmIChhcmdzLmxlbmd0aCA8IFBBUkFNUykgeworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tV3JvbmcgYXJndW1lbnRzLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0CisJCS8vIC5wcmludGxuKCJcdFRvIHJ1biwgcGxlYXNlIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhcmd1bWVudHMgOiAiKTsKKwkJLy8gLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgVGhyZXNob2xkIChpbiBkZWdyZWVzKSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBJU08gMzE2Ni0xIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgSVNPIDMxNjYtMiBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IElTTyBmaXggZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBUYXJnZXQgY291bnRyaWVzIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgTGV4aWNvZ3JhcGhpYyBzb3J0aW5nIGRpcmVjdG9yeSIpOworCQkvLyAvLyROT04tTkxTLTEkJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgT3V0cHV0IGRpcmVjdG9yeSIpOyAvLyROT04tTkxTLTEkCisJCS8vIHJldHVybjsKKwkJLy8gfQorCQkvLworCQkvLyBTaW5nbGVQYXNzRG93blNhbXBsZXIgc2FtcGxlciA9IG5ldyBTaW5nbGVQYXNzRG93blNhbXBsZXIoCisJCS8vIGFyZ3NbVEhSRVNIT0xEXSwgYXJnc1tJU09fMzE2Nl8xXSwgYXJnc1tJU09fMzE2Nl8yXSwKKwkJLy8gYXJnc1tGSVhfRklMRV0sIGFyZ3NbVEFSR0VUX0xJU1RdLCBhcmdzW0xFWF9ESVJdLAorCQkvLyBhcmdzW09VVFBVVF9ESVJdKTsKKwkJLy8gc2FtcGxlci5ydW4oKTsKKworCQlmaW5hbCBpbnQgQ09ORklHX0ZJTEUgPSAwOworCQlmaW5hbCBpbnQgUEFSQU1TID0gMTsKKworCQlpZiAoYXJncy5sZW5ndGggPCBQQVJBTVMpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdC0tV3JvbmcgYXJndW1lbnRzLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRcdFRvIHJ1biwgcGxlYXNlIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhcmd1bWVudChzKSA6ICIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdCBDb25maWd1cmF0aW9uIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLmV4aXQoMSk7CisJCX0KKworCQlTaW5nbGVQYXNzRG93blNhbXBsZXIgc2FtcGxlciA9IG5ldyBTaW5nbGVQYXNzRG93blNhbXBsZXIoCisJCQkJYXJnc1tDT05GSUdfRklMRV0pOworCisJCXNhbXBsZXIucnVuKCk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvU3BsaXRMb2dGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL1NwbGl0TG9nRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYjY5M2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL1NwbGl0TG9nRmlsZS5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCisvKioKKyAqIFNwbGl0IGEgbG9nIGZpbGUgaW50byAyIG9yIG1vcmUgZmlsZXMKKyAqLworcHVibGljIGNsYXNzIFNwbGl0TG9nRmlsZSB7CisKKwlzdGF0aWMgU3RyaW5nIExTID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCisJCisJCisJLyoqCisJICogCisJICogQHBhcmFtIGFyZ3MKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgeworCQlpZihhcmdzLmxlbmd0aCA8IDEpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IFNwbGl0TG9nRmlsZSA8bG9nIGZpbGU+IDxzZWdtZW50cz4iKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLmV4aXQoLTEpOworCQl9CisJCQorCQlTdHJpbmcgbG9nRmlsZSA9IGFyZ3NbMF07CisJCWludCBzZWdtZW50cyA9IDI7IC8vZGVmYXVsdAorCQlpZihhcmdzLmxlbmd0aCA9PSAyKQorCQkJc2VnbWVudHMgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbMV0pOworCQkKKwkJCisJCUFycmF5TGlzdDxTdHJpbmc+aGVhZGVycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworLy8JCUFycmF5TGlzdDxBcnJheUxpc3Q8U3RyaW5nPj5sb2dUZXh0ID0gbmV3IEFycmF5TGlzdDxBcnJheUxpc3Q8U3RyaW5nPj4oKTsKKy8vCQlBcnJheUxpc3Q8QXJyYXlMaXN0PERvdWJsZT4+bG9nRGF0YSA9IG5ldyBBcnJheUxpc3Q8QXJyYXlMaXN0PERvdWJsZT4+KCk7CisvLwkJTGlzdDxTdHJpbmc+aXRlcmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworLy8JCUxpc3Q8U3RyaW5nPnRpbWVzdGFtcHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKy8vCQlMaXN0PExpc3Q+ZGF0YVZhbHMgPSBuZXcgQXJyYXlMaXN0PExpc3Q+KCk7CisJCQorCQl0cnkgeworCQkJIC8vIFJlYWQgaW5mZWN0aW91cyBmaWxlCisJCQkgRmlsZUlucHV0U3RyZWFtIGlmaWxlID0gbmV3IEZpbGVJbnB1dFN0cmVhbShsb2dGaWxlKTsgCisJCSAgICAgQnVmZmVyZWRSZWFkZXIgaXJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaWZpbGUpKTsKKwkJICAgICBTdHJpbmcgaGVhZGVyID0gbnVsbDsKKwkJICAgICBoZWFkZXI9aXJlYWRlci5yZWFkTGluZSgpOworCQkgICAgIGlmKGhlYWRlciA9PSBudWxsKSB7CisJCSAgICAJIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IsICIrYXJnc1swXSsiIGZpbGUgaXMgZW1wdHkhIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkgICAgCSBTeXN0ZW0uZXhpdCgtMik7CisJCSAgICAgfQorCQkgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaGVhZGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCisJCSAgICAgaW50IGNvbHVtbiA9IDA7CisJCSAgICAgd2hpbGUoc3QuaGFzTW9yZVRva2VucygpKSB7CisJCSAgICAJIFN0cmluZyB2YWwgPSBzdC5uZXh0VG9rZW4oKTsKKwkJICAgIAkgaGVhZGVycy5hZGQodmFsLnRyaW0oKSk7CisJCSAgICAJICsrY29sdW1uOworCQkgICAgIH0KKwkJICAgIAorCQkgICAKKwkJICAgIAorCQkgICAgRmlsZVdyaXRlciBbXSB3cml0ZXJzID0gbnVsbDsKKwkJICAgIGludCBjb2x1bW5zcGVyZmlsZSA9IChoZWFkZXJzLnNpemUoKS0yKS9zZWdtZW50czsKKwkJICAgIHdyaXRlcnMgPSBuZXcgRmlsZVdyaXRlcltzZWdtZW50c107CisJCSAgICBmb3IoaW50IGk9MDtpPHNlZ21lbnRzOysraSkgeworCQkgICAgCXdyaXRlcnNbaV0gPSBuZXcgRmlsZVdyaXRlcihsb2dGaWxlKyIuIitpKyIuY3N2Iik7CisJCSAgICAJd3JpdGVyc1tpXS53cml0ZShoZWFkZXJzLmdldCgwKSk7CisJCSAgICAJd3JpdGVyc1tpXS53cml0ZSgiLCIpOworCQkgICAgCXdyaXRlcnNbaV0ud3JpdGUoaGVhZGVycy5nZXQoMSkpOworCQkgICAgCXdyaXRlcnNbaV0ud3JpdGUoIiwiKTsKKwkJICAgIAlpbnQgZW5kID0gKGk9PXNlZ21lbnRzLTEpPyBoZWFkZXJzLnNpemUoKSA6ICgyKyhpKzEpKmNvbHVtbnNwZXJmaWxlKTsKKwkJICAgIAlmb3IoaW50IGo9MitpKmNvbHVtbnNwZXJmaWxlO2o8ZW5kOysraikgeworCQkgICAgCQl3cml0ZXJzW2ldLndyaXRlKGhlYWRlcnMuZ2V0KGopKTsKKwkJICAgIAkJaWYoajxlbmQtMSl3cml0ZXJzW2ldLndyaXRlKCIsIik7CisJCSAgICAJfQorCQkgICAgCXdyaXRlcnNbaV0ud3JpdGUoTFMpOworCQkgICAgfQorCQkgICAgCisJCSAgICBTdHJpbmcgZGF0YSA9IG51bGw7IAorCQkgICAgZGF0YT1pcmVhZGVyLnJlYWRMaW5lKCk7CisJCSAgICBpZihkYXRhID09IG51bGwpIHsKKwkJICAgIAkgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciwgIithcmdzWzBdKyIgZmlsZSBoYXMgbm8gZGF0YSEiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCSAgICAJIFN5c3RlbS5leGl0KC0yKTsKKwkJICAgICB9CisJCSAgICB3aGlsZShkYXRhICE9IG51bGwgJiYgZGF0YS50cmltKCkubGVuZ3RoKCkgPiAwKSB7CisJCQkgICAgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRhdGEsICIsIik7IC8vJE5PTi1OTFMtMSQKKwkJCSAgICBjb2x1bW4gPSAwOworCQkJICAgIEFycmF5TGlzdDxTdHJpbmc+IHR4dGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCSAgICBBcnJheUxpc3Q8RG91YmxlPiBkYXRhbGlzdCA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOworCQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQkJU3RyaW5nIHZhbCA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKKwkJCQkJdHh0bGlzdC5hZGQodmFsKTsKKwkJCQkgICAgKysgY29sdW1uOworCQkJICAgIH0gLy8gcmVhZCB0b2tlbnMKKwkJCQkKKwkJCQlmb3IoaW50IGk9MDtpPHNlZ21lbnRzOysraSkgeworCQkJCQl3cml0ZXJzW2ldLndyaXRlKHR4dGxpc3QuZ2V0KDApKTsKKwkJCQkgCXdyaXRlcnNbaV0ud3JpdGUoIiwiKTsKKwkJCQkJd3JpdGVyc1tpXS53cml0ZSh0eHRsaXN0LmdldCgxKSk7CisJCQkJIAl3cml0ZXJzW2ldLndyaXRlKCIsIik7CisJCQkJIAkKKwkJCQkJaW50IGVuZCA9IChpPT1zZWdtZW50cy0xKT8gaGVhZGVycy5zaXplKCkgOiAoMisoaSsxKSpjb2x1bW5zcGVyZmlsZSk7CisJCQkgICAgCWZvcihpbnQgaj0yK2kqY29sdW1uc3BlcmZpbGU7ajxlbmQ7KytqKSB7CisJCQkgICAgCQl3cml0ZXJzW2ldLndyaXRlKHR4dGxpc3QuZ2V0KGopKTsKKwkJCSAgICAJCWlmKGo8ZW5kLTEpd3JpdGVyc1tpXS53cml0ZSgiLCIpOworCQkJICAgIAl9CisJCQkgICAgCXdyaXRlcnNbaV0ud3JpdGUoTFMpOworCQkJCX0KKwkJCQl0eHRsaXN0LmNsZWFyKCk7CisJCQkJZGF0YT1pcmVhZGVyLnJlYWRMaW5lKCk7CisJCSAgICB9CisJCSAgICBpcmVhZGVyLmNsb3NlKCk7CisJCSAgICBmb3IoaW50IGk9MDtpPHNlZ21lbnRzOysraSkge3dyaXRlcnNbaV0uZmx1c2goKTt3cml0ZXJzW2ldLmNsb3NlKCk7fQorCQkgICAgLy8gUHJvY2VzcyB0aGUgZGF0YQorCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJCQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9VUkxHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvVVJMR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4NGUxZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvVVJMR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwyMDkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5LmdlbmVyYXRvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFNURU0gSUkgRGF0YSBNaWdyYXRpb24vR2VuZXJhdGlvbiBVdGlsaXRpZXMgLS0gSW5zdGFuY2VzIG9mIHRoaXMgdXRpbGl0eQorICogY2xhc3MgY29sbGVjdCBhbGwgdGhlIFVSTHMgYW5kIHN0b3JlcyB0aGVtIGluIGEgc2luZ2xlIGZpbGUuCisgKiAKKyAqLworCitwdWJsaWMgY2xhc3MgVVJMR2VuZXJhdG9yIHsKKworCS8qKgorCSAqIE91ciBzb3VyY2UgZmlsZXMgZm9yIElTTyAzMTY2LTEgY29kZXMgYW5kIGZvciB0aGUgbGlzdCBvZiB0YXJnZXQKKwkgKiBjb3VudHJpZXMuCisJICovCisKKwlwcml2YXRlIFN0cmluZyBpc29GaWxlID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIHVybEZpbGUgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RGlyID0gbnVsbDsKKworCS8qKgorCSAqIExpc3QgZm9yIElTTyAzMTY2LTEgY29kZXMgYW5kIHRhcmdldCBjb3VudHJpZXMuCisJICovCisKKwlMaXN0IHVybHMgPSBudWxsOworCisJTGlzdCBjb2RlTGlzdCA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqIAorCSAqIEBwYXJhbSBpc29GaWxlCisJICogICAgICAgICAgICBkYXRhIGZpbGUgY29udGFpbmluZyB0aGUgSVNPMzE2Ni0xIGNvZGVzCisJICogQHBhcmFtIHVybEZpbGUgLQorCSAqICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIFVSTHMgZm9yIGNvdW50cmllcyBpbiBvdXQgZGF0YSBzZXQKKwkgKiBAcGFyYW0gb3V0cHV0RGlyIC0KKwkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGUgZmlsZXMgZ2VuZXJhdGVkLgorCSAqIAorCSAqLworCXB1YmxpYyBVUkxHZW5lcmF0b3IoU3RyaW5nIGlzb0ZpbGUsIFN0cmluZyB1cmxGaWxlLCBTdHJpbmcgb3V0cHV0RGlyKSB7CisJCXRoaXMuaXNvRmlsZSA9IGlzb0ZpbGU7CisJCXRoaXMudXJsRmlsZSA9IHVybEZpbGU7CisJCXRoaXMub3V0cHV0RGlyID0gb3V0cHV0RGlyOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNldHMgdXAgYW5kIHJ1bnMgdGhpcyBnZW5lcmF0b3IuCisJICogCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIGNvdW50cmllcyB3ZSB3YW50LgorCQl1cmxzID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KHVybEZpbGUpOworCisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgSVNPMzE2Ni0xIEFMUEhBMiwgQUxQSEEzLCBhbmQKKwkJLy8gbnVtZXJpYyBjb2Rlcy4KKwkJY29kZUxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QoaXNvRmlsZSk7CisKKwkJLy8gTm93LCBwcm9jZXNzIGVhY2ggaXRlbSBpbiB0aGUgdGFyZ2V0IGxpc3QuCisJCXByb2Nlc3MoKTsKKwl9CisKKwkvKioKKwkgKiBQcm9jZXNzIG91ciBnbG9iYWwgbGlzdCBvZiBjb3VudHJpZXMgLS0gZmluZCBhbmQgYWRkIGEgVVJMIGZvciBlYWNoCisJICogY291bnRyeS4KKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcm9jZXNzKCkgeworCisJCWZpbmFsIGludCBDT1VOVFJZID0gMDsKKwkJUHJpbnRXcml0ZXIgb3V0cHV0RmlsZSA9IG51bGw7CisKKwkJLy8gQSBVUkwgbG9jYXRpb24gaXMgYSBmb2xkZXIgd2l0aCBVUkwgZmlsZXMKKwkJLy8gZm9yIGV2ZXJ5IFVSTCBsb2NhdGlvbgorCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMuc2l6ZSgpOyBpKyspIHsKKworCQkJLy8gR2V0IHRoZSBuZXh0IFVSTCBsb2NhdGlvbiBpbiB0aGUgbGlzdC4KKwkJCVN0cmluZyB1cmxMb2NhdGlvbiA9ICgoU3RyaW5nKSB1cmxzLmdldChpKSkudHJpbSgpOworCisJCQkvLyBJZiB0aGlzIGxpbmUgc3RhcnRzIHdpdGggIiMiLCB0aGVuIGlnbm9yZSBpdC4KKwkJCWlmICh1cmxMb2NhdGlvbi50cmltKCkuc3RhcnRzV2l0aCgiIyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiVVJMIGlzIDogIiArIHVybExvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAorCisJCQkvLyBPcGVuIHRoZSBVUkwgbG9jYXRpb24gKGEgZm9sZGVyIHRoYXQgY29udGFpbnMgVVJMIGZpbGVzKQorCQkJRmlsZSBkaXIgPSBHZW5VdGlscy5vcGVuRGlyZWN0b3J5KHVybExvY2F0aW9uKTsKKworCQkJdHJ5IHsKKworCQkJCWlmIChkaXIgIT0gbnVsbCkgeworCisJCQkJCS8vIEdldCBhIFVSTCBmaWxlCisJCQkJCUZpbGVbXSB1cmxGaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKKworCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHVybEZpbGVzLmxlbmd0aDsgaisrKSB7CisKKwkJCQkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IEdlblV0aWxzLm9wZW5SZWFkZXIodXJsRmlsZXNbal0KKwkJCQkJCQkJLmdldEFic29sdXRlUGF0aCgpKTsKKworCQkJCQkJU3RyaW5nIHVybCA9IG51bGw7CisKKwkJCQkJCS8vIFJlYWQgYSBVUkwKKwkJCQkJCXdoaWxlIChHZW5VdGlscy5FT0YodXJsID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IHRydWUpIHsKKwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZXMKKwkJCQkJCQkJCS5nZXRTdHJpbmcoIlVSTEdlbmVyYXRvci4yIikgKyB1cmwpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJLy8gSWYgdGhpcyBsaW5lIHN0YXJ0cyB3aXRoICIjIiwgdGhlbiBpZ25vcmUgaXQuCisJCQkJCQkJaWYgKHVybC50cmltKCkuc3RhcnRzV2l0aCgiIyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCisJCQkJCQkJU3RyaW5nW10gdG9rZW5zID0gdXJsRmlsZXNbal0uZ2V0TmFtZSgpCisJCQkJCQkJCQkuc3BsaXQoIlxcLiIpOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCQkvLyBHZXQgdGhlIElTTzMxNjYtMSBpbmZvIGZvciB0aGlzIGNvdW50cnkKKwkJCQkJCQlJU09Db2RlMSBpc29Db2RlID0gR2VuVXRpbHMuZ2V0SVNPQ29kZSgKKwkJCQkJCQkJCXRva2Vuc1tDT1VOVFJZXSwgY29kZUxpc3QpOworCQkJCQkJCWlmIChpc29Db2RlID09IG51bGwpIHsKKwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzCisJCQkJCQkJCQkJLmdldFN0cmluZygiVVJMR2VuZXJhdG9yLjUiKSAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyB0b2tlbnNbQ09VTlRSWV0pOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBPcGVuIG91dHB1dCBmaWxlCisJCQkJCQkJaWYgKG91dHB1dEZpbGUgPT0gbnVsbCkgeworCQkJCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBvdXRwdXREaXI7CisJCQkJCQkJCWZpbGVOYW1lICs9IHRva2Vuc1tDT1VOVFJZXQorCQkJCQkJCQkJCSsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJVUkxHZW5lcmF0b3IuNiIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCW91dHB1dEZpbGUgPSBHZW5VdGlscy5vcGVuV3JpdGVyKGZpbGVOYW1lKTsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBOb3cgd3JpdGUgdGhlIFVSTCB0byBvdXIgZmlsZQorCQkJCQkJCW91dHB1dEZpbGUud3JpdGUoaXNvQ29kZS5nZXROYW1lKCkgKyAiOiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJKyBpc29Db2RlLmdldEFscGhhMygpICsgIjoiICsgdXJsICsgIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihpc29Db2RlLmdldE5hbWUoKSArICI6IiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkrIGlzb0NvZGUuZ2V0QWxwaGEzKCkgKyAiOiIgKyB1cmwgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQkJCX0gLy8gaW50ZXJuYWwgd2hpbGUKKworCQkJCQkJcmVhZGVyLmNsb3NlKCk7CisKKwkJCQkJCWlmIChvdXRwdXRGaWxlICE9IG51bGwpIHsKKwkJCQkJCQlvdXRwdXRGaWxlLmNsb3NlKCk7CisJCQkJCQkJb3V0cHV0RmlsZSA9IG51bGw7CisJCQkJCQl9CisKKwkJCQkJCS8vIFJ1biBnYXJiYWdlIGNvbGxlY3Rpb24KKwkJCQkJCS8vU3lzdGVtLmdjKCk7CisKKwkJCQkJfSAvLyBmb3IgagorCisJCQkJfSAvLyBpZiAoZGlyICE9IG51bGwpcworCisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKworCQl9IC8vIGZvciBpCisKKwl9CisKKwkvKioKKwkgKiBFeGVjdXRpb24gZW50cnkgcG9pbnQKKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJZmluYWwgaW50IElTT19GSUxFID0gMDsKKwkJZmluYWwgaW50IFVSTF9JTkRFWCA9IDE7CisJCWZpbmFsIGludCBPVVRQVVRfRElSID0gMjsKKwkJZmluYWwgaW50IFBBUkFNUyA9IDM7CisKKwkJaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS1Xcm9uZyBhcmd1bWVudHMtLSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0CisJCQkJCS5wcmludGxuKCJcdFRvIHJ1biwgcGxlYXNlIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhcmd1bWVudHMgOiAiKTsgLy8kTk9OLU5MUy0xJAkJCQorCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IElTTyAzMTY2LTEgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgVVJMIGluZGV4IGZpbGUiKTsgLy8kTk9OLU5MUy0xJAkJCQorCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IE91dHB1dCBkaXJlY3RvcnkiKTsgLy8kTk9OLU5MUy0xJAkJCQkKKwkJCXJldHVybjsKKwkJfQorCisJCVVSTEdlbmVyYXRvciBnZW4gPSBuZXcgVVJMR2VuZXJhdG9yKGFyZ3NbSVNPX0ZJTEVdLCBhcmdzW1VSTF9JTkRFWF0sCisJCQkJYXJnc1tPVVRQVVRfRElSXSk7CisJCWdlbi5ydW4oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvVVNBMkRpdmFGb3JtYXRDb252ZXJ0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvVVNBMkRpdmFGb3JtYXRDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2QzMmI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9VU0EyRGl2YUZvcm1hdENvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsNDUxIEBACisvKioKKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS5nZW5lcmF0b3JzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiAKKyAqIFNURU0gSUkgRGF0YSBNaWdyYXRpb24vR2VuZXJhdGlvbiBVdGlsaXRpZXMgOiBJbnN0YW5jZXMgb2YgdGhpcyB1dGlsaXR5IGNsYXNzCisgKiBjb252ZXJ0IGRhdGEgZnJvbSBhbiBhbHRlcm5hdGl2ZSBmb3JtYXQgaW50byBEaXZhIGZvcm1hdC4gSXQgd2FzIHVzZWQgZm9yIGEKKyAqIHZlcnkgc3BlY2lmaWMgcHVycG9zZSB0byBoZWxwIGJyaW5nIHRoZSBkYXRhIGZvciB0aGUgVVNBIGludG8gdGhlIHNhbWUgZm9ybWF0CisgKiBhcyB0aGUgcmVzdCBvZiB0aGUgZmlsZXMgaW4gdGhlIERpdmEgc2V0LgorICogCisgKiAKKyAqIFRvIGNvbmZpZ3VyZSwgc2VlIGNvbmZpZ3VyYXRpb24gZmlsZSA6CisgKiBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvY29uZmlndXJhdGlvbi9VU0EyRGl2YUZvcm1hdENvbnZlcnRlci5jb25maWcKKyAqIAorICogCisgKiBUbyBydW4sIGFkZCBwYXRoIHRvIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiB0aGUgcnVuIHByb2ZpbGUgKGkuZS4KKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcY29uZmlndXJhdGlvblxVU0EyRGl2YUZvcm1hdENvbnZlcnRlci5jb25maWcpCisgKiAKKyAqIFRvIHJ1biwgYWRkIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyB0byB0aGUgcnVuIGNvbmZpZ3VyYXRpb246CisgKiAKKyAqIEM6XHN0ZW1JSVxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcZGF0YU1pZ3JhdGlvblxpbnB1dFxVU0FfTDFfRGF0YVxVU0FfTDEudHh0CisgKiBDOlxzdGVtSUlcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XGRhdGFNaWdyYXRpb25caW5wdXRccHJvcGVydGllc1xmb3JtYXRMaXN0LnR4dAorICogQzpcZGl2YVxOb3J0aEFtZXJpY2FcVVNBXAorICogCisgKi8KKworcHVibGljIGNsYXNzIFVTQTJEaXZhRm9ybWF0Q29udmVydGVyIHsKKworCS8qKgorCSAqIE91ciBzb3VyY2UgZmlsZXMgZm9yIElTTyAzMTY2LTEgY29kZXMgYW5kIGZvciB0aGUgbGlzdCBvZiB0YXJnZXQKKwkgKiBjb3VudHJpZXMuCisJICovCisJLy8gcHJpdmF0ZSBTdHJpbmcgaXNvMzE2Nl8xID0gbnVsbDsKKwlwcml2YXRlIFN0cmluZyB1c2FMMUZpbGUgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0RmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFN0cmluZyBvdXRwdXREaXIgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgd29ya3NwYWNlID0gbnVsbDsKKworCS8qKgorCSAqIExpc3QgZm9yIElTTyAzMTY2LTEgY29kZXMgYW5kIHRhcmdldCBjb3VudHJpZXMuCisJICovCisKKwlMaXN0IHRhcmdldExpc3QgPSBudWxsOworCisJLy8gTGlzdCBjb2RlTGlzdCA9IG51bGw7CisKKwlMaXN0IGRhdGFMaXN0ID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICogCisJICogQHBhcmFtIHVzYUwxRmlsZSAtCisJICogICAgICAgICAgICBkYXRhIGZpbGUgd2l0aCB0aGUgSVNPMzE2Ni0xIEFMUEhBXzIgYW5kIEFMUEhBXzMgY29kZXMuCisJICogQHBhcmFtIHRhcmdldEZpbGUgLQorCSAqICAgICAgICAgICAgZGF0YSBmaWxlIHdoZXJlIHdlIGZpbmQgYSBsaXN0IG9mIGNvdW50cmllcyBmb3IgZ2VuZXJhdGlvbiBvZgorCSAqICAgICAgICAgICAgdGhlaXIgY29ycmVzcG9uZGluZyBhcmVhLnByb3BlcnRpZXMgZmlsZXMuCisJICogQHBhcmFtIG91dHB1dERpciAtCisJICogICAgICAgICAgICB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIGZpbGVzIGdlbmVyYXRlZC4KKwkgKiAKKwkgKi8KKwkvLyBwdWJsaWMgVVNBMkRpdmFGb3JtYXRDb252ZXJ0ZXIoLyogU3RyaW5nIGlzbzMxNjZfMSwgKi9TdHJpbmcgdXNhTDFGaWxlLAorCS8vIFN0cmluZyB0YXJnZXRGaWxlLCBTdHJpbmcgb3V0cHV0RGlyKSB7CisJLy8gLy8gU2V0IHZhbHVlcyBvZiBnbG9iYWwgdmFyaWFibGVzLgorCS8vIC8vIHRoaXMuaXNvMzE2Nl8xID0gaXNvMzE2Nl8xOworCS8vIHRoaXMudXNhTDFGaWxlID0gdXNhTDFGaWxlOworCS8vIHRoaXMudGFyZ2V0RmlsZSA9IHRhcmdldEZpbGU7CisJLy8gdGhpcy5vdXRwdXREaXIgPSBvdXRwdXREaXI7CisJLy8gdGFyZ2V0TGlzdCA9IG51bGw7CisJLy8gfQorCS8qKgorCSAqIEBwYXJhbSBjb25maWdGaWxlCisJICovCisJcHVibGljIFVTQTJEaXZhRm9ybWF0Q29udmVydGVyKFN0cmluZyBjb25maWdGaWxlKSB7CisKKwkJLy8gTG9hZCBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKKwkJSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFycyA9IEdlblV0aWxzLmxvYWRDb25maWdGaWxlKGNvbmZpZ0ZpbGUpOworCisJCVNldDxTdHJpbmc+IGtleXMgPSB2YXJzLmtleVNldCgpOworCQlJdGVyYXRvciBpdCA9IGtleXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJU3RyaW5nIHZhciA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKworCQkJLy8gQXNzaWduIHZhbHVlcyB0byBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyA6CisJCQlpZiAodmFyLmVxdWFscygiV09SS1NQQUNFIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXdvcmtzcGFjZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIk5BTUVTX0xJU1QiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJdXNhTDFGaWxlID0gdmFycy5nZXQodmFyKTsKKwkJCX0gZWxzZSBpZiAodmFyLmVxdWFscygiVEFSR0VUX0xJU1QiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJdGFyZ2V0RmlsZSA9IHZhcnMuZ2V0KHZhcik7CisJCQl9IGVsc2UgaWYgKHZhci5lcXVhbHMoIlBST1BFUlRJRVNfT1VUUFVUIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCW91dHB1dERpciA9IHZhcnMuZ2V0KHZhcik7CisJCQl9CisKKwkJfSAvLyB3aGlsZQorCisJCS8vIFRoZSB3b3Jrc3BhY2UgdmFyaWFibGUgc2hvdWxkIGVuZCB3aXRoIGEgc2xhc2ggY2hhcmFjdGVyCisJCWlmICh3b3Jrc3BhY2UuZW5kc1dpdGgoIlxcIikgPT0gZmFsc2UpIHsgLy8kTk9OLU5MUy0xJAorCQkJd29ya3NwYWNlICs9ICJcXCI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCVN0cmluZyBwYXRoID0gd29ya3NwYWNlICsgR2VuQ29uc3RhbnRzLlBBUkFNU19ESVI7CisKKwkJLy8gU2V0IHJlbWFpbmluZyBjb25maWcgdmFycyB1c2luZyBXT1JLU1BBQ0UgKHdvcmtzcGFjZSByZWxhdGl2ZSkKKwkJaWYgKHVzYUwxRmlsZSA9PSBudWxsKSB7CisJCQl1c2FMMUZpbGUgPSBwYXRoICsgR2VuQ29uc3RhbnRzLlVTQV9MMV9EQVRBOworCQl9CisJCWlmICh0YXJnZXRGaWxlID09IG51bGwpIHsKKwkJCXRhcmdldEZpbGUgPSBwYXRoICsgR2VuQ29uc3RhbnRzLkZPUk1BVF9MSVNUOworCQl9CisJCWlmIChvdXRwdXREaXIgPT0gbnVsbCkgeworCQkJb3V0cHV0RGlyID0gR2VuQ29uc3RhbnRzLkRVTU1ZX0RJUjsKKwkJfQorCisJCXRhcmdldExpc3QgPSBudWxsOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNldHMgdXAgYW5kIHJ1bnMgdGhpcyBnZW5lcmF0b3IuCisJICogCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQkvLyBSZWFkIGFuZCBrZWVwIGluIG1lbW9yeSBhIGxpc3Qgb2YgdGhlIGNvdW50cmllcyB3ZSB3YW50LgorCQl0YXJnZXRMaXN0ID0gR2VuVXRpbHMucG9wdWxhdGVMaXN0KHRhcmdldEZpbGUpOworCisJCS8vIFJlYWQgYW5kIGtlZXAgaW4gbWVtb3J5IGEgbGlzdCBvZiB0aGUgSVNPMzE2Ni0xIEFMUEhBMiwgQUxQSEEzLCBhbmQKKwkJLy8gbnVtZXJpYyBjb2Rlcy4KKwkJLy8gY29kZUxpc3QgPSBHZW5VdGlscy5wb3B1bGF0ZUxpc3QoaXNvMzE2Nl8xKTsKKworCQkvLyBSZWFkIGxldmVsIDEgZGF0YSBmb3IgdGhlIFVTQQorCQlkYXRhTGlzdCA9IEdlblV0aWxzLnBvcHVsYXRlTGlzdCh1c2FMMUZpbGUpOworCisJCS8vIFJ1biB0aGUgY29udmVydGVyOiBVUyBDZW5zdXMgZm9ybWF0IC0+IERpdmEgc2V0IGZvcm1hdAorCQlwcm9jZXNzKCk7CisKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0IGEgZGF0YSBmaWxlIHRoYXQgY29tZXMgaW50byB0aGUgZm9ybWF0IGZyb20gdGhlIFVTIENlbnN1cyA6CisJICogaHR0cDovL3d3dy5jZW5zdXMuZ292L2dlby93d3cvY29iL2NvMjAwMC5odG1sIGludG8gdGhlIERpdmEgZm9ybWF0IHRoYXQKKwkgKiB0aGUgZ2VuZXJhdG9ycyBjYW4gaGFuZGxlLiBCb3RoIGZvcm1hdHMsIHRoZSBVUyBDZW5zdXMgdGhlIERpdmEgZm9ybWF0CisJICogYXJlIGZpeGVkLCB3ZWxsLWRlZmluZWQgZm9ybWF0cy4gVGhpcyB3b250IGZvcm1hdCBhbnkgYXJiaXRyYXJ5IGZvcm1hdAorCSAqIGludG8gRGl2YSBmb3JtYXQuIENvbnZlcnRzIDogVVMgQ2Vuc3VzIGZvcm1hdCAtPiBEaXZhIGZvcm1hdAorCSAqIAorCSAqLworCXByb3RlY3RlZCB2b2lkIHByb2Nlc3MoKSB7CisKKwkJLy8gQSB3cml0ZXIgZm9yIHRoZSBuZXcgZmlsZSB3ZSBhcmUgY3JlYXRpbmcuCisJCVByaW50V3JpdGVyIGRpdmFGaWxlID0gbnVsbDsKKworCQkvLyBPYmplY3QgaG9sZGluZyBJU08zMTY2LTEgcmVsYXRlZCBkYXRhLgorCQkvLyBJU09Db2RlMSBpc29Db2RlID0gbnVsbDsKKworCQkvLyBOYW1lIG9mIHRoZSBuZXcgcHJvcGVydGllcyBmaWxlLgorCQlTdHJpbmcgZmlsZU5hbWUgPSBudWxsOworCisJCWludCBzaXplID0gdGFyZ2V0TGlzdC5zaXplKCk7CisKKwkJLy8gRm9yIGV2ZXJ5IGNvdW50cnkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKworCQkJLy8gR2V0IHRoZSBuZXh0IGZpbGUgaW4gdGhlIGxpc3QuCisJCQlTdHJpbmcgZmlsZSA9ICgoU3RyaW5nKSB0YXJnZXRMaXN0LmdldChpKSkudHJpbSgpOworCisJCQkvLyBPcGVuIHRoZSBkYXRhIHNvdXJjZSBmaWxlIGZvciB0aGlzIGNvdW50cnkuCisJCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBHZW5VdGlscy5vcGVuUmVhZGVyKGZpbGUpOworCQkJU3lzdGVtLm91dAorCQkJCQkucHJpbnRsbigiXHRcdDw8PDwgVVNBIFRPIERJVkEgRk9STUFUIENPTlZFUlRFUiAtLSBQcm9jZXNzaW5nIENvdW50cnkgOiAiICsgZmlsZSArICIgPj4+PiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCisJCQl0cnkgeworCisJCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7CisKKwkJCQkJU3RyaW5nIGJ1ZmZlciA9IG51bGw7CisKKwkJCQkJd2hpbGUgKEdlblV0aWxzLkVPRihidWZmZXIgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gdHJ1ZSkgeworCisJCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBtYXJrIGFsbCB1bmtub3duIGRhdGEuCisJCQkJCQlidWZmZXIgPSBidWZmZXIucmVwbGFjZSgiLCwiLCAiLFVOS05PV04sIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQkJCQlTdHJpbmdbXSBpdGVtcyA9IGJ1ZmZlci5zcGxpdCgiLCIpOyAvLyROT04tTkxTLTEkCisKKwkJCQkJCS8vIElmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgZm9yIHRoaXMgY291bnRyeSwKKwkJCQkJCS8vIGNyZWF0ZSBpdCB1c2luZyBJU08gYWxwaGEzIGNvZGUuCisJCQkJCQlGaWxlIGNvdW50cnlEaXIgPSBuZXcgRmlsZShvdXRwdXREaXIgKyAiVVNBIik7IC8vJE5PTi1OTFMtMSQKKworCQkJCQkJaWYgKGNvdW50cnlEaXIgIT0gbnVsbCAmJiBjb3VudHJ5RGlyLmV4aXN0cygpID09IGZhbHNlKSB7CisJCQkJCQkJLy8gRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBDcmVhdGUgaXQuCisJCQkJCQkJY291bnRyeURpci5ta2RpcigpOworCQkJCQkJfQorCisJCQkJCQkvLyBDcmVhdGUgYW5kIG9wZW4gdGhlIG5ldyBvdXRwdXQgZmlsZS4KKwkJCQkJCWlmIChkaXZhRmlsZSA9PSBudWxsKSB7CisJCQkJCQkJLy8gQ3JlYXRlIHRoZSBmaWxlIG5hbWUKKwkJCQkJCQlmaWxlTmFtZSA9IGNvdW50cnlEaXIgKyAiXFxVU0EudHh0IjsgLy8kTk9OLU5MUy0xJAorCisJCQkJCQkJLy8gQ3JlYXRlIHRuZSBuZXcgZmlsZQorCQkJCQkJCWRpdmFGaWxlID0gR2VuVXRpbHMub3BlbldyaXRlcihmaWxlTmFtZSk7CisJCQkJCQl9CisKKwkJCQkJCS8vIEFwcGx5IHRoZSBmb3JtYXR0aW5nIHRvIHRoZSBjdXJyZW50IGJ1ZmZlciA6IFVTCisJCQkJCQkvLyBDZW5zdXMgZm9ybWF0IC0+IERpdmEgZm9ybWF0CisJCQkJCQlTdHJpbmcgZGl2YUxpbmUgPSBjb252ZXJ0MkRpdmEoaXRlbXMpOworCisJCQkJCQkvLyBXcml0ZSB0aGUgY29udmVydGVkIGxpbmUKKwkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRGl2YSBzdHJpbmcgPSAiICsgZGl2YUxpbmUpOworCQkJCQkJR2VuVXRpbHMuYWRkRGF0YShkaXZhRmlsZSwgZGl2YUxpbmUpOworCisJCQkJCX0vLyB3aGlsZQorCisJCQkJCS8vIFRoaXMgaXMgYW4gdWdseSBoYWNrIHNpbmNlIHRoZSBlZGl0b3JzIGFyZSBub3QgcG93ZXJmdWwKKwkJCQkJLy8gZW5vdWdoIGFuZCBjYW50IGhhbmRsZSBjb3B5IHBhc3RlIG9wZXJhdGlvbnMgb2YgMjBNRUdTCisJCQkJCS8vIGFwcGVuZERhdGEoZGl2YUZpbGUpOworCisJCQkJCS8vIENsb3NlIHRoZSB0YXJnZXQgZmlsZS4KKwkJCQkJZGl2YUZpbGUuY2xvc2UoKTsKKworCQkJCQkvLyBDbG9zZSBhbGwgb3BlbiByZXNvdXJjZXMuCisJCQkJCXJlYWRlci5jbG9zZSgpOworCisJCQkJCS8vIFJ1biBnYXJiYWdlIGNvbGxlY3Rpb24KKwkJCQkJLy9TeXN0ZW0uZ2MoKTsKKworCQkJCX0KKworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisKKwkJfSAvLyBmb3IKKworCX0KKworCS8qKgorCSAqIENvbnZlcnQgdGhlIGJ1ZmZlciBnaXZlbiBpbiBVUyBDZW5zdXMgZm9ybWF0IGludG8gRGl2YSBmb3JtYXQKKwkgKiAKKwkgKiBAcGFyYW0gZGF0YQorCSAqICAgICAgICAgICAgYSBidWZmZXIgd2l0aCBkYXRhIG9uIFVTIENlbnN1cyBmb3JtYXQKKwkgKiAKKwkgKiBAcmV0dXJuIGNvbnZlcnRlZCBzdHJpbmcKKwkgKiAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnQyRGl2YShTdHJpbmdbXSBkYXRhKSB7CisKKwkJLy8gVXNlZnVsIHN5bWJvbGljIGNvbnN0YW50cworCQlmaW5hbCBpbnQgU1RBVEVfSUQgPSA0OworCQlmaW5hbCBpbnQgTDFfQURNSU4gPSA1OworCQlmaW5hbCBpbnQgTDJfQURNSU4gPSA2OworCQlmaW5hbCBpbnQgTDJfQURNSU5fVFlQRSA9IDg7IC8vIFZBTElEIFRZUEVTID0gQk9ST1VHSCwgUEFSSVNILENPVU5UWSwKKwkJLy8gQ0lUWS4gSU5WQUxJRCA9IENFTlNVUyBBUkVBCisKKwkJLy8gTGV2ZWwgb2YgdGhlIGRhdGEgd2UgYXJlIHByb2Nlc3NpbmcKKwkJaW50IGxldmVsID0gLTE7CisKKwkJLy8gU3RhdGUgSUQKKwkJU3RyaW5nIHN0YXRlX2lkID0gbnVsbDsKKworCQkvLyBUaGUgZm9ybWF0dGVkIHByZWZpeCBzdHJpbmcKKwkJU3RyaW5nIGRpdmFTdHJpbmcgPSAiVVNBLFVuaXRlZCBTdGF0ZXMiOyAvLyROT04tTkxTLTEkCisKKwkJLy8gR2V0IHRoZSBsZXZlbCBvZiB0aGUgZGF0YSB3ZSBhcmUgcHJvY2Vzc2luZy4KKwkJbGV2ZWwgPSBHZW5VdGlscy5pc051bWVyaWMoZGF0YVtMMV9BRE1JTl0pID09IGZhbHNlID8gMSA6IDI7CisKKwkJLy8gR2V0IHRoZSBzdGF0ZSBJRAorCQlzdGF0ZV9pZCA9IGRhdGFbU1RBVEVfSURdOworCisJCS8vIEdldCByaWQgb2YgYmxhbmtzCisJCXN0YXRlX2lkID0gc3RhdGVfaWQudHJpbSgpOworCisJCS8vICogSUYgTEVWRUwgPT0gMSwgdGhlbiB3ZSBjYW4gaWdub3JlIGNvbHVtbnMgNiw3LDgsIGFuZCA5CisJCS8vCisJCS8vICoqIExldmVsIDEgZGF0YSBzaG91bGQgYmUgaW4gdGhlIGZvcm1hdDoKKwkJLy8KKwkJLy8gVVNBLCBVbml0ZWQgU3RhdGVzLCBMZXZlbDEgQWRtaW4sIDxQT0xZR09OIERBVEE+CisJCS8vCisJCS8vCisJCS8vICogSUYgTEVWRUwgPT0gMiwgdGhlbiB3ZSBjYW4gaWdub3JlIGNvbHVtbnMgNiw4LCBhbmQgOQorCQkvLworCQkvLyAqKiBMZXZlbCAyIGRhdGEgc2hvdWxkIGJlIGluIHRoZSBmb3JtYXQ6CisJCS8vCisJCS8vIFVTQSwgVW5pdGVkIFN0YXRlcywgTGV2ZWwxIEFkbWluLCBMZXZlbCAyIEFkbWluLCA8UE9MWUdPTiBEQVRBPgorCQkvLworCQkvLyBUbyBmaW5kIHRoZSBsZXZlbCAxIGNvbnRhaW5lciwgaXRlcmF0ZSBvdmVyIHRoZSBsaXN0IHdpdGggZGF0YSBmb3IKKwkJLy8gdGhlIFVTQS4gSWYgZHVyaW5nIGl0ZXJhdGlvbiB3ZSBtYXRjaCBzdGF0ZV9pZCwgdGhlbiB0aGF0IGlzIHRoZQorCQkvLyBjb250YWluZXIuCisKKwkJLy8gR2V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGJ1ZmZlcgorCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGg7CisKKwkJLy8gUHJvY2VzcyBlYWNoIGVsZW1lbnQgaW4gdGhlIGJ1ZmZlciAtLSBpZ25vcmUgdGhlIGZpcnN0IGZpdmUgaXRlbXMuCisJCWZvciAoaW50IGkgPSA1OyBpIDwgbGVuZ3RoOyBpKyspIHsKKworCQkJLy8gSWdub3JlIGlycmVsZXZhbnQgZGF0YSBpdGVtcyB0aGF0IG9jY3VyIGF0IGJvdGggbGV2ZWxzCisJCQlpZiAoaSA9PSA3IHx8IGkgPT0gOCkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvLyBJZ25vcmUgaXJyZWxldmFudCBkYXRhIHRoYXQgb25seSBvY2N1cnMgYXQgbGV2ZWwgMQorCQkJaWYgKGxldmVsID09IDEpIHsKKwkJCQlpZiAoaSA9PSA2IHx8IGkgPT0gOSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIElnbm9yZSBpcnJlbGV2YW50IGRhdGEgdGhhdCBvbmx5IG9jY3VycyBhdCBsZXZlbCAyCisJCQkvLyBJZiBsZXZlbCBpcyAyLCB0aGVuIGZpbmQgdGhlIGNvbnRhaW5lciBmb3IgdGhpcyBlbnRpdHkKKwkJCWlmIChsZXZlbCA9PSAyKSB7CisKKwkJCQkvLyBJcnJlbGV2YW50IGRhdGEsIGlnbm9yZS4KKwkJCQlpZiAoaSA9PSA1KSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCS8vIEZpbmQgdGhlIGNvbnRhaW5lciBvZiB0aGUgbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbi4KKwkJCQlpZiAoaSA9PSA2KSB7CisJCQkJCWRpdmFTdHJpbmcgKz0gIiwiICsgZmluZENvbnRhaW5lcihzdGF0ZV9pZCwgZGF0YUxpc3QpOyAvLyROT04tTkxTLTEkCisKKwkJCQkJaWYgKGRhdGFbTDJfQURNSU5fVFlQRV0uY29udGFpbnMoIkNlbnN1cyBBcmVhIikgPT0gZmFsc2UpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJLy8gQWRkIHRoZSB0eXBlIHRvIHRoZSBuYW1lIG9mIHRoZSBhZG1pbmlzdHJhdGlvbiA6CisJCQkJCQkvLyAoaS5lLiBmb3IgRmFpcmZheCA9IGFkbWluIGFuZCBjaXR5ID0gdHlwZSwgZ2V0CisJCQkJCQkvLyBGYWlyZmF4IGNpdHkpCisJCQkJCQlkaXZhU3RyaW5nICs9ICIsIiArIGRhdGFbTDJfQURNSU5dICsgIiAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCQkrIGRhdGFbTDJfQURNSU5fVFlQRV07CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJfQorCisJCQl9CisKKwkJCWRpdmFTdHJpbmcgKz0gIiwiICsgZGF0YVtpXTsgLy8kTk9OLU5MUy0xJAorCisJCX0gLy8gZm9yCisKKwkJLy8gRmluYWxseSBhZGQgYSBuZXcgbGluZSB0byB0aGUgc3RyaW5nLgorCQlkaXZhU3RyaW5nICs9ICJcbiI7IC8vJE5PTi1OTFMtMSQKKworCQlyZXR1cm4gZGl2YVN0cmluZzsKKwl9CisKKwkvKioKKwkgKiBGaW5kIHRoZSBsZXZlbCAxIGNvbnRhaW5lciBmb3IgdGhlIGN1cnJlbnQgbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbgorCSAqIAorCSAqIEBwYXJhbSBzdGF0ZSAtCisJICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIGNvbnRhaW5lciAoc3RhdGUpCisJICogCisJICogQHBhcmFtIGRhdGFMaXN0IC0KKwkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBsZXZlbCAxIGRhdGEgZm9yIHRoZSBVU0EKKwkgKiAKKwkgKiBAcmV0dXJuIC0gdGhlIG5hbWUgb2YgdGhlIGxldmVsIDEgY29udGFpbmVyCisJICogCisJICovCisJcHVibGljIFN0cmluZyBmaW5kQ29udGFpbmVyKFN0cmluZyBzdGF0ZSwgTGlzdCBkYXRhTGlzdCkgeworCisJCS8vIEZvcm1hdCBpbiBkYXRhIGxpc3QgaXMgOgorCQkvLyBVUyA6IFVTQSA6IFVTLUFMIDogQWxhYmFtYSA6IDEKKworCQkvLyBVc2VmdWwgc3ltYm9saWMgY29uc3RhbnRzCisJCWZpbmFsIGludCBDT05UQUlORVIgPSAzOworCQlmaW5hbCBpbnQgU1RBVEVfSUQgPSA0OworCisJCVN0cmluZyBzdGF0ZVN0ciA9IHN0YXRlLnJlcGxhY2UoIlxcdCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJSXRlcmF0b3IgaXQgPSBkYXRhTGlzdC5pdGVyYXRvcigpOworCisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKworCQkJU3RyaW5nIGVudHJ5ID0gKChTdHJpbmcpIGl0Lm5leHQoKSkudG9VcHBlckNhc2UoKS50cmltKCk7CisKKwkJCWVudHJ5ID0gZW50cnkucmVwbGFjZUFsbCgiXFx0IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQkJU3RyaW5nIGVudHJpZXNbXSA9IGVudHJ5LnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJU3RyaW5nIGN1cnJlbnRfaWQgPSBlbnRyaWVzW1NUQVRFX0lEXTsKKworCQkJaWYgKEludGVnZXIucGFyc2VJbnQoc3RhdGVTdHIpID09IEludGVnZXIucGFyc2VJbnQoY3VycmVudF9pZCkpIHsKKwkJCQlyZXR1cm4gZW50cmllc1tDT05UQUlORVJdLnRvVXBwZXJDYXNlKCk7CisJCQl9CisKKwkJfQorCisJCXJldHVybiAiTk9UIEZPVU5EIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIE1haW4gZXhlY3V0aW9uIGVudHJ5IHBvaW50LgorCSAqIAorCSAqIEBwYXJhbSBhcmdzCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQkvLyBmaW5hbCBpbnQgSVNPXzMxNjZfMSA9IDA7CisJCS8vIGZpbmFsIGludCBVU0FfTDFfREFUQSA9IDA7CisJCS8vIGZpbmFsIGludCBUQVJHRVRfTElTVCA9IDE7CisJCS8vIGZpbmFsIGludCBPVVRQVVRfRElSID0gMjsKKwkJLy8gZmluYWwgaW50IFBBUkFNUyA9IDM7CisJCS8vCisJCS8vIGlmIChhcmdzLmxlbmd0aCA8IFBBUkFNUykgeworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tV3JvbmcgYXJndW1lbnRzLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0CisJCS8vIC5wcmludGxuKCJcdFRvIHJ1biwgcGxlYXNlIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhcmd1bWVudHMgOiAiKTsKKwkJLy8gLy8kTk9OLU5MUy0xJAorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQgVVNBIGxldmVsIDEgZGF0YSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IFRhcmdldCBjb3VudHJpZXMgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCBPdXRwdXQgZGlyZWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gcmV0dXJuOworCQkvLyB9CisKKwkJLy8gVVNBRGl2YUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgVVNBRGl2YUNvbnZlcnRlcigvKgorCQkvLyBhcmdzW0lTT18zMTY2XzFdLCAqLworCQkvLyBhcmdzW1VTQV9MMV9EQVRBXSwgYXJnc1tUQVJHRVRfTElTVF0sIGFyZ3NbT1VUUFVUX0RJUl0pOworCQkvLyBjb252ZXJ0ZXIucnVuKCk7CisKKwkJZmluYWwgaW50IENPTkZJR19GSUxFID0gMDsKKwkJZmluYWwgaW50IFBBUkFNUyA9IDE7CisKKwkJaWYgKGFyZ3MubGVuZ3RoIDwgUEFSQU1TKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQtLVdyb25nIGFyZ3VtZW50cy0tIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQKKwkJCQkJLnByaW50bG4oIlx0XHRUbyBydW4sIHBsZWFzZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnQocykgOiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHQgQ29uZmlndXJhdGlvbiBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5leGl0KDEpOworCQl9CisKKwkJVVNBMkRpdmFGb3JtYXRDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IFVTQTJEaXZhRm9ybWF0Q29udmVydGVyKAorCQkJCWFyZ3NbQ09ORklHX0ZJTEVdKTsKKworCQljb252ZXJ0ZXIucnVuKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL1dvcmxkUmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL1dvcmxkUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhZGIzNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2Uvc3RlbS91dGlsaXR5L2dlbmVyYXRvcnMvV29ybGRSZWFkZXIuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkuZ2VuZXJhdG9yczsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFNURU0gSUkgRGF0YSBNaWdyYXRpb24vR2VuZXJhdGlvbiBVdGlsaXRpZXMgLS0gSW5zdGFuY2VzIG9mIHRoaXMgdXRpbGl0eSBjbGFzcyB0YWtlIGFzIGlucHV0CisgKiBhIGZpbGUgY29udGFpbmluZyBhIGxpc3Qgb2YgYWxsIGlucHV0IGRhdGEgd2Ugd2FudCB0byByZWFkLiBUaGUgaW5wdXQgc2hvdWxkCisgKiBiZSBpbiBFU1JJIGZvcm1hdCBhbmQgdGhlIG91dHB1dCBpcyBhIHBsYWluIHRleHQgZmlsZS4KKyAqCisgKgorICogTk9URTogdG8gcnVuIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLCB3ZSBuZWVkIE1hcFJlYWRlci5qYXZhIGZyb20gU1RFTSBJLgorICogT25jZSB3ZSBnZXQgTWFwUmVhZGVyLCB3ZSBuZWVkIHRvIHVuY29tbWVudCBsaW5lcyAxMTEtMTEzIGluIHRoaXMgZmlsZS4KKyAqIAorICogQWRkIHRoZSBmb2xsb3dpbmcgdmFsdWVzIHRvIHRoZSBydW4gY29uZmlndXJhdGlvbjoKKyAqIAorICogQzpcRWNsaXBzZVByb2plY3RzXHdvcmtzcGFjZTJcR3JlZW5TY3JlZW5cZGF0YU1pZ3JhdGlvblxpbnB1dFx3b3JsZFxOb3J0aEFtZXJpY2EudHh0CisgKiAKKyAqLworCisvKioKKyAqIAorICogTk9URTogVGhpcyBpcyBqdXN0IGFuIGV4YW1wbGUgb2YgYSByZWFsIGNvbmZpZ3VyYXRpb24uIFBhdGhzIHdpbGwgY2hhbmdlCisgKiBhY2NvcmRpbmcgdG8gdGhlIGxvY2F0aW9uIGluIHlvdXIgbWFjaGluZSBvZiB0aGUgSVNPMzE2Ni0xLCBJU08zMTY2LTIgZGF0YQorICogZmlsZXMgYXMgd2VsbCBhcyB0aGUgb3V0cHV0IGRpcmVjdG9yeSBhbmQgdGhlIGRpcmVjdG9yeSB3aGVyZSB3ZSBmaW5kIHRoZQorICogbWlncmF0ZWQgKG9yIGV4dHJhY3RlZCkgYXJlYS9wb3B1bGF0aW9uIGRhdGEgZnJvbSBTVEVNIEkuCisgKiAKKyAqIEFkZCB0aGUgZm9sbG93aW5nIHZhbHVlcyB0byB0aGUgcnVuIGNvbmZpZ3VyYXRpb246CisgKiAKKyAqIAorICogCisgKi8KKworcHVibGljIGNsYXNzIFdvcmxkUmVhZGVyIHsKKworCWZpbmFsIGludCBMT0NBVElPTiA9IDA7CisKKwlmaW5hbCBpbnQgRklMRV9OQU1FID0gMTsKKworCVN0cmluZ1tdIGxvY2F0aW9ucyA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqIAorCSAqIEBwYXJhbSBsb2NhdGlvbnMKKwkgKi8KKwlwdWJsaWMgV29ybGRSZWFkZXIoU3RyaW5nW10gbG9jYXRpb25zKSB7CisKKwkJLy8gU2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBpbnB1dCBsb2NhdGlvbnMuCisJCXRoaXMubG9jYXRpb25zID0gbG9jYXRpb25zOworCisJfQorCisJLyoqCisJICogUHJvY2VzcyBhbGwgaW5wdXQgY291bnRyeSBmaWxlcy4gRm9yIGVhY2ggY291bnRyeSBmaWxlLCBjYWxsIE1hcFJlYWRlciBvbgorCSAqIGl0IHRvIGdlbmVyYXRlIHBsYWluIHRleHQgZmlsZSBmcm9tIEVTUkkgZmlsZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwcm9jZXNzSW5wdXQoKSB7CisKKwkJU3RyaW5nIGlucHV0ID0gbnVsbDsKKworCQlpZiAobG9jYXRpb25zID09IG51bGwpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IHBsZWFzZSBzcGVjaWZ5IGFuIGlucHV0IGxvY2F0aW9uKHMpIik7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybjsKKwkJfQorCisJCWludCBzaXplID0gbG9jYXRpb25zLmxlbmd0aDsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCisJCQl0cnkgeworCQkJCS8vIEZpcnN0LCBvcGVuIHRoZSBpbnB1dCBmaWxlIC0gcHJvY2VzcyBpbnB1dCBmaWxlcyBvbmUgYXQgYQorCQkJCS8vIHRpbWUuCisKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvY2F0aW9uIGlzIDogIiArIGxvY2F0aW9uc1tpXSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcigKKwkJCQkJCWxvY2F0aW9uc1tpXSkpOworCQkJCXdoaWxlICgoaW5wdXQgPSBpbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisJCQkJCWlmIChpbnB1dC5sZW5ndGgoKSA+IDApIHsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV29ybGQgUmVhZGVyIC0tIElucHV0ID0gIiArIGlucHV0KTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJbWFwUmVhZChpbnB1dCk7CisJCQkJCX0KKwkJCQl9CisJCQkJaW4uY2xvc2UoKTsKKwkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVG9rZW5pemUgdGhlIGlucHV0IGludG8gYSBsb2NhdGlvbiBhbmQgZmlsZSBuYW1lLgorCSAqIAorCSAqIEBwYXJhbSBpbnB1dAorCSAqICAgICAgICAgICAgQSBzdHJpbmcgb2YgdGhlIGZvcm06IExPQ0FUSU9OO0ZJTEVOQU1FCisJICovCisJcHVibGljIHZvaWQgbWFwUmVhZChTdHJpbmcgaW5wdXQpIHsKKwkJLy8gU3BsaXQgaW5wdXQgc3RyaW5nIHRvIGdldCB0aGUgaW5wdXQgZm9sZGVyIGFuZCB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KKwkJU3RyaW5nW10gZGF0YSA9IGlucHV0LnNwbGl0KCI7Iik7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIGxvY2F0aW9uID0gZGF0YVtMT0NBVElPTl07CisJCVN0cmluZyBmaWxlTmFtZSA9IGRhdGFbRklMRV9OQU1FXTsKKworCQlpZiAobG9jYXRpb24gPT0gbnVsbCB8fCBmaWxlTmFtZSA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3lzdGVtLm91dC5wcmludGxuKCJMb2NhdGlvbiBpcyA6ICIgKyBsb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKKwkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIG5hbWUgaXMgOiAiICsgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCisJCU1hcFJlYWRlciBtciA9IG5ldyBNYXBSZWFkZXIoZmlsZU5hbWUudHJpbSgpKTsKKwkJbXIucmVhZERpcmVjdG9yeShsb2NhdGlvbi50cmltKCkpOworCQltci5jbG9zZUZpbGUoKTsKKwl9CisKKwkvKioKKwkgKiBFeGVjdXRpb24gZW50cnkgcG9pbnQKKwkgKiAKKwkgKiBAcGFyYW0gYXJncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJV29ybGRSZWFkZXIgd3IgPSBuZXcgV29ybGRSZWFkZXIoYXJncyk7CisJCXdyLnByb2Nlc3NJbnB1dCgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9zdGVtL3V0aWxpdHkvZ2VuZXJhdG9ycy9tZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMmE2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL3N0ZW0vdXRpbGl0eS9nZW5lcmF0b3JzL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMzggQEAKK0FkbWluMUxleFNvcnRlci4wPVByb2Nlc3NpbmcgY291bnRyeSA6IAorQWRtaW4xTGV4U29ydGVyLjM9X0FETUlOMV9MRVgudHh0CitBZG1pbjFMZXhTb3J0ZXIuMz1fQURNSU4xX0xFWC50eHQKK0FkbWluMUxleFNvcnRlci4xMD1Xcm9uZyBhcmd1bWVudHMuIFByb3ZpZGUgSVNPIDMxNjYtMSwgSVNPIDMxNjYtMiwgSVNPIGNvZGUgZml4IGZpbGUsIGxpc3Qgb2YgY291bnRyaWVzLCBhbmQgb3V0cHV0IGRpcmVjdG9yeS4KK0FkbWluMkxleFNvcnRlci4xMD1EZXNjcmlwdG9ycyBieSBsZXhpY29ncmFwaGljIG9yZGVyaW5nIDogCitBZG1pbjJMZXhTb3J0ZXIuMTE9QWRtaW4gMSA9IAorQWRtaW4yTGV4U29ydGVyLjEyPVx0XHRBdCA6IAorQWRtaW4yTGV4U29ydGVyLjE5PVx0XHRHZW5lcmF0ZWQgOiAKK0FkbWluMkxleFNvcnRlci4yMD1cdFx0R2VuZXJhdGVkIDogCitBZG1pbjJMZXhTb3J0ZXIuMjE9RGVzY3JpcHRvcnMgYnkgbGV4aWNvZ3JhcGhpYyBvcmRlcmluZyA6IAorQWRtaW4yTGV4U29ydGVyLjIyPUFkbWluIDEgPSAKK0FkbWluMkxleFNvcnRlci4yMz1BdCA6IAorQWRtaW4yTGV4U29ydGVyLjI0PVwgLS0gYWRtaW4yIGlzIDogCitBZG1pbjJMZXhTb3J0ZXIuMjU9aW5kZXhMb29rdXAgOiBlbnRyeSBub3QgZm91bmQgZm9yIAorQWRtaW4xTGV4U29ydGVyLjE9UHJvY2Vzc2luZyBjb3VudHJ5IDogCitBZG1pbjFMZXhTb3J0ZXIuMj1cID4+Pj4KK0FkbWluMUxleFNvcnRlci44PVx0XHRHZW5lcmF0ZWQgOiAKK0FkbWluMUxleFNvcnRlci45PVdyb25nIGFyZ3VtZW50cy4gUHJvdmlkZSBJU08gMzE2Ni0xLCBJU08gMzE2Ni0yLCBJU08gY29kZSBmaXggZmlsZSwgbGlzdCBvZiBjb3VudHJpZXMsIGFuZCBvdXRwdXQgZGlyZWN0b3J5LgorQWRtaW4xTGV4U29ydGVyLjk9XHRcdEdlbmVyYXRlZCA6IAorQWRtaW4yTGV4U29ydGVyLjA9UHJvY2Vzc2luZyBjb3VudHJ5IDogCitBZG1pbjJMZXhTb3J0ZXIuNT1fQURNSU4yX0xFWC50eHQKK0FkbWluMkxleFNvcnRlci45PURlc2NyaXB0b3JzIGJ5IGxleGljb2dyYXBoaWMgb3JkZXJpbmcgOiAKK0FyZWFEYXRhTWlncmF0b3IuMD1GaWxlIHBhdGggPSAKK0FyZWFEYXRhTWlncmF0b3IuMT1Mb2FkWE1MKCk6ICBFcnJvciBjb25maWd1cmluZyB4bWwgZG9jdW1lbnQgYnVpbGRlciAKK0FyZWFHZW5lcmF0b3IuMTA9Q0lBCitBcmVhR2VuZXJhdG9yLjExPUNJQQorQXJlYUdlbmVyYXRvci4xMTQ9VU5JVEVETkFUSU9OUworQXJlYUdlbmVyYXRvci4xMTU9VU5JVEVETkFUSU9OUworQXJlYUdlbmVyYXRvci4xMjI9XzJfUE9MWUFSRUEudHh0CitBcmVhR2VuZXJhdG9yLjExNj1hcmVhLnByb3BlcnRpZXMKK0FyZWFHZW5lcmF0b3IuMTIzPUxldmVsIDIgKCAKK0FyZWFHZW5lcmF0b3IuMTE3PVwgTGV2ZWwgMiBhZG1pbiA9IAorQXJlYUdlbmVyYXRvci4xMTg9XCBEZXNjcmlwdG9yID0gCitBcmVhR2VuZXJhdG9yLjExOT1cIGFyZWEgPSAKK0FyZWFHZW5lcmF0b3IuMTIwPVwgbGV2ZWwgPSAKK0FyZWFEYXRhTWlncmF0b3IuMTA9SWdub3JpbmcgbWFsZm9ybWVkIGVudHJ5IDogCitBcmVhRGF0YU1pZ3JhdG9yLjE3PUM6XFxFY2xpcHNlUHJvamVjdHNcXHdvcmtzcGFjZTJcXEdyZWVuU2NyZWVuXFxJbnN0YWxsVGVtcGxhdGVcXE1hcHNcXAorQXJlYURhdGFNaWdyYXRvci4xOT1Db3VudHJ5IGlzIDogIAorQXJlYURhdGFNaWdyYXRvci4yMD1cIGNvZGUgPSAKK0FyZWFEYXRhTWlncmF0b3IuMjE9X0FSRUEudHh0CitBcmVhRGF0YU1pZ3JhdG9yLjIyPV9BcmVhXworQXJlYURhdGFNaWdyYXRvci4yMz0ueG1sCitBcmVhRGF0YU1pZ3JhdG9yLjI0PUZpbGUgbm90IGZvdW5kIGZvciA6IAorQXJlYURhdGFNaWdyYXRvci4yOD1Xcm9uZyBhcmd1bWVudHMuIFByb3ZpZGUgSVNPIGRhdGEgZmlsZSwgbGlzdCBvZiBjb3VudHJpZXMsIGFuZCBvdXRwdXQgZGlyZWN0b3J5LgorQXJlYUdlbmVyYXRvci4xPUNJQQorQXJlYUdlbmVyYXRvci4yPVVTQ0VOU1VTUFVFUlRPUklDTworQXJlYUdlbmVyYXRvci4zPVVTQ0VOU1VTQVJFQQorQXJlYUdlbmVyYXRvci40PVVTQ0VOU1VTQk9VTkRTCitBcmVhR2VuZXJhdG9yLjU9Q0lBCitBcmVhR2VuZXJhdG9yLjY9Q0lUWVBPUFVMQVRJT04KK0FyZWFHZW5lcmF0b3IuNz1VU0NFTlNVU1BVRVJUT1JJQ08KK0FyZWFHZW5lcmF0b3IuOD1VU0NFTlNVU0JPVU5EUworQXJlYUdlbmVyYXRvci45PVVTQ0VOU1VTQVJFQQorQXJlYUdlbmVyYXRvci4wPUNJVFlQT1BVTEFUSU9OCitEaXZhQ29udmVydGVyLjE9UHJvY2Vzc2luZyBjb3VudHJ5IDogCitEaXZhQ29udmVydGVyLjE9UHJvY2Vzc2luZyBjb3VudHJ5IDogCitEaXZhQ29udmVydGVyLjc9XFxVU0EudHh0CitEaXZhQ29udmVydGVyLjg9VVNBLFVuaXRlZCBTdGF0ZXMKK0RpdmFDb252ZXJ0ZXIuMTA9Q2Vuc3VzIEFyZWEKK0RpdmFDb252ZXJ0ZXIuMjA9Tk9UIEZPVU5ECitEaXZhQ29udmVydGVyLjIxPVdyb25nIGFyZ3VtZW50cy4gUHJvdmlkZSBVU0EgbGV2ZWwgMSBkYXRhIGZpbGUsIHRhcmdldCBsaXN0LCBhbmQgb3V0cHV0IGRpcmVjdG9yeS4KK0Rvd25TYW1wbGVyLjA9V3JvbmcgYXJndW1lbnRzLiBQcm92aWRlIHRocmVzaG9sZCAoYWxwaGEgZGVncmVzcyksIHRvdGFsIHBhc3NlcywgSVNPIDMxNjYtMSBhbmQgSVNPIDMxNjYtMiBkYXRhIGZpbGVzLCBJU08gY29kZSBmaXggZmlsZSwgbGlzdCBvZiBjb3VudHJpZXMsIGFuZCBvdXRwdXQgZGlyZWN0b3JpZXMuCitHZW5VdGlscy4xNT1GT08KK0dlblV0aWxzLjE2PVVOSworR2VuVXRpbHMuMTc9VU5LCitHZW5VdGlscy4xOD0wCitHZW5VdGlscy4xOT1EZXNjcmlwdG9yIC0+IAorR2VuVXRpbHMuOT0wCitHZW5VdGlscy4zOT1cIyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cbgorR2VuVXRpbHMuNDA9XCMgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG4KK0dlblV0aWxzLjQxPVwjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG4KK0dlblV0aWxzLjQyPVwjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcbgorR2VuVXRpbHMuNDM9XCMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuCitHZW5VdGlscy40NT1cIyAqIENvbnRyaWJ1dG9yczpcbgorR2VuVXRpbHMuNDY9XCMgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KK0dlblV0aWxzLjE0PU5vdCBGb3VuZAorR2VuVXRpbHMuMTM9XCMgKiBLZXkgRm9ybWF0OiBcbgorR2VuVXRpbHMuMTI9XCMgKiBcdCBGb3IgbGV2ZWwgMSBkYXRhLCB0aGUga2V5IGlzIHRoZSBJU08zMTY2LTIgY29kZS4gQW4gSVNPMzE2Ni0yIGNvZGUgaXMgY29tcG9zZWQgYXMgZm9sbG93czogXG4KK0dlblV0aWxzLjU3PVwjICogYSB0d28gbGV0dGVyIGNvdW50cnkgY29kZSBmb2xsb3dlZCBieSB1cCB0byB0aHJlZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBmb3IgdGhlIGxldmVsIDEgYWRtaW5pc3RyYXRpb24uXG4KK0dlblV0aWxzLjU5PVwjICogXHQgRm9yIGxldmVsIDIgZGF0YSwgdGhlIGtleSBpcyB0aGUgSVNPMzE2Ni0yIGNvZGUgZm9sbG93ZWQgYnkgc2l4IGRpZ2l0cy4gVGhlIGxlZnRtb3N0IHR3byBkaWdpdHMgaW5kaWNhdGVcbgorR2VuVXRpbHMuNjA9XCMgKiB0aGUgbGV2ZWwgMSBjb250YWluZXIgb2YgYSBsZXZlbCAyIGFkbWluaXN0cmF0aW9uIChpLmUuIENhbGlmb3JuaWEgaXMgYSBsZXZlbCAxIGNvbnRhaW5lciBmb3IgT3JhbmdlIENvdW50eVxuCitHZW5VdGlscy42MT1cIyAqIHdoaWNoIGlzIGEgbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbikuICBUaGUgdHdvIGRpZ2l0cyB3ZXJlIHRha2VuIGZyb20gYSBsZXhpY29ncmFwaGljIHNvcnRpbmcgb2YgYWxsIHRoZVxuCitHZW5VdGlscy42Mj1cIyAqIGxldmVsIDEgYWRtaW5pc3RyYXRpb25zIHdpdGhpbiBhIGNvdW50cnkuIFNpbWlsYXJseSwgdGhlIGZvdXIgbGVmdG1vc3QgZGlnaXRzIGluZGljYXRlIGEgbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbi5cbgorR2VuVXRpbHMuNjM9XCMgKiBBZ2FpbiwgdGhlc2UgZm91ciBkaWdpdHMgYXJlIGFuIGluZGV4IGludG8gdGhlIGxleGljb2dyYXBoaWMgc29ydGluZyBvZiBhbGwgbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbnMgd2l0aGluIFxuCitHZW5VdGlscy42ND1cIyAqIGEgbGV2ZWwgMSBhZG1pbmlzdHJhdGlvbi4gXG4KK0dlblV0aWxzLjY4PVwjICogS2V5IEZvcm1hdDogXG4KK0dlblV0aWxzLjcwPVwjICogXHQgRm9yIGxldmVsIDEgZGF0YSwgdGhlIGtleSBpcyB0aGUgSVNPMzE2Ni0yIGNvZGUuIEFuIElTTzMxNjYtMiBjb2RlIGlzIGNvbXBvc2VkIGFzIGZvbGxvd3M6IFxuCitHZW5VdGlscy43MT1cIyAqIGEgdHdvIGxldHRlciBjb3VudHJ5IGNvZGUgZm9sbG93ZWQgYnkgdXAgdG8gdGhyZWUgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgZm9yIHRoZSBsZXZlbCAxIGFkbWluaXN0cmF0aW9uLlxuCitHZW5VdGlscy43Mz1cIyAqIFx0IEZvciBsZXZlbCAyIGRhdGEsIHRoZSBrZXkgaXMgdGhlIElTTzMxNjYtMiBjb2RlIGZvbGxvd2VkIGJ5IHNpeCBkaWdpdHMuIFRoZSBsZWZ0bW9zdCB0d28gZGlnaXRzIGluZGljYXRlXG4KK0dlblV0aWxzLjc0PVwjICogdGhlIGxldmVsIDEgY29udGFpbmVyIG9mIGEgbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbiAoaS5lLiBDYWxpZm9ybmlhIGlzIGEgbGV2ZWwgMSBjb250YWluZXIgZm9yIE9yYW5nZSBDb3VudHlcbgorR2VuVXRpbHMuNzU9XCMgKiB3aGljaCBpcyBhIGxldmVsIDIgYWRtaW5pc3RyYXRpb24pLiAgVGhlIHR3byBkaWdpdHMgd2VyZSB0YWtlbiBmcm9tIGEgbGV4aWNvZ3JhcGhpYyBzb3J0aW5nIG9mIGFsbCB0aGVcbgorR2VuVXRpbHMuNzY9XCMgKiBsZXZlbCAxIGFkbWluaXN0cmF0aW9ucyB3aXRoaW4gYSBjb3VudHJ5LiBTaW1pbGFybHksIHRoZSBmb3VyIGxlZnRtb3N0IGRpZ2l0cyBpbmRpY2F0ZSB0aGUgbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbi5cbgorR2VuVXRpbHMuNzc9XCMgKiBBZ2FpbiwgdGhlc2UgZm91ciBkaWdpdHMgYXJlIGFuIGluZGV4IGludG8gdGhlIGxleGljb2dyYXBoaWMgc29ydGluZyBvZiBhbGwgbGV2ZWwgMiBhZG1pbmlzdHJhdGlvbnMgd2l0aGluIFxuCitHZW5VdGlscy43OD1cIyAqIGEgbGV2ZWwgMSBhZG1pbmlzdHJhdGlvbi4gXG4KK0dlblV0aWxzLjgyPVwjICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuCitHZW5VdGlscy44Mz1cIyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcbgorR2VuVXRpbHMuODQ9XCMgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcbgorR2VuVXRpbHMuODU9XCMgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuCitHZW5VdGlscy44Nj1cIyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG4KK0dlblV0aWxzLjg4PVwjICogQ29udHJpYnV0b3JzOlxuCitHZW5VdGlscy44OT1cIyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgorR2VuVXRpbHMuMTE9MAorR2VuVXRpbHMuOTI9QUEKK0dlblV0aWxzLjkzPUFBQQorR2VuVXRpbHMuOTQ9RFVNTVkKK0dlblV0aWxzLjk1PUZPTworR2VuVXRpbHMuOTY9Rk9PCitHZW5VdGlscy4xMD0wCitHZW5VdGlscy4xMDY9LVVOSworR2VuVXRpbHMuMTA3PUFBCitHZW5VdGlscy4xMDg9Rk9PCitHZW5VdGlscy4xMTA9TWFsZm9ybWVkIGxleCBkYXRhIG9iamVjdC4gVG90YWwgZGF0YSBlbGVtZW50cyA9IAorR2VuVXRpbHMuMTExPS4gRXhwZWN0ZWQgOiAKK0dlblV0aWxzLjExMz1NYWxmb3JtZWQgbGV4IGRhdGEgb2JqZWN0LiBUb3RhbCBkYXRhIGVsZW1lbnRzID0gCitHZW5VdGlscy4xMTQ9LiBFeHBlY3RlZCA6IAorR2VuVXRpbHMuMTE3PUNhbnQgcmVhZCA6IAorR2VuVXRpbHMuMTE4PUNhbnQgcmVhZCA6IAorR01MR2VuZXJhdG9yLjA9PD94bWwgdmVyc2lvbj0KK0dNTEdlbmVyYXRvci4xPVwgZW5jb2Rpbmc9CitHTUxHZW5lcmF0b3IuNzI9Tm90IEZvdW5kCitHTUxHZW5lcmF0b3IuNzM9RGVzY3JpcHRvciBub3QgZm91bmQgZm9yICAKK0dNTEdlbmVyYXRvci43MT1cIGluIAorR01MR2VuZXJhdG9yLjI9Pz5cbgorR01MR2VuZXJhdG9yLjc0PSI+XG4KK0dNTEdlbmVyYXRvci43NT0iLz5cbgorR01MR2VuZXJhdG9yLjc2PSI+XG4KK0dyb3VwR2VuZXJhdG9yLjA9QzpcXHN0ZW1JSVxcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XFxkYXRhTWlncmF0aW9uXFxpbnB1dFxcc29ydFxcCitHcm91cEdlbmVyYXRvci44PV9HUk9VUEVELnR4dAorR3JvdXBHZW5lcmF0b3IuMTQ9X0FETUlOMV9MRVgudHh0CitHcm91cEdlbmVyYXRvci4xNT1fQURNSU4yX0xFWC50eHQKK0dyb3VwR2VuZXJhdG9yLjIyPVx0XHRHZW5lcmF0ZWQgOiAKK0dyb3VwR2VuZXJhdG9yLjIzPVdyb25nIGFyZ3VtZW50cy4gUHJvdmlkZSBJU08zMTY2LTEgYW5kIElTTzMxNjYtMiBmaWxlcywgSVNPIGNvZGVzIGZpeCBmaWxlLCBsaXN0IG9mIGNvdW50cmllcywgYW5kIG91dHB1dCBkaXJlY3RvcnkuCitMZXgxT2JqLjA9MAorTGV4Mk9iai4wPTAKK0xleDJPYmouMT0wCitNYXRjaFByb2ZpbGVyLjA9MAorTWF0Y2hQcm9maWxlci4xPV9QT1BVTEFUSU9OLnR4dAorTWF0Y2hQcm9maWxlci4yPV9BUkVBLnR4dAorTWF0Y2hQcm9maWxlci41OD1Xcm9uZyBhcmd1bWVudHMuIFByb3ZpZGU6IGlzbyAzMTY2LTIgZmlsZSwgQ0lBIGRhdGEsIHRhcmdldCBmaWxlLCBhbmQgbWF0Y2ggZmlsZS4gCitNdWx0aVBhc3NEb3duU2FtcGxlci4zPUM6XFxzdGVtSUlcXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxcZGF0YU1pZ3JhdGlvblxcaW5wdXRcXElTT0ZpeFxcVVNBX0ZJUFMudHh0CitNdWx0aVBhc3NEb3duU2FtcGxlci40PUM6XFxzdGVtSUlcXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxcZGF0YU1pZ3JhdGlvblxcaW5wdXRcXHNvcnRcXAorTXVsdGlQYXNzRG93blNhbXBsZXIuOD1fUkVEVUNFRF8KK011bHRpUGFzc0Rvd25TYW1wbGVyLjk9LnR4dAorTXVsdGlQYXNzRG93blNhbXBsZXIuMTE9UHJvY2Vzc2luZyBjb3VudHJ5IDogCitNdWx0aVBhc3NEb3duU2FtcGxlci4yPSUKK011bHRpUGFzc0Rvd25TYW1wbGVyLjE0PVwgb2YgCitNdWx0aVBhc3NEb3duU2FtcGxlci4yMj0udHh0CitNdWx0aVBhc3NEb3duU2FtcGxlci4yMz0udHh0CitNdWx0aVBhc3NEb3duU2FtcGxlci4yNj0ueG1sCitNdWx0aVBhc3NEb3duU2FtcGxlci4yNz0ueG1sCitNdWx0aVBhc3NEb3duU2FtcGxlci4zMz1fQURNSU4yX0xFWC50eHQKK011bHRpUGFzc0Rvd25TYW1wbGVyLjM0PV9BRE1JTjJfTEVYLnR4dAorTXVsdGlQYXNzRG93blNhbXBsZXIuNDA9QWRtaW4gTGV2ZWwgMAorTXVsdGlQYXNzRG93blNhbXBsZXIuNDI9XHRcdEdlbmVyYXRlZCA6IAorTXVsdGlQYXNzRG93blNhbXBsZXIuNDU9XCBJVEVSQVRJT04gKioqKioqKioqKioqXG4KK011bHRpUGFzc0Rvd25TYW1wbGVyLjQ2PVByb2ZpbGluZyByZXN1bHRzIEJFRk9SRSByZWR1Y3Rpb24gOiBcblxuCitNdWx0aVBhc3NEb3duU2FtcGxlci40Nz1Qcm9maWxpbmcgcmVzdWx0cyBBRlRFUiByZWR1Y3Rpb24gOiBcblxuCitNdWx0aVBhc3NEb3duU2FtcGxlci40OD0qKioqKioqKioqKioqKiBHTE9CQUwgU1RBVFMgKioqKioqKioqKioqKioKK011bHRpUGFzc0Rvd25TYW1wbGVyLjQ5PVRvdGFsIHBvbHlnb25zIDogCitNdWx0aVBhc3NEb3duU2FtcGxlci41MD1Ub3RhbCBwb2ludHMgOiAKK011bHRpUGFzc0Rvd25TYW1wbGVyLjUxPUF2ZyBwb2ludHMgcGVyIHBvbHlnb24gOiAKK011bHRpUGFzc0Rvd25TYW1wbGVyLjUyPUdsb2JhbCByZWR1Y3Rpb24gOiAKK011bHRpUGFzc0Rvd25TYW1wbGVyLjUzPUdsb2JhbCByZWR1Y3Rpb24gOiAKK011bHRpUGFzc0Rvd25TYW1wbGVyLjU1PUdsb2JhbCBNSU4gcmVkdWN0aW9uICA6IAorTXVsdGlQYXNzRG93blNhbXBsZXIuNTc9R2xvYmFsIE1BWCByZWR1Y3Rpb24gIDogCitNdWx0aVBhc3NEb3duU2FtcGxlci41OT1cIEFuZ2xlID49IAorTXVsdGlQYXNzRG93blNhbXBsZXIuNjA9XCBGcmVxdWVuY3kgOiAKK011bHRpUGFzc0Rvd25TYW1wbGVyLjYxPVwgRnJlcXVlbmN5IDogCitNdWx0aVBhc3NEb3duU2FtcGxlci45Nj0iPlxuCitNdWx0aVBhc3NEb3duU2FtcGxlci45Nz08Z21sOm91dGVyQm91bmRhcnlJcz5cbgorTXVsdGlQYXNzRG93blNhbXBsZXIuOTg9PGdtbDpvdXRlckJvdW5kYXJ5SXM+XG4KK011bHRpUGFzc0Rvd25TYW1wbGVyLjEwMj08Z21sOnBvc0xpc3Q+XG4KK011bHRpUGFzc0Rvd25TYW1wbGVyLjEwMz08Z21sOnBvc0xpc3Q+XG4KK011bHRpUGFzc0Rvd25TYW1wbGVyLjEwNT08L2dtbDpMaW5lYXJSaW5nPlxuCitNdWx0aVBhc3NEb3duU2FtcGxlci4xMDY9PC9nbWw6b3V0ZXJCb3VuZGFyeUlzPlxuCitNdWx0aVBhc3NEb3duU2FtcGxlci4xMDc9PC9nbWw6UG9seWdvbj5cbgorTXVsdGlQYXNzRG93blNhbXBsZXIuMTA4PTwvZ21sOlBvbHlnb24+XG4KK011bHRpUGFzc0Rvd25TYW1wbGVyLjExMj0iLz5cbgorTXVsdGlQYXNzRG93blNhbXBsZXIuMTEzPTxnbWw6UG9seWdvbiBnbWw6aWQ9IgorTXVsdGlQYXNzRG93blNhbXBsZXIuMTE0PSI+XG4KK011bHRpUGFzc0Rvd25TYW1wbGVyLjExNT08Z21sOm91dGVyQm91bmRhcnlJcz5cbgorTXVsdGlQYXNzRG93blNhbXBsZXIuMTE2PTxnbWw6TGluZWFyUmluZz5cbgorTXVsdGlQYXNzRG93blNhbXBsZXIuMTE3PTxnbWw6cG9zTGlzdD5cbgorTXVsdGlQYXNzRG93blNhbXBsZXIuMTE4PVxuCitNdWx0aVBhc3NEb3duU2FtcGxlci4xMjA9PC9nbWw6TGluZWFyUmluZz5cbgorTXVsdGlQYXNzRG93blNhbXBsZXIuMTIxPTwvZ21sOm91dGVyQm91bmRhcnlJcz5cbgorTXVsdGlQYXNzRG93blNhbXBsZXIuMTIyPTwvZ21sOlBvbHlnb24+XG4KK011bHRpUGFzc0Rvd25TYW1wbGVyLjEyMz08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PlxuCitNdWx0aVBhc3NEb3duU2FtcGxlci4xMjQ9PE1hcCB4bWxuczpnbWw9Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIiB4bWxuczpnZW9yc3M9Imh0dHA6Ly93d3cuZ2VvcnNzLm9yZy9nZW9yc3MiPlxuCitNdWx0aVBhc3NEb3duU2FtcGxlci4xMjU9PHRpdGxlPgorTXVsdGlQYXNzRG93blNhbXBsZXIuMTI2PVwgTGV2ZWwgCitNdWx0aVBhc3NEb3duU2FtcGxlci4xMjc9XCBNYXA8L3RpdGxlPlxuCitNdWx0aVBhc3NEb3duU2FtcGxlci4xMjg9PHN1YlRpdGxlPkFkbWluaXN0cmF0aXZlIEJvdW5kYXJpZXM8L3N1YlRpdGxlPlxuCitNdWx0aVBhc3NEb3duU2FtcGxlci4xMjk9PHVwZGF0ZWQ+VHVlIE5vdiAwNyAxNjo1Nzo1NSBQU1QgMjAwNiA8L3VwZGF0ZWQ+XG4KK011bHRpUGFzc0Rvd25TYW1wbGVyLjEzMD08ZW50cnk+XG4KK011bHRpUGFzc0Rvd25TYW1wbGVyLjEzMT08Z2VvcnNzOndoZXJlPlxuCitNdWx0aVBhc3NEb3duU2FtcGxlci4xMzI9PC9nZW9yc3M6d2hlcmU+XG4KK011bHRpUGFzc0Rvd25TYW1wbGVyLjEzMz08L2VudHJ5PlxuCitNdWx0aVBhc3NEb3duU2FtcGxlci4xMzQ9PC9NYXA+XG4KK011bHRpUGFzc0Rvd25TYW1wbGVyLjEzNT1Xcm9uZyBhcmd1bWVudHMuIFByb3ZpZGUgdGhyZXNob2xkIChhbHBoYSBkZWdyZWVzKSwgdG90YWwgcGFzc2VzLCBJU08zMTY2LTEgYW5kIElTTzMxNjYtMiBmaWxlcywgSVNPIGNvZGVzIGZpeCBmaWxlLCBsaXN0IG9mIGNvdW50cmllcywgYW5kIG91dHB1dCBkaXJlY3RvcnkuCitNdWx0aVBhc3NEb3duU2FtcGxlci4xMzY9JQorTmFtZUdlbmVyYXRvci4wPUlTTzMxNjZfMQorTmFtZUdlbmVyYXRvci4xPVByb2Nlc3NpbmcgY291bnRyeSA6IAorTmFtZUdlbmVyYXRvci4yPUM6XFxzdGVtSUlcXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxcZGF0YU1pZ3JhdGlvblxcaW5wdXRcXHNvcnRcXAorTmFtZUdlbmVyYXRvci45PV9uYW1lcy5wcm9wZXJ0aWVzCitOYW1lR2VuZXJhdG9yLjE3PV9BRE1JTjJfTEVYLnR4dAorTmFtZUdlbmVyYXRvci4xOD1fQURNSU4yX0xFWC50eHQKK05hbWVHZW5lcmF0b3IuMjM9XCBMZXZlbCAxICggCitOYW1lR2VuZXJhdG9yLjI0PVwgTGV2ZWwgMSAoIAorTmFtZUdlbmVyYXRvci4yNj1MZXZlbCAyICggCitOYW1lR2VuZXJhdG9yLjI3PUxldmVsIDIgKCAKK05hbWVHZW5lcmF0b3IuMjk9XCApLiBcbgorTmFtZUdlbmVyYXRvci4zOT1cdFx0R2VuZXJhdGVkIDogCitOYW1lR2VuZXJhdG9yLjQxPVwjIExldmVsIDBcbgorTmFtZUdlbmVyYXRvci40Mj1cblwjIExldmVsIDEgKGFkbWluIDEgPSBlLmcuLCBzdGF0ZSlcbgorTmFtZUdlbmVyYXRvci40Mz1cblwjIExldmVsIDIgKGFkbWluIDIgPSBlLmcuLCBjb3VudHJ5KVxuCitOYW1lR2VuZXJhdG9yLjQ0PVdyb25nIGFyZ3VtZW50cy4gUHJvdmlkZSBJU08gMzE2Ni0xLCBJU08gMzE2Ni0yLCBJU08gY29kZSBmaXggZmlsZSwgbGlzdCBvZiBjb3VudHJpZXMsIGFuZCBvdXRwdXQgZGlyZWN0b3J5LgorTmFtZUdlbmVyYXRvci40NT1VU0NFTlNVU1BPUAorTm9kZURhdGFHZW5lcmF0b3IuMD1DSUEKK05vZGVEYXRhR2VuZXJhdG9yLjE9SVNPMzE2Nl8xCitOb2RlRGF0YUdlbmVyYXRvci4yPUNJQQorTm9kZURhdGFHZW5lcmF0b3IuMz1DSUEKK05vZGVEYXRhR2VuZXJhdG9yLjQ9XHRcdEdlbmVyYXRlZCA6IAorTm9kZURhdGFHZW5lcmF0b3IuND1fbm9kZS5wcm9wZXJ0aWVzIAorTm9kZURhdGFHZW5lcmF0b3IuND1Qcm9jZXNzaW5nIGNvdW50cnkgOiAKK05vZGVEYXRhR2VuZXJhdG9yLjU9PDw8PCBQcm9jZXNzaW5nIGNvdW50cnkgOiAKK05vZGVEYXRhR2VuZXJhdG9yLjU9SVNPMzE2Nl8xCitOb2RlRGF0YUdlbmVyYXRvci41PVx0XHRHZW5lcmF0ZWQgOiAKK05vZGVEYXRhR2VuZXJhdG9yLjY9QzpcXHN0ZW1JSVxcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XFxkYXRhTWlncmF0aW9uXFxpbnB1dFxcc29ydFxcCitOb2RlRGF0YUdlbmVyYXRvci4xMj1cdFx0R2VuZXJhdGVkIDogCitOb2RlRGF0YUdlbmVyYXRvci42PUM6XFxzdGVtSUlcXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxcZGF0YU1pZ3JhdGlvblxcaW5wdXRcXHNvcnRcXAorTm9kZURhdGFHZW5lcmF0b3IuMTU9X25vZGUucHJvcGVydGllcworTm9kZURhdGFHZW5lcmF0b3IuNj1DOlxcc3RlbUlJXFxvcmcuZWNsaXBzZS5zdGVtLnV0aWxpdHlcXGRhdGFNaWdyYXRpb25cXGlucHV0XFxzb3J0XFwKK05vZGVEYXRhR2VuZXJhdG9yLjE0PV9ub2RlLnByb3BlcnRpZXMKK05vZGVEYXRhR2VuZXJhdG9yLjExPVx0XHRHZW5lcmF0ZWQgOiAKK05vZGVEYXRhR2VuZXJhdG9yLjE0PV9ub2RlLnByb3BlcnRpZXMKK05vZGVEYXRhR2VuZXJhdG9yLjI0PV9BRE1JTjJfTEVYLnR4dAorTm9kZURhdGFHZW5lcmF0b3IuMjQ9X0FETUlOMl9MRVgudHh0CitOb2RlRGF0YUdlbmVyYXRvci4yND1fQURNSU4yX0xFWC50eHQKK05vZGVEYXRhR2VuZXJhdG9yLjI1PV9BRE1JTjJfTEVYLnR4dAorTm9kZURhdGFHZW5lcmF0b3IuMjM9X0FETUlOMV9MRVgudHh0CitOb2RlRGF0YUdlbmVyYXRvci4yMz1fQURNSU4xX0xFWC50eHQKK05vZGVEYXRhR2VuZXJhdG9yLjMxPVwgTGV2ZWwgMSAoIAorTm9kZURhdGFHZW5lcmF0b3IuMzE9XCBMZXZlbCAxICggCitOb2RlRGF0YUdlbmVyYXRvci4zMT1cIExldmVsIDEgKCAKK05vZGVEYXRhR2VuZXJhdG9yLjMyPVwgTGV2ZWwgMSAoIAorTm9kZURhdGFHZW5lcmF0b3IuMzM9XCApLiAKK05vZGVEYXRhR2VuZXJhdG9yLjMzPVwgKS4gCitOb2RlRGF0YUdlbmVyYXRvci4zMz1cICkuIAorTm9kZURhdGFHZW5lcmF0b3IuMzQ9TGV2ZWwgMiAoIAorTm9kZURhdGFHZW5lcmF0b3IuMzQ9TGV2ZWwgMiAoIAorTm9kZURhdGFHZW5lcmF0b3IuMzQ9TGV2ZWwgMiAoIAorTm9kZURhdGFHZW5lcmF0b3IuMzU9TGV2ZWwgMiAoIAorTm9kZURhdGFHZW5lcmF0b3IuMzc9XCApLiBcbgorTm9kZURhdGFHZW5lcmF0b3IuMzA9XCMgR2VuZXJhdGVkIGtleSBkZXRhaWxzIDogCitOb2RlRGF0YUdlbmVyYXRvci4zMD1cIyBHZW5lcmF0ZWQga2V5IGRldGFpbHMgOiAKK05vZGVEYXRhR2VuZXJhdG9yLjM2PVwgKS4gXG4KK05vZGVEYXRhR2VuZXJhdG9yLjM2PVwgKS4gXG4KK05vZGVEYXRhR2VuZXJhdG9yLjUyPUM6XFxzdGVtSUlcXG9yZy5lY2xpcHNlLnN0ZW0udXRpbGl0eVxcZGF0YU1pZ3JhdGlvblxcaW5wdXRcXHVybHNcXAorTm9kZURhdGFHZW5lcmF0b3IuNTM9QzpcXHN0ZW1JSVxcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XFxkYXRhTWlncmF0aW9uXFxpbnB1dFxcdXJsc1xcCitOb2RlRGF0YUdlbmVyYXRvci41Nj1fbm9kZS5wcm9wZXJ0aWVzIAorTm9kZURhdGFHZW5lcmF0b3IuNTI9QzpcXHN0ZW1JSVxcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XFxkYXRhTWlncmF0aW9uXFxpbnB1dFxcdXJsc1xcCitOb2RlRGF0YUdlbmVyYXRvci41OD1cIyBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IHdpbGwgaW50ZXJwcmV0IHRoZSByZXN0IG9mIHRoZSBmaWxlJ3MgY29udGVudHNcbgorTm9kZURhdGFHZW5lcmF0b3IuNTI9QzpcXHN0ZW1JSVxcb3JnLmVjbGlwc2Uuc3RlbS51dGlsaXR5XFxkYXRhTWlncmF0aW9uXFxpbnB1dFxcdXJsc1xcCitOb2RlRGF0YUdlbmVyYXRvci41OD1SRUNPUkRfQ0xBU1NOQU1FID0gb3JnLmVjbGlwc2Uuc3RlbS5pbnRlcm5hbC5kYXRhLkNvdW50cnlHcmFwaFJlY29yZCRDb3VudHJ5Tm9kZUdyYXBoUmVjb3JkXG5cbgorTm9kZURhdGFHZW5lcmF0b3IuNTg9UkVDT1JEX0NMQVNTTkFNRSA9IG9yZy5lY2xpcHNlLnN0ZW0uaW50ZXJuYWwuZGF0YS5Db3VudHJ5R3JhcGhSZWNvcmQkQ291bnRyeU5vZGVHcmFwaFJlY29yZFxuXG4KK05vZGVEYXRhR2VuZXJhdG9yLjUxPVx0XHRHZW5lcmF0ZWQgOiAKK05vZGVEYXRhR2VuZXJhdG9yLjUxPVx0XHRHZW5lcmF0ZWQgOiAKK05vZGVEYXRhR2VuZXJhdG9yLjU1PV9ub2RlLnByb3BlcnRpZXMgCitOb2RlRGF0YUdlbmVyYXRvci41Nz1cIyBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IHdpbGwgaW50ZXJwcmV0IHRoZSByZXN0IG9mIHRoZSBmaWxlJ3MgY29udGVudHNcbgorTm9kZURhdGFHZW5lcmF0b3IuNTc9XCMgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCB3aWxsIGludGVycHJldCB0aGUgcmVzdCBvZiB0aGUgZmlsZSdzIGNvbnRlbnRzXG4KK05vZGVEYXRhR2VuZXJhdG9yLjU5PVwjIFRoZSBJU08tMzE2Ni0xIGFscGhhMyBjb2RlIGZvciB0aGUgY291bnRyeVxuCitOb2RlRGF0YUdlbmVyYXRvci41OT1cIyBUaGUgSVNPLTMxNjYtMSBhbHBoYTMgY29kZSBmb3IgdGhlIGNvdW50cnlcbgorTm9kZURhdGFHZW5lcmF0b3IuNTk9XCMgVGhlIElTTy0zMTY2LTEgYWxwaGEzIGNvZGUgZm9yIHRoZSBjb3VudHJ5XG4KK05vZGVEYXRhR2VuZXJhdG9yLjYwPUlTT0tFWSA9IAorTm9kZURhdGFHZW5lcmF0b3IuNjA9SVNPS0VZID0gCitOb2RlRGF0YUdlbmVyYXRvci42MD1JU09LRVkgPSAKK05vZGVEYXRhR2VuZXJhdG9yLjYxPUlTT0tFWSA9IAorTm9kZURhdGFHZW5lcmF0b3IuNjM9QURNSU5fTEVWRUwgPSAKK05vZGVEYXRhR2VuZXJhdG9yLjYzPUFETUlOX0xFVkVMID0gCitOb2RlRGF0YUdlbmVyYXRvci42Mz1BRE1JTl9MRVZFTCA9IAorTm9kZURhdGFHZW5lcmF0b3IuNjQ9QURNSU5fTEVWRUwgPSAKK05vZGVEYXRhR2VuZXJhdG9yLjY2PVwjIFNlZSBodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvMS4xL3ZhbGlkXG4KK05vZGVEYXRhR2VuZXJhdG9yLjY2PVwjIFNlZSBodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvMS4xL3ZhbGlkXG4KK05vZGVEYXRhR2VuZXJhdG9yLjY2PVwjIFNlZSBodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvMS4xL3ZhbGlkXG4KK05vZGVEYXRhR2VuZXJhdG9yLjY3PVZBTElEID0gc3RhcnQ9MTkwMC0wMS0wMTtcblxuCitOb2RlRGF0YUdlbmVyYXRvci42Nz1WQUxJRCA9IHN0YXJ0PTE5MDAtMDEtMDE7XG5cbgorTm9kZURhdGFHZW5lcmF0b3IuNjc9VkFMSUQgPSBzdGFydD0xOTAwLTAxLTAxO1xuXG4KK05vZGVEYXRhR2VuZXJhdG9yLjY4PVwjIFRoaXMgaXMgdGhlIHNvdXJjZSBvZiB0aGUgZGF0YVxuCitOb2RlRGF0YUdlbmVyYXRvci42OD1cIyBUaGlzIGlzIHRoZSBzb3VyY2Ugb2YgdGhlIGRhdGFcbgorTm9kZURhdGFHZW5lcmF0b3IuNjg9XCMgVGhpcyBpcyB0aGUgc291cmNlIG9mIHRoZSBkYXRhXG4KK05vZGVEYXRhR2VuZXJhdG9yLjYyPVwjIFRoZSBhZG1pbmlzdHJhdGlvbiBsZXZlbCBvZiB0aGUgbm9kZSBkYXRhXG4KK05vZGVEYXRhR2VuZXJhdG9yLjYyPVwjIFRoZSBhZG1pbmlzdHJhdGlvbiBsZXZlbCBvZiB0aGUgbm9kZSBkYXRhXG4KK05vZGVEYXRhR2VuZXJhdG9yLjY1PVwjIFRoaXMgaXMgdGhlIGRhdGUgcmFuZ2UgZm9yIHdoaWNoIHRoZSBhcmVhIHZhbHVlcyBpbiB0aGlzIGZpbGUgYXJlIHZhbGlkIFxuCitOb2RlRGF0YUdlbmVyYXRvci42NT1cIyBUaGlzIGlzIHRoZSBkYXRlIHJhbmdlIGZvciB3aGljaCB0aGUgYXJlYSB2YWx1ZXMgaW4gdGhpcyBmaWxlIGFyZSB2YWxpZCBcbgorTm9kZURhdGFHZW5lcmF0b3IuNjk9LnR4dAorTm9kZURhdGFHZW5lcmF0b3IuNjk9LnR4dAorTm9kZURhdGFHZW5lcmF0b3IuNjk9LnR4dAorTm9kZURhdGFHZW5lcmF0b3IuNzA9LnR4dAorTm9kZURhdGFHZW5lcmF0b3IuNzM9U09VUkNFID0gCitOb2RlRGF0YUdlbmVyYXRvci43NT1TT1VSQ0UgPSAKK05vZGVEYXRhR2VuZXJhdG9yLjc4PVNQQVRJQUxfVVJJID0gCitOb2RlRGF0YUdlbmVyYXRvci43OD1TUEFUSUFMX1VSSSA9IAorTm9kZURhdGFHZW5lcmF0b3IuNzg9U1BBVElBTF9VUkkgPSAKK05vZGVEYXRhR2VuZXJhdG9yLjcyPVNPVVJDRSA9IAorTm9kZURhdGFHZW5lcmF0b3IuNzI9U09VUkNFID0gCitOb2RlRGF0YUdlbmVyYXRvci43ND1TT1VSQ0UgPSAKK05vZGVEYXRhR2VuZXJhdG9yLjc0PVNPVVJDRSA9IAorTm9kZURhdGFHZW5lcmF0b3IuNzc9XCMgVGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbGF0aXR1ZGUvbG9uZ2l0dWRlIGRhdGEgZm9yIHRoZSBub2RlIFxuCitOb2RlRGF0YUdlbmVyYXRvci43Nz1cIyBUaGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBsYXRpdHVkZS9sb25naXR1ZGUgZGF0YSBmb3IgdGhlIG5vZGUgXG4KK05vZGVEYXRhR2VuZXJhdG9yLjc5PXBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvCitOb2RlRGF0YUdlbmVyYXRvci43OT1wbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnN0ZW0uZ2VvZ3JhcGh5L3Jlc291cmNlcy9kYXRhL2dlby9jb3VudHJ5LworTm9kZURhdGFHZW5lcmF0b3IuNzk9cGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5zdGVtLmdlb2dyYXBoeS9yZXNvdXJjZXMvZGF0YS9nZW8vY291bnRyeS8KK05vZGVEYXRhR2VuZXJhdG9yLjgwPXBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uuc3RlbS5nZW9ncmFwaHkvcmVzb3VyY2VzL2RhdGEvZ2VvL2NvdW50cnkvCitOb2RlRGF0YUdlbmVyYXRvci44Mz1Xcm9uZyBhcmd1bWVudHMuIFByb3ZpZGUgSVNPIDMxNjYtMSBhbmQgSVNPIDMxNjYtMiBkYXRhIGZpbGVzLCBJU08gZml4IGZpbGUsIGxpc3Qgb2YgY291bnRyaWVzLCBhbmQgb3V0cHV0IGRpcmVjdG9yeS4KK05vZGVEYXRhR2VuZXJhdG9yLjgzPVdyb25nIGFyZ3VtZW50cy4gUHJvdmlkZSBJU08gMzE2Ni0xIGFuZCBJU08gMzE2Ni0yIGRhdGEgZmlsZXMsIElTTyBmaXggZmlsZSwgbGlzdCBvZiBjb3VudHJpZXMsIGFuZCBvdXRwdXQgZGlyZWN0b3J5LgorTm9kZURhdGFHZW5lcmF0b3IuODM9V3JvbmcgYXJndW1lbnRzLiBQcm92aWRlIElTTyAzMTY2LTEgYW5kIElTTyAzMTY2LTIgZGF0YSBmaWxlcywgSVNPIGZpeCBmaWxlLCBsaXN0IG9mIGNvdW50cmllcywgYW5kIG91dHB1dCBkaXJlY3RvcnkuCitOb2RlRGF0YUdlbmVyYXRvci44ND1DSUEKK05vZGVEYXRhR2VuZXJhdG9yLjg9XCA+Pj4+CitOb2RlRGF0YUdlbmVyYXRvci44Mj1fTUFQLnhtbFxuXG4KK05vZGVEYXRhR2VuZXJhdG9yLjgyPV9NQVAueG1sXG5cbgorVVJMR2VuZXJhdG9yLjE9VVJMIGxvY2F0aW9uIGlzIDogIAorVVJMR2VuZXJhdG9yLjI9UmVhZCBVUkwgOiAKK1VSTEdlbmVyYXRvci41PUlTTyBjb2RlIG5vdCBmb3VuZCBmb3IgZW50cnkgOiAKK1VSTEdlbmVyYXRvci42PV9VUkwudHh0CitVUkxHZW5lcmF0b3IuMTM9V3JvbmcgYXJndW1lbnRzLiBQcm92aWRlIElTTyBkYXRhIGZpbGUsIGxpc3Qgb2YgY291bnRyaWVzLCBhbmQgb3V0cHV0IGRpcmVjdG9yeS4KK0V1cm9wZURhdGFDbGVhbmVyLjIwPUNsZWFuIGRhdGEgaXMgOiAKK0xvY2F0aW9uRmluZGVyLjA9VUlECitMb2NhdGlvbkZpbmRlci4xPUV1cm9wZVNhbXBsZS50eHQKK0xvY2F0aW9uRmluZGVyLjI9S2V5IGlzIDogCitMb2NhdGlvbkZpbmRlci45PVByb2Nlc3NpbmcgY291bnRyeSA6IAorTG9jYXRpb25GaW5kZXIuMTQ9VE9ETyAtPiBTRVQgRklMRU5BTUUgSEVSRQorTG9jYXRpb25GaW5kZXIuMTU9XHRcdEdlbmVyYXRlZCA6CitMb2NhdGlvbkZpbmRlci4xNz1FcnJvciA6IG51bWJlciBvZiBYJ3MgYW5kIFkncyBkb250IG1hdGNoXCEKK0xvY2F0aW9uRmluZGVyLjE4PVx0XHRcdCBjbG9zaW5nIGxpbmUgOiAKK0xvY2F0aW9uRmluZGVyLjE5PVdyb25nIGFyZ3VtZW50cy4KK0lub2N1bGF0b3IuMT1pbmZlY3Rvcl8KK0lub2N1bGF0b3IuMj1pbm9jdWxhdG9yXwo=